From 55146b977a608485aab3f10e8d52f055c231f347 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 10 Feb 2025 15:02:12 +0100 Subject: [PATCH 0001/1310] REMOVE_EVS_DUPLICATES in acelp_core_dec_fx() --- lib_com/gs_inact_switching_fx.c | 65 +++++++++++++++++++++++++------- lib_com/gs_noisefill_fx.c | 55 ++++++++++++++++++--------- lib_com/options.h | 2 + lib_com/prot_fx.h | 3 ++ lib_dec/FEC_scale_syn_fx.c | 10 +++++ lib_dec/acelp_core_dec_fx.c | 57 +++++++++++++++++++++++++++- lib_dec/acelp_core_dec_ivas_fx.c | 15 +++++++- lib_dec/dec_gen_voic_fx.c | 14 ++++++- lib_dec/gs_dec_fx.c | 12 +++++- 9 files changed, 196 insertions(+), 37 deletions(-) diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index 5dfe6b1d6..52635d502 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -253,31 +253,68 @@ void Inac_switch_ematch_ivas_fx( exp = sub( exp, 14 ); IF( LT_16( i, 2 ) ) { - FOR( j = 0; j < 8; j++ ) +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( element_mode, EVS_MONO ) ) { - L_tmp = L_mult0( *pt_exc, ftmp ); - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ - move16(); - pt_exc++; + FOR( j = 0; j < 8; j++ ) + { + L_tmp = L_mult( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } + } + ELSE +#endif + { + FOR( j = 0; j < 8; j++ ) + { + L_tmp = L_mult0( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } } } ELSE { - FOR( j = 0; j < 16; j++ ) +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( element_mode, EVS_MONO ) ) { - L_tmp = L_mult0( *pt_exc, ftmp ); - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ - move16(); - pt_exc++; + FOR( j = 0; j < 16; j++ ) + { + L_tmp = L_mult( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } + } + ELSE +#endif + { + FOR( j = 0; j < 16; j++ ) + { + L_tmp = L_mult0( *pt_exc, ftmp ); + L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc) -> Q(15+Q_exc)*/ + *pt_exc = round_fx_sat( L_tmp ); /*Q_exc - 1*/ + move16(); + pt_exc++; + } } } } /* Going back to time */ - Scale_sig( dct_exc_tmp, 240, 1 ); // Q_exc - Scale_sig( exc2, 240, 1 ); // Q_exc +#ifdef REMOVE_EVS_DUPLICATES + IF( GT_16( element_mode, EVS_MONO ) ) +#endif + { + Scale_sig( dct_exc_tmp, 240, 1 ); // Q_exc + Scale_sig( exc2, 240, 1 ); // Q_exc + } edct_16fx( dct_exc_tmp, exc2, L_frame, 5, element_mode ); } diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index d2a576dbe..5cf285bf2 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -1412,32 +1412,51 @@ void highband_exc_dct_in_ivas_fx( } } #endif - Word16 Q_tmp = *Q_exc; - move16(); - Word16 Q_old = *Q_exc; - move16(); - Comp_and_apply_gain_ivas_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, Q_exc ); - IF( exc_wo_nf != NULL ) +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( element_mode, EVS_MONO ) ) { - Comp_and_apply_gain_ivas_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, &Q_tmp ); - IF( GT_16( Q_tmp, *Q_exc ) ) - { - Scale_sig( exc_wo_nf, L_frame, sub( *Q_exc, Q_tmp ) ); - } - ELSE IF( LT_16( Q_tmp, *Q_exc ) ) + Comp_and_apply_gain_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, *Q_exc ); + + IF( exc_wo_nf != NULL ) { - Scale_sig( exc_diffQ, L_frame, sub( Q_tmp, *Q_exc ) ); - *Q_exc = Q_tmp; - move16(); + Comp_and_apply_gain_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, *Q_exc ); + Vr_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); } - Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); - Vr_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); } ELSE { - Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); +#endif + Word16 Q_tmp = *Q_exc; + move16(); + Word16 Q_old = *Q_exc; + move16(); + Comp_and_apply_gain_ivas_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, Q_exc ); + + IF( exc_wo_nf != NULL ) + { + Comp_and_apply_gain_ivas_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, &Q_tmp ); + IF( GT_16( Q_tmp, *Q_exc ) ) + { + Scale_sig( exc_wo_nf, L_frame, sub( *Q_exc, Q_tmp ) ); + } + ELSE IF( LT_16( Q_tmp, *Q_exc ) ) + { + Scale_sig( exc_diffQ, L_frame, sub( Q_tmp, *Q_exc ) ); + *Q_exc = Q_tmp; + move16(); + } + Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); + Vr_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); + } + ELSE + { + Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); + } +#ifdef REMOVE_EVS_DUPLICATES } +#endif + /*--------------------------------------------------------------------------------------* * add the correction layer to the LF bins, * and add the quantized pulses or the noise for the higher part of the spectrum diff --git a/lib_com/options.h b/lib_com/options.h index 1b2c15f87..c34882a0e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,4 +154,6 @@ #define FIX_ISSUE_1245 /* Ittiam: Fix for issue 1245: Basop Encoder: Audible noise for silent Stereo input DTX on @24.4 kbps, @32 kbps*/ #define FIX_MINOR_SVD_WMOPS_MR1010X /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */ #define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ + +#define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions */ #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index fbd3b27f3..bef07e952 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8242,6 +8242,9 @@ void FEC_scale_syn_ivas_fx( Word16 *mem_syn, /* o: initial synthesis filter states */ Word16 Q_exc, Word16 Q_syn, +#ifdef REMOVE_EVS_DUPLICATES + const Word16 element_mode, /* i : element mode */ +#endif const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ const Word16 force_scaling /* i: force scaling */ ); diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index d664aa9fb..f6439b166 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -641,6 +641,9 @@ void FEC_scale_syn_ivas_fx( Word16 *mem_syn, /* o: initial synthesis filter states Q_syn*/ Word16 Q_exc, Word16 Q_syn, +#ifdef REMOVE_EVS_DUPLICATES + const Word16 element_mode, /* i : element mode */ +#endif const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ const Word16 force_scaling /* i: force scaling */ ) @@ -735,8 +738,15 @@ void FEC_scale_syn_ivas_fx( /*-----------------------------------------------------------------* * Find the energy/gain at the end of the frame *-----------------------------------------------------------------*/ + tmp = sub( 3, getScaleFactor16( synth, L_frame ) ); + +#ifdef REMOVE_EVS_DUPLICATES + test(); + IF( tmp > 0 && GT_16( element_mode, EVS_MONO ) ) +#else IF( tmp > 0 ) +#endif { Word16 synth_tmp[L_FRAME16k]; Copy_Scale_sig( synth, synth_tmp, L_frame, -tmp ); // Q_synth - tmp diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index a41a0c813..e3770b997 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -777,14 +777,21 @@ ivas_error acelp_core_dec_fx( move16(); } +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); - +#endif test(); test(); IF( EQ_16( st_fx->coder_type, TRANSITION ) && LT_16( tc_subfr_fx, L_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) { +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#endif } } @@ -827,8 +834,12 @@ ivas_error acelp_core_dec_fx( if ( !tdm_lp_reuse_flag ) #endif { +#ifdef REMOVE_EVS_DUPLICATES + lsf_dec_ivas_fx( st_fx, tc_subfr_fx, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh ); +#else lsf_dec_fx( st_fx, tc_subfr_fx, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh ); +#endif } #ifdef ADD_LRTD else @@ -953,7 +964,11 @@ ivas_error acelp_core_dec_fx( IF( st_fx->stab_fac_fx == 0 && st_fx->old_bfi_cnt > 0 && NE_16( st_fx->clas_dec, VOICED_CLAS ) && NE_16( st_fx->clas_dec, ONSET ) && st_fx->relax_prev_lsf_interp == 0 && !( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && EQ_16( st_fx->idchan, 1 ) ) ) { +#ifdef REMOVE_EVS_DUPLICATES + int_lsp4_ivas_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); +#else int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); +#endif } /*---------------------------------------------------------------* @@ -1005,7 +1020,11 @@ ivas_error acelp_core_dec_fx( ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) ) { /* UNVOICED frames */ +#ifdef REMOVE_EVS_DUPLICATES + decod_unvoiced_ivas_fx( st_fx, Aq_fx, Es_pred_fx, uc_two_stage_flag, st_fx->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, gain_buf ); +#else decod_unvoiced_fx( st_fx, Aq_fx, st_fx->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, gain_buf ); +#endif } ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) { @@ -1026,17 +1045,26 @@ ivas_error acelp_core_dec_fx( } ELSE IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) ) ) { +#ifdef REMOVE_EVS_DUPLICATES + decod_audio_ivas_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf, + 0, 0, 0, NULL ); +#else decod_audio_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf #ifdef ADD_LRTD , tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf #endif ); +#endif tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ } ELSE { +#ifdef REMOVE_EVS_DUPLICATES + IF( NE_32( ( error = decod_gen_voic_ivas_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf, 0, NULL ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = decod_gen_voic_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf /*, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf*/ ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -1049,6 +1077,7 @@ ivas_error acelp_core_dec_fx( /* synthesis for ACELP core switching and SWB BWE */ syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); + /* save and delay synthesis to be used by SWB BWE */ IF( hBWE_FD != NULL ) { @@ -1059,7 +1088,11 @@ ivas_error acelp_core_dec_fx( * Apply energy matching when switching to inactive frames *-----------------------------------------------------------------*/ +#ifdef REMOVE_EVS_DUPLICATES + Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode, 0, EVS_MONO ); +#else Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); +#endif /*------------------------------------------------------------* * Decode information and modify the excitation signal of stationary unvoiced frames *------------------------------------------------------------*/ @@ -1187,9 +1220,16 @@ ivas_error acelp_core_dec_fx( k = add( k, 1 ); } +#ifdef REMOVE_EVS_DUPLICATES + FEC_scale_syn_ivas_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, + &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); + +#else FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); +#endif test(); test(); @@ -1268,8 +1308,13 @@ ivas_error acelp_core_dec_fx( { save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); } + /* Apply energy matching when switching to inactive frames */ +#ifdef REMOVE_EVS_DUPLICATES + Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode, 0, EVS_MONO ); +#else Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); +#endif /* udate past excitation signals for LD music post-filter */ IF( hMusicPF != NULL ) @@ -1343,9 +1388,15 @@ ivas_error acelp_core_dec_fx( * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ +#ifdef REMOVE_EVS_DUPLICATES + FEC_scale_syn_ivas_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, + &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); +#else FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); +#endif } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ @@ -1440,7 +1491,11 @@ ivas_error acelp_core_dec_fx( Copy( syn_fx, temp_buf + L_SYN_MEM, L_FRAME16k ); st_fx->hPFstat->on = 1; move16(); +#ifdef REMOVE_EVS_DUPLICATES + formant_post_filt_ivas_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0 ); +#else formant_post_filt_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0 ); +#endif } ELSE IF( GE_16( st_fx->last_bwidth, WB ) ) { diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 24427c5d2..8d6b63833 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -47,12 +47,15 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" +static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 old_NoiseExp ); + + /*-------------------------------------------------------------------* * acelp_core_dec_ivas_fx() * * ACELP core decoder *-------------------------------------------------------------------*/ -static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 old_NoiseExp ); + ivas_error acelp_core_dec_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 output_fx[], /* o : synthesis @internal Fs Q_syn*/ @@ -350,6 +353,7 @@ ivas_error acelp_core_dec_ivas_fx( int_fs = INT_FS_16k; move16(); } + test(); /* reset post-filter in case of switching */ if ( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) @@ -368,6 +372,7 @@ ivas_error acelp_core_dec_ivas_fx( move16(); } test(); + /* TD stereo parameters */ IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) { @@ -1225,7 +1230,11 @@ ivas_error acelp_core_dec_ivas_fx( Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k, -Q6 ); // Q0 FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, +#ifdef REMOVE_EVS_DUPLICATES + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); +#else exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); +#endif test(); test(); test(); @@ -1380,7 +1389,11 @@ ivas_error acelp_core_dec_ivas_fx( FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, +#ifdef REMOVE_EVS_DUPLICATES + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); +#else exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); +#endif } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 1abd3d58b..190431fb8 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -809,8 +809,18 @@ ivas_error decod_gen_voic_ivas_fx( } ELSE { - enhancer_ivas_fx2( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + enhancer_fx( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } + ELSE +#endif + { + enhancer_ivas_fx2( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } } p_Aq_fx += ( M + 1 ); diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index c237bc987..93c346a7d 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -1514,7 +1514,17 @@ void gsc_dec_ivas_fx( { i--; } - mean_gain = gsc_gaindec_ivas_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ + +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ + } + ELSE +#endif + { + mean_gain = gsc_gaindec_ivas_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ + } #else mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, st_fx->core_brate, hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); -- GitLab From ef2485345725198d55c50d1db33506c25ea13845 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 10 Feb 2025 16:13:32 +0100 Subject: [PATCH 0002/1310] fix --- lib_dec/dec_gen_voic_fx.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 190431fb8..8ee335e3f 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -699,7 +699,16 @@ ivas_error decod_gen_voic_ivas_fx( } /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); + } + ELSE +#endif + { + lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); + } /*----------------------------------------------------------------------* * Find the total excitation -- GitLab From 68e8c9810d6eea2113b278f0d618cd629340e9c2 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 10 Feb 2025 17:04:05 +0100 Subject: [PATCH 0003/1310] fix --- lib_com/gs_noisefill_fx.c | 5 +++++ lib_dec/acelp_core_dec_fx.c | 3 +-- lib_dec/gs_dec_fx.c | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 5cf285bf2..1ccc697fb 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -1496,7 +1496,12 @@ void highband_exc_dct_in_ivas_fx( Q_hb_exc = 0; move16(); envelop_modify_fx( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ, *Q_exc, &Q_hb_exc ); +#ifdef REMOVE_EVS_DUPLICATES + test(); + IF( GT_16( *Q_exc, Q_hb_exc ) && GT_16( element_mode, EVS_MONO ) ) +#else IF( GT_16( *Q_exc, Q_hb_exc ) ) +#endif { Scale_sig( exc_wo_nf, L_frame, sub( Q_hb_exc, *Q_exc ) ); *Q_exc = Q_hb_exc; diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index e3770b997..779df2fa4 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -1046,8 +1046,7 @@ ivas_error acelp_core_dec_fx( ELSE IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) ) ) { #ifdef REMOVE_EVS_DUPLICATES - decod_audio_ivas_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf, - 0, 0, 0, NULL ); + decod_audio_ivas_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf, 0, 0, 0, NULL ); #else decod_audio_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf #ifdef ADD_LRTD diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index 93c346a7d..72e07e57f 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -993,9 +993,11 @@ void decod_audio_ivas_fx( } } #endif + Word16 Q_exc_old = st_fx->Q_exc; move16(); gsc_dec_ivas_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); + IF( NE_16( Q_exc_old, st_fx->Q_exc ) ) { Q_exc_old = sub( Q_exc_old, st_fx->Q_exc ); -- GitLab From fb7b4020601f61bc9e4fd51df65763967bf977a6 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 10 Feb 2025 17:47:12 +0100 Subject: [PATCH 0004/1310] fix --- lib_dec/dec_uv_fx.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index ffb49be38..6a15732a0 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -247,10 +247,18 @@ void decod_unvoiced_ivas_fx( * Excitation enhancements (update of total excitation signal) *----------------------------------------------------------------*/ - /*enhancer_fx(st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &(st_fx->dm_fx), st_fx->Q_exc);*/ - enhancer_ivas_fx( MODE1, st_fx->core_brate, uc_two_stage_flag, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx /*Q9/Q12?*/, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + enhancer_fx( st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } + ELSE +#endif + { + enhancer_ivas_fx( MODE1, st_fx->core_brate, uc_two_stage_flag, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx /*Q9/Q12?*/, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + } Word16 tmp_idx; tmp_idx = 0; @@ -258,9 +266,16 @@ void decod_unvoiced_ivas_fx( if ( i_subfr_fx != 0 ) { idiv1616( i_subfr_fx, L_SUBFR ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); + } +#endif } voice_factors_fx[tmp_idx] = 0; move16(); + interp_code_5over2_fx( &exc_fx[i_subfr_fx], &bwe_exc_fx[( ( i_subfr_fx * 2 * HIBND_ACB_L_FAC ) >> 1 )], L_SUBFR ); p_Aq_fx += ( M + 1 ); -- GitLab From ba6f7e27c1e7cf4abb7f2cdd755c9afa0fe11ba8 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 11 Feb 2025 10:35:49 +0100 Subject: [PATCH 0005/1310] REMOVE_EVS_DUPLICATES2 --- lib_com/options.h | 1 + lib_dec/acelp_core_dec_fx.c | 15 ++++++++++++++- lib_dec/fd_cng_dec_fx.c | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index c34882a0e..f45ee973d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,4 +156,5 @@ #define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions */ +#define REMOVE_EVS_DUPLICATES2 #endif diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 779df2fa4..46826654e 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -432,7 +432,11 @@ ivas_error acelp_core_dec_fx( } /* update synthesis filter memories */ +#ifdef REMOVE_EVS_DUPLICATES2 + ivas_synth_mem_updt2_fx( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); +#else synth_mem_updt2( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); +#endif #else synth_mem_updt2( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, DEC ); #endif @@ -630,8 +634,11 @@ ivas_error acelp_core_dec_fx( /* decode CNG parameters */ IF( st_fx->cng_type == LP_CNG ) { - +#ifdef REMOVE_EVS_DUPLICATES2 + CNG_dec_ivas_fx( st_fx, st_fx->last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); +#else CNG_dec_fx( st_fx, st_fx->last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); +#endif #ifdef IVAS_CODE local_element_mode = st_fx->element_mode; move16(); @@ -684,6 +691,7 @@ ivas_error acelp_core_dec_fx( } } #endif + //generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 1, nchan_out ); generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); FdCng_exc( st_fx->hFdCngDec->hFdCngCom, &st_fx->CNG_mode, st_fx->L_frame, st_fx->lsp_old_fx, st_fx->first_CNG, st_fx->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); @@ -1556,12 +1564,17 @@ ivas_error acelp_core_dec_fx( move32(); } /*Noise estimate*/ +#ifdef REMOVE_EVS_DUPLICATES2 + IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) && !st_fx->cng_ism_flag ) +#else IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) /* && !st->cng_ism_flag IVAS_CODE */ ) +#endif { #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT PMT( "Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done" ) ApplyFdCng_fx( syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); #else + //ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, realBuffer, imagBuffer, NULL, st_fx, 0, ( st_fx->coder_type == AUDIO && !st_fx->GSC_noisy_speech ) ); ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); #endif } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index c683b25b6..0b2682f3a 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -955,7 +955,12 @@ Word16 ApplyFdCng_fx( test(); IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { +#ifdef REMOVE_EVS_DUPLICATES2 + scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); + +#else scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); +#endif } hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; move16(); @@ -1037,8 +1042,13 @@ Word16 ApplyFdCng_fx( IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) { /* At initialization, interpolate the bin/band-wise levels from the partition levels */ +#ifdef REMOVE_EVS_DUPLICATES2 + scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, + hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); +#else scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); +#endif *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } @@ -1054,8 +1064,13 @@ Word16 ApplyFdCng_fx( /* Interpolate the CLDFB band levels from the SID (partition) levels */ IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) { +#ifdef REMOVE_EVS_DUPLICATES2 + scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, + hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); +#else scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); +#endif *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); -- GitLab From 3241b0c1448ff4da5a680ef8e0c7c026c905b809 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 11 Feb 2025 13:10:14 +0100 Subject: [PATCH 0006/1310] REMOVE_EVS_DUPLICATES2 --- lib_dec/acelp_core_dec_fx.c | 129 ++++++++++++++++++++++++++++++++++-- lib_dec/fd_cng_dec_fx.c | 45 +++++++++++-- 2 files changed, 164 insertions(+), 10 deletions(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 46826654e..db6ba759d 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -661,7 +661,7 @@ ivas_error acelp_core_dec_fx( test(); IF( EQ_32( st_fx->core_brate, SID_2k40 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { - FdCng_decodeSID_fx( st_fx->hFdCngDec->hFdCngCom, st_fx ); + FdCng_decodeSID_fx( st_fx->hFdCngDec->hFdCngCom, st_fx ); // VE: 2 variants needed *sid_bw = 0; move16(); } @@ -691,8 +691,7 @@ ivas_error acelp_core_dec_fx( } } #endif - //generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 1, nchan_out ); - generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); + generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); // VE: 2 variants needed FdCng_exc( st_fx->hFdCngDec->hFdCngCom, &st_fx->CNG_mode, st_fx->L_frame, st_fx->lsp_old_fx, st_fx->first_CNG, st_fx->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); @@ -709,10 +708,29 @@ ivas_error acelp_core_dec_fx( } i = st_fx->Q_exc; move16(); +#ifdef REMOVE_EVS_DUPLICATES2 + test(); + IF( st_fx->hMusicPF && st_fx->hGSCDec ) + { + Rescale_exc( st_fx->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, + imult1616( st_fx->L_frame, HIBND_ACB_L_FAC ), 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); + } + IF( st_fx->hPFstat != NULL ) + { + Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, + &st_fx->mem_deemph_fx, st_fx->hBPF->pst_old_syn_fx, &st_fx->hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 0, 0, NULL ); + } + ELSE + { + Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, + &st_fx->mem_deemph_fx, NULL, NULL, &st_fx->agc_mem_fx[1], NULL, 0, 0, NULL ); + } +#else Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 0, 0, NULL ); +#endif Copy_Scale_sig( exc2_fx, exc2_fx, st_fx->L_frame, sub( st_fx->Q_exc, i ) ); // Q_exc /* update past excitation signals for LD music post-filter */ @@ -725,7 +743,7 @@ ivas_error acelp_core_dec_fx( FOR( i = 0; i < DCT_L_POST; i++ ) { /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); // VE: 2 variants needed move16(); } } @@ -1574,8 +1592,11 @@ ivas_error acelp_core_dec_fx( PMT( "Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done" ) ApplyFdCng_fx( syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); #else - //ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, realBuffer, imagBuffer, NULL, st_fx, 0, ( st_fx->coder_type == AUDIO && !st_fx->GSC_noisy_speech ) ); +#ifdef REMOVE_EVS_DUPLICATES2 + ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, realBuffer, imagBuffer, NULL, st_fx, 0, ( st_fx->coder_type == AUDIO && !st_fx->GSC_noisy_speech ) ); +#else ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); +#endif #endif } /* CNA: Generate additional comfort noise to mask potential coding artefacts */ @@ -1759,6 +1780,82 @@ ivas_error acelp_core_dec_fx( bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, syn_fx, st_fx->L_frame, pitch_buf_fx, st_fx->bpf_off, st_fx->stab_fac_fx, &st_fx->stab_fac_smooth_fx, st_fx->coder_type, st_fx->Q_syn, bpf_error_signal ); } + +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + /* analysis of the synthesis at internal sampling rate */ + cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); + + scaleFactor.hb_scale = scaleFactor.lb_scale; + move16(); + + /* analysis and add the BPF error signal */ + i = 0; + move16(); + if ( st_fx->bpf_off == 0 ) + { + i = CLDFB_NO_COL_MAX; + move16(); + } + + addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate( st_fx->Q_syn ), + i, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &scaleFactor ); + + /* set output mask for upsampling */ + IF( EQ_16( st_fx->bwidth, NB ) ) + { + /* set NB mask for upsampling */ + st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, 10 ); + move16(); + } + ELSE IF( NE_16( st_fx->cldfbSyn->bandsToZero, sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ) ) ) + { + /* in case of BW switching, re-init to default */ + st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); + move16(); + } + + /*WB/SWB-FD_CNG*/ + scaleFactor.hb_scale = scaleFactor.lb_scale; + move16(); + + test(); + IF( !st_fx->cng_sba_flag || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + { + test(); + test(); + test(); + IF( ( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && ( EQ_16( st_fx->cng_type, FD_CNG ) ) && ( LT_16( st_fx->hFdCngDec->hFdCngCom->numCoreBands, st_fx->cldfbSyn->no_channels ) ) ) + { + generate_comfort_noise_dec_hf_fx( realBuffer, imagBuffer, &scaleFactor.hb_scale, st_fx ); + + st_fx->cldfbSyn->bandsToZero = 0; + move16(); + IF( LT_16( st_fx->hFdCngDec->hFdCngCom->regularStopBand, st_fx->cldfbSyn->no_channels ) ) + { + st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->hFdCngDec->hFdCngCom->regularStopBand ); + move16(); + } + st_fx->cldfbSyn->lsb = st_fx->cldfbAna->no_channels; + move16(); + } + } + + /* synthesis of the combined signal */ + st_fx->Q_syn2 = st_fx->Q_syn; + move16(); + cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); + + /* Bring CLDFB output to Q0 */ + Scale_sig( synth_out, output_frame, negate( st_fx->Q_syn2 ) ); + st_fx->Q_syn2 = 0; + move16(); + + /* save synthesis - needed in case of core switching */ + Copy( synth_out, st_fx->previoussynth_fx, output_frame ); + } +#else test(); IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) { @@ -1881,6 +1978,7 @@ ivas_error acelp_core_dec_fx( /* save synthesis - needed in case of core switching */ Copy( synth_out, st_fx->previoussynth_fx, output_frame ); } +#endif #ifdef IVAS_CODE ELSE { @@ -1924,13 +2022,34 @@ ivas_error acelp_core_dec_fx( IF( ( EQ_16( st_fx->L_frame, L_FRAME ) && NE_16( st_fx->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && ( EQ_16( st_fx->extl, -1 ) || EQ_16( st_fx->extl, SWB_CNG ) || ( EQ_16( st_fx->extl, WB_BWE ) && st_fx->extl_brate == 0 && NE_16( st_fx->coder_type, AUDIO ) ) ) ) ) { +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, + st_fx->Q_syn2, st_fx->hBWE_zero->delay_syn_hf_fx, &st_fx->hBWE_zero->memExp1, st_fx->hBWE_zero->mem_hp_interp_fx, st_fx->extl, st_fx->CNG_mode ); + } + ELSE + { + hf_synth_reset_fx( st_fx->hBWE_zero ); + } +#else hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, st_fx->Q_syn2, st_fx->hBWE_zero->delay_syn_hf_fx, &st_fx->hBWE_zero->memExp1, st_fx->hBWE_zero->mem_hp_interp_fx, st_fx->extl, st_fx->CNG_mode ); + +#endif } +#ifdef REMOVE_EVS_DUPLICATES2 ELSE { hf_synth_reset_fx( st_fx->hBWE_zero ); +#ifdef MSAN_FIX + IF( NE_16( st_fx->element_mode, EVS_MONO ) ) // TBV: tmp hack - it is a bug in EVS but conditon is here to keep EVS bit-exact + { + set16_fx( st_fx->hBWE_zero->mem_hp400_fx, 0, 6 ); + } +#endif } +#endif } /*-----------------------------------------------------------------* diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 0b2682f3a..7b4eef9f2 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -957,7 +957,6 @@ Word16 ApplyFdCng_fx( { #ifdef REMOVE_EVS_DUPLICATES2 scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); - #else scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); #endif @@ -1279,7 +1278,16 @@ Word16 ApplyFdCng_ivas_fx( ( !st->BER_detect ) ) { /* Perform noise estimation at the decoder */ - perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); + } + ELSE +#endif + { + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + } /* Update the shaping parameters */ test(); @@ -1522,7 +1530,16 @@ Word16 ApplyFdCng_ivas_fx( IF( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ - perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); + } + ELSE +#endif + { + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + } } } @@ -1580,7 +1597,16 @@ Word16 ApplyFdCng_ivas_fx( IF( st != NULL && EQ_16( st->cng_type, LP_CNG ) ) { /* Perform noise estimation on inactive phase at the decoder */ - perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); + } + ELSE +#endif + { + perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); + } /* Update the shaping parameters */ @@ -1833,7 +1859,16 @@ Word16 ApplyFdCng_ivas_fx( IF( EQ_16( st->codec_mode, MODE2 ) ) { /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec_ivas_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); + } + ELSE +#endif + { + generate_comfort_noise_dec_ivas_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); + } } BREAK; -- GitLab From ee29e3294f378e60e425a50e62ffa1b2875de886 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 11 Feb 2025 13:54:52 +0100 Subject: [PATCH 0007/1310] fix --- lib_dec/fd_cng_dec_fx.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 7b4eef9f2..bf10d9c17 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -955,11 +955,7 @@ Word16 ApplyFdCng_fx( test(); IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { -#ifdef REMOVE_EVS_DUPLICATES2 - scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); -#else scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); -#endif } hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; move16(); @@ -1041,13 +1037,8 @@ Word16 ApplyFdCng_fx( IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) { /* At initialization, interpolate the bin/band-wise levels from the partition levels */ -#ifdef REMOVE_EVS_DUPLICATES2 - scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); -#else scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); -#endif *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } @@ -1063,14 +1054,8 @@ Word16 ApplyFdCng_fx( /* Interpolate the CLDFB band levels from the SID (partition) levels */ IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) { -#ifdef REMOVE_EVS_DUPLICATES2 - scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); -#else scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); -#endif - *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } -- GitLab From 5e2edf84fe18ea27bb9d8c91ff2d6f0e7ffcd9cb Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 11 Feb 2025 14:34:33 +0100 Subject: [PATCH 0008/1310] fix --- lib_dec/amr_wb_dec_fx.c | 8 ++++++++ lib_dec/evs_dec_fx.c | 4 ++++ lib_dec/fd_cng_dec_fx.c | 30 ++++++++++++++++++++++++++---- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index d45655903..b3fbc0233 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -374,7 +374,11 @@ ivas_error amr_wb_dec_fx( IF( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_1k75 ) ) { /* decode CNG parameters */ +#ifdef REMOVE_EVS_DUPLICATES2 + CNG_dec_ivas_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); +#else CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); +#endif /* comfort noise generation */ CNG_exc_fx( st_fx->core_brate, L_FRAME, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate, @@ -795,8 +799,12 @@ ivas_error amr_wb_dec_fx( #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT PMT( "Fixed point not done here " ) ApplyFdCng_fx( syn, NULL, NULL, NULL, st, 0, 0 ); +#else +#ifdef REMOVE_EVS_DUPLICATES2 + ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); #else ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); +#endif #endif st_fx->hFdCngDec->hFdCngCom->frame_type_previous = st_fx->m_frame_type; move16(); diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index de6448433..fee893c4b 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -999,8 +999,12 @@ ivas_error evs_dec_fx( move32(); #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT ApplyFdCng_fx( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); +#else +#ifdef REMOVE_EVS_DUPLICATES2 + ApplyFdCng_ivas_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); #else ApplyFdCng_fx( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); +#endif #endif /* Generate additional comfort noise to mask potential coding artefacts */ test(); diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index bf10d9c17..0fba4e644 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1276,7 +1276,14 @@ Word16 ApplyFdCng_ivas_fx( /* Update the shaping parameters */ test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); + } + ELSE +#endif + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1596,7 +1603,14 @@ Word16 ApplyFdCng_ivas_fx( /* Update the shaping parameters */ test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); + } + ELSE +#endif + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } @@ -1675,8 +1689,16 @@ Word16 ApplyFdCng_ivas_fx( IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) { /* At initialization, interpolate the bin/band-wise levels from the partition levels */ - scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); + } + ELSE +#endif + { + scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); + } *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } -- GitLab From 5826482915088a6b53715c625a974c00d21004a1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 11 Feb 2025 15:19:24 +0100 Subject: [PATCH 0009/1310] fix --- lib_dec/fd_cng_dec_fx.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 0fba4e644..af670f0d0 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1711,8 +1711,16 @@ Word16 ApplyFdCng_ivas_fx( /* Interpolate the CLDFB band levels from the SID (partition) levels */ IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) { - scalebands_fx( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); + } + ELSE +#endif + { + scalebands_fx( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); + } *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); -- GitLab From e8fa2b8809206c5783edfbecea256352e97d28f3 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 11 Feb 2025 15:52:56 +0100 Subject: [PATCH 0010/1310] fix --- lib_dec/acelp_core_dec_fx.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index db6ba759d..3a96a6225 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -712,8 +712,19 @@ ivas_error acelp_core_dec_fx( test(); IF( st_fx->hMusicPF && st_fx->hGSCDec ) { - Rescale_exc( st_fx->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, - imult1616( st_fx->L_frame, HIBND_ACB_L_FAC ), 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + // VE: TBV: 'st_fx->L_frame * HIBND_ACB_L_FAC' should be corrected + Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, + st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); + } + ELSE +#endif + { + Rescale_exc( st_fx->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, + imult1616( st_fx->L_frame, HIBND_ACB_L_FAC ), 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); + } } IF( st_fx->hPFstat != NULL ) { @@ -2043,7 +2054,7 @@ ivas_error acelp_core_dec_fx( { hf_synth_reset_fx( st_fx->hBWE_zero ); #ifdef MSAN_FIX - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) // TBV: tmp hack - it is a bug in EVS but conditon is here to keep EVS bit-exact + IF( NE_16( st_fx->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but conditon is here to keep EVS bit-exact { set16_fx( st_fx->hBWE_zero->mem_hp400_fx, 0, 6 ); } -- GitLab From 4276239737d482ee265d2eec90166ed4ee51c48a Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 11 Feb 2025 20:34:33 +0100 Subject: [PATCH 0011/1310] remove acelp_core_dec_fx() --- lib_dec/acelp_core_dec_fx.c | 18 +- lib_dec/acelp_core_dec_ivas_fx.c | 905 +++++++++++++++++++------------ lib_dec/amr_wb_dec_fx.c | 4 +- lib_dec/decision_matrix_dec_fx.c | 15 + lib_dec/evs_dec_fx.c | 7 +- lib_dec/fd_cng_dec_fx.c | 16 +- 6 files changed, 606 insertions(+), 359 deletions(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 3a96a6225..fc35cb754 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -432,7 +432,7 @@ ivas_error acelp_core_dec_fx( } /* update synthesis filter memories */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES ivas_synth_mem_updt2_fx( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); #else synth_mem_updt2( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); @@ -634,7 +634,7 @@ ivas_error acelp_core_dec_fx( /* decode CNG parameters */ IF( st_fx->cng_type == LP_CNG ) { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES CNG_dec_ivas_fx( st_fx, st_fx->last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); #else CNG_dec_fx( st_fx, st_fx->last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); @@ -708,11 +708,11 @@ ivas_error acelp_core_dec_fx( } i = st_fx->Q_exc; move16(); -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES test(); IF( st_fx->hMusicPF && st_fx->hGSCDec ) { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { // VE: TBV: 'st_fx->L_frame * HIBND_ACB_L_FAC' should be corrected @@ -1593,7 +1593,7 @@ ivas_error acelp_core_dec_fx( move32(); } /*Noise estimate*/ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) && !st_fx->cng_ism_flag ) #else IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) /* && !st->cng_ism_flag IVAS_CODE */ ) @@ -1603,7 +1603,7 @@ ivas_error acelp_core_dec_fx( PMT( "Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done" ) ApplyFdCng_fx( syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); #else -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, realBuffer, imagBuffer, NULL, st_fx, 0, ( st_fx->coder_type == AUDIO && !st_fx->GSC_noisy_speech ) ); #else ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); @@ -1792,7 +1792,7 @@ ivas_error acelp_core_dec_fx( st_fx->stab_fac_fx, &st_fx->stab_fac_smooth_fx, st_fx->coder_type, st_fx->Q_syn, bpf_error_signal ); } -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { /* analysis of the synthesis at internal sampling rate */ @@ -2033,7 +2033,7 @@ ivas_error acelp_core_dec_fx( IF( ( EQ_16( st_fx->L_frame, L_FRAME ) && NE_16( st_fx->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && ( EQ_16( st_fx->extl, -1 ) || EQ_16( st_fx->extl, SWB_CNG ) || ( EQ_16( st_fx->extl, WB_BWE ) && st_fx->extl_brate == 0 && NE_16( st_fx->coder_type, AUDIO ) ) ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, @@ -2049,7 +2049,7 @@ ivas_error acelp_core_dec_fx( #endif } -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES ELSE { hf_synth_reset_fx( st_fx->hBWE_zero ); diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 8d6b63833..f02e6d337 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -151,7 +151,6 @@ ivas_error acelp_core_dec_ivas_fx( error = IVAS_ERR_OK; move32(); - test(); test(); test(); @@ -664,11 +663,21 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; - move16(); - FdCng_decodeSID_ivas_fx( st ); - rescale_fdCngDec( st->hFdCngDec, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); - Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ), Q2 ) ); // Qx +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + FdCng_decodeSID_fx( st->hFdCngDec->hFdCngCom, st ); + } + ELSE +#endif + { + Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; + move16(); + FdCng_decodeSID_ivas_fx( st ); + rescale_fdCngDec( st->hFdCngDec, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); + Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ), Q2 ) ); // Qx + } + *sid_bw = 0; move16(); } @@ -720,7 +729,16 @@ ivas_error acelp_core_dec_ivas_fx( } } - generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + generate_comfort_noise_dec_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 2, -1 ); + } + ELSE +#endif + { + generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); + } FdCng_exc( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old_fx, st->first_CNG, st->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); @@ -740,8 +758,19 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( st->hMusicPF && st->hGSCDec ) { - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, - imult1616( st->L_frame, HIBND_ACB_L_FAC ), 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV: 'st_fx->L_frame * HIBND_ACB_L_FAC' should be corrected + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, + st->L_frame * HIBND_ACB_L_FAC, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); + } + ELSE +#endif + { + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, + imult1616( st->L_frame, HIBND_ACB_L_FAC ), 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); + } } IF( st->hPFstat != NULL ) { @@ -763,14 +792,26 @@ ivas_error acelp_core_dec_ivas_fx( /* Update music post processing values */ /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - st->hMusicPF->filt_lfE_fx[i] = add( 9830, mult_r( 22937, st->hMusicPF->filt_lfE_fx[i] ) ); // Q15, 9830 =.3f in Q15, 22937=.7f in Q15 - move16(); + FOR( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); + move16(); + } + } + ELSE +#endif + { + FOR( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE_fx[i] = add( 9830, mult_r( 22937, st->hMusicPF->filt_lfE_fx[i] ) ); // Q15, 9830 =.3f in Q15, 22937=.7f in Q15 + move16(); + } } } - /* synthesis at 12.8kHz sampling rate */ #ifndef FIX_1100_REMOVE_LPC_RESCALING Aq_fx[0] = ONE_IN_Q12; @@ -778,15 +819,28 @@ ivas_error acelp_core_dec_ivas_fx( move16(); syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); syn_12k8_fx( st->L_frame, Aq_fx, exc3_fx, syn1_fx, st->mem_syn3_fx, 1, st->Q_exc, st->Q_syn ); - st->Q_syn_cng = st->Q_syn; - move16(); - st->Q_exc_cng = st->Q_exc; - move16(); + /* reset the decoder */ CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); - /* update st->mem_syn1 for ACELP core switching */ - Copy_Scale_sig( st->mem_syn3_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); // Q(-1) + +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + /* update st_fx->mem_syn1 for ACELP core switching */ + Copy( st->mem_syn3_fx, st->mem_syn1_fx, M ); + } + ELSE +#endif + { + st->Q_syn_cng = st->Q_syn; + move16(); + st->Q_exc_cng = st->Q_exc; + move16(); + + /* update st->mem_syn1 for ACELP core switching */ + Copy_Scale_sig( st->mem_syn3_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); // Q(-1) + } /* update old synthesis for classification */ Copy( syn1_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); @@ -1157,13 +1211,30 @@ ivas_error acelp_core_dec_ivas_fx( Word16 qdct = 0; move16(); /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV: this is a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_coder_type, st->element_mode, pitch_buf_fx, + st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); + } + ELSE +#endif + { + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); + } /* LD music post-filter */ LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ +#ifdef REMOVE_EVS_DUPLICATES + IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBC whether needed in IVAS +#endif + { + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ + } + Post_music_postP_fx( dct_buffer_fx, exc2_fx, st->mem_syn2_fx, st->mem_syn2_fx, Aq_fx, psyn_fx, &st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn_clas_estim_fx, 0, &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, temp_buf_fx, mem_tmp_fx ); @@ -1209,6 +1280,7 @@ ivas_error acelp_core_dec_ivas_fx( /*------------------------------------------------------------* * FEC - Estimate the classification information *------------------------------------------------------------*/ + FEC_clas_estim_fx( st, st->Opt_AMR_WB, st->L_frame, &st->clas_dec, st->coder_type, pitch_buf_fx, psyn_fx, &st->lp_ener_FER_fx, &st->decision_hyst, NULL, NULL, NULL, NULL, 0, NULL, st->Q_syn, temp_buf_fx, @@ -1586,19 +1658,28 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) { - IF( st->idchan == 0 ) +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - IF( NE_16( st->element_mode, last_element_mode ) ) + generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); + } + ELSE +#endif + { + IF( st->idchan == 0 ) { - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); + IF( NE_16( st->element_mode, last_element_mode ) ) + { + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); + } + Word32 psyn_32_fx[L_FRAME16k]; + Word16 exp; + Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 + Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); // Q15 + generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn + Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 } - Word32 psyn_32_fx[L_FRAME16k]; - Word16 exp; - Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 - Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); // Q15 - generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); - Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn - Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 } } } @@ -1685,36 +1766,27 @@ ivas_error acelp_core_dec_ivas_fx( * Bass post-filter *----------------------------------------------------------------*/ - /* check if the CLDFB works on the right sample rate */ - IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + CLDFB_SCALE_FACTOR scaleFactor; + Word32 workBuffer[128 * 3]; - IF( st->ini_frame > 0 ) + /* check if the CLDFB works on the right sample rate */ + IF( ( st->cldfbAna->usb * st->cldfbAna->no_col ) != st->L_frame ) { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); - } - } - - /* analyze pitch coherence for bass post-filter */ + /* resample to ACELP internal sampling rate */ + Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + resampleCldfb( st->cldfbAna, newCldfbBands, st->L_frame, 0 ); + resampleCldfb( st->cldfbBPF, newCldfbBands, st->L_frame, 0 ); - Word32 pitch_buf_fx_q20[12]; - - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) - Word16 lim = shr( st->L_frame, 6 ); - FOR( Word16 lp = 0; lp < lim; lp++ ) - { - pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); - move32(); - } - bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); // Qx + IF( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } + } - test(); - IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) - { test(); IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) { @@ -1730,89 +1802,26 @@ ivas_error acelp_core_dec_ivas_fx( bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); - } - Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; - set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); - syn_32_fx = syn_tmp_32_fx + L_SUBFR; - test(); - IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) - { - /* analysis of the synthesis at internal sampling rate */ - Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - pRealSave_fx[i] = realBufferSave_fx[i]; - pImagSave_fx[i] = imagBufferSave_fx[i]; - } -#ifndef MSAN_FIX - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 -#endif - IF( st->p_bpf_noise_buf_32 ) - { -#ifdef MSAN_FIX - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 -#endif - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 - } -#ifdef MSAN_FIX - FOR( i = 0; i < st->L_frame; i++ ) -#else - for ( i = 0; i < L_FRAME16k; i++ ) -#endif - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 - move32(); - } + /* analysis of the synthesis at internal sampling rate */ + cldfbAnalysisFiltering( st->cldfbAna, realBuffer_fx, imagBuffer_fx, &scaleFactor, psyn_fx, negate( st->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; + scaleFactor.hb_scale = scaleFactor.lb_scale; move16(); - cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); - /* analysis and add the BPF error signal */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - q_bpf_error_signal = Q6; - move16(); -#ifdef MSAN_FIX -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#else - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#endif -#else - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn ); // Q6 -#endif - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; - move16(); - tmp = -1; + /* analysis and add the BPF error signal */ + i = 0; move16(); - if ( st->bpf_off ) + if ( st->bpf_off == 0 ) { - tmp = 0; + i = CLDFB_NO_COL_MAX; move16(); } - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; - move16(); + addBassPostFilter_fx( bpf_error_signal_16fx, realBuffer_fx, imagBuffer_fx, st->cldfbBPF, workBuffer, negate( st->Q_syn ), + i, st->cldfbAna->no_col, st->cldfbAna->no_channels, &scaleFactor ); + /* set output mask for upsampling */ IF( EQ_16( st->bwidth, NB ) ) { @@ -1826,118 +1835,405 @@ ivas_error acelp_core_dec_ivas_fx( st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); move16(); } + + /*WB/SWB-FD_CNG*/ + scaleFactor.hb_scale = scaleFactor.lb_scale; + move16(); + test(); - IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) + test(); + test(); + IF( ( ( st->core_brate == FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) { - test(); - test(); - test(); - /*WB/SWB-FD_CNG*/ - IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) + generate_comfort_noise_dec_hf_fx( realBuffer_fx, imagBuffer_fx, &scaleFactor.hb_scale, st ); + + st->cldfbSyn->bandsToZero = 0; + move16(); + IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) { - Word16 tmpBufferScale = 0; + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); move16(); - generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); + } + st->cldfbSyn->lsb = st->cldfbAna->no_channels; + move16(); + } - FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) - { - Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - } + /* synthesis of the combined signal */ + st->Q_syn2 = st->Q_syn; + move16(); + cldfbSynthesisFiltering( st->cldfbSyn, realBuffer_fx, imagBuffer_fx, &scaleFactor, synth_fx16, negate( st->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); + + /* Bring CLDFB output to Q0 */ + Scale_sig( synth_fx16, output_frame, negate( st->Q_syn2 ) ); + st->Q_syn2 = 0; + move16(); + + /* save synthesis - needed in case of core switching */ + Copy( synth_fx16, st->previoussynth_fx, output_frame ); + } + ELSE +#endif + { + /* check if the CLDFB works on the right sample rate */ + IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) + { + resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + + IF( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } + } + + /* analyze pitch coherence for bass post-filter */ + + Word32 pitch_buf_fx_q20[12]; - IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) + Word16 lim = shr( st->L_frame, 6 ); + FOR( Word16 lp = 0; lp < lim; lp++ ) + { + pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); + move32(); + } + bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); // Qx + + test(); + IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) + { + test(); + IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) + { + IF( EQ_16( st->L_frame, L_FRAME ) ) { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); - move16(); + retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); } - ELSE + ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) { - st->cldfbSyn->bandsToZero = 0; - move16(); + retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); } } + + bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, + st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); } - IF( save_hb_synth_fx16 != NULL ) + Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; + set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); + syn_32_fx = syn_tmp_32_fx + L_SUBFR; + test(); + IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) { - /* save and then zero-out lowband */ - Word16 Q_real = 0, Q_imag = 0; - Word32 max_real = 0, max_imag = 0; + /* analysis of the synthesis at internal sampling rate */ + Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + pRealSave_fx[i] = realBufferSave_fx[i]; + pImagSave_fx[i] = imagBufferSave_fx[i]; + } +#ifndef MSAN_FIX + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 +#endif + IF( st->p_bpf_noise_buf_32 ) + { +#ifdef MSAN_FIX + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 +#endif + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 + } + +#ifdef MSAN_FIX + FOR( i = 0; i < st->L_frame; i++ ) +#else + for ( i = 0; i < L_FRAME16k; i++ ) +#endif + { + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 + move32(); + } + + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; move16(); + cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; move16(); - move32(); - move32(); + /* analysis and add the BPF error signal */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + + q_bpf_error_signal = Q6; + move16(); +#ifdef MSAN_FIX +#ifdef FIX_ISSUE_1237 + Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 +#else + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 +#endif +#else + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, q_bpf_error_signal - st->Q_syn ); // Q6 +#endif FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 } - Word32 max_val = L_max( max_real, max_imag ); - Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; - Q_real = Q_imag; + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; move16(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + tmp = -1; + move16(); + if ( st->bpf_off ) { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_imag ); // Q_imag + tmp = 0; + move16(); } - scale_sig32_r( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); + + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; move16(); -#ifndef MSAN_FIX - Scale_sig32( save_hb_synth_fx, L_FRAME48k, sub( Q_real, 1 ) ); // Q_real-1 -#endif + /* set output mask for upsampling */ + IF( EQ_16( st->bwidth, NB ) ) + { + /* set NB mask for upsampling */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); + move16(); + } + ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) + { + /* in case of BW switching, re-init to default */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } + test(); + IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) + { + test(); + test(); + test(); + /*WB/SWB-FD_CNG*/ + IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) + { + Word16 tmpBufferScale = 0; + move16(); + generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); + + FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) + { + Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 + Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 + } - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); + move16(); + } + ELSE + { + st->cldfbSyn->bandsToZero = 0; + move16(); + } + } + } + + IF( save_hb_synth_fx16 != NULL ) { + /* save and then zero-out lowband */ + Word16 Q_real = 0, Q_imag = 0; + Word32 max_real = 0, max_imag = 0; + move16(); + move16(); + move32(); + move32(); FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - realBufferSave_fx[i][j] = realBuffer_fx[i][j]; - imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; - move32(); - move32(); - IF( LT_16( j, st->hFdCngDec->hFdCngCom->numCoreBands ) && LT_16( i, st->hFdCngDec->hFdCngCom->numSlots ) ) + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + Word32 max_val = L_max( max_real, max_imag ); + Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; + Q_real = Q_imag; + move16(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_imag ); // Q_imag + } + scale_sig32_r( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) + st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); + move16(); +#ifndef MSAN_FIX + Scale_sig32( save_hb_synth_fx, L_FRAME48k, sub( Q_real, 1 ) ); // Q_real-1 +#endif + + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - realBuffer_fx[i][j] = 0; - imagBuffer_fx[i][j] = 0; + realBufferSave_fx[i][j] = realBuffer_fx[i][j]; + imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; move32(); move32(); + IF( LT_16( j, st->hFdCngDec->hFdCngCom->numCoreBands ) && LT_16( i, st->hFdCngDec->hFdCngCom->numSlots ) ) + { + realBuffer_fx[i][j] = 0; + imagBuffer_fx[i][j] = 0; + move32(); + move32(); + } } } - } - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, st->cldfbSynHB ); + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, st->cldfbSynHB ); - Scale_sig32( save_hb_synth_fx, L_FRAME48k, negate( ( sub( Q_real, 1 ) ) ) ); // Q0 - Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); - /* restore lowband */ - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + Scale_sig32( save_hb_synth_fx, L_FRAME48k, negate( ( sub( Q_real, 1 ) ) ) ); // Q0 + Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSynHB->Q_cldfb_state = Q10; + move16(); + /* restore lowband */ + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBuffer_fx[i][j] = realBufferSave_fx[i][j]; + imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; + move32(); + move32(); + } + } + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 + st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); + move16(); + cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, st->cldfbSyn ); + Scale_sig32( synth_fx, L_FRAME48k, negate( sub( Q_real, 1 ) ) ); // Q0 + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSynHB->Q_cldfb_state = Q10; + move16(); + } + ELSE { + /* synthesis of the combined signal */ + Word16 Q_real, Q_imag; + Word32 max_real, max_imag; + Q_real = 0; + Q_imag = 0; + max_real = 0; + max_imag = 0; + move16(); + move16(); + move32(); + move32(); FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - realBuffer_fx[i][j] = realBufferSave_fx[i][j]; - imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; - move32(); - move32(); + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } } + Word32 max_val = L_max( max_real, max_imag ); + Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; + Q_real = Q_imag; + move16(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + } + scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) + st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); + move16(); +#ifndef MSAN_FIX + Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); +#endif + + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, st->cldfbSyn ); +#ifdef MSAN_FIX + scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 +#else + Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); +#endif + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSyn->Q_cldfb_state = Q10; + move16(); } - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - move16(); - cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, st->cldfbSyn ); - Scale_sig32( synth_fx, L_FRAME48k, negate( sub( Q_real, 1 ) ) ); // Q0 - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); + + /* save synthesis - needed in case of core switching */ + Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 } ELSE { - /* synthesis of the combined signal */ + Word16 nSamples = NS2SA_FX2( i_mult( st->L_frame, FRAMES_PER_SEC ), FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ + + /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ +#ifndef MSAN_FIX + for ( i = 0; i < L_FRAME16k; i++ ) +#else + FOR( i = 0; i < st->L_frame; i++ ) +#endif + { + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); + move32(); + } + + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; + move16(); + cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); + + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; + move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset; + cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + + // Get Q-factor + q_bpf_error_signal = Q6; + move16(); +#ifdef FIX_ISSUE_1237 + Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 +#else + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 +#endif + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + } + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + move16(); + tmp = 0; + move16(); + if ( !st->bpf_off ) + { + tmp = nSamples; + move16(); + } + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + + + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; + move16(); + /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ Word16 Q_real, Q_imag; Word32 max_real, max_imag; Q_real = 0; @@ -1966,151 +2262,46 @@ ivas_error acelp_core_dec_ivas_fx( scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real } scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) - st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); - move16(); #ifndef MSAN_FIX Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); #endif - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, st->cldfbSyn ); + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), st->cldfbSyn ); + #ifdef MSAN_FIX - scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 + Scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 #else Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); #endif - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 st->cldfbSyn->Q_cldfb_state = Q10; move16(); - } - - /* save synthesis - needed in case of core switching */ - Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 - } - ELSE - { - Word16 nSamples = NS2SA_FX2( i_mult( st->L_frame, FRAMES_PER_SEC ), FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ -#ifndef MSAN_FIX - for ( i = 0; i < L_FRAME16k; i++ ) -#else - FOR( i = 0; i < st->L_frame; i++ ) -#endif - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); - move32(); - } + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 + } - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; - move16(); - cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); - - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset; - cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - - // Get Q-factor - q_bpf_error_signal = Q6; - move16(); -#ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#else - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 -#endif - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; - move16(); - tmp = 0; - move16(); - if ( !st->bpf_off ) - { - tmp = nSamples; - move16(); + set32_fx( synth_fx, 0, output_frame ); } - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); - - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; - move16(); - /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ - Word16 Q_real, Q_imag; - Word32 max_real, max_imag; - Q_real = 0; - Q_imag = 0; - max_real = 0; - max_imag = 0; - move16(); - move16(); - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - Word32 max_val = L_max( max_real, max_imag ); - Q_imag = sub( norm_l( max_val ), 3 ) /* Guard bits */; - Q_real = Q_imag; - move16(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - } - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) + /* Copy output signal */ #ifndef MSAN_FIX - Scale_sig32( synth_fx, L_FRAME48k, Q_real - 1 ); -#endif - - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), st->cldfbSyn ); - -#ifdef MSAN_FIX - Scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 + Scale_sig( syn_tmp_fx, L_FRAME16k + L_SUBFR, -st->Q_syn ); #else - Scale_sig32( synth_fx, L_FRAME48k, -( Q_real - 1 ) ); + Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), negate( st->Q_syn ) ); // Q0 #endif - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSyn->Q_cldfb_state = Q10; - move16(); - IF( st->p_bpf_noise_buf_32 ) + IF( st->element_mode > EVS_MONO ) { - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 + Copy( psyn_fx, output_fx, st->L_frame ); /*Q_syn*/ } - set32_fx( synth_fx, 0, output_frame ); - } - - /* Copy output signal */ -#ifndef MSAN_FIX - Scale_sig( syn_tmp_fx, L_FRAME16k + L_SUBFR, -st->Q_syn ); -#else - Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), negate( st->Q_syn ) ); // Q0 -#endif - IF( st->element_mode > EVS_MONO ) - { - Copy( psyn_fx, output_fx, st->L_frame ); /*Q_syn*/ + st->Q_syn2 = 0; + move16(); } - st->Q_syn2 = 0; - move16(); /*-----------------------------------------------------------------* * Bandwidth extension 6kHz-7kHz *-----------------------------------------------------------------*/ @@ -2126,26 +2317,41 @@ ivas_error acelp_core_dec_ivas_fx( IF( ( EQ_16( st->L_frame, L_FRAME ) && ( st->bwidth != NB ) && GE_16( output_frame, L_FRAME16k ) && ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) { +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, + st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &st->hBWE_zero->memExp1, st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode ); + } + ELSE +#endif + { #ifdef MSAN_FIX - Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 + Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 #else - Copy_Scale_sig_32_16( synth_fx, synth_fx16, L_FRAME48k, 0 ); + Copy_Scale_sig_32_16( synth_fx, synth_fx16, L_FRAME48k, 0 ); #endif - hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, - psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &st->hBWE_zero->memExp1, - st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode ); + hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, + psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2, st->hBWE_zero->delay_syn_hf_fx, &st->hBWE_zero->memExp1, + st->hBWE_zero->mem_hp_interp_fx, st->extl, st->CNG_mode ); #ifdef MSAN_FIX - Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 ); + Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 ); #else - Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, L_FRAME48k, 0 ); + Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, L_FRAME48k, 0 ); #endif + } } ELSE { hf_synth_reset_fx( st->hBWE_zero ); +#ifdef REMOVE_EVS_DUPLICATES2 + IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but conditon is here to keep EVS bit-exact +#endif + { #ifdef MSAN_FIX - set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); + set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); #endif + } } } @@ -2180,13 +2386,23 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) { +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, + st->coder_type, voice_factors_fx, st->L_frame ); + } + ELSE +#endif + { #ifdef FIX_ISSUE_1237 - Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc #else - Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + Copy_Scale_sig_16_32_DEPREC( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc #endif - non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); - Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); + Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + } } test(); if ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) @@ -2195,6 +2411,7 @@ ivas_error acelp_core_dec_ivas_fx( move32(); } } + /*----------------------------------------------------------------------* * Updates *----------------------------------------------------------------------*/ @@ -2205,10 +2422,19 @@ ivas_error acelp_core_dec_ivas_fx( IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) { /* update CNG parameters in active frames */ - cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, - st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, - st->hFdCngDec->hFdCngCom->CngBandwidth ); - +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + cng_params_upd_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, + st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate ); + } + ELSE +#endif + { + cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, + st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, + st->hFdCngDec->hFdCngCom->CngBandwidth ); + } /* Set 16k LSP flag for CNG buffer */ st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; @@ -2220,6 +2446,9 @@ ivas_error acelp_core_dec_ivas_fx( } } +#ifdef REMOVE_EVS_DUPLICATES + IF( NE_16( st->element_mode, EVS_MONO ) ) +#endif { IF( save_hb_synth_fx16 ) { diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index b3fbc0233..8a2ef7b40 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -374,7 +374,7 @@ ivas_error amr_wb_dec_fx( IF( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_1k75 ) ) { /* decode CNG parameters */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES CNG_dec_ivas_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); #else CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); @@ -800,7 +800,7 @@ ivas_error amr_wb_dec_fx( PMT( "Fixed point not done here " ) ApplyFdCng_fx( syn, NULL, NULL, NULL, st, 0, 0 ); #else -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); #else ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); diff --git a/lib_dec/decision_matrix_dec_fx.c b/lib_dec/decision_matrix_dec_fx.c index 9c0020223..ff03f8bc5 100644 --- a/lib_dec/decision_matrix_dec_fx.c +++ b/lib_dec/decision_matrix_dec_fx.c @@ -713,5 +713,20 @@ void decision_matrix_dec_fx( move16(); } +#ifdef REMOVE_EVS_DUPLICATES2 + /*-----------------------------------------------------------------* + * set inactive coder_type flag in ACELP core + *-----------------------------------------------------------------*/ + + st->inactive_coder_type_flag = 0; /* AVQ by default */ + move16(); + + if ( LE_32( st->total_brate, MAX_GSC_INACTIVE_BRATE ) ) + { + st->inactive_coder_type_flag = 1; /* GSC */ + move16(); + } + +#endif return; } diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index fee893c4b..2f0873ba5 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -346,8 +346,11 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ - +#ifdef REMOVE_EVS_DUPLICATES2 + IF( ( error = acelp_core_dec_ivas_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) +#else IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1000,7 +1003,7 @@ ivas_error evs_dec_fx( #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT ApplyFdCng_fx( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); #else -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES ApplyFdCng_ivas_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); #else ApplyFdCng_fx( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index af670f0d0..a3c9b5826 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1263,7 +1263,7 @@ Word16 ApplyFdCng_ivas_fx( ( !st->BER_detect ) ) { /* Perform noise estimation at the decoder */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); @@ -1276,7 +1276,7 @@ Word16 ApplyFdCng_ivas_fx( /* Update the shaping parameters */ test(); -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); @@ -1522,7 +1522,7 @@ Word16 ApplyFdCng_ivas_fx( IF( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); @@ -1589,7 +1589,7 @@ Word16 ApplyFdCng_ivas_fx( IF( st != NULL && EQ_16( st->cng_type, LP_CNG ) ) { /* Perform noise estimation on inactive phase at the decoder */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); @@ -1603,7 +1603,7 @@ Word16 ApplyFdCng_ivas_fx( /* Update the shaping parameters */ test(); -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); @@ -1689,7 +1689,7 @@ Word16 ApplyFdCng_ivas_fx( IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) { /* At initialization, interpolate the bin/band-wise levels from the partition levels */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); @@ -1711,7 +1711,7 @@ Word16 ApplyFdCng_ivas_fx( /* Interpolate the CLDFB band levels from the SID (partition) levels */ IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); @@ -1874,7 +1874,7 @@ Word16 ApplyFdCng_ivas_fx( IF( EQ_16( st->codec_mode, MODE2 ) ) { /* Generate comfort noise during SID or zero frames */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); -- GitLab From 3fcb6e833731821485d4855821e600021da26cec Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 08:56:01 +0100 Subject: [PATCH 0012/1310] fix NB PF - tmp hack --- lib_dec/acelp_core_dec_ivas_fx.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index f02e6d337..90360d635 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -1498,7 +1498,18 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( st->last_bwidth == NB && st->hPFstat != NULL ) { - Copy( pitch_buf_fx, pitch_buf_tmp, NB_SUBFR16k ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); + } + ELSE +#endif + { + // VE: TBV: tmp hack - this is a bug in IVAS + Copy( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr ); + } + IF( st->bwidth == NB ) { st->hPFstat->on = 1; -- GitLab From 0a01289c10e58a9ab2ecfa93a0061768fd7d11fc Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 09:55:43 +0100 Subject: [PATCH 0013/1310] try revert acelp_core_dec_fx() --- lib_dec/evs_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 2f0873ba5..ada1a68de 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -346,7 +346,7 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES2aa IF( ( error = acelp_core_dec_ivas_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) #else IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -- GitLab From b2e1ffd8a00ee1b64d0a8f963182946b67874649 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 10:27:06 +0100 Subject: [PATCH 0014/1310] fix CNA --- lib_dec/acelp_core_dec_ivas_fx.c | 22 +++++++++++++++++++--- lib_dec/evs_dec_fx.c | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 90360d635..09d370760 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -1748,10 +1748,26 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { - FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); - move16(); + // VE:TBC - in FLP, it is: + // v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, temp_buf, st->L_frame / 2 ); + // v_add( temp_buf, syn, syn, st->L_frame / 2 ); + FOR( i = 0; i < st->L_frame / 2; i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st->L_frame / 4], negate( st->Q_syn ) ) ); + move16(); + } + } + ELSE +#endif + { + FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); + move16(); + } } } diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index ada1a68de..2f0873ba5 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -346,7 +346,7 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ -#ifdef REMOVE_EVS_DUPLICATES2aa +#ifdef REMOVE_EVS_DUPLICATES2 IF( ( error = acelp_core_dec_ivas_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) #else IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -- GitLab From 94c98bdb687a8609009c9fe94b80c33329734b41 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 11:30:34 +0100 Subject: [PATCH 0015/1310] REMOVE_EVS_DUPLICATES3 --- lib_com/bits_alloc_fx.c | 3 ++- lib_com/gs_inact_switching_fx.c | 5 +++-- lib_com/prot_fx.h | 32 ++++++++++++++++++++---------- lib_dec/FEC_fx.c | 4 ++++ lib_dec/FEC_scale_syn_fx.c | 3 ++- lib_dec/acelp_core_switch_dec_fx.c | 6 ++++++ lib_dec/amr_wb_dec_fx.c | 17 ++++++++++++++++ lib_dec/cng_dec_fx.c | 3 ++- lib_dec/dec_ace_fx.c | 6 ++++++ lib_dec/dec_gen_voic_fx.c | 3 ++- lib_dec/dec_pit_exc_fx.c | 3 +++ lib_dec/dec_uv_fx.c | 3 ++- lib_dec/evs_dec_fx.c | 2 +- lib_dec/fd_cng_dec_fx.c | 4 +++- lib_dec/gs_dec_fx.c | 18 +++++++++++++++-- lib_dec/lsf_dec_fx.c | 3 ++- lib_enc/acelp_core_enc_fx.c | 28 ++++++++++++++++++++++++-- lib_enc/acelp_core_switch_enc_fx.c | 6 ++++++ lib_enc/transition_enc_fx.c | 27 +++++++++++++++++++++++++ 19 files changed, 152 insertions(+), 24 deletions(-) diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index 83a98a85f..53c5ca474 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -761,6 +761,7 @@ static ivas_error acelp_FCB_allocator_ivas( * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz *--------------------------------------------------------------------*/ +#ifndef REMOVE_EVS_DUPLICATES ivas_error config_acelp1( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ @@ -1875,7 +1876,7 @@ ivas_error config_acelp1( * - should be in range of <6700; 24350> for ACELP@12.8kHz * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz *--------------------------------------------------------------------*/ - +#endif ivas_error config_acelp1_IVAS( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index 52635d502..5e74feb0c 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -38,6 +38,8 @@ /* RETURN ARGUMENTS : */ /* _ None */ /*========================================================================*/ + +#ifndef REMOVE_EVS_DUPLICATES void Inac_swtch_ematch_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ @@ -155,8 +157,7 @@ void Inac_swtch_ematch_fx( return; } - - +#endif void Inac_switch_ematch_ivas_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index bef07e952..f80814a0e 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -4776,6 +4776,7 @@ Word16 BITS_ALLOC_config_acelp( const Word16 narrowband, const Word16 nb_subfr ); +#ifndef REMOVE_EVS_DUPLICATES3 ivas_error config_acelp1( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ @@ -4802,7 +4803,7 @@ ivas_error config_acelp1( const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ); - +#endif Word16 set_ACELP_flag( const Word16 element_mode, /* i : element mode */ const Word32 element_brate, /* i : element bitrate */ @@ -5762,6 +5763,7 @@ void tcx_ltp_post32( Word32 *tcx_buf, /* sig_q */ Word16 sig_q ); +#ifndef REMOVE_EVS_DUPLICATES3 // gs_inact_switching_fx.c void Inac_swtch_ematch_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ @@ -5777,6 +5779,7 @@ void Inac_swtch_ematch_fx( const short last_core, /* i : Last core used */ const short last_codec_mode /* i : Last codec mode */ ); +#endif void Inac_switch_ematch_ivas_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ @@ -6035,6 +6038,7 @@ void td_bwe_dec_init_fx( const Word32 output_Fs /* i : output sampling rate */ ); +#ifndef REMOVE_EVS_DUPLICATES3 // lsf_dec_fx.c void lsf_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ @@ -6048,7 +6052,7 @@ void lsf_dec_fx( , const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ); - +#endif void lsf_dec_ivas_fx( Decoder_State *st_fx, /* i/o: State structure */ const Word16 tc_subfr, /* i : TC subframe index Q0*/ @@ -6204,6 +6208,7 @@ void lsf_mid_dec_fx( Word16 lsp_mid[] /* o : quantized LSPs Q15*/ ); +#ifndef REMOVE_EVS_DUPLICATES3 // cng_dec_fx.c void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ @@ -6214,7 +6219,7 @@ void CNG_dec_fx( Word16 *allow_cn_step, /* o : allow CN step Q0 */ Word16 *sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0 */ Word32 *q_env ); - +#endif void CNG_dec_ivas_fx( Decoder_State *st_fx, /* i/o: State structure */ const Word16 last_element_mode, /* i : last element mode Q0 */ @@ -6819,6 +6824,7 @@ void PulseResynchronization_fx( Word32 /*float*/ const pitchEnd /*i Q16*/ ); +#ifndef REMOVE_EVS_DUPLICATES3 // gs_dec_fx.c void decod_audio_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -6833,7 +6839,7 @@ void decod_audio_fx( , Word16 *gain_buf /*Q14*/ ); - +#endif void decod_audio_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ @@ -6852,6 +6858,7 @@ void decod_audio_ivas_fx( const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6*/ ); +#ifndef REMOVE_EVS_DUPLICATES3 void gsc_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ @@ -6864,7 +6871,7 @@ void gsc_dec_fx( const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ Word16 Q_exc ); - +#endif void gsc_dec_ivas_fx( Decoder_State *st_fx, /* i/o: State structure */ Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ @@ -7080,6 +7087,7 @@ void re8_PPV_fx( Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0 */ ); +#ifndef REMOVE_EVS_DUPLICATES3 // dec_pit_exc_fx.c void dec_pit_exc_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -7099,7 +7107,7 @@ void dec_pit_exc_fx( const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ #endif ); - +#endif void dec_pit_exc_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ @@ -7539,6 +7547,7 @@ void configureFdCngDec_fx( const Word16 Last_L_frame, const Word16 element_mode ); +#ifndef REMOVE_EVS_DUPLICATES3 /* Apply the CLDFB-based CNG */ Word16 ApplyFdCng_fx( Word16 *timeDomainInput, /* i : pointer to time domain i */ @@ -7552,7 +7561,7 @@ Word16 ApplyFdCng_fx( Decoder_State *st, const Word16 concealWholeFrame, /* i : binary flag indicating frame loss */ Word16 is_music ); - +#endif Word16 ApplyFdCng_ivas_fx( Word16 *timeDomainInput, /* i : pointer to time domain input */ Word16 Q, @@ -8185,6 +8194,7 @@ void FEC_pitch_estim_fx( Word16 element_mode /* i : element mode */ ); +#ifndef REMOVE_EVS_DUPLICATES3 // FEC_scale_sync_fx.c void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ @@ -8215,7 +8225,7 @@ void FEC_scale_syn_fx( const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ const Word16 force_scaling /* i: force scaling */ ); - +#endif void FEC_scale_syn_ivas_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ @@ -8532,6 +8542,7 @@ Word16 FEC_synchro_exc_fx( /* o : do_WI flag const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ ); +#ifndef REMOVE_EVS_DUPLICATES3 // dec_uv_fx.c void decod_unvoiced_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -8544,7 +8555,7 @@ void decod_unvoiced_fx( Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ Word16 *gain_buf ); - +#endif void decod_unvoiced_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ @@ -8588,6 +8599,7 @@ void gaus_L2_dec( Word16 *seed_acelp /*i/o : random seed Q0 */ ); +#ifndef REMOVE_EVS_DUPLICATES3 // dec_gen_voic_fx.c ivas_error decod_gen_voic_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -8604,7 +8616,7 @@ ivas_error decod_gen_voic_fx( Word16 *unbits, /* number of unused bits */ Word16 *gain_buf /*Q14*/ ); - +#endif ivas_error decod_gen_voic_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 L_frame, /* i : length of the frame */ diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index 0686996f3..ae222b3ca 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -511,6 +511,9 @@ void FEC_exc_estim_fx( /* st_fx->L_frame / L_SUBFR */ tmp = shr( st_fx->L_frame, 6 ); /* Replication of the last spectrum, with a slight downscaling of its dynamic */ +#ifdef REMOVE_EVS_DUPLICATES + gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); +#else IF( st_fx->element_mode == EVS_MONO ) { gsc_dec_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, st_fx->Q_exc ); @@ -519,6 +522,7 @@ void FEC_exc_estim_fx( { gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); } +#endif *tmp_noise = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ move16(); /* Transform back to time domain */ diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index f6439b166..714a60166 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -50,6 +50,7 @@ /* _ None */ /*========================================================================*/ +#ifndef REMOVE_EVS_DUPLICATES void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ @@ -614,7 +615,7 @@ void FEC_scale_syn_fx( return; } - +#endif void FEC_scale_syn_ivas_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index f347cdb7e..6bdf57083 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -128,7 +128,13 @@ ivas_error acelp_core_switch_dec_fx( /*----------------------------------------------------------------* * Excitation decoding *----------------------------------------------------------------*/ + +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); +#else config_acelp1( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); +#endif + decod_gen_voic_core_switch_fx( st_fx, L_frame_for_cs, 0, Aq, exc, cbrate, &st_fx->Q_exc ); /*----------------------------------------------------------------* diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index 8a2ef7b40..8881b26ba 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -631,9 +631,15 @@ ivas_error amr_wb_dec_fx( move16(); } +#ifdef REMOVE_EVS_DUPLICATES + FEC_scale_syn_ivas_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, + &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); +#else FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); +#endif frame_ener_fx( L_FRAME, st_fx->clas_dec, syn_fx, pitch_buf_tmp[3], &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); } @@ -712,10 +718,17 @@ ivas_error amr_wb_dec_fx( * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ +#ifdef REMOVE_EVS_DUPLICATES + FEC_scale_syn_ivas_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, + MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, + st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, + st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, 0, 0 ); +#else FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, 0, 0 ); +#endif /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ frame_ener_fx( L_FRAME, st_fx->last_good, syn_fx, shr( FEC_pitch_fx, 6 ), &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); @@ -772,7 +785,11 @@ ivas_error amr_wb_dec_fx( st_fx->hPFstat->on = 1; move16(); test(); +#ifdef REMOVE_EVS_DUPLICATES + formant_post_filt_ivas_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, sub( amr_io_class, AUDIO_CLAS ) == 0 ); +#else formant_post_filt_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, sub( amr_io_class, AUDIO_CLAS ) == 0 ); +#endif } /*----------------------------------------------------------------* diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index 3590dae71..3f6a97b98 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -26,6 +26,7 @@ static void shb_CNG_decod_ivas_fx( Decoder_State *st_fx, const Word16 *synth_fx, * Decode residual signal energy *-----------------------------------------------------------------*/ +#ifndef REMOVE_EVS_DUPLICATES void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ const Word16 last_element_mode, /* i : last element mode Q0 */ @@ -696,7 +697,7 @@ void CNG_dec_fx( return; } - +#endif void CNG_dec_ivas_fx( Decoder_State *st_fx, /* i/o: State structure */ const Word16 last_element_mode, /* i : last element mode Q0 */ diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index e327d4cfb..cb7556b24 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -681,9 +681,15 @@ void decoder_acelp_fx( move16(); } +#ifdef REMOVE_EVS_DUPLICATES + FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, syn, pBuf_scaleSyn, st->enr_old_fx, 0, + st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, force_scale_syn ); +#else FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, syn, pBuf_scaleSyn, st->enr_old_fx, 0, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, force_scale_syn ); +#endif } /* update ACELP synthesis memory */ Copy( mem_syn, st->mem_syn2_fx, M ); diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 8ee335e3f..c369c4865 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -36,6 +36,7 @@ /* _ None */ /*======================================================================*/ +#ifndef REMOVE_EVS_DUPLICATES ivas_error decod_gen_voic_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 L_frame, /* i : length of the frame */ @@ -503,7 +504,7 @@ ivas_error decod_gen_voic_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================*/ - +#endif ivas_error decod_gen_voic_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 L_frame, /* i : length of the frame */ diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index 4e18eebce..bc12fd306 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -29,6 +29,8 @@ /* RETURN ARGUMENTS : */ /* _ None */ /*==========================================================================*/ + +#ifndef REMOVE_EVS_DUPLICATES void dec_pit_exc_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ @@ -456,6 +458,7 @@ void dec_pit_exc_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*==========================================================================*/ +#endif void dec_pit_exc_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index 6a15732a0..e98858996 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -25,6 +25,7 @@ static void gain_dec_gacelp_uv_fx( * Decode unvoiced (UC) frames *-------------------------------------------------------------------*/ +#ifndef REMOVE_EVS_DUPLICATES void decod_unvoiced_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ @@ -112,7 +113,7 @@ void decod_unvoiced_fx( * * Decode unvoiced (UC) frames *-------------------------------------------------------------------*/ - +#endif void decod_unvoiced_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 2f0873ba5..ada1a68de 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -346,7 +346,7 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES2aa IF( ( error = acelp_core_dec_ivas_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) #else IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index a3c9b5826..b17113495 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -572,6 +572,8 @@ void deleteFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec ) Returns: error */ + +#ifndef REMOVE_EVS_DUPLICATES Word16 ApplyFdCng_fx( Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ Word16 Q, @@ -1160,7 +1162,7 @@ Word16 ApplyFdCng_fx( return 0; } - +#endif Word16 ApplyFdCng_ivas_fx( Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ Word16 Q, diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index 72e07e57f..622fe6a26 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -31,6 +31,8 @@ /* RETURN ARGUMENTS : */ /* _ None */ /*==========================================================================*/ + +#ifndef REMOVE_EVS_DUPLICATES void decod_audio_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ @@ -96,12 +98,18 @@ void decod_audio_fx( st_fx->GSC_noisy_speech = 0; /* Q0 */ move16(); } + /* set bit-allocation */ #ifdef ADD_LRTD config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#else +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); #else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); #endif +#endif + /*---------------------------------------------------------------* * Decode energy dynamics *---------------------------------------------------------------*/ @@ -529,6 +537,7 @@ void decod_audio_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*==========================================================================*/ +#endif void decod_audio_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ @@ -600,12 +609,14 @@ void decod_audio_ivas_fx( st_fx->GSC_noisy_speech = 0; move16(); } + /* set bit-allocation */ -#if 1 // def ADD_LRTD +#if 1 // def ADD_LRTD or def REMOVE_EVS_DUPLICATES config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); #else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); #endif + /*---------------------------------------------------------------* * Decode energy dynamics *---------------------------------------------------------------*/ @@ -825,7 +836,7 @@ void decod_audio_ivas_fx( Es_pred_dec_fx( &Es_pred, indice, nbits, 0 ); } -#if 1 // def ADD_LRTD +#if 1 // def ADD_LRTD or def REMOVE_EVS_DUPLICATES dec_pit_exc_ivas_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); #else dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); @@ -1077,6 +1088,8 @@ void decod_audio_ivas_fx( /* RETURN ARGUMENTS : */ /* _None */ /*==========================================================================*/ + +#ifndef REMOVE_EVS_DUPLICATES void gsc_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ @@ -1404,6 +1417,7 @@ void gsc_dec_fx( /* RETURN ARGUMENTS : */ /* _None */ /*==========================================================================*/ +#endif void gsc_dec_ivas_fx( Decoder_State *st_fx, /* i/o: State structure */ Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index 50b5ec341..40628a5bb 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -100,6 +100,7 @@ static void dqlsf_CNG_fx( /* _ None */ /*===========================================================================*/ +#ifndef REMOVE_EVS_DUPLICATES void lsf_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ const Word16 tc_subfr, /* i : TC subframe index Q0*/ @@ -353,7 +354,7 @@ void lsf_dec_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*===========================================================================*/ - +#endif void lsf_dec_ivas_fx( Decoder_State *st_fx, /* i/o: State structure */ const Word16 tc_subfr, /* i : TC subframe index Q0*/ diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index 6449367c8..97254972d 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -401,10 +401,17 @@ ivas_error acelp_core_enc_fx( test(); IF( !nelp_mode && !ppp_mode ) { +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, + st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, + st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + +#else config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#endif } /*-----------------------------------------------------------------* @@ -537,9 +544,15 @@ ivas_error acelp_core_enc_fx( { tc_classif_enc_fx( Q_new, st_fx->L_frame, &tc_subfr_fx, &position, attack_flag, st_fx->pitch[0], res_fx ); +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, + tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#else config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#endif } /*---------------------------------------------------------------* @@ -604,9 +617,15 @@ ivas_error acelp_core_enc_fx( lsp_mid_bck_fx, mCb1_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen_fx ); /* Configure ACELP bit allocation */ +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, + st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#else config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); +#endif /* redo LSF quantization */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL @@ -1267,7 +1286,9 @@ ivas_error acelp_core_enc_ivas_fx( test(); IF( !nelp_mode && !ppp_mode ) { - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, + st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, + st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*-----------------------------------------------------------------* @@ -1404,7 +1425,9 @@ ivas_error acelp_core_enc_ivas_fx( { tc_classif_enc_fx( Q_new, st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res_fx ); - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, + -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, + st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*---------------------------------------------------------------* @@ -1461,6 +1484,7 @@ ivas_error acelp_core_enc_ivas_fx( { /* restore memories of LSF quantizer and synthesis filter */ lsf_syn_mem_restore_ivas_fx( st, tilt_code_bck_fx, gc_threshold_bck_fx, clip_var_bck_fx, next_force_sf_bck, lsp_new, lsp_mid, clip_var_fx, mem_AR_fx, mem_MA_fx, lsp_new_bck_fx, lsp_mid_bck_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen ); + /* Configure ACELP bit allocation */ config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index d521d85a2..70a84c198 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -148,8 +148,14 @@ void acelp_core_switch_enc_fx( /*----------------------------------------------------------------* * Excitation encoding *----------------------------------------------------------------*/ + +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, + GENERIC, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); +#else config_acelp1( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); +#endif encod_gen_voic_core_switch_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 02372138d..adb529ca6 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -213,10 +213,16 @@ void transition_enc_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { /* this is called only to compute unused bits */ +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, + st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#else config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#endif } *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, sub( shift_wsp, 1 ) ); move16(); @@ -325,10 +331,17 @@ void transition_enc_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, + unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#else config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#endif } + /*-----------------------------------------------------------------* * get number of bits for pitch encoding *-----------------------------------------------------------------*/ @@ -1033,11 +1046,18 @@ void transition_enc_ivas_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { +#ifdef REMOVE_EVS_DUPLICATES + /* this is called only to compute unused bits */ + config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, + st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#else /* this is called only to compute unused bits */ config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#endif } *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, sub( shift_wsp, 1 ) ); move16(); @@ -1146,10 +1166,17 @@ void transition_enc_ivas_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { +#ifdef REMOVE_EVS_DUPLICATES + config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, + unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#else config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#endif } + /*-----------------------------------------------------------------* * get number of bits for pitch encoding *-----------------------------------------------------------------*/ -- GitLab From b45ca67f12f69b4f452fa9facf50911748af6f74 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 12:00:06 +0100 Subject: [PATCH 0016/1310] fix build --- lib_com/bits_alloc_fx.c | 3 ++- lib_com/prot_fx.h | 3 ++- lib_dec/acelp_core_switch_dec_fx.c | 6 +++++- lib_dec/dec_amr_wb_fx.c | 5 +++++ lib_dec/dec_gen_voic_fx.c | 3 ++- lib_dec/dec_uv_fx.c | 11 ++++++++++- lib_dec/pit_dec_fx.c | 4 ++-- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index 53c5ca474..1d8a90048 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -439,6 +439,7 @@ static Word16 fcb_table( * Routine to allocate fixed innovation codebook bit-budget *--------------------------------------------------------------------*/ +#ifndef REMOVE_EVS_DUPLICATES static ivas_error acelp_FCB_allocator( Word16 *nBits, /* i/o: available bit-budget */ Word16 fixed_cdk_index[], /* o : codebook index Q0 */ @@ -599,7 +600,7 @@ static ivas_error acelp_FCB_allocator( return error; } - +#endif static ivas_error acelp_FCB_allocator_ivas( Word16 *nBits, /* i/o: available bit-budget */ Word16 fixed_cdk_index[], /* o : codebook index Q0 */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index f80814a0e..34b72e544 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -7166,6 +7166,7 @@ void Mode2_delta_pit_dec( Word16 **pt_indice /* i/o: pointer to Vector of Q indexes */ ); +#ifndef REMOVE_EVS_DUPLICATES3 Word16 pit_decode_fx( /* o : floating pitch value */ Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ @@ -7185,7 +7186,7 @@ Word16 pit_decode_fx( /* o : floating pitch value const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ #endif ); - +#endif Word16 pit_decode_ivas_fx( /* o : floating pitch value */ Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 6bdf57083..36bac44ec 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -825,7 +825,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( #ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) #else - Copy_Scale_sig_16_32_DEPREC( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) + Copy_Scale_sig_16_32_DEPREC( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) #endif IF( NE_32( ( error = cldfb_save_memory_ivas_fx( st_fx->cldfbAna ) ), IVAS_ERR_OK ) ) { @@ -919,7 +919,11 @@ static void decod_gen_voic_core_switch_fx( * Decode pitch lag *----------------------------------------------------------------------*/ +#ifdef REMOVE_EVS_DUPLICATES3 + pitch = pit_decode_ivas_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ +#else pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ +#endif /*--------------------------------------------------------------* * Find the adaptive codebook vector. diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index baea98a2c..8a980f68d 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -71,12 +71,17 @@ void decod_amr_wb_fx( * Decode pitch lag *----------------------------------------------------------------------*/ +#ifdef REMOVE_EVS_DUPLICATES + *pt_pitch_fx = pit_decode_ivas_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); +#else *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR #ifdef ADD_LRTD , 0, NULL #endif ); +#endif + /*--------------------------------------------------------------* * Find the adaptive codebook vector *--------------------------------------------------------------*/ diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index c369c4865..bcbef190f 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -677,6 +677,7 @@ ivas_error decod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { + // VE: function to be merged? gain_dec_lbr_ivas_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) @@ -801,7 +802,7 @@ ivas_error decod_gen_voic_ivas_fx( { idx = idiv1616( i_subfr_fx, L_SUBFR ); } - + // VE: function to be merged prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index e98858996..6a9fbcf3f 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -208,7 +208,16 @@ void decod_unvoiced_ivas_fx( move16(); /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); + } + ELSE +#endif + { + lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); + } /*-------------------------------------------------------* * - Find the total excitation. * diff --git a/lib_dec/pit_dec_fx.c b/lib_dec/pit_dec_fx.c index b72c2bae1..6c37bb906 100644 --- a/lib_dec/pit_dec_fx.c +++ b/lib_dec/pit_dec_fx.c @@ -319,7 +319,7 @@ void Mode2_delta_pit_dec( /* _ (Word16 ) pitch : close loop integer pitch Q6 */ /*=======================================================================*/ - +#ifndef REMOVE_EVS_DUPLICATES3 Word16 pit_decode_fx( /* o : floating pitch value */ Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ @@ -599,7 +599,7 @@ Word16 pit_decode_fx( /* o : floating pitch value /* _ (Word16 ) pitch : close loop integer pitch Q6 */ /*=======================================================================*/ - +#endif Word16 pit_decode_ivas_fx( /* o : floating pitch value */ Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ -- GitLab From 4bc1b7981ad272a770c662102f661f5f7adf6837 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 12:51:07 +0100 Subject: [PATCH 0017/1310] REMOVE_EVS_DUPLICATES3 --- lib_com/options.h | 2 +- lib_com/prot_fx.h | 3 ++- lib_dec/acelp_core_dec_ivas_fx.c | 2 +- lib_dec/acelp_core_switch_dec_fx.c | 2 +- lib_dec/dec_post_fx.c | 10 +++++++--- lib_dec/decision_matrix_dec_fx.c | 2 +- lib_dec/evs_dec_fx.c | 2 +- lib_dec/post_dec_fx.c | 16 ++++++++++++++++ 8 files changed, 30 insertions(+), 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f45ee973d..b30960266 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,5 +156,5 @@ #define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions */ -#define REMOVE_EVS_DUPLICATES2 +#define REMOVE_EVS_DUPLICATES3 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 34b72e544..8c823e1f1 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -6639,6 +6639,7 @@ void nb_post_filt_fx( const Word16 disable_hpf /* i : flag to diabled HPF */ ); +#ifndef REMOVE_EVS_DUPLICATES void formant_post_filt_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ @@ -6649,7 +6650,7 @@ void formant_post_filt_fx( Word32 rate, /* (i) : bit-rate */ const Word16 off_flag /* i : off flag */ ); - +#endif void formant_post_filt_ivas_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 09d370760..7c9e50b85 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -2371,7 +2371,7 @@ ivas_error acelp_core_dec_ivas_fx( ELSE { hf_synth_reset_fx( st->hBWE_zero ); -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but conditon is here to keep EVS bit-exact #endif { diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 36bac44ec..7a6348905 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -920,7 +920,7 @@ static void decod_gen_voic_core_switch_fx( *----------------------------------------------------------------------*/ #ifdef REMOVE_EVS_DUPLICATES3 - pitch = pit_decode_ivas_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ + pitch = pit_decode_ivas_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*Q6*/ #else pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ #endif diff --git a/lib_dec/dec_post_fx.c b/lib_dec/dec_post_fx.c index a6e06db54..df3fb1f8f 100644 --- a/lib_dec/dec_post_fx.c +++ b/lib_dec/dec_post_fx.c @@ -33,8 +33,9 @@ static void calc_st_filt_local_fx( Word16 *apond2, Word16 *apond1, Word16 *parco static void modify_pst_param_fx( const Word16 lp_noise, Word16 *g1, Word16 *g2, const Word16 coder_type, Word16 *gain_factor ); +#ifndef REMOVE_EVS_DUPLICATES static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); - +#endif static void Dec_formant_postfilt_ivas_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); static void calc_st_filt_ivas_fx( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero, const Word16 extl ); @@ -255,6 +256,8 @@ static void Dec_postfilt_fx( * * Main routine to perform formant post filtering *--------------------------------------------------------------------------*/ + +#ifndef REMOVE_EVS_DUPLICATES void formant_post_filt_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ @@ -379,7 +382,7 @@ void formant_post_filt_fx( p_Aq += ( M + 1 ); } } - +#endif void formant_post_filt_ivas_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ @@ -519,6 +522,7 @@ void formant_post_filt_ivas_fx( * k1 = 1st parcor calculated on {hi} * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 *----------------------------------------------------------------------------*/ +#ifndef REMOVE_EVS_DUPLICATES static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ @@ -597,7 +601,7 @@ static void Dec_formant_postfilt_fx( return; } - +#endif static void Dec_formant_postfilt_ivas_fx( PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ diff --git a/lib_dec/decision_matrix_dec_fx.c b/lib_dec/decision_matrix_dec_fx.c index ff03f8bc5..8433960b2 100644 --- a/lib_dec/decision_matrix_dec_fx.c +++ b/lib_dec/decision_matrix_dec_fx.c @@ -713,7 +713,7 @@ void decision_matrix_dec_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES /*-----------------------------------------------------------------* * set inactive coder_type flag in ACELP core *-----------------------------------------------------------------*/ diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index ada1a68de..1a7338315 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -346,7 +346,7 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ -#ifdef REMOVE_EVS_DUPLICATES2aa +#ifdef REMOVE_EVS_DUPLICATES IF( ( error = acelp_core_dec_ivas_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) #else IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/post_dec_fx.c b/lib_dec/post_dec_fx.c index d581f810a..b5d56d8fb 100644 --- a/lib_dec/post_dec_fx.c +++ b/lib_dec/post_dec_fx.c @@ -139,13 +139,21 @@ void post_decoder( { st->hPFstat->on = 1; move16(); +#ifdef REMOVE_EVS_DUPLICATES + formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); +#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); +#endif } ELSE { st->hPFstat->on = 0; move16(); +#ifdef REMOVE_EVS_DUPLICATES + formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); +#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); +#endif } } @@ -302,13 +310,21 @@ void post_decoder_ivas_fx( { st->hPFstat->on = 1; move16(); +#ifdef REMOVE_EVS_DUPLICATES + formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); +#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); +#endif } ELSE { st->hPFstat->on = 0; move16(); +#ifdef REMOVE_EVS_DUPLICATES + formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); +#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); +#endif } } -- GitLab From e4e68a27ef3d8305598a922e2fd8e7916282b9dc Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 15:29:00 +0100 Subject: [PATCH 0018/1310] fix old_syn_12k8_16k_fx[] --- lib_dec/acelp_core_dec_ivas_fx.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 7c9e50b85..e7b1032a2 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -849,7 +849,16 @@ ivas_error acelp_core_dec_ivas_fx( Copy_Scale_sig( syn1_fx, temp_buf_fx, st->L_frame, sub( -1, st->Q_syn ) ); // Q_syn IF( st->hBWE_FD != NULL ) { - save_old_syn_fx( st->L_frame, syn1_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - this is likely a bug in IVAS + { + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); + } + ELSE +#endif + { + save_old_syn_fx( st->L_frame, syn1_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); + } } } -- GitLab From 9ad83d1c7250046e9403523c67c33ac488bcafc5 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 12 Feb 2025 17:09:53 +0100 Subject: [PATCH 0019/1310] REMOVE_EVS_DUPLICATES2 --- lib_com/options.h | 4 +- lib_com/prot_fx.h | 32 +++++++++------ lib_com/swb_tbe_com_fx.c | 3 +- lib_dec/acelp_core_dec_fx.c | 12 +++--- lib_dec/acelp_core_dec_ivas_fx.c | 11 +++-- lib_dec/acelp_core_switch_dec_fx.c | 2 +- lib_dec/dec_LPD_fx.c | 5 +++ lib_dec/dec_ace_fx.c | 5 +++ lib_dec/dec_gen_voic_fx.c | 3 +- lib_dec/dec_tran_fx.c | 8 ++++ lib_dec/gain_dec_fx.c | 4 +- lib_dec/init_dec_fx.c | 1 - lib_dec/pit_dec_fx.c | 2 +- lib_enc/analy_lp_fx.c | 65 +++++++++++++++++++----------- lib_enc/cod_ace_fx.c | 6 +++ lib_enc/enc_gen_voic_fx.c | 7 ++++ lib_enc/enc_tran_fx.c | 5 +++ lib_enc/init_enc_fx.c | 1 - lib_enc/ivas_core_pre_proc.c | 9 +++++ lib_enc/ivas_core_pre_proc_front.c | 4 ++ lib_enc/ivas_front_vad.c | 5 +++ lib_enc/pre_proc_fx.c | 10 ++++- lib_enc/prot_fx_enc.h | 31 ++++++++------ 23 files changed, 163 insertions(+), 72 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b30960266..dd2eef974 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,6 +155,6 @@ #define FIX_MINOR_SVD_WMOPS_MR1010X /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */ #define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ -#define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions */ -#define REMOVE_EVS_DUPLICATES3 +#define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ +#define REMOVE_EVS_DUPLICATES2 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 8c823e1f1..c90b7551a 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3220,6 +3220,7 @@ void synthesise_fb_high_band_fx( Word16 bpf_memory_Q[], Word16 Qout ); +#ifndef REMOVE_EVS_DUPLICATES2 void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ #ifdef ADD_IVAS_TBE_CODE @@ -3247,6 +3248,7 @@ void prep_tbe_exc_fx( const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ #endif ); +#endif void prep_tbe_exc_ivas_fx( const Word16 L_frame_fx, /* i : length of the frame */ @@ -4776,7 +4778,7 @@ Word16 BITS_ALLOC_config_acelp( const Word16 narrowband, const Word16 nb_subfr ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES ivas_error config_acelp1( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ @@ -5763,7 +5765,7 @@ void tcx_ltp_post32( Word32 *tcx_buf, /* sig_q */ Word16 sig_q ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // gs_inact_switching_fx.c void Inac_swtch_ematch_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ @@ -6038,7 +6040,7 @@ void td_bwe_dec_init_fx( const Word32 output_Fs /* i : output sampling rate */ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // lsf_dec_fx.c void lsf_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ @@ -6208,7 +6210,7 @@ void lsf_mid_dec_fx( Word16 lsp_mid[] /* o : quantized LSPs Q15*/ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // cng_dec_fx.c void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ @@ -6825,7 +6827,7 @@ void PulseResynchronization_fx( Word32 /*float*/ const pitchEnd /*i Q16*/ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // gs_dec_fx.c void decod_audio_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -6859,7 +6861,7 @@ void decod_audio_ivas_fx( const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6*/ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES void gsc_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ @@ -6940,6 +6942,7 @@ void gain_dec_mless_fx( Word32 *norm_gain_code_fx /* o : norm. gain of the codebook excitation Q16*/ ); +#ifndef REMOVE_EVS_DUPLICATES void gain_dec_lbr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ @@ -6954,6 +6957,7 @@ void gain_dec_lbr_fx( , const Word16 L_subfr /* i : subfr lenght */ ); +#endif void gain_dec_lbr_ivas_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ @@ -7088,7 +7092,7 @@ void re8_PPV_fx( Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0 */ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // dec_pit_exc_fx.c void dec_pit_exc_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -7167,7 +7171,7 @@ void Mode2_delta_pit_dec( Word16 **pt_indice /* i/o: pointer to Vector of Q indexes */ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES Word16 pit_decode_fx( /* o : floating pitch value */ Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ @@ -7549,7 +7553,7 @@ void configureFdCngDec_fx( const Word16 Last_L_frame, const Word16 element_mode ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES /* Apply the CLDFB-based CNG */ Word16 ApplyFdCng_fx( Word16 *timeDomainInput, /* i : pointer to time domain i */ @@ -8196,7 +8200,7 @@ void FEC_pitch_estim_fx( Word16 element_mode /* i : element mode */ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // FEC_scale_sync_fx.c void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ @@ -8544,7 +8548,7 @@ Word16 FEC_synchro_exc_fx( /* o : do_WI flag const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // dec_uv_fx.c void decod_unvoiced_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -8601,7 +8605,7 @@ void gaus_L2_dec( Word16 *seed_acelp /*i/o : random seed Q0 */ ); -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES // dec_gen_voic_fx.c ivas_error decod_gen_voic_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ @@ -9565,6 +9569,8 @@ void d_gain_pred_fx( Word16 *Es_pred, /* o : predicited scaled innovation energy */ Word16 **pt_indice /* i/o: pointer to the buffer of indices */ ); + +#ifndef REMOVE_EVS_DUPLICATES // acelp_core_dec_fx.c ivas_error acelp_core_dec_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ @@ -9590,7 +9596,7 @@ ivas_error acelp_core_dec_fx( STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ const Word16 read_sid_info /* i : read SID info flag */ ); - +#endif // evs_dec_fx.c ivas_error evs_dec_fx( Decoder_State *st_fx, /* i/o : Decoder state structure */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 92271c1f1..c7a8fd1f0 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7131,6 +7131,7 @@ void tbe_celp_exc( /* _ None */ /*======================================================================================*/ +#ifndef REMOVE_EVS_DUPLICATES2 void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ #ifdef ADD_IVAS_TBE_CODE @@ -7299,7 +7300,7 @@ void prep_tbe_exc_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================================*/ - +#endif void prep_tbe_exc_ivas_fx( const Word16 L_frame_fx, /* i : length of the frame */ #if 1 // def ADD_IVAS_TBE_CODE diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index fc35cb754..e81ae0428 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -10,6 +10,8 @@ #include "ivas_prot_fx.h" #include "ivas_cnst.h" /* Common constants */ #include "cnst.h" /* Common constants */ + +#ifndef REMOVE_EVS_DUPLICATES /*==========================================================================*/ /* FUNCTION : void acelp_core_dec_fx () */ /*--------------------------------------------------------------------------*/ @@ -661,7 +663,7 @@ ivas_error acelp_core_dec_fx( test(); IF( EQ_32( st_fx->core_brate, SID_2k40 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { - FdCng_decodeSID_fx( st_fx->hFdCngDec->hFdCngCom, st_fx ); // VE: 2 variants needed + FdCng_decodeSID_fx( st_fx->hFdCngDec->hFdCngCom, st_fx ); *sid_bw = 0; move16(); } @@ -691,7 +693,7 @@ ivas_error acelp_core_dec_fx( } } #endif - generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); // VE: 2 variants needed + generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); FdCng_exc( st_fx->hFdCngDec->hFdCngCom, &st_fx->CNG_mode, st_fx->L_frame, st_fx->lsp_old_fx, st_fx->first_CNG, st_fx->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); @@ -715,7 +717,6 @@ ivas_error acelp_core_dec_fx( #ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - // VE: TBV: 'st_fx->L_frame * HIBND_ACB_L_FAC' should be corrected Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); } @@ -754,7 +755,7 @@ ivas_error acelp_core_dec_fx( FOR( i = 0; i < DCT_L_POST; i++ ) { /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); // VE: 2 variants needed + hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); move16(); } } @@ -2054,7 +2055,7 @@ ivas_error acelp_core_dec_fx( { hf_synth_reset_fx( st_fx->hBWE_zero ); #ifdef MSAN_FIX - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but conditon is here to keep EVS bit-exact + IF( NE_16( st_fx->element_mode, EVS_MONO ) ) { set16_fx( st_fx->hBWE_zero->mem_hp400_fx, 0, 6 ); } @@ -2132,3 +2133,4 @@ ivas_error acelp_core_dec_fx( return IVAS_ERR_OK; } +#endif diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index e7b1032a2..fcfbe1e66 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -761,7 +761,7 @@ ivas_error acelp_core_dec_ivas_fx( #ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { - // VE: TBV: 'st_fx->L_frame * HIBND_ACB_L_FAC' should be corrected + // VE: TBV: should 'st_fx->L_frame * HIBND_ACB_L_FAC' be corrected in EVS? Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, st->L_frame * HIBND_ACB_L_FAC, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); } @@ -1223,7 +1223,7 @@ ivas_error acelp_core_dec_ivas_fx( #ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { - // VE: TBV: this is a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' + // VE: TBV: this is likely a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_coder_type, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); } @@ -1760,7 +1760,7 @@ ivas_error acelp_core_dec_ivas_fx( #ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { - // VE:TBC - in FLP, it is: + // VE: TBV - is it correct in EVS? in FLP, it is: // v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, temp_buf, st->L_frame / 2 ); // v_add( temp_buf, syn, syn, st->L_frame / 2 ); FOR( i = 0; i < st->L_frame / 2; i++ ) @@ -2381,7 +2381,7 @@ ivas_error acelp_core_dec_ivas_fx( { hf_synth_reset_fx( st->hBWE_zero ); #ifdef REMOVE_EVS_DUPLICATES - IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but conditon is here to keep EVS bit-exact + IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but condition is here to keep EVS bit-exact for the moment #endif { #ifdef MSAN_FIX @@ -2425,8 +2425,7 @@ ivas_error acelp_core_dec_ivas_fx( #ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { - non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, - st->coder_type, voice_factors_fx, st->L_frame ); + non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); } ELSE #endif diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 7a6348905..81beffb34 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -919,7 +919,7 @@ static void decod_gen_voic_core_switch_fx( * Decode pitch lag *----------------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES3 +#ifdef REMOVE_EVS_DUPLICATES pitch = pit_decode_ivas_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*Q6*/ #else pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index f3443349a..c722418f7 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -555,7 +555,12 @@ void decoder_LPD_fx( st->relax_prev_lsf_interp = 2; move16(); } + +#ifdef REMOVE_EVS_DUPLICATES2 + int_lsp4_ivas_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); +#else int_lsp4_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); +#endif } ELSE { diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index cb7556b24..5d644c289 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -532,6 +532,10 @@ void decoder_acelp_fx( move16(); IF( st->igf != 0 ) { +#ifdef REMOVE_EVS_DUPLICATES2 + prep_tbe_exc_ivas_fx( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, + gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); +#else prep_tbe_exc_fx( st->L_frame, #ifdef ADD_IVAS_TBE_CODE L_SUBFR, @@ -543,6 +547,7 @@ void decoder_acelp_fx( st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 #endif ); +#endif } /*---------------------------------------------------------* diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index bcbef190f..c369c4865 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -677,7 +677,6 @@ ivas_error decod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { - // VE: function to be merged? gain_dec_lbr_ivas_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) @@ -802,7 +801,7 @@ ivas_error decod_gen_voic_ivas_fx( { idx = idiv1616( i_subfr_fx, L_SUBFR ); } - // VE: function to be merged + prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index e886fd337..96eace777 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -253,9 +253,17 @@ void decod_tran_fx( { tmp_idx_2 = idiv1616( i_subfr, L_SUBFR ); } + +#ifdef REMOVE_EVS_DUPLICATES2 + prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, + st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); +#else prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); +#endif /*----------------------------------------------------------------* * Excitation enhancements (update of total excitation signal) diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index 5e1712231..00eca187d 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -601,6 +601,8 @@ void gain_dec_mless_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*==================================================================================*/ + +#ifndef REMOVE_EVS_DUPLICATES void gain_dec_lbr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ @@ -969,7 +971,7 @@ void gain_dec_lbr_fx( return; } - +#endif void gain_dec_lbr_ivas_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index d709ff5fc..8aa4f45e1 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -483,7 +483,6 @@ ivas_error init_decoder_fx( } /* TCX core */ - // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( ( st_fx->hTcxDec = (TCX_DEC_HANDLE) malloc( sizeof( TCX_DEC_DATA ) ) ) == NULL ) diff --git a/lib_dec/pit_dec_fx.c b/lib_dec/pit_dec_fx.c index 6c37bb906..b7f0abec3 100644 --- a/lib_dec/pit_dec_fx.c +++ b/lib_dec/pit_dec_fx.c @@ -319,7 +319,7 @@ void Mode2_delta_pit_dec( /* _ (Word16 ) pitch : close loop integer pitch Q6 */ /*=======================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES3 +#ifndef REMOVE_EVS_DUPLICATES Word16 pit_decode_fx( /* o : floating pitch value */ Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ diff --git a/lib_enc/analy_lp_fx.c b/lib_enc/analy_lp_fx.c index c2f9d0585..b5764ec43 100644 --- a/lib_enc/analy_lp_fx.c +++ b/lib_enc/analy_lp_fx.c @@ -24,19 +24,22 @@ * - update LSPs for the next frame *-------------------------------------------------------------------*/ void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ - Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ + Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ +#ifdef REMOVE_EVS_DUPLICATES2 + const Word16 element_mode, /* i : element mode */ +#endif const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ Word16 Q_new, /*i: stores Q for speech*/ Word16 *Q_r /*stores q for ener*/ ) @@ -74,19 +77,24 @@ void analy_lp_ivas_fx( /* Autocorrelations */ autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); - /*if ( r[0] < 100.0f && no_thr == 0 )*/ - /*r[0] = 100.0f*/ - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_Comp( r_h[0], r_l[0] ) /* Q_r[1 - i_subfr]*/, sub( 31, add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ) ), 100 /*q0*/, 31 ), -1 ) ) +#ifdef REMOVE_EVS_DUPLICATES2 + IF( NE_16( element_mode, EVS_MONO ) ) +#endif { - /*Q_min stores min of 24 and the actual Q for r*/ - Word16 Q_min = s_min( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), 24 ); /* comparing q with 24 because exponent of 100 is 7 so max q should be 24*/ - L_Extract( L_shl( 100, Q_min ), &r_h[0], &r_l[0] ); /*extracting high and low components of r[0]*/ - FOR( i = 1; i < 17; i++ ) + /*if ( r[0] < 100.0f && no_thr == 0 )*/ + /*r[0] = 100.0f*/ + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_Comp( r_h[0], r_l[0] ) /* Q_r[1 - i_subfr]*/, sub( 31, add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ) ), 100 /*q0*/, 31 ), -1 ) ) { - L_Extract( L_shr( L_Comp( r_h[i], r_l[i] ), sub( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), Q_min ) ), &r_h[i], &r_l[i] ); /*scaling all the values to q24*/ + /*Q_min stores min of 24 and the actual Q for r*/ + Word16 Q_min = s_min( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), 24 ); /* comparing q with 24 because exponent of 100 is 7 so max q should be 24*/ + L_Extract( L_shl( 100, Q_min ), &r_h[0], &r_l[0] ); /*extracting high and low components of r[0]*/ + FOR( i = 1; i < 17; i++ ) + { + L_Extract( L_shr( L_Comp( r_h[i], r_l[i] ), sub( add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ), Q_min ) ), &r_h[i], &r_l[i] ); /*scaling all the values to q24*/ + } + Q_r[1 - i_subfr] = sub( Q_min, shl( Q_new, 1 ) ); /*updating the q (subtracting shl( Q_new, 1 ) as in later part it is being added-> to maintain q24 )*/ + move16(); } - Q_r[1 - i_subfr] = sub( Q_min, shl( Q_new, 1 ) ); /*updating the q (subtracting shl( Q_new, 1 ) as in later part it is being added-> to maintain q24 )*/ - move16(); } /* Lag windowing */ @@ -124,6 +132,7 @@ void analy_lp_ivas_fx( return; } +#ifndef REMOVE_EVS_DUPLICATES2 void analy_lp_fx( const Word16 speech[], /* i : pointer to the speech frame Q_new*/ const Word16 L_frame, /* i : length of the frame Q0*/ @@ -195,12 +204,20 @@ void analy_lp_fx( IF( EQ_16( sec_chan_low_rate, 1 ) ) { /* LSP interpolation */ +#ifdef REMOVE_EVS_DUPLICATES2 + int_lsp4_ivas_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); +#else int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); +#endif } ELSE { /* LSP interpolation */ +#ifdef REMOVE_EVS_DUPLICATES2 + int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); +#else int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); +#endif } Copy( lsp_new, lsp_old, M ); /* Q15 */ *ener = L_Comp( epsP_h[M], epsP_l[M] ); /* Q_r */ @@ -208,7 +225,7 @@ void analy_lp_fx( return; } - +#endif /*-------------------------------------------------------------------* * analy_lp_AMR_WB() diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index e701b8e46..aa823cbda 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -409,8 +409,14 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * IF( st->igf != 0 ) { +#ifdef REMOVE_EVS_DUPLICATES2 + prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate, + st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); +#else prep_tbe_exc_fx( L_frame, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate ); +#endif } /*---------------------------------------------------------* diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 6f71b8ba1..39cdba524 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -368,9 +368,16 @@ void encod_gen_voic_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ +#ifdef REMOVE_EVS_DUPLICATES2 + prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, + T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); +#else prep_tbe_exc_fx( L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate ); +#endif /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index b4495d4ff..66167c138 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -309,8 +309,13 @@ Word16 encod_tran_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ +#ifdef REMOVE_EVS_DUPLICATES2 + prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); +#else prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); +#endif /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 89bbdc898..be2355f08 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -760,7 +760,6 @@ ivas_error init_encoder_fx( * TCX core *-----------------------------------------------------------------*/ - // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 test(); IF( idchan == 0 || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c index 541cc620c..bce78a8ee 100644 --- a/lib_enc/ivas_core_pre_proc.c +++ b/lib_enc/ivas_core_pre_proc.c @@ -1134,11 +1134,20 @@ ivas_error ivas_compute_core_buffers_fx( IF( Q_new ) { +#ifdef REMOVE_EVS_DUPLICATES2 + analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, sub( *Q_new, 1 ), Q_r ); +#else analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, sub( *Q_new, 1 ), Q_r ); +#endif } ELSE { +#ifdef REMOVE_EVS_DUPLICATES2 + analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, -1, Q_r ); + +#else analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, -1, Q_r ); +#endif } /*--------------------------------------------------------------* diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index fd9b79617..24112da14 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -1196,8 +1196,12 @@ ivas_error pre_proc_front_ivas_fx( move16(); } +#ifdef REMOVE_EVS_DUPLICATES2 + analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, Q_new_loc, Q_r ); +#else analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, i, Q_new_loc, Q_r ); +#endif FOR( Word16 idx = 0; idx < M + 1; idx++ ) { diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index f52bdadb4..751744102 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -673,7 +673,12 @@ ivas_error front_vad_spar_fx( hFrontVad->q_buffer_12k8 = Q_inp_12k8; move16(); +#ifdef REMOVE_EVS_DUPLICATES2 + analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, st->element_mode, 0, Q_inp_12k8, Q_r ); +#else analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */, Q_inp_12k8, Q_r ); +#endif + FOR( Word16 i = 0; i <= M; i++ ) { epsP_fx[i] = L_Comp( epsP_h[i], epsP_l[i] ); // Q_r[0] diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index bd3d4cb34..c119b59dc 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -214,7 +214,7 @@ void pre_proc_fx( * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ Word16 Q_new_inp, mem_decim_size; // TO be removed - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, (const Word16) ( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* @@ -419,7 +419,11 @@ void pre_proc_fx( alw_voicing[1] = st->voicing_fx[2]; move16(); +#ifdef REMOVE_EVS_DUPLICATES2 + analy_lp_ivas_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, EVS_MONO, 0, *Q_new, Q_r ); +#else analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); +#endif lsp2lsf_fx( lsp_new, lsf_new, M, INT_FS_12k8 ); stab_fac = lsf_stab_fx( lsf_new, st->lsf_old1_fx, 0, L_FRAME ); @@ -1152,7 +1156,11 @@ void pre_proc_fx( Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); } +#ifdef REMOVE_EVS_DUPLICATES2 + analy_lp_ivas_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, EVS_MONO, 0, *Q_new, Q_r ); +#else analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); +#endif /*--------------------------------------------------------------* * Compute Weighted Input diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index bc08aae24..666192389 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -70,23 +70,27 @@ ivas_error acelp_core_enc_fx( #endif ); void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ - Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ + Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ +#ifdef REMOVE_EVS_DUPLICATES2 + const Word16 element_mode, /* i : element mode */ +#endif const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ Word16 Q_new, /*i: stores Q for speech*/ Word16 *Q_r /*stores q for ener*/ ); +#ifndef REMOVE_EVS_DUPLICATES2 void analy_lp_fx( const Word16 speech[], /* i : pointer to the speech frame Q_new*/ const Word16 L_frame, /* i : length of the frame Q0*/ @@ -104,6 +108,7 @@ void analy_lp_fx( const Word16 sec_chan_low_rate, /* i : flag to signal second channel Q0*/ Word16 Q_new, Word16 *Q_r ); +#endif void AVQ_cod_fx( /* o: comfort noise gain factor */ const Word16 xri[], /* i: vector to quantize */ -- GitLab From 2cc9768f631e7f312c11885862964c999769dd40 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 6 Mar 2025 14:43:59 +0100 Subject: [PATCH 0020/1310] clang-format --- lib_dec/fd_cng_dec_fx.c | 4 ++-- lib_enc/pre_proc_fx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 65a20bfae..11af48a85 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1243,7 +1243,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1570,7 +1570,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index 88eb78a60..062dc3fa4 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -214,7 +214,7 @@ void pre_proc_fx( * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ Word16 Q_new_inp, mem_decim_size; // TO be removed - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, (const Word16) ( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* -- GitLab From 3b55b2d8511ffd924e0ed55b3f5d335860ef1a4d Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 12 Mar 2025 12:00:22 +0100 Subject: [PATCH 0021/1310] Use round_fx instead of extract_h for angle computation. --- lib_com/options.h | 1 + lib_dec/ivas_dirac_dec_fx.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index d03261715..4272caefe 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,4 +172,5 @@ #define DOT_PROD_CHOLESKY_64BIT /* FhG: Issue 1323, optimized 64 bit implementation of dot_product_cholesky() */ #define OPT_BASOP_ADD_v1 /* optimizations to avoid usage of BASOP_Util_Add_MantExp */ #define FIX_ISSUE_1327 /* Ittiam: Fix for issue 1327: Glitch when stereo is switching from TD to FD*/ +#define FIX_1379_MASA_ANGLE_ROUND #endif diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index d8288e561..7ad651af1 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1446,10 +1446,17 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { +#ifdef FIX_1379_MASA_ANGLE_ROUND + hSpatParamRendCom->azimuth[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); + move16(); + hSpatParamRendCom->elevation[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); + move16(); +#else hSpatParamRendCom->azimuth[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); move16(); hSpatParamRendCom->elevation[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); move16(); +#endif hSpatParamRendCom->energy_ratio1_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( ONE_IN_Q30, q_direction->band_data[band].energy_ratio_fx[block] ); @@ -1494,10 +1501,17 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { +#ifdef FIX_1379_MASA_ANGLE_ROUND + hSpatParamRendCom->azimuth2[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); + move16(); + hSpatParamRendCom->elevation2[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); + move16(); +#else hSpatParamRendCom->azimuth2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); move16(); hSpatParamRendCom->elevation2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); move16(); +#endif hSpatParamRendCom->energy_ratio2_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b], q_direction->band_data[band].energy_ratio_fx[block] ); @@ -1704,8 +1718,13 @@ void ivas_qmetadata_to_dirac_fx( IF( hodirac_flag ) { +#ifdef FIX_1379_MASA_ANGLE_ROUND + azi = round_fx( L_shr( ( L_add( azimuth_fx, ONE_IN_Q21 ) ), 6 ) ); + ele = round_fx( L_shr( ( L_add( elevation_fx, ONE_IN_Q21 ) ), 6 ) ); +#else azi = extract_h( L_shr( ( L_add( azimuth_fx, ONE_IN_Q21 ) ), 6 ) ); ele = extract_h( L_shr( ( L_add( elevation_fx, ONE_IN_Q21 ) ), 6 ) ); +#endif /*addition of one to compensate precision loss*/ if ( azi < 0 ) { @@ -1741,8 +1760,13 @@ void ivas_qmetadata_to_dirac_fx( final_1_32 = BASOP_Util_Add_Mant32Exp( final_1_32, final_1_exp, ONE_IN_Q30, 0, &final_1_exp ); /*0.5 in q31*/ final_2_32 = BASOP_Util_Add_Mant32Exp( final_2_32, final_2_exp, ONE_IN_Q30, 0, &final_2_exp ); +#ifdef FIX_1379_MASA_ANGLE_ROUND + azi = round_fx( L_shr( final_1_32, sub( sub( 31, final_1_exp ), 16 ) ) ); + ele = round_fx( L_shr( final_2_32, sub( sub( 31, final_2_exp ), 16 ) ) ); +#else azi = extract_h( L_shr( final_1_32, sub( sub( 31, final_1_exp ), 16 ) ) ); ele = extract_h( L_shr( final_2_32, sub( sub( 31, final_2_exp ), 16 ) ) ); +#endif /*addition of one to compensate precision loss*/ if ( azi < 0 ) @@ -3597,7 +3621,9 @@ void ivas_dirac_dec_render_sf_fx( { Word16 j, k, j2, l; Word16 num_objects, nchan_out_woLFE, lfe_index; +#ifndef FIX_1379_MASA_ANGLE_ROUND Word16 az1, el1; +#endif Word16 n_slots_to_render; Word16 n_samples_to_render; Word16 interp_offset; @@ -3631,13 +3657,20 @@ void ivas_dirac_dec_render_sf_fx( Word16 el_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, Q22 ) ); Word32 az1_32, el1_32; rotateAziEle_fixed( az_q0, el_q0, &az1_32, &el1_32, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); +#ifndef FIX_1379_MASA_ANGLE_ROUND az1 = extract_h( az1_32 ); el1 = extract_h( el1_32 ); +#endif IF( st_ivas->hEFAPdata != NULL ) { +#ifdef FIX_1379_MASA_ANGLE_ROUND + const Word32 azi_fx = L_shl( az1_32, Q22-Q16 ); // Q16 -> Q22 + const Word32 ele_fx = L_shl( el1_32, Q22-Q16 ); // Q16 -> Q22 +#else const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 +#endif efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azi_fx, ele_fx, EFAP_MODE_EFAP ); } } -- GitLab From 820ea273d5140a00c5696978276e99729b1b11ab Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 12 Mar 2025 12:02:11 +0100 Subject: [PATCH 0022/1310] Use round_fx instead of extract_h for angle computation. format fix. --- lib_dec/ivas_dirac_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 7ad651af1..26c7e3441 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -3665,8 +3665,8 @@ void ivas_dirac_dec_render_sf_fx( IF( st_ivas->hEFAPdata != NULL ) { #ifdef FIX_1379_MASA_ANGLE_ROUND - const Word32 azi_fx = L_shl( az1_32, Q22-Q16 ); // Q16 -> Q22 - const Word32 ele_fx = L_shl( el1_32, Q22-Q16 ); // Q16 -> Q22 + const Word32 azi_fx = L_shl( az1_32, Q22 - Q16 ); // Q16 -> Q22 + const Word32 ele_fx = L_shl( el1_32, Q22 - Q16 ); // Q16 -> Q22 #else const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 -- GitLab From 4714a44d70693d2ffbbb4eb5ba2f717b14df91f2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 11 Mar 2025 12:32:57 +0530 Subject: [PATCH 0023/1310] Fix for 3GPP issue 1341: Usage of open/deleteCldfb() functions - multiple variants Link #1341 --- lib_com/cldfb.c | 107 +++-------------------- lib_com/cnst.h | 6 +- lib_com/prot_fx.h | 15 +--- lib_dec/init_dec_fx.c | 6 +- lib_dec/ivas_corecoder_dec_reconfig_fx.c | 4 +- lib_dec/ivas_init_dec.c | 4 +- lib_dec/ivas_sce_dec_fx.c | 2 +- lib_dec/ivas_stereo_mdct_stereo_dec_fx.c | 4 +- lib_dec/ivas_stereo_switching_dec_fx.c | 10 +-- lib_enc/init_enc_fx.c | 4 +- lib_enc/ivas_masa_enc_fx.c | 4 +- lib_enc/ivas_omasa_enc_fx.c | 4 +- lib_enc/ivas_stereo_switching_enc_fx.c | 10 +-- lib_enc/ivas_stereo_td_enc_fx.c | 8 +- lib_rend/ivas_dirac_ana_fx.c | 2 +- lib_rend/ivas_masa_merge_fx.c | 2 +- lib_rend/ivas_mcmasa_ana_fx.c | 2 +- lib_rend/ivas_omasa_ana_fx.c | 2 +- lib_rend/lib_rend.c | 4 +- 19 files changed, 53 insertions(+), 147 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 38195b65d..7fc8026b5 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -1364,8 +1364,8 @@ ivas_error openCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ const Word32 sampling_rate, /* i : sampling rate */ - CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ -) + CLDFB_PROTOTYPE prototype, /* i : CLDFB version (1.25ms/5ms delay) */ + CODE_TYPE code_type ) { HANDLE_CLDFB_FILTER_BANK hs; Word16 buf_len; @@ -1379,7 +1379,14 @@ ivas_error openCldfb_ivas_fx( move32(); hs->prototype = prototype; move32(); - configureCldfb_ivas_fx( hs, sampling_rate ); + IF( code_type == IVAS_ENC ) + { + configureCldfb_ivas_enc_fx( hs, sampling_rate ); + } + ELSE + { + configureCldfb_ivas_fx( hs, sampling_rate ); + } hs->memory32 = NULL; hs->FilterStates = NULL; hs->memory_length = 0; @@ -1413,65 +1420,6 @@ ivas_error openCldfb_ivas_fx( return IVAS_ERR_OK; } -ivas_error openCldfb_ivas_enc( - HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ - CLDFB_TYPE type, /* i : analysis or synthesis */ - const Word32 sampling_rate, /* i : sampling rate */ - CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ -) -{ - HANDLE_CLDFB_FILTER_BANK hs; - Word16 buf_len; - - IF( ( hs = (HANDLE_CLDFB_FILTER_BANK) malloc( sizeof( CLDFB_FILTER_BANK ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); - } - - hs->type = type; - move32(); - hs->prototype = prototype; - move32(); - - configureCldfb_ivas_enc_fx( hs, sampling_rate ); - hs->memory_length = 0; - move32(); - - IF( type == CLDFB_ANALYSIS ) - { - buf_len = sub( hs->p_filter_length, hs->no_channels ); - hs->FilterStates = (Word16 *) malloc( ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); - hs->FilterStates_eg = 0; - move16(); - } - ELSE - { - buf_len = hs->p_filter_length; - move16(); - hs->FilterStates = (Word16 *) malloc( 2 * ( 9 + 16 ) * CLDFB_getNumChannels( sampling_rate ) * sizeof( Word16 ) ); - hs->FilterStates_eg = 0; - move16(); - } - - if ( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); - } - hs->cldfb_state_length = buf_len; // Temporarily added to store the length of buffer - move16(); - hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ - move16(); - set32_fx( hs->cldfb_state_fx, 0, buf_len ); - hs->Q_cldfb_state = 0; - move16(); - set16_fx( hs->FilterStates, 0, i_mult( 9 + 16, hs->no_channels ) ); - set16_fx( hs->FilterStates_e, 0, sizeof( hs->FilterStates_e ) / sizeof( hs->FilterStates_e[0] ) ); - - *h_cldfb = hs; - - return IVAS_ERR_OK; -} - /*-------------------------------------------------------------------* * resampleCldfb_ivas() * @@ -1563,41 +1511,6 @@ void analysisCldfbEncoder_ivas_fx( return; } - -/*-------------------------------------------------------------------* - * GetEnergyCldfb_ivas() - * - * Remove handle - *--------------------------------------------------------------------*/ - -void deleteCldfb_ivas( - HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ -) -{ - HANDLE_CLDFB_FILTER_BANK hs = *h_cldfb; - - test(); - IF( h_cldfb == NULL || *h_cldfb == NULL ) - { - return; - } - - IF( hs->cldfb_state_fx ) - { - free( hs->cldfb_state_fx ); - } - - IF( hs->FilterStates ) - { - free( hs->FilterStates ); - } - - free( hs ); - *h_cldfb = NULL; - - return; -} - void deleteCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ ) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 7c93498af..3c014325e 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -803,7 +803,11 @@ typedef enum CLDFB_ANALYSIS, CLDFB_SYNTHESIS } CLDFB_TYPE; - +typedef enum +{ + IVAS_ENC, + IVAS_DEC_REND +} CODE_TYPE; typedef enum { CLDFB_PROTOTYPE_1_25MS, diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index db0953cd9..c1aefbe36 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9803,8 +9803,8 @@ ivas_error openCldfb_ivas_fx( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ const Word32 sampling_rate, /* i : sampling rate */ - CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ -); + CLDFB_PROTOTYPE prototype, /* i : CLDFB version (1.25ms/5ms delay) */ + CODE_TYPE code_type ); Word32 rand_gauss_fx( Word32 *x, @@ -11944,13 +11944,6 @@ ivas_error openCldfb_ivas( CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ ); -ivas_error openCldfb_ivas_enc( - HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ - CLDFB_TYPE type, /* i : analysis or synthesis */ - const Word32 sampling_rate, /* i : sampling rate */ - CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ -); - void resampleCldfb_ivas( HANDLE_CLDFB_FILTER_BANK hs, /* i/o: filter bank handle */ const Word32 newSamplerate /* i : new samplerate to operate */ @@ -11960,10 +11953,6 @@ ivas_error cldfb_save_memory_ivas( HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */ ); -void deleteCldfb_ivas( - HANDLE_CLDFB_FILTER_BANK *h_cldfb /* i/o: filter bank handle */ -); - /*! r: flag indicating a valid bitrate */ Word16 is_EVS_bitrate( const Word32 ivas_total_brate, /* i : EVS total bitrate */ diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index 3865cd61c..4e0cfda18 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -1447,13 +1447,13 @@ ivas_error init_decoder_ivas_fx( IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { /* open analysis for max. SR 48kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } /* open analysis BPF for max. SR 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -1465,7 +1465,7 @@ ivas_error init_decoder_ivas_fx( } /* open synthesis for output SR */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_corecoder_dec_reconfig_fx.c b/lib_dec/ivas_corecoder_dec_reconfig_fx.c index 25c0bea42..111c0be0e 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig_fx.c +++ b/lib_dec/ivas_corecoder_dec_reconfig_fx.c @@ -602,7 +602,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* create additional CLDFB synthesis instances */ FOR( i = numCldfbAnalyses_old; i < numCldfbAnalyses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -622,7 +622,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* create additional CLDFB synthesis instances */ FOR( i = numCldfbSyntheses_old; i < numCldfbSyntheses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b11669460..236eaad54 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2264,7 +2264,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbAnalyses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -2276,7 +2276,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbSyntheses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_sce_dec_fx.c b/lib_dec/ivas_sce_dec_fx.c index a6be10c08..cc3980b12 100644 --- a/lib_dec/ivas_sce_dec_fx.c +++ b/lib_dec/ivas_sce_dec_fx.c @@ -438,7 +438,7 @@ ivas_error create_sce_dec( IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_FORMAT ) && ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) || ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && EQ_16( st_ivas->nchan_transport, 1 ) ) ) ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynHB, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynHB, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c index 3f39bd9ac..c8dde0837 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c @@ -601,7 +601,7 @@ ivas_error initMdctStereoDtxData_fx( IF( st->cldfbAna == NULL ) { /* open analysis for max. sampling rate 48kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -610,7 +610,7 @@ ivas_error initMdctStereoDtxData_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 09b683a16..34eef94ed 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -205,7 +205,7 @@ static ivas_error allocate_CoreCoder_fx( IF( st->cldfbAna == NULL ) { /* open analysis for max. sampling rate 48kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -214,7 +214,7 @@ static ivas_error allocate_CoreCoder_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -752,7 +752,7 @@ ivas_error stereo_memory_dec_fx( IF( st->cldfbAna == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -761,7 +761,7 @@ ivas_error stereo_memory_dec_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -1100,7 +1100,7 @@ ivas_error stereo_memory_dec_fx( { IF( hCPE->hCoreCoder[i]->cldfbSyn == NULL ) /* could be NULL when we had the MCT LFE channel */ { - IF( NE_32( ( error = openCldfb_ivas_fx( &hCPE->hCoreCoder[i]->cldfbSyn, CLDFB_SYNTHESIS, hCPE->hCoreCoder[i]->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &hCPE->hCoreCoder[i]->cldfbSyn, CLDFB_SYNTHESIS, hCPE->hCoreCoder[i]->output_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 615ca1b33..f0338b461 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1695,7 +1695,7 @@ ivas_error init_encoder_ivas_fx( test(); IF( ( NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) { - IF( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ) != IVAS_ERR_OK ) { return error; } @@ -1809,7 +1809,7 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - IF( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 6960629c8..9fdebed7a 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -152,7 +152,7 @@ ivas_error ivas_masa_enc_open_fx( FOR( i = 0; i < hMasa->data.num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_enc( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) { return error; } @@ -260,7 +260,7 @@ void ivas_masa_enc_close_fx( FOR( i = 0; i < ( *hMasa )->data.num_Cldfb_instances; i++ ) { - deleteCldfb_ivas( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); + deleteCldfb_ivas_fx( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); } IF( ( *hMasa )->data.hOmasaData != NULL ) diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index 5d79265f4..50fb49355 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -124,7 +124,7 @@ ivas_error ivas_omasa_enc_open_fx( move16(); FOR( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { - IF( ( error = openCldfb_ivas_enc( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_ENC ) ) != IVAS_ERR_OK ) { return error; } @@ -227,7 +227,7 @@ void ivas_omasa_enc_close_fx( FOR( i = 0; i < ( *hOMasa )->num_Cldfb_instances; i++ ) { - deleteCldfb_ivas( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); + deleteCldfb_ivas_fx( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); } FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) diff --git a/lib_enc/ivas_stereo_switching_enc_fx.c b/lib_enc/ivas_stereo_switching_enc_fx.c index 2fe8b6c84..6c7a1e68d 100644 --- a/lib_enc/ivas_stereo_switching_enc_fx.c +++ b/lib_enc/ivas_stereo_switching_enc_fx.c @@ -366,8 +366,8 @@ ivas_error stereo_memory_enc_fx( IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) || EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) ) { /* Deallocate MDCT CNG structures */ - deleteCldfb_ivas( &hCPE->hCoreCoder[0]->cldfbAnaEnc ); - deleteCldfb_ivas( &hCPE->hCoreCoder[1]->cldfbAnaEnc ); + deleteCldfb_ivas_fx( &hCPE->hCoreCoder[0]->cldfbAnaEnc ); + deleteCldfb_ivas_fx( &hCPE->hCoreCoder[1]->cldfbAnaEnc ); IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { @@ -417,7 +417,7 @@ ivas_error stereo_memory_enc_fx( /* allocate CLDFB for primary channel */ IF( st->cldfbAnaEnc == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) { return error; } @@ -433,7 +433,7 @@ ivas_error stereo_memory_enc_fx( IF( st->cldfbSynTd == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) { return error; } @@ -587,7 +587,7 @@ ivas_error stereo_memory_enc_fx( FOR( i = 0; i < CPE_CHANNELS; i++ ) { st = hCPE->hCoreCoder[i]; - IF( NE_32( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/ivas_stereo_td_enc_fx.c b/lib_enc/ivas_stereo_td_enc_fx.c index d2ff2c0c2..de9bc09b5 100644 --- a/lib_enc/ivas_stereo_td_enc_fx.c +++ b/lib_enc/ivas_stereo_td_enc_fx.c @@ -263,7 +263,7 @@ ivas_error stereo_set_tdm_fx( /* deallocate CLDFB ana for secondary channel */ IF( st->cldfbAnaEnc != NULL ) { - deleteCldfb_ivas( &st->cldfbAnaEnc ); + deleteCldfb_ivas_fx( &st->cldfbAnaEnc ); } /* deallocate BWEs for secondary channel */ @@ -275,7 +275,7 @@ ivas_error stereo_set_tdm_fx( st->hBWE_TD = NULL; } - deleteCldfb_ivas( &st->cldfbSynTd ); + deleteCldfb_ivas_fx( &st->cldfbSynTd ); IF( st->hBWE_FD != NULL ) { @@ -309,7 +309,7 @@ ivas_error stereo_set_tdm_fx( /* allocate CLDFB ana for secondary channel */ IF( st->cldfbAnaEnc == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_enc( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) { return error; } @@ -322,7 +322,7 @@ ivas_error stereo_set_tdm_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - IF( NE_32( ( error = openCldfb_ivas_enc( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 93a100e17..5dd3f8384 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -107,7 +107,7 @@ ivas_error ivas_dirac_ana_open_fx( move16(); FOR( i = 0; i < hDirAC->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hDirAC->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hDirAC->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index 430fab2c7..3aa9f62a9 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -499,7 +499,7 @@ ivas_error masaPrerendOpen_fx( move16(); FOR( i = 0; i < hMasaPrerend->num_Cldfb_instances; i++ ) { - IF( ( error = openCldfb_ivas_fx( &( hMasaPrerend->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &( hMasaPrerend->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index 8b56b6855..d56ba2685 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -224,7 +224,7 @@ ivas_error ivas_mcmasa_ana_open( move16(); FOR( i = 0; i < hMcMasa->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 2c28b32bd..1d849a90f 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -133,7 +133,7 @@ ivas_error ivas_omasa_ana_open( hOMasa->num_Cldfb_instances = numAnalysisChannels; FOR( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 2c81911a1..041f278f1 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -8187,7 +8187,7 @@ static ivas_error initMasaExtRenderer( { FOR( i = 0; i < hMasaExtRend->nchan_input; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } @@ -8195,7 +8195,7 @@ static ivas_error initMasaExtRenderer( FOR( i = 0; i < hMasaExtRend->nchan_output; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From b3f172527adda62f08af43cb0d81f7b553e0f8f2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 12 Mar 2025 11:42:57 +0530 Subject: [PATCH 0024/1310] Address review comments --- lib_com/cldfb.c | 10 ++++++---- lib_com/cnst.h | 6 +----- lib_com/prot_fx.h | 2 +- lib_dec/init_dec_fx.c | 6 +++--- lib_dec/ivas_corecoder_dec_reconfig_fx.c | 4 ++-- lib_dec/ivas_init_dec.c | 4 ++-- lib_dec/ivas_sce_dec_fx.c | 2 +- lib_dec/ivas_stereo_mdct_stereo_dec_fx.c | 4 ++-- lib_dec/ivas_stereo_switching_dec_fx.c | 10 +++++----- lib_enc/init_enc_fx.c | 4 ++-- lib_enc/ivas_masa_enc_fx.c | 2 +- lib_enc/ivas_omasa_enc_fx.c | 2 +- lib_enc/ivas_stereo_switching_enc_fx.c | 6 +++--- lib_enc/ivas_stereo_td_enc_fx.c | 4 ++-- lib_rend/ivas_dirac_ana_fx.c | 2 +- lib_rend/ivas_masa_merge_fx.c | 2 +- lib_rend/ivas_mcmasa_ana_fx.c | 2 +- lib_rend/ivas_omasa_ana_fx.c | 2 +- lib_rend/lib_rend.c | 4 ++-- 19 files changed, 38 insertions(+), 40 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 7fc8026b5..246a8a8e8 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -1365,7 +1365,7 @@ ivas_error openCldfb_ivas_fx( CLDFB_TYPE type, /* i : analysis or synthesis */ const Word32 sampling_rate, /* i : sampling rate */ CLDFB_PROTOTYPE prototype, /* i : CLDFB version (1.25ms/5ms delay) */ - CODE_TYPE code_type ) + const Word16 enc_dec ) /* i : encoder/decoder flag */ { HANDLE_CLDFB_FILTER_BANK hs; Word16 buf_len; @@ -1379,14 +1379,17 @@ ivas_error openCldfb_ivas_fx( move32(); hs->prototype = prototype; move32(); - IF( code_type == IVAS_ENC ) + IF( enc_dec == ENC ) { configureCldfb_ivas_enc_fx( hs, sampling_rate ); + hs->Q_cldfb_state = 0; } ELSE { configureCldfb_ivas_fx( hs, sampling_rate ); + hs->Q_cldfb_state = Q11; } + move16(); hs->memory32 = NULL; hs->FilterStates = NULL; hs->memory_length = 0; @@ -1412,8 +1415,7 @@ ivas_error openCldfb_ivas_fx( hs->cldfb_size = buf_len; /*for having original size at intermediatery conversion, will be removed on removing conversion*/ move16(); set32_fx( hs->cldfb_state_fx, 0, buf_len ); - hs->Q_cldfb_state = Q11; - move16(); + *h_cldfb = hs; move16(); diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 3c014325e..7c93498af 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -803,11 +803,7 @@ typedef enum CLDFB_ANALYSIS, CLDFB_SYNTHESIS } CLDFB_TYPE; -typedef enum -{ - IVAS_ENC, - IVAS_DEC_REND -} CODE_TYPE; + typedef enum { CLDFB_PROTOTYPE_1_25MS, diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index c1aefbe36..9fe14b5bd 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9804,7 +9804,7 @@ ivas_error openCldfb_ivas_fx( CLDFB_TYPE type, /* i : analysis or synthesis */ const Word32 sampling_rate, /* i : sampling rate */ CLDFB_PROTOTYPE prototype, /* i : CLDFB version (1.25ms/5ms delay) */ - CODE_TYPE code_type ); + const Word16 enc_dec ); /* i : encoder/decoder flag */ Word32 rand_gauss_fx( Word32 *x, diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index 4e0cfda18..bd8a2cbd3 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -1447,13 +1447,13 @@ ivas_error init_decoder_ivas_fx( IF( ( idchan == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) || EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) { /* open analysis for max. SR 48kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } /* open analysis BPF for max. SR 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -1465,7 +1465,7 @@ ivas_error init_decoder_ivas_fx( } /* open synthesis for output SR */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st_fx->cldfbSyn, CLDFB_SYNTHESIS, st_fx->output_Fs, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_corecoder_dec_reconfig_fx.c b/lib_dec/ivas_corecoder_dec_reconfig_fx.c index 111c0be0e..8333f146f 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig_fx.c +++ b/lib_dec/ivas_corecoder_dec_reconfig_fx.c @@ -602,7 +602,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* create additional CLDFB synthesis instances */ FOR( i = numCldfbAnalyses_old; i < numCldfbAnalyses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -622,7 +622,7 @@ ivas_error ivas_cldfb_dec_reconfig_fx( /* create additional CLDFB synthesis instances */ FOR( i = numCldfbSyntheses_old; i < numCldfbSyntheses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 236eaad54..1ab797ded 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2264,7 +2264,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbAnalyses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -2276,7 +2276,7 @@ ivas_error ivas_init_decoder_fx( FOR( i = 0; i < numCldfbSyntheses; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_sce_dec_fx.c b/lib_dec/ivas_sce_dec_fx.c index cc3980b12..12549f49d 100644 --- a/lib_dec/ivas_sce_dec_fx.c +++ b/lib_dec/ivas_sce_dec_fx.c @@ -438,7 +438,7 @@ ivas_error create_sce_dec( IF( EQ_16( (Word16) st_ivas->ivas_format, SBA_FORMAT ) && ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) || ( EQ_16( (Word16) st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && EQ_16( st_ivas->nchan_transport, 1 ) ) ) ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynHB, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynHB, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c index c8dde0837..5b1378a89 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c @@ -601,7 +601,7 @@ ivas_error initMdctStereoDtxData_fx( IF( st->cldfbAna == NULL ) { /* open analysis for max. sampling rate 48kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -610,7 +610,7 @@ ivas_error initMdctStereoDtxData_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 34eef94ed..c70e606ac 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -205,7 +205,7 @@ static ivas_error allocate_CoreCoder_fx( IF( st->cldfbAna == NULL ) { /* open analysis for max. sampling rate 48kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -214,7 +214,7 @@ static ivas_error allocate_CoreCoder_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -752,7 +752,7 @@ ivas_error stereo_memory_dec_fx( IF( st->cldfbAna == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAna, CLDFB_ANALYSIS, 48000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -761,7 +761,7 @@ ivas_error stereo_memory_dec_fx( IF( st->cldfbBPF == NULL ) { /* open analysis BPF for max. internal sampling rate 16kHz */ - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbBPF, CLDFB_ANALYSIS, 16000, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -1100,7 +1100,7 @@ ivas_error stereo_memory_dec_fx( { IF( hCPE->hCoreCoder[i]->cldfbSyn == NULL ) /* could be NULL when we had the MCT LFE channel */ { - IF( NE_32( ( error = openCldfb_ivas_fx( &hCPE->hCoreCoder[i]->cldfbSyn, CLDFB_SYNTHESIS, hCPE->hCoreCoder[i]->output_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &hCPE->hCoreCoder[i]->cldfbSyn, CLDFB_SYNTHESIS, hCPE->hCoreCoder[i]->output_Fs, CLDFB_PROTOTYPE_1_25MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index f0338b461..cd5db5377 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1695,7 +1695,7 @@ ivas_error init_encoder_ivas_fx( test(); IF( ( NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) { - IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) { return error; } @@ -1809,7 +1809,7 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - IF( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 9fdebed7a..da1f836df 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -152,7 +152,7 @@ ivas_error ivas_masa_enc_open_fx( FOR( i = 0; i < hMasa->data.num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasa->data.cldfbAnaEnc[i] ), CLDFB_ANALYSIS, hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS, ENC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index 50fb49355..b5258712b 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -124,7 +124,7 @@ ivas_error ivas_omasa_enc_open_fx( move16(); FOR( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { - IF( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_ENC ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, st_ivas->hEncoderConfig->input_Fs, CLDFB_PROTOTYPE_5_00MS, ENC ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_stereo_switching_enc_fx.c b/lib_enc/ivas_stereo_switching_enc_fx.c index 6c7a1e68d..0a526561a 100644 --- a/lib_enc/ivas_stereo_switching_enc_fx.c +++ b/lib_enc/ivas_stereo_switching_enc_fx.c @@ -417,7 +417,7 @@ ivas_error stereo_memory_enc_fx( /* allocate CLDFB for primary channel */ IF( st->cldfbAnaEnc == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ), IVAS_ERR_OK ) ) { return error; } @@ -433,7 +433,7 @@ ivas_error stereo_memory_enc_fx( IF( st->cldfbSynTd == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, ENC ) ), IVAS_ERR_OK ) ) { return error; } @@ -587,7 +587,7 @@ ivas_error stereo_memory_enc_fx( FOR( i = 0; i < CPE_CHANNELS; i++ ) { st = hCPE->hCoreCoder[i]; - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/ivas_stereo_td_enc_fx.c b/lib_enc/ivas_stereo_td_enc_fx.c index de9bc09b5..1544aab76 100644 --- a/lib_enc/ivas_stereo_td_enc_fx.c +++ b/lib_enc/ivas_stereo_td_enc_fx.c @@ -309,7 +309,7 @@ ivas_error stereo_set_tdm_fx( /* allocate CLDFB ana for secondary channel */ IF( st->cldfbAnaEnc == NULL ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ), IVAS_ERR_OK ) ) { return error; } @@ -322,7 +322,7 @@ ivas_error stereo_set_tdm_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, IVAS_ENC ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, ENC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 5dd3f8384..1a5013059 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -107,7 +107,7 @@ ivas_error ivas_dirac_ana_open_fx( move16(); FOR( i = 0; i < hDirAC->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hDirAC->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hDirAC->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index 3aa9f62a9..c74477365 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -499,7 +499,7 @@ ivas_error masaPrerendOpen_fx( move16(); FOR( i = 0; i < hMasaPrerend->num_Cldfb_instances; i++ ) { - IF( ( error = openCldfb_ivas_fx( &( hMasaPrerend->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ) != IVAS_ERR_OK ) + IF( ( error = openCldfb_ivas_fx( &( hMasaPrerend->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index d56ba2685..e17b2f9f6 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -224,7 +224,7 @@ ivas_error ivas_mcmasa_ana_open( move16(); FOR( i = 0; i < hMcMasa->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 1d849a90f..5e175fae5 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -133,7 +133,7 @@ ivas_error ivas_omasa_ana_open( hOMasa->num_Cldfb_instances = numAnalysisChannels; FOR( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 041f278f1..129f72388 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -8187,7 +8187,7 @@ static ivas_error initMasaExtRenderer( { FOR( i = 0; i < hMasaExtRend->nchan_input; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbAnaRend[i] ), CLDFB_ANALYSIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } @@ -8195,7 +8195,7 @@ static ivas_error initMasaExtRenderer( FOR( i = 0; i < hMasaExtRend->nchan_output; i++ ) { - IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS, IVAS_DEC_REND ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = openCldfb_ivas_fx( &( hMasaExtRend->cldfbSynRend[i] ), CLDFB_SYNTHESIS, *inputMasa->base.ctx.pOutSampleRate, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From ba11d5e9e26ead4c2d50d98825b80dcfef56024d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 19 Mar 2025 13:20:45 +0100 Subject: [PATCH 0025/1310] merge REMOVE_EVS_DUPLICATES2 into REMOVE_EVS_DUPLICATES --- lib_com/options.h | 1 - lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 2 +- lib_dec/acelp_core_dec_fx.c | 3 +-- lib_dec/dec_LPD_fx.c | 2 +- lib_dec/dec_ace_fx.c | 2 +- lib_dec/dec_tran_fx.c | 2 +- lib_enc/analy_lp_fx.c | 10 +++++----- lib_enc/cod_ace_fx.c | 2 +- lib_enc/enc_gen_voic_fx.c | 2 +- lib_enc/enc_tran_fx.c | 2 +- lib_enc/ivas_core_pre_proc_front_fx.c | 2 +- lib_enc/ivas_core_pre_proc_fx.c | 4 ++-- lib_enc/ivas_front_vad_fx.c | 2 +- lib_enc/pre_proc_fx.c | 6 +++--- lib_enc/prot_fx_enc.h | 4 ++-- 16 files changed, 23 insertions(+), 25 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4e17909b0..9d6f852ac 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -176,5 +176,4 @@ #define FIX_ISSUE_1376 /* VA: Fix for issue 1376 (issue with GSC excitation) */ #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ -#define REMOVE_EVS_DUPLICATES2 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 99925342c..8c42651b2 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3284,7 +3284,7 @@ void synthesise_fb_high_band_fx( Word16 bpf_memory_Q[], Word16 Qout ); -#ifndef REMOVE_EVS_DUPLICATES2 +#ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ #ifdef ADD_IVAS_TBE_CODE diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e279f0d48..af0a37011 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7324,7 +7324,7 @@ void tbe_celp_exc( /* _ None */ /*======================================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES2 +#ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ #ifdef ADD_IVAS_TBE_CODE diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index b0fe937cd..d336c80ed 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -1658,8 +1658,7 @@ ivas_error acelp_core_dec_fx( hf_synth_reset_fx( st_fx->hBWE_zero ); } #else - hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, - st_fx->Q_syn2, st_fx->hBWE_zero->delay_syn_hf_fx, &st_fx->hBWE_zero->memExp1, st_fx->hBWE_zero->mem_hp_interp_fx, st_fx->extl, st_fx->CNG_mode ); + hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, st_fx->Q_syn2 ); #endif } diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index f74c3e913..f53234ded 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -556,7 +556,7 @@ void decoder_LPD_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES int_lsp4_ivas_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); #else int_lsp4_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index 5d644c289..16f749156 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -532,7 +532,7 @@ void decoder_acelp_fx( move16(); IF( st->igf != 0 ) { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES prep_tbe_exc_ivas_fx( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); #else diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index 96eace777..c5b06724a 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -254,7 +254,7 @@ void decod_tran_fx( tmp_idx_2 = idiv1616( i_subfr, L_SUBFR ); } -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, diff --git a/lib_enc/analy_lp_fx.c b/lib_enc/analy_lp_fx.c index b5764ec43..78a02eeec 100644 --- a/lib_enc/analy_lp_fx.c +++ b/lib_enc/analy_lp_fx.c @@ -37,7 +37,7 @@ void analy_lp_ivas_fx( const Word16 Top[2], /* i :(q0) open loop pitch lag */ const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES const Word16 element_mode, /* i : element mode */ #endif const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ @@ -77,7 +77,7 @@ void analy_lp_ivas_fx( /* Autocorrelations */ autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( element_mode, EVS_MONO ) ) #endif { @@ -132,7 +132,7 @@ void analy_lp_ivas_fx( return; } -#ifndef REMOVE_EVS_DUPLICATES2 +#ifndef REMOVE_EVS_DUPLICATES void analy_lp_fx( const Word16 speech[], /* i : pointer to the speech frame Q_new*/ const Word16 L_frame, /* i : length of the frame Q0*/ @@ -204,7 +204,7 @@ void analy_lp_fx( IF( EQ_16( sec_chan_low_rate, 1 ) ) { /* LSP interpolation */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES int_lsp4_ivas_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); #else int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); @@ -213,7 +213,7 @@ void analy_lp_fx( ELSE { /* LSP interpolation */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); #else int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index aa823cbda..743874351 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -409,7 +409,7 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * IF( st->igf != 0 ) { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index e82b1d243..519fd776b 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -367,7 +367,7 @@ void encod_gen_voic_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 25368fac5..fce1ceb0c 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -308,7 +308,7 @@ Word16 encod_tran_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); #else diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 6920aa6f5..d686f109f 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1210,7 +1210,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, Q_new_loc, Q_r ); #else analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 6be8c474e..cbc0bd5a6 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -1138,7 +1138,7 @@ ivas_error ivas_compute_core_buffers_fx( IF( Q_new ) { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, sub( *Q_new, 1 ), Q_r ); #else analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, sub( *Q_new, 1 ), Q_r ); @@ -1146,7 +1146,7 @@ ivas_error ivas_compute_core_buffers_fx( } ELSE { -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, -1, Q_r ); #else diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index eaa6e6146..3e9ff3284 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -647,7 +647,7 @@ ivas_error front_vad_spar_fx( hFrontVad->q_buffer_12k8 = Q_inp_12k8; move16(); -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, st->element_mode, 0, Q_inp_12k8, Q_r ); #else analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */, Q_inp_12k8, Q_r ); diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index 062dc3fa4..a5d619359 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -214,7 +214,7 @@ void pre_proc_fx( * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ Word16 Q_new_inp, mem_decim_size; // TO be removed - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, (const Word16) ( EQ_16( st->max_bwidth, NB ) ), &Q_new_inp, &mem_decim_size ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* @@ -415,7 +415,7 @@ void pre_proc_fx( alw_voicing[1] = st->voicing_fx[2]; move16(); -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES analy_lp_ivas_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, EVS_MONO, 0, *Q_new, Q_r ); #else analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); @@ -1136,7 +1136,7 @@ void pre_proc_fx( Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); } -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES analy_lp_ivas_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, EVS_MONO, 0, *Q_new, Q_r ); #else analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 8bfce57a0..2427d92a8 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -82,14 +82,14 @@ void analy_lp_ivas_fx( const Word16 Top[2], /* i :(q0) open loop pitch lag */ const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ -#ifdef REMOVE_EVS_DUPLICATES2 +#ifdef REMOVE_EVS_DUPLICATES const Word16 element_mode, /* i : element mode */ #endif const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ Word16 Q_new, /*i: stores Q for speech*/ Word16 *Q_r /*stores q for ener*/ ); -#ifndef REMOVE_EVS_DUPLICATES2 +#ifndef REMOVE_EVS_DUPLICATES void analy_lp_fx( const Word16 speech[], /* i : pointer to the speech frame Q_new*/ const Word16 L_frame, /* i : length of the frame Q0*/ -- GitLab From fe1734da642d7873d24d1ba64cb20dccf9c06be1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 19 Mar 2025 13:36:13 +0100 Subject: [PATCH 0026/1310] cleaning --- lib_dec/acelp_core_dec_fx.c | 202 +----------------------------------- 1 file changed, 4 insertions(+), 198 deletions(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index d336c80ed..71976a730 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -359,11 +359,7 @@ ivas_error acelp_core_dec_fx( } /* update synthesis filter memories */ -#ifdef REMOVE_EVS_DUPLICATES - ivas_synth_mem_updt2_fx( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); -#else synth_mem_updt2( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); -#endif Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); // Q_exc Copy_Scale_sig( st_fx->mem_syn2_fx, st_fx->mem_syn1_fx, M, sub( -1, st_fx->Q_syn ) ); /*Q-1*/ @@ -559,11 +555,8 @@ ivas_error acelp_core_dec_fx( /* decode CNG parameters */ IF( st_fx->cng_type == LP_CNG ) { -#ifdef REMOVE_EVS_DUPLICATES - CNG_dec_ivas_fx( st_fx, st_fx->last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); -#else + CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); -#endif /* comfort noise generation */ CNG_exc_fx( st_fx->core_brate, st_fx->L_frame, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate, @@ -599,39 +592,10 @@ ivas_error acelp_core_dec_fx( } i = st_fx->Q_exc; move16(); -#ifdef REMOVE_EVS_DUPLICATES - test(); - IF( st_fx->hMusicPF && st_fx->hGSCDec ) - { -#ifdef REMOVE_EVS_DUPLICATES - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) - { - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, - st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); - } - ELSE -#endif - { - Rescale_exc( st_fx->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, - imult1616( st_fx->L_frame, HIBND_ACB_L_FAC ), 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); - } - } - IF( st_fx->hPFstat != NULL ) - { - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, - &st_fx->mem_deemph_fx, st_fx->hBPF->pst_old_syn_fx, &st_fx->hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 0, 0, NULL ); - } - ELSE - { - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, - &st_fx->mem_deemph_fx, NULL, NULL, &st_fx->agc_mem_fx[1], NULL, 0, 0, NULL ); - } -#else Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 0, 0, NULL ); -#endif Copy_Scale_sig( exc2_fx, exc2_fx, st_fx->L_frame, sub( st_fx->Q_exc, i ) ); // Q_exc /* update past excitation signals for LD music post-filter */ @@ -705,11 +669,7 @@ ivas_error acelp_core_dec_fx( } #ifdef NONBE_FIX_GSC_BSTR -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif #else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); #endif @@ -719,11 +679,7 @@ ivas_error acelp_core_dec_fx( IF( EQ_16( st_fx->coder_type, TRANSITION ) && LT_16( tc_subfr_fx, L_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) { #ifdef NONBE_FIX_GSC_BSTR -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, TRANSITION, -1, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif #else config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); #endif @@ -815,11 +771,7 @@ ivas_error acelp_core_dec_fx( IF( st_fx->stab_fac_fx == 0 && st_fx->old_bfi_cnt > 0 && NE_16( st_fx->clas_dec, VOICED_CLAS ) && NE_16( st_fx->clas_dec, ONSET ) && st_fx->relax_prev_lsf_interp == 0 && !( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && EQ_16( st_fx->idchan, 1 ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES - int_lsp4_ivas_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); -#else int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); -#endif } /*---------------------------------------------------------------* @@ -851,11 +803,7 @@ ivas_error acelp_core_dec_fx( ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) ) { /* UNVOICED frames */ -#ifdef REMOVE_EVS_DUPLICATES - decod_unvoiced_ivas_fx( st_fx, Aq_fx, Es_pred_fx, uc_two_stage_flag, st_fx->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, gain_buf ); -#else decod_unvoiced_fx( st_fx, Aq_fx, st_fx->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, gain_buf ); -#endif } ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) { @@ -872,28 +820,16 @@ ivas_error acelp_core_dec_fx( } ELSE IF( EQ_16( st_fx->coder_type, TRANSITION ) ) { -#ifdef REMOVE_EVS_DUPLICATES - decod_tran_ivas_fx( st_fx, st_fx->L_frame, tc_subfr_fx, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf ); -#else decod_tran_fx( st_fx, st_fx->L_frame, tc_subfr_fx, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf ); -#endif } ELSE IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES - decod_audio_ivas_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf ); -#else decod_audio_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf ); -#endif tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ } ELSE { -#ifdef REMOVE_EVS_DUPLICATES - IF( NE_32( ( error = decod_gen_voic_ivas_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf, 0, NULL ) ), IVAS_ERR_OK ) ) -#else IF( NE_32( ( error = decod_gen_voic_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf /*, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf*/ ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -906,7 +842,6 @@ ivas_error acelp_core_dec_fx( /* synthesis for ACELP core switching and SWB BWE */ syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); - /* save and delay synthesis to be used by SWB BWE */ IF( hBWE_FD != NULL ) { @@ -917,11 +852,7 @@ ivas_error acelp_core_dec_fx( * Apply energy matching when switching to inactive frames *-----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode, 0, EVS_MONO ); -#else Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); -#endif /*------------------------------------------------------------* * Decode information and modify the excitation signal of stationary unvoiced frames *------------------------------------------------------------*/ @@ -1049,13 +980,9 @@ ivas_error acelp_core_dec_fx( k = add( k, 1 ); } -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); -#else - FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif + FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, + &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); test(); test(); @@ -1134,13 +1061,8 @@ ivas_error acelp_core_dec_fx( { save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); } - /* Apply energy matching when switching to inactive frames */ -#ifdef REMOVE_EVS_DUPLICATES - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode, 0, EVS_MONO ); -#else Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); -#endif /* udate past excitation signals for LD music post-filter */ IF( hMusicPF != NULL ) @@ -1214,15 +1136,9 @@ ivas_error acelp_core_dec_fx( * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); -#else FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ @@ -1317,11 +1233,7 @@ ivas_error acelp_core_dec_fx( Copy( syn_fx, temp_buf + L_SYN_MEM, L_FRAME16k ); st_fx->hPFstat->on = 1; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0 ); -#else formant_post_filt_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0 ); -#endif } ELSE IF( GE_16( st_fx->last_bwidth, WB ) ) { @@ -1383,21 +1295,13 @@ ivas_error acelp_core_dec_fx( move32(); } /*Noise estimate*/ -#ifdef REMOVE_EVS_DUPLICATES - IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) && !st_fx->cng_ism_flag ) -#else IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) /* && !st->cng_ism_flag IVAS_CODE */ ) -#endif { #ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT PMT( "Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done" ) ApplyFdCng_fx( syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); -#else -#ifdef REMOVE_EVS_DUPLICATES - ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, realBuffer, imagBuffer, NULL, st_fx, 0, ( st_fx->coder_type == AUDIO && !st_fx->GSC_noisy_speech ) ); #else ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); -#endif #endif } /* CNA: Generate additional comfort noise to mask potential coding artefacts */ @@ -1480,82 +1384,6 @@ ivas_error acelp_core_dec_fx( bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, syn_fx, st_fx->L_frame, pitch_buf_fx, st_fx->bpf_off, st_fx->stab_fac_fx, &st_fx->stab_fac_smooth_fx, st_fx->coder_type, st_fx->Q_syn, bpf_error_signal ); } - -#ifdef REMOVE_EVS_DUPLICATES - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) - { - /* analysis of the synthesis at internal sampling rate */ - cldfbAnalysisFiltering( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); - - scaleFactor.hb_scale = scaleFactor.lb_scale; - move16(); - - /* analysis and add the BPF error signal */ - i = 0; - move16(); - if ( st_fx->bpf_off == 0 ) - { - i = CLDFB_NO_COL_MAX; - move16(); - } - - addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate( st_fx->Q_syn ), - i, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &scaleFactor ); - - /* set output mask for upsampling */ - IF( EQ_16( st_fx->bwidth, NB ) ) - { - /* set NB mask for upsampling */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, 10 ); - move16(); - } - ELSE IF( NE_16( st_fx->cldfbSyn->bandsToZero, sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ) ) ) - { - /* in case of BW switching, re-init to default */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); - move16(); - } - - /*WB/SWB-FD_CNG*/ - scaleFactor.hb_scale = scaleFactor.lb_scale; - move16(); - - test(); - IF( !st_fx->cng_sba_flag || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - IF( ( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && ( EQ_16( st_fx->cng_type, FD_CNG ) ) && ( LT_16( st_fx->hFdCngDec->hFdCngCom->numCoreBands, st_fx->cldfbSyn->no_channels ) ) ) - { - generate_comfort_noise_dec_hf_fx( realBuffer, imagBuffer, &scaleFactor.hb_scale, st_fx ); - - st_fx->cldfbSyn->bandsToZero = 0; - move16(); - IF( LT_16( st_fx->hFdCngDec->hFdCngCom->regularStopBand, st_fx->cldfbSyn->no_channels ) ) - { - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->hFdCngDec->hFdCngCom->regularStopBand ); - move16(); - } - st_fx->cldfbSyn->lsb = st_fx->cldfbAna->no_channels; - move16(); - } - } - - /* synthesis of the combined signal */ - st_fx->Q_syn2 = st_fx->Q_syn; - move16(); - cldfbSynthesisFiltering( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); - - /* Bring CLDFB output to Q0 */ - Scale_sig( synth_out, output_frame, negate( st_fx->Q_syn2 ) ); - st_fx->Q_syn2 = 0; - move16(); - - /* save synthesis - needed in case of core switching */ - Copy( synth_out, st_fx->previoussynth_fx, output_frame ); - } -#else test(); IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) { @@ -1630,7 +1458,6 @@ ivas_error acelp_core_dec_fx( /* save synthesis - needed in case of core switching */ Copy( synth_out, st_fx->previoussynth_fx, output_frame ); } -#endif /*-----------------------------------------------------------------* * Bandwidth extension 6kHz-7kHz @@ -1647,33 +1474,12 @@ ivas_error acelp_core_dec_fx( IF( ( EQ_16( st_fx->L_frame, L_FRAME ) && NE_16( st_fx->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && ( EQ_16( st_fx->extl, -1 ) || EQ_16( st_fx->extl, SWB_CNG ) || ( EQ_16( st_fx->extl, WB_BWE ) && st_fx->extl_brate == 0 && NE_16( st_fx->coder_type, AUDIO ) ) ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) - { - hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, - st_fx->Q_syn2, st_fx->hBWE_zero->delay_syn_hf_fx, &st_fx->hBWE_zero->memExp1, st_fx->hBWE_zero->mem_hp_interp_fx, st_fx->extl, st_fx->CNG_mode ); - } - ELSE - { - hf_synth_reset_fx( st_fx->hBWE_zero ); - } -#else hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, st_fx->Q_syn2 ); - -#endif } -#ifdef REMOVE_EVS_DUPLICATES ELSE { hf_synth_reset_fx( st_fx->hBWE_zero ); -#ifdef MSAN_FIX - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) - { - set16_fx( st_fx->hBWE_zero->mem_hp400_fx, 0, 6 ); - } -#endif } -#endif } /*-----------------------------------------------------------------* -- GitLab From aeb3579d8691ce91d31fe54a95f1fd7be2417b5c Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 19 Mar 2025 14:39:36 +0100 Subject: [PATCH 0027/1310] clang-format --- lib_dec/acelp_core_switch_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 1a856bcda..0b0e7f1b4 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -826,7 +826,7 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( #ifdef FIX_ISSUE_1237 Copy_Scale_sig_16_32_no_sat( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) #else - Copy_Scale_sig_16_32_DEPREC( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) + Copy_Scale_sig_16_32_DEPREC( syn, syn32, L_FRAME16k, Qtmp ); // Q(11) #endif IF( NE_32( ( error = cldfb_save_memory_ivas_fx( st_fx->cldfbAna ) ), IVAS_ERR_OK ) ) { -- GitLab From 35a2935e2ff025aa9fd7b0b0524c0745f361551e Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 19 Mar 2025 14:45:27 +0100 Subject: [PATCH 0028/1310] fix merge issue causing build error --- lib_dec/acelp_core_dec_ivas_fx.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 86cbb3618..35e71287e 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -45,8 +45,6 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" -static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 old_NoiseExp ); - /*-------------------------------------------------------------------* * acelp_core_dec_ivas_fx() @@ -2589,9 +2587,3 @@ ivas_error acelp_core_dec_ivas_fx( pop_wmops(); return error; } - - -static void rescale_fdCngDec( HANDLE_FD_CNG_DEC hFdCngDec, Word16 Exp_diff ) -{ - Scale_sig32( hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, Exp_diff ); -} -- GitLab From e538224816eff3d9455bc28e81be5d5eb29c18d0 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 20 Mar 2025 11:24:07 +0100 Subject: [PATCH 0029/1310] [revert-me] change branch for getting the scripts --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91fbd0569..a42d849c6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" + BASOP_CI_BRANCH_PC_REPO: "ci/split-output-files-b4-comparison" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 -- GitLab From 7cd676169f61f8c3016e85673416355e6d3833cb Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 20 Mar 2025 11:28:53 +0100 Subject: [PATCH 0030/1310] add split comparison support to CI config --- .gitlab-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a42d849c6..7dc0f45f6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -44,6 +44,7 @@ variables: ENCODER_TEST: "" DELTA_ODG: "" COMPARE_DMX: "" + SPLIT_COMPARISON: "" SKIP_REGRESSION_CHECK: "" FAILED_TESTCASES_LIST: "failed-testcases.txt" ERRORS_TESTCASES_LIST: "errors-testcases.txt" @@ -402,6 +403,7 @@ stages: - REPORT_ARG="" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; fi # DMX comparison only in manual job with no other metrics - if [ "$COMPARE_DMX" = "true" ]; then @@ -1416,6 +1418,7 @@ ivas-pytest-compare_ref-long-enc: - DUT_DECODER_PATH=./$REF_DECODER_PATH - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - LEVEL_SCALING=1.0 + - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor ivas-pytest-compare_ref-long-dec: @@ -1427,6 +1430,7 @@ ivas-pytest-compare_ref-long-dec: - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - TEST_SUITE="$LONG_TEST_SUITE" - LEVEL_SCALING=1.0 + - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor ivas-pytest-compare_ref-long-enc-lev-10: @@ -1438,6 +1442,7 @@ ivas-pytest-compare_ref-long-enc-lev-10: - DUT_DECODER_PATH=./$REF_DECODER_PATH - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - LEVEL_SCALING=0.3162 + - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor ivas-pytest-compare_ref-long-dec-lev-10: @@ -1449,6 +1454,7 @@ ivas-pytest-compare_ref-long-dec-lev-10: - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - TEST_SUITE="$LONG_TEST_SUITE" - LEVEL_SCALING=0.3162 + - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor ivas-pytest-compare_ref-long-enc-lev+10: @@ -1460,6 +1466,7 @@ ivas-pytest-compare_ref-long-enc-lev+10: - DUT_DECODER_PATH=./$REF_DECODER_PATH - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - LEVEL_SCALING=3.162 + - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor ivas-pytest-compare_ref-long-dec-lev+10: @@ -1471,6 +1478,7 @@ ivas-pytest-compare_ref-long-dec-lev+10: - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - TEST_SUITE="$LONG_TEST_SUITE" - LEVEL_SCALING=3.162 + - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor ivas-smoke-test-saturation: -- GitLab From e73fb419ee9c8c74d68cd744eb9df07a92f68a0b Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 21 Mar 2025 11:16:02 +0100 Subject: [PATCH 0031/1310] create two sets of histograms + respective webpages --- .gitlab-ci.yml | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7dc0f45f6..15f70e917 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -371,10 +371,12 @@ stages: variables: # keep "mld" in artifact name for backwards compatibility reasons CSV_ARTIFACT_NAME: "mld--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" + CSV_ARTIFACT_SPLIT: "mld--split--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" + IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" script: - set -euxo pipefail - *print-common-info @@ -417,10 +419,29 @@ stages: - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml $comp_args -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + ### create histograms - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME $REPORT_ARG + # if split comparison is done, we need to create two pages, one for the "whole file" values and one for the "split" values + - if [ "$SPLIT_COMPARISON" = "true" ]; then + # use -v flag ("inverse") to also have the header in the output file + - grep -v "_whole" $CSV_ARTIFACT_NAME > $CSV_ARTIFACT_SPLIT + - grep -v "_split" $CSV_ARTIFACT_NAME > $CSV_ARTIFACT_NAME + - mkdir $IMAGES_ARTIFACT_SPLIT + - for MEASURE in $summary_args;do + - python3 scripts/create_histogram_summary.py $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT/summary_"$MEASURE".csv $IMAGES_ARTIFACT_SPLIT/summary_"$MEASURE".png --measure $MEASURE + - done + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_SPLIT --measures $summary_args + - else + # touch files to suppress warning for missing artifacts + - touch $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT + - fi + + # this part creates the "whole file" histograms - mkdir $IMAGES_ARTIFACT_NAME - - for MEASURE in $summary_args;do python3 scripts/create_histogram_summary.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE; done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME --measures $summary_args + - for MEASURE in $summary_args;do + - python3 scripts/create_histogram_summary.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE; + - done + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $summary_args - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) @@ -460,9 +481,11 @@ stages: - report.html - $PAGES_HTML_ARTIFACT_NAME - $CSV_ARTIFACT_NAME + - $CSV_ARTIFACT_SPLIT - $MERGED_CSV_ARTIFACT_NAME - $SUMMARY_HTML_ARTIFACT_NAME - $IMAGES_ARTIFACT_NAME + - $IMAGES_ARTIFACT_SPLIT expose_as: "pytest compare results" reports: junit: -- GitLab From 7699604cbeba5c4b0b36310220d689d2b157f8d4 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 21 Mar 2025 14:32:20 +0100 Subject: [PATCH 0032/1310] workaround for grep with input=output --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 15f70e917..33a38214e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -425,7 +425,8 @@ stages: - if [ "$SPLIT_COMPARISON" = "true" ]; then # use -v flag ("inverse") to also have the header in the output file - grep -v "_whole" $CSV_ARTIFACT_NAME > $CSV_ARTIFACT_SPLIT - - grep -v "_split" $CSV_ARTIFACT_NAME > $CSV_ARTIFACT_NAME + - cp $CSV_ARTIFACT_NAME tmp.csv + - grep -v "_split" tmp.csv > $CSV_ARTIFACT_NAME - mkdir $IMAGES_ARTIFACT_SPLIT - for MEASURE in $summary_args;do - python3 scripts/create_histogram_summary.py $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT/summary_"$MEASURE".csv $IMAGES_ARTIFACT_SPLIT/summary_"$MEASURE".png --measure $MEASURE -- GitLab From 9c244dff1eb59d3e8b6a8eebddf12a295ddf02d4 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 21 Mar 2025 14:34:00 +0100 Subject: [PATCH 0033/1310] [revert-me] limit to stereo testcases for faster testing --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33a38214e..57378accb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -224,7 +224,7 @@ stages: - enc_dmx_arg="--compare_enc_dmx" - fi - - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? + - python3 -m pytest $TEST_SUITE -k stereo -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? .update-scripts-repo: &update-scripts-repo - cd $SCRIPTS_DIR @@ -416,7 +416,7 @@ stages: ### run pytest - exit_code=0 - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml $comp_args -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? + - python3 -m pytest -k stereo --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml $comp_args -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true ### create histograms -- GitLab From cbaf8b9d93e19d7127a83fac9d21b7336ce35768 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 21 Mar 2025 16:00:36 +0100 Subject: [PATCH 0034/1310] Revert "[revert-me] limit to stereo testcases for faster testing" This reverts commit 9c244dff1eb59d3e8b6a8eebddf12a295ddf02d4. --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 57378accb..33a38214e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -224,7 +224,7 @@ stages: - enc_dmx_arg="--compare_enc_dmx" - fi - - python3 -m pytest $TEST_SUITE -k stereo -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? + - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? .update-scripts-repo: &update-scripts-repo - cd $SCRIPTS_DIR @@ -416,7 +416,7 @@ stages: ### run pytest - exit_code=0 - - python3 -m pytest -k stereo --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml $comp_args -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? + - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml $comp_args -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true ### create histograms -- GitLab From de86dcf18c360f6e5154c30de8cb8090e191ddf1 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 24 Mar 2025 08:55:42 +0100 Subject: [PATCH 0035/1310] Port fix FIX_963_USAN_ERROR to address division-by-zero in Stereo CNG --- lib_com/options.h | 1 + lib_enc/ivas_stereo_dft_enc_itd_fx.c | 32 ++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3b3adbf01..6de35cc23 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -189,6 +189,7 @@ #define FIX_929_RENDERER_CMDL /* Nokia: issue #929: renderer command line option */ #define NONBE_FIX_BINAURAL_ROOM_IR_REVERBERATOR /* FhG: re-enable acidentially disabled reverberator for BINAURAL_ROOM_IR */ #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ +#define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c index af10f7dea..2853cb989 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c @@ -1713,11 +1713,24 @@ void stereo_dft_enc_compute_itd_fx( move16(); } // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); - +#ifdef FIX_963_USAN_ERROR + IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) == 0 ) + { + cng_xcorr_filt = CORR_FILT_Q31; + move32(); + cng_xcorr_filt = L_max( cng_xcorr_filt, sfm_L ); // Q31 + } + ELSE + { + cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); + cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 + cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 + } +#else cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 - +#endif hStereoDft->currentNumUpdates = add( hStereoDft->currentNumUpdates, 1 ); move16(); FOR( i = 1; i < NFFT / 4; i++ ) @@ -1773,6 +1786,20 @@ void stereo_dft_enc_compute_itd_fx( { /* expectedNumUpdates updated after call to dtx() in SID frames */ // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); +#ifdef FIX_963_USAN_ERROR + IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) == 0 ) + { + cng_xcorr_filt = CORR_FILT_Q31; + move32(); + cng_xcorr_filt = L_max( cng_xcorr_filt, sfm_L ); // Q31 + } + ELSE + { + cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); + cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 + cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 + } +#else IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) != 0 ) { cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); @@ -1785,6 +1812,7 @@ void stereo_dft_enc_compute_itd_fx( move32(); cng_xcorr_filt = L_max( cng_xcorr_filt, sfm_L ); // Q31 } +#endif hStereoDft->currentNumUpdates = add( hStereoDft->currentNumUpdates, 1 ); move16(); hStereoDft->sfm_fx = cng_xcorr_filt; -- GitLab From 836824fdda922f165ad6ca47051bc9347298c6bc Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 24 Mar 2025 10:45:20 +0100 Subject: [PATCH 0036/1310] Added FIX_732, still work in progress --- lib_com/options.h | 1 + lib_dec/fd_cng_dec_fx.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 76bfee2ae..988f46280 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -66,6 +66,7 @@ #ifndef BASOP_NOGLOB_DEV_USE_GLOBALS #define BASOP_NOGLOB_DECLARE_LOCAL #endif +#define FIX_732 /* Eri: Fix for precision issue in CNG generation -- still work in progress */ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ //#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index c1289b8a3..574b63ab2 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1625,8 +1625,11 @@ Word16 ApplyFdCng_ivas_fx( *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } - +#ifdef FIX_732 + s2 = ( sub( WORD32_BITS, 1 ) ); +#else s2 = -( ( WORD32_BITS - 1 ) ); +#endif move16(); /* Shape the SID noise levels in each FFT bin */ j = 0; @@ -1666,7 +1669,11 @@ Word16 ApplyFdCng_ivas_fx( facTabExp[k] = -( ( WORD32_BITS - 1 ) ); move16(); } +#ifdef FIX_732 + s2 = s_min( s2, facTabExp[k] ); +#else s2 = s_max( s2, facTabExp[k] ); +#endif } if ( EQ_16( s2, -31 ) ) { @@ -1679,7 +1686,11 @@ Word16 ApplyFdCng_ivas_fx( s = s_max( s_min( s, ( WORD32_BITS - 1 ) ), -( ( WORD32_BITS - 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { +#ifdef FIX_732 + cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#endif move32(); } } @@ -1701,7 +1712,11 @@ Word16 ApplyFdCng_ivas_fx( { IF( !( LT_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) ) { +#ifdef FIX_732 + s2 = ( sub( WORD32_BITS, 1 ) ); +#else s2 = -( ( WORD32_BITS - 1 ) ); +#endif /* Shape the SID noise levels in each FFT bin */ j = 0; move16(); @@ -1740,7 +1755,11 @@ Word16 ApplyFdCng_ivas_fx( facTabExp[k] = -( WORD32_BITS - 1 ); move16(); } +#ifdef FIX_732 + s2 = s_min( s2, facTabExp[k] ); +#else s2 = s_max( s2, facTabExp[k] ); +#endif } IF( EQ_16( s2, -31 ) ) { @@ -1753,7 +1772,11 @@ Word16 ApplyFdCng_ivas_fx( s = s_max( s_min( s, sub( WORD32_BITS, 1 ) ), negate( sub( WORD32_BITS, 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { +#ifdef FIX_732 + cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#endif move32(); } } -- GitLab From ca78d64b8655295422fafd8100f4bd609b71a8c9 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 24 Mar 2025 10:53:47 +0100 Subject: [PATCH 0037/1310] [revert-me] use other branch for testing --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33a38214e..7f9c4b622 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "ci/split-output-files-b4-comparison" + BASOP_CI_BRANCH_PC_REPO: "kiene/tmp-branch-for-ltv-split-testing" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 -- GitLab From 542102d19ee03f87649465f81b357f905e50d55b Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 24 Mar 2025 10:56:26 +0100 Subject: [PATCH 0038/1310] exclude JBM from split comparison splitting is only done on wav outputs, but not on tracefiles --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7f9c4b622..18ee8f878 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -405,7 +405,7 @@ stages: - REPORT_ARG="" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k 'not JBM'" fi # DMX comparison only in manual job with no other metrics - if [ "$COMPARE_DMX" = "true" ]; then -- GitLab From 80cef4c62c104565540aed445c886e6d3876fc24 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 24 Mar 2025 12:25:04 +0100 Subject: [PATCH 0039/1310] try different env var export --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 18ee8f878..ee9864b39 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -405,7 +405,7 @@ stages: - REPORT_ARG="" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k 'not JBM'" fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k not JBM" fi # DMX comparison only in manual job with no other metrics - if [ "$COMPARE_DMX" = "true" ]; then -- GitLab From 1c525e918c69a670c88b58cf98bc4e7e088eedcd Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 24 Mar 2025 12:31:59 +0100 Subject: [PATCH 0040/1310] move reference creation to also exclude JBM cases there --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ee9864b39..95e4fa282 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -397,7 +397,6 @@ stages: - if [ "$COMPARE_DMX" = "true" ] || [ "$ENCODER_TEST" = "true" ]; then - BUILD_WITH_DEBUG_MODE_INFO="true" - fi - - *build-and-create-float-ref-outputs - comp_args="--mld --ssnr --odg" @@ -407,6 +406,8 @@ stages: - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k not JBM" fi + - *build-and-create-float-ref-outputs + # DMX comparison only in manual job with no other metrics - if [ "$COMPARE_DMX" = "true" ]; then - comp_args="--compare_enc_dmx" -- GitLab From 5c3730f6c0ac44821c85cc9af520ef5f3b368806 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 24 Mar 2025 12:37:23 +0100 Subject: [PATCH 0041/1310] fix missing ; --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 95e4fa282..5d9caaa88 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -404,7 +404,7 @@ stages: - REPORT_ARG="" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k not JBM" fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k not JBM"; fi - *build-and-create-float-ref-outputs -- GitLab From 86bf628facb296a90adc606fe831a8167539b17d Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 24 Mar 2025 12:47:04 +0100 Subject: [PATCH 0042/1310] add escaped qoutes --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5d9caaa88..836829bbc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -404,7 +404,7 @@ stages: - REPORT_ARG="" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k not JBM"; fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k \"not JBM\""; fi - *build-and-create-float-ref-outputs -- GitLab From 47bf67bd01e16f22d9733aab5bc358091631e41d Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 24 Mar 2025 15:15:28 +0100 Subject: [PATCH 0043/1310] fewer testcases for testing --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 836829bbc..f7db000f7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -404,7 +404,7 @@ stages: - REPORT_ARG="" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k \"not JBM\""; fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k \"not JBM\ and stereo and at""; fi - *build-and-create-float-ref-outputs -- GitLab From e737679cced80aae23567ec5c340f2700cfe6e05 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 25 Mar 2025 09:09:07 +0100 Subject: [PATCH 0044/1310] Add some push/pops --- lib_dec/ivas_core_dec_fx.c | 64 +++++++++++++++++++++++++++++++------- lib_dec/ivas_jbm_dec_fx.c | 20 ++++++++++-- lib_dec/swb_tbe_dec_fx.c | 2 ++ 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 588640d0a..c367125e7 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -114,12 +114,12 @@ ivas_error ivas_core_dec_fx( error = IVAS_ERR_OK; move32(); - push_wmops( "ivas_core_dec" ); + push_wmops( "ivas_core_dec (ICD)" ); /*------------------------------------------------------------------* * General initialization *-----------------------------------------------------------------*/ - + push_wmops( "ICD init" ); use_cldfb_for_dft = 0; move16(); tdm_LRTD_flag = -1; @@ -368,7 +368,9 @@ ivas_error ivas_core_dec_fx( { save_hb_synth_32_fx = NULL; } + pop_wmops(); /*push_wmops( "ICD init" );*/ + push_wmops( "ICD SID, sanity" ); /*------------------------------------------------------------------* * Decode SID for MDCT-Stereo DTX mode *-----------------------------------------------------------------*/ @@ -396,7 +398,9 @@ ivas_error ivas_core_dec_fx( { ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps ); } + pop_wmops(); /*push_wmops( "ICD SID, sanity" );*/ + push_wmops( "ICD Coredec" ); /*------------------------------------------------------------------* * Core Decoding *-----------------------------------------------------------------*/ @@ -481,6 +485,7 @@ ivas_error ivas_core_dec_fx( IF( st->core == ACELP_CORE ) { + push_wmops( "ICD ACELP" ); /* ACELP core decoder */ Word16 old_syn_12k8_16k_fx_16[L_FRAME16k]; Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx; @@ -553,14 +558,16 @@ ivas_error ivas_core_dec_fx( } Copy_Scale_sig_16_32_DEPREC( old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n], L_FRAME16k, Q11 - ( -Q1 ) ); // Q(11 - (-1)) + pop_wmops(); /*push_wmops( "ICD ACELP" );*/ } - + Copy_Scale_sig_32_16( st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0 ); // Q0 test(); test(); IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { + push_wmops( "ICD TCX" ); Word16 Qsyn_temp; IVAS_FORMAT ivas_format; @@ -615,10 +622,12 @@ ivas_error ivas_core_dec_fx( } st->hBPF->pst_mem_deemp_err_fx = extract_l( st->mem_error ); move16(); + pop_wmops(); /*push_wmops( "ICD TCX" );*/ } - + IF( EQ_16( st->core, HQ_CORE ) ) { + push_wmops( "ICD HQ decoding" ); /* HQ core decoder */ Word16 Q_output; @@ -632,6 +641,7 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 + pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ } /*---------------------------------------------------------------------* @@ -649,7 +659,7 @@ ivas_error ivas_core_dec_fx( } } /* n_channels loop */ - + pop_wmops(); /*push_wmops( "ICD Coredec" );*/ /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Decoding @@ -657,6 +667,7 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) ) { + push_wmops( "ICD jTCX Coredec" ); /* active-frame decoding */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) ) { @@ -785,6 +796,7 @@ ivas_error ivas_core_dec_fx( } } } + pop_wmops(); /*push_wmops( "ICD jTCX Coredec" );*/ } /*---------------------------------------------------------------------* @@ -794,6 +806,7 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hStereoCng != NULL ) { + push_wmops( "ICD Stereo CNG Updates" ); /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ Word16 Q_c_PS_LT, Q_output; Word32 c_PS_LT_fx; @@ -809,12 +822,14 @@ ivas_error ivas_core_dec_fx( stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx ); + pop_wmops(); /*push_wmops( "ICD Stereo CNG Updates" );*/ } /*---------------------------------------------------------------------* * Postprocessing, BWEs and updates *---------------------------------------------------------------------*/ + push_wmops( "ICD Postproc, BWE, updates (ICD PP)" ); FOR( n = 0; n < n_channels; n++ ) { st = sts[n]; @@ -825,6 +840,7 @@ ivas_error ivas_core_dec_fx( * TD-BWE for ACELP to TCX transitions *---------------------------------------------------------------------*/ + push_wmops( "ICD PP TDBWE ACELPTCX trans" ); /*core_switching_post_dec*/ Q_synth = sub( 15, e_sig[0] ); @@ -898,11 +914,12 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) ); } + pop_wmops(); /*push_wmops( "ICD PP TDBWE ACELPTCX trans" );*/ /*---------------------------------------------------------------------* * Postprocessing for ACELP/MDCT core switching *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP ACELP/MDCT switch" ); /* save synth and output in case of SBA DirAC stereo output as core switching is done outside of core decoder */ test(); test(); @@ -937,11 +954,12 @@ ivas_error ivas_core_dec_fx( { Copy( sts[0]->previoussynth_fx, sts[1]->previoussynth_fx, st->hTcxDec->L_frameTCX ); } + pop_wmops(); /*push_wmops( "ICD PP ACELP/MDCT switch" );*/ /*---------------------------------------------------------------------* * Pre-processing for bandwidth switching *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP BWswitch preproc" ); ivas_bw_switching_pre_proc_fx( st, last_element_brate, nchan_out, old_syn_12k8_16k_fx[n], old_syn_fx, q_audio ); IF( st->hHQ_core == NULL ) @@ -988,12 +1006,13 @@ ivas_error ivas_core_dec_fx( hBWE_FD->prev_flag = hBWE_FD->prev_flag; move16(); } + pop_wmops(); /*push_wmops( "ICD PP BWswitch preproc" );*/ /*---------------------------------------------------------------------* * WB TBE decoding * WB BWE decoding *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP TBE/BWE" ); Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; Word16 Q_syn_hb, sf; @@ -1021,8 +1040,9 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( st->extl, WB_TBE ) ) { /* WB TBE decoder */ - + push_wmops( "ICD PP TBE/BWE wb_tbe_dec" ); ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_tbe_dec" );*/ } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && st->bws_cnt == 0 && st->extl_brate == 0 ) { @@ -1030,8 +1050,10 @@ ivas_error ivas_core_dec_fx( } ELSE IF( EQ_16( st->extl, WB_BWE ) && st->bws_cnt == 0 ) { + push_wmops( "ICD PP TBE/BWE wb_bwe_dec" ); /* WB BWE decoder */ Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_16_fx[n], hb_synth_16_fx[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_bwe_dec" );*/ } /* Memories Re-Scaling */ @@ -1075,8 +1097,10 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) { + push_wmops( "ICD PP TBE/BWE swb_tbe_dec" ); /* SWB TBE decoder */ ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec" );*/ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11 Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx @@ -1091,18 +1115,22 @@ ivas_error ivas_core_dec_fx( /* FB TBE decoder */ IF( EQ_16( st->extl, FB_TBE ) ) { + push_wmops( "ICD PP TBE/BWE fb_tbe_dec" ); fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE fb_tbe_dec" );*/ } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) { /* SWB BWE decoder */ + push_wmops( "ICD PP TBE/BWE swb_bwe_dec" ); Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11 Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE" );*/ /*---------------------------------------------------------------------* * FEC - recovery after lost HQ core (smoothing of the BWE component) @@ -1141,6 +1169,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( GE_16( output_frame, L_FRAME32k ) && st->hTdCngDec != NULL ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && GE_16( st->bwidth, SWB ) && st->hTdCngDec != NULL ) ) { + push_wmops( "ICD PP SWB CNG" ); /* SHB CNG decoder */ Word16 synth_fxl[960]; /* Q-2 */ Word16 q; @@ -1162,6 +1191,7 @@ ivas_error ivas_core_dec_fx( Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ) ); // Q0 Copy_Scale_sig_16_32_no_sat( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ) ); + pop_wmops(); /* push_wmops( "ICD PP SWB CNG" );*/ } /*-------------------------------------------------------------------* @@ -1171,6 +1201,7 @@ ivas_error ivas_core_dec_fx( test(); IF( n == 0 && GE_16( st->element_mode, IVAS_CPE_DFT ) ) { + push_wmops( "ICD PP IC-BWE" ); Word16 q; q = 11; move16(); @@ -1192,10 +1223,12 @@ ivas_error ivas_core_dec_fx( Scale_sig32( hb_synth_32_fx[0], output_frame, sub( Q11, q ) ); // Q11 Scale_sig32( hb_synth_32_fx[1], output_frame, sub( Q11, q ) ); // Q11 } + pop_wmops(); /*push_wmops( "ICD PP IC-BWE" );*/ } IF( EQ_16( st->element_mode, EVS_MONO ) ) { + push_wmops( "ICD PP BFI" ); /*----------------------------------------------------------------* * BFI waveform adjustment *----------------------------------------------------------------*/ @@ -1223,6 +1256,7 @@ ivas_error ivas_core_dec_fx( st->hPlcInfo->Pitch_fx = 0; move16(); } + pop_wmops(); /*push_wmops( "ICD PP BFI" );*/ } /*----------------------------------------------------------------* @@ -1235,6 +1269,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( NE_16( st->extl, -1 ) && ( NE_16( st->extl, IGF_BWE ) || st->last_core == ACELP_CORE ) ) || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) { + push_wmops( "ICD PP Sync BWE" ); /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ IF( EQ_16( st->L_frame, L_FRAME ) ) { @@ -1388,6 +1423,7 @@ ivas_error ivas_core_dec_fx( st->hTdCngDec->last_shb_ener_fx_32 = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/ move32(); } + pop_wmops(); /*push_wmops( "ICD PP Sync BWE" );*/ } test(); @@ -1403,7 +1439,7 @@ ivas_error ivas_core_dec_fx( * - core switching in DFT stereo * - updates for potential TD->DFT stereo switching *----------------------------------------------------------------*/ - + push_wmops( "ICD PP TCXLTP" ); IF( st->hHQ_core != NULL ) { Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 @@ -1460,6 +1496,7 @@ ivas_error ivas_core_dec_fx( } Copy32( synth_32_fx[n], output_32_fx[n], output_frame ); + pop_wmops(); /*push_wmops( "ICD PP TCXLTP" );*/ /*--------------------------------------------------------* * Common updates @@ -1468,6 +1505,7 @@ ivas_error ivas_core_dec_fx( Word16 exp_max; Word32 output_fx_loc[L_FRAME48k]; + push_wmops( "ICD PP commonupdates" ); exp_max = 0; move16(); @@ -1522,6 +1560,8 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0 + pop_wmops(); /*push_wmops( "ICD PP commonupdates" );*/ + } /* n_channels loop */ FOR( n = 0; n < n_channels; n++ ) @@ -1540,7 +1580,7 @@ ivas_error ivas_core_dec_fx( move16(); } } - + pop_wmops(); /*push_wmops( "ICD Postproc, BWE, updates (ICD PP)" );*/ pop_wmops(); return error; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 93e8bb4eb..31ac1a768 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -96,12 +96,13 @@ ivas_error ivas_jbm_dec_tc_fx( CPE_DEC_HANDLE hCPE; SCE_DEC_HANDLE hSCE; - push_wmops( "ivas_jbm_dec_tc" ); + push_wmops( "ivas_jbm_dec_tc (JBM)" ); /*----------------------------------------------------------------* * Initialization of local vars after struct has been set *----------------------------------------------------------------*/ + push_wmops( "JBM init" ); output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; @@ -134,7 +135,7 @@ ivas_error ivas_jbm_dec_tc_fx( } Word16 ch; - + pop_wmops(); /*push_wmops( "JBM init" );*/ /*----------------------------------------------------------------* * Decoding + pre-rendering @@ -152,6 +153,7 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { + push_wmops( "JBM STEREO" ); st_ivas->hCPE[0]->element_brate = ivas_total_brate; move32(); Word16 q_output = 11; @@ -192,9 +194,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 } } + pop_wmops(); /*push_wmops( "JBM STEREO" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { + push_wmops( "JBM ISM" ); /* Metadata decoding and configuration */ test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) @@ -279,9 +283,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } + pop_wmops();/*push_wmops( "JBM ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { + push_wmops( "JBM SBA/MASA" ); set16_fx( nb_bits_metadata, 0, MAX_SCE ); @@ -688,9 +694,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } + pop_wmops();/*push_wmops( "JBM SBA/MASA" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { + push_wmops( "JBM MASA_ISM" ); Word16 nchan_ism, nchan_transport_ism; Word16 dirac_bs_md_write_idx; @@ -821,9 +829,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); // Q11 } } + pop_wmops(); /*push_wmops( "JBM MASA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { + push_wmops( "JBM SBA_ISM" ); Word16 nchan_ism, sba_ch_idx; set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); @@ -1092,10 +1102,11 @@ ivas_error ivas_jbm_dec_tc_fx( v_add_32( p_output_fx[n], p_output_fx[n + s_max( nchan_out, nchan_ism )], p_output_fx[n], output_frame ); } } + pop_wmops(); /*push_wmops( "JBM SBA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - + push_wmops( "JBM MC" ); // st = (st_ivas->nSCE > 0) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; IF( st_ivas->nSCE > 0 ) { @@ -1468,6 +1479,7 @@ ivas_error ivas_jbm_dec_tc_fx( ivas_mono_stereo_downmix_mcmasa_fx( st_ivas, p_output_fx, output_frame ); } } + pop_wmops(); /*push_wmops( "JBM MC" );*/ } /*----------------------------------------------------------------* @@ -1476,7 +1488,9 @@ ivas_error ivas_jbm_dec_tc_fx( IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 1 ) ) { + push_wmops( "JBM syn_out" ); ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); + pop_wmops();/*push_wmops( "JBM syn_out" );*/ } ELSE { diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1b51a29fb..1e7af58c8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4713,7 +4713,9 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ + push_wmops( "synthesise_fb_high_band" ); synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) -- GitLab From 3a315e7b4f6b65f2fab68da9a828595775b655d3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 25 Mar 2025 09:29:47 +0100 Subject: [PATCH 0045/1310] apply clang format patch --- lib_dec/ivas_core_dec_fx.c | 12 ++++++------ lib_dec/ivas_jbm_dec_fx.c | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index c367125e7..c0686bdfd 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -558,9 +558,9 @@ ivas_error ivas_core_dec_fx( } Copy_Scale_sig_16_32_DEPREC( old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n], L_FRAME16k, Q11 - ( -Q1 ) ); // Q(11 - (-1)) - pop_wmops(); /*push_wmops( "ICD ACELP" );*/ + pop_wmops(); /*push_wmops( "ICD ACELP" );*/ } - + Copy_Scale_sig_32_16( st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0 ); // Q0 test(); @@ -624,7 +624,7 @@ ivas_error ivas_core_dec_fx( move16(); pop_wmops(); /*push_wmops( "ICD TCX" );*/ } - + IF( EQ_16( st->core, HQ_CORE ) ) { push_wmops( "ICD HQ decoding" ); @@ -641,7 +641,7 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 - pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ + pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ } /*---------------------------------------------------------------------* @@ -658,7 +658,7 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 } - } /* n_channels loop */ + } /* n_channels loop */ pop_wmops(); /*push_wmops( "ICD Coredec" );*/ /*---------------------------------------------------------------------* @@ -1125,7 +1125,7 @@ ivas_error ivas_core_dec_fx( /* SWB BWE decoder */ push_wmops( "ICD PP TBE/BWE swb_bwe_dec" ); Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11 Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 31ac1a768..4745bc5f0 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -283,7 +283,7 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops();/*push_wmops( "JBM ISM" );*/ + pop_wmops(); /*push_wmops( "JBM ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { @@ -694,7 +694,7 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops();/*push_wmops( "JBM SBA/MASA" );*/ + pop_wmops(); /*push_wmops( "JBM SBA/MASA" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { @@ -1490,7 +1490,7 @@ ivas_error ivas_jbm_dec_tc_fx( { push_wmops( "JBM syn_out" ); ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); - pop_wmops();/*push_wmops( "JBM syn_out" );*/ + pop_wmops(); /*push_wmops( "JBM syn_out" );*/ } ELSE { -- GitLab From 74e7078328609715793fb3388b4b6fc52bc8880f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 25 Mar 2025 12:58:54 +0100 Subject: [PATCH 0046/1310] add FIX_1439_SPEEDUP_elliptic_bpf_48k_generic STAGE1 --- lib_com/swb_tbe_com_fx.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2a2841966..d066448c1 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6693,6 +6693,8 @@ void wb_tbe_extras_reset_synth_fx( * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic + void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -6721,6 +6723,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6763,6 +6766,24 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic //STAGE1 + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY = W_add( 0, 0 ); + W_tmpX = W_deposit32_l( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ) ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_sub( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 ) ) ); /*Q_input_fx + 11*/ + move32(); + } +#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6776,6 +6797,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } +#endif + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -7004,6 +7027,7 @@ void synthesise_fb_high_band_fx( Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" ); /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7019,6 +7043,7 @@ void synthesise_fb_high_band_fx( } exp_tmp = sub( Q_fb_exc, 2 ); + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" ); IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ @@ -7029,6 +7054,10 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ + + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); temp1 = sum2_fx_mod( tmp, L_FRAME48k ); L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ @@ -7085,6 +7114,7 @@ void synthesise_fb_high_band_fx( move16(); } } + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; } -- GitLab From 446323f00943955d97a8db2069a04c13daca77a4 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 25 Mar 2025 13:04:15 +0100 Subject: [PATCH 0047/1310] apply clang format patch --- lib_com/swb_tbe_com_fx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d066448c1..90d703cdd 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6766,7 +6766,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic //STAGE1 +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic // STAGE1 FOR( i = 4; i < L_FRAME48k; i++ ) { Word64 W_tmpX; @@ -6797,7 +6797,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } -#endif +#endif memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; @@ -7054,10 +7054,10 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); temp1 = sum2_fx_mod( tmp, L_FRAME48k ); L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ -- GitLab From 9938e11dacdd2d926276133ae94515f158f69647 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 25 Mar 2025 14:32:11 +0100 Subject: [PATCH 0048/1310] fix FIX_1439_SPEEDUP_elliptic_bpf_48k_generic STAGE1 --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 90d703cdd..3f0bcf66c 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6780,7 +6780,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_sub( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); } #else -- GitLab From ff8566555dc4026028908632573ba986fcce3c9b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 25 Mar 2025 15:51:45 +0100 Subject: [PATCH 0049/1310] introduced FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 and FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3, also FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 --- lib_com/prot_fx.h | 16 +++++++++ lib_com/swb_tbe_com_fx.c | 70 +++++++++++++++++++++++++++++++++++----- lib_enc/swb_tbe_enc_fx.c | 13 +++++++- 3 files changed, 90 insertions(+), 9 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index d7ed9a140..0baa329fd 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,6 +59,10 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 /*----------------------------------------------------------------------------------* * Prototypes of global macros @@ -3258,6 +3262,17 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 +void elliptic_bpf_48k_generic_fx( + const Word16* input_fx, /* i : i signal Q_input_fx */ + Word16 *Q_input_fx, + Word16 output_fx[], /* o : output signal */ + Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ + Word16 memory_fx_Q[], + const Word16 full_band_bpf[][5], /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ + const Word32 *output32_fx, + const Word16 *scale_output32_fx); +#else void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : i signal Q_input_fx */ Word16 *Q_input_fx, @@ -3266,6 +3281,7 @@ void elliptic_bpf_48k_generic_fx( Word16 memory_fx_Q[], const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ); +#endif void synthesise_fb_high_band_fx( const Word16 excitation_in[], /* i : full band excitation */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 3f0bcf66c..1dbe841a3 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -18,6 +18,8 @@ #define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ + + /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ @@ -6692,9 +6694,8 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ - -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic - +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 +#else void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -6703,6 +6704,7 @@ void elliptic_bpf_48k_generic_fx( Word16 memory_fx_Q[], const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ) +#endif { Word16 i, j; Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; @@ -6766,14 +6768,14 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic // STAGE1 +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 FOR( i = 4; i < L_FRAME48k; i++ ) { Word64 W_tmpX; - Word64 W_tmpY = W_add( 0, 0 ); - W_tmpX = W_deposit32_l( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ) ); + Word64 W_tmpY; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); @@ -6853,6 +6855,26 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6867,7 +6889,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } - +#endif Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -6936,7 +6958,29 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -6954,6 +6998,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } +#endif memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -7047,12 +7092,21 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, NULL, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx, tmp32, scale_tmp32 ); +#else elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); +#endif } ELSE { /* for 12.8kHz ACELP core */ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, NULL, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx, tmp32, scale_tmp32 ); +#else elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); +#endif + } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 2b8f487bd..5d860c96f 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7324,8 +7324,11 @@ void fb_tbe_enc_fx( exp_temp = sub( exp_temp, 1 ); Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx, NULL, NULL ); +#else elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#endif Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7449,11 +7452,19 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx, NULL, NULL ); +#else elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#endif } ELSE { +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx, NULL, NULL ); +#else elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#endif } test(); -- GitLab From e3f013ae239351874fd1d87cc7abe9d7f1e1ce3d Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 25 Mar 2025 15:52:19 +0100 Subject: [PATCH 0050/1310] deactivated all speedups --- lib_com/prot_fx.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 0baa329fd..e3d0668a1 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,9 +59,9 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 /*----------------------------------------------------------------------------------* -- GitLab From 44ade3447be3a5b798713ca270cc025965076141 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 11:33:01 +0100 Subject: [PATCH 0051/1310] introduce FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig and FIX_1439_SPEEDUP_sum2_fx_mod , delete FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 - activate FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig which should be BE --- lib_com/prot_fx.h | 20 ++-- lib_com/swb_tbe_com_fx.c | 214 +++++++++++++++++++++++++++++++++------ lib_com/tools_fx.c | 18 +++- lib_enc/swb_tbe_enc_fx.c | 12 --- 4 files changed, 205 insertions(+), 59 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index e3d0668a1..567545b60 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -62,7 +62,13 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +//#define FIX_1439_SPEEDUP_sum2_fx_mod // 3liner // 0.25 WMOPS + +// Numbers ALL: 83,2 +// Numbers beOnly: 86,162 +// NUmbers none: 88,183 + /*----------------------------------------------------------------------------------* * Prototypes of global macros @@ -3262,17 +3268,6 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 -void elliptic_bpf_48k_generic_fx( - const Word16* input_fx, /* i : i signal Q_input_fx */ - Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal */ - Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ - Word16 memory_fx_Q[], - const Word16 full_band_bpf[][5], /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ - const Word32 *output32_fx, - const Word16 *scale_output32_fx); -#else void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : i signal Q_input_fx */ Word16 *Q_input_fx, @@ -3281,7 +3276,6 @@ void elliptic_bpf_48k_generic_fx( Word16 memory_fx_Q[], const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ); -#endif void synthesise_fb_high_band_fx( const Word16 excitation_in[], /* i : full band excitation */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1dbe841a3..a0ae3dd10 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6694,8 +6694,6 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 -#else void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -6704,12 +6702,12 @@ void elliptic_bpf_48k_generic_fx( Word16 memory_fx_Q[], const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ) -#endif { Word16 i, j; Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; + Word32 L_output[L_FRAME48k]; FOR( i = 0; i < 4; i++ ) { @@ -6769,36 +6767,190 @@ void elliptic_bpf_48k_generic_fx( L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 - FOR( i = 4; i < L_FRAME48k; i++ ) +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { Word64 W_tmpX; Word64 W_tmpY; + i = 4; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); + i++; + + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + FOR( ; i < L_FRAME48k / 3; ) + { + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //2 + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); // 3 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //4 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //5 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); // 3 + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //4 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //5 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //4 + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //5 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //7 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } } + ELSE #else - FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + } + } +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + { + i = 4; + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //1 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + FOR( ; i < L_FRAME48k / 3; ) + { + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //4 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //8 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } } + ELSE +#else + { + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } + } +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ #endif @@ -6857,6 +7009,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 4; i < L_FRAME48k; i++ ) { Word64 W_tmpX; @@ -6874,7 +7027,8 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } -#else + +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6889,7 +7043,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } -#endif +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -7025,11 +7179,14 @@ void elliptic_bpf_48k_generic_fx( move16(); move16(); Q_temp2 = norm_l( L_tmpMax ); - Scale_sig32( L_output, 960, Q_temp2 ); - FOR( i = 0; i < 960; i++ ) + { - output_fx[i] = extract_h( L_output[i] ); - move16(); + Scale_sig32( L_output, 960, Q_temp2 ); + FOR( i = 0; i < 960; i++ ) + { + output_fx[i] = extract_h( L_output[i] ); + move16(); + } } *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); move16(); /* BASOP_NOGLOB */ @@ -7066,11 +7223,11 @@ void synthesise_fb_high_band_fx( { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; - Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; + Word16 tmp[L_FRAME48k]; push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" ); /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ @@ -7092,20 +7249,12 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, NULL, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx, tmp32, scale_tmp32 ); -#else elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); -#endif } ELSE { /* for 12.8kHz ACELP core */ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, NULL, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx, tmp32, scale_tmp32 ); -#else elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); -#endif } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ @@ -7113,7 +7262,6 @@ void synthesise_fb_high_band_fx( push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); temp1 = sum2_fx_mod( tmp, L_FRAME48k ); - L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 5219d076c..23c2accb2 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -446,6 +446,21 @@ Word32 sum2_fx_mod( /* o : sum of all squared vector element const Word16 lvec /* i : length of input vector */ ) { +#ifdef FIX_1439_SPEEDUP_sum2_fx_mod + Word16 i; + Word64 W_tmp; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + W_tmp = W_add(0, 0 ); + FOR( i = 0; i < lvec; i++ ) + { + W_tmp = W_mac_16_16( W_tmp, vec[i], vec[i] ); + } + return W_sat_l(W_shr(W_tmp, 9)); +#else Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL @@ -458,8 +473,9 @@ Word32 sum2_fx_mod( /* o : sum of all squared vector element { L_tmp = L_add_o( L_tmp, L_shr( L_mult_o( vec[i], vec[i], &Overflow ), 9 ), &Overflow ); } - return L_tmp; +#endif + } /*-------------------------------------------------------------------* * Copy: diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 5d860c96f..6d4761c2f 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7324,11 +7324,7 @@ void fb_tbe_enc_fx( exp_temp = sub( exp_temp, 1 ); Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx, NULL, NULL ); -#else elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#endif Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7452,19 +7448,11 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx, NULL, NULL ); -#else elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#endif } ELSE { -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_OUT32 - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx, NULL, NULL ); -#else elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#endif } test(); -- GitLab From 15247b5509c25c3e30b44bd9b8a797dbe87c8f1b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 11:35:58 +0100 Subject: [PATCH 0052/1310] apply clang format patch --- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 6 ++---- lib_com/tools_fx.c | 5 ++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 29ca3986d..4151de02e 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -62,7 +62,7 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS //#define FIX_1439_SPEEDUP_sum2_fx_mod // 3liner // 0.25 WMOPS // Numbers ALL: 83,2 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a0ae3dd10..0c7e1befc 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -19,7 +19,6 @@ #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ - /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ @@ -6954,7 +6953,7 @@ void elliptic_bpf_48k_generic_fx( #endif - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; @@ -7028,7 +7027,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7255,7 +7254,6 @@ void synthesise_fb_high_band_fx( { /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); - } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 23c2accb2..7ffc10700 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -454,12 +454,12 @@ Word32 sum2_fx_mod( /* o : sum of all squared vector element move32(); #endif - W_tmp = W_add(0, 0 ); + W_tmp = W_add( 0, 0 ); FOR( i = 0; i < lvec; i++ ) { W_tmp = W_mac_16_16( W_tmp, vec[i], vec[i] ); } - return W_sat_l(W_shr(W_tmp, 9)); + return W_sat_l( W_shr( W_tmp, 9 ) ); #else Word16 i; Word32 L_tmp; @@ -475,7 +475,6 @@ Word32 sum2_fx_mod( /* o : sum of all squared vector element } return L_tmp; #endif - } /*-------------------------------------------------------------------* * Copy: -- GitLab From d9be131549ca6401e0183bde59701f8c61605f29 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 11:39:18 +0100 Subject: [PATCH 0053/1310] one instruction less in FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 0c7e1befc..1b61b2bb8 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6896,7 +6896,7 @@ void elliptic_bpf_48k_generic_fx( FOR( ; i < L_FRAME48k / 3; ) { // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -- GitLab From e8ff93c5c166e7c3ad888d8d3d5f3064c5615a21 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 11:41:22 +0100 Subject: [PATCH 0054/1310] apply clang format patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1b61b2bb8..b5a658136 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6896,7 +6896,7 @@ void elliptic_bpf_48k_generic_fx( FOR( ; i < L_FRAME48k / 3; ) { // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -- GitLab From b5f196f20774a9426f7107654c76857cf7b787a6 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 11:57:41 +0100 Subject: [PATCH 0055/1310] deactivated all speedups --- lib_com/prot_fx.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 4151de02e..d57f93d91 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -62,11 +62,11 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS //#define FIX_1439_SPEEDUP_sum2_fx_mod // 3liner // 0.25 WMOPS // Numbers ALL: 83,2 -// Numbers beOnly: 86,162 +// Numbers beOnly: 86,156 // NUmbers none: 88,183 -- GitLab From d64e1fa0fd98594c6fe4a99c5f016da8d1a3d80d Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 11:09:24 +0000 Subject: [PATCH 0056/1310] del macro FIX_1439_SPEEDUP_sum2_fx_mod --- lib_com/prot_fx.h | 3 +-- lib_com/swb_tbe_com_fx.c | 3 --- lib_com/tools_fx.c | 17 +---------------- lib_enc/swb_tbe_enc_fx.c | 1 + 4 files changed, 3 insertions(+), 21 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index d57f93d91..b64de07f8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -63,9 +63,8 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS -//#define FIX_1439_SPEEDUP_sum2_fx_mod // 3liner // 0.25 WMOPS -// Numbers ALL: 83,2 +// Numbers ALL: 83,45 // Numbers beOnly: 86,156 // NUmbers none: 88,183 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index b5a658136..e2221a33c 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7178,14 +7178,11 @@ void elliptic_bpf_48k_generic_fx( move16(); move16(); Q_temp2 = norm_l( L_tmpMax ); - - { Scale_sig32( L_output, 960, Q_temp2 ); FOR( i = 0; i < 960; i++ ) { output_fx[i] = extract_h( L_output[i] ); move16(); - } } *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); move16(); /* BASOP_NOGLOB */ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 7ffc10700..5219d076c 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -446,21 +446,6 @@ Word32 sum2_fx_mod( /* o : sum of all squared vector element const Word16 lvec /* i : length of input vector */ ) { -#ifdef FIX_1439_SPEEDUP_sum2_fx_mod - Word16 i; - Word64 W_tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - W_tmp = W_add( 0, 0 ); - FOR( i = 0; i < lvec; i++ ) - { - W_tmp = W_mac_16_16( W_tmp, vec[i], vec[i] ); - } - return W_sat_l( W_shr( W_tmp, 9 ) ); -#else Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL @@ -473,8 +458,8 @@ Word32 sum2_fx_mod( /* o : sum of all squared vector element { L_tmp = L_add_o( L_tmp, L_shr( L_mult_o( vec[i], vec[i], &Overflow ), 9 ), &Overflow ); } + return L_tmp; -#endif } /*-------------------------------------------------------------------* * Copy: diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 542eee644..c5d5e651e 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7324,6 +7324,7 @@ void fb_tbe_enc_fx( exp_temp = sub( exp_temp, 1 ); Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; -- GitLab From 7ba6c5a392d1f689a24ede6adabc91872876e7ed Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 12:11:27 +0100 Subject: [PATCH 0057/1310] apply clang format patch --- lib_com/swb_tbe_com_fx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e2221a33c..6dda9a39f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7178,11 +7178,11 @@ void elliptic_bpf_48k_generic_fx( move16(); move16(); Q_temp2 = norm_l( L_tmpMax ); - Scale_sig32( L_output, 960, Q_temp2 ); - FOR( i = 0; i < 960; i++ ) - { - output_fx[i] = extract_h( L_output[i] ); - move16(); + Scale_sig32( L_output, 960, Q_temp2 ); + FOR( i = 0; i < 960; i++ ) + { + output_fx[i] = extract_h( L_output[i] ); + move16(); } *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); move16(); /* BASOP_NOGLOB */ -- GitLab From ad8bba9cfa444272263390af7345b25b115ffad4 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 12:30:58 +0100 Subject: [PATCH 0058/1310] delete FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig --- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 184 ++++----------------------------------- 2 files changed, 16 insertions(+), 170 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index b64de07f8..8a282fac6 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -62,7 +62,7 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS - deleted completely // Numbers ALL: 83,45 // Numbers beOnly: 86,156 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 6dda9a39f..b2a414afe 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6766,194 +6766,40 @@ void elliptic_bpf_48k_generic_fx( L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + FOR( i = 4; i < L_FRAME48k; i++ ) { Word64 W_tmpX; Word64 W_tmpY; - i = 4; - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); - i++; - - FOR( ; i < L_FRAME48k / 3; ) - { - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //2 - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); // 3 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //4 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //5 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); // 3 - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //4 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //5 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //4 - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //5 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //7 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } } - ELSE -#else - { - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - } - } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ #else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) - { - i = 4; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //1 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - i++; - - FOR( ; i < L_FRAME48k / 3; ) - { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //4 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //8 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } - } - ELSE -#else - { - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ #endif - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; -- GitLab From eaa539013d7c11e202990bb7fad44a7322a70fad Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 12:34:52 +0100 Subject: [PATCH 0059/1310] follow-up: apply clang format patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index b2a414afe..9a54a26f6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6782,7 +6782,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); } -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 82e1f8758cacf2127fd0509672fd3bf5897850cd Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 12:42:39 +0100 Subject: [PATCH 0060/1310] delete FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1, STAGE2 and STAGE 3 completely --- lib_com/prot_fx.h | 6 ++-- lib_com/swb_tbe_com_fx.c | 68 ++-------------------------------------- 2 files changed, 6 insertions(+), 68 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 8a282fac6..48232000a 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,9 +59,9 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //deleted completely +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //deleted completely +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //deleted completely //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS - deleted completely // Numbers ALL: 83,45 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 9a54a26f6..f2b850533 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6765,24 +6765,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - } -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6796,8 +6779,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } -#endif - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6853,27 +6834,6 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 - - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } - -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6888,7 +6848,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ + Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -6957,29 +6917,7 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -6997,7 +6935,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -#endif + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; -- GitLab From 00f17224f34a586a272a98c13c2cad6b3d645336 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 11:52:15 +0000 Subject: [PATCH 0061/1310] del all changes --- lib_com/prot_fx.h | 9 ------ lib_com/swb_tbe_com_fx.c | 19 +++--------- lib_dec/ivas_core_dec_fx.c | 62 +++++++------------------------------- lib_dec/ivas_jbm_dec_fx.c | 20 ++---------- lib_dec/swb_tbe_dec_fx.c | 2 -- 5 files changed, 18 insertions(+), 94 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 48232000a..851b461bf 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,15 +59,6 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //deleted completely -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //deleted completely -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //deleted completely -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS - deleted completely - -// Numbers ALL: 83,45 -// Numbers beOnly: 86,156 -// NUmbers none: 88,183 - /*----------------------------------------------------------------------------------* * Prototypes of global macros diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index f2b850533..2a2841966 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -18,7 +18,6 @@ #define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ - /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ @@ -6693,6 +6692,7 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ + void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -6704,9 +6704,8 @@ void elliptic_bpf_48k_generic_fx( { Word16 i, j; Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; - Word32 L_output[L_FRAME48k]; FOR( i = 0; i < 4; i++ ) { @@ -6722,7 +6721,6 @@ void elliptic_bpf_48k_generic_fx( move32(); } - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6765,7 +6763,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6833,7 +6830,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6935,7 +6931,6 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -7003,13 +6998,12 @@ void synthesise_fb_high_band_fx( { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; + Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; - Word16 tmp[L_FRAME48k]; - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" ); /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7025,7 +7019,6 @@ void synthesise_fb_high_band_fx( } exp_tmp = sub( Q_fb_exc, 2 ); - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" ); IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ @@ -7036,11 +7029,8 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ - - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); temp1 = sum2_fx_mod( tmp, L_FRAME48k ); + L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); @@ -7095,7 +7085,6 @@ void synthesise_fb_high_band_fx( move16(); } } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; } diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index c0686bdfd..588640d0a 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -114,12 +114,12 @@ ivas_error ivas_core_dec_fx( error = IVAS_ERR_OK; move32(); - push_wmops( "ivas_core_dec (ICD)" ); + push_wmops( "ivas_core_dec" ); /*------------------------------------------------------------------* * General initialization *-----------------------------------------------------------------*/ - push_wmops( "ICD init" ); + use_cldfb_for_dft = 0; move16(); tdm_LRTD_flag = -1; @@ -368,9 +368,7 @@ ivas_error ivas_core_dec_fx( { save_hb_synth_32_fx = NULL; } - pop_wmops(); /*push_wmops( "ICD init" );*/ - push_wmops( "ICD SID, sanity" ); /*------------------------------------------------------------------* * Decode SID for MDCT-Stereo DTX mode *-----------------------------------------------------------------*/ @@ -398,9 +396,7 @@ ivas_error ivas_core_dec_fx( { ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps ); } - pop_wmops(); /*push_wmops( "ICD SID, sanity" );*/ - push_wmops( "ICD Coredec" ); /*------------------------------------------------------------------* * Core Decoding *-----------------------------------------------------------------*/ @@ -485,7 +481,6 @@ ivas_error ivas_core_dec_fx( IF( st->core == ACELP_CORE ) { - push_wmops( "ICD ACELP" ); /* ACELP core decoder */ Word16 old_syn_12k8_16k_fx_16[L_FRAME16k]; Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx; @@ -558,7 +553,6 @@ ivas_error ivas_core_dec_fx( } Copy_Scale_sig_16_32_DEPREC( old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n], L_FRAME16k, Q11 - ( -Q1 ) ); // Q(11 - (-1)) - pop_wmops(); /*push_wmops( "ICD ACELP" );*/ } Copy_Scale_sig_32_16( st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0 ); // Q0 @@ -567,7 +561,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - push_wmops( "ICD TCX" ); Word16 Qsyn_temp; IVAS_FORMAT ivas_format; @@ -622,12 +615,10 @@ ivas_error ivas_core_dec_fx( } st->hBPF->pst_mem_deemp_err_fx = extract_l( st->mem_error ); move16(); - pop_wmops(); /*push_wmops( "ICD TCX" );*/ } IF( EQ_16( st->core, HQ_CORE ) ) { - push_wmops( "ICD HQ decoding" ); /* HQ core decoder */ Word16 Q_output; @@ -641,7 +632,6 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 - pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ } /*---------------------------------------------------------------------* @@ -658,8 +648,8 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 } - } /* n_channels loop */ - pop_wmops(); /*push_wmops( "ICD Coredec" );*/ + } /* n_channels loop */ + /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Decoding @@ -667,7 +657,6 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) ) { - push_wmops( "ICD jTCX Coredec" ); /* active-frame decoding */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) ) { @@ -796,7 +785,6 @@ ivas_error ivas_core_dec_fx( } } } - pop_wmops(); /*push_wmops( "ICD jTCX Coredec" );*/ } /*---------------------------------------------------------------------* @@ -806,7 +794,6 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hStereoCng != NULL ) { - push_wmops( "ICD Stereo CNG Updates" ); /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ Word16 Q_c_PS_LT, Q_output; Word32 c_PS_LT_fx; @@ -822,14 +809,12 @@ ivas_error ivas_core_dec_fx( stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx ); - pop_wmops(); /*push_wmops( "ICD Stereo CNG Updates" );*/ } /*---------------------------------------------------------------------* * Postprocessing, BWEs and updates *---------------------------------------------------------------------*/ - push_wmops( "ICD Postproc, BWE, updates (ICD PP)" ); FOR( n = 0; n < n_channels; n++ ) { st = sts[n]; @@ -840,7 +825,6 @@ ivas_error ivas_core_dec_fx( * TD-BWE for ACELP to TCX transitions *---------------------------------------------------------------------*/ - push_wmops( "ICD PP TDBWE ACELPTCX trans" ); /*core_switching_post_dec*/ Q_synth = sub( 15, e_sig[0] ); @@ -914,12 +898,11 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) ); } - pop_wmops(); /*push_wmops( "ICD PP TDBWE ACELPTCX trans" );*/ /*---------------------------------------------------------------------* * Postprocessing for ACELP/MDCT core switching *---------------------------------------------------------------------*/ - push_wmops( "ICD PP ACELP/MDCT switch" ); + /* save synth and output in case of SBA DirAC stereo output as core switching is done outside of core decoder */ test(); test(); @@ -954,12 +937,11 @@ ivas_error ivas_core_dec_fx( { Copy( sts[0]->previoussynth_fx, sts[1]->previoussynth_fx, st->hTcxDec->L_frameTCX ); } - pop_wmops(); /*push_wmops( "ICD PP ACELP/MDCT switch" );*/ /*---------------------------------------------------------------------* * Pre-processing for bandwidth switching *---------------------------------------------------------------------*/ - push_wmops( "ICD PP BWswitch preproc" ); + ivas_bw_switching_pre_proc_fx( st, last_element_brate, nchan_out, old_syn_12k8_16k_fx[n], old_syn_fx, q_audio ); IF( st->hHQ_core == NULL ) @@ -1006,13 +988,12 @@ ivas_error ivas_core_dec_fx( hBWE_FD->prev_flag = hBWE_FD->prev_flag; move16(); } - pop_wmops(); /*push_wmops( "ICD PP BWswitch preproc" );*/ /*---------------------------------------------------------------------* * WB TBE decoding * WB BWE decoding *---------------------------------------------------------------------*/ - push_wmops( "ICD PP TBE/BWE" ); + Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; Word16 Q_syn_hb, sf; @@ -1040,9 +1021,8 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( st->extl, WB_TBE ) ) { /* WB TBE decoder */ - push_wmops( "ICD PP TBE/BWE wb_tbe_dec" ); + ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_tbe_dec" );*/ } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && st->bws_cnt == 0 && st->extl_brate == 0 ) { @@ -1050,10 +1030,8 @@ ivas_error ivas_core_dec_fx( } ELSE IF( EQ_16( st->extl, WB_BWE ) && st->bws_cnt == 0 ) { - push_wmops( "ICD PP TBE/BWE wb_bwe_dec" ); /* WB BWE decoder */ Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_16_fx[n], hb_synth_16_fx[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_bwe_dec" );*/ } /* Memories Re-Scaling */ @@ -1097,10 +1075,8 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) { - push_wmops( "ICD PP TBE/BWE swb_tbe_dec" ); /* SWB TBE decoder */ ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec" );*/ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11 Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx @@ -1115,22 +1091,18 @@ ivas_error ivas_core_dec_fx( /* FB TBE decoder */ IF( EQ_16( st->extl, FB_TBE ) ) { - push_wmops( "ICD PP TBE/BWE fb_tbe_dec" ); fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE fb_tbe_dec" );*/ } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) { /* SWB BWE decoder */ - push_wmops( "ICD PP TBE/BWE swb_bwe_dec" ); Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ + Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11 Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE" );*/ /*---------------------------------------------------------------------* * FEC - recovery after lost HQ core (smoothing of the BWE component) @@ -1169,7 +1141,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( GE_16( output_frame, L_FRAME32k ) && st->hTdCngDec != NULL ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && GE_16( st->bwidth, SWB ) && st->hTdCngDec != NULL ) ) { - push_wmops( "ICD PP SWB CNG" ); /* SHB CNG decoder */ Word16 synth_fxl[960]; /* Q-2 */ Word16 q; @@ -1191,7 +1162,6 @@ ivas_error ivas_core_dec_fx( Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ) ); // Q0 Copy_Scale_sig_16_32_no_sat( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ) ); - pop_wmops(); /* push_wmops( "ICD PP SWB CNG" );*/ } /*-------------------------------------------------------------------* @@ -1201,7 +1171,6 @@ ivas_error ivas_core_dec_fx( test(); IF( n == 0 && GE_16( st->element_mode, IVAS_CPE_DFT ) ) { - push_wmops( "ICD PP IC-BWE" ); Word16 q; q = 11; move16(); @@ -1223,12 +1192,10 @@ ivas_error ivas_core_dec_fx( Scale_sig32( hb_synth_32_fx[0], output_frame, sub( Q11, q ) ); // Q11 Scale_sig32( hb_synth_32_fx[1], output_frame, sub( Q11, q ) ); // Q11 } - pop_wmops(); /*push_wmops( "ICD PP IC-BWE" );*/ } IF( EQ_16( st->element_mode, EVS_MONO ) ) { - push_wmops( "ICD PP BFI" ); /*----------------------------------------------------------------* * BFI waveform adjustment *----------------------------------------------------------------*/ @@ -1256,7 +1223,6 @@ ivas_error ivas_core_dec_fx( st->hPlcInfo->Pitch_fx = 0; move16(); } - pop_wmops(); /*push_wmops( "ICD PP BFI" );*/ } /*----------------------------------------------------------------* @@ -1269,7 +1235,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( NE_16( st->extl, -1 ) && ( NE_16( st->extl, IGF_BWE ) || st->last_core == ACELP_CORE ) ) || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) { - push_wmops( "ICD PP Sync BWE" ); /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ IF( EQ_16( st->L_frame, L_FRAME ) ) { @@ -1423,7 +1388,6 @@ ivas_error ivas_core_dec_fx( st->hTdCngDec->last_shb_ener_fx_32 = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/ move32(); } - pop_wmops(); /*push_wmops( "ICD PP Sync BWE" );*/ } test(); @@ -1439,7 +1403,7 @@ ivas_error ivas_core_dec_fx( * - core switching in DFT stereo * - updates for potential TD->DFT stereo switching *----------------------------------------------------------------*/ - push_wmops( "ICD PP TCXLTP" ); + IF( st->hHQ_core != NULL ) { Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 @@ -1496,7 +1460,6 @@ ivas_error ivas_core_dec_fx( } Copy32( synth_32_fx[n], output_32_fx[n], output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TCXLTP" );*/ /*--------------------------------------------------------* * Common updates @@ -1505,7 +1468,6 @@ ivas_error ivas_core_dec_fx( Word16 exp_max; Word32 output_fx_loc[L_FRAME48k]; - push_wmops( "ICD PP commonupdates" ); exp_max = 0; move16(); @@ -1560,8 +1522,6 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0 - pop_wmops(); /*push_wmops( "ICD PP commonupdates" );*/ - } /* n_channels loop */ FOR( n = 0; n < n_channels; n++ ) @@ -1580,7 +1540,7 @@ ivas_error ivas_core_dec_fx( move16(); } } - pop_wmops(); /*push_wmops( "ICD Postproc, BWE, updates (ICD PP)" );*/ + pop_wmops(); return error; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 4745bc5f0..93e8bb4eb 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -96,13 +96,12 @@ ivas_error ivas_jbm_dec_tc_fx( CPE_DEC_HANDLE hCPE; SCE_DEC_HANDLE hSCE; - push_wmops( "ivas_jbm_dec_tc (JBM)" ); + push_wmops( "ivas_jbm_dec_tc" ); /*----------------------------------------------------------------* * Initialization of local vars after struct has been set *----------------------------------------------------------------*/ - push_wmops( "JBM init" ); output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; @@ -135,7 +134,7 @@ ivas_error ivas_jbm_dec_tc_fx( } Word16 ch; - pop_wmops(); /*push_wmops( "JBM init" );*/ + /*----------------------------------------------------------------* * Decoding + pre-rendering @@ -153,7 +152,6 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { - push_wmops( "JBM STEREO" ); st_ivas->hCPE[0]->element_brate = ivas_total_brate; move32(); Word16 q_output = 11; @@ -194,11 +192,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 } } - pop_wmops(); /*push_wmops( "JBM STEREO" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { - push_wmops( "JBM ISM" ); /* Metadata decoding and configuration */ test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) @@ -283,11 +279,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops(); /*push_wmops( "JBM ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { - push_wmops( "JBM SBA/MASA" ); set16_fx( nb_bits_metadata, 0, MAX_SCE ); @@ -694,11 +688,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops(); /*push_wmops( "JBM SBA/MASA" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - push_wmops( "JBM MASA_ISM" ); Word16 nchan_ism, nchan_transport_ism; Word16 dirac_bs_md_write_idx; @@ -829,11 +821,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); // Q11 } } - pop_wmops(); /*push_wmops( "JBM MASA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - push_wmops( "JBM SBA_ISM" ); Word16 nchan_ism, sba_ch_idx; set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); @@ -1102,11 +1092,10 @@ ivas_error ivas_jbm_dec_tc_fx( v_add_32( p_output_fx[n], p_output_fx[n + s_max( nchan_out, nchan_ism )], p_output_fx[n], output_frame ); } } - pop_wmops(); /*push_wmops( "JBM SBA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - push_wmops( "JBM MC" ); + // st = (st_ivas->nSCE > 0) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; IF( st_ivas->nSCE > 0 ) { @@ -1479,7 +1468,6 @@ ivas_error ivas_jbm_dec_tc_fx( ivas_mono_stereo_downmix_mcmasa_fx( st_ivas, p_output_fx, output_frame ); } } - pop_wmops(); /*push_wmops( "JBM MC" );*/ } /*----------------------------------------------------------------* @@ -1488,9 +1476,7 @@ ivas_error ivas_jbm_dec_tc_fx( IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 1 ) ) { - push_wmops( "JBM syn_out" ); ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); - pop_wmops(); /*push_wmops( "JBM syn_out" );*/ } ELSE { diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1e7af58c8..1b51a29fb 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4713,9 +4713,7 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - push_wmops( "synthesise_fb_high_band" ); synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); - pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) -- GitLab From f320213c7f16efabac023d217a03a4220cd18683 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 14:10:06 +0100 Subject: [PATCH 0062/1310] Revert "del all changes" This reverts commit 00f17224f34a586a272a98c13c2cad6b3d645336. --- lib_com/prot_fx.h | 9 ++++++ lib_com/swb_tbe_com_fx.c | 19 +++++++++--- lib_dec/ivas_core_dec_fx.c | 62 +++++++++++++++++++++++++++++++------- lib_dec/ivas_jbm_dec_fx.c | 20 ++++++++++-- lib_dec/swb_tbe_dec_fx.c | 2 ++ 5 files changed, 94 insertions(+), 18 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 851b461bf..48232000a 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,6 +59,15 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //deleted completely +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //deleted completely +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //deleted completely +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS - deleted completely + +// Numbers ALL: 83,45 +// Numbers beOnly: 86,156 +// NUmbers none: 88,183 + /*----------------------------------------------------------------------------------* * Prototypes of global macros diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2a2841966..f2b850533 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -18,6 +18,7 @@ #define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ + /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ @@ -6692,7 +6693,6 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ - void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -6704,8 +6704,9 @@ void elliptic_bpf_48k_generic_fx( { Word16 i, j; Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; + Word32 L_output[L_FRAME48k]; FOR( i = 0; i < 4; i++ ) { @@ -6721,6 +6722,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6763,6 +6765,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6830,6 +6833,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6931,6 +6935,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -6998,12 +7003,13 @@ void synthesise_fb_high_band_fx( { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; - Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; + Word16 tmp[L_FRAME48k]; + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" ); /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7019,6 +7025,7 @@ void synthesise_fb_high_band_fx( } exp_tmp = sub( Q_fb_exc, 2 ); + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" ); IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ @@ -7029,8 +7036,11 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } - temp1 = sum2_fx_mod( tmp, L_FRAME48k ); + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); + temp1 = sum2_fx_mod( tmp, L_FRAME48k ); L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); @@ -7085,6 +7095,7 @@ void synthesise_fb_high_band_fx( move16(); } } + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; } diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 588640d0a..c0686bdfd 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -114,12 +114,12 @@ ivas_error ivas_core_dec_fx( error = IVAS_ERR_OK; move32(); - push_wmops( "ivas_core_dec" ); + push_wmops( "ivas_core_dec (ICD)" ); /*------------------------------------------------------------------* * General initialization *-----------------------------------------------------------------*/ - + push_wmops( "ICD init" ); use_cldfb_for_dft = 0; move16(); tdm_LRTD_flag = -1; @@ -368,7 +368,9 @@ ivas_error ivas_core_dec_fx( { save_hb_synth_32_fx = NULL; } + pop_wmops(); /*push_wmops( "ICD init" );*/ + push_wmops( "ICD SID, sanity" ); /*------------------------------------------------------------------* * Decode SID for MDCT-Stereo DTX mode *-----------------------------------------------------------------*/ @@ -396,7 +398,9 @@ ivas_error ivas_core_dec_fx( { ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps ); } + pop_wmops(); /*push_wmops( "ICD SID, sanity" );*/ + push_wmops( "ICD Coredec" ); /*------------------------------------------------------------------* * Core Decoding *-----------------------------------------------------------------*/ @@ -481,6 +485,7 @@ ivas_error ivas_core_dec_fx( IF( st->core == ACELP_CORE ) { + push_wmops( "ICD ACELP" ); /* ACELP core decoder */ Word16 old_syn_12k8_16k_fx_16[L_FRAME16k]; Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx; @@ -553,6 +558,7 @@ ivas_error ivas_core_dec_fx( } Copy_Scale_sig_16_32_DEPREC( old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n], L_FRAME16k, Q11 - ( -Q1 ) ); // Q(11 - (-1)) + pop_wmops(); /*push_wmops( "ICD ACELP" );*/ } Copy_Scale_sig_32_16( st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0 ); // Q0 @@ -561,6 +567,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { + push_wmops( "ICD TCX" ); Word16 Qsyn_temp; IVAS_FORMAT ivas_format; @@ -615,10 +622,12 @@ ivas_error ivas_core_dec_fx( } st->hBPF->pst_mem_deemp_err_fx = extract_l( st->mem_error ); move16(); + pop_wmops(); /*push_wmops( "ICD TCX" );*/ } IF( EQ_16( st->core, HQ_CORE ) ) { + push_wmops( "ICD HQ decoding" ); /* HQ core decoder */ Word16 Q_output; @@ -632,6 +641,7 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 + pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ } /*---------------------------------------------------------------------* @@ -648,8 +658,8 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 } - } /* n_channels loop */ - + } /* n_channels loop */ + pop_wmops(); /*push_wmops( "ICD Coredec" );*/ /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Decoding @@ -657,6 +667,7 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) ) { + push_wmops( "ICD jTCX Coredec" ); /* active-frame decoding */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) ) { @@ -785,6 +796,7 @@ ivas_error ivas_core_dec_fx( } } } + pop_wmops(); /*push_wmops( "ICD jTCX Coredec" );*/ } /*---------------------------------------------------------------------* @@ -794,6 +806,7 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hStereoCng != NULL ) { + push_wmops( "ICD Stereo CNG Updates" ); /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ Word16 Q_c_PS_LT, Q_output; Word32 c_PS_LT_fx; @@ -809,12 +822,14 @@ ivas_error ivas_core_dec_fx( stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx ); + pop_wmops(); /*push_wmops( "ICD Stereo CNG Updates" );*/ } /*---------------------------------------------------------------------* * Postprocessing, BWEs and updates *---------------------------------------------------------------------*/ + push_wmops( "ICD Postproc, BWE, updates (ICD PP)" ); FOR( n = 0; n < n_channels; n++ ) { st = sts[n]; @@ -825,6 +840,7 @@ ivas_error ivas_core_dec_fx( * TD-BWE for ACELP to TCX transitions *---------------------------------------------------------------------*/ + push_wmops( "ICD PP TDBWE ACELPTCX trans" ); /*core_switching_post_dec*/ Q_synth = sub( 15, e_sig[0] ); @@ -898,11 +914,12 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) ); } + pop_wmops(); /*push_wmops( "ICD PP TDBWE ACELPTCX trans" );*/ /*---------------------------------------------------------------------* * Postprocessing for ACELP/MDCT core switching *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP ACELP/MDCT switch" ); /* save synth and output in case of SBA DirAC stereo output as core switching is done outside of core decoder */ test(); test(); @@ -937,11 +954,12 @@ ivas_error ivas_core_dec_fx( { Copy( sts[0]->previoussynth_fx, sts[1]->previoussynth_fx, st->hTcxDec->L_frameTCX ); } + pop_wmops(); /*push_wmops( "ICD PP ACELP/MDCT switch" );*/ /*---------------------------------------------------------------------* * Pre-processing for bandwidth switching *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP BWswitch preproc" ); ivas_bw_switching_pre_proc_fx( st, last_element_brate, nchan_out, old_syn_12k8_16k_fx[n], old_syn_fx, q_audio ); IF( st->hHQ_core == NULL ) @@ -988,12 +1006,13 @@ ivas_error ivas_core_dec_fx( hBWE_FD->prev_flag = hBWE_FD->prev_flag; move16(); } + pop_wmops(); /*push_wmops( "ICD PP BWswitch preproc" );*/ /*---------------------------------------------------------------------* * WB TBE decoding * WB BWE decoding *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP TBE/BWE" ); Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; Word16 Q_syn_hb, sf; @@ -1021,8 +1040,9 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( st->extl, WB_TBE ) ) { /* WB TBE decoder */ - + push_wmops( "ICD PP TBE/BWE wb_tbe_dec" ); ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_tbe_dec" );*/ } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && st->bws_cnt == 0 && st->extl_brate == 0 ) { @@ -1030,8 +1050,10 @@ ivas_error ivas_core_dec_fx( } ELSE IF( EQ_16( st->extl, WB_BWE ) && st->bws_cnt == 0 ) { + push_wmops( "ICD PP TBE/BWE wb_bwe_dec" ); /* WB BWE decoder */ Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_16_fx[n], hb_synth_16_fx[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_bwe_dec" );*/ } /* Memories Re-Scaling */ @@ -1075,8 +1097,10 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) { + push_wmops( "ICD PP TBE/BWE swb_tbe_dec" ); /* SWB TBE decoder */ ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec" );*/ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11 Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx @@ -1091,18 +1115,22 @@ ivas_error ivas_core_dec_fx( /* FB TBE decoder */ IF( EQ_16( st->extl, FB_TBE ) ) { + push_wmops( "ICD PP TBE/BWE fb_tbe_dec" ); fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE fb_tbe_dec" );*/ } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) { /* SWB BWE decoder */ + push_wmops( "ICD PP TBE/BWE swb_bwe_dec" ); Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11 Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE" );*/ /*---------------------------------------------------------------------* * FEC - recovery after lost HQ core (smoothing of the BWE component) @@ -1141,6 +1169,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( GE_16( output_frame, L_FRAME32k ) && st->hTdCngDec != NULL ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && GE_16( st->bwidth, SWB ) && st->hTdCngDec != NULL ) ) { + push_wmops( "ICD PP SWB CNG" ); /* SHB CNG decoder */ Word16 synth_fxl[960]; /* Q-2 */ Word16 q; @@ -1162,6 +1191,7 @@ ivas_error ivas_core_dec_fx( Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ) ); // Q0 Copy_Scale_sig_16_32_no_sat( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ) ); + pop_wmops(); /* push_wmops( "ICD PP SWB CNG" );*/ } /*-------------------------------------------------------------------* @@ -1171,6 +1201,7 @@ ivas_error ivas_core_dec_fx( test(); IF( n == 0 && GE_16( st->element_mode, IVAS_CPE_DFT ) ) { + push_wmops( "ICD PP IC-BWE" ); Word16 q; q = 11; move16(); @@ -1192,10 +1223,12 @@ ivas_error ivas_core_dec_fx( Scale_sig32( hb_synth_32_fx[0], output_frame, sub( Q11, q ) ); // Q11 Scale_sig32( hb_synth_32_fx[1], output_frame, sub( Q11, q ) ); // Q11 } + pop_wmops(); /*push_wmops( "ICD PP IC-BWE" );*/ } IF( EQ_16( st->element_mode, EVS_MONO ) ) { + push_wmops( "ICD PP BFI" ); /*----------------------------------------------------------------* * BFI waveform adjustment *----------------------------------------------------------------*/ @@ -1223,6 +1256,7 @@ ivas_error ivas_core_dec_fx( st->hPlcInfo->Pitch_fx = 0; move16(); } + pop_wmops(); /*push_wmops( "ICD PP BFI" );*/ } /*----------------------------------------------------------------* @@ -1235,6 +1269,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( NE_16( st->extl, -1 ) && ( NE_16( st->extl, IGF_BWE ) || st->last_core == ACELP_CORE ) ) || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) { + push_wmops( "ICD PP Sync BWE" ); /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ IF( EQ_16( st->L_frame, L_FRAME ) ) { @@ -1388,6 +1423,7 @@ ivas_error ivas_core_dec_fx( st->hTdCngDec->last_shb_ener_fx_32 = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/ move32(); } + pop_wmops(); /*push_wmops( "ICD PP Sync BWE" );*/ } test(); @@ -1403,7 +1439,7 @@ ivas_error ivas_core_dec_fx( * - core switching in DFT stereo * - updates for potential TD->DFT stereo switching *----------------------------------------------------------------*/ - + push_wmops( "ICD PP TCXLTP" ); IF( st->hHQ_core != NULL ) { Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 @@ -1460,6 +1496,7 @@ ivas_error ivas_core_dec_fx( } Copy32( synth_32_fx[n], output_32_fx[n], output_frame ); + pop_wmops(); /*push_wmops( "ICD PP TCXLTP" );*/ /*--------------------------------------------------------* * Common updates @@ -1468,6 +1505,7 @@ ivas_error ivas_core_dec_fx( Word16 exp_max; Word32 output_fx_loc[L_FRAME48k]; + push_wmops( "ICD PP commonupdates" ); exp_max = 0; move16(); @@ -1522,6 +1560,8 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0 + pop_wmops(); /*push_wmops( "ICD PP commonupdates" );*/ + } /* n_channels loop */ FOR( n = 0; n < n_channels; n++ ) @@ -1540,7 +1580,7 @@ ivas_error ivas_core_dec_fx( move16(); } } - + pop_wmops(); /*push_wmops( "ICD Postproc, BWE, updates (ICD PP)" );*/ pop_wmops(); return error; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 93e8bb4eb..4745bc5f0 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -96,12 +96,13 @@ ivas_error ivas_jbm_dec_tc_fx( CPE_DEC_HANDLE hCPE; SCE_DEC_HANDLE hSCE; - push_wmops( "ivas_jbm_dec_tc" ); + push_wmops( "ivas_jbm_dec_tc (JBM)" ); /*----------------------------------------------------------------* * Initialization of local vars after struct has been set *----------------------------------------------------------------*/ + push_wmops( "JBM init" ); output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; @@ -134,7 +135,7 @@ ivas_error ivas_jbm_dec_tc_fx( } Word16 ch; - + pop_wmops(); /*push_wmops( "JBM init" );*/ /*----------------------------------------------------------------* * Decoding + pre-rendering @@ -152,6 +153,7 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { + push_wmops( "JBM STEREO" ); st_ivas->hCPE[0]->element_brate = ivas_total_brate; move32(); Word16 q_output = 11; @@ -192,9 +194,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 } } + pop_wmops(); /*push_wmops( "JBM STEREO" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { + push_wmops( "JBM ISM" ); /* Metadata decoding and configuration */ test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) @@ -279,9 +283,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } + pop_wmops(); /*push_wmops( "JBM ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { + push_wmops( "JBM SBA/MASA" ); set16_fx( nb_bits_metadata, 0, MAX_SCE ); @@ -688,9 +694,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } + pop_wmops(); /*push_wmops( "JBM SBA/MASA" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { + push_wmops( "JBM MASA_ISM" ); Word16 nchan_ism, nchan_transport_ism; Word16 dirac_bs_md_write_idx; @@ -821,9 +829,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); // Q11 } } + pop_wmops(); /*push_wmops( "JBM MASA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { + push_wmops( "JBM SBA_ISM" ); Word16 nchan_ism, sba_ch_idx; set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); @@ -1092,10 +1102,11 @@ ivas_error ivas_jbm_dec_tc_fx( v_add_32( p_output_fx[n], p_output_fx[n + s_max( nchan_out, nchan_ism )], p_output_fx[n], output_frame ); } } + pop_wmops(); /*push_wmops( "JBM SBA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - + push_wmops( "JBM MC" ); // st = (st_ivas->nSCE > 0) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; IF( st_ivas->nSCE > 0 ) { @@ -1468,6 +1479,7 @@ ivas_error ivas_jbm_dec_tc_fx( ivas_mono_stereo_downmix_mcmasa_fx( st_ivas, p_output_fx, output_frame ); } } + pop_wmops(); /*push_wmops( "JBM MC" );*/ } /*----------------------------------------------------------------* @@ -1476,7 +1488,9 @@ ivas_error ivas_jbm_dec_tc_fx( IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 1 ) ) { + push_wmops( "JBM syn_out" ); ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); + pop_wmops(); /*push_wmops( "JBM syn_out" );*/ } ELSE { diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1b51a29fb..1e7af58c8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4713,7 +4713,9 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ + push_wmops( "synthesise_fb_high_band" ); synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) -- GitLab From 3f98982fcc6f4c5dcd29a491e24d9d5b12dc3684 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 14:10:37 +0100 Subject: [PATCH 0063/1310] Revert "delete FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1, STAGE2 and STAGE 3 completely" This reverts commit 82e1f8758cacf2127fd0509672fd3bf5897850cd. --- lib_com/prot_fx.h | 6 ++-- lib_com/swb_tbe_com_fx.c | 68 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 48232000a..8a282fac6 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,9 +59,9 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //deleted completely -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //deleted completely -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //deleted completely +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS - deleted completely // Numbers ALL: 83,45 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index f2b850533..9a54a26f6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6765,7 +6765,24 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + } +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6779,6 +6796,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } +#endif + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6834,6 +6853,27 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6848,7 +6888,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } - +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -6917,7 +6957,29 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -6935,7 +6997,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - +#endif memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; -- GitLab From 9fe773a1e9745f1c9a8ceb8d219dda40be756f29 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 14:10:50 +0100 Subject: [PATCH 0064/1310] Revert "follow-up: apply clang format patch" This reverts commit eaa539013d7c11e202990bb7fad44a7322a70fad. --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 9a54a26f6..b2a414afe 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6782,7 +6782,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); } -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From d39775e561d75da6c5593ff8b8edafc6d684f3fb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 14:11:10 +0100 Subject: [PATCH 0065/1310] Revert "delete FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig" This reverts commit ad8bba9cfa444272263390af7345b25b115ffad4. --- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 184 +++++++++++++++++++++++++++++++++++---- 2 files changed, 170 insertions(+), 16 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 8a282fac6..b64de07f8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -62,7 +62,7 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS - deleted completely +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS // Numbers ALL: 83,45 // Numbers beOnly: 86,156 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index b2a414afe..6dda9a39f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6766,40 +6766,194 @@ void elliptic_bpf_48k_generic_fx( L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 - FOR( i = 4; i < L_FRAME48k; i++ ) +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { Word64 W_tmpX; Word64 W_tmpY; + i = 4; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); + i++; + + FOR( ; i < L_FRAME48k / 3; ) + { + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //2 + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); // 3 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //4 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //5 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); // 3 + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //4 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //5 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //4 + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //5 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //7 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } } -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ - FOR( i = 4; i < L_FRAME48k; i++ ) + ELSE +#else { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + } + } +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + { + i = 4; + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //1 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + FOR( ; i < L_FRAME48k / 3; ) + { + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //4 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //8 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } + } + ELSE +#else + { + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } } +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ #endif - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; -- GitLab From 3376fb0af295c9175ae317460529d4412e33812c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 15:04:13 +0100 Subject: [PATCH 0066/1310] activate FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig for be test --- lib_com/prot_fx.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index b64de07f8..06cc69ee5 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,16 +59,22 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 +// *** Currently checking be-nes of all-inactive (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50048 -- DONE GREEN! +// *** Currently checking be speedups ( only FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes +// --> next test: check nonbe speedups +// //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS // Numbers ALL: 83,45 // Numbers beOnly: 86,156 // NUmbers none: 88,183 + + /*----------------------------------------------------------------------------------* * Prototypes of global macros *----------------------------------------------------------------------------------*/ -- GitLab From 849100836e5b419631533f9876f643fc32fa5f9f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 15:19:53 +0100 Subject: [PATCH 0067/1310] minor change --- lib_com/prot_fx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 06cc69ee5..1b4857508 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,7 +60,7 @@ #define TCX_IMDCT_HEADROOM 1 // *** Currently checking be-nes of all-inactive (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50048 -- DONE GREEN! -// *** Currently checking be speedups ( only FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes +// *** Currently checking be speedups ( only FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) // --> next test: check nonbe speedups // //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 -- GitLab From 487a8968adfacb6c60b79586317c07c7e7fe72b6 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 15:22:00 +0100 Subject: [PATCH 0068/1310] apply clang format patch --- lib_com/prot_fx.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1b4857508..a50d1656c 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -62,7 +62,7 @@ // *** Currently checking be-nes of all-inactive (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50048 -- DONE GREEN! // *** Currently checking be speedups ( only FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) // --> next test: check nonbe speedups -// +// //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 @@ -73,8 +73,6 @@ // NUmbers none: 88,183 - - /*----------------------------------------------------------------------------------* * Prototypes of global macros *----------------------------------------------------------------------------------*/ -- GitLab From 1a15ab5b2c336b949add726ff189f512788bc43e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 16:01:16 +0100 Subject: [PATCH 0069/1310] added some push/pop wmops --- lib_dec/swb_tbe_dec_fx.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1e7af58c8..43110cfb8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -5519,6 +5519,8 @@ void ivas_swb_tbe_dec_fx( hBWE_TD = st->hBWE_TD; + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" ); + /* initializations */ GainFrame_fx = 0; move32(); @@ -5559,7 +5561,9 @@ void ivas_swb_tbe_dec_fx( tilt_swb_fec_fx = hBWE_TD->tilt_swb_fec_fx; move16(); } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" );*/ + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART B" ); /* WB/SWB bandwidth switching */ test(); test(); @@ -5883,6 +5887,9 @@ void ivas_swb_tbe_dec_fx( } } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART B" );*/ + + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART C" ); /* get the gainshape delay */ Copy( &hBWE_TD->GainShape_Delay_fx[4], &hBWE_TD->GainShape_Delay_fx[0], NUM_SHB_SUBFR / 4 ); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) @@ -5921,7 +5928,9 @@ void ivas_swb_tbe_dec_fx( { set16_fx( vf_modified_fx, 0, NB_SUBFR16k ); } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART C" );*/ + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART D" ); /* SHB LSF from current frame; and convert to LSP for interpolation */ E_LPC_lsf_lsp_conversion( lsf_shb_fx, lsp_shb_2_fx, LPC_SHB_ORDER ); @@ -6075,6 +6084,9 @@ void ivas_swb_tbe_dec_fx( } } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART D" );*/ + + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART E" ); /* Save the SWB LSP values from current frame for interpolation */ Copy( lsp_shb_2_fx, hBWE_TD->swb_lsp_prev_interp_fx, LPC_SHB_ORDER ); @@ -6128,7 +6140,9 @@ void ivas_swb_tbe_dec_fx( Copy( lpc_shb_fx, &lpc_shb_sf_fx[i_mult( j, ( LPC_SHB_ORDER + 1 ) )], LPC_SHB_ORDER + 1 ); } } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART E" );*/ + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART F" ); /* From low band excitation, generate highband excitation */ /* -------- start of memory rescaling -------- */ @@ -6329,6 +6343,10 @@ void ivas_swb_tbe_dec_fx( } } ener_fx = s_max( 1, round_fx_sat( L_shl_sat( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ + + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART F" );*/ + + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART G" ); /* WB/SWB bandwidth switching */ IF( st->bws_cnt > 0 ) { @@ -6646,7 +6664,10 @@ void ivas_swb_tbe_dec_fx( hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc; move16(); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART G" );*/ + + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART H" ); /* Gain shape smoothing after quantization */ test(); IF( EQ_32( st->extl_brate, SWB_TBE_1k10 ) || EQ_32( st->extl_brate, SWB_TBE_1k75 ) ) @@ -6839,6 +6860,9 @@ void ivas_swb_tbe_dec_fx( } } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART H" );*/ + + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART J" ); /* adjust the FEC frame energy */ IF( st->bfi ) { @@ -6996,6 +7020,10 @@ void ivas_swb_tbe_dec_fx( move32(); } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART J" );*/ + + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART K" ); + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ GenSHBSynth_fx32( shaped_shb_excitation_fx_32, error_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->L_frame, &( hBWE_TD->syn_dm_phase ) ); Copy_Scale_sig_32_16( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 2 * ALLPASSSECTIONS_STEEP, -( Q11 - Q_bwe_exc ) ); @@ -7132,5 +7160,7 @@ void ivas_swb_tbe_dec_fx( hBWE_TD->prev_Qx = Q_bwe_exc; move16(); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART K" );*/ + return; } -- GitLab From bba34f621436a2f64b4a6357816974485c597a10 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 16:08:31 +0100 Subject: [PATCH 0070/1310] mofified FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig to not differ from original --- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 90 ++++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index a50d1656c..19560b368 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,7 +60,7 @@ #define TCX_IMDCT_HEADROOM 1 // *** Currently checking be-nes of all-inactive (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50048 -- DONE GREEN! -// *** Currently checking be speedups ( only FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) +// *** Currently checking be speedups ( only modified version of FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) // --> next test: check nonbe speedups // //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 6dda9a39f..d58825e59 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6869,65 +6869,65 @@ void elliptic_bpf_48k_generic_fx( IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { i = 4; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //0 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //1 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; FOR( ; i < L_FRAME48k / 3; ) { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat(L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX); //3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //4 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //8 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //8 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; } -- GitLab From 46c6fcf39f425f82cd782e5e184b87dd80cc3f46 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 26 Mar 2025 16:21:14 +0100 Subject: [PATCH 0071/1310] delete most of the recently added push/pop wmops --- lib_dec/swb_tbe_dec_fx.c | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 43110cfb8..2b42e5b0d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -5519,7 +5519,6 @@ void ivas_swb_tbe_dec_fx( hBWE_TD = st->hBWE_TD; - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" ); /* initializations */ GainFrame_fx = 0; @@ -5561,9 +5560,7 @@ void ivas_swb_tbe_dec_fx( tilt_swb_fec_fx = hBWE_TD->tilt_swb_fec_fx; move16(); } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART B" ); /* WB/SWB bandwidth switching */ test(); test(); @@ -5887,9 +5884,6 @@ void ivas_swb_tbe_dec_fx( } } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART B" );*/ - - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART C" ); /* get the gainshape delay */ Copy( &hBWE_TD->GainShape_Delay_fx[4], &hBWE_TD->GainShape_Delay_fx[0], NUM_SHB_SUBFR / 4 ); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) @@ -5928,9 +5922,7 @@ void ivas_swb_tbe_dec_fx( { set16_fx( vf_modified_fx, 0, NB_SUBFR16k ); } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART C" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART D" ); /* SHB LSF from current frame; and convert to LSP for interpolation */ E_LPC_lsf_lsp_conversion( lsf_shb_fx, lsp_shb_2_fx, LPC_SHB_ORDER ); @@ -6084,9 +6076,6 @@ void ivas_swb_tbe_dec_fx( } } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART D" );*/ - - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART E" ); /* Save the SWB LSP values from current frame for interpolation */ Copy( lsp_shb_2_fx, hBWE_TD->swb_lsp_prev_interp_fx, LPC_SHB_ORDER ); @@ -6140,9 +6129,7 @@ void ivas_swb_tbe_dec_fx( Copy( lpc_shb_fx, &lpc_shb_sf_fx[i_mult( j, ( LPC_SHB_ORDER + 1 ) )], LPC_SHB_ORDER + 1 ); } } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART E" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART F" ); /* From low band excitation, generate highband excitation */ /* -------- start of memory rescaling -------- */ @@ -6344,9 +6331,6 @@ void ivas_swb_tbe_dec_fx( } ener_fx = s_max( 1, round_fx_sat( L_shl_sat( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART F" );*/ - - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART G" ); /* WB/SWB bandwidth switching */ IF( st->bws_cnt > 0 ) { @@ -6664,10 +6648,6 @@ void ivas_swb_tbe_dec_fx( hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc; move16(); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART G" );*/ - - - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART H" ); /* Gain shape smoothing after quantization */ test(); IF( EQ_32( st->extl_brate, SWB_TBE_1k10 ) || EQ_32( st->extl_brate, SWB_TBE_1k75 ) ) @@ -6860,9 +6840,6 @@ void ivas_swb_tbe_dec_fx( } } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART H" );*/ - - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART J" ); /* adjust the FEC frame energy */ IF( st->bfi ) { @@ -7020,8 +6997,6 @@ void ivas_swb_tbe_dec_fx( move32(); } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART J" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART K" ); /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ -- GitLab From 128cb148a9380ccff30b26f257b06eada4b205fd Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 27 Mar 2025 13:00:16 +0100 Subject: [PATCH 0072/1310] Improve accuracy of no_phi_masa_inv_fx table and remove all other azimuth/elevation roundings. --- lib_com/ivas_rom_com_fx.c | 15 +++++++++++++++ lib_dec/ivas_dirac_dec_fx.c | 14 +++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index a7a8bdcbf..ffb18d6d2 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1545,6 +1545,7 @@ const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER] = { /* from 1 to 11 bits*/ /*q factor = 8*/ const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = { +#ifndef FIX_1379_MASA_ANGLE_ROUND { 1073741824 }, { 536870912 }, { 536870912, 1073741824 }, @@ -1556,8 +1557,22 @@ const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = { { 44739242, 45691141, 47721858, 52377649, 61356675, 76695844, 107374182, 178956970, 1073741824, 2147483647 }, { 35791394, 35791394, 37025580, 38347922, 39768215, 42949672, 46684427, 52377649, 59652323, 71582788, 93368854, 126322567, 214748364, 2147483647 }, { 24129029, 24129029, 24403223, 24970740, 25565281, 26512143, 27889398, 29417584, 31580641, 34087042, 37675151, 42107522, 48806446, 56512727, 71582788, 93368854, 143165576, 268435456, 2147483647 } +#else + { 1073741824 }, + { 536870912 }, + { 536870912, 1073741824 }, + { 268435456, 536870912 }, + { 178956971, 306783378, 1073741824, 2147483647 }, + { 153391689, 165191050, 238609294, 1073741824, 2147483647 }, + { 97612893, 102261126, 126322568, 195225786, 715827883, 2147483647 }, + { 65075262, 67108864, 74051160, 93368854, 126322568, 238609294, 2147483647 }, + { 44739243, 45691141, 47721859, 52377650, 61356676, 76695845, 107374182, 178956971, 1073741824, 2147483647 }, + { 35791394, 35791394, 37025580, 38347922, 39768216, 42949673, 46684427, 52377650, 59652324, 71582788, 93368854, 126322568, 214748365, 2147483647 }, + { 24129030, 24129030, 24403223, 24970740, 25565282, 26512144, 27889398, 29417584, 31580642, 34087042, 37675152, 42107523, 48806447, 56512728, 71582788, 93368854, 143165577, 268435456, 2147483647 }, +#endif }; + const Word32 azimuth_cb_fx[8] = { 0, -754974720, -377487360, 377487360, -188743680, 188743680, -566231040, 566231040 }; diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index c72c0d6c8..bd49d13d6 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1446,7 +1446,7 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND +#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT hSpatParamRendCom->azimuth[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); move16(); hSpatParamRendCom->elevation[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); @@ -1501,7 +1501,7 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND +#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT hSpatParamRendCom->azimuth2[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); move16(); hSpatParamRendCom->elevation2[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); @@ -1718,7 +1718,7 @@ void ivas_qmetadata_to_dirac_fx( IF( hodirac_flag ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND +#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT azi = round_fx( L_shr( ( L_add( azimuth_fx, ONE_IN_Q21 ) ), 6 ) ); ele = round_fx( L_shr( ( L_add( elevation_fx, ONE_IN_Q21 ) ), 6 ) ); #else @@ -1760,7 +1760,7 @@ void ivas_qmetadata_to_dirac_fx( final_1_32 = BASOP_Util_Add_Mant32Exp( final_1_32, final_1_exp, ONE_IN_Q30, 0, &final_1_exp ); /*0.5 in q31*/ final_2_32 = BASOP_Util_Add_Mant32Exp( final_2_32, final_2_exp, ONE_IN_Q30, 0, &final_2_exp ); -#ifdef FIX_1379_MASA_ANGLE_ROUND +#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT azi = round_fx( L_shr( final_1_32, sub( sub( 31, final_1_exp ), 16 ) ) ); ele = round_fx( L_shr( final_2_32, sub( sub( 31, final_2_exp ), 16 ) ) ); #else @@ -3626,7 +3626,7 @@ void ivas_dirac_dec_render_sf_fx( { Word16 j, k, j2, l; Word16 num_objects, nchan_out_woLFE, lfe_index; -#ifndef FIX_1379_MASA_ANGLE_ROUND +#ifndef FIX_1379_MASA_ANGLE_ROUND_NOT Word16 az1, el1; #endif Word16 n_slots_to_render; @@ -3662,14 +3662,14 @@ void ivas_dirac_dec_render_sf_fx( Word16 el_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, Q22 ) ); Word32 az1_32, el1_32; rotateAziEle_fixed( az_q0, el_q0, &az1_32, &el1_32, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); -#ifndef FIX_1379_MASA_ANGLE_ROUND +#ifndef FIX_1379_MASA_ANGLE_ROUND_NOT az1 = extract_h( az1_32 ); el1 = extract_h( el1_32 ); #endif IF( st_ivas->hEFAPdata != NULL ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND +#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT const Word32 azi_fx = L_shl( az1_32, Q22 - Q16 ); // Q16 -> Q22 const Word32 ele_fx = L_shl( el1_32, Q22 - Q16 ); // Q16 -> Q22 #else -- GitLab From 97754fe6471c6857bc76feb9de337b6513f58c63 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 27 Mar 2025 18:14:37 +0100 Subject: [PATCH 0073/1310] Remove wrong round_fx(). Reactivate simplification which also fixes instrumentation (implicit Word16 to Word32 conversion). --- lib_dec/ivas_dirac_dec_fx.c | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index bd49d13d6..c06047113 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1446,17 +1446,10 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT - hSpatParamRendCom->azimuth[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); - move16(); - hSpatParamRendCom->elevation[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); - move16(); -#else hSpatParamRendCom->azimuth[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); move16(); hSpatParamRendCom->elevation[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); move16(); -#endif hSpatParamRendCom->energy_ratio1_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( ONE_IN_Q30, q_direction->band_data[band].energy_ratio_fx[block] ); @@ -1501,17 +1494,10 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT - hSpatParamRendCom->azimuth2[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); - move16(); - hSpatParamRendCom->elevation2[meta_write_index][b] = round_fx( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); - move16(); -#else hSpatParamRendCom->azimuth2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); move16(); hSpatParamRendCom->elevation2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); move16(); -#endif hSpatParamRendCom->energy_ratio2_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b], q_direction->band_data[band].energy_ratio_fx[block] ); @@ -1718,13 +1704,8 @@ void ivas_qmetadata_to_dirac_fx( IF( hodirac_flag ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT - azi = round_fx( L_shr( ( L_add( azimuth_fx, ONE_IN_Q21 ) ), 6 ) ); - ele = round_fx( L_shr( ( L_add( elevation_fx, ONE_IN_Q21 ) ), 6 ) ); -#else azi = extract_h( L_shr( ( L_add( azimuth_fx, ONE_IN_Q21 ) ), 6 ) ); ele = extract_h( L_shr( ( L_add( elevation_fx, ONE_IN_Q21 ) ), 6 ) ); -#endif /*addition of one to compensate precision loss*/ if ( azi < 0 ) { @@ -1760,13 +1741,8 @@ void ivas_qmetadata_to_dirac_fx( final_1_32 = BASOP_Util_Add_Mant32Exp( final_1_32, final_1_exp, ONE_IN_Q30, 0, &final_1_exp ); /*0.5 in q31*/ final_2_32 = BASOP_Util_Add_Mant32Exp( final_2_32, final_2_exp, ONE_IN_Q30, 0, &final_2_exp ); -#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT - azi = round_fx( L_shr( final_1_32, sub( sub( 31, final_1_exp ), 16 ) ) ); - ele = round_fx( L_shr( final_2_32, sub( sub( 31, final_2_exp ), 16 ) ) ); -#else azi = extract_h( L_shr( final_1_32, sub( sub( 31, final_1_exp ), 16 ) ) ); ele = extract_h( L_shr( final_2_32, sub( sub( 31, final_2_exp ), 16 ) ) ); -#endif /*addition of one to compensate precision loss*/ if ( azi < 0 ) @@ -3626,7 +3602,7 @@ void ivas_dirac_dec_render_sf_fx( { Word16 j, k, j2, l; Word16 num_objects, nchan_out_woLFE, lfe_index; -#ifndef FIX_1379_MASA_ANGLE_ROUND_NOT +#ifndef FIX_1379_MASA_ANGLE_ROUND Word16 az1, el1; #endif Word16 n_slots_to_render; @@ -3662,14 +3638,14 @@ void ivas_dirac_dec_render_sf_fx( Word16 el_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, Q22 ) ); Word32 az1_32, el1_32; rotateAziEle_fixed( az_q0, el_q0, &az1_32, &el1_32, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); -#ifndef FIX_1379_MASA_ANGLE_ROUND_NOT +#ifndef FIX_1379_MASA_ANGLE_ROUND az1 = extract_h( az1_32 ); el1 = extract_h( el1_32 ); #endif IF( st_ivas->hEFAPdata != NULL ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND_NOT +#ifdef FIX_1379_MASA_ANGLE_ROUND const Word32 azi_fx = L_shl( az1_32, Q22 - Q16 ); // Q16 -> Q22 const Word32 ele_fx = L_shl( el1_32, Q22 - Q16 ); // Q16 -> Q22 #else -- GitLab From 3660990879c1d4c8526770e863e0e30abe6c0aaf Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 28 Mar 2025 19:49:59 +0100 Subject: [PATCH 0074/1310] fix --- lib_dec/fd_cng_dec_fx.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 6579de9fa..b3fbb225e 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1574,15 +1574,25 @@ Word16 ApplyFdCng_ivas_fx( /* This sets the new CNG levels until a SID update overwrites it */ Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it */ /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - Word16 shift1 = L_norm_arr( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); - Word16 shift2 = L_norm_arr( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ) ); - Word16 shift = s_max( sub( hFdCngDec->bandNoiseShape_exp, shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; + move16(); + } + ELSE +#endif + { + Word16 shift1 = L_norm_arr( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); + Word16 shift2 = L_norm_arr( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ) ); + Word16 shift = s_max( sub( hFdCngDec->bandNoiseShape_exp, shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); - scale_sig32( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( sub( hFdCngDec->bandNoiseShape_exp, shift1 ), shift ) ); - scale_sig32( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ), sub( sub( *cngNoiseLevel_exp, shift2 ), shift ) ); + scale_sig32( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( sub( hFdCngDec->bandNoiseShape_exp, shift1 ), shift ) ); + scale_sig32( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ), sub( sub( *cngNoiseLevel_exp, shift2 ), shift ) ); - *cngNoiseLevel_exp = shift; - move16(); + *cngNoiseLevel_exp = shift; + move16(); + } /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); -- GitLab From ff1ecd8743402a7cb90cffda09c2dc9c9bab382f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Mar 2025 15:05:26 +0530 Subject: [PATCH 0075/1310] Q mismatch fix in stereo_icBWE_enc_ivas_fx stack --- lib_com/deemph.c | 11 ++--- lib_com/prot_fx.h | 1 - lib_dec/ivas_stereo_icbwe_dec_fx.c | 2 +- lib_enc/ivas_stereo_ica_enc_fx.c | 8 ++-- lib_enc/ivas_stereo_icbwe_enc_fx.c | 64 +++++++++++++++++++----------- 5 files changed, 49 insertions(+), 37 deletions(-) diff --git a/lib_com/deemph.c b/lib_com/deemph.c index c03a050bc..9bc20cb6f 100644 --- a/lib_com/deemph.c +++ b/lib_com/deemph.c @@ -41,26 +41,23 @@ void deemph_fx_32( - Word16 shift, /*scaled output*/ Word32 *signal, /* i/o: signal Qx*/ const Word16 mu, /* i : deemphasis factor Q15*/ const Word16 L, /* i : vector size */ - Word32 *mem /* i/o: memory (y[-1]) Qx+shift*/ + Word32 *mem /* i/o: memory (y[-1]) Qx*/ ) { Word16 i; - signal[0] = L_add( signal[0], Mpy_32_16_1( ( *mem ), mu ) ); /*Qx*/ + signal[0] = Madd_32_16( signal[0], *mem, mu ); // Qx move32(); FOR( i = 1; i < L; i++ ) { - signal[i] = L_add( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /*Qx*/ - signal[i] = L_shl( signal[i], shift ); /*Qx+shift*/ - move32(); + signal[i] = Madd_32_16( signal[i], signal[i - 1], mu ); // Qx move32(); } - *mem = signal[L - 1]; /*Qx+shift*/ + *mem = signal[L - 1]; // Qx move32(); return; diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 851b461bf..ffd1d6032 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -1651,7 +1651,6 @@ void deemph_fx( void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, Word16 *mem ); void deemph_fx_32( - Word16 shift, /* i : scaled output */ Word32 *signal, /* i/o: signal */ const Word16 mu, /* i : deemphasis factor */ const Word16 L, /* i : vector size */ diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index c9f7cac92..c7bc98566 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -611,7 +611,7 @@ void stereo_icBWE_dec_fx( Q_syn_shb = tmp; move16(); - deemph_fx_32( 0, shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); + deemph_fx_32( shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); hStereoICBWE->prev_Q_memshbspec = Q_syn_shb; move16(); Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); /* Q_syn_shb */ diff --git a/lib_enc/ivas_stereo_ica_enc_fx.c b/lib_enc/ivas_stereo_ica_enc_fx.c index 78ea50d7e..a8a088f20 100644 --- a/lib_enc/ivas_stereo_ica_enc_fx.c +++ b/lib_enc/ivas_stereo_ica_enc_fx.c @@ -408,8 +408,8 @@ static void deEmphResample_fx( /* De-emphasis, 1/(1-mu z^-1), and resample, stage 1 */ - deemph_fx_32( 0, buf1_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[0] ); - deemph_fx_32( 0, buf2_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[1] ); + deemph_fx_32( buf1_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[0] ); + deemph_fx_32( buf2_fx, PREEMPH_FAC_16k, input_frame, &hStereoTCA->memdecim_fx[1] ); FOR( i = 0; i < ( input_frame / dsFac1 ); i++ ) { @@ -420,8 +420,8 @@ static void deEmphResample_fx( } /* De-emphasis, 1/(1-mu z^-1), and resample, stage 2 */ - deemph_fx_32( 0, tempBuf1_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[2] ); - deemph_fx_32( 0, tempBuf2_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[3] ); + deemph_fx_32( tempBuf1_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[2] ); + deemph_fx_32( tempBuf2_fx, PREEMPH_FAC_16k, idiv1616( input_frame, dsFac1 ), &hStereoTCA->memdecim_fx[3] ); FOR( i = 0; i < ( input_frame / dsFactor ); i++ ) { diff --git a/lib_enc/ivas_stereo_icbwe_enc_fx.c b/lib_enc/ivas_stereo_icbwe_enc_fx.c index 02d20543b..eba30f762 100644 --- a/lib_enc/ivas_stereo_icbwe_enc_fx.c +++ b/lib_enc/ivas_stereo_icbwe_enc_fx.c @@ -102,14 +102,15 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx( const Word32 *shb_frame_target_fx, /* i : target shb Q31-shb_frame_target_e*/ Word16 shb_frame_target_e, Word32 *shb_synth_nonref_fx, /* o : non-ref shb synth Q31-shb_synth_nonref_e*/ - Word16 shb_synth_nonref_e, + Word16 *shb_synth_nonref_e, Word32 *specMapping_fx, /* i/o: current frame's mapping Qx*/ - Word32 *memShbSpecMapping_fx, /* i/o: current frame's mapping Qx*/ - Word32 *memShbSpecXcorr_fx, /* i/o: ic bwe spec mapping scorr memory Q31-memShbSpecXcorr_e*/ + Word32 *memShbSpecMapping_fx, /* i/o: current frame's mapping Q31-memShbSpecMapping_e*/ + Word16 *memShbSpecMapping_e, + Word32 *memShbSpecXcorr_fx, /* i/o: ic bwe spec mapping scorr memory Q31-memShbSpecXcorr_e*/ Word16 *memShbSpecXcorr_e ) { Word16 idx; - + Word16 max_exp; Word16 Txx1_fx = 0, Txx2_fx = 0, Txx3_fx = 0, T_desired_fx = 0; Word16 Txx1_e = 0, Txx2_e = 0, Txx3_e = 0, T_desired_e = 0; Word16 T_nonref_target_fx, temp_fx; @@ -136,10 +137,10 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx( temp11_fx = dotp_fixed_ivas_fx( shb_frame_target_fx, shb_frame_target_e, shb_frame_target_fx + 1, shb_frame_target_e, L_FRAME16k - 1, &temp11_exp ); /* Q31-temp1_exp */ /* Calculate rxx(1)/rxx(0) of the non ref synth */ - temp0_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx, shb_synth_nonref_e, L_FRAME16k - 3, &temp0_exp ); /* Q31-temp0_exp */ - temp1_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 1, shb_synth_nonref_e, L_FRAME16k - 3, &temp1_exp ); /* Q31-temp1_exp */ - temp2_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 2, shb_synth_nonref_e, L_FRAME16k - 3, &temp2_exp ); /* Q31-temp2_exp */ - temp3_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, shb_synth_nonref_e, shb_synth_nonref_fx + 3, shb_synth_nonref_e, L_FRAME16k - 3, &temp3_exp ); /* Q31-temp3_exp */ + temp0_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx, *shb_synth_nonref_e, L_FRAME16k - 3, &temp0_exp ); /* Q31-temp0_exp */ + temp1_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 1, *shb_synth_nonref_e, L_FRAME16k - 3, &temp1_exp ); /* Q31-temp1_exp */ + temp2_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 2, *shb_synth_nonref_e, L_FRAME16k - 3, &temp2_exp ); /* Q31-temp2_exp */ + temp3_fx = dotp_fixed_ivas_fx( shb_synth_nonref_fx, *shb_synth_nonref_e, shb_synth_nonref_fx + 3, *shb_synth_nonref_e, L_FRAME16k - 3, &temp3_exp ); /* Q31-temp3_exp */ exp = s_max( *memShbSpecXcorr_e, s_max( s_max( s_max( temp00_exp, temp11_exp ), s_max( temp0_exp, temp1_exp ) ), s_max( temp2_exp, temp3_exp ) ) ); @@ -291,8 +292,19 @@ static Word16 ic_bwe_enc_specMapping_ivas_fx( *specMapping_fx = L_deposit_h( specMapping16 ); move32(); + max_exp = s_max( sub( *memShbSpecMapping_e, norm_l( *memShbSpecMapping_fx ) ), *shb_synth_nonref_e ); + + *memShbSpecMapping_fx = L_shl( *memShbSpecMapping_fx, sub( *memShbSpecMapping_e, max_exp ) ); // max_exp + move32(); + *memShbSpecMapping_e = max_exp; + move16(); + + scale_sig32( shb_synth_nonref_fx, L_FRAME16k, sub( *shb_synth_nonref_e, max_exp ) ); // max_exp + *shb_synth_nonref_e = max_exp; + move16(); + /* IC-BWE spec mapping */ - deemph_fx_32( 0, shb_synth_nonref_fx, extract_h( *specMapping_fx ), L_FRAME16k, memShbSpecMapping_fx ); + deemph_fx_32( shb_synth_nonref_fx, specMapping16, L_FRAME16k, memShbSpecMapping_fx ); // shb_synth_nonref_e return idx; } @@ -429,7 +441,7 @@ static void icbwe_dft_stereo_param_ivas_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i : */ Encoder_State *st, /* i/o: */ Word32 *shb_synth_nonref_fx, /* i/o: Q31-shb_synth_nonref_e*/ - Word16 shb_synth_nonref_e /* i/o: */ + Word16 *shb_synth_nonref_e /* i/o: */ ) { Word16 slopeILD_fx; @@ -439,7 +451,7 @@ static void icbwe_dft_stereo_param_ivas_fx( Word32 *nrg_L_fx, *nrg_R_fx, *nrg_DMX_fx; Word32 sum_nrg_L_fx, sum_nrg_R_fx, sum_nrg_DMX_fx; const Word32 spec_table_fx[4] = { -1288490189, -858993459, -429496730, 0 }; // Q31 - const Word16 slope_table_fx16[4] = { -17788, -10577, -4822, 0 }; // Q13 + const Word16 slope_table_fx16[4] = { -278, -165, -75, 0 }; // Q7 BSTR_ENC_HANDLE hBstr = st->hBstr; normFac_fx = 1342177280; /* 1000 * (10/((14400+10400)/2 - (6400+10400)/2)) */ // Q29 @@ -505,6 +517,7 @@ static void icbwe_dft_stereo_param_ivas_fx( IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) { /* Spec Mapping Estimate */ + Word16 max_exp; Word16 tmp1, exp1; Word32 L_tmp, L_tmp1; L_tmp = Mpy_32_32( hStereoICBWE->mem_nrg_L_fx[1], hStereoICBWE->mem_nrg_R_fx[0] ); // hStereoICBWE->mem_nrg_L_fx_e[1] + hStereoICBWE->mem_nrg_R_fx_e[1] @@ -527,10 +540,20 @@ static void icbwe_dft_stereo_param_ivas_fx( } hStereoICBWE->prevSpecMapping_fx = spec_table_fx[spIndx]; // q31 - /* ic bwe spec mapping application */ - deemph_fx_32( 0, shb_synth_nonref_fx, extract_l( L_shr( hStereoICBWE->prevSpecMapping_fx, 16 ) ), L_FRAME16k, &hStereoICBWE->memShbSpecMapping_fx ); // shb_synth_nonref_e - hStereoICBWE->memShbSpecMapping_e = shb_synth_nonref_e; + + max_exp = s_max( *shb_synth_nonref_e, sub( hStereoICBWE->memShbSpecMapping_e, norm_l( hStereoICBWE->memShbSpecMapping_fx ) ) ); + + hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( hStereoICBWE->memShbSpecMapping_e, max_exp ) ); // max_exp + move32(); + hStereoICBWE->memShbSpecMapping_e = max_exp; + move16(); + + scale_sig32( shb_synth_nonref_fx, L_FRAME16k, sub( *shb_synth_nonref_e, max_exp ) ); + *shb_synth_nonref_e = max_exp; move16(); + + /* ic bwe spec mapping application */ + deemph_fx_32( shb_synth_nonref_fx, extract_h( hStereoICBWE->prevSpecMapping_fx ), L_FRAME16k, &hStereoICBWE->memShbSpecMapping_fx ); // shb_synth_nonref_e } ELSE { @@ -572,7 +595,7 @@ static void icbwe_dft_stereo_param_ivas_fx( move32(); move16(); - gsIndx = ic_bwe_enc_gsMapping_ivas_fx( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e, hStereoICBWE->shbSynthRef_fx, hStereoICBWE->shbSynthRef_e, shb_synth_nonref_fx, &shb_synth_nonref_e, &( hStereoICBWE->prevgsMapping_fx ), &( hStereoICBWE->prevgsMapping_e ), hStereoICBWE->memGsEnerMap_fx, &hStereoICBWE->memGsEnerMap_e, st->element_mode ); /* Q0 */ + gsIndx = ic_bwe_enc_gsMapping_ivas_fx( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e, hStereoICBWE->shbSynthRef_fx, hStereoICBWE->shbSynthRef_e, shb_synth_nonref_fx, shb_synth_nonref_e, &( hStereoICBWE->prevgsMapping_fx ), &( hStereoICBWE->prevgsMapping_e ), hStereoICBWE->memGsEnerMap_fx, &hStereoICBWE->memGsEnerMap_e, st->element_mode ); /* Q0 */ hStereoICBWE->gDes_pastFrame_fx = L_deposit_h( gDes_fx ); /* Q31-exp */ hStereoICBWE->gDes_pastFrame_e = exp; @@ -800,7 +823,7 @@ void stereo_icBWE_enc_ivas_fx( move16(); } - icbwe_dft_stereo_param_ivas_fx( hStereoICBWE, hStereoDft, st, shb_synth_nonref_fx, shb_synth_nonref_e ); + icbwe_dft_stereo_param_ivas_fx( hStereoICBWE, hStereoDft, st, shb_synth_nonref_fx, &shb_synth_nonref_e ); } ELSE { @@ -1020,14 +1043,7 @@ void stereo_icBWE_enc_ivas_fx( IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) { /* IC BWE spectral mapping */ - Word32 max_abs_val; - maximum_abs_32_fx( shb_synth_nonref_fx, L_FRAME16k, &max_abs_val ); - IF( max_abs_val > 0 ) - { - scale_sig32( shb_synth_nonref_fx, L_FRAME16k, -1 ); - shb_synth_nonref_e = sub( shb_synth_nonref_e, -1 ); - } - spIndx = ic_bwe_enc_specMapping_ivas_fx( shb_frame_nonref_fx, shb_frame_nonref_e, shb_synth_nonref_fx, shb_synth_nonref_e, &( hStereoICBWE->prevSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_fx ), hStereoICBWE->memShbSpecXcorr_fx, &( hStereoICBWE->memShbSpecXcorr_e ) ); /* Q0 */ + spIndx = ic_bwe_enc_specMapping_ivas_fx( shb_frame_nonref_fx, shb_frame_nonref_e, shb_synth_nonref_fx, &shb_synth_nonref_e, &( hStereoICBWE->prevSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_fx ), &( hStereoICBWE->memShbSpecMapping_e ), hStereoICBWE->memShbSpecXcorr_fx, &( hStereoICBWE->memShbSpecXcorr_e ) ); /* Q0 */ } ELSE { -- GitLab From eb76c9cb525514513b14b663f4a9f7bce45ab6b8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 28 Mar 2025 16:33:13 +0530 Subject: [PATCH 0076/1310] Crash fix when Debugging mode was enabled --- lib_enc/ivas_core_pre_proc_front_fx.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 0eb6d1887..ec752e71a 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -242,8 +242,16 @@ ivas_error pre_proc_front_ivas_fx( move16(); #ifdef DEBUG_MODE_INFO - in_buff_temp = hSCE->hCoreCoder[n]->input32_fx; - in_q_temp = hSCE->hCoreCoder[n]->q_inp32; + IF( hSCE != NULL ) + { + in_buff_temp = hSCE->hCoreCoder[n]->input32_fx; + in_q_temp = hSCE->hCoreCoder[n]->q_inp32; + } + ELSE + { + in_buff_temp = hCPE->hCoreCoder[n]->input32_fx; + in_q_temp = hCPE->hCoreCoder[n]->q_inp32; + } #endif -- GitLab From 7e5738514934f1352dbda55ef54544ff955754b8 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Wed, 26 Mar 2025 14:54:23 +0100 Subject: [PATCH 0077/1310] minimal code cleanup in ivas_smc_gmm_fx(). There were two unncessary IF clauses which could be replaced with L_max. --- lib_enc/speech_music_classif_fx.c | 49 ++++++++++++------------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 63c0d5d54..189e6a8e2 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -856,16 +856,8 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { /*mx = PS_norm[i] > st->past_PS[i] ? PS_norm[i] : st->past_PS[i];*/ - IF( GT_32( PS_norm[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ) - { - mx = PS_norm[i]; - move16(); /*Q25 */ - } - ELSE - { - mx = hSpMusClas->past_PS_fx[i - LOWEST_FBIN]; - move16(); /*Q25 */ - } + mx = L_max( PS_norm[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); + move16(); /*Q25 */ /*ps_sta += mx / (dPS[i] + 1e-5f);*/ IF( !dPS[i] ) @@ -1611,7 +1603,7 @@ Word16 ivas_smc_gmm_fx( Word32 ps_fx[N_SMC_MIXTURES], pm_fx[N_SMC_MIXTURES], pn_fx[N_SMC_MIXTURES]; Word64 wprob_fx; Word32 fvm_fx[N_PCA_COEF]; - Word32 sum_PS_fx, ps_diff_fx, ps_sta_fx; + Word32 sum_PS_fx, ps_diff_fx; Word32 dlp_fx, wrelE_fx, wdrop_fx, wght_fx; Word32 wrise_fx; Word16 dlp_mean2var_fx; @@ -1989,32 +1981,29 @@ Word16 ivas_smc_gmm_fx( move32(); /* [14] ps_sta (spectral stationarity) */ - ps_sta_fx = 0; - move32(); - Word16 ps_sta_exp = 0; - move16(); - FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - IF( GT_32( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ) + Word32 ps_sta_fx = 0; + move32(); + Word16 ps_sta_exp = 0; + move16(); + Word32 avoid_divide_by_zero; + avoid_divide_by_zero = L_shr( 21475, sub( 31, Qfact_PS_past ) ); // 21475 = 1e-5 in Q31 + FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - temp32 = BASOP_Util_Divide3232_Scale_cadence( PS_norm_fx[i], ( L_add( dPS_fx[i], L_shr( 21475, sub( 31, Qfact_PS_past ) ) ) ), &temp_exp ); // 31-temp_exp + Word32 tmp_max; + tmp_max = L_max(PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); + + temp32 = BASOP_Util_Divide3232_Scale_cadence( tmp_max, L_add( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp move32(); ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); move32(); } - ELSE - { - // ps_sta += hSpMusClas->past_PS[i - LOWEST_FBIN] / ( dPS[i] + 1e-5f ); - temp32 = BASOP_Util_Divide3232_Scale_cadence( hSpMusClas->past_PS_fx[i - LOWEST_FBIN], ( L_add( dPS_fx[i], L_shr( 21475, sub( 31, Qfact_PS_past ) ) ) ), &temp_exp ); // 31-temp_exp - ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); - } + temp32_log = L_add( BASOP_Util_Log2( L_add_sat( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); + temp32_log = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ + *pFV_fx++ = L_shr( temp32_log, Q5 ); // logf( ps_sta + 1e-5f ); + move32(); + MVR2R_WORD32( &PS_norm_fx[LOWEST_FBIN], hSpMusClas->past_PS_fx, HIGHEST_FBIN - LOWEST_FBIN ); } - // temp32_log = L_add( BASOP_Util_Log2( L_add( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); - temp32_log = L_add( BASOP_Util_Log2( L_add_sat( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); - temp32_log = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ - *pFV_fx++ = L_shr( temp32_log, Q5 ); // logf( ps_sta + 1e-5f ); - move32(); - MVR2R_WORD32( &PS_norm_fx[LOWEST_FBIN], hSpMusClas->past_PS_fx, HIGHEST_FBIN - LOWEST_FBIN ); /* save ps_diff and ps_sta features for XTALK and UNCLR classifier */ IF( hStereoClassif != NULL ) -- GitLab From a4a0941a200ae798dd1e99b5e7ccf75e8645a244 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Wed, 26 Mar 2025 15:24:44 +0100 Subject: [PATCH 0078/1310] applied the clang patch. --- lib_enc/speech_music_classif_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 189e6a8e2..c293ceb3d 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -1991,7 +1991,7 @@ Word16 ivas_smc_gmm_fx( FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { Word32 tmp_max; - tmp_max = L_max(PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); + tmp_max = L_max( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); temp32 = BASOP_Util_Divide3232_Scale_cadence( tmp_max, L_add( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp move32(); -- GitLab From dbb240ebb931eafa0778e3479c5e21f0edf0b833 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 28 Mar 2025 13:45:15 +0100 Subject: [PATCH 0079/1310] remove unnecessary moves16(), move32(), keep closer to original code --- lib_enc/speech_music_classif_fx.c | 40 ++++++++++++++----------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index c293ceb3d..3f6449a0c 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -856,8 +856,7 @@ static Word16 sp_mus_classif_gmm_fx( /* o : decis FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { /*mx = PS_norm[i] > st->past_PS[i] ? PS_norm[i] : st->past_PS[i];*/ - mx = L_max( PS_norm[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); - move16(); /*Q25 */ + mx = L_max( PS_norm[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); /*Q25 */ /*ps_sta += mx / (dPS[i] + 1e-5f);*/ IF( !dPS[i] ) @@ -1981,29 +1980,26 @@ Word16 ivas_smc_gmm_fx( move32(); /* [14] ps_sta (spectral stationarity) */ + Word32 ps_sta_fx = 0; + move32(); + Word16 ps_sta_exp = 0; + move16(); + Word32 avoid_divide_by_zero; + avoid_divide_by_zero = L_shr( 21475, sub( 31, Qfact_PS_past ) ); // 21475 = 1e-5 in Q31 + + FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - Word32 ps_sta_fx = 0; - move32(); - Word16 ps_sta_exp = 0; - move16(); - Word32 avoid_divide_by_zero; - avoid_divide_by_zero = L_shr( 21475, sub( 31, Qfact_PS_past ) ); // 21475 = 1e-5 in Q31 - FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) - { - Word32 tmp_max; - tmp_max = L_max( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); + Word32 tmp_max; + tmp_max = L_max( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); - temp32 = BASOP_Util_Divide3232_Scale_cadence( tmp_max, L_add( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp - move32(); - ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); - move32(); - } - temp32_log = L_add( BASOP_Util_Log2( L_add_sat( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); - temp32_log = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ - *pFV_fx++ = L_shr( temp32_log, Q5 ); // logf( ps_sta + 1e-5f ); - move32(); - MVR2R_WORD32( &PS_norm_fx[LOWEST_FBIN], hSpMusClas->past_PS_fx, HIGHEST_FBIN - LOWEST_FBIN ); + temp32 = BASOP_Util_Divide3232_Scale_cadence( tmp_max, L_add( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp + ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); } + temp32_log = L_add( BASOP_Util_Log2( L_add_sat( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); + temp32_log = Mpy_32_32( temp32_log, 1488522239 ); /*logf(x) = log2(x)*logf(2)*/ + *pFV_fx++ = L_shr( temp32_log, Q5 ); // logf( ps_sta + 1e-5f ); + move32(); + MVR2R_WORD32( &PS_norm_fx[LOWEST_FBIN], hSpMusClas->past_PS_fx, HIGHEST_FBIN - LOWEST_FBIN ); /* save ps_diff and ps_sta features for XTALK and UNCLR classifier */ IF( hStereoClassif != NULL ) -- GitLab From 7acfb9dbb809362d8822d6de601b99f4f60820ef Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 11 Feb 2025 14:53:41 +0100 Subject: [PATCH 0080/1310] improve high complexity of param_mc_prm_est: MC/7-1-4/128kBit reduced by 166 WMOPS --- lib_com/options.h | 17 +++++-- lib_enc/ivas_mc_param_enc_fx.c | 83 ++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a25ba565e..e35eca130 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -68,9 +68,18 @@ #endif /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ -//#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ -#define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ #define FIX_1379_MASA_ANGLE_ROUND +#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_MADD_ADD_WEIGHTS /* FhG: Defines 1.0f-weight variables, uses Madd operation instead of L_add_sat */ +#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_SPLIT_LOOPS /* FhG: Splits single loop with IF-statements into two low-complex loops */ +#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_HQ_CONSTANTS /* FhG: IMPROVE PRECISION: Uses 1/6 and 1/20 in full-precise Q31 constants instead of Q15 */ +#define FIX_1101_IVAS_SPAR_DEC_UPMIXER_SF_USE_UNIQUE_SHL /* FhG: Uses unique shift amount in each loop iteration */ +#define FIX_11_1_IVAS_SPAR_DEC_UPMIXER_SF_RND_COEFFS /* FhG ivas_spar_com.c: Zeroes very small negative coeffs via L_shr_r (was L_shr) */ +#define FIX_ISSUE_1237 /* VA: replacement of Copy_Scale_sig_16_32_DEPREC() that are doing 16 bits left shift by Copy_Scale_sig_16_32_no_sat() */ +#define FIX_ISSUE_1237_KEEP_EVS_BE /* VA: Fix to keep EVS bitexactness to 26.444 */ +#define FIX_ISSUE_1214 /* Ittiam: Fix for issue 1214: Energy leakage in IGF tiles for MDCT-stereo @64kbps SWB*/ +#define FIX_881_HILBERT_FILTER /* VA: improve the precision of the Hilbert filter to remove 2kHz unwanted tone */ +#define FIX_ISSUE_1245 /* Ittiam: Fix for issue 1245: Basop Encoder: Audible noise for silent Stereo input DTX on @24.4 kbps, @32 kbps*/ +#define FIX_MINOR_SVD_WMOPS_MR1010X /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */ +#define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ +#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ #endif diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 039bbdf98..37ae4ef91 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -720,9 +720,16 @@ static void ivas_param_mc_param_est_enc_fx( } } +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST + Word16 gb = find_guarded_bits_fx( l_ts ); + Word16 add20gb = add( 20, gb ); +#endif + FOR( ts = start_ts; ts < num_time_slots; ts++ ) { +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST Word16 gb = find_guarded_bits_fx( l_ts ); +#endif ivas_fb_mixer_get_windowed_fr_fx( hParamMC->hFbMixer, pcm_in_fx, p_slot_frame_f_real_fx, p_slot_frame_f_imag_fx, l_ts, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans, gb ); ivas_fb_mixer_update_prior_input_fx( hParamMC->hFbMixer, pcm_in_fx, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans ); @@ -807,10 +814,25 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); +#else + a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band]); + a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e); + a_e = sub(add20gb, a_e); + b_e = norm_l( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band] ); + b_fx = L_shl( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], b_e ); + b_e = sub( add20gb, b_e ); + c_e = norm_l( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band] ); + c_fx = L_shl( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], c_e ); + c_e = sub( add20gb, c_e ); + d_e = norm_l( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band] ); + d_fx = L_shl( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], d_e ); + d_e = sub( add20gb, d_e ); +#endif /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); @@ -841,6 +863,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST dmx_real_fx[ch_idx1] = 0; move32(); dmx_real_e[ch_idx1] = 0; @@ -860,13 +883,49 @@ static void ivas_param_mc_param_est_enc_fx( move32(); p_dmx_fac_fx++; } +#else + Word32 real_fx = L_add(0, 0); + Word16 real_e = 0; + move16(); + Word32 imag_fx = L_add( 0, 0 ); + Word16 imag_e = 0; + move16(); + + FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) + { + L_tmp = Mpy_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); + real_fx = BASOP_Util_Add_Mant32Exp( real_fx, real_e, L_tmp, add20gb, &real_e ); + L_tmp = Mpy_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); + imag_fx = BASOP_Util_Add_Mant32Exp( imag_fx, imag_e, L_tmp, add( 20, gb ), &imag_e ); + p_dmx_fac_fx++; + } + dmx_real_fx[ch_idx1] = real_fx; + move32(); + dmx_real_e[ch_idx1] = real_e; + move16(); + dmx_imag_fx[ch_idx1] = imag_fx; + move32(); + dmx_imag_e[ch_idx1] = imag_e; + move16(); +#endif } /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST + a_fx = dmx_real_fx[ch_idx1]; + move32(); + a_e = dmx_real_e[ch_idx1]; + move16(); + b_fx = dmx_imag_fx[ch_idx1]; + move32(); + b_e = dmx_imag_e[ch_idx1]; + move16(); +#endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST a_fx = dmx_real_fx[ch_idx1]; move32(); a_e = dmx_real_e[ch_idx1]; @@ -888,6 +947,12 @@ static void ivas_param_mc_param_est_enc_fx( L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cx_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, &Cx_sum_e[cur_param_band][ch_idx1][ch_idx2] ); +#else + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, dmx_real_fx[ch_idx2] ), add( a_e, dmx_real_e[ch_idx2] ), Mpy_32_32( b_fx, dmx_imag_fx[ch_idx2] ), add( b_e, dmx_imag_e[ch_idx2] ), &tmp_e ); + Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cx_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, + &Cx_sum_e[cur_param_band][ch_idx1][ch_idx2] ); +#endif move32(); } } @@ -895,12 +960,30 @@ static void ivas_param_mc_param_est_enc_fx( /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST + a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); + a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); + a_e = sub( add20gb, a_e ); + b_e = norm_l( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band] ); + b_fx = L_shl( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], b_e ); + b_e = sub( add20gb, b_e ); +#endif FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); +#else + + c_e = norm_l( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band] ); + c_fx = L_shl( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], c_e ); + c_e = sub( add20gb, c_e ); + d_e = norm_l( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band] ); + d_fx = L_shl( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], d_e ); + d_e = sub( add20gb, d_e ); +#endif /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); -- GitLab From 26732f809b1397fe77800cf545d195caf95f3b92 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 11 Feb 2025 15:26:46 +0100 Subject: [PATCH 0081/1310] fix clang-fomat-issues --- lib_enc/ivas_mc_param_enc_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 37ae4ef91..788273b94 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -820,9 +820,9 @@ static void ivas_param_mc_param_est_enc_fx( c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); #else - a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band]); - a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e); - a_e = sub(add20gb, a_e); + a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); + a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); + a_e = sub( add20gb, a_e ); b_e = norm_l( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band] ); b_fx = L_shl( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], b_e ); b_e = sub( add20gb, b_e ); @@ -884,7 +884,7 @@ static void ivas_param_mc_param_est_enc_fx( p_dmx_fac_fx++; } #else - Word32 real_fx = L_add(0, 0); + Word32 real_fx = L_add( 0, 0 ); Word16 real_e = 0; move16(); Word32 imag_fx = L_add( 0, 0 ); -- GitLab From 0a4281e6c2204efcd9d764477c2fb69f99a85b4e Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 13 Feb 2025 22:07:15 +0100 Subject: [PATCH 0082/1310] completed tuning of MC param: no more BE now --- lib_com/options.h | 3 +- lib_enc/ivas_mc_param_enc_fx.c | 59 ++++++++++++++++++++++++++++------ 2 files changed, 51 insertions(+), 11 deletions(-) mode change 100644 => 100755 lib_enc/ivas_mc_param_enc_fx.c diff --git a/lib_com/options.h b/lib_com/options.h index e35eca130..bfff1b66a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,5 +81,6 @@ #define FIX_ISSUE_1245 /* Ittiam: Fix for issue 1245: Basop Encoder: Audible noise for silent Stereo input DTX on @24.4 kbps, @32 kbps*/ #define FIX_MINOR_SVD_WMOPS_MR1010X /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */ #define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ -#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ +#define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ +#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version */ #endif diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c old mode 100644 new mode 100755 index 788273b94..d150b1473 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -812,6 +812,24 @@ static void ivas_param_mc_param_est_enc_fx( /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST + a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); + a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); + a_e = sub( add20gb, a_e ); + if ( a_fx == 0 ) + { + a_e = 0; + move16(); + } + b_e = norm_l( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band] ); + b_fx = L_shl( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], b_e ); + b_e = sub( add20gb, b_e ); + if ( b_fx == 0 ) + { + b_e = 0; + move16(); + } +#endif FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { #ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST @@ -820,20 +838,23 @@ static void ivas_param_mc_param_est_enc_fx( c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); #else - a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); - a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); - a_e = sub( add20gb, a_e ); - b_e = norm_l( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band] ); - b_fx = L_shl( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], b_e ); - b_e = sub( add20gb, b_e ); c_e = norm_l( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band] ); c_fx = L_shl( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], c_e ); c_e = sub( add20gb, c_e ); + if ( c_fx == 0 ) + { + c_e = 0; + move16(); + } d_e = norm_l( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band] ); d_fx = L_shl( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], d_e ); d_e = sub( add20gb, d_e ); + if ( d_fx == 0 ) + { + d_e = 0; + move16(); + } #endif - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], @@ -896,7 +917,7 @@ static void ivas_param_mc_param_est_enc_fx( L_tmp = Mpy_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); real_fx = BASOP_Util_Add_Mant32Exp( real_fx, real_e, L_tmp, add20gb, &real_e ); L_tmp = Mpy_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - imag_fx = BASOP_Util_Add_Mant32Exp( imag_fx, imag_e, L_tmp, add( 20, gb ), &imag_e ); + imag_fx = BASOP_Util_Add_Mant32Exp( imag_fx, imag_e, L_tmp, add20gb, &imag_e ); p_dmx_fac_fx++; } dmx_real_fx[ch_idx1] = real_fx; @@ -964,9 +985,19 @@ static void ivas_param_mc_param_est_enc_fx( a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); a_e = sub( add20gb, a_e ); + if ( a_fx == 0 ) + { + a_e = 0; + move16(); + } b_e = norm_l( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band] ); b_fx = L_shl( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], b_e ); b_e = sub( add20gb, b_e ); + if ( b_fx == 0 ) + { + b_e = 0; + move16(); + } #endif FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { @@ -976,15 +1007,23 @@ static void ivas_param_mc_param_est_enc_fx( c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); #else - c_e = norm_l( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band] ); c_fx = L_shl( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], c_e ); c_e = sub( add20gb, c_e ); + if ( c_fx == 0 ) + { + c_e = 0; + move16(); + } d_e = norm_l( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band] ); d_fx = L_shl( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], d_e ); d_e = sub( add20gb, d_e ); + if ( d_fx == 0 ) + { + d_e = 0; + move16(); + } #endif - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, -- GitLab From a54e71469275581829e4f24cc5229f075e308393 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 20 Feb 2025 10:23:33 +0100 Subject: [PATCH 0083/1310] version now with 2 macros for NONBE and BE code parts --- lib_enc/ivas_mc_param_enc_fx.c | 44 ++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index d150b1473..c1a8e5877 100755 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -720,14 +720,14 @@ static void ivas_param_mc_param_est_enc_fx( } } -#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#if defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE ) || defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE ) Word16 gb = find_guarded_bits_fx( l_ts ); Word16 add20gb = add( 20, gb ); #endif FOR( ts = start_ts; ts < num_time_slots; ts++ ) { -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#if !defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE ) && !defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE ) Word16 gb = find_guarded_bits_fx( l_ts ); #endif ivas_fb_mixer_get_windowed_fr_fx( hParamMC->hFbMixer, pcm_in_fx, p_slot_frame_f_real_fx, p_slot_frame_f_imag_fx, l_ts, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans, gb ); @@ -738,6 +738,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( i = 0; i < nchan_input; i++ ) { pcm_in_fx[i] += l_ts; + move32(); } /* Computing the downmix */ FOR( cur_param_band = 0; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band++ ) @@ -755,6 +756,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE dmx_real_fx[ch_idx1] = 0; move32(); dmx_real_e[ch_idx1] = 0; @@ -773,6 +775,28 @@ static void ivas_param_mc_param_est_enc_fx( move32(); p_dmx_fac_fx++; } +#else + Word32 real_fx = L_add(0,0); + Word16 real_e = add(0, 0); + Word32 imag_fx = L_add( 0, 0 ); + Word16 imag_e = add( 0, 0 ); + FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) + { + L_tmp = Mpy_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); + real_fx = BASOP_Util_Add_Mant32Exp( real_fx, real_e, L_tmp, add20gb, &real_e ); + L_tmp = Mpy_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); + imag_fx = BASOP_Util_Add_Mant32Exp( imag_fx, imag_e, L_tmp, add20gb, &imag_e ); + p_dmx_fac_fx++; + } + dmx_real_fx[ch_idx1] = real_fx; + dmx_real_e[ch_idx1] = real_e; + dmx_imag_fx[ch_idx1] = imag_fx; + dmx_imag_e[ch_idx1] = imag_e; + move32(); + move16(); + move32(); + move16(); +#endif } /* Cx for transport channels */ @@ -812,7 +836,7 @@ static void ivas_param_mc_param_est_enc_fx( /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { -#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); a_e = sub( add20gb, a_e ); @@ -832,7 +856,7 @@ static void ivas_param_mc_param_est_enc_fx( #endif FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); @@ -884,7 +908,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE dmx_real_fx[ch_idx1] = 0; move32(); dmx_real_e[ch_idx1] = 0; @@ -934,7 +958,7 @@ static void ivas_param_mc_param_est_enc_fx( /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE a_fx = dmx_real_fx[ch_idx1]; move32(); a_e = dmx_real_e[ch_idx1]; @@ -946,7 +970,7 @@ static void ivas_param_mc_param_est_enc_fx( #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE a_fx = dmx_real_fx[ch_idx1]; move32(); a_e = dmx_real_e[ch_idx1]; @@ -981,7 +1005,7 @@ static void ivas_param_mc_param_est_enc_fx( /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { -#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); a_e = sub( add20gb, a_e ); @@ -1001,7 +1025,7 @@ static void ivas_param_mc_param_est_enc_fx( #endif FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST +#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); @@ -1028,7 +1052,7 @@ static void ivas_param_mc_param_est_enc_fx( L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, &Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); - move32(); +pri move32(); } } } -- GitLab From 10a3bd68e413c0a5632f78c975bbee1bd1ca2553 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 20 Feb 2025 10:25:46 +0100 Subject: [PATCH 0084/1310] fix stupid typo --- lib_enc/ivas_mc_param_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index c1a8e5877..1e681d030 100755 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -1052,7 +1052,7 @@ static void ivas_param_mc_param_est_enc_fx( L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, &Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); -pri move32(); + move32(); } } } -- GitLab From 6116f7b9779c57d13914f1454bd8c7d8c7f19d83 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 20 Feb 2025 10:28:27 +0100 Subject: [PATCH 0085/1310] fix clang-format-issues --- lib_enc/ivas_mc_param_enc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 lib_enc/ivas_mc_param_enc_fx.c diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c old mode 100755 new mode 100644 index 1e681d030..92cd33e2f --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -776,8 +776,8 @@ static void ivas_param_mc_param_est_enc_fx( p_dmx_fac_fx++; } #else - Word32 real_fx = L_add(0,0); - Word16 real_e = add(0, 0); + Word32 real_fx = L_add( 0, 0 ); + Word16 real_e = add( 0, 0 ); Word32 imag_fx = L_add( 0, 0 ); Word16 imag_e = add( 0, 0 ); FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) -- GitLab From 05442c393d4e0db6bc2c220fcfbf1ecf2c40cacb Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 20 Feb 2025 11:32:40 +0100 Subject: [PATCH 0086/1310] deactivated temporarily the NONBE part of this MR to check the pipeline results --- lib_com/options.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index bfff1b66a..c83adeb3a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,6 +81,11 @@ #define FIX_ISSUE_1245 /* Ittiam: Fix for issue 1245: Basop Encoder: Audible noise for silent Stereo input DTX on @24.4 kbps, @32 kbps*/ #define FIX_MINOR_SVD_WMOPS_MR1010X /* FhG: Minor WMOPS tuning, bit-exact to previous version, saves about 8.2 WMOPS for MR1010 */ #define SVD_WMOPS_OPT /* Ittiam : SVD related optimizations */ -#define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ -#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version */ +// #define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ +/* Both following 2 macros (IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST*) are independent from each other, they refer to different code blocks */ +#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ +//#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version */ +#define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ +#define FIX_ISSUE_1279 /* VA: correction of wrong scaling update */ +#define FIX_ISSUE_1247 #endif -- GitLab From fc387514c9302e926028e13f5bdd8c150f8fc743 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 20 Feb 2025 14:57:16 +0100 Subject: [PATCH 0087/1310] reactivated NONBE modifications to see pipeline effects --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index c83adeb3a..6b0cbedc8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,7 +84,7 @@ // #define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ /* Both following 2 macros (IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST*) are independent from each other, they refer to different code blocks */ #define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ -//#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version */ +#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version */ #define NONBE_FIX_1087_OOB_SBA_DTX_RS /* VA: issue 1087: Extend the length of the buffer for MCT decoding to avoid out-of-bound writing in SBA SID bitrate switching decoding */ #define FIX_ISSUE_1279 /* VA: correction of wrong scaling update */ #define FIX_ISSUE_1247 -- GitLab From a580e8872979581d899534faa09f43d79d8b76dc Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Tue, 25 Mar 2025 13:55:52 -0400 Subject: [PATCH 0088/1310] replace EVS push_indice_fx with push_indice (from IVAS) --- lib_com/bitstream_fx.c | 6 +-- lib_com/gs_gains_fx.c | 28 ++++++------- lib_com/hq_tools_fx.c | 4 +- lib_com/pvq_com_fx.c | 2 +- lib_enc/FEC_enc_fx.c | 6 +-- lib_enc/acelp_core_enc_fx.c | 4 +- lib_enc/acelp_core_switch_enc_fx.c | 8 ++-- lib_enc/amr_wb_enc_fx.c | 2 +- lib_enc/avq_cod_fx.c | 20 +++++----- lib_enc/cng_enc_fx.c | 24 +++++------ lib_enc/cod2t32_fx.c | 6 +-- lib_enc/cod4t64_fx.c | 30 +++++++------- lib_enc/decision_matrix_enc_fx.c | 64 +++++++++++++++--------------- lib_enc/enc_amr_wb_fx.c | 4 +- lib_enc/enc_gen_voic_fx.c | 6 +-- lib_enc/enc_higher_acelp_fx.c | 4 +- lib_enc/enc_pit_exc_fx.c | 6 +-- lib_enc/enc_tran_fx.c | 62 ++++++++++++++--------------- lib_enc/enc_uv_fx.c | 2 +- lib_enc/eval_pit_contr_fx.c | 6 +-- lib_enc/fd_cng_enc_fx.c | 12 +++--- lib_enc/gain_enc_fx.c | 20 +++++----- lib_enc/gaus_enc_fx.c | 6 +-- lib_enc/gs_enc_fx.c | 20 +++++----- lib_enc/hq_classifier_enc_fx.c | 8 ++-- lib_enc/hq_core_enc_fx.c | 8 ++-- lib_enc/hq_env_enc_fx.c | 24 +++++------ lib_enc/hq_hr_enc_fx.c | 4 +- lib_enc/hq_lr_enc_fx.c | 62 ++++++++++++++--------------- lib_enc/hvq_enc_fx.c | 2 +- lib_enc/isf_enc_amr_wb_fx.c | 34 ++++++++-------- lib_enc/lsf_enc_fx.c | 18 ++++----- lib_enc/nelp_enc_fx.c | 8 ++-- lib_enc/peak_vq_enc_fx.c | 36 ++++++++--------- lib_enc/pit_enc_fx.c | 8 ++-- lib_enc/ppp_enc_fx.c | 8 ++-- lib_enc/range_enc_fx.c | 8 ++-- lib_enc/stat_noise_uv_enc_fx.c | 2 +- lib_enc/swb_bwe_enc_fx.c | 46 ++++++++++----------- lib_enc/swb_bwe_enc_hr_fx.c | 22 +++++----- lib_enc/swb_bwe_enc_lr_fx.c | 6 +-- lib_enc/swb_tbe_enc_fx.c | 28 ++++++------- lib_enc/tcq_core_enc_fx.c | 4 +- lib_enc/transition_enc_fx.c | 36 ++++++++--------- lib_enc/voiced_enc_fx.c | 2 +- 45 files changed, 363 insertions(+), 363 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index e144c2cc9..667958264 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -240,11 +240,11 @@ Word16 rate2EVSmode( } /*-------------------------------------------------------------------* - * push_indice_fx( ) + * push_indice( ) * * Push a new indice into the buffer *-------------------------------------------------------------------*/ - +#if 0 void push_indice_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ Word16 id, /* i : ID of the indice */ @@ -288,7 +288,7 @@ void push_indice_fx( return; } - +#endif /*-------------------------------------------------------------------* * push_next_indice_fx() * * Push a new indice into the buffer at the next position diff --git a/lib_com/gs_gains_fx.c b/lib_com/gs_gains_fx.c index 35236b603..ecfe9aae0 100644 --- a/lib_com/gs_gains_fx.c +++ b/lib_com/gs_gains_fx.c @@ -1028,7 +1028,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ mean_4g[0] = round_fx( L_tmp ); move16(); idx_g = vquant_fx( mean_4g, Gain_meanNB_fx, mean_4g, Gain_mean_dicNB_fx, 1, 64 ); - push_indice_fx( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); FOR( i = 0; i < Mbands_gn; i++ ) { @@ -1040,21 +1040,21 @@ Word16 gsc_gainQ_fx( /*Q12*/ move16(); set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); idx_g = vquant_fx( y_gain_tmp, Mean_dic_NB_fx, y_gain_tmp, Gain_dic1_NB_fx, 3, 64 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); IF( LT_32( core_brate, ACELP_9k60 ) ) { idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NB_fx, 3, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NB_fx, 4, 16 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); } ELSE { idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NBHR_fx, 3, 64 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NBHR_fx, 4, 128 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); } /*add end */ test(); @@ -1122,7 +1122,7 @@ Word16 gsc_gainQ_fx( /*Q12*/ move16(); idx_g = vquant_fx( mean_4g, mean_m_fx, mean_4g, mean_gain_dic_fx, 1, 64 ); - push_indice_fx( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); FOR( i = 0; i < Mbands_gn; i++ ) { @@ -1148,11 +1148,11 @@ Word16 gsc_gainQ_fx( /*Q12*/ move16(); idx_g = vquant_fx( y_gain_tmp2, YGain_mean_LR_fx, y_gain_tmp2, YGain_dic1_LR_fx, 3, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp2 + 3, YGain_mean_LR_fx + 3, y_gain_tmp2 + 3, YGain_dic2_LR_fx, 4, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp2 + 7, YGain_mean_LR_fx + 7, y_gain_tmp2 + 7, YGain_dic3_LR_fx, 5, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); set16_fx( y_gain_tmp2 + 12, 0, MBANDS_GN - 12 ); /* Update to quantized vector */ @@ -1185,13 +1185,13 @@ Word16 gsc_gainQ_fx( /*Q12*/ ELSE { idx_g = vquant_fx( y_gain_tmp, YG_mean16_fx, y_gain_tmp, YG_dicMR_1_fx, 4, 64 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16_fx + 4, y_gain_tmp + 4, YG_dicMR_2_fx, 4, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16_fx + 8, y_gain_tmp + 8, YG_dicMR_3_fx, 4, 32 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16_fx + 12, y_gain_tmp + 12, YG_dicMR_4_fx, 4, 16 ); - push_indice_fx( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); } } diff --git a/lib_com/hq_tools_fx.c b/lib_com/hq_tools_fx.c index cf3ce202e..0e00b9428 100644 --- a/lib_com/hq_tools_fx.c +++ b/lib_com/hq_tools_fx.c @@ -2036,7 +2036,7 @@ Word16 calc_nor_delta_hf_fx( /* updating norm & storing delta norm */ add_bits_denv = 2; move16(); - push_indice_fx( hBstr, IND_DELTA_ENV_HQ, sub( bitsforDelta, 2 ), 2 ); + push_indice( hBstr, IND_DELTA_ENV_HQ, sub( bitsforDelta, 2 ), 2 ); FOR( i = num_env_bands; i < nb_sfm; ++i ) { IF( Rsubband[i] != 0 ) @@ -2052,7 +2052,7 @@ Word16 calc_nor_delta_hf_fx( delta = min_delta; /*Q0*/ move16(); } - push_indice_fx( hBstr, IND_DELTA_ENV_HQ, delta - min_delta, bitsforDelta ); + push_indice( hBstr, IND_DELTA_ENV_HQ, delta - min_delta, bitsforDelta ); ynrm[i] = add( ynrm[i], delta ); /*Q0*/ move16(); add_bits_denv = add( add_bits_denv, bitsforDelta ); diff --git a/lib_com/pvq_com_fx.c b/lib_com/pvq_com_fx.c index 479bc04d9..9cf1226d8 100644 --- a/lib_com/pvq_com_fx.c +++ b/lib_com/pvq_com_fx.c @@ -622,7 +622,7 @@ void fine_gain_quant_fx( gain_db = round_fx_sat( L_shl_o( L_tmp, 17, &Overflow ) ); idx = squant_fx( gain_db, &gain_dbq, finegain_fx[gbits - 1], gain_cb_size[gbits - 1] ); - push_indice_fx( hBstr, IND_PVQ_FINE_GAIN, idx, gbits ); + push_indice( hBstr, IND_PVQ_FINE_GAIN, idx, gbits ); L_tmp = L_mult0( gain_dbq, 21771 ); /* 21771=0.05*log2(10) */ /* 14+17=31 */ L_tmp = L_shr( L_tmp, 15 ); /* Q16 */ diff --git a/lib_enc/FEC_enc_fx.c b/lib_enc/FEC_enc_fx.c index 87243e8d2..69b14eb9b 100644 --- a/lib_enc/FEC_enc_fx.c +++ b/lib_enc/FEC_enc_fx.c @@ -94,7 +94,7 @@ void FEC_encode_fx( index = 3; move16(); } - push_indice_fx( hBstr, IND_FEC_CLAS, index, FEC_BITS_CLS ); + push_indice( hBstr, IND_FEC_CLAS, index, FEC_BITS_CLS ); } /*-----------------------------------------------------------------* @@ -117,7 +117,7 @@ void FEC_encode_fx( tmpS = s_min( tmpS, 31 ); tmpS = s_max( tmpS, 0 ); - push_indice_fx( hBstr, IND_FEC_ENR, tmpS, FEC_BITS_ENR ); + push_indice( hBstr, IND_FEC_ENR, tmpS, FEC_BITS_ENR ); } /*-----------------------------------------------------------------* * Encode last glottal pulse position (8 bits) @@ -157,7 +157,7 @@ void FEC_encode_fx( maxi = add( maxi, 128 ); /* use 8 bits (MSB represent the sign of the pulse) Q0*/ } - push_indice_fx( hBstr, IND_FEC_POS, maxi, FEC_BITS_POS ); + push_indice( hBstr, IND_FEC_POS, maxi, FEC_BITS_POS ); } maxi = 0; move16(); diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index f9f941dbd..795f03403 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -472,7 +472,7 @@ ivas_error acelp_core_enc_fx( IF( nb_bits > 0 ) { Es_pred_enc_fx( &Es_pred_fx, &indice, st_fx->L_frame, res_fx, st_fx->voicing_fx, nb_bits, 0, Q_new ); - push_indice_fx( st_fx->hBstr, IND_ES_PRED, indice, nb_bits ); + push_indice( st_fx->hBstr, IND_ES_PRED, indice, nb_bits ); } @@ -619,7 +619,7 @@ ivas_error acelp_core_enc_fx( WHILE( nBits > 0 ) { i = s_min( nBits, 16 ); // Q0 - push_indice_fx( st_fx->hBstr, IND_UNUSED, 0, i ); + push_indice( st_fx->hBstr, IND_UNUSED, 0, i ); nBits = sub( nBits, i ); // Q0 } } diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index f9058b9b9..9b0ed8b58 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -441,7 +441,7 @@ static void encod_gen_voic_core_switch_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*-----------------------------------------------------------------* @@ -489,7 +489,7 @@ static void encod_gen_voic_core_switch_fx( /* write reserved bits */ IF( unbits ) { - push_indice_fx( hBstr, IND_UNUSED, 0, unbits ); + push_indice( hBstr, IND_UNUSED, 0, unbits ); } /*-----------------------------------------------------------------* @@ -838,7 +838,7 @@ static void bwe_switch_enc_fx( } } - push_indice_fx( hBstr, IND_CORE_SWITCHING_AUDIO_DELAY, d1m_fx, AUDIODELAYBITS ); + push_indice( hBstr, IND_CORE_SWITCHING_AUDIO_DELAY, d1m_fx, AUDIODELAYBITS ); tmp = add( i_mult2( d1m_fx, delta_fx ), fdelay_fx ); /* Q0 */ ptmp = &hb_synth_tmp_fx[tmp]; /* Q0 */ @@ -867,7 +867,7 @@ static void bwe_switch_enc_fx( L_tmp1 = L_shl( L_tmp1, sub( q_tmp2, 24 ) ); gain_fx = round_fx_o( Isqrt( L_tmp1 ), &Overflow ); /*Q12 */ ind1_fx = usquant_fx( gain_fx, &gain_fx, shr( MINVALUEOFFIRSTGAIN_FX, 1 ), shr( DELTAOFFIRSTGAIN_FX, 4 ), ( 1 << NOOFGAINBITS1 ) ); /* Q0 */ - push_indice_fx( hBstr, IND_CORE_SWITCHING_AUDIO_GAIN, ind1_fx, NOOFGAINBITS1 ); + push_indice( hBstr, IND_CORE_SWITCHING_AUDIO_GAIN, ind1_fx, NOOFGAINBITS1 ); return; } diff --git a/lib_enc/amr_wb_enc_fx.c b/lib_enc/amr_wb_enc_fx.c index b1b2257e2..6f46e5c12 100644 --- a/lib_enc/amr_wb_enc_fx.c +++ b/lib_enc/amr_wb_enc_fx.c @@ -548,7 +548,7 @@ void amr_wb_enc_fx( * Write VAD information into the bitstream in AMR-WB IO mode *--------------------------------------------------------------------------------------*/ - push_indice_fx( st->hBstr, IND_VAD_FLAG, st->vad_flag, 1 ); + push_indice( st->hBstr, IND_VAD_FLAG, st->vad_flag, 1 ); } /*-----------------------------------------------------------------* diff --git a/lib_enc/avq_cod_fx.c b/lib_enc/avq_cod_fx.c index 962b715cd..b3a49c59e 100644 --- a/lib_enc/avq_cod_fx.c +++ b/lib_enc/avq_cod_fx.c @@ -384,20 +384,20 @@ void AVQ_encmux_fx( /* write the unary code */ FOR( ; j > 16; j -= 16 ) { - push_indice_fx( hBstr, nq_ind, 65535, 16 ); + push_indice( hBstr, nq_ind, 65535, 16 ); bits = sub( bits, 16 ); } IF( j > 0 ) { - push_indice_fx( hBstr, nq_ind, extract_l( L_sub( L_shl( 1L, j ), 1L ) ), j ); + push_indice( hBstr, nq_ind, extract_l( L_sub( L_shl( 1L, j ), 1L ) ), j ); bits = sub( bits, j ); } } IF( !overflow ) { /* write the stop bit */ - push_indice_fx( hBstr, nq_ind, 0, 1 ); + push_indice( hBstr, nq_ind, 0, 1 ); bits = sub( bits, 1 ); } @@ -506,13 +506,13 @@ void AVQ_encmux_fx( IF( j > 0 ) { /* write the unary code */ - push_indice_fx( hBstr, nq_ind, sub( shl( 1, j ), 1 ), j ); + push_indice( hBstr, nq_ind, sub( shl( 1, j ), 1 ), j ); } IF( nq[i] != 0 ) { /* write the stop bit */ - push_indice_fx( hBstr, nq_ind, 0, 1 ); + push_indice( hBstr, nq_ind, 0, 1 ); } /*Compute AVQ code book number from unused Bits */ @@ -1099,32 +1099,32 @@ static void wrte_cv( ELSE IF( LT_16( nq, 5 ) ) /* Q2, Q3, Q4 */ { nq4 = shl( nq, 2 ); - push_indice_fx( hBstr, i_ind, I, nq4 ); + push_indice( hBstr, i_ind, I, nq4 ); bits = sub( bits, nq4 ); } ELSE IF( EQ_16( s_and( nq, 1 ), 0 ) ) /* Q4 + Voronoi extensions r=1,2,3,... */ { - push_indice_fx( hBstr, i_ind, I, 4 * 4 ); + push_indice( hBstr, i_ind, I, 4 * 4 ); bits = sub( bits, 4 * 4 ); /*pos = (int16_t)(nq / 2 - 2);*/ /* Voronoi order determination */ pos = sub( shr( nq, 1 ), 2 ); FOR( j = 0; j < 8; j++ ) { - push_indice_fx( hBstr, kv_ind, kv[j], pos ); + push_indice( hBstr, kv_ind, kv[j], pos ); } bits = sub( bits, shl( pos, 3 ) ); } ELSE /* Q3 + Voronoi extensions r=1,2,3,... */ { - push_indice_fx( hBstr, i_ind, I, 4 * 3 ); + push_indice( hBstr, i_ind, I, 4 * 3 ); bits = sub( bits, 4 * 3 ); /*pos = (int16_t)(nq / 2 - 1);*/ /* Voronoi order determination */ pos = sub( shr( nq, 1 ), 1 ); FOR( j = 0; j < 8; j++ ) { - push_indice_fx( hBstr, kv_ind, kv[j], pos ); + push_indice( hBstr, kv_ind, kv[j], pos ); } bits = sub( bits, shl( pos, 3 ) ); diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index e2b29ba59..221454970 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -975,7 +975,7 @@ void CNG_enc_fx( hTdCngEnc->old_enr_index = enr_index; move16(); - push_indice_fx( hBstr, IND_ENERGY, enr_index, num_bits ); + push_indice( hBstr, IND_ENERGY, enr_index, num_bits ); if ( enr_index == 0 ) { enr_index = -5; @@ -1063,7 +1063,7 @@ void CNG_enc_fx( move16(); } } - push_indice_fx( hBstr, IND_CNG_ENV1, min1_idx, 6 ); + push_indice( hBstr, IND_CNG_ENV1, min1_idx, 6 ); /* get quantized res_env_details */ FOR( i = 0; i < NUM_ENV_CNG; i++ ) { @@ -1122,28 +1122,28 @@ void CNG_enc_fx( /* dithering bit for AMR-WB IO mode is always set to 0 */ IF( EQ_32( st_fx->core_brate, SID_1k75 ) ) { - push_indice_fx( hBstr, IND_DITHERING, 0, 1 ); + push_indice( hBstr, IND_DITHERING, 0, 1 ); } IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) { IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 1, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 1, 1 ); } ELSE { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 0, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 0, 1 ); } - push_indice_fx( hBstr, IND_CNG_HO, s_min( hTdCngEnc->burst_ho_cnt, 7 ), 3 ); + push_indice( hBstr, IND_CNG_HO, s_min( hTdCngEnc->burst_ho_cnt, 7 ), 3 ); hTdCngEnc->num_ho = m; move16(); - push_indice_fx( hBstr, IND_SID_TYPE, 0, 1 ); + push_indice( hBstr, IND_SID_TYPE, 0, 1 ); test(); IF( LT_32( st_fx->input_Fs, 32000 ) && NE_16( st_fx->element_mode, IVAS_CPE_DFT ) ) { - push_indice_fx( hBstr, IND_SID_BW, 0, 1 ); + push_indice( hBstr, IND_SID_BW, 0, 1 ); *sid_bw = 0; move16(); } @@ -2458,8 +2458,8 @@ static void shb_CNG_encod_fx( idx_ener_fx = s_max( idx_ener_fx, 0 ); } - push_indice_fx( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); - push_indice_fx( hBstr, IND_SID_BW, 1, 1 ); + push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); + push_indice( hBstr, IND_SID_BW, 1, 1 ); hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_CNG_ENV1].nb_bits ); hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; move16(); @@ -2470,7 +2470,7 @@ static void shb_CNG_encod_fx( } else { - push_indice_fx( hBstr, IND_UNUSED, 0, 2 ); + push_indice( hBstr, IND_UNUSED, 0, 2 ); } hTdCngEnc->ho_sid_bw = L_shl( L_and( hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); hTdCngEnc->ho_sid_bw = L_or( hTdCngEnc->ho_sid_bw, 0x1L ); @@ -2482,7 +2482,7 @@ static void shb_CNG_encod_fx( IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) { hTdCngEnc->ho_sid_bw = L_shl( L_and( hTdCngEnc->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); - push_indice_fx( hBstr, IND_SID_BW, 0, 1 ); + push_indice( hBstr, IND_SID_BW, 0, 1 ); } } diff --git a/lib_enc/cod2t32_fx.c b/lib_enc/cod2t32_fx.c index a948a4656..dc967e656 100644 --- a/lib_enc/cod2t32_fx.c +++ b/lib_enc/cod2t32_fx.c @@ -292,7 +292,7 @@ void acelp_2t32_fx( } { /* write index to array of indices */ - push_indice_fx( hBstr, IND_ALG_CDBK_2T32, index, 12 ); + push_indice( hBstr, IND_ALG_CDBK_2T32, index, 12 ); } return; } @@ -636,11 +636,11 @@ void acelp_1t64_fx( } IF( EQ_16( L_subfr, L_SUBFR ) ) { - push_indice_fx( hBstr, IND_ALG_CDBK_1T64, index, 7 ); + push_indice( hBstr, IND_ALG_CDBK_1T64, index, 7 ); } ELSE /* L_subfr == 2*L_SUBFR */ { - push_indice_fx( hBstr, IND_ALG_CDBK_1T64, index, 8 ); + push_indice( hBstr, IND_ALG_CDBK_1T64, index, 8 ); } return; diff --git a/lib_enc/cod4t64_fx.c b/lib_enc/cod4t64_fx.c index 99b794b42..457a129b8 100644 --- a/lib_enc/cod4t64_fx.c +++ b/lib_enc/cod4t64_fx.c @@ -330,11 +330,11 @@ Word16 acelp_4t64_fx( bitcnt = s_and( nbbits, 15 ); FOR( i = 0; i < wordcnt; i++ ) { - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], 16 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], 16 ); } IF( bitcnt ) { - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], bitcnt ); + push_indice( hBstr, IND_ALG_CDBK_4T64, indexing_indices[i], bitcnt ); } } ELSE @@ -347,7 +347,7 @@ Word16 acelp_4t64_fx( { k = i_mult2( track, NPMAXPT ); index = quant_1p_N1_fx( ind[k], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 5 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 5 ); } } ELSE IF( EQ_16( nbbits, 36 ) ) @@ -357,7 +357,7 @@ Word16 acelp_4t64_fx( k = i_mult2( track, NPMAXPT ); /* k = track * NPMAXPT;*/ index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 9 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 ); } } ELSE IF( EQ_16( nbbits, 44 ) ) /* AMR-WB pulse indexing */ @@ -366,14 +366,14 @@ Word16 acelp_4t64_fx( { k = i_mult2( track, NPMAXPT ); index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 13 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 ); } FOR( track = 2; track < NB_TRACK_FCB_4T; track++ ) { k = i_mult2( track, NPMAXPT ); index = quant_2p_2N1_fx( ind[k], ind[k + 1], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 9 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 9 ); } } ELSE IF( EQ_16( nbbits, 52 ) ) /* AMR-WB pulse indexing */ @@ -382,7 +382,7 @@ Word16 acelp_4t64_fx( { k = i_mult2( track, NPMAXPT ); index = quant_3p_3N1_fx( ind[k], ind[k + 1], ind[k + 2], 4 ); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64, index, 13 ); + push_indice( hBstr, IND_ALG_CDBK_4T64, index, 13 ); } } ELSE IF( EQ_16( nbbits, 64 ) ) /* AMR-WB pulse indexing */ @@ -393,7 +393,7 @@ Word16 acelp_4t64_fx( L_index = quant_4p_4N_fx( &ind[k], 4 ); index = extract_l( L_shr( L_index, 14 ) & 3 ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); } FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) @@ -402,7 +402,7 @@ Word16 acelp_4t64_fx( L_index = quant_4p_4N_fx( &ind[k], 4 ); index = extract_l( L_index & 0x3FFF ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); } } ELSE IF( EQ_16( nbbits, 72 ) ) @@ -413,7 +413,7 @@ Word16 acelp_4t64_fx( L_index = quant_5p_5N_fx( &ind[k], 4 ); index = extract_l( L_shr( L_index, 10 ) & 0x03FF ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 10 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 10 ); } FOR( track = 2; track < NB_TRACK_FCB_4T; track++ ) @@ -422,7 +422,7 @@ Word16 acelp_4t64_fx( L_index = quant_4p_4N_fx( &ind[k], 4 ); index = extract_l( L_shr( L_index, 14 ) & 3 ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 2 ); } FOR( track = 0; track < ( NB_TRACK_FCB_4T - 2 ); track++ ) @@ -431,7 +431,7 @@ Word16 acelp_4t64_fx( L_index = quant_5p_5N_fx( &ind[k], 4 ); index = extract_l( L_index & 0x03FF ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 10 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 10 ); } FOR( track = 2; track < NB_TRACK_FCB_4T; track++ ) @@ -440,7 +440,7 @@ Word16 acelp_4t64_fx( L_index = quant_4p_4N_fx( &ind[k], 4 ); index = extract_l( L_index & 0x3FFF ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 14 ); } } ELSE IF( EQ_16( nbbits, 88 ) ) @@ -451,7 +451,7 @@ Word16 acelp_4t64_fx( L_index = quant_6p_6N_2_fx( &ind[k], 4 ); index = extract_l( L_shr( L_index, 11 ) & 0x07FF ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_1, index, 11 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_1, index, 11 ); } FOR( track = 0; track < NB_TRACK_FCB_4T; track++ ) @@ -460,7 +460,7 @@ Word16 acelp_4t64_fx( L_index = quant_6p_6N_2_fx( &ind[k], 4 ); index = extract_l( L_index & 0x07FF ); logic16(); - push_indice_fx( hBstr, IND_ALG_CDBK_4T64_2, index, 11 ); + push_indice( hBstr, IND_ALG_CDBK_4T64_2, index, 11 ); } } } diff --git a/lib_enc/decision_matrix_enc_fx.c b/lib_enc/decision_matrix_enc_fx.c index c95bc9d5b..63a13aa1a 100644 --- a/lib_enc/decision_matrix_enc_fx.c +++ b/lib_enc/decision_matrix_enc_fx.c @@ -449,14 +449,14 @@ Word16 signalling_mode1_tcx20_enc_fx( num_bits = add( num_bits, nBits ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_ACELP_SIGNALLING, sub( idx, start_idx ), nBits ); + push_indice( hBstr, IND_ACELP_SIGNALLING, sub( idx, start_idx ), nBits ); } /* HQ/TCX core switching flag */ num_bits = add( num_bits, 1 ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_MDCT_CORE, 1, 1 ); + push_indice( hBstr, IND_MDCT_CORE, 1, 1 ); } } ELSE @@ -467,7 +467,7 @@ Word16 signalling_mode1_tcx20_enc_fx( num_bits = add( num_bits, 1 ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_CORE, 1, 1 ); + push_indice( hBstr, IND_CORE, 1, 1 ); } } @@ -475,7 +475,7 @@ Word16 signalling_mode1_tcx20_enc_fx( num_bits = add( num_bits, 1 ); IF( push != 0 ) { - push_indice_fx( hBstr, IND_MDCT_CORE, 1, 1 ); + push_indice( hBstr, IND_MDCT_CORE, 1, 1 ); } num_bits = add( num_bits, 2 ); @@ -484,19 +484,19 @@ Word16 signalling_mode1_tcx20_enc_fx( /* write band-width (needed for different I/O sampling rate support) */ IF( EQ_16( st->bwidth, NB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 0, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 ); } ELSE IF( EQ_16( st->bwidth, WB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 1, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 ); } ELSE IF( EQ_16( st->bwidth, SWB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 2, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 ); } ELSE /* st->bwidth == FB */ { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 3, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 ); } } } @@ -534,21 +534,21 @@ void signalling_enc_fx( test(); IF( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); /* write ACELP L_frame info */ IF( EQ_16( st_fx->last_L_frame, L_FRAME ) ) { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 0, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 ); } ELSE { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 1, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 ); } } ELSE { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); } return; @@ -574,7 +574,7 @@ void signalling_enc_fx( IF( EQ_16( ppp_mode, 1 ) || EQ_16( nelp_mode, 1 ) ) { /* 1 bit to distinguish between 2.8kbps PPP/NELP frame and SID frame */ - push_indice_fx( hBstr, IND_CORE, 0, 1 ); + push_indice( hBstr, IND_CORE, 0, 1 ); /* SC-VBR: 0 - PPP_NB, 1 - PPP_WB, 2 - NELP_NB, 3 - NELP_WB */ test(); test(); @@ -586,19 +586,19 @@ void signalling_enc_fx( test(); IF( EQ_16( st_fx->coder_type, VOICED ) && EQ_16( st_fx->bwidth, NB ) && EQ_16( ppp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 0, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 0, 2 ); } ELSE IF( EQ_16( st_fx->coder_type, VOICED ) && NE_16( st_fx->bwidth, NB ) && EQ_16( ppp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 1, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 1, 2 ); } ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) && EQ_16( st_fx->bwidth, NB ) && EQ_16( nelp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 2, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 2, 2 ); } ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) && NE_16( st_fx->bwidth, NB ) && EQ_16( nelp_mode, 1 ) ) { - push_indice_fx( hBstr, IND_PPP_NELP_MODE, 3, 2 ); + push_indice( hBstr, IND_PPP_NELP_MODE, 3, 2 ); } } ELSE IF( NE_32( st_fx->core_brate, SID_2k40 ) && ( st_fx->core_brate != FRAME_NO_DATA ) ) @@ -606,7 +606,7 @@ void signalling_enc_fx( /* write the ACELP/HQ core selection bit */ IF( GE_32( st_fx->total_brate, ACELP_24k40 ) ) { - push_indice_fx( hBstr, IND_CORE, 0, 1 ); + push_indice( hBstr, IND_CORE, 0, 1 ); } /* find the section in the ACELP signalling table corresponding to bitrate */ @@ -652,7 +652,7 @@ void signalling_enc_fx( idx++; } - push_indice_fx( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); + push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); } /* write extension layer flag to distinguish between TBE (0) and BWE (1) */ @@ -664,11 +664,11 @@ void signalling_enc_fx( test(); IF( EQ_16( st_fx->extl, WB_TBE ) || EQ_16( st_fx->extl, SWB_TBE ) || EQ_16( st_fx->extl, FB_TBE ) ) { - push_indice_fx( hBstr, IND_BWE_FLAG, 0, 1 ); + push_indice( hBstr, IND_BWE_FLAG, 0, 1 ); } ELSE IF( EQ_16( st_fx->extl, WB_BWE ) || EQ_16( st_fx->extl, SWB_BWE ) || EQ_16( st_fx->extl, FB_BWE ) ) { - push_indice_fx( hBstr, IND_BWE_FLAG, 1, 1 ); + push_indice( hBstr, IND_BWE_FLAG, 1, 1 ); } } } @@ -678,24 +678,24 @@ void signalling_enc_fx( test(); IF( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 1, 1 ); /* write ACELP L_frame info */ IF( EQ_16( st_fx->last_L_frame, L_FRAME ) ) { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 0, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 0, 1 ); } ELSE { - push_indice_fx( hBstr, IND_LAST_L_FRAME, 1, 1 ); + push_indice( hBstr, IND_LAST_L_FRAME, 1, 1 ); } } ELSE { - push_indice_fx( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); + push_indice( hBstr, IND_HQ_SWITCHING_FLG, 0, 1 ); } /* HQ/TCX core switching flag */ - push_indice_fx( hBstr, IND_MDCT_CORE, 0, 1 ); + push_indice( hBstr, IND_MDCT_CORE, 0, 1 ); /* Use ACELP signaling for LR MDCT */ IF( LE_32( st_fx->total_brate, ACELP_16k40 ) ) @@ -719,7 +719,7 @@ void signalling_enc_fx( idx++; } - push_indice_fx( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); + push_indice( hBstr, IND_ACELP_SIGNALLING, idx - start_idx, nBits ); } ELSE { @@ -727,25 +727,25 @@ void signalling_enc_fx( IF( LE_32( st_fx->core_brate, ACELP_64k ) ) { /* write ACELP/HQ core indication flag */ - push_indice_fx( hBstr, IND_CORE, 1, 1 ); + push_indice( hBstr, IND_CORE, 1, 1 ); } /* write band-width (needed for different I/O sampling rate support) */ IF( EQ_16( st_fx->bwidth, NB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 0, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 0, 2 ); } ELSE IF( EQ_16( st_fx->bwidth, WB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 1, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 1, 2 ); } ELSE IF( EQ_16( st_fx->bwidth, SWB ) ) { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 2, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 2, 2 ); } ELSE /* st_fx->bwidth == FB */ { - push_indice_fx( hBstr, IND_HQ_BWIDTH, 3, 2 ); + push_indice( hBstr, IND_HQ_BWIDTH, 3, 2 ); } } } diff --git a/lib_enc/enc_amr_wb_fx.c b/lib_enc/enc_amr_wb_fx.c index 08a20bbb9..4c5268017 100644 --- a/lib_enc/enc_amr_wb_fx.c +++ b/lib_enc/enc_amr_wb_fx.c @@ -170,7 +170,7 @@ void encod_amr_wb_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*-----------------------------------------------------------------* @@ -243,7 +243,7 @@ void encod_amr_wb_fx( hVAD->hangover_cnt, &hAmrwb_IO->gain_alpha_fx, &hf_gain_fx[i_subfr / L_SUBFR], add( Q_new, 1 ), st->Q_syn ); } - push_indice_fx( hBstr, IND_HF_GAIN_MODIFICATION, hf_gain_fx[i_subfr / L_SUBFR], 4 ); + push_indice( hBstr, IND_HF_GAIN_MODIFICATION, hf_gain_fx[i_subfr / L_SUBFR], 4 ); } p_Aw += ( M + 1 ); diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 62f740fb2..00c7d28d7 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -179,7 +179,7 @@ void encod_gen_voic_fx( move16(); } - push_indice_fx( hBstr, IND_HARM_FLAG_ACELP, harm_flag_acelp, 1 ); + push_indice( hBstr, IND_HARM_FLAG_ACELP, harm_flag_acelp, 1 ); } /*------------------------------------------------------------------* @@ -239,7 +239,7 @@ void encod_gen_voic_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*st_fx->lowrate_pitchGain = 0.9f * st_fx->lowrate_pitchGain + 0.1f * gain_pit_fx;*/ @@ -387,7 +387,7 @@ void encod_gen_voic_fx( WHILE( unbits_PI_fx > 0 ) { i = s_min( unbits_PI_fx, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); unbits_PI_fx -= i; } IF( st_fx->Opt_SC_VBR ) diff --git a/lib_enc/enc_higher_acelp_fx.c b/lib_enc/enc_higher_acelp_fx.c index 64a11be5b..bf248bb5a 100644 --- a/lib_enc/enc_higher_acelp_fx.c +++ b/lib_enc/enc_higher_acelp_fx.c @@ -242,7 +242,7 @@ void transf_cdbk_enc_fx( Ltmp = L_shl( Ltmp, add( e_den, 9 ) ); /* Q18*/ *gain_preQ = round_fx( Ltmp ); /* Q2*/ } - push_indice_fx( st_fx->hBstr, IND_AVQ_GAIN, index, G_AVQ_BITS ); + push_indice( st_fx->hBstr, IND_AVQ_GAIN, index, G_AVQ_BITS ); /*--------------------------------------------------------------* * Encode and multiplex subvectors into bit-stream @@ -276,7 +276,7 @@ void transf_cdbk_enc_fx( WHILE( *unbits > 0 ) { i = s_min( *unbits, 16 ); - push_indice_fx( st_fx->hBstr, IND_UNUSED, 0, i ); + push_indice( st_fx->hBstr, IND_UNUSED, 0, i ); *unbits -= i; } } diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index 957e41516..3cb2cc066 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -291,7 +291,7 @@ void enc_pit_exc_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } /*st_fx->lowrate_pitchGain = 0.9f * st_fx->lowrate_pitchGain + 0.1f * gain_pit;*/ @@ -312,12 +312,12 @@ void enc_pit_exc_fx( IF( GE_32( st_fx->core_brate, MIN_RATE_FCB ) ) { pit_idx = vquant_fx( &gain_pit, mean_gp_fx, &gain_pit, dic_gp_fx, 1, 32 ); /* Q0 */ - push_indice_fx( hBstr, IND_PIT_IDX, pit_idx, 5 ); + push_indice( hBstr, IND_PIT_IDX, pit_idx, 5 ); } ELSE { pit_idx = vquant_fx( &gain_pit, mean_gp_fx, &gain_pit, dic_gp_fx, 1, 16 ); /* Q0 */ - push_indice_fx( hBstr, IND_PIT_IDX, pit_idx, 4 ); + push_indice( hBstr, IND_PIT_IDX, pit_idx, 4 ); } } else if ( use_fcb == 2 ) diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 4cda393d5..d6935dd0c 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -327,7 +327,7 @@ Word16 encod_tran_fx( WHILE( unbits_PI > 0 ) { i = s_min( unbits_PI, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); unbits_PI -= i; } @@ -336,72 +336,72 @@ Word16 encod_tran_fx( { IF( EQ_16( tc_subfr, TC_0_0 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); } ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, 2 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } ELSE IF( EQ_16( tc_subfr, 3 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); } } ELSE /* L_frame == L_FRAME16k */ { IF( tc_subfr == 0 ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 2 ); } ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 2 ); } ELSE IF( EQ_16( tc_subfr, 2 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 2, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 2, 2 ); } ELSE IF( EQ_16( tc_subfr, 3 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 3, 2 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 0, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 3, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 0, 1 ); } ELSE IF( EQ_16( tc_subfr, 4 * L_SUBFR ) ) { - push_indice_fx( hBstr, IND_TC_SUBFR, 3, 2 ); - push_indice_fx( hBstr, IND_TC_SUBFR, 1, 1 ); + push_indice( hBstr, IND_TC_SUBFR, 3, 2 ); + push_indice( hBstr, IND_TC_SUBFR, 1, 1 ); } } diff --git a/lib_enc/enc_uv_fx.c b/lib_enc/enc_uv_fx.c index 8a77b9e2b..a8612725b 100644 --- a/lib_enc/enc_uv_fx.c +++ b/lib_enc/enc_uv_fx.c @@ -153,7 +153,7 @@ void encod_unvoiced_fx( #ifdef DEBUGGING assert( st_fx->acelp_cfg.gains_mode[i_subfr_idx] == 7 && "Error: UC two-stage, only 5+2 gain Q is supported" ); #endif - push_indice_fx( st_fx->hBstr, IND_GAIN, index, st_fx->acelp_cfg.gains_mode[i_subfr_idx] ); + push_indice( st_fx->hBstr, IND_GAIN, index, st_fx->acelp_cfg.gains_mode[i_subfr_idx] ); gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit_fx, st_fx->clip_var_fx ); diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c index aef5fd637..df629f295 100644 --- a/lib_enc/eval_pit_contr_fx.c +++ b/lib_enc/eval_pit_contr_fx.c @@ -409,17 +409,17 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit IF( EQ_16( st_fx->coder_type, INACTIVE ) ) { - push_indice_fx( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 1 ); + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 1 ); } } ELSE { - push_indice_fx( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 3 ); + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 3 ); } } ELSE { - push_indice_fx( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 4 ); + push_indice( hBstr, IND_PIT_CONTR_IDX, pit_contr_idx, 4 ); } return last_pit_bin; diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c index e51e2b682..2eb13646c 100644 --- a/lib_enc/fd_cng_enc_fx.c +++ b/lib_enc/fd_cng_enc_fx.c @@ -1217,21 +1217,21 @@ void FdCng_encodeSID_fx( HANDLE_FD_CNG_ENC stenc, /* i/o: pointer to FD_CNG stru } ELSE { - push_indice_fx( hBstr, IND_SID_TYPE, 1, 1 ); - push_indice_fx( hBstr, IND_ACELP_16KHZ, corest->bwidth, 2 ); + push_indice( hBstr, IND_SID_TYPE, 1, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, corest->bwidth, 2 ); IF( EQ_16( corest->L_frame, L_FRAME16k ) ) { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 1, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 1, 1 ); } ELSE { - push_indice_fx( hBstr, IND_ACELP_16KHZ, 0, 1 ); + push_indice( hBstr, IND_ACELP_16KHZ, 0, 1 ); } FOR( i = 0; i < stages_37bits; i++ ) { - push_indice_fx( hBstr, IND_LSF, indices[i], bits_37bits[i] ); + push_indice( hBstr, IND_LSF, indices[i], bits_37bits[i] ); } - push_indice_fx( hBstr, IND_ENERGY, index, 7 ); + push_indice( hBstr, IND_ENERGY, index, 7 ); } /* Interpolate the bin/band-wise levels from the partition levels */ diff --git a/lib_enc/gain_enc_fx.c b/lib_enc/gain_enc_fx.c index 0321cd763..0ccb31ccf 100644 --- a/lib_enc/gain_enc_fx.c +++ b/lib_enc/gain_enc_fx.c @@ -428,7 +428,7 @@ void gain_enc_mless_fx( tmp1 = mult_r( G_PITCH_MAX_MINUS_MIN_TC192_Q13, div_s( 1, sub( shl( 1, nBits ), 1 ) ) ); /*Q13*/ /* set quantization step */ index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_TC192_Q14, tmp1, shl( 1, nBits ) ); move16(); - push_indice_fx( hBstr, IND_GAIN_PIT, index, nBits ); + push_indice( hBstr, IND_GAIN_PIT, index, nBits ); /* gain_code Q */ /**gain_code /= gcode0;*/ @@ -441,7 +441,7 @@ void gain_enc_mless_fx( } index = gain_quant_fx( gain_code, &gain_code16, LG10_G_CODE_MIN_TC192_Q14, LG10_G_CODE_MAX_TC192_Q13, nBits2, &expg ); - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits2 ); + push_indice( hBstr, IND_GAIN_CODE, index, nBits2 ); L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ *gain_code = L_shl_o( L_tmp, add( add( expg, exp_gcode0 ), 15 ), &Overflow ); /*Q16*/ } @@ -508,7 +508,7 @@ void gain_enc_mless_fx( * search for the best quantizer *-----------------------------------------------------------------*/ index = Find_Opt_gainQ_fx( coeff, exp_coeff, gain_pit, gain_code, gcode0, exp_gcode0, qua_table, size ); // Q0 - push_indice_fx( hBstr, IND_GAIN, index, nBits ); + push_indice( hBstr, IND_GAIN, index, nBits ); } /* *norm_gain_code = *gain_code / *gain_inov; */ @@ -1108,7 +1108,7 @@ void gain_enc_SQ_fx( tmp1 = mult_r( G_PITCH_MAX_Q13, div_s( 1, sub( shl( 1, nBits_pitch ), 1 ) ) ); /*Q13*/ /* set quantization step */ index = usquant_fx( *gain_pit, gain_pit, G_PITCH_MIN_Q14, tmp1, shl( 1, nBits_pitch ) ); // Q0 - push_indice_fx( hBstr, IND_GAIN_PIT, index, nBits_pitch ); + push_indice( hBstr, IND_GAIN_PIT, index, nBits_pitch ); /* gain_code Q */ /* *gain_code /= gcode0; */ @@ -1121,7 +1121,7 @@ void gain_enc_SQ_fx( } index = gain_quant_fx( gain_code, &gain_code16, LG10_G_CODE_MIN_Q14, LG10_G_CODE_MAX_Q13, nBits_code, &expg ); - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits_code ); + push_indice( hBstr, IND_GAIN_CODE, index, nBits_code ); L_tmp = L_mult( gain_code16, gcode0 ); /*Q0*Q0 -> Q1*/ *gain_code = L_shl_sat( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); move32(); /*Q16*/ @@ -1601,7 +1601,7 @@ void gain_enc_tc_fx( *gain_code_fx = L_shl( L_tmp, add( add( expg, exp_gcode0 ), 15 ) ); /*Q16*/ move32(); - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits ); + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); } ELSE { @@ -1632,7 +1632,7 @@ void gain_enc_tc_fx( L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ *gain_code_fx = L_shl( L_tmp, add( exp_gcode0, 2 ) ); move32(); /* Q14 -> Q16 */ - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits ); + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); } ELSE /* nBits == 3 */ { @@ -1642,7 +1642,7 @@ void gain_enc_tc_fx( L_tmp = L_mult( wgain_code, gcode0_fx ); /* Q13*Q0 -> Q14 */ *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 2 ) ); move32(); /* Q14 -> Q16 */ - push_indice_fx( hBstr, IND_GAIN_CODE, index, nBits ); + push_indice( hBstr, IND_GAIN_CODE, index, nBits ); } } @@ -2438,7 +2438,7 @@ void gain_enc_lbr_fx( *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, exp ) ); // Q16 move32(); { - push_indice_fx( hBstr, IND_GAIN, index, nBits ); + push_indice( hBstr, IND_GAIN, index, nBits ); } return; } @@ -3223,7 +3223,7 @@ void gain_enc_amr_wb_fx( *norm_gain_code = L_shr( Mult_32_16( *gain_code, tmp ), sub( 1, exp ) ); // Q16 move32(); - push_indice_fx( hBstr, IND_GAIN, index, nBits ); + push_indice( hBstr, IND_GAIN, index, nBits ); return; } diff --git a/lib_enc/gaus_enc_fx.c b/lib_enc/gaus_enc_fx.c index edddc6a88..081cf7ef0 100644 --- a/lib_enc/gaus_enc_fx.c +++ b/lib_enc/gaus_enc_fx.c @@ -96,7 +96,7 @@ Word16 gaus_encode_fx( move16(); /* low bound = -30; stepSize = 1.71875; inv_stepSize = 0.5818181 */ idx = gain_enc_gaus_fx( gain_code, nb_bits, -7680, 28160, 19065 ); /* Q0 */ - push_indice_fx( st_fx->hBstr, IND_GAIN, idx, nb_bits ); + push_indice( st_fx->hBstr, IND_GAIN, idx, nb_bits ); /*----------------------------------------------------------------* * Total excitation for Unvoiced coders @@ -638,8 +638,8 @@ void gauss2v_fx( idx = cod_2pos_fx( i, j, sign1, sign2, nvec ); /* Q0 */ move16(); - push_indice_fx( hBstr, IND_GAUS_CDBK_INDEX, idx, 2 * nb_bits + 1 ); - push_indice_fx( hBstr, IND_TILT_FACTOR, index_delta, 3 ); + push_indice( hBstr, IND_GAUS_CDBK_INDEX, idx, 2 * nb_bits + 1 ); + push_indice( hBstr, IND_TILT_FACTOR, index_delta, 3 ); /*----------------------------------------------------------------* * Find quantized gain diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c index 1642d1253..1a3d2cb56 100644 --- a/lib_enc/gs_enc_fx.c +++ b/lib_enc/gs_enc_fx.c @@ -82,16 +82,16 @@ void encod_audio_fx( test(); IF( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 ) { - push_indice_fx( hBstr, IND_GSC_IVAS_SP, st_fx->GSC_IVAS_mode, 2 ); + push_indice( hBstr, IND_GSC_IVAS_SP, st_fx->GSC_IVAS_mode, 2 ); } #endif IF( attack_flag > 0 ) { - push_indice_fx( hBstr, IND_GSC_ATTACK, 1, 1 ); + push_indice( hBstr, IND_GSC_ATTACK, 1, 1 ); } ELSE { - push_indice_fx( hBstr, IND_GSC_ATTACK, 0, 1 ); + push_indice( hBstr, IND_GSC_ATTACK, 0, 1 ); } @@ -105,7 +105,7 @@ void encod_audio_fx( IF( GE_16( st_fx->GSC_IVAS_mode, 1 ) || ( NE_16( st_fx->coder_type, INACTIVE ) && ( ( EQ_16( st_fx->element_mode, EVS_MONO ) && GE_32( st_fx->total_brate, ACELP_13k20 ) ) || ( GT_16( st_fx->element_mode, EVS_MONO ) && GT_32( st_fx->total_brate, MIN_BRATE_GSC_NOISY_FLAG ) && GE_16( st_fx->bwidth, SWB ) && !st_fx->flag_ACELP16k ) ) ) ) { - push_indice_fx( hBstr, IND_GSC_SWB_SPEECH, st_fx->GSC_noisy_speech, 1 ); + push_indice( hBstr, IND_GSC_SWB_SPEECH, st_fx->GSC_noisy_speech, 1 ); } /*---------------------------------------------------------------* * Find and encode the number of subframes @@ -185,12 +185,12 @@ void encod_audio_fx( IF( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, MIN_RATE_4SBFR ) ) { - push_indice_fx( hBstr, IND_HF_NOISE, nb_subfr_flag, 2 ); + push_indice( hBstr, IND_HF_NOISE, nb_subfr_flag, 2 ); } ELSE IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) { /* nb_subfr_flag can only have the value 0 or 1 */ - push_indice_fx( hBstr, IND_HF_NOISE, nb_subfr_flag, 1 ); + push_indice( hBstr, IND_HF_NOISE, nb_subfr_flag, 1 ); } } test(); @@ -227,7 +227,7 @@ void encod_audio_fx( move16(); } Es_pred_enc_fx( &Es_pred, &indice, st_fx->L_frame, res, st_fx->voicing_fx, nb_bits, 0, Q_new ); - push_indice_fx( hBstr, IND_ES_PRED, indice, nb_bits ); + push_indice( hBstr, IND_ES_PRED, indice, nb_bits ); } enc_pit_exc_fx( st_fx, speech, Aw, Aq, Es_pred, res, synth, exc, &T0_tmp, @@ -290,7 +290,7 @@ void encod_audio_fx( { hGSCEnc->noise_lev = s_max( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 ); move16(); - push_indice_fx( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 ), 2 ); + push_indice( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP2 ), 2 ); } ELSE IF( st_fx->GSC_noisy_speech ) { @@ -300,7 +300,7 @@ void encod_audio_fx( } ELSE { - push_indice_fx( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP0 ), 3 ); + push_indice( hBstr, IND_NOISE_LEVEL, sub( hGSCEnc->noise_lev, NOISE_LEVEL_SP0 ), 3 ); } /*---------------------------------------------------------------* @@ -931,7 +931,7 @@ void gsc_enc_fx( WHILE( bit > 0 ) { i = s_min( bit, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); bit = sub( bit, i ); } /* Reorder Q bands */ diff --git a/lib_enc/hq_classifier_enc_fx.c b/lib_enc/hq_classifier_enc_fx.c index 2b53082f7..300e31e8e 100644 --- a/lib_enc/hq_classifier_enc_fx.c +++ b/lib_enc/hq_classifier_enc_fx.c @@ -258,16 +258,16 @@ Word16 hq_classifier_enc_fx( /* o : Consumed bits { IF( GE_16( *hqswb_clas, HQ_GEN_SWB ) ) { - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas - 5, bits ); + push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas - 5, bits ); } ELSE { - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); + push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); } } ELSE { - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); + push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); } test(); @@ -343,7 +343,7 @@ Word16 hq_classifier_enc_fx( /* o : Consumed bits move16(); } /* write signalling info to the bitstream */ - push_indice_fx( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); + push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); IF( LE_32( st_fx->core_brate, HQ_32k ) && EQ_16( *hqswb_clas, HQ_NORMAL ) ) { diff --git a/lib_enc/hq_core_enc_fx.c b/lib_enc/hq_core_enc_fx.c index ff19cfebc..66430cb8e 100644 --- a/lib_enc/hq_core_enc_fx.c +++ b/lib_enc/hq_core_enc_fx.c @@ -229,12 +229,12 @@ void hq_core_enc_fx( { IF( Voicing_flag > 0 ) { - push_indice_fx( hBstr, IND_HQ_VOICING_FLAG, 1, 1 ); + push_indice( hBstr, IND_HQ_VOICING_FLAG, 1, 1 ); num_bits = sub( num_bits, 1 ); } ELSE { - push_indice_fx( hBstr, IND_HQ_VOICING_FLAG, 0, 1 ); + push_indice( hBstr, IND_HQ_VOICING_FLAG, 0, 1 ); num_bits = sub( num_bits, 1 ); } } @@ -278,13 +278,13 @@ void hq_core_enc_fx( WHILE( num_bits >= 16 ) { - push_indice_fx( hBstr, IND_UNUSED, 0, 16 ); + push_indice( hBstr, IND_UNUSED, 0, 16 ); num_bits = sub( num_bits, 16 ); } IF( num_bits != 0 ) { - push_indice_fx( hBstr, IND_UNUSED, 0, num_bits ); + push_indice( hBstr, IND_UNUSED, 0, num_bits ); } #ifdef ADD_IVAS_HQ_CODE if ( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) diff --git a/lib_enc/hq_env_enc_fx.c b/lib_enc/hq_env_enc_fx.c index 5d47710ed..f033bd685 100644 --- a/lib_enc/hq_env_enc_fx.c +++ b/lib_enc/hq_env_enc_fx.c @@ -295,13 +295,13 @@ Word16 encode_envelope_indices_fx( /* o : Number of b test(); IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE_TRAN ) || EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) ) { - push_indice_fx( hBstr, IND_HQ2_DENG_HMODE, *LCmode, BITS_DE_HMODE ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, difidx[0], BITS_DE_FCOMP ); + push_indice( hBstr, IND_HQ2_DENG_HMODE, *LCmode, BITS_DE_HMODE ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, difidx[0], BITS_DE_FCOMP ); } ELSE { - push_indice_fx( hBstr, IND_LC_MODE, *LCmode, 2 ); - push_indice_fx( hBstr, IND_YNRM, difidx[0], NORM0_BITS ); + push_indice( hBstr, IND_LC_MODE, *LCmode, 2 ); + push_indice( hBstr, IND_YNRM, difidx[0], NORM0_BITS ); } test(); @@ -331,7 +331,7 @@ Word16 encode_envelope_indices_fx( /* o : Number of b m = lshr( m, 1 ); /* Q0 */ } - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); } } ELSE @@ -370,7 +370,7 @@ Word16 encode_envelope_indices_fx( /* o : Number of b move16(); } } - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); prevj = j; move16(); } @@ -419,11 +419,11 @@ Word16 encode_envelope_indices_fx( /* o : Number of b IF( EQ_16( flag_HQ2, LOW_RATE_HQ_CORE ) ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, m, r ); } ELSE { - push_indice_fx( hBstr, IND_YNRM, m, r ); + push_indice( hBstr, IND_YNRM, m, r ); } prevj = j; @@ -515,11 +515,11 @@ Word16 encode_envelope_indices_fx( /* o : Number of b IF( flag_HQ2 == 0 ) { - push_indice_fx( hBstr, IND_YNRM, v, r ); + push_indice( hBstr, IND_YNRM, v, r ); } ELSE { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, v, r ); } } } @@ -536,14 +536,14 @@ Word16 encode_envelope_indices_fx( /* o : Number of b r = huffsizn[j]; /* Q0 */ move16(); - push_indice_fx( hBstr, IND_YNRM, m, r ); + push_indice( hBstr, IND_YNRM, m, r ); } } ELSE { FOR( i = 1; i < num_sfm; i++ ) { - push_indice_fx( hBstr, IND_YNRM, difidx[i], NORMI_BITS ); + push_indice( hBstr, IND_YNRM, difidx[i], NORMI_BITS ); } } } diff --git a/lib_enc/hq_hr_enc_fx.c b/lib_enc/hq_hr_enc_fx.c index 1cd516b43..705db9ecd 100644 --- a/lib_enc/hq_hr_enc_fx.c +++ b/lib_enc/hq_hr_enc_fx.c @@ -236,12 +236,12 @@ void hq_hr_enc_fx( IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) ) { nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, s_max( core_sfm, sub( num_env_bands, 1 ) ) ); /* Q0 */ - push_indice_fx( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); + push_indice( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); } ELSE { nf_idx = noise_adjust_fx( t_audio_norm, 12, R, sfm_start, sfm_end, core_sfm ); /* Q0 */ - push_indice_fx( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); + push_indice( st_fx->hBstr, IND_NF_IDX, nf_idx, 2 ); } } /* updates */ diff --git a/lib_enc/hq_lr_enc_fx.c b/lib_enc/hq_lr_enc_fx.c index 9aca0f646..af2780682 100644 --- a/lib_enc/hq_lr_enc_fx.c +++ b/lib_enc/hq_lr_enc_fx.c @@ -115,7 +115,7 @@ static void spt_shorten_domain_set_fx( move16(); } } - push_indice_fx( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 ); + push_indice( st_fx->hBstr, IND_HQ2_SPT_SHORTEN, spt_shorten_flag[j], 1 ); *bit_budget = sub( *bit_budget, 1 ); /* Q0 */ move16(); } @@ -313,7 +313,7 @@ void hq_lr_enc_fx( } /* write the classification information into the bitstream */ - push_indice_fx( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas_fx, 2 ); + push_indice( hBstr, IND_HQ2_SWB_CLAS, hqswb_clas_fx, 2 ); ( *num_bits_fx ) = sub( *num_bits_fx, 2 ); move16(); IF( EQ_16( hqswb_clas_fx, HQ_NORMAL ) ) @@ -325,7 +325,7 @@ void hq_lr_enc_fx( ELSE { /* write the transient bit into the bitstream */ - push_indice_fx( st_fx->hBstr, IND_HQ2_SWB_CLAS, is_transient_fx, 1 ); + push_indice( st_fx->hBstr, IND_HQ2_SWB_CLAS, is_transient_fx, 1 ); /* subtract one bit for the transient flag */ ( *num_bits_fx ) = sub( ( *num_bits_fx ), 1 ); @@ -741,7 +741,7 @@ void hq_lr_enc_fx( /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ FOR( i = 0; i < 2; i++ ) { - push_indice_fx( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); + push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); } } ELSE IF( is_transient_fx == 0 && EQ_16( inner_frame_fx, L_FRAME16k ) ) @@ -970,7 +970,7 @@ void hq_lr_enc_fx( /* encode the last p2a_bands-1 subbands bit-allocation index of the previous frame */ FOR( i = 0; i < 2; i++ ) { - push_indice_fx( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); + push_indice( st_fx->hBstr, IND_HQ2_LAST_BA_MAX_BAND, hHQ_core->last_bitalloc_max_band[i], 1 ); } } ELSE IF( EQ_16( st_fx->bwidth, SWB ) && EQ_16( hqswb_clas_fx, HQ_HARMONIC ) && ( EQ_32( L_bwe_br, HQ_16k40 ) || EQ_32( L_bwe_br, HQ_13k20 ) ) ) @@ -2213,7 +2213,7 @@ static Word16 small_symbol_enc_fx( /* o : bits /* Encoding LSB bit packing */ FOR( i = 0; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB[i], BITS_DE_LSB ); } } @@ -2526,74 +2526,74 @@ static Word16 large_symbol_enc_fx( /* o : bits /* Encoding MSB bits */ IF( *hLCmode0 == 0 ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE, 0, BITS_DE_8SMODE ); bits = BITS_DE_8SMODE; move16(); IF( cnt_outlyer0 == 0 ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 0, BITS_DE_8SMODE_N0 ); bits = add( bits, BITS_DE_8SMODE_N0 ); IF( EQ_16( cnt_outlyer, 1 ) ) { /* 01 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); + push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); bits = add( bits, BITS_DE_8SPOS ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); } ELSE { /* 00 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ } FOR( i = 0; i < pos_outlyer; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */ } FOR( i = ( pos_outlyer + 1 ); i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bitsmode0 = add( bitsmode0, hessize[tdifidx0[i] + 4] ); /* Q0 */ } } ELSE IF( EQ_16( cnt_outlyer0, 1 ) ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N0, 1, BITS_DE_8SMODE_N0 ); bits = add( bits, BITS_DE_8SMODE_N0 ); IF( EQ_16( cnt_outlyer, 1 ) ) { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 1, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); + push_indice( hBstr, IND_HQ2_DENG_8SPOS, pos_outlyer, BITS_DE_8SPOS ); bits = add( bits, BITS_DE_8SPOS ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[pos_outlyer] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); } ELSE { - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE_N1, 0, BITS_DE_8SMODE_N1 ); bits = add( bits, BITS_DE_8SMODE_N1 ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, qbidx[0] + ABS_ENG_OFFSET, BITS_ABS_ENG ); bits = add( bits, BITS_ABS_ENG ); /* Q0 */ } FOR( i = 1; i < pos_outlyer; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */ } FOR( i = pos_outlyer + 1; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx0[i] + 4], hessize[tdifidx0[i] + 4] ); bits = add( bits, hessize[tdifidx0[i] + 4] ); /* Q0 */ } } @@ -2601,12 +2601,12 @@ static Word16 large_symbol_enc_fx( /* o : bits ELSE { bits = add( BITS_DE_8SMODE, BITS_MAX_DEPTH ); /* Q0 */ - push_indice_fx( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE ); - push_indice_fx( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH ); + push_indice( hBstr, IND_HQ2_DENG_8SMODE, 1, BITS_DE_8SMODE ); + push_indice( hBstr, IND_HQ2_DENG_8SDEPTH, lsbdepth1, BITS_MAX_DEPTH ); FOR( i = 0; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, hescode[tdifidx1[i] + 4], hessize[tdifidx1[i] + 4] ); bits = add( bits, hessize[tdifidx1[i] + 4] ); /* Q0 */ } @@ -2614,7 +2614,7 @@ static Word16 large_symbol_enc_fx( /* o : bits { FOR( i = 0; i < BANDS; ++i ) { - push_indice_fx( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 ); + push_indice( hBstr, IND_HQ2_DIFF_ENERGY, LSB1[i], lsbdepth1 ); } /*bits += BANDS * lsbdepth1; */ bits = add( bits, extract_h( L_shl( L_mult( BANDS, lsbdepth1 ), 15 ) ) ); /* Q0 */ @@ -3115,7 +3115,7 @@ static Word16 band_energy_quant_fx( { deng_cmode = 0; move16(); - push_indice_fx( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); + push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); large_symbol_enc_fx( hBstr, bq2_fx, bands_fx, &hLCmode0, 1 ); deng_bits = add( ebits, BITS_DE_CMODE ); /* Q0 */ } @@ -3124,7 +3124,7 @@ static Word16 band_energy_quant_fx( /* setting energy difference coding mode and storing it */ deng_cmode = 1; move16(); - push_indice_fx( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); + push_indice( hBstr, IND_HQ2_DENG_MODE, deng_cmode, BITS_DE_CMODE ); deng_bits = add( hbits, BITS_DE_CMODE ); /* Q0 */ @@ -3479,7 +3479,7 @@ static Word16 p2a_threshold_quant_fx( move16(); } - push_indice_fx( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 ); + push_indice( hBstr, IND_HQ2_P2A_FLAGS, p2a_flags_fx[k], 1 ); j = add( j, 1 ); } @@ -3768,7 +3768,7 @@ static void mdct_spectrum_fine_gain_enc_fx( move16(); } - push_indice_fx( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits ); + push_indice( st_fx->hBstr, IND_HQ2_SUBBAND_GAIN, imin_fx, gqbits ); } return; diff --git a/lib_enc/hvq_enc_fx.c b/lib_enc/hvq_enc_fx.c index b06a1734d..a0acd0bfd 100644 --- a/lib_enc/hvq_enc_fx.c +++ b/lib_enc/hvq_enc_fx.c @@ -335,7 +335,7 @@ Word16 hvq_enc_fx( /*o : Consumed bits q_noise_level[i] = 0; move16(); } - push_indice_fx( st_fx->hBstr, IND_HVQ_BWE_NL, q_noise_level_idx[i], 2 ); + push_indice( st_fx->hBstr, IND_HVQ_BWE_NL, q_noise_level_idx[i], 2 ); bits_used = add( bits_used, 2 ); noise_level[i] = q_noise_level[i]; /* in Q15 */ diff --git a/lib_enc/isf_enc_amr_wb_fx.c b/lib_enc/isf_enc_amr_wb_fx.c index 4851ed155..d58998565 100644 --- a/lib_enc/isf_enc_amr_wb_fx.c +++ b/lib_enc/isf_enc_amr_wb_fx.c @@ -173,11 +173,11 @@ static void qisf_ns_28b_fx( indice[4] = add( sub_VQ_fx( &isf[12], dico5_ns_28b_fx + 4, 4, DICO5_NS_28b - 1, &tmp ), 1 ); /* First vector has a problem -> do not allow */ move16(); /* write indices to array */ - push_indice_fx( hBstr, IND_ISF_0_0, indice[0], 6 ); - push_indice_fx( hBstr, IND_ISF_0_1, indice[1], 6 ); - push_indice_fx( hBstr, IND_ISF_0_2, indice[2], 6 ); - push_indice_fx( hBstr, IND_ISF_0_3, indice[3], 5 ); - push_indice_fx( hBstr, IND_ISF_0_4, indice[4], 5 ); + push_indice( hBstr, IND_ISF_0_0, indice[0], 6 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 6 ); + push_indice( hBstr, IND_ISF_0_2, indice[2], 6 ); + push_indice( hBstr, IND_ISF_0_3, indice[3], 5 ); + push_indice( hBstr, IND_ISF_0_4, indice[4], 5 ); /* decoding the ISFs */ disf_ns_28b_fx( indice, isf ); @@ -305,11 +305,11 @@ static void qisf_2s_36b_fx( indice[0] = Indirect_dico1[indice[0]]; move16(); /* Make interoperable with G722.2 */ - push_indice_fx( hBstr, IND_ISF_0_0, indice[0], 8 ); - push_indice_fx( hBstr, IND_ISF_0_1, indice[1], 8 ); - push_indice_fx( hBstr, IND_ISF_1_0, indice[2], 7 ); - push_indice_fx( hBstr, IND_ISF_1_1, indice[3], 7 ); - push_indice_fx( hBstr, IND_ISF_1_2, indice[4], 6 ); + push_indice( hBstr, IND_ISF_0_0, indice[0], 8 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 8 ); + push_indice( hBstr, IND_ISF_1_0, indice[2], 7 ); + push_indice( hBstr, IND_ISF_1_1, indice[3], 7 ); + push_indice( hBstr, IND_ISF_1_2, indice[4], 6 ); return; } @@ -442,13 +442,13 @@ static void qisf_2s_46b_fx( indice[0] = Indirect_dico1[indice[0]]; move16(); /* Make interoperable with G722.2 */ - push_indice_fx( hBstr, IND_ISF_0_0, indice[0], 8 ); - push_indice_fx( hBstr, IND_ISF_0_1, indice[1], 8 ); - push_indice_fx( hBstr, IND_ISF_1_0, indice[2], 6 ); - push_indice_fx( hBstr, IND_ISF_1_1, indice[3], 7 ); - push_indice_fx( hBstr, IND_ISF_1_2, indice[4], 7 ); - push_indice_fx( hBstr, IND_ISF_1_3, indice[5], 5 ); - push_indice_fx( hBstr, IND_ISF_1_4, indice[6], 5 ); + push_indice( hBstr, IND_ISF_0_0, indice[0], 8 ); + push_indice( hBstr, IND_ISF_0_1, indice[1], 8 ); + push_indice( hBstr, IND_ISF_1_0, indice[2], 6 ); + push_indice( hBstr, IND_ISF_1_1, indice[3], 7 ); + push_indice( hBstr, IND_ISF_1_2, indice[4], 7 ); + push_indice( hBstr, IND_ISF_1_3, indice[5], 5 ); + push_indice( hBstr, IND_ISF_1_4, indice[6], 5 ); return; } diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index e6d08c49d..8fe425d74 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -647,11 +647,11 @@ static void lsfq_CNG_fx( Vr_add( qlsf, &CNG_SN1_fx[idx_cv * M], qlsf, M ); /* write the VQ index to the bitstream */ - push_indice_fx( hBstr, IND_ISF_0_0, idx_cv, 4 ); + push_indice( hBstr, IND_ISF_0_0, idx_cv, 4 ); /* write the LVQ index to the bitstream */ - push_indice_fx( hBstr, IND_ISF_0_1, idx_lvq[0], LEN_INDICE ); - push_indice_fx( hBstr, IND_ISF_0_1, idx_lvq[1], LSF_BITS_CNG - 4 - LEN_INDICE ); + push_indice( hBstr, IND_ISF_0_1, idx_lvq[0], LEN_INDICE ); + push_indice( hBstr, IND_ISF_0_1, idx_lvq[1], LSF_BITS_CNG - 4 - LEN_INDICE ); return; } @@ -1117,13 +1117,13 @@ void lsf_end_enc_fx( IF( EQ_16( coder_type_org, GENERIC ) && EQ_32( st->sr_core, INT_FS_16k ) ) { /* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/ - push_indice_fx( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, sub( coder_type, 2 ), 1 ); + push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, sub( coder_type, 2 ), 1 ); } /* write predictor selection bit */ IF( EQ_16( predmode, 2 ) ) { - push_indice_fx( st->hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); + push_indice( st->hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); } test(); @@ -1134,7 +1134,7 @@ void lsf_end_enc_fx( Bit_alloc1 = &BC_TCVQ_BIT_ALLOC_40B[1]; FOR( i = 0; i < ( M / 2 ) + 3; i++ ) { - push_indice_fx( hBstr, IND_LSF, TCQIdx[i], Bit_alloc1[i] ); + push_indice( hBstr, IND_LSF, TCQIdx[i], Bit_alloc1[i] ); } } ELSE @@ -1175,7 +1175,7 @@ void lsf_end_enc_fx( move16(); cumleft -= num_bits; move16(); - push_indice_fx( hBstr, IND_LSF, indice[i], num_bits ); + push_indice( hBstr, IND_LSF, indice[i], num_bits ); } WHILE( cumleft > 0 ) @@ -1195,7 +1195,7 @@ void lsf_end_enc_fx( } cumleft = sub( cumleft, num_bits ); - push_indice_fx( hBstr, IND_LSF, indice[i], num_bits ); + push_indice( hBstr, IND_LSF, indice[i], num_bits ); i = add( i, 1 ); } } @@ -3636,7 +3636,7 @@ static void lsf_mid_enc_fx( /* convert LSFs back to LSPs */ lsf2lsp_fx( qlsf, lsp, M, int_fs ); - push_indice_fx( hBstr, IND_MID_FRAME_LSF_INDEX, idx, nb_bits ); + push_indice( hBstr, IND_MID_FRAME_LSF_INDEX, idx, nb_bits ); return; } diff --git a/lib_enc/nelp_enc_fx.c b/lib_enc/nelp_enc_fx.c index a7588283a..391191175 100644 --- a/lib_enc/nelp_enc_fx.c +++ b/lib_enc/nelp_enc_fx.c @@ -698,9 +698,9 @@ void nelp_encoder_fx( } ELSE { - push_indice_fx( hBstr, IND_IG1, iG1_fx, 5 ); - push_indice_fx( hBstr, IND_IG2A, iG2_fx[0], 6 ); - push_indice_fx( hBstr, IND_IG2B, iG2_fx[1], 6 ); + push_indice( hBstr, IND_IG1, iG1_fx, 5 ); + push_indice( hBstr, IND_IG2A, iG2_fx[0], 6 ); + push_indice( hBstr, IND_IG2B, iG2_fx[1], 6 ); } test(); @@ -1019,7 +1019,7 @@ void nelp_encoder_fx( } ELSE { - push_indice_fx( hBstr, IND_NELP_FID, fid, 2 ); + push_indice( hBstr, IND_NELP_FID, fid, 2 ); } } diff --git a/lib_enc/peak_vq_enc_fx.c b/lib_enc/peak_vq_enc_fx.c index aa4763aa6..dffab4900 100644 --- a/lib_enc/peak_vq_enc_fx.c +++ b/lib_enc/peak_vq_enc_fx.c @@ -559,13 +559,13 @@ Word16 peak_vq_enc_fx( move32(); nf_gains[i] = L_shr( acc, 1 + 2 ); /* nf_gains in Q12. dicn_fx is in Q14. Need extra shift +2. */ move32(); - push_indice_fx( hBstr, IND_HVQ_NF_GAIN, indx, 5 ); + push_indice( hBstr, IND_HVQ_NF_GAIN, indx, 5 ); bits = add( bits, 5 ); } /* Signal number of peaks */ i = sub( max_peaks, vq_peaks ); - push_indice_fx( hBstr, IND_NUM_PEAKS, i, 5 ); + push_indice( hBstr, IND_NUM_PEAKS, i, 5 ); bits = add( bits, 5 ); /* Identify position of first peak and arrange peak gains by position */ @@ -677,8 +677,8 @@ Word16 peak_vq_enc_fx( move16(); } - push_indice_fx( hBstr, IND_FLAGN, FlagN, 1 ); - push_indice_fx( hBstr, IND_PG_IDX, pgain_difidx[0], GAIN0_BITS ); + push_indice( hBstr, IND_FLAGN, FlagN, 1 ); + push_indice( hBstr, IND_PG_IDX, pgain_difidx[0], GAIN0_BITS ); IF( FlagN ) { @@ -692,7 +692,7 @@ Word16 peak_vq_enc_fx( r = pgain_huffsizn[j]; move16(); - push_indice_fx( hBstr, IND_PG_IDX, m, r ); + push_indice( hBstr, IND_PG_IDX, m, r ); } } ELSE @@ -700,7 +700,7 @@ Word16 peak_vq_enc_fx( pPgainDifIdx = &pgain_difidx[1]; FOR( i = 0; i < vqPeaksMinus1; i++ ) { - push_indice_fx( hBstr, IND_PG_IDX, ( *pPgainDifIdx++ ), GAINI_BITS ); + push_indice( hBstr, IND_PG_IDX, ( *pPgainDifIdx++ ), GAINI_BITS ); } } @@ -727,13 +727,13 @@ Word16 peak_vq_enc_fx( num_overlap_bins = sub( 5, sub( vq_peak_idx[i + 1], vq_peak_idx[i] ) ); indx = sub( vq_peak_idx[i], 2 ); quant_peaks_fx( hBstr, &coefs[indx], &coefs_out[indx], &peak_gains[i], &vq_cb_idx, num_overlap_bins, core_brate, vq_peaks ); - push_indice_fx( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); + push_indice( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); bits = add( bits, 9 ); } indx = sub( vq_peak_idx[i], 2 ); quant_peaks_fx( hBstr, &coefs[indx], &coefs_out[indx], &peak_gains[i], &vq_cb_idx, 0, core_brate, vq_peaks ); - push_indice_fx( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); + push_indice( hBstr, IND_HVQ_PEAKS, vq_cb_idx, 8 ); bits = add( bits, 9 ); /* Quantize peak positions and sign with HVQ */ @@ -826,7 +826,7 @@ Word16 peak_vq_enc_fx( move16(); } - push_indice_fx( hBstr, IND_HVQ_PVQ_GAIN, pvq_norm[k], HVQ_PVQ_GAIN_BITS ); + push_indice( hBstr, IND_HVQ_PVQ_GAIN, pvq_norm[k], HVQ_PVQ_GAIN_BITS ); pvq_bits = add( pvq_bits, HVQ_PVQ_GAIN_BITS ); pvq_norm[k] = add( pvq_norm[k], 8 ); @@ -1148,7 +1148,7 @@ static void quant_peaks_fx( { *vq_idx = w_vquant_fx( x, Qx, weights, xq, hvq_peak_cb_fx, cbSize, 0 ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 0, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 0, 1 ); } ELSE IF( EQ_16( cb_class, 1 ) ) { @@ -1157,7 +1157,7 @@ static void quant_peaks_fx( move16(); *vq_idx = add( *vq_idx, sub( HVQ_CB_SIZE / 2, search_overlap ) ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 0, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 0, 1 ); } ELSE IF( EQ_16( cb_class, 2 ) ) { @@ -1166,13 +1166,13 @@ static void quant_peaks_fx( move16(); *vq_idx = add( *vq_idx, sub( HVQ_CB_SIZE / 2, search_overlap ) ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 1, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 1, 1 ); } ELSE { *vq_idx = w_vquant_fx( x, Qx, weights, xq, hvq_peak_cb_fx, cbSize, 1 ); move16(); - push_indice_fx( hBstr, IND_HVQ_PEAKS, 1, 1 ); + push_indice( hBstr, IND_HVQ_PEAKS, 1, 1 ); } FOR( i = 0; i < 4; i++ ) @@ -1458,23 +1458,23 @@ static Word16 hvq_code_pos_fx( test(); IF( GT_16( delta_bits, sparse_bits ) || delta_bits < 0 ) { - push_indice_fx( hBstr, IND_POS_IDX, HVQ_CP_SPARSE, 1 ); + push_indice( hBstr, IND_POS_IDX, HVQ_CP_SPARSE, 1 ); FOR( i = 0; i < sparse_bits; i++ ) { - push_indice_fx( hBstr, IND_POS_IDX, sparse_result[i], 1 ); + push_indice( hBstr, IND_POS_IDX, sparse_result[i], 1 ); } bits = add( add( bits, sparse_bits ), 1 ); } ELSE { - push_indice_fx( hBstr, IND_POS_IDX, HVQ_CP_DELTA, 1 ); + push_indice( hBstr, IND_POS_IDX, HVQ_CP_DELTA, 1 ); FOR( i = 0; i < num_peaks; i++ ) { j = delta[i]; move16(); - push_indice_fx( hBstr, IND_POS_IDX, hvq_cp_huff_val[j], hvq_cp_huff_len[j] ); + push_indice( hBstr, IND_POS_IDX, hvq_cp_huff_val[j], hvq_cp_huff_len[j] ); } bits = add( add( bits, delta_bits ), 1 ); } @@ -1489,7 +1489,7 @@ static Word16 hvq_code_pos_fx( tmp = 0; move16(); } - push_indice_fx( hBstr, IND_POS_IDX, tmp, 1 ); + push_indice( hBstr, IND_POS_IDX, tmp, 1 ); } bits = add( bits, num_peaks ); diff --git a/lib_enc/pit_enc_fx.c b/lib_enc/pit_enc_fx.c index b19fb7e56..8eea1b3d5 100644 --- a/lib_enc/pit_enc_fx.c +++ b/lib_enc/pit_enc_fx.c @@ -1787,7 +1787,7 @@ void pit_Q_enc_fx( } { - push_indice_fx( hBstr, IND_PITCH, pitch_index, nBits ); + push_indice( hBstr, IND_PITCH, pitch_index, nBits ); } return; @@ -1919,7 +1919,7 @@ void pit16k_Q_enc_fx( } } - push_indice_fx( hBstr, IND_PITCH, pitch_index, nBits ); + push_indice( hBstr, IND_PITCH, pitch_index, nBits ); } ELSE IF( EQ_16( nBits, 9 ) ) /* absolute encoding with 9 bits */ { @@ -1949,14 +1949,14 @@ void pit16k_Q_enc_fx( } } - push_indice_fx( hBstr, IND_PITCH, pitch_index, 9 ); + push_indice( hBstr, IND_PITCH, pitch_index, 9 ); } ELSE /* nBits == 6 */ /* relative encoding with 6 bits */ { /*pitch_index = (T0 - *T0_min) * 4 + T0_frac;*/ pitch_index = add( shl( sub( T0, *T0_min ), 2 ), T0_frac ); - push_indice_fx( hBstr, IND_PITCH, pitch_index, nBits ); + push_indice( hBstr, IND_PITCH, pitch_index, nBits ); } limit_T0_fx( L_FRAME16k, 8, L_SUBFR, limit_flag, T0, T0_frac, T0_min, T0_max ); diff --git a/lib_enc/ppp_enc_fx.c b/lib_enc/ppp_enc_fx.c index 9afb27065..ac3d5836a 100644 --- a/lib_enc/ppp_enc_fx.c +++ b/lib_enc/ppp_enc_fx.c @@ -171,9 +171,9 @@ ivas_error ppp_quarter_encoder_fx( CURRCW_Q_FX->upper_cut_off_freq_of_interest_fx = (Word16) find_remd( Ltempn, 20971, &Ltempd ); move16(); - push_indice_fx( hBstr, IND_AMP0, AMP_IDX_fx[0], 6 ); - push_indice_fx( hBstr, IND_AMP1, AMP_IDX_fx[1], 6 ); - push_indice_fx( hBstr, IND_POWER, POWER_IDX_FX, 6 ); + push_indice( hBstr, IND_AMP0, AMP_IDX_fx[0], 6 ); + push_indice( hBstr, IND_AMP1, AMP_IDX_fx[1], 6 ); + push_indice( hBstr, IND_POWER, POWER_IDX_FX, 6 ); /*Phase copying is done through copy_phase instead of car2pol and pol2car */ copy_phase_fx( TARGETCW_FX, *CURRCW_Q_FX, TARGETCW_FX ); @@ -199,7 +199,7 @@ ivas_error ppp_quarter_encoder_fx( /*DTFS_phaseShift( CURRCW_Q,(float)(PI2*tmp/CURRCW_Q->lag) ); */ Q2phaseShift_fx( CURRCW_Q_FX, tmp_fx, CURRCW_Q_FX->lag_fx, S_fx, C_fx ); - push_indice_fx( hBstr, IND_GLOBAL_ALIGNMENT, shr( add( tmp_fx, 12 ), 2 ), 3 ); + push_indice( hBstr, IND_GLOBAL_ALIGNMENT, shr( add( tmp_fx, 12 ), 2 ), 3 ); free( PREVDTFS_FX ); return error; diff --git a/lib_enc/range_enc_fx.c b/lib_enc/range_enc_fx.c index 689b313d8..767b2ecb5 100644 --- a/lib_enc/range_enc_fx.c +++ b/lib_enc/range_enc_fx.c @@ -423,14 +423,14 @@ void rc_enc_bits_fx( IF( GT_16( bits, 16 ) ) { - push_indice_fx( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_lshr( value, 16 ) ), sub( bits, 16 ) ); + push_indice( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_lshr( value, 16 ) ), sub( bits, 16 ) ); hPVQ->rc_offset = add( hPVQ->rc_offset, 1 ); // Q0 - push_indice_fx( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_and( value, 0x0000ffff ) ), 16 ); + push_indice( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( UL_and( value, 0x0000ffff ) ), 16 ); hPVQ->rc_offset = add( hPVQ->rc_offset, 1 ); // Q0 } ELSE { - push_indice_fx( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( value ), bits ); + push_indice( hBstr, sub( IND_RC_END, hPVQ->rc_offset ), u_extract_l( value ), bits ); hPVQ->rc_offset = add( hPVQ->rc_offset, 1 ); // Q0 } } @@ -516,7 +516,7 @@ static void rc_enc_write_fx( Word16 bits /* i : Number of bits Q0*/ ) { - push_indice_fx( hBstr, IND_RC_START, byte, bits ); + push_indice( hBstr, IND_RC_START, byte, bits ); return; } diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index 0a20db8ed..1445559a1 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -94,7 +94,7 @@ void stat_noise_uv_enc_fx( noisiness = s_max( noisiness, 0 ); noisiness = s_min( noisiness, 31 ); - push_indice_fx( st_fx->hBstr, IND_NOISINESS, noisiness, 5 ); + push_indice( st_fx->hBstr, IND_NOISINESS, noisiness, 5 ); } /*-----------------------------------------------------------------* diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c index 26c8382ca..1ebef7404 100644 --- a/lib_enc/swb_bwe_enc_fx.c +++ b/lib_enc/swb_bwe_enc_fx.c @@ -186,7 +186,7 @@ void wb_bwe_enc_fx( Q_synth = sub( add( sub( new_input_fx_exp, 16 ), scl ), 1 ); mode = WB_BWE_encoding_fx( coder_type, yorig_fx, WB_fenv_fx, st_fx, Q_synth, Q_synth ); - push_indice_fx( st_fx->hBstr, IND_WB_CLASS, sub( mode, 2 ), 1 ); + push_indice( st_fx->hBstr, IND_WB_CLASS, sub( mode, 2 ), 1 ); } hBWE_FD->prev_mode = mode; @@ -820,7 +820,7 @@ void swb_bwe_enc_fx( /* write FB BWE frame gain to the bitstream */ IF( EQ_16( st_fx->extl, FB_BWE ) ) { - push_indice_fx( st_fx->hBstr, IND_FB_SLOPE, idxGain, NUM_BITS_FB_FRAMEGAIN ); + push_indice( st_fx->hBstr, IND_FB_SLOPE, idxGain, NUM_BITS_FB_FRAMEGAIN ); } return; @@ -2476,7 +2476,7 @@ Word16 WB_BWE_encoding_fx( /* o : classification of wb index = WB_BWE_fenv_q_fx( WB_fenv_fx, F_2_5_fx, 32, 2 ); - push_indice_fx( st_fx->hBstr, IND_WB_FENV, index, 5 ); + push_indice( st_fx->hBstr, IND_WB_FENV, index, 5 ); return ( mode ); } @@ -2665,7 +2665,7 @@ static Word16 SWB_BWE_encoding_fx( { mode = IsTransient; move16(); - push_indice_fx( hBstr, IND_SWB_CLASS, mode, 2 ); + push_indice( hBstr, IND_SWB_CLASS, mode, 2 ); /* Energy for the different bands and global energies */ global_gain_fx = L_deposit_l( 0 ); @@ -2924,13 +2924,13 @@ static Word16 SWB_BWE_encoding_fx( index = shr( add( SWB_tenv_tmp_fx[n_band], 1024 ), 11 ); } - push_indice_fx( hBstr, IND_SWB_TENV, index, 4 ); + push_indice( hBstr, IND_SWB_TENV, index, 4 ); } MSVQ_Interpol_Tran_fx( SWB_fenv_fx, indice ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[0], 7 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[1], 6 ); + push_indice( hBstr, IND_SWB_FENV, indice[0], 7 ); + push_indice( hBstr, IND_SWB_FENV, indice[1], 6 ); } ELSE { @@ -2955,7 +2955,7 @@ static Word16 SWB_BWE_encoding_fx( global_gain_fx = L_shr( global_gain_fx, 1 ); /*2*Q_shb */ mode = FD_BWE_class_fx( yos_fx, global_gain_fx, tilt_nb_fx, Q_synth, Q_shb, st_fx ); - push_indice_fx( hBstr, IND_SWB_CLASS, mode, 2 ); + push_indice( hBstr, IND_SWB_CLASS, mode, 2 ); energy_control_fx( st_fx, ACELP_CORE, mode, -1, yos_fx, st_offset, energy_factor_fx, Q_synth_lf ); @@ -2990,11 +2990,11 @@ static Word16 SWB_BWE_encoding_fx( /* Energy VQ */ msvq_interpol_fx( SWB_fenv_fx, w_env_fx, indice ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[0], 5 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[1], 7 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[2], 6 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[3], 5 ); - push_indice_fx( hBstr, IND_SWB_FENV, indice[4], 6 ); + push_indice( hBstr, IND_SWB_FENV, indice[0], 5 ); + push_indice( hBstr, IND_SWB_FENV, indice[1], 7 ); + push_indice( hBstr, IND_SWB_FENV, indice[2], 6 ); + push_indice( hBstr, IND_SWB_FENV, indice[3], 5 ); + push_indice( hBstr, IND_SWB_FENV, indice[4], 6 ); } hBWE_FD->prev_mode = mode; move16(); @@ -3939,7 +3939,7 @@ void hq_generic_encoding_fx( IF( EQ_16( hHQ_core->hq_generic_speech_class, 1 ) ) { - push_indice_fx( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 1, 1 ); + push_indice( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 1, 1 ); *hq_generic_exc_clas = HQ_GENERIC_SP_EXC; move16(); } @@ -3947,8 +3947,8 @@ void hq_generic_encoding_fx( { *hq_generic_exc_clas = decision_hq_generic_class_fx_32( coefs_fx, hq_generic_offset ); move16(); - push_indice_fx( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 0, 1 ); - push_indice_fx( hBstr, IND_HQ_SWB_EXC_CLAS, *hq_generic_exc_clas, 1 ); + push_indice( hBstr, IND_HQ_SWB_EXC_SP_CLAS, 0, 1 ); + push_indice( hBstr, IND_HQ_SWB_EXC_CLAS, *hq_generic_exc_clas, 1 ); } FOR( n_band = 0; n_band < nenv; n_band++ ) @@ -4069,23 +4069,23 @@ void hq_generic_encoding_fx( move16(); } - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[0], 5 ); - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[1], 7 ); - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[2], 6 ); - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[3], 5 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[0], 5 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[1], 7 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[2], 6 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[3], 5 ); IF( LE_16( hq_generic_offset, HQ_GENERIC_FOFFSET_24K4 ) ) { - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[4], 6 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[4], 6 ); } ELSE { - push_indice_fx( hBstr, IND_SWB_FENV_HQ, indice[4], 5 ); + push_indice( hBstr, IND_SWB_FENV_HQ, indice[4], 5 ); } IF( EQ_16( st_fx->bwidth, FB ) ) { - push_indice_fx( hBstr, IND_FB_FENV_HQ, indice[5], 5 ); + push_indice( hBstr, IND_FB_FENV_HQ, indice[5], 5 ); } FOR( n_band = 0; n_band < nenv; n_band++ ) diff --git a/lib_enc/swb_bwe_enc_hr_fx.c b/lib_enc/swb_bwe_enc_hr_fx.c index fd4a9f125..8b5a17353 100644 --- a/lib_enc/swb_bwe_enc_hr_fx.c +++ b/lib_enc/swb_bwe_enc_hr_fx.c @@ -189,7 +189,7 @@ void swb_bwe_enc_hr_fx( st_fx->EnergyLT_fx_exp = exp1; move16(); - push_indice_fx( hBstr, IND_HR_IS_TRANSIENT, is_transient, 1 ); + push_indice( hBstr, IND_HR_IS_TRANSIENT, is_transient, 1 ); /*---------------------------------------------------------------------* * OLA and MDCT @@ -309,7 +309,7 @@ void swb_bwe_enc_hr_fx( ind1 = gain_quant_fx( &L_gain_fx, &gain1_fx, LG10_MIN_GLOB_GAIN_BWE_HR_Q14, LG10_MAX_GLOB_GAIN_BWE_HR_Q13, NBITS_GLOB_GAIN_BWE_HR, &exp1 ); - push_indice_fx( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); /* normalization with global gain */ @@ -353,7 +353,7 @@ void swb_bwe_enc_hr_fx( { ind1 = en_band_quant_fx( en_band_fx, swb_hr_env_code3_fx, NUM_ENVLOPE_CODE_HR_TR ); - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR ); + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR ); nBits = sub( nBits, NBITS_ENVELOPE_BWE_HR_TR ); ind2 = ind1; move16(); @@ -369,7 +369,7 @@ void swb_bwe_enc_hr_fx( ind1 = en_band_quant_fx( en_band_fx, swb_hr_env_code3_fx + ( NUM_ENVLOPE_CODE_HR_TR2 * 2 ), NUM_ENVLOPE_CODE_HR_TR2 ); } - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR - 1 ); + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR_TR - 1 ); nBits = sub( nBits, NBITS_ENVELOPE_BWE_HR_TR - 1 ); } @@ -439,7 +439,7 @@ void swb_bwe_enc_hr_fx( L_en_noncoded_fx = L_deposit_h( en_band_fx[N_BANDS_TRANS_BWE_HR - 1] ); /* to Put in Q16+9 */ } - push_indice_fx( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_HF_GAIN_BWE_HR ); } ELSE @@ -507,7 +507,7 @@ void swb_bwe_enc_hr_fx( L_gain_fx = L_shr( L_tmp, sub( 31 - 16, exp2 ) ); /* 31: 'L_tmp' is already in Q31 */ ind1 = gain_quant_fx( &L_gain_fx, &gain1_fx, LG10_MIN_GLOB_GAIN_BWE_HR_Q14, LG10_MAX_GLOB_GAIN_BWE_HR_Q13, NBITS_GLOB_GAIN_BWE_HR, &exp1 ); - push_indice_fx( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); /* normalization with global gain */ @@ -547,8 +547,8 @@ void swb_bwe_enc_hr_fx( ind1 = en_band_quant_fx( en_band_fx, swb_hr_env_code1_fx, NUM_ENVLOPE_CODE_HR1 ); ind2 = en_band_quant_fx( en_band_fx + 2, swb_hr_env_code2_fx, NUM_ENVLOPE_CODE_HR2 ); - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR1 ); - push_indice_fx( hBstr, IND_HR_ENVELOPE, ind2, NBITS_ENVELOPE_BWE_HR2 ); + push_indice( hBstr, IND_HR_ENVELOPE, ind1, NBITS_ENVELOPE_BWE_HR1 ); + push_indice( hBstr, IND_HR_ENVELOPE, ind2, NBITS_ENVELOPE_BWE_HR2 ); nBits = sub( nBits, NBITS_ENVELOPE_BWE_HR1 + NBITS_ENVELOPE_BWE_HR2 ); @@ -673,7 +673,7 @@ void swb_bwe_enc_hr_fx( L_en_noncoded_fx = L_mult0( min_env_fx, 16384 ); } - push_indice_fx( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_HF_GAIN, ind1, NBITS_HF_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_HF_GAIN_BWE_HR ); } ELSE @@ -758,7 +758,7 @@ void swb_bwe_enc_hr_fx( /* Put in Q16 */ L_gain_fx = L_shr( L_temp, sub( 31 - 16, temp2 ) ); /* 31: 'L_temp' is already in Q31 */ ind1 = gain_quant_fx( &L_gain_fx, &gain2_fx, LG10_MIN_GLOB_GAIN_BWE_HR_Q14, LG10_MAX_GLOB_GAIN_BWE_HR_Q13, NBITS_GLOB_GAIN_BWE_HR, &exp2 ); - push_indice_fx( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); + push_indice( hBstr, IND_HR_GAIN, ind1, NBITS_GLOB_GAIN_BWE_HR ); nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); /* normalize with global gain */ @@ -784,7 +784,7 @@ void swb_bwe_enc_hr_fx( WHILE( nBits > 0 ) { i = s_min( nBits, 16 ); - push_indice_fx( hBstr, IND_UNUSED, 0, i ); + push_indice( hBstr, IND_UNUSED, 0, i ); nBits = sub( nBits, i ); } return; diff --git a/lib_enc/swb_bwe_enc_lr_fx.c b/lib_enc/swb_bwe_enc_lr_fx.c index 1a397c514..938cdd971 100644 --- a/lib_enc/swb_bwe_enc_lr_fx.c +++ b/lib_enc/swb_bwe_enc_lr_fx.c @@ -806,7 +806,7 @@ static void gethar_noisegn_fx( } } - push_indice_fx( hBstr, IND_NOISEG, imin_fx, 2 ); + push_indice( hBstr, IND_NOISEG, imin_fx, 2 ); /*g=(float) pow (10.0f,gain_table[imin]);*/ L_temp = L_mult( gain_table_SWB_BWE_fx[imin_fx], 27213 ); /* Q14+Q13+1=Q28 log(10)/log(2)=3.3219 27213.23(Q13) */ @@ -909,7 +909,7 @@ static void EncodeSWBSubbands_fx( /* Write the indices into the bitstream */ FOR( k = 0; k < nBands_search_fx; k++ ) { - push_indice_fx( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_mode0_Har[k] ); + push_indice( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_mode0_Har[k] ); } IF( flag_dis == 0 ) @@ -974,7 +974,7 @@ static void EncodeSWBSubbands_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_modeNormal[k] ); + push_indice( st_fx->hBstr, IND_LAGINDICES, lagIndices_fx[k], bits_lagIndices_modeNormal[k] ); } } diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index c5d5e651e..1a14e7acb 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -866,7 +866,7 @@ void wb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_LBR_WB_LSF ); + push_indice( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_LBR_WB_LSF ); } Copy( lbr_wb_bwe_lsfvq_cbook_2bit_fx + i * LPC_SHB_ORDER_LBR_WB, lsp_wb, LPC_SHB_ORDER_LBR_WB ); @@ -928,7 +928,7 @@ void wb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_WB_LSF ); + push_indice( st_fx->hBstr, IND_SHB_LSF, i, NUM_BITS_WB_LSF ); } Copy( wb_bwe_lsfvq_cbook_8bit_fx + i * LPC_SHB_ORDER_WB, lsp_wb, LPC_SHB_ORDER_WB ); @@ -1162,7 +1162,7 @@ void wb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_UV_FLAG, uv_flag, 1 ); + push_indice( st_fx->hBstr, IND_UV_FLAG, uv_flag, 1 ); /* Quantization of the subframe gain parameter */ QuantizeSHBsubgains_fx( st_fx, GainShape, st_fx->extl ); @@ -2482,7 +2482,7 @@ void swb_tbe_enc_fx( } ELSE { - push_indice_fx( st_fx->hBstr, IND_SHB_VF, vf_ind_fx, NUM_BITS_SHB_VF ); + push_indice( st_fx->hBstr, IND_SHB_VF, vf_ind_fx, NUM_BITS_SHB_VF ); } } @@ -5330,7 +5330,7 @@ static void QuantizeSHBsubgains_fx( idxSubGain = closest_centroid_lc_fx( subgains + NUM_SHB_SUBFR / 4, HBCB_SubGain5bit_fx, 1 << NUM_BITS_SHB_SUBGAINS ); Copy( HBCB_SubGain5bit_fx + idxSubGain * NUM_SHB_SUBFR / 4, subgains, NUM_SHB_SUBFR / 4 ); - push_indice_fx( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); + push_indice( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); FOR( i = 0; i < NUM_SHB_SUBFR / 4; i++ ) { @@ -5401,7 +5401,7 @@ static void QuantizeSHBsubgains_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); + push_indice( hBstr, IND_SHB_SUBGAIN, idxSubGain, NUM_BITS_SHB_SUBGAINS ); } } @@ -5596,7 +5596,7 @@ static void Quant_shb_ener_sf_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( st_fx->hBstr, IND_SHB_ENER_SF, idxSubEner_fx, NUM_BITS_SHB_ENER_SF ); + push_indice( st_fx->hBstr, IND_SHB_ENER_SF, idxSubEner_fx, NUM_BITS_SHB_ENER_SF ); } return; } @@ -5683,7 +5683,7 @@ static void Quant_shb_res_gshape_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( st_fx->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); + push_indice( st_fx->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); } } } @@ -5787,7 +5787,7 @@ static void QuantizeSHBframegain_fx( 1 << NUM_BITS_SHB_FrameGain, &idxFrameGain, &Q_GainFrame, SHBCB_FrameGain64_fx ); - push_indice_fx( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FrameGain ); + push_indice( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FrameGain ); *rf_gainFrame_ind = idxFrameGain; move16(); /* Q18 */ } @@ -5852,7 +5852,7 @@ static void QuantizeSHBframegain_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); + push_indice( st_fx->hBstr, IND_SHB_FRAMEGAIN, idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); } *rf_gainFrame_ind = idxFrameGain; move16(); @@ -7176,7 +7176,7 @@ static void Quant_BWE_LSF_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_LSF, lsf_idx[i], lsf_q_num_bits[i] ); + push_indice( hBstr, IND_SHB_LSF, lsf_idx[i], lsf_q_num_bits[i] ); } } @@ -7186,7 +7186,7 @@ static void Quant_BWE_LSF_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_MIRROR, m_idx, MIRROR_POINT_BITS ); + push_indice( hBstr, IND_SHB_MIRROR, m_idx, MIRROR_POINT_BITS ); } grid_idx = Find_LSF_grid_fx( lsf, lsf_q, m ); @@ -7194,7 +7194,7 @@ static void Quant_BWE_LSF_fx( hBWE_TD->grid_idx = grid_idx; IF( NE_16( st_fx->codec_mode, MODE2 ) ) { - push_indice_fx( hBstr, IND_SHB_GRID, grid_idx, NUM_LSF_GRID_BITS ); + push_indice( hBstr, IND_SHB_GRID, grid_idx, NUM_LSF_GRID_BITS ); } FOR( i = 0; i < LPC_SHB_ORDER; i++ ) @@ -7407,7 +7407,7 @@ void fb_tbe_enc_fx( } ELSE { - push_indice_fx( st->hBstr, IND_FB_SLOPE, idxGain, 4 ); + push_indice( st->hBstr, IND_FB_SLOPE, idxGain, 4 ); } return; diff --git a/lib_enc/tcq_core_enc_fx.c b/lib_enc/tcq_core_enc_fx.c index 82088be50..d5841094f 100644 --- a/lib_enc/tcq_core_enc_fx.c +++ b/lib_enc/tcq_core_enc_fx.c @@ -449,11 +449,11 @@ ivas_error tcq_core_LR_enc_fx( j = sub( bit_budget, shl( nb_bytes, 3 ) ); FOR( i = 0; i < nb_bytes; i++ ) { - push_indice_fx( hBstr, IND_HQ2_SUBBAND_TCQ, pbs_fx->buf[i], 8 ); + push_indice( hBstr, IND_HQ2_SUBBAND_TCQ, pbs_fx->buf[i], 8 ); } IF( j > 0 ) { - push_indice_fx( hBstr, IND_HQ2_SUBBAND_TCQ, shr( pbs_fx->buf[nb_bytes], ( 8 - j ) ), j ); + push_indice( hBstr, IND_HQ2_SUBBAND_TCQ, shr( pbs_fx->buf[nb_bytes], ( 8 - j ) ), j ); } /* Clear decoding buffer */ set32_fx( coefs_quant_fx, 0, sfm_end[BANDS - 1] + 1 ); diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 7fe813d12..253cc9717 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -389,7 +389,7 @@ void transition_enc_fx( /* 7bit ENCODER */ /* index = (*T0-pit_start)*2 + *T0_frac/2;*/ index = add( shl( sub( *T0, pit_start ), 1 ), shr( *T0_frac, 1 ) ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); @@ -438,7 +438,7 @@ void transition_enc_fx( limit_T0_fx( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max for delta search */ index = add( shl( sub( *T0, pit_start ), 1 ), shr( *T0_frac, 1 ) ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); @@ -502,7 +502,7 @@ void transition_enc_fx( *T0_frac = 0; move16(); } - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); @@ -526,7 +526,7 @@ void transition_enc_fx( *T0 = pitch_fr4_fx( &exc_fx[i_subfr], xn_fx, h1_fx, *T0_min, *T0_max, T0_frac, pit_flag, limit_flag, PIT_MIN, PIT_FR1_8b, L_FRAME, L_SUBFR ); move16(); index = delta_pit_enc_fx( 2, *T0, *T0_frac, *T0_min ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); @@ -607,7 +607,7 @@ void transition_enc_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } } @@ -768,7 +768,7 @@ void transition_enc_fx( /*index = (*T0)*2 + ((*T0_frac)>>1) - (PIT16k_FR2_TC0_2SUBFR*2) + ((PIT16k_FR2_TC0_2SUBFR-PIT16k_MIN)*4);*/ index = add( sub( add( shl( *T0, 1 ), shr( *T0_frac, 1 ) ), ( PIT16k_FR2_TC0_2SUBFR * 2 ) ), ( PIT16k_FR2_TC0_2SUBFR - PIT16k_MIN ) * 4 ); } - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } ELSE IF( EQ_16( nBits, 6 ) ) { @@ -777,7 +777,7 @@ void transition_enc_fx( move16(); index = delta_pit_enc_fx( 4, *T0, *T0_frac, *T0_min ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } IF( EQ_16( nBits, 6 ) ) { @@ -804,7 +804,7 @@ void transition_enc_fx( move16(); set16_fx( &exc_fx[i_subfr], 0, L_SUBFR + 1 ); /* set excitation for current subrame to 0 */ - push_indice_fx( hBstr, IND_LP_FILT_SELECT, 0, 1 ); /* this bit is actually not needed */ + push_indice( hBstr, IND_LP_FILT_SELECT, 0, 1 ); /* this bit is actually not needed */ Copy( xn_fx, xn2_fx, L_SUBFR ); /* target vector for codebook search */ set16_fx( y1_fx, 0, L_SUBFR ); /* set filtered adaptive excitation to 0 */ @@ -839,7 +839,7 @@ void transition_enc_fx( IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { - push_indice_fx( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); + push_indice( hBstr, IND_LP_FILT_SELECT, lp_select, 1 ); } *Jopt_flag = 1; @@ -1886,7 +1886,7 @@ static void tc_enc_fx( /* write pitch index */ IF( ( GE_16( *T0, L_SUBFR ) ) && ( NE_16( *tc_subfr, 3 * L_SUBFR ) ) ) { - push_indice_fx( hBstr, IND_PITCH, 0, nBits ); + push_indice( hBstr, IND_PITCH, 0, nBits ); } ELSE IF( EQ_16( *tc_subfr, 3 * L_SUBFR ) ) { @@ -1898,7 +1898,7 @@ static void tc_enc_fx( { index = abs_pit_enc_fx( 2, 0, *T0, *T0_frac ); } - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); limit_T0_fx( L_FRAME, 8, 0, 0, *T0, 0, T0_min, T0_max ); } @@ -1907,12 +1907,12 @@ static void tc_enc_fx( IF( EQ_16( nBits, 6 ) ) { index = delta_pit_enc_fx( 2, *T0, *T0_frac, PIT_MIN - 1 ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } ELSE { index = delta_pit_enc_fx( 0, *T0, *T0_frac, PIT_MIN - 1 ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } } } @@ -1926,13 +1926,13 @@ static void tc_enc_fx( ELSE IF( EQ_16( nBits, 6 ) ) { index = add( shl( sub( *T0, PIT16k_MIN ), 1 ), shr( *T0_frac, 1 ) ); - push_indice_fx( hBstr, IND_PITCH, index, nBits ); + push_indice( hBstr, IND_PITCH, index, nBits ); } } - push_indice_fx( hBstr, IND_TC_IMP_SHAPE, imp_shape, 3 ); - push_indice_fx( hBstr, IND_TC_IMP_POS, imp_pos, 6 ); - push_indice_fx( hBstr, IND_TC_IMP_SIGN, pitch_sign_fx, 1 ); - push_indice_fx( hBstr, IND_TC_IMP_GAIN, pitch_index, 3 ); + push_indice( hBstr, IND_TC_IMP_SHAPE, imp_shape, 3 ); + push_indice( hBstr, IND_TC_IMP_POS, imp_pos, 6 ); + push_indice( hBstr, IND_TC_IMP_SIGN, pitch_sign_fx, 1 ); + push_indice( hBstr, IND_TC_IMP_GAIN, pitch_index, 3 ); *position = add( imp_pos, i_subfr ); move16(); diff --git a/lib_enc/voiced_enc_fx.c b/lib_enc/voiced_enc_fx.c index b0dba61de..8081b2909 100644 --- a/lib_enc/voiced_enc_fx.c +++ b/lib_enc/voiced_enc_fx.c @@ -1156,7 +1156,7 @@ ivas_error ppp_voiced_encoder_fx( { Q_delta_lag = add( delta_lag_E, 11 ); /* to make it positive always */ - push_indice_fx( hBstr, IND_DELTALAG, Q_delta_lag, 5 ); + push_indice( hBstr, IND_DELTALAG, Q_delta_lag, 5 ); } WIsyn_fx( *dtfs_temp_fx, CURRP_Q_E_FX, lpc2_fx, &( hSC_VBR->ph_offset_E_fx ), out_fx, L_FRAME, 0, S_fx, C_fx, -- GitLab From dd98b3e4fa57b4bc8b07e175610df09427ba1916 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Tue, 25 Mar 2025 14:01:42 -0400 Subject: [PATCH 0089/1310] fix clang --- lib_enc/transition_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 253cc9717..6718552c5 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -803,7 +803,7 @@ void transition_enc_fx( *Jopt_flag = 0; move16(); - set16_fx( &exc_fx[i_subfr], 0, L_SUBFR + 1 ); /* set excitation for current subrame to 0 */ + set16_fx( &exc_fx[i_subfr], 0, L_SUBFR + 1 ); /* set excitation for current subrame to 0 */ push_indice( hBstr, IND_LP_FILT_SELECT, 0, 1 ); /* this bit is actually not needed */ Copy( xn_fx, xn2_fx, L_SUBFR ); /* target vector for codebook search */ -- GitLab From 7fa6d1bb0c0fe89cb8226b89a80803ed9f59d4b5 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Tue, 25 Mar 2025 14:05:40 -0400 Subject: [PATCH 0090/1310] replace EVS push_next_indice_fx byt IVAS one --- lib_com/bitstream_fx.c | 4 +- lib_com/igf_base_fx.c | 2 +- lib_com/parameter_bitmaping_fx.c | 2 +- lib_enc/ACcontextMapping_enc_fx.c | 2 +- lib_enc/ari_hm_enc_fx.c | 4 +- lib_enc/decision_matrix_enc_fx.c | 4 +- lib_enc/enc_prm_fx.c | 130 +++++++++++++++--------------- lib_enc/evs_enc_fx.c | 14 ++-- lib_enc/fd_cng_enc_fx.c | 4 +- lib_enc/guided_plc_enc_fx.c | 6 +- lib_enc/igf_enc_fx.c | 4 +- lib_enc/igf_scf_enc_fx.c | 2 +- lib_enc/lsf_msvq_ma_enc_fx.c | 10 +-- lib_enc/qlpc_avq_fx.c | 20 ++--- lib_enc/swb_tbe_enc_fx.c | 28 +++---- 15 files changed, 118 insertions(+), 118 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 667958264..8cb968bf1 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -288,9 +288,8 @@ void push_indice_fx( return; } -#endif /*-------------------------------------------------------------------* - * push_next_indice_fx() * + * push_next_indice() * * Push a new indice into the buffer at the next position *-------------------------------------------------------------------*/ @@ -315,6 +314,7 @@ void push_next_indice_fx( return; } +#endif /*-------------------------------------------------------------------* diff --git a/lib_com/igf_base_fx.c b/lib_com/igf_base_fx.c index fbccdb519..44cf27c5f 100644 --- a/lib_com/igf_base_fx.c +++ b/lib_com/igf_base_fx.c @@ -1242,7 +1242,7 @@ void IGFCommonFuncsWriteSerialBit( IF( hBstr ) { - push_next_indice_fx( hBstr, bit, 1 ); + push_next_indice( hBstr, bit, 1 ); } *pBitOffset = add( *pBitOffset, 1 ); move16(); diff --git a/lib_com/parameter_bitmaping_fx.c b/lib_com/parameter_bitmaping_fx.c index 0846c618b..923872090 100644 --- a/lib_com/parameter_bitmaping_fx.c +++ b/lib_com/parameter_bitmaping_fx.c @@ -21,7 +21,7 @@ static Word16 PutIntoBitstream_fx( value = *( *pStream )++; codedValue = EncodeValue( value, index ); - push_next_indice_fx( hBstr, codedValue, nBits ); + push_next_indice( hBstr, codedValue, nBits ); return value; } diff --git a/lib_enc/ACcontextMapping_enc_fx.c b/lib_enc/ACcontextMapping_enc_fx.c index c52fddf97..4e02b1f11 100644 --- a/lib_enc/ACcontextMapping_enc_fx.c +++ b/lib_enc/ACcontextMapping_enc_fx.c @@ -343,7 +343,7 @@ void ACcontextMapping_encode2_no_mem_s17_LC_fx( /* Push number of encoded tuples */ value = sub( shr( lastnz, 1 ), 1 ); /* Q0 */ - push_next_indice_fx( hBstr, value, nbbits_ntuples ); + push_next_indice( hBstr, value, nbbits_ntuples ); /* Push arithmetic coded bits */ push_next_bits_fx( hBstr, &ptr[nbbits_ntuples], sub( bp, nbbits_ntuples ) ); diff --git a/lib_enc/ari_hm_enc_fx.c b/lib_enc/ari_hm_enc_fx.c index 76d48ccf4..343f1890f 100644 --- a/lib_enc/ari_hm_enc_fx.c +++ b/lib_enc/ari_hm_enc_fx.c @@ -42,12 +42,12 @@ Word16 EncodeIndex_fx( NumRatioBitsBwLtpIndx = NumRatioBits[Bandwidth][LtpPitchIndex]; move16(); - push_next_indice_fx( hBst, s_and( PeriodicityIndex, 0xff ), NumRatioBitsBwLtpIndx ); + push_next_indice( hBst, s_and( PeriodicityIndex, 0xff ), NumRatioBitsBwLtpIndx ); return NumRatioBitsBwLtpIndx; } ELSE { - push_next_indice_fx( hBst, PeriodicityIndex, 8 ); + push_next_indice( hBst, PeriodicityIndex, 8 ); return 8; } } diff --git a/lib_enc/decision_matrix_enc_fx.c b/lib_enc/decision_matrix_enc_fx.c index 63a13aa1a..bc5feeb6b 100644 --- a/lib_enc/decision_matrix_enc_fx.c +++ b/lib_enc/decision_matrix_enc_fx.c @@ -527,8 +527,8 @@ void signalling_enc_fx( assert( !st_fx->tcxonly ); assert( st_fx->core == HQ_CORE ); - push_next_indice_fx( hBstr, 1, 1 ); /* TCX */ - push_next_indice_fx( hBstr, 1, 1 ); /* HQ_CORE */ + push_next_indice( hBstr, 1, 1 ); /* TCX */ + push_next_indice( hBstr, 1, 1 ); /* HQ_CORE */ /* write ACELP->HQ core switching flag */ test(); diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c index ecd4e2f01..6c052e596 100644 --- a/lib_enc/enc_prm_fx.c +++ b/lib_enc/enc_prm_fx.c @@ -33,7 +33,7 @@ static void enc_prm_hm( } /* Flag */ - push_next_indice_fx( hBstr, prm_hm[0], 1 ); + push_next_indice( hBstr, prm_hm[0], 1 ); IF( prm_hm[0] ) { @@ -50,7 +50,7 @@ static void enc_prm_hm( IF( EQ_16( st->hTcxCfg->coder_type, VOICED ) ) { /* Gain index */ - push_next_indice_fx( hBstr, prm_hm[2], kTcxHmNumGainBits ); + push_next_indice( hBstr, prm_hm[2], kTcxHmNumGainBits ); } } } @@ -152,7 +152,7 @@ void enc_prm_rf_ivas_fx( index = 3; move16(); } - push_next_indice_fx( hBstr, index, 2 ); + push_next_indice( hBstr, index, 2 ); IF( EQ_16( rf_frame_type, RF_TCXFD ) ) { @@ -296,9 +296,9 @@ void enc_prm_rf_fx( /* LSF indices */ IF( EQ_16( rf_frame_type, RF_TCXFD ) ) { - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][0], lsf_numbits[0] ); /* VQ 1 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][1], lsf_numbits[1] ); /* VQ 2 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][2], lsf_numbits[2] ); /* VQ 3 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], lsf_numbits[0] ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], lsf_numbits[1] ); /* VQ 2 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][2], lsf_numbits[2] ); /* VQ 3 */ } /* classification */ @@ -324,12 +324,12 @@ void enc_prm_rf_fx( index = 3; move16(); } - push_next_indice_fx( hBstr, index, 2 ); + push_next_indice( hBstr, index, 2 ); IF( EQ_16( rf_frame_type, RF_TCXFD ) ) { /* TCX global gain = 7 bits */ - push_next_indice_fx( hBstr, hRF->rf_gain_tcx[fec_offset], 7 ); + push_next_indice( hBstr, hRF->rf_gain_tcx[fec_offset], 7 ); /*window info 1 bit for long overlap 2 if minimum or half overlap*/ @@ -345,35 +345,35 @@ void enc_prm_rf_fx( test(); IF( ( EQ_16( rf_frame_type, RF_TCXTD1 ) || EQ_16( rf_frame_type, RF_TCXTD2 ) ) && hTcxEnc->tcxltp != 0 ) { - push_next_indice_fx( hBstr, hRF->rf_tcxltp_param[fec_offset], 9 ); + push_next_indice( hBstr, hRF->rf_tcxltp_param[fec_offset], 9 ); } } } ELSE IF( EQ_16( rf_frame_type, 7 ) ) /* NELP bitstream writing */ { /* LSF indices */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ /* NELP gain indices */ - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_iG1[fec_offset], 5 ); - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][0], 6 ); - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][1], 6 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG1[fec_offset], 5 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][0], 6 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_iG2[fec_offset][1], 6 ); /* NELP filter selection index */ - push_next_indice_fx( hBstr, hRF->rf_indx_nelp_fid[fec_offset], 2 ); + push_next_indice( hBstr, hRF->rf_indx_nelp_fid[fec_offset], 2 ); /* tbe gainFr */ - push_next_indice_fx( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 5 ); + push_next_indice( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 5 ); } ELSE IF( GE_16( rf_frame_type, 4 ) ) /* rf_frame_type ALL_PRED: 4, NO_PRED: 5, GEN_PRED: 6 */ { /* LSF indices */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ - push_next_indice_fx( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][0], 8 ); /* VQ 1 */ + push_next_indice( hBstr, hRF->rf_indx_lsf[fec_offset][1], 8 ); /* VQ 2 */ /* ES pred */ - push_next_indice_fx( hBstr, hRF->rf_indx_EsPred[fec_offset], 3 ); + push_next_indice( hBstr, hRF->rf_indx_EsPred[fec_offset], 3 ); ltp_mode = ACELP_LTP_MODE[1][1][rf_frame_type]; /* Q0 */ ltf_mode = ACELP_LTF_MODE[1][1][rf_frame_type]; /* Q0 */ @@ -386,13 +386,13 @@ void enc_prm_rf_fx( n = ACELP_LTP_BITS_SFR[ltp_mode][sfr]; IF( n != 0 ) { - push_next_indice_fx( hBstr, hRF->rf_indx_pitch[fec_offset][sfr], n ); + push_next_indice( hBstr, hRF->rf_indx_pitch[fec_offset][sfr], n ); } /* Adaptive codebook filtering (1 bit) */ IF( EQ_16( ltf_mode, 2 ) ) { - push_next_indice_fx( hBstr, hRF->rf_indx_ltfMode[fec_offset][sfr], 1 ); + push_next_indice( hBstr, hRF->rf_indx_ltfMode[fec_offset][sfr], 1 ); } /*Innovative codebook*/ @@ -403,7 +403,7 @@ void enc_prm_rf_fx( ( EQ_16( rf_frame_type, RF_GENPRED ) && ( sfr == 0 || EQ_16( sfr, 2 ) ) ) ) { - push_next_indice_fx( hBstr, hRF->rf_indx_fcb[fec_offset][sfr], 7 ); + push_next_indice( hBstr, hRF->rf_indx_fcb[fec_offset][sfr], 7 ); } /* Gains (5b, 6b or 7b / subfr) */ @@ -411,11 +411,11 @@ void enc_prm_rf_fx( IF( sfr == 0 || EQ_16( sfr, 2 ) ) { n = ACELP_GAINS_BITS[gains_mode]; - push_next_indice_fx( hBstr, hRF->rf_indx_gain[fec_offset][sfr], n ); + push_next_indice( hBstr, hRF->rf_indx_gain[fec_offset][sfr], n ); } } /* tbe gainFr */ - push_next_indice_fx( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 2 ); + push_next_indice( hBstr, hRF->rf_indx_tbeGainFr[fec_offset], 2 ); } /***************/ @@ -429,15 +429,15 @@ void enc_prm_rf_fx( test(); IF( EQ_16( fec_offset, 2 ) ) { - push_next_indice_fx( hBstr, 0, 2 ); + push_next_indice( hBstr, 0, 2 ); } ELSE IF( EQ_16( fec_offset, 3 ) || EQ_16( fec_offset, 5 ) || EQ_16( fec_offset, 7 ) ) { - push_next_indice_fx( hBstr, ( fec_offset - 1 ) / 2, 2 ); + push_next_indice( hBstr, ( fec_offset - 1 ) / 2, 2 ); } /* write RF frame type last in the bitstream */ - push_next_indice_fx( hBstr, rf_frame_type, 3 ); + push_next_indice( hBstr, rf_frame_type, 3 ); } @@ -533,7 +533,7 @@ void enc_prm_fx( IF( st->tcxonly ) { - push_next_indice_fx( hBstr, core == TCX_10_CORE, 1 ); + push_next_indice( hBstr, core == TCX_10_CORE, 1 ); { index = 3; move16(); @@ -553,7 +553,7 @@ void enc_prm_fx( index = 2; move16(); } - push_next_indice_fx( hBstr, index, 2 ); + push_next_indice( hBstr, index, 2 ); } } ELSE @@ -581,13 +581,13 @@ void enc_prm_fx( { idx = add( idx, 1 ); /* Q0 */ } - push_next_indice_fx( hBstr, idx - start_idx, nBits ); - push_next_indice_fx( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/ + push_next_indice( hBstr, idx - start_idx, nBits ); + push_next_indice( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/ nbits_start = 3; /* Q0 */ } ELSE { - push_next_indice_fx( hBstr, coder_type, 3 ); + push_next_indice( hBstr, coder_type, 3 ); } } ELSE @@ -595,15 +595,15 @@ void enc_prm_fx( IF( EQ_16( st->mdct_sw, MODE1 ) ) { /* 2 bits instead of 3 as TCX is already signaled */ - push_next_indice_fx( hBstr, st->hTcxCfg->coder_type, 2 ); + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); } ELSE { IF( EQ_16( st->mdct_sw_enable, MODE2 ) ) { - push_next_indice_fx( hBstr, 1, 1 ); /* TCX */ - push_next_indice_fx( hBstr, 0, 1 ); /* not HQ_CORE */ - push_next_indice_fx( hBstr, st->hTcxCfg->coder_type, 2 ); + push_next_indice( hBstr, 1, 1 ); /* TCX */ + push_next_indice( hBstr, 0, 1 ); /* not HQ_CORE */ + push_next_indice( hBstr, st->hTcxCfg->coder_type, 2 ); } ELSE { @@ -641,13 +641,13 @@ void enc_prm_fx( { idx = add( idx, 1 ); } - push_next_indice_fx( hBstr, idx - start_idx, nBits ); - push_next_indice_fx( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/ + push_next_indice( hBstr, idx - start_idx, nBits ); + push_next_indice( hBstr, 1, 1 ); /* Indicate to the decoder that the core is TCX*/ nbits_start = 3; } ELSE { - push_next_indice_fx( hBstr, 4 + st->hTcxCfg->coder_type, 3 ); + push_next_indice( hBstr, 4 + st->hTcxCfg->coder_type, 3 ); } } } @@ -667,7 +667,7 @@ void enc_prm_fx( tmp = TCX_20_CORE; move16(); } - push_next_indice_fx( hBstr, tmp, 1 ); + push_next_indice( hBstr, tmp, 1 ); } /* write TCX overlap mode (1 bit: full, 2 bits: half or no overlap) */ @@ -696,7 +696,7 @@ void enc_prm_fx( overlap_code = 0; move16(); } - push_next_indice_fx( hBstr, overlap_code, nbits_tcx ); + push_next_indice( hBstr, overlap_code, nbits_tcx ); } IF( st->hPlcExt->enableGplc ) @@ -719,7 +719,7 @@ void enc_prm_fx( IF( EQ_16( core, ACELP_CORE ) ) { - push_next_indice_fx( hBstr, st->glr_idx[0], G_LPC_RECOVERY_BITS ); + push_next_indice( hBstr, st->glr_idx[0], G_LPC_RECOVERY_BITS ); } } @@ -789,7 +789,7 @@ void enc_prm_fx( IF( n != 0 ) { - push_next_indice_fx( hBstr, st->bpf_gain_param, n ); + push_next_indice( hBstr, st->bpf_gain_param, n ); } /* Mean energy (2 or 3 bits) */ @@ -797,7 +797,7 @@ void enc_prm_fx( IF( n != 0 ) { - push_next_indice_fx( hBstr, prm[j++], n ); + push_next_indice( hBstr, prm[j++], n ); } /* Subframe parameters */ @@ -810,14 +810,14 @@ void enc_prm_fx( IF( n != 0 ) { - push_next_indice_fx( hBstr, prm[j++], n ); + push_next_indice( hBstr, prm[j++], n ); } /* Adaptive codebook filtering (1 bit) */ IF( EQ_16( st->acelp_cfg.ltf_mode, 2 ) ) { - push_next_indice_fx( hBstr, prm[j++], 1 ); + push_next_indice( hBstr, prm[j++], 1 ); } /*Innovative codebook*/ @@ -839,12 +839,12 @@ void enc_prm_fx( FOR( ix = 0; ix < wordcnt; ix++ ) { - push_next_indice_fx( hBstr, prm[j++], 16 ); + push_next_indice( hBstr, prm[j++], 16 ); } IF( bitcnt ) { - push_next_indice_fx( hBstr, prm[j++], bitcnt ); + push_next_indice( hBstr, prm[j++], bitcnt ); } j = add( j_old, 8 ); /* Q0 */ @@ -852,7 +852,7 @@ void enc_prm_fx( /* Gains (5b, 6b or 7b / subfr) */ n = ACELP_GAINS_BITS[st->acelp_cfg.gains_mode[sfr]]; - push_next_indice_fx( hBstr, prm[j++], n ); + push_next_indice( hBstr, prm[j++], n ); } /*end of for(sfr)*/ } /*end of mode[0]==0*/ @@ -866,14 +866,14 @@ void enc_prm_fx( move16(); IF( st->enablePlcWaveadjust ) { - push_next_indice_fx( hBstr, st->Tonal_SideInfo, 1 ); + push_next_indice( hBstr, st->Tonal_SideInfo, 1 ); } /* TCX Gain = 7 bits */ - push_next_indice_fx( hBstr, prm[j++], 7 ); + push_next_indice( hBstr, prm[j++], 7 ); /* TCX Noise Filling = NBITS_NOISE_FILL_LEVEL bits */ - push_next_indice_fx( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); + push_next_indice( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); /* LTP data */ test(); @@ -881,13 +881,13 @@ void enc_prm_fx( { IF( prm[j] ) { - push_next_indice_fx( hBstr, 1, 1 ); - push_next_indice_fx( hBstr, prm[j + 1], 9 ); - push_next_indice_fx( hBstr, prm[j + 2], 2 ); + push_next_indice( hBstr, 1, 1 ); + push_next_indice( hBstr, prm[j + 1], 9 ); + push_next_indice( hBstr, prm[j + 2], 2 ); } ELSE { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } } j = add( j, 3 ); @@ -932,7 +932,7 @@ void enc_prm_fx( test(); IF( st->hTcxCfg->ctx_hm && NE_16( last_core, ACELP_CORE ) ) { - push_next_indice_fx( hBstr, prm[j], 1 ); + push_next_indice( hBstr, prm[j], 1 ); IF( prm[j] ) { @@ -1015,14 +1015,14 @@ void enc_prm_fx( test(); IF( st->enablePlcWaveadjust && k ) { - push_next_indice_fx( hBstr, st->Tonal_SideInfo, 1 ); + push_next_indice( hBstr, st->Tonal_SideInfo, 1 ); } /* TCX Gain = 7 bits */ - push_next_indice_fx( hBstr, prm[j++], 7 ); + push_next_indice( hBstr, prm[j++], 7 ); /* TCX Noise Filling = NBITS_NOISE_FILL_LEVEL bits */ - push_next_indice_fx( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); + push_next_indice( hBstr, prm[j++], NBITS_NOISE_FILL_LEVEL ); /* LTP data */ test(); @@ -1031,13 +1031,13 @@ void enc_prm_fx( { IF( prm[j] ) { - push_next_indice_fx( hBstr, 1, 1 ); - push_next_indice_fx( hBstr, prm[j + 1], 9 ); - push_next_indice_fx( hBstr, prm[j + 2], 2 ); + push_next_indice( hBstr, 1, 1 ); + push_next_indice( hBstr, prm[j + 1], 9 ); + push_next_indice( hBstr, prm[j + 2], 2 ); } ELSE { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } } j = add( j, 3 ); @@ -1079,7 +1079,7 @@ void enc_prm_fx( test(); IF( st->hTcxCfg->ctx_hm && !( last_core == ACELP_CORE && k == 0 ) ) { - push_next_indice_fx( hBstr, prm[j], 1 ); + push_next_indice( hBstr, prm[j], 1 ); IF( prm[j] ) { diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index c86b7e061..396e97c6f 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -419,7 +419,7 @@ ivas_error evs_enc_fx( FOR( i = 0; i < padBits; i++ ) { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } } @@ -678,19 +678,19 @@ static void writeFrameHeader_loc( Encoder_State *st ) IF( EQ_16( st->cng_type, FD_CNG ) ) { /* write SID/CNG type flag */ - push_next_indice_fx( hBstr, 1, 1 ); + push_next_indice( hBstr, 1, 1 ); /* write bandwidth mode */ - push_next_indice_fx( hBstr, st->bwidth, 2 ); + push_next_indice( hBstr, st->bwidth, 2 ); /* write L_frame */ IF( EQ_16( st->L_frame, L_FRAME ) ) { - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); } ELSE { - push_next_indice_fx( hBstr, 1, 1 ); + push_next_indice( hBstr, 1, 1 ); } } } @@ -698,7 +698,7 @@ static void writeFrameHeader_loc( Encoder_State *st ) { IF( st->rf_mode == 0 ) { - push_next_indice_fx( hBstr, sub( st->bwidth, FrameSizeConfig[st->frame_size_index].bandwidth_min ), FrameSizeConfig[st->frame_size_index].bandwidth_bits ); + push_next_indice( hBstr, sub( st->bwidth, FrameSizeConfig[st->frame_size_index].bandwidth_min ), FrameSizeConfig[st->frame_size_index].bandwidth_bits ); } } @@ -706,7 +706,7 @@ static void writeFrameHeader_loc( Encoder_State *st ) test(); IF( FrameSizeConfig[st->frame_size_index].reserved_bits && st->rf_mode == 0 ) { - push_next_indice_fx( hBstr, 0, FrameSizeConfig[st->frame_size_index].reserved_bits ); + push_next_indice( hBstr, 0, FrameSizeConfig[st->frame_size_index].reserved_bits ); } } diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c index 2eb13646c..d182e4a44 100644 --- a/lib_enc/fd_cng_enc_fx.c +++ b/lib_enc/fd_cng_enc_fx.c @@ -1211,9 +1211,9 @@ void FdCng_encodeSID_fx( HANDLE_FD_CNG_ENC stenc, /* i/o: pointer to FD_CNG stru { FOR( i = 0; i < stages_37bits; i++ ) { - push_next_indice_fx( hBstr, indices[i], bits_37bits[i] ); + push_next_indice( hBstr, indices[i], bits_37bits[i] ); } - push_next_indice_fx( hBstr, index, 7 ); + push_next_indice( hBstr, index, 7 ); } ELSE { diff --git a/lib_enc/guided_plc_enc_fx.c b/lib_enc/guided_plc_enc_fx.c index 60a3f8f50..81e50d099 100644 --- a/lib_enc/guided_plc_enc_fx.c +++ b/lib_enc/guided_plc_enc_fx.c @@ -215,7 +215,7 @@ void enc_prm_side_Info_fx( IF( GT_16( hPlc_Ext->nBits, 1 ) ) { - push_next_indice_fx( st->hBstr, 1, 1 ); + push_next_indice( st->hBstr, 1, 1 ); diff_pitch = sub( hPlc_Ext->T0, hPlc_Ext->T0_4th ); test(); @@ -225,11 +225,11 @@ void enc_prm_side_Info_fx( move16(); } - push_next_indice_fx( st->hBstr, add( diff_pitch, search_range ), bits_per_subfr ); + push_next_indice( st->hBstr, add( diff_pitch, search_range ), bits_per_subfr ); } ELSE { - push_next_indice_fx( st->hBstr, 0, 1 ); + push_next_indice( st->hBstr, 0, 1 ); } return; diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index cc4840876..f5c13df57 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -1513,13 +1513,13 @@ Word16 IGFEncWriteConcatenatedBitstream_fx( tmp = shr( hPrivateData->igfBitstreamBits, 3 ); FOR( i = 0; i < tmp; i++ ) { - push_next_indice_fx( hBstr, pBitstream[i], 8 ); + push_next_indice( hBstr, pBitstream[i], 8 ); } bitsLeft = s_and( hPrivateData->igfBitstreamBits, 0x7 ); IF( bitsLeft > 0 ) { - push_next_indice_fx( hBstr, shr( pBitstream[i], sub( 8, bitsLeft ) ), bitsLeft ); + push_next_indice( hBstr, shr( pBitstream[i], sub( 8, bitsLeft ) ), bitsLeft ); } return hInstance->infoTotalBitsWritten; diff --git a/lib_enc/igf_scf_enc_fx.c b/lib_enc/igf_scf_enc_fx.c index 8659d53a1..ed52349dc 100644 --- a/lib_enc/igf_scf_enc_fx.c +++ b/lib_enc/igf_scf_enc_fx.c @@ -358,7 +358,7 @@ Word16 IGFSCFEncoderEncode_fx( { FOR( i = 0; i < hPublicData->ptrBitIndex; ++i ) { - push_next_indice_fx( hBstr, ptr[i], 1 ); + push_next_indice( hBstr, ptr[i], 1 ); } } diff --git a/lib_enc/lsf_msvq_ma_enc_fx.c b/lib_enc/lsf_msvq_ma_enc_fx.c index aa2255c68..8f6a21d03 100644 --- a/lib_enc/lsf_msvq_ma_enc_fx.c +++ b/lib_enc/lsf_msvq_ma_enc_fx.c @@ -834,7 +834,7 @@ Word16 enc_lsf_tcxlpc_fx( move16(); FOR( i = 0; i < TCXLPC_NUMSTAGES; ++i ) { - push_next_indice_fx( hBstr, **indices, lsf_numbits[i] ); + push_next_indice( hBstr, **indices, lsf_numbits[i] ); ++*indices; } @@ -843,7 +843,7 @@ Word16 enc_lsf_tcxlpc_fx( NumBits = add( NumBits, TCXLPC_IND_NUMBITS ); FOR( i = 0; i < TCXLPC_IND_NUMSTAGES; ++i ) { - push_next_indice_fx( hBstr, **indices, lsf_ind_numbits[i] ); + push_next_indice( hBstr, **indices, lsf_ind_numbits[i] ); ++*indices; } } @@ -909,7 +909,7 @@ Word16 lsf_msvq_ma_encprm_fx( FOR( i = 0; i < no_indices; i++ ) { - push_next_indice_fx( hBstr, *param_lpc, bits_param_lpc[i] ); + push_next_indice( hBstr, *param_lpc, bits_param_lpc[i] ); param_lpc++; nbits_lpc = add( nbits_lpc, bits_param_lpc[i] ); } @@ -919,7 +919,7 @@ Word16 lsf_msvq_ma_encprm_fx( IF( ( core == ACELP_CORE ) && acelp_midLpc ) { - push_next_indice_fx( hBstr, *param_lpc, bits_midlpc ); + push_next_indice( hBstr, *param_lpc, bits_midlpc ); nbits_lpc = add( nbits_lpc, bits_midlpc ); } } @@ -981,7 +981,7 @@ Word16 lsf_bctcvq_encprm_fx( FOR( i = 0; i < no_indices; i++ ) { - push_next_indice_fx( hBstr, *param_lpc, bits_param_lpc[i] ); + push_next_indice( hBstr, *param_lpc, bits_param_lpc[i] ); param_lpc++; nbits_lpc = add( nbits_lpc, bits_param_lpc[i] ); } diff --git a/lib_enc/qlpc_avq_fx.c b/lib_enc/qlpc_avq_fx.c index 13e0a3cf7..288612e43 100644 --- a/lib_enc/qlpc_avq_fx.c +++ b/lib_enc/qlpc_avq_fx.c @@ -143,12 +143,12 @@ static Word16 unary_code( FOR( ; ind > 0; ind-- ) { - push_next_indice_fx( hBstr, 1, 1 ); + push_next_indice( hBstr, 1, 1 ); nb_bits = add( nb_bits, 1 ); // Q0 } /* Stop bit */ - push_next_indice_fx( hBstr, 0, 1 ); + push_next_indice( hBstr, 0, 1 ); return ( nb_bits ); } @@ -195,7 +195,7 @@ static Word16 unpack4bits( IF( nbits == 0 ) { - push_next_indice_fx( hBstr, 0, 0 ); + push_next_indice( hBstr, 0, 0 ); i = 1; move16(); } @@ -206,10 +206,10 @@ static Word16 unpack4bits( FOR( ; nbits > 4; nbits -= 4 ) { - push_next_indice_fx( hBstr, prm[i], 4 ); + push_next_indice( hBstr, prm[i], 4 ); i = add( i, 1 ); } - push_next_indice_fx( hBstr, prm[i], nbits ); + push_next_indice( hBstr, prm[i], nbits ); i = add( i, 1 ); } @@ -330,7 +330,7 @@ Word16 encode_lpc_avq_fx( { nb = 1; move16(); - push_next_indice_fx( hBstr, q_type, nb ); + push_next_indice( hBstr, q_type, nb ); } nb_bits = add( nb_bits, nb ); // Q0 @@ -342,7 +342,7 @@ Word16 encode_lpc_avq_fx( IF( ( ( q_type == 0 ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) || ( ( q_type == 0 ) && ( GE_16( st1, 0 ) ) && EQ_16( element_mode, IVAS_CPE_MDCT ) ) ) { /* Absolute quantizer with 1st stage stochastic codebook */ - push_next_indice_fx( hBstr, st1, bits_for_abs_quant ); + push_next_indice( hBstr, st1, bits_for_abs_quant ); nb_bits = add( nb_bits, bits_for_abs_quant ); // Q0 } @@ -350,7 +350,7 @@ Word16 encode_lpc_avq_fx( test(); IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && EQ_16( stereo_mode, 3 ) && st1 < 0 ) { - push_next_indice_fx( hBstr, add( st1, 2 ), 1 ); + push_next_indice( hBstr, add( st1, 2 ), 1 ); nb_bits = add( nb_bits, 1 ); // Q0 } @@ -368,7 +368,7 @@ Word16 encode_lpc_avq_fx( move16(); i = 3; } - push_next_indice_fx( hBstr, i, 2 ); + push_next_indice( hBstr, i, 2 ); i = sub( qn2, 2 ); @@ -377,7 +377,7 @@ Word16 encode_lpc_avq_fx( move16(); i = 3; } - push_next_indice_fx( hBstr, i, 2 ); + push_next_indice( hBstr, i, 2 ); /* Unary code for abs and rel LPC0/LPC2 */ /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */ diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 1a14e7acb..316a5b549 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7579,10 +7579,10 @@ void tbe_write_bitstream_fx( IF( ( st_fx->rf_mode || EQ_32( st_fx->total_brate, ACELP_9k60 ) ) && ( EQ_16( st_fx->bwidth, WB ) ) ) { /* WB LSF */ - push_next_indice_fx( hBstr, hBWE_TD->lsf_WB, NUM_BITS_LBR_WB_LSF ); + push_next_indice( hBstr, hBWE_TD->lsf_WB, NUM_BITS_LBR_WB_LSF ); /* WB frame */ - push_next_indice_fx( hBstr, hBWE_TD->gFrame_WB, NUM_BITS_SHB_FrameGain_LBR_WB ); + push_next_indice( hBstr, hBWE_TD->gFrame_WB, NUM_BITS_SHB_FrameGain_LBR_WB ); } ELSE IF( ( GE_32( st_fx->total_brate, ACELP_9k60 ) ) && ( LE_32( st_fx->total_brate, ACELP_32k ) ) && ( ( EQ_16( st_fx->bwidth, SWB ) ) || ( EQ_16( st_fx->bwidth, FB ) ) ) ) @@ -7592,53 +7592,53 @@ void tbe_write_bitstream_fx( test(); IF( ( EQ_16( st_fx->rf_mode, 1 ) ) || EQ_32( st_fx->total_brate, ACELP_9k60 ) ) { - push_next_indice_fx( hBstr, hBWE_TD->lsf_idx[0], 8 ); + push_next_indice( hBstr, hBWE_TD->lsf_idx[0], 8 ); } ELSE { FOR( i = 0; i < NUM_Q_LSF; i++ ) { - push_next_indice_fx( hBstr, hBWE_TD->lsf_idx[i], lsf_q_num_bits[i] ); + push_next_indice( hBstr, hBWE_TD->lsf_idx[i], lsf_q_num_bits[i] ); } /* LSF mirror points */ - push_next_indice_fx( hBstr, hBWE_TD->m_idx, MIRROR_POINT_BITS ); + push_next_indice( hBstr, hBWE_TD->m_idx, MIRROR_POINT_BITS ); /* LSF grid points */ - push_next_indice_fx( hBstr, hBWE_TD->grid_idx, NUM_LSF_GRID_BITS ); + push_next_indice( hBstr, hBWE_TD->grid_idx, NUM_LSF_GRID_BITS ); } /* Gain shape */ - push_next_indice_fx( hBstr, hBWE_TD->idxSubGains, NUM_BITS_SHB_SUBGAINS ); + push_next_indice( hBstr, hBWE_TD->idxSubGains, NUM_BITS_SHB_SUBGAINS ); /* frame gain */ - push_next_indice_fx( hBstr, hBWE_TD->idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); + push_next_indice( hBstr, hBWE_TD->idxFrameGain, NUM_BITS_SHB_FRAMEGAIN ); IF( GE_32( st_fx->total_brate, ACELP_24k40 ) ) { /* sub frame energy*/ - push_next_indice_fx( hBstr, hBWE_TD->idx_shb_fr_gain, NUM_BITS_SHB_ENER_SF ); + push_next_indice( hBstr, hBWE_TD->idx_shb_fr_gain, NUM_BITS_SHB_ENER_SF ); /* gain shapes residual */ FOR( i = 0; i < NB_SUBFR16k; i++ ) { - push_next_indice_fx( hBstr, hBWE_TD->idx_res_gs[i], NUM_BITS_SHB_RES_GS ); + push_next_indice( hBstr, hBWE_TD->idx_res_gs[i], NUM_BITS_SHB_RES_GS ); } /* voicing factor */ - push_next_indice_fx( hBstr, hBWE_TD->idx_mixFac, NUM_BITS_SHB_VF ); + push_next_indice( hBstr, hBWE_TD->idx_mixFac, NUM_BITS_SHB_VF ); } IF( EQ_16( st_fx->tec_tfa, 1 ) ) { - push_next_indice_fx( hBstr, st_fx->tec_flag, BITS_TEC ); - push_next_indice_fx( hBstr, st_fx->tfa_flag, BITS_TFA ); + push_next_indice( hBstr, st_fx->tec_flag, BITS_TEC ); + push_next_indice( hBstr, st_fx->tfa_flag, BITS_TFA ); } } IF( EQ_16( st_fx->bwidth, FB ) ) { - push_next_indice_fx( hBstr, hBWE_TD->idxGain, 4 ); + push_next_indice( hBstr, hBWE_TD->idxGain, 4 ); } } -- GitLab From 469705796bbf1af9839f5b0042e670c2dbd6eaff Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Tue, 25 Mar 2025 15:03:51 -0400 Subject: [PATCH 0091/1310] replace other EVS bitstream related stuff --- lib_com/bitstream_fx.c | 9 ++++++--- lib_enc/ACcontextMapping_enc_fx.c | 6 +++--- lib_enc/enc_prm_fx.c | 2 +- lib_enc/igf_enc.c | 4 ++-- lib_enc/igf_enc_fx.c | 4 ++-- lib_enc/lib_enc.c | 2 ++ lib_enc/tcx_utils_enc_fx.c | 26 +++++++++++++++++++++----- 7 files changed, 37 insertions(+), 16 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 8cb968bf1..d3aab2616 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -314,11 +314,10 @@ void push_next_indice_fx( return; } -#endif /*-------------------------------------------------------------------* - * push_next_bits_fx() + * push_next_bits() * Push a bit buffer into the buffer at the next position *-------------------------------------------------------------------*/ @@ -368,6 +367,7 @@ void push_next_bits_fx( hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); move16(); } +#endif /*-------------------------------------------------------------------* * get_next_indice_fx( ) @@ -565,6 +565,7 @@ void reset_indices_dec_fx( * * Write the buffer of indices to a file *-------------------------------------------------------------------*/ +#if 0 void write_indices_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ @@ -663,12 +664,13 @@ void write_indices_fx( return; } +#endif /*-------------------------------------------------------------------* * write_indices_buf_fx() * * Write the buffer of indices to a file *-------------------------------------------------------------------*/ - +#if 0 void write_indices_buf_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ @@ -772,6 +774,7 @@ void write_indices_buf_fx( return; } +#endif /*-------------------------------------------------------------------* * indices_to_serial() * diff --git a/lib_enc/ACcontextMapping_enc_fx.c b/lib_enc/ACcontextMapping_enc_fx.c index 4e02b1f11..43bd30fd4 100644 --- a/lib_enc/ACcontextMapping_enc_fx.c +++ b/lib_enc/ACcontextMapping_enc_fx.c @@ -346,10 +346,10 @@ void ACcontextMapping_encode2_no_mem_s17_LC_fx( push_next_indice( hBstr, value, nbbits_ntuples ); /* Push arithmetic coded bits */ - push_next_bits_fx( hBstr, &ptr[nbbits_ntuples], sub( bp, nbbits_ntuples ) ); + push_next_bits( hBstr, (UWord16 *) &ptr[nbbits_ntuples], sub( bp, nbbits_ntuples ) ); /* Push sign bits */ - push_next_bits_fx( hBstr, signs, nbbits_signs ); + push_next_bits( hBstr, (UWord16 *) signs, nbbits_signs ); bp = add( bp, nbbits_signs ); /* Q0 */ /*write residual Quantization bits*/ @@ -372,7 +372,7 @@ void ACcontextMapping_encode2_no_mem_s17_LC_fx( assert( bp + k <= nbbits ); /* Push the rest of the buffer */ - push_next_bits_fx( hBstr, &ptr[bp], sub( nbbits, bp ) ); + push_next_bits( hBstr, (UWord16 *) &ptr[bp], sub( nbbits, bp ) ); return /*(bp+nbbits_lsbs)*/; /*return only for debug plot*/ } diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c index 6c052e596..1d619e6c5 100644 --- a/lib_enc/enc_prm_fx.c +++ b/lib_enc/enc_prm_fx.c @@ -965,7 +965,7 @@ void enc_prm_fx( IF( hTcxEnc->tcx_lpc_shaped_ari != 0 ) { - push_next_bits_fx( hBstr, &prm[++j], nbits_tcx ); + push_next_bits( hBstr, ( UWord16 * ) &prm[++j], nbits_tcx ); j = add( j, nbits_tcx ); /* Q0 */ } ELSE diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 2680bd9f6..d0c9fa329 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -2429,7 +2429,7 @@ void IGFEncSetMode_ivas_fx( * * IGF bitstream concatenation for TCX10 modes *-------------------------------------------------------------------*/ - +#if 0 /* Float code */ void IGFEncConcatenateBitstream( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ const Word16 bsBits, /* i : number of IGF bits written to list of indices */ @@ -2487,7 +2487,7 @@ move16(); return; } - +#endif /*-------------------------------------------------------------------* * IGFEncResetTCX10BitCounter_ivas_fx() diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index f5c13df57..a8a64422f 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -1449,7 +1449,7 @@ hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written ); return; } - +#if 0 /* old bitstream */ /**********************************************************************/ /* IGF bitsream concatenation for TCX10 modes **************************************************************************/ @@ -1475,7 +1475,7 @@ void IGFEncConcatenateBitstream_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /** move16(); return; } - +#endif /**********************************************************************/ /* IGF reset bitsream bit counter for TCX10 modes **************************************************************************/ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 877fc2045..b17ba61df 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1892,6 +1892,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } /* write indices into bitstream buffer */ +#if 0 IF( hEncoderConfig->element_mode_init == EVS_MONO ) { test(); @@ -1905,6 +1906,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } } ELSE +#endif { write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits ); } diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 7d268b92a..fd6293124 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -3650,7 +3650,7 @@ Word16 tcx_res_Q_spec_ivas_fx( return bits; } - +#if 1 //TV void ProcessIGF_fx( IGF_ENC_INSTANCE_HANDLE const hInstance, /**< in: instance handle of IGF Encoder */ Encoder_State *st, /**< in: Encoder state */ @@ -3667,8 +3667,9 @@ void ProcessIGF_fx( Word16 igfGridIdx; Word16 isIndepFlag; Word16 bsBits; - Word16 bsStart; + Word16 bsStart, pBsStart; BSTR_ENC_HANDLE hBstr = st->hBstr; + IGF_ENC_INSTANCE_HANDLE hIGFEnc = st->hIGFEnc; isIndepFlag = 1; @@ -3721,6 +3722,8 @@ void ProcessIGF_fx( Word16 Q_A; Word16 predictionGain = 0; Word16 *flatteningTrigger = &( st->hIGFEnc->flatteningTrigger ); + + move32(); move16(); move16(); @@ -3750,6 +3753,7 @@ void ProcessIGF_fx( { IGFEncWriteBitstream_fx( hInstance, NULL, &hInstance->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); } +#if 0 ELSE { IGFEncWriteBitstream_fx( hInstance, st->hBstr, &hInstance->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); @@ -3760,8 +3764,20 @@ void ProcessIGF_fx( { IGFEncConcatenateBitstream_fx( hInstance, bsBits, &hBstr->next_ind_fx, &hBstr->nb_bits_tot, hBstr->ind_list ); } -} +#else + ELSE + { + pBsStart = hBstr->nb_ind_tot; + move16(); + + IGFEncWriteBitstream_ivas_fx( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); + bsBits = sub( hBstr->nb_ind_tot, pBsStart ); + IGFEncConcatenateBitstream_ivas_fx( hIGFEnc, bsBits, hBstr ); + } +#endif +} + #endif void attenuateNbSpectrum_fx( Word16 L_frame, Word32 *spectrum ) { Word16 i, length, att; @@ -3877,7 +3893,7 @@ void ProcessIGF_ivas_fx( IGFEncWriteBitstream_ivas_fx( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); bsBits = sub( hBstr->nb_ind_tot, pBsStart ); - IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr ); + IGFEncConcatenateBitstream_ivas_fx( hIGFEnc, bsBits, hBstr ); } return; @@ -3981,7 +3997,7 @@ void ProcessStereoIGF_fx( IGFEncWriteBitstream_ivas_fx( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); bsBits = sub( hBstr->nb_ind_tot, pBsStart ); - IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); + IGFEncConcatenateBitstream_ivas_fx( hIGFEnc[ch], bsBits, hBstr ); } } return; -- GitLab From 9a216fbc8ecfdb3dc23206dbaf79e82cfa70819c Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Tue, 25 Mar 2025 15:06:06 -0400 Subject: [PATCH 0092/1310] fix clang --- lib_com/bitstream_fx.c | 2 +- lib_enc/enc_prm_fx.c | 4 ++-- lib_enc/tcx_utils_enc_fx.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index d3aab2616..f0e564a8a 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -664,7 +664,7 @@ void write_indices_fx( return; } -#endif +#endif /*-------------------------------------------------------------------* * write_indices_buf_fx() * diff --git a/lib_enc/enc_prm_fx.c b/lib_enc/enc_prm_fx.c index 1d619e6c5..6d6a2d575 100644 --- a/lib_enc/enc_prm_fx.c +++ b/lib_enc/enc_prm_fx.c @@ -583,7 +583,7 @@ void enc_prm_fx( } push_next_indice( hBstr, idx - start_idx, nBits ); push_next_indice( hBstr, 0, 1 ); /* Indicate to the decoder that the core is ACELP*/ - nbits_start = 3; /* Q0 */ + nbits_start = 3; /* Q0 */ } ELSE { @@ -965,7 +965,7 @@ void enc_prm_fx( IF( hTcxEnc->tcx_lpc_shaped_ari != 0 ) { - push_next_bits( hBstr, ( UWord16 * ) &prm[++j], nbits_tcx ); + push_next_bits( hBstr, (UWord16 *) &prm[++j], nbits_tcx ); j = add( j, nbits_tcx ); /* Q0 */ } ELSE diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index fd6293124..06de6a2fa 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -3650,7 +3650,7 @@ Word16 tcx_res_Q_spec_ivas_fx( return bits; } -#if 1 //TV +#if 1 // TV void ProcessIGF_fx( IGF_ENC_INSTANCE_HANDLE const hInstance, /**< in: instance handle of IGF Encoder */ Encoder_State *st, /**< in: Encoder state */ @@ -3777,7 +3777,7 @@ void ProcessIGF_fx( } #endif } - #endif +#endif void attenuateNbSpectrum_fx( Word16 L_frame, Word32 *spectrum ) { Word16 i, length, att; -- GitLab From 112e0cd6b0455ab87b74ddc78ada386a7d5b8f2d Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Tue, 25 Mar 2025 15:13:41 -0400 Subject: [PATCH 0093/1310] fix clang --- lib_enc/tcx_utils_enc_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 06de6a2fa..ec1db2cf3 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -3667,7 +3667,11 @@ void ProcessIGF_fx( Word16 igfGridIdx; Word16 isIndepFlag; Word16 bsBits; +#if 0 Word16 bsStart, pBsStart; +#else + Word16 pBsStart; +#endif BSTR_ENC_HANDLE hBstr = st->hBstr; IGF_ENC_INSTANCE_HANDLE hIGFEnc = st->hIGFEnc; @@ -3744,8 +3748,9 @@ void ProcessIGF_fx( } } +#if 0 bsStart = hBstr->next_ind_fx; - +#endif move16(); hInstance->infoTotalBitsPerFrameWritten = 0; move16(); -- GitLab From 95ea2c5fb0bd8883ade9207dc5d36262b91f8f2f Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 26 Mar 2025 09:06:17 -0400 Subject: [PATCH 0094/1310] work on encoder config duplication --- lib_enc/ivas_init_enc_fx.c | 46 ++++++++++++++++++-------------------- lib_enc/lib_enc.c | 10 ++++++--- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 57858b03e..19996e2e4 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -463,7 +463,7 @@ void ivas_initialize_handles_enc_fx( * * Initialize IVAS encoder state structure *-------------------------------------------------------------------*/ - +#if 0 ivas_error ivas_init_encoder( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -1073,6 +1073,7 @@ ivas_error ivas_init_encoder( } return error; } +#endif ivas_error ivas_init_encoder_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -1100,10 +1101,10 @@ ivas_error ivas_init_encoder_fx( hEncoderConfig->last_ivas_total_brate = ivas_total_brate; /* Q0 */ move32(); - IF( NE_16( ivas_format, MONO_FORMAT ) ) + if ( NE_16( ivas_format, MONO_FORMAT ) ) { /* In IVAS, ensure that minimum coded bandwidth is WB */ - hEncoderConfig->max_bwidth = extract_l( L_max( hEncoderConfig->max_bwidth, WB ) ); /* Q0 */ + hEncoderConfig->max_bwidth = s_max( hEncoderConfig->max_bwidth, WB ); /* Q0 */ move16(); } st_ivas->ism_mode = ISM_MODE_NONE; @@ -1142,7 +1143,10 @@ ivas_error ivas_init_encoder_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point input audio buffer!\n" ) ); } + set32_fx( st_ivas->p_data_fx[n], 0, extract_l( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); } + st_ivas->q_data_fx = Q11; + move16(); FOR( ; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) { st_ivas->p_data_fx[n] = NULL; @@ -1196,7 +1200,7 @@ ivas_error ivas_init_encoder_fx( /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles *-----------------------------------------------------------------*/ - test(); + IF( EQ_32( ivas_format, MONO_FORMAT ) ) { st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ @@ -1209,19 +1213,9 @@ ivas_error ivas_init_encoder_fx( move16(); test(); - IF( st_ivas->hEncoderConfig->element_mode_init == EVS_MONO ) + IF( NE_32( ( error = create_evs_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) { - IF( NE_32( ( error = create_evs_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } + return error; } /* prepare stereo downmix for EVS */ @@ -1342,7 +1336,7 @@ ivas_error ivas_init_encoder_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { - IF( hEncoderConfig->Opt_DTX_ON ) + if ( hEncoderConfig->Opt_DTX_ON ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 1; move16(); @@ -1350,7 +1344,7 @@ ivas_error ivas_init_encoder_fx( } } - IF( st_ivas->nCPE > 1 ) + IF( GT_16( st_ivas->nCPE, 1 ) ) { IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) { @@ -1358,7 +1352,7 @@ ivas_error ivas_init_encoder_fx( } } } - ELSE IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) + ELSE IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { Word32 ism_total_brate; Word16 k; @@ -1428,12 +1422,12 @@ ivas_error ivas_init_encoder_fx( ELSE IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { st_ivas->ism_mode = ISM_MODE_NONE; - move32(); + move16(); IF( GE_32( ivas_total_brate, IVAS_256k ) ) { st_ivas->ism_mode = ISM_SBA_MODE_DISC; - move32(); + move16(); } IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) @@ -1523,7 +1517,7 @@ ivas_error ivas_init_encoder_fx( return error; } - IF( NE_32( st_ivas->mc_mode, MC_MODE_MCT ) ) + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) { st_ivas->nSCE = 0; move16(); @@ -1596,7 +1590,9 @@ ivas_error ivas_init_encoder_fx( FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nCPE + st_ivas->nSCE ) ) ) != IVAS_ERR_OK ) + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nCPE, st_ivas->nSCE ), &res_dec, &res_frac, 0 ); + IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, res_dec ) ) != IVAS_ERR_OK ) { return error; } @@ -1658,7 +1654,9 @@ ivas_error ivas_init_encoder_fx( *-----------------------------------------------------------------*/ /* set number of input channels used for analysis/coding */ - n = getNumChanAnalysis_fx( st_ivas ); + n = getNumChanAnalysis_fx( st_ivas ); /* Q0 */ + move16(); + IF( n > 0 ) { IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index b17ba61df..52734b4bd 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -70,7 +70,7 @@ struct IVAS_ENC * Local functions *---------------------------------------------------------------------*/ -static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, const Word32 initBitrate, const IVAS_ENC_BANDWIDTH initBandwidth, const IVAS_ENC_DTX_CONFIG dtxConfig, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); +//static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, const Word32 initBitrate, const IVAS_ENC_BANDWIDTH initBandwidth, const IVAS_ENC_DTX_CONFIG dtxConfig, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); static ivas_error setBandwidth_fx( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_BANDWIDTH maxBandwidth ); static ivas_error setChannelAwareConfig_fx( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); static ivas_error sanitizeBandwidth_fx( const IVAS_ENC_HANDLE hIvasEnc ); @@ -609,6 +609,7 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics( return error; } +#if 0 ivas_error IVAS_ENC_ConfigureForAmbisonics_fx( IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ const Word32 inputFs, /* i : input sampling frequency */ @@ -649,11 +650,12 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics_fx( hIvasEnc->maxBandwidthUser = max_bwidth_user; - error = configureEncoder_fx( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); + error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); return error; } +#endif /*---------------------------------------------------------------------* * IVAS_ENC_ConfigureForSBAObjects() * @@ -1188,7 +1190,7 @@ static ivas_error configureEncoder( * Finalize initialization *-----------------------------------------------------------------*/ - IF( ( error = ivas_init_encoder( st_ivas ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_init_encoder_fx( st_ivas ) ) != IVAS_ERR_OK ) { return error; } @@ -1211,6 +1213,7 @@ static ivas_error configureEncoder( return error; } +#if 0 static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, @@ -1543,6 +1546,7 @@ static ivas_error configureEncoder_fx( return error; } +#endif /*---------------------------------------------------------------------* * IVAS_ENC_GetDelay() * -- GitLab From e8635700ca462990bef565bfc8529611f790732c Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 26 Mar 2025 13:46:47 -0400 Subject: [PATCH 0095/1310] Addition of compiler switch, code compiles and run, but not BE --- lib_com/bitstream_fx.c | 7 +++--- lib_enc/igf_enc.c | 2 +- lib_enc/igf_enc_fx.c | 2 +- lib_enc/init_enc_fx.c | 48 ++++++++++++++++++++++++++++---------- lib_enc/ivas_init_enc_fx.c | 7 +++--- lib_enc/ivas_sce_enc_fx.c | 27 +++++++++++++++++---- lib_enc/lib_enc.c | 6 ++--- lib_enc/tcx_utils_enc_fx.c | 6 ++--- 8 files changed, 74 insertions(+), 31 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index f0e564a8a..f29dc6aee 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -244,7 +244,7 @@ Word16 rate2EVSmode( * * Push a new indice into the buffer *-------------------------------------------------------------------*/ -#if 0 +#ifndef HARM_PUSH_BIT void push_indice_fx( BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ Word16 id, /* i : ID of the indice */ @@ -565,8 +565,7 @@ void reset_indices_dec_fx( * * Write the buffer of indices to a file *-------------------------------------------------------------------*/ -#if 0 - +#ifndef HARM_PUSH_BIT void write_indices_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ @@ -670,7 +669,7 @@ void write_indices_fx( * * Write the buffer of indices to a file *-------------------------------------------------------------------*/ -#if 0 +#ifndef HARM_PUSH_BIT void write_indices_buf_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index d0c9fa329..c8e8974c2 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -2429,7 +2429,7 @@ void IGFEncSetMode_ivas_fx( * * IGF bitstream concatenation for TCX10 modes *-------------------------------------------------------------------*/ -#if 0 /* Float code */ +#ifndef HARM_PUSH_BIT /* Float code */ void IGFEncConcatenateBitstream( const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ const Word16 bsBits, /* i : number of IGF bits written to list of indices */ diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index a8a64422f..96f8d0202 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -1449,7 +1449,7 @@ hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written ); return; } -#if 0 /* old bitstream */ +#ifndef HARM_PUSH_BIT /* old bitstream */ /**********************************************************************/ /* IGF bitsream concatenation for TCX10 modes **************************************************************************/ diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index ea944dd75..4913e410d 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -20,6 +20,7 @@ * * Initialization of state variables *-----------------------------------------------------------------------*/ +#if 1 ivas_error init_encoder_fx( Encoder_State *st_fx /* i/o: Encoder static variables structure */ ) @@ -946,6 +947,7 @@ ivas_error init_encoder_fx( move32(); return error; } +#endif /*-----------------------------------------------------------------------* * LPDmem_enc_init_fx() * @@ -1498,14 +1500,7 @@ ivas_error init_encoder_ivas_fx( IF( st->element_mode == EVS_MONO ) { /* This is done to as in EVS T_CldfbVadState structure is present in Encoder State */ - /* - if ( ( st->hVAD_CLDFB = (VAD_CLDFB_HANDLE) malloc( sizeof( T_CldfbVadState ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB VAD\n" ) ); - } - */ st->hVAD_CLDFB = &st->vad_st; - vad_init_fx( st->hVAD_CLDFB ); } ELSE @@ -1670,9 +1665,23 @@ ivas_error init_encoder_ivas_fx( test(); IF( ( NE_16( st->element_mode, IVAS_CPE_MDCT ) && idchan == 0 ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->Opt_DTX_ON ) ) { - IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) { - return error; + /* open analysis for input SR */ + st->input_frame_fx = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); + + if ( ( error = openCldfb( &st->cldfbAnaEnc, CLDFB_ANALYSIS, CLDFB_getNumChannels( st->input_Fs ), st->input_frame_fx ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE + { + + IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } } } ELSE @@ -1784,11 +1793,20 @@ ivas_error init_encoder_ivas_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD BWE\n" ) ); } - IF( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + IF( st->element_mode == EVS_MONO ) { - return error; + if ( ( error = openCldfb( &st->cldfbSynTd, CLDFB_SYNTHESIS, CLDFB_getNumChannels( 16000 ), L_FRAME16k ) ) != IVAS_ERR_OK ) + { + return error; + } + } + ELSE + { + IF( ( error = openCldfb_ivas_fx( &st->cldfbSynTd, CLDFB_SYNTHESIS, 16000, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) + { + return error; + } } - InitSWBencBuffer_ivas_fx( st ); ResetSHBbuffer_Enc_fx( st ); } @@ -2144,7 +2162,13 @@ ivas_error init_encoder_ivas_fx( } ELSE { +#ifndef HARM_ENC_INIT InitTransientDetection_ivas_fx( frame_length, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); +#else + InitTransientDetection_fx( extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ), + NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), + &st->transientDetection ); +#endif } /*-----------------------------------------------------------------* diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 19996e2e4..7c72d4780 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -269,7 +269,7 @@ Word16 getNumChanAnalysis_fx( return n; } - +#ifndef HARM_ENC_INIT /*-------------------------------------------------------------------* * copy_encoder_config_ivas_fx() * @@ -321,6 +321,7 @@ void copy_encoder_config_ivas_fx( return; } +#endif /*-------------------------------------------------------------------* * copy_encoder_config_fx() * @@ -463,7 +464,7 @@ void ivas_initialize_handles_enc_fx( * * Initialize IVAS encoder state structure *-------------------------------------------------------------------*/ -#if 0 +#ifndef HARM_ENC_INIT ivas_error ivas_init_encoder( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) @@ -1213,7 +1214,7 @@ ivas_error ivas_init_encoder_fx( move16(); test(); - IF( NE_32( ( error = create_evs_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c index f1631ba4f..3f80cce2b 100644 --- a/lib_enc/ivas_sce_enc_fx.c +++ b/lib_enc/ivas_sce_enc_fx.c @@ -466,12 +466,31 @@ ivas_error create_sce_enc_fx( st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; move32(); move32(); - + st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; + st->input_Fs = st_ivas->hEncoderConfig->input_Fs; + st->input_frame_fx = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); +#if 0 + IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) + //IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } +#else IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) + //IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) { return error; } - hSCE->hCoreCoder[0] = st; + //IF( NE_32( ( error = init_encoder_fx( st) ), IVAS_ERR_OK ) ) + //{ + // return error; + //} + + //st->hBstr->ind_list = ind_list; + // st_fx->hBstr->ind_list_fx = st->hBstr->ind_list; + //reset_indices_enc_fx( st->hBstr, MAX_NUM_INDICES ); +#endif + hSCE->hCoreCoder[0] = st; st_ivas->hSCE[sce_id] = hSCE; @@ -483,7 +502,7 @@ ivas_error create_sce_enc_fx( * * Create, allocate and initialize EVS encoder SCE handle *-------------------------------------------------------------------------*/ - +#if 0 ivas_error create_evs_sce_enc_fx( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const Word16 sce_id, /* i : SCE # identifier */ @@ -614,7 +633,7 @@ ivas_error create_evs_sce_enc_fx( return error; } - +#endif /*------------------------------------------------------------------------- * destroy_sce_enc_fx() * diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 52734b4bd..fdf410df5 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -609,7 +609,7 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics( return error; } -#if 0 +#ifndef HARM_ENC_INIT ivas_error IVAS_ENC_ConfigureForAmbisonics_fx( IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ const Word32 inputFs, /* i : input sampling frequency */ @@ -1213,7 +1213,7 @@ static ivas_error configureEncoder( return error; } -#if 0 +#ifndef HARM_ENC_INIT static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, @@ -1896,7 +1896,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } /* write indices into bitstream buffer */ -#if 0 +#ifndef HARM_PUSH_BIT IF( hEncoderConfig->element_mode_init == EVS_MONO ) { test(); diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index ec1db2cf3..5bea901bb 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -3667,7 +3667,7 @@ void ProcessIGF_fx( Word16 igfGridIdx; Word16 isIndepFlag; Word16 bsBits; -#if 0 +#ifndef HARM_PUSH_BIT Word16 bsStart, pBsStart; #else Word16 pBsStart; @@ -3748,7 +3748,7 @@ void ProcessIGF_fx( } } -#if 0 +#ifndef HARM_PUSH_BIT bsStart = hBstr->next_ind_fx; #endif move16(); @@ -3758,7 +3758,7 @@ void ProcessIGF_fx( { IGFEncWriteBitstream_fx( hInstance, NULL, &hInstance->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); } -#if 0 +#ifndef HARM_PUSH_BIT ELSE { IGFEncWriteBitstream_fx( hInstance, st->hBstr, &hInstance->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); -- GitLab From a5992c0d0657a48d492bd8258ccd44a56fb15add Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 26 Mar 2025 14:08:20 -0400 Subject: [PATCH 0096/1310] fix BE issue, still crashed mid-file --- lib_enc/ivas_init_enc_fx.c | 10 ++++++++-- lib_enc/ivas_sce_enc_fx.c | 41 +++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 7c72d4780..04b99f039 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -1212,13 +1212,19 @@ ivas_error ivas_init_encoder_fx( move16(); sce_id = 0; move16(); - +#ifndef HARM_SCE_INIT + test(); + IF( NE_32( ( error = create_evs_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } +#else test(); IF( NE_32( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) { return error; } - +#endif /* prepare stereo downmix for EVS */ IF( EQ_16( hEncoderConfig->stereo_dmx_evs, 1 ) ) { diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c index 3f80cce2b..2e1aed092 100644 --- a/lib_enc/ivas_sce_enc_fx.c +++ b/lib_enc/ivas_sce_enc_fx.c @@ -469,27 +469,11 @@ ivas_error create_sce_enc_fx( st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; st->input_Fs = st_ivas->hEncoderConfig->input_Fs; st->input_frame_fx = extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ); -#if 0 - IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) - //IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } -#else + IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) - //IF( NE_32( ( error = init_encoder_ivas_fx( st, st_ivas, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode, hSCE->element_brate ) ), IVAS_ERR_OK ) ) { return error; } - //IF( NE_32( ( error = init_encoder_fx( st) ), IVAS_ERR_OK ) ) - //{ - // return error; - //} - - //st->hBstr->ind_list = ind_list; - // st_fx->hBstr->ind_list_fx = st->hBstr->ind_list; - //reset_indices_enc_fx( st->hBstr, MAX_NUM_INDICES ); -#endif hSCE->hCoreCoder[0] = st; st_ivas->hSCE[sce_id] = hSCE; @@ -502,7 +486,7 @@ ivas_error create_sce_enc_fx( * * Create, allocate and initialize EVS encoder SCE handle *-------------------------------------------------------------------------*/ -#if 0 +#ifndef HARM_SCE_INIT ivas_error create_evs_sce_enc_fx( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const Word16 sce_id, /* i : SCE # identifier */ @@ -624,9 +608,30 @@ ivas_error create_evs_sce_enc_fx( { return error; } +#ifdef HARM_PUSH_BIT + /*-----------------------------------------------------------------* + * Bitstream + *-----------------------------------------------------------------*/ + IF( ( st_fx->hBstr = (BSTR_ENC_HANDLE) malloc( sizeof( BSTR_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) ); + } + + /* set pointer to the buffer of indices */ + st_fx->hBstr->ind_list = st_ivas->ind_list; + st_fx->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + st_fx->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices; + st_fx->hBstr->nb_ind_tot = 0; + move16(); + st_fx->hBstr->nb_bits_tot = 0; + move16(); + st_fx->hBstr->st_ivas = st_ivas; +#else st_fx->hBstr->ind_list = ind_list; // st_fx->hBstr->ind_list_fx = st->hBstr->ind_list; reset_indices_enc_fx( st_fx->hBstr, MAX_NUM_INDICES ); +#endif + hSCE->hCoreCoder[0] = st_fx; st_ivas->hSCE[sce_id] = hSCE; -- GitLab From 3891a5187d17cdd2e3b49eddf983989ea42a73b9 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 27 Mar 2025 09:43:27 -0400 Subject: [PATCH 0097/1310] fix during switching --- lib_com/bitstream_fx.c | 3 ++- lib_enc/acelp_core_switch_enc_fx.c | 18 +++++++++++++++++- lib_enc/stat_enc.h | 3 ++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index f29dc6aee..07a6a632f 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -530,11 +530,12 @@ void reset_indices_enc_fx( move16(); hBstr->nb_bits_tot = 0; move16(); +#ifndef HARM_PUSH_BIT hBstr->next_ind_fx = 0; move16(); hBstr->last_ind_fx = -1; move16(); - +#endif FOR( i = 0; i < max_num_indices; i++ ) { hBstr->ind_list[i].nb_bits = -1; diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 9b0ed8b58..8226748f7 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -62,7 +62,10 @@ void acelp_core_switch_enc_fx( Word16 Aq[2 * ( M + 1 )]; LPD_state_HANDLE hLPDmem; /* ACELP LPDmem memories */ BSTR_ENC_HANDLE hBstr = st_fx->hBstr; - +#ifdef HARM_PUSH_BIT + UWord16 value; + Word16 nb_bits; +#endif hLPDmem = st_fx->hLPDmem; /* initializations */ @@ -153,6 +156,18 @@ void acelp_core_switch_enc_fx( encod_gen_voic_core_switch_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); +#ifdef HARM_PUSH_BIT + i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); +#ifdef DEBUGGING + assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" ); +#endif + while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START ) + { + push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits ); + i++; + } + delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); +#else /*----------------------------------------------------------------* * bit-stream: modify the layer of sub frame CELP *----------------------------------------------------------------*/ @@ -165,6 +180,7 @@ void acelp_core_switch_enc_fx( hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; /* Q0 */ move16(); } +#endif /*----------------------------------------------------------------* * BWE encoding *----------------------------------------------------------------*/ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 64ab13ea2..5305a8bdc 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -92,9 +92,10 @@ typedef struct bitstream_enc_data_structure void *st_ivas; /* IVAS encoder structure */ // Word16 nb_bits_tot_fx; /* total number of bits already written */ // Indice *ind_list_fx; /* list of indices */ +#ifndef HARM_PUSH_BIT Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ Word16 last_ind_fx; /* last written indice */ - +#endif } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* -- GitLab From 6b9dde261138ff69f80e1932e3156250ccdd672d Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 27 Mar 2025 09:50:15 -0400 Subject: [PATCH 0098/1310] fix when erasing indices --- lib_enc/cng_enc_fx.c | 4 ++++ lib_enc/eval_pit_contr_fx.c | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index 221454970..d6cb59b17 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -2460,8 +2460,12 @@ static void shb_CNG_encod_fx( push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); push_indice( hBstr, IND_SID_BW, 1, 1 ); +#ifdef HARM_PUSH_BIT + delete_indice( hBstr, IND_CNG_ENV1 ); +#else hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_CNG_ENV1].nb_bits ); hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; +#endif move16(); move16(); diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c index df629f295..5e1c8dfe3 100644 --- a/lib_enc/eval_pit_contr_fx.c +++ b/lib_enc/eval_pit_contr_fx.c @@ -378,6 +378,16 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit move16(); set16_fx( pitch_buf, shl( L_SUBFR, 6 ), NB_SUBFR16k ); + +#ifdef HARM_PUSH_BIT + /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ + for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) + { + delete_indice( hBstr, i ); + } + + delete_indice( hBstr, IND_ES_PRED ); +#else /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ FOR( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { @@ -396,6 +406,7 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit hBstr->ind_list[IND_ES_PRED].nb_bits = -1; move16(); } +#endif } IF( LT_32( st_fx->core_brate, CFREQ_BITRATE ) ) { -- GitLab From c0db989af3499a2dc4741b2059c6e6b6449524af Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 27 Mar 2025 09:54:11 -0400 Subject: [PATCH 0099/1310] fix clang --- lib_enc/cng_enc_fx.c | 2 +- lib_enc/igf_enc_fx.c | 2 +- lib_enc/init_enc_fx.c | 2 +- lib_enc/ivas_sce_enc_fx.c | 2 +- lib_enc/lib_enc.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index d6cb59b17..b031ca528 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -2460,7 +2460,7 @@ static void shb_CNG_encod_fx( push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); push_indice( hBstr, IND_SID_BW, 1, 1 ); -#ifdef HARM_PUSH_BIT +#ifdef HARM_PUSH_BIT delete_indice( hBstr, IND_CNG_ENV1 ); #else hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_CNG_ENV1].nb_bits ); diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 96f8d0202..f508b313f 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -1449,7 +1449,7 @@ hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written ); return; } -#ifndef HARM_PUSH_BIT /* old bitstream */ +#ifndef HARM_PUSH_BIT /* old bitstream */ /**********************************************************************/ /* IGF bitsream concatenation for TCX10 modes **************************************************************************/ diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 4913e410d..60e6019aa 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1675,7 +1675,7 @@ ivas_error init_encoder_ivas_fx( return error; } } - ELSE + ELSE { IF( ( error = openCldfb_ivas_fx( &st->cldfbAnaEnc, CLDFB_ANALYSIS, st->input_Fs, CLDFB_PROTOTYPE_1_25MS, ENC ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c index 2e1aed092..41127a98e 100644 --- a/lib_enc/ivas_sce_enc_fx.c +++ b/lib_enc/ivas_sce_enc_fx.c @@ -474,7 +474,7 @@ ivas_error create_sce_enc_fx( { return error; } - hSCE->hCoreCoder[0] = st; + hSCE->hCoreCoder[0] = st; st_ivas->hSCE[sce_id] = hSCE; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index fdf410df5..dd01386d8 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -70,7 +70,7 @@ struct IVAS_ENC * Local functions *---------------------------------------------------------------------*/ -//static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, const Word32 initBitrate, const IVAS_ENC_BANDWIDTH initBandwidth, const IVAS_ENC_DTX_CONFIG dtxConfig, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); +// static ivas_error configureEncoder_fx( IVAS_ENC_HANDLE hIvasEnc, const Word32 inputFs, const Word32 initBitrate, const IVAS_ENC_BANDWIDTH initBandwidth, const IVAS_ENC_DTX_CONFIG dtxConfig, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); static ivas_error setBandwidth_fx( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_BANDWIDTH maxBandwidth ); static ivas_error setChannelAwareConfig_fx( IVAS_ENC_HANDLE hIvasEnc, const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ); static ivas_error sanitizeBandwidth_fx( const IVAS_ENC_HANDLE hIvasEnc ); -- GitLab From b0162e358ff26d71df3c137718ba8b22ac3b023a Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 27 Mar 2025 11:34:05 -0400 Subject: [PATCH 0100/1310] fix reset indice for dtx case --- lib_enc/dtx_fx.c | 4 ++++ lib_enc/enc_ppp_fx.c | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index 9a66572ab..6d8a29795 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -838,7 +838,11 @@ void dtx_fx( /* reset the bitstream (IVAS format signalling was already written) */ IF( NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->hBstr != NULL ) { +#ifdef HARM_PUSH_BIT + reset_indices_enc_fx( st_fx->hBstr, st_fx->hBstr->nb_ind_tot ); +#else reset_indices_enc_fx( st_fx->hBstr, MAX_NUM_INDICES ); +#endif } } diff --git a/lib_enc/enc_ppp_fx.c b/lib_enc/enc_ppp_fx.c index c2aeaa7ca..9d1ffad60 100644 --- a/lib_enc/enc_ppp_fx.c +++ b/lib_enc/enc_ppp_fx.c @@ -189,8 +189,11 @@ ivas_error encod_ppp_fx( /* We write signalling indices again only in case of bump_up */ /* delete previous indices */ +#ifdef HARM_PUSH_BIT + reset_indices_enc_fx( hBstr, hBstr->nb_ind_tot ); +#else reset_indices_enc_fx( hBstr, MAX_NUM_INDICES ); - +#endif /* signalling matrix (writing of signalling bits) */ signalling_enc_fx( st_fx ); } @@ -373,8 +376,11 @@ ivas_error encod_ppp_ivas_fx( /* We write signalling indices again only in case of bump_up */ /* delete previous indices */ +#ifdef HARM_PUSH_BIT + reset_indices_enc_fx( hBstr, hBstr->nb_ind_tot ); +#else reset_indices_enc_fx( hBstr, MAX_NUM_INDICES ); - +#endif /* signalling matrix (writing of signalling bits) */ signalling_enc_fx( st_fx ); } -- GitLab From faf1f546c95d0ea2d6dc16419b8e87dac5d92e57 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 27 Mar 2025 12:52:49 -0400 Subject: [PATCH 0101/1310] Fix bitrate switching --- lib_enc/lib_enc.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index dd01386d8..063f39dea 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1817,6 +1817,16 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( /* set pointers to the new buffers of indices in each element */ FOR( n = 0; n < st_ivas->nSCE; n++ ) { +#ifdef HARM_PUSH_BIT + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + + if ( st_ivas->hSCE[n]->hMetaData != NULL ) + { + st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + } +#else test(); IF( !( hIvasEnc->hCoreCoder == NULL && EQ_32( hEncoderConfig->ivas_format, MONO_FORMAT ) ) ) { @@ -1832,6 +1842,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; } +#endif } FOR( n = 0; n < st_ivas->nCPE; n++ ) -- GitLab From 7f70a132985455dcf07605cb195ace3a99637457 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 31 Mar 2025 11:41:23 +0200 Subject: [PATCH 0102/1310] Activate FIX_1379_MASA_ANGLE_ROUND (merge conflict resolution) --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4653bb460..59a6b3508 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -68,6 +68,7 @@ #endif /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define FIX_1379_MASA_ANGLE_ROUND //#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ #define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ #define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ -- GitLab From 731ee44c7b9420febc977a032b4258304a977d49 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 11:29:12 +0200 Subject: [PATCH 0103/1310] introduce FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 --- lib_com/prot_fx.h | 8 +++++++- lib_dec/swb_tbe_dec_fx.c | 21 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 19560b368..f74c3071d 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,7 +60,7 @@ #define TCX_IMDCT_HEADROOM 1 // *** Currently checking be-nes of all-inactive (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50048 -- DONE GREEN! -// *** Currently checking be speedups ( only modified version of FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) +// *** Currently checking be speedups ( only modified version of FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50073 // --> next test: check nonbe speedups // //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 @@ -73,6 +73,12 @@ // NUmbers none: 88,183 +//----------------------------------------------------------------------- +//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE - pipes TBD +// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) + + + /*----------------------------------------------------------------------------------* * Prototypes of global macros *----------------------------------------------------------------------------------*/ diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 2b42e5b0d..3bc2868a2 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -6997,13 +6997,16 @@ void ivas_swb_tbe_dec_fx( move32(); } - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART K" ); + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" ); + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" ); /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ GenSHBSynth_fx32( shaped_shb_excitation_fx_32, error_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->L_frame, &( hBWE_TD->syn_dm_phase ) ); Copy_Scale_sig_32_16( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 2 * ALLPASSSECTIONS_STEEP, -( Q11 - Q_bwe_exc ) ); Copy32( error_fx + L_FRAME32k - L_SHB_TRANSITION_LENGTH, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" );*/ + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" ); /* resample SHB synthesis (if needed) and scale down */ synth_scale_fx = 32767; move16(); /* 1.0 in Q15 */ @@ -7027,14 +7030,25 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); + +#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 + Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 +#endif + FOR( i = 0; i < L_FRAME16k; i++ ) { +#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } +#else + Word16 idx; + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ + L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ +#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); @@ -7097,7 +7111,9 @@ void ivas_swb_tbe_dec_fx( Decimate_allpass_steep_fx32( error_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, synth_fx ); } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" );*/ + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" ); /* Update previous frame parameters for FEC */ Copy( lsf_shb_fx, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER ); IF( EQ_16( st->codec_mode, MODE1 ) ) @@ -7134,8 +7150,9 @@ void ivas_swb_tbe_dec_fx( move16(); hBWE_TD->prev_Qx = Q_bwe_exc; move16(); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" );*/ - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART K" );*/ + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" );*/ return; } -- GitLab From a4e12092354a192740be4e4c76947ddb52088384 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 11:33:21 +0200 Subject: [PATCH 0104/1310] deactivate all speedups --- lib_com/prot_fx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index f74c3071d..5ab70a690 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -66,7 +66,7 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS // Numbers ALL: 83,45 // Numbers beOnly: 86,156 -- GitLab From a92a989cb0e0e181be2d633a81635b25ce9d3895 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 11:38:34 +0200 Subject: [PATCH 0105/1310] apply clang format patch --- lib_com/prot_fx.h | 1 - lib_com/swb_tbe_com_fx.c | 90 ++++++++++++++++++++-------------------- lib_dec/swb_tbe_dec_fx.c | 2 +- 3 files changed, 46 insertions(+), 47 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 4b9832a24..2be66fe1f 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -78,7 +78,6 @@ // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) - /*----------------------------------------------------------------------------------* * Prototypes of global macros *----------------------------------------------------------------------------------*/ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d58825e59..12ab2c9b0 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6869,65 +6869,65 @@ void elliptic_bpf_48k_generic_fx( IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { i = 4; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //0 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; FOR( ; i < L_FRAME48k / 3; ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat(L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX); //3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); //4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); //5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); //6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); //7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); //8 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; } diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 3bc2868a2..e73e541d0 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7032,7 +7032,7 @@ void ivas_swb_tbe_dec_fx( move16(); #ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 - Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 + Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 #endif FOR( i = 0; i < L_FRAME16k; i++ ) -- GitLab From 8b8c300aefb6b52b7cad8b390cbffcdecc0184ff Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 11:53:55 +0200 Subject: [PATCH 0106/1310] fixed and activated FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig to test BEnes --- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 2be66fe1f..652afe49c 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -66,7 +66,7 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS // Numbers ALL: 83,45 // Numbers beOnly: 86,156 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 12ab2c9b0..43250e441 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6843,7 +6843,7 @@ void elliptic_bpf_48k_generic_fx( } } ELSE -#else +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ { FOR( i = 4; i < L_FRAME48k; i++ ) { @@ -6862,7 +6862,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ + #else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig test(); @@ -6933,7 +6933,7 @@ void elliptic_bpf_48k_generic_fx( } } ELSE -#else +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ { FOR( i = 4; i < L_FRAME48k; i++ ) { @@ -6949,7 +6949,6 @@ void elliptic_bpf_48k_generic_fx( move32(); } } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ #endif -- GitLab From 38702cd5c3fc81cc7fac45ade3c955ea0991b992 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 12:24:28 +0200 Subject: [PATCH 0107/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 43250e441..95428c21d 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6863,7 +6863,7 @@ void elliptic_bpf_48k_generic_fx( } } -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig test(); IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) @@ -6952,7 +6952,7 @@ void elliptic_bpf_48k_generic_fx( #endif - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; -- GitLab From 6eb0cd70d55fb5bc62b92530660ad4e5eabdd73a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 12:58:08 +0200 Subject: [PATCH 0108/1310] fixed and activated FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 95428c21d..5fe3c6feb 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6800,7 +6800,7 @@ void elliptic_bpf_48k_generic_fx( move32(); i++; - FOR( ; i < L_FRAME48k / 3; ) + FOR( ; i < L_FRAME48k; ) { // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //2 W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); // 3 @@ -6893,7 +6893,7 @@ void elliptic_bpf_48k_generic_fx( move32(); i++; - FOR( ; i < L_FRAME48k / 3; ) + FOR( ; i < L_FRAME48k; ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From f05199c15fed0855831d2f7bc55578dca010df22 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 13:37:01 +0200 Subject: [PATCH 0109/1310] add intended version of FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - should be BE --- lib_com/prot_fx.h | 8 ++++---- lib_com/swb_tbe_com_fx.c | 40 ++++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 652afe49c..929872cf1 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -66,11 +66,11 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 2 WMOPS +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 1 WMOPS -// Numbers ALL: 83,45 -// Numbers beOnly: 86,156 -// NUmbers none: 88,183 +// Numbers ALL: +// Numbers beOnly: 87,344 +// NUmbers none: 88,236 //----------------------------------------------------------------------- diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5fe3c6feb..d3c098b03 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6870,37 +6870,37 @@ void elliptic_bpf_48k_generic_fx( { i = 4; L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; FOR( ; i < L_FRAME48k; ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6908,25 +6908,25 @@ void elliptic_bpf_48k_generic_fx( i++; L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; -- GitLab From 1053f32f15c322af2dc07f3782f8d878103cfe8a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 13:39:40 +0200 Subject: [PATCH 0110/1310] minor: comments --- lib_com/prot_fx.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 929872cf1..055515fca 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -63,12 +63,12 @@ // *** Currently checking be speedups ( only modified version of FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50073 // --> next test: check nonbe speedups // -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 1 WMOPS -// Numbers ALL: +// Numbers ALL: 84,189 // Numbers beOnly: 87,344 // NUmbers none: 88,236 -- GitLab From 88f73bf5943924910ebd93ef5167089d23b8818a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 13:41:34 +0200 Subject: [PATCH 0111/1310] apply clang format patch --- lib_com/swb_tbe_com_fx.c | 76 ++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d3c098b03..a4ded2bb5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6869,64 +6869,64 @@ void elliptic_bpf_48k_generic_fx( IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { i = 4; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; FOR( ; i < L_FRAME48k; ) { - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; -- GitLab From e506102c2e7be503b61e528cc605c01136aa36a7 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 15:25:03 +0200 Subject: [PATCH 0112/1310] activate FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 to test BEnes --- lib_com/prot_fx.h | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 055515fca..0344456e9 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -59,14 +59,12 @@ #define TCX_IMDCT_SCALE 15 #define TCX_IMDCT_HEADROOM 1 -// *** Currently checking be-nes of all-inactive (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50048 -- DONE GREEN! -// *** Currently checking be speedups ( only modified version of FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig) for be-nes (should not fail!) https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50073 -// --> next test: check nonbe speedups + // -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // 1 WMOPS +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // \ +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // > 3.1 WOPS +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // / +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // .9 WMOPS -- all pipes green , BE // Numbers ALL: 84,189 // Numbers beOnly: 87,344 @@ -74,7 +72,7 @@ //----------------------------------------------------------------------- -//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE - pipes TBD +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE - pipes TBD // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) -- GitLab From 16c3fe08f2569ece6fae744dce05e8638ba39830 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 15:29:54 +0200 Subject: [PATCH 0113/1310] apply clang format patch --- lib_com/prot_fx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 0344456e9..31d67098b 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -62,7 +62,7 @@ // //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // \ -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // > 3.1 WOPS +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // > 3.1 WOPS //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // / #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // .9 WMOPS -- all pipes green , BE -- GitLab From c864af93164520a9907db2134ce307152a179aae Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 15:47:57 +0200 Subject: [PATCH 0114/1310] fix multi line comment warning --- lib_com/prot_fx.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 31d67098b..62d1168ce 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,10 +60,10 @@ #define TCX_IMDCT_HEADROOM 1 -// -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // \ -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // > 3.1 WOPS -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // / + +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // | > 3.1 WOPS +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // | #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // .9 WMOPS -- all pipes green , BE // Numbers ALL: 84,189 -- GitLab From c2b954488d33fa1b43967bb06b5a4eed6ec04b08 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 15:52:31 +0200 Subject: [PATCH 0115/1310] apply clang format patch --- lib_com/prot_fx.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 62d1168ce..af393e5c6 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,7 +60,6 @@ #define TCX_IMDCT_HEADROOM 1 - //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // | //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // | > 3.1 WOPS //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // | -- GitLab From 0c377506f3a16129badb751787766eedc1a35ba3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 16:31:38 +0200 Subject: [PATCH 0116/1310] FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1, 2, 3 activation --- lib_com/prot_fx.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index af393e5c6..ea2c0c9e8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,18 +60,18 @@ #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // | > 3.1 WOPS -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // be // .9 WMOPS -- all pipes green , BE - +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // | > 3.1 WOPS +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // BE // .9 WMOPS -- all pipes green +// ^^^^^^^^ // Numbers ALL: 84,189 // Numbers beOnly: 87,344 // NUmbers none: 88,236 //----------------------------------------------------------------------- -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE - pipes TBD +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE, all pipes green! // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) -- GitLab From c87aa384050f075c0e270c011c081a0b8a25f737 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Apr 2025 16:39:49 +0200 Subject: [PATCH 0117/1310] apply clang format patch --- lib_com/prot_fx.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index ea2c0c9e8..883ef5492 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,11 +60,11 @@ #define TCX_IMDCT_HEADROOM 1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 //nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 //nonbe // | > 3.1 WOPS -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 //nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WOPS +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // BE // .9 WMOPS -- all pipes green -// ^^^^^^^^ +// ^^^^^^^^ // Numbers ALL: 84,189 // Numbers beOnly: 87,344 // NUmbers none: 88,236 -- GitLab From 4786581cd17e23de3cbc31b85596d6a52c32af13 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 09:38:38 +0200 Subject: [PATCH 0118/1310] deactivated all speedups but FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat in tools_fx.c - is it be? --- lib_com/prot_fx.h | 10 +++++----- lib_com/tools_fx.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 883ef5492..01970f37b 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,10 +60,10 @@ #define TCX_IMDCT_HEADROOM 1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WOPS -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // BE // .9 WMOPS -- all pipes green +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // BE // .9 WMOPS -- all pipes green // ^^^^^^^^ // Numbers ALL: 84,189 // Numbers beOnly: 87,344 @@ -71,7 +71,7 @@ //----------------------------------------------------------------------- -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE, all pipes green! +//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE, all pipes green! // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 5219d076c..ddacd9d09 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -760,6 +760,7 @@ void Copy_Scale_sig_16_32_DEPREC( } } +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat void Copy_Scale_sig_16_32_no_sat( const Word16 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ @@ -794,6 +795,41 @@ void Copy_Scale_sig_16_32_no_sat( } return; } +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat +//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); + + IF( L_tmp >= 0x7FFF ) + { + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* saturation can occur here */ +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + Word32 tmp32 = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + if ( tmp32 != y[i] ) + assert( 0 ); +#endif + } + return; + } + + //ELSE + { + Word16 tmp = extract_l( L_tmp ); + FOR( i = 0; i < lg; i++ ) + { + y[i] = L_mult(x[i], L_tmp); + move32(); /* saturation can occur here */ +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + Word32 tmp32 = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + if ( tmp32 != y[i] ) + assert( 0 ); +#endif + } + } +#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) { @@ -801,6 +837,7 @@ void Copy_Scale_sig_16_32_no_sat( y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); move32(); /* saturation can occur here */ } +#endif } void Copy_Scale_sig_32_16( -- GitLab From 11d2a43def1639f505ac3b3b640b6e8caefb76a7 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 09:40:54 +0200 Subject: [PATCH 0119/1310] applied clang format patch --- lib_com/tools_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index ddacd9d09..d0dddd4d1 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -796,7 +796,7 @@ void Copy_Scale_sig_16_32_no_sat( return; } #ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat -//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + //#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); IF( L_tmp >= 0x7FFF ) @@ -814,13 +814,13 @@ void Copy_Scale_sig_16_32_no_sat( } return; } - - //ELSE + + // ELSE { Word16 tmp = extract_l( L_tmp ); FOR( i = 0; i < lg; i++ ) { - y[i] = L_mult(x[i], L_tmp); + y[i] = L_mult( x[i], L_tmp ); move32(); /* saturation can occur here */ #ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST Word32 tmp32 = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); -- GitLab From 484696efae01af32ad89bebaebbbd0c3335cc763 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 09:46:35 +0200 Subject: [PATCH 0120/1310] fix warning unused variable --- lib_com/tools_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index d0dddd4d1..0ca7f54ad 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -817,7 +817,7 @@ void Copy_Scale_sig_16_32_no_sat( // ELSE { - Word16 tmp = extract_l( L_tmp ); + //Word16 tmp = extract_l( L_tmp ); FOR( i = 0; i < lg; i++ ) { y[i] = L_mult( x[i], L_tmp ); -- GitLab From 8408cc86cc6af04795636103c1ee0f4abe6bfca7 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 09:47:08 +0200 Subject: [PATCH 0121/1310] fix clang format pipeline warning --- lib_com/tools_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 0ca7f54ad..957c8a42a 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -817,7 +817,7 @@ void Copy_Scale_sig_16_32_no_sat( // ELSE { - //Word16 tmp = extract_l( L_tmp ); + // Word16 tmp = extract_l( L_tmp ); FOR( i = 0; i < lg; i++ ) { y[i] = L_mult( x[i], L_tmp ); -- GitLab From c64a0a025d136cf681e95c615f766cd84387f499 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 11:18:01 +0200 Subject: [PATCH 0122/1310] activate only be speedups - is really be? --- lib_com/options.h | 9 ++++++++- lib_com/prot_fx.h | 9 +-------- lib_com/tools_fx.c | 13 ------------- lib_dec/ivas_stereo_icbwe_dec_fx.c | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4653bb460..910f8094e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -/*#define WMOPS*/ /* Activate complexity and memory counters */ +//#define WMOPS /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -78,4 +78,11 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT + +// new speedups - pipe running +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ + #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 01970f37b..bffb85ba8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -61,17 +61,10 @@ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig // BE // .9 WMOPS -- all pipes green -// ^^^^^^^^ -// Numbers ALL: 84,189 -// Numbers beOnly: 87,344 -// NUmbers none: 88,236 - //----------------------------------------------------------------------- -//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 // .8 WMOPS BE, all pipes green! // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 957c8a42a..d5ec36928 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -760,7 +760,6 @@ void Copy_Scale_sig_16_32_DEPREC( } } -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat void Copy_Scale_sig_16_32_no_sat( const Word16 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ @@ -796,7 +795,6 @@ void Copy_Scale_sig_16_32_no_sat( return; } #ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat - //#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); IF( L_tmp >= 0x7FFF ) @@ -806,15 +804,9 @@ void Copy_Scale_sig_16_32_no_sat( // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); move32(); /* saturation can occur here */ -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST - Word32 tmp32 = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - if ( tmp32 != y[i] ) - assert( 0 ); -#endif } return; } - // ELSE { // Word16 tmp = extract_l( L_tmp ); @@ -822,11 +814,6 @@ void Copy_Scale_sig_16_32_no_sat( { y[i] = L_mult( x[i], L_tmp ); move32(); /* saturation can occur here */ -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST - Word32 tmp32 = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - if ( tmp32 != y[i] ) - assert( 0 ); -#endif } } #else diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index c7bc98566..4acfcf6d9 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,8 +904,22 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); +#endif FOR( i = 0; i < winLen_fx; i++ ) { +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ + L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ + tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ + move32(); + if ( LE_16( alpha_fx, winSlope_fx_ ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ + } +#else L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ @@ -915,6 +929,7 @@ void stereo_icBWE_dec_fx( { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } +#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) -- GitLab From cd84bf62258688461fd1130d3847f254b694ef13 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 12:34:57 +0200 Subject: [PATCH 0123/1310] fix precission in FIX_1439_SPEEDUP_elliptic_bpf_48k_generic STAGE1-3, activate, check again BEness --- lib_com/prot_fx.h | 6 +++--- lib_com/swb_tbe_com_fx.c | 24 ++++++++++++++++-------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index bffb85ba8..d64744426 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,9 +60,9 @@ #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a4ded2bb5..66daa4835 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6783,7 +6783,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6796,7 +6797,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6811,7 +6813,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6824,7 +6827,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6837,7 +6841,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; } @@ -6858,7 +6863,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } } @@ -7021,7 +7027,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } @@ -7128,7 +7135,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -- GitLab From 50e83868d65d789c4c2fdc12161e3fcf8ce811bb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 12:37:28 +0200 Subject: [PATCH 0124/1310] clang format patch --- lib_com/prot_fx.h | 6 +++--- lib_com/swb_tbe_com_fx.c | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index d64744426..709c7350a 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,9 +60,9 @@ #define TCX_IMDCT_HEADROOM 1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 66daa4835..9b78b6a0a 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6783,7 +6783,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6797,7 +6797,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6813,7 +6813,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6827,7 +6827,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6841,7 +6841,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6863,7 +6863,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } @@ -7027,7 +7027,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + // L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); @@ -7135,7 +7135,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + // L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); -- GitLab From f6035b9357c963cbf78e463f3bb825caab75aaa5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 13:45:10 +0200 Subject: [PATCH 0125/1310] fix FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 --- lib_com/prot_fx.h | 6 +++--- lib_dec/swb_tbe_dec_fx.c | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 709c7350a..fc10b7d3d 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,9 +60,9 @@ #define TCX_IMDCT_HEADROOM 1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50610 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index e73e541d0..dd49465b1 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7047,7 +7047,6 @@ void ivas_swb_tbe_dec_fx( #else Word16 idx; idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ - L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ #endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ -- GitLab From 1d9afdc3dde8edc997ee137879e2f195961dd31a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 13:54:56 +0200 Subject: [PATCH 0126/1310] clang patch --- lib_dec/swb_tbe_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index dd49465b1..36a499f7d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7046,7 +7046,7 @@ void ivas_swb_tbe_dec_fx( } #else Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ #endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ -- GitLab From 5ad8f6474e933567260b3fe5ae3c6a5dc9652dcf Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:21:19 +0200 Subject: [PATCH 0127/1310] only cleaned upo- moved macros to options.h --- lib_com/options.h | 11 ++++++++++- lib_com/prot_fx.h | 8 -------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 910f8094e..d9a11b6a0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,10 +79,19 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT -// new speedups - pipe running +//------------------------------------------------------------------------------------------------ +// new speedups - pipe running - 2.4 WMOPS (88.236 clean, 85.828 BE macros) #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.2 WMOPS, pipe https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50610 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | + + +// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) + + #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index fc10b7d3d..ffd1d6032 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,14 +60,6 @@ #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50610 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | - -//----------------------------------------------------------------------- -// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) - - /*----------------------------------------------------------------------------------* * Prototypes of global macros *----------------------------------------------------------------------------------*/ -- GitLab From 14ffa173ca0e1cba1519aca563184cb00ecefeb3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:23:40 +0200 Subject: [PATCH 0128/1310] Revert "only cleaned upo- moved macros to options.h" This reverts commit 5ad8f6474e933567260b3fe5ae3c6a5dc9652dcf. --- lib_com/options.h | 11 +---------- lib_com/prot_fx.h | 8 ++++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index d9a11b6a0..910f8094e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,19 +79,10 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT -//------------------------------------------------------------------------------------------------ -// new speedups - pipe running - 2.4 WMOPS (88.236 clean, 85.828 BE macros) +// new speedups - pipe running #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.2 WMOPS, pipe https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50610 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | - - -// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) - - #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index ffd1d6032..fc10b7d3d 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,6 +60,14 @@ #define TCX_IMDCT_HEADROOM 1 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50610 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | + +//----------------------------------------------------------------------- +// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) + + /*----------------------------------------------------------------------------------* * Prototypes of global macros *----------------------------------------------------------------------------------*/ -- GitLab From 6adb90e0d7b137350d2c4617abaf2349032772ec Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:23:57 +0200 Subject: [PATCH 0129/1310] Revert "clang patch" This reverts commit 1d9afdc3dde8edc997ee137879e2f195961dd31a. --- lib_dec/swb_tbe_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 36a499f7d..dd49465b1 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7046,7 +7046,7 @@ void ivas_swb_tbe_dec_fx( } #else Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ #endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ -- GitLab From 267c42789813eb8a5d84a16d6ea6d7a3d51e5bd4 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:24:11 +0200 Subject: [PATCH 0130/1310] Revert "fix FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0" This reverts commit f6035b9357c963cbf78e463f3bb825caab75aaa5. --- lib_com/prot_fx.h | 6 +++--- lib_dec/swb_tbe_dec_fx.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index fc10b7d3d..709c7350a 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,9 +60,9 @@ #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50610 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index dd49465b1..e73e541d0 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7047,6 +7047,7 @@ void ivas_swb_tbe_dec_fx( #else Word16 idx; idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ + L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ #endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ -- GitLab From 04de54be85ffb795b72aa44249c5516443a956da Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:24:33 +0200 Subject: [PATCH 0131/1310] Revert "clang format patch" This reverts commit 50e83868d65d789c4c2fdc12161e3fcf8ce811bb. --- lib_com/prot_fx.h | 6 +++--- lib_com/swb_tbe_com_fx.c | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 709c7350a..d64744426 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,9 +60,9 @@ #define TCX_IMDCT_HEADROOM 1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 9b78b6a0a..66daa4835 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6783,7 +6783,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6797,7 +6797,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6813,7 +6813,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6827,7 +6827,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6841,7 +6841,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6863,7 +6863,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - // L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } @@ -7027,7 +7027,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - // L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); @@ -7135,7 +7135,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - // L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); -- GitLab From 05d9348d8fcbd9b587438233c3f3e60dbfba99b8 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:24:59 +0200 Subject: [PATCH 0132/1310] Revert "fix precission in FIX_1439_SPEEDUP_elliptic_bpf_48k_generic STAGE1-3, activate, check again BEness" This reverts commit cd84bf62258688461fd1130d3847f254b694ef13. --- lib_com/prot_fx.h | 6 +++--- lib_com/swb_tbe_com_fx.c | 24 ++++++++---------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index d64744426..bffb85ba8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,9 +60,9 @@ #define TCX_IMDCT_HEADROOM 1 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 66daa4835..a4ded2bb5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6783,8 +6783,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6797,8 +6796,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6813,8 +6811,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6827,8 +6824,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6841,8 +6837,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); i++; } @@ -6863,8 +6858,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ move32(); } } @@ -7027,8 +7021,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } @@ -7135,8 +7128,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -- GitLab From 95e62c63d66b42e391dda75f12c033344f1a7591 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:47:22 +0200 Subject: [PATCH 0133/1310] deactivate all speedups --- lib_com/options.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 910f8094e..6616402cc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,9 +80,9 @@ //#define HARM_SCE_INIT // new speedups - pipe running -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ #endif -- GitLab From 3703d5c6f8b76d2d02a8b420ab92db65625ca5fc Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 16:04:34 +0200 Subject: [PATCH 0134/1310] add FIX_1439_SPEEDUP_synthesise_fb_high_band_fx macro --- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c | 42 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6616402cc..e791e2835 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,5 +84,5 @@ //#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ //#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ - +//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // 0.4 WMOPS - BE? #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a4ded2bb5..7ad52ba6f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7298,6 +7298,47 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { +#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx + L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ + Word32 L_tmp32; + Word16 tmp16; + + if ( L_tmp < 0 ) + { + L_tmp32 = L_negate( L_tmp ); + } + if ( L_tmp < 0 ) + { + L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); + } + if ( L_tmp < 0 ) + { + tmp16 = extract_h( L_tmp32); + } + if ( L_tmp < 0 ) + { + tmp16 = negate( tmp16 ); + } + + if ( L_tmp == 0 ) + { + tmp16 = 0; + move16(); + } + + if ( L_tmp > 0 ) + { + L_tmp32 = L_shl_sat( L_tmp, tmp3 ); + } + if ( L_tmp > 0 ) + { + tmp16 = extract_h( L_tmp32 ); + } + + output[i] = tmp16; + move16(); + +#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7309,6 +7350,7 @@ void synthesise_fb_high_band_fx( output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); } +#endif } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; -- GitLab From 1b9bff76c733f36e9f19b12c87c1788c19446dc7 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 13:45:10 +0200 Subject: [PATCH 0135/1310] fix FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 --- lib_dec/swb_tbe_dec_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index e73e541d0..dd49465b1 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7047,7 +7047,6 @@ void ivas_swb_tbe_dec_fx( #else Word16 idx; idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ - L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ #endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ -- GitLab From 2d8375baf11bf77e84261b65de13258a8e238d5a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 16:08:25 +0200 Subject: [PATCH 0136/1310] move all speedup macros to options.h --- lib_com/options.h | 9 ++++++++- lib_com/prot_fx.h | 8 -------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e791e2835..1efda0251 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,10 +79,17 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT -// new speedups - pipe running +// new speedups //#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ //#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ //#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ //#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // 0.4 WMOPS - BE? + +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | + +//----------------------------------------------------------------------- +// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index bffb85ba8..ffd1d6032 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -60,14 +60,6 @@ #define TCX_IMDCT_HEADROOM 1 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | - -//----------------------------------------------------------------------- -// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) - - /*----------------------------------------------------------------------------------* * Prototypes of global macros *----------------------------------------------------------------------------------*/ -- GitLab From babf4e8b6709a7ce79c7e7e0bc95914b46879676 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 16:10:09 +0200 Subject: [PATCH 0137/1310] apply clang patch --- lib_com/swb_tbe_com_fx.c | 4 ++-- lib_dec/swb_tbe_dec_fx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 7ad52ba6f..500e2fd02 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7302,7 +7302,7 @@ void synthesise_fb_high_band_fx( L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ Word32 L_tmp32; Word16 tmp16; - + if ( L_tmp < 0 ) { L_tmp32 = L_negate( L_tmp ); @@ -7313,7 +7313,7 @@ void synthesise_fb_high_band_fx( } if ( L_tmp < 0 ) { - tmp16 = extract_h( L_tmp32); + tmp16 = extract_h( L_tmp32 ); } if ( L_tmp < 0 ) { diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index dd49465b1..36a499f7d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7046,7 +7046,7 @@ void ivas_swb_tbe_dec_fx( } #else Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ #endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ -- GitLab From b677480fe59ceaf1b9345a10cafe36f50e122418 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:13:59 +0000 Subject: [PATCH 0138/1310] --- revert ALL changes --- --- lib_com/options.h | 16 +- lib_com/swb_tbe_com_fx.c | 278 +---------------------------- lib_com/tools_fx.c | 24 --- lib_dec/ivas_core_dec_fx.c | 62 ++----- lib_dec/ivas_jbm_dec_fx.c | 20 +-- lib_dec/ivas_stereo_icbwe_dec_fx.c | 15 -- lib_dec/swb_tbe_dec_fx.c | 25 +-- 7 files changed, 21 insertions(+), 419 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1efda0251..4653bb460 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -//#define WMOPS /* Activate complexity and memory counters */ +/*#define WMOPS*/ /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -78,18 +78,4 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT - -// new speedups -//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // 0.4 WMOPS - BE? - -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | - -//----------------------------------------------------------------------- -// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 500e2fd02..25c6c32bf 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -18,7 +18,6 @@ #define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ - /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ @@ -6693,6 +6692,7 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ + void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -6704,9 +6704,8 @@ void elliptic_bpf_48k_generic_fx( { Word16 i, j; Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; - Word32 L_output[L_FRAME48k]; FOR( i = 0; i < 4; i++ ) { @@ -6722,7 +6721,6 @@ void elliptic_bpf_48k_generic_fx( move32(); } - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6765,176 +6763,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) - { - Word64 W_tmpX; - Word64 W_tmpY; - i = 4; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - FOR( ; i < L_FRAME48k; ) - { - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //2 - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); // 3 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //4 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //5 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); // 3 - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //4 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //5 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //4 - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //5 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //7 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - { - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - move32(); - } - } - -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) - { - i = 4; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - FOR( ; i < L_FRAME48k; ) - { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - { FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6948,9 +6776,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } - } -#endif - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -7005,28 +6830,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 - - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } - -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7041,7 +6844,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ + Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -7110,29 +6913,7 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -7150,7 +6931,6 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -#endif memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -7218,13 +6998,12 @@ void synthesise_fb_high_band_fx( { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; + Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; - Word16 tmp[L_FRAME48k]; - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" ); /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7240,7 +7019,6 @@ void synthesise_fb_high_band_fx( } exp_tmp = sub( Q_fb_exc, 2 ); - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" ); IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ @@ -7251,11 +7029,8 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ - - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); temp1 = sum2_fx_mod( tmp, L_FRAME48k ); + L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); @@ -7298,47 +7073,6 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx - L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32; - Word16 tmp16; - - if ( L_tmp < 0 ) - { - L_tmp32 = L_negate( L_tmp ); - } - if ( L_tmp < 0 ) - { - L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); - } - if ( L_tmp < 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - if ( L_tmp < 0 ) - { - tmp16 = negate( tmp16 ); - } - - if ( L_tmp == 0 ) - { - tmp16 = 0; - move16(); - } - - if ( L_tmp > 0 ) - { - L_tmp32 = L_shl_sat( L_tmp, tmp3 ); - } - if ( L_tmp > 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - - output[i] = tmp16; - move16(); - -#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7350,9 +7084,7 @@ void synthesise_fb_high_band_fx( output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); } -#endif } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; } diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index d5ec36928..15bba151e 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,37 +794,13 @@ void Copy_Scale_sig_16_32_no_sat( } return; } -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - - IF( L_tmp >= 0x7FFF ) - { FOR( i = 0; i < lg; i++ ) { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); move32(); /* saturation can occur here */ } - return; - } - // ELSE - { - // Word16 tmp = extract_l( L_tmp ); - FOR( i = 0; i < lg; i++ ) - { - y[i] = L_mult( x[i], L_tmp ); - move32(); /* saturation can occur here */ - } - } -#else - L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - FOR( i = 0; i < lg; i++ ) - { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ - } -#endif } void Copy_Scale_sig_32_16( diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index db6dad33f..03f0e4b40 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -116,12 +116,12 @@ ivas_error ivas_core_dec_fx( error = IVAS_ERR_OK; move32(); - push_wmops( "ivas_core_dec (ICD)" ); + push_wmops( "ivas_core_dec" ); /*------------------------------------------------------------------* * General initialization *-----------------------------------------------------------------*/ - push_wmops( "ICD init" ); + use_cldfb_for_dft = 0; move16(); tdm_LRTD_flag = -1; @@ -370,9 +370,7 @@ ivas_error ivas_core_dec_fx( { save_hb_synth_32_fx = NULL; } - pop_wmops(); /*push_wmops( "ICD init" );*/ - push_wmops( "ICD SID, sanity" ); /*------------------------------------------------------------------* * Decode SID for MDCT-Stereo DTX mode *-----------------------------------------------------------------*/ @@ -400,9 +398,7 @@ ivas_error ivas_core_dec_fx( { ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps ); } - pop_wmops(); /*push_wmops( "ICD SID, sanity" );*/ - push_wmops( "ICD Coredec" ); /*------------------------------------------------------------------* * Core Decoding *-----------------------------------------------------------------*/ @@ -487,7 +483,6 @@ ivas_error ivas_core_dec_fx( IF( st->core == ACELP_CORE ) { - push_wmops( "ICD ACELP" ); /* ACELP core decoder */ Word16 old_syn_12k8_16k_fx_16[L_FRAME16k]; Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx; @@ -560,7 +555,6 @@ ivas_error ivas_core_dec_fx( } Copy_Scale_sig_16_32_DEPREC( old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n], L_FRAME16k, Q11 - ( -Q1 ) ); // Q(11 - (-1)) - pop_wmops(); /*push_wmops( "ICD ACELP" );*/ } Copy_Scale_sig_32_16( st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0 ); // Q0 @@ -569,7 +563,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - push_wmops( "ICD TCX" ); Word16 Qsyn_temp; IVAS_FORMAT ivas_format; @@ -624,12 +617,10 @@ ivas_error ivas_core_dec_fx( } st->hBPF->pst_mem_deemp_err_fx = extract_l( st->mem_error ); move16(); - pop_wmops(); /*push_wmops( "ICD TCX" );*/ } IF( EQ_16( st->core, HQ_CORE ) ) { - push_wmops( "ICD HQ decoding" ); /* HQ core decoder */ Word16 Q_output; @@ -643,7 +634,6 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 - pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ } /*---------------------------------------------------------------------* @@ -660,8 +650,8 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 } - } /* n_channels loop */ - pop_wmops(); /*push_wmops( "ICD Coredec" );*/ + } /* n_channels loop */ + /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Decoding @@ -669,7 +659,6 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) ) { - push_wmops( "ICD jTCX Coredec" ); /* active-frame decoding */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) ) { @@ -798,7 +787,6 @@ ivas_error ivas_core_dec_fx( } } } - pop_wmops(); /*push_wmops( "ICD jTCX Coredec" );*/ } /*---------------------------------------------------------------------* @@ -808,7 +796,6 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hStereoCng != NULL ) { - push_wmops( "ICD Stereo CNG Updates" ); /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ Word16 Q_c_PS_LT, Q_output; Word32 c_PS_LT_fx; @@ -824,14 +811,12 @@ ivas_error ivas_core_dec_fx( stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx ); - pop_wmops(); /*push_wmops( "ICD Stereo CNG Updates" );*/ } /*---------------------------------------------------------------------* * Postprocessing, BWEs and updates *---------------------------------------------------------------------*/ - push_wmops( "ICD Postproc, BWE, updates (ICD PP)" ); FOR( n = 0; n < n_channels; n++ ) { st = sts[n]; @@ -842,7 +827,6 @@ ivas_error ivas_core_dec_fx( * TD-BWE for ACELP to TCX transitions *---------------------------------------------------------------------*/ - push_wmops( "ICD PP TDBWE ACELPTCX trans" ); /*core_switching_post_dec*/ Q_synth = sub( 15, e_sig[0] ); @@ -916,12 +900,11 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) ); } - pop_wmops(); /*push_wmops( "ICD PP TDBWE ACELPTCX trans" );*/ /*---------------------------------------------------------------------* * Postprocessing for ACELP/MDCT core switching *---------------------------------------------------------------------*/ - push_wmops( "ICD PP ACELP/MDCT switch" ); + /* save synth and output in case of SBA DirAC stereo output as core switching is done outside of core decoder */ test(); test(); @@ -956,12 +939,11 @@ ivas_error ivas_core_dec_fx( { Copy( sts[0]->previoussynth_fx, sts[1]->previoussynth_fx, st->hTcxDec->L_frameTCX ); } - pop_wmops(); /*push_wmops( "ICD PP ACELP/MDCT switch" );*/ /*---------------------------------------------------------------------* * Pre-processing for bandwidth switching *---------------------------------------------------------------------*/ - push_wmops( "ICD PP BWswitch preproc" ); + ivas_bw_switching_pre_proc_fx( st, last_element_brate, nchan_out, old_syn_12k8_16k_fx[n], old_syn_fx, q_audio ); IF( st->hHQ_core == NULL ) @@ -1008,13 +990,12 @@ ivas_error ivas_core_dec_fx( hBWE_FD->prev_flag = hBWE_FD->prev_flag; move16(); } - pop_wmops(); /*push_wmops( "ICD PP BWswitch preproc" );*/ /*---------------------------------------------------------------------* * WB TBE decoding * WB BWE decoding *---------------------------------------------------------------------*/ - push_wmops( "ICD PP TBE/BWE" ); + Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; Word16 Q_syn_hb, sf; @@ -1042,9 +1023,8 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( st->extl, WB_TBE ) ) { /* WB TBE decoder */ - push_wmops( "ICD PP TBE/BWE wb_tbe_dec" ); + ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_tbe_dec" );*/ } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && st->bws_cnt == 0 && st->extl_brate == 0 ) { @@ -1052,10 +1032,8 @@ ivas_error ivas_core_dec_fx( } ELSE IF( EQ_16( st->extl, WB_BWE ) && st->bws_cnt == 0 ) { - push_wmops( "ICD PP TBE/BWE wb_bwe_dec" ); /* WB BWE decoder */ Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_16_fx[n], hb_synth_16_fx[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_bwe_dec" );*/ } /* Memories Re-Scaling */ @@ -1099,10 +1077,8 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) { - push_wmops( "ICD PP TBE/BWE swb_tbe_dec" ); /* SWB TBE decoder */ ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec" );*/ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11 Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx @@ -1117,22 +1093,18 @@ ivas_error ivas_core_dec_fx( /* FB TBE decoder */ IF( EQ_16( st->extl, FB_TBE ) ) { - push_wmops( "ICD PP TBE/BWE fb_tbe_dec" ); fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE fb_tbe_dec" );*/ } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) { /* SWB BWE decoder */ - push_wmops( "ICD PP TBE/BWE swb_bwe_dec" ); Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ + Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11 Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE" );*/ /*---------------------------------------------------------------------* * FEC - recovery after lost HQ core (smoothing of the BWE component) @@ -1171,7 +1143,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( GE_16( output_frame, L_FRAME32k ) && st->hTdCngDec != NULL ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && GE_16( st->bwidth, SWB ) && st->hTdCngDec != NULL ) ) { - push_wmops( "ICD PP SWB CNG" ); /* SHB CNG decoder */ Word16 synth_fxl[960]; /* Q-2 */ Word16 q; @@ -1193,7 +1164,6 @@ ivas_error ivas_core_dec_fx( Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ) ); // Q0 Copy_Scale_sig_16_32_no_sat( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ) ); - pop_wmops(); /* push_wmops( "ICD PP SWB CNG" );*/ } /*-------------------------------------------------------------------* @@ -1203,7 +1173,6 @@ ivas_error ivas_core_dec_fx( test(); IF( n == 0 && GE_16( st->element_mode, IVAS_CPE_DFT ) ) { - push_wmops( "ICD PP IC-BWE" ); Word16 q; q = 11; move16(); @@ -1225,12 +1194,10 @@ ivas_error ivas_core_dec_fx( Scale_sig32( hb_synth_32_fx[0], output_frame, sub( Q11, q ) ); // Q11 Scale_sig32( hb_synth_32_fx[1], output_frame, sub( Q11, q ) ); // Q11 } - pop_wmops(); /*push_wmops( "ICD PP IC-BWE" );*/ } IF( EQ_16( st->element_mode, EVS_MONO ) ) { - push_wmops( "ICD PP BFI" ); /*----------------------------------------------------------------* * BFI waveform adjustment *----------------------------------------------------------------*/ @@ -1258,7 +1225,6 @@ ivas_error ivas_core_dec_fx( st->hPlcInfo->Pitch_fx = 0; move16(); } - pop_wmops(); /*push_wmops( "ICD PP BFI" );*/ } /*----------------------------------------------------------------* @@ -1271,7 +1237,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( NE_16( st->extl, -1 ) && ( NE_16( st->extl, IGF_BWE ) || st->last_core == ACELP_CORE ) ) || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) { - push_wmops( "ICD PP Sync BWE" ); /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ IF( EQ_16( st->L_frame, L_FRAME ) ) { @@ -1425,7 +1390,6 @@ ivas_error ivas_core_dec_fx( st->hTdCngDec->last_shb_ener_fx_32 = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/ move32(); } - pop_wmops(); /*push_wmops( "ICD PP Sync BWE" );*/ } test(); @@ -1441,7 +1405,7 @@ ivas_error ivas_core_dec_fx( * - core switching in DFT stereo * - updates for potential TD->DFT stereo switching *----------------------------------------------------------------*/ - push_wmops( "ICD PP TCXLTP" ); + IF( st->hHQ_core != NULL ) { Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 @@ -1498,7 +1462,6 @@ ivas_error ivas_core_dec_fx( } Copy32( synth_32_fx[n], output_32_fx[n], output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TCXLTP" );*/ /*--------------------------------------------------------* * Common updates @@ -1507,7 +1470,6 @@ ivas_error ivas_core_dec_fx( Word16 exp_max; Word32 output_fx_loc[L_FRAME48k]; - push_wmops( "ICD PP commonupdates" ); exp_max = 0; move16(); @@ -1562,8 +1524,6 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0 - pop_wmops(); /*push_wmops( "ICD PP commonupdates" );*/ - } /* n_channels loop */ FOR( n = 0; n < n_channels; n++ ) @@ -1582,7 +1542,7 @@ ivas_error ivas_core_dec_fx( move16(); } } - pop_wmops(); /*push_wmops( "ICD Postproc, BWE, updates (ICD PP)" );*/ + pop_wmops(); return error; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 4745bc5f0..93e8bb4eb 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -96,13 +96,12 @@ ivas_error ivas_jbm_dec_tc_fx( CPE_DEC_HANDLE hCPE; SCE_DEC_HANDLE hSCE; - push_wmops( "ivas_jbm_dec_tc (JBM)" ); + push_wmops( "ivas_jbm_dec_tc" ); /*----------------------------------------------------------------* * Initialization of local vars after struct has been set *----------------------------------------------------------------*/ - push_wmops( "JBM init" ); output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; @@ -135,7 +134,7 @@ ivas_error ivas_jbm_dec_tc_fx( } Word16 ch; - pop_wmops(); /*push_wmops( "JBM init" );*/ + /*----------------------------------------------------------------* * Decoding + pre-rendering @@ -153,7 +152,6 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { - push_wmops( "JBM STEREO" ); st_ivas->hCPE[0]->element_brate = ivas_total_brate; move32(); Word16 q_output = 11; @@ -194,11 +192,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 } } - pop_wmops(); /*push_wmops( "JBM STEREO" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { - push_wmops( "JBM ISM" ); /* Metadata decoding and configuration */ test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) @@ -283,11 +279,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops(); /*push_wmops( "JBM ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { - push_wmops( "JBM SBA/MASA" ); set16_fx( nb_bits_metadata, 0, MAX_SCE ); @@ -694,11 +688,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops(); /*push_wmops( "JBM SBA/MASA" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - push_wmops( "JBM MASA_ISM" ); Word16 nchan_ism, nchan_transport_ism; Word16 dirac_bs_md_write_idx; @@ -829,11 +821,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); // Q11 } } - pop_wmops(); /*push_wmops( "JBM MASA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - push_wmops( "JBM SBA_ISM" ); Word16 nchan_ism, sba_ch_idx; set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); @@ -1102,11 +1092,10 @@ ivas_error ivas_jbm_dec_tc_fx( v_add_32( p_output_fx[n], p_output_fx[n + s_max( nchan_out, nchan_ism )], p_output_fx[n], output_frame ); } } - pop_wmops(); /*push_wmops( "JBM SBA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - push_wmops( "JBM MC" ); + // st = (st_ivas->nSCE > 0) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; IF( st_ivas->nSCE > 0 ) { @@ -1479,7 +1468,6 @@ ivas_error ivas_jbm_dec_tc_fx( ivas_mono_stereo_downmix_mcmasa_fx( st_ivas, p_output_fx, output_frame ); } } - pop_wmops(); /*push_wmops( "JBM MC" );*/ } /*----------------------------------------------------------------* @@ -1488,9 +1476,7 @@ ivas_error ivas_jbm_dec_tc_fx( IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 1 ) ) { - push_wmops( "JBM syn_out" ); ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); - pop_wmops(); /*push_wmops( "JBM syn_out" );*/ } ELSE { diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index 4acfcf6d9..c7bc98566 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,22 +904,8 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); -#endif FOR( i = 0; i < winLen_fx; i++ ) { -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ - L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ - tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ - move32(); - if ( LE_16( alpha_fx, winSlope_fx_ ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ - } -#else L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ @@ -929,7 +915,6 @@ void stereo_icBWE_dec_fx( { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } -#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 36a499f7d..1b51a29fb 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4713,9 +4713,7 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - push_wmops( "synthesise_fb_high_band" ); synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); - pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) @@ -5519,7 +5517,6 @@ void ivas_swb_tbe_dec_fx( hBWE_TD = st->hBWE_TD; - /* initializations */ GainFrame_fx = 0; move32(); @@ -6330,7 +6327,6 @@ void ivas_swb_tbe_dec_fx( } } ener_fx = s_max( 1, round_fx_sat( L_shl_sat( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ - /* WB/SWB bandwidth switching */ IF( st->bws_cnt > 0 ) { @@ -6648,6 +6644,7 @@ void ivas_swb_tbe_dec_fx( hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc; move16(); + /* Gain shape smoothing after quantization */ test(); IF( EQ_32( st->extl_brate, SWB_TBE_1k10 ) || EQ_32( st->extl_brate, SWB_TBE_1k75 ) ) @@ -6997,16 +6994,11 @@ void ivas_swb_tbe_dec_fx( move32(); } - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" ); - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" ); - /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ GenSHBSynth_fx32( shaped_shb_excitation_fx_32, error_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->L_frame, &( hBWE_TD->syn_dm_phase ) ); Copy_Scale_sig_32_16( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 2 * ALLPASSSECTIONS_STEEP, -( Q11 - Q_bwe_exc ) ); Copy32( error_fx + L_FRAME32k - L_SHB_TRANSITION_LENGTH, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" ); /* resample SHB synthesis (if needed) and scale down */ synth_scale_fx = 32767; move16(); /* 1.0 in Q15 */ @@ -7030,24 +7022,14 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); - -#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 - Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 -#endif - FOR( i = 0; i < L_FRAME16k; i++ ) { -#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } -#else - Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ -#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); @@ -7110,9 +7092,7 @@ void ivas_swb_tbe_dec_fx( Decimate_allpass_steep_fx32( error_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, synth_fx ); } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" ); /* Update previous frame parameters for FEC */ Copy( lsf_shb_fx, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER ); IF( EQ_16( st->codec_mode, MODE1 ) ) @@ -7149,9 +7129,6 @@ void ivas_swb_tbe_dec_fx( move16(); hBWE_TD->prev_Qx = Q_bwe_exc; move16(); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" );*/ - - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" );*/ return; } -- GitLab From c1ec7869b0f26b14b17860ff4cc0649b3b3461d3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 14:15:20 +0000 Subject: [PATCH 0139/1310] --- revert MORE chenges--- --- lib_com/swb_tbe_com_fx.c | 26 +++++++++++++------------- lib_com/tools_fx.c | 12 ++++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 25c6c32bf..2a2841966 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6763,19 +6763,19 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 15bba151e..5219d076c 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -795,12 +795,12 @@ void Copy_Scale_sig_16_32_no_sat( return; } L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - FOR( i = 0; i < lg; i++ ) - { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ - } + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* saturation can occur here */ + } } void Copy_Scale_sig_32_16( -- GitLab From 1eb52db50774f77743f15e2f5a9c9cd60c16db24 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 09:43:46 +0200 Subject: [PATCH 0140/1310] Revert "--- revert MORE chenges---" This reverts commit c1ec7869b0f26b14b17860ff4cc0649b3b3461d3. --- lib_com/swb_tbe_com_fx.c | 26 +++++++++++++------------- lib_com/tools_fx.c | 12 ++++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2a2841966..25c6c32bf 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6763,19 +6763,19 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 5219d076c..15bba151e 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -795,12 +795,12 @@ void Copy_Scale_sig_16_32_no_sat( return; } L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - FOR( i = 0; i < lg; i++ ) - { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ - } + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* saturation can occur here */ + } } void Copy_Scale_sig_32_16( -- GitLab From fbca4d3889480434d04fc303b144b31d9985c98f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 09:44:08 +0200 Subject: [PATCH 0141/1310] Revert " --- revert ALL changes ---" This reverts commit b677480fe59ceaf1b9345a10cafe36f50e122418. --- lib_com/options.h | 16 +- lib_com/swb_tbe_com_fx.c | 278 ++++++++++++++++++++++++++++- lib_com/tools_fx.c | 24 +++ lib_dec/ivas_core_dec_fx.c | 62 +++++-- lib_dec/ivas_jbm_dec_fx.c | 20 ++- lib_dec/ivas_stereo_icbwe_dec_fx.c | 15 ++ lib_dec/swb_tbe_dec_fx.c | 25 ++- 7 files changed, 419 insertions(+), 21 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4653bb460..1efda0251 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -/*#define WMOPS*/ /* Activate complexity and memory counters */ +//#define WMOPS /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -78,4 +78,18 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT + +// new speedups +//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // 0.4 WMOPS - BE? + +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | + +//----------------------------------------------------------------------- +// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 25c6c32bf..500e2fd02 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -18,6 +18,7 @@ #define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ + /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ @@ -6692,7 +6693,6 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ - void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -6704,8 +6704,9 @@ void elliptic_bpf_48k_generic_fx( { Word16 i, j; Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; + Word32 L_output[L_FRAME48k]; FOR( i = 0; i < 4; i++ ) { @@ -6721,6 +6722,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6763,6 +6765,176 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + { + Word64 W_tmpX; + Word64 W_tmpY; + i = 4; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + FOR( ; i < L_FRAME48k; ) + { + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //2 + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); // 3 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //4 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //5 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); // 3 + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //4 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //5 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //4 + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //5 + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); // 6 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //7 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } + } + ELSE +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ + { + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + move32(); + } + } + +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + { + i = 4; + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + FOR( ; i < L_FRAME48k; ) + { + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } + } + ELSE +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ + { FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6776,6 +6948,9 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } + } +#endif + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6830,6 +7005,28 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6844,7 +7041,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } - +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -6913,7 +7110,29 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -6931,6 +7150,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } +#endif memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -6998,12 +7218,13 @@ void synthesise_fb_high_band_fx( { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; - Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; + Word16 tmp[L_FRAME48k]; + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" ); /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7019,6 +7240,7 @@ void synthesise_fb_high_band_fx( } exp_tmp = sub( Q_fb_exc, 2 ); + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" ); IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ @@ -7029,8 +7251,11 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } - temp1 = sum2_fx_mod( tmp, L_FRAME48k ); + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); + temp1 = sum2_fx_mod( tmp, L_FRAME48k ); L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); @@ -7073,6 +7298,47 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { +#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx + L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ + Word32 L_tmp32; + Word16 tmp16; + + if ( L_tmp < 0 ) + { + L_tmp32 = L_negate( L_tmp ); + } + if ( L_tmp < 0 ) + { + L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); + } + if ( L_tmp < 0 ) + { + tmp16 = extract_h( L_tmp32 ); + } + if ( L_tmp < 0 ) + { + tmp16 = negate( tmp16 ); + } + + if ( L_tmp == 0 ) + { + tmp16 = 0; + move16(); + } + + if ( L_tmp > 0 ) + { + L_tmp32 = L_shl_sat( L_tmp, tmp3 ); + } + if ( L_tmp > 0 ) + { + tmp16 = extract_h( L_tmp32 ); + } + + output[i] = tmp16; + move16(); + +#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7084,7 +7350,9 @@ void synthesise_fb_high_band_fx( output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); } +#endif } + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; } diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 15bba151e..d5ec36928 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,13 +794,37 @@ void Copy_Scale_sig_16_32_no_sat( } return; } +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); + + IF( L_tmp >= 0x7FFF ) + { FOR( i = 0; i < lg; i++ ) { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); move32(); /* saturation can occur here */ } + return; + } + // ELSE + { + // Word16 tmp = extract_l( L_tmp ); + FOR( i = 0; i < lg; i++ ) + { + y[i] = L_mult( x[i], L_tmp ); + move32(); /* saturation can occur here */ + } + } +#else + L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* saturation can occur here */ + } +#endif } void Copy_Scale_sig_32_16( diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 03f0e4b40..db6dad33f 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -116,12 +116,12 @@ ivas_error ivas_core_dec_fx( error = IVAS_ERR_OK; move32(); - push_wmops( "ivas_core_dec" ); + push_wmops( "ivas_core_dec (ICD)" ); /*------------------------------------------------------------------* * General initialization *-----------------------------------------------------------------*/ - + push_wmops( "ICD init" ); use_cldfb_for_dft = 0; move16(); tdm_LRTD_flag = -1; @@ -370,7 +370,9 @@ ivas_error ivas_core_dec_fx( { save_hb_synth_32_fx = NULL; } + pop_wmops(); /*push_wmops( "ICD init" );*/ + push_wmops( "ICD SID, sanity" ); /*------------------------------------------------------------------* * Decode SID for MDCT-Stereo DTX mode *-----------------------------------------------------------------*/ @@ -398,7 +400,9 @@ ivas_error ivas_core_dec_fx( { ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps ); } + pop_wmops(); /*push_wmops( "ICD SID, sanity" );*/ + push_wmops( "ICD Coredec" ); /*------------------------------------------------------------------* * Core Decoding *-----------------------------------------------------------------*/ @@ -483,6 +487,7 @@ ivas_error ivas_core_dec_fx( IF( st->core == ACELP_CORE ) { + push_wmops( "ICD ACELP" ); /* ACELP core decoder */ Word16 old_syn_12k8_16k_fx_16[L_FRAME16k]; Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx; @@ -555,6 +560,7 @@ ivas_error ivas_core_dec_fx( } Copy_Scale_sig_16_32_DEPREC( old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n], L_FRAME16k, Q11 - ( -Q1 ) ); // Q(11 - (-1)) + pop_wmops(); /*push_wmops( "ICD ACELP" );*/ } Copy_Scale_sig_32_16( st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0 ); // Q0 @@ -563,6 +569,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { + push_wmops( "ICD TCX" ); Word16 Qsyn_temp; IVAS_FORMAT ivas_format; @@ -617,10 +624,12 @@ ivas_error ivas_core_dec_fx( } st->hBPF->pst_mem_deemp_err_fx = extract_l( st->mem_error ); move16(); + pop_wmops(); /*push_wmops( "ICD TCX" );*/ } IF( EQ_16( st->core, HQ_CORE ) ) { + push_wmops( "ICD HQ decoding" ); /* HQ core decoder */ Word16 Q_output; @@ -634,6 +643,7 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 + pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ } /*---------------------------------------------------------------------* @@ -650,8 +660,8 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 } - } /* n_channels loop */ - + } /* n_channels loop */ + pop_wmops(); /*push_wmops( "ICD Coredec" );*/ /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Decoding @@ -659,6 +669,7 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) ) { + push_wmops( "ICD jTCX Coredec" ); /* active-frame decoding */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) ) { @@ -787,6 +798,7 @@ ivas_error ivas_core_dec_fx( } } } + pop_wmops(); /*push_wmops( "ICD jTCX Coredec" );*/ } /*---------------------------------------------------------------------* @@ -796,6 +808,7 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hStereoCng != NULL ) { + push_wmops( "ICD Stereo CNG Updates" ); /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ Word16 Q_c_PS_LT, Q_output; Word32 c_PS_LT_fx; @@ -811,12 +824,14 @@ ivas_error ivas_core_dec_fx( stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx ); + pop_wmops(); /*push_wmops( "ICD Stereo CNG Updates" );*/ } /*---------------------------------------------------------------------* * Postprocessing, BWEs and updates *---------------------------------------------------------------------*/ + push_wmops( "ICD Postproc, BWE, updates (ICD PP)" ); FOR( n = 0; n < n_channels; n++ ) { st = sts[n]; @@ -827,6 +842,7 @@ ivas_error ivas_core_dec_fx( * TD-BWE for ACELP to TCX transitions *---------------------------------------------------------------------*/ + push_wmops( "ICD PP TDBWE ACELPTCX trans" ); /*core_switching_post_dec*/ Q_synth = sub( 15, e_sig[0] ); @@ -900,11 +916,12 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) ); } + pop_wmops(); /*push_wmops( "ICD PP TDBWE ACELPTCX trans" );*/ /*---------------------------------------------------------------------* * Postprocessing for ACELP/MDCT core switching *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP ACELP/MDCT switch" ); /* save synth and output in case of SBA DirAC stereo output as core switching is done outside of core decoder */ test(); test(); @@ -939,11 +956,12 @@ ivas_error ivas_core_dec_fx( { Copy( sts[0]->previoussynth_fx, sts[1]->previoussynth_fx, st->hTcxDec->L_frameTCX ); } + pop_wmops(); /*push_wmops( "ICD PP ACELP/MDCT switch" );*/ /*---------------------------------------------------------------------* * Pre-processing for bandwidth switching *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP BWswitch preproc" ); ivas_bw_switching_pre_proc_fx( st, last_element_brate, nchan_out, old_syn_12k8_16k_fx[n], old_syn_fx, q_audio ); IF( st->hHQ_core == NULL ) @@ -990,12 +1008,13 @@ ivas_error ivas_core_dec_fx( hBWE_FD->prev_flag = hBWE_FD->prev_flag; move16(); } + pop_wmops(); /*push_wmops( "ICD PP BWswitch preproc" );*/ /*---------------------------------------------------------------------* * WB TBE decoding * WB BWE decoding *---------------------------------------------------------------------*/ - + push_wmops( "ICD PP TBE/BWE" ); Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; Word16 Q_syn_hb, sf; @@ -1023,8 +1042,9 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( st->extl, WB_TBE ) ) { /* WB TBE decoder */ - + push_wmops( "ICD PP TBE/BWE wb_tbe_dec" ); ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_tbe_dec" );*/ } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && st->bws_cnt == 0 && st->extl_brate == 0 ) { @@ -1032,8 +1052,10 @@ ivas_error ivas_core_dec_fx( } ELSE IF( EQ_16( st->extl, WB_BWE ) && st->bws_cnt == 0 ) { + push_wmops( "ICD PP TBE/BWE wb_bwe_dec" ); /* WB BWE decoder */ Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_16_fx[n], hb_synth_16_fx[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_bwe_dec" );*/ } /* Memories Re-Scaling */ @@ -1077,8 +1099,10 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) { + push_wmops( "ICD PP TBE/BWE swb_tbe_dec" ); /* SWB TBE decoder */ ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec" );*/ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11 Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx @@ -1093,18 +1117,22 @@ ivas_error ivas_core_dec_fx( /* FB TBE decoder */ IF( EQ_16( st->extl, FB_TBE ) ) { + push_wmops( "ICD PP TBE/BWE fb_tbe_dec" ); fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE fb_tbe_dec" );*/ } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) { /* SWB BWE decoder */ + push_wmops( "ICD PP TBE/BWE swb_bwe_dec" ); Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11 Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE" );*/ /*---------------------------------------------------------------------* * FEC - recovery after lost HQ core (smoothing of the BWE component) @@ -1143,6 +1171,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( GE_16( output_frame, L_FRAME32k ) && st->hTdCngDec != NULL ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && GE_16( st->bwidth, SWB ) && st->hTdCngDec != NULL ) ) { + push_wmops( "ICD PP SWB CNG" ); /* SHB CNG decoder */ Word16 synth_fxl[960]; /* Q-2 */ Word16 q; @@ -1164,6 +1193,7 @@ ivas_error ivas_core_dec_fx( Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ) ); // Q0 Copy_Scale_sig_16_32_no_sat( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ) ); + pop_wmops(); /* push_wmops( "ICD PP SWB CNG" );*/ } /*-------------------------------------------------------------------* @@ -1173,6 +1203,7 @@ ivas_error ivas_core_dec_fx( test(); IF( n == 0 && GE_16( st->element_mode, IVAS_CPE_DFT ) ) { + push_wmops( "ICD PP IC-BWE" ); Word16 q; q = 11; move16(); @@ -1194,10 +1225,12 @@ ivas_error ivas_core_dec_fx( Scale_sig32( hb_synth_32_fx[0], output_frame, sub( Q11, q ) ); // Q11 Scale_sig32( hb_synth_32_fx[1], output_frame, sub( Q11, q ) ); // Q11 } + pop_wmops(); /*push_wmops( "ICD PP IC-BWE" );*/ } IF( EQ_16( st->element_mode, EVS_MONO ) ) { + push_wmops( "ICD PP BFI" ); /*----------------------------------------------------------------* * BFI waveform adjustment *----------------------------------------------------------------*/ @@ -1225,6 +1258,7 @@ ivas_error ivas_core_dec_fx( st->hPlcInfo->Pitch_fx = 0; move16(); } + pop_wmops(); /*push_wmops( "ICD PP BFI" );*/ } /*----------------------------------------------------------------* @@ -1237,6 +1271,7 @@ ivas_error ivas_core_dec_fx( test(); IF( ( NE_16( st->extl, -1 ) && ( NE_16( st->extl, IGF_BWE ) || st->last_core == ACELP_CORE ) ) || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) { + push_wmops( "ICD PP Sync BWE" ); /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ IF( EQ_16( st->L_frame, L_FRAME ) ) { @@ -1390,6 +1425,7 @@ ivas_error ivas_core_dec_fx( st->hTdCngDec->last_shb_ener_fx_32 = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/ move32(); } + pop_wmops(); /*push_wmops( "ICD PP Sync BWE" );*/ } test(); @@ -1405,7 +1441,7 @@ ivas_error ivas_core_dec_fx( * - core switching in DFT stereo * - updates for potential TD->DFT stereo switching *----------------------------------------------------------------*/ - + push_wmops( "ICD PP TCXLTP" ); IF( st->hHQ_core != NULL ) { Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 @@ -1462,6 +1498,7 @@ ivas_error ivas_core_dec_fx( } Copy32( synth_32_fx[n], output_32_fx[n], output_frame ); + pop_wmops(); /*push_wmops( "ICD PP TCXLTP" );*/ /*--------------------------------------------------------* * Common updates @@ -1470,6 +1507,7 @@ ivas_error ivas_core_dec_fx( Word16 exp_max; Word32 output_fx_loc[L_FRAME48k]; + push_wmops( "ICD PP commonupdates" ); exp_max = 0; move16(); @@ -1524,6 +1562,8 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0 + pop_wmops(); /*push_wmops( "ICD PP commonupdates" );*/ + } /* n_channels loop */ FOR( n = 0; n < n_channels; n++ ) @@ -1542,7 +1582,7 @@ ivas_error ivas_core_dec_fx( move16(); } } - + pop_wmops(); /*push_wmops( "ICD Postproc, BWE, updates (ICD PP)" );*/ pop_wmops(); return error; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 93e8bb4eb..4745bc5f0 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -96,12 +96,13 @@ ivas_error ivas_jbm_dec_tc_fx( CPE_DEC_HANDLE hCPE; SCE_DEC_HANDLE hSCE; - push_wmops( "ivas_jbm_dec_tc" ); + push_wmops( "ivas_jbm_dec_tc (JBM)" ); /*----------------------------------------------------------------* * Initialization of local vars after struct has been set *----------------------------------------------------------------*/ + push_wmops( "JBM init" ); output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; @@ -134,7 +135,7 @@ ivas_error ivas_jbm_dec_tc_fx( } Word16 ch; - + pop_wmops(); /*push_wmops( "JBM init" );*/ /*----------------------------------------------------------------* * Decoding + pre-rendering @@ -152,6 +153,7 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { + push_wmops( "JBM STEREO" ); st_ivas->hCPE[0]->element_brate = ivas_total_brate; move32(); Word16 q_output = 11; @@ -192,9 +194,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 } } + pop_wmops(); /*push_wmops( "JBM STEREO" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { + push_wmops( "JBM ISM" ); /* Metadata decoding and configuration */ test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) @@ -279,9 +283,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } + pop_wmops(); /*push_wmops( "JBM ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { + push_wmops( "JBM SBA/MASA" ); set16_fx( nb_bits_metadata, 0, MAX_SCE ); @@ -688,9 +694,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } + pop_wmops(); /*push_wmops( "JBM SBA/MASA" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { + push_wmops( "JBM MASA_ISM" ); Word16 nchan_ism, nchan_transport_ism; Word16 dirac_bs_md_write_idx; @@ -821,9 +829,11 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); // Q11 } } + pop_wmops(); /*push_wmops( "JBM MASA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { + push_wmops( "JBM SBA_ISM" ); Word16 nchan_ism, sba_ch_idx; set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); @@ -1092,10 +1102,11 @@ ivas_error ivas_jbm_dec_tc_fx( v_add_32( p_output_fx[n], p_output_fx[n + s_max( nchan_out, nchan_ism )], p_output_fx[n], output_frame ); } } + pop_wmops(); /*push_wmops( "JBM SBA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - + push_wmops( "JBM MC" ); // st = (st_ivas->nSCE > 0) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; IF( st_ivas->nSCE > 0 ) { @@ -1468,6 +1479,7 @@ ivas_error ivas_jbm_dec_tc_fx( ivas_mono_stereo_downmix_mcmasa_fx( st_ivas, p_output_fx, output_frame ); } } + pop_wmops(); /*push_wmops( "JBM MC" );*/ } /*----------------------------------------------------------------* @@ -1476,7 +1488,9 @@ ivas_error ivas_jbm_dec_tc_fx( IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 1 ) ) { + push_wmops( "JBM syn_out" ); ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); + pop_wmops(); /*push_wmops( "JBM syn_out" );*/ } ELSE { diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index c7bc98566..4acfcf6d9 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,8 +904,22 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); +#endif FOR( i = 0; i < winLen_fx; i++ ) { +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ + L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ + tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ + move32(); + if ( LE_16( alpha_fx, winSlope_fx_ ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ + } +#else L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ @@ -915,6 +929,7 @@ void stereo_icBWE_dec_fx( { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } +#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1b51a29fb..36a499f7d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4713,7 +4713,9 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ + push_wmops( "synthesise_fb_high_band" ); synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) @@ -5517,6 +5519,7 @@ void ivas_swb_tbe_dec_fx( hBWE_TD = st->hBWE_TD; + /* initializations */ GainFrame_fx = 0; move32(); @@ -6327,6 +6330,7 @@ void ivas_swb_tbe_dec_fx( } } ener_fx = s_max( 1, round_fx_sat( L_shl_sat( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ + /* WB/SWB bandwidth switching */ IF( st->bws_cnt > 0 ) { @@ -6644,7 +6648,6 @@ void ivas_swb_tbe_dec_fx( hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc; move16(); - /* Gain shape smoothing after quantization */ test(); IF( EQ_32( st->extl_brate, SWB_TBE_1k10 ) || EQ_32( st->extl_brate, SWB_TBE_1k75 ) ) @@ -6994,11 +6997,16 @@ void ivas_swb_tbe_dec_fx( move32(); } + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" ); + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" ); + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ GenSHBSynth_fx32( shaped_shb_excitation_fx_32, error_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->L_frame, &( hBWE_TD->syn_dm_phase ) ); Copy_Scale_sig_32_16( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 2 * ALLPASSSECTIONS_STEEP, -( Q11 - Q_bwe_exc ) ); Copy32( error_fx + L_FRAME32k - L_SHB_TRANSITION_LENGTH, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH ); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" );*/ + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" ); /* resample SHB synthesis (if needed) and scale down */ synth_scale_fx = 32767; move16(); /* 1.0 in Q15 */ @@ -7022,14 +7030,24 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); + +#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 + Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 +#endif + FOR( i = 0; i < L_FRAME16k; i++ ) { +#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } +#else + Word16 idx; + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ +#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); @@ -7092,7 +7110,9 @@ void ivas_swb_tbe_dec_fx( Decimate_allpass_steep_fx32( error_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, synth_fx ); } + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" );*/ + push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" ); /* Update previous frame parameters for FEC */ Copy( lsf_shb_fx, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER ); IF( EQ_16( st->codec_mode, MODE1 ) ) @@ -7129,6 +7149,9 @@ void ivas_swb_tbe_dec_fx( move16(); hBWE_TD->prev_Qx = Q_bwe_exc; move16(); + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" );*/ + + pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" );*/ return; } -- GitLab From 7a6eb577a26e04425f2a6c66e9ffd76532f39b01 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 09:41:08 +0200 Subject: [PATCH 0142/1310] Revert "correct instrumentation (should be BE)" This reverts commit 32c9de3dcce4d724aafddc804b12b21cee389d5f. -- GitLab From 56152c372114fb80bec10df6f3f3c3795ad76702 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 09:52:14 +0200 Subject: [PATCH 0143/1310] correct instrumentation --- lib_com/options.h | 21 +++++++++++---------- lib_com/tools_fx.c | 6 +++--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1efda0251..a95d04541 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -//#define WMOPS /* Activate complexity and memory counters */ +#define WMOPS /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -80,15 +80,16 @@ //#define HARM_SCE_INIT // new speedups -//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // 0.4 WMOPS - BE? - -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | > 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | < TODO: check border cases +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS according pipe +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | + +//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? +// +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index d5ec36928..b04f3b84e 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -809,11 +809,11 @@ void Copy_Scale_sig_16_32_no_sat( } // ELSE { - // Word16 tmp = extract_l( L_tmp ); + Word16 tmp = extract_l( L_tmp ); FOR( i = 0; i < lg; i++ ) { - y[i] = L_mult( x[i], L_tmp ); - move32(); /* saturation can occur here */ + y[i] = L_mult( x[i], tmp ); + move32(); } } #else -- GitLab From 82c2d8ee7a0bef0bfb878a72cfcb59a9027dd6d0 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 09:52:47 +0200 Subject: [PATCH 0144/1310] activated all BE changes, including new FIX_1439_SPEEDUP_synthesise_fb_high_band_fx for BE testing --- lib_com/options.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a95d04541..54f4ea2d9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -85,8 +85,8 @@ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? -// +#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? + //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | -- GitLab From c30db7ccc5f31879c9bc68d757c2a5973fb8bffe Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 3 Apr 2025 10:21:57 +0200 Subject: [PATCH 0145/1310] Fix for 3GPP issue 1348: Increased noise level in BASOP decoder for band-limited input from float encoder Link #1348 --- lib_com/options.h | 3 +- lib_dec/dec_tcx_fx.c | 79 ++++++++++++++++++++++++++++++++- lib_dec/hq_core_dec_fx.c | 4 ++ lib_dec/ivas_mdct_core_dec_fx.c | 12 +++++ lib_dec/stat_dec.h | 4 ++ 5 files changed, 99 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4f818e0c3..8fb6cf9df 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -69,6 +69,5 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ //#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ +#define FIX_1348_BIT_PRECISION_IMPROVEMENT #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index af80ee1f5..7a8a24185 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2601,6 +2601,9 @@ void IMDCT_ivas_fx( const Word16 frame_cnt, const Word16 bfi, Word16 *old_out_fx, // Q(-2) +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Word16 *q_old_out_fx, +#endif const Word16 FB_flag, Decoder_State *st, const Word16 fullbandScale, @@ -2862,9 +2865,16 @@ void IMDCT_ivas_fx( move16(); Word16 diff = sub( q_tmp_fx_32, q_win ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); +#endif FOR( Word16 ind = 0; ind < L_frame; ind++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + old_out_fx_32[ind] = L_shl( old_out_fx[ind], q_old_out_diff ); +#else old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff ); +#endif move32(); } @@ -2872,7 +2882,11 @@ void IMDCT_ivas_fx( FOR( Word16 ind = 0; ind < L_frame; ind++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], q_old_out_diff ) ); +#else old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) ); +#endif xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) ); move16(); move16(); @@ -2880,7 +2894,12 @@ void IMDCT_ivas_fx( } ELSE { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Scale_sig32( x_fx, L_frame, 1 ); + q_xn_buf_fx_32 ++; +#else Word16 q_old_out = q_win; +#endif move16(); edct_fx( x_fx, xn_buf_fx_32 + add( shr( overlap, 1 ), nz ), L_frame, &q_xn_buf_fx_32 ); Word16 res_m, res_e; @@ -2904,15 +2923,21 @@ void IMDCT_ivas_fx( move16(); } +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + window_ola_fx( tmp_fx_32, xn_buf_fx, &q_tmp_fx_32, old_out_fx, q_old_out_fx, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); +#else window_ola_fx( tmp_fx_32, xn_buf_fx, &q_tmp_fx_32, old_out_fx, &q_old_out, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); q_diff = sub( q_old_out, q_win ); +#endif Word16 diff = sub( q_tmp_fx_32, q_win ); FOR( Word16 ind = 0; ind < L_frame; ind++ ) { +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT old_out_fx[ind] = shr_sat( old_out_fx[ind], q_diff ); move16(); +#endif xn_buf_fx[ind] = shr_sat( xn_buf_fx[ind], diff ); move16(); } @@ -3004,9 +3029,18 @@ void IMDCT_ivas_fx( IF( hTcxCfg->last_aldo != 0 ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Word16 tmp_old_out; + Word16 q_diff = sub( *q_old_out_fx, q_win ); +#endif FOR( i = 0; i < sub( overlap, tcx_mdct_window_min_length ); i++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); + xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], tmp_old_out ); // Q(-2) +#else xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], old_out_fx[( i + nz )] ); // Q(-2) +#endif move16(); } @@ -3019,17 +3053,32 @@ void IMDCT_ivas_fx( // tested FOR( ; i < overlap; i++ ) /* perfectly reconstructing ALDO shortening */ { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tmp_old_out ); // Q(-2) +#else xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], old_out_fx[( i + nz )] ); // Q(-2) +#endif move16(); } FOR( i = 0; i < ( tcx_mdct_window_min_length / 2 ); i++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) +#else xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) +#endif move16(); } FOR( ; i < tcx_mdct_window_min_length; i++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // Q(-2) +#else xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // Q(-2) +#endif move16(); } } @@ -3037,12 +3086,22 @@ void IMDCT_ivas_fx( { FOR( ; i < ( overlap - ( tcx_mdct_window_min_length / 2 ) ); i++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) +#else xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( old_out_fx[( i + nz )], tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) +#endif move16(); } FOR( ; i < overlap; i++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); + xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) +#else xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( old_out_fx[( i + nz )], tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) +#endif move16(); } } @@ -3091,7 +3150,9 @@ void IMDCT_ivas_fx( /* Compute windowed synthesis in case of switching to ALDO windows in next frame */ Copy( xn_buf_fx + sub( L_frame, nz ), old_out_fx, add( nz, overlap ) ); set16_fx( old_out_fx + add( nz, overlap ), 0, nz ); - +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + *q_old_out_fx = q_win; +#endif tcx_windowing_synthesis_past_frame( old_out_fx + nz, tcx_aldo_window_1_trunc_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, hTcxCfg->tcx_curr_overlap_mode ); /* If current overlap mode = FULL_OVERLAP -> ALDO_WINDOW */ @@ -5196,7 +5257,11 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->q_old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); +#else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); +#endif } /* Generate additional comfort noise to mask potential coding artefacts */ @@ -5218,7 +5283,11 @@ void decoder_tcx_imdct_fx( Copy32( x_fx, xn_bufFB_fx, s_max( L_spec, s_max( L_frame, L_frameTCX ) ) ); // q_x IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->q_old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); +#else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); +#endif } FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) @@ -5235,13 +5304,21 @@ void decoder_tcx_imdct_fx( { IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->q_old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); +#else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); +#endif } ELSE { IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->q_old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); +#else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); +#endif } FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 4d1ef6774..c4bbc3128 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -1202,6 +1202,10 @@ void HQ_core_dec_init_fx( hHQ_core->Q_old_wtda = 15; hHQ_core->Q_old_postdec = 0; hHQ_core->Q_old_wtda_LB = 0; +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hHQ_core->q_old_out_fx = 0; + hHQ_core->q_old_out_LB_fx = 0; +#endif move16(); move16(); move16(); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index fabebede4..6126ef44c 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1098,7 +1098,11 @@ void ivas_mdct_core_reconstruct_fx( Word16 *synthFB_fx; Word16 q_syn = 0; move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Word16 q_win = -1; +#else Word16 q_win = -2; +#endif move16(); /* TCX */ Word16 xn_buf_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; // Q(-2) @@ -1174,8 +1178,10 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_old_syn_Overl = q_win; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win +#endif Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win @@ -1206,6 +1212,10 @@ void ivas_mdct_core_reconstruct_fx( /* Note: these buffers are not subframe-based, hence no indexing with k */ set16_fx( &st->hHQ_core->old_out_LB_fx[0], 0, L_frame[ch] ); set16_fx( &st->hHQ_core->old_out_fx[0], 0, L_frameTCX[ch] ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hHQ_core->q_old_out_LB_fx = 0; + st->hHQ_core->q_old_out_fx = 0; +#endif set16_fx( &st->hTcxDec->syn_Overl[0], 0, shr( L_frame[ch], 1 ) ); set16_fx( &st->hTcxDec->syn_OverlFB[0], 0, shr( L_frameTCX[ch], 1 ) ); set16_fx( &st->hTcxDec->syn_Overl_TDAC[0], 0, shr( L_frame[ch], 1 ) ); @@ -1246,8 +1256,10 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn +#endif st->hHQ_core->Q_old_wtda = st->Q_syn; move16(); st->hHQ_core->Q_old_wtda_LB = st->Q_syn; diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index fcd5142a4..62ffa15b5 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -702,6 +702,10 @@ typedef struct hq_dec_structure Word16 exp_old_out; Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band */ Word32 old_out_LB_fx32[L_FRAME32k]; +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Word16 q_old_out_LB_fx; + Word16 q_old_out_fx; +#endif Word16 q_old_outLB_fx; Word16 Q_old_wtda_LB; Word16 Q_old_wtda; -- GitLab From 96bdfba5324b038e4d353f21a9945fe2d5b1f320 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 11:11:34 +0200 Subject: [PATCH 0146/1310] cleanup FIX_1439_SPEEDUP_stereo_icBWE_dec_fx --- lib_dec/ivas_stereo_icbwe_dec_fx.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index 4acfcf6d9..772eb2d7d 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -909,22 +909,17 @@ void stereo_icBWE_dec_fx( #endif FOR( i = 0; i < winLen_fx; i++ ) { -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx if ( LE_16( alpha_fx, winSlope_fx_ ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } #else - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ - L_tmp = L_mac0( L_tmp, sub( 32767 /* 1.0 in Q15*/, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); /* Q29 */ - tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ - move32(); IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ -- GitLab From 2a410ea1499da320a900a8317e8ae681cd03719d Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 3 Apr 2025 11:43:06 +0200 Subject: [PATCH 0147/1310] Applied formatting-fix.patch --- lib_dec/dec_tcx_fx.c | 14 +++++++------- lib_dec/ivas_mdct_core_dec_fx.c | 14 +++++++------- lib_dec/stat_dec.h | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 7a8a24185..e0dfcf2cb 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2872,7 +2872,7 @@ void IMDCT_ivas_fx( { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT old_out_fx_32[ind] = L_shl( old_out_fx[ind], q_old_out_diff ); -#else +#else old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff ); #endif move32(); @@ -2896,7 +2896,7 @@ void IMDCT_ivas_fx( { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig32( x_fx, L_frame, 1 ); - q_xn_buf_fx_32 ++; + q_xn_buf_fx_32++; #else Word16 q_old_out = q_win; #endif @@ -3039,7 +3039,7 @@ void IMDCT_ivas_fx( tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], tmp_old_out ); // Q(-2) #else - xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], old_out_fx[( i + nz )] ); // Q(-2) + xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], old_out_fx[( i + nz )] ); // Q(-2) #endif move16(); } @@ -3057,7 +3057,7 @@ void IMDCT_ivas_fx( tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tmp_old_out ); // Q(-2) #else - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], old_out_fx[( i + nz )] ); // Q(-2) + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], old_out_fx[( i + nz )] ); // Q(-2) #endif move16(); } @@ -3067,7 +3067,7 @@ void IMDCT_ivas_fx( tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) #else - xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) #endif move16(); } @@ -3090,7 +3090,7 @@ void IMDCT_ivas_fx( tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) #else - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( old_out_fx[( i + nz )], tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( old_out_fx[( i + nz )], tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) #endif move16(); } @@ -3100,7 +3100,7 @@ void IMDCT_ivas_fx( tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) #else - xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( old_out_fx[( i + nz )], tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) + xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( old_out_fx[( i + nz )], tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) #endif move16(); } diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 6126ef44c..7459b3789 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1176,11 +1176,11 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win st->hTcxDec->Q_old_syn_Overl = q_win; - Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win - Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win + Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win + Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT - Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win + Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win + Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win #endif Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win @@ -1213,7 +1213,7 @@ void ivas_mdct_core_reconstruct_fx( set16_fx( &st->hHQ_core->old_out_LB_fx[0], 0, L_frame[ch] ); set16_fx( &st->hHQ_core->old_out_fx[0], 0, L_frameTCX[ch] ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - st->hHQ_core->q_old_out_LB_fx = 0; + st->hHQ_core->q_old_out_LB_fx = 0; st->hHQ_core->q_old_out_fx = 0; #endif set16_fx( &st->hTcxDec->syn_Overl[0], 0, shr( L_frame[ch], 1 ) ); @@ -1257,8 +1257,8 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT - Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn + Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn + Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn #endif st->hHQ_core->Q_old_wtda = st->Q_syn; move16(); diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 62ffa15b5..a32bcfd6e 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -702,7 +702,7 @@ typedef struct hq_dec_structure Word16 exp_old_out; Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band */ Word32 old_out_LB_fx32[L_FRAME32k]; -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_old_out_LB_fx; Word16 q_old_out_fx; #endif -- GitLab From 59c183c9a1a4a3c4aaf4393b2ac487a68e48387f Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 3 Apr 2025 12:03:46 +0200 Subject: [PATCH 0148/1310] Changed IMDCT_ivas_fx() declaration. --- lib_com/prot_fx.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index ffd1d6032..114cc431c 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9848,6 +9848,9 @@ void IMDCT_ivas_fx( const Word16 frame_cnt, const Word16 bfi, Word16 *old_out_fx, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Word16 *q_old_out_fx, +#endif const Word16 FB_flag, Decoder_State *st, const Word16 fullbandScale, -- GitLab From 687d77c114b050a49db63ff0846dc226cc83d1cd Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 12:28:46 +0200 Subject: [PATCH 0149/1310] creating FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST --- lib_com/tools_fx.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index b04f3b84e..d004a14ee 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -759,14 +759,26 @@ void Copy_Scale_sig_16_32_DEPREC( move32(); /* saturation can occur here */ } } +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST +void Copy_Scale_sig_16_32_no_sat( + Word16 x[], /* i : signal to scale input Qx */ + Word32 y[], /* o : scaled signal output Qx */ + Word16 lg, /* i : size of x[] Q0 */ + const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ + ) +#else void Copy_Scale_sig_16_32_no_sat( const Word16 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ const Word16 lg, /* i : size of x[] Q0 */ const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ ) +#endif { + Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL @@ -795,27 +807,50 @@ void Copy_Scale_sig_16_32_no_sat( return; } #ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + lg = 1; + for (int i_exp = 0; i_exp < 35; i_exp++) + { + for ( short i_x = 0x8000; i_x < 0x7FFF; i_x ++) + { + L_tmp = L_shl_o( 1, i_exp - 1, &Overflow ); + +#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); +#endif IF( L_tmp >= 0x7FFF ) { FOR( i = 0; i < lg; i++ ) { +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + x[i] = i_x; +#endif // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); move32(); /* saturation can occur here */ } - return; } - // ELSE + ELSE { Word16 tmp = extract_l( L_tmp ); FOR( i = 0; i < lg; i++ ) { +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + x[i] = i_x; +#endif y[i] = L_mult( x[i], tmp ); move32(); } } +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST + int test = W_extract_l( W_mult_32_16( L_tmp, x[0] ) ); + + if ( test != y[0] ) + assert( 0 ); + } //i_x + } //i_exp +#endif #else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) -- GitLab From 244f515f8d7f88be03f30a8031c23c213bc7a414 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 12:29:16 +0200 Subject: [PATCH 0150/1310] Revert "creating FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST" This reverts commit 687d77c114b050a49db63ff0846dc226cc83d1cd. --- lib_com/tools_fx.c | 39 ++------------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index d004a14ee..b04f3b84e 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -759,26 +759,14 @@ void Copy_Scale_sig_16_32_DEPREC( move32(); /* saturation can occur here */ } } -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST - -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST -void Copy_Scale_sig_16_32_no_sat( - Word16 x[], /* i : signal to scale input Qx */ - Word32 y[], /* o : scaled signal output Qx */ - Word16 lg, /* i : size of x[] Q0 */ - const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ - ) -#else void Copy_Scale_sig_16_32_no_sat( const Word16 x[], /* i : signal to scale input Qx */ Word32 y[], /* o : scaled signal output Qx */ const Word16 lg, /* i : size of x[] Q0 */ const Word16 exp0 /* i : exponent: x = round(x << exp) Qx ?exp */ ) -#endif { - Word16 i; Word32 L_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL @@ -807,50 +795,27 @@ void Copy_Scale_sig_16_32_no_sat( return; } #ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST - lg = 1; - for (int i_exp = 0; i_exp < 35; i_exp++) - { - for ( short i_x = 0x8000; i_x < 0x7FFF; i_x ++) - { - L_tmp = L_shl_o( 1, i_exp - 1, &Overflow ); - -#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); -#endif IF( L_tmp >= 0x7FFF ) { FOR( i = 0; i < lg; i++ ) { -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST - x[i] = i_x; -#endif // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); move32(); /* saturation can occur here */ } + return; } - ELSE + // ELSE { Word16 tmp = extract_l( L_tmp ); FOR( i = 0; i < lg; i++ ) { -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST - x[i] = i_x; -#endif y[i] = L_mult( x[i], tmp ); move32(); } } -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat_TEST - int test = W_extract_l( W_mult_32_16( L_tmp, x[0] ) ); - - if ( test != y[0] ) - assert( 0 ); - } //i_x - } //i_exp -#endif #else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) -- GitLab From 775e4bc484c06a8a73fd35d4b8a7b3c4fce352a1 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 12:30:20 +0200 Subject: [PATCH 0151/1310] minor: comment --- lib_com/tools_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index b04f3b84e..756b5be80 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -803,7 +803,7 @@ void Copy_Scale_sig_16_32_no_sat( { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ + move32(); /* Overflow can occur here */ } return; } @@ -822,7 +822,7 @@ void Copy_Scale_sig_16_32_no_sat( { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ + move32(); /* Overflow can occur here */ } #endif } -- GitLab From aafc14a191f2b7d81aaddfd5d10fc71a2b715b6d Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 3 Apr 2025 13:52:20 +0200 Subject: [PATCH 0152/1310] Removed calculations using the dynamic q_old_out to check its effect on the pipeline tests. --- lib_com/options.h | 1 + lib_com/prot_fx.h | 2 +- lib_dec/dec_tcx_fx.c | 39 +++++++++++++++++---------------- lib_dec/hq_core_dec_fx.c | 2 +- lib_dec/ivas_mdct_core_dec_fx.c | 6 ++--- lib_dec/stat_dec.h | 2 +- 6 files changed, 27 insertions(+), 25 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 37634456b..b5a3bbb3e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,4 +79,5 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT #define FIX_1348_BIT_PRECISION_IMPROVEMENT +//#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 114cc431c..78e9f96c9 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9848,7 +9848,7 @@ void IMDCT_ivas_fx( const Word16 frame_cnt, const Word16 bfi, Word16 *old_out_fx, -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 *q_old_out_fx, #endif const Word16 FB_flag, diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index e0dfcf2cb..f3c84770f 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2601,7 +2601,7 @@ void IMDCT_ivas_fx( const Word16 frame_cnt, const Word16 bfi, Word16 *old_out_fx, // Q(-2) -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 *q_old_out_fx, #endif const Word16 FB_flag, @@ -2865,12 +2865,12 @@ void IMDCT_ivas_fx( move16(); Word16 diff = sub( q_tmp_fx_32, q_win ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); #endif FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD old_out_fx_32[ind] = L_shl( old_out_fx[ind], q_old_out_diff ); #else old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff ); @@ -2882,7 +2882,7 @@ void IMDCT_ivas_fx( FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], q_old_out_diff ) ); #else old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) ); @@ -2897,7 +2897,8 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig32( x_fx, L_frame, 1 ); q_xn_buf_fx_32++; -#else +#endif +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 q_old_out = q_win; #endif move16(); @@ -2923,7 +2924,7 @@ void IMDCT_ivas_fx( move16(); } -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD window_ola_fx( tmp_fx_32, xn_buf_fx, &q_tmp_fx_32, old_out_fx, q_old_out_fx, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); #else window_ola_fx( tmp_fx_32, xn_buf_fx, &q_tmp_fx_32, old_out_fx, &q_old_out, L_frame, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); @@ -2934,7 +2935,7 @@ void IMDCT_ivas_fx( Word16 diff = sub( q_tmp_fx_32, q_win ); FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD old_out_fx[ind] = shr_sat( old_out_fx[ind], q_diff ); move16(); #endif @@ -3029,13 +3030,13 @@ void IMDCT_ivas_fx( IF( hTcxCfg->last_aldo != 0 ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 tmp_old_out; Word16 q_diff = sub( *q_old_out_fx, q_win ); #endif FOR( i = 0; i < sub( overlap, tcx_mdct_window_min_length ); i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], tmp_old_out ); // Q(-2) #else @@ -3053,7 +3054,7 @@ void IMDCT_ivas_fx( // tested FOR( ; i < overlap; i++ ) /* perfectly reconstructing ALDO shortening */ { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tmp_old_out ); // Q(-2) #else @@ -3063,7 +3064,7 @@ void IMDCT_ivas_fx( } FOR( i = 0; i < ( tcx_mdct_window_min_length / 2 ); i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) #else @@ -3073,7 +3074,7 @@ void IMDCT_ivas_fx( } FOR( ; i < tcx_mdct_window_min_length; i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // Q(-2) #else @@ -3086,7 +3087,7 @@ void IMDCT_ivas_fx( { FOR( ; i < ( overlap - ( tcx_mdct_window_min_length / 2 ) ); i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) #else @@ -3096,7 +3097,7 @@ void IMDCT_ivas_fx( } FOR( ; i < overlap; i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) #else @@ -3150,7 +3151,7 @@ void IMDCT_ivas_fx( /* Compute windowed synthesis in case of switching to ALDO windows in next frame */ Copy( xn_buf_fx + sub( L_frame, nz ), old_out_fx, add( nz, overlap ) ); set16_fx( old_out_fx + add( nz, overlap ), 0, nz ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD *q_old_out_fx = q_win; #endif tcx_windowing_synthesis_past_frame( old_out_fx + nz, tcx_aldo_window_1_trunc_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, hTcxCfg->tcx_curr_overlap_mode ); @@ -5257,7 +5258,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->q_old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); @@ -5283,7 +5284,7 @@ void decoder_tcx_imdct_fx( Copy32( x_fx, xn_bufFB_fx, s_max( L_spec, s_max( L_frame, L_frameTCX ) ) ); // q_x IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->q_old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); @@ -5304,7 +5305,7 @@ void decoder_tcx_imdct_fx( { IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->q_old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); @@ -5314,7 +5315,7 @@ void decoder_tcx_imdct_fx( { IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->q_old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index c4bbc3128..7d2a3c7a5 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -1202,7 +1202,7 @@ void HQ_core_dec_init_fx( hHQ_core->Q_old_wtda = 15; hHQ_core->Q_old_postdec = 0; hHQ_core->Q_old_wtda_LB = 0; -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD hHQ_core->q_old_out_fx = 0; hHQ_core->q_old_out_LB_fx = 0; #endif diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 7459b3789..af37ce751 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1178,7 +1178,7 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_old_syn_Overl = q_win; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win #endif @@ -1212,7 +1212,7 @@ void ivas_mdct_core_reconstruct_fx( /* Note: these buffers are not subframe-based, hence no indexing with k */ set16_fx( &st->hHQ_core->old_out_LB_fx[0], 0, L_frame[ch] ); set16_fx( &st->hHQ_core->old_out_fx[0], 0, L_frameTCX[ch] ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD st->hHQ_core->q_old_out_LB_fx = 0; st->hHQ_core->q_old_out_fx = 0; #endif @@ -1256,7 +1256,7 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn #endif diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index a32bcfd6e..84f8d83bd 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -702,7 +702,7 @@ typedef struct hq_dec_structure Word16 exp_old_out; Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band */ Word32 old_out_LB_fx32[L_FRAME32k]; -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 q_old_out_LB_fx; Word16 q_old_out_fx; #endif -- GitLab From fa36afd7a872d440be20679e693a204d88930bf8 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 14:17:43 +0200 Subject: [PATCH 0153/1310] add FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST --- lib_com/swb_tbe_com_fx.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 500e2fd02..3cf8e88e9 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7295,14 +7295,24 @@ void synthesise_fb_high_band_fx( *prev_fbbwe_ratio = shr( ratio, 1 ); move16(); } +#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ +#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx Word32 L_tmp32; Word16 tmp16; - +#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST + Word32 L_tmp_a[5] = { 0x80000000, 0xC0000000, 0, 0x40000000, 0x7FFFFFFF}; + Word16 tmp3_a[15] = { -35, -32, -31, -15, -3, -1, 0, 1, 3, 15, 31, 32, 35 }; + for (int i_lta = 0; i_lta < 5; i_lta++) + for ( int i_t3a = 0; i_t3a < 13; i_t3a++ ) + { + L_tmp = L_tmp_a[i_lta]; + tmp3 = tmp3_a[i_t3a]; +#endif + if ( L_tmp < 0 ) { L_tmp32 = L_negate( L_tmp ); @@ -7334,12 +7344,29 @@ void synthesise_fb_high_band_fx( { tmp16 = extract_h( L_tmp32 ); } - +#ifndef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST output[i] = tmp16; move16(); +#else + IF( L_tmp < 0 ) + { + output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ + move16(); + } + ELSE + { + output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ + move16(); + } + if ( output[i] != tmp16 ) + assert( 0 ); +#endif + +#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST + } +#endif #else - L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ -- GitLab From ba2977a632ae81faa3fcacda2316a4644c052776 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 3 Apr 2025 14:17:56 +0200 Subject: [PATCH 0154/1310] Revert "add FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST" This reverts commit fa36afd7a872d440be20679e693a204d88930bf8. --- lib_com/swb_tbe_com_fx.c | 35 ++++------------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 3cf8e88e9..500e2fd02 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7295,24 +7295,14 @@ void synthesise_fb_high_band_fx( *prev_fbbwe_ratio = shr( ratio, 1 ); move16(); } -#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { - L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ #ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx + L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ Word32 L_tmp32; Word16 tmp16; -#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST - Word32 L_tmp_a[5] = { 0x80000000, 0xC0000000, 0, 0x40000000, 0x7FFFFFFF}; - Word16 tmp3_a[15] = { -35, -32, -31, -15, -3, -1, 0, 1, 3, 15, 31, 32, 35 }; - for (int i_lta = 0; i_lta < 5; i_lta++) - for ( int i_t3a = 0; i_t3a < 13; i_t3a++ ) - { - L_tmp = L_tmp_a[i_lta]; - tmp3 = tmp3_a[i_t3a]; -#endif - + if ( L_tmp < 0 ) { L_tmp32 = L_negate( L_tmp ); @@ -7344,29 +7334,12 @@ void synthesise_fb_high_band_fx( { tmp16 = extract_h( L_tmp32 ); } -#ifndef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST + output[i] = tmp16; move16(); -#else - IF( L_tmp < 0 ) - { - output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ - move16(); - } - ELSE - { - output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ - move16(); - } - if ( output[i] != tmp16 ) - assert( 0 ); -#endif - -#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx_TEST - } -#endif #else + L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ -- GitLab From c8695f623da545bf0acd7c6deea6cb33b268755e Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 3 Apr 2025 14:30:19 +0200 Subject: [PATCH 0155/1310] Removed scaling of input in IMDCT_ivas_fx(). Activated dynamic q_old_out. Restored q_win to its previous value. --- lib_com/options.h | 4 ++-- lib_dec/dec_tcx_fx.c | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b5a3bbb3e..2b0a2ad0e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -78,6 +78,6 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT -#define FIX_1348_BIT_PRECISION_IMPROVEMENT -//#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +//#define FIX_1348_BIT_PRECISION_IMPROVEMENT +#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index f3c84770f..f97455c65 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2894,10 +2894,6 @@ void IMDCT_ivas_fx( } ELSE { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - Scale_sig32( x_fx, L_frame, 1 ); - q_xn_buf_fx_32++; -#endif #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 q_old_out = q_win; #endif -- GitLab From 5d6fc20e9d26d7e8c70212cfad104a7fed363d83 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 2 Apr 2025 12:34:57 +0200 Subject: [PATCH 0156/1310] fix precission in FIX_1439_SPEEDUP_elliptic_bpf_48k_generic STAGE1-3, activate, check again BEness --- lib_com/swb_tbe_com_fx.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 500e2fd02..5128e42e3 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6783,7 +6783,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6796,7 +6797,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6811,7 +6813,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6824,7 +6827,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; @@ -6837,7 +6841,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; } @@ -6858,7 +6863,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } } @@ -7021,7 +7027,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } @@ -7128,7 +7135,8 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -- GitLab From 384150d0cd440d404fa8fc264556268a084144c7 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 3 Apr 2025 15:18:59 +0200 Subject: [PATCH 0157/1310] Deactivated all changes to check the pipeline results. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2b0a2ad0e..90138fe5e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,5 +79,5 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT //#define FIX_1348_BIT_PRECISION_IMPROVEMENT -#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +//#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD #endif -- GitLab From 7e4ed16664a0de6dbddb31bd5f549d5e9280146e Mon Sep 17 00:00:00 2001 From: naghibza Date: Fri, 4 Apr 2025 08:47:55 +0200 Subject: [PATCH 0158/1310] Activated q_win modification. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 90138fe5e..b5a3bbb3e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -78,6 +78,6 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT -//#define FIX_1348_BIT_PRECISION_IMPROVEMENT +#define FIX_1348_BIT_PRECISION_IMPROVEMENT //#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD #endif -- GitLab From 32bba36dea4533cbf1bd6f01fd786a4fa434a203 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 4 Apr 2025 09:02:46 +0200 Subject: [PATCH 0159/1310] add FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat --- lib_com/options.h | 4 ++++ lib_com/tools_fx.c | 26 +++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2b88deb5d..8962098b9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,4 +80,8 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT +// +// new speedups +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | + #endif diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 5219d076c..756b5be80 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,13 +794,37 @@ void Copy_Scale_sig_16_32_no_sat( } return; } +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat + L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); + + IF( L_tmp >= 0x7FFF ) + { + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* Overflow can occur here */ + } + return; + } + // ELSE + { + Word16 tmp = extract_l( L_tmp ); + FOR( i = 0; i < lg; i++ ) + { + y[i] = L_mult( x[i], tmp ); + move32(); + } + } +#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ + move32(); /* Overflow can occur here */ } +#endif } void Copy_Scale_sig_32_16( -- GitLab From e430720c9c5a2246b69a245e3f349e2f2f2f49cf Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 4 Apr 2025 09:05:27 +0200 Subject: [PATCH 0160/1310] add FIX_1439_SPEEDUP_stereo_icBWE_dec_fx --- lib_com/options.h | 1 + lib_dec/ivas_stereo_icbwe_dec_fx.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 8962098b9..787f0338a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -83,5 +83,6 @@ // // new speedups #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | #endif diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index c7bc98566..772eb2d7d 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,6 +904,9 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); +#endif FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -911,10 +914,17 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + if ( LE_16( alpha_fx, winSlope_fx_ ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ + } +#else IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } +#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) -- GitLab From 932c3f55d6d41abac3f13a470e6a1f8906516228 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 4 Apr 2025 09:08:32 +0200 Subject: [PATCH 0161/1310] add FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx --- lib_com/options.h | 1 + lib_dec/swb_tbe_dec_fx.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 787f0338a..3a96cb998 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,5 +84,6 @@ // new speedups #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | #endif diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1b51a29fb..00be6455d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7022,14 +7022,24 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); + +#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx + Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 +#endif + FOR( i = 0; i < L_FRAME16k; i++ ) { +#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } +#else + Word16 idx; + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ +#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); -- GitLab From f1e32ecf14d70eafaf0f4d86c4b57ec75f62cffb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 4 Apr 2025 09:13:38 +0200 Subject: [PATCH 0162/1310] add FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig --- lib_com/options.h | 1 + lib_com/swb_tbe_com_fx.c | 93 +++++++++++++++++++++++++++++++++++----- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3a96cb998..3e8725112 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -85,5 +85,6 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2a2841966..062c131ee 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6763,18 +6763,91 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + { + i = 4; + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; + + FOR( ; i < L_FRAME48k; ) + { + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } + } + ELSE +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ + { + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } } memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; -- GitLab From 866a91131bef01ce1db3654162fcee71cdfd925a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 4 Apr 2025 09:18:27 +0200 Subject: [PATCH 0163/1310] add FIX_1439_SPEEDUP_synthesise_fb_high_band_fx --- lib_com/options.h | 4 +++- lib_com/swb_tbe_com_fx.c | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3e8725112..571b5edd3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -83,8 +83,10 @@ // // new speedups #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? + #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 062c131ee..af52c2564 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7146,6 +7146,50 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { +#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx + L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ + Word32 L_tmp32; + Word16 tmp16; + + // if (L_tmp < 0) + if ( L_tmp < 0 ) + { + L_tmp32 = L_negate( L_tmp ); + } + if ( L_tmp < 0 ) + { + L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); + } + if ( L_tmp < 0 ) + { + tmp16 = extract_h( L_tmp32 ); + } + if ( L_tmp < 0 ) + { + tmp16 = negate( tmp16 ); + } + + // if (L_tmp == 0) + if ( L_tmp == 0 ) + { + tmp16 = 0; + move16(); + } + + // if (L_tmp > 0) + if ( L_tmp > 0 ) + { + L_tmp32 = L_shl_sat( L_tmp, tmp3 ); + } + if ( L_tmp > 0 ) + { + tmp16 = extract_h( L_tmp32 ); + } + + output[i] = tmp16; + move16(); + +#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7157,6 +7201,7 @@ void synthesise_fb_high_band_fx( output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); } +#endif } return; } -- GitLab From 00053a90002504d72c527fa12c852af44830bf42 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 4 Apr 2025 09:20:44 +0200 Subject: [PATCH 0164/1310] deactivate all speedups --- lib_com/options.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 571b5edd3..13f7c7f18 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,11 +82,11 @@ //#define HARM_SCE_INIT // // new speedups -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | +//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | +//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS +//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? +//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? #endif -- GitLab From 40ea7cb4e2dba433511e5fe47bb4130e997c6bbb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 4 Apr 2025 10:03:20 +0200 Subject: [PATCH 0165/1310] activated all speedups (BE) --- lib_com/options.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 13f7c7f18..571b5edd3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,11 +82,11 @@ //#define HARM_SCE_INIT // // new speedups -//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS -//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? +#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? #endif -- GitLab From 6d8e151543207ae117f5624b4bd4ef201b003884 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 7 Apr 2025 13:06:15 +0200 Subject: [PATCH 0166/1310] fix PYTEST_ADDOPTS string --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f7db000f7..fcaa06d57 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -404,7 +404,7 @@ stages: - REPORT_ARG="" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k \"not JBM\ and stereo and at""; fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k \"not JBM and stereo and at\""; fi - *build-and-create-float-ref-outputs -- GitLab From 5f5ee69577d1095ccf087de5ff12ea933b19466f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 28 Mar 2025 11:41:17 +0100 Subject: [PATCH 0167/1310] adapt CI config to new versions of scripts --- .gitlab-ci.yml | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fcaa06d57..37bd9c601 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -375,6 +375,7 @@ stages: MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" + SUMMARY_HTML_ARTIFACT_SPLIT: "summary_split_$CI_JOB_NAME.html" IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" script: @@ -400,10 +401,9 @@ stages: - comp_args="--mld --ssnr --odg" - - summary_args="MLD DIFF SSNR ODG" - - REPORT_ARG="" + - MEASURES_FOR_REPORT="MLD MAX_ABS_DIFF MIN_SSNR MIN_ODG" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; summary_args="${summary_args} DELTA_ODG"; REPORT_ARG="--delta_odg"; fi + - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; MEASURES_FOR_REPORT="$MEASURES_FOR_REPORT DELTA_ODG"; fi - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k \"not JBM and stereo and at\""; fi - *build-and-create-float-ref-outputs @@ -421,30 +421,20 @@ stages: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true ### create histograms - - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME $REPORT_ARG - # if split comparison is done, we need to create two pages, one for the "whole file" values and one for the "split" values + - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME --split-csv-file $CSV_ARTIFACT_SPLIT + + # first for "whole" files comparison + - python3 scripts/create_histograms.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT + - if [ "$SPLIT_COMPARISON" = "true" ]; then - # use -v flag ("inverse") to also have the header in the output file - - grep -v "_whole" $CSV_ARTIFACT_NAME > $CSV_ARTIFACT_SPLIT - - cp $CSV_ARTIFACT_NAME tmp.csv - - grep -v "_split" tmp.csv > $CSV_ARTIFACT_NAME - - mkdir $IMAGES_ARTIFACT_SPLIT - - for MEASURE in $summary_args;do - - python3 scripts/create_histogram_summary.py $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT/summary_"$MEASURE".csv $IMAGES_ARTIFACT_SPLIT/summary_"$MEASURE".png --measure $MEASURE - - done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_SPLIT --measures $summary_args + - python3 scripts/create_histograms.py $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT --measures $MEASURES_FOR_REPORT + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_SPLIT $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_SPLIT --measures $MEASURES_FOR_REPORT - else # touch files to suppress warning for missing artifacts - touch $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT - fi - # this part creates the "whole file" histograms - - mkdir $IMAGES_ARTIFACT_NAME - - for MEASURE in $summary_args;do - - python3 scripts/create_histogram_summary.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE; - - done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $summary_args - - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) - echo "Job ID from variables - $CI_JOB_ID, Job ID from script - $id_previous" @@ -486,6 +476,7 @@ stages: - $CSV_ARTIFACT_SPLIT - $MERGED_CSV_ARTIFACT_NAME - $SUMMARY_HTML_ARTIFACT_NAME + - $SUMMARY_HTML_ARTIFACT_SPLIT - $IMAGES_ARTIFACT_NAME - $IMAGES_ARTIFACT_SPLIT expose_as: "pytest compare results" -- GitLab From 4b93dfab26d87fc7c321d3734a141fededc753a1 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 28 Mar 2025 14:37:12 +0100 Subject: [PATCH 0168/1310] remove format filter again to run whole test suite --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 37bd9c601..6b70851fb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -404,7 +404,7 @@ stages: - MEASURES_FOR_REPORT="MLD MAX_ABS_DIFF MIN_SSNR MIN_ODG" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; MEASURES_FOR_REPORT="$MEASURES_FOR_REPORT DELTA_ODG"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; export PYTEST_ADDOPTS="-k \"not JBM and stereo and at\""; fi + - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; fi - *build-and-create-float-ref-outputs -- GitLab From de5e4c1b921998e6239c0e8fedd53db59f733ef0 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 1 Apr 2025 14:11:58 +0200 Subject: [PATCH 0169/1310] add --write-out-histograms flag --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6b70851fb..75618d54e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -424,11 +424,11 @@ stages: - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME --split-csv-file $CSV_ARTIFACT_SPLIT # first for "whole" files comparison - - python3 scripts/create_histograms.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT + - python3 scripts/create_histograms.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - if [ "$SPLIT_COMPARISON" = "true" ]; then - - python3 scripts/create_histograms.py $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT --measures $MEASURES_FOR_REPORT + - python3 scripts/create_histograms.py $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT --measures $MEASURES_FOR_REPORT --write-out-histograms - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_SPLIT $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_SPLIT --measures $MEASURES_FOR_REPORT - else # touch files to suppress warning for missing artifacts -- GitLab From 9140ad05bc5806e66a042ed176a39be6be5cf725 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 7 Apr 2025 12:13:38 +0200 Subject: [PATCH 0170/1310] adapt other uses of parse_xml_report.py to new version --- .gitlab-ci.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 75618d54e..4eb08fe7a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,6 +52,7 @@ variables: FLOAT_REF_COMMIT_FILE: "float-ref-git-sha" CUT_COMMIT_FILE: "CuT-git-sha" MERGE_TARGET_COMMIT_FILE: "merge-target-git-sha" + MEASURES_FOR_REPORT: "MLD MAX_ABS_DIFF MIN_SSNR MIN_ODG" MANUAL_PIPELINE_TYPE: description: "Type for the manual pipeline run. Use 'pytest-compare' to run comparison test against reference float codec." value: 'default' @@ -401,7 +402,8 @@ stages: - comp_args="--mld --ssnr --odg" - - MEASURES_FOR_REPORT="MLD MAX_ABS_DIFF MIN_SSNR MIN_ODG" + - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") + - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; MEASURES_FOR_REPORT="$MEASURES_FOR_REPORT DELTA_ODG"; fi - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; fi @@ -667,9 +669,9 @@ stages: # Store branch outputs for comparison - mv tests/dut tests/dut_branch - # create the summary based on the branch - - for MEASURE in MLD DIFF SSNR ODG;do python3 scripts/create_histogram_summary.py $CSV_BRANCH $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE; done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME + # create the summary based on the branch only + - python3 scripts/create_histograms.py $CSV_BRANCH $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT ### run main now - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME -- GitLab From 876c438b3570702e13864c1873b3f5526880c731 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 07:26:02 +0200 Subject: [PATCH 0171/1310] rename FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 to FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx - deactivate BE macros, they are already in another branch --- lib_com/options.h | 21 ++++++++++----------- lib_dec/swb_tbe_dec_fx.c | 4 ++-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 54f4ea2d9..3a2a1035f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,17 +79,16 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT -// new speedups -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | < TODO: check border cases -#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS according pipe -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | - -#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? - -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | +// new speedups - BE ones already in another branch +//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | +//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS +//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | +//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? Need for a manual test as long as be tests dont work + +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | //----------------------------------------------------------------------- // OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 36a499f7d..bb0d6f2e0 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7031,13 +7031,13 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); -#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 +#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 #endif FOR( i = 0; i < L_FRAME16k; i++ ) { -#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx_0 +#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word16 idx = 0; move16(); IF( i != 0 ) -- GitLab From ee0587a7120d5c204d0c58968a1ee13b4fedb586 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 07:41:52 +0200 Subject: [PATCH 0172/1310] added FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic version 1 --- lib_com/options.h | 1 + lib_com/swb_tbe_com_fx.c | 13 +++++++++++++ lib_enc/swb_tbe_enc_fx.c | 12 +++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 571b5edd3..58899a74b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,6 +86,7 @@ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index af52c2564..00c33406d 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6703,14 +6703,22 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic_ + Word16 memory_fx0[4][4], memory_fx[4], Q_temp, Q_temp2; +#else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; +#endif Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; FOR( i = 0; i < 4; i++ ) { memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic_ + memory_fx[i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); +#else memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); +#endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); @@ -7070,7 +7078,12 @@ void synthesise_fb_high_band_fx( Word16 Qout ) { Word16 i, j; +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; + Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; +#else Word16 excitation_in_interp3[L_FRAME48k]; +#endif Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 316a5b549..ef499ad6a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7299,13 +7299,18 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; - Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_buffer[L_FRAME48k + 4]; + Word16 *input_fhb = &input_fhb_buffer[0] + 4; +#else + Word16 input_fhb[L_FRAME48k]; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); @@ -7422,7 +7427,12 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; + Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; +#else Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; +#endif Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; -- GitLab From feeb6bd7c714e7abcb84cdc35273ad3026a2aad5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 09:35:09 +0200 Subject: [PATCH 0173/1310] remap memory_fx and memory2_fx - more changes TBD - check BEnes --- lib_com/swb_tbe_com_fx.c | 43 ++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a9fd95434..86765d156 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6704,20 +6704,27 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic_ - Word16 memory_fx0[4][4], memory_fx[4], Q_temp, Q_temp2; +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 memory_fx0, Q_temp, Q_temp2; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output[L_FRAME48k], L_tmpX, L_tmpMax; + + Word32 *L_tmp = &L_tmp_buffer[4]; + Word32 *L_tmp2 = &L_tmp2_buffer[4]; + Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; + Word16 *memory_fx = &input_fx[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; -#endif Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; +#endif Word32 memory2_fx_2[4], memory2_fx_3[4]; FOR( i = 0; i < 4; i++ ) { - memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic_ - memory_fx[i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + memory_fx0 = extract_l( memory_fx2[0][i] ); + memory_fx[i] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); #else + memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); #endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); @@ -6730,20 +6737,34 @@ void elliptic_bpf_48k_generic_fx( move32(); } +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( memory_fx[0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6752,8 +6773,13 @@ void elliptic_bpf_48k_generic_fx( L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6762,7 +6788,12 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +#endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 48a64bc5d6b5c35c1ec4d2686d7a1bc264a442ff Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 11:06:24 +0200 Subject: [PATCH 0174/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 86765d156..bef75e4bf 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6743,11 +6743,11 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6761,10 +6761,10 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6777,8 +6777,8 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6792,7 +6792,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ #else - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ #endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 78aa1b4bb67c5ee28aba0f7c65c2741f6a023b96 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 11:12:41 +0200 Subject: [PATCH 0175/1310] remapping of memory2_fx_2 and memory2_fx_3 --- lib_com/swb_tbe_com_fx.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bef75e4bf..eda963d23 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6706,17 +6706,21 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output[L_FRAME48k], L_tmpX, L_tmpMax; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; Word16 *memory_fx = &input_fx[-4]; + Word32 *memory2_fx_2 = &L_tmp2[-4]; + Word32 *L_output = &L_output_buffer[0]; + Word32 *memory2_fx_3 = &L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; -#endif Word32 memory2_fx_2[4], memory2_fx_3[4]; +#endif + FOR( i = 0; i < 4; i++ ) { -- GitLab From 95d1adb8639be170b79c9be0f281b81c3d0c2a27 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 12:54:40 +0200 Subject: [PATCH 0176/1310] delete memory2_fx, memory_fx, memory2_fx_2, memory2_fx_3 --- lib_com/swb_tbe_com_fx.c | 241 ++++++++++++++++++++++++++++++++------- 1 file changed, 201 insertions(+), 40 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index eda963d23..e6ee1d5c3 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6695,7 +6695,11 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6710,11 +6714,11 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; - Word16 *memory_fx = &input_fx[-4]; - Word32 *memory2_fx_2 = &L_tmp2[-4]; + //Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; + //Word16 *memory_fx = &input_fx[-4]; + //Word32 *memory2_fx_2 = &L_tmp2[-4]; Word32 *L_output = &L_output_buffer[0]; - Word32 *memory2_fx_3 = &L_output[-4]; + //Word32 *memory2_fx_3 = &L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6726,14 +6730,17 @@ void elliptic_bpf_48k_generic_fx( { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); - memory_fx[i] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); -#endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); +#endif move32(); move32(); move32(); @@ -6742,71 +6749,103 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif + + #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -#endif - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif + #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig test(); @@ -6903,6 +6942,18 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + move32(); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6913,6 +6964,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); +#endif + + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); +#else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6924,6 +6991,20 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); +#endif + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); +#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6935,6 +7016,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); +#endif + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6947,6 +7044,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#endif + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6977,12 +7076,31 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); +#else + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); +#endif move32(); move32(); } +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + move32(); + L_tmpMax = L_abs( L_output[0] ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -6994,7 +7112,21 @@ void elliptic_bpf_48k_generic_fx( L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7006,7 +7138,21 @@ void elliptic_bpf_48k_generic_fx( L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7018,7 +7164,21 @@ void elliptic_bpf_48k_generic_fx( L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7030,6 +7190,7 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#endif FOR( i = 4; i < L_FRAME48k; i++ ) { -- GitLab From 997c2e89ac3bba53c78862977722e94a950ed2b4 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 12:56:32 +0200 Subject: [PATCH 0177/1310] fix error conflicting types --- lib_com/prot_fx.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1452d8e2e..13b6fe2d8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,11 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : i signal Q_input_fx */ +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else + const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ -- GitLab From 9bc5392af628dd9716f787c74554dc9e7820521e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 13:14:17 +0200 Subject: [PATCH 0178/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 197 +++++++++++++++++++-------------------- 1 file changed, 98 insertions(+), 99 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e6ee1d5c3..10177bca7 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6714,11 +6714,11 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - //Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; - //Word16 *memory_fx = &input_fx[-4]; - //Word32 *memory2_fx_2 = &L_tmp2[-4]; + // Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; + // Word16 *memory_fx = &input_fx[-4]; + // Word32 *memory2_fx_2 = &L_tmp2[-4]; Word32 *L_output = &L_output_buffer[0]; - //Word32 *memory2_fx_3 = &L_output[-4]; + // Word32 *memory2_fx_3 = &L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6733,7 +6733,7 @@ void elliptic_bpf_48k_generic_fx( input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); @@ -6749,22 +6749,22 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6773,23 +6773,23 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6797,51 +6797,50 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #endif - #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #endif @@ -6943,15 +6942,15 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6969,15 +6968,15 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); #else L_tmpMax = L_abs( L_tmp2[0] ); @@ -6995,14 +6994,14 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); #else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); @@ -7020,15 +7019,15 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); #else @@ -7079,11 +7078,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + move32(); #else - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); #endif move32(); move32(); @@ -7117,13 +7116,13 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); #else -- GitLab From f4efc581ee3386141a7b4ba83ab4430138d76fba Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 13:40:44 +0200 Subject: [PATCH 0179/1310] Revert "clang format patch" This reverts commit 9bc5392af628dd9716f787c74554dc9e7820521e. --- lib_com/swb_tbe_com_fx.c | 197 ++++++++++++++++++++------------------- 1 file changed, 99 insertions(+), 98 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 10177bca7..e6ee1d5c3 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6714,11 +6714,11 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - // Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; - // Word16 *memory_fx = &input_fx[-4]; - // Word32 *memory2_fx_2 = &L_tmp2[-4]; + //Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; + //Word16 *memory_fx = &input_fx[-4]; + //Word32 *memory2_fx_2 = &L_tmp2[-4]; Word32 *L_output = &L_output_buffer[0]; - // Word32 *memory2_fx_3 = &L_output[-4]; + //Word32 *memory2_fx_3 = &L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6733,7 +6733,7 @@ void elliptic_bpf_48k_generic_fx( input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? + //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); @@ -6749,22 +6749,22 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6773,23 +6773,23 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6797,50 +6797,51 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #endif + #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #endif @@ -6942,15 +6943,15 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6968,15 +6969,15 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); #else L_tmpMax = L_abs( L_tmp2[0] ); @@ -6994,14 +6995,14 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); #else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); @@ -7019,15 +7020,15 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); #else @@ -7078,11 +7079,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + move32(); #else - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); #endif move32(); move32(); @@ -7116,13 +7117,13 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); #else -- GitLab From 9781a471204e1ebcf521ab1b74300f72b806eca5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 13:40:54 +0200 Subject: [PATCH 0180/1310] Revert "fix error conflicting types" This reverts commit 997c2e89ac3bba53c78862977722e94a950ed2b4. --- lib_com/prot_fx.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 13b6fe2d8..1452d8e2e 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,11 +3258,7 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif + const Word16 input_fx[], /* i : i signal Q_input_fx */ Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ -- GitLab From 5a6b1cccab516d7f7b2b8b0cf7526e57119273bf Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 13:41:11 +0200 Subject: [PATCH 0181/1310] Revert "delete memory2_fx, memory_fx, memory2_fx_2, memory2_fx_3" This reverts commit 95d1adb8639be170b79c9be0f281b81c3d0c2a27. --- lib_com/swb_tbe_com_fx.c | 241 +++++++-------------------------------- 1 file changed, 40 insertions(+), 201 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e6ee1d5c3..eda963d23 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6695,11 +6695,7 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6714,11 +6710,11 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - //Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; - //Word16 *memory_fx = &input_fx[-4]; - //Word32 *memory2_fx_2 = &L_tmp2[-4]; + Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; + Word16 *memory_fx = &input_fx[-4]; + Word32 *memory2_fx_2 = &L_tmp2[-4]; Word32 *L_output = &L_output_buffer[0]; - //Word32 *memory2_fx_3 = &L_output[-4]; + Word32 *memory2_fx_3 = &L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6730,17 +6726,14 @@ void elliptic_bpf_48k_generic_fx( { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); - input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); - L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? + memory_fx[i] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); +#endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); -#endif move32(); move32(); move32(); @@ -6749,103 +6742,71 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif - - #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif - #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig test(); @@ -6942,18 +6903,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6964,22 +6913,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); -#endif - - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); -#else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6991,20 +6924,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); -#endif - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); -#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7016,22 +6935,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); -#endif - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7044,8 +6947,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#endif - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7076,31 +6977,12 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); -#else - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); -#endif + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); move32(); move32(); } -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7112,21 +6994,7 @@ void elliptic_bpf_48k_generic_fx( L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7138,21 +7006,7 @@ void elliptic_bpf_48k_generic_fx( L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7164,21 +7018,7 @@ void elliptic_bpf_48k_generic_fx( L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7190,7 +7030,6 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#endif FOR( i = 4; i < L_FRAME48k; i++ ) { -- GitLab From 425a67b9280368e30cd32f97f725814e26fe8776 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 13:41:29 +0200 Subject: [PATCH 0182/1310] Revert "remapping of memory2_fx_2 and memory2_fx_3" This reverts commit 78aa1b4bb67c5ee28aba0f7c65c2741f6a023b96. --- lib_com/swb_tbe_com_fx.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index eda963d23..bef75e4bf 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6706,21 +6706,17 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output[L_FRAME48k], L_tmpX, L_tmpMax; Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; Word16 *memory_fx = &input_fx[-4]; - Word32 *memory2_fx_2 = &L_tmp2[-4]; - Word32 *L_output = &L_output_buffer[0]; - Word32 *memory2_fx_3 = &L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; - Word32 memory2_fx_2[4], memory2_fx_3[4]; #endif - + Word32 memory2_fx_2[4], memory2_fx_3[4]; FOR( i = 0; i < 4; i++ ) { -- GitLab From 205dcb45d5f71f507499708379d056e7069e7b27 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 12:56:32 +0200 Subject: [PATCH 0183/1310] fix error conflicting types --- lib_com/prot_fx.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1452d8e2e..13b6fe2d8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,11 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : i signal Q_input_fx */ +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else + const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ -- GitLab From fc8d9864050fa076cccdba719213097ba40cb59c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 13:47:52 +0200 Subject: [PATCH 0184/1310] follow-up : fix conflicting types --- lib_com/swb_tbe_com_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bef75e4bf..d75cae8fc 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6695,7 +6695,11 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ -- GitLab From ff5630499370c5ab37bdcad83a4ae000a19d5d80 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:02:40 +0200 Subject: [PATCH 0185/1310] fix segfault --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d75cae8fc..5fc7588fd 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6733,7 +6733,7 @@ void elliptic_bpf_48k_generic_fx( #endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); -- GitLab From c52dbd20ab98074c0e5f1b470334f4ee918cfadc Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:07:02 +0200 Subject: [PATCH 0186/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5fc7588fd..5e3eb007f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6733,7 +6733,7 @@ void elliptic_bpf_48k_generic_fx( #endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); -- GitLab From 91bc9889207580a123c2e561e2a4a6e8e8e6824c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 12:54:40 +0200 Subject: [PATCH 0187/1310] delete memory2_fx, memory_fx, memory2_fx_2, memory2_fx_3 --- lib_com/swb_tbe_com_fx.c | 235 ++++++++++++++++++++++++++++++++------- 1 file changed, 195 insertions(+), 40 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5e3eb007f..e620290c4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6710,12 +6710,11 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output[L_FRAME48k], L_tmpX, L_tmpMax; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; - Word16 *memory_fx = &input_fx[-4]; + Word32 *L_output = &L_output_buffer[0]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6726,14 +6725,16 @@ void elliptic_bpf_48k_generic_fx( { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); - memory_fx[i] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); -#endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? +#endif move32(); move32(); move32(); @@ -6742,71 +6743,103 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif + + #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -#endif - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif + #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig test(); @@ -6903,6 +6936,18 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + move32(); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6913,6 +6958,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); +#endif + + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); +#else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6924,6 +6985,20 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); +#endif + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); +#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6935,6 +7010,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); +#endif + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6947,6 +7038,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#endif + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6977,12 +7070,31 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); +#else + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); +#endif move32(); move32(); } +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + move32(); + L_tmpMax = L_abs( L_output[0] ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -6994,7 +7106,21 @@ void elliptic_bpf_48k_generic_fx( L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7006,7 +7132,21 @@ void elliptic_bpf_48k_generic_fx( L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7018,7 +7158,21 @@ void elliptic_bpf_48k_generic_fx( L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7030,6 +7184,7 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#endif FOR( i = 4; i < L_FRAME48k; i++ ) { -- GitLab From f1d1be180b1b22ef1c677427589c3b4c307c3a05 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:37:18 +0200 Subject: [PATCH 0188/1310] reintegrate loops, cleaning tbd --- lib_com/swb_tbe_com_fx.c | 268 ++++++++++++++++++++------------------- 1 file changed, 140 insertions(+), 128 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e620290c4..eb8626354 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6743,16 +6743,16 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + //L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6767,16 +6767,16 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + //L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6791,16 +6791,16 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + //L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6817,16 +6817,16 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + //L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6841,7 +6841,7 @@ void elliptic_bpf_48k_generic_fx( #endif -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig +#if defiend( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) test(); IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { @@ -6912,7 +6912,11 @@ void elliptic_bpf_48k_generic_fx( ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ { +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + FOR( i = 0; i < L_FRAME48k; i++ ) +#else FOR( i = 4; i < L_FRAME48k; i++ ) +#endif { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6937,16 +6941,16 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); + //L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + //L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + //move32(); #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6962,17 +6966,17 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); + //L_tmpMax = L_abs( L_tmp2[0] ); + //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //move32(); #else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6988,16 +6992,16 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + //L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //move32(); #else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7013,18 +7017,18 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); #else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7040,7 +7044,11 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); #endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + FOR( i = 0; i < L_FRAME48k; i++ ) +#else FOR( i = 4; i < L_FRAME48k; i++ ) +#endif { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7083,17 +7091,17 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); + //L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //move32(); + //L_tmpMax = L_abs( L_output[0] ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7109,17 +7117,17 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + //L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7135,17 +7143,17 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + //L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + //L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7161,17 +7169,17 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + //L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7186,7 +7194,11 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); #endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + FOR( i = 0; i < L_FRAME48k; i++ ) +#else FOR( i = 4; i < L_FRAME48k; i++ ) +#endif { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ -- GitLab From 7cf8b43a129509dafe5057e33dbea7dbb2d9b720 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:41:07 +0200 Subject: [PATCH 0189/1310] clean up reintegratd loops - tbd: make upsempledsig macro work again --- lib_com/swb_tbe_com_fx.c | 111 ++------------------------------------- 1 file changed, 3 insertions(+), 108 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index eb8626354..5702ef0f2 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6742,18 +6742,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); -#else +#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6764,20 +6753,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); -#else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6788,20 +6764,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); -#else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6812,22 +6775,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif - - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); -#else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6940,18 +6888,8 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - //L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - //move32(); -#else + +#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6962,22 +6900,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); -#endif - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpMax = L_abs( L_tmp2[0] ); - //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //move32(); -#else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6989,20 +6912,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - //L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //move32(); -#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7014,22 +6924,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -- GitLab From 0aa63c3ff3ea9d0fbbf507050019fd5e9ce048ab Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:46:16 +0200 Subject: [PATCH 0190/1310] make upsempledsig macro work again - tbd: cleanup --- lib_com/swb_tbe_com_fx.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5702ef0f2..7ddd76842 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6866,6 +6866,18 @@ void elliptic_bpf_48k_generic_fx( FOR( i = 4; i < L_FRAME48k; i++ ) #endif { +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); +#else L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6876,6 +6888,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif } } -- GitLab From efe4596efd93a8668e536d65c9f8f746ffbd8908 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:50:41 +0200 Subject: [PATCH 0191/1310] more reintegrating loops and cleaning up - also fix - TBD: make upsampled work again - select only for correct filters --- lib_com/swb_tbe_com_fx.c | 56 +--------------------------------------- 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 7ddd76842..bdc947c7e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6998,19 +6998,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //move32(); - //L_tmpMax = L_abs( L_output[0] ); -#else +#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7022,21 +7010,7 @@ void elliptic_bpf_48k_generic_fx( L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7048,21 +7022,7 @@ void elliptic_bpf_48k_generic_fx( L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - //L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7074,21 +7034,7 @@ void elliptic_bpf_48k_generic_fx( L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 3ad6e7e543ea7a6bfffbcb8032eb067b24c40c7f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:54:27 +0200 Subject: [PATCH 0192/1310] make upsampled work again - select only for correct filters --- lib_com/swb_tbe_com_fx.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bdc947c7e..3544cab74 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6859,6 +6859,10 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ + +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic FOR( i = 0; i < L_FRAME48k; i++ ) @@ -6866,18 +6870,27 @@ void elliptic_bpf_48k_generic_fx( FOR( i = 4; i < L_FRAME48k; i++ ) #endif { -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + } + } + ELSE +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ + { +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + FOR( i = 0; i < L_FRAME48k; i++ ) #else + FOR( i = 4; i < L_FRAME48k; i++ ) +#endif + { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6888,10 +6901,11 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif } } + + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; -- GitLab From 707c22919241ee73a0313d49b041e560a7a97919 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 15:57:38 +0200 Subject: [PATCH 0193/1310] clang format patch and fix preproc cmd --- lib_com/swb_tbe_com_fx.c | 69 ++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 3544cab74..bf425c066 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6733,7 +6733,7 @@ void elliptic_bpf_48k_generic_fx( memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); // useless? #endif move32(); move32(); @@ -6743,53 +6743,53 @@ void elliptic_bpf_48k_generic_fx( } #ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #endif -#if defiend( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) +#if defined( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) test(); IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { @@ -6859,9 +6859,9 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - + #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); + test(); IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic @@ -6905,7 +6905,6 @@ void elliptic_bpf_48k_generic_fx( } - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; @@ -7003,11 +7002,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + move32(); #else - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); #endif move32(); move32(); -- GitLab From 97c8d64e0605051e876f31e6babc3dc5fcd21d06 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 16:11:13 +0200 Subject: [PATCH 0194/1310] fix unused variable error --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bf425c066..4d22dda27 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6718,8 +6718,8 @@ void elliptic_bpf_48k_generic_fx( #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; -#endif Word32 memory2_fx_2[4], memory2_fx_3[4]; +#endif FOR( i = 0; i < 4; i++ ) { -- GitLab From 7c29e0fcda0a77f713dd7814cce8c1464bc0cf8d Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 8 Apr 2025 16:24:21 +0200 Subject: [PATCH 0195/1310] replace non-intuitive condition by intuitive one --- lib_com/prot_fx.h | 4 ++++ lib_com/swb_tbe_com_fx.c | 32 +++++++++++++++++++++----------- lib_enc/swb_tbe_enc_fx.c | 18 +++++++++++++++--- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 13b6fe2d8..c1ff2895b 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3268,6 +3268,10 @@ void elliptic_bpf_48k_generic_fx( Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ Word16 memory_fx_Q[], const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + , + const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ +#endif ); void synthesise_fb_high_band_fx( diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 4d22dda27..259680930 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,15 +6696,19 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fx[], /* i : input signal Q_input_fx*/ + Word16 input_fx[], /* i : input signal Q_input_fx*/ #else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ + const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal memory_fx_Q */ - Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ + Word16 output_fx[], /* o : output signal memory_fx_Q */ + Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ Word16 memory_fx_Q[], - const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ + const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + , + const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ +#endif ) { Word16 i, j; @@ -6790,8 +6794,7 @@ void elliptic_bpf_48k_generic_fx( #if defined( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + IF( isUpsampledBy3 ) { i = 4; L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ @@ -6861,8 +6864,7 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) + IF( isUpsampledBy3 ) { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic FOR( i = 0; i < L_FRAME48k; i++ ) @@ -7178,12 +7180,20 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + , 1 +#endif + ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + ,1 +#endif + ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index ef499ad6a..707b0b5f8 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,7 +7330,11 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + ,0 +#endif + ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7459,11 +7463,19 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + ,0 +#endif + ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + ,0 +#endif + ); } test(); -- GitLab From de9181e67e6964e6247aae01f2ebfa50e06325ee Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 07:33:51 +0200 Subject: [PATCH 0196/1310] fic FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig/FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic, deactivate both --- lib_com/options.h | 4 +-- lib_com/swb_tbe_com_fx.c | 78 +++++++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 58899a74b..27d728add 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -85,8 +85,8 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ +//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | +//#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 259680930..2099087e2 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6862,51 +6862,63 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - IF( isUpsampledBy3 ) { +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + IF( isUpsampledBy3 ) + { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) + { + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } #else - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } #endif - { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); } - } - ELSE + ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - { + { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) #else - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR( i = 4; i < L_FRAME48k; i++ ) #endif - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } } } - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; -- GitLab From 94f1b674fd648b93a0914289537ac5c4df79e9ec Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 07:37:44 +0200 Subject: [PATCH 0197/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 34 ++++++++++++++++++---------------- lib_enc/swb_tbe_enc_fx.c | 21 ++++++++++++--------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2099087e2..63cda170f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,18 +6696,18 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fx[], /* i : input signal Q_input_fx*/ + Word16 input_fx[], /* i : input signal Q_input_fx*/ #else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ + const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal memory_fx_Q */ - Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ + Word16 output_fx[], /* o : output signal memory_fx_Q */ + Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ Word16 memory_fx_Q[], - const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ + const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig , - const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ + const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ #endif ) { @@ -6883,14 +6883,14 @@ void elliptic_bpf_48k_generic_fx( #else FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } @@ -7194,17 +7194,19 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , 1 -#endif + , + 1 +#endif ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,1 -#endif + , + 1 +#endif ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 707b0b5f8..4b0f5af57 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,10 +7330,11 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,0 -#endif + , + 0 +#endif ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; @@ -7463,18 +7464,20 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,0 -#endif + , + 0 +#endif ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,0 -#endif + , + 0 +#endif ); } -- GitLab From a28eea915544f8fe15aff0a3be34ab2128933c57 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 08:35:28 +0200 Subject: [PATCH 0198/1310] activate FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 27d728add..8f0573deb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,7 +86,7 @@ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ +#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? -- GitLab From 563f5f5b326993e31557ddde5091dcfb24083f34 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:09:56 +0200 Subject: [PATCH 0199/1310] Revert "activate FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic" This reverts commit a28eea915544f8fe15aff0a3be34ab2128933c57. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8f0573deb..27d728add 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,7 +86,7 @@ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | //#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ +//#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? -- GitLab From 9a9bad211d9169230953123b80d8fa9b054228b5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:05 +0200 Subject: [PATCH 0200/1310] Revert "clang format patch" This reverts commit 94f1b674fd648b93a0914289537ac5c4df79e9ec. --- lib_com/swb_tbe_com_fx.c | 34 ++++++++++++++++------------------ lib_enc/swb_tbe_enc_fx.c | 21 +++++++++------------ 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 63cda170f..2099087e2 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,18 +6696,18 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fx[], /* i : input signal Q_input_fx*/ + Word16 input_fx[], /* i : input signal Q_input_fx*/ #else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ + const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal memory_fx_Q */ - Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ + Word16 output_fx[], /* o : output signal memory_fx_Q */ + Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ Word16 memory_fx_Q[], - const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ + const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig , - const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ + const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ #endif ) { @@ -6883,14 +6883,14 @@ void elliptic_bpf_48k_generic_fx( #else FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } @@ -7194,19 +7194,17 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , - 1 -#endif + , 1 +#endif ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , - 1 -#endif + ,1 +#endif ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 4b0f5af57..707b0b5f8 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,11 +7330,10 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , - 0 -#endif + ,0 +#endif ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; @@ -7464,20 +7463,18 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , - 0 -#endif + ,0 +#endif ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , - 0 -#endif + ,0 +#endif ); } -- GitLab From bddbb00d9d9c3361c1a2ee4fc0c7736c7e5ad6bb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:14 +0200 Subject: [PATCH 0201/1310] Revert "fic FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig/FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic, deactivate both" This reverts commit de9181e67e6964e6247aae01f2ebfa50e06325ee. --- lib_com/options.h | 4 +-- lib_com/swb_tbe_com_fx.c | 78 +++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 47 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 27d728add..58899a74b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -85,8 +85,8 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | +#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2099087e2..259680930 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6862,63 +6862,51 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - { + #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - IF( isUpsampledBy3 ) - { + IF( isUpsampledBy3 ) + { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) - { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + FOR( i = 0; i < L_FRAME48k; i++ ) #else - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + FOR( i = 4; i < L_FRAME48k; i++ ) #endif + { + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); } - ELSE + } + ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - { + { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) #else - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR( i = 4; i < L_FRAME48k; i++ ) #endif - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); } } + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; -- GitLab From e19417766ac4ba1fcd699d141d6a9466c040fbd9 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:21 +0200 Subject: [PATCH 0202/1310] Revert "replace non-intuitive condition by intuitive one" This reverts commit 7c29e0fcda0a77f713dd7814cce8c1464bc0cf8d. --- lib_com/prot_fx.h | 4 ---- lib_com/swb_tbe_com_fx.c | 32 +++++++++++--------------------- lib_enc/swb_tbe_enc_fx.c | 18 +++--------------- 3 files changed, 14 insertions(+), 40 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index c1ff2895b..13b6fe2d8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3268,10 +3268,6 @@ void elliptic_bpf_48k_generic_fx( Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ Word16 memory_fx_Q[], const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , - const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ -#endif ); void synthesise_fb_high_band_fx( diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 259680930..4d22dda27 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,19 +6696,15 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fx[], /* i : input signal Q_input_fx*/ + Word16 input_fx[], /* i : input signal Q_input_fx*/ #else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ + const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal memory_fx_Q */ - Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ + Word16 output_fx[], /* o : output signal memory_fx_Q */ + Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ Word16 memory_fx_Q[], - const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , - const int isUpsampledBy3 /* i : input signal is upsampled by factor 3 by inserting zeros */ -#endif + const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ) { Word16 i, j; @@ -6794,7 +6790,8 @@ void elliptic_bpf_48k_generic_fx( #if defined( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) - IF( isUpsampledBy3 ) + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { i = 4; L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ @@ -6864,7 +6861,8 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - IF( isUpsampledBy3 ) + test(); + IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic FOR( i = 0; i < L_FRAME48k; i++ ) @@ -7180,20 +7178,12 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - , 1 -#endif - ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,1 -#endif - ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 707b0b5f8..ef499ad6a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,11 +7330,7 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,0 -#endif - ); + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7463,19 +7459,11 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,0 -#endif - ); + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - ,0 -#endif - ); + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From 2c9293c346144dca73a6c31682d4b026970ea1c3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:29 +0200 Subject: [PATCH 0203/1310] Revert "fix unused variable error" This reverts commit 97c8d64e0605051e876f31e6babc3dc5fcd21d06. --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 4d22dda27..bf425c066 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6718,8 +6718,8 @@ void elliptic_bpf_48k_generic_fx( #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; - Word32 memory2_fx_2[4], memory2_fx_3[4]; #endif + Word32 memory2_fx_2[4], memory2_fx_3[4]; FOR( i = 0; i < 4; i++ ) { -- GitLab From adaae746412c624118fa7efa0b74fdc4a7991388 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:35 +0200 Subject: [PATCH 0204/1310] Revert "clang format patch and fix preproc cmd" This reverts commit 707c22919241ee73a0313d49b041e560a7a97919. --- lib_com/swb_tbe_com_fx.c | 69 ++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bf425c066..3544cab74 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6733,7 +6733,7 @@ void elliptic_bpf_48k_generic_fx( memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); // useless? + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? #endif move32(); move32(); @@ -6743,53 +6743,53 @@ void elliptic_bpf_48k_generic_fx( } #ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #endif -#if defined( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) +#if defiend( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) test(); IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { @@ -6859,9 +6859,9 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - + #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); + test(); IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic @@ -6905,6 +6905,7 @@ void elliptic_bpf_48k_generic_fx( } + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; @@ -7002,11 +7003,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + move32(); #else - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); #endif move32(); move32(); -- GitLab From da263e0a8b21315afa6d995f8e1d4522f91ee82f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:45 +0200 Subject: [PATCH 0205/1310] Revert "make upsampled work again - select only for correct filters" This reverts commit 3ad6e7e543ea7a6bfffbcb8032eb067b24c40c7f. --- lib_com/swb_tbe_com_fx.c | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 3544cab74..bdc947c7e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6859,10 +6859,6 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic FOR( i = 0; i < L_FRAME48k; i++ ) @@ -6870,27 +6866,18 @@ void elliptic_bpf_48k_generic_fx( FOR( i = 4; i < L_FRAME48k; i++ ) #endif { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ - { -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) #else - FOR( i = 4; i < L_FRAME48k; i++ ) -#endif - { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6901,11 +6888,10 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif } } - - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; -- GitLab From fe148b9c1ce20f1456aa5b13b82c30c557ad4ac3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:51 +0200 Subject: [PATCH 0206/1310] Revert "more reintegrating loops and cleaning up - also fix - TBD: make upsampled work again - select only for correct filters" This reverts commit efe4596efd93a8668e536d65c9f8f746ffbd8908. --- lib_com/swb_tbe_com_fx.c | 56 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bdc947c7e..7ddd76842 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6998,7 +6998,19 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } -#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + //move32(); + //L_tmpMax = L_abs( L_output[0] ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7010,7 +7022,21 @@ void elliptic_bpf_48k_generic_fx( L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7022,7 +7048,21 @@ void elliptic_bpf_48k_generic_fx( L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + //L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7034,7 +7074,21 @@ void elliptic_bpf_48k_generic_fx( L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 6593f4f1f1cc2f0adec85ce2ef15418d4294af91 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:10:57 +0200 Subject: [PATCH 0207/1310] Revert "make upsempledsig macro work again - tbd: cleanup" This reverts commit 0aa63c3ff3ea9d0fbbf507050019fd5e9ce048ab. --- lib_com/swb_tbe_com_fx.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 7ddd76842..5702ef0f2 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6866,18 +6866,6 @@ void elliptic_bpf_48k_generic_fx( FOR( i = 4; i < L_FRAME48k; i++ ) #endif { -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); -#else L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6888,7 +6876,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif } } -- GitLab From ee542585bb8b2d205f2892f4081e60bc5deae1ec Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:11:03 +0200 Subject: [PATCH 0208/1310] Revert "clean up reintegratd loops - tbd: make upsempledsig macro work again" This reverts commit 7cf8b43a129509dafe5057e33dbea7dbb2d9b720. --- lib_com/swb_tbe_com_fx.c | 111 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5702ef0f2..eb8626354 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6742,7 +6742,18 @@ void elliptic_bpf_48k_generic_fx( move32(); } -#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); +#else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6753,7 +6764,20 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); +#else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6764,7 +6788,20 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); +#else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6775,7 +6812,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif + + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //move32(); +#else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6888,8 +6940,18 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - -#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + //L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + //move32(); +#else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6900,7 +6962,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); +#endif + +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpMax = L_abs( L_tmp2[0] ); + //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //move32(); +#else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6912,7 +6989,20 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + //L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //move32(); +#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6924,7 +7014,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); +#endif +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + //L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + //move32(); + //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -- GitLab From 6c53bd6ea8f8fb08246f081402a687defd0f07e1 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:11:10 +0200 Subject: [PATCH 0209/1310] Revert "reintegrate loops, cleaning tbd" This reverts commit f1d1be180b1b22ef1c677427589c3b4c307c3a05. --- lib_com/swb_tbe_com_fx.c | 268 +++++++++++++++++++-------------------- 1 file changed, 128 insertions(+), 140 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index eb8626354..e620290c4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6743,16 +6743,16 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6767,16 +6767,16 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6791,16 +6791,16 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6817,16 +6817,16 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //move32(); + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6841,7 +6841,7 @@ void elliptic_bpf_48k_generic_fx( #endif -#if defiend( FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig ) && !defined( FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic ) +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig test(); IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) { @@ -6912,11 +6912,7 @@ void elliptic_bpf_48k_generic_fx( ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ { -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) -#else FOR( i = 4; i < L_FRAME48k; i++ ) -#endif { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6941,16 +6937,16 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - //L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - //move32(); + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + move32(); #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6966,17 +6962,17 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpMax = L_abs( L_tmp2[0] ); - //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //move32(); + L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); #else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6992,16 +6988,16 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - //L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); #else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7017,18 +7013,18 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - //L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - //L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); #else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7044,11 +7040,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); #endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) -#else FOR( i = 4; i < L_FRAME48k; i++ ) -#endif { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7091,17 +7083,17 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - //move32(); - //L_tmpMax = L_abs( L_output[0] ); + L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + move32(); + L_tmpMax = L_abs( L_output[0] ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7117,17 +7109,17 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7143,17 +7135,17 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - //L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7169,17 +7161,17 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - //L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - //move32(); - //L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7194,11 +7186,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); #endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < L_FRAME48k; i++ ) -#else FOR( i = 4; i < L_FRAME48k; i++ ) -#endif { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ -- GitLab From 5f3aadb59778bf164c5684ef69b66cc9a8617f40 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:11:17 +0200 Subject: [PATCH 0210/1310] Revert "delete memory2_fx, memory_fx, memory2_fx_2, memory2_fx_3" This reverts commit 91bc9889207580a123c2e561e2a4a6e8e8e6824c. --- lib_com/swb_tbe_com_fx.c | 235 +++++++-------------------------------- 1 file changed, 40 insertions(+), 195 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e620290c4..5e3eb007f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6710,11 +6710,12 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output[L_FRAME48k], L_tmpX, L_tmpMax; Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *L_output = &L_output_buffer[0]; + Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; + Word16 *memory_fx = &input_fx[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6725,16 +6726,14 @@ void elliptic_bpf_48k_generic_fx( { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); - input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); - L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + memory_fx[i] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); +#endif memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //useless? -#endif + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -6743,103 +6742,71 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif - - #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif - #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig test(); @@ -6936,18 +6903,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6958,22 +6913,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); -#endif - - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); -#else L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6985,20 +6924,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); -#endif - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); -#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7010,22 +6935,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); -#endif - -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#else L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7038,8 +6947,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#endif - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7070,31 +6977,12 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); -#else - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); -#endif + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); move32(); move32(); } -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7106,21 +6994,7 @@ void elliptic_bpf_48k_generic_fx( L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7132,21 +7006,7 @@ void elliptic_bpf_48k_generic_fx( L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7158,21 +7018,7 @@ void elliptic_bpf_48k_generic_fx( L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); -#endif -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7184,7 +7030,6 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#endif FOR( i = 4; i < L_FRAME48k; i++ ) { -- GitLab From 8ea93bb69f1479cfcca377cf931dd8ce0611732f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:17:05 +0200 Subject: [PATCH 0211/1310] replace memory2_fx[1] by L_tmp[-4] --- lib_com/swb_tbe_com_fx.c | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5e3eb007f..d84be8fcc 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6731,7 +6731,7 @@ void elliptic_bpf_48k_generic_fx( memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); #endif - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); @@ -6753,10 +6753,10 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); @@ -6772,9 +6772,9 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic @@ -6789,8 +6789,8 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic @@ -6805,7 +6805,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig @@ -6903,10 +6903,10 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ @@ -6914,9 +6914,9 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ @@ -6925,8 +6925,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6936,7 +6936,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -- GitLab From 4bd709768e353df914f49fc625cc68c86dcb786f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:21:47 +0200 Subject: [PATCH 0212/1310] delete memory2_fx[] --- lib_com/swb_tbe_com_fx.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d84be8fcc..fa3293f31 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6714,7 +6714,6 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *memory2_fx[3] = { NULL, &L_tmp[-4], &L_tmp2[-4] }; Word16 *memory_fx = &input_fx[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; @@ -6732,7 +6731,7 @@ void elliptic_bpf_48k_generic_fx( memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); #endif L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); @@ -6908,10 +6907,10 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); L_tmpMax = L_abs( L_tmp2[0] ); L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6920,9 +6919,9 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); L_tmpX = L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6932,8 +6931,8 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6944,7 +6943,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); FOR( i = 4; i < L_FRAME48k; i++ ) -- GitLab From 2e44a40ee0c3a13df76efa757ca09779d2aa69c8 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:27:49 +0200 Subject: [PATCH 0213/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 128 +++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index fa3293f31..c14877c2a 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6750,12 +6750,12 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); @@ -6767,13 +6767,13 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic @@ -6783,13 +6783,13 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #endif - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic @@ -6797,14 +6797,14 @@ void elliptic_bpf_48k_generic_fx( #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ #endif - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig @@ -6902,48 +6902,48 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); FOR( i = 4; i < L_FRAME48k; i++ ) -- GitLab From 8bf813ae7b6bfbe7df581c6287a621220c80d125 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:28:39 +0200 Subject: [PATCH 0214/1310] replace memory_fx by input_fx[-4] and delete memory_fx --- lib_com/swb_tbe_com_fx.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c14877c2a..a0b00380e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6714,7 +6714,6 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word16 *memory_fx = &input_fx[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6725,7 +6724,7 @@ void elliptic_bpf_48k_generic_fx( { #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); - memory_fx[i] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); @@ -6741,10 +6740,10 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6760,9 +6759,9 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6777,8 +6776,8 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6793,7 +6792,7 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ #endif -- GitLab From 1523048c6db4c83b0b7ff43691cd0c652d435683 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:35:45 +0200 Subject: [PATCH 0215/1310] replace memory2_fx_2 with Ltmp2[-4] and delete memory2_fx_2 --- lib_com/swb_tbe_com_fx.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a0b00380e..901739af8 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6711,14 +6711,15 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output[L_FRAME48k], L_tmpX, L_tmpMax; + Word32 memory2_fx_3[4]; Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; -#endif Word32 memory2_fx_2[4], memory2_fx_3[4]; +#endif FOR( i = 0; i < 4; i++ ) { @@ -6975,16 +6976,16 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); } - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ @@ -6993,9 +6994,9 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_abs( L_output[0] ); - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ @@ -7005,8 +7006,8 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ @@ -7017,7 +7018,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 832ee83e0b76a8a82d70a81551aaffbe1b2e351b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:39:16 +0200 Subject: [PATCH 0216/1310] repoint memory2_fx_3 to L_output[4] which points to L_output_buffer[0] which has a size of (L_FRAME48k + 4) elements --- lib_com/swb_tbe_com_fx.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 901739af8..ea4e398b7 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6710,11 +6710,12 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output[L_FRAME48k], L_tmpX, L_tmpMax; - Word32 memory2_fx_3[4]; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; + Word32 *L_output = L_output_buffer[4]; + Word32 *memory2_fx_3 = L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; -- GitLab From e5909c8a6fa50dc7d6d6f04469503c850254cc4c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:44:04 +0200 Subject: [PATCH 0217/1310] replace memory2_fx_3 with L_output[-4] and delete memory2_fx_3 --- lib_com/swb_tbe_com_fx.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index ea4e398b7..2ff20d7b7 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6715,7 +6715,6 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; Word32 *L_output = L_output_buffer[4]; - Word32 *memory2_fx_3 = L_output[-4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; @@ -6978,7 +6977,7 @@ void elliptic_bpf_48k_generic_fx( FOR( j = 0; j < 4; j++ ) { L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -6988,10 +6987,10 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); @@ -7001,9 +7000,9 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); @@ -7014,8 +7013,8 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); @@ -7027,7 +7026,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -- GitLab From 67f9f2ccdf00dace12278242afd5e61097186f41 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 09:48:03 +0200 Subject: [PATCH 0218/1310] follow-up to 832ee83 : fix type error --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2ff20d7b7..79fa2c5d9 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6714,7 +6714,7 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *L_output = L_output_buffer[4]; + Word32 *L_output = &L_output_buffer[4]; #else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; -- GitLab From bdf812bdbfdb1398ba7606f7baab4ffa4a23dcba Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 10:06:07 +0200 Subject: [PATCH 0219/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 79fa2c5d9..c0c624e55 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6741,7 +6741,7 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6760,7 +6760,7 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else @@ -6777,7 +6777,7 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ #else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From a3807f9bd7cce0e96af354c38fbb45b36e2fb370 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 10:53:01 +0200 Subject: [PATCH 0220/1310] reintegrate loops - Upsampled-SPEEDUP not working --- Workspace_msvc/decoder.vcxproj | 344 +++++++------- Workspace_msvc/encoder.vcxproj | 354 +++++++-------- Workspace_msvc/lib_com.vcxproj | 680 ++++++++++++++-------------- Workspace_msvc/lib_debug.vcxproj | 240 +++++----- Workspace_msvc/lib_dec.vcxproj | 710 ++++++++++++++--------------- Workspace_msvc/lib_enc.vcxproj | 742 +++++++++++++++---------------- Workspace_msvc/lib_rend.vcxproj | 414 ++++++++--------- Workspace_msvc/lib_util.vcxproj | 312 ++++++------- Workspace_msvc/renderer.vcxproj | 358 +++++++-------- lib_com/swb_tbe_com_fx.c | 41 +- 10 files changed, 2092 insertions(+), 2103 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index ca0d96f44..c3a5a71d8 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 9578e488d..75b13f9bd 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 7a2aa8a7f..337fc98e2 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 929dd72a8..b6a8a7dd3 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2d06d29aa..60a24021f 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 86dcef905..7fe2ad96c 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index e47858ae3..10abdb438 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 86730b859..1cfb3e588 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index 70a130e31..ecd8b04aa 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c0c624e55..bfef8a445 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6709,6 +6709,7 @@ void elliptic_bpf_48k_generic_fx( { Word16 i, j; #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#define elliptic_bpf_48k_generic_loopstart 0 Word16 memory_fx0, Q_temp, Q_temp2; Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; @@ -6716,6 +6717,7 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp2 = &L_tmp2_buffer[4]; Word32 *L_output = &L_output_buffer[4]; #else +#define elliptic_bpf_48k_generic_loopstart 4 Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; @@ -6740,34 +6742,22 @@ void elliptic_bpf_48k_generic_fx( move32(); } -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#else +#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#else + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6776,13 +6766,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6792,11 +6777,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -#else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -#endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6877,8 +6858,9 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ { - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6902,6 +6884,8 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); + +#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6946,7 +6930,9 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ + + FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6982,6 +6968,8 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } + +#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7029,8 +7017,9 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ -- GitLab From 38f6813f2722952f262bb9179c27787e002745e5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 10:58:52 +0200 Subject: [PATCH 0221/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bfef8a445..1c8ba8ee5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6743,10 +6743,10 @@ void elliptic_bpf_48k_generic_fx( } #ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6755,9 +6755,9 @@ void elliptic_bpf_48k_generic_fx( move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6766,8 +6766,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6777,7 +6777,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 362d92bc1499a8181ddf5d93c0c1a862e9f73576 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:12:16 +0200 Subject: [PATCH 0222/1310] fix warning non-initialized L_tmpMax --- lib_com/swb_tbe_com_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1c8ba8ee5..e6919b0b6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6930,6 +6930,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#else + L_tmpMax = L_add( 0, 0 ); #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) @@ -7017,6 +7019,8 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#else + L_tmpMax = L_add( 0, 0 ); #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) -- GitLab From 373da4cf73ac8a6dc77b3097e82dbdd501624036 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:13:28 +0200 Subject: [PATCH 0223/1310] fix warning non-initialized L_tmp32, tmp16 --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e6919b0b6..bdaf47b69 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7189,8 +7189,8 @@ void synthesise_fb_high_band_fx( { #ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32; - Word16 tmp16; + Word32 L_tmp32 = L_add( 0, 0 ); + Word16 tmp16 = add( 0, 0 ); // if (L_tmp < 0) if ( L_tmp < 0 ) -- GitLab From 8c30014c3929668569850190b796ad6bd9e4a2f4 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:21:54 +0200 Subject: [PATCH 0224/1310] Revert "fix warning non-initialized L_tmp32, tmp16" This reverts commit 373da4cf73ac8a6dc77b3097e82dbdd501624036. --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bdaf47b69..e6919b0b6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7189,8 +7189,8 @@ void synthesise_fb_high_band_fx( { #ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32 = L_add( 0, 0 ); - Word16 tmp16 = add( 0, 0 ); + Word32 L_tmp32; + Word16 tmp16; // if (L_tmp < 0) if ( L_tmp < 0 ) -- GitLab From ac596390b751a3ede6bd9eb71875050d04c0bec3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:22:05 +0200 Subject: [PATCH 0225/1310] Revert "fix warning non-initialized L_tmpMax" This reverts commit 362d92bc1499a8181ddf5d93c0c1a862e9f73576. --- lib_com/swb_tbe_com_fx.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e6919b0b6..1c8ba8ee5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6930,8 +6930,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#else - L_tmpMax = L_add( 0, 0 ); #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) @@ -7019,8 +7017,6 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#else - L_tmpMax = L_add( 0, 0 ); #endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) -- GitLab From e9394af140f4b0709742f3bb7c4ff12952d9722f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:22:29 +0200 Subject: [PATCH 0226/1310] Revert "clang format patch" This reverts commit 38f6813f2722952f262bb9179c27787e002745e5. --- lib_com/swb_tbe_com_fx.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1c8ba8ee5..bfef8a445 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6743,10 +6743,10 @@ void elliptic_bpf_48k_generic_fx( } #ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6755,9 +6755,9 @@ void elliptic_bpf_48k_generic_fx( move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6766,8 +6766,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6777,7 +6777,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 884dbfd4231fd621ea073923ad827800d6045b5f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:22:45 +0200 Subject: [PATCH 0227/1310] Revert "reintegrate loops - Upsampled-SPEEDUP not working" This reverts commit a3807f9bd7cce0e96af354c38fbb45b36e2fb370. --- Workspace_msvc/decoder.vcxproj | 344 +++++++------- Workspace_msvc/encoder.vcxproj | 354 +++++++-------- Workspace_msvc/lib_com.vcxproj | 680 ++++++++++++++-------------- Workspace_msvc/lib_debug.vcxproj | 240 +++++----- Workspace_msvc/lib_dec.vcxproj | 710 ++++++++++++++--------------- Workspace_msvc/lib_enc.vcxproj | 742 +++++++++++++++---------------- Workspace_msvc/lib_rend.vcxproj | 414 ++++++++--------- Workspace_msvc/lib_util.vcxproj | 312 ++++++------- Workspace_msvc/renderer.vcxproj | 358 +++++++-------- lib_com/swb_tbe_com_fx.c | 41 +- 10 files changed, 2103 insertions(+), 2092 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index c3a5a71d8..ca0d96f44 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 75b13f9bd..9578e488d 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 337fc98e2..7a2aa8a7f 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0 - - - - StaticLibrary - v143 - false - MultiByte - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index b6a8a7dd3..929dd72a8 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0 - - - - StaticLibrary - v143 - MultiByte - - - StaticLibrary - v143 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 60a24021f..2d06d29aa 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0 - - - StaticLibrary - v143 - false - MultiByte - - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 7fe2ad96c..86dcef905 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0 - - - - StaticLibrary - v143 - false - MultiByte - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 10abdb438..e47858ae3 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0 - - - StaticLibrary - v143 - false - MultiByte - - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 1cfb3e588..86730b859 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0 - - - - StaticLibrary - v143 - MultiByte - - - StaticLibrary - v143 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index ecd8b04aa..70a130e31 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bfef8a445..c0c624e55 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6709,7 +6709,6 @@ void elliptic_bpf_48k_generic_fx( { Word16 i, j; #ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic -#define elliptic_bpf_48k_generic_loopstart 0 Word16 memory_fx0, Q_temp, Q_temp2; Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; @@ -6717,7 +6716,6 @@ void elliptic_bpf_48k_generic_fx( Word32 *L_tmp2 = &L_tmp2_buffer[4]; Word32 *L_output = &L_output_buffer[4]; #else -#define elliptic_bpf_48k_generic_loopstart 4 Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; @@ -6742,22 +6740,34 @@ void elliptic_bpf_48k_generic_fx( move32(); } -#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6766,8 +6776,13 @@ void elliptic_bpf_48k_generic_fx( L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6777,7 +6792,11 @@ void elliptic_bpf_48k_generic_fx( L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +#else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +#endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6858,9 +6877,8 @@ void elliptic_bpf_48k_generic_fx( } ELSE #endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ { - FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6884,8 +6902,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - -#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6930,9 +6946,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - - FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6968,8 +6982,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } - -#ifndef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7017,9 +7029,8 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - FOR( i = elliptic_bpf_48k_generic_loopstart; i < L_FRAME48k; i++ ) + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ -- GitLab From b013d8b3c6d3e8e9760349c69c189787429458c7 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:47:17 +0200 Subject: [PATCH 0228/1310] change macros FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig and FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic to FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - unrolls still active, loops starting at 4. no speedup functionality yet --- lib_com/options.h | 5 +- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 250 +++++++++++++++++++++++---------------- lib_enc/swb_tbe_enc_fx.c | 4 +- 4 files changed, 157 insertions(+), 104 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 58899a74b..42ea9fce4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -85,8 +85,9 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | - TBDeleted, code integrated in FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic +#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity *//*- TBDeleted, code integrated in FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 13b6fe2d8..8eb1a5c80 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,7 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fx[], /* i : input signal Q_input_fx*/ #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c0c624e55..fd1a043e1 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6695,7 +6695,7 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fx[], /* i : input signal Q_input_fx*/ #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -6708,7 +6708,7 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; @@ -6723,7 +6723,7 @@ void elliptic_bpf_48k_generic_fx( FOR( i = 0; i < 4; i++ ) { -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); #else @@ -6740,49 +6740,75 @@ void elliptic_bpf_48k_generic_fx( move32(); } -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#else - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#else - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif /*FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); #else - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -#endif + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6792,11 +6818,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -#else L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -#endif L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6806,77 +6828,8 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) - { - i = 4; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - FOR( ; i < L_FRAME48k; ) - { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ { FOR( i = 4; i < L_FRAME48k; i++ ) { @@ -6902,6 +6855,8 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6946,6 +6901,52 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#else + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + move32(); + L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#endif FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6982,6 +6983,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7029,6 +7031,56 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#else + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + move32(); + L_tmpMax = L_abs( L_output[0] ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + +#endif FOR( i = 4; i < L_FRAME48k; i++ ) { @@ -7113,7 +7165,7 @@ void synthesise_fb_high_band_fx( Word16 Qout ) { Word16 i, j; -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; #else diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index ef499ad6a..2d1e6b226 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7305,7 +7305,7 @@ void fb_tbe_enc_fx( Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fhb_buffer[L_FRAME48k + 4]; Word16 *input_fhb = &input_fhb_buffer[0] + 4; #else @@ -7427,7 +7427,7 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; -#ifdef FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; #else -- GitLab From 9d02d6b3d7218ceb6a41f4444ccd4baafa21db32 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 11:48:56 +0200 Subject: [PATCH 0229/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index fd1a043e1..eb294ce4f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6741,40 +6741,40 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6818,7 +6818,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From ada8a986cf568a58e7fca4741e5394ee40b4fbd8 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:02:27 +0200 Subject: [PATCH 0230/1310] integrate loops into speedup if and else branch --- lib_com/swb_tbe_com_fx.c | 103 +++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 27 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index eb294ce4f..2d8a94fb1 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6784,6 +6784,20 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6828,23 +6842,22 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif + + FOR( i = 4; i < L_FRAME48k; i++ ) { - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); } +#endif memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6901,6 +6914,21 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6946,21 +6974,22 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#endif + FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } +#endif + Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); @@ -7031,6 +7060,24 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7080,8 +7127,6 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#endif - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -7099,6 +7144,10 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } + +#endif + + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; -- GitLab From bbeea3d01908ccfa716a64677c4206cbf882af19 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:05:56 +0200 Subject: [PATCH 0231/1310] integrate loops into speedup if and else branch part 2 --- lib_com/swb_tbe_com_fx.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2d8a94fb1..045207844 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6741,6 +6741,8 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + int i = 0; + L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6751,6 +6753,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6762,6 +6765,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6773,6 +6777,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6784,8 +6789,9 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR( ; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6870,6 +6876,8 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + int i = 0; + L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6880,7 +6888,9 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); + i++; L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6891,7 +6901,9 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + i++; L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6902,7 +6914,9 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + i++; L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6913,9 +6927,10 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); + i++; L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR( ; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7013,6 +7028,8 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + int i = 0; + L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7024,6 +7041,7 @@ void elliptic_bpf_48k_generic_fx( L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); L_tmpMax = L_abs( L_output[0] ); + i++; L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7036,6 +7054,7 @@ void elliptic_bpf_48k_generic_fx( L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + i++; L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ @@ -7048,6 +7067,7 @@ void elliptic_bpf_48k_generic_fx( L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + i++; L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7060,8 +7080,9 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + i++; - FOR( i = 4; i < L_FRAME48k; i++ ) + FOR(; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ -- GitLab From ead5a949b11851cd312909773f9abff92f8f898c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:06:55 +0200 Subject: [PATCH 0232/1310] integrate loops into speedup if and else branch part 3 --- lib_com/swb_tbe_com_fx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 045207844..e89e25de8 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6697,6 +6697,7 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fx[], /* i : input signal Q_input_fx*/ + int i; #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif @@ -6741,7 +6742,7 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - int i = 0; + i = 0; L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6876,7 +6877,7 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - int i = 0; + i = 0; L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7028,7 +7029,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - int i = 0; + i = 0; L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 95b2b85957ae2f96d722868458cc72b346513104 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:09:40 +0200 Subject: [PATCH 0233/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e89e25de8..808ac1495 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6701,7 +6701,7 @@ void elliptic_bpf_48k_generic_fx( #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif - Word16 *Q_input_fx, + Word16 * Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ Word16 memory_fx_Q[], @@ -7083,7 +7083,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); i++; - FOR(; i < L_FRAME48k; i++ ) + FOR( ; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ -- GitLab From 60ccd1121e766b75c22d0e9e1c128b004a57c6de Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:10:25 +0200 Subject: [PATCH 0234/1310] fix build error --- lib_com/swb_tbe_com_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 808ac1495..2e3937c1b 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6697,7 +6697,6 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fx[], /* i : input signal Q_input_fx*/ - int i; #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif -- GitLab From 146e7cd9e69115433cf667bdc2c0163285f29529 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:12:39 +0200 Subject: [PATCH 0235/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2e3937c1b..7f81060ef 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6700,7 +6700,7 @@ void elliptic_bpf_48k_generic_fx( #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ #endif - Word16 * Q_input_fx, + Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ Word16 memory_fx_Q[], -- GitLab From 3482733adc3f46e3b7b32130490d00a0982198ff Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:23:21 +0200 Subject: [PATCH 0236/1310] replace unrolled loop bodies by rolled ones - slight change: subs and adds alternate and saturate now --- lib_com/swb_tbe_com_fx.c | 232 +++++++++++++++++++-------------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 7f81060ef..466f11af5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6743,51 +6743,51 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic i = 0; - L_tmpX = L_shr( L_mult( input_fx[0 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[1 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[2 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[3 - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; @@ -6878,57 +6878,57 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic i = 0; - L_tmpX = L_shr( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); i++; - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); i++; - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); i++; - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); i++; - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); FOR( ; i < L_FRAME48k; i++ ) { @@ -7030,56 +7030,56 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic i = 0; - L_tmpX = L_shr( Mult_32_16( L_tmp2[0 - 4], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); - L_tmpMax = L_abs( L_output[0] ); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); i++; - L_tmpX = L_shr( Mult_32_16( L_tmp2[1 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); i++; - L_tmpX = L_shr( Mult_32_16( L_tmp2[2 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); i++; - L_tmpX = L_shr( Mult_32_16( L_tmp2[3 - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[3 - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); i++; FOR( ; i < L_FRAME48k; i++ ) -- GitLab From 58dc59bcc05d5d79a7b1a602e732b6055c5aab15 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:37:16 +0200 Subject: [PATCH 0237/1310] clang format patch --- lib_com/swb_tbe_com_fx.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 466f11af5..5369972c5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7069,13 +7069,13 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); i++; - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); -- GitLab From 5813c00d8007d85875a08d8c372fef55afee6e8a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 12:39:26 +0200 Subject: [PATCH 0238/1310] fix warning uninitialized --- lib_com/swb_tbe_com_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5369972c5..b2223a174 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6710,7 +6710,8 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX, L_tmpMax; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; + Word32 L_tmpMax = L_add( 0, 0 ); Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; -- GitLab From 834a5383d1f5697814384c1d6212179afbc01ba5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 13:22:04 +0200 Subject: [PATCH 0239/1310] delete unnecessary unrolls --- lib_com/options.h | 16 ++-- lib_com/swb_tbe_com_fx.c | 164 +-------------------------------------- 2 files changed, 9 insertions(+), 171 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 42ea9fce4..6063c208a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,15 +80,11 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT -// -// new speedups -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | - TBDeleted, code integrated in FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic -#define FIX_1439_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity *//*- TBDeleted, code integrated in FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity */ - -#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares another speedup patch*/ + +#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index b2223a174..386b7285f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6742,57 +6742,7 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - i = 0; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - FOR( ; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6877,61 +6827,7 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - i = 0; - - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - i++; - - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - i++; - - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - i++; - - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - i++; - - FOR( ; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7029,61 +6925,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - i = 0; - - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - i++; - - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - i++; - - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - i++; - - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - i++; - - FOR( ; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ -- GitLab From 3ad19ded3976182c9c04b30e15b8d0dcd89236d1 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 13:47:25 +0200 Subject: [PATCH 0240/1310] introduced STAGE2, but still not functional and inactive - implemented speedup for STAGE0 and activated --- lib_com/options.h | 5 +- lib_com/prot_fx.h | 4 ++ lib_com/swb_tbe_com_fx.c | 127 +++++++++++++++++++++++++++++++++++---- lib_enc/swb_tbe_enc_fx.c | 25 +++++++- 4 files changed, 145 insertions(+), 16 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6063c208a..6b7dcd93d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -83,8 +83,9 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares another speedup patch*/ - #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / + #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 8eb1a5c80..702cdea12 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,11 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS; +#endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 386b7285f..76ae12e85 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6695,7 +6695,11 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS; +#endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ #else const Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -6742,19 +6746,57 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } +#else + IF( !IsUpsampled3 ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } + } + ELSE + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } + } +#endif #else L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6827,6 +6869,26 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + // L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#else FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6841,6 +6903,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } +#endif #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6925,6 +6988,30 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( 0 = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + // L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#else FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -6942,6 +7029,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } +#endif #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7108,12 +7196,29 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx + + ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx + ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 2d1e6b226..484b81742 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,7 +7330,14 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7459,11 +7466,23 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , 1 // IsUpsampled3 + , 1 // isIVAS +#endif + ); } test(); -- GitLab From e9ed6057fb87635180b9ba5248a63565f3cb9b12 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 13:51:31 +0200 Subject: [PATCH 0241/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 19 +++++++++---------- lib_enc/swb_tbe_enc_fx.c | 18 ++++++++++-------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 76ae12e85..34f6367ff 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6784,14 +6784,14 @@ void elliptic_bpf_48k_generic_fx( { FOR( i = 0; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } @@ -7217,8 +7217,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 #endif - excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx - ); + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 484b81742..adcf85c54 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7466,22 +7466,24 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( + elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 1 // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 0, // IsUpsampled3 + 0, // IsUpsampled3 #endif - input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , 1 // IsUpsampled3 - , 1 // isIVAS -#endif + , + 1 // IsUpsampled3 + , + 1 // isIVAS +#endif ); } -- GitLab From 3c7264633c174dea95b44d7ffa2c5f0b63234240 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 13:54:19 +0200 Subject: [PATCH 0242/1310] fix build error --- lib_enc/swb_tbe_enc_fx.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index adcf85c54..be0dd84e5 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7477,14 +7477,14 @@ void fb_tbe_enc_ivas_fx( } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx + elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - 1 // IsUpsampled3 - , - 1 // isIVAS + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 #endif - ); + input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From 02fef875c959af3e8a45981a0c3b49526a26bbf9 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 14:48:19 +0200 Subject: [PATCH 0243/1310] unrolled BEspeedup by 3 --- lib_com/swb_tbe_com_fx.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 34f6367ff..16ffc719e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6782,7 +6782,7 @@ void elliptic_bpf_48k_generic_fx( } ELSE { - FOR( i = 0; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k;) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6794,6 +6794,31 @@ void elliptic_bpf_48k_generic_fx( // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + i++; + + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; } } #endif -- GitLab From 1a17fbc2bf8327b882a47fbf3a1825e008c32c51 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 9 Apr 2025 14:50:36 +0200 Subject: [PATCH 0244/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 16ffc719e..16c35701e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6782,7 +6782,7 @@ void elliptic_bpf_48k_generic_fx( } ELSE { - FOR( i = 0; i < L_FRAME48k;) + FOR( i = 0; i < L_FRAME48k; ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6796,24 +6796,24 @@ void elliptic_bpf_48k_generic_fx( move32(); i++; - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -- GitLab From 7436e9696b190bd4af140cd645d42a2c9a033993 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 9 Apr 2025 16:40:06 +0200 Subject: [PATCH 0245/1310] adjust to new scripts in compare-to-input test --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d7de529a5..5950fa19b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -836,8 +836,8 @@ stages: # create summary - mkdir $IMAGES_ARTIFACT_NAME - - for MEASURE in MLD DIFF SSNR ODG;do python3 scripts/create_histogram_summary.py report-diff.csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".csv $IMAGES_ARTIFACT_NAME/summary_"$MEASURE".png --measure $MEASURE --diff; done - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME + - python3 scripts/create_histograms.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms --no-bins + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME --measures $MEASURES_FOR_REPORT - exit 0 -- GitLab From f2927e211fa53161b7e9876803c484efddd52577 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 9 Apr 2025 16:56:05 +0200 Subject: [PATCH 0246/1310] fix histogram command --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5950fa19b..b4a1405cd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -836,7 +836,7 @@ stages: # create summary - mkdir $IMAGES_ARTIFACT_NAME - - python3 scripts/create_histograms.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms --no-bins + - python3 scripts/create_histograms.py report-diff.csv $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms --no-bins - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME --measures $MEASURES_FOR_REPORT - exit 0 -- GitLab From 4e6d3527c28936f542a435eb303c22c52f0d4e2d Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 9 Apr 2025 18:20:46 +0200 Subject: [PATCH 0247/1310] fix command again --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b4a1405cd..46e941af8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -837,7 +837,7 @@ stages: # create summary - mkdir $IMAGES_ARTIFACT_NAME - python3 scripts/create_histograms.py report-diff.csv $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms --no-bins - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME --measures $MEASURES_FOR_REPORT + - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - exit 0 -- GitLab From f5a6d8c16ceade57b154badb6b9998a5d70e11d3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 08:50:45 +0200 Subject: [PATCH 0248/1310] fix error in unrolled upsampled3 functionality --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 16c35701e..f3ce08a93 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6810,7 +6810,7 @@ void elliptic_bpf_48k_generic_fx( // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 6dcde3530c81a763aa2f3204ecaf6df5a61de6fe Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 08:59:36 +0200 Subject: [PATCH 0249/1310] apply clang format patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index f3ce08a93..b0047802d 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6810,7 +6810,7 @@ void elliptic_bpf_48k_generic_fx( // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 74d86e358fa5dbc771e10ab63d8c9a0bc6d23e65 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 09:18:05 +0200 Subject: [PATCH 0250/1310] deactivate upsampled3 --- lib_com/swb_tbe_com_fx.c | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index b0047802d..215f2a84f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6716,6 +6716,10 @@ void elliptic_bpf_48k_generic_fx( Word16 memory_fx0, Q_temp, Q_temp2; Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; Word32 L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + Word64 W_tmpX; + Word64 W_tmpY; +#endif Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; @@ -6746,28 +6750,24 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - } -#else - IF( !IsUpsampled3 ) + IF( 1 /* !IsUpsampled3*/ ) { FOR( i = 0; i < L_FRAME48k; i++ ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6778,6 +6778,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } } ELSE @@ -6806,7 +6807,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - i++; + i++; // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6821,8 +6822,7 @@ void elliptic_bpf_48k_generic_fx( i++; } } -#endif -#else +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6881,7 +6881,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } -#endif +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; -- GitLab From 61bcd699753813516bbe7124b2598c0429c7643b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 09:20:11 +0200 Subject: [PATCH 0251/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 215f2a84f..de843d9ed 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6755,7 +6755,7 @@ void elliptic_bpf_48k_generic_fx( FOR( i = 0; i < L_FRAME48k; i++ ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); @@ -6767,7 +6767,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6807,7 +6807,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - i++; + i++; // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6822,7 +6822,7 @@ void elliptic_bpf_48k_generic_fx( i++; } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 169b2dcb971e696a01b785c9e5b65b17afb507e3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 09:22:46 +0200 Subject: [PATCH 0252/1310] fix unused variable error --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index de843d9ed..a1866d831 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6750,7 +6750,7 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - IF( 1 /* !IsUpsampled3*/ ) + IF( 1 || !IsUpsampled3 ) { FOR( i = 0; i < L_FRAME48k; i++ ) { -- GitLab From 21a7f761078722c6c18d4d43ed07f3890571ca53 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 09:57:25 +0200 Subject: [PATCH 0253/1310] fix and activate upsampled3 --- lib_com/swb_tbe_com_fx.c | 48 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a1866d831..8d5cdfcda 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6750,7 +6750,7 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - IF( 1 || !IsUpsampled3 ) + IF( !IsUpsampled3 ) { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6785,38 +6785,38 @@ void elliptic_bpf_48k_generic_fx( { FOR( i = 0; i < L_FRAME48k; ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; -- GitLab From cdc6a0c27c0465e84f8d02475938a77f407d92c5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 10:25:12 +0200 Subject: [PATCH 0254/1310] move stage2 code into loops --- lib_com/swb_tbe_com_fx.c | 115 ++++++++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 45 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8d5cdfcda..a71251ba4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6785,41 +6785,82 @@ void elliptic_bpf_48k_generic_fx( { FOR( i = 0; i < L_FRAME48k; ) { - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; +#else + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - //L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - //L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } } #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ @@ -6894,11 +6935,9 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { - Word64 W_tmpX; - Word64 W_tmpY; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); @@ -6908,14 +6947,10 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - // L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } -#else - FOR( i = 0; i < L_FRAME48k; i++ ) - { +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ @@ -6927,8 +6962,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } -#endif #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7013,32 +7048,22 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( 0 = 4; i < L_FRAME48k; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) { - Word64 W_tmpX; - Word64 W_tmpY; - +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - // L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#else - FOR( i = 0; i < L_FRAME48k; i++ ) - { +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ @@ -7053,8 +7078,8 @@ void elliptic_bpf_48k_generic_fx( L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } -#endif #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 4b91e6417af3003e1d4010668693331211a89fc3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 10:33:37 +0200 Subject: [PATCH 0255/1310] Delete unused code within upsampled3-section --- lib_com/swb_tbe_com_fx.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a71251ba4..520aa67ea 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6786,12 +6786,9 @@ void elliptic_bpf_48k_generic_fx( FOR( i = 0; i < L_FRAME48k; ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); @@ -6800,37 +6797,27 @@ void elliptic_bpf_48k_generic_fx( i++; W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; #else - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6838,25 +6825,18 @@ void elliptic_bpf_48k_generic_fx( i++; L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; -- GitLab From 171201666215606eb2f1f75d7725bdd6745d7ab3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 10:42:10 +0200 Subject: [PATCH 0256/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 520aa67ea..7b1fe9cd2 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6815,28 +6815,28 @@ void elliptic_bpf_48k_generic_fx( move32(); i++; #else - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; -- GitLab From 57b563d4c0df7df61d76f4411f6d22b17c76e8aa Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 11:19:11 +0200 Subject: [PATCH 0257/1310] place a FOR loop identifier in every preproc branch --- lib_com/swb_tbe_com_fx.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 7b1fe9cd2..7baa27b75 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6752,9 +6752,9 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic IF( !IsUpsampled3 ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); @@ -6767,7 +6767,10 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6778,14 +6781,14 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } ELSE { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); @@ -6814,7 +6817,10 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); i++; + } #else + FOR( i = 0; i < L_FRAME48k; ) + { L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6840,8 +6846,8 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); i++; -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6915,9 +6921,9 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); @@ -6930,7 +6936,10 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ @@ -6942,8 +6951,9 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + #else L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7028,9 +7038,9 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); @@ -7043,7 +7053,10 @@ void elliptic_bpf_48k_generic_fx( L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ @@ -7058,8 +7071,8 @@ void elliptic_bpf_48k_generic_fx( L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ #else L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 9d4e2a2efa9dbcf38fd0f3ee9a35b1a4b91f62af Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 10 Apr 2025 11:49:14 +0200 Subject: [PATCH 0258/1310] Fixed an error in the transition from MDCT to ACELP --- lib_dec/ivas_mdct_core_dec_fx.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index af37ce751..177f49180 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1264,6 +1264,9 @@ void ivas_mdct_core_reconstruct_fx( move16(); st->hHQ_core->Q_old_wtda_LB = st->Q_syn; move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Scale_sig( st->mem_syn2_fx, M, -1 ); // -1 should be calculated from q_win. +#endif } ELSE /*ACELP core for ACELP-PLC */ { -- GitLab From 8a71640db2e9a2f8f628f0e8254d0fbfb863c3b8 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 10 Apr 2025 11:54:03 +0200 Subject: [PATCH 0259/1310] Applied Clang formatting patch. --- lib_dec/ivas_mdct_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 177f49180..77673c3bb 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1265,7 +1265,7 @@ void ivas_mdct_core_reconstruct_fx( st->hHQ_core->Q_old_wtda_LB = st->Q_syn; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - Scale_sig( st->mem_syn2_fx, M, -1 ); // -1 should be calculated from q_win. + Scale_sig( st->mem_syn2_fx, M, -1 ); // -1 should be calculated from q_win. #endif } ELSE /*ACELP core for ACELP-PLC */ -- GitLab From d41a00b7701d562e031629d9f028e37add6d356e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 11:59:52 +0200 Subject: [PATCH 0260/1310] deactivate STAGE2 and func1 - implement func1 --- lib_com/options.h | 1 + lib_com/swb_tbe_com_fx.c | 133 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 128 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6b7dcd93d..35d09abf5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -87,5 +87,6 @@ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 7baa27b75..bff330286 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6687,6 +6687,112 @@ void wb_tbe_extras_reset_synth_fx( return; } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 L_tmpMax ) +{ + Word32 L_tmpX; + Word16 i; + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } +#else + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } +#endif + } /*IsUpsampled3*/ + ELSE + { /*IsUpsampled3*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ +} +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * @@ -6715,7 +6821,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; - Word32 L_tmpMax = L_add( 0, 0 ); + Word32 L_tmpMax; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word64 W_tmpX; Word64 W_tmpY; @@ -6750,6 +6856,10 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); +#else IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -6783,7 +6893,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } + } /*IsUpsampled3*/ ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -6848,7 +6958,9 @@ void elliptic_bpf_48k_generic_fx( i++; } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } + } /*IsUpsampled3*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6921,6 +7033,10 @@ void elliptic_bpf_48k_generic_fx( move32(); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); +#else #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6953,8 +7069,8 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - -#else +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7038,6 +7154,10 @@ void elliptic_bpf_48k_generic_fx( move32(); } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); +#else #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7073,7 +7193,8 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ -#else +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 60212ef02f092f66dd92147fb54af52b90f920e2 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 12:09:07 +0200 Subject: [PATCH 0261/1310] implement maxabs in func1, STAGE2 and func1 still inactive --- lib_com/swb_tbe_com_fx.c | 72 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index bff330286..2974ccac1 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6688,10 +6688,13 @@ void wb_tbe_extras_reset_synth_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 L_tmpMax ) +inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) { Word32 L_tmpX; Word16 i; + Word32 L_tmpMax2 = *L_tmpMax; + Word32 L_tmpAbs; + move32(); IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -6708,6 +6711,14 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } } #else FOR( i = 0; i < L_FRAME48k; i++ ) @@ -6722,6 +6733,15 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } #endif } /*IsUpsampled3*/ @@ -6738,6 +6758,14 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } i++; W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); @@ -6748,6 +6776,14 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } i++; W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); @@ -6757,6 +6793,14 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } i++; } #else @@ -6769,6 +6813,14 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } i++; L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6778,6 +6830,14 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } i++; L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -6786,10 +6846,20 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } i++; } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ + *L_tmpMax = L_tmpMax2; + move32(); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -- GitLab From 090be8f36fd988d1aebf50bcf1c3ee50569139e0 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 12:11:20 +0200 Subject: [PATCH 0262/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 239 +++++++++++++++++++-------------------- 1 file changed, 119 insertions(+), 120 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2974ccac1..f1492b0b4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6723,14 +6723,14 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t #else FOR( i = 0; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); if ( L_tmpMax > 0 ) @@ -6741,125 +6741,124 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } - } #endif - } /*IsUpsampled3*/ - ELSE - { /*IsUpsampled3*/ + } /*IsUpsampled3*/ + ELSE + { /*IsUpsampled3*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } + i++; + } #else - FOR( i = 0; i < L_FRAME48k; ) + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ - *L_tmpMax = L_tmpMax2; - move32(); + } /*IsUpsampled3*/ + *L_tmpMax = L_tmpMax2; + move32(); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ @@ -6948,7 +6947,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7140,7 +7139,7 @@ void elliptic_bpf_48k_generic_fx( } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7264,7 +7263,7 @@ void elliptic_bpf_48k_generic_fx( } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 2294ff5ff00a5425cf0136481de99a58b042d265 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:00:38 +0200 Subject: [PATCH 0263/1310] swb_tbe_com: coments general: use ISAVAS information to switch STAGE2 on and off --- lib_com/prot_fx.h | 6 +++++- lib_com/swb_tbe_com_fx.c | 20 ++++++++++++-------- lib_dec/swb_tbe_dec_fx.c | 12 ++++++++++-- lib_enc/swb_tbe_enc_fx.c | 6 +++--- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 702cdea12..a230a83c7 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3285,7 +3285,11 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ); + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , Word16 isIVAS +#endif +); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index f1492b0b4..8977dae08 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6926,9 +6926,9 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); -#else +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -7103,9 +7103,9 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); -#else +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7226,7 +7226,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); -#else +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7396,7 +7396,11 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ) + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , Word16 isIVAS +#endif +) { Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic @@ -7431,7 +7435,7 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 @@ -7445,7 +7449,7 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 00be6455d..4f8c04eb6 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,7 +4644,11 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + ,0 /*isIVAS*/ +#endif + ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4713,7 +4717,11 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , Word16 1 /*isIVAS*/ +#endif + ); test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index be0dd84e5..3fe74d1a0 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7332,7 +7332,7 @@ void fb_tbe_enc_fx( elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 0 // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7468,7 +7468,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 1 // isIVAS - is this corret? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7479,7 +7479,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 1 // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -- GitLab From 7d06c195a51eb028b63585b0de04bbb01dea6a16 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:08:17 +0200 Subject: [PATCH 0264/1310] activate func1 --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 35d09abf5..37a941590 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -87,6 +87,6 @@ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From 1e85b77367047724ac26f7b5f70fdaa06e399ba9 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:21:23 +0200 Subject: [PATCH 0265/1310] remove all BE changes --- lib_com/options.h | 7 +- lib_com/swb_tbe_com_fx.c | 195 ----------------------------- lib_com/tools_fx.c | 24 ---- lib_dec/ivas_stereo_icbwe_dec_fx.c | 10 -- lib_dec/swb_tbe_dec_fx.c | 5 - 5 files changed, 1 insertion(+), 240 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index bb95f74df..99c6e8eb6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,12 +81,7 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT -// new speedups - BE ones already in another branch -//#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | 2.4 WMOPS -//#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig /*FhG: reduces WMOPS - bit-exact*/ // | -//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx // | 0.4 WMOPS - BE? Need for a manual test as long as be tests dont work + #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | #define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 9e85b4175..3fec692dc 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6767,89 +6767,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); #ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) - { - Word64 W_tmpX; - Word64 W_tmpY; - i = 4; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - FOR( ; i < L_FRAME48k; ) - { - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //2 - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); // 3 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //4 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //5 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); // 3 - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //4 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); //5 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //7 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - // W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); //4 - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); //5 - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); // 6 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); //7 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - // W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); //8 - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ { FOR( i = 4; i < L_FRAME48k; i++ ) { @@ -6871,76 +6788,6 @@ void elliptic_bpf_48k_generic_fx( } #else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig - test(); - IF( full_band_bpf_fx == full_band_bpf_3_fx || full_band_bpf_fx == full_band_bpf_1_fx ) - { - i = 4; - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 0 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 1 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - FOR( ; i < L_FRAME48k; ) - { - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 2 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 3 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - // L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); // 4 /*Q_input_fx + 13 + 1 - 3*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); // 5 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); // 6 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); // 7 /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - // L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); // 8 /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_upsampledsig*/ { FOR( i = 4; i < L_FRAME48k; i++ ) { @@ -7307,47 +7154,6 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx - L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32; - Word16 tmp16; - - if ( L_tmp < 0 ) - { - L_tmp32 = L_negate( L_tmp ); - } - if ( L_tmp < 0 ) - { - L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); - } - if ( L_tmp < 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - if ( L_tmp < 0 ) - { - tmp16 = negate( tmp16 ); - } - - if ( L_tmp == 0 ) - { - tmp16 = 0; - move16(); - } - - if ( L_tmp > 0 ) - { - L_tmp32 = L_shl_sat( L_tmp, tmp3 ); - } - if ( L_tmp > 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - - output[i] = tmp16; - move16(); - -#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7359,7 +7165,6 @@ void synthesise_fb_high_band_fx( output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); } -#endif } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 756b5be80..8316452ba 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,29 +794,6 @@ void Copy_Scale_sig_16_32_no_sat( } return; } -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat - L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - - IF( L_tmp >= 0x7FFF ) - { - FOR( i = 0; i < lg; i++ ) - { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* Overflow can occur here */ - } - return; - } - // ELSE - { - Word16 tmp = extract_l( L_tmp ); - FOR( i = 0; i < lg; i++ ) - { - y[i] = L_mult( x[i], tmp ); - move32(); - } - } -#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) { @@ -824,7 +801,6 @@ void Copy_Scale_sig_16_32_no_sat( y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); move32(); /* Overflow can occur here */ } -#endif } void Copy_Scale_sig_32_16( diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index 772eb2d7d..c7bc98566 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,9 +904,6 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); -#endif FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -914,17 +911,10 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - if ( LE_16( alpha_fx, winSlope_fx_ ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ - } -#else IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } -#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index bb0d6f2e0..8da680bf8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7037,17 +7037,12 @@ void ivas_swb_tbe_dec_fx( FOR( i = 0; i < L_FRAME16k; i++ ) { -#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } -#else - Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ -#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); -- GitLab From 88c2dd4595710a177de9832a967949c96d654c69 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:30:40 +0200 Subject: [PATCH 0266/1310] add changes from BE branch concerning elliptic_bpf_48k - deactivated STAGE2 and func1 --- lib_com/options.h | 11 +- lib_com/prot_fx.h | 18 +- lib_com/swb_tbe_com_fx.c | 588 +++++++++++++++++++++++++++++++-------- lib_dec/swb_tbe_dec_fx.c | 15 +- lib_enc/swb_tbe_enc_fx.c | 39 ++- 5 files changed, 534 insertions(+), 137 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 99c6e8eb6..efd9f65cf 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,13 +80,8 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - - -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | - -//----------------------------------------------------------------------- -// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1452d8e2e..9435087b4 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,15 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : i signal Q_input_fx */ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS; +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else + const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ @@ -3277,8 +3285,12 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ); - + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 isIVAS +#endif +); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ #ifdef ADD_IVAS_TBE_CODE diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 3fec692dc..b83aa0413 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6688,14 +6688,198 @@ void wb_tbe_extras_reset_synth_fx( return; } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +{ + Word32 L_tmpX; + Word16 i; + Word32 L_tmpMax2 = *L_tmpMax; + Word32 L_tmpAbs; + move32(); + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#else + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#endif + } /*IsUpsampled3*/ + ELSE + { /*IsUpsampled3*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ + *L_tmpMax = L_tmpMax2; + move32(); +} +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ + void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS; +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6704,18 +6888,36 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 memory_fx0, Q_temp, Q_temp2; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; + Word32 L_tmpMax; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + Word64 W_tmpX; + Word64 W_tmpY; +#endif + + Word32 *L_tmp = &L_tmp_buffer[4]; + Word32 *L_tmp2 = &L_tmp2_buffer[4]; + Word32 *L_output = &L_output_buffer[4]; +#else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; - Word32 L_output[L_FRAME48k]; +#endif FOR( i = 0; i < 4; i++ ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + memory_fx0 = extract_l( memory_fx2[0][i] ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); +#else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); +#endif + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -6723,55 +6925,17 @@ void elliptic_bpf_48k_generic_fx( move32(); } - - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + IF( !IsUpsampled3 ) { - FOR( i = 4; i < L_FRAME48k; i++ ) +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) { - Word64 W_tmpX; - Word64 W_tmpY; + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); @@ -6781,15 +6945,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } - } - -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ - { - FOR( i = 4; i < L_FRAME48k; i++ ) +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6802,9 +6962,135 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } - } -#endif +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ + ELSE + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6815,6 +7101,46 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6860,43 +7186,22 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 4; i < L_FRAME48k; i++ ) { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } +#endif + -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -6912,12 +7217,54 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -6965,30 +7312,7 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -7006,7 +7330,10 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } + #endif + + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -7070,7 +7397,12 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ) + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 isIVAS +#endif +) { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; @@ -7100,12 +7432,28 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx + + ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 8da680bf8..b8ebb033e 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,7 +4644,12 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + 0 /*isIVAS*/ +#endif + ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4714,7 +4719,13 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ push_wmops( "synthesise_fb_high_band" ); - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + /* FB TBE synthesis */ + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 1 /*isIVAS*/ +#endif + ); pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 316a5b549..3fe74d1a0 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7299,13 +7299,18 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; - Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_buffer[L_FRAME48k + 4]; + Word16 *input_fhb = &input_fhb_buffer[0] + 4; +#else + Word16 input_fhb[L_FRAME48k]; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); @@ -7325,7 +7330,14 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 0 // isIVAS - is this correct? +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7422,7 +7434,12 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; + Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; +#else Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; +#endif Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; @@ -7449,11 +7466,25 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS - is this corret? +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS - is this correct? +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From 006443f447927c1029638f3cc55e932fcff8fec8 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:33:04 +0200 Subject: [PATCH 0267/1310] clang patch --- lib_com/prot_fx.h | 3 ++- lib_com/swb_tbe_com_fx.c | 9 +++++---- lib_dec/swb_tbe_dec_fx.c | 18 ++++++++++-------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index a230a83c7..bab4533cb 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3287,7 +3287,8 @@ void synthesise_fb_high_band_fx( Word16 bpf_memory_Q[], Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , Word16 isIVAS + , + Word16 isIVAS #endif ); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8977dae08..accee64bc 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7103,7 +7103,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -7396,9 +7396,10 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , Word16 isIVAS + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 isIVAS #endif ) { diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 4f8c04eb6..5c0f43639 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,10 +4644,11 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - ,0 /*isIVAS*/ -#endif + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + 0 /*isIVAS*/ +#endif ); /* add the fb_synth component to the hb_synth component */ @@ -4717,10 +4718,11 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , Word16 1 /*isIVAS*/ -#endif + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 1 /*isIVAS*/ +#endif ); test(); -- GitLab From 771fc273d21d96517467e04592381eb8f7d3001c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:08:30 +0200 Subject: [PATCH 0268/1310] fix type error --- Workspace_msvc/decoder.vcxproj | 344 +++++++------- Workspace_msvc/encoder.vcxproj | 354 +++++++-------- Workspace_msvc/lib_com.vcxproj | 680 ++++++++++++++-------------- Workspace_msvc/lib_debug.vcxproj | 240 +++++----- Workspace_msvc/lib_dec.vcxproj | 710 ++++++++++++++--------------- Workspace_msvc/lib_enc.vcxproj | 742 +++++++++++++++---------------- Workspace_msvc/lib_rend.vcxproj | 414 ++++++++--------- Workspace_msvc/lib_util.vcxproj | 312 ++++++------- Workspace_msvc/renderer.vcxproj | 358 +++++++-------- lib_com/swb_tbe_com_fx.c | 2 +- 10 files changed, 2078 insertions(+), 2078 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index ca0d96f44..c3a5a71d8 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 9578e488d..75b13f9bd 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 7a2aa8a7f..337fc98e2 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 929dd72a8..b6a8a7dd3 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2d06d29aa..60a24021f 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 86dcef905..7fe2ad96c 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index e47858ae3..10abdb438 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 86730b859..1cfb3e588 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index 70a130e31..ecd8b04aa 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index accee64bc..624bafa78 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6688,7 +6688,7 @@ void wb_tbe_extras_reset_synth_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) { Word32 L_tmpX; Word16 i; -- GitLab From 0aecdf09691c911aa34cab9db235b5f0bdc1cc21 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:09:50 +0200 Subject: [PATCH 0269/1310] fix type error --- lib_com/swb_tbe_com_fx.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 624bafa78..67240e540 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6711,11 +6711,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6733,11 +6733,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6757,11 +6757,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6775,11 +6775,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6792,11 +6792,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6812,11 +6812,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6829,11 +6829,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6845,11 +6845,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } -- GitLab From 1c6062c62decac67f36200ac02de64d361b94ecb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:15:33 +0200 Subject: [PATCH 0270/1310] deactivate func1, activate STAGE2 --- lib_com/options.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 37a941590..dc144cd1a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,7 +86,7 @@ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From ce94cf8dd649ca3ff7f2520340de30de222ab5ee Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:47:01 +0200 Subject: [PATCH 0271/1310] fix build errors --- lib_com/options.h | 2 +- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 303 +++++++++++++++++++++------------------ lib_dec/swb_tbe_dec_fx.c | 2 +- lib_enc/swb_tbe_enc_fx.c | 6 +- 5 files changed, 169 insertions(+), 146 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index dc144cd1a..8651c0671 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,7 +86,7 @@ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index bab4533cb..292c82206 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3259,7 +3259,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; + int isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 67240e540..e14fda2a2 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6871,7 +6871,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; + int isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -6889,8 +6889,9 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; Word32 L_tmpMax; + Word32 L_tmpX; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word64 W_tmpX; Word64 W_tmpY; @@ -6932,101 +6933,111 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) + IF( isIVAS ) { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } } -#else - FOR( i = 0; i < L_FRAME48k; ) + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ @@ -7107,37 +7118,43 @@ void elliptic_bpf_48k_generic_fx( elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7228,40 +7245,46 @@ void elliptic_bpf_48k_generic_fx( elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ @@ -7436,7 +7459,7 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS + isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 @@ -7450,7 +7473,7 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS + isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 5c0f43639..2994c2878 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4721,7 +4721,7 @@ void fb_tbe_dec_ivas_fx( synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , - Word16 1 /*isIVAS*/ + 1 /*isIVAS*/ #endif ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 3fe74d1a0..f42bd262a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7332,7 +7332,7 @@ void fb_tbe_enc_fx( elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 0 // isIVAS - is this correct? + 0, // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7468,7 +7468,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS - is this corret? + 1, // isIVAS - is this corret? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7479,7 +7479,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS - is this correct? + 1, // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -- GitLab From bc0565c1160cf97a4d23b9137fc608955e6bd890 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:15:33 +0200 Subject: [PATCH 0272/1310] deactivate func1, activate STAGE2 --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index efd9f65cf..01900a847 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,7 +81,7 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From 7fd231f4e0784a996a9b24484030cc875f3219a1 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:57:27 +0200 Subject: [PATCH 0273/1310] fix build errors --- lib_com/swb_tbe_com_fx.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index b83aa0413..5c2c74e2e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6712,11 +6712,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6734,11 +6734,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6758,11 +6758,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6776,11 +6776,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6793,11 +6793,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6813,11 +6813,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6830,11 +6830,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6846,18 +6846,18 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( L_tmpMax > 0 ) + if ( *L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } i++; } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ + } /*IsUpsampled3*/ *L_tmpMax = L_tmpMax2; move32(); } -- GitLab From 523e8caa7d6c10b1ba758de621e9f5ca6e9619b4 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:47:01 +0200 Subject: [PATCH 0274/1310] fix build errors --- lib_com/options.h | 2 +- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 303 +++++++++++++++++++++------------------ lib_dec/swb_tbe_dec_fx.c | 2 +- lib_enc/swb_tbe_enc_fx.c | 6 +- 5 files changed, 169 insertions(+), 146 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 01900a847..1325dacfa 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,7 +81,7 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 9435087b4..359320af7 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3259,7 +3259,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; + int isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5c2c74e2e..828f4b5af 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6872,7 +6872,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; + int isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -6890,8 +6890,9 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; Word32 L_tmpMax; + Word32 L_tmpX; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word64 W_tmpX; Word64 W_tmpY; @@ -6933,101 +6934,111 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) + IF( isIVAS ) { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } } -#else - FOR( i = 0; i < L_FRAME48k; ) + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ @@ -7108,37 +7119,43 @@ void elliptic_bpf_48k_generic_fx( elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7229,40 +7246,46 @@ void elliptic_bpf_48k_generic_fx( elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ @@ -7434,7 +7457,7 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS + isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 @@ -7448,7 +7471,7 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS + isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index b8ebb033e..636702daa 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4723,7 +4723,7 @@ void fb_tbe_dec_ivas_fx( synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , - Word16 1 /*isIVAS*/ + 1 /*isIVAS*/ #endif ); pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 3fe74d1a0..f42bd262a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7332,7 +7332,7 @@ void fb_tbe_enc_fx( elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 0 // isIVAS - is this correct? + 0, // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7468,7 +7468,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS - is this corret? + 1, // isIVAS - is this corret? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7479,7 +7479,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS - is this correct? + 1, // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -- GitLab From cbe487105f4baa613fc699d2caebb95e8f6e0c25 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:58:58 +0200 Subject: [PATCH 0275/1310] deactivate STAGE2 and func1 --- Workspace_msvc/decoder.vcxproj | 344 +++++++------- Workspace_msvc/encoder.vcxproj | 354 +++++++-------- Workspace_msvc/lib_com.vcxproj | 680 ++++++++++++++-------------- Workspace_msvc/lib_debug.vcxproj | 240 +++++----- Workspace_msvc/lib_dec.vcxproj | 710 ++++++++++++++--------------- Workspace_msvc/lib_enc.vcxproj | 742 +++++++++++++++---------------- Workspace_msvc/lib_rend.vcxproj | 414 ++++++++--------- Workspace_msvc/lib_util.vcxproj | 312 ++++++------- Workspace_msvc/renderer.vcxproj | 358 +++++++-------- lib_com/options.h | 2 +- 10 files changed, 2078 insertions(+), 2078 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index ca0d96f44..c3a5a71d8 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 9578e488d..75b13f9bd 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 7a2aa8a7f..337fc98e2 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 929dd72a8..b6a8a7dd3 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2d06d29aa..60a24021f 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 86dcef905..7fe2ad96c 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index e47858ae3..10abdb438 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 86730b859..1cfb3e588 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index 70a130e31..ecd8b04aa 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/options.h b/lib_com/options.h index 1325dacfa..71dd19d71 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,7 +81,7 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From 423e399a8be328d6e320b9e66d41a10f5c835126 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 15:03:50 +0200 Subject: [PATCH 0276/1310] delete func1 --- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c | 187 --------------------------------------- 2 files changed, 1 insertion(+), 188 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 71dd19d71..6d02885cc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,6 +82,6 @@ //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 828f4b5af..8416a2e7d 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6688,181 +6688,6 @@ void wb_tbe_extras_reset_synth_fx( return; } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) -{ - Word32 L_tmpX; - Word16 i; - Word32 L_tmpMax2 = *L_tmpMax; - Word32 L_tmpAbs; - move32(); - IF( !IsUpsampled3 ) - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#else - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#endif - } /*IsUpsampled3*/ - ELSE - { /*IsUpsampled3*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#else - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ - *L_tmpMax = L_tmpMax2; - move32(); -} -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * @@ -6928,9 +6753,6 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -7040,7 +6862,6 @@ void elliptic_bpf_48k_generic_fx( } } } /*IsUpsampled3*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7115,9 +6936,6 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( isIVAS ) { @@ -7156,7 +6974,6 @@ void elliptic_bpf_48k_generic_fx( } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7242,9 +7059,6 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( isIVAS ) { @@ -7286,7 +7100,6 @@ void elliptic_bpf_48k_generic_fx( } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From bedb83f789423aa88f0016787ee00cf7fb751b4c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 15:08:59 +0200 Subject: [PATCH 0277/1310] delete all non-BE changes --- lib_com/options.h | 4 - lib_com/prot_fx.h | 8 - lib_com/swb_tbe_com_fx.c | 444 +-------------------------------------- lib_dec/swb_tbe_dec_fx.c | 14 +- lib_enc/swb_tbe_enc_fx.c | 37 +--- 5 files changed, 7 insertions(+), 500 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8651c0671..a3a65fe55 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -85,8 +85,4 @@ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 292c82206..93da4d66a 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,15 +3258,7 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 IsUpsampled3, - Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e14fda2a2..2b86715a4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6687,181 +6687,6 @@ void wb_tbe_extras_reset_synth_fx( return; } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) -{ - Word32 L_tmpX; - Word16 i; - Word32 L_tmpMax2 = *L_tmpMax; - Word32 L_tmpAbs; - move32(); - IF( !IsUpsampled3 ) - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#else - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#endif - } /*IsUpsampled3*/ - ELSE - { /*IsUpsampled3*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#else - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ - *L_tmpMax = L_tmpMax2; - move32(); -} -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * @@ -6870,15 +6695,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 IsUpsampled3, - Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6887,34 +6704,14 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; - Word32 L_tmpMax; - Word32 L_tmpX; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - Word64 W_tmpX; - Word64 W_tmpY; -#endif - - Word32 *L_tmp = &L_tmp_buffer[4]; - Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *L_output = &L_output_buffer[4]; -#else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; -#endif FOR( i = 0; i < 4; i++ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - memory_fx0 = extract_l( memory_fx2[0][i] ); - input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); -#else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); -#endif L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); @@ -6925,123 +6722,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - IF( !IsUpsampled3 ) - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - } - } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } - } - } /*IsUpsampled3*/ - ELSE - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } - } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } - } - } /*IsUpsampled3*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7100,7 +6781,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -7112,51 +6792,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } - } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } - } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7215,8 +6851,6 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } -#endif - Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); @@ -7239,54 +6873,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - } - -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7353,8 +6940,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -#endif - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; @@ -7420,19 +7005,10 @@ void synthesise_fb_high_band_fx( Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS -#endif ) { Word16 i, j; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; - Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; -#else Word16 excitation_in_interp3[L_FRAME48k]; -#endif Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; @@ -7457,28 +7033,12 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 1, // IsUpsampled3 -#endif - excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx - - ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 1, // IsUpsampled3 -#endif - excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 2994c2878..ebe7a847a 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,12 +4644,7 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - 0 /*isIVAS*/ -#endif - ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4718,12 +4713,7 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - 1 /*isIVAS*/ -#endif - ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index f42bd262a..272d9a4b9 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7305,12 +7305,7 @@ void fb_tbe_enc_fx( Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fhb_buffer[L_FRAME48k + 4]; - Word16 *input_fhb = &input_fhb_buffer[0] + 4; -#else Word16 input_fhb[L_FRAME48k]; -#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); @@ -7330,14 +7325,7 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 0, // isIVAS - is this correct? -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 0, // IsUpsampled3 -#endif - input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7434,12 +7422,7 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; - Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; -#else Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; -#endif Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; @@ -7466,25 +7449,11 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS - is this corret? -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 0, // IsUpsampled3 -#endif - input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS - is this correct? -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 0, // IsUpsampled3 -#endif - input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From a3746c8f8e832ece31b48ec7b47bfa8216a0bb34 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 15:21:13 +0200 Subject: [PATCH 0278/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 7 +++---- lib_dec/swb_tbe_dec_fx.c | 4 ++-- lib_enc/swb_tbe_enc_fx.c | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2b86715a4..c9361cbe6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7004,8 +7004,7 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout -) + Word16 Qout ) { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; @@ -7033,12 +7032,12 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index ebe7a847a..00be6455d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,7 +4644,7 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4713,7 +4713,7 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 272d9a4b9..a72a7ced1 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7325,7 +7325,7 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7449,11 +7449,11 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From 3ea49c9a6976c614a9d5606562ff79ef3c16eaae Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 15:22:15 +0200 Subject: [PATCH 0279/1310] clang patch --- lib_com/options.h | 1 - lib_com/swb_tbe_com_fx.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6d02885cc..942f5cfd6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,6 +82,5 @@ //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8416a2e7d..1d7a9a5b7 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6974,7 +6974,7 @@ void elliptic_bpf_48k_generic_fx( } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7100,7 +7100,7 @@ void elliptic_bpf_48k_generic_fx( } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From d44257b3667886b4ac0daab94cdf1a1d0ada1a38 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 15:28:41 +0200 Subject: [PATCH 0280/1310] fix memory --- lib_com/swb_tbe_com_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c9361cbe6..14a40e7b9 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6712,9 +6712,9 @@ void elliptic_bpf_48k_generic_fx( { memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //is this change be? move32(); move32(); move32(); -- GitLab From 21eae1a712187057531458a0a2a2ba5f763a8c15 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:30:43 +0000 Subject: [PATCH 0281/1310] revert all changes in elliptic_bpf_48k_generic_fx , but 1 --- lib_com/swb_tbe_com_fx.c | 105 ++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 57 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 14a40e7b9..5ce4d8ad7 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6722,52 +6722,48 @@ void elliptic_bpf_48k_generic_fx( move32(); } - - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6791,8 +6787,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6837,19 +6831,19 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } Q_temp = norm_l( L_tmpMax ); @@ -6867,13 +6861,12 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); } - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -6939,8 +6932,6 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; -- GitLab From 5a9847e0933fbb07c5c052125a70865ff4aaff34 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:35:20 +0000 Subject: [PATCH 0282/1310] revert vcxproj changes --- Workspace_msvc/decoder.vcxproj | 6 +++--- Workspace_msvc/encoder.vcxproj | 6 +++--- Workspace_msvc/lib_com.vcxproj | 6 +++--- Workspace_msvc/lib_debug.vcxproj | 6 +++--- Workspace_msvc/lib_dec.vcxproj | 6 +++--- Workspace_msvc/lib_enc.vcxproj | 6 +++--- Workspace_msvc/lib_rend.vcxproj | 6 +++--- Workspace_msvc/lib_util.vcxproj | 6 +++--- Workspace_msvc/renderer.vcxproj | 6 +++--- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index c3a5a71d8..9c5f8787a 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -14,18 +14,18 @@ decoder {E3DCBC31-7FC9-D127-E000-529F8460D5FD} decoder - 10.0 + 10.0.17763.0 Application - v143 + v141 false MultiByte Application - v143 + v141 false MultiByte diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 75b13f9bd..5ec7a2c01 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -14,18 +14,18 @@ encoder {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} encoder - 10.0 + 10.0.17763.0 Application - v143 + v141 false MultiByte Application - v143 + v141 false MultiByte diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 337fc98e2..5cbb9a2bb 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -13,18 +13,18 @@ {39EC200D-7795-4FF8-B214-B24EDA5526AE} common - 10.0 + 10.0.17763.0 StaticLibrary - v143 + v141 false MultiByte StaticLibrary - v143 + v141 false MultiByte diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index b6a8a7dd3..157e32f9d 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -13,17 +13,17 @@ {54509728-928B-44D9-A118-A6F92F08B34F} debug - 10.0 + 10.0.17763.0 StaticLibrary - v143 + v141 MultiByte StaticLibrary - v143 + v141 MultiByte true diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 60a24021f..bddcb0dbf 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -14,18 +14,18 @@ lib_dec {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} evs_dec - 10.0 + 10.0.17763.0 StaticLibrary - v143 + v141 false MultiByte StaticLibrary - v143 + v141 false MultiByte diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 7fe2ad96c..95298d456 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -14,18 +14,18 @@ lib_enc {824DA4CF-06F0-45C9-929A-8792F0E19C3E} evs_enc - 10.0 + 10.0.17763.0 StaticLibrary - v143 + v141 false MultiByte StaticLibrary - v143 + v141 false MultiByte diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 10abdb438..0810f2a85 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -14,18 +14,18 @@ lib_rend {718DE063-A18B-BB72-9150-62B892E6FFA6} evs_dec - 10.0 + 10.0.17763.0 StaticLibrary - v143 + v141 false MultiByte StaticLibrary - v143 + v141 false MultiByte diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 1cfb3e588..ebb82c6c0 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -13,17 +13,17 @@ {2FA8F384-0775-F3B7-F8C3-85209222FC70} utility - 10.0 + 10.0.17763.0 StaticLibrary - v143 + v141 MultiByte StaticLibrary - v143 + v141 MultiByte true diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index ecd8b04aa..fc00b0348 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -14,18 +14,18 @@ renderer {12B4C8A5-1E06-4E30-B443-D1F916F52B47} renderer - 10.0 + 10.0.17763.0 Application - v143 + v141 false MultiByte Application - v143 + v141 false MultiByte -- GitLab From cf0b0aa0d7cc200915fdc1e36102efcf4d09ab7c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 15:50:09 +0200 Subject: [PATCH 0283/1310] revert vcxproj changes --- Workspace_msvc/decoder.vcxproj | 344 +++++++------- Workspace_msvc/encoder.vcxproj | 354 +++++++-------- Workspace_msvc/lib_com.vcxproj | 680 ++++++++++++++-------------- Workspace_msvc/lib_debug.vcxproj | 240 +++++----- Workspace_msvc/lib_dec.vcxproj | 710 ++++++++++++++--------------- Workspace_msvc/lib_enc.vcxproj | 742 +++++++++++++++---------------- Workspace_msvc/lib_rend.vcxproj | 414 ++++++++--------- Workspace_msvc/lib_util.vcxproj | 312 ++++++------- Workspace_msvc/renderer.vcxproj | 358 +++++++-------- 9 files changed, 2077 insertions(+), 2077 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index 9c5f8787a..ca0d96f44 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 5ec7a2c01..9578e488d 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 5cbb9a2bb..7a2aa8a7f 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 157e32f9d..929dd72a8 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index bddcb0dbf..2d06d29aa 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 95298d456..86dcef905 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 0810f2a85..e47858ae3 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index ebb82c6c0..86730b859 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index fc00b0348..70a130e31 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file -- GitLab From 2633f5751459385a6a8dddc59f3abdd7f56aef72 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:52:32 +0000 Subject: [PATCH 0284/1310] revert unnecesary changes --- lib_enc/swb_tbe_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index a72a7ced1..316a5b549 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7299,13 +7299,13 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; + Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; - Word16 input_fhb[L_FRAME48k]; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); -- GitLab From 673d0f595183ffb52564f3530d34e220c98f55ba Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 15:54:34 +0200 Subject: [PATCH 0285/1310] revert vcxproj changes --- Workspace_msvc/decoder.vcxproj | 344 +++++++------- Workspace_msvc/encoder.vcxproj | 354 +++++++-------- Workspace_msvc/lib_com.vcxproj | 680 ++++++++++++++-------------- Workspace_msvc/lib_debug.vcxproj | 240 +++++----- Workspace_msvc/lib_dec.vcxproj | 710 ++++++++++++++--------------- Workspace_msvc/lib_enc.vcxproj | 742 +++++++++++++++---------------- Workspace_msvc/lib_rend.vcxproj | 414 ++++++++--------- Workspace_msvc/lib_util.vcxproj | 312 ++++++------- Workspace_msvc/renderer.vcxproj | 358 +++++++-------- 9 files changed, 2077 insertions(+), 2077 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index c3a5a71d8..ca0d96f44 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 75b13f9bd..9578e488d 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 337fc98e2..7a2aa8a7f 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0 - - - - StaticLibrary - v143 - false - MultiByte - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index b6a8a7dd3..929dd72a8 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0 - - - - StaticLibrary - v143 - MultiByte - - - StaticLibrary - v143 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 60a24021f..2d06d29aa 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0 - - - StaticLibrary - v143 - false - MultiByte - - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 7fe2ad96c..86dcef905 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0 - - - - StaticLibrary - v143 - false - MultiByte - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 10abdb438..e47858ae3 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0 - - - StaticLibrary - v143 - false - MultiByte - - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 1cfb3e588..86730b859 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0 - - - - StaticLibrary - v143 - MultiByte - - - StaticLibrary - v143 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index ecd8b04aa..70a130e31 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file -- GitLab From 15dda6ba60e7042909660554a9213876d87901e1 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:05:55 +0200 Subject: [PATCH 0286/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5ce4d8ad7..d3dc614aa 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6714,7 +6714,7 @@ void elliptic_bpf_48k_generic_fx( memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - //memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //is this change be? + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //is this change be? move32(); move32(); move32(); -- GitLab From 5bae86227e83790d932c36f68db42e4d5f8787a2 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:09:18 +0200 Subject: [PATCH 0287/1310] Revert "clang patch" This reverts commit 3ea49c9a6976c614a9d5606562ff79ef3c16eaae. --- lib_com/options.h | 1 + lib_com/swb_tbe_com_fx.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 942f5cfd6..6d02885cc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,5 +82,6 @@ //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1d7a9a5b7..8416a2e7d 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6974,7 +6974,7 @@ void elliptic_bpf_48k_generic_fx( } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7100,7 +7100,7 @@ void elliptic_bpf_48k_generic_fx( } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 28ac4dc13474fc61114879e9e095ab1c6b1c2821 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:09:20 +0200 Subject: [PATCH 0288/1310] Revert "delete func1" This reverts commit 423e399a8be328d6e320b9e66d41a10f5c835126. --- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c | 187 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 188 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6d02885cc..71dd19d71 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,6 +82,6 @@ //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8416a2e7d..828f4b5af 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6688,6 +6688,181 @@ void wb_tbe_extras_reset_synth_fx( return; } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +{ + Word32 L_tmpX; + Word16 i; + Word32 L_tmpMax2 = *L_tmpMax; + Word32 L_tmpAbs; + move32(); + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#else + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#endif + } /*IsUpsampled3*/ + ELSE + { /*IsUpsampled3*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ + *L_tmpMax = L_tmpMax2; + move32(); +} +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * @@ -6753,6 +6928,9 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -6862,6 +7040,7 @@ void elliptic_bpf_48k_generic_fx( } } } /*IsUpsampled3*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6936,6 +7115,9 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( isIVAS ) { @@ -6974,6 +7156,7 @@ void elliptic_bpf_48k_generic_fx( } } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7059,6 +7242,9 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( isIVAS ) { @@ -7100,6 +7286,7 @@ void elliptic_bpf_48k_generic_fx( } } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From f1e9bdaefabbe3f66377b64c6453f5acfa87a423 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:09:22 +0200 Subject: [PATCH 0289/1310] Revert "deactivate STAGE2 and func1" This reverts commit cbe487105f4baa613fc699d2caebb95e8f6e0c25. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 71dd19d71..1325dacfa 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,7 +81,7 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From 5f65ef0682f03fc3693cff73f42998bf757b99d7 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:09:24 +0200 Subject: [PATCH 0290/1310] Revert "fix build errors" This reverts commit 523e8caa7d6c10b1ba758de621e9f5ca6e9619b4. --- lib_com/options.h | 2 +- lib_com/prot_fx.h | 2 +- lib_com/swb_tbe_com_fx.c | 303 ++++++++++++++++++--------------------- lib_dec/swb_tbe_dec_fx.c | 2 +- lib_enc/swb_tbe_enc_fx.c | 6 +- 5 files changed, 146 insertions(+), 169 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1325dacfa..01900a847 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,7 +81,7 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 359320af7..9435087b4 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3259,7 +3259,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS, + int isIVAS; #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 828f4b5af..5c2c74e2e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6872,7 +6872,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS, + int isIVAS; #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -6890,9 +6890,8 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; Word32 L_tmpMax; - Word32 L_tmpX; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word64 W_tmpX; Word64 W_tmpY; @@ -6934,111 +6933,101 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - } + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) + FOR( i = 0; i < L_FRAME48k; ) { - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else + FOR( i = 0; i < L_FRAME48k; ) { - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ @@ -7119,43 +7108,37 @@ void elliptic_bpf_48k_generic_fx( elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } - +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7246,46 +7229,40 @@ void elliptic_bpf_48k_generic_fx( elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ @@ -7457,7 +7434,7 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, + isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 @@ -7471,7 +7448,7 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, + isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 636702daa..b8ebb033e 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4723,7 +4723,7 @@ void fb_tbe_dec_ivas_fx( synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , - 1 /*isIVAS*/ + Word16 1 /*isIVAS*/ #endif ); pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index f42bd262a..3fe74d1a0 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7332,7 +7332,7 @@ void fb_tbe_enc_fx( elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 0, // isIVAS - is this correct? + 0 // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7468,7 +7468,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS - is this corret? + 1 // isIVAS - is this corret? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7479,7 +7479,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS - is this correct? + 1 // isIVAS - is this correct? #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -- GitLab From f0779e9616693f311140b10bb9967f13f8d2fa58 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:09:25 +0200 Subject: [PATCH 0291/1310] Revert "fix build errors" This reverts commit 7fd231f4e0784a996a9b24484030cc875f3219a1. --- lib_com/swb_tbe_com_fx.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5c2c74e2e..b83aa0413 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6712,11 +6712,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6734,11 +6734,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6758,11 +6758,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6776,11 +6776,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6793,11 +6793,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6813,11 +6813,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6830,11 +6830,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } @@ -6846,18 +6846,18 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } i++; } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ + } /*IsUpsampled3*/ *L_tmpMax = L_tmpMax2; move32(); } -- GitLab From 4dffc7c6f5fa863979d7c224fdb8ce8cfc08d186 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:09:28 +0200 Subject: [PATCH 0292/1310] Revert "deactivate func1, activate STAGE2" This reverts commit bc0565c1160cf97a4d23b9137fc608955e6bd890. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 01900a847..efd9f65cf 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,7 +81,7 @@ #define HARM_ENC_INIT //#define HARM_SCE_INIT #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From 903b7f4ff344e567ac72e0ddfa17bb490b0360b2 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:09:30 +0200 Subject: [PATCH 0293/1310] Revert "add changes from BE branch concerning elliptic_bpf_48k - deactivated STAGE2 and func1" This reverts commit 88c2dd4595710a177de9832a967949c96d654c69. --- lib_com/options.h | 11 +- lib_com/prot_fx.h | 18 +- lib_com/swb_tbe_com_fx.c | 588 ++++++++------------------------------- lib_dec/swb_tbe_dec_fx.c | 15 +- lib_enc/swb_tbe_enc_fx.c | 39 +-- 5 files changed, 137 insertions(+), 534 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index efd9f65cf..99c6e8eb6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,8 +80,13 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + + +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 +#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | + +//----------------------------------------------------------------------- +// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 9435087b4..1452d8e2e 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,15 +3258,7 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 IsUpsampled3, - Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif + const Word16 input_fx[], /* i : i signal Q_input_fx */ Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ @@ -3285,12 +3277,8 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS -#endif -); + Word16 Qout ); + void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ #ifdef ADD_IVAS_TBE_CODE diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index b83aa0413..3fec692dc 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6688,198 +6688,14 @@ void wb_tbe_extras_reset_synth_fx( return; } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) -{ - Word32 L_tmpX; - Word16 i; - Word32 L_tmpMax2 = *L_tmpMax; - Word32 L_tmpAbs; - move32(); - IF( !IsUpsampled3 ) - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#else - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#endif - } /*IsUpsampled3*/ - ELSE - { /*IsUpsampled3*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#else - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ - *L_tmpMax = L_tmpMax2; - move32(); -} -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ - void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 IsUpsampled3, - Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6888,36 +6704,18 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; - Word32 L_tmpMax; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - Word64 W_tmpX; - Word64 W_tmpY; -#endif - - Word32 *L_tmp = &L_tmp_buffer[4]; - Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *L_output = &L_output_buffer[4]; -#else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; -#endif + Word32 L_output[L_FRAME48k]; FOR( i = 0; i < 4; i++ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - memory_fx0 = extract_l( memory_fx2[0][i] ); - input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); -#else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); -#endif - L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -6925,17 +6723,55 @@ void elliptic_bpf_48k_generic_fx( move32(); } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - IF( !IsUpsampled3 ) + + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + FOR( i = 4; i < L_FRAME48k; i++ ) { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + Word64 W_tmpX; + Word64 W_tmpY; W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); @@ -6945,11 +6781,15 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + } + +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ + { + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6962,135 +6802,9 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ - ELSE - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } -#else - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#endif + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -7101,46 +6815,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7186,22 +6860,43 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + Word64 W_tmpX; + Word64 W_tmpY; + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } -#endif - +#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -7217,54 +6912,12 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7312,7 +6965,30 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 + FOR( i = 4; i < L_FRAME48k; i++ ) + { + Word64 W_tmpX; + Word64 W_tmpY; + + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -7330,10 +7006,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - #endif - - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -7397,12 +7070,7 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS -#endif -) + Word16 Qout ) { Word16 i, j; Word16 excitation_in_interp3[L_FRAME48k]; @@ -7432,28 +7100,12 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 1, // IsUpsampled3 -#endif - excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx - - ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 1, // IsUpsampled3 -#endif - excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index b8ebb033e..8da680bf8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,12 +4644,7 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - 0 /*isIVAS*/ -#endif - ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4719,13 +4714,7 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ push_wmops( "synthesise_fb_high_band" ); - /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 1 /*isIVAS*/ -#endif - ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 3fe74d1a0..316a5b549 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7299,18 +7299,13 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; + Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fhb_buffer[L_FRAME48k + 4]; - Word16 *input_fhb = &input_fhb_buffer[0] + 4; -#else - Word16 input_fhb[L_FRAME48k]; -#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); @@ -7330,14 +7325,7 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 0 // isIVAS - is this correct? -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 0, // IsUpsampled3 -#endif - input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7434,12 +7422,7 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; - Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; -#else Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; -#endif Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; @@ -7466,25 +7449,11 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS - is this corret? -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 0, // IsUpsampled3 -#endif - input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS - is this correct? -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 0, // IsUpsampled3 -#endif - input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From d041f1fd191ded0cbb84e62a70067289b0be815f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:18:58 +0200 Subject: [PATCH 0294/1310] reapply all nonbe hanges from be branch - inactive --- lib_com/options.h | 12 +- lib_com/prot_fx.h | 37 ++- lib_com/swb_tbe_com_fx.c | 654 ++++++++++++++++++++++++++++++--------- lib_dec/swb_tbe_dec_fx.c | 14 +- lib_enc/swb_tbe_enc_fx.c | 39 ++- 5 files changed, 589 insertions(+), 167 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 99c6e8eb6..85318d23a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,13 +80,7 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT - - - -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 // nonbe // | -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 // nonbe // | 3.1 WMOPS, pipe testing https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/pipelines/50562 -#define FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 // nonbe // | - -//----------------------------------------------------------------------- -// OPT_STEREO_32KBPS_V1 switch is inactive - why? (3.2 WMOPS) +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1452d8e2e..028822857 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,15 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : i signal Q_input_fx */ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS, +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else + const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ @@ -3267,17 +3275,22 @@ void elliptic_bpf_48k_generic_fx( ); void synthesise_fb_high_band_fx( - const Word16 excitation_in[], /* i : full band excitation */ - Word16 Q_fb_exc, - Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ - const Word32 fb_exc_energy, /* i : full band excitation energy */ - const Word16 ratio, /* i : energy ratio */ - const Word16 L_frame, /* i : ACELP frame length */ - const Word16 bfi, /* i : fec flag */ - Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ - Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ - Word16 bpf_memory_Q[], - Word16 Qout ); + const Word16 excitation_in[], /* i : full band excitation */ + Word16 Q_fb_exc, + Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ + const Word32 fb_exc_energy, /* i : full band excitation energy */ + const Word16 ratio, /* i : energy ratio */ + const Word16 L_frame, /* i : ACELP frame length */ + const Word16 bfi, /* i : fec flag */ + Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ + Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ + Word16 bpf_memory_Q[], + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 isIVAS +#endif + ); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 3fec692dc..6648a1351 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6687,6 +6687,180 @@ void wb_tbe_extras_reset_synth_fx( return; } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +{ + Word32 L_tmpX; + Word16 i; + Word32 L_tmpMax2 = *L_tmpMax; + Word32 L_tmpAbs; + move32(); + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#else + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#endif + } /*IsUpsampled3*/ + ELSE + { /*IsUpsampled3*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ + *L_tmpMax = L_tmpMax2; + move32(); +} +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() @@ -6694,8 +6868,17 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ + void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS, +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6704,18 +6887,37 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 memory_fx0, Q_temp, Q_temp2; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; + Word32 L_tmpMax; + Word32 L_tmpX; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + Word64 W_tmpX; + Word64 W_tmpY; +#endif + + Word32 *L_tmp = &L_tmp_buffer[4]; + Word32 *L_tmp2 = &L_tmp2_buffer[4]; + Word32 *L_output = &L_output_buffer[4]; +#else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; - Word32 L_output[L_FRAME48k]; +#endif FOR( i = 0; i < 4; i++ ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + memory_fx0 = extract_l( memory_fx2[0][i] ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); +#else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); +#endif + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -6723,88 +6925,182 @@ void elliptic_bpf_48k_generic_fx( move32(); } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } + } + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } + } + } /*IsUpsampled3*/ + ELSE + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } + } + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } + } + } /*IsUpsampled3*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1 - { - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - //L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - } - } -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE1*/ + + FOR( i = 4; i < L_FRAME48k; i++ ) { - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); } -#endif - +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6815,6 +7111,52 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + } + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + } + +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6860,43 +7202,22 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 4; i < L_FRAME48k; i++ ) { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - //L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } +#endif + -#else /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } -#endif /*FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE2*/ Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -6912,12 +7233,60 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } + } + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } + } + +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -6965,30 +7334,7 @@ void elliptic_bpf_48k_generic_fx( L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -#ifdef FIX_1439_SPEEDUP_elliptic_bpf_48k_generic_STAGE3 - FOR( i = 4; i < L_FRAME48k; i++ ) - { - Word64 W_tmpX; - Word64 W_tmpY; - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - //L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 + 16 ), W_shl( W_tmpY, 2 - 16 ) ) ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#else FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -7006,7 +7352,10 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } + #endif + + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -7044,6 +7393,7 @@ void elliptic_bpf_48k_generic_fx( return; } + /*-------------------------------------------------------------------* * synthesise_fb_high_band() * @@ -7070,17 +7420,26 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ) + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 isIVAS +#endif +) { Word16 i, j; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; + Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; +#else Word16 excitation_in_interp3[L_FRAME48k]; +#endif + Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; - Word16 tmp[L_FRAME48k]; - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" ); /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7096,16 +7455,31 @@ void synthesise_fb_high_band_fx( } exp_tmp = sub( Q_fb_exc, 2 ); - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" ); IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + isIVAS, +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx + + ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + isIVAS, +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 8da680bf8..dfa12a5bd 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,7 +4644,12 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + 0 /*isIVAS*/ +#endif + ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4714,7 +4719,12 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ push_wmops( "synthesise_fb_high_band" ); - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + 1 /*isIVAS*/ +#endif + ); pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ test(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 316a5b549..f42bd262a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7299,13 +7299,18 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; - Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_buffer[L_FRAME48k + 4]; + Word16 *input_fhb = &input_fhb_buffer[0] + 4; +#else + Word16 input_fhb[L_FRAME48k]; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); @@ -7325,7 +7330,14 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 0, // isIVAS - is this correct? +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7422,7 +7434,12 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; + Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; +#else Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; +#endif Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; @@ -7449,11 +7466,25 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1, // isIVAS - is this corret? +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1, // isIVAS - is this correct? +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From 28bd30c2e59d2c59b75fbc23c426648c92307c3e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:43:15 +0200 Subject: [PATCH 0295/1310] clang patch --- lib_com/prot_fx.h | 28 ++++++++++++++-------------- lib_com/swb_tbe_com_fx.c | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 028822857..292c82206 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3275,22 +3275,22 @@ void elliptic_bpf_48k_generic_fx( ); void synthesise_fb_high_band_fx( - const Word16 excitation_in[], /* i : full band excitation */ - Word16 Q_fb_exc, - Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ - const Word32 fb_exc_energy, /* i : full band excitation energy */ - const Word16 ratio, /* i : energy ratio */ - const Word16 L_frame, /* i : ACELP frame length */ - const Word16 bfi, /* i : fec flag */ - Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ - Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ - Word16 bpf_memory_Q[], - Word16 Qout + const Word16 excitation_in[], /* i : full band excitation */ + Word16 Q_fb_exc, + Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ + const Word32 fb_exc_energy, /* i : full band excitation energy */ + const Word16 ratio, /* i : energy ratio */ + const Word16 L_frame, /* i : ACELP frame length */ + const Word16 bfi, /* i : fec flag */ + Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ + Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ + Word16 bpf_memory_Q[], + Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS + , + Word16 isIVAS #endif - ); +); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 6648a1351..8be5c88bb 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6856,7 +6856,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_t i++; } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ + } /*IsUpsampled3*/ *L_tmpMax = L_tmpMax2; move32(); } -- GitLab From a2ecf205c2505903656e4ee7c61787e6008660aa Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:45:12 +0200 Subject: [PATCH 0296/1310] activate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 85318d23a..1b46169e1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,7 +80,7 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From 6c8cfde86b1871323d017b7ba38ccb317c7902d2 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 14:51:28 +0000 Subject: [PATCH 0297/1310] revert some unwanted changes --- lib_com/swb_tbe_com_fx.c | 110 +++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8be5c88bb..06df9ec49 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -19,7 +19,6 @@ #define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ #define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ - /*-----------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------*/ @@ -6911,13 +6910,16 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); + memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); #endif - L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -7042,51 +7044,48 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7201,19 +7200,19 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } #endif @@ -7233,8 +7232,8 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -7393,7 +7392,6 @@ void elliptic_bpf_48k_generic_fx( return; } - /*-------------------------------------------------------------------* * synthesise_fb_high_band() * -- GitLab From 05632ea436e66f0b43a6031372be9c6f6a168d37 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 16:53:59 +0200 Subject: [PATCH 0298/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 06df9ec49..d017914dc 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6912,7 +6912,7 @@ void elliptic_bpf_48k_generic_fx( input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); #else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); -- GitLab From fc16917f1c0dd1df6bfc204e00021fd8b5266851 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 10 Apr 2025 12:18:55 -0400 Subject: [PATCH 0299/1310] possible fix to 1421 --- lib_com/options.h | 3 +++ lib_enc/enc_gen_voic_fx.c | 22 +++++++++++++++++++++- lib_enc/enc_tran_fx.c | 29 +++++++++++++++++++++++++++-- lib_enc/transition_enc_fx.c | 12 ++++++++++++ 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2b88deb5d..45cc3dc42 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,4 +80,7 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT + +#define TEST_HR + #endif diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 22af9097d..e694b60c2 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -518,7 +518,12 @@ void encod_gen_voic_ivas_fx( set16_fx( code_preQ_fx, 0, L_SUBFR ); shift_wsp = add( Q_new, shift ); - +#ifdef TEST_HR + if ( LT_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) + { + shift_wsp = sub( shift_wsp, 1 ); + } +#endif /* set and write harmonicity flag */ harm_flag_acelp = 0; move16(); @@ -621,18 +626,33 @@ void encod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { +#ifdef TEST_HR + gain_enc_lbr_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->coder_type, i_subfr_fx, xn_fx, y1_fx, shift_wsp, y2_fx, code_fx, + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR ); +#else gain_enc_lbr_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->coder_type, i_subfr_fx, xn_fx, y1_fx, sub( shift_wsp, 1 ), y2_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR ); +#endif } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { +#ifdef TEST_HR + gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, shift_wsp ); +#else gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, sub( shift_wsp, 1 ) ); +#endif } ELSE { +#ifdef TEST_HR + gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, i_subfr_fx, -1, xn_fx, y1_fx, shift_wsp, y2_fx, code_fx, Es_pred_fx, + &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx ); +#else gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, i_subfr_fx, -1, xn_fx, y1_fx, sub( shift_wsp, 1 ), y2_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx ); +#endif } IF( st_fx->Opt_SC_VBR ) { diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index d6935dd0c..8e4f13116 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -520,7 +520,12 @@ Word16 encod_tran_ivas_fx( move16(); set16_fx( code_preQ, 0, L_SUBFR ); shift_wsp = add( Q_new, shift ); - +#ifdef TEST_HR + if ( LT_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) + { + shift_wsp = sub( shift_wsp, 1 ); + } +#endif /*----------------------------------------------------------------* * ACELP subframe loop *----------------------------------------------------------------*/ @@ -540,8 +545,11 @@ Word16 encod_tran_ivas_fx( q_h1 = sub( 14, norm_s( h1[0] ) ); Copy_Scale_sig( h1, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ +#ifdef TEST_HR + Scale_sig( h1, L_SUBFR, sub( 14, q_h1 ) ); +#else Scale_sig( h1, L_SUBFR, sub( 13, q_h1 ) ); - +#endif /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn, L_SUBFR, shift ); @@ -559,7 +567,9 @@ Word16 encod_tran_ivas_fx( IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) { +#ifndef TEST_HR Scale_sig( h1, L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ +#endif transf_cdbk_enc_ivas_fx( st_fx, 0, i_subfr, cn, exc_fx, p_Aq, Aw_fx, h1, xn, xn2, y1, y2, Es_pred_fx, &gain_pit, gain_code, g_corr, clip_gain, &gain_preQ, code_preQ, unbits, Q_new, shift ); } @@ -587,22 +597,37 @@ Word16 encod_tran_ivas_fx( IF( Jopt_flag == 0 ) { /* SQ gain_code */ +#ifdef TEST_HR + gain_enc_tc_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y2, code, Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, shift_wsp ); +#else gain_enc_tc_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y2, code, Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, sub( shift_wsp, 1 ) ); +#endif } ELSE { IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { /* SQ gain_pit and gain_code */ +#ifdef TEST_HR + gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, shift_wsp ); +#else gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, sub( shift_wsp, 1 ) ); +#endif } ELSE { /* VQ gain_pit and gain_code */ +#ifdef TEST_HR + gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame_fx, i_subfr, tc_subfr, xn, y1, shift_wsp, y2, code, Es_pred_fx, + &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); +#else gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame_fx, i_subfr, tc_subfr, xn, y1, sub( shift_wsp, 1 ), y2, code, Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); +#endif } } gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit, st_fx->clip_var_fx ); diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 6718552c5..99e8b44fa 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -1423,7 +1423,11 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, ( Q_new + shift - 1 ) ); move16(); +#ifdef TEST_HR + Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 )); +#else Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); +#endif lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); @@ -1660,7 +1664,11 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, Q_new ); move16(); +#ifdef TEST_HR + Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ) ); +#else Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); +#endif lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) @@ -2082,7 +2090,11 @@ static void tc_enc_ivas_fx( /*--------------------------------------------------------------* * compute glottal-shape codebook excitation *--------------------------------------------------------------*/ +#ifdef TEST_HR + Copy( h1, h1_fx, L_SUBFR + ( M + 1 ) ); +#else Copy_Scale_sig( h1, h1_fx, L_SUBFR + ( M + 1 ), 1 ); +#endif /* create filtered glottal codebook contribution */ conv_fx( &exc_fx[i_subfr], h1_fx, yy1_fx, L_SUBFR ); -- GitLab From b98f74c7404d96d9ae934b4746d723fe1aec7803 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Thu, 10 Apr 2025 12:24:43 -0400 Subject: [PATCH 0300/1310] fix clang --- lib_enc/transition_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 99e8b44fa..9f630da66 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -1424,7 +1424,7 @@ void transition_enc_ivas_fx( move16(); #ifdef TEST_HR - Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 )); + Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ) ); #else Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); #endif -- GitLab From 70678f13d9dcd5fec96c87f605769ec7bca4d707 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 08:00:09 +0200 Subject: [PATCH 0301/1310] fix memory error in FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic --- lib_com/swb_tbe_com_fx.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d017914dc..8a4a44c7b 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7230,15 +7230,17 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); move32(); move32(); } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); @@ -7286,6 +7288,15 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + FOR( j = 0; j < 4; j++ ) + { + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + } + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From 5fe189beaf3e0537bfcb840690ae8048d2bad78a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 08:16:01 +0200 Subject: [PATCH 0302/1310] fix conflict --- lib_com/options.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e2d92e670..796c29dda 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,12 +82,9 @@ #define HARM_PUSH_BIT #define HARM_ENC_INIT //#define HARM_SCE_INIT -<<<<<<< HEAD +#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ +#define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -======= -#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ -#define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ ->>>>>>> main #endif -- GitLab From 83e6adf7d674df3ed1eb016605ec5e954359919b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 08:44:39 +0200 Subject: [PATCH 0303/1310] deactivate all speedups --- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 796c29dda..d9dc70338 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,7 +84,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8a4a44c7b..72857d1fb 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6687,13 +6687,40 @@ void wb_tbe_extras_reset_synth_fx( return; } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -inline static void elliptic_bpf_48k_generic_func1( Word16 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +static inline Word64 wmac_1616( Word64 x1, Word16 x2, Word16 x3 ) +{ + return W_mac_16_16( x1, x2, x3 ); +} + +static inline Word64 wmac_3216( Word64 x1, Word32 x2, Word16 x3 ) +{ + return W_mac_32_16( x1, x2, x3 ); +} + +static inline Word64 wmsu_3216( Word64 x1, Word32 x2, Word16 x3 ) +{ + return W_msu_32_16( x1, x2, x3 ); +} + +inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *input32_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) { Word32 L_tmpX; Word16 i; Word32 L_tmpMax2 = *L_tmpMax; Word32 L_tmpAbs; move32(); + + if(input16_fx > 0) + { + Word64 ( *wmac )( Word64, Word16, Word16 ); + Word64 ( *wmsu )( Word64, Word32, Word16 ); + } + if( input32_fx > 0 ) + { + Word64 ( *wmac )( Word64, Word32, Word16 ); + Word64 ( *wmsu )( Word64, Word32, Word16 ); + } + IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -- GitLab From 4cf3a55949a04cde9957911a047e48481a0c27ff Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 08:46:31 +0200 Subject: [PATCH 0304/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 72857d1fb..916bd3588 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6710,12 +6710,12 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i Word32 L_tmpAbs; move32(); - if(input16_fx > 0) + if ( input16_fx > 0 ) { Word64 ( *wmac )( Word64, Word16, Word16 ); Word64 ( *wmsu )( Word64, Word32, Word16 ); } - if( input32_fx > 0 ) + if ( input32_fx > 0 ) { Word64 ( *wmac )( Word64, Word32, Word16 ); Word64 ( *wmsu )( Word64, Word32, Word16 ); -- GitLab From cfeceee1088b315b9949acfee3392c0d75e1bc76 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 09:21:58 +0200 Subject: [PATCH 0305/1310] synched FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic with be branch, changed func1 --- lib_com/swb_tbe_com_fx.c | 127 ++++++++++++--------------------------- 1 file changed, 37 insertions(+), 90 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 916bd3588..4dc678913 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6697,9 +6697,14 @@ static inline Word64 wmac_3216( Word64 x1, Word32 x2, Word16 x3 ) return W_mac_32_16( x1, x2, x3 ); } -static inline Word64 wmsu_3216( Word64 x1, Word32 x2, Word16 x3 ) +static inline Word64 finalSat16( Word64 W_tmpx, Word64 W_tmpy ) { - return W_msu_32_16( x1, x2, x3 ); + return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +} + +static inline Word64 finalSat32( Word64 W_tmpx, Word64 W_tmpy ) +{ + return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); } inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *input32_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) @@ -6713,12 +6718,16 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i if ( input16_fx > 0 ) { Word64 ( *wmac )( Word64, Word16, Word16 ); - Word64 ( *wmsu )( Word64, Word32, Word16 ); + Word64 ( *finalSat )( Word64, Word64 ); + wmac = wmac_1616; + finalSat = finalSat16; } if ( input32_fx > 0 ) { Word64 ( *wmac )( Word64, Word32, Word16 ); - Word64 ( *wmsu )( Word64, Word32, Word16 ); + Word64 ( *finalSat )( Word64, Word64 ); + wmac = wmac_3216; + finalSat = finalSat32; } IF( !IsUpsampled3 ) @@ -6726,16 +6735,16 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ move32(); if ( *L_tmpMax > 0 ) { @@ -6747,27 +6756,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i } } #else - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } + assert( 0 ); /*kein bock*/ #endif } /*IsUpsampled3*/ ELSE @@ -6829,58 +6818,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i i++; } #else - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } + assert( 0 ); /*kein bock*/ #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ *L_tmpMax = L_tmpMax2; @@ -6932,32 +6870,41 @@ void elliptic_bpf_48k_generic_fx( Word32 memory2_fx_2[4], memory2_fx_3[4]; #endif - FOR( i = 0; i < 4; i++ ) - { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + { + FOR( i = 0; i < 4; i++ ) memory_fx0 = extract_l( memory_fx2[0][i] ); input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + move32(); + move32(); + } #else + FOR( i = 0; i < 4; i++ ) + { memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); -#endif move32(); move32(); move32(); move32(); move32(); } + } +#endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); + elliptic_bpf_48k_generic_func1( input_fx, 0, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ IF( !IsUpsampled3 ) { @@ -7141,7 +7088,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); + elliptic_bpf_48k_generic_func1( 0, L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( isIVAS ) @@ -7270,7 +7217,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); + elliptic_bpf_48k_generic_func1( 0, L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( isIVAS ) @@ -7323,7 +7270,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } - + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From c72ae0ff80b67d3ba36abea7b14bd60bf43fbf8b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 09:26:02 +0200 Subject: [PATCH 0306/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 360 +++++++++++++++++++-------------------- 1 file changed, 180 insertions(+), 180 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 4dc678913..24d05a27c 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6872,7 +6872,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic { - FOR( i = 0; i < 4; i++ ) + FOR( i = 0; i < 4; i++ ) memory_fx0 = extract_l( memory_fx2[0][i] ); input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); @@ -6898,7 +6898,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } - } +} #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic @@ -7018,61 +7018,61 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +move32(); + +L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +move32(); + +L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +move32(); +L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +move32(); +FOR( i = 4; i < L_FRAME48k; i++ ) +{ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } +} #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; @@ -7130,64 +7130,64 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ +L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ +L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ +move32(); +L_tmpMax = L_abs( L_tmp2[0] ); +L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +move32(); +L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); +L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +move32(); +L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); +L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ +L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ +move32(); +L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); +FOR( i = 4; i < L_FRAME48k; i++ ) +{ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); +} #endif @@ -7262,80 +7262,80 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - FOR( j = 0; j < 4; j++ ) - { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - } - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ +FOR( j = 0; j < 4; j++ ) +{ + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); +} - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ +L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ +L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ +move32(); +L_tmpMax = L_abs( L_output[0] ); + +L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ +L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ +L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ +move32(); +L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + +L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ +L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ +L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +move32(); +L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + +L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ +move32(); +L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + +FOR( i = 4; i < L_FRAME48k; i++ ) +{ + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); +} #endif -- GitLab From 3c2f24ba4a8f61246524a6b1f8c02edcdd3eedf2 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 09:38:47 +0200 Subject: [PATCH 0307/1310] fix error - deactivate all speedups --- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index d9dc70338..fac5b1dfc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,7 +84,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +////#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 24d05a27c..9405f0aaf 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6871,8 +6871,8 @@ void elliptic_bpf_48k_generic_fx( #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + FOR( i = 0; i < 4; i++ ) { - FOR( i = 0; i < 4; i++ ) memory_fx0 = extract_l( memory_fx2[0][i] ); input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); @@ -6898,7 +6898,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } -} #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic -- GitLab From fa009ccaa2ae8c3bd9c7a3f9bde78511f84ccb8e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 09:42:03 +0200 Subject: [PATCH 0308/1310] clang patch --- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c | 356 +++++++++++++++++++-------------------- 2 files changed, 179 insertions(+), 179 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index fac5b1dfc..d9dc70338 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,7 +84,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -////#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 9405f0aaf..1e8ded1ca 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7017,61 +7017,61 @@ void elliptic_bpf_48k_generic_fx( #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ -L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -move32(); - -L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -move32(); - -L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -move32(); -L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ -move32(); -FOR( i = 4; i < L_FRAME48k; i++ ) -{ - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); -} + + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; @@ -7129,64 +7129,64 @@ FOR( i = 4; i < L_FRAME48k; i++ ) #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ -L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ -L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ -move32(); -L_tmpMax = L_abs( L_tmp2[0] ); -L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -move32(); -L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); -L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -move32(); -L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); -L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ -L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ -move32(); -L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); -FOR( i = 4; i < L_FRAME48k; i++ ) -{ - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); -} + L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } #endif @@ -7261,80 +7261,80 @@ FOR( i = 4; i < L_FRAME48k; i++ ) #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ -FOR( j = 0; j < 4; j++ ) -{ - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + FOR( j = 0; j < 4; j++ ) + { + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + } + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ move32(); + L_tmpMax = L_abs( L_output[0] ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); -} + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); -L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ -L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ -L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ -move32(); -L_tmpMax = L_abs( L_output[0] ); - -L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ -L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ -L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ -move32(); -L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); - -L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ -L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ -L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ -move32(); -L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); - -L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ -L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ -L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ -move32(); -L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); - -FOR( i = 4; i < L_FRAME48k; i++ ) -{ - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); -} + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } #endif -- GitLab From 89cdfaf59e5cb05b12fd5ec649a3abccd8b11674 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 09:50:56 +0200 Subject: [PATCH 0309/1310] some more work on func1 --- lib_com/swb_tbe_com_fx.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1e8ded1ca..8044e9367 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6686,7 +6686,7 @@ void wb_tbe_extras_reset_synth_fx( return; } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +#if defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 ) && defined (FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1) static inline Word64 wmac_1616( Word64 x1, Word16 x2, Word16 x3 ) { return W_mac_16_16( x1, x2, x3 ); @@ -6719,6 +6719,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i { Word64 ( *wmac )( Word64, Word16, Word16 ); Word64 ( *finalSat )( Word64, Word64 ); + Word16 *input_fx = input16_fx; wmac = wmac_1616; finalSat = finalSat16; } @@ -6726,13 +6727,13 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i { Word64 ( *wmac )( Word64, Word32, Word16 ); Word64 ( *finalSat )( Word64, Word64 ); + Word32 *input_fx = input32_fx; wmac = wmac_3216; finalSat = finalSat32; } IF( !IsUpsampled3 ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); @@ -6755,22 +6756,18 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } } -#else - assert( 0 ); /*kein bock*/ -#endif } /*IsUpsampled3*/ ELSE { /*IsUpsampled3*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; ) { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpX = wmac( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ move32(); if ( *L_tmpMax > 0 ) { @@ -6782,13 +6779,13 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i } i++; - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ move32(); if ( *L_tmpMax > 0 ) { @@ -6801,11 +6798,11 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i i++; W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpX = wmac( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ move32(); if ( *L_tmpMax > 0 ) { @@ -6817,9 +6814,6 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i } i++; } -#else - assert( 0 ); /*kein bock*/ -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ *L_tmpMax = L_tmpMax2; move32(); -- GitLab From db082f377b3ccd6b196d1cf00e1ca12f554b09de Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 10:07:27 +0200 Subject: [PATCH 0310/1310] clang patch --- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index d9dc70338..796c29dda 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,7 +84,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8044e9367..1008b9554 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7043,6 +7043,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From eeb01697dd5a4a88011c6a4ae198d372b401a475 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 10:10:00 +0200 Subject: [PATCH 0311/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1008b9554..6a97ae0c5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6686,7 +6686,7 @@ void wb_tbe_extras_reset_synth_fx( return; } -#if defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 ) && defined (FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1) +#if defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 ) && defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 ) static inline Word64 wmac_1616( Word64 x1, Word16 x2, Word16 x3 ) { return W_mac_16_16( x1, x2, x3 ); @@ -6814,7 +6814,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i } i++; } - } /*IsUpsampled3*/ + } /*IsUpsampled3*/ *L_tmpMax = L_tmpMax2; move32(); } -- GitLab From 840a1e90837b3748ea00b38206c339f108f62fb2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 11 Apr 2025 10:33:10 +0200 Subject: [PATCH 0312/1310] lib_rend: replace BASOP_Util_Divide3232_Scale_cadence() by BASOP_Util_Divide3232_Scale_newton() --- .../ivas_dirac_dec_binaural_functions_fx.c | 44 +++++++++---------- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 20 ++++----- lib_rend/ivas_dirac_rend_fx.c | 10 ++--- lib_rend/ivas_orient_trk_fx.c | 14 +++--- lib_rend/ivas_reverb_filter_design_fx.c | 22 +++++----- lib_rend/ivas_rotation_fx.c | 2 +- lib_rend/ivas_shoebox_fx.c | 8 ++-- lib_rend/lib_rend.c | 4 +- 8 files changed, 62 insertions(+), 62 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index ce602160f..59ba8062e 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -1655,7 +1655,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric move32(); /* Formulate average diffuseness over frame */ - frameMeanDiffuseness = BASOP_Util_Divide3232_Scale_cadence( frameMeanDiffuseness, L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &exp ); // exp = exp + 31 - q_meanEnePerCh - exp1 + frameMeanDiffuseness = BASOP_Util_Divide3232_Scale_newton( frameMeanDiffuseness, L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &exp ); // exp = exp + 31 - q_meanEnePerCh - exp1 exp = sub( exp, sub( sub( 31, q_meanEnePerCh ), exp1 ) ); hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( frameMeanDiffuseness, sub( exp, 2 ) ); // Q29 move32(); @@ -1687,7 +1687,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric move16(); den = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEnePrev_fx[0][bin], hDiracDecBin->ChEnePrev_e[0][bin], hDiracDecBin->ChEnePrev_fx[1][bin], hDiracDecBin->ChEnePrev_e[1][bin], &den_e ); den = L_max( 1, den ); - IIReneLimiter_fx = BASOP_Util_Divide3232_Scale_cadence( num, den, &exp ); + IIReneLimiter_fx = BASOP_Util_Divide3232_Scale_newton( num, den, &exp ); exp = add( sub( num_e, den_e ), add( 5, exp ) ); IF( L_shr_sat( IIReneLimiter_fx, sub( 31, exp ) ) > 0 ) { @@ -3310,7 +3310,7 @@ static void eig2x2_fx( tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); #if 1 - tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); + tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); @@ -3386,7 +3386,7 @@ static void eig2x2_fx( tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); #if 1 - tmp2 = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, tmp3, &exp ); + tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); @@ -3731,11 +3731,11 @@ static void chol2x2_fx( // 4611686 = 1e-12 in Q62 IF( outRe[0][0] == 0 ) { - outRe[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); + outRe[1][0] = BASOP_Util_Divide3232_Scale_newton( c_re, 4611686, &exp ); move32(); q_re2 = add( sub( 31, exp ), sub( q_c, 62 ) ); - outIm[1][0] = BASOP_Util_Divide3232_Scale_cadence( c_im, 4611686, &exp ); + outIm[1][0] = BASOP_Util_Divide3232_Scale_newton( c_im, 4611686, &exp ); move32(); q_im = add( sub( 31, exp ), sub( q_c, 62 ) ); } @@ -3792,7 +3792,7 @@ static void chol2x2_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( temp, e1, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( temp, e1, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, q_e ) ); } if ( temp == 0 ) @@ -3837,7 +3837,7 @@ static void chol2x2_fx( // 4611686 = Q62 IF( outRe[1][1] == 0 ) { - // outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, 4611686, &exp ); + // outRe[0][1] = BASOP_Util_Divide3232_Scale_newton( c_re, 4611686, &exp ); Word32 tmp1 = 1953125005; /* 1/4611686 Q62 */ exp = 9; @@ -3845,7 +3845,7 @@ static void chol2x2_fx( move32(); q_re2 = add( sub( 31, exp ), sub( q_c, 62 ) ); - // outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, 4611686, &exp ); + // outIm[0][1] = BASOP_Util_Divide3232_Scale_newton( -c_im, 4611686, &exp ); outIm[0][1] = Mpy_32_32( tmp1, -c_im ); move32(); q_im = add( sub( 31, exp ), sub( q_c, 62 ) ); @@ -3853,13 +3853,13 @@ static void chol2x2_fx( ELSE { { - // outRe[0][1] = BASOP_Util_Divide3232_Scale_cadence( c_re, outRe[1][1], &exp ); - Word32 tmp1 = BASOP_Util_Divide3232_Scale_cadence( 0x7FFFFFFF, outRe[1][1], &exp ); + // outRe[0][1] = BASOP_Util_Divide3232_Scale_newton( c_re, outRe[1][1], &exp ); + Word32 tmp1 = BASOP_Util_Divide3232_Scale_newton( 0x7FFFFFFF, outRe[1][1], &exp ); outRe[0][1] = Mpy_32_32( tmp1, c_re ); move32(); q_re2 = add( sub( 31, exp ), sub( q_c, q_re1 ) ); - // outIm[0][1] = BASOP_Util_Divide3232_Scale_cadence( -c_im, outRe[1][1], &exp ); + // outIm[0][1] = BASOP_Util_Divide3232_Scale_newton( -c_im, outRe[1][1], &exp ); outIm[0][1] = Mpy_32_32( tmp1, -c_im ); move32(); q_im = add( sub( 31, exp ), sub( q_c, q_re1 ) ); @@ -3882,12 +3882,12 @@ static void chol2x2_fx( // 4611686 = 1e-12 in Q62 IF( e2 == 0 ) { - temp = BASOP_Util_Divide3232_Scale_cadence( temp, 4611686, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( temp, 4611686, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, 62 ) ); } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( temp, e2, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( temp, e2, &exp ); q_tmp = add( sub( 31, exp ), sub( q_tmp, q_e ) ); } if ( temp == 0 ) @@ -4035,7 +4035,7 @@ static void formulate2x2MixingMatrix_fx( } ELSE { - maxEneDiv_fx = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, maxEne_fx, &exp ); + maxEneDiv_fx = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, maxEne_fx, &exp ); q_maxEneDiv = add( sub( 31, exp ), sub( Q30, q_maxEne ) ); } exp = norm_l( maxEneDiv_fx ); @@ -4100,7 +4100,7 @@ static void formulate2x2MixingMatrix_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( E_out1, 4611686, &exp ); // 4611686 = Q62 + temp = BASOP_Util_Divide3232_Scale_newton( E_out1, 4611686, &exp ); // 4611686 = Q62 exp = sub( exp, sub( q_eout, 62 ) ); Ghat_fx[0] = Sqrt32( temp, &exp ); // Q = 31 - exp } @@ -4109,7 +4109,7 @@ static void formulate2x2MixingMatrix_fx( { temp = BASOP_Util_Add_Mant32Exp( temp, sub( 31, q_ein ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - temp = BASOP_Util_Divide3232_Scale_cadence( E_out1, temp, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( E_out1, temp, &exp ); exp = sub( exp, sub( q_eout, sub( 31, exp_temp ) ) ); Ghat_fx[0] = Sqrt32( temp, &exp ); // Q = 31 - exp } @@ -4127,7 +4127,7 @@ static void formulate2x2MixingMatrix_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( E_out2, 4611686, &exp1 ); // 4611686 = Q62 + temp = BASOP_Util_Divide3232_Scale_newton( E_out2, 4611686, &exp1 ); // 4611686 = Q62 exp1 = sub( exp1, sub( q_eout, 62 ) ); Ghat_fx[1] = Sqrt32( temp, &exp1 ); // Q = 31 - exp1 } @@ -4136,7 +4136,7 @@ static void formulate2x2MixingMatrix_fx( { temp = BASOP_Util_Add_Mant32Exp( temp, sub( 31, q_ein ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - temp = BASOP_Util_Divide3232_Scale_cadence( E_out2, temp, &exp1 ); + temp = BASOP_Util_Divide3232_Scale_newton( E_out2, temp, &exp1 ); exp1 = sub( exp1, sub( q_eout, sub( 31, exp_temp ) ) ); Ghat_fx[1] = Sqrt32( temp, &exp1 ); // Q = 31 - exp1 } @@ -4195,7 +4195,7 @@ static void formulate2x2MixingMatrix_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, D_fx[0], &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, D_fx[0], &exp ); exp = sub( exp, sub( Q30, q_D ) ); } div_fx[0] = Sqrt32( temp, &exp ); // Q = 31 - exp @@ -4328,7 +4328,7 @@ static void formulate2x2MixingMatrix_fx( Word16 Pre_shift, Pim_shift; temp = BASOP_Util_Add_Mant32Exp( Sx_fx[chB], sub( 31, q_Sx ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, temp, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, temp, &exp ); Pre_shift = norm_l( Pre_fx[chA][chB] ); Pim_shift = norm_l( Pim_fx[chA][chB] ); Pre_fx[chA][chB] = Mpy_32_32( L_shl( Pre_fx[chA][chB], Pre_shift ), temp ); @@ -4372,7 +4372,7 @@ static void formulate2x2MixingMatrix_fx( { Word16 Pre_shift, Pim_shift; temp = BASOP_Util_Add_Mant32Exp( Sx_fx[chB], sub( 31, q_Sx ), EPSILON_MANT, EPSILON_EXP, &exp_temp ); - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, temp, &exp ); + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, temp, &exp ); q_temp = add( sub( sub( q_P, exp ), sub( 31, Q30 ) ), exp_temp ); Pre_shift = norm_l( Pre_fx[0][chB] ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 7b446a80e..0cdbe3a10 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -2097,9 +2097,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); exp1 = 0; move16(); - tmp32 = BASOP_Util_Divide3232_Scale_cadence( L_shl( p_cy_auto_dir_smooth[num_freq_bands], sub( q_com, q_cy_auto_dir_smooth_local[1] ) ), - ( L_add( Sqrt32( h_dirac_output_synthesis_state->direct_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) - &exp1 ); + tmp32 = BASOP_Util_Divide3232_Scale_newton( L_shl( p_cy_auto_dir_smooth[num_freq_bands], sub( q_com, q_cy_auto_dir_smooth_local[1] ) ), + ( L_add( Sqrt32( h_dirac_output_synthesis_state->direct_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) + &exp1 ); target_power_y = L_shr( tmp32, 1 ); // Q31 + (q_com - (31 - exp)) q_target_power_y = add( sub( Q31, exp1 ), sub( q_com, sub( Q31, exp ) ) ); q_target_power_y = sub( q_target_power_y, 1 ); @@ -2108,9 +2108,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); exp1 = 0; move16(); - tmp32 = BASOP_Util_Divide3232_Scale_cadence( L_shl( p_cy_auto_diff_smooth[num_freq_bands], sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ), - ( L_add( Sqrt32( h_dirac_output_synthesis_state->diffuse_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) - &exp1 ); + tmp32 = BASOP_Util_Divide3232_Scale_newton( L_shl( p_cy_auto_diff_smooth[num_freq_bands], sub( q_com, h_dirac_output_synthesis_state->q_cy_auto_diff_smooth ) ), + ( L_add( Sqrt32( h_dirac_output_synthesis_state->diffuse_power_factor_fx[0], &exp ), EPSILON_FX ) ), // (Q31 - exp) + &exp1 ); target_power_y1 = L_shr( tmp32, 1 ); // Q31 + (q_com - (31 - exp)) q_target_power_y1 = add( sub( Q31, exp1 ), sub( q_com, sub( Q31, exp ) ) ); q_target_power_y1 = sub( q_target_power_y1, 1 ); @@ -2268,7 +2268,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( IF( EQ_32( *( p_power_smooth_prev ), EPSILON_FX ) ) { p_power_smooth_prev++; - L_tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q31, EPSILON_FX, &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ + L_tmp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q31, EPSILON_FX, &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ exp_arr[k * num_freq_bands + l] = exp; move16(); @@ -2277,7 +2277,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } ELSE { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q31, *( p_power_smooth_prev++ ), &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ + L_tmp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q31, *( p_power_smooth_prev++ ), &exp ); /*Q=31-(exp-(31-q_proto_power_smooth))*/ exp_arr[k * num_freq_bands + l] = exp; move16(); @@ -2495,7 +2495,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( exp = 0; move16(); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( *( p_cy_auto_diff_smooth_prev++ ), ( *( p_power_diff_smooth_prev++ ) ), &exp ); // (Q31 - exp) + (q_a - q_b) + L_tmp = BASOP_Util_Divide3232_Scale_newton( *( p_cy_auto_diff_smooth_prev++ ), ( *( p_power_diff_smooth_prev++ ) ), &exp ); // (Q31 - exp) + (q_a - q_b) exp = sub( Q31, add( sub( Q31, exp ), sub( h_dirac_output_synthesis_state->q_cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state->proto_power_diff_smooth_q ) ) ); *( p_gains_diff ) = Sqrt32( L_tmp, &exp ); // (31 - exp) @@ -3982,7 +3982,7 @@ void ivas_lfe_synth_with_filters_fx( } ELSE { - lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_cadence( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ + lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp lfeGain_fx = shl_r( lfeGain_fx, lfeGain_fx_exp ); // Q15 diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index f67f3761b..9de710b36 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -2691,8 +2691,8 @@ void protoSignalComputation2_fx( q_lr_bb_power = stereo_type_detect->q_right_bb_power; move16(); } - q_lr_bb_power = sub( q_lr_bb_power, 1 ); /* = (lr_bb_power_fx * 2) */ - temp = BASOP_Util_Divide3232_Scale_cadence( lr_bb_power_fx, L_add( stereo_type_detect->total_bb_power_fx, EPSILON_FX ), &exp ); // Q(31-(exp+stereo_type_detect->q_total_bb_power-q_lr_bb_power)) + q_lr_bb_power = sub( q_lr_bb_power, 1 ); /* = (lr_bb_power_fx * 2) */ + temp = BASOP_Util_Divide3232_Scale_newton( lr_bb_power_fx, L_add( stereo_type_detect->total_bb_power_fx, EPSILON_FX ), &exp ); // Q(31-(exp+stereo_type_detect->q_total_bb_power-q_lr_bb_power)) exp = sub( 31, add( sub( 31, exp ), sub( q_lr_bb_power, stereo_type_detect->q_total_bb_power ) ) ); temp = BASOP_Util_Log2( temp ); // q25 IF( NE_32( temp, MIN_32 ) ) @@ -2740,8 +2740,8 @@ void protoSignalComputation2_fx( move32(); q_lr_hi_power = stereo_type_detect->q_right_hi_power; } - q_lr_hi_power = sub( q_lr_hi_power, 1 ); /* = (q_lr_hi_power * 2) */ - temp = BASOP_Util_Divide3232_Scale_cadence( lr_hi_power_fx, L_add( stereo_type_detect->total_hi_power_fx, EPSILON_FX ), &exp ); // Q=31-(exp+ stereo_type_detect->q_total_hi_power-q_lr_hi_power) + q_lr_hi_power = sub( q_lr_hi_power, 1 ); /* = (q_lr_hi_power * 2) */ + temp = BASOP_Util_Divide3232_Scale_newton( lr_hi_power_fx, L_add( stereo_type_detect->total_hi_power_fx, EPSILON_FX ), &exp ); // Q=31-(exp+ stereo_type_detect->q_total_hi_power-q_lr_hi_power) exp = sub( 31, add( sub( 31, exp ), sub( q_lr_hi_power, stereo_type_detect->q_total_hi_power ) ) ); temp = BASOP_Util_Log2( temp ); // q25 IF( NE_32( temp, MIN_32 ) ) @@ -3419,7 +3419,7 @@ void computeDirectionAngles_fx( } ELSE { - temp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, intensityNorm, &exp ); // Q=31-(exp-(30-q_intensityNorm)) + temp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, intensityNorm, &exp ); // Q=31-(exp-(30-q_intensityNorm)) exp = sub( exp, sub( Q30, q_intensityNorm ) ); temp = Sqrt32( temp, &exp ); // Q=31-exp q_temp = sub( 31, exp ); diff --git a/lib_rend/ivas_orient_trk_fx.c b/lib_rend/ivas_orient_trk_fx.c index a25a8db53..6ed7cf3b1 100644 --- a/lib_rend/ivas_orient_trk_fx.c +++ b/lib_rend/ivas_orient_trk_fx.c @@ -140,22 +140,22 @@ static void QuaternionDivision_fx( { Word16 scale_e, result_e = 0, w_q, x_q, y_q, z_q, result_q; - r->w_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.w_fx ), d, &scale_e ); + r->w_fx = BASOP_Util_Divide3232_Scale_newton( ( q.w_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); // e+e1-e2// w_q = sub( Q31, result_e ); - r->x_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.x_fx ), d, &scale_e ); + r->x_fx = BASOP_Util_Divide3232_Scale_newton( ( q.x_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); x_q = sub( Q31, result_e ); - r->y_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.y_fx ), d, &scale_e ); + r->y_fx = BASOP_Util_Divide3232_Scale_newton( ( q.y_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); y_q = sub( Q31, result_e ); - r->z_fx = BASOP_Util_Divide3232_Scale_cadence( ( q.z_fx ), d, &scale_e ); + r->z_fx = BASOP_Util_Divide3232_Scale_newton( ( q.z_fx ), d, &scale_e ); move32(); result_e = add( scale_e, sub( sub( Q31, q.q_fact ), den_e ) ); z_q = sub( Q31, result_e ); @@ -505,15 +505,15 @@ static IVAS_VECTOR3 VectorNormalize_fx( move16(); length_fx = VectorLength_fx( p, &q_len ); - result_fx.x_fx = BASOP_Util_Divide3232_Scale_cadence( p.x_fx, length_fx, &scale ); + result_fx.x_fx = BASOP_Util_Divide3232_Scale_newton( p.x_fx, length_fx, &scale ); move32(); x_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); // e+(e1-e2)// - result_fx.y_fx = BASOP_Util_Divide3232_Scale_cadence( p.y_fx, length_fx, &scale ); + result_fx.y_fx = BASOP_Util_Divide3232_Scale_newton( p.y_fx, length_fx, &scale ); move32(); y_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); - result_fx.z_fx = BASOP_Util_Divide3232_Scale_cadence( p.z_fx, length_fx, &scale ); + result_fx.z_fx = BASOP_Util_Divide3232_Scale_newton( p.z_fx, length_fx, &scale ); move32(); z_qfact = sub( Q31, add( scale, sub( q_len, p.q_fact ) ) ); diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index 62c97f88f..c70e8d667 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -411,7 +411,7 @@ static void response_step_limit_fx( IF( X[i] ) { - desiredChange = BASOP_Util_Divide3232_Scale_cadence( X[i], X[i - 1], &div_e ); + desiredChange = BASOP_Util_Divide3232_Scale_newton( X[i], X[i - 1], &div_e ); desiredChange_q = sub( 31, ( div_e ) ); } @@ -459,7 +459,7 @@ static void response_step_limit_fx( IF( X[i] ) { - desiredChange = BASOP_Util_Divide3232_Scale_cadence( X[i], X[i + 1], &div_e ); + desiredChange = BASOP_Util_Divide3232_Scale_newton( X[i], X[i + 1], &div_e ); desiredChange_q = sub( 31, ( div_e ) ); } IF( GT_16( desiredChange_q, 30 ) ) @@ -742,9 +742,9 @@ void ivas_reverb_calc_color_levels_fx( move16(); cos_w = getCosWord16R2( (Word16) L_abs( L_shl( Mpy_32_32( pFc[freq_idx], fs_inverted ), 3 ) ) ); // q = 15 H_filter = L_add( L_shr( L_add( L_shr( Mpy_32_32( coefB[0], coefB[0] ), 1 ), L_shr( Mpy_32_32( coefB[1], coefB[1] ), 1 ) ), 2 ), L_shr( Mpy_32_32( coefB[0], Mpy_32_32( coefB[1], L_shl( cos_w, 15 ) ) ), 1 ) ); // q = 28 - H_filter = BASOP_Util_Divide3232_Scale_cadence( H_filter, L_add( ONE_IN_Q28, L_shr( L_add( L_shr( Mpy_32_32( coefA[1], coefA[1] ), 2 ), Mpy_32_32( coefA[1], L_shl( cos_w, 15 ) ) ), 1 ) ), &temp ); + H_filter = BASOP_Util_Divide3232_Scale_newton( H_filter, L_add( ONE_IN_Q28, L_shr( L_add( L_shr( Mpy_32_32( coefA[1], coefA[1] ), 2 ), Mpy_32_32( coefA[1], L_shl( cos_w, 15 ) ) ), 1 ) ), &temp ); H_filter = Sqrt32( H_filter, &temp ); - T60_est = BASOP_Util_Divide3232_Scale_cadence( L_shl( i_mult( -3, pLoop_delays[loop_idx] ), 2 ), Mpy_32_32( Mpy_32_32( L_add( BASOP_Util_Log2( H_filter ), L_shl( temp, 25 ) ), LOG10_2_Q31 ), L_shl( output_Fs, 8 ) ), &temp ); // conversion of log2 to log10. + T60_est = BASOP_Util_Divide3232_Scale_newton( L_shl( i_mult( -3, pLoop_delays[loop_idx] ), 2 ), Mpy_32_32( Mpy_32_32( L_add( BASOP_Util_Log2( H_filter ), L_shl( temp, 25 ) ), LOG10_2_Q31 ), L_shl( output_Fs, 8 ) ), &temp ); // conversion of log2 to log10. t60[freq_idx] = BASOP_Util_Add_Mant32Exp( T60_est, temp, t60[freq_idx], t60_e[freq_idx], &result_e ); move16(); t60_e[freq_idx] = result_e; @@ -775,14 +775,14 @@ void ivas_reverb_calc_color_levels_fx( { Word16 temp, temp1, temp2, temp3 = 0, temp4, temp5; move16(); - Word32 var1 = BASOP_Util_Divide3232_Scale_cadence( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), sub( 11, t60_e[freq_idx] ) ), &temp ); + Word32 var1 = BASOP_Util_Divide3232_Scale_newton( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), sub( 11, t60_e[freq_idx] ) ), &temp ); var1 = Mpy_32_32( var1, LOG2_10_Q29 ); // e = temp + (31 - 29) Word32 A0_square_est = BASOP_util_Pow2( var1, add( temp, 31 - 29 ), &temp ); Word16 alpha_e; - Word32 alpha = BASOP_Util_Divide3232_Scale_cadence( -log__0_001, t60[freq_idx], &alpha_e ); // alpha_e = 1 + alpha_e + (3 - t60_e[257]) + Word32 alpha = BASOP_Util_Divide3232_Scale_newton( -log__0_001, t60[freq_idx], &alpha_e ); // alpha_e = 1 + alpha_e + (3 - t60_e[257]) - Word32 div11 = BASOP_Util_Divide3232_Scale_cadence( A0_square_est, alpha, &temp1 ); // e = temp1 + (temp - alpha_e) - Word32 div2 = BASOP_Util_Divide3232_Scale_cadence( L_shl( output_Fs, 11 ), L_shr( L_add( Mpy_32_16_1( 1884631649, shl( minDelayDiff, 3 ) ), 14037339 ), 8 ), &temp2 ); // e = temp2, 26.7741 in Q19, 0.8776 in Q31 + Word32 div11 = BASOP_Util_Divide3232_Scale_newton( A0_square_est, alpha, &temp1 ); // e = temp1 + (temp - alpha_e) + Word32 div2 = BASOP_Util_Divide3232_Scale_newton( L_shl( output_Fs, 11 ), L_shr( L_add( Mpy_32_16_1( 1884631649, shl( minDelayDiff, 3 ) ), 14037339 ), 8 ), &temp2 ); // e = temp2, 26.7741 in Q19, 0.8776 in Q31 const Word32 revPredNormEnergy = Mpy_32_32( div2, div11 ); // q = (15 - temp2) + (15 - temp1) - 15 + 1 // L_max @@ -794,7 +794,7 @@ void ivas_reverb_calc_color_levels_fx( L_tmp = W_extract_h( W_shl( W_tmp1, W_shift ) ); temp4 = sub( 3, W_shift ); div2 = Sqrt32( L_tmp, &temp4 ); - pTarget_color_L[freq_idx] = BASOP_Util_Divide3232_Scale_cadence( div2, div1, &temp5 ); + pTarget_color_L[freq_idx] = BASOP_Util_Divide3232_Scale_newton( div2, div1, &temp5 ); move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_L_e[freq_idx] = temp5; @@ -807,7 +807,7 @@ void ivas_reverb_calc_color_levels_fx( L_tmp = W_extract_h( W_shl( W_tmp2, W_shift ) ); temp4 = sub( 3, W_shift ); div2 = Sqrt32( L_tmp, &temp4 ); - pTarget_color_R[freq_idx] = BASOP_Util_Divide3232_Scale_cadence( div2, div1, &temp5 ); + pTarget_color_R[freq_idx] = BASOP_Util_Divide3232_Scale_newton( div2, div1, &temp5 ); move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_R_e[freq_idx] = temp5; @@ -825,7 +825,7 @@ void ivas_reverb_calc_color_levels_fx( Word32 div1; Word16 temp = 0; move16(); - div1 = BASOP_Util_Divide3232_Scale_cadence( L_mult0( 1000, sub( freq_count, 1 ) ), L_shr( output_Fs, 1 ), &temp ); + div1 = BASOP_Util_Divide3232_Scale_newton( L_mult0( 1000, sub( freq_count, 1 ) ), L_shr( output_Fs, 1 ), &temp ); div1 = BASOP_Util_Add_Mant32Exp( div1, temp, ONE_IN_Q30, 1, &temp ); idx_pivot = extract_l( L_shr( div1, sub( 31, temp ) ) ); /* Perform step limiting */ diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index e6f8f2653..1633f42d0 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1974,7 +1974,7 @@ static void external_target_interpolation_fx( move16(); Word32 tmp; /* Calculate the interpolation increment and coefficient */ - tmp = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, L_shl( L_deposit_l( hExtOrientationData->numFramesToTargetOrientation[i] ), 2 ), &tmp_e ); + tmp = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, L_shl( L_deposit_l( hExtOrientationData->numFramesToTargetOrientation[i] ), 2 ), &tmp_e ); hCombinedOrientationData->interpolationIncrement_fx = L_shl( tmp, sub( tmp_e, 31 ) ); /* Q30 */ move32(); hCombinedOrientationData->interpolationCoefficient_fx = hCombinedOrientationData->interpolationIncrement_fx; diff --git a/lib_rend/ivas_shoebox_fx.c b/lib_rend/ivas_shoebox_fx.c index 1a4496085..0156e70b5 100644 --- a/lib_rend/ivas_shoebox_fx.c +++ b/lib_rend/ivas_shoebox_fx.c @@ -387,7 +387,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( { q = Q22; move16(); - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( *scale, absxk, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( *scale, absxk, &q ); out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 @@ -397,7 +397,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( } ELSE { - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( absxk, *scale, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( absxk, *scale, &q ); t = W_extract_h( W_shl( W_mult_32_32( t, t ), sub( shl( q, 1 ), 9 ) ) ); // Q31 + Q31 + Q1 - 9 - 32 = Q22 out_tmp = L_add( out_tmp, t ); // Q22 move32(); @@ -407,7 +407,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( IF( GE_32( absxk, *scale ) ) { - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( *scale, absxk, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( *scale, absxk, &q ); out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 @@ -417,7 +417,7 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( } ELSE { - t = (Word32) BASOP_Util_Divide3232_Scale_cadence( absxk, *scale, &q ); + t = (Word32) BASOP_Util_Divide3232_Scale_newton( absxk, *scale, &q ); t = W_extract_h( W_shl( W_mult_32_32( t, t ), sub( shl( q, 1 ), 9 ) ) ); // Q31 + Q31 + Q1 - 9 - 32 = Q22 out_tmp = L_add( out_tmp, t ); // Q22 } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7e526ca77..859768784 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -6836,7 +6836,7 @@ static void renderMasaToMasa( move32(); FOR( dir = 0; dir < numDirs; dir++ ) { - tmp = BASOP_Util_Divide3232_Scale_cadence( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); + tmp = BASOP_Util_Divide3232_Scale_newton( inMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); inMeta->directional_meta[dir].energy_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); /* Q30 */ move32(); } @@ -6844,7 +6844,7 @@ static void renderMasaToMasa( move16(); tmp = 0; move32(); - tmp = BASOP_Util_Divide3232_Scale_cadence( inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); + tmp = BASOP_Util_Divide3232_Scale_newton( inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum_fx, &tmp_e ); inMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = L_shl( tmp, sub( tmp_e, 1 ) ); /* Q30 */ move32(); } -- GitLab From e1d19cecb18720009dcb45d33196ba192b69fe09 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 11:30:57 +0200 Subject: [PATCH 0313/1310] checkin state of BE branch in commit 090be8f3 --- lib_com/options.h | 14 + lib_com/prot_fx.h | 10 +- lib_com/swb_tbe_com_fx.c | 573 ++++++++++++++++++++++++++--- lib_com/tools_fx.c | 26 +- lib_dec/ivas_stereo_icbwe_dec_fx.c | 10 + lib_dec/swb_tbe_dec_fx.c | 10 + lib_enc/swb_tbe_enc_fx.c | 39 +- 7 files changed, 623 insertions(+), 59 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e8a44d873..c76765742 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -72,6 +72,11 @@ #define FIX_1378_ACELP_OUT_OF_BOUNDS /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ + +#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ +#define MERGE_REQ + + //#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ #define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ #define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ @@ -84,4 +89,13 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ + +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1452d8e2e..702cdea12 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,15 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : i signal Q_input_fx */ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS; +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else + const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 238b478c5..f1492b0b4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6687,6 +6687,181 @@ void wb_tbe_extras_reset_synth_fx( return; } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +{ + Word32 L_tmpX; + Word16 i; + Word32 L_tmpMax2 = *L_tmpMax; + Word32 L_tmpAbs; + move32(); + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#else + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#endif + } /*IsUpsampled3*/ + ELSE + { /*IsUpsampled3*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ + *L_tmpMax = L_tmpMax2; + move32(); +} +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * @@ -6695,7 +6870,15 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS; +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6704,17 +6887,36 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 memory_fx0, Q_temp, Q_temp2; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; + Word32 L_tmpMax; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + Word64 W_tmpX; + Word64 W_tmpY; +#endif + + Word32 *L_tmp = &L_tmp_buffer[4]; + Word32 *L_tmp2 = &L_tmp2_buffer[4]; + Word32 *L_output = &L_output_buffer[4]; +#else Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; Word32 memory2_fx_2[4], memory2_fx_3[4]; +#endif FOR( i = 0; i < 4; i++ ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + memory_fx0 = extract_l( memory_fx2[0][i] ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); +#else memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); +#endif + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); move32(); move32(); move32(); @@ -6722,48 +6924,158 @@ void elliptic_bpf_48k_generic_fx( move32(); } - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); +#else + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ + ELSE + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); + + FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6777,6 +7089,7 @@ void elliptic_bpf_48k_generic_fx( L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6787,6 +7100,46 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); +#else +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -6831,20 +7184,22 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } +#endif + Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); @@ -6861,12 +7216,54 @@ void elliptic_bpf_48k_generic_fx( move32(); FOR( j = 0; j < 4; j++ ) { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); + move32(); move32(); + } +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); +#else +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -6932,6 +7329,10 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } + +#endif + + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; @@ -6998,7 +7399,12 @@ void synthesise_fb_high_band_fx( Word16 Qout ) { Word16 i, j; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; + Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; +#else Word16 excitation_in_interp3[L_FRAME48k]; +#endif Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; @@ -7023,12 +7429,28 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx + + ); } ELSE { /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); @@ -7074,6 +7496,50 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { +#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx + L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ + Word32 L_tmp32; + Word16 tmp16; + + // if (L_tmp < 0) + if ( L_tmp < 0 ) + { + L_tmp32 = L_negate( L_tmp ); + } + if ( L_tmp < 0 ) + { + L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); + } + if ( L_tmp < 0 ) + { + tmp16 = extract_h( L_tmp32 ); + } + if ( L_tmp < 0 ) + { + tmp16 = negate( tmp16 ); + } + + // if (L_tmp == 0) + if ( L_tmp == 0 ) + { + tmp16 = 0; + move16(); + } + + // if (L_tmp > 0) + if ( L_tmp > 0 ) + { + L_tmp32 = L_shl_sat( L_tmp, tmp3 ); + } + if ( L_tmp > 0 ) + { + tmp16 = extract_h( L_tmp32 ); + } + + output[i] = tmp16; + move16(); + +#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7085,6 +7551,7 @@ void synthesise_fb_high_band_fx( output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); } +#endif } return; } diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 5219d076c..756b5be80 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,13 +794,37 @@ void Copy_Scale_sig_16_32_no_sat( } return; } +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat + L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); + + IF( L_tmp >= 0x7FFF ) + { + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* Overflow can occur here */ + } + return; + } + // ELSE + { + Word16 tmp = extract_l( L_tmp ); + FOR( i = 0; i < lg; i++ ) + { + y[i] = L_mult( x[i], tmp ); + move32(); + } + } +#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ + move32(); /* Overflow can occur here */ } +#endif } void Copy_Scale_sig_32_16( diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index c7bc98566..772eb2d7d 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,6 +904,9 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); +#endif FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -911,10 +914,17 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + if ( LE_16( alpha_fx, winSlope_fx_ ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ + } +#else IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } +#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1b51a29fb..00be6455d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7022,14 +7022,24 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); + +#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx + Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 +#endif + FOR( i = 0; i < L_FRAME16k; i++ ) { +#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } +#else + Word16 idx; + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ +#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 316a5b549..be0dd84e5 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7299,13 +7299,18 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; - Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_buffer[L_FRAME48k + 4]; + Word16 *input_fhb = &input_fhb_buffer[0] + 4; +#else + Word16 input_fhb[L_FRAME48k]; +#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); @@ -7325,7 +7330,14 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7422,7 +7434,12 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; + Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; +#else Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; +#endif Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; @@ -7449,11 +7466,25 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } ELSE { - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + 1 // isIVAS +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 0, // IsUpsampled3 +#endif + input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); } test(); -- GitLab From 8aa08f4f18d666485c9ed7a36b05a31478b70634 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Fri, 11 Apr 2025 09:45:17 +0000 Subject: [PATCH 0314/1310] last cleanups --- lib_com/prot_fx.h | 9 ++------- lib_com/swb_tbe_com_fx.c | 1 - 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 93da4d66a..1452d8e2e 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3258,7 +3258,7 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : input signal Q_input_fx*/ + const Word16 input_fx[], /* i : i signal Q_input_fx */ Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ @@ -3277,12 +3277,7 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS -#endif -); + Word16 Qout ); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d3dc614aa..ca0c39b17 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6714,7 +6714,6 @@ void elliptic_bpf_48k_generic_fx( memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); //is this change be? move32(); move32(); move32(); -- GitLab From e0d2ebe1640492ea5322ee5f68f5685380db2d73 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Apr 2025 17:00:53 +0530 Subject: [PATCH 0315/1310] Fix for 3GPP issue 1458: Crash with new testcase in pytest suite - ISM with DTX, bitrate switching + JBM to BINAURAL_ROOM_IR Link #1458 --- lib_dec/ivas_jbm_dec_fx.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 8c5a9e9af..74af57bd5 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2550,7 +2550,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( DECODER_TC_BUFFER_HANDLE hTcBuffer; Word32 output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - Word16 nchan_in, nchan_out; + Word16 nchan_in, nchan_out, gd_bits, n_chan_inp, i, shift; IF( !st_ivas->hDecoderConfig->Opt_tsm ) { return IVAS_ERR_OK; @@ -2637,17 +2637,44 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ set16_fx( st_ivas->hIsmRendererData->interpolator_fx, 32767, hTcBuffer->n_samples_granularity ); // 32767=1.0f in Q15 - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); + ivas_ism_render_sf_fx( st_ivas, p_output_fx, hTcBuffer->n_samples_granularity ); st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; *st_ivas->hCrendWrapper->p_io_qfactor = 11; move16(); + + shift = MAX_16; + move16(); + n_chan_inp = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); + + FOR( i = 0; i < n_chan_inp; i++ ) + { + shift = s_min( shift, L_norm_arr( p_output_fx[i], hTcBuffer->n_samples_granularity ) ); + } + + gd_bits = sub( find_guarded_bits_fx( imult1616( hTcBuffer->subframe_nbslots[0], hTcBuffer->n_samples_granularity ) ), shift ); + + *st_ivas->hCrendWrapper->p_io_qfactor = sub( *st_ivas->hCrendWrapper->p_io_qfactor, gd_bits ); + move16(); + + FOR( i = 0; i < n_chan_inp; i++ ) + { + scale_sig32( p_output_fx[i], hTcBuffer->n_samples_granularity, sub( *st_ivas->hCrendWrapper->p_io_qfactor, Q11 ) ); // Q(*st_ivas->hCrendWrapper->p_io_qfactor) + } + IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } + + FOR( i = 0; i < n_chan_inp; i++ ) + { + scale_sig32( p_output_fx[i], hTcBuffer->n_samples_granularity, sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q(11) + } + *st_ivas->hCrendWrapper->p_io_qfactor = Q11; + move16(); } } ELSE -- GitLab From 5feaf0b4d57d671ffa92ff849db93bc4f683e081 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Apr 2025 19:26:25 +0530 Subject: [PATCH 0316/1310] Fix for 3GPP issue 1465: Decoder crash for low bitrate OSBA in ivas_spar_dec_upmixer_sf_fx() Link #1465 --- lib_com/cldfb.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 720ee37a0..6a9581498 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -901,7 +901,7 @@ void cldfbAnalysis_ts_fx_fixed_q( const Word16 *ptr_pf_fx; Word16 ptr_pf_sf; Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; - Word16 offset, frameSize; + Word16 offset, frameSize, gb, hr, shift; offset = sub( h_cldfb->p_filter_length, h_cldfb->no_channels ); frameSize = i_mult( h_cldfb->no_channels, h_cldfb->no_col ); @@ -1071,18 +1071,42 @@ void cldfbAnalysis_ts_fx_fixed_q( *q_cldfb = sub( *q_cldfb, 2 ); move16(); + gb = find_guarded_bits_fx( M1 ); + hr = L_norm_arr( iBuffer_fx, M1 ); + + IF( LT_16( hr, gb ) ) + { + scale_sig32( iBuffer_fx, M1, sub( hr, gb ) ); + } + /* FFT of DCT IV */ fft_cldfb_fx( iBuffer_fx, M2 ); /* post modulation of DCT IV */ - FOR( k = 0; k < M2; k++ ) + IF( LT_16( hr, gb ) ) { - /* do it inplace */ - /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ - imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 - imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 - move32(); - move32(); + shift = sub( gb, hr ); + FOR( k = 0; k < M2; k++ ) + { + /* do it inplace */ + /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + imagBuffer_fx[2 * k] = L_shl( Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ), shift ); // q - 5 + imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_shl( Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ), shift ); // q - 5 + move32(); + move32(); + } + } + ELSE + { + FOR( k = 0; k < M2; k++ ) + { + /* do it inplace */ + /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 + imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 + move32(); + move32(); + } } IF( EQ_32( h_cldfb->prototype, CLDFB_PROTOTYPE_5_00MS ) ) -- GitLab From 7ab90bd2823d95a91cdd30a511e73b5ec1cf86c4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Apr 2025 21:19:26 +0530 Subject: [PATCH 0317/1310] Fix for 3GPP issue 1480: BASOP assert in MDCT-Stereo Stereo pre-processing with music signal Link #1480 --- lib_enc/ivas_mdct_core_enc_fx.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_mdct_core_enc_fx.c b/lib_enc/ivas_mdct_core_enc_fx.c index e744c7f47..52a88064a 100644 --- a/lib_enc/ivas_mdct_core_enc_fx.c +++ b/lib_enc/ivas_mdct_core_enc_fx.c @@ -815,6 +815,7 @@ static UWord16 enc_ste_pre_mdct( Word16 mdst_exp1[2 * 960], mdst_exp2[2 * 960]; Word16 x1, x2, x3, x4, ans, tmp; Word32 maxSqrValue_fx; + Word64 sumL_64fx, sumR_64fx; IF( LT_16( nSamplesMax, 512 ) ) { @@ -885,7 +886,9 @@ static UWord16 enc_ste_pre_mdct( { return 0; } - + sumL_64fx = 0, sumR_64fx = 0; + move64(); + move64(); FOR( s = fadeInOff; s < nSampProc; s++ ) { Word32 absMagnL_fx, absMagnR_fx; @@ -898,8 +901,8 @@ static UWord16 enc_ste_pre_mdct( absMagnR_fx = Sqrt32( L_add( Mpy_32_32( sigR1_fx[s], sigR1_fx[s] ), Mpy_32_32( sigI1_fx[s], sigI1_fx[s] ) ), &absMagnR_e ); corr_fx = L_add( corr_fx, L_add( Mpy_32_32( sigR0_fx[s], sigR1_fx[s] ), Mpy_32_32( sigI0_fx[s], sigI1_fx[s] ) ) ); // q_com*2 - 31 - sumL_fx = L_add( sumL_fx, L_add( L_shr( sigR0_fx[s], 1 ), L_shr( sigI0_fx[s], 1 ) ) ); // q_com -1 - sumR_fx = L_add( sumR_fx, L_add( L_shr( sigR1_fx[s], 1 ), L_shr( sigI1_fx[s], 1 ) ) ); // q_com - 1 + sumL_64fx = W_add( sumL_64fx, W_add( sigR0_fx[s], sigI0_fx[s] ) ); // q_com + sumR_64fx = W_add( sumR_64fx, W_add( sigR1_fx[s], sigI1_fx[s] ) ); // q_com sumMagnL_fx = BASOP_Util_Add_Mant32Exp( sumMagnL_fx, sumMagnL_e, absMagnL_fx, absMagnL_e, &sumMagnL_e ); sumMagnR_fx = BASOP_Util_Add_Mant32Exp( sumMagnR_fx, sumMagnR_e, absMagnR_fx, absMagnR_e, &sumMagnR_e ); sumPrdLR_fx = BASOP_Util_Add_Mant32Exp( sumPrdLR_fx, sumPrdLR_e, Mpy_32_32( absMagnL_fx, absMagnR_fx ), add( absMagnL_e, absMagnR_e ), &sumPrdLR_e ); @@ -911,7 +914,14 @@ static UWord16 enc_ste_pre_mdct( temp1 = L_shl( preproLen, x1 ); corr_fx = Mpy_32_32( corr_fx, temp1 ); x1 = sub( 62, add( shl( *q_com, 1 ), x1 ) ); - corr_fx = BASOP_Util_Add_Mant32Exp( corr_fx, x1, Mpy_32_32( sumL_fx, sumR_fx ), sub( 62, shl( sub( *q_com, 1 ), 1 ) ), &x1 ); + + x2 = W_norm( sumL_64fx ); + sumL_fx = W_extract_h( W_shl( sumL_64fx, x2 ) ); + + x3 = W_norm( sumR_64fx ); + sumR_fx = W_extract_h( W_shl( sumR_64fx, x3 ) ); + + corr_fx = BASOP_Util_Add_Mant32Exp( corr_fx, x1, Mpy_32_32( sumL_fx, sumR_fx ), sub( 62, add( sub( add( *q_com, x2 ), 32 ), sub( add( *q_com, x3 ), 32 ) ) ), &x1 ); IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( corr_fx, x1, -maxSqrValue_fx, 52 ), -1 ) ) { -- GitLab From 198464b72b08fa9dc2a61cb660ca7c590159c723 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 14 Apr 2025 17:15:12 +0200 Subject: [PATCH 0318/1310] hardcode output of BASOP_Util_Divide3232_Scale_cadence() for fad_r calculation --- lib_enc/ivas_stereo_dmx_evs_fx.c | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 625ff8ee9..0afb69279 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -2419,7 +2419,34 @@ ivas_error stereo_dmx_evs_init_encoder_fx( fad_g = hStereoDmxEVS->hPHA->fad_g_fx; // fad_r = 1.0f / (float) ( fad_len + 1 ); +#if 1 + SWITCH( fad_len ) + { + case STEREO_DMX_EVS_FAD_LEN_16: + fad_r = 13338408; + move32(); + tmp_e = -6; + move16(); + BREAK; + case STEREO_DMX_EVS_FAD_LEN_32: + fad_r = 856317467; + move32(); + tmp_e = -7; + move16(); + BREAK; + case STEREO_DMX_EVS_FAD_LEN_48: + fad_r = 571471740; + move32(); + tmp_e = -7; + move16(); + BREAK; + default: + fad_r = BASOP_Util_Divide3232_Scale_newton( 1, add( fad_len, 1 ), &tmp_e ); + BREAK; + } +#else fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); +#endif fad_r = L_shl_r( fad_r, tmp_e ); fad_len2 = shr( fad_len, 1 ); FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len2; ( n++, m-- ) ) @@ -2537,7 +2564,34 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; // fad_r = 1.0f / (float) ( fad_len + 1 ); +#if 1 + SWITCH( fad_len ) + { + case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 16: + fad_r = 856317467; + move32(); + tmp_e = -7; + move16(); + BREAK; + case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 32: + fad_r = 857653375; + move32(); + tmp_e = -8; + move16(); + BREAK; + case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 48: + fad_r = 572066403; + move32(); + tmp_e = -8; + move16(); + BREAK; + default: + fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); + BREAK; + } +#else fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); +#endif fad_r = L_shl_r( fad_r, tmp_e ); fad_len2 = shr( fad_len, 1 ); FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len2; ( n++, m-- ) ) -- GitLab From eba16468ee36235c6df9c87e5f69ed7a6427ebb0 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 14 Apr 2025 17:23:10 +0200 Subject: [PATCH 0319/1310] fix wrong value, use correct division --- lib_enc/ivas_stereo_dmx_evs_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 0afb69279..042a2e541 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -2423,7 +2423,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( SWITCH( fad_len ) { case STEREO_DMX_EVS_FAD_LEN_16: - fad_r = 13338408; + fad_r = 853658096; move32(); tmp_e = -6; move16(); @@ -2586,7 +2586,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); BREAK; default: - fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); + fad_r = BASOP_Util_Divide3232_Scale_newton( 1, add( fad_len, 1 ), &tmp_e ); BREAK; } #else -- GitLab From 6ec556d214525169cfb3831444b80f3671384839 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Mon, 14 Apr 2025 22:35:36 +0530 Subject: [PATCH 0320/1310] Fix for 3GPP issue 1478: Encoder crash (assert) in ISM1, GSC encoder --- lib_com/gs_preech_fx.c | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/lib_com/gs_preech_fx.c b/lib_com/gs_preech_fx.c index 3b3eaa777..48ec22a22 100644 --- a/lib_com/gs_preech_fx.c +++ b/lib_com/gs_preech_fx.c @@ -177,9 +177,10 @@ void pre_echo_att_ivas_fx( move16(); Word16 ratio_fx; Word16 attack_pos_fx, i; - Word32 L_tmp, L_tmp1; - Word16 tmp, n1, n2, exp, frac1, frac2; + Word32 L_tmp; + Word16 tmp, tmp_e; Word32 etmp1_fx; + Word16 etmp_e; Word16 att_len; test(); @@ -220,32 +221,19 @@ void pre_echo_att_ivas_fx( IF( GT_32( etmp_fx, *Last_frame_ener_fx ) && attack_pos_fx > 0 ) { /* Find the average energy before the attack */ - L_tmp = sum32_fx( finc_fx, attack_pos_fx ); /*Q1 */ - L_tmp1 = L_shr( L_mult( attack_pos_fx, attack_pos_fx ), 1 ); /*Q0 */ - tmp = round_fx( Isqrt( L_tmp1 ) ); /*Q15 */ - L_tmp = L_shr( L_tmp, 2 ); /*Q1 ; ATT_SEG_LEN=4 */ - etmp_fx = Mult_32_16( L_tmp, tmp ); /*Q1 */ - - etmp_fx = L_shr( etmp_fx, add( 1 - 4, shl( Q_new, 1 ) ) ); /* makes etmp i nQ4 as *Last_frame_ener_fx */ - /* Find the correction factor and apply it before the attack */ - /* ratio = (float)sqrt(*Last_frame_ener/etmp);*/ - /* = isqrt(etmp/(*Last_frame_ener)) */ - etmp_fx = L_max( etmp_fx, 1 ); - *Last_frame_ener_fx = L_max( *Last_frame_ener_fx, 1 ); - move32(); - n1 = norm_l( etmp_fx ); - n2 = norm_l( *Last_frame_ener_fx ); - - n1 = sub( n1, 1 ); - exp = sub( n1, n2 ); - - frac1 = round_fx( L_shl( etmp_fx, n1 ) ); - frac2 = round_fx_sat( L_shl_sat( *Last_frame_ener_fx, n2 ) ); - L_tmp = L_mult0( 128, div_s( frac1, frac2 ) ); /* s = gain_out / gain_in */ - L_tmp = L_shr( L_tmp, exp ); /* add exponent */ + etmp_fx = sum32_fx( finc_fx, attack_pos_fx ); + etmp_e = sub( 31, add( shl( Q_new, 1 ), 1 ) ); + etmp_fx = L_add( etmp_fx, L_shr( 21474836 /*0.01 in Q31*/, etmp_e ) ); /* etmp = etmp + 0.01; (exp = etmp_e) */ + etmp_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( etmp_fx, L_mult0( attack_pos_fx, ATT_SEG_LEN ), &tmp_e ) ); + tmp_e = add( tmp_e, sub( etmp_e, 31 ) ); + etmp_e = tmp_e; + move16(); - L_tmp = Isqrt( L_tmp ); - ratio_fx = round_fx( L_shl( L_tmp, 9 ) ); + /* Find the correction factor and apply it before the attack */ + tmp = BASOP_Util_Divide3232_Scale( *Last_frame_ener_fx, etmp_fx, &tmp_e ); /* numerator Q = 2 * Q_new + 1; denominator Q = 31 - tmp_e */ + tmp_e = add( tmp_e, sub( sub( 31, etmp_e ), add( shl( Q_new, 1 ), 1 ) ) ); /* tmp_e = tmp_e + (31 - tmp_e) - (2 * Q_new + 1) */ + tmp = Sqrt16( tmp, &tmp_e ); + ratio_fx = shr( tmp, sub( 2, tmp_e ) ); /* Q13 */ /* Pre-echo atttenuation should never increase the energy */ ratio_fx = s_min( ratio_fx, 8192 /* 1 in Q13 */ ); /* Q13 */ -- GitLab From 83a63d925cfc8a4c15e2321740580238f1249c01 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Mon, 14 Apr 2025 22:38:47 +0530 Subject: [PATCH 0321/1310] Fix for 3GPP issue 1455: ParamMC Encoder: Missing energy for BASOP in 10kHz region --- lib_enc/ivas_mc_param_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index d0316be0f..22eacdb32 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -2222,7 +2222,7 @@ static void ivas_param_mc_dec2bin_fx( /* convert value to bitstream, MSB first */ FOR( idx = 0; idx < N; idx++ ) { - bits[idx] = (UWord16) s_and( shr( val, sub( N, sub( 1, idx ) ) ), 1 ); + bits[idx] = (UWord16) s_and( shr( val, sub( sub( N, 1 ), idx ) ), 1 ); move16(); } -- GitLab From 2434c3f7e07b1fec6fb1d1ad8869102bb742728d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 14 Apr 2025 21:53:22 +0200 Subject: [PATCH 0322/1310] lib_com: replace BASOP_Util_Divide3232_Scale_cadence by BASOP_Util_Divide3232_Scale_newton --- lib_com/ivas_dirac_com_fx.c | 2 +- lib_com/ivas_qspherical_com_fx.c | 6 +++--- lib_com/ivas_spar_com_fx.c | 4 ++-- lib_com/ivas_transient_det_fx.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index b16b94f1d..4279065b0 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -1034,7 +1034,7 @@ void computeDiffuseness_fixed( exp1 = sub( 31, q_intensity_slow ); tmp = Sqrt32( p_tmp[i], &exp1 ); - tmp = BASOP_Util_Divide3232_Scale_cadence( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); + tmp = BASOP_Util_Divide3232_Scale_newton( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); q_tmp = add( sub( 31, exp2 ), sub( sub( 31, exp1 ), q_ene ) ); IF( LT_16( q_tmp, Q30 ) ) diff --git a/lib_com/ivas_qspherical_com_fx.c b/lib_com/ivas_qspherical_com_fx.c index 6661026a8..844c3ecde 100644 --- a/lib_com/ivas_qspherical_com_fx.c +++ b/lib_com/ivas_qspherical_com_fx.c @@ -314,9 +314,9 @@ Word16 quantize_phi_enc_fx( Word32 temp_res; Word16 temp_e; - delta_phi_fx = BASOP_Util_Divide3232_Scale_cadence( 360, n, &temp_e ); + delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( 360, n, &temp_e ); delta_phi_fx = L_shl( delta_phi_fx, sub( temp_e, 9 ) ); - inv_delta_phi_fx = BASOP_Util_Divide3232_Scale_cadence( n, 360, &temp_e ); + inv_delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( n, 360, &temp_e ); IF( EQ_16( n, 1 ) ) { @@ -661,7 +661,7 @@ Word16 quantize_phi_chan_compand_fx( /* quantize companded value */ // delta_phi = 360.0f / (float) n; - delta_phi = BASOP_Util_Divide3232_Scale_cadence( 360, n, &tmp_e ); + delta_phi = BASOP_Util_Divide3232_Scale_newton( 360, n, &tmp_e ); delta_phi = L_shr( delta_phi, sub( 9, tmp_e ) ); // Q22 // id_phi = (int16_t) round_f( ( phi / (float) delta_phi ) ); id_phi = BASOP_Util_Divide3232_Scale( phi, delta_phi, &tmp_e ); // Q15 diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 8aaeb7f63..c2ad11e26 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -985,7 +985,7 @@ static void ivas_get_pred_coeffs_enc_fx( move32(); dm_g_q[b] = Q29; move16(); - DM_F[b] = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // Q=(31-(s_dm_f+2+num_f_e-den_f_e)) + DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // Q=(31-(s_dm_f+2+num_f_e-den_f_e)) move32(); DM_F_q[b] = sub( 31, add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ) ); move16(); @@ -1514,7 +1514,7 @@ static void ivas_get_pred_coeffs_fx( den_f = L_max( den_f, 1 ); // Q=31-den_f_e dm_g[b] = activew_quad_thresh; // Q29 move32(); - DM_F[b] = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // s_dm_f+2+num_f_e-den_f_e + DM_F[b] = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( dm_g[b], num_f ), den_f, &s_dm_f ); // s_dm_f+2+num_f_e-den_f_e move32(); s_dm_f = add( s_dm_f, sub( add( 2, num_f_e ), den_f_e ) ); /*Resultant exp for DM_F s_dm_f +( 2 + num_f_e ) - den_f_e*/ div_shift = sub( s_dm_f, 1 ); diff --git a/lib_com/ivas_transient_det_fx.c b/lib_com/ivas_transient_det_fx.c index 3b9a8cfd7..fb8679ebc 100644 --- a/lib_com/ivas_transient_det_fx.c +++ b/lib_com/ivas_transient_det_fx.c @@ -353,7 +353,7 @@ static Word32 ivas_calc_duck_gain_fx( test(); IF( ( env_1 != 0 ) && ( env_2 != 0 ) ) { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( env_1, env_2, &tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( env_1, env_2, &tmp_e ); L_tmp = L_shl( L_tmp, add( sub( env1_e, env2_e ), tmp_e ) ); duck_gain_out = Mpy_32_32( duck_mult_fac, L_tmp ); /*Q29*/ -- GitLab From faeaeb84596e0e13cb1a3037b228104730cda03c Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 14 Apr 2025 22:04:05 +0200 Subject: [PATCH 0323/1310] lib_enc: replace BASOP_Util_Divide3232_Scale_cadence() by BASOP_Util_Divide3232_Scale_newton() with exception of ivas_stereo_dmx_evs_fx.c --- lib_enc/find_tilt_fx.c | 2 +- lib_enc/hq_classifier_enc_fx.c | 2 +- lib_enc/ivas_enc_cov_handler_fx.c | 2 +- lib_enc/ivas_masa_enc_fx.c | 24 ++++---- lib_enc/ivas_mdct_core_enc_fx.c | 10 +-- lib_enc/ivas_qmetadata_enc_fx.c | 12 ++-- lib_enc/ivas_stereo_classifier_fx.c | 14 ++--- lib_enc/ivas_stereo_cng_enc_fx.c | 12 ++-- lib_enc/ivas_stereo_dft_enc_fx.c | 78 ++++++++++++------------ lib_enc/ivas_stereo_dft_enc_itd_fx.c | 50 +++++++-------- lib_enc/ivas_stereo_eclvq_enc_fx.c | 20 +++--- lib_enc/ivas_stereo_ica_enc_fx.c | 10 +-- lib_enc/ivas_stereo_mdct_stereo_enc_fx.c | 4 +- lib_enc/ivas_stereo_td_analysis_fx.c | 6 +- lib_enc/ivas_tcx_core_enc_fx.c | 2 +- lib_enc/speech_music_classif_fx.c | 4 +- lib_enc/tcx_utils_enc_fx.c | 2 +- lib_enc/transient_detection_fx.c | 6 +- 18 files changed, 130 insertions(+), 130 deletions(-) diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c index ed8ff425e..dc78719d2 100644 --- a/lib_enc/find_tilt_fx.c +++ b/lib_enc/find_tilt_fx.c @@ -329,7 +329,7 @@ void find_tilt_ivas_fx( { hp_bckr = L_deposit_l( 1 ); } - Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp ); + Ltmp = BASOP_Util_Divide3232_Scale_newton( lp_bckr, hp_bckr, &e_tmp ); Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ ); Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) ); *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16 diff --git a/lib_enc/hq_classifier_enc_fx.c b/lib_enc/hq_classifier_enc_fx.c index 300e31e8e..d82eebfb5 100644 --- a/lib_enc/hq_classifier_enc_fx.c +++ b/lib_enc/hq_classifier_enc_fx.c @@ -143,7 +143,7 @@ static Word16 hf_spectrum_sparseness_fx( Word16 l_shift = W_norm( inv_rms_fx ); inv_rms32_fx = W_extract_h( W_shl( inv_rms_fx, l_shift ) ); // Q15+l_shift-32 Word16 q_rms = sub( add( Q15, l_shift ), 32 ); // q_rms - inv_rms32_div_fx = BASOP_Util_Divide3232_Scale_cadence( inv_rms32_fx, L_SPEC_HB, &inv_rms32_e ); /* Q31-inv_rms32_e */ + inv_rms32_div_fx = BASOP_Util_Divide3232_Scale_newton( inv_rms32_fx, L_SPEC_HB, &inv_rms32_e ); /* Q31-inv_rms32_e */ inv_rms32_e = sub( 31, add( sub( Q31, inv_rms32_e ), q_rms ) ); // inv_rms = 1.0f / (float) sqrtf( inv_rms / L_SPEC_HB ); inv_rms32_fx = ISqrt32( inv_rms32_div_fx, &inv_rms32_e ); /* Q31-inv_rms32_e */ diff --git a/lib_enc/ivas_enc_cov_handler_fx.c b/lib_enc/ivas_enc_cov_handler_fx.c index c05d59b90..138e1467d 100644 --- a/lib_enc/ivas_enc_cov_handler_fx.c +++ b/lib_enc/ivas_enc_cov_handler_fx.c @@ -271,7 +271,7 @@ static Word16 ivas_spar_get_activeW_flag_fx( } ELSE { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( hCovEnc->bb_var_lt_fx[0], side_ch_var, &exp_diff ); // (Q31 - exp_diff) + L_tmp = BASOP_Util_Divide3232_Scale_newton( hCovEnc->bb_var_lt_fx[0], side_ch_var, &exp_diff ); // (Q31 - exp_diff) en_ratio = L_shl_sat( L_tmp, exp_diff ); // Q31 IF( LT_32( en_ratio, Mpy_32_32( IVAS_SPAR_DYN_ACTIVEW_THRESH_FX, IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ) ) ) // LHS Q31 :: RHS Q31 { diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 2b9ffef15..5c5de97ab 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -1477,7 +1477,7 @@ static void combine_freqbands_and_subframes_fx( move16(); hMeta->directional_meta[i].energy_ratio_fx[j][k] = - BASOP_Util_Divide3232_Scale_cadence( vecLen, L_add( energySum, EPSILON_FX ), &exp_diff ); /*exp_diff+vecLen_e-energySum_e*/ + BASOP_Util_Divide3232_Scale_newton( vecLen, L_add( energySum, EPSILON_FX ), &exp_diff ); /*exp_diff+vecLen_e-energySum_e*/ move32(); exp_diff = add( exp_diff, sub( vecLen_e, energySum_e ) ); hMeta->directional_meta[i].energy_ratio_fx[j][k] = @@ -1585,7 +1585,7 @@ static void combine_freqbands_and_subframes_fx( { energyRatioSum = BASOP_Util_Add_Mant32Exp( energyRatioSum, energyRatioSum_e, Mpy_32_32( energy[j][k], hMeta->directional_meta[i].energy_ratio_fx[j][k] ), add( energy_e[j][k], 1 ), &energyRatioSum_e ); // 31-energyRatioSum_e } - energyRatioTemp = BASOP_Util_Divide3232_Scale_cadence( energyRatioSum, L_add( energySum, EPSILON_FX ), &exp_diff ); + energyRatioTemp = BASOP_Util_Divide3232_Scale_newton( energyRatioSum, L_add( energySum, EPSILON_FX ), &exp_diff ); exp_diff = add( exp_diff, sub( energyRatioSum_e, energySum_e ) ); energyRatioTemp = L_shl( energyRatioTemp, sub( exp_diff, 1 ) ); // Q30 @@ -2264,13 +2264,13 @@ static void compensate_energy_ratios_fx( FOR( dir = 0; dir < numDirs; dir++ ) { hMeta->directional_meta[dir].energy_ratio_fx[sf][band] = - BASOP_Util_Divide3232_Scale_cadence( hMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum, &exp_diff ); + BASOP_Util_Divide3232_Scale_newton( hMeta->directional_meta[dir].energy_ratio_fx[sf][band], ratioSum, &exp_diff ); move32(); hMeta->directional_meta[dir].energy_ratio_fx[sf][band] = L_shl( hMeta->directional_meta[dir].energy_ratio_fx[sf][band], sub( exp_diff, Q1 ) ); // Q30 move32(); } hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = - BASOP_Util_Divide3232_Scale_cadence( hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum, &exp_diff ); + BASOP_Util_Divide3232_Scale_newton( hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], ratioSum, &exp_diff ); move32(); hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band] = L_shl( hMeta->common_meta.diffuse_to_total_ratio_fx[sf][band], sub( exp_diff, Q1 ) ); // Q30 move32(); @@ -2406,7 +2406,7 @@ static void reduce_metadata_further_fx( IF( hMasa->data.onset_detector_1_fx != 0 ) { - onset_filter = L_max( BASOP_Util_Divide3232_Scale_cadence( hMasa->data.onset_detector_2_fx, hMasa->data.onset_detector_1_fx, &onset_filter_e ), 0 ); + onset_filter = L_max( BASOP_Util_Divide3232_Scale_newton( hMasa->data.onset_detector_2_fx, hMasa->data.onset_detector_1_fx, &onset_filter_e ), 0 ); IF( BASOP_Util_Cmp_Mant32Exp( onset_filter, onset_filter_e, ONE_IN_Q31, 0 ) > 0 ) { @@ -2433,7 +2433,7 @@ static void reduce_metadata_further_fx( Word32 bandRatio; // threshold = totalEnergySum / ( MAX_PARAM_SPATIAL_SUBFRAMES * LOWBITRATE_NUM_BANDS ) * 0.5f; /* Average energy multiplied with energy ratio of 0.5f */ - threshold = BASOP_Util_Divide3232_Scale_cadence( totalEnergySum, ( MAX_PARAM_SPATIAL_SUBFRAMES * LOWBITRATE_NUM_BANDS ) * 2, &exp ); /* Average energy multiplied with energy ratio of 0.5f */ + threshold = BASOP_Util_Divide3232_Scale_newton( totalEnergySum, ( MAX_PARAM_SPATIAL_SUBFRAMES * LOWBITRATE_NUM_BANDS ) * 2, &exp ); /* Average energy multiplied with energy ratio of 0.5f */ exp = add( exp, sub( sub( 31, add( hMasa->data.q_energy, tmp2 ) ), 31 ) ); bandRatio = hqmetadata->q_direction[0].band_data[band].energy_ratio_fx[0]; // Q30 move32(); @@ -2468,7 +2468,7 @@ static void reduce_metadata_further_fx( } IF( totalEnergySum != 0 ) { - meanRatio = BASOP_Util_Divide3232_Scale_cadence( meanRatio, totalEnergySum, &exp ); + meanRatio = BASOP_Util_Divide3232_Scale_newton( meanRatio, totalEnergySum, &exp ); exp = add( add( exp, 1 ), tmp2 ); // 31 - (hMasa->data.q_energy - 1) - 31 - hMasa->data.q_energy - tmp2 => 1 + tmp2 } ELSE @@ -4730,7 +4730,7 @@ static void ivas_encode_masaism_metadata_fx( FOR( obj = 0; obj < nchan_ism; obj++ ) { - hOmasaData->energy_ratio_ism_fx[sf][0][obj] = BASOP_Util_Divide3232_Scale_cadence( energy_ism_ind[obj], energy_ism, &L_tmp_e ); + hOmasaData->energy_ratio_ism_fx[sf][0][obj] = BASOP_Util_Divide3232_Scale_newton( energy_ism_ind[obj], energy_ism, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( energy_ism_ind_e[obj], energy_ism_e ) ); /* Scaling to Q30 */ @@ -4740,7 +4740,7 @@ static void ivas_encode_masaism_metadata_fx( L_tmp = BASOP_Util_Add_Mant32Exp( eneBand32, eneBand_exp, energy_ism, energy_ism_e, &L_tmp_e ); IF( L_tmp != 0 ) { - hOmasaData->masa_to_total_energy_ratio_fx[sf][0] = BASOP_Util_Divide3232_Scale_cadence( eneBand32, L_tmp, &tmp ); + hOmasaData->masa_to_total_energy_ratio_fx[sf][0] = BASOP_Util_Divide3232_Scale_newton( eneBand32, L_tmp, &tmp ); move32(); tmp = add( tmp, sub( eneBand_exp, L_tmp_e ) ); /* Scaling to Q30 */ @@ -4791,7 +4791,7 @@ static void ivas_encode_masaism_metadata_fx( { FOR( obj = 0; obj < nchan_ism; obj++ ) { - hOmasaData->energy_ratio_ism_fx[0][band][obj] = BASOP_Util_Divide3232_Scale_cadence( energy_ism_ind[obj], energy_ism, &L_tmp_e ); + hOmasaData->energy_ratio_ism_fx[0][band][obj] = BASOP_Util_Divide3232_Scale_newton( energy_ism_ind[obj], energy_ism, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( energy_ism_ind_e[obj], energy_ism_e ) ); /* Scaling to Q30 */ @@ -4819,7 +4819,7 @@ static void ivas_encode_masaism_metadata_fx( L_tmp = BASOP_Util_Add_Mant32Exp( eneBand32, eneBand_exp, energy_ism, energy_ism_e, &L_tmp_e ); IF( L_tmp != 0 ) { - hOmasaData->masa_to_total_energy_ratio_fx[0][band] = BASOP_Util_Divide3232_Scale_cadence( eneBand32, L_tmp, &tmp ); + hOmasaData->masa_to_total_energy_ratio_fx[0][band] = BASOP_Util_Divide3232_Scale_newton( eneBand32, L_tmp, &tmp ); move32(); tmp = add( tmp, sub( eneBand_exp, L_tmp_e ) ); /* Scaling to Q30 */ @@ -4876,7 +4876,7 @@ static void ivas_encode_masaism_metadata_fx( L_tmp = BASOP_Util_Add_Mant32Exp( eneBand32, eneBand_exp, hOmasaData->energy_ism_fx[sf][band], hOmasaData->energy_ism_fx_e[sf][band], &L_tmp_e ); IF( L_tmp != 0 ) { - hOmasaData->masa_to_total_energy_ratio_fx[sf][band] = BASOP_Util_Divide3232_Scale_cadence( eneBand32, L_tmp, &tmp ); + hOmasaData->masa_to_total_energy_ratio_fx[sf][band] = BASOP_Util_Divide3232_Scale_newton( eneBand32, L_tmp, &tmp ); move32(); tmp = add( tmp, sub( eneBand_exp, L_tmp_e ) ); /* Scaling to Q30 */ diff --git a/lib_enc/ivas_mdct_core_enc_fx.c b/lib_enc/ivas_mdct_core_enc_fx.c index e744c7f47..401e1360d 100644 --- a/lib_enc/ivas_mdct_core_enc_fx.c +++ b/lib_enc/ivas_mdct_core_enc_fx.c @@ -233,7 +233,7 @@ static Word16 kernel_switch_detect_fx( L_tmp1 = Sqrt32( L_tmp1, &exp_tmp1 ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, L_tmp1, exp_tmp1, &exp_tmp ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, ONE_IN_Q30, 1, &exp_tmp ); - cov00 = BASOP_Util_Divide3232_Scale_cadence( cov00, L_tmp, &exp_tmp1 ); + cov00 = BASOP_Util_Divide3232_Scale_newton( cov00, L_tmp, &exp_tmp1 ); exp_tmp = add( exp_tmp1, sub( sub( Q31, q_com ), exp_tmp ) ); /* Added saturation to handle overflows when value is very close to 1.f */ cov00 = L_shl_sat( cov00, exp_tmp ); // Q31 @@ -247,7 +247,7 @@ static Word16 kernel_switch_detect_fx( L_tmp1 = Sqrt32( L_tmp1, &exp_tmp1 ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, L_tmp1, exp_tmp1, &exp_tmp ); L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp_tmp, ONE_IN_Q30, 1, &exp_tmp ); - cov90 = BASOP_Util_Divide3232_Scale_cadence( cov90, L_tmp, &exp_tmp1 ); + cov90 = BASOP_Util_Divide3232_Scale_newton( cov90, L_tmp, &exp_tmp1 ); exp_tmp = add( exp_tmp1, sub( sub( Q31, q_com ), exp_tmp ) ); /* Added saturation to handle overflows when value is very close to 1.f */ cov90 = L_shl_sat( cov90, exp_tmp ); // Q31 @@ -735,7 +735,7 @@ static void applyStereoPreProcessingCplx( d_q = sub( 31, d_q ); deno = L_max( L_shl_sat( 1, d_q ), d_fx ); - sq_imp = BASOP_Util_Divide3232_Scale_cadence( n_fx, deno, &exp ); + sq_imp = BASOP_Util_Divide3232_Scale_newton( n_fx, deno, &exp ); exp = add( exp, sub( d_q, n_q ) ); d_fx = Sqrt32( sq_imp, &exp ); *mdctSample1_fx = Mpy_32_32( dmxR1_fx, d_fx ); @@ -764,7 +764,7 @@ static void applyStereoPreProcessingCplx( d_q = sub( 31, d_q ); deno = L_max( L_shl_sat( 1, d_q ), d_fx ); - sq_imp = BASOP_Util_Divide3232_Scale_cadence( n_fx, deno, &exp ); + sq_imp = BASOP_Util_Divide3232_Scale_newton( n_fx, deno, &exp ); exp = add( exp, sub( d_q, n_q ) ); d_fx = Sqrt32( sq_imp, &exp ); *mdctSample2_fx = Mpy_32_32( dmxR2_fx, d_fx ); @@ -956,7 +956,7 @@ static UWord16 enc_ste_pre_mdct( ELSE { Word16 exp1; - corr_fx = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( corr_fx, corr_fx ), Mpy_32_32( sumL_fx, sumR_fx ), &exp1 ); + corr_fx = BASOP_Util_Divide3232_Scale_newton( Mpy_32_32( corr_fx, corr_fx ), Mpy_32_32( sumL_fx, sumR_fx ), &exp1 ); corr_e = add( exp1, sub( shl( corr_e, 1 ), add( sumL_e, sumR_e ) ) ); } test(); diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 10380f422..79a4adee7 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -1332,12 +1332,12 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512_fx( ratioSum = L_add( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] ); IF( GT_32( ratioSum, ONE_IN_Q30 /*1.0f*/ ) ) { - hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[0].band_data[j].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); - hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); @@ -1385,12 +1385,12 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512_fx( IF( GT_32( ratioSum, ONE_IN_Q30 /*1.0f*/ ) ) { - hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[0].band_data[pos_2dir_band[j]].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); - hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_cadence( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); + hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = BASOP_Util_Divide3232_Scale_newton( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], ratioSum, &div_e ); hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k] = L_shl( hQMetaData->q_direction[1].band_data[j].energy_ratio_fx[k], sub( div_e, 1 ) ); move32(); move32(); @@ -6619,7 +6619,7 @@ void ivas_omasa_encode_masa_to_total_fx( { j = imult1616( k, len_stream ); /* quantize with fixed common step */ - L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j], step, &tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( dct_data[j], step, &tmp_e ); tmp_e = add( tmp_e, Q6 ); q_idx[j] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) /* Q16 */ ); // Q0 move16(); @@ -6642,7 +6642,7 @@ void ivas_omasa_encode_masa_to_total_fx( { FOR( i = 1; i < len_stream; i++ ) { - L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j + i], step, &tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( dct_data[j + i], step, &tmp_e ); tmp_e = add( tmp_e, Q6 ); q_idx[j + i] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) ); move16(); diff --git a/lib_enc/ivas_stereo_classifier_fx.c b/lib_enc/ivas_stereo_classifier_fx.c index 3e69a0ca6..3a040517a 100644 --- a/lib_enc/ivas_stereo_classifier_fx.c +++ b/lib_enc/ivas_stereo_classifier_fx.c @@ -890,7 +890,7 @@ void unclr_classifier_td_fx( move16(); /* mean & std removal */ - fvn = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_td[i] ), unclr_scale_td[i], &exp ); + fvn = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_td[i] ), unclr_scale_td[i], &exp ); fvn = Mpy_32_32( fvn, unclr_coef_td[i] ); // Q = 31-exp+15-31 = 15-exp exp = add( exp, 16 ); // exp = 31-(15-exp) = 16+exp @@ -1016,7 +1016,7 @@ void unclr_classifier_dft_fx( /* mean & std removal */ // fvn[i] = (hStereoClassif->unclr_fv[ind] - unclr_mean_dft[i]) / unclr_scale_dft[i]; - fvn[i] = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_dft_Q15[i] ), unclr_scale_dft_Q15[i], &fvn_e[i] ); + fvn[i] = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->unclr_fv_fx[ind], unclr_mean_dft_Q15[i] ), unclr_scale_dft_Q15[i], &fvn_e[i] ); move32(); /* LR */ @@ -1157,7 +1157,7 @@ void xtalk_classifier_td_fx( move16(); /* mean & std removal */ - fvn = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_td[i] ), xtalk_scale_td[i], &exp ); + fvn = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_td[i] ), xtalk_scale_td[i], &exp ); fvn = Mpy_32_32( fvn, xtalk_coef_td[i] ); // Q = 31-exp+15-31 = 15-exp exp = add( exp, 16 ); // exp = 31-(15-exp) = 16+exp @@ -1372,7 +1372,7 @@ void xtalk_classifier_dft_fx( // ratio_m1_m2 = fabsf( m1 * m2 ) / fabsf( m1 + m2 + 1.0f ); Word16 exp; - ratio_m1_m2 = BASOP_Util_Divide3232_Scale_cadence( L_abs( Mpy_32_32( m1, m2 ) ), L_abs( L_add( L_add( L_shr( m1, 2 ), L_shr( m2, 2 ) ), ONE_IN_Q29 ) ), &exp ); + ratio_m1_m2 = BASOP_Util_Divide3232_Scale_newton( L_abs( Mpy_32_32( m1, m2 ) ), L_abs( L_add( L_add( L_shr( m1, 2 ), L_shr( m2, 2 ) ), ONE_IN_Q29 ) ), &exp ); exp = sub( exp, 2 ); // m2_m2 = hItd->prev_m2 * m2; m2_m2 = Mpy_32_32( hItd->prev_m2_fx, m2 ); @@ -1406,7 +1406,7 @@ void xtalk_classifier_dft_fx( /* mean & std removal */ // fvn[i] = ( hStereoClassif->xtalk_fv[ind] - xtalk_mean_dft[i] ) / xtalk_scale_dft[i]; - fvn[i] = BASOP_Util_Divide3232_Scale_cadence( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_dft_q15[i] ), xtalk_scale_dft_q15[i], &exp ); // Q15 + fvn[i] = BASOP_Util_Divide3232_Scale_newton( L_sub( hStereoClassif->xtalk_fv_fx[ind], xtalk_mean_dft_q15[i] ), xtalk_scale_dft_q15[i], &exp ); // Q15 move32(); fvn[i] = L_shl_sat( fvn[i], sub( exp, 2 ) ); // Q29 move32(); @@ -1755,7 +1755,7 @@ static Word32 redge_detect_fx( { // edge_slope = ( inp_max - inp_min ) / i; L_temp = BASOP_Util_Add_Mant32Exp( inp_max, 0, L_negate( inp_min ), 0, &L_temp_e ); - edge_slope = BASOP_Util_Divide3232_Scale_cadence( L_temp, i, &edge_slope_e ); + edge_slope = BASOP_Util_Divide3232_Scale_newton( L_temp, i, &edge_slope_e ); edge_slope_e = add( edge_slope_e, sub( L_temp_e, 31 ) ); edge[i] = err0; move32(); @@ -1788,7 +1788,7 @@ static Word32 redge_detect_fx( } // edge[i] /= i + 1; - edge[i] = BASOP_Util_Divide3232_Scale_cadence( edge[i], add( i, 1 ), &L_temp_e ); + edge[i] = BASOP_Util_Divide3232_Scale_newton( edge[i], add( i, 1 ), &L_temp_e ); move32(); edge_e[i] = add( L_temp_e, sub( edge_e[i], 31 ) ); move16(); diff --git a/lib_enc/ivas_stereo_cng_enc_fx.c b/lib_enc/ivas_stereo_cng_enc_fx.c index aa7c2d0aa..b73a57f46 100644 --- a/lib_enc/ivas_stereo_cng_enc_fx.c +++ b/lib_enc/ivas_stereo_cng_enc_fx.c @@ -101,7 +101,7 @@ void stereo_dft_enc_sid_calc_coh_fx( L_tmp1_e = sub( add( hStereoDft->Spd_L_smooth_fx_e, hStereoDft->Spd_R_smooth_fx_e ), W_tmp_q ); L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( hStereoDft->xspec_smooth_fx[2 * k], hStereoDft->xspec_smooth_fx[2 * k] ), shl( hStereoDft->xspec_smooth_fx_e[2 * k], 1 ), Mpy_32_32( hStereoDft->xspec_smooth_fx[2 * k + 1], hStereoDft->xspec_smooth_fx[2 * k + 1] ), shl( hStereoDft->xspec_smooth_fx_e[2 * k + 1], 1 ), &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - L_tmp3 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp3_e ); + L_tmp3 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp3_e ); L_tmp3_e = add( L_tmp3_e, sub( L_tmp1_e, L_tmp2_e ) ); L_tmp3 = Mpy_32_32( prev_cohBand[b], L_tmp3 ); xspec_scale = Sqrt32( L_tmp3, &L_tmp3_e ); @@ -137,7 +137,7 @@ void stereo_dft_enc_sid_calc_coh_fx( L_tmp2 = W_extract_h( W_shl( W_tmp, W_tmp_q ) ); L_tmp2_e = sub( add( hStereoDft->Spd_L_smooth_fx_e, hStereoDft->Spd_R_smooth_fx_e ), W_tmp_q ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - L_tmp3 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp3_e ); + L_tmp3 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp3_e ); L_tmp3_e = add( L_tmp3_e, sub( L_tmp1_e, L_tmp2_e ) ); L_tmp3 = Mpy_32_32( coh_weight, L_tmp3 ); L_tmp3_e = add( coh_weight_e, L_tmp3_e ); @@ -150,7 +150,7 @@ void stereo_dft_enc_sid_calc_coh_fx( IF( coh_weight_sum > 0 ) { // cohBand[b] = cohBand[b] / coh_weight_sum; - cohBand[b] = BASOP_Util_Divide3232_Scale_cadence( cohBand[b], coh_weight_sum, &L_tmp1_e ); + cohBand[b] = BASOP_Util_Divide3232_Scale_newton( cohBand[b], coh_weight_sum, &L_tmp1_e ); move32(); cohBand_e[b] = add( L_tmp1_e, sub( cohBand_e[b], coh_weight_sum_e ) ); move16(); @@ -510,7 +510,7 @@ void stereo_dft_cng_side_gain_fx( hStereoCng->prev_sg_average_fx[b] = hStereoCng->sg_average_fx[b]; move32(); // hStereoCng->sg_average[b] = hStereoCng->sg_average[b] / (float) hStereoCng->sg_average_counter; - hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_cadence( hStereoCng->sg_average_fx[b], hStereoCng->sg_average_counter, &tmp_e ); + hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_newton( hStereoCng->sg_average_fx[b], hStereoCng->sg_average_counter, &tmp_e ); move32(); tmp_e = sub( tmp_e, 31 - 5 ); hStereoCng->sg_average_fx[b] = L_shl_r( hStereoCng->sg_average_fx[b], sub( tmp_e, 5 ) ); // Q31 @@ -535,7 +535,7 @@ void stereo_dft_cng_side_gain_fx( tmp = hStereoCng->sg_average_fx[b]; move32(); // hStereoCng->sg_average[b] = ( hStereoCng->sg_average[b] + prev_weight * hStereoCng->prev_sg_average[b] ) / ( (float) hStereoCng->sg_average_counter + prev_weight * (float) hStereoCng->prev_sg_average_counter ); - hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_cadence( L_add( hStereoCng->sg_average_fx[b], Mpy_32_16_1( hStereoCng->prev_sg_average_fx[b], prev_weight ) ), L_add( L_shl( hStereoCng->sg_average_counter, Q15 ), L_mult0( prev_weight, hStereoCng->prev_sg_average_counter ) ), &tmp_e ); + hStereoCng->sg_average_fx[b] = BASOP_Util_Divide3232_Scale_newton( L_add( hStereoCng->sg_average_fx[b], Mpy_32_16_1( hStereoCng->prev_sg_average_fx[b], prev_weight ) ), L_add( L_shl( hStereoCng->sg_average_counter, Q15 ), L_mult0( prev_weight, hStereoCng->prev_sg_average_counter ) ), &tmp_e ); move32(); tmp_e = sub( tmp_e, 16 - 5 ); hStereoCng->sg_average_fx[b] = L_shl_r( hStereoCng->sg_average_fx[b], sub( tmp_e, 5 ) ); // Q26 @@ -571,7 +571,7 @@ void stereo_dft_cng_side_gain_fx( W_tmp_q = W_norm( W_tmp ); hStereoDft->sidSideGain_fx[b] = W_extract_h( W_shl( W_tmp, W_tmp_q ) ); move32(); - hStereoDft->sidSideGain_fx[b] = BASOP_Util_Divide3232_Scale_cadence( hStereoDft->sidSideGain_fx[b], sgSum, &tmp_e ); + hStereoDft->sidSideGain_fx[b] = BASOP_Util_Divide3232_Scale_newton( hStereoDft->sidSideGain_fx[b], sgSum, &tmp_e ); move32(); tmp_e = sub( tmp_e, W_tmp_q ); hStereoDft->sidSideGain_fx[b] = L_shl_sat( hStereoDft->sidSideGain_fx[b], tmp_e ); // Q31: saturation is fine since stereo_dft_quantize_res_gains_fx limits value to 1.0 diff --git a/lib_enc/ivas_stereo_dft_enc_fx.c b/lib_enc/ivas_stereo_dft_enc_fx.c index 01318af28..6406158b4 100644 --- a/lib_enc/ivas_stereo_dft_enc_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_fx.c @@ -880,7 +880,7 @@ void stereo_dft_enc_update_fx( // hStereoDft->res_cod_line_max = (int16_t) ( 0.5f + ( hStereoDft->band_limits[hStereoDft->res_cod_band_max] - 1 ) * 2.f * hStereoDft->N / (float) ( hStereoDft->NFFT ) ); Word32 tmp = L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), hStereoDft->N ), 1 ); Word16 exp; - tmp = BASOP_Util_Divide3232_Scale_cadence( tmp, hStereoDft->NFFT, &exp ); + tmp = BASOP_Util_Divide3232_Scale_newton( tmp, hStereoDft->NFFT, &exp ); hStereoDft->res_cod_line_max = extract_l( L_shr( tmp, sub( 31, exp ) ) ); move16(); // hStereoDft->res_cod_line_max = 8 * (hStereoDft->res_cod_line_max / 8); @@ -1226,7 +1226,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_12k8_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_12k8; move16(); @@ -1250,7 +1250,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_16k_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_16k; move16(); @@ -1283,7 +1283,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_32k_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_32k; move16(); @@ -1307,7 +1307,7 @@ Word32 stereo_dft_enc_synthesize_fx( zp = STEREO_DFT_ZP_8k_ENC; move16(); // fac = (float) ( NFFT ) / (float) ( hStereoDft->NFFT ); - fac_fx = BASOP_Util_Divide3232_Scale_cadence( NFFT, hStereoDft->NFFT, &temp_exp ); + fac_fx = BASOP_Util_Divide3232_Scale_newton( NFFT, hStereoDft->NFFT, &temp_exp ); fac_fx = L_shl( fac_fx, temp_exp ); ovl = STEREO_DFT_OVL_8k; move16(); @@ -1511,7 +1511,7 @@ Word32 stereo_dft_enc_synthesize_fx( move32(); // output[offset + N + i] = ( tmp[zp + N + i] - ifft_deviation ) / win_ana[ovl - 1 - i] + ifft_deviation; Word16 L_temp_e; - Word32 L_temp = BASOP_Util_Divide3232_Scale_cadence( L_sub_sat( tmp_fx[zp + N + i], ifft_deviation ), L_deposit_h( win_ana_fx[ovl - 1 - i] ), &L_temp_e ); + Word32 L_temp = BASOP_Util_Divide3232_Scale_newton( L_sub_sat( tmp_fx[zp + N + i], ifft_deviation ), L_deposit_h( win_ana_fx[ovl - 1 - i] ), &L_temp_e ); L_temp = L_shl_sat( L_temp, L_temp_e ); output_fx[offset + N + i] = L_add_sat( L_temp, ifft_deviation ); // Q15 move32(); @@ -1733,7 +1733,7 @@ void stereo_dft_enc_process_fx( } // if ( fabsf( hStereoDft->hItd->deltaItd[k_offset] * 32000.f / input_Fs ) > 80.0f ) - tmp_32fx = L_abs( BASOP_Util_Divide3232_Scale_cadence( hStereoDft->hItd->deltaItd_fx[k_offset], input_Fs, &tmp_e ) ); + tmp_32fx = L_abs( BASOP_Util_Divide3232_Scale_newton( hStereoDft->hItd->deltaItd_fx[k_offset], input_Fs, &tmp_e ) ); tmp_e = add( tmp_e, 15 - 31 ); IF( BASOP_Util_Cmp_Mant32Exp( tmp_32fx, tmp_e, 5368709 /* 80.0f / 32000.f in Q31 */, 0 ) > 0 ) { @@ -2026,13 +2026,13 @@ void stereo_dft_enc_process_fx( // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs; L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - wR = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &wR_e ); + wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e ); wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) ); // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) ); L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31 @@ -2111,13 +2111,13 @@ void stereo_dft_enc_process_fx( // wR = sqrtf( 0.5f * ( comb_nrgL + comb_nrgR ) + frac_dot_prod ) / sum_abs; L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( L_tmp1_e, 1 ), frac_dot_prod, frac_dot_prod_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - wR = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &wR_e ); + wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e ); wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) ); // wL = wR + sqrtf( 2.f ) * ( 1.f - ( sqrtf( Sr + Si ) / sum_abs ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Sr, Sr_e, Si, Si_e, &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) ); L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31 @@ -2191,7 +2191,7 @@ void stereo_dft_enc_process_fx( // wR = sqrtf( 0.5f * ( sum_nrg_L2 + sum_nrg_R2 ) + dot_prod_nrg_ratio[b] ) / sum_abs; L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp3, sub( L_tmp3_e, 1 ), dot_prod_nrg_ratio_fx[b], dot_prod_nrg_ratio_fx_e[b], &L_tmp1_e ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - wR = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &wR_e ); + wR = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &wR_e ); wR_e = add( wR_e, sub( L_tmp1_e, sum_abs_e ) ); // wL = wR + sqrtf( 2.f ) * ( 1.f - sqrtf( sum_nrg_Mid ) / sum_abs ); @@ -2200,7 +2200,7 @@ void stereo_dft_enc_process_fx( L_tmp1_e = sum_nrg_Mid_e; move16(); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_abs, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_abs, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( L_tmp1_e, sum_abs_e ) ); L_tmp2 = L_shl_sat( L_tmp2, L_tmp2_e ); // Q31 saturation expected L_tmp1 = L_sub( MAX_32, L_tmp2 ); // Q31 @@ -2478,7 +2478,7 @@ static void stereo_dft_enc_get_res_cod_mode_flag_fx( L_tmp1 = L_sub( MAX_32, g ); // Q31 L_tmp2 = BASOP_Util_Add_Mant32Exp( hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], Mpy_32_32( Mpy_32_32( L_tmp1, L_tmp1 ), hStereoDft->res_cod_NRG_M_fx[b] ), hStereoDft->res_cod_NRG_M_fx_e[b], &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e ); - L_tmp1 = BASOP_Util_Divide3232_Scale_cadence( hStereoDft->res_cod_NRG_S_fx[b], L_tmp2, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Divide3232_Scale_newton( hStereoDft->res_cod_NRG_S_fx[b], L_tmp2, &L_tmp1_e ); L_tmp1_e = add( L_tmp1_e, sub( hStereoDft->res_cod_NRG_S_fx_e[b], L_tmp2_e ) ); L_tmp1 = L_shl( L_tmp1, L_tmp1_e ); // Q31 *res_dmx_ratio = L_max( L_tmp1, *res_dmx_ratio ); @@ -2494,7 +2494,7 @@ static void stereo_dft_enc_get_res_cod_mode_flag_fx( /*Calculate the energy ratio of the inter-frame */ //*frame_nrg_ratio = dmx_res_all / hStereoDft->dmx_res_all_prev; - *frame_nrg_ratio = BASOP_Util_Divide3232_Scale_cadence( dmx_res_all, hStereoDft->dmx_res_all_prev_fx, &L_tmp1_e ); + *frame_nrg_ratio = BASOP_Util_Divide3232_Scale_newton( dmx_res_all, hStereoDft->dmx_res_all_prev_fx, &L_tmp1_e ); move32(); L_tmp1_e = add( L_tmp1_e, sub( dmx_res_all_e, hStereoDft->dmx_res_all_prev_fx_e ) ); *frame_nrg_ratio = L_shr_r_sat( *frame_nrg_ratio, sub( 3, L_tmp1_e ) ); // Q28 @@ -2741,7 +2741,7 @@ void stereo_dft_enc_res_fx( L_tmp2_e = hStereoDft->res_cod_NRG_M_fx_e[b]; L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDft->res_cod_NRG_S_fx[b], hStereoDft->res_cod_NRG_S_fx_e[b], &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, MAX_32, 0, &L_tmp2_e ); - in_phase_ratio = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &in_phase_ratio_e ); + in_phase_ratio = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &in_phase_ratio_e ); in_phase_ratio_e = add( in_phase_ratio_e, sub( hStereoDft->res_cod_NRG_M_fx_e[b], L_tmp2_e ) ); in_phase_ratio = L_shl_sat( in_phase_ratio, in_phase_ratio_e ); // Q31 : bound from 0.0 to 1.0 in_phase_ratio = L_max( 0, in_phase_ratio ); @@ -3512,7 +3512,7 @@ static void stereo_dft_enc_compute_prm_fx( W_shift = W_norm( W_tmp ); L_tmp2 = W_extract_h( W_shl( W_tmp, W_shift ) ); L_tmp2_e = sub( add( sub_nrg_DMX2_e, 31 ), W_shift ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); L_tmp = L_shl( L_tmp, L_tmp_e ); // Q31hStereoDft->gainIPD_sm_fx = L_add( L_shr( hStereoDft->gainIPD_sm_fx, 1 ), L_ gain_IPD = L_add_sat( gain_IPD, L_tmp ); // Q31: saturation expected @@ -3597,7 +3597,7 @@ static void stereo_dft_enc_compute_prm_fx( // dot_prod_nrg_ratio[b2] = sum_past_dot_prod_abs2 / ( sum_past_nrgL2 + sum_past_nrgR2 + EPSILON ); L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL2, sum_past_nrgL2_e, sum_past_nrgR2, sum_past_nrgR2_e, &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_cadence( sum_past_dot_prod_abs2, L_tmp2, &L_tmp_e ); + dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( sum_past_dot_prod_abs2, L_tmp2, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( sum_past_dot_prod_abs2_e, L_tmp2_e ) ); dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31 @@ -3624,7 +3624,7 @@ static void stereo_dft_enc_compute_prm_fx( // dot_prod_nrg_ratio[b2] /= ( sum_nrg_L2 + sum_nrg_R2 + EPSILON ); L_tmp2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L2, sum_nrg_L2_e, sum_nrg_R2, sum_nrg_R2_e, &L_tmp2_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( L_tmp2, L_tmp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_cadence( dot_prod_nrg_ratio_fx[b2], L_tmp2, &L_tmp_e ); + dot_prod_nrg_ratio_fx[b2] = BASOP_Util_Divide3232_Scale_newton( dot_prod_nrg_ratio_fx[b2], L_tmp2, &L_tmp_e ); move32(); L_tmp_e = add( L_tmp_e, sub( dot_prod_nrg_ratio_fx_e[b2], L_tmp2_e ) ); dot_prod_nrg_ratio_fx[b2] = L_shl( dot_prod_nrg_ratio_fx[b2], L_tmp_e ); // Q31 @@ -3691,7 +3691,7 @@ static void stereo_dft_enc_compute_prm_fx( } // c = sqrtf( sum_past_nrgL / sum_past_nrgR ); - c = BASOP_Util_Divide3232_Scale_cadence( sum_past_nrgL, sum_past_nrgR, &c_e ); + c = BASOP_Util_Divide3232_Scale_newton( sum_past_nrgL, sum_past_nrgR, &c_e ); c_e = add( c_e, sub( sum_past_nrgL_e, sum_past_nrgR_e ) ); c = Sqrt32( c, &c_e ); // sum_past_nrg_dmx = sum_past_nrgL + sum_past_nrgR + 2 * sum_past_dot_prod_abs; @@ -3718,7 +3718,7 @@ static void stereo_dft_enc_compute_prm_fx( { // g = ( sum_past_nrgL - sum_past_nrgR ) / ( sum_past_nrg_dmx ); L_tmp1 = BASOP_Util_Add_Mant32Exp( sum_past_nrgL, sum_past_nrgL_e, L_negate( sum_past_nrgR ), sum_past_nrgR_e, &L_tmp1_e ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, sum_past_nrg_dmx, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, sum_past_nrg_dmx, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, sum_past_nrg_dmx_e ) ); g = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected pSideGain[b] = g; @@ -3731,7 +3731,7 @@ static void stereo_dft_enc_compute_prm_fx( // pSideGain[b] = ( c - 1 ) / ( c + 1 ); L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); pSideGain[b] = L_shl_sat( L_tmp, L_tmp_e ); // Q31 saturation expected move32(); @@ -3774,7 +3774,7 @@ static void stereo_dft_enc_compute_prm_fx( // pPredGain[b] = sqrtf( pPredGain[b] / ( reg + sum_past_nrg_dmx ) ); L_tmp2 = BASOP_Util_Add_Mant32Exp( reg, reg_e, sum_past_nrg_dmx, sum_past_nrg_dmx_e, &L_tmp2_e ); - L_tmp1 = BASOP_Util_Divide3232_Scale_cadence( L_tmp, L_tmp2, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp2, &L_tmp1_e ); L_tmp1_e = add( L_tmp1_e, sub( L_tmp_e, L_tmp2_e ) ); L_tmp1 = Sqrt32( L_tmp1, &L_tmp1_e ); pPredGain[b] = L_shl( L_tmp1, L_tmp1_e ); // Q31 @@ -3913,14 +3913,14 @@ static void stereo_dft_enc_compute_prm_fx( } // c = sqrtf( sum_energy_L / sum_energy_R ); - c = BASOP_Util_Divide3232_Scale_cadence( sum_energy_L, sum_energy_R, &c_e ); + c = BASOP_Util_Divide3232_Scale_newton( sum_energy_L, sum_energy_R, &c_e ); c_e = add( c_e, sub( sum_energy_L_e, sum_energy_R_e ) ); c = Sqrt32( c, &c_e ); // g = fabsf( ( c - 1 ) / ( c + 1 ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( c, c_e, MIN_32, 0, &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( c, c_e, MAX_32, 0, &L_tmp2_e ); - g = L_abs( BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ) ); + g = L_abs( BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ) ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); g = L_shl_sat( g, L_tmp_e ); // Q31 saturation expected IF( GT_32( g, 1717986918 /*0.8f in Q31*/ ) ) @@ -4326,7 +4326,7 @@ static Word32 stereo_dft_calc_mean_ipd_change_fx( ipd_mean_change = L_add( ipd_mean_change, ipd_change[b] ); } // ipd_mean_change /= gipd_band_max; - ipd_mean_change = BASOP_Util_Divide3232_Scale_cadence( ipd_mean_change, gipd_band_max, &ipd_mean_change_e ); + ipd_mean_change = BASOP_Util_Divide3232_Scale_newton( ipd_mean_change, gipd_band_max, &ipd_mean_change_e ); ipd_mean_change_e = add( ipd_mean_change_e, 18 - 31 ); ipd_mean_change = L_shr( ipd_mean_change, sub( 18, ipd_mean_change_e ) ); // Q13 @@ -4510,13 +4510,13 @@ static void stereo_dft_enc_get_reverb_flag_fx( FOR( b = 0; b <= s_min( hStereoDft->nbands, 6 ); b++ ) /* choose the subbands used for stereo filling */ { // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]); - norm_dmx = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); + norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) ); // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]); - norm_l = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); + norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) ); // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]); - norm_r = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); + norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) ); FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */ @@ -4562,13 +4562,13 @@ static void stereo_dft_enc_get_reverb_flag_fx( FOR( ; b < s_min( hStereoDft->nbands, 10 ); b++ ) /* choose the subbands used for stereo filling */ { // norm_dmx = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_DMX[b]); - norm_dmx = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); + norm_dmx = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_DMX[b], &norm_dmx_e ); norm_dmx_e = add( norm_dmx_e, sub( 31, sub_nrg_DMX_e[b] ) ); // norm_l = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_L[b]); - norm_l = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); + norm_l = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_L[b], &norm_l_e ); norm_l_e = add( norm_l_e, sub( 31, sub_nrg_L_e[b] ) ); // norm_r = ((hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]) / sub_nrg_R[b]); - norm_r = BASOP_Util_Divide3232_Scale_cadence( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); + norm_r = BASOP_Util_Divide3232_Scale_newton( sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), sub_nrg_R[b], &norm_r_e ); norm_r_e = add( norm_r_e, sub( 31, sub_nrg_R_e[b] ) ); FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) /* normalization on each subbands */ @@ -4614,7 +4614,7 @@ static void stereo_dft_enc_get_reverb_flag_fx( FOR( b = 0; b < hStereoDft->nbands; b++ ) /* choose the subbands used for stereo filling */ { // sub_nrg_DMX[b] /= (hStereoDft->band_limits[b + 1] - hStereoDft->band_limits[b]); - sub_nrg_DMX[b] = BASOP_Util_Divide3232_Scale_cadence( sub_nrg_DMX[b], sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), &L_tmp_e ); + sub_nrg_DMX[b] = BASOP_Util_Divide3232_Scale_newton( sub_nrg_DMX[b], sub( hStereoDft->band_limits[b + 1], hStereoDft->band_limits[b] ), &L_tmp_e ); move32(); sub_nrg_DMX_e[b] = add( L_tmp_e, sub( sub_nrg_DMX_e[b], 31 ) ); move16(); @@ -4735,12 +4735,12 @@ static void stereo_dft_enc_get_reverb_flag_fx( // fac = ((diff_l_l > diff_r_l) ? diff_r_l / diff_l_l : diff_l_l / diff_r_l); IF( BASOP_Util_Cmp_Mant32Exp( diff_l_l, diff_l_l_e, diff_r_l, diff_r_l_e ) > 0 ) { - fac = BASOP_Util_Divide3232_Scale_cadence( diff_r_l, diff_l_l, &L_tmp_e ); + fac = BASOP_Util_Divide3232_Scale_newton( diff_r_l, diff_l_l, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( diff_r_l_e, diff_l_l_e ) ); } ELSE { - fac = BASOP_Util_Divide3232_Scale_cadence( diff_l_l, diff_r_l, &L_tmp_e ); + fac = BASOP_Util_Divide3232_Scale_newton( diff_l_l, diff_r_l, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( diff_l_l_e, diff_r_l_e ) ); } fac = L_shl_sat( fac, L_tmp_e ); // Q31 @@ -4792,7 +4792,7 @@ static Word32 stereo_dft_gain_offset_fx( * function @ 32kHz from which the values are interpolated: */ k0 = shr( tau, 3 ); // alpha = s_and(tau, 7) / 8.f; - alpha = BASOP_Util_Divide3232_Scale_cadence( s_and( tau, 7 ), 8, &alpha_e ); + alpha = BASOP_Util_Divide3232_Scale_newton( s_and( tau, 7 ), 8, &alpha_e ); alpha = L_shl( alpha, alpha_e ); // Q31 // wnt = (1 - alpha) * Wn_table[k0] + alpha * Wn_table[k0 + 1]; wnt = L_add( Mpy_32_32( L_sub( MAX_32, alpha ), Wn_table_fx[k0] ), Mpy_32_32( alpha, Wn_table_fx[k0 + 1] ) ); // Q31 @@ -4803,12 +4803,12 @@ static Word32 stereo_dft_gain_offset_fx( L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, c, c_e, &L_tmp1_e ); L_tmp1 = Mpy_32_32( L_tmp1, L_tmp1 ); L_tmp1_e = shl( L_tmp1_e, 1 ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( L_tmp, L_tmp1, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( L_tmp, L_tmp1, &L_tmp2_e ); L_tmp2_e = add( add( L_tmp2_e, sub( L_tmp_e, L_tmp1_e ) ), 3 /*multiply by 8*/ ); L_tmp2 = Mpy_32_32( L_tmp2, L_sub( MAX_32, wnt ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( MAX_32, 0, L_tmp, L_tmp_e, &L_tmp1_e ); L_tmp1 = BASOP_Util_Add_Mant32Exp( L_tmp1, L_tmp1_e, Mpy_32_32( c, wnt ), add( c_e, 1 ), &L_tmp1_e ); - L_tmp = BASOP_Util_Divide3232_Scale_cadence( L_tmp2, L_tmp1, &L_tmp_e ); + L_tmp = BASOP_Util_Divide3232_Scale_newton( L_tmp2, L_tmp1, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp2_e, L_tmp1_e ) ); L_tmp = Sqrt32( L_tmp, &L_tmp_e ); go = L_shl( L_tmp, L_tmp_e ); @@ -4838,7 +4838,7 @@ static void stereo_dft_enc_calculate_nrg_for_icbwe_fx( Word32 tmp; // bandResDft = ( (float) input_Fs ) / hStereoDft->NFFT; - bandResDft = BASOP_Util_Divide3232_Scale_cadence( input_Fs, hStereoDft->NFFT, &bandResDft_e ); + bandResDft = BASOP_Util_Divide3232_Scale_newton( input_Fs, hStereoDft->NFFT, &bandResDft_e ); // shbBins[0] = (int16_t) ( 6400 / bandResDft ); shbBins[0] = BASOP_Util_Divide3232_Scale( 6400, bandResDft, &tmp_e ); move16(); diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c index b7429e2e7..1beacd19a 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c @@ -232,7 +232,7 @@ static Word32 itd_vad_ms_snr_calc_fx( move32(); } // E_band[i] = E_band[i] / ( itd_vad_band_tbl[i + 1] - itd_vad_band_tbl[i] ); - E_band[i] = BASOP_Util_Divide3232_Scale_cadence( E_band[i], L_sub( itd_vad_band_tbl[i + 1], itd_vad_band_tbl[i] ), &exp ); + E_band[i] = BASOP_Util_Divide3232_Scale_newton( E_band[i], L_sub( itd_vad_band_tbl[i + 1], itd_vad_band_tbl[i] ), &exp ); move32(); E_band_e[i] = add( exp, sub( E_band_e[i], 31 ) ); move16(); @@ -245,7 +245,7 @@ static Word32 itd_vad_ms_snr_calc_fx( FOR( i = 0; i < STEREO_DFT_ITD_VAD_BAND_NUM; i++ ) { // snr[i] = E_band[i] / E_band_n[i]; - snr[i] = BASOP_Util_Divide3232_Scale_cadence( E_band[i], E_band_n[i], &snr_e[i] ); + snr[i] = BASOP_Util_Divide3232_Scale_newton( E_band[i], E_band_n[i], &snr_e[i] ); move32(); snr_e[i] = add( snr_e[i], sub( E_band_e[i], E_band_n_exp[i] ) ); move16(); @@ -327,7 +327,7 @@ static void itd_vad_background_update_fx( L_temp = L_shl( *vad_frm_cnt, q_temp ); L_temp_e = sub( 31, q_temp ); L_temp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( E_band_n[i], L_temp ), add( E_band_n_exp[i], L_temp_e ), E_band[i], E_band_e[i], &L_temp_e ); - E_band_n[i] = BASOP_Util_Divide3232_Scale_cadence( L_temp, L_add( *vad_frm_cnt, 1 ), &E_band_n_e_tmp ); + E_band_n[i] = BASOP_Util_Divide3232_Scale_newton( L_temp, L_add( *vad_frm_cnt, 1 ), &E_band_n_e_tmp ); move32(); E_band_n_exp[i] = add( E_band_n_e_tmp, sub( L_temp_e, 31 ) ); move16(); @@ -536,7 +536,7 @@ static Word32 calc_mean_E_ratio_fx( L_temp1 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, fi[b], fi_e[b], &L_temp1_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, L_negate( fi[b] ), fi_e[b], &L_temp2_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_temp2_e ); - Er[b] = BASOP_Util_Divide3232_Scale_cadence( L_temp1, L_temp2, &Er_e[b] ); + Er[b] = BASOP_Util_Divide3232_Scale_newton( L_temp1, L_temp2, &Er_e[b] ); move32(); Er_e[b] = add( Er_e[b], sub( L_temp1_e, L_temp2_e ) ); move16(); @@ -585,7 +585,7 @@ static Word32 calc_mean_E_ratio_fx( L_temp1 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, total_fi, total_fi_e, &L_temp1_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( acorr, acorr_e, L_negate( total_fi ), total_fi_e, &L_temp2_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, EPSILON_FX_M, EPSILON_FX_E, &L_temp2_e ); - *total_mEr = BASOP_Util_Divide3232_Scale_cadence( L_temp1, L_temp2, total_mEr_e ); + *total_mEr = BASOP_Util_Divide3232_Scale_newton( L_temp1, L_temp2, total_mEr_e ); move32(); *total_mEr_e = add( *total_mEr_e, sub( L_temp1_e, L_temp2_e ) ); move16(); @@ -1302,14 +1302,14 @@ void stereo_dft_enc_compute_itd_fx( // g_ILD = sqrtf( sum_nrg_L / ( sum_nrg_R + 1.0f ) ); L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_R, sum_nrg_R_e, MAX_32, 0, &L_temp_e ); - g_ILD = BASOP_Util_Divide3232_Scale_cadence( sum_nrg_L, L_temp, &g_ILD_e ); + g_ILD = BASOP_Util_Divide3232_Scale_newton( sum_nrg_L, L_temp, &g_ILD_e ); g_ILD_e = add( g_ILD_e, sub( sum_nrg_L_e, L_temp_e ) ); g_ILD = Sqrt32( g_ILD, &g_ILD_e ); // g_ILD = fabsf( ( g_ILD - 1 ) / ( g_ILD + 1 ) ); L_temp = BASOP_Util_Add_Mant32Exp( g_ILD, g_ILD_e, MIN_32, 0, &L_temp_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( g_ILD, g_ILD_e, MAX_32, 0, &L_temp2_e ); - g_ILD = L_abs( BASOP_Util_Divide3232_Scale_cadence( L_temp, L_temp2, &g_ILD_e ) ); + g_ILD = L_abs( BASOP_Util_Divide3232_Scale_newton( L_temp, L_temp2, &g_ILD_e ) ); g_ILD_e = add( g_ILD_e, sub( L_temp_e, L_temp2_e ) ); g_ILD = L_shl_sat( g_ILD, g_ILD_e ); // Q31 @@ -1339,7 +1339,7 @@ void stereo_dft_enc_compute_itd_fx( // g_IPD = ( sum_nrg_L + sum_nrg_R + 2 * grand_dot_prod_real ) / grand_nrg_DMX; L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &L_temp_e ); L_temp = BASOP_Util_Add_Mant32Exp( L_temp, L_temp_e, grand_dot_prod_real, add( grand_dot_prod_real_e, 1 ), &L_temp_e ); - g_IPD = BASOP_Util_Divide3232_Scale_cadence( L_temp, grand_nrg_DMX, &g_IPD_e ); + g_IPD = BASOP_Util_Divide3232_Scale_newton( L_temp, grand_nrg_DMX, &g_IPD_e ); g_IPD_e = add( g_IPD_e, sub( L_temp_e, grand_nrg_DMX_e ) ); // if ( g_IPD >= 1.0f ) IF( BASOP_Util_Cmp_Mant32Exp( g_IPD, g_IPD_e, ONE_IN_Q29 - ONE_IN_Q14 /*Adjusting threshold for precision loss*/, 2 ) >= 0 ) @@ -1366,7 +1366,7 @@ void stereo_dft_enc_compute_itd_fx( // angle_rot = fabsf( atanf( 2.0f * ( grand_dot_prod_real ) / ( sum_nrg_L - sum_nrg_R + 1.0f ) ) ); L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, L_negate( sum_nrg_R ), sum_nrg_R_e, &L_temp_e ); L_temp = BASOP_Util_Add_Mant32Exp( L_temp, L_temp_e, MAX_32, 0, &L_temp_e ); - L_temp2 = BASOP_Util_Divide3232_Scale_cadence( grand_dot_prod_real, L_temp, &L_temp2_e ); + L_temp2 = BASOP_Util_Divide3232_Scale_newton( grand_dot_prod_real, L_temp, &L_temp2_e ); L_temp2_e = add( L_temp2_e, sub( add( grand_dot_prod_real_e, 1 ), L_temp_e ) ); angle_rot = L_abs( BASOP_util_atan( L_shr_r_sat( L_temp2, ( sub( 6, L_temp2_e ) ) ) ) ); // Q14 // angle_rot = L_abs( BASOP_util_atan2( grand_dot_prod_real, L_temp, sub( add( grand_dot_prod_real_e, 1 ), L_temp_e ) ) ); // Q13 @@ -1378,7 +1378,7 @@ void stereo_dft_enc_compute_itd_fx( // g_side = fabsf( sum_nrg_L - sum_nrg_R ) / ( grand_nrg_DMX ); L_temp = L_abs( BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, L_negate( sum_nrg_R ), sum_nrg_R_e, &L_temp_e ) ); - g_side = BASOP_Util_Divide3232_Scale_cadence( L_temp, grand_nrg_DMX, &g_side_e ); + g_side = BASOP_Util_Divide3232_Scale_newton( L_temp, grand_nrg_DMX, &g_side_e ); g_side_e = add( g_side_e, sub( L_temp_e, grand_nrg_DMX_e ) ); g_side = L_shl_sat( g_side, g_side_e ); // Q31 g_side_e = 0; @@ -1443,7 +1443,7 @@ void stereo_dft_enc_compute_itd_fx( ELSE { // sfm_L = expf( log_prod_L / ( NFFT_mid ) ) / ( sum_abs_L / ( NFFT_mid ) ); - L_temp = BASOP_Util_Divide3232_Scale_cadence( log_prod_L, NFFT_mid, &L_temp_e ); + L_temp = BASOP_Util_Divide3232_Scale_newton( log_prod_L, NFFT_mid, &L_temp_e ); L_temp_e = add( L_temp_e, sub( log_prod_L_e, 31 ) ); L_temp = BASOP_Util_fPow( 1459366444 /*2.718 in Q29*/, 2, L_temp, L_temp_e, &L_temp_e ); q_temp = norm_l( NFFT_mid ); @@ -1451,7 +1451,7 @@ void stereo_dft_enc_compute_itd_fx( L_temp2_e = sub( 31, q_temp ); L_temp = Mpy_32_32( L_temp, L_temp2 ); L_temp_e = add( L_temp_e, L_temp2_e ); - sfm_L = BASOP_Util_Divide3232_Scale_cadence( L_temp, sum_abs_L, &sfm_L_e ); + sfm_L = BASOP_Util_Divide3232_Scale_newton( L_temp, sum_abs_L, &sfm_L_e ); sfm_L_e = add( sfm_L_e, sub( L_temp_e, sum_abs_L_e ) ); sfm_L = L_shl_sat( sfm_L, sfm_L_e ); // Q31 - should be rechecked for -10dB tests } @@ -1467,7 +1467,7 @@ void stereo_dft_enc_compute_itd_fx( ELSE { // sfm_R = expf( log_prod_R / ( NFFT_mid ) ) / ( sum_abs_R / ( NFFT_mid ) ); - L_temp = BASOP_Util_Divide3232_Scale_cadence( log_prod_R, NFFT_mid, &L_temp_e ); + L_temp = BASOP_Util_Divide3232_Scale_newton( log_prod_R, NFFT_mid, &L_temp_e ); L_temp_e = add( L_temp_e, sub( log_prod_R_e, 31 ) ); L_temp = BASOP_Util_fPow( 1459366444 /*2.718 in Q29*/, 2, L_temp, L_temp_e, &L_temp_e ); q_temp = norm_l( NFFT_mid ); @@ -1475,7 +1475,7 @@ void stereo_dft_enc_compute_itd_fx( L_temp2_e = sub( 31, q_temp ); L_temp = Mpy_32_32( L_temp, L_temp2 ); L_temp_e = add( L_temp_e, L_temp2_e ); - sfm_R = BASOP_Util_Divide3232_Scale_cadence( L_temp, sum_abs_R, &sfm_L_e ); + sfm_R = BASOP_Util_Divide3232_Scale_newton( L_temp, sum_abs_R, &sfm_L_e ); sfm_R_e = add( sfm_L_e, sub( L_temp_e, sum_abs_R_e ) ); // sfm_R = L_shl_r( sfm_R, sfm_R_e ); // Q31 sfm_R = L_shl_sat( sfm_R, sfm_R_e ); // Q31 @@ -1663,7 +1663,7 @@ void stereo_dft_enc_compute_itd_fx( } // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); - cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); + cng_xcorr_filt = BASOP_Util_Divide3232_Scale_newton( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 @@ -1724,7 +1724,7 @@ void stereo_dft_enc_compute_itd_fx( // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) != 0 ) { - cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); + cng_xcorr_filt = BASOP_Util_Divide3232_Scale_newton( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 } @@ -1917,7 +1917,7 @@ void stereo_dft_enc_compute_itd_fx( } // tmpf1 = (float) ( NFFT / 2 + 1 ) / tmpf3; - tmpf1 = BASOP_Util_Divide3232_Scale_cadence( add( shr( NFFT, 1 ), 1 ), tmpf3, &tmpf1_e ); + tmpf1 = BASOP_Util_Divide3232_Scale_newton( add( shr( NFFT, 1 ), 1 ), tmpf3, &tmpf1_e ); tmpf1_e = add( tmpf1_e, sub( 31, tmpf3_e ) ); FOR( i = 0; i < NFFT; i++ ) { @@ -1995,7 +1995,7 @@ void stereo_dft_enc_compute_itd_fx( L_temp = L_abs( BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, L_negate( sum_nrg_R ), sum_nrg_R_e, &L_temp_e ) ); L_temp2 = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &L_temp2_e ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, 1407374883, -16, &L_temp2_e ); - es_em = BASOP_Util_Divide3232_Scale_cadence( L_temp, L_temp2, &es_em_e ); + es_em = BASOP_Util_Divide3232_Scale_newton( L_temp, L_temp2, &es_em_e ); es_em_e = add( es_em_e, sub( L_temp_e, L_temp2_e ) ); hStereoClassif->unclr_fv_fx[E_es_em] = L_shr_r( es_em, sub( 16, es_em_e ) ); // Q15 @@ -2027,7 +2027,7 @@ void stereo_dft_enc_compute_itd_fx( move16(); } L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, 1407374883, -16, &L_temp2_e ); - d_prodL_prodR = BASOP_Util_Divide3232_Scale_cadence( L_temp, L_temp2, &d_prodL_prodR_e ); + d_prodL_prodR = BASOP_Util_Divide3232_Scale_newton( L_temp, L_temp2, &d_prodL_prodR_e ); d_prodL_prodR_e = add( d_prodL_prodR_e, sub( L_temp_e, L_temp2_e ) ); d_prodL_prodR = BASOP_Util_Add_Mant32Exp( d_prodL_prodR, d_prodL_prodR_e, MAX_32, 0, &d_prodL_prodR_e ); d_prodL_prodR = BASOP_Util_Loge( d_prodL_prodR, d_prodL_prodR_e ); // Q25 @@ -2046,7 +2046,7 @@ void stereo_dft_enc_compute_itd_fx( // xcorr_abs[i] = logf( xcorr_abs[i] / ( sum_nrg_L + sum_nrg_R + 1e-5f ) + 1e-5f ); L_temp = BASOP_Util_Add_Mant32Exp( sum_nrg_L, sum_nrg_L_e, sum_nrg_R, sum_nrg_R_e, &L_temp_e ); L_temp = BASOP_Util_Add_Mant32Exp( L_temp, L_temp_e, 1407374883, -16, &L_temp_e ); - L_temp2 = BASOP_Util_Divide3232_Scale_cadence( xcorr_abs[i], L_temp, &L_temp2_e ); + L_temp2 = BASOP_Util_Divide3232_Scale_newton( xcorr_abs[i], L_temp, &L_temp2_e ); L_temp2_e = add( L_temp2_e, sub( xcorr_abs_e[i], L_temp_e ) ); L_temp2 = BASOP_Util_Add_Mant32Exp( L_temp2, L_temp2_e, 1407374883, -16, &L_temp2_e ); xcorr_abs[i] = BASOP_Util_Loge( L_temp2, L_temp2_e ); @@ -2112,12 +2112,12 @@ void stereo_dft_enc_compute_itd_fx( move16(); // hStereoClassif->ave_ener_L = sum_nrg_L / ( NFFT_mid * NFFT_mid ); - hStereoClassif->ave_ener_L_fx = BASOP_Util_Divide3232_Scale_cadence( sum_nrg_L, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_L_fx_e ); + hStereoClassif->ave_ener_L_fx = BASOP_Util_Divide3232_Scale_newton( sum_nrg_L, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_L_fx_e ); move32(); hStereoClassif->ave_ener_L_fx_e = add( hStereoClassif->ave_ener_L_fx_e, sub( sum_nrg_L_e, 31 ) ); move16(); // hStereoClassif->ave_ener_R = sum_nrg_R / ( NFFT_mid * NFFT_mid ); - hStereoClassif->ave_ener_R_fx = BASOP_Util_Divide3232_Scale_cadence( sum_nrg_R, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_R_fx_e ); + hStereoClassif->ave_ener_R_fx = BASOP_Util_Divide3232_Scale_newton( sum_nrg_R, L_mult0( NFFT_mid, NFFT_mid ), &hStereoClassif->ave_ener_R_fx_e ); move32(); hStereoClassif->ave_ener_R_fx_e = add( hStereoClassif->ave_ener_R_fx_e, sub( sum_nrg_R_e, 31 ) ); move16(); @@ -2145,7 +2145,7 @@ void stereo_dft_enc_compute_itd_fx( { // thres *= 1.0f + 1.f * min( 1.f, max( 0.f, ( -1.0f * sfm_L + 0.5f ) / ( 0.5f - 0.2f ) ) ); L_temp = BASOP_Util_Add_Mant32Exp( L_negate( sfm_L ), 0, ONE_IN_Q30, 0, &L_temp_e ); - L_temp2 = BASOP_Util_Divide3232_Scale_cadence( L_temp, 644245094, &L_temp2_e ); + L_temp2 = BASOP_Util_Divide3232_Scale_newton( L_temp, 644245094, &L_temp2_e ); L_temp2_e = add( L_temp2_e, L_temp_e - 0 ); L_temp2 = L_shl_sat( L_temp2, sub( L_temp2_e, 1 ) ); // Q30 L_temp2_e = 1; @@ -2363,7 +2363,7 @@ void stereo_dft_enc_compute_itd_fx( L_temp = Mpy_32_32( den_cor_cur, den_cor_prev ); L_temp_e = add( den_cor_cur_e, den_cor_prev_e ); L_temp = Sqrt32( L_temp, &L_temp_e ); - cor_lb[i] = BASOP_Util_Divide3232_Scale_cadence( num_cor, L_temp, &cor_lb_e[i] ); + cor_lb[i] = BASOP_Util_Divide3232_Scale_newton( num_cor, L_temp, &cor_lb_e[i] ); move32(); cor_lb_e[i] = add( cor_lb_e[i], sub( num_cor_e, L_temp_e ) ); move16(); @@ -2375,7 +2375,7 @@ void stereo_dft_enc_compute_itd_fx( // par_L[i] = xcorr_max / ( sum_nrg_L_tmp + FLT_MIN ); IF( xcorr_max ) { - par_L[i] = BASOP_Util_Divide3232_Scale_cadence( xcorr_max, sum_nrg_L_tmp, &par_L_e[i] ); + par_L[i] = BASOP_Util_Divide3232_Scale_newton( xcorr_max, sum_nrg_L_tmp, &par_L_e[i] ); move32(); par_L_e[i] = add( par_L_e[i], sub( xcorr_max_e, sum_nrg_L_tmp_e ) ); move16(); diff --git a/lib_enc/ivas_stereo_eclvq_enc_fx.c b/lib_enc/ivas_stereo_eclvq_enc_fx.c index 3abc07811..dc2cf18a0 100644 --- a/lib_enc/ivas_stereo_eclvq_enc_fx.c +++ b/lib_enc/ivas_stereo_eclvq_enc_fx.c @@ -89,7 +89,7 @@ void ECSQ_quantize_vector_fx( } ELSE { - inv_global_gain = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q15, global_gain, &inv_global_gain_e ); + inv_global_gain = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q15, global_gain, &inv_global_gain_e ); inv_global_gain = L_shl( inv_global_gain, inv_global_gain_e ); // Q31 FOR( i = 0; i < N; ++i ) { @@ -140,7 +140,7 @@ Word32 ECSQ_compute_optimal_gain_fx( // Q15 IF( sum_sq_output != 0 ) { // optimal_global_gain = sum_input_output / sum_sq_output; - optimal_global_gain = BASOP_Util_Divide3232_Scale_cadence( sum_input_output, sum_sq_output, &optimal_global_gain_e ); // 31 - ( sum_input_output_e - 31 + optimal_global_gain_e ) = 62 - ( sum_input_output_e + optimal_global_gain_e ) + optimal_global_gain = BASOP_Util_Divide3232_Scale_newton( sum_input_output, sum_sq_output, &optimal_global_gain_e ); // 31 - ( sum_input_output_e - 31 + optimal_global_gain_e ) = 62 - ( sum_input_output_e + optimal_global_gain_e ) optimal_global_gain = L_shr( optimal_global_gain, sub( sub( 62, add( sum_input_output_e, optimal_global_gain_e ) ), 15 ) ); // Q15 } @@ -427,7 +427,7 @@ static Word16 get_best_param_fx( IF( LE_16( sub( count, count0 ), ECSQ_NONZERO_MAX ) && EQ_32( sum_abs, L_shl( sub( count, count0 ), 10 ) ) ) { //*avg_abs_sum = ( sum_abs + 0.25f * count0 ) / count; - *avg_abs_sum = BASOP_Util_Divide3232_Scale_cadence( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); + *avg_abs_sum = BASOP_Util_Divide3232_Scale_newton( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); move32(); *avg_abs_sum = L_shr_r( *avg_abs_sum, sub( 21, L_tmp_e ) ); // Q10 move32(); @@ -438,7 +438,7 @@ static Word16 get_best_param_fx( } //*avg_abs_sum = ( sum_abs + 0.25f * count0 ) / count; - *avg_abs_sum = BASOP_Util_Divide3232_Scale_cadence( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); + *avg_abs_sum = BASOP_Util_Divide3232_Scale_newton( L_add( sum_abs, L_shl( count0, 8 ) ), L_shl( count, 10 ), &L_tmp_e ); move32(); *avg_abs_sum = L_shr_r( *avg_abs_sum, sub( 21, L_tmp_e ) ); // Q10 move32(); @@ -478,7 +478,7 @@ static Word32 get_est_size_fx( // Q10 // if ( param < 0 ) //{ // //two_to_param = 1.0f / two_to_param; - // two_to_param = BASOP_Util_Divide3232_Scale_cadence( 1, two_to_param,&two_to_param_e); + // two_to_param = BASOP_Util_Divide3232_Scale_newton( 1, two_to_param,&two_to_param_e); // } IF( NE_16( param, ECSQ_ALL_ZERO_PARAM ) ) /* not all values are zeros */ @@ -508,7 +508,7 @@ static Word32 get_est_size_fx( // Q10 nonzero = sub( N, N0 ); // required_avg_abs_sum = ( nonzero + 0.25f * N0 ) / N; /* the vector must have nonzero +-1 and N0 zeros */ - required_avg_abs_sum = BASOP_Util_Divide3232_Scale_cadence( L_add( L_shl( nonzero, 10 ), L_shl( N0, 8 ) ), L_shl( N, 10 ), &required_avg_abs_sum_e ); /* the vector must have nonzero +-1 and N0 zeros */ + required_avg_abs_sum = BASOP_Util_Divide3232_Scale_newton( L_add( L_shl( nonzero, 10 ), L_shl( N0, 8 ) ), L_shl( N, 10 ), &required_avg_abs_sum_e ); /* the vector must have nonzero +-1 and N0 zeros */ required_avg_abs_sum = L_shr_r( required_avg_abs_sum, sub( 21, required_avg_abs_sum_e ) ); // Q10 test(); @@ -847,18 +847,18 @@ Word32 ECSQ_encode_target_SNR_fx( /* target_ratio is the target ratio between the sum squared values of input and sum squared values of quantization error */ // target_ratio = powf( 10.0f, target_SNR / 10.0f ); - L_tmp1 = BASOP_Util_Divide3232_Scale_cadence( target_SNR, 10, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Divide3232_Scale_newton( target_SNR, 10, &L_tmp1_e ); L_tmp1_e = add( L_tmp1_e, 6 - 31 ); target_ratio = BASOP_Util_fPow( 10 << 27, 4, L_tmp1, L_tmp1_e, &target_ratio_e ); // target_sum_squared_error = sum_squared / target_ratio; - target_sum_squared_error = BASOP_Util_Divide3232_Scale_cadence( sum_squared, target_ratio, &target_sum_squared_error_e ); + target_sum_squared_error = BASOP_Util_Divide3232_Scale_newton( sum_squared, target_ratio, &target_sum_squared_error_e ); target_sum_squared_error_e = add( target_sum_squared_error_e, sub( sum_squared_e, target_ratio_e ) ); /* the mean of squared quantization error for uniform scalar quantization is 1 / 12, approximately 0.0833 */ /* when including global_gain, the relationship is target_sum_squared_error ~ (0.0833 * N) * global_gain ^ 2 */ /* the representable range for global_gain is from 1 (global_gain_index 0) to 29145 (global_gain_index 126) inclusive */ // global_gain = sqrtf( target_sum_squared_error / ( 0.0833f * (float) N ) ); - global_gain = BASOP_Util_Divide3232_Scale_cadence( target_sum_squared_error, L_mult0( 5459 /*0.0833f in Q16*/, N ), &global_gain_e ); + global_gain = BASOP_Util_Divide3232_Scale_newton( target_sum_squared_error, L_mult0( 5459 /*0.0833f in Q16*/, N ), &global_gain_e ); global_gain_e = add( global_gain_e, sub( target_sum_squared_error_e, 15 ) ); global_gain = Sqrt32( global_gain, &global_gain_e ); global_gain = L_shr( global_gain, sub( 16, global_gain_e ) ); // Q15 @@ -885,7 +885,7 @@ Word32 ECSQ_encode_target_SNR_fx( adjust_size = L_sub( test_size, max_bits_fixpt ); /* assume doubling the quantization step size will reduce the entropy with (up to) one bit */ // adjust_global_gain_index = (int16_t) ceil( adjust_size / ( 1024.0f * N * log_base2( global_gain_step ) ) ); - adjust_global_gain_index = BASOP_Util_Divide3232_Scale_cadence( adjust_size, N, &tmp_e ); + adjust_global_gain_index = BASOP_Util_Divide3232_Scale_newton( adjust_size, N, &tmp_e ); adjust_global_gain_index = Mpy_32_32( adjust_global_gain_index, 17816838 /*/ ( 1024.0f * log_base2( global_gain_step ) )*/ ); IF( NE_32( adjust_global_gain_index, L_shl( L_shr( adjust_global_gain_index, sub( 31, tmp_e ) ), sub( 31, tmp_e ) ) ) ) { diff --git a/lib_enc/ivas_stereo_ica_enc_fx.c b/lib_enc/ivas_stereo_ica_enc_fx.c index a8a088f20..61057fbca 100644 --- a/lib_enc/ivas_stereo_ica_enc_fx.c +++ b/lib_enc/ivas_stereo_ica_enc_fx.c @@ -150,7 +150,7 @@ static void tcaTargetCh_LA_fx( deno_exp = 0; move16(); } - gAdj = BASOP_Util_Divide3232_Scale_cadence( tempF2, deno, &gAdj_exp ); /* Q31-gAdj_exp */ + gAdj = BASOP_Util_Divide3232_Scale_newton( tempF2, deno, &gAdj_exp ); /* Q31-gAdj_exp */ gAdj_exp = add( gAdj_exp, sub( tempF2_exp, deno_exp ) ); } @@ -923,7 +923,7 @@ static void corrStatsEst_fx( IF( tempF_fx != 0 ) { temp32 = BASOP_Util_Add_Mant32Exp( XY_hat_fx, XY_hat_exp, L_negate( Mpy_32_32( X_hat_fx, Y_hat_fx ) ), add( X_hat_exp, Y_hat_exp ), &exp ); /* Q31-exp */ - beta_reg_fx = BASOP_Util_Divide3232_Scale_cadence( temp32, tempF_fx, &beta_reg_exp ); /* Q31-beta_reg_exp */ + beta_reg_fx = BASOP_Util_Divide3232_Scale_newton( temp32, tempF_fx, &beta_reg_exp ); /* Q31-beta_reg_exp */ if ( beta_reg_fx ) { beta_reg_exp = add( beta_reg_exp, sub( exp, tempF_exp ) ); @@ -2345,9 +2345,9 @@ static void unclr_calc_corr_features_fx( move32(); } - ic_Lm = BASOP_Util_Divide3232_Scale_cadence( corrL, ener, &exp1 ); /* Q31-exp1 */ + ic_Lm = BASOP_Util_Divide3232_Scale_newton( corrL, ener, &exp1 ); /* Q31-exp1 */ exp1 = add( exp1, sub( corrL_exp, ener_exp ) ); - ic_Rm = BASOP_Util_Divide3232_Scale_cadence( corrR, ener, &exp2 ); /* Q31-exp2 */ + ic_Rm = BASOP_Util_Divide3232_Scale_newton( corrR, ener, &exp2 ); /* Q31-exp2 */ exp2 = add( exp2, sub( corrR_exp, ener_exp ) ); m_corrL_corrR = L_sub( L_max( L_abs( L_shl( ic_Lm, sub( exp1, s_max( exp1, exp2 ) ) ) ), L_abs( L_shl( ic_Rm, sub( exp2, s_max( exp1, exp2 ) ) ) ) ), L_min( L_abs( L_shl( ic_Lm, sub( exp1, s_max( exp1, exp2 ) ) ) ), L_abs( L_shl( ic_Rm, sub( exp2, s_max( exp1, exp2 ) ) ) ) ) ); // s_max(exp1, exp2) @@ -2405,7 +2405,7 @@ static void unclr_calc_corr_features_fx( } ELSE { - *corrEst_ncorr = BASOP_Util_Divide3232_Scale_cadence( num, den, &exp ); /* Q31-corrEst_ncorr_exp */ + *corrEst_ncorr = BASOP_Util_Divide3232_Scale_newton( num, den, &exp ); /* Q31-corrEst_ncorr_exp */ *corrEst_ncorr_exp = add( exp, sub( num_exp, den_exp ) ); move32(); move16(); diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c index 9a1198e20..b1eae7862 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c @@ -382,14 +382,14 @@ void stereo_coder_tcx_fx( Word16 fTemp_e, tmp_e; Word32 fTemp_fx = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[0], nrgRatio_e[0], nrgRatio_fx[1], nrgRatio_e[1], &fTemp_e ); /* Q31-fTemp_e */ fTemp_e = sub( fTemp_e, 1 ); - nrgRatio_fx[0] = BASOP_Util_Divide3232_Scale_cadence( fTemp_fx, nrgRatio_fx[0], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[0] */ + nrgRatio_fx[0] = BASOP_Util_Divide3232_Scale_newton( fTemp_fx, nrgRatio_fx[0], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[0] */ move32(); nrgRatio_e[0] = add( tmp_e, sub( fTemp_e, nrgRatio_e[0] ) ); move16(); nrgRatio_fx[0] = Sqrt32( nrgRatio_fx[0], &nrgRatio_e[0] ); /* Q31-nrgRatio_e[0] */ move32(); - nrgRatio_fx[1] = BASOP_Util_Divide3232_Scale_cadence( fTemp_fx, nrgRatio_fx[1], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[1] */ + nrgRatio_fx[1] = BASOP_Util_Divide3232_Scale_newton( fTemp_fx, nrgRatio_fx[1], &tmp_e ); /* Q31 - tmp_e - fTemp_e + nrgRatio_e[1] */ move32(); nrgRatio_e[1] = add( tmp_e, sub( fTemp_e, nrgRatio_e[1] ) ); move16(); diff --git a/lib_enc/ivas_stereo_td_analysis_fx.c b/lib_enc/ivas_stereo_td_analysis_fx.c index 6ffd05c0c..6a107e91f 100644 --- a/lib_enc/ivas_stereo_td_analysis_fx.c +++ b/lib_enc/ivas_stereo_td_analysis_fx.c @@ -2013,7 +2013,7 @@ static void Get_corr_n_fx( } ELSE { - *ic_Lm = BASOP_Util_Divide3232_Scale_cadence( corrL, ener, &exp_diff ); // (Q31 - exp_diff) + *ic_Lm = BASOP_Util_Divide3232_Scale_newton( corrL, ener, &exp_diff ); // (Q31 - exp_diff) move32(); IF( *ic_Lm == 0 ) { @@ -2025,7 +2025,7 @@ static void Get_corr_n_fx( *q_ic_Lm = sub( Q31, exp_diff ); move16(); } - *ic_Rm = BASOP_Util_Divide3232_Scale_cadence( corrR, ener, &exp_diff ); // (Q31 - exp_diff) + *ic_Rm = BASOP_Util_Divide3232_Scale_newton( corrR, ener, &exp_diff ); // (Q31 - exp_diff) move16(); IF( *ic_Rm == 0 ) { @@ -2041,7 +2041,7 @@ static void Get_corr_n_fx( /* *es_em = 10 * ( log10f( sqrtf( ener_side / len ) ) - log10f( sqrtf( ener / len ) ) ); is simplified to *es_em = 10 * ( log10f( sqrtf( ener_side / ener ) ) ); */ - L_tmp = BASOP_Util_Divide3232_Scale_cadence( ener_side, ener, &exp_diff ); // (Q31 - exp_diff) + L_tmp = BASOP_Util_Divide3232_Scale_newton( ener_side, ener, &exp_diff ); // (Q31 - exp_diff) L_tmp = Sqrt32( L_tmp, &exp_diff ); /* (Q31 - exp_diff) */ L_tmp = BASOP_Util_Log2( L_tmp ); /* Q25 */ *es_em = Mpy_32_32( Mpy_32_32( L_add( L_tmp, L_shl( exp_diff, Q25 ) ), LOG10_2_Q31 ), TEN_IN_Q27 ); // (Q25, Q27) -> Q21 diff --git a/lib_enc/ivas_tcx_core_enc_fx.c b/lib_enc/ivas_tcx_core_enc_fx.c index fd84d2f21..5f2e9a8e0 100644 --- a/lib_enc/ivas_tcx_core_enc_fx.c +++ b/lib_enc/ivas_tcx_core_enc_fx.c @@ -1086,7 +1086,7 @@ Word16 ivas_acelp_tcx20_switching_fx( nrg_s = BASOP_Util_Add_Mant32Exp( nrg_s, e_num, Mpy_32_32( y_fx[i], y_fx[i] ), shl( e_x, 1 ), &e_num ); /* Q31-e_num */ nrg_n = BASOP_Util_Add_Mant32Exp( nrg_n, e_den, Mpy_32_32( x_fx[i], x_fx[i] ), shl( temp_ene_e, 1 ), &e_den ); /* Q31-e_den */ } - res_cod_SNR_M[iter] = BASOP_Util_Divide3232_Scale_cadence( nrg_s, nrg_n, &temp_e ); /* Q31-res_cod_SNR_M_e[iter] */ + res_cod_SNR_M[iter] = BASOP_Util_Divide3232_Scale_newton( nrg_s, nrg_n, &temp_e ); /* Q31-res_cod_SNR_M_e[iter] */ move32(); res_cod_SNR_M_e[iter] = add( temp_e, sub( e_num, e_den ) ); move16(); diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 3f6449a0c..ecccc8011 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -1961,7 +1961,7 @@ Word16 ivas_smc_gmm_fx( FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - temp32 = BASOP_Util_Divide3232_Scale_cadence( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp + temp32 = BASOP_Util_Divide3232_Scale_newton( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp PS_norm_fx[i] = L_shl( temp32, sub( Qfact_PS_past, add( sub( 31, temp_exp ), sub( Qfact_PS, sub( 31, sum_PS_e ) ) ) ) ); // Qfact_PS_past move32(); dPS_fx[i] = L_abs( L_sub( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ); @@ -1992,7 +1992,7 @@ Word16 ivas_smc_gmm_fx( Word32 tmp_max; tmp_max = L_max( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); - temp32 = BASOP_Util_Divide3232_Scale_cadence( tmp_max, L_add( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp + temp32 = BASOP_Util_Divide3232_Scale_newton( tmp_max, L_add( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); } temp32_log = L_add( BASOP_Util_Log2( L_add_sat( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 2abe538e4..228e522bf 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -2786,7 +2786,7 @@ void tcx_noise_factor_ivas_fx( /* noise level factor: average of segment magnitudes of noise bins */ IF( n > 0 ) { - tmp4 = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_16_1( sqErrorNrg, att ), n, &s ); + tmp4 = BASOP_Util_Divide3232_Scale_newton( Mpy_32_16_1( sqErrorNrg, att ), n, &s ); s = add( add( exp_sqErrorNrg, -15 ), s ); BASOP_SATURATE_WARNING_OFF_EVS; tmp4 = L_shl_o( tmp4, s, &Overflow ); diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c index 60d661db4..2ade624b6 100644 --- a/lib_enc/transient_detection_fx.c +++ b/lib_enc/transient_detection_fx.c @@ -458,7 +458,7 @@ Word32 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const } /* exponent = AVG_FLAT_E */ - i = BASOP_Util_Divide3232_Scale_cadence( sumTempFlatness, nTotBlocks, &exp ); + i = BASOP_Util_Divide3232_Scale_newton( sumTempFlatness, nTotBlocks, &exp ); exp = add( exp, sub( sumTempFlatness_exp, 31 ) ); i = L_shl_sat( i, sub( exp, 10 ) ); // Can be saturated, since it is used for comparision againt 3.25/20.0f, Q21 return i; @@ -1569,12 +1569,12 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp IF( GT_32( w0, w1 ) ) { - pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_cadence( w0, w1, &k ); + pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_newton( w0, w1, &k ); pSubblockNrgChange_exp[w] = k; } ELSE { - pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_cadence( w1, w0, &k ); + pSubblockNrgChange[w] = BASOP_Util_Divide3232_Scale_newton( w1, w0, &k ); pSubblockNrgChange_exp[w] = k; } move32(); -- GitLab From ae29b091c06820aec13831523e343bce6ea25781 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 14 Apr 2025 23:22:47 +0200 Subject: [PATCH 0324/1310] formatting --- lib_enc/hq_classifier_enc_fx.c | 4 ++-- lib_enc/ivas_enc_cov_handler_fx.c | 2 +- lib_enc/ivas_stereo_eclvq_enc_fx.c | 4 ++-- lib_enc/ivas_stereo_ica_enc_fx.c | 2 +- lib_enc/ivas_stereo_td_analysis_fx.c | 2 +- lib_enc/speech_music_classif_fx.c | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_enc/hq_classifier_enc_fx.c b/lib_enc/hq_classifier_enc_fx.c index d82eebfb5..558ae89a7 100644 --- a/lib_enc/hq_classifier_enc_fx.c +++ b/lib_enc/hq_classifier_enc_fx.c @@ -141,8 +141,8 @@ static Word16 hf_spectrum_sparseness_fx( } } Word16 l_shift = W_norm( inv_rms_fx ); - inv_rms32_fx = W_extract_h( W_shl( inv_rms_fx, l_shift ) ); // Q15+l_shift-32 - Word16 q_rms = sub( add( Q15, l_shift ), 32 ); // q_rms + inv_rms32_fx = W_extract_h( W_shl( inv_rms_fx, l_shift ) ); // Q15+l_shift-32 + Word16 q_rms = sub( add( Q15, l_shift ), 32 ); // q_rms inv_rms32_div_fx = BASOP_Util_Divide3232_Scale_newton( inv_rms32_fx, L_SPEC_HB, &inv_rms32_e ); /* Q31-inv_rms32_e */ inv_rms32_e = sub( 31, add( sub( Q31, inv_rms32_e ), q_rms ) ); // inv_rms = 1.0f / (float) sqrtf( inv_rms / L_SPEC_HB ); diff --git a/lib_enc/ivas_enc_cov_handler_fx.c b/lib_enc/ivas_enc_cov_handler_fx.c index 138e1467d..59c38aa5d 100644 --- a/lib_enc/ivas_enc_cov_handler_fx.c +++ b/lib_enc/ivas_enc_cov_handler_fx.c @@ -271,7 +271,7 @@ static Word16 ivas_spar_get_activeW_flag_fx( } ELSE { - L_tmp = BASOP_Util_Divide3232_Scale_newton( hCovEnc->bb_var_lt_fx[0], side_ch_var, &exp_diff ); // (Q31 - exp_diff) + L_tmp = BASOP_Util_Divide3232_Scale_newton( hCovEnc->bb_var_lt_fx[0], side_ch_var, &exp_diff ); // (Q31 - exp_diff) en_ratio = L_shl_sat( L_tmp, exp_diff ); // Q31 IF( LT_32( en_ratio, Mpy_32_32( IVAS_SPAR_DYN_ACTIVEW_THRESH_FX, IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ) ) ) // LHS Q31 :: RHS Q31 { diff --git a/lib_enc/ivas_stereo_eclvq_enc_fx.c b/lib_enc/ivas_stereo_eclvq_enc_fx.c index dc2cf18a0..a09daffe0 100644 --- a/lib_enc/ivas_stereo_eclvq_enc_fx.c +++ b/lib_enc/ivas_stereo_eclvq_enc_fx.c @@ -140,7 +140,7 @@ Word32 ECSQ_compute_optimal_gain_fx( // Q15 IF( sum_sq_output != 0 ) { // optimal_global_gain = sum_input_output / sum_sq_output; - optimal_global_gain = BASOP_Util_Divide3232_Scale_newton( sum_input_output, sum_sq_output, &optimal_global_gain_e ); // 31 - ( sum_input_output_e - 31 + optimal_global_gain_e ) = 62 - ( sum_input_output_e + optimal_global_gain_e ) + optimal_global_gain = BASOP_Util_Divide3232_Scale_newton( sum_input_output, sum_sq_output, &optimal_global_gain_e ); // 31 - ( sum_input_output_e - 31 + optimal_global_gain_e ) = 62 - ( sum_input_output_e + optimal_global_gain_e ) optimal_global_gain = L_shr( optimal_global_gain, sub( sub( 62, add( sum_input_output_e, optimal_global_gain_e ) ), 15 ) ); // Q15 } @@ -509,7 +509,7 @@ static Word32 get_est_size_fx( // Q10 // required_avg_abs_sum = ( nonzero + 0.25f * N0 ) / N; /* the vector must have nonzero +-1 and N0 zeros */ required_avg_abs_sum = BASOP_Util_Divide3232_Scale_newton( L_add( L_shl( nonzero, 10 ), L_shl( N0, 8 ) ), L_shl( N, 10 ), &required_avg_abs_sum_e ); /* the vector must have nonzero +-1 and N0 zeros */ - required_avg_abs_sum = L_shr_r( required_avg_abs_sum, sub( 21, required_avg_abs_sum_e ) ); // Q10 + required_avg_abs_sum = L_shr_r( required_avg_abs_sum, sub( 21, required_avg_abs_sum_e ) ); // Q10 test(); IF( EQ_32( avg_abs_sum, required_avg_abs_sum ) && LE_16( nonzero, ECSQ_NONZERO_MAX ) ) diff --git a/lib_enc/ivas_stereo_ica_enc_fx.c b/lib_enc/ivas_stereo_ica_enc_fx.c index 61057fbca..6057ace6b 100644 --- a/lib_enc/ivas_stereo_ica_enc_fx.c +++ b/lib_enc/ivas_stereo_ica_enc_fx.c @@ -923,7 +923,7 @@ static void corrStatsEst_fx( IF( tempF_fx != 0 ) { temp32 = BASOP_Util_Add_Mant32Exp( XY_hat_fx, XY_hat_exp, L_negate( Mpy_32_32( X_hat_fx, Y_hat_fx ) ), add( X_hat_exp, Y_hat_exp ), &exp ); /* Q31-exp */ - beta_reg_fx = BASOP_Util_Divide3232_Scale_newton( temp32, tempF_fx, &beta_reg_exp ); /* Q31-beta_reg_exp */ + beta_reg_fx = BASOP_Util_Divide3232_Scale_newton( temp32, tempF_fx, &beta_reg_exp ); /* Q31-beta_reg_exp */ if ( beta_reg_fx ) { beta_reg_exp = add( beta_reg_exp, sub( exp, tempF_exp ) ); diff --git a/lib_enc/ivas_stereo_td_analysis_fx.c b/lib_enc/ivas_stereo_td_analysis_fx.c index 6a107e91f..1856370f6 100644 --- a/lib_enc/ivas_stereo_td_analysis_fx.c +++ b/lib_enc/ivas_stereo_td_analysis_fx.c @@ -2041,7 +2041,7 @@ static void Get_corr_n_fx( /* *es_em = 10 * ( log10f( sqrtf( ener_side / len ) ) - log10f( sqrtf( ener / len ) ) ); is simplified to *es_em = 10 * ( log10f( sqrtf( ener_side / ener ) ) ); */ - L_tmp = BASOP_Util_Divide3232_Scale_newton( ener_side, ener, &exp_diff ); // (Q31 - exp_diff) + L_tmp = BASOP_Util_Divide3232_Scale_newton( ener_side, ener, &exp_diff ); // (Q31 - exp_diff) L_tmp = Sqrt32( L_tmp, &exp_diff ); /* (Q31 - exp_diff) */ L_tmp = BASOP_Util_Log2( L_tmp ); /* Q25 */ *es_em = Mpy_32_32( Mpy_32_32( L_add( L_tmp, L_shl( exp_diff, Q25 ) ), LOG10_2_Q31 ), TEN_IN_Q27 ); // (Q25, Q27) -> Q21 diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index ecccc8011..3852d6dc4 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -1961,7 +1961,7 @@ Word16 ivas_smc_gmm_fx( FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - temp32 = BASOP_Util_Divide3232_Scale_newton( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp + temp32 = BASOP_Util_Divide3232_Scale_newton( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp PS_norm_fx[i] = L_shl( temp32, sub( Qfact_PS_past, add( sub( 31, temp_exp ), sub( Qfact_PS, sub( 31, sum_PS_e ) ) ) ) ); // Qfact_PS_past move32(); dPS_fx[i] = L_abs( L_sub( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ); -- GitLab From 8fa203f853f0539e0ecb66f7b58e9f56bac85de5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 10 Apr 2025 13:00:38 +0200 Subject: [PATCH 0325/1310] switch on STAGE2 --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 48df856c7..b51ccda4b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -90,6 +90,6 @@ #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From eca9c911fa0623cdabe25df442ab43c3c93fa13d Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 07:42:32 +0200 Subject: [PATCH 0326/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 436213825..95d31cba3 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7029,14 +7029,14 @@ void elliptic_bpf_48k_generic_fx( L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7325,7 +7325,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -8042,7 +8042,7 @@ void prep_tbe_exc_fx( void prep_tbe_exc_ivas_fx( const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE +#if 1 // def ADD_IVAS_TBE_CODE const Word16 L_subfr, #endif const Word16 i_subfr_fx, /* i : subframe index */ @@ -8059,7 +8059,7 @@ void prep_tbe_exc_ivas_fx( Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE +#if 1 // def ADD_IVAS_TBE_CODE , /* i : core bitrate */ const Word16 element_mode, /* i : element mode */ const Word16 idchan, /* i : channel ID */ -- GitLab From 132d8b831cb0e12e433df95bc50ce3ef25659063 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Apr 2025 20:57:11 +0530 Subject: [PATCH 0327/1310] Fix for 3GPP issue 1472: Precision issue with power spectrum causes different behavior with silent channels in MCT Link #1472 --- lib_com/ivas_sns_com_fx.c | 13 ++++++++++--- lib_enc/ivas_core_enc_fx.c | 27 ++++++++++++++++++++++++++- lib_enc/ivas_core_pre_proc_front_fx.c | 13 ------------- lib_enc/ivas_core_pre_proc_fx.c | 12 +++++++----- lib_enc/ivas_cpe_enc_fx.c | 2 +- 5 files changed, 44 insertions(+), 23 deletions(-) diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index fa64b0092..f1e44be78 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -200,9 +200,16 @@ void sns_compute_scf_fx( /* mean = sum / FDNS_NPTS; -Q6 is for division with FDNS_NPTS and -Q1 is to reduce Q by one */ - mean = W_shl_sat_l( sum, -Q7 ); // q_out - nf = Mpy_32_32( mean, 214748 /* powf( 10.0f, -4.0f ) in Q31 */ ); // q_out - nf = L_max( nf, L_shl( 256, sub( q_out, 40 ) ) /* powf( 2.0f, -32.0f ) in Q40 */ ); // q_out + mean = W_shl_sat_l( sum, -Q7 ); // q_out + nf = Mpy_32_32( mean, 214748 /* powf( 10.0f, -4.0f ) in Q31 */ ); // q_out + + IF( LE_32( nf, L_shl_sat( 256, sub( q_out, 40 ) ) ) ) /* powf( 2.0f, -32.0f ) in Q40 */ + { + nf = 256; + move32(); + q_out = 40; + move16(); + } FOR( i = 0; i < FDNS_NPTS; i++ ) { diff --git a/lib_enc/ivas_core_enc_fx.c b/lib_enc/ivas_core_enc_fx.c index 3c62a0d18..066d105d5 100644 --- a/lib_enc/ivas_core_enc_fx.c +++ b/lib_enc/ivas_core_enc_fx.c @@ -419,7 +419,6 @@ ivas_error ivas_core_enc_fx( } } - /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Encoding *---------------------------------------------------------------------*/ @@ -532,6 +531,12 @@ ivas_error ivas_core_enc_fx( st->hTcxEnc->exp_buf_speech_ltp = st->exp_buf_speech_enc; move16(); } + Scale_sig( st->input_fx, input_frame, sub( -1, st->q_inp ) ); + Scale_sig( st->input_fx - input_frame, input_frame, sub( -1, st->q_old_inp ) ); + st->q_inp = -1; + move16(); + st->q_old_inp = -1; + move16(); } Word16 Q_spec_old[2], L_spec; @@ -612,6 +617,8 @@ ivas_error ivas_core_enc_fx( * Postprocessing, BWEs and Updates *---------------------------------------------------------------------*/ + Word16 tmp_input_fx[L_FRAME48k], tmp_old_input_fx[L_FRAME48k], q_inp[2]; + FOR( n = 0; n < n_CoreChannels; n++ ) { st = sts[n]; @@ -626,6 +633,17 @@ ivas_error ivas_core_enc_fx( move16(); } + Copy( st->input_fx - input_frame, tmp_old_input_fx, input_frame ); + Copy( st->input_fx, tmp_input_fx, input_frame ); + q_inp[0] = st->q_old_inp; + q_inp[1] = st->q_inp; + + Scale_sig( st->input_fx - input_frame, 2 * input_frame, sub( -1, st->q_inp ) ); + st->q_inp = -1; + move16(); + st->q_old_inp = -1; + move16(); + /*---------------------------------------------------------------------* * Postprocessing for ACELP/HQ core switching *---------------------------------------------------------------------*/ @@ -787,6 +805,13 @@ ivas_error ivas_core_enc_fx( } } + Copy( tmp_old_input_fx, st->input_fx - input_frame, input_frame ); + Copy( tmp_input_fx, st->input_fx, input_frame ); + st->q_old_inp = q_inp[0]; + move16(); + st->q_inp = q_inp[1]; + move16(); + /*---------------------------------------------------------------------* * Channel-aware mode - write signaling information into the bitstream *---------------------------------------------------------------------*/ diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 0d6a5901a..bac22a5b7 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1575,12 +1575,6 @@ ivas_error pre_proc_front_ivas_fx( move16(); IF( flag_16k_smc ) { - Scale_sig( st->input_fx - input_frame, input_frame_full, sub( -1, st->q_inp ) ); /* Q(-1) */ - st->q_inp = -1; - move16(); - st->q_old_inp = -1; - move16(); - Word16 Q_old_inp_16k = -1; move16(); @@ -1718,13 +1712,6 @@ ivas_error pre_proc_front_ivas_fx( st->exp_old_inp_12k8 = sub( Q15, add( *Q_new, shift ) ); move16(); - Scale_sig( st->input_fx - input_frame, input_frame_full, sub( -1, st->q_inp ) ); - st->q_inp = -1; - move16(); - st->q_old_inp = -1; - move16(); - - // Scale_sig( old_inp_12k8_fx, L_INP_12k8, negate( add( *Q_new, 1 ) ) ); *Q_new = sub( *Q_new, Q_inp_const ); // ivas_core_enc will assume inp signal (12k8 and 16k) in Q_new - 1 move16(); diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 781d290ac..b2ec13983 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -565,9 +565,6 @@ ivas_error pre_proc_ivas_fx( Scale_sig( st->buf_speech_enc_pe, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, sub( Q_old_inp_16k, sub( Q15, st->exp_buf_speech_enc_pe ) ) ); /* Q15 - Q_old_inp_16k */ st->exp_buf_speech_enc_pe = sub( Q15, Q_old_inp_16k ); move16(); - Scale_sig( st->input_fx, input_frame, sub( -1, st->q_inp ) ); - st->q_inp = -1; - move16(); Scale_sig( st->buf_wspeech_enc, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320, sub( Q_old_inp_16k, sub( Q15, st->exp_buf_wspeech_enc ) ) ); /* Q15 - Q_old_inp_16k */ st->mem_wsp_enc = shl( st->mem_wsp_enc, sub( Q_old_inp_16k, sub( Q15, st->exp_buf_wspeech_enc ) ) ); // Q_old_inp_16k move16(); @@ -713,7 +710,7 @@ ivas_error ivas_compute_core_buffers_fx( Word16 *inp_16k_fx, *new_inp_16k_fx; Word16 delay, element_mode; Word16 temp1F_icatdmResampBuf_fx[L_FILT_MAX]; /* temp buffers for ICA TDM resamplers */ - Word16 mem_decim16k_dummy_fx[2 * L_FILT_MAX]; + Word16 mem_decim16k_dummy_fx[2 * L_FILT_MAX], input_buf_fx[L_FRAME48k * 2]; Word16 *signal_in_fx; Word16 lMemRecalc, lMemRecalc_16k, L_frame_tmp, L_look; Word32 input_Fs; @@ -733,7 +730,12 @@ ivas_error ivas_compute_core_buffers_fx( set16_fx( new_inp_resamp16k_fx, 0, L_FRAME16k ); set16_fx( epsP_h, 0, M + 1 ); set16_fx( epsP_l, 0, M + 1 ); - signal_in_fx = st->input_fx; /* st->q_inp */ + set16_fx( input_buf_fx, 0, L_FRAME48k * 2 ); + + Copy_Scale_sig( st->input_fx - input_frame, input_buf_fx, input_frame, sub( -1, st->q_old_inp ) ); + Copy_Scale_sig( st->input_fx, input_buf_fx + input_frame, input_frame, sub( -1, st->q_inp ) ); + + signal_in_fx = &input_buf_fx[input_frame]; /* st->q_inp */ input_Fs = st->input_Fs; /* Q0 */ move32(); diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index 1bb31810d..b5ed69560 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -430,7 +430,7 @@ ivas_error ivas_cpe_enc_fx( stereo_tca_enc_fx( hCPE, input_frame ); - shift = s_min( 0, sub( add( L_norm_arr( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), sts[0]->q_inp32 ), 16 ) ); + shift = sub( add( L_norm_arr( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), sts[0]->q_inp32 ), 16 ); shift = s_min( shift, sub( add( L_norm_arr( sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), sts[1]->q_inp32 ), 16 ) ); Copy_Scale_sig32_16( sts[0]->input_buff32_fx, sts[0]->input_buff_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( add( Q16, shift ), sts[0]->q_inp32 ) ); // shift Copy_Scale_sig32_16( sts[1]->input_buff32_fx, sts[1]->input_buff_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( add( Q16, shift ), sts[1]->q_inp32 ) ); // shift -- GitLab From 4fcbe7002858a6c2efdcb22ce037452b1e0d93bb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 08:41:15 +0200 Subject: [PATCH 0328/1310] Revert "clang patch" This reverts commit eca9c911fa0623cdabe25df442ab43c3c93fa13d. --- lib_com/swb_tbe_com_fx.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 95d31cba3..436213825 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7029,14 +7029,14 @@ void elliptic_bpf_48k_generic_fx( L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7325,7 +7325,7 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ FOR( i = 0; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ @@ -8042,7 +8042,7 @@ void prep_tbe_exc_fx( void prep_tbe_exc_ivas_fx( const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE +#if 1 // def ADD_IVAS_TBE_CODE const Word16 L_subfr, #endif const Word16 i_subfr_fx, /* i : subframe index */ @@ -8059,7 +8059,7 @@ void prep_tbe_exc_ivas_fx( Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE +#if 1 // def ADD_IVAS_TBE_CODE , /* i : core bitrate */ const Word16 element_mode, /* i : element mode */ const Word16 idchan, /* i : channel ID */ -- GitLab From 9f6be5f43f56398387993bf25399145a4a69a050 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 08:41:51 +0200 Subject: [PATCH 0329/1310] Revert "switch on STAGE2" This reverts commit 8fa203f853f0539e0ecb66f7b58e9f56bac85de5. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index b51ccda4b..48df856c7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -90,6 +90,6 @@ #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif -- GitLab From 9ff3085f6c46bf4909f0925b1112fcf20f7c16a0 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 08:57:51 +0200 Subject: [PATCH 0330/1310] trying to revert ugly stuff and bring swb_tbe_com_fx.c back to state like e1d19cec --- lib_com/swb_tbe_com_fx.c | 553 ++++++++++++++++----------------------- 1 file changed, 232 insertions(+), 321 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 436213825..f1492b0b4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6686,135 +6686,177 @@ void wb_tbe_extras_reset_synth_fx( return; } -#if defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 ) && defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 ) -static inline Word64 wmac_1616( Word64 x1, Word16 x2, Word16 x3 ) -{ - return W_mac_16_16( x1, x2, x3 ); -} - -static inline Word64 wmac_3216( Word64 x1, Word32 x2, Word16 x3 ) -{ - return W_mac_32_16( x1, x2, x3 ); -} - -static inline Word64 finalSat16( Word64 W_tmpx, Word64 W_tmpy ) -{ - return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -} -static inline Word64 finalSat32( Word64 W_tmpx, Word64 W_tmpy ) -{ - return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); -} - -inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *input32_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 +inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) { Word32 L_tmpX; Word16 i; Word32 L_tmpMax2 = *L_tmpMax; Word32 L_tmpAbs; move32(); - - if ( input16_fx > 0 ) - { - Word64 ( *wmac )( Word64, Word16, Word16 ); - Word64 ( *finalSat )( Word64, Word64 ); - Word16 *input_fx = input16_fx; - wmac = wmac_1616; - finalSat = finalSat16; - } - if ( input32_fx > 0 ) - { - Word64 ( *wmac )( Word64, Word32, Word16 ); - Word64 ( *finalSat )( Word64, Word64 ); - Word32 *input_fx = input32_fx; - wmac = wmac_3216; - finalSat = finalSat32; - } - IF( !IsUpsampled3 ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { - W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } } +#else + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } +#endif } /*IsUpsampled3*/ ELSE { /*IsUpsampled3*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; ) { - W_tmpX = wmac( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } i++; - W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } i++; W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = wmac( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ move32(); - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpAbs = L_abs( L_tmp[i] ); } - if ( *L_tmpMax > 0 ) + if ( L_tmpMax > 0 ) { L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); } i++; } - } /*IsUpsampled3*/ +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + if ( L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ *L_tmpMax = L_tmpMax2; move32(); } @@ -6829,7 +6871,7 @@ inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *i void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS, + int isIVAS; #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -6847,9 +6889,8 @@ void elliptic_bpf_48k_generic_fx( Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; Word32 L_tmpMax; - Word32 L_tmpX; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word64 W_tmpX; Word64 W_tmpY; @@ -6864,21 +6905,6 @@ void elliptic_bpf_48k_generic_fx( Word32 memory2_fx_2[4], memory2_fx_3[4]; #endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < 4; i++ ) - { - memory_fx0 = extract_l( memory_fx2[0][i] ); - input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); - L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - move32(); - move32(); - } -#else FOR( i = 0; i < 4; i++ ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic @@ -6896,138 +6922,92 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - move32(); - move32(); } -#endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( input_fx, 0, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); +#else IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - } + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } - } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; ) { - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } - } - } /*IsUpsampled3*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } +#else + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ @@ -7038,26 +7018,28 @@ void elliptic_bpf_48k_generic_fx( move32(); i++; - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + } /*IsUpsampled3*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7121,47 +7103,41 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( 0, L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); +#else #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } - +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7238,64 +7214,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); - -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - FOR( j = 0; j < 4; j++ ) - { - L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - } - - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( 0, L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - } - -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ FOR( j = 0; j < 4; j++ ) { L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); @@ -7343,7 +7261,9 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ @@ -7476,12 +7396,7 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS -#endif -) + Word16 Qout ) { Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic @@ -7516,7 +7431,7 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, + 1 // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 @@ -7530,18 +7445,15 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, + 1 // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 #endif excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ - - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); temp1 = sum2_fx_mod( tmp, L_FRAME48k ); + L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); @@ -7641,7 +7553,6 @@ void synthesise_fb_high_band_fx( } #endif } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ return; } -- GitLab From 9703b0235de80170320a73d212765280ec29c07c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 09:25:53 +0200 Subject: [PATCH 0331/1310] bring back to state e1d19cec --- lib_com/options.h | 10 ++++-- lib_com/prot_fx.h | 9 ++---- lib_dec/ivas_core_dec_fx.c | 62 +++++++------------------------------- lib_dec/ivas_jbm_dec_fx.c | 20 ++---------- lib_dec/swb_tbe_dec_fx.c | 29 ++---------------- lib_enc/swb_tbe_enc_fx.c | 6 ++-- 6 files changed, 30 insertions(+), 106 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 48df856c7..c76765742 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -#define WMOPS /* Activate complexity and memory counters */ +/*#define WMOPS*/ /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -89,7 +89,13 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ +#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ +#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ + #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 92dd8311b..59c9e2f8c 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3266,7 +3266,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS, + int isIVAS; #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -3292,12 +3292,7 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS -#endif -); + Word16 Qout ); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index db6dad33f..03f0e4b40 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -116,12 +116,12 @@ ivas_error ivas_core_dec_fx( error = IVAS_ERR_OK; move32(); - push_wmops( "ivas_core_dec (ICD)" ); + push_wmops( "ivas_core_dec" ); /*------------------------------------------------------------------* * General initialization *-----------------------------------------------------------------*/ - push_wmops( "ICD init" ); + use_cldfb_for_dft = 0; move16(); tdm_LRTD_flag = -1; @@ -370,9 +370,7 @@ ivas_error ivas_core_dec_fx( { save_hb_synth_32_fx = NULL; } - pop_wmops(); /*push_wmops( "ICD init" );*/ - push_wmops( "ICD SID, sanity" ); /*------------------------------------------------------------------* * Decode SID for MDCT-Stereo DTX mode *-----------------------------------------------------------------*/ @@ -400,9 +398,7 @@ ivas_error ivas_core_dec_fx( { ivas_combined_format_brate_sanity_fx( element_brate, sts[0]->core, sts[0]->total_brate, &( sts[0]->core_brate ), &( sts[0]->inactive_coder_type_flag ), &tmps ); } - pop_wmops(); /*push_wmops( "ICD SID, sanity" );*/ - push_wmops( "ICD Coredec" ); /*------------------------------------------------------------------* * Core Decoding *-----------------------------------------------------------------*/ @@ -487,7 +483,6 @@ ivas_error ivas_core_dec_fx( IF( st->core == ACELP_CORE ) { - push_wmops( "ICD ACELP" ); /* ACELP core decoder */ Word16 old_syn_12k8_16k_fx_16[L_FRAME16k]; Word16 save_hb_synth_fx_arr[L_FRAME48k], *save_hb_synth_16_fx; @@ -560,7 +555,6 @@ ivas_error ivas_core_dec_fx( } Copy_Scale_sig_16_32_DEPREC( old_syn_12k8_16k_fx_16, old_syn_12k8_16k_fx[n], L_FRAME16k, Q11 - ( -Q1 ) ); // Q(11 - (-1)) - pop_wmops(); /*push_wmops( "ICD ACELP" );*/ } Copy_Scale_sig_32_16( st->previoussynth_fx_32, st->previoussynth_fx, L_FRAME48k, 0 ); // Q0 @@ -569,7 +563,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( EQ_16( st->core, TCX_20_CORE ) || EQ_16( st->core, TCX_10_CORE ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - push_wmops( "ICD TCX" ); Word16 Qsyn_temp; IVAS_FORMAT ivas_format; @@ -624,12 +617,10 @@ ivas_error ivas_core_dec_fx( } st->hBPF->pst_mem_deemp_err_fx = extract_l( st->mem_error ); move16(); - pop_wmops(); /*push_wmops( "ICD TCX" );*/ } IF( EQ_16( st->core, HQ_CORE ) ) { - push_wmops( "ICD HQ decoding" ); /* HQ core decoder */ Word16 Q_output; @@ -643,7 +634,6 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_output ) ); // Q11 Scale_sig( synth_16_fx[n], output_frame, negate( Q_synth ) ); // Q0 Scale_sig( output_16_fx[n], L_FRAME48k, negate( Q_output ) ); // Q0 - pop_wmops(); /*push_wmops( "ICD HQ decoding" );*/ } /*---------------------------------------------------------------------* @@ -660,8 +650,8 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_pitch_buf_16_fx, hCPE->hCoreCoder[0]->old_pitch_buf_fx, add( imult1616( 2, NB_SUBFR16k ), 2 ), Q10 ); // Q16 } - } /* n_channels loop */ - pop_wmops(); /*push_wmops( "ICD Coredec" );*/ + } /* n_channels loop */ + /*---------------------------------------------------------------------* * MDCT stereo: joint TCX Core Decoding @@ -669,7 +659,6 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) ) { - push_wmops( "ICD jTCX Coredec" ); /* active-frame decoding */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) ) { @@ -798,7 +787,6 @@ ivas_error ivas_core_dec_fx( } } } - pop_wmops(); /*push_wmops( "ICD jTCX Coredec" );*/ } /*---------------------------------------------------------------------* @@ -808,7 +796,6 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( sts[0]->element_mode, IVAS_CPE_TD ) && hStereoCng != NULL ) { - push_wmops( "ICD Stereo CNG Updates" ); /* To be cleaned up once the caller function is converted // These changes are for system testing of fixed changes made */ Word16 Q_c_PS_LT, Q_output; Word32 c_PS_LT_fx; @@ -824,14 +811,12 @@ ivas_error ivas_core_dec_fx( stereo_cng_compute_PScorr_fx( output_32_fx[0], output_32_fx[1], &Q_output, &c_PS_LT_fx, Q_c_PS_LT, sts[0]->L_frame, sts[1]->L_frame ); hStereoCng->c_PS_LT_fx = extract_h( c_PS_LT_fx ); - pop_wmops(); /*push_wmops( "ICD Stereo CNG Updates" );*/ } /*---------------------------------------------------------------------* * Postprocessing, BWEs and updates *---------------------------------------------------------------------*/ - push_wmops( "ICD Postproc, BWE, updates (ICD PP)" ); FOR( n = 0; n < n_channels; n++ ) { st = sts[n]; @@ -842,7 +827,6 @@ ivas_error ivas_core_dec_fx( * TD-BWE for ACELP to TCX transitions *---------------------------------------------------------------------*/ - push_wmops( "ICD PP TDBWE ACELPTCX trans" ); /*core_switching_post_dec*/ Q_synth = sub( 15, e_sig[0] ); @@ -916,12 +900,11 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, hBWE_TD->prev_Qx ) ); // Q11 Copy( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->state_32and48k_WB_upsample_fx, ( 2 * ALLPASSSECTIONS_STEEP ) ); } - pop_wmops(); /*push_wmops( "ICD PP TDBWE ACELPTCX trans" );*/ /*---------------------------------------------------------------------* * Postprocessing for ACELP/MDCT core switching *---------------------------------------------------------------------*/ - push_wmops( "ICD PP ACELP/MDCT switch" ); + /* save synth and output in case of SBA DirAC stereo output as core switching is done outside of core decoder */ test(); test(); @@ -956,12 +939,11 @@ ivas_error ivas_core_dec_fx( { Copy( sts[0]->previoussynth_fx, sts[1]->previoussynth_fx, st->hTcxDec->L_frameTCX ); } - pop_wmops(); /*push_wmops( "ICD PP ACELP/MDCT switch" );*/ /*---------------------------------------------------------------------* * Pre-processing for bandwidth switching *---------------------------------------------------------------------*/ - push_wmops( "ICD PP BWswitch preproc" ); + ivas_bw_switching_pre_proc_fx( st, last_element_brate, nchan_out, old_syn_12k8_16k_fx[n], old_syn_fx, q_audio ); IF( st->hHQ_core == NULL ) @@ -1008,13 +990,12 @@ ivas_error ivas_core_dec_fx( hBWE_FD->prev_flag = hBWE_FD->prev_flag; move16(); } - pop_wmops(); /*push_wmops( "ICD PP BWswitch preproc" );*/ /*---------------------------------------------------------------------* * WB TBE decoding * WB BWE decoding *---------------------------------------------------------------------*/ - push_wmops( "ICD PP TBE/BWE" ); + Word16 Q_input, Q_hb_synth_fx, Q_synth_fx; Word16 Q_syn_hb, sf; @@ -1042,9 +1023,8 @@ ivas_error ivas_core_dec_fx( IF( EQ_16( st->extl, WB_TBE ) ) { /* WB TBE decoder */ - push_wmops( "ICD PP TBE/BWE wb_tbe_dec" ); + ivas_wb_tbe_dec_fx( st, st->coder_type, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], hb_synth_16_fx[n], &Q_hb_synth_fx ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_tbe_dec" );*/ } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( n, 1 ) && !tdm_LRTD_flag && NE_16( st->extl, -1 ) && st->bws_cnt == 0 && st->extl_brate == 0 ) { @@ -1052,10 +1032,8 @@ ivas_error ivas_core_dec_fx( } ELSE IF( EQ_16( st->extl, WB_BWE ) && st->bws_cnt == 0 ) { - push_wmops( "ICD PP TBE/BWE wb_bwe_dec" ); /* WB BWE decoder */ Q_hb_synth_fx = ivas_wb_bwe_dec_fx( st, output_16_fx[n], synth_16_fx[n], hb_synth_16_fx[n], use_cldfb_for_dft, output_frame, voice_factors_fx[n], pitch_buf_fx[n], &Q_synth_fx ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE wb_bwe_dec" );*/ } /* Memories Re-Scaling */ @@ -1099,10 +1077,8 @@ ivas_error ivas_core_dec_fx( test(); IF( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) || ( NE_16( st->coder_type, AUDIO ) && NE_16( st->coder_type, INACTIVE ) && GE_32( st->core_brate, SID_2k40 ) && EQ_16( st->core, ACELP_CORE ) && !st->con_tcx && GE_32( output_Fs, 32000 ) && GT_16( st->bwidth, NB ) && st->bws_cnt > 0 ) ) { - push_wmops( "ICD PP TBE/BWE swb_tbe_dec" ); /* SWB TBE decoder */ ivas_swb_tbe_dec_fx( st, hStereoICBWE, bwe_exc_extended_fx[n], st->Q_exc, voice_factors_fx[n], old_syn_12k8_16k_fx[n], tmp_buffer_fx /*fb_exc*/, hb_synth_32_fx[n], pitch_buf_fx[n], &Q_white_exc ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec" );*/ Copy_Scale_sig_16_32_no_sat( hBWE_TD->syn_overlap_fx, hBWE_TD->syn_overlap_fx_32, L_SHB_LAHEAD, sub( Q11, hBWE_TD->prev_Q_bwe_syn2 ) ); // Q11 Copy_Scale_sig_32_16( hBWE_TD->old_tbe_synth_fx_32, hBWE_TD->old_tbe_synth_fx, L_SHB_TRANSITION_LENGTH, sub( hBWE_TD->prev_Qx, Q11 ) ); // prev_Qx @@ -1117,22 +1093,18 @@ ivas_error ivas_core_dec_fx( /* FB TBE decoder */ IF( EQ_16( st->extl, FB_TBE ) ) { - push_wmops( "ICD PP TBE/BWE fb_tbe_dec" ); fb_tbe_dec_ivas_fx( st, tmp_buffer_fx /*fb_exc*/, Q_white_exc, hb_synth_32_fx[n], 0, tmp_buffer_fx /*fb_synth_ref*/, Q_white_exc, output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE fb_tbe_dec" );*/ } } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) || ( GE_32( output_Fs, 32000 ) && st->core == ACELP_CORE && st->bwidth > NB && st->bws_cnt > 0 && !st->ppp_mode_dec && !( EQ_16( st->nelp_mode_dec, 1 ) && EQ_16( st->bfi, 1 ) ) ) ) { /* SWB BWE decoder */ - push_wmops( "ICD PP TBE/BWE swb_bwe_dec" ); Q_syn_hb = swb_bwe_dec_fx32( st, output_32_fx[n], synth_32_fx[n], hb_synth_32_fx[n], use_cldfb_for_dft, output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_bwe_dec" );*/ + Scale_sig32( hb_synth_32_fx[n], output_frame, sub( Q11, Q_syn_hb ) ); // Q11 Copy_Scale_sig_32_16( hBWE_FD->L_old_wtda_swb_fx32, hBWE_FD->L_old_wtda_swb_fx, output_frame, sub( hBWE_FD->old_wtda_swb_fx_exp, Q11 ) ); // old_wtda_swb_fx_exp } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE" );*/ /*---------------------------------------------------------------------* * FEC - recovery after lost HQ core (smoothing of the BWE component) @@ -1171,7 +1143,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( GE_16( output_frame, L_FRAME32k ) && st->hTdCngDec != NULL ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && GE_16( st->bwidth, SWB ) && st->hTdCngDec != NULL ) ) { - push_wmops( "ICD PP SWB CNG" ); /* SHB CNG decoder */ Word16 synth_fxl[960]; /* Q-2 */ Word16 q; @@ -1193,7 +1164,6 @@ ivas_error ivas_core_dec_fx( Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, negate( sub( Q8, hBWE_TD->prev_Q_bwe_syn ) ) ); // Q0 Copy_Scale_sig_16_32_no_sat( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, 2 * ALLPASSSECTIONS_STEEP, negate( sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ) ); - pop_wmops(); /* push_wmops( "ICD PP SWB CNG" );*/ } /*-------------------------------------------------------------------* @@ -1203,7 +1173,6 @@ ivas_error ivas_core_dec_fx( test(); IF( n == 0 && GE_16( st->element_mode, IVAS_CPE_DFT ) ) { - push_wmops( "ICD PP IC-BWE" ); Word16 q; q = 11; move16(); @@ -1225,12 +1194,10 @@ ivas_error ivas_core_dec_fx( Scale_sig32( hb_synth_32_fx[0], output_frame, sub( Q11, q ) ); // Q11 Scale_sig32( hb_synth_32_fx[1], output_frame, sub( Q11, q ) ); // Q11 } - pop_wmops(); /*push_wmops( "ICD PP IC-BWE" );*/ } IF( EQ_16( st->element_mode, EVS_MONO ) ) { - push_wmops( "ICD PP BFI" ); /*----------------------------------------------------------------* * BFI waveform adjustment *----------------------------------------------------------------*/ @@ -1258,7 +1225,6 @@ ivas_error ivas_core_dec_fx( st->hPlcInfo->Pitch_fx = 0; move16(); } - pop_wmops(); /*push_wmops( "ICD PP BFI" );*/ } /*----------------------------------------------------------------* @@ -1271,7 +1237,6 @@ ivas_error ivas_core_dec_fx( test(); IF( ( NE_16( st->extl, -1 ) && ( NE_16( st->extl, IGF_BWE ) || st->last_core == ACELP_CORE ) ) || ( st->bws_cnt > 0 && st->core == ACELP_CORE ) ) { - push_wmops( "ICD PP Sync BWE" ); /* Calculate an additional delay of extension layer components to be synchronized with ACELP synthesis */ IF( EQ_16( st->L_frame, L_FRAME ) ) { @@ -1425,7 +1390,6 @@ ivas_error ivas_core_dec_fx( st->hTdCngDec->last_shb_ener_fx_32 = L_shl_sat( L_tmp, sub( exp, 20 ) ); /*Q11*/ move32(); } - pop_wmops(); /*push_wmops( "ICD PP Sync BWE" );*/ } test(); @@ -1441,7 +1405,7 @@ ivas_error ivas_core_dec_fx( * - core switching in DFT stereo * - updates for potential TD->DFT stereo switching *----------------------------------------------------------------*/ - push_wmops( "ICD PP TCXLTP" ); + IF( st->hHQ_core != NULL ) { Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 @@ -1498,7 +1462,6 @@ ivas_error ivas_core_dec_fx( } Copy32( synth_32_fx[n], output_32_fx[n], output_frame ); - pop_wmops(); /*push_wmops( "ICD PP TCXLTP" );*/ /*--------------------------------------------------------* * Common updates @@ -1507,7 +1470,6 @@ ivas_error ivas_core_dec_fx( Word16 exp_max; Word32 output_fx_loc[L_FRAME48k]; - push_wmops( "ICD PP commonupdates" ); exp_max = 0; move16(); @@ -1562,8 +1524,6 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->delay_buf_out_fx, NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ), negate( exp_max ) ); // Q0 - pop_wmops(); /*push_wmops( "ICD PP commonupdates" );*/ - } /* n_channels loop */ FOR( n = 0; n < n_channels; n++ ) @@ -1582,7 +1542,7 @@ ivas_error ivas_core_dec_fx( move16(); } } - pop_wmops(); /*push_wmops( "ICD Postproc, BWE, updates (ICD PP)" );*/ + pop_wmops(); return error; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 90385dfb5..8c5a9e9af 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -96,13 +96,12 @@ ivas_error ivas_jbm_dec_tc_fx( CPE_DEC_HANDLE hCPE; SCE_DEC_HANDLE hSCE; - push_wmops( "ivas_jbm_dec_tc (JBM)" ); + push_wmops( "ivas_jbm_dec_tc" ); /*----------------------------------------------------------------* * Initialization of local vars after struct has been set *----------------------------------------------------------------*/ - push_wmops( "JBM init" ); output_Fs = st_ivas->hDecoderConfig->output_Fs; move32(); nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; @@ -135,7 +134,7 @@ ivas_error ivas_jbm_dec_tc_fx( } Word16 ch; - pop_wmops(); /*push_wmops( "JBM init" );*/ + /*----------------------------------------------------------------* * Decoding + pre-rendering @@ -153,7 +152,6 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) { - push_wmops( "JBM STEREO" ); st_ivas->hCPE[0]->element_brate = ivas_total_brate; move32(); Word16 q_output = 11; @@ -194,11 +192,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 } } - pop_wmops(); /*push_wmops( "JBM STEREO" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { - push_wmops( "JBM ISM" ); /* Metadata decoding and configuration */ test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) @@ -283,11 +279,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops(); /*push_wmops( "JBM ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { - push_wmops( "JBM SBA/MASA" ); set16_fx( nb_bits_metadata, 0, MAX_SCE ); @@ -694,11 +688,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, 1 ); // Q-1 -> Q } } - pop_wmops(); /*push_wmops( "JBM SBA/MASA" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { - push_wmops( "JBM MASA_ISM" ); Word16 nchan_ism, nchan_transport_ism; Word16 dirac_bs_md_write_idx; @@ -829,11 +821,9 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[n], output_frame, sub( Q11, output_q ) ); // Q11 } } - pop_wmops(); /*push_wmops( "JBM MASA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { - push_wmops( "JBM SBA_ISM" ); Word16 nchan_ism, sba_ch_idx; set16_fx( nb_bits_metadata, 0, MAX_SCE + 1 ); @@ -1102,11 +1092,10 @@ ivas_error ivas_jbm_dec_tc_fx( v_add_32( p_output_fx[n], p_output_fx[n + s_max( nchan_out, nchan_ism )], p_output_fx[n], output_frame ); } } - pop_wmops(); /*push_wmops( "JBM SBA_ISM" );*/ } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) { - push_wmops( "JBM MC" ); + // st = (st_ivas->nSCE > 0) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; IF( st_ivas->nSCE > 0 ) { @@ -1479,7 +1468,6 @@ ivas_error ivas_jbm_dec_tc_fx( ivas_mono_stereo_downmix_mcmasa_fx( st_ivas, p_output_fx, output_frame ); } } - pop_wmops(); /*push_wmops( "JBM MC" );*/ } /*----------------------------------------------------------------* @@ -1488,9 +1476,7 @@ ivas_error ivas_jbm_dec_tc_fx( IF( EQ_16( st_ivas->hDecoderConfig->Opt_tsm, 1 ) ) { - push_wmops( "JBM syn_out" ); ivas_syn_output_f_fx( p_output_fx, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data_fx ); - pop_wmops(); /*push_wmops( "JBM syn_out" );*/ } ELSE { diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index dd1690fd4..00be6455d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,12 +4644,7 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - 0 /*isIVAS*/ -#endif - ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4718,14 +4713,7 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - push_wmops( "synthesise_fb_high_band" ); - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - 1 /*isIVAS*/ -#endif - ); - pop_wmops(); /*push_wmops( "synthesise_fb_high_band" );*/ + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) @@ -5529,7 +5517,6 @@ void ivas_swb_tbe_dec_fx( hBWE_TD = st->hBWE_TD; - /* initializations */ GainFrame_fx = 0; move32(); @@ -6340,7 +6327,6 @@ void ivas_swb_tbe_dec_fx( } } ener_fx = s_max( 1, round_fx_sat( L_shl_sat( L_ener, sub( 18, shl( Q_bwe_exc, 1 ) ) ) ) ); /* Q2: 2*Q_bwe_exc+18-2*Q_bwe_exc-16 */ - /* WB/SWB bandwidth switching */ IF( st->bws_cnt > 0 ) { @@ -6658,6 +6644,7 @@ void ivas_swb_tbe_dec_fx( hBWE_TD->prev_Q_bwe_syn = Q_bwe_exc; move16(); + /* Gain shape smoothing after quantization */ test(); IF( EQ_32( st->extl_brate, SWB_TBE_1k10 ) || EQ_32( st->extl_brate, SWB_TBE_1k75 ) ) @@ -7007,16 +6994,11 @@ void ivas_swb_tbe_dec_fx( move32(); } - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" ); - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" ); - /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ GenSHBSynth_fx32( shaped_shb_excitation_fx_32, error_fx, hBWE_TD->genSHBsynth_Hilbert_Mem_fx, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->L_frame, &( hBWE_TD->syn_dm_phase ) ); Copy_Scale_sig_32_16( st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, st->hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, 2 * ALLPASSSECTIONS_STEEP, -( Q11 - Q_bwe_exc ) ); Copy32( error_fx + L_FRAME32k - L_SHB_TRANSITION_LENGTH, hBWE_TD->old_tbe_synth_fx_32, L_SHB_TRANSITION_LENGTH ); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.1" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" ); /* resample SHB synthesis (if needed) and scale down */ synth_scale_fx = 32767; move16(); /* 1.0 in Q15 */ @@ -7120,9 +7102,7 @@ void ivas_swb_tbe_dec_fx( Decimate_allpass_steep_fx32( error_fx, hBWE_TD->mem_resamp_HB_32k_fx_32, L_FRAME32k, synth_fx ); } - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.2" );*/ - push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" ); /* Update previous frame parameters for FEC */ Copy( lsf_shb_fx, hBWE_TD->lsp_prevfrm_fx, LPC_SHB_ORDER ); IF( EQ_16( st->codec_mode, MODE1 ) ) @@ -7159,9 +7139,6 @@ void ivas_swb_tbe_dec_fx( move16(); hBWE_TD->prev_Qx = Q_bwe_exc; move16(); - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A.3" );*/ - - pop_wmops(); /*push_wmops( "ICD PP TBE/BWE swb_tbe_dec PART A" );*/ return; } diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index f42bd262a..be0dd84e5 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7332,7 +7332,7 @@ void fb_tbe_enc_fx( elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 0, // isIVAS - is this correct? + 1 // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7468,7 +7468,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS - is this corret? + 1 // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7479,7 +7479,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS - is this correct? + 1 // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -- GitLab From 6513a57e88afb8d5a95ec27739fa484ad1a8af47 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 10:34:10 +0200 Subject: [PATCH 0332/1310] Some bugs in STGE2 code, introduce FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS introduce FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW and deactivate it to test old elliptic_bpf_48k_generic function --- lib_com/options.h | 5 +- lib_com/prot_fx.h | 8 +- lib_com/swb_tbe_com_fx.c | 293 ++++++++++++++++++++++++++++++++++++++- lib_dec/swb_tbe_dec_fx.c | 16 ++- lib_enc/swb_tbe_enc_fx.c | 10 +- 5 files changed, 319 insertions(+), 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c76765742..3ec71d78b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,7 +95,10 @@ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS* / +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ + +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 59c9e2f8c..018e3ef93 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3266,7 +3266,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; + Word16 isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -3292,7 +3292,11 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ); + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , Word16 isIVAS +#endif +); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index f1492b0b4..1e806bd6a 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6868,10 +6868,10 @@ inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_t * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ - +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS; + Word16 isIVAS, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -7370,6 +7370,285 @@ void elliptic_bpf_48k_generic_fx( return; } + +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW*/ +void elliptic_bpf_48k_generic_fx( + const Word16 input_fx[], /* i : input signal Q_input_fx*/ + Word16 *Q_input_fx, + Word16 output_fx[], /* o : output signal memory_fx_Q */ + Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ + Word16 memory_fx_Q[], + const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ +) +{ + Word16 i, j; + Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 memory2_fx_2[4], memory2_fx_3[4]; + + FOR( i = 0; i < 4; i++ ) + { + memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); + memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); + memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + move32(); + move32(); + } + + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } + + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; + memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; + memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; + memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; + move32(); + move32(); + move32(); + move32(); + move32(); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + move32(); + L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + + Q_temp = norm_l( L_tmpMax ); + Q_temp = sub( Q_temp, 4 ); + Scale_sig32( L_tmp2, 960, Q_temp ); + + memory_fx2[1][0] = L_tmp[L_FRAME48k - 4]; + memory_fx2[1][1] = L_tmp[L_FRAME48k - 3]; + memory_fx2[1][2] = L_tmp[L_FRAME48k - 2]; + memory_fx2[1][3] = L_tmp[L_FRAME48k - 1]; + move32(); + move32(); + move32(); + move32(); + move32(); + FOR( j = 0; j < 4; j++ ) + { + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + } + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + move32(); + L_tmpMax = L_abs( L_output[0] ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; + memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; + memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; + memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1]; + memory_fx2[3][0] = L_output[L_FRAME48k - 4]; + memory_fx2[3][1] = L_output[L_FRAME48k - 3]; + memory_fx2[3][2] = L_output[L_FRAME48k - 2]; + memory_fx2[3][3] = L_output[L_FRAME48k - 1]; + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + memory_fx_Q[0] = *Q_input_fx; + memory_fx_Q[1] = add( *Q_input_fx, 11 ); + memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp ); + memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp ); + move16(); + move16(); + move16(); + move16(); + Q_temp2 = norm_l( L_tmpMax ); + Scale_sig32( L_output, 960, Q_temp2 ); + FOR( i = 0; i < 960; i++ ) + { + output_fx[i] = extract_h( L_output[i] ); + move16(); + } + *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); + move16(); /* BASOP_NOGLOB */ + + return; +} +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW*/ + /*-------------------------------------------------------------------* * synthesise_fb_high_band() * @@ -7396,7 +7675,11 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout ) + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , Word16 isIVAS +#endif +) { Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic @@ -7431,7 +7714,7 @@ void synthesise_fb_high_band_fx( /* for 16kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 1, // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 @@ -7445,7 +7728,7 @@ void synthesise_fb_high_band_fx( /* for 12.8kHz ACELP core */ elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 1, // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 00be6455d..c31008f5f 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,7 +4644,15 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS + , 1 +#else + , 0 +#endif +#endif + ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4713,7 +4721,11 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , 1 +#endif + ); test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index be0dd84e5..30be6bedc 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7332,7 +7332,11 @@ void fb_tbe_enc_fx( elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS + 1, // isIVAS +#else + 0, // isIVAS +#endif #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7468,7 +7472,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 1, // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 @@ -7479,7 +7483,7 @@ void fb_tbe_enc_ivas_fx( { elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1 // isIVAS + 1, // isIVAS #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -- GitLab From a92d246a5f8be1868eb1bf99fd1264670041c5d8 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 10:34:50 +0200 Subject: [PATCH 0333/1310] deactivate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW to test old bpf --- .vs/IVAS_BASOP/v17/.wsuo | Bin 0 -> 29696 bytes .vs/IVAS_BASOP/v17/DocumentLayout.json | 59 + .vs/VSWorkspaceState.json | 7 + IVAS_cod.exe | Bin 0 -> 6157824 bytes Workspace_msvc/decoder.vcxproj | 344 +- Workspace_msvc/encoder.vcxproj | 354 +- Workspace_msvc/lib_com.vcxproj | 680 +- Workspace_msvc/lib_debug.vcxproj | 240 +- Workspace_msvc/lib_dec.vcxproj | 710 +- Workspace_msvc/lib_enc.vcxproj | 742 +-- Workspace_msvc/lib_rend.vcxproj | 414 +- Workspace_msvc/lib_util.vcxproj | 312 +- Workspace_msvc/renderer.vcxproj | 358 +- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c.bak | 8216 ++++++++++++++++++++++++ 15 files changed, 10360 insertions(+), 2078 deletions(-) create mode 100644 .vs/IVAS_BASOP/v17/.wsuo create mode 100644 .vs/IVAS_BASOP/v17/DocumentLayout.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 IVAS_cod.exe create mode 100644 lib_com/swb_tbe_com_fx.c.bak diff --git a/.vs/IVAS_BASOP/v17/.wsuo b/.vs/IVAS_BASOP/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..b5ba4cc2e3848c523ea1f3f0f636f280abb28b55 GIT binary patch literal 29696 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 M1Dfdoh($ literal 0 HcmV?d00001 diff --git a/.vs/IVAS_BASOP/v17/DocumentLayout.json b/.vs/IVAS_BASOP/v17/DocumentLayout.json new file mode 100644 index 000000000..f96d16342 --- /dev/null +++ b/.vs/IVAS_BASOP/v17/DocumentLayout.json @@ -0,0 +1,59 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\work\\IVAS\\src\\IVAS_BASOP\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:129:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" + }, + { + "$type": "Bookmark", + "Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:133:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 000000000..f874ddaef --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\Workspace_msvc.sln", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/IVAS_cod.exe b/IVAS_cod.exe new file mode 100644 index 0000000000000000000000000000000000000000..aa3ccb696899271daeb2cd4ae2c93d36f6022116 GIT binary patch literal 6157824 zcmeZ`n!v!!z`(%5z`*eTKLf)K1_*F~Q20qk1_nO)U3?5%IL|8XVDvew7?P1$tWZ#t zpI(%htB{X2XFEIVzDbC=xbHuhEPO)J6zf%O5{^yhmmjC7C1J?h`S=ivW^TzG}os0}Y z^iL-bgWt|UnaLR-v!T{uPywzC3_gs^3~iGC(qWPh7?>Hk8Tqss6ap9+MEJnM2R3Ul zFbFU(Fc<_dFfcek*h~xzY+zXg%@7a=2}}kCP`EaN6@v7EG=pid2vipXgG+NXgAJUA zn{hxtnjr+YGy{WvG{{v56$Swe1&jzTI!mu4wW5T9fq`8v0OBB!UqOigNudG*LxNsW zN@7VO14BSGH^lET+zbpVpfErvbYNg`(1R#rVA;;Zz%U`2fuW3vfuSK9p$HOc2T%k? zIRhR7q1|r+yInatUH>%J{sE=YdKoB#zom?kfuXtf4+DS8AqED9ml;e93?MlL28McF zD1*O6n2CX*+xJi7OGW_(hECr<&9#4&_}gtjqM?8Ot4zHhlNL1F>pAtUVys z3=nG*h;;?TS^;9c0kP(RSSpieGrXJvVwr$gT_9Enh}8gMl}w(^@Vaux3=mbcV*`lF z-f;v(rR=x>qGETv0a0N)1g6Ypcd5>x?|0h*$mxJV-KfISRm-YAR_3%uu9N@ zVT+&x!#+U=h7*Dg43`8Q814u}f9;3ee1pd$n^ z*G$NP!2!w+5OiQj5p-b46Lesx5OiQ@5_DiVbLPyM(C#@9}4K^=;Z45VCnQ?>2~1gbm9QJF9xI*?1%)2BQhb5NCCAbz~UJU%}02w-@KSP zOA8!1AU}fq-}okniGd+3ym#-EzyJU5oDE7lAi2-07dqUY!(e>0)AbMkepim>AFQ=1 z84u>oX2@cC@r6qVGJ(t$$`-6Xf=nt^Y7cABn z_`C|G*a^x3xje+Xd2^c?hJav-QN^|Nk5J zf=Cud28Lp$*K99rr)e=v=@V7RAizb0%js}cSH-!G^cID~znZOd*JN3ce|NnztoChoC*#UOM39uu2kANKk zBH@nMF%{&9sUWdqEutW;485%&D&R#f)DbcuNA!Zk0$;qm33Wt?M1}%L9BSJ|n0P6F zx2wQ$2NO^XzC6Lez>uK=QU=w&3Z|??B0~ct4%I#hCJxgMa`nqjkaiuAGN|@!n6eUy z3=@zzRC_Q?yp#uGI}-x~!)xCR3y>P9UVWIF5{V2OkT_JYI7}R-7nH_c3qqn*0350v zES+8!p!jb-#FW+<`s1a6AOk~&1IQ3)++4Z=4VF@gv~J%YY0U>2L20HtRN$DC2jfcy zka`y+^^0KY`CIQYFfbtN0oemjXSKGyy;uJJ{~ws)Gk-P%NDAa2o(X|3CYXVeDo^Wy zdY3d^C3o%GhcHdWV&4ijyc#cHtz)~WhfQu_7ynhXv=7PsoPZ` ztuw&xbqGX?xkdrPNU0ZxsA1?16-es_Tani3WcOOT8|tEf`QXg6ogJEa;!MFVdT~t% zoOuF;7#Lo%3otNb%m8^Dny^=1hX)kcNuDTve|epsfgxiBlKM)Rdj8gOP)!6%7u~)B zX`PM%$X?~&@A`v(zb{AgOBU;c{Jpk}3=A2dB#snfuzax{Y$9sDH~`KUAQGeroH-Xv z0_O{m7<#@4^@L>3H6V9FQ`g07Fn{rMhYB2b0yn2$n`CSNse$IFwMc4w1&%w0fIRbB z0OCf0ZeN~mk%^rFF=^edKhl~HFs607{(!~)7PQ!(WC9NB<{yluK_LBz1mg^eK88{S z+}jRJ^%@^2;>lZEd`2sNL;3MdZ5a2fpZbqeJ@@37#K2kfV=@M-JV^AdDQ@% zz7rTT4uFyZoow9eKufB*mI-#-;ZHUDC);o;v87Ha;%T&I@t2I4e9nA3I` zft~ikKmeRdSMxJ4yf)z9-wW3Lld*&cZW2?eM25tI*$i2XFD|oy?Fx8N1=0OdALN;i z1&G4=;uTn+NF!%va9ZF2l}0cB@GvlBOhD2y53WT5oYMptk>ls(8IbxpNb2)o>iJs@ zK`mfV65;_BR>;~wA%~O^M8FkP=nrr$kbQyyRC)%-)dR1Q+ef$Fa21B_5k zCrcMNXJ*0#KsDQok1pUe&%f&a4;j3uCOVS2Hf85%B0hLBLb#Rm@6P(B8R-l?FX zCMe^<0#L!_`U4W5K`*X@mGZP6sN+G7R%o)VSIc+;F*_b+HXB$2$BR0M**|$17+%{# zl(W>SWk@Up7efXx<<|`$PVt8*KLt|G2g(55Ub`UOcu0WTIpbxA^W zP2pu=Fg}ph>G}m!r22k=7U*C2_lJJzb`{{??;&D+k-v8d1E~H-Y8TYzWYjDK`4`?M zc(MHwG-Z^?WVE2k&4$U93i9vw{Q^oYE?p9!s`IrdG$uiU-K9L;ENz`GT_}~yYn6;1 zh%ZcFzPPOq@p~{YI2z9JFfhEd{r~^}%X%&bhKvIXXTuv9iZGk`TZ{h( zP!kcgWbuY35O8{MbVj6y5<^&Ap8)$05!bK5?g7O$A97s3)`L_`|NsC0pK%7_hXO`u zQW6L2;ds%{1NH+K4+8@vvKeZ5j<@dk`~N?<*yMt+L1ERr7bMD1%5%JR%U@74m4N|N z^?}$RrQN;)T~k4vjz9@WJr?l7=ng1SSUSPg8l({H?A`G9|NrK_Ad;~}1j1k{5r;6C zOQc?_fa1pql%*J6+ki_*5m3&4Z2%525l~iqt&+j92%H`lFhKp|t_O*e{oG*xSaCBj zy!^nyz>uM{2oW8VE`ZzvZrg#nZD7NBSiz+tqBVgM9sIo~!HEx%(EJ<`QBtasVFGc7 z1k4@#bs_FBhqz-C7b1%mECMB2M6{WJoeYXLlq?Dhr#0Yk0+Ea*+|7GI45kvk*Ahs< zV*vI6BzROZN+3?@{SWdaOTY^gs8iN(frCVy3zUn%Eo_eFS1i`2YUMzQzuQ*;+^%lw zbo4A&qfRD{U8&Qc$x%gaBz2&iDgqk#d+n2P2doZZwLOwLu+_q#HnB>^ z3rN^8`~!J{CE&$!ZAjS3bAlsd76)o+@LDB9XE8WMpZg2dQ3}=ZmIJIKgM)$Lr5qar zLq@`4P&z_5RmTCGA_HD*J`2(c4*FJj)x{1@-l&y6Ke!FY3TnemWI!a)9I(NNu$l~Z z0Y(CamJ{^~83hn0OT(OeNDJagD-H&R39ro|3R&s}(CP)bj3p3_kN$uh%o6aT6RMFB ztWhrG0!020Ogw0F`R5wZK_S16%^hWw0y($B`DyT^BVW9`*#e%lKqkr!TlB3;hD^9DL#5@A{?N zSAc(iposM${$9`!42tt>b24&W9S6W}!& zIB$b0PEbw8)7R-UK?1qa@>(v#2IBs#-ykbk0$vD0-QUT^z%b#Z^M6na52=X{Dj`4) zgSVP}khAk^xr`Wyc~UU*4r)Nc!xC&>0W$+bMg!Ojh}2qV3r(%8Fu(A(Zh@y(Q1=Si z&4|FlNUc3!gAsB46l^y}TtgBeL%l-A1c+mEe?dJj0@lFsqKB10YCQtcXaduCTOH!d zV6aBHj1Lfb5t#gLsJt;q9^nIUYWoSA&F=It#cITg1%3V0rW2h%lm5tT7oKAZ^gD z`oH5KJ2+Yol!}5o1R1D`^+8o7s6W9oAuwYC#96DqgS4;&ya)n2i|55DCUD@oGBGf` z-2DcWiNRjvXnw(DeW5lOxkcG;0nUDq9)=LaaCr81c`XS_uCP8t@fWZ?-M#{yjt^TG>e28M1|fzAL9 zlps>cxB@Z%z&EfH0$!v;&A-nG_G%PpXf9NMf18s*>w(gcZeM}sN*+c~9+-iYML=vw z76G$B(xCB5kPxWp3Sxt@2>-UJAZE}DCMS?5Sil}O=?)cWtm1HxXJ7!wOml?^Lmdye zB?2CGd+h*G&|rs9zz9mvWK8R6hv!Eny z#S9IIQK>Mac%VkLK#XGAz!=nhHlSCuLCb;Rg?)<_Lqt@3T(|EZ$XRDS2185i%#NMFgzyRu?g8DgYv>X^patj!WK}2Fv zdRcr)etc;`L240rSRFKe4920|Z!$taZe)CM5Ry&;USueNy_+!wBEAwP9sm_z0}-DH z6SshhAAyKh!o(Gz;vXR5i7;^vsJO>+@JNIwO#Fi)#NHJUaYLB+4XF4Jh&VJo2fR1{ z6^~c}Hir?Weg#x~0Yv=eXJ|A|fQoah1gpOY6R&`ZXF$Yv!o(Ax;wK>D3t{3OP;rA* zU~@WQ;s#Lh1rYHF-02TiL5q}61?|_OMtOc8M5++^%6|aGaZ-j|QK*iTU#Am|99iZY5 zAmWWMaSf>W8;E!&Ok4me{sST&2owJy5Ako#I#v6Jg>UP;mo@xF<~fgB&CrW-an0NtH`~gIKBTPI3DsHeHY|c!WxC2x?0V3WA6W4%> zZ-9tr!o&rj;tD&!<^;mTf5<@mTLBTbgo!_Ziobw}E5gK2K*b|=g3aNCiEn_4uYibu zdKZ@dl{4#xAfq2VvqFQ1Kp!_)3^~095<{M0_Gl+yW}ju^VhoB}`la zD&7DQPlSncK*bM0#64l+AEY7SV6X>ljv-9^22{KPA}$FNKL8a!01;<|iLZc)YwQJ^ z^YSe;940`;8zABrVd51~@f{HHoiOnPsQ3$r_(GVt2SnWZ&5L(6S`4v=!4)Z#0MAzo z>;UmPT|acXe(7}m(dqgJ)FQE9;BN)ZS%M~vyF&$nGT!W+4VnrLc;OBN5G499N-bS*Ly$%NrKI<7(vZB0g!<&ChLRSni*gA z&SvNh{Sx#-XfMdyptdeww<`~5D2IXJWh1B|{R5-~G;95S4@?PncPP(s(7FhQ*NGW_ zK=Q6%0$!X)lK15~&IoEqy>`rC*ax*@J(4`g3Q*(ZwPFUxK5+A?@D0dxmVg%$Qs8)f zG2#3F|3(L13%=$>aXzdGRATJF@WQ4V)C6iiB4GXI#e`}|n+Mdut1)(9`11e%e^A?| z!`K1Ru7Ru%2t4izUJr2G^$)nQ$=U7tr}+RQWYG&#t#-FBM_?9X7E5<1Ptc1R@VK%7 zXqJg(1LJF5aIl6$=KEeB%ZPwDecNlO(_`f&(U+N`~QDuod^R1I1M1r(I0dD&3L@E=Kufy3?CR6j<=S8SPURm2AmZG zXNAC70dSTFoMi)NslZtpaF!07WdLW%Kv})69RV+v-TVK)`3TDkISU4cUf+&DP|)yi z2c@u{`yd$}NSB56fo+1M`tT2Q8e!bkqo8k-M(i6 zGfF_lF}+}g8Mg*v+zXX2|Nl>TX(t4VK9I3N-C)fDFHZjfMKA{>f)%?%&je+xftYdd z1=PD45Hnsf2r)3gw3$Gr3&D0i0I6quF%hQT0;2wSD+@G@b%*ZhociM*$TJ5R_*+10 zrZWD3J#!%7MHILf%hA~iO4rSMK_u8S2Ldw~rh$`=1_9cGdq*d&gZ zXBa>s2U6SFsUKeHvOa~`EewfTQs7!c<4n*ebGpOI@KxJ$*d>}HnVKPln8Rd)&kPOp{ zgD{y4h|G%zA3?$Xiysv1H#(<2`S<^Sx9gqG))yd#?}JY8Af43$|i9$O_*lff;8&${1gm!<5|vW#uD0 zuLJq_gRO79RN~gW7i2$pYD{6>|Nnoc&jwG8f!GW)Kx2H6^()=IAd$cfjv3&fdh!$+ zAl+ai1;7z#0ynml4eSr)3?GnkrWadb%45LFIbK}(01AtDe4r7ODV?n{>;C`m?gf#} zFBv-_jJ+T(JAeC0&@jtX5a++j)B+y|2L5fXGXnUx`OXP!e#6s!rMndrlATQ5y&#W( zR*8XK3|=U9B(NKtaf0}_x$X$)?geGt!0ylqLEYf$BH+avaD}9UUI_PsO5?y6eBil! zmVk^Jh&SFnf%|Mt*1#8|o= zY^eecOEqDZUVvE23A1#AAjFd%AWIVUNzF(A^7)%fJ^Guv<43ly-t%Tmny0vjk*> zK&;#J2e zgc^15kYtT%bne zjenr}g@K{B6~qeYh8kk64mJehCW!w#r%J2?EeimV3?+PxdqE7&00xE<>(|!ZVC~kf z6H0WtK`q0nAk)CfD8m9`|I7!_z;XcFFY@vRCj-N4{nxtP(0p>^0;tMm3CL)GXvlzR z;0J5qdAXbuGBGjr%)kHtds{&yJPf_T^PsrGuoh-?55#C*n9*B!Az|nPGWtMTXX^ow z(Y+utuzM;fJcC{|s38XhxCrZP6#)kYhy(`(m;qV>@BZ4Ie?M41X!X>;|NpH|l^B9r zcTiDKl>~BlP{s_1Q=0BWgGCeU6p@z)IiSG;wkhDn!Sm2y`2x`p2-ENbv>xOL&&vrM zpoZ%eh7zZ4-z$MH93fN9ovon8e)C=s393#(jZcQz;FQ1*GhrLVgco|RK(&+y*qkZM zB@)fGQ`k#{K+RxKn_FNVB!#@@;@|H&r?VBrPwValQ=Pp#{{8=N44N$hHr=J4pq6uUP3r=Nl2}lCxjUqHLC}k3rl62z>1^d$2bvIZZRqX=u{wKN zLEV$)y&w)lsSZD^rJZ2|@qphwXqbKF21nnE+?OB^w6ilXysY^D|9@}q2GHtbSY=cX znL&l5WsDw(AUNf)1Y}e|4F7l+YWNI@;V%u?L5niLMqYdv_~PMuuzY7LsB6?ab;-Z~ z|KZi_Q^>3$x=qjoz8pN$%@U9?2Vzq@%qBgkO~=?kHD2h&)=MRo{QFx$Mz=fkR?L_FUr8$I5Pe~#J9u5;~?U%B{C%D zfSXZsVKOcd8PL=dL+d5}mVQ=H$pf-2fPXtUhy%N)f_xR!-3rQm0WTgYV)Yd?NJGF; z%Mt)C=v+XSF}*N=S$3Th;;VdCPz1JuY-v4E%KB0Y%Mqm@fs(KBrEYNar*(>WyuJ+WTJg6`08Jc28(&jF-L0S( zli!1KF9*CIaV9V$1>($3@X~mefENZ}XY#x}!NR}*tCFD2wx^I8HPk4D7ntGTxoDPv zj2RFU&0!|q1Lfo+JTJ>wKr6;T9U2DymgykJO$GI}f_fnpes?cOD)2@9TaX)h__tkX zy;Q2$?Rp>}V-Li{r{IYF>x}? zM9}(^<|8~WFENAM2yXQAx9kDAu@}_N4eXu@5(|1EWC@CYjDj6%d-ur zZFW%H^Smqu8UKc-`%E{uC(tR_4ep0@I^;C@_1SPcY zmZ_k!FW`liAr^l-ff8T$lwOdMpcm%mASEmTuq^Hlb7BF+iRv&Xo?`KE?#$p}7Z)6{`4l{v4QjYUY&Z&Dyw4KwA_r^(&r252 z^!7hc7amga@V9IO^=W%SwNT&-H!HA%Q4Kc)jf=p%&;qmI2*iREm<8Nm3j|&+2DMwE z#$5*|4VKPU9ZZsiDd0snq^yM&{U!X}y`b_w z@I^61ycgOJW&saau<&nl{oQ&1)R+Q|^MV%pg4Q;G*x&)oRuBs^p&#Pq!0;k31vHus zo6!G|qQ%g71Tj}+i4ru{9q8l0 z019#t+ug^30aTZQ*w#J{44@DLu?>A37(ku`vDJJW7(j&zXa%LTj{^g!Lk|+?^KoDR zRT&`m4{rwsP)8BOe&_AL04kDclruo$ zDc%kYpmGbempj7Sfg!Uv*Eh8!5xgrpuQb;wv!s|IDYGQFq$o8pmm#k-H#jl3ASbmr zC^az!otv7M?2?+3Sm~JuRm4z`oanwRXE zhb#b50?`|kSdz++oamgNmzJ5%kd&C0Ql6Pol7V2k6(#1TI_H<>m82Fil;oEr<~U`R z6oGVQ7UzOoms(WJkegVX2w^j1B|$|Q5=&Du^P!>{PQ~FxnII!FJj)V`UGtI|5{uFq z(k5hEI54zYI55n&aA4SJ;lN;G<-l;l%7MYc+JRxMwF85ijRV6}8wZ94TL%UfTL*^F z?l(IGB<8_qp+I~NRDQRsNInke5DUD2d>WNJDrH9mh>G1&0;0lp%m7jTJGOu*j~zEal;e&sAj)b7&*9k& zud(bOmjQ`m>>t+viL&l6IXs&IvVZ)6zXL;vzXQW7e+Pyy{tgWP{2drL0vs5G0vs4* z0vs5w2RJaOL1}{k2L`JE2L_h_2L`_Y2Zo3M2Zp2o2Zl5L4h$0m92n*YI55QdJ1{H@ za9~&);J~mYz=2_RfCIy!00)MX0S*io0vs5+0vs4}pyrhYI50Fo*%SO77?$`uFs$=; zVA$dBz;MW);QsOES`LO%t{nmb3=A(N7#SF{WL}(`4{qgj`*L(Lg7$J-ffO(pFfhFQ z4r<@Ia&#l@H1B3Q=D-2k#N91;%!v~;li$s8%uxumL%f?Q;Dr)om^$MN0|Ud0Qi#Fe zVvVC)u-o-VCsT9n4~9~q43P0JSivKtEH6PF&n%l4ZZPFvx_v>)nYw+ybaFJ;eqku( zhiJG09wKLXozxx5(aqG&(dqlAJM<68UMt9OYPav7z!!Y)L9Jkx?$AHSog%<36xTn; z9TLDS-#^D2-+)*kpN0N8-t+>>0qw2)lh)~&@j_k-v}FvkE1fw8sT2bjwO|5V-eTXM zk0pHb=20(v4?+A1313l&!8pTrDR?*-9=^}!g5A*xTCI#dd`lo2u!Qd|@J=5VaQLo! zOHuglmq3K?;wW6*P{cKm6fNo!jK+qzVZdaZF&;pAW#o)z#3gERae;^AbE<|E_37lRe zz-uEqU0-y%zCm3j!x8Y}7i1W()Ab7|y@R~=IVjzFPa*B1dVjKP!EKf2F! z3v>#02e5Pof=_F3&_~Rubs03o+-|njr_~Lt?KST2o(7->}4h~T91gcZO@dyfD z-#^`g$DIT~i)~)iih-sK{&aJI2jbE?1I1os!GzMfLlx3G19@IVpovJmaD$8RZwpmP z>kL!@hX?;QR~6987|!FaFF@(%HT!W_aH-H-`+}jA^SCR>9Sk7RCm`u=UyiQOC!j5e zt{h#yA{`z=y`gV{UfcwCm52>lYw(nt0x0LY{%Ae|YA4PJM}#cl^l}O^a@gsL6qv@a zz?2Dmv8op>FhNy1EHL@^`zmz$zG$v}!B}G5T>FBlgz0q}|MpOspe&{r3_DCf(a;SF z@U%`R9&pM7Cp&OJGm0`Wy!aym+RtLkzui?PAdB(E+3k3>oD*SScySV}g=+^pC}u(D zL3D%al}_J3V0*!q@NW;~33_n>Zdh8UV;Z=4Kkgs^+G7TBQn#y2TBnoLiwcmb#ULUN zWOT3Zo4^+#;CbsG-B&OVBLQVx5!B?p4ZI>x0g|vK!w|s_THnoyAw~q3tzZ?P!zo2gE`^2 zg8*pv)Qi8MB{Jaj0gH^+LJSNOz)^4!JS$9W6c~eB01C}VM6BPum=*$y0&x1r9sXw_ zBZVl5e;=YAfD{+U9R)yLdTZLc<}|ab_P@)KnmD50WU6rr;Uj% z228;18F(=O3WSNlus{H}G#~^xJn+^ZyC6e?C_w^R{Rplb%1`>!oJHTvk=!m^|F2KO>;*kJI z5j!}WzxM2gRjJ^lu?;+lj5TRsseB~BZ4r3bfI91?LC~-v93HD6LzgJw0dCDgnhNmn z0PXmFp)0_^unUw}An_{pLPh{ov4YCT?$8&_uh<|V#ar&%?fQa$TgQu72ZsMDy%%B~ z7{HB81yCFEwRtzFnF;DdF}&99_Wg6*Q2`V@piMe|jyoxUYOdG95H%pXUbF9D6<}a^ zodU{ufeJw{p05NYHc-|~>vZIKF@qme7C@UM;P5L0Pb3o?emB6&?@+?eG!PPg6Qp7t z7}R1N7>r^a80=yl7`$Q~7{X#57#LVVfRUAnm6?^51(NnaWN7!B7aE}0tK|SUyEvLH z7)n`RHpB89|28L3y)6VyZ2>QSKLIxpUt2>(nk^Vg$b_6-Nx#Z(c+PfQDs2P6cDU=>xiAw%e71 zf13wK>&a5C9n7Fg3DjYJ;l#(l@WPglfgy_->Nx)GfdWAEJ#%0LP4 zCFneWEV01P`~t2zpZNt@R9@KFnS%;Xx_*Ef zz~*B{M$o$KviX4ft+QxG#bSjsiT~yFtO;372382kvWeaPr#u1+)&Wl&5tzIf@&4o-l+Kfqy-2bYY(eU!-${{0?2))&DGd%u8#)<=M^^<=3eI5feV zU#E0{qAlnJpA{$(u)N*{?o<_k_hYfV@Ze@(c;O5p>_CJiHz?cv;NKsp*LtbMDr15% zC{TWY^C!$brFt2l&5PZkKf0Yb0$v=0`L|T88?>=DkgxSp33oSWi>8M`>&epc7f(Q^ zmw-(Q{Q>H=Pl4$uG0I}>hI+RiE+~ssA!WU22Q3r=t+?c~VFaD22I{f@Nb7Xedy&fp zn)iqFdJJB~gVceJzvEJdIJL8=wAUR>m4V0iI{6O?#<@b7oh zYduh^1okVWTq$aVMLbWp>yv;NM%G}zft!S&6TmvX^twT#!W?PcfjnuQ0S2I~<-p1K zq7r0o35dw&1o^QO#BAXN9cLyFj=AnYj-VIDO;F=Yq45Ap63!U`@nH9WqM#A(0G)2% zAIBL%QsCA;q%O~~s9Oo}nVvO!8gIXZ#O0#uekni(-KHgbTR@`r!FQ%v>=w!jyT5Ivo)4?t~W*9VfSKXii*Nc1QH z9d860Nq`D<`%I_+w{@})F?9Pd3Umi5fI43u5uhcxp?{hWMey%;{Q$DnrLkfssG*X5 zlA+s$L!jG3p)-&N$&}_w9)=PVf zk!~jikjn!jIs;fhv3no_rmhF7F7!>e&qR^#K!r{xp4UrZ?wisGGNrjnfT6?$Rjk`d z0Bm9c%)|s#6T1TiI-Pi48vg(P{{+uoW;=X z`y>!tVYod2Ri8ZI{QaX_urq+=#b#Cph6!1WAR$l-qNEP0kG};pBGDcC1SG@J>1FVu zla+x1W`jh)3oW<}p;?TO>W6(5xZq0bbQJ(OWWSS0>jBVk#tm?5mHoKu4N$X-f1B?O z(9%+YAjqKB4^X)QN)a8P)=J=uiQvW6A`lbQS`UzxIvmBp!1BO`=`Kl;2!WY2>8GvxFG{NvH&s+mIt25=YS0FeRPEw0d2`Z zD0K63@S67yvR?vX-a=x`lfh!15_Fi72Q*A603N0k0S{Ah1iUx{cCi4&2762!K<*7g z1VA?js5$co+-g8>5zk@(EzRTsO$UJI3qZvPxOWU{fq}CHM^F~S3%LuR_JqL9ot(A| z4BvkSfUA$}Pye#mvp_?%-5wl)FIH^=C&qvmA3=+Fj&P)PPjQo&IhBEb`=NjrwadYh z-M&0&os2K$gKCgaP!Ak5$jZaNT`=f{G_xtB(g3TdWde;L$3eW8;DQ+;p#Dk)$RbdG zg{`@k2XqQB$P1vuc0d^v)a-}0Iwimjq;8JxP@c4IN1n7!rWdkc^R3^!U~z#o8^QC# zX!J!kx)5Zs^-@Mr43^50iTEOjJ(D*i}OUS>?71VWNKkoVm z)LR7Qyr-y}D^L-L4$U zt~{WD2iHHKSwy7Z1&ud$yK*3m1ovNYjekLM>ziKJFW`~-7w;j(39J_e%5pD3Q>Bn2 z4mmmlL|){8s;6}D*-O4(T2Gc*gL3g3NZq7R4y|KKR6*_1H;{HI7hIGd+z1Dqp!kCI z|Ns9Jx_#g9?+@eywXCc!lt^^@zDes2{gT!h2->WB4AeBe_wWDz3C0H?ks6Zc!0;l* z0g?tm16&&%AW;cQ9x-{4{jH#spONRlke6ES1YdlD6hPqcz?J^Mz41=pH{GFcK)tgU zFY5mN|No*AM3npkEzI`iX+2pY32D=V)PVXhUNHZaDtCvzfHcfYtRani-xr`d@WuBs zSimTQx*9LQT@5DC%Hm7it}j4s@fTnI{{L@$;H3*_d&qu}HT*5=j0_CWu``ewy%!h$ z{{P?W`vW|0^x`nMkI2#K`k}e@19&Lq!%H?s28I`>{(`odz2M*OVFap;e+0egD1};I zDhnEQ+U{Whk`M`ckq?vLZvh=!333bQq~cBwqZcWE|Nnnc4=LtmtII~jn7w)TS6@Pp2^eUaAb zrT1bDNC1{%Itm;ZUTE1tQVb~b*V#c*Oxgrcnwd}lDYrmrW=;V(&A6o|d*-ENCMTBU zLk@ZYrxyk2`2B-USL{<#kck=@-M)bP zR}6HHPV31!KJa?IA1~hh26?$G19VOgsQd=ice~)KRY2{r&>ulBz8675xiS$I_307rWtl`N89_V8@n$^uCzz`~UwJ-M>KzJ@iNGrP6rN zkis9x2$V}P%t}vCTM<;J3Ix2+gNqtN-0b@YoZzp)#gQB+2(sig*A6z&0ER4RUV{ZJJ8464D zLF?OI?D+Zre+I)BM#vJ2z!x{*)@y*`k^?eTV+0o!$^b>ti;X|QRo=@^P^nS^Hsb{| zWW7eviz#r`8d*%B=H7M>p1>FH3Sb_Cnvn}N!xdzP0oaT?tdQ~9fENKsW-xdAf~KE% zf?ljbH$xL@255%&#hV}h|7Qp|Fu?qB2d*0Aj!>vy(%_;{cRc+8@ylM&Vv-dgGeDyg zpu$8j=*0}UYE@8j;NS=QMF}p-4+)Qj5Hnuayhw)|02+b~co7a)s+z?D_sGM1SYSX6 zNPrq(&A-hRv<+V=gW(rwfCW4vy%=Ifw=YLpr=!Y?C*MIO0YB(4c8;{p0F@V)K?2|= z;7&_$%K=iUfzF@OjOhnO0eJq7CkR}Lfpg)6AK=Dtzzg;hP)6Te5ChcwD1jORF5fWE z+c@qDT6O~oWZ2Re&=fPcZ^RMwV(E8KcygdDGVtI8uZxfXjf8;?oI@IU(s&{A{r`Xd zZLX572TGKXBy>RaA!z7L>&2&U|Np;u`wisnFp#%@q;&@9yto4r{r(M93h;0Dl?r?j zod*k5wX78W?V(aZFC^eX!l10w?JJem>7n&vA=oUg9iWS1UakghCIbg2$XtyVEg(tI zKvJkcr{IgWZ~y;i@PO7hxPk_3Ubw-d&c8eK$8jdmNi5)!7F<0#nt(=hTz{l>dzhqk zdYQd&2RYIRMCg9|{~yx9}X`~qrNL(0`Rxlr%$xA-t4`r!fr zFD@Zuj6fsNzCS<{7cy7CQ#&(S50n~01`17DFO`TuQt1D$pjcsfxsRQJ;WaenzlMsf z0u2N+fre1QC8-O-bWp1S+|dFBUT1(Z1p~-r7P!e1(anH_$St@q)Qq2BAfd1Wbp9*@sK|m?_7Gj+1*pP)HU@^5XFwGa zGsH51fEOxo#af^Yy)6*5pyfxvi#6cm5Kt4oKS+NMNIwh2!vaAso@7IVp@j8iAxMf9 z9`q++Qv5BTZtx4qFaQ5%F+ptR33#yzCS8&RYDNFx2M6F0xM&D+0OrD-DFPmfgGS+t zrJxfZUTZ>zXCdLV32uTAbXXab@5EkIft0>H%fP^p#SU?VK)?%Cm|}<M*kv7lsF zIt7#rIl6uSbT)#88meTrYC}AgI;_!0rk3hK(k1oAu0at9%6wn zK4ihdNFCy*&<{Z`X2WbQK}~U&KY>aH%`6VM8yn%;g+X(qV0VB9q+YB5D=h})Tqp24 zt{2ljfm+wF#M|)+?AGQ(YM|LDP#Zq%38>A$!M`80Hw2oDHhqF5qe2#Nwsif$zuiM3 z@C7&ARw1NJ!}G!zWa$gvPyheF@Bk6cpJ1&%U!Fijc$RoVnhT(_bOhjDHGwoZTzLXs z{Dzw^4+#{I_GfTGt{qIE=F=Tei2#~5;^}nacyavW|Nqc292w9UjskcLM+G*9!|@s9 z69JUMdNwok9ve^tq|+-hb|3%$hxC>pS@0d)RB+1!G^VK+@M1>>%q}5t zlN9Ep2cR<}K&?98KWW{8S!taCIWNw90QGKuG*<{PlyL5JIXs)8^<=4dMimR_tm(tE z88QwWp3U&$nlNb1JkN`LAO8P;vGW6p&#GXym2yLTCeeDJL<`bD2hAIC1if&FJ5wkF z6x=VCeE@|Z%gartta_gmVvSqV&s+yW-otB z4@d@4R_sWJ`CloE2^XgL>FGw2TqB=-fHw!K*2AV|% zl^+5@FG66VB|;hepyd^p!TT{;UQPnF%%;8n|Nq5A5Yh7<9KQVfJuF&JmSlrYeFDXj zK)?$jm&a4Zvk+vz zK)?%sm;#vn=iWi$6?8HJctL9JTF^i`3(S7jZr3lbi(x(x2zbE@GoeHoGNW-3ymHD% z05KC1%F*q@DA4J|@|p{LaTTcA1h;s>4FhCz&1QJfBmmA+psw~0a97*$?f?H1kXuax za0668(_~EG(ju+X1JqoCw4q+`g4`eh()d~sl(RWN9p6Bc7hm6i#)H7~yJD>;>oh?P zET(`LdZ$6v3=98$&=n)la#;$zNtfj%Gb01T>%#8PA4uhR-#t(vgj$ZjdIO2$%b=$J z+BdLL+4To_G&v>}mVVVBl_hwF@x|5@m@q$lF7rhK$dRDc9MI&%09T}h(nbK)FU?2b zZ3J*4iU0=&tYl+*1IuM%ttU%ymaz92v2JtR+yMlU0CNH*vcqbvon7vpI;vIl=rPN-`1o5CM zHC}Xscu`j5T@@_v-)uouHLL5R5U-L6eyf->AHJ4&p&oTD-Uk zI@7`W&5MKDh-d!w*AAuKlD%YFP2)+=;|NPpn?k{AH(ar z=)=XJ@nX<;GUPr^(D4@al8v>0K#UUS=Gs5Z<+k0vfBviV{%Lk#cx?#km+_=^3cS{X zCTE_sPOjIA(Do!~M&-50F3?;=w<}l~`wq};im#cB4}dJ**X+P>qS=ArYO@2wqh|R2 z5~%&4n?Fl9nrr_smhik52Ng45!$qLM4K|#82ZI9x1I#?A|C`_7UoQ???GD-80q((q zrzJCDj)2c&;GGQ}nBQ^&R7&uG%Ow8&fuK&6R`VN8x-ko? zsUECJ;I(nL>yOX;S`450<5)i!PGI=VA9Vn%S&&5~V*y0dVwff`h$dLuULfejj(AvM z;{>YP_j^dRo-C2dI0Dg_1=A=9*2wW%B7@~9*zo}{neWFzj^}uJ7d+qfqq$0esni)_ zlvwjmmJ+E91Beben2w_m9j_%aQXn!cFqzd5nU@opzzc_9^Ufl0H&(vLcn%s*s)ctF zcfjQ=Kx09mhB8m!i=a4|uaqF|ES`XjDGDj?Am^}v`~>d4w!#gshZru`dY}Zf!2ZM0*^mYHEUfdO^W&h!GBN=f49CEMCJi(B z&@oV;2|#SNXuVV-k>LVS@?!?ndGo6bxf#6VZ!b&>e+y`}P`B@o=1K*IQrV0J5dFC@{UT8PpdKTr&Z|;jES1VQ z15xD;Q}ymB$WI)v)4N@NG*>7vl}cs&fGAOcDLD;Q;sUXYxl}4c<2X2E7-33QK$R#$ zEMh5@$cTU_xi=jeGObW0d7yb&P=pHvzW5je^FB1fr2;ZKAo`ZU^!bAI@w_(6Vh060 zcVB7xHBx&$}T9?}wnbQ!hb!Wxi9 zVMYMN_#l|^KM#TY$OD;I0G%W8auIkP9;jEq2U;2XA>c)86g-?kSMX#pgCYo=`mA9x zCGL>)A{7Wp5>lBbK#i2o{8|UGm+KH`oSp&=q9U*}L|((f;{`lC-au3?gsJoZs{~#0 z$kTeML>XeOUhBzHi422N;GipmDU}5)<$z5GM07hayogkWOb39r`m9xkwEMvGSqa^c z`2f(|Ku$M!J_|kv>R6BozPNyh`DMi9F=W0z5OnVY|9)Q{>w`61Y2cPn=%3f1n;dz- zCoXSCo`nXrM-b}kiBjL~%3R`A70 z=DQp~ci@5Ue$m;{z{J1+nznwexbpxri0S*~wb(8QGxSRa=nnB0$>9C)EH7sN`~M%h zEVVFu!*;8hL)5;s179f!S-;5fBJtn<|KLG9(0V%GKgV4dL5mU?UPOY# zL2;UWhym0r`U6_OC-A}uGB*yo5)|C@`vGnGfo~;l{>4ONMud`jcbF$`!nbUpd&0Ve}PsPyZ!+!2?1T8$Irm86|;@wJTuBWCb{xsJ+f_tX%;b z7%%aK?6VNup$odKtg}f5WaU!OwDao-kbQzXqL3tdz!LTli7iMH#b60Fhy))vtwD^6 z0!#2hQWY=6vET)aKS0rpdN&$q0b@1T2vA%fZ)suxooEE=h^YMe|33@79958iKiJ@a z7Y#k2*&ooLEvTaM{n6Rd#Q}2skKdqv)}L-B&}=lQLq5er1SEa|Bo5jw3cCCS)X8WG zlmLnE08Qk+ECAiq2#PGwI>bMqL171JPzRMK1C(?4!KvV02rLx{f?avMNr9h%fum#s z!|McSQUE2E?bwxNO<;I!2~7_mWfQO~1DPfS39fs;K~(|E%cr2JsQsYBb*KtI1H--3Y^<*h!F__`jUa*d zsm)BFCc~d@rsEADf$y6f8DB$!`FImZAfWsj!;9s=Q1Zf!VDwM`?SNtMpMe?*8*wW` z4uvkP$~ppPz_Z2;a5IJF<$chCXi)qeZxn!~3!Y!#xIXR#9+t|OpwGbYLLvd0UlxG8 z>bs!RgQdB40X)NWLX86*uLw#Vq2PpwxEvIeYMOsC)fR&WeVkZ8+~X}BF;bv12fQM? z8!i|k4iU^sK&Z{U2)eqww?!aDmVqJQ#p{KjM8uJm0E&k|7Erp*JONfQg)2phfg$L{ zNr(#Y0f&&mbkMl@WO%TI?=%4CGv7Ba_&_u2pj8(v(2~6a6c8`I{{ROWEW`RbXsTVn-_~fxs`V2iln!pECH7Ab=)Vgp+Q%`__^)6y?Duz{MU z{M%jM1iTQfgBKNnENPuhe4u=P;5%sa=1;c=%P!Dfm$Xj77i-}{#~r~b>cwi12sp@( zJAg(`7+%Z-iGbak)(ti&t<&|zi(+I^kO$H_U7x&&1x*ug_k9tVVO$JLJFG(dpoB3= z43scHwMlm%3wXpK`ve1cJRq&Jg$tzSh5Yyb{~;*?6ibbPu)vdtr?wZn&dPu)@F^Z3 zD_^_=P07Blhr}!>75T#Sl!`)P0c4N`Ot2&rWKaYm;9M4kiBmCw8TIgN^kA zyJI?N7TEPqcL57%#SUm?vMWsGg&hpsAeAj)V3oNb2S8GK@{M$jtTl<~~e6gDew4#us)AbBU4`@?MWDQ6aM_Q-r z15lw28dUXt()<#1`}~L3D3>gzb%U18zW`k;4q7%3YB@ZxK2;k5GRgHvzzch*?b}ZT zf)2WWVSfW`GAM_4hhFGp>3XsEE4VfPqucjFw@70U=%lUs7aYwnWgno*rh%r5U$=mY z7Y~->jVa(J0|Ud0y05T|c)TG4CYT8l1g95}^P6%&Srath3<;*@Lp+_KCo({j0^P1B z0y2IWPGEQ;CJas+U{SCeAZi;AonZ!*7|TTv(hxT^9t7P58~CDjE=Yz0+_m}=^g<32 zO=+F3H^6cHCEx`&T<8k4VgofzSp8sWOX9fe0Z>s6ZbGGXhTeHG6LfXJ>pZ0T?Yb|z zYVfFNTBq-w7ujId4$x{2)G%6!q8e1NgHwB2r|X>;wqVuJjQasPfBhXa>;n$4#zQ{b zpfq#@?D{(aFLbYgqav--^$o5z1pj{D8`cMFeLO!tpW@%| zdZRlOqKL;Yt&_*;MLBq~_)oVJ%khQ+1xS_fq6j1i_Qmn05}05tNDy48f@+?L6`-_W z2^Qn&be+>!I|tTq12am38*Asl8g6sI4L9}I#f`Odzzw&6*BOvxv10+Ge5?Ugey>6E zwy&e1GNATAT4xhj<|0_e5h?>}M8IUWgJsmAGN6V7OlB@v2HJQF0MEOEw&8XMvZQr` zO$C>7<)8^@uvZ%o)hK`>3?!>DbuG^fK*W<(|bW} zhh=)ND`1mBu?@}5Cq6>b0!pSAu7@duW%`AnDd5*FpiJxvZZe==TMg=>m_c$QDCr$< znb@EYO$zBBVHFKX24p}>UK4bxH6KZ_ ze)D3A2&7{Snq8=v<-oAxKjdt^mRaC?{o+%>y7EsS^fY2 zYv&!1B-aY&neK!nvtBSy9oof&sFd6RNoZh|kml}t$h7nebNI4ZV(6X1`{W@gW_^EviuOnELF~{UPz^o-Oo1=>kaQe; z#L(L#3egezqmyOgiw*BVO(oE2`25?!t^|!^i3Glo@PHM6CEzu{FxeOSC6F|;{X}3E z1H>7J7X%SCL+x zroa~)AUdJNHfZs&AKWD(I~>4;Kx@P5|Nmb+dk5+U7eR|`(8^^Mgvwo@CGcsTQ^6|t zfK_^AfZ_tOdij?-%y%L?LBn)uoxNa{lfWwFz`KWGy6fKk{||{e6UfXrC~ddafSiyF zQVxp4-a8Nf|9>r%);$%(fNWO-Gx_(of<&5sF!A@!VFevoKV>y&qK1Lth1t9R|G|2D zKt@S`jk=W9IrRqAs8$dIvOx~a3GnX++mLw(6q4`=0Bh&p4-O*! z^%r`1CU*8#tOlhDu*~t6sR=L#Yz0l}^6v*5e(^zPtH^550r?=3tC;CE+ly3QErtok zC%dPDgwi^DM14RG%?IfM1p&750cx@J1^!+x(6GXO-yhvmLDqM(bb+oKLgKv;V}~?? zT4h%M|KB-PVKwM>5fBMFM0@rB|3NRdu!2>jb+$@?e6Sr%1$6hKDC!3nt2~{^#(+Mz@|(E85Wc!_ae0roF3CUTTMU`kbvmzaRqrZkbnDBkZ4dh zSXTfv@cFk-@dZf-L4&Qkrxg^OfiGr00GTDizaJdRosdv|5e%AqetG>L=)ixFX#rX1 zGphITd4S47P&WyjHu$&qIDraE&~7tuuM3=*x~Fu2iq@bP_7IaHuJ3KtSpENhKzA?5 zE1=W(K`EjeVq3tAE#R|zcsg5cK>pd@3$hZXh<|%aD9GgjFY*dNPUYa=egfo4kax2bzV_}(E_UR#ru086F}4IU^jtPb+&YY0{g{c@KpkHK~4_kK*UAw z6c11Y1!XZpqn&>{G?l!#m^n@Nb72@?suL%K=nhboVrY91-}! z7wW=Lj&3g&XfE%B)U+=cK`!iV1r-^D(j@=(sUT%R-L0S^C*Z}myCA2Ebb`4r=luTv zA3PtN)(I|Fz=anmH9-q65EJU7<{zy5y`Xa)dm$+bnuw7i&iIzjOkf z9lae~>4NfM^C6C)9iVdc-~(9Q7Km2Yfs}PSf%d?ImV)<&^Ml8s$I$6JA)jK%2vQNM&^q?1IGN59Y2c!bhut2Nw zgIt$fx4fdoR!uM9vMpO?7aYzxCWPC z1$W9@H=O+cAKU`zow@*=B3=4Htr8CY?X4gU0lmFGw?OrSE<_mASpnCmpsWBcnW2?0 zr~>ET4=yO0e=_m+UISevg{AWC>|F!4aVp52LA|Xf(y9fZW5w zzr7Wt0}?MR&=v!#QvUs}BK-To0ib=bdn(ADUY4eS7nhhJCP1Wmr}TpC?3}s>><-Wo z$h{zDAVf#di^UM-kkTDmvUImh1dZ@@w(d9ys{TPF1Ahx>pCzbq;tTEspblX3?*|9C z^+EpL>!7`!-~t8I3jl{8sNevHAcz4CK@byKJn-)a2aolsS`TRP(%lQP6EqS58aIS0 z1Njo<^lp$Z|4aktih%B3P)Qc};tZtXhLmKlr(`j9PX$Q?y$CJ^D}+d7)KoS_!3w{f zP$R%SqAB2r4|>r8F$W~p*#Z`OvG56~NZ|Va|NrYWkaw_+oAU3U3Q9lLr)r(Sc7UAS z4UT(|Ctmo$t#bX*-O~z5W0EkdLVt9&Oa+O(FaufjdJ%eLfW}}uTepBC14J_LxBP|e zqQx2+z9Q6%36O;#Pk_9HEhdVlf&&;H6HbtJ10=waW8x&Ftq+j^hY~C%^r1$8LcM!R zFC=IF0+)dtAhFICu-FUn$Do+t1;s=%?wAM_!4(b1r$C$v@=AA4E6AR}7n5N2fTIB< z_G0}bP&Z=fOO8LFWo)3CIcWL@kG?_bM!B?ZL>5Tv2Dg~gnn7c5U?#}f@I=Ai+XOz6 z!u3aYFQ^291t;7MdJu3-xPtmx$54jw%R)nWYGL5KIOOaqw@ zsf2v3pq(TB7VueA;DxYGED)mtU+~$$rTal^qT$k@0ieJa`>mnUCA#n?(Dn|{AW-0o z#i<}$I6&pP7fV`aBS`dx9LUM9ML~j2ETA$6toQ{xNEpKeL73Z0#2^}w2BV%n0M&os z@)l_{>O4sFxq9mcr+{M z#jO;GN5Gb)bvA)L5(={EwJ5|AP?7~Jeqjd^1})}5F~P$U7EEFg4aXZnt^y5xypRFu zfO!w(7_cZCNc4rkga7|uaDxaC{{`a%&^mek?Y*G>Xy6Man5q1&prgC9_`us8z>~oo z{M&s5WCCBvL!1s;q7L32bnpRqdteBoNKgg?gM#0SzKLMJ1%L-IvrmAcmw&qpmrTG; z&}2b2Xz?^hw~v5G;0u+jAeE4&6@UM1P!RKB=z6g(8Ker_Yy*$CW*L-d^#+h$23Se<35Mo9T%dxJq0|WyZeX__e8|wehXW$61rbL| zF5B*b*8hNNXHahz5`~lQ{r^7!G&c$o?rs9bNWhD?7SO2TZvmZ~4r!!x_RauxSdlVW zVE0r|E(=0d{~y$q04JTa?unoQ%Ct^!-SI*bWI0%(@gR6K5nNV)5>4n2{{7(g38H*? zEtdw`2Ge{HG#&6GtsC6OOly9{2puf|6>-o)3se<=mYab}mu_$isGDa(AcO~YFwca* z7i;<p6Tpn;&}cR^(kqI7{4|J_r;g&0d$z>89dHfTQ{Y#K<|E(>ZJsILza z1r0<+-UXFIuK)l4f2qd^x+M!#)^@gnq#+Rp4cu;U$rSivr#U=~|AE2`9Ik2I9gr{s zw>MsVy#p)0SiwOC_8zFf04?M&+im*Z)OA{`VW&~OF~RzQLbnUbpdbU+^5AwWv`2&p_ZLnOZ2=(bx*@&?MF4ju)HLJ>P`d*Q zvMk89d+=e*;P?rAAsJ=P(0oJya;U_ozugTDO1T-dU{pN-5 ze@*Z~^%J-m7#I$$hn$rGT8pxEg98I-n2te?fnn_i2L@2p(!kEZuw;V+1E}HHAi%&d zdxHZ5$TOhMPu~Uy22i|#*o_+;7(m@gkU13_92h{u9-tK}86b03|Njq~TnyXbzyKO^ z0IBia;J^UtqJh{hAT{wNxdle?sSG|KhGBdvLvd+R8t7h;_|&}AqV!5k5r(u1klOfE zhLqfj_=1eYc<@arU`~EAl#^JJ7@wP(%aEIz8(&bATE+lU6Q5SWkepuxISl|jUi{+5 zEwuIZOrRwp9NmJ=RtzPeBmY6i0R+96=%5WcTnPUj#s9LOG6uybd~@a_?VF_*EsK<o<_k#9I?L5KE zfO&N~sITa%5b(k-0i0MsEfeUdDCoFs3u9=8DNzM4-cIYB`U13{>B3FuV)wMp)+Zo= z{Wn4F8wFTjAFOEg&HvzQ52u1v%mt|cm4U8bK&w@Jzd#oyeE}UI!oS~D!TLh23+MQ_P&4$SWs5sgREEqY3OX}{Qz=T z9++Gf|BI;*P2i&_m|h&e@&A9;fBx;RpboDD+?E6tP_I+~I%GkIzTI9Izh)^ za&(4104H0WfEVqM*Z|F9cKdQP9t5pI>hyil9m)fl;q9C{<Wpjq9{)(M9o zEg8^3-rg|1tpSH2qM182|pFuXW<4HOZ{u*m_P zz!&T&icE}+8D1;_E3(Ug%nN|5c%+YP(yW=13@_@ziX@M_9sqL-uEAyl)UJcqErD+w z{Qv)d{fncJhEAvJ5m;uMa2Rx+$TetY>jCi$uKoWHZXIA&Fq6Z5N$R5wM&R(#(9I!gj92oz0&}i14 ztDunJNb78EI1IHD+-_9pX5m6=HA-~z2n4>+ZwF`XfEU|-LCb*)pwV=YlR&xuFlpRP@tW>^8Y_1 zUibUz1isLM1sZ=#8w>P=p0rNvoqN|eGqn$0`~fc3Ei>O`?m0&E`#R0`bkaa90|i9pN>c)<-}bh@7Do(gg))cX*t&q0DG0L4CtS2shY zAl_F2d*2^oR=|sG@!(+VbUo4S3tIbfA?QUjRDHMWnE>$h!bMPl7o8BrAlG%aOa&*e zWtTw35lG>Mz!#oSh25big1TL=1iY|-3cR=v(+Tc$gA(D3oJ*jA#?T+2b?a{eUhsy4 z9g^1B+JY#jdO_^K7YDVVS&F~qGidJsEcU@lVF}<&3)lce0sw37hNgjaP+9){P+>^e zxI^3(@M2vYST}Mqm?|~mkXd4e%J5+|6it%PzqTPUkU{^LgF4=a)9zPqR2uoh16k6LAe^97C;RQNGasr z1U3qh2z`IRQlJi03X%;WVQ&!wQT{?7!az=bpfe93rO+pcr2#1RK@#3|s1(T6-M)}i zR}3*L;Ki+Iu<6LD4&)q2lA88K0139sQybrP3 z1F93A(m?h>ys8V8f_NX2#!f=a3V2}vVIZfmzYSo=2f)+V8>qkwW{6^t>tG2?;T%!| zI}B9_Phgv%0xu$AIuWJNv$H6rP zo=~A70|^3cs4P5WAX(-J#L$2jyCDovB5*ws(CvF6@Wl_v;@kkxnoMwo@*FDg;$H;V zDNvVow)BE)BZ)JhM$MU^Zr2L|FLp!KLMpZ^K`&N81zrR~Y(i)T7c{p|g9@7EpsfIq z<_RQIL0p*!)e8}Wc&G~E25?k@8Y$3P9ujD_a1Ee50LgPVVHz$#TQ#6G-0cbpJRZ0P zP)>wIw**YX8EA_M+4|eH;2;Qqh(VlL4%2V~v}6<5NLT<~ zKZO*4RZxZS0L+96ybyp`1Jwx*y}76U|DUi6H0FxEiP-#;i@*0gc$Df0xaGpXAKV1z z2Q9G#x4oGU!J4v+5PLdZ?_}J}16||}9xVdJaNvur@8J#L7nW+WfV zczn-0xW~I)?*zP<19dlK9s{K2g(PSO6Er^AG8N?RfEOJwJ)oxDouC&PD0)C@UOYVk zitz(M-L6LhURZ>I!vf?tHK^ZEmokEu%^v*03>y7o1FywB0&Xw!?{5Wlr@#wpdqJHN z=8N5~0^p*_6cU_Z-+;$SLAFA2$`o*>4SHb|3bqxJkb7D|3c#jzL)w@DFBU=-ys&r# z8qnkDY(26ZwEF49a?s=}h-BdJ*~!4bP|w@E7bL~N-?j=op9JoDWnZj-bv!^x18!{A zTWE-$2z>EwCD;w10e*1k+EqgMNTIv?IA{n1-090cq|xpBgnzq;BRDB{LmmA>0%qcc zpcivsCW6w(*rlzYPGa^64M>Z_3pIoeyn(v(K)?$Z zn7Pn6odPo#T&aQ6fgrL=E3mpW4`$+ppckK3K>WHL>QX0|iQxG@P;|W5e+)EBd=x3& zieOC*2{02c1ig5&4D4Tcp=ts%5s?};9>GYrDOl4j2h7|90WW%B=0el$ol=NBNG^>$ zg5**gtS;U566*I0K`*ReCW4aXoxm4eFcT3jWe2+yw0Q^`Q;4+nA{wF`GR*)hYL*3n zT@?UT4o(N)l=eagt{iLzD7FJ%um?hvznFIy8p)thzs{)}z>y3hkxC|z6ue}DmLurC zgcy6_1;UphOTkva<6{YQDe-==FG1>GD1t{%pd|=;Oh8;;2Q%?NzzZgriO`q`f|&>| zK|tzXoIeDLVbCSR{QIFUMNc^(n*(2{!OXo7^kUT#RG0pOEN6h0cp&vJ$`65J80^x_ z6W|069_E1;cOc7yUR-<*_5Oi?7ojjip^jY&GZf)iC6HsgL!ot8i9gsCpu#B?bi(g; z-#4H!@E<`hs-&R92qi|)IRWtcGdHk$&`L6p882KQ76yPTM0L1fph6C_F0{S?x;)7D z$8ksl6gRwRw+3gGNC_tEyhNK`Q0s>y#cn0@)w=cn} z^%f*30$xm94DrJL&^NGl58px15OB9E5C3+Kz!w`_!3sdf^>;G8cys{NoZ;c$&(V6a zmJfE)&5P3q{{No<-96X~I?3S0&IAAd?=k|f9-kTl8X#N&QUaRvXpK1xS-RZ|VnC)o zz)b%AQ$ZrlznJ)YLF)tf_k)#o`|>pJX#`Iymn1^fWF7)-cI@`$>7BwDBMvHcVM;rv zG=f%Fb%*lsZwK$A19g%>#&(DDbhmVYH9SnvEQOpOa%4Td?2Ff|TvH5lgn^@iGI0~!x)1(Be&#)m;` z^A1ARO$BsM1sMQZjeYq4|9}^(pu#T>Li7e?#7FM+?(PM-B(Qrbhzfeq3RTn%_C!E; zFUT)}FY=(mFIu5`U&O#fiX~v#N)j}UF%=Y`K`-7qf!&wZ*$U!!LmZf4Y;0WI-3xMT z;0tM(0ZBK&WoHn~y%1HcAh!p+_*wuqC*Xw*Ox25`>mc<4ovkmx73!Pipf&IyGO&9p zNGPbg737xysLx(7!E|;{1$ib2>a`cIz~*oS1-wuIvjl5dY;p(DC$BZyfsnAG976lrRGLxA%hl8Ti5#ye@+WGzkYP>$by{Jvao412M>S z2VA-rBpjHL208^+$_3(8P%3v~3CNf^b7tj>uaL!80WWyGz_OstIgTtZ^!EP$pHX1T zWe!#R;;k4o7Wi90tq9O^44&?Zp#6tIFD8mZrgy41sbR zXb)n*3j;@(U1^<-AfXrQ_J9g7A!uPS0W3BPB$mb4?aRZzekY4gC#E=^QXeDr?!_{CuE2HWr7WHecEWbu$mhSzC62+-w4q+zOHextReZIeizXt^*hO$6KcESr0W~ z!Y4xz!m6_3|Nj@?cY?0f067;l#s*s7 z0v@nRYd!>81_TmI105vXd;qjF_y=@A2)tfdj}uhPgN9{))3d&v()q1i-i+}r6 z5HqN|6{J3(yBAcl1-`g;3S=S=a@hy1PJ3HIL0$%Ls0N!7_+qCmIQ4@%2cVJ}beFN2 z9aQK<;EP!ZX*63Hu7GR-&p3cn%yy{R(4^Bnr56-6K`(BA2Vg*ptU<~;Tfo9EChY+E z1Qc}O@oPxXfSE7KA>M@r9e9)rA`fQ12#3kP=)DMX0=}R-4ZcE&_@JA85@aHdpaZ2o zXhC5D+NlFJ8xeG%ToUwRE_f&g zDd<4LFT%HD2|92Bd?5o45O}HshZiL1AgS&TBshWsUIc+z_=0Z2c~DS*g6_$3(D-*R zhzjgRO`6#!K#EYptGgGJ7-7}yi<{>_DmXe@Pk^hsR*)&+K=joJd~wDa9)d3nAndfx z);S=R`_WoPkk*qm*x6tYg5;4}MUb&;X_)+rg<$8SdJr|6tcSP^w44X*!Kompp+{BM zagg&-J%}0vKhA{f8(^nx4}_(BJ!7?gxT5g5?j z3!(yFG(i==_z4~u66tJ}S@Hir%sR+sJpS#ipyCO%U2p}c$$1W0X<9efX=$BPzksTz zqAj4Ud>|%VxjdxD)7feOYT<4Ns{^&AKu!yIvC#tTT8KYDDqunQ;yHN5HAldUdyt7+ zSkmhSnGOnYQ0N7{D1aGoAfUS!WB@EcUo3+eFc)S3D1e~B1RBrohR(y(LKQ*-1(MUi zneIgrRO$sMq?y#&dH}R2XDTT4AR|)HH3^nbg(${DrU&GpQZGy)EtJmIJ>Y}`Y9<6` zF?3G_aiNAmlK&gXGVp+Iux*f0FzCF^MX1z^7xv(Q10^G{LC^;83j^>dkqD$?(%TAZ zZUkg8boYWRfef-iYOxpXP?Nf+g1m%ce-2dYg)qd$0sPw`2Em%yr@_N9BAwvIHzd5k zB^MI&Mfn+UhJuy<;F1d>4`#jyhsnR_Jq=Qcn#WNy=V@?N2r9%tDUp9axYEN@bhu0RP7WJEv~c2w@(FW3hHhJH9`Yk+yxJl zh;)LvFPD4+mwKS008}1L1(jMsFHXWt1!Y4}krmiI6+{KSkcV`Gz~xaZs8kGiF$bpj zL?E<;>;{*N0WUr!fgKm{A`@mOxI6;KcOYzECA_%=k_&iYhpaTM8>}|16I@KZc(fi= znt@7;pl)!{7Vx4U(#wLCM__fJ;soThpcjfJUjA7pA7Qke5^ zZv~kS3Sdw`1ipA+3^f20yrA+Z09K-l!3^Mq82}0((8$Mr@J?V0&@4+Y$THA0G^j<< z-3sbrfaX@f=fAvYfiy(|UYt$@TLNo&bhm<+3W681gB$1wjV~5JmA=>xshFWn$nIW{ z7SOu(^Xov1tUyiyEi(gK+Y7c9e)J75%-RsBS+J3wUeKCE(40410H*PUCRFJQ2bi_s z7Jc_rkQUGa_=t6&Q7gDckT8l#Fo75MVe6OLpd}u7modbhAU~k!f(g7>3DXq-)%9XK zq!NV0doLu`peZVg5n6S;__Podup&@Jkh-cHTyq7y*am5oK;-zhLlRE+R8SlvLJsZ# z4VVMu;WN-+H-lGof&w6XEvPvLaR=0TSlocudV-?;#Un`774QN&pA1t04tY@Q39be8 zam``kkc0qEM4+X(pVxren9w8v4pDIH0wi@~4QSZ+ z;2kN@u_EX&%ZnhWdq6qA7hLbWI1f_{O7NgT7x+MuDpc`{ISWAMiFCF~fEyQImV>N= zH!eVB4JiMBi`o|p3_xnZ8^)pKPj@epOX~!eti50|pt~2OKk&tC z$bJO4abPXoV8a7m*gLk-e$0gv)< zyzp2Jx`z;?vI#Vj67XU=D|A?bza;>4uL)=oJ$Q2w&+!%k&?qQqTwy0@T=n2XhVD?F z-WKpta^OXw5RuLn@SY#oV(H^8ye*qSy>8;8YCCzb{U~RQmq7_^`93w`24F|1V5I!vqeiKuH*MgfO&Yn#J;>Mh}`sPC!~T zEmJ{#)PM{I28N0k>!E9+KrKAbaTK5~8Kia7(+cW%1-|H=57G|VmQ^1OatY|X0+71E zES4AYFvCI1Zo%_EU|kTygW!fExd>zvyq|0UF?>erfx0wsE&+vP;ER*GAUi=-IfxGm zC+HvwcxANrO7I|x>krTf$_?;{2Z)4^c>F#A8u2*UJryJhA33Z!A^1$&Hu-_OM z7#d#uTLCr<9Fo0Pz=nZHxMAzShF$7z1&M-&Pe49@u>+**rPROw|1-|=fUc+R1x0P( ziv^HW3L048-`)yxe83AIMrhJ3NrnzZ;n)TZGQ#>`tu4sE&3hn&Ms>O%2VZ<}yrmVC z9vB!L7+!dT2Sh+FJ`Ra{P}+WB3Ubox6`)X@3R=+)x`LY(bQV}ZZ!bt|;ET( zEKX1@3Y|Yd$^hMv3;vl!soK&3cX+j59DBBy9T2j_yv+93Pp z5#J|S`OQO0^ZP#J{Jex^Z;6yA_%_43Y`7G)hc+sbG$h? z*ubTM!;6DPU>>Aj3)%|@ZXUikwG>qEL5p!nGm;&$?-Qaji<5slSY_agcrCCApa_ID zA!Rm!(h+z!Hn_9`CB_%+OCb%K&>x8A*o#Y$J_gh=CXg9th!vo{jNk_S3tNz5U=J|UMzjg$odTs77LbEL&V*=uu|pH;Oi-H|WJu79(v4te2E2%YY$*T* z6xhAs()IchP|^o2m)brR5(TAy{Xn;fgRVLRUD*q2XMswj?jCSP4Sd0h@Qeb(i|>$n zAL7JaoRFzQP>8=^e05Rc%0IMKvUx;Fme=a`iZkY;lN5G47C!zj15eV`RI81_G zywHI92h^be`6uwj(hX4m^g!0mL(J)fnDc^t2_*bcoE!w{X@J6Cf#Jm#NF5Jx1&Wh* zEyi&2cSs8sq8Q0x{+JHqfjA8A9&manUktiUuyHY{`U2gv*5e8qvjx>Kd)1*{gV!*i z>MIaZ!+Zz@OM(ZSkwz4KL90|i6;aTOb2C6Hz?*zyK~V~?^B*Bb602wuy(hJrD zF?uT8Xe9T59Ni7AKwlI?j0Rs#1gXBJf=c|L7hDi?(>lR50H^?m);Qqmt7j2XjdKB9 zQIao>K?86I^}SgM>k@y7;Jb>KU+MAQEoa`-33E z4s`c|MAJH3c)``z&xN4oEa-4&X!Ql2@d$eH5Rytk{W<>ay&%s7zUci0P3I-ah}jb! z)Y$>>mRV2YtQrF2M_~PaQ{IlSo3UxntLf-mBtqG{T z)(i3jC|@)-+&j)5aU6quzM=R=&l!aAfsQed+k7M)g%t<1^V(FZ-J~FU|?W) zeHvUsf;vs$<5EBj%&9H#1db?po*vT8aph^=GXYeOG4QwiU}RtbmHF6OCy=R3(7`#@ zhiXB$0sH`oY@gx?I>Hv#p96agv=E^QWMVf@N8k&AKv3@EfOfdR3QBppr%VGW0Cnpc z=7Tz96OXs*z^2ji=0mH<7l;1;e-QwZC(2Q2y{#Y}0iens+<68CK6tAo_#EnPk%@Sm zxf0?`&{z)0kf3g`djehvg3rki=>&6Mf{r!p?FA`78e9Q!;p!hw0(lpz9;&o^D#&j^ zFI*u#8Hib+$i{Z!9cW$3esIdRzF3zcyQ1So&|CcBK{{NrF1fvxF%0jYaHPQLi4vt=sS)?lcu;BE$JK~&(218C~zfLx~yvh(#+Q0Tep z1a$j~1onar2zs&c1t>rSvbexI5_@|=#s6_u(AS8sIxY z;FYf}kR?x`Rm`0&y(>V6L>-)i-*?@i9MGfpn-4I8wgAoptz+Eo`vbJ_>P^s#hYH|W z1s%}Ezuol*Xb1C~z!%brFwqa70O*EzA9VI_AjmzwcLKXZ?*zU0;s;g++E@&8kKr6} z(W(OqOYIBYJz#HxJR$+o7z*{sZn(w|FpWQEgHnR+e^8?U)RF;5?3#z5g&DSxz8Gjk za=-7J?kT-X9)eC&RD%k?=!Mkqphg43hZpe>vq5V?-*or1fHq&1@gRrof^@2}ZLmayFerF^K#Nup!P_Jc4k5JQ z-2)f>0QTya?v|+_cY=Ko@M5knSW`Dx()UaElwMFc1idhYbWOnF;QFPzrxg?qfiL8s z!Y^7Ol|I;%4==(YrZ9g9d%=V7CL{m;&=08A>G>jC_W^F*F^DdRbsyl?t%nM~5JR!< z1!Q3q$hx_Z7C7kqYDlQgnFR~gFQC(qK%vSx3o?9iBj`mPTo#lVz+wJ+CMYpX0(EW= zebtZwWl_)}L6<X^<+>)b%#CxcO=rF5-)1iz#f9ifeQKAAoK9_QNYLA zb$~9>u)fIOyB-{e@a>QLWWmNk;t-y3e!xXPfVV$`&v|*lzg>he=!FkBQ?Y=GN`6pU zcoF>x)`IcPSnK{!3cLxwWh%(80Wa1;dQt%yK|AD9L3s)0p{Y=b7i(0(E`Z8`JalRX zsMhk%fP@Y>F@OvUe31y%0}Y+fFWs&Wz$23$P>C1uFvCK>bo)L46~eV3!@vjYfC^q; zh$q0M!HY#7(H-s!N+2M+f?j-uEPH}E-1S4Z?*s7Y&>g76i_a=Bhkxh}eE@Q}Ajq!Q zaEF7E709r_7b~E8U=IHPb9g^g;>9wUVWA+4Kn_1L9h6M;|NZ|DIW>Ucivz=p{ky=Y z2E;)Q5^>xOIyL~b`QQ4@3zprGV*|t(7#KLdI52=}m=<;hhLv9(7(k^t=3?SEm*b~1xFn|hW5WC~61B1$8$XU+KUmX}glXjqe=XGBl7g2cVQIxv76 zuKWxPc3&MBK<#eO{(dWvnXCW*2eHjS_OAN>AJpbH0J&`igslYw3FICqTN0#q zIYeCGs{`Z+6O^+|z=xW|r!thd=77l}Fqy+p;#vebT>*4@3Fw4{)V$Q7_*90}yi}j~ zREEsrl=z~=l2nKYx8O$ufc+ z_5c41t*M~=SOq(tK_T!(1~xt5OqSL;6|Cpm6p$Xb3{VV0oMnQp2XyW}^pyTyu%1I; zJsI3em^omDbtg z3f3nMa_Y{1Qiyp5&5Ct9Br%Hl5ZAwuhUo`&`%&x%c`NY6Z^#q{XvpY= zKFoa3@iLG=cu@^A|3c7<`;)--r**apK+`gq5%7Wyq6jL%zr7bE4;tqK1!T|*bBHvk zlFDKPwNyb_V37pW;TM8l920}G4+Qk~LflmhS(d}UeJaQ-&{!eJtbiA%sLVHLJy&!7aAY8 zkAYg%JV<^7nHBUR7^d_<0K{D&KkkEh{6f%+N1{l61Ra7I_@W(gig6 z^tOTy9fAc4G@*eydXSXY9V!4yhXF5I!6{4wG?-HWE@8SuK?m9L1iYx`1sygk5by#L z-Yno-f*D^tnehLAH@L)t)MpodIWW9V!QozU;yP1P@QM<+kpWTk)Zm< zxWLzl~_MIUH@dU@NWm@L|sTMfewTMb(KKj_rep>yy|rQ0Pd(_xmXy~!?354e2@*Zv^SYYf zVEX^K>lg6A)8D@T|G{A)6YxS2k{}^rArT1nge}Yy1i}J#QYXkq;H6C9@aTuG3F;1& z2zrqOsp6pF0iNJ^aStK}4ILhE=tRLZ`F;US+5G_>iv*e>bb^Y%SP7kG+8_F-+gAY8 z7&Gtt|9`^EBA33;V`F3H7kRy)%M-t(rKPdGNa_VuU%nEZz6Tm> z4}eYxDiLX{JpejVs6@K4_5i5vE>U`|2i1Gr6|C*G+;P_*GiT0ZJns4hWaMkU!7|G!`Zn+=MUp3UG9b_$pP-2`~uqr+V61yd>Il?P(XL+i=b}T zCjl?yz;aM`yzT{A>iYq*ugMoQJOT2zg!P5m)NbD|plefuUhu%(i102XT{l7It-&D- z?g_g>?9YOVzbFJ-1_}n4_4Ah?1;guRch!cGGn=HM#= z8U{KMlqLT{1EvSGV^by&QZyWfRFwhUp+|yVxIvc{b-RjycCJAxGl6c7z!y4DnHS06 zgAzo#Lj^jSUZ{1!k8|r`bYys;wiaBGH6L-Xe)FPoEhMjk?~I+o=*VyZdNG*d3|^I;9?T>UrRcD)1eU5>OSP5<%Ur z2F(YU0=j*5nh&xBc87uvujdJP5rm@77gXSD1a-Tr1a$j?>=g)lVE|Fl4R(D1!eu(( z!^bwk7D-+C@c(}nGq`^N?!+5FMk1Ja!4aR<*}CTg^qe;EKm|k^JTU?0>vW4Sf?7Ku zRRP_-AkzY&_wNa$b+&>69h7#bf*3(BdLBaiL;NjW;KNYC+Op)kdqFV}h;W4l*cD)F zzz3+QbhB^;ys!lyry$bV3bLjbe3VdNmVEbAkmexpUc}(1d;P0mE?@R?r1>3@`S! zfok4XP)tBvizP5M&;nBhoP0Ke=lEeU0X~@`C`-N@oRI>+9Z&GeB&3)C^L4<{SO(J! z3jE$)P)LGS-a;Y-6aoP+oWUFIc|Zlxi*RtE437zjW&GPA!NT4ij%wGEA%A5dO-Oe+Cu^rIWInL1vL!>x_xCpCA9?P2x)Ms2FkJE z1Osy>TpLfoi!PXv;37pJ2-;-E0- z51l*$FTz?7OG>~NL!1#J`T?Zbq6J>scd$D$ys%gfF6|-Rmfg!i-4;*@ZvEy(-Ev6L zpEiM&fq`KHyCcJg|NsAkuIc;;(g-TU`573VvO6+>k`$;Pa*y4S0Tj0&_EmOA@K_y) zeTE%YSHv4ZD~)(VD1)IqH8VY1-z(jr9F2#-=Y)n{INoaW4>ID`ycfh`0dKXtv_6aaiQt|{}-p5KuyvfhU<$Bdcp1hB`|@27mJ-?_8tJ+3%W_U)3*a`FKD2$ zGqmMJe-mhgD~rFk)#pEG{QUevP>SN=-|u?|9Lb<05X#Zb)79z2x&6G$jd}9RasTLAQB=_w0e%qM&vrbp8o6J7Ueq zzyK@Hx?M!KfSUPtKVf}Hu)dZdfKrD#M&Mg4B>}2;;kPv9GAlPLu8vg%(aT!FMYXBAR zi~m7qrA^lk}yp$J*O1v0eLrFRK5{@(EK_i_E9eGz0TQUtb6dGWFS|Nj?nK*aNUBoBhT z*82zKWzaU;4-h?oH)Cf9>{dZ5{z z?cmv+z!!}v&>Yk10-9>%0NwWUAGBF~zv~-oa?$f#i)SU(;X`~?epnU-zC_yjw-vFn6 z$owS^4a~?I`k)$Kv_hI70WWkAt_DQ}|Mn2yCqXa1F+tqF-}g;gr;G0s%(y{u2>*W2 zDObL4`1gnS{?I;zkrTurwsp2@{0D9F2azDZz3FzDIwj!6PiQ5)-}gI zzYwVdrQ~b>KvUWxp#1fw+qVPUJ$@+IDJ8VApq`6vIM-? z4%4Cl($Wed1G;-b`U787!)y-)*#H`y=&S{GgwYvKO=@(+1`suvss%A==V9TS0vO?NdSWK`)+w`*bXwts)?MTS2)8)b<5AGq8Iq z$eAElgR}&6_kz>}zE}u8(?O)ORRE-ADkz@?b+>{}Qw!+s1&IZ|$b-AW0W`S39qxUw z`7iD>fE)?VCj8qW2E3?-h^2M5f(-0!1(jhSmwLQiKlw1fr;rFHg*f^2wURt;W7 z=lZ7G_X_`h5y#d`{4L6$sTfd6bpljCfl8`9pvw}cg1DgGAwRSn0=b-jyG!VgfEWM& z8-q^h2S@p0@CpS`1nWS87DNSQ%#sAnUqRxyvy}%FGp!(VK|u&IIk0;wNHFL{F*x0` z1Y|K}G=MfVTn1mLBhuN*0Wxks$f+%${MHQ?2zXHpSvmlbf00`C|No1GDo}0)sqgFs zt;>1gUj+#xe$a)Bpz5E0doRfHz!yvZfm{w+BM)jX@o%3BqJp|xLE4~Mc8V`3s32M0 zr*%us;-Cnx^xy&&rXUtGEbE?hxNX4iuj!t4)yV|<|7 z_X6nJXpnUv&J`G^+qLC5%LG^*2|C^6qyr=hT5Sq491#Z~H-W+rhPeO1A!1r#@HAR*X-NSgfHr-B57UQDGzBtXL`{M#pjmSlik z4y~In{Q)I8@LK8@W#APJh|JOo$}9np%#sC3n$XMwNw56dq1h0eg92W-v4aXK7Eoqk zU|>jiu`Cz)d7Vp=CSfxoZ=xzw^8Je&YZ@d4f7jDjm&o(ErU2ny8| zkWkeFyA75uL4tuVtS-PpRT>mMpkxS7lgC}Ag45D#6-0m|Vj2|W;3i17>lN@N>GR9} z|9>&73{=xT{t7)vX#%J;0yURfKnzg%Q~_du%BLJq11cM&Ck;d-f{2(h(9jAoOx&&10wSuezg)i8MYpkH~ zWr2??pc(;cKKrn4349?BGhzYAh^Zilf?UDCz@PwYO!IH=VFg)^SbGcVOT2gr-t{HY z**XWLvlryEz$^w(!J+``RiWwxb$!5gu7>HH0V@r60h~1x0TPSZ^;V*aEw!f&u_Cn04?01FE&4ZZ%l%7P#I7h+dFq1G}e!+z-*4 zeS!fsnBXB@0oNM?*4qm5Za{Z0$On)SxPy<-+zjj3ys&}mjR3_ysKN50qvZep7tJ7| z4n$Ofh!PNyU-BPv!2`(ZP*7)r3sii9PKX1K5P^bbzl-RJ)&nKgU;&UdFm)vvFd_c^ zA-pGAFO`IY6AUc2!Tn8mG#oh#%LU@F2m{Rxfyy-&rnFAR*P<}fKuf7zFQj$zaHMr| zy#y_~Lude1#*D3(N*uw-1r&l%tHI@GD=3-*UYtAwvq}nVCU~@$2UHVuiwLH53cUOQ z8WI2vGJu>4uHX@7f?{;P59^86lO+x>i$G`d97yYQ1$XIDr(2qTG1Xdu=bED%zaukio>7mFBbj<>E{3qy)=Sc@!~)Ms5b?56J*)IA1OzM7ds|{$KM){fX2D3-@M?M z0vUA^Wnf@nk#=PG@&EsS&}c`mj3dJnD7#a}k>LcC-5}%0umw6US1senums93m2qU4 z0%hmRI5L0|0LYwd8Ak?C?+BD-Qe_+&K-E4-JXXe$0n}&*iHFNLGJyI@Aa;O^BLk@C z0b+ZC+yEUJag=dn0CfvM;+7!yK*bGZ92r2hFi2ce#*qP3%!1fTGL8(O;u^%3mT_bN z6`>%uh>Rlxs7M5{d1V|KK*0}UGsrkH1jZMaCdC&Q7L~-OGL$728AB-03b?YwBG6r4 zWr;-wpapBW1%{?j8l`CK9SB+gS5O?E$^c>|2gavW zFeHLWFaf&PD?UFhjUhR&gdwveB|bSZF9m6lTWI&2*u$WKN+>3R584p{+Tg}xeXxcr ztvi$>tuyq`YmT&TSDv&^*FXH*UH^1Hg&7*!{ifTM1I7cdPY68j`UhlNw<|}$3!lrN zu4sWeEZx2w#~VQ+paybxC`WUZ0z*k0Cx3MyS$I zj^j-r5wKEMj^-Uah7hH`9NiN^?4TE6P^GRM#~VN*V5J}j$bin>ggOAk4tSvrRSI$d zNCd1jl%si<0$3?;H^>Yy8+6J#$P5NEh;^V~1+fEOJii3-EXWLy2;2-7s8Wz8KJ+7uHavAP0a%z)C?5;D9Oxg(8R@^g;lt6yyMq2v{k|0WMIbpb!AD171A6hzJ3Y z2v{k|0Ul7Lpb!AD17GZdDg`+JBm!0nazF-DDaZjJcF>D{s8WyvKq6qJAP4NRL4*K^ z9q=LrsuUCgAQ7-qkOOj{rh*&*Vh6skgenC&03-rd3UYuAG|7P+0AdHd;Dag!IRGRA zRtj>!79!hRb(18t~MkOK&m2Mkc9AO{dA53Zg?gaCo^U=>s;$N>b( zgL2<0b1%3r5uaUj&P!PWYKPUPj_-|mqS_~OG0aBP7VSRjesLWsVogPpn#S_#I{ zEy%y!Nh;vQ4u}d+6o49&kTkNn9iB!&jYk*;ufOCu?)n8JaNP9=gaWrOA??E#QeVM$ zRd<3e;Q7(~im5a7M|15D7XEfE&?R!NKmMz<@@P6TfL6u&@&vw+-V2K}LGV}?IE1c! z0aXr;Sxo%fU3mgteBT38!v~r@^!@WX|DakSi;d< z`-P=M__fkb&_V{VW+#xs*M_^;7#JA9It{@B3Oh{B&Sq#mP$Hgj6y%18v$Gj8PMn?1 z@M2>+*bT42Yb8T@f?gQFy&<>*avi4YpBJw`gS^VW6SUA9Y|kyQfWj_;b5O5={E%UB zZZ<>4igU9WUPM8R&0^-??)wLHXkn;8(2J$^poNJ7%}02w-@N$I3W>Uv>W&P;8jcLs z8jcK8G#nY!H5?hh@rSuy85(zSpa1`d1=o)k0iVIk3z%O#e+Euiplx!XYy!$XouKad z2XOR$Xs-Rh#^1gc9K9d@tF*q+c7*Kp{_}ztb6`}yhr|BQfm2FNwU z-GV_c*x>=A0ve}7)A`~=EQexUUS zkht;v^I|GkbLbb)Vu~LDFRnd>dEm!ORggk>Xy>3RT#Kae52P*Cyc3k28A{c5K{SQ_ zd0`IL1X^_t-U3*G(Dd497w8ULus;Pqf#xdsx4V7`co7Ow0-6cp2Ybf_B9PYU`s3wf zP`W`0khEQ}1h2LO;wRTXFAjc02@ocP39pTIaD!8&>z^01KSFHv{Sx@%{u8jbK?MS2 z&)+$S0La$Y3Ofr<&t_;nSt6d%0CK>D)3X^e7(kilM+!LMf};XFti;h=!&SjhVhT0{ zn(V+i2sFIs%h4UeSOHfY!X?n{q!92z*cO~3UwgxcW?VU%_Xu==8nY#4;JuUl+e7~Z zWkGgZLG0;n;Q}duYjF_}>Gn_vd~wVMY#3xMxMVXVc~9ujbYz&R>B#U`(~&_<%aP%w zrXz#DmLtOsEk}5d8@wJ!ff2mE^Z{r+kOye+4^(P>UX8TA)O8QYT`%%JfbMAE=;rA3 zJd24{{R2xlmEdTf3LI`yTA$#K(m`aTGJ5dxm(_u!wYFpXdGdAsV>C805LA~LC_0Uh;acgc)+;=JOcxoC-wzj z_3hHd67Yhl7Q8s>Wz7Ho|96723nV~8USz%lmB64wN4`L}hJ4}Q@B5|sr%0_JcsH*r z$8nblpaCz2*SA17o`ILpJA;!XXtXY^(=q0S$~*8_9sho(nCug5fiF~GetH8Ma17<> zZUr$qog$j|f*5e`_`Cxp2$q)-g80tI;NagM7-M~?Ru;4~1~jk|%F*o<(R}KET4x9c z%Zuf2K|VMEX&(rJCZoGKz-CDcOhE0$vmx zg2uxOkehuux~GB|oq-9>dqE7in`gX*xOs^H0|PkLu^bHrT9~unBgOh6$jzZYvJZiq zb%6=ZC;z8)`Y^G)`1}U!=GR=^p&ZAZ5()M$AU@IrGNG!gT+Yz9@|pjAzfxGH(E z_YG(z5qM9PW7&)KZ=m-`ce`?=bq1upmADAWEWni@gy1)1{|HPdzx$aFhKN9;b&lYxt@=K0n`k968ItkZgd)G*dFA>k{7>U|Njp@ zsSV<#vKOyjLnmP%zDj#>^EKoW?$8%6&bBGn)z2utBjGG?V($ z9AqzZH)vPI3z(z%TmFNi7<8rsr~u*#cyT5JlnX#9qO%cH=DetW{r`V2_~u}cm!YfR zr%v!y!jv_D5OD?nvmEovA$TV3+B2^Jppp_8&FRo=tT!F zEX)z6W$-aDyxx(;1WL0VAcq9LFoZd~L>9ahpYa_tXlMe(tA>2gW&{8JK#kT*C9>V1 zLCx)gEEp=;`4|{pD)BNfWU+LE%HzwMp)px1mc0pjlq5~6$JSOHMykng8dTk z!lDKw$%5ih4_*d_*9M?YM(6=Z|HCou#r~Jzrgh*8wYiuc7UP9%6%GZ*kLw#~S@s4r ziwr)qEZ6c@G;8n`89ASVm*?|0H@Jy4$f zZ(g8lf-a?XhQ0u$F4q@O*T3N3@B0Gc`ZAE~7eie?A+R@e4yx;oAg%``sW|~JzF300 zl^~Bmb57F?%$)Ox8=9uE)LWprFr#kQ1N{3vG+IxVsPgXzZI$Ba?wJ6p$-otZ%R~{V zS3I&_D1rR(dgn_!(E2S#kejzVl?A+5y&e`cvfaKMfiJrEV@7r~Hv_}VGA;%NP&FO; zBe!?FZf<@P^Jgf?;L?I z4jW@;>Bn5qB-8RD<@x{rFY2HF|33k|*Qh1n#i4ajHOznG62?fhFB76F}-f@e3_wlsGXHDiaq2!|R4_ zc+T$Q$IRLHI2jngF>`SyW~MsG$-n?AE;zcuEwq3ad(fgYCIXbIQ1fmNCj&!9!*0<1 zqaBd&3WIng;Dsz)yBIj5fSb)}olase9zO-uhawPB&}LN3^5bbBo1(q1}#Sw_%K7e0HgvmXvDwW zNhSc)ntHMGI3z)XCbpb1pnhZF0c8`^0@DPdH}C~}IY<&U(8WQ1W&jn)(3pC(7Mgzf zTi$_64aRO?(4bUW(2EsopfV-OAdiDCZQ=-g@rVsG{TyP4W)OU(Qf*WgLvJr=xlmv) zc$GM6xio7RxKzzzf-Hj%co7Lb2$6p~csnLX(2M7jF(cBQoq^$XH>fEB8r>-ie37&o z=4wdw=(HO%5QNwn7+zin`xdOT8{}iDpcmJ!AsY6xZa~>5K(#YJxRBZgk%v@VW#D{E z*vFtL;lSRhpjl#6AFtR6_c2H^;6*y*BzI6|g%-wNCt>3)63AY|wmq z@(V~WYV1q0F)+L|VP#;*VguLhPho+@-y+8fN|T^XoCmrC6@p$!orWYgUyja3P#^0> z1W14H18!_uJSfSLd|gDe0Q?cLCk!a9UCO5n9`kVaj}3(-fQ zp_6V`P`S+$_~IEP%E7WuWiP%zgss5LWw z4WUB2Y9Uvlu?QN;yA$}rWCtwFr-G*EgI;`wtkw_U-|qSX?hm6;n@vYmCU~# zyk(dp;DyZu%s`yO%)sz^8n_NwyB#wGYneec0ce{y2P-H5174IXVg_J1GXulRA|^=Z zfukEb(k;6Z9z?f6O?gmjSMnZ6H(L4!Elvh?e864~eF5Dw@`8WA>kE*-_6L?(AF55x zV(100{toEv1ucVz762un^ufP9uq^1s+DoX(>MnRgnMn6kkaAEr3YwNo`!R!IDiZ_4 z>n6~!0tcj2*{}@i_!3!g;7r(t88`_{3=A);K?C#5;IbQ(G6G(xt$^y}Z;1yDD}qm@ zJJ5Vc3{=oGA4m&$@#MQDs2>F08U<>#2fov*pT@Fa+d_S2*uYB zuhs5`E_vP_`UYfnz>7o%kTX#8rz0Z+!|Pq(L2tY-!c%&$6 z>cxz*M+^)MuUCS5D4(B#IHxKd0t>o(LHtghrslmM216-7WGF}gV$*B+EH=MJS;~f!es=^%|89+roNZij6vc3w$c5`%O02NjswymQh z11LX&*rtw-44}OmAhwR9BLgU@g4jxqjtrm#0AfoxIx-}I&+bYtNQJVBlT#UrQj6o$ ziV~B-jFeOeO?!dVoYdUZypni`lS*<67(m0ZP#oI*CJ;QPgk_;o^Dh?Ah#crt5su?7 zji8;K46kp2(-l}X>d`LEKiO(U_(6x5xN;nCnE>vWfRf~Ov?PgDD+{vL1)$^$*V?!N z$^{KvHG#?=5Ffk@2)vdXR7`^=b$5V-K^#z%8$7%W;<$1gZ#V#x0Vz8H*-C5Vq$Dh3X5@O%*V`8?3j z3~Uzi%M0h5ur>=gz!1|8@_tz!zo< z!R2`XNG-@%p9vL#FCP8^bs#{CNI_@N9Cw)jiO|L1(hh71>Pa)rKiFz*pojD{@96?Z zC}@ZQoF2NTG=c}_5#~g0~3xhoVdOc{}SXBW-NfEfzXL<-Or$BQdxNHO! zPu2%(HDS(%mMs!%!NnBRitfOI<1C<|REF34L4NZn2z>Ev4Oj&zg*br=KX9*x6_k(y zUPOk2iYCwyT=PzFT7s@O1F-{M?1pLuMLI|XlPy!El@#_jm6Pmk0$vyCey(>g2l%w$wC@}}Uxa$UvU63O{ z2|D0~&ufT)FGu4+P__tsu`3H4ub{}bVki*@hg9H;l-2MU0d=lHbC1mx5ey~#;3_5} z=!G*>fh$LIMFLDbA?SrRL>ycufom_+D-fE0iPVBNm;HdGd=`chW&Zt;n#gAYOW=z) ztHAa`#o+S@JHQR1^AJhMtgTZ9qyhqGOE>{4525QfvqWB;gJ|e<{nK3g2VM_yTm$>~ zwRbltEAVs&CUgd{bi492A4ur-{nP2l1G*aHP)fJ!pUwb|ZqNZsJe`38pf%;&JyHU@ zL;nQ5*m?rgYyn4)@1IT%;{%XI0PE7x-4xpW=0(KS|Non7Il!ad9L*LCrA)8ILBS{( z^y2SIuy;YFAt>Q8SigCZm9EKvvL2Oxzbojb=M=CO(1Af-9GxCIFFsuXHR*XkeSmI{ zoU~3au@~pTLZIauzC7IlES-TSFV293TsgWqK)0%QJ8FRY7t29{pg{%DlGtu9v$Rf+ zycd(MK<3uEnYw*>(z*lG(mDfEUeth;BJ`W2bvos|NCye}@_>39-A-9)osJ?eLcl^C z-GUG!`O-Q)B3{^o1i_sgu!(wUofG5C7#LotgTxVr8l-hLC4j{FLE;E^8Krf0q=3Y~ zUj}&<;;*#s0I{^rK$aJeF8}{O!TQY$t2DImLIfUU{T?Ac(t6=~V%7`8)pH*NO}vAa zfFLRfEbECuQD4fwLqLFm;dK^x8Xnv$V|)<+=|^_E@_;5ogFrlA4$y%?fgCSDTe87X z>noDh>A~{?w3!#wh;)_cbP{+W22(5387T4sv^@)=Rw1p^L*fOf9b*bUVt~$crk`T&aUb~XT&FotIKS3vwm;`mZg3dnzA0!1j_mBg0Ak=CPP=PD)@;Ru-2?{^( z(77wh)G7b|P#(|?*S*XP3@@Vo{{R0X6l6bWHIGKX3r)CXvY^gIcc@4=OBZw;o#O@f zU(j@bA84$A5#rvTGhpu3%3|dQUkdyTE+n4C#=jkO@$F@p5PypxGx!qeFWs&p-8>Wc zL7QYiCnR+I`wu@M0mKHyF#mqnFKOMqATDToF(@csbp8QPsDtOB!3Jy>40=(5Fn$xL zlgcp(iQAz%r3@d@T!{#H;|4{8L=nr;sp(5^{n9DrIX zF9Kmk+_(rbizVR2dYBQV?imbBpa61(+R4A&$py55^$R3*@Nf6v34D=o2&50ZW9Y>a zFdID2|H5M$G~h}MK?w@FjBJW8C=0yU{RGc6kwBH#iJwAmGGS}xc$m?!!7dpI>dWMp7ysATnQKKakF^<*h%lPA>I(4|0u zGB3_D$%z%oZK!+F4enLD2%{4u) zV8>kmi-ML4q57a^zc`^Ox|Nk#0 z{rvwQmj9-~_2+|%5K#VWh6}}jvLvXWDS!)kLPOCNTv+&if%YA~fIJ3Tc4vK|RwRot zixD&wFBACUx&&z1g23x5AQ4bULMG_NVTc$g0`Ztqf*gt*pz{Yn<#o^t(Vw6u5@INfiF(ORe|^~K_@M|DF5;Q|BIp@;9>(@ z#JWv^rlC?{P+)+HSYwz_iBAT@FYr({Xz3ddJd8|1Yie8#0zmWCGJ!8Hi-W^}e}AY! z>!lJ2kR-Uu3CLmvof!3EGejPgAVR^Rictg$fQsPBpnQHEv{n~dbgrI^a2jX{p+?|~ z88D%eWN3tdb0JG(T6a$gu8UYL9br9lSJ@%#HhX0(KYbhaKS$pyzd7uZkt#lU_B1sN#)7{J|Sn8lO@8rpZ2 z33#y!s)z{`)u1i#AQuK@@pXeF=Rzc33xQJ(8`#uNh}g?!NOlKD(A7!MP$-GZVgmUH zlpH_?1%f6JWP)CVKs14+_V>7gq*_mw>Vu8t0-YxK!U&=QbjyS57m#+4UjwuFz>=a6 zNw7N@v)I6HV}yvk3v!m1!mes4_LTa$Ao&gsEr*2SGg~EhN1iM{j(z-pE(mH)V zys!f~?nT5`NXmf}VUYS*1QxQOPy+?SQqbX!dJvVM6tBg50uD*!WdrWg4X3^ zNq|Fny$CqHy!ieFWC5&<=il!n0oumQ1x{?f1|ZY_fmS#&Ff@pDhqi$0GZVOj6}o*} zx&v8)KzlrOU#vL-u4B4=TRI(CUi5*M_=0LSu@|3@fh1T0U}10$<2Gff{=fX`QZTzyq3JdR;=F zfG!={?t2EZ-xa*zQleXg5j@@tS~MBLB>*06@Ahrs-yX;WGOPIjXwF|I@Wp(2Q2DL! zGJ}bM;l-uT|Np-@3nET{*7ZVTd`>^q8;BV1gbTrAybLY`kMU%fP)R6c{V1BZTzdkb z;qt=65#cR|41~HHAn(J}aRj|kfU7(4S{sx;x_x!hxvUZL%9>!60WVG+2kQ)Y@$e{! z!O`j311c$dLwwhO8+E-tu6sbu`xBtBIRl!LbqMSZZQFU5iSHzXMAuWcsl#t1Jzif#=qV51IR9LT)qg}0rnoqZ{48^;FD3#e*iaiL1_fk z2nIPFQd4z%v2=P^yx0#qC=}7Ihq6Q_bUSi%I@!Ef0G5UqH2Wbep02d+0G_nYK$jQ! zAoE{N{{<2#PXb@8?1qIX__CVpL#*&-B*@$souDPdARVD! zK<5};33ySCti$(9_C;1`d#)w)5U2wj4$=X>!7Pivw-;nc;EP}m&_E@~C!poKAU940 zEqr~U4N}X$zZE3f{DYCduNIu6dO?!>`=|JVbhlnAl?FF>K!O1;B({NrD6JE`hW7O( zkQ7*b;ETUoVN#$Ks{H%GD^~gUw}gU?IRG)H7bF+>;v$OL*O$O<0!>}Lm=0P2%)cKz zp~b(y#}%Zx`6nYp_f(LQpcj+jx&sm;p($BHcV)X`PNTFC;;>gTfm{YtReEE?7Jvn-Pu0422h0K`Vg4 zHi3dH=*815uy6tKK@#8q4|pL1(GERM>}4@1`gVXczqA5%(V?B`woa(k{4F`4=-Cb$ zePHZu1szZn@FK$>lI}qB&3GCeu*M#&+J`hhL?)zlGp2PqF}+ZH3#zptnGAHk5a@i1 zXizvn6!J{q-yY}?^g;^a6_h}8c=6=T|No#q6RO&OZ@^7>G_^axOO3@qty73wKrtWa z@L~Z-9AqK9z}W8O6!2o@W^mY{7~=Gz7-S(E!VLcHflfg$da+pO^uirv@JmoS>75D+ zvLNuW_u%Y4M++Qw-J;-;rB{rdU`981R{muSXbB*6l!Unh9tGK;@`JJ4SBHQ5#ATqZ zW#Hyy5F4oR!-K2o2RMpc`xXcH_+9MQ$Y+!3lYrZ-w!?j4rKQJKo;vmwYi`U z7Why(kaF)GBjW!LEM2_$BE2n3ry#WuKr!i$LxI+X!MnZ3Hp-_k-Qp?W)7S--E^aVr?2I z^1!YDDF?e0GMfx$LajyC6%xQ^eX3R~iy7hS-VnzE{{0XQaF;PbUAF3F8R$ecl)C2G zMsSh<-AE6S699DxK?k!1zTko!ISg&GgIx!jgni-k3N~Q|&LbF|UIEai2+$E^pxo&z z5cr}IVhMD&&X<4}3~kUPP@>Jh9kyBk+)W625du{VuB0Hf-^G`p6@)gBT2CRZdn#xg zHLX*`@x}I+pq)dIgW+H%y*RW1<|nXoCxdjq3<2HopbhJQ)wjYNAh8gfUSBXS2GP*u zx)yYIclAriumETbz#pc*R21VJx24}%>#BjANTIA^kePAv!Zp+FgmA5=8)Z*K*iwH5H9 z4t%a6_<+J*$Wco#c6)&{9RGf>5>SU|=J%gLpb<*YL20x8fzHj{z8-7?NHVRn#TO*_ zqWJ|V%)qV#&EE&~_JWRX3VgwB1vU>fwFjO^dXe=4e?0Sm;u&;|5&!mHkiWpKRFK_Z zPeV!>(3l{o2LSQSeo&iJcmpUfL_kY(K;r~0kR|}=a2UoH-$9FYnO^+=|Kjg+@Sp>z zOTE1X+*c2HVc86eH5+i!vIu;!4KAd~zke#o6|I+Q@|94`ScGT^2agGx`|FYsRY3t6~S1Skc7Hg9slg8Biu7{5Cfk)$C+;|2_f}mhK z(**TAf6FRZ;Ro{Xi_IXt;N02s4|R4LnZDkZ#RT)JJmgGM&@R6hn<1(oxfvR8{~Mu>D-qn80-Bf)wMpybdLaRF z+6yBjU$DV^0U4qP<*ms^7pESBiwy9j$-H`Kg5+-jExdcN4y0fu zh*$z5=7W?nfZ9Cp^6Eu4LJMfd1DsdE!8rwdf^N`@RWJo5vKbjppm8Vg9hRU%H1I_) zOtRD}goM3BDl}q%-KnW4NR$q=rNHBeYB6RPf@&BXBp+ z7d*TSnnn?s(A@%FpbeUr+y#<-9Sv%~gYwnvI%p6;vKpw)>VOG>&%yix>Jfl4SL?}A z&?XQp6Eo1#D6rs#FUW9^`@lgGD$&i;1)0IQ#L(>{D9}9xoM}4)4PF>O`u{&80d%n; zcrNG!LwBe|Hwzbd*=zPihHe)Dfo>0%z!%+c$EbrM0^}W@3EhD_{M(tJ6C{wzgD3FC zhZW#S{FitB{{N4)feBd%=acTp@S?;Wybun0mF72h&`LPaG^+KR7dzb{ll~JxhvSE& zL(UKbExtXI;mB|WdOq0B3`d4NQ1+S(M}{>}_S_6dh8a+HZ-yg74|GjjYX)Q;9B4gV zc?M+d8;G5q0a@<`GCw)PkpWbEf!F~VjtrooK@i(2197&PUWOwBsCy>Iz`&rC;m81L zUW3$#W;il{DrgX!Bg2s)DYK+F9=g(uAvYyHB{MB8J}oCPogp!)I6gPAq$o2PbU;`R z=+v%w&?2;){BrObx!lx}#FWI6M2PCV(wv-lRH4k`-1yAg0)~?OlEfUyDmDhFO;BE0 zBG_04kbUtW`-&1%GE0jQ{DRDq$O(?B1^v8=O_dz=gIhqfY zfm#^N2TMTXJD{6uIJ%+R@g6M$H9!Pj@`D!Vav+TBf*U8C23mvxGA-;rsEm5bz`y`r z=maw&9@7+y|X+3ewf-RrccB zJy4;m06IIBBdyc1!9h zA*#T|w$zIs;N`fWbvqp0EnOh(J0a7D9x^ZPfaO9#E9km=CV=EXjti7~aTqLtY}yV^ z2GGeBP6{uUgXNG71oa|4lwS0KC6G z7q(zIWCOv@(|Vx-mOwTQyuLrJ(@EzA2Urf-K(O;X$)nC10iF<1iGWyc+TKojaOIpGKRqYi} z1>o~{K&O#GGF(1Pyu<@MQN{qe=O&8*3L!ZjWDFB%A&HR`DByHDUB7@DnO}llB*Jxb zbi00exf-P zfu?=JdutnZf=)Wz0TTYant#8m0%(>>ft7(_Cn)CAI(@&q;04|D3K}Z@67-^QA-Jsy z8dmIf)qu~by#g)71(%hef*ibC7JWUvfb}W(d^)I8)cz9`42b!3P`jrXA_hu9q2P6m z7_0I@rpSR?v_HCiRrt4yI0k`cGBpBTm_ziwKGo|xC$KkkMNqHnjR4R(C(xGSURTg< zwx9ux2Vx*=Wk9F+fX=8{SOSZ@0#LscbUmnCDNG17{m+oa*9~&ojUOO=0?^4*zHU&P z>kD<_8Q)nM7&3mGo6V3>aeg+#i=T4f<6roOw%4 z2sm0Czk{RYC1^w$f3o54-2-YgFhaI)K$6Z2qhe@W^S8_dh5dflAKkt(-6D;hp&k6& zT|w9QzTkre4QOxT4e%Y2kV#VC37{Rp;F;TB;BF;&l9YeD?-o$#UY`f@DtKW~x9g1n z(8kvc@Z@6XgrIKMj&2Xo{%5$h6W|*{__w>B3CNNF`z-w%*k}CPL$`o@d;%u!4-p6N z%03YE;z1$Q2PM%UA=d)|FV4<|+6Np_L1&dt z1im;55$J{*z3nP^j0&RF;l*;0R`4oinQop5&=ai!onG{Vl)VI9c+l;t0iNdrFBpIE zd=A)`pqo@d=hU|zsB;GG68C)*_@W2278o>P1v-cpe4I~)A3JDNNh9Eez*lIn`u+j6 zF5d*bn1?Xv^;YO~o(5z(uNfk>6Evs>>i_uaq;;|gzW4)L#S7`T{3v#0c(KO{+;3?- z0xDCj-@M?lh7`D_9a$2`5D4qX#@$E9GH4JXuzXmZc zb-OC0bqc)rclrPSEH2PV;Gn7h7w7Y#3AB_0vdFqr5InU9o*(6Uu>rKgxZ70$x&-hn zXlGq0q$9cAS0eBQ!)#bIf61zX#Jnw72(rxXVII`<5(7~0w)JG4XjVN$*|Ax0ov(#K zf}lDw5g`asUn&nSHvYU&zx@9{xC{cf$R$C}dT9?TFerdf_s{tx@UH=5UcrX*@sz0F7OOVO6-(f;u zUJHZwL;MMPu>+wFd|DUygsT@#U`K#1f&BwA5OfAvKV0DtkdW(_fGoxrQ4n?DLBD+v z1)yRcw2V67MJz-B}fl_|@Xx_)bTr7i%tpQw%8D zotOe%oV^I@dvL&H`#{FL<~P0sTJ_!;!1SUPBmgo^fq%PTP!{MQ!+;kSAHn&$+gAa+ zmZwA(yt}Jo&|>kRObH&u*T+E6$bv6N@fOzG|)<>&d?7pL@z?; z)Ze_|0x?f^hpK>vM*m&_JJ*$mf4c`;;EQ)T&`<&;@KAx)OQo<-PyvO)`3vBIpHPw3 zOQnj?-~mf)y8v2n4?5yWCJi(Ov<##Wl5JQ(CB96+3uZ_-fm&N||Gub$*~i}kI^aL8 z+x1IYr|S!2nDgQ;fKnZ3qhyUJ_&~!ifiJ2qfP)ld&}-!^P{-iQ_gg_Pk|DyNB0B5; zi?3h6u>w-`!V+wVuK@VU0TytE0&m)WQ7|2>2%NIEfZ32N5s?iIg%TlfpAHgxY%eaH z2PXm*a3bJu1>MGilJP#gSa%+g@!q^x08$Uhcr4)5`N9v$7A2T1s2T6Wi_G(gjQ8e6 z^m$MaAZ5G{0WZ?0fgKK7p9af#EC>%nGv0@w7xoBsu#ER1@C7H>5ul9s0i5pN1icW0 zD|`bIf@Hjh5J7P8xWd>MK+*Xj;Kh@va3_Gh#t+(N`{Ep2^bI)Uy$N`6I};X|kc{^s z@I?p2FtGDM%cR}}y_ky72+w%nlofLhDa;WWk1gm$5=09ua*WS`Q!+T?u?4&cIR{Q9 zFj-NMF|XknkL?8uNC1|@O2t8^IjDfHW(KW%;|O}O^({Cjb-Sv73-c22Ql-!jupBxK zA`QxdzHdNvFI=VuA_KCwJ5(aAQ}D&Cv!Ib6(2-6uX`LP{FS^eD|39Jmh=lc<7we57 zl`E*n0>$9^3UmAkR#SmG>b^f-xSa(ZVFg+V*eUSB^6dZrFG9|Oz3(dkDo0+Z!2%tW zk6lGt55Oxb8Bnfg2RQ+}KMAyi7j%t!>J(UXe(83V0sEQ1wFKOZ1SP#vd2nO>&x^BX z5NY$ri~VOn{aatSvKmhQ{jOg?H(zjqGRF6toxUGH*%ow?opA;<9iS%nKQF3KjLbQM zmfZgYyr`HAa~!;$5&Z}gLaJv15b9vb{ZHTvDY)0*^^7`PAyPf_2_gti?qM)CIJy4` zc=2@-%)URc1ra+d)Y zF{Rd^k`fZ5B@i9mz5*a+Zl}Sq9V!4CrGAld8k*L@a#|oGUh{$K7y(clMhe6S86*Qr z8qg}{>MKb4_LYHEF>J^c$u@{ID1C?i0Ofdi^cQb&!FD4OH@e1E)fIt5NCf4W@- zK#gorqZG7y6L}v;325uppKf0PwCNiD{Y@`S85mj*ltRwC{qf@KNl@QF2~_xj+5yi} zVX?>$J4yD(i;EyNFJ7Pg|Nq4^5b^LN$N?Z{@^nMj*OW+sI+~zCFA@IjJOP0(=E4m! zgN$HdaVyv=WTmcuz%74pnZ)Dtf)%V(3}od_&_X(x_}dep9Gwiha_tC*^_v&G z`e-pq#C;m*`{zKB0KH#>sQq${Z$KMY!+ZCd{Qv)dr!lteX2-#|>4Jyzs{jB04_Q2M z0J?YrH2>WhdZ*j z7q?u&_Pw6AiyJg$4nFBITUj(PUsQ?3FA^XIf}4;Gpuhy5wFn8@UY-eoFXS~KLA4olocV*G7x!TyQDOq# z^6vi&vBHUMJ0G?D@@-3WZKcp<3J2c^d^;9eg%1~A4LzksGo&VvS-lR-P@;y`

CPgsO63`y@fEPtFAWJ~UBY@5;Y`s(`2Aav(?@hz5lK|jHVeKzj|9sIz+-vVlNfQ}-35cGl_ zW)*)+HYnCyK}W=eK)spar;=ZS$&p#qzl7Wkqv z78?%f*c$4LPQ?qKnLuRe^!)%;dK$JL$dyNyWZj7 z?x7I~$won-QUp9aAD9NeaIrUp_e2n6h?t{$BFIiq%7X>a0y#W(MuP10fflT7uplY1 z0+|LnY!h7g^n&XwkUs)nY&rzWha%X0z%2?+U!bF_t>9)!Ku1J5VA*@qbTxBIZ7Wg~d3pcW15cYwEOV0Ti52m`}Q&>>?m+sXo8 z)WK~_&w`xbkH}prQ$Jk0z84+Skbu_+q~|C`fP=O+SPg7+!a0K}bVFrem`N9kgS?r*s@!}B7Z~QHv z*`Uj$T|f=2o!|{|-Jy5Dw_||vCFq_Eo`4q*TEP`MsG0I21@5>MaLj`e-+m9N?kV8r zO;AQt6a&KxdvMo|B>+wGMfh=WO#zMWJN)|trMg?dmv)0Q4ulI1$QN_uz*RaVA%}oc zEBL%#WIKDIc7kg@Q0@tQp~eqNH;}CU>JKCC;=EZ1biOI*M1m6mFDA%??E>}TdqJC9 zU#$NE8aBJbzu!r!y9a#tb7wE;_;m1c38#>>&Q{QR;TIiWK%nF&!2-{4M)H zW48b6L46|dD&H5;pp9@KE3mc6x_u#m;mg6l-!qN*qV=I#Gq6`tD%uV;kUPQCJ^b6j zrUtw)`2wnILEBA0OSN7v%aZ5c4mru-#m{hPI^u6x0a~HL&c7XUs^Sa&7I1{7b%G7a z5`mlc>@%`yB)C=?W;Qr(!OatB?7R>%fvkMr39|(jr!Op;!Oj4!Jn3`{d0`2cCRJ}F460Z}A19t159ffTo( zWCALtx+g-;)oFbLN+dd<)i>Q9A!(hx;D}uh+Fb{3y?uGH7_>!>1)RpfmcD3;fCg(x zG`J)>2)dINo;~@uPX!qf)ZGelYyh+X(A$Dk0A(?BLkK!-8G3Y{$Z7nd8skp?OZz$p|K&fq>9IFLbSUr7bNka__MTF^cBpwfkZ z`&1AGsgVvoVCcmtyOA4Ec4)5e1+}pQUzo#O1$X^!(7EWKlWEerJ*2=Z2|j~%rGeaw zrELL9dHVxPS}*bU&445_ew20zL>r``(p1tNz{9_vDfkZJ^LZJK^SOQ86 zJ`+mdm5mRhKzE=5td--+(e2Yw0$GK6fT0^C=?I#7%09@(?8E|Z{rYlrPZ8_@o%0VK zAvwv=9l|Bj?WNG^2s%fKf4@^&^ADy{Rk(V1YZ=m2o@xUsve`hMeJudKY_b(B@&&xj zYmk+rcJ-)POHe(g^5=#WnbB zPjI;mIVBl11&yVB;UES|i_kU=A}wZy!ZH#p^}po-&7g7wyqL!dsxVoyAa@vHuK+t3elAxNR0(3GL zD9FKiq6uSXlh*Ad1?9i^4%*NLF15daM)A=1#DmXtwLVyD2=M`U2!aJ+IygIn zMlj$#yKp^7(Y*y_2x21WHVx2ak6<70w}NJfK%<&>(mDg=UKGCtEwcvYG*FTJ!XyY9 z$R(t813(RAP@)3YC&+!6;2oeK#L?DS!v#t}chb6hL2;PY=^^*xF?dg!45+&R3oO?! zFV4OJcQW|*2bO_ybI$~D2P9CSGxP=|=YrNHb9A?0T+0JK3Ki4>&tQObcfm*fseq3_ z;^5y7=^R4S?ZJl(@P;?IB7o;H$N_=i1Oq*nF7SocHc;JbgT0Y@8FW~C=#8LWSoaPz z4ATqk(}N3q>+N{LWeO()=nOn?e-pfV8rF7t;qn2LH<4S~O#!eNBcrA5x)!OTL+?ZL zfzD`0YiWzXZKFy{JJbOb3OHKYeH>^lZFYZ{SBY(Dx4PnKY3p$?FuY_1oyX1wZfQrr z{Knt%9<(+DG{~Tm3Nipk2lOpSRVWAOK7iH(b)b{-L0xE20`-|t(jCat84Bt*yK;ce z$p-bNTe`r>)ZR2Hj2z+Vv3dVmr+L z{4Jo83Y2NV)nlCw)FAM=@-AE`mso(?yAMFsr-MSL6U%E|%qj}0W(2jxyPLquJrz1V zSU}E(a6MQc^y0T4Ebe^K#)}XIaNvup z&Y<9imKKPr=N()#tm-KO9i;Bb2JW4@a&$v4R-6V?$KS#Xn*0C_(!z}g_uzwGd|C^# zLIC8A{T?N)C+l>eJ^_yngfOCB5e70F92!9ioq;T`b&&%av$R1AYXsMc1v1(JE6Jg8 zz}yY(c*0c%y%5?Dig=N3*Bh{vP2gexW7uhx6UZOXphC~O!K@4nFSS6&z$4#BS?&vs z1O67!8I-7HHE0YLHTlfU`S9F$BWQ1a037| z6b@UxoLE0@KF9f{!_XU)O6u?ajutPDX6kedUE7p`k9SR+xLFvf;SA{whrCnhO zx^4rP72pI7at!}|F6)D}CRzVMLsA@&0koYm3=9mQ#dDz9fghPCK^G)7aCnf>UufQhlncChLUeDK7^Imp!~oQ@Z$ecP;f&#Z|J6jPH0C?Nj?G<;QRue zWbF=AfR`ztt_TOT{2{L^0%}a(03VTp>Fk3K8DQ>)+X$_9p#C^+fhU84b~Zxq?0_Wj zlAsrC9kF~sldlXtnfSkt>^y2&yJmCfE>AfyO8r)mx4znZ%q@R56y)eh(Jr2lJ z(rcA&-#d^IS6>$6c64^2HOM%UbYEc4RZ#xeiMB@nGnDE z4es-{J3!Y~clv^l_vLQ^-5dexQT$2k6adY<|4Hlgs(H}~J~IJ4TGW^XI!?9%bmJ5o zC=UNLAF2y_ae^B(KE?yuzVs)pv#|>_y#^YL$r1poX*|>eIz-~dLR4j-MeHwh!HxMp z$D2T-9pL$E?f>AV!=RO#puQAp$=v*ltrm2u;SZ?mdYnLKQNMT&nvs2dsoV7r;;{1< zk3f6+SwZdpKaB^Ef!kv8P#1tyrgcsLm9{Td{{!_%{(wsDZl|QQ&c<7y!>gu(r+d3Y z|D<(x-2n-Jj=Y3<@E%B@7^DJf&;yV_637v_iqYmDocz6V;Qg|`KcGPz;vw=v7j&+` ze%~M9HPPL!f6_WbJeXdHLq)SMvUR)u>Fp5!ooNj#AVK3}B8)FS{{^kKaQy+ko$*g^ z3l~TYc-;EnLk6%Kju+=~s=4?Os$>mR2|PeWKz^BqF4_PRZ9o^D1QN}Higx?{>7CNJ zgo%Lxy!kEr1o*B-7OoebU2%1#i?}|u#kHG$i>V=2k7m#QOx+ojyY+5^X(GwuG8er2;{sr|zLH8-I;DHo8 zpiB?m&$EOJe4lL0*Z==_t^@@zNai#0eX^}7U;l&dUSxRj`ZuWAq0tS=*}Wh=$6K#_ zgUEt{Yw82&k$hy0`wl?6vR!QgUZ}!F zRY1iCL$@zzn}A)=ix>x3rDf6G3J%N$SWyMK1*9A7fyRTNVkq#%em1ZdjW0ozrgcsL z6>{CaB7xnZu+xn-0$-f?0`i~$IBdZ|s{ZT${})cbKoJM(V@kB1tSbSnaSk;IdNCXB zfJFZ7t~Q`+biwzENd&z(U=Ma%z>D@gP%wa3%|ohmsUXmiJ>9-0pi?A3K?fQC1)bkF z737KD7A{ae59sX$*&q1gTQD0#^AQEm+1cRX;%-+F$Q%VYr-E8|t|n>SJOXK*y$pXq zOD)qnr#3)Sh3gw|Qu*+jn}2`khvq{LX`P`T`1iYh;NRa1vKn+A-wSF*CefbD##AdK{6myz#>x|LEA6VI>9o%t$RSHsPy(O z_zS)*N8<1Q|3TmlBpo^C3=DzYU@rt^Idr?41aw0tWxB!MZa!24N@E{DLopw^LoIq; zyg(OCNd&%Vy$1>a1ODxy4nbLrFT}Dy0m=bt?q@ml_JZsSe38fjj$Mcvhu&6@y#X)0 zA)=t@@-+y2vBwS^C#?rc5<$VydZ|Vlxog6$~;bvb1M zUYN0hER#v=Y(4P}Ty1=q+5E_!`Ov{1plfpZ_lG#DfY!FBb+>}@dRnJz&x^^R15`n& zX@8(x>m~k{d!UImQ0oUd5kZRCUQkl#74hhtI^`=U4Qudk?_jb9#RNF7Ggvb)1b{Qt z#D7){pc@@Q3jSEZ75uV-EBFCY0QCbj+#&n@=Ai8N>-9Yo*bD9>C_v-Vq?g4jptl#~ z08m*1@;9jKB@_7K)FhDK19pK9KuPPIS^+A^3^VDD5= z+6v;|-U`Yp0a*_GpfxR!UWx)V&_F>6O13LN#oio{@16vKlJ<)PCQzac0PjKP-wwKK z&dvsw`gFl3J|o8!q{;-xRa*B{kO$H_MLb@t1|6CDaye*R2|U0h2Rf}A)OH6IPoX`a zYM~W$v_2@4_s0GI|9=;Q188=2svo#nnAX`E1!@k03wn?b17GZ9geG3_nW7)MT}^sH z>(~}Sgm*cBcZG*O0h#PN2fSY>t!imD{xue+amy}=)r|mFH2x2I7+&GHM#>0phZT70W2LlC4mCi zA+UEUsKN?@Mjt5QZkzZGk}f&^{Qn=&+Y9z*?^ICv1B*~-V(o^^^nyoZK*Ph3jLE;f zsSC8nl7G8z4=Db?`yA(hY8ThEuaw$@JTH}FRnqv(mKJ%nPf4%C@ls#f~B+dz_%)14B?R*y4cR zUXZPUSq{D6R#i|hxTOUvhkC(FEP{GndtikC|Msb%Y!Axspo$k%cD(^-b{8*|fL>@r z$vwNNYfhG_H;5~Ejgj{D2>jF?ldG_)Df3OT_ zFb~|M>ueDP%bfWL+QsSX07`~7&><-Scn#8c2$W8PdR-d=y1@p5l=XlvECkiK-~k&ydK!{Eqng$Eux@&7XZ_-s2XI507M70b7arIy@wSX z>)lg9DI@4b49q1NAeVrf$)Iu@UPM0LQpr@ zKLIbEgRO=+7UI2Lh?{#MR%9{4oT&{lF5tzYDv-J0RV2va25LnFy+|zwN%BCNlWCof zH7|re{QnO%lONQUg-G#l53C7#kzRqOI*T#O;e}x`NEEb>X$rXP26v`VPib%d$;97# z7&IIP(!c=G0BRQVZ+D#%@FG7EW&(Jy5w-8lzu$EVXg5Lur0etpbO;+L^#^rB^1_Rc zkmbUV2!RG1|Msb%1~ok7WNSb+poSdit|Cz8WWLbtYr?->BoGquumIdu3DN?MXK09E zgz`~Hj0C)}0juT!nVHtv5(;Wsy*Tj>+~)ZKIy4>u#9}$`AoBtYFRtrw~YF zBAg8p40w?SF&Ux+5JHfFDb~68d-w(_eK~3IH zmcSPRpo3apmi+twA698jdGQA{)%+3^rr_QH|8{U2J21-uyfz!OgwiKK50qVgD7QV+DB0x4M<4}m%|kg)FU1qBqW=7SW1tf2Z7lvhCg#lY^Vpgtr>wF;=- zY6yI>=_;rUaCp%Lns|1AS4i6Npy&eUZE$(<;*}A!LMjFC+XQt1jvGUT_*=l22ZLrQ zz!f$tXru_#3fk}cp?8Y!n{VJ26Uc3_hI|&|il5$*5(FPW zJe~kh48s~8&?-5L@kIedV|OcPkw)_YrA{yd(nDxIsMHDWDx`IT3w_ASeJ~TW1s&96 z0GH;SQyM4OFff36macCCUc8M3`!=o9^-Ws0Z%V{$g2S2SRg zBg2crKN<`XQSp$G#xH*~7#fd&I`-CYUTpuP!2r4fiC>-pbk0=7CP#)R(Ea1{wm|lk zgT@r6Z*gQe0~PPyg4ko;vIVinykZMtk9px1#2)j^Es(RZK;|TDab#$KniICgkpa}@ z2aR9)Y=MklN-!`mxNdP|05wfP{Vu01jtroD17h25aby6sdq8ZfEshMJ;tRw!-{Qys zDxN`XlP!)6py~j`Hr(RK0P53#&VbPX+4b}Pe~`HH7Don9^nwPKKN%bOh;KKPfCuZiwC+DZ6#+QKa0w%Zg2dvI_;ipkL^Lxmzl@={ zGS7%1wIUfz#OI~v6fjg8F;p5dROB%v=Yb7j$S`C`k5A4oDuU<(n^2aYnVcG*mY56? zE66Ni2r-BUUzHhR5MPv94C3Y{R=|aF6Dz<%nRy7I%shq=1Ju!Dvc``CyInbyU3ofP z|A6j$dx|pL3>uH#vB8sp;l<)#8sIyz0=E7CzcWXOfdPER0O}wWs9z5rTRPC$Ds%P! z|ISv0tN;I}b+)Qp1r5S-bWhYUV_@iV+kU2T|@Q^FkYBKgg!0AX`wstn~uOOQIk(5FK4hY#10`uz&<0 zniyYv|NH-c76^ilPXlddF$e(7%Ds>m2NmfuV3#;Ly|@5UW&>$jefpQho&~4tvyN%`L~CPfa;_# z0WUU3fNce>j|BHSMd0T2iUbC|Q27kD0VL?56WARp0MQ1X9`BwAa!1gM3+q7@i%1q| z)hYjW54*q@@8DK>!`v3|Lh>6IL-P@i4A4qe(55C(0t|d{_!GneQ0n6W4F$Y-c*h2` z5E_&cCJLA_Fa*6g4-x5Y-LVbaj|4?kVDHpB+rZTvC}jk6_kxml^Ffus-l;Dj;(s8D zS&o56y9};^6$iWrn{eYJSn$I~u;8DMU_q5nU_l>H_0!ur;}cl$2t@D$L~zMxuwcnH zu*!%pVC^Yiz=8!|z=EL63hLd0Mmlp}+tCe-Qv8ynp}ypAis`F#Z(GAte$S z4CRdA)gXZeK`)wM;-zK~^`J7tAn=72EROkG_A!8Jc5sKxDJ;L~9K^36oiyUd4jd|t_3@;Y^`u~5IW(?TbX`K^5gOM+Ke*OQSC6ED9 z+1m>W{J`F+pui8xVtsMpH7FoNUUdBW|33pXEel%9vb_U5BJrXaW_gJw$U*y^%32SU z$YlwD?@YB~1rJ(qG#;A80!mnFAHj+5wbc%=F}|Qf3zJ?5fZTJq6y_eV8$osPPOflp zaHVy2f!+85bYB9Gyh_PXTFBWS;1G7{Nw#YIp;6*P?v_vOEzyTbZ zprM%;rf}bjfVcFfb+&?yw*@)%wFYQb547AoEa-(d+yo&MmBJvE;Ox!6Jy0a*g)&SX zf6EL|Ji2lOywK+WrD7J)`h?zI(5O>j?^IAi2la~sUIa$7gXSS%cG(2IxUT{A1Aj|5 z188goT-buz$e=772sQ^?qzCna>$ia3-V<-Ynd!)Na1Oh19WrbP&bIv9r((^wpbQ(- z+X~9C0jO!FyA_mE1G>S3@St@fK`(g3L5>UnZLb53ciIHLu!1?V#2RJ;|Mpf;u>o=@ zC=?<27}Vvu_y82K;NnmF0>szV%$y9(M%e$Ta_CECJn>8ua2lKUlmM670RbF!w-%5!9pz=sSm#twGpTtm zh-560hA@~)EFcVK{+9U+3=A(Hfwp?Hf<|V+8QSNCJ;)`Y9LJpk;y~A|Ie^BZUxN0Y zg3q!9=SfGO7m{#Q4r~kzFQmSK_HP@5OMz|=gTNP+FejA=flifo3fKmkn*0nJ2Y#)A zQZ(L&s}z8!{J_P)@Zuy`rN<8N_GqZfmVyTU!7k$f9n!z-E38n47P3>(O#(zMHlfg#|9o+>o-OZ31+0cZs6g(ZgiZYP(37fQ&&paGPr9H7S8>o1`5 z4L}={K*Qr5;3RO8zvU~asz5~ZQ5C2~{4Jn`wvfc(%K@rIpZ&pwE~xzi$#ftUAV2bN4-5k(S#aE))dICCctAroFA5<#(mGokwt)uq zz*ImtxDm_`I-e_xIg1&z`HX{qdqYsDU~LG#`O&OBetCUQoPQAFLGx9oY$SLC}jS3&DfwuP?li z`uzWYMuQzRKj;L$_^AwyyAp#eCUDq;Dt}`on5a~5?~Iq=QXJIi0!2l@i_l%5HXsk^ zZbVQ$ zERLWTa-1BXd05cqZBS`068ItqZY-n-+`|e|!SdP=bTlSNjZfeU54aj>i1Qr+dV4`` z1tqYc7m~)H5}oIT;wNy&g@3S7ZW@{{IIhPH5A)8&sP%t^|dN!fO|Z$)MD)6ZB#>++-bC zi@6olVh(sQ@j1AB%>Xs4K$lE`j1GKJ4H11&4C*K4frv~Hkpd#(K|~bjmM>7_gnzq} zPrwUrMQA*g#$<6rDjc7n7p8DgH&BAz56`#Bpreuz`IZ-^j=#kdB*O|fK^Y;V4_c)0 z_{0DI;N^ATQ_@vozT$7;VPar_15jYXE7abp z3m^@Bo2%gVHz=_n>Mu~JfI=F4IT1LVPga7eR~;nZx+_4#phT5_dn?GafZkq^X`lqq z-3030fQ$%y;g=55DgaC7A^|UWU|RWGoIy1gBRBvif{M?e7w_ev=JL0I*G_|m7a>U% zx~2t+VR@sM%Qj9-JDx z!P-H^?L?3XFJeIZs6eA@t>7?vk>d?7HF~FlauX=SK!ypyE)BE;3mgF#_wi>zDNqDl znKT}<0VnUqLm&oN5y)OpICM`0IhlWZ6UfGZ7bhWZer<)~zRQq(Na*g{^A6Gc1sVJT zv|nigcsH;j6F6(W1RqPz2}*X`J$wRRtdfHUVyRdbC=WxD?G%`3NjS*2kfzLwcb-t+ zg3eijgaE{s4xmeGUV)PbDC-6GP6ahA(Yj|~S7-}@a=Xgwq%1DD6Vzdrm5OEYLW&5V zfER)=(GoNM?Y*Fp2uQ;atgQpo<^vC-qIT86c0Bh3wVOp=oCobl0#%D1X`sX8GC+fQ z;C}LpR#~X0OQd>RK~4?m?FFS|P=XA4vHbzajgVstcK-my84Le*ND%OEp9<=Rg5oRS z#r&HfIndq-Ur;G46Z9e$ZZ4#?4~}X_kr%3j&?Xl!)VX-5W72Lq&j>1js>Q2QQq zsmL7bx{{IhhzwBv822hS@U}s?91DSLE|9=B628O?<92r0bDQI5z{V7KV zP-zI#`{I-%1E?cuqX!$N(zQKx*1f zIWm9>X%M^ilp_OZ6a=KE{FEaDXw(EGUVO@t0n`lvovWU4%8>zlgF}3NQD!@x_&S@rFj(7V(B= z*i=>Ck9_>BBA(80E#t2J_p3*vJ# zQy4%r$d9Q7#Q_W;B0dK~WiU9FGdMD&=A{-fxR&IXFr*d5Cne^k6f=Na0kRZiU1nYZ zf^U>Gkq2q)!2AIJpG9m;|>W0JQKJG|B`v z-s%PDkOa`4M-UfOpYd;p+7pj%kMSiWOBlhHfS2~1OzZUh16p1k`Uf)675WEs^jY%{ z-r8!2!$G5OpzXbXvQO~vZ=Wb(J&hsg#eH#@rvpIdcKiNG>+Aq~VCi$v6l>_8>_a>t zUv^IbX-Mmw2y)_!4zQ#v$S6>O+}$W;J&hr)vk4RuFS0>*f4ydX3EDT;e1ygN&5M-} zAq5&J%t7-DupHarwMegA-47vMhIJPD|SAgvcj3_-&$2qsrj2`%|OG6G-7z`c+N zx(K{G^iR->imBkf0j$*>76=wif`}pp<~))DU)&XgT37{owG*zQ~itzpY8$dKv?)!?(W)6p+~`KoS!bz!HZbksBBm z^x~=`I0f-FjI;;2S6tI(D_&$Rq2DoniZ4;HOr!ll%DlrAsHWDisoI=sjLZ9oFWZikIIxXqT7f0YV@nL1_~_jM@US*ZR$iJ@+&ikZ070I8QK; ze?O?r1-fayhARz}qdG(Xyyi#)pP>vo7Txs^Xfhd`eZct#re66V=*&&fxt6H%1m^c( z`EN&PD0qN2t+R0*XyI-kc&EmtG?49}qmKVT?zVIN!@uA6PxDWfTF8lv3@5p-Ray|=O1@Ghs*?mmL9h5xB_-p_eAg{n+#T;P81t2a+ zF?hbRHwVN8DfR%#wq}61yr5eyn-4N}f*HHO?L_bZSkjBvfB*mA2_D1;H5|LZgZS6~ z{{Ii&`UNU$I~{Fa9Qz9{20$sy!=Tg4<;7OGKw7s)R2pbM;v!_Bn6yr>uowM*|NjTw z0tDI_nbsNL@S+Z+#+M_lJFp_HbLx_}|Npun2IzcV#DKJbZV?4l0G$(jtQZ(x zcz~Q(0LkNNon2laF_XWDeo~tOD1QF_|NlY{G@}R_YUSVVWEb$FUl5u*OT}O_Nn$}S zDq*4}qDZY|up#$AJ0)P18fYl)#Tm#6e&GIrUC@hMxL(lVIv@{#l2_o1)LWpQ1P7>} zIkn;D|Nk$hfb>CciUAjJ$E(0oWG=*5KVVEw(VAO3<=f|f*dgBNl(z65or zJ9}CF{QuuOb;0}p|2wCyc>Di<252{LZ!5?ikh8ldz5uN?eBl8xCj)c=NN?+gw~(Qi z#)CmRpfNoyh-~lFhMypFrhNbZzq=Jg>Pj$zQsa#8FoSy+eE$zxfzHw0^u_=*Jo+Bu zl^4@Nb7)$z;M@(Kei4HQV`v6g98{)z1isLNi`#Zj1*L0nHf{y8KsmV=#DZmJsDhxN zZm0scfERO5fU|U#4Y+%j{Sh*&3@Si%0$wa|2Ul_dFVcU5DjSZp?jGo@^2MMR#Wr9` z(CL=^`&&UV3z}SJJ{SP%f;E9AmO-m2zg&C>=7WYjv=0Wn;Dz{*f4eW_MoQRN2v6XP zPglXQlhz$7fa_u#a1O9ORVxkNMGMN&Aag+@k33El{I@3j#Mfx;sER0$-F)1Wzr)k}h~kUJ$hFLk2{MgC+?<6P*0p1MPxdtl)!Y3;vc> zj0_Cm)CH={VN-(<2>CA1m<=LBp+C5|Y&;0s`V}CcRLCH~}15y;DJXF$kgp8o$IkP-1`8pDfIaM50nC};$u@en9DK=l+f48=Ua;R1Fm zsLi*1B4`pf=*2xAcuayeA-|CO0UCP-ZBqsfr9o$UJ7J1S_;wi^gVu0Nopb5`|JP<2 zphZ*25g(7F61oZ>tdeI(S{g`SD~Jb?D^{h+OQ;ER7c zK&1fx_Fj;-z!w{xz&VT`w6z^Htwx`4SEp;GZt)ZT4#$_3#dL2h8X)o`a5)7m4CZOOyG+eZfJ;=D1cgJkZEsGu%93a z8I(d_Tm#K~K}KUc9)Q-AfYWUER8SEMik5B<9gqXS`4ChoLUZBy*`R2WfkYFi3jSfh zz`zO$JI13aufE#32vT%mLuK- zt&y4tQuyL7XgUnkmbd}(b@xa zf7G*N1uTKG^P9;JpZ!-GWo#(s)1qN z?w$&&#UVOD>+)|;1v$n6v=#t#?g=QQp^{~wFg^18|No#D+wSs!CfULHrQ?$+BpUd) zH+?XLM^9k)R8XT6o;1MT0_{Br?47#cCU_F&%uVosaK!UioMgpO@@fK&y(=wJgI8vq(R zz61(h_Rrw?QLK(k9ADwofPX$Q_y{I+>hX`na4d`xnP@M2@_XrDop#%xl z)&nK-SzNHP1niC%(}h5tVUEt$6`*=bCW{kN{ICXqN|zUv$g+^&-#-!LO^B-Qo(UjR zKn~;I-vky1ms;IZ8a+TI)r*;7U>60vm|zQLbha+J^#6bJUJ%JpDv-taqTC)N!2*%! zZJlxnl(&09@`2q`L2e3qAp%}h&y&^(t`k95$%7PS@xSOc0O{ob4ZHAf2UoN~FW4dG z1-!5WGdMb17hL-PKjSRuSUfN@;6(^zp?5%raWSNsJn@Yw14GaY8>sk;U<l+h|>c{0%Vws z1KL9ZH%JX&LE)wcDq=y01P0kMFa-8O>X6>n2vA`P4x#{%csIC17W5(qTvw~?04ugN`Ww!{>z6?=K`;4%dm*(FOc46y*Qi0}^|I<2qLGFEV4m7U?N&?%Rav+6B zU|107SgzJ5(E6_NAjs#SZ1ENvONamfB@a+GY&--?6`+y>lr}-;G#*4GB2d}^B~AFG zYvVysLJ52ks0#{v$Q{oY!RvWJBL`CiL9%I`6F{lsh3?z`|G~SRAS=y4>y%rVK(pX! zosFQB^nwSpdxR0x=LSV6sD=c&0qz$5?cn4Ha%Iqq3*fkr0Vh6>vOrLmTm_UsyTMHo zP>BaBhCynf)jp)aVf_OtmLN?d{_PV%r8Bg>1lp&}0xF52rR*1my=EW3tA5g&nx`HwwL?m!(-vH`gQ%!QPxFK+jP+x#y!zxw|_;~E=u*^f)$3nQ4R zrILsV1zDINf6Fn@D&}6$C?RM8&z1lGgFqgF)buZ0wcugUJM{o0g@DRIMDYhI1%tX< zK?NS7(Bgm=l>skWj)JDZA$@>A7EmhS-|mqT*gJIts0GvA3L1`NRbd3TKEZD229HoS z9+Hp+x2M7KFJwSvSucp)c<_WII3gnI(E zY!2L_f02%mfLW`-2cPnU6wD|xNIPe2Kf*^iqKEMK6#Ci|X zmH{n3hlz6pbc0>qe2^y)T;PM!4rn3XOBOqZ<|7&1y&wbm_XjeyUMhu-1cHUqIvtr_ zTmemHflIz7GvrUjgdi2lckzfaKc`AQ$vb1xEnbwilbMK-MT^G4!_HxD9S` zJpieJj7WeYB;dt4?CcJLt!GkAOg5+dL#uy-oR3&`gUu2jDadY9fG&@}L(p*Mr7>1e*7Pk}*RGcnJoGnbz4@!vR{4`V6%C z5z@ux-wv)O1G;-b!=8b?Q$ZuSLA|Y@s6|VMy{!z7!O;$~Fc5A%s1X9ou;9fmUEm>0 z6L1EG!A-d0fJ3;?x4 zKnVquY``TIXjS9tJ)oHb1z2wo)^7sO8T{V@lH-AHEPDx^zJV;;ae3p&@S^Sz^0FO< z!=Pn5pxG+xH!lt!g3M>}%QJx15BR)sWB>&=Xx$F$2S)}_uqCiCF#LS)$NdT01Z%p*ahz$89?0u z(0ZZF_l^vpRuPDu^xlyH6dj;7LQ(G>89-$Nh#ds7>*@dhAhy?gM+Q(Nf$Vh$`Tg<# z{~*6OgZ%ga!nOzb@g9V2_1=*I6qlfVp$6|A89-$y11kfA+IvR^(6|Z6J<=e%ZbID8 z3kq8(oB6#X1E>!TQuFzpBLk=m0h#mSog)LNg$WXW^v;n1H2MT$-+AZA0O~1$!s^C5 zM}`QfIhWo!GJu+mAT=l7IWmA+k|6ehca998Q74f4ZSNczK#f?C_}X`n^+*gX3=B)& zIWmB2Zw3a2dG8zFiZfH< zlgb$i<5Tm>7}C;8;*(0#(in;h;?r{S^NSe3>wv)fOY`#c;)_cXBS3403gS~T%ixQK zK+A|yD+-{?hceRQ(?Ppn(<&Hp@{<#D!W>=VJzV319bFhQ5{q&nYjqNHa`MaLlR+k? z7BCd&6~z~q=Ei5FGNhE|=2n8-fV8{_ye$^Am9@AskHN8!A+xvu?EcK+H1L8Y5FfUv zCmz0@$ImIgxB#?{DBi=LAvq^CF%OBKm!DZ&iNr5UL|HC`wic)u;@{-_qWIjz0+3S~ z0)iPzatmBRgdamrTD&Xjf}!$a$U-5|k}Ko|L{K(p-4GG;_sG-z;Q4t1^Y7iR90)Ct z^%$(6{e%H8-aiI4VL%f{jR!${4g+7@g^GlNMn1tKUfiC1pk0X8Z(aoMLtSbBoE=Joy`7_nNC2wlCK1 z1=Iik|53J|eFPm`0KQBSG?hI8G+6%P?!W*4cY?)0v)Nt_FV29rueyRZZ*+t9mzlgc z4caLSoo{X|0SyhV1StXSEdiY^|Nq4-5Er4th^b~ZTLy*~6(A#E`*(d_WP-Rb zcly1E`iJb!M$kmf3pbDvm%zT70G?nl1qnd+&n~lJV0ZyKaRIsv%dzH#7)TnTKA_+Q z2Z#qz>{a&S7h>kyvFODc5D%hqLKDbww?UKTpd1UC&UmHI!0_TYXxbg@rL^veAd$4r z32#6W>p=76;ElTc+g$}9Eo;!hMI4~bAmG-o6HCC06A_?&gz#;N`rJhdL3!vtK>xE7yh347| z45dODpjzui9B6UC5tf%-Dv&`j&}|$%-5wF0UM$_AJk5t9K((=lLT4Zkm>UD*f|l=h zJ1Kz1P&i(k`~x12hVng_UhIGibo=sjdI-Gc0`EQorA^Shq$>w2Xy!2hGV`dt1Kf6i zPDw_AhPNORLU0LCW~c&<|3D;uZindrjah+4#vtMkA>z=n@UC5;2+;k5NLx{?3=A)1 z{`~*H3v|B_B(cPR#6Yt;;F(WQtGEX=Df(jTHn1JwrdI-ZF4TBE=)4}#)?!xB*a|2v z8xJBzVBn)HprM$67gIw)V=IvM8@SI49m{$V12GsjT^MjO>Q+z>{KdAP|Nm!zTieiapw{=W zY^#m5CI&QN@S^MI|NpxLKsJDjSF}yef2@+_B5H!LI>Ke0xR0ODuFsETGmrXnEYH?+8;lK+*mXG}FzP#qnZ>1iX6(9(ig!!~h3_11imDfsEnFO2{gBv0of+(2LD5_JtrwlI8*pi@eZ*m zLLd_&Kql~KRb+q$Vqa9jG#&_ekq2X+fLyH7ct`{^J^kX@MzG6Zq4o@v^Myd`iol8f z1-QEk+P2@>bO4mIzJEiMntMP3&%PlqG@GywBz6gOavNwtW#hpkpi&!LRze~v9O7uC z1&2>SIu?LTL6p7EKw>>0tDsT!0whrV?f?HBpkY$T9G?-$!|5PJkk|^Sdl3oZLA8Kd zJ}*2#0?^oP0!5uUNC2XKLIlWAHPCtkP;G^|YP$4K7GoCciz8y-sF-2>p;iX8{&5$B z0JyK5);Yxkv>xKcW6;jk*N0&dQ3Q(H^PrpmK!;?zaMJ5IXW9bBNYf?3sb0S z(BJ}+usu}x3&;}CS`e@UE4-k>pyeY7)fFL7VbJJ91}J5Lb9Z+W$R7bOKCJ_X-cIl} zd!W{D*Bww)oCa-21@%n9xwab|MvVtSRs_DthiHLS_DqHh3@>Jb)c1gH!2q9ZF%jgV z#zP>xgI?G})kD)V2S|N3NIiyQQXwkQ9b@pBpcgwKYQUpHP)~s(A@IclR0&Xcf}$bdMLR?SmN(c885m$i4GYK* z%Rl}9|6&nn`zlBe$j9Jm)*UFZ62lJ-{yhc^3|YDv2SB^peTAU@xDW&puz?9203AOK zTG9tHCFlhU#0f|x$0<5L0 z068b{#g{eUfJ16QoB)}1_9M9304E}lLpmElD;YC1WBS4Oy#(q6y^w;;Ne8@GC<3wz zbi?%r&=lBy4;D~EeJQ9$2QQ$UxzmV&f#Lg4kYQaQTYF6!v!KWK{DLgBgif@W%YjVd z2zXKV5tIQz$M?9ykMH4vM(h3)y&`?xt{j~cpjoWjQD^2(&?&m#e`X$-ufo7EbLWCK zMuzV{1Hd<$ym%-8Hg!ffEL3}0oWSt}nn-%>1o0Hur2#Ko?Z9fmO2JNLX#y(+Sp_;D z2vlNpfC8jf1axvx=LC=$FZ)4$1r=MMBmi0m0_qolvlp1-%5l5_luW@KkTOtu1am+I z8z>EeIUr@AbO+{ulz}omm;+J<%IaVaNEs-DgE=5&pll81fRusU2I9QX{_y|*3pEg- z_yM#B##Ny8K#4i*>{;YtSCg<4qtjkQ0$= z1JEe(i^%tgh6!lz#0!u2Acy-3w4MYz9JI6x)UEvZ7}?>V$^Sr>pcl8{qTKLQSn3NY z{Yzc5JYLND0CoKlP$c>u>FfY4p>M7|0(ZRz)b$}^&|)8?AmGJAeVFS(p$!rPxqg=j zDAK{XZwn~L%m(et1uYQ@WNE!rstRiNsTe_Xz5<8=Dk4CPfENbo0-(<8Yu;{uU*+z%tN0 zKhz%}b3p!p)e1hKF_Ko04rnvL42Ir*ZsjX zf>g!5xcvs6`T`Qb_W|x?&;7ZT0jO`m z3%1(c{QnPYHalj#D2G^kya}`r2NYH>Qb9VPW`g^zA#eWwe~}L&vOok#{zbwYP(A>q zj#6maPHR0`ssqoTC7{#+%LkVqKvPFa2qYhXwm^Gk1-zK`7Me8nfC^&QJ)KP~W}u|8 z2c9%EK(0N)@-jpiwARB{0<`T~1k|kxcyV?uXflik8r2|;Am>AJ7k`T}=mZ&1xdhs> z0+IkHY|zLbm;)-8M9e@;aH(*-0d$%khznK*+Kd9`fRusut$;Zo(?Gjcz#LFE0c}zN zb3n>K!;D}KNEv9q3YY^@W&^VaqzrW09#{sX479f%%mFFOK~@IZnFW>sDcfQLVuCa7 z@x~1>4#>0;bBGM0+;U`jvE&tU@)dY7<<qW^c&~~05FFyz} zFuZ7g_5c5iCJ<2zA}T;c@hf;_DCZG zV6xeubpgH#fiDigg(5PR$TBdz=zk4O3Om3_VMk{ZDB_xHcfgZ^EXW&2SYCPxfX)_RG*1+=dV++^e54qD6l{w~yyC21KGK&#fFwKuyNxb_Zs z!N&t)fCiw`Ivp!O8D+au1!!msv>4;Xf-cbT0Qg!8a3c~nNL^6{5*O%n{n1?egQ0|@ z+x5pw4*>>-*9PGAa1cvSbR0Vc8t4{5(IE!X0j=p^sSK2`EUXwnlOqf-8ejbX5AH}o zN;ezOwxrk>|NpzMcA{`3F;U;KIw9`57^54j*GEsqS) zfxIuGV76}nS1lVlJ3u+Nxpo8G_7~3~Rf`D7c2IQ(QV{SW@B~;GT6TcMK(@c=0$JJ$ z-hvA*+CWJhR`J>0fktqt7a^4J+BTH=ubnxcOp1atHXa5%2$>;RQ>&9y7wj$ZH#9AGcc z@Pg}~?k13efEP1kz*RIf96@3rN560ay9N}5{H^yuJ6%CzxsZJF{T4L9_*+1CN@W}X zH4!E~hX&dbP)2rL(%A$mTAOQ^!0lIn+V2ChADjt6O&VM90t)crrWbMTpqv89L7+Vc zjR!#`a^MTIa*#M`4r1eFV0f(u%0Xbg;1xZMhd}CsUbG#@%sHo{r_js09XJ{ zH48c?f@+ZF+6C|ckbeq^0B?v>x;sD$0$=R-4t4~rfpZDe>{|lbFAI$lkSdT%kdkaE z-14+6P;tb+9n@Bhhl>XA?*}!^OFc4NKnr5NJ%u`L4%lgPIwykav*y}4aHoOx=Yn$h z25xX&+T8(C5cp#69wp?dzaAqJv>r&{P%oFS3#Pf?Gp=-rY(>E|K9~V3>wm0ivbN|EdVKkG<&>MUQBxY|No1%AYuiGSPU`~ zRH${tf%aIREP)+`20F|t>;^1u;2SN&f?hblL`x+yCV&P;K;1)wz!x6yU=xAG0k}?8 zc>MqWgx6BwAmd2u1|M*e)(JkpJGIoH5^EhB8PXU`erLzgtMrp2{0ylXY)Z{~)3=Ggj22uht?So6TL{wKc+ds3YzI_NfVf~~2Oq(dy@-DJ|No0HWOHGw!a=*FTLce)%mVf3L7Kr! zd7(GEwQzx?UT}l-vpoc@TLm4U1sRkAsck$oiy!2hRkN}9W|jy8!;1?KkbD#P;$RWD zy9W1Az>E73k&G*#g8-Z!LBqBOoXmPUCxY6O&9y!7umzb1%Cmpi85mwmfeS5=LqM?z zZUKYTgE^oUhC!$6mltsl{{MfG2_jNJL_COy0uiAgA^=2qKL8Dhfj9Mmij+H7pwV6u z3OdP>ryF!IkwDOkBQWt&3DA*yaPc)T@eBr9l;R%`fE4)=-t87f)bD zm4IYHrO9h6=vk5~0WXfB$bt@feJul7`U^671zeW>xa$|tS-!7jkSdl;xNF$DeN{Sr zzr0v}@BjZ7o9_Mpk93fkGfY*f7`W*OsR8C*f;rk4R4gDLT<8=L(CzyLH0J~f*iEM3 zC3BE&FKBQ1YaUqX2jaa@0$FMcA}m0J@jXzn0B&0&H%|7zE%XPa8Q7Vj$mN|`MuI#8 z!;7N((Dd8^O7X58olT%FQFCnvJUuhq0~c>Eby(r05=aRs31=CB8{18w)e8YHu0sYL z!6RrLpw$X(cVTTz(6EwOMh2+TV}x1Q0?t4!ofARbuIAbnxP|?9Ar|fi-Qmm&&Ojg~ zAPZpw7E++fN&GITw*l@bu*!f>xjH%>oXKITR6wde-a*RVoxX3HYu_-GXrgo^_CXdJ z2fR4?-v~4;((U^ut&{P^_B;RogG$ijO$JsV%NZD6Y`KHz;F*A0@{>WPgX&Nnn39Qi zpc~!61t(~PFYv`#YjEyL>vVm=zdiIt5O`1;NxpX$*xg_`NCE*3J_o)?{R46jXqiG< zXA?;1g))lipuxnz7x_3%hsf(=m<}4w4t&9mY&uBj#nIc4U9evuxeZFD z;IFX9)ub+C-3zK`*5Lfx-;b zRR%R$L1Lg3l(7I5LjP|=vs?qn>7fms6G3AQ&9x2i9MF3Uk^?{+j(c721Y{Y3RDy=# z4}(wO;YsUsy~4j8B*Xv0;TJfOfOhlnZx6i^^kV&QumDI6ICDUH2a@MtK9U8O*N=$Jpq zhUgdbCxdevSP(RU=mgqn^`a9ZiZsmv-s-&R24W!zXiL_Mg&+Z_6F_^nUQ7T9K%D@d zlCHl2Dsg^57U1p>cVc+)cN$~?ZsQTq6qxm!7e3P=%WgqCN)L!TG2DUPgK|dPiJ>Gl zw*a(;54if&+LKcV!y|ABVWzmU3y zNSEM%=L88r(Bi zAPO`O2b$5(108S+p3&cb4O)Ia0TuDSPhd0pPvGUJ?^RII#PU)>4mzX)nyDKmGy0&z zdB9n-8?sH}#f3gdI)+MsI!T~bN6?Gy5Q(fPaDma?0h)&le6bKo6x167O;rZG=!S^G z)(e0P0j(DZdT|IMu>-tb0JH?85xibt_GNIc?glT40Jr!+Q;`{K*%_dhxio?J0WXXp z+CkM9$TE;1WO5l?VnJHR{3l>F6X?w9ZU-HdDP)kAUK2;`Q^;Sy4K|K|7uJ_SF^)Qg zeEbWz9^?m2A^U-+kU`V8ua!ZL0Zk$!%~OLd5pjeo8jN$i@R=pM7qXz!x4kmb#% zL0s^ZSvTk?FOL_yF8=@Dj9AS)8^lGdX70I&xth7+BD^YxtY%IJ2|%l6@M`9;i{Mt_ zht>n723aC6o?n9IYw&dtp$|F(6`E@wz%w<-JW#*dTZ)0%bryLLd_0HW7~&Xv?E3 z2P=;TXul&!0OJ;N`rQ7eH6GfOC4|A<%N(pcl`&!2SYFHiK642E0gZhOFiVxdpVG7u1c! zv)}%hCa6&=@Z#TjaOQ=M{Udi&TaLi8B6J!c_#!k;?tshMJFsbhJMd_EcpjAVSYB?C zfR?qOA^(6EUK_x|&|xf)7^pCZ217v2i>UMe|7W4D7G{Td54>9p>TmFVu@~<;!TyFd z{LDb(^HS##sSCV}m=h!bOvDzQ!5Vak68S!(F0JNb7UIKg#BmmU{UIKg+Bmk{L z!ApR*fCQjgz$<|=MdLWk;oC9sB2c3`w8kK512wBUU z1@RNoN*wT7UgvZF|HD_dftCXYzWC4q_C2g<2BkLeX)-UaLnNTV;#l^A?Ho8>k2k>= z0<(Y|19csEA@Jj~|Nrj-F9Zg!WdJV(K7SUG9Kj2L_kjeUy1?7x*PaEpp+N`MHy#2V zFBbG-6^iAJ;4$YmkUp5#L9O%Bv*1z&Y0SA8NeQUe_#)^m+8SfU!>}ZXvBp>pt}%Xf2GW^_BzkOXj58oUf|eSfCBC3JQ0N+C@4cX@4jyc4j13_A z@T@WJ`wr5KYmM=Tc5wV+Ut@e3E(wZvv^B=t;F6#M0DX<|42Uc=c{GC87(Y3U$Ti?K z#+N|?(DV#mL3{`#0F8SeQ1aaf5`ac3cxG(D>Hq&<>;@6rPJ_yC-!H8vQD(;S4?trO zWoAqhCJLJw`*8+ZwA=s}EjM5@V>jSMOWSF18S*j`dTkeUW~|;3+sqiWXqlh^>PG%K z1x$ixuSc@c^sruV`TL(JfXE{2%V3rP$ymlv!UVrDNsf)0KK z%>{#83=Z?O&OnnFw~&Rw&bE7T3`5M~#U>0fs~7W-#g03Iu99bXG4lkdAcCv}09gg9 z?shPMQZBeo2d^4SJ%LDs-$1L^Lr(nvkG}B8;l%&{FQP$2*a=W&02(9%uY-8L2Nubo z6+p0g=!~@CrTTty9X7+4`5?Ko!k1@* zR+b?z&u%ylNqWIBCxR3NyjYnAE(KuO2DF3?R@8x3ufd7~@WQpX$Nv9+@d89VJ_d;; z(5fJiIUsL=Cz;`Ev@RY)G#kK++BSd$VA&f~tIY=qK(jY^QCr`!|NnO&7OR05wN)KM zUMVyIyr?bh7|KF7@S?V$W00%@-f;iAJ$OIV=-bVx4X8{^3Z9E9tXA$_~eFM1I z-330_8Qd%Z@3XJ~83Gz01NUsY!22vzKsG@OQt&Xwc_h*R}`flt)~O&I63!Isy7hG#&AfRZ6B^@5iYS|0&7<@h1C zv%Szh^8fz?Xj=EGdLaX{2)aGhG2;dAk^lc+Xn+W15FrO5BteA85l|R_vS}%f?6DCv&S!wnr@I@G02)fct^(Zuij)0Tg5!gyI#G>2Hhan-< z23l(YUNnPsrI}A1EQCM_4ZhOM_3;1yFB}fT{REow0tGW@mDtbi2#-LIqGbtqu^A=` zTSU}!1nNXkD(VhB09!d^#nhVf8N8pP}$Qn85EI&vLDbgJ4UUVJ;#SqSO z$hklpazg(gZKVkWZ^#J(X?uMhR$PHMVrYz0-dfenrmNx7rwoC z`Hc&D!Y_E$&WjwF)&l|Hqdj0Neq69<-3?j?0ZPcAC2ycGdC_+eQG|lmyXArept%&h zUnmA704+kn`-Qv@{{O!NG&l~LQ0i<1?-w!$DT3+(?-x=#2yNBD_Y0|jL_l`K_X`Of z1m%B_FlZGD_>M7X?g!2Lcw~T=*3}+@CW1Ynv7pdBu%&f~#j)H6A?frUCv@QrXc=AL ziQJ4g)VVNeYXp2jML&T-1Z%!jYI1WjNfuee-&0AhX}VyOp63D`97zz)c@ z(1j!C4?0mL-WloLn^$TZOL)U78=u&u@X|loAif5~)0x z1slM@u>rP33bEGj&whw=&vQV71GM-l@Ws?i$m@_mVjwGF1z8xVC0?{2Ud;sLy-3*) z%Ddn)IR(i@ws05uK~}BZIRN!Ce5oI35g77PzbvSWY#}ZRc=7T+=;Uf9b!5tM~> z=8gR|csw)Ug&)`ns55W3?t>-46KnVGg4r`5r`>^1Akzl506Qmuw)KD)p}?1XUD}H> zw*X${wr?*qpMjQ&fok9vdqAqt)`88~ix@TlFBWUx3)&yG7Zk(b4hm?U61a$G33{Qu z37Y2kTh!p|l)mkQ#_|$y^K?lkctH{J+QgQ<;IMre4mvRn)I0^Pq+tawI06k(gLvS< z&+L;7oh@A81xIjI;Ppl*st!JcsRG{-1}+r4!K;>7L5qX}UbL3OqM>^t$ZXL3L=$+C z(CR(lAb|)6y_n+%StJDNSAZ2>O6!~mR@ekm2onx`u^6HdvUZ3K=HCUN)Zx0I6MRcZ zGtyGTDSIIPO-HP?02vQTP%k|8{Qv*Lc@MZt0BiiSY=j1D3G#x&cN<`$paq9tz*~C2 z3l3ZNLIWJ@? z4Q;)E7w5Ge0IvcBCxx(}7XfhBfmQ*6tM9PD7gjJ)*eXEq>ZpJhPH-P)fomfE?clY0 zK`(Buhk4RAcU3Qa=#bPcfpII2??Nv{Iy-6 zDjQl2ffftCI06y@FWLgtL)~Dj(mE%ApbzBFQHV0bMI&fXv;pcs1bdFTKC6Oh&?EnWu;H8XHw1NH}KoC|!~ zE+|<#8Gzd6keL}(L6FlyyQ87k%^*%F1}{dM3NpPLG=KtH;Sl(ul^I+;f{bYbwKe#+ zcYs!8z*;1rA{DwmVl`MLXi^?Dzu^1hMbys!|6io;gryr$h_@anQH3nZ@Z|vC2f+pp z8{XrtKfsGJl))}={Q-3|tQQ3!9#lPe05KjU08#JA@*;3MIL<)}jJrKp(mK7^Uf4l| zjyrMu|NsC03wtE>1uqo0gG#_G2k@K>=#bZ-7v~BgJ_hXwcjbVb5c^^$L=e6^hv&uf zZQyKr+yOL%%<$p`nEN6=uK7rY^_v$vOOa-+q30Wc(r~~F`$$lG8Pu|XHG_4bBA_u@ zP+ALmq0In_E6}}Rg{9cfH)?*vaoqI>Xxk}Lk@zn7++j{3eM{R zFYXBa``>&-pwsma^!%f4*FViiIIQ2i5JGk)$TTn}=e#G_eN5H|>xsF)3H|)1<~KaY zUB7^ANA(u}epk>f9^E006`i4fj=O#VmqXeA|NqYtdBL(B?7>dgKh3p&;Dd|v{)2J~ z%gb%dpeEIyv~FLXv`&r}>YyW^LjQET3UoTLywC*keE)QZ{^@pN>2&0HApuGo${=$= zdlI?@yFqJDg;&GMw@7Gp5m*xRLiQ>sS8;&$k@Ii&sD0C0-1iWbF z1~~+@3Ko?0zXZNGvI?e-quce%OHoh>%hetF=eQFO$XgjLpyaN<4eBZIMk3guL?{1& z%wl=@5VURqqz*I-|0CeV!#Ns|i%xzVchmu00R6%rbd*%+kK;}TS)gs^4xn?K4s`qe zNb7V=d7%X2UFvrIk=8i@T#E^U1WtB`{z&WW0@q>;pp&FPtu(Nf#uQM^20HHvynq_4 zF(Bdv_`E03>2VN^pkWE{c~8*YZ9mdF8$sg}FE&F@Z30>M1vEklx~~Z|?(ie6(<|r2 z6p%F3ZFw)+Ks<=s0@PkqfR2yy<>(d!+1c&Im)7YK@gf-{7|PMj1ae$=fJRzpVA=~m zkf19^HwVZu-HtkGolRiN%|PM^6SUGg!Q&?{lhHjp^N9HX?(Ca~|{ zflh8hm}8LE*#QozYanr`Io$%Cfd((GfJ6``n51<&<-AxA5=3Y>OY8K=doc?n2-Ta` z9iW!h8JO~-6(k7N-tEZI>7?_b2_yu$W2Dqu2|dKmY$jDgfUf z;7w}Qu!Rgx;H1g|3a(DaiWkZty`evXUhKL9PEMV!UqI>TOTY`w6|khq+U@$~b!|7u zBn43W1bXll2l(KtAKlP{uQ-|y#dNzuxS)WC9(2X=;=pfE0sI5X_h5Rl9xeb{*x?}n zUaOydh@l&l`+jtWFbcr(c<7(bkj9E`*DuXSc&y*NC@X*!p-Ahkz&C_tp8(ArcDrza ziZoExFR^=(0kX#T4?ko_vvhMU4?~G)H|XL*zek|bkL9>4=x$qZljcw03(b4Tg5W#a zc!FLebAW>dd=6&$CU8E4tp0kH4|5Bshzjj~gR8uPl~5-^=P-%9NP-xGRzm&x1-9m; zJ81i%E3AY9l||sf2^=!8a;X4xmr^x|C<76VAafxl6l8gPz*1PmAs10q7to5RpG#oM zP>QHWY#^5)6;X=IVCuj{)KW(9>Ik$Vs%IlOXrMb6VMUZ0)K`U|Ss=!4NGmGvg+DvU z3Z56B^PpZF`uYF=i@iVp|IcCvHS3u8w|fW#zKDT4E*84|sR^`LE8vAQOrq2Xv?qXr zfBQs`M9>Q@xP)XDD`>!Edk07&@P!~uqC^NhI|C{`Is;f{y5&K zU<)dD85mwjf!rnf6O?q}r3+tLXCU~jH*op}=SP%Gb`7#RHQ>eFi=e=UWin7SImQvW#;saxw)aRWJtKC-}mGf#JpFTn&cs-n|mX|Nq}<#fRlO zLGZ$?w9eKEpeq5sf=+2Vnbz660yI7Q9CQbpDELmlLyVnZ#_?8{VF{W z>Zt+8q1X9=GAoz|&abUL$01!`PzBrB>H(VlnF~5}=>sDJ!%omavDp_HdRs(6*DM9R zF#ZH;igEC72kj@{A1ZP15mPtBgbvW58rr7cOp0Xl^w@P*o0P_%G> z#xVG|yNU$72>lKUXO6VaRtu0LdO=R%-#!tf8g$4yNHE}q15DQm&<=J9&~>pA2OltX zgH?A=1Y3I{=tXBOs4v3y7XbEi_f(J@yPH6^2E4eM2ht3_<>Q6t8Mx%hfmUtynjHWC|FuwB z_f!xAa>o~#$-lo9B+~ptpf)7SW+&*{YKZYmUVu^^SYPHv(27OoLjf=Rz+udhWwQgU z@B~Be6y7;EK?=d9WS#&kycqOC6{7HUUq%5l1H&%RE#ldS7rr2Dz^iO$>ZtCBl5jy0-c+|Np^J07M}t2I|Q;AvN#|~v>UvcAn3)b%OD9J$mrNbhRznz9pC@| zfARP;>|8Ez_5im}_J98W|HUoHZA{I(KwF0ypj+}?IhuFu0TsCXt!qImx3_{+ZUCLm z#0(0*i6CbOy~v*r^-hUo2E#8<6CTvG6AXHx29qe20PRxa=!O>gd@%76Q^;{VkkSTp z+QH^;;9L^$!U~+~Ssudzw1pPu3bUo8+(3Nc6O(1tdWxE5|(mE%CReT2Bne?(1 zvQGr+_!0|2DlK1*;N1dX*$M}rq0pFqP? zX`NFYKt-$;=&&hQ5a9qKtU;$efwp>gb94s^1ikn@7Z&Cz(EV-DFn|D;lUBujquq@xV#W(+X+KjXD`?x3qStys*u(>Rp9sk|1Szahe^RxPKhWurGUbnf4`GUXR89J$ly8-ra?&yysZc% z4Ql;?25&)Z{{0?qoxL(pr63xtG?b%x7f2eU6f`&qV)O40bn2W6svuu;9d8BEAf@2F z1KHq`1XLG7s_||?C>_WGs?EW5Spfg`UXYVO*QS8%0o5xYLqOsn{|9EtgYH?0I1ajb zL%z4QT+=*2AfSO|!G z%JKjI19pOr+=lQAzHtFY zU-%AEkKjK5@q2qg5g3Rb%e_-Ujf)_(!Wo$lD%By!`a^`}>pucEAG9hOqMzkA$UJa$ z0oD(yE`oM|+b&=}sOc5r$R z%Hn^q_Xs$9!@@hQvqe+}loe9nftFNsgOvxoD4zw(v)mA&m$GaO46tE}GEmy&-|kTo z_(Be19JuyRg0N?_9;nNIVG6pNDFHMk2`;_6K{ua&oC!6xlm}9EHCMPWlsZF-#^a9Q z$_`Wvg~|lIFuehGX8^1KU#SMblBx%!tH`F3^oi?A?$&_QD6|NdA^bkV7j#g)yiD5cI+TA$JT? zZg+Pa05K*mQ3ajAm)6;IfS-Zkg#_rBC~%x!1YHl;-6H_Hb)fm68+drR39O|9q=kR` zM34qhcs3sZp99l)5TrB^bSn$E6JK3c(ctQaRr622@~zV+qn21l=a%Jp&p`CDO1ERRG=1 z3k{z+H$k0So);mYBctGT1T1tp0$*6e^p~nZsu}+6PGQj2AOH5in4lLwr$KGtZ#f4F zJ#Z_JAGXyP>=OR%P7$EJgy6)(za3m-2E9$<6 zH$7B4=)NGRB_0uhSw=8-fvdlO7bn33864mZhP@zDplzAPL!iltpckALpoAg=$xB%b zkQ@>4B4|3)8zrzz@&mMI()#uP|1Zp5|Nox>4p^`gK#B6jCz!WUlD|#rQ(z59l%%8Hkh9I-Q(er$X0FLYpYnQ(?}4D&pVoRM2{$gwOaSOp}+> zYXi77;D7)hhYqh%vlw4&{SC1O?A)|YN2eFTpaZ19#q=Qt{_Q=ipppt2FhMV#Re*wo zBTE2Qd+~3d!V4-$f?h-)07nvN1QT2r?*!Mx;Hm*s69>HTiUY+M53C5<0UG0mmqT}7 zg6^gP*XN*m4xCd#cjJI-nciMd0hCxlZ1)f+22f)RRBBs;#6hh!CI$v$ zklsuG|AVT0Wstv4|Njqa4v2vKbsBQ_3Li)fl>I;0i2>Az0h#$Z*ogs@3qb5w!A=aI z`~hO$4R&GxWgt+a?P9PK1E>iH5aTUjn-xB|fbpz7T#{N_<)c1L*#cw4B8B_>>axwI}hQt4IRd8pw_chN9HO90bp`B)=ryCkUh^xwNRrEhn)gFSWQB#4k$CaRt$3`I*U?dFdeU zr&TZ%WR@gnK-oFP1@XC=DIi54W?pJJi0KF+LCn;G;s8jXKv@i_d8tKk+v7pE!=Q+O z2!V3>H4PA^+TuYmrmCo;3-8=zn!7EmV=>`KSMx( zf#Jm-$PC=;u&ja?3A4dt#h|f&M$j<36-X6$Z^$&LDuZ6vHvzq%iA&J^8bL4e)`9l8 z34m(QH{bzM@JMmMi)p*S;>HIc#n^!`Cx#cF!a>DY^AQQ_H!s{GAO%<21W;Z%5$443 zH#gi6JdBrzAc(KQ%2aJ{5@r-zFd0{U(bWdN~OXs680;LUTLV za_cuQ?uTQ{$b!aKr^qodyeN(UkFVxD{QrOFQg&?PtDvGPt+RCj=zyWCpb00?%urgl z6BFoCUy$GdBtf>c&ej`9*{W5#Q`shXMti#g@3!RNMP?& zkp7?-{<}eyDQMKU;~{tu5TrHWg+(Mt7`!xsfBRIBRL~0-h*Q%#TS0vO?O+Px0+?wN z!DFyINOA&!FZOH$dl9Oy7h)RddS;LZdV7C-0N))9an6B-ASVj&ZwIG=fZpB}55ck^ zML{n<`GZ`=!@s{3-2^08oH{0sy2Q6fmFw0f~bG zBQK9-MvdoM^T@P#qlV<0~N z_NgEWl$1n3Z8DIqz})nMT7wd7FN$`8gh75O0r>^H883X`stO>gK&}D>8Yr3rUifxG zGX;OkKX79Y?p~05&yF7U;@E#SZb^~d?Qw}Oldcwq%I4xIf!>VsaSLDZ#nwu1Ql+rbpVnCTr* zSC_cM5-?27i)x5g&~PFwTzkRc8SvslHrQ2Z-C$3qb@qZB^}-7@J@!%(w3iDW$&l3l z;(t5T9{!e}kkA3?03|Vyvw~jm!|Vc0DD;A&A@D`^Pw-3&)Qg}{fhF`80TBB!oP1(4 zG*rML05T@%g$m3Vu+d;^Uj#tZLGv0S*+E?!2y<R0;HxzK*+6Rp1t67DN~{yZi`YO=r4$coTR#W{ zwXH$5gY}yiivuB56u&&^as-B)SSJQhUI4X0&&N73fbu7ZeK6LE0puRgR zt=a%qin=au&L*%VDEom{1^?)FvI%%`+#8&X0p?`w9!Ik8XZo!}zhZchhPabgp95m4y`lHu{ivu=te4Isq zqiPldHray@8IH4XbXCn_0AI5NUXSskH-wP`JlA~j!EqL*GgY$~c7i(o*`N`!AH6;T z9MHim=Ho1k_h7OIA2M`fSo;KK?ZF2O-M$Ee4?bWx&cdWt4K*1}@5P75SvWkZp>8_( zh@smR-P)k)Sqz}LLfOti!hJY7;*FmCd|B1jCA7enV#KONn^b6SC7d80z`+i94 zWbt~T_64-rZ~1G;(RM#NnT!v_L0X1NP~5BGX=bO*$+_#YAzlJ<$v&? zB}d?k3s8wr4v4Vzn-{je$e9(=|7d<=65d;TW+yM=xSWL!x92bzAMJGg16r8w`T(42 z(mH)FfI=x$fPXtnsLTDC3;{3Jt_O!tTBqxo7mA=cI~mZ#891QtfCKstG@$SB?{~e! zzu)(a^+EpLSD?ybe<)~m&z*}8(z<&tfI>U1)Az=UJD>jl?+tws^y0BUXb^@4a`qU@ z3l(ngx>e9oV_?%CfK7h@HT?nqe%A;5+kG!sAFQqB-yV7cG&lc%f4}b)=7Zg#BK+Gy zSHm|pLTjrMY5x7b5BT?oUSU4f?JAPi9eN|JQ^ey%0%#%)ba3v$2cR{Wpd=4+bvI8_ zApibQkR4Z;FLe8g@b4E14C-}#5zr0F?zh1COyFhie~8OLS?~obSdio8uYaJ{^4Wl1 z(S&3th8J<(NX7p{Z_xTY6YDoGmU}}I3BNq(G!=#nkkbGE|AR7ENwO0|Vllk?0qTD> zz5yMa8Q#114(M`8Pi(OU&Z(eDf6&Us&X3T|plO}G0U&{jkC6Gl&^Iq~KmPv@F2F!1 z2EK>~sbpnfU`Xrqeexm@G`$uo0_lOc{&?XC;`@rEbql6-hJJZr1e&e`Cl7Fz^8Jto zIX3G9=ynwT{jM*pFYx#N;bmY*>-H5$>+DqkS^XDuXGr*gG=AY$5fGmj>XfM-Al`kD z>~_}=Y27@op!Aj2*((4NKmGyY;Hf+y-p&u86H58Fw}RvXUTCd_Cc##Y|DYwtX`Q_+ zAZ3%lhJ}7e>t+dMsG7x)*4fGc60d@4_k98ypZ&8MtQ*uEd658N&j`q3;osg1QXKdq zXFpgz;6*Z|j!5fl{qhfV5GQC-=KufyK`*)>2b!jJw!ZoI|NjeVkXsL=b+*0$@p!?G z@cjU(j}9@Ub@!Zrr1jnpAo;hTt4Ov_1^EQjyamzFmOVHM4?bXK2Gy3|oIyno4=CmL z{`m)82?1h2(*INtlYe_FnA+b93I|X&TMn)jz>=Uc4J-{>uj0$oEi$olN^1ltII6)e zfXnrOMFU?<*$MJD%gmsF?x~>luR-152n%>|+77h3MW7SR?F7s5ZwEW-;zR!JV9P*D zaa?)2eL7e=d#1*KED-}+0+(z7iw3;VM_AGevLvv3DkxP1y-34m3D}MN`@u<~SHuzO zUt|v@fb3fJ4m1P}Rt%EsX$6S}zBml-#bWW$FI!w5;@=OBm|hkys1HGdv!OiQE=??* zExjoq%WT1xfxQosoB|dNdJ%@OtQF+3fbL$9#{ysUVp{gn@E^#*p#ni!S}*Rd00ldE z{csjT#(imLh8M3)LGI%T3g|`+Bc*y!aR$15M>4G&oG8;eTfr%R253(0ytrM(@fBRIBL{K-X zkGvtyLro75mHgXVL76__1v}gz5Wg2<0b06pwg$Tm)QJJ*jKCL8??FMq1J0RY;LavX zXRFMAP*{Q86OhIKV%>6(8t}3w{_Rsih6lZv1rs|EkR|Y<2f~B;p}QAkK;VmQpFsMc z=4DC3yp|>ZA_k&z;~lSA{I(;UKF6U&ww1`Id)& z|AkI)_`p(F7XJ&TWgsb7;_L0z`2YVuC>+3vDog&wqorVZP!|jq*%VBmp-E&ukZ zAT2>z@-MbSl)@qv668=Pc2DUAm1{vSE?okf2hp4*4<6)#CGHoh5EH-woC#q=O>5o@ zidTl(9MCN%Q2#N)_1Qwyg7jrEzIeX@Y()Sp($7PxqJS62HbNv`+yy5m@KDl=jZ46S z&_Xh;(BEUAOCij&;`b|2RTfiLDm6sL8zf)u`R z02%l4{$EfQoC?aMpehR_6Y!!GZUob7IZ((!lKBf>unC|@2c?gfE)cz-s`cO_CXjZJ zaKMXe6)+dDzT619trHXupb9kb#cH_85g>D?f<%M5L2EWQegjvEAW`2Bf!(1ZK`-V( zg!s3+J^>XZV0#`ifqV+GC+LM9G}yrU3n7YM+k#B!1(^#mBoZRdza6|xS%iOkAXCr_ zm&M=!2W{5tbhLP3`r`lp2`?R385l^+Hj_b3Usz4;K=$jY!o;MixnUqH2L#y5Aj_P^x`R46DVJTOoF6_MyTPT zZy@1U_!S&}FI~a=T}0Bl1DVn~r-GJoya)r`*#c@AbAT3Sfhsx|sAh0O4Wi!=qMv`e z?+;MG@o#rx3V0y{wip!QKA`rn?*h3QeK>Euf|OFH)XC zV#@bL;0q0?`u!mFt{(zk94~_^F4g1T4zV7T#-@T=-$5@{E`S<;AmD{B!r0fK`Wn=^ z5Nv+MnASP<$3I9ruNA~dYkmPLia|{N?Y&@X|5S(n|NmQ`ssUBwAd&17Y~7(E-A*jc zr~apPhH$XF=zj`ICVRkroL-P>&}OHqr=X?mB5B>Npr}skbYgmu{`CKU*it-jLpT1aey3WA%Up`Z&Kdwniwz!GscOJG`O>jO~ay?z3UJaC~En8otK<}WyK z(mGo~y_*+j!Lp$rps|kJS%fs8*MROx0jDNV5P+*L5Cd9uftZN!0woOVQ=krFE2#7W zl@MSB`=^5JVm`&c-Nko7z>COYXzZ0JA@o92q;-RJLh_R#$ZG!Wy&!LZDl&*!V0SZL z;NR{Ox&V|df?jZfSE}>8O#J`<|I6e5{{MgZjDdmSU~G99$WiIIQ1>x+OF3!w@@Mf>*94?!;);HrzeT}Al!b2PtX zOzQ-v9#BAmQ&<`zvGH#QCpFM8i1k5Gssby>KE&4TE7Bdv(tPrNTBi>a%L_};)hDm_ zcZ0fypxt6lOfS?PgI4Z?deUFgIt5>dgH*hH@evfW$R7MZ7wkb;Aqu+RWCCPxw4um} z;e~?@Qt$Y%4QOx_)YG+o^P*zX`QX0La;mZ4ga<#klNM*C6b_P@W56DzOY17#u4;FOpFl^;<9Dy&~@?i!Cfy%znAE41N*B_8l&-DlYe$Z~FH~jmVnh!8q zpQzQ&VgU*9Zx`|HDVxO*^ui1_tO-_^*6HG9@`C9vsIu7cI-}e51#5#4Xz?lNgkDgA z?+Z3R^ao_LA@m3Te$aN}H~jkrn-4KsAF4G4neY0eyBDN^e?O>i&Jqf;Dd5E!NRt?3 zeK*J}Ae&}@rgLAf%VNm*|Nnn|2G{k)4Bf4u%o^~5S0CI93<`LWtOsHV1O>eC)CI9P z0$xm*1BxF|#SO~k&ZLOG7^{=7fuI+5P{;YcN$YeJcp?7_ z6pj3#0~p?3KofMg@0;d>B7rYLAyfNsL%<`MK`+k1f)#GaA5eMV`i6g7 z2e{-p$=`Aibczk=Bz|nEB^J^x33#FM3o{}OW`LsxGOhKw98#!)hls%A`QW*mH{IZ# zTBnZyOY>e(Ckeh+{u6kHmE~oY00Tn?F8l97n)?ASmVi}rpiHZ6fP_9MAt77nBft{) z;s|8k9jC!9FoV6Z7#t2U7~(N0n8!f9J+M9CsiQaD;Njj*7cQ3Oy&x&L$0Wffvb>zg z5A_&iDeFhb3?5{V;ROrK{?k980gH6`$n|O9fCY^LK!<4=x_#ethcL1Py?DI?)K2E; zc71c)K>}1EzT60EqcL5&%0y{B(X7eLv=0gX6fYuy=dTF?-q2`}V{Jo%xpC8hj19kgfq?ba| zBB*l;txUSXV^5t^8ZU4$Ff{K4$-rYQ9Xw~t^71|}XtWDF&L03RwYyuoKpFyG6mJKI zJ5>01OBd+gYEbyUu>1zV)j?sVyrY2FJGhI?Qcbe>j@mjTZdB}=U@ zDA@N4f&W+#WlqJ==H~7+%kN3F`2G z#|Xgnx9<<=49ySz{h>dae=+m-f>zUJ3B0&o4D}1BTLiKSl$yaKJe?tp8qIq_!f-oo zeFbF*mX|?1kUbNw;OSQ1FHpn3faXV=f3ej1fU1c792Xx3z9@&84;nlKSq_?#1=$fY zQKP#TB-qK*)VvqOfLl`xwdOT91H6tcz{&e%F{l#>%5Yf|u}`+^$*R5g?YALZH(eA?;aEk^#jCWH*k;#Gn^TH-o&x@vk z+~-upzy1U`Mpa<;g8C$2&w&`76ImERr3Z)&w@?#m;X=@MCf7G*Eg&jjG&&x4yYjL)P2zDFbV-L zj;6rM?{cIL#{WLJO}(x=0y4ft&0u&Tr2#P#G~@~ChulC`))J7x5j}(9#bB6*7eP?1}0_(2F4e*ph?-6lAt}5kdq*~ofHCIm}7NKA+j|)0y1Pk z*7QKEL2|Sgva*(d3=5F5REV;j?4XPWYS%+tv+o1A^#^m!`VXLzw;Ocm0~2Jq0?0Kh zld*-(<6hLT2?1I2PYvv8B-iXgR@M@bQ2Ll4zXd61o;@(NM2&jgJ^?T2)Dec$l! zp9tzDYaa>#WsdzFAWm;c?+$QYfphl+y-0=F$4^LS3#!hJpcmQ@ozNac2PhE-zIfIR z_BuFSH-Us+l)MA2s{<7e5GB2k!BbGSdGVtfw5*N?;t^1~Z@pCN0dnwmh+0@1{zX5; zSWp8LqpXwT>&P`j^p z3Zn;Tm~+4DkK-&&pf2r;V{iZe&*0w1zyNNJg!Hxqy>JFk33CLzI0a5K;Kj5r@)LnC_QRB42zqfCk_>i&+yQCu_V#c=+!6YtlV#!yr?;T9 zeWAv>{^<5;Z3%p_7qW~w;Drm!*b6}~G9bpz2zVg}Y1o1dz4)*@^bMMs@7}=u1v4=l zX5uHXgCG~~xjlmV>p%e10lq)FLFwp)4NN)2{g7Y~hbcc1_~JDr&LH7?iW$=lS#SRT z-vRP9cv0J%-WIMO;L!K|ah#ATlZyDvWI_I=Ykg%KhNj(Bie^XzLRt9^fTPXQ0&2EA~F zS$ziVJ&3mz9)hd`&&9o1G6lruK=n4nbcof(pgG!?X`nG8(8|OYT@ytF7#KPxFoS9V zx7VPdR&Xu`rR&Cnpp}w=y`ejTUhGx`7a+KrOQ3ACADnHhFY@;mF)}b52hR&IFfc?N zZw1X6FfcGI1GnyRG=uhoGpzLq{$71(Jb+^w+<@_E-4Xa==LE3VI$J@_(F_I#2Hozd zAZE}D{#aN|AOjMQ>IN$bc+rlmK{ii9pP8cwzAJ|9{9a z6VS1y^^iphX`QVGpx)6*?7bfT{kw~pA{M)C3n4o3;KLTC^KuQa683$?uw0KE@ z9J3QNH~M-f=J^(Zl4Lbiz1vVc5Y7Wila$?x=|Nnnbp}^Gb#Lxm| zf9-N&08P1p#GiIKF(^Ry`P}PrVgN120d;h*bU87kCB-MFrTe6%LRkzs#qo(%nYpDU z8S$xQsd*rNYEEidVo7E`m;;prt;z$hcSbvJ@x}G$XbU`9U-E%Y90aY$xXt6O5c)JJ(ctC2(G|-R%Xy;Bh6F+RQsZ<L@IQfm%gvkFoU&TcLpGTl5A z0$&(GoQ5HJoMi&2D1E&J>{YOts3Xsy<+|qJumgD&occnVG`d;30$$up0ecri@;FNu z)XW2EovvUrQG3JS0O#N5SY&;n7Q^fku-Q%6%`SnNy#`{&{?I?&E)z=vUId}3Kkm|0 z0&)c0aos*mGJ!9&p~^s$7oadY?$RLxRt6L34(ZScdcgu!20CN~bT8>~mx&r6WiK;9 zr!*4bD`S|wKf1d>J-}{}#-JDLk|E&*HT6e#BS;Ds1K>m21-rq$xquf{$d>kwW zvLEc}Zg96N=tVqK3COtPji7!MSP94{0WX}OlD-_rL93S-Ag7G3QGn!Rr1jAl=a)iH zCVf%x1k{2CA3xI>`sYO=oC`W2!1YhSi~4YA-N4^671S{S9lZ-2r|!tL?@|KQ>xtuyq+3ya79{~vRG&hSG2F{oMK zssh@lCIOy|2D?$C1k`>O03Y%M)^+hwx2s4uk3b-pmwkvCG~+A67z8exKusNyZV|?y z7Z1QE`wDD5(?7s=ObC3TDG6?oygmfF^aM7; z#@_-uVHY$r+zsx6q;-b=c#;1I?0$)W-d>BB|Nol|F3doH8O`v`Xc(EF`ybW?x z^9x3T?wSZO@%4WG?V&25Doz0sZt!CSPW%L)$P)lMkf?X+jX(eY2lcil{QLhupxaj@ zusc)$lx_lEcyfS(R|ik=#oxOZ-0cDl8VdBbco~Q=FhB=1Il5cAc7Wz5vlw4|XahHC zkYpBsWL{_-1Bvs1_K>`=fwtrKhyLjH73gf4s2~FBb%g%tb`{{?-V*>a8X9gKApQw1 z1_osQ1`z*6S{=wl@Rqd~Tu?T64pAVj6XLuVpCA1H|Ki>QP={U%)L6h#>F4nU}zh z4B-H6fB4en`@F-4$>T-KebA~Lp5`hY2L2Y%QRZ2K8UH~ip>=nFqXvAwKEx5AWC(Hu zXkWsMH?UPrlj}k1SayM}JH^l)%F`{xzrXZHw-1*{ugFJGfON2MWeGq`HHDiR`XT#J zLT?W%=x_y)^SW6k2E3RCGu0MiDyWjpzR1??%flR~12yW!#e4t%zc_Oblp>@+P1%p2 zz6tog047kzc@y~JzCX0=<8Se01Z@NWwGy#UR&((0cVYr{B0wuXz*z@R!uid>zyR?m zr~}T^EeLX7=1Fk4`Y;KAh7*swOa$$xW_V$Jk6;`ecWDC8)V$!o_y0d6QGvEK@pN;5 zf;sa5*jyJuaH2Zy(qRFr)LuNk`~N=yHym>j^k8_g>Mp3(;%TnXVJLCHFumJHP^4Gn zASiJkV_{-=QF9lR-h6+6Lfe&xIRG5m$5^-+UL@TGh4f2MNbiNL7*_xlQZk^hmH@4? zQvofFol^x$1{{zf4^W}R5%gk5D5yY^0G)*jYw3ZOHib%{74W^Spi(yAMTan?X!R91 z)+h+tg!1Cq9W>8^3u?}^P9CNgr_klVb8w)gLQF5#-2tcSV@_O*FBaVa-PHrCH(pG? z^Z);gO?N;iKkfGg%|^Tcttg%cs6c`k$o|tw?!0^Yka?Si*y9N znC1u5#@p@6bIgH@;RQ3uS?tzzGBGB~+ zy-S|||Nmm^?f?HLycPo2r)iy2!D0(RVz~O@{QFx$imWfx7T`(!Z>$g2dV_K)B+o*M zqtGv)JevU?`tWT8M}I&T!;3?=K`jvuSP1lpZg>t#TA^P+gF~tyx4fSFvJ|}d5geRg zhX?jf1t|;aZ3UGF0WWMHGBGqC5$I@L4br@=7euw5EaB}Aor=!`rN8YWe+b@f24 zAnP|Ty2T*PBz}1Y&|q`R3?~Lq5#GSazz{yui2+m>fY{D6oftsD0b-lXbYcKSH;An` z6LM}0h|M|Ei2;`4l96V}=t$N@iMGX>n?NNq&4ueo10Zd=aR(2ihWA zoLZ1rlvt9Q;+&C~mzSCooSB}Nn8Q$9T2z!@nwOH9m+qXOky@0Rmz)Y#UQm>pn1Uh% zIx{4_G6-fMwD%aF8xL7|2GRxZUZRLX)^qJRV8+Ps!dMK_9&|YQ@BhvXzF69WprqCM z;Pk)$FU)U3Coy~9e1I$>oeE+=`io#D|Nd5xNb?WwTDJ_)c|834!D=%v9$;nw9kP4l z7-$i#+$>N@z=2i8gt;IUe`bPJyq*KvGv%uh_#zr|$QNjNCusORlq0PhG)H{r!~g#; z=HCF_iNU`eq|O+wE&#M4OCn3YcWT53(1xl^0g#bASrS=ty{!{IfNTka3Ni9;_tgn} zvAq2&Gfa(D48k-9$tH5?;hG}|QU>zLJewn}+r=p(t+NH9h97JzXd93OEYv^@Xh49N z{QFx$6ewHl7qmXa-`fdV{RtX4%Ra%tzaQ)b&=7zRhYU<9&&1;_pa5ogao`HHS91S77qUH#AxX4VSK{Kz!3Oi z7fjbwkTsygK_O*x<_WMxQ+Od3wSt_MeL}2v3fBo{28N&)PTU~dKxc@6^np%4gcadn zeJ!F8ePB;!Uli+Y0bj2W@PZ4X?p6}{l)j29Wwx?4m+Nhhtd^#d$~Kn!RI zftdXJr-CSOqC5D2fq#DwD@X@u>R_n^1H-QW^`O1OQ_q0PA_%+n#L0jE)4F{P(mH$h zoc#Cy#q3M}|G$_9A|_t?{~t7z!qM#{0zUbk3AB3yR2zU+=7Z?K-l?F>9n{+z1FCF# zdqG7A==h*+Cy{^`7dt^imtaVPFAmkAze?;4}*wXLscQ6_h5Rf-(kFP;y-W7v7*G zfL2hNfeK2nnrG+#|DOPs&4%O?kSJ(dB`lwSGAA@Gftb*80cZWix*Ho3v~Lz3zhR=UxR8JY*kjThzDqQ9w<=omqYyf!4~pw z=W!xfLPA3Y)LVg;@!1y*AeAblwghJZ{_QM*pj}&Fr(vmdLE2xKf^RPqfg6(m+BH8# z5K=dTQ(h-a*UNXH&hi!LumpUhv9$wK5rAqvkoQ1g2DTTo>VW40{@zfKmP=`!;0gky z1?+3gU?c#;KWp9sv7e{l`Q zyMTxVq*f3#&_M%0&~gY~Zh%qlZ# zkS#A-p~k$3DFVAQ08#hzZ-@E~A=KS70W^jg_@eJ7NVNz|#+ReBWgOKfa4VuO3-)(F`*d~Df@uNCHS|uf@}@g33e5@Qvh-`1|O;$CDa36 z%!me62?C(4W1!>Tkh}(RINEI^%o{_Pm1f!#s0X^;TEv=VIEF3?~ANddePRP7=M@WF?m zdpbZq3IZ?u03RI00bh0lu985h6g{9IzRGF^ou7@GP#|H1!&gvaK;;a2{DFKH@InG& z;!AzdkdQA2|F(&cMMx#iDCy$j!`>;pU{}Am)&+`j4oqo~6M|lBhe*FH1}&gK_Bp}` zu*X4DF))9_dP3bITtPd)$q;2ZO{uYh*_|c1VEVrlu^Ki zEVRl4i9tgRz4^4g7nD&TY3<^p-WE|%fCPY7*nk!oarCx87cGI!!&MXoy;#x=jYXu4 z2M!%@2x9mMTApD`6(C;)z6gPs2W~#0B>3zT%&=$!o0@%sxjPi*OjxhKn?(RQuY&?T z;Kf7mWFdOCX724_1-TKD8NqXF1fme+z@QhCA*PWY?2zn(6ztiDKyCnqI~F(K2`G@S z0$*r1K?5GCP=JIH$XAdIi4sQ8JcBJNAwIj=2sRO%eNa*;sK;1rE0SYLek z1JcBUrOf0={Qn=4z99F7fSeWh;s{JVlCvSX9%McwAmAk+1iWMf`G{cD1~h=e6kExN!&lHej=N<1R}VH38nsAi z5S;Zv?hJTwsufxmqDzA;4S2B{i!>w!gS0~;4xWoZ-o#rF`Yr|sHCi%b?rjkT+XgO& zvM(}sgDXgoX*iMrB;x)r0-HvKh|9hRas$Xmkg^cP4S0eXlqUmTOs@k6Gg@W<<#Ld( zu!IqwqyX`mE5t-_#Pv>n5dZ%_s4oucMg?Rs^!9@DRPR(!83LN)Za!cV@Zym>xciaC zz`wm0)HMs-1sWj*NA!ePP!k&I~BwP`4Q9^ z3&>*0V#s3S-`)#yQD7EmWD7LT0dG}p zIGA2+`VLAoJg?_K`XG=F_KQCdCxX`!BtY5wr-IxDn&Rtp39NhZ@&ITR2Ha+lT=NS? z{{7&<;$MFdWPcZEu@C4#V*dT$!6SG_0u*vVFU%lz^KWkj1v{u)|0Nb2Gzc$%783S1wY2UjtRM%abx!dG(J#*K|Nno& z>#dNfRd6ftB!BC7a03=4z`#xdEk%N~AWkwc`!xLtMC2Gy!VY-B{|y{PkO%?~mj%9v zh6dF33qddT$6yJxL!fz5*Ztt6g%n7j{VIXIQxC)-Wf4%6^6v{Q;@^Gz z;GH*tFZjTDMFy76pwlnCy`Z2DgwD_Owt~zI=~OIr#T;fW{1SSis}hAi3@qaC`0S{>P=<%3K*kqJ(O^43DIXjUkP-$|G{M}-GBKdL z7i4nai<50gy}vP7k2*2~g5^VbXwW=-}VZ698L91xhpsMMwkL;N_3Sr$E+=Kny$u zDsjMSOF6oI_+;kC2SB~)Oq;kE(cvx|>#%~XIrwikQ>AH-u9 zAHv2putnP8-QXO_zpVp2>v)pCMIE%`A3WCv9>xI84?+`8FKEPTdoL*RK!a%DsE6hU z{{6jpbHJNca9{+WO*}$l89Xe9l)6DPmry%Fjkp)@j)QcIfRhNQ_1zA(adwX0#Q=;%xhOMNBS_|!Vf&9V0y(JW+4V0BZ{O&2epb6KY7sU{(p}D!U1uXoc zcNeHU4T8E68Wo^gtc4fiGH{vFJq27?bc%GqRT%V6;e~`K*s-A6p2z8h-LC)tUuc5N ze3|?E|Noa-&p|8c(>lRZN}wVNtQcC`f}96+4rn@dKX^IPY|!1a3=RMPr*-zO0ks}( z?}XLZPoRUptsn-}3=orle=mpv)!4TD`=^4~P-lW_fslzBFiS+5__woofrfcOCI`OQ zuoE^d0OG%13LYv1F@s)|hJhjqbgUML4=!av=7PKcwhUUzg2bR!HveL-t>NDfb{uq= z6kKRDA!RIZvghAE6=Y`6i$sVW(BWvPQQ$(!m809I18IT}ymt6e64*&l-*&e2o&Ysy z&g=k9&ZR*HrNHK9$-iKSn4H$xy5b~g(hNMInSCOG8FbtgI4*iwCW2B3$hPc@3Cy7q z(3I2*I(v8fRFJly-d2ze0WVf|f?MG)?LaG^LBqJ9hy#TL*d%Cm4ibZ!0cw#!CNEz} zGcbU|4%Pqw4>~}@4kQL`c_R&C#4>@_twGdvf=AN9Hi1Ugp*De-&;eO~*t7|MFX+?; zsA<`U#Cm&JJ65`trfWiv5 zW}V&^0npqcR5P?E4pxsgrwH)@;C){PX(z6dcgx;FUtWBXr103QJ1sur~#FEoZCQ2SR6Ds z4Vj4rhY&AB6}Wj0)!i-9)H$VBlctIw0PJIEAZ{3P$1gCXR;RR_*>zsN6Bp10AvXHLz3W(i}SqSSzboaD^oEG@P9vs>NpmQ%?99DxZq4R+C zE+NV~dqHNsIJ^ZEB9In#cS|V9ytK|%kZmt!Z2A8`ts9o7z`khR0tyf3|Ns9VZ@qB( zAL!oX`WFpbpr!Q@kVlh1N=VGTp!50pxA%gq0M%O{&jr1(gt?r*I#q(?r#P;931XxovlkiLT5IEDlGN1Zm=b3pbOFe{eQ6ytPrLb ztZ*?%A!wD~>3{$ExA(Y$0t8gqgA4{$k|2J-i{1cGdIpvAb58#I-`fi!13_iQRFEOv zEmJ`e0g5M(wr)t`3wrUq7OX4a#l8qAL$wRc=xm(=nluG1de{SUt=wkN_Qc*^5GSyE zDo7F($sof}5;@p1o~FPTd%^QQpz~aVUNAy>ADyjdz+Pwt83GD5up9aJgM$dAtOJ<> zDG}Hp-U79?U##*6J1wmfY(Un3(1hsefB%EJ!RCSt1VwjX_f$|i2zqfEd>^3zs8)JW zuL6r1)$U%9D>{2Yie7|o0>#Tzkb}}Xr-HP??azYK*r4W_ijtR_B+u#lnKuWI{Hva!V0d)Eo*pwHJo50mM zR67Gh0t>Vr2G?*Ru-XX}%-58m9^-GBAOzZiIpg#{(CTm97d0E9c>okgFXA?WG8Llw zlzNkMm6K2T4yWBfS1i6cl3gof!$L< z?f{h!AZxLg4|6AjOahe;ol_z102>3!#UOWpJOS1WYAC>(Kp=-fiiP*yAl=~OyI)L( zu%YhA66gk-7xbb#9IU3Z6=ZyGYstxf|3SV3naYn;Pl5Po(E=}3`SMXkx4Rc47zhi@edSQOg43W?S>U(=T@wMy z7ffqG!+hY70;N!p?}J{*%E418WR)=K!)R} zkV+x$1XW0|`salpL=0Lny#$?kMXjAPGR9}NEg;uP@`q!WgtU2HXJIud%O%M@i zibe4+$TwjBYJzviWAQI2Y*G9R(gMk8tq^yj_*W4k2K8^20JH*rAqi=|!-Er)wGb(S zTLwKvfaGzfh~4gBFTqp9hSUH42O@_MNIN{6L0S>;6u}2s#2xVBDWuU5@WQ7NY#gWv z0Qn9jguo_&ws)|D&jJ92&q1hzn}5L44Ic6~qVC zIiQwT0HjG4_(F0!NHwIFFjoqiT1wO*$*Z$90#w*6T>+}u!No&bXRixLsA&bLC9MiE zv~wz0SshpzIP}vxTfxerLCW~IgY^V;UOSuu9}WTvOihR3lul5@H*u4&dM33bHHUg)2lXtrN@# zM;S;WuzM=VNKll4YLEbE_3$DMd{{ap%A_P=QKs763Q`TJNnU(f297e2F=?IPKz(t3 z+5i6&dZ&VfAdMrC!(e&&g(0M60a_{sN{8@(&jcTV0%^N|%ty~c(4-Fc@QV}9;NS!` zSNOL>0`o-*L=4G;5NAM~3~GOXJQ&zL6%>gpt~33r@$Ay;OqV%8Ec{_)XV%W^5Dx;z@;XvDC6Hg73ArlEV&mq9Ke=>(t8%; zi!Nw3f*F|wX{H3cI0#ODECKx6!Ql|p-3khzfESYByFx^u_4j^oA=`Qq6d>RpGOVKw z%byT+;4UM`K`(wS0`1G(4pEyW_reRsH8$yBx4{d0ADE{~M7pPfyX4^DesKh3%4;>y zLT*rs$dY@(1T*IZ=-#a_X<&08v60pdwhb1O6(GHMVzL74aSn)HL`*t@wZURi{>4Ol zuocjlY=&3}kIBy>(AX$Z<45R;MbYCA(F3ulc`qp8Fw_ei2d4$_#-Do&K|Ov({_WsY z7w|$3ru_sw*`0>8&>?0VZ+!#l*fYFXybwBy2i~#Q3Ni>B2cRxGo^CsQh`H9acPdCL zs4NH30o}bIvq7yKkP+|(33T)kUTFOWAIL4z33kcr=~;~3U{=5jA;_F7L;_lCc25PF z3Gel+2TwLZN^VfO3R*Y^P4%F@OTY^`J7|!D3o>v4^u$U7_3_5BB5(s+1AOzDba2%`;yk%Gl zq^@}{NC`M`gBhST1&knxmpd6i<5A$G4-$Mc4>UvzS92H41qCKJKb)Hfnj8ZSH-ge2 zC>eu?q43PG)VlWef|4(&vH;OR(BueBw(v#(Y}5+cb$nq0KK&ax8AFol3-3g5v_O(E zblwd-)ug}=-AM+{zMz4Ag?XS`D>(SKO$1NTUgB@5W@KPMnn?xise}&Gf#wik$sL|B zLH-VWkqNCMb|L0=AsWH+QQ+1#Y=V_JR0V1tXo~bj{wk1LMIaNjrx=)hRiJJJxvpvM z|NlsC0d38M>P2-6C@x@`|HWNs@r>jah(=7eK(~TIr(MAPi2LAUACRYmL7PR9-1Ke^ zXk-mMY1-T43f`%T2oz9gfLha_2_I0rfuupBM<9N8Pb*}kuf zPvq!=1qCFqK><<-wj8|t0kWkZ;yB2R@KjJRbc%Gm@CF(6^8Mrg|6guDhCT)Vj2UuN z6*x3N$rJ1q=-e&Hov_dd<=}_R|88MsU;wxLK(g@3>o7iOPJ&zu-rE`j9YaD^1zyJn zS?~s#y9QeZj`%ciuZ{;6@x4=!XSZi`vUI&@nGFhQu-`yo37SF=LP`xtQ{CV>{ufIu zKuHPK4FNmng#$z^trP4#{_VXWVNfei9U=iLq3}2|Fdl3qc1MET_+S<&)|4R%z-t;H z{sf0EY;WvtkRnhBLVOQP2O_-i5ab3OrwQ32J2e2ba}dIAbvgO(|BIYi|Np;8p9Sj2 zf%u^64IIXhgcE=xW3hpcErEwGB4f<}B_xemC}9gur$}K7$-H3aLc-R=92^j!-~zSp zKvDhTi5XZ7)GLLI?1EjFCGg@jL;|E37PbiM!DF{S!6V@uC{71QG$>4aW`Y(cf`S1( z>mUU)B;kXD8Em3B_{bg}n2EhT;7#7pJO=i%=}f#{hLjOVUJgb0f`5A}$TKFz+R*_~0r&dE8KC6k2vKl|f!S3B znj4R^fJVm|UKGsu{~spX+rtXc4h{uaV)FwT@ly2vRD$OgA*X;q!vQ1@N)6DO6Q&P50}hUW zg`ChVS7HWVnUKKj3Nsrfb}4~56tn;hVqQll%cd9Kr-5R|0%0I{uXKnGn|zj-m^k~%~8)7ZnH`n2SZ6T^=W z|Nn!|?3n$~i2<|(golBFVbVh<2G9aTkeaTCP7I);0BtA+sd0Mf!~oi33}Wko^!7pQl78sK09y47vX}Fr69Z_? zFNpp5ffEC088C=__kj}wXyK*;BLl<3N^px6hUKN9u8i2+oggVu-oJaA$FMJPzz^nnutC})DiD|J z_njC(^Ff~&7#OzScVYm|CxiUH`o0qbXbM`4fq`MceJ2J`TMV=>eA0a<22i&U#O}E7 z!~h!31hH%HJ28OTy&!hheJ2LcpaqB>eBX%yG}U6!7(fH4Aol%xP7I*_1&Dq9o)ZJ8O%7t8 zzvsjNs?tF0{r8+0K;;pLz4M+E1E@F#vA5iFVkl0IPi06>Es9Tt9rKcxT3j5T8=nfk z2+Rmd8$xL~RZ+lDl$sWwiv6sYREDC|y!@iv#GK43(9te=@o9<4CHY11$@v-acqP*+ z7>Y|$i&FEQ!758qa|?WmUGq|l(kp{fb0B7=GUQ+ifmAx@XTTf`(GF7=Tnh3Kj2DkE z0Cc`gVp6fQe^^d&d@2K+nO4C77Gp>%O3X`7Wypn4IDD0onFb09e6nd349SqAa7v)Q z0r>?K_E<#IDo`Q=J!;Y_7|K$MN-~oZbK*f(mlmgjBdshI9L8w6kwuGAlR@XS#v{Zs z^GZ_liZe?p!Kb;#7o{fVfWibJ3=?t7PjoFy&5QTUO-y$xO-oBH0;z+E2BjwEpon6s zi$_&c5bvCkmxHDZDu}8Qi#o6ns;YwI-1y8qhQj!=lro0=(vtYpiUNj|%%b?R__PX8 zT7@1%RFGc|ar&7v;PYvD!j8Ls0i7>--1P^9`U9f)_q&QT|6nW;;@|Hp()^RDgp+@N zs7UiK=2Ffb1s7*Cv>qrG&p5%xz>u-v;%tTtiA%E?Uf8VD1>Ks)zdux>`4?ELt3>k; zuvTA*=AX=^oVx@r&t_=7R4Sfv5~S7P@@$5T9hYY_ykLZC-R=uMu1qB8MLiR&Mq+*W zn*(~W7HE^B0RMK-@spqo4BpZN;lJ2F0lcCDbcPssYdvV$RHy*|b{4Jx@aBBbjzS3c z#T1BA(BJ}i4L^8ymH_{D9)Z9Y6%e_!PS-D>B~YM?W4|&&UBch;4s-*rYHu6T?hCX7(mC_xblF`a|PAw zFOET$EbjzK9el{Z?8^f(t&?Tq4zS1r24;w2u-=Q0m_vE^_m}?ZW&zi}mHq$!zbNSk zRl(j_%>1C>d*KSV)FR`VCw5B%kt_wBR0J~A_YbHEp$;2r z06-^`g7Y`(Dcbz|eK|l)dsmQFM*i)g5hW- ziyN?4K>Zh_{BHu52KyT&E25W8{M$pn1iiSf0alJHqf{W7hFY3{+=h}-z68AJf*FQ2 zk?26o0>?T^B4O_S|Nq6muK)jE{Olq!w}1^nEBSN`z+MS>p$uVQ2EmJ&U7#pC3(84M zkRVV00}t|TID>qXI@n}fK^_drxtR805Aqb4X$JzpS`gt1PI;_IrXi$22^U+Ci^B}V z8ss}6sTdquC_z4<^Z)-B-5{c^^Z$RGl}ROJkrCLLsEG+P<$?3%L3sTFE@NiufddY# zAJs2l{U>166UgIWMewW!5_u7Yq#Z5;%7hm?K)a06So z16nJCEL4G;?gcg#eA%HuTDR|yv`!v@7or{i|ATFXvd2q z5e5giOyG+~go5L)Z@}aAa_x}SrJ-kDFoRqHHWthA_@LuyLG7M7ptce2vQxzRU~PGC z=#e1MEr{JRRL46N6qW_{ zkY@hvu4h2En1GI{KEl7>^$7EYpl;tQfiE0jIzjic9!cvAJ@dl14V2OfK`j~3?K~i_ zf~sP*AJ7QmZ|MZLQb6rI-!FkL{zAe4RQ`i)w5kOZWnQ2t>jhnY0zLp7a(X9!>otN2jK6misDTL@;{ff| zbNvH$jUdQ184Z<9Q7=wy1D`Jt6!1b|E11>k`r(CX3*yL5xEH{hx_v(czG#C~-`KtW zvl;mqLu3oVdcBbJg7-!Gf`d&&4Aj!z+YIuo5y-RPL%l&)wMzuNX!{CJpP-Expn*qU za5Q2xM?hJsbQk0d9c(9OgU-6PK2_@rI;ondSe^}O4q*2xAIQ0{XM=AUJns4eTt@tA z0?p}N0v&=3x^@Kheh*MT5R}lmLGgyWzaV0Lp*F48_XzZg-B5ubO!vM>1h3iy7Yv~n zfWr5&r$5N0?6qcDr5)c%cr{`Qmlc%Sg~B64x7N z&YaL<9eN|^#X-nIicZ%n;2qDP3wHuDOpJ|-Uo3~oT<8Yf3jw-g2ejp! ze|rar8Q2{Pn)U@3N>>73>;f;g6X_1+=xhR+@#1D9Xt?=BK)3IWz!xzvqppB<+ckmi z@Ckre;sleq0N%t7y0<3~R8Vhk0x`h_A^-MJkO!{>ya*zqz6a<<3CI%A<=~*( zd^%m9yhsKK_;RFmPXyielhzr!;e|uv|Np(NM*^}KL2LLYg6s}@v04pWBn2S+{NhC_ zNQft`({&As1337%PXu{5=tY?lg20G%d>i_@$FE_)7*7tmNVtDam7i4I?`ACKJn-^ZYAx(<337|6b$Y&>pBme*Z z2Q^!Tzd-Iy0ZCb9n&q9YU--BC-U;ju{Sfp*2PXC*t=shvXk-ag$oZmNl?xgt1G#cF_%uo1 zADFIu^WsV^*p)vpUHRh0j#`i_-vqqqhosE3PS+dVzApk_)Wi8#__v4N0Ns@s@M0D$ zoxb7U?t3M$JM=}+i#C|pi(c0=prh}vfC|GqK`&yZK>h}2R8Ug^)DF~=h6-H>deMiF z23ZL9@h-?h=K%igt~WqNJqUau4pVjkw2X7Rt4zR)CorKCfiFB@Y*4BECZHSCkSc+i z@?v!-$U2cu*C(I^pM6NI+gGA@3UpJb>kr6Uh0rrW-L6l-89Mu-ShuT0Z;t?E+i2(y z@B#@?qRzgk!wlN^>-qycgcAfY7;Ne(9cEt%P~rz=mdqMZF^33-2SG2wBtecq2?k|^ zqhGWmq#?oZCFsRw$g-e-7ggXUA!r#LBs}f}zF>!`M})@}n9zy97Zxx!EId90zDR)? zHyeCX1V(s(>RV8qhdVqVDp11%5>lXf8<6M0-7jm1`Op9Z2eu$Yf$tAci^IDb)Z(xN z4S@84Zm8)#8_+9y;ky&Vi-+65#X|ED3+p#8OtwQx1yIZ4#&;)%Gtm70f!ii=Fez|9RtA(-U{k@)Rsa8kC*UtW0MBvy{((&+YgYaLKLOnN%Ra=A*6qXk z0{gvpFxT+!58-_Q+9bCeG!_9qm<-lO{sG!}=lbQvwaWkhVP`=yhk`D40j1$i-w!YL zRDy26_y9YikD1vQbUg`3U%(3k$RcfUhJqdf$qXsqetU-C@U%75WKbyr_B3<|1e)t*pwcfsLu%mw@Pt1| zjSRTm4%#hw10sbi1M#tc1t{&CfM%QX{(=q%0;T;kznmCeJlzaR`^`sWtlzw_+yY7Z z6F_PI3P|?<|No%6@xd=A*jyMWy@PRR_nXEy4?veq^zKyv9hO~zsMQua+@8Z=e6-W` z&+*nB|NetEY%;t!UH<=nmP8f>1&If| z2!J&jPJoW2XX)x}-2yu@VGqnq5Cdu^h{?ad6+-!nfXoE#2ISvA6(rQ#5(;)2|9-H8 zx=?4b`h=I$=wRKPps@n$_g@9CFSh|DB~Swy5@S=qDKO~8Oi0ZL+O`1F+T8=b z{WI{zMeuwPWECtZIm6P|_8wPI9D275s|17FynJ8F9? z$PCa150L7>7twGFLHzEiV3YZ`w}N;9S^O`$A@ZQ%nJmT^wveJD;Drh#5IVsbw|Or} z7elQOQa)xb0S);Tf^IwoWzsDE7mhHK4g_Q|zW6Ky_GmzNFGz3Ti^b2NUHTHJDd5Gm zdy7G)Xv0krc(GaltPeD{57W8=Vid$J&@|cYDglx1o+eV)svwWAO>d!P@V&^ z-58u1Krsqhn_hF--ozK@Bot&xWY_ldxa4AAj%vmqmC0WXXo?c~nZ1kefkpvfMApci|Kz%$Gp zt?~c=|9|nm5Hh^#DiHAEFeKj6I$J^3@^AMQ2m}pQf-h7IUjZrR|HFk}v>XEq;pr#} zfSN_1v8>~*pmkpi3=Fj|`U?L;&gTbRXY!(;5Y|}+--YJ-1(M-izkqIFxf~1=;Yzpb)gTCiF{M=Txxy0wD8WF9S78 z)4F>>LTQ~nt_2{UvlfC{WME~-U8aK0lB<33vEcvz2`@ooS^V3;;nRAc#1ho&=mmvH z;ERoXkf7dwA*dT1sNZh{yogy0?t=#fyhvIIW_7lLO7z#xS&T?p%b;38huq!b1sgLX zpt~0oGv99pz7U5SB8zMYs6@muCI$)`$8NAyGlM`~ogYx+0$;qE4R%LRzzc>&AeKN- zz>8xGKr9YWBfHaO>Vy|;Ag{h&jz9Kl-Lk~8#4;Ed6kyl9PY8NpBMNqXz>C9>PC~$o zQxaeie(+6aQ+z?e+wIE(Y9%em2Ne#BAopN3Fgr86uv?9krw^_Mh|-1kEJ@j1f20eCo*pLfZk{dp5)=+ z-|xW#65j71pnU=~92O$L(#z5X$~sTL!{A*3FM1)mU(50D_k95Bk%3lnbcgaVvvh$+ zv$HQUbh?P%0G$`w?aILlxsQ`$8Q4m&An3|j$eo&tz$YT|fJH&0iaWSKx3=6t5_RQZ z1zidd@S+?d2=Xy(hJn9jIx7PM*ts5jpmfQ<{#4)&(5geoit;@V5l06xUkrjd73Rop zUk>IFMwXx#dlrM;1`ahRKCra*2^{9ZZFBv>zy3roPZwwg<^e=h05pRmG657`FEXHJ zf=&<#ox1BCvZvr@dAhia=HRc^$L*csUR|_8>}_pMG2(w0ZOa~KqJd7U3Wk}dvOL*ErHww z8j*$wzi`V272mF4r)FLRyR1ia%VCgU=#lPHj_#H=kakcZBn?*TdjP7eMHJ!zU(f*i zf$mZc{{7p)POatWo-!TmRLH8N$627-;K@Hw4GHqmcCe3vUPyC*1G?LnBdxO$r1Qnf zERf$h`1dz~xUC0j<-r5g{M#pjA}8p@OLjCJFS9_Vvhi;R&9zoTWYaobPk@VKa8-!7 zr4cm$(fo^rzc(2)z_8u*2PlNTfZ~3;i&t8}3m-@=5AMrnUt~z@bP;{?LOcu97)4c^ z5%59*N$tUhAho=2UcAmk8!dQ~)`>0EfNcPubs56@1~gib0_uH3|WsAOU6C?L7e?TS1xl3#hp3nE)!T0$=0D50h~!*Q zi5d993*EUO;TI_xpyXE$KBO%a+0kHcxq|OH#^!q@X{@&00iVEt6gXhpzNLd~YXJ?a z{Q&J&0S^L!cf82#fldyB*1ep76~mo9tSz8=5~L2|b&xu60S6ksxd>(*e8A8-1)&ZS z(NjR$K!XvWl^ut`gVe!nV}{s!@DW324_F=EjA9PTDEnQ% zfD+}(Q^Wt6_W@hMJau_;30b)Q3 z(y1UO=y*a4p}P&89sxg z3sCxjx(r+ffKnEuB><5DI~`mM+|ma-E8xXOE(ilD$%B0W<#)r%gO}g~gOHLuxIAD^ z1ts~rps_SX5V7Geq!fp(E8%YeE#C*1{DI($&-u4|@C3e)VFFtUD$HOZ4ojxpp&ZOE zTr8lQtRH~tSWqFoKZr;B6oetbdv>|rnqLXg1^1g(|aaw=`RzudfbTg%Od+?-n_Fm8e-GBHG+OwZ}Lkm)Pwt^VY zQV7HZ9gMF9DuqP&!R<_Nk#z^A7{q`o1~EZr@q-l$)P`jVfUhqAnQ`zDS8t1`OeCm8 z?**wl_>hhHV8Dxrnc%dKqLQ<>MO4HPNhK>t<-HkTm9KkVOLDpv<;sITgc@ttNL}f3?q1hLOdRs)#=zvs$9h!ZS4Rofqt95MXcox}oOnEy2dt<2`%f1>dr zBLhQ2C97xi$$yRzC25^rVlP<#{{IhdGkK(eh9^Oh1X|=E642YbX8-^Hf!(13LEWvO zs1A7X(u9Gb`G^Fl=-VHd);SfFWSYSVhp9vy!eB1pgD_Z1SYMt5tw3YW`rq5SK?`*C zZs&Axpo0A0+j~F@K!F?hLh&Eim!Ojpwf_Il z5&*ZK`S-ViWZ~TtkZ*!sESm>%0(idkMb;mfwli9wW^pfw0#(K$pmA@AW>9I>JB3$e zCFn8%tR}MT0GTL|#m&FH6=Xobi$lM$n!A7M3N3J0clS&HZR_OU4^A7PGjz26|G)S^ z`$D(RM3L@^CFTqakSKtr?#zo|SG0(NToLd>_#ZF$va+?V zP;3N;6V$Nn9$tYjD$#88dhz`yXkcpjYa!zU-3XsP1c`!tvE3;RH2x0CB#?B{+X~9N z0lmGT%pTY~6;zM}^|pdao`7y&fk237f?k{l2doOza)?hvz%9+R&Z*$ivKC~=YoQ&W zskyYyR+J=V7oZj*KbpgTfO_sfvQG&0PT>W40LoSAox%(92$*~D0cURyE678jj>!*1ks1IA znZOrW(xBo%<7EK}L9aZLUImp1k z0J0HWu;5DPWfvcSiYUVCq?geBmzCR7A+-!VwG+gAWQfVXQB*mkgM zLFM|EH=q(S1R@HqTtIpu9a_`^1SF2F0O{?8nDO8zxX5_v_#d>#9#mZi^|tza`Tsuv zT6^?P1tk@DK!Zj*nvaO^Z|?=E4eXr?QXACm$`kM+)Y}xa4Gxk9AjvPS+bJNe(=q79 z&Ts$!ck_Z;3C%AVJHZS{Gc!ffnc+qBRB$sBGHr8jDyWqSYJXV2d9iRRq?I`Vv~Vg% z(wPC|7|@i?Tq$P;P+|e)im6i03?OHK8lqiN&I}-zf#zYFq?{Q*z66z#Wm3)zpqOOP zWnjpXa%KP(mEjY#2-=$HToGRk-ku6&fVQ4i!h|3U(2mZ;lEnCw+=}?L3PUr76a){#PJ@Ui zWtPMjI8#c%)F+-(0qiY+m+)uXpsqn^_v%LQ`8w^!Oddu zdKeqfdi*0h`4Ll3$6Zf=)V|pJ<^TVTFDwiUFPb5ybh^H2u6@H$DwM%sz`*dL7UYy8 zEH5)yz=ONp9NmEmouN-&O#K3>6FJhl1NqWALm#{-hKY0sa&(4XK=9ML19{RqL+`u@ zgsTt)Erk#I^8f!1(0F>c@0+yFM$pXC3q6pM&?iCNu4e*X2rdTsk^?+4=a}|F2rLI# znDwG{30N+z)Aa=?%Y)iAp+}l)k1&-uH`g9vF5zgdJ;GAL^g08)eg|Si*^Bd^LE8tq zT{+S^14>>T{0v%b%h4?e?)as3I*Gkl_Zd`?7=s(c;EsS-*^5~qO$Q)Gl)UHxX$s}& zW&-!-(mFlFUQ~iK@ox`(k$p&}+xJcP1c$s?44r`-Sqz}%m{|;<8^?U_1ZJ`Ig7!-N zmIJw5rqlHVNd82?i>i~*k_r^vCtm&owZ0fYt4%=5c)MNS1iU!$*A~=tfN1eO5%|I# zRm*8628Qm?H_eB5zySwZF8YFH0mvGjERpWeH~ib3`~qGaIu5f(I!mumw&tOpTHL^pP(hR>z~(0K#dJ-+YCT1-S6bre1OsVM6F>K6KGKy zNNjtH7s!r)7w1?Zz4iT|CAx1wSA2oQUrhf9N){WtUEid2`#wnP^ayy-@)0z=0CLWQ zv`(j>7bPIR@0;d>Jb^EEfWw|8BLOt@1}f~bKmE&M&*A_jhZoV1R&T%yrcdC8Q(AYA zo5aki4E)wU$}DFaAN4 zf^(=N%ZvUG|Nm!+WPuV}K%1sIK{!NUcH^52zY+{R6(Z`%P~P z*AoT?hJY815UsCIgUYecH=Pqf{nKvO6OhX1io7$!i+g?G$|tV*h>i7|7Y6;13J28K zx+Cw*@C7=K@j~92AuTCBIW3(5G~eF*Mh8^hUD?SE3OrD$`g!$n*BjvS?(BPLxdkrA zKD>bQq2<_{7poB}I6&nZf-eXv#O6SyJ3x-@^!))^q6%Isojebe;ozlJ3P@e(ouF>l z4*@T(&j-taw>p6*q0%}-uQbt$P|8@_* zz!!~&kqeN}AB~4VnIi~NfVgyl(*d{ufoTXp(!k%1&;Tw#grOQh1qe)oJdy@(Bn{vK zl z81%vz#D~Pei}E?3ux9}mAdq42kC5CS`XK0q)Gx3@16~|_3(fs4(A<9_@WtDAU`bHD z_~PLkXaNH5vB1lq2LUgxLz=Y#FX~`MAeBL@;6^-oF%P^7%Jm6kufY>g@99O*iy3dg zmVlN7y|@Eop9p*bJs%ikIjA}e%Hn;o7a|Sb#^}iM!tV{N0QmtcK&sop(c0~LBR;PA zh>rD}7oOdaY!1q~ko>Fwp1bdKeSmdI??Q0X6*17ozduk6RL6Jw1h}MuR^;D!4ao&g z0%_eGX`Q}rUK~Rb@nA~p^nLMSGfapFqUgzsg-9Y`MGs!|frTXa_cL|-f_BuTbq9r{ zb&5E4yGnp`H6LW`4wXpj=BUG>HFtJ=xb=N8{7Ji=ATTpuAp8==nqg4 z{U_iB8zeD;i|Adi!O`3uD#5>>t2UaIi` z`Ox(TbZFcw=!GIAZGe-})mIQt`huP13-V+jhI<4+mb_j9>eBCb^5Ng_`(ftypRJcl zG(jeZet>L&^6&|K(GK0W0$QH)`XxBAg38|4>Y%2W>j$V4e1cxY!4w_{cyS1!u-jK6 zup7KG)%69ar~3w!@IQd!<_kz~^T7yEOB~YP5(sz!Iwq_6hzgRf2OwSG?1HST0HKQ~ z;05R&Opq>chYQ~GYCfW1{pN*R2P_MOcE1Tc?g~Es1X3uy;Ccy4O1L+*@>n0N1#gQ8 z{S%bM_`(|EEl?=)Z};U1e4zys0B;iG2zW8`6*z>ziOu&VI37R?)4P2I(mGiJU(9*| zN?OyJkFZ$3d9k(~<}h&XJOj#~J9I=C7+yGcK-Sw_dHw(YPHt8#1JeAUjT-#heMJIa zq`}7UTz`Nrq7~rZ?5|)FcQS6tNI9 zwmXRgyzqgGegL;7kATu5#(D`E&|+cG{f3~H;?z5@|Nnon`8g<94}j+FU-N0Cred9io0ET__zB62n2SA z^6+nW;tF`-zXw`l^0#aN?`-u2EoD*QUw;a;;)3}EsEg6f;+59vdfOY;A^;k|NsAj52R?j>jzNs`T|On2ZCNiJ%@(Lfq)nPo3{k4 z-~azF_kt$`c=-1_d4P@zaR;q30j0hZpkM+OO0FlsBU>l<_xqk`{>jMSs{&fLIQbc< z&;@C;X*~c6AYag`ZvO2qUZB}A9{%ltTtP4NcEbY*6soWkq7e9^1@011=?#u1P|5<2 z_$P(1;D$vaVN)Dj;=r6xPgZ3)Spg}hU&|EXPl!n|E`{eci z{~&d5g0cianmj;53Ig3u9H0dCBd~WWD1`*Qc+LdY4DJQ+Z})u?_=5E*xLio(E!ya0Z%{;TJS!2*C&YF z#*^0VdjhiJ9GpKu`R#}Gg<9`!uzCFZUC%II==N3V6$u3Slz+R27-;121ZZJ5#Ix7I zBf>mLp?N0Y#iz&MxJv7EJ@a}l|90Oqf!(1R{M(rVUfh7lbo+u_^%9g?K{ET9pxu6z zv`!wUZdVO>jjjQz(I-C!r4iQ~{QG^MSRbsdCPGWXWBi`HVSS<25R_{mW_5?Eq;>cB zg5n750`%Y$1R3{w`|C1@a^sUA4cMIe;t_s(pJ25Yl&-MaI}>Ew>+O(kS%t1M!wdID zNVg0!D0s3FG$;tF1gzh@=xKyh5TLQP23=={C(wObJbI9MXHZ}Er>-*tD4~JI>E7!) zGk_uy#D1;o%m8u)XsqxKNbl?a|3T~%y5Ke2@rV&L@DXd^wc7|WhT_yh5ROkt%_&J_ z07)e0mBfP&iG!#|5rQrn1@D(JVPOExrJniy|Nl;2(55L+<%Yaew72yMI9I)!A_y94 z1Jx|OH-1BALZ^Zlpyn0mzQf<3MA8ZpflMgZrhrd~>2?(XPb`3nq2Hj2gM%M*@pA7} zkg-88!l!|Z6#*B2y}cl@z!$=^Kw>PQg$Xapw?gw-iNFrf04O+vF}`$TW?*<(4IUf@ z=?Qw_4>pGdRDAyibpt^c7(!hMb}l57ftgU3fJWVa|NnpR2Qz4O_doFR5wQHhhs@of z3cV~|ovjzZo&t+@P2v6Y`~Uxrsn{>)<0~ty~bTtSDNq zK7`tOBJf2glGcllkSx7$AM9Qh6rHn?bowLd%s$23Jr(L+t`}1wTA5M2ngG*!A?Sq& zL@U^<2OlyaX^nztWkS)ailp`CedJJLMRKq_L@OhTgI_&Bcy%5`D>#(0Pq87{`s5zS zuPAmFq9|rZQoQ{hXzk4PzyJSdv4bw92d8x>h;sh@Ct6SPw}6J0L6TGN{Qmzx=!Ggo zvZM7pIB|ee{J{sz-M$LFB95KlaO2+(7VYX`1t*zaPzrhB3$p20>-FFN|1-Si@0to? zG#p~=05kZvfhG92^@2>bK3E%?1@<~f5h#IVvA@W@2lqTmpj^EV7k|-t4;-HS+rWmx zgER2Og}b1ZY!|55>~015BdwF^#cq%wq-+Z@a%OmuT>~!LAVu4|8c@*&Djuxgyx3R+ zDcZpM@M4Ud89>aD)S#) zvVfLtbO$n}b%wrpaqkW&6@bf?7n3%^3K3DzfLkCBsB-Rfee+`H9Z;}2YR$#DmCTb?<2JAGQ0ywJY`Do#Vc9DKwI*`*5J zNdmi=wg$BE^%wCH02$=|sRI{#k;CV3Ym3EG|a$9dbpyD22X=?=7f3|%1HPR)^b2T39{+ZT;_j&+ zp9j6z2JYvIbhd)Huje-J1-XEsR1p$v>?#ZlJ0AQ8-5K5ra^Z{ZxBmZsvFO(S{}Y<` zf^>jYf*2r`J0U8;7QE;MsjL90>;-R$4C)435zyTWvLWz=E_jC^54bjP1b5_EI$JM* zR>5uu@2ms`3dCF6Awl<|`xZ1O9|(A%4`HWug4ObG2X6=j-LwkYS@yyZvR$;ZRp38p z8zzVZADsc39|I5LLu4`-7z`M?dqL8HFMQWSqm93%2sDDoz#zcTJryJu^x`0-`hmDF zi>n*#PWX9r5MdOAOI3u$;DYQd=m`^i^tKvnq^Pgv_x;fw(z_(+g_{Q`0z}{zrQHBkFae;GZosJ>JQg2#10`!Z zfz%Mpj5as0WJd9|&{!ouGfn}Y4?&mAs0p(Ql%rnH?FHw#fGp6p4cmJ``43(~K<@K{ zI;yu7lu=;nK#|BLWzkVpovxZ!Vo3dyMs4Bb;fYJy(0 zuZG4qf6GaT+ylmLu>OD-)(E+^5IF^g?p~0-z!&!+tp`XB%Ho3MFu40c-pOEKaA1HL zwhp2Jl*1u;36jIrA>Imj(Fe)c0WVr13Lz$EfO9ycNO1(w74x1**G==pHaqWKMEf+PT%OkV7{19k>#3IP|^ojnsk z>EwmhmH+==xLyH`CV@88d9)rVaRj$P0)4>4oS@TR*r1*PrB$gF(8N(91xs--^HzWs zI^4Pp>K%gu7hKt5RQlk+jb#GeA_Uq#4lb&eU52(PKzpZObbw6&wIVjajwJvwpnX6P zlYf6Jg!28;4Q`k5@AvUiu|8N^5313-TR}~=UY`jr{QIYZ)TMQ^1g3Sig4%~Kv@e71 z4guK%+Q1GHg4OoDAP%&`2djnE`BOm>&}tv7u^YVaKIp}M@a=dao#5T~FGK%>(gJvc zPj{dM|8^FqfNtSmz!%=& zjp>jYJ|5hwffp>0f{1@RWXCze=luJ90$4zc2|?9J(2JRuz{Z1%CR+#_UeG|wCRj$b zR{&Kj9MGh+5aMW1^Rcs~7t}s}@$VwYi=kh3a4|42fReQes7$#576rGaWU>z#bcb^E zwlIO_putY+0c!uHbF)pcCMZyMB1V%)s!X>iqxzJ0VvB`M!A(1J({IZLk;RBA}vtFX$3;&;fGW zePsf(_+PZ2hbFQMpsvJ^ZeI!h?IMmrFaF;JiL(T}C<8Z)SwLG;K<7zbI_;PfM zGzPsm2ENx$1hhKJ^+mvoa&Ya$(&_pl3$*1QbiN>XUg|*r=y<6Y65xg<@kRbQ zP<8~ZrBQ&M9_#hO8>|WG1UN@$h8N#*KuI#L`G^W={x=tr3c>yCBaY4tpbiHpja+bq zj03_CZ#x5?e`Cuq0uf3B&zZV@croQHsK0m?+}noshSfl4qJT3jN^iJp5iA5*U(Nw7n+xUW2F*N! zr;uN~@IDI)&d?WWouO}D*qw#;&qV@Wd|C+8Ck*bN3&8s4l4n6F5H#fiuCPMCKq?wY zR~a-53YyGf1@Dprb(Ps5=fQ)!%H1MOol|;2{(kZJ3@9#KzZ`tP%Ipd{Sm{ezw}?kt z=Tz`f3tP{C4nF}gK~w$veZO==v<1D8z6wfn904yrLAo`at~(%c=?YHJplRNN@M&I1 zm!7|OIjHvmIstP(l8Zn`Oa;Dp4V~mbl7Soq<^*;iNIkT(4?c?xvV0EgNKjrtIR6K@ zCVatj2JAdgfT zLqAxbsx<=*G8}xs20icVI7Y&UTK{@uArXV3#F5wBq|3U-UpXSy{-oWviQMeLk4v4EeA9j^(LqnGU(C^wk_}l z$4}4zr~+i7Zoexi&Ai}Wf3Q1LrkBMjpx5_6;ESm#;1UngD)4c4W_VGY4l077$Mbwk z2ek@7#j5q27dz9TAq&x;~`F-T>%y8iU|No%#J8ro#sozq`|yYgampe z4^jhKJYAAo5TBb^0Il@F^*x^R|Bk!<;K-ZB03JTUUZH~z_&f_rJiZ*@wajn8ioq!j zV`NSSG}ba3Jl*X3r91Qo|9%!P$lfJpUr@UH)5|ik6SPM8#c|L=8ip4>$3cZTs6Frj zv@*f<17srG^#iCNhn!Aa>)Gx4rkkVF_X&7WFH2|W8|Yz_AD}iss#@6b*xjKoK#RgB zeFqgEJl(!8IvHO)JqF5t^Iv*`=9=XaHLqBx0a0R@` z17DK@xi$RLENFdM>XpR^GAZ;0?Ch0)-Jx&5>iYoUtb-VrmO<(*ug0Xp{`G|z|n-|O}=ur)haM1oym0U)K7n4&U>vir- z`uBgQXEc`eI>%iPfU*ioBFJD603CMbs}T5N5oGCbz>Af~K?x6ZmhGKgpzXkEouM~g zq=4K7TP;>1+#Sl1*6jpZ>9XU6=Mhla3S+AnIC04fFrULStF1Z)geJGl6JH-e4}2W47f?TML&V$ZdBs6Aj?uo}W#>jm0j z394=(8&Tg(0T~hc2D%G1I1Xe44@8ac2gnvw1F#z3H_-j3_hZ3oUN3xUhQDP4noy_$ z4HAJC7eQ7a?Rl~B5U4Kq-2)mD0-c`2)6v;86;!5!1TqhScJTN1u;v^_K0pE_)!8#u zrX8f!^+)Cju&OD%DecI|{eX7Abxvu$()R!V%RG?FK#kc4pePG{0By{I>OWAmxx@Nk zZ91qw%!D{H;Z8s=xUB+OJ_jo4PTU6XhX5xaaN8pE2h@}wAe;F2`+|mA- z8{&&zkw%bg=M->1;PuJZjr{w4?*zX1l?)0r(4;vFC^WZE1yMm+A}=-`1f^@xh1m>K z{{2tucHIFwt{LQN-v`hMng{&*LqRUT0jdV3@iQ>+Z|?O8iVMuA+QvyKCnn7)+GcT$RfaCrHtN{eh%Pme_pjKt43-6g1ks#~9ve_3I(z;zl z&w%Oya5$n&bb)PvHiyoDtUksL+SkI-?Zna9Dlz3B_@p^saOMep1C8)E{QF%&xm^R) z2U-Q%U(Arj@FM*LIOaNA|4jb(AJpuA@pL~}B(1ac3rxrfrsxe!H7wn z{NC{I4+X`j1}HnR!S20!0g8jr7tk1g!N1@21^<3uaE#xD^m^ZPw@d}Ov9q-WWaW>& zAm@UdGQ}6<&a}>{B_Qz&U~$(s-94=!*LLaqJ z?FDtWd7zOG5&}gS$l9P6R(ruo71X2c?gg0=*gX~G(4ZF^APaQ^__w!$>;$D7kiP<7 zu*0-~PBH{JGoZT{6cT|iYN1+QYyltL4w?Z56>|GSKV%;gf}ArAsXX}i`@ZNE@c>Q# zfSuLd3req`xkGF!!5vmmXFvOd3go17NHxX3KlBAS)w@Eh12t;1FRFl#N%wt|eUgXy zBFG|8A31mrXj3c5E|8rt|A2xZ@P+vvXb>Rz2NVQ>FV=$RkU0Wglt3CC0sPy+Aqp}B z6czz5e(#3r1)c5-3cjFjaH zJH+q${~s+)zwrlcOy&p*=xzlW08hAAVB#;hz$}3v&^ck)T5%vdyL~RO1a^yD2zqhH z4`d!_eCxx(hupnAypR@O>6?Sk*qP7q?=OAP$?~x?I!%f z54H;A7+A&w1zyk#cbNE#wGiV$j&c2P@Bw#k4=bdp7y9PlBX&>>y1wWRImi;!&2li{ zg+D|!D7GPvfvCmen9!Y|A`5FP71e(+z99dB8YOoo|N9SGtTh=_gY5SOdv^-dyRL5z zK453Q07}H&E~i)mx_M3ozEE@nY2^tDc(L3E#Nq%|_6HwvF^7VJ>kVkU36?wgw@(Eb zAH=`C71W#w$g+F!c?UdSy?72~?*}=UlQ|SL!tmzcLsm%c1`Ykb+yP3w-XKEs$N&E? zXMF$vA6$%ofEME)K&1!&e%~vgiaVT*KpR7B2Pk-4aknwPZvX#(0y%Ar>!4FBK_j$8 zwlNmM+8E3Sz~Rx^dIQ>4n0jIIzyB|Cw*QB;I37b96P>LmK=Pmywhw^heLxNcw_L$Z zi_j;~@OZ+%A9N!HsO8Gv3vOCW1=Ypiqse`rV9VJ-FBUw3IssHv_qKxU2h|CnrUhte zz?6UgK@kWR?(PLSGw{V)@WmV=5Lb6&wE~iDeZPRqD_c}6KwiLN1z5Pd7v$5x7hW(c zKwO9w&4*Yz!FEBL7Orm~?&<7l1y$QG+_!4&MCd1 zYWsyGSQNAuw-;nFs5JtrTVH(K3Mw_7K}`!BT{Zswp&Fp3+hXuKS8ziBWPc~PvV3uH zE6f!wp&;wiI$J?i%8Qv`ao;!H5c@m9wegF|U{R1OdR#%)r*-y%Dz6vWAXk9fj@V05 zumfbl=beKpKhQMZ3(#CB$P7?)feZ?gmPdvxGD&GkqOoOVgY#F2D~10{g8b^h}l;L)CdF3 zIfHApUY0fC zr~xm*#9wfLS;W?Wx74_ z|I+URXuJ$`nk#7aX6pg|9${t%2G{@-xceK5QYnE4GADxe2ZJ_yO$BXtB9IPqz)1sC z19LI^3V^pKHi0YyO$>lC(HqzuFYy~e0S;<7a596pUh?ms2v+!r72HMy515L0yikX$ zlET_6pxt6})S3K6w1sNQE~23^?3zaM;}2B@atae8rW1IS{KI@ll> z#FrqmK&6&8zXB@VjfsddE_jrIoD1?F0q1U6j~;>qoZAf6 z0181+93lrd8zin_ap(nB2nq;LOA6T;;P#a38)zH~!PP-pY@oPiLyl|MB||^gft(78 z3Qow9;5VS@rc+>(q45UVp7rA3I#7V#0_B;Fpgn%zlL&%%z z9c_^LmLPY$76*-Rffl8M)}OZ)fFu+^5}?L2$mH!VUNWG~xBS}!#e!a_!p!4uDFKZW zfZA6jlmCJ5o#_QJAR`K3Cjb7aAQ8wqYWM^wO3~E{QUGl-gY_U<&95Cn1sJI8`!fmD z;GPPiKvU7s=07OyKy3i!q*MI+!G<9^0jsP)27pRH1Bg-l`@vRpw)EG> zd=>EG0{A>^kxnr8r6qV23mnv-@nk0n{_Q*-f!$LScrkA^NFxWRnfJm8!cOZ1JBEMzRFEmKA;K3fkhKQTrEkk1u1BP#8c=>=SPjbf zpsBK{8@eVifbJ3krR(k~y&!35h(ngYfsbH;Y6my;k8B3JB;bX111zUXg0|Izi-3R^ zOILxV(>lTYmp!05_RsJC|3NoQ_kv1^z!#V5U>b#Xf#y0vM-X%dc)W;O_5c3_aQO$? zL&D$E3fdbEQUKb(@|qizznc#-rFHsZ8GJSe!*y~#eo2I{c7z5p%G05wan42cmM=mNVQtD*ecd7Qw*XU(q| zvk$32_G`S!zKA>;BoDrG1Jrx|0CpMHfikU?kXQwqBZO__3EW2Ck8>Cc*$=%_cp(E* zXpM7__iQN=4p|8!zz>o$$gvb{h$ryvd zDxgsW25=;UDpFV@2VO;k`bqFHBGAY~^9x4E=nbU!hBj@$T^0D~%|she!3}OmH@{?r z4B$YNV;R7ivK$gikZDGg<_vDjA56v$aVI@4$I4M$UMbC)vJcA>{Kw}Pzp=c=-YyWd2_$CbzSW?H{1>Lh06qHK; z|NnpalZceL1T@PbLO(SB65;O!jZlCm2*GIqb%v(-mjHk7cThqAnE*}* zsKqW=!9{2)AehfOEkHg3wXhz5TUfmy3S4v&3bPk}h9Iq=w$&AL5Q_s;9v^%N>V|byaOo>ZA-gi2}u6^uHfovA1vd6!xE!(15b5oCvg2T7pb7)mOhxBZ6_CPpV1;1wdZ+M0raVA3 z2ejgZHtl3UN{bhPhSNc=2{u-NP=7+_~OSRBuR)>R|UbVBOxuYUPuG1dn#yLH0Z@i z$o2(@9H|O{8LQvRXv=h?0!3Kj4NqEt+5L8b1gGyU9P-?*4NC7vH z1(-lJnClzR*;t@)aMb()>zaTzIzdt}s8;vJm3Z% zB)37dVl6+U^*~xdS!SULh{XYk0{-p2ATvO%R#5f`%CdXGxDXo52LfJvT>xgMb+&@y z2jWJwT;}?so2Rj}7Ze{a$`*hE5mXg}`m~_gC(vS7@O(sCw}@9-=TuNkzOY{a+PDeQ z5zr0R82IAMS+GUWGy_R2&=l}u156H_X25X)KG|?8$W1{n9zxs*nK%V0fk=XE3VLw_ zSrTMp;ERR)$Y}<(xjpqJ)ES^8gv-0&^aa}1(LNvKT~J>iG_C__b+9sn%XdVY33w4O zACzYPgWAqlK*T{%1NwiKe1?NO1H&!`CI$x3r7W%@J3*T)vM(|-AA-(kF!OI`5eV4H zz{0=)x@IL*UmpjieGdw!8K1E?nj+V?V}$e97ueFwRDVv#cg zs6Pjaw(cTl22i&Tq`sjDWlxJA@)i})=9RPxhRobV(7u(T)WjUny^|c<^ z7=ki-%4RXVXfXq=g5!A|c+B-b!)uN%*Z(Yx9j^cRxB31DjlMyQfgGHx2NC4q-{0cZ zAjH4`;c}#Pv$%qc0-c%*GWZ4P8lDNSw}LLt%sBj2g8_7lnn2)-tYzS$HQ>cV@DdJ= zfEPO;^?ASx`{iJ%4%dG#p8Wm)f5I`>|BSCWyF&kijtB|;&%e#}Kd5oFZ6YYpnh!Br zAF2&W#Ijw6kKTN5apL6*MAfm@;jZeAaJ z!~|Q%1{%;TkLw1v z#KBuDd|!a)7Vo?`{OAAw7yCfOP7v|r4`eXLl_TKAid?A2`CA;A7#K1bzA%DM4}WnV z=2-p~blg6u){Z}*-Tr=J<(49~xUU>ca|G(GwL?HCK4%a`R zL&!jz&K#ebgU*=mbiL9GIX3Y`U^nE@;TPa5<6jtnui6vobp7&r=5f~#V7qxhcEc~- z0gdUStgZ&x-h7A&#Q`UO<8Z)%CkO}J0i9?Dcfg&1Zr=}qFV=&%Fo|@!et10%v^=u) zQmq32c2}tEMM#^o)Aa*1h!cMQ|34v%5qyO25=j4`)Aa*rR1CCkbkcNiVomFGy~Dpf zlp`pM>BW9XOA~ZTTCeK~kPGevf;K|bzet5>4*(q({NluXuukx0_Aj`>+uwQk_n+tl z9p@2x2XwaDi+~r+5aU6KjDI`mPCF%t0H_7Yzuol$BuHhCfQ{;O1sxUg0_q=Va5KXE z^9Agm7cVA&F6Q9h?)oAC;;0J{1rU>%bD)W)gnt)gbT0JAi#Vu`ACLw?Mx`^u3olb} zg8*_Q^ITI%0-gXm$h`n04L$E`Wu-I29VmNtr8C0`D0@n!GXv<(*7#J|oy)n2#fb=B zW^ryj+Wx*BHF^vTFCLq!gU;w`x%mJ8&iUL}maD%2-S+`1dR;XFUR=$B`leJoi-mu? zuSVdDLogx!mS-HG_ErPvz>}$49{&ITqU zpx)LC5C8uUc(HRQs4U>%-`)!n4$NZcoeH`|E9gan0Z4)el3Bs6{2$Q4$RD8Px1cLy z9{&Fi8jA-Vb_kl*@dfWH!PwCUKAv(e0|P@A8$=^$)3!)AS^~OzK~&(2ghOC&f)-YR5AgsQ0-DwR z(LJRX_zksP$SkIJh%=y`vanFdoL&?17BqS0Btq__2xnR zm)~KXBk)3P^i5#kfVDnV>j7Gs4LUIgWEQ9o0@54wqJ9e4fuI&W|9)SDv&11G01|^a z>&SOd%XTiPuG-$TM4W*E)X@i-68OS01DX~}g7~+C;~TPjssp4f@P!o2k_(`jXHb-a zrkNTK_J}hu1ir}e2FEF=F70jwnU~fHHvWY(*g{`WeYAZd$Rv<%kb;00CniIk4JstT zUWBI|S*UTKI}E|P(mKH|dhz8Os0=;;+IoT~<TRIIw3k=^nq-BJpq(rTQ`6*LM})EHaQNCGOTOs z9Y6;cJcR6->zM#@1ZceG2dHHO<-T~F4hwa`G|;)%om0UU@PI6My#h2j(A^=X4%(&P zyXN8l|HoRFKm7ln;aKZ35cT5e*Z==tJOB~5ze48kw>3$qGcdFsC@}#ybU+-2v~IAW zX`NFcMu7A(zE}y;wgg1X{|ZX04b0%XEBLpA?E|GQkV}GIJWPYSkiR7sG|vE>hA&75L)ST)39~;Na?RnF`9?0WU5KhTA4EFA+?QFPO_IH!_yGm)RFIOO7oQ+Yr~ue!z<&$fD+e7bhVVd1q_RLr`)7r8JPU zLqTg)#MB|TEKg|!WvZYTx=>Gm4io|9H(!o!nA9cknLIo*AoV~7sME{8y%%Ddz>6<^ zV248n&_Km~zzat3=>Z%8FJ3^FNO!hofQ;+~IU}%pDu@&GLMH{9DN200TS3V`pc@=o zfiE5Ig0JUB!34yBw_mK{Pa%Z=zPQVL8@Qnom z{GdY``1gYi2OXf!GXb=Pr}2=JJm}Dl{jDIUfKG=8HHrU$?<^2_UBSN%T(Gqs0M$Xh zGJ)NpI-p936{INu+m(YAW?#}kMgU(P<2d}x}Io1RclXxKk;(~6W zx^Kn=IzAQD&7BHT*a7YXzxV;V$D-SnqpJhdt?KA)1KAGhFoU=(FK)j7|Nq66_n?ND zs|2Kl1`eei2@DJjpdCqIhxWE`vG6c31ndNj&SYO?=xzl$zqd!Ag_nULa2Ep`cyz5B z?6ux0j4hzsOLl-oPcU>tOmN|1*$FoDB13PB00T3~G_VS|X`ox+F^ytmUiY3EU`9I0wEE zg4py@8+7_!C`VT-DB3!}J>wT@pnFH)gBep>K@kc{BcL&ij$Tk3{sr^9|Nme716_I% z3L3`f>HziWJGwwAraP49SQAJo!;8Cb|Nnn+1EdNZodKXruwLx=#t6C|vpbZhs}*E) z2RNO9Qx(YQj)@?>FBXBc&IMn*VFT&|fVu_y;-ER8M3aBJuLP(Ms{-n8fmRlYfX;32 zMvA+G2B5eD4WodwD(I#%$RWPlL&2KBy#<-T-l-oR{{Ih7059%YgS04sau=w};SaaY zyF1hXd}{>g&N%3j-?jV*<(7tH{@XZaNYwn@j!q|z7mwfk z|Nr9N8_>lj+kF*4E(e{!DFSM*t8|Bo^s;mX^!9>W68NHm8I;XLAbmECc4vkc)6~Iz zHpro-k{X~fTu`UV`pt_w>W~f`XydLyyE6mG1kfG8-`brSK&=D`1_p*l?T~wdL1VAy z+npIe)g@?r^FX^Z1E^L8vA484Gk|JF5PNaEGXtm|0(BVJ%C7|KZyi{b#R4_NGC_gbJDKRev zd{9t&Wqc|Fh7f3o6Lc3_erXBxJ|H~j0f3sU9G$)|z?GCA~5^DCx7LT{q+%ARXnPazLIl#@>2!VbdUqBJq}Ky- zZP1IXXsGW>Y_k|an=O$rBgp*i9%&%Yb~ANz1itY32lAUvr|XmE+9%)}?w-8lVrF1? z9hJoj>AZnV4R|2}H`Ni{RIufNppfI>M=|@uUre*tf$v5G9UNEEdY~=@bi@ zAT1>D8A{DBm<~Pw`)Yq+Nq5TxkiP@6m_QwB-!CA?2fdi=B*@TwL3ix6&(RD!mwx-0l5sk=CY*qQk@UHPzdGdcHydkmjNyU0^J@8 z{M!SWg77N|e8JEP8vo*W9RR;!9MoK71Z~xYYYpKN>2^{8Z!adOD&WPs7O;ukz8rxs zF3tV>zxfEui>eo(^BZ3L|Bo7BlOtitK)c(Qqj@Ljnq!7i`R-7Tpcn4o%LrId!cLTt zf#J1t7ArV~bbul~@P$0w46W`^j^c#{fvO+4Z&8ZO3bQ?XWjnF+2$-)ZwB8DVIaL-!#AB zIPUrbG(-%WcliDc?Se?wmzQ8m2*5+Qp?{#;ivB>#3yy9<{{3CY)EF4757tV99RfPL zqIXKi3D6Y43paPrwsMx&N5SO;*a+W0(6OsOkg|uFzc(CY2aX|%=3gwe)gZruc9nr_ z{n6bsv4oR>0etAiw`ABAmEGv_$5|R7vB=R4zK;*o4d`y^XaH#iwa<4$wSw+k1i2YW z{y577kk*$4pvAB_I;YJ)6l$G8`9Kg95(gi!_x3RLaDqljLLo;)MMKR8U9EwqCys%J!qyi#%>2FjpuKzoFFF&! zaRW+R-JxGPTe?8e2+j!L4lC*jXP|T*pOx?;1fr=Ev}w;3bP&vs?$9sYkR;F@`lM5& z1604ku2J3g7!rJGpe6AVpkxMWo+Iht=?Hw0xESo@*F9MRFTN%~-4yz#+xJUn%S2Ez z0*yjpJEE)kCrfQ&mcfey5KWz~pkpZ@c@T7v8(43*?}JXBrsmoQ@F-P+y6F<=!chrO z*oUI)VQC6@(Jcvb70>Igm!P8>@rGwRXh|5Je3+V*@InUW#ygF$3l}6y zf<`s(fP?N1+?mynAVH@Mb|xt34nAP-_Wja3g%P636>_ee@*m@=B8z=g;kaPpe~>Kp{Vh=*u>eL9N`Y&m2MrxRig=w6&JX`PLrvEmo3 zpwT3Vq7`5lrl2YUje)&*@BnmQPPglqw9W~TfuS$Q8bJdr3@?s8`2YXKfd~KpXG{P! zBS57GsAhS=3t6Wf@Is^kRJ(x=<#~h4C!iH_p#3tS!)^FM_X$C6QvC%POa_(u;3J1v z0<#!1{@cTS%MZG_jt`;;t^5Vw*|NmcH1`+4(g9dbsLFN4=NVtfA z%B=18Av;t;zjT6Y({9%nkfS93Ng+y3Q0WO?Z_xZkBfPiv#!k=~vEYLA^J-kVoqxY8 z4`{vyRJ%fQENJKj-okJZ5aT7ko{^8%=0g?lC>m-6+v{ysI0d&ojH%xH}KWtq7 z!;540Kr@pJy`gu4pmVLDi<~%uUf6<92@-*}bY29!hzWq&g{-|Dq#az5f(OB1)YpL}_da1V6$0QkO4$AT9@_x}HXQF{;MxzG=-mr6m$U;Y3sEs_B*h%>(T z|Njoq#34+*63CL*^`I;FK=&Ry!~9Vy3~E-pehGMC023+!k5+&ONxEHS(mF*vUOWL^ z%kkPVi-~``@0Y+AtjJ13e}JdhyM1Lq>oQ;L1S=H-`3HKRG(>zMNE{>z?q`F}H~0V= z4D134zZ3$U^4WbhpjXspnlrhvp~J5Zb-xLMLOK|g<0@g3RLY)VFX?9%fH>pEdZXV zTsgXZ1S+}%S%R_{vshk8SAjY;A_4FgJfwfn?ZFcGg1-rzP9X7jiUHKF>)`^ocpV*H zYyw^2@j4LPO7DjDEbsY2Q$wjl7Bk2J(Dv#vn0N`(Yk6dwTENB~cK|JOVt5e`GSd3Z zi{;|5>&3zM|DDihV0hsy0Xa|1;==#`J3nEYpao^J);Ayi|KAD9>}j37KW_j3zl#Af z4ZGn3;=m}7KU%mzEdbCJT%ElaK;ws@;B^q$;op7;GQQgkl|uLf zGp(db8Bo%blKKC|IEdf>u9=mGn1`U7wgf269(NGCWt}JPttqU&v z|DOR-4K}4a6g2JyuE9>jR0qLT&$;mb|1NNA?+`<`FGuebMo?=H>e=HgO`wxV`M39i zlm))1J_oi0R59^y2U`^I!W_KVm<1HzFRUv-@*H6EKo?7a%oBu|2X;y)OBet4sUWk0 zUi^odbs*qHa|=ix3%J#J@nLr;M{f@oL>oAWI$0+2Z*K)@3wZGZyiOHt9sl;JAioB^ zcmfkU5b$D0Imjpuuu<6;LHV$E3YrsMe7W)e|BLq^;uVN^3c4KQW!XRQ(SR0dol|`- zfX*WZiGs7$mkW>-(Fg4utKomm!#WN9-RDU;qFAg%F6~1ra|$ zcV2u35$~>n+Bdtv_v1_j6>^}dAW$r1pGaT^UEXRt9h`Ofw?kw>t#)vLfDWAx<>_tV zYG4GlY_IWxltBhCvO$NgwTObEG_AAs3AE_w1u>ur1;pgvKNUoQ(*yVnwjNfH4p4G& z5@ul71u3$pf{N@H9w1kO!UmkvL4^Z2=Ri$^6b|4_!N1?t1k`-`2iYZKk=EG@PPgpW zK-)k;OpyOT8o&|S2rBYHlgDd5{QnP{?E=YUUIdq2Eux^p2}2N6puq$|b8?^y@Arc} z$-n*rcy_L%S7c()i>23W7@ChrfQme@qccx{O`XCEG9c)Mn+PbpI6y5}(A7z|L8auS ztDuetXdw&8(;%H-Kf%jVkb44O@W6C}SC4>H2E3SoqVwfl&=MF>{s4Ig6k1?&p!owN z1}(|>_xFOL-1=axE417OW!vr0<&3C8x70w3Q{oH31qoCNv^h8fR4l9j-No^GdT(n4 zsOI3`4mLKhcPdCS=!F(!DI@>>R#3ef@ZuM^VgZ%P37}lRy%$7*Cfq@u33~Cn0BlEE zXDf(Le5}`k7T|!i1Y!mqD9{662r7d1AMk)Kp1J-1e-KC+YTSTAIOxSI1+cQ${rua( zP5_w;N;-ir1mI2s@j-bI9I~Jw1{;K}wgTrHP=%!iK0E}h4qU{6rVK%=a#|cgi$l{o zTSOm#f@428X+xKGGJvZ6?j8?N=%;n|fK|M(y8QqD3sdlwAeYiQr(S_(uvQQQ>H-iG zbW1HbbwcXPMWEsj)WFO>!I0KHg%@O5TIbX|Fx?;qR5yspzrPnm!Q8>WAL2aFHv3@E ze!l&^AUja<3RDYdcQ5~buxsFn9u%;kn;${#DxRjm7vXcjaSYn-3^oS2xxl|4>?qKw zZcs14Z2?6ik}WR;pvJs-UIsR=v(@DSWOAYv6hQ$m?DN6mpn5pV?#049FfXmM)dn2W z;L32H?m^Fa|1_~HT^SUtGklhz4#Jl?bmNjd$X zeRbOjItlDVen|2~iLrneC*nc&3J~E=u)CqbgI4f0LkxN816m2VeJZFd3EBZFR1ZF2 z=o1*I(XP=a`AZYQYsMuL~1#z3`k( zFT5cpzBB@dJ5ox!_^7u<6y(kTaKjSPMr{GNQNb-3Pyq+pMFfhYY;fNOXbypvlHl-$H4Q*s3VLxHG8qd#QJEh#+cBdAIH)BLcP8F+p0OGl;z(Z3 zKEd2Og%=d$kYonh(gnJw2w(hx92oFI3St_GVGc>>7!ClXA1n^Q6H1^^4|=h+4I1hw zKwg5RB9s8a6ORyYB|}UEr*rg9Imnf;G!5#Mw{w9CG+0v&tQuStWuE}$U62dF zP4ny%49pjUUPMAvLwkszCQ87Ir>Bt{d;I%*K~1N?7xy?p1|!-=;P!7&7UPSj>EOBx z+F%5?m|iqO#L_xjL45x0Q$bWvZ>!5?P-_<63IjPOsJ9j52hjXq<3Uh+Bk)DA3}|Xo z0yH)T?%V~v5X``^Bg^iEG{hE=>tDn}*lC@uB9|b`yugeA@G7Q@4|}KZ%3S*YKM1@~ z3Q{bC_<_5?3wjQLifJ$((VGCP1m`}Gqag|pK4R!?5e4xf=0eI2F#iSL8PNQUMsF`@ zSO?T*1l9AP7CfjS3!cvb_cP!{*bh*{zPA??1cAL%K|uhTA7=%HK){QMa-a}U0BsZE z;NL$HG_u?HNS=YAp_0|B`P2iapcnFK;1B_C;%NlQgBSlbfmom$!$8A7Yfk?E|6)1l z>I_g{i%<#F{DZmH2i8D_Cdq@3*dfIYWO`xh3HZp=0S0E5iGM(C4^TOgeK7$RE-%>r zgOWeb>uLPkdqGhVm?i(>P%7B5{QJQsfZf~@$R*Ce@Pgwcs8IoKiGun+APbsbFhZOE z;EOsqdRv;na}@mhu>|0Y>EJ~apoRuG+_U6ggkrPI3uM{s6QI7<63`eEXdWFj#{o%p zJfPW*-l-cvGW^@YLuyb7ZUzR>9ChO%PzVIQc=-Sn$ui)kKd7$_D$&6`WN3#EB*woV z(#3Vq)F3T? z)X?b>MKT=JnA>n1JctphcJU(AECFF-OW zq`(4YO85v!Q(*U0kcB}nHbT}X!$*RlZCGsM5#S5KU}YYPI>=B6)Ke3|lk<@K_e5X? zD$GZv9NkmIAj-FbgOI1IlVu~gVnZK@f%qGoCb~tMdRe?ceKe5213~_t3QD9wFOrg= z{yq@!Vi}Bm0=bNV_#0|WM^HC7paWj)ge*ORjF96Whe7xoJcfaD2nf9LcOm#HKM{nF zAjTPh74TrA}LzfbPqvhg5lt_exH!Knnp2j=u1@`k= z@R1A%qJKm7my3!}rJvAm1mgDBsCCelDdD9{m7a2h96d>&>*>{0_wkG!~W z2(+#Ov;*Y^beNzQ#DJOuV)E~w3Zj~SG1u1f?{5XMVc9v91G+i^UixZ+2T5>XKX$Wp@PlT6`L|C6IV$Ky)gf@xX-4w_M$qwKAO8P;nGBks1&w%t z8~~~=z^;OJ06=0;w}Dq-G=W5u?gqjE% z5CD%Of*0sOW3F4I37kxxWI=R5Eb46O1^c(}ASjMvKwT-wKza6|1ZL39>fi|K73ly) zILKV^_^S*w=z3Wuf(kg0Q$Q8{%~*)h+b;z5wt|cec(H9FxP=d%WdyfFK#2w%5FiFL zAV5r*2YosCVMF7!=FmbW`-B0ruL{&oQ0>bS2=$clrEXUZ@HFY(1ONZO*a5m=T)2DA?kl-NOe1LVeTNU9Ea@c}%C0l9st#1J}@ z$luZhy1f!IIs-QYo?mt$Y~pC z6%20qiSeGfiRn(IX=$lNAblW_pwz@1gotxSUJjZfun?-Ml+2>|GLQj9scG@46$PNX zb5n~_^O95J3-Ze$W`h^Jgm%Aad;{uAg!k_K^5y^korjsQ?41UUYeO6EX`Q|=K-(ok zMS@<`M}hN3TBqxiH1NWVR)rt`|G)6q^Z)+~=RMFlb);cXg+Hj1<^46_DjdB-9`OS) z*AMEDXF!yJ2k--aKqfL3Gm1`XkZa^(O8cc zWFoVN)#C@a;R4bMo7w{P#JZ;hLMAe&fK|LG+x`Fli^AQ|>eUszD;xE$KhRVRWWL|} zVr?}4_D~5>)c`U#^8{${8GIKW7ihm9=;Doo4_QFhi}hE7{SQ_Ro~nbW2Q9|zox;oU z734P8FTFg60$-?ng7hHU`L~C@fEf+0b$9|_xWmnP5d=2}ZOZTQN3a2~xs0^#7EzGr z(>k#&`-g=E|9(gifqH9AtcYno2~adAf^G!?)jQb2gMYuP1ZZjxRC}a>SK{=7(}vD2 zkf%bwfO{nqKoffW+b4of$peiFfK&v$SQ!RRRiF+K_zELej_w|qO3-o`&^cCLz!f=o zLa@7O4(Mj=7mwJ$^FW~B1<&e&mx!iygRM>L>;T#EV%<(qXBT7*njt~_+g+c4_R4&L zk41n|A*u){`GQ6G_lJV+WB37{Llo%dfy^OpyaJy?bo~PFC4!6zdcpbw6#B3UL{RVr zzL>ZZ+%QV(Yz6T_(_5im;Qe5bU4bvoeTQlT&mMx51-ytt(e|<#be0Pv|Mp&xY~YKW zP;lTu4FzSHP;hF+xC2$f`c$nK|8}t50U*nL5ncyb9`Ir!DH3T{v(i{mhZ7of8_6_`Oo0ij>O2@kQ}05tFeT5n(j&Ze$k zz^NCp*Z?xm*1`*tesO90|Nk$}g09a1tICEqe*FMCC=YBExEt8R z3Q`41<5QRz7{Fl$K8(*5<-S13<(vGy+2Dym*Ec9J3_3OrGRhzN1|El?AOhJ08mxbz z{1TkkK{vyIZX^JWviG)#fCYW8OczHgzE>8p)a1lfa-lA3uXy)w*L9@|9|IH zhOdzMv#Fpk4tnuF7#!xH_D`1mi$n-7t+UnO2k2G-kmA7ZsUV#}FHD|;jRf^MzJS_0 ztv|l}{~yrZi=v4C0Z0)KvTfb1AQb`Ky&z)(U(`MWso>~rH37xY_NgFKKxqJEW5A31 zL16blT>veKL7NU;d3t-Gb8?|yzz2SA?*(ZI?4AlT2vNQnK*~)}2@1;C{M$iSQ0)g7 z{*b~CTta{biavvH;{)~cK!qr5Vh?=ZGXMUmAhFCt;DWV>6;iN*EC$_Y^9Fj26UhF6 z?p~1npq4E@9mvkWS-gXm&vvs+2zU{R; zRQ~<{|D_9vIP&NJ|CeFEK}pd;}hp#|>g@PGmxlr~?OM1rFdGzbO`8C;bb zB)v}vco94Uq=5%iioZyY2eDaT@o)+p0--#;JH6&N=AJ@IvJ+xR(Rjak~61sFTCP&A?#&=0(<9NGB%^G#|{c zojGREX858)P?U4LJ`Jur!J1L`s6Zl( zzZZ01bCwwRKncjQd6{mW383}CFX|zUfq)lmkcbO-Aq!6Dpk@Cb;95W{)MdIw8bMoZ zUiiSYT!v=&7q7s12BhUpukRDk3iLOi)b%0Yg+UakbppAl7rYe)<182vP~9HL$iVO- z1#+Fo5B}{gp-%!{i28z37YqOX6Rjuf)gaDRfL=oi$-bX`5Gwflo`bfIfOZUFZ_EgQ zioV0(fg;dRNGfUFB93XDp?6;F1zm~(I>8IFfxr)JC`VeS>kZKM5^&|=%F)f!(Je9& z)FS-T?W+L22NrVH^!CsjK`%5QSpl>Y^auZTA6IZ7+zEOi02O~B4r%KIywC%$Nd=8b zg6_HnN2M7cS6RNyOuN18y_go7eQp_c`82knov z?vT(Y;NhHipc^kW_WSsB{)Ap7O1Pgf@C3ndC-~X3@?s2GdzK= zQU7wpnISzfGp`uBDm@gme^3Uz&7srvNvA9N72n{h1DyD(JSlj_ z4RlMr59^B;_Uk}JUg#fKQw!X+3JGLN>kMIi@j`Lk|Nr0#MbNyfuLLL&K)2Jq5Q9k_ ze82!6Z}a^FyAI{|+W-H-6OTIYLN?%qZaFB`as<4X0_ntnj-vpb z=J5rx_62k#D>y-b%nEq%A3V9m5%3}ns`|y*K!|?u3@!L9SMY8ya4T>lL=Nov>{ASo zdo}-nD$M6=KutJT&?yBUAj@VBK4Ji0+XvnJG!16aUugCQACS@Q`USE`>EJ^KW+Z22 zz*L`ys(xVxu^KYL3swz|E^xzE3L*z~F+vLDtN;vWf#OU6bZ72gFez#RxaGL8QQLg3ExMw0AWqo4o>6NLug=q;SHS;l<=< zpbP}rT>JbPO8(IR$wTvx$q8pz&43s`;b39_ojv#C@BjZhLBrMH?DTo{LWkRP7>tj0 zy8hW=&j8vp(+X1YLKEZ$aH0MJ)Q-bA&KrEXTNQZKUMT2>3JK;5kRHuJ(8{8;ZjnGx z{`vCa;VMw>0$+A3!F&*$0U-<4)4E+8nbJC4M8CY)3swUX{QLjEbIMVcfB*l#SP#021DxZ*{U7vG-C6j1?=dhifO9i=Sz-w9m$c4M@I{5F zcOb(Y!@u7}^b2StW+Aw2hIM=(N%ILP5rA6BkPZ{%CaWi))+XpcXh`=8k^-K95*p~( zWJu>6ykyT6to_BB+u&L|oqrAY*;1wh%Oq?fRm-2OMmH-BZA! z81#bwGRP880rCRPl2FJc9hmM~a}%TmyiX3ae)TVCD@Vmj*uVfNy}T@k&X(Y~+d{_r zU~LX)kt`@ZgKwxncb3N`kR8~ZwQmI|34v}UMhmW`;J^g!#eUK4D+0 zd1^SieK|UP|GZ}F4&~_#{nL%C45Aovek(}5vMUd0XCS7M(C#kfnuPp;)`FPZi4HB zZV!%5-#0JbfOufle4t^G7k5CzM*%OEs(|+sce=g+ZKQ^6O9q`^+>BRG*62u4HaUJ?4 ztuv7CMJ9;v`r^0)=sawOZr>Nj9aTU(GrB`x9Cy+Hvp}+-#gq_P(EI=cSXKZoYXV|{ z=e|Mf7F}N)cM-6F3xP+7UL1Gf0ttNcBj5$-j^5@Ypks=m79I+CvD^t_;dapUDk!DD==Pc5 z68IuN6;#l0yygeBz$V- ztPBiz6Nox!BU_6t1H+3#MQA{SkE(&?8EdF>U$ZcPPqcmlS}GOv!lWEzFAtK74++B@ zDAFDJ1eSdaUPOUT6@D!XIw0}|cz>KHq|?&v`=ry+;Dt3vx;ymA@g@aZP}njsypZ?} zI>iB${Q^N}>vV@c;NR|~70~VbfPZ_S4yd#C2efi4usifg(2LXZ|Nb{0Q9uNMlqk#{ z-~ccNo#5d6q1(o2#?&gB=6IixuEgfI%C$L50GT zPM--PFAsn+dFTWF{Z1OK2TF=xO!@WyKPW4_;NKp|6Z9e!=J`^wEGEbiM?8Tq>|vrM z4jCsvM<687zyc383%GWdj0Vt}zUy+(U^@d2wlkehI?c6b;K4TI zCnVTBKt}^Wtm<~s33%ZU4m!e!19W^7)M57oVGeW1m?OZz@S+xG@(ECa^*zz)VbENA z0&cP$)Z}-J44?wL+sPo{MVE^xC_<1TKLT#5N5&6OG^@i*JpwlMNT-KNbL|nhsV~4s z2D7}J0Wp<-yAxjks9XzF33_qoBPe({UVw&eL3^q}hh^~uzW6EtbvS>EA9(!&Xku`? zQ(3@^+XxvGP*%PHD)5)dLIdmo$lTBaoq-z7wFlr1NQXK=9BdRQk3pm91!$NB77w7U zPe=+?#Xu~(8wupw=Un-o%0jU8zU_vGGphUsJzdbN5 z=!Fqnl=Haj9?;JD*X+k#K_>w+fI`VbBdt4hPg>{1YakDZf~+wB5!zt8U~YQxh94Rb zC7u}!zd*4f5cFa?+-MU}y#}hWj=_;`x9gqPpyQrF7Z!B8 zzUXY}0&OSncD)lH*L=jq`pt_qHzCb7P%{ODL%ZMX2w4N#|9wl1AuPOi@0#HM|96UN zW0_<&KG50fvL95{W-;{k8f*uRIO<*nR}`@Ag&Lqa9?ft6|7V1NqJp8fb<0*zi}@In zIw+ICM0+E)fHZG_h`#vo_5c4DpTGY9f4sFM?my&u%P*i~gGCu6<}oxMV(bJnK!-U% zrWHYc>J0tS?fRqnfJi53M2VwYuybln9Oyb45SiBP!I#$A+X4~*3qx98tqmZ7UXY6J zK#tC-9UyKin9I@GTLI#Q{^)jM>1@r3L(GJCyMF2B0UfMRWCrRaPR)q>|Nn&x$jzYh zf?rsHSgs(#0Yq4XrhJ${`@VmafxOOr1sp=4QmnV7Fm!c)=|hlcpvCDgZbyS{0q;8i1v<9jbZ|@ZB&5sx0d$HF zOBZ=lY==ERfdS3QAyUolX%iTtEN+ z|H1%7XoCo~&)@@1nsc(ETO@lp=tD$t>};FYkTH54G{G4k(sl{xr; zsk`fl0Rw~fiNF_%H$f=~+?9nbEe89Yi+_8^2?Nl6)Os^;3j)+js3rn! z%$O5`o+0?RPXy@#%_f2*171vo=>{E}9x8)$+})RM7B2q%zA^_NGIdV?JLh81i%a0C zNgl98pxyr=pd!H+W(K&KC<9qD4DLaI@?iHwkmjInSAl>R#Sx%*7C>|{Knl{jr-Iy) z)(Ljni}@d+<8G*`pvJrqxB(83w9eKUAs~fd3Nj*y8kF5l2Mj=m$$};@&>i#Qmmb(5 z{M#Ygv(TIb3#J!ErqIAW5b#0_!iGBw6k&pColU0<7#Lo>`~W%~PK1HK2z+4!VT02TD1=aAmLGIb zGAR4DPJx!Ty&wj30WgTkzke!-YW~H<-`fM4Qvt0Oo&Zw}Vn7vxnEd;vf+*0rqH&bqeDOzLFTi1dstb@L8`&#L5KTJ z1it8psD9n@GU)&R|1S#OVUz*;1It=3)v0&8ay0LNly%bl`+GsvY+yI2?|t`(Fyye+ zA8DPAJRl+P5sb%tL0g5ur@Qs`g#7>i;_KW0u;%HRU;M{^CM1p|M}1W>bsr5kjyg%eM}i+ya+))jwC86yJ&_)4C% z&fba;$V5HFs!Grq!=PBfyc8XDnI==M7o_a{(H+ug!N0xf0yF4#iv6Gq)4`?o_6|_C z4SbRK7F<|DO3zl19RV+VA!2ErVE*fccx$BnC^Zs4)Lj1UQ$c10y)ZO{CNpR*gjFRx z6S^mYQgP4=`Sajl!RFlUU{43Wcw+!H=_532Lhy20*-l}!F` zK#2t8@gLnTT^4EGU_;Y7J3vA5QsY19bQ7>+(>kYuqg4)c-Z8$Ql>|8f8ZAApdvgE( zfAQ)yXjb~t3#K=ST{_*qkO(e`%tA!&Ll$V{mN?@H)><`4wF-7Ih?&+s;Sw{bAveVr zY+n`FzN3gFT*7m_bw}|3|KKJ)7laM!$@lhx(jsU#0w{$B^|pevgN9f^UIq8;L8k!~ zfJ)5XR!}+(=|4|Nnz}TO&gL{}1Txt;qumsuY6-Qy_u{#bCiDphg?` z1bhDNy&zWvA|>+P5JrojZg7J&0CW=WkH8l`yFvZkm`-rZIg6otDyRh=^x`QzY`D9@ zQZE-fF))D3FVO0(&>zh;Tow%A;B@`Lzuki;@Wmu%L~w$J*TKsWTt7gXg03GxLD&3~ z2^5^6&}&kEbh|WKq;>a%f&wC~vjY^YFSJ3&6~8`;a5cDGcKwmo?ZK1Q>BRz;0F{j3 zx&w5xNVgMDTBjq+i;pk=|9|o3<^TWS(Y3Tr-#0Jry##eP;MsXU6U>R)(CxCmZ(i(r z2~8((LqY9X@Of@8=Dh^nUG54RgGvJ}8Uhtepau)5-4@W@+Y$HwKct*$eF_Rj5lApL z?*#=SLkTSCG8~~nhf(xH=Nf+my}0rm)X(L?Zh*QY0|PitQR}qsjx*q9m&OH9wgc70 z0pNDXR1gIk7DBK1VH(U&gEW9n-Thl4_ylZ9cfXM1&H=B5jZ@C-HBe3bH8Zg)Pi1Xq^WRR(MA5 zo(PF)b%@%=y;Hj8@dk3n|l3`{c`wVV%cN55G0WW+ZW`SJ~Pkw3L;Lu6y1m~(3 zJD)&P1l%$-@6C9E#b->03=9ET{4Z{6K>Y;jwSmnIdT|^kb|4^wft7&))%xyHQdw*-=Ba}{3ruv&B8SvuteXx~a_rQA)NLFeiSqU-`7A9aT|2+bQ33y@1 zkH8lngdyX*0uc9s4$Fh)NRZ+HaA1J#fv1G-iC~w#a08bs;N|NtcBz5=2+Dph{z2Gj zo#2uw3t}+H72r^VbxpwrgOe+g??46zym$-FS>Q#QFA^b!fl~jAr7$)q^+JmL7m47L zeqp5{c0cfMhbYbxcp(Hc;zH1iFc|v)c3*;m8WR5SSncirxiIiWwLG|!2DT2vXZ+j2 z9uLS8c(GU&5iHMP>3C%8@lha}vcY29ESLyH%A|g-v{Mi(p4I*Gi91fLlU>h*!TyWPG&(z*kA(mDfJ zUf6@&_ImS+aM01h;PZujK`ajt;S6#tOE;`{VFGg&f6ICBG|`W4Ck~L)Kr=Ki%znVU zQVP=nY4r02y!iDECKriX`0;}WA4;4-Ta`FK#&oxWhVTPkynxwNs-BU+iBWw8dIY^N zg(=~0aR52T^+$7s0z)a!@m7xzNaA?S2Tqm>-AtWeG4Q1rM?n2R{+6?#NwFl*DZ%Xg z+oys%6)%)w&Mb)scO}6G_?HBOoeVEUSV2<=kdg&nhBqDr2?k~rb{M5jC5iPc)<@dvKM4z z;ER5!kq)TE64XUtL3sTPwFjInSps2>@`ad?#SDwK7t&v$(Z%0#oB=eS^`qNKg@1ns zXk}XK$S&6s{B(4;kJq9x!3k1n`$33xHt7s`-Q1~FK`0S5{sScM7lCQLJ^Y+wm| zaURm02zU_&(|lJ6tQqWdP;G#$`Lz|%AqS3nmY^(#7dh9#p$?k5g!YrIzQ8?L&%(g) zBI@@4|1Uys{|8NX3{Nip$Sj_pP|80VhUYE(E%zo17C2# zC1k)U`~hgGWw!_DFi{iG*xs+3pz$7lP{}kEEbtN}fGCK-zF_I}GC+h0OTY^i$fApY z7q1n-F%BzedAia%8$n40Y!}GA{M$WPKs{FlP{$u+K>)-c@O)q3i`(8H{Tu-=7C{Z# zej(_^F5kmuww#V*vo?$kb{*${s*-}C-85d2=YMC3q~1`EC<4! zX`PKA8Dz6yk}O@_9tMFg?4WHEkYS*#KC#ou;KfeRnY>G`gI0}d{{^=|KnGKUGZRa| zi_;&WzT04kqAcO8L}2?KxY1_lNO(Bc8mk@r(ULqw1q!~z;3;@|GX13J(ERM>;~ z;Mw>09H7x{g%{x<8-uQcW^VbnLq@+}2!DXuQz`~pM*yuQ{=SEbmMDSN)j$TOUOb13 z@*Hp7f;999VuPw2u;Vq-x_dzaX`LP5H3bJj$M}L8C_liCd$AB^3V#cz)Aj-+4_dDP zZ5TAcq)V*8iBbWv2)IS?Q9k%?UIlQ80LjPRnVPJ2n$0}K^Arqv=E}M2#19s`5+6QNTON@5`B?>6;v4F9{l9*4F|345df!1 zSmFis%`h8#kQtC5VmSG9?YdPU~!40tz(bxdiAa0r(bCSOXR|8t@-x z+=;*!mnFa+0QJWBw}Xudcya#8%6OfiPw1tca zTZ|(7fYysa z=lEgcN7uK3qKOCLYJ>%#=y(whw*VTNaNo>@nSB9LRw(dqp9l(JXdeqSW#kg{q8!=$ zA8FlFK@Lmn3~}^%@#hk#oSFbDrxdy;R^)>Qi=7;h#;3cT6uLPAUnG=)hDAWLXw8Rw zK=w5saDfb^bb~Ld`vJaa4q`tfi+2n1Z+GH?MtbvhZKYxRhLl(-53FaAn_T*v_) zV(py@nq3L%Z3WGlfczNv;@t+2{Q@uLIT;wTm?2#Vo`4taub>H)zhy5odVc^me)+-? zoHAKJ85C?jxDg3&|H8V;yElW=3f$44Vn6`Yc!3PY>0E@i!{7~c_<-s|a9V-Xe%o=5 zyhkIM4=;#8^IPCq#usNUfKEsNEgA~yZ3V3-f+c_-pymyzb_#g$Lm5;piGXImOF-*T zesl+_@b7N|x4;jSiludf7b2x~_UeGzUsV?n?JuxECP;vPJ9uSM0RMKdD$uMKXw4F& zpaXjz?l@?^#Ts1T#G?}QLUbc2-ek~Y7VIa?0ccQ>8t}qV1e#PpBa^W3f~P3xBt2GJ zUpxcP4-25W6V_7)YXNl*z)=Sq1bcBw7-}7~m_StqEsMY&fJZGXO_U>92TI6bgTZM6 z)P8|9>Y!bg97nJ%0WXZf838dJ25P>5mVlt@a0q;11=GO@(E%#)QJulR9oz^Fc(Gpy zY&f#F!NZ#%Gha+P_y7NkUJ%i7?*D)A{fwZVAw!8fr~};rV)JhgR13mk_GWx$o1Odr ze*!qbkn#(UA#9;M=%|MV78V8u(6Q`uU`y+e5)eo!tT~d_-H5F8#jUgd|G&6;7F0}n zure@!nxxPc&4y?2Y^}%2!0_V2S#WEwxk7`XBn6!EG@5sv0gYpngud8(7Cd+Y8;>Y~ z=`FE>lw+Vi4g>gf!YLf!*3hLA1=OI}!4K-WbT)xoLoOf(y@&(Z==-C&QiFlNB_FiP z8Pqh=Xx;&~mA@qhR@%V*n$``T2T1Ge)c|F_zh|IB^T_EDG~fry%^(#4FSyRaDs>Pa z9JlZ^2Ajp=-`)z640v((3|_^kCT~Ddj41QqZh_U0?cg#AHnNL#CKEEa6$eoWN}{l# z*B4%JTR_ur2wRX+3S_QB5vCcG-@yZ_K`(gGG~=9fd9n#qEQ3eDVPniMF2D~3hS&@- z6CPF*`N6p*trHw};DCik6RfP@-#!%-ut6`jKop}^4oCq7@_*2azI7m1@Svs}(2^0* zlm-8GaGVFe$bgvz9Z^NK8aChQ1ThOWSHUV1xLGpT%z~#6*us!+YZ2~(m!L=uC5Rs{ z@PPva)sGm_vjnpKT4xieF@;MXC~2bl6`>C#_u>-hWZ<(P z;sl5|3_2qioSLw-1Jt@e)eU621MUu3*nwRD4gEZ64-P05I^L=h^8bGWXcLO^2~aab12u}fn>x%G z7y>fDDgsY{%dSqa9#D&?_f0T#oz{ck|NmcHJpTXxi!;YT2W4k5bhm;QZ@}8fpoKRA zkcBrgpyf2E4u#g;kS1~9i<^@`jYJhxm%#cdS^O_fa)Z4Cnm~h0ploji8~P#vA%UhD zeW~p?$b<;0Dp>siir^P4ptFs)_ks)twXML8f8h_a-~iefG5`LlAeE3Mmc5{Bbwj|p z5L6`J2nNj|P6bh*^ALA)fnA^0*?J}T|Nkr-m+ln1ebN-ekw>`V3xp(Wt?D-fUSH5V}ndV zi-2#D zfTwl$LKJ|TC@&I^K(bl}gAoHm_f$}R3(A7;F7KVf`y&{1I6Y|hFXY^77Elh{0a}d@ z;cI*W9f1LA_$maxNbU#cx~vZwpw<1m9xyY2j-%-9VFfMh58MUT1wPUqw2VLSg~}0- z4+OfWf(nozXl{RT?=HNg0$rn$0a_vpt^-~iVMhcGXiove1uM>hTnJvaeS!fz%D@Hb zH#EKkZQ~4l!MhM-4bQF;(Ave$sh|P}YAC40&4(EZZjpc_gI+{K#L_xj!G)3y=%`@O zdBGE2JA%dzyTPRwa=8Rj7S!7c(jBl9>@@J@9XCLCJAoUi3PCU2`XGVB0Ny^a1GH@d z;sMakiJ%=|UEn<(pnVcSFWMQviR;DvLnv+91-Id$qY9eT0<}dIFx$2KE$pCGviy)^ z9YFyP*%JZ|cyPLg*DT!=Ux3$DOaspkgC;E*G92U?V5M&sBg}M^)BrIKlo}xM3b}y* zlo~+2^zJ}~pckRN5D$NZI06(y@S3r^31n%&PO!_sx3|3b1X_hI2rg6wz-b?@7*?o) z8|CW{{{Ih6U^_tx46;WCl)!?($r9o)us>fMJ_w3=0dNVQ1z8yhHx$;d^Irf`!voGn z@cI-sC<<a7yd!JrVr>|7%W=y;DI<@SG)h92~U#bpz5EG>8ovg9Z(~_fGKz?Enjc&a{H2 z7X?9kVEMQAf|S9RSb}l_|Mpgp!Ju0tw)cWo#Rm3H1+9t=>TLxrhXt=A038hsS`-`9 z+X`9~8_?SeS`-`DI~BAjHmJ81v?vxd1OXa)fQ;LW-1u^_AXb%-s%~8-ktiax>ppXX(p+*oW%6fZT zK^wxr)}yStM->6B+6RmDwuFj+d5~3<3;|N3Jk1FhEwv@^9}2 zg;QV_|BE;#NU6O)^g~)_OXvOp@THsFcZM5RA9p|U#~#DP-4TsJyZd$d)4jX z64*O+0%)xgxX})tf$Me>fKR}^_{zu+x)1Wj-QA!`H~2vBJeaZkEuhJ~Ztzx5e(>IM z{+4+l4?vSd7XOP!{|!K^d_Yao-l^b-f~;ZS3j~d(zj)lo16rr^qIx%aGl_q{M^@{} zQn4)1fr+3I*Ps_}Fi(QKVHc?T(HbbEkKl!HzSszJPiYo`Qk9v*a! z`HNS({{MgR6hu4#5w}6aH4t%e7pTPl0bU6MYIJb~zPJYukJc{GWG8rE3}|yUG;-!$ zhDJka9?}wy2$*Pz7XNnec2~6cfsf|L!Bm#&fr<=pDxAQ-JunPhnm`s3@o#sE33y=w zQweE(fQpdTlO<9}+c_Rxg1Uvj2E5RP zj8cLt7jS#83q1Y*!W4XIra)R}>k&|Q2{c~}8l(kHK7-6gbuJ64_J}}`RiV&1BmV6Z zK~@F5I3x%zIl%QB*i-W{Nz;NK2W_u||IXiz{V(VJ4~|Nlca-a}ViNW((E#0^wUKpo-=H{75bzHJ1& z20;5T$PXOY<5-U$dRhs%%ECC)^9|_uMK{o58d1>3c~I4htIU4_b3myCJWfF=7+mJ_ zgL8Kl6DTG@>l9v0I}Z)Fk`ho(gXe?{)JznHnXg%FK{;)E=m(@M(e2~{ib80?0@*FJ z#nb|nw86O^l(r_Obvik{(Ax$Y$d_D%)0(?I41 zyf~}|nj`~lQdI~9Pd#KGV&LE2!wPD2fvR@!6dPz$FSu2>9Xw?g*gF+8djU28bQ|_| z$f7QIa-Ba1lonKwtDO={Xy*c+mAX3^%s?}|6Kgma7=p4GvOsHO`S*M9Kyr&oz>6Ej zAg4)yhQP4xUI!htW__?W;l+b3|NpdSSH@RA_O$?f@r6)JzSkm|sM~!nQ;UH7dKEz)e4tto~v) zKlossK* z0Xj7j><@I8x&*wK2n&=FM{t&c_wXRAC&6N%q7$6Wplc#C0z{x|8o@L2e(S-j17F*M zjfZ!ep^CwR@TMDd0VU{IBhUnVw_wl+--!p3?M;GSxE6v8 zmq56bqq~I*bPNaROtD^2)V?s<^#A`0Ul8E|BAh{l9f+_55hfr)f7Ac}pvEP%)$`#L zH0DdiK!0WPJ~$uaSpVy@rH?(1mLpP17}4l}5g!xHe~aVKcZi6aQQ zdJ;6Y#1io0EKKx8FqkC}6!3zx1FSOOMZkAZ3!5dav-JRI_}Fj*B=(`c`g8)DukOG^ zOJe!AyMk7i^nx@8zA*j*G7L1}4dR2As8l&H)LI}W*Bt_1@Pk+Xas<4%_6?+%1vK8v zza4CQz>7tnL1HiiK!t1X9?%$wP+Ip?5CeLv6Nt&bzZFC^|6r=M&Jq9*Sn}@&tIoU# z8kOp85d{q*fx06gb(t4IgH63HqTs&pi%js)yuj<_{M#XJN5nIz(GMQ#gbaxZd$4eNyf4xL9mDh5HOq*9J6L_d3v0+xte|eti+XTplm*;A zbYcm3k^dVUWN@276}BK~iDek*oMVt7t_lG!e)@xw2xO0tEz|_mq7Qt|loBq(IM@CE z|3U;r@Pi1hb^re(6$ht}L6Zr8O9N=ssnqcg7N@p6zC1;NW1Qdpdm$Y375t2;z6_kL-UaeNK-kBp}QBf%{uUf zB`k*F8?L`YS5km_vEU;spRES1SOFdQ1l>l?_u}wsNHT$zhD(k>lR}9Qs9Ng<9pD5y z{c_Ff|Nkc-^)hQ<>iAoDA)P76;tkM2+~9&5v3TPx==_b7X`R^GVBiykK>HiOvk%}_ zFsPX@0lH!W6ql%bu3kLug2ytb=>=+%gU?;AG#L7Ue|rmf>r}vt74INv5Za>#uNenVLe_)M z6Mm@xI#st5)Qv-QAVLpAgOk5yHK;R=dAtyGx(!}7fV?jNUvB`uIr0`ej9Ax4l~39G_j$Gy0N@A&3<30lL1v`?XR3n&KhE$5vK z_8Ydfwy-#2>4GkAd!YpJ6C$o*EYML-jmUn{fcXWcf@cEy6g{%>poxOO7tP@NvUy&H z{73G`Lyx`4$znwK95mc!!M~j;;Klhj;D|*8?2qmcL5s9bCh+Nuh??X_w+ojA|8|bR z7kgKL=UyR(feN=D-9B6vpp$=#SN#9~A`f)@FRmgEbozqR-y0L^HE)W27AVF1m2 zgV^`fTo^!8yC5}Z)La-qv%Mhp9yJ$+{L+$mL$mDo)V!4V%)Ashzqll^s01Nmlx=~k z1SEi}2H6CJOj1!|Noss?X;DE=X)!}#d`?=tD??#?S`ql-MUV*iw#C%E)S~pv)Z%!b zAcnM}{JfI*P_@aq`CcPoP20vBN@OH7Fe`8+NAU>@kzK{XRVsHeDJAx#OQgd8EG{`F;IxVdP z=&;b^ zu75xjXs)Ck?%pur>-@H`3Fc+^Wzntw6X zYC<)4hct?GhW==-{lQQo+zmQH_28#J|C^7n9CrnsY0L2X5U8b4sQ~guC>l~UZRUj(5om2u|ygLT*s4oZnOmvRsDh-edSB~Zb8UZiA@m zJMJ<8ascu%(6QVv{u~ASxcLZ&^_v&@&5&vrln9_0NBRJrdjBVjy*u;||8^&VfETPg z;q6HS(1tEwp6)=F&d?t(cozKs|3Vx@2!RM*5W%qkG*AG#v2%L|Xd89li(@W1}0M?p21Mg$k6Tk2Q;#_6=q+lDQN5NAO7tgQh_h(VT$=%R)NMn7``wv zbcg=wW(s)G0@J|X(hrsboy7}sr9)7+D-UQG`o+c9;MP{aixV(oN)*7WD!}^)JC>+I z?k1dgh@XMsh01(T->ninf%1T6i$O!hFAi9N28sk;D`qifF=R2qo3XAu-97>$;B`WCAxa?0??VGd@&lDm z^teBQwEG}5K=(o1*vW-_9|UM5nju33bV&D&L*P8s=?X5LUI~F`1dmBedvRV8up4|s~m4Ew*!0ymHK`+`M9jQ*&JKdl=2d0BV0(7O?7hE+N=;B4| zgS8&Lp-(`g9bZ86SAPOu^y-0Q0Bo%wsB>KCX}!4&8` za*YoR3@ZEmZq;>Yb;Rl@`{`>#`ECr49XjjL=RdF2URG-zaOkf`(U@PK)1-mUY4eS7n91s z146Io_JTbCS`rl0?aILl%F3Wp7qp&A0+hBugW$d*fxT0I@PpUW3Ix0;;|86ds=~kD zSEKc0i4yZvj@}k7a1`)w?*%CV%>{$(2ztS|9F(_3Uj7DMo#D!n*6k~i*4e=TD$&b+ z{{KG#l4tLjxG=nURtd?okb9Fdsz5^*pj2)B=7n|@Bm?uygO-XhJTY-$00lS02L=Wv zQx^tM)PVBy9}^db!1(;q5{8t-l0*;#)a-}eUs(XEUncAXHMOBvnH_h10xAbz`~}@4 z?8*UZet|9>>SpS6eenWxKSQ_g1IYaSi+~p=Hb5(9{+8Dqpqqm@x+j8$$~r^ufKtBe zg%`^}#`r=HE$Iw>^J3`_&@zb^%%H0c0$!-Y3@8x=HFO(6jWjmUnK*SnK&>9(?of{7 zO&~$An=(Oypd0GDJ<>pu_~J1nA1tZr2C=+dX6g zyF*_Dy+}U^O2nZ1o6zNnVzJr!Vadd;v!b$6P0u}8iUK{}3$8Z}W#lJl;1C%AM1ia{62MwN5IZ(QV%r$ho zz6p5IzaA>X-vV0r4BD9EdnNFN$4yXT1n=?(3AtVgcwq_?IuZEdCgMzUkkdfdM@R*| z5QeBo>vTN;ZY1(=_s9r*@%ILjQQ#IZNc1^E^hGz!v;*J)cF+cIsel(pAu7_q_h0!Q z0F@nof?oVz19z_=Xt3LrquZmP({~Rjew+$Gkpn8+4?bWDc;T`OT#9$P&H(v2bVg@j zL38a4_zfGN`zt^cYl#Z@PKy|b45lFe{dxU>~=n?+?t_Q3y)T;CEhwwq3btvdA z-P6s}*9jg1J<{#E=Qs;!AtA%-gIEptV|}4EFiYaa)}2u2OaYk&szsa%x6iT;Xwu3Ck-*BGjtEQPYVqy-#_4njwHmOPS*(_cezgJbSh}Bod9># ztFI78O@`f61P-duBai|U985<*^`!MdP*6emAnQEAK_xP+Q>2l9zw421-#y1!8bNUc z2`UT&4p<+oRR)E7x9gs6(3YUU9pEs73czwt04-813wR+5kq2G0+v!;L!Vct=mzP2F+HBx^ zRJ#!HC~Xq0USxDqW@0ND*G>G`+&eh7SV?Go5%&<%kvr$TkZj~?3zH=`EpI$sX( zF(6U_FXltEfx0~}lCOY`0QFQL^-Njdi+YGWsDkcvDtocu11M}b(z-p$(mH*=yqEyu zhjOHKJEehae$fEp!%c^{%m!ivNWM382`F9hZ}&)pRO1Zbliheg>*Qa2c>uDWrPFl| z|90OcpuGS=5S?f*SxL0WVB0g8TdJ4D)hW&c(Db@#T<@vXV3P3u^KOlEIF#GZZzW4$@ zJB8=turDf)+;?h8I@3;9LOds_e~GV`x5-WBukub1o!1 zK<_B;afIXt(A?z=M;FK)<&Z83C=0+bIDhbj9e4c#5<;Cf0A&QwtwItImw<{PkWi>Z z&dOD9W=xVxpMwR?k%wL0Puyve_;6!baE@?hHzh~{EID+ z!am@IHADo|!ULOCDgbK!vP^uD1iEM9Wf-W^(FNVo%Lv|j_#zr&Kji-1xaK1~)^A?0 z=Rm?9avv={#y3g5AJ^KIrykTF>m=enUCjG(9m0ES4}jM?LA$Tu8nn~*$8lHCdLf1v zpyO^qjcafd71XEM@5|GAvQ#z8!0S@Kk!EPRPcBv%gbO;qx({~>z}mF z0EZX*K|OWQ@;Z*r&tuVzxJUO&w^_5l5%*nHSNp>#6U& zZ~$4z2&r8&0$(sLfK^6<;6`v-XXu?5GN6Ih*J)WyaAmjVBb0G6fX>Vbz4PMhUr?LH z9<)gZbY@^i;ET;j%D7?5&ViLl7#}DV$tup+adS39hQY1b3@^TUfgQ=eJ@f%+F;+K6 z;ET=GpmG^h13dxl*34ptN}dULkx>bf5=rZHy}`fT_W@{yaZtDGpMV$lr9f9j@^reM z09`5xYG>-QF@XBuFI@hDTAsdl0=q-Or<_~?h3XSfo$w+k zi>24~L%@rTUqQ`jnNHUepu0>?1imnU2M|ZM>xq}`paw8#c7}g{hYt?}L-s|n#zQB9 zXEAiUe&`Gk;ot5HS~CA3sN3~IK)3IoW>6D7_6o>M0f?EQCxTwwfd>=VOklk0-pQ&(=FHxy8Ewbi7Nxc3#mWgka`mMBH#yjBCb31Pg7`egC9&Iy$}B`wO(G6H*?yyjTz7odk!km)nblzd+#&%GKbl z24BIw3Q$Y(PxAqbfEP@GpxA)MrSFNr7Zc~g+yV|%P}4jEe9`e4vV;0w-Q z|Np;W0Xfzeq!qN77St$#^hH2pN1$U|v_QF(f4h?o_+lWAK!_;;FKU*9X3P~JDH7z1 z)9?^w?RGu!TJ^O^cj%wvPBx&ChHlqC#~r}4zaR@j|8!2=0}2$^6OiV@3Qre?7u>1f z=0fuk2kSR4;!+_M6{O9)!PAA|1N08~J)SNMX-VII`Ir;(A;muEzp8#P`SC!6ghzKWHp z`G7#c3;l1PBn5F)bCm(e!4NkY1ihHN44jC-H6b*k^6w87X}wgc0TydM$P@U&uM1SZ zut43D0M&vzt8ywC5+|Vc7j(Rs2WxZexa${Cq`z1R8UY2lqto{f=o;SrP9?1e>L5qK zg7?30bo&TYfU7LfW)>etfll8auNC0}z8u|C7(wgaz|+Z~<(?s2prsct5HdTp)Ot8+iJ-Q3gDH z4C)*H;olx869lS6L0fAAU!*~#UZ+5Ikbo+YfEN#Ez>G5jXG8w&fpSQCj39cln84jl z(EbL6fETh5!PnB*Y+-;%B0ORbcQ91_{y?ebSBycRQduJ4#RX}wgZa1n3V`w_(&BTT zZWb<3LD@YKl;MJ2h$Vm$ia@997m(I30WU=1CUbPVet8MHh`!tR5C8r^xzev7OCv>}hfwXtU6X8h~H2=3Gj*;QT=0wQ+U(CXP|97qo$2$MV(GB)U zXRphae~=+f&un<9MsjmVc0|g?EC+7ejfvoj5vMBewqg|6&D5 zz?TPfg>VdrKLf;X1)J%?0-Z!?HQDm-|BF1(?Ys=Vy)!oa`ybdlb;*W*|AVrOy1~W- zyl7Yg8gCZq?gfblz6d-5>N|kus7ki}gPab}zuhS#06gB=3_gw^VC%pCpam9!pyU2P zoPZanH-KUcv`r;s>%af}`+GrDcPI~NJC^l{I`NG2ObiSe3b$u7WX!ldo8g7DBczC$ z3U;p(OE*VacOY9@=hQVD{{4Tk7c^W5nyUg$z4ZEke7EW|=&VLoaFcOr&DMYaUkjym zw}Kdu;R7&}e}6AXgnvKS80%BDX8hY*LEZpO-GOAfLnS~{cW`wgz7N1HGYRle^tMP) zNbtN~);l$0>%adX-+?tFmUu{X^9TfXLmkZ%@M23HsALm>m{r^9Ke}6A1#+rW`)QM-j z2L;&+P>?0una%Lxg*_z55K+v(-$|hL0DtRxP=69M)d}(Ct3E>GF{{7E91X}OY+rxSQ zl!{PZcwfeV?m@Yf)(LhR z$hlz0;fqEUs0T7nfEE>lPVE6FGO)hRDXm99$zextZ_Czypp&RVWrDgPfyB{xaFr`~ zXYf=|LqE5xP^W?R z&LHf6VZ9HOi@=i)pgw#r$ojw+TVbLXKvT@1*y`>9J1Ou*RUW96<$2w*3v$ZN)E-bg zfbP4U02+h>dllp`unQqWQD7$jey~&d_qT#_4rt8i8F!L^tRdGF>bhZ@ve&yVE*bK^k9v0`*c^ zVESKhL#{hW>uj~y0`el53V1Ok4&(w*Vb-zX-+yon+iZc99aBLJXbgjx{QFx$R5K`# zw1O5h5s{(z_xFNB{a|e}|8{VU!OINffa?l)F*^qwy|7?_2U$001fB<$UOhl(bAW@e zWg;ls1iVOw=zCcS8a>HPRr zP&!uthXTkFP;vrCIW!bNVzAT<_gFQ|V=r#(1tn?dLDP@~4NZLAuF&!`8|q0&P`p@% z&_Q&XDT0{sG7;=yaH2-?ASf9l0xR%^38do;8chcK1mq=fy2VqP@b@kR=Mb4Acvn>ICcVoB|GOXk7E}p9(gsr5BWeFmu%Q zR#5bTMigWMUr6l&g(e5o0?;u+pwi>TVemL8XnN;mkwa^a8ykjd^>=sB2GW(hl)ZGfIIs;x@ z6#`YKpjJcz$mNLi4$AVNxf7Xy7ZZ0t0&e?>z!z5`?6l6-mJR>@@A_X48h4u7u;JhT z9T0YF4X6~&d;S0ai%gJ(q^12zSn&eQ72Q4H=nj0*8wDy>z)L6ix3_}q3wUAq8dg4m z`25>Zb4Uv~Zw9;whUo;K%?EN_(2M`CU^+qkm&uTn4`PE-KFGAd7q{VRDnJDpNwsGH zXxHq9fB!+If$Je?#CAjKgMb(R(xLgb7i2i7d;uwg7s@@Yp!6L0;yOgx>mL5?Q$gVk zDu6&50$%*x296VGJirP${_Rsi(Fj?IEC4bV6!RcmAmc%<0hxkUY=P_MP=TOsaB~>a zy8x~733{<37BqEi&IpyF`%Udh{?ad7esYW1?dMhj|4!Y@u1Tfc7fJ6fqI<1U=sw>x?Px<(mGqg+Mc`sEl>s3EILs8r-B&J0vN>P z-`@(MdO;ej57t_s8whn_=1I_mGP4hp0RMilA;(=Nf(Hy<^n)yUz2v1lBq4zU8MONq z)NBLYPzr6?f*c;u+Y4%YqD2AdBx*=YYAUD|AJh%*ra_k>fd>k}{TFbz>_re4C{|3+ zV@0|f79g-#S;+x9J_KA}f|3HrRiL{7w*LDc@M5k%C_nM^_J(Zv_a9MZfd+hqPJ=2f zj^3#tDR|m}w)J|!r4Xz_;AlK}1k~DtR<2Cl9S4xOpq=4Q!8M=^a%HsNL!k9!DbMj% zP>&5%K)vRIut9?i-BUrLol^@o{QLi!zq=JgHy>c^1T#=gVX^E5$<{`6gH?mJv4RS8 zXlbvr1)M=Zv&66-NjF%1_Y`n79rU6q1)K*VcBFOt%A|GnxPnZ0vEdnL5WNZND^OR7 ze}A9=XwcA%g@FOox@_G7%H1!*JD_3C-!cI-(!0GEBn}HsCjRXmek=?OfiL0_>aKzY zuC`AFwbc>*`YF7ivOQ=AsJ)*JKED&xKg<<>SB?{+r>RgN>!| z?+2UN-2yfW)cQw^yGV44Fb2KwLN%X|@e=PV2inHNEB=xq@NIUwML7)%ee zV*+hFzBsoD>HyGW7+9`%3fMe&%HZEW(T9bB0oG7C>kanFi&D@Hx&=@F|Az)H$X-ww zwVo^u0R`+-PyhzK_}2yv*b+O?u69U|GK&G~X1LFKSV7?i+O-bKV$d##2TS0Kypy0b zEb}@wi?JKhcSJ(^Kv4nd4nTT zp|0Y91_)}W?!{IwaJcY8HN%qXi`Z}LEdz$7 zKyXi=E8xW=Pq3H3!|-XH;HD6$Ed_2ZLW^Bcg9cW^qxA1stPk<`f-dERh8k#C1*XtT zB&}P-F|BiI%EEvDU+_Ez&4z&80v~FC=4_Y-Xh)BKKUfD^z~{t(Tq%GN@L$$Ly?g@H z4Tm}ulv}$Y4KR?8p%y@g4iGI_kV8O@1BXOczzYtD9WVcbrWe8fY_2q5DACP=_oCq4 zW5gJT0eDUKiyX+z(rf1zPLE(qYNvwQY(Xy=TVa_)4U}bCq2oc#Fi`=>Y94{W7wX`{ zrFlTA!0p1I7fWHP_**PM(=^~-JO6$UJvm0?3RPGai6W z11bZp1OvxrH#p~kW*kq5H68@bICl1WfQJ9_K?=bRuK*2{fX2;03}~YV#N^-K3!$ch z#@av)9?%j_*rZol;0v2ZSaj<1BU}p7(+$bypo3gMqk_;>{vz8Al%RQDo1-fSJBfe4 zh$FNt=HEXRY)lKdDi3&J1kw01{6BOb14tIy=>ajJ>OsrvbYSHZXbCOY1Km?Sz`cJK zFQ~I#Om>I3V;eLJbEI{H3)!^JiJ*f1MezOq{}+OXTwgFQ2GNiYFFP8E2sukP?YTBiBhCX?bco$R-@PG!@T%WuM2Jv7k34B2d_c=iO zDrF);Q@WtF1TXlv`@R4*bwNu|!PCWoFXUk6^0$EY$APwdFr{_-zJSdq|GV@5{|m{x zppA(fpvAr5dBC6->}k<@wzWG4@(+tRVjm4Tu4WQou&9>|!v z4oE@D9q)hbN#pP2Vrs7Y&#X@$dKj zk$q98w@363XhFvQ&@Y{!!3ozNnJ2)?r|?>w11Wd?l6}H}`66gZS@sE?-WFZ~(5i&} zzF#^;IzX}F#M14-k=8Ak)*1TdHBVZ%>l;X+=lTY;|F8KcPpvO#wNv&Xo!%Z+m{p)- zYrAaJ&t&Df9FNnhc+eX=a8#D&M^0Ju|)JqDL2+EQN`KlYDIPgWa6Sy1$ zEsq45?E^C#lrO*vdqJ$up4Js$vq2oV+4@kk)iKNlDGq!g4>9|t4roXfw7v^;h9ziy zJt$G^Zvro3fmJDxoWKfd;DPGUZo$Swpb_?o}Pg2X_5Ij9nl{Q)oTpeO-} zft0*n@FMx<|No!{N~l55i}EUHe&ufgP0)eX8o3$-yqJIxUJG8N*X?V+f^js zh4W8vJiU+xn*)`3u@|PL#2$1yE69{pa3LL#eZB@@FN698ps)>m@oOoxZ2($kA`At2TwO(JB16hn^KT}zZaAB!P*kgW-HvfKbe1aC)-UZF!fVvMHAXjH!1qFudo8v95I%ocaK>dq!(7n0Pjv?;Cg}=9! zk%8fOE5jLRE5qO_XmM6r=Ts4p!9rL6|K9;>o@IkaNgM5UwrOO5G!%Nl zT7vK^2Tg#1N_0?#HiZ{t9*75ufo_o|(B$GcAkL1Ecq8R7J`fc4`RbIAjl@Ly<8xDARg3S{_QMY z0a@}dQeb*c1ipxXu|X>(TS0*l@Z!q?u$gI{V192eDC|L_eIOdNS@%tM4>rJUWMmh;yaehTjpDYE!E2tR= z$*15d9zNg-atU;_HH)!#DyWTLxTKmonIpyDg=g;hH!f*ru-@b8DVPWfAUK_l~^ zRV^&wnNZN}8v^{>JwWRMO+bwYP?-_P(s&3|yMXNk)g7Sf1=L&s-`gPpad>yA2t=Nv z8>AkTeuH{jLCp-Xg9ACbnOH%Bu+~O*C}^7-4`_(_|3^^Q9$LFVDiUb_uMpJ#vq9N=SwOD9pA(N5<}(}#)Cv)su&<#kOHtum^jF2 zkUEeAhz;%Tf%YE9BJLIJdpjxu7A3p!Zd-_ zb0XB&6Qdq|KS1Lf9cBiG@ZP;w{`~*H6SPqWx+`Fz!|gc?#z#9{|71yIF~9f-E{wp7 zAbNXm{QLhu@Ws3Rpqh*WEPV+keIY1|p|=&Z_&(r8uNg=IPnJY)?~T789eW@;z$Yev zlq~=?kY1!Alv#k4O+{1209IxXQ3h&5_x|_;8CIDJVnAw6Fq40OD@cTYyRQhS@>BxP zAAk;6*bWvCc%cP#=l&Djp*+1TU7f8@z<;j7 zD~JKL4#ec&-wL681*{L&mhtbO3gY&*go0fRI>X@4|No#$>hml}!MPp0Vg{tByBB0J zq?Uvjvc1O@qzyDe3RciE6%-l)FU-Lg?}1LS010=t^n!$6ECg*f0Pms%4~cz&21qN2 z0qGrrnf&{EK_bmRnfZJ9K@GnBQ$c)aIDvZf;O$kNtuH|L`+#QjK$Z~nD}V1^aL*TN zn5zK)`V0K~dqH}cFZNCe1;syT;uRDb-M%vX+eI9MvgBX9nF$RB@C*k?b@x<|#h~^8 z)TR9ULk0NPpMr)g^9la#J-#5*K*0iWIjUvdQ>KDaW6%o$@MV3VV1g)v8Uv0I=2M+5 z;6(c(>kp_lmizzz|I72BU0OR~s}n$)K;8xi7j&QwB*qU3u;yRP{Jn*s00gb}etYLYfw*~ADNI-%YneuN3hfdIoZ4gB>dV5?!KI!ZQ-=zd<(}6+&WGOfSKw}Lg z1`SG3Sb$pUpq0YV0O{@phnGkrD0D$e5dtsH9fgE0Bpx6k3);9=2HF=O586Zpwx=6x zKP*ZjXFxP3Y$qfh>LEQ{mQwGuo zibAlHTc(1FgMb&Y?4ZgN6lEY`P!#?B|Nq7DU!W*@4vL*zaH|QVxD%XCK*KR$_q><{ zQUuPMpdP-?2jxxv-Uv|K?FTFBZ3zWA2Q;w&QV0nsP!fD`=K?q| zI$PiT`TxJS7v%FmP`H7$b;B~G+kCL9fbL$9vcMN@;Jvbt(~f3=`@1X<6JSn2%Gn?b zL6fRr2fVm54Qvv)owa=`$hx2x6%a94z;6fp7jD-o@LD7ei22=9K@JFl?4fjkxC$Zz zwHY*g3|7-A()c3(=l}m;rQKlf1-$UfhIMq5n)iZCVyG48-w!PbC62RzE-hksVF5Z_ z<+V7%#N#ZD;7yzIAc>dF|Nj36ul4J8RY~gWs0|R>{ig8^Xe>3ncdx+z|NnP_Hg;gtr#tMy zLz%7*UYz+3T}R>j0yM4{`T~-ELtpUk2km?Fl>t>^OF@;`ez2GX^99h+Ck)vKL8l|8 zb&CY1b%wBhdC~G6+%0?oIs}OMAov(2&~+HT9BJJyj!bEtE}~z+`vLg(`@ZN76@f)< zEL5BEN#jeMJx4|U|Nq}P<*3B}|NmbEp-R<&q(Y81ys!ef7;?PX35K-p5Z*7K(P)t4 zU7tV-FxMyi`+c9l+`zxzMf8jH3I5)h3=9lA4}k6+y~w~E3K|-C(#_KpxC<Xn>}aID!IRn5lwT0zm=%`$J!J zw_F8zAfUVFD#$;9FF3&JK&HRwY&i=O>zr~Hq~t~3H&8+21R3kZ&*p~Hn^tseUo_+ z6fj6(2kLQU9s&y@LJ!o_%RB)VM1&ux!v@oi2*EzEe?TGlMH%cfXb7Ts`lK3I3fgFDgiGvV8SI;p!xuJPO6Op zM=4tR0E?mcI6NI>k3j2z5_OOyC@Vq}Q}+~b+Uo29JH8W?AGE*@?E_Uzu3)eGzJN3y zd_mp@VDlG8d}AH3c{z`R)S z&QOr+x>1~7BMUMVBQ#q<=c9n~28!bQ;7AAUrhd`wD*`$V&lj{g;dM7?fFbk&X2xBH>&3qddBVd4isLn?w0Ubn9SXmiSE&@KQ-Es)dT!tf$k52+TorU$A8 zK*gl>n-??nAho~*W(Ed^k_H!sFVH<~`x;yrKxqV2zOQOWAM6Wy41T^<;0P3@YhJyt_eRj|yzrYuso}h(f65XMoli**x z1|2a1HVT|~bGfUAy!4;lEkhwy$0dJ*3Tj>{PVFH8+U{WKOxTAT`UY0!&8(BUiK zZ89MKOMg%)xxE#{4gjr$0QImy9UCc#A)w~pi+M2ifq)mAdclT+jC}D8#=ZdR1H6Fn z(mKIGoYoDYI$Ocvy!!+G3K1MYs^Cq};0lq<01El=|NjgB51>lZ_l5B#;{%|Aywl}u z%Zn&vK}bE(*>Y9}R3+Mj+y)NA?28O(-7cbE(mGwAfT}*HOOv;YwuX_E`~>kwHcCO-T@o2U;|@Tm?A=R3(9Gu)r7EV0Ey{4J6h% z1?*Z(`vgF4L#<5VweX8(usI<6GV$8CTLI)6EcU%neEX?NNB^QUg$33cB|Y9M0LKwL&1LBld!l zG3cPiH?ZmxRAho1A6To;7b#$;f`Z3O0u%t?=G-J0PTp_mvc845o2zrqNu@zKXbwYjd!UJUR>pd?5KnJscs$z|x z7hB>$RU}920sfZF;JHKo?VxFrxd`Do(7jwZs$&)FgS9pM+oys`SZRiX++VZ024JeRuKpVF}C)R)qVT=k}1vIh02GZz4wo)EqWm;z|2e>fo1yP_> zgd9J=M4|Eaq5-@=64h~dMdy0Qss6gwb5>?QO4hG1H+e|M4 zUj6^S3sTZdH2`V0e+8OxRt8Ud!4zqO6oFPDftK2X6iI;;fwzQ%&uRl56Lvr*;Kk!r zpc)i(CJSf*iWBJ4RgUI^K7lW)RzoB}TjRl(;r33=S@r*a(2I>w9iSyXV553leOCSd zAMnBhq65_Sz&4xL{6nBtF#}wsfY+UXt`g~O5mgBQ>E(gweSIo}gAsJ^<{xj+sH+>q zDu~$BEAAlcjgZA!*EoZ8%OQ*PPH_b3-GwYRHOCgD_uERapCIP7hFF92PJ*bz7B9W|Nqw=ps~=fy(?hPn zYI4wNaNRDBb!nX~q86YiHh%%O?+UC73qCxx#{+c#Sz2cgM2+wZ& z1okVa-L^jze7vd;2S>Na#Gn^>P=)X$1WvjaAAmdz+Vbtf#L>;u5%|IlqAmk8vXaHn zJC(%}6pI^tK!;617Lb9Lr1<`TwqkyOVyXETb8S)<4`@vpD2lRAB=k<<)v*HUbW;F% zQUKJfb;Yta3bdwC4WtvH4`d_%e$X-}3FeDIFG}S=2JpN-`nr>Uf9MtC1E4tQbO{uB zu^Y5W037hyhZxejdssm+lGcf>76Hc}I8>(af>ePPIm-xv7RPfmSFkYfx3q&6-h$fN zVBcXZxB;a{PyX$pHlUWg3aEbh(H+t|A?U?+V{j49zunaa)THl*t{4FwcLQ1m$G_kA z2YhR2H$?60`Jj^mKr2GP*&lj{5%^4>-d0e`4Cw6zCF8)}&>Ky~JiZlBf(fiE~9P5}Gl#qSoVGRXO~_?&*h z2<*+*?V!Z!!Gi2?WLM6d4RWOb0ar?b;+lWI?}P4;)(O3!?T5ZUI$e4vygvVO8K@-y zYKY+WV=4c3*9YJjfah^gNdOjs*60uT*IxiHwe9EyCH>1%;1qXYf_f#{nJ z(f6|W|NsAK-L49tjpCq6#retq{}Z5VD0=@`{Qv*L5WJ8tRHyY)2|p;Mw}M5bLF&4F zEdoJ3Ku}Es77pn4)c{T8-T}ug2WS-)s1cHR0$eyx;RO}Wpcs1rFX(jgAT0n;jRxvH zUv2=!8waSn)H@aAhoIh8a1em5NjaDj_`(U?9W&{jdS^9~&feZXt3juqZx2PXy0;Z% zKtOLV$NwC)ZNH?7n6$%`hCA-EE0^H1j5dVWwKL6hkdQ1RH(1R8UI ztSY(0z#P)?2NXv?vQHSmyz?SQ0+!6~fD={bMNpHe+m)lYM_>-57y6|66=U`x3FZ^9 zQj7USAT(@Wx-M*jW2clg&I1UaH>4i5tZWc!0FTJm`DP8@7IDD}C5 zGY@JB&A;FEj`f9FZ%}JJ^CCE@LD~VJ5{iGjhzF>*T~!ATJkXGA^GndNig&=1YoR}w zPk{rp#cKf%1H%hv@UDWnumtLj(2lE(y?(!XXBPhts-w7}Gj? ze}MG-hON=Zwy+jF2?^SV0*)te&Efh5T1$Tc9V!Su|E38P@t_goMW815cHcXJpy~)z zdw?p*DHB1F2CgU1gDX^Uo&im@S%9jh*AJkBXssYGfI|-Zv6P^Yvj+tfmMHxKj!)2C zd;Hs30zqp>Kz<8+(FZpi#DBf=rOp5U|6hVm%Y)g^zr7VC74Twn4LI1-I>CHgt)k{1 z&{#NP`#=88mbg+ts58p45Qk1wE< z3CSLyQ0Qjq0G})Jt{vSXdf{6Q@!)pQ^fc(`RgUf^Q2qqBqCT`iB=?8@042mukOZh#CvgwrV{kLE7i3Uc zC&b_vZ$Yc_UlxITixB6+5=d|F15;4*I$IR%X#VYRX^;T{y}dV#K+--C>E5ZJ-c3+% zD@Zf|s<(G42dF9ld!z%DL=ZJl2gq%plE3i~D0+fkh};8Z3uyUYlHJ=2YP1LTLfZ4a zt)QlUKyNRo7ZBJB=^*sBg8B}Kf*#~$&>6_ko=r+%#)UIyc=)$Z1=V0dSgM>r2GAaO z3uu+ok_2mv-2gStLvKJ+`3?U4t~VfN@AqN>jeeSdPRy0#-wyHei(QqFP=`dxjqWME zU|+uog2YB=>jfiF@PiHM4RQ1Vjau&qm89VE5K{Gm?BL(d;}rNp24>oYpl+~EP^ta` z-sk|;%KZC%Z-8c@UNkHN+Z+JW4a$exL8e1F-64%KK`-Wk*Xn^5``zdc<>++jl6k>> z2jZIE9#>Fr4pel#$UFpgOAjlk8Nk0k^ai9<+3$&cQS!3}y(t zRfKLv2$C5WA7XKbFvtiyNF(Qj(f|K19^L%^e+Ssz;Pthjjugmuol|p+{{Qc6%`p1^ zzq=Pqfu95!j4tswir zN+DqYQR;i6vo!@|Rc`{ws;OWSEYb}T*$R^F7P-J3a*n0M9_&;|Lk^-J*(x!JRp1I^ zJJ`B_7ezNgB@F1u3y}5T7y>s7A-Y{}bWV){+1?5o0P5}qlVFiJVAq2K zAEMp&Mt8^wmY{By69F$~a)SK{POjUhf-DPq@%09><@``LfgJ(akc(+d5M&c)P{4~D z9AE=GTaSR!IRpRpUXY=IFC0q2sT%4_P|60i1VAm;z!xeAxfdr&pz6SbbX*Xbw9eK8 zprI~sj9p~tZ4rfZfqk!JUz7lkS={Iq@c=DP1t|;Y?gd#M2=+ImxeQSrdIi=LffO3x zk$~)rpsO}uLk5tf*#us`!VA7|M+BkD_X?ENopBws#}^WEc%xaL5fm^y zK>;tevV&M0kRSp(5|XqajwHfQIFy5n5AdJ`c)G;*3aH)T!UP&Kz0nPAbXbCK>JtGs z(+@sk0FP~ya&)8mY05P;KV5v#+rtWpb>x&A!vOLK$V-pdKrCc0fzun&KEkdV;USb! z7;w1?^-m`Fb~A{7EEHPI~dD5So@x1a?mamHVI`5o)&t zWI3ozevtrKZvzE)!*5yuJdeAHhBY z)o;*x0b8vC=|F?lF@VOM@<7^LZ-6WYSpix>1=9~|6M*W%pci~F`+RS}>c{FUpw{Kv zAOHWq-18P>2B<^N-|7jfD?u{=;JVWH26W&Hbax)eFQ6?ckV`Z;*+GMazBi7y^nyYd zG+g{b9b_iR6&D|MPAxI||G#-Jh?D>yil@Z`Iu!3fcP~gNt+Ry}6iF|hfR@)Yf^!bO z?ENAJ68>qOtvkTY8s8heQ+z=tfJzFG5Vk=>P;5i@R3LJ`E4K1s?OafVaDYPn26zuQ zEH#1lX|Dn`I8TGm^#?~;XUkNOmtRLp!N)NnscB-j zNF(Ij4&3Fy$2nl*!O0C2{h&|*d!%~`IBJ4k@Wb2=j()J)LHh@?AmNTD!@hW$4>lX_ zbk`fbJ+2@NKwSe+utOY&D^G*VCQx3+8t4{qhx_6P^f2)HL6ks0d=ZpbU2in+X$5(N zq0|Eu%gCv4;YIK{i=j6_sjvW?3PB_!6)xd~rb3VqJQc>lw7|<1P+J!kd=Hj`0|8_Y ztn9G82x<9+B1#x9XZXzD9VP|_ya}$ebpxpB^Zf#-*9Hnkl)|dJ7bF|_!ecAQUdZan z7;smV1)>p@HsHk^;k+{;7i11>H~?f_&QA?@cm90@RA=o(ghD(2EC? z!TJ$C!d7`|U-p;9* zS_QHerA44{M&m$UJHET1`)&baV2#UM@xl&jg6kcSyO&H40umDSH!?4Q_n(&XFo*ELoGtMJv^TzY z>H;Isko|tpeGWaYQ$W+Ipw>fo%T&;SOTdfg#UQ`41Y|KncFVbgFT)Y(Y+Yjn%2885 zBSHN8L!sW_-`*1nGXpBr-2*l$@Wos-lm3Elvk~cRT>&y_D##>ILjptxboYV;K@}X> zdEH>!0$!X#*3!Heq=uo?JBvSyvAY-Kp1>C;z?qkWfB%J`7k9uGau5m#ix;0yf!bj^ z85kIPr*?pXBa5*c?5cnlKk`A|=LmqAZvoz+11Ttcz){5l2@3x0tzeh)Z|?;;Iq=22 zbg)in4-I5&zzZvgSXyT*h!0vL+6!U?z9@u9fE2_0Do3pAO~J0$`1}9=%f$~NyJiWF zvP=ezV=;n~UUyF`sC^pvg3ktCcY=1$^iHh-g#@w^aJqmspY_4V>Oca*8JyxkTS4JN zO$$y!nh2mO64VxkRIaWZ{M$hd@fVG0$bkd0Dd2@HL@ced6~yP?-V34vvlw55KqNqc z19pxt2V{inO%cQpP*#PGaA}?d6^^1%Wyf6_LFWWAybuBjgPgwu)JBHR=lZ;OeF8L3 z&cnami3wcTfIE0yGSJbX-aN4JU>Rt(2bWO2A%Ye`FXl6Vi!bnqH+V|l_X@O7yaFn~ zAZL#-SzoMG>kj2ywF=7F&m|1a_fx-ICi?7U(6*Ci*Kxf~qc40X3|Nno` zUdiX{To@+&{|`Rb=I%Nd2GER~gC+yR$#pIaph-9od+RzE2GHCuXs_h_buJ8`>0l7M zbDawVXi^Nc$Dw?k3j=664m7utw$6nCG;ReF4_fEK02=QE&B57#)USf&-LP`Ut#Z(i%d0GcBQtz=oV)`bBy(8*xKz%X;I z3j=6W5_F1c>sl8EP+_dV!oX0u)`bC7)PdN!Yh4&X1r>;$u-1hERQP~SF9`zKW&8g> zNZf6$3j=6K86<8AGT-X|f6!_J)3q)PpzZ>QEwk2z0W`P`+SAFp)`bBy01lcXc(ulb z0W_`+VqaS0!T_q%L2AydabW=Ea}fL38W#po-UqSwuW?}jWoZz5+Zq=JP#OlYH>`o| z^+;t%ttf~GZ3<;b1)bMp2%(@GM?vTF6oO6!N=q$@Ps=ZgPt8j$O0NXVqKLz{g)k(Q zrhybg6vh{4=B4MP#uqZAWEQ0+mt^MW#h0Zfmw-&FC;-_9k^pTmi7!q~E{;#FC_r$a zn^h4qAXh?oX%!5qIjL}VVpS%bjlS3!WF)#+S_MOH5qPz8QEFa(QEp;RW>q5CacPNQ z$AN8v=)^6bR>6QnJ06`-Pr-KJLIVR7K8S6(P(iR#v`|Z{K-yUY-cMVIE&x7f$vGz_ zEh*kJH!!tPGnVi(Fua)J1U{Oj)AdVp?HBj~HS>;uh9OyA&SC{!i2EWRrszhu z>z8id8=V}@wKw333!#d0Ss561fy+$SFKL|{wvt%5RKxeAFIFFD< zb@?17kl_gk>2B9AtUAmfBWEKC`hICVcm`}zD?}7jnYe!GYyzFD3p$;LBk+aw0nqva zj!xG%&9!eBKzC%ldC3hrF*EcF^wwB#bppQB&i4@F~3+PJbZr?Bb z+d~{vf?mwo1FoPz*U5Ey;RPp%i`!6U{@x9s6|w>^ z5*(mu<_gq~?$9fpA&nf(wO8PYBIXbz1w}AJFM7r@?GIXB6`f`9LI7so1(125Ip6Nk zFWoLp9NnQ8IzcxzUw|9S3N@CInSlYiFzXMp2GAlg!=K=&e?8$P=+tiT4E>WAItTy% z?{$3=(CzynFoPi~iRlGoe`UhMF*O$f6*2X766ABcoz4? zlLMe@N?hJ=59J1)2eEt~~<}j2{OeVf+O)BMA;;)a7BI z6o8m_p9YFRgBSB*=AS?gaL6=ycjyUln4f@KGZAV{FUZ$Cpridj_pyK`mA`aD^?-tX z*LQFrfT9j`3js?Y=)kPdKd|X@P{sxY3TR?J`-B8&@tg%j$4ig@|Np;y0BX{}gCY9_ z5BQGkueQ*TI07=)^++dp7906ivCsPJVP!k$KD}9VFb%P7Z1)wr` z0!VB3KF~Fy9NnQ`IwyjP0nl2u4lqLy%mm%Elh!Si))}btA|9mH^$n!S_hpL`&Nl>;iUAgeIJX&t>( zV&?Ca0Hst=#~PecQ5OM$N&{o$^av^dKnd%hH8>6M?+*ptul1wb_e*!kM2_PupnFpo zUPCsRVKEO8)z%klL0t;CZpg};W}7C45_4n=krJ~nrkxO7Fl#4*G=iKmr4f`ZgI-9( zbh!TM_Wg3a1uP6Y!wlqZP_^kZfg|w6S1Y(*x?R5ERX@bfgfZTG_jtCr~;{I z03~0LG2Omjnk^Yh#6kIhDd5E#s1n~V$3fA|0IETl0$xmo33EV%A@?Hv{|-qIppCsy z4BkIBgMon|EWCFwXfO3nHAFK3abO0@T6WOV=hl-Yg1eyCN$z-YZ8s>r^Mi9jTBqxd z7e_$?{M&s^KZM&OH<3!v<60X?OLqxB?zp8*d819->-T&MGZE>>b;O6zp}@xpyKcx+|6 zuSVdD+dA+rswsGs26PR(K+p?g@WOH)NS{j!bR5}hP`L&=WltmM#ZrVW@I8L6Jh1cW zLyv%#d$=BfmfuJC_xm1!x(a+C{Xx*;P*Bo708;0B09qp-;NKs5Uu4RZ(wXvfWg<1S6$bOau~ z05^nqKodW%M=}q9#&Vcl1VIBi2adaRfZ93?FZ6f)|NlY@M5yipjb`|O3SiLT^e@4; zw1X^3>-Jzt>+}VCI`jy1jmr`K{jNtq2LK83@8<$7aRD_5z?B==)2;`gfpdU=zwd$O zpN#yy1LsHYo&W#8a03yJJ3)So1^Lkcynrbblm>YMx_t!#U$BVrF*G0H>2%%GT)PKc z;_Z2PkCTDn%;mY5bhSx zrDXj3eNRAAS9b`L0C-QrnQosZ38GYS1im=c4jMlNZDc8v@r1+j-z6h?JK&2FD zB|myXJpoCm-7Xvg;I#s0x$}r0$$9C z0qcOxX>_`XUV&>p_>iGHg!e_zi|J6U;PU9;1BPxN)+>Q85+Pc_A#?B%1B%v*4@0|)Ixg^l6->eZAdpGWsS4jMfiK=c1VD~QNn<-f#ZC4}21E+$#YkaT z)o=u6$$=vXG^q@Zwdyudaudj6?hU;X)a!aB;Kj~qAQ7HU*BKypft>Lj?u-eLh5j=F zUOeswyS3AG26!oI%L}8eka5nbpe@)hR6sn?E~^sIRx`1!pmAvsGcfCXM)f{E4@B^F z9RwL9(%A}H^W5v(64*Tz#0u(moe}UN7JU2<4`}=mT%`1Z&EVf2Iw9!A#XyioSZK8b zz9@hQq;k$?YGkeQ%WjG*h`K=WCkiLfJ?NJobr0NEwPzrXZI z<~LAmF&BYmbPja8bd+?uOyhu7#I8pmCx$Y6L1ZCq47i>Ga0{WkXJQKj14E}zn*@rV z5ls$AmWAy^=HDK|71GTz^+MJR2Ivs?s&G&`gv^kD+8Cg8h~%~sK>Gyj7WGS{$yynd$Jhl``rr=0`E-{3;%;6nyb zLkr^UL(n$mC9Fn)=hDt}yD&<0x=fdVWTcA>;8@!Mvh3gk22d*tRy{!!KywZ@?H!n`Sf^?hM7#J8_Kx(0LCA*HeFkFGM*B^0VSOe`}FFpd9 zLjjH9&pqP8&;k{oa>RuJR6l^kdycp;q@?EM=Yq~|DguqN!%u>Q49f?Xf}|45(m|&^ zf<|&dL%L}d;6s_9eK!yV9^d6S?)n47Iqv!gLj3^s6ki0a18*wo1`i)}`u+j+d^mz$ zyj%_HpmTJ({s3+9`w{ShLlIUGvUa=vcpV2?y*?3iur{`_k3VUhE`oJ0o~-@5NAuzvHR4b+>URTJC6 zZD~;KfhO6vgIlR@JYjAEO{w1re6jmA$fGQ2ovt^)%eJ#YCqc=8#_x`^fQG^uUhD*! z2^xzA6=9(=paBHvXu^wmYySTS4>VtV$m}Zv8ZkJ|0=hJa;YAB*%W(LCG=5>%GyD+x z2$bIQq8zm0uLwlsuKE9e0@y3iV4P9S}O-JxHCpa+96Lr%T=0XnGT z#oN1}N*Z(=MDQ&TOQ6$rOK0c~&}c09+$?aAfQoBWQ$WS4E9gWEkkvsimcvcqg_*LZ zGjv0@E7UEZ&;wP1U^}~gzXXEKzW9h4bnUS#*ytC@a5GNcgt}x&XXpz4?V&eqLmAqn5!fBNB&gdJwE1;U z;0r#O?4Hih125G<2i1Yj`$_8zz49Umv{S+L47clr5>>cmwzol+!P=l#0$bgD+mwoybN*!Xo<2tL=QNHXJ2Gs1|@#qKcE90m#zdYcMiQ0 z1b0j`To)%q7dSV8(+4;=fpp~~bU_2i7q06vI955px+N06`&er>hJ&mA$3K}DHnzp;ZMMIMe~su>o+e}J%N;D zX%j#La48^p=y^{Cr(94Ek2nJ!Z*6=7+ISz{TidWx0a4_E`~P>qeU%&F((TG|*E67E z94v7HEOF#T?u!5aUu1xYWDpStA|gRV3do&cec;`Jt{yN+}^IRY?0$Pbv1gF@@$BKyTrr~-I$UjokV0-dg)oQGyEs7!>I+XvN# zW-h2egP5BORRA~F2ie@0YT!En4g_|G?g@I)cpa2)Kv{JI|8{UW0hP$O0FnS@sCU;u zERIgs2VfQ8{_qOWc&bRy3npiuq!0jisSff7Ba z79}x8K`V^FArIO>p9wuB5D}+B{$R&J;uNxj7*uN^$Lf1Oh!R+t{NfzAxPVqd7-l2l zbsJP8I9`#>M#Su7s1mr@MaX8q1fS3Q3e+a`-4WOwx+UnvB5=%uqIV7dcGool-7tyH zbD&5CMK3=@NvG=*unJIg`NE=C*%9m)P@KK^4r8APd=U*{r**m>K@4Ra3F>xz67a$v zd>te7WFg}$`3!?n@TE4Oy5~W_3k4+UI(}G8-gxn2F{ljGWny4>A-e>0T0c}DxZZdW z_~Hfl5<&s~{TEs<)hok|bv+W$?fWF~#YrS-{=R3R&M;_ve8Gzai~s-c^<5B{(NKKI zqZ@Q$ARqWZAkbXwj4U1g?XD*RUUWM^{Rz64H*`VJ3oVF1TBqv*aM3vBMZ{uIr#^$h z0puCq1)w>e89^_CAl9aJx=sKEoa=;u7w1J_4PDvet`|Tl^@Ysh|NnQ&gSWN$PIxHy#*9B>vu2WvTTlD|`gbW8Keg;qt`$8YG=DO3h2YkTb zl%N;A_E6V?w@#gh@lFJ0F=VB@Sbqiw0!O`j3aon{dg@J+L#o|SvknIlb09`P& z-E~U93rB?R?$Dl~7meT>B?LgjM_`XPyod+sVdUTL+Yj}aZ|=JB;`%~Rlb;{FP%f?0_0Ef9Ac2>qKS4E%@153@C4As&;L3}& zAPLaXyRJ7{50vmjhgE#9yqE%#;NKs5rS(#YNfv*%s|^2kj=&eOLNH&+W-)e$%79L2 zc%cFD4EQQm#urf_ov+0}>q%QLmGFUPS7ks4HadaCv-n|}F2haY1iSM!%WEcB2hik_ z3&V@1JK##a@d&7Pwtn;C(j8d64l1i`F1axLfY$4Ams}VYK>KtdmmqVgDVb&QsTj3A zxW0!SZ4c_&faY5X@o9ZtKHPlegV@jC?{?)-cID}G{nL$nGC$b)Aoru6x8MB6BfPhE z$4((oxeikGdG&GEE8qqOAE-Wa<>>A>0UC4ywW>I}nYuj$I(=`vcmyg8LA!XnIXZn` zym$;6651Zh1G*JDfsug$EdK(0n+<3K{fo<>JFwXJx4Yg5c)>0ROBI%&YnM3qw@-wu z6?!KClTZMS3UYw2uHXrJ;bsF)!ri`q(mEYkUNV4&PT0VW_7}V1TC}oQz`MRWKxPHL zSOk|4+yy$#x!d(mT4w;u%fq0x6Kwq3eQyN5sDrC9&tih?@ds%Rc##U1kOTFm1-qRT z0=j))1itWj1@3%zhyF?HbYgj32|95FD?TBjGw zi{+qUd^U)EFBm|pioWv0JgyG5kAJ(9R6w`yAMiO`FTPtLd;diS=%D>9hThOKLA|aI z;L1QD_9EcLEl49c-~}W2Oe2vjHt<}=M36;6FM8k>X=X9>x}FK>^?d-^m(Rc5DGhvI z-HX5%Ghim{mj#t~BH+A_rCAE{z<#GP>l3w!pjIkq`l6+)19b0*?}JVcmKPU5C)p`NVK{FA9x1ALZ)D@S(^c$FFde$aBEi6X}v6l_7skAdMuEy#%1hhMjV(g`#) ze*OV>fo8NGDA5IZZGT`HXzr?K0%&9uJO~InY1%~)Y7Qv(zc2-v0}ffpwSg}JUtEHP z1b<6Cs7?b7@Z$3%13-fxqQ80|P^bW=ua5S^$GiYbt~+ zkq&tA!y1%4Sh_*uWKBh83=A*aeuH}UKlrzIM3{ju5BtHt-6<>}%c$G;2mkhoAT>cR z1R;Zt0o|@Yz~{idP$&RJw*bVP9X1RMFaG_)Vh-rQg&+Le1H(X*UC3T?0__-p*Z|TU z)b09%b&Cxsd9x{iE}N6-biD#vTLxMLcje_VCI*I=TS4apbb^WoMtEw!X$kTUsA2U6 zTu*{S+xH7}T=@$qm4FVg1f7X^4HR*pxz!^tfob9;J9JOyM9?Z`(0n)SvO_tj9k*FOO-Ch34quoCEYy#g6o*mBE-;lFZe<|X0G`s6Mye=c=mzS4xPSlG7f;2 zi!y+6LFOUQ4uRet)(6x7{RhpWXC4Aw$IE;o@Wsz_px!JGT(R$$%!^>fEut^H!7bV! znHRx|4+Xq915upC1X|??%9tN|ryLXlAEf2_qnD>C@I@4|3Q&Ij(AzWN2YA)5Jwyt{ zJrFCv#|`l_FffB=aK3cAe(0TYVFnX;O#4SCPZKC9!W{+i0q8VIh@(J~-Ju_PdrqAI z>j?b;y`#0;_f2<5qX=l#28ij>D3aFg6_wWM5dsQ;Zr3;6J`+HDc7K4FArnN>x*cQE zI-SB^n1B8M{{`rL{BGYj{QCt#2K4d-bccR`T@kd528%VlVh$-f<(&w{$aArX+p(%lQnhoHXkk8alw zpem&sT>J;UsFZ^gn|}ZQ|9?3Nqms z9uY0i6i{yIozj~y{ojAkurT=2IuXzingFPI^5x=#?w;0;>Hq$NLhj4ON8K$`!M5;k z_x%E@mx5k!ef{^p`G`U%xb$q^3ob)JS3!dqFFA!77+yE-fDACSMu5s*2)j1~RPf#V z`2YWln;$_t%D{O^m63s=p_0|3`NThm)&r%|Sxnu&&;)ZBa!)~8XRF8bfB#>rXEA0m zb-R9mw7ix7!wqCUqA zG-~6)6!^lB8K%b&R3d`%F05S-c1E|$M3L?ekb3aN(NhCJAvgzgg#Bw1kdr{AFGn|| zc?@-Ow@;Hu_e78u@W4TRA1r7mw;Kj}Jp!x=M(2xtb zE&>JBhu)ShP#pmcD)1>R{M%bW3IbkeKrDvLTTBHdq@WjH-h-NrAVWa>m*${$F$cI^ z%)h-ABoy$%5uz=v6U+y-5`Dp01GSmNzrPohz(A`yL8ohj+MQshz7|UB1}6i^!~&QJ zbsf0EJq0Snm>|A{Rk{58!CD~^2kM&yzQ|#MMKaUtbr98PVbW|fk)fmt(hU31JEaj4 z3=sQ3N1pL-hkChC2OR#O5m0CdLqiTZ2EfDp+aH5M7<5g{mu_D)Gt;`kSrL44pFilV z{+FO@IbJ>m)k&cr(z?NcmDbrLz|6q#LJy>Xh>+6m|E4~ie0 zg#hajaZp$9^chfGffBLHq$N2C83kLD-A1_cNqV+%t3AsuWbYMQQRSpk$Mgx?b zL6rv181HUEOJ-BlF~hF`CUznanxR152`rw2)RK({K{+b$#ZK@%BIsmGPznX*5p$?P z;JzzIcMr4{2PcGXpNY^a6EYQek|C|Lh3kMg1H%i0m!L`dsW4MMszIDcgeeCfB20M& zI*fih+?3TsnUdDo1j>Lf)`B#H(;=3co_~L!UF#)Cy$vqJ0$%h&4%LK~0H7!cdht>f z>~3h$1Zp6)T0nDXFNgsdC;~HaC!hTuHqAf5IaCKJhl1FU96A+bQg%* z06;Zoo&@J?k)~dju7DRy?|^bPX!7(6sH@m=3SuGHJ-s3w{QJQ{lGfb|ifnM*X#5;B z33wCKu4o43*$~hu>RwReovl>2JCvh&7ii?0u>^EeK=Td|o266~G+sFowB&$)zmr90 zD`@NiRFHvaP$v*14LX8V22^~41VM*)fSU6`-L0TrU;wQ3+wIE13TpO)1OmIkBMLz; z7P^UnhI>E}i0#mRq!#WSRt5%8tqt}bs5%A*ERGiLDppW88x&7isw)2dPT-Q+kU&mO z>*h%71Q)k2emwFD4%a z#VBN@4>U*OXl+CC^+g8$?JWYJd>!yYUD*Is45oFqnt{w3BkIKin8X2s?TP*1w9z}I z0}^>+P>XSuY>=o<>juXUtSnsk7?dL&L1R4RhM6AB#o$^RR6G)LIYyX8U&Iw=7Zsr4 zbRgixQ5YLEix2L(1!aKBqZeyn5(L8xW-~t|?7F9bBMn@dU56})fyWzoFdk<{!%RBr zFh`IU44_3(Q#e3LC+I~8%n9Hq0+nZ=k`vTmJS7heh6_P2_QBZT1|ulE12Zmw)>SNp zNq}zC#+%>415uzAQ?OuQ0yzL23>VHrq5@a`?FKh8(z?MJEUgpVq_;Xk_cKn zpI?-j9$#FLnp{#;nj4>!pO+32%}psT!4w58VSr=s`g9xg^HV@wQSjtO=z|wh_x?ks zH@XEoL+`whzW4us#udc7qSDXL)&s1vEc;_y7MFKS9J7 z5b^%*|NmK_H4YB~UMPQnR*NO}pkZUg8V4@8gc@kZ9=^sQNg76Dq0g_T}K;9+(l-?RqER#k12WW|@N=7X)$~2V|ja z8(g0Qc#xfcJ9Lyi7cQX=8d?J#03j9F9r}kKG;;qUUkb(82X{afSRZKM2(%dELC_05 zxOQ96=q3mMcIaXZQMiN(*xYUpg~0C6J3%l0oPeySfUN9z(F-#2wH+uBLF>uxy@PtW zL>n|~h%oOcTtWzWamNc^kbcPa+}_X+pou#004r$i(Vd_d`yoy4fEUmHfHDwhX$0tW zGN|7R;bwxCMu2xKegKU|^KTDK3j#&eoq!j$FcX$QOaNzU@Qs_HPay5l&?n&gpg|YL z1eRGJs&xbxWf-IJp+A~`G1V$T)xt+TU4MXvJdZbm2HQX_?AIq>F98MrekT^xv1Q_y zK3IVco@omsx0?W%5 za53)s1EdN%CC>Ds?G~u!0Ub^92Q;Ms3S|$b7X@I^&>zqlaM0LHAj^xWTmS!Ofal34 z{DfKyIt~S9V7KduPVhW%b1mX1lyA2nmV?f00hj-vjc{1!ZTR<31WkOjUMkT6*CIG4 zZn`_b6Fdh6K%4E^kGq2Q-!OpE-4P;Ze8BmFf4c{0lKcZ`W(9fyRd*;j3}DkL-7Ju4 z6%W`X`44Ei11laJFi_7BRvIcY>1StA_!JCCb|3EzpIs@bn z$e*Bb?pDx}BgoPZ-#^VY9Xt#r1(47LZ3GDE;DId;Fa~)Uv_11rx64ExScqzV2PYd8 z9ml~*29yI)v;@5P^9`aHG~Ef_`Qy?AStJk-S}F$;4SI0{s>YS$ILHK0&1(JTh0_*D zK*FmgFasPu*w1e{?)n9!{YB?>NCgEhN;`djyr=*Pfc)Fd0h+=Bt;kade4)ezD$_VX z_kJ{iy6-OnLCRb?`1gC1w4SU}fVXErM=3H^z*BPwmq2IepVx|T0jx_oI$i%{F~j=% z3IU*rtv}s?3PCTpb3u((fft{zL0rkvEeJX+q?@BVkR|9v?ki{kUMkh?`U6y&c0-r? z1;b=Yw848IyL~wVU+6J_QYJ^I>le^ow=Y32bm6L4yIsG$W(J*EbA-qG&5JLaAfX8k zznZY{-r5%MdRXYHh~uuH`zRS+_(EKj)(u*D=lkb{E{G4>2;o!$N?9*tL404(%7(JE z&d@I}c&~w$B7@=_9NK{|YFjPq}I;t6=6BnnQj z;DaU|%U&G53YrxJFPBsZd@&UqIV|7{uAI_dECXxi-|xy3@WKmW189K;=z6uCpdlBA z5~1!;j>bbEcF+r#l)wL*kAN09fSWM5 zs}C=^I2k}2=Rm0hoLm|YfwrXty-1P;&3kfy{L0ZC2r=;jcrju|05}%FvEA*&0gAQ8 zgP;YWfiHS{!Ips?c7OqNNSgI^kYbR-SV2Wzz>6p!(Dr_oms4377_wMEhCpN75aura z7SKXD&_Z91v`)v87c;Ivk0XYJZP|K;4D&HVdAd4gVSf=g+3yK)4)Z~|YW&VmT%iEsrR z-L4;AE@H``@+-yw>avLXu{BXEX}dk3sS%Xsf?j;_1^Jxg#hOcqm}Y?64_buVj3rm-fzv)HrddJ374YJ&CpfrX zq=JkA-D<}Z_+sZ%Xh@Z4AXbjNP<{dv6#_>9DDMTn@cjvH7`#x0>IWr+O1OTIznXV| zvK=UMf}#z?4t%jZ0Tco(FBgF#f*IsJa0wjn!VadDzoiW<$G_i~C-6l$LU=K(?t+!& z%?HFl8Ls(YTHuTOCLrJNfO8wje?c$Sx`0HG;)n-k6eP3DvV!9%@WqpJpzwq$4E+%F z;xXL6;CTN6I)V_CtY;U2-Hu4syHFLLW`QS=2jKJyH4~IT`caiG0GSCY5a9^~RMG^# z_#pvGSfH8-sStuh`(JO6GdW&ty?}^zPPnPKqTL*vjUkbzi1ss)-ND+c4 z0tX%_a)VwJdcSk5h!2xUr|*?4P>KVu-+r+UrnN-0+xH5j8v$yyy>JCN@U?Jv z=#}H(6&|2$_`(1r*zJ0yc}IykX!fFYC1|zr0?>Gt>pO5Wr_;5g8+6osN9RP4lIGeD zct3dad2nF9Tn(E2X6Sak(%k`45}0KJ8BY52FN-~k10?RD6ZpbZ5?nb3yodp7<4EhC z;wCY3Dg*!aLjf;1_`s5&0og3ZETitwE8R{y0WUtv!G&L3<$aR|gsi!$ZGk)b-#Lh*zkxb7u2&H2qpyJ1M}xElf)16s z0`4`w;CBYMZMs9Rq;-PVKfQQ+_WyryV(9k0lGf>H_u>xdym@d8z#`TQ9tU>4zIOt9 z!Rtji__uqMff{T4+nq{4`MX;Xaxz-?L{MG8zpZH&7ieT>uOTRZOS}{SB?(4QDuY&@ zUmidcMM=w6{;DfLQlLj&ss$i{A_ZjQhgU*3XRha#XP zcqZt@whXX}PS-o&%W%Pc>uzYp(gnB4A7&Ff#HP>{LA|b9z`F!MV-0CRFV=B^%>hl; zgWL-8(~B;+O`sjvK5&~}+ry080XoH=0d&$&uj?F8V1RqrpiBvBJihRR8{j%8-~~6_ z0C1iH4H|U2z5pFO_Xo7f>kDYn7r0>=_~O7Zeum~FGLWJSROY?E4+}KbZr2Z>*5e1r z7*-0KE5nPx72s}8T=S6{>o+eJuYfct`Q;fvEsq?K3TQuvm)(`&4wU_$&6NSRcK17* zE5iY(_&YXNhAmL`Gd5R-6;SqFHdlr@Q1(?eSMb@~pkm_;n=3<6YH@s8QDQQfk&+6b z@e6K$7rulWa0tt?0f=m>`F ziw59ZqXbj}UkEJ*>wA3;bOt9!TIYlmP{HK`IvC#=;@hrEpkX|#Q~&?J2t5U^U$(mn z1ia|H14|WJ84NF&L8rn6zDT(X6BOMATCV|aicSC<@Dp^9eDe_&>o+gzmO&B;IHLoT2gnRa$K%V3D<}W|&jJMis0tJae4zrj&o~RT6R5ihl&J$=@W92T z!8r=N5eU3k@x@0rP+)`hMSKAbeT4pb5f5@1u0b5o_!8)fjvt_a1D!xrD$vc+*2&TZ z+D+;EC-B8WxOsnGA9`VY^8f!AdLUPVodeqC75JhK7F7H#Q$fRgj7V*pB$!;O1WGgC z3npHY3hq*Z`dOgW{K#uj!MkC;SYN2s)cY+oX zhrS5Pa4}+FcyWdaEC@Pd2YeO%i`{}C0hWL)PS7DOFV^sbxEuj57DE~dovt4;DrSRh z{}A-z{B>v|E)mHPILW{OI*{eXD@fVj>G}a|KsPw!fQ$SW?;}8lv4E<7{_VbR0yF;C zGcdfE32_1_&%Dru1P(|AxY&6U_~I8cNE2kOz8qBPe%~Kyoi4s7Ug-XX4h2B>BZZ(2 zRPpb3Dr-H!-{;H%T6EkC3Yx$SP||v#0x>DAvo!}aYq=d9Y(W_e3JeS{R={io&r$#2 z-yY(7A}E6)fq~&gFGA|YL`I0i;Eq}F2UJyp4;*2KE}jSBQII|Y25NgMc7dD`ciQxPIUOR`n%$_eIy!wnyx;-3kw1&Qdn(Afpe!-a%x3_sy&UkuM-S|&fESy2Aq@Wg z5ZAvD;)DovgIY?W)4*9FDB#8KUJwg(dV%2-5DPR|0!jyHxd-eJk&d7jry&(RT)IaT zlz%|;u%N4`bASK;587@5RvwDv?hw$fM@)CiLfZKOFQz~iI|sao2B%Y&fES;jQvCaS zK~Ws|A`oITXdg?^i;$^c#|8zwu!4J_U@}+?lyX5Q3xTpfB8P**sT;JvhYMoNF0k|? zhF(+;toen-1K?R&umQe2-69jgcfVhTgjP^MckhIU|NjSePX(1)K`*4i;sTwmAa3VW zkQ{i!45-?|jBQX{C*q201<-Mc{D@=+&X2Rf-UXe=8CxKYtm<#<7v;*X` zZ15$&kf?F}0`|BdJ2(M=J)V7vp%+r}fno}DHqU18rbI|Z4LYF^?9EQs4=-l@{Qp0T zA5=(zG7{);qz?fvMB%R3-3_uEV&j4x)$b!ebjpf4!#_3Ass6~5qt4;o*oa941{UEzpu1)li2 z4Jpxa#8>TiPG~tBJ0$c(TIUo;P&N7D zD`?;0%a$LI1_k!zgsuXhIn7=M1_lhrLvjQ-WHFN{j{E~w4LatwhZT~bL%)EINbBzH zfMkDABPQsD4me{71O>cMg0MQlt((rNAXP8JL2Vk;1nb=oP79z4yc?`2s2i*!;DsSv z<_7sG{z}jb z8;EZ}?E+Bt=HEUQI3H^(BH1fa=5a1)PzdoRcU&}hhypcmGV(}!n(m)gG2g|s&U zFcT~IY`qtVZ-TQw==u$C+JvPz%-jt*U(gvG9v~;aY=JpZ9^ynu zU?SI;U?(|QWbwbyf_NJ=divtrH+T?$6A+$S3lb2Jcm%l?QbA*uXD_Vau6@u9 z3kWfYYr!5wNg`iBjlPPHpnyO(8sw`MXyXuC_umJ59~2O+aHDs3f-HfgK9pntZV$+Q zgarh6Bmz_!q;-Qcb6RHys7LtX^#@RAhNBzYl}hUd7j0>s9iSfJi}N2q4hu!zgUi#+ z!Uc&akUt>q3wXiS4<1_rcl^Nf=AaWrTzR^A1R%kL@JqmpTYX@)-Qb0C&9D`7ka5Nv zQmzayUQPy&Gj{v_F+TeuX9{Sk9H<9v{pN-K6i7FoU!DPUHtho`SMV7Dpb`5NX;+35 z|Ns97jYWn@yE5#6vfZU!89>zyXhXY=v?~KB>Oks^rCk|7B@c+LA??bLl3Nj61;^kLZqJ0A{;L|#NpS)0c4{Ld0F9ctJT3(Pn7p|ZYt{jiC|jCeUe@pz9ldbhdy~8>l$~Il`{D zhZUqBoJz6}K{ovV==zuhS$;6>_Z zSQtD240*=5JlDwcLcM9E8!2(R+GnSY@!{~3o6A3W!fENZlAcX>8 z2Z3V&byNd%jvmNC{2&K``nmf-ClE|M(<{;l>hg7lw4MQL1s6i7n^bMVQPc~X0|XBX zJP3U8`4cz1IV|aKHw&KR|ZgUg4j#sA!P?h%@lc822gJa#BPyyWdM1Up@M;-Kpr$l zk(OGNnwOj!Uyxs(S`?q3l*LdGk8yu8`7oDzeI$b|>x_;?&{n6?A2YTq~3&q#}|7U<^lwT~r2%YEy->C;X{3h@< zXp({DWd(S0j|05+qcil$iX3 z1ijdK6gCRR(e3)+r6#Dt1zi#cJ`J%u^i9wU_FvYZ8Aym0&^p{UR4t$r?-BNN`@RW$ z@udWm|2cMXgXa5P-+)dcd*Sfv|NjiG>x&t>LB}jEg3PxBywC*a1kk~$FTj;Jc;y@F zG1=XrZ$L+PG#_BJK2e(v8sO*OFXDTmau&nEM@*n)Y2ChW(mF#NWnSC?@A(UT5d^tN zkbgUmD@a-3i_MVsC@8Tmo1t$y!Gp5ht`8v9-T_5dh8LfDK#8^ah=TQ-7jC_f)CoCb_k^M=!x!kB z*cC-rPAOJFacP~9z~Ti-f$Va{8hu=~5ig{kBQ-qu z_k;DdUMf+78wheP|9*<Mv|Q9(Vl#vI2Ct75LnJxWm)BU4Nu?Hi2U4_2f9nx%V|) zkdzEcTOb_T{ig8^XbL~PcdyR>|NnQIB2H06T)&pZ0xEiXL1&oGZU^NX(9yIU%|Dq- zWcl}pay0*9DG|wX%vf=MHbaKOgV_u(LbJiksd3ex-M#|+`vY055ApXpvw^ldg7%~c zq;-cl%A|FISD=6C_676h(mF#QytwxC|Nj>kpMvTyuu9NnqHIA~EH88+$Mb`Z692A3SQWenMa}}g1@C7@PK`v(}bcURr@*)^y#LHixBjG`9 zeo*df5rt|K1#8;{5(nk&9#)WeVD}VOka*CG6Z=8Mw?ONG5+zV1wx)p6At*_wb@qaG z^t`zK7<4`tXuIKS1!#7f3Q`1C4OX!gq+$a|1$cL9S|_%hO8onM!O;OK1NrxZO+fb= zs9lUM_Tt1onETYyy20AgI;VoHg=8?WdtVrXT%ZSX!D|ox{a|-@Lqa#G8xq*ywjH|I zi)^^zf@$5LX(X`L7f&96sx2!>e0=G473lSu-~vj{y(|;KUd+D8kk;J`3Wc;z9?)e2 z*c5^Gy>~;L+9|^EqW{tV|1Y{8fwEC6$o=RkgnvKSFX+NA#A`sUNrBE*(7kn?Q%%65 zejqk?D~MgH0BWT6hWPFPwez7!Hf|qiEtgyD?xfW0$!X0&-#Fx-CrQV;rjt} zia*Rs{_U+G69ZnDJ%g4b;O(d&X9c}bf{B4=`JnnibE7;?fiJ#7W*I>JgIj!|1$hn~HngYE(0bu1Ik2L>a zuM^K$4qDpR@NhOm#*c@y8D4x%0Xz34KWGc)yr2L7gNuc3SAn$737}@hizWB}|DOP@ zwegh&8^NhF^hf7ZQ0>><3MPBOWXRD8+#zSD@V9h;RxyGLuM?mP{-y+VyYNm3c#&8E zj`g%oaHN9DC9pf>=!Bpb5``dxKuK?2 zIf%s(081#~MdaBR8M<9WLFKXNguoZC!H1lJ6c<7jzlhKVjaKr^nAz#t(iz$Tw*{8k zPCN!h1^B8AP(=p4&utS-^gzIiWiU2qJx51Sw`)tlizbLg5Hnx2+yiw&GScio>vKB- zyF*)oUToM2D;J%z7&2x#f+pNM0=hw`fv3Wy)IkgT1o*c%fubegg%5c9AqS{-?`#AK zz4!&%DEL|()OkTDQ^inr8LW);rSU)5RTw3@t_&}H8bPh}c*x+?`9@HW64aWpe)D2d zBc!DR*~eL<3mJnFV_;yop$l2Z2D<&?kgh8ODF1=Ro%ZOuGJt9%koX#1aNiNyYs|?{ zPRwCQ1)pyB8ux=-vb?Cg1J0g*KylO!I+HiV(d0!4 zir^Pe-^%8NJ!rS$OS}KD82O>+%J5=WJt#(+k4RX*dBN8Jivv(~&Yuu^tG%{>S=Y4Obd?onYvn*BoixuArqZfB3f}pCTUG4GKNbt|DI^ z9OsXtuNP{313LO6ymxN}s9mCjt$hrRNN@uXW7J;4`a-P=xNrb1ALxRO#&x?0fCr{L z3SMyj2Q|KqfJ-p&CY~SvKx2moa4tLp8R-BqQigv&i&yIb&`C`o*MUMAbifIS4O$`% z8m9v_arw80ehGTP@Ep{%t>1IK3GDtM7d%`DE&<5=g-wiK(KyH1# zi+{VTL_iitukVJy7nW;5sSynn1vd>o7t7)>)usgiPSA?k^Z%!X=^^4ZA_RX9R*?tcD4e7G*JmmaqoAxB+*s zXhwqtBLn!t-)6WvFVH!Ep&~&qHXx~EC}(8o2CepthO1M`U;rHrv)y-2;ESUhp+Qgz zJ!A64VbDSxP=(!kpu`=X%D`j(;O;P};qAjH06IQkI}_qkTWkt~Ubx*gg)Ag+{Q_En z>kpcv^gRF`hwXK33F!5m5ZD`fBdFK)325j~B=E)5U{GkwfJOyEKfEvpxdl%G69E-& zy5O4E_XlYCt4dm@h{p?tKmY${FfcTLj(7ag9jed`Dy$4Zh24*CSA}k#3E(Yxs~}B~ zfER{uK-C&czzYs|xPgX$et>Iz@cl_VPA}H{2HlteF%+~(SD{;^vD?W6R35^u;0SyX z3N!T1Yp9`{VIf>12I>?*7tMn%WeR)|4l)!}m4f<&Qg=W)Kq>nJNC>pAgdIf)d{BW3 z|8^FyfEQ;sK;x}Mhkv{86VROJhoBeNZ^Mm%O+J4Jd~pyV`f@v{Uu6O6Aa;hnd2t=I zkOq{v-UPgO4OjIBWWBFM;ENmUVU~#TZx1~H$`o$`UK~Ow#M57uXnx6PeXv%7e|zW| zsK!o&#@A;-Y1&sL@I?vS4q=eBpi#v{ggXB1pekp(?}xw_-f)Gmlq&fPT)cJrYJjfE z;07;H3jG4QiqjLcLlJ+u7YZtYz;h)i<r^56wLn8RYi*G;v|9|ljw0MVq zyXyz=f&fr4o&~>F8@xh>5kAZo!X*H@;o*gy5vctr@NyC;AVCM(f$JoUX%7kOgSG0Q zR1IlEAo~qk3k7DpC<0mk`XFfUHR#*|P{;(n(7g#xso+Ys2_*Ew`v>xHA80xf?4@i_ zqg6nlyMqOMzG@&FXdZ!odk08Q;EQQ%p#fJC54Rk&6b;o!O(4B+(?Ifq5FY4aXD)&6 zE|7d$cYsG)XCNDNJ7y!uf*0Gq|NsAD<9ARx!+I1lc+Iwi^{HA_(6kCTFdLBr^SF}> zsQP?S2QuRIVbDH<{a~jpbfU@~5A#*FBq{?au+5Z7z z|FCdn*Z`fQePaRH^8pgSV*zO^gZ6w}v2X?7B?@Anv2X>=vl@ZgZzZ_}h9EkpAU-cY zvp6+AH?abRpH{(;=agAe9ABKA8lRa0$uH|!L_*7V{B?TG;IJ(~!cr3&hGJrM9Btq>e`ppwZ~An--_YFJo{gK8VlW(!dC zz32xW5dN|pv^A9lbm+#5z!x=8ogjYbji47Y5I(pv!*UZY|9;4-tX5cty8s%w3%vlH z_`JZs-}OTC56)U`&}He_7d4neIY2^S-boE+&?y_G7rH~5SUN>EzJQ!pegJfrJJ_#j zoj$GyUcCAOYL17V>2(POo!SIBW9JNJ&h4If1a#ca3oj+m7A(*h#2JW%&^*K0$-?zw z?H5ot?nT-YP&Q`a-w(R7d+Li9)4)r1KqW8O{k|8VBaavO_lI6+{>51fYGa@2^>GE= zAHc!Cy$KZ5pz;)I1;|gJHJKm-`M0}-g0Dw7(;d?LBIv~_@Y&{|6MoKgy7azyp#`$* z^(>ImUYJVIO3VYGLCZ7QCqSVBEfhGrc^E;}{~2^M%h1fc23}ng|L_0*-q0W770p{lIpj}lRS@+Ye5E+J^!_@dxn+DD=S7yWbvw!kYtRE+kI)_xoM|EenzbIsEl<{{5j_ zK-&2C`?wy^z8C}woa{py%&r`e$h*kd%_0!+Vm-Ps5ZRO9sJ-+FG-7B98k++h5a7Bc ztrHwgFIIj6-GvA)vb(^^eg;S-xQI&Y#CE+iBvIEUfj5Zo@1F?L1c?ENKSBI%m#Htn z2>=vzH^5QX?bG@q@I^E@Y6SSVUkG|}e>p7QiGcSK`JPGZ>;UP0AqsNB>o!QiW@GEh z@S?d8T(CjshFObL8Jdp-SigC3x)4&V@yj!S${iPw+W-ImgXVfy+d|4UP{AEe7B^@MHvfL#H{GFMx|=|SMK@1J z;0r78*bivBb_4(R&<&udeADgw1yY=Vmxg=X1*hIl*9Bm&YzWK}c~No^EC!C|9}sq0 zr|SwxO$mzP-Vom-pqvQ0lXgL1H|XZP2FQ#_074Nc@qq3I zfc7Xu6JMvx)Eh58fmYPKRDkZeam7Bn9a*h@EV;Du*f*>3R?NW04_Rqyoh}N|Nn~+5Md88 zgHSB=LHa#!x&2XZS(;R6fDj7lK|)gRs*&U6=H_ z?f~^kmjrf)&H?-J1?L~ICXguT>dOm3FU-NWbcl4iUU(S>TId4LZT$N~e2;*F2~-dt zVZNBw8QRecx)PBQB-riK3aS5~tv?X=#cIgv+kh8M*C5uscnR5;(COOH8#*PZ+qD6F z74eHEa4upAc(D?E& z{IpKjDg66gr?eiZHRs>%I|WofegNgD?L7e?a{^yvLUryB1zm2H)(JI#(VPE}jcZ`- zJNX$H7_`BgTW7ul8w|?ISqxx*f{tRF;s`P==tcEEL-1u&`@z?OrFFJ=fyBYLIzsXa z2mf}6SilQ^s7a`5UueAf|Nn(Dc!iPYAJ|x-fwL>ai@t1dp${3o70dy(W*vP+y@8A?)f z3*u85lJhg-QyD6f^NWf=6+nC{Ln2l-$|d*U_9w3Mjlf$PUqrtC|36~`r~p5|7QB+9 z)AdJl?GN~-{gu#lJ)jvEP%q_2T4y6@3i5@(Yfy}UC+R1EN~#zCU;Y2zeDXhd(6tNP zk$DR`>l<96fLEcR-Xhlgi=|c)w5kO(>;rCb{0MxpI}KdvyuJi#>HbLToB(R7y;urb zL&O4Fgz}^DASeO@UpPS&f)+8j{^)E1d7#_%4`hF4SQaGo>2rT%w=0LWD^Cqaw=YMh z@1NIf-Jv|4pbH28bU%eGf`Qh(APO{oOXB^Ijc-nHGJy7aT73Kee`gUBmZhI4dp*JH zCqM;!XXp=5(6>JM4!@(d*W(-FxKA6(Czyp@P#w@1{#&#sUX(}^|pfa27u~suopn3#+U3v z2E9G3Abo-S+oytD532mXWS;;T2l54yabMIyZdC#A_~74;VrVz$NSGGzRf|0Q+e1Zy zK;xERH^_5=H1R;!&7v*{G;jyy|8(U1p8?AMptu6%|8z(S1g!_OaCc<@IiG=pfnkHY zD+96m=po|1SdMFK{=vfE+YIWdfChaYfcu~ipncE>{QF%WH2+|# zP3-o4aquBi;0q0yJ)rL06VT;eJ{Le&a6RaDz0k=rvAOmF-14=cQ`V2Lyab)1!@u44 z1t{I1=m1?HWAPeP-YcvJ3!5HaAoJ1_F^UIaz{`< z*a_7AXs$iOQNr}v7~GWscT&8{UbOuNZG?hoD0xu<(a_BVR+HB0A@(8_Gy)55e}O~8 z^+{Uu0md}YMb-O#pEUpEs5JvEbcCEv`2l>FL~}Q2%^gRl>lM)W%9Vf@ljgu0grHMi zUcO{zV0gV1R6@Q1Wigg4jx4rbP%gdo5wutmboV1vVLaE4n5yyg2;} zG>Fa2zyN9E!;X=86Y%2WB~W~G1iY~L4T@2YwC*1088R1xUK}|NmgL|60X&1Z1C(B~ ze?ZQl0j0@M5(d_^MY02+7r0W|F}%_o>YcDufqseS0;5A6?G&~C;rh$)~|+<7ol zw!%#5ftqqL=!GN1lo{F|!0S*7LHE_XnA!Y@nfcJcA4~z@<|gQ%IMDcQ^AQfPB1az3 zyzP%5&_Ti7z8{(oDg?e*c^(vC0+5gny%O|7V>U`i*E2CNfXh5^)cHPvjx{{t-yiw} zRHgYs@`_+k79;4Wqc@Evl@ zt~~gW-RCm&pSxQf)sU&Gg44^V1jdC9@Z!0>v-OApXWSdJGeFmv{R0t0mQnd_cTmo69N+c-Bsb)JJ2EMPCA z9u(UQx;J(v#LE|!K)t*JWF{y&K|$%$;nMB816;1`U?}C!U;v%!911b|bs2an0_@+= z8)?ml7}GjKZ}9JTy#Xq)9I^~v)WFQ#f@UU2Q8&-T?$9lrB8|^C3Zr=}`9iVEx8+PO63SU=-7u<>9Dk!e`h>!J~7qN+uYG(pyCUt|aEBwyw zJ-(>xd_ipy5C+!=0?_$=#G3CHPrjk80cL&qAC&GvE7SOGTUqCCVyF;2xnr*rmO6tIw3`;*5bh3&I zIFo_a6M>eucKb{;0ry8(8k=nFO3~40^F+5jdV-FUK$gEIkt< z{n8gS6y*v!A9_FdUSyMi7j+ORxOXxuFg)THG}16{ZcN#5Y2Uz>lh)Y^g5K9(68P}-M=h0&j0 zpF^O^8M5Ee7Gn16Gq2Zzbz@Bx9JS&I-Jl}^p0|MNK9<*4K#hH-<_ZOd5^+#X2VIcf zd_W=K#o>#fQX4X%j@49_S}nM#%{5Ib3?&j-&=XbnyZ-6*X;KM%VV49dk~v-<1X~pF zqHh5>5W9Ujj)O83L-P><>o+fc#6mI|JpW*}rx2rQ;At7qVb423UBR?Y-&f#uq-mX@ zZ+38k=gVB*?F6+F(>i@`fX~uS>kPfMg9{>cXD2t9;d>7}q@30ndSVB}9M@AYU1wmr z&VidLX`QY+c0x?{-L(s1PUxN;5OZAjy?FKM|Nj?HLBs!M63f5pz+ujOF*popixk8JYr1+Ed0HoNpi3PEM*4&eqRC5>SE}QO7IRQ z7f|U5x;qAXR0XKL_Je=FOXv&8LOhu8iz`RL?TvsJ(Wk%+@NA$jM{mf*5O6Ci`y>PZ z{?aeqB3zv;n_jSe0-q$ZA2bZ+<9Y*BY=9>qz-JeLrqDp+B`;8gUoaj6n;h`s$4M{) zGIPt(>vJju92o~6L9E~r>}1*aVlimb<$mz7GQB<*ASyujtANT57VwNN|9&6e6JSTx z@^tg`cZ*B_O`2qb2TdPId6sNYVx04R8UZ5;_(k5ds;b05x<4LlAo( zIYS_06d-Yi5LbrejKsXC)S`Sa!@slyOdA!0DZ^q0@P0)DQAUOr&C!tkiWgq}`@hr2 z6-%cTnloB0-u(Ly%^bZ}Z~py<=8vg1Z~pyD2(KVFzc6saha4kTl+^ z15yJ?=Dm7v{(%RJrgDH3fbwoyXDb&-0jOb`*4fJgG6XVTJ(Uln1~fRI*4ZimQUl3h zy+R;05KE_ufYd-NZ50El0R>1}XRicE4J5Zsl>(`OI!5NrzyB}lL4&GQAfgmR6o80q z5RnEV5I8+*ZxK+2v#Lke`8&Dzs{XMRrAm-l> zHs|6aa60Sg^qG2xe|xAvP!`_{^Ieb(u^l|f3A!``rqpHXjer*&kU2;2?%gcD7o0HF zphE~;MFRLCF1h%yJEZqc(2FRD>X(+#k#VrIK|TVz7t*)}GocOw4=dO*f`%1B-uwga z-9vW)!iG?eZqRjI&&oj+h(K?z#~aX1w4hEt)VCKObo;d4351#r@+?QU&jgmh7n>nk zUfh2B|39QFbclg}e-A6j&eoHq(7p*o3}kBSNzfv;JFotMZvcPIb-WeC2Bkcx*}W}O z6F>_zy1IJMG;9B-9WMk#KvI}WC1-$K^kZQ{X6g==0a#WLpY>4 zYTcmWlz9TQYq56HXjl`LtUtqh<70+fGhK$=1M2gHEp9}ts&e=CRr=O13s zl*jg7kRH$|ShtfxH|PLP(5798!Tj5ML6!yfP6fFos2A+qfL>qla65Qqiwd}T0^XDr zsL&0%*MkW(Xa&+0)a!Z!bP6ZdO*Pgb{>cUbsmVxzke!-0_Rgu$wRDP%2EAt@F5e(JK7ha!jK{g92QV_ z9(=^q-O>y4koF;{4>}=ysJr?1gQMr*1Ey|>542A}Wneza2Kk7DlBYH)CLB!~e` zk{~Ak{#FnLPLhk5LAz4GN-sVHH%CAVBzt-x*@YDpDE#}Uf|Or;1g>a7r?^a+3eGW8 zctOz%7CrcYp||(KhyVXOd%$|YCV@^@Xg%@p|NqVwQIJZ=0ezqf5_C<|6kd?wApe3* z2i@;I<>SBqfncp*M}SQVd{LMH%4`B)-C#+`o+^-upgI7o`(gK#-kgvB{v+<_fH*Gb zg)u}oafyeCzqbH1_;3Jpmzw37j{(dqJGep4OPR|Nb}c1##d*E?1vJ21PD#F)(B?WywR6 zb$82Dkm7(BM_Is&XtG#d{GJRo8PpJiIdv+C(>bMA18g#g12?%EYH}IeWQb#WT0x2f zUt~i}ewp_VG~G89R3?I&1S*@r*&(g7^}?Hf|3SMgA-J~{)B=OWH|V1HH~;dkRL2g!QD&I;_E3JSBJUaI?{xy|DHM%D|Nr++1u;PvMuAlXyjZy%oHPTvdqGwOzIX{fqz80b)|@w>%m#KYH0^W? z?$BXiU^w`Ip|^+W2_pk!!78|?2li_>k0Aec5l7G^z((uA#)9_J^6v*1#Gu%A=~C(D z*abG@5kqf_Ajk}`kFqZ^AlwgLOr0hF;@vu^8K6o8;_eq+FtGyxFU~>OX`QVgKY?RT z<2AHrqwxCQ{}-~LU7He*|Nrl81xW-zH@>}K-3T(61vL8(nlpnMtq(B{?BwmeAm0bR z&;~D`0iC!7G7ws4fFlo7W4Lm3hfFYma1Sta^KkL+2d9E=7RGL#37x%1K%u?@v?Fu- zRFHX~vzI`0zzgLKAQy0Sw#vNz_rJRr6j_1YQ$d`d7v|8_6s-q9tuRnl*a9*q;1Ot( zBZ!HXqe+OBIcvezLcItIHBgxWqJv%-Amm=Cz}P1OyQhMj5%i*P2S_VR0JNF~C)`Gr zZl;}}*aV+WB!E9Q6_CvYg-p>;T5=70!;qjd==0Q?_< zk}rsflzd-p0Xd5!pt~1jM&JvrFCacB`L3ZP`4+DM83R7Ki+_7BB+$1{1>60C9U=F^ z8^Q)12nUKRP?K2%mIOIKNpKcu3+L1a;QR}6QR{({Ah4JIyn?3G53m0He^CrlmiGXZ zQbGKH-d>P=VDD6rAwj*ZAVWb5#X&9rMH$Gbpcl3;L9Uc|Ezo@8e_CfNNbL(v&~{N! zs_q4G17Ae02C3ml>uh}isyw$(1?7aG7fRr6Ckr%hW?wX54wZoBK+wv?$Dn%|w@(FG z8}#DaPLL5OY88;wZU?D_w5A}1E2t2L=7hBFR#3(P?`G`>s{@w>*%u{xTSP&HFw~s1 z?x`T>fj5ezgEn`*Tn*a$S@{bzQ<&D-`UDhOpwN8)3N6?B|Np;m04XD`5@X@-1uxII zl-3Du<$$V{R#0;V+RXwn`S*jHMEv`wf{W`@wYkuiHKJnS-w)Qrzn#Yk6bB$T1-*C) z*~03N{hr%PIw90 zR`>E4Xfh~NCaoKsVA497x_wpBx~GDyO6wGS!3(-+k^^+pBoAm0E@*t@MPvt(w#fci}!z0%pP44_UDh|Q7h$^dG0f=c~AS*{GA_9%$`Cd-up z)FK4c3lFng88qJh`wwDY%5r4@^^HJ!4`#VCfO@8Xf|z5o^tIWdIE`fqGn}S*{GA;Uy3|HOrL&GyYs2JH>@$#P`?rTYX11_s+KR|ZfH1+n!(>R~sQ%Wl0 zK_UzgE|`fd4pIr?gCs!g0+^W~pQIMSg+THMA*j750;nq7g5o_vF7wSy0h!?z1U{@Q z9?FHB)&-IP%{75AX#E)Uevxih4(Q#uB^=GQe;7;bUsr&xDq!Sjp1|;e`R4!s-Jv|k zomhNYCNRACas#xmN8mWa2N3TWi03PC+>ynkZ34rK>o-62Ri!cB_n8h5p*C>>!liF&`xL2Kv>|5Hb~>K`2k~hs0jaluI^9)&^Z*{t|DpO z9H5?3cc@5OC)ewp5PQ=R_JZfLb;5gVuYhOHz!Te_SA#~_dVOC6c83ZCz1aB=)cE27 zwIEzY0$yY-1{d_8&F7$^5yu@U{Jo%souK*Y){~{6Gr<3Vhs7s=4r(y~O&o!ip8Wys z#0qKr180L~n|DE)Cjl=MA&gGfA1~6bgK7`gF99F}LEQ$HE+`YUyD#8H8$@Zqi?^%5 zj_Y*&@iHAW9qlW_zh4lv2vY*o;OGWb1WceRzS~y@v>B1_I;d|6THOH-V$?&+nt$@} z_s#~7e1!gKy;N!mo;e3^0qYF?@!}EaDn?hCfNo!jK+xK5*Ejszc>*BJ7u`G)0$&(_ z15V&|C|>`bf;c(gg&~B|>H4D^+1NV>V{d?sy$N0*Ch*b+z7M}4&z0eYkpsBwZ$6@9 z{pLlh10-cl0F_4_AZh5l)#5xzxeqD_7v#Azq@*#Vq!~cgx`C1)c)tT^=}36*UQh+P z(+RQY4QY~A9z31Y%JCnuQt}VztXl^D?V$=mFRqnBtI!h7Ua+Eo-d>P%1A9aF1oeXA z5p;JrICX*U<7z%4@j3{nLYctsP>G-yO-!K0g%Z83Ad3QedqqGyBzr?!z~=S(?g6cG zhpa_>5e`0>PzJJl1+*xw^%8#zC?>N&Yn*tpPZ)HEa`d`zmB4zM%!dLXeYO(}y&=4N zf?jO3gp3j}@^5!l2zbE;_fG`K2wxuP#Xda(Ca^v)_$O znLJPe3l$;IVqMU-G?3$7bX@uWe*$QUr>{cbi`j5RI^CffL7=UH;Olg<7(ihMx`Gqo z{D2p>;PrYEuXVe9H3GXsRUj)kvlx4QTR>C6JlTf~x_vo%r!a!t8T5h=q8wxw$Xohw zyW~;4jX3@=vMg3}>nCRNuC z)C2*gC+jyaKG;GMC1_eurVw(b9w>btEp%nr^Z);U0|o|$U4@W6hamQbLRSV*ssXVV z6uL5iVjRStSm??CN_il?4TY`@pacP87ZgJ3UC{DQm(;@2#5_nH2d+Y40!WgedIDJv z#0NJgNAvrog~uyi-*7W0kkjR`UO;G`w9fU*ftkjET(n3!jDMPzR>)Ok-x7Q zw3LgHAGCEFa%hA#L@8)M;Kl!WFl|4wm_hUC-Jv3&`9W}U2Gv5KQ6NxB7Y4o&PXKh1 zSr+4q9rHojz*nw-H-^7BUIj0fK68hz37Pu7)TFm*P?&AOdy}nNZ zLAHSo1`_E8na;5SY+eBW_D~*ZRlxyXloJoWVnd|U^$z$Jc>!?Oo2AqB4!B~v@loD5l7m8Nkj2PE^!~)d*w}K=o=)Kr;N)Y>n_m;RaT!HSN*ir(? zLuH9YM&JfwSz;0FY-M=;0NSAz7T&uTbinscGeoLHR1n8qUp%-v1G4NB>*@?1{@y?) z(BLQNkOqNn&=I^Wp$A%LF=T!KErDk)eX&yov=n|XXu$vTQgDQRco7G=taAHQkZ910 z`?J9Q2PHeuX?UOz)IQk!gOR@vWCkelhrR)2xeoy^QXon}1AH$u=D@Ul0i}%4FWoIu zBmP5{?el<&%^$FIT?f9*MIf!S6;uvoF}}D9)(TD9V8MVFFY{n=4NBc#K(|JLQ}-9} zaR95&fubxHn#Nl}#}>SpehxHn2Vz1}`UjW;UdS#5IgJIB&`@1c0>1r5q_Y)tU{Uu} z5E=AB9^6%Cfe3<%1n}`}FD$^ugHCFL82<)t{JtePj2DF&4?YPCd^T3livy5+*9kr( zi+?-V@PKacVOgNj4v_nUy1@<#co71=bqN$wphS_y_+m3SZGuNs`L|C62?o8`p9>2q z@IHJ{e07H+rT8D+p)%bqt)RH*Wa)aX3@UO!XCZdGN_2{JfOeUImo2%XOp(1JBji6KsDr`kSIv|xk+ z22hBD*gwj#doXh50i47hxc1t0uMJ|DDK8?@D!ht%_stPj=`b$${V z`*o~cdFqMX--CYsQuCXf@ZQ=fJEai?%W>B&#>U3RFYf&VRj(V)o;kzw;u7d2qT{Zh zQ7nenoZYSunh!8`x;_A{lC$)Ez~5`c#K3Ue6?Cf|!;590Ie1Vr|H_MQuo0lk3mIPY zgM>i~$WFW{0Si9?55H7^gh2~;_q>ROSaJs>{+hEp^bY7W_)yR~Y!OS>JN&(%W9qVf zA0#mQa&(8@0gX*Tcsx+vi<-mWq}b{Dp%-+nC2!V58+rnK z5X6T7Gy|+527pQg&|z&af?j08G`;9`-4l?-fU1FiyYHUB?$9SeFC1a&o`BDF?{!@P zG6b|Q=}piJ6YybvJm6|x15zqHAl>}t>!LC6tIst^ItuF_uLIpE7% zp9HvbzJmQCz`y@O>!mvBZr4AZu3uhU`1AjN zTDR|tv`*hCFE)eDAbKs?9r~j)^vjE_U@6x*pxu)%W`LwXGo~9reFV@J%`X8j7Q;+D z(R#9uWdq}D_Ln>U{{L@u08%Jisdi;}ao-4BC^R3*v3~Qy$QV)#q)h-Vce_)Ks55hG zAnX4?c|V{A(v}6W-D)8Bs)E@1HHb4dBx+n4iZj#mGSf1X6Z4W&eNz*QON&yC;#08+ z8-lJx$V^KMF3klgC@m^-&d&(R56Le{%n8ZNO)Yl8Aqmj{EmvR^xPSM6iGcxBe=Gd` z|9>awv}kCzA5njIyK;1O@Ch(5bohSm4&~@-5&*GXKY@=3NaNo&QBVMMX4j#B7q8P{ zWjfn2*N=>^S&q4WWObh_%bf)DSl3>bKv3hq zd*TvRu)ZJQt#@1vpyg8gUB7^*5kR9GO%QqCAK4cZm_gS#d;txy^KWkjSrE_-c1Pfg zMDSfXBA_ZU`&2^j6yBV_pivUYMPyq*XJmqI=>V-T@qN=90y^wV@!kzEGM7Q2ziI5&^<_?@Js0JVT8B>b_*5A6@f2&A+CT;Vq>~u z&IE)jK#TP{U3j0owuY%c4skW8v_9SnO5GsGHtz+oSc;imv%NU0t;#UL_&|3rNGJ`Y z`9;@{|NmcM+4ST_Mcea8CMvy{=1L7vo>CwHt5r6;x z2QPXQjo?>z>C8F zAnQdsTT}jmW(9rz{{J7)-3#Ibc25O4Dd>gWb&wKBsU8IBlXSKwfRe>_h{O1|hu#T# zvAiFo3^tbuGAQtcGeiv3)CH;EKNTe0dZ|{2e|sy48PMGeGAQtc7Pw)@0WlYpr@<;; z7=unc>IPc|nwA7<0qym-ff&ob{X$R{;|o2=BvHVNtJA?QfEdyXv4DSjFIZRiRFFkM zS&TbCDF@tgke9D9f#3Fyt+SN}biU%r|7o4QE}&xt4ME$3V?abWhzJ4^z90g$H}!?{ zH_(#$H2!T*&4Y4cFT|3IK`*@FvMsAYvXI3v2Olu-Z}(w+0$GIy%AJs$697AF znt!{C=#v0gY0wRoeUS^Z_e9`}kBKnnhk~3x73BP&?pBcV2^ph?WXvkKF?`_E1PaTS z$3ad7c?40UG{MyIx2y!oGQw9GBRm2s?0Q&1K@Os zp&uIq1L(*!SDs!U0noWjpc)5K3h?g-E6qFrO8woXZ+czW1o-!t{>c88zBMWF#2BdI@6f~}1`1ga8W#&nkIX-+ab9#FWA*w(dKAJ$gDq27P z|No-l^Z);l9NgLJ@E6p!0%ypy&R!c(`c4F?@%jA!f7bsjMx53|@+PEi;om+Lq%)`+ zY+S$#eelT~0^k~Ab381xz`N8T3SaPcgEJQ>U3d3_+z|L;*EERGesE}Jo&tL(^i8i1 z7w8o9AK8}@dV2&RwuXYP^Liaju-xE>nso_mR_UAG5HWbrOfiC(Rr;lyr317VCJVG_ z2NswY!8-8OWEl($3=S{8PJ%ibT!(l2zUiGJ2&qya)idZkq!$98KvPZ}{M(v@1Q-}v z5Ae72fKC+zS%IE540?MQ8$g!`?+^WgJAoMVwirNEm4ccifoYvQpkuWm?G>KhDU2<= zkXjAYvCcke07_jwd=tQeARQu3X`Ld4FET#<|NkNxw9f{bs=7np^tN!p+z)DtKzzv$ z@nvVL38?1{YK$SW>*ZKj{F)-t3a)lYFUWvSo~9RnKY&I{@2hTNHSa);N}euP22g7S#AfMoWdJ1+5c^A~D?>_VQEGBYd~tGOPHGY8V6oKP z0#N4;bS@33HwQV5%r~_tJrz8O4dH|PazUVD5q%wl9YI4x5OJuwR0aqaO<5{@W&+Z~ zgUnA5d4CZ9epd>r@%TJXKf;9>L3i=ag!kP{9ecTnc{ zLQB0+&}jCL?ot8J05?n53$?eP3G)RnLDw=tFQ$2{42cVfv*9Gz{W0OawM%x2Bai=p zdZ`RA&bSQfsQ%r1l=yc(Jk2RBmlZT8?>pqo2k?F#EUtgvxt_z z0Sy~%0d)&r%mxW;0}&fR#2OF*lFwr22Tg*!kdB0wTl_6^K}UXq53VQyUEkn2?fdHCOYdk0;z`y_=D0<<#7G#$Q_}(qoAFLp?5G5eRASI25 zK#D>7171i#6!-dG4(tuRAJpsm8l*Pxg+K<#5P|N{A6>4mJDNa49NoS@xi_>2-XNk3bi5K1=&0NuY5dzfIKU$ij7{K}0kvITTn&SUO^FEqHs8ywCrfy` zLw_6t52G->=IVC+ajXF}q{8^(H|V~y*WOudkmNT9uF(RPazHT^@S+(mA>Zx$<5(le zbqsJb8DDIE`Tzfmbs)pC*ttIkGrk_HGe_(Q-N;JV&LEAy8xcjsV?v_CgfI5&$~~w6`cr0zLAk1j7O_7iyRY!Z46?prWD(QIK<>qGAY9&|Cpj zR2(4+cFu%n|Np<}1`%x_qVd`P{}a&M0p;?8Mgc*G5dIBC_#Ys1%b*Scnaxu{SxqE+Gfys{sNt@J3v`~2k5+hn7cW;U3a_`W@lh{?Fsb( z#3-l_(vWgcH|P=xZ)BrfcLcofg2xQls1s}q47jVZFZ|mf*S>*ny$4li*(YQ`$B{BY z?4AS)J@8K3FHb>n)(Y5xGCWMq@Z(7z*=0tbTf1ZDRhQ#@VqE_0&1a1A=`4?g@Xq))c+y^B==Gt zG)M%F3Q%Rxda0E2xa$&FLAL~ypt@bZbonmn@Zfr(_5{?k1J%Y~0$ycKhzv~)M ze|i(>l*W@FX>bzV^BQz8%O1#z?9e^@`(5{dR&J+dF=okUENEi{1@0d3(ykx9Jp!Pn z1ISeV?Jj};KrP-q*%uSKT|rWywggD3+hyXPfEN+3K_L$r*0|#bb$kgQXf!Ky%?l}z z^{<&;w?Z6MB7+<)vQ;3h;7I%Q5L6j~&U4O^0L@<<2UlWed|~Ek!lOD%;>FWSus%@0 zPXtFJSBE3pi}fHQUWU-Z;9aFoN}hwzxx!r9i&dvY0l5_HGJ-)@V5KyM3MIxfDw;}Acn!DZHJA24+LFp2PQp9slM&A`v=Y@JOM9K!3-8q&gcSr2|NXt*4YGd%8T-Qpqk%x z2W0B^!c13&7f(dMqX^AMVyxf1Fc*dNRr%#XV}lGgX1X%G{{R0!sPLDW<;rj$%I2Qs z%5WLV{xj2+A+y*qxui5PC!{>zC9?>09xdc*>VTru;?%qnhOGR|ywsH7(xkMa#N5EwAO>h%d0J;Lh{?ZyDu`0N zOd#{X1v^J?j{vA(4}1|m15_+=WJ!R|M+UnMWyUw?#Wy~X0v?z%(z+pbr*%#R-Dw2c z`qK(xKs^Ft^6&2jQSe!b{Vk#(*IJ+8?+syrw4lI24$=z_bVwxyWl=-+u8H0=uxbWoO^(wHCwnwxI|wMhc_xA%e+1-{r^432itL>$yS z6vd!ZgF(B_K~V?FB`sYbQ@T6mFo3fBGi77Qq0nIWfF{{`CV=GAy1`CJ>zoL(?1lbq z(8MIjK1`!PE&(Mt&{kEDC7FjlfY$f*up0dN{~tpTbe0-Skbgfor9wlHfBiwoFjOx~ zQ^1S4AFV)VLcTl>U9!`w0!>I$K@4aZf|&gKTR~Lw4+;L>d*FqKV5Q*r0F~sRD-?RX z?toKB532wuAtl}dg)7(~a72R&BwvoS?kR!yz{;jTlv&*Z?I8ed$_04~6o24|gys&A z7&II4?{^ge4WLGWtl!=X%9D^;D$uc4+aZ<)zTkF)m99Gc`=MzMWi0~OAF!QZXK#X< ztv#=u_>m0+PkXh9f_xG1LJDr6EG$2ybx#G^p4K^q7o_GzImi^SAG1#|fD$uEG_4by zr$HV9XI^Mx2IX`9{oq^=4m^-u`yqCL67x&&ehF|0WL^ZvaEmA?hM`(Oa|h7mmw5s# zJ%tw{4Ys43rwJD8@bm#n3efTew7!aeKdRvnX|Q`hhQIjD3QDRRK>;rknLsRoAkYS7 zP$ow&kwEDIeu44}Ww1U0Xn~V?5?p%qKufQ!Ahn$=A3H-nvb@LyZQyzN47?Tu96_0f zAc|QbMIAWBboSo)@&AA4R8SG#-3lhbBHa*?tsvQMmV?|b*H}v2VU}J5o6{l+F$bJL zyF*T}1a-5V2zc>`8RQ+vCd}pk)(ZdBQ z!J$s=WSRJ4&9(pkv##^Q+`8RYA~1{T1=|^TVfex;56V6e@WKwpJ^@<0&;aE@v*9W5 zu8|%taK8W&7@$o>FD$Qt8t$h-C(_LXt<1)-Z3g(@XAV%&`{GV6!nO+#Hu%`%#uy<6 zh8ORy{{KG#(h5mg06 z7mHjOK$!}}zP`wn0aVd|TDun(xiWxqHi&(4kt+iznSmNKyB4`JfC_EU{Kb|(t47=uN%}CUm_5OlheBxV793Z7fH?#U(%o4s$@q z&tEve#7mq(jgnCC)he!UAO)Z68_@b=&{+O{rxNQEpuu_2%_*cyb9|XO~ zD*?xDr|W~)M3O1ZFmWO9p7Xk)hZ34ERn(aAVyg4YFkOpC2fjh=AH! z*zSY}son2UVtuhTAJj4leFL(?XF>(M1?|Hq02*lxdZD`b_y6W2pxsVyK-D~G0>Sl0 zrxR!m%^Oe%xpY-Pz0>W}1=W9vq1#7LpgVx2Gtl5g$>sn5U*ul~rR*~3+I80#uX)nC zeP2Mz1Ygkck1rrDDzm=G-|GVEtuS?iF41B?2@VGS{k|_imi2Ujx=5XlEHC6PgT^dC zfw@ z93qS2XplwSJ`+Vc9SvS2f?V^m^#A|=(Az&BK%$lt(y|J8;Q;rJB+TnAV6TJg-Ly^* zp4a01`$Lf|21i_4XCTjuFBd^UJr}fF-Sq)ziUyikK`{&(x)*?MbNdq58~Oz_%hTNf z>fwW88*@_UNx+LQ;6qz9AZ5vdWv&b_ggC%u31l}&DhH(W0Iz9ZvCNg>3v~a-?PZYt zfuJ(t$}-5^aUk}YW#IeY;&by;z+0M=ia-?j{L1DxE};EMdv*#UChW2}Unp^d(lTgV z>kjxZ3fDKsUBMSpj|B*7eU?q?ogSa7kllXDWX&il<8#xUaW?R z@VB^w8czFtRa#G$xHZ@EFqAlCF@bN;dy!@f)mEYlPA+d=EV=OiKj?%zUyZ;Q9&lNH zXcs;7&5LHxZkcXZj(``Dp`d9WP}WdsJ;~qF#K^#q!N9}7@Zy6f_*f(8rr}Z{$Whi_ z7eRF{%gZn!2FQ&-;JI?tC9TarnfQAxK{YC9(fJopzH$8mEl0k9PG)Teokk9-ML}JV z&>xwHKnod|T|v{PU%-n#LAQ$i$UFfO2GwgWpv5k}P^lNL(K)PWQDB%{DN2_6!hXE1AbFLRRca#K=MH^y78C-TD9W9%D{lj6ocL= zTp;G=yv5e)*u2pAmGI`&?cO2Uyi^Rf3(4o4KCk5yr=_-gHsGR5>XdCfV#aF zy{=aRK;aBp$79g#3hE<*>i@tOi#LEqbwL+kTnT~{@(4Ng%zOP2;lUBy8ap5>H@92056Sz>|bqxwnU(7N+FIo1F;M= zb_iKlfzo$?EX#TkUIca#SOIFg3A};|s~u_Gp&!79u|$D3+_-|a&%6x#|Ns9>1JL5; z?XDj{_ci%JY)5L*$beM4g9s-OVS5%d`~GKWS;i4mxn_O*bVCZG*B+LecYyN6of3rVQapn!2wd-3WN zXg4%Vx2sOTi*>N5E^*C*+y(*~>T@;e<`LlE9_R*f?9Hv{jy;|P_72RkGe9Q3+zz_- zlNs#VaG0_DEuh=k5TlAF-7H-E`#n5B^#JI6pe#nv;sb%87o|`;7`tJvPKMe6b+ySU zP{Ia1|NJ)x!B7bc1&5a=^8R^6+nW zQVV$TEfK{-$4`P93!rNnvY2oga(D|YRA7c|L^Y)8BisWBvj*!LB=s+80Q7?k|~CEWmN57PJp~53~Cy)g5zj2%n|%8e?b)~s9?lW zNb~P^H2@8&RDpV=;G4Hix>>qlaR{0OfXCs+&5#g5#Nqq|NU%cVu;2tz95zE$BjT_S zsu~)HPGHrbGPE0%ASWOaqz8spGgPhYV9$c4M6;N%8NiNVz}I+)OQCijI}VCFG_5ZZ zOknYr1&%k+b@F>Q!8{F1imOnKsso%BwsaRXw65}>TnzsXIY@yI`uecV($wh zLpSL7hwpHQxPtBv2bBg>jA3pw0u>OxE|Ahd7H$VDUvWe2fX2z4W1s;p2T&yPZ+Ddl zc=0+891@_K0DOML?Ts)G!b~^`Q2{P!ozz~;0-5mQ$T4u)=qeNNA`BLcF8a>Fo4Suo^C<@?Ji7A0WU&~ zVBswUwgObHY=9W|S^%6nKu5dGgNT3@GC>RD9;gLSH^v?X6~=7f7MLPD3az?*6~OTa zZa=T|1vRO7K$ko5Z}&YD2rnTVpk_e>NDyS!3u};*S;39{3oti=>s3(H?1PDv2!L)G z>kj1zdhyE^WIV?UCXmJyP=|AS2dI(^e6hg*>PN&wywP80M@8M+s6GMnOc7!q6iI z5=qc7lsxkP|AZILN8kzY2He~@(71$7;EQ8$5g-2Tp$?!1rA0uuuMKFY-4Qj=X#OD> z_b`+Txt(i!s6kM-s|mP}h5Ixj1mshV*Y?ncat7RVP@4oYo3|5m$Q9&}Mh89y2G}&( zaTZW}`M`_P!{9cFLZ|DK7nz6u|9{bP80>sdvqKVYoEB(7fKJd0cDRTH|8`e{07&xC z33~DFCnzL%I$fVYTIisWkX5i)E2)Mq_j?lfVk%tFIEy7q0OA#afETuAybR4p1Ug+G zfU@d?z!zuW3OTx6AH2NC!ocv_FpD{h8?J>5UCT^VE%QKH^g)>vlrRJWUQ|kf?BGGz zk%6iqmxY1hMavUQM`c+vhH6bu~Q zz9Qh`KAf1+IvHOu9s2+Og)YcgR!};9aY!GW96`$#euDSsg{pv#t$7Q&ZVa&-^K>_8 zHzufw+2ML>CphC@WB?tl#F5r5BAC`0dIY?66SRD;!}l;qu@gs!>mg8q(H+Q=))~6z zMdv|Ke1eF25K#ppN?bwd~s|4|Nk#o4}h8` zpdJG9+Q@tzXz-U5LZv_!fmT^Sxggs>+!w9dFqQ7$Ztzt`u$7>ZxNTrJwH_$d1v?cK z<&2=NixUUK4$urYDCvO4?t(z>@C6Yb`$2^RtXz$<02#%B;`+4i5J6C41NUT6M?T;M zZ75H-5dVG_ChHTmRaqPvAF^gJpqK$VGbQuD6i|QAM^J$I1iWeK!)O7X>2`S04{0j| zyfCW=cg7)RpJD)A=qv=*nBr z9{%mVGN3;D8*r`#H^tvtg31N~P(E@!-2q1{@BjZ7%pl_5UQquJM0^1e@ArbI5+Q?j z5xZO&Uc`P;VTg!|k83{SV*TdD`Y$RBpgU6e*;KiFTP}Kk$C4Iub9aKGfgHM42E!qHin}56SlfW13kduf&*X_Lj|33?69cWg0uAR9OWUL?Zotbp73fPXt^+G07}PEdIAZ+CqV@ZvCdeIm#m zpuh%g7=x9pFHlQXP`L-WOKxIk>k-g?SBu@Cqwae_`atKzfcz2kA~+rF42VIX0m|MU z(K~-YGwh*XvM(htp8}cD$uhAUYzAn#-H*(RV0A4}bs9LCe?Ni%VKD=44?UaSL02}{6>P?!O}FkknGp7{oH5^CtYxU=*B{}`Ro%6y;FE0v56iu(UGvA`2snmz~L*%TfQGUS-Ox6hll?~ z$cYCZK=}p9aELs*;r}Ag4Bzn?o8gdP2QP*wLM>Ebl=&!PfRp;e|LIlAu6GRe*=` zSs|hj^Iqt~bTWW-!c2#`3lwCaS`$3T&kGTSnD^pq4b;v*??9V5x~GEZpcj6So=QL# zQ+F%K%zzg*P?7Flkm~|p%n1i;40tga!su-M@$UbB*p*{nKwI%Fw}Z9{w}RN9g$N)a zweA1^A8&o~?mzf)rx)tm|Nn2^3)09?BGcRZ=H37Qpd$<3{r?~IVs!`Df=;k%gzHy) z0Ef+o?p}~7psk^gwt+-I;SAa;_y8ONp&!z^TS3NwC*n731LXrfP!?bXWdXd!duuKQOeQ zI(iSwbf7*dc=iitrmIbZL_M+>VaH>G925BBwJ$ilKw|`0LJM^JV`UUX#r{xej)R0H zILE!1vlTR+()2PCG^q=!+rVRLsIynFx@``4ObxVUrWJG*8>n`E5d+c>_5;|T*eg!Z zj-@O?@UB(x4qogv2Ka_c`1V&U9jI1XbUfJR>_s2;2fnZlHrVz$>~#-+^1&+={RkkveE_&-X|76tME37Y||O3Bm|I zkP(ovH;(R}383vWsMgwo*R6t1_kvq{Yct4NkAMIF?*d&&p4K@v1JnrGycyh^NaKf0 zK!AE}pjG7WK?7yIQ$g3^f$o|BDGlfaJ1FqQ11(U?T?CvDa3+IVaZtMk)HP^f1TETT zc;N|h!0U^+v_Tqqpq_{IiCTG3?F_m@599#QG)N2h>>b7zEMP+pgHsaN?$965D(DBu zK3ElWk^{719ehh9|2EjUJ^Za}IiPc|;6#Yp!QkH(`VQ1G>*Qcy$oh}SBakxK6}(dw zlF2~(lcD7+I4!>LKLUzm&`8!3&?Ig4MNqnd=<@}q8|rtVe{9q?isxP=C~!vbVt;0v)Jki$4STW=s0z863x?VgRGC6^#( zKzA=lHtjkZZP21xW^F$z{pESnmmz0q;;;3}b^X^Z=;@wR1qtn%*g}sskKU zFRZ`^kbwf_0Vv9+9spVE3bq!+49Mt60S!=r+Nu8FqiR4`ZR~glZM$y)sTSV|8Xb-T zDQgAE1iUcy2D_xQbq&bh9Q@mRL1qQM*y{ln=La1ZBmd$*gqPOY3Ni*%y0$I=nRk2x z==?+wGZ1P!s16S;G`kNuZ6fpsxQ@cA3hAUL zNG5v)SuWGr+VT#E8k#JpE!K%;1K1|NnPS1(8AB zU|RxST=j$ctOk@cKwZcZP|~Pd2f9E8#0<(hpHaP!&m)VmyA|a7fEP^Qvx-DITXSGq zQb1a~!CFAfpl+~KKzA?5(7+c5!Moo<=`RA5Ubat#m3^_+Pw-@h*VVAIO@37q1?J(;wErM~KsIfK)&gD`WRm5FPYF7gq2DfWovDLAqA<=p>gjD-W3lDdmB)eX5`;K71S^Yda=g^ z9I~L0=ilB7Ht9tKL@ced6~qS}QUh*@Dh7j;vUIjufTC|dSQ0#CuMH|9L4rXqWCKBJ zIKV*w$`7EPH~7#FP{$E|vYPJ?Q0E4;b_ZYc=Qs;!K?lQ&pR51>fAMAY|Ns2Z90%I* z0k;8Py9l)3!{J3Iq_xx8ssV~RhVEWa)CG1=1#yF3WJ6>FUKp(bH&;7b6+oGLKd9Sb z02-)h;es3h1I=sQtsw0IFPsa&KJ9Fkc@NE|Apat}203wo^M7|Q$mqZq95AgCuwfbl zSgfjmVwD5rVdmBU|9AI-R0MWU1=$hw!T?q&$h-qpY9LJkh-}#l@=xH4Z1BZ-BAu-g zAVpI_1_pJ5IRV|hAdP`9EV@8W2PFm(P)u&03Nk4ui}A&JCy)f}+%u5Yz!%;Sv9!)s z5TAcL#6tsuPtFLEG@6Vf`teE#jdAmPA_|Md(EFE*?KhbXu)0a_gVqPGVcmY|cZ zSpr|kuL3pIqQC$D|5Ez<|NoG2J)3i`3@=(AfXDS9r_FLaRAFd50vffme)Hn=1Nayp zsH$-}=gI);Sc6JBjti~~pnfoj&3wU?0n}{;vHzWSWdOBOKwa@~=Uo{Tl5c!1nX544_IBBwlykl>t=ufy67%yE1^v zL6CUCc~=Hd`37RApLb;d6-OX;(s@?~P)-D~BS3C`_aA)kO3-;%22iAc#C^`Yf{&xF z0+W?svMjMEK8c|$vB(t0g)_kSu2_JDOL7a$K|`ZvFdjrvNp68LSOly;GcP4GIknh7 z%_p%aJ+-)mAv3oizo-OsIw$xfmWqP-;?mr()MTI3JkaXsGzJ7Wt%9Knbk=5C1w$p2 zu7J{2AkCE^q5?#~)v>H8OIjFBFWPB2| zS-Z0fEan3e1GU6lu`J02o$;~11EkLSVy$x)18DKg7tn5J&@x@$Ki#1}dRxHziUMAU zFoN#w73p;S0GinQ5cuM=2-JBc9Nn%TUN$o`Fua}*JHPkYGSGa<^8f!|`~k7PgNRSd zATx4bx>3-{&V-yc}gdI`QP+!emeI})Z8yeu4a>>p&avLjp^v@G101G)nD zg(ghA#2L58Irt$9vlYNAhQSwWR)Cfjce}m`co7b%@;hDMygmv#_ZPG%8nQ;c8?<;Y zPyjSTjdEAPW?+ zjR!$Hn*uXH8^~WsLL@-vI5atkfO_?yRP^I`gA0@ci*OGS28I{eOaK3Wkp?0Hmx7km zf|f)4U{w$Soe^Sx17ZaWC=P!#9yAaEZ5F$E9V`kq-vVmn3zemyF-g!~;Lb)Hkh#oD zL0ja19BYyRo%0Sp5CwD!3`4i?kK>J?V`4xP1266_`TzgL4G{5o3247wH|UH76%_`C zpck9K7v6GYNr29TX;A^WXFgmAbUert@L4n6a50cp7gdnfa;O-4H#Bd!2|*Jdf6F`2 zw$vm13=A(m%0lzri{{!F@Vw`}6q5HIfu=J-11R8pfPQlfORWNA_h9IsY|v4%FM6ji zg6D%@a6>}p_30g;Bc?#h={p<2n@~S3{{Meh3TV2^^+j6e1khgF7xxx}rZPa|SYTUF z4+;WpT{q2=;NS222ef23^hMB%dGVmt3DAv;u7AKcg}mr(0iQ4%@WSDmA!wfT^)_%; zf6)ov1N)j6bgW4OXoD^&DS(#JhyLiC2&x;pT|YD*kpS&~y#=Y0Amvve^gg8*1&jax zZ?5HF0OeSYW($T=)|c=RE-dZ^87;`aA6$-DAFP!IwBkkfHo5by|Die+ReuT z-8<2|6YQuGWw63-@Oi0$FSKRAu>ux5j^b>=pci~lNmmZg0g|B64HoM+FDh=roqq;2 zKlTQ6n2+!+74R9zBB17tHMR*d@EjOuLbapU8Z^QZxCoSDVP_$?T7txE7lCKRd_gNz z5oaP_=YuAv68>YYR`37+XM7>D2vnBxLbxn1SV7!wUyjaRP=yPcC2Rt%RPJas2ATSN z;s5_Hgh1B$a`11P2%bK>R3Zyn`?9SAJbiW&WU>+1?@$84N7!ahAF`tDA$1u0ksmqO+wh3XwU=> z=!9d)PzTatX^;fCfe4XFfGneiY}A5`Z12Qs7+4Q%p$ev^7YX3|2}Iy3Ko{KzLX3qB zcCKFlYJY*QD}N~rx;I(~eEce?`3pKQ<020J{)p?hMf4+wU1yURX1M2D>sL%lyHE zblB$&%^>Tl1756k2374G0WY>#ff%59!xvcuO@gj*08MLwM?asZfHZRiyoiGtmkKxT z33QALwECh2x|FFh|vbf6h|Axg3eY@^RpXFg3f(^68Itq+)0LBpyB!=;6*e{ z;6&gHc}u9f!p?xpvCdXd|DY4xJ%Dx+y1_yLFRq*ds{pmj!SUG(%Ez#t1WeKT!yrXG zK>;sJA<99ck8Wlu!}(bZ*VgocAXMv4*+<7*4flAfh9#IeQ6c}h`&j2#-nbye?_~PSS z(DAFF5QB!51GrO*6juLX0w)4rFhj<$0$ymH26>VLPgt!u308qWteOvj6oJBu6QUd? ztZsm(M?o$|%+$UJn2QotfiQoAw^w~Z*)oqDR+=z%7lK}#H9-z5ey9v`SRDY*=z(lT z4y&Vc;9&(m7y>d+ejj{#EI7bkJcf+k1-#&bL_JFQfIGDT(C+7pjuRlSgLct^5)uD) z@PdP&Zd66d2SJKJ;q&r1h{XXKwuet2UjWb5qD~*bFqi`gABcG`3=w{X6olA{$Sms@ zoG^7K0$;2(hKA1t&=uP6p*-a9u>em>qKD7Y*`SiI9<&QM7(}Q;k9xqqBm!KQfo6pz zc%bDVxPU{g8u+*Mf+`eHIrs*2Qa`Be11{ju7e-74)s~=g@BlYx@ZR+UZ0!wbQBrq{ zBk1I}w9Xb$2T)b_XBKG0-1h@`(;s-Wgd?rH$D>IIbfQBKM9qy^pxH!?PmtNfrBC0?{ zDTpWl5z!zb3`7Ki2pngftL4gKv&m*ch!T=kKW(I z3i2>$r{r`-28Ld+(?G*nKj8b)A;kiCUx-^AM=t-rK_pFS8CMfQOFX zfajUF_k#Qh8uIxBno{*x2ud^}ovolC>uu%v1iIP?k!D&%A$bZkeQW@}Uf>OQloe9G zgDslE3(4>xw}96}xV{0cbKu`T6=YaYH#iCcUff>*wFnd=y}h8Ig*q2f(6Pc3=OF`# zbHPRFKu6$uf{%176IU0c!BW_T7U5 zI_O0kOzc3w3oZjtAb?7bA0NT%UO-Af>s~~h7DK;Bz|CF z%D=r8qycUosLJV{3JTbu7t3K9KwMbZfKGh)`2T<4i<|mj<3MvJ-L0Si3V2Zl(*WXT zF+eSb8J7WG+5?)=dC?6{BXF19I|44+I$J+{1RY-Rv3jsT+Q@NSUPLFKb2L^))j6R9rWs0R%v@W4ALut8<& zY?$bQfGnmLZ^1PPII>?D!eqc@Z!v_I1{r4U1rN4@(kI9bFP=dbH$kifU3c~V|9?;l z0$CF9!UCcd5~H9Y(jZto-2-1m2a1U&;9U_f0yDA-rWd_92ARSSc(E4TE`!!JpaJD> zNGlO?_&LhLsTT*Qg8CxhRb&uT8epcR!%P9SLBOVfyB)nD$V1nlj1Oudf^O?Bn+l3} zP^1NQw}K)Kbm<5vv2{-crHr5#U%|B@YNWM-qB@|v7ZmU4EwQ6m)T2f+Ggt+INWQld z7Rf0GKr9YO3lk}l&*)%_;sblM{*y8haSnGHd){cM#!=;h?QxO z@%6OMsXCwj|9@dR1vFv}8lesVT{HnIPXb>gKq~Tp?x`RHf?foafZWCdDgJOp186`O z77gzwg9;RAaksq{WK+P4SK1&`z^;d-v=?mbZITJV)H zppp_kaRFT|szV&P{{b`^=>~G>wpLIN6f|X6&dk6-e)R~tTCH~~ zs8+^b#>1A0L)->mZ;3Q}NT51+5f53@6u`f|6=YpNcQ2^%5cq-}d|9AKXDf*N(&Im9 zk`NTPL7>?|P}~N*XfXl@5nRiWLJ*$^9LSI>3LwscXH`vT48T5717Um5dAw$6NQnnpL1i)D}>aDRAQd|1WGN{{KG#+<41A#E{kv zY2<*fKm;AN_y)SB;|=I~MsSKa_>h5r{}f(uQ|J(XFX+De-d2!t(3Lue_#1X&Q+Jr(4Kpck6pRSF`VU@w99Fhfgo zM9y6Xsk8%NTAt;D;sKO%!483xo>K%N4)F!Wr`HRk382VrHjA z7&KC0aSiJdpn38GI0Rlih4f}%im*ChWB>pE6F_m?da2YI+KcaYKWMxcWYkMV(3JpRKmY&#@+62j1v=VkTQ6vY3ba2K zbk_{1jZI)MWD0073CCav|F%|eU*Q7i#sE-r6g3(_i&4L1A4uqJVTE|2^aK3H04&|h z{h;obL2nN)#9O5w(z>A+S}gDT|Nq6LK2Vpa60|SF7qn%48+fb@R9tz2#%pklckyon z5B`CAJxVN~d;khW&_L;npg!ml7f{f>Faenko*n>qozU0+fky$YFVqJ2_JWjyTFD?E zAjJVVo+0rIT6F~RFm&JrT2#QAtr_6E^F%sZL2h|HiGSNvaKU?tzoiE?tAggyLFw?t zvflsyUrg+U4JLz~h@*E`Thlugqz6{^_D+F@C$unurk-wS5@dwr0TfBl+9!znL&57{ zUwntmnq%a|`QWQGU^y`pRL(*QK15EG(FJD~cutJT0r5d|yK}&;ZFnIHa&zE|vnn8I z)Iu~9A_mWI(DHNpRFDZlFS;O$D$+VzL43kds11oE1N7nuv=kL&0yr0`_J9Uuci~>% z1|L&A4vw-lu+kOOGhG5IT|amK|Nr7%Hz>+Lxd$9&I8qgV?{o$RhTdL~zQ8QdUS4cz z>qVk6G;F}*GqAHkAn}N@eE`w~fwTo6(Tx$KO9Q}WfnpSFYxh);4}xBt1>XoG(%A~) zzVyNtqh63ENdQcXRW`^dp3c@8s1XV__r)J2kSuD1&VYzPBNWuyfkf$x^AHJ0PY7gO zz>6A4+Z$p!I6A-~i7WA&gUV0HX)Mqbjy+_0L8gONCHr)NB6{6Rsek|fzuf;D)UP=k z&?~C&&XwWCf&<`5e(334N(Vu+{Gho9>o+f+9)L_qOaPskqw&s_0o1Vvg?rI^R|Zhu z8^kVn@5%t`9)s9yZD0I`kUyE1^X5Qwe%-jx9q`XIK*dshZf zUIv-Z``(oSRJMXT_bl&S89|Ph|j4vZpds#iue<#-}n= z#HTV;F;p^CfX`8d9zO<}?`eKh6W&|fvQr*$JP~3S6wdq(KCH1;3Y6JFc>pxc&ePH9 zGqvMIWCtk9&w=Z{AK>NVKcG8bPYYDzE7IXonPisfu3*N7u49!P4S`U=SfnDV?wWHJZLt3{l z_}b|g``Z8if3dP1Im+$_; zv%p7Jh8J`9g0lc*or}Ug6^7;`HP&xlJlhLN{%I3HhG=|rW$5_-|37FAipfV;hO)$* zQs{BGkoXe`3x}?lKv^zP^0xo~Un~L%w;-wA{n;F3&(X@Agi(uV44HEp$@bXZ(^rU zy9HA{QiQr+x%a=Z~6cK#VZi;6hvHT0i|Hjw6+XrhbL2W4TlIr zNn{3SlL^Q~ERIK7qxJ>d!g}!<()tFe&%P)FI!cxkv{SS@L{Oxc=MyN?bg&4%NNoW% z7M($bI=E#22-;5qs)xZD9`&3k$i-N-h4`bp)~7p^r@2app~MmDV9;%>29T@OAdM){ zS`ZPBpcfu+Cw|Gk$ky%4!yKpsDp@*MxL%xT24(I!FUvvmnV|FiLqCD1c(1&NCFd{# z?ob339H2-5`Ms2*Yl;|XS${_eBlnAZu;Ir++sS=7y1+YJI|7tnM1X`}G&O^Umq2?8 zK7xi5UVMVt$lr1lv}z%g1L-2W&7f94s7VdZMyTr+Kv(vH+SC0E3=H66C#@6PwZP3k zS!%Pug)F$nMxSjB{cL>-bTbtqIe`4t?ZP3_%X0y2Ea+I>{h=u7zB@!rq*vq@=sLwN z7RC-1qZc(zpzvJqy76V`|Ns9%8*N3b-@I_!2`Qhz_p>*?v0#Rr$9>|@|NlEd$L@ej zBjoeAkGZ~JIOh72;h5`VhGVXe7+$C}{r~?$9z;li2+=0+?u<^?AE1&5bYVvz2RPo& zNPLcf4jwY`JIt^~Ns$iB#M%tiDCT|-xywmp(!rS<=^M}t@(#UZOV(R z#{d5_KzGc541;CCAK*Qr`$E5icduCwhS)o@*=zTcXE zO7Qm@ppnU8e+>nz|dX#1AN)%zS8fI%Rcv&euH#)5nHK{b;I@r>w!|PW3FEqUz`KU9&>%jc+B-Xa}c!N1M*JNRlZ&}kn(f?n7Mf|djcbhthQrzqF&;DXFk44TruzsLib z^LiWqw$O*ozZgr|Kv@}dqxmDo7r}LqEV<3~5m?vfSI{It^dFo4Us27OU^*a>c#t7(D}E>NV2+XVU2|J2X1|2_gX@^X?FJI+?+=2>r18Ao5MYJ{8e<)^L0k159 znej3RR8A>?!Uc3Z&WC{BUXX&o-l-tFf?jaef+iRRI$R%v0v49OCcl8i3rBY-&oL&3 z*KFOcJfI@}WHqRs5a~8Kz&Y7^=19$Md2n$ zr3OCpbq+`|^vu@}e_Rn?NNq&4ueo10Zd=cn| zO3-3vP^T@wG%qDSIX?q(uLVdnC9^0jF()$x)(HdO=cod%FFRfDbhbsA_zZ#=i|(HEt9Fhir%IYf!BFVrfZ$lf_HePIhq940RhJI4K;492*N-B-!oy zrng5RfDg1TA@m1q14c&`=m=`a((9Tkydy5IudOfCT7a6=u$m6mQU372k>|dWc_aA8&KgG-n+Nt|Ns9xl|jQ4pwSZK<}5hry?7B{ z{{KHX?{&NgDF@||C*YCq2#_!+jXZc^3vwP4fJnAtrq^sQ_N`Q5m|%Redn!mM zt>K%0SAXCNC$4~S@?VHKx4eF z4RektFuag1gA4(+g6=MU@wXH-Y19j12X==xfCk+`9^~H+@gR)f4GD&z7jMCr#R<%4 zJx~YA|KJO7Te`qOqQEr-w^<^^u={> zs%8mzu?|w3gF2g?F1;sSA=B%ft}8%8!l4U-UhLL!8{ZXyFV;iW z&vm-4c(JAA|Njj6*4K>Pp(}!3Ytw3)ADG7MN4iyBcWqOebY4HTSNPsfBL3Rftte6Js_<{yYvkyVe1WxPpVV&^e zV=<`E18tw*-UQkr5%8k_0n}L~#u*de*06&rNRIA_AWMT@OoDWT0$%(S2Ky4Un!FJt z^kQ$Y@Zvzx|NmJW84N6-1KZF1|KAHbgqjbW7D~mz4i9+I!wX_S zmV|ED1KR%}0-J|U>vZ9r@S?it|9{AhZ=eG)d0}4RZ*c?FggAzLKqZ@D79Xfp9`HgE z;v>)m_K)t6-V;GDzC&6rpcD_zM(QA6yxs-&B>27@7tslwt)Sw!8C(dn@V7UEhERGz zLjP5IcW}5tj+TG%;!Yu?xNz-waj_5-tyN&>r*-kRF95eky#-|zaO^+25g_~^+jmW&f&GZ=b9Hw0xd^n&h@HoOB0UJ0<37au}GR~DoX zJc!fsLa-2&zQGG3L7njJA-ofUz{ev>#DLcF@PKlyZ%g2dogAPj<4EgtZF#{9)&mYW z&~VOnAJz$hFDmXrvju<4Oweu}0S9Q=;C~M;(E!TE%wWqvV*+4}-Jv`|FIGoGEMw;1 z?%ERY!Utg)Bo%-TN@a(cQ)0uvKeVIuQk@C^cGr#osMq)rPLG9{#=qUS19Wm+OVEqo z>~Pnob-T7e_Iw&}xG}t#xC~Tb$3w=#MV5nF=Aeq$`pt{$%OKS^zdQrz!chwjH--<; z`g<#f8^ekJ|Nn#HWd(;D!v-jO35OfQ0;rma9BvE~{{R0Ex(B9&!;K*)Ej1)R1k_r0 z%}XsxuLRGuctUnKGUR0Dr6v~nxVa{lr4}Wor-Eiq3dEW0=6^25!=W@2B&Cj)(04jfY*r)_?$)pP=nKo#4I>c(}HUqXRTf&(qD+ z<-ye9`-y*hs6r5EJn=KAZTBK6AJh#3Edaal=l}l~kMltDpLw7p1G@O~Gq|@|cN-qT zk658gmB9@U)Mh_ygmEXRmIimmL zr-DTI_q!@sU#N}i?FDHDw_`wS+rb{|odUjWfqy^P5b$anP_34ID1o^Z)Q#fb4>k$Z zQv@wC`t$!kXvGld#))#4=zGpy_T%l(mJ?+pl{QF(cfUN_sz#lX95X@UpbUS3 zf4lF6K)A&Fi69Bkn$A+ljeMQ1H^3^uH46XsCeWox0WUgOKp_cUWb>j1#=a1gW&dIy zgqPOodgXYl%HRK>nF0n-Q?2z2C>`|Y{Qv)=DhHGfKx5S>!2Ub|_2&ux{jMkY_xnm% zAFTD{-yeG7c*|4)s1YD3P%@?MaYOT4#^w6Oc6;AZvs{*1Vn% zvK;HVY~V!3-@6Rdx9SDC4o5J+`N~>tP#YOE$}ts`ZhKp}KqRdA=tg znZ_4n7AV*xKtolGpw<~A%XCi#xd+skJ<;9M3JS!)7tY|#{-B-|^bo#oh{Ziz4xnS_ zK;>QbB?j>Jm=mBb;o~e&OBv!n{{6lu__t5-1%+B#JQ7iyn#s^x32AbYOxB-5C^GSwI7OodNGeIE*@h|^&*DC=p zwlhN9zx@PgT{_6zpclaqv9!)s5FZpmU`D`;E{FuEOvYCfb&GHXy^sU9uE57rfv(Vm z7FmLbqyur0dL}5@XyP*tR`$d4@!IR@*flpFQ#Yw|No*1WE1{G49fSuCyuxDf|4xA2v9L_@loeg zP{r507eqqxec5bKzCY023ld7}Y~cl^%oheAYotNeyq*uvec-Cf6@9gU3TRBl3zS>n zsrv_L%o3I;K?x2t@&O*R1SQ(+iwVr&%mSXp16`T8eJaRbphfzB|Njqo;SOG|2+Q|) zi#Gn=)1c94&`MwM9uruqVg#jZkogB6urOZ$Ww>sUE>I2zPfmj)8ssK$_Lu=#HQfoW zX(0|YfM+Qb*Jm-lxcyHLw1NSeGeHLTLNhX21qljk{_QQHpr8b`txt4M0mnnoiwy9+ ze4y^mR6021k0S_Abzx0?^U;U>8F-VS~H{xj@t5MGsgb zXh;-1&;c&bLa|f<{Jo%^v%Qd9)eSCCQ5{tb-s8`+6Xah|Jq)!FTta|G>JC0+K@<>T zY2YjhjxlvN?c>Wljj36SC)V0%w6KuggU za48D2_aG=NyICd#yvXGQmjuMQvLF={sBgdn;-O!_ZE4V27FW<6r~!~xLiuJ+T99p$N{Q5u* z3U~|TWew;A=upr-Zg&D+G)@3XVrhnCbb=&6&5(EfAQlJqW(eaSa5RAm&KF;QL)qYF zh&eQ23IVkAws$J1pbqK==du8>;{V|7 zyF8FYehL=%J>aSvlsiH7=IUfnQiIv*dnNG2N`%|^w?hkkSBMx=ZO{v{E$~GRL;{?| zzP7ivP(7dqaql4pL|Fq?bvwDPYIpF>^7F->{c`Xb3-dAl{iP?mdAd4zHoVXU+4_3IOGi-2beS1?Y9Tn~qtye@ zwMFYeYCxk7;F=9>!RLOkLqLtIEns(nE+s>%3Yu-27)rGu1#kkq00vdYpu_-~3vhTb zD-jg9d0+!vzkqWtsJsIA8=!kLA^nCg;9Q94H$ZZ=kLZgR?uq~Zzi>)K%GIGDL&554 z&~KR01+76%s0Ba);RGfpd(T#XemWEVC zkOtnh?{J^+Z-yNLd=1*H=O$K;;y+78$5K2W|Fz;m8bf33%@rXs!d?;^;*! zT>Roe8Cn%v*8$|%?qu_Tqf(|Nk#e#ln1!rx;OUX8`wev351L zxqb$fAx~iwr{EC8-ssswWaF^eri-CQ7nGbJTa^(-JG7jE7oCkZU7#V1I`Iq#VFreb z1CM7jWEeb|&G15~R10)E4bC|8{Q{3Ia8qUyI2nT$s($I6a`phYmEwCMt&_#;#qt)#$9rzc25oUqzN(FUKz#~g9u0(@3_xOVR3NhMMgMUAd6X@b&&!Hg*>2Kfg`7gzy!1mQ*CXGoy|a&HgRz2E^a&<+NWHdjzEKr9Q@0QWv# znZ$E+UNb7{!>nZ_i`hZ5&0$*%A4h^>weo*fS ztmDO-C{WaaPHTY=AtF*$Zx5pb2YBxO%fUx1%%=iDo2NiM9)8fh-k?ej8t?%xrhtzX z7kK#}Gyrov3Uqr4Ska5s$Dp?Ix72`_e?e}LodR(vcwAsR=+anWnCtjkLO|=cAkz+0 zK^gLeJIIlsxWSjbBoPq~syZ+$WN_b!2Vu=)a9%?SSXYU(ZXc(AX`SF&0?B)@N*k1H zdV9d>mVbY#L|V6qKw4)=;XhCj-rI8&6m^I?8C)%-b&4>)=!pFP|3x#1r~?rzBOw#3 ztp`d~`1gbDYCTyh364cju@m${{Ua_sQUgdeRZ>r#-4 zcxdi_eFWxrcd&2383)u!Mk#K<7j*SbH2{?`{M%iB1n_V3{S2BhkO=B+1;taqi$_7A zl1AmVD?cdxflkZ|{Q+7m0&Pe`jt>J}3)kBVG6tmiM-cxu*UzBSVk824r-FF3?mC&+CKy`@vNZXqOzQ4+3sKgIlI(V=mB^I4D-3 z(SzxDP^ttsEF|DTRswYa$myV=*0k;rkAG>M;G_ytj+ThQs;5AUDo}c7VNC0EDf)-x zc33Ypts9&U(?A1aGs6D=e=!+E^o4;+7x22#Lq9-`C|?~=IBEp-y6y=`1H}nw`6noW zgDZ4M6vA%u0*}YAf(jr=h`;#o!+@drhytka!acCc-^&HMA_lZd{{;VbAJ;vBFMb?^ zCK>(~Z$<`&7aC#z|7ToZ3@+GCbi0al^GxUt3;ATsQ;La#Zz>A4+?V{i-0zubB z_Bw!D&M!eHe1UHX1WkukKm@Z`dqX>ddR?ak^!hFc>x z>V00E4f+57#fcD5tb*?N&0_6!?Fi`gof6m^x*(|6bq!cA)WZF)@Ze+ti-Sx8g%wBO zi>r=EP7FQ4zuhHt4=9$mfUh}xQDzSg7SK=)#9uHLOJlbeN2f;s%*i~U4Y=T72RWXl z)5+(B7RZUJU?<)JW&du_{xAm>H-;AtUEm2p=vqCdZqSS%Xll*+&5NU5kQu=Vd<+Z> z9w5d4|NjTg#J`kj)K-G<53UqETMb!_@Uy)02<;3iGNUWWAKSD$t{3y^@`6d&W+E^OFMdkS=LZwjvis0qCvI!XXO@*6a}2p!*R0ZYHI3Iv^h5ePb>$pYjr z&{f-Jf#?S${RiJQX7d04|JOok-Mt_NWYP%Cz+^McoBkPPsXg7 zGbKUG_a=f4m<@VS23ZLOUi1SJc_Hc#&QfXJO&%hklfGJgK-)Op`+-(AbMSAU2%6Xh zozC<38QA$CuXOwN1VR=^fwTl<$-j62lRN>E=msBV8}Q;(IB3{HfPepq)|0h1pk+#~ zJ)K}V{_S9&gA~K(j(s3zfYu##Hi8U(QRVml|BF;V&~Cs`4*u<62ZA~+AQuL{u-OI8 zl8{T~`L|C6i3fofHgGyN?%w*#a{@$0|x~-3_4+TMZ{!`<@26=WfJ zR=ykJc!bq2UiyL)RzSwAnKL6_WWx-51j)1rGZ=lrX`*=-D8Lv>3bGh_!D|--5N3e` z4dk-G7tG*;0eAvlL_v)2bZyCE$N()nj|%chvE3hpe9L4s8i~kpwY$M(Y9o z-esT*TetakH@{>=9;$xD2pZ@Dl|iis_nRGdrh(^V8MVF9Od8wC9ShH0#x5@?*&nTXo?=^ zgA{?vpUg54i=(qO0ZBDD?ZI<(*&}GEod|r91!IFpcGp07X`QVxVBO$=3h3?y#Q z93%?5D!>Gy4ixU)y`b<3%wp=E3bHZig~WTX=>ae1^Mi^Sj(`_o;Hx9R%W^>*u0flz zKfF-%0wpWfmmmIu>c#+A-6#bT2Bkn;n;z@HlHfW8W7A`|^{LuO^!kmbDG+k==^+Nt zo=!nfRAin6?G)|~VG;n%I=cSo_Gz*ReDMylkRhOZD#$rOFZR6z`=qlK#C_fWG8eQy zy0(X*#J?9BFrY#gs(2#!Fd`m^Vpv)QjS@i8^b5v^V8cM=-ixmfz-(wje64sKYy&9o z?Er1Vhl;=8^90?0>H)5ZAf`ZFmc@v2wJPWY;mk{5AGvS{Fdsrrz5y?8fR7h}=5c;V z^NR7sB9O7Kc_Cbe7n4!BEg&xcwyB_|7-;k3Vs-`w=p5yQ7wsTPJU!@c(D11zJLotV z&>$nIwRgN#1scJ}TR~fWAYwdFu@|Zy|Np;G01?t4LJVvHzQ&s}69YrW7gR!axGh=3cx0?H%cnGcjajvhB( zkmCk4l-?cEVG;DA0b*ch>l4sUJ}?QYNI`}MzDNe2^$K2?%fG!9noCH^cP4068NRtQX`W(5ajML8opOL8|@E zR#1}Y23rAI?*l6CUxdNrK#8P#D#!@X8G!#mi#4oZa-d`b3cT!#h`?s)0JZ;ME!FxW zP{{{tsUG<9o=5HG@E%1#8n_~OEkq`*v-JmPH5ix#9g+ACba3Ye=pF~K zt^C`kf|Nj8lA!i)V3yL0zX;P_e1x$>~WeE_>9TTlSJlQsJkL#GQL2gn#mhJYAj1T#jG6k{Y_ zcsYaidxmy_CP4(47#L6r5AYEV{4JoS(ec(B{~!xAUwn50O>yBa9&5|NM<~EO;tINt ze!uINZXZFBUXg>K`Z0}v8xIp`Fz>~!S72YKb++CC%@J(}Q=svmAIKR^q$B7>0AvY6 zKsVSW0WTJS%R!D#F!v>BZGJDTk^<$CAeg!nilAZz6#SsR0BCFg+JS*(!xv_^z-|C# z9RBT7L2a|37ng2=#h_JTMngULdOVN`0WaJjjq$WjaQmKrJH*;7_7`s7#ox`2lUELx#QTI>Q1Ok`hT03B=5=lK8sgdHFO?6+fs_BG_=ulQ=c;1;0;JJ{Up z6VM0-ZD)s`TGH*pCeq9D1AOWN4_60|!3#E!J6_KNufKUY`v<7q&(qBWKH4Cy(*v}% z=2#Qxj&a5pcN{?X9Xo&q_&{qOz-|Ng$1%2=@%I*jwuvC$$c|_>Fo$pmfRY8o?I#() zC#viRH7K(GGr-SN32EX09jJnmLPMW8E4-^()4C8UtlgkwIx8??6ZK4^puIbI-+ zPcg=m!`&gShx%*>*!2e(m|XgA=5fou4 z@dLN7!HEcU4G!qU5yM?zFN0gs%#J#s1{SC}oqdw6yOf974-y6<0v#fTFC4)(?0U)i zA1!XcIWDbJgyV%ANC{*Mh>4XO!;8KWdy0fJDGstd6^$0I5Fi zdIUs)l=Omnp&(ULLA|{foi_jfzi0sw^&p}OM3jPv0uYf6BGN!aAc*h*5$+(u2}Ia} z2n!Hl3?lSwV8H-RURcT~(4vbB?rosC9@jsakc&S;Ilu=rfZN%S+t0zP`Cm9dR$>Rd zIDQQj(4fmcKH$}hxaR|6z<&l%#l#Wtq77~U=p?E@S@AC?wc!b`J2l zE&IWfcZl8WU}Y~hLQLy)y#nj_8!(50N>#{?gcppLL9PTX$J)~yx&bu7vnQb2_X=o& z?M={&Wbm2$r*>)HctMxcZPsK@~A|8WJa;R444 z|900N$b!vvFwHl5p__fPPZ%)!f==Or98ZNKF5pM2><1kP#1aU#H-R~n2Q<3W4Z8Mw z5@h9Y0RQ&ThM;cO3jr@2V77tQZ~tjMS(?^671W9W&CmV7v>3eT+!b`2&jemj`owLO zI@~IVdEKsO0$yAKFI*GpbUpKu33OT(xNv_VV+opOg(Qb10WWkff};Y|5b6$n64dSb zAmGJK=(dLKCjv7}cX(UAI02sE1T8%K13N2#qZe|J@{jCGkPAq@fY!F2w*Z~G4a&^{ zpw_DIlE4=+Fbgh#4F|{e4~ThSHK7}VURc1?8~`UVkV9TvfvS1I4fDo{G{{gEbf~De z7gSgTc87xYcS2TCce)^$?*dV@x%)f&6 zO#Ff7I$sXxN$fwePbTzE0pHdIs&qhW{oa_vcECx1cfi#wfsa3f&Q9+36#-53!jF*S z=!KkD3C`jdL208Gv_D{fC{`74yIjA3l)b3W1f^|I!GJB`K_^&44sZ+o0$L*U!omFi z{|TU(b8z6#2z+t>Jd*$KK>S|~o^Iv{;NK1%^aE`bU1kTeNTk#CO0Vyp!0ym1K`$0V zx)&fJNRWaiG;RdGkiHH!GXSh84!qSCl(BGy9pumn-!C&jfw$fal=ysmKt<4=pcfm? zfsKL`L6GQt;R6waMsgNE|8{Vt5cI+rA^}#s-xp?`E4~6!0NTn&C`XT3nCn1}6EXvB z4+14B(6Qp6%|Hg%!0rp^_Pr4Jq8Qvc#1|LfbA0wg<6?^`$g7|dX}fPj;ESVY!A5~n z9W05yNQ8(%y~@8G5(1zK8g`}zQtAPn)(5cwy5Z~v6Er|TY3UT`#46DJ8t_~RN*oaN zPzNc49JJr{59pYmo#6dUAg>03#%XT^y>NvV_~4SG13WtfidAqC1e)oC9jy&YXkIU_ zn}9qQ+5;N$0To~YFP@%(`VYLL31o86i$;hT+<%Z{1Q}6*9xIMgu)UZ7nZl~{Jm|EDOA)9wgbEz{R9Je@D()Q_b2ltILt~pdVN5rHc3O>h>rK6K&6Gk-xTXK(7 zr-Lm#05i-5bc7?sFz8`l`%Aw-4j%*C3OQ*Wl%5#{c7ShdJHY@dKET&>gJ(3c`Ou)Z z#}JY#O20r)bu4@#Y5f2H3lR{(4qt6M7;+N9$Wiee`Fsp=q}~xZDE55 zf{cS6Ahyd0)HzH9&Dbvg`v3pSy04IPxv}*~z{jzhn4gI-Ru5)u=nv46 z?obZI@ipKIwayS67oge$l)GEFAV($neu1pyW_S^62ny_Dpuk@64|W_4i@O`ci_Phf zu1(_+Q18L|%?qXsNQWkE0w)6l1CKjo-3q9Ga@HNPj~&E5>h8v{1iDsbue%$=3@Cf6 zyBk9fl)b{;jiCX`p6>3(04f4NdOO_Rz%zazc7wYc1E?4Pu`57oQgaK8;!_z)QgaIo z;~_^3gHEafUE>Slf)5!+5`Y{t43({d(v?uU0!o*qCdcQb=EbKXI!&S7Z(#Rf9&`N< zKK<`M==8t;{M&s0H~(bf?^On+CJFv+q5omUtN^%@-sUQjeIkMRVi2+vqy*mP$^(&l zp_>R^h?j*^KPV3}GBAJ^0{%xSKKQr!@?>93fR-KsFCHhrP4fK@ZFsl}fSdcdkGTJlTg}joH8#{YhXqy*vRL zbp?45wLVz3&G98>*z{k=Dz0iYL z017^EXm^JS^g94RzDO7p-(k=TP>;F( z14sBjP=x>E-{$+T`6oxM4F9&!fBf5A|AFS>N;$ej#5zP6Ux?^|h9fS6#%X*xx&k>m z0yto7&W-?17@MmjfD6Xv?g-$9v3WWIcwlVajsRX5o3A5)@5K(?|NmcX1`+E(#7Ypc z1VqdS5wmpv|DS*@ZL)x!`acMC1_vm$g4RU@z0m#(DtQE6Uyg%>gLMi@IDpS{<2dg6 z0~99EZ~&dd?7`9D`yUh_$6Wt19CQ7{@Inb>xh#l~01?8vpiw@7H2!T);GO!Q;`Kkc zc)d9jTD+FAS*+5E}F6zQ4kjd zym$z%7gz#b?3jTX0U2QX6+rfb&vo5~J)~fj88k5P*bi>@LY2L^bsAdTCBp2tK(qga z7TEuwqg~E|j$>? zfn4xf5xo1{^)INm`a<~-*x4Pfe_wcjWM9tx3+tKv11Do9n1X*V)WHe@|AJB(B)Ni) zeB$303Q2>Vpe1s~TL1rNK)ojdzQ+z!G=W<;NFL$=%YbgULy>tg^%U4O0WV}=Uidr> z)eDO?K?M$q7ZMJFHG#a)3X**p2b$j97W$|4QVE;Uf!8drnKm#sAK|cm^TIU&n(M*& zT?Bf5Bl_vLQw;uDjQrbN-v)I1{s{yf&H5+k#ggCPVkeD%+W~NJPninyjvP1^Lf`U(?(Cg= z0P2PJFAiydJjnE#>Gk|97SP)5_uxUvXt+i`u>J2|%mgbeKIZz4@daoea>6m!w@g@E z6$rM-^)1N$ES48d5UcpNfjaYl0)3Bp+77^zpZVj)w(%-t`^G)i2@@QlKkAj=Mq*wVVzz>ySFA0RFU{AofcxP-}=8w89?Z;x%w{q@k`o=K6;D#Z$Ha|6e>% z1C;}yk>Bo6guD6sj)Bg0LUnuUPgt}-+#U)umcL~ND7PI|gJstD;AmSq3FiEoEEdr1 z3H;k8g1i8dM5HDCec;pv8UuK78Lq<%>d+SsYM=@DFZ|oU{%yTfD%b4_isBB4Nf(2% zm|pa#fgHvG3L2qq*DqZi;Gpq+^MV=VIZ*N6?fNI+#nSI!WuU+deb)hY3P`o@n+~vs z?$9sYt{*y^uJAK3yf~@)|No04AY#Aj|Nj%3kAO}rpArMfu;Bcf5fKll zAKg6@Ks8I?izJw)m-|6>gI9vQ;Du{?0M+FBzuWgmcSvJG&RSW6eknt&I-AxoSBUNpfpod|q!O$0Rl1k!ZlnCoYT*PLCUpTR!;4BAiw zUOlbN%fOIf!^FSdtacf<){izOgpK8TnFBBp|f3Cf^M1B+>vF7Rmn3#lWZ=;8=? zu@GDbu>`#EK)4!I-hc{sSX3WiU| z%wT%%_QL}R)D;KmL5c2e-xGl^Dq!0Fp9I;-67XUfOj}9Nao0Bt3JeS{CM$ssG<^Y@ z6ME6E1lpM#`XsG0bWd8h>w~mT*BxoyzIW0(eUGGdhu%o*3_b87Na_Fo7rr3E14KA0 zfeNR`te`V$z)|7*qkBpt$iG40nS;-e=0L!UDwrb_VUFN$c>^xNP(t=h;EMw=E$%Qa z@A}~0g#{5TWI?GrusifZ(2Gu(HUXHn?Fen4L1IuSA&2aVfES@KJ$Ft(gQyv%2NFb} zLbE^-5=5ZjN>Ky_k?(`FPTxIg-Qb|wk=E^cBdyc*2sEe;ywF$t|Nn&+h)@L)3W}g0 zIsiJJ5maP=9h(DL?G*6h^KP)k;IdU5ye1fw9ru9qFgO;SU@A|-R9*;r@m3I)ad$ve zg626SU@GUsRGtWY@fm#jF38Ly5S5^T`*)Ca6#*|wVJZ&t^uC0ecozR-j; zn*v^Jfax}e>An#3q8qMz3;%Z4JD{0>BcSo-EkQ3H>;!ocvJU?Wgbm&UwcU3MNW~M# z#M6tN5Gin>DSHE~1*8l*iyXS*#SMAT*_JCnMuRnO33|Z_ZN!5*6%H@j!No2|z>7G@ zM$Jyw4Os&G+g(=#yx6lHY#_*R{{5j_g1TKd1iVN$1cf5#+Sx7qAjiCLI|fq4(&_pF z8UnCX21?J6{HqMJW7QLoT8@AhhPyxv@QmJzR`5z#P-ufpyaDpw0g(5$1iZMl1EdVx z=X-Gu!UlPde|zW_kctN&Z|w+tu^A!-8nJ#M4jJHx1gv-gg#@Gkl!V!{0J7RT;DtIk1|c!YOyGjJKt(&_pJB|Y#=fTRU+nECS{E2IKmsDfh;k`^k# zOHrXA;ClxYVX(At4i*n50$&`0ut8pfrG+P;(Ap9BVmU+#oEEqtGX)@Jh_rA_1|uze z1{Y+o5GaMTX98aMKz2<)LjaT(R&9ZX0CHLg1z!_~oEF{$yjZXYtg_Sf%}dbcLU2%k z=Vq3})~4!#qY4u7L2z$F3o%g9R0~td0#kV+@I?f8MJp(PjvRLdFJ*wPQF!rB8nhl- z8ajZzW5@q`(B>G|123+EBrZsU%42Z#b=(zFbDaf=pOF6lf5MAL(xBQJ)OdxoB@VU2 z>y9hT3=G|_Zvwh~Uj)85)d3gZ!_2?{ZZ3calCd@~I(-*_RbVtIn86JoaN`8LKXL1xpF#5)$N0CE{)fyS;M3jhx&Snd%K`EPGl=*n_5VNi_7-aUrPFl*SQ&VL{R?#H z@iSt$6I6tQEzSn55&F^#nks=f4K`H*avylAgrGUyp$j@iI$k78{r~?W4n#ys{r?Z~ z_X&pXP$b(yBMsmQ(rv!~)4D}G(mF$DfEA**-awOU5QVN#@1A7nF8uKG;ab? zPzo~1DXmkakf2Fv-M%x@I(eL4?2rVF2ZD%olK=lh!U43P2|0qHqq*Rg3r`cyScc6P zZ3~5Z8MLeqIjUh-!+^q*XJRMM2C#J)sRhX#Xrv2++{XtZI3;mJI&7dA)Y4AtW(iE| zbe)4WxSk;9W+(74HTX%9%-E{MFdSs>kgfh)+yrgB0}Q-{};g^ z!cPJ;qyuS7g`VjYX#|I#?~m@#6P+QA2`}tGiY$>8UFn203gHSbbWUjmwcTC_fzi}dGSIVbpEY4NG9}1T4(5uv~JfuX`QYQUYrBToD>H&tJ*-P zMQnrAPOeuvS-L=J9@O!1z0m2>mGELSNa;Fpkb9wu&UChPfod_h!V{g4PST5ZklH4& zg}z79I(_e?b%*Xr10A{_3zCTd%YYqu1M0{JFPuR#c3`LM|MdU=%L^Z2(?J4>ZVWG$ z_(GIn7biqPH3R>4kojvG;i0jOm4V^K8qxp%!6!C!yGjJS;A@7;mPqq&2Q4kx z4&Hho5b(mp1>8hbNu^V8$eraz!xTM_vH!9;(zga4Jc-y7s9$u0k4Dt zZSe01dhr3)L@fum$2bCB^nud{=!~Er-Jt^DV`{oZz>)T&+gE^pyNDyG%{3$7g)79= zv`*IOj+>q**|be0P39{Nb7c8kk;wC zr1|83&?W0H_6q<1|6&J-*end%MYTV42LFE7DWE_TVP;@}DEshY8b}fxHCX1n`S*u5 zfR^dL1`W+If@YFoVe>){>g4^PA`TLM-olWhsa#KhmQwo8d0_>z-4t#CwtZ_*3qXSd z{NO$k#614(EM5UGv>*Y{3Eu134cTD%Vk)@l1=_^~x|xH2JNSZ*pl-0509gAl;6)!; zFGv}vr~t(rOlcPXi-W76Aq!d@2tHar@P#Zy1E^&Qz5^9B!46G5LH9w*K|#I-beui^ zcHcFirt6xZ7aGV0LCT3MK`$0Tx?rI6z`xyh4oK~Zpcg!FQ|7$<0^0K73XbR{An5}^ zFXn>N8MvK{r0M!Su+=Z*g}`YORG^rqb%XAe_kEMr9r`1!6Ld$r>xr~Z*8^$YzH`z# zeV4pAB>4aTi@hLX2Z-1#2)f_{bouj-ZdU>R?K}a2FZQnlnG0G-2TI0ioh*SbdO*rv z{sbK|wowpLNQQn0dNH*YmhtUCi#uIEz>|PB%naWTuq@;O(#Xia-E~I53m%9xDC4}G z3mPP-0K3w~>)(ro0-${3It66Pizx!2N)vR*4?k#u z6zFia7Y@HnKu6Ke;NR~%#rj~0c*YZc&`lDLXES6JJf6+)qCo?EV9{$y@VNw_qfbKx z(z-zgvT(g{1{wGwR{&ZtgI8U?kgI_OV>thQSCQryjL7>ez?*}AfYyhCssif^b@Jfk zw?7mVW8I|!Y27}4|I$Er^*-YVjhmkY)g8tMU;%UyB=~Xzc<3mLIg9Z{0o2pmF9f}~ zvK$hi+Ybc5PKN^T^5zi;d?CRKD!V}obFZXzhw`L#hOT+h!vFt2%v;R90)bf!84M1f ziHXoPpd#@~zzZkv)+JDWSOHoV2kJWI!z{TF1k>9cD!{*;g)892V~8Bwa&W8)zK{Vq z8oB~L(~aRpk1M2I0J#N$&keK!9#q|1zj<-d71BtU0J;OgCew}K3ABwcJ=2Zh3Y0xL z6LKE{Xq`uIrW?Z+sCZi@9INa`KbGEsXe7hLp_W5+m^8BOn%d5eIm@ zTmU-1^`X=COQ-9PPS-zKOyJ_-1#dMhLgnB-1D$`%BLLdx{lbp#|NjXu`5-I6c)CF{ zJ^_EyI(>ia0v*&3%C|41`2PQYAqrB+zu%Ro`2}-Yrz?DsJUB^!7s58b zLKAM~7myH0p%`4~&+8>1LEkTdF9P9$U--AXerY};VEyLBA7@CUg4%W<3|c<{T{Zx2 zB)~)BAZX`2I3)P@y9!uesI3DnVgm)leipCR1NEk$62un~GQ|+vz@sGY;IzjATBz3T z%L6XwmhgabkSXY3Be1Y52c$@}foZ!C^kTsha9Bd@0crDkkqgrHG7Gc~8oUa`7R~vP z`=}+L>E%VIE6S88;#zTV>gn};16fnS4mOVm>|t;PjJh!ZlrF3<)XMX32W7+*Z~?L1 zB^1a95Fl7x|08{sg5th)EX$pzCFLAo&h_fy5W+1rlFC z%dbIQfaaHs)(2~Kvly~Kar*^yxYUJ!7f#DT@yY`-jDI_*4nDXLY&s}dUhjA*0NV2E zDg(K`o#Vw7PEa_xet;x`nmjj#7mf~~L=X>21xFk}sldeg&5JGvNGeF104gI}@*sD? zfy%|Dd2S3BplM=Go*M(`PPlkb!azNHsVFrKTr`5RD5C8X#(zmFE9t(vIaW<)X&Re0HqAjVXmPIz;Op^nDl~{ za$kikXLy+e-f#>$@ynn9wExQvDar)xK~bgyy8p)x5@r1I44^o(04asWQ)Gb~!wo1q zpn!0kf%7-o`Ydpc#9q*fSYN0OfCbSXSP+$$Kx3}N2wWyXOVD1P3xO|A{{YWagDN2K z$(i8O47))c?Z8jqfO$OwvV?>Q>M3wCf)k+fAGUrjt=m-qxiSQ2Y*-b*)BJ)FTqy2` zY$5|4{Zh&SY9cX#n@ES*Kn46U=qk0TwvZ5nq*n!K`HcOtQMAJD1vu+Ic~Qjn|No0z zHc&PT6$k>|CD!fB11Z11?}8+U{jMUd2TH`i$p)OpL8@M8LP~dV0Rl=7ptSEg51Jkh z1iY|>u}=i{hJFB>{NgJ(6d|R?gV#K1-JuVlrN#sP{jLxA_xlPozXUbrMYK;@AFPdl zlpU@QK%LAFfiKt=L(2}(*)Ogy0$#Mv1=|O@_bZDLRLuB30Cj6V1iiSu2&xp+3-Wyu z_#z6f^vUb??ogSuZr2xSolM=n3Xpj{!50~<|Np;8W`$oY`=ZE=;l*WZP|}4IHsLm) zl&fI<=7p>cB-|%}>YNWnkbA2@WzC-=q_hf;een5f&2MVLduv;Ef(`-!M-=kSlWEWGDkfKCPp2et0DyYd9QIIski z3_#=d3%~~6cwq;&0>@f%{%xTG)~9MspxFzw@*>}0;b^f1FAwVym-kBO0%vPKtl&N0$=>fhXq6k z|NhV$t(WS2K&_x|SDAnp>)wI0C@8z~Zx3AnzI{soS_AO}fvf-z9Bl`eUJ~H2z7h07 z1IcCX{QF&Rv>vFl=ilzTAP}^OQvkGPh95LK(;dnI>N|W0==N0z><*O)da)0@EJp@p z5NI~!{w%l`UvjWBFuc%XhBP94RRUiug1cJ<)cOY9)z%Le5(JlFH(s1&0yVhLz^;FR zMd>!C|NmcX1j&KbVQXV;12ro7dy%VzAKjq}-JqsIJKUbcUf-TT=$^n9P=Km{swEy! z4fLbiR|3>1fDDjufS51(zyT!#>!DrXas2nU17+-%~!zsV67Htt9!SrLZi(D zP+O`->P0^zG|Ub z?+%p!)%_4A2Z;H?3)~El0jHqe&=sJd{s3CT4Qd4DnSj$P$dQoB9#71I7Q8{T8fdf% z60>VzE-NX+5wpFnD?ly--J}Y3&TdGO<=^f*1LXD#K`%6CAVsNb4=7a}349?87d-+V zAx1Z6voYA|pu^8Vqam>9{*w)hZa#2y?|AX+|G)neUduoaKk(g=)(sx?zwqMW|9}5q z+yTk*Z--1IUkH4$2d-ZY9HCp%x?L}T5(IQ$e$R_lAZ<%Q!~(Eha2degw-tC=b*6;g>Ie+fiHw|U?EWl4M14C9F|1jaZm`soT)|}oPavq@@In#l4p$ja z64?VvJu0B%_6$b*qOCI)zegI7vfZAWt zhTwPuIji{)=zKYFxTEe%gVa3yy(bajj;MWRWkJK8zhw!yU*yUY0P-_5?}63_g3C50 zm}gy8pp71IX66BRpkA1K1G$+8T9bf}^Hl+Fu=V8$eBnM78t4~-URcA}Ag??Ke6jlj zNTUG%_E2cC@In%%0u(La{110So&ngiFQq{-bPeQMaP7n22Re)z6vg1(qcTA+u097V z1POtf-(^$44glo~aFGB%FU(b;8#E#|EfXFFpo>D`>2D{f>5_esfjLwn2y*7c2?l1+ zRLa*4_+noDE67hgpiIQS-4`w9tsrgz)v_=2U~Fj2uX_*D2wJLh1Jbbzsc~a?kzoXC zYC$`8uZ=)$ts3h$FE$!M+gj`l3=AOP)HQ^tfGR-rA(P^ZGt=`j zk-CoHR$plMo7lr(7K9*z51J_B;NS1dV|}omD-CqaWoPK0*BoixuArH^KcJzi?x!$A zL%ZK}yK=yI(Dr2vX#MMwo#KcND{Q?)Ex1?B(aq86`=mScNjFoc>zfy#4dmUvPr3tH zfn8 z(F@R-ATJm|$0+^=9T)ZubO4&~6aMXiG7u|58$s!b17uLAW5$bXAo%ttFS!d1QR+D_~IF4)eLBHA84U42mf}bjDQyk2o*@8 zTnNz@>)`tS@NW-20&>HjfEO02a5o4tLc%k!pfmJ9w=2hShXT+FOwbVA!G}zNFKUZa z8Jdrw~rGpd+~< z$8>Xadlqz;9_SXC2AZ+o4>|_?z;PDP>AeiE4}v>i=oh~Iu|8NEm?iPzT_MytD?p}! zqQRq}+jT`J%f#l|6>wKofVWJsysTwmV8~(vo!k#Phn=I_si2#uBk+Z!Hn?nhJ-s{h zK+ub9h>^!#K~wPzFG07;@o#rM0;)3p1irYN3=gV%pc|n>L8f%N9su2|?FbF3&_4$s zF$KK{f*924x&-7d-zA+M1x|;L|%gYzc&`YPlLFI~m_2(b!Q=p&%-*kEc z6y`zTpkiqQtti+J^2dSWET9`(ph1OUz!B?HwaSoiJ^=3BbQOTZ3@QW*=c8cH=RxG4 zp3nLZa(M^nj+y3zCZMi%^Pw`(2vGBZ640Tq%?Hy0K|2qi$?qY!u?=2G*d6*N=*7Yy z&}cPiCcPVMMyKx`Sh7qDco7T>$r3(r(+a$1)l2L(5BM(KZr>+qosMEJVt<3qe+3c6 zAR-S$Wc~(ilmJ<4X?;pm1IRs7qT0$%({geK@xW&Z8HXF!qM-2^JL__u=s>n=>1zXfzk z6et0LWkCfrx;FekajajrRx@`v0M1}`)&ap{}jx>KXgy_AsPPtzB@86 zg3br)_T9h?Ia6Z`sF~~I1nN~2P!jWk_2>WpFBpD;`ff8`X8!;G|D`#o<_Ue!%>-Ik z-Yt;U8L0E({*V9vL9xuizuzOR+x5-N?>{d-0G$BMzuybW2Oa0~0aT8D0j0$spzsTN z(eA;=(0oJ&7IUoKt}k9Qce}obk83^>WBukuyB4ISa0Xf*a)gDW@7M&Nm=`G5dZ|R2 zf4i$d0BEzSApdqJIS>n6e}D!!U&z*i>M4P4UmmC!Pd7)mV9*Ow8&KZk0ME8Kro9jY zd4#z;l!t%2Q(C}_PD zbLU0S02pYhr<;YTo2R4G_s1?!de1(@3{nb;eikOM$i+we`%C|H*K%}=h<8Jl^MMs! zWCopX0IIk}1iO8IfX;qz{{H{}i#iZd33A8F>i_@$gTf26+bvuZIlK^!2}t-6;*;85 z*|FjpX#atx3PX7B-U!YA|97r3WnjP<2{S&>*?Q&5|Not>H?I8upRoc|do%R*zPSiG zI?^-<)GFkGiB7dS4?2QW9wK_Yb&4kRBt>0N69jbj<_l#IOYZ;w{|gx;<}oxMU|bBM zkGGbgPPEX0$%K23#$1zUT?`_0UhRjBm{Kc=`LlEAb9ArcZViqA<)zfAO`5* z?G>8;|Gy{)wV8@QL@uO318Vm;Nu_nR?g2?hfX{L41+fFO7<;GA(FA!u31Tj!L6(-* z*;@lrs{`6v&J0R2O`sLC0WYHCplP#26Gykb)ZU;t)tZxNP|VE?Yi8llKSEUDfY{lfBSV5-Oj81f(d!)q&ExN7;s71i1X{7d(H+uQ z(HZ&!oQJYOi&KAeyKo6~f=+M&E#}%EDsu1jK*Km9 z2OltX`+n)32)6A)(2M!z-~(5|MuHBt)C47EDVRp^Shh$2TnEUA51?`hG-m3u668<; z&<4BiUXYDxonW`V@c#4vKWMWN5CBYP^G!+R1 z?W=1#V8FnDWb2DeC$Lrg+gm~QfKDt1=?i?J2r&n=6SA}E6sS3R{x@{|7_@`1(~;%H zzTcocbSbS9oL@jUU4U~8Bqe~E&@9vZQ=m3K%Ldeo&pgDy&%n^z!+K`|Xt6Fo14B0C z@^P>knTJ5DrkFwN<-sAq0n+6AA@d?wQ;X=8kpKU8g4p0J2Q@wOB3RR*fET?GO)rc8 zgH~;UoypjI>OUwLI|FRGeZL%cbomdinK(c-)0edF0KT-&zz9%K`hH344vb3c3}|Nk$JgNQ>QVlRl;0U|boh;^Wb1LzzvaCkuixx^fF zT*Y=*XiS4bKj=kiI~Qn@JBuNU17ukTNKxR6{e2)&9&k|)I+eDC_lwQ{|1Tnb{r?Zn zuMlsDym0^Z|9_TuhGtAZ6KJzwAWP5-mQ8w~wLJkZy1~f{yyEJ``WCPtI2am>%orG6 z@ctq)!XR!q1lq9Q?ZPC$zkfoL83Tj$soI(>CeZL?=807d;H(TPpLc-R;H(TSGP6$z z@^2UM3VLyOGROrG*C;|<0~#2}5`?4#kiOm?R*)IHKy2ickbOw7m&Y;i#Vz4oxyIR5{?3&aL%4t(Jy2Ufq6p8>R&ptr#B|Nj?aKf&`GA9`Ct zK~)TFX$$iq(A5y&8Xi>Wae(@vSqxdsSqxAp4=%W7a_L}H`?l)k7hgT0PD9%7@UOyas#M;{;+H>~*|D6g93=H5D8-OS9f5TwIG-${z`y>PS%DJte5y8FS zwp9stH(2w_N8Ahy;8p|weh-b-lO@{FJgz%)pox&qXv z?w$x*Kp6C5$_h|VPN26H)ba}G?FF@=K%I-mLkk!f7=n6RLFR)rfc5il2e-UH{BFT+ zCJ^0xumYsMy9s1oz>6dEK<25Wb+&@qbo~2!LFTreEKvh5I|naC^hg6~Xg*W{a!z*# zNMGQKIcq@r1hPP9K6gW#Xgfk+O*BpLbmWT(AT=zYuxr`@D#f}xKo%x>TLyi5mcLlTn2Ip)TEgv(Gitov~I6R0KyHQ_;hgx5l8-Qd0fq$>_)^6v+? zXh3OUzekDn#ac~-NVm^~3Q%p+4K^^~g=#A}dv$`juQ$II2KD6xyO|&YFVaAkb@zfS z@9dobYUhW10uS0W?*b32m8gQkwFAWNp14F6wBD@g06!?>v?hR5i-Gh*FT(;0u!01- zLpfmjWzqCE9y-L&z|c802Glj;I^GJRK?9eFrZz{n3s(g^+Fb+$__uqM1$KjVfcoz; zpy&bF1&ZEoCjRXnD&S%Ubj1`XTmvYI>Rxa_1-z);iYKlU*%=tJ*dZb5BoOc-AP^eC zC5Di&4D6l?3e2DvW{{={+&jJ;-BScRKtte84liDQ03G`Y$xhv%@g-2=gD1KdUY|fi z29RMka3=&KWI!DfcmW{=YJ)o|1b~kF^p!Mw>-7Z}fovuIN9tT~VBOuV}`vs(>^-`TmH@I)z?V->;71YV@ zc2eNqFOYqRjoA@&j7WE&LZ=f8s3*1GqoDO{6yWWF3P(Q$_-StPe z2S?zG@BUEFl`3?He&OHm6b5Q4^Y0Ig33_oGCdc2h95f;f?xjVTfsa-A!oS@qA|T7C z+ZWUy12t%aUcBxF=bQkLBfvv!zczr{e*&P}l|WrLaBCc-A8f^T@SMjN{_P$Sfmuc% z%eOay%n5k07-|lvlI#VIQh+*3jfb|_FfatYc=nzfJOBj_X7nQE7YhT!i!1N`|IbL^ z1noQh((U0A_~Nl2%#WPip|kkolk* zuhY@#Mfy8XCFluq-hQWo)&nJi#wWquFfXSU-e5Uh6r&7~j5@s;#V8q&a!_QVH7@wK zvw#M{z68GbWdK?*#qmPu-T(hDc;A5<%CM@%lz%_CdIQaSt1v-kGQjmI|MsRe3=9mQ zPUVNd7dL#MUgdB32ij8uI^Ow1Z_89fE8!vo*uEEX72wDMbpbL!O?i;RG7o{8gT0sy zc}6i%M1qboNRp=zdrJONgN(u4(z^iJ^wHC(~EGEaaS ztG!crK@C?_5m0j#ECOw$LQM_@HBG_h9DK;yJB1h2AO$N!G(%x3L5)wa%Iu3Sy)B}k zCMTGS($GW|0d=XsBE3_3LCr_7$-O!2^Emq^Z*0s+Oo86N4vC6Cp%De1<7Ok!FdeC4{3xdJ;Bf& z!X*H59Z1-v5n2JCWaxI`5a{-D>GbdbwU@wcRQ~;7cY^pXT~LJ=8M;9=HMH#a>4G}! z5<|C-pg>ypgbD*tn_(h|dhzJx|Nk%Ef`}V0L5t8px5+@pQeQyEQX%O8GLNq?$Bp5| z0wJV%d}U$KRu|CFul1W3&x9ZY&S?|W7#J8d=D0C{(pUpO1H+v8ZVaFl*dWco&^zCa z0hB&LbN21?-55YkK@hucz8eE54TExh*?cz!P$vl_o;Tl(0hG=`L&cf%-55aKEf70- zz8eE5j|ea_FhtLHV*q6zkov&+ZVaH_9cT%J+k7_$P>ut!t>?QjfHEUUjSk2?XCU_t zE6jIe0A*eV8wLg;klRB3{|B*IKyC|xsQEF^jRDlBbr5D?cstLH0o3CKb&MX*b7KG% z9UwQ~oae>>>KcPOm1pOC#)=D9I|3N(;-)jT%_&_Dxd_&;l&8w04&V-R3qh@0oe02)64sR@|p#sC_g z0JT?K=D9I|1};Euvz+I~02<2(U}9h}oae@HMDzcDkhtPJHwI8=0mPP==f(i)K!D8Q zp6A8@YI=g~`aRc;0W|UfVt<(H#!wiaRurF6vA0h5s>YL@kOcenYkdhGGyi^rX%bvN=?i`@DfW(5|gtbK>>16Mt&K{!Jr_@ zDK3c51qD+D1BjWIS`IQewV*fvy}0NCEjmjTLB%9^^bNug40>_J6)MT!atu`Zg0`A@q@{KGet6;e6mq&CyeIJ@ z9A;7pA9!E^v@)gBEA6!a#JEt7v~EY9v`(kA7rY=>`*Ngp2bQIEhQ4_5_X*frY26+r z;QhsKLHtk-_@s(g$%|W0Kyx-Ak zmCvA&gBPctfdWLQ)AdJl?GNy*^N*L`L3Tp`n;Of$d#40y5U47h~^niK^M zP;>C__e|?%07-#2&G2sr?c4xe-2qyB{31^qIx&i5_$&qnh8M0NXEK4hp4-7O7Wl&0 z85*D^x}X&>p}W>b>MLam{VE1U4OjxfAQ-vXi+R^fB_b9FPvaT>48=* zyM76HaTP8k4e^u{2Pm!^4}v@RFOJoNOy=lz{Q;>id=|MeyeQ;BsxH3pfF}41tlzxY z#RID=KvPs9iy(U;LFH(|A~%NAoYdUZyb?$e1G;-1v2_QOoI(2`2+d!j%OlNa))2G) z3Q0Xt>$L*AT{)~>d1^qtyH4Lfui3goc{)S?bi4jREb9Wh9Ylcki}3FUB?(_1?t`G+ zA{gtxV6EU?#?Xubx_OD^KXl;m;6sL8X=+(EE&Dm87wNgLlq#qf_dTE48RtF-3UIl2dY2@u7Dpp9qaq&g*(Vx(7r5$c`{)0z}mrQ zG0K3wn8o;FcQeT40-dfeVD7@QAh!9ZL#-~zK*-{K8Sq#yGP@hJiKYN<)a!lVqmuY* zKxTuM)_nk%Hegj+WgtP0fEN>OtwC$mK)W8nHyUNhz3|Hd%YjB5`1gl$v|g$MjohmA z`Y>}6yZ8v63U+0J6oIFBLECZzUR2t`qS64o=NlZT$Z^sE zSAY~Jn?X~X2(#0`eRCdx7qfpOG6~GijKW$5h8Ka5G}Y<)#pSQJ^wm4QRqJ1Jp_e4{X19V*?9JGq9cDqn^;sV#jV)0?4c^Bd8mg zyL}b-w~H_az2JbG8Sx_K*Z=<+X=V%zP}4#Cv>>V;S;K5L$lx-ED#$(o_wtK_a0N)w z_y)WtNk5Ab!&awsaJWJ}3~~*)5Zn#Y04j4KHPxFHZVWGuvw~}?<|ClZi&AXJ_0yLX zko}6F_AtXrHwOQ*)S|SU{Bl^e1TGIT_uGSg2Ocei947#F1vpJY_%FVsfnAr@>H1|S zsO|%|eB^(Es$xirN=Ep02V|<#^}~yQKR_dHKR_hd#57QS1KMr(2imj!16n5p8Y;0q zSZfQ}<|x3w-6!B5XawL7{J4rTxa~jqw}*ZKWy~J|FF@8w3-6B_PrG}iI&1# zYYmQQa3+BU4!EdLgQUGq*B{`uAsPMP!L=WOFKoeK#M9~eEJp^1YG!M7#A}z zym$?X8nD(-fgtda>fqz|nc!NxL1B;#wgME|e=I7G85@5f*xMB_sx)ObG#fk7dRKa7o0=^gG-=GU3K(#VxvmgIw$b-KREk_2tm4t#MK+-Bhj0IL@R7xEmS^C&@;BUsC#evla;v2M`K zeTP#)Tu}V}cmdjvkpa4N032$dx)2&@>ykij4{Ux~x9^X%P96cUjo?*Q5Gx^7;kQ1py`UAy>e$iB#=LpjLYj=R>N! z3b^f{T@|e-OFdsa{S2Bedx3O}3kTT084TAKGrVwzXb5;Q4_sDp1iVN^vJPAuf~*sK zoel0f$ppQ4nh5qFs6h$d$oJxkDJ)>!UsNDl2G08&kb)6x*)8Zq!wW;0Wk0~F6XG|7 zWylpJXtJI$=*4{#m?hyaj6Y*klu%VW;i~k}DoRKoy_f-4!1vK+aJ~fg6QfBfbOgWCIna zUtX`kRwF`NM&KIJ5RzsBUc3M|V|k#7=R@F&<#1zuKtrAZbO;joBrFle7aAYIr84Mv znYn)t_h zgJwKm^FyauTz|Y+1`+_9finnySmSL`sKD*}0`6LXi{TgRz?%4c3zxUMvQg2d=2W8-ILH zKr8AKpq)(3znJ)Yt3h*<3@^OE6$?wJ>m0D^BcR30zDJ;{kMQpgJ<|M(wKjzxv`Hz8 zF^iRdJLru4l2~wl33#CmPRQV~g%{^zz=EKR{Ni&In4Q+?3fr>*KJE{?e*?_!_MH>> zB03+Wj;GUg&g=H(+BpoRyjhGdwt=exkef10z#}Ykf?jL_FXZItbnR%a?O@<+})*@`4AX<7EzLRXX_Yy80JZ zkTyxD>lV-$6Hi(vEV6Wy*Yy*v|O#U%fB z9!ALEP4*!M{_Q@jUjkoPR)Ino+~|3s8x3ZIwh)5O(*kXUYv~nf1lJq~A29H5=V5|q zKlq4&f4ht5mw*?)D#2R7ZOC`b3N75a7BCS*K#cR;+E7v)lu3KJ$a!7`67I+|xf4?9W zpT77Dj(bp|$l?OWdkwf52omUZT@wI~K2J4Je1Zzq1>i$3vgBT{{Q%9If>eRhMDq)| zv`*JGFA9ExtJXEm2l)fRhS`H#JshyrAe}Cv6JA9B{{J81D9{DZ9NnQUy)0ee;_l!> z2LA0L96>KKkR9dP5%A(U#GFpoj$Yq25Tm!KB00)+K|q$=i^A^+NBOR4ekqsM>AQx1 zf9RU#L;OMAAamA(8%7ZK9DK;o>B2kV#c9wW0(hGM*0jRJ-}{9Dx&siLwOx-uR-?Nf z;ot9jr1>W+fA2Z)#_G@$-7Zrn1iX-fUnqfVHI9H6D6DWwcyB-KYl%PftAb)TKym$#_KuXYFNWg(h z(2b#B1<(@oNcKf8=FkTI{jLZ2xAQoG`c!*BCyCt%co6{}UIK;d4*u=FJ3xWDBdFVT zPQZ(KwICxv+3_Xlcnommaw71BxfV3%@wb2~F#heK2ZA6D16|HM6XJ$|7XdJbod|sK zB@AQ|q!5unc9`pt>=Rtf;A30)_lF+f-wwH*d=KdOp&LOj_CUreK{u-KZ+G1R8tvQ> z*d012=mitPZF@nxd|W{XQ_Kl`@kL$tKJIp7SOeWp|8}<vc7WE`rFHh+0og6}71V?5 zo(j^)zrE=XXr0)Lt!l7DZU~-942%J-*5%*s5f=F3BwS9^_)>Q(NMBm#1dzTL=RixH zyM0B{x&_lZr-B0L#qKZv|G&8Q1=Q>W7o8vz!r>-FLG9fSwzv5QV~N{N(D4yzoxKl0 zj;s9ws`93S*cTrKfz~pCtYZZ&oDF!9@CGzh%L8h_fJDgt?tML#hIS0Myd<}L6BqaFvcYw|K$;jXG4m7iS8$7tc0a`Q(@}3lU7MXv0U|7(L z0GI>#TMmQTOI%qD5JQ>|umrp?f*6|x5(PW2`JhDL3mGI)uq&Dm=>)xCLlOl?Nb>=Q zfEOQLfgOfyLP+3?TS%f%6EcEc96=I=notw)VjV;jDTEn7A^iLkC~rXmEv>T=9O{=r zJ^UAM!NU=dh3a7eFY;7i0gvqO2$(2;%Ooby+UHhKN=fT%1?AZnT_7VEUIath?Vx7= z$+S*i@T3{)={>d}x6~T+_JXnksJ{6DE?arP<9Tp4xGbLruB!z=jrg6QN(O9Gz>D+# z;7S8(b6R&V#2vk$eEfn5JdiOJ#D>HQ|Nah;joKH3vbZ40w)v1l&N+qqk6=XPQ;VY<=nDh~pM_xoj z+VGvOGr$YoaQfQ_$>03jTS7q=fmY-F;NL#Q7sLtb2AzLB2i$uS=yaX&dOOJHy`aJ` z@WoX>n9o7{v~F--P3r{v_65gBP;v)54id-w`zM0@rhO;?;kk@}7Xpy{mxbhWXhO{h z?41gA15ZFk3CQO$AfNkz&&yJQn3~oNwl1v`Z1{^wA3(=pgKbUgYz39bFX}&lgTw>e zZDZ+lokDq#ObK|=32s0Nbh=J?y`6u5FUY2g57Roqj2AqhkrPCCfQt4PKi-4G1H``g zAg!|%#CY)-G+KbmJxP>71Qvom&-octyko3Wl*4ZioQnr68 z$j>{#ebYmrjRGLefiM1h!%`85&%b>tNO2IPG0hB)G|-M*kRbndut5PYVjxZP&Q?&x z*4qox7uY=�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 z475h%0Dp@jSPar;2Z;r}Uox}u^GlY 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

tTOAd;h)={4I6pDFST6O1o) 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

(A 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%0AstsC6c5O`M@- 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%0A1RA`R`UPm6BL8+!|M33| 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

%zj^Ua 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%0DW6W9O$e_`|%($0sJE-xnM!aa-8MFJH^pnEMr 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�$B>0Mgb+f7b{%B1wHesF(uvxP1b%SYPNk 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
)`2z>d-^eAqQSl2G#Mpdl%?NfV9rg6E9l7 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%0AT zz=@hA;DtJD5e3ptye zhHJ|U?j!&IzhDCqj3DCAVbD?@3CMP(6EEI^xUMp3-5j6`9A4Z5aYIcYD=$C1IDZ(l z^y@Xli(_EMD~1<)5C8wa^PVHfY~L#{)*t@=f7kU25HIw?i-m`w#|+$n+*aXx=S3e# z2vlf4fE-fl`s775NC-5`z2ijzhzXM2@*)*vv8x8y9lf9<7+wS)22I_Cen{&KUGu^X zENuXm_FeJ993p3t))~6wg%+6OY6HrhFJuq@{|~w=#aAaVE9gZ%B-sRHob_R1cpEx$%y3W}FnI3SR z@M7B`&`}x_KqLM-K`$&I`xw$XU1xynUV~Je<b00tl5*RTtFdTDz#rWd=K~NaGo=EF-z4PJ` znBxn&^y0>gs|P{rz(O~G+@u3?(}%zpiYve_1~)N|E(f#II$d}0?{j?(I@-V()N_O$ z6nG=(#pQ$G@CBW{!@u422FQ#9fiLbt^nuI(AD#ogz466$NLU2C$OAWzI67NF+vUM` zuz)Y}c(Dwo4P3tN0J-W(z>5ViZRQYd0o}bIeSt5ggNs$DG2M_;N?v>dmys->B}Cu= z2QOHLYhl?8_E5l!Xz)NbC>5OG-ws|E4YKV(zzZda8$cfF?FFru21PK~DO&&neuOUT@di19%cq8m>_O{kqr|A&&!<%eDMqJ zj}xFnk@&Z}o(OpH6<*q(0JXk-4+Oq=v=rt_GjgrW5euJ;Vr5sJxgAVW)MvZsFe-`U;c|At}c70Vrf{1io0f zA1TE^&WSn@@M1MYAIJ>Yfk}4)UMz)pBH)D$Bv4=}#`gip{sTcTN?_W+-rfNceG>E{ z52lS3qAj2soYDebq=HL!Sc-urqXXcU87!P(sR5=%2s|{*5%5A2GU^DrDhIUa?EnA& zAlnWEz4)*M9)i7))W*Nv7wnWRK`)vil92fJJrVfg5O}=?G{rz750dyJAu7QU0U8tn zr5N7{fiD~(;*h-53c54_6p%jxUvxmCJm7^sxDCe<@FEQCZCs1Al~`M47J zf(@b=lvG~4g4=S1f4l1iP@1_A_~HpXm@lO9?+bO|-+l;ulo&tgqy%s}4 zR}LWGnXn6d)r<;wBNk}l=*7(4pysBpL+i;p9`Iz}hZk+T!K3OP0lkoeut8^|8wB)% zYkE+$K+Jp*-wj$P06G;NG$ZKHdXm5I9%#g^eE0wVFN#1!E{Mng5y>DT4rJB#&=o=8 z6`mY{FYcB?Ydp}Dd?@%7xeoy^j>AMtE%>+lt^n%VpyVw0Vikz%3U8at-UUtz zkakNSm;*Y@!F9=tMvy{ZjkNBmpaxD_r{IhHU7$vz5oF7_L+gRMj5PjzzApURFM`jG z2k(~X4wV79wcA$$v_2d>$BTMswH5eU9hGihgS76@6(D0JAhs?6w}`mGwwk1Mhpqw1 z{n-f`>2m0Hm4MvZ#qr|RPEbEyCaoKkWSL&v2625s>OX+gp8;_}4Kr|DfzDyw1u_A& zObOB@3@Aupc#&oY?h-a00ku@E-@Mpn2WiWuf%lI`6d>*v*jfNNUk9}Aa!mnZ@67yy z6b4YG3KE}Pkiq~8A`p8@K?*}oVsS}c73h>4@KxCGlW&R(K|9Dn_m-FB7r5mlrZa%o zXEwe8txpW^-3!|Cuu~hUy$m|+2UG#Q__pK!|DBMwvTx6e7d!s{-vwzfhjzTUwFA<~ zY6TtB^WqGMcQUQB7u5KEv2O<`X@`n*P6e6W2(|%vv>qf1=C^DB4|0R}u+e%Lo4+Lh zG+N&Z;y1qt=!7u9Mpf{){{+ePg5>zOO`KB?8m*t&Q4boe2Z=#O>lNWOzKs*K-Nat?>T_g_SLq_Yr zF)%Q^1dSm>1Rs0EWDY~df+cepUaXb@4==xP-UcdlpdGg}FHAsOSjX+i3sn#o)^YptLTnqTy6*bZWXWOuw+v-SV~ZczEak=EIp0ouAaYb&?_{F2rgy5U7HSQ=V5u6a=h zkpp$yR=g+#bHE+9KQB_YB6r-5%>~!8(2iRKr1pY#+-_|JHxmP1IKmpn5%WN*K~450 z{M$p9Ks#=eAf3OoPS*vnj@y(Mf46`-Zc{*Yj!w{vddOfXsBZ_V-(A7IuO%SKj-VHp z=73D)0JkKL!PqAPU#yx97EkL0?k)8YjemRSk)Ri15K};518dSg2zns^@o&J3 z<&XwwC%91x9)IWG?t3Kg#r>IZhwyKA-2-ZRya;@86B3{SFA5;q0=lPy8nZz!E-VBq zhZxfhHZ0(UHaJ>Ak=?+*-M1kSrq~(M@C$e`3q0}*QgDWUyK4i;k|TjHQXp1?{LvfQ z0P50#t=|#&;@1qYEuhfh-|l)Q;Dsf)F9d3cp8?wd@$zMeGLQi;K?j6`TH&r!0$%Kf zh(r1(Q$c%>2`I?1Tw`n_Fjs zUU)!48+4*>uj>(zht34PaE3R5&wx@5C{_$08o^Gy2bx;l4~|~Yc7#*lF8_PR7k@T_ zQjYJLv`*g_FW!SWp+~^Ixknp8DaUmS$oxN`JfIWwLJwjhD4t(jnhp*pNSELD9hS86 zU?aA)@(Q94WCl`Nc>;-#fEU$}%ngZTq_nabrVSh{;K+Ir_+l+gn+rr6JgqF54|W~I z7+6~Q4=y14w1Kt4jG74e&3XM+SmP8$c-lEC4#9 z+Ys4oaP1ZJVl7Mz)UECXX$7T}BS9}%kR^Q21iom730w$zu{{%7oRv6(2IpKI0$!wK z!GsLby1~_7TBq-s7qRRA|A(FWb>xNrdguiNX`SGd{K9TMsP)SFvX7a80ov>I1#PEj zf%H1xF}{#l4@%#mXVN-DAH3iPb6k&r$G4c)!wNZYR}6fg(u05(uOaRPg$+_)^yw5> zh#f%$W5HRN;2B7-6Ea9~BjCj{h#{beebF@)rs@Vi^Z?r{0WVr0DxiH)@Gkr_K`-*) zqGu4+WWsBuGqBhSLpTT8>wM4n!f+kPtKdrD#S0ZM2V4m}c_F?INJsKa;ETO*&z@2c7H%4w@Hv5EYP60Uw11J)wbrJFK9C?oUVV zan4u=O1tnL=a(1iYeCI&Uqp}d%L|dUpk@3F{M%gv0$!x2!xEcex35QF7DF%Oj3&_8 zDF%VPQ$g((kY7Ltjtd07s0aadLlr#udYLp_3eA(ztVfI5yry{#bSpi&ZafVn`> zi?X1Ilu~Yd|K0x_K{T zU^+n^SjcGFm!KDHFi}tk)^$xlx32-HH~6A24dyXWhxJSA0Z<3lcSGw*PzM&&W&m|y zT{pBID2)Qm3U-6?h2V=Ht3hoxnY3idHT?PET{)*{pQ6x zedKL}O zD21W5D1~8KQ3}KIq7;VO;(?tfh0RDo&Ql6QKTzqo>kQED&KGM}f^wp(O!E(cI`NEt z4p3KSDX1&6bPmId2mIi!Oco0$n}o^)y@;OxE_%QP#NmE0JFU}o4gY@79g`xy4Kt=N z1Z6O&FfhDuod}a%0n+R$6YydZTmxu6-vrVJ08QsHyikX6UVw*CUYMVfXJ|eGs!R`n zFXqc&FkoPKVYm{M;2;hBtKbd?OTdd7@NgSTr|S{$SzQMLU(5nq4W41|c0CgC;ud&{ zl_TKAK}Z9y)Ab1GP%fr!Pz!f0r0Edw;t2TgM3#UTw;|dgMO>%~sF(p?-zgLL!T@sQ zJE%4B;tC`vI$e)|Epc4{@-NiIz6S!kL3MTlq#YRWq8)DL6Y$NTkedwnU)1-3bU_w@ zC_~tws;?JvPt%jY7k%K#4bZ;bC*Vfolb{!;;lT(N0kbtG-AV!K$$*Z&KpdIMzd!VV^{F~R=#Hdjn?{Bbrq@ibuY*Sc!3$F{mi+&*K2;08 z$OTfxJPCXe1+fYoDt2&BJb8Tx)L(J^@xp5P|Nj$U2MK`}gM@y8UJD4iAQH4YLB{%E ztvF~?7ihN~^M!6-fo7YD5Vu?e`3Q7CEi>Gcf6}_a+eJUTxW5eA36%+ak(>xETKQXE zfG%%gcySRN-z=T3XR;Vx9D#98WHG$h4&yAy`Uja*pSm2Jwm>6r;BZ3U=^$Z!supzZ z#}DwvoW`IREa1KqOF%bh9_RZqumvd{HTzzbC* z`?x`?beaz`fp!gomizMWca;EjFq^=~^!aXqtY!i2)R_?Yf(O!G40vG-4t8jY3q1fz zr=VS-X98bjg3}^Tr|TKW1Pu5T0gmpFMwXx#XJP663pl2r+98A2pj3Mz=!F(c`-zvy zu=&d$FG`mF|KD7DhM|-8ML?{I&bfVXHOJH~CiJ)#!-)t|Wu>!hk z)fcpv?o7~&Um%l?a0I+?gt_GfcxoTiC|?4)CV_uDsGGGJybKML^q2HP=32o$oh5-U zIKkaau=3aZyZ+aM24q5)ytuRk+=6&<3(^t?dmnb-?hDawSQH!p#V^KY?E|0-!e28% zE`EpHV(=v3MLi_qz|F*DxCxMh_r3(Z2#AL#xmBPUmF=Lj^|t%|34F1v3uYZ?o6L{a zOZ< zr_=QXx`GRV-Jn%?S!fFC6~SZZ;FPtUB{bpV1P0KtOMx#O;R;_@X7PZ}M|<(M6XtMS z_D92YLG2gGU|?Wp0G;miB7PEBH`r~Vds;8mD`qr+=doRX@NegF1z8Po<1ui+f;<6A zCE$~oCxgpK@cIsh7h>R44oYB6 z3)TR-scr{c>dT9oMW6~5a8?1OA!tH`=M-p0 zNJLYBGb32Q6(TailQx*caoHaP*9Em7DIL7ilAAv7CA;&#|tFBy#8c+%Z_qJc;AjQk}&^4Kh1+^cVI6wuoB`iRoB{;m4^!>rVUBnkuN;Lof-v3l&sN9>@X}WOqO%9_Z8-SJ3*GX0Q*y8G0p* zeIe+@TnHO9>DKECUKh0mr0qb^i^6>QvV$Vp8HUc}D@Rk_?53}K*CHb9F|_CjJN z;6(_etO-%gHZiCr|HoTpzCpGby-=A0syBRP zntuw^iD!J^WMIfR0qTfZEStmdBAf}_5z7G225xud3Fz(B`1b#Q;EQuI;DfUeJ+!?| z(0Dx%@In#71}$^L(nDJekLf9(q8`*k`_Ks13|b;`+!ZuQ$MB+eHh8>4A@IfGJ+MC6 z8l*ni+}YrkFDPbSID(^`CE&#i@L&{6r|SlApKMLw3pQ{BLi=PJ0$#X5Rz3&3(1jIt z8=!r%4S_Et!38TvzzYM|!5Hok?V!;ue$X+w;8qm4ZhkQbazqojuyTNSsnc~suj`e7 zZr=@ops|Dc7aiaQKcJ+0hktvhMo(b{uY%m2#qi=gj0YZ-y%O|d8bkop2?X`K zK%J~$cxc`M3He?Ld{KZ<1?^=0c;Pea|Nkt|)^3Y{7Y3oQbS|9M?fV0KaJSAZ&}K1fEUZ^!NCElrr|DanhDC>pxbg~f?lwOK)u4>au2kR$Q5*~ zKEsQ=ng9PEcLm-0#PA{s%nc%e5>DmMCRfYBhy|@QSVxVYy;RJW{0#FC4@gc-2-!HGZL1#KP zA7TRCL;>ni^6&QrH)|jrs?Y_XQvM69Bexrt+8%)e2~<$6;ot5GzETi0%(o-xg#@@0 z!vk7730k%X+D;F0uuB(c`~jwYF|u}FaC?4DP&cToy$Nm=^K`myfpn-qbFyDvD9-?O zsCF=v@*Z~uuf=(xIOG5S3C*=zz(QLzSZcK0lyqFH&f(lCT6MB8Y3tJ}yy+{JDjstb5CiH^K9Z=$cNp6LB zF|E^e!fXB=kUo{`gco(wLAy9W4*u|>2*d`ZP>d7xz=6xk0_{A3uXel>0E-`R6{A)M zOJ8?D&A@I~fo7Wt4E!w)puL0peLsL!4#|Mnpkp;bYgGbXB-g^Ud;!ftfEol1f$&5K zX)QwfgF0QFQK1iUatQvhxdOaUhqq`u38 zpchK$630-rGv#(&`9on*Dn_zbhZk7`~SajFNjRwWMC*} zdd>EtLyV1K0_c=ukZ4+Gk0{7xFFs8Hm7Ki)AsrXj4{6QdV)6s%Kp0T^xdZlU=ogsF zHi4T;5U)bUN7jH2DEh*`eTpy0z@QflFwY$b$l`yos0!|J*u5SQ4c(yv-~)svLbKkB z4)E$skXOMYeNTd3n1S!ygLoC}wv-#Rs6H_!2AFeU4Se4jAjMyTUZlYl zuiyt~33vnF_e&snXVw*Pjss-{bOoScrUyYUlF<}^^0V(0Xkv#CgFFa)VFgzR$<|H*f3Bb^I~y7sA>o81$Y5YbT6Q5oL=zn4}H=2 z3)I!9b>`pi`T`!n{M$o$f?k}4SO`i_{QE%{3P1|S5=fed3V{lZAdm&Gmu5k_huvVC z177&R7EBn!fi)>Ku-UM`4zzb(^&fo}m@d}(QSU~fXolGy*fJ}jO6H{iVFuaHn26q!77dYG( z25pW6_2#VKyjUa*=`upr#OBOK+@o}AHeyZe?%9ZY8+Oi4VE`opP!icVJB0z%xdZhj zSIkE0OQu#7#1|I?G88j_S%t1eMfpX3Md>)YnBe~96E1N7QU-Jx5NLBA#@W!|^G!fU zyLW@4Xa+yHSJ>O?_4WV%&Q^u5|NmzR_V#Lg{r^9(8+4IgIYa?OS1(9D5UepCBAzAK z?Wz!vCCIg6zGF@mP!K|KwSX+2m>%Mt_~*QCO~y{X9zbhTIpRL%AifiLzz5Afc9 zq1#miY<1KxF^1+NB9PM;_qz&o`*QGa4{`h#^kM_J5z7I-iMMeX69dDGeLesGPXJ%& zl6~lXH`u4ptCGIFSk&|XKgeZZUuFrsSX2b@C*ISubKCiuq9je+NW)cc=pY_NE0O<^0=0 z2W}fc6>q-~lqCQ%>I4%gI5h>prg!@)@Nb_8QVyCc(g}FM2vdF{5bCc6X3$B|-z5~&REl4fv1dFTqwwfrrzpu-CxGNA%N zFVYb*+aTk^0s&x+FKP>+fqnv1GlLx6>l2_7_`*~KcLo|Z=?%?zWG0qhx3To{rG#^p{)rFwM1~&YK z8pJE$EzIDRI0AtXeY{Y8pzNdo4r)lE4eEB42zc@T8`vSB3L-NWnl_KQfV4PNp1o705x!V`2bR0 zf^y@|9oWX>z#$1QFEhA65zm9WymW^sfan63B9QV@A0m!gUarc+42~D95S87bh`ht! zx(bv`_xtMb?+-QTbrJj@kj2>R`vr0>h(OSbM2JC11x2^33jh8NP$Aj;k}>JK9aJa@K!iZi+X*Qj=e2`UG5GdM1^(?FpfWS? zg(qb40+QH4LNChO|Nox=3P^_R6Yn7jCJlB&U35EWg*JG`N+2jp;6-#U#QWPpD-L~S z0wKzqUnzi6s7~_>#()V3R6&!2*A`Mm(nb(b-x6ZoY%At^zXy zURZ(~q#U5Zh#%ddBH-SQDx}HN*;?@pbP7lVC=eh9bx#Eu5cFa)*e)KJd9D%x-Mt{0 zz!xtejo$!><3+kb!!lPPb$e%P3E1|jpuhrE`w9Wwy&x+BUmS)kE)96G3(}y6YUcoJ zp9aw$@In^c5odwfiee7P=)f1%FmsBqnBxaC=PIO;-`Sc2x*vWjhz#n6hDW9yELOB2 zV-6zS;9vlCB6yoYq3>$|x*tv>ty9F~#p@MxZO7LoA&<+=n;(Z{+ zpc2v7An?V(3~(|^>vT1EtpPfM26E7QOK1-$o+md!7Df7g2z)UeuJXgng@6D5&!`Ro zO>l*p1Z6ZltO|MY9US63X`QVt-yphNbpl>&gzM7b2OTR5o~n2;8zu@)upqa9YT8z~ zC@7PF(?0gGJn+HspyS@alP>(*T@3@0YahDZU_ofG;jQ-Utc{ z(4{06;0r+bw}TxT@Io#N90Z-MHQ;2?3rZHC7Lr0xH&`g(#TxL`El0qM#gG&UO{I`! z1^nQY%M$S78O#OzExRC0moS!465Gkh==97+*9%WI)wlx35MT z=$L62Thisn_6IZ6qJa*8?ZJ{RB&S2< zIz<{^Y-s=`BhZpA1JF%_8fl$8PA~c!AkGE_^5itQvtOqC1La3o14!{XXJrb*3l&zR z;&VAGsQ3hxde(1VWU)eu&ot2HK87VLQy4(;0_qcPSee35m0FZv3~s4FN=$Hj1*9{) zcQ43`JMos6aSiC@<(+zv(?U_o%Nwa+r-Pb|FJxfe04KlZS_=mL)@&9A2FT*P*Pvr5 zP;Q_G-G>1xIbA@-BckLqwL&C0O^_5MJRv3LYtV`gzAWgC&5-DQVGOYtad7zSoe>*tbKvN|Of!$Lm^q+A zvm0E1!i#=AOIWmMLGqReq0!$Pf2OzhAdP`n#QBZyXuMYzkofz|=;3LM$ zK;`3hSMb(4gTNQL=CA-`eHjgs+8_EQts7DWfM!2m^wj+SpT*C=zZX=p2fmmKX)?nK zOqBW$QWRA~TFU`1iXcj%X%kY9-UIuVCE&$Yn7yz9Gt>Yjv_(PIf|`Q{K`$he;DHTE zSdhz8vKU|ZLuB~(`x5VGk;@9wZ_(Ztn$!PGI*`kSl{;9ECUznx(** z7kbe{i6|_aFoIJYEWz&g1vgH>bu_4cZLS6-9#xRth{`w)YCEW$PeR!KGVdQ~PlBt# z%bB3%f1q(geo!{%-|njt_`(vR5L7a}sD-e}YtAh&MMNgC&AByI;9P;VIR{B^*qd`t zAVCie!0kxQxh!z7p*H8jGQlx{QYN7`=Z=6=F}zGdYR*Z)%>&&y1}Wp%VCI3cEdO?t zWC$vg0$+Rq&vtPHym$?1AfqJ1IhLLa#~CsPSZR+!B>5vWR(X2tso(2@j3{_UXj_9+e=#;`Ie z^aDzB?nnhBUx1o(C*UfvH|I3KA&y)oftquV;JT2Tb7x?p@G=S1oZAK$1?4&tn{zjf zU;&1sIrpO+6l$Ov3avTkp8yU5Sm}hNId>PfJmCr?1)((OApK{SfEVJ%P#3^TCtuX& zTzNS(Fbx7!B7xNRS&T0>LS&Geb9PXTpgP0}A`RAv)|^v^HA_Jq8knh& z&KA5mmkdsOu%rtv!9)$3)*~0bZg?JgL(^mlMWBC3Ee34-QjgAuVP7BbY&a3di z10Ou-`X%7Sr)ZduzQDR0UxHrfK>P_Eg5(H%Q4L=j!2zx-|A5+jpnV{SD^Qz%GV}L> zj`anv0q5WD$`SBli$2T^MxdkfKt;X;xc`-13QCN=e?Th}99~Xl0QD+=1ibhHYt*^^ zcPHaxl*1QCqmTmMRRPpK6bXD04-o~`Y~X!zFXll6 zK<6=l?*;{*)u34d4h+z(a4%}%3Z8&lAWYak%*Ze{h6DwZ{cKOU}&y2VJK0AY>eLzx;e@O+}C`uN*C%B z{+36ejsXMm65+Lw`o7ck17r;!c+EOw2GIzzyrR?f4QLXv^<*7riswZTcu^}GB$>eF zYGHC80$%(|0sE-a^#j;NqM*dr4cbV^;sri#VOJ4o-q80=U^l3J`Ul~<#o(SRXymCo zR0Y!iD}uxfsQ8~80X7yiGzBqHpxLI2p-vQb)YXr`7Z)J00P+mvnmo{=rdm# zh$}(2uf7dOawRAd1VCLfkSjwUfO6)SfEQW_H$XxgeeC~?C5 z&fofj5iN0oEfYv8%hlJprfEOR z#oeZSP~4qn0Nv2@0UFN`CvreqGpz^sdqI~g^Y2G&C-PZzc%CH2y(8h2mC&;0%L3O(hXs8B~RiETRybsE%FGAqnf4TTC zsOJH?aNQT2%usiFHUCJd1s4#Y`V11@v-3bLhim-XU3KD{k7$6#zds{Y9N_u_XZ|UZiTkvJ$Mmn4Al*FFHULLhFm3U~t%i;wdZT#l2jxe-Y-$!p(u!7d5&6 z|Gy~D1!YNaN&^)(`0I-*b*NLY)fcspMh>Wm1#fzRlwjb}hzY!+60{Wpv%a_nDXFm5 z7pEYp8)tpdm4jSgoI$t_v%ZMWfy4|b5he$L0}7l6A+7{@9aIv-%h?5xSO9qjM}1L; zPyw$mxFCK(sV}}kN^Ee!1*tEdWP@@u*7{;+HpG>noVYg-$(8Uj6XZ%rY4;`I#V<&V zgIx)aLX`UA20{hAzDR+DDzqGd)aVDGZ4F3pfXW;@uq)B(i=B`b7AT29>Wd7xBMH_Q zTafAtLx?tzIgt9IK^2;^N?2cZgX)X>S^xjPxRnJ;oN&MMw`QX^W{~QOyDCs4_*+0D zqOcYQSOvVkh{!^%FLpqZ0&0CxoCVH0pe+U9rVr?h`4@JO#yKdgp+}D>1iZ)$0LKx? zAK)g7BqV%5>(j1)8k#(TFWg{CE`VlL|G>r`-$Qaszza8+&-q&*m5i$ncn3DDp|dO# zk|aP0ca=ZbI%vX0t&HlR>OduZ6OuYm+ck^v#eRqosIvj~PCmqbq-5!v2}+irL*u{) zh=9w!7acHdpv4Oxf?ilav>|&i6{ZB$gM3hxFH#|G14I>t=E0*G2oIk0L-8P@=wAR; z1oGVyBt=l)J%k9sefJQYoLK^1bYSGZvPmUebDLpq|^09r|X+e z*AJbpUpifXbh`e5?d3U`4mxGVRiyPmi7~j70Ja^qf&^_8vOZWV430uqiDN7R3@<9d z)?ZEQ_LTvh>;dXOVrb$))x`M11)}LiPWu1<&9xj1{4G}@>w$R!L7Rd=bNzW@!p|u^k+fpi4DA1ip}hv_v{xKfK-tT7U>T=;E0V*lD187^J%y z(pLug95u2)>mxz4CH0_=4hyWA=hF2j;6*UR4$uJ?a0!;KfEU&f@c{6q=XtR5{td{P zpi+gS+h+nx;0sZhD$u6C3KUhKk_)t(|3T1;_mGBZ0H}@m;t@>M2as8ylAEL3rAsE@ z#YvbdQ13$rp^6E-qi{7u7Q9LyWV8hTJ`u*&OQoPSd7%A-vmrSRQkDMc4wc~F$HLWm zpi~&NQWk7NCd|kOps)fRdP1z8Q7cKVHL&$(AsUVYfa#qKnr1O1R-H3ag2qF z@dZaJcq7aMhFa*+6cWc+7#UuCOo0jWrFDmbj=1^p;x0(+Wh&^paM1F2nSdAC-tefy z9bfX8@wFK4Peky6;;S1X4vDXKu#z1;zM$n%060KSAXG7dyRYsLGr(aCiWpcJg2LGM zP2dZ2NShHH#-KzX!M~43p!H;_FlgO1*aTL12tor25(}W)G(lJ0ya{>{472nB=;9i1 zPxAs?2o}a*!;i5DFuqul3=2%8pl5i|3le^L6g1xn?$d)pp7BL_GN{T7{n2`R3x!jS_{$i z;%XACSlWYLEY0!&Cm?XKv`z+IEKNZaOBqRsVrdUVHKkb@_>T@Ie<31(v{W5k&PGa_~=3 zx68pF0WT^cwgm;e$cL~xUGH>;J^;( zyikKE0Vilsp#ln&BOv2JD=(qf0XxAAf6^HW+6fJA#e^KR0V%UU`2985D5&2-KJWIG zNCTBopcAjbqfZ$O1q=)?4uhKpJdk`E1~waXKN85{p$~$(UGG2^G=B(u!RZc-;0xew z)}V6i#na0$r+3SOqFkW$KnYSM$oQfp0hHS0KoQj)3M!@;pr_FMcoCWK|Nn~+ko?R1 ze~{ft7`22<^9x2$lz>j_g_uE7lsvlya-Kj?z>7N&7Fv|3fkm-I2`}7VlW&5IfOMBY zQGzuP>%c7=XdnuLLmo#U9&yDC#08f?R)FH)4V-T<0#QF6XCR8i|NsAjA0+>BFSzsp zC0kH9Grss42P%DBf3zL|l|Gjslup=tgZ(e+T3@v@Y?IEA=-r6lY zg+V6*g9@Y1tB*tXtL}^Y|34!wje()pbw>bbNECFC*-nV3L7mzcx{!u7sQ12u8L~C~ z&5H_-#3KHxzvH!W&Sl{zu@82jD#v65vtzZdV@gHikbCL!n!r-voh{p>5{~ zeDTE@9R8ra+MwG+S})a$X9R(c?^*#miC6-3e3#-8ZieO~JXxIJli*)0aslfAc@uJO z>O^q$z!LDn0z8Gy67b@_8%PP{QqRe73yx&uIfJGqKu22T!ku#@ixspE6Li8>21F^S z!}3B0p@4sX=#kb-wUEOCj=V661x?=7Lr#`$6^Df(|E_v)IENm2Apla*?Ft&zKLXm} z!4UiZe-?X2Z6(b1d`LYS@PZ8zyq&HGvKX@@yIl_iym$-|3V87g>;i}<&N+cR1j-jD zK>N%8b%!1Zdhs$A+!G6UaRI#6i6!90bBGp5AVa$AX98a|x_~uzhw`L#GQB8{0Z%S~ zdtfI5Uz9*h?hX|INruJz|33k;I%v(=6owaU55dz(%}0E!-@J%?2uYjZv(>kpO=0)} zJ$p{*TnfV*D4Y9S3c~{^oB14KugTA|DGWQHXA*oki@c8{FSW=suPi>5Ar-;`(@-vA zfe|=AaG*{^f#)W`XZYC#g1iV?p8#DS06M5AR3NAubjrm-NQ=7@H1P;JI`K!)i+7$N z^&B7}kcxb82!Xcl`~kJ`Ye73k{sg{|KnU}12TjLtSigA@`~VUPpbUwG!S0iQwhu6S zE^ojMefDV3HuEo_1IS;){bB&fs%DMXj;q~+*{`9bp67=&sU`N zWQk~R=$jzWy=-3sUdX{E!P7f3fiG$x@d(PO{QE;?Ae+#@9V5^HHF$?9=wu<#Ow14K zQ#JA+J75JksCjrt6qb-dC#Ri+EDA2KhMkr01C;whe*}T71D!-<>i~7_iNF^NAx+?b z7Z#A-M!<`Ba7F?jlaMhhl7ZpHJa}XFN4Kj4s6fa_Q)6Iw(FPF*c^a}?`l&tGTu|NE z$@t=UBs@9VTu5PfQGO4U9Gj0wSigC3`W_@6p!1n77a(a6R7eF}KuTZGI12546MGoS z22o`21Nry6a`5l><*`0k!gQSBHXIPQ9d zfq{Xs)Ah!SOQ32k{6HGNuLELD5&-Wa-Q4YZrQ7#Lr|XeU-xDt) z{(&01Dh&KBOdJdhpedNCpp$?>6OQ1^3|@%;`~Uxi(7*rxGeBz=`L~0XSv?knSuePY zfeCboL+G6s@BV@+a7c-M=fwjM4`jVBPv8q;_e+7hFK+x`GnP6Y%B( z@N`}_NSUunT6Z8%S|`{aFCxIl3b{T3U4X*BJ&-5p#kRlTBEH*KC9Ttu=Y=^)PpAt2 zb|)T?@lOI@u-ZZc3mgDx-QfEnK<7n(`i!V6$-sLyocOFy)EYtN+4qBXcdB%IaPV&z z2@HCXWdk+}G{Vpws?r_Ak=DuL_2S4MP)KbCyF2>?Ls~c3scD^4ctN*jyjTj7KHdsS zFrZcT&ETZN0^a@Jb)A)Ag7JawUXWy3XA49_$sbS=*a0dIyF)uVL#Mnb`t$$)i(HU7 zponw@AA8~Z1#*ty7f@${f4}P!P@D5G3j;&9uS#Gqm!IvX+hjs*Y zgHBjK2@&q~X1KqA1kV(85U~zD@!@oat4_v$fF8*T|!=L~E(>g=nWQl_k zD5&UN^c(D2a4TgSxE^B(c=7iPsL9F_6!7BlaS)3qC;&8F2Dk{> zh=Q4OA?QUO%$%)ob7sTMalH`$zT;dI*&P1up)VQ_NxYlP&>4CL)N*tM<#*7TftP+k z-FG4A#W6l;c<{G?$`=0pu5Y@1&!q8h6M^rM&OYG+zPb0{BbM$KL5=VU3^RiQ;3dS? zbEs}-dT|)sQDq5u!3B5fhhrc`$X>2P(FR&*^(XK}Bsf?>u?9ZP4zwJ_4KDN}19Uk^ z2BdWi8ZU~r1VWgf!_c;PyD8a(GL>^WW?|8xc6SOc#hJQa(>wyy1mmQ1@46ju|DadzE;EM(e zu-8DvPRTX;Ua7W(+pbQ z@TT=-y({P(A<+1q2E<&b_kVyUnEwR55JHH)5QDT3K!KXY_~M5-%%~Tyh5128reyKH zc#II_2i>=vC6LA6?K`JiFbM3vX3zmK=OM>;2fR>&G()<5=X5f@&;&Ujy!jC1QAi>2 zV#yD1YMjw}pv07azwZI~CNgQTv%t;k?$9aSE>o8Tyx1NIDn>ZEeW!G~^e%aE<2$IO z&&afkbvp69$OLZ@a$sP{V($hYs(K{oMd)ErIDkT=`y`0P z5%9tZ(jEwS!3pu_%cE=z3@;C`LDv4a+JLSRkOLWosPo@*LW`XeLGY&Ow9e2wFMfRm z)nu?b{|$%-9-e>k;=xx)H9yq_WY#4R??75-s}G2G1hiKjbcRt{r|**&+dy)l3uqp^ zSPf!=lsSNu%>@|;$_Jn(M1d(d5I`qOg3oYz()(tM&rf&ub`0t-zT61 zw4cSR^*|};9xw>k#S4^WL5=XEVDp{?zPMllHxDEf`XuPZT@IKJ`N35)$gUR>AV+}q z)iZ$CXK{kKpjJ{SxK4Hb(tLmk)T#p2@cjEjpID#b@BIuKH3Xll18N002EAYbyB(C6 z{y^dzyeXY2=*4TWBR~>A!1eT-7c0N~{|^em-T+Vt%>Du$OymiA@g8gl?97TUfiL19 z&JB2>3d<>=4bQH30$zMEhWf4519UbFq;~of_+k(Eb~nh8(igye8_@braOnrC<^CQ3 zr4CS$538NJPk=;VB`DY&PzhfGGv`3Siw>AM=Z}Kag3Q?pH^=uzV0Y-1pcl@_=J0PX zeE~XC670Bu7wX_J;NahXqIU|P#4F6Y?;7|{G>EHDu|uPXzhyUgflMnXoDM$VLaqT{ zqeMKe^8DC^~b#p zVL|l(Bm_?MfiFT?p^;qT4GLy(I0e0shp0uX2ssg=FL=QtH5|~2@Vx=lY;c+LT9SV| z#Govm7gtcE`1gZV1b`Y`y`a)6@Wo+BvpwL26u5W<9W?-w$oLORbKAj1TF{GmAHlUC zs0I4+6QmA;RVa`5!opP&T(xinyjTFvlc4tY!!1@Ask=7T` zOg#s9QCu0w`q!7!x?4ehfDE)rJWOGDG50KJWFtPV@d&7$Z2jiNo3oJN4K@Y_28D+y z3`_q1|Ifj|z)<}Va_0kRoTK7l3PT5UOs(`GatJ8M%dIwx zpoPE1BG7pn@BaUPG4ma?1`r5(@m3#}qF1bjY;SJevHJgiSgJ7rY03m?N_huLI-ngx z0zogfLv%s%O)p4M;ET_Uury}^&S4;9f?n*^g_#fHgCtr($^%}s=)ojF{MSpt71R-s z8!n}FPTc@vfGX`RtN;Ih@#5|O|1Tbchi$F&YrXB!k zUHcYP#PEZI0xU2GBmf=|IQWp^cnhz>BFKTL;J!`vA%^2EtT3S$4InG4--7n(D?t1I zR~CZGQdiJLFba^a|89_zjzA89apVCXrvd5piv+&lhx`7*!vFtYD1gk9200+Ddn!mI zt#c~a_d;pi;9yAu&$5A;{QJS-3Nmj$crd^MJk-a(AFQL>RRKO85TyeSNrZ-O=#aq1 zHz2<+0k=CKLjoYzgN6itECiheyJz8l@YN&DdqFJ7U_kA0=wJXy2s9V~Qu-qO&Hw)| zlHPzcu|UJCdn$<4IaOfM|Nk%CLGn&-Ajt}}KSd1YrW3tWe1EL}|G#tUn$`dR_qN_y z{r`W!i|_Z||8G9R(tPrNT4%2g$OKl9TS09gu=idI^6v+S0=OjvWB6HCP0Wy};h74;KFaAJp3la&;&n3xywC-gouI-Vl(zY|_kv6U?K}l#x1bmM{%J8Z9|2A6$Uw&- zT0!apUbJd~BQ>oP%;(?V3-(AT59DACc5RR>sNe@>Z~pz@FzklOz69$9$%67cB#=*l zGQ)ybpf=1@kRH&%=%CZW`1eDDh=+f_h-2%e8cY8Dt)Sd@@j++nj)kD35|Mp&x13^&;3df)q-7mrE z08|#fsQ(L%PW~3i-Q~TY*yP_o6%_oUZg|Z z(A^8lWNDp@-Qe8T{E7*Z?Z7HQt`2x%i(lo7+86)-zo>WtsaRV5K#Lx?flfaI4T69Qub>yf5N)8wvI~0oaUASW$T$eN zIO}ei3M$0{Uc`EUN=}aMUQoH-+0qLVeNh229~6g>^6|xwXJ8k>j0TmR@WLkt*=SIK z2{)PvW;93?X0$BG=$CxI{{Me@gq49I15%@hN(8;Q{1cj&N<_dlSXyT*sBC?4`zfea z;|I4Fzyha00^q9S0H~7P{q+BTu!igt44|o0@VPIYMbFd! z|6jC&i~v*7sSp>gUe^7Z;A;v!rclqyg zTO|Q<6v!mZN@4@J6b6y-QrKcYs1!cgJryJhuOyV7fJDT925rIMHg>OH}lN<94g!J{%LwZs~*`#>bzeKYof+;^$F6(kC;C7M8XLYo<& zZP=>;(YU;KLr z_5r8{TKNC}%WlxTWYt4Z6CYL$fy43v2lEB~{k@<}a_}LjKAOS>2}^Jdl*I?Htd$xM zg6g6`{{3K?>_aN7psEN|H-X&BzaQ+toj0t))Mf^ zY^@;CfEOhS;LrfooBZ3srUdbC2bVPgFCq|fFaAJQ_=6Hi7UK&$hzzK$vGD(Y(0~QR zxGbI*$|zEx$`jO(1~qV|g38gL7ebIWe87uLcoPUD0UfYt1+fEO@WKNSRBgX>`~Ckv z%x6MipMgrF3#-8)3hDuZ91Y?IyjUy`_E1`9>y_1@jsqyVd_@9ZL_^{V+&3z@TBQv@Cs0heZ=Lh7|pS~s}o1liIGW7#LU-QLCdqJg7gHvV0i#eDWEzp4J6zP5)ORv_C8n`ATEPR@oxtQUciemIpn|um*}v-0C%V$_uqk;{QI|pq`-SZK+{+J`=^2;K>HN` zesIRqJ`woh`8|lQ_Mfo+SnI&QKU4tfa8Nezm1us+2v-c1&^`fLUC}KP0BT5s>bDoh z_dtyj(Bv~HO2CC5X7?7f4U>OA*b~|pU}j#hK2_@ravIp4si52sb{)vs+9yCQ{}tde z9Yit&K+kYLvIA76pX{Cr5(U*cU`MRG3u-JhK&^mAIH+66`B0CFbC6AwS9Fo4=Qa z(m)3l>VAL~Rw6qYm>3wqcRzXwyfD233V43d2%$(?r=!3N6_7x8sEF}_<4z#IFoI^5 z^zVRjK6sVGi)2VJgAH&JdGX~o{Ay>{A1|KW1`P-Lituj_6aj5B{t@t^`8~{LTi9|H zUy<%Wo}g|=j(``c8$fwTpxalZ(~+Yykmtpb+YqZj1MD0!;1~t1!Fs(4G%6|5?ZFe+ z9l#OvqILyHA87P?^EwcVBjAM1cuh39Qh3k$R+mVYe+yLb`U(Vsbvg+Jyx_eJ&e@=w$J4rfc|glVL9Psa1G&EB4QS?{f4}b$&|MDQ z%nS@^-Jx$l%T!*Z+=7H3XlnU|BrNXR?plx_A{{|Z`w{fw@J)ni*TJ1ymVg&>aMM_@nbwbH+6%dx|Np;` zya|e>&-wbI_X2F0#)}vGZ-7(Q3mlVF zh-A)&<`8fW0!>wkbUX0`bbE0GzIeO_)#opYZh+SR+<+tlPEEb#NGf&03By>qR$26S%l>WP0)D8mJnL`U6>yfQX(ei$T!?DyX? zFD8NmAC&rUfb%;OXzkgJz!#km6G0^csF><@y#bnGnS2c##CPJGkJwnhd7-iuUY<0* zIl#aGo?8G-e(W?rEmpt_*uX6e&|KpSpKGA;-)o>kF|9N7$_txo@Kt@FfneTO&=gz3 z53V25I(@IakO27!a<0i-a1V*4({&H1{RcWsJ{l78X`QYsAVtHAmskJ)pKu&JwF|1r zn)iZcpdrK6=QcoVeUMOEr;q3YSYI5}l@8%u@M6tX(0L+PA*t4tC*Vc3C^QaF1ip}m zb-_Rfn7>Gb$beR5r-3F=J6$il$h`^*C0_|pTi{I43p<1o(2@1vnhU&ikW~t{bnp(? z1! z`YWKC26+)7$f=+ig9?z76F}0(TV0^b#+&zoSdfTtT@Q+g1Kr@sPSCsoScCo*(3Ama zeZ~X*9)=eRApNgnz)L-{4>5FtC)b+yf>Ig8l>h5MrksS$9QKHUO?i14GBf4clGg3p zlGf=v;l;Jf|Npr<`gjAX(p=wwCl4UO0a_FYnl|_Znl|_X zin`w3od2MSgU|^lRRY52GMwt!O6grFBcAQCfreOwoG z`py9FRPJ`20a|YTqDKfC$F48U?+FNe z@f0i$Dhogjj}P!Ai)Z2D@Fj~6UUXanR~vs?57a^Km^~Btf(5J)RJfl39gx*}2_gl$ zWBH{Z%!y|}Cm}Q*1g|diU6aKEUS9`VUmftGbh$viM%qKpYQp7g&W3q}d57fS9^n z_XNCn4IY9456isphbRWE(8}WH-yXUn=!FeL2-Jw^2CdP118GZwZ3x`~YPXyTcyU|+ z9zvjE4Yb;_1@1ifqQ*kF5K3j~`XJy%8^i#RD_=xi1cxN3YI!*mG(?Ubd?znJ$0dIR zz0gHC53;h+24WIunKWoEQT8Df{{6lidZ&0ufC4&n3pgAPK49qf-NL_Jgb_1bz2OEx z!u7=~aCa6F6a3pjdvdm*DFX-YdB~avaNxLtFTMK94-OfS$G|GqN`v{J;AaL0e-0#` zK?+`6fG7qBKOZFc_d&X((}|Whn@*~agGn{9nd;bP{e}{Hrfpr0-fdqD*{>{Lvu5K3+RA% zP>Tcj*taA>qWo|6^IZhoWau#p)>fmGX=bm1qHzoaAWJmLzt2aK`*}Yf<4ylI|H=d zBm5kwQL+Fw;Q%V`f?hm22M-cU(9$({t2`2H4md~g?+=~8zuhHtLBI=Ueeg^J|9;;I zX`L><3tljR3U z03{9hvQ5w`%nKlq7xf@5{QG@Rw4Ma5%?v%023lQ|2@(bM__}>>fYzc!o&{CRGHKne zCqNA;ud|?3BfwB1068!24rs}XDM(LqtpYo+fKRzuo(p!F&jm{S=RK-Z;cv!pUifL81pEU64F zP_`;dDg&s>1C28%v7|D9;u_QnlVwR|0M&{hwggKmXsHU$^(qNb3=A)dS3}mTELi&g z|IQg=xYny2SPxyVvS8juI1PJ>R2 z0t+GEX;{7}Y_3soA@AWB2=?-d5@8^OUxnU_Zm|8$;j-LW0LC~@o zIY!VJj6zzs6XYTb^{r~^q(L4|X(%ftXG5PoRf+$3z(*m|w1uTrTSY<6I*arv=u%;)= zDNvF|UaSIgJgDjE0rJGtli)tU3V6hUSdfT2wFDY*AR$o1fi-M735sZ$_5c5ao1RNS z`d@x#U|@hnX=m$_rT_mo?*)+%gBrmGo$Q_p5&{h&f(^<(32A+{hJb^j7ff~bCV*V! zfAatT7hZ6iz|BzWlZa#k8e!=MZK0S7O4ctFP9mlz!4(o{%(PR4;{`j&b^QB%ML_dT z+g-f=fYxinIR64(96t$;F#i1~T2GdWg60ZBMS@;zqFpr9NZq_N$YL} zSqGkjTzdjM>ETZSbI09eDvO~kL6_hvmw@(EX5THgk$kc!rez#$z z3v7K(FGyYBi>GWT`u0x+<-^uXC1U*h!9D~Xro#h1<5BxKI0jn53J!o2^nyGDT5HGy zUTeq&QP2wxm{8~nA62lsSU{8BAcyY<>j9?@(8W6Ja9L0(*$iGrwFDG>`;Ptp-#hgJ zBv>JFym~Dtjycl0dryE8aA)rkkix0Q!1)?f-lTO-?EwijfrVN@g-%*$YX?Xu{}}Xe zaum1y>;n%t@b3o~S81IszB`uw|Np}27^oKkPU)?e>Lfumc`L~LfEPPhVSxqWgHJmL z1p(YUE3g~*@hI3pkQdPmOh+{kv?vFp3KadIlppls+fi`p0GGH}T~!40i}1UZOmJz2xgzke!-+4ze=fPtY#JmWS414Bl_vN;SH zcR-h=Yqdfq4fgkfRHgB6n+Tm7TmcF~9k3@_L2U3^9#FFzyp{(PJD`LHiWSg;G*ISw zVYdbpSt8JS0ThJb@CDpl}Fy5k^4yG>~%8 zR4XX9173);z#<652U*(-3dg_~=ip%i;)5inf-DGnu@x=>;zL*XfWkH4#VKa6VW3*@ z#k?cncu4DP1zoR5){8lZKp7vLz0*3unf*oQ zAz14niIIT;x)7rmWX6j;uz6EK*&j5O16nc@_#zS_2+G0;K^KrAr~apPf@AlEDOe3S zXSE&xWg&36+4vJ0hkT3-3>gPNacHw*4#SJ*jnFs*Ye?hY)&Yq_aJ;>Ec@X5Oso*#~ zq{0e{!hkGTc<^tZ3JOwq4$$ob0vWnTz-@e#&85b(nE zDl~FR^wA>58tee{h*3QV>Wmx(bv9XF?t@U#4B z!4;Ur^CBJMlC(~6c=7KChk5IzdU^iskaW$zy%&^W17CnLP4f}Z!WmE|gR3kBsRW52 zvY#-Dnc%DrQV{gw*MEM{8dXqP3hpUFt5U(B7atCQb2mul#TJNmP)2%j0-~dPDyW(T zb&=E$fP8-l+Fxu1H539~Y=Y_rHEK#c`1gZT8EC=PcF={NDq!;<5wpJ)RH=jRg$32+ zfiF%dK)ZV2wg%`*Xps1egZrUP{#H;^A>c(Ix&@#V3%B4f*pV;`K&?821?g}LK;m!< z5gs7=7bkB|d}K;R2rh*psM`1gbL^+H_- z9yaF-f@uR4P655Wpq2#0#LsXO!BViGev$nb9750%4|;GrxF7?$2y81q=(>y-lOPJg zsk05nJ`wnWYack(LPHeM)&(uX2eoxE`!&$I$of>RE&qPd#ZTbg4rCcY^D9RF{k@<_ z)V>Jq)o5P?xBFQfK?w&G6ED>Ff;uug|N`PGf4g}CL3b6CEFM{ro2KBZZ_ku{!A_MRe z?pf18{iRFYtsqg*>Nl_xTlRpQ*biFe1U4RQFY_t>{jL($C+fsAN%%8BahZ zwrLGFC~3h;U+`@!FBBlI2bBS!m1m%&2wCh1S-hec0FG?P=tO}?D#Hu^S&-2Q$V!Qe zvp_2)K!XL=Z(dB91sSK{VqjpX5J`ovlaLZkWdPO6JPZsB;-aYxptdfE%`KYB04fDQ z;}o2tsSKbJ12i_lCYs6s%ETZxvuG*w9p zL2EBQh@>(=mPcUSjgwd$pI??*l$MiU&X8CPT{r=rk0*Hk+(L)ja~O<|f)C3CT|Cav zTr0p(!q@F8(9O~5d*{WsU5I;x8Nj<$(mH)upS-xY3)0L3O_UiyLK{3%e()hfTBi%| zlNWnI3Yfrm8odyNC;+7{m?Hk|A-qq5Ua0>9r#rCd#fK1`%^;o35S`b5gXQ5mFFu57 zeD@P90oIs(kvXl?MfAxF&s~rnvg?l*cDq2W3t!N>f-f%&!JdGeY8CncH1_5CA*~sF z#LWl({k|VsPxANt1s8<^3?((7Ih)WgkR7;RK>PkcO8EDO_&%{dR1*Ud==Qw>UM~Tf z%z#|hAqKvI6mlXB^Dbz%b_HEu|D`+h4rn##KhWqcc+qN!82@(HFQ6&WAAv8f?Sw0S z-SIjHuibtSyTNNS{(!r92y^-n=D>C_LY5DMYzzGY8g%>-@FD}D>h(0xMS`s->zH1% zzI+WjMiLZRKZ0JkK-54oM~8SS!waM7pv(cu8r!C`GBkq^9;=xS$rqrl&J)B_8J1f`1U3I+sd0VLwgc2810B@#1vN@a#X*X?UBB>y!T~e{4BoduyMA2d-38tyyr z2{N8G6~urR@*pPv{#FR(D*{@Glf=Zpz`q}?2sB>2-Dd(5XoV?A378MMfRhDsxD%*a z1X&~sUR43rBES#MF8nPbjL_qF_CPIe1u>u%9*D`mzZXJHJ@M)Pf9q4Vd7wpkp#8%T z2~eFk733xG22V&0ci=ZDE%bu?$G?9nNIR(7Xa%bZl}PL6@k;CLac%exDjC3fp&kV( zc##WQahm};j_73`*vU|j_kukKy6v5%DXp`m_X5NXAW=j}q;>mrFr{_&OuYn_1^X7X zW}sy%2Y9zO*bq|2m1)VCn!i+YfaujfFc7d)uk3h^0|+aaC- zyB*o9JRKmPLOcdm4K)QcirXDBktwZnN-NlxQXs#Hf(QW+!40w#)bafE|39dO1d6A? z7ph;t1$kO0I9_Xg=}(CFrCee$c&ly}h8Q4(y!@N*6)hptC1HW6F@@en6fLcyR-4kPOtI z7ny&+2?%W3$y(Ot6aQb^zP1D(sSdg&9JD4D?iSE={EH3_><$5IWimbhDMYWxfaX6Y zf(lXSJxc|XKn)B~=C*$G!gvy-bl{g~U}a!nxFeIw0CKSf3j>3_Y$^lD6Ck#!Y$^jN zNI-0T*;EElP=Hp%sL7@>fP4dDOUR}&B&X)&#HVED#;0VarNMa&nRx}JB@i+`FSQ)X z%FjuGt+5R4euJ^T5?nBY$8tHknbNv>7(vHizi zyl4ccG0+$$$A8dZJj;K`R@)aHAnQS?AAGJ8D9=qT0G(Ice26iv6U^k_-wG1p-w!st z`5>e9!CDLc{a`szvlisCX0ZF5z-`)NJ)k!2f$m2LAo6AjdOb;NRX83NkeC#j6kCtOIooL|q{N{$8-U zi=Z|?NZpIcKS32z-|4O~&>Yjp34t$XT?whedUC`Mw z6*NKj!szG!|2rBO7#P4QN2IrfO93>%upb=A-69>J{cs?!cK3kSy9B;C*a~Woa|8vv zINl6q1$0jZIX378JEWP{33mHS&>Em_Ftf8&0u-(%en2Om6hORHpyPbN-s1TWsm@wK z3}_gGnEd;DK@@0F+Wscc3>D~b+7tY}_ZS!$j<<@y!lw{y5U5@RITI9F;8=qepdc~S zWMO@*;$0Aif4`?Pi$>8ixaE?VbW&xfAr_bPL$8K>;r=Hi20I z-C!pKyb$~Wj@V8x_jO};FUYfj-BUph40>UF1X{V5sHSy8eAw9v4uF;4L7Rg?sye}1 zUaSBe=JWE)zyJTC0on}?w}2P#55vqb;osj2(%gKI@!&(Y?og3l7cQA@Ux`j|2Yf0> zD(FSSJFtV&Aojdg0@ZC0E6u+D|GyKIGr>z_M0$M$WV%BoI=R4CzJUz}O;ihj9M%fT zc0t`|1A0ZDD5f&JxZQ(PBF6QCN<>h0w|?_Nu@_PlOaS$R-Y7!meL)F|O(~TDl=7Sy z7#LWTQW^3Xl1qz<;!`q=)i6MKF|nb79(i;*Y=5^;v?wA z>x0lR;csyTO}W%q)QQRWHg_5A`G3jx(d904z4z^9>!fV<1!2?VBqZeIcZ z?SV`|F9P0z!wb}Hc`*fMYzeq}0-fs#wp9?+CjSD`6ZoRQ0h9oEUJLC42PLTV;^_@x zl<5q8(Cd04;6*||Xe^NhR8slAdCdb}3k@!#LSgHqMXV3jrXb2bp6)Ey32_$aP!G_V*8KZJUj%{7?*?rVoAX#2bRr&j$O3%UE@*A&^#jl_DFIh$Mz33X zLr;K?;thDQ<`GCe2h{%p{M((F0$wafRgb6wl~WmByy`-V@Z4@tM*_6q)3_TF+x+qj zpf1`S#3mJ0rQ&Mx{ zGxJhXEAZ84u*ly7YHFPXRc7G8`~%6^p`Zhd{(xpbtq;~3LoR}V-0=uu^FR*aJNz0F zxuBbDdAAqdA|IrBvI#8VnPXE~ZSD@_b`sYR0XJ~WZ z_XpV9KcL?J!M`8eRTY5LZIFHrv~3UNfExDN;B)lA1970PO~8w+SKxpEb=+QW$dCc` z4ZvsEUD^jtG^OGh%AnDj6`*}B3ajQYylBsYjMnUT{nL7&&I6PIMfhPEFbk%yL?5y# z2xMA!C{Iu~_?Qccz!wtW0~SHy0Y2xk^%A6!1`ZD%>o+f6bPyjNKVDRUPW=JrDe$qk z7*~71!UJ?_JU=WvARJJ5NFz>Dhjjd-Uc$oT2O>Ov1im=57ZD!*pz!EeHHRUCVf7q_ z7v-6-@Bkh1?SmQ~Q80Za#^CE?x_!Y{u>A;vG)84Wn<;``h=9|G1Za^cXndgc09u$_ zX@`Uf5&cd0`Lj6AlieX8!ocvtxPukcC;jmH|NosVtXTV`-M$>4)?Md+(0UHgdA9;- zolZf{bUyjCuCX5UWfiJqcz@-}K^x@V^B|P9wOl^1nf))aRHeG@G?Au$sSQr@? zKpQzgxuW?H3uvzs|Mm_pkO{q0f4u(xA0!g+!j=Wx6h{~j*3JZ)(0u*>f8dMQK9FTR z;6r$sKm#}1IY1^time6D!7&GRwjFhy=XQX$FsJ zgQARsfBQs`gMwa!BN@~P5_-`JK7y8qp~Mf|G697es6o*RVnACaASVC*UJwOx^nNDm z6SWGUOXa~r{M)DaLcPfo@WRasQd8^&HTSkVGC}H76U|hH7u~H$#VcPMs6GY7m-U+$ z7h54o0JNu_!A3Kc0c0M72m^zMW-4^F5WK%Ciy3kSsv+1H;B|5@Sa(AcZwV+KIbJKj zRs<;nol?7N7fgy1d}RD<_SdXC{{H{}-}=pqxK>sMl;e}nfXgSe{ac{&7%~nA&ViuI z173pr7@z{T^-@hFXcEBn4`{4RAn?U0u(QAg&hJr zi*@bDj&=Y!`Xy+|a@H4!;e2qzoxw(DeSV=0H~bIC@GORIR}NNCP6JuNzg;j0)CGPK z3N;v#L!bW!Ra{P4ybxc!cmng?A5fW_C4~r9WXB0Y&47gHVvrf2Rmq^UW|zTD01bZr zXgygg30{r;2W&g22mRtRIO+sm7lSA9z{NX9z>B*O(JXuLTGAJBaC2ZKy(H-NB-bAS zpg09j*{p`>c&(kqmSqp}8`$)z5K+(`*w8NsOY0!Qkny;KO^9d*MLigU)29gZJa&|8 zq#)HNsLBK-(1Y*<%D>-L26W6YGx$hEUxC(>{H<-^o=zxeD_tSzMw1Q!P(hW&1WM50 zgUmrwij0t$;@^J(RCZy;(Z*ItI}fHy;sr z$ppIChY_;WdgFFj%7b2dB9YeZ6Ywvs)Az@Vui$fDIrz6XNk9r#j_!$|(Kt|I`~$ke zXupUfs6C*4AqXDQ44ySk^$Z7HWAb)?`3fU z<^3NZxj*pWbAlNO3O>-49UOr#>>y5jAqMK&zRW?yLNsWU02 zw|8iOq6XARYXV(Pg2ken520>Hvgj(<4Rx0T`T|Not> z0uMlE4eU7j|9@xihNJ)g@A?lKL+YFw16p%*;y>tM*dw6Bza+XR=9n=sbWY`gNx0s4 zaTU})0Ii$zJ@euuXc~sGJ5-{(31mJ0_6{#aP($hAeQ-JiEinWc1d~te2Fs^)_NpBD z|Nlidrfy!4?!|E33J~4=`524F+d1f%CKnOW=!to1nJyxA=fcGJz}x{%uo1MuJ+qtQF?qMxX@$ z_K8f^U?)lNZ|`8RW?%q0g@1d~KP$L`UsiAhKdfL1oa_R+dqLsecrc3e$a*>Pzdjz z=w$^uCr+Zf!^NC|p;sgjA+TR400mT7W1B+8YmIEZ{ z!K%USR*=ctCW7KJs2l7B{_PzxAQ!z@@4?8>e5Bwd=s1?F(XgZ_ER)^AVfn)QH>fuw z0na`BEfYcOh!8m_YXdY5msBHiPyi$cNx5n$TI<#S<|8`bEY%SLQR)I} z1-}ry4J$tcKm|q8FK}tZzkQ;QEhzQ7x_~$Qy}kuj1zI7K0lH=qTnxT302Lt*D!}gK z-#-;(KQp&Jd_6V zz>5xuTow~7`GUrrKCgoXqe>Ptc-$oO&>bcQ26*1O_>kFGCGf@SQm~`4SU^`ZZg*k{ zc<~aZlfOj`w15yaYy=*c6zFUbEja?}uQD(&fU~AZ=M-L$2yBJ}Y!7JK05o;h!_~$B zD)xI=Q$XPb8qWsHAAH0BRuA5#CXv=XMG&HH3Pc?jXxtk#WSM;ezPKMe71zVn12r!M zWZt76{~`N1FwKLgo5BiKx9bOV*5u#=2LA03$G``Y-~ul`Lk^h-T}E*PVKD#p7EzEX zkm4x&A_H9D#U!`}A5fTpU3?LAtJ{yX&K6M{kQ42HfF_e6B_?D@Gj=UBR`^@if+k`> z)Bb6ltsWrNfqz7MshCL9U%9DJtFxX5#Hd00kRwHlmFlT z{|9xGLDyy|!z?M0hNmKk1<=601Ul^gC8)KP#Q^F3d{~X*F0i)jLky_4&;EvFJIp|^ zyBfbi;{z1*AU}cp0(MtA)Lo$Ssk>p8lt_aO1}TOZGldtd*b3~fDX@S!_<&(2M81a= zWDVR^$bv6ezk%krk(~x{0MxI~zJkuzg1Q0}I;?P4=z#(Zbf3?sRZ!oTNP|Na*3;X1e|g`DT$ z`zEb>iZ96FX`NFg9{m6R;^7z2JhSVYwC)~PyCb0MT6#r5;wQg=(m(%pu&SUJuU5js zfgj|=R;uuVMsdCmo za48LKX@VNMfiKEo()=y67(l})68!s}Sek#Zl<*vHRoVFeKPcP3=7O+61M#2%nqH6u z=s4O3piMNcPe6T>H~jmjY8?6hpMU)+NZH;!A%vBIp_j!gpx5_IU~lLRP?zTo$YG!m z0QE86@NaJk1qBnRQt6%uaaU8ABB)UYY6pP?f?iw|2Hh~Glf{hcuYD_^Va4C_7j!c^ z=zQoKK`*9Xg+;^>P!PI;7k~MFfGn!;{lLFJ^aKBX*CW;!Y6C%s&4AB&3jLscsvF#> z=id(L{T$)n@A`rHLU%8yr4PCL$nFc+V2~z|A_ z4XrXqAk&q;U}uDWfR4X|obZ8ve=kTHG>rq=9u0C8_>8L$%opK~2>=BX=u(Iyy*^C; zLH44!^o8YTsG~xkfE?Bv!u222@6)~raXEOZA{8{~{kk!&dn%~Ykk%Rc;tV`zWYf*k)!8Zn>N5CBH1AZfWnf?|70-wQ4Pa-ip2LuFWAz+{7u$ls1K79% zxA_+ne{VV?1H%hm&|)ACkWHXL3=fv(pWrm5fRv^{Y*?C_3gQHHw}Sdp0lmIYKqna= z0Vl6B0lmIA0>R@uAA(*Sy9Dv__5%SK41fRs&tPC+VtDZZ+~wf`t^b56oQtfGnE`Yo z!vFs-jw2NEZx1~JYLr8|d4Vr-1i=Xnv^RDKXwIqI*8v=WDjy-uKv0W=f4lD)&`dpO z%QgRY*Bb#Z!Y)GHb0YAC)MY3ee09Z>fES$zN&fB79MJ9S&@18?)C~^lfNpRHGVsOu zY>?$L{QJSN)D4c7UY>x?UP$~vMM06%%QK;~7sPnk@bCZsmv-ROI6>2bEuo+s-~5BA zL<2Ml$iIJzFIeCgV~Kc1H7FJ}*34nZn6YLK!;23A;8+By+XeQks{?pPn8kvd0b0WZDs4fls6jt$W%}We(3IL1%+DRi#^b#wfjRqbhdy)@2x9 zi|4=&P3r`QbnjG1+^mh_fOnm z!@$sb3362##OBUc8Bk3w4>1=!mH=r#%fj@QXlG%`D0*;d9!NTb7}VSAa2C9m)#vR0 z|3Teg!@;?tJJbPu0y`*2LL&eio{*pc1sEjNLdN|i__uo`fz~cO33?#{3D|%av%zH_ z_}r*&(7lJ!zyAGiKB9rtpPIQ49%Oth3=A(kL8t4xya6>{eBZR5EENYu<$fo-)&r$H z$6FfP7#!L33P*oU#viN477XD`~qApY9H*L(h3?;26m{%tO92QDFcmG!`j{;Hdxtq-#4Jj2c!+` zQAn0gD>K?Mmo%(_DzK&^35`h*rBpi%%-)HQ*6 zM*%Npe}a?;0^Pn6jR!$q4(tX^bs9qw*~_z^Kt&R0IoB5VRE8Hk=}6Ph{pq0TXV7rF z^_v$#>5wUbvd)aZMrGJyOCGE>w9+8rT^aL_Jd(K=J3o zz`!8rnaTi)S`eGpGnE09=0I$2&r}9bLIAPZJX0A!aR@pWl*u!d0hFddRq=a|R0dFD z1F;`_q%we-AfR(gu6d*~fJ!Kk_;HU^22jlka?gH{nvIa7J@$H}GJvX6klS{6q%xG` z78o%Ef~feU(lmyWqQt!7wEUvn_>#(kREGSr)S{fkf_Tt^CWgeE^7yj+%;e0xbTGRh zvm`kqJ|{6f-q0x9f+454fFZS@IDnyup(s9wp(s9sAv3QewJ0Ywu`Jc8G>xGkzdW@l zxF9t-J{7@c$W19O3D3-9aAW}4UzC}iQ3BpRl#^J%kdvB*;P}KBmnNkZCFZ7r)>MJ+ z`+1TNTK|y-IX^{a!vFs}e@f$;Kmkv6fbXn_l-+6F9iToY=$1fmA_KJ()4Dq#lPSI* zz~h1tmHgW~0zjqwi^yZ(A_{b1O*3dmZ|H?)&~%FHk=|Z`v!L0QIh#REql5#XYh7l5 z*sU4QKr=E^K(~MBNUWUji+;33?F#o_rEO znlCyx1LlY{kV*TUSXvL%$%D(Df;G-ZpKvyKNgmr?0^>q+ZOR@=Ww+%?o{toc)H)vr02gpty zkIr6D1c0ppo28Pa7P^4usfh53lZwzn~gFz-j!g?wwRD(dvI5Z%G zxR7yg@XSBhQ2|*D-Mt{6fg%Rf9{K@p!ghl$t>Ci)OA203$iFMi=i8J9t$%451Q`)PoIGO)C=mWf~qg*#1+UNpjrgv6X+aQE6DHQb{C|P zhUBP9OR%F}Fg^lhL(r56Xzr@@WJx7bqf-U$#AN>Mz6OxSA83Xn0Lc>23@vyT1#}Pf zqF8X+?RJ%51CP|__sH~=1#gNf=qxk89}VT7jyT48XF?uP-p_pmIQSBdVpHX zFCHHRr^U3+))r7kG>Qcpe+6ue-D6t32_C;o)_LASHKj2 zI_j)xpqZx^kK@3>3rem(Abpv@sjyU}lEn-jqRl)3o}uwofy_@_e8e2867+&I2BH&@ z{@md@^w|NkCQy}WT z--DV5ox%ZG0tuq*L*O|bu)qrg$T9t(eMqYigZiKu8<1^~+z%bk1`E764>=b4VgaxVH9^a2_J@9Hy~Gc85X`UO zgwzdgaHN3_*?M#b8r-lM7bLl3$Z{aZfE?>+&o*>imYS!U}B8WVrQzkezy@ql(TZBz%X@NqQ(9Y+m5 zKOfXv?ghyPzL*a;8$72IY7+FqXD_(G1gQp{(G8lr0r@7avv9j5YiGKwhR}VTD3ZyFVg&5pmeo)7GDoFIjMbNqWpgA3|mVg%@`(ZwV+%5$+ zXbniwi(??;7(o_6B8?w>M#%w~2L6_-pw%;2W_HdZlxzZ})9s-qpg!Xh&=^WTQ71VGH>URCn-2oa~4SbPw9Ml(9Xs*>^C@BUxrS(#Yc*ZPd z28IlcwR0FUrmUUA@M5kNY)JVDX!rzVYS0Udlb|qU0iPoPnwa<1>0}WEnEGxa*1EL@<|eSAPG%9r1SR0W|D{GhhWi|>8Vkm7H-4qlAGzuy02&jCD=@&kF=>qua4C}=966{Ha~vI4RhRC&X@Jz=1354hb3 z>XHP!c<}=i(mF5InZfI+`1c30H2(t6o0v>M%*BD&pz#1u`fUYq0=j!aJ)pqe&^wSg z-royx(ZTM}AKhKxacmLCpkCJ_0lmH#;4u&K7Q_eJr}%;b2hv^wIR(pzwhzQ@pj5!$ z(gxc6u^)6Sg6jqT{h>#g56#p*bnyrC3I6?CK{;v%s5d_I`@iNF71k$e#4`>uGcaUq z03{ZMb#oYA6j*>03&;b$M?kIF3qdbcsV)e~ET#;QEBLpA4)(tTJ@|b4g`gJ-5H&Np zeRX=lgV>0D7NJx*|rIy z24>p}rAUx95Cfk<$y$1ioPDhGyXs7g#9| zTH69LH4x^60EDZM)qrdW><-mwKEx69Vh+?;(8TZ)NFxQZns#v))B^sNUUmiskiD)K z0$$WW!aS|hbq{#{#alLZ}Z{DObK?;h)epsC@|J>Y|FTwiEkfaERkEHM9m z*FB(v$C(dyPX)yo|8^FqfEUWwAn~)`cMoWX9cXG8Bnh4xehxl(e)^05SN{Kh@e4$J zy#ku^hj-Avb;2DR0?t#RPe9EH4<=~iC;J2g|Nbewpxg-(Hvp;G?)nDQ=eYpNICp|x zC~t+>4@!;V2;-phZ%D%yph1>^7bTFe1)UDN3UpS0FX$Q-cwoF@OzRAV21f6URsa86 zALQ>j1L~lJN_2ODi-!HK7r>bvG-}Cw2;^n$L;TxY9N!6pRzfJS+8#3N3NnI!KPZ&>xA#oUk!N5C?4Alz5%hu=vcegv0jw?H#S5@0 z;EgK$`$I2)w1TGTLBS2NX8ILKSnT%&6-zHr;vyS#O#e&B`4p`nuR(UAfW7YfBCQ#` z6XgZSKdqPedyawp4C;20@8?;Nh=Fu;rfF41U%7ufohFA{QE=q^tuRwmK?m$ zM#&Kip>yw0{k=XQMWHXWPeDuo=Zv!#L359dpko9<$*|M)&Wl|aLED)@-s|k0vI^AL z2NgR%x_c(<5NBZM?Ck&zoP|m>?*dIHgVrXngD%l}v2G4SM#TC#3@@aNz_kkhcJPQ= zV3xoOj!j@MgIXM*(+N6T0uP9TPBaO90&Wk3*Y*8K>z)D@2AxQCV*<2W0_!_ugVvz6 zu!6)vy&Vw!Lg*r>{RbjAK%T%=nl%4l;_vlkVqkc|2vYm!0(77ZUZ)#OK-B3VHoQ&; zaRRz~L8F)8I=#CU6dVD)zK|9LXo-XCi+~rqHbQ*2{X`(rT8Jn6K%zXLu>+XGiO32; zH8BIj|Nk#`BNXy)cij^J9~upMk?;ZB4uO?Y;H47aa`XtK;CT_h0b~heYnC!JkhdQI zN!|&3F$p2bzuol$D6zcgo#G1$yP)n?P%Oec_u{%2c-oeK|I{O($OZcoyzT+yVYnzr z3wYfFhylu=Y2B`OK<6DinehMri)PTd`k--;zy#3c($^Rm7{ zA?U?F@NsaU1M)yQpMN_<0snSz85j5>9~>4e0WYTQ279ct^~eNJ0tB^izzv#<&vrO4 zGBC{i{!jY^qye?x^#%X_UXZi-*B|Wm{n0&TA}E>m@-#u)KnN|6Iv!*qC@h|Ue89iI z6{7V5sG#iWfM}hFRqG4JkD{QNrI)k*B2p))&IE-h%IE@E;Kd@y`Sob2{zWwCn0rts zBov(OU0*=^NuX-)Me|Rl+E}m-*B|`bdjdfD1msUpQ56a@HsHnXb>N@@H5I@<*xnKf z3V$Rox!&PlkL(|ji9s*E#z8hP_Pyj`2W351SY5qe#IgAoQ;8O+Ar7s+!9t+rDxl4s z87tP$VaSl!Fo)rVqaGw<@ArKIU9R#Yt#gV8$c-;r&;I}aVgZPleHJtT0&0ywy1n4} z@)uK^;1#Saq^pEfBZ4L<0$waaDES3ix7*zd>H(#7_U@Sgnr;A*pw$nM);_33-O>e$ zt^jC<=|vMSXpT{UfBRIh(k%HG6V^h4YQOK3ZqPANEnZ-^-aG?3z;Od8Y4UIPy%U%L zy2#)~GWfJKSkmmB3X%sM<_b!v0WYRP_KrbIZP1~P6F{?<+oyu0gI;U{r&pGM7k42o z!_L+fpoF^}+BZRQEl36wr%%914qT`PzF7JWlC}bv85mwfoB^%>0TF&6!t)Hctpe+O zc{Rd=vJ%t|+3))Vv;{5~w9tnM)=q;)CFn+v7m^4Kq%>%P)<8lJ)Sz)|fZK_yL9-YV z*w7G4>!weGW-r9n&ekOa8#EvlK`(4>fPDqk0M-`pLL8i@@HA+SL8tK%^*^}f39dqC zfljWcXM^S>Bx0amz|o)q`8M!{A7n)=ROwWZV9*OqaG2p~(A+o$4kJk04y{4626R;Y zOHhLbJcjSY0;+9}Kvv@&0p-sN0WVIhgy`RXBJf4eYA74j1$Vs@@ZvW@65O!@7d*Z{ zdZ##oGAFp_0xrfIL76+K8{Ezccwy=SsiB~a3iKlK#ZsuLpe~XxXhA)=E%D+V=s0_j zL-#u+v>xE^1FZw-?VSV4yIHIt@$F6t0WUIsfZPbn`uy7=3ix4}`zE-{!V>U;0o)Sg z=xm(=%G}^)6}VPHsgr!4Kx+?}C@AyyfQu?f1q9LzEv->>qpEu``4zZCK$=Brtc7Pn z&<3LyhA002f1z^%RNQul{s3=HdZCL@13m)+ypGCOqC3za=tUt+u2cxrq<{_d@wfa0 zHL}48x^wD^&7j^$E2!t4*4a7%RI{%<{{R1rBget^_(I3EkJdolQeuy7UDY+Xv_fwy zXqcw66=HBNXxbHY(FMrh0MNRsy2okSJpoDoR@WpIM$_RL&1Rh2JH z{4H603=I6+!6V)vb4&tXG=tCF2W@@7^I|*bTzrh-z>Ns)pp87(7JBbPC^-unI0K!x ziElu#w-*$6fuN+(1R4blcwuuE)FzYwH3NN30-n*fUbccn__t35QJ^eq5&*U5MVu?h93Gfl)_+h!*$$o|4}9@)DcE38 zllH|^2pg0{R{j6~vJo`4xgRvv+v5rv+G+mD0$M(!GXXM5{#po>VL@waK$4xUAaPI& z0kk?6)TeI#1y-(sq#R-vNV2mRB%Z|xT6qczji6p=tqMA07Sumke+pESA}w@>w9i57 zDIs+{*Z{mEe&3#eLRAMGs<4qTCWsfo+kuZk!W7)-0;RMUPnUqh0(4Qr1W?A{-`?5* zvJ4iGPu)QQ2~KP;I3Wh5bwa}(Oa){yyx0KRkP1GW8x#|u4il(g;@>_MWK<9&;{?1o zp)9Mn7mmj~eG7y(%VFSHRx@oxvO0ttGN4iQW1Z2d6- zRQ$QV0Ug!^8ks^Jk%0Hg`Foy%%1mF0?oRRtCKw^E>}+iz*meP_2zt=~SwjlZz`q^r z*nsX{kYwPCWN;gX10vZy6(kt+A`WZ?T2;@#y~P(4DFH9!7lGpqF{}Z)%mXC#;wbpM z`aj^qSO|~O+y?~)q9H=g$kZ1|6hNJiFbidr2IQ&07nP7D$q=Rd+oyu!ET|hCiUBWT zz>OPNFhIj59Gp*}XT5`l%6(rjA4DWyiG{d=VITP5dd~llMMRhbHQ>B+1UwFBeWJD) zGE@WgK4=s^^ab-NcyOc0_J%P22MwHQgHIL&g?ZqM2MfUNNCRb~(mU|1)EmMERSFvS z1u1 zY|xY{s02qEO#vxJ^xS))MG1UzWcyT*4WOb9q#slV??IH{0WVzdg9~i_?cfFlXpm{~ zd~o1_Dw=Lz7x3WQhkc;Yambt%WF#NlW&uUlD@? z4&6K*y&@BXx?4fRK>;sHZNcqPP@%jZGT?CzJm66SssyqS10KBKBm59e%T}-g_<%

TBDb|$!Sh#0*9ITSR_f;Qmc&@D0%_h1LeG-z8Bi+^}<40K35 z05?5fUi|z2|4Y!ud;aaMpb7?5eA>(dI}{W~-Jzgh_Ij~$FF4ulhmR?27jX=FvA76c zOdCRa{P0W-+orMsp#*dxNR|M29b9j#!9?%^VNgmBe6czlRQ(BLfjageM+CjdoC|hB zT4!qxs1?bz7u1~xF+r*14zz3S09w}GI~8P9&5{& zJ`YR4i}Nc$rf_t&Mu1`!G}ZvI6zsU}sUT5k6W0N>i{i!ndys%P2aN&*?fL)zg)fNk z*n_Aw&x5KwCh#;qXet-Hya94Us!<_4z(G|jY$Skxe-A6TYCXx{3aMH{-+&r@7a*ba zB6|+ljo?;Yd;#1DXw`}oXP~Mz=*1p*;Dh{%)I7`*cyVDi+$dOzdBFoQ9$vK)F)RSC zS}B|7SO#%rXKM(-suiRn=!NPDu+t$L5LGKkGVle*awN&_sUX3i7tG*{fU{~nG7GE+ zOVyeMIu`#W9jn%vkSKuo4ZLOp(q=)aT0x!)d?9xn>}rToMAZtC40yo^X#_(gyL&-` zfiM1m4aZrv?wtuX5KAy5?*z?^fT~t-B7&@QJp$Ue0j~Lwrn5mMAC@AzJJg|@r3>D5 zd29|TkwZayXThEQWuOwd*9VldkvjX;FF-DWp zc^6S4!@Bh#SAkYNKxf*a!_pu}@pM5t`XG(a!WUeY!*n9lyjXV&oZ*o=`EzpNS+EJT z`Ns!x2tIf^5_A|aD6sZ>fOaudf-ZakPtEl92!J*ofJ?sYLoVIEKYBwLMS?OI8laPW zCFTqaU|CQ{2{MlZ8nFQlmcR;-07UJ|zr6#t-Nyv679sFO;Uv(`6P?%P6k5yxE(A%i z_{T)B#qbpx{QEoN6d4#=PnP(Dje_qzdV<({^aNw?(G$?#qtG9{ST`P(wjnkip>(0{ zWW(cQF=*=%==f6bz&-k$HMkjOeXuqPmtb3pKr7;3q;G>1=&<(B zeo#9R)X8sY0*!is#`P~g>SpQaY?&$mS}AD0?f?G?ue(8a;H&}-JA)$56*eOWS}L^W z|No#D7xh6kB@Z}-bU>E)^0#z?>Ry4~sY_P>{~rYE-$KSTUX)A&Wdra3b|jtE zpdbi+0o{)DqI*g&*oiN)lR+zlIY12z$abU$pg#Wo&==q)o$S{C|6fRK1qH`Ea8U-^ znFL;cvSJnJjC)Y7+&;w@w7?OvGwBIrXA;ODaCHmef?N>vg2xEdGyv~R%3|nktym2; z0c3ZJC`b!93q!adEdehw-9c?n(558#4jt(FHpps)C)yXfd!~Zc&<6HS1sNFhf-M`e zDG9uW8?wHRzhx2R^e@mn06%Q5CrkdtttsG$0B!pOmpq|Qpli)_QwwKxH8)4v@+LG%mOa242hlXcu^V?4`jC z@bm+0Gr{i+Xoe^Og#dh87Wm-Yen<+0oQ@e%lgjWS*9g2lDX!c1kMY?T?~OqFlR(>9 ztlzxYWCYuv1Zt1P)TA=pf$l@PT9?Xj0m?p6m&$Mi%HCC%$^hD35+KRIu&pkY0kj(h z#9mRC$^hCq0otE5tuB=T)Nll``|45|K=}={3aX(ll>yWY0_`6vu1jSAB{tCBqr$pW z22dP<_BrL(r80n`7$lxum&yQ&eGoexTqDg!9Vf!Ho} zsSKdTCdfV3b*T)Xg)|^>1CSdgLi$Ilb*T&t6aW7QiObfdGJxjoKy1mnR0h!G9*8Yk zm&yQ|H3jvUczf=qc)WR)TaQk-`A!xfZD+z_S@Q2 z22i6F#C}qn$^fbcLG0VLsSKcG0AgRLO=T#IFD^(;E-5O_Wk{_kfZSdHX9Qvq!y(C# zlbXj+o|zX9q6_2mOH1O*OHvXU0^>n~C8@au3_kHCxdoujPeg36g6*twWGF)2oQ1m8 z3bv^#sWdGfvh6AWwC$>*0JO;pAp+tt5Vz%ujPvti4}(v#gb;K%PcN|BmBZSVr-q~3 zm!s47&ug~sP@c}vKi#f>x}T!B1>_=R_ux2R7-XKZD^I5@HX}m2-!#5i!pOi77T&uz z=HLJSJ2OGcn?Xi@UX66jd+UaOkg?w5t!tpH7Y9HG`tAlDgYT-*-2vK@)7iV?A83Fr zR04b`WIseMt-B)+bnaiL?}-;RAfZqV{{2lc=HSEf_;-R%mQ4f6C4laU=>|!HH$Rtw z596H}#mfM?#ntskzzhF=Xwm8V1GH}fbU-kuB@^_5Z6a6#G?vT1-B%{?g(_U74Csi} z{Y_Dz2E~C|C8(K-a5KH(Du2AV|M&m@2`@N7XYEZe2CWU%08gx}NP!iJQr)f^{QEm1 zKK|Qe_fuK#UJV7tIUxJP%7l9bG0<_cp zWQigF_Rt?e87CMR7+#zPAE^o+>IYwj67A0d+P>Qz%F)@hMUjEwg%{Y7DWJPw;z2|d z=zNX_RR)G`SB-8DgTNP>aOa9;F@b_}yHi-ei_b|=Pn4QvAbak2GE|(u#R$}vU;?>p zyGK~yi-Ry7{4JnEO^?Hqz>DLcgL6S^9Hwsh2fY#k#DJ`HXazC(_xD1m&>z;PYP~?W z41prvR{`7)76*6VSUOvmfCRzj26Xp=IDs#2!)z@P>YfS`>YNHndM|=OcD|m9l>8h) zBA{U}u#KSOpTTxQPN4xa`S*hz2s%-gf4}b!?Ss}AY6C!5OhMhle4!iUqKQE-S|Qz> z&ejEB7lD#^KzA>Q6Zpat*+n3s&Z!{z7Y9Kn^uF!{ja;~%05ACkZ6bTor78|uMv}#l z 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


TU(G__urbLG<*tf*sr2`v9b_cPhw3LEWw?;F~O8 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�!u-JUuS}y9JbS2JlhPKftSV1wq$K`3it0 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

-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 $TY|b>cLcn+1|GTt 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%0A_AIs1r@NMdQ+kC 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­vAdAm;|Wc&`Aq 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%0D*ba#$uwx+$29b0^lO||A6iU*BW;xKc4 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 z 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

Bs`L&0;j9dBl{{IzU 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ͱOh?UI(-oFaE^%s{~ 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 z�ikm_f(j27|GI4~wyZI^#ZrJ&b~e7EG0fzRV|$dl*?wmNF%q{AcVnbz$r?^`%C`F_S_<}OUa7H^oWEY>rWS|l^@SY|V-TfJs{WF^JOW?jqFWzEC--Fhyg zn~gVfh^;Ks0^2hTF?Rlp6?Pk#&e|Pi+-=V(B<8@uveY4%Ny@Q-@scA4^JT|Jj3Q2d z8G@Wm8D~2OaM-#iF)_I|Gby_+W!&Rh#C*yuje> zb(k&5%Zn+@TaxjK_Xg%~-gS)0K6@Bn`baQq`-Za^`SLSa`qr}A`A%eV@h#>`Wmw1X zgh7sJ0wXWueWpc>^33@RRV+%(k60oZxmk-?^jRM;9AjO{Cd&4jaW=a;;}Q0HCUwpx z#vsnC3~xDG86vnHx$Ah2Gq&(NV4BP$!r0EM%2dl2&N!EEBZI%-BZdaS`OHfMdl(N3 z<}s-VD=|(M{?7PN^cm9!(X|W~Vrv+~#RC~lBwmV5mH5jrO~Qp~p@b|;htvZ`b?J7- z_tIAwnq=lP8Oz!-`pSthy_Jh#W>#3q%BHZDQAL53@sq+V23^HGrVPb2#vGNmjB{09 zFs)a)$#6(TgYmtpllgnqsf>SA!$Wpi=?gHg)puYLFlc3{H3(;1X%ND&#b7VvKEv+} ztBmTI1dN+m!;G&pryGA})G=vdoMNKI$Y*wpNySg84p=R zGG|)mGi|cGDfrRyDZ@J}1||;cX2#_6blS(H;%v<*=pw}=;M&bN!Sy1;ephkkHaA!HQ*PH86WuGA ze!5TNJ?3$ph1sj0fyGOJE8B~MvBoQwafR16#&qvrta?5!%xON$7>j+jFkSZf#{AUB zl4&P{5#we?cBWH|6B%AGUuHPS(#3d_=6CWxKyH)eYK=NW0BNZ20!U0rnS=d zg?(h#FfLWFW@b@jWh_^gWb#x=Vysh}!P23&l;Ma*i=wIKR>pG8rA$oPQjAOVgqWu5 z=QHj$n8EC5^pHW{B#WusWGCZAlW?{~^H9dy=1mMG7VOODE&ni1vKC=Xw#{PcwVlGm zZnuo_vHcDnbBEmw`Hn_RTu$DMQqI=Q4_&V_YP;8SBzgW|(Dd?Rt@hf_B;wt`IMsU> z^F41(re22g3_Of3%*l+6jMo@z7&b6-GHzn|&M3p$z?8u{jiH>?o8cd;Gov>96P5t> z8w@`=b~EnhtYYZoN@G;y-pY`{EyP&Kt-&P8yNo-CuZwX#-)**Yd}o;d@jYaSm0U(-Y}m&XF>CjP)|SjFV&@Gwzf>!yu;cnzctkis_Jo7qhaW6{Cvc6ee@U zZpL!uqV{$ip#(du_iP6pcI75`V7n7L9UB*q85{x@7`x$Oo z_A-`QMKX6-^)qo;^DybzcrmWG*~R$YCV@rRHc0rqts9fD-2)~?`!dD|`=<<@_HP;Q zJJc~fayZY)>7>le<+PEJ-^q+o#;Ki^(^;PBhs$SGvnH9&z_# zQuWa0yXmo=;gaVi_P3ss8Tq|VFzI+lGG}>zW%%yBndQH?A0v|wAJYV%nz4^tZmFnY)K54INmYrfJ%Hi=zk=#a``+9kD*(Nfxg z@w==#^D2d}3=E1wOp6q27?V^SSW?thF&tD&lGai`&3IAWf>Bgs5|ff{7vpW+B4&O) zIi`zxF9q)CePg&~*l40-^n%sf_#&gfaWLb2<0nj3<_S!DEEY2Ev1DU;ZYj;U!fG|c z0&9Mz^R|TE|f1UP4E&gN6n*~sjp-@qG}rlM@mOlNXTF+0tpX!VfU z-TDKYp^csWew%1ccDoDwSMAMNW1P~sd)*~v54gW#U*#3TD(+VyxFp~i7X!mFu6~AB zyuFM`912XA1a>g*W4pp~h3PX}7>^9Qhv;_pm7Ja&_N*_tJ@`3!V%cxvg zox|~+&x-fBz&pV+0&6&b3UIO+3MaAni70Rch_Lf`h&J(Mi8gYr5|w11F1E~BPdr9~ zM?!!zP_j{Ajg&a=2C1#WFQojrg=GG7>dDlzot0tXcqI3lk3k`Zl|}J8w}7G%r>$~{ zps(_5uItJ{?93|dyy{)OikDDYK_r8?v6XN0~pYK8moCd-l*lI;Y_z#G5Nz{nW zUGM(vKoT;Yk5M_5~=UUT$FISbTDw{jcEsIzCu?BSJ`JIA?O zzDaDQLaX2o1v`#OiuOE<6<71^QdDBwqqv9bwW6GYm5M*3hH47u3e`Enw^UQvjnou* z1Jt~2E~xG0zodSi%Sj_oGF0OU%RbF6ju@@~^$WF91#f7v@u+AwvAJkV^0n!l<(#jh zA>yHTiv6x0JNF|!4So~-sj`Xse|fg)zZTOrxWT%}V5-0>gV!7n3|pBKj9P_~jD*?K zj5xWr8})OS8Z+~zns9Sum`vj% z$C+iTAkJl1$s1w!jjhT~pZl$SC%>}8B%uh0B92GSvOG*K-#GnUtyvGa=89Uo?PK?G z)8VUhJ0|VqE-SdoV}ICMZ)qc6pPO7eeEQe~d>?QG`_5HL^gGS7)K5_OnO`=)lm7?t zY1~@kU*tZh>gnz>O>~-&l_1D3U8K~nSz^d%QxV3%@J29Io5y=u$pXII5;QOvyTrZ?qYZw-Pa{qOkvFne} z?@zx>|9brY@pINs)&GH?>~Ft)(D>`|Kc{boj7CB?c}f^Au(~qe=Ir4t=kgL4mrnWP zd$agaGm{(Z`>$udzy9~_r{wp(KXL!M{#^Jk^zXp8FW>clXTEm2e)Y*yo>{W$T=hSV z|J`Tu{;&IQ`;Wk1jsKVbaQJA(+^@i(5YKG(we#Osrb~Yx|LbL%#$eBKopIXVLrh$3 zyMKCoj^V74cNLlY|MvetmXyC~zmEQ2{~vkH8fZQm9fRaS7+oC32g!lfwS#Dw7%~kK z2OSUx!XP%X9Ec4PV}ah`2BJZHkT?v3_@Mb-(3w9V3}S=CkmW%q^n%V(0-dD@qCtF^ z8W0USTOM@mo-zXi0|}PZbdELX4!Jr8 z1_lrYu|Z-Wd62t6XBAa|&NgIVVE6;2L41%r=pH%Hjkcg8YrGg47(nMJf-r~;k_Vl^ z=)}Ola0hg6F(U(m1TzD}9A*d&k_X+H=f}XnAjinSaGHsMft{6sVGA1sgXBTy@JBN+ zFyt^YFuY`DV7SE2z_6Q}fgytzbZ$Na11L-~85kIjGcquQvO?r~g&7!>B_Z;lvl~Hf zHDF?3kO7?wA;`esAFWd|a6^aZDEglRE0W}bL&>eZJ85kH&GBYr!@G~&v=rS<;$z))-as(m|iZ{?H zOeHJ~3~z-P7$(>-Fl0<;V7QAo8Gl z|DH22FtD&OFie(VV7QmYz)-5p$nb;}biyMnrO=jc5M*F*03|FO)*L8gU~pK*!0-SR z5ZKfxF+n0Ph=rj6bT%Zq8c?Lx2r)Fg6=P_aBhK((sW_^N2r&i*7gq)br&I<8)jWm< z?R|xl)aG&8k;}JH*ZAtPBpu%KNz{G&`0NVi3 zfOr1K{TKSz_(%Gi`V0Gi^1JA_$#1e>sb9FCwV%8ni{C5Xi@rO27y5Sj7W>Bedit9A zD)|cd{_}b3bJypb&wihcK1+P2`}FuU`jq+P`lR^8_=NcQ`ndZz`Plhb`Iz~b_!#*Z z`j|4zWDsJU&*;STm+2DoL6+03pV-VeW^zh%@8zlEOAtsBY7sdqrY5;m+DY!W!Ug4h zYDYC6>IfNx8m}Pqti|^D) zw0>q_sNrdT-lu%vlDX-FBS-BR4=^yaey)=!zT>ES>Xf3j%|T2Z8hnmIcSZdr8D)1V zt1!Mxtf!LrM-a+Xe;x-lr z(5+ic47}i5(U92?H$%j^89?@e+yFXX6~q>25Mtn9;AP-uU}g|!5M|(C5MP}qPlNI%F8AU4De5D|zP2peKHgbi~KNImEd6YCvfcRGNWQfIrtGy-CS#6cknb0MfqfT&|&0G;Fty73R>0#M!rr6~|wfB_Wdpj67l zAj%-h019W2IH)uOu|a7(bKSs5T~H3oTbX$^7- z1S7i{VhbqDL2(T-4dOfOZU)5*NDagX$ZiIe`5;k{J0bZI5(3C>)@IOzrZ83p&`o8a zJL5n(U7JCJffrm~a588!Xfg1D&%zag))%0%15|E+$_xk_=4Oy@xWJ`9C~iRI2B=g+ zWrKL2bju4(^B^~aTm~w2AmWgiK`!6q!KDkxH%tu3 zya`IBAXh=$2{9SM2H6P;We^YMevsQh=>aAVia`(?BreJz2zD`u%?r-45ch!E0HE3d z63(IwFt!4N44e&$aVBW_tjHkG0IS(ScVaU!fbs|j_S$022w{WDMo^rCOa+ytJkUBt zn?Z>I!UmP|AbSz!>oVvv$TLVn(*wjDWH-auAe%wq$psEMh`lg2$Tgt$JxGlPgA9Wt z11R=E^_?L6wlkPHkZ=HnFeER4(kZO%0V=~_<)=74Du{~_)$7uTmff!5etwR9!0+{E ziVR;pa<=vPIQ4Y=YfdJuTbu`Me}7i^d*;wt$#ehzgF@{us2dGFw}MjppTA#lI#=_} z`DgagLN{a`9{;nycr59-zisKCgICSZpHTT|OPTvXp~B$6;K1m>?7-yk&z{-gpFN`k z2r@YQvuAPmZ#h@>fbleo&st4PKTR*2x=7woEYdYmyK+qH&m&#Ezl;t-2NEwovOgpf zZT#-ihLa{olkR3K@gC^A@J2T3merZBPna2g|Nr;@*MCNEFYL$vfB!)u3=IGN|M}0% zK&kyX40{h0o)JIuOSsqQnDj~|MhBx);m7RNjSf$^^;&f^=YM<3+~>p1&z;B>!12)`g~oI)_SxJ_}hLk`W>kaw0eJqJ(tT_AF zAF>*=v@%_1i0}>d_49S{HS<;V74-e-bI<31&pe+Bp8y{fpReABynDQZy~Vw+drk53 z^;BA}{8pDyw^55yEmN7Gyh`by;&p{L^8e)ozMc7@4OYk&*H=j2zC(m)N7ET9_KWsZ#i&^xTUob9aXt!y%X|rjy zX|`#!skf=IskAAxDYD74$+AhcNwA5s39<3Bakp`>v9vL?(X>&p5x3#9VX^sT{lWUF z^)2gj)`zUOS+BI7W8H7vXkBcbY8__nZf$O@ZY^%jX8qObiPa^m16FITW?8jcl~^TM z`B<4-DOvGYeYbpQdCGFLG=slTbVDZA+-lf5R> zO$trCO;k<(8DBSEZ`@&=U~F#8Z~V+?kI`hKOd~rZ5u=xe`wS-;rW;xr@)F&|((v8qn)%~oqU#CYWLPu5SgZ3Wn zcI_Z-S?%Xqo3v`QT($VMZfGvl%+xf}{H1Y7qe~-DLqg-e`ZDz#btCm3YWvih)jZUA z)h?+{SB+McSADFqOeIT2SLK89CgoCPbLF2(yOnB{?3Dg19#CvlbW~(gJfzU1;H1E) za8SNM-d_H%+#b0qIZL_kvRh<}Wc6j=%B+$}mr<5^AU#JqQd(5{qEwHRhZM8ae#t6H zQ_1%dt0Yn+3H=y{P25eJc1Wf|rjJc;n_f0OZF<;rm+2|tzStYIu+%x?VM=$X+~ zqa#L}jTRYAFse7oHHtR!G%`0*H4-*rFnVWr+wg?pR>MVxeTLPB>4qVO4u(305{Ar% z?+tDl95dKxFvp*mK*oU0;Di1x{lofe^{44K=x6E&>09fo==17-)w`#6 zOmCguG`%{#G(A5(Q#~0y7QNTHmvndPF3@e$&D9OowbE74Wz&75b4h2r&Rm@)oeUjc z9U~oaoj=+Sw2x}9)b7(R(hk$M(w5U^(tfISQfrM?zgDqUn3koMwAMe(hnj~qmuYrr zW@-9p>S+pSe$=?Eu|;E=M!80WhNXs-#&7l8>U-4ZsMo5;s@tl|s{d8HtF~8dj#`ac zw3?Ngl-f_#8>-t>r>d5y2B{jV@~gg6Iis>lr9&l6#aTsB<)88$<(%^b+#$I+a%FM>a+-3?a(897$xe{Xly#Psk^L%jPG-4GgG{81kqnp2W9dE8 zQ>1gGU8QBEze=5zS}Ij56)L4G#VU12a*JfQWU{1{q>$uGi31YTCGsR(C1fN%i=Pr- zAYLx+C$1v?TkN9PaQD`Ax5EVf~y4U1%m}O1pf$J6j&-yCEzEZB=C*@6#snwVt#ji zY5w5wNxjngMxZiUf z;+o2p!DY?G$MukN3uilL6sIode~wEWOF1eyyf|bzKCmBRpUR%WZpF^aexGdI)^n^2S&LcSSS46rvFv5(XGvr+VPRvr!MvKemf4?Kk@*YLF{T+zSxmM}{7erS zH#4>}MlfnI{$V)Buz;bM!IeRrp*S4`i_#0z3)Az{^U`zEv(q!v)6-MalhYH@W7DJ4 z!_!031JixeJ=0y&9n)>oEz(WW_0zS|Rnq0tCDVn|dDGd`8Pk8IeMx(p_AKpw+V!*x zX(!SSr0qyspSC=0UfR^Op0wt)sL6YAE#bV zJ)OEQbz|z%)ETK=skNyEsY$6JscxwjshX+MsXVEFQ{JWAPdT5mKV?J8f|UN0`jq^X zxD?+Mn-uL7$rO&1Z^=)RFD36!UYk5Cxg)tWIWgHU**aN0SvdKB((9yaNr#fwCe27{ zPRdJ)NODfnO%hLHOnRMoC2?Qk^27;=m5GUoUWrDDQi)87uM#dL>`Yjg(2 zd9eYpMzJEX-(s%E?2MTeQymi%V-q7A^Edil^uFl1(Y4XB(KgZ2(Z8Z@M(v229#t9@ z9Ay+G5cM|lbmYp&w#ej2he+ATUlG?LHb?YFWJkD1C`bGYzZJeUd_s73xLdel`0uc5 zVH?7_!cxNQ!ou#Ips6kC)dZ$hu`Oc_eSqV?;vj_?@wNby(W7lc^P>z zd0q5e=vm-t@5$$R*JF)Gm4~N?xW`lX&F+ov{_e8wuiSRHwYmkl$-BLA-Rauq8tf|X z`r2iOON&c@i;T;2=grP_&R))<&JUbcJC!*(I`KGNb6n_{?P%)A;CRYmvO}zcy2A(i zUG~lPKK7#a_w1J271&wYG1{H7on#wjt7QAyW|K{ojgt+R%|+`O)(O_?*6*ygTGd!N zS#erju$*QYW2tQU(qg?usfD!#gT*oP9`itRaq~N73(eBZw9P)4ZZ)kmwKHWhJ#Nx% z;%_2ia>ICzalEmz@pGfqMtMetMqdqg7*-qF88R9kF=#jNGT<>duRl>gL|;t*hTbf_ z7(F??2fB-NQ*_mIpX;pD$tuLBeHA^+kG{0$V(YEcHnlP}Q?;+ETU1L_ja5IXY*HyyF;IE0yiPe+SzGy)(n_TaB{ij| zii;JK6crTjDa=ubR*+PNg>Je65SFW608yj#p}ea#J`Je7RwjY5qlxJL^MHEM)ao0 zRFOatUXhc+t-=n%e}r}jl?WLKy%t<9m@FtKcuQcKK%fAxzzO~qetZ63eB1a6`E>bS z@GjyF1>=aP`^ZP zo9;Iq6P-fsHCj(KWi*2{+SPZdy;hZ0^-?KUUaWLh@tcC2f~$O%T%YVlnak2&q(r2Q zB?Be$#Jj|niXITTDf~%@OGr`BLcotdg|CvgmuDgOR<0AAw>aLi|7R0mQ(`q{ab*r; zN@uKK_~ri7{j2*2_m}Pu+^@Qybl>H^%6+DLt9yZaq`QN=nmecaYq!&GtK8b%lH9D_ zgxp@Z?s4sNjd#^^{q1txWr9nji@eJd=jF~B&Kl0ooEAC7I*B=*b8K<6aD44B$HCj- zr~Oj<0Q;YI3+>$PUfcHB8rWX2$+O|MS#IrUebcJIip^@4rLN_E3xA8d=2_<7%o@$O z%qE#in9em(G+AP-YP{4)#b}YCoZ(CZVS^rh7X2!{_qr*%*L6H~c4}*C&(LDiD$=~C z;i0ifU0S_K?WL-}>Sh&jl`7@CN_I-~6#ps2D(se*kS~?HAge9gDsx}jLVAMK3rTy) zsS>Zm9mJ=Iy%4n)?Gt$@Y%JU&bX8DQuuR}6zbJnS-zHuLUO%2W+%LJzxSBaHaL90E zuy0{wVDn*}&hm&^kGYcR2qQmZ6vM&PnW-MB7g7vTGLoy3QW7;1j>Xxw^_~;9CB?9t?rwZ8UNDH(mAOip&FssExSqbg6I>$PrSc4|FJSK z-L8@)W%AdH45mG@9y^NeCtrr{J)x4@OQ{0^I084#TVN__8cGTy{ zb&*k#KO?##_#&Fa--Nk`O$ogk!V#h$>=6_i7#iT|Z|KMCd&hgBSEMJK$4WN`*E7!k zPRATf>}T43wsy7ZwK!|WVrpz0Wmu&@Nq4dKI?YY$8&p>)&sOY^FO&_HHkA|VjPriyjn0dlCpkAd z=Q&3^yE_{?OFJ_=zjnIlwB2d8Q=L+JTW#xL%VK-Xro+b5hSTPRb(^)b^?$3~ zR;5;YR?jWxTZUS4TOP0|u~4_TY2IaSZT`w^rkT6h7t;l%-lpG7=9_q!d@!DFY-{}3 zsNG20=$v7pp^)KbgJ6SC`V;l_^iS($=rQZf)3wmOsFS6`q%%`nU;C(5wAOpgW=%28 zl^WI>XVhcV->B87ajVT#Ra4!p;-GRyIb8XXQjXF$#d<|{#eM~Gg?aL-@~h~9N9vrUzvKmp0Er9Y{^IAw{KU?PdWoJ8aT7T#>>#{H$U2T z0d;{z{4)I0`2_j8d0Bbucz$pfa=+qA=DN)p!g+?ng<}u93Hus06}CC7!mQmaOe~em zADJ?k?lXolo@H=h;Bw@0T!#q` z%?_mwX%1lyZVsjn$_|1Kf9+q{U$sAAzsi2HeT{vJy|=xQy}12fyN7m1?N-=z+2z>z z+UeQx+P$$oZM(v@)i%-A)>gvylg$~Mr8c!Tp*A`;Og1;H*IGAPhgxe`|FSw`HPbB)d%Q8!6OMc5+7E3MiEi5b;El!zFG>!$n2ZxPSa{rTho6g z`%LOg>`eX|?>4S5HZ}faw9Y8gNX6*B;S9qdLoUNZ22}=z1~2sI=?Cj`= zYOE@Y>ME50m9NUPl{i1>;;6|NH&6<#ak zDs)G%SddF_p@6x-IsO#>Uwjkz)cAJu2Jk-Pspb*jS;}q6eU2-M>pN#Rr#$Co4tI{* z?D_1>?9nH-+r6@8v8}|)9kzL>+Fl{Q|!a+-R&*xHSERh+3dgAJ+eD* zx7%*H-6XqOyL7t%J4-u7J5IX~w%2U;*eBRGSi;U>idl zew#PeC#;uP*IP$fn^^N&KeO6zHQg%D%GFBR>VxG`%UPCrmX4Mpmd`A9Sae!MS!h}O zG(TZJ-8|LY$o#+AX|w5ONoKlc-%Ssic9{m7N}E11S!q&WVrKHk_@Hr{v6nHg@dcyF zMxjRHMmG#+8b%sQ8s0FNZV+l9Y;ZxpSKmvYP5+=?t)98wC*9S$sk(By*L3=H+;skG zZ_&=uR?xnx)vaZ(^+j{JX0#@s=0S~O4ONY6>h0Mzx1s(Gk=S6!wWs>-aoQ6)}= zTV;oGsrnk%uE@3nWxfS z(gxC3q$;Ikr4CA_N^(lBk?@!JBtBK#T>O?;jhL+1e$fO`M$ttg&LU5QTZC1Fj|im* zF$*mgbP{|h&>$c$u#Z26|2N-EK6AdSyhXeMyz6+pd0ue0aw~K1=ZfL_$vKVFi1R#0 zHU~S$5_SjnJ8TtfB5WI2eORBfG_%OF>|zdM{>0SFq{(!IF@fe4ay|LLOt@!`uV8^K#dE*p zT*z6I(~*;$W0xb5^C|mu_LA({?9go8Y?kcXSsSxDvSPE0ve>ikWUkL_&J4@c%>12k zHe+5!L54$yK*odg4e9mizUk8GFVnWAHKzrn$)vqV-JDvN>X|B>dN*ZRN`8uY3PZ~A zs?yj$0`dy4&t~pmZ%R29ON^)XxTI%TT_`;#nLCfK^eYQQf{c1ZeyH~cIwi>p_ zY*KBQZ5CSFS>Lg$v=X!0Wa)4D+M?Y;*8;gu*1f5dufwV{TiZbUm{zpb2hA2uNzHW{ zP8!$Lv(*2oO;S@;+o|fKdS9hTg;iySvX=55C4Z%dip7eoiqjM{6n4pb%iod9mHQ{# zFRLKCLB>($qI8nl2d|TO(>MdP*cx?y_gG ze`jl96J(pms?EBC#g*j}b3F4Krb;F@rpb&7jB6RJ82&2%QU0y`L-~vH2j$nwPn7Q} zUsXP%d{}vh@*3p@%9E8_mCKaVltY!Bl?|0;l{uBaDBV*!uCzgEx>B7|vXY0AjuOAp zC&kN(TNI}#7ApoS>ML?9K36!TFh`+O!B0U=;g9@f`4#fD@&WS7^55i+%gvC>kTaKK zle;XtKsHy_LY7(ftju(oco}t>_tIOXtEC;JS*1@(^+@?k2})g(oGckEDI|GOqF=&S zf=l9i$%pA9<8($_#zzbt47v<_ zYCLM3YOHGiRez|ySAD8_Q}vAMUe&d#vsF7(OH|`j-BtBeMO1&N+*aAEGFPQqB~ryy zgaEw~CjGcNUK( z&vtHC?#o;WTyHrmIaxU;a>#HjXE$Qs!{*L*ku{3-2}>@^H|Ba~4(5qWQcQ~&wHY@v z*f2QDfuNI|lboZRgPfh5t(>)-rJT8(shp9Vft;?KmYlkrikyO+jGTm=h@5~Nj~u%k zliXj~AF`ih-^xCheJFcd_NweT+2gVYWp~MLl3gvkSay!=6xnXsX4z`lBH2vY1le#| zUs)GfD_H|sHCbs{L0LB0-!dO$p32;kIVW>SW}D0^nRzmkWLjk^WU^)AWCCTJWlUu> zWTa%cW&TRPlYSt5QTmYdX6eP!Q>0s@OQchzgQcCNjii;N1*I9J-$~t-IxV$JYK7D^ zsb;A{sW>SgDN89eDIuxReWE3zk)n2@%A)L|Z$vJLY!#U)QY(@u;wqvc!XxrQ__FXe;hDlU z!tugR!Yab-!Y_qR3#}FE7b+AA7BUqQ6Z#=|Q*f8y9Kl+_I6*r>c|iuj2LcBK778>9 zBnmhRC<-tNJm5dTKcByzKaSs)UxxoT-z~nKd^7mU_(J)N`GojB@Sfvc!`sE1!RyAW z!pp>apJy-6ES?IUP#z;5ex5hnC%Kn#H*+U&+j2{Cf8)B$wVtb+D}&30OM&YT=MBy+ zoD(>6I6XL3I2kx^b8P3B#F5A0$)U=@z;T;>JNqQ|Ty_t3W%hq;H`%tZ^|NKMxw6T# z{bIe!x}LR*HI>z#Rf_cs%XyZSEG;Z?EEX)nEN_{QGcRJUVGd(9VCG_e!nB`hCQ~t! zFOxbGBhziht&IJQnT*bivW(vuE;6iUXl00Juw($;Nx{MZfuL1xYz%DRm4I9fkQMbp z44`$e0t_Nx2--d>=1On=LrTK#tDr77|WQL zm}f9suzX`V!McO(0=ocb50@WL2_K8V6u}PR8qosr=Mu!IHxS$+@=bz^0Rp+fYZXCj z|AiSu86+5F7!(-P7<3uT8Qd7681fiEx9onee^YiNvbJ7)IMhxkvg(goQ_k#f2t>BnBr0#RWzMg!u>hdHFi~Sa}^SmK3BfEygzv&dG>HCbN6!n=FH`M#1YMLlRb+49$Pxw7uHr* zDb~#_0W2Sxr!m_zzh#=w6w1WUbe3@fV>qKS<0ppW4D%Uk7-AWm8FU$>89-~g85!0) z;)f@kATW*@Kb*)4foFLTa4|PJ?Bsw!n5xCxtGQG;J2@CQ_OeN^g|bd!VPJ`4zQGj2 zbcHd8QH#-%4+78fEatw+2~sJ;p2jwjbsvi&OBwS^rg)~?j0KFkjI$)GMUn)hd26_m zIkvGyFrH>iWt3$6&j8wPu-E0SUsw3NsCiMKl~-&Gpj@NGpv<7gV8r0W;LPC05X6wg zkj#+A(8SQp(8e%{VH(3ChD{8I7>+SqVtB;xjNualXe}3LRV-+IDF*{511JabFz_<) zf%mltG6*w>Fo-gUGe|H@9GN?0XFlaJpF=#XBFz7Pq zG3YZGFc>lzGng=#GMF)#GgvTKGFUNKGuSZLGT1TLGdM6fGPp3fGPpB%FnBU}F?cih zF!(a~G59kCFa$CLGlVdNGK4XNGej^%GDLxI;E833V~A%+U`S+0VMt|2XUJg4WXNL3 zX2@a4WyoX5XDDDOWGG@NW+-7OWhi4PXQ*JPWT;}OW~gDPWvFAQXJ}w(WN2Y%WoT#U zVCZD%V(4b*Vd!P(W9Vm?z%Y?vGQ$*xsSMK@W-!cTn8h%gVGhGwhItJ085S@sWLV6w zgkdSeGKS?0D;QQXtYTQru!dnR!#alb3>z3WGHhnp!myQL8^d;n9Sl1eb}{T`*u$`w zVIRYOh64--84fcXVK~ZgoZ$q+NrqDlry0&LoMkx2aGv1;!$pS63|APgGF)T0&Txa_ zCc`a;+YEOY?lRnCxX#<@R{KY z!&ioH4Br`kF#Kfr#qgWq55r%Ee+>T_9x>^$DscYd{URtQW-etUr>7*Tc2V`%u_9pCSoSxA)~5rP`OAwMY}-1!8p|XHecbt=KtJGdjAX=^Zs7{ zqt8(MKlK03zkmN}Fq*MG{+Itx>0jKx9)>4>H!|%1-NbO`Uq8be##8?m{WdaR|LXr; z8H)ZbXDDHa__Of;E>_=vXBp#|EB-I~FVEWh&xN6l;l{s||7ZSQ_%HddoynS!k!kk- z;J=6dt@u~-ci;bD=6Q^d|Nmv2$M}u0pHY{olj-WecT7r5Jb%CZpZqV7$@Xs-W9|RW ze~13({bBeY@y~(b0%Ol_3C3uKwf`UdyY;t~(S*U|HycCHKQD%}3`+lU{%`mz#kl?d z9u_SI7p6`Bo-i{1-Obp^#Lp=Ex12GR$>g8G|JMv1pnI79#WH0xb26P`VEcFH?}6V} z|11Ar$i)5s>Hn*YiHxQUFPMbEi!6^az1P)#UHmnc^WA@^_YRy2?=JkT`4jRdhR;#- z%Ku#)`(ASKO#Ir!*6{b^C*eQoKN&bA85e#i{rE?;kx}e#=;uG5jy%@+Y4m^It6!YD z+zCAEg?*S<{z*QVDmndAH^;hS66Kk-jNqLxFBQ{ev$E*06;99KS{__}_eD-VC6-g+?qclxIBu$To0Wz29rMEfADAYvDY6Bz&0*cZa)tQ>)29FS%&SSLV1=*jqp;U8lH za|nw%^J?Zc=DEygnI1AqGdVL)WIoT7$)v#K&t%Hf#I%T^lDUs5hvDA;FAOgj4Vgrk z4*ln3kzwU#NoVn5VP!eUY|i}Y|3>C}%!_cnI|&WFn2LNWou%yW{qW0V{T%) z&sf7K$Yjlanf(k)9@F*z3I8G(jhU;Nlvs+H-!PUiS}@u&3Ne0U5NABboW*vGbvtV^ zi!?JYQ!wL6#@);_S@y9^X5Gl@$U2o-nrRBdd#2Z{fh@_)aZI-u4>0yKIx|_aaI>^A zGBf=AXZ3&Ge>DanhCTnk{I_KM$uyPmCqq8Nmj6rtTQhHA?qEt~5@+IKdd0YuQIp}y z|L6ZS{`D}4F&$)RXIS=MlcD|poPS6DPiHb_v}L&Pf5pG9|0e%E7#Wz-m?fE$m?kmq zVwl6A%IL+g?w{(v`akRb#{cL4_lTjHq3pjg<4T5)|6=~v{+saEj^V-o!~a?SKmL2< z&)?r)|7QJ7V>tZ3m!W{+(?8b#kN-+CWc_DjsQEwVU(nwL|M&g-_V?lcUH|U<*Z=?h zuk?Ro#+v`X|Ihv3@XvMh+*b`HO6?R`HYVl&oMq= zT+cXzvE%=`e{=qR`Rl>t%^1V5kx_)v@Bi(8Y5%YP=VeS``2PPY!vY4i{}=w9XFSH( z%P7crib0N1kWu14Xm?J{KaGE(|JwdV{-5*z)<4hxZ44Lxr!uVgzvh4U|G)n&83Y;3 z{%SWq?);KjNoBMzF zf2;q0|9$&+<^Rq9rT@$SuV!#!;AF`E-~MmYABjH`|L^`6#@NoV{{N$YE&mQM9RF|3 z=)>^hf64!)O#7I=GgvVEWawp>{$J$(-2W;JH~;VcAH#TzVex+_#%P8e{~P~z{LBB_ z&5+M@pW!Q`5#t?({{IdCp8Wa2xQ!8X=i}P{cK?I^NBv`GXl8L_naA>)c_XtLGY3P{ z|HJ=g{$Kdd^Y6U>U;aJ+tH?0(|Gj_98E*d1{HMcU@W1n42E)t$2masv*Zg;H5A{Qliy$oW6-U&P<){~G_>|F{1$`aA!B-T&$TQvSF8Tlx3If2RN2{=R0I z%b@k2o8iyD?EfwQzy2%!x99KrzaRhJ{!{-iiqZbR$3L6D3;z}WXZ+9mFZaLu{{xIu znBFm7VED^;mNAG?nQTloQ9~dSuE@jyM|JlFgf3^RI{_p(f!>G(K^Z(=j zhX1esRr%NSx8%mH+V!ISj3gK1{C|6&Zy8fBD<4NDgAfjKimKQztRlyOmPgg|Lgw6|84!>`;Yst?Y}dBXZ=n5XZiQ;|DOM+|E>S~ z<==aT`~TPdEBjmdKaSxygBFt|!-;>9|I+>+|Nold%fFrfYZ;3euKZv5zm{PwLn}k= z|F{2ZS>`c4V@zQ*Wh`XWU{w6i{jc_q-rrsS*%+D`%ow{E=l;L=@Au!I3=RyZ|F<)I z{eP4(_kZC(wZHlQ44EG>DKWogvS&*B@B2^ouL5%*Qy!xrlO3ZQqr!h(hMWIu|NZ^@ z>+gcU4gdE4JNmEvUq8d_|NZ~l|M~wf`2Xd9DT4-s;Q!LUPk-HnSoV*h{swg2<&*Rg+!|9byj{=e}5oqsR?{`i08UjakR|JVPHG0gqn@V|iBh1r=Y zo>81(;eYl2Pyhe>SHtj`Ih1K7;{*nFhVB1%|G)At^sn!~9F}J0AB;YXxeVL>@BP>O z*O4@{1f@tQ>;LxrfB$dp-%f_S|Hc1$ z|8D-H@_)krW&a-kIrirjL(PAe|F8ai`}M&`;R?CGXozZGh+f{45R4(HUD=r8!;!aaI%WC zonU2U_4#l7Z`R+5Oq-crGKDeoGoNId|Nrzq<$tsOe*dHNm*MZHzZ(Bm{8RaN_kZ|* zLx#=&v;GVGFaCe#|CfJ_e>49u{a*fi)xXXEGXL-S&-Z`(-|heP|114V{2%;8){zGXPW z0IDlK{Ga%LKf@M=^8dR31Q@dz7XBAxaQMIB|Gj^Ge-AN)F&$wLWqAJ2m!Xp(pHYnI z57RuRIz|n~nG7Ke`ivhLCoru3-~9jSU%7t<|5*OMWQb;TVaWZzl0ol3-+#IPa{r7O zmod&_2>f67Pw%hJ--ZlVvvG6v9&a}9>GP*EuG2UWGVK~Pi#Bkx?)c-#JB>(OIf9~I^|Fam{7#{t<{D1rZ8UHu@ zU-17cgBK$ggU7%1e~$h3XV75y{_hAw38Mg`_kZDk)&GPU0~n6}XJYvBpX)#Szd8SX z{)sZU{tx`8{Qts#6^4)h-2UhOpZs5n!JXkMLl1)o!@_@4{;v5y^`9$)9z!(4a)!VE z7yh67fBOFm|BDzVGcYs$WLU!x&oqtEgu$A@`Tv1`#SE+epZagd)WGnF;pl(n|4j_) z3^|Nnnbt7hV4A`-naQ1riMjXxx_=yhHUD)nsxs_k+{D1faQy%If1m%#Fdt>y!|>;S z-~S&B?hJbvWtnd?d9bvy9AjZ+(PnOENM}@MTFLm9NuN23`2f>5#ukR}3=9lL|Ly+? z{r&gv-{1DXpz(rehDrw8|GfW}{eSk)_n#kw2*c}t6aQ-dvG|?%&+K30-)P3aj29Su z{~P?%_`Bu5@PDa)Gykvr$Me_x@ArT6|2qCJ`q%Qe{eR;>;lJige;DrkpZ72R-?{&1 z7*ZIr|Cjwe{`=zppZ|Y?T6q6`{(t?q=ij-%W&eEs_A#n3K4P55w3?}aX&2*Ch7tx9 zhV1`24Br`)8NV|mGgdL=GCW|=U{qm@WxUGth_QvylW{F$4%2L=d;gCzTxDqdAHwjC zF^9>XshqKn;XK0{hUE-djHehh7`qvdGyeMji$R*{GGh&sB6BSZJ8K+^G{XmmLPiP3 z9gMRXtC(t-cQVgsSjBMcf9b!+fBgRXGU)!_^zZloC;vbH-}Zmwzomb57$X>r{|7PL z|3BrQ+h5<`^}q8N^8VldSIEG~!25s8U%5X5|K>3+V9;VX@t^a*$3O4CGJh2RaWnY+ zpZzcM|NMVD|LOi;^RJh|kzpm{QAQ<(@c)+oV*WV(?qc}N$iV2r=)%y=@bUlMze@iE z8H^aeF+OB`@W1N+UdBd-!v8$~IsdW#Tlv?Pq2&Mae;*i6G5-56!XW$q-{0#D>`XJ5 zWm%k9#F+({lo)3-ocb^Rzw+<0zx7ONjQ{>e{&)Mg>HpDxFaPxaH({R4IFF&{|D1o* z|F`}V`G10?miaA{1yc&+HHP>9E&mt%H)44DkMsY&znlIX{O!u{^?&m}qyHBfp8Tu* zm+;TzuR6o;|M~yB{)PQ5{&Vhk{_ktQCK%V@%2@c;V1i+@-A|M73uzs-L;|8o5Q`uEhIi@)6% ze*8CMIQH-F-x!9x|L^_@|2xiL$I#9=kD>U#JA>+f)BlG5XE10mcrq?xc>Lc0oG$7a zxEU`oyHkdr9{jWQ-%f^$4Bh`L|6ThxpGk#LiiweN8N;prv;H6aXZQc< zzr%lj{oDIj^}owM(f@u7+zb)_XaAS}|MTDef35%B7>pRg{;&Ki^JmN7pa1^+wfxt` zn9cZd(C|GEDp{#*aQ^?wHqux3H^&?dBK#!c#PrR|E>Rb|3A*q$Xvo=&pMywBJ(pQ zE~Y959fr^Uq#08GpZk0E-=@F6|IA|0Vo3P^hoS!e`G1=Kl>herYiHQWunb0{+;k=D#JB~HUGE&i}<_uPuRcgzw7@u{BQZE_*d%B`hS89UjKFfx&K}B|K2~Q ze;fYtGVEZS#c=EY%YSYRhyQc^*ZlkP_lEz?|6cxe_`8YW-~YV-Nq@usJYwu(uxD^& z`1+rpfrWWDV;{qt|N8%%{>T4+@SpvEJc9;P4TBuR%6~x&tNzFS|NpO<*^{M<`90G& z#x_PZ#(7LLznLyD<}hw&i2C34Z{ojj24#kR#zl+~%#O^)|4;q%Vd7#I zWY%PfW4X)H$`btl#J_BYNX7|_V$5mGkt{EnfBx_IU;8iZ->koZf8_o*{1g3W`v1Yd zv;VjLTlU}Yf5yMVf7ku9V0irh{lDJ7?|(n~!}(wL-xLNXhJXK!{~P~5_;>NYo8RQfBjGNAOAnDe-Z!8{+IvvWk_Iwc|NXb`zr=sXf3N?({^R(6&i}9fav1X&v>6`$i~P6Xuj-$)KM(&L{o~8v!!Y~* zpMSUiuKTm%zvTbz|GXI_820`D{4ez1hrhr7oMia@-kx{lERU`?ueJiT`i^J@_ZUu;zcje|Cno|MmWJ z{g3#!`L8|0k^koZm;L|zui#(sU%TJ`{;g!V$3+82>&0%f>MMzu5o% z|6Kmp{y+Qg``??t?)}gF-~W%BL5E@C{}=yw{w-jTXSn@8_W!1T3XG8qS^ro4zxwa) z|M>sY{%!le?f=hz9~d|p(*IxnZ}9*9--bVt3=#}=|BwIc{`ZPOgz+fDxBnvl;BDPoXFV9aOVGwf876=87BYF_`mx9 ziT_#*`TzGbon<)xKl}gle^vk6|6l+A`o93fK4v+FssC;M8~*$H_Z8zC1~-O=|M&mL z|DWu-}`U>pXdKOCVr+^##an$7}^*P{8#+n`p=v}hT#W;B=ast z2S!HPa5paz=ATEe2)=o&WCtjQ*bf z)52KFc$s0^|J463ETOAP5)OjEMSyk zv}c(2ujk*Y|117Y`M>DD*Z<}JSNz@a$KwA*MkdCu|C#?^`0vS>$Z+r9!@p1e%=>rj zZ}w)_`mWcqXRcOAnm#(xa;3?>ZE|M@UP{-6Hu z>A#zQpZ@Fof9C)H|7{Ep{+s+y{HMWU&0Nd0hUo(1MFt**M~n*?4>A@r`ZKCA9%4Ap z`X9}}%b@%J-@j@9!x#?y_hh*H|M>rh{}(YRGdTR8{D0%W?!Wu~AO7F)--%K1 zU-Dm#zXuuQ8C3pPF}N_sGc5nV^ndz4tG{Xg85qR=$1o@|to%3sugd?G|1$om{44yM z{y&J}9)s9F@xP4!4H+){Z)a%yU(T@i|BioE|33V?|M$fIhC{xko}|8Ld*z<F1} zPGXQ@n8{epbc3;tF`Gf+|FgfP|Bo>AF#0fFWw^-j`2YI<(-;>1Kk?6pVe|h3|IYo_ zW8h@aXIRhB%^=6nz<7({9K(zMZ2uShfAi1tzZ63`gBk-L!=L}v|Ihpf_0&}VnEvhj zd-=}^28qA?f3E))|J(UD^uG{8`G3~`vj1lP)%oN5n}=cXU&g=Z{s#R$@cZvyD+aUw zA^$%8x$t|zf3g3*{}ujO|Go6P{!i`yCI1~6^Z(obXZWZ7_sC!7zk2_-{@ecd^WVx@Z^ybNXk-5B2e&th<9 zSk7?ipYy-s|2rA>GfZa)W~l!E|KIn&27j&ow=rD$@Ad!epMu}t|1dD6GsZLY|LMxAp(2 z|9lJ)3@85;GZg;k{kQU84MW1e8Gm#CSN_*#`18M#q5q#VGe2`9QyXJ4V;rLcg9pPQ zhTV*p8MiRrW+-92z*xw5fPsY}<^PWVa{nzE&N1jSo@Lm>kjlWxc;mnEe~Et{|3w%b z7@qxC|L_0r`oB&F4@MKl`~RvK0~yZz)Bk75aQpvbhB^Nw81DSf{C}K*gQ1@x?4SGJ zyT7adw=gbbaAd6c%lL=$w>pCp1E^h9!nlzk`2Ur^*Z*Gl=ls9>fB(Pme{KJb{$>2% z{=fY1xji3}*j)|NAi@Q?TZ zat2X`6^z#zmj1u^FYN!lf9wD6`oH(T27?*H(f{-Rh5lRi-;^Pafs?_E;mLnHMrlTV z27&*_{`)g*{onroDT6YD6$2YX_5X$c{{5BsyYG+v-}3)U80P$*^6TMmssG#mYcQxV z#Qqom|K{)eKY731|0XcJ`Q!M9>wnO{34f#i|M=^VJZ!%UhwlZ-3@A&Kf&znJp@d86TV==??|2hou3_Je&Gc5dn z@PGaP+y728#Qb0Uub82V!Ik0v|0>29##Ic-3|0)j|1bU9!{GG)-~VY0;tXg1fBk=h zVdme3fA;;({dMoph5x_)+y7zt{pF|T-(&wR816H){Ac`s{;$d(=HEI0*Zo)cm-Dyv zPvq~TzjprcY7>0!Zw-_!km@)D&8ZkOETK<3h@AJQn|6BeS{!jn^hQauM!@sb9 z5scOh?*BdhfB5&Ep^icC|F6F~|NI!{{_ptzjd20Pi+`8@8Zbuwd;kCGKi7ZP8Llvt z{6F(IuK&-^e1eIAX***m<8Ow_e;*kaGX7*JVN_>a%V7V% zfnn1B`hT$u>I`ccB>&$4j~JX|Y-OCq;L32Ek&p4u|MmaQ|9{D_@1HSaKZ7a5Erte$ zHw-ENZ~u4uFYrJ0-=zPX4E>BH|0n61SY-i+WWM=sG ze=g%kh6xPo7-lp4`_IQ<#c-41JHu^;sSN8G-u-{V@Z-P0f205Z|2qCZ#jxQ2hksW8 z6dA7kJNQ?R;oJWy|GEAz{rB(B%fFlqyZ#0JJN$qDKZn0p|D9y`|Nq6mrGI1px&Iep zxby$d-*10g|K0uP{eS*{X@Vi0B6$&k(Ph|!RdpW)@dga1qz5*Qva=rI&C zcraA_Z)IryFT`N@|Ki_Ge>wlj{c~hI`uFu8&p#pm-TyuNTgb4Lfsf(Tzxu!8f6V^R zXQ=pJ{?Gs4|G$NQ3jV+P@4@i>pWR=#KZ*ZM8GIPm{oD9=&7a19rT;7#bQrW5lKva~ ztN+vaH~IgqfARkt{_psA_^&Kz#RtPr<}PMwmbc8ynL-(7{ZD7~W0Yr8V!h0i$-u?1 z|Nk{6K_*?sI}F+k@BcCV+roIB$&4wDaWg{^!-c;Hc;h%xm1 zEBpKG&t1m7j5ioI{$KDCe@F6aRZNI5Ma(Ff$l3 z7cf5mpTxM6$)73szbWGthI!0`kYDOO(rF+Bfo_n+_I+dl^x z3jf>xd-nG*!?gcf|G6;OG06N^{i-uR^BBw+(;0XevKV9;<}vvFFJxHA(8o~8P|P6BQ2ICNU-jRN|1tkR{}2Ax z_&4BB_}>}-*Z((RaQ>h9H|GD5f1!Wf{uuvX`+xr5RfB*IRE6up!f7RcN|Be5m z{&M}l@xSoD=-(%Q#Q#?PoA+OvL6~vnU(5eR|NQ^?{CoCSo?-3p6MsAYegD_=|Mh=H z27hK-CKJXEMnlF_26F~MMped>4BU)Sj3*hY8Ll%uV0^^D#IXN=+5aUBf{Yg!)-tFt z@-X~mSjP~;c%ESkLj*$!gC4_eMw5S0{~!J5WyoV#%h1Ev$q>Py%~1Y-(SIcd8O8*L zPyZh=XfW6_xG^*_=>Aju%kwAe_t}4jjC=pj`J3^l?f1#QKmNxsJpb?Y|KmTAe|&$J z|B+|h`d{eZ+duw)L;qU;?PS>X541|C^3VF;evFQchyKs|SNwP1ALoCJ43&%-|Kt9j z`?uh4_@C?lzB4%d7yGaLkLSO{ziOJ-;L?lzj}rw z#)%AX8P+po{Qt^O#URa~#Sp@{=KtdV=8Uq8_ZU+C>oZ*a&++dSLnT8aV+O;omt%&}`!|1}DbN z48;s}|5h^yGYB($`G1(9<3G#)lMDuoDhwO`HT+lp-|}xYgZqCCM!x?i{)sajV^C)h zVEFsr|Nq4Q`3#Hy`!Fo|ulS#ZVI#vd#w-6L{?{;O|Nrw}kkOkl<{u-ID5EIDcLsfi zWB;2O{{8>^zl~uFL;imahV=}48N3+s|3CeI`Ty>JMT~v_U;khGKk;Aie_w`phO_@~ z{D1U+?|*lO2!=3*yZ`5bZ&g3au<4)8e}4wa|4aUr|G&ks;NSB9tN-gWoMfo`AN^mI z;p6|S|Ct%W7~=m=`R~sV%pl4j{D1xb?Egalr!lzwXZ`Q?pZ$N_|F{307)t*?`+x4g z_kYmYj0_BQ|EK?-_rLMK8KV{h-~XcwtPGj|Lm1xw*ZN=2ko}+Yf9?PI3}60z{Rf(> zV`SL)|Kq<6|K0yz{=bEBKEqOm;|%SL_x}en>}J^a|Jwg##%uqM{|{%J^8fkYM+^o3 zU;aPHuz?}(UpRv)g9f7{!3{hDbqvS;UHGrVaO+>p|M-7=|4aWf zGuZu4{creR_kTHq6XR6|Uq&N_8pgK_-x>b>zr^_A|4D{-42=J$f@aYEW&f{YSnP|Ly;;|9{S~oZ-;_*$e^<`~M3t_%iJI|L_07|C#@<{9C~A?*Hb0W(+6(FZvHU zU(V@2A43eo6o!ioISiZ(0*pBf$_#l7eGIGrPh`+%Nd7O*$jory-!}$rh8_Q17{VCT z|F<)!F!V6^GgvUJXE^^~ib0ownZc96oMHC=Tn5koeES2w>R9u#_Q@ft!Je@!@}W25!d9|CjzZXVm{6&M<@F)Bjihr-4G5Vb4EZ zrrit;|BM;+7+C*HGx#!0{^!eZ=D*y(HUAedMEv{v_rU*K|2qEv`LFV?=l|sY^Z(m1 z<}zk66f^B*boyVxAkUch-;p7kDfHhbhHS>^|9byzU|jkyjbQ~t_us<|pZ@Rve~0nn z|Lgx87$g3l{GY=3<6q^!AcjZ(&i;S+|H@y#|Aqgy{Wbo7{{M`BEB^`oU;pn8!%0Rf z21BOHjLeK7jC_m{{|_Fsx!||8K{zk>SRF zH^u;l>HmK)urvPtAMxM&zw-Zo|6l%3`v2*F_W$<(*v<|2zLL{lEV|2gAw#%nUC7c^GsV4*oy?e=5W4|8GGfIt=j){}^8Vw_$+f zh@}6A{~Ivu`me|k#PIU}{(n{svl(*#vocKi=fUX9@cREz#4|74iL@aSI+BR^x@|DykY z{=5A@{y(3g`TyPjQ~opkPhpT{;QPPfzdqxSf1CbaU_Ac+2g9rXLjR^RO=Hqwu>XJK z|F(aA|0go6|F;Y@r}Xc}|Cj&y{yF?FVz6es{{IWZK86T}`Tw6Xeq;z>xWd5oUxOi> zA?5#MhBk(O|2O@6&tSr6`ah4s^xtoWWsGY7%^076J+^I^>YU;E#L(Td?Oqcy|Ye@0A47(V@P`F!YzxlrqLk`2u|H+Ke4B-qM46_;j{GZ40o}qyup5fGgc7|^ZE&rJq`57V^ z&N19zNMbPm&&eRfaN^%fhBFK|{|Eh_%~0_F`+ph6~m|2zL*`v2s=G($8) z-~ZeH1OML#wUz!m|F2@G`QQ29@&BiPA^(H_3o%^%FV5J`aP5D?|J@9${y$|X`#+!I z149pk9)l}`B*S9{Uj|WzV(_W#E({$1>lgwVvi^56oM-s{Kka|@e?>-ThJJ?I|5yFr z^=}Kqga5(|FaJw1tY9c%5dZ(+|Fi#P44eKlGyM2}`G4))CG3;thWux8x;KZwEPe>P(WgZ2L=&=?=XErx!E^Z&2^*JXOf;K9Je zu>JpHhDye}46O|L3}TGe87BRo_5aO(8OA~eLBg8%y&EE$a%=KWvJ@a?}2!*>Q1hFZp>4DT4c7}yxp z7&89JGW`9&`hN@q7vo%p=l?DKFJx%{@5T_qQ1bu7|5g7B7#96^{{Q*kr+@K`*$glK z@A<#?{~N}c|5N{;{$Kmwj-iTyi=mw%gh86|uY)hKm1_8AASF z``^Q`@c-ohEB@R4X8@o4dH;X&zkUDJ|Ic7>`=9sk3quaW9EOtrrT+>UD*oI2&trJ; z{~ALX12@Bg|F!=o{eSfD*Z(d51Q_BN5*hp%?*23W|NH;V|8M^PVOa3rhhZHaS4Mk;}M3B|5X?+{`Y3AWO&4Ik%6Dlm2n3HFT;laYX7e@ zCNe58Rxt`Noc;fsVI4yWg9*b_hL`_dGl(#%GgL5K_|L#F<^Pob9~svETl`;)Nf$Kc z{{IleREC}Zr!rpoKa;VDF_6LSf7*XZhFSj|{?#x9{}*GJ!8qyvsefAkpZynSSo^<- zfsbL*|0N724EGt<{a0mp{{QDcBgT*a_5RIgRAF4o@b14X!`uI%|7SC7W7y0vf#K=@ z=L}4YGyik`FZuV5p^%}RG4224|9}3^VMt;KWw`V2_y3mvC7_)k|L6U`_3zXFwf|rJ z>;B*NFN;BuVcP!{|78A^GYB%I{Oe*^#?Zi+%3$(8f+6L9`~N5ZuKfG|KkB~(qas7b z|KtDG|G)iTjNvK6Oa@hkBmdX_f5Y(O|Mmaj|7HHyF}(So%_#a`kRgXL<^LRp=l>u5 z_h6X7Fo$6#!?XVkjEM{r7+(Ls{ojCL|NmbM_6)uZf{YFSYZ&VPKl`u2z{$}2|JVN@ z1~rCd|GoZi`1kq048uHzXog4sKQeSOg#Ca2e-Z;9!`J_c47Lmh7>+WSF|7F?${@~Q z@qg3*$Nzg6su%l@bTU;KYB!!`!3|LTn84BP(8FfuW8GN>}>Gi+l3<-{Efr~j8SzW)E||K0x` z4DF1Q7#bO3{y+Ke%NWBDz_8|j3PaWZAOCMMJowMdaPfcU|KALn|N9tX7!>}SF^2qq z`!9)MKErGV|NjLHrVM8pq!~CE1pXgjSjkYqaPXh`|11V>1{H=?|Aqe_XPo>$?SJh5 zbqpu}-}F#G?e|408D|KI;_{(n~ne}+^4bQpvf-2W>v^!|VIKj;6=|EC!q|DVP1 z=zr4xWek`9*Zx2J@5TRY#_0dX|0n!c`p?Pu;Qy8XS^v!#?EnAzf9pTv|M364|G)hU zXK?<1=YRPBBmYuu+{p0ZA2S0N;~WMVhTZ>J7(*CV z{|{sM_HPyg!+)>;@Bi=rf8pP+|2O`xXUP2T^Z)68X@-^m5B{%YC}N2Eul;X6!@mD} z|4IJ8#xR4S_`lBoP6ibQkN;=?Kl>;AUxR^*;lh8>|F{4DW;peK@4pTPS%ww=gZ^J- zIL1)*FPY)s|IUBe4B`J{{;yzkWtjNCmm%`M7eoDjM}`Ru^ZyzCH~v5Qf5QK|e{=sO zF$DY<{`cm8;eVF@0ssE}zrnEVf6)Jk|Ed3Y8J_%;{-5xF<^Pxelo(k5Z~g!C-?9JK z{x4xPWzhXU>t6%o-Tz(xdKg_8Wd1ud{`KAjhBN<_8B`cj80r`@|D`d2 z+R*F%{r|t}-y8i^jcOaIUQ=kwo;LHfT0!kz@6A}waQeS2 zqXk1Cnp$13zOU zgXKS;|0N8L|7HJ!R;=bPl_@5Kkt8DhT{zD7?1ux|G$`F@;?uTkpJcXV;Rc+ zH~sHrSo5Eiq2<3C!<+yA{+TmIGF@eeV`ySH{Qn!{|NqJVpE6o9PGZ>he;z|5qX=U= zg9PL8|F0PTFeEc*GjKC*`@fbklR=E}<^OVqIEF`mUobK<_WobWt^a`x@BX_m zJpJGH|HZ#Q|8*Js|6gQy^uOZ&w*SoxSN^9mZ2iCD|AqhM|4;qr{{Q5^J;S^I6aLTq zZ^f|j|F8dd820}!Vz~SN-2YsL{r~$J`u;aE_%PHmEMtgbIQ*aQ|1O4Y|F8bP^nb~J zLk8LZ5)7&T)ft=_LK%`7uKhP<@c94yUmru;f6#q%MgKqkfB*kJLkz>~{}=wR`~T^G z~AI#AGzmuVpA(WwnL5E?< z|D6AO{&O?T`fvST<^Pud?*EVdZ((@$-}8Sc!_WT@|Nr|h&Ty6?^FJ5EQ&8FP|J{ET z#%2aahEj%z|C|hq|AW?hHvjkf&+|Wt;l=-UhFAaN816D8GGu}GvnKoxW{_k!@c;FH zHU>V1kN;;e)G_cgl>DE@@a@0h|GxkJ3NK(6$1mqx&LDSm;P5_kYbqrf7bsM|J(nI{Qvp?>wlB~ zxeTlfj{h?mKK@_Ku;IS~!;Am=|1}xZ7~L4A{a^Ioc7kXE&t{JzhqEn zxcNWnKWO#av;W!*Aq-6ni~pbfFUG*k5W|r5zk|W+|MCBc47L9^Gi>@Fz!1$4{XdG~ z-~TBL{0vPDjtuKTyNdr8F_iyrVF1ldfkw;!{J;JGAH$*lF$|OcfBqN$SLy%rzvBOc z{+0c={ipMP>pzG8{Qp<}m;CSezv2I`|I_}*{Qvdei^2E5G{gP>v;KQA#QiU3SoD7l z!>|8M42Az+G4L_mV%Yzm4>V50(DFZ&@yh>NMl}Y1#!?0$#tHwAF?unqXZ-#D1><^# z2FA7j4VkJK1ert`BAK2tJY;;%pwIY-A%RJUv4rsw!)^v6MovZ##+!_FjNXjJj4ce^ z3|0)ejG_#`7}ovY&3KF9F=HOXD#rPY&P?|h*qD47ZJ7=*9%mF}TFd0g=)>s36wDOJ zbcL~%=@%0#lN;kvrl*XO%uNhynC3G*WJ+SpVUA!>W8VM&5YyfNKbW}~lUYvu>G|XR z=k_0qe{uiZ{(1d-{8#<|zQ51^MErO8x9ji2e`QPjRv;TSgPy8SE|MY*y|1bUtF?{`}`M>PHEyL4)?hFh6-}=YPkn;cD zUj~M?|2O{EVMt^+@^2Hvng81V?=k%T7xnKgL)ZT+|9e3zr~YR%1~NSSca_1BL5X4N z|2T%<|Dzcm|F2`1`_Gu+`hV5`TmDaEIQTz>;R}P|UmXT%h9iGl{?BHJ1g-36%>Luf z@POgVKRd=|(C(}MOBm<>uVQ%3xbeR&V=`kCLkfc{V;IBjf0r0q8JHLsGHhVj{{JH5 zVFn$>2F4ghF^0Pg6^z>%W-?YX$}yf|_{4CPVKNgVqbbu5h6u(Pj9dOsW!%B|mobH@ zk+GUlf+?Qq2E&Q}ZcGOlQW#j7%$X+tJHWV?@di^gBNxL@##F}dOf^hyOp}=W8CjV^ zn5!5ynQfSC|K~B=G7B;tX1dKhjrkf=2je4_r_AasxBu+=^Xt#IzrBBt{89cV^>69l zoB!nhwf&v+ui;<$Kezu$|4RM||1bMD?LW(Zv;S}Z9sckC-|gR;|5pDk|NH)L{{Qg* zj{g_`$NsJFm|NXCLFk^6HIQ(DyzbM0RhKmg6{)6`Y zA7bcW=>Gri|82%o40;Tvj0}uB8B7_J8BQ>?F`i&xXZ*yV@n4Tojj@3tjgf&tm|;Dm zJmUj~{frWf`HV{$t}^s8S~1!))-zT!dNYVJx-y<)>|*@M=*Re*A&Eiz{~^Yi3-KI_LiZYA%`i9aUx?UlQ*L}6B|<#!y?82CSfKc#)nKdnOYfL zm_9PIUdlX`DUNX)(;-Gx79*y9W@#1+W?kk0mTyerEJe&EEK`{) znfY1nu}oq;&Dz8k!v5pWsz0rNGXC87JMVAiU+KU5|MmS-`FHxS5M#oBi+?8>I2oN8 z68@k2_v63be}4wh*>-Ojj2TTBotSJH9T>D2zyCkV5XP9p6wdg9!HO}DX)VK41{EfL zrWD2^#)pg*jO`427+)~zFtsyYXME1s%k+d{1)~F#GxIV~erH<6q|UgIX)9ATlQdHZ zlONMT#@mcpOp}?6nC~;OGQDP8$P~pC#mLB*%UsA*%@oLdf$2Jv5%VslV5VNChm4z; zK(`?LVmiRo!~C1^HB%Gw3g!UjaOOG8g3N79yevh`(#$N(zRV0P^(?t8*O`r&XELv0 z)?s7iP?>@yVj{JKdUK9&i#+UPYDJFuIKFMpYEtzI(6#7&eEpC ztp7n5dh#%Uj0K?u5P0=6Q868EH=z1KC*IPe!w!9otsBl;IFW<#B6B~`CCep)xK(S>e(1g zFgsyY#r%b(i#?1xiT}FL39&Dd_Oe_Gr<6QZRkTD6+s*u~uQAPJ-OCxk`$ZsL)o@ zqtbnqnHq=m<;~=+pE0?y8gVY?jS~zIRgzpRQ>wtEvQS+`n@gYFSk(N#RWI{*w%I(< zf~I1JrEKKqC_h#Iuf5S=m+2>~rS?}{*gc(?^;pw6czG`hY!+E3At&=(K3`c-y;v(= zufS-L*)gk)%v@|n+-3szL{>r9ha#kd~v9udqG z{VP!`^Ge=G`HR|bEe-uwMuO%!Rzl1M>^|H-`Bn)@iG7rOC;LTlo@%xxpYBNmZxddN zLhG+g_UwAx*Z2~JWW~ayc;qfAW~vHmcIvnpTs1yyu50};3j}SmK#(gvCOs{!F*PPV zCcQDWI;A>gNy4m55ERHbnI@1SkRg%=0x{{|GQMR5Wz5PH$k-958M7~bN8G;n%dwYZ z&&HgMxg5JA4kT(Dr5R%z1!6Br0Lhg|Cap z%6wHQR+Z4&q*r1rY;nfM!||u9i&qq*Jo9Ca$Gkkk@)9w!$x4yx);i&aMP{3+b*x49Jrwu;C~Zjt3znx|&0-DqHHT4cp;@9ZMuaf#_M z>r2jD-WLLHB2D5ur54LhSGcRBuDV~%SzFh1t(7%n3R62<9QQQ-+rlrznPmRRUsYbB zzDfI*{yF1I=3A^wnLF4IakuhE2=j;^kcyQ1tJtX;swtv-$Dqr^$KtDX5aS=_M6MZp z&xPiTO_K_cQ&QTk+N`Os`^{jENr1&O>ok@%?Ay8d`R53|5Dk(nlUXZYt(2rXQ}e!_ zt8u^i6zfJtedY`7)!a_}{K5;x{G{H>`YFb$EK>K?ooys#-f3OQw3Ic0^Da-ffU(Gb z@io$w@*>Jd)YfQS);nf&!0eKh2h#(VQykVjm-sD&H;es|)R#3;xTwUTdPe=AzP_2T zbt{Vu`%bQnyi9^Gg>}S#NPdt>lHaXZt^8B%i2iR=7Hb=(O4du9Yk8*&MvA&ha?3tY zC{S_I(ACi}_-_2je6BU<0x;0&MxgsLL2S@DMeGcm3?Mci!~g$W4FCUw?vMhVW5mM1 z0u~3cK_`lV)G#po{|~x}5u_4yFTKUzX$&|1OkR| zKmI}35&x$#SU|;R{F}yb11b&@tAL6BpT-~oWrM^R89+V*-O#DP;J^TK?f?HQ;Cl}t zenDk}F$ZFUXowt)2eKQ)hKPdF2|_*S%r1yLBRKA1_A@cCftVw>%3(9#AaZs8|+AwD_Hn~bc56*!T}-=atqi2Z~|l^ zoC9V+%my=|1SBqz^@8jMr8$Hc$VSi^gdo>Jw1GmJpFxCyp8*mlAm6Yvh%zWMC^LvM zKzt0kEnbGfg29c!f7&RF+Sxgix)HE5{Sj+jWgt|mmYOt_qGAc7FvzV|5ap-7Tu~~7t zN*ODKDut?rYISS$DfT$@dcLW7-FkTe3$rGp39~x07V}KzGR}EAr(%Dd6k#x70GZ6f z0y0OFMTEtKMV$p?PJm_+XANhQXpPlUr6uYsHIx}xSRnRTvGTLFGnZ)ANOVeUlscqy z!Q`10Og9G`C)5=n-7%syRx!pI(Y?l%(Gc5RnS+_bnZtDYy(ScF_B-Nt#P5M0NJfMa zWU~o#K5Gk$rDnC}HRkPs*EO#y+}3$%!fwKB$!E=NYR90;qRMQ~?99A_xmr`W2I5XD zPAi>ag?NE9(PXtct6s}<7H2CS)jVo_xNQcrBeNi%tynv=Ft?ASri!MbCc89OAU`vc zri!_IAS4+xfXWk124#3SFtdO{85Eun^8+;bIpa9=wM0L?g|IGqHOES*ZLY~$nnM>CGixqE_zk(m)>9wgk4*I=9$df zn9ndT;#{n=TxYG$KOG*EfBd{bU-mGwn6Ox}&Sc)le3AL{UXUJ;UlLimMA>v8sfQID zYM?k&X9;F$X9>_O(d^L7Q{rVS)GQK;mZ+7emsrfRf_DvXL&!RrKe9jNzBPW^!s(Q! zIa_m<$UL3XqAzqVso(d%SN*j4UH7|Hkn{*~8^|t@iFukGnr#XjbPnnqHo2t!NuAA| zX$s4F*8O>!XP9q@T@pX6a7X8o`aQ+3mj7)yJUF(3at#&$=I3Qr=4VzAU}j}y;b3P`lxO1PWD($D5#(iIWo2b&Wo2Pz z;$UOtWMk!IXXW5vWoBaF;$Y?GVCCUp<>g=%;9wQvVCCXu72;$S7iHq*;Nat8<>qGP zzG;;AIu$WfkIO6%t?-5@Zz?V&&yx6%}O_7iEuh!;o#%p5aQwB<>lbx(Jk`Uz*7vqu;=Tea5Qj+1)lIIfS<`&}R7Uks@666*V;x zmzP#okk(OQG0>IKP>|J8lG9L-*Hn<#QjpitmN!sUFi=;}(^fDr zP%=Bz3LX0Aeij1a=ri>PhMvRjfCNbP&U|?ir6k}9k)MK<`v}ANea zaVO(x#%jiojL#WF84Vbn7^4{z8S@xR7)u#@8MiSWW?aEIm$8;{KO+aDJYx=H6JrBo zDPtXDDPt$&WX1!G+ZZP^u4A0Y=*9GaL5q=%k%N(m@e2bBqco!>qdKE7qc|fAqa33g zV?X0;Mk_{LMju9h#&E_I#+i)k80Ru(Gv+V`G5RoCGtOb`VBlp8XUu1u%D9ekHseyp zJ&czaH#070^kDqX@S5QR!zPA}jE0Onj7*H66I;JA{9^dU@Rfmq@e_j}qYh&+V=SW| zqd#LPV*sN!V>shV#-EIrnE09dncgwSF-I}}V6X=7Uo&FVVH9H&VU%aAVeDdbXY^$Z zW~^f@Vk}~M!|;pYBg1osj|^WK-Z9)|xX!STVJpKXhV2Y%7h zW7J^eVH9ALVsu~>X1vXCnqf0TKZ79Se}=CNZy7!@ykWS;aFgLa0}JCzhJy^d8MZU5 zV_3|P&)^7FeU;%n!zqTd3}+c0GQ4NFz;J+JH^T~s84UG|Zj3sN@{CH1DvTnGzZsYq zl^NGDax(QY8Zrto@-og~xXZxLsLU9_XvS#5$jJDIfq^lY@ipUT#^Vf|L3^SY-ZH#l zc+c>Q;T^*hhWiYU89p+YGg>feGg>k(Wz1l_%kYlj8p9oiZwy};UNGEcxWsUQ;RM4| zh62X*j9Cos3_lr|8Mzsy8O0cd8GkdpWjM`nk>MDFIHNq%U&bniD24+JKN%PpUo$*s zc*by*;X1=5hVKkAjBgpPFV509em2~Iff91NQMfAK89Hg>lt=1>|)pp4*g>c zUm5l>m@&vObTQ0jIKgm;VK2i4hVu;P7_KoKW!S}VkHMT#k1?G=n_&K*#ITfMJHsJ{ zqYS4Q_A~5b*v+tuVKu{E21!P9Mq36YhCYTB3_BRMgZ3jpPa;0ZaDw3q!*hnO3@aHn zGOS}*!mxtjCWgJOQV&Zw#Q7+(L}PjC_p03A(?TVFAN-hJ)a= zbDH4__ypve40jlwGF)Rg&2WNYH^W_q=L}E5Zh67*1{|Mqj53U%^ze>BgOO1A(ZjHo z;Uj|sqZOkyqXDBjqbFlJV)9G;|~TM#$d(>#tg3=kR4dwJz&#;!^5yMRe4n_t>B}R2dO-5HnKSno3 zJw_!)Va9(91D(G9*F)-ATqGfRe&$z9+)PIq7cllRHZWE(R)OnEGe!o+yNo|s`q}3( zwKJV%Ji@qxaVg^*#;J_67+`1&pbTS&WU0 z6B$hyzcREiu46vWQqS1U=*eixXv}EL=)~yB=+79$7|1Bb$iR4&;V$!G4npoDB>#k| zgsG0vhtY}AkkJTS2Qf3UGBPoKVEDjrpW!cq5Ytu0D8?YhP)27)H%2Q)Jw_u&14boA zentUCUPd8C2POxmDn@rkCq_L+MMg134n`hEX2y36R~gPRoMO1d(8O58sKO}9$i>Ld zC|!{^aGK!`!yX1ZMis_q47V6=F+60r&G3-nD#Hba-3$j9E-)NsxX94YP{t_9 z=)h>l=*k$u=mc&d$S@i*>M}YpsxhiEUSc@Iz|APm_!r!2dChQ^;V{E#hUW~=8GbPQ zVc=ps!;ryb!T6QoDZ_b&!whE_jx+3K*urp-;TQu0V+dmkV=Uu!#zPFkjFyb9jJ}LM zjA4xai~)>cj2?{9jK+)-jE@*TGW=%v#Q?lu3ll4&A!7q$7vnU>`HV9eXEK&BCNNHB+{So-@e`v4 z(`^PuMhQk$Mny&iMgvBFMps5f#={H?87?yjGa4~kFsd=tFq$$dFn(d+XB1#`WAtJ4 zVEn}PCb%w^1Bj9|26G-Whr^k)=h+QL}O*w5I< zSiqRi7{eIO7{(aHXwPWGXvk>J=tnUBH!^WEonqX?IG=GA;~d6r#$LuQ#wNyE#yrLj z#<`4(84ohnFy=7kF(xr)F=jEQFa|O@GpaIbFa|ItFeWle6Er`P=_z9jBO4<(BNw9x zqb%cphL;SF8D2BoV0g>$lHm$N5TiKbcZM$vFB#s0@0NJNaGl{0!y#~6?;gVz214N< z#B_gJeGhSz$$>_}J%4ou<&S=P}#3;!q!N||Z z20E9Rfs4@soW8CxzGHljlD=ArN?%JDXE44(NneLh(w73;7L4@Ofs($a5KLe8Skl)^ zX!=TGorsaX_AqY7lfIfT($_R*2ekB+M~C!PgOR?H$xL69nVvBgGd3~WF?uj6GRiPY zGcqy$W?%%578o*mG14=Af$DAa^kvBdYWX;U$?ISe!ZzkwCCtEp%;o`47ngEG@o9@& zb3Wwjl*nRV#oa07!V$vPD(%LVA$%;>cX*!Pc?iA+cYi?RxkE-JX->$f!$yaw(BLQwJ-xiF<7LK zV-|0-GDMt#%UYOE@jBOIAqIwG4i7$km2R#LA`A>a*tvMFOI354@?93qXP4x@EwzMW z4zGxK0{bWKFDUGGj$U37Nr?C+_B5V}@;_Mba(oe6!+w+7NnVq!mvfq!6T3P0JApr} zmpR^vm2%dyt&qxM-NMcyc%F3y$09*lunYHbdI>TxcyUb>W?=9D`+Wn)WnKX}h`0yG zES^?12zwj53s0vyguRPx8s}|(2wR^$iK|j@7iWMd1H&%1r<_j(zp*>vGuh z2(dln;Nm+d0ukTGVa_irp~`-oJB{@+hbG@1F%R}6o@!Pn4pUxfkvVKUTzsrI*~57D z2v%}d^NEXrT+G1m7#y3Qz$8RG4T%jAZ{&E&`%oOhUcfPn&qwkg_dh`f1_tgR_7wsU z_B!???pdtWTzrBI4F5Qy*v$D|xUz&880K+YTA~>$|7K=x*`>=lCD&;8W>y`Kbc9j!2Y>l~+ zgcuka!6M~cSA`fDB*AeV!WALRz;K=(JEp==NKFT9;n5b+pxeco<~gY4zJ3*=w2 zKIZ5Zcp`}w3_W3=L|jpws#!c_z!Yw3na14V0GiT3}v5ZP2)Jscb)4Y z+Y-Sn)?e&Vyb!iF*liqKYlImXrg1#yyD6Cq7J;xK;&a$PaQ_hI;yNnMz@X2$i?5Ll z!oJAzg)M?xmP?jxpWtOSb-pxZNZJtR@Z+^qUH}ef2zwr9iZBBM5Bnz`aYYFGI9mwc zE@cQihV?0jtT2Sl!`aFg$0pAeCC0$e&yvqJnbU`J2LEN&7>*4*9CDB}&&6)bHACz) z$3tEQhGlF!IJ3mJajfFKD*TOY9+$m%JI6uZ3{hRSUmWL!CUW<(PZpTNdXfD(?_~A` z+$#hQvTAe8;r+r9#Ws;wo>hqbHZK?34vr+AeVlP@E@q$Sy>@kGdM;h4wQDY1#|Ij1Fm5?6v41A{c@95Duln;dasipuTm z#r!9gi&+)976@JBTA{?i(9agblcu$VI7!+o{|+&e^8alR2{U=U(^!&xf$hvTs* z1H(VIKinHcqS%iLGcdeinapuiAc;png@IufTdrWC(jHEIaR!E`ta~^M`OmYr3hvV7 z;ZbJYpm>|(um}S~7S~l4E_O?BXgh*QNcj(88*{A`W?(>OL(2aWl=6Qicc+juM=)Qj zv@5v$pAF6zAHk{Al=}j>{Qt<=&3B3OoM1`NWR41c0ofy*jp8Su<-aq>CO(z$#cWf# zI9NTw<^NQ$OCaSur2H=ei!gAv3jCFb;RB}>FxwPd4i<3C#9A+W=e*7LS(Jfip(q2x zN6tI}DcQMTbBZ|J;q}FLaD7q5Y07s=G>=_^`?l0#j@jV);v@HG6gI5B0Et8D3r{Y4 z_5|U-98-C33x8+5%kddpcR0#xu=R3I6?0@a=YA{joAnaMTd@+(8n)$9a%_B@2l(D| zs_-YUE3gT09^q@}P~dH3gVZVKSeJ7w6qEtypnaU4f(#6v;5x+}9G)9EE`jS5khnX? zOmLk7VsB%22G=Pd_Aa)m;5r4w2GuDQg1b2V;dRPac1L)fQpL{2dHPJT&H-V z)G6+qpZV;i!J*9H40ew;IGkT2v61T?h`0jis!0YG?j#Wg28eoJ9QDyk4h499g}$uaAN`cko-w)_`qnXBXo>086$GFp2FL7w_?GbZlPvWU!b>uMRl@ghaR5w*{R`H3U)J-43=>#GUshc2d zh&ZHfg0Sav%;fWyJiz@ITsH->FBgEYL3Pti)+%t_^cP$=IfLt_xf~aGmDm`#X7k?^ zFJnK#UBwDvXR)7w)=gK$5;%^ry7LurDDln~Jp!+rio~PXy;W+9k;0`Wz`y`umvLPYVqlN}r=?(|IxC4&i7!rU3y-A)1H(cNH9iRmh#Clc zCRc$71H%b+C2kpkeLQ873=D>xzxhtELD-aWU+d3K2w2JL3=X5>+wznMH_(3(?0nX{Ht{j)3 z>~pMX9EZSl++x8j)}PQiZm}S89e16(U7UeoD!Bal$dw?3%6;^|RUEbAK1+;yQvtT%Zf>^r;D8e*W*i}_4rEOE5cvd=7Q_-1H2ica%`_9y7_){R0tWX>9YOgI0voMXR}@a z*Xi@QmkS(V)#jMZ`x#uPZ)1~V)#drfF_|}x4Z_~Qet>&9s~lQg?<^F^H4|Fb*C-zY z*Y%&---BIyS8%zs1p8EQT|XDCu9xDR4Xx`Hl-t>h_)jPou_|!Q7rMZ;9HXwE&%Hxr zCFg5!UH_W1MDRDbuK&yS8(h~P5oTa`%`%ze2(+%B$(AEnfK=BP@SlU$^-AEn{t&pX zzrw-=UJznBbZ202<#Gj;Twv~3&K)9P1_J|w66amMEO7|Wmtzy3kOYJ+2Tl!v zU~&zZL}q^li$KhTupwqb)W~r)i!d-qf%68$e25x|`4IMVc28b^5eU1HV?J+zSQOVK zP|KSmjK5LhHMm^xXZPklAqWvSW_Rc25K7|m6=q=IV>jhC7jEQg7iM6%$@QL%MYx}% zhBr>+2-^v+IFZ>L?|Gd?53zA@w~MH8%;o78=3#5*Oc7hdk;f+>#>KXebD~%;dl~l$ z{;#Z)IrYWgbM9lC%YTaXA!nyJ7uN|k27x-(=NwyvF0sw$>gCsGwdUBscZKaH*9QLE zEEViZJkD%eI9+*8vDmU(^W0>8%)!6|QB%iS#$n9=92_!`FjV3?Bh0|?87v~h!Nt2x z*qzH%kbyykU5>k1Xa{$S5CcO2yD7J^pe+}N5KP>ZYpLLUafljE4sG5e!nfHracvU@ z^;;N3<=75z=I}to{n_Sone%3GxbiI(m0>%@S-=y+-p%bU;LBRW@tl)`Tc3S4e-i5z zjv_80uK8>W`GZ*}a{T4YVSCGYh1Z$YpJN;6Om^Cl{M20|P{T4QB~IOpQP1R6aGam8?vh^Z93U zT<0|xb7xKAn8*WRd$XEy;$dGd_?{(>eKNNr zM+y%Q+aa(|S-|9Pj*0xYWg%>5j+p}6l%lvnz5R#m5qvxJ?YX84f%+#mdA^!M#1F77 z=h3i$i2Ji?@XWV_us^dU@O(A5<>27EAkoS8p8Kl>gw4gq$1Pw9VJ~HEnWcA+hdM2mhWuu zx$OBfSQOaaas;!@=Je%-u(z;JW}V7q%%Z_Im7|sIDQ723KSwa1rTi(dfBV_?aBdUe z;tCXEV6bJ2;`}NMVbA0^!TMO}A;$*(x6b308s;BXK}d;GcX)t+r(MH-^dju z%)nsHc8FspFNA%9RgS|S$`;}X<7Hth;nJ31VBq4=<^9Xr%<-M?gp>yRYwi*#+nY_7 z>n;mK{4tw8>l$tddm$SS>n5%W4o86;X^40*PYk=5$O$$9*1KHJ+#Kv1L{-?$SsS@$ za~xug;=9jPB*Xw6|C-B@#UCdF>GRL!a1@v?lgGV5l!0L-8ynYk0cWlv5e5cRHgnFq zd=T~l)^?8DybyLfyD4ic&oS0k&Q|^~t}DU}48h=Vo6Bj*4`W+$DDW;8)(3~xPfj-W zg+dVabGEx&x*`yEC)+Vj5rOF(?tFJeTiKqn*mD(doZ_7;9s@Ql2~5g?O@Oc$gKM{A zVDX2X?LrI;5VkkhUr`1Ih#Cmn8mz08(^PDo6q@|55g{DU&%dFIEw4NCoJF{7hV(ps^~p$DDCcHVeBp_fyfO9PNA$ zrFb~Sco`VJgI%b^zK178I*DtkBm)BjdjiiIX?HF|abv|JY{tALQpQ{pg}D^U*m@;) z@j}>gY;2NK`5^2Hc5|*vtd5+Mc|mdE&FRc)$_Yy8Ol*!ECs-hCAvP(=LwpJB0z3~T z*06GM^s`iP=<*#9{m#n7agK$9BZp5({39y^$0?Q?_Q!mG#TeLPB-8kxvLI|KvUqdEvE^~u@~g3L<4O@J<2on8z_6T+gR73egzF`keVa3w-+w*j{op^2Bgt@fC@7vNCWKaYMupu}W~9;E~|TV3!aqVm-lb$jigc z#LgjD!McrIjyHnSl+T+jg0+f0gGYfwg=Z71E2}4a8uunH8FnQodmEcK*KHO7a14Tc z&cM(PW~YG3`QSDZqz+}^de6_mfXs%dnavT%*C`Iw%TdNVR{fxQm}}NOO%0O2bUOozYv7Il8u4OnIFd9!ugwzfpZ&Quh!vb2YLTaI3Kjv7h4V7is3Y zFT%iZll=s@t5_@V9#GqwU52Md)Rp_8@I?7@?8~`*MNI{@xiS>rvUBikka#TI%4Ms9 zTvl&jRpEHebDKMky+}Hb^%T1+?^N~_o~hDH**>z|T|-LsnOC9BkwM2X7zCgX2RQEZ)emfVWUAit94GJ^BWm9|G8Y zxK9c~#8KOzAHZ$UTHZL3qiiR+;zZ_feBgBvJq&Jxs&mXkYJ=t@wL#0dPx7CJwmVO< zF$mOy+ntx$7Qow`SHbO0Nc*y$wH&Q|smyg&n1SI7xEzrMw=X@w?Mqd5d3gJ>5UG6$ z5jW*pCU{>Q!uI0O<~@qizLaM>$eGIn5f5Nn0B&Ep@huaTWjoDT2yS0`2>7wqLfe;f z_>)+#aujn3aV=n5#2>;sk>ej{F55fKtGq6(0UX;nXR({I=5wC~yD%3_LfVcH_EUC0 zJ~wz9@gmP6q&A{FQX5fTa2?lKK?a6*&^9874Qdz43)XU$^25XfIH&Qci>+d1;#|N# z2iz|70JjSvY#&xrj(naO9De+|5)g6Zc40ji5Bmzi4=kW|p%b`Wco^(jNL%m^QoGQF zV-`lcaE1`1UHA>!Enylkcu@k>E)23#1h)&Pf!l=v>`6T3!uhPNTtQY>IS=zSvO(COcHt6~ zcHw1ko9`QEz9<933QkM5Rf5QDX^s_qxe^fZ817$eON5MBG})%X+gl-gmhz{;ApmP{ z1wq?e--NliKDzJAGiun2?=5oh9T<_%(lunXDwxJy|f>^B@yY!~_L zxm=)apg$~WY$0fEpluxWDD9i0(Duz?woROs@OI2$j#<#Q%Sl#wjsPfI72M94!*Lkg z&M1brGv*<+Gv;wP2`rGw2e&g;f!i4_T*dHq284YO+|GcoA?=Lg(00aEVFrc}aM;cR zw=*DYOAbZeCD3-pFHSc0MOfPz$2mm=W^j1G+Zlx%r+Me0v@_(vAqiUR>AkNFc@B>`#RkE9NU1oIx*X66&d^lZLO*ug^ z#>D2tagqhXhScBH9J+i5MSrj|ahzx2;K=1u7XQS`z;T+Tmi;l`KQT}}?ZXkrmd|C& zuMV!K%el^rFfbfumE<_dBgvD&E-6^ddJ#B(y?9k(6RRXg3eOjCz32w67a?p=z39i~0j(GRu~>3> zaZ0k4^KD`K#iGcy1Y9q!VEY2D7Yn)7S%uh7!|TNjtg0Muz;#=(bUy28b~oN>>?u6c zq?fUMV!6p(&MwPSja0YE3;D3|aUBKMZNE-v*TeGv5^7DNYZKQDv_(T{8=Xjdq*c?kUwGeG(wEQkrPeYFrC%shmN zpnZp^<{?Z3=>eIC90nlskj-ZX`w&DzOaYmPFdekZ4PhQgAH+Nm3uHQE-!_N`!XOdQ zURXrvBiswK0b)MF2GA~eh|LfZv>O(}f{+ONAT~hw2p_@x1Cj+{i2WcI$TbY`ebx{j zs(V1LfVl_62H6O54~z}sL-vP*SP%@eA7%r>K8Og24+=4ueW1O#FgAz=?MKHIKA3>W`=;d%nSibnHd5MSr`&P*p!7K;UEh`f+#CPf*~tI!Yo#X1Sd9z z2W4yw0p)BA6KdEP1ZvqB1TL~M2rOo25cm!rnuhv@fnj+02UMPd&Zhu*55flVU@TDi z3z9(=1C_=9|085T@(?~u7f1vo55f!#4DnML7?P(lFr-dpU`U_Jz>qnWfgx)u14H&y z28Nue3=Fwb85jzuGBA`*Wni$M%D~_-m4U%=Dg%S_R0amusSFIBQyCb%r!p}3PGw;5 zpUS`xIF*4RbSeWw_*4dl$f*nr(Nh^1Vy80f0G+>KJ(YpMb}IOM0FXODE`iVxw}J8k z2(vM8Gq8hq*7HO6zjJ{3>u1_n+Bm>Q5c$PADi2!r@AnvH>r zft`Vy0b&nmZ#~F91P$7wFUY{dAjlvHKHCJDEynQwzXF34hB!7gf($|ooD3j8h%yK= z@FB7P|Ca!pA;kci{3cc%$PdI~P&h&`=p+kJDFiyL0aVg~PM$zE1)>U6Yl2jO$|g|x z#?AnPpmGFsN&!p{L_Nq<&^aj(wIF#e25tr(242ve0pJ)0se`G4naak%j!}Ap%mvvF zDr;ftL1MJWkW@#EJp-$f7#EVNhIk*5Vlr(^CCvq(bO*wqv^28PJ;>LfoCNVTgaqYy zP(DQsLsXR@c}ULWWZ-0g7phLaseomK&}OqV<2CVXFhGyJ;c{Oe;$$ebpHlrWSCSup$R)>U`9*5^ zH5&e~5TJ}kPQS2Jh@c6#RFL%}ms}7w?aD7?UxVC0Nm~b^A5?qN$GymI2eB!$AGsVM zz6Amr2T){iU`SwS1o!uO7_=Gu8FInwPKN*gvl-gK<4quSQVhlnz6=RqIUWWT1}BCn zFgugs|NjVvG_bmIhM5fV49*Py|EDq3F)UzUV9;au|38Rf62t%h>lyYl{Qv)u;WPsS zgBL?Q13!Zo+&G4O!L15o*(6Bj{e%5pMrgKmUjK<9%@1Bro7!UWNvu~pFcC}^Y)L__$X zQDV^8FUWPESqRW+B_JA-A3<&exd@WxA?^gV@j;^+pb-s7PY2Xu1+_sz;})P^3?BnO z13&n*Q;;1XyP3gfdxA^?g$2koP)Y=a7pOD_*}@Dx5f}Au+(r7y96yClu_$Oi`}0#=>R4;~lRYx( zwv3Z}1O7cX?G`c(i{J$WyEI zWT{heS$tP02@7)}-^MbR6W8Kf|{zFeJ!3 zkj4K|;J;wbz@LG>|NQ=m|F2z7)%*t|DOEIz%Z4; zhSBlAEK}=$TSno3ZGS)f|Nr&>BZKLG-TzJhKmJ$x+x5@v->?7I|2_SG_TTlt{{NX70{_4N zXU~w$*vi1qRQ=!mzx_Y2-w*#i|5y7zm3hwp>HoL>_x)e|znS5|{~U(({}(bi{ge9t z^k2`PhX2w3)BoH4^Z(!XzyE*Zf5rcE|8f0y{8#eN{_l%_o{YEuANb$({{q9h{|*dm z|4saN?0?OFvwtm2&Ho<${qRqh$&SIB;q1S|f6N&7GI}yR`ybD6o8dk~GLtytVTN^# z_Dm}n?=n39&&1%&_=aK5|5N|C8SefMX88MGlJODKd&W-2NCp;G1qRUVS4s@88SR-e z8C?GJGkE-yW#nRDVVeHmlJNl3umA7<9r}OZ|Cj%b|5q^tb1q^y!VthXmr6xbI&8;}Zr$CSK-$OiWCl{&)Xh#?Z-p?mr{Lb;d%* zNXG9B(Tt7%44E=m7@62uQW!q|-^t*{u$-Zpp^8C;!I0@W(?rI6hG3?>e-|-bXV}lM zmqCqT)BiP$3=FJ{9So2E&;37@(S$LL$&P6f+X}XzKN0_b{hR*p^#9QR-2ZPd&j0@P z+tXifS!Vso`BC!s%wL{=`x*EBwfcYUZ$87k|7-r={l&mw{CnNcIe(rp)c;duVfZWc z$L#-+|4;u}|1bK#``@L%pPB4`pJ2TE=O2^SpXW@8|7QPt@?Vanh=J>WAj2J|JAc^z z&H6pz|KmS3|L^}Z`M>nvs9|118z{gv~-mVu9Rr?#tFpEKwA@%?9 z|L+*CGm0=SWn94&{NIK#l!=$Ui#h(U6w@Kbum5iUVPbgu{~p6_hMf!vjQ9Wh{f}cR zW7yBU>wg^M(*G;}YcX7B>SQ)!P-L)S)M5C|z|WAx)b{@#^BmS7h7+t?8N``3GBh#l zVKQYZV)AAbXH;ie!E~7E3-fg*MV5a|pZ}Nq%VC_uxQo&I|0#yLf2K^OtWTJ1xhz;R z8RJ;?GXyelG2UdT`yb2rk$D-D%D+I?JZ5R;8;qY>xL5>Op0mU=o@Chlzy0r>|F3>) zFv~HBuv-0BW@ci^W8L-dGsk+)WemIwoJ=7M{~3(`-ex|)$jN+%L7VvkLow@9_S>ur z8E5}H{r~gd7MQ{4-(L&SJ_~ z&Ulsa5kof91V$T%#sB>ozcAP^?*D)Jzv`b3rd$7RG3@(4<$v}6FN|;hTQDzXc+BYf zPmuKk!wcrEEcr~%tP%gL|6KZS_g{oTi*fV6SN|UW`Sy3tpCkX@{4e=`_;kKAEmRtYVv$itzGE4sBWU%;G@GpVkFr(oAWsJdpAOCV;u>O1L zU;OWfj1T`k{OA7H?!PBP;{Tfe@&8Z!yZ&b(@4p3W=>JY;6NaV#(iyoJPcy|crZBWJgflcToM(Q{{E|hP z=@C;5>zaQC|1|!8{gc6v`)|pA<^LRim;KHAbM;U5-^M>*e%q?LLJZd!?lZYEd9mDKIm|eN@f2$pQ_%ko7KZ=Q|Mvd3X8QeqAw%f@ znG7+%J^mg4oySoBH~o*q{{{aU|4m|e@Ne<|CyX^#9-g zZT`d0AjII$(D={z|G$4mj2w(I46Y1H42}$wSmrXdGI%j?GHqvQVF+Q!VqEs$lEM3b z9rFpsYL;hAR~UpCtC`st;}|Y5axio;O#avKxA5N@2KN7x|1bJ~YvzuZGS)ix&3?l-zG-xfAW9D|7rYn`WyV0=^xwQs(%mvwf<}UclhsyKRf?^ z`@{3^+MmR~G5`MjRbu}BPvqa%zbF3M{&(VD@i*lEiNCY|@c*06RQosn&$54Q|Cs+D z{}=Z!m`UKj{=bNS_x@h_d;TB)zp0$I|3v@W{7d>f;opS6t^czAp8vP{|Lwp1jQ9T5 z{FV6^_OJHey}!Hv-TEv2zl>q+|2NDX|1UD$|EKi-&)?Y$3jeOLCjRSUi2XO`|I&ZX zEPnrd7|QYFe-Bx=|0`oW@{i-+vH!pRfBL8QkM-Y^ zzk2_?|1V@!#qHG6qi8 z2qs$=5ylIQ=1l5rD;dQYXE9YW?qt#6^!lIvZ{h#q|Bej58S5FYFoZC^W_ZXrgYhEM zW|jz+FHDOVvKYGVZXsq-=KCyrSXKVjaEgF#xndCczlu?w zxs%b4NrXv?O`TbcsfksZ<DoH374kx7~nbVl|;7C&YK zCOM|B%w0@{?CP8!{&M~A{AyHd{F(l@{BQ36X@9(!4E`?v`~2U_fBXJcGp%F@U|{)E_5ax) zX2zz!rp%>(v>2@aa{rS1XTvJ-U-wT20~cr3pVZ&4{;;sl|9hEZ)gQe-6aKm}+WlY2 zw&K4EOFiQjhe{4*F|Am=V z{{Q`d>HqdW4u3Qm)Bd_Joc_D!*Y|&~|93L|XZp{O!5GB2>R$s}G}~DQx&OzRZV-dq*=3-_u=6lR97}J?d|97%qVo_#^XH8?B#LB>7 z&lbhBh@pnjg!w3w2FnDNI963AcP2HKYmDuzE-d;SyEt|;bp0)35dL?H={K7Y>q4fz z%&%CiSW;NFunIBzaBO8!VsQR%#&Gw)95VyMYbGzw9@YkyIF?SfE3EH13OIw<+F6*{ zTN#`FuVQ)4ti|?Y`eG&IIRE9|2y;V|KCCX_W!%`pM&Mu?+5?? z{66r*?9b%?NB-vhI`MZFL(zZd{~P{`GTr*$@wf8dZx*#bDt{IKG5xdplfba?&(vRy zf8v=Y{EPcj_b-9*-ajse{eR*ZKK$LrruV;?;r-u8X3f7+{~P|xGqf`JFueWu{m;z5 zD}Sy1_xb{N3}1g=O~NTP*Yc@~}Ssr^4{!U&Ox@hB^k* zf0h3e|7ZSx_-`MB1;ej@KmHy5_v3#wlRbkjqa;)6e?>-1rh^PA{}Pz}8P+lNGkP&s zvK2Gv{!d^EVdP;b`+JG=DC0E{}umR`CsMV&EJpzu>b%0FYB-RzbC9Ff6W+Y{MGs+_4m@RqYUnhO@H3} zocTxex6R)7NVJsei72pZt>l|MSn~p9lZU{@d|i>AwQQ35E&= z<^R_hFEMH`TQY8AKF+j`@xb2$?6s`9Y~{?&3^gorjDHxz7)AcSX5PeN%c%ADD(f94 z3)XE+ew=UErv2&qC;VTEfuA9b+3N2`Mh%AlfA0R?^~;gr0t3&V<-a!mH~p9RH|Woo z{}v2!{{#P>`E&kv*Pn|2JO6S2JNf_9{~o4xrd-C^jA=}N7-lhCXW(J5V|c`{kzpp= zUY7Svn;GO8wlPRD-u*Z4U)|r;%yXEtnW7lF*|J!ynFSd6*p{(Q`j_)(**~%Wzy6l| zmtrtvWct74f7@S!Kf?dc{ND60|IewvE(~c5HyCdGOZ>zA@7Hhde?ouq{^$SK{crZ) zjv<|KF+{k@K95u-8F zR|XjtZ)Rr3P)2o@TBbziJ|@tO69Nn@47v=H{&O)bXZZV{iGhRR%m1JM#TmpIFa3v% z!*DQc|9|7ZJHvc1UyH$u;pTr2@IBt3kr7UYU;i~2_WwWmzu`YFT{D1lX=l{?D|NVdU|IdHWdZvH>br??lKlVSH!G-~3-rxTp|DXDw z$S~)>CIbV*zyIt1$1;5WFU0Wh|JMJYRi_LLzyB{|IPm|%e-4I!{}~vb{-5$+g@KuY zhhYQQeV|)Zf*Ah)_h&F;U}X67pOxYJ|6BhR83h;wz^h!@820?PWpHMA_&%e zCWe3i|NsB>U;V!zBgp=%{}28D`Txj&83sSFdeA~=ABGTylm9RO|Ns9V_j2NUCK%-(D46+Qq3=#}J3^T$0 zfARm_e|ClxhB)v|DxjO0q!?EIzxV&d|8$1i|BwE^z_8-K8G{wWhyO4BGce5i&&ja= zzt{iQ|AoQ#KIJj|_;1Z{l7W-q*8f-k|Nqxuc=g}&zaB%}|6Bim{pVp|VzB@3z;N~d zh5y_PoD6IKuV?u2|K$Ju|D7157}ywO!ME>x`#GX(r!!SL4iV+Ia}pZ|pzq!}0(-u%~Luw?LKIQc*9e*{A;0}n&< ze;x)4h7<WlLf6X8*~)nUkBNPI`m<92raLyHX|6-qO3IqouW_ z`K4z_$x2yEz89M>K1Y;S#Ft|aucq)1(L)k!(#NDONjwyp!!OKtMbt<-T((NURzOC0 zkHjpoV(z_MOq?;iqC(e2GbP?hX39K}+pX}BxsWlRTS(-E5R3R_5jBw#ek-0oJoALt zh_vzV;EZR{W?9a8MIu5Vj%Nl>5C4AQRN-qv%={9Z^H`@aU*fb-IK#J2W8x(c_n7? z$8(5s8_Il>bC=sHTPrImeMG8Gf?fQLXsyUUAvZo}o{bWB1+00wS>AJ9T?R=+sHVR3zaIt?C_m;dZkjU$*q;)<;mdw%zcLYG|TM& z@&9K0vHhRM@{H{wXCzlOZ;aqEwmiuy`Tf%8#e*eZiFJuvw3_k<+ zb*nu4Jnf>Xx3te}*%J zN0`@@ElE&PXbNw$_-FnPe7qtp;#+wlSWmDWHqjG*BGD(<%k3e^E%jXfu7ariW9dH8 z&)mG+tlU?*PVrO-?-M;Pc1AEoEJ#XG%3J6rN11?^46C|O40^&hxI}T+4ZqO^f3ozk%2k z$vzony)*K&6#q#FNi~UY7BLem65|npHPqRaxpLAixQ`JzOsq)9A|ali4)Cd?fYBCX)ZX2=M&2X)?+M(nQK_)u^6$w zVvAv}Wz=Qp`z}BPk1YNWkfn;TP2S39cC{S(31WkrYsvI z_e>y8SV<&}V-5FG&gm@PEc5yE_@!9?bGXRqDLfJ9;C{oF#qx?%koTy_QlSvOAklu& zTcSDwF9o=HcXH=)ZT!FMul>)6zkI9*xJvl6`FsS!gm-Z56_Mt9$b5|VH+vGlD90>T zUjaj|30zrxX?$tym8^L`Pm7-tI>oHcvYPD!_gBF%si!iG()(r3$W4}ACpBICJ>PN3 zGVup2uLQ)UPw<`Rwd0@4!y#%dmMb1E?k%-cnN#!(!zYHD?E1VRy#Bn+T%S3^n6mym zGyG!6Vp_;@n7x&yN?23gTKWfT7=t9^P1ar9i2{Ctg+fO~3dL0=jHEL}nWUxV+eBV* ze-)X*bCmB1H#b)>&tVQ9wp@;ToDaAb|J){{C)Lb3k^L*@E_P;aMs98n&@HPPoYz@q zvP@#$%*Q3D$m9P@;inbj8dhztEVeeb61GbmdpKG6^#x-^rZB}ZrZVO-1T$Ry+x5rn z@7BK^|0NmrG6*yIGfiTc!!Vom6XRuuZ`^rO@1)PkXUnF`u9y2HbyYGza+Sz6fx9A# z0tdPDr8h|P359V*bKYTdWqiTN%-H;Y|KIC>)0uRcIECCq++VGSLOZ3 zyO-CG_a(OhcPLvAyVsw&Qokg_InFR2VO+~Pm1iMaEKjtciug=j(k`IgO%&6uN0p@lt*%UhsVluO)AW}1wET#!tygowm6 z@kWt70>%P7+(O(U%)Sf{*cI4k@D%b^2=+=FGT@=A`GJ%!alBu^z=-ihZG%Rx2<-Z*|k5ni$BB5dN< zMI}Yj#IA_ND;X;N5%m*m7vT_oDw58-k9!+u7wb9ZXqM0HNdiw5MA-L<@8+)OwU_dh z_25WhPvYX`{K1hfHdC@yutWZUj=AJnVKZS5;mblU!oA{Y5)&m1q++FRimVfCiIm!z0a1)&d2(g`7+aGCPwB*%#p0Ng2il?IoNp;xo5D5{uBCr^pE=g9_BQb>ukB~ zPuUWUKiOmxAEWeqm1SUy- zRrsr@AbUnqTqu%S7)9+!vWBnlGLzI#HxZghPmtw}e-M-R++)!@vKx zlpaY4C~TMfCn_l#BCHx_diNzq4)rHpqN=Kd4; zzvExnzuf;{7>q$TwKIQVUc#ipypU@vqXBaVk2CL4&dYov%i)GlVt^XmI&(a&h`{KjzIetLJb1tMPLer#|CJW>FS# zZZ$D&p&*e4kuU*S!4gqZhKJnyI1N;?gfkd*KhBWwmTVH_mYOIM!|luI$=$}MA)>-7 zE}$tM!z2E8hDr&W;or>?KZWbr->|rGG4gHT$l}Rnb7k(5pQz9)Aj8?mk@0&2`!yCL z&M87uMe4Ny#!kM}k&w@|x) zJg*oZw@9gAh{$hYU*RP}{sI~zy9EVBCvp82*~6-#SfX)@YZ7ZQ<6QX$xd@RQ@q^+A zg%9z}iDZpV$_&`*B3E zh4RG-ZvOp%Dd+1AAxqgUN=LuieU)Ui6WGl2OR$OCn_p65xA=12LpTU`U^Zt{6*7|P z6rCitSz;l}l`}g;UyE4^$a7f>SMl<3%oaE(;L7`(Pl-dFGleHd&{{Bs-$n3{iu70I zZ->8Z`Ju$!CHR*=ipP-u2Hz514#^aSPYMZ&%u2hI7pjD+q$__^nx*hoo?RwP=7snl znd5@r1t$ru7A_Oc5jiIESkzfeM2t(UP3)l9C$ZgPE5u*$N%IPF&fp5+p3U`)>kQ{9 zP9rW$u42wtoOWD$xR-K$6zCQ>#`~Fn7jK|w0?%1aC&9VGimV;nk3~%RTNU2vh6o(x zujQY~yNCY@PYBmb!CoO2o^Bpr7JmT&*+Q}J@B0Nx`I7|mge64N#L^^oNyf=_bKU2f z#Oug<#=P>tkeqMen{#O1D zUOVpTVs}OMvMDmJV(AySBo!ts#at&5%fF1zSvZ)Fk?$Ml6@gl@>4GbzWra;xav6%) z;@Rga9TvJRlquXU+9CE_V6KRp@L#DPvadx__}SE_sVd552`m;|EYQRGUT6Z}cfovN z28r+d{DOtjON3K7)1=KzDkQpu&Il@qz7ney`oUkz&&X>lq{t&DK0&Ta{HC%4`&wfq zfii(BoY#2Y3oYlX;Pc^(6WA=IEmSJ(Cie7y{+C9ET)`5dLJ<$4DseNJ^Adl#W0~~C ze~bR%Tg1CY{0XllmxxfYP^4&xK#riSgtT~!OuUegKoWnU>Qwoodp|C>XwA?8fGnpHbMdEu!H>up_mlOyRa1_kt-NMSwlF#7Dw1%x(KwDIj ztD1*ZVk(al?+va^?31~cb4T;9=Q+rBka6<=OaHb1^)l{ZXXI36+s)(0{)wT3@eNZt z(?S+j*2^6ATuV3}vDIS2&HEo2OM^3ZFdtISD`K zpMso%Z~6CdC`_Vv|1&F35xSR7yK&LEy*u(m3c3}sZ0QqfY5cp5gyI3;0 zYh=zzPZe+w_%F;NxI*+6_hZ&zfnf2u>^8iqOwGd9%E?kae>H`Zgf|KnN^1(22_6?N z;5{R8P5i!qwqUgERLTC2g_7Pv9|X6Hd=&H+m>}{*oJ*Edz)$o8r>%=v_-Z-)rA`R0{r8*6gt49XwYWbwKXCKM~2 zCdetQF7s2YmG>2gD*H##V`|pwT5=0`M1^Yk|MF>YtQ6QJJdHP1@C%odz%QZO0^bEZ zMIQc$dDH(ppI4OoE9X6aP3}alG_D82CYl$Oo=g6gI3U`^Q_tza`;z}Z-#W1kBHQ@X zI3>BNnLT*ca8H*K5-Q=lC&tbuXCEtYmj9^0dchU^t*q?A2gM)qOp@#qp8RkBw|Le` zqQOe5gw_f93hxq}C}_#!CM+z-F2gOoM)8mO4aE%g)moEe0)=M?t4m&#cpzynDJ5Mk z8zWsT^IZ0=^ds5bToJrFRx52mdtwDSSJ4@`U19 zXE4nD&-A~9LS0fPn;2MY$9SmprMdmO8Iyao0M*N9h0{gHj6@Jd-gEkv_jufgQ1l@W6_ zYXoN}udkqqD4*nPnF0k?l}+lw+OhhH#tY3CSxcOn&LDAiI>U{#(-{QLPiGLgG@aqX zrRfYB2c|P<9G=eb;_!3^g`?9M6i!TMcyMAm17u|&1A_nqXvZaJgblQ}9K`2f03TSv z02*~=U^vG7kgbw?4&Ob&0#QrJXEKWwJXQEKPHSJ+pJd!??qbctwwmh(Z->B1VOjBg zQqpp>6rEJxYi!k-ZXj*)$GqFRjddnRFRz2Z1EJlb8IrED){5smFqm`+jY20oeX6?c3$70Lw$-hWYStLSyqokgk zsN!qo6>1;!?wM3s+_&y!5nx-)d4M;TUrqR^_<6}EveOlADP^ku(h@e=X>ravl4UyU z3yyx?cK)wIR$}au*)j?8YZd3HebIkuWMQ`7>O2zktQ zR;+nZ$IM`Xah|!S^%-U+RtNUKoM*Uq2p*J$oTIp5#v#+A0&Pz^;5mjZw2vFUn-O#Xsvt<~J-0*_ZLC@%IZpmG~o*C!ePhrO~UE zt(R;($=t-6g?Smv0(N;WPNBD=EmF#I%?hc?rr&I!rb};i$U0&NKZ_#;TUVHp`ioF+XGFRUC-bwmuenyFbYV_L<0h4m%7kwCaef_RWrsI0G&n%WVq8vP~4o#qFu>zU>= zUt-PVm@IHZ)Jf7<##G)`rBNeNhuvU@@d5M2*3X%^S(dP!;E3l*5c?%DMfRzJi^@yQ zPr4TkubJprBw1f!+`{ynWeeASfwv-dlHRhBit?(=nul~&8U&gMSj@4$$8?wZ80%8@ zW^Ppx28mNLv*eqUHmj}I);4%xyv%&Q^;yQ1Ox0}Xcn=GTiM^2gAiG|%L)B4JO!t&Q zor!|Qa%&0ZNEUncIL>7}JH=`wxnz|U&nT;^|I(VIzsUHFd4csLrVq@U*qM0t3yO$; zl3pnZ+OzZ)7;ZE1w%BXEg7qcW zT>fjq?<9W7gejycC#${J*r|O&@1LQA>28a^))!b0b5`)36|5F5kUS&1NAZX1GEHgS zPJ=_n%gq*9HraTyuyc6vDDcM!X^S~ZeUm+-xJ-3|X0WcH;X)G^i>=o7OrFe|Y{EQd z{40eniv~)hD!f!Wr20xLUH^@7h`E=wJhL5(7P|#!5s#iojaa%&iu`{?8`b~nmvw85 zgDjYA_Am>wK4s74{3>8BVk2HJ)giM<-a)xmZJyRCLq2nRYYtWi_H<5Do-{sJK@G9P z5*0E*3dt&W)wgR~7)`cFxB0{D&l=4!mCKD+O-MylQ?gh3v)o_h3+nuOGR6(&UDoc* zy(~@~j$CHEE&L~hQ)J}ib(J#JzUes|OPI-7uD5n&4q&lh-^L-rUoBKD`ci^b`l^zy zdbbw0{zbzEvqb9x78y1}j(?n&xNivMi&;y4ko_(ntrn^!qxlk!<5F`K>mcS(mN%R|Jb(D?h4e*>ByLLi z$xc>&r*%(1$ym$chxJ9KUCjHr^7tMIoEJVQ79>?IV<7LTVy%1F;FvL!#T;vSmT1-u z?DP4a2v!N(i&aZR%Is3|Q5Ds2(zQ0=G5Kt@gy{^k1BVj#O1=uAGST}Ir818dud8L~ ztT9kCi7^+lmSnlcI)h^e_i^5v!t=zRNF^)eDi^9}>Rd3eH{rIBu-0QvW@+b`%k_e% zoxek5kGQjJhtgk-Te@oux0w`K%(vdc{GBC)Q;DaYk3;B}(!k?aUO$e1%Pzx0}CCNK15rG`B*!GMfgw&UgK{#!MEotiLld zFz;k#<>3*M7g;9uTzZ$ndX{ z@-E%9xwgdR`+|SJOb(n8WG>vn9Jb?@ECl;S@1( zsp+y=ie{=`HKynk7$}%LH7~JV&$56sliyIdQoKpZU3Qgxv(gk*3C(pn(+uQH-kUdD zTe6gLeBqN7@(|r7K0zu^_LD-ZN`S^cZB~Ot#xu+#tgTt*vAyKv=Go21AyOdmRJvQy zN;O2oOxr?lv7wI{gY{hIJ1m|YnY_RFc8MfP9FUr!kfQuV^??Sj&Nh8Ua}66-=6B4u z*scjiicAtSmb@a}D$k^(sv@W!s->X+&HRsb4%0SfFZLJQEkYrpk>Zw;ujR~Dderu7 zzR)?VKiPPNRRGI;*2f$XT={&GqVeM1GF#-@6{M9{Y3Cb+8aJ3XTA8qHV3Xn0;}H~U z68R)PSK3TYMQNLQj`nN41xD>=?<^-XZDrzZk>6sgB=1ODD_vKM(_E+{ZIogjU~SG+ z#VpKzpZgHMozQ9Fe`0H8cPjO(zt#Gz?`GU?(P90QS&FrS{UQG=;U>`(33=&Vvdqf5 z>IItlI^G7)%sg$*F>PheU^5r26>bn^l-MU#E^n-)qNb~(Z;)!d-0X~%BXa1hQRSem+7hT2Fo=dk3l|KiHz?G~CR z7Af^xAz8&qJw$7!?gs-7GhOTB%#T<~IKz1~`Bn*p2$xC!lGRq2p=^=AUVUBW+=1V<2Ir<)E)2uU?>sUUpKjiJ_PZnkoJ0qzk+aUi><+ggD_J2b)^G()YnU}C0 zU_Z=bA-F_nt=MyEF1h21y6S5+m+QnBE-~Y^wqwp?@nZkWdxPIrxLSOkWRHBE(hk*2 zn(>D7Ox-QnZPqaDW#(kx%l({}U-+0PhqSevxZ)qx`S6lC9`p5i>{VcZ& z-%pV~@ek7R^3#+)sFiB9=?NOIH?Og_XAWeU$^MydgMhTCo5XIZt@71MI;s&G2emVe zR$Hjq2r~1qd}Ti@5G6EQ)L$Y(dW*tcWeYV{&E47thVo|Xt;|_O*c3VL@wf@OiiC^% zOFxq3Qk|EyjdSGdY}Yy~H*z)$v)aK@!^Xy0 z%45UFEa)UEB(X{Mqk^JphNhT-rRjW&ChHRBJ1kioFYtWe#APM*`39gBau6m_X)qVaEQczDOp8L)h$}H^+in#Ew)+LGF@PH;xysU6Iw5R zO?sEYUX^lUh60(d*(ErMFP`=wuy2{oRf-` zc`Lt6?T&VtL8Ebig`CX|CMlNNoPT(p3jPpok_eRfD6692plqzROV7^irNuexLM9EC zBraXvy8;(Pj!MjsRa4lg9HB0z?Wxai{K!n)I)-^Y3n$kBo(TS1!ZqUg(i3FGlvb(drSi9&0d%1Fsjqs8F-$T?q}DY4Xu3v(O%8N%|K^&iJ`zGs57MIt5AWh~`)Dfz4Y)acZ1)VpYS#q1=r7%MwRC1((SvPhkH zqts%V*UAR!6Sa8s{uv~gys{KxDPvv9@t3QTcap#gVO{AkIZ5R`Y5|&0wfE^am>skB zX4$~X$@!1#46m@*S&8$~0t${wmsJ|n?X;ijtv9-Fxr5oB^*P5@foZ~5M5jqc%e;|~ zP-#$~spX;f&v2P3iRvQRH92Q4&dkZe&u%N^D!Ng;QmS7@QsK8!mFjNw zZms>g4~(8$?Pt2iyoWW9yG3-mWUKT8*$4$^Woz{(npbs>8T>G{u&!aUVVT48O<=e1 zAF+3mm9nc8R8`KY&(PkYKi#;;JkHvb*@tBk+jHJeqQa62(&uC~6^fN7sk><{)+yD0 zY~*BK%4EWNl)H;>i{Kp5X30ibS4C-6Zp}+ND-HZi#4J`=tFlhwe8^+M&nl!PDk-^A zCRssNMN1<{XO=;riK@jC>v+~+&a=D{f@ej_C1%L@DA=edXzbOt(?4PK%hbZs!={bp z5BonZ9o}|>24NYoDk){zKzSb}D^(uN zjfVToPgr*|DY8^?O7Of8$Pi(X@Q~J$^HW}?{z04D;Gywd^Iq#rrb^~04pxD?f)S$M z#A{{J6l_&|G#GV$>VGxii6zd+AFYKqdKJ&~Ij1v1Q^;K?< zQmEQ(O)uSd1{o&e7R}a+SPyZeaG&7q7dj)>EVW+tw1Tk8LG`KH8}y@%9nHC|=dtv1 ztmS1F%oJsk?2@sS=U4iu;-#@$d%b>wahAEcbuvo_`$ir=0XLB*@tsnWWE&L9l|QOA zXsyzlYxKg5$2y0)o@V-j=}=9k(c zvsZqas=Own&Ps!o#-U~xEcKa}vRq?-$tNawPApXNmP~=tW)&ulOLg7=-S-AXCL9*7)(4sIvlMac zzn^;UajCt1c+6!jTV~cT1T^}vc2Qb9CY@?3oeu2^#H6^WVT?wOIW>>5&nJZYHvL*56 z32+I2l;Dx!l22DzslH2-M`x>Ey2*PhNv1evFLoWCzXGp>Dnxx{#N^AAx>bwS_v^ei zRvt*$Y>VqU>Lf$yDwn2445 zb?HB{>lJF1*Ju{%{WIEa=3~vwe3khPTdlxuAxY6Q`+qqq}A;))~yDEJ2)|JQn<$gx88iN!QB8D)=a0R{O8_%;>o3d8->tVk~#r zw+Q5kEEjtz6(bj}xJd1&);8VmhOwsA7Dd(!%vx;8JZb{Jgx8ASklrA_S$TzetoBpA zLZcO?zbvF}@|cdYH1TW~m?@el)gZTB@qkLRx}R3Q?gIl;lP~7;t#g?In4{QOgszJ$ z6%&yBFCC}wRB48qz0Oj@zb5Gx53ReHVwtshbOrAS9TDZ1m@geEyGH)DBDY$t!5tGn zi@P>on4DSs+4{KMg-k^kNX(ReDch+aqt30hP)E}6toa@5zf96BQXFNx|M;ZE)=9jT zzOL|2>4vJ2_G|-X6G@AD>qM4=tSdRVxrKRW3V#sekymK@eK9I<>S1sFu8inmDR$fYXk zsf4Q6X}#8EH8-_6$ZX8IlwFzrPNp}$GKRX)o;Rwa%r zJc<17f+8ZHMEj-ZD0Qp&Y3$PFF=R4}u(n}IXI;o~kM|hAj8KJ$xVX1`h;ovunZ{)8 zNIhZGV(W)YEG$m!O`P|*pYy4SE|Bz;Gg8h_Pt{(bzti}N`8Mmz%!#aV9NT$M@oyG- zE0!r4BFCl_uiB+iuG4BFV`*ul#H`Npf^9CphR{rrQgJmYA-UHI&y~Nauh8x^SZ>y1 zJ&(DD#hf#b_c33bV3Tl+^}K@iX|#BgRB0hTs47g;;GPV(IlbP(;45SPi8f1y;P#-g=B zx6JUdNtMMV>*-8On620s32qWzAr>TgRpybRqw0B$=h|BO>y6sXDy_CNv9Nq)o6K=U zP)wv-vPi~2&ROBIlC)Z#?kW>ii&ASp<|3AjZ2LLbx!XiyC1j)%<$f#tRm;*6)VpW2 z+5E9}FjEopNmdn}^FsWh(c+DgRr0TuUa8L1%+cdC=CgQaUCvz0qRRe+Lyl*IsISCq zX$83r3d@yuXXcIVESS z6sk4R;GWS((`0K~=5Ur$u8q9&`ELl@iB(E}md#UOR<_irGLSKuYQbyM!_30k#$n2p z!T(3NL##w*q8zVcxB6>cbwdl2V)L_Bio_2oP}*-yrEL$EUthOH*IR zXtUWg>$A-EtR)-=d8YF15?m+ZD!EEdL{V7npJtm*kHIptD(fB0*I7=mi}I}EwGsF$ zXfMVke@F3(s<8H7Jw0Pyb2Do_CL887HWw~M-rGX+#Q9{D6arPkG@NzJ4Ma^|m`|{l zXOd;+VV%mcpFc|Yg7{tO6a^U-UJYg)R)e?3_sv&W8!;I%bFry$U*L-o;S|@D>QtDh zT&`}S`_f3utj4n3x{+Cfbt3y*u2vo!!3R>Ya(fjDRsU$b($+OBG-)wEYbD1#jpZBr zCQe!YcHuo@U#08iPAJQ&yJ<)1TN_v$jx*e=`5udSh<}j1rtn_*s|KU) z0|P^oPIC?G(@aV%HEfr7-V3%0-;|gvb4;#AxkN)!dzQYaiJ8TEYXN3^76Z1&JTju? z;+G}EWcJA|Q@W`>UyDWWzu{jq6YCjFoy-f^1%w}o=!ut0o|6euj8`dFch+Ln6*Bs6 z=3rgKG>KV_yIG)7h)L|G#4ee4a(fhoRnKa2>IED3nD4P>WM9l%B6vyUjJS=|HJNbv zDN2TFFEuN46%4aXKAZblZ(!QWEWtL7f1Yr^sF6gURJ**ZlD4Xl<_g0brh=9lHvG)r zm^rww@hS?a3qKR>lQfl1l5m~~l&ISRNvc-4d?#SNrp%NHwMRg2a#&|hP^(lXK}i|HV<0momS zNdlWimrH8OB`Pge>(+|bb2pl5dfVchwH0$O%OXw{ejdSSFJve!^nT>BCzrpe(XnyiEGG+$1GOHBPNVx=n_EO=epBu=Znm#+=0YiD!f0 z6VacNcVul8`BhhFlq@Ve z4O3`UHc&6qKB+&`c!T+QYZ2x&mRW51Ji+|m1rsD*N%_gyDeq9ds==(c$S~3@&wBgk zc;?B!zVnB%RPrb>uJ~-he1)Ooi|tG68}|+!KK=az+q;y{M)&)Fro8-mNBl?X7n@%$ zU(>!FWB&91+m8*u`k1`$y?WRo@qowscP`_W7p6SjoQqg%Sy(@o-Yk0W{v-Cs?ysDG ze|%^Ee(^^i+mvs;k220=+{*ab`h7jK)jtWQ5Uv+rCjR0tH$>`(FQW=H^qE_c^~0 zzT5w^_=OV#-+Pwt+dc`s`uw=#@h9mnNe2eU&%2&wzLUGf{PH!!PT?-D9Unh@?0z2f z{vQ)Bi{vl1-yH07nJT#}K7ITB@BM?zP5=JAExvXCdp5rS_ayEu|2Ez+x;FdDp%)Jx zH$RJcZ}Udt?$ZAWf6oe5@Z|ot{4U3)^w;sr)NjUYAHUXcSbd(MxmEft>kHP3e})Xn zcNq7T{9(Osd$Z`r(!Vaxu8TbW`TvrIxXhcGe}lijd^qvP*4M(EW&E$Wy`Fp&F@7lf zS?}}d&kKHJ{rklF^1s|K*B86*c|U6Vbng@Qr|xf=tlt0MURfm+^kK=HDKbtx`ka2e zMn5e6?EL2Rx%mGd$rXBc-#`EU;On!WA6dWrc>cBdYt+kmS0`UGdGGlC{?Dx(Qk>pA z|9;PV!pV5!*MX1I*co4YGURA@@+ZDJ_u|{j>7OL;&tiG<*Xymv4?m%$Y*&A&|Cs#Z z@XIeBd>-+?=J>h$U;jOi-SupVtlFI1|J%OxGL-+n$$aRI+C#}t^~^lqp8hO+(=THw zn8_2s&&8(wx90V;n`dwDe#!IH{?8k>lAo2#PH$`ETX;Kv%x5(D@bCGx3rnss7@y@T zVXc3A{mpu2KHk0eT!eo8Y5manYWYuB{zo6J4TQOcZhaNgWX$?w{aWyA%SWCMf)Bnv zzri+9%2l>r;xoSu&-Fhu-hY0z=!MOj=-14@9KT-XIQ=32)0F=+-|qeT`um4(A^*AA zn3zo&tKS{_y6f?Cw(KveQXL{f49q`u-u#zt;Zge?!?s+Ig}v|pNtUml9U0?3JQA|{ zBK>#q`(rPzOTGE7arVm1*w261^_kvkNZdO8@bR6yS7%)>zxU+JAyzgqH?>z<6P3Az zx;Ql0{FRvmB{^K#b$*%tHDKTH^wQNw%+tTfKj&u7;d1@=_B+cTMuyiGXE}Pmw~L%* zcKhiokj8NSW7aQ^pSM}AvN=E7|C9N)@vBqZi&(z?f5PG;#>KmvVbX`(7fPR}{h#*R z?b}{P!Ed^sXM8&Q-&rUtbdmMoBTBMe$sQ(FH)~oaHV}< ze!56~qlDD|@_(EDF#J07Q;Ls?SNy-@@Ax0*ehD*3zIDImduhY(Di+2U_D`2F)-W^5 z7rzO8b%)L8!;(*_PZOTkJgj~3Rk&XCfaniF4@rg3Uf|y^b_DlWW zeV#wRJ>IQ4zr^5)jPiGvH(E@xEbrdQzD#70`SywP#2blITjVP_=d<1T&i`iFztdmR zzg4K@8M8^~i9G-2!SGY(@8|swdtPmP!1LzA|Ghjp%(MT6e=hkF{{F)^=Z6cQJ=u5k z*P@T-nSH)$d|l1g%i#2%i6umQ0Z+=GlFz4qTQEtzI>yTTe?8|l^MtBDnXD+Vd&u>Z;z7y4*i_oU~>Cb#cA< z&-0=C{n8JT|KI<=_rw3|gBO2)PXF=t)4pHQ97ewzUeD6{sBEoAOHgx1MAhzn+Nh-}5&nDXyKu~-M@JmKzvK{=y8BvQjEnK_yOJmTA6>t@e=Yee_d|t!GrJmx z`tRLLo4)_%t7gd%l>7MdKMU)pH~0C@nz3+qKMhemA?fqen$h*M-sh`dLced}ZTS@T zFrUfmRmXQD_B;2x|H#n1F=7x|z;d`F}he%nVvHBco?`ZGa<=@2e`X8%^UP$8w6PJi{{519!iQ$oIp6>P zX8*S5efQh)Pm8|teEj*G@e%t=%^$n}+I}V>!3wMt*O#e`((XakRXx0w_rXPR0xZeFreH4EF|GCYarJN=IFEf?? zyYp|(d#Rs{Uskf#d~Dz||02&+`Oo3UQ=W3hV3w_4tAx^+^)^pF_w!3EkGSai>y|Hm zeA)gl_UD&>raz3n@8Gg$G-eRuKEn9=i@^VPzm9P1WdF(?!{_Ep$(n?F5Ob<-F5 z^748Q%a@;j|GxSV%fiUZDRAe{<@eKXANb6`K8N=u`_iYH7t^oa|1|AO!KYpp!7pom z7QPj^tNgErU5>?HC|zuyXg}w-KmXZw@I^6oe^Ys?sJcz2hI8iUDbH>HR(!nr@Y??) z0^Pr(zwt8u`K`#(_NSh);lC;KtuG<3s=vMd6wiN%b+>t-$%;=u%+|0h`keCK@-HXT zJkCcVr&%4}vpfoZx&L1>^KHhmpZToPOq&1JzkdGzztp1d*EB9`d9r@|lKZ*#zw?)# zcT;$)gx5(Fe&M;Z^1l=R{y&`m&BYEgo?%M+lJaupQ2hI5@u6eDu1#^tZTB-VeSXuU@lDhKTDi{`ze9*!seLNe;0aEX%o8^KhvxlUaUu zIrE11=?rn4d)Tzu9?F`EJ?FZ`X8kYf&965PKkWU?`(K^s&G&QMqVKj`er*vg_l&np zY%`0ckn@kp|DyyWS=oOy@_l7?WX%z3WcbFtg!Sad8_yMGyXE#VTi#!IH$mk!gE@bX z{v58ozjpop{bs_Scv)lRU24W+qT;o3K7xT9|9;;2ANBVfYx&=|tp8sJDee$H^CS4J z`<>;NOCH>QfA(MQ*8qn1FI3;(emCo>`irY~IIczi+{$-aTv{_g_MgBF0U>68J_nUe zlI@JISf@UDC_I~2^Qp)KpZ}L1b+fkrcVlkh3YMPEdhT}->z99dzi)nud$jN6V%bYF zsbUKiR;UMQDLrU>?sk(={fo%;uaQ4`p8tQpn8%RA=Kl@5JD9qDgvq@T z3Ff=X%*lN~fJbTvQ}*9e{35T9ojvq%;oHd1CF(!EG5p{0{mj?LLZv@-Sc=3-{?GoS z!ncukIh)_-&Toak;{J-hovFnuP|dXK=ltjS-|q7?OPE?X$ukIU`;){ojrAp~@G|Y5<|9@^}dB_mYiHq3@-^A8iFm z7VrN>|9?Jt`!w5qmBT@Wo!qxLE*g4&=J@#FG3%?ax5XN&7w<4H3A^u^i5-#0wCwa(|8pYUc2Inldc=lpu8;38hk zCeAkbmjuJ>XNDjCa-RLQ^HXvJ$v5{tedzgi?RL`Jsh>`Kd#o`igr^2ceI>KjVM?5I)7W z^1Q9~1BKH6`hTA=N!^?Is7qtJ5Rd2*E*+t6_R?P*Oy19DYV20{z(j&i?8neFJR;0 zEdG%FO75r3A8C#}=5tJ&SW}t2_&xZgI5K`WGi7~t`Nz$?NOhk1Yu$dnP3*V*UVBmCtAq-`#0;~D#0X`BBg$=H$n+=Q`i_8NQ z4sW*BzgL((yuYXLl6x*I7w6fprZ1O@>VEmjyv%&7`ZhI7i>_Cg1XD>%R!WMdCkr&;IHE7-4)sweI^g z?q@s`|N3Yq+G;3Aa@=@*{AViDM1GAYvtQJ5USyi^YRAQ^%tBvs-~D=j@FBo6sSA(le{KA|mEk}4CPwMMqAWYu>sdot-+g8MeOe?@WuMTr-&>xa{=V(g zoIjC2KELyLx9n&4$J{rWpEiCHyLCqB%AcSQ|2S{Fx_E8hYle?YS?=(i7wZsu&HVr4 z-EZY@W%*6NO0kB%NVzxv7t0&9zsWz@KUXjZ|IJ~J`P9ce=Lze#r>~d%>iV(kUMklU zS##+InMH!tZ|C03WET6aDdfi2%T(~X`c>2W7O!~6B%r{)A-hYZF!o)==k$D=MT=jAB*n({=@zE&&S12#9#ar ze9f@v-3o3`)*pWikG5T?e;&fn#;El<>uvqV^6wJAs#&M=&XV0Ou~nFvXDKIxvbfY! zK4q5s%Cou82z>aR_-Dtr1<${}E_$Kf&%=wac;7r^ z_F)R(z9WyC1H6pUYguQmo+3ef>@0%LMjC ztP$VV{rSgI%4+}a`bV=%!D@MOGvrR`?-#H6*7oPg53&FIKOFyE_E3=P>c2d(GU4K1 zn|PP}-S8%eLxG8tZQ-}N&y9af|MN4O{tx^xJR-fmpUmpIR$L;t~ogskl|DW&w z9qv9>JtX+?*KKjHcj~;WSYLiDP@2pm|4N9}&p_?To_7vUYkB$kgas3sLSIzMXDerL z+J0hr8ue7gz&VaqjXTiQIJ@p3E_vpO}Kp zl>|Qi@c)11L(@}t6%Y26efdr1D}SN45G&@wsZJ zjRcjK@hAP^{l&!k`A7EGiWhc|zFv1=_Wx_}>j&%Hp9$}(KB)2j5!?Eu>Tm7)+_={M+aCmWW2mWU$8$u z_3Xf#1Ao^ruVh-tUHc{A$DU`o>Kbyc-yeTye{kacbD5QjQetm^r?T~a-0(uh_#5j& zmJ^@dzVq|;ik(;6Czl{`g(rr;lJSGs3EmHUYyRB)srga=KFg~oA9KHzu=cQsGO+Z;Jty&EE@WLrhQ zya_Vn{o>Agl>aqH8dKJrRE|`p7fglk7r(H0|MSQB&j-Js;i*0``ur8b(m$oh%(7%3w`I+`^e21AY#w3iof9Bv+oZi|NK?`yZZZ# z8Eo}DY~MJ4R&e=q ztY$7!^b)9IXXj0n2>BwxzL3ZBk2jOntCgRU{+xYqP^pA3;#`!Nw-C=?dG;?{4!p8I z6q%=f(PoGc`^O=|cib{TIQ(DTW20wh8AQdWD=G?cyu0$#TAcr+EcteQb$k)e zm?kRbYVo3Q}?UMiQaDX^HZ#aVpn)g zzux~f{nvE9&TkJzwJq(n{;B>IU&a4~cgFwcpCq3wmFE60sE}w=B;vxJ`~Az?hi@X^ zbN+q6p1~E!GmYDkO^zYu?ap7bc~ZDU*p4wUi}LEUC^|`>;(W)GYdl@`f^;L>(f@i( zRXoD1v%X}0TgA8U)47jIU(Y^Je3ieDF?HqAG-2SIszWQa=Z_ytye>i?Hv94o? z|G($!=TF64o&u{mFTL3EIz)4sN+;{OUthl7eD_P{mcSGSd4_fW&obWqdhGAXkN3ZG z{b3d~7x$Fd&H3$p$1}YTQEz^KUn=!od`v1*u6t8>|{=hQ* z6XWN-pa1=0XAxry5wKvJ`soaZ?c1x*UMekMQ+y?%k}105UoFp#cQNPZ?f?DOR?J6t z>z#7e99BD#KB0ZgW{mUx*fKMTY-Z{G&-qvJ)7c*upVfcb{$Jz#O`hvt=$E|z8@^tY za+Y5DG4X|?(QLkA1tu}YuL%tOEbsoc{0(>+aMzjnw!{-*m%q2~>pd!bD)>@e@FR=% zuN{nOkApcMvo-zN$KNfVr6evE&&tYK&QmX$&(-i>{&lbUIU@%4JAaeDG(Rf*q|L7P zOXgF-`x~Eheop@|SD}Yf`t?DvI)S-A_&#m8YNPa=t6a21<(tSK<~FhR`&>*X{=WI& z{=Jv~qhzSiQoP8_+Jp0&;MOU8oD{+$x`pWmjAL~ z-yyn8Q^NSB_F_iC_YMDTq|(@KzL~`^=UdJDK9MQ^&b@whK7-MOt(N1p(gguenS93M z-&RVxGTXmBrKlm3BmRyzf+hXU8G%TyAKXeWbWY6SxL{N(V#QYR?DiEY5#9f?A3`s` z`)k0yo1yT+0rnd|z4?v``2L8Lk5_OJjOR~dO#PYrb@rz}43}BV`5zeZh}$ymVC&&~ z#>(-@^u@FLcRp_Ull9M%V~6w)?gD;s4y~`;ig#J#uV%Am|Fbue;H(y0#e3oB=g%2` zI-ck$CUH2idb8*Ji(`NHyY1ih@AlUt9xt^CP}_aT@=+`MWbTFh)BiK`SBW0yXP1~G zF3o?4Z8rBA)`R~zc#f!8{;vK|Cv<|toF|^e>}T~)>t7DPT3Gk8urhbCsr`M$@t)C= z{Ug&&0TvDuZ9lH#@0S~O2sp46Dx^!W3Yf9{`TOCy-`B|>RGBilEEykPoFcZ&M$C7ax>8Uc(y6E2s9;;GwyZuBezL8w^1BH{49LhtT75pWKso+n0STfDmx3DV^v z!msUytC*+phOo2$X=Pl<6Q&R?e?p<$@PcuZTD#bOfrt-=42OPfdX;{AugKw_MdJP9 zg5TWV-ucG(?J0xipEuv#KIt>BdL-~M_RsB~$A3ltmi_US;S0Zmps0kqj5YsU&fvGr z-&eZq=W6-i_x-#6`OuH|KbLacW(s0v<7nVr%*Vukg*oJp`J4AImNTmV z@M4JNKW=i&@Ql)Qu{!1(QeI!LOIM2K{5}5d+UI~*J%8^1SaENgz2U84QJsV4-3}+oXf&0`9dsJVX{W0Y=Dpg>uI^Q63ri0 z-i!Vk%d+#;oG0#lH9QXlmr1SuSM~RjxXbgvcZM(hguinAk(|pM`&*d5NYG2)!W1X;Q}7$(u3tQ_ zXDFL<@VpmdIR8uLTQzsI?Q{NV-+TT(GIjhO_2uBFC*MqeIg9<0$rp_kP2ye7d4gl! z-?%R;1goW2DEyP>7rd_>s$3=+Bg!Y)_qX=@%Wvk-R4y&snZbNiGG6VmIHSlFZuT!m zDhE^(IOcM4{k{BY$-n4-a$mi^{Q7oC?7R7VjSLMTaW$c}{0_1VQi6O}7!GslFsHt6 z{Pg!9|JTHi%RU$ha_eqTc*2*?wfG0um(`yN&YL{H@#E9i(=2|^WFFW4FJ|fB{m*eg z>YTtb##8JsgxbXg1&^`pdoBBA_Uof6hRQo7=1C~X`3UO&4E%Y3#h!gX%WGyU1{Qu9 z!JKcKU2;XT7#{MKiNtbOJijlYDRhwUKbNFnrdshQC#k3}-s}zBDZIV^17EZVIdUfQ ziE!C7`Y?D3n6tbUVU*WZ@{wA~bDJ?;Q%3F&#|o7jQYDgWb!<6gzJ^_${H2FgmFEki zrZgw(x4#-JuH3qk+< zESJ0`)UA>&X|5kA@aw-J_qs2SUtbZw{Ud;3wL!YDKhrX~mQVI(MgOnxUlJ?h+b%ed zt3Wu5FOhY}|GXc2{v2e^_;Fi+Uo=6InO*WbYXG0UhT2Z0ZxVmme0ib-o-?NXG5>D< zdzrba#uesj&MgdqVpT%bfBcxldHvZ{1!oAIQq1Ii!1jlCnb=&ZX#(=D)-pVT>o_9J zF6&;^a<|HqseIuj$@JsspSVvi?)2X7yLanL0mCGYcg7yN0`j;1-RH<>6ZtLtWB*6~ z4>LaP|LDuONw`4B{r3%K{{O2#wY<}RyXcF;4}~8g+*hO&M5p{{VBWxF{r~=d`9Ds- z{{EW(J^gPX#{+(&9}EB4|EPNV@s0lLkWZ371b$m9s;PaD{K`M(FBpY@6Z1ka%hT*2o|v2`}5-0 z|1W%h1$i3;c6^%m?ce(?pWl7A|8eQ>CB}nHO4aDB=BcK)j_$7hKKk>kHbITo-xvKF#AF!cT6`t|vM}R-rd5+lE6?|B9RAFl|7WxO|6~32_?P;Rrx}`r z1BBv#%d+ifV)?n}Tm09=AMbvy|K9cQA!mZXrSB6N6By%IJUA2B+?e7S`TtD*_2JJ4 z?uq|W+4BE?c`fmj?*Z%U-Jb-0{#99~mLRp0nN7S=%16XpD1lR+Vb$OF-(P=~`+A;j z^H;0i7yf=0xh!>2WCF(rmIr@X{yDM+@U8e=$G(7jD*qfo1)jSsaZL4pHh+tIAJ5|W zW5>U~FA6Wd{g}Y;jPVeI!=Fd|rE(v{I+%{}D)1OFS^Tg6e&*A%&+k8o{A%P3;9v4Z z?{EA+@Bd1S3;r$m7x@3c@0o0mMIA(5{JqR2z`?~(`}hA3>z};8^1r|SasDSi_kND0 zq6UJ^fA@W}d;8?|;SUSGERbPS*&uOW-ooIZ+I|scp$(kgzn=aO_+cmdL?%Fd&j+tB z_dm0y=7!&(*OJ6H5|KEYX0*nj{Mt|2by=QXx4>G5SbqdP|R)v2D{xUEG z{?hvwz}>*nz|6pq``d-_0_TT+0{<8o!i0YaU*HvB319%7e$2*j|4;YF4W9yjrgB~6 zU|?op;AW8jx9G?8Z|A?2{5`?hBk^M9&-_y3#!pM!y)p`PK(ANAks zfByYq_iO)OUIsP>0nT)W%-{JxH5nP$8W>p^_!!>*J@_yFfBpac-|xQv|BHcvl|lbU z-%t1d0xU@!8`&N(@i4G3I57INC9x&2#{As-HvT6+1204Vza{?|{~h?p#bwC7ftj6w zkHMdD?Qe#^6aKIJxBov#1wX_8-^NV0{?Grj{&zj2JOc{@8-oH17t3zO`~OaVv-{!y zmz{x);RCY=n<1+K^DQO?)(wm-3_J|~e~B_Pu^X`d{(Js!|9_C}2be0@K5_)|#ET^H zO`RyFkJtm_vil)f$#f2zvt-xx%qG0#|3xXo=x~Z zm(7>mfJIEXU1NfD+^^eA`u`UED`aM1=>BE%OaA+dKMOf7@E`k|%Ci5j?1$Vpd@rWI zOZlAetwipaih`sS;~g%0wz6+}AL?H2cpLk1{^u&b7TE)$VxLPs-+NyEI_^vScSVM8 z?2C9+Y`lyalrH|0N6kwy+xzV}R5p5D6VcPaV%Nv0zH zht|7{E+~GHc2iCe>SenA?cVd6HyeIFVrw z0}q`IvXWe@`S&wl`*)Xd{=f8Za$n;=zZCnbxIujW_lUpme}?~1{o((4!spN50)A+T zEmb@qzL+UXKtX_q<2391KP$g-d^`W?(su`j0-i6Q=YHAuviwgJTLZ^iRyj5XmTHyd znhrA3e-l|Ju$*Jq$*}+D&(9rS-1uhbJ%f9-exv^N!)ClZLxS zfb==8FXA7BHviiH<=h*Fw-%o+e3e(7roKU{|L38fcb__5eem+a$8@e1DHZMQzP5H7 zG=!L(co?|y{{{b=|H<$}<)`|Oe;AB}9fT(S*~OyIVEjGgtNq96A8Wt7|6<3HELk8@ zDyE=xQEESLKW9B-)Gyy(>%X01HWIiX$nvf2NBsvoUMBg45+B(Nm=gXtvs@N*5dQEZ z^`9cEtK@Hq1in7T?En5h&-`>?R^Zj+>lIzk+4d#lneVlgZ|?tH$hyIlQ-6Z|8LbPZ zAC>nCDDvO`WBM}g+eMa5rk?r?3hn>Y|Nj3mfl+~#fg$*J#xMRK1wRCSF)-x*oAbY( zA>nhwCk6&>rX0rke>VIT_|3pD;dj7~4PO%kKkzXy{QVin;Lqg11}X!e{4D?Xfb+t? zfWHh3#w_N{1#AocgL2%zKRN&SnI`;nU|?Xl@vG?Ph2I7YAT<*if*JPzzVOlE9|OZF z_B(9z84_3?ure@6F^c?u@JE58fQf-&^RNFuKQKFR1+X$OTw?#nzMtj6w+}xU7}oO5 z;8ox{z{)|99nw>9_q~pZ(zffBqjE0}I3Z zuZMo<{67DC-QV-zv*DQ-HvDg9Qe%++Q~7b<&;NgT8Mqkw|K9)6^)3IKJGUd305j;0 z%?H6Fmej8Ze>tly1>A|z|Js%`5b#4TRv05KL$nx z1}<+$pCzXnzz4nwvDOzaGx(#Zbz-2eCgul;lX|N8%+bC(K!>M-&CtN(M1v4NR^ z5p>qS0oO{#us``fynpjE`2S~PU}AW{`s7dOp8$qtj*n~$n3x%O84j@TrAO5DEpAmDBEr~6+czpDS%|K<$TEavj3~|PXiVPRxbuo#sy57 ztTh}BT)|v|90AO${+siC;Ol00=15=(V*JARf$=@lIi~&p8UEz6F^YatwpRKm%ODyr z_<`>;*9G}b>#nD~ob!?YyZ*oX|L^}>{5j~G{io#LT8s&71sv8K z4>+Vb>RIg>f3q<2DR5gcJ^Qc!%kG2T+jXyVK5~8g|NYcgwqG0mGzf=CJIOy(zM?!y z*;?+ISOD)1#_JsKnXZ1^_qOlNwl`XD{9c`T754uAr$65|{NKQ!%_Yx&fp0QTHrEEu zUXEJUcm__cNs@&Uy8LaN4_K$Os{e&3II;`bu!UD?O=pO*a0WUBw)`y=nW{I7-opD`|A{=%Zq zvYtVT=`4>u$F84kpXEOt|GwvE|1YCIGJpC1F#bNlsK~Wk%3AaS?>$xprUn1M|Go2f z{cp`bi<##Cx%2MAi~TQyKgWKb|MTbHH~-fEne~4Y?*>jE#-zUv|Du^QSU<3tu`940 zVB}+*CoCWmEOGwy!AN>2q$j?;&-}{T;j|0D^a6adBV4uKzm{EYS<^SKm@_!!i zMM^Ia?P0$8r~W7V50CHp-;%y_{p|m-`1f8;1-{op)nbhj^QC@C6-uoXdm{LN^DL*n za6T{B_w{e?KE8D4^@F&l=I_}*+kaX0JCywcn*&E2=LD`!-X#8o0>}BAcof)fOB?7m zX?n{!OI{RyF0@}zL75)%jK6=K{_R zEDQ`E86&wa@H((MFfuS~{msHKf%Cy%fxiq451F4a1~54=DEwn!P++|Icl|d7c2FB* z-|vfm8W=t>A7El&5NF)`*Z${)zX$#>FxW8cW|3!l@DJ4Xd%&p1V!#x@Gl7kPf#r9? z--+B4xIlLKvi@fK&$Qr^!B+-`R)HkG1#AZx82&Rb@G~$n)c*{7`|9oe&)5E5_&4D{ zF9R0?|KF=WpZ|#eG4b1+@9{rDt-E{{pPwr~-Fv<0P4B1vA1n-v3=jTWG3{pD|G)IR z<=6jTL9M%fM%_Q3{~0hhGTQx*{|mZ5w*UKqpZWjh|4;en|8M_4kZl1RmAog}*E2AF zee>1+Co=;R!vw}tOgmW$*r#)~a2l|4GVn6=GgSYm`pW+;jd2n40dQI5@F#_NEyMr6 z^Zz?Cfm*Mu3<~Vr3@3ie|9t%O-f#QA>HPEnBp1V|7T-hXR!bE=eyJq5`6Bk-+*=3kgx|}1 z$oQ)Ko&U#+KOX#L_-(;r!t{a3hdGSJfpsAZKZ`v>^H;HNdT-u8U;cF6)6FlZzdQfw z){mIq@xOV$2!A^Fbn~ag-yi->_^-&YfZ_LlUIzWY1%ig6|5-I3xSiR1gze?T?+^ZM zV0g^5fOR_SB98xmM8CEF(f|AGUG0n52f7b-KEMBg_vg&7bM8$%%X&Be^`9Rue?Kt1 zViI6V_`mVb8J7D@i+@M{-v7hp`^<0ezw!S3^|Sux*Z-1i{!Auc=X|JpbMfVymwK;w z-Y)wf|M}yeBb*7`Cs-4h5BwMTxBt)oKlA_D{Nw-Q`P+~&|99Dko$viWoBm$(_rm{| z3}^q}|6BG=_S^jr-$c#i3#E$$IC%xQgjn7(#Q(h``(HU;DCxWWGoNekFVB1+|Gw@Y zKSTe2QBgP94I(%HpZX#HW9^SqKjME*`TpX&|Bsjdo-x>cS#f{!^|cqpug$o{_wetV zS0B!Qsr@7NfBlz_yw?QfnWwzuf0FmiY04E!^B1i3D-T<2gD=w~_jHsz`Bt*_S>d=p@lXHQ{S z|J8xtSL}e$Y}VgD=6(F}`23wa7sIaIetrI16~iN@bzkIegNP z|Mh1};(x%?{lEFw{jZ`Q9=`K`Z}G|e%l~lDa6ogy$%`0?R5!U55F8j~nc=IG|L|rN|=p(fzvaopsM@zP$gI|9gYX zCbf@pX@WO-1UOH#GBO=tc+L2h(VxNV|JUF5zXtplU}9i6^nJyb{a+G(g8HWk|EK)n z|9Rm3f$t0qj%?jb{l6|SH2h&;SpECcj|1Noz-=(spErL7uuNc9U}Ru$`D@R*o~eO# z0s{j>Jo7Qe1m+8j3I7=w^nQ2$zW?vQ9|vXz2C4rG{wn+v_;ukM1H%^_iOaCzb-@w4jz|Nrm-QmyAU;RJt|N8gG{~xF{ zxc|TJC)4-%ua+OQKA!)|#Q?eyJDEkC@&0ec?;n3JU;vdN{0t(08yEwafB&}lvHlyV zZ0!GL|Mkef3CuTG9)e4228M&2kGY*$*Z;Zu^7)JT??Fw@0A_ZklWYuJkJ%ovPGII? z;9=lr4EieeS>Z1qYdxd>e=Y_-hW&qc{;&UU|4))lgrk9-kAab)f%W&V#xLvNZ~bM& z_<@O^frCN*+a!)oZU@eXY>BJ}%zO-73>UbySRXK4_{YTbpK<+vMg|^+^?$7Y7BCcY zrixeyIq)$ua55}l5a;{E^MHNxzn(w(zj+yW7!uf3`QrH(@Qd@6a0hUF_`Tr|1H%TU z35*O37yf==Wnj3#F@cML;m5h@3?D8}XW%$Goq^%hbWqb7j6vbTz`(%Z!sNpAg4u%?*D$HZn^gU%eQ(aJ&zRMT{jMVbn<<-4*zr3x2yGJ zpJ%)?)q40!?sbxG>8oq6taLBD3VONRaNYCOuRV07UiH6xrL*Vt{8y|Rpzb~BK5%3V z5(C`}4q6Qgs!KRPjsV|x&IYP68AKUmz#<@ZEDT%>A`Hq57Elq87%KxmgEE5~R0MR> zIfTgsp}?UCQU|*G93%t@QJ5?v15BI=oCeXwL41e~2+0Uuvx+beArH|HG7oaQIuiq^ zhXOgh6=W}r4^qd*zzDq&oq+-3U&yJi5Ooj{7O)H`O@Tx~_g8^>56J2vd{A!%qyjYV z0-_9!-#?An0i!d^O+6GQ9b~&+wt(!-lUDzD@X5@cY5<1Ai|3 z+3;84AH)9#|3NNiVE~!V&cMwe$RNf58kJ*X;9%fn;9}rm;AP-r;AaqE5MmH!5MdBy z5ND8JkYtczkY9 z_*?}_7oavAFM|++2!j}dIMh~I16omzpg}xP zx&+avq7V@T$-t1pz`!8Fpuu3n5WtYaP{Gi{uz+C;!wH5v3?CR+7$q2W7(x9A25`wE z$DqMr#9+hV#sC`AofVm;W^8=M=PZv=F$2T@`h)C0%v#bJ80=)y0$VB|KK@_dRqIri zm(>&{>;A{!rvw87`*W7_k9X89oiue{XIT?NLs`?l&Ph}2mOkFWa-RJ;1H(^=KL)by zO;LGSPGw!Spq#_SAjBZUpuu3q;LZ@qkjK!*FrQ%;!wrTX3{s4CjH!&hj5`>gGKw&{ zGF33GV|vOY&m7G>llca-6iYnIQkJ(Y=B&-Emspk9O4v@Y$+MTUUu4(i=;nCM;mf&^ zQ;e&Q>p52t_kM0Yo_Rciysf;yd5id7^QG}W=1&xOD3C1pOfXyMqfn(Vvq-Oql;{dk zbFmX*QR45!n zjM0w05?d3e9DgD{H$fnAb7Dx+m!!$b1}SG!GEy1SW~CXXA5V|Yc$ZP1DUdZUOFMge zwqwqzoWR`cxzTxd^WyUF=0_D=D+nk&S?Ex-rAVWAW-(_;dCB7v-_ot6GG&crkIP)j z7nd_sL|1IB;HgZk+)~L_6TQ*IbzSx0YPK5pnzoulHGgZ&YIABA)?ThZLF|FQl@{onfk^`I0c$l%5>mqDCy zGh-oBAaf8)3F|gCagJ%6#@ugt4)bjh*e~=*L{>ac@~X7I+--$QWi_>j8Y{JH^db#y zO*G6Uthj9%9KJfeaJ}Ji*n7EOOJI12eE6-%_88UpjfvVRlhPh%$Ynd``sCXd3KyR( z$trtU?p4`SwXS-7O@FO#-OIY<`d#(!>p``bF+&f75aUtC#Y}6M@3Yvj9c0hrbmF$+ z4db6I_(?clj7#!>biZ7gVzEk-`eLoiy8MP=CQHqKTLs&#b!2so_E_cp(N8xhHnc9H zH@YjXFwr69TiV1-zMR~=RRzb2_LWR3v#&T(saPFS6I*Lt_pYv_{%rj(a2SBX0fwCz zk1~6(o#OD}KEvxRa6-sMbg#IH)Cw6X`A)?z%F$~3HRQFcbua0w7!{f9GW%;`WnE;u z*#4a3XJrVER?UGLui6u}mUVOMzScR`H`H&g zzghpO{$D+)?JL7z#NfwJ$S{lH1j9cDOU5e3LyQ7U$xM5hWSN_p-!Uh!TxSVoy}_Em z_MWYoU4~;fM*=4&*G{fnZZ)2#JS%t$`Rw=w1fB~V5?mzIE?giIE9xiaEN&}dC21|? zAnhR&BAYB%Cf}{FMDc*qePsq!6*X`55{>zqXSDuk>**%yP18SXz-nY~TxGJ&^s||v zMZV>Ft9RD=w)u7&>_0jfIu$x^a{1_L;GXBP#`A@jicg&Hbiecdtbvw6*}-!{PKSOE zQ;hJ8%!`^By)ouo?8`WY1d&A5B;#b;6z5d8G}m;;42w+dEU9ePoHse=a@XXw=0_H2 z7Jez*Ra9MUUh=MFL8(vK=d!8gh7~6&A}gO(W>vkeO0B+G?NPI_Mx?f|_IRyCU2@&> zx@UEA^#S!Y^$Y6{)ZeOqQ~$I6e?2cl5rZ{jI@4F?hpd_$C%N|WG79#KBuW&?>{2jQ zy{WlSuf@2^qSm(Asm;B{Cq7U;>~xe{d|&eX^up}_dCo=VrPs^ltGH`s)*h|vtN&d8 zl6AeHpX^$VEykX9VIIc~%erb_Jsdag5Y?ugQK`=-Z zB+K9c5eLbCmt|nMxCkPDl9Pc!bti-kQUekP$%EJ+aghAC`rGyE>htPl>vz?;*6puV zudSM9Er(8LBUJwwu*(R`F|# z>BuGOc$%D%C{{S6bVtodTg~JFud5)3_;cy+Y8#Ei#ZE|A$zE3A)#^9d$}26%AG zEWS(cRtQk;QWw|TXYR%RgZqP!waiWJZZm1|=aMQ)Lh6+|+YI@54-0xr?oqj=mu12u z@j&W{QlUnS!6wrPt{ma%vMj2h`o?Da#OfrqmG)}Y8%{Pm!2eBng{-kko{pKt1*roH zb;>g}Cm3zA^5v5e;*si9Xw#Ufze-F;a)v^%+A00tmYjScg6vXX6@_&Vn12)YQ_xdB zulZKr*X#uQT%Hf2waT+~jv3zI&{^dj-`^kq>_o6s@7qHg=QD| za)cVClNF0J6-_zBq9rEEY*LWazhl0YFIuQUN<+2Wu)|zRXtly?<%t?sb^aO8|LuW?hC-p+-~MBm3JD>hJu#g_%;YJ%2}w^X*V0@ ziPcLkS9qb>ZLDP3EyyfZBBQJ1rF+w~L`q9hRb{`{9)qc7FW6c5Qe>}cEYnvqn=ZCV z>6hAP-L1xNExY+A3QtoA);O;J()^12aixpuVLJPaXIcE@c*MshmMC*d`IpW{u`odgulZ2lM*Nthvtp9^M#CKQZq982TP5Gf&sLMylN4{4T&HBA zk*mMdyoNKBpHnhhZI_;nDVuDtVwj4s#ulAcqf)*wp(hgGWuK}T>+TbCldPB9s`N?c zpv64CCxQ_YTjaiIyBqt7bt$}8V%FH8yWT>dD^n0^bzAs&Z-9=*OEj z2pki!ldV&KZTQ=KujpNc*~*)=bPShUX0iM6Ocs+=onVk|(Ig=xqouM$wutAnl?2N=v~w(87rGv7m$83$;+gOO}hoJ*65|erirJSZn@MV5aC+ z`ERNd4P?zd<^L+StDVyNX4GX7A>br(N9v8j6YaG|55;#$9a7k>8e>#!IhEf-_=EI% zrTe-LriLQ76@Drw>hzdAv5MtX7Oa%^R@T*9VJgmdKz^6HuCB0=vw5Q6S}|tjEt)2V z_bi^vsVZ5hr|EK=ez9`lJS5;J&8XC?S!()IoKBxT3U^m!hDk0CU za@%BPnewII3Vy#@qku<;Tv-=o&!=F)c)(=i_R>4eTqLH=LGZ_)3P&Hk> zea1H|JUNW`k4sspNb9>>?v&t@2~|o|KWXG@)gss^woB1m!(acH*)|CcnG>pR+Hyt* zE#~p;5xpn-Snai5v8lJv2Pq+SSv^6M*_Mli=7>*}chq=iaMes*;j?nS#$ug1BW+7X z!9Fol`AC)jn%oAP#F(Vglyi0UP3$cX2=Iv3$SqP~)eAAz6D&|%r#e%6uAzk0Z1w_P zC7F|2%Z#sC`U&wUmurgYpD`A>&`G05?~dvkYQ9)(EDioUcx~}Mdg8}pW!*PCtR)~UGfjrg!LpX_KSNu#T8|ArSpMU^FX$;%qui{`VDwk4O>(Nz0gVd7 z0xM(wPeRf%Pm~<>JuR1tB`U5|QPDkWWMQ$2{RVHnbgK%7j-nZtK&j{!RW^NP(-5l{ z0;;0C@>&`#`bMV5<*zAus{3lU885f$;}RCqm-Ljss-9z-C(a;MtstT5tLtR!#WPhR zNO7IInBF&&XA+e%zZ4DBa`onzC-W>4vy@w?VxVJY)-Lf*`i1g34H5k~b5Q|rky<$o z)kOx3R?_mnmBQ64wN(sMO?d?yMN_3;%m2`bGJPZdPAX2JRV7$&qUB0HM_nUv~OrM1}%_L$%2G7;vM_t4BX&^CAFzbJ2_x?b;z*(U1(eqoU>@+CUWrf;nj zWZacC)$i!k7%^Bq<+Ks>kjz%-)ls%wESV*np)9Q-U>IicQRtTBGsSJ{=k)~5eo9P~ zeW9kJlVTWTmc;W{_?z@W)#bWM=C8!(OUtTX)h#k^vbZAPD7syCjaq}=74w7g4$A53 zp4xSWA{KK61VrD@o5ceJ43Zaj%Z8*?emYA%5{gvS(D5>C2kEm7c96q$aAp zTR+E~k8`$wnA}1&CcQLsaVZBCU(I!TI>xgtR`FYi$SS*P-O>*;?UCQ6v|8ho?g69S z<}92W`8&i9$#SSk8W)PkOBu_vDPPeNHI3nZCXythtaM6atI>b)?NZLlbsB+20T$U@ z4FWO}yA5byuJ&EmLt>BgAB9IMN;*}h`~n+<7fH6uGwCOrF-lEWtW;U4$)R6h`Gq@PBu1u9 zUD43U;=S-irM2q+b!rWJ%q4{s#B1cVRF4`aSvp8{D!x!r(LHAJ-O7@)iQiSCT;-ba zW2-Dl0og$1!|FfugiUJ&WJSvrqSUN)@0fW=SjcFr*6O@8xnpI)-7I=jewHSu@k`4h zaS^GFD*W0@jTT#m337?~C={x*8?;!K%B@perMgAyxiO!0xgeWZy)2{32Au|@#p17| zPASdTtTo}WF64I;PL`Xjx<-GGnZ4*qMSHaq`rc-d)+@OB1wEuDs|4sgHG9g>qnNFB zPuI-kr6rfJq%@bx0WDpl%NEQEt;#brymYlq7FqRhdx)%%wpC)&jx+xtQ7)6C6rtv! z!(o)b{Yrd|a+Q|4;ZAcF30~<^B|Y^m`pYbNxK;_xm0?gx(Y3bxC#fdqrD~=XX((jz zLZC}jT_HtF)M%@DvHVx%i5ib|nhcki2?*7SKb8|$nW25#be34Nq>#b~wIq{?*24Ts z!gr+as0N$xSzAbbP|{In)SYCgW?sn2Exbl~x~`kaPfJ08#R~5A4DTRkQRK8CP4j zv8?2>6fu|1ROnWnuQ^5cs-eF{0NY+}0l`gThouk7FHpIuametqoQ48=lD2Y+ z%AFcjdadS{tkc*8dH6)mOB|3XP_R~uG}vvLY5jraJ?9=#IVmxDPE}s*rv}Dm+SU@R zFF70e{tGRUd?vR;MM&?8@h8g?wzWKdLadU%<=9o?HNWU}8ZWmLW3}emFYrg~pLC9* zfaZ3CLv{If;+BtvCg6+fuRYOOF3How6d z%VjLUDt1anP(@R3m(c{XV^$kD{_w;Iy%E!v*{7JPGu=?Z^uEPsmRH=#LK`KnE6!10 zroGgl(BzM09orIaYXLRU_mZV@swxROYDO6rA6YfH1BCBO1j)`+x~(-`|F-cwt97i} z+?NG|#f4-l6_>03(hV``uqtP%<pc8DF2W>L&j zXVd#>xX*MM+g_exp;U?6a$>4X+Q|k5rnjs@S>JHUiDpVV$Uav*ukk?7)%2K^7DqJy z9I>y`b_!or|7#iQZ!=b~TEHI4qavUqvQOf!jE=IHo`Cs8n@qMI9&_P465HkCRrs_{ z>DQT_vnpjfz+EcvO2kFFRB5Ajuc5!$WNQcZ5?(2h&61UJN-AdBlZ_nBcUyLs~E#!lgZT8hp=lXR;KtO49B1=}S~$URe;rBi7XZ;@&9hBb}niwKuwy-civzLt?; zjJbo&DYgjSQjvR7KNPezJ@wg*Q_S?Nr?Vz=x$<8S`6$UJ->f35eavKnRRwDpSEs-| z30FB56$ec(-ET${tfE<_aftKH7b%z5QxnkcGMHl4U>(33#Tz4LEB!*QOxa3ns)3#9 zE6YCC*W5fJf5p{gf)%<|vbDaMCRtmsY~~OZV3C|4pQf@+tHhwf^tGioTRg9Wu$u&v ztgsTBX189Q38VFF_9MK0A_>yV6vWh9b>Yx>;k z4_hVAV?keuLvojtH)*FEUNkvn!Nc~O>lXiIkp{^~xo29(4gZ-+TVH2e&aWh5FZo~Y zpGv%TnSrFq4vQ=7DLmJOpNJoozAc}xu|Pl7WUFNkTOm)M&?JctIdc_7ZFwVW^S9RQ zoQL`T2wxGODYIF*P$NyB%gn`kHybzaPT?e}g$hO*0{W@Ob>=BHt2oy3$_urKwMxyB z^HFQot20it%wS99aTl_Zcq6+&SyU_Az|Abd+MMkl_fEl5@wGBZN*^>X=$|l^vYyBy z%@;4;Cp}Y9P5p@0bUh`b*_LbA%6XK8cqE?4q$=sCU)7yv%xU$Wm5XPBP>7_FT!D&? z)?>Xr7Bg)!IiB%qiC9Sm$<0)fP=BL0*EG|*g6k^(K9LaVQiXbzN)26u3FcikCY*Qq zRtN`)GfSV4yQ3td&u12B&Cj0CnlhcY%PRlIxTzCqq-vGVHl1g; z(02)U`6;UAy0eW$%tdY9vG(y4isVYN%Oxu@>E)QMuxz%8;IQZWD>7B)zM`lGmtL#U zAJZV~M7D!G4niDa6;kPPrG-RjYmKa2E7Bu*4FkMhj`h9kBk43KB%x(HCM~j z;GX$U)>v*0fqJP1`COHKT6X$&W{%e8>=$_^2wf8IlhII`sQyj=lSzDWN(Gn>J`Do>I{Y9o5t^7Hhc>6^jNF9U19%^_n%YZsB<=yhz+ac8A(+T{a_D^C0WpBsJ!DbV!c-Zo|KM5=mOO`$_U!h{HGu6bxs+TpIyFsWy!bna~ z`Km^kfq+?)^>x-Q+!F++h*!#bDXVF|(_3efXO+X+%wsLKM7l|FuWFT+nn9w4z0Cub z<=i_d_a7b_ZREYi&|x@vKQbq%+K&@qWMa)m0(wV4d}nfh7BvKsTA7FL$HEaR>u zs(wPp*<8xzB_}8UT+w)$I)$C8K|0O`&1RRZ9XWh?odu_es7SiXn`q232sibx4q;2= z^Aly0RF>^hsnBB94>n(KozK32XQ^PF*ca)^O6xRh4YpaFwb{gWm`_h+uH53SqSZTTjOE|9jD=Tr7m3(&r9a>!bSU4pwzXtT7df}GkV?GpVDX7j8iIG*$H zi<(IV$Qml%)W|ZJV6oLEn(ZD>qzH#>pVDIWzdBJyGc1g4YB+p(p9p>z^^tlYtE#wD zEyN_(T9@q;x1>;@gpQn;inP`R{UFnCR^4p*+`srM#Z+Z)DXD5q(_L)#!rF&jny*8I zUwW?mEtPLt1^O-~w$`^;jrnGZESH)ncSR{!ZMxPY0~MY1v;&+#0b4D^1$1mawnq;}Lx)C8YRD?TF5GLr3$Q)@^LZdEN*H zi3`fCQ&^$;T5p5NN6R(rCA_zUTqPLfJCzl+JPmbBYpwIx?09X37K%qov&i4o*k=%I z8DTq%;~3v(;UuXDg*mFrb)OjNo26SDaem`76S*PLEUT)#Q}d)Am+@Xpea@r2GQyuE z4#=)m4%TBet}>frb%tXPpR!1(WVzfkdpzW;RZ=7Rwl}($MQ6xq3o~)D72ep~H(k8)H zj_jLwZwnumk^K9L2%!b`C)S@vBnDf-CTyjOqhjnio#afiv>|)=;XDYfyQbN{1@wKjx@l}fxHj(Vc ze7{9&WNH=XYpEJcF#clJZ9Ru|4%Z_7$09Q&@5%mFI;6SW=z!%UR!;6bfjF@x^6OP@ zXgLL1j%wnzG*uL=SipWWaDa=$os>5c)Z+_VN9=j~>PJt`J`VwbkWL4`7vQ12_v{>Ew zri#Q#?v+(lVbD6J_s#gD<#e{&Jb6Mp#UiCo$bZ$GVrXMlVSS#Xn{TsduJls*MipMI zg@(1J<<=gY&3ug_nUbGmW-1&|PtsjtIK#q-eF2ZKpp*Cvxn;@!yw%pP0+W9Q{N zD`G0SQ>I5TM$1b(UCXY zZhF#6noWeKQ24M^g}kG3xW-id>t+$w-#D20r;3@$SSnVloziA9$}u&w?q<*7^%OcQ z_D5=>+yfO0!yxmM)+%hJJp95EQcCi^D)+P&>K`&GvcAuj!s9PwCvGFVO37JM)JVbn zu=Q5fmHg$R7bJJfNvdk=yf6^8$hK)>za@|%c3jd@cA8?1TAdZ6Nvv_HJn&SXpm#CFwi%g&VMXecz$IZ{%EM(K;IvIRo@n7t$#A*3%1bnM>T#H^wQ^y*%I6|>L)uw! zg<7r7H-iRK1?zCOJ>1NKo)X(-zA8kk3F=NWdt*J5(}+Jw_=Z@&%s17u+AId0rtH>^ zY)rfwLbJsmNq?4quPtW0!BWz8CTA?4nTUd~1y_Z)&SY2YXtc;4G zmb^iv=`5=@w#z*41rLZ<%6(T-)08nZF|D+cVATbNdqQJSz9IcGF~AO zPAL!h4wW^U>V}_8Z(6Nq{mES@vPj~MjEB-Zo#%!Z%-XG^Ih}-li`|vFBbTMJS?j04 zQBw^o19o=7zoNIL6yzT&OKF7aO)_qJv4OdjO*Wev?^&@* z>2-1sl?`G7tvLqLrqNb?Z0 zQfO9D(G1o9WMXg4&LPBmPRLN=myD^>0`*j#S%$kU&#~U-D&qepo}{o&m0v4BKhwg+ z<~Q4R-X!7W;`K7Kln$#;HTY^;XdTB|z|$>eC*P&=Q2nF!R)hU!6Re}znz_&M+lll^ zDJp2Gl^U)xH?VQ#sNm}tekSQ8&!%Fg>7&2EWS3Pat1GvHFoOh>>_%m6jqQe|mJ@9x zIkNe7icF9?Ca2c4J*w;t-rD9aB~TA%Ty~L)3DKPG&*Y8V^hp_ zlIOMHKe4&evlOh=cy$ttZ(H)RIq~ciHjt{8>r?)tsc87sG~c?5t(YfO$VTFrtb?+y zX1YFy>2<3F_E)?yqQ|AbDc(^_*Z!yf&FqMEA$u6l50NJlO|tw-9-4gyohH#13)zEt z^Moc!&XNyOd7!=7Fvaw#)n?WbUJJ2#Qj6sTmD|<5_1~Ct*i7Q&7CbDrRpzy#fqJ`k zvi^CKOIDjW1NdeOS%{0v98;)NKc(Mh8e*---pSi85-$}XucmTHOVQw-=}YT_oOgKR zgp$SY%5GNrqIq54(qfCvRms`)OB4gt-fK1+23Q`mnZ`Mn|BJ{hsVMo2N}pAY zbvBuQwJBmR=2aEGE%8hKi>i}$lX0$Pko)*gzku^ORtjqtdy-i+2W;5EBgYTpMvWo^W|if<+Ok4 z+nFj@OR&fD91%zoTO!+`{9V)3;DG5AYf%m^ego0@Qb7uds`Ipd>vNk0S{HNf=7fX}rQ|wTW))g}{GM{B#&c2r?PS8~Bqm-WF1ocCD-KI>|kJ#?=atU)v zT#{d;dPp-*Z=&f%D`(CYzEwi^#dk{A%NuCA8`fCn*q-B9&-YvOn$!)s#VXmlkw%YA zS6E-+T)@vHsw3$kyGv1B%};;7iGgJxXCu#U0Z}Olg`28vy7C5g=Il1txvum3i_Vnn zl{>1`rS;sf!BoXcfh~pquE+|hZWTw3ULAj<%jVClTR89Y*^B5(?3Uglzg?AE$J12N z`ZgO6FT3zNi9ER!m6ci(4E)Ust$Wzl@%$DvlUyeIOtDZi(Xhy@*SeFHPjI5dA(=j< zjd<4yiAv_kB`Alfv+L-Y9<;V+cjt8#u9I9Szg<;Xd$++|b1s`) zc2~Zo;#D%Y8c}h{CYb~B zA5||JWLccD31d&>T`M$Anq6_Gs+E?wL5*3W^=I~ez9T{f5&<&8D%!dZ#!6Otw(%T& z{PmKua%xIGYA>{l3~en8Z4|lu1)qwU$?R2VS6QH8tM|(g*lzhGl^YtBy0eWRSvErj; zbKYn_{`603d-%d_a~|Dpd}Q$I_xG#cKfM*abLZIYx7pu6UYEaB^)2kS`X#k@kB*02 zK63x;p92R>4&?5Y|Nrn+$-VSP9N(>HhOL_SNbj4==dAZ%A80*$@}uBY#E~HHMf5J&AGDWoWeQRcaL8mcs}Xfzc(C@O5dM+XL@Ju z>BKKvKZsr^c=YeX*Ds$RpL=uRYryT==V!ibdol4@+}Urxci$7Zdh)) zy?OH?@8#FMt6r>oXY#q@Nb|1nn;vg0{u%ss`mXf#;HMWK+&&n8kpJ=U*Q7t*KW?A> zaCrUw%kL$>Du0>#ZPmXcpALO2{Pg)t@_+FkpT60CKXUB+{mZ*+27c|BEMdKum17+o9eguU#I*m`^ob|{)h0n@5hcko%8GR_lTc!e)Ig* z_}cjO-FLs=n|??9jrpFgy@26j4Kl;8u`=k1^@VDI0 zsh9Sj=6MMV|6BhD+aI^T)<0XmhyGU7Wng&f&A{N5&A^b;!@$t6 zfq_Bs8UusWKL&;%O-2UE2u6nUos0}!`xqIne`93GF=k@WDPdwbzmthUf`ysEHkg^g zV+AwAE@l>n%ybq8t4k~lDz2;y>-V!VoOEVmn0%3qVR9xr11}#31J7X&hE4693`=9V z7!usL8SI^S7z%@V8H{WA7|QnZGaQf=WOzPXh~cw?2*W%9F@|J535MxTQVhP^Wf+>P zcQ1zhTS6GjbP^dPuI4j{gf=o% zKbyu-cX%Vi-kM7c$EW;em~+p7F(s*zG0*fK;{%%prZ?SJm@Q^7FvPxOWZ-(l%;4V6 z&hY;YKSSn8d4{a}mJCOxBr;s6o5LWi@qvL)D48*476;RV&kvadLTp(qwx+WwIMj2C zGAl9vU{GQfWfo;#&*H|so(06}V3_;6gF%#;LE)H>d;DUjg^~;kudS!~{WjH;U{F{b zv@bo>`M&5I#tF>lm?tp5VSK~b$>Pb{$pT_AGoJj%%=m_pL7^dXUirPC=h6%cJ^lx? z=6F7nVo*2{eZMj)FkCX3se<_|Qw4J}Q!>+TmVGR{SwO6#42ge_G9)uGDBKTm%WLtu zF2$h0=3yB>$8otNgTm|xrs5Oc2gL;#1Qq3Ys zqn3}8y^8rTM-yucXA0*EUUQ!39L^%me7_{Jd0#M_@}{v{i3+nG6RPI0<(nX&Af&^0 zU9eqvrdYf91o1=MQZk{!>0*pR_hl-j*2ghiMrkz z$Bkzwzfha1m7rl{prdA`FRmM_ze3@d={Yr46Bqf1memRdMtdZ3&D*6`TC5atvE3rs zW8}`0VpYT!;lRc9)&8>(8{;R2bxama;;gOA4s7CVCpin*SveZGExAHi!gx=zzZ7U> zwHM=Lx95Gstsuz6bzN{Gf2-(g?q?D^1fr$O#3H0$aeY#_#(qij9?vTy8^KEoYW!-d zQ$=)j*d)WXvXy$d?1c@4dc~fIi^xkUO2}>Jkx*VF)uHXpZ*KCO<(~aa#%RVS<~*j2 zteh-|IKD97=YGQakiC#YQ^18)lm92@E6!aaRs4Q}RYFpHnIg8_UZMv$g2X?wZ4?b* zEf#lUcHndj=qullEF$AjGe6(J;zk_f)wySP_ybnralwpUp4m(|`_*cDa4$36D_%C9+%YSoKQP!Zb}-&yG+<(2@L}*_2w@0e*yp;>HOMo_lffa$ z4;d%`#ubbQ7;i9sU=&~inccv& zg6RU20`ml>9ZWx%7#J8hLRpb00(%;cUguBEIu4996MN^GJRw{ z@o(!N-d}z{lD`Xod&Q*9-pZ>dctjvVpp7@0Z8c{lw>bASj)QEvtpEP1{=NLy;(rRm zZAKZUex^OlKUl0;*qGNdon}lH4-pL%N)TY>m*;cj{mlD9Xogsogs!-nNT6Upw>rlh zmdng@SfW`|*m}izCFCWuq{5^>N_R=0`g4il5aT9>#=rZ1UH_RZ7$Lwf@KWHRP=QE? zXbkTx{)Ym&0x5h!JkeZPAOC-w@@vmOF@}wQx_<{T|6^=m{=yc-(ZI#UeUFEo`yA&L z&a2#^yv+QfpVohB{5<>1i?3qeoqza!?f)F{QQ>{fyO4L{?hyxql{3QrUY6_(2j$tTHq$nwbSm3k-< zEWTBAugGFyNud?|hk434B{)8@J!74qen3M<^QFcC^<1?g)l%+uE*=gx))kCQ|BwH< zaHI3)j$0|4RR4 z{@=~6#xjY~@OLYx6;Ic&fzgZU3iR{Qo}Havov3!novn)E`IYFC5c|o%^jOZa$ugF+>HJ^vvxy^y=?5Dpd&cJtf6o4iVcg9iz@WqUg@KXz zB!dv!d8V>|Jj~{ds@yvnx>;T_GX2^1?=)jBb1uW#Gx6 z7yD{fKGu&c+y2^o`}TF}*IR$sf1Tj@_Sb;r9^+wt*KZFPdw%3``u%_Uv+(~m#ls!ix}MgEnqmru#a;EyY#nrUt8F@8JDuHWKQR93hgA(JN-vKPwf2{iL_U9{8D09GnImYRKw*LM3e-o?Gzw3V& z{mWpO#J-gM$S=pgn^?a75oI{Te)miGe@T`#%v*nH{bl)S!ov8s{%_Ua34hud4*aqH z-~Q*=A7%z|My`Kme-)TM{ViuyW<2xz!k^_IGJmW7Tg_4T_b7wv|0loq|D4Ve_uupH zhJPt6bque*-Tv9ba`ji#4`G2d}g#PUK70r*w%c1$IQh1>6gYo4(3|66CCaT5B)X&b>tr_*YV$b7*rYi7}dBAFirpc zpE-j;jp;LE!oPZkzYMc}oM3$SbsxhoW`kdHjDEj!|CIa=VlQUXV|?)I>(AvsMSiVf z5dUw;ypv_$?@-30Ojnu0n2niV{X6>m%m-L*F-I~aF??cH z_|C(4j%(Kcr@yBEY5A%9Z}LBVh8wJZS!Di8ewAfQ{>#C1=;!o*W-KQer~H#=^77DI3}$}TgA8vtqW&c^rTn*MR{kr< zap=>DPtBimKFc#SFiSICVt)O92ID=}sf;`SHvLTh8}ol6#|7q8CZB)oELq>)FkRy6 z;(W+<<=cCH$3H>rihu3CAN{Y)aFRjj*CGZ%cK07Qf6x5Cm2(fv!aqgK2N={Dd{~2- zFEh{omH);1*GI-1e*&4x{)zm3^3&^&)qkIVoc~IGiT$@@yvf}EqwD{7Hfgpy3=5ej zFh(+~GRXe9`DZ$N`aj9PU;b(^tzph)yZTR+x%d~u-)G+rGRzn7F zeay^k1uU}}l~^CLnf7Q>tX0bW_?PgfR zDf_R4aq%A+rq2J?%<;@Sn8g{A8D9Lq`0oXy`}d4roxjW&uKrJ8;QTd-rIn%czwuut zM#tZt{}wPj|1HUUiuvE4wjavB8CjPxhW&oayn*4sw}n4dSZDv9{x5|khsBnm?7JBA z&+pS%Rx!`xR^sR8{K0XW&QF;{ZB5dKbHmL>wl4d)IXnLvte&!`uX<}Qxmh^ zzhZ{PERX(){d)Y%i{bvCoqtvT{9{c0yN=QE|02eV|J0aYu^jz<{dX4QzVBy$2QjcP z$}ztE%E#c%u*{{-65)i{tsn!g!-j|H+%o~}y z*bBKYawqTx3tZy2`4;-K@|WkQzh48s&;O(P$K`j#ziQ@s_8sguIG=JXWNK!c$!;jp zAs#Qj@)!3%k^fBpmowdEezY}WXV@;qWw%!@UU`kfV)T5k9CWuPG(2#=A=J5Kp2AANOi`5#<8@M`Aa`N@z z(*?FGU)K9=zI*(}sf*_fE=itLz4TutLnh$L!t4J}r(g2F(048UwE8(Nxzo}tToVK@ ziyjxe{O8=?+IRV{MA(uTm>7C^n^>(`FY+&BaC_(Wq3mYroee)b-_GPLWh-aO<~X#| zZLbU03Gtg(jc=BnzjW!5zykhTKZ`gXJP3UBnKeP+t7xaB;WyhK+YOjhw3M=it@um? z9tzut$1yJXUm`6n)%304bJd5gKmJ_hjPn2Hu`T!}_Bo8f@5Ad~`V9A&v>Ep@fBZd% z;~Z-yTl3}be^B4mqPDM!p`y3cxcFni(Y$pztFv}x z+)m?7^-rEJ^G$|V=7;o4sY_B(QokiXN^nSg6jKqi7EKd*z^2N4laYbJTKc^Beeq^t zaAyom=rSlXT>L-dKLf*lhB*wT|D*mfFf3-`W-9o5_!k4i4UXyTo?i-X-t#HA>G@?k z`wb2ThQq%K{&F)dW@2E7`e*uo4#R#128J2`FaB3%&;^?aA?z3!7#jaGFz_)lFns;X zz_5myfuZRq149oF14I9Hafklv5H?5*BnMIhQVY@p(hD(#fkBKxkwKi{+yArwcmKcr zUzeetp@%_(q2m9?e?tEm7~B|tGsZF&{`dIX^vCX>IMY+s1#Fy5Mn68hKKbx@?8%28 zUK{=3WLm)XlvSL`?qAa%kH3ZgV;O%lx-l{^2>t)~uj0Q3Lk~kegD%7E|GWR6{r~O1 zID;YsXm>r#enkd#1_p)$|JVL!VCZ64&%nU&;oqiz3=D4>LzoyCX8pPQn}H#P&4Yu1 zVZpnrcalP{-dXUDfx&|#g^hvX?(bQD7#KpB-ZC;UZ2I@%9|OaBhAsvMhPD3>{AXZL zXHbM%;>KY3zlJgU9|MCR%apG(1vk8?licuPrr?yXf-DRS+5c)74gb4=)ox?pVPIs) zVKii5V^CtsWe{Vy!E}hhgrSdFpD~reg=H(_dWK&t!AxR|8(2A+=P{66;BywBenSERE3v)e6C{!(O{CbQuS>6xsg(7SlahZWzf+-8Fiadi zG()xIwO?v)(y7*U*5lT{q(9Rj-cZHprO`U$A`?^7AEvv^YRqjd{#xv{tg*7P{$ah< zrpQ*;?xo#g`&b7t$8(NtPPWdUomaTTx(d1-aVvAz@VMd8;c4#m%xki@gU=hE>AsGB zuly$aTLnA}Xb;p5Iv-RVEE=*cBrNn>=#(&{@N?l=5iF7OBF&@DMWsgnitdk5j@=sT z9(O%1J^pKaa{_hv2UbUsQ^J`DkzONOjv#g7$tF4<`x2NuA-PbySdd+&r`iT16`iA;R z^^5B_*B`7uTYt0uQT^-sPxasH|J47h|6jk5;W48Ma~jKX))#DA9NCd}ROFGUym++4G|7unJTk7bb#mL}-zummMJo5H98&$Nrmhj8*`c*v`-zUA zo~?em!34t{M)!?bOf}8C&2ue!EmvEew0>gq-&WjS&%wnp!YRwS+NH~Ny4xc6H6B|$ zcX{peKIn7M_kiDC|Lp-A0+$EP4(^SFm$%Hov zdlP$-B9awTUZ$)~%}>)$f0MpEBR*3k>v&dqwo1(mn39Ok@^Q1$vLm>x1fx>ig=K*YB;rQ2(I*ZT+|UKlT6X2mAj2W~NT| z9-c122C+QpAO#K851PyMe2njyhuiFQU~)C^bo4a|WDDIM;Tp3p{!Np9x@+cUcubQT*e&7?7?iz zEYHlt{EO)&(+#E*OgouYGtFh{XKH3DW6ENRX9{8RWU^;6WzuF+Vv=MMWa40AVEVzx z(7@Ed(!klk*C5&;*Pz~D++g3}+YsB3*U-=~xnV`a{)X!f9~!tD)f-(JlN*~Gmoy%4 zeA6h{WYLt^)ZMhL>2Z@lvqN)X^Wx@f&D<@HEfp;rTi&#&x2Ci%YJJqI+?Lw5vh7`) zNqcqsk#_!$sE*|wUprhor*^*RwCzA9*KH=kpn29GQnoU|dNpy1Cq&NP~} zb(Y2Ky|bO?oSG9f_x9Yhc^~K1&gWh*bAjft z3pWa%680@LEOc9lXh?DJ`5^6}_P~b$Rsoa!U->!uP4|7{)vYS3RimMOjTbT&YuW zr@||FDS0osO4$`M*QME{O{9_}CrIoSe5v*$iwAmJRb7OdJ0-{%lffX>Jv4Ki9FV z>uQf||D=gVQ~pl-IFoN~(1P8Iw@0vrnglxf8hA3f?sN#Zxnu5Qyj<^triN;eLY{Pk zSeIZAPbYgb6H^0UgL;E+Lqo&<2JXh>#^a3^P1~9rny)oiw5Yc}YF*h@-5%B9+G*Wo z+wIkp+}qx_t^eZ$vq^1}A5L+bwr#q>%&oJW=iHuKJ706*-9@vP%!@o1{w-8AL_5eT zz|qga$J|T9L(uKB^Et=G_C>Z<)_*N_nH8C+7+un@)|J=ZuMw^GMY&T^N`8fmiPTG^aGLZ~oit-?F&nS4(K?rdFZ0vbH;IZta`e6+5PMaCSC!{^_jh z`rTFE&DPW3Bh$OO*S7CcUuHkcgoP6vCq9|jImvMHoynb3ET_Jix^PD+9k_5!pX%^&q3V&zwHy7lh&)PdM$G;yv;Su zSWNF5?=YHRm~LRJFR1rKXS;TXR)nUy##gmNs(mVv$|_246}HLO$+^n%$Xt|~CK)Xu zFaAh$sYtr8rqC;a)%-bpI=pYVS94`^YH_?^Th5xsqQd-`aUpn?7c$q2odmTHk+B2= zb_h9p3PFO-Jp(mG6&N%a3>YjJ92h(p0vI9~5*RWV3K%LF8W<)pEMVBcaDd?g!vpYX zSrUu}j2?^$D06EZObSd6ObJX4ObeI}Fg;*mVCDcfaH(yo0yB2sBSewI0K^9QlypBT zFp}zi1?Xv32$x`If!qYcAh#(n7(k%|0|31bq<>X1$Bow83Y(a7$g{E z7!(*(7&I6(8B`e*8DtqG8AKTb8Mqm^z^B}SPA~+W>?Xt@#vsKY$DqWZ#-PQZ&7jVp z%plJo%^=Po%)rmU#{jxBfq?cbjogsi5 z+`(jkYG(jz2Rj=^Fo91fgq#D%!obD=I%AK6fr|lj${r5`9|Iq_PYUW+iGWYM69bnx zQVdcIp!4oPJy=lsR$@?MP+?GEP=gx#@Bjb$E0s-AxBvgQpJM}Y)iE4=1_lNNkUDI% z+W-IdAn^$dpwo016!!du@L@C$Cqx_<%@G1o52F<{m>fXnF*N)En~O#>{Qoalr7jj2 z#=yX7OD??-svk!05P_HnqoZUXd|b50q5!b{FnU5)5SY)f%P;Kz|Nr$3(8O{88m{29 z$G{)}PIC+l9E8$Z6*RHXBCR#lEy`y2A?@Q}f64?OF*4*EFfzDYXJ9a&!N9O6n}I>vhk@auDFXwq8Uw=%DFy~mt}Nk&Bupg+ zMFs^1c?LNKSq2#fX$C0onqARkLH zSTXEk*ahO^(}X0)&cF&T(LrSks7wLb%!wqAU_wF&m4x^n;#)|Vf$CT`@CmA@DiJ)8 zA3-ODqL$;Z`UVsVppX`15M_{LkY!M0P-W0$0O`T3Z$KdhI$KnjL7YLFL7qXGL7hPx z;@}1baCy7sE{My>U@phV&}qrYup)>NQXV%jG8~)2$k4umks)I@BSZ69MuzwI7#a4x z2L&Ay!y$eq27Y-ah7Y<-4EZ)p43oT=7!o3w81AJqF$fhifff`otnFc9keSKE5U`Yq z!FMAQgVi%nZw-m>HB)m>Jq~nHkQPF*7hUFf&MYGBZd`VrF2S&CGCnF*C#LHOvfd zTbUW|?qz03JjTp$=^QhI!F6Van)}QQ+nzHs+<(u^@Z&qEalpc`fWd*Wf$0Et+=3+ zyS%01Zly@IR*h`!yV|*Rn)Q?FZ`A*;=V4S~wqXrn&*p68p3b|Pf4|^G;YXsM#Q#h3 z$cV|wDX1u^t7xdHYba?+>j>(x7<@LoZ+zTzjd`zSmbJ63xcv)<%}&)Wwr;=Ow|HiF zi}@b#O9@~KnjNecx;xA{;z*=@^p+T>Nhh;Fx4_YX7ONK%Pz=S#&wI^j&~s+i$I#-2_a39F40$Fo)Rl0 z*`$+Y_RC7imnfW5R8y{1xvZ+8UZZhNQ(ik?XP+*&ez?Ix!J0$TGm+Y zwEkkFXP0U}+u@uegR{O%tZRqcM)w;Ye?1kv9em<^tNbSWuL{@~cp>P1@SBitp?|}e zB3L6?q8OupM}LZW7JDP^c>Jb>*@=xwDap<$3aP(RFQhF_FUfGs^+T#oLShN*uW#O>epq~&9A#u$5^jZA6#EnKec{C{fYY9^{?x{gU9titrE~Z zGoakb&cMk4D#bu$0|J9eR!}(sIv<#u0n~EgXAlIpXJBejRq!%^|&&|r9>4>rdVT}_%=D>ukJFg0muX>JHLpcAwi7+`8x88jF^ z=+9s{bLNZ=NX=QDvpS%5FUViBB1QN>=D^f|+lUDa2@o}qlgMv}L(~W{I574g`OC=I z$QX1wIWq&uUore?ZVU_}3=WJN@TfWC!@$7K5Wr9aQ3Li@np&C~%spvpiv&RCpsP8f zb4G^=e6l&nUyB4l=7=#^F#Rwc(h)@GMoElvX2SXpj z4M?1V`+<;nhlC-61H|tf3=0@u7|dWuOG{G&g(1uwP#C7ELDB|@4a$l5Fr?pzAhC~P zNPvt-!H60kI}6fwK#-tT1TmO_L4jdomLfypQzeFP1uCGXD}(P|b%yQrnhb(r+6;D% zx(u35`V6Nd4H=X=jTsy+nle}zTQC@HuwqE?v;}z?2{SSrn99U(U@8lP)(bXP;iiBcz9KY!Jt!t;eNOZ1E+%q1E+%yLvEM>!@EWkhO~ng z4CjSy8SE<@8ScDwWq4BT#ju3apP^!1FvE$&2nG)2ScdH%6B%O8rZKc_&1N{WvVh^t z%2Ec+tyK)Yr|TJ(zG-1lljveN>f6s?+dGB9_u5Q`?HcnL>|2&Ftb4JN;auo?hMdz| z7(zXFF~pwV&k!DaltKLSDTdMs7Z^NEuQB92yv?v@%0mWG|K|*00&f{&Z+v3lS^k5; zrRE>Qt8f;^dzM^`97+O=J_2HllUQUJ5B*bQJoHbUv4%yD@fN=c;}HcbMh$ZZ#t%Vm zj9eu?jB&Gq7#|#sV66BS$0(+g%D5^mn^9?5A!FXFa>hF2I!2eq7RGg#yBODLO=L7{ zo6czQY%b#puO*CSn^!STQP{}%YvOjs8SMKQ6B>^&`usn|=+$_UF^K&JW5mRJj6w2G z8BI36X8hvziLv9s55{M;{~1~2*_dt|=3$D+5oW59kYchpp}^EptkB54koQasso$7ZRQzS)>1Sb9S;5Wx=CBZR!XruM3T8!S6Lk&d4qtudk}@;q9}8`n zSuVIR&tdRk-eVlh9FZBtT(U5cnd43dvw&m)b4NrubIz}&;!gm>yI;U;X2P;lW~o?=EPm*9a>MBHTvH$pZNNj zc}m=G<_Ra6ST>k(v3yu6$Pytg$#SDhfu({$gGHl4pXI|xGnNavb}TzyyRvM^_GQ`d zHiTtEVGPTT@5w9&>a$r+a2B(im|DehLb-`$!{$zw8LksqGH%Xb(a2xGa)E6HOU8or zEDx-=vpC$`$I?)7jAe%8IhGlFuCin#-er;Cc*-(k!yA?tQD0aD*#EFFY-MIWkiyOC zAtuZ^sUEVx3NCp-p3m7?k-Ysk$B74{*WRI{3sGniWFuKBKV1I`#!uJW=gP1pLCvv~ANi_Un zJ207r{lp3$c8&ca>@Tj#urqv6VXxrQWp_|BWsh*SWxtT<%08pfmwm&cP>8I}us860WS4ON$^M{;k>kUDP7Z^Af*cEMr8olWlsF6yXmJEE z8*?mhx8_jjb>_Hm*_&g7bO^_Rlo$?%^(h<)zj8Pj+)FtQOsVDA@VJ%Zf^i>*K=Zmc*&9A_lYB5?Jtf1 zUS`gMJZ{bf7lb((Ok_9wvEk*MUn~To)pYxh~wd z=6aCs!u8;T57&pPP_7TGaaQIi7@?>pTu#4|qOEyyPi(@sa1ij$b?vI+=MNMDy@2&=ci#V3Olqa7~T(!D@Zp z2aOiI2O=DK6AZj~FK`6&3OtJDRoIil`(aux?}DN-UIG7lUI(2H-T zh*x3dYF>w~ExZmndwCiBkMTAbo#(wEc7yl9?+3ga9=_xaIPr=1!1~|352my5U1;Ft zYseDgV+fV!GjP!0Gte>Q`ygS(*TCk?ci@XR-+{*=d=oCm@(CPC<4f3@&zG>gg3n-9 zBj1MJET&*xlwkVEKeE!SpTP z0mE;65A^=?ZP4N1chDB(Z_twBZ_rZachJ`1-=Jg4|3J@<|A3)8e}HKK{{qWM{sneP z{0T1E{1?1R_&)^J@?VH-;}1yc=Uk%g zFzgmMAb&(a!QrfcL*g|7hUWVMpbk4D1EdWO8qr5;*f5~;VfXpK)S&Z0?P8c5h(_l# z!|(9{$%5`XWrr}}B+MNU0aPAnvyAD94;?*m>ip&Fx9>fC^8DqyPv3t1Wnj>hF?95cOwKN< zsB7uyoj7&oocW8Eu2{Qi`|kaRj-5Pn@!IVNPoBSi_woB*1_nhr6SvT$+_Jj1-pMoP zEncx^!kDk5!@a+!+gN(encXVcHL)WBP3sp1*SQ-s9&VzW-xjU=UTZ4Nfg%=x?%UxbJy-Yd;9qpgMf--WM0FB`D=F`Ie+uft53fe z7#R3fons1Hr!C!b@a&DpZ@>NHRdb0e?VP=O*NLkS-+X6a;8Ax=tms{^@!u`?UpwWUh}-Re3kZc@{0q{ z-#(Lm=J~YZ$@0h79iuK)zTefj8+E7W_WoO+ZmQmlywQ98(6#SZb+0C0 znRWT%C5}su7b`DpI{)UJ+PTEDbI#m2EqXfWRR77dCwNZy9Pc@H<|yCMfFqL*Up*vw zDDL3m126X*>@VMUU@ynspgnVTKi_4%t6}Ha9nw3pw(r`;y)9l zZ10ZiX7Aq672U<&wY4+3Q@HbJM|p>K$HVsN?f&f??T6dy+ico?x9)1KX|-!*YCYc4 z*Amtu-}0(?TXRcuP_uILm!{)QvzrQ=Jem}mel=cg+|)RsF~2dO(Wp_h@mIrxh7%1N z8|E~0G?X?ZHv~7hHdr+1G$=JlHV8IwH?TD@H!wDU?&tVZ|Fix}{oDGd^>^wo)*r3k zQNOZ&MtysINqv01XT4FqWc~lTCw0f`R@QaaWz@OWDb@X{y;i%fwzW2@RN&TYvR&0UgX zl(RqEEBk6zT-LM9+|17z6&b(N>(c+H)u;VStx5fvQj+pMIV1T&Qbf|ZMCZiq30etr z;(6n1LEaRf(1PWbsS!>~!ApF#pd)(7(hX9gV!ln<;3 zxahCx-{5!6SKGJ2=Zd$QcZJtUPbtq#j~(u8?!j&gTwlAGximPRauRlmc3kA}!d}n5 z*lvgIZyS4?M(e{?ELJX-Efz=2namx`>P&Z=d^a{W&NEtJ_{c!UAXL9k@2Kuy9TS}_ z?FCxbG`Te$G)mN0sNGiOQ*}@&R$iiXO_5#ETp?Y4y4-QuZ!)SfA<|7!8zk>Za7$Q< zr-@Ax-7oT5SX|gyC|_`vz)}7WeA0YwyoEfoxsP&v;FRKY;mBj3!FG`KHH#>V9dicL zB*xtgH~vrm7y4KD&!t}ze)|95`+oLo?-$?Cyr0f~=zH(~PVnvJ*Hd3byp(zI;Mvlr z*-s1~|9E)dLC5{Td(wBG-QIMo{-)0j>Fckr?!MA{IpLDYMa~Nk&TT(C;Y`+P*HcO- z8BW|kcHrpZBW;Is4h0>wKA^H+VBg<8Z+73=b#CXO9XqzK-?n1w;w=j{&)>9Q!u0O3@WM%iWeGEp1q`VDX_v&lmD7G+&TBf8xADbHC2fnv*np z?yOrgC1*y@STOzhG=piiQ_oD1ol-dY#3ZFjbrbJSu%EEFpS!=b?@@1H?~xwMo=x4l z-K)EFy4H7^bsp&O>A2IL*Ur*Dr_G}6T5CnCOzV-BycU_3v(1go=FK0Q)-~ld88-cB zJlNRR7~5#j$kuqjVRyr2EGQi2BwDp_5bRB)PJadT7RwnNd5Zy z>Gd`BarHL!67?VIj@C`DORF=i`&E0OwyD;!_Fv8Rn%o+NnhVu6)oRses|u@xs@7L} zRX(aHtKg`ZUanlerp%~pYpH4JrV`zfCB>4(-9^6&(+bZQm=(;*|D6|^w>6h9Hzj9B zHb-`N)}qYU8Acgp>D$x3r5dH?q%2Opk;Ii`m6(w*Iet&vqgeJ>%@~j9w5Z0&SrHq; zkA__jeG&34m?@YiNF-1yK+a#$PtjN2N5)&si{F#Y< zXKQRDX8ptRhQ$u^sb)o{z9wqM{|&DhtkG}O3)NNE`KfhMbEZbRx~UqY>RILKN{NbE z3ZLY5$u`QkOY=xwl$a_WAto()Pk4b)qM(w%W4^__$vn#3k2n``B(Te~-D8=<9L*%j zxZ%I<-&McVe=Pl~`g!RG^>?dZ8@}B6%=yX1hl%&U-s!oecH`*PjLZBNcb&^Vqj>7h z@wrEn59=Rf+JAe`u3Zav^lfY2QopHrL;t!(Yxb>ryh32P>(Z9RXBNsXD4%y{j@Rsi zGo5E#n3gt`eahxZSrfG<{OG&TySZm!_w23(of|vOwSRBZY0GKd*&@_Z-u$vDz3F3P zd!u&at%m6h@eQU8;ti|~|LcF$KdwJiKczmZUbudLU3}f=+N#>GHOVzctEH<`s}@&Y zsrXecQm#~{S}Ie*Ui`dpPeEJ0Yu?YCMcEEnS2E(#@1_Q)>`PKetcX7z%NyevRU5H9 z>{Q6(psxY{{TO|Jd%g3x<+jgdj#IINiygns70b!yzNSpZ8x3Ogm~<9vI;!7RDO6%s zm@F$Vy;8zZY@4v9;BG!^o?V<4?Aut3m=gX+{tEpX`XT0Z*0bh^%kSK}E_1oy+>Mi= zM_(S8wkK|f(-xNvscTlO;9WX(q4PY6*&;KnrglzZnXtOIzPqV&bGvZc;+E9r@TTg< ziw%(tA`SoRAJq5ObJhpfWz`1MuvT|f-YaJ=`&E3nFh2iWj&PQKx?;+kgbA?%Q8{7D zg7*9E@|xxr?)1;L$CAY~-C&#c7d2%iSJ^0ubm45iEY4IGW8;~UAP8zJz_5bLPw-Wo z4P1P(V6iK+!4t9#;bqn!euGu9FNkK)j7bL3pfwT&-&ce6Fl@ZXx54ZfpTPAj{sj@s zWfb}%1so!OXgMrCDR|&^v(1brBu2a7kH_DFot{Y{2Jaa|3VW?*1=a3D;! zpv;JmfjdF&z`{D|1~(-Iht-Oj4boSX8f4CzGaSCA#_&qfgJCtBZbM&jG{Yq+a|Xta zVh6bnEs$Fdl=Emmc|1O2{g42K(y7@AfYGxXdrXSihH#8COd zp26oq5W~M&J`EeX)4=9{+Q;j*n+v?v;yDnSYN?=CB;K&X#O8q2aixatYzGJ3DS8Y{ z^==H>V%7~T1^x_f7d#rwf5kAc{tRz8Ugrd|pTSbYIid6k7emrFmj=r>A`Mf%x;JFr zmt%-Z^=as2(`4XS6U4B%%$Ol@MYO}uR67QPT^S5sGdvl@bppZqb*=_Fs6OXlFqt2m z(8walaIiOwq3?wR!~b(p4Og}*Fzj5B;NTXc!LWO4M#HiT`V2-ViVu`bHUql@WWeu9 zu@|SnRE5m=*41>oeTn#pQSqvS!`5G8Za~(pz3o+c$Ej;l5gcw72 zKp8^~k5q%@#Ttg2u`&&DnzNRRKC5SQ{jzYbG4}%ErKOtX5$6Hui@0ef12HVjK-$ z+N#0!dn~Cgc*V@vuZqL;KZSwe+m_lB&qWy6_^f$aWtH0N+&%jXQS}*iH zf}w#urk>+zEklE8Rek)nxeN^D^XrdrZD(j;KT|JTc!Gf;;(vX=<$2KjQW|KXBxp_y zG@k`B3l&ddRAJu6;?8!HJ&W@U~vg_0ek0n$DWXHI}tqwbyE8>*DL?)?KaRthcC7s&B7fUVo_m zM*YkBZ}8hIK_Rk$!IAM1V>6Qq^AYA$7B<%9tnO?t*gDxYIZkn8adL63=JMu#&E3tT z&3l?Rn~$4+HNTg@D}hcy4WSc4>B4LxOGKPSABi@I$%*d~kCONyF-_7~>Y`MhG`GwO z8CThdvbA!O@>}Ht72YazC@L%MQ;JmntlX!fp?Xj?TJ4KkuezGXevNR=_nPfm^4i<9 zeRZDbROt%pEz`5nzo?&X@Y`U5p^DKCBX8q-#)T#@xoc<=MJ_c`F>=zGxD!Ee8xo&O$xtAOnR#)0btwS$%gDF)9D776JM zVGFGb{TiAR_9!eO{9L$G#P$fS$hnaMQB6^wqf(-;M!UppiBXE35c@ASJMMa%bNsq^ ziG-$vHwht$dlOZXx|2R7g(vSxR!nJ4d6D9sx;B+BEkEsintpn3`kQpmjAa>2nQ@sr zGljEqvyNrSXP0H4%~r{&%sH2%oLioIDpw{iFK>Sye|~)a+WbHHo(0ni9u?>nRu&#E zry0f4u%e{f+tu_0Q_x)PJo1R{s;a-wJdV6DSojFk~}aV{l|# z!zjVj%=C^alKBX;0n2O_Hr7JcJFM<(o7m*oJK4Xm$8((GFy&mp$;DO5^?=KpdmFbR zPdCpuok0__+B?`5*9m32YUR7wi=LEEp?vLdZyXjxd`@zQ|1xXVJByVqy(q zuf&4I_lT=W^h^AZNR&J!X)HBIid8yK`nt5e%nBI+*-F`mvYv7qYEzOF!*f{XL!(1#i-5brIEMsT4R2bLX*oT zrl!+Ozneyy?J|=xuQtD9ZeuaW;;%)Fww9 zZTG^?)qb%(gF}qNP6tuPBFA%%T28G_51nkBr#pXg_H|j|!sHs`y3JLCrg?3yOo6Vl% zkW-nnDd%;La&C0)q})@vjCtmHd3j6nZszglyX05qug!myFIM1LP+PE};8B5Sp?hIv z;i|&hg*-*JMY%`A`O@;!%Y{0um4&9yZ$eDbropT29k@{F)n9Z28Bx* zmohG4T*A1RaS`J}#)XUv80Rt0W1Pb{hjAw3OvdSq(-@~PPGX$M*w5I@*v;6**v{C> z*v#0-SkG9)SjAY*Sjt$$SiqRen8ldRn8KLE7{?gR7{M6I7{utu=*{TC=)&m8Xv=8H zXvS#7sK=HmNBjL-kp*Ma{*dj*hjT3XsaV`Jn0g|=Kw#>U2= z$OEZ?<8|&2|Hbql`hR_K!M`_wJDBlk+QBX)|l8~_QWML7JDI%hxQ$@wZ zriqD*PZyVvm?0r4Ia5+fYL=9=^lWJvnK?4DvU6qSirP*|X#sJKv3NokRi zvhreO6_q6_s;Wy>)zp@$sjDwn*U(s@p{co2Q%h@=mbUh4Z5^F8I=Z@Rb@lYt>FMjQ z*EcZOU|?vt(a^|flaaCUW@8hREheU>TTRW(wwalmZ#TEF*kNI5xzp0hYL}I@^=@k$ zn>{wRwtH>u?DpB&+wZq`a5&)L=y=f4$?1@jv-4qR7ndV0uC7O2-Q143xw{{C_wYF3 z;putO)646Wm$&z6Zy%pCKEA$Zef|8-`T6^w_YVlT5D*x6F)%3TQc!U4<=~KzDQ+>A^zG=Fm^(4Cv3FzR;_k)8$KQ`nNO+KtnD{U; zDd|yCa`NNkl$0kasi{v>)6$-$rKdkn&&YU@k(v22Gb`&=R(AI5?3|o8Ik~xSbMx}v z<>lwU&o3zWP*7O-v9PGQ_~D z_3!GMnm;wQwSQ~t>i*T$gKueOxXi%7aF>DM0O*hiT?U4RmkbOI?-&>y1Q-|^#26U- zm}jv)<22%}6F4C(BpxNTNcM$-j!K^T2CWaeI))i03(Rj=aoO28X1Ppr-{4tu3=9rzXFkD6Z6_LZ_Oi?pedG=8m?2PLZAqeQguXraYL|GE-sB zws~#~&n*sEc4~#q>J@8wHe_ttw}oqaz|OwihxUHhFLKD>h|95n6CtPk&N!UYxWIAg z-sLq{3$E+jymzbZj@rFl_uU?zdgSzE!&9;61uqW0oi=fNMdzYTv6{QdG*?w`%SfPWF7=^RkL z2JH`GXJBaf0p+0a8>AT+8lE8JkXa2#`e5on;p=b@SrsN5n?7VQbR7pc7#KhpSq;oS zm>7(Yt{21y=|#pcJzzOS1_qFOL1_S-CZK*I#vjOLg4m$FP^ui>9EBV+I1X^U7grV6YOXt6{M=65W!!7HA8||a1oCwA9OYr)wdJki-O2ld*OIS> zZ$BS1zbF3${u}&C0=WV^1=t0{1eXi`6!Z~VDD*=pKzNlft4NZ_K@la<7SR`?eqvk2 zr2*JSb@?wOLAEdabmc%tjeA*?qDea#!V2FCbvwlm|Zr% zW^v#0jn!Xk5nBVhK>Kos#g12;xLn*^JKQd~%Xt=go$=Q3o#f{(tiqsPrNN;4)rjG_ znghe@-UtR`+bU3+Vz|nc!N6^r$6$6i04!%)p2hI@8fX}!fq|icv4N?9xq-ETy@9KN zuR*9mtU;zhu|cCjzrn1*uED(_pdqRur6Iqex}m*cO2fj2^$q(P&Nkd_c-Qd1L7-8& z(X7#{F|M(=v7>Q*}LjZYi@HA*xYHTgDWHnlb_YC6z#ujy}-Y_n~1d~-wd;^t$` zubTN=Ok1K`np#%2Tx$8~GClE5L_%l0g@UA}+0(~6@jyjGrH8M^Aus+84lSC_3} zT-&o&V%^ep#_JER58Uu@L(xW-P181MZQi#zc+1Nz4O_*xZP@0y{n7T?9TGdY>&d<&I?~SexdrJ{-vjvW?c@v!hUuC)v{~)*PmZscq8hj$gT6Y zx^BDOVY<8TZuLEj`(N*Geo*w#;L(Ri>mTPo(SQ2>>4s;8&y8Pvd9m$f#VhOA|6U(_ z)AH8+9rye5?^<8wC+XSRy|AoxB3eVf(%)Vwi=}wiWWpZwVKUYn-W`Ty90Kq_M8rD9ReIbIZk#malYbQ>>}v8-qpwLgIEr@x(X9e~ZsbxSQagcrej0 zX+aWya&7Xf*`x74?^r}R`QdznjFL)q@KuVs4W>E-jwua)yuI98NZtg5(M!C&c6Sy;KS z@ z>e}hGn`_V2zNlrYlddza^Qud%tElU(TU58L?o{2~x({`X^+NT^^~Uv1^?~*A^*QyG z^{w?2>*v%jtKU$+v;I*1srrlcH|p=#KLPh?K7mIi5Iq`D-2uTa4>yC_#SH7Mz(cwW z7cba@`I7(bK6N-5|3;I463_fAqT)axa&Gv^FP5|AW8vpAPue zzj!cJokhW=#W=lP_-(ECQAeE#bR;p;wv%xVah7h}j=Wys*W$ge@k zD5K%W{z{NPKs1OC5(mkH)iE$Ifb@a%gUkV$2R4_1fdOO>$Ucz0Ap1e?0GSVR7s!1e zcY@ptayLkP3Bz3`M)qo+HG-eT_+$?&$7=sIsx;%Wl(%JY&~^Ld15yK7N5#q@z+l2~ zj^P3$8P1=RVKF1il>QZA`ZCeUV3l*Lr9eFfd%vPGx*@ zL5canA}o0vGV=uvT-Fv;qS|GOG?0 z_b?2J0|tgyQ#UabWlUuJaPlxy!Y)r1jx{oD3$~bZJa{>kOJJV?FKCzig1X;A3~OY> z5(FY7AIL730lA6cQG{~C`{im3A&)g18d-E17#Iu~oX#6Dh-H~Nc%Lw52zhLIz;&B7 zgPDzO!}L5mhAdyuesTw}+aY_^!A=N2#l*1Cm5o82pPS*Onjpi5A_;~|_Y@eGhiftX zIAj7={_Cwb!-k>=2FHX{hVnU}GOB^0Be|Dh-~3q&0lmu^*o3x#PUK_YuszKXvEnL& zuHt=$fZpc};y2$h-1zW?A#T@Ch83oum0{q)3{Y7B!VtHJWjQunGjV3PcGQ)@P1UpE zSB!6iYH1KdeO5$+u3~&cT3Q;z)GN6Rt~W{;j%=)Ake&w)M-UC>gT$v^$pxtcsR!#* zEe!&h12PX}F4%mrEJv_sAbxjXc#!#O;fJMP_`g5+(emr-Z=b(8{~rA_`M>@@1H)nl zcSeQ{3_BPOFq~kxz;I*ML%Zh;FK)d!^zz3`-q%-Nx4v8cuK0cT`+e^}zW4o5^I`pm zFCP>>rhJ_6@$yHuPd=aeJ}v%q@srBu;Lly3w|~C*`RV7spXI*je{uQ}^d;*{!QF z3~~(i4ABf#3^N&aGdyJAV{~L>W;SQt%8|}1FZfF2u|%fKclme9Q`O&VN$DFHSC|`E z-(|97z0Xn2>mlI9qtVWy_ypsg2MJGwR$^KKg zs}iB{LHnY9zj3a)o3%y_L&D6;hf!SR1+f}6{Yfc>aZ)wx9hot*t63IjY!$WnKP4wo zs)plNQJi2s$I;Y-65qLZr%n_#Nose~0oTQjwcVeJKv_w$cXVDvC zVKIWDx{}5byZP0mZUua1n=2;hO31B`nW9<$bL8;)3kr$8l9(xzs^FyZR(+y&n|`P9 z8uMM&ub9Qy)^T?8N(!D6X_ELM{Y}1GSxx=Amax90v5Pq;c#dB>DwTiT$4{}s;%IjSFL`jmc8 z(oJM?Y@}Ewe^P9qjS~FBG2*|7tfM3F18as`e%;D z4yLyp1)_79xY;Uxd2;zM`2C&E9r?*cB3`fedD>&OCl!WCCaCocX;{eu4NSQC@~qKj!}5 zs^tG?J45$ByRYrMKl#Ch215rE1H&Fx1_m8228KPt3=AQ13=9<-3=A1&5P1tm1_llm z28Jc<3=A543=BPz3=BNV3=Ay#pz;r*2AKpE2OvIZ6()!cYUY60pz0OG1|3ZT!l333 zXn`*XgK9949uN)E1EN8CKSDfy@G(eF-uPbdmwYx1fEB z%nYD&A3!Y7o?wt((7J0-3?MMbR}2j743LlkxekIswt+B67YKt)fazvnm^pK%Bq-dW zX~N;as#TyhDGCc_&Xi0D4HaFW;t4t?Q((el3%(0y&hQ*~v50%as#RPQ=HB28n54ov zp`!!5oV=sGo&7|i4Eu(Kd)PA4(%3o@CD;;5F0x8&n!p+n8p;~5Lyq-?-y0T#g?m{v zJSVY4yvtffH>wB6Axw+V`F9m z3wh=v20Y9!xPLJj?0Uh}qI-jhC-MXni{VbDHLF%JiR_ufq!H84)Y8<%l%ih7w7@xw zX~u;(CY2MxOjA@mnI=52W77FGkip!*$^be-gO@?XqjAm_1_nO;S3aw=-I98B(P@~DGR;^maH3^cA9H8lpY{NV!sc?4Ay}{Y{*aFngqR711l8dZui4tt> z?d|NlUM%8XwQ7|Xx$d+3@c@+l!RcCT(*#zKnIJckW8SJ&tC&~~cQQ5U-e5AckY{eT zTEVR1If*4LEsYHnmY_BivF0i%DKUXCDD6*D@no8QAr72RxFb)1&3okc^jR4g z4luX8-pF+3%o;`p1_wrdW?umxWo7$&VTZF{)iN*~U{97hq4US#P83TqD1n7=1*j<5 ztqB*)2k{sfIQb9hDfm9mgzy*`Z2AA_I(T0Dt zXnW4@qV`Ja26G&`L!$E;7%uRX$$ZmJwLKpECkLeBfIz=;i1{DiUEoz}3=B4+)3k3o zsm6iiK-f)GOY6Sy4nU6IhzTK#P?@ zMMH?;w17N=#Wih)TV3W52`K5?!po)BqWk`F&D#Q5mAP@@8ucPfT>A?%)Ru-BT;|EDYby|*!Z<4Ow#R|VGxi7_clz=jT4qTs{-|7HFh z3P~|{8ggk@=5`$n+%NyBTkUYp7h%AHzwbDTtrVeBW zXul&!Er<(-5s;w#q{^Xc2w0YeI(~xlwkcI;wqT!9Q z&4O^5R}I2<4uj|eHjcUuhxc8AVUQXI1_n_504hA>7{GJf450Qn|AyS#Jdpa5fs28G zfpbB(9tQ(M1N#ZTH*7by<$~%Nrfrlf;iKQMckmS6w{o0Ul=RQUNJH-JYcjlxyE?r z%o)ZbhYvGu65h?&vwaies#U8PcfDA|xGi@!<1^DKjAv|n8FiZ47(wmsvMrU2FXj|8 z-r1JR$iR@ns8N>0=q4V^nD;Q8@zSLr#(gh+87HZDGM;O60k;9p&9!Fy6luTfqNT+pr9b*L9rahLYd=?pmx(G^;&Q{%-GnN8PryqZ1)n}p84WA zpJj>vFP6~IP*&FH4XoP|xY6(0NIZE&7Bf+r1Qaad8p(;yGVriT^K=(9lp(*60nQ+Y-3N($dnz#BvUb9WRs- zFE1|_SFgP!expfOqNAfj!lLi7#LLNclAu1K=lm~{zn1t*ty;B8DtZH}H21ay>D{|` zOXnOElaV=ID0Ak_8JXHk>aw~wnq=?Zy(`=I*h0?kUy@5p)P1C=G(rA1LjC z(j6$xfzlf&t%1@RD2;*A7btCk(iJF8fzlHwErHSzC=G$ykf5{!N;jZ114=KTv;s;e zpfmzXAE5PAe)+!`Y@|UuSwAqyOTA`DOMAxf=;1?#o1J$Vjz!;O2o1f;5LeW#-O=+b_NE}dJ0fmx`Dkx8bmWV zG=$C%2DKy|SQjfH(FYnG9(EW z1F@CytTs$Q&TYibD#2omKq6%hgCdaK1jT!M&f{6>t_d>y_XJ5vO366 z_Tb0?p29m|`OkgI4%N-iLE<2JkUkXi9#-+7s9#}f3R4f#4>A`d?*Ov*u#@hA@KdKi z@*sDC<#`J4!1y5Z!Rou@twHL*^5LgW!Q2ay2kApG59D5C^&oe{{3HKGrJ?46u|rOU z5repg0mwXuzEVvG`7bI8H_ypG_#`j2Am*R&gURi@7dkGnfy6=TKr~1k6!r;=8Q&au zzMH4pIj)52PQ=x7mBCp;`Y7NZz1a_b14Fuz5KZMj-n@>Or(Z zPQ@pXIUxUl)Pcl7?gXg^nR8%r``H79UDrV3Aa{Vw1E~kO2W+1F7Zs2?kbA(i{1+9N zILIF${UC9We?j(v^n=U;nGaG2vLED5koh3{LF&Qw9Cp%upl0|0q#o?APx4YAd%@~K z;Rv-CBo8tN>>g0K$bV4*=?A$7OoQA56$hCI(hpJ(@-N7JAbUafgWLmB53(O*A4nYR z&dKe(AaRg-P`H5X1L*^)2e}6npCEHV>cM=dyFl&%=>w?;+Xsp-P`p3jz6}xwsR!8$ z(ht%H3LlVtAaRg+AoD@t28vHmxcHrnFpWJKVG5!_dAfo7O{>FB8!HeS+V=*vRU8@` z=QcUS_1M1o|Mvfz|DZ8jRJ`h{ocXS+a^@f!q_@HQZ&QO3FX$jM*tiSW9ELXcMh2e4 zb}#7^LmE89tiuF)S((WYAz1Wq9~hg5kBIEQ9YJMF!4Y zY7F`cIt+I{8!|XsSum{qVaHHy;>Mu**_XlIDvY6oKc1nZB7-5ax`^SnY%POKS_gw; z)D(txhJ_5a@#`4Q*6d-}9DkajmhU#hh5pwJiLd@J{7~U%%yLs=To7u;*ca)|Xcn2s zxFWiOks)IOV_fS>#t*v=Grr@$&p4s`H=~HDB-0UL3#KP}5llOJE17!C=P)fXKEUMC z`IKpeJr6TaoC))S*Rjk!?>m@36l`U_Q}&oSfQMv4_*)`QL1=*| ztMGvpJ;DtZVj>RT7m6r6))!^?wO_QsGDz&fyk}wz>b2qr&WTDSOxhs9kmoCz5c@__ zA*NTVA=No3IpF0m4;1=R2kkSsWEIlWRz;EQ)@SD@C!Q-J9!^`d7 z4d;7(8r~)OHdvVZH7wxrXOO(>&oFIWKm%ueU_-iJP{U%GV1|t^gBe=3hBOE?gfe)0 zhB0UehBM5$9?mdlP6UH&LS%!8QdC35qbLTuh0zQ#aWM@iBx4(@F2^!tbjLMxI>t9# z{TkokvLb=uTts3+7JE{I(3Yfz{c*_+S?nncyz5dJ76zp@D11$AXq%eGaMn1T;lug# zhF6&x4LcY!8N#M#Htg5RV)(Q>tKpSbcEhsk*$m1_ISuizau^~DavAu)~w#d>3?X9H^b$n$Fn^Maf&g?2{xX4@1a4fEzVZ++;hAF?w87f^X7*hHw z8ltaOFr-RVHnhi9GMt=O$zXV|vf-$7RYPxh6~n}dRSefoRxzY9R5Q4kRyR~KUe*);FAUtZ&Hnt#2rdsBd_dRL^iB zr=G#2tiD0KzP_QMy}qHizrNw?wE70_dG!ptm((|~udZkKwxOP(ds{ujsonJqI}X%0 zL>#SeSbws<;lSB?hW?B74RTlO8;Wk!H}u}FZz#T3&!GOWzG2nldIrX4^$fZ%>KhDS z)iVgZsb@I-ww@vNeLcg25A_UopXwVLKG!#_{8Hbr>uY_()^GI;bH3L%axM&+zz9eS^*4`i9=W^$pkl);CD}t7i!QSI^M# zubyH1zj}s;|LPgo{?{|8|F3Uw`Cs1<_rIQ@^nX1==l}YKS^w)9R{gJU*#5ts;qd=@ zhO__c8?OGZZ@BZnp5gKT`i2+(>l@zuuW$J9zrNw~|N4e+|LYrm{I6&D^}oL1_y78a zKmY3+{{F9T`1ik_;Xed7fX>7J|Gyqo_kr-q5*CKPf7uy|n0OeX7Yi_~`y$FPk6ni0 z&>JO&V_UQs))W{sJTER7@nWr!H_P0 zo*~`wIYW*IBV&-aETdndHRFwi(TwX<>KIQjE@t!#JjFOc`wJt(N(CmBNB&G5?;Dv8 zyxhhV^70+i7B($rlc)@4hCeHrIauB^|L8Plu~^#7av|q3OTu?GR)y#~)&pyAvKFvd zvK=U%!?uE-g+1eSKKlg82kZ}4hj0XJKFh)2;LWL!c$V{mN(fiMjQd;$C-S)!_OtLL zw9n%?plQqdVC@6m0I5zshY~aX1^Zv{GyI<~u)sJ*upw4fh@twiP(tTAVTYDFkprp0 zq6gG;#Txc;i$73$FRtKmU4lXJh@`^&tx^n|R!cj0ER$*QTPoYIVTIg-@D1_}x_cBD zB+e*0{JpPq;NW*<1`lCXh9V<128B@d0|wO^4NXfl8$Mppa)@NmahPJH%TSZ9*YIMV zKEuWv1`caPj1H_1GIp3S$>f0I71IWDar1^H(H0EW3oRYaJhx)d(ziLFQf}MOyWft% zgu|iXWq@Nt?Mx?z0}q`W8Z})RCKb3f9NOmI@c6d}!!diW2J0qo2C>6F3>r*+46gS6 z4GvWS4evGuHmJS~YS<+c($MM~$`Dr_)*!nqoMGPCh=$!CBN>8(q8aSX{6>Y*`II z?`Jg}+>+f;+mh3u=AX;3LnN<3?`j@H=Y;%*V{QcvFTNKrd|q70@XD)*;qsfJhHah2 z4RaJr8v3`CG|YA?Z8&qfl)*5djN!)lvW81ujp_!O(rN~uebo&gm}?qT-D(8IH}bXJ}ek&ycaHzM*Yb zeZ%X6^$bf+)Hm!sSKr`#rJlj@W_`oKyY&s{9@aM$KCNfi@}j6jZ6E3z zCVi@BNd8ja@aJniL+bbXhJ`=s8MghbZ&?1To}u!0eS_Yg`i9eg>KTIm);ApeThE~J zufC!BUp>R2fAtN2|J5_-|F3U|_+Q^p^}oJh+W-27wg2lG4*aiYIRC$%;r9RfhA02) z8(#mfZ}|AXzTxZtdWN6>>luFkuV?uCzn%eF4uHx4P~HdO0ADr+8x1~&;O!C&L8WR8 z(;u5NX!rOsTw=^%*m=L5;m?V+4BQ#F7=GmPF)oXOQ*_YVg|{(!e1Y&LEr+$>6atx?%d|SO(T_ z@eQlklNxrhr!>@kO=XC_klt`+dL~1*cXq>zS2+y=WqA!J-{dz4`4={@%q?m-cdeLV z$Dfi0S^lzyJic-U{omycpRQIkM9;5mkdCNoc*9WLFlAPC!+q77hIxx?8kULFGMuZd zWq5tLw&9|3T|;12U4z+*x(3&Kbq!X$^$e#?>l+qE)HlSH)i=!OuWz`$q@H2H&Uo>^p5Y6$ZUChPXdSSiz?O?)nG=_TYY^80?;NgzEfcr` zD))1JnD~Rs;fpnQz?4qzgp`NeA3~gY7KE(lNeEEobueDad*GQKUqa9!K82WgeuWpT z0tz>`3LN0i7j(!r6lys6N63NgqA^H{+u%U_0Ye8T3*!U+n@t#84b2$tZ8UedZer>1W~bGG>kc*y zp(kw}CN`8Y zCO4Rdq%hDhPh>Y(e8_2-B9OOUGh{|HdT^2V_edSpJtbEV^FSP_n$dAvCXoL0PA=Vb_C7hQHla4X1Uh8#s?u zGt3F8X~?=+(-0F<+YocKmLXiHuEDaiuHp0TI)*ZpdWNk@^$bg=)i>B2sAnj>U(ew2 zrM_X)KX5(Y;Pbz}!SHWA!}_1~4M)G!Hl?1`tY?s2 zUElC$Ry{*mXFWq_S$%_9Qhh_6PklpzX+6U|nfiurO!W<`p4Tz_I#t*3bWL4DZf{+~ zq?|g25U;w1&1!WG8yM>td~Vk=v~8|si0`UpxDj8=@X@%IVHI0#1IvvX28IRSdItRW-2IRxwD}RW)4xTiIZ-r?SDl zva*5Ew6Y=neFa0+ii!rygo=jcVigQWPM0%Gs4r*WH7aMYeq7cdJ-Liwy<-`}_jjcY zpJ$aeEOjky;Co-vpg+BYfzz&}Vb0@XhF9&y4WG4&8Frm1VzA3CYG~joVrX7f*x=?~ z$Z+OSL4!zb0fVAg0mJ9D`3>DJ`3vPLq=v&!|wZu4ZlMY8?;U)G88^oY|GqB-|aUjE_-hhVEXZ{Tp zcK!@=r}{BGeeKH-&LA6U*05xnX~WdZCJvwY zO%CkwHg5RdX5_HsprOOj-v$R_Obr-v^Yk5lEYovfxUbvLE~e`+!B^*iOp7*y{w^(t zlkYVTyj9UWFfUT0;a;!0!}^1248mVk9e6ZU8|Fr-IGpHFZs^~qVm};>Keor z*sT?HICN7aftyVvLB>cp;d`vmgL$2T45C{F5@H_kE0lBdZ%8-e3ouCJO}O06V-UQJ z+hEfJt_7dCxGsp9avCVcb4ZAEvS0YPiS59iJFFJvY^)QM4OldeL^4N2H#60|Uc>mh z>>6k|42(f_bwl<)a2{qj^%0VP+i!sLF2nLo;C$Pl(*Vx13^I=3{K`=K6`WTY!sbHq z=>`i(9-Vp|oIe``yuf*rLGJ)KUo!mBtO4c8hK_b{er$Mh1DqEd6y&Nv`H;as9FhlH zS|IuF%F=Rh-V5Cg&UX!RN5OfH!Q(JEzcIYo3dw6KbHVwnfu|Cj#~2QILh@GWieQ$97VYs&kl6SVKB!Th`!<{Bb zo~gMG&MyoHm1048rQu2nIG->)o(s++43g&{`D5u0U=;w$ z4-I!5{6Kku;eovmI3L8Cdx7&nySfKB{ZA5b1Eu|jO`jm?UhW(?%^%=i3{LM38w3pmeJcy8@DC-xy1Q(yPL=J>azZpxs#%oK6K!fYWHh zJ}&`K`n+)AG&pT8X!GUV^Mas+2u_EFptk83 zNE#Hs46ZxC^#-WUsPh4*Jy1OXt|KPpfa?Zuy#T5cJ{m*nf_Y`&Isjb$gUbHdyC7vg zsJv%1tpu0zpfVm*zFR+rq%TmJ&i5XYwqCV^%WzQn4Jy0Ag5*#|23KxH1NyaShYM}I@gIEMR>w4lFB3sk0o$}><|1}euuWf-XZ0+(H#55Z*? zsJsHjJ*b=ll~Le${~jv@DwjZU4l0j8Wf3U8L1hrA`~k%^sN4aSIiNTOVNg7S+Y5W1 zfy)?B{DRs8pmqSb{s+Y?sJ;iq=_d)`H6mP<;)qr$P1eddD(QeGIOL zKWi0(;tf>ag6mn4JV<QhiX`idzNRBwXoOHe%tsvkk|1F8?*|3UI}Wm6QmzWewn z3{<~?^Y0nsKv2E~=UGrZfa)tyJypZx3J!lzeWcQD2daNS;SQ>AKw%E5UqJZ}T%Szv z)dA-@P`v@FFZ%Z>f$9fP{sPqpps)p%|DbRMmG_`91(olh@C23Tps)m$-=HuAVNf`N z+ghM@6{rmbYA=Dp4Ac(VZCDK|SHWSl-mwfEHlX&%=e7Bu^b0NnLG1@n7=Zi_Y6Da@ zMS;>G*uS832l6KXPEuJ9^7Vp{;wWf=iK@WZa+2@{i$b|`@6nj<1cVM)G+NwJwy8U`Ub^s z;C3ZL@aKAP-K6ya(#BlzroQ3mtNMmBFCb;bv?uipQIF~w*dKt~o(yug>l;9I*zK#3 zcBtKjdIrC<^$qT)AZhOV;d+L32kII8_Cm@SuWj|kJ;GzZ876Up+rkX4f9gPWY{R^Fbq%YY z*EP(4P}fj*v#!DY5~SXpcDRl~W=|bM&lYfdnL%@D9jGp5$ejvqJ2OPI)-~wV)-}8; zfz;0`DRm9=qw5%0gTZZThF-@yh7A^V414t>7sZ z{+b5yW=Q*iKdXizE4GGVeE_75|HG^X)TUr~B?B(&8(NrZ8VtWyH=KB04QgjFY&}!m zz_q`c!FwaPAHdKxwHnm+U?{4D^a+?_s~Oh#RX5l>L)hvnhTpTR7`l7F?G}ct+^UA1u~iM9eZh4LgSuW7xGlrN2kBe%ysd07 zxLe7v{|vaF!7yiaWy7mkl?}>W;64XKSVkqN&BI{q2JU|_>{hO1h!?74c*g)~2c5ZF z!61F6f+2Jlq+ilGt%3p6Hp(o5^ijU}Ry54Au4vHKgtV9VSSlLgKbAMlxmOPAyEI(e zQOX?eq*NsxYwe@=PBkBIVyUROxFszR=u;T%^v1ON9jaQ`Ogd>I3%t>wHN+}CNi zUsuM^pH+Q5`#=n$w@N{6G6vxd;QkQ9{?^il(t=V3iD+;; ztwGM9w4qt5wBa%fq@QGZvjp6Bb6X4UGc~X@mM|R6DrqPT0oS<=J?bS5zXeJd!hRKl z`%>r56ocA$3}5Gg`&A653yK@2M;15uJAvDM4b8&E4F7)@HKaW$0{6FmZYg3=nOnqQ z-C6|hd+CH0F|gYfF`QEYw+|WQzZ5pCyj|F!aJUfMC%ZVY5Y%RDFirsX&l+6y3KFgmxv%O28xb!N|PPXp`N*D4)$RpApihTzD+2fo)|LLu5C& zf7x) z*QbH|uW|Wl4Ep|Q4Da+H?Qqj~sSNwhrZSkWO$GI98{TH8GJx9V@mi2RZs&`XhUVib z4LQqF!2Mm$l$3_OPALotijclxHn<B!(Mn zlNeTZL;AvxNp6sE1uzBT6}|tx3< zd~}OzSfT{(Pc+=R8QT!EHMZg01V~@J!9AAYpi*qZ$Gh7s}ug z7RunJ2ksX&$leQK_`EfQVOMVmX#Ai-$~FYtS8{k03?56+o*mrKRTRu{+Y>yl&=Bw= zsG;Jehn}7`+>$P8l1EJKz+1^ zbTRO_MMKCzUxw||d>goPAY&NaV!jRAU;8v%J>UZ#&v=#P1M15)oDhMGZ4~YEZZMkc z&G0N8GR~nY=*_V4saJ#kE-%oSM+0lJ7elPMSHp5{$oPlo7S9HY4$lVv7|2*i7>g%^ z+YOHf%{3mNagm0T!5$3l>K+Z|zuiG&Bn?H2+!_9sx;IpNLdHviKDaTgKJ3QueVQA1 z>?F(9jbW02Tf>^iuHb&czD`$$EitYP^YkHODt=d88iZH4G@Pw+0gbOT$SAmg`fkdv9M0!hFs!n%V5sH+_oE&DuQq4cTy1_J#v43tHO6=p2yVq;ueAy$)!6i@{!6hvC@^ZHLxv+MuznhBblOpfQ32Ti^Zh^{F+0#vEKUAmeAZ52`ZE?Neolhz5_PIqdqP zav<@b$^oW66>xvlP+g^A|7T?e_XEn{F*fH&WrrQA$_(nClt6tDhEH8e4SwND2bL&9 z#@_7rD1yf@4uycn;TrVbDjbO3sld?OssQS9F&vatNVxt|-r>boc~BqM;is>B!%sZgpb4La=CZZr&A_E%FOK9Sj zS)hMin&HMGX;5EILCQ*+VGFCYgXcvlP`|k$HA8B_8)GSj{Qr`mF~0?A(Qz!P{PH}f(v%;69n}=A2fsrG9<_gGT6Kl0QK)3Ue^nN z#&#a`iGs%<4b)fj8@w;&Z`k4h9*;VlFn6TP6bob|!%LRJPY8}RsO$Kwku4F0oOR_sh= z0gaXJ==sGA8l(CX)6cANB$D}nmJ0KU3GbK!zU^QF^})aF_hr&hkzo4M{)iDYwz0{t zoDnpZl_0{y2pU@ryt#m3j&(M}rMae{E-)B_`oRs)pnYJO|KR>_L&x8GaNk$!H>BUo z_ygSMW#In;>F)-;uWwlKroQ3yOK?Azq53hTkDG7@(!Z^_QqN#_p}yhlX-K~|^bn*^ zE4%~TpJm`!Ti*cc%Nj2P_hT8ROo8-ab=txG*M?se_29ni|4eYdwZS?H+-GH2=Lznw zGDKL^gZrwMYT$klA~Q! zO%GLp`-W~)!2QC8DXEY?p^_P-KlqNdssYp&{B;G=4|H1$=>uLYfb{?7+E#-5ek(aE zL1S7B->!iBd<`x0!Tmjkkj#n(P+u?A2;9$W*!c_6#|tBn7E0{7t>I-WrKZ*5CU!F{)rsgQnKuqwFE#-REH z++S<3T~q?@tIdmt^wZpAz=HUKSL%{PqP~WOy);eadQBcr1&-XcoAi#BkLC+(&A- z@C?#FQt8QL0QHS78G!pm3^%WU`$P>^72y6*!*{6+a9@ajFSsAX&=Lpk12u&H2lsy% zTIQ!U#O0?o2-rjVJ%8>(`aEtmkp9jG$yA2U7by+Dwn6$islkvwj?sH?|E3|aD;dw40qL{k@WzAtE9nd48bE!OvnG&!%G~4NJ_^IFNJ#&r`E?8fsBbc>2HY=ckmHR3 z^+_58=R*1;#X8a8zKGjya6hD>(-YhWVX(U%$?$k?WJ5|yB*S5?NQQqOApH*RT1cOx zha&>q-)Np34(@Bbmxc5*E-r`kF|-ZA{fmY_J3|{leG7LdNWX&X6u3{p;1LM!Pc$&x z2xb8FB~0SL{RoDqkHLM22BAzy|6$+TKv3U-;YA^&-!Snjq|dOs0@7bd{p}CxD>O{3 z1@{ve9R5T42t^Ix{sDsqqaV0$klYCF7ceL@`hxld3|S4}{s4o;e{Y7OeclXxwcvh0 zL(XqVAK+>Qr2T*Vt0x1f?eAIyZud9%zXP}V8=hr?+xraMPu;<7{eAI}c0R)`a2vnj zQZS@_Z+h01VPB_fgO(e(UEi>2AGl55aMldcp08Qw+@O=?%y3W@(vF`!2i%5d;1zZP zwci=UIvpE6J3BUP{|9Nee<}vI*&U9*0Jqm2%wz3AZFL9di{N&;!y6Y!8{KFJxP5*= zT-z4ZHg}ja7t$_2$ZrE~leaa3+v5k`eX;_##eXJ)+u;r?u7KO%4ZmH$?Qe%KTP#3r z?*o%nAnop3lfi9nhm%a^;P!T6p&6*H?XdVhxSj1V!57@dcF^1nXW`ann?q&*#W%MjF-cHndax1$~MHiFyG4s9}!_H$6XzQY_F{f5gQ!R_V- zt{6z0`NvUkd%0n*zHS4kt^9iixSiY}%%lTqBR4$F0=JJHiZ5${+Qtrht-$1l;aDz;_$m z=5=`C0B-L#bSzVDaE?@N_`nUBms2bRw{aPyuPK7txA(0SL2X-xg8ATf?SV7Q3ZOPE z!}oM>dv?M5({c-L*2*o|t`Ba~)dPA@B|&Y~gemUecB;drmEbli!%J=nQ2X@3&0KL%+w{QF^Wb)AgRddDO`33N z61Y9eVERP_)D}HZ77A{MI?UJxZi6nEB`yqVe?F+I5CXM5AGqEGw>uAfumra`8yaST z+nXQ0{^AF>HG`tT?M#DdyTNVD2ZyA=?aP3h)x4m#Wy7u8;C5xeacgj!^1_1I;Pxa# z#&0fATk?TyG`Jm^aCjHE4cQPW#R+OZIy|i85Llqeu^{>;xZOD8qy@OmsG&0h++GZ5 z`OXSzD+*i=1Gf_sB)5Uvh!zo|ETHz`k_jc?w&9$^m%;5qiBCr0Hlc#-Bt}qsaJB14 z22fjYXHEdP4G1DY?LhE6NcKNS+YhvMM)4b@y|>~Gq@4$v#{kV=faWc%FwR z{|$_F;BkJ?_&%tu1)4*eods!Mf!bD}H8$rSgWFT!wiIZ7b$tN1{nP*&cL%Mt@!kk& zFEPhL+DRK(t3l)Eptccc%?)Ur96UY_Y72qpVU@ce?VsJskaiDfoEtR04QlHw7pnk| zV}sTJ_~(GzHQ;gT(A|)>3}`;<2y+>D{24Uv3|fnGnWYpoz6@@waN0rIC~vlc+a{nj zIp8*l%3N?;1T;Sg8V3fC|ANMS&pd*(IY4U%Ky3}sTrX%G7c_n=ydTo8$dJhckI#bI z5}v9pji188jlXj~OEC;VJE3p9QTZX1B+9Oo?qw+Fy&0noe~XdDzY z{t2r4L2GwFOIgn7ifG7G_D1jR|Sn@f!08P#;rhetY@nr^%-bf z3bYOgG!6wCe*)EAi95k{7I=KgQyjcL0yK^U9zOz&8-dmYtv>;&kLp)L>Y=+mkopHS z?gLsI6ypu9Z$NboXgmirjsqIM0o5&_@fuK_0vewI*Cn8JLZERN(3%R+xXX`a;5q{| zz5=Q%K;tQ(Is!C)0YD8QvI6fy!#|Tn?d6R zpm74w_yDLZ2F=rg#{mRRK+0aw+9I1*;PMt!)`I46LH&48{~c7eg8J*Aembas4k}AQ z^Sc2PvcTmhsO$vww?X}EQ2!cKR)Xe!LH%e@`3UMagZj&$eln;$1eJxLG7z*+jKS6s zwBO#LVXuPJhd2RVkeI^qN}&r&ud~+7NMZt)lT}SoV7l7TGH|2I^#GhC=*|1rT}4P)BuTmRkt7#TXwG5s*p&t|wW z^*g)C<9+}1uLv+aI4|&{<9P$q^dGDL$EC9{DEwvlp?9Z`A%OQI`<}9pe+f@z88WWR z{>bwkDI7lXiQ_8$}LHZfSNdcppt_toDStMwRWbn5+(IHSUn*eU+MHcW&; zz=He7AE9du7WwzscX&7c%}{h^xN*zr2gmbIEbH_){ktHl%)sEn|6}{Kp9~k`FR^d9 zAn~`rA)4XC-l!iJcI{;?P_h0uZ3XIQRdFBQX~1-cUCEbf~@?H zV+)fRCE^ydYXm&~eb9L)!vpp0KNMnFIX>*q|8wxx0)_<(RDZlV*2Y+&K7rl9wDC9h z#`_E_=G^&l;LBc)0`YCX^D?h8FdWqR(R6kt;|7yz_8E30pJDXqNnw8xwD;Gv=Vpu--W&W>h?3>n5GeXfWMeGjjH@<34wSrS zR50~nuQ(C=>)h0I#)xV0KNXw~b1_uw|5W(8iE+aT*B=M?g_s1)jo4rO|NryH#Mz7; zLKA;B2qbY|aIyJOFh_(*BFz6sLZb;2$1E}S4zVRa@0`BGxWM`7&w$vU+#B+2zAJ<_ zGd-w@{PE^k7}JfkpKKpAynZ?u@iJ+!|M{tKqJ!taA%kxQhyOD**rfdUa<_shV%aUW z4MCrNIBfP}3a~W&wc#^AuY<7E*Pezh<`0wef0P`a#nh0ri_K!goF5$4-AoKy3VvN^ z@8f-7_w#dyqzX$xQ}qvt(mhNMmds$Yi1z%Uv+W$ykAQW*3QSq}4rrYJbVBef3j=${ zj}PzfGF4QRvN`1a`2L4al=;Q8x4%AYDBx>2Fz4fryREDf6sG=IV)&m);6(u20j5>o zzv#y?&+yUz?Xc}KpTUo$4-L=#*aFTi`mw-Vf%(QiEj9*&xbGQEtC$nQi+(q->+&m{ zQhG1YqruL=zww8{e+T9VCz#nB_(i|#0HeM^Y;WVx{F&u@lZ2l)?pOn$TB0v{)b>-ir?PBb!qSiX_fz`FaJz=k<2 z1v8!hFdY2D-@xYf`oU9at{>+2e_T1bkh$Pm8|#BjUf%?QKe246=>Fr7tShjf`rAu~ zdMj>?o$r5yR2^iV@H&dM!HDFzj9W;=!gYo`~ZNKhHdV!2IBg zF6)QWm%avwEn!vhmHq1=lrQk$PRMhE&NaLNi9$aa7#LUt7#LVTOq>lmcz~_uN!niq zh6aHLZ&;o&Ffj0Uw5t5{I3ve$K>8xfhpFjb8&1Ts)vVv}cY$Y{00YbRCl44>1r`{Y z|4eYRWvK{T$g<$M*;j?&y=)xyzy30OY!q-X&3UYlbz4v%-RtLp>}ZyR{RJ!=rg44^ zXq01@Q+D~6z*sEsV7ls~2F_&R3dOje0#=nQ1*!Hd7dG7gVqn_H{wk;UUqer%fP(dt z2MZSb7D-4b`suNL8q1AvUX}&UJHJ!}JZ1l&d+lGsN>hOby_NSFo-7gLP-_3V%7(fFI?~8ZwS}8v*0{~ z%#QREKMihjunI)kGcQnd{_?=Pk#n)rhyM;I9QYgV3EW;V_l2y2%Ke`ga#dJ$c5*Q@ ztkL_jp!XH$)V0P87mQx>IUHxXb>P4~`3q6seqNYu&uVb=D$|6gvR@XIhHyEymNI;Z z=;32vV!g>Q`;j6C7vC?9#3)vuz6DGIR|LKUJl@A;zi=zVgccP(hEky$46UD)f9R|I zny|ZsHAOX>=|DC67lo~w+}m${W_ZB7h4%of-t_~A1k^5^viqg5vXAx6EK??f`;1=% zPEFyy!(qVapkvM3&>eBjVTz?j!j14>3)EMD&dC6swep35fq~}*XBOj!h+RAk*C$`l^T~1te<(HVE;e{6*m{`z{Qhybf~`7Il>w9v6@0hy zGra%H^x_jg`+<#DFETWC*`El={5@fQFPqhhPya#bxnaGOz=a3W%n?7s*bdCUaFL%f0dzF2UoPGH7FGv*m0vsoFe9$sW{NpNwPvgG%N8C%&_IQ0Jq z<*x&E4+SE=`ZAw5cZa26C;O#_-ji-Cb{_hjaP|aS>&m$QpnU4E)=98~DT(>T1{oFx zZEw>@r{%i17OdDpwEqCkso&OlEF; zGWkD)a^qEop9*(O|ap`Teo@7h0x-{IF9ctazvFzo;H z;)5T%j`^RzpmP4eM0SymUmeUvzoh;hP<6T95LO$VaN_=-1%|Qg4vbg-G8n{tclaAB za^zVZ^PUSye-C)N-eA}~Bi7*@!{3biS?mH5>;D=st@_SzVWG&E#f8izrtAJN{ENET zz`HD-ML_8QH9RoUm`z zuLDbk?lMfyPnA$=|66f*Hv5W5)xS4_KK)qWvsJXgT#lI|kn>kVed#@h4y$wy%awm6 znwPPg%w+p}Lc{B4!`V-wb4-|+4Q}QBbdY*=pP}$m#)7)je}Amp!2Tlj<(~?%B|jBR zbj1uhA2TgDdE>`}1NjddlBQ+(e0cjezQ2rw}GV#rGoyAyPXsiDj3N5clz z#|*8iIS$?lOaa0!-y4kLpEZ1E%nvgP`zK(3nLXfi%O8tIx!(?%-^6k@ z1Ta0Ae&$;Ox8e(i!@dPdmX-e!;%~86+{pivVA}Xw!CyiA#0)hih1A$@4-US6$*``m zFf4A)zXy*VuwPgh^CuzT>F@hOYM? zgUw!l9xTZe5Bh$Fu|Q}CEFwpH`LL(32Guzy($1rtTS95B52yW!FC@=uO;{#$JL&))N%;SbZPDgO^B z{1ca-X3D^z%KGIC+l#*qKR%ZK{{J6z?j5L)^5;E-Edk;%Ffe>s0pWu#_yP4-4#a{E z2dZN_Aj1FXpTlp?0}`f3{yLP19oW*g><`0B^#d9*oxd9*><%2@%K3HRK;(f9>Ha?% z6sitLcpLv{D4KsD;H3EXhHWPgO!)QZE5pkl2OK^<`oh4fdr;uy$X$N6i6ro|?JC5rqbUmj_r@9%(3Id(luNc65Q$zh?~<9Y-11e>`pA{eLv! z(&r}*8db*8HZhow-_`YpJ}*L zebd2u;#mg9nKusDI-hGW+j*Tq@#ndQiFd9sT-$V>L6P~|fq;Sw2fpcCb!afWctAPo zN<-MUiwxVlE;Ah7cL|KQcU=aFf#g7H8oudV1?d6l1(^XhOY!G92lJiR8*H7=f$Rd= z39=jH29R402w0v0xvhbD@@bG;9e6&TVpybd7vu+!UqF5W`3>YpkY7Q52Kk-An(YKA zEWlxM@#7?lJK+Y3;bgTlVS+~LRpP+SP# zfyB-H8gN{J;>_WM=Ua#8r@?UviqnLq{P*BEj%xV;igShZSsy`ZKmn8%*wesi1C&NK zfYQp#AKn*LD{$qZ7@@T80dr2oa&$*dsr9!%fB1~UJ} zmNV=i`vS~faDdYE16F1(kb44nWw}9VdV-l556Ha_a{PEfY5Kv8R6dY@7?xG@gZ#%( zH$edGU+yJ>ApajQ-zEe~(+=;C34_9Cf%G*IP?|ol;;|?wO(!(G7h|w+IKt5PQydh& z40{)K0u;Xv zN#7Je@qNJPm14t`ohKV&Z!3Y)1H;9W$_IEpo^q(#ssc{auJcqu>4!nNMGcgm8vduL zH-OUgNjD8pdTYp2)&!+#hWmds8Ln?S@4$Ik%ORlPLc^V<+Tir+QL5trO4Fe6l*9Wj z9azb!*RZ|o@`3tudf+s@zF!}d{u?xX4ZvyoKARyZO*b6cW5{5>^ZJ1!c}5KkGjA~5 zkTGVsTYb~v{V`)unr8T$V**Ok2R`$eGU%J#X*j;d6r85B-ONB~+TqG=vjcNE?}N`^ zWMFu}aP+6S!owdA4wyArfYY=Co8<#gn!es@`C#YA#|@tttia_#d$|?3eCT~?#o+w! znZxfeYfzeIII-UvoTlF>+kn$_LbDC1ykU^JX9FsK7$i+>L23Gcf2%F1d}`Qr(H4}Z z9fBq8z~z@nj2$>l|Cnh9O4AI#FWG_0I|gxfdr+Eg@HDem`1R*&LvMmTC`~gwXtf8G zmk##J>_KU|VfjJ(2(Fx84B|KJLFMa#?w9r=?aTfgVEJbM#N^0dhsMA5Ui^i^`xsw|ezW#j8aOq=X!;_;g8MvaF6edl6&cJ`B zNkKjNDZ_R5=7h5*j~gP-HZyGDc*xKl)55@V|6W7F*A|9X+wU-(o8Ia$aq=yO6V7c7 zibXdV?0>c$I1zk}L48Mi!#ayA4EYTm4h)Ky8aRVG8J_Z7V0fz2<Lhf9^f7=<(5pNx%CJM7=oNP|7pG;qb?U4I*k28UFv@ z-w^IGiNQvAAA?r$V#lqt<-U^3d+P~A3%A-8BfgVU$E49Yv#GOS6R&)~$ireWcO1r2W_S2Zvs zFKTe#vVvjlo5c)yqRScDYL|jBh`sjBVvrn24FgE+!UqdLdckIZ%yRlPw;``+Jp;%N zkX;}a3E;2*g$XEZKw$(5D^Qp%d43WUh7PUuvFXzoThF0>_G7e8gB-r z>4qb396|Bjkb1?LL9=)=18CndC`~V#?A{>xXllckEKhKn?zZs;r5^@24qs4uV)%d7 zkD**?Hh6t8D81cv3j(Lo%kxEVa=Px3{_20p!D1j zEF8m-FS@+p|D0HGng;C;d>grnA$V2-I8E>4O#zbEY_LpY z*!6uAcwIdxfBm|d0ZP*i&ty^&K3pzkX!~=v;oI6W zP?`qqiwCFao9-3hG<}e*5}c+%^Ln82$0(z!0hFfab5(=VG-w|tC`~skGpYfXUz$5= zz-juUaVcDAwa!#GYm!Gd0qz~4C)ARxEdQh4MofiNuKmD8QH-OT# z-iCTm`3gE`Km(MfIp5Tu$n5yt!1TL*irkUEpt%B2A;W9tI1)JD za@KQ+aIfL^;CaE*&1=MWhp&_0O5mNqQo#fvS>b!ai$pR+jl}+mofBUmQ6lLhr7F!N z^HAoH>@v9?`4WXVMQu1|&xrStkE58u8kc+I6*`YfbA4>sHm>tK+M;s!yzMsb5^b zxBhbd)A~>Kzw7_kb1?WZ++tYGc#uhoWeaN``!dd7+--cGf({~S;ya{F!!)Cz#j(rP9 zGiMZ+CAT7vATI|WJ3pU*jG&>AuW+HrEYZ_qOcM5zO;V?&C1rEvj>#)4wkf?;j#NFN zW}~rLQ%`%fj*i|2eKW&-MxG{DO_R+(Su|M*+bpp)vp?w&?exaE)|J*xb+7C6>$B?T z)E};YSpTK|U%fEHMuyjndzn?)q&R2rOc7ueeIO|zzeuG(tJq++*&Q2Y=M>K#|NhX} z=;sOYX}_|v^V5r;mffm!su8L4tAA6^!l1)Y&G3<-k1>$RirJH;mh~!I0LNR-HQe32 zo%~A$?+F`;Es#)^J|tVBV5uyi_FdzR_B*{_hJ2=47GBo5c9R^px?FYt=*8+M7$_XV z5&k~%SWI`kZPKlj`1G@xiaAkvWd$Wg!6iav>&vw&o2s@|AFWweTUf_e-%@|M{&&3} z!$GD#_BOsW@hghiy1Oi0-KGR-$IZ;BEG(?BtKC>{;NZ{Lx!@}UPq!~)0@rrNKUpSB z7ITg>DNHP4_E=)hqERiuTJTnkZNWJzr3`IH&K4*;_RH8r^LO48VnaS{A%1nj_b7nF;STK{}!IGH_ z54Ox?c(7w8!-JhO86NDN$?)LdOoj(XXEG=~sHWp%FI3T=W=1frrh6Cab#>P?( z#-Abg?|}>f9exg_&zv~}G7mI#!Jm+p20CL}{=k_t8VAmt0bT3>Ya2sV(~bgPq{+a* z;IqS#Ibuf_I|IXQo(26z!U<^;r5aklD;;>9qSG+*CgLIr+BpSmGR!?60*^5L2+Uw( zV0go&5aTc4kTyw-L4K=jL+f_chM6<4WWz}z!uW(d=QnW?M{491)f&g|iB_|GJq zFq2iXVdfEe1_lRpIyePv1kIaRv`<_NK^c4sJG_Jz%$y0zZ(#MbCSdN7Yn5YEX`RmW;eQs(g|9Q% z64DeoKLoPy1nh9+Uoi6~=$-^xI|Xb$%ss}&pBYSyjhR5_*3XzZ6Len@yMeJWmx1wT z9?%`4V8wJG8bG%xMKUljoMK>LNM~d?V8Fz1K%JSv!JCEQz-(3q2T67Yhr=8U4YRly z9Om&bFr4ROXwVU4VAw9q;E*TA;1DFqz>qA%(6B(Bfq`3@!C{da14Eh?!+|h828R+O z28VrS3=XE&36sBUCnkl4x4V0Mtfq46Yx!;gy$ z2WH=5Xvlud;E?`?p`rgP1H+Sl3=Jt9j0}Q8j0~@&84tWuWjr8nz<8j>itzxeE8~G( z{)`7^M=>_6NM&?*Sis2OR>SCUt(~!9(qzVls`-o#eXAJ{oZZgIV0nb`!1)V|43q9M z9;koC=rHp;qr*KGrUpMDCWlw@Obr`#nHZK>Gcg?UWMbfsU~;HWV>%#L%GB_(naSZk z=njlUOb5I-G95T{fTAXk~~K!z0?Lr)+Z z!;K6!2cHJE123ktHLP9F)-dZh+ky4>*$%w<&c+ZVz|L@AgPmcDBYQ(Z6gxv{F+0P; z9`*xYma-qn-_PzKbd%lT&L{SUvpgIO&(t^$s5){u^h9$oNR@FMI5&aAVbyAmhBe1H z8m>O%a8Uir(J)(r)4{@ov*EWtC&SZh&I4cCIUBT=a2{wozzCRcMixXt2b zklV@KAa#Sg!TLM*fd(<2hF7LM2P#5&9JEV$4lqvTarm=^he7%(k3;NN9*4uCybiu* zya#@T@g6u`&g*bs1~0>noxBXfw|N~3|L{6|lI3fdX3uvZHj%Hvy_wG;WGSCR^Km|g zt1tN+JbCyV?(6Y8%n0OXC@$eYkUyQjp>G#I!}+`X4Tg*Y4O>+N7@|D{7?g4Z9JnS3 zFo@Xku) zfLM}9Lu{u=!=Vi#4sJI@4m|%aa$vc-=z&&$(F2X;q7Ad>iypXiT=anY2hoOE5@HTo zj$#ehGsO-poFwMZxm(Pk_la1;I$rUHH)i4o+!DkO?Clh12;3~*z;IWb;S8I^fz1XI z4cnt67_PTSFbJ)eIFNBu;=nCtNrntP$pZqBk_}gyB^@@elRU8Irli9`7Ac1h`ce&+ z(NYd`+oT$#H%T4Xd{@dLjZ?b8$W;1(M545VM6a}i;ZA9Wl&8`T8w6z7BvM1>rjP;>&*%dU7Hjdf*&dz zFceT^P_tKLFvwG6@Sm&5&~iqx;p}fk1|4lBh6Pbd4jNrb4M%q>F_gblYOs}5ZV>lW zZeXiacHmg4+#q*Txxs@|g`v$-rQv#}3WLoo6^1RRR2uAlt2ErvRz1)Yqk6!)))eWKRzQ&hbn&RxCXYK1yO>?(DJZ@1MC%;(i; zh_cscP%YG8U|g)h@b-#^!%H?zhHn;{4noED?wH+L%X*UR+)MohfTf5=Do{q!qL>-1FQ*<1DAJ=h^|E<#y zpr?DFKT)^g_7vR)lM}iJX8zV?;L+D(=t|OS5S^yiu;!#*ga2PWhW`fo2X?0DA844N z-wCLpI2$vlRv0sEUt`P=_|TZ)v#5!~JTDW6zM$S~%!0ws6S3VR2vsujPRsPL>B;D=ZtPt+i};^T@Kn zO~R^SiLVs{d$ZMnoE=sS*WX$(xF}mQY>lu!pwVaTu;8#YgVay!1Jm?u4v3}LFwB@~ z!ytR!reQIQZG(=Lt;6~e&xk2NNGs6-^mj;<|7luha zE(|P(TpEhMyD;3>acyu*a&1^O-Iam+tSdu0lN-Z+b2kRzT(^eAMQ#miuDdaO;&Ep% zc5-jXD|csDy2hR1+C%pS262xDH6M=#w?+?!#BCl8C9gdiniM=6Izv4hy1G0YTK0Q3 zlz;JLNYV6S@Qm|fP@n9@@b|b^!|6X>4U-JL8G_Qh8#rfsH|#j?-4M^>!|>0-hha*t z4};<&pN6H^d>RzEeH$j(`!f6~_GO4(;oGp`j&H*s0Y3(NSHFhxO23AsYyBEdKJ;sN zBlFWRR8%VyFrXYBClFqzM&0P4WSKdHia_qKMie25)W%w>KVpxt2&I~ z-`X$+p$B0M;zHpJ+%Dk^?@PlQ4lNI7XuBECV8I>HaMLEDAu}(c;l=z2hOmnf4V#!E z8U7hZGMJ}EGQ>}dWGFcv*--u?k|9$wioqi)szIbXs^Q%3D2B2(Q4CzN(G1+SAIDp!HZ&?@|B-j}kR&X*j%;8~R_{PuRutk`m;kr13L%a;b0dGYHhPi4C z48b}K4Y@`P4R0(M94^>1G)TBJI2`q3aJUx6aKJmBp+Pl+;XraB0|Q$%LjzAM14DT~ zLxbxq28N2I3=Vu785%hDGBl)}WMI&^#^B)ln1SKi2L^^i{}>tsc^Ms!NHa3r(qd!? zwqj(^_hLMd8^!3rpUv1HT*K&4)yvr6JfD#vePuzSUL;L~452M!^o zhI%!oh6rn>hDiZT40>ry4O%r!3>}l08r)VgHKZP3a(H^3$>HdGrUR@T%nZvEm>ZT^ zGBdCTGaopX!|d>^jhP{JAv1&X9%hDy>&y%?pP3uP_*okAwOJU{Jy;rSQdt-_G_g1| zE?{xku#cs|<}M3^+8>q!Int~S0@kbz0@17txz(%(ROhfBu-ePou=*Y=Lj?odf%!^o z49c!-42&6U3|8H22hOfzYuJ5>t%3PFTf<-^j*$*t~W_MV#k-dTE20O#i zf9wv|R5={%eK{ByN;w)N=5jQ29OZEEf5*X)E6&OA(1G*7>MTx&GgCMZIPK>=!1s!i z!9bMDVVMJ$LtzdV!^9a}4J=2w9L{{?YIrWk%@F3peL%d5+d*dqcf;gs+y{JEc^D#0 zco?=O^Ef0=<~fjbnCHNz&pZvmD!dLZp}Y*OZM+SlJ9rtszT|CCmf<_Fz>m)%r;+bK z>lQwSx6kF<2R1zv zbI6bvXNZdxXP7cuyn*wUc*8yk35HGK5)MzMNgN2dCc(fgCfV>VRFXk_nxsR`HAx0p zaVdsh;ZhAkGo={PZb=>ZEG^BjCsvwa-+buw&9+=+yRFcxrXZ}emX_$6Tg`q@UwV|d!^}xEFstsJsY7G58Y7I8i)EWdIs5S6usWTXrs58{= zQ)hU`p~27^tij+oPlG|}rN#j@6U~NzdQFD8r!*OO#k3gaCu%hWuhlxB`BUqFf~$6e z#YAm~g1g!cCp2{$?8|f-t{&29=;YUJh>p=^@Ls9g5dKZqp}|?N;phat2Gx6d3=6gO z9n32A8=f80Kd@fJpkY#yK|}8b1BZqG3>eP%7&7q9Haw8_(vabrxzT~BHY0|wSBwrU zRyID6R%F~@d(fCcL%`&KO1ue!$vTsU(7z@J+I>tLPR}-Nkb7;~&}3!S@U_#7q2i_) z1Ba$L!}1FAhM*JX4BQeH4j0lb4lLYm;ZVnJ>5vv~=@7Bp(jnx#B}0_E6+`B9D~5*W zRtM&rTRR+Uw{G}y-P%Dz!-gTb!iHh-37du&61EIRnYIn}J8c~sk z`pd4tz}w!TXSTh=%h&b|t~L%03wscY z4A%V44Yl#k4ZGJnH+=f<+@KQR(%`qig`wz!3q!AiE5m{bt_`amxH7CZaAR21;MUN8 z!L6ZC!JWagz@0(lfP2GbevgLMc#j6H^&Sm}{&_Tb`*}7To9o$N_|}u5*T#$CX17;^ z@NKUKTP<&fuu5-+m=oR%0pdOl25CMF|F-xrY-jduhz{~)c)h@vA@#j4!%15|2C*K$ z2A^Ag3^^M948>*s4M|7*87zbX7{0~_Fw9sRz@Yd$prOwrkm2FfKn97&fegk5K@5hq zK@5VYf*7ud1v6A72Qx5i2yRIK6U?x|Bc$Q_l#qt|4?-A@>4Y|PSA;U?9|>jHz#rDY z7ahjnwJeMw;bT}suuV9FQhRvA>5JhE{xT5_Ytteao^FU}`1&iN;hsw*!-Bp@2Fn|f z3@a6*7(Qf0G4O4PYGC*q)o{W!x*@GEn&IZPXa;%t7zWGqmdhrceCGib@yW$xb7!nv7ToV{hcO^7DIiJ9A zN+hwNIx?~0``knZ`$vflfoe$%x>-pLm)0gRIDJfNs4_`zs4h=taM_jIaOF>OgN}Vl zgI8k;gTdhxhTANu3_fnD42|un3^gZG8LT~ z$}EPDPqG?{6|x&PMrSjunU>9vcrlydB6kkMAJ-g)hxIuO^*eJKu7ApDc%hxkusJ1{ z!EA0WL&4SDh9us+1|HYEhTNLGhL+8F48gDR7_KYiGYE#~GyLz#XIOkFpW)BF}SWOV|a48j6wHr8H0ja zIm2$h@`it9r7=s{kuwrDuF5n38N~8=-{dbr;;j$vs0=Xes8H_ zID4h4!Rbp?LzHkegQ!t8LvcVgLvda;gIG^BL)6M@2FGL73@0B|H+=e6&9G0Zra{ZB zhQT7RhT&OuO@nD$O@r!!8iuVqYZ{(js$tmnx`siWrIx{5rk3HkaV>+HcP)czQZ2*g zidu#TeYFg0meewc@2YK3IA7av;&Ckl|Bu>+&)jtlW%6|l(~asF!d&YZHiy?Wtj(-z zaILOmsP3s_@S9u5uy1W$!|AKXJB>KpX3>lsd$);BOW)HB@ZtY`3;T+a|Pr@rC$l6nUFwe<{g zTk9ES?5Ss1ceuVG{#1R#nhW&|Q?J!CNZhGsFn?Ij@bPIqgZr!c2J?6I42M6~Gramz z->~L;Jp}=pbD*=2=fKu?JO`8lcpJ`d;ytiKjIZHN zHQxdAM|=(^JoyiFZ{l~Tml0@K&@SNc=CeRULZYCY4oP1{7>?wKIv70_ZCDv6c0lc>7{l@q@dN4?#Tl0RNgR+lE5Xq1BkAz= zjAVnopHxHr1*roogQXpIU6*E9A0xxi@<^t^EK`=@&6py#E;aO#GVgKUN}gX#}uhPxdq431K&4gPCX8<_3Y7@{tzHTb2e zH{AWDet>0y2E%?;%?8drnhp1Zv>5DPX*DP{X*aY>=`dt&)@eB6qsuVunQp_)2EB%E zY5j&}+w>VUgA5w@-WfOqbs08%R5NOLe%PqNFwxlI)IVc}^>a)dZd;i;c;7T__+4(s z@IuU-foGdJLrSOx!`m+w4vVH(Hq@I~IW%6eVpvjQ&G1;nhQWHPjl=R#+XE`!Y!9rP zX2;-UZtrmGx_v`Yg+l{}q+`SMosJALQBDmLe>pLHndQvjVC}+Cblat&rP`IDMB0tP zZns;*-6;14zhCYQy)!)+rdfD0q+a)A_*&}4;3DGP;Iqk_fhWMHq3*2@!~8B^hAeeI zhTDhz8a~APGc5h>&+v6xK*MdrK!)%$fecA$K@30s2Q`S#3})DE7{c)2WC%l3VrawM zAE69-{b39Ss^JX_cZE09`bRJvcpSlyRvy`q%@xIPc1~17n_e`-)cw&6-~3}57T=Fy zn4K5faO+PjLrhm3gRFQwgY@EfhCsc9hP^uy7^0mL8PrcFGROxfG1%QoVrWiCW_a;5 znIStXg@N;3O2fW_RECaEsSHWQX$;<<(;DoG(itp2q%&CNW-wU2%wVuc$!svbm&u?O zp2fg_K8xX%Yc|7{-PsM<200AeOL7<{i{&!>Z_j1$`H{;|k)Fp;e>IOG-YK6!Y+XLX z0*Qi#KaB+p>aPkIWCIHs?rtk&NRcjLSYKDfu;)QhLx*EAgYd#)hKT>g4WTh53|u=( z7z%|-8@jVg8A1=2Hk_6$V|bTW#<25H8H0{!d4qFWIm5rL(dIq1B z^$aXK>lw6;*E8(DT;Fi;UOj`+i+Tou5A_T&-|87ef7dfu|Ep&>_rIPFQ!JxajE2By z2#kinpbUWnZoSM1CMGY7zARa9b&cR9QdCr zG?euzGklO&Yj`$Oqv6sotphfWx()lX^$##q8a5nAH*Pp%W_p0_sTo6Bp#{UYTb2#i z6|5PYoNNv>+1WDu6R|s>f7Fg)wV%C%^hWyw&Ts5NYmyp1{I@@F@V`An$$xtX_W$+` z)&J}pF8sA`VEb$DAp6JOLG-u%fww>H8~|1Pq;LALF2cB8> z46IY_8SeMnADG!?&tTSS@36Vv{(xYWy+dG$Jws8RJwr)`y+e4CeS>t2J;T9Jdj=1G zdxi}j_6>Xrv?GLe6zrDj}cKZem273qlA9fAq zAM6+eU)V96xo_8yaow)r**QA~w_|n;?R)JUR&KF#Si9PeVe%q7hp3r$2bd<>4(GwRI?eWy>IU-}b<=%eD=ICu|ww_Shci*#FaMsuMzu~#@jf3|`8;7}%Z4O+#YIESl zahrxmJ8c^Ft+rvPoomA&*KgCXu)&6bqsWFKFxjS|CdB4Im#fWzYBQSy{^~XkY!WsH z=5yFE$o#ZssD5e9u=l1l!=sbd2VU;9K5%8Fb;F{W)(yd()(y`qtPjLxSTpPlw{H06 zX6+zuX6+!YYTdvjV$E=t$@)OmM=J)N2UZ6f&RHF}vB!!*WVIE8@l2}&rtMY?GNo1r zo+ep2Ob)PeP_eUOn5k{m@KM6*fG(RAgWqS%1Az}L4_KbHJixlk(qZc|O9s!$mIn^h zTQqv21YTusrblvxURd`xXqsr!5#tw^RS z^8Lnm1HSnIG84Y|ilfjakE&t7ZqD?=xdKu-xoG?F2Ih#Y!`VRf%Q| z5?*EvIYwp<%cRT>9Az?NIQ`1hVcR8BhxT2j4t9%78E$u)9*8Y8Z8#QT+92v++Tf*b zdLWh0)FJ(=34{L~69(DCCJh%?nmFW4FgftH%;Z35tck-CXA_5;nkEci`Ar(We>HA+ zaND?H!$D(*^yS73ti8quI*W`OzJ?n+c-R^{G$|Q3EM_-8u=KCNOhbpYK86ei z28Il?g$)_reKTm#yk)@PyVrmra)E(^Z?nMx%`^jt_Z|iebF~c`jQI>4Hhs`%kh-jY zAZx2W!;8!krcHypLqKd?w%pCOY`zd_=$p2Nl?dJV?Q^cd#1>ot7N&^uu0 zrPmOtt#=@cM~@-xt!{(YIo$&i>vb6}_Ukef7w9_t571>OHPm&uDyZ8a|4HXS@Fg9G zqD?vs)su7_@``j0cn9e)h#2WK923+zko-~m!0QXz4sjc_8+P|=A7IYcW-#~DW(d{Q zW{Bg_b_jZ{b-?hHmcySFS`3@owH$)ev=|<^XfZ@6YaQ6lsC9trfo6m2K23+5IhqIR zsx%pDBQzP(%`_QoMKl}!f7EDLdtSrAW32|m`7R9xrwomTg{~S5Zx4K{imG;gPO-!(=Y?2BYU{4*L$PIhZd{J21CK&EaE&nuC$4+JOW? zwT7Cvstj!>RUK-Vsxl-ssvauIVe{v zIkbl=9k`{hbU>C%i6P*LqC?R>#fIh?iVZDAiU&%46dl6U6dBYR6dRu3RA`v7S;4`w zSHa;_nu3G3g95`|NreY;pXD10&&V&>vQ%E-MV%Wz;a=jS%&G6vJ7txWe=Ee$tL7Il2Mqo zOXk7$NiqkHXURM`=_I4DPfF&%l26hPYEMZgcrKD|V6T#H*bykr5Thxb@QFcsLG=x( z2jACAIi$BsHJpr-VvskJdXUa5rLg3Q^PIPyC*zALMZfF37nrz>u^>Ai=*= z;DJe;fP;{+z=P-P0tH*|@Gq#|$S+{k#{b|$6o0}3ef|Ou7Jh}7H~2O*t>rTiZQ`4- zAdK&UiZ)-vqW`=Gl2>>QI#=*6_*BE25E{sPVWTSV1@>P&1>xs-9xPbIWALPmr$Eu0 z=R$-$k3rXG?h9Lwb8omkoBP4VCvyacpA_7;IJ|0hq>&W3yN=Zd~jLMVIb7Zp>R8lLt%jyhd|;# zb_cmj>@%(}W!LDfWY@6wWuNd?fxTnK7d8!t6Kn-fX0vs)=Cf5OJF{i%6JtvVd&OGt zdN1pN+KH?Iys4}Kvn*H-sPM2JSaY8x!DutfhOKQZH_W0~ZfwqLzha#5b1x%H@TA!8H6j&rRH^GqTcqGstJ+JuMx+dFXlw{N)g*ZzRQAA5(- zKkW~Aez$K>`C{MD{K5V}+8cX@bI6JyWt#NXawp_4ts6BB!f zHEQ+_zr^hw&T-f?X#BKe;CN~0kaxrGK-6)&hO=Ak7>+Ntb8w$%*Wg!Y*KjAx?!d<| zJBL0eyM|4=b_{V6b`2Am><;+6v2~bm)s`V$45R%o{cb4(_pGC|zK~u({c$p*qdR;k<{9!#XV+21yTqg_aD_UX~0+N|p{%zbqO;E?P7wtgv9Hud_IiA7XLfv!;au z_kZ&PTQ8e8d|7VZaJ<_5fS$j(gSL{n!`?4u4Ns1l9auQSjNxmhS;KuRvxWq2Glt6B zrVW~_O&N-+Ob-Nknl_vfH+8uG)TE(%vkAkc1`~$Oz9tQNQYH?r&x{?uZ!~srtu;QN z?_qpkn~<@??K?&cbC(%4{K+?J_+??#FrCrJ;qpmChV>H-8?+(~54b599$u`o zfFY^az=6fmz`^sMK7-+5{f0g5`VMcr^%)NE>mRVVtj7>OP49qIq#i@7w4TGXySfg3 z^K}obP0&5CRZ+Jg?U9bdfkiqEhm&*;6e#I5oOr0+aC(9Efy#L8hAXn#4YzM=IrPue zV)z)Q)xaR4)v)h^<^kab zUY()lh8n}fiE0edUTO@tnbaBtcdIh|FH&V#qNRF(;gO1i*i03Mr~WDqxoj#78}=wS ztSwS@NYhYexP4d2foHN(!!LKGhGl;g8w55gHdv-A9#E82JaF=iLW5C*fsNRDV1&bsVci*>NOdKUu`lC>gF;E za?hm~+?ytSAk$6S;lNj^ghxxH7%m1&E$CsAVi4OX*^nDA`Cu}y*85C~_D5y6HEa24<*l^`4 zzd~(2e*?QFe?!S7z6VFD`4oPt@CgW=<8=@y=S}z`&nvM11P?=DA zbF_bCJMeP`+lF`twi!F0v;JW3XI^H-&ML3O8eq~m11{bWtdF^yPHMBX?LTB z&sACsk69HPZU~D#2-(kRvEj$>2cN>u)`#~e%pjybT~pJF(^ zH2 zq&S9-US|ddUL%J4-s%h?j};gSKg%#kuuC!6tBNyRUn9&=7s1bvAj!obBF4fX*!B1S zl%wDNuM_$3|L>uf{}*#T`Tt4!{{N#wxBo9?xba`>+139`_g?w$Uv}mH*S}Z(7usC= zKSTP)|D2{<|AV9N{^#p|@c#hklmC3%p8xM^eEmNv;{E>w&Cmb)9)0`&tmN1K;ER9% z$Gu@-2;9xgP+-o+pcKu)ut z!|>@LH$%upE{32foD9N791JHnvN5E{urjb$Gc&~AU}U&u$H1^>=fD4o!GHf>75VeO zjP3V-YrS9pllp)D*VO*`fA#+#|Ft=P{!e!N`JZp$&;Nb$zy5b@`SpKh`0xMc8UOs( zS^MYziO|3Q|NZ#;UvApJ|AD&y|G(S+|G&9E14I8E1_tj8Mh3P|j0^|LnHXxnF)^IZ zWM{@OkamTE!Q7saA!jio!_A+J416|B4BJzf7%~c&81}?6G3?Q0VwnAykzqv( zBg0a0Muxa03=Fv`%?!Vyelh&}`;2kPA2;R=QR1u|I$`V|idnceT(sg<_~9t{VAg)o z1BOMC4iglm7u3I%WYCTfRcMdmWnoWaV(5wbdSF$~^8gv1fLk#~n*d*{hD4!(laI;SJz`hdgh8P=NhsToI4U_k) zHsqMdF$As^ZJ3_I+rX8@R`92maY1k2zYLE3e{S%$|CSIv`D=k-&aW9uVt&mq?D+LV z{r)cw<>22PUN?RVgr@wN5c>Yl2j=3x7t~(=z40mJACt-Ye-^ub{_BW0{eP-0`M;`I z+yD7|^Z(!M+VJ12c+dYE9Y_9Go1FUZI`7>7i<2(>U$p4j|8mjW|5V;Yv_rHGQpZ{X%zyIGY|Mh?4>Yx8LfBpEsHSWiMk89um?@apse>?m4 z|3A)r`(L~3+yAFGzx~fL`u_jl$?yL+E&TD{di&4+QB1%8Tb2L$&&m4lzv0aP|L@8% zGAwLjVhGyA%#gZ(g(2OUm7#nFE5qf5tPG+VtPBUgvoI7SvM{XP#>_C0lbK<2CKJP} z$BYb*>KPdhIWRKZR%T>~Rbph&GGt^(cV=Yx=f%iSYR$+{#Kp)Uv5A4 z0jmH1&(UCD_!+#L!FS_9290g!7>Zv#VrYK%kKs?GGUJMh07fmvHb$1j!;ChuY)l{i zcrz_{(a-e4{tVNKQ$LyJ?B!>c&}LzlIB}XOXF(K`#;V1PA6Cs|c)+Fi-zFyT?*!lX zzb@>0^j#rl`R4~JuiiR5PkFAO?Dvpi>h(Je_XKV`Xzac7fZ6g9Ls!P@3EkVjU%0Bq z#xN;Elwl343d7<~1BOp)EgMcW*fq>-v}4HGV99W=*MQ+9w+h3K0?{AphHMPVN4_WI zl)r9}_j+`|_rjfqgQ~Y1&c40VV37LofmzLS2WiH44$*r*PtgAU{lH?z-&%76^2zi?yqdl?v- z5B>RXEC2I9&&{v@<9>bm@6`L@|Mz+C{%^5-`=2@e&Hu}qZ~i}Pc=O*h>FxileeeFO z)qVKCz3tO~?ww!$^MC*LKT-MT|46mp|9#*7`R|?g@4wWt|NmuYF)%z2VPt50#>gO< zz{JpTnTbKnpP3>0E;EB<6AMF#H7mo7|EvtB53(_w%wuP0`pnL-+J=MSh!qFJ#YgN6 z)`sj18JcViT-R9`w0xKut}kF@`0)P!|6QT~{=2^U^Z&=m-~U_x{rX=#>DT}2)?feU zod5M-Bk}kDVAVhWdzt_Kzy0X%|Jkem{a@ns|9{%1|Nmdy`TxK1^#A`>?f?IOmHYoc za@oKCFO2^E*S+=k|Jrqb|0nGG`@c-!-~WG0{{7b~`TxH)pMl|Q6C*?6G$w|^iOdYC zF)R!jk69QNORzHdePv;IUB$w1Y!fp>*IFh9w?;;Wt?mpAQPThahl~FEKili?fA>>= z{y&)g=Rf=YKmT2{|AOnk%sK!5?<)EKf0iQyL)04v2KOXJhP%@k8TPd>GBoQkGAPYs zV9voI(tu`q}}XJ+7wVP^2PRAX4{tjbUouFMcntiYf=ONL?M zWpM^eV%>4VGPwm_P!+YQT|Jw5W|F+5p|MQD({^$F5@qbh1$^Q|H z_WfVtz2U#%syY7?FE;*9pBwvs!C&3~8-9QIH%WQvzjJ+_|8!FC{e5sNrmoTu6lzfC%!rGqazQTKmB7u$OV z>*@CyZiHVt@TKcSgPO!)hxdht8j?GYF(h0(*RU(#mV?5<=K=!TzsgjfWpe1az^m}# zfoQ^6DMX8!)4%l7|&a1#?l_Gwmz*QYrcHfM7)*iYtVh}Yw15YQK32(p-aHW-> zVUryn!_ApI4Bb1p7;5)&Ffg8CV|en5g&{DFnc=l06GMy?BSTm+0|V2`|Nl45{QrMN z!vFs>HU9r!a_`^&ijsf-qaXeK|4#ky{~n(||DED~|8Fb!_5Z}opZ`@q{`lX}{o{XN z<&XbKM}GX@llSxg)52f>EBF8YFXQz0|GfME{%cn=Fqr>fWO!}E%y7blg~8_%3qzm) zD}(MQ7KW5&76yfD%nU`0%nTdlm>9&|85w>~U|=}U%fR4w;{X3;hyVXK{{8>Ie=-9@ z?<)p|d)15#2N{?c-X$|J)J|q%5N~E;(9~sOI5wG)A^rdZ1OMUw|L<-1_y79BzyGV& z{rR8!_V<6z!r%W_y8ixeUGV$=!?(Zxb8Y$afBMG1{}V6#```5a|Noi1j118`xfm>d zb21$5+yd+<46BpO&LdQpjgl}&fo*BPY z=xltq;Mmj;2Hz%rD(KJuV(`Z5+k}ia-z%oq{+#gW`L72t>VKB3wfy_#irhb@z#IRf zTr&Uj@45Ovd9D%zJ8vk1Pf!tqLux&P+WiKGlN+lT3iS#YW<5$~(AyHu5OB+f!GYa{ zL9Ni1Ve)?qhW!y{4Es1u8K(A|FdQy1VR#Z~!r*e>m_gvJ5rby7A;X1eeTK(Zbr|@+ zX)>I-uf{NYgEGUhCIyDx6j_F|u~H18+2Rasts)E=3j`T@Hu5nft>O+ z)rWyWWhnzgt0W`Chc%20&aq4kHx!u}bl)*E%-hJqa6gKbA@l|-!yIWghLw_R3{%gt zGF&!iWjGkm!mv4znZZh)iNWy>14H|~|NoP!{{7c&`uo4^@Sp#J?tlJ!@&EbHE&1pF zucE*Ir-lFd-z@t3zu4iQ|6f=A_|Fsl{r|~^Z~ynPfBQe5_1k~vu5bTS=6wI(WBn7{ zUR(I}?|bFYD#XymA;$2nQ&+eHp*eaVdh@P}! zn4s&xaA=AT z<^QW@r2VgRyZUd>2I+q(8_oXq98mdVaQ^A94azk?6{f%bp0LL1+k^f2Uj#BIeJXID z_JQGX<2!{{#%~|I{Q9;*w*BLQdbuAL1j`vGe7?cs&|x6ikZ7QKprK0tfZrK2hD>!U zhMS)(4!q$vZaDTp;{lhwG(&F+_l$4He>Keb^on6-@Lh%T zFXu{wTjJdVLA#$DJkkC1BfI1Gi?4T?eiW`?pCJ33bHR)Pu7pcrTmfvKI34!+a0bX$ zb4YOYvPXzaV*B7Tjg>=c35&*~L(B*CelR@|a%Ym^-N+bn&XjS=&&v$IB|90?or4%s z#B~_nI|(y**Re3HdHUyn@~fZ!g*t!!x77aiU-r0efs}{^Yj0Xb}#=wad`cIU%=b{5ryyn-(LCgzxbce|L0_W`=9yd$Nx(;zyEXc z{QG~hi-95RDHB6H7c0ZE=WGmd1sn_;XL2&|C2%pY9_C^QILXDpS;NIJ>m?_{as^I? z3?mMPW4i1NI~Ca&I3!sa_+(iaqKudsen&Ggyq>|xu;w`fgRKh#!L{olgt&;Q=- zfBv7a`TJjZ!k_=Smw*5F_x=4}lkNBaGYr4~PqF&_UwzH*|BJl-{5RnI`+w!FzyF;! z|NDQZ^Z$RoNCt)uc}51-2aF7z3z!&!GMO3NoLLwm%~%F4|m$L8`goIS?Jz!u5Nz!k{N@Oc9V!|r-k2AdO% z45~B!{(t%J$NyhEU;c+(e)qp1`Q`tP^N;__Y2W+b(|zN=GRNiruXdjOZ?@~i|8j*R z|Fi$?|GzDI&wmbso&UGSZu|di_2&O-hd2E9&|dpr-EYPJ`r3v6fBc{RUtOvD|1bZl z|B{BO|39Dc{;#`E@Beu&{{M5HzWdjvfAL?yt)2hUo~`}&E^_m~Q~DSGP1NH5AHSgV ze}pzK!@Q^co4$_U^5Bzj{*-)K+o59HKd_%dyu>&ig9ys75dca}# z;=>M|drmd1u)fj|k#nD+ZU5^XX_J0b#5=Mo{L~dZ(05Xrp>4LxfkY2&hn%VU4&B*? z2bixLFkEESJCN_Jc_96>5`#vUbb^1YFhfQ%x5V$+%ry=({ur>W{q{gj?9+iGpWiVo z@_hTiiQ(-6_ZM#)KJRt4D%`?7`B}9XE>Sd$uQxr3j^ZM($sm8GRrXmAdr7Qyjha^MLG!cfah5`(p&$$_x53@6TzQD{dPlkcv z;Ko1yBWC~n|M2m*|5{VN{CD5{>3^f^$N%v@AO3$l`u@Mg+V}rI{CxjEdf|uvjnh8< zw>tgl|3ZT=|K)dl{eL$2`+vvpKmM;C?amH7W(JDq_cX$B)h*D5B4 z6LXjuit<<(e#o&hY+TFA@K%zI;Y$)5gM9}ZLtiHwgGo9YgSHYIgXbPr24@RahTSt+ z7!;o}Gt8D}W;pK0#L!#8$Z&NL14GE=|Nq_j|Njq&{`cQ|_uu~xMt}bY9{ThDaL%9q zY({_npA-D^Uy=LI|IVbp|Cbj0{qNWP_y2%af!bpQST=Kt@%W9GmA zUn>6nmudL-e}Ch@|Fup3{-<{Q`>!+W-~V0v{{6T3^Y8zx@c;jJUH<>yppb##s4gSJ zE*2(+)$f=Xq8~9cyuHH0z`2{1!Mu}=LBy1up=~QW!#-vX1{P@!hM1r14AF1_tkC|Ndul{QW;Q>i7Tf1wa2!yZik=pTxKS z`@_Ec_gwtx|7(tq|GTHY|F0DB?tgOP+yAQ$zWHC?`R2dy@i+es+TZ@4cIn-Ji}fG= zYsh{6?<)K4f8)}h{}tB${ja3P#BiU1oxxsFt)fpyk z*I{^DX~@8P$dp01+>&8ylMMs=bvuT6c@7K?A&v~U7CJJV>2PGI_H$&I5#-3Qg3XEH z=zC{|sA=vD&5gbcUb0~fv(_gvM41*aTnlbwxS>CVVPE2M2A4BC7z*YbW!R>6iXrIl zK?bfH%Ng`el`;q#s4}c(TmRo?KllG*Q;q+<*em;Y!Q#EYC8FQ|{NOwL`-jT6UlvH2 ze0rdC_&r1Jhqnpw+;0^Qg}rq!XL{doUG>v~%lp3Z6tDX;W5q6Jh7S|C9oC)_W(fE! z-4NZc%n+cW)zIRg-*BbLh{0^3v4eh|5kuS^y#^Ns&4$hViVAu0;sH5vJa%vU84{YC zzbtS)`@+HC&)oy=Q?58Dd_8mEwasw`rQ*X3pBEowxOM*E0h5=98=hZ2&QOwe)TK7lEb;lka{pAD>@ zpA+0pzin7*^725|{HF|4r5`_7zwV)eSjfW%y?-A*aGLUX0o$*q441iHDiqCoGr_g% zLjd36FA;0@{gBzS_0JiORECOu>zEfrRI_cc-Nm86oy7H^vw+(m>=pL{%Uj$69s%3| zM-#XnyinpSXkX7>uv?z3U`jX3mnR&|Q%qMeW_+k+_)BGYS2le!KX8;;i2PQ+gKtKhL%KzsIEg z|21}>_|K|#{{M=S%m3foUi%-xb>n}d@6G?VX}A8n&AI*mp3>d_;*$6OpX`13pR4i7 z|CATc|95P7{h#OH`~N5Ye*S;P^T&UUjz9lp<}omM7PBzueP(C4&%@2|XEQGY?*o1Y z-d;h5)?Gpjr?Q0^J}nbwxLqR5!2dvqVapdmhRXc{4E?_R44YT;GWb5@X4u5R#gHY- z!LUJ>jp2nO3xii86GQPN1_tfh|Ng&r`1^n9iQoUt%76W53H_Gnc ziG@KTgN5N8FAGEHGG>N-M$8PwTbLLo=rA#4%wc3`WMyP{mC3-MdFKEB4E_KAU8ev0 zf1Ul`|FG7-|CvPo{@=F!&;OIffBrA_`tyH_?VtZ@zJLDzDF5^S!R|l*r-}akf4AZ9 z|Mx%s{$Ew`??2P;fB$u=|Nm$I`v1RXDg%SoNd|^yc}9kn>5L2)7cw$DJjci&@qv-y zGaD1bO%WyrW@#n{dnqP{UqVa_3am^F-X9nlj$USDIJb_GVQT{;gS;mrgFFW#L(V=1 zhL~Ii1_p5khF^RC|1U`W|Np4K|NoVT|NTGP@bCXz?|=V=)c*bVYX19wMc?25+)Mxd zKY#S^f6fno|IbzW_dg`&-~TtW|NS?5@b5pb#{d6aMgRXl-S_{09S;M;ohSx|$txKc ztbZ^tgu5{^xJ_nc(7VUT@J*G8!6uW5Az>L4L(6R@hP7WfBU~?;+Ox@?>_zSDgXF?tHp=^ zyf*LuJ9WSN@1y_j|84zu|BENT`+qm?{r|wJAO1fx|MdTo>zDsGc7OXnbIQ;E3@85l zU*XNb;3>qyV9&$Bz^cx}!00EypphlQV391ruu)!yVSSrCLvVuRM9b%xiW8VnsLv=}@Y^%>$4Oc|O@?HEed zc`__LAI@+wHiO~OjVgw{34ILwI~OucSKG{RrRM;{Bh%vy5w%Ac92+(=G|sJMn4u)a z5OA^a{{s81|4dwV{SBy_{m0=-`tK974S(HO!TYmALFmT;htTf={BOQ}5PkVgK{xvQ zja;7}9|8{ktPtGsyC*>7-!5)uMvwbOEFN>_us={!;Jz?>Cf|ZJj|2~BUJ-Fv?k>JS zS5or9Lk%f~sWDOs8Ve;KYI8k7Jp#Q01!>Sir4b2;r8j9;AF9gozU-2S>b%XNHUlXnz{czw6 z>vIS1KX)6no?ks6_4nKX?VOVioe@VJdT$?ckYYaM;D7ND!vve73{Uk>9$4Ldu3?(m z)dTO(-8mrX^R&Sx;hlr{sqcH9x-l~NOyN3UQ6&6e;}U6y>aR)+{id1?5q5eFYd#q| zRM?v|$jg{Eba$CJyq;!sKs8*Sf$f!+gGQNZ!g>w)hKt4$51h{mG)&duv}@^PbcmAr z6_6nG*`Z*;n**EPK1-M&^QhsT`#lGrrrQpJ*KRsIcDd=GbK)jLL*VTLzNhalI4Jp$ z;fnOrgz_~n7u;F=?!b{7pFJ)p{#b&AY>rlvJt z{@;;F`&&_<@|)qA%};~vJH9J0&i!U^`PJ70$@9M^q;2`i(4g?`!^P|00;Zq&-f`yr zj}^BKe?_=7|9)b9_0KzNseej!ZvT(R1Tgr_G+^Xvdc?@_Cz(kldn?nH#+ytUpRO=% z5m?8h6PLqOz%Rih*S3?f=2`^fU8lbc1vl3)O#YkAutd$4!FReGL&gd&hN_8w|7)N7 z`hOkgr~el;KK^eq`t-jm=F9)f4B!9HT=et5__N>tRVV)apW6KIfAN-o|2OIU`@ezd z?|;tF-~XjOe*TYO{Qm#O(l7tb!$193HU98_S>U_>l}F$FPn!MuzvAsz|6|)<{l7Qw z)&D&*um4Z``TGA^?YIBCR=oTFB>BVt6@j1r$E1Gwe`(UU|9t0u{NKX;`~PEyzyCXu z|NpnnVq}=$!_4rGiIw4T8yf@DWp)O=#~chbTR0iAT)7yIPUT`ax{QnAWfd30Ur{cG zhc%oGZCg1QW*%c_sMyZNaHF4H@BebIzyBqY z|NIY{{rmr&ufP6hm;CyFMf}%)qX$3#KRWaC|KdA8|Ig(8^*=lI*MH}ezy81R{r&&q z^WXm^Cja@r!29oiRo;L9tuO!kUpn*u|LkZ6hWjFn45tnH-DR3?T`QcMghXEHJz6JccN z?`L4(%afy zoc{iQ68`u9nd-m)zpnZF-{aNa|LI2m{_kx5_dog0zyG0D|Nnc>{{R2!pa1_?#xOAG z>|kIJ=4E6si)3WjG>ehp-+4xcZ{Hai-U>1?tdeD7$dP7ZxX;bRApC)m;rQc!|GicI z|KFeW|Nqvl|NqZpW?;A$#K5p{Ap?W+I|c>@b4CX3Dn8 z{a=6Eum8-szy9BI{Pq8{*{}bne1H8nZU6P(_VKU(@`=Cy`~3g?KXdn=|520v{`YP8 z_y0`8|Noc!7#N-}VPw$X%fv9@A~VCe+bj%=ud*^c-@(SPsGgm{T7`q5V<88_k53#7 z%SAXD+L<{S^7nEu*gJACyzFCVn6R9Up}m)tA>M_B;qC<{hOZWk3>%vN{}^=KuM>CF7_6s&790Pm=ubf5(LP|1U(m|1VMg{(s;5 z_y6Y~`SAbEw~zldTR;E5mHqX<+0yU-?`iz{f9v(1{}~Vd|5y3O#2_!l#t>)D$q-@A z!@$bS&+xQakYUYIVTQZmq6}OU#28L{i!-=R7H5#I7H3$gCeC1UQjEc8xfp}0m^gz^ zwFJWhPicm_|MCnX^6Cth+J+2S^X(XnUivdMrlm4irPecKw9I2r(LciQ#`7J6$YN1O zw+16dn`gF+TuTiZPo3vrwMUH|=~ zitG1}2mNGuXmxaTd{P&!dy!f8AH z1uY@G6IyO?DKK7Rk4TMWX<}_*C|R8R=f^S09~<5t``j?2_x%CeiLV>fzdmR1y!}K$ zIQdaR(255PN{8+@{62WU;mxK82mZ`>bl_OQQw1OWmkex&-YS^ze?F1_FeTBMpz=9&wm>=$OMjl~WCe7|%0=SzmRSyz&l1y7W^Aj)->` zx)grgS!&3{FvpeWfVG%d!=pHPhw6Lk4)Kxt4&t*-8Sa-`9r$(DmSIzyJ%h#!`vX<1 zb`8C^ts2@4%nl^07%(V3&^WMpibBK2O7Vo}r+FK;oo2p~w)^LSw7c&Y^cOvIDB5wi zVc+ws4yTRIH+Ua8$zZwfD8p}y!wu)14mniaKh$8&anylt%?StH4QCs!f4JNb>~vc} zwdnDJe2+H=syn|*1%3Y~kP^)Cz&JsW;nO3@29~9Y2Xad_4sdAc9hkDf$f0$=DZ`91 za|YG@<_!9C%p44)Od6K^85~Fr*FLZ^Qq_U2QEq|CKe2=~R{n^hvurs#djC!MQuA%W zp7ZY*l(#=WP!|8NLG%4>hsUkg51g>Ra^Q!;B?lMViwEQ} zedX{c^i9I|+wTf0cYG{Jzx+kwt?&;6>%`x4>=*wF3OLMIadZvKk6K@L2A^r10&dmZ z0e?R8Bux0tyJ5owz6%vw`5u_(^A#u@;|+Lvgy(=;1^0w0?>HSa%{dl4N@P=*TgS3t z%N(ZT{ihftEkyt8Fn9bd@YVSv;mP@X!9(R=99!ysa!5=4l<@oVqhccG&j}?VKPzO; z{ai6E@7D@L-QPLa8UA#nJ@{k6e)#W?iUt1?!V3Sp`06v*dtPOD)*sLK?d)mBBchT_ z5$D~R4$O{Zx}y`w#2{kC)X>SmBw%om(e7FWqmiW!{=eh@r?y=9zq9Vff4`IW{|jk9`+vRZ_5T$I z-v9S|@#()3_t*cfZr}dT-}~+V%$eW*r!#;1@2ULtzpmVu|A$0A|Myb*^uH$N;M1tUobGtt!85Af5*(gXU)o>9K*)&$d{d=fR}@TXC?;&>jw^oqe7ev2bnk- z@(*z^n1pgLc<*OtSi#E9a7~wu;jAqy!zF7L23I|1h6ZUShP9lG49oug|9|QKzyD%F z|Nif^{QEzm>d*g&*M9%+4E+87((7OUJC^bpC`PJY5TC@NCkMsNgfBpae|8-Y0FevykGDtsSWDrefVko`I z#Gqx)%&?}8nSpmbGsD;8%nS=oGBe!S!p!i!i_nItzVb3LO#IEr@a8Tf zgJ{VA|3~Ki|F8V^|NjhI28Nxz3=D>M7#KdOF*0c9FfypDVr1~W&&c4w#l&!4lZk=T zmWjd1nTbKzhKV6norxivm5E{5HAaS~vl$s2!WbC@*%=wWt!H339K^s-_3{6Ir@sIH zW3~VPmpc9L|B3v6|5r%=`+xt!-~Txi|Na+@|NB4K`tSb~^}qiWRsQ~GGy3~qEAa1s z+s42D+YbKy|4iWD|NFWB{!hF1@Bb5z|No;7{r?~2z`($GfPtajj*;Qc4n_t;9VUj= zQ<)eRePUu*;=s(%R?Ezgvz(dX-X3O#lY5vM`j;^?a91%iOgCp{;C#Tuu&0EHq4hf> z!{#hT2BwP)3=?!27%nyc|6gd$}0=s*8o-ueAsvH17@M+(3H zUw-lHzxdf-|839z`mgul*MA*@-~W&I{r-QC>(BoMi~jtd6#V!9OsRkWIluh-zxMY3 z|BufwFswPm$Z%*o6T_xu%nW}zSs0XJSQ)O1voY}PU}I3QU}tzXnVsS0adrmvi|h;+ z*0M8fiD740bC->w)sT%rB8rv4G>U~`ohdVe*+)i()JY5s?ehQs&zk@DzlhYI{|~19 z`Y$E-^FPmy@Bd%reEWagl1RDb@z|HY^O*C&7azo_xk|Dvs*{=YK#{QuqO z&;PaleEHAr`t85*@$df+SN!~c#pn0`Z^nQB3(EZe@Ai>_!F(PQLp3i8Ly{INgVbYI zh6|c(46WZ;8GL#u+Q0t`>=+r+KeIB( zui|CMm6BpuaZ#6H=K@cLtg0M_ys{|_QE&G#7_NE2@Ia1_QJ_nkvCYAjao;_AM!yCF z#)L0Cj2$m7GqCfvGQ{dAGQ?Y~`oGUZ`F~dLgntP}-~Zk)kNwMHck<5-cc(uIrRRT7 z*jfIYqu25Gi-ktNFU<1)J>kUc-#Q;9{=88-{-LH0CTK#>p!gPJktgA)o|4QJ1D75p;gcDUxn-N4DgEwDM0>%rFuNVmb56m?>@H{{I4BRQ?7$DgE`~_tEbPS2VvasNMGI!o7wM2|RP(F)WmQ zyFg0#O@m|i>jiTsyjEb+defjE_4dIe`S$`UB_9u@`hNM)Hs`y=3cuf{9DV;kSXsyH zu>BbOgBo@o21zA>hDqOr74~O}H)zI4E%>}ehG9*t+yj0W`Gl=e@(xpH$~`FjC*vU2 zE5(rIFRl<7D!ia?3*Q5#4$dVB@0ss8@%?)d!2Kh^j{nnxtD}>{V_7uog;*Be2XE^{7*0=@X5f=mYPfb^{lL7fItNNC4HzVNjT`PpnlO|FnmFXW zGh(PPF<>Y$&~dQ&q2{2sO5s3xj%0#%j^G8QI~=*2KmSi~eEaRec9wSzpG%)Is8!!} zaP_{{&@OS|00aN&hUDPm4PO|K9@wmVq~X~8BM0Qgj~^&Lampe0-uVV?t7{BQTka~9 z$vk^dV*5U0`|Tf7{B|%YcuwMZkfkB^;JKANgG8_T0kP+L46fp)4GTV7Iy{fEb!alR zKcHP^&k!hO$DpZY-O#kd?10B31BN4KH5q2DR9vuewS>c4e*PW7qO2ZofB#w#$?`EF zJMZ~{yz+Yuiz2QaIO=-d;av7fhZFCQFuZwtkl}U3fdf@D4>TzH9ddB)K6;?Q`qY7M z_7@tK7hXSbd*S^9i)O!IkWu}_@Q&fnjVte21*|vmD_r4}bkNUa z>47%_RtMzI*f6|jv~yrzW6QvG&iX)hsRe`RPGg6|J9HaN=BPQyPLgx@a!&NXjBcKY zd(6x`*h_yhSjv28cx&?9q4N8^1B<3#KM>)3v0<{}nTDjm6AgMVk2aWoJL2F{bCh9K z>G1=(mrotoQ+vK)QpnWbrntriCtnZ4$^Zhp%lJDJRxO4Pz0*l|P1V-;-ew`3{(G6md{pAeB&lLEfQDS*2lTgF3^jtC|O1ifc10aME_*i_~IJPSt3LFIPPf zvP{w87q9GsN9V*9!g+-XVm@$BShaxl@ErI5GZguL8f=pO%n&~Ht;2yiFBVkzKY3t! z>;Z$1$UO#k_d5-%(rz={DZbrcl69xS%KqMh|BoIdEOvO}@X_u?g4Dq`7n+uTRG4?+ zo4^&xKWj1)7!wkj*aV{Exi=)-AN3`-J-D zPalekz83uK`%w^h__x#EpZ`QeWtk2HNU}Px-C@6QGlZ+)PASiY>&AQ!TH5#>)@BGO znB5Ra5W6OzV4fz>;MmW;VEVp6`ODV@dB$H0mL2+HkiYOtfzR15496Y67A*MjwLsw2 zw*%a~KW0n_|GDG)zF#-oEdFRT?f84?PFVEe%!&UWK}2kQ-{yDSb1Bw42HcV!Mq%wSrV(ZQIL zv4-J($*up#evAJ%S)BRL#NhJZ6{X>S6TE-?S<<`hPmRi?KP5t4e@=AH`J=&p{Et8( z+g};0@V^sUxBkuYk^T3kvFl%g+0TEh+f)B5tvd66mYOz${joZRd7F+hd|UmGp^HnC z(QTItW1L|SqeoH@%5v~b7&dc|G;uNUn9|FZJ*JEZ_aF>~(wwQ$>^(_m-X-`&$6YZ=FO3PUpELX5H zaP_b<$cL~pv@)?W?3u~Juug`BVNxG6!=q134354`3>ga<8H7GFFg$Z*U`U($|NqTD z|Nc9t|N9?)|L_0w^uPa;8UOx2yYA2b{RMyi-*f--KgHzFe_69X|8sr*{0}bs^S^M@ zpZ`Mt|NJ+L`ul&z!N33a8U6duy!zk&mFoZhKVJI(|1%{92F5uI4DYp{pXkc_y5s{zyCj7 z`1}9Z-oO9nZvXqgVBg>WA20s>-}CYB|4f;G|MLU?{rBtt_rK}NzyFEy|NkrI{r~@R z-~a#D_!$_4;u#pOtYTm&{>Z?PZ^+0{p2^7I{)K^|+mexixss7VbR#2!+XF@hcUC5b zzj90rojObm{<=&I{}q@RCbKg!gg<0tc)E^}LA{WX!C#Y+;mQpLhU`WLhMy`741Guc z{|`?6|G$Op|Nq$4|NaYx{rkU@3|W(Hp+W`?sTnHUn{ zm>6z9WMpUwV`TWZkAcBMj)7r$`Tze@&i(tpLG9oFwatJ3TfF@9|9RA({~C9G|5q*e z{eO?-@BbOMfBiS!{_FqRb-(`KKlJOr%a>pOk2wAQzj5vF|Hq8~{MWqv=YLk`-~TSBwU~urdL}Ew8&NifnTy#NPVurc)CRCK zT*_c)h!16F=n!LPxVMgtAyt`;;aN2+gVbRbhNEmO3`@e98SG9nG2|37FrOmLdQH$XQ zhbn{R5h;eU0&a%WlHdQUDBk-YU~}+)f6>DKH6jiF^Ebr(=V7-0FZopI|6?Q>S2NCb zddVQP-I>AcS>OK+x#$0RP2l=>LD=o@6N!#L7v5g`-Er6AcgLU2zY4zi{`zr&``3eW zAAct3Gyk#>bozB7VEwNf1zx{@^a%bD31j^0BqjQ<`MTTx4Uzo}Z<3xdez@zz{6k_k z%LVqQtSh?3*bVlnayZy=a(<}Z!CAnl!!==BEY}4YPp$)vuQ>zMTsSvGgm7du$g_Wt zTFq*+@*i_UuQJomn<@+~g8cs~ZomH>u;%K|390A53%q~*HQ|iqmkS$@efl6Z|D(Y3 zvmYG(Mt|7w+y8^W*R>x4Y|B3$@L2V!VV=_$h5HuYA|5pTcyUMg_njSg{>nz2VK~Bi zfqBEr%WMZa4|6gEckw(>7vVqf&R6h&teUWcL$Anz{4&u62d;}gn6*l@f#Hpa!>&2P z4{{F*D$GdYUy$3w)3CsgGk|9g>nX2Si~&X;|7tkB`nlo%`>zEavY!sj?Rj?~FZ}g_ zl&LQqc0@lrFlo<|1r5g@GyH0Pyny-lV}>_6PZ>1Co+tRNd+A{M;>`v9O&=0+zI~A> znElgeUCTcm^U2H&)yp^nWasi8I2|gaptM2kKx?nmgI^bA8{VcUG(0m@a!}V)X3%y} zZeT4^a+tSYA>o+5oPyeUsRWh{VhPV)3LfB^$#dZFT{gi@w;2SU@A!4#)0{61Pu9Ov zaFl$x;QznJ4NWcg4=g=-yW!5u8xGmOuQBZ7yT(7IR zG=^sjxc0w(@Jsa53XOX|dom1D%)}hp-|(I2(`C16)cPM# zF7|yvv+DZ?3Ej^d8Ee~Y7S~)1iTORnxZr;%BW9%^1Nspn5L*qd55ru}*#S#-% z-QX{nG@GsAz1rUgw%b25=ytwJ5WDfvq3X`f1HGp%IXt>>#=%hh#DT!QM;H=s9Xg;? zbLha_WrrEQ2Om4oTXKpa?EQI%;zidQxKi#VcrrhKFxT_L1HnH(HypjgTu`@$_kf*_ zc*8w8g#$CZG#Z+#^c`N+n;xh)wrWTyvu$`_WPd<9)}F!Rvu(qXzg7&d`pg`r9x^yk zzE{&hXN{tQ#36|T@)rCr%)MD1Zdv^<$aepzFk{1Whh3ZRIe2tkYskzv&yY}k@&Nmb zBM0W3I_OYlc7Va(^uU3?#||=-K0I=Oq41=`;fV7MS;f~Fq^I0_(AoaH!9n!nfqx9Y zIm~%jCrtm&r!cccqJg7av7vFAX2YfR1`Kx7%owJsSTiWv*)c?(w{M6!XMe!Z+K%Cv zytTu+ezOB>mK!+y?$LBe$Wc5XS}9S``kJrf>3^1ryj58MbAfJivSV2!sB?g9n!CA2<+daKOR(@Ii*`dq)@o^G-JCgq>$NQgH1+z{GnD zGh3b;7zuq0c>4F3h88Dl!NxCq4?Z_aIP57=Y*;)+^FYx$gNBT$W()x;)(v@fb_Yx^ z*gG6NZ_glNYj;3g$@)P2Br}IKs|*;-CTKbw&R0CpTO+aI|2sa90A^MWjvv1kl<|Cg zpj`jF!L{e!0q2}+2SS6+AF#_l>0o^42*Zbi2OF3T4lo2895`_2&_RdocaJy(zvQ{F&@B^R0 z1Qu2ezn{MpcJqF8h;Mj)prH4jLqzVi1HQrM9Yk|ZHaxj=6*qWXvl<|M$5c>V=MgSWt!{d*92@drV2aJjo z83HG1IwY?#XjnSgtl^=Obwi}B9YfuD`-b%M_738(|M_b}F5gE5zQ*Sb;(hlRKIdLLa3lD*n| z$S}p=K*KzP0}YQ49XwEV_sD_EIVT+qLe4Wp=3Q&(?7PR%+4#KR9p6We=3l>N>|i&$u(?jcVQrz}fol^r9lozNaPXRJ<}g#qnnBIh&LQEveZ&m=Uk)c;ygLve@Z>-% z`>h6Mxr+_)b5AyCoju&Z^lCrD;f{R{HxC_fkdixoV5Zr{hDg183^y;l$+*4mcf+?C zoC+tkMIE%K$TrkRDjg`TQa%uyshIHlkIaJS{^AKKs|61vN%0D3%;#Jnbeb)pw~|Gm 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

16z2g6- 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 - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 9578e488d..75b13f9bd 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 7a2aa8a7f..337fc98e2 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 929dd72a8..b6a8a7dd3 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2d06d29aa..60a24021f 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 86dcef905..7fe2ad96c 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0 + + + + StaticLibrary + v143 + false + MultiByte + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index e47858ae3..10abdb438 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0 + + + StaticLibrary + v143 + false + MultiByte + + + + StaticLibrary + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 86730b859..1cfb3e588 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0 + + + + StaticLibrary + v143 + MultiByte + + + StaticLibrary + v143 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index 70a130e31..ecd8b04aa 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0 + + + + Application + v143 + false + MultiByte + + + Application + v143 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/options.h b/lib_com/options.h index 3ec71d78b..d235b80b9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,7 +95,7 @@ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ diff --git a/lib_com/swb_tbe_com_fx.c.bak b/lib_com/swb_tbe_com_fx.c.bak new file mode 100644 index 000000000..fb68537c8 --- /dev/null +++ b/lib_com/swb_tbe_com_fx.c.bak @@ -0,0 +1,8216 @@ +/*==================================================================================== + EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + ====================================================================================*/ + + +#include +#include "options.h" +#include "cnst.h" /* Common constants */ +#include "rom_com.h" /* Static table prototypes */ +#include "prot_fx.h" +#include "basop_util.h" +#include "ivas_prot_fx.h" +#include "options_warnings.h" + +#define POW_EXC16k_WHTND 1.14e11f /* power of random excitation, length 320 samples, uniform distribution */ +#define POW_EXC16k_WHTND_FX_INV_SQRT 6360 // Q31 +#define POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49 1667313793 // Q49 +#define POW_EXC16k_WHTND_FX 178125000 // Q-6 +#define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ +#define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ + +/*-----------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------*/ + +static void create_random_vector_fx( Word16 output[], const Word16 length, Word16 seed[] ); +static void flip_spectrum_fx( const Word16 input[], Word16 output[], const Word16 length ); +static void Calc_st_filt_tbe( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero ); +static void Hilbert_transform_fx( Word32 tmp_R[], Word32 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id ); +static void Hilbert_transform_sp_fx( Word16 tmp_R[], Word16 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id ); +void Estimate_mix_factors_fx( const Word16 *shb_res, const Word16 Q_shb, const Word16 *exc16kWhtnd, const Word16 Q_bwe_exc, const Word16 *White_exc16k_frac, const Word16 Q_frac, const Word32 pow1, const Word16 Q_pow1, const Word32 pow22, const Word16 Q_pow22, Word16 *vf_modified, Word16 *vf_ind ); + +/*-------------------------------------------------------------------* + * swb_tbe_reset() + * + * Reset the SWB TBE encoder + *-------------------------------------------------------------------*/ + +void swb_tbe_reset_fx( + Word32 mem_csfilt[], + Word16 mem_genSHBexc_filt_down_shb[], + Word16 state_lpc_syn[], + Word16 syn_overlap[], + Word16 state_syn_shbexc[], + Word16 *tbe_demph, + Word16 *tbe_premph, + Word16 mem_stp_swb[], + Word16 *gain_prec_swb ) +{ + set32_fx( mem_csfilt, 0, 2 ); + set16_fx( mem_genSHBexc_filt_down_shb, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set16_fx( state_lpc_syn, 0, LPC_SHB_ORDER ); + + set16_fx( syn_overlap, 0, L_SHB_LAHEAD ); + set16_fx( state_syn_shbexc, 0, L_SHB_LAHEAD ); + + *tbe_demph = 0; + move16(); + *tbe_premph = 0; + move16(); + + set16_fx( mem_stp_swb, 0, LPC_SHB_ORDER ); + *gain_prec_swb = 16384; + move16(); /*Q14 = 1 */ + + return; +} + + +/*-------------------------------------------------------------------* + * swb_tbe_reset_synth() + * + * Reset the extra parameters needed for synthesis of the SWB TBE output + *-------------------------------------------------------------------*/ + +void swb_tbe_reset_synth_fx( + Word32 genSHBsynth_Hilbert_Mem[], + Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[], + Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[] ) +{ + + set32_fx( genSHBsynth_Hilbert_Mem, 0, HILBERT_MEM_SIZE ); + set16_fx( genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP ); + + if ( genSHBsynth_state_lsyn_filt_shb_local_fx_32 != NULL ) + { + set32_fx( genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP ); + } + + return; +} + + +/*-------------------------------------------------------------------* + * fb_tbe_reset_synth_fx() + * + * reset of FB TBE memories + *-------------------------------------------------------------------*/ + +void fb_tbe_reset_synth_fx( + Word32 fbbwe_hpf_mem_fx[][4], + Word16 fbbwe_hpf_mem_fx_Q[], + Word16 *prev_fbbwe_ratio_fx ) +{ + set32_fx( fbbwe_hpf_mem_fx[0], 0, 4 ); + set32_fx( fbbwe_hpf_mem_fx[1], 0, 4 ); + set32_fx( fbbwe_hpf_mem_fx[2], 0, 4 ); + set32_fx( fbbwe_hpf_mem_fx[3], 0, 4 ); + set16_fx( fbbwe_hpf_mem_fx_Q, 0, 4 ); + *prev_fbbwe_ratio_fx = 1; + move16(); /*should be set to 1.0f, scaling unknown */ + + return; +} + + +/*-------------------------------------------------------------------* + * tbe_celp_exc_offset() + * + * Compute tbe bwe celp excitation offset + *-------------------------------------------------------------------*/ + +Word16 tbe_celp_exc_offset( + const Word16 T0_fx, /* i : Integer pitch Q0 */ + const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */ + const Word16 L_frame /* i : frame lenght */ +) +{ + Word16 offset_fx, tmp_fx, tmp1_fx, tmp2_fx, tmp_fac; + tmp_fac = 320; + move16(); /*2.5 in Q7*/ + if ( EQ_16( L_frame, L_FRAME16k ) ) + { + tmp_fac = 256; + move16(); /*2.0 in Q7*/ + } + tmp_fx = extract_l( L_mult( T0_frac_fx, 32 ) ); /*Q8, 0.25 in Q7*/ + tmp_fx = add( 512, tmp_fx ); /*Q8; 2 in Q8*/ + tmp_fx = mult_r( tmp_fx, tmp_fac ); /*Q16->Q0; 2.5 in Q7 or 2.0 in Q7 */ + + tmp1_fx = sub( T0_fx, 2 ); /*Q0*/ + + tmp2_fx = shl( tmp1_fx, 1 ); /*Q0 */ + + IF( EQ_16( L_frame, L_FRAME ) ) + { + tmp2_fx = add( shl( tmp1_fx, 1 ), shr( tmp1_fx, 1 ) ); /*Q0; (5/2 = 2 + 1/2)*/ + } + + offset_fx = add( tmp_fx, tmp2_fx ); /*Q0*/ + + return offset_fx; +} + +/*-------------------------------------------------------------------* + * swb_tbe_celp_exc() + * + * Compute tbe bwe celp excitation + *-------------------------------------------------------------------*/ +void tbe_celp_exc( + const Word16 L_frame_fx, /* i : Frame lenght */ + const Word16 i_subfr_fx, /* i : sub frame */ + const Word16 T0_fx, /* i : Integer pitch Q0 */ + const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */ + Word16 *error_fx, /* i/o: Error Q5 */ + Word16 *bwe_exc_fx /* i/o: bandwitdh extension signal */ +) +{ + Word16 offset_fx, tmp_fx, i; + IF( EQ_16( L_frame_fx, L_FRAME ) ) + { + /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC; + for (i=0; i 0 ) + { + tmp_fx = shr( *error_fx, 5 ); /*Q0*/ + } + ELSE + { + tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ + } + + FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx]; // Qx + move16(); + } + tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/ + tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/ + tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/ + tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/ + *error_fx = add( *error_fx, tmp_fx ); /*Q5*/ + move16(); + } + ELSE + { + /* offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5; - case above*/ + /* offset = T0*2 + (int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f) - 2*2; - case here*/ + + /*(int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f)*/ + offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx ); + IF( *error_fx > 0 ) + { + tmp_fx = shr( *error_fx, 5 ); /*Q0*/ + } + ELSE + { + tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ + } + + FOR( i = 0; i < L_SUBFR * 2; i++ ) + { + bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; // Qx + move16(); + } + + /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/ + tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/ + tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/ + tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/ + tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/ + *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/ + move16(); + } +} + +/*-------------------------------------------------------------------* + * swb_tbe_celp_exc_ivas() + * + * Compute tbe bwe celp excitation + *-------------------------------------------------------------------*/ +void tbe_celp_exc_ivas( + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 L_frame_fx, /* i : Frame lenght */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : sub frame */ + const Word16 T0_fx, /* i : Integer pitch Q0 */ + const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */ + Word16 *error_fx, /* i/o: Error Q5 */ + Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal Qx */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ +) +{ + Word16 offset_fx, tmp_fx, i; + + test(); + test(); + IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) + { + return; + } + + IF( EQ_16( L_frame_fx, L_FRAME ) ) + { + /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC; + for (i=0; i 0 ) + { + tmp_fx = shr( *error_fx, 5 ); /*Q0*/ + } + ELSE + { + tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ + } + + FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx]; + move16(); + } + tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/ + tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/ + tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/ + tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/ + *error_fx = add( *error_fx, tmp_fx ); /*Q5*/ + move16(); + } + ELSE + { + /* offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5; - case above*/ + /* offset = T0*2 + (int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f) - 2*2; - case here*/ + + /*(int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f)*/ + offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx ); + IF( *error_fx > 0 ) + { + tmp_fx = shr( *error_fx, 5 ); /*Q0*/ + } + ELSE + { + tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ + } + + FOR( i = 0; i < L_subfr * 2; i++ ) + { + bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; + move16(); + } + + /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/ + tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/ + tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/ + tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/ + tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/ + *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/ + move16(); + } +} + +/*===========================================================================*/ +/* FUNCTION : flip_and_downmix_generic_fx() */ +/*---------------------------------------------------------------------------*/ +/* PURPOSE :flips the spectrum and downmixes the signals, lpf if needed*/ +/*---------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS */ +/* _(Word16[]) input :input spectrum */ +/* _(Word16) length :length of spectra */ +/* _(Word16) ramp_flag :flag to indicate slow ramp need after switching */ +/* _(Word16[]) lpf_num :lpf numerator */ +/* _(Word16[]) lpf_den :lpf denominator */ +/*---------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _(Word16[])output : output spectrum */ +/*---------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _(Word32[9])mem1 : memory */ +/* _(Word32[8])mem2 : memory */ +/* _(Word32[8])mem3 : memory */ +/* _(Word16) dm_frequency_inHz :Downmix frequency in Hz */ +/* _(Word16*) phase_state :Phase state in case frequency isn't */ +/* multiple of 50 Hz */ +/*---------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*---------------------------------------------------------------------------*/ +void flip_and_downmix_generic_fx( + Word16 input[], /* i : input spectrum Qx*/ + Word16 output[], /* o : output spectrum Qx*/ + const Word16 length, /* i : length of spectra */ + Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx+16*/ + Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/ + Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/ + Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ +) +{ + Word16 i, j; + Word16 tmp_16[L_FRAME32k + HILBERT_ORDER1]; + Word32 tmpi_R[L_FRAME32k]; + Word32 tmpi_I[L_FRAME32k]; + Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2]; + + /*Word16 s_tmp[L_FRAME32k];*/ + /*Word16 factor;*/ + Word16 period; + Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580, + -26319, -17530, -6393, 6393, 17530, 26319, + 31580, 32609, 29268, 22005, 11793 }; /* Q15 */ + Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739, + -19519, -27683, -32137, -32137, -27683, + -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */ + Word16 *local_negsin_table, *local_cos_table; + Word32 L_tmp; + + /* 1850 Hz downmix */ + period = 17; + move16(); + local_negsin_table = local_negsin_table17; + local_cos_table = local_cos_table17; + + + FOR( i = 0; i < length; i = i + 2 ) + { + input[i] = negate( input[i] ); + move16(); + } + + Copy( input, tmp_16 + HILBERT_ORDER1, length ); + + /*Copy32( mem1_ext, tmp_16, 5 ); */ + FOR( i = 0; i < HILBERT_ORDER1; i++ ) + { + tmp_16[i] = extract_h( mem1_ext[i] ); /* mem1_ext (Qx+16) tmp16 (Qx) */ + move16(); + } + + /* Hilber transform stage - 0 - single precision */ + Hilbert_transform_sp_fx( tmp_16, /* i: Real component of HB */ + tmp_16, /* i: Imag component of HB */ + tmpi_R, /* o: Real component of HB */ + tmpi_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 0 ); /* i: HB transform stage */ + + FOR( i = 0; i < HILBERT_ORDER1; i++ ) + { + mem1_ext[i] = L_deposit_h( tmp_16[i + length] ); /* mem1_ext (Qx+16) tmp16 (Qx) */ + move32(); + } + + Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); + Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 1 */ + Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ + tmpi_I, /* i: Imag component of HB */ + tmpi2_R, /* o: Real component of HB */ + tmpi2_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 1 ); /* i: HB transform stage */ + + Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 ); + Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 2 */ + Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */ + tmpi2_I, /* i: Imag component of HB */ + tmpi_R, /* o: Real component of HB */ + tmpi_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 2 ); /* i: HB transform stage */ + + Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 ); + Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 ); + + /* Hilber transform stage - 3 */ + Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ + tmpi_I, /* i: Imag component of HB */ + tmp_R, /* o: Real component of HB */ + tmp_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 3 ); /* i: HB transform stage */ + + Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + + if ( GE_16( *phase_state, period ) ) + { + *phase_state = 0; + move16(); + } + + i = 0; + move16(); + j = *phase_state; + move16(); + + WHILE( i < length ) + { + WHILE( ( j < period ) && ( i < length ) ) + { + L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */ + L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */ + output[i] = round_fx( L_tmp ); /*Qx */ + move16(); + i++; + j++; + } + + if ( GE_16( j, period ) ) + { + j = 0; + move16(); + } + } + + *phase_state = j; + move16(); + + return; +} + + +void flip_and_downmix_generic_fx32( + Word32 input[], /* i : input spectrum Qx*/ + Word32 output[], /* o : output spectrum Qx*/ + const Word16 length, /* i : length of spectra */ + Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx*/ + Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ + Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ + Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ +) +{ + Word16 i, j; + Word32 tmp[L_FRAME32k + HILBERT_ORDER1]; + Word32 tmpi_R[L_FRAME32k]; + Word32 tmpi_I[L_FRAME32k]; + Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2]; + Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2]; + + /*Word16 s_tmp[L_FRAME32k];*/ + /*Word16 factor;*/ + Word16 period; + Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580, + -26319, -17530, -6393, 6393, 17530, 26319, + 31580, 32609, 29268, 22005, 11793 }; /* Q15 */ + Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739, + -19519, -27683, -32137, -32137, -27683, + -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */ + Word16 *local_negsin_table, *local_cos_table; + Word32 L_tmp; + + /* 1850 Hz downmix */ + period = 17; + move16(); + local_negsin_table = local_negsin_table17; + local_cos_table = local_cos_table17; + + + FOR( i = 0; i < length; i = i + 2 ) + { + input[i] = L_negate( input[i] ); + move16(); + } + + Copy32( input, tmp + HILBERT_ORDER1, length ); + Copy32( mem1_ext, tmp, HILBERT_ORDER1 ); + + /* Hilber transform stage - 0 - single precision */ + Hilbert_transform_fx( tmp, /* i: Real component of HB */ + tmp, /* i: Imag component of HB */ + tmpi_R, /* o: Real component of HB */ + tmpi_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 0 ); /* i: HB transform stage */ + + + Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); + Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 1 */ + Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ + tmpi_I, /* i: Imag component of HB */ + tmpi2_R, /* o: Real component of HB */ + tmpi2_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 1 ); /* i: HB transform stage */ + Copy32( tmp + length, mem1_ext, HILBERT_ORDER1 ); + Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 ); + Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 ); + + /* Hilber transform stage - 2 */ + Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */ + tmpi2_I, /* i: Imag component of HB */ + tmpi_R, /* o: Real component of HB */ + tmpi_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 2 ); /* i: HB transform stage */ + + Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 ); + Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 ); + + /* Hilber transform stage - 3 */ + Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ + tmpi_I, /* i: Imag component of HB */ + tmp_R, /* o: Real component of HB */ + tmp_I, /* o: Imag. component of HB */ + length, /* i: length of the spectra */ + 3 ); /* i: HB transform stage */ + + Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); + + if ( GE_16( *phase_state, period ) ) + { + *phase_state = 0; + move16(); + } + + i = 0; + move16(); + j = *phase_state; + move16(); + + WHILE( LT_16( i, length ) ) + { + WHILE( ( j < period ) && ( i < length ) ) + { + test(); + L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */ + L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */ + output[i] = L_tmp; /*Qx */ + move32(); + i++; + j++; + } + + if ( GE_16( j, period ) ) + { + j = 0; + move16(); + } + } + + *phase_state = j; + move16(); + return; +} + +/*---------------------------------------------- + * Hilbert transform - Double precision + *------------------------------------------------*/ +static void Hilbert_transform_fx( + Word32 tmp_R[], /* i: Real component of HB */ + Word32 tmp_I[], /* i: Real component of HB */ + Word32 tmpi_R[], /* o: Real component of HB */ + Word32 tmpi_I[], /* o: Imag. component of HB */ + const Word16 length, /* i: input length */ + const Word16 HB_stage_id /* i: HB transform stage */ +) +{ + Word16 i, hb_filter_stage, offset; + Word32 L_tmp; + + hb_filter_stage = shl( HB_stage_id, 1 ); + offset = 0; + move16(); + if ( HB_stage_id == 0 ) + { + offset = 1; + move16(); + } + + test(); + test(); + IF( HB_stage_id == 0 || EQ_16( HB_stage_id, 2 ) ) + { + FOR( i = 0; i < length; i++ ) + { + L_tmp = Mult_32_16( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] ); /*Qx+15 */ + L_tmp = Madd_32_16( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx+15 */ + L_tmp = Madd_32_16( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] ); /*Qx+15 */ + tmpi_R[i] = L_shl( L_tmp, 1 ); + move32(); /*Qx+16 */ + + L_tmp = Mult_32_16( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] ); /*Qx+15 */ + L_tmp = Madd_32_16( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */ + L_tmp = Madd_32_16( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */ + tmpi_I[i] = L_shl( L_tmp, 1 ); + move32(); /*Qx+16 */ + } + } + ELSE IF( EQ_16( HB_stage_id, 1 ) || EQ_16( HB_stage_id, 3 ) ) + { + FOR( i = 0; i < length; i++ ) + { + + L_tmp = Mult_32_16( tmpi_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2] ); /*Qx+15 */ + L_tmp = Madd_32_16( L_tmp, tmpi_R[i], Hilbert_coeffs_fx[hb_filter_stage][4] ); /*Qx+15 */ + tmpi_R[i + 4] = L_sub( tmp_R[i], L_shl( L_tmp, 1 ) ); + move32(); /*Qx+16 */ + + L_tmp = Mult_32_16( tmpi_I[i + 2], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */ + L_tmp = Madd_32_16( L_tmp, tmpi_I[i], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */ + tmpi_I[i + 4] = L_sub( tmp_I[i], L_shl( L_tmp, 1 ) ); + move32(); /*Qx+16 */ + } + } +} + + +/*---------------------------------------------- + * Hilbert transform - Single precision Stage 0 + *------------------------------------------------*/ +static void Hilbert_transform_sp_fx( + Word16 tmp_R[], /* i: Real component of HB */ + Word16 tmp_I[], /* i: Real component of HB */ + Word32 tmpi_R[], /* o: Real component of HB */ + Word32 tmpi_I[], /* o: Imag. component of HB */ + const Word16 length, /* i: input length */ + const Word16 HB_stage_id /* i: HB transform stage */ +) +{ + Word16 i, hb_filter_stage, offset; + Word32 L_tmp; + + hb_filter_stage = shl( HB_stage_id, 1 ); + offset = 0; + move16(); + if ( HB_stage_id == 0 ) + { + offset = 1; + move16(); + } + + /* Hilbert single precision stage 0 */ + FOR( i = 0; i < length; i++ ) + { + L_tmp = L_mult( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] ); /*Qx */ + L_tmp = L_mac( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx */ + L_tmp = L_mac( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] ); /*Qx */ + tmpi_R[i] = L_shl( L_tmp, 1 ); + move32(); /*Qx+16 */ + + L_tmp = L_mult( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] ); /*Qx */ + L_tmp = L_mac( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx */ + L_tmp = L_mac( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx */ + tmpi_I[i] = L_shl( L_tmp, 1 ); + move32(); /*Qx+16 */ + } + + return; +} + + +/*---------------------------------------------- + * flip_spectrum_fx + *----------------------------------------------*/ +void flip_spectrum_fx( + const Word16 input[], /* i : input spectrum */ + Word16 output[], /* o : output spectrum */ + const Word16 length /* i : vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < length; i = i + 2 ) + { + output[i] = negate( input[i] ); + move16(); + output[i + 1] = input[i + 1]; + move16(); + } + + return; +} + + +/*---------------------------------------------------------------------------- + * calc_rc0_h + * + * computes 1st parcor from composed filter impulse response + *---------------------------------------------------------------------------*/ +void Calc_rc0_h( + Word16 *h, /* i : impulse response of composed filter */ + Word16 *rc0 /* o : 1st parcor */ +) +{ + Word32 L_acc; + Word16 *ptrs; + Word16 acf0, acf1; + Word16 temp, sh_acf; + Word16 i; + + /* computation of the autocorrelation function acf */ + L_acc = L_mult( h[0], h[0] ); + FOR( i = 1; i < LONG_H_ST; i++ ) + { + L_acc = L_mac( L_acc, h[i], h[i] ); + } + sh_acf = norm_l( L_acc ); + L_acc = L_shl( L_acc, sh_acf ); + acf0 = extract_h( L_acc ); + + ptrs = h; + + temp = *ptrs++; + move16(); + L_acc = L_mult( temp, *ptrs ); + FOR( i = 1; i < LONG_H_ST - 1; i++ ) + { + temp = *ptrs++; + move16(); + L_acc = L_mac( L_acc, temp, *ptrs ); + } + L_acc = L_shl( L_acc, sh_acf ); + acf1 = extract_h( L_acc ); + + /* Compute 1st parcor */ + IF( acf0 == 0 ) + { + *rc0 = 0; + move16(); + return; + } + + IF( LT_16( acf0, abs_s( acf1 ) ) ) + { + *rc0 = 0; + move16(); + return; + } + *rc0 = div_s( abs_s( acf1 ), acf0 ); + move16(); + IF( acf1 > 0 ) + { + *rc0 = negate( *rc0 ); + move16(); + } +} + +void Calc_rc0_h_ivas_enc_fx( + Word16 *h, /* i : impulse response of composed filter */ + Word16 *rc0 /* o : 1st parcor */ +) +{ + Word32 L_acc; + Word16 *ptrs; + Word16 acf0, acf1; + Word16 temp, sh_acf, tmp2; + Word16 i; + + /* computation of the autocorrelation function acf */ + L_acc = L_mult( h[0], h[0] ); + FOR( i = 1; i < LONG_H_ST; i++ ) + { + tmp2 = shr( h[i], 2 ); + L_acc = L_mac( L_acc, tmp2, tmp2 ); + } + sh_acf = norm_l( L_acc ); + L_acc = L_shl( L_acc, sh_acf ); + acf0 = extract_h( L_acc ); + + ptrs = h; + + temp = *ptrs++; + move16(); + L_acc = L_mult( temp, *ptrs ); + FOR( i = 1; i < LONG_H_ST - 1; i++ ) + { + temp = shr( *ptrs++, 2 ); + move16(); + L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) ); + } + L_acc = L_shl( L_acc, sh_acf ); + acf1 = extract_h( L_acc ); + + /* Compute 1st parcor */ + IF( acf0 == 0 ) + { + *rc0 = 0; + move16(); + return; + } + + IF( LT_16( acf0, abs_s( acf1 ) ) ) + { + *rc0 = 0; + move16(); + return; + } + *rc0 = div_s( abs_s( acf1 ), acf0 ); + move16(); + IF( acf1 > 0 ) + { + *rc0 = negate( *rc0 ); + move16(); + } +} + +static void Calc_st_filt_tbe( + Word16 *apond2, /* i : coefficients of numerator */ + Word16 *apond1, /* i : coefficients of denominator */ + Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */ + Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */ + Word16 *mem_zero /* i : All zero memory */ +) +{ + Word32 L_g0; + + Word16 h[LONG_H_ST]; + + Word16 g0, temp; + Word16 i; + temp = sub( 2, norm_s( apond2[0] ) ); + /* compute i.r. of composed filter apond2 / apond1 */ + Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); + /* compute 1st parcor */ + Calc_rc0_h( h, parcor0 ); + + /* compute g0 */ + L_g0 = L_mult0( 1, abs_s( h[0] ) ); + FOR( i = 1; i < LONG_H_ST; i++ ) + { + L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) ); + } + g0 = extract_h( L_shl( L_g0, 14 ) ); + + /* Scale signal i of 1/A(gamma1) */ + IF( GT_16( g0, 1024 ) ) + { + temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */ + FOR( i = 0; i < L_SUBFR16k; i++ ) + { + sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp ); + move16(); + } + } +} + +static void Calc_st_filt_tbe_ivas_enc_fx( + Word16 *apond2, /* i : coefficients of numerator */ + Word16 *apond1, /* i : coefficients of denominator */ + Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */ + Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */ + Word16 *mem_zero /* i : All zero memory */ +) +{ + Word32 L_g0; + + Word16 h[LONG_H_ST]; + + Word16 g0, temp; + Word16 i; + temp = sub( 2, norm_s( apond2[0] ) ); + /* compute i.r. of composed filter apond2 / apond1 */ + syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); + /* compute 1st parcor */ + Calc_rc0_h_ivas_enc_fx( h, parcor0 ); + + /* compute g0 */ + L_g0 = L_mult0( 1, abs_s( h[0] ) ); + FOR( i = 1; i < LONG_H_ST; i++ ) + { + L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) ); + } + g0 = extract_h( L_shl( L_g0, 14 ) ); + + /* Scale signal i of 1/A(gamma1) */ + IF( GT_16( g0, 1024 ) ) + { + temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */ + FOR( i = 0; i < L_SUBFR16k; i++ ) + { + sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp ); + move16(); + } + } +} + +static void Calc_st_filt_tbe_ivas_dec_fx( + Word16 *apond2, /* i : coefficients of numerator */ + Word16 *apond1, /* i : coefficients of denominator */ + Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */ + Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */ + Word16 *mem_zero /* i : All zero memory */ +) +{ + Word32 L_g0; + + Word16 h[LONG_H_ST]; + + Word16 g0, temp; + Word16 i; + temp = sub( 2, norm_s( apond2[0] ) ); + /* compute i.r. of composed filter apond2 / apond1 */ + Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); + /* compute 1st parcor */ + Calc_rc0_h( h, parcor0 ); + + /* compute g0 */ + L_g0 = L_mult0( 1, abs_s( h[0] ) ); + FOR( i = 1; i < LONG_H_ST; i++ ) + { + L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) ); + } + g0 = extract_h( L_shl( L_g0, 14 ) ); + + /* Scale signal i of 1/A(gamma1) */ + IF( GT_16( g0, 1024 ) ) + { + temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */ + FOR( i = 0; i < L_SUBFR16k; i++ ) + { + sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp ); + move16(); + } + } +} + +static void filt_mu_fx( + const Word16 *sig_in, /* i : signal (beginning at sample -1) */ + Word16 *sig_out, /* o : output signal */ + const Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ + Word16 SubFrameLength /* i : the length of subframe */ +) +{ + Word16 n; + Word16 mu, ga, temp; + const Word16 *ptrs; + Word16 tmp, exp; + Flag Overflow = 0; + move32(); + + + IF( EQ_16( SubFrameLength, L_SUBFR ) ) + { + IF( parcor0 > 0 ) + { + mu = mult_r( parcor0, GAMMA3_PLUS_FX ); + } + ELSE + { + mu = mult_r( parcor0, GAMMA3_MINUS_FX ); + } + } + ELSE + { + IF( parcor0 > 0 ) + { + mu = mult_r( parcor0, GAMMA3_PLUS_WB_FX ); + } + ELSE + { + mu = mult_r( parcor0, GAMMA3_MINUS_WB_FX ); + } + } + + tmp = abs_s( mu ); + tmp = sub( 32767, tmp ); + exp = norm_s( tmp ); + tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /*(14 - exp) */ + ga = shl_sat( tmp, exp ); /*Q14 */ + + + /* ga = (float) 1. / ((float) 1. - (float) fabs (mu)); */ + + ptrs = sig_in; /* points on sig_in(-1) */ + + FOR( n = 0; n < SubFrameLength; n++ ) + { + temp = mult_r( mu, ( *ptrs++ ) ); + temp = add_sat( temp, *ptrs ); /*Q12 */ + sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow ); + move16(); /*Q12 */ + } + + return; +} + +static void scale_st_swb( + const Word16 *sig_in_fx, /* i : postfilter i signal */ + Word16 *sig_out_fx, /* i/o: postfilter o signal */ + Word16 *gain_prec_fx, /* i/o: last value of gain for subframe */ + Word16 SubFrameLength ) +{ + Word16 i; + Word16 agc_fac1_para_fx; + Word16 agc_fac_para_fx; + Word32 L_acc, L_temp; + Word16 g0_fx, gain_fx; + Word16 scal_in, scal_out; + Word16 s_g_in, s_g_out, sh_g0, temp; + + + IF( EQ_16( SubFrameLength, L_SUBFR ) ) + { + agc_fac1_para_fx = AGC_FAC1_FX; + move16(); + agc_fac_para_fx = AGC_FAC_FX; + move16(); + } + ELSE /*IF( SubFrameLength == L_SUBFR16k ) */ + { + agc_fac1_para_fx = AGC_FAC1_WB_FX; + move16(); + agc_fac_para_fx = AGC_FAC_WB_FX; + move16(); + } + + /* compute input gain */ + L_acc = L_mult0( 1, abs_s( sig_in_fx[0] ) ); /*0 +Q_bwe_exc-1 */ + FOR( i = 1; i < SubFrameLength; i++ ) + { + L_acc = L_mac0( L_acc, 1, abs_s( sig_in_fx[i] ) ); /*Q_bwe_exc-1 */ + } + + g0_fx = 0; + move16(); + IF( L_acc != 0L ) + { + scal_in = norm_l( L_acc ); + L_acc = L_shl( L_acc, scal_in ); + s_g_in = extract_h( L_acc ); /* normalized */ + + /* Compute o gain */ + L_acc = L_mult0( 1, abs_s( sig_out_fx[0] ) ); + FOR( i = 1; i < SubFrameLength; i++ ) + { + L_acc = L_mac0( L_acc, 1, abs_s( sig_out_fx[i] ) ); + } + IF( L_acc == 0L ) + { + *gain_prec_fx = 0; + move16(); + + return; + } + + scal_out = norm_l( L_acc ); + L_acc = L_shl( L_acc, scal_out ); + s_g_out = extract_h( L_acc ); /* normalized */ + + + sh_g0 = add( scal_in, 1 ); + sh_g0 = sub( sh_g0, scal_out ); /* scal_in - scal_out + 1 */ + IF( LT_16( s_g_in, s_g_out ) ) + { + g0_fx = div_s( s_g_in, s_g_out ); /* s_g_in/s_g_out in Q15 */ + } + ELSE + { + temp = sub( s_g_in, s_g_out ); /* sufficient since normalized */ + g0_fx = shr( div_s( temp, s_g_out ), 1 ); + g0_fx = add( g0_fx, (Word16) 0x4000 ); /* s_g_in/s_g_out in Q14 */ + sh_g0 = sub( sh_g0, 1 ); + } + /* L_gain_in/L_gain_out in Q14 */ + /* overflows if L_gain_in > 2 * L_gain_out */ + g0_fx = shr_sat( g0_fx, sh_g0 ); /* sh_g0 may be >0, <0, or =0 */ // Need to verify? + + g0_fx = mult_r( g0_fx, agc_fac1_para_fx ); /* L_gain_in/L_gain_out * AGC_FAC1_FX */ + } + /* compute gain(n) = AGC_FAC gain(n-1) + (1-AGC_FAC)gain_in/gain_out */ + /* sig_out(n) = gain(n) sig_out(n) */ + gain_fx = *gain_prec_fx; + move16(); /*14 */ + FOR( i = 0; i < SubFrameLength; i++ ) + { + temp = mult_r( agc_fac_para_fx, gain_fx ); /*15 +14 -15 =14 */ + gain_fx = add( temp, g0_fx ); /* in Q14 */ + L_temp = L_mult( gain_fx, sig_out_fx[i] ); /*14 + Q_bwe_exc-1 +1 = 14 + Q_bwe_exc */ + L_temp = L_shl_sat( L_temp, 1 ); /*14 + Q_bwe_exc +1 */ + sig_out_fx[i] = round_fx_sat( L_temp ); /*Q_bwe_exc +15 -16 = Q_bwe_exc-1 */ + move16(); + } + *gain_prec_fx = gain_fx; + move16(); + + return; +} + +void PostShortTerm_fx( + Word16 *sig_in, /* i : input signal (pointer to current subframe */ + Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ + Word16 *sig_out, /* o : postfiltered output */ + Word16 *mem_stp, /* i/o: postfilter memory*/ + Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/ + Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/ + Word16 *mem_zero, /* i/o: null memory to compute h_st*/ + const Word16 formant_fac_fx /* i : Strength of post-filter*/ +) +{ + Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/ + Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */ + Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */ + /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */ + Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */ + Word16 tmp; + + parcor0_fx = 0; + move16(); + set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 ); + set16_fx( apond2_fx, 0, LONG_H_ST ); + set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 ); + + /* Obtain post-filter weights */ + tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */ + g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */ + g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */ + + /* Compute weighted LPC coefficients */ + weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER ); + weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER ); + /* o: apond1_fx, apond2_fx in Q12 */ + + /* Compute A(gamma2) residual */ + Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 ); + /* o: sig_ltp_fx in Q_bwe_exc */ + + /* Save last output of 1/A(gamma1) */ + sig_ltp_fx[0] = *ptr_mem_stp; + move16(); + + /* Control short term pst filter gain and compute parcor0 */ + Calc_st_filt_tbe( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero ); + /* o: parcor0 in Q15 */ + /* i/o: sig_ltp_fx in Q_bwe_exc */ + + /* 1/A(gamma1) filtering, mem_stp is updated */ + Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 ); + + /* (1 + mu z-1) tilt filtering */ + filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k ); + /* o: sig_out in Q_bwe_exc */ + + /* gain control */ + scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k ); + + return; +} + +void PostShortTerm_ivas_enc_fx( + Word16 *sig_in, /* i : input signal (pointer to current subframe */ + Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ + Word16 *sig_out, /* o : postfiltered output */ + Word16 *mem_stp, /* i/o: postfilter memory*/ + Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/ + Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/ + Word16 *mem_zero, /* i/o: null memory to compute h_st*/ + const Word16 formant_fac_fx /* i : Strength of post-filter*/ +) +{ + Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/ + Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */ + Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */ + /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */ + Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */ + Word16 tmp; + + parcor0_fx = 0; + move16(); + set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 ); + set16_fx( apond2_fx, 0, LONG_H_ST ); + set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 ); + + /* Obtain post-filter weights */ + tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */ + g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */ + g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */ + + /* Compute weighted LPC coefficients */ + weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER ); + weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER ); + /* o: apond1_fx, apond2_fx in Q12 */ + + /* Compute A(gamma2) residual */ + Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 ); + /* o: sig_ltp_fx in Q_bwe_exc */ + + /* Save last output of 1/A(gamma1) */ + sig_ltp_fx[0] = *ptr_mem_stp; + move16(); + + /* Control short term pst filter gain and compute parcor0 */ + Calc_st_filt_tbe_ivas_enc_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero ); + /* o: parcor0 in Q15 */ + /* i/o: sig_ltp_fx in Q_bwe_exc */ + + /* 1/A(gamma1) filtering, mem_stp is updated */ + syn_filt_fx( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 ); + + /* (1 + mu z-1) tilt filtering */ + filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k ); + /* o: sig_out in Q_bwe_exc */ + + /* gain control */ + scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k ); + + return; +} + +void PostShortTerm_ivas_dec_fx( + Word16 *sig_in, /* i : input signal (pointer to current subframe */ + Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ + Word16 *sig_out, /* o : postfiltered output */ + Word16 *mem_stp, /* i/o: postfilter memory*/ + Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/ + Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/ + Word16 *mem_zero, /* i/o: null memory to compute h_st*/ + const Word16 formant_fac_fx /* i : Strength of post-filter*/ +) +{ + Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/ + Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */ + Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */ + /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */ + Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */ + Word16 tmp; + + parcor0_fx = 0; + move16(); + set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 ); + set16_fx( apond2_fx, 0, LONG_H_ST ); + set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 ); + + /* Obtain post-filter weights */ + tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */ + g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */ + g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */ + + /* Compute weighted LPC coefficients */ + weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER ); + weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER ); + /* o: apond1_fx, apond2_fx in Q12 */ + + /* Compute A(gamma2) residual */ + Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 ); + /* o: sig_ltp_fx in Q_bwe_exc */ + + /* Save last output of 1/A(gamma1) */ + sig_ltp_fx[0] = *ptr_mem_stp; + move16(); + + /* Control short term pst filter gain and compute parcor0 */ + Calc_st_filt_tbe_ivas_dec_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero ); + /* o: parcor0 in Q15 */ + /* i/o: sig_ltp_fx in Q_bwe_exc */ + + /* 1/A(gamma1) filtering, mem_stp is updated */ + Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 ); + + /* (1 + mu z-1) tilt filtering */ + filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k ); + /* o: sig_out in Q_bwe_exc */ + + /* gain control */ + scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k ); + + return; +} + +void flip_spectrum_and_decimby4_fx( + const Word16 input[], /* i : input spectrum Q_inp */ + Word16 output[], /* o : output spectrum Q_inp */ + const Word16 length, /* i : vector length */ + Word16 mem1[], /* i/o : memory Q_inp */ + Word16 mem2[], /* i/o : memory Q_inp */ + const Word16 ramp_flag /*i: flag to trigger slow ramp-up of output following change of core (HQ to ACELP or 12k8 to 16k ACELP) */ +) +{ + Word16 i; + Word16 factor, tmp[L_FRAME16k / 2]; + Word16 tmp1, tmp2; + Word16 input_change[L_FRAME16k]; + + IF( ramp_flag ) + { + factor = div_s( 4, length ); /* Q15 */ + FOR( i = 0; i < length / 4; i += 2 ) + { + tmp1 = extract_l( L_mult0( i, factor ) ); /* Q15 */ + tmp2 = extract_l( L_mult0( add( i, 1 ), factor ) ); /*Q15 */ + input_change[i] = negate( mult_r( input[i], tmp1 ) ); + move16(); + input_change[i + 1] = mult_r( input[i + 1], tmp2 ); + move16(); + } + } + ELSE + { + i = 0; + move16(); + } + + FOR( ; i < length; i = i + 2 ) + { + input_change[i] = negate( input[i] ); + move16(); + input_change[i + 1] = input[i + 1]; + move16(); + } + + Decimate_allpass_steep_fx( input_change, mem1, length, tmp ); + Decimate_allpass_steep_fx( tmp, mem2, shr( length, 1 ), output ); + + return; +} + + +/*==========================================================================*/ +/* FUNCTION : void GenShapedWBExcitation_fx () */ +/*--------------------------------------------------------------------------*/ +/* PURPOSE : Synthesize spectrally shaped highband excitation signal for the wideband */ +/*--------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _Word16 *lpc_shb i : lpc coefficients Q12 */ +/* _Word16 coder_type i : coding type */ +/* _Word16 *bwe_exc_extended i : bwidth extended exciatation Q_bwe_exc*/ +/* _Word16 Q_bwe_exc i : Q format */ +/* _Word16 voice_factors[] i : voicing factor Q15 */ +/*--------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _Word16 *excSHB o : synthesized shaped shb exctiation Q_bwe_exc*/ +/* _Word16 *exc4kWhtnd o : whitened synthesized shb excitation Q_bwe_exc*/ +/*--------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _Word32 *mem_csfilt i/o : memory Q_bwe_exc+16*/ +/* _Word16 *mem_genSHBexc_filt_down1 i/o : memory Q_bwe_exc */ +/* _Word16 *mem_genSHBexc_filt_down2 i/o : memory Q_bwe_exc */ +/* _Word16 *mem_genSHBexc_filt_down3 i/o : memory Q_bwe_exc */ +/* _Word16 *state_lpc_syn i/o : memory Q_bwe_exc */ +/* _Word16 bwe_seed[] i/o : random number generator seed */ +/*--------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*--------------------------------------------------------------------------*/ +/* CALLED FROM : */ +/*==========================================================================*/ + +void GenShapedWBExcitation_ivas_fx( + Word16 *excSHB, /* o : synthesized shaped shb exctiation Q_bwe_exc*/ + const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ + Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q_bwe_exc*/ + Word32 *mem_csfilt, /* i/o : memory Q_bwe_exc+16*/ + Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q_bwe_exc*/ + Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q_bwe_exc*/ + Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q_bwe_exc*/ + Word16 *state_lpc_syn, /* i/o : memory Q_bwe_exc*/ + const Word16 coder_type, /* i : coding type */ + const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q_bwe_exc*/ + const Word16 Q_bwe_exc, + Word16 bwe_seed[], /* i/o : random number generator seed */ + const Word16 voice_factors[], /* i : voicing factor Q15*/ + const Word16 uv_flag, /* i : unvoiced flag */ + const Word16 igf_flag ) +{ + Word16 i, j, k; + Word16 wht_fil_mem[LPC_WHTN_ORDER_WB]; + Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1]; + Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2]; + Word16 Q_R; + Word16 excTmp[L_FRAME16k]; + Word16 excTmp2[L_FRAME16k / 4]; + Word16 excTmp2_frac[L_FRAME16k / 4]; + Word16 exc4k[L_FRAME16k / 4]; + Word16 exc4k_frac[L_FRAME16k / 4]; + Word32 exc4k_32[L_FRAME16k / 4]; + Word32 pow1, pow22; + Word16 scale; + Word32 excNoisyEnv[L_FRAME16k / 4]; + Word16 csfilt_num2[1] = { 1638 }; /* Q15*/ + Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */ + Word32 L_tmp, Ltemp1, Ltemp2; + Word16 temp1, temp2, exp; + Word32 Lmax; + Word16 max_val, n1, n2, sc; + Word32 LepsP[LPC_WHTN_ORDER_WB + 1]; + Word16 tmp_vfac; + Word16 avg_voice_fac; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move16(); +#endif + + /*0.25f*sum_f(voice_factors, NB_SUBFR)*/ + L_tmp = L_mult( voice_factors[0], 8192 /* 0.25 in Q15 */ ); + FOR( i = 1; i < NB_SUBFR; i++ ) + { + L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /* 0.25 in Q15 */ ); + } + avg_voice_fac = round_fx( L_tmp ); + + test(); + test(); + test(); + test(); + IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/ + { + csfilt_num2[0] = 6554; + move16(); /*Q15 -> 0.2f*/ + neg_csfilt_den2[1] = 26214; + move16(); /*Q15 -> 0.8f*/ + } + ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15*/ ) ) ) /*Q15 -> 0.2f*/ + { + csfilt_num2[0] = 328; + move16(); /*Q15 -> 0.01f*/ + neg_csfilt_den2[1] = 32440; + move16(); /*Q15 -> 0.99f*/ + } + set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB ); + Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp ); + flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 ); + + IF( uv_flag ) + { + create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed ); + IF( LT_16( Q_bwe_exc, 5 ) ) + { + + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */ + move16(); + } + } + } + ELSE + { + autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R, + L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 ); + + /* Ensure R[0] isn't zero when entering Levinson Durbin */ + R_l[0] = s_max( R_l[0], 1 ); + move16(); + FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ ) + { + L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); + L_Extract( L_tmp, &R_h[i], &R_l[i] ); + } + + E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL ); + + Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); + + fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4, + LPC_WHTN_ORDER_WB, 0, 3 ); + + /* Ensure pow1 is greater than zero when computing normalization */ + max_val = 0; + move16(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + excTmp2[i] = abs_s( exc4kWhtnd[i] ); + move16(); /* Q_bwe_exc */ + max_val = s_max( max_val, excTmp2[i] ); + move16(); + } + + IF( max_val == 0 ) + { + pow1 = 1; + move16(); + n1 = 0; + move16(); + } + ELSE + { + n1 = norm_s( max_val ); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); // Q_bwe_exc + n1 + move16(); /* Q14 */ + } + n1 = sub( sub( 14, n1 ), Q_bwe_exc ); + pow1 = 1; + move32(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */ + pow1 = L_add_o( pow1, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */ + } + } + + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow ); + move32(); /* Q_bwe_exc+16 */ + *mem_csfilt = Mult_32_16( excNoisyEnv[i], neg_csfilt_den2[1] ); + move32(); /* Q_bwe_exc+16 */ + } + + create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed ); + + /* Ensure pow22 is greater than zero when computing normalization */ + Lmax = 0; + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4k_32[i] = Mult_32_16( excNoisyEnv[i], exc4k[i] ); + move32(); /* Q_bwe_exc+6 */ + Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) ); + } + + IF( Lmax == 0 ) + { + pow22 = 1; + move16(); + n2 = 0; + move16(); + set16_fx( exc4k_frac, 0, L_FRAME16k / 4 ); + } + ELSE + { + n2 = norm_l( Lmax ); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */ + move16(); + } + n2 = 30 - n2 - ( Q_bwe_exc + 6 ); + pow22 = 1; + move32(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */ + pow22 = L_add_o( pow22, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */ + } + } + + test(); + test(); + IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) ) + { + L_tmp = root_a_over_b_fx( pow1, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp ); + scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ + sc = sub( add( n2, Q_bwe_exc ), 14 ); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ + move16(); + } + } + ELSE + { + sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/ + + k = 0; + FOR( i = 0; i < 4; i++ ) + { + test(); + IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) ) + { + /*tmp_vfac = 2*voice_factors[i]; + tmp_vfac = min(1, tmp_vfac);*/ + tmp_vfac = shl_o( voice_factors[i], 1, &Overflow ); + } + ELSE + { + tmp_vfac = voice_factors[i]; + move16(); + } + + Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp ); + temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */ + L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ + Ltemp2 = root_a_over_b_fx( L_tmp, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp ); + temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */ + FOR( j = 0; j < L_FRAME16k / 16; j++ ) + { + L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */ + L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */ + exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */ + move16(); + k++; + } + } + } + } + + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + + return; +} + +void GenShapedWBExcitation_fx( + Word16 *excSHB, /* o : synthesized shaped shb exctiation Q(Q_bwe_exc) */ + const Word16 *lpc_shb, /* i : lpc coefficients Q12 */ + Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q(Q_bwe_exc) */ + Word32 *mem_csfilt, /* i/o : memory Q(Q_bwe_exc+16) */ + Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q(Q_bwe_exc) */ + Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q(Q_bwe_exc) */ + Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q(Q_bwe_exc) */ + Word16 *state_lpc_syn, /* i/o : memory Q(Q_bwe_exc) */ + const Word16 coder_type, /* i : coding type */ + const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q(Q_bwe_exc) */ + const Word16 Q_bwe_exc, /* i : Q for memories */ + Word16 bwe_seed[], /* i/o : random number generator seed */ + const Word16 voice_factors[], /* i : voicing factor Q15 */ + const Word16 uv_flag, /* i : unvoiced flag */ + const Word16 igf_flag ) +{ + Word16 i, j, k; + Word16 wht_fil_mem[LPC_WHTN_ORDER_WB]; + Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1]; + Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2]; + Word16 Q_R; + Word16 excTmp[L_FRAME16k]; + Word16 excTmp2[L_FRAME16k / 4]; + Word16 excTmp2_frac[L_FRAME16k / 4]; + Word16 exc4k[L_FRAME16k / 4]; + Word16 exc4k_frac[L_FRAME16k / 4]; + Word32 exc4k_32[L_FRAME16k / 4]; + Word32 pow1, pow22; + Word16 scale; + Word32 excNoisyEnv[L_FRAME16k / 4]; + Word16 csfilt_num2[1] = { 1638 }; /* Q15*/ + Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */ + Word32 L_tmp, Ltemp1, Ltemp2; + Word16 temp1, temp2, exp; + Word32 Lmax; + Word16 max_val, n1, n2, sc; + Word32 LepsP[LPC_WHTN_ORDER_WB + 1]; + Word16 tmp_vfac; + Word16 avg_voice_fac; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + move16(); + move16(); + move16(); + + /*0.25f*sum_f(voice_factors, NB_SUBFR)*/ + L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ ); + FOR( i = 1; i < NB_SUBFR; i++ ) + { + L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /*0.25 in Q15 */ ); + } + avg_voice_fac = round_fx( L_tmp ); + + test(); + test(); + test(); + test(); + IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/ + { + csfilt_num2[0] = 6554; + move16(); /*Q15 -> 0.2f*/ + neg_csfilt_den2[1] = 26214; + move16(); /*Q15 -> 0.8f*/ + } + ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) ) /*Q15 -> 0.2f*/ + { + csfilt_num2[0] = 328; + move16(); /*Q15 -> 0.01f*/ + neg_csfilt_den2[1] = 32440; + move16(); /*Q15 -> 0.99f*/ + } + set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB ); + Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp ); + flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 ); + + IF( uv_flag ) + { + create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed ); + IF( LT_16( Q_bwe_exc, 5 ) ) + { + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */ + move16(); + } + } + } + ELSE + { + autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R, + L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 ); + + /* Ensure R[0] isn't zero when entering Levinson Durbin */ + R_l[0] = s_max( R_l[0], 1 ); + move16(); + FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ ) + { + L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); + L_Extract( L_tmp, &R_h[i], &R_l[i] ); + } + + E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL ); + + Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); + + fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4, + LPC_WHTN_ORDER_WB, 0, 3 ); + + /* Ensure pow1 is greater than zero when computing normalization */ + max_val = 0; + move16(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + excTmp2[i] = abs_s( exc4kWhtnd[i] ); + move16(); /* Q_bwe_exc */ + max_val = s_max( max_val, excTmp2[i] ); + move16(); + } + + IF( max_val == 0 ) + { + pow1 = 1; + move16(); + n1 = 0; + move16(); + } + ELSE + { + n1 = norm_s( max_val ); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); + move16(); /* Q14 */ + } + n1 = sub( sub( 14, n1 ), Q_bwe_exc ); + pow1 = 1; + move32(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */ + pow1 = L_add_o( pow1, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */ + } + } + + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow ); + move32(); /* Q_bwe_exc+16 */ + *mem_csfilt = Mpy_32_16_1( excNoisyEnv[i], neg_csfilt_den2[1] ); + move32(); /* Q_bwe_exc+16 */ + } + + create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed ); + + /* Ensure pow22 is greater than zero when computing normalization */ + Lmax = 0; + move32(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4k_32[i] = Mpy_32_16_1( excNoisyEnv[i], exc4k[i] ); + move32(); /* Q_bwe_exc+6 */ + Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) ); + } + + IF( Lmax == 0 ) + { + pow22 = 1; + move16(); + n2 = 0; + move16(); + set16_fx( exc4k_frac, 0, L_FRAME16k / 4 ); + } + ELSE + { + n2 = norm_l( Lmax ); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */ + move16(); + } + n2 = sub( sub( 30, n2 ), add( Q_bwe_exc, 6 ) ); + pow22 = 1; + move32(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */ + pow22 = L_add_o( pow22, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */ + } + } + + test(); + test(); + IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /*0.2 in Q15 */ ) ) ) + { + L_tmp = root_a_over_b_fx( pow1, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp ); + scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ + sc = sub( add( n2, Q_bwe_exc ), 14 ); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ + move16(); + } + } + ELSE + { + sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/ + + k = 0; + move16(); + FOR( i = 0; i < 4; i++ ) + { + test(); + IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) ) + { + /*tmp_vfac = 2*voice_factors[i]; + tmp_vfac = min(1, tmp_vfac);*/ + tmp_vfac = shl_o( voice_factors[i], 1, &Overflow ); + } + ELSE + { + tmp_vfac = voice_factors[i]; + move16(); + } + + Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp ); + temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */ + L_tmp = Mpy_32_16_1( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ + Ltemp2 = root_a_over_b_fx( L_tmp, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp ); + temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */ + FOR( j = 0; j < L_FRAME16k / 16; j++ ) + { + L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */ + L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */ + exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */ + move16(); + k = add( k, 1 ); + } + } + } + } + + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + + + return; +} + +/*-------------------------------------------------------------------* + * GenWBSynth() + * + * Generate 16 KHz sampled highband component from synthesized highband + *-------------------------------------------------------------------*/ + +void GenWBSynth_fx( + const Word16 *input_synspeech, /* i : input synthesized speech Qx*/ + Word16 *shb_syn_speech_16k, /* o : output highband compnent Qx*/ + Word16 *state_lsyn_filt_shb1, /* i/o: memory Qx*/ + Word16 *state_lsyn_filt_shb2 /* i/o: memory Qx*/ +) +{ + Word16 speech_buf_16k1[L_FRAME16k], speech_buf_16k2[L_FRAME16k]; + Word16 i, maxm, nor; + Word16 input_synspeech_temp[L_FRAME16k / 4]; + + maxm = 0; + move16(); + FOR( i = 0; i < L_FRAME16k / 4; i++ ) + { + maxm = s_max( maxm, abs_s( input_synspeech[i] ) ); + } + FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) + { + maxm = s_max( maxm, abs_s( state_lsyn_filt_shb1[i] ) ); + } + FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) + { + maxm = s_max( maxm, abs_s( state_lsyn_filt_shb2[i] ) ); + } + + nor = s_max( sub( norm_s( maxm ), 3 ), 0 ); /* Headroom = 3 */ + IF( maxm == 0 ) + nor = 15; + move16(); + + Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k / 4, nor ); + Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, nor ); + Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, nor ); + Interpolate_allpass_steep_fx( input_synspeech_temp, state_lsyn_filt_shb1, L_FRAME16k / 4, speech_buf_16k1 ); + Interpolate_allpass_steep_fx( speech_buf_16k1, state_lsyn_filt_shb2, L_FRAME16k / 2, speech_buf_16k2 ); + flip_spectrum_fx( speech_buf_16k2, shb_syn_speech_16k, L_FRAME16k ); + + Scale_sig( shb_syn_speech_16k, L_FRAME16k, negate( nor ) ); + Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) ); + Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) ); + + return; +} + + +void find_td_envelope_fx( + const Word16 inp[], /* i : input signal Qx */ + const Word16 len, /* i : length of the input signal */ + const Word16 len_h, /* i : length of the MA filter */ + Word16 mem_h[], /* i/o: memory of the MA filter, length len_h/2 Qx */ + Word16 out[] /* o : td envelope of the input signal Qx */ +) +{ + Word16 k, K; + Word16 buf_in[L_FRAME16k + MAX_LEN_MA_FILTER], *p_in, *p_out, *p_prev, w; + Word16 tmp1, tmp2; + + assert( len > 0 && len <= L_FRAME16k ); + + // len_h is 20 at all calling locations + K = 10; /* length of FIR filter memory = half of the total filter length */ + move16(); + w = 1639; /* 1 / 20 in Q15 */ /* MA filtering coefficient */ + move16(); + + /* copy filter memory to the input buffer */ + IF( mem_h != NULL ) + { + Copy( mem_h, buf_in, K ); + } + ELSE + { + /* no memory available, use the first len_h/2 samples as memory */ + p_in = buf_in; + FOR( k = 0; k < K; k++ ) + { + *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */ + move16(); + } + } + + /* take the absolute value of the input signal and copy it to the input buffer */ + /* multiply each value by 1 / filter length */ + p_in = &buf_in[K]; + FOR( k = 0; k < len; k++ ) + { + *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */ + move16(); + } + + /* update filter memory from the end of the input buffer */ + IF( mem_h != NULL ) + { + Copy( &buf_in[len], mem_h, K ); + } + + /* do MA filtering */ + out[0] = sum16_fx( buf_in, len_h ); + move16(); + p_out = &buf_in[0]; /* pointer to leaving sample */ + p_in = &buf_in[len_h]; /* pointer to entering sample*/ + FOR( k = 1; k < len - K; k++ ) + { + tmp1 = *p_out++; + move16(); + tmp2 = *p_in++; + move16(); + out[k] = add( sub( out[k - 1], tmp1 ), tmp2 ); /* Qx */ + move16(); + } + + /* use IIR filtering to extrapolate the last K samples */ + p_in = &buf_in[len - K]; + p_out = &out[len - K]; + p_prev = p_out - 1; + FOR( k = 0; k < K; k++ ) + { + tmp1 = *p_in++; + move16(); + tmp2 = *p_prev++; + move16(); + *p_out++ = add( mult_r( 1638 /* 0.05f in Q15 */, ( tmp1 ) ), mult_r( 31130 /* 0.95f in Q15 */, ( tmp2 ) ) ); + move16(); + } + + return; +} + + +/*======================================================================================*/ +/* FUNCTION : void GenShapedSHBExcitation_fx () */ +/*--------------------------------------------------------------------------------------*/ +/* PURPOSE : Synthesize spectrally shaped highband excitation signal */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _(Word16) coder_type : coding type Q_bwe_exc */ +/* _(Word16) bwidth : input signal bwidth Q0 */ +/* _(Word16*) bwe_exc_extended :bwidth extended exciatation Q_bwe_exc */ +/* _(Word16[]) voice_factors :voicing factors Q15 */ +/* _(Word16*) lpc_shb :lpc coefficients Q12 */ +/* _(Word16*) Q_bwe_exc :Q Format of bwe_exc_extended */ +/* _(Word16) L_frame : Frame length - determines whether 12.8 or 16kHz core */ +/* _(Word16) last_L_frame : last L_frame */ +/*--------------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _(Word16*)excSHB :synthesized shaped shb excitation Q_bwe_exc */ +/* _(Word16*)White_exc16k :white excitation for the Fullband extension Q_bwe_exc */ +/* _(Word16*)slope :slope +ve (high freq > low freq), -ve or neutral Q12 */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _(Word16*)mem_csfilt :memory */ +/* _(Word16*)mem_genSHBexc_filt_down_shb :memory */ +/* _(Word16*)state_lpc_syn :memory */ +/* _(Word16[]) bwe_seed :random number generator seed */ +/* _(Word16[]) lpf_14k_mem :memory */ +/* _(Word32[])Hilbert_Mem :memory */ +/*--------------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*--------------------------------------------------------------------------------------*/ +/* CALLED FROM : RX */ +/*======================================================================================*/ +void GenShapedSHBExcitation_fx( + Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ + const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ + Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc */ + Word32 *mem_csfilt, /* i/o: memory */ + Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */ + Word16 *state_lpc_syn, /* i/o: memory */ + const Word16 coder_type, /* i : coding type */ + const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */ + Word16 bwe_seed[], /* i/o: random number generator seed */ + Word16 voice_factors[], /* i : voicing factor*/ + const Word16 extl, /* i : extension layer */ + Word16 *tbe_demph, /* i/o: de-emphasis memory */ + Word16 *tbe_premph, /* i/o: pre-emphasis memory */ + Word16 *lpc_shb_sf, /* i: LP coefficients */ + const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */ + Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */ + Word16 *shb_res, + Word16 *vf_ind, + const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */ + Word16 fb_state_lpc_syn[], /* i/o: memory */ + Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */ + Word16 *Q_bwe_exc, + Word16 *Q_bwe_exc_fb, + const Word16 Q_shb, + Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ + Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ + const Word32 bitrate, + const Word16 prev_bfi +#ifdef ADD_IVAS_TBE_CODE + , /* i : previous frame was concealed */ + const Word16 element_mode, /* i : element mode */ + const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ + Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ + Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ + const Word32 extl_brate, /* i : extension layer bitarte */ + const Word16 MSFlag, /* i : Multi Source flag */ + Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ + Word16 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ + Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ + Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ + Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ +#endif +) +{ + Word16 i, j, k; + Word16 wht_fil_mem[LPC_WHTN_ORDER]; + Word16 lpc_whtn[LPC_WHTN_ORDER + 1]; + Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */ + Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */ + Word16 Q_R; + Word32 LepsP[LPC_WHTN_ORDER + 1]; + Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k]; + Word32 pow1, pow22; + Word16 scale, temp1, temp2; + + Word16 excTmp2[L_FRAME16k]; + Word16 *White_exc16k; + Word16 excNoisyEnv[L_FRAME16k]; + Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ + move16(); + Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ + move16(); + move16(); + Word16 varEnvShape; + Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ + move16(); + Word16 exc16kWhtnd[L_FRAME16k]; + + Word32 L_tmp; + Word16 vf_tmp; + Word16 tmp, exp, tmp2; + Word16 voiceFacEst[NB_SUBFR16k]; + Word16 zero_mem[LPC_SHB_ORDER]; + Word32 syn_shb_ener_sf[4]; + Word16 tempSHB[80]; + Word16 Q_pow1, Q_pow22; + + Word32 L_tmp2, L_tmp3, L_tmp4; + Word16 temp; + + Word16 White_exc16k_FB_temp[L_FRAME16k]; + Word32 White_exc16k_32[L_FRAME16k]; + Word16 Q_temp; + Word16 prev_Q_bwe_exc_fb; + +#ifdef ADD_IVAS_TBE_CODE + Word32 tempD; + Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; + Word16 cbsize; + Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; + Word16 c0, c1, c2, c3, c4, c5, g1, g2, g, den; + Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; + Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; + Word16 flag_plosive; + Word16 delta; + Word16 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; + + mix_factor = 0.0f; +#endif + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); + set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); + + FOR( i = 0; i < L_FRAME32k; i = i + 2 ) + { + exc32k[i] = negate( bwe_exc_extended[i] ); + move16(); + exc32k[i + 1] = bwe_exc_extended[i + 1]; + move16(); + } + + /* Decimate by 2 */ + Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); + /* i: exc32k in Q_bwe_exc */ + /* o: exc16k in Q_bwe_exc */ + + autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); + /* Ensure R[0] isn't zero when entering Levinson Durbin */ + R_l[0] = s_max( R_l[0], 1 ); + move16(); + FOR( i = 1; i <= LPC_WHTN_ORDER; i++ ) + { + L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); + L_Extract( L_tmp, &R_h[i], &R_l[i] ); + } + E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL ); + Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); + fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); + + /* i: exc16k in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc */ + +#ifdef ADD_IVAS_TBE_CODE + IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) +#else + IF( GE_32( bitrate, ACELP_24k40 ) ) +#endif + { + temp2 = 0; + move16(); + FOR( j = 0; j < 4; j++ ) + { + temp1 = shb_res_gshape[j]; + move16(); + FOR( i = 0; i < 80; i++ ) + { + exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); + move16(); + /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ + } + temp2 = add( temp2, 80 ); + } + } + + /* Estimate pow1 associated with Low band nonlinear extended excitation */ + /* pow1=0.00001f */ + tmp = sub( shl( *Q_bwe_exc, 1 ), 31 ); + pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/ + excTmp2[k] = abs_s( exc16kWhtnd[k] ); + move16(); + + /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */ + pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */ + } + Q_pow1 = shl( *Q_bwe_exc, 1 ); + + test(); +#ifdef ADD_IVAS_TBE_CODE + IF( EQ_16( flag_ACELP16k, 0 ) ) +#else + IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) +#endif + { + /* varEnvShape = mean_fx(voice_factors, 4); */ + /* unroll the loop */ + L_tmp = L_mult( voice_factors[0], 8192 ); + L_tmp = L_mac( L_tmp, voice_factors[1], 8192 ); + L_tmp = L_mac( L_tmp, voice_factors[2], 8192 ); + varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 ); /* varEnvShape in Q15 */ + } + ELSE /* 16k core */ + { + /* varEnvShape = mean_fx(voice_factors, 5); */ + /* unroll the loop */ + L_tmp = L_mult( voice_factors[0], 6554 ); + L_tmp = L_mac( L_tmp, voice_factors[1], 6554 ); + L_tmp = L_mac( L_tmp, voice_factors[2], 6554 ); + L_tmp = L_mac( L_tmp, voice_factors[3], 6554 ); + varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 ); /* varEnvShape in Q15 */ + } + + IF( EQ_16( extl, FB_TBE ) ) + { + /*pow(varEnvShape,3) */ + tmp = mult_r( varEnvShape, varEnvShape ); + tmp = mult_r( tmp, varEnvShape ); + + /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */ + fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp ); + fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ ); + } + + /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */ + varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape ); + + /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */ + varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ ); + varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ ); + varEnvShape = shl( varEnvShape, 1 ); + csfilt_num2[0] = sub( MAX_16, varEnvShape ); + move16(); + neg_csfilt_den2[1] = varEnvShape; + move16(); + + test(); + test(); + test(); +#ifdef ADD_IVAS_TBE_CODE + IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) +#else + IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) +#endif + { + /* pre-init smoothing filter to avoid energy drop outs */ + L_tmp = L_mult( excTmp2[0], 1638 ); + FOR( i = 1; i < L_SUBFR16k / 4; i++ ) + { + L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/ + } + /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */ + + /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */ + /* rather stick to the more conservative approach, to avoid potential clippings */ + test(); + IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) ) + { + /* use weak smoothing for 1st frame after switching to make filter recover more quickly */ + varEnvShape = 26214 /*0.8f Q15*/; + move16(); + csfilt_num2[0] = sub( MAX_16, varEnvShape ); + move16(); + neg_csfilt_den2[1] = varEnvShape; + move16(); + } + + *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); + move32(); + } +#ifdef ADD_IVAS_TBE_CODE + if ( MSFlag > 0 ) + { + varEnvShape = 0.995f; + csfilt_num2[0] = 1.0f - varEnvShape; + csfilt_den2[1] = -varEnvShape; + } + + White_exc16k = exc16k; + + /* Track the low band envelope */ + if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) + { + if ( extl_brate != SWB_TBE_1k10 && extl_brate != SWB_TBE_1k75 ) + { + mem_csfilt_left = 0.0f; + mem_csfilt_right = 0.0f; + for ( k = 0; k < L_FRAME16k; k++ ) + { + excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; + mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; + excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; + mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; + } + + alpha = 0.0f; + step = 1.0f / L_FRAME16k; + for ( k = 0; k < L_FRAME16k; k++ ) + { + excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + ( 1 - alpha ) * excNoisyEnvRight[k]; + alpha += step; + } + } + } + else +#endif + { + /* Track the low band envelope */ + L_tmp = *mem_csfilt; + move32(); + FOR( i = 0; i < L_FRAME16k; i++ ) + { + excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], excTmp2[i] ); + move16(); + /* excNoisyEnv : Q_bwe_exc, + *mem_csfilt: Q_bwe_exc+16, excTmp2: Q_bwe_exc, csfilt_num2[0] Q15 */ + L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_bwe_exc+16 */ + } + *mem_csfilt = L_tmp; + move32(); + } +#ifdef ADD_IVAS_TBE_CODE + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + /* generate gaussian (white) excitation */ + for ( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k[k] = (float) own_random( &bwe_seed[0] ); + } + + /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ + pow22 = POW_EXC16k_WHTND; + v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), White_exc16k, L_FRAME16k ); + } + else +#endif + { + /* create a random excitation - Reuse exc16k memory */ + White_exc16k = exc16k; + create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); + create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); + + L_tmp = L_deposit_l( 0 ); + tmp = add( *Q_bwe_exc, 1 ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp ); + if ( excNoisyEnv[k] != 0 ) + { + L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_bwe_exc) +5 +1*/ + } + White_exc16k_32[k] = L_tmp4; + move32(); + L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); + } + Q_temp = norm_l( L_tmp ); + if ( L_tmp == 0 ) + { + Q_temp = 31; + move16(); + } + /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ + /* White_exc16k in Q6 */ + + /* calculate pow22 */ + /* pow22=0.00001f */ + tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 ); + pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc-NOISE_QADJ) */ + tmp = sub( NOISE_QFAC, 5 ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + /* White_exc16k[k] *= excNoisyEnv[k]; */ + White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) ); + move16(); + /* i: excNoisyEnv in (Q_bwe_exc) */ + /* i: White_exc16k in Q6 */ + /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */ + /* pow22 += White_exc16k[k] * White_exc16k[k]; */ + pow22 = L_mac0_sat( pow22, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_bwe_exc-NOISE_QADJ)*/ + } + /*Q_pow22 = sub( shl(*Q_bwe_exc,1), 18 );*/ + Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ); + } + +#ifdef ADD_IVAS_TBE_CODE + flag_plosive = 0; + move16(); + test(); + test(); + test(); + IF(GE_32(extl_brate, SWB_TBE_2k8) || EQ_32(extl_brate, SWB_TBE_1k10) || EQ_32(extl_brate, SWB_TBE_1k75))) +#else + IF( GE_32( bitrate, ACELP_24k40 ) ) +#endif + { + IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ + { +#ifdef ADD_IVAS_TBE_CODE + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ + find_td_envelope( White_exc16k, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); + find_td_envelope( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); + + for ( k = 0; k < L_FRAME4k; k++ ) + { + EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; + EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; + } + + /* calculate the optimal mix factor */ + c0 = c1 = c2 = c3 = c4 = c5 = 0.0f; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + + c0 += c0_part[i]; + c1 += c1_part[i]; + c2 += c2_part[i]; + c3 += c3_part[i]; + c4 += c4_part[i]; + c5 += c5_part[i]; + } + + den = 4.0f * c0 * c2 - c4 * c4; + g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; + g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; + + *Env_error = 0.0f; + flag_plosive = 0; + for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; + *Env_error += Env_error_part[i]; + + if ( Env_error_part[i] > THR_ENV_ERROR_PLOSIVE ) + { + /* envelope error is too high -> likely a plosive */ + flag_plosive = 1; + } + } + + if ( flag_plosive ) + { + /* plosive detected -> set the mixing factor to 0 */ + *vf_ind = 0; + mix_factor = 0.0f; + } + else + { + /* normalize gain */ + g = g2 / ( g1 + g2 ); + + /* quantization of the mixing factor */ + cbsize = 1 << NUM_BITS_SHB_VF; + delta = 1.0f / ( cbsize - 1 ); + if ( g > 1.0f ) + { + g = 1.0f; + } + else if ( g < delta ) + { + /* prevent low gains to be quantized to 0 as this is reserved for plosives */ + g = delta; + } + + *vf_ind = usquant( g, &mix_factor, 0.0f, 1.0f / ( cbsize - 1 ), cbsize ); + } + } + else +#endif + { + Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, + ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); + tmp = voiceFacEst[0]; + move16(); + tmp2 = MAX_16; + move16(); + if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) + { + tmp2 = 26214 /*0.8f Q15*/; + move16(); + } + } + } + ELSE /* decoder side */ + { +#ifdef ADD_IVAS_TBE_CODE + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + if ( *vf_ind == 0 ) + { + mix_factor = 0.0f; + flag_plosive = 1; + } + else + { + mix_factor = usdequant( *vf_ind, 0.0f, 1.0f / ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); + } + } + else +#endif + { + /* *vf_ind is an integer scale by 0.125f*/ + tmp = shl( *vf_ind, ( 15 - 3 ) ); + tmp2 = MAX_16; + move16(); + if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) + { + tmp2 = 26214 /*0.8f Q15*/; + move16(); + } + } + } +#ifdef ADD_IVAS_TBE_CODE + IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) +#endif + { + voice_factors[0] = mult_r( voice_factors[0], tmp2 ); + move16(); + voice_factors[1] = mult_r( voice_factors[1], tmp2 ); + move16(); + voice_factors[2] = mult_r( voice_factors[2], tmp2 ); + move16(); + voice_factors[3] = mult_r( voice_factors[3], tmp2 ); + move16(); + voice_factors[4] = mult_r( voice_factors[4], tmp2 ); + move16(); + } + } +#ifdef ADD_IVAS_TBE_CODE + if ( element_mode >= IVAS_CPE_DFT && nlExc16k != NULL ) + { + /* save buffers for IC-BWE */ + mvr2r( exc16kWhtnd, nlExc16k, L_FRAME16k ); + v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), mixExc16k, L_FRAME16k ); + } +#endif + + tmp = sub( Q_temp, 3 ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ + } + prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; + move16(); + *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); + move16(); + deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); + /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ + /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ +#ifdef ADD_IVAS_TBE_CODE + if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) + { + if ( !flag_plosive ) /* use only LB excitation in case of plosives */ + { + /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ + old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); + new_scale = 1.0f; + step_scale = ( new_scale - old_scale ) / ( L_FRAME16k / 2 ); + scale = old_scale; + + /* interpolate between the old and the new value of the mixing factor */ + old_fact = *prev_mix_factor; + new_fact = mix_factor; + step = ( new_fact - old_fact ) / ( L_FRAME16k / 2 ); + fact = old_fact; + + /* mixing of LB and gaussian excitation in the first half of the frame */ + for ( k = 0; k < L_FRAME16k / 2; k++ ) + { + exc16kWhtnd[k] = (float) fact * ( White_exc16k[k] * scale ) + (float) ( 1 - fact ) * exc16kWhtnd[k]; + fact += step; + scale += step_scale; + } + + /* mixing of LB and gaussian excitation in the second half of the frame */ + for ( ; k < L_FRAME16k; k++ ) + { + exc16kWhtnd[k] = (float) new_fact * White_exc16k[k] + (float) ( 1 - new_fact ) * exc16kWhtnd[k]; + } + } + preemph( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + } + else +#endif + { +#ifdef ADD_IVAS_TBE_CODE + if ( coder_type == UNVOICED || MSFlag == 1 ) +#else + IF( EQ_16( coder_type, UNVOICED ) ) +#endif + { + L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); + scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */ + L_tmp = L_mult( White_exc16k[k], scale ); + /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ + exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); + move16(); + /* exc16kWhtnd: Q_bwe_exc */ + } + PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + /* i/o: exc16kWhtnd (Q_bwe_exc) */ + /* i/o: tbe_premph (Q_bwe_exc) */ + } + ELSE + { + Word16 nbSubFr, lSubFr; + Word16 tempQ15; + Word32 tempQ31; + /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/ + nbSubFr = NB_SUBFR16k; + lSubFr = ( L_FRAME16k / NB_SUBFR16k ); + IF( LT_32( bitrate, ACELP_24k40 ) ) + { + nbSubFr = NB_SUBFR; + move16(); + lSubFr = ( L_FRAME16k / NB_SUBFR ); + move16(); + } + k = 0; + FOR( i = 0; i < nbSubFr; i++ ) + { + test(); + IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) + { + exp = 0; + move16(); + tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ + temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + exp = 0; + move16(); + tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ + temp = sub( MAX_16, temp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } + ELSE + { + /* Adjust noise mixing for formant sharpening filter */ + tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); + /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ + vf_tmp = sub( MAX_16, tempQ15 ); + vf_tmp = mult_r( voice_factors[i], vf_tmp ); + + exp = 0; + move16(); + tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ + temp = sub( MAX_16, vf_tmp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } + + FOR( j = 0; j < lSubFr; j++ ) + { + /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ + L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/ + L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */ + exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); + move16(); + /* Q_bwe_exc */ + } + k = add( k, lSubFr ); + + /* estimate the pre-emph factor */ + tempQ15 = sub( MAX_16, voice_factors[i] ); + exp = 0; + move16(); + temp = Sqrt16( tempQ15, &exp ); + temp = shl( temp, exp - 1 ); + + temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ + temp = div_s( temp, temp2 ); /* Q15 */ + temp = mult_r( PREEMPH_FAC, temp ); + + PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); + /* exc16kWhtnd: Q_bwe_exc; + tbe_premph: Q_bwe_exc*/ + } + } + } + +#ifdef ADD_IVAS_TBE_CODE + IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) +#else + IF( LT_32( bitrate, ACELP_24k40 ) ) +#endif + { + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: excSHB in Q_bwe_exc */ + } + ELSE + { + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); + + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: tempSHB in Q_bwe_exc */ + /* o: syn_shb_ener_sf in (2*Q_bwe_exc+1) */ + IF( LE_32( bitrate, ACELP_32k ) ) + { + L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); + + /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ + tmp = shl( Q_shb, 1 ); + tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 ); + L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ + + *Q_bwe_exc = sub( *Q_bwe_exc, exp ); + move16(); /* compensate for the exp shift */ + tmp2 = add( prev_Q_bwe_syn, n_mem2 ); + IF( GT_16( *Q_bwe_exc, tmp2 ) ) + { + L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); + *Q_bwe_exc = tmp2; + move16(); + } + FOR( i = 0; i < L_FRAME16k; i++ ) + { + L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ + exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ + move16(); + } + } + /* i: L_tmp2 in (Q31-exp) */ + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ + + /* Rescale the past memories: LP synth and SHB look ahead buffers */ + tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); + FOR( i = 0; i < LPC_SHB_ORDER; i++ ) + { + state_lpc_syn[i] = shl( state_lpc_syn[i], tmp ); + move16(); + } + FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) + { + excSHB[i] = shl( excSHB[i], tmp ); + move16(); + } + /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ + + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in (Q_bwe_exc) */ + /* o: excSHB in (Q_bwe_exc) */ + } + + IF( EQ_16( extl, FB_TBE ) ) + { + tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); + Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); + Scale_sig( fb_tbe_demph, 1, tmp ); + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); + /* i: White_exc16k_FB in (14-n2) */ + /* o: White_exc16k_FB_temp in (14-n2) */ + + FOR( i = 0; i < 10; i++ ) + { + FOR( j = 0; j < 32; ++j ) + { + White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); + move16(); + } + } + + *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); + move16(); /**Q_bwe_exc_fb +35 +1 -16*/ + flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); + + deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); + } + ELSE + { + set16_fx( White_exc16k_FB, 0, L_FRAME16k ); + } + +#ifdef ADD_IVAS_TBE_CODE + *prev_pow_exc16kWhtnd = pow1; + *prev_mix_factor = mix_factor; +#endif + return; +} + +void GenShapedSHBExcitation_ivas_enc_fx( + Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ + const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ + Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc_fb */ + Word32 *mem_csfilt, /* i/o: memory */ + Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */ + Word16 *state_lpc_syn, /* i/o: memory */ + const Word16 coder_type, /* i : coding type */ + const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */ + Word16 bwe_seed[], /* i/o: random number generator seed */ + Word16 voice_factors[], /* i : voicing factor*/ + const Word16 extl, /* i : extension layer */ + Word16 *tbe_demph, /* i/o: de-emphasis memory */ + Word16 *tbe_premph, /* i/o: pre-emphasis memory */ + Word16 *lpc_shb_sf, /* i: LP coefficients */ + const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */ + Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */ + Word16 *shb_res, + Word16 *vf_ind, + const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */ + Word16 fb_state_lpc_syn[], /* i/o: memory */ + Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */ + Word16 *Q_bwe_exc, + Word16 *Q_bwe_exc_fb, + const Word16 Q_shb, + Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ + Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ + const Word32 bitrate, + const Word16 prev_bfi, + const Word16 element_mode, /* i : element mode */ + const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ + Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ + Word16 *nlExc16k_e, /* i/o: exp of nlExc16k */ + Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ + Word16 *mixExc16k_e, /* i/o: exp of mixExc16k_fx */ + const Word32 extl_brate, /* i : extension layer bitarte */ + const Word16 MSFlag, /* i : Multi Source flag */ + Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ + Word16 Q_EnvSHBres_4k, + Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ + Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ + Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ + Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ +) +{ + Word16 i, j, k; + Word16 wht_fil_mem[LPC_WHTN_ORDER]; + Word16 lpc_whtn[LPC_WHTN_ORDER + 1]; + Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */ + Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */ + Word16 Q_R; + Word32 LepsP[LPC_WHTN_ORDER + 1]; + Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k]; + Word32 pow1, pow22; + Word16 scale, temp1, temp2, temp3; + + Word16 excTmp2[L_FRAME16k]; + Word16 *White_exc16k; + Word16 Q_White_exc16k; + Word16 excNoisyEnv[L_FRAME16k]; + Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ + move16(); + Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ + move16(); + move16(); + Word16 varEnvShape; + Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ + Word16 exc16kWhtnd[L_FRAME16k]; + + Word32 L_tmp; + Word16 vf_tmp; + Word16 tmp, exp, tmp2 = 0; + move16(); + Word16 voiceFacEst[NB_SUBFR16k]; + Word16 zero_mem[LPC_SHB_ORDER]; + Word32 syn_shb_ener_sf[4]; + Word16 syn_shb_ener_sf_q[4]; + Word16 tempSHB[80]; + Word16 Q_pow1, Q_pow22; + + Word32 L_tmp2, L_tmp3, L_tmp4; + Word16 temp; + + Word16 White_exc16k_FB_temp[L_FRAME16k]; + Word32 White_exc16k_32[L_FRAME16k]; + Word16 White_exc16k_tmp[L_FRAME16k]; + Word16 prev_Q_bwe_exc_fb; + + Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; + Word16 cbsize; + Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; + Word32 c0, c1, c2, c3, c4, c5, den; + Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e; + Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; + Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; + Word16 flag_plosive; + Word16 delta; + Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; + Word64 W_tmp; + + mix_factor = 0; /* Q15 */ + move16(); + + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); + set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); + FOR( i = 0; i < L_FRAME32k; i = i + 2 ) + { + exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc + move16(); + exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc + move16(); + } + + /* Decimate by 2 */ + Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc + /* i: exc32k in Q_bwe_exc */ + /* o: exc16k in Q_bwe_exc */ + + autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R + /* Ensure R[0] isn't zero when entering Levinson Durbin */ + R_l[0] = s_max( R_l[0], 1 ); + move16(); + FOR( i = 1; i <= LPC_WHTN_ORDER; i++ ) + { + L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); + L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R + } + E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL ); + Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12 + fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc + + /* i: exc16k in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc */ + + IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) + { + temp2 = 0; + move16(); + FOR( j = 0; j < 4; j++ ) + { + temp1 = shb_res_gshape[j]; + move16(); + FOR( i = 0; i < 80; i++ ) + { + exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc + move16(); + /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ + } + temp2 = add( temp2, 80 ); + } + } + + /* Estimate pow1 associated with Low band nonlinear extended excitation */ + /* pow1=0.00001f */ + tmp = sub( shl( *Q_bwe_exc, 1 ), 31 ); + W_tmp = W_shl( 21475 /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/ + excTmp2[k] = abs_s( exc16kWhtnd[k] ); + move16(); + + /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */ + W_tmp = W_mac_16_16( W_tmp, exc16kWhtnd[k], exc16kWhtnd[k] ); // 2*Q_bwe_exc+1 + } + exp = W_norm( W_tmp ); + pow1 = W_extract_h( W_shl( W_tmp, exp ) ); // 2*Q_bwe_exc+1+exp-32 = // tmp+exp + Q_pow1 = add( tmp, exp ); + + IF( flag_ACELP16k == 0 ) + { + /* varEnvShape = mean_fx(voice_factors, 4); */ + /* unroll the loop */ + L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ ); + varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */ + } + ELSE /* 16k core */ + { + /* varEnvShape = mean_fx(voice_factors, 5); */ + /* unroll the loop */ + L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ ); + varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */ + } + + IF( EQ_16( extl, FB_TBE ) ) + { + /*pow(varEnvShape,3) */ + tmp = mult_r( varEnvShape, varEnvShape ); + tmp = mult_r( tmp, varEnvShape ); + + /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */ + fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp ); + fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ ); + } + + /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */ + varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape ); + + /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */ + varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ ); + varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ ); + varEnvShape = shl( varEnvShape, 1 ); + csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15 + move16(); + neg_csfilt_den2[1] = varEnvShape; // Q15 + move16(); + + test(); + test(); + test(); + test(); + IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) + { + /* pre-init smoothing filter to avoid energy drop outs */ + L_tmp = L_mult( excTmp2[0], 1638 ); + FOR( i = 1; i < L_SUBFR16k / 4; i++ ) + { + L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/ + } + /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */ + + /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */ + /* rather stick to the more conservative approach, to avoid potential clippings */ + test(); + IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) ) + { + /* use weak smoothing for 1st frame after switching to make filter recover more quickly */ + varEnvShape = 26214 /*0.8f Q15*/; + move16(); + csfilt_num2[0] = sub( MAX_16, varEnvShape ); + move16(); + neg_csfilt_den2[1] = varEnvShape; + move16(); + } + + *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); + move32(); + } + + IF( MSFlag > 0 ) + { + // varEnvShape = 0.995f; + varEnvShape = 32604; + move16(); + csfilt_num2[0] = 32768 - varEnvShape; + // csfilt_num2[0] = sub( 32767, varEnvShape ); + move16(); + neg_csfilt_den2[1] = varEnvShape; + move16(); + } + + White_exc16k = exc16k; + Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); + IF( *mem_csfilt ) + { + Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) ); + } + test(); + /* Track the low band envelope */ + IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + test(); + IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) + { + mem_csfilt_left = 0; + mem_csfilt_right = 0; + move16(); + move16(); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; + excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 + move16(); + // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; + mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2 + // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; + excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 + move16(); + // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; + mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2 + } + + alpha = 0; + move16(); + // step = 1.0f / L_FRAME16k; + step = 102; // Q15 + move16(); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k]; + excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2 + move16(); + alpha = add( alpha, step ); + } + } + } + ELSE + { + /* Track the low band envelope */ + L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) ); + move32(); + FOR( i = 0; i < L_FRAME16k; i++ ) + { + excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) ); + move16(); + /* Work-around to avoid 0s for very small value*/ + test(); + test(); + test(); + test(); + if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) ) + { + excNoisyEnv[i] = 1; + move16(); + } + /* excNoisyEnv : Q_excTmp2, + *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */ + L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */ + } + *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) ); + move32(); + } + + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + /* generate gaussian (white) excitation */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0 + move16(); + } + + /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ + Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31 + move32(); + move32(); + pow22 = POW_EXC16k_WHTND_FX; + Q_pow22 = -6; + move16(); + // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k); + Word16 pow1_exp = sub( Q31, Q_pow1 ); + Word32 temp_pow = Sqrt32( pow1, &pow1_exp ); + temp_pow = L_shl( Mpy_32_32( temp_pow, pow22_inv ), pow1_exp ); + /*Word16 out_exp; + Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp); + temp_pow1 = L_shl(temp_pow1, out_exp);*/ + // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); + L_tmp = 0; + move32(); + Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16 + move32(); + White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q16 + Q_White_exc16k - Q16 = Q_White_exc16k + move16(); + L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); + } + } + ELSE + { + /* create a random excitation - Reuse exc16k memory */ + create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5 + create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5 + + L_tmp = L_deposit_l( 0 ); + tmp = add( *Q_bwe_exc, 1 ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/ + White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/ + move32(); + L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); + } + /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ + /* White_exc16k in Q6 */ + + /* calculate pow22 */ + /* pow22=0.00001f */ + tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 ); + W_tmp = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */ + Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + /* White_exc16k[k] *= excNoisyEnv[k]; */ + White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10 + move16(); + /* i: excNoisyEnv in (Q_excTmp2) */ + /* i: White_exc16k in Q6 */ + /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */ + + /* pow22 += White_exc16k[k] * White_exc16k[k]; */ + W_tmp = W_mac0_16_16( W_tmp, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/ + } + Q_pow22 = W_norm( W_tmp ); + pow22 = W_extract_h( W_shl( W_tmp, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32 + Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 ); + Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) ); + } + + flag_plosive = 0; + move16(); + test(); + test(); + test(); + IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ + { +#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) ); + move16(); + } + + /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ + find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */ + find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */ + + FOR( k = 0; k < L_FRAME4k; k++ ) + { + EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */ + move16(); + EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */ + move16(); + } + + /* calculate the optimal mix factor */ + c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */ + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + + temp1 = add( shl( *Q_bwe_exc, 1 ), 1 ); + temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 ); + temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 ); + FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ + move32(); + // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ + move32(); + // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ + move32(); + // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ + move32(); + // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */ + move32(); + // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */ + move32(); + + c0 = L_add( c0, c0_part[i] ); + c1 = L_add( c1, c1_part[i] ); + c2 = L_add( c2, c2_part[i] ); + c3 = L_add( c3, c3_part[i] ); + c4 = L_add( c4, c4_part[i] ); + c5 = L_add( c5, c5_part[i] ); + } + + // den = 4.0f * c0 * c2 - c4 * c4; + W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) ); + den_e = 63; + move16(); + shift = W_norm( W_tmp ); + den = W_extract_h( W_shl( W_tmp, shift ) ); + den_e = sub( den_e, shift ); + + IF( den == 0 ) + { + den = 1; + move32(); + den_e = 31; + move16(); + } + + // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; + W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) ); + g1_e = 63; + move16(); + shift = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); + g1_e = sub( g1_e, shift ); + + g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); + g1_e = sub( add( tmp_e, g1_e ), den_e ); + + // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; + W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) ); + g2_e = 63; + move16(); + shift = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); + g2_e = sub( g2_e, shift ); + + g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); + g2_e = sub( add( tmp_e, g2_e ), den_e ); + + // *Env_error = 0.0f; + *Env_error = 0; + move16(); + flag_plosive = 0; + move16(); + FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; + L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e ); + + // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent + Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */ + move16(); + + // *Env_error += Env_error_part[i]; + *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */ + move16(); + + if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q + { + /* envelope error is too high -> likely a plosive */ + flag_plosive = 1; + move16(); + } + } + + IF( flag_plosive ) + { + /* plosive detected -> set the mixing factor to 0 */ + *vf_ind = 0; + move16(); + mix_factor = 0; + move16(); + } + ELSE + { + /* normalize gain */ + // g = g2 / ( g1 + g2 ); + tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp ); + IF( tmp == 0 ) + { + tmp = 1; + move16(); + tmp1_e = 15; + move16(); + } + g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e ); + g_e = sub( add( tmp_e, g2_e ), tmp1_e ); + + /* quantization of the mixing factor */ + cbsize = 1 << NUM_BITS_SHB_VF; + move16(); + // delta = 1.0f / ( cbsize - 1 ); + delta = 2341; /* Q14 */ + move16(); + // if ( g > 1.0f ) + IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 ) + { + // g = 1.0f; + g = MAX16B; /* Q15 */ + move16(); + g_e = 0; + move16(); + } + // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) ) + ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 ) + { + /* prevent low gains to be quantized to 0 as this is reserved for plosives */ + // g = delta; + g = shl( delta, 1 ); /* Q15 */ + g_e = 0; + move16(); + } + + g = shl_sat( g, g_e ); /* Q15 */ + + *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize ); + move16(); + } + } + ELSE +#else + UNUSED_PARAM( Env_error_part ); + UNUSED_PARAM( Env_error ); + UNUSED_PARAM( EnvSHBres_4k ); + UNUSED_PARAM( c5_part ); + UNUSED_PARAM( c1 ); + UNUSED_PARAM( den ); + UNUSED_PARAM( c3_part ); + UNUSED_PARAM( c0 ); + UNUSED_PARAM( delta ); + UNUSED_PARAM( c3 ); + UNUSED_PARAM( c2_part ); + UNUSED_PARAM( c1_part ); + UNUSED_PARAM( EnvWhiteExc16k ); + UNUSED_PARAM( g2 ); + UNUSED_PARAM( c5 ); + UNUSED_PARAM( c4_part ); + UNUSED_PARAM( EnvWhiteExc16k_4k ); + UNUSED_PARAM( c2 ); + UNUSED_PARAM( g ); + UNUSED_PARAM( cbsize ); + UNUSED_PARAM( g1 ); + UNUSED_PARAM( EnvExc16kWhtnd ); + UNUSED_PARAM( c0_part ); + UNUSED_PARAM( EnvExc16kWhtnd_4k ); + UNUSED_PARAM( c4 ); +#endif + { + Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, + Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); + tmp = voiceFacEst[0]; + tmp2 = MAX_16; + move16(); + move16(); + if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) + { + tmp2 = 26214 /*0.8f Q15*/; + move16(); + } + } + } + ELSE /* decoder side */ + { + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + IF( *vf_ind == 0 ) + { + // mix_factor = 0.0f; + mix_factor = 0; + move16(); + flag_plosive = 1; + move16(); + } + ELSE + { + // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1)); + mix_factor = usdequant_fx( *vf_ind, 0, 2341 ); + } + } + ELSE + { + /* *vf_ind is an integer scale by 0.125f*/ + tmp = shl( *vf_ind, ( 15 - 3 ) ); + tmp2 = MAX_16; + move16(); + IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) + { + tmp2 = 26214 /*0.8f Q15*/; + move16(); + } + } + } + + test(); + IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) + { + voice_factors[0] = mult_r( voice_factors[0], tmp2 ); + move16(); + voice_factors[1] = mult_r( voice_factors[1], tmp2 ); + move16(); + voice_factors[2] = mult_r( voice_factors[2], tmp2 ); + move16(); + voice_factors[3] = mult_r( voice_factors[3], tmp2 ); + move16(); + voice_factors[4] = mult_r( voice_factors[4], tmp2 ); + move16(); + } + } + + test(); + IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL ) + { + /* save buffers for IC-BWE */ + // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k); + Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); // Q_bwe_exc + *nlExc16k_e = sub( 15, *Q_bwe_exc ); + move16(); + + // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k); + L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); + Word16 temp_fac = round_fx_sat( L_tmp ); // Q15-exp + + FOR( k = 0; k < L_FRAME16k; k++ ) + { + mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_White_exc16k+15-exp-15 = Q_White_exc16k-exp + move16(); + } + *mixExc16k_e = sub( 15, sub( Q_White_exc16k, exp ) ); + move16(); + } + + Copy( White_exc16k, White_exc16k_FB, L_FRAME16k ); // Q_White_exc16k + prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; + *Q_bwe_exc_fb = Q_White_exc16k; + move16(); + move16(); + + Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k + + deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx ); + /* i/o: White_exc16k (Q_White_exc16k) */ + /* i: tbe_demph_fx (Q_White_exc16k) */ + *tbe_demph = shr_sat( tbe_demph_fx, sub( Q_White_exc16k, *Q_bwe_exc ) ); + move16(); + + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + IF( !flag_plosive ) /* use only LB excitation in case of plosives */ + { + /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ + /* old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); */ + old_scale = round_fx_sat( root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ) ); // exp + old_scale = shl( old_scale, s_min( 0, exp ) ); // limit Q factor to 15 + exp = s_max( 0, exp ); + + // new_scale = 1.0f; + new_scale = shr( 32767, exp ); // exp + + // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2); + step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp + scale = old_scale; // exp + move16(); + + /* interpolate between the old and the new value of the mixing factor */ + old_fact = *prev_mix_factor; // Q15 + new_fact = mix_factor; // Q15 + move16(); + move16(); + + // step = (new_fact - old_fact) / (L_FRAME16k / 2); + step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15 + fact = old_fact; // Q15 + move16(); + + shift = add( exp, sub( *Q_bwe_exc, Q_White_exc16k ) ); + + /* mixing of LB and gaussian excitation in the first half of the frame */ + FOR( k = 0; k < L_FRAME16k / 2; k++ ) + { + /* exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k]; */ + L_tmp = L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), shift ); // Q_bwe_exc+16 + exc16kWhtnd[k] = mac_r_sat( L_tmp, sub( 32767, fact ), exc16kWhtnd[k] ); // Q_bwe_exc + move16(); + + fact = add_sat( fact, step ); // Q15 + scale = add_sat( scale, step_scale ); // exp + } + + shift = sub( *Q_bwe_exc, Q_White_exc16k ); + /* mixing of LB and gaussian excitation in the second half of the frame */ + FOR( ; k < L_FRAME16k; k++ ) + { + // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k]; + L_tmp = L_shl_sat( L_mult( new_fact, White_exc16k[k] ), shift ); // Q_bwe_exc+16 + exc16kWhtnd[k] = mac_r( L_tmp, sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_bwe_exc + move16(); + } + } + // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph); + PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc + } + ELSE + { + test(); + IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) ) + { + scale = 0; + move16(); + + test(); + IF( pow1 != 0 && pow22 != 0 ) + { + L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); + scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ + } + + FOR( k = 0; k < L_FRAME16k; k++ ) + { + exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); // Q_White_exc16k + move16(); + } + + Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc + + PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc + /* i/o: exc16kWhtnd (Q_bwe_exc) */ + /* i/o: tbe_premph (Q_bwe_exc) */ + } + ELSE + { + Word16 nbSubFr, lSubFr; + Word16 tempQ15; + Word32 tempQ31; + nbSubFr = NB_SUBFR16k; + lSubFr = ( L_FRAME16k / NB_SUBFR16k ); + move16(); + move16(); + IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) + { + nbSubFr = NB_SUBFR; + move16(); + lSubFr = ( L_FRAME16k / NB_SUBFR ); + move16(); + } + k = 0; + move16(); + FOR( i = 0; i < nbSubFr; i++ ) + { + test(); + IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) ) + { + exp = 0; + move16(); + tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ + temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + exp = 0; + move16(); + tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ + temp = sub( MAX_16, temp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } + ELSE + { + /* Adjust noise mixing for formant sharpening filter */ + tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); + /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ + vf_tmp = sub( MAX_16, tempQ15 ); + vf_tmp = mult( voice_factors[i], vf_tmp ); + + exp = 0; + move16(); + tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ + temp = sub( MAX_16, vf_tmp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } + + shift = sub( *Q_bwe_exc, Q_White_exc16k ); + FOR( j = 0; j < lSubFr; j++ ) + { + /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ + L_tmp = L_shl_sat( L_mult( temp2, White_exc16k[k + j] ), shift ); // 16+(Q_bwe_exc) + exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc + move16(); + } + k = add( k, lSubFr ); + + /* estimate the pre-emph factor */ + tempQ15 = sub( MAX_16, voice_factors[i] ); + exp = 0; + move16(); + temp = Sqrt16( tempQ15, &exp ); + temp = shl( temp, sub( exp, 1 ) ); + + temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ + temp = div_s( temp, temp2 ); /* Q15 */ + temp = mult_r( PREEMPH_FAC, temp ); + + PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc + /* exc16kWhtnd: Q_bwe_exc; + tbe_premph: Q_bwe_exc*/ + } + } + } + + IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) + { + syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: excSHB in Q_bwe_exc */ + } + ELSE + { + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); + + syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) ); + syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) ); + move32(); + syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) ); + move32(); + syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) ); + move32(); + syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) ); + move32(); + + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: tempSHB in Q_bwe_exc */ + /* o: syn_shb_ener_sf in tmp2 */ + IF( LE_32( bitrate, MAX_ACELP_BRATE ) ) + { + L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); + + /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ + tmp = shl( Q_shb, 1 ); + L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ + + *Q_bwe_exc = sub( *Q_bwe_exc, exp ); + move16(); /* compensate for the exp shift */ + tmp2 = add( prev_Q_bwe_syn, n_mem2 ); + IF( GT_16( *Q_bwe_exc, tmp2 ) ) + { + L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); + *Q_bwe_exc = tmp2; + move16(); + } + FOR( i = 0; i < L_FRAME16k; i++ ) + { + L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ + exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ + move16(); + } + } + /* i: L_tmp2 in (Q31-exp) */ + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ + + /* Rescale the past memories: LP synth and SHB look ahead buffers */ + tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); + FOR( i = 0; i < LPC_SHB_ORDER; i++ ) + { + state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp ); + move16(); + } + FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) + { + excSHB[i] = shl_sat( excSHB[i], tmp ); + move16(); + } + /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ + + syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); + syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); + syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); + syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in (Q_bwe_exc) */ + /* o: excSHB in (Q_bwe_exc) */ + } + + IF( EQ_16( extl, FB_TBE ) ) + { + tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); + Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); + Scale_sig( fb_tbe_demph, 1, tmp ); + syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); + /* i: White_exc16k_FB in (Q_bwe_exc_fb) */ + /* o: White_exc16k_FB_temp in (Q_bwe_exc_fb) */ + + FOR( i = 0; i < 10; i++ ) + { + FOR( j = 0; j < 32; ++j ) + { + White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); + move16(); + } + } + + *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); + move16(); /**Q_bwe_exc_fb +35 +1 -16*/ + flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); + + deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); + } + ELSE + { + set16_fx( White_exc16k_FB, 0, L_FRAME16k ); + } + + *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32 + *prev_mix_factor = mix_factor; + move32(); + move16(); + + return; +} + +void GenShapedSHBExcitation_ivas_dec_fx( + Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ + const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ + Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc */ + Word32 *mem_csfilt, /* i/o: memory */ + Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */ + Word16 *state_lpc_syn, /* i/o: memory */ + const Word16 coder_type, /* i : coding type */ + const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */ + Word16 bwe_seed[], /* i/o: random number generator seed */ + Word16 voice_factors[], /* i : voicing factor*/ + const Word16 extl, /* i : extension layer */ + Word16 *tbe_demph, /* i/o: de-emphasis memory */ + Word16 *tbe_premph, /* i/o: pre-emphasis memory */ + Word16 *lpc_shb_sf, /* i: LP coefficients */ + const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */ + Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */ + Word16 *shb_res, + Word16 *vf_ind, + const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */ + Word16 fb_state_lpc_syn[], /* i/o: memory */ + Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */ + Word16 *Q_bwe_exc, + Word16 *Q_bwe_exc_fb, + const Word16 Q_shb, + Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ + Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ + const Word32 bitrate, /* i : bitrate */ + const Word16 prev_bfi, /* i : previous frame was concealed */ + const Word16 element_mode, /* i : element mode */ + const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ + Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ + Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ + const Word32 extl_brate, /* i : extension layer bitarte */ + const Word16 MSFlag, /* i : Multi Source flag */ + Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ + Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ + Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ + Word16 *Env_error, /* o : error in SHB residual envelope modelling Q0 */ + Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling Q0 */ +) +{ + Word16 i, j, k; + Word16 wht_fil_mem[LPC_WHTN_ORDER]; + Word16 lpc_whtn[LPC_WHTN_ORDER + 1]; + Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */ + Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */ + Word16 Q_R; + Word32 LepsP[LPC_WHTN_ORDER + 1]; + Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k]; + Word32 pow1, pow22; + Word16 scale, temp1, temp2, temp3; + Word16 Q_White_exc16k; + Word16 excTmp2[L_FRAME16k]; + Word16 *White_exc16k; + Word16 excNoisyEnv[L_FRAME16k]; + Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ + move16(); + Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ + move16(); + move16(); + Word16 varEnvShape; + Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ + Word16 exc16kWhtnd[L_FRAME16k]; + + Word32 L_tmp; + Word16 vf_tmp; + Word16 tmp, exp, tmp2 = 0; + move16(); + Word16 voiceFacEst[NB_SUBFR16k]; + Word16 zero_mem[LPC_SHB_ORDER]; + Word32 syn_shb_ener_sf[4]; + Word16 syn_shb_ener_sf_q[4]; + Word16 tempSHB[80]; + Word16 Q_pow1, Q_pow22; + + Word32 L_tmp2, L_tmp3, L_tmp4; + Word16 temp; + + Word16 White_exc16k_FB_temp[L_FRAME16k]; + Word32 White_exc16k_32[L_FRAME16k]; + Word16 White_exc16k_tmp[L_FRAME16k]; + Word16 Q_temp; + Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd; + Word16 chk1; + Word32 chk2; + chk1 = 0; + chk2 = 0; + move16(); + move32(); + +#if 1 // def ADD_IVAS_TBE_CODE + Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; + Word16 cbsize; + Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; + Word32 c0, c1, c2, c3, c4, c5, den; + Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e; + Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; + Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; + Word16 flag_plosive; + Word16 delta; + Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; + Word64 W_tmp; + + mix_factor = 0; /* Q15 */ + move16(); +#endif + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); + set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); + FOR( i = 0; i < L_FRAME32k; i = i + 2 ) + { + exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc + move16(); + exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc + move16(); + } + + /* Decimate by 2 */ + Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc + /* i: exc32k in Q_bwe_exc */ + /* o: exc16k in Q_bwe_exc */ + + autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R + /* Ensure R[0] isn't zero when entering Levinson Durbin */ + R_l[0] = s_max( R_l[0], 1 ); + move16(); + FOR( i = 1; i <= LPC_WHTN_ORDER; i++ ) + { + L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); + L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R + } + E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL ); + Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12 + fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc + + /* i: exc16k in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc */ + +#if 1 // def ADD_IVAS_TBE_CODE + IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) +#else + IF( GE_32( bitrate, ACELP_24k40 ) ) +#endif + { + temp2 = 0; + move16(); + FOR( j = 0; j < 4; j++ ) + { + temp1 = shb_res_gshape[j]; + move16(); + FOR( i = 0; i < 80; i++ ) + { + exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc + move16(); + /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ + } + temp2 = add( temp2, 80 ); + } + } + + /* Estimate pow1 associated with Low band nonlinear extended excitation */ + /* pow1=0.00001f */ + tmp = sub( shl( *Q_bwe_exc, 1 ), 31 ); + pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/ + excTmp2[k] = abs_s( exc16kWhtnd[k] ); + move16(); + chk1 = s_or( chk1, exc16kWhtnd[k] ); + + /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */ + pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */ + } + Q_pow1 = shl( *Q_bwe_exc, 1 ); + + test(); +#if 1 // ADD_IVAS_TBE_CODE + IF( flag_ACELP16k == 0 ) +#else + IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) +#endif + { + /* varEnvShape = mean_fx(voice_factors, 4); */ + /* unroll the loop */ + L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ ); + varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */ + } + ELSE /* 16k core */ + { + /* varEnvShape = mean_fx(voice_factors, 5); */ + /* unroll the loop */ + L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ ); + L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ ); + varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */ + } + + IF( EQ_16( extl, FB_TBE ) ) + { + /*pow(varEnvShape,3) */ + tmp = mult_r( varEnvShape, varEnvShape ); + tmp = mult_r( tmp, varEnvShape ); + + /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */ + fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp ); + fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ ); + } + + /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */ + varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape ); + + /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */ + varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ ); + varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ ); + varEnvShape = shl( varEnvShape, 1 ); + csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15 + move16(); + neg_csfilt_den2[1] = varEnvShape; // Q15 + move16(); + + test(); + test(); + test(); +#if 1 // def ADD_IVAS_TBE_CODE + test(); + IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) +#else + IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) +#endif + { + /* pre-init smoothing filter to avoid energy drop outs */ + L_tmp = L_mult( excTmp2[0], 1638 ); + FOR( i = 1; i < L_SUBFR16k / 4; i++ ) + { + L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/ + } + /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */ + + /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */ + /* rather stick to the more conservative approach, to avoid potential clippings */ + test(); + IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) ) + { + /* use weak smoothing for 1st frame after switching to make filter recover more quickly */ + varEnvShape = 26214 /*0.8f Q15*/; + move16(); + csfilt_num2[0] = sub( MAX_16, varEnvShape ); + move16(); + neg_csfilt_den2[1] = varEnvShape; + move16(); + } + + *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); + move32(); + } +#if 1 // def ADD_IVAS_TBE_CODE + IF( MSFlag > 0 ) + { + // varEnvShape = 0.995f; + varEnvShape = 32604; + move16(); + csfilt_num2[0] = 32768 - varEnvShape; + // csfilt_num2[0] = sub( 32767, varEnvShape ); + move16(); + neg_csfilt_den2[1] = varEnvShape; + move16(); + } + + White_exc16k = exc16k; + move16(); + Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); + IF( *mem_csfilt ) + { + Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) ); + } + test(); + /* Track the low band envelope */ + IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + test(); + IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) + { + mem_csfilt_left = 0; + mem_csfilt_right = 0; + move16(); + move16(); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; + excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 + move16(); + // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; + mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2 + // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; + excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 + move16(); + // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; + mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2 + } + + alpha = 0; + move16(); + // step = 1.0f / L_FRAME16k; + step = 102; // Q15 + move16(); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k]; + excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2 + move16(); + alpha = add( alpha, step ); + } + } + } + ELSE +#endif + { + /* Track the low band envelope */ + L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) ); + move32(); + FOR( i = 0; i < L_FRAME16k; i++ ) + { + excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) ); + move16(); + /* Work-around to avoid 0s for very small value*/ + test(); + test(); + test(); + test(); + if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) ) + { + excNoisyEnv[i] = 1; + move16(); + } + /* excNoisyEnv : Q_excTmp2, + *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */ + L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */ + } + *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) ); + move32(); + } +#if 1 // def ADD_IVAS_TBE_CODE + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + /* generate gaussian (white) excitation */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k[k] = own_random( &bwe_seed[0] ); + move16(); + } + + /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ + Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49; + move32(); + move32(); + pow22 = POW_EXC16k_WHTND_FX; + Q_pow22 = -6; + move16(); + // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k); + Word16 pow1_exp = sub( Q31, Q_pow1 ); + Word32 temp_pow = Sqrt32( pow1, &pow1_exp ); + temp_pow = Mpy_32_32( temp_pow, pow22_inv ); + /*Word16 out_exp; + Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp); + temp_pow1 = L_shl(temp_pow1, out_exp);*/ + // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); + L_tmp = 0; + move32(); + shift = getScaleFactor16( White_exc16k, L_FRAME16k ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); + move32(); + White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], shift ) ); // Q_White_exc16k + move16(); + L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); + } + Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) ); + Q_temp = norm_l( L_tmp ); + IF( L_tmp == 0 ) + { + Q_temp = 31; + move16(); + } + } + ELSE +#endif + { + /* create a random excitation - Reuse exc16k memory */ + White_exc16k = exc16k; + move16(); + create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5 + create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5 + + L_tmp = L_deposit_l( 0 ); + tmp = add( *Q_bwe_exc, 1 ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/ + White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/ + move32(); + L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); + } + Q_temp = norm_l( L_tmp ); + IF( L_tmp == 0 ) + { + Q_temp = 31; + move16(); + } + /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ + /* White_exc16k in Q6 */ + + /* calculate pow22 */ + /* pow22=0.00001f */ + tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 ); + Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */ + Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + + White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10 + chk2 = L_or( chk2, White_exc16k_32[k] ); + /* i: excNoisyEnv in (Q_excTmp2) */ + /* i: White_exc16k in Q6 */ + /* o: White_exc16k in (Q_White_exc16k) */ + /* pow22 += White_exc16k[k] * White_exc16k[k]; */ + sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/ + move16(); + } + Q_pow22 = W_norm( sum ); + pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32 + Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 ); + Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) ); + } + +#if 1 // def ADD_IVAS_TBE_CODE + flag_plosive = 0; + move16(); + test(); + test(); + test(); + IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) +#else + IF( GE_32( bitrate, ACELP_24k40 ) ) +#endif + { + IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ + { +#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) ); + move16(); + } + + /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ + find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */ + find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */ + + FOR( k = 0; k < L_FRAME4k; k++ ) + { + EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */ + move16(); + EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */ + move16(); + } + + /* calculate the optimal mix factor */ + c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */ + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + + temp1 = add( shl( *Q_bwe_exc, 1 ), 1 ); + temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 ); + temp3 = add( shl( Q_shb, 1 ), 1 ); + FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ + move32(); + // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ + move32(); + // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ + move32(); + // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ + move32(); + // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */ + move32(); + // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); + c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */ + move32(); + + c0 = L_add( c0, c0_part[i] ); + c1 = L_add( c1, c1_part[i] ); + c2 = L_add( c2, c2_part[i] ); + c3 = L_add( c3, c3_part[i] ); + c4 = L_add( c4, c4_part[i] ); + c5 = L_add( c5, c5_part[i] ); + } + + // den = 4.0f * c0 * c2 - c4 * c4; + W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) ); + den_e = 63; + move16(); + shift = W_norm( W_tmp ); + den = W_extract_h( W_shl( W_tmp, shift ) ); + den_e = sub( den_e, shift ); + + IF( den == 0 ) + { + den = 1; + move32(); + den_e = 31; + move16(); + } + + // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; + W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) ); + g1_e = 63; + move16(); + shift = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); + g1_e = sub( g1_e, shift ); + + g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); + g1_e = sub( add( tmp_e, g1_e ), den_e ); + + // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; + W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) ); + g2_e = 63; + move16(); + shift = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); + g2_e = sub( g2_e, shift ); + + g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); + g2_e = sub( add( tmp_e, g2_e ), den_e ); + + // *Env_error = 0.0f; + *Env_error = 0; + move16(); + flag_plosive = 0; + move16(); + FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) + { + // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; + L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e ); + + // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent + Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */ + move16(); + + // *Env_error += Env_error_part[i]; + *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */ + move16(); + + if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q + { + /* envelope error is too high -> likely a plosive */ + flag_plosive = 1; + move16(); + } + } + + IF( flag_plosive ) + { + /* plosive detected -> set the mixing factor to 0 */ + *vf_ind = 0; + move16(); + mix_factor = 0; + move16(); + } + ELSE + { + /* normalize gain */ + // g = g2 / ( g1 + g2 ); + tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp ); + IF( tmp == 0 ) + { + tmp = 1; + move16(); + tmp1_e = 15; + move16(); + } + g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e ); + g_e = sub( add( tmp_e, g2_e ), tmp1_e ); + + /* quantization of the mixing factor */ + cbsize = 1 << NUM_BITS_SHB_VF; + move16(); + // delta = 1.0f / ( cbsize - 1 ); + delta = 2341; /* Q14 */ + move16(); + // if ( g > 1.0f ) + IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 ) + { + // g = 1.0f; + g = MAX16B; /* Q15 */ + } + // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) ) + ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 ) + { + /* prevent low gains to be quantized to 0 as this is reserved for plosives */ + // g = delta; + g = shl( delta, 1 ); /* Q15 */ + } + + *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize ); + move16(); + } + } + ELSE +#else + UNUSED_PARAM( Env_error_part ); + UNUSED_PARAM( Env_error ); + UNUSED_PARAM( EnvSHBres_4k ); + UNUSED_PARAM( c5_part ); + UNUSED_PARAM( c1 ); + UNUSED_PARAM( den ); + UNUSED_PARAM( c3_part ); + UNUSED_PARAM( c0 ); + UNUSED_PARAM( delta ); + UNUSED_PARAM( c3 ); + UNUSED_PARAM( c2_part ); + UNUSED_PARAM( c1_part ); + UNUSED_PARAM( EnvWhiteExc16k ); + UNUSED_PARAM( g2 ); + UNUSED_PARAM( c5 ); + UNUSED_PARAM( c4_part ); + UNUSED_PARAM( EnvWhiteExc16k_4k ); + UNUSED_PARAM( c2 ); + UNUSED_PARAM( g ); + UNUSED_PARAM( cbsize ); + UNUSED_PARAM( g1 ); + UNUSED_PARAM( EnvExc16kWhtnd ); + UNUSED_PARAM( c0_part ); + UNUSED_PARAM( EnvExc16kWhtnd_4k ); + UNUSED_PARAM( c4 ); +#endif + { + Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, + ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); + tmp = voiceFacEst[0]; + tmp2 = MAX_16; + move16(); + move16(); + if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) + { + tmp2 = 26214 /*0.8f Q15*/; + move16(); + } + } + } + ELSE /* decoder side */ + { + test(); +#if 1 // def ADD_IVAS_TBE_CODE + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + IF( *vf_ind == 0 ) + { + // mix_factor = 0.0f; + mix_factor = 0; + move16(); + flag_plosive = 1; + move16(); + } + ELSE + { + // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1)); + mix_factor = usdequant_fx( *vf_ind, 0, 2341 ); + } + } + ELSE +#endif + { + /* *vf_ind is an integer scale by 0.125f*/ + tmp = shl( *vf_ind, ( 15 - 3 ) ); + tmp2 = MAX_16; + move16(); + IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) + { + tmp2 = 26214 /*0.8f Q15*/; + move16(); + } + } + } +#if 1 // def ADD_IVAS_TBE_CODE + test(); + IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) +#endif + { + voice_factors[0] = mult_r( voice_factors[0], tmp2 ); + move16(); + voice_factors[1] = mult_r( voice_factors[1], tmp2 ); + move16(); + voice_factors[2] = mult_r( voice_factors[2], tmp2 ); + move16(); + voice_factors[3] = mult_r( voice_factors[3], tmp2 ); + move16(); + voice_factors[4] = mult_r( voice_factors[4], tmp2 ); + move16(); + } + } + test(); + IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL ) + { + /* save buffers for IC-BWE */ + // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k); + Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); + // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k); + /*Word16 temp_fac = divide3232(L_shr(pow1, Q_pow1), pow22); + Word16 temp_fac_exp = 0; + temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/ + L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); + Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15 + shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ); + // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + mixExc16k[k] = mult_r( shl_sat( White_exc16k[k], shift ), temp_fac ); + move16(); + } + } + + tmp = sub( Q_temp, 3 ); + FOR( k = 0; k < L_FRAME16k; k++ ) + { + White_exc16k_FB[k] = White_exc16k[k]; /* Q_White_exc16k */ + } + prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; + move16(); + *Q_bwe_exc_fb = Q_White_exc16k; + move16(); + *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) ); + deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); + *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); + + Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k ); + Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc ); + + shift = getScaleFactor16( White_exc16k, L_FRAME16k ); + + shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) ); + scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) ); + scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) ); + + Q_exc16kWhtnd = Q_White_exc16k = shift; + move16(); + move16(); + *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) ); + move16(); + test(); + IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) + { + IF( !flag_plosive ) /* use only LB excitation in case of plosives */ + { + /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ + // old_scale = (float)sqrt(*prev_pow_exc16kWhtnd / pow1); + // old_scale = divide3232(*prev_pow_exc16kWhtnd, pow1); // exp = Q15 - (Q_pow1) + // Word16 old_scale_exp = Q15 - (Q_pow1); + // old_scale = Sqrt16(old_scale, &old_scale_exp); + // old_scale = shl(old_scale, old_scale_exp); //Q15 + L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ); + old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15 + // new_scale = 1.0f; + new_scale = 32767; + move16(); + // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2); + step_scale = mult_r( sub( new_scale, old_scale ), 205 ); + scale = old_scale; + move16(); + /* interpolate between the old and the new value of the mixing factor */ + old_fact = *prev_mix_factor; + move16(); + new_fact = mix_factor; + move16(); + // step = (new_fact - old_fact) / (L_FRAME16k / 2); + step = mult_r( sub( new_fact, old_fact ), 205 ); + fact = old_fact; + move16(); + /* mixing of LB and gaussian excitation in the first half of the frame */ + FOR( k = 0; k < L_FRAME16k / 2; k++ ) + { + exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ), + sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd + move16(); + fact = add_sat( fact, step ); + scale = add_sat( scale, step_scale ); + } + + /* mixing of LB and gaussian excitation in the second half of the frame */ + FOR( ; k < L_FRAME16k; k++ ) + { + exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ), + sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd + move16(); + } + } + // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph); + PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + } + ELSE + { + test(); + IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) ) + { + L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); + test(); + if ( chk1 == 0 && chk2 == 0 ) + { + L_tmp = 0; + move32(); + } + scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); + move16(); + } + PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + /* i/o: exc16kWhtnd (Q_exc16kWhtnd) */ + /* i/o: tbe_premph (Q_exc16kWhtnd) */ + } + ELSE + { + Word16 nbSubFr, lSubFr; + Word16 tempQ15; + Word32 tempQ31; + nbSubFr = NB_SUBFR16k; + lSubFr = ( L_FRAME16k / NB_SUBFR16k ); + move16(); + move16(); + IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) + { + nbSubFr = NB_SUBFR; + move16(); + lSubFr = ( L_FRAME16k / NB_SUBFR ); + move16(); + } + k = 0; + move16(); + FOR( i = 0; i < nbSubFr; i++ ) + { + test(); + IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) ) + { + exp = 0; + move16(); + tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ + temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + exp = 0; + move16(); + tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ + temp = sub( MAX_16, temp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } + ELSE + { + /* Adjust noise mixing for formant sharpening filter */ + tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); + /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ + vf_tmp = sub( MAX_16, tempQ15 ); + vf_tmp = mult( voice_factors[i], vf_tmp ); + + exp = 0; + move16(); + tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ + temp = sub( MAX_16, vf_tmp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } + + FOR( j = 0; j < lSubFr; j++ ) + { + /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ + L_tmp = L_mult( temp2, White_exc16k[k + j] ); + exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); + move16(); + /* Q_exc16kWhtnd */ + } + k = add( k, lSubFr ); + + /* estimate the pre-emph factor */ + tempQ15 = sub( MAX_16, voice_factors[i] ); + exp = 0; + move16(); + temp = Sqrt16( tempQ15, &exp ); + temp = shl( temp, sub( exp, 1 ) ); + + temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ + temp = div_s( temp, temp2 ); /* Q15 */ + temp = mult_r( PREEMPH_FAC, temp ); + PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); + /* exc16kWhtnd: Q_exc16kWhtnd; + tbe_premph: Q_exc16kWhtnd*/ + } + } + } + *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); + move16(); + Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); + Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); + + IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) + { + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: excSHB in Q_bwe_exc */ + } + ELSE + { + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); + + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); + tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); + Scale_sig( tempSHB, 80, tmp ); + syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); + syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); + move16(); + + tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) ); + syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) ); + move32(); + syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) ); + move32(); + syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) ); + move32(); + syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) ); + move32(); + + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: tempSHB in Q_bwe_exc */ + /* o: syn_shb_ener_sf in tmp2 */ + IF( LE_32( bitrate, MAX_ACELP_BRATE ) ) + { + L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); + + /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ + tmp = shl( Q_shb, 1 ); + L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ + + *Q_bwe_exc = sub( *Q_bwe_exc, exp ); + move16(); /* compensate for the exp shift */ + tmp2 = add( prev_Q_bwe_syn, n_mem2 ); + IF( GT_16( *Q_bwe_exc, tmp2 ) ) + { + L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); + *Q_bwe_exc = tmp2; + move16(); + } + FOR( i = 0; i < L_FRAME16k; i++ ) + { + L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ + exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ + move16(); + } + } + /* i: L_tmp2 in (Q31-exp) */ + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ + + /* Rescale the past memories: LP synth and SHB look ahead buffers */ + tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); + FOR( i = 0; i < LPC_SHB_ORDER; i++ ) + { + state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp ); + move16(); + } + FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) + { + excSHB[i] = shl_sat( excSHB[i], tmp ); + move16(); + } + /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ + + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in (Q_bwe_exc) */ + /* o: excSHB in (Q_bwe_exc) */ + } + + IF( EQ_16( extl, FB_TBE ) ) + { + tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); + Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); + Scale_sig( fb_tbe_demph, 1, tmp ); + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); + /* i: White_exc16k_FB in (14-n2) */ + /* o: White_exc16k_FB_temp in (14-n2) */ + + FOR( i = 0; i < 10; i++ ) + { + FOR( j = 0; j < 32; ++j ) + { + White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); + move16(); + } + } + + *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); + move16(); /**Q_bwe_exc_fb +35 +1 -16*/ + flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); + + deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); + } + ELSE + { + set16_fx( White_exc16k_FB, 0, L_FRAME16k ); + } + +#if 1 // def ADD_IVAS_TBE_CODE + *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32 + *prev_mix_factor = mix_factor; +#endif + return; +} + +/*====================================================================================*/ +/* FUNCTION : void GenSHBSynth_fx() */ +/*------------------------------------------------------------------------------------*/ +/* PURPOSE :Generate 32 KHz sampled highband component from synthesized highband*/ +/*------------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS */ +/* _(Word16*)input_synspeech :input synthesized speech */ +/* _(Word16) L_frame :ACELP frame length */ +/*------------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _(Word16*)shb_syn_speech_32k : output highband component */ +/*------------------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _(Word16[]) allpass_mem : memory */ +/* _(Word32[]) Hilbert_Mem : memory */ +/*------------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*------------------------------------------------------------------------------------*/ + +void GenSHBSynth_fx( + const Word16 *input_synspeech, /* i : input synthesized speech */ + Word16 *shb_syn_speech_32k, /* o : output highband component */ + Word32 Hilbert_Mem[], /* i/o: memory */ + Word16 allpass_mem[], /* i/o: memory */ + const Word16 L_frame, /* i : ACELP frame length */ + Word16 *syn_dm_phase ) +{ + Word16 i, speech_buf_32k[L_FRAME32k]; + Word16 maxm, nor, nor32, shift; + Word16 input_synspeech_temp[L_FRAME16k]; + Word32 maxm32; + + + maxm = 0; + move16(); + maxm32 = L_deposit_l( 0 ); + FOR( i = 0; i < L_FRAME16k; i++ ) + maxm = s_max( maxm, abs_s( input_synspeech[i] ) ); + FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) + maxm = s_max( maxm, abs_s( allpass_mem[i] ) ); + FOR( i = 0; i < HILBERT_MEM_SIZE; i++ ) + maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) ); + nor = sub( norm_s( maxm ), 3 ); + nor32 = sub( norm_l( maxm32 ), 3 ); + if ( maxm == 0 ) + { + nor = 15; + move16(); + } + if ( maxm32 == 0 ) + { + nor32 = 31; + move16(); + } + shift = s_min( nor, nor32 ); + + Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k, shift ); + Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, shift ); + Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift ); + Interpolate_allpass_steep_fx( input_synspeech_temp, allpass_mem, L_FRAME16k, speech_buf_32k ); + /*modify_Fs_fx( input_synspeech, L_FRAME16k, 16000, speech_buf_32k, 32000, allpass_mem, 0);*/ + IF( EQ_16( L_frame, L_FRAME ) ) + { + /* 12.8 k core flipping and downmixing */ + flip_and_downmix_generic_fx( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, + Hilbert_Mem, + Hilbert_Mem + HILBERT_ORDER1, + Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), + syn_dm_phase ); + } + ELSE + { + /* 16 k core flipping and no downmixing */ + FOR( i = 0; i < L_FRAME32k; i = i + 2 ) + { + shb_syn_speech_32k[i] = negate( speech_buf_32k[i] ); + move16(); + shb_syn_speech_32k[i + 1] = speech_buf_32k[i + 1]; + move16(); + } + } + + Scale_sig( shb_syn_speech_32k, L_FRAME32k, negate( shift ) ); + Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) ); + Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) ); + + return; +} + + +/* IVAS 32-bit variant */ +void GenSHBSynth_fx32( + const Word32 *input_synspeech, /* i : input synthesized speech Qx*/ + Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/ + Word32 Hilbert_Mem[], /* i/o: memory Qx*/ + Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/ + const Word16 L_frame, /* i : ACELP frame length */ + Word16 *syn_dm_phase ) +{ + Word32 speech_buf_32k[L_FRAME32k]; + Word16 i; + + Word16 shift = 0; + Word32 maxm32, input_synspeech_temp[L_FRAME16k]; + move16(); + + /* find the maximum value and derive the shift to improve precision of the Hilber filter */ + maxm32 = L_deposit_l( 0 ); + FOR( i = 0; i < L_FRAME16k; i++ ) + { + maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) ); + } + + FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) + { + maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) ); + } + + FOR( i = 0; i < HILBERT_MEM_SIZE; i++ ) + { + maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) ); + } + + IF( maxm32 != 0 ) + { + shift = sub( norm_l( maxm32 ), 3 ); + + Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift ); + Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift ); + Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift ); + } + ELSE + { + Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k ); + } + + Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k ); + + IF( EQ_16( L_frame, L_FRAME ) ) + { + flip_and_downmix_generic_fx32( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase ); + } + ELSE + { + FOR( i = 0; i < L_FRAME32k; i++ ) + { + // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] ); + IF( i % 2 == 0 ) + { + shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx + } + ELSE + { + shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx + } + move32(); + } + } + + IF( maxm32 != 0 ) + { + Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) ); + Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) ); + Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) ); + } + + return; +} + + +/*==============================================================================*/ +/* FUNCTION : void ScaleShapedSHB_fx() */ +/*------------------------------------------------------------------------------*/ +/* PURPOSE : */ +/*------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _(Word16) length : SHB overlap length */ +/* _(Word16*) subgain : subframe gain Q15 */ +/* _(Word32) frame_gain : frame gain Q18 */ +/* _(Word16*) win : window Q15 */ +/* _(Word16*) subwin : subframes window Q15 */ +/* _(Word16) Q_bwe_exc : Q format */ +/*------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _(Word16) Qx : Q factor of output */ +/*------------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _(Word16*) synSHB : synthesized shb signal input Q_bwe_exc / output Qx */ +/* _(Word16*) overlap : buffer for overlap-add Q_bwe_exc /output Qx */ +/*------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*------------------------------------------------------------------------------*/ +/* CALLED FROM : RX */ +/*==============================================================================*/ + +void ScaleShapedSHB_fx( + const Word16 length, /* i : SHB overlap length */ + Word16 *synSHB, /* i/o : synthesized shb signal Q(Q_bwe_exc)/Q(Qx) */ + Word16 *overlap, /* i/o : buffer for overlap-add Q(Q_bwe_exc)/Q(Qx) */ + const Word16 *subgain, /* i : subframe gain Q15 */ + const Word32 frame_gain, /* i : frame gain Q18 */ + const Word16 *win, /* i : window Q15 */ + const Word16 *subwin, /* i : subframes window Q15 */ + Word16 *Q_bwe_exc, + Word16 *Qx, /* o : newly computed Q factor for synSHB */ + Word16 n_mem3, + Word16 prev_Q_bwe_syn2 ) +{ + const Word16 *skip; + Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp; + Word16 join_length, num_join; + Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD]; + Word16 sum_gain; + Word32 L_tmp; + Word16 tmpQ15; + Word16 Q_gFr_norm, gain_frame_Q16; + Word32 L_tmp2; + Word16 temp1, temp2; + + /* Init */ + set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD ); + + /* apply gain for each subframe, and store noise output signal using overlap-add */ + IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) + { + /* WB Gain shape and gain frame application with overlap */ + skip = skip_bands_WB_TBE; + l_frame = L_FRAME16k / 4; + move16(); + l_shb_lahead = L_SHB_LAHEAD / 4; + move16(); + + sum_gain = 0; + move16(); + FOR( k = 0; k < length / 2; k++ ) + { + sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */ + mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); /* Q_bwe_exc + 16 */ + move32(); + mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); /* Q_bwe_exc + 16 */ + move32(); + } + FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) + { + FOR( k = 0; k < length; k++ ) + { + /* one bit headroom here, otherwise messes up the gain shape application */ + /* keep it as L_mult0 */ + L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */ + sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */ + mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 ); /* Q_bwe_exc + 16 */ + move32(); + } + } + FOR( k = 0; k < length / 2; k++ ) + { + sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */ + mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] ); /* Q_bwe_exc + 16 */ + move32(); + } + } + ELSE + { + /* SWB Gain shape and gain frame application with overlap */ + l_frame = L_FRAME16k; + move16(); + l_shb_lahead = L_SHB_LAHEAD; + move16(); + skip = skip_bands_SWB_TBE; + + num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; + move16(); + join_length = i_mult2( num_join, length ); + j = 0; + move16(); + FOR( k = 0; k < length; k++ ) + { + sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */ + mod_syn[j] = L_mult( synSHB[j], sum_gain ); + move32(); /* Q_bwe_exc + 16 */ + j = add( j, 1 ); + } + + FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) + { + FOR( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] ); + move32(); /* Q_bwe_exc + 16 */ + j = add( j, 1 ); + } + + FOR( k = 0; k < length; k++ ) + { + /* one bit headroom here, otherwise messes up the gain shape application */ + /* keep it as L_mult0 */ + L_tmp = L_mult0( subwin[k + 1], subgain[( i + 1 ) * num_join] ); /* Q30 */ + sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */ + mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 ); + move32(); /* Q_bwe_exc + 16 */ + j = add( j, 1 ); + } + } + FOR( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); + move32(); /* Q_bwe_exc + 16 */ + j = add( j, 1 ); + } + FOR( k = 0; k < length; k++ ) + { + sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */ + mod_syn[j] = L_mult( synSHB[j], sum_gain ); + move32(); /* Q_bwe_exc + 16 */ + j = add( j, 1 ); + } + } + + + Q_gFr_norm = norm_l( frame_gain ); + if ( frame_gain == 0 ) + { + Q_gFr_norm = 31; + move16(); + } + Q_gFr_norm = sub( Q_gFr_norm, 1 ); /* give some headroom */ + + gain_frame_Q16 = round_fx( L_shl( frame_gain, Q_gFr_norm ) ); /* Q = 18 + Q_gFr_norm - 16 + = (Q_gFr_norm + 2) */ + + *Q_bwe_exc = add( *Q_bwe_exc, Q_gFr_norm ); /* compensate for the exp shift */ + move16(); + *Q_bwe_exc = sub( *Q_bwe_exc, 13 ); /* Keep Q-fac at => (Q_bwe_exc + Q_gFr_norm - 13) */ + move16(); + + /* check for headroom of previous buff memories: overlap, Hilbert, and interp all-pass mem */ + tmpQ15 = add( prev_Q_bwe_syn2, n_mem3 ); + if ( GT_16( *Q_bwe_exc, tmpQ15 ) ) + { + *Q_bwe_exc = tmpQ15; + move16(); + } + + *Qx = *Q_bwe_exc; + move16(); + /* rescale the overlap memory */ + FOR( i = 0; i < L_SHB_LAHEAD; i++ ) + { + temp2 = 1; + move16(); + if ( overlap[i] < 0 ) + { + temp2 = -1; + move16(); + } + temp1 = abs_s( overlap[i] ); + temp1 = shl( temp1, sub( *Q_bwe_exc, prev_Q_bwe_syn2 ) ); + overlap[i] = i_mult( temp1, temp2 ); + move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */ + } + + FOR( i = 0; i < l_shb_lahead; i++ ) + { + L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */ + L_tmp2 = Mpy_32_16_1( L_tmp, win[i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */ + synSHB[i] = mac_r( L_tmp2, overlap[i], MAX_16 ); + move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */ + synSHB[i + l_shb_lahead] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ + move16(); + } + + FOR( ; i < l_frame; i++ ) + { + L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */ + synSHB[i] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ + move16(); + } + + l_frame_tmp = add( l_frame, l_shb_lahead ); + FOR( ; i < l_frame_tmp; i++ ) + { + L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */ + L_tmp = Mpy_32_16_1( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */ + overlap[i - l_frame] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ + move16(); + } + + return; +} + + +/* IVAS 32-bit variant */ +void ScaleShapedSHB_fx32( + const Word16 length, /* i : SHB overlap length */ + Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */ + Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */ + const Word16 *subgain_fx, /* i : subframe gain Q15 */ + const Word32 frame_gain_fx, /* i : frame gain Q18*/ + const Word16 *win_fx, /* i : window Q15 */ + const Word16 *subwin_fx, /* i : subframes window Q15 */ + Word16 *Q_inp, + Word16 *Q_new ) +{ + const Word16 *skip; + Word16 i, j, k, l_shb_lahead, l_frame; + Word16 join_length, num_join; + Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp; + Word16 sum_gain_fx; + + /* initilaization */ + l_frame = L_FRAME16k; + l_shb_lahead = L_SHB_LAHEAD; + move16(); + move16(); + skip = skip_bands_SWB_TBE; + + IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) + { + skip = skip_bands_WB_TBE; + l_frame = L_FRAME16k / 4; + l_shb_lahead = L_SHB_LAHEAD / 4; + move16(); + move16(); + } + + /* apply gain for each subframe, and store noise output signal using overlap-add */ + set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead ); + + IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) + { + sum_gain_fx = 0; + move16(); + FOR( k = 0; k < shr( length, 1 ); k++ ) + { + sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] ); + mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx ); + move32(); // Qx + mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx + move32(); + } + FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) + { + FOR( k = 0; k < length; k++ ) + { + L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] ); + sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) ); + mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx + move32(); + } + } + FOR( k = 0; k < shr( length, 1 ); k++ ) + { + sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] ); + mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx + move32(); + } + } + ELSE + { + num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; + join_length = i_mult( num_join, length ); + j = 0; + move16(); + move16(); + FOR( k = 0; k < length; k++ ) + { + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx + move32(); + j = add( j, 1 ); + } + FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) + { + FOR( k = 0; k < join_length - length; k++ ) + { + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx + move32(); + j = add( j, 1 ); + } + + FOR( k = 0; k < length; k++ ) + { + L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] ); + mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx + move32(); + j = add( j, 1 ); + } + } + FOR( k = 0; k < join_length - length; k++ ) + { + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx + move32(); + j = add( j, 1 ); + } + FOR( k = 0; k < length; k++ ) + { + mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx + move32(); + j = add( j, 1 ); + } + } + + Word16 norm_shift = norm_l( frame_gain_fx ); + if ( frame_gain_fx == 0 ) + { + norm_shift = 31; + move16(); + } + + norm_shift = s_min( norm_shift, 14 ); + norm_shift = sub( norm_shift, 1 ); + + *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14; + move16(); + FOR( i = 0; i < L_SHB_LAHEAD; i++ ) + { + overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) ); + move32(); + } + + FOR( i = 0; i < l_shb_lahead; i++ ) + { + synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new + synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] ); + synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new + move32(); + move32(); + move32(); + } + + FOR( ; i < l_frame; i++ ) + { + synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new + move32(); + } + + FOR( ; i < l_frame + l_shb_lahead; i++ ) + { + synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) ); + overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new + move32(); + move32(); + } + + *Q_inp = *Q_new; + move16(); + return; +} + + +/*-------------------------------------------------------------------* + * ScaleShapedWB() + * + * + *-------------------------------------------------------------------*/ + +void ScaleShapedWB_fx( + const Word16 length, /* i : SHB overlap length */ + Word16 *synSHB, /* i/o : synthesized shb signal Q_bwe_exc/Qx */ + Word16 *overlap, /* i/o : buffer for overlap-add Q_bwe_exc/Qx */ + const Word16 *subgain, /* i : subframe gain Q15*/ + const Word32 frame_gain, /* i : frame gain Q18 */ + const Word16 *win, /* i : window Q15*/ + const Word16 *subwin, /* i : subframes window Q15*/ + const Word16 Q_bwe_exc, + Word16 L_frame, /* i : Frame length - determines whether 12.8 or 16kHz core in-use */ + Word16 dynQ, /* i : indicate whether output is dynamic Q, or Q0 */ + Word16 *Qx, /* o : newly computed Q factor for synSHB */ + Word16 prev_Qx, /* i : prev_Qx for memory scaling */ + Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx */ +) +{ + const Word16 *skip; + Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp; + Word16 join_length, num_join; + Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD]; + Word16 sum_gain; + Word32 L_tmp; + Word16 max_val, abs_sig, sc1, sc2, shift, max_headroom, min_shift, max_shift, max_shift2; + /* Init */ + set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD ); + + /* apply gain for each subframe, and store noise output signal using overlap-add */ + IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) + { + /* WB Gain shape and gain frame application with overlap */ + skip = skip_bands_WB_TBE; + move16(); + l_frame = L_FRAME16k / 4; + move16(); + l_shb_lahead = L_SHB_LAHEAD / 4; + move16(); + + sum_gain = 0; + move16(); + FOR( k = 0; k < length / 2; k++ ) + { + sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */ + mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); + move32(); /* Q_bwe_exc + 16 */ + mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); + move32(); /* Q_bwe_exc + 16 */ + } + FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) + { + FOR( k = 0; k < length; k++ ) + { + L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */ + sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */ + mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 ); + move32(); /* Q_bwe_exc + 16 */ + } + } + FOR( k = 0; k < length / 2; k++ ) + { + sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */ + mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] ); + move32(); /* Q_bwe_exc + 16 */ + } + } + ELSE + { + /* SWB Gain shape and gain frame application with overlap */ + l_frame = L_FRAME16k; + move16(); + l_shb_lahead = L_SHB_LAHEAD; + move16(); + skip = skip_bands_SWB_TBE; + move16(); + + num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; + move16(); + join_length = i_mult2( num_join, length ); + j = 0; /* ptr*/ + move16(); + FOR( k = 0; k < length; k++ ) + { + sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */ + mod_syn[j] = L_mult( synSHB[j], sum_gain ); + move32(); /* Q_bwe_exc + 16 */ + j++; + } + + FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) + { + FOR( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] ); + move32(); /* Q_bwe_exc + 16 */ + j++; + } + + FOR( k = 0; k < length; k++ ) + { + L_tmp = L_mult0( subwin[k + 1], subgain[i_mult2( ( i + 1 ), num_join )] ); /* Q30 */ + sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */ + mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 ); + move32(); /* Q_bwe_exc + 16 */ + j++; + } + } + FOR( k = 0; k < join_length - length; k++ ) + { + mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); + move32(); /* Q_bwe_exc + 16 */ + j++; + } + FOR( k = 0; k < length; k++ ) + { + sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */ + mod_syn[j] = L_mult( synSHB[j], sum_gain ); + move32(); /* Q_bwe_exc + 16 */ + j++; + } + } + + + max_val = 0; + move16(); + FOR( i = 0; i < l_frame + l_shb_lahead; i++ ) + { + abs_sig = abs_s( round_fx( mod_syn[i] ) ); + if ( GT_16( abs_sig, max_val ) ) + { + max_val = abs_sig; + move16(); + } + } + + FOR( i = 0; i < HILBERT_MEM_SIZE; i++ ) + { + abs_sig = abs_s( round_fx( Hilbert_Mem[i] ) ); + if ( GT_16( abs_sig, max_val ) ) + { + max_val = abs_sig; + move16(); + } + } + + sc1 = norm_s( max_val ); /* max_val headroom in mod_syn[] */ + sc2 = norm_s( round_fx( frame_gain ) ); /* headroom in GainFrame */ + + IF( dynQ == 0 ) + { + shift = sub( 13, Q_bwe_exc ); /* earlier = (10 - Q_bwe_exc) but we changed GainFrame Q21 to Q18 */ + *Qx = 0; + move16(); + } + ELSE IF( EQ_16( L_frame, L_FRAME ) ) /* 12.8k core */ + { + max_headroom = sub( add( sc1, sc2 ), 4 ); /* Max headroom after multiplying = sc1 + sc2 -3 (keep 3 bit extra headroom) */ + /* 12.8k core needs extra headroom than 16k core */ + /* otherwise Hilbert transform inside flip_and_downmix have saturation, causes ringing in output */ + + /* Qx = (Q_bwe_exc+3) + shift - 16 */ + /* make sure 14 > Qx > 2 */ + min_shift = sub( 2, sub( add( Q_bwe_exc, 3 ), 16 ) ); + max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) ); + max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */ + + shift = s_min( min_shift, max_shift2 ); + *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 ); + move16(); + } + ELSE /* 16k core */ + { + max_headroom = sub( add( sc1, sc2 ), 1 ); /* Max headroom after multiplying = sc1 + sc2 -1 (keep 1 bit extra headroom) */ + + /* Qx = (Q_bwe_exc+3) + shift - 16 */ + /* make sure 14 > Qx > 3 */ + min_shift = sub( 3, sub( add( Q_bwe_exc, 3 ), 16 ) ); + move16(); + max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) ); + move16(); + max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */ + + shift = s_min( min_shift, max_shift2 ); + *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 ); + move16(); + } + + /* bring memory st_fx->syn_overlap_fx[] = overlap[i] to new Q = Qx to prepare for addition */ + FOR( i = 0; i < l_shb_lahead; i++ ) + { + overlap[i] = shl( overlap[i], sub( *Qx, prev_Qx ) ); + move16(); + } + + FOR( i = 0; i < l_shb_lahead; i++ ) + { + /* mod_syn in (16+Q_bwe_exc), frame_gain in Q18 */ + L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */ + synSHB[i] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[i] ), shift ) ); /* Qx */ + move16(); + synSHB[i] = add_sat( synSHB[i], overlap[i] ); + move16(); /* Qx */ + synSHB[i + l_shb_lahead] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx */ + move16(); + } + + FOR( ; i < l_frame; i++ ) + { + L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */ + synSHB[i] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx; */ + move16(); + } + + l_frame_tmp = add( l_frame, l_shb_lahead ); + FOR( ; i < l_frame_tmp; i++ ) + { + L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* (Q_bwe_exc+3) */ + overlap[i - l_frame] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ), shift ) ); /* Qx */ + move16(); + } + + return; +} + +/*-------------------------------------------------------------------* + * non_linearity() + * + * Apply a non linearity to the SHB excitation + * -------------------------------------------------------------------*/ + +static Word32 non_linearity_scaled_copy( + const Word16 input[], + Word16 j, + const Word16 length, + Word32 output[], + Word32 prev_scale, + const Word16 scale_step, + const Word16 en_abs ) +{ + Word16 i; + Word32 L_tmp; + + + IF( en_abs ) + { + FOR( i = 0; i < j; i++ ) + { + L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ + L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ + output[i] = L_tmp; + move32(); + + L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ + prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ + } + FOR( ; i < length; i++ ) + { + L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ + L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ + output[i] = L_tmp; + move32(); + } + } + ELSE + { + FOR( i = 0; i < j; i++ ) + { + L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ + L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ + + if ( input[i] < 0 ) + { + L_tmp = L_negate( L_tmp ); + } + output[i] = L_tmp; + move32(); + + L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ + prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ + } + + FOR( ; i < length; i++ ) + { + L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ + L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ + + if ( input[i] < 0 ) + { + L_tmp = L_negate( L_tmp ); + } + output[i] = L_tmp; + move32(); + } + } + return prev_scale; +} + + +/*-------------------------------------------------------------------* + * non_linearity() + * + * Apply a non linearity to the SHB excitation + * -------------------------------------------------------------------*/ + +static Word32 non_linearity_scaled_copy_ivas( + const Word16 input[], + Word16 j, + const Word16 length, + Word32 output[], + Word32 prev_scale, + const Word16 scale_step, + const Word16 en_abs ) +{ + Word16 i; + Word32 L_tmp; + + + IF( en_abs ) + { + FOR( i = 0; i < j; i++ ) + { + L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */ + L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ + + test(); + test(); + if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) + { + /* NOTE: this is done to avoid the product to become zero for small non-zero input */ + L_tmp = 1; + move16(); + } + + output[i] = L_tmp; + move32(); + + L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ + prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ + } + FOR( ; i < length; i++ ) + { + /* L_tmp = (input[i] * input[i]) * prev_scale;*/ + L_tmp = Mpy_32_16_1( Mpy_32_16_1( prev_scale, input[i] ), input[i] ); /* 2*Q_inp */ + + test(); + test(); + if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) + { + /* NOTE: this is done to avoid the product to become zero for small non-zero input */ + L_tmp = 1; + move16(); + } + output[i] = L_tmp; + move32(); + } + } + ELSE + { + FOR( i = 0; i < j; i++ ) + { + L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */ + L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ + + test(); + test(); + if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) + { + /* NOTE: this is done to avoid the product to become zero for small non-zero input */ + L_tmp = 1; + move16(); + } + + if ( input[i] < 0 ) + { + L_tmp = L_negate( L_tmp ); + } + output[i] = L_tmp; + move32(); + + L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ + prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ + } + + FOR( ; i < length; i++ ) + { + L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ + L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ + test(); + test(); + if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) + { + /* NOTE: this is done to avoid the product to become zero for small non-zero input */ + L_tmp = 1; + move16(); + } + + if ( input[i] < 0 ) + { + L_tmp = L_negate( L_tmp ); + } + output[i] = L_tmp; + move32(); + } + } + return prev_scale; +} + + +/*==========================================================================*/ +/* FUNCTION : void non_linearity() */ +/*--------------------------------------------------------------------------*/ +/* PURPOSE : Apply a non linearity to the SHB excitation */ +/*--------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* Word16 input[] i : input signal Q_inp */ +/* Word16 length i : input length */ +/*--------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* Word32 output[] o : output signal 2*Q_inp */ +/*--------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* Word32 *prev_scale i/o: memory Q30 */ +/*--------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*--------------------------------------------------------------------------*/ +/* CALLED FROM : */ +/*==========================================================================*/ + +void non_linearity_fx( + const Word16 input[], /* i : input signal Q_inp */ + Word32 output[], /* o : output signal 2*Q_inp */ + const Word16 length, /* i : input length */ + Word32 *pPrevScale, /* i/o: memory Q30 */ + Word16 Q_inp, + Word16 coder_type, /* i : Coder Type */ + Word16 *voice_factors, /* i : Voice Factors */ + const Word16 L_frame /* i : ACELP frame length */ + +) +{ + Word16 i, j; + Word16 max_val = 0; + move16(); + Word32 scale; + Word16 scale_step; + Word16 exp, tmp; + Word16 e_tmp, f_tmp; + Word16 frac; + Word32 L_tmp; + Word32 L_tmp1; + + Word16 en_abs = 0; + Word16 v_fac = 0; + move16(); + move16(); + Word16 ths; + Word16 nframes; + Word32 prev_scale; + Word16 length_half; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + + IF( EQ_16( L_frame, L_FRAME16k ) ) + { + nframes = 5; + move16(); + ths = 17817; + move16(); /* 0.87*5 in Q12 */ + } + ELSE + { + nframes = 4; + move16(); + ths = 15400; + move16(); /* 0.94*4 in Q12 */ + } + + + FOR( i = 0; i < nframes; i++ ) + { + v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */ + } + + test(); + if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) ) + { + en_abs = 1; + move16(); + } + + length_half = shr( length, 1 ); + prev_scale = *pPrevScale; + move32(); + + + /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ + + FOR( i = j = 0; i < length_half; i++ ) + { + tmp = abs_s( input[i] ); + if ( GT_16( tmp, max_val ) ) + { + j = i; + move16(); + } + max_val = s_max( max_val, tmp ); + } + + + IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + { + exp = norm_s( max_val ); + tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ + scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */ + } + ELSE + { + scale = 1438814044; + move32(); /* Q31; 0.67 in Q31 */ + } + + test(); + IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) ) + { + scale_step = 16384; + move16(); /* Q14 */ + prev_scale = L_shr( scale, 1 ); /* Q30 */ + } + ELSE + { + + /* Computing log2(scale) */ + IF( j == 0 ) + { + scale_step = 32767; + move16(); + } + ELSE + { + e_tmp = norm_l( scale ); + f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); + e_tmp = sub( -1, e_tmp ); + L_tmp = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */ + + /* Computing log2(prev_scale) */ + e_tmp = norm_l( prev_scale ); + f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); + e_tmp = negate( e_tmp ); + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */ + + /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ + L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ + + /* Computing 1/j */ + exp = norm_s( j ); + tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */ + + /* (log2(scale / prev_scale))/length */ + L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ + + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 14, frac ) ); + scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */ + } + } + + prev_scale = non_linearity_scaled_copy( input, j, length_half, output, prev_scale, scale_step, en_abs ); + + max_val = 0; + move16(); + j = shr( length, 1 ); + FOR( i = length_half; i < length; i++ ) + { + tmp = abs_s( input[i] ); + if ( GT_16( tmp, max_val ) ) + { + j = i; + move16(); + } + max_val = s_max( max_val, tmp ); + } + + IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + { + exp = norm_s( max_val ); + tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ + scale = L_shl_o( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */ + } + ELSE + { + scale = 1438814044; + move32(); /* Q31; 0.67 in Q31 */ + } + + test(); + IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) ) + { + scale_step = 16384; + move16(); /*Q14 */ + prev_scale = L_shr( scale, 1 ); /*Q30 */ + } + ELSE + { + /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */ + /* Computing log2(scale) */ + IF( EQ_16( j, length_half ) ) + { + scale_step = 32767; + move16(); /*Q14 */ + } + ELSE + { + e_tmp = norm_l( scale ); + f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); + e_tmp = sub( -e_tmp, 1 ); + L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ + + /* Computing log2(prev_scale) */ + e_tmp = norm_l( prev_scale ); + f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); + e_tmp = negate( e_tmp ); + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ + + /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ + L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ + + /* Computing 1/(j - length/2) */ + + tmp = sub( j, length_half ); + exp = norm_s( tmp ); + + + tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */ + + /* (log2(scale / prev_scale))/length */ + L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ + + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 14, frac ) ); + scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */ + } + } + + prev_scale = non_linearity_scaled_copy( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs ); + + *pPrevScale = prev_scale; + move32(); + + /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ + + return; +} + + +/*==========================================================================*/ +/* FUNCTION : void non_linearity_ivas_fx() */ +/*--------------------------------------------------------------------------*/ +/* PURPOSE : Apply a non linearity to the SHB excitation */ +/*--------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* Word16 input[] i : input signal Q_inp */ +/* Word16 length i : input length */ +/*--------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* Word32 output[] o : output signal 2*Q_inp */ +/*--------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* Word32 *prev_scale i/o: memory Q30 */ +/*--------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*--------------------------------------------------------------------------*/ +/* CALLED FROM : */ +/*==========================================================================*/ + +void non_linearity_ivas_fx( + const Word16 input[], /* i : input signal Q_inp */ + Word32 output[], /* o : output signal 2*Q_inp */ + const Word16 length, /* i : input length */ + Word32 *pPrevScale, /* i/o: memory Q30 */ + Word16 Q_inp, + Word16 coder_type, /* i : Coder Type */ + Word16 *voice_factors, /* i : Voice Factors */ + const Word16 L_frame /* i : ACELP frame length */ + +) +{ + Word16 i, j; + Word16 max_val = 0; + move16(); + Word32 scale; + Word16 scale_step; + Word16 exp, tmp; + Word16 e_tmp, f_tmp; + Word16 frac; + Word32 L_tmp; + Word32 L_tmp1; + + Word16 en_abs = 0; + Word16 v_fac = 0; + move16(); + move16(); + Word16 ths; + Word16 nframes; + Word32 prev_scale; + Word16 length_half; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + + IF( EQ_16( L_frame, L_FRAME16k ) ) + { + nframes = 5; + move16(); + ths = 17817; + move16(); /* 0.87*5 in Q12 */ + } + ELSE + { + nframes = 4; + move16(); + ths = 15400; + move16(); /* 0.94*4 in Q12 */ + } + + + FOR( i = 0; i < nframes; i++ ) + { + v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */ + } + + test(); + if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) ) + { + en_abs = 1; + move16(); + } + + length_half = shr( length, 1 ); + prev_scale = *pPrevScale; + move32(); + + + /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ + + FOR( i = j = 0; i < length_half; i++ ) + { + tmp = abs_s( input[i] ); + if ( GT_16( tmp, max_val ) ) + { + j = i; + move16(); + } + max_val = s_max( max_val, tmp ); + } + + + IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + { + exp = norm_s( max_val ); + tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ + scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */ + } + ELSE + { + scale = 1438814044; + move32(); /* Q31; 0.67 in Q31 */ + } + + test(); + IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ) /*Q30 -> Q31*/, scale /*Q31*/ ) ) + { + scale_step = 16384; + move16(); /* Q14 */ + prev_scale = L_shr( scale, 1 ); /* Q30 */ + } + ELSE + { + + /* Computing log2(scale) */ + IF( j == 0 ) + { + scale_step = 32767; + move16(); + } + ELSE + { + e_tmp = norm_l( scale ); + f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); + e_tmp = sub( -1, e_tmp ); + L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ + + /* Computing log2(prev_scale) */ + e_tmp = norm_l( prev_scale ); + f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); + e_tmp = negate( e_tmp ); + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ + + /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ + L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ + + /* Computing 1/j */ + exp = norm_s( j ); + tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */ + + /* (log2(scale / prev_scale))/length */ + L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ + + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 14, frac ) ); + scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */ + } + } + + prev_scale = non_linearity_scaled_copy_ivas( input, j, length_half, output, prev_scale, scale_step, en_abs ); + + max_val = 0; + move16(); + j = shr( length, 1 ); + FOR( i = length_half; i < length; i++ ) + { + tmp = abs_s( input[i] ); + if ( GT_16( tmp, max_val ) ) + { + j = i; + move16(); + } + max_val = s_max( max_val, tmp ); + } + + IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + { + exp = norm_s( max_val ); + tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ + scale = L_shl_o( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */ + } + ELSE + { + scale = 1438814044; + move32(); /* Q31; 0.67 in Q31 */ + } + + test(); + IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ), scale ) ) + { + scale_step = 16384; + move16(); /*Q14 */ + prev_scale = L_shr( scale, 1 ); /*Q30 */ + } + ELSE + { + /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */ + /* Computing log2(scale) */ + IF( EQ_16( j, length_half ) ) + { + scale_step = 32767; + move16(); /*Q14 */ + } + ELSE + { + e_tmp = norm_l( scale ); + f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); + e_tmp = sub( -e_tmp, 1 ); + L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ + + /* Computing log2(prev_scale) */ + e_tmp = norm_l( prev_scale ); + f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); + e_tmp = negate( e_tmp ); + L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ + + /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ + L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ + + /* Computing 1/(j - length/2) */ + + tmp = sub( j, length_half ); + exp = norm_s( tmp ); + + + tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */ + + /* (log2(scale / prev_scale))/length */ + L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ + + frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ + + tmp = extract_l( Pow2( 14, frac ) ); + scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */ + } + } + + prev_scale = non_linearity_scaled_copy_ivas( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs ); + + *pPrevScale = prev_scale; + move32(); + + /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ + + return; +} + + +/*-------------------------------------------------------------------* + * create_random_vector() + * + * creates random number vector + * Note: the abs(max_val) value coming out of create_random_vector should + * fit into the precision of Q6. + * -------------------------------------------------------------------*/ + +void create_random_vector_fx( + Word16 output[], /* o : output random vector Q5*/ + const Word16 length, /* i : length of random vector */ + Word16 seed[] /* i/o: start seed */ +) +{ + Word16 i, j, k; + Word16 scale1, scale2; + Word32 L_tmp; + + L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[0] ) ) ); /*Q23 */ + j = extract_l( L_shr( L_tmp, 23 ) ); + j = s_and( j, 0xff ); + + L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */ + k = extract_l( L_shr( L_tmp, 23 ) ); + k = s_and( k, 0xff ); + + WHILE( EQ_16( k, j ) ) + { + L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */ + k = extract_l( L_shr( L_tmp, 23 ) ); + k = s_and( k, 0xff ); + } + + scale1 = 18021; + move16(); /* 200.00f * 0.35f/0.1243f; */ + if ( Random( &seed[0] ) < 0 ) + { + scale1 = -18021; + move16(); /*Q5 */ /* -200.00f * 0.35f/0.1243f; */ + } + + scale2 = 7208; + move16(); /* 80.00f * 0.35f/0.1243f; */ + if ( Random( &seed[1] ) < 0 ) + { + scale2 = -7208; + move16(); /*Q5 */ /* -80.00f * 0.35f/0.1243f; */ + } + + FOR( i = 0; i < length; i++ ) + { + j = s_and( j, 0xff ); + k = s_and( k, 0xff ); + output[i] = round_fx( L_add( L_mult( scale1, gaus_dico_swb_fx[j] ), L_mult( scale2, gaus_dico_swb_fx[k] ) ) ); /*Q5 */ + move16(); + j++; + k++; + } + + return; +} + + +/*======================================================================================*/ +/* FUNCTION : interp_code_5over2_fx() */ +/*--------------------------------------------------------------------------------------*/ +/* PURPOSE : Used to interpolate the excitation from the core sample rate */ +/* of 12.8 kHz to 32 kHz. */ +/* Simple linear interpolator - No need FOR precision here. */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word16[]) inp_code_fx : input vector (Q12) */ +/* _ (Word16) inp_length : length of input vector */ +/*--------------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) interp_code_fx : output vector (Q12) */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ None */ +/*--------------------------------------------------------------------------------------*/ + +/* _ None */ +/*--------------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================================*/ + +void interp_code_5over2_fx( + const Word16 inp_code_fx[], /* i : input vector Qx*/ + Word16 interp_code_fx[], /* o : output vector Qx*/ + const Word16 inp_length /* i : length of input vector */ +) +{ + Word16 i, kk, kkp1, i_len2; + Word32 Ltemp; + Word16 factor_i_fx[5] = { 6554, 19661, 32767, 19661, 6554 }; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + Word16 factor_j_fx[5] = { 26214, 13107, 0, 13107, 26214 }; + move16(); + move16(); + move16(); + move16(); + move16(); + interp_code_fx[0] = inp_code_fx[0]; + move16(); /* Qx */ + + Ltemp = L_mult( inp_code_fx[0], factor_i_fx[3] ); /* Q(16+x) */ + Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[3] ); /* Q(16+x) */ + interp_code_fx[1] = round_fx( Ltemp ); /*Qx */ + move16(); + Ltemp = L_mult( inp_code_fx[0], factor_i_fx[4] ); /*Q(16+x) */ + Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[4] ); /*Q(16+x) */ + interp_code_fx[2] = round_fx( Ltemp ); /* Qx */ + move16(); + kk = 1; + move16(); + kkp1 = 2; + move16(); + i = 3; + move16(); + /*i_len2 = ( inp_length - 2 ) * HIBND_ACB_L_FAC; */ /*HIBND_ACB_L_FAC == 5/2 */ + i_len2 = sub( inp_length, 2 ); + i_len2 = shr( add( shl( i_len2, 2 ), i_len2 ), 1 ); /* rounding below during shr makes it non BE*/ + + FOR( ; i < i_len2; i += 5 ) + { + Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */ + Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[0] ); /*Q(16+x) */ + interp_code_fx[i] = round_fx( Ltemp ); /*Qx */ + move16(); + Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */ + Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[1] ); /*Q(16+x) */ + interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */ + move16(); + Ltemp = L_mult( inp_code_fx[kkp1], factor_i_fx[2] ); /*Q(16+x) */ + interp_code_fx[i + 2] = round_fx( Ltemp ); /*Qx */ + move16(); + kk++; + kkp1++; + + Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[3] ); /*Q(16+x) */ + Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[3] ); /*Q(16+x) */ + interp_code_fx[i + 3] = round_fx( Ltemp ); /*Qx */ + move16(); + Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[4] ); /*Q(16+x) */ + Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[4] ); /*Q(16+x) */ + interp_code_fx[i + 4] = round_fx( Ltemp ); /*Qx */ + move16(); + kk++; + kkp1++; + } + + Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */ + interp_code_fx[i] = round_fx( Ltemp ); /*Qx */ + move16(); + Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */ + interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */ + move16(); + return; +} + + +/*======================================================================================*/ +/* FUNCTION : interp_code_4over2_fx() */ +/*--------------------------------------------------------------------------------------*/ +/* PURPOSE : Used to interpolate the excitation from the core sample rate */ +/* of 16 kHz to 32 kHz. */ +/* Simple linear interpolator - No need for precision here. */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word16[]) inp_code_fx : input vector (Qx) */ +/* _ (Word16) inp_length : length of input vector */ +/*--------------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16[]) interp_code_fx : output vector (Qx) */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ None */ +/*--------------------------------------------------------------------------------------*/ + +/* _ None */ +/*--------------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================================*/ + +void interp_code_4over2_fx( + const Word16 inp_code_fx[], /* i : input vector Qx*/ + Word16 interp_code_fx[], /* o : output vector Qx*/ + const Word16 inp_length /* i : length of input vector */ +) +{ + Word16 i, j; + j = 0; + move16(); + FOR( i = 0; i < inp_length - 1; i++ ) + { + interp_code_fx[j] = inp_code_fx[i]; + move16(); /*Qx */ + interp_code_fx[j + 1] = add( shr( inp_code_fx[i], 1 ), shr( inp_code_fx[i + 1], 1 ) ); + move16(); + move16(); /*Qx */ + j = add( j, 2 ); + } + + interp_code_fx[j] = inp_code_fx[i]; + move16(); + interp_code_fx[j + 1] = shr( inp_code_fx[i], 1 ); + move16(); /*Qx */ + + return; +} + + +/*-------------------------------------------------------------------* + * wb_tbe_extras_reset_synth() + * + * Reset the extra parameters only required for WB TBE synthesis + *-------------------------------------------------------------------*/ + +void wb_tbe_extras_reset_synth_fx( + Word16 state_lsyn_filt_shb[], + Word16 state_lsyn_filt_dwn_shb[], + Word16 state_32and48k_WB_upsample[], + Word16 state_resamp_HB[] ) +{ + set16_fx( state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); + set16_fx( state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); + set16_fx( state_32and48k_WB_upsample, 0, 2 * ALLPASSSECTIONS_STEEP ); + set16_fx( state_resamp_HB, 0, INTERP_3_1_MEM_LEN ); + + return; +} +#if defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 ) && defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 ) +static inline Word64 wmac_1616( Word64 x1, Word16 x2, Word16 x3 ) +{ + return W_mac_16_16( x1, x2, x3 ); +} + +static inline Word64 wmac_3216( Word64 x1, Word32 x2, Word16 x3 ) +{ + return W_mac_32_16( x1, x2, x3 ); +} + +static inline Word64 finalSat16( Word64 W_tmpx, Word64 W_tmpy ) +{ + return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +} + +static inline Word64 finalSat32( Word64 W_tmpx, Word64 W_tmpy ) +{ + return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); +} + +inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *input32_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) +{ + Word32 L_tmpX; + Word16 i; + Word32 L_tmpMax2 = *L_tmpMax; + Word32 L_tmpAbs; + move32(); + + if ( input16_fx > 0 ) + { + Word64 ( *wmac )( Word64, Word16, Word16 ); + Word64 ( *finalSat )( Word64, Word64 ); + Word16 *input_fx = input16_fx; + wmac = wmac_1616; + finalSat = finalSat16; + } + if ( input32_fx > 0 ) + { + Word64 ( *wmac )( Word64, Word32, Word16 ); + Word64 ( *finalSat )( Word64, Word64 ); + Word32 *input_fx = input32_fx; + wmac = wmac_3216; + finalSat = finalSat32; + } + + IF( !IsUpsampled3 ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + } + } /*IsUpsampled3*/ + ELSE + { /*IsUpsampled3*/ + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = wmac( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = wmac( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ + move32(); + if ( *L_tmpMax > 0 ) + { + L_tmpAbs = L_abs( L_tmp[i] ); + } + if ( *L_tmpMax > 0 ) + { + L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); + } + i++; + } + } /*IsUpsampled3*/ + *L_tmpMax = L_tmpMax2; + move32(); +} +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + +/*-------------------------------------------------------------------* + * elliptic_bpf_48k_generic() + * + * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz + * Implemented as 3 fourth order sections cascaded. + *-------------------------------------------------------------------*/ + +void elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + int isIVAS, +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 IsUpsampled3, + Word16 input_fx[], /* i : input signal Q_input_fx*/ +#else + const Word16 input_fx[], /* i : input signal Q_input_fx*/ +#endif + Word16 *Q_input_fx, + Word16 output_fx[], /* o : output signal memory_fx_Q */ + Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ + Word16 memory_fx_Q[], + const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ +) +{ + Word16 i, j; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 memory_fx0, Q_temp, Q_temp2; + Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; + Word32 L_tmpMax; + Word32 L_tmpX; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + Word64 W_tmpX; + Word64 W_tmpY; +#endif + + Word32 *L_tmp = &L_tmp_buffer[4]; + Word32 *L_tmp2 = &L_tmp2_buffer[4]; + Word32 *L_output = &L_output_buffer[4]; +#else + Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; + Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; + Word32 memory2_fx_2[4], memory2_fx_3[4]; +#endif + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + FOR( i = 0; i < 4; i++ ) + { + memory_fx0 = extract_l( memory_fx2[0][i] ); + input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); + L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + move32(); + move32(); + } + +#else + FOR( i = 0; i < 4; i++ ) + { + memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); + memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); + memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + move32(); + move32(); + } +#endif + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( input_fx, 0, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + IF( !IsUpsampled3 ) + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } + } + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } + } + } /*IsUpsampled3*/ + ELSE + { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } + } + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } + } + } /*IsUpsampled3*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ + +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + + memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; + memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; + memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; + memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; + move32(); + move32(); + move32(); + move32(); + move32(); + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 + elliptic_bpf_48k_generic_func1( 0, L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + } + ELSE +#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } + } + +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ + move32(); + L_tmpMax = L_abs( L_tmp2[0] ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); + L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } +#endif + + + Q_temp = norm_l( L_tmpMax ); + Q_temp = sub( Q_temp, 4 ); + Scale_sig32( L_tmp2, 960, Q_temp ); + + memory_fx2[1][0] = L_tmp[L_FRAME48k - 4]; + memory_fx2[1][1] = L_tmp[L_FRAME48k - 3]; + memory_fx2[1][2] = L_tmp[L_FRAME48k - 2]; + memory_fx2[1][3] = L_tmp[L_FRAME48k - 1]; + move32(); + move32(); + move32(); + move32(); + move32(); + +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + FOR( j = 0; j < 4; j++ ) + { + L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + } + + L_tmpMax = L_add( 0, 0 ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ + elliptic_bpf_48k_generic_func1( 0, L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } + } + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } + } + +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ + FOR( j = 0; j < 4; j++ ) + { + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + } + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ + move32(); + L_tmpMax = L_abs( L_output[0] ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ + L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); + + L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); + + FOR( i = 4; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } + +#endif + + + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; + memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; + memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; + memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1]; + memory_fx2[3][0] = L_output[L_FRAME48k - 4]; + memory_fx2[3][1] = L_output[L_FRAME48k - 3]; + memory_fx2[3][2] = L_output[L_FRAME48k - 2]; + memory_fx2[3][3] = L_output[L_FRAME48k - 1]; + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + move32(); + memory_fx_Q[0] = *Q_input_fx; + memory_fx_Q[1] = add( *Q_input_fx, 11 ); + memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp ); + memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp ); + move16(); + move16(); + move16(); + move16(); + Q_temp2 = norm_l( L_tmpMax ); + Scale_sig32( L_output, 960, Q_temp2 ); + FOR( i = 0; i < 960; i++ ) + { + output_fx[i] = extract_h( L_output[i] ); + move16(); + } + *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); + move16(); /* BASOP_NOGLOB */ + + return; +} +/*-------------------------------------------------------------------* + * synthesise_fb_high_band() + * + * Creates the highband output for full band - 14.0 to 20 kHz + * Using the energy shaped white excitation signal from the SWB BWE. + * The excitation signal input is sampled at 16kHz and so is upsampled + * to 48 kHz first. + * Uses a complementary split filter to code the two regions from + * 14kHz to 16kHz and 16 kHz to 20 kHz. + * One of 16 tilt filters is also applied afterwards to further + * refine the spectral shape of the fullband signal. + * The tilt is specified in dB per kHz. N.B. Only negative values are + * accomodated. + *-------------------------------------------------------------------*/ + +void synthesise_fb_high_band_fx( + const Word16 excitation_in[], /* i : full band excitation */ + Word16 Q_fb_exc, + Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ + const Word32 fb_exc_energy, /* i : full band excitation energy */ + const Word16 ratio, /* i : energy ratio */ + const Word16 L_frame, /* i : ACELP frame length */ + const Word16 bfi, /* i : fec flag */ + Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ + Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ + Word16 bpf_memory_Q[], + Word16 Qout +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + , + Word16 isIVAS +#endif +) +{ + Word16 i, j; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; + Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; +#else + Word16 excitation_in_interp3[L_FRAME48k]; +#endif + Word16 tmp[L_FRAME48k]; + Word32 temp1; + Word32 ratio2; + Word32 L_tmp; + Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; + + /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ + j = 0; + /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ + FOR( i = 0; i < L_FRAME48k; i += 3 ) + { + excitation_in_interp3[i] = mult( excitation_in[j], 24576 ); /* Q(Q_fb_exc+13-15 = Q_fb_exc-2) */ + move16(); + excitation_in_interp3[i + 1] = 0; + move16(); + excitation_in_interp3[i + 2] = 0; + move16(); + j++; + } + exp_tmp = sub( Q_fb_exc, 2 ); + + IF( EQ_16( L_frame, L_FRAME16k ) ) + { + /* for 16kHz ACELP core */ + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + isIVAS, +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx + + ); + } + ELSE + { + /* for 12.8kHz ACELP core */ + elliptic_bpf_48k_generic_fx( +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 + isIVAS, +#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + 1, // IsUpsampled3 +#endif + excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); + } + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ + + push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); + temp1 = sum2_fx_mod( tmp, L_FRAME48k ); + L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ + exp = norm_l( L_tmp ); + tmp3 = extract_h( L_shl( L_tmp, exp ) ); + tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/ + exp = sub( sub( 31, tmp1 ), exp ); + + exp2 = norm_l( temp1 ); + tmp2 = extract_h( L_shl( temp1, exp2 ) ); + exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/ + + exp = sub( exp2, exp ); /* Denormalize and substract */ + IF( GT_16( tmp2, tmp3 ) ) + { + tmp2 = shr( tmp2, 1 ); + exp = add( exp, 1 ); + } + IF( 0 != tmp3 ) + { + tmp3 = div_s( tmp2, tmp3 ); + L_tmp = L_deposit_h( tmp3 ); + L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/ + ratio2 = Mult_32_16( L_tmp, ratio ); /*Q(31-exp+0-15 = 16-exp)*/ + } + ELSE + { + ratio2 = 0; + } + + IF( !bfi ) + { + *prev_fbbwe_ratio = ratio; + move16(); + } + ELSE + { + /**prev_fbbwe_ratio = ratio*0.5f;*/ + *prev_fbbwe_ratio = shr( ratio, 1 ); + move16(); + } + tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ + IF( L_tmp < 0 ) + { + output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ + move16(); + } + ELSE + { + output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ + move16(); + } + } + pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ + return; +} + +/*-------------------------------------------------------------------* + * Estimate_mix_factors_fx() * + * * + * Estimate mix factors for SHB excitation generation * + *-------------------------------------------------------------------*/ +void Estimate_mix_factors_fx( + const Word16 *shb_res, /* i : SHB LP residual in Q = Q_shb */ + const Word16 Q_shb, + const Word16 *exc16kWhtnd, /* i : SHB transformed low band excitation Q_bwe_exc */ + const Word16 Q_bwe_exc, + const Word16 *White_exc16k_frac, /* i : Modulated envelope shaped white noise Q_frac */ + const Word16 Q_frac, + const Word32 pow1, /* i : SHB exc. power for normalization in Q_pow1 */ + const Word16 Q_pow1, + const Word32 pow22, /* i : White noise excitation for normalization in Q_pow22 */ + const Word16 Q_pow22, + Word16 *vf_modified, /* o : Estimated voice factors */ + Word16 *vf_ind /* o : voice factors VQ index */ +) +{ + Word16 shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k]; + Word32 pow3, temp_p1_p2, temp_p1_p3; + Word16 temp_numer1[L_FRAME16k], temp_numer2[L_FRAME16k]; + Word16 i, length; + Word16 exp1, exp2, expa, expb, fraca, fracb, scale, num_flag, den_flag; + Word16 tmp, tmp1, sc1, sc2; + Word32 L_tmp1, L_tmp2; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + Copy( shb_res, shb_res_local, L_FRAME16k ); + Copy( White_exc16k_frac, WN_exc_local, L_FRAME16k ); + /* WN_exc_local in (Q_frac) */ + + pow3 = Dot_product( shb_res_local, shb_res_local, L_FRAME16k ); /* (2*Q_shb+1) */ + + pow3 = L_add( pow3, L_shl( 21475l /*0.00001f in Q31*/, 2 * Q_shb + 1 - 31 ) ); /* (2*Q_shb+1) */ + if ( pow3 == 0 ) + { + pow3 = 1; + move32(); + } + + /* temp_p1_p2 = (float)sqrt(pow1/pow2); */ + temp_p1_p2 = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp1 ); /* temp_p1_p3 in (Q31+exp1) */ + + /* temp_p1_p3 = (float)sqrt(pow1/pow3); */ + temp_p1_p3 = root_a_over_b_fx( pow1, Q_pow1, pow3, ( 2 * Q_shb + 1 ), &exp2 ); /* temp_p1_p3 in (Q31+exp2) */ + + + sc1 = sub( Q_bwe_exc, sub( Q_frac, exp1 ) ); + sc2 = sub( Q_bwe_exc, sub( Q_shb, exp2 ) ); + FOR( i = 0; i < L_FRAME16k; i++ ) + { + L_tmp1 = Mult_32_16( temp_p1_p2, WN_exc_local[i] ); /* (Q_frac - exp1) +16 */ + WN_exc_local[i] = round_fx( L_tmp1 ); + move16(); + L_tmp2 = Mult_32_16( temp_p1_p3, shb_res_local[i] ); /* (Q_shb - exp2) +16 */ + shb_res_local[i] = round_fx( L_tmp2 ); + move16(); + /* temp_numer1[i] = sub(shb_res_local[i], WN_exc_local[i]); */ + temp_numer1[i] = round_fx_sat( L_sub_sat( L_shl_sat( L_tmp2, sc2 ), L_shl_sat( L_tmp1, sc1 ) ) ); + move16(); + /* (Q_bwe_exc) */ + + /* temp_numer2[i] = sub(exc16kWhtnd[i], WN_exc_local[i]); */ + temp_numer2[i] = sub_sat( exc16kWhtnd[i], round_fx_sat( L_shl_sat( L_tmp1, sc1 ) ) ); + move16(); + /* (Q_bwe_exc) */ + } + + + length = L_FRAME16k; + move16(); + temp_p1_p2 = Dot_product( temp_numer1, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */ + temp_p1_p3 = Dot_product( temp_numer2, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */ + + /* vf_modified[i] = min( max_val( (temp_p1_p2 / temp_p1_p3), 0.1f), 0.99f); */ + /* tmp = (temp_p1_p2 / temp_p1_p3); */ + IF( temp_p1_p3 > 0 ) + { + expa = norm_l( temp_p1_p3 ); + fraca = extract_h( L_shl( temp_p1_p3, expa ) ); + expa = sub( 30, expa ); + + expb = norm_l( temp_p1_p2 ); + fracb = round_fx_o( L_shl_o( temp_p1_p2, expb, &Overflow ), &Overflow ); + expb = sub( 30, expb ); + + num_flag = 0; + move16(); + IF( fraca < 0 ) + { + num_flag = 1; + move16(); + fraca = negate( fraca ); + } + + den_flag = 0; + move16(); + IF( fracb < 0 ) + { + den_flag = 1; + move16(); + fracb = negate( fracb ); + } + + scale = shr( sub( fraca, fracb ), 15 ); + fracb = shl( fracb, scale ); + expb = sub( expb, scale ); + + tmp = div_s( fracb, fraca ); + exp1 = sub( expb, expa ); + tmp = shl_sat( tmp, exp1 ); + if ( NE_16( num_flag, den_flag ) ) + { + tmp = negate( tmp ); + } + } + ELSE + { + tmp = 0; + move16(); + } + + vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ ); + move16(); + + *vf_ind = usquant_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ) ); + move16(); + + vf_modified[0] = tmp1; + move16(); + vf_modified[1] = tmp1; + move16(); + vf_modified[2] = tmp1; + move16(); + vf_modified[3] = tmp1; + move16(); + vf_modified[4] = tmp1; + move16(); + + /* vf_modified in Q15 */ + + return; +} +#ifdef ADD_IVAS_TBE_CODE +/*-------------------------------------------------------------------* + * tbe_celp_exc() * + * * + * Prepare adaptive part of TBE excitation * + *-------------------------------------------------------------------*/ + +void tbe_celp_exc( + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + float *bwe_exc, /* i/o: BWE excitation */ + const int16_t L_frame, /* i : frame length */ + const int16_t L_subfr, /* i : subframe length */ + const int16_t i_subfr, /* i : subframe index */ + const int16_t T0, /* i : integer pitch lag */ + const int16_t T0_frac, /* i : fraction of lag */ + float *error, /* i/o: error */ + const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ +) +{ + int16_t i, offset; + + if ( element_mode == IVAS_CPE_TD && idchan == 1 && !tdm_LRTD_flag ) + { + return; + } + + if ( L_frame == L_FRAME ) + { + offset = tbe_celp_exc_offset( T0, T0_frac ); + + for ( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) + { + bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int16_t) *error]; + } + *error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac; + } + else + { + offset = T0 * 2 + (int16_t) ( (float) T0_frac * 0.5f + 4 + 0.5f ) - 4; + for ( i = 0; i < L_subfr * 2; i++ ) + { + bwe_exc[i + i_subfr * 2] = bwe_exc[i + i_subfr * 2 - offset + (int16_t) *error]; + } + *error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac; + } + + return; +} +#endif +/*======================================================================================*/ +/* FUNCTION : prep_tbe_exc_fx() */ +/*--------------------------------------------------------------------------------------*/ +/* PURPOSE : Prepare TBE excitation */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word16) L_frame_fx : length of the frame */ +/* _ (Word16) i_subfr_fx : subframe index */ +/* _ (Word16) gain_pit_fx : Pitch gain (14) */ +/* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */ +/* _ (Word16*[]) code_fx : algebraic excitation (Q9) */ +/* _ (Word16) voice_fac_fx : voicing factor (Q15) */ +/* _ (Word16) gain_preQ_fx : prequantizer excitation gain */ +/* _ (Word16[]) code_preQ_fx : prequantizer excitation */ +/*--------------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ +/*--------------------------------------------------------------------------------------*/ + +/* _ None */ +/*--------------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================================*/ + +void prep_tbe_exc_fx( + const Word16 L_frame_fx, /* i : length of the frame */ +#ifdef ADD_IVAS_TBE_CODE + const Word16 L_subfr, +#endif + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + Word16 T0, /* i : integer pitch variables Q0 */ + Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + Word32 core_brate +#ifdef ADD_IVAS_TBE_CODE + , /* i : core bitrate */ + const int16_t element_mode, /* i : element mode */ + const int16_t idchan, /* i : channel ID */ + const int16_t flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ +#endif +) +{ + Word16 i; + Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; + Word16 tmp_code_preInt_fx[L_SUBFR]; + Word16 gain_code16 = 0; + move16(); + Word16 tmp /*, tmp1, tmp2*/; + /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ + Word16 pitch; + + Word32 L_tmp, Ltemp1, Ltemp2; + Word32 tempQ31; + Word16 tempQ15; +#ifndef ADD_IVAS_TBE_CODE + Word16 L_subfr = L_SUBFR; + move16(); +#endif +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; + = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) + *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */ + tempQ31 = L_deposit_h( VF_1st_PARAM_FX ); + tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); + tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); + *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); + move16(); + tmp = MAX_16; + move16(); + + pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ + + test(); + test(); + IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 /* 115.5 in Q7 */ ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) ) + { + tmp = MAX_16; + move16(); + *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); + move16(); + } + + *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); + move16(); +#ifdef ADD_IVAS_TBE_CODE + IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) + { + IF( flag_TD_BWE && i_subfr == 0 ) + { + set16_fx( bwe_exc, 0, L_FRAME32k ); + } + return; + } + +#endif + IF( EQ_16( L_frame_fx, L_FRAME ) ) + { + interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ + gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ + FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) + { + L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ + L_tmp = L_shl_sat( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ + L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */ + L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ + bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ + move16(); + } + } + ELSE + { + IF( gain_preQ_fx != 0 ) + { + FOR( i = 0; i < L_subfr; i++ ) + { + /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ + Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ + Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ + + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ + + tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ + move16(); + } + } + ELSE + { + FOR( i = 0; i < L_subfr; i++ ) + { + /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ + Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ + move16(); + } + } + + interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ + FOR( i = 0; i < L_subfr * 2; i++ ) + { + L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] ); /*Q14+Q_exc+1 */ + tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ + bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ + move16(); + } + } + + return; +} + +/*======================================================================================*/ +/* FUNCTION : prep_tbe_exc_ivas_fx() */ +/*--------------------------------------------------------------------------------------*/ +/* PURPOSE : Prepare TBE excitation */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* _ (Word16) L_frame_fx : length of the frame */ +/* _ (Word16) i_subfr_fx : subframe index */ +/* _ (Word16) gain_pit_fx : Pitch gain (14) */ +/* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */ +/* _ (Word16*[]) code_fx : algebraic excitation (Q9) */ +/* _ (Word16) voice_fac_fx : voicing factor (Q15) */ +/* _ (Word16) gain_preQ_fx : prequantizer excitation gain */ +/* _ (Word16[]) code_preQ_fx : prequantizer excitation */ +/*--------------------------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */ +/*--------------------------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ +/*--------------------------------------------------------------------------------------*/ + +/* _ None */ +/*--------------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================================*/ + +void prep_tbe_exc_ivas_fx( + const Word16 L_frame_fx, /* i : length of the frame */ +#if 1 // def ADD_IVAS_TBE_CODE + const Word16 L_subfr, +#endif + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + Word16 T0, /* i : integer pitch variables Q0 */ + Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + Word32 core_brate +#if 1 // def ADD_IVAS_TBE_CODE + , /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ +#endif +) +{ + Word16 i; + Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; + Word16 tmp_code_preInt_fx[L_SUBFR]; + Word16 gain_code16 = 0; + move16(); + Word16 tmp /*, tmp1, tmp2*/; + /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ + Word16 pitch; + + Word32 L_tmp, Ltemp1, Ltemp2; + Word32 tempQ31; + Word16 tempQ15; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; + = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) + *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */ + tempQ31 = L_deposit_h( VF_1st_PARAM_FX ); + tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); + tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); + *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); + move16(); + + tmp = MAX_16; + move16(); + + pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ + + test(); + test(); + IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) ) + { + tmp = MAX_16; + move16(); + *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); + move16(); + } + + *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); + move16(); +#if 1 // def ADD_IVAS_TBE_CODE + test(); + test(); + IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) + { + test(); + IF( flag_TD_BWE && i_subfr_fx == 0 ) + { + set16_fx( bwe_exc_fx, 0, L_FRAME32k ); + } + return; + } + +#endif + IF( EQ_16( L_frame_fx, L_FRAME ) ) + { + interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ + gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ + FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) + { + L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ + L_tmp = L_shl( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ + L_tmp = L_mac_o( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC], &Overflow ); /*Q15+Q_exc */ + L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ + bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ + move16(); + } + } + ELSE + { + Word16 shift = 4; + move16(); + IF( gain_preQ_fx != 0 ) + { + FOR( i = 0; i < L_subfr; i++ ) + { + /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ + Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ + Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ + + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */ + + tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ + move16(); + } + } + ELSE + { + FOR( i = 0; i < L_subfr; i++ ) + { + /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ + Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ + move16(); + } + } + + interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ + FOR( i = 0; i < shl( L_subfr, 1 ); i++ ) + { + L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */ + tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ + bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ + move16(); + } + } + + return; +} + +/*=============================================================================*/ +/* FUNCTION : void swb_formant_fac_fx ( ) */ +/*------------------------------------------------------------------------------*/ +/* PURPOSE : * Find strength of adaptive formant postfilter using tilt */ +/* of the high band. The 2nd lpc coefficient is used as a tilt approximation. */ +/*------------------------------------------------------------------------------*/ +/* INPUT ARGUMENTS : */ +/* const Word16 lpc_shb2 : 2nd HB LPC coefficient Q12 */ +/*------------------------------------------------------------------------------*/ +/*INPUT/OUTPUT ARGUMENTS : */ +/* Word16 *tilt_mem Q12 */ +/* OUTPUT ARGUMENTS : */ +/*------------------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* formant_fac :Formant filter strength [0,1] Q15 */ +/*------------------------------------------------------------------------------*/ +/* CALLED FROM : */ +/*==============================================================================*/ + +Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ + const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ + Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ +) +{ + Word16 formant_fac; + Word16 tmp; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; +#endif + + /* Smoothen tilt value */ + /* tmp = 0.5f * (float)fabs(lpc_shb2) + 0.5f * *tilt_mem; */ + tmp = mult_r( 16384, abs_s( lpc_shb2 ) ); + tmp = add( tmp, mult_r( 16384, *tilt_mem ) ); /* Q12 */ + *tilt_mem = tmp; + move16(); /*Q12 */ + /* Map to PF strength */ + /* formant_fac = (tmp - SWB_TILT_LOW)*SWB_TILT_DELTA; */ + tmp = sub( tmp, SWB_TILT_LOW_FX ); /* Q12 */ + formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */ + + + IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) ) + { + formant_fac = 4096; /* 1 in Q12 */ + move16(); + } + ELSE IF( formant_fac < 0 ) + { + formant_fac = 0; + move16(); + } + /* now formant_fac in Q12 */ + + /* formant_fac = 1.0f - 0.5f*formant_fac */ + tmp = mult_r( 16384, formant_fac ); /* 0.5 in Q15 */ + formant_fac = shl_o( sub( 4096 /* 1 in Q12 */, tmp ), 3, &Overflow ); + return formant_fac; /*Q15 */ +} + + +void wb_tbe_extras_reset_fx( + Word16 mem_genSHBexc_filt_down_wb2[], + Word16 mem_genSHBexc_filt_down_wb3[] ) +{ + set16_fx( mem_genSHBexc_filt_down_wb2, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); + set16_fx( mem_genSHBexc_filt_down_wb3, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); + + return; +} + +/*-------------------------------------------------------------------* + * get_tbe_bits() * + * * + * Determine TBE bit consumption per frame from bitrate * + *-------------------------------------------------------------------*/ + + +Word16 get_tbe_bits_fx( + const Word32 total_brate, /* o : TBE bit consumption per frame */ + const Word16 bwidth, /* i : overall bitrate */ + const Word16 rf_mode /* i : bandwidht mode */ +) +{ + Word16 i, bits = 0; + + IF( EQ_16( rf_mode, 1 ) ) + { + /* TBE bits for core, primary frame */ + test(); + test(); + IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) ) + { + /* Gain frame: 4, Gain shapes: 0, and LSFs: 2 */ + bits = NUM_BITS_SHB_FrameGain_LBR_WB + NUM_BITS_LBR_WB_LSF; + move16(); + } + ELSE IF( ( EQ_16( bwidth, SWB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) ) + { + /* Gain frame: 5, Gain shapes: 5, and lowrate LSFs: 8 */ + bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8; + move16(); + } + } + ELSE + { + test(); + test(); + IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_9k60 ) ) ) + { + bits = NUM_BITS_LBR_WB_LSF + NUM_BITS_SHB_FrameGain_LBR_WB; + move16(); + } + ELSE IF( ( EQ_16( bwidth, SWB ) ) || ( EQ_16( bwidth, FB ) ) ) + { + test(); + IF( EQ_32( total_brate, ACELP_9k60 ) ) + { + bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8; + move16(); + } + ELSE IF( ( GE_32( total_brate, ACELP_13k20 ) ) && ( LE_32( total_brate, ACELP_32k ) ) ) + { + bits = NUM_BITS_SHB_SUBGAINS + NUM_BITS_SHB_FRAMEGAIN + NUM_LSF_GRID_BITS + MIRROR_POINT_BITS; + move16(); + + FOR( i = 0; i < NUM_Q_LSF; i++ ) + { + bits = add( bits, lsf_q_num_bits[i] ); + } + } + + if ( GE_32( total_brate, ACELP_24k40 ) ) + { + bits = add( bits, NUM_BITS_SHB_ENER_SF + NUM_BITS_SHB_VF + NUM_BITS_SHB_RES_GS * NB_SUBFR16k ); + } + + test(); + test(); + if ( EQ_16( bwidth, SWB ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) ) + { + bits = add( bits, BITS_TEC + BITS_TFA ); + } + + if ( EQ_16( bwidth, FB ) ) + { + /* full band slope */ + bits = add( bits, 4 ); + } + } + } + + return bits; +} -- GitLab From e4e0064ef0d988798e8245771382c9311a6caf5e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 10:35:56 +0200 Subject: [PATCH 0334/1310] clang patch --- lib_com/prot_fx.h | 7 ++++--- lib_com/swb_tbe_com_fx.c | 7 ++++--- lib_dec/swb_tbe_dec_fx.c | 13 ++++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 018e3ef93..a1e5d0cdb 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3292,10 +3292,11 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout + Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , Word16 isIVAS -#endif + , + Word16 isIVAS +#endif ); void prep_tbe_exc_fx( diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 1e806bd6a..c41aaf6d0 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7371,7 +7371,7 @@ void elliptic_bpf_48k_generic_fx( return; } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW*/ void elliptic_bpf_48k_generic_fx( const Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -7675,9 +7675,10 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout + Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , Word16 isIVAS + , + Word16 isIVAS #endif ) { diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index c31008f5f..e910e5457 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4644,12 +4644,14 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS - , 1 + , + 1 #else - , 0 + , + 0 #endif #endif ); @@ -4721,9 +4723,10 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , 1 + , + 1 #endif ); -- GitLab From b6b5040636092a7de548d90ae804374190e3d779 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 11:08:02 +0200 Subject: [PATCH 0335/1310] fix FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW --- lib_com/prot_fx.h | 11 +++++++++++ lib_com/swb_tbe_com_fx.c | 8 ++++++++ lib_enc/swb_tbe_enc_fx.c | 12 ++++++++++++ 3 files changed, 31 insertions(+) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index a1e5d0cdb..07ef34533 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3264,6 +3264,7 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word16 isIVAS, @@ -3280,6 +3281,16 @@ void elliptic_bpf_48k_generic_fx( Word16 memory_fx_Q[], const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ); +#else +void elliptic_bpf_48k_generic_fx( + const Word16 input_fx[], /* i : i signal Q_input_fx */ + Word16 *Q_input_fx, + Word16 output_fx[], /* o : output signal */ + Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ + Word16 memory_fx_Q[], + const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ +); +#endif void synthesise_fb_high_band_fx( const Word16 excitation_in[], /* i : full band excitation */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c41aaf6d0..e6d579269 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7713,6 +7713,7 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS @@ -7723,10 +7724,14 @@ void synthesise_fb_high_band_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); +#else + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); +#endif } ELSE { /* for 12.8kHz ACELP core */ +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS @@ -7735,6 +7740,9 @@ void synthesise_fb_high_band_fx( 1, // IsUpsampled3 #endif excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); +#else + elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); +#endif } temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 30be6bedc..2987fb0cd 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,6 +7330,7 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS @@ -7342,6 +7343,9 @@ void fb_tbe_enc_fx( 0, // IsUpsampled3 #endif input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#else + elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#endif Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7470,6 +7474,7 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS @@ -7478,9 +7483,13 @@ void fb_tbe_enc_ivas_fx( 0, // IsUpsampled3 #endif input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#else + elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#endif } ELSE { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS @@ -7489,6 +7498,9 @@ void fb_tbe_enc_ivas_fx( 0, // IsUpsampled3 #endif input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#else + elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); +#endif } test(); -- GitLab From 5e7a155cd5eb3064a7187bfa9c6c092f4621d162 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 11:12:03 +0200 Subject: [PATCH 0336/1310] clang patch --- lib_enc/swb_tbe_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 2987fb0cd..648387bbf 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,7 +7330,7 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS -- GitLab From c9120743cda4609291d5d55a72d7538d5808c506 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 11:16:33 +0200 Subject: [PATCH 0337/1310] Revert "deactivate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW to test old bpf" This reverts commit a92d246a5f8be1868eb1bf99fd1264670041c5d8. --- .vs/IVAS_BASOP/v17/.wsuo | Bin 29696 -> 0 bytes .vs/IVAS_BASOP/v17/DocumentLayout.json | 59 - .vs/VSWorkspaceState.json | 7 - IVAS_cod.exe | Bin 6157824 -> 0 bytes Workspace_msvc/decoder.vcxproj | 344 +- Workspace_msvc/encoder.vcxproj | 354 +- Workspace_msvc/lib_com.vcxproj | 680 +- Workspace_msvc/lib_debug.vcxproj | 240 +- Workspace_msvc/lib_dec.vcxproj | 710 +- Workspace_msvc/lib_enc.vcxproj | 742 +-- Workspace_msvc/lib_rend.vcxproj | 414 +- Workspace_msvc/lib_util.vcxproj | 312 +- Workspace_msvc/renderer.vcxproj | 358 +- lib_com/options.h | 2 +- lib_com/swb_tbe_com_fx.c.bak | 8216 ------------------------ 15 files changed, 2078 insertions(+), 10360 deletions(-) delete mode 100644 .vs/IVAS_BASOP/v17/.wsuo delete mode 100644 .vs/IVAS_BASOP/v17/DocumentLayout.json delete mode 100644 .vs/VSWorkspaceState.json delete mode 100644 IVAS_cod.exe delete mode 100644 lib_com/swb_tbe_com_fx.c.bak diff --git a/.vs/IVAS_BASOP/v17/.wsuo b/.vs/IVAS_BASOP/v17/.wsuo deleted file mode 100644 index b5ba4cc2e3848c523ea1f3f0f636f280abb28b55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29696 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 M1Dfdoh($ diff --git a/.vs/IVAS_BASOP/v17/DocumentLayout.json b/.vs/IVAS_BASOP/v17/DocumentLayout.json deleted file mode 100644 index f96d16342..000000000 --- a/.vs/IVAS_BASOP/v17/DocumentLayout.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "Version": 1, - "WorkspaceRootPath": "C:\\work\\IVAS\\src\\IVAS_BASOP\\", - "Documents": [], - "DocumentGroupContainers": [ - { - "Orientation": 0, - "VerticalTabListWidth": 256, - "DocumentGroups": [ - { - "DockedWidth": 200, - "SelectedChildIndex": -1, - "Children": [ - { - "$type": "Bookmark", - "Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" - }, - { - "$type": "Bookmark", - "Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}" - }, - { - "$type": "Bookmark", - "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}" - }, - { - "$type": "Bookmark", - "Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}" - }, - { - "$type": "Bookmark", - "Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" - }, - { - "$type": "Bookmark", - "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}" - }, - { - "$type": "Bookmark", - "Name": "ST:129:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" - }, - { - "$type": "Bookmark", - "Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}" - }, - { - "$type": "Bookmark", - "Name": "ST:133:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" - }, - { - "$type": "Bookmark", - "Name": "ST:128:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index f874ddaef..000000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ExpandedNodes": [ - "" - ], - "SelectedNode": "\\Workspace_msvc.sln", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/IVAS_cod.exe b/IVAS_cod.exe deleted file mode 100644 index aa3ccb696899271daeb2cd4ae2c93d36f6022116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6157824 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�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 z475h%0Dp@jSPar;2Z;r}Uox}u^GlY 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

tTOAd;h)={4I6pDFST6O1o) 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

(A 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%0AstsC6c5O`M@- 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%0A1RA`R`UPm6BL8+!|M33| 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

%zj^Ua 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%0DW6W9O$e_`|%($0sJE-xnM!aa-8MFJH^pnEMr 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�$B>0Mgb+f7b{%B1wHesF(uvxP1b%SYPNk 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
)`2z>d-^eAqQSl2G#Mpdl%?NfV9rg6E9l7 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%0AT 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 z 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


TU(G__urbLG<*tf*sr2`v9b_cPhw3LEWw?;F~O8 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�!u-JUuS}y9JbS2JlhPKftSV1wq$K`3it0 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

-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 $TY|b>cLcn+1|GTt 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%0A_AIs1r@NMdQ+kC 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­vAdAm;|Wc&`Aq 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%0D*ba#$uwx+$29b0^lO||A6iU*BW;xKc4 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 z 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

Bs`L&0;j9dBl{{IzU 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ͱOh?UI(-oFaE^%s{~ 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 z�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%0D3%;#Jnbeb)pw~|Gm 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

16z2g6- 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 - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 75b13f9bd..9578e488d 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 337fc98e2..7a2aa8a7f 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,341 +1,341 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0 - - - - StaticLibrary - v143 - false - MultiByte - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index b6a8a7dd3..929dd72a8 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0 - - - - StaticLibrary - v143 - MultiByte - - - StaticLibrary - v143 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 60a24021f..2d06d29aa 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,356 +1,356 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0 - - - StaticLibrary - v143 - false - MultiByte - - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - false - - - false - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + false + + + false + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 7fe2ad96c..86dcef905 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,372 +1,372 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0 - - - - StaticLibrary - v143 - false - MultiByte - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 10abdb438..e47858ae3 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0 - - - StaticLibrary - v143 - false - MultiByte - - - - StaticLibrary - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 1cfb3e588..86730b859 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0 - - - - StaticLibrary - v143 - MultiByte - - - StaticLibrary - v143 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index ecd8b04aa..70a130e31 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0 - - - - Application - v143 - false - MultiByte - - - Application - v143 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/options.h b/lib_com/options.h index d235b80b9..3ec71d78b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,7 +95,7 @@ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ diff --git a/lib_com/swb_tbe_com_fx.c.bak b/lib_com/swb_tbe_com_fx.c.bak deleted file mode 100644 index fb68537c8..000000000 --- a/lib_com/swb_tbe_com_fx.c.bak +++ /dev/null @@ -1,8216 +0,0 @@ -/*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 - ====================================================================================*/ - - -#include -#include "options.h" -#include "cnst.h" /* Common constants */ -#include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" -#include "basop_util.h" -#include "ivas_prot_fx.h" -#include "options_warnings.h" - -#define POW_EXC16k_WHTND 1.14e11f /* power of random excitation, length 320 samples, uniform distribution */ -#define POW_EXC16k_WHTND_FX_INV_SQRT 6360 // Q31 -#define POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49 1667313793 // Q49 -#define POW_EXC16k_WHTND_FX 178125000 // Q-6 -#define THR_ENV_ERROR_PLOSIVE 200.0f /* threshold for envelope error used in plosive detection */ -#define THR_ENV_ERROR_PLOSIVE_FX 200 /* threshold for envelope error used in plosive detection Q0 */ - -/*-----------------------------------------------------------------* - * Local function prototypes - *-----------------------------------------------------------------*/ - -static void create_random_vector_fx( Word16 output[], const Word16 length, Word16 seed[] ); -static void flip_spectrum_fx( const Word16 input[], Word16 output[], const Word16 length ); -static void Calc_st_filt_tbe( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero ); -static void Hilbert_transform_fx( Word32 tmp_R[], Word32 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id ); -static void Hilbert_transform_sp_fx( Word16 tmp_R[], Word16 tmp_I[], Word32 *tmpi_R, Word32 *tmpi_I, const Word16 length, const Word16 HB_stage_id ); -void Estimate_mix_factors_fx( const Word16 *shb_res, const Word16 Q_shb, const Word16 *exc16kWhtnd, const Word16 Q_bwe_exc, const Word16 *White_exc16k_frac, const Word16 Q_frac, const Word32 pow1, const Word16 Q_pow1, const Word32 pow22, const Word16 Q_pow22, Word16 *vf_modified, Word16 *vf_ind ); - -/*-------------------------------------------------------------------* - * swb_tbe_reset() - * - * Reset the SWB TBE encoder - *-------------------------------------------------------------------*/ - -void swb_tbe_reset_fx( - Word32 mem_csfilt[], - Word16 mem_genSHBexc_filt_down_shb[], - Word16 state_lpc_syn[], - Word16 syn_overlap[], - Word16 state_syn_shbexc[], - Word16 *tbe_demph, - Word16 *tbe_premph, - Word16 mem_stp_swb[], - Word16 *gain_prec_swb ) -{ - set32_fx( mem_csfilt, 0, 2 ); - set16_fx( mem_genSHBexc_filt_down_shb, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); - set16_fx( state_lpc_syn, 0, LPC_SHB_ORDER ); - - set16_fx( syn_overlap, 0, L_SHB_LAHEAD ); - set16_fx( state_syn_shbexc, 0, L_SHB_LAHEAD ); - - *tbe_demph = 0; - move16(); - *tbe_premph = 0; - move16(); - - set16_fx( mem_stp_swb, 0, LPC_SHB_ORDER ); - *gain_prec_swb = 16384; - move16(); /*Q14 = 1 */ - - return; -} - - -/*-------------------------------------------------------------------* - * swb_tbe_reset_synth() - * - * Reset the extra parameters needed for synthesis of the SWB TBE output - *-------------------------------------------------------------------*/ - -void swb_tbe_reset_synth_fx( - Word32 genSHBsynth_Hilbert_Mem[], - Word16 genSHBsynth_state_lsyn_filt_shb_local_fx[], - Word32 genSHBsynth_state_lsyn_filt_shb_local_fx_32[] ) -{ - - set32_fx( genSHBsynth_Hilbert_Mem, 0, HILBERT_MEM_SIZE ); - set16_fx( genSHBsynth_state_lsyn_filt_shb_local_fx, 0, 2 * ALLPASSSECTIONS_STEEP ); - - if ( genSHBsynth_state_lsyn_filt_shb_local_fx_32 != NULL ) - { - set32_fx( genSHBsynth_state_lsyn_filt_shb_local_fx_32, 0, 2 * ALLPASSSECTIONS_STEEP ); - } - - return; -} - - -/*-------------------------------------------------------------------* - * fb_tbe_reset_synth_fx() - * - * reset of FB TBE memories - *-------------------------------------------------------------------*/ - -void fb_tbe_reset_synth_fx( - Word32 fbbwe_hpf_mem_fx[][4], - Word16 fbbwe_hpf_mem_fx_Q[], - Word16 *prev_fbbwe_ratio_fx ) -{ - set32_fx( fbbwe_hpf_mem_fx[0], 0, 4 ); - set32_fx( fbbwe_hpf_mem_fx[1], 0, 4 ); - set32_fx( fbbwe_hpf_mem_fx[2], 0, 4 ); - set32_fx( fbbwe_hpf_mem_fx[3], 0, 4 ); - set16_fx( fbbwe_hpf_mem_fx_Q, 0, 4 ); - *prev_fbbwe_ratio_fx = 1; - move16(); /*should be set to 1.0f, scaling unknown */ - - return; -} - - -/*-------------------------------------------------------------------* - * tbe_celp_exc_offset() - * - * Compute tbe bwe celp excitation offset - *-------------------------------------------------------------------*/ - -Word16 tbe_celp_exc_offset( - const Word16 T0_fx, /* i : Integer pitch Q0 */ - const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */ - const Word16 L_frame /* i : frame lenght */ -) -{ - Word16 offset_fx, tmp_fx, tmp1_fx, tmp2_fx, tmp_fac; - tmp_fac = 320; - move16(); /*2.5 in Q7*/ - if ( EQ_16( L_frame, L_FRAME16k ) ) - { - tmp_fac = 256; - move16(); /*2.0 in Q7*/ - } - tmp_fx = extract_l( L_mult( T0_frac_fx, 32 ) ); /*Q8, 0.25 in Q7*/ - tmp_fx = add( 512, tmp_fx ); /*Q8; 2 in Q8*/ - tmp_fx = mult_r( tmp_fx, tmp_fac ); /*Q16->Q0; 2.5 in Q7 or 2.0 in Q7 */ - - tmp1_fx = sub( T0_fx, 2 ); /*Q0*/ - - tmp2_fx = shl( tmp1_fx, 1 ); /*Q0 */ - - IF( EQ_16( L_frame, L_FRAME ) ) - { - tmp2_fx = add( shl( tmp1_fx, 1 ), shr( tmp1_fx, 1 ) ); /*Q0; (5/2 = 2 + 1/2)*/ - } - - offset_fx = add( tmp_fx, tmp2_fx ); /*Q0*/ - - return offset_fx; -} - -/*-------------------------------------------------------------------* - * swb_tbe_celp_exc() - * - * Compute tbe bwe celp excitation - *-------------------------------------------------------------------*/ -void tbe_celp_exc( - const Word16 L_frame_fx, /* i : Frame lenght */ - const Word16 i_subfr_fx, /* i : sub frame */ - const Word16 T0_fx, /* i : Integer pitch Q0 */ - const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */ - Word16 *error_fx, /* i/o: Error Q5 */ - Word16 *bwe_exc_fx /* i/o: bandwitdh extension signal */ -) -{ - Word16 offset_fx, tmp_fx, i; - IF( EQ_16( L_frame_fx, L_FRAME ) ) - { - /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC; - for (i=0; i 0 ) - { - tmp_fx = shr( *error_fx, 5 ); /*Q0*/ - } - ELSE - { - tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ - } - - FOR( i = 0; i < L_SUBFR * HIBND_ACB_L_FAC; i++ ) - { - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx]; // Qx - move16(); - } - tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/ - tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/ - tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/ - tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/ - *error_fx = add( *error_fx, tmp_fx ); /*Q5*/ - move16(); - } - ELSE - { - /* offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5; - case above*/ - /* offset = T0*2 + (int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f) - 2*2; - case here*/ - - /*(int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f)*/ - offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx ); - IF( *error_fx > 0 ) - { - tmp_fx = shr( *error_fx, 5 ); /*Q0*/ - } - ELSE - { - tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ - } - - FOR( i = 0; i < L_SUBFR * 2; i++ ) - { - bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; // Qx - move16(); - } - - /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/ - tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/ - tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/ - tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/ - tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/ - *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/ - move16(); - } -} - -/*-------------------------------------------------------------------* - * swb_tbe_celp_exc_ivas() - * - * Compute tbe bwe celp excitation - *-------------------------------------------------------------------*/ -void tbe_celp_exc_ivas( - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 L_frame_fx, /* i : Frame lenght */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 i_subfr_fx, /* i : sub frame */ - const Word16 T0_fx, /* i : Integer pitch Q0 */ - const Word16 T0_frac_fx, /* i : Fractional part of the pitch Q1 */ - Word16 *error_fx, /* i/o: Error Q5 */ - Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal Qx */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -) -{ - Word16 offset_fx, tmp_fx, i; - - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) - { - return; - } - - IF( EQ_16( L_frame_fx, L_FRAME ) ) - { - /*offset = T0 * HIBND_ACB_L_FAC + (int) ((float) T0_frac * 0.25f * HIBND_ACB_L_FAC + 2 * HIBND_ACB_L_FAC + 0.5f) - 2 * HIBND_ACB_L_FAC; - for (i=0; i 0 ) - { - tmp_fx = shr( *error_fx, 5 ); /*Q0*/ - } - ELSE - { - tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ - } - - FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC - offset_fx + tmp_fx]; - move16(); - } - tmp_fx = extract_l( L_mult( T0_frac_fx, 1 ) ); /*Q3; 0.25 in Q2*/ - tmp_fx = add( shl( T0_fx, 3 ), tmp_fx ); /*Q3*/ - tmp_fx = extract_l( L_mult( tmp_fx, 5 ) ); /*Q5, 2.5 in Q1*/ - tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*Q5*/ - *error_fx = add( *error_fx, tmp_fx ); /*Q5*/ - move16(); - } - ELSE - { - /* offset = T0*2.5 + (int) ((float) T0_frac * 0.25f*2.5 + 2*2.5 + 0.5f) - 2*2.5; - case above*/ - /* offset = T0*2 + (int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f) - 2*2; - case here*/ - - /*(int) ((float) T0_frac * 0.25f*2 + 2*2 + 0.5f)*/ - offset_fx = tbe_celp_exc_offset( T0_fx, T0_frac_fx, L_frame_fx ); - IF( *error_fx > 0 ) - { - tmp_fx = shr( *error_fx, 5 ); /*Q0*/ - } - ELSE - { - tmp_fx = negate( shr( abs_s( *error_fx ), 5 ) ); /*Q0*/ - } - - FOR( i = 0; i < L_subfr * 2; i++ ) - { - bwe_exc_fx[i + i_subfr_fx * 2] = bwe_exc_fx[i + i_subfr_fx * 2 - offset_fx + tmp_fx]; - move16(); - } - - /* error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac;*/ - tmp_fx = extract_l( L_mult( T0_frac_fx, 2 ) ); /*Q3; 0.5 in Q2*/ - tmp_fx = add( shl( T0_fx, 4 ), tmp_fx ); /* now tmp_fx = "T0_fx*2+ 0.5f*T0_frac_fx" in Q3*/ - tmp_fx = shl( tmp_fx, 2 ); /*now above tmp_fx in Q5*/ - tmp_fx = sub( shl( offset_fx, 5 ), tmp_fx ); /*move offset_fx to Q5, tmp_fx in Q5, ans tmp_fx in Q5*/ - *error_fx = add( *error_fx, tmp_fx ); /*error_fx in Q5*/ - move16(); - } -} - -/*===========================================================================*/ -/* FUNCTION : flip_and_downmix_generic_fx() */ -/*---------------------------------------------------------------------------*/ -/* PURPOSE :flips the spectrum and downmixes the signals, lpf if needed*/ -/*---------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS */ -/* _(Word16[]) input :input spectrum */ -/* _(Word16) length :length of spectra */ -/* _(Word16) ramp_flag :flag to indicate slow ramp need after switching */ -/* _(Word16[]) lpf_num :lpf numerator */ -/* _(Word16[]) lpf_den :lpf denominator */ -/*---------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _(Word16[])output : output spectrum */ -/*---------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _(Word32[9])mem1 : memory */ -/* _(Word32[8])mem2 : memory */ -/* _(Word32[8])mem3 : memory */ -/* _(Word16) dm_frequency_inHz :Downmix frequency in Hz */ -/* _(Word16*) phase_state :Phase state in case frequency isn't */ -/* multiple of 50 Hz */ -/*---------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*---------------------------------------------------------------------------*/ -void flip_and_downmix_generic_fx( - Word16 input[], /* i : input spectrum Qx*/ - Word16 output[], /* o : output spectrum Qx*/ - const Word16 length, /* i : length of spectra */ - Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx+16*/ - Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/ - Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx+16*/ - Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ -) -{ - Word16 i, j; - Word16 tmp_16[L_FRAME32k + HILBERT_ORDER1]; - Word32 tmpi_R[L_FRAME32k]; - Word32 tmpi_I[L_FRAME32k]; - Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2]; - - /*Word16 s_tmp[L_FRAME32k];*/ - /*Word16 factor;*/ - Word16 period; - Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580, - -26319, -17530, -6393, 6393, 17530, 26319, - 31580, 32609, 29268, 22005, 11793 }; /* Q15 */ - Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739, - -19519, -27683, -32137, -32137, -27683, - -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */ - Word16 *local_negsin_table, *local_cos_table; - Word32 L_tmp; - - /* 1850 Hz downmix */ - period = 17; - move16(); - local_negsin_table = local_negsin_table17; - local_cos_table = local_cos_table17; - - - FOR( i = 0; i < length; i = i + 2 ) - { - input[i] = negate( input[i] ); - move16(); - } - - Copy( input, tmp_16 + HILBERT_ORDER1, length ); - - /*Copy32( mem1_ext, tmp_16, 5 ); */ - FOR( i = 0; i < HILBERT_ORDER1; i++ ) - { - tmp_16[i] = extract_h( mem1_ext[i] ); /* mem1_ext (Qx+16) tmp16 (Qx) */ - move16(); - } - - /* Hilber transform stage - 0 - single precision */ - Hilbert_transform_sp_fx( tmp_16, /* i: Real component of HB */ - tmp_16, /* i: Imag component of HB */ - tmpi_R, /* o: Real component of HB */ - tmpi_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 0 ); /* i: HB transform stage */ - - FOR( i = 0; i < HILBERT_ORDER1; i++ ) - { - mem1_ext[i] = L_deposit_h( tmp_16[i + length] ); /* mem1_ext (Qx+16) tmp16 (Qx) */ - move32(); - } - - Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); - Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 ); - - /* Hilber transform stage - 1 */ - Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ - tmpi_I, /* i: Imag component of HB */ - tmpi2_R, /* o: Real component of HB */ - tmpi2_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 1 ); /* i: HB transform stage */ - - Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 ); - Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 ); - - /* Hilber transform stage - 2 */ - Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */ - tmpi2_I, /* i: Imag component of HB */ - tmpi_R, /* o: Real component of HB */ - tmpi_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 2 ); /* i: HB transform stage */ - - Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 ); - Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 ); - - /* Hilber transform stage - 3 */ - Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ - tmpi_I, /* i: Imag component of HB */ - tmp_R, /* o: Real component of HB */ - tmp_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 3 ); /* i: HB transform stage */ - - Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); - Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); - - if ( GE_16( *phase_state, period ) ) - { - *phase_state = 0; - move16(); - } - - i = 0; - move16(); - j = *phase_state; - move16(); - - WHILE( i < length ) - { - WHILE( ( j < period ) && ( i < length ) ) - { - L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */ - L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */ - output[i] = round_fx( L_tmp ); /*Qx */ - move16(); - i++; - j++; - } - - if ( GE_16( j, period ) ) - { - j = 0; - move16(); - } - } - - *phase_state = j; - move16(); - - return; -} - - -void flip_and_downmix_generic_fx32( - Word32 input[], /* i : input spectrum Qx*/ - Word32 output[], /* o : output spectrum Qx*/ - const Word16 length, /* i : length of spectra */ - Word32 mem1_ext[HILBERT_ORDER1], /* i/o: memory Qx*/ - Word32 mem2_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ - Word32 mem3_ext[2 * HILBERT_ORDER2], /* i/o: memory Qx*/ - Word16 *phase_state /* i/o: Phase state in case frequency isn't multiple of 50 Hz */ -) -{ - Word16 i, j; - Word32 tmp[L_FRAME32k + HILBERT_ORDER1]; - Word32 tmpi_R[L_FRAME32k]; - Word32 tmpi_I[L_FRAME32k]; - Word32 tmpi2_R[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmpi2_I[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmp_R[L_FRAME32k + HILBERT_ORDER2]; - Word32 tmp_I[L_FRAME32k + HILBERT_ORDER2]; - - /*Word16 s_tmp[L_FRAME32k];*/ - /*Word16 factor;*/ - Word16 period; - Word16 local_negsin_table17[17] = { 0, -11793, -22005, -29268, -32609, -31580, - -26319, -17530, -6393, 6393, 17530, 26319, - 31580, 32609, 29268, 22005, 11793 }; /* Q15 */ - Word16 local_cos_table17[17] = { 32767, 30571, 24279, 14732, 3212, -8739, - -19519, -27683, -32137, -32137, -27683, - -19519, -8739, 3212, 14732, 24279, 30571 }; /* Q15 */ - Word16 *local_negsin_table, *local_cos_table; - Word32 L_tmp; - - /* 1850 Hz downmix */ - period = 17; - move16(); - local_negsin_table = local_negsin_table17; - local_cos_table = local_cos_table17; - - - FOR( i = 0; i < length; i = i + 2 ) - { - input[i] = L_negate( input[i] ); - move16(); - } - - Copy32( input, tmp + HILBERT_ORDER1, length ); - Copy32( mem1_ext, tmp, HILBERT_ORDER1 ); - - /* Hilber transform stage - 0 - single precision */ - Hilbert_transform_fx( tmp, /* i: Real component of HB */ - tmp, /* i: Imag component of HB */ - tmpi_R, /* o: Real component of HB */ - tmpi_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 0 ); /* i: HB transform stage */ - - - Copy32( mem2_ext, tmpi2_R, HILBERT_ORDER2 ); - Copy32( mem3_ext, tmpi2_I, HILBERT_ORDER2 ); - - /* Hilber transform stage - 1 */ - Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ - tmpi_I, /* i: Imag component of HB */ - tmpi2_R, /* o: Real component of HB */ - tmpi2_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 1 ); /* i: HB transform stage */ - Copy32( tmp + length, mem1_ext, HILBERT_ORDER1 ); - Copy32( mem2_ext + HILBERT_ORDER2, tmp_R, HILBERT_ORDER2 ); - Copy32( mem3_ext + HILBERT_ORDER2, tmp_I, HILBERT_ORDER2 ); - - /* Hilber transform stage - 2 */ - Hilbert_transform_fx( tmpi2_R, /* i: Real component of HB */ - tmpi2_I, /* i: Imag component of HB */ - tmpi_R, /* o: Real component of HB */ - tmpi_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 2 ); /* i: HB transform stage */ - - Copy32( tmpi2_R + length, mem2_ext, HILBERT_ORDER2 ); - Copy32( tmpi2_I + length, mem3_ext, HILBERT_ORDER2 ); - - /* Hilber transform stage - 3 */ - Hilbert_transform_fx( tmpi_R, /* i: Real component of HB */ - tmpi_I, /* i: Imag component of HB */ - tmp_R, /* o: Real component of HB */ - tmp_I, /* o: Imag. component of HB */ - length, /* i: length of the spectra */ - 3 ); /* i: HB transform stage */ - - Copy32( tmp_R + length, mem2_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); - Copy32( tmp_I + length, mem3_ext + HILBERT_ORDER2, HILBERT_ORDER2 ); - - if ( GE_16( *phase_state, period ) ) - { - *phase_state = 0; - move16(); - } - - i = 0; - move16(); - j = *phase_state; - move16(); - - WHILE( LT_16( i, length ) ) - { - WHILE( ( j < period ) && ( i < length ) ) - { - test(); - L_tmp = Mult_32_16( tmp_R[i + 4], local_cos_table[j] ); /*//Qx+16 */ - L_tmp = Madd_32_16( L_tmp, tmp_I[i + 4], local_negsin_table[j] ); /*Qx+16 */ - output[i] = L_tmp; /*Qx */ - move32(); - i++; - j++; - } - - if ( GE_16( j, period ) ) - { - j = 0; - move16(); - } - } - - *phase_state = j; - move16(); - return; -} - -/*---------------------------------------------- - * Hilbert transform - Double precision - *------------------------------------------------*/ -static void Hilbert_transform_fx( - Word32 tmp_R[], /* i: Real component of HB */ - Word32 tmp_I[], /* i: Real component of HB */ - Word32 tmpi_R[], /* o: Real component of HB */ - Word32 tmpi_I[], /* o: Imag. component of HB */ - const Word16 length, /* i: input length */ - const Word16 HB_stage_id /* i: HB transform stage */ -) -{ - Word16 i, hb_filter_stage, offset; - Word32 L_tmp; - - hb_filter_stage = shl( HB_stage_id, 1 ); - offset = 0; - move16(); - if ( HB_stage_id == 0 ) - { - offset = 1; - move16(); - } - - test(); - test(); - IF( HB_stage_id == 0 || EQ_16( HB_stage_id, 2 ) ) - { - FOR( i = 0; i < length; i++ ) - { - L_tmp = Mult_32_16( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] ); /*Qx+15 */ - tmpi_R[i] = L_shl( L_tmp, 1 ); - move32(); /*Qx+16 */ - - L_tmp = Mult_32_16( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */ - tmpi_I[i] = L_shl( L_tmp, 1 ); - move32(); /*Qx+16 */ - } - } - ELSE IF( EQ_16( HB_stage_id, 1 ) || EQ_16( HB_stage_id, 3 ) ) - { - FOR( i = 0; i < length; i++ ) - { - - L_tmp = Mult_32_16( tmpi_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmpi_R[i], Hilbert_coeffs_fx[hb_filter_stage][4] ); /*Qx+15 */ - tmpi_R[i + 4] = L_sub( tmp_R[i], L_shl( L_tmp, 1 ) ); - move32(); /*Qx+16 */ - - L_tmp = Mult_32_16( tmpi_I[i + 2], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx+15 */ - L_tmp = Madd_32_16( L_tmp, tmpi_I[i], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx+15 */ - tmpi_I[i + 4] = L_sub( tmp_I[i], L_shl( L_tmp, 1 ) ); - move32(); /*Qx+16 */ - } - } -} - - -/*---------------------------------------------- - * Hilbert transform - Single precision Stage 0 - *------------------------------------------------*/ -static void Hilbert_transform_sp_fx( - Word16 tmp_R[], /* i: Real component of HB */ - Word16 tmp_I[], /* i: Real component of HB */ - Word32 tmpi_R[], /* o: Real component of HB */ - Word32 tmpi_I[], /* o: Imag. component of HB */ - const Word16 length, /* i: input length */ - const Word16 HB_stage_id /* i: HB transform stage */ -) -{ - Word16 i, hb_filter_stage, offset; - Word32 L_tmp; - - hb_filter_stage = shl( HB_stage_id, 1 ); - offset = 0; - move16(); - if ( HB_stage_id == 0 ) - { - offset = 1; - move16(); - } - - /* Hilbert single precision stage 0 */ - FOR( i = 0; i < length; i++ ) - { - L_tmp = L_mult( tmp_R[i + 4], Hilbert_coeffs_fx[hb_filter_stage][0 + offset] ); /*Qx */ - L_tmp = L_mac( L_tmp, tmp_R[i + 2], Hilbert_coeffs_fx[hb_filter_stage][2 + offset] ); /*Qx */ - L_tmp = L_mac( L_tmp, tmp_R[i], Hilbert_coeffs_fx[hb_filter_stage][4 + offset] ); /*Qx */ - tmpi_R[i] = L_shl( L_tmp, 1 ); - move32(); /*Qx+16 */ - - L_tmp = L_mult( tmp_I[i + 4 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][0] ); /*Qx */ - L_tmp = L_mac( L_tmp, tmp_I[i + 2 + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][2] ); /*Qx */ - L_tmp = L_mac( L_tmp, tmp_I[i + offset], Hilbert_coeffs_fx[hb_filter_stage + 1][4] ); /*Qx */ - tmpi_I[i] = L_shl( L_tmp, 1 ); - move32(); /*Qx+16 */ - } - - return; -} - - -/*---------------------------------------------- - * flip_spectrum_fx - *----------------------------------------------*/ -void flip_spectrum_fx( - const Word16 input[], /* i : input spectrum */ - Word16 output[], /* o : output spectrum */ - const Word16 length /* i : vector length */ -) -{ - Word16 i; - - FOR( i = 0; i < length; i = i + 2 ) - { - output[i] = negate( input[i] ); - move16(); - output[i + 1] = input[i + 1]; - move16(); - } - - return; -} - - -/*---------------------------------------------------------------------------- - * calc_rc0_h - * - * computes 1st parcor from composed filter impulse response - *---------------------------------------------------------------------------*/ -void Calc_rc0_h( - Word16 *h, /* i : impulse response of composed filter */ - Word16 *rc0 /* o : 1st parcor */ -) -{ - Word32 L_acc; - Word16 *ptrs; - Word16 acf0, acf1; - Word16 temp, sh_acf; - Word16 i; - - /* computation of the autocorrelation function acf */ - L_acc = L_mult( h[0], h[0] ); - FOR( i = 1; i < LONG_H_ST; i++ ) - { - L_acc = L_mac( L_acc, h[i], h[i] ); - } - sh_acf = norm_l( L_acc ); - L_acc = L_shl( L_acc, sh_acf ); - acf0 = extract_h( L_acc ); - - ptrs = h; - - temp = *ptrs++; - move16(); - L_acc = L_mult( temp, *ptrs ); - FOR( i = 1; i < LONG_H_ST - 1; i++ ) - { - temp = *ptrs++; - move16(); - L_acc = L_mac( L_acc, temp, *ptrs ); - } - L_acc = L_shl( L_acc, sh_acf ); - acf1 = extract_h( L_acc ); - - /* Compute 1st parcor */ - IF( acf0 == 0 ) - { - *rc0 = 0; - move16(); - return; - } - - IF( LT_16( acf0, abs_s( acf1 ) ) ) - { - *rc0 = 0; - move16(); - return; - } - *rc0 = div_s( abs_s( acf1 ), acf0 ); - move16(); - IF( acf1 > 0 ) - { - *rc0 = negate( *rc0 ); - move16(); - } -} - -void Calc_rc0_h_ivas_enc_fx( - Word16 *h, /* i : impulse response of composed filter */ - Word16 *rc0 /* o : 1st parcor */ -) -{ - Word32 L_acc; - Word16 *ptrs; - Word16 acf0, acf1; - Word16 temp, sh_acf, tmp2; - Word16 i; - - /* computation of the autocorrelation function acf */ - L_acc = L_mult( h[0], h[0] ); - FOR( i = 1; i < LONG_H_ST; i++ ) - { - tmp2 = shr( h[i], 2 ); - L_acc = L_mac( L_acc, tmp2, tmp2 ); - } - sh_acf = norm_l( L_acc ); - L_acc = L_shl( L_acc, sh_acf ); - acf0 = extract_h( L_acc ); - - ptrs = h; - - temp = *ptrs++; - move16(); - L_acc = L_mult( temp, *ptrs ); - FOR( i = 1; i < LONG_H_ST - 1; i++ ) - { - temp = shr( *ptrs++, 2 ); - move16(); - L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) ); - } - L_acc = L_shl( L_acc, sh_acf ); - acf1 = extract_h( L_acc ); - - /* Compute 1st parcor */ - IF( acf0 == 0 ) - { - *rc0 = 0; - move16(); - return; - } - - IF( LT_16( acf0, abs_s( acf1 ) ) ) - { - *rc0 = 0; - move16(); - return; - } - *rc0 = div_s( abs_s( acf1 ), acf0 ); - move16(); - IF( acf1 > 0 ) - { - *rc0 = negate( *rc0 ); - move16(); - } -} - -static void Calc_st_filt_tbe( - Word16 *apond2, /* i : coefficients of numerator */ - Word16 *apond1, /* i : coefficients of denominator */ - Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */ - Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */ - Word16 *mem_zero /* i : All zero memory */ -) -{ - Word32 L_g0; - - Word16 h[LONG_H_ST]; - - Word16 g0, temp; - Word16 i; - temp = sub( 2, norm_s( apond2[0] ) ); - /* compute i.r. of composed filter apond2 / apond1 */ - Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); - /* compute 1st parcor */ - Calc_rc0_h( h, parcor0 ); - - /* compute g0 */ - L_g0 = L_mult0( 1, abs_s( h[0] ) ); - FOR( i = 1; i < LONG_H_ST; i++ ) - { - L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) ); - } - g0 = extract_h( L_shl( L_g0, 14 ) ); - - /* Scale signal i of 1/A(gamma1) */ - IF( GT_16( g0, 1024 ) ) - { - temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */ - FOR( i = 0; i < L_SUBFR16k; i++ ) - { - sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp ); - move16(); - } - } -} - -static void Calc_st_filt_tbe_ivas_enc_fx( - Word16 *apond2, /* i : coefficients of numerator */ - Word16 *apond1, /* i : coefficients of denominator */ - Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */ - Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */ - Word16 *mem_zero /* i : All zero memory */ -) -{ - Word32 L_g0; - - Word16 h[LONG_H_ST]; - - Word16 g0, temp; - Word16 i; - temp = sub( 2, norm_s( apond2[0] ) ); - /* compute i.r. of composed filter apond2 / apond1 */ - syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); - /* compute 1st parcor */ - Calc_rc0_h_ivas_enc_fx( h, parcor0 ); - - /* compute g0 */ - L_g0 = L_mult0( 1, abs_s( h[0] ) ); - FOR( i = 1; i < LONG_H_ST; i++ ) - { - L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) ); - } - g0 = extract_h( L_shl( L_g0, 14 ) ); - - /* Scale signal i of 1/A(gamma1) */ - IF( GT_16( g0, 1024 ) ) - { - temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */ - FOR( i = 0; i < L_SUBFR16k; i++ ) - { - sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp ); - move16(); - } - } -} - -static void Calc_st_filt_tbe_ivas_dec_fx( - Word16 *apond2, /* i : coefficients of numerator */ - Word16 *apond1, /* i : coefficients of denominator */ - Word16 *parcor0, /* o : 1st parcor calcul. on composed filter */ - Word16 *sig_ltp_ptr, /* i/o: i of 1/A(gamma1) : scaled by 1/g0 */ - Word16 *mem_zero /* i : All zero memory */ -) -{ - Word32 L_g0; - - Word16 h[LONG_H_ST]; - - Word16 g0, temp; - Word16 i; - temp = sub( 2, norm_s( apond2[0] ) ); - /* compute i.r. of composed filter apond2 / apond1 */ - Syn_filt_s( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); - /* compute 1st parcor */ - Calc_rc0_h( h, parcor0 ); - - /* compute g0 */ - L_g0 = L_mult0( 1, abs_s( h[0] ) ); - FOR( i = 1; i < LONG_H_ST; i++ ) - { - L_g0 = L_mac0( L_g0, 1, abs_s( h[i] ) ); - } - g0 = extract_h( L_shl( L_g0, 14 ) ); - - /* Scale signal i of 1/A(gamma1) */ - IF( GT_16( g0, 1024 ) ) - { - temp = div_s( 1024, g0 ); /* temp = 2**15 / gain0 */ - FOR( i = 0; i < L_SUBFR16k; i++ ) - { - sig_ltp_ptr[i] = mult_r( sig_ltp_ptr[i], temp ); - move16(); - } - } -} - -static void filt_mu_fx( - const Word16 *sig_in, /* i : signal (beginning at sample -1) */ - Word16 *sig_out, /* o : output signal */ - const Word16 parcor0, /* i : parcor0 (mu = parcor0 * gamma3) */ - Word16 SubFrameLength /* i : the length of subframe */ -) -{ - Word16 n; - Word16 mu, ga, temp; - const Word16 *ptrs; - Word16 tmp, exp; - Flag Overflow = 0; - move32(); - - - IF( EQ_16( SubFrameLength, L_SUBFR ) ) - { - IF( parcor0 > 0 ) - { - mu = mult_r( parcor0, GAMMA3_PLUS_FX ); - } - ELSE - { - mu = mult_r( parcor0, GAMMA3_MINUS_FX ); - } - } - ELSE - { - IF( parcor0 > 0 ) - { - mu = mult_r( parcor0, GAMMA3_PLUS_WB_FX ); - } - ELSE - { - mu = mult_r( parcor0, GAMMA3_MINUS_WB_FX ); - } - } - - tmp = abs_s( mu ); - tmp = sub( 32767, tmp ); - exp = norm_s( tmp ); - tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /*(14 - exp) */ - ga = shl_sat( tmp, exp ); /*Q14 */ - - - /* ga = (float) 1. / ((float) 1. - (float) fabs (mu)); */ - - ptrs = sig_in; /* points on sig_in(-1) */ - - FOR( n = 0; n < SubFrameLength; n++ ) - { - temp = mult_r( mu, ( *ptrs++ ) ); - temp = add_sat( temp, *ptrs ); /*Q12 */ - sig_out[n] = shl_o( mult_r( ga, temp ), 1, &Overflow ); - move16(); /*Q12 */ - } - - return; -} - -static void scale_st_swb( - const Word16 *sig_in_fx, /* i : postfilter i signal */ - Word16 *sig_out_fx, /* i/o: postfilter o signal */ - Word16 *gain_prec_fx, /* i/o: last value of gain for subframe */ - Word16 SubFrameLength ) -{ - Word16 i; - Word16 agc_fac1_para_fx; - Word16 agc_fac_para_fx; - Word32 L_acc, L_temp; - Word16 g0_fx, gain_fx; - Word16 scal_in, scal_out; - Word16 s_g_in, s_g_out, sh_g0, temp; - - - IF( EQ_16( SubFrameLength, L_SUBFR ) ) - { - agc_fac1_para_fx = AGC_FAC1_FX; - move16(); - agc_fac_para_fx = AGC_FAC_FX; - move16(); - } - ELSE /*IF( SubFrameLength == L_SUBFR16k ) */ - { - agc_fac1_para_fx = AGC_FAC1_WB_FX; - move16(); - agc_fac_para_fx = AGC_FAC_WB_FX; - move16(); - } - - /* compute input gain */ - L_acc = L_mult0( 1, abs_s( sig_in_fx[0] ) ); /*0 +Q_bwe_exc-1 */ - FOR( i = 1; i < SubFrameLength; i++ ) - { - L_acc = L_mac0( L_acc, 1, abs_s( sig_in_fx[i] ) ); /*Q_bwe_exc-1 */ - } - - g0_fx = 0; - move16(); - IF( L_acc != 0L ) - { - scal_in = norm_l( L_acc ); - L_acc = L_shl( L_acc, scal_in ); - s_g_in = extract_h( L_acc ); /* normalized */ - - /* Compute o gain */ - L_acc = L_mult0( 1, abs_s( sig_out_fx[0] ) ); - FOR( i = 1; i < SubFrameLength; i++ ) - { - L_acc = L_mac0( L_acc, 1, abs_s( sig_out_fx[i] ) ); - } - IF( L_acc == 0L ) - { - *gain_prec_fx = 0; - move16(); - - return; - } - - scal_out = norm_l( L_acc ); - L_acc = L_shl( L_acc, scal_out ); - s_g_out = extract_h( L_acc ); /* normalized */ - - - sh_g0 = add( scal_in, 1 ); - sh_g0 = sub( sh_g0, scal_out ); /* scal_in - scal_out + 1 */ - IF( LT_16( s_g_in, s_g_out ) ) - { - g0_fx = div_s( s_g_in, s_g_out ); /* s_g_in/s_g_out in Q15 */ - } - ELSE - { - temp = sub( s_g_in, s_g_out ); /* sufficient since normalized */ - g0_fx = shr( div_s( temp, s_g_out ), 1 ); - g0_fx = add( g0_fx, (Word16) 0x4000 ); /* s_g_in/s_g_out in Q14 */ - sh_g0 = sub( sh_g0, 1 ); - } - /* L_gain_in/L_gain_out in Q14 */ - /* overflows if L_gain_in > 2 * L_gain_out */ - g0_fx = shr_sat( g0_fx, sh_g0 ); /* sh_g0 may be >0, <0, or =0 */ // Need to verify? - - g0_fx = mult_r( g0_fx, agc_fac1_para_fx ); /* L_gain_in/L_gain_out * AGC_FAC1_FX */ - } - /* compute gain(n) = AGC_FAC gain(n-1) + (1-AGC_FAC)gain_in/gain_out */ - /* sig_out(n) = gain(n) sig_out(n) */ - gain_fx = *gain_prec_fx; - move16(); /*14 */ - FOR( i = 0; i < SubFrameLength; i++ ) - { - temp = mult_r( agc_fac_para_fx, gain_fx ); /*15 +14 -15 =14 */ - gain_fx = add( temp, g0_fx ); /* in Q14 */ - L_temp = L_mult( gain_fx, sig_out_fx[i] ); /*14 + Q_bwe_exc-1 +1 = 14 + Q_bwe_exc */ - L_temp = L_shl_sat( L_temp, 1 ); /*14 + Q_bwe_exc +1 */ - sig_out_fx[i] = round_fx_sat( L_temp ); /*Q_bwe_exc +15 -16 = Q_bwe_exc-1 */ - move16(); - } - *gain_prec_fx = gain_fx; - move16(); - - return; -} - -void PostShortTerm_fx( - Word16 *sig_in, /* i : input signal (pointer to current subframe */ - Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 *mem_stp, /* i/o: postfilter memory*/ - Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/ - Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/ - Word16 *mem_zero, /* i/o: null memory to compute h_st*/ - const Word16 formant_fac_fx /* i : Strength of post-filter*/ -) -{ - Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/ - Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */ - Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */ - /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */ - Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */ - Word16 tmp; - - parcor0_fx = 0; - move16(); - set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 ); - set16_fx( apond2_fx, 0, LONG_H_ST ); - set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 ); - - /* Obtain post-filter weights */ - tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */ - g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */ - g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */ - - /* Compute weighted LPC coefficients */ - weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER ); - weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER ); - /* o: apond1_fx, apond2_fx in Q12 */ - - /* Compute A(gamma2) residual */ - Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 ); - /* o: sig_ltp_fx in Q_bwe_exc */ - - /* Save last output of 1/A(gamma1) */ - sig_ltp_fx[0] = *ptr_mem_stp; - move16(); - - /* Control short term pst filter gain and compute parcor0 */ - Calc_st_filt_tbe( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero ); - /* o: parcor0 in Q15 */ - /* i/o: sig_ltp_fx in Q_bwe_exc */ - - /* 1/A(gamma1) filtering, mem_stp is updated */ - Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 ); - - /* (1 + mu z-1) tilt filtering */ - filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k ); - /* o: sig_out in Q_bwe_exc */ - - /* gain control */ - scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k ); - - return; -} - -void PostShortTerm_ivas_enc_fx( - Word16 *sig_in, /* i : input signal (pointer to current subframe */ - Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 *mem_stp, /* i/o: postfilter memory*/ - Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/ - Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/ - Word16 *mem_zero, /* i/o: null memory to compute h_st*/ - const Word16 formant_fac_fx /* i : Strength of post-filter*/ -) -{ - Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/ - Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */ - Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */ - /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */ - Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */ - Word16 tmp; - - parcor0_fx = 0; - move16(); - set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 ); - set16_fx( apond2_fx, 0, LONG_H_ST ); - set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 ); - - /* Obtain post-filter weights */ - tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */ - g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */ - g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */ - - /* Compute weighted LPC coefficients */ - weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER ); - weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER ); - /* o: apond1_fx, apond2_fx in Q12 */ - - /* Compute A(gamma2) residual */ - Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 ); - /* o: sig_ltp_fx in Q_bwe_exc */ - - /* Save last output of 1/A(gamma1) */ - sig_ltp_fx[0] = *ptr_mem_stp; - move16(); - - /* Control short term pst filter gain and compute parcor0 */ - Calc_st_filt_tbe_ivas_enc_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero ); - /* o: parcor0 in Q15 */ - /* i/o: sig_ltp_fx in Q_bwe_exc */ - - /* 1/A(gamma1) filtering, mem_stp is updated */ - syn_filt_fx( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 ); - - /* (1 + mu z-1) tilt filtering */ - filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k ); - /* o: sig_out in Q_bwe_exc */ - - /* gain control */ - scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k ); - - return; -} - -void PostShortTerm_ivas_dec_fx( - Word16 *sig_in, /* i : input signal (pointer to current subframe */ - Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 *mem_stp, /* i/o: postfilter memory*/ - Word16 *ptr_mem_stp, /* i/o: pointer to postfilter memory*/ - Word16 *ptr_gain_prec, /* i/o: for gain adjustment*/ - Word16 *mem_zero, /* i/o: null memory to compute h_st*/ - const Word16 formant_fac_fx /* i : Strength of post-filter*/ -) -{ - Word16 apond1_fx[LPC_SHB_ORDER + 1]; /* denominator coeff.*/ - Word16 apond2_fx[LONG_H_ST]; /* numerator coeff. */ - Word16 sig_ltp_fx[L_SUBFR16k + 1]; /* residual signal */ - /*Word16 lpccoeff_fx[LPC_SHB_ORDER+1];//Q12 */ - Word16 g1_fx, g2_fx, parcor0_fx; /*Q15 */ - Word16 tmp; - - parcor0_fx = 0; - move16(); - set16_fx( apond1_fx, 0, LPC_SHB_ORDER + 1 ); - set16_fx( apond2_fx, 0, LONG_H_ST ); - set16_fx( sig_ltp_fx, 0, L_SUBFR16k + 1 ); - - /* Obtain post-filter weights */ - tmp = extract_h( L_mult( GAMMA_SHARP_FX, formant_fac_fx ) ); /*Q15 */ - g1_fx = add( GAMMA0_FX, tmp ); /*Q15 */ - g2_fx = sub( GAMMA0_FX, tmp ); /*Q15 */ - - /* Compute weighted LPC coefficients */ - weight_a_fx( lpccoeff, apond1_fx, g1_fx, LPC_SHB_ORDER ); - weight_a_fx( lpccoeff, apond2_fx, g2_fx, LPC_SHB_ORDER ); - /* o: apond1_fx, apond2_fx in Q12 */ - - /* Compute A(gamma2) residual */ - Residu3_10_fx( apond2_fx, sig_in, sig_ltp_fx + 1, L_SUBFR16k, 0 ); - /* o: sig_ltp_fx in Q_bwe_exc */ - - /* Save last output of 1/A(gamma1) */ - sig_ltp_fx[0] = *ptr_mem_stp; - move16(); - - /* Control short term pst filter gain and compute parcor0 */ - Calc_st_filt_tbe_ivas_dec_fx( apond2_fx, apond1_fx, &parcor0_fx, sig_ltp_fx + 1, mem_zero ); - /* o: parcor0 in Q15 */ - /* i/o: sig_ltp_fx in Q_bwe_exc */ - - /* 1/A(gamma1) filtering, mem_stp is updated */ - Syn_filt_s( 0, apond1_fx, LPC_SHB_ORDER, sig_ltp_fx + 1, sig_ltp_fx + 1, L_SUBFR16k, mem_stp, 1 ); - - /* (1 + mu z-1) tilt filtering */ - filt_mu_fx( sig_ltp_fx, sig_out, parcor0_fx, L_SUBFR16k ); - /* o: sig_out in Q_bwe_exc */ - - /* gain control */ - scale_st_swb( sig_in, sig_out, ptr_gain_prec, L_SUBFR16k ); - - return; -} - -void flip_spectrum_and_decimby4_fx( - const Word16 input[], /* i : input spectrum Q_inp */ - Word16 output[], /* o : output spectrum Q_inp */ - const Word16 length, /* i : vector length */ - Word16 mem1[], /* i/o : memory Q_inp */ - Word16 mem2[], /* i/o : memory Q_inp */ - const Word16 ramp_flag /*i: flag to trigger slow ramp-up of output following change of core (HQ to ACELP or 12k8 to 16k ACELP) */ -) -{ - Word16 i; - Word16 factor, tmp[L_FRAME16k / 2]; - Word16 tmp1, tmp2; - Word16 input_change[L_FRAME16k]; - - IF( ramp_flag ) - { - factor = div_s( 4, length ); /* Q15 */ - FOR( i = 0; i < length / 4; i += 2 ) - { - tmp1 = extract_l( L_mult0( i, factor ) ); /* Q15 */ - tmp2 = extract_l( L_mult0( add( i, 1 ), factor ) ); /*Q15 */ - input_change[i] = negate( mult_r( input[i], tmp1 ) ); - move16(); - input_change[i + 1] = mult_r( input[i + 1], tmp2 ); - move16(); - } - } - ELSE - { - i = 0; - move16(); - } - - FOR( ; i < length; i = i + 2 ) - { - input_change[i] = negate( input[i] ); - move16(); - input_change[i + 1] = input[i + 1]; - move16(); - } - - Decimate_allpass_steep_fx( input_change, mem1, length, tmp ); - Decimate_allpass_steep_fx( tmp, mem2, shr( length, 1 ), output ); - - return; -} - - -/*==========================================================================*/ -/* FUNCTION : void GenShapedWBExcitation_fx () */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Synthesize spectrally shaped highband excitation signal for the wideband */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _Word16 *lpc_shb i : lpc coefficients Q12 */ -/* _Word16 coder_type i : coding type */ -/* _Word16 *bwe_exc_extended i : bwidth extended exciatation Q_bwe_exc*/ -/* _Word16 Q_bwe_exc i : Q format */ -/* _Word16 voice_factors[] i : voicing factor Q15 */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _Word16 *excSHB o : synthesized shaped shb exctiation Q_bwe_exc*/ -/* _Word16 *exc4kWhtnd o : whitened synthesized shb excitation Q_bwe_exc*/ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _Word32 *mem_csfilt i/o : memory Q_bwe_exc+16*/ -/* _Word16 *mem_genSHBexc_filt_down1 i/o : memory Q_bwe_exc */ -/* _Word16 *mem_genSHBexc_filt_down2 i/o : memory Q_bwe_exc */ -/* _Word16 *mem_genSHBexc_filt_down3 i/o : memory Q_bwe_exc */ -/* _Word16 *state_lpc_syn i/o : memory Q_bwe_exc */ -/* _Word16 bwe_seed[] i/o : random number generator seed */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ -/*==========================================================================*/ - -void GenShapedWBExcitation_ivas_fx( - Word16 *excSHB, /* o : synthesized shaped shb exctiation Q_bwe_exc*/ - const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ - Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q_bwe_exc*/ - Word32 *mem_csfilt, /* i/o : memory Q_bwe_exc+16*/ - Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q_bwe_exc*/ - Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q_bwe_exc*/ - Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q_bwe_exc*/ - Word16 *state_lpc_syn, /* i/o : memory Q_bwe_exc*/ - const Word16 coder_type, /* i : coding type */ - const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q_bwe_exc*/ - const Word16 Q_bwe_exc, - Word16 bwe_seed[], /* i/o : random number generator seed */ - const Word16 voice_factors[], /* i : voicing factor Q15*/ - const Word16 uv_flag, /* i : unvoiced flag */ - const Word16 igf_flag ) -{ - Word16 i, j, k; - Word16 wht_fil_mem[LPC_WHTN_ORDER_WB]; - Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1]; - Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2]; - Word16 Q_R; - Word16 excTmp[L_FRAME16k]; - Word16 excTmp2[L_FRAME16k / 4]; - Word16 excTmp2_frac[L_FRAME16k / 4]; - Word16 exc4k[L_FRAME16k / 4]; - Word16 exc4k_frac[L_FRAME16k / 4]; - Word32 exc4k_32[L_FRAME16k / 4]; - Word32 pow1, pow22; - Word16 scale; - Word32 excNoisyEnv[L_FRAME16k / 4]; - Word16 csfilt_num2[1] = { 1638 }; /* Q15*/ - Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */ - Word32 L_tmp, Ltemp1, Ltemp2; - Word16 temp1, temp2, exp; - Word32 Lmax; - Word16 max_val, n1, n2, sc; - Word32 LepsP[LPC_WHTN_ORDER_WB + 1]; - Word16 tmp_vfac; - Word16 avg_voice_fac; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - - /*0.25f*sum_f(voice_factors, NB_SUBFR)*/ - L_tmp = L_mult( voice_factors[0], 8192 /* 0.25 in Q15 */ ); - FOR( i = 1; i < NB_SUBFR; i++ ) - { - L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /* 0.25 in Q15 */ ); - } - avg_voice_fac = round_fx( L_tmp ); - - test(); - test(); - test(); - test(); - IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/ - { - csfilt_num2[0] = 6554; - move16(); /*Q15 -> 0.2f*/ - neg_csfilt_den2[1] = 26214; - move16(); /*Q15 -> 0.8f*/ - } - ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15*/ ) ) ) /*Q15 -> 0.2f*/ - { - csfilt_num2[0] = 328; - move16(); /*Q15 -> 0.01f*/ - neg_csfilt_den2[1] = 32440; - move16(); /*Q15 -> 0.99f*/ - } - set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB ); - Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp ); - flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 ); - - IF( uv_flag ) - { - create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed ); - IF( LT_16( Q_bwe_exc, 5 ) ) - { - - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */ - move16(); - } - } - } - ELSE - { - autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R, - L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 ); - - /* Ensure R[0] isn't zero when entering Levinson Durbin */ - R_l[0] = s_max( R_l[0], 1 ); - move16(); - FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ ) - { - L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); - L_Extract( L_tmp, &R_h[i], &R_l[i] ); - } - - E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL ); - - Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); - - fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4, - LPC_WHTN_ORDER_WB, 0, 3 ); - - /* Ensure pow1 is greater than zero when computing normalization */ - max_val = 0; - move16(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - excTmp2[i] = abs_s( exc4kWhtnd[i] ); - move16(); /* Q_bwe_exc */ - max_val = s_max( max_val, excTmp2[i] ); - move16(); - } - - IF( max_val == 0 ) - { - pow1 = 1; - move16(); - n1 = 0; - move16(); - } - ELSE - { - n1 = norm_s( max_val ); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); // Q_bwe_exc + n1 - move16(); /* Q14 */ - } - n1 = sub( sub( 14, n1 ), Q_bwe_exc ); - pow1 = 1; - move32(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */ - pow1 = L_add_o( pow1, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */ - } - } - - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow ); - move32(); /* Q_bwe_exc+16 */ - *mem_csfilt = Mult_32_16( excNoisyEnv[i], neg_csfilt_den2[1] ); - move32(); /* Q_bwe_exc+16 */ - } - - create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed ); - - /* Ensure pow22 is greater than zero when computing normalization */ - Lmax = 0; - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4k_32[i] = Mult_32_16( excNoisyEnv[i], exc4k[i] ); - move32(); /* Q_bwe_exc+6 */ - Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) ); - } - - IF( Lmax == 0 ) - { - pow22 = 1; - move16(); - n2 = 0; - move16(); - set16_fx( exc4k_frac, 0, L_FRAME16k / 4 ); - } - ELSE - { - n2 = norm_l( Lmax ); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */ - move16(); - } - n2 = 30 - n2 - ( Q_bwe_exc + 6 ); - pow22 = 1; - move32(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */ - pow22 = L_add_o( pow22, L_shr( L_tmp, 10 ), &Overflow ); /* Q22 */ - } - } - - test(); - test(); - IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) ) - { - L_tmp = root_a_over_b_fx( pow1, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp ); - scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ - sc = sub( add( n2, Q_bwe_exc ), 14 ); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ - move16(); - } - } - ELSE - { - sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/ - - k = 0; - FOR( i = 0; i < 4; i++ ) - { - test(); - IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) ) - { - /*tmp_vfac = 2*voice_factors[i]; - tmp_vfac = min(1, tmp_vfac);*/ - tmp_vfac = shl_o( voice_factors[i], 1, &Overflow ); - } - ELSE - { - tmp_vfac = voice_factors[i]; - move16(); - } - - Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp ); - temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */ - L_tmp = Mult_32_16( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ - Ltemp2 = root_a_over_b_fx( L_tmp, sub( 19, shl( n1, 1 ) ), pow22, sub( 19, shl( n2, 1 ) ), &exp ); - temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */ - FOR( j = 0; j < L_FRAME16k / 16; j++ ) - { - L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */ - L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */ - exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */ - move16(); - k++; - } - } - } - } - - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); - - return; -} - -void GenShapedWBExcitation_fx( - Word16 *excSHB, /* o : synthesized shaped shb exctiation Q(Q_bwe_exc) */ - const Word16 *lpc_shb, /* i : lpc coefficients Q12 */ - Word16 *exc4kWhtnd, /* o : whitened synthesized shb excitation Q(Q_bwe_exc) */ - Word32 *mem_csfilt, /* i/o : memory Q(Q_bwe_exc+16) */ - Word16 *mem_genSHBexc_filt_down1, /* i/o : memory Q(Q_bwe_exc) */ - Word16 *mem_genSHBexc_filt_down2, /* i/o : memory Q(Q_bwe_exc) */ - Word16 *mem_genSHBexc_filt_down3, /* i/o : memory Q(Q_bwe_exc) */ - Word16 *state_lpc_syn, /* i/o : memory Q(Q_bwe_exc) */ - const Word16 coder_type, /* i : coding type */ - const Word16 *bwe_exc_extended, /* i : bwidth extended exciatation Q(Q_bwe_exc) */ - const Word16 Q_bwe_exc, /* i : Q for memories */ - Word16 bwe_seed[], /* i/o : random number generator seed */ - const Word16 voice_factors[], /* i : voicing factor Q15 */ - const Word16 uv_flag, /* i : unvoiced flag */ - const Word16 igf_flag ) -{ - Word16 i, j, k; - Word16 wht_fil_mem[LPC_WHTN_ORDER_WB]; - Word16 lpc_whtn[LPC_WHTN_ORDER_WB + 1]; - Word16 R_h[LPC_WHTN_ORDER_WB + 2], R_l[LPC_WHTN_ORDER_WB + 2]; - Word16 Q_R; - Word16 excTmp[L_FRAME16k]; - Word16 excTmp2[L_FRAME16k / 4]; - Word16 excTmp2_frac[L_FRAME16k / 4]; - Word16 exc4k[L_FRAME16k / 4]; - Word16 exc4k_frac[L_FRAME16k / 4]; - Word32 exc4k_32[L_FRAME16k / 4]; - Word32 pow1, pow22; - Word16 scale; - Word32 excNoisyEnv[L_FRAME16k / 4]; - Word16 csfilt_num2[1] = { 1638 }; /* Q15*/ - Word16 neg_csfilt_den2[2] = { -32768, 31457 }; /* Q15 */ - Word32 L_tmp, Ltemp1, Ltemp2; - Word16 temp1, temp2, exp; - Word32 Lmax; - Word16 max_val, n1, n2, sc; - Word32 LepsP[LPC_WHTN_ORDER_WB + 1]; - Word16 tmp_vfac; - Word16 avg_voice_fac; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - move16(); - move16(); - move16(); - - /*0.25f*sum_f(voice_factors, NB_SUBFR)*/ - L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ ); - FOR( i = 1; i < NB_SUBFR; i++ ) - { - L_tmp = L_mac( L_tmp, voice_factors[i], 8192 /*0.25 in Q15 */ ); - } - avg_voice_fac = round_fx( L_tmp ); - - test(); - test(); - test(); - test(); - IF( igf_flag != 0 && ( EQ_16( coder_type, VOICED ) || GT_16( avg_voice_fac, 11469 /* 0.35 in Q15 */ ) ) ) /*Q15 -> 0.35f*/ - { - csfilt_num2[0] = 6554; - move16(); /*Q15 -> 0.2f*/ - neg_csfilt_den2[1] = 26214; - move16(); /*Q15 -> 0.8f*/ - } - ELSE IF( igf_flag != 0 && ( EQ_16( coder_type, UNVOICED ) || LT_16( avg_voice_fac, 6654 /* 0.2 in Q15 */ ) ) ) /*Q15 -> 0.2f*/ - { - csfilt_num2[0] = 328; - move16(); /*Q15 -> 0.01f*/ - neg_csfilt_den2[1] = 32440; - move16(); /*Q15 -> 0.99f*/ - } - set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER_WB ); - Decimate_allpass_steep_fx( bwe_exc_extended, mem_genSHBexc_filt_down1, L_FRAME32k, excTmp ); - flip_spectrum_and_decimby4_fx( excTmp, exc4k, L_FRAME16k, mem_genSHBexc_filt_down2, mem_genSHBexc_filt_down3, 0 ); - - IF( uv_flag ) - { - create_random_vector_fx( exc4kWhtnd, L_FRAME16k / 4, bwe_seed ); - IF( LT_16( Q_bwe_exc, 5 ) ) - { - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4kWhtnd[i] = shl_r( exc4kWhtnd[i], sub( Q_bwe_exc, 5 ) ); /*Q(Q_bwe_exc)/Q5(if Q_bwe_exc > 5) */ - move16(); - } - } - } - ELSE - { - autocorr_fx( exc4k, LPC_WHTN_ORDER_WB + 1, R_h, R_l, &Q_R, - L_FRAME16k / 4, win_flatten_4k_fx, 0, 1 ); - - /* Ensure R[0] isn't zero when entering Levinson Durbin */ - R_l[0] = s_max( R_l[0], 1 ); - move16(); - FOR( i = 1; i <= LPC_WHTN_ORDER_WB; i++ ) - { - L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); - L_Extract( L_tmp, &R_h[i], &R_l[i] ); - } - - E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER_WB, NULL ); - - Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER_WB + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); - - fir_fx( exc4k, lpc_whtn, exc4kWhtnd, wht_fil_mem, L_FRAME16k / 4, - LPC_WHTN_ORDER_WB, 0, 3 ); - - /* Ensure pow1 is greater than zero when computing normalization */ - max_val = 0; - move16(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - excTmp2[i] = abs_s( exc4kWhtnd[i] ); - move16(); /* Q_bwe_exc */ - max_val = s_max( max_val, excTmp2[i] ); - move16(); - } - - IF( max_val == 0 ) - { - pow1 = 1; - move16(); - n1 = 0; - move16(); - } - ELSE - { - n1 = norm_s( max_val ); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - excTmp2_frac[i] = shl_o( excTmp2[i], n1, &Overflow ); - move16(); /* Q14 */ - } - n1 = sub( sub( 14, n1 ), Q_bwe_exc ); - pow1 = 1; - move32(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - L_tmp = L_mult_o( excTmp2_frac[i], excTmp2_frac[i], &Overflow ); /* Q29 */ - pow1 = L_add_o( pow1, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */ - } - } - - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - excNoisyEnv[i] = L_add_o( *mem_csfilt, L_mult_o( csfilt_num2[0], excTmp2[i], &Overflow ), &Overflow ); - move32(); /* Q_bwe_exc+16 */ - *mem_csfilt = Mpy_32_16_1( excNoisyEnv[i], neg_csfilt_den2[1] ); - move32(); /* Q_bwe_exc+16 */ - } - - create_random_vector_fx( exc4k, L_FRAME16k / 4, bwe_seed ); - - /* Ensure pow22 is greater than zero when computing normalization */ - Lmax = 0; - move32(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4k_32[i] = Mpy_32_16_1( excNoisyEnv[i], exc4k[i] ); - move32(); /* Q_bwe_exc+6 */ - Lmax = L_max( Lmax, L_abs( exc4k_32[i] ) ); - } - - IF( Lmax == 0 ) - { - pow22 = 1; - move16(); - n2 = 0; - move16(); - set16_fx( exc4k_frac, 0, L_FRAME16k / 4 ); - } - ELSE - { - n2 = norm_l( Lmax ); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4k_frac[i] = extract_h( L_shl_o( exc4k_32[i], n2, &Overflow ) ); /* Q(14-n2) */ - move16(); - } - n2 = sub( sub( 30, n2 ), add( Q_bwe_exc, 6 ) ); - pow22 = 1; - move32(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - L_tmp = L_mult_o( exc4k_frac[i], exc4k_frac[i], &Overflow ); /* Q29 */ - pow22 = L_add_o( pow22, L_shr( L_tmp, 7 ), &Overflow ); /* Q22 */ - } - } - - test(); - test(); - IF( EQ_16( coder_type, UNVOICED ) || ( igf_flag != 0 && LT_16( avg_voice_fac, 6654 /*0.2 in Q15 */ ) ) ) - { - L_tmp = root_a_over_b_fx( pow1, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp ); - scale = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /*Q15 */ - sc = sub( add( n2, Q_bwe_exc ), 14 ); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - exc4kWhtnd[i] = round_fx_o( L_shl_o( L_mult_o( exc4k_frac[i], scale, &Overflow ), sc, &Overflow ), &Overflow ); /* Q_bwe_exc+n2-10+16+ Q_bwe_exc + n2 -14 -16 = //Q_bwe_exc */ - move16(); - } - } - ELSE - { - sc = sub( add( n2, Q_bwe_exc ), 14 ); /* Q_bwe_exc+n2-14*/ - - k = 0; - move16(); - FOR( i = 0; i < 4; i++ ) - { - test(); - IF( igf_flag != 0 && EQ_16( coder_type, VOICED ) ) - { - /*tmp_vfac = 2*voice_factors[i]; - tmp_vfac = min(1, tmp_vfac);*/ - tmp_vfac = shl_o( voice_factors[i], 1, &Overflow ); - } - ELSE - { - tmp_vfac = voice_factors[i]; - move16(); - } - - Ltemp1 = root_a_fx( L_deposit_h( tmp_vfac ), 31, &exp ); - temp1 = round_fx_o( L_shl_o( Ltemp1, exp, &Overflow ), &Overflow ); /* Q15 */ - L_tmp = Mpy_32_16_1( pow1, sub( 32767, tmp_vfac ) ); /* Q22*/ - Ltemp2 = root_a_over_b_fx( L_tmp, sub( 22, shl( n1, 1 ) ), pow22, sub( 22, shl( n2, 1 ) ), &exp ); - temp2 = round_fx_o( L_shl_o( Ltemp2, exp, &Overflow ), &Overflow ); /* Q15 */ - FOR( j = 0; j < L_FRAME16k / 16; j++ ) - { - L_tmp = L_mult_o( temp1, exc4kWhtnd[k], &Overflow ); /* Q(16+Q_bwe_exc) */ - L_tmp = L_add_o( L_tmp, L_shl_o( L_mult_o( temp2, exc4k_frac[k], &Overflow ), sc, &Overflow ), &Overflow ); /* Q(16+Q_bwe_exc) */ - exc4kWhtnd[k] = round_fx_o( L_tmp, &Overflow ); /* Q_bwe_exc */ - move16(); - k = add( k, 1 ); - } - } - } - } - - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); - - - return; -} - -/*-------------------------------------------------------------------* - * GenWBSynth() - * - * Generate 16 KHz sampled highband component from synthesized highband - *-------------------------------------------------------------------*/ - -void GenWBSynth_fx( - const Word16 *input_synspeech, /* i : input synthesized speech Qx*/ - Word16 *shb_syn_speech_16k, /* o : output highband compnent Qx*/ - Word16 *state_lsyn_filt_shb1, /* i/o: memory Qx*/ - Word16 *state_lsyn_filt_shb2 /* i/o: memory Qx*/ -) -{ - Word16 speech_buf_16k1[L_FRAME16k], speech_buf_16k2[L_FRAME16k]; - Word16 i, maxm, nor; - Word16 input_synspeech_temp[L_FRAME16k / 4]; - - maxm = 0; - move16(); - FOR( i = 0; i < L_FRAME16k / 4; i++ ) - { - maxm = s_max( maxm, abs_s( input_synspeech[i] ) ); - } - FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) - { - maxm = s_max( maxm, abs_s( state_lsyn_filt_shb1[i] ) ); - } - FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) - { - maxm = s_max( maxm, abs_s( state_lsyn_filt_shb2[i] ) ); - } - - nor = s_max( sub( norm_s( maxm ), 3 ), 0 ); /* Headroom = 3 */ - IF( maxm == 0 ) - nor = 15; - move16(); - - Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k / 4, nor ); - Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, nor ); - Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, nor ); - Interpolate_allpass_steep_fx( input_synspeech_temp, state_lsyn_filt_shb1, L_FRAME16k / 4, speech_buf_16k1 ); - Interpolate_allpass_steep_fx( speech_buf_16k1, state_lsyn_filt_shb2, L_FRAME16k / 2, speech_buf_16k2 ); - flip_spectrum_fx( speech_buf_16k2, shb_syn_speech_16k, L_FRAME16k ); - - Scale_sig( shb_syn_speech_16k, L_FRAME16k, negate( nor ) ); - Scale_sig( state_lsyn_filt_shb1, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) ); - Scale_sig( state_lsyn_filt_shb2, 2 * ALLPASSSECTIONS_STEEP, negate( nor ) ); - - return; -} - - -void find_td_envelope_fx( - const Word16 inp[], /* i : input signal Qx */ - const Word16 len, /* i : length of the input signal */ - const Word16 len_h, /* i : length of the MA filter */ - Word16 mem_h[], /* i/o: memory of the MA filter, length len_h/2 Qx */ - Word16 out[] /* o : td envelope of the input signal Qx */ -) -{ - Word16 k, K; - Word16 buf_in[L_FRAME16k + MAX_LEN_MA_FILTER], *p_in, *p_out, *p_prev, w; - Word16 tmp1, tmp2; - - assert( len > 0 && len <= L_FRAME16k ); - - // len_h is 20 at all calling locations - K = 10; /* length of FIR filter memory = half of the total filter length */ - move16(); - w = 1639; /* 1 / 20 in Q15 */ /* MA filtering coefficient */ - move16(); - - /* copy filter memory to the input buffer */ - IF( mem_h != NULL ) - { - Copy( mem_h, buf_in, K ); - } - ELSE - { - /* no memory available, use the first len_h/2 samples as memory */ - p_in = buf_in; - FOR( k = 0; k < K; k++ ) - { - *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */ - move16(); - } - } - - /* take the absolute value of the input signal and copy it to the input buffer */ - /* multiply each value by 1 / filter length */ - p_in = &buf_in[K]; - FOR( k = 0; k < len; k++ ) - { - *p_in++ = mult_r( abs_s( inp[k] ), w ); /* Qx */ - move16(); - } - - /* update filter memory from the end of the input buffer */ - IF( mem_h != NULL ) - { - Copy( &buf_in[len], mem_h, K ); - } - - /* do MA filtering */ - out[0] = sum16_fx( buf_in, len_h ); - move16(); - p_out = &buf_in[0]; /* pointer to leaving sample */ - p_in = &buf_in[len_h]; /* pointer to entering sample*/ - FOR( k = 1; k < len - K; k++ ) - { - tmp1 = *p_out++; - move16(); - tmp2 = *p_in++; - move16(); - out[k] = add( sub( out[k - 1], tmp1 ), tmp2 ); /* Qx */ - move16(); - } - - /* use IIR filtering to extrapolate the last K samples */ - p_in = &buf_in[len - K]; - p_out = &out[len - K]; - p_prev = p_out - 1; - FOR( k = 0; k < K; k++ ) - { - tmp1 = *p_in++; - move16(); - tmp2 = *p_prev++; - move16(); - *p_out++ = add( mult_r( 1638 /* 0.05f in Q15 */, ( tmp1 ) ), mult_r( 31130 /* 0.95f in Q15 */, ( tmp2 ) ) ); - move16(); - } - - return; -} - - -/*======================================================================================*/ -/* FUNCTION : void GenShapedSHBExcitation_fx () */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Synthesize spectrally shaped highband excitation signal */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _(Word16) coder_type : coding type Q_bwe_exc */ -/* _(Word16) bwidth : input signal bwidth Q0 */ -/* _(Word16*) bwe_exc_extended :bwidth extended exciatation Q_bwe_exc */ -/* _(Word16[]) voice_factors :voicing factors Q15 */ -/* _(Word16*) lpc_shb :lpc coefficients Q12 */ -/* _(Word16*) Q_bwe_exc :Q Format of bwe_exc_extended */ -/* _(Word16) L_frame : Frame length - determines whether 12.8 or 16kHz core */ -/* _(Word16) last_L_frame : last L_frame */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _(Word16*)excSHB :synthesized shaped shb excitation Q_bwe_exc */ -/* _(Word16*)White_exc16k :white excitation for the Fullband extension Q_bwe_exc */ -/* _(Word16*)slope :slope +ve (high freq > low freq), -ve or neutral Q12 */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _(Word16*)mem_csfilt :memory */ -/* _(Word16*)mem_genSHBexc_filt_down_shb :memory */ -/* _(Word16*)state_lpc_syn :memory */ -/* _(Word16[]) bwe_seed :random number generator seed */ -/* _(Word16[]) lpf_14k_mem :memory */ -/* _(Word32[])Hilbert_Mem :memory */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* CALLED FROM : RX */ -/*======================================================================================*/ -void GenShapedSHBExcitation_fx( - Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ - const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ - Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc */ - Word32 *mem_csfilt, /* i/o: memory */ - Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */ - Word16 *state_lpc_syn, /* i/o: memory */ - const Word16 coder_type, /* i : coding type */ - const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */ - Word16 bwe_seed[], /* i/o: random number generator seed */ - Word16 voice_factors[], /* i : voicing factor*/ - const Word16 extl, /* i : extension layer */ - Word16 *tbe_demph, /* i/o: de-emphasis memory */ - Word16 *tbe_premph, /* i/o: pre-emphasis memory */ - Word16 *lpc_shb_sf, /* i: LP coefficients */ - const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */ - Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */ - Word16 *shb_res, - Word16 *vf_ind, - const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */ - Word16 fb_state_lpc_syn[], /* i/o: memory */ - Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */ - Word16 *Q_bwe_exc, - Word16 *Q_bwe_exc_fb, - const Word16 Q_shb, - Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ - Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ - const Word32 bitrate, - const Word16 prev_bfi -#ifdef ADD_IVAS_TBE_CODE - , /* i : previous frame was concealed */ - const Word16 element_mode, /* i : element mode */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ - Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ - const Word32 extl_brate, /* i : extension layer bitarte */ - const Word16 MSFlag, /* i : Multi Source flag */ - Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ - Word16 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ - Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ - Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ - Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -#endif -) -{ - Word16 i, j, k; - Word16 wht_fil_mem[LPC_WHTN_ORDER]; - Word16 lpc_whtn[LPC_WHTN_ORDER + 1]; - Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */ - Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */ - Word16 Q_R; - Word32 LepsP[LPC_WHTN_ORDER + 1]; - Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k]; - Word32 pow1, pow22; - Word16 scale, temp1, temp2; - - Word16 excTmp2[L_FRAME16k]; - Word16 *White_exc16k; - Word16 excNoisyEnv[L_FRAME16k]; - Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ - move16(); - Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ - move16(); - move16(); - Word16 varEnvShape; - Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ - move16(); - Word16 exc16kWhtnd[L_FRAME16k]; - - Word32 L_tmp; - Word16 vf_tmp; - Word16 tmp, exp, tmp2; - Word16 voiceFacEst[NB_SUBFR16k]; - Word16 zero_mem[LPC_SHB_ORDER]; - Word32 syn_shb_ener_sf[4]; - Word16 tempSHB[80]; - Word16 Q_pow1, Q_pow22; - - Word32 L_tmp2, L_tmp3, L_tmp4; - Word16 temp; - - Word16 White_exc16k_FB_temp[L_FRAME16k]; - Word32 White_exc16k_32[L_FRAME16k]; - Word16 Q_temp; - Word16 prev_Q_bwe_exc_fb; - -#ifdef ADD_IVAS_TBE_CODE - Word32 tempD; - Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; - Word16 cbsize; - Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; - Word16 c0, c1, c2, c3, c4, c5, g1, g2, g, den; - Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; - Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; - Word16 flag_plosive; - Word16 delta; - Word16 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; - - mix_factor = 0.0f; -#endif - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); - - FOR( i = 0; i < L_FRAME32k; i = i + 2 ) - { - exc32k[i] = negate( bwe_exc_extended[i] ); - move16(); - exc32k[i + 1] = bwe_exc_extended[i + 1]; - move16(); - } - - /* Decimate by 2 */ - Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); - /* i: exc32k in Q_bwe_exc */ - /* o: exc16k in Q_bwe_exc */ - - autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); - /* Ensure R[0] isn't zero when entering Levinson Durbin */ - R_l[0] = s_max( R_l[0], 1 ); - move16(); - FOR( i = 1; i <= LPC_WHTN_ORDER; i++ ) - { - L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); - L_Extract( L_tmp, &R_h[i], &R_l[i] ); - } - E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL ); - Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); - fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); - - /* i: exc16k in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc */ - -#ifdef ADD_IVAS_TBE_CODE - IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif - { - temp2 = 0; - move16(); - FOR( j = 0; j < 4; j++ ) - { - temp1 = shb_res_gshape[j]; - move16(); - FOR( i = 0; i < 80; i++ ) - { - exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); - move16(); - /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ - } - temp2 = add( temp2, 80 ); - } - } - - /* Estimate pow1 associated with Low band nonlinear extended excitation */ - /* pow1=0.00001f */ - tmp = sub( shl( *Q_bwe_exc, 1 ), 31 ); - pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/ - excTmp2[k] = abs_s( exc16kWhtnd[k] ); - move16(); - - /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */ - pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */ - } - Q_pow1 = shl( *Q_bwe_exc, 1 ); - - test(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( flag_ACELP16k, 0 ) ) -#else - IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) -#endif - { - /* varEnvShape = mean_fx(voice_factors, 4); */ - /* unroll the loop */ - L_tmp = L_mult( voice_factors[0], 8192 ); - L_tmp = L_mac( L_tmp, voice_factors[1], 8192 ); - L_tmp = L_mac( L_tmp, voice_factors[2], 8192 ); - varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 ); /* varEnvShape in Q15 */ - } - ELSE /* 16k core */ - { - /* varEnvShape = mean_fx(voice_factors, 5); */ - /* unroll the loop */ - L_tmp = L_mult( voice_factors[0], 6554 ); - L_tmp = L_mac( L_tmp, voice_factors[1], 6554 ); - L_tmp = L_mac( L_tmp, voice_factors[2], 6554 ); - L_tmp = L_mac( L_tmp, voice_factors[3], 6554 ); - varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 ); /* varEnvShape in Q15 */ - } - - IF( EQ_16( extl, FB_TBE ) ) - { - /*pow(varEnvShape,3) */ - tmp = mult_r( varEnvShape, varEnvShape ); - tmp = mult_r( tmp, varEnvShape ); - - /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */ - fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp ); - fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ ); - } - - /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */ - varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape ); - - /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */ - varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ ); - varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ ); - varEnvShape = shl( varEnvShape, 1 ); - csfilt_num2[0] = sub( MAX_16, varEnvShape ); - move16(); - neg_csfilt_den2[1] = varEnvShape; - move16(); - - test(); - test(); - test(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#else - IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#endif - { - /* pre-init smoothing filter to avoid energy drop outs */ - L_tmp = L_mult( excTmp2[0], 1638 ); - FOR( i = 1; i < L_SUBFR16k / 4; i++ ) - { - L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/ - } - /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */ - - /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */ - /* rather stick to the more conservative approach, to avoid potential clippings */ - test(); - IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) ) - { - /* use weak smoothing for 1st frame after switching to make filter recover more quickly */ - varEnvShape = 26214 /*0.8f Q15*/; - move16(); - csfilt_num2[0] = sub( MAX_16, varEnvShape ); - move16(); - neg_csfilt_den2[1] = varEnvShape; - move16(); - } - - *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); - move32(); - } -#ifdef ADD_IVAS_TBE_CODE - if ( MSFlag > 0 ) - { - varEnvShape = 0.995f; - csfilt_num2[0] = 1.0f - varEnvShape; - csfilt_den2[1] = -varEnvShape; - } - - White_exc16k = exc16k; - - /* Track the low band envelope */ - if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) - { - if ( extl_brate != SWB_TBE_1k10 && extl_brate != SWB_TBE_1k75 ) - { - mem_csfilt_left = 0.0f; - mem_csfilt_right = 0.0f; - for ( k = 0; k < L_FRAME16k; k++ ) - { - excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; - mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; - excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; - mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; - } - - alpha = 0.0f; - step = 1.0f / L_FRAME16k; - for ( k = 0; k < L_FRAME16k; k++ ) - { - excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + ( 1 - alpha ) * excNoisyEnvRight[k]; - alpha += step; - } - } - } - else -#endif - { - /* Track the low band envelope */ - L_tmp = *mem_csfilt; - move32(); - FOR( i = 0; i < L_FRAME16k; i++ ) - { - excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], excTmp2[i] ); - move16(); - /* excNoisyEnv : Q_bwe_exc, - *mem_csfilt: Q_bwe_exc+16, excTmp2: Q_bwe_exc, csfilt_num2[0] Q15 */ - L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_bwe_exc+16 */ - } - *mem_csfilt = L_tmp; - move32(); - } -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - /* generate gaussian (white) excitation */ - for ( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k[k] = (float) own_random( &bwe_seed[0] ); - } - - /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ - pow22 = POW_EXC16k_WHTND; - v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), White_exc16k, L_FRAME16k ); - } - else -#endif - { - /* create a random excitation - Reuse exc16k memory */ - White_exc16k = exc16k; - create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); - create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); - - L_tmp = L_deposit_l( 0 ); - tmp = add( *Q_bwe_exc, 1 ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp ); - if ( excNoisyEnv[k] != 0 ) - { - L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_bwe_exc) +5 +1*/ - } - White_exc16k_32[k] = L_tmp4; - move32(); - L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); - } - Q_temp = norm_l( L_tmp ); - if ( L_tmp == 0 ) - { - Q_temp = 31; - move16(); - } - /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ - /* White_exc16k in Q6 */ - - /* calculate pow22 */ - /* pow22=0.00001f */ - tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 ); - pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc-NOISE_QADJ) */ - tmp = sub( NOISE_QFAC, 5 ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /* White_exc16k[k] *= excNoisyEnv[k]; */ - White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) ); - move16(); - /* i: excNoisyEnv in (Q_bwe_exc) */ - /* i: White_exc16k in Q6 */ - /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */ - /* pow22 += White_exc16k[k] * White_exc16k[k]; */ - pow22 = L_mac0_sat( pow22, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_bwe_exc-NOISE_QADJ)*/ - } - /*Q_pow22 = sub( shl(*Q_bwe_exc,1), 18 );*/ - Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ); - } - -#ifdef ADD_IVAS_TBE_CODE - flag_plosive = 0; - move16(); - test(); - test(); - test(); - IF(GE_32(extl_brate, SWB_TBE_2k8) || EQ_32(extl_brate, SWB_TBE_1k10) || EQ_32(extl_brate, SWB_TBE_1k75))) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif - { - IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ - { -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ - find_td_envelope( White_exc16k, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); - find_td_envelope( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); - - for ( k = 0; k < L_FRAME4k; k++ ) - { - EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; - EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; - } - - /* calculate the optimal mix factor */ - c0 = c1 = c2 = c3 = c4 = c5 = 0.0f; - for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - - c0 += c0_part[i]; - c1 += c1_part[i]; - c2 += c2_part[i]; - c3 += c3_part[i]; - c4 += c4_part[i]; - c5 += c5_part[i]; - } - - den = 4.0f * c0 * c2 - c4 * c4; - g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; - g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; - - *Env_error = 0.0f; - flag_plosive = 0; - for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; - *Env_error += Env_error_part[i]; - - if ( Env_error_part[i] > THR_ENV_ERROR_PLOSIVE ) - { - /* envelope error is too high -> likely a plosive */ - flag_plosive = 1; - } - } - - if ( flag_plosive ) - { - /* plosive detected -> set the mixing factor to 0 */ - *vf_ind = 0; - mix_factor = 0.0f; - } - else - { - /* normalize gain */ - g = g2 / ( g1 + g2 ); - - /* quantization of the mixing factor */ - cbsize = 1 << NUM_BITS_SHB_VF; - delta = 1.0f / ( cbsize - 1 ); - if ( g > 1.0f ) - { - g = 1.0f; - } - else if ( g < delta ) - { - /* prevent low gains to be quantized to 0 as this is reserved for plosives */ - g = delta; - } - - *vf_ind = usquant( g, &mix_factor, 0.0f, 1.0f / ( cbsize - 1 ), cbsize ); - } - } - else -#endif - { - Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, - ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); - tmp = voiceFacEst[0]; - move16(); - tmp2 = MAX_16; - move16(); - if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } - ELSE /* decoder side */ - { -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - if ( *vf_ind == 0 ) - { - mix_factor = 0.0f; - flag_plosive = 1; - } - else - { - mix_factor = usdequant( *vf_ind, 0.0f, 1.0f / ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); - } - } - else -#endif - { - /* *vf_ind is an integer scale by 0.125f*/ - tmp = shl( *vf_ind, ( 15 - 3 ) ); - tmp2 = MAX_16; - move16(); - if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } -#ifdef ADD_IVAS_TBE_CODE - IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) -#endif - { - voice_factors[0] = mult_r( voice_factors[0], tmp2 ); - move16(); - voice_factors[1] = mult_r( voice_factors[1], tmp2 ); - move16(); - voice_factors[2] = mult_r( voice_factors[2], tmp2 ); - move16(); - voice_factors[3] = mult_r( voice_factors[3], tmp2 ); - move16(); - voice_factors[4] = mult_r( voice_factors[4], tmp2 ); - move16(); - } - } -#ifdef ADD_IVAS_TBE_CODE - if ( element_mode >= IVAS_CPE_DFT && nlExc16k != NULL ) - { - /* save buffers for IC-BWE */ - mvr2r( exc16kWhtnd, nlExc16k, L_FRAME16k ); - v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), mixExc16k, L_FRAME16k ); - } -#endif - - tmp = sub( Q_temp, 3 ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ - } - prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; - move16(); - *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); - move16(); - deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); - /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ - /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - if ( !flag_plosive ) /* use only LB excitation in case of plosives */ - { - /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ - old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); - new_scale = 1.0f; - step_scale = ( new_scale - old_scale ) / ( L_FRAME16k / 2 ); - scale = old_scale; - - /* interpolate between the old and the new value of the mixing factor */ - old_fact = *prev_mix_factor; - new_fact = mix_factor; - step = ( new_fact - old_fact ) / ( L_FRAME16k / 2 ); - fact = old_fact; - - /* mixing of LB and gaussian excitation in the first half of the frame */ - for ( k = 0; k < L_FRAME16k / 2; k++ ) - { - exc16kWhtnd[k] = (float) fact * ( White_exc16k[k] * scale ) + (float) ( 1 - fact ) * exc16kWhtnd[k]; - fact += step; - scale += step_scale; - } - - /* mixing of LB and gaussian excitation in the second half of the frame */ - for ( ; k < L_FRAME16k; k++ ) - { - exc16kWhtnd[k] = (float) new_fact * White_exc16k[k] + (float) ( 1 - new_fact ) * exc16kWhtnd[k]; - } - } - preemph( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - } - else -#endif - { -#ifdef ADD_IVAS_TBE_CODE - if ( coder_type == UNVOICED || MSFlag == 1 ) -#else - IF( EQ_16( coder_type, UNVOICED ) ) -#endif - { - L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); - scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */ - L_tmp = L_mult( White_exc16k[k], scale ); - /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ - exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); - move16(); - /* exc16kWhtnd: Q_bwe_exc */ - } - PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - /* i/o: exc16kWhtnd (Q_bwe_exc) */ - /* i/o: tbe_premph (Q_bwe_exc) */ - } - ELSE - { - Word16 nbSubFr, lSubFr; - Word16 tempQ15; - Word32 tempQ31; - /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/ - nbSubFr = NB_SUBFR16k; - lSubFr = ( L_FRAME16k / NB_SUBFR16k ); - IF( LT_32( bitrate, ACELP_24k40 ) ) - { - nbSubFr = NB_SUBFR; - move16(); - lSubFr = ( L_FRAME16k / NB_SUBFR ); - move16(); - } - k = 0; - FOR( i = 0; i < nbSubFr; i++ ) - { - test(); - IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) - { - exp = 0; - move16(); - tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ - temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - exp = 0; - move16(); - tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ - temp = sub( MAX_16, temp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - ELSE - { - /* Adjust noise mixing for formant sharpening filter */ - tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); - /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ - vf_tmp = sub( MAX_16, tempQ15 ); - vf_tmp = mult_r( voice_factors[i], vf_tmp ); - - exp = 0; - move16(); - tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ - temp = sub( MAX_16, vf_tmp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - - FOR( j = 0; j < lSubFr; j++ ) - { - /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ - L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/ - L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */ - exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); - move16(); - /* Q_bwe_exc */ - } - k = add( k, lSubFr ); - - /* estimate the pre-emph factor */ - tempQ15 = sub( MAX_16, voice_factors[i] ); - exp = 0; - move16(); - temp = Sqrt16( tempQ15, &exp ); - temp = shl( temp, exp - 1 ); - - temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ - temp = div_s( temp, temp2 ); /* Q15 */ - temp = mult_r( PREEMPH_FAC, temp ); - - PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); - /* exc16kWhtnd: Q_bwe_exc; - tbe_premph: Q_bwe_exc*/ - } - } - } - -#ifdef ADD_IVAS_TBE_CODE - IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) -#else - IF( LT_32( bitrate, ACELP_24k40 ) ) -#endif - { - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: excSHB in Q_bwe_exc */ - } - ELSE - { - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: tempSHB in Q_bwe_exc */ - /* o: syn_shb_ener_sf in (2*Q_bwe_exc+1) */ - IF( LE_32( bitrate, ACELP_32k ) ) - { - L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); - - /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ - tmp = shl( Q_shb, 1 ); - tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 ); - L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ - - *Q_bwe_exc = sub( *Q_bwe_exc, exp ); - move16(); /* compensate for the exp shift */ - tmp2 = add( prev_Q_bwe_syn, n_mem2 ); - IF( GT_16( *Q_bwe_exc, tmp2 ) ) - { - L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); - *Q_bwe_exc = tmp2; - move16(); - } - FOR( i = 0; i < L_FRAME16k; i++ ) - { - L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ - exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ - move16(); - } - } - /* i: L_tmp2 in (Q31-exp) */ - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ - - /* Rescale the past memories: LP synth and SHB look ahead buffers */ - tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); - FOR( i = 0; i < LPC_SHB_ORDER; i++ ) - { - state_lpc_syn[i] = shl( state_lpc_syn[i], tmp ); - move16(); - } - FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) - { - excSHB[i] = shl( excSHB[i], tmp ); - move16(); - } - /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ - - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in (Q_bwe_exc) */ - /* o: excSHB in (Q_bwe_exc) */ - } - - IF( EQ_16( extl, FB_TBE ) ) - { - tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); - Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); - Scale_sig( fb_tbe_demph, 1, tmp ); - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); - /* i: White_exc16k_FB in (14-n2) */ - /* o: White_exc16k_FB_temp in (14-n2) */ - - FOR( i = 0; i < 10; i++ ) - { - FOR( j = 0; j < 32; ++j ) - { - White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); - move16(); - } - } - - *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); - move16(); /**Q_bwe_exc_fb +35 +1 -16*/ - flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); - - deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); - } - ELSE - { - set16_fx( White_exc16k_FB, 0, L_FRAME16k ); - } - -#ifdef ADD_IVAS_TBE_CODE - *prev_pow_exc16kWhtnd = pow1; - *prev_mix_factor = mix_factor; -#endif - return; -} - -void GenShapedSHBExcitation_ivas_enc_fx( - Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ - const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ - Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc_fb */ - Word32 *mem_csfilt, /* i/o: memory */ - Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */ - Word16 *state_lpc_syn, /* i/o: memory */ - const Word16 coder_type, /* i : coding type */ - const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */ - Word16 bwe_seed[], /* i/o: random number generator seed */ - Word16 voice_factors[], /* i : voicing factor*/ - const Word16 extl, /* i : extension layer */ - Word16 *tbe_demph, /* i/o: de-emphasis memory */ - Word16 *tbe_premph, /* i/o: pre-emphasis memory */ - Word16 *lpc_shb_sf, /* i: LP coefficients */ - const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */ - Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */ - Word16 *shb_res, - Word16 *vf_ind, - const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */ - Word16 fb_state_lpc_syn[], /* i/o: memory */ - Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */ - Word16 *Q_bwe_exc, - Word16 *Q_bwe_exc_fb, - const Word16 Q_shb, - Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ - Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ - const Word32 bitrate, - const Word16 prev_bfi, - const Word16 element_mode, /* i : element mode */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ - Word16 *nlExc16k_e, /* i/o: exp of nlExc16k */ - Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ - Word16 *mixExc16k_e, /* i/o: exp of mixExc16k_fx */ - const Word32 extl_brate, /* i : extension layer bitarte */ - const Word16 MSFlag, /* i : Multi Source flag */ - Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ - Word16 Q_EnvSHBres_4k, - Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ - Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ - Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ - Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -) -{ - Word16 i, j, k; - Word16 wht_fil_mem[LPC_WHTN_ORDER]; - Word16 lpc_whtn[LPC_WHTN_ORDER + 1]; - Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */ - Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */ - Word16 Q_R; - Word32 LepsP[LPC_WHTN_ORDER + 1]; - Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k]; - Word32 pow1, pow22; - Word16 scale, temp1, temp2, temp3; - - Word16 excTmp2[L_FRAME16k]; - Word16 *White_exc16k; - Word16 Q_White_exc16k; - Word16 excNoisyEnv[L_FRAME16k]; - Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ - move16(); - Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ - move16(); - move16(); - Word16 varEnvShape; - Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ - Word16 exc16kWhtnd[L_FRAME16k]; - - Word32 L_tmp; - Word16 vf_tmp; - Word16 tmp, exp, tmp2 = 0; - move16(); - Word16 voiceFacEst[NB_SUBFR16k]; - Word16 zero_mem[LPC_SHB_ORDER]; - Word32 syn_shb_ener_sf[4]; - Word16 syn_shb_ener_sf_q[4]; - Word16 tempSHB[80]; - Word16 Q_pow1, Q_pow22; - - Word32 L_tmp2, L_tmp3, L_tmp4; - Word16 temp; - - Word16 White_exc16k_FB_temp[L_FRAME16k]; - Word32 White_exc16k_32[L_FRAME16k]; - Word16 White_exc16k_tmp[L_FRAME16k]; - Word16 prev_Q_bwe_exc_fb; - - Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; - Word16 cbsize; - Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; - Word32 c0, c1, c2, c3, c4, c5, den; - Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e; - Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; - Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; - Word16 flag_plosive; - Word16 delta; - Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; - Word64 W_tmp; - - mix_factor = 0; /* Q15 */ - move16(); - - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); - FOR( i = 0; i < L_FRAME32k; i = i + 2 ) - { - exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc - move16(); - exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc - move16(); - } - - /* Decimate by 2 */ - Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc - /* i: exc32k in Q_bwe_exc */ - /* o: exc16k in Q_bwe_exc */ - - autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R - /* Ensure R[0] isn't zero when entering Levinson Durbin */ - R_l[0] = s_max( R_l[0], 1 ); - move16(); - FOR( i = 1; i <= LPC_WHTN_ORDER; i++ ) - { - L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); - L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R - } - E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL ); - Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12 - fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc - - /* i: exc16k in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc */ - - IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) - { - temp2 = 0; - move16(); - FOR( j = 0; j < 4; j++ ) - { - temp1 = shb_res_gshape[j]; - move16(); - FOR( i = 0; i < 80; i++ ) - { - exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc - move16(); - /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ - } - temp2 = add( temp2, 80 ); - } - } - - /* Estimate pow1 associated with Low band nonlinear extended excitation */ - /* pow1=0.00001f */ - tmp = sub( shl( *Q_bwe_exc, 1 ), 31 ); - W_tmp = W_shl( 21475 /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/ - excTmp2[k] = abs_s( exc16kWhtnd[k] ); - move16(); - - /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */ - W_tmp = W_mac_16_16( W_tmp, exc16kWhtnd[k], exc16kWhtnd[k] ); // 2*Q_bwe_exc+1 - } - exp = W_norm( W_tmp ); - pow1 = W_extract_h( W_shl( W_tmp, exp ) ); // 2*Q_bwe_exc+1+exp-32 = // tmp+exp - Q_pow1 = add( tmp, exp ); - - IF( flag_ACELP16k == 0 ) - { - /* varEnvShape = mean_fx(voice_factors, 4); */ - /* unroll the loop */ - L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ ); - varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */ - } - ELSE /* 16k core */ - { - /* varEnvShape = mean_fx(voice_factors, 5); */ - /* unroll the loop */ - L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ ); - varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */ - } - - IF( EQ_16( extl, FB_TBE ) ) - { - /*pow(varEnvShape,3) */ - tmp = mult_r( varEnvShape, varEnvShape ); - tmp = mult_r( tmp, varEnvShape ); - - /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */ - fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp ); - fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ ); - } - - /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */ - varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape ); - - /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */ - varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ ); - varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ ); - varEnvShape = shl( varEnvShape, 1 ); - csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15 - move16(); - neg_csfilt_den2[1] = varEnvShape; // Q15 - move16(); - - test(); - test(); - test(); - test(); - IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) - { - /* pre-init smoothing filter to avoid energy drop outs */ - L_tmp = L_mult( excTmp2[0], 1638 ); - FOR( i = 1; i < L_SUBFR16k / 4; i++ ) - { - L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/ - } - /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */ - - /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */ - /* rather stick to the more conservative approach, to avoid potential clippings */ - test(); - IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) ) - { - /* use weak smoothing for 1st frame after switching to make filter recover more quickly */ - varEnvShape = 26214 /*0.8f Q15*/; - move16(); - csfilt_num2[0] = sub( MAX_16, varEnvShape ); - move16(); - neg_csfilt_den2[1] = varEnvShape; - move16(); - } - - *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); - move32(); - } - - IF( MSFlag > 0 ) - { - // varEnvShape = 0.995f; - varEnvShape = 32604; - move16(); - csfilt_num2[0] = 32768 - varEnvShape; - // csfilt_num2[0] = sub( 32767, varEnvShape ); - move16(); - neg_csfilt_den2[1] = varEnvShape; - move16(); - } - - White_exc16k = exc16k; - Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); - IF( *mem_csfilt ) - { - Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) ); - } - test(); - /* Track the low band envelope */ - IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) - { - test(); - IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) - { - mem_csfilt_left = 0; - mem_csfilt_right = 0; - move16(); - move16(); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; - excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 - move16(); - // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; - mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2 - // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; - excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 - move16(); - // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; - mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2 - } - - alpha = 0; - move16(); - // step = 1.0f / L_FRAME16k; - step = 102; // Q15 - move16(); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k]; - excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2 - move16(); - alpha = add( alpha, step ); - } - } - } - ELSE - { - /* Track the low band envelope */ - L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) ); - move32(); - FOR( i = 0; i < L_FRAME16k; i++ ) - { - excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) ); - move16(); - /* Work-around to avoid 0s for very small value*/ - test(); - test(); - test(); - test(); - if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) ) - { - excNoisyEnv[i] = 1; - move16(); - } - /* excNoisyEnv : Q_excTmp2, - *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */ - L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */ - } - *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) ); - move32(); - } - - test(); - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - /* generate gaussian (white) excitation */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0 - move16(); - } - - /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ - Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31 - move32(); - move32(); - pow22 = POW_EXC16k_WHTND_FX; - Q_pow22 = -6; - move16(); - // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k); - Word16 pow1_exp = sub( Q31, Q_pow1 ); - Word32 temp_pow = Sqrt32( pow1, &pow1_exp ); - temp_pow = L_shl( Mpy_32_32( temp_pow, pow22_inv ), pow1_exp ); - /*Word16 out_exp; - Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp); - temp_pow1 = L_shl(temp_pow1, out_exp);*/ - // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); - L_tmp = 0; - move32(); - Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16 - move32(); - White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q16 + Q_White_exc16k - Q16 = Q_White_exc16k - move16(); - L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); - } - } - ELSE - { - /* create a random excitation - Reuse exc16k memory */ - create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5 - create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5 - - L_tmp = L_deposit_l( 0 ); - tmp = add( *Q_bwe_exc, 1 ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/ - White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/ - move32(); - L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); - } - /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ - /* White_exc16k in Q6 */ - - /* calculate pow22 */ - /* pow22=0.00001f */ - tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 ); - W_tmp = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */ - Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /* White_exc16k[k] *= excNoisyEnv[k]; */ - White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10 - move16(); - /* i: excNoisyEnv in (Q_excTmp2) */ - /* i: White_exc16k in Q6 */ - /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */ - - /* pow22 += White_exc16k[k] * White_exc16k[k]; */ - W_tmp = W_mac0_16_16( W_tmp, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/ - } - Q_pow22 = W_norm( W_tmp ); - pow22 = W_extract_h( W_shl( W_tmp, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32 - Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 ); - Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) ); - } - - flag_plosive = 0; - move16(); - test(); - test(); - test(); - IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ - { -#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! - test(); - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) ); - move16(); - } - - /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ - find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */ - find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */ - - FOR( k = 0; k < L_FRAME4k; k++ ) - { - EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */ - move16(); - EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */ - move16(); - } - - /* calculate the optimal mix factor */ - c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */ - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - - temp1 = add( shl( *Q_bwe_exc, 1 ), 1 ); - temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 ); - temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 ); - FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ - move32(); - // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ - move32(); - // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ - move32(); - // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ - move32(); - // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */ - move32(); - // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */ - move32(); - - c0 = L_add( c0, c0_part[i] ); - c1 = L_add( c1, c1_part[i] ); - c2 = L_add( c2, c2_part[i] ); - c3 = L_add( c3, c3_part[i] ); - c4 = L_add( c4, c4_part[i] ); - c5 = L_add( c5, c5_part[i] ); - } - - // den = 4.0f * c0 * c2 - c4 * c4; - W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) ); - den_e = 63; - move16(); - shift = W_norm( W_tmp ); - den = W_extract_h( W_shl( W_tmp, shift ) ); - den_e = sub( den_e, shift ); - - IF( den == 0 ) - { - den = 1; - move32(); - den_e = 31; - move16(); - } - - // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; - W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) ); - g1_e = 63; - move16(); - shift = W_norm( W_tmp ); - L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); - g1_e = sub( g1_e, shift ); - - g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); - g1_e = sub( add( tmp_e, g1_e ), den_e ); - - // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; - W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) ); - g2_e = 63; - move16(); - shift = W_norm( W_tmp ); - L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); - g2_e = sub( g2_e, shift ); - - g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); - g2_e = sub( add( tmp_e, g2_e ), den_e ); - - // *Env_error = 0.0f; - *Env_error = 0; - move16(); - flag_plosive = 0; - move16(); - FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; - L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e ); - - // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent - Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */ - move16(); - - // *Env_error += Env_error_part[i]; - *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */ - move16(); - - if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q - { - /* envelope error is too high -> likely a plosive */ - flag_plosive = 1; - move16(); - } - } - - IF( flag_plosive ) - { - /* plosive detected -> set the mixing factor to 0 */ - *vf_ind = 0; - move16(); - mix_factor = 0; - move16(); - } - ELSE - { - /* normalize gain */ - // g = g2 / ( g1 + g2 ); - tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp ); - IF( tmp == 0 ) - { - tmp = 1; - move16(); - tmp1_e = 15; - move16(); - } - g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e ); - g_e = sub( add( tmp_e, g2_e ), tmp1_e ); - - /* quantization of the mixing factor */ - cbsize = 1 << NUM_BITS_SHB_VF; - move16(); - // delta = 1.0f / ( cbsize - 1 ); - delta = 2341; /* Q14 */ - move16(); - // if ( g > 1.0f ) - IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 ) - { - // g = 1.0f; - g = MAX16B; /* Q15 */ - move16(); - g_e = 0; - move16(); - } - // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) ) - ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 ) - { - /* prevent low gains to be quantized to 0 as this is reserved for plosives */ - // g = delta; - g = shl( delta, 1 ); /* Q15 */ - g_e = 0; - move16(); - } - - g = shl_sat( g, g_e ); /* Q15 */ - - *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize ); - move16(); - } - } - ELSE -#else - UNUSED_PARAM( Env_error_part ); - UNUSED_PARAM( Env_error ); - UNUSED_PARAM( EnvSHBres_4k ); - UNUSED_PARAM( c5_part ); - UNUSED_PARAM( c1 ); - UNUSED_PARAM( den ); - UNUSED_PARAM( c3_part ); - UNUSED_PARAM( c0 ); - UNUSED_PARAM( delta ); - UNUSED_PARAM( c3 ); - UNUSED_PARAM( c2_part ); - UNUSED_PARAM( c1_part ); - UNUSED_PARAM( EnvWhiteExc16k ); - UNUSED_PARAM( g2 ); - UNUSED_PARAM( c5 ); - UNUSED_PARAM( c4_part ); - UNUSED_PARAM( EnvWhiteExc16k_4k ); - UNUSED_PARAM( c2 ); - UNUSED_PARAM( g ); - UNUSED_PARAM( cbsize ); - UNUSED_PARAM( g1 ); - UNUSED_PARAM( EnvExc16kWhtnd ); - UNUSED_PARAM( c0_part ); - UNUSED_PARAM( EnvExc16kWhtnd_4k ); - UNUSED_PARAM( c4 ); -#endif - { - Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, - Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); - tmp = voiceFacEst[0]; - tmp2 = MAX_16; - move16(); - move16(); - if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } - ELSE /* decoder side */ - { - test(); - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - IF( *vf_ind == 0 ) - { - // mix_factor = 0.0f; - mix_factor = 0; - move16(); - flag_plosive = 1; - move16(); - } - ELSE - { - // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1)); - mix_factor = usdequant_fx( *vf_ind, 0, 2341 ); - } - } - ELSE - { - /* *vf_ind is an integer scale by 0.125f*/ - tmp = shl( *vf_ind, ( 15 - 3 ) ); - tmp2 = MAX_16; - move16(); - IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } - - test(); - IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) - { - voice_factors[0] = mult_r( voice_factors[0], tmp2 ); - move16(); - voice_factors[1] = mult_r( voice_factors[1], tmp2 ); - move16(); - voice_factors[2] = mult_r( voice_factors[2], tmp2 ); - move16(); - voice_factors[3] = mult_r( voice_factors[3], tmp2 ); - move16(); - voice_factors[4] = mult_r( voice_factors[4], tmp2 ); - move16(); - } - } - - test(); - IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL ) - { - /* save buffers for IC-BWE */ - // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k); - Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); // Q_bwe_exc - *nlExc16k_e = sub( 15, *Q_bwe_exc ); - move16(); - - // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k); - L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); - Word16 temp_fac = round_fx_sat( L_tmp ); // Q15-exp - - FOR( k = 0; k < L_FRAME16k; k++ ) - { - mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_White_exc16k+15-exp-15 = Q_White_exc16k-exp - move16(); - } - *mixExc16k_e = sub( 15, sub( Q_White_exc16k, exp ) ); - move16(); - } - - Copy( White_exc16k, White_exc16k_FB, L_FRAME16k ); // Q_White_exc16k - prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; - *Q_bwe_exc_fb = Q_White_exc16k; - move16(); - move16(); - - Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k - - deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx ); - /* i/o: White_exc16k (Q_White_exc16k) */ - /* i: tbe_demph_fx (Q_White_exc16k) */ - *tbe_demph = shr_sat( tbe_demph_fx, sub( Q_White_exc16k, *Q_bwe_exc ) ); - move16(); - - test(); - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - IF( !flag_plosive ) /* use only LB excitation in case of plosives */ - { - /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ - /* old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); */ - old_scale = round_fx_sat( root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ) ); // exp - old_scale = shl( old_scale, s_min( 0, exp ) ); // limit Q factor to 15 - exp = s_max( 0, exp ); - - // new_scale = 1.0f; - new_scale = shr( 32767, exp ); // exp - - // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2); - step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp - scale = old_scale; // exp - move16(); - - /* interpolate between the old and the new value of the mixing factor */ - old_fact = *prev_mix_factor; // Q15 - new_fact = mix_factor; // Q15 - move16(); - move16(); - - // step = (new_fact - old_fact) / (L_FRAME16k / 2); - step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15 - fact = old_fact; // Q15 - move16(); - - shift = add( exp, sub( *Q_bwe_exc, Q_White_exc16k ) ); - - /* mixing of LB and gaussian excitation in the first half of the frame */ - FOR( k = 0; k < L_FRAME16k / 2; k++ ) - { - /* exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k]; */ - L_tmp = L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), shift ); // Q_bwe_exc+16 - exc16kWhtnd[k] = mac_r_sat( L_tmp, sub( 32767, fact ), exc16kWhtnd[k] ); // Q_bwe_exc - move16(); - - fact = add_sat( fact, step ); // Q15 - scale = add_sat( scale, step_scale ); // exp - } - - shift = sub( *Q_bwe_exc, Q_White_exc16k ); - /* mixing of LB and gaussian excitation in the second half of the frame */ - FOR( ; k < L_FRAME16k; k++ ) - { - // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k]; - L_tmp = L_shl_sat( L_mult( new_fact, White_exc16k[k] ), shift ); // Q_bwe_exc+16 - exc16kWhtnd[k] = mac_r( L_tmp, sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_bwe_exc - move16(); - } - } - // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph); - PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc - } - ELSE - { - test(); - IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) ) - { - scale = 0; - move16(); - - test(); - IF( pow1 != 0 && pow22 != 0 ) - { - L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); - scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ - } - - FOR( k = 0; k < L_FRAME16k; k++ ) - { - exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); // Q_White_exc16k - move16(); - } - - Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc - - PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc - /* i/o: exc16kWhtnd (Q_bwe_exc) */ - /* i/o: tbe_premph (Q_bwe_exc) */ - } - ELSE - { - Word16 nbSubFr, lSubFr; - Word16 tempQ15; - Word32 tempQ31; - nbSubFr = NB_SUBFR16k; - lSubFr = ( L_FRAME16k / NB_SUBFR16k ); - move16(); - move16(); - IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) - { - nbSubFr = NB_SUBFR; - move16(); - lSubFr = ( L_FRAME16k / NB_SUBFR ); - move16(); - } - k = 0; - move16(); - FOR( i = 0; i < nbSubFr; i++ ) - { - test(); - IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) ) - { - exp = 0; - move16(); - tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ - temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - exp = 0; - move16(); - tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ - temp = sub( MAX_16, temp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - ELSE - { - /* Adjust noise mixing for formant sharpening filter */ - tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); - /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ - vf_tmp = sub( MAX_16, tempQ15 ); - vf_tmp = mult( voice_factors[i], vf_tmp ); - - exp = 0; - move16(); - tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ - temp = sub( MAX_16, vf_tmp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - - shift = sub( *Q_bwe_exc, Q_White_exc16k ); - FOR( j = 0; j < lSubFr; j++ ) - { - /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ - L_tmp = L_shl_sat( L_mult( temp2, White_exc16k[k + j] ), shift ); // 16+(Q_bwe_exc) - exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc - move16(); - } - k = add( k, lSubFr ); - - /* estimate the pre-emph factor */ - tempQ15 = sub( MAX_16, voice_factors[i] ); - exp = 0; - move16(); - temp = Sqrt16( tempQ15, &exp ); - temp = shl( temp, sub( exp, 1 ) ); - - temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ - temp = div_s( temp, temp2 ); /* Q15 */ - temp = mult_r( PREEMPH_FAC, temp ); - - PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc - /* exc16kWhtnd: Q_bwe_exc; - tbe_premph: Q_bwe_exc*/ - } - } - } - - IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) - { - syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: excSHB in Q_bwe_exc */ - } - ELSE - { - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - - syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) ); - syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) ); - move32(); - syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) ); - move32(); - syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) ); - move32(); - syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) ); - move32(); - - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: tempSHB in Q_bwe_exc */ - /* o: syn_shb_ener_sf in tmp2 */ - IF( LE_32( bitrate, MAX_ACELP_BRATE ) ) - { - L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); - - /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ - tmp = shl( Q_shb, 1 ); - L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ - - *Q_bwe_exc = sub( *Q_bwe_exc, exp ); - move16(); /* compensate for the exp shift */ - tmp2 = add( prev_Q_bwe_syn, n_mem2 ); - IF( GT_16( *Q_bwe_exc, tmp2 ) ) - { - L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); - *Q_bwe_exc = tmp2; - move16(); - } - FOR( i = 0; i < L_FRAME16k; i++ ) - { - L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ - exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ - move16(); - } - } - /* i: L_tmp2 in (Q31-exp) */ - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ - - /* Rescale the past memories: LP synth and SHB look ahead buffers */ - tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); - FOR( i = 0; i < LPC_SHB_ORDER; i++ ) - { - state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp ); - move16(); - } - FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) - { - excSHB[i] = shl_sat( excSHB[i], tmp ); - move16(); - } - /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ - - syn_filt_fx( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); - syn_filt_fx( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); - syn_filt_fx( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); - syn_filt_fx( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in (Q_bwe_exc) */ - /* o: excSHB in (Q_bwe_exc) */ - } - - IF( EQ_16( extl, FB_TBE ) ) - { - tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); - Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); - Scale_sig( fb_tbe_demph, 1, tmp ); - syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); - /* i: White_exc16k_FB in (Q_bwe_exc_fb) */ - /* o: White_exc16k_FB_temp in (Q_bwe_exc_fb) */ - - FOR( i = 0; i < 10; i++ ) - { - FOR( j = 0; j < 32; ++j ) - { - White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); - move16(); - } - } - - *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); - move16(); /**Q_bwe_exc_fb +35 +1 -16*/ - flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); - - deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); - } - ELSE - { - set16_fx( White_exc16k_FB, 0, L_FRAME16k ); - } - - *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32 - *prev_mix_factor = mix_factor; - move32(); - move16(); - - return; -} - -void GenShapedSHBExcitation_ivas_dec_fx( - Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ - const Word16 *lpc_shb, /* i : lpc coefficients Q12*/ - Word16 *White_exc16k_FB, /* o : white excitation for the Fullband extension Q_bwe_exc */ - Word32 *mem_csfilt, /* i/o: memory */ - Word16 *mem_genSHBexc_filt_down_shb, /* i/o: memory */ - Word16 *state_lpc_syn, /* i/o: memory */ - const Word16 coder_type, /* i : coding type */ - const Word16 *bwe_exc_extended, /* i : bwidth extended excitation */ - Word16 bwe_seed[], /* i/o: random number generator seed */ - Word16 voice_factors[], /* i : voicing factor*/ - const Word16 extl, /* i : extension layer */ - Word16 *tbe_demph, /* i/o: de-emphasis memory */ - Word16 *tbe_premph, /* i/o: pre-emphasis memory */ - Word16 *lpc_shb_sf, /* i: LP coefficients */ - const Word32 shb_ener_sf_32, /* i: input shb ener, Q31 */ - Word16 *shb_res_gshape, /* i: input res gain shape, Q14 */ - Word16 *shb_res, - Word16 *vf_ind, - const Word16 formant_fac, /* i : Formant sharpening factor [0..1] */ - Word16 fb_state_lpc_syn[], /* i/o: memory */ - Word16 *fb_tbe_demph, /* i/o: fb de-emphasis memory */ - Word16 *Q_bwe_exc, - Word16 *Q_bwe_exc_fb, - const Word16 Q_shb, - Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ - Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ - const Word32 bitrate, /* i : bitrate */ - const Word16 prev_bfi, /* i : previous frame was concealed */ - const Word16 element_mode, /* i : element mode */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ - Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ - const Word32 extl_brate, /* i : extension layer bitarte */ - const Word16 MSFlag, /* i : Multi Source flag */ - Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ - Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ - Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ - Word16 *Env_error, /* o : error in SHB residual envelope modelling Q0 */ - Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling Q0 */ -) -{ - Word16 i, j, k; - Word16 wht_fil_mem[LPC_WHTN_ORDER]; - Word16 lpc_whtn[LPC_WHTN_ORDER + 1]; - Word16 R_h[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech MSB */ - Word16 R_l[LPC_WHTN_ORDER + 2]; /* Autocorrelations of windowed speech LSB */ - Word16 Q_R; - Word32 LepsP[LPC_WHTN_ORDER + 1]; - Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k]; - Word32 pow1, pow22; - Word16 scale, temp1, temp2, temp3; - Word16 Q_White_exc16k; - Word16 excTmp2[L_FRAME16k]; - Word16 *White_exc16k; - Word16 excNoisyEnv[L_FRAME16k]; - Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */ - move16(); - Word16 neg_csfilt_den2[2] = { -32767, 26214 }; /* {1.0f, -0.8f} */ - move16(); - move16(); - Word16 varEnvShape; - Word16 fb_deemph_fac = 15729; /*0.48f in Q15 */ - Word16 exc16kWhtnd[L_FRAME16k]; - - Word32 L_tmp; - Word16 vf_tmp; - Word16 tmp, exp, tmp2 = 0; - move16(); - Word16 voiceFacEst[NB_SUBFR16k]; - Word16 zero_mem[LPC_SHB_ORDER]; - Word32 syn_shb_ener_sf[4]; - Word16 syn_shb_ener_sf_q[4]; - Word16 tempSHB[80]; - Word16 Q_pow1, Q_pow22; - - Word32 L_tmp2, L_tmp3, L_tmp4; - Word16 temp; - - Word16 White_exc16k_FB_temp[L_FRAME16k]; - Word32 White_exc16k_32[L_FRAME16k]; - Word16 White_exc16k_tmp[L_FRAME16k]; - Word16 Q_temp; - Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd; - Word16 chk1; - Word32 chk2; - chk1 = 0; - chk2 = 0; - move16(); - move32(); - -#if 1 // def ADD_IVAS_TBE_CODE - Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; - Word16 cbsize; - Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; - Word32 c0, c1, c2, c3, c4, c5, den; - Word16 g1, g2, g, g1_e, g2_e, g_e, den_e, shift, tmp_e, tmp1_e; - Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; - Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; - Word16 flag_plosive; - Word16 delta; - Word32 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; - Word64 W_tmp; - - mix_factor = 0; /* Q15 */ - move16(); -#endif - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); - FOR( i = 0; i < L_FRAME32k; i = i + 2 ) - { - exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc - move16(); - exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc - move16(); - } - - /* Decimate by 2 */ - Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc - /* i: exc32k in Q_bwe_exc */ - /* o: exc16k in Q_bwe_exc */ - - autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R - /* Ensure R[0] isn't zero when entering Levinson Durbin */ - R_l[0] = s_max( R_l[0], 1 ); - move16(); - FOR( i = 1; i <= LPC_WHTN_ORDER; i++ ) - { - L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); - L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R - } - E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL ); - Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12 - fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc - - /* i: exc16k in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc */ - -#if 1 // def ADD_IVAS_TBE_CODE - IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif - { - temp2 = 0; - move16(); - FOR( j = 0; j < 4; j++ ) - { - temp1 = shb_res_gshape[j]; - move16(); - FOR( i = 0; i < 80; i++ ) - { - exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc - move16(); - /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ - } - temp2 = add( temp2, 80 ); - } - } - - /* Estimate pow1 associated with Low band nonlinear extended excitation */ - /* pow1=0.00001f */ - tmp = sub( shl( *Q_bwe_exc, 1 ), 31 ); - pow1 = L_shl_sat( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(Q_bwe_exc) */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /*excTmp2[k ] = (float)(fabs(exc16kWhtnd[k]));*/ - excTmp2[k] = abs_s( exc16kWhtnd[k] ); - move16(); - chk1 = s_or( chk1, exc16kWhtnd[k] ); - - /* pow1 += exc16kWhtnd[k] * exc16kWhtnd[k]; */ - pow1 = L_mac0_sat( pow1, exc16kWhtnd[k], exc16kWhtnd[k] ); /* 2*Q_bwe_exc */ - } - Q_pow1 = shl( *Q_bwe_exc, 1 ); - - test(); -#if 1 // ADD_IVAS_TBE_CODE - IF( flag_ACELP16k == 0 ) -#else - IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) -#endif - { - /* varEnvShape = mean_fx(voice_factors, 4); */ - /* unroll the loop */ - L_tmp = L_mult( voice_factors[0], 8192 /*0.25 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[1], 8192 /*0.25 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[2], 8192 /*0.25 in Q15 */ ); - varEnvShape = mac_r( L_tmp, voice_factors[3], 8192 /*0.25 in Q15 */ ); /* varEnvShape in Q15 */ - } - ELSE /* 16k core */ - { - /* varEnvShape = mean_fx(voice_factors, 5); */ - /* unroll the loop */ - L_tmp = L_mult( voice_factors[0], 6554 /*0.2 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[1], 6554 /*0.2 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[2], 6554 /*0.2 in Q15 */ ); - L_tmp = L_mac( L_tmp, voice_factors[3], 6554 /*0.2 in Q15 */ ); - varEnvShape = mac_r( L_tmp, voice_factors[4], 6554 /*0.2 in Q15 */ ); /* varEnvShape in Q15 */ - } - - IF( EQ_16( extl, FB_TBE ) ) - { - /*pow(varEnvShape,3) */ - tmp = mult_r( varEnvShape, varEnvShape ); - tmp = mult_r( tmp, varEnvShape ); - - /* max_val((0.68f - (float)pow(varEnvShape, 3)), 0.48f); */ - fb_deemph_fac = sub( 22282 /*0.68f Q15*/, tmp ); - fb_deemph_fac = s_max( fb_deemph_fac, 15729 /*0.48f Q15*/ ); - } - - /*varEnvShape = 1.09875f - 0.49875f * varEnvShape; */ - varEnvShape = msu_r( 1179773824l /*0.549375f Q31*/, 8172 /*0.249375f Q15*/, varEnvShape ); - - /*varEnvShape = min( max_val(varEnvShape, 0.6f), 0.999f); */ - varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ ); - varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ ); - varEnvShape = shl( varEnvShape, 1 ); - csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15 - move16(); - neg_csfilt_den2[1] = varEnvShape; // Q15 - move16(); - - test(); - test(); - test(); -#if 1 // def ADD_IVAS_TBE_CODE - test(); - IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#else - IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#endif - { - /* pre-init smoothing filter to avoid energy drop outs */ - L_tmp = L_mult( excTmp2[0], 1638 ); - FOR( i = 1; i < L_SUBFR16k / 4; i++ ) - { - L_tmp = L_mac( L_tmp, excTmp2[i], 1638 ); /*1638 = 1/20 in Q15*/ - } - /*L_tmp = sum(excTmp2, L_SUBFR16k/4)*(1/20) where L_SUBFR16k/4 =20 */ - - /* don't apply for FB in case the FB start-frame was potentially lost - White_exc16k is very sensitive to enery mismatch between enc - dec */ - /* rather stick to the more conservative approach, to avoid potential clippings */ - test(); - IF( !( prev_bfi && EQ_16( extl, FB_TBE ) ) ) - { - /* use weak smoothing for 1st frame after switching to make filter recover more quickly */ - varEnvShape = 26214 /*0.8f Q15*/; - move16(); - csfilt_num2[0] = sub( MAX_16, varEnvShape ); - move16(); - neg_csfilt_den2[1] = varEnvShape; - move16(); - } - - *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); - move32(); - } -#if 1 // def ADD_IVAS_TBE_CODE - IF( MSFlag > 0 ) - { - // varEnvShape = 0.995f; - varEnvShape = 32604; - move16(); - csfilt_num2[0] = 32768 - varEnvShape; - // csfilt_num2[0] = sub( 32767, varEnvShape ); - move16(); - neg_csfilt_den2[1] = varEnvShape; - move16(); - } - - White_exc16k = exc16k; - move16(); - Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); - IF( *mem_csfilt ) - { - Q_excTmp2 = s_min( Q_excTmp2, sub( add( norm_l( *mem_csfilt ), *Q_bwe_exc ), 1 ) ); - } - test(); - /* Track the low band envelope */ - IF( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) - { - test(); - IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) - { - mem_csfilt_left = 0; - mem_csfilt_right = 0; - move16(); - move16(); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - // excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; - excNoisyEnvLeft[k] = add( mem_csfilt_left, mult_r( csfilt_num2[0], shl( excTmp2[k], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 - move16(); - // mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; - mem_csfilt_left = mult_r( neg_csfilt_den2[1], excNoisyEnvLeft[k] ); // Q_excTmp2 - // excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; - excNoisyEnvRight[L_FRAME16k - k - 1] = add( mem_csfilt_right, mult_r( csfilt_num2[0], shl( excTmp2[L_FRAME16k - k - 1], sub( Q_excTmp2, *Q_bwe_exc ) ) ) ); // Q_excTmp2 - move16(); - // mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; - mem_csfilt_right = mult_r( neg_csfilt_den2[1], excNoisyEnvRight[L_FRAME16k - k - 1] ); // Q_excTmp2 - } - - alpha = 0; - move16(); - // step = 1.0f / L_FRAME16k; - step = 102; // Q15 - move16(); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - // excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + (1 - alpha) * excNoisyEnvRight[k]; - excNoisyEnv[k] = add( mult_r( alpha, excNoisyEnvLeft[k] ), mult_r( sub( 32767, alpha ), excNoisyEnvRight[k] ) ); // Q_excTmp2 - move16(); - alpha = add( alpha, step ); - } - } - } - ELSE -#endif - { - /* Track the low band envelope */ - L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) ); - move32(); - FOR( i = 0; i < L_FRAME16k; i++ ) - { - excNoisyEnv[i] = mac_r( L_tmp, csfilt_num2[0], shl( excTmp2[i], sub( Q_excTmp2, *Q_bwe_exc ) ) ); - move16(); - /* Work-around to avoid 0s for very small value*/ - test(); - test(); - test(); - test(); - if ( excNoisyEnv[i] == 0 && ( L_tmp != 0 || ( csfilt_num2[0] != 0 && excTmp2[i] != 0 ) ) ) - { - excNoisyEnv[i] = 1; - move16(); - } - /* excNoisyEnv : Q_excTmp2, - *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */ - L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */ - } - *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) ); - move32(); - } -#if 1 // def ADD_IVAS_TBE_CODE - test(); - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - /* generate gaussian (white) excitation */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k[k] = own_random( &bwe_seed[0] ); - move16(); - } - - /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ - Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49; - move32(); - move32(); - pow22 = POW_EXC16k_WHTND_FX; - Q_pow22 = -6; - move16(); - // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k); - Word16 pow1_exp = sub( Q31, Q_pow1 ); - Word32 temp_pow = Sqrt32( pow1, &pow1_exp ); - temp_pow = Mpy_32_32( temp_pow, pow22_inv ); - /*Word16 out_exp; - Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp); - temp_pow1 = L_shl(temp_pow1, out_exp);*/ - // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k); - L_tmp = 0; - move32(); - shift = getScaleFactor16( White_exc16k, L_FRAME16k ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); - move32(); - White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], shift ) ); // Q_White_exc16k - move16(); - L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); - } - Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) ); - Q_temp = norm_l( L_tmp ); - IF( L_tmp == 0 ) - { - Q_temp = 31; - move16(); - } - } - ELSE -#endif - { - /* create a random excitation - Reuse exc16k memory */ - White_exc16k = exc16k; - move16(); - create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5 - create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5 - - L_tmp = L_deposit_l( 0 ); - tmp = add( *Q_bwe_exc, 1 ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - L_tmp4 = L_mult( excNoisyEnv[k], White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/ - White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/ - move32(); - L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); - } - Q_temp = norm_l( L_tmp ); - IF( L_tmp == 0 ) - { - Q_temp = 31; - move16(); - } - /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/ - /* White_exc16k in Q6 */ - - /* calculate pow22 */ - /* pow22=0.00001f */ - tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 ); - Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */ - Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - - White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10 - chk2 = L_or( chk2, White_exc16k_32[k] ); - /* i: excNoisyEnv in (Q_excTmp2) */ - /* i: White_exc16k in Q6 */ - /* o: White_exc16k in (Q_White_exc16k) */ - /* pow22 += White_exc16k[k] * White_exc16k[k]; */ - sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/ - move16(); - } - Q_pow22 = W_norm( sum ); - pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32 - Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 ); - Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) ); - } - -#if 1 // def ADD_IVAS_TBE_CODE - flag_plosive = 0; - move16(); - test(); - test(); - test(); - IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif - { - IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ - { -#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! - test(); - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) ); - move16(); - } - - /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ - find_td_envelope_fx( White_exc16k_tmp, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); /* Q_bwe_exc */ - find_td_envelope_fx( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); /* Q_bwe_exc */ - - FOR( k = 0; k < L_FRAME4k; k++ ) - { - EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; /* Q_bwe_exc */ - move16(); - EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; /* Q_bwe_exc */ - move16(); - } - - /* calculate the optimal mix factor */ - c0 = c1 = c2 = c3 = c4 = c5 = 0; /* Q0 */ - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - - temp1 = add( shl( *Q_bwe_exc, 1 ), 1 ); - temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 ); - temp3 = add( shl( Q_shb, 1 ), 1 ); - FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c0_part[i] = L_shr( sum2_fx( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ - move32(); - // c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c1_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ - move32(); - // c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c2_part[i] = L_shr( sum2_fx( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp1 ); /* Q0 */ - move32(); - // c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c3_part[i] = L_shr( L_negate( Dot_product( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ) ), sub( temp2, 1 ) ); /* Q0 */ - move32(); - // c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c4_part[i] = L_shr( Dot_product( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), sub( temp1, 1 ) ); /* Q0 */ - move32(); - // c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c5_part[i] = L_shr( sum2_fx( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ), temp3 ); /* Q0 */ - move32(); - - c0 = L_add( c0, c0_part[i] ); - c1 = L_add( c1, c1_part[i] ); - c2 = L_add( c2, c2_part[i] ); - c3 = L_add( c3, c3_part[i] ); - c4 = L_add( c4, c4_part[i] ); - c5 = L_add( c5, c5_part[i] ); - } - - // den = 4.0f * c0 * c2 - c4 * c4; - W_tmp = W_sub( W_shl( W_mult0_32_32( c0, c2 ), 2 ), W_mult0_32_32( c4, c4 ) ); - den_e = 63; - move16(); - shift = W_norm( W_tmp ); - den = W_extract_h( W_shl( W_tmp, shift ) ); - den_e = sub( den_e, shift ); - - IF( den == 0 ) - { - den = 1; - move32(); - den_e = 31; - move16(); - } - - // g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; - W_tmp = W_sub( W_mult0_32_32( c3, c4 ), W_shl( W_mult0_32_32( c1, c2 ), 1 ) ); - g1_e = 63; - move16(); - shift = W_norm( W_tmp ); - L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); - g1_e = sub( g1_e, shift ); - - g1 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); - g1_e = sub( add( tmp_e, g1_e ), den_e ); - - // g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; - W_tmp = W_sub( W_mult0_32_32( c1, c4 ), W_shl( W_mult0_32_32( c0, c3 ), 1 ) ); - g2_e = 63; - move16(); - shift = W_norm( W_tmp ); - L_tmp = W_extract_h( W_shl( W_tmp, shift ) ); - g2_e = sub( g2_e, shift ); - - g2 = BASOP_Util_Divide3232_Scale( L_tmp, den, &tmp_e ); - g2_e = sub( add( tmp_e, g2_e ), den_e ); - - // *Env_error = 0.0f; - *Env_error = 0; - move16(); - flag_plosive = 0; - move16(); - FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - // Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; - L_tmp = BASOP_Util_Add_Mant32Exp( c5_part[i], 31, Mpy_32_32( L_mult( g1, g1 ), c0_part[i] ), add( shl( g1_e, 1 ), 31 ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c1_part[i], g1 ), add( 31, g1_e ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g2, g2 ), c2_part[i] ), add( shl( g2_e, 1 ), 31 ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_16_1( c3_part[i], g2 ), add( 31, g2_e ), &tmp_e ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, tmp_e, Mpy_32_32( L_mult( g1, g2 ), c4_part[i] ), add( add( g1_e, g2_e ), 31 ), &tmp_e ); - - // Env_error_part[i] = L_shr( L_tmp, 31 - tmp_e ); // Check Exponent - Env_error_part[i] = extract_h( L_shr_sat( L_tmp, sub( Q15, tmp_e ) ) ); /* Q0 */ - move16(); - - // *Env_error += Env_error_part[i]; - *Env_error = add_sat( *Env_error, Env_error_part[i] ); /* Q0 */ - move16(); - - if ( GT_16( Env_error_part[i], THR_ENV_ERROR_PLOSIVE_FX ) ) // Check which Q - { - /* envelope error is too high -> likely a plosive */ - flag_plosive = 1; - move16(); - } - } - - IF( flag_plosive ) - { - /* plosive detected -> set the mixing factor to 0 */ - *vf_ind = 0; - move16(); - mix_factor = 0; - move16(); - } - ELSE - { - /* normalize gain */ - // g = g2 / ( g1 + g2 ); - tmp1_e = BASOP_Util_Add_MantExp( g1, g1_e, g2, g2_e, &tmp ); - IF( tmp == 0 ) - { - tmp = 1; - move16(); - tmp1_e = 15; - move16(); - } - g = BASOP_Util_Divide1616_Scale( g2, tmp, &tmp_e ); - g_e = sub( add( tmp_e, g2_e ), tmp1_e ); - - /* quantization of the mixing factor */ - cbsize = 1 << NUM_BITS_SHB_VF; - move16(); - // delta = 1.0f / ( cbsize - 1 ); - delta = 2341; /* Q14 */ - move16(); - // if ( g > 1.0f ) - IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), ONE_IN_Q31, 0 ) > 0 ) - { - // g = 1.0f; - g = MAX16B; /* Q15 */ - } - // else if ( g < shl( delta, ( 15 - g_e ) - 14 ) ) - ELSE IF( BASOP_Util_Cmp_Mant32Exp( g, add( 16, g_e ), delta, 17 ) < 0 ) - { - /* prevent low gains to be quantized to 0 as this is reserved for plosives */ - // g = delta; - g = shl( delta, 1 ); /* Q15 */ - } - - *vf_ind = usquant_fx( g, &mix_factor, 0, delta, cbsize ); - move16(); - } - } - ELSE -#else - UNUSED_PARAM( Env_error_part ); - UNUSED_PARAM( Env_error ); - UNUSED_PARAM( EnvSHBres_4k ); - UNUSED_PARAM( c5_part ); - UNUSED_PARAM( c1 ); - UNUSED_PARAM( den ); - UNUSED_PARAM( c3_part ); - UNUSED_PARAM( c0 ); - UNUSED_PARAM( delta ); - UNUSED_PARAM( c3 ); - UNUSED_PARAM( c2_part ); - UNUSED_PARAM( c1_part ); - UNUSED_PARAM( EnvWhiteExc16k ); - UNUSED_PARAM( g2 ); - UNUSED_PARAM( c5 ); - UNUSED_PARAM( c4_part ); - UNUSED_PARAM( EnvWhiteExc16k_4k ); - UNUSED_PARAM( c2 ); - UNUSED_PARAM( g ); - UNUSED_PARAM( cbsize ); - UNUSED_PARAM( g1 ); - UNUSED_PARAM( EnvExc16kWhtnd ); - UNUSED_PARAM( c0_part ); - UNUSED_PARAM( EnvExc16kWhtnd_4k ); - UNUSED_PARAM( c4 ); -#endif - { - Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, - ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); - tmp = voiceFacEst[0]; - tmp2 = MAX_16; - move16(); - move16(); - if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } - ELSE /* decoder side */ - { - test(); -#if 1 // def ADD_IVAS_TBE_CODE - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - IF( *vf_ind == 0 ) - { - // mix_factor = 0.0f; - mix_factor = 0; - move16(); - flag_plosive = 1; - move16(); - } - ELSE - { - // mix_factor = usdequant(*vf_ind, 0.0f, 1.0f / ((1 << NUM_BITS_SHB_VF) - 1)); - mix_factor = usdequant_fx( *vf_ind, 0, 2341 ); - } - } - ELSE -#endif - { - /* *vf_ind is an integer scale by 0.125f*/ - tmp = shl( *vf_ind, ( 15 - 3 ) ); - tmp2 = MAX_16; - move16(); - IF( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } -#if 1 // def ADD_IVAS_TBE_CODE - test(); - IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) -#endif - { - voice_factors[0] = mult_r( voice_factors[0], tmp2 ); - move16(); - voice_factors[1] = mult_r( voice_factors[1], tmp2 ); - move16(); - voice_factors[2] = mult_r( voice_factors[2], tmp2 ); - move16(); - voice_factors[3] = mult_r( voice_factors[3], tmp2 ); - move16(); - voice_factors[4] = mult_r( voice_factors[4], tmp2 ); - move16(); - } - } - test(); - IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL ) - { - /* save buffers for IC-BWE */ - // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k); - Copy( exc16kWhtnd, nlExc16k, L_FRAME16k ); - // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k); - /*Word16 temp_fac = divide3232(L_shr(pow1, Q_pow1), pow22); - Word16 temp_fac_exp = 0; - temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/ - L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); - Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15 - shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ); - // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - mixExc16k[k] = mult_r( shl_sat( White_exc16k[k], shift ), temp_fac ); - move16(); - } - } - - tmp = sub( Q_temp, 3 ); - FOR( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k_FB[k] = White_exc16k[k]; /* Q_White_exc16k */ - } - prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; - move16(); - *Q_bwe_exc_fb = Q_White_exc16k; - move16(); - *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) ); - deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); - *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); - - Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k ); - Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc ); - - shift = getScaleFactor16( White_exc16k, L_FRAME16k ); - - shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) ); - scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) ); - scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) ); - - Q_exc16kWhtnd = Q_White_exc16k = shift; - move16(); - move16(); - *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) ); - move16(); - test(); - IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) - { - IF( !flag_plosive ) /* use only LB excitation in case of plosives */ - { - /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ - // old_scale = (float)sqrt(*prev_pow_exc16kWhtnd / pow1); - // old_scale = divide3232(*prev_pow_exc16kWhtnd, pow1); // exp = Q15 - (Q_pow1) - // Word16 old_scale_exp = Q15 - (Q_pow1); - // old_scale = Sqrt16(old_scale, &old_scale_exp); - // old_scale = shl(old_scale, old_scale_exp); //Q15 - L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp ); - old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15 - // new_scale = 1.0f; - new_scale = 32767; - move16(); - // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2); - step_scale = mult_r( sub( new_scale, old_scale ), 205 ); - scale = old_scale; - move16(); - /* interpolate between the old and the new value of the mixing factor */ - old_fact = *prev_mix_factor; - move16(); - new_fact = mix_factor; - move16(); - // step = (new_fact - old_fact) / (L_FRAME16k / 2); - step = mult_r( sub( new_fact, old_fact ), 205 ); - fact = old_fact; - move16(); - /* mixing of LB and gaussian excitation in the first half of the frame */ - FOR( k = 0; k < L_FRAME16k / 2; k++ ) - { - exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ), - sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd - move16(); - fact = add_sat( fact, step ); - scale = add_sat( scale, step_scale ); - } - - /* mixing of LB and gaussian excitation in the second half of the frame */ - FOR( ; k < L_FRAME16k; k++ ) - { - exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ), - sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd - move16(); - } - } - // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph); - PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - } - ELSE - { - test(); - IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) ) - { - L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); - test(); - if ( chk1 == 0 && chk2 == 0 ) - { - L_tmp = 0; - move32(); - } - scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale ); - move16(); - } - PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - /* i/o: exc16kWhtnd (Q_exc16kWhtnd) */ - /* i/o: tbe_premph (Q_exc16kWhtnd) */ - } - ELSE - { - Word16 nbSubFr, lSubFr; - Word16 tempQ15; - Word32 tempQ31; - nbSubFr = NB_SUBFR16k; - lSubFr = ( L_FRAME16k / NB_SUBFR16k ); - move16(); - move16(); - IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) - { - nbSubFr = NB_SUBFR; - move16(); - lSubFr = ( L_FRAME16k / NB_SUBFR ); - move16(); - } - k = 0; - move16(); - FOR( i = 0; i < nbSubFr; i++ ) - { - test(); - IF( EQ_16( coder_type, VOICED ) && ( LT_32( extl_brate, SWB_TBE_2k8 ) ) ) - { - exp = 0; - move16(); - tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ - temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - exp = 0; - move16(); - tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ - temp = sub( MAX_16, temp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - ELSE - { - /* Adjust noise mixing for formant sharpening filter */ - tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); - /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ - vf_tmp = sub( MAX_16, tempQ15 ); - vf_tmp = mult( voice_factors[i], vf_tmp ); - - exp = 0; - move16(); - tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ - temp = sub( MAX_16, vf_tmp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - - FOR( j = 0; j < lSubFr; j++ ) - { - /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ - L_tmp = L_mult( temp2, White_exc16k[k + j] ); - exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); - move16(); - /* Q_exc16kWhtnd */ - } - k = add( k, lSubFr ); - - /* estimate the pre-emph factor */ - tempQ15 = sub( MAX_16, voice_factors[i] ); - exp = 0; - move16(); - temp = Sqrt16( tempQ15, &exp ); - temp = shl( temp, sub( exp, 1 ) ); - - temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ - temp = div_s( temp, temp2 ); /* Q15 */ - temp = mult_r( PREEMPH_FAC, temp ); - PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); - /* exc16kWhtnd: Q_exc16kWhtnd; - tbe_premph: Q_exc16kWhtnd*/ - } - } - } - *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); - move16(); - Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) ); - Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); - - IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) - { - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: excSHB in Q_bwe_exc */ - } - ELSE - { - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[0] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[1] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[2] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); - tmp = sub( getScaleFactor16( tempSHB, 80 ), 2 ); - Scale_sig( tempSHB, 80, tmp ); - syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); - syn_shb_ener_sf_q[3] = add( shl( add( *Q_bwe_exc, tmp ), 1 ), 1 ); - move16(); - - tmp2 = s_min( s_min( syn_shb_ener_sf_q[0], syn_shb_ener_sf_q[1] ), s_min( syn_shb_ener_sf_q[3], syn_shb_ener_sf_q[2] ) ); - syn_shb_ener_sf[0] = L_shl( syn_shb_ener_sf[0], sub( tmp2, syn_shb_ener_sf_q[0] ) ); - move32(); - syn_shb_ener_sf[1] = L_shl( syn_shb_ener_sf[1], sub( tmp2, syn_shb_ener_sf_q[1] ) ); - move32(); - syn_shb_ener_sf[2] = L_shl( syn_shb_ener_sf[2], sub( tmp2, syn_shb_ener_sf_q[2] ) ); - move32(); - syn_shb_ener_sf[3] = L_shl( syn_shb_ener_sf[3], sub( tmp2, syn_shb_ener_sf_q[3] ) ); - move32(); - - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: tempSHB in Q_bwe_exc */ - /* o: syn_shb_ener_sf in tmp2 */ - IF( LE_32( bitrate, MAX_ACELP_BRATE ) ) - { - L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); - - /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ - tmp = shl( Q_shb, 1 ); - L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ - - *Q_bwe_exc = sub( *Q_bwe_exc, exp ); - move16(); /* compensate for the exp shift */ - tmp2 = add( prev_Q_bwe_syn, n_mem2 ); - IF( GT_16( *Q_bwe_exc, tmp2 ) ) - { - L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); - *Q_bwe_exc = tmp2; - move16(); - } - FOR( i = 0; i < L_FRAME16k; i++ ) - { - L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ - exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ - move16(); - } - } - /* i: L_tmp2 in (Q31-exp) */ - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ - - /* Rescale the past memories: LP synth and SHB look ahead buffers */ - tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); - FOR( i = 0; i < LPC_SHB_ORDER; i++ ) - { - state_lpc_syn[i] = shl_sat( state_lpc_syn[i], tmp ); - move16(); - } - FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) - { - excSHB[i] = shl_sat( excSHB[i], tmp ); - move16(); - } - /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ - - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in (Q_bwe_exc) */ - /* o: excSHB in (Q_bwe_exc) */ - } - - IF( EQ_16( extl, FB_TBE ) ) - { - tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); - Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); - Scale_sig( fb_tbe_demph, 1, tmp ); - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); - /* i: White_exc16k_FB in (14-n2) */ - /* o: White_exc16k_FB_temp in (14-n2) */ - - FOR( i = 0; i < 10; i++ ) - { - FOR( j = 0; j < 32; ++j ) - { - White_exc16k_FB_temp[i * 32 + j] = mult_r_sat( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); - move16(); - } - } - - *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); - move16(); /**Q_bwe_exc_fb +35 +1 -16*/ - flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); - - deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); - } - ELSE - { - set16_fx( White_exc16k_FB, 0, L_FRAME16k ); - } - -#if 1 // def ADD_IVAS_TBE_CODE - *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32 - *prev_mix_factor = mix_factor; -#endif - return; -} - -/*====================================================================================*/ -/* FUNCTION : void GenSHBSynth_fx() */ -/*------------------------------------------------------------------------------------*/ -/* PURPOSE :Generate 32 KHz sampled highband component from synthesized highband*/ -/*------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS */ -/* _(Word16*)input_synspeech :input synthesized speech */ -/* _(Word16) L_frame :ACELP frame length */ -/*------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _(Word16*)shb_syn_speech_32k : output highband component */ -/*------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _(Word16[]) allpass_mem : memory */ -/* _(Word32[]) Hilbert_Mem : memory */ -/*------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*------------------------------------------------------------------------------------*/ - -void GenSHBSynth_fx( - const Word16 *input_synspeech, /* i : input synthesized speech */ - Word16 *shb_syn_speech_32k, /* o : output highband component */ - Word32 Hilbert_Mem[], /* i/o: memory */ - Word16 allpass_mem[], /* i/o: memory */ - const Word16 L_frame, /* i : ACELP frame length */ - Word16 *syn_dm_phase ) -{ - Word16 i, speech_buf_32k[L_FRAME32k]; - Word16 maxm, nor, nor32, shift; - Word16 input_synspeech_temp[L_FRAME16k]; - Word32 maxm32; - - - maxm = 0; - move16(); - maxm32 = L_deposit_l( 0 ); - FOR( i = 0; i < L_FRAME16k; i++ ) - maxm = s_max( maxm, abs_s( input_synspeech[i] ) ); - FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) - maxm = s_max( maxm, abs_s( allpass_mem[i] ) ); - FOR( i = 0; i < HILBERT_MEM_SIZE; i++ ) - maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) ); - nor = sub( norm_s( maxm ), 3 ); - nor32 = sub( norm_l( maxm32 ), 3 ); - if ( maxm == 0 ) - { - nor = 15; - move16(); - } - if ( maxm32 == 0 ) - { - nor32 = 31; - move16(); - } - shift = s_min( nor, nor32 ); - - Copy_Scale_sig( input_synspeech, input_synspeech_temp, L_FRAME16k, shift ); - Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, shift ); - Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift ); - Interpolate_allpass_steep_fx( input_synspeech_temp, allpass_mem, L_FRAME16k, speech_buf_32k ); - /*modify_Fs_fx( input_synspeech, L_FRAME16k, 16000, speech_buf_32k, 32000, allpass_mem, 0);*/ - IF( EQ_16( L_frame, L_FRAME ) ) - { - /* 12.8 k core flipping and downmixing */ - flip_and_downmix_generic_fx( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, - Hilbert_Mem, - Hilbert_Mem + HILBERT_ORDER1, - Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), - syn_dm_phase ); - } - ELSE - { - /* 16 k core flipping and no downmixing */ - FOR( i = 0; i < L_FRAME32k; i = i + 2 ) - { - shb_syn_speech_32k[i] = negate( speech_buf_32k[i] ); - move16(); - shb_syn_speech_32k[i + 1] = speech_buf_32k[i + 1]; - move16(); - } - } - - Scale_sig( shb_syn_speech_32k, L_FRAME32k, negate( shift ) ); - Scale_sig( allpass_mem, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) ); - Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) ); - - return; -} - - -/* IVAS 32-bit variant */ -void GenSHBSynth_fx32( - const Word32 *input_synspeech, /* i : input synthesized speech Qx*/ - Word32 *shb_syn_speech_32k, /* o : output highband component Qx*/ - Word32 Hilbert_Mem[], /* i/o: memory Qx*/ - Word32 state_lsyn_filt_shb_local[], /* i/o: memory Qx*/ - const Word16 L_frame, /* i : ACELP frame length */ - Word16 *syn_dm_phase ) -{ - Word32 speech_buf_32k[L_FRAME32k]; - Word16 i; - - Word16 shift = 0; - Word32 maxm32, input_synspeech_temp[L_FRAME16k]; - move16(); - - /* find the maximum value and derive the shift to improve precision of the Hilber filter */ - maxm32 = L_deposit_l( 0 ); - FOR( i = 0; i < L_FRAME16k; i++ ) - { - maxm32 = L_max( maxm32, L_abs( input_synspeech[i] ) ); - } - - FOR( i = 0; i < 2 * ALLPASSSECTIONS_STEEP; i++ ) - { - maxm32 = L_max( maxm32, L_abs( state_lsyn_filt_shb_local[i] ) ); - } - - FOR( i = 0; i < HILBERT_MEM_SIZE; i++ ) - { - maxm32 = L_max( maxm32, L_abs( Hilbert_Mem[i] ) ); - } - - IF( maxm32 != 0 ) - { - shift = sub( norm_l( maxm32 ), 3 ); - - Copy_Scale_sig32( input_synspeech, input_synspeech_temp, L_FRAME16k, shift ); - Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, shift ); - Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, shift ); - } - ELSE - { - Copy32( input_synspeech, input_synspeech_temp, L_FRAME16k ); - } - - Interpolate_allpass_steep_fx32( input_synspeech_temp, state_lsyn_filt_shb_local, L_FRAME16k, speech_buf_32k ); - - IF( EQ_16( L_frame, L_FRAME ) ) - { - flip_and_downmix_generic_fx32( speech_buf_32k, shb_syn_speech_32k, L_FRAME32k, Hilbert_Mem, Hilbert_Mem + HILBERT_ORDER1, Hilbert_Mem + ( HILBERT_ORDER1 + 2 * HILBERT_ORDER2 ), syn_dm_phase ); - } - ELSE - { - FOR( i = 0; i < L_FRAME32k; i++ ) - { - // shb_syn_speech_32k[i] = ( ( i % 2 ) == 0 ) ? ( -speech_buf_32k[i] ) : ( speech_buf_32k[i] ); - IF( i % 2 == 0 ) - { - shb_syn_speech_32k[i] = L_negate( speech_buf_32k[i] ); // Qx - } - ELSE - { - shb_syn_speech_32k[i] = speech_buf_32k[i]; // Qx - } - move32(); - } - } - - IF( maxm32 != 0 ) - { - Scale_sig32( shb_syn_speech_32k, L_FRAME32k, negate( shift ) ); - Scale_sig32( state_lsyn_filt_shb_local, 2 * ALLPASSSECTIONS_STEEP, negate( shift ) ); - Scale_sig32( Hilbert_Mem, HILBERT_MEM_SIZE, negate( shift ) ); - } - - return; -} - - -/*==============================================================================*/ -/* FUNCTION : void ScaleShapedSHB_fx() */ -/*------------------------------------------------------------------------------*/ -/* PURPOSE : */ -/*------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _(Word16) length : SHB overlap length */ -/* _(Word16*) subgain : subframe gain Q15 */ -/* _(Word32) frame_gain : frame gain Q18 */ -/* _(Word16*) win : window Q15 */ -/* _(Word16*) subwin : subframes window Q15 */ -/* _(Word16) Q_bwe_exc : Q format */ -/*------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _(Word16) Qx : Q factor of output */ -/*------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _(Word16*) synSHB : synthesized shb signal input Q_bwe_exc / output Qx */ -/* _(Word16*) overlap : buffer for overlap-add Q_bwe_exc /output Qx */ -/*------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*------------------------------------------------------------------------------*/ -/* CALLED FROM : RX */ -/*==============================================================================*/ - -void ScaleShapedSHB_fx( - const Word16 length, /* i : SHB overlap length */ - Word16 *synSHB, /* i/o : synthesized shb signal Q(Q_bwe_exc)/Q(Qx) */ - Word16 *overlap, /* i/o : buffer for overlap-add Q(Q_bwe_exc)/Q(Qx) */ - const Word16 *subgain, /* i : subframe gain Q15 */ - const Word32 frame_gain, /* i : frame gain Q18 */ - const Word16 *win, /* i : window Q15 */ - const Word16 *subwin, /* i : subframes window Q15 */ - Word16 *Q_bwe_exc, - Word16 *Qx, /* o : newly computed Q factor for synSHB */ - Word16 n_mem3, - Word16 prev_Q_bwe_syn2 ) -{ - const Word16 *skip; - Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp; - Word16 join_length, num_join; - Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD]; - Word16 sum_gain; - Word32 L_tmp; - Word16 tmpQ15; - Word16 Q_gFr_norm, gain_frame_Q16; - Word32 L_tmp2; - Word16 temp1, temp2; - - /* Init */ - set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD ); - - /* apply gain for each subframe, and store noise output signal using overlap-add */ - IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) - { - /* WB Gain shape and gain frame application with overlap */ - skip = skip_bands_WB_TBE; - l_frame = L_FRAME16k / 4; - move16(); - l_shb_lahead = L_SHB_LAHEAD / 4; - move16(); - - sum_gain = 0; - move16(); - FOR( k = 0; k < length / 2; k++ ) - { - sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */ - mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); /* Q_bwe_exc + 16 */ - move32(); - mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); /* Q_bwe_exc + 16 */ - move32(); - } - FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) - { - FOR( k = 0; k < length; k++ ) - { - /* one bit headroom here, otherwise messes up the gain shape application */ - /* keep it as L_mult0 */ - L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */ - sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */ - mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 ); /* Q_bwe_exc + 16 */ - move32(); - } - } - FOR( k = 0; k < length / 2; k++ ) - { - sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */ - mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] ); /* Q_bwe_exc + 16 */ - move32(); - } - } - ELSE - { - /* SWB Gain shape and gain frame application with overlap */ - l_frame = L_FRAME16k; - move16(); - l_shb_lahead = L_SHB_LAHEAD; - move16(); - skip = skip_bands_SWB_TBE; - - num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; - move16(); - join_length = i_mult2( num_join, length ); - j = 0; - move16(); - FOR( k = 0; k < length; k++ ) - { - sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */ - mod_syn[j] = L_mult( synSHB[j], sum_gain ); - move32(); /* Q_bwe_exc + 16 */ - j = add( j, 1 ); - } - - FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) - { - FOR( k = 0; k < join_length - length; k++ ) - { - mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] ); - move32(); /* Q_bwe_exc + 16 */ - j = add( j, 1 ); - } - - FOR( k = 0; k < length; k++ ) - { - /* one bit headroom here, otherwise messes up the gain shape application */ - /* keep it as L_mult0 */ - L_tmp = L_mult0( subwin[k + 1], subgain[( i + 1 ) * num_join] ); /* Q30 */ - sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */ - mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 ); - move32(); /* Q_bwe_exc + 16 */ - j = add( j, 1 ); - } - } - FOR( k = 0; k < join_length - length; k++ ) - { - mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); - move32(); /* Q_bwe_exc + 16 */ - j = add( j, 1 ); - } - FOR( k = 0; k < length; k++ ) - { - sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */ - mod_syn[j] = L_mult( synSHB[j], sum_gain ); - move32(); /* Q_bwe_exc + 16 */ - j = add( j, 1 ); - } - } - - - Q_gFr_norm = norm_l( frame_gain ); - if ( frame_gain == 0 ) - { - Q_gFr_norm = 31; - move16(); - } - Q_gFr_norm = sub( Q_gFr_norm, 1 ); /* give some headroom */ - - gain_frame_Q16 = round_fx( L_shl( frame_gain, Q_gFr_norm ) ); /* Q = 18 + Q_gFr_norm - 16 - = (Q_gFr_norm + 2) */ - - *Q_bwe_exc = add( *Q_bwe_exc, Q_gFr_norm ); /* compensate for the exp shift */ - move16(); - *Q_bwe_exc = sub( *Q_bwe_exc, 13 ); /* Keep Q-fac at => (Q_bwe_exc + Q_gFr_norm - 13) */ - move16(); - - /* check for headroom of previous buff memories: overlap, Hilbert, and interp all-pass mem */ - tmpQ15 = add( prev_Q_bwe_syn2, n_mem3 ); - if ( GT_16( *Q_bwe_exc, tmpQ15 ) ) - { - *Q_bwe_exc = tmpQ15; - move16(); - } - - *Qx = *Q_bwe_exc; - move16(); - /* rescale the overlap memory */ - FOR( i = 0; i < L_SHB_LAHEAD; i++ ) - { - temp2 = 1; - move16(); - if ( overlap[i] < 0 ) - { - temp2 = -1; - move16(); - } - temp1 = abs_s( overlap[i] ); - temp1 = shl( temp1, sub( *Q_bwe_exc, prev_Q_bwe_syn2 ) ); - overlap[i] = i_mult( temp1, temp2 ); - move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */ - } - - FOR( i = 0; i < l_shb_lahead; i++ ) - { - L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */ - L_tmp2 = Mpy_32_16_1( L_tmp, win[i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */ - synSHB[i] = mac_r( L_tmp2, overlap[i], MAX_16 ); - move16(); /* Q_bwe_exc + Q_gFr_norm - 13 */ - synSHB[i + l_shb_lahead] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ - move16(); - } - - FOR( ; i < l_frame; i++ ) - { - L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */ - synSHB[i] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ - move16(); - } - - l_frame_tmp = add( l_frame, l_shb_lahead ); - FOR( ; i < l_frame_tmp; i++ ) - { - L_tmp = Mpy_32_16_1( mod_syn[i], gain_frame_Q16 ); /* Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15 */ - L_tmp = Mpy_32_16_1( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ); /* (Q_bwe_exc + 16 + Q_gFr_norm + 2 - 15) + 15 + (1-16) */ - overlap[i - l_frame] = round_fx( L_tmp ); /* Q_bwe_exc + Q_gFr_norm - 13 */ - move16(); - } - - return; -} - - -/* IVAS 32-bit variant */ -void ScaleShapedSHB_fx32( - const Word16 length, /* i : SHB overlap length */ - Word32 *synSHB_fx, /* i/o: synthesized shb signal Q_inp/Q_new */ - Word32 *overlap_fx, /* i/o: buffer for overlap-add Q_inp/Q_new */ - const Word16 *subgain_fx, /* i : subframe gain Q15 */ - const Word32 frame_gain_fx, /* i : frame gain Q18*/ - const Word16 *win_fx, /* i : window Q15 */ - const Word16 *subwin_fx, /* i : subframes window Q15 */ - Word16 *Q_inp, - Word16 *Q_new ) -{ - const Word16 *skip; - Word16 i, j, k, l_shb_lahead, l_frame; - Word16 join_length, num_join; - Word32 mod_syn_fx[L_FRAME16k + L_SHB_LAHEAD], L_tmp; - Word16 sum_gain_fx; - - /* initilaization */ - l_frame = L_FRAME16k; - l_shb_lahead = L_SHB_LAHEAD; - move16(); - move16(); - skip = skip_bands_SWB_TBE; - - IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) - { - skip = skip_bands_WB_TBE; - l_frame = L_FRAME16k / 4; - l_shb_lahead = L_SHB_LAHEAD / 4; - move16(); - move16(); - } - - /* apply gain for each subframe, and store noise output signal using overlap-add */ - set32_fx( mod_syn_fx, 0, l_frame + l_shb_lahead ); - - IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) - { - sum_gain_fx = 0; - move16(); - FOR( k = 0; k < shr( length, 1 ); k++ ) - { - sum_gain_fx = mult_r( subwin_fx[2 * k + 2], subgain_fx[0] ); - mod_syn_fx[skip[0] + k] = Mpy_32_16_1( synSHB_fx[skip[0] + k], sum_gain_fx ); - move32(); // Qx - mod_syn_fx[skip[0] + k + length / 2] = Mpy_32_16_1( synSHB_fx[skip[0] + k + length / 2], subgain_fx[0] ); // Qx - move32(); - } - FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) - { - FOR( k = 0; k < length; k++ ) - { - L_tmp = L_mult0( subwin_fx[k + 1], subgain_fx[i] ); - sum_gain_fx = round_fx( L_mac0( L_tmp, subwin_fx[length - k - 1], subgain_fx[i - 1] ) ); - mod_syn_fx[skip[i] + k] = L_shl( Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ), 1 ); // Qx - move32(); - } - } - FOR( k = 0; k < shr( length, 1 ); k++ ) - { - sum_gain_fx = mult_r( subwin_fx[length - k * 2 - 2], subgain_fx[i - 1] ); - mod_syn_fx[skip[i] + k] = Mpy_32_16_1( synSHB_fx[skip[i] + k], sum_gain_fx ); // Qx - move32(); - } - } - ELSE - { - num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; - join_length = i_mult( num_join, length ); - j = 0; - move16(); - move16(); - FOR( k = 0; k < length; k++ ) - { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[k + 1], subgain_fx[0] ) ); // Qx - move32(); - j = add( j, 1 ); - } - FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) - { - FOR( k = 0; k < join_length - length; k++ ) - { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[i * num_join] ); // Qx - move32(); - j = add( j, 1 ); - } - - FOR( k = 0; k < length; k++ ) - { - L_tmp = L_mult0( subwin_fx[length - k - 1], subgain_fx[i * num_join] ); - mod_syn_fx[j] = L_shl( Mpy_32_16_1( synSHB_fx[j], round_fx( L_mac0( L_tmp, subwin_fx[k + 1], subgain_fx[( i + 1 ) * num_join] ) ) ), 1 ); // Qx - move32(); - j = add( j, 1 ); - } - } - FOR( k = 0; k < join_length - length; k++ ) - { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); // Qx - move32(); - j = add( j, 1 ); - } - FOR( k = 0; k < length; k++ ) - { - mod_syn_fx[j] = Mpy_32_16_1( synSHB_fx[j], mult_r( subwin_fx[length - k - 1], subgain_fx[( NUM_SHB_SUBGAINS - 1 ) * num_join] ) ); // Qx - move32(); - j = add( j, 1 ); - } - } - - Word16 norm_shift = norm_l( frame_gain_fx ); - if ( frame_gain_fx == 0 ) - { - norm_shift = 31; - move16(); - } - - norm_shift = s_min( norm_shift, 14 ); - norm_shift = sub( norm_shift, 1 ); - - *Q_new = add( *Q_inp, sub( norm_shift, 13 ) ); // Q_new = Q_inp + min(norm_shift,14) - 14; - move16(); - FOR( i = 0; i < L_SHB_LAHEAD; i++ ) - { - overlap_fx[i] = L_shl( overlap_fx[i], sub( *Q_new, *Q_inp ) ); - move32(); - } - - FOR( i = 0; i < l_shb_lahead; i++ ) - { - synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[i] ) ); // Q_new - synSHB_fx[i] = L_add( synSHB_fx[i], overlap_fx[i] ); - synSHB_fx[i + l_shb_lahead] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new - move32(); - move32(); - move32(); - } - - FOR( ; i < l_frame; i++ ) - { - synSHB_fx[i] = Mpy_32_32( mod_syn_fx[i], L_shl( frame_gain_fx, norm_shift ) ); // Q_new - move32(); - } - - FOR( ; i < l_frame + l_shb_lahead; i++ ) - { - synSHB_fx[i] = L_shl( synSHB_fx[i], sub( *Q_new, *Q_inp ) ); - overlap_fx[i - l_frame] = Mpy_32_32( mod_syn_fx[i], Mpy_32_16_1( L_shl( frame_gain_fx, norm_shift ), win_fx[l_frame + l_shb_lahead - 1 - i] ) ); // Q_new - move32(); - move32(); - } - - *Q_inp = *Q_new; - move16(); - return; -} - - -/*-------------------------------------------------------------------* - * ScaleShapedWB() - * - * - *-------------------------------------------------------------------*/ - -void ScaleShapedWB_fx( - const Word16 length, /* i : SHB overlap length */ - Word16 *synSHB, /* i/o : synthesized shb signal Q_bwe_exc/Qx */ - Word16 *overlap, /* i/o : buffer for overlap-add Q_bwe_exc/Qx */ - const Word16 *subgain, /* i : subframe gain Q15*/ - const Word32 frame_gain, /* i : frame gain Q18 */ - const Word16 *win, /* i : window Q15*/ - const Word16 *subwin, /* i : subframes window Q15*/ - const Word16 Q_bwe_exc, - Word16 L_frame, /* i : Frame length - determines whether 12.8 or 16kHz core in-use */ - Word16 dynQ, /* i : indicate whether output is dynamic Q, or Q0 */ - Word16 *Qx, /* o : newly computed Q factor for synSHB */ - Word16 prev_Qx, /* i : prev_Qx for memory scaling */ - Word32 *Hilbert_Mem /* i : Hilbert memory used for computing Qx */ -) -{ - const Word16 *skip; - Word16 i, j, k, l_shb_lahead, l_frame, l_frame_tmp; - Word16 join_length, num_join; - Word32 mod_syn[L_FRAME16k + L_SHB_LAHEAD]; - Word16 sum_gain; - Word32 L_tmp; - Word16 max_val, abs_sig, sc1, sc2, shift, max_headroom, min_shift, max_shift, max_shift2; - /* Init */ - set32_fx( mod_syn, 0, L_FRAME16k + L_SHB_LAHEAD ); - - /* apply gain for each subframe, and store noise output signal using overlap-add */ - IF( EQ_16( length, SHB_OVERLAP_LEN / 2 ) ) - { - /* WB Gain shape and gain frame application with overlap */ - skip = skip_bands_WB_TBE; - move16(); - l_frame = L_FRAME16k / 4; - move16(); - l_shb_lahead = L_SHB_LAHEAD / 4; - move16(); - - sum_gain = 0; - move16(); - FOR( k = 0; k < length / 2; k++ ) - { - sum_gain = mult_r( subwin[2 * k + 2], subgain[0] ); /* Q15 */ - mod_syn[skip[0] + k] = L_mult( sum_gain, synSHB[skip[0] + k] ); - move32(); /* Q_bwe_exc + 16 */ - mod_syn[skip[0] + k + length / 2] = L_mult( subgain[0], synSHB[skip[0] + k + length / 2] ); - move32(); /* Q_bwe_exc + 16 */ - } - FOR( i = 1; i < NUM_SHB_SUBFR / 2; i++ ) - { - FOR( k = 0; k < length; k++ ) - { - L_tmp = L_mult0( subwin[k + 1], subgain[i] ); /* Q30 */ - sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i - 1] ) ); /* Q14 */ - mod_syn[skip[i] + k] = L_shl( L_mult( sum_gain, synSHB[skip[i] + k] ), 1 ); - move32(); /* Q_bwe_exc + 16 */ - } - } - FOR( k = 0; k < length / 2; k++ ) - { - sum_gain = mult_r( subwin[length - 2 * k - 2], subgain[i - 1] ); /* Q15 */ - mod_syn[skip[i] + k] = L_mult( sum_gain, synSHB[skip[i] + k] ); - move32(); /* Q_bwe_exc + 16 */ - } - } - ELSE - { - /* SWB Gain shape and gain frame application with overlap */ - l_frame = L_FRAME16k; - move16(); - l_shb_lahead = L_SHB_LAHEAD; - move16(); - skip = skip_bands_SWB_TBE; - move16(); - - num_join = NUM_SHB_SUBFR / NUM_SHB_SUBGAINS; - move16(); - join_length = i_mult2( num_join, length ); - j = 0; /* ptr*/ - move16(); - FOR( k = 0; k < length; k++ ) - { - sum_gain = mult_r( subwin[k + 1], subgain[0] ); /* Q15 */ - mod_syn[j] = L_mult( synSHB[j], sum_gain ); - move32(); /* Q_bwe_exc + 16 */ - j++; - } - - FOR( i = 0; i < NUM_SHB_SUBGAINS - 1; i++ ) - { - FOR( k = 0; k < join_length - length; k++ ) - { - mod_syn[j] = L_mult( synSHB[j], subgain[i * num_join] ); - move32(); /* Q_bwe_exc + 16 */ - j++; - } - - FOR( k = 0; k < length; k++ ) - { - L_tmp = L_mult0( subwin[k + 1], subgain[i_mult2( ( i + 1 ), num_join )] ); /* Q30 */ - sum_gain = round_fx( L_mac0( L_tmp, subwin[length - k - 1], subgain[i * num_join] ) ); /*Q14 */ - mod_syn[j] = L_shl( L_mult( sum_gain, synSHB[j] ), 1 ); - move32(); /* Q_bwe_exc + 16 */ - j++; - } - } - FOR( k = 0; k < join_length - length; k++ ) - { - mod_syn[j] = L_mult( synSHB[j], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); - move32(); /* Q_bwe_exc + 16 */ - j++; - } - FOR( k = 0; k < length; k++ ) - { - sum_gain = mult_r( subwin[length - k - 1], subgain[( NUM_SHB_SUBGAINS - 1 ) * num_join] ); /* Q15 */ - mod_syn[j] = L_mult( synSHB[j], sum_gain ); - move32(); /* Q_bwe_exc + 16 */ - j++; - } - } - - - max_val = 0; - move16(); - FOR( i = 0; i < l_frame + l_shb_lahead; i++ ) - { - abs_sig = abs_s( round_fx( mod_syn[i] ) ); - if ( GT_16( abs_sig, max_val ) ) - { - max_val = abs_sig; - move16(); - } - } - - FOR( i = 0; i < HILBERT_MEM_SIZE; i++ ) - { - abs_sig = abs_s( round_fx( Hilbert_Mem[i] ) ); - if ( GT_16( abs_sig, max_val ) ) - { - max_val = abs_sig; - move16(); - } - } - - sc1 = norm_s( max_val ); /* max_val headroom in mod_syn[] */ - sc2 = norm_s( round_fx( frame_gain ) ); /* headroom in GainFrame */ - - IF( dynQ == 0 ) - { - shift = sub( 13, Q_bwe_exc ); /* earlier = (10 - Q_bwe_exc) but we changed GainFrame Q21 to Q18 */ - *Qx = 0; - move16(); - } - ELSE IF( EQ_16( L_frame, L_FRAME ) ) /* 12.8k core */ - { - max_headroom = sub( add( sc1, sc2 ), 4 ); /* Max headroom after multiplying = sc1 + sc2 -3 (keep 3 bit extra headroom) */ - /* 12.8k core needs extra headroom than 16k core */ - /* otherwise Hilbert transform inside flip_and_downmix have saturation, causes ringing in output */ - - /* Qx = (Q_bwe_exc+3) + shift - 16 */ - /* make sure 14 > Qx > 2 */ - min_shift = sub( 2, sub( add( Q_bwe_exc, 3 ), 16 ) ); - max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) ); - max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */ - - shift = s_min( min_shift, max_shift2 ); - *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 ); - move16(); - } - ELSE /* 16k core */ - { - max_headroom = sub( add( sc1, sc2 ), 1 ); /* Max headroom after multiplying = sc1 + sc2 -1 (keep 1 bit extra headroom) */ - - /* Qx = (Q_bwe_exc+3) + shift - 16 */ - /* make sure 14 > Qx > 3 */ - min_shift = sub( 3, sub( add( Q_bwe_exc, 3 ), 16 ) ); - move16(); - max_shift = sub( 13, sub( add( Q_bwe_exc, 3 ), 16 ) ); - move16(); - max_shift2 = s_min( max_shift, max_headroom ); /* avoid shifting more than the available max_val headroom to avoid overflow */ - - shift = s_min( min_shift, max_shift2 ); - *Qx = sub( add( add( Q_bwe_exc, 3 ), shift ), 16 ); - move16(); - } - - /* bring memory st_fx->syn_overlap_fx[] = overlap[i] to new Q = Qx to prepare for addition */ - FOR( i = 0; i < l_shb_lahead; i++ ) - { - overlap[i] = shl( overlap[i], sub( *Qx, prev_Qx ) ); - move16(); - } - - FOR( i = 0; i < l_shb_lahead; i++ ) - { - /* mod_syn in (16+Q_bwe_exc), frame_gain in Q18 */ - L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */ - synSHB[i] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[i] ), shift ) ); /* Qx */ - move16(); - synSHB[i] = add_sat( synSHB[i], overlap[i] ); - move16(); /* Qx */ - synSHB[i + l_shb_lahead] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx */ - move16(); - } - - FOR( ; i < l_frame; i++ ) - { - L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* L_tmp in (Q_bwe_exc+3) */ - synSHB[i] = round_fx_sat( L_shl_sat( L_tmp, shift ) ); /* Qx; */ - move16(); - } - - l_frame_tmp = add( l_frame, l_shb_lahead ); - FOR( ; i < l_frame_tmp; i++ ) - { - L_tmp = Mult_32_32( mod_syn[i], frame_gain ); /* (Q_bwe_exc+3) */ - overlap[i - l_frame] = round_fx_sat( L_shl_sat( Mult_32_16( L_tmp, win[l_frame + l_shb_lahead - 1 - i] ), shift ) ); /* Qx */ - move16(); - } - - return; -} - -/*-------------------------------------------------------------------* - * non_linearity() - * - * Apply a non linearity to the SHB excitation - * -------------------------------------------------------------------*/ - -static Word32 non_linearity_scaled_copy( - const Word16 input[], - Word16 j, - const Word16 length, - Word32 output[], - Word32 prev_scale, - const Word16 scale_step, - const Word16 en_abs ) -{ - Word16 i; - Word32 L_tmp; - - - IF( en_abs ) - { - FOR( i = 0; i < j; i++ ) - { - L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ - L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ - output[i] = L_tmp; - move32(); - - L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ - prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ - } - FOR( ; i < length; i++ ) - { - L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ - L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ - output[i] = L_tmp; - move32(); - } - } - ELSE - { - FOR( i = 0; i < j; i++ ) - { - L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ - L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ - - if ( input[i] < 0 ) - { - L_tmp = L_negate( L_tmp ); - } - output[i] = L_tmp; - move32(); - - L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ - prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ - } - - FOR( ; i < length; i++ ) - { - L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ - L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ - - if ( input[i] < 0 ) - { - L_tmp = L_negate( L_tmp ); - } - output[i] = L_tmp; - move32(); - } - } - return prev_scale; -} - - -/*-------------------------------------------------------------------* - * non_linearity() - * - * Apply a non linearity to the SHB excitation - * -------------------------------------------------------------------*/ - -static Word32 non_linearity_scaled_copy_ivas( - const Word16 input[], - Word16 j, - const Word16 length, - Word32 output[], - Word32 prev_scale, - const Word16 scale_step, - const Word16 en_abs ) -{ - Word16 i; - Word32 L_tmp; - - - IF( en_abs ) - { - FOR( i = 0; i < j; i++ ) - { - L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */ - L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ - - test(); - test(); - if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) - { - /* NOTE: this is done to avoid the product to become zero for small non-zero input */ - L_tmp = 1; - move16(); - } - - output[i] = L_tmp; - move32(); - - L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ - prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ - } - FOR( ; i < length; i++ ) - { - /* L_tmp = (input[i] * input[i]) * prev_scale;*/ - L_tmp = Mpy_32_16_1( Mpy_32_16_1( prev_scale, input[i] ), input[i] ); /* 2*Q_inp */ - - test(); - test(); - if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) - { - /* NOTE: this is done to avoid the product to become zero for small non-zero input */ - L_tmp = 1; - move16(); - } - output[i] = L_tmp; - move32(); - } - } - ELSE - { - FOR( i = 0; i < j; i++ ) - { - L_tmp = L_mult( input[i], input[i] ); /* 2*Q_inp+1 */ - L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ - - test(); - test(); - if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) - { - /* NOTE: this is done to avoid the product to become zero for small non-zero input */ - L_tmp = 1; - move16(); - } - - if ( input[i] < 0 ) - { - L_tmp = L_negate( L_tmp ); - } - output[i] = L_tmp; - move32(); - - L_tmp = Mult_32_16( prev_scale, scale_step ); /* Q29 */ - prev_scale = L_shl( L_tmp, 1 ); /* Q30 */ - } - - FOR( ; i < length; i++ ) - { - L_tmp = L_mult_sat( input[i], input[i] ); /* 2*Q_inp+1 */ - L_tmp = Mult_32_32( L_tmp, prev_scale ); /* 2*Q_inp */ - test(); - test(); - if ( input[i] != 0 && prev_scale != 0 && L_tmp == 0 ) - { - /* NOTE: this is done to avoid the product to become zero for small non-zero input */ - L_tmp = 1; - move16(); - } - - if ( input[i] < 0 ) - { - L_tmp = L_negate( L_tmp ); - } - output[i] = L_tmp; - move32(); - } - } - return prev_scale; -} - - -/*==========================================================================*/ -/* FUNCTION : void non_linearity() */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Apply a non linearity to the SHB excitation */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Word16 input[] i : input signal Q_inp */ -/* Word16 length i : input length */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* Word32 output[] o : output signal 2*Q_inp */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Word32 *prev_scale i/o: memory Q30 */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ -/*==========================================================================*/ - -void non_linearity_fx( - const Word16 input[], /* i : input signal Q_inp */ - Word32 output[], /* o : output signal 2*Q_inp */ - const Word16 length, /* i : input length */ - Word32 *pPrevScale, /* i/o: memory Q30 */ - Word16 Q_inp, - Word16 coder_type, /* i : Coder Type */ - Word16 *voice_factors, /* i : Voice Factors */ - const Word16 L_frame /* i : ACELP frame length */ - -) -{ - Word16 i, j; - Word16 max_val = 0; - move16(); - Word32 scale; - Word16 scale_step; - Word16 exp, tmp; - Word16 e_tmp, f_tmp; - Word16 frac; - Word32 L_tmp; - Word32 L_tmp1; - - Word16 en_abs = 0; - Word16 v_fac = 0; - move16(); - move16(); - Word16 ths; - Word16 nframes; - Word32 prev_scale; - Word16 length_half; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - nframes = 5; - move16(); - ths = 17817; - move16(); /* 0.87*5 in Q12 */ - } - ELSE - { - nframes = 4; - move16(); - ths = 15400; - move16(); /* 0.94*4 in Q12 */ - } - - - FOR( i = 0; i < nframes; i++ ) - { - v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */ - } - - test(); - if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) ) - { - en_abs = 1; - move16(); - } - - length_half = shr( length, 1 ); - prev_scale = *pPrevScale; - move32(); - - - /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ - - FOR( i = j = 0; i < length_half; i++ ) - { - tmp = abs_s( input[i] ); - if ( GT_16( tmp, max_val ) ) - { - j = i; - move16(); - } - max_val = s_max( max_val, tmp ); - } - - - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) - { - exp = norm_s( max_val ); - tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ - scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */ - } - ELSE - { - scale = 1438814044; - move32(); /* Q31; 0.67 in Q31 */ - } - - test(); - IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) ) - { - scale_step = 16384; - move16(); /* Q14 */ - prev_scale = L_shr( scale, 1 ); /* Q30 */ - } - ELSE - { - - /* Computing log2(scale) */ - IF( j == 0 ) - { - scale_step = 32767; - move16(); - } - ELSE - { - e_tmp = norm_l( scale ); - f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); - e_tmp = sub( -1, e_tmp ); - L_tmp = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */ - - /* Computing log2(prev_scale) */ - e_tmp = norm_l( prev_scale ); - f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); - e_tmp = negate( e_tmp ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, MAX_16 ); /* Q16 */ - - /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ - L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ - - /* Computing 1/j */ - exp = norm_s( j ); - tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */ - - /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ - - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ - - tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */ - } - } - - prev_scale = non_linearity_scaled_copy( input, j, length_half, output, prev_scale, scale_step, en_abs ); - - max_val = 0; - move16(); - j = shr( length, 1 ); - FOR( i = length_half; i < length; i++ ) - { - tmp = abs_s( input[i] ); - if ( GT_16( tmp, max_val ) ) - { - j = i; - move16(); - } - max_val = s_max( max_val, tmp ); - } - - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) - { - exp = norm_s( max_val ); - tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ - scale = L_shl_o( L_mult( 21955 /* 0.67 in Q15 */, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */ - } - ELSE - { - scale = 1438814044; - move32(); /* Q31; 0.67 in Q31 */ - } - - test(); - IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 32 ), scale ) ) - { - scale_step = 16384; - move16(); /*Q14 */ - prev_scale = L_shr( scale, 1 ); /*Q30 */ - } - ELSE - { - /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */ - /* Computing log2(scale) */ - IF( EQ_16( j, length_half ) ) - { - scale_step = 32767; - move16(); /*Q14 */ - } - ELSE - { - e_tmp = norm_l( scale ); - f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); - e_tmp = sub( -e_tmp, 1 ); - L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ - - /* Computing log2(prev_scale) */ - e_tmp = norm_l( prev_scale ); - f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); - e_tmp = negate( e_tmp ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ - - /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ - L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ - - /* Computing 1/(j - length/2) */ - - tmp = sub( j, length_half ); - exp = norm_s( tmp ); - - - tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */ - - /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ - - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ - - tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */ - } - } - - prev_scale = non_linearity_scaled_copy( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs ); - - *pPrevScale = prev_scale; - move32(); - - /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ - - return; -} - - -/*==========================================================================*/ -/* FUNCTION : void non_linearity_ivas_fx() */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Apply a non linearity to the SHB excitation */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* Word16 input[] i : input signal Q_inp */ -/* Word16 length i : input length */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* Word32 output[] o : output signal 2*Q_inp */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Word32 *prev_scale i/o: memory Q30 */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* CALLED FROM : */ -/*==========================================================================*/ - -void non_linearity_ivas_fx( - const Word16 input[], /* i : input signal Q_inp */ - Word32 output[], /* o : output signal 2*Q_inp */ - const Word16 length, /* i : input length */ - Word32 *pPrevScale, /* i/o: memory Q30 */ - Word16 Q_inp, - Word16 coder_type, /* i : Coder Type */ - Word16 *voice_factors, /* i : Voice Factors */ - const Word16 L_frame /* i : ACELP frame length */ - -) -{ - Word16 i, j; - Word16 max_val = 0; - move16(); - Word32 scale; - Word16 scale_step; - Word16 exp, tmp; - Word16 e_tmp, f_tmp; - Word16 frac; - Word32 L_tmp; - Word32 L_tmp1; - - Word16 en_abs = 0; - Word16 v_fac = 0; - move16(); - move16(); - Word16 ths; - Word16 nframes; - Word32 prev_scale; - Word16 length_half; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - nframes = 5; - move16(); - ths = 17817; - move16(); /* 0.87*5 in Q12 */ - } - ELSE - { - nframes = 4; - move16(); - ths = 15400; - move16(); /* 0.94*4 in Q12 */ - } - - - FOR( i = 0; i < nframes; i++ ) - { - v_fac = add( v_fac, shr( voice_factors[i], 3 ) ); /* Q12 */ - } - - test(); - if ( EQ_16( coder_type, VOICED ) && GT_16( v_fac, ths ) ) - { - en_abs = 1; - move16(); - } - - length_half = shr( length, 1 ); - prev_scale = *pPrevScale; - move32(); - - - /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ - - FOR( i = j = 0; i < length_half; i++ ) - { - tmp = abs_s( input[i] ); - if ( GT_16( tmp, max_val ) ) - { - j = i; - move16(); - } - max_val = s_max( max_val, tmp ); - } - - - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) - { - exp = norm_s( max_val ); - tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ - scale = L_shl( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ) ); /* Q31 */ - } - ELSE - { - scale = 1438814044; - move32(); /* Q31; 0.67 in Q31 */ - } - - test(); - IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ) /*Q30 -> Q31*/, scale /*Q31*/ ) ) - { - scale_step = 16384; - move16(); /* Q14 */ - prev_scale = L_shr( scale, 1 ); /* Q30 */ - } - ELSE - { - - /* Computing log2(scale) */ - IF( j == 0 ) - { - scale_step = 32767; - move16(); - } - ELSE - { - e_tmp = norm_l( scale ); - f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); - e_tmp = sub( -1, e_tmp ); - L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ - - /* Computing log2(prev_scale) */ - e_tmp = norm_l( prev_scale ); - f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); - e_tmp = negate( e_tmp ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ - - /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ - L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ - - /* Computing 1/j */ - exp = norm_s( j ); - tmp = div_s( shl( 1, sub( 14, exp ) ), j ); /* Q(29-exp) */ - - /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /* Q(16+29-exp+1-16+exp-14)->Q16 */ - - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ - - tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /* Q14 */ - } - } - - prev_scale = non_linearity_scaled_copy_ivas( input, j, length_half, output, prev_scale, scale_step, en_abs ); - - max_val = 0; - move16(); - j = shr( length, 1 ); - FOR( i = length_half; i < length; i++ ) - { - tmp = abs_s( input[i] ); - if ( GT_16( tmp, max_val ) ) - { - j = i; - move16(); - } - max_val = s_max( max_val, tmp ); - } - - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) - { - exp = norm_s( max_val ); - tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ - scale = L_shl_o( L_mult( 21955, tmp ), add( exp, sub( Q_inp, 14 ) ), &Overflow ); /* Q31 */ - } - ELSE - { - scale = 1438814044; - move32(); /* Q31; 0.67 in Q31 */ - } - - test(); - IF( prev_scale <= 0 || GT_32( Mult_32_16( prev_scale, 64 ), scale ) ) - { - scale_step = 16384; - move16(); /*Q14 */ - prev_scale = L_shr( scale, 1 ); /*Q30 */ - } - ELSE - { - /*scale_step = (float) exp(1.0f / (float) (j - length/2) * (float) log(scale / prev_scale)); */ - /* Computing log2(scale) */ - IF( EQ_16( j, length_half ) ) - { - scale_step = 32767; - move16(); /*Q14 */ - } - ELSE - { - e_tmp = norm_l( scale ); - f_tmp = Log2_norm_lc( L_shl( scale, e_tmp ) ); - e_tmp = sub( -e_tmp, 1 ); - L_tmp = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ - - /* Computing log2(prev_scale) */ - e_tmp = norm_l( prev_scale ); - f_tmp = Log2_norm_lc( L_shl( prev_scale, e_tmp ) ); - e_tmp = negate( e_tmp ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 32767 ); /* Q16 */ - - /* log2(scale / prev_scale) = log2(scale) - log2(prev_scale) */ - L_tmp = L_sub( L_tmp, L_tmp1 ); /* Q16 */ - - /* Computing 1/(j - length/2) */ - - tmp = sub( j, length_half ); - exp = norm_s( tmp ); - - - tmp = div_s( shl( 1, sub( 14, exp ) ), tmp ); /* Q(29-exp) */ - - /* (log2(scale / prev_scale))/length */ - L_tmp = L_shl_o( Mult_32_16( L_tmp, tmp ), sub( exp, 14 ), &Overflow ); /*Q(16+29-exp+1-16+exp-14)->Q16 */ - - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of L_tmp */ - - tmp = extract_l( Pow2( 14, frac ) ); - scale_step = shl_o( tmp, exp, &Overflow ); /*Q14 */ - } - } - - prev_scale = non_linearity_scaled_copy_ivas( input + length_half, sub( j, length_half ), sub( length, length_half ), output + length_half, prev_scale, scale_step, en_abs ); - - *pPrevScale = prev_scale; - move32(); - - /* Delay Alignment in FX is done inside swb_tbe_enc_fx() */ - - return; -} - - -/*-------------------------------------------------------------------* - * create_random_vector() - * - * creates random number vector - * Note: the abs(max_val) value coming out of create_random_vector should - * fit into the precision of Q6. - * -------------------------------------------------------------------*/ - -void create_random_vector_fx( - Word16 output[], /* o : output random vector Q5*/ - const Word16 length, /* i : length of random vector */ - Word16 seed[] /* i/o: start seed */ -) -{ - Word16 i, j, k; - Word16 scale1, scale2; - Word32 L_tmp; - - L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[0] ) ) ); /*Q23 */ - j = extract_l( L_shr( L_tmp, 23 ) ); - j = s_and( j, 0xff ); - - L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */ - k = extract_l( L_shr( L_tmp, 23 ) ); - k = s_and( k, 0xff ); - - WHILE( EQ_16( k, j ) ) - { - L_tmp = L_abs( Mult_32_16( 2144047674, Random( &seed[1] ) ) ); /*Q23 */ - k = extract_l( L_shr( L_tmp, 23 ) ); - k = s_and( k, 0xff ); - } - - scale1 = 18021; - move16(); /* 200.00f * 0.35f/0.1243f; */ - if ( Random( &seed[0] ) < 0 ) - { - scale1 = -18021; - move16(); /*Q5 */ /* -200.00f * 0.35f/0.1243f; */ - } - - scale2 = 7208; - move16(); /* 80.00f * 0.35f/0.1243f; */ - if ( Random( &seed[1] ) < 0 ) - { - scale2 = -7208; - move16(); /*Q5 */ /* -80.00f * 0.35f/0.1243f; */ - } - - FOR( i = 0; i < length; i++ ) - { - j = s_and( j, 0xff ); - k = s_and( k, 0xff ); - output[i] = round_fx( L_add( L_mult( scale1, gaus_dico_swb_fx[j] ), L_mult( scale2, gaus_dico_swb_fx[k] ) ) ); /*Q5 */ - move16(); - j++; - k++; - } - - return; -} - - -/*======================================================================================*/ -/* FUNCTION : interp_code_5over2_fx() */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Used to interpolate the excitation from the core sample rate */ -/* of 12.8 kHz to 32 kHz. */ -/* Simple linear interpolator - No need FOR precision here. */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16[]) inp_code_fx : input vector (Q12) */ -/* _ (Word16) inp_length : length of input vector */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) interp_code_fx : output vector (Q12) */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------------------*/ - -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================================*/ - -void interp_code_5over2_fx( - const Word16 inp_code_fx[], /* i : input vector Qx*/ - Word16 interp_code_fx[], /* o : output vector Qx*/ - const Word16 inp_length /* i : length of input vector */ -) -{ - Word16 i, kk, kkp1, i_len2; - Word32 Ltemp; - Word16 factor_i_fx[5] = { 6554, 19661, 32767, 19661, 6554 }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - Word16 factor_j_fx[5] = { 26214, 13107, 0, 13107, 26214 }; - move16(); - move16(); - move16(); - move16(); - move16(); - interp_code_fx[0] = inp_code_fx[0]; - move16(); /* Qx */ - - Ltemp = L_mult( inp_code_fx[0], factor_i_fx[3] ); /* Q(16+x) */ - Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[3] ); /* Q(16+x) */ - interp_code_fx[1] = round_fx( Ltemp ); /*Qx */ - move16(); - Ltemp = L_mult( inp_code_fx[0], factor_i_fx[4] ); /*Q(16+x) */ - Ltemp = L_mac( Ltemp, inp_code_fx[1], factor_j_fx[4] ); /*Q(16+x) */ - interp_code_fx[2] = round_fx( Ltemp ); /* Qx */ - move16(); - kk = 1; - move16(); - kkp1 = 2; - move16(); - i = 3; - move16(); - /*i_len2 = ( inp_length - 2 ) * HIBND_ACB_L_FAC; */ /*HIBND_ACB_L_FAC == 5/2 */ - i_len2 = sub( inp_length, 2 ); - i_len2 = shr( add( shl( i_len2, 2 ), i_len2 ), 1 ); /* rounding below during shr makes it non BE*/ - - FOR( ; i < i_len2; i += 5 ) - { - Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */ - Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[0] ); /*Q(16+x) */ - interp_code_fx[i] = round_fx( Ltemp ); /*Qx */ - move16(); - Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */ - Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_i_fx[1] ); /*Q(16+x) */ - interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */ - move16(); - Ltemp = L_mult( inp_code_fx[kkp1], factor_i_fx[2] ); /*Q(16+x) */ - interp_code_fx[i + 2] = round_fx( Ltemp ); /*Qx */ - move16(); - kk++; - kkp1++; - - Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[3] ); /*Q(16+x) */ - Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[3] ); /*Q(16+x) */ - interp_code_fx[i + 3] = round_fx( Ltemp ); /*Qx */ - move16(); - Ltemp = L_mult( inp_code_fx[kk], factor_i_fx[4] ); /*Q(16+x) */ - Ltemp = L_mac( Ltemp, inp_code_fx[kkp1], factor_j_fx[4] ); /*Q(16+x) */ - interp_code_fx[i + 4] = round_fx( Ltemp ); /*Qx */ - move16(); - kk++; - kkp1++; - } - - Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[0] ); /*Q(16+x) */ - interp_code_fx[i] = round_fx( Ltemp ); /*Qx */ - move16(); - Ltemp = L_mult( inp_code_fx[kk], factor_j_fx[1] ); /*Q(16+x) */ - interp_code_fx[i + 1] = round_fx( Ltemp ); /*Qx */ - move16(); - return; -} - - -/*======================================================================================*/ -/* FUNCTION : interp_code_4over2_fx() */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Used to interpolate the excitation from the core sample rate */ -/* of 16 kHz to 32 kHz. */ -/* Simple linear interpolator - No need for precision here. */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16[]) inp_code_fx : input vector (Qx) */ -/* _ (Word16) inp_length : length of input vector */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) interp_code_fx : output vector (Qx) */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------------------*/ - -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================================*/ - -void interp_code_4over2_fx( - const Word16 inp_code_fx[], /* i : input vector Qx*/ - Word16 interp_code_fx[], /* o : output vector Qx*/ - const Word16 inp_length /* i : length of input vector */ -) -{ - Word16 i, j; - j = 0; - move16(); - FOR( i = 0; i < inp_length - 1; i++ ) - { - interp_code_fx[j] = inp_code_fx[i]; - move16(); /*Qx */ - interp_code_fx[j + 1] = add( shr( inp_code_fx[i], 1 ), shr( inp_code_fx[i + 1], 1 ) ); - move16(); - move16(); /*Qx */ - j = add( j, 2 ); - } - - interp_code_fx[j] = inp_code_fx[i]; - move16(); - interp_code_fx[j + 1] = shr( inp_code_fx[i], 1 ); - move16(); /*Qx */ - - return; -} - - -/*-------------------------------------------------------------------* - * wb_tbe_extras_reset_synth() - * - * Reset the extra parameters only required for WB TBE synthesis - *-------------------------------------------------------------------*/ - -void wb_tbe_extras_reset_synth_fx( - Word16 state_lsyn_filt_shb[], - Word16 state_lsyn_filt_dwn_shb[], - Word16 state_32and48k_WB_upsample[], - Word16 state_resamp_HB[] ) -{ - set16_fx( state_lsyn_filt_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); - set16_fx( state_lsyn_filt_dwn_shb, 0, 2 * ALLPASSSECTIONS_STEEP ); - set16_fx( state_32and48k_WB_upsample, 0, 2 * ALLPASSSECTIONS_STEEP ); - set16_fx( state_resamp_HB, 0, INTERP_3_1_MEM_LEN ); - - return; -} -#if defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 ) && defined( FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 ) -static inline Word64 wmac_1616( Word64 x1, Word16 x2, Word16 x3 ) -{ - return W_mac_16_16( x1, x2, x3 ); -} - -static inline Word64 wmac_3216( Word64 x1, Word32 x2, Word16 x3 ) -{ - return W_mac_32_16( x1, x2, x3 ); -} - -static inline Word64 finalSat16( Word64 W_tmpx, Word64 W_tmpy ) -{ - return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -} - -static inline Word64 finalSat32( Word64 W_tmpx, Word64 W_tmpy ) -{ - return W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); -} - -inline static void elliptic_bpf_48k_generic_func1( Word16 *input16_fx, Word32 *input32_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) -{ - Word32 L_tmpX; - Word16 i; - Word32 L_tmpMax2 = *L_tmpMax; - Word32 L_tmpAbs; - move32(); - - if ( input16_fx > 0 ) - { - Word64 ( *wmac )( Word64, Word16, Word16 ); - Word64 ( *finalSat )( Word64, Word64 ); - Word16 *input_fx = input16_fx; - wmac = wmac_1616; - finalSat = finalSat16; - } - if ( input32_fx > 0 ) - { - Word64 ( *wmac )( Word64, Word32, Word16 ); - Word64 ( *finalSat )( Word64, Word64 ); - Word32 *input_fx = input32_fx; - wmac = wmac_3216; - finalSat = finalSat32; - } - - IF( !IsUpsampled3 ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } - } /*IsUpsampled3*/ - ELSE - { /*IsUpsampled3*/ - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = wmac( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = wmac( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpX = wmac( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = wmac( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = wmac( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = finalSat( W_tmpX, W_tmpY ); /*Q_input_fx + 11*/ - move32(); - if ( *L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( *L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } - } /*IsUpsampled3*/ - *L_tmpMax = L_tmpMax2; - move32(); -} -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - -/*-------------------------------------------------------------------* - * elliptic_bpf_48k_generic() - * - * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz - * Implemented as 3 fourth order sections cascaded. - *-------------------------------------------------------------------*/ - -void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int isIVAS, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 IsUpsampled3, - Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif - Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal memory_fx_Q */ - Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ - Word16 memory_fx_Q[], - const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ -) -{ - Word16 i, j; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 memory_fx0, Q_temp, Q_temp2; - Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4]; - Word32 L_tmpMax; - Word32 L_tmpX; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - Word64 W_tmpX; - Word64 W_tmpY; -#endif - - Word32 *L_tmp = &L_tmp_buffer[4]; - Word32 *L_tmp2 = &L_tmp2_buffer[4]; - Word32 *L_output = &L_output_buffer[4]; -#else - Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; - Word32 memory2_fx_2[4], memory2_fx_3[4]; -#endif - -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - FOR( i = 0; i < 4; i++ ) - { - memory_fx0 = extract_l( memory_fx2[0][i] ); - input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); - L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - move32(); - move32(); - } - -#else - FOR( i = 0; i < 4; i++ ) - { - memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); - memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - move32(); - move32(); - } -#endif - -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( input_fx, 0, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - IF( !IsUpsampled3 ) - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - } - } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } - } - } /*IsUpsampled3*/ - ELSE - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - } - } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - } - } - } /*IsUpsampled3*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; - memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; - memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; - memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; - move32(); - move32(); - move32(); - move32(); - move32(); - -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - elliptic_bpf_48k_generic_func1( 0, L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } - } - ELSE -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } - } - -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } -#endif - - - Q_temp = norm_l( L_tmpMax ); - Q_temp = sub( Q_temp, 4 ); - Scale_sig32( L_tmp2, 960, Q_temp ); - - memory_fx2[1][0] = L_tmp[L_FRAME48k - 4]; - memory_fx2[1][1] = L_tmp[L_FRAME48k - 3]; - memory_fx2[1][2] = L_tmp[L_FRAME48k - 2]; - memory_fx2[1][3] = L_tmp[L_FRAME48k - 1]; - move32(); - move32(); - move32(); - move32(); - move32(); - -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - FOR( j = 0; j < 4; j++ ) - { - L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - L_output[j - 4] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - } - - L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( 0, L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - IF( isIVAS ) - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - } - ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - { - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - } - -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - FOR( j = 0; j < 4; j++ ) - { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - } - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); - - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - -#endif - - - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; - memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; - memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; - memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1]; - memory_fx2[3][0] = L_output[L_FRAME48k - 4]; - memory_fx2[3][1] = L_output[L_FRAME48k - 3]; - memory_fx2[3][2] = L_output[L_FRAME48k - 2]; - memory_fx2[3][3] = L_output[L_FRAME48k - 1]; - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - memory_fx_Q[0] = *Q_input_fx; - memory_fx_Q[1] = add( *Q_input_fx, 11 ); - memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp ); - memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp ); - move16(); - move16(); - move16(); - move16(); - Q_temp2 = norm_l( L_tmpMax ); - Scale_sig32( L_output, 960, Q_temp2 ); - FOR( i = 0; i < 960; i++ ) - { - output_fx[i] = extract_h( L_output[i] ); - move16(); - } - *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); - move16(); /* BASOP_NOGLOB */ - - return; -} -/*-------------------------------------------------------------------* - * synthesise_fb_high_band() - * - * Creates the highband output for full band - 14.0 to 20 kHz - * Using the energy shaped white excitation signal from the SWB BWE. - * The excitation signal input is sampled at 16kHz and so is upsampled - * to 48 kHz first. - * Uses a complementary split filter to code the two regions from - * 14kHz to 16kHz and 16 kHz to 20 kHz. - * One of 16 tilt filters is also applied afterwards to further - * refine the spectral shape of the fullband signal. - * The tilt is specified in dB per kHz. N.B. Only negative values are - * accomodated. - *-------------------------------------------------------------------*/ - -void synthesise_fb_high_band_fx( - const Word16 excitation_in[], /* i : full band excitation */ - Word16 Q_fb_exc, - Word16 output[], /* o : high band speech - 14.0 to 20 kHz */ - const Word32 fb_exc_energy, /* i : full band excitation energy */ - const Word16 ratio, /* i : energy ratio */ - const Word16 L_frame, /* i : ACELP frame length */ - const Word16 bfi, /* i : fec flag */ - Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ - Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ - Word16 bpf_memory_Q[], - Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - , - Word16 isIVAS -#endif -) -{ - Word16 i, j; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; - Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; -#else - Word16 excitation_in_interp3[L_FRAME48k]; -#endif - Word16 tmp[L_FRAME48k]; - Word32 temp1; - Word32 ratio2; - Word32 L_tmp; - Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; - - /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ - j = 0; - /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ - FOR( i = 0; i < L_FRAME48k; i += 3 ) - { - excitation_in_interp3[i] = mult( excitation_in[j], 24576 ); /* Q(Q_fb_exc+13-15 = Q_fb_exc-2) */ - move16(); - excitation_in_interp3[i + 1] = 0; - move16(); - excitation_in_interp3[i + 2] = 0; - move16(); - j++; - } - exp_tmp = sub( Q_fb_exc, 2 ); - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - /* for 16kHz ACELP core */ - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 1, // IsUpsampled3 -#endif - excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx - - ); - } - ELSE - { - /* for 12.8kHz ACELP core */ - elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - isIVAS, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - 1, // IsUpsampled3 -#endif - excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); - } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A.1" );*/ - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART A" )*/ - - push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" ); - temp1 = sum2_fx_mod( tmp, L_FRAME48k ); - L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ - exp = norm_l( L_tmp ); - tmp3 = extract_h( L_shl( L_tmp, exp ) ); - tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/ - exp = sub( sub( 31, tmp1 ), exp ); - - exp2 = norm_l( temp1 ); - tmp2 = extract_h( L_shl( temp1, exp2 ) ); - exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/ - - exp = sub( exp2, exp ); /* Denormalize and substract */ - IF( GT_16( tmp2, tmp3 ) ) - { - tmp2 = shr( tmp2, 1 ); - exp = add( exp, 1 ); - } - IF( 0 != tmp3 ) - { - tmp3 = div_s( tmp2, tmp3 ); - L_tmp = L_deposit_h( tmp3 ); - L_tmp = Isqrt_lc( L_tmp, &exp ); /*Q(31-exp)*/ - ratio2 = Mult_32_16( L_tmp, ratio ); /*Q(31-exp+0-15 = 16-exp)*/ - } - ELSE - { - ratio2 = 0; - } - - IF( !bfi ) - { - *prev_fbbwe_ratio = ratio; - move16(); - } - ELSE - { - /**prev_fbbwe_ratio = ratio*0.5f;*/ - *prev_fbbwe_ratio = shr( ratio, 1 ); - move16(); - } - tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - IF( L_tmp < 0 ) - { - output[i] = negate( extract_h( L_shl_sat( L_negate( L_tmp ), tmp3 ) ) ); /*Qout*/ - move16(); - } - ELSE - { - output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ - move16(); - } - } - pop_wmops(); /*push_wmops( "SYNTHESISE_FB_HIGH_BAND PART B" );*/ - return; -} - -/*-------------------------------------------------------------------* - * Estimate_mix_factors_fx() * - * * - * Estimate mix factors for SHB excitation generation * - *-------------------------------------------------------------------*/ -void Estimate_mix_factors_fx( - const Word16 *shb_res, /* i : SHB LP residual in Q = Q_shb */ - const Word16 Q_shb, - const Word16 *exc16kWhtnd, /* i : SHB transformed low band excitation Q_bwe_exc */ - const Word16 Q_bwe_exc, - const Word16 *White_exc16k_frac, /* i : Modulated envelope shaped white noise Q_frac */ - const Word16 Q_frac, - const Word32 pow1, /* i : SHB exc. power for normalization in Q_pow1 */ - const Word16 Q_pow1, - const Word32 pow22, /* i : White noise excitation for normalization in Q_pow22 */ - const Word16 Q_pow22, - Word16 *vf_modified, /* o : Estimated voice factors */ - Word16 *vf_ind /* o : voice factors VQ index */ -) -{ - Word16 shb_res_local[L_FRAME16k], WN_exc_local[L_FRAME16k]; - Word32 pow3, temp_p1_p2, temp_p1_p3; - Word16 temp_numer1[L_FRAME16k], temp_numer2[L_FRAME16k]; - Word16 i, length; - Word16 exp1, exp2, expa, expb, fraca, fracb, scale, num_flag, den_flag; - Word16 tmp, tmp1, sc1, sc2; - Word32 L_tmp1, L_tmp2; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - Copy( shb_res, shb_res_local, L_FRAME16k ); - Copy( White_exc16k_frac, WN_exc_local, L_FRAME16k ); - /* WN_exc_local in (Q_frac) */ - - pow3 = Dot_product( shb_res_local, shb_res_local, L_FRAME16k ); /* (2*Q_shb+1) */ - - pow3 = L_add( pow3, L_shl( 21475l /*0.00001f in Q31*/, 2 * Q_shb + 1 - 31 ) ); /* (2*Q_shb+1) */ - if ( pow3 == 0 ) - { - pow3 = 1; - move32(); - } - - /* temp_p1_p2 = (float)sqrt(pow1/pow2); */ - temp_p1_p2 = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp1 ); /* temp_p1_p3 in (Q31+exp1) */ - - /* temp_p1_p3 = (float)sqrt(pow1/pow3); */ - temp_p1_p3 = root_a_over_b_fx( pow1, Q_pow1, pow3, ( 2 * Q_shb + 1 ), &exp2 ); /* temp_p1_p3 in (Q31+exp2) */ - - - sc1 = sub( Q_bwe_exc, sub( Q_frac, exp1 ) ); - sc2 = sub( Q_bwe_exc, sub( Q_shb, exp2 ) ); - FOR( i = 0; i < L_FRAME16k; i++ ) - { - L_tmp1 = Mult_32_16( temp_p1_p2, WN_exc_local[i] ); /* (Q_frac - exp1) +16 */ - WN_exc_local[i] = round_fx( L_tmp1 ); - move16(); - L_tmp2 = Mult_32_16( temp_p1_p3, shb_res_local[i] ); /* (Q_shb - exp2) +16 */ - shb_res_local[i] = round_fx( L_tmp2 ); - move16(); - /* temp_numer1[i] = sub(shb_res_local[i], WN_exc_local[i]); */ - temp_numer1[i] = round_fx_sat( L_sub_sat( L_shl_sat( L_tmp2, sc2 ), L_shl_sat( L_tmp1, sc1 ) ) ); - move16(); - /* (Q_bwe_exc) */ - - /* temp_numer2[i] = sub(exc16kWhtnd[i], WN_exc_local[i]); */ - temp_numer2[i] = sub_sat( exc16kWhtnd[i], round_fx_sat( L_shl_sat( L_tmp1, sc1 ) ) ); - move16(); - /* (Q_bwe_exc) */ - } - - - length = L_FRAME16k; - move16(); - temp_p1_p2 = Dot_product( temp_numer1, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */ - temp_p1_p3 = Dot_product( temp_numer2, temp_numer2, length ); /* 2*(Q_bwe_exc)+1 */ - - /* vf_modified[i] = min( max_val( (temp_p1_p2 / temp_p1_p3), 0.1f), 0.99f); */ - /* tmp = (temp_p1_p2 / temp_p1_p3); */ - IF( temp_p1_p3 > 0 ) - { - expa = norm_l( temp_p1_p3 ); - fraca = extract_h( L_shl( temp_p1_p3, expa ) ); - expa = sub( 30, expa ); - - expb = norm_l( temp_p1_p2 ); - fracb = round_fx_o( L_shl_o( temp_p1_p2, expb, &Overflow ), &Overflow ); - expb = sub( 30, expb ); - - num_flag = 0; - move16(); - IF( fraca < 0 ) - { - num_flag = 1; - move16(); - fraca = negate( fraca ); - } - - den_flag = 0; - move16(); - IF( fracb < 0 ) - { - den_flag = 1; - move16(); - fracb = negate( fracb ); - } - - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl( fracb, scale ); - expb = sub( expb, scale ); - - tmp = div_s( fracb, fraca ); - exp1 = sub( expb, expa ); - tmp = shl_sat( tmp, exp1 ); - if ( NE_16( num_flag, den_flag ) ) - { - tmp = negate( tmp ); - } - } - ELSE - { - tmp = 0; - move16(); - } - - vf_modified[0] = s_min( s_max( tmp, 3277 /* 0.1f in Q15*/ ), 32440 /* 0.99f in Q15 */ ); - move16(); - - *vf_ind = usquant_fx( vf_modified[0], &tmp1, 4096 /* 0.125 in Q15 */, 2048 /* 0.125 in Q14 */, shl( 1, NUM_BITS_SHB_VF ) ); - move16(); - - vf_modified[0] = tmp1; - move16(); - vf_modified[1] = tmp1; - move16(); - vf_modified[2] = tmp1; - move16(); - vf_modified[3] = tmp1; - move16(); - vf_modified[4] = tmp1; - move16(); - - /* vf_modified in Q15 */ - - return; -} -#ifdef ADD_IVAS_TBE_CODE -/*-------------------------------------------------------------------* - * tbe_celp_exc() * - * * - * Prepare adaptive part of TBE excitation * - *-------------------------------------------------------------------*/ - -void tbe_celp_exc( - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - float *bwe_exc, /* i/o: BWE excitation */ - const int16_t L_frame, /* i : frame length */ - const int16_t L_subfr, /* i : subframe length */ - const int16_t i_subfr, /* i : subframe index */ - const int16_t T0, /* i : integer pitch lag */ - const int16_t T0_frac, /* i : fraction of lag */ - float *error, /* i/o: error */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ -) -{ - int16_t i, offset; - - if ( element_mode == IVAS_CPE_TD && idchan == 1 && !tdm_LRTD_flag ) - { - return; - } - - if ( L_frame == L_FRAME ) - { - offset = tbe_celp_exc_offset( T0, T0_frac ); - - for ( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int16_t) *error]; - } - *error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac; - } - else - { - offset = T0 * 2 + (int16_t) ( (float) T0_frac * 0.5f + 4 + 0.5f ) - 4; - for ( i = 0; i < L_subfr * 2; i++ ) - { - bwe_exc[i + i_subfr * 2] = bwe_exc[i + i_subfr * 2 - offset + (int16_t) *error]; - } - *error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac; - } - - return; -} -#endif -/*======================================================================================*/ -/* FUNCTION : prep_tbe_exc_fx() */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Prepare TBE excitation */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) L_frame_fx : length of the frame */ -/* _ (Word16) i_subfr_fx : subframe index */ -/* _ (Word16) gain_pit_fx : Pitch gain (14) */ -/* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */ -/* _ (Word16*[]) code_fx : algebraic excitation (Q9) */ -/* _ (Word16) voice_fac_fx : voicing factor (Q15) */ -/* _ (Word16) gain_preQ_fx : prequantizer excitation gain */ -/* _ (Word16[]) code_preQ_fx : prequantizer excitation */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ -/*--------------------------------------------------------------------------------------*/ - -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================================*/ - -void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#ifdef ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#ifdef ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - const int16_t flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -) -{ - Word16 i; - Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; - Word16 tmp_code_preInt_fx[L_SUBFR]; - Word16 gain_code16 = 0; - move16(); - Word16 tmp /*, tmp1, tmp2*/; - /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ - Word16 pitch; - - Word32 L_tmp, Ltemp1, Ltemp2; - Word32 tempQ31; - Word16 tempQ15; -#ifndef ADD_IVAS_TBE_CODE - Word16 L_subfr = L_SUBFR; - move16(); -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; - = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) - *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */ - tempQ31 = L_deposit_h( VF_1st_PARAM_FX ); - tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); - tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); - *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); - move16(); - tmp = MAX_16; - move16(); - - pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ - - test(); - test(); - IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 /* 115.5 in Q7 */ ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) ) - { - tmp = MAX_16; - move16(); - *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); - move16(); - } - - *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); - move16(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) - { - IF( flag_TD_BWE && i_subfr == 0 ) - { - set16_fx( bwe_exc, 0, L_FRAME32k ); - } - return; - } - -#endif - IF( EQ_16( L_frame_fx, L_FRAME ) ) - { - interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ - gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ - FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ - L_tmp = L_shl_sat( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ - L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ - move16(); - } - } - ELSE - { - IF( gain_preQ_fx != 0 ) - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ - - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ - - tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ - move16(); - } - } - ELSE - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ - move16(); - } - } - - interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < L_subfr * 2; i++ ) - { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] ); /*Q14+Q_exc+1 */ - tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ - move16(); - } - } - - return; -} - -/*======================================================================================*/ -/* FUNCTION : prep_tbe_exc_ivas_fx() */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Prepare TBE excitation */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) L_frame_fx : length of the frame */ -/* _ (Word16) i_subfr_fx : subframe index */ -/* _ (Word16) gain_pit_fx : Pitch gain (14) */ -/* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */ -/* _ (Word16*[]) code_fx : algebraic excitation (Q9) */ -/* _ (Word16) voice_fac_fx : voicing factor (Q15) */ -/* _ (Word16) gain_preQ_fx : prequantizer excitation gain */ -/* _ (Word16[]) code_preQ_fx : prequantizer excitation */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ -/*--------------------------------------------------------------------------------------*/ - -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================================*/ - -void prep_tbe_exc_ivas_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -) -{ - Word16 i; - Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; - Word16 tmp_code_preInt_fx[L_SUBFR]; - Word16 gain_code16 = 0; - move16(); - Word16 tmp /*, tmp1, tmp2*/; - /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ - Word16 pitch; - - Word32 L_tmp, Ltemp1, Ltemp2; - Word32 tempQ31; - Word16 tempQ15; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; - = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) - *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */ - tempQ31 = L_deposit_h( VF_1st_PARAM_FX ); - tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); - tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); - *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); - move16(); - - tmp = MAX_16; - move16(); - - pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ - - test(); - test(); - IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) ) - { - tmp = MAX_16; - move16(); - *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); - move16(); - } - - *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); - move16(); -#if 1 // def ADD_IVAS_TBE_CODE - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) - { - test(); - IF( flag_TD_BWE && i_subfr_fx == 0 ) - { - set16_fx( bwe_exc_fx, 0, L_FRAME32k ); - } - return; - } - -#endif - IF( EQ_16( L_frame_fx, L_FRAME ) ) - { - interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ - gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ - FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ - L_tmp = L_shl( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ - L_tmp = L_mac_o( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC], &Overflow ); /*Q15+Q_exc */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ - move16(); - } - } - ELSE - { - Word16 shift = 4; - move16(); - IF( gain_preQ_fx != 0 ) - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ - - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */ - - tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ - move16(); - } - } - ELSE - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ - move16(); - } - } - - interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < shl( L_subfr, 1 ); i++ ) - { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + shl( i_subfr_fx, 1 )] ); /*Q14+Q_exc+1 */ - tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + shl( i_subfr_fx, 1 )] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ - move16(); - } - } - - return; -} - -/*=============================================================================*/ -/* FUNCTION : void swb_formant_fac_fx ( ) */ -/*------------------------------------------------------------------------------*/ -/* PURPOSE : * Find strength of adaptive formant postfilter using tilt */ -/* of the high band. The 2nd lpc coefficient is used as a tilt approximation. */ -/*------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* const Word16 lpc_shb2 : 2nd HB LPC coefficient Q12 */ -/*------------------------------------------------------------------------------*/ -/*INPUT/OUTPUT ARGUMENTS : */ -/* Word16 *tilt_mem Q12 */ -/* OUTPUT ARGUMENTS : */ -/*------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* formant_fac :Formant filter strength [0,1] Q15 */ -/*------------------------------------------------------------------------------*/ -/* CALLED FROM : */ -/*==============================================================================*/ - -Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ - const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ - Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ -) -{ - Word16 formant_fac; - Word16 tmp; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; -#endif - - /* Smoothen tilt value */ - /* tmp = 0.5f * (float)fabs(lpc_shb2) + 0.5f * *tilt_mem; */ - tmp = mult_r( 16384, abs_s( lpc_shb2 ) ); - tmp = add( tmp, mult_r( 16384, *tilt_mem ) ); /* Q12 */ - *tilt_mem = tmp; - move16(); /*Q12 */ - /* Map to PF strength */ - /* formant_fac = (tmp - SWB_TILT_LOW)*SWB_TILT_DELTA; */ - tmp = sub( tmp, SWB_TILT_LOW_FX ); /* Q12 */ - formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */ - - - IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) ) - { - formant_fac = 4096; /* 1 in Q12 */ - move16(); - } - ELSE IF( formant_fac < 0 ) - { - formant_fac = 0; - move16(); - } - /* now formant_fac in Q12 */ - - /* formant_fac = 1.0f - 0.5f*formant_fac */ - tmp = mult_r( 16384, formant_fac ); /* 0.5 in Q15 */ - formant_fac = shl_o( sub( 4096 /* 1 in Q12 */, tmp ), 3, &Overflow ); - return formant_fac; /*Q15 */ -} - - -void wb_tbe_extras_reset_fx( - Word16 mem_genSHBexc_filt_down_wb2[], - Word16 mem_genSHBexc_filt_down_wb3[] ) -{ - set16_fx( mem_genSHBexc_filt_down_wb2, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); - set16_fx( mem_genSHBexc_filt_down_wb3, 0, 2 * ALLPASSSECTIONS_STEEP + 1 ); - - return; -} - -/*-------------------------------------------------------------------* - * get_tbe_bits() * - * * - * Determine TBE bit consumption per frame from bitrate * - *-------------------------------------------------------------------*/ - - -Word16 get_tbe_bits_fx( - const Word32 total_brate, /* o : TBE bit consumption per frame */ - const Word16 bwidth, /* i : overall bitrate */ - const Word16 rf_mode /* i : bandwidht mode */ -) -{ - Word16 i, bits = 0; - - IF( EQ_16( rf_mode, 1 ) ) - { - /* TBE bits for core, primary frame */ - test(); - test(); - IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) ) - { - /* Gain frame: 4, Gain shapes: 0, and LSFs: 2 */ - bits = NUM_BITS_SHB_FrameGain_LBR_WB + NUM_BITS_LBR_WB_LSF; - move16(); - } - ELSE IF( ( EQ_16( bwidth, SWB ) ) && ( EQ_32( total_brate, ACELP_13k20 ) ) ) - { - /* Gain frame: 5, Gain shapes: 5, and lowrate LSFs: 8 */ - bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8; - move16(); - } - } - ELSE - { - test(); - test(); - IF( ( EQ_16( bwidth, WB ) ) && ( EQ_32( total_brate, ACELP_9k60 ) ) ) - { - bits = NUM_BITS_LBR_WB_LSF + NUM_BITS_SHB_FrameGain_LBR_WB; - move16(); - } - ELSE IF( ( EQ_16( bwidth, SWB ) ) || ( EQ_16( bwidth, FB ) ) ) - { - test(); - IF( EQ_32( total_brate, ACELP_9k60 ) ) - { - bits = NUM_BITS_SHB_FRAMEGAIN + NUM_BITS_SHB_SUBGAINS + 8; - move16(); - } - ELSE IF( ( GE_32( total_brate, ACELP_13k20 ) ) && ( LE_32( total_brate, ACELP_32k ) ) ) - { - bits = NUM_BITS_SHB_SUBGAINS + NUM_BITS_SHB_FRAMEGAIN + NUM_LSF_GRID_BITS + MIRROR_POINT_BITS; - move16(); - - FOR( i = 0; i < NUM_Q_LSF; i++ ) - { - bits = add( bits, lsf_q_num_bits[i] ); - } - } - - if ( GE_32( total_brate, ACELP_24k40 ) ) - { - bits = add( bits, NUM_BITS_SHB_ENER_SF + NUM_BITS_SHB_VF + NUM_BITS_SHB_RES_GS * NB_SUBFR16k ); - } - - test(); - test(); - if ( EQ_16( bwidth, SWB ) && ( EQ_32( total_brate, ACELP_16k40 ) || EQ_32( total_brate, ACELP_24k40 ) ) ) - { - bits = add( bits, BITS_TEC + BITS_TFA ); - } - - if ( EQ_16( bwidth, FB ) ) - { - /* full band slope */ - bits = add( bits, 4 ); - } - } - } - - return bits; -} -- GitLab From 0f4c1288bb56e06eb5c67e125586e3aaa8d8cbcb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 11:18:17 +0200 Subject: [PATCH 0338/1310] deactivate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW to test old bpf --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3ec71d78b..d235b80b9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,7 +95,7 @@ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ -- GitLab From c445baf9df47a0e5cfeb4adcd429b8f6ad3e63ac Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 11:42:26 +0200 Subject: [PATCH 0339/1310] deactivate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index d235b80b9..430b8f22c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -94,7 +94,7 @@ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -- GitLab From 3a53d1a355f2e308b3b9eeb9ed81cd5eaf4f7bd9 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 11:50:50 +0200 Subject: [PATCH 0340/1310] fix conflict --- lib_com/options.h | 104 +--------------------------------------------- 1 file changed, 2 insertions(+), 102 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 550edc5dd..44033b962 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -1,4 +1,3 @@ -<<<<<<< HEAD /****************************************************************************************************** (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, @@ -73,11 +72,6 @@ #define FIX_1378_ACELP_OUT_OF_BOUNDS /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ - -#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ -#define MERGE_REQ - - //#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ #define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ #define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ @@ -90,10 +84,8 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ + +#define TEST_HR //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ @@ -101,97 +93,5 @@ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 - -#endif -======= -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#ifndef OPTIONS_H -#define OPTIONS_H - -/* clang-format off */ - -/* ################### Start DEBUGGING switches ######################## */ - -/*#define DEBUGGING*/ /* Allows debugging message to be printed out during runtime */ -#ifdef DEBUGGING -#define DEBUG_MODE_INFO /* Define to output most important parameters to the subdirectory "res/" */ -#define DEBUG_MODE_INFO_TWEAK /* Enable command line switch to specify subdirectory for debug info output inside "./res/" */ -#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stereo 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ -/*#define DEBUG_FORCE_DIR*/ /* Force modes/parameters by reading from external binary files */ -/*#define DBG_WAV_WRITER*/ /* Enable dbgwrite_wav() function for generating ".wav" files */ -#define SUPPORT_FORCE_TCX10_TCX20 /* VA: Enable -force tcx10|tcx20 command-line option */ -#endif - -#define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ - -/*#define WMOPS*/ /* Activate complexity and memory counters */ -#ifdef WMOPS -/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ -/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ -/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ -/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ -#endif - -/* #################### End DEBUGGING switches ############################ */ - -#ifndef BASOP_NOGLOB_DEV_USE_GLOBALS -#define BASOP_NOGLOB_DECLARE_LOCAL #endif -#define FIX_867_CLDFB_NRG_SCALE - -#define FIX_1378_ACELP_OUT_OF_BOUNDS - -/* Note: each compile switch (FIX_1101_...) is independent from the other ones */ -//#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ -#define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ -/* Both following 2 macros (IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST*) are independent from each other, they refer to different code blocks */ -#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ -//#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version. Obsoleted by MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ -#define HARM_PUSH_BIT -#define HARM_ENC_INIT -//#define HARM_SCE_INIT -#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ -#define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ - -#define TEST_HR - -#endif ->>>>>>> main -- GitLab From ba3a2b47c50e49ca420a2cc663b771826a3b89dc Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 11:56:28 +0200 Subject: [PATCH 0341/1310] delete func1 code --- lib_com/options.h | 1 - lib_com/swb_tbe_com_fx.c | 187 --------------------------------------- 2 files changed, 188 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 44033b962..11cb842d2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -92,6 +92,5 @@ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e6d579269..41c06b920 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6687,181 +6687,6 @@ void wb_tbe_extras_reset_synth_fx( return; } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 -inline static void elliptic_bpf_48k_generic_func1( Word32 *input_fx, Word32 *L_tmp, const Word16 full_band_bpf_fx[][5], Word16 IsUpsampled3, Word32 *L_tmpMax ) -{ - Word32 L_tmpX; - Word16 i; - Word32 L_tmpMax2 = *L_tmpMax; - Word32 L_tmpAbs; - move32(); - IF( !IsUpsampled3 ) - { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#else - FOR( i = 0; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - } -#endif - } /*IsUpsampled3*/ - ELSE - { /*IsUpsampled3*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#else - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - if ( L_tmpMax > 0 ) - { - L_tmpAbs = L_abs( L_tmp[i] ); - } - if ( L_tmpMax > 0 ) - { - L_tmpMax2 = L_max( L_tmpMax2, L_tmpAbs ); - } - i++; - } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ - *L_tmpMax = L_tmpMax2; - move32(); -} -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ - /*-------------------------------------------------------------------* * elliptic_bpf_48k_generic() * @@ -6926,9 +6751,6 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( input_fx, L_tmp, &full_band_bpf_fx[0], IsUpsampled3, 0 ); -#else IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -7028,7 +6850,6 @@ void elliptic_bpf_48k_generic_fx( } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ } /*IsUpsampled3*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7103,9 +6924,6 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( L_tmp, L_tmp2, &full_band_bpf_fx[1], 0, &L_tmpMax ); -#else #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7138,7 +6956,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7224,9 +7041,6 @@ void elliptic_bpf_48k_generic_fx( } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1 /*use subfunc*/ - elliptic_bpf_48k_generic_func1( L_tmp2, L_output, &full_band_bpf_fx[2], 0, &L_tmpMax ); -#else #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7262,7 +7076,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_func1*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From f4f3bcaabe330cff75073d30cbff5880788c8565 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 12:17:00 +0200 Subject: [PATCH 0342/1310] change else path in FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic to old code, delete FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW and change to FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - deactivate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic --- lib_com/options.h | 1 - lib_com/prot_fx.h | 6 +- lib_com/swb_tbe_com_fx.c | 412 +++++++-------------------------------- lib_enc/swb_tbe_enc_fx.c | 12 +- 4 files changed, 77 insertions(+), 354 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 11cb842d2..e01818a87 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -88,7 +88,6 @@ #define TEST_HR //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW /*activates new, spaghetticode version of elliptic_bpf_48k_generic. if inactive, only old code with no opts is active*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 07ef34533..33ac952cc 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3264,17 +3264,13 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word16 isIVAS, #endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal */ Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 41c06b920..010ca2e99 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6693,7 +6693,7 @@ void wb_tbe_extras_reset_synth_fx( * 18th-order elliptic bandpass filter at 14.0 to 20 kHz sampled at 48 kHz * Implemented as 3 fourth order sections cascaded. *-------------------------------------------------------------------*/ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW + void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word16 isIVAS, @@ -6735,10 +6735,6 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); -#else - memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); - memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); -#endif L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); L_tmp2[i - 4] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); // memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); @@ -6747,6 +6743,19 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); +#else + memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); + memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); + memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); + memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); + memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + move32(); + move32(); +#endif + } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic @@ -6852,51 +6861,48 @@ void elliptic_bpf_48k_generic_fx( } /*IsUpsampled3*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[3 - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ move32(); - - FOR( i = 4; i < L_FRAME48k; i++ ) { L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -7001,19 +7007,19 @@ void elliptic_bpf_48k_generic_fx( L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } #endif @@ -7031,6 +7037,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic FOR( j = 0; j < 4; j++ ) { L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); @@ -7039,6 +7046,16 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } +#else + FOR( j = 0; j < 4; j++ ) + { + memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); + memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); + move32(); + move32(); + move32(); + } +#endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -7183,285 +7200,6 @@ void elliptic_bpf_48k_generic_fx( return; } - -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW*/ -void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : input signal Q_input_fx*/ - Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal memory_fx_Q */ - Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ - Word16 memory_fx_Q[], - const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ -) -{ - Word16 i, j; - Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; - Word32 memory2_fx_2[4], memory2_fx_3[4]; - - FOR( i = 0; i < 4; i++ ) - { - memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); - memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - memory2_fx[3][i] = L_shl_sat( memory_fx2[3][i], sub( add( *Q_input_fx, 1 ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - move32(); - move32(); - } - - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } - - memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; - memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; - memory_fx2[0][2] = input_fx[L_FRAME48k - 2]; - memory_fx2[0][3] = input_fx[L_FRAME48k - 1]; - move32(); - move32(); - move32(); - move32(); - move32(); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } - - Q_temp = norm_l( L_tmpMax ); - Q_temp = sub( Q_temp, 4 ); - Scale_sig32( L_tmp2, 960, Q_temp ); - - memory_fx2[1][0] = L_tmp[L_FRAME48k - 4]; - memory_fx2[1][1] = L_tmp[L_FRAME48k - 3]; - memory_fx2[1][2] = L_tmp[L_FRAME48k - 2]; - memory_fx2[1][3] = L_tmp[L_FRAME48k - 1]; - move32(); - move32(); - move32(); - move32(); - move32(); - FOR( j = 0; j < 4; j++ ) - { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - } - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); - - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; - memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; - memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; - memory_fx2[2][3] = L_tmp2[L_FRAME48k - 1]; - memory_fx2[3][0] = L_output[L_FRAME48k - 4]; - memory_fx2[3][1] = L_output[L_FRAME48k - 3]; - memory_fx2[3][2] = L_output[L_FRAME48k - 2]; - memory_fx2[3][3] = L_output[L_FRAME48k - 1]; - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - move32(); - memory_fx_Q[0] = *Q_input_fx; - memory_fx_Q[1] = add( *Q_input_fx, 11 ); - memory_fx_Q[2] = add( add( *Q_input_fx, 6 ), Q_temp ); - memory_fx_Q[3] = add( add( *Q_input_fx, 1 ), Q_temp ); - move16(); - move16(); - move16(); - move16(); - Q_temp2 = norm_l( L_tmpMax ); - Scale_sig32( L_output, 960, Q_temp2 ); - FOR( i = 0; i < 960; i++ ) - { - output_fx[i] = extract_h( L_output[i] ); - move16(); - } - *Q_input_fx = sub( add( add( *Q_input_fx, Q_temp ), Q_temp2 ), 15 ); - move16(); /* BASOP_NOGLOB */ - - return; -} -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW*/ - /*-------------------------------------------------------------------* * synthesise_fb_high_band() * @@ -7526,14 +7264,12 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS #endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 -#endif excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); @@ -7544,14 +7280,12 @@ void synthesise_fb_high_band_fx( ELSE { /* for 12.8kHz ACELP core */ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS #endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 1, // IsUpsampled3 -#endif excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); #else elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 648387bbf..7ad3b2013 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7330,7 +7330,7 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS @@ -7339,9 +7339,7 @@ void fb_tbe_enc_fx( 0, // isIVAS #endif #endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -#endif input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7474,14 +7472,12 @@ void fb_tbe_enc_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS #endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -#endif input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7489,14 +7485,12 @@ void fb_tbe_enc_ivas_fx( } ELSE { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_ACTIVATENEW +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 1, // isIVAS #endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic 0, // IsUpsampled3 -#endif input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -- GitLab From 44d3497339a6203e470bfde23dc795b14f8f6705 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 12:22:42 +0200 Subject: [PATCH 0343/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 010ca2e99..537881fd1 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6755,7 +6755,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); #endif - } #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic @@ -6793,7 +6792,7 @@ void elliptic_bpf_48k_generic_fx( move32(); } #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ + } /*IsUpsampled3*/ ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 @@ -6858,7 +6857,7 @@ void elliptic_bpf_48k_generic_fx( i++; } #endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ + } /*IsUpsampled3*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ -- GitLab From 69d2069538046b46e9fa43c536d3c4697230e206 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 12:43:21 +0200 Subject: [PATCH 0344/1310] activate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index e01818a87..ec61fece6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -87,7 +87,7 @@ #define TEST_HR -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ -- GitLab From 2700c956fbad0ad46d7e3f2fb5e471d2fd92f912 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Tue, 15 Apr 2025 12:36:27 +0530 Subject: [PATCH 0345/1310] Fixes for crashes observed on LTV pipeline --- lib_enc/igf_enc.c | 8 +-- lib_enc/igf_enc_fx.c | 97 +++++++++++++++++++++++++++++++ lib_enc/prot_fx_enc.h | 7 +++ lib_enc/speech_music_classif_fx.c | 19 +++++- 4 files changed, 125 insertions(+), 6 deletions(-) diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index bfb4a7423..9769d83b6 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1171,13 +1171,13 @@ static void IGF_CalculateStereoEnvelope_fx( move16(); // tmp_tb = IGF_getSFM_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]) / IGF_getCrest_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]); - sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); tmp_tb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_tb_fx*/ // tmp_sb = IGF_getSFM_ivas(tileSrcSpec, 0, strt_cpy - tmp) / IGF_getCrest_ivas(tileSrcSpec, 0, strt_cpy - tmp); - sfm = IGF_getSFM( &sfm_exp, tileSrcSpec_fx, &tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, tileSrcSpec_fx, &tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); crest = IGF_getCrest( &crest_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); tmp_sb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_sb_fx*/ @@ -1322,7 +1322,7 @@ static void IGF_CalculateStereoEnvelope_fx( { Word16 shift = shr( width, 1 ); // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); - sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); } @@ -1331,7 +1331,7 @@ static void IGF_CalculateStereoEnvelope_fx( Word16 shift; shift = shr( width, 1 ); // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); - sfm = IGF_getSFM( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); } diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index f508b313f..f78ad2025 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -895,6 +895,103 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value return SFM /*Q15*/; } +/************************************************************************* +calculates spectral flatness measurment +**************************************************************************/ +Word16 IGF_getSFM_ivas_fx( /**< out: Q15| SFM value */ + Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ + const Word32 *energy, /**< in: Q31| energies */ + const Word16 *energy_exp, /**< in: | exponent of energies */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +) +{ + Word16 n, i, s; + Word32 num; + Word32 denom; + Word16 denom_exp; + Word16 invDenom_exp, numf_exp; + Word16 numf; + Word32 SFM32; + Word16 invDenom, SFM; + + num = 0; + move32(); + denom = 65536; // 1.f in Q16 + denom_exp = 15; + *SFM_exp = 0; + move16(); + SFM = 32767 /*1.0f Q15*/; + move16(); + + FOR( i = start; i < stop; i++ ) + { + /*ln(x * 2^-Qx * 2^xExp) = ln(x) - Qx + xExp*/ + + /* n = sub(sub(31,norm_l(tmp32)),1); */ /*<- ld */ + /* n = sub(n,31); */ /*<- -Qx */ + /* n = add(n,*energy_exp); */ /*<- +xExp */ + + n = sub( sub( *energy_exp, norm_l( energy[i] ) ), 1 ); /*<-- short form*/ + + if ( energy[i] == 0 ) /*special case: energy is zero*/ + { + n = 0; + move16(); + } + + n = s_max( 0, n ); + num = L_add( num, L_deposit_l( n ) ); /*Q0*/ + + denom = BASOP_Util_Add_Mant32Exp( energy[i], *energy_exp, denom, denom_exp, &denom_exp ); + } + + /* calculate SFM only if signal is present */ + IF( denom != 0 ) + { + /*numf = (float)num / (float)(stop - start);*/ + numf = BASOP_Util_Divide3216_Scale( num, /*Q0*/ + sub( stop, start ), /*Q0*/ + &s ); /*Q-1 s*/ + numf_exp = add( s, 16 ); /*-> numf Q15 numf_exp*/ + /*denom /= (float)(stop - start);*/ + /*return ((float)pow(2.0, numf + 0.5f) / denom);*/ + + /*SFM= ((float)pow(2.0, numf + 0.5f) * invDenom);*/ + invDenom = BASOP_Util_Divide3232_uu_1616_Scale( L_deposit_l( sub( stop, start ) ) /*Q0*/, + denom /*Q31, denom_exp*/, + &s ); /*Q-16, s-denom_exp*/ + invDenom_exp = add( sub( s, denom_exp ), 31 ); /*invDenom: Q15, invDenom_exp*/ + + /*add .5f to numf*/ + SFM32 = L_add( L_shl( L_deposit_l( numf ), numf_exp ) /*16Q15*/, 16384l /*.5f Q15*/ ); /*16Q15*/ + s = norm_l( SFM32 ); + SFM32 = L_shl( SFM32, s ); + s = sub( 16, s ); /*SFM32(numf) is Q31 now*/ + + /*do the pow2 and the mult*/ + SFM32 = BASOP_util_Pow2( SFM32, s, &s ); + SFM32 = Mpy_32_16_1( SFM32, invDenom ); + *SFM_exp = add( s, invDenom_exp ); + + /*Transform to Q15*/ + s = norm_l( SFM32 ); + SFM = round_fx_sat( L_shl_sat( SFM32, s ) ); + *SFM_exp = sub( *SFM_exp, s ); + move16(); + /**SFM_exp = s_min(*SFM_exp, 0);*/ + IF( *SFM_exp > 0 ) + { + *SFM_exp = 0; + move16(); + SFM = 32767 /*1.0f Q15*/; + move16(); + } + } + + return SFM /*Q15*/; +} + /**********************************************************************/ /* calculates the IGF whitening levels by SFM and crest **************************************************************************/ diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index d6532b207..c83f30ba7 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -3066,6 +3066,13 @@ Word16 IGF_getSFM( /**< out: Q15| SFM value const Word16 start, /**< in: Q0 | start subband index */ const Word16 stop /**< in: Q0 | stop subband index */ ); +Word16 IGF_getSFM_ivas_fx( /**< out: Q15| SFM value */ + Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ + const Word32 *energy, /**< in: Q31| energies */ + const Word16 *energy_exp, /**< in: | exponent of energies */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +); /* IGFEnc.c */ void IGF_ErodeSpectrum( Word16 *highPassEner_exp, /**< out: | exponent of highPassEner */ const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 3f6449a0c..4d8f59152 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -1937,6 +1937,7 @@ Word16 ivas_smc_gmm_fx( /* calculation of differential normalized power spectrum */ sum_PS_fx = 0; move32(); + Word16 q_temp32; Word16 sum_PS_e = 0; move16(); Word64 sum = W_shl( 21475 /* 1e-5 in Q31 */, sub( Qfact_PS, 30 ) ); // Qfact_PS+1 @@ -1961,8 +1962,22 @@ Word16 ivas_smc_gmm_fx( FOR( i = LOWEST_FBIN; i < HIGHEST_FBIN; i++ ) { - temp32 = BASOP_Util_Divide3232_Scale_cadence( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp - PS_norm_fx[i] = L_shl( temp32, sub( Qfact_PS_past, add( sub( 31, temp_exp ), sub( Qfact_PS, sub( 31, sum_PS_e ) ) ) ) ); // Qfact_PS_past + temp32 = BASOP_Util_Divide3232_Scale_cadence( PS_fx[i], sum_PS_fx, &temp_exp ); // 31-temp_exp + q_temp32 = add( sub( 31, temp_exp ), sub( Qfact_PS, sub( 31, sum_PS_e ) ) ); + test(); + if ( temp32 == 0 ) + { + q_temp32 = 31; + move16(); + } + IF( LT_16( q_temp32, 31 ) && EQ_32( temp32, L_shl( 1, q_temp32 ) ) ) + { + temp32 = ONE_IN_Q31; + move32(); + q_temp32 = Q31; + move16(); + } + PS_norm_fx[i] = L_shl( temp32, sub( Qfact_PS_past, q_temp32 ) ); // Qfact_PS_past move32(); dPS_fx[i] = L_abs( L_sub( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ) ); move32(); -- GitLab From 71be43e779165e5aabefcb3dece4e6e9dfdcf0fd Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 12:51:19 +0200 Subject: [PATCH 0346/1310] fix STAGE2 --- lib_com/swb_tbe_com_fx.c | 304 +++++++++++++++++++++------------------ 1 file changed, 163 insertions(+), 141 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 537881fd1..6a6129957 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6762,102 +6762,113 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + /*duplicate this into unrolled loopsections in IsUpsampled3-path and dont forget to delete 0-set-input[1,2,4,5,7,8...]*/ + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ + } /*IsUpsampled3*/ ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; ) - { - W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; - - W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); - W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); - L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ - move32(); - i++; + IF( isIVAS ) + { + FOR( i = 0; i < L_FRAME48k; ) + { + W_tmpX = W_mac_16_16( 0, input_fx[i - 3], full_band_bpf_fx[0][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpX = W_mac_16_16( 0, input_fx[i - 4], full_band_bpf_fx[0][4] ); + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + + W_tmpY = W_msu_32_16( 0, L_tmp[i - 1], full_band_bpf_fx[3][1] ); + W_tmpX = W_mac_16_16( 0, input_fx[i - 2], full_band_bpf_fx[0][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); + L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ + move32(); + i++; + } } -#else - FOR( i = 0; i < L_FRAME48k; ) - { - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; - - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + { + FOR( i = 0; i < L_FRAME48k; ) + { + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), 0 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + + L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; - L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - i++; + L_tmpX = L_sub_sat( 0, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ + move32(); + i++; + } } -#endif /*#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - } /*IsUpsampled3*/ + + } /*IsUpsampled3*/ #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ @@ -6930,38 +6941,43 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); - W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); - L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp[i - 4], full_band_bpf_fx[1][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 3], full_band_bpf_fx[1][3] ); + W_tmpY = W_msu_32_16( 0, L_tmp2[i - 1], full_band_bpf_fx[4][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 2], full_band_bpf_fx[1][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 2], full_band_bpf_fx[4][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i - 1], full_band_bpf_fx[1][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); + L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ + L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ @@ -7058,40 +7074,46 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - FOR( i = 0; i < L_FRAME48k; i++ ) + IF( isIVAS ) { - W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); - W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); - W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); - W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); - L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + W_tmpX = W_mac_32_16( 0, L_tmp2[i - 4], full_band_bpf_fx[2][4] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 3], full_band_bpf_fx[2][3] ); + W_tmpY = W_msu_32_16( 0, L_output[i - 1], full_band_bpf_fx[5][1] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 2], full_band_bpf_fx[2][2] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 2], full_band_bpf_fx[5][2] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i - 1], full_band_bpf_fx[2][1] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); + W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); + W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); + L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ - FOR( i = 0; i < L_FRAME48k; i++ ) + ELSE +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + FOR( i = 0; i < L_FRAME48k; i++ ) + { + L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ + L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ + move32(); + L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); + } } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ + #else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From ebe0992c04b634a2e448b8da929ee576c9ba9527 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 13:28:40 +0200 Subject: [PATCH 0347/1310] activate STAGE2 with isIVAS 1 in all cases --- lib_com/options.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ec61fece6..490109b56 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -89,7 +89,7 @@ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ #endif -- GitLab From 99e90164fe3cc9dbd7424070def89a464f3b2cee Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 13:33:08 +0200 Subject: [PATCH 0348/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 6a6129957..f6eff2f35 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7114,7 +7114,7 @@ void elliptic_bpf_48k_generic_fx( } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ +#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ -- GitLab From a43b1a9ccee810967ab7c13d3b8d73f228dd7f57 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 13:38:58 +0200 Subject: [PATCH 0349/1310] fix unused parameter --- lib_com/swb_tbe_com_fx.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index f6eff2f35..30ce3b650 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7288,7 +7288,11 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS 1, // isIVAS +#else + isIVAS, +#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx @@ -7304,7 +7308,11 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS 1, // isIVAS +#else + isIVAS, +#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); -- GitLab From 1132ef4545af681636bba726ad467737e60c23fb Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 13:40:40 +0200 Subject: [PATCH 0350/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 30ce3b650..4f73165c2 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7291,7 +7291,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS 1, // isIVAS #else - isIVAS, + isIVAS, #endif #endif 1, // IsUpsampled3 @@ -7311,7 +7311,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS 1, // isIVAS #else - isIVAS, + isIVAS, #endif #endif 1, // IsUpsampled3 -- GitLab From f103c93f4ee7d261dff8f0771dc3792ba4374e9b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 13:44:01 +0200 Subject: [PATCH 0351/1310] fix unused parameter --- lib_com/swb_tbe_com_fx.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 4f73165c2..21bb4eaeb 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7267,6 +7267,10 @@ void synthesise_fb_high_band_fx( Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS + isIVAS = 1; +#endif + /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7288,11 +7292,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS - 1, // isIVAS -#else isIVAS, -#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx @@ -7308,11 +7308,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS - 1, // isIVAS -#else isIVAS, -#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); -- GitLab From c9506c850340f63ac3b8031fc8c6c5b61bc4620d Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Tue, 15 Apr 2025 17:07:03 +0530 Subject: [PATCH 0352/1310] Fix for a crash in LTV complexity measurement pipeline --- lib_dec/fd_cng_dec_fx.c | 49 ++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 4c42a7959..0309771ff 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1536,8 +1536,8 @@ Word16 ApplyFdCng_ivas_fx( Word16 shift2 = L_norm_arr( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ) ); Word16 shift = s_max( sub( hFdCngDec->bandNoiseShape_exp, shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); - scale_sig32( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( sub( hFdCngDec->bandNoiseShape_exp, shift1 ), shift ) ); - scale_sig32( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ), sub( sub( *cngNoiseLevel_exp, shift2 ), shift ) ); + scale_sig32( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( hFdCngDec->bandNoiseShape_exp, shift ) ); + scale_sig32( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ), sub( *cngNoiseLevel_exp, shift ) ); *cngNoiseLevel_exp = shift; move16(); @@ -1688,16 +1688,15 @@ Word16 ApplyFdCng_ivas_fx( move32(); } } - /* adapt scaling for rest of the buffer */ - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; j < FFTCLDFBLEN; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } + Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); + Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); + Word16 shift = s_max( sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); + scale_sig32( cngNoiseLevel, j, sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift ) ); + scale_sig32( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ), sub( *cngNoiseLevel_exp, shift ) ); + + *cngNoiseLevel_exp = shift; move16(); } } @@ -1761,18 +1760,15 @@ Word16 ApplyFdCng_ivas_fx( move32(); } } - /* adapt scaling for rest of the buffer */ - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; j < FFTCLDFBLEN; j++ ) - { - /* NOTE: saturation is added here as part of issue 1218 fix. after rescaling the fdcng noise estimation buffers, due to slight precision loss, values may slightly overflow */ - cngNoiseLevel[j] = L_shl_sat( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } + Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); + Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); + Word16 shift = s_max( sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); + scale_sig32( cngNoiseLevel, j, sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift ) ); + scale_sig32( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ), sub( *cngNoiseLevel_exp, shift ) ); - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); + *cngNoiseLevel_exp = shift; move16(); } } @@ -2399,8 +2395,15 @@ void perform_noise_estimation_dec_ivas_fx( ELSE { Copy32( msPeriodog, msNoiseEst, npart ); - scale_sig32( &msNoiseEst[npart], sub( NPART_SHAPING, npart ), sub( hFdCngDec->msNoiseEst_exp, hFdCngDec->msPeriodog_exp ) ); - hFdCngDec->msNoiseEst_exp = hFdCngDec->msPeriodog_exp; + + Word16 shift1 = L_norm_arr( msNoiseEst, npart ); + Word16 shift2 = L_norm_arr( &msNoiseEst[npart], sub( NPART_SHAPING, npart ) ); + Word16 shift = s_max( sub( hFdCngDec->msPeriodog_exp, shift1 ), sub( hFdCngDec->msNoiseEst_exp, shift2 ) ); + + scale_sig32( msNoiseEst, npart, sub( hFdCngDec->msPeriodog_exp, shift ) ); + scale_sig32( &msNoiseEst[npart], sub( NPART_SHAPING, npart ), sub( hFdCngDec->msNoiseEst_exp, shift ) ); + + hFdCngDec->msNoiseEst_exp = shift; move16(); } @@ -5071,8 +5074,8 @@ void FdCng_decodeSID_ivas_fx( Word16 shift2 = L_norm_arr( hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopBand, hFdCngCom->startBand ) ) ); Word16 shift = s_max( sub( hFdCngCom->sidNoiseEstExp, shift1 ), sub( hFdCngCom->cngNoiseLevelExp, shift2 ) ); - scale_sig32( hFdCngCom->cngNoiseLevel, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( sub( hFdCngCom->sidNoiseEstExp, shift1 ), shift ) ); - scale_sig32( hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopBand, hFdCngCom->startBand ) ), sub( sub( hFdCngCom->cngNoiseLevelExp, shift2 ), shift ) ); + scale_sig32( hFdCngCom->cngNoiseLevel, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( hFdCngCom->sidNoiseEstExp, shift ) ); + scale_sig32( hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopBand, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopBand, hFdCngCom->startBand ) ), sub( hFdCngCom->cngNoiseLevelExp, shift ) ); hFdCngCom->cngNoiseLevelExp = shift; move16(); -- GitLab From c0b894982c8fbbaee1ba6ee3574c44c0e5f72054 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 15 Apr 2025 14:10:28 +0200 Subject: [PATCH 0353/1310] cleanup --- lib_com/options.h | 1 + lib_enc/ivas_stereo_dmx_evs_fx.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5ed2aa912..43c3c3038 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,6 +84,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ +#define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ #define TEST_HR diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 042a2e541..6e04b91c7 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -2419,7 +2419,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( fad_g = hStereoDmxEVS->hPHA->fad_g_fx; // fad_r = 1.0f / (float) ( fad_len + 1 ); -#if 1 +#ifdef FIX_1481_HARDCODE_DIV SWITCH( fad_len ) { case STEREO_DMX_EVS_FAD_LEN_16: @@ -2564,7 +2564,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; // fad_r = 1.0f / (float) ( fad_len + 1 ); -#if 1 +#ifdef FIX_1481_HARDCODE_DIV SWITCH( fad_len ) { case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 16: -- GitLab From f47deccf0a64382b75f87d469c8584a495afe1fb Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Tue, 15 Apr 2025 17:46:50 +0530 Subject: [PATCH 0354/1310] Fix for 3GPP issue 1477: Encoder crash (assert) in ISM1, HQ core fine gain quantization --- lib_com/pvq_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/pvq_com_fx.c b/lib_com/pvq_com_fx.c index a6c0bc462..1adcdb7ae 100644 --- a/lib_com/pvq_com_fx.c +++ b/lib_com/pvq_com_fx.c @@ -564,8 +564,8 @@ void fine_gain_quant_fx( tmp1 = extract_l( Pow2( 14, tmp1 ) ); exp1 = sub( 14, exp1 ); - L_tmp = L_mult0( fg_pred[band], tmp1 ); /*12+exp1 */ - fg_pred[band] = round_fx( L_shl( L_tmp, sub( 16, exp1 ) ) ); /*12+exp1+16-exp1-16=12 */ + L_tmp = L_mult0( fg_pred[band], tmp1 ); /*12+exp1 */ + fg_pred[band] = round_fx_sat( L_shl_sat( L_tmp, sub( 16, exp1 ) ) ); /*12+exp1+16-exp1-16=12 */ move16(); } } -- GitLab From 627abb06732e9b163f0b271ea79a3898156d88cc Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 14:54:49 +0200 Subject: [PATCH 0355/1310] use FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE --- lib_com/options.h | 3 ++- lib_com/prot_fx.h | 8 ++++++++ lib_com/swb_tbe_com_fx.c | 43 ++++++++++++++++++++++++++++++++++++---- lib_dec/swb_tbe_dec_fx.c | 16 +++++++++------ lib_enc/swb_tbe_enc_fx.c | 26 +++++++++++++++--------- 5 files changed, 76 insertions(+), 20 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 490109b56..e3ac4ccfb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -90,6 +90,7 @@ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ + #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE /*according to comment of @vaclav in MR!1390*/ /*overrides STAGE2 settings*/ + //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 33ac952cc..05fc12bd9 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3267,7 +3267,11 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + const int16_t element_mode, +#else Word16 isIVAS, +#endif #endif Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -3302,8 +3306,12 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + int16_t element_mode +#else Word16 isIVAS #endif +#endif ); void prep_tbe_exc_fx( diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 21bb4eaeb..cf6161e57 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,8 +6696,12 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + int16_t element_mode, +#else Word16 isIVAS, #endif +#endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -6711,6 +6715,13 @@ void elliptic_bpf_48k_generic_fx( const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + element_mode = 1; +#else + isIVAS = 1; +#endif +#endif Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; @@ -6762,7 +6773,11 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + IF(element_mode) +#else IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6801,7 +6816,11 @@ void elliptic_bpf_48k_generic_fx( ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + IF(element_mode) +#else IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; ) { @@ -6941,7 +6960,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + IF(element_mode) +#else IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7074,7 +7097,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + IF(element_mode) +#else IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7250,8 +7277,12 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + int16_t element_mode +#else Word16 isIVAS #endif +#endif ) { Word16 i, j; @@ -7267,10 +7298,6 @@ void synthesise_fb_high_band_fx( Word32 L_tmp; Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS - isIVAS = 1; -#endif - /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; /* white excitation from DC to 8 kHz resampled to produce DC to 24 kHz excitation. */ @@ -7292,7 +7319,11 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + element_mode , +#else isIVAS, +#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx @@ -7308,7 +7339,11 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + element_mode, +#else isIVAS, +#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index e910e5457..5ab562fe2 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4646,14 +4646,13 @@ void fb_tbe_dec_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS - , - 1 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + ,st->element_mode #else , 0 -#endif -#endif +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); /* add the fb_synth component to the hb_synth component */ @@ -4725,9 +4724,14 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + , + st->element_mode +#else , 1 -#endif +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); test(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 7ad3b2013..990a44d19 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7333,12 +7333,12 @@ void fb_tbe_enc_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS - 1, // isIVAS +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + st->element_mode, #else - 0, // isIVAS -#endif -#endif + 0, +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else @@ -7475,8 +7475,12 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS -#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + st->element_mode, +#else + 1, +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else @@ -7488,8 +7492,12 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - 1, // isIVAS -#endif +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + st->element_mode, +#else + 1, +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else -- GitLab From db0bbc7d9f233eef3ef4c0653aa009a9c13268cd Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 15 Apr 2025 15:11:41 +0200 Subject: [PATCH 0356/1310] clang patch --- lib_com/options.h | 2 +- lib_com/prot_fx.h | 4 ++-- lib_com/swb_tbe_com_fx.c | 12 ++++++------ lib_dec/swb_tbe_dec_fx.c | 3 ++- lib_enc/swb_tbe_enc_fx.c | 12 ++++++------ 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e3ac4ccfb..daf2be13b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -/*#define WMOPS*/ /* Activate complexity and memory counters */ +#define WMOPS /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 05fc12bd9..1d2873dc4 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3268,7 +3268,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - const int16_t element_mode, + const int16_t element_mode, #else Word16 isIVAS, #endif @@ -3307,7 +3307,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - int16_t element_mode + int16_t element_mode #else Word16 isIVAS #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index cf6161e57..10f508489 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6697,7 +6697,7 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - int16_t element_mode, + int16_t element_mode, #else Word16 isIVAS, #endif @@ -6774,7 +6774,7 @@ void elliptic_bpf_48k_generic_fx( { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - IF(element_mode) + IF( element_mode ) #else IF( isIVAS ) #endif @@ -6817,7 +6817,7 @@ void elliptic_bpf_48k_generic_fx( { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - IF(element_mode) + IF( element_mode ) #else IF( isIVAS ) #endif @@ -6961,7 +6961,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - IF(element_mode) + IF( element_mode ) #else IF( isIVAS ) #endif @@ -7098,7 +7098,7 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - IF(element_mode) + IF( element_mode ) #else IF( isIVAS ) #endif @@ -7320,7 +7320,7 @@ void synthesise_fb_high_band_fx( elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - element_mode , + element_mode, #else isIVAS, #endif diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 5ab562fe2..c02a6a182 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4647,7 +4647,8 @@ void fb_tbe_dec_fx( synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - ,st->element_mode + , + st->element_mode #else , 0 diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 990a44d19..29ef4427a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7337,8 +7337,8 @@ void fb_tbe_enc_fx( st->element_mode, #else 0, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else @@ -7479,8 +7479,8 @@ void fb_tbe_enc_ivas_fx( st->element_mode, #else 1, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else @@ -7496,8 +7496,8 @@ void fb_tbe_enc_ivas_fx( st->element_mode, #else 1, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); #else -- GitLab From c227804b934b0cb380dd4cd5ec60c20660266d43 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 15 Apr 2025 19:41:45 +0200 Subject: [PATCH 0357/1310] clang-format --- lib_dec/acelp_core_dec_ivas_fx.c | 11 +---------- lib_dec/fd_cng_dec_fx.c | 4 ++-- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index 6cecf8323..ad8ca9b50 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -848,16 +848,7 @@ ivas_error acelp_core_dec_ivas_fx( Copy_Scale_sig( syn1_fx, temp_buf_fx, st->L_frame, sub( -1, st->Q_syn ) ); // Q_syn -> Q(-1) IF( st->hBWE_FD != NULL ) { -#ifdef REMOVE_EVS_DUPLICATES - IF( EQ_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - this is likely a bug in IVAS - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } - ELSE -#endif - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); } } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index f881d252d..dbb13de12 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1241,7 +1241,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1565,7 +1565,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } -- GitLab From f34b6383bddca55252f3f7671c9c19461b5f62b2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 15 Apr 2025 20:41:00 +0200 Subject: [PATCH 0358/1310] convert remaining places in ivas_stereo_dmx_evs_fx.c --- lib_enc/ivas_stereo_dmx_evs_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 625ff8ee9..425685529 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -830,7 +830,7 @@ static void calc_poc_fx( // ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( Nr, Nr ), shl( Nr_e, 1 ), Mpy_32_32_r( Ni, Ni ), shl( Ni_e, 1 ), &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( eneL, eneR ), add( eneL_e, eneR_e ), EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); - ICCr = BASOP_Util_Divide3232_Scale_cadence( L_tmp1, L_tmp2, &L_tmp_e ); + ICCr = BASOP_Util_Divide3232_Scale_newton( L_tmp1, L_tmp2, &L_tmp_e ); L_tmp_e = add( L_tmp_e, sub( L_tmp1_e, L_tmp2_e ) ); ICCr = Sqrt32( ICCr, &L_tmp_e ); // Saturation to handle values close to 1.0f @@ -1891,7 +1891,7 @@ void stereo_dmx_evs_enc_fx( } L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( subframe_energy[m], L_tmp1, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); // if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDmxEVS->hPHA->crst_fctr_fx, 31 ) > 0 ) @@ -1919,7 +1919,7 @@ void stereo_dmx_evs_enc_fx( FOR( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) { L_tmp1 = BASOP_Util_Add_Mant32Exp( subframe_energy[m - 1], subframe_energy_e[m - 1], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_newton( subframe_energy[m], L_tmp1, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); // if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, STEREO_DMX_EVS_TRNS_DTC_INST_Q0, 31 ) > 0 ) -- GitLab From 2ccf2c7cf2dd04348a9f6cedac75caaeb6ba2aa0 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Wed, 16 Apr 2025 06:47:41 +0530 Subject: [PATCH 0359/1310] Fix for 3GPP issue 1470: Increased noise in 6-14 kHz range with ParamBin rendering of MASA to STEREO using BASOP decoder --- lib_dec/fd_cng_dec_fx.c | 6 +++--- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 0309771ff..55c491efe 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -5664,7 +5664,7 @@ void generate_masking_noise_dirac_ivas_fx( scale_fx = L_shl( scale_fx, q_shift ); /*q_scale+q_shift*/ q_scale = add( q_scale, q_shift ); scale_fx = Mpy_32_32( scale_fx, Mpy_32_16_1( L_mult( h_cldfb->scale, h_cldfb->scale ), CLDFB_SCALING ) ); // Q = q_scale + 2 * Q8 - 34 - q_scale = sub( add( q_scale, 2 * Q8 ), 31 ); + q_scale = sub( add( q_scale, 2 * Q8 ), 31 + 3 ); ptr_level_fx = hFdCngCom->cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); /*Q31 - hFdCngCom->cngNoiseLevelExp*/ q_ptr_level = sub( 31, hFdCngCom->cngNoiseLevelExp ); @@ -5675,8 +5675,8 @@ void generate_masking_noise_dirac_ivas_fx( q_shift = norm_l( scale_fx ); scale_fx = L_shl( scale_fx, q_shift ); /*q_scale+q_shift*/ q_scale = add( q_scale, q_shift ); - num = Mpy_32_32( scale_fx, *ptr_level_fx ); /*q_num*/ - q_num = sub( add( q_scale, q_ptr_level ), 31 ); + num = Mpy_32_32( scale_fx, *ptr_level_fx ); /*q_num*/ + q_num = sub( add( q_scale, q_ptr_level ), 31 - 1 ); // num = ( scale * *ptr_level ) * 0.5f exp = sub( 31, q_num ); num = Sqrt32( num, &exp ); /*Q31 - exp*/ /* Real part in CLDFB band */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index ce602160f..c7b420e38 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -758,6 +758,9 @@ static void ivas_dirac_dec_binaural_internal_fx( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, 0, &q_cldfb[1][slot] ); + scale_sig32( Cldfb_RealBuffer_in_fx[1][slot], CLDFB_NO_CHANNELS_MAX, negate( add( sub( q_cldfb[1][slot], q_input ), 5 ) ) ); + scale_sig32( Cldfb_ImagBuffer_in_fx[1][slot], CLDFB_NO_CHANNELS_MAX, negate( add( sub( q_cldfb[1][slot], q_input ), 5 ) ) ); + /* LB: Copy first channel + LB-CNG to first and second channels with same scaling (dual-mono)*/ FOR( b = 0; b < numCoreBands; b++ ) { -- GitLab From 1daee4188980cd56ac1bcfbb35ff009c8da527a0 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 07:36:04 +0200 Subject: [PATCH 0360/1310] test STAGE2_saturationmode2 --- lib_com/options.h | 7 ++++--- lib_com/swb_tbe_com_fx.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index daf2be13b..e07899557 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -87,10 +87,11 @@ #define TEST_HR -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ /*0.9 WMOPS*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ /*3.2 WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE /*according to comment of @vaclav in MR!1390*/ /*overrides STAGE2 settings*/ - //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ +// #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 10f508489..c5b2941d5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6791,7 +6791,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr(W_tmpX,3), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); } } @@ -6830,7 +6834,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); i++; @@ -6840,7 +6848,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); i++; @@ -6849,7 +6861,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); i++; } @@ -6977,7 +6993,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); +#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } @@ -7114,7 +7134,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); +#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -- GitLab From 1de6bb47406cb7108ee6e67ac29762a7a50e5080 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 07:39:36 +0200 Subject: [PATCH 0361/1310] clang patch --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c5b2941d5..2900d54e9 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6792,7 +6792,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr(W_tmpX,3), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ #else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ #endif -- GitLab From b40fc402017aecf7982e099cba73fad32ad20e1b Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 16 Apr 2025 07:58:24 +0200 Subject: [PATCH 0362/1310] Reactivate FIX_1379_MASA_ANGLE_ROUND after merge with conflict resolution. --- lib_com/options.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 43c3c3038..ad220450b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -71,6 +71,8 @@ #define FIX_1378_ACELP_OUT_OF_BOUNDS +#define FIX_1379_MASA_ANGLE_ROUND + /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ //#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ #define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ -- GitLab From c00e57f2c7b4911f742516dcf13bd7cfc14861dd Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 08:36:13 +0200 Subject: [PATCH 0363/1310] delete FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS, FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2, made FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 permanent active. WMOPS for bitstream in issue 1439: general patch: .9 WMOPS - nonBE, no regressions, STAGE2 patch: 3.2 WMOPS - 1 small regression --- lib_com/options.h | 7 ++--- lib_com/prot_fx.h | 8 ----- lib_com/swb_tbe_com_fx.c | 63 ---------------------------------------- lib_dec/swb_tbe_dec_fx.c | 10 ------- lib_enc/swb_tbe_enc_fx.c | 12 -------- 5 files changed, 2 insertions(+), 98 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3ce190efc..84aac4489 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -88,11 +88,8 @@ #define TEST_HR -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ /*0.9 WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: nonBE, 0 regressions - reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ /*3.2 WMOPS*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE /*according to comment of @vaclav in MR!1390*/ /*overrides STAGE2 settings*/ -// #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1d2873dc4..8d70b1092 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3267,11 +3267,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE const int16_t element_mode, -#else - Word16 isIVAS, -#endif #endif Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -3306,11 +3302,7 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode -#else - Word16 isIVAS -#endif #endif ); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2900d54e9..a3b4bd5c6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,11 +6696,7 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode, -#else - Word16 isIVAS, -#endif #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -6715,13 +6711,6 @@ void elliptic_bpf_48k_generic_fx( const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - element_mode = 1; -#else - isIVAS = 1; -#endif -#endif Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; @@ -6773,11 +6762,7 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6791,11 +6776,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); } } @@ -6820,11 +6801,7 @@ void elliptic_bpf_48k_generic_fx( ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; ) { @@ -6834,11 +6811,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); i++; @@ -6848,11 +6821,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); i++; @@ -6861,11 +6830,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); i++; } @@ -6976,11 +6941,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6993,11 +6954,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); -#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } @@ -7117,11 +7074,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7134,11 +7087,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); -#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } @@ -7301,11 +7250,7 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode -#else - Word16 isIVAS -#endif #endif ) { @@ -7343,11 +7288,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE element_mode, -#else - isIVAS, -#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx @@ -7363,11 +7304,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE element_mode, -#else - isIVAS, -#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index c02a6a182..890e0e5c8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4646,13 +4646,8 @@ void fb_tbe_dec_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE , st->element_mode -#else - , - 0 -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); @@ -4725,13 +4720,8 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE , st->element_mode -#else - , - 1 -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 29ef4427a..4f10d3b02 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7333,11 +7333,7 @@ void fb_tbe_enc_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, -#else - 0, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7475,11 +7471,7 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, -#else - 1, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7492,11 +7484,7 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, -#else - 1, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -- GitLab From f33357542fca749ec15cc69f253b8254c1522040 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 07:32:47 +0000 Subject: [PATCH 0364/1310] delete some code from another ticket and some empty lines --- lib_com/options.h | 4 +--- lib_com/swb_tbe_com_fx.c | 3 --- lib_com/tools_fx.c | 26 +------------------------- lib_dec/ivas_stereo_icbwe_dec_fx.c | 10 ---------- lib_dec/swb_tbe_dec_fx.c | 10 ---------- 5 files changed, 2 insertions(+), 51 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 84aac4489..1ada99f53 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -#define WMOPS /* Activate complexity and memory counters */ +/*#define WMOPS*/ /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -87,9 +87,7 @@ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ #define TEST_HR - #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: nonBE, 0 regressions - reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ #endif - diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a3b4bd5c6..6ac3ee725 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7038,7 +7038,6 @@ void elliptic_bpf_48k_generic_fx( } #endif - Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -7180,10 +7179,8 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - #endif - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 6dc1c45f2..5f0e172bf 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,37 +794,13 @@ void Copy_Scale_sig_16_32_no_sat( } return; } -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat - L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - - IF( L_tmp >= 0x7FFF ) - { - FOR( i = 0; i < lg; i++ ) - { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* Overflow can occur here */ - } - return; - } - // ELSE - { - Word16 tmp = extract_l( L_tmp ); - FOR( i = 0; i < lg; i++ ) - { - y[i] = L_mult( x[i], tmp ); - move32(); - } - } -#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* Overflow can occur here */ + move32(); /* saturation can occur here */ } -#endif } void Copy_Scale_sig_32_16( diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index 772eb2d7d..c7bc98566 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,9 +904,6 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); -#endif FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -914,17 +911,10 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - if ( LE_16( alpha_fx, winSlope_fx_ ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ - } -#else IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } -#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 890e0e5c8..419d202fc 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7032,24 +7032,14 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); - -#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx - Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 -#endif - FOR( i = 0; i < L_FRAME16k; i++ ) { -#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } -#else - Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ -#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); -- GitLab From 930e90a4fc862e5165ba4f81a77dce68b745449e Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 16 Apr 2025 10:10:41 +0200 Subject: [PATCH 0365/1310] fix in ApplyFdCng_ivas_fx() --- lib_dec/fd_cng_dec_fx.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index dbb13de12..5c649df9b 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1241,7 +1241,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1565,7 +1565,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } @@ -1757,15 +1757,35 @@ Word16 ApplyFdCng_ivas_fx( } } - Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); - Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); - Word16 shift = s_max( sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); +#ifdef REMOVE_EVS_DUPLICATES + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + /* adapt scaling for rest of the buffer */ + s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); + FOR( ; k < hFdCngCom->npart; k++ ) + { + FOR( ; j <= hFdCngCom->part[k]; j++ ) + { + cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ + move32(); + } + } + *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); + move16(); + } + ELSE +#endif + { + Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); + Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); + Word16 shift = s_max( sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift1 ), sub( *cngNoiseLevel_exp, shift2 ) ); - scale_sig32( cngNoiseLevel, j, sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift ) ); - scale_sig32( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ), sub( *cngNoiseLevel_exp, shift ) ); + scale_sig32( cngNoiseLevel, j, sub( add( hFdCngDec->bandNoiseShape_exp, s2 ), shift ) ); + scale_sig32( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ), sub( *cngNoiseLevel_exp, shift ) ); - *cngNoiseLevel_exp = shift; - move16(); + *cngNoiseLevel_exp = shift; + move16(); + } } } ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) -- GitLab From 9d14ced3fbf85af53dec45d1e3f8c8c040f35d64 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 16 Apr 2025 10:24:15 +0200 Subject: [PATCH 0366/1310] clang-format --- lib_dec/fd_cng_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 2bab16e04..d0fd178f2 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1241,7 +1241,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1565,7 +1565,7 @@ Word16 ApplyFdCng_ivas_fx( } ELSE #endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } -- GitLab From 298c2401ea8e092b9a7d3e62260632ac73f6efb6 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Wed, 16 Apr 2025 14:31:39 +0530 Subject: [PATCH 0367/1310] Fix for LTV Multichannel 5_1 at 13.2 kbps 48kHz stream crash --- lib_com/gs_preech_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/gs_preech_fx.c b/lib_com/gs_preech_fx.c index 48ec22a22..16d3ce0e5 100644 --- a/lib_com/gs_preech_fx.c +++ b/lib_com/gs_preech_fx.c @@ -233,7 +233,7 @@ void pre_echo_att_ivas_fx( tmp = BASOP_Util_Divide3232_Scale( *Last_frame_ener_fx, etmp_fx, &tmp_e ); /* numerator Q = 2 * Q_new + 1; denominator Q = 31 - tmp_e */ tmp_e = add( tmp_e, sub( sub( 31, etmp_e ), add( shl( Q_new, 1 ), 1 ) ) ); /* tmp_e = tmp_e + (31 - tmp_e) - (2 * Q_new + 1) */ tmp = Sqrt16( tmp, &tmp_e ); - ratio_fx = shr( tmp, sub( 2, tmp_e ) ); /* Q13 */ + ratio_fx = shr_sat( tmp, sub( 2, tmp_e ) ); /* Q13 */ /* Pre-echo atttenuation should never increase the energy */ ratio_fx = s_min( ratio_fx, 8192 /* 1 in Q13 */ ); /* Q13 */ -- GitLab From d44872b1cf0bdd372055b00ee2dfdc9808b701c6 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 11:43:56 +0200 Subject: [PATCH 0368/1310] activate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1ada99f53..53a30a4a6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -88,6 +88,6 @@ #define TEST_HR #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: nonBE, 0 regressions - reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ #endif -- GitLab From 11970ae85c46799186afabf2370f758200e40644 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 11:55:51 +0200 Subject: [PATCH 0369/1310] Revert "activate FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2" This reverts commit d44872b1cf0bdd372055b00ee2dfdc9808b701c6. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 53a30a4a6..1ada99f53 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -88,6 +88,6 @@ #define TEST_HR #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: nonBE, 0 regressions - reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ +//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ #endif -- GitLab From 38e2cb22645320d0511938c78e30aa48445ed02e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 11:56:05 +0200 Subject: [PATCH 0370/1310] Revert "delete some code from another ticket and some empty lines" This reverts commit f33357542fca749ec15cc69f253b8254c1522040. --- lib_com/options.h | 4 +++- lib_com/swb_tbe_com_fx.c | 3 +++ lib_com/tools_fx.c | 26 +++++++++++++++++++++++++- lib_dec/ivas_stereo_icbwe_dec_fx.c | 10 ++++++++++ lib_dec/swb_tbe_dec_fx.c | 10 ++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1ada99f53..84aac4489 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -/*#define WMOPS*/ /* Activate complexity and memory counters */ +#define WMOPS /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -87,7 +87,9 @@ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ #define TEST_HR + #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: nonBE, 0 regressions - reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ #endif + diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 6ac3ee725..a3b4bd5c6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7038,6 +7038,7 @@ void elliptic_bpf_48k_generic_fx( } #endif + Q_temp = norm_l( L_tmpMax ); Q_temp = sub( Q_temp, 4 ); Scale_sig32( L_tmp2, 960, Q_temp ); @@ -7179,8 +7180,10 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } + #endif + memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 5f0e172bf..6dc1c45f2 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,13 +794,37 @@ void Copy_Scale_sig_16_32_no_sat( } return; } +#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat + L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); + + IF( L_tmp >= 0x7FFF ) + { + FOR( i = 0; i < lg; i++ ) + { + // y[i] = L_mult0(x[i], L_tmp); + y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); + move32(); /* Overflow can occur here */ + } + return; + } + // ELSE + { + Word16 tmp = extract_l( L_tmp ); + FOR( i = 0; i < lg; i++ ) + { + y[i] = L_mult( x[i], tmp ); + move32(); + } + } +#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* saturation can occur here */ + move32(); /* Overflow can occur here */ } +#endif } void Copy_Scale_sig_32_16( diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index c7bc98566..772eb2d7d 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,6 +904,9 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); +#endif FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -911,10 +914,17 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); +#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx + if ( LE_16( alpha_fx, winSlope_fx_ ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ + } +#else IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } +#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 419d202fc..890e0e5c8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7032,14 +7032,24 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); + +#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx + Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 +#endif + FOR( i = 0; i < L_FRAME16k; i++ ) { +#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } +#else + Word16 idx; + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ +#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); -- GitLab From 7bddc36ae7b4d790941c362a9ce416d96bf26b5b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 11:56:17 +0200 Subject: [PATCH 0371/1310] Revert "delete FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS, FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2, made FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 permanent active. WMOPS for bitstream in issue 1439: general patch: .9 WMOPS - nonBE, no regressions, STAGE2 patch: 3.2 WMOPS - 1 small regression" This reverts commit c00e57f2c7b4911f742516dcf13bd7cfc14861dd. --- lib_com/options.h | 7 +++-- lib_com/prot_fx.h | 8 +++++ lib_com/swb_tbe_com_fx.c | 63 ++++++++++++++++++++++++++++++++++++++++ lib_dec/swb_tbe_dec_fx.c | 10 +++++++ lib_enc/swb_tbe_enc_fx.c | 12 ++++++++ 5 files changed, 98 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 84aac4489..3ce190efc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -88,8 +88,11 @@ #define TEST_HR -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: nonBE, 0 regressions - reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -//#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: nonBE, 1 regression (Pipeline #51485) - reduces 3.2 WMOPS with issue 1439 Bitstream*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ /*0.9 WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ /*3.2 WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE /*according to comment of @vaclav in MR!1390*/ /*overrides STAGE2 settings*/ +// #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 8d70b1092..1d2873dc4 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3267,7 +3267,11 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE const int16_t element_mode, +#else + Word16 isIVAS, +#endif #endif Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -3302,7 +3306,11 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode +#else + Word16 isIVAS +#endif #endif ); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a3b4bd5c6..2900d54e9 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,7 +6696,11 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode, +#else + Word16 isIVAS, +#endif #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -6711,6 +6715,13 @@ void elliptic_bpf_48k_generic_fx( const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ) { +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE + element_mode = 1; +#else + isIVAS = 1; +#endif +#endif Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; @@ -6762,7 +6773,11 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) +#else + IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6776,7 +6791,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); } } @@ -6801,7 +6820,11 @@ void elliptic_bpf_48k_generic_fx( ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) +#else + IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; ) { @@ -6811,7 +6834,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); i++; @@ -6821,7 +6848,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); i++; @@ -6830,7 +6861,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ +#endif move32(); i++; } @@ -6941,7 +6976,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) +#else + IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6954,7 +6993,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); +#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } @@ -7074,7 +7117,11 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) +#else + IF( isIVAS ) +#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7087,7 +7134,11 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 + L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ +#else L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); +#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } @@ -7250,7 +7301,11 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode +#else + Word16 isIVAS +#endif #endif ) { @@ -7288,7 +7343,11 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE element_mode, +#else + isIVAS, +#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx @@ -7304,7 +7363,11 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE element_mode, +#else + isIVAS, +#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 890e0e5c8..c02a6a182 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4646,8 +4646,13 @@ void fb_tbe_dec_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE , st->element_mode +#else + , + 0 +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); @@ -4720,8 +4725,13 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE , st->element_mode +#else + , + 1 +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 4f10d3b02..29ef4427a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7333,7 +7333,11 @@ void fb_tbe_enc_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, +#else + 0, +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7471,7 +7475,11 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, +#else + 1, +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7484,7 +7492,11 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, +#else + 1, +#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -- GitLab From 10b4e67f2ee9d6fa65326e2d6ca1320dc76fe348 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 11:56:33 +0200 Subject: [PATCH 0372/1310] Revert "clang patch" This reverts commit 1de6bb47406cb7108ee6e67ac29762a7a50e5080. --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2900d54e9..c5b2941d5 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6792,7 +6792,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ + L_tmp[i] = W_sat_l( W_add( W_shr(W_tmpX,3), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ #else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ #endif -- GitLab From 8e842aba751226f7f011f4171bc440c556a168ac Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 11:56:43 +0200 Subject: [PATCH 0373/1310] Revert "test STAGE2_saturationmode2" This reverts commit 1daee4188980cd56ac1bcfbb35ff009c8da527a0. --- lib_com/options.h | 7 +++---- lib_com/swb_tbe_com_fx.c | 24 ------------------------ 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3ce190efc..4f564c9f4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -88,11 +88,10 @@ #define TEST_HR -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ /*0.9 WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ /*3.2 WMOPS*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE /*according to comment of @vaclav in MR!1390*/ /*overrides STAGE2 settings*/ -// #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ + //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c5b2941d5..10f508489 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6791,11 +6791,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr(W_tmpX,3), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); } } @@ -6834,11 +6830,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpX = W_mac_16_16( W_tmpX, input_fx[i], full_band_bpf_fx[0][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); i++; @@ -6848,11 +6840,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpX = W_mac_16_16( W_tmpX, input_fx[i - 1], full_band_bpf_fx[0][1] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); i++; @@ -6861,11 +6849,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 2], full_band_bpf_fx[3][2] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 3], full_band_bpf_fx[3][3] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp[i - 4], full_band_bpf_fx[3][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 ) ), 3 ) ); /*Q_input_fx + 11*/ -#endif move32(); i++; } @@ -6993,11 +6977,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 3], full_band_bpf_fx[4][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp[i], full_band_bpf_fx[1][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_tmp2[i - 4], full_band_bpf_fx[4][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_tmp2[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_tmp2[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); -#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } @@ -7134,11 +7114,7 @@ void elliptic_bpf_48k_generic_fx( W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 3], full_band_bpf_fx[5][3] ); W_tmpX = W_mac_32_16( W_tmpX, L_tmp2[i], full_band_bpf_fx[2][0] ); W_tmpY = W_msu_32_16( W_tmpY, L_output[i - 4], full_band_bpf_fx[5][4] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_saturationmode2 - L_output[i] = W_sat_l( W_add( W_shr( W_tmpX, 3 ), W_shl( W_tmpY, 2 - 16 ) ) ); /*Q_input_fx + 11*/ -#else L_output[i] = W_sat_l( W_shr( W_add( W_tmpX, W_shl( W_tmpY, 2 - 16 + 3 + 16 ) ), 3 + 16 ) ); -#endif move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } -- GitLab From e47ccc1e1c7cad1050ab57bf9a62ccf218646434 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 13:10:36 +0200 Subject: [PATCH 0374/1310] make FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 permanent active, delete FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS --- lib_com/options.h | 2 -- lib_com/prot_fx.h | 8 -------- lib_com/swb_tbe_com_fx.c | 39 --------------------------------------- lib_dec/swb_tbe_dec_fx.c | 10 ---------- lib_enc/swb_tbe_enc_fx.c | 12 ------------ 5 files changed, 71 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4f564c9f4..ed6303e70 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -91,7 +91,5 @@ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ - #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE /*according to comment of @vaclav in MR!1390*/ /*overrides STAGE2 settings*/ - //#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS /*Test stage2 macro with all isavas variable = 1 - evs BE test will fail at least*/ #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 1d2873dc4..8d70b1092 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3267,11 +3267,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE const int16_t element_mode, -#else - Word16 isIVAS, -#endif #endif Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -3306,11 +3302,7 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode -#else - Word16 isIVAS -#endif #endif ); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 10f508489..a3b4bd5c6 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6696,11 +6696,7 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode, -#else - Word16 isIVAS, -#endif #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -6715,13 +6711,6 @@ void elliptic_bpf_48k_generic_fx( const Word16 full_band_bpf_fx[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_TEST_ALLIVAS -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE - element_mode = 1; -#else - isIVAS = 1; -#endif -#endif Word16 i, j; #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; @@ -6773,11 +6762,7 @@ void elliptic_bpf_48k_generic_fx( IF( !IsUpsampled3 ) { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6816,11 +6801,7 @@ void elliptic_bpf_48k_generic_fx( ELSE { #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; ) { @@ -6960,11 +6941,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7097,11 +7074,7 @@ void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE IF( element_mode ) -#else - IF( isIVAS ) -#endif { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -7277,11 +7250,7 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE int16_t element_mode -#else - Word16 isIVAS -#endif #endif ) { @@ -7319,11 +7288,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE element_mode, -#else - isIVAS, -#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx @@ -7339,11 +7304,7 @@ void synthesise_fb_high_band_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE element_mode, -#else - isIVAS, -#endif #endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index c02a6a182..890e0e5c8 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4646,13 +4646,8 @@ void fb_tbe_dec_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE , st->element_mode -#else - , - 0 -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); @@ -4725,13 +4720,8 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE , st->element_mode -#else - , - 1 -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 29ef4427a..4f10d3b02 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7333,11 +7333,7 @@ void fb_tbe_enc_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, -#else - 0, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7475,11 +7471,7 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, -#else - 1, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); @@ -7492,11 +7484,7 @@ void fb_tbe_enc_ivas_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE st->element_mode, -#else - 1, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2_USEELEMENTMODE*/ #endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -- GitLab From e6ccb58bf5362caf51e4fbea2fecef32c878cd5c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 16 Apr 2025 13:47:40 +0200 Subject: [PATCH 0375/1310] Introduce end-of-line normalization --- .gitattributes | 24 ++++++ lib_com/options.h | 182 +++++++++++++++++++++++----------------------- 2 files changed, 115 insertions(+), 91 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..63eef4d68 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,24 @@ +# Default behavior. Converts all text files to use LF in repository. +* text=auto + +# List all known generic text files +*.c text +*.csv text +*.h text +*.json text +*.m text +*.md text +*.prm text +*.py text +*.txt text + +# Set Windows specific text files to always use CRLF in working tree. +*.bat text eol=crlf +*.cmd text eol=crlf +*.sln text eol=crlf +*.vcxproj text eol=crlf +*.vcxproj.filters text eol=crlf + +# Set Unix specific text files to always use LF (also covers Windows subsystem for Linux) in working tree +*.sh text eol=lf + diff --git a/lib_com/options.h b/lib_com/options.h index 43c3c3038..99d528769 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -1,91 +1,91 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#ifndef OPTIONS_H -#define OPTIONS_H - -/* clang-format off */ - -/* ################### Start DEBUGGING switches ######################## */ - -/*#define DEBUGGING*/ /* Allows debugging message to be printed out during runtime */ -#ifdef DEBUGGING -#define DEBUG_MODE_INFO /* Define to output most important parameters to the subdirectory "res/" */ -#define DEBUG_MODE_INFO_TWEAK /* Enable command line switch to specify subdirectory for debug info output inside "./res/" */ -#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stereo 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ -/*#define DEBUG_FORCE_DIR*/ /* Force modes/parameters by reading from external binary files */ -/*#define DBG_WAV_WRITER*/ /* Enable dbgwrite_wav() function for generating ".wav" files */ -#define SUPPORT_FORCE_TCX10_TCX20 /* VA: Enable -force tcx10|tcx20 command-line option */ -#endif - -#define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ - -/*#define WMOPS*/ /* Activate complexity and memory counters */ -#ifdef WMOPS -/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ -/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ -/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ -/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ -#endif - -/* #################### End DEBUGGING switches ############################ */ - -#ifndef BASOP_NOGLOB_DEV_USE_GLOBALS -#define BASOP_NOGLOB_DECLARE_LOCAL -#endif - -#define FIX_867_CLDFB_NRG_SCALE - -#define FIX_1378_ACELP_OUT_OF_BOUNDS - -/* Note: each compile switch (FIX_1101_...) is independent from the other ones */ -//#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ -#define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ -/* Both following 2 macros (IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST*) are independent from each other, they refer to different code blocks */ -#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ -//#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version. Obsoleted by MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ -#define HARM_PUSH_BIT -#define HARM_ENC_INIT -//#define HARM_SCE_INIT -#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ -#define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -#define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ - -#define TEST_HR - -#endif +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +/*==================================================================================== + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 + ====================================================================================*/ + +#ifndef OPTIONS_H +#define OPTIONS_H + +/* clang-format off */ + +/* ################### Start DEBUGGING switches ######################## */ + +/*#define DEBUGGING*/ /* Allows debugging message to be printed out during runtime */ +#ifdef DEBUGGING +#define DEBUG_MODE_INFO /* Define to output most important parameters to the subdirectory "res/" */ +#define DEBUG_MODE_INFO_TWEAK /* Enable command line switch to specify subdirectory for debug info output inside "./res/" */ +#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stereo 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ +/*#define DEBUG_FORCE_DIR*/ /* Force modes/parameters by reading from external binary files */ +/*#define DBG_WAV_WRITER*/ /* Enable dbgwrite_wav() function for generating ".wav" files */ +#define SUPPORT_FORCE_TCX10_TCX20 /* VA: Enable -force tcx10|tcx20 command-line option */ +#endif + +#define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ + +/*#define WMOPS*/ /* Activate complexity and memory counters */ +#ifdef WMOPS +/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ +/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ +/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ +/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ +#endif + +/* #################### End DEBUGGING switches ############################ */ + +#ifndef BASOP_NOGLOB_DEV_USE_GLOBALS +#define BASOP_NOGLOB_DECLARE_LOCAL +#endif + +#define FIX_867_CLDFB_NRG_SCALE + +#define FIX_1378_ACELP_OUT_OF_BOUNDS + +/* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +//#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ +#define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ +#define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ +#define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ +/* Both following 2 macros (IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST*) are independent from each other, they refer to different code blocks */ +#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ +//#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version. Obsoleted by MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ +#define HARM_PUSH_BIT +#define HARM_ENC_INIT +//#define HARM_SCE_INIT +#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ +#define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ +#define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ + +#define TEST_HR + +#endif -- GitLab From 1a99d47966f7153faa277303e6244a6214efbe4e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 11:52:28 +0000 Subject: [PATCH 0376/1310] revert some unnecessary changes --- lib_com/options.h | 3 +-- lib_com/swb_tbe_com_fx.c | 2 -- lib_com/tools_fx.c | 26 +------------------------- lib_dec/ivas_stereo_icbwe_dec_fx.c | 10 ---------- lib_dec/swb_tbe_dec_fx.c | 10 ---------- lib_enc/swb_tbe_enc_fx.c | 12 ++++++------ 6 files changed, 8 insertions(+), 55 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ed6303e70..c04b0e292 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,7 +53,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -#define WMOPS /* Activate complexity and memory counters */ +/*#define WMOPS*/ /* Activate complexity and memory counters */ #ifdef WMOPS /*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ /*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ @@ -89,7 +89,6 @@ #define TEST_HR #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ - #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #endif diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index a3b4bd5c6..98048380e 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7180,10 +7180,8 @@ void elliptic_bpf_48k_generic_fx( move32(); L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); } - #endif - memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; memory_fx2[2][2] = L_tmp2[L_FRAME48k - 2]; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 6dc1c45f2..5f0e172bf 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -794,37 +794,13 @@ void Copy_Scale_sig_16_32_no_sat( } return; } -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat - L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - - IF( L_tmp >= 0x7FFF ) - { - FOR( i = 0; i < lg; i++ ) - { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* Overflow can occur here */ - } - return; - } - // ELSE - { - Word16 tmp = extract_l( L_tmp ); - FOR( i = 0; i < lg; i++ ) - { - y[i] = L_mult( x[i], tmp ); - move32(); - } - } -#else L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); FOR( i = 0; i < lg; i++ ) { // y[i] = L_mult0(x[i], L_tmp); y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* Overflow can occur here */ + move32(); /* saturation can occur here */ } -#endif } void Copy_Scale_sig_32_16( diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index 772eb2d7d..c7bc98566 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,9 +904,6 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); -#endif FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -914,17 +911,10 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx - if ( LE_16( alpha_fx, winSlope_fx_ ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ - } -#else IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } -#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 890e0e5c8..419d202fc 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -7032,24 +7032,14 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); - -#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx - Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 -#endif - FOR( i = 0; i < L_FRAME16k; i++ ) { -#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word16 idx = 0; move16(); IF( i != 0 ) { idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); } -#else - Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ -#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 4f10d3b02..3e1e606f9 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7299,18 +7299,18 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; +#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic + Word16 input_fhb_buffer[L_FRAME48k + 4]; + Word16 *input_fhb = &input_fhb_buffer[0] + 4; +#else + Word16 input_fhb[L_FRAME48k]; +#endif Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; Word16 tmp, tmp1, tmp2, exp, exp2, exp_norm; Word16 s_max_value, exp_temp, i; TD_BWE_ENC_HANDLE hBWE_TD = st->hBWE_TD; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic - Word16 input_fhb_buffer[L_FRAME48k + 4]; - Word16 *input_fhb = &input_fhb_buffer[0] + 4; -#else - Word16 input_fhb[L_FRAME48k]; -#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move16(); -- GitLab From 939f40786b137a9ff68856fba1faa51ee2b13ddc Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 16 Apr 2025 14:36:00 +0200 Subject: [PATCH 0377/1310] clang patch --- lib_enc/swb_tbe_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 3e1e606f9..60094c9a0 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7304,7 +7304,7 @@ void fb_tbe_enc_fx( Word16 *input_fhb = &input_fhb_buffer[0] + 4; #else Word16 input_fhb[L_FRAME48k]; -#endif +#endif Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; -- GitLab From 253a399c813055dfa394fe1a3b76857743726e61 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Thu, 17 Apr 2025 07:58:25 +0530 Subject: [PATCH 0378/1310] Fix for MSAN issue in ivas_dirac_dec_render_sf_fx and ivas_dirac_alloc_mem_fx --- lib_dec/ivas_dirac_dec_fx.c | 19 +++++++++++++++++++ lib_rend/ivas_dirac_rend_fx.c | 1 + 2 files changed, 20 insertions(+) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index dd48916cb..10b8059b9 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2185,6 +2185,25 @@ void ivas_dirac_dec_render_sf_fx( move16(); move16(); + + FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + set32_fx( Cldfb_RealBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( Cldfb_ImagBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + + FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + /* local copies of azi, ele, diffuseness */ Word16 azimuth[CLDFB_NO_CHANNELS_MAX]; Word16 elevation[CLDFB_NO_CHANNELS_MAX]; diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index f67f3761b..5a5f74ee8 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -986,6 +986,7 @@ ivas_error ivas_dirac_alloc_mem_fx( } hDirAC_mem->reference_power_len = imult1616( 5, num_freq_bands ); + set16_fx( hDirAC_mem->reference_power_q, Q31, 2 ); } IF( hDirACRend->proto_signal_decorr_on ) -- GitLab From 5a66ba75ce61877ba4e544057da2c4cdfe541678 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Thu, 17 Apr 2025 08:02:02 +0530 Subject: [PATCH 0379/1310] Updates for ivas_analy_sp_fx to improve precision --- lib_enc/analy_sp_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 4f96ea2d4..57dbb369c 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -634,14 +634,14 @@ void ivas_analy_sp_fx( move32(); Bin_E[L_FFT - 1] = Bin_E[L_FFT - 2]; // *q_Bin_E move32(); - + Word32 add_const = 21475; // 1e-5 in Q31 FOR( i = 0; i < L_FFT / 2; i++ ) { Bin_E_old[i] = Bin_E[i]; // *q_Bin_E move32(); /* PS[i] = ( Bin_E[i] + 1e-5f + Bin_E[i + L_FFT / 2] + 1e-5f ) / 2.0f; */ - PS[i] = W_extract_h( W_mac_32_32( W_mult_32_32( Bin_E[i], ONE_IN_Q30 ), Bin_E[i + L_FFT / 2], ONE_IN_Q30 ) ); // *q_Bin_E + PS[i] = W_extract_h( W_add( W_mac_32_32( W_mult_32_32( Bin_E[i], ONE_IN_Q30 ), Bin_E[i + L_FFT / 2], ONE_IN_Q30 ), W_shr( W_shl( add_const, 32 ), sub( 31, *q_Bin_E ) ) ) ); // *q_Bin_E move32(); /* Bin_E[i] = (float) ( 10.0f * log( PS[i] ) ); */ -- GitLab From 2d2d72145471d80f47eb7c3e44552b958c1d690c Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Wed, 16 Apr 2025 17:04:44 +0530 Subject: [PATCH 0380/1310] Fix for 3GPP issue 1491: [regression] Encoder crash for MCT-MC 5.1 at 32kHz/SWB in bw_detect_fx() --- lib_enc/bw_detect_fx.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 8a150d514..30382cfba 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -336,24 +336,33 @@ void bw_detect_fx( sum32 = L_mac0_o( sum32, *pt1, *pt1, &Overflow ); pt1++; } - - IF( LE_32( sum32, 1 ) ) + test(); + test(); + IF( st->element_mode != EVS_MONO && EQ_32( sum32, MAX_32 ) && GT_16( Q_dct, 41 ) /* Any Q-value greater than Q41 for MAX_32 will be less than 0.001*/ ) { - /*deal with zero spectrum*/ - spect_bin[i] = -1; + spect_bin[i] = -6144; /* log10f( 0.00100000005 ) in Q11 */ move16(); } ELSE { - /* spect_bin[i] = (float)log10(spect_bin[i]); - = log2(spect_bin[i])*log10(2); */ - e_tmp = norm_l( sum32 ); - L_tmp = L_shl( sum32, e_tmp ); - f_tmp = Log2_norm_lc( L_tmp ); - e_tmp = sub( sub( 30, e_tmp ), Q_dct ); - L_tmp = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - spect_bin[i] = round_fx( L_shl( L_tmp, 11 ) ); /* Q11 */ - move16(); + IF( LE_32( sum32, 1 ) ) + { + /*deal with zero spectrum*/ + spect_bin[i] = -1; + move16(); + } + ELSE + { + /* spect_bin[i] = (float)log10(spect_bin[i]); + = log2(spect_bin[i])*log10(2); */ + e_tmp = norm_l( sum32 ); + L_tmp = L_shl( sum32, e_tmp ); + f_tmp = Log2_norm_lc( L_tmp ); + e_tmp = sub( sub( 30, e_tmp ), Q_dct ); + L_tmp = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ + spect_bin[i] = round_fx( L_shl( L_tmp, 11 ) ); /* Q11 */ + move16(); + } } } } -- GitLab From 8ddf7cffc690abab7f0c07a0f9cd849f8157536a Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 17 Apr 2025 10:48:53 +0200 Subject: [PATCH 0381/1310] Applied rounding to old_out. Deactivated q_win change and dynamic_q_old_out. --- lib_com/options.h | 3 ++- lib_dec/dec_tcx_fx.c | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8ee484111..e4ee8714b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -84,6 +84,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -#define FIX_1348_BIT_PRECISION_IMPROVEMENT +//#define FIX_1348_BIT_PRECISION_IMPROVEMENT //#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index f97455c65..e9d34660f 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2932,7 +2932,12 @@ void IMDCT_ivas_fx( FOR( Word16 ind = 0; ind < L_frame; ind++ ) { #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD + +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF + old_out_fx[ind] = shr_r( old_out_fx[ind], q_diff ); +#else old_out_fx[ind] = shr_sat( old_out_fx[ind], q_diff ); +#endif move16(); #endif xn_buf_fx[ind] = shr_sat( xn_buf_fx[ind], diff ); -- GitLab From c703a1f62500154dc54f176bf33ca1fd69144076 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 17 Apr 2025 11:30:26 +0200 Subject: [PATCH 0382/1310] Replaced shr_r with shr_r_sat. Deactivated all changes. --- lib_com/options.h | 2 +- lib_dec/dec_tcx_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5caec3cdf..8540a9300 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -99,5 +99,5 @@ //#define FIX_1348_BIT_PRECISION_IMPROVEMENT //#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD -#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF +//#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index e9d34660f..56f2b2e6b 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2934,7 +2934,7 @@ void IMDCT_ivas_fx( #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF - old_out_fx[ind] = shr_r( old_out_fx[ind], q_diff ); + old_out_fx[ind] = shr_r_sat( old_out_fx[ind], q_diff ); #else old_out_fx[ind] = shr_sat( old_out_fx[ind], q_diff ); #endif -- GitLab From 2afc0761a28c8f8ef01c0b0b9b30628a51d3975d Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 17 Apr 2025 15:49:28 +0200 Subject: [PATCH 0383/1310] accept REMOVE_EVS_DUPLICATES --- Workspace_msvc/lib_dec.vcxproj | 3 - Workspace_msvc/lib_dec.vcxproj.filters | 3 - lib_com/bits_alloc_fx.c | 1313 +------------------- lib_com/gs_inact_switching_fx.c | 134 +- lib_com/gs_noisefill_fx.c | 10 +- lib_com/ivas_prot_fx.h | 2 +- lib_com/lsf_tools_fx.c | 220 ++-- lib_com/options.h | 2 - lib_com/prot_fx.h | 602 +++------ lib_com/swb_tbe_com_fx.c | 235 +--- lib_dec/FEC_fx.c | 15 +- lib_dec/FEC_scale_syn_fx.c | 574 +-------- lib_dec/acelp_core_dec_fx.c | 1544 ------------------------ lib_dec/acelp_core_dec_ivas_fx.c | 107 +- lib_dec/acelp_core_switch_dec_fx.c | 12 +- lib_dec/amr_wb_dec_fx.c | 38 +- lib_dec/cng_dec_fx.c | 683 +---------- lib_dec/dec_LPD_fx.c | 4 - lib_dec/dec_ace_fx.c | 30 +- lib_dec/dec_amr_wb_fx.c | 6 +- lib_dec/dec_gen_voic_fx.c | 534 +------- lib_dec/dec_pit_exc_fx.c | 432 +------ lib_dec/dec_post_fx.c | 241 +--- lib_dec/dec_ppp_fx.c | 17 +- lib_dec/dec_tran_fx.c | 12 +- lib_dec/dec_uv_fx.c | 100 +- lib_dec/evs_dec_fx.c | 16 +- lib_dec/fd_cng_dec_fx.c | 593 +-------- lib_dec/gain_dec_fx.c | 390 +----- lib_dec/gs_dec_fx.c | 693 +---------- lib_dec/ivas_core_dec_fx.c | 2 +- lib_dec/ivas_dirac_dec_fx.c | 4 +- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 4 +- lib_dec/ivas_tcx_core_dec_fx.c | 7 +- lib_dec/ivas_td_low_rate_dec_fx.c | 20 +- lib_dec/lsf_dec_fx.c | 276 +---- lib_dec/pit_dec_fx.c | 256 +--- lib_dec/post_dec_fx.c | 18 +- lib_enc/acelp_core_enc_fx.c | 40 +- lib_enc/acelp_core_switch_enc_fx.c | 37 +- lib_enc/analy_lp_fx.c | 150 +-- lib_enc/cod_ace_fx.c | 11 +- lib_enc/enc_gen_voic_fx.c | 23 +- lib_enc/enc_tran_fx.c | 15 +- lib_enc/ivas_core_pre_proc_front_fx.c | 7 +- lib_enc/ivas_core_pre_proc_fx.c | 13 +- lib_enc/ivas_front_vad_fx.c | 6 +- lib_enc/ivas_td_low_rate_enc_fx.c | 4 +- lib_enc/lsf_enc_fx.c | 7 +- lib_enc/pre_proc_fx.c | 14 +- lib_enc/prot_fx_enc.h | 104 +- lib_enc/transition_enc_fx.c | 41 +- 52 files changed, 659 insertions(+), 8965 deletions(-) delete mode 100644 lib_dec/acelp_core_dec_fx.c diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2d06d29aa..2839a5812 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -139,9 +139,6 @@ false - - false - diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index 8a4fc4605..ebf15bd4c 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -119,9 +119,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index e9abb7651..3bfcd0c20 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -434,174 +434,12 @@ static Word16 fcb_table( } /*-------------------------------------------------------------------* - * acelp_FCB_allocator() + * acelp_FCB_allocator_fx() * * Routine to allocate fixed innovation codebook bit-budget *--------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES -static ivas_error acelp_FCB_allocator( - Word16 *nBits, /* i/o: available bit-budget */ - Word16 fixed_cdk_index[], /* o : codebook index Q0 */ - Word16 nb_subfr, /* i : number of subframes */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 coder_type, /* i : coder type */ - const Word16 tc_subfr, /* i : TC subframe index */ - const Word16 fix_first /* i : flag to indicate whether the first subframe bit-budget was fixed */ -) -{ - Word16 cdbk, sfr, step; - Word16 nBits_tmp; - Word16 *p_fixed_cdk_index; - Word16 max_n; - ivas_error error; - // PMT("Not floating point computation, but fixed point operator are still missing ") - - error = IVAS_ERR_OK; - move32(); - - cdbk = coder_type; /* just to avoid warning when DEBUGGING is deactivated */ - move16(); - - p_fixed_cdk_index = fixed_cdk_index; - - /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse not in the first subframe */ - test(); - IF( GE_16( tc_subfr, L_SUBFR ) && fix_first ) - { - Word16 i; - - FOR( i = 0; i < nb_subfr; i++ ) - { - *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[i] ) ); - move16(); - } - return error; - } - - /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse in the first subframe */ - sfr = 0; - move16(); - IF( fix_first ) - { - *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[0] ) ); - move16(); - sfr = 1; - move16(); - p_fixed_cdk_index++; - nb_subfr = 3; - move16(); - } - - /* distribute the bit-budget equally between subframes */ - IF( GT_16( L_subfr, L_SUBFR ) ) /* access fast_FCB_bits_2sfr */ - { - max_n = 6; - move16(); - } - ELSE - { - max_n = ACELP_FIXED_CDK_NB; - move16(); - } - FOR( cdbk = 0; cdbk < max_n; cdbk++ ) - { - IF( GT_32( L_mult0( fcb_table( cdbk, L_subfr ), nb_subfr ), L_deposit_l( *nBits ) ) ) - { - BREAK; - } - } - cdbk = sub( cdbk, 1 ); - -#ifdef DEBUGGING - if ( cdbk < 0 && coder_type != TRANSITION ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bit-budget for fixed innovation codebook (frame = %d). Exiting! \n" ); - } - if ( ( L_subfr == L_SUBFR && cdbk >= ACELP_FIXED_CDK_NB ) || ( L_subfr == 2 * L_SUBFR && fcb_table( cdbk, L_subfr ) == 128 /*stop value*/ ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too high bit-budget for fixed innovation codebook (frame = %d). Exiting! \n" ); - } -#endif - - set16_fx( p_fixed_cdk_index, cdbk, nb_subfr ); - nBits_tmp = 0; - move16(); - IF( cdbk >= 0 ) - { - nBits_tmp = fcb_table( cdbk, L_subfr ); - } - ELSE - { - nBits_tmp = 0; - move16(); - } - *nBits = sub( *nBits, i_mult( nBits_tmp, nb_subfr ) ); - move16(); - - /* try to increase the FCB bit-budget of the first subframe(s) */ - IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) - { - step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); - WHILE( *nBits >= step ) - { - ( *p_fixed_cdk_index )++; - *nBits = sub( *nBits, step ); - move16(); - p_fixed_cdk_index++; - } - - /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ - step = sub( fcb_table( add( fixed_cdk_index[sfr], 1 ), L_subfr ), fcb_table( fixed_cdk_index[sfr], L_subfr ) ); - test(); - IF( GE_16( *nBits, step ) && cdbk >= 0 ) - { - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - test(); - IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) - { - sfr = add( sfr, 1 ); - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - } - } - } - /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ - IF( GE_16( tc_subfr, L_SUBFR ) ) - { - Word16 tempr; - - SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); - - /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ - IF( idiv1616( tc_subfr, L_SUBFR ) < sub( nb_subfr, 1 ) ) - { - SWAP( fixed_cdk_index[( tc_subfr - L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); - } - } - - /* when subframe length > L_SUBFR, number of bits instead of codebook index is signalled */ - IF( GT_16( L_subfr, L_SUBFR ) ) - { - Word16 i, j; - FOR( i = 0; i < nb_subfr; i++ ) - { - j = fixed_cdk_index[i]; - move16(); - fixed_cdk_index[i] = fast_FCB_bits_2sfr[j]; - move16(); - } - } - - return error; -} -#endif -static ivas_error acelp_FCB_allocator_ivas( +static ivas_error acelp_FCB_allocator_fx( Word16 *nBits, /* i/o: available bit-budget */ Word16 fixed_cdk_index[], /* o : codebook index Q0 */ Word16 nb_subfr, /* i : number of subframes */ @@ -754,1141 +592,16 @@ static ivas_error acelp_FCB_allocator_ivas( return error; } + /*-------------------------------------------------------------------* - * config_acelp1() + * config_acelp1_fx() * * Configure ACELP bit allocation * - should be in range of <6700; 24350> for ACELP@12.8kHz * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz *--------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES -ivas_error config_acelp1( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signalling_bits, /* i : number of signalling bits */ - const Word16 coder_type, /* i : coder type */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ -) -{ - Word16 i, bits, nb_subfr; - Word16 flag_hardcoded, coder_type_sw, fix_first; - Word32 core_brate; -#ifdef DEBUGGING - (void) active_cnt; -#endif - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - // PMT("Not floating point computation, but fixed point operator are still missing ") - /*-----------------------------------------------------------------* - * Set the flag indicating two-stage Unvoiced (UC) frame - *-----------------------------------------------------------------*/ - - *uc_two_stage_flag = 0; - move16(); - IF( EQ_16( coder_type, UNVOICED ) ) - { - test(); - test(); - test(); - test(); - test(); - if ( GE_32( total_brate, MIN_UNVOICED_TWO_STAGE_BRATE ) && element_mode > EVS_MONO && ( idchan == 0 || ( ( GE_32( total_brate, 8500 ) || extl_brate == 0 ) && EQ_16( tdm_LRTD_flag, 1 ) ) ) ) - { - *uc_two_stage_flag = 1; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Set the number of subframes - *-----------------------------------------------------------------*/ - - IF( EQ_16( L_frame, L_FRAME ) ) - { - nb_subfr = NB_SUBFR; - move16(); - -#ifdef DEBUGGING - if ( ( ( core_brate_inp < 5900 && coder_type > UNVOICED ) && !( core_brate_inp < MIN_TC_BRATE && coder_type == TRANSITION ) ) && !( idchan > 0 && element_mode == IVAS_CPE_TD ) && !( element_mode == IVAS_SCE && tdm_low_rate_mode ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bitrate (%d bps) for ACELP@12k8 in frame %d. Exiting!\n", core_brate_inp ); - } - - if ( core_brate_inp > ACELP_12k8_HIGH_LIMIT && core == ACELP_CORE ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too high bitrate (%d bps) for ACELP@12k8 in frame %d. Exiting!\n", core_brate_inp ); - } -#endif - } - ELSE /* L_frame == L_FRAME16k */ - { - nb_subfr = NB_SUBFR16k; - move16(); - -#ifdef DEBUGGING - if ( core_brate_inp < ACELP_16k_LOW_LIMIT && core == ACELP_CORE ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bitrate (%d bps) for ACELP@16k in frame %d. Exiting!\n", core_brate_inp ); - } -#endif - } - - coder_type_sw = coder_type; - move16(); - IF( core != ACELP_CORE ) - { - /* used in acelp_core_switch_enc() */ - nb_subfr = 1; - move16(); - if ( EQ_16( L_frame, L_FRAME ) ) - { - coder_type_sw = TRANSITION; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Check if the core_brate is hard coded (to keep BE for mono core) or not - *-----------------------------------------------------------------*/ - - flag_hardcoded = 0; - move16(); - i = 0; - move16(); - - WHILE( i < SIZE_BRATE_INTERMED_TBL ) - { - IF( EQ_32( core_brate_inp, brate_intermed_tbl[i] ) ) - { - flag_hardcoded = 1; - move16(); - BREAK; - } - - IF( LT_32( core_brate_inp, brate_intermed_tbl[i] ) ) - { - flag_hardcoded = 0; - move16(); - BREAK; - } - - i = add( i, 1 ); - } - - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( coder_type, AUDIO ) && - LE_32( core_brate_inp, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ - { - i = sub( i, 1 ); - } - - core_brate = brate_intermed_tbl[i]; - move32(); - - if ( element_mode > EVS_MONO ) - { - flag_hardcoded = 0; /* use automatic and flexible ACELP bit-budget allocation */ - move16(); - } - - test(); - if ( ( core != ACELP_CORE ) && ( element_mode == EVS_MONO ) ) /* needed for mode1 core switching in EVS mono */ - { - flag_hardcoded = 1; - move16(); - } - - /*-----------------------------------------------------------------* - * ACELP bit allocation - *-----------------------------------------------------------------*/ - test(); - test(); - IF( !( EQ_16( coder_type, TRANSITION ) && NE_16( tc_subfr, -1 ) ) || EQ_16( enc_dec, DEC ) ) - { - /* Set the bit-budget */ - bits = extract_l( Mpy_32_32( core_brate_inp, ONE_BY_FRAMES_PER_SEC_Q31 ) ); // Q0 - - test(); - test(); - IF( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) - { - bits = add( bits, *nBits_es_Pred ); /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ - } - - /* Subtract signalling bits */ - test(); - test(); - IF( EQ_16( enc_dec, DEC ) && EQ_16( idchan, 1 ) && element_mode > EVS_MONO ) - { - bits = sub( bits, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); - - IF( EQ_16( tdm_LRTD_flag, 1 ) ) - { - bits = add( bits, STEREO_BITS_TCA ); - } - - /* subtract TBE/BWE flag */ - test(); - test(); - test(); - test(); - test(); - test(); - IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) - { - bits = sub( bits, 1 ); - } - } - ELSE - { - /* Subtract signalling bits */ - bits = sub( bits, signalling_bits ); - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) - { - /* extension layer signalling bit is counted in the extension layer bitbudget */ - bits = add( bits, 1 ); - } - - /*-----------------------------------------------------------------* - * LSF Q bit-budget - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - IF( !tdm_lp_reuse_flag || idchan == 0 ) - { - /* LSF Q bit-budget */ - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - - IF( !flag_hardcoded ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) - { - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - } - ELSE IF( ( LT_32( total_brate, 7200 ) || coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( idchan, 1 ) ) - { - /* TD stereo, secondary channel: do nothing */ - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - } - ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) && LT_32( brate_intermed_tbl[i], ACELP_9k60 ) ) - { - /* primary channel: do nothing */ - } - ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] >= ACELP_9k60*/ ) - { - acelp_cfg->lsf_bits = 42; - move16(); - } - ELSE IF( LE_32( total_brate, 9600 ) || EQ_16( coder_type, UNVOICED ) ) - { - acelp_cfg->lsf_bits = 31; - move16(); - } - ELSE IF( LE_32( total_brate, 20000 ) ) - { - acelp_cfg->lsf_bits = 36; - move16(); - } - ELSE - { - acelp_cfg->lsf_bits = 41; - move16(); - } - } - ELSE /* L_frame == L_FRAME16k */ - { - acelp_cfg->lsf_bits = 41; - move16(); - } - } - - bits = sub( bits, acelp_cfg->lsf_bits ); - - /* mid-LSF Q bit-budget */ - acelp_cfg->mid_lsf_bits = mid_LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - - test(); - if ( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] < ACELP_9k60*/ ) - { - acelp_cfg->mid_lsf_bits = 5; - move16(); - /* primary channel: do nothing */ - } - - bits = sub( bits, acelp_cfg->mid_lsf_bits ); - } - ELSE IF( EQ_16( tdm_lp_reuse_flag, 1 ) && EQ_16( idchan, 1 ) && NE_16( active_cnt, 1 ) ) - { - bits = sub( bits, TDM_IC_LSF_PRED_BITS ); - } - /* gain Q bit-budget - part 1: 'Es_pred' of memory-less gain Q */ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && coder_type != INACTIVE && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) /* mid bitrates in GC and VC, low+mid bitrates in TC */ || - ( coder_type == INACTIVE && !inactive_coder_type_flag ) /* AVQ inactive */ - ) - { - *nBits_es_Pred = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, -1 )]; - move16(); - bits = sub( bits, *nBits_es_Pred ); - } - ELSE IF( *uc_two_stage_flag ) - { - *nBits_es_Pred = 4; - move16(); - bits = sub( bits, *nBits_es_Pred ); - } - } - ELSE - { - bits = *unbits; - move16(); - } - - test(); - IF( EQ_16( coder_type, TRANSITION ) && tc_call == 0 ) - { - *unbits = bits; - return error; - } - - /*-----------------------------------------------------------------* - * Low-rate mode - bits are allocated in tdm_low_rate_enc() - *-----------------------------------------------------------------*/ - test(); - IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) - { - acelp_cfg->FEC_mode = 0; - acelp_cfg->ltf_mode = FULL_BAND; - *nBits_es_Pred = 0; - *unbits = 0; - acelp_cfg->ubits = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - - return error; - } - - /*-----------------------------------------------------------------* - * Supplementary information for FEC - *-----------------------------------------------------------------*/ - - acelp_cfg->FEC_mode = 0; - move16(); - test(); - test(); - IF( GE_32( core_brate, ACELP_11k60 ) && ( idchan == 0 || element_mode == EVS_MONO ) ) - { - acelp_cfg->FEC_mode = 1; - move16(); - - test(); - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) && NE_16( coder_type, VOICED ) ) - { - bits = sub( bits, FEC_BITS_CLS ); - } - - IF( NE_16( coder_type, TRANSITION ) ) - { - IF( GE_32( total_brate, ACELP_16k40 ) ) - { - acelp_cfg->FEC_mode = 2; - move16(); - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) - { - bits = sub( bits, FEC_BITS_ENR ); - } - } - - IF( GE_32( total_brate, ACELP_32k ) ) - { - acelp_cfg->FEC_mode = 3; - move16(); - - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) - { - bits = sub( bits, FEC_BITS_POS ); - } - } - } - } - - /*-----------------------------------------------------------------* - * LP filtering of the adaptive excitation - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( idchan > 0 && element_mode > EVS_MONO ) - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE IF( EQ_16( coder_type, UNVOICED ) ) - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) && LT_32( core_brate, ACELP_11k60 ) ) - { - acelp_cfg->ltf_mode = LOW_PASS; - move16(); - } - ELSE IF( GE_32( core_brate, ACELP_11k60 ) && ( NE_16( coder_type, AUDIO ) && !( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME ) ) ) ) - { - test(); - test(); - IF( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME16k ) && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE - { - acelp_cfg->ltf_mode = NORMAL_OPERATION; - move16(); - IF( coder_type != TRANSITION ) - { - bits = sub( bits, nb_subfr ); - } - } - } - ELSE - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - - /*-----------------------------------------------------------------* - * UC bit-budget - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) - { - bits = sub( bits, NBITS_NOISENESS ); /* noiseness */ - } - IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) - { - bits = sub( bits, 3 * NB_SUBFR ); /* tilt factor */ - } - - /*-----------------------------------------------------------------* - * TC bit-budget - *-----------------------------------------------------------------*/ - - fix_first = 0; - move16(); - IF( EQ_16( coder_type, TRANSITION ) ) - { - if ( EQ_16( tc_call, 2 ) ) - { - fix_first = 1; - move16(); - } - - /* TC signalling */ - IF( EQ_16( L_frame, L_FRAME ) ) - { - IF( EQ_16( tc_subfr, TC_0_0 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 1 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 3 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 3 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 2 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 3 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 1 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 3 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, idiv1616( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - } - ELSE - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, idiv1616_1( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - } - } - ELSE /* L_frame == L_FRAME16k */ - { - IF( enc_dec == ENC ) - { - IF( LE_16( tc_subfr, 2 * L_SUBFR ) ) - { - bits = sub( bits, 2 ); /* TC signalling */ - } - ELSE - { - bits = sub( bits, 3 ); /* TC signalling */ - } - } - - // bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ - bits = sub( bits, idiv1616_1( sub( L_FRAME16k - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - - /* glottal-shape codebook bits */ - bits = sub( bits, 3 + 6 + 1 + 3 ); - } - - /*-----------------------------------------------------------------* - * pitch, innovation, gains bit-budget - *-----------------------------------------------------------------*/ - - acelp_cfg->fcb_mode = 0; - move16(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( tdm_low_rate_mode, 1 ) && ( coder_type != INACTIVE ) && NE_16( coder_type, UNVOICED ) ) /* GENERIC low rate mode for secondary channel */ - { - set16_fx( acelp_cfg->pitch_bits, 0, NB_SUBFR16k ); - set16_fx( acelp_cfg->gains_mode, 0, NB_SUBFR16k ); - - FOR( i = 0; i < 2; i++ ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - IF( tdm_Pitch_reuse_flag == 0 ) - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( 2 * L_SUBFR, i ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - bits = sub( bits, acelp_cfg->pitch_bits[i] ); - } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - bits = sub( bits, acelp_cfg->gains_mode[i] ); - } - acelp_cfg->fcb_mode = 1; - move16(); - -#ifdef DEBUGGING - if ( bits >= 55 ) - { - printf( "too much bits -> %d, LPC = %d and pitch = %d\n", bits, tdm_lp_reuse_flag, tdm_Pitch_reuse_flag ); - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - } - else -#endif - IF( GE_16( bits, 16 ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - } - ELSE - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - } - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || /* @12.8kHz core except of GSC */ - ( EQ_16( nb_subfr, NB_SUBFR16k ) && ( !inactive_coder_type_flag || coder_type != INACTIVE ) ) /* @16kHz core GC, TC, AVQ inactive */ || - EQ_16( core, HQ_CORE ) /* ACELP -> HQ switching in EVS */ - ) - { - /* pitch Q & gain Q bit-budget - part 2*/ - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - test(); - IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE /* L_frame == L_FRAME16k */ - { - test(); - IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - - bits = sub( bits, acelp_cfg->pitch_bits[i] ); - - test(); - IF( coder_type == INACTIVE && EQ_16( acelp_cfg->gains_mode[i], 6 ) /* VQ vs. SQ threshold @32 kbps */ ) - { - bits = sub( bits, 5 ); - } - ELSE - { - if ( EQ_16( *uc_two_stage_flag, 1 ) ) - { - acelp_cfg->gains_mode[i] = 7; - move16(); - } - - bits = sub( bits, acelp_cfg->gains_mode[i] ); - } - } - - /* algebraic codebook bit-budget */ - test(); - test(); - test(); - test(); - test(); - test(); - IF( flag_hardcoded /* EVS */ || - ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || - ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) - { - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE /* L_frame == L_FRAME16k */ - { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - bits = sub( bits, acelp_cfg->fixed_cdk_index[i] ); - } - } - ELSE IF( !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) - { - test(); - IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) - { - i = idiv1616( bits, NB_SUBFR ); - IF( s_and( i, 1 ) == 0 ) - { - i = sub( i, 1 ); /* must be odd */ - } - i = s_min( i, 13 ); -#ifdef DEBUG_MODE_TD - if ( i < 0 ) - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR::: UC negative index should not happen at frame %d\n" ); -#endif - i = s_max( i, 0 ); /* If i == 0-> random noise generator will be used as FCB */ - set16_fx( acelp_cfg->fixed_cdk_index, i, NB_SUBFR ); - bits = sub( bits, i_mult( i, NB_SUBFR ) ); - } - ELSE - { - - acelp_cfg->fcb_mode = 1; - move16(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) ) - { - IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), ( nb_subfr ) ) ) ) /* enough bits for all fcb */ - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 1 ) ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr - 1, L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 2 ) ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; - move16(); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( GE_16( bits, ACELP_FIXED_CDK_BITS( 0 ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; - move16(); - acelp_cfg->fixed_cdk_index[0] = -1; - move16(); - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE /* No FCB */ - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "WARNING!!!, No bit allocated to FCB, check frame %d\n" ); -#endif - acelp_cfg->fixed_cdk_index[0] = -1; - move16(); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - } - ELSE IF( NE_16( element_mode, IVAS_CPE_TD ) && GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) - { - bits = 100; /* 9 kbps for fcb */ - move16(); - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - ELSE - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - } - } - - /* AVQ codebook */ - test(); - test(); - test(); - IF( ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || - ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) - { - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( flag_hardcoded ) - { - acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - { - bits = sub( bits, acelp_cfg->AVQ_cdk_bits[i] ); - } - } - - bits = sub( bits, G_AVQ_BITS ); - } - - test(); - test(); - IF( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) - { - /* harm. flag ACELP AVQ */ - bits = sub( bits, 1 ); - } - - IF( !flag_hardcoded ) - { - Word16 bit_tmp; - - bit_tmp = idiv1616( bits, nb_subfr ); - set16_fx( acelp_cfg->AVQ_cdk_bits, bit_tmp, nb_subfr ); - bits = sub( bits, i_mult( bit_tmp, nb_subfr ) ); - - bit_tmp = bits % nb_subfr; - move16(); - acelp_cfg->AVQ_cdk_bits[0] = add( acelp_cfg->AVQ_cdk_bits[0], bit_tmp ); - move16(); - bits = sub( bits, bit_tmp ); - } - } - } - ELSE IF( ( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) /* LBR secondary channel in TD stereo */ || - ( ( coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( nb_subfr, NB_SUBFR ) ) /* GSC @12.8kHz */ || - ( coder_type == INACTIVE && inactive_coder_type_flag ) /* AVQ inactive */ ) - { - Word32 Local_BR, Pitch_BR; - Word16 Pitch_CT; - - /* as defined at the beginning of [enc,dec]_pit_exc() */ - test(); - test(); - IF( GSC_IVAS_mode > 0 && ( GSC_noisy_speech || GT_32( core_brate, GSC_H_RATE_STG ) ) ) - { - Local_BR = ACELP_8k00; - move32(); - Pitch_CT = GENERIC; - move16(); - Pitch_BR = ACELP_8k00; - move32(); - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - Local_BR = ACELP_14k80; - move32(); - test(); - if ( GSC_IVAS_mode > 0 && LT_32( core_brate, IVAS_24k4 ) ) - { - Local_BR = ACELP_9k60; - move32(); - } - Pitch_BR = core_brate; - move32(); - } - } - ELSE IF( GSC_noisy_speech ) - { - Local_BR = ACELP_7k20; - move32(); - Pitch_CT = GENERIC; - move16(); - Pitch_BR = ACELP_7k20; - move32(); - if ( EQ_16( L_frame, L_FRAME16k ) ) - { - Pitch_BR = core_brate; - move32(); - } - } - ELSE - { - Local_BR = ACELP_7k20; - move32(); - Pitch_CT = AUDIO; - move16(); - Pitch_BR = core_brate; - move32(); - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - Local_BR = ACELP_13k20; - move32(); - Pitch_CT = GENERIC; - move16(); - } - } - - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - } - } - } - - test(); - test(); - test(); - IF( EQ_16( coder_type, TRANSITION ) && ( EQ_16( tc_call, 1 ) && tc_subfr == 0 && EQ_16( L_frame, L_FRAME ) ) ) - { - return error; - } - - /*-----------------------------------------------------------------* - * unused bits handling - *-----------------------------------------------------------------*/ - - acelp_cfg->ubits = 0; /* these bits could be reused for something else */ - move16(); - - test(); - IF( flag_hardcoded && NE_32( core_brate, PPP_NELP_2k80 ) ) - { - test(); - test(); - /* unused bits */ - IF( EQ_16( coder_type, AUDIO ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_24k40 ) ) ) - { - acelp_cfg->ubits = 0; - move16(); - } - ELSE IF( EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->ubits = reserved_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE - { - acelp_cfg->ubits = 0; - move16(); - } - - bits = sub( bits, acelp_cfg->ubits ); - } - - /* sanity check */ - test(); - test(); - test(); - IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || EQ_16( nb_subfr, NB_SUBFR16k ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_16( L_frame, L_FRAME16k ) && coder_type == INACTIVE && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ || - ( GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) ) /* IVAS GSC @16kHz */ - { - acelp_cfg->ubits = 0; - move16(); - } - ELSE IF( flag_hardcoded && core == ACELP_CORE && bits != 0 ) - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); -#endif - } - ELSE IF( bits > 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) - { - test(); - test(); - test(); - test(); - IF( idchan > 0 && EQ_16( element_mode, IVAS_CPE_TD ) ) - { - IF( !tdm_lp_reuse_flag ) - { - acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ - move16(); - bits = 0; - move16(); - } - ELSE - { - Word16 nb_prm = 4; - move16(); - if ( EQ_16( tdm_low_rate_mode, 1 ) ) - { - nb_prm = 2; - move16(); - } - /* First add remaining bits on gains */ - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode ) ); - - /* Then, Increase pitch bit budget */ - test(); - IF( tdm_Pitch_reuse_flag == 0 && bits > 0 ) - { - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits ) ); - } - - /* Increase mid-lsf bit budget */ - test(); - IF( tdm_lp_reuse_flag == 0 && bits > 0 ) - { - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits ) ); - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ) ); - } - } - -#ifdef DEBUGGING - if ( idchan > 0 && bits > 0 && ( coder_type > UNVOICED || tdm_low_rate_mode == 0 ) ) - { - IVAS_ERROR( IVAS_ERR_INTERNAL, "WARNING !! Unused bits in secondary channel at frame %d\n" ); - } -#endif - } - - ELSE IF( core == ACELP_CORE && GE_16( coder_type, UNVOICED ) && LE_16( coder_type, GENERIC ) && EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ - move16(); - - test(); - IF( GT_16( acelp_cfg->lsf_bits, 46 ) ) - { - acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 46 ); - move16(); - acelp_cfg->lsf_bits = 46; - move16(); - } - ELSE IF( GT_16( acelp_cfg->lsf_bits, 42 ) && EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 42 ); - move16(); - acelp_cfg->lsf_bits = 42; - move16(); - } - } - ELSE - { - acelp_cfg->ubits = bits; - move16(); - } - } - ELSE IF( bits < 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); -#endif - } - } - - return error; -} - -/*-------------------------------------------------------------------* - * config_acelp1_IVAS() - * - * Configure ACELP bit allocation - * - should be in range of <6700; 24350> for ACELP@12.8kHz - * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz - *--------------------------------------------------------------------*/ -#endif -ivas_error config_acelp1_IVAS( +ivas_error config_acelp1_fx( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ const Word32 core_brate_inp, /* i : core bitrate */ @@ -2511,11 +1224,11 @@ ivas_error config_acelp1_IVAS( IF( GE_16( bits, 16 ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); } ELSE { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); acelp_cfg->fixed_cdk_index[1] = -1; move16(); } @@ -2634,17 +1347,17 @@ ivas_error config_acelp1_IVAS( { IF( GE_16( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), nb_subfr ) ) ) /* enough bits for all fcb */ { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } ELSE IF( GE_16( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 1 ) ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 1 ), L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 1 ), L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[3] = -1; move16(); } ELSE IF( GE_32( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 2 ) ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; move16(); acelp_cfg->fixed_cdk_index[1] = -1; @@ -2654,7 +1367,7 @@ ivas_error config_acelp1_IVAS( } ELSE IF( GE_32( bits, ACELP_FIXED_CDK_BITS( 0 ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; move16(); acelp_cfg->fixed_cdk_index[0] = -1; @@ -2680,11 +1393,11 @@ ivas_error config_acelp1_IVAS( { bits = 100; /* 9 kbps for fcb */ move16(); - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } ELSE { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } } } diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index 582fd3c8a..119811275 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -33,144 +33,24 @@ /*------------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* _ None */ /*========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES -void Inac_swtch_ematch_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ - const Word16 L_frame, /* i : Frame lenght */ - const Word32 core_brate, /* i : Core bit rate */ - const Word16 Q_exc /* i : input and output format of exc2 */ - , - const Word16 bfi /* i : frame lost indicator */ - , - const Word16 last_core, /* i : Last core used */ - const Word16 last_codec_mode /* i : Last codec mode */ -) -{ - Word16 Ener_per_bd[MBANDS_GN]; - Word16 ftmp; - Word16 *pt_exc; - Word16 j, i; - - Word16 exp, frac; - Word32 L_tmp; - - /*-------------------------------------------------------------------------- - * average energy per band - *--------------------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( coder_type, AUDIO ) && bfi == 0 ) - { - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* reset long-term energy per band */ - FOR( i = 0; i < MBANDS_GN; i++ ) - { - lt_ener_per_band[i] = Ener_per_bd[i]; - move16(); - } - } - ELSE IF( EQ_16( coder_type, VOICED ) || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || ( last_core != ACELP_CORE ) || NE_16( last_codec_mode, MODE1 ) ) - { - /* Find spectrum and energy per band for GC and VC frames */ - edct_16fx( exc2, dct_exc_tmp, L_frame, 5, EVS_MONO ); - - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* reset long-term energy per band */ - FOR( i = 0; i < MBANDS_GN; i++ ) - { - lt_ener_per_band[i] = Ener_per_bd[i]; - move16(); - } - } - ELSE IF( ( coder_type == INACTIVE ) && LE_32( core_brate, ACELP_24k40 ) ) - { - /* Find spectrum and energy per band for inactive frames */ - edct_16fx( exc2, dct_exc_tmp, L_frame, 5, EVS_MONO ); - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* More agressive smoothing in the first 50 frames */ - pt_exc = dct_exc_tmp; - move16(); - FOR( i = 0; i < MBANDS_GN; i++ ) - { - /* Compute smoothing gain to apply with gain limitation */ - L_tmp = L_mult( ALPHA0_FX, lt_ener_per_band[i] ); /*Q(15+12+1)=Q(28) */ - L_tmp = L_mac( L_tmp, BETA0_FX, Ener_per_bd[i] ); /*Q28 */ - lt_ener_per_band[i] = round_fx( L_tmp ); /*Q12 */ - move16(); - - ftmp = sub( lt_ener_per_band[i], Ener_per_bd[i] ); /*Q12 */ - - /* ftmp = (float)pow(10, ftmp);= pow(2,3.321928*ftmp);*/ - - L_tmp = L_mult( 27213, ftmp ); /*Q(13+12+1)=Q26 ; 27213=3.321928 in Q13 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of ftmp */ - ftmp = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - - exp = sub( exp, 14 ); - IF( LT_16( i, 2 ) ) - { - FOR( j = 0; j < 8; j++ ) - { - L_tmp = L_mult( *pt_exc, ftmp ); /* Q_exc*Q0 -> Q(Q_exc+1) */ - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); - move16(); - pt_exc++; - } - } - ELSE - { - FOR( j = 0; j < 16; j++ ) - { - L_tmp = L_mult( *pt_exc, ftmp ); /* Q_exc*Q0 -> Q(Q_exc+1) */ - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - pt_exc++; - } - } - } - - /* Going back to time */ - edct_16fx( dct_exc_tmp, exc2, L_frame, 5, EVS_MONO ); - } - - return; -} -#endif -void Inac_switch_ematch_ivas_fx( +void Inac_switch_ematch_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ const Word16 coder_type, /* i : Coding mode */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ + const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ const Word16 L_frame, /* i : Frame lenght */ const Word16 Q_exc, /* i : input and output format of exc2 */ const Word16 bfi, /* i : frame lost indicator */ const Word16 last_core, /* i : Last core used */ const Word16 last_codec_mode, /* i : Last codec mode */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ - const Word16 element_mode /* i : element mode */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 element_mode /* i : element mode */ ) { Word16 Ener_per_bd[MBANDS_GN16k]; @@ -251,7 +131,6 @@ void Inac_switch_ematch_ivas_fx( exp = sub( exp, 14 ); IF( LT_16( i, 2 ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( element_mode, EVS_MONO ) ) { FOR( j = 0; j < 8; j++ ) @@ -264,7 +143,6 @@ void Inac_switch_ematch_ivas_fx( } } ELSE -#endif { FOR( j = 0; j < 8; j++ ) { @@ -278,7 +156,6 @@ void Inac_switch_ematch_ivas_fx( } ELSE { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( element_mode, EVS_MONO ) ) { FOR( j = 0; j < 16; j++ ) @@ -291,7 +168,6 @@ void Inac_switch_ematch_ivas_fx( } } ELSE -#endif { FOR( j = 0; j < 16; j++ ) { @@ -306,9 +182,7 @@ void Inac_switch_ematch_ivas_fx( } /* Going back to time */ -#ifdef REMOVE_EVS_DUPLICATES IF( GT_16( element_mode, EVS_MONO ) ) -#endif { Scale_sig( dct_exc_tmp, 240, 1 ); // Q_exc Scale_sig( exc2, 240, 1 ); // Q_exc diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 61aa1333c..8488851ac 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -1332,8 +1332,6 @@ void highband_exc_dct_in_ivas_fx( } } - -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( element_mode, EVS_MONO ) ) { Comp_and_apply_gain_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, *Q_exc ); @@ -1346,7 +1344,6 @@ void highband_exc_dct_in_ivas_fx( } ELSE { -#endif Word16 Q_tmp = *Q_exc; move16(); Word16 Q_old = *Q_exc; @@ -1373,9 +1370,7 @@ void highband_exc_dct_in_ivas_fx( { Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); } -#ifdef REMOVE_EVS_DUPLICATES } -#endif /*--------------------------------------------------------------------------------------* * add the correction layer to the LF bins, @@ -1416,12 +1411,9 @@ void highband_exc_dct_in_ivas_fx( Q_hb_exc = 0; move16(); envelop_modify_fx( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ, *Q_exc, &Q_hb_exc ); -#ifdef REMOVE_EVS_DUPLICATES + test(); IF( GT_16( *Q_exc, Q_hb_exc ) && GT_16( element_mode, EVS_MONO ) ) -#else - IF( GT_16( *Q_exc, Q_hb_exc ) ) -#endif { Scale_sig( exc_wo_nf, L_frame, sub( Q_hb_exc, *Q_exc ) ); *Q_exc = Q_hb_exc; diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 8da9cd9ac..34c5df3af 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -3967,7 +3967,7 @@ ivas_error ivas_core_dec_fx( const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); -void decod_gen_2sbfr_ivas_fx( +void decod_gen_2sbfr_fx( Decoder_State *st, /* i/o: decoder static memory */ const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ const Word16 *Aq, /* i : LP filter coefficient Q12*/ diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index 5f0b3b57b..a7713b48c 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -2863,40 +2863,39 @@ Word16 qlsf_ARSN_tcvq_Dec_16k_fx( } /*======================================================================*/ -/* FUNCTION : lsf_syn_mem_backup_fx */ +/* FUNCTION : lsf_syn_mem_backup_fx */ /*----------------------------------------------------------------------*/ /* PURPOSE : back-up synthesis filter memory and LSF qunatizer memories */ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*) lsp_new : LSP vector to quantize */ -/* _ (Word16*) lsf_new : quantized LSF vector */ -/* _ (Word16*) lsp_mid : mid-frame LSP vector */ -/* _ (Encoder_State) st_fx : Encoder state Structure */ -/*-----------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16) clip_var : pitch clipping state var */ -/* _ (Word16*) mem_AR : quantizer memory for AR model */ -/* _ (Word16*) mem_MA : quantizer memory for MA model */ -/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ -/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ -/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ +/* INPUT ARGUMENTS : */ +/* _ (Word16*) lsp_new : LSP vector to quantize */ +/* _ (Word16*) lsf_new : quantized LSF vector */ +/* _ (Word16*) lsp_mid : mid-frame LSP vector */ +/* _ (Encoder_State) st_fx : Encoder state Structure */ +/*----------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16) clip_var : pitch clipping state var */ +/* _ (Word16*) mem_AR : quantizer memory for AR model */ +/* _ (Word16*) mem_MA : quantizer memory for MA model */ +/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ +/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ +/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ /* _ (Word16) mCb1 :counter for stationary frame after a transition frame */ -/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ -/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ -/* _ (Word16*) mem_syn_bck : synthesis filter memory */ -/* _ (Word16) mem_w0_bck : memory of the weighting filter */ -/* _ (Word16) streaklimit : LSF quantizer */ -/* _ (Word16) pstreaklen : LSF quantizer */ -/*-----------------------------------------------------------------------*/ - -/* _ None */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ +/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ +/* _ (Word16*) mem_syn_bck : synthesis filter memory */ +/* _ (Word16) mem_w0_bck : memory of the weighting filter */ +/* _ (Word16) streaklimit : LSF quantizer */ +/* _ (Word16) pstreaklen : LSF quantizer */ +/*----------------------------------------------------------------------*/ +/* _ None */ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ void lsf_syn_mem_backup_fx( Encoder_State *st_fx, /* o: state structure */ @@ -2904,23 +2903,22 @@ void lsf_syn_mem_backup_fx( Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* i: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* i: */ - - Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ - Word16 *lsf_new, /* i: quantized LSF vector Q15 */ - Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* i: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* i: quantizer memory for AR model 2.56 */ - Word16 *mem_MA, /* i: quantizer memory for MA model 2.56 */ - Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ - Word16 *lsf_new_bck, /* o: quantized LSF vector - backup Q15 */ - Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ - Word16 *mCb1, /* o: counter for stationary frame after a transition frame */ - Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets q_bin */ - Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets q_bin */ - Word16 *mem_syn_bck, /* i: synthesis filter memory q */ - Word16 *mem_w0_bck, /* i: memory of the weighting filter q */ - Word16 *streaklimit, /* i:LSF quantizer Q15 */ - Word16 *pstreaklen /* i:LSF quantizer */ + Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ + Word16 *lsf_new, /* i: quantized LSF vector Q15 */ + Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* i: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* i: quantizer memory for AR model 2.56 */ + Word16 *mem_MA, /* i: quantizer memory for MA model 2.56 */ + Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ + Word16 *lsf_new_bck, /* o: quantized LSF vector - backup Q15 */ + Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ + Word16 *mCb1, /* o: counter for stationary frame after a transition frame */ + Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets q_bin */ + Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets q_bin */ + Word16 *mem_syn_bck, /* i: synthesis filter memory q */ + Word16 *mem_w0_bck, /* i: memory of the weighting filter q */ + Word16 *streaklimit, /* i:LSF quantizer Q15 */ + Word16 *pstreaklen /* i:LSF quantizer */ ) { Word16 i; @@ -2985,25 +2983,31 @@ void lsf_syn_mem_backup_fx( return; } + +/*-------------------------------------------------------------------* + * lsf_syn_mem_backup_fx() + * + * + *--------------------------------------------------------------------*/ + void lsf_syn_mem_backup_ivas_fx( Encoder_State *st_fx, /* i: state structure */ Word16 *btilt_code_fx, /* i: tilt code Q15 */ Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* o: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* o: */ - - Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ - Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ - Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ - Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *streaklimit, /* Q15 */ + Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ + Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ + Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ + Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *streaklimit, /* Q15 */ Word16 *pstreaklen ) { Word16 i; @@ -3079,66 +3083,68 @@ void lsf_update_memory( move16(); mem_MA[i] = sub( sub( qlsf[i], lsf_means[narrowband][i] ), mult_r( MU_MA_FX, old_mem_MA[i] ) ); } + + return; } + /*======================================================================*/ -/* FUNCTION : lsf_syn_mem_restore_fx */ +/* FUNCTION : lsf_syn_mem_restore_fx */ /*----------------------------------------------------------------------*/ /* PURPOSE : restore synthesis filter memory and LSF quantizer memories*/ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) clip_var : pitch clipping state var */ -/* _ (Word16*) mem_AR : quantizer memory for AR model */ -/* _ (Word16*) mem_MA : quantizer memory for MA model */ -/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ -/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ -/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) clip_var : pitch clipping state var */ +/* _ (Word16*) mem_AR : quantizer memory for AR model */ +/* _ (Word16*) mem_MA : quantizer memory for MA model */ +/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ +/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ +/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ /* _ (Word16) mCb1 :counter for stationary frame after a transition frame */ -/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ -/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ -/* _ (Word16*) mem_syn_bck : synthesis filter memory */ -/* _ (Word16) mem_w0_bck : memory of the weighting filter */ -/* _ (Word16) streaklimit : LSF quantizer */ -/* _ (Word16) pstreaklen : LSF quantizer */ -/*-----------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) lsp_new : LSP vector to quantize */ -/* _ (Word16*) lsf_new : quantized LSF vector */ -/* _ (Word16*) lsp_mid : mid-frame LSP vector */ -/* _ (Encoder_State) st_fx : Encoder state Structure */ -/*-----------------------------------------------------------------------*/ - -/* _ None */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ +/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ +/* _ (Word16*) mem_syn_bck : synthesis filter memory */ +/* _ (Word16) mem_w0_bck : memory of the weighting filter */ +/* _ (Word16) streaklimit : LSF quantizer */ +/* _ (Word16) pstreaklen : LSF quantizer */ +/*----------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) lsp_new : LSP vector to quantize */ +/* _ (Word16*) lsf_new : quantized LSF vector */ +/* _ (Word16*) lsp_mid : mid-frame LSP vector */ +/* _ (Encoder_State) st_fx : Encoder state Structure */ +/*----------------------------------------------------------------------*/ +/* _ None */ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ + void lsf_syn_mem_restore_fx( Encoder_State *st_fx, /* o: state structure */ Word16 btilt_code_fx, /* i: Q15 */ Word32 gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* i: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 next_force_sf_bck_fx, /* i: */ - - Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ - Word16 *lsf_new, /* o: quantized LSF vector Q15 */ - Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ - Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ - Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ - Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ - Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ - Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ - Word16 mCb1, /* i: counter for stationary frame after a transition frame */ - Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 streaklimit, /* i:LSF quantizer Q15 */ - Word16 pstreaklen /* i:LSF quantizer */ + Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ + Word16 *lsf_new, /* o: quantized LSF vector Q15 */ + Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ + Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ + Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ + Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ + Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ + Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ + Word16 mCb1, /* i: counter for stationary frame after a transition frame */ + Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 streaklimit, /* i:LSF quantizer Q15 */ + Word16 pstreaklen /* i:LSF quantizer */ ) { Word16 i; diff --git a/lib_com/options.h b/lib_com/options.h index daa609ed4..86b786588 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,6 +95,4 @@ #define TEST_HR -#define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ - #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index e4d9b3dab..07e9dbdb1 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3286,67 +3286,33 @@ void synthesise_fb_high_band_fx( Word16 bpf_memory_Q[], Word16 Qout ); -#ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#ifdef ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate /* i :core bitrate */ -#ifdef ADD_IVAS_TBE_CODE - , - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -); -#endif - -void prep_tbe_exc_ivas_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -); - -Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ - const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ - Word16 *tilt_mem /* i/o: Tilt smoothing memory */ + const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + Word16 T0, /* i : integer pitch variables Q0 */ + Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ +); + +/*! r: Formant filter strength [0,1] */ +Word16 swb_formant_fac_fx( + const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ + Word16 *tilt_mem /* i/o: Tilt smoothing memory */ ); void wb_tbe_extras_reset_fx( @@ -4858,35 +4824,6 @@ Word16 BITS_ALLOC_config_acelp( const Word16 narrowband, const Word16 nb_subfr ); -#ifndef REMOVE_EVS_DUPLICATES -ivas_error config_acelp1( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signalling_bits, /* i : number of signalling bits */ - const Word16 coder_type, /* i : coder type */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ -); -#endif Word16 set_ACELP_flag( const Word16 element_mode, /* i : element mode */ const Word32 element_brate, /* i : element bitrate */ @@ -5833,35 +5770,19 @@ void tcx_ltp_post_fx32( Word32 *tcx_buf, /* sig_q */ Word16 sig_q ); -#ifndef REMOVE_EVS_DUPLICATES -// gs_inact_switching_fx.c -void Inac_swtch_ematch_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ - const Word16 L_frame, /* i : Frame lenght */ - const Word32 core_brate, /* i : Core bit rate */ - const Word16 Q_exc, /* i : i and output format of exc2 */ - const Word16 bfi, /* i : frame lost indicator */ - const short last_core, /* i : Last core used */ - const short last_codec_mode /* i : Last codec mode */ -); -#endif - -void Inac_switch_ematch_ivas_fx( +void Inac_switch_ematch_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ const Word16 coder_type, /* i : Coding mode */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ + const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ const Word16 L_frame, /* i : Frame lenght */ const Word16 Q_exc, /* i : input and output format of exc2 */ const Word16 bfi, /* i : frame lost indicator */ const Word16 last_core, /* i : Last core used */ const Word16 last_codec_mode, /* i : Last codec mode */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ - const Word16 element_mode /* i : element mode */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 element_mode /* i : element mode */ ); // igf_base_fx.c @@ -6094,32 +6015,16 @@ void td_bwe_dec_init_fx( const Word32 output_Fs /* i : output sampling rate */ ); -#ifndef REMOVE_EVS_DUPLICATES -// lsf_dec_fx.c void lsf_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ -); -#endif -void lsf_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + Decoder_State *st_fx, /* i/o: State structure */ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ + Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ + Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ); /*! r: index of the maximum value in the input vector */ @@ -6264,21 +6169,9 @@ void lsf_mid_dec_fx( Word16 lsp_mid[] /* o : quantized LSPs Q15*/ ); -#ifndef REMOVE_EVS_DUPLICATES -// cng_dec_fx.c void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ - Word16 Aq[], /* o : LP coefficients Q12 */ - Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ - Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ - Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0 */ - Word32 *q_env ); -#endif -void CNG_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ + const Word16 last_element_mode, /* i : last element mode Q0 */ Word16 Aq[], /* o : LP coefficients Q12 */ Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ @@ -6688,12 +6581,12 @@ void hf_synth_amr_wb_fx( // dec_post_fx void Init_post_filter_fx( PFSTAT_HANDLE hPFstat /* i : core decoder parameters */ -); /* (i) : core decoder parameters */ +); /* i : core decoder parameters */ void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *psf_lp_noise, /* i : Long term noise Q8 */ const Word16 tmp_noise, /* i : noise energy Q0 */ Word16 *Synth, /* i : 12k8 synthesis Qsyn */ @@ -6704,27 +6597,15 @@ void nb_post_filt_fx( const Word16 disable_hpf /* i : flag to diabled HPF */ ); -#ifndef REMOVE_EVS_DUPLICATES void formant_post_filt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient */ - Word16 *synth_out, /* i/o: i signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 rate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ -); -#endif -void formant_post_filt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient */ - Word16 *synth_out, /* i/o: i signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 rate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ + Word16 *Aq, /* i : LP filter coefficient Q12 */ + Word16 *synth_out, /* i/o: input signal */ + const Word16 L_frame, /* i : frame length */ + const Word32 lp_noise, /* (i) : background noise energy (15Q16) */ + const Word32 brate, /* (i) : bit-rate */ + const Word16 off_flag /* i : off flag */ ); void Filt_mu_fx( Word16 *sig_in, /* i : signal (beginning at sample -1) */ @@ -6890,65 +6771,34 @@ void PulseResynchronization_fx( Word32 /*float*/ const pitchEnd /*i Q16*/ ); -#ifndef REMOVE_EVS_DUPLICATES -// gs_dec_fx.c void decod_audio_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf /*Q14*/ -); -#endif -void decod_audio_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf, /*Q14*/ + Decoder_State *st_fx, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag Q0*/ const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6*/ ); -#ifndef REMOVE_EVS_DUPLICATES void gsc_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ - Word16 Q_exc ); -#endif -void gsc_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ + Decoder_State *st_fx, /* i/o: State structure */ + Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ const Word16 coder_type, /* i : coding type Q0*/ Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ + const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ Word16 *Q_exc ); void GSC_dec_init( @@ -6959,18 +6809,15 @@ void GSC_dec_init_ivas_fx( GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ ); - -// gain_dec_fx.c - void Es_pred_dec_fx( - Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ - const Word16 enr_idx, /* i : indice */ - const Word16 nb_bits, /* i : number of bits */ - const Word16 no_ltp /* i : no LTP flag */ + Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ + const Word16 enr_idx, /* i : indice */ + const Word16 nb_bits, /* i : number of bits */ + const Word16 no_ltp /* i : no LTP flag */ ); void gain_dec_tc_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ + Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 *code_fx, /* i : algebraic code excitation */ const Word16 i_subfr_fx, /* i : subframe number */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ @@ -7005,7 +6852,6 @@ void gain_dec_mless_fx( Word32 *norm_gain_code_fx /* o : norm. gain of the codebook excitation Q16*/ ); -#ifndef REMOVE_EVS_DUPLICATES void gain_dec_lbr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ @@ -7016,25 +6862,8 @@ void gain_dec_lbr_fx( Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[] /* i/o: gain_pitch from previous subframes */ - , - const Word16 L_subfr /* i : subfr lenght */ -); -#endif - -void gain_dec_lbr_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - const Word16 i_subfr, /* i : subframe index */ - const Word16 *code_fx, /* i : algebraic excitation Q9 */ - Word16 *gain_pit_fx, /* o : quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[] /* i/o: gain_pitch from previous subframes */ - , - const Word16 L_subfr /* i : subfr lenght */ + Word16 gp_mem[], /* i/o: gain_pitch from previous subframes */ + const Word16 L_subfr /* i : subfr lenght */ ); void lp_gain_updt_fx( @@ -7055,13 +6884,14 @@ void lp_gain_updt_ivas_fx( const Word16 L_frame /* i : length of the frame */ ); -Word32 gain_dec_gaus_fx( /* o : quantized codebook gain Q16 */ - Word16 index, /* i : quantization index */ - const Word16 bits, /* i : number of bits to quantize */ - const Word16 lowBound, /* i : lower bound of quantizer (dB) */ - const Word16 topBound, /* i : upper bound of quantizer (dB) */ - const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ +/*! r: quantized codebook gain Q16 */ +Word32 gain_dec_gaus_fx( + Word16 index, /* i : quantization index */ + const Word16 bits, /* i : number of bits to quantize */ + const Word16 lowBound, /* i : lower bound of quantizer (dB) */ + const Word16 topBound, /* i : upper bound of quantizer (dB) */ + const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ ); void gain_dec_SQ_fx( @@ -7155,23 +6985,7 @@ void re8_PPV_fx( Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0 */ ); -#ifndef REMOVE_EVS_DUPLICATES -// dec_pit_exc_fx.c void dec_pit_exc_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 coder_type, /* i : coding type */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *code_fx, /* o : innovation */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - const Word16 nb_subfr_fx /* i : Number of subframe considered */ - , - Word16 *gain_buf /*Q14*/ -); -#endif -void dec_pit_exc_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ const Word16 coder_type, /* i : coding type */ @@ -7181,7 +6995,7 @@ void dec_pit_exc_ivas_fx( Word16 *exc_fx, /* i/o: adapt. excitation exc */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ const Word16 nb_subfr_fx, /* i : Number of subframe considered */ - Word16 *gain_buf, /*Q14*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ); @@ -7225,24 +7039,8 @@ void Mode2_delta_pit_dec( Word16 **pt_indice /* i/o: pointer to Vector of Q indexes */ ); -#ifndef REMOVE_EVS_DUPLICATES -Word16 pit_decode_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr /* i : subframe length */ -); -#endif /* o : floating pitch value */ -Word16 pit_decode_ivas_fx( +Word16 pit_decode_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ @@ -7603,22 +7401,7 @@ void configureFdCngDec_fx( const Word16 Last_L_frame, const Word16 element_mode ); -#ifndef REMOVE_EVS_DUPLICATES -/* Apply the CLDFB-based CNG */ Word16 ApplyFdCng_fx( - Word16 *timeDomainInput, /* i : pointer to time domain i */ - Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - Word16 *powerSpectrum, -#endif - Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer */ - Word32 **cldfbBufferImag, /* i/o: imaginary part of the CLDFB buffer */ - Word16 *cldfbBufferScale, /* o : pointer to the scalefactor for real and imaginary part of the CLDFB buffer */ - Decoder_State *st, - const Word16 concealWholeFrame, /* i : binary flag indicating frame loss */ - Word16 is_music ); -#endif -Word16 ApplyFdCng_ivas_fx( Word16 *timeDomainInput, /* i : pointer to time domain input */ Word16 Q, Word32 *powerSpectrum, @@ -8210,14 +7993,11 @@ void FEC_pitch_estim_fx( const Word32 old_pitch_buf[], /* i : buffer of old subframe pitch values 15Q16 */ Word16 *bfi_pitch, /* i/o: update of the estimated pitch for FEC */ Word16 *bfi_pitch_frame, /* o : frame length when pitch was updated */ - Word16 *upd_cnt /* i/o: update counter */ - , - const Word16 coder_type, /* i : coder_type */ - Word16 element_mode /* i : element mode */ + Word16 *upd_cnt, /* i/o: update counter */ + const Word16 coder_type, /* i : coder_type */ + Word16 element_mode /* i : element mode */ ); -#ifndef REMOVE_EVS_DUPLICATES -// FEC_scale_sync_fx.c void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ @@ -8244,69 +8024,37 @@ void FEC_scale_syn_fx( Word16 *mem_syn, /* o: initial synthesis filter states */ Word16 Q_exc, Word16 Q_syn, + const Word16 element_mode, /* i : element mode */ const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ -); -#endif -void FEC_scale_syn_ivas_fx( - const Word16 L_frame, /* i : length of the frame */ - Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ - Word16 clas, /* i/o: frame classification */ - const Word16 last_good, /* i: last good frame classification */ - Word16 *synth, /* i/o: synthesized speech at Fs = 12k8 Hz */ - const Word16 *pitch, /* i: pitch values for each subframe */ - Word32 L_enr_old, /* i: energy at the end of previous frame */ - Word32 L_enr_q, /* i: transmitted energy for current frame */ - const Word16 coder_type, /* i: coder type */ - const Word16 LSF_Q_prediction, /* i : LSF prediction mode */ - Word16 *scaling_flag, /* i/o: flag to indicate energy control of syn */ - Word32 *lp_ener_FEC_av, /* i/o: averaged voiced signal energy */ - Word32 *lp_ener_FEC_max, /* i/o: averaged voiced signal energy */ - const Word16 bfi, /* i: current frame BFI */ - const Word32 total_brate, /* i: total bitrate */ - const Word16 prev_bfi, /* i: previous frame BFI */ - const Word32 last_core_brate, /* i: previous frame core bitrate */ - Word16 *exc, /* i/o: excitation signal without enhancement */ - Word16 *exc2, /* i/o: excitation signal with enhancement */ - Word16 Aq[], /* i/o: LP filter coefs (can be modified if BR) */ - Word16 *old_enr_LP, /* i/o: LP filter E of last good voiced frame */ - const Word16 *mem_tmp, /* i: temp. initial synthesis filter states */ - Word16 *mem_syn, /* o: initial synthesis filter states */ - Word16 Q_exc, - Word16 Q_syn, -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif - const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ + const Word16 force_scaling /* i : force scaling */ ); // LD_music_post_filter_fx.c void LD_music_post_filter_fx( - MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ - const Word16 dtc_in[], /* i : i synthesis Qdct */ - Word16 dtc_out[], /* o : output synthesis Qdct */ - const Word32 core_brate, /* i : core bitrate Q0 */ - Word16 *Old_ener_Q, /* i/o : Old energy scaling factor */ - const Word16 coder_type, /* i : Coder type : -1 in case of IO Q0 */ - const Word16 Last_coder_type, /* i : i scaling Q0 */ - const Word16 Qdct /* i : i scaling Q0 */ + MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ + const Word16 dtc_in[], /* i : i synthesis Qdct */ + Word16 dtc_out[], /* o : output synthesis Qdct */ + const Word32 core_brate, /* i : core bitrate Q0 */ + Word16 *Old_ener_Q, /* i/o: Old energy scaling factor */ + const Word16 coder_type, /* i : Coder type : -1 in case of IO Q0 */ + const Word16 Last_coder_type, /* i : i scaling Q0 */ + const Word16 Qdct /* i : i scaling Q0 */ ); void Prep_music_postP_fx( - Word16 exc_buffer_in[], /* i/o: excitation buffer Q_exc*/ - Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ - Word16 filt_lfE[], /* i/o: long term spectrum energy Q15 */ - const Word16 last_core, /* i : last core */ - const Word16 element_mode, /* i : element mode */ - const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ - Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per bin FFT Q15*/ - const Word16 Q_exc, /* i : excitation scaling */ - Word16 *qdct /* o : Scaling factor of dct coefficient */ + Word16 exc_buffer_in[], /* i/o: excitation buffer Q_exc*/ + Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ + Word16 filt_lfE[], /* i/o: long term spectrum energy Q15 */ + const Word16 last_core, /* i : last core */ + const Word16 element_mode, /* i : element mode */ + const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ + Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per bin FFT Q15*/ + const Word16 Q_exc, /* i : excitation scaling */ + Word16 *qdct /* o : Scaling factor of dct coefficient */ ); void Post_music_postP_fx( - Word16 dct_buffer_in[], /* i/o: excitation buffer */ + Word16 dct_buffer_in[], /* i/o: excitation buffer */ Word16 *exc2, /* i/o: Current excitation to be overwriten */ const Word16 *mem_tmp, /* i : previous frame synthesis memory */ Word16 *st_mem_syn2, /* i/o: current frame synthesis memory */ @@ -8316,15 +8064,14 @@ void Post_music_postP_fx( Word16 *prev_Q_syn, /* i : previsous frame synthesis scaling */ Word16 *Q_syn, /* i : Current frame synthesis scaling */ Word16 *mem_syn_clas_estim_fx, /* i : old 12k8 synthesis used for frame classification*/ - const Word16 IsIO, /* i: Flag to indicate IO mode */ - Word16 *mem_deemph, /* i/o: speech deemph filter memory */ - Word16 *st_pst_old_syn_fx, /* i/o: psfiler */ - Word16 *st_pst_mem_deemp_err_fx, /* i/o: psfiler */ + const Word16 IsIO, /* i : Flag to indicate IO mode */ + Word16 *mem_deemph, /* i/o: speech deemph filter memory */ + Word16 *st_pst_old_syn_fx, /* i/o: psfiler */ + Word16 *st_pst_mem_deemp_err_fx, /* i/o: psfiler */ Word16 *mem_agc, - PFSTAT *pf_stat, /* i/o: All memories related to NB post filter */ - const Word16 *tmp_buffer /* tmp_buffer in Q-1 */ - , - Word16 *mem_tmp2 /* Temporary memory used with scale_syn */ + PFSTAT *pf_stat, /* i/o: All memories related to NB post filter */ + const Word16 *tmp_buffer, /* tmp_buffer in Q-1 */ + Word16 *mem_tmp2 /* Temporary memory used with scale_syn */ ); void music_postfilt_init( @@ -8556,29 +8303,17 @@ Word16 FEC_enhACB_fx( const Word16 puls_pos, /* i : decoder position of the last glottal pulses decoded in the previous frame */ const Word16 bfi_pitch /* i : Q6 pitch used for concealment */ ); -Word16 FEC_synchro_exc_fx( /* o : do_WI flag */ - const Word16 L_frame, /* i : length of the frame */ - Word16 *exc, /* i/o: exc vector to modify */ - const Word16 desire_puls_pos, /* i : Pulse position send by the encoder */ - const Word16 true_puls_pos, /* i : Present pulse location */ - const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ + +/*! r: do_WI flag */ +Word16 FEC_synchro_exc_fx( + const Word16 L_frame, /* i : length of the frame */ + Word16 *exc, /* i/o: exc vector to modify */ + const Word16 desire_puls_pos, /* i : Pulse position send by the encoder */ + const Word16 true_puls_pos, /* i : Present pulse location */ + const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ ); -#ifndef REMOVE_EVS_DUPLICATES -// dec_uv_fx.c void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q5 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ - Word16 *gain_buf ); -#endif -void decod_unvoiced_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ @@ -8621,38 +8356,20 @@ void gaus_L2_dec( Word16 *seed_acelp /*i/o : random seed Q0 */ ); -#ifndef REMOVE_EVS_DUPLICATES -// dec_gen_voic_fx.c ivas_error decod_gen_voic_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* o : voicing factors */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf /*Q14*/ -); -#endif -ivas_error decod_gen_voic_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* o : voicing factors */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf, + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 sharpFlag_fx, /* i : formant sharpening flag */ + const Word16 *Aq_fx, /* i : LP filter coefficient */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ + const Word16 do_WI_fx, /* i : do interpolation after a FER */ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ + Word16 *voice_factors_fx, /* o : voicing factors */ + Word16 *exc_fx, /* i/o: adapt. excitation exc */ + Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ + Word16 *unbits, /* number of unused bits */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ); @@ -9582,33 +9299,6 @@ void d_gain_pred_fx( Word16 **pt_indice /* i/o: pointer to the buffer of indices */ ); -#ifndef REMOVE_EVS_DUPLICATES -// acelp_core_dec_fx.c -ivas_error acelp_core_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 output[], /* o : synthesis @internal Fs */ - Word16 synth_out[], /* o : synthesis */ - Word16 save_hb_synth[], /* o : HB synthesis */ - Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation */ - Word16 *voice_factors, /* o : voicing factors */ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis for SWB BWE */ - Word16 sharpFlag, - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe */ - Word16 *unbits, /* o : number of unused bits */ - Word16 *sid_bw /* o : 0-NB/WB, 1-SWB SID */ - , - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const Word16 last_element_mode, /* i : last element mode */ - const Word32 last_element_brate, /* i : last element bitrate */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - const Word16 nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const Word16 read_sid_info /* i : read SID info flag */ -); -#endif // evs_dec_fx.c ivas_error evs_dec_fx( Decoder_State *st_fx, /* i/o : Decoder state structure */ @@ -10678,7 +10368,7 @@ Word16 swb_bwe_dec_fx32( Word16 output_frame /* i : frame length */ ); -ivas_error acelp_core_dec_ivas_fx( +ivas_error acelp_core_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 output_fx[], /* o : synthesis @internal Fs */ Word16 synth_fx16[], /* o : synthesis */ @@ -10975,6 +10665,7 @@ Word16 ari_decode_14bits_pow_ivas( Word16 *res, Tastat *s, UWord16 base ); + Word16 ari_decode_14bits_sign_ivas( Word16 *ptr, Word16 bp, @@ -10988,22 +10679,21 @@ void lsf_syn_mem_backup_ivas_fx( Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* o: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* o: */ - - Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ - Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ - Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ - Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *streaklimit, /* Q15 */ + Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ + Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ + Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ + Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *streaklimit, /* Q15 */ Word16 *pstreaklen ); -ivas_error config_acelp1_IVAS( +ivas_error config_acelp1_fx( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ const Word32 core_brate_inp, /* i : core bitrate */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2c0da33f5..fd841b67b 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7359,33 +7359,27 @@ void tbe_celp_exc( /* _ None */ /*======================================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#ifdef ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#ifdef ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - const int16_t flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif + const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + Word16 T0, /* i : integer pitch variables Q0 */ + Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ ) { Word16 i; @@ -7396,176 +7390,6 @@ void prep_tbe_exc_fx( Word16 tmp /*, tmp1, tmp2*/; /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ Word16 pitch; - - Word32 L_tmp, Ltemp1, Ltemp2; - Word32 tempQ31; - Word16 tempQ15; -#ifndef ADD_IVAS_TBE_CODE - Word16 L_subfr = L_SUBFR; - move16(); -#endif -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; - = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) - *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */ - tempQ31 = L_deposit_h( VF_1st_PARAM_FX ); - tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); - tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); - *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); - move16(); - tmp = MAX_16; - move16(); - - pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ - - test(); - test(); - IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 /* 115.5 in Q7 */ ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) ) - { - tmp = MAX_16; - move16(); - *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); - move16(); - } - - *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); - move16(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) - { - IF( flag_TD_BWE && i_subfr == 0 ) - { - set16_fx( bwe_exc, 0, L_FRAME32k ); - } - return; - } - -#endif - IF( EQ_16( L_frame_fx, L_FRAME ) ) - { - interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ - gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ - FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ - L_tmp = L_shl_sat( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ - L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ - move16(); - } - } - ELSE - { - IF( gain_preQ_fx != 0 ) - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ - - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ - - tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ - move16(); - } - } - ELSE - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ - move16(); - } - } - - interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < L_subfr * 2; i++ ) - { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] ); /*Q14+Q_exc+1 */ - tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ - move16(); - } - } - - return; -} - -/*======================================================================================*/ -/* FUNCTION : prep_tbe_exc_ivas_fx() */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Prepare TBE excitation */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) L_frame_fx : length of the frame */ -/* _ (Word16) i_subfr_fx : subframe index */ -/* _ (Word16) gain_pit_fx : Pitch gain (14) */ -/* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */ -/* _ (Word16*[]) code_fx : algebraic excitation (Q9) */ -/* _ (Word16) voice_fac_fx : voicing factor (Q15) */ -/* _ (Word16) gain_preQ_fx : prequantizer excitation gain */ -/* _ (Word16[]) code_preQ_fx : prequantizer excitation */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ -/*--------------------------------------------------------------------------------------*/ - -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================================*/ -#endif -void prep_tbe_exc_ivas_fx( - const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif -) -{ - Word16 i; - Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; - Word16 tmp_code_preInt_fx[L_SUBFR]; - Word16 gain_code16 = 0; - move16(); - Word16 tmp /*, tmp1, tmp2*/; - /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ - Word16 pitch; - Word32 L_tmp, Ltemp1, Ltemp2; Word32 tempQ31; Word16 tempQ15; @@ -7600,7 +7424,7 @@ void prep_tbe_exc_ivas_fx( *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); move16(); -#if 1 // def ADD_IVAS_TBE_CODE + test(); test(); IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) @@ -7613,7 +7437,6 @@ void prep_tbe_exc_ivas_fx( return; } -#endif IF( EQ_16( L_frame_fx, L_FRAME ) ) { interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ @@ -7672,6 +7495,7 @@ void prep_tbe_exc_ivas_fx( return; } + /*=============================================================================*/ /* FUNCTION : void swb_formant_fac_fx ( ) */ /*------------------------------------------------------------------------------*/ @@ -7691,9 +7515,10 @@ void prep_tbe_exc_ivas_fx( /* CALLED FROM : */ /*==============================================================================*/ -Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ - const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ - Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ +/*! r: Formant filter strength [0,1] */ +Word16 swb_formant_fac_fx( + const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ + Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ ) { Word16 formant_fac; @@ -7713,7 +7538,6 @@ Word16 swb_formant_fac_fx( /* o : Formant filter strength tmp = sub( tmp, SWB_TILT_LOW_FX ); /* Q12 */ formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */ - IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) ) { formant_fac = 4096; /* 1 in Q12 */ @@ -7733,6 +7557,12 @@ Word16 swb_formant_fac_fx( /* o : Formant filter strength } +/*-------------------------------------------------------------------* + * wb_tbe_extras_reset_fx() + * + * + *-------------------------------------------------------------------*/ + void wb_tbe_extras_reset_fx( Word16 mem_genSHBexc_filt_down_wb2[], Word16 mem_genSHBexc_filt_down_wb3[] ) @@ -7749,7 +7579,6 @@ void wb_tbe_extras_reset_fx( * Determine TBE bit consumption per frame from bitrate * *-------------------------------------------------------------------*/ - Word16 get_tbe_bits_fx( const Word32 total_brate, /* o : TBE bit consumption per frame */ const Word16 bwidth, /* i : overall bitrate */ diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index a23c9aa90..48d91a87a 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -510,19 +510,10 @@ void FEC_exc_estim_fx( move16(); /* st_fx->L_frame / L_SUBFR */ tmp = shr( st_fx->L_frame, 6 ); + /* Replication of the last spectrum, with a slight downscaling of its dynamic */ -#ifdef REMOVE_EVS_DUPLICATES - gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); -#else - IF( st_fx->element_mode == EVS_MONO ) - { - gsc_dec_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, st_fx->Q_exc ); - } - ELSE - { - gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); - } -#endif + gsc_dec_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); + *tmp_noise = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ move16(); /* Transform back to time domain */ diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index 714a60166..7f4586083 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -50,7 +50,6 @@ /* _ None */ /*========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ @@ -77,574 +76,7 @@ void FEC_scale_syn_fx( Word16 *mem_syn, /* o: initial synthesis filter states Q_syn*/ Word16 Q_exc, Word16 Q_syn, - const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ -) -{ - Word16 i; - Word32 L_enr1, L_enr2; - Word16 gain1, gain2, enr_LP; - Word16 tmp, tmp2, exp, exp2; - Word16 tmp3; - Word32 L_tmp; - Word16 scaling; - Word32 ener_max, L_enr2_av, L_ener2_max; - Word16 h1[L_FRAME / 2], tilt, pitch_dist, mean_pitch; - Word16 k; - Word32 L_mean_pitch; - - enr_LP = 0; - move16(); - gain2 = 0; - move16(); - gain1 = 0; - move16(); - *update_flg = 0; - move16(); - L_enr_old = L_max( 1, L_enr_old ); /* to avoid division by zero (*L_enr_old is always >= 0) */ - scaling = 16384; - move16(); /* Q14*/ - - /*-----------------------------------------------------------------* - * Find the synthesis filter impulse response on voiced - *-----------------------------------------------------------------*/ - test(); - IF( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - enr_LP = Enr_1_Az_fx( Aq + ( NB_SUBFR - 1 ) * ( M + 1 ), L_SUBFR ); - } - ELSE /* L_frame == L_FRAME16k */ - { - enr_LP = Enr_1_Az_fx( Aq + ( NB_SUBFR16k - 1 ) * ( M + 1 ), L_SUBFR ); /*Q3*/ - } - } - - /*-----------------------------------------------------------------* - * Define when to scale the synthesis - *-----------------------------------------------------------------*/ - - IF( bfi ) - { - *scaling_flag = 1; - move16(); /* Always check synthesis on bad frames */ - } - ELSE IF( prev_bfi ) - { - test(); - IF( ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) || ( EQ_16( LSF_Q_prediction, MOVING_AVERAGE ) ) ) - { - *scaling_flag = 2; - move16(); /* Decoded LSFs affected */ - } - ELSE IF( NE_16( coder_type, TRANSITION ) ) - { - *scaling_flag = 1; - move16(); /* SN, but not TC mode - LSF still affected by the interpolation */ - } - ELSE - { - *scaling_flag = 0; - move16(); /* LSF still possibly affected due to interpolation */ - } - scaling = 24576; /*1.5 Q14*/ - move16(); - } - ELSE - { - test(); - IF( ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) && ( EQ_16( *scaling_flag, 2 ) ) ) - { - *scaling_flag = 2; - move16(); /* Continue with energy control till the end of AR prediction */ - } - ELSE IF( *scaling_flag > 0 ) - { - ( *scaling_flag ) = sub( *scaling_flag, 1 ); /* If scaling flag was equal to 2, add one control frame to account for the LSF interpolation */ - move16(); - } - scaling = 32767; /*2.0 Q14*/ - move16(); - } - - /*-----------------------------------------------------------------* - * Find the energy/gain at the end of the frame - *-----------------------------------------------------------------*/ - - frame_ener_fx( L_frame, clas, synth, pitch[( L_frame >> 6 ) - 1], &L_enr2 /*Q0*/, 1, Q_syn, 3, 0 ); - - - test(); - test(); - IF( bfi || ( EQ_32( total_brate, ACELP_7k20 ) ) || ( EQ_32( total_brate, ACELP_8k00 ) ) ) - { - /* previous frame erased and no TC frame */ - IF( *scaling_flag > 0 ) - { - /*enr2 += 0.01f;*/ - L_enr2 = L_max( L_enr2, 1 ); /* L_enr2 is in Q0 */ - - IF( bfi ) /* In all bad frames, limit the gain to 1 */ - { - /* gain2 = (float)sqrt( enr_old / enr2 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr2, 0, &exp2 ); - gain2 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain2 > 1.0f )gain2 = 1.0f;*/ - gain2 = s_min( gain2, 16384 ); - - /* find the energy/gain at the beginning of the frame */ - frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1 /*Q0*/, 1, Q_syn, 3, 0 ); - - /*enr1 += 0.1f;*/ - L_enr1 = L_max( L_enr1, 1 ); /* L_enr2 is in Q0 */ - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr1, 0, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain1 > 1.0f )gain1 = 1.0f;*/ - gain1 = s_min( gain1, 16384 ); /*Q14*/ - } - ELSE /* good frame */ - { - IF( L_enr_q == 0 ) /* If E info (FEC protection bits) is not available in the bitstream */ - { - L_enr_q = L_enr2; /*Q0*/ - set16_fx( h1, 0, L_FRAME / 2 ); - h1[0] = 1024; /*1.0f in Q10*/ - move16(); - /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); - - /*Compute tilt */ - /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ - /*rr1 = dotp( h1, h1+1, L_FRAME/2-1 );*/ - /*tilt = rr1 / rr0;*/ - tilt = extract_h( L_shl_sat( get_gain( h1 + 1, h1, L_FRAME / 2 - 1 ), 15 ) ); /*Q15*/ - pitch_dist = 0; - move16(); - L_mean_pitch = L_mult( pitch[0], 8192 /*1.0f in Q13*/ ); /*Q14*/ - FOR( k = 0; k < ( NB_SUBFR - 1 ); k++ ) - { - pitch_dist = add( pitch_dist, abs_s( sub( pitch[k + 1], pitch[k] ) ) ); /*Q0*/ - L_mean_pitch = L_mac( L_mean_pitch, pitch[k + 1], 8192 ); /*Q14*/ - } - /*pitch_dist /= (float)(NB_SUBFR-1); */ - pitch_dist = mult_r( shl( pitch_dist, 4 ), 10923 /*1/(float)(NB_SUBFR-1) in Q15*/ ); /*Q4*/ - /*mean_pitch /= (float)(NB_SUBFR);*/ - mean_pitch = extract_h( L_shl( L_mean_pitch, 4 ) ); /*Q4*/ - - - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ - ( ( GT_16( pitch_dist, 8 << 4 ) ) || ( LT_16( mean_pitch, PIT_MIN << 4 ) ) ) && /* pitch unstable or very short */ - ( ( prev_bfi ) || ( ( EQ_16( coder_type, GENERIC ) ) && ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) ) ) ) - { - /*if( enr_q > scaling * enr_old ){enr_q = scaling * enr_old;}*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( L_enr_old, scaling ), 1 ) ); /* scaling in Q14*/ - } - ELSE - { - ener_max = *lp_ener_FEC_max; /*Q0*/ - move32(); - test(); - if ( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) - { - ener_max = *lp_ener_FEC_av; /*Q0*/ - move32(); - } - /*if( enr_old > ener_max )ener_max = enr_old;*/ - ener_max = L_max( ener_max, L_enr_old ); - - /*if( enr_q > scaling * ener_max ){enr_q = scaling * ener_max;}*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( ener_max, scaling ), 1 ) ); /* scaling in Q14*/ - } - } - /*gain2 = (float)sqrt( enr_q / enr2 );*/ - L_enr_q = L_max( L_enr_q, 1 ); /* L_enr2 is in Q0 */ - L_tmp = Sqrt_Ratio32( L_enr_q, 0, L_enr2, 0, &exp2 ); - gain2 = round_fx( L_shl( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*-----------------------------------------------------------------* - * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) && - prev_bfi ) - { - /* voiced -> unvoiced signal transition */ - /* CNG -> active signal transition */ - gain1 = gain2; /*Q14*/ - move16(); - } - ELSE - { - /* find the energy at the beginning of the frame */ - frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1 /*Q0*/, 1, Q_syn, 3, 0 ); - - /*enr1 += 0.1f;*/ - L_enr1 = L_max( L_enr1, 1 ); /* L_enr1 is in Q0 */ - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr1, 0, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain1 > 1.2f )gain1 = 1.2f;*/ - /* prevent clipping */ - gain1 = s_min( gain1, 19661 /*1.2f in Q14*/ ); - - /* prevent amplifying the unvoiced or inactive part of the frame in case an offset is followed by an onset */ - test(); - test(); - if ( EQ_16( clas, ONSET ) && GT_16( gain1, gain2 ) && prev_bfi ) - { - gain1 = gain2; /*Q14*/ - move16(); - } - } - - L_enr2 = L_enr_q; /*Q0*/ - move32(); /* Set the end frame energy to the scaled energy, to be used in the lp_ener_FEC */ - } - - /*------------------------------------------------------------------------------* - * Smooth the energy evolution by exponentially evolving from gain1 to gain2 - *------------------------------------------------------------------------------*/ - - /*gain2 *= ( 1.0f - AGC );*/ - L_tmp = L_mult( gain2, (Word16) ( 32768 /*Q15*/ - AGC_FX ) ); /*Q30*/ - FOR( i = 0; i < L_frame; i++ ) - { - /*gain1 = gain1 * AGC + gain2;*/ - gain1 = mac_r( L_tmp, gain1, AGC_FX ); /* in Q14 */ - /*exc[i] *= gain1;*/ - exc[i] = mac_r( L_mult( exc[i], gain1 ), exc[i], gain1 ); - move16(); - /*exc2[i] *= gain1;*/ - exc2[i] = mac_r_sat( L_mult( exc2[i], gain1 ), exc2[i], gain1 ); - move16(); - } - /* smoothing is done in excitation domain, so redo synthesis */ - Copy( mem_tmp, mem_syn, M ); /* Q_syn */ - syn_12k8_fx( L_frame, Aq, exc2, synth, mem_syn, 1, Q_exc, Q_syn ); - *update_flg = 1; - move16(); - } - } - ELSE - { - /* previous frame erased and no TC frame */ - test(); - IF( prev_bfi && NE_16( coder_type, TRANSITION ) ) - { - IF( L_enr_q == 0 ) - { - L_enr_q = L_max( 1, L_enr2 ); /* sets to 'L_enr2' in 1 clock */ - set16_fx( h1, 0, L_FRAME / 2 ); - h1[0] = 1024; /*1.0f in Q10*/ - move16(); - /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); - /*Compute tilt */ - /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ - /*rr1 = dotp( h1, h1+1, L_FRAME/2-1 );*/ - /*tilt = rr1 / rr0;*/ - tilt = extract_h( L_shl_sat( get_gain( h1 + 1, h1, L_FRAME / 2 - 1 ), 15 ) ); /*Q15*/ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( ( EQ_32( total_brate, ACELP_13k20 ) ) || ( EQ_32( total_brate, ACELP_12k85 ) ) || ( EQ_32( total_brate, ACELP_12k15 ) ) || ( EQ_32( total_brate, ACELP_11k60 ) ) || - ( EQ_32( total_brate, ACELP_9k60 ) ) ) && - ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ - ( ( ( clas == UNVOICED_CLAS ) ) || ( EQ_16( clas, INACTIVE_CLAS ) ) ) ) ) /* unvoiced classification */ - { - /*if( enr_q > scaling * enr_old )enr_q = scaling * enr_old;*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( L_enr_old, scaling ), 1 ) ); /* scaling in Q14*/ - } - ELSE IF( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - /* Voiced-voiced recovery */ - test(); - IF( *old_enr_LP != 0 && GT_16( enr_LP, shl_sat( *old_enr_LP, 1 ) ) ) - { - /* enr_q /= enr_LP */ - exp = norm_l( L_enr_q ); - tmp = extract_h( L_shl( L_enr_q, exp ) ); - - exp2 = norm_s( enr_LP ); - tmp2 = shl( enr_LP, exp2 ); - - exp = sub( exp2, exp ); - - tmp3 = sub( tmp, tmp2 ); - IF( tmp3 > 0 ) - { - tmp = shr( tmp, 1 ); - exp = add( exp, 1 ); - } - tmp = div_s( tmp, tmp2 ); - - /* L_enr_q *= 2 * *old_enr_LP */ - L_enr_q = L_shl( L_mult( tmp, shl( *old_enr_LP, 1 ) ), exp ); - } - - ELSE - { - test(); - IF( avoid_lpc_burst_on_recovery && GT_16( enr_LP, 160 /*20.0f in Q3*/ ) ) - { - exp = norm_s( enr_LP ); - tmp = shl( enr_LP, exp ); - - exp2 = 7; - move16(); - tmp2 = 160 << 7; /* 160 = 20.0f in Q3 */ - move16(); - exp = sub( exp2, exp ); - - IF( GT_16( tmp, tmp2 ) ) - { - tmp = shr( tmp, 1 ); - exp = add( exp, 1 ); - } - tmp = div_s( tmp, tmp2 ); /* tmp*2^exp = enr_LP/20.0 */ - L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* L_tmp*2^exp = sqrt(20.0/enr_LP) */ - L_enr_q = L_shl( Mpy_32_32( L_enr_q, L_tmp ), exp ); - } - } - } - - test(); - test(); - test(); - test(); - IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) || force_scaling ) - { - - IF( GT_32( L_enr_q, L_enr_old ) ) /* Prevent energy to increase on voiced */ - { - L_enr_q = L_add( Mpy_32_16_1( L_enr_old, 32767 - SCLSYN_LAMBDA ), Mpy_32_16_1( L_enr_q, SCLSYN_LAMBDA ) ); /*Q0*/ - } - } - } - - L_enr_q = L_max( 1, L_enr_q ); - - /* gain2 = (float)sqrt( enr_q / enr2 );*/ - exp = norm_l( L_enr_q ); - tmp = extract_h( L_shl( L_enr_q, exp ) ); - - exp2 = norm_l( L_enr2 ); - tmp2 = extract_h( L_shl( L_enr2, exp2 ) ); - - exp2 = sub( exp, exp2 ); /* Denormalize and substract */ - - tmp3 = sub( tmp2, tmp ); - IF( tmp3 > 0 ) - { - tmp2 = shr( tmp2, 1 ); - exp2 = add( exp2, 1 ); - } - - tmp = div_s( tmp2, tmp ); - - L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp2 ); - gain2 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - /*-----------------------------------------------------------------* - * Clipping of the smoothing gain at the frame end - *-----------------------------------------------------------------*/ - - gain2 = s_min( gain2, 19661 /*1.2f in Q14*/ ); /* Gain modification clipping */ - if ( LT_32( L_enr_q, 2 ) ) - { - gain2 = s_min( gain2, 16384 /*1.0f in Q14*/ ); /* Gain modification clipping */ - } - - /*-----------------------------------------------------------------* - * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( clas, SIN_ONSET ) ) /* slow increase */ - { - gain1 = shr( gain2, 1 ); /*0.5f * gain2*/ - } - /*------------------------------------------------------------* - * voiced->unvoiced transition recovery - *------------------------------------------------------------*/ - ELSE IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || /* voiced->unvoiced transition recovery */ - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) /* CNG -> active signal transition */ - { - gain1 = gain2; /*Q14*/ - move16(); - } - ELSE - { - /*--------------------------------------------------------* - * Find the energy at the beginning of the frame - *--------------------------------------------------------*/ - tmp = frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1, 0, Q_syn, 3, 0 ); - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - exp = norm_l( L_enr_old ); - tmp = extract_h( L_shl( L_enr_old, exp ) ); - exp2 = norm_l( L_enr1 ); - tmp2 = extract_h( L_shl( L_enr1, exp2 ) ); - - exp2 = sub( exp, exp2 ); /* Denormalize and substract */ - - tmp3 = sub( tmp2, tmp ); - - IF( tmp3 > 0 ) - { - tmp2 = shr( tmp2, 1 ); - exp2 = add( exp2, 1 ); - } - - tmp = div_s( tmp2, tmp ); - - L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - /* exp2 is always <= 1 */ - - gain1 = s_min( gain1, 19661 /*1.2F in Q14*/ ); - - test(); - test(); - if ( avoid_lpc_burst_on_recovery && ( GT_16( enr_LP, 160 ) ) && ( LE_16( enr_LP, shl_sat( *old_enr_LP, 1 ) ) ) ) - { - gain1 = s_min( gain1, 16384 /*1.0f in Q14*/ ); - } - - /*--------------------------------------------------------* - * Prevent a catastrophy in case of offset followed by onset - *--------------------------------------------------------*/ - test(); - if ( ( EQ_16( clas, ONSET ) ) && ( GT_16( gain1, gain2 ) ) ) - { - gain1 = gain2; /*Q14*/ - move16(); - } - } - /*-----------------------------------------------------------------* - * Smooth the energy evolution by exponentially evolving from - * gain1 to gain2 - *-----------------------------------------------------------------*/ - - L_tmp = L_mult( gain2, (Word16) ( 32768 /*Q15*/ - AGC_FX ) ); - - FOR( i = 0; i < L_frame; i++ ) - { - gain1 = mac_r( L_tmp, gain1, AGC_FX ); /* in Q14 */ - exc[i] = mac_r_sat( L_mult_sat( exc[i], gain1 ), exc[i], gain1 ); - move16(); - exc2[i] = mac_r_sat( L_mult_sat( exc2[i], gain1 ), exc2[i], gain1 ); - move16(); - } - - Copy( mem_tmp, mem_syn, M ); /* Q_syn */ - syn_12k8_fx( L_frame, Aq, exc2, synth, mem_syn, 1, Q_exc, Q_syn ); - *update_flg = 1; - move16(); - } - } - /*-----------------------------------------------------------------* - * Update low-pass filtered energy for voiced frames - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( !bfi && ( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) ) - { - IF( EQ_16( clas, VOICED_TRANSITION ) ) - { - L_enr2_av = L_enr2; /*Q0*/ - move32(); - frame_ener_fx( L_frame, VOICED_CLAS, synth, pitch[sub( shr( L_frame, 6 ), 1 )], &L_ener2_max /*Q0*/, 1, Q_syn, 3, 0 ); - } - ELSE - { - L_ener2_max = L_enr2; /*Q0*/ - move32(); - frame_ener_fx( L_frame, UNVOICED_CLAS, synth, pitch[sub( shr( L_frame, 6 ), 1 )], &L_enr2_av /*Q0*/, 1, Q_syn, 3, 0 ); - } - - /**lp_ener_FEC_av = 0.2f * enr2_av + 0.8f * *lp_ener_FEC_av; move32();*/ - *lp_ener_FEC_av = Madd_32_16( Mult_32_16( *lp_ener_FEC_av, 31130 /*0.95f in Q15*/ ), L_enr2_av, 1638 /*0.05F Q15*/ ); /*Q0*/ - move32(); - /**lp_ener_FEC_max = 0.2f * enr2_max + 0.8f * *lp_ener_FEC_max; move32();*/ - *lp_ener_FEC_max = Madd_32_16( Mult_32_16( *lp_ener_FEC_max, 31130 /*0.95f in Q15*/ ), L_ener2_max, 1638 /*0.05F Q15*/ ); /*Q0*/ - move32(); - } - - /*-----------------------------------------------------------------* - * Update the LP filter energy for voiced frames - *-----------------------------------------------------------------*/ - test(); - if ( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - *old_enr_LP = enr_LP; /*Q3*/ - move16(); - } - - return; -} -#endif -void FEC_scale_syn_ivas_fx( - const Word16 L_frame, /* i : length of the frame */ - Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ - Word16 clas, /* i/o: frame classification */ - const Word16 last_good, /* i: last good frame classification */ - Word16 *synth, /* i/o: synthesized speech at Fs = 12k8 Hz Q_syn*/ - const Word16 *pitch, /* i: pitch values for each subframe Q0*/ - Word32 L_enr_old, /* i: energy at the end of previous frame */ - Word32 L_enr_q, /* i: transmitted energy for current frame */ - const Word16 coder_type, /* i: coder type */ - const Word16 LSF_Q_prediction, /* i : LSF prediction mode */ - Word16 *scaling_flag, /* i/o: flag to indicate energy control of syn */ - Word32 *lp_ener_FEC_av, /* i/o: averaged voiced signal energy Q0*/ - Word32 *lp_ener_FEC_max, /* i/o: averaged voiced signal energy Q0*/ - const Word16 bfi, /* i: current frame BFI */ - const Word32 total_brate, /* i: total bitrate */ - const Word16 prev_bfi, /* i: previous frame BFI */ - const Word32 last_core_brate, /* i: previous frame core bitrate */ - Word16 *exc, /* i/o: excitation signal without enhancement */ - Word16 *exc2, /* i/o: excitation signal with enhancement */ - Word16 Aq[], /* i/o: LP filter coefs (can be modified if BR) Q12*/ - Word16 *old_enr_LP, /* i/o: LP filter E of last good voiced frame Q3*/ - const Word16 *mem_tmp, /* i: temp. initial synthesis filter states Q_syn*/ - Word16 *mem_syn, /* o: initial synthesis filter states Q_syn*/ - Word16 Q_exc, - Word16 Q_syn, -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif + const Word16 element_mode, /* i : element mode */ const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ const Word16 force_scaling /* i: force scaling */ ) @@ -742,12 +174,8 @@ void FEC_scale_syn_ivas_fx( tmp = sub( 3, getScaleFactor16( synth, L_frame ) ); -#ifdef REMOVE_EVS_DUPLICATES test(); IF( tmp > 0 && GT_16( element_mode, EVS_MONO ) ) -#else - IF( tmp > 0 ) -#endif { Word16 synth_tmp[L_FRAME16k]; Copy_Scale_sig( synth, synth_tmp, L_frame, -tmp ); // Q_synth - tmp diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c deleted file mode 100644 index 0fbedff60..000000000 --- a/lib_dec/acelp_core_dec_fx.c +++ /dev/null @@ -1,1544 +0,0 @@ -/*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 - ====================================================================================*/ - -#include -#include -#include "options.h" /* Compilation switches */ -#include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ -#include "ivas_prot_fx.h" -#include "ivas_cnst.h" /* Common constants */ -#include "cnst.h" /* Common constants */ - -#ifndef REMOVE_EVS_DUPLICATES -/*==========================================================================*/ -/* FUNCTION : void acelp_core_dec_fx () */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : ACELP core decoder */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ Word16 coder_type i : coder type */ - -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ Word16 *voice_factors o : voicing factors Q15 */ -/* _ Word16 old_syn_12k8_16k[] o : intermediate ACELP Q_syn2-1 */ -/* synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ -/* _ Word16 synth_out[] o : synthesis Q_syn2-1 */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ Decoder_State_fx *st_fx: */ -/* _ Word16 bwe_exc_extended[] i/o: bandwidth extended excitation Q0*/ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* CALLED FROM : RX */ -/*==========================================================================*/ - -ivas_error acelp_core_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 output[], /* o : synthesis @internal Fs */ - Word16 synth_out[], /* o : synthesis Q_syn2-1*/ - Word16 save_hb_synth[], /* o : HB synthesis */ - Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation Q0*/ - Word16 *voice_factors, /* o : voicing factors Q15 */ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis for SWB BWE Q_syn2-1*/ - Word16 sharpFlag, - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ - Word16 *unbits, /* o : number of unused bits */ - Word16 *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const Word16 last_element_mode, /* i : last element mode */ - const Word32 last_element_brate, /* i : last element bitrate */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - const Word16 nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const Word16 read_sid_info /* i : read SID info flag */ -) -{ - Word16 old_exc_fx[L_EXC_DEC] = { 0 }, *exc_fx; /* excitation signal buffer (Q0) */ - Word16 syn_fx_tmp[L_FRAME_16k + L_SUBFR], *syn_fx; /* synthesis signal buffer */ - Word16 temp_buf[L_FRAME16k + L_SYN_MEM]; - Word16 output_frame; /* frame length at output sampling freq. */ - Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ - Word32 enr_q_fx; /* E information for FER protection */ - Word16 tmp_noise_fx; /* Long term temporary noise energy */ - Word16 i, int_fs; - Word16 tc_subfr_fx; - Word16 allow_cn_step_fx; - Word16 temp_buf_fx[L_FRAME16k + L_SYN_MEM]; - - Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )] = { 0 }; /*Q12*/ - Word16 Es_pred_fx; /*Q8*/ - Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )] = { 0 }; /* excitation buffer Q_exc*/ - Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ - Word16 *bwe_exc_fx; - Word16 lsf_new_fx[M]; /* LSFs at the end of the frame */ - Word16 lsp_new_fx[M]; /* LSPs at the end of the frame */ - Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ - Word16 FEC_pitch_fx; /*Q6*/ - Word16 last_pulse_pos; - Word16 T0_tmp; - Word16 do_WI_fx; - Word16 dct_buffer_fx[DCT_L_POST]; - Word16 exc_buffer_fx[DCT_L_POST]; - Word16 dct_exc_tmp[L_FRAME16k]; - Word16 qdct; - Word16 delta_mem_scale; - Word16 bpf_error_signal[L_FRAME16k]; - CLDFB_SCALE_FACTOR scaleFactor; - Word32 workBuffer[128 * 3]; - Word32 q_env[20]; - Word16 exc3_fx[L_FRAME16k]; - Word16 syn1_fx_tmp[L_FRAME16k + 2], *syn1_fx; - Word32 *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; - Word16 gain_buf[NB_SUBFR16k]; /*Q14*/ - Word16 syn_fx_tmp2[L_FRAME_16k]; - Word16 pitch_buf_tmp[NB_SUBFR16k]; - Word16 k; - Word16 update_flg; - Word32 realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word16 LSF_Q_prediction; /* o : LSF prediction mode */ - Word16 avoid_lpc_burst_on_recovery; - Word16 uc_two_stage_flag, dec; - Word16 nb_bits, indice; - Word16 tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; - MUSIC_POSTFILT_HANDLE hMusicPF; - BPF_DEC_HANDLE hBPF; - TD_BWE_DEC_HANDLE hBWE_TD; - FD_BWE_DEC_HANDLE hBWE_FD; - TCX_DEC_HANDLE hTcxDec; - ivas_error error; - (void) ( tdm_lspQ_PCh ); - (void) ( tdm_lsfQ_PCh ); - (void) ( use_cldfb_for_dft ); - (void) ( last_element_mode ); - (void) ( last_element_brate ); - (void) ( flag_sec_CNA ); - (void) ( nchan_out ); - (void) ( save_hb_synth ); - (void) ( output ); - (void) ( read_sid_info ); - (void) hStereoCng; - hMusicPF = st_fx->hMusicPF; - hBPF = st_fx->hBPF; - hBWE_TD = st_fx->hBWE_TD; - hBWE_FD = st_fx->hBWE_FD; - hTcxDec = st_fx->hTcxDec; - error = IVAS_ERR_OK; - move32(); - // IF ( EQ_16(st_fx->element_mode, IVAS_CPE_MDCT) && EQ_16(nchan_out, 1) && EQ_16(st_fx->idchan, 1) && LE_32(last_element_brate, IVAS_SID_4k4) ) - test(); - test(); - test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st_fx->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) - { - /* In MDCT-Stereo DTX with mono output, we can skip CNG for the second channel, except for the first inactive frame following an active period */ - return error; - } - - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - set32_fx( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - realBuffer[i] = realBufferTmp[i]; - move32(); - imagBuffer[i] = imagBufferTmp[i]; - move32(); - } - - /*----------------------------------------------------------------* - * Initialization - *----------------------------------------------------------------*/ - - LSF_Q_prediction = -1; - move16(); - set16_fx( syn_fx_tmp, 0, L_SUBFR ); - syn_fx = syn_fx_tmp + L_SUBFR; - syn1_fx_tmp[0] = 0; - move16(); - syn1_fx_tmp[1] = 0; - move16(); - syn1_fx = syn1_fx_tmp + 2; - /*output_frame = (Word16)(st_fx->output_Fs_fx / 50); move16();*/ - output_frame = st_fx->output_frame_fx; - move16(); - st_fx->bpf_off = 0; - move16(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st_fx->last_core, HQ_CORE ) || EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) && LE_32( st_fx->last_core_brate, SID_2k40 ) ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && LE_32( st_fx->last_core_brate, SID_2k40 ) ) ) - { - /* in case of HQ->ACELP switching, do not apply BPF */ - st_fx->bpf_off = 1; - move16(); - /* in case of core switching, reset post-filter memories */ - if ( st_fx->hPFstat != NULL ) - { - st_fx->hPFstat->on = 0; - move16(); - } - - /* reset the GSC pre echo energy threshold in case of switching */ - if ( st_fx->hGSCDec != NULL ) - { - st_fx->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } - } - IF( st_fx->prev_bfi > 0 ) - { - /* reset the GSC pre echo energy threshold in case of FEC */ - if ( st_fx->hGSCDec != NULL ) - { - st_fx->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } - } - - st_fx->clas_dec = st_fx->last_good; - move16(); - enr_q_fx = 0; - move32(); - Es_pred_fx = 0; - move16(); - tmp_noise_fx = 0; - move16(); - Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); // Q_exc - exc_fx = old_exc_fx + L_EXC_MEM_DEC; - - IF( st_fx->hWIDec != NULL ) - { - Copy( st_fx->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); - } - ELSE - { - set16_fx( old_exc2_fx, 0, L_EXC_MEM ); - } - exc2_fx = old_exc2_fx + L_EXC_MEM; - IF( st_fx->hBWE_TD != NULL ) - { - Copy( hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); // Q_exc - bwe_exc_fx = old_bwe_exc_fx + PIT16k_MAX * 2; - } - ELSE - { - bwe_exc_fx = NULL; - } - - last_pulse_pos = 0; - move16(); - do_WI_fx = 0; - move16(); - st_fx->GSC_noisy_speech = 0; - move16(); - st_fx->relax_prev_lsf_interp = 0; - move16(); - - set16_fx( gain_buf, 0, NB_SUBFR16k ); - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - st_fx->gamma = GAMMA1; - move16(); - st_fx->preemph_fac = PREEMPH_FAC; - move16(); - int_fs = INT_FS_FX; - move16(); - } - ELSE - { - st_fx->gamma = GAMMA16k; - move16(); - st_fx->preemph_fac = PREEMPH_FAC_16k; - move16(); - int_fs = INT_FS_16k; - move16(); - } - - /* reset post-filter in case post-filtering was off in previous frame */ - IF( st_fx->hPFstat != NULL ) - { - if ( st_fx->hPFstat->on == 0 ) - { - st_fx->hPFstat->reset = 1; - move16(); - } - } - avoid_lpc_burst_on_recovery = 0; - move16(); - test(); - test(); - if ( st_fx->last_con_tcx && NE_16( st_fx->L_frameTCX_past, st_fx->L_frame ) && st_fx->last_core != 0 ) - { - avoid_lpc_burst_on_recovery = 1; - move16(); - } - /* TD stereo parameters */ - test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && st_fx->idchan == 1 ) - { - tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; - tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; - tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; - move16(); - move16(); - move16(); - move16(); - } - ELSE - { - tdm_lp_reuse_flag = 0; - tdm_low_rate_mode = 0; - move16(); - move16(); - test(); - if ( EQ_16( st_fx->element_mode, IVAS_SCE ) && st_fx->low_rate_mode ) - { - tdm_low_rate_mode = 1; - move16(); - } - tdm_Pitch_reuse_flag = 0; - move16(); - } - /*----------------------------------------------------------------* - * Updates in case of internal sampling rate switching - *----------------------------------------------------------------*/ - test(); - test(); - IF( NE_16( st_fx->last_L_frame, st_fx->L_frame ) && ( st_fx->last_core == ACELP_CORE || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) - { - IF( st_fx->hPFstat->on != 0 ) - { - Word16 mem_syn_r_size_old, mem_syn_r_size_new; - - mem_syn_r_size_old = shr( st_fx->last_L_frame, 4 ); - mem_syn_r_size_new = shr( st_fx->L_frame, 4 ); - lerp( st_fx->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st_fx->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st_fx->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st_fx->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); - } - /* convert quantized LSP vector */ - st_fx->rate_switching_reset = lsp_convert_poly_fx( st_fx->lsp_old_fx, st_fx->L_frame, 0 ); - move16(); - /* convert old quantized LSF vector */ - lsp2lsf_fx( st_fx->lsp_old_fx, st_fx->lsf_old_fx, M, int_fs ); - - /* FEC - update adaptive LSF mean vector */ - Copy( st_fx->lsf_old_fx, st_fx->lsfoldbfi1_fx, M ); // Qlog2(2.56) - Copy( st_fx->lsf_old_fx, st_fx->lsfoldbfi0_fx, M ); // Qlog2(2.56) - Copy( st_fx->lsf_old_fx, st_fx->lsf_adaptive_mean_fx, M ); // Qlog2(2.56) - - /* Reset LPC mem */ - IF( EQ_32( st_fx->sr_core, INT_FS_16k ) ) - { - Copy( GEWB2_Ave_fx, st_fx->mem_AR_fx, M ); // Qlog2(2.56) - } - ELSE - { - Copy( GEWB_Ave_fx, st_fx->mem_AR_fx, M ); // Qlog2(2.56) - } - set16_fx( st_fx->mem_MA_fx, 0, M ); - - dec = DEC; - move16(); - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) - { - dec = DEC_IVAS; - move16(); - } - - /* update synthesis filter memories */ - synth_mem_updt2( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); - - Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); // Q_exc - Copy_Scale_sig( st_fx->mem_syn2_fx, st_fx->mem_syn1_fx, M, sub( -1, st_fx->Q_syn ) ); /*Q-1*/ - - Copy( st_fx->mem_syn2_fx, st_fx->mem_syn3_fx, M ); - } - - IF( NE_16( st_fx->last_L_frame, st_fx->L_frame ) ) - { - /* update buffer of old subframe pitch values */ - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - - IF( EQ_16( st_fx->last_L_frame, L_FRAME32k ) ) - { - /* (float)12800/(float)32000; */ - k = 13107; // Q15 - move16(); - } - ELSE IF( EQ_16( st_fx->last_L_frame, 512 ) ) - { - /* (float)12800/(float)25600; */ - k = 16384; // Q15 - move16(); - } - ELSE /* st->last_L_frame == L_FRAME16k */ - { - /* (float)12800/(float)16000; */ - k = 26214; // Q15 - move16(); - } - - FOR( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) - { - st_fx->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ); // Q(15+15+1-16) - move32(); - } - - FOR( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) - { - st_fx->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ); // Q15 - move32(); - } - } - ELSE - { - - IF( EQ_16( st_fx->last_L_frame, L_FRAME32k ) ) - { - /* (float)16000/(float)32000; */ - k = -16384; // -0.5 in Q15 - move16(); - } - ELSE IF( EQ_16( st_fx->last_L_frame, 512 ) ) - { - /* tmpF = (float)16000/(float)25600; */ - k = -12288; //-0.375 in Q15 - move16(); - } - ELSE /* st->last_L_frame == L_FRAME12k8 */ - { - /* tmpF = (float)16000/(float)12800; */ - k = 8192; //.25 in Q15 - move16(); - } - - FOR( i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i-- ) - { - st_fx->old_pitch_buf_fx[i + 2] = L_add( st_fx->old_pitch_buf_fx[i], Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ) ); // Q15 - move32(); - } - st_fx->old_pitch_buf_fx[NB_SUBFR + 1] = st_fx->old_pitch_buf_fx[NB_SUBFR + 2]; - move32(); - - FOR( i = NB_SUBFR - 1; i >= 0; i-- ) - { - st_fx->old_pitch_buf_fx[i + 1] = L_add( st_fx->old_pitch_buf_fx[i], Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ) ); // Q15 - move32(); - } - st_fx->old_pitch_buf_fx[0] = st_fx->old_pitch_buf_fx[1]; - move32(); - } - } - - IF( NE_16( st_fx->bfi_pitch_frame, st_fx->L_frame ) ) - { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - - IF( EQ_16( st_fx->bfi_pitch_frame, L_FRAME32k ) ) - { - /* (float)12800/(float)32000; */ - k = 13107; // Q15 - move16(); - } - ELSE IF( EQ_16( st_fx->bfi_pitch_frame, 512 ) ) - { - /* (float)12800/(float)25600; */ - k = 16384; // Q15 - move16(); - } - ELSE /* st->bfi_pitch_frame == L_FRAME16k */ - { - /* (float)12800/(float)16000; */ - k = 26214; // Q15 - move16(); - } - st_fx->bfi_pitch_fx = mult_r( k, st_fx->bfi_pitch_fx ); - move16(); - st_fx->bfi_pitch_frame = L_FRAME; - move16(); - } - ELSE - { - - IF( EQ_16( st_fx->bfi_pitch_frame, L_FRAME32k ) ) - { - /* (float)16000/(float)32000; */ - k = -16384; //-0.5 in Q15 - move16(); - } - ELSE IF( EQ_16( st_fx->bfi_pitch_frame, 512 ) ) - { - /* tmpF = (float)16000/(float)25600; */ - k = -12288; // -0.375 in Q15 - move16(); - } - ELSE /* st->bfi_pitch_frame == L_FRAME12k8 */ - { - /* tmpF = (float)16000/(float)12800; */ - k = 8192; // .25 in Q15 - move16(); - } - st_fx->bfi_pitch_fx = add( st_fx->bfi_pitch_fx, mult_r( st_fx->bfi_pitch_fx, k ) ); - move16(); - st_fx->bfi_pitch_frame = L_FRAME16k; - move16(); - } - } - - test(); - test(); - if ( EQ_16( st_fx->last_bwidth, NB ) && NE_16( st_fx->bwidth, NB ) && st_fx->ini_frame != 0 ) - { - st_fx->rate_switching_reset = 1; - move16(); - } - - /*----------------------------------------------------------------------* - * GOOD frame - *----------------------------------------------------------------------*/ - - IF( !st_fx->bfi ) - { - - /*----------------------------------------------------------------* - * Decoding of TC subframe classification - *----------------------------------------------------------------*/ - - tc_subfr_fx = -1; - move16(); - IF( EQ_16( st_fx->coder_type, TRANSITION ) ) - { - tc_subfr_fx = tc_classif_fx( st_fx, st_fx->L_frame ); - } - - /*----------------------------------------------------------------* - * Decoding of GSC IVAS mode - *----------------------------------------------------------------*/ - st_fx->GSC_IVAS_mode = 0; - move16(); - test(); - test(); - test(); - test(); - IF( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 && !( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) - { - test(); - test(); - IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) - { - st_fx->GSC_IVAS_mode = get_next_indice( st_fx, 2 ); - move16(); - } - } - - /*----------------------------------------------------------------* - * Decoding of inactive CNG frames - *----------------------------------------------------------------*/ - test(); - IF( st_fx->core_brate == FRAME_NO_DATA || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* decode CNG parameters */ - IF( st_fx->cng_type == LP_CNG ) - { - - CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); - - /* comfort noise generation */ - CNG_exc_fx( st_fx->core_brate, st_fx->L_frame, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate, - &st_fx->first_CNG, &( st_fx->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step_fx, &st_fx->hTdCngDec->last_allow_cn_step, st_fx->prev_Q_exc, st_fx->Q_exc, st_fx->hTdCngDec->num_ho, - q_env, st_fx->hTdCngDec->lp_env_fx, st_fx->hTdCngDec->old_env_fx, st_fx->hTdCngDec->exc_mem_fx, st_fx->hTdCngDec->exc_mem1_fx, sid_bw, &st_fx->hTdCngDec->cng_ener_seed1, exc3_fx, st_fx->Opt_AMR_WB, st_fx->element_mode ); - - Copy( Aq_fx, st_fx->Aq_cng, M + 1 ); // Q12 - } - ELSE - { - test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - FdCng_decodeSID_fx( st_fx->hFdCngDec->hFdCngCom, st_fx ); - *sid_bw = 0; - move16(); - } - - generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); - - FdCng_exc( st_fx->hFdCngDec->hFdCngCom, &st_fx->CNG_mode, st_fx->L_frame, st_fx->lsp_old_fx, st_fx->first_CNG, st_fx->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); - - Copy( exc2_fx, exc3_fx, st_fx->L_frame ); - } - - delta_mem_scale = 3; - move16(); - test(); - if ( LT_32( st_fx->lp_ener_fx, 40 ) && ( st_fx->cng_type == LP_CNG ) ) /* very low energy frames, less than 0.3125 */ - { - delta_mem_scale = 0; - move16(); - } - i = st_fx->Q_exc; - move16(); - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, - st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, - &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 0, 0, NULL ); - Copy_Scale_sig( exc2_fx, exc2_fx, st_fx->L_frame, sub( st_fx->Q_exc, i ) ); // Q_exc - - /* update past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) - { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - /* Update music post processing values */ - /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) - { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - } - /* synthesis at 12.8kHz sampling rate */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc3_fx, syn1_fx, st_fx->mem_syn3_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - - /* reset the decoder */ - CNG_reset_dec_fx( st_fx, pitch_buf_fx, voice_factors ); - - /* update st_fx->mem_syn1 for ACELP core switching */ - Copy( st_fx->mem_syn3_fx, st_fx->mem_syn1_fx, M ); - - /* update old synthesis for classification */ - Copy( syn1_fx + st_fx->L_frame - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - - - /* save and delay synthesis to be used by SWB BWE */ - Copy_Scale_sig( syn1_fx, temp_buf_fx, st_fx->L_frame, sub( -1, st_fx->Q_syn ) ); // Q_syn -> Q(-1) - IF( hBWE_FD != NULL ) - { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); - } - } - - /*----------------------------------------------------------------* - * Decoding of all other frames - *----------------------------------------------------------------*/ - - ELSE - { - /*-----------------------------------------------------------------* - * Configure ACELP bit allocation - *-----------------------------------------------------------------*/ - nb_bits = 0; - st_fx->acelp_cfg.FEC_mode = 0; - uc_two_stage_flag = 0; - move16(); - move16(); - move16(); - test(); - IF( !st_fx->nelp_mode_dec && !st_fx->ppp_mode_dec ) - { - Word16 tc_subfr_tmp; - - tc_subfr_tmp = tc_subfr_fx; - move16(); - if ( LT_16( tc_subfr_tmp, L_SUBFR ) ) - { - tc_subfr_tmp = 0; - move16(); - } - - if ( EQ_16( tc_subfr_fx, TC_0_192 ) ) - { - nb_bits = -1; - move16(); - } - - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); - - test(); - test(); - IF( EQ_16( st_fx->coder_type, TRANSITION ) && LT_16( tc_subfr_fx, L_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) - { - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, TRANSITION, -1, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); - } - } - - /*-----------------------------------------------------------------* - * After CNG period, use the most up-to-date LSPs - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( st_fx->hTdCngDec != NULL && ( st_fx->last_core_brate == FRAME_NO_DATA || EQ_32( st_fx->last_core_brate, SID_2k40 ) ) ) - { - Copy( st_fx->lspCNG_fx, st_fx->lsp_old_fx, M ); // Q15 - - lsp2lsf_fx( st_fx->lspCNG_fx, st_fx->lsf_old_fx, M, int_fs ); - } - - /*-----------------------------------------------------------------* - * Reset higher ACELP pre-quantizer in case of switching - *-----------------------------------------------------------------*/ - - IF( !st_fx->use_acelp_preq ) - { - st_fx->mem_preemp_preQ_fx = 0; - move16(); - st_fx->last_nq_preQ = 0; - move16(); - } - - st_fx->use_acelp_preq = 0; - move16(); - - /*-----------------------------------------------------------------* - * LSF de-quantization and interpolation - *-----------------------------------------------------------------*/ - - lsf_dec_fx( st_fx, tc_subfr_fx, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, - tdm_lsfQ_PCh ); - - /*-----------------------------------------------------------------* - * FEC - first good frame after lost frame(s) (possibility to correct the ACB) - *-----------------------------------------------------------------*/ - - IF( st_fx->acelp_cfg.FEC_mode > 0 ) - { - last_pulse_pos = 0; - move16(); - - /* decode the last glottal pulse position */ - T0_tmp = FEC_pos_dec_fx( st_fx, &last_pulse_pos, &enr_q_fx, nb_bits ); - - - test(); - test(); - IF( NE_16( st_fx->last_core, HQ_CORE ) || ( EQ_16( st_fx->last_core, HQ_CORE ) && st_fx->last_con_tcx ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st_fx->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st_fx->prev_bfi, 1 ) ) - { - st_fx->Q_exc = - FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st_fx->L_frame, st_fx->Q_exc ); - move16(); - } - ELSE IF( ( EQ_16( st_fx->coder_type, GENERIC ) || EQ_16( st_fx->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st_fx->old_bfi_cnt, 1 ) && EQ_16( output_frame, L_FRAME16k ) && st_fx->hWIDec != NULL ) - { - do_WI_fx = FEC_enhACB_fx( st_fx->L_frame, st_fx->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st_fx->bfi_pitch_fx ); - } - } - } - - /*------------------------------------------------------------* - * In case of first frame after an erasure and transition from voiced to unvoiced or inactive - * redo the LPC interpolation - *------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( st_fx->stab_fac_fx == 0 && st_fx->old_bfi_cnt > 0 && NE_16( st_fx->clas_dec, VOICED_CLAS ) && NE_16( st_fx->clas_dec, ONSET ) && - st_fx->relax_prev_lsf_interp == 0 && !( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && EQ_16( st_fx->idchan, 1 ) ) ) - { - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); - } - - /*---------------------------------------------------------------* - * Decoding of the scaled predicted innovation energy - *---------------------------------------------------------------*/ - - IF( nb_bits > 0 ) - { - indice = get_next_indice( st_fx, nb_bits ); - Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); - } - - /*------------------------------------------------------------* - * Decode excitation according to coding type - *------------------------------------------------------------*/ - - test(); - test(); - IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) - { - /* SC-VBR - NELP frames */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; - move16(); - - decod_nelp_fx( st_fx, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors, bwe_exc_fx, &st_fx->Q_exc, st_fx->bfi, gain_buf ); - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); - } - ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) ) - { - /* UNVOICED frames */ - decod_unvoiced_fx( st_fx, Aq_fx, st_fx->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, gain_buf ); - } - ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) - { - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; - move16(); - /* SC-VBR - PPP frames */ - IF( NE_32( ( error = decod_ppp_fx( st_fx, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st_fx->bfi, gain_buf, voice_factors, bwe_exc_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } - - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); - } - ELSE IF( EQ_16( st_fx->coder_type, TRANSITION ) ) - { - decod_tran_fx( st_fx, st_fx->L_frame, tc_subfr_fx, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf ); - } - ELSE IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) ) ) - { - decod_audio_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf ); - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ - } - ELSE - { - IF( NE_32( ( error = decod_gen_voic_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf /*, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf*/ ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) - { - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ - } - } - - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); - /* save and delay synthesis to be used by SWB BWE */ - IF( hBWE_FD != NULL ) - { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); - } - - /*-----------------------------------------------------------------* - * Apply energy matching when switching to inactive frames - *-----------------------------------------------------------------*/ - - Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); - /*------------------------------------------------------------* - * Decode information and modify the excitation signal of stationary unvoiced frames - *------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - IF( !( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) && NE_16( st_fx->nelp_mode_dec, 1 ) && !( EQ_16( st_fx->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) - { - stat_noise_uv_dec_fx( st_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); - } - - /*------------------------------------------------------------* - * Save filter memory in case the synthesis is redone after scaling - * Synthesis at 12k8 Hz sampling rate - *------------------------------------------------------------*/ - - /* update past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) - { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - Copy( hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); - } - test(); - test(); - test(); - test(); - IF( hMusicPF != NULL && ( ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) || ( GE_16( st_fx->GSC_IVAS_mode, 1 ) && EQ_16( st_fx->L_frame, L_FRAME ) ) ) ) - { - - Word16 last_coder_type = st_fx->last_coder_type; - move16(); - test(); - test(); - test(); - if ( ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st_fx->GSC_IVAS_mode, 1 ) && st_fx->GSC_noisy_speech == 0 ) ) - { - last_coder_type = AUDIO; - move16(); - } - /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - qdct = 0; - move16(); -#ifdef _DIFF_FLOAT_FIX_ /* FLoat point using last_core which fits with the inner part of the function */ - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_core, st_fx->element_mode, pitch_buf_fx, - hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct ); -#else - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_coder_type, st_fx->element_mode, pitch_buf_fx, - hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct ); -#endif - /* LD music post-filter */ - LD_music_post_filter_fx( hMusicPF, dct_buffer_fx, dct_buffer_fx, st_fx->core_brate, - &hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); - - /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ - Post_music_postP_fx( dct_buffer_fx, exc2_fx, st_fx->mem_syn2_fx, st_fx->mem_syn2_fx, Aq_fx, syn_fx, &st_fx->Q_exc, &st_fx->prev_Q_syn, - &st_fx->Q_syn, st_fx->mem_syn_clas_estim_fx, 0, &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, - &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, temp_buf_fx, mem_tmp_fx ); - } - ELSE - { - /* Core synthesis at 12.8kHz or 16kHz */ - i = 1; - move16(); - if ( st_fx->coder_type == INACTIVE ) - { - i = 0; - move16(); - } - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - k = 0; - move16(); - test(); - test(); - if ( ( st_fx->coder_type == INACTIVE ) && st_fx->flag_cna && GE_16( round_fx( L_shl( st_fx->lp_noise, 1 ) ), 15 << 7 ) ) - { - k = 1; - move16(); - } - - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, - hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, i, k, temp_buf_fx ); - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); // Q_syn - - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - IF( hMusicPF != NULL ) - { - FOR( i = 0; i < DCT_L_POST; i++ ) - { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - } - } - - /*------------------------------------------------------------* - * FEC - Estimate the classification information - *------------------------------------------------------------*/ - - FEC_clas_estim_fx( st_fx, st_fx->Opt_AMR_WB, st_fx->L_frame, &st_fx->clas_dec, st_fx->coder_type, pitch_buf_fx, - syn_fx, &st_fx->lp_ener_FER_fx, &st_fx->decision_hyst, - NULL, NULL, NULL, NULL, 0, NULL, st_fx->Q_syn, temp_buf_fx, - st_fx->mem_syn_clas_estim_fx, &st_fx->classifier_Q_mem_syn, - 0, 0, 0, st_fx->last_core_brate, st_fx->acelp_cfg.FEC_mode ); - /*------------------------------------------------------------* - * FEC - Estimate pitch - *------------------------------------------------------------*/ - - FEC_pitch_estim_fx( st_fx->Opt_AMR_WB, st_fx->last_core, st_fx->L_frame, st_fx->clas_dec, st_fx->last_good, pitch_buf_fx, st_fx->old_pitch_buf_fx, - &st_fx->bfi_pitch_fx, &st_fx->bfi_pitch_frame, &st_fx->upd_cnt, st_fx->coder_type, st_fx->element_mode ); - - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } - - FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); - - test(); - test(); - test(); - test(); - IF( ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && LE_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) - { - frame_ener_fx( st_fx->L_frame, st_fx->clas_dec, syn_fx, pitch_buf_tmp[sub( shr( st_fx->L_frame, 6 ), 1 )], &st_fx->enr_old_fx, st_fx->L_frame, st_fx->Q_syn, 3, 0 ); - } - } - - } /* End of GOOD FRAME */ - - /*----------------------------------------------------------------* - * BAD frame - *----------------------------------------------------------------*/ - ELSE - { - /* SC-VBR */ - if ( EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) - { - st_fx->nelp_mode_dec = 1; - move16(); - } - - /* long burst frame erasures */ - test(); - test(); - if ( GT_16( st_fx->nbLostCmpt, 5 ) && GE_16( st_fx->clas_dec, VOICED_CLAS ) && LT_16( st_fx->clas_dec, INACTIVE_CLAS ) ) - { - st_fx->last_good = VOICED_TRANSITION; - move16(); - } - - /* LSF estimation and A(z) calculation */ - lsf_dec_bfi( MODE1, lsf_new_fx, st_fx->lsf_old_fx, st_fx->lsf_adaptive_mean_fx, NULL, st_fx->mem_MA_fx, st_fx->mem_AR_fx, - st_fx->stab_fac_fx, st_fx->last_coder_type, st_fx->L_frame, st_fx->last_good, - st_fx->nbLostCmpt, 0, NULL, NULL, NULL, st_fx->hGSCDec->Last_GSC_pit_band_idx, st_fx->Opt_AMR_WB, 0, st_fx->bwidth ); - - FEC_lsf2lsp_interp( st_fx, st_fx->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); - - IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) - { - /* SC-VBR */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; - move16(); - - decod_nelp_fx( st_fx, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors, bwe_exc_fx, &st_fx->Q_exc, st_fx->bfi, gain_buf ); - FEC_pitch_fx = pitch_buf_fx[3]; - move16(); - - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); - } - ELSE - { - /* calculation of excitation signal */ - - FEC_exc_estim_fx( st_fx, st_fx->L_frame, exc_fx, exc2_fx, dct_exc_tmp, pitch_buf_fx, voice_factors, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st_fx->Q_exc, &tmp_noise_fx ); - - Rescale_exc( NULL, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, L_FRAME32k, (Word32) 0, - &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, st_fx->L_frame, st_fx->last_coder_type ); - - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ - - /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = st_fx->lp_gainp_fx; - move16(); /*Q14*/ - } - - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); /*old_syn_12k8_16k directly in q-1*/ - - /* save and delay synthesis to be used by SWB BWE */ - IF( hBWE_FD != NULL ) - { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); - } - /* Apply energy matching when switching to inactive frames */ - Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); - - /* udate past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) - { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - /* Update music post processing values */ - /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) - { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - /* Update circular buffer, keep last energy difference unchanged */ - FOR( i = 1; i < MAX_LT; i++ ) - { - hMusicPF->LDm_lt_diff_etot_fx[i - 1] = hMusicPF->LDm_lt_diff_etot_fx[i]; - move16(); - } - } - /* synthesis at 12k8 Hz sampling rate */ - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - k = 0; - move16(); - test(); - test(); - if ( ( st_fx->coder_type == INACTIVE ) && st_fx->flag_cna && GE_16( round_fx( L_shl( st_fx->lp_noise, 1 ) ), 15 << 7 ) ) - { - k = 1; - move16(); - } - - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, - hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 1, k, temp_buf_fx ); - - test(); - IF( ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) - { - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); // Q_syn - } - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - - /* update buffer for classifier */ - IF( st_fx->hWIDec != NULL ) - { - Copy( exc2_fx + st_fx->L_frame - L_EXC_MEM, st_fx->hWIDec->old_exc2_fx, L_EXC_MEM ); - Copy( syn_fx + st_fx->L_frame - L_EXC_MEM, st_fx->hWIDec->old_syn2_fx, L_EXC_MEM ); - } - st_fx->prev_Q_exc_fr = st_fx->Q_exc; - move16(); - st_fx->prev_Q_syn_fr = st_fx->Q_syn; - move16(); - - Copy( syn_fx + st_fx->L_frame - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - - test(); - IF( ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) - { - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } - - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - - FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); - } - - /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - /* fer_energy( st_fx->L_frame, st_fx->last_good, syn_fx, FEC_pitch_fx, &st_fx->enr_old_fx, st_fx->L_frame ); */ - frame_ener_fx( st_fx->L_frame, st_fx->last_good, syn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st_fx->enr_old_fx, st_fx->L_frame, st_fx->Q_syn, 3, 0 ); - - IF( st_fx->nelp_mode_dec != 1 ) - { - /* modify the excitation signal of stationary unvoiced frames */ - stat_noise_uv_mod_fx( st_fx->coder_type, 0, st_fx->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st_fx->Q_exc, 1, &st_fx->ge_sm_fx, - &st_fx->uv_count, &st_fx->act_count, st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); - } - - /* SC-VBR */ - st_fx->hSC_VBR->FadeScale_fx = mult( st_fx->hSC_VBR->FadeScale_fx, 24576 ); /*24576 in Q15*/ - move16(); - } - IF( hBWE_TD != NULL ) - { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - Copy( Aq_fx + 2 * ( M + 1 ), hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); // Q12 - } - ELSE - { - Copy( Aq_fx + 3 * ( M + 1 ), hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); // Q12 - } - } - /*--------------------------------------------------------* - * Apply NB postfilter in case of 8kHz output - *--------------------------------------------------------*/ - test(); - IF( EQ_16( st_fx->last_bwidth, NB ) && st_fx->hPFstat != NULL ) - { - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } - - IF( EQ_16( st_fx->bwidth, NB ) ) - { - st_fx->hPFstat->on = 1; - move16(); - nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, st_fx->coder_type, st_fx->BER_detect, 0 ); - } - ELSE - { - st_fx->hPFstat->on = 0; - move16(); - nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); - } - } - ELSE - { - st_fx->psf_lp_noise_fx = round_fx( L_shl( st_fx->lp_noise, 1 ) ); - move16(); - } - - /*------------------------------------------------------------------* - * Perform fixed deemphasis through 1/(1 - g*z^-1) - *-----------------------------------------------------------------*/ - - /* Update old synthesis buffer - needed for ACELP internal sampling rate switching */ - Copy( syn_fx + st_fx->L_frame - L_SYN_MEM, st_fx->mem_syn_r, L_SYN_MEM ); - deemph_fx( syn_fx, st_fx->preemph_fac, st_fx->L_frame, &( st_fx->mem_deemph_fx ) ); - unscale_AGC( syn_fx, st_fx->Q_syn, syn_fx_tmp2, st_fx->agc_mem_fx, st_fx->L_frame ); - Copy( syn_fx_tmp2, syn_fx, st_fx->L_frame ); - - /* Update MODE2 memories*/ - IF( hTcxDec != NULL ) - { - Copy_Scale_sig( syn_fx + shr( st_fx->L_frame, 1 ), hTcxDec->old_syn_Overl, shr( st_fx->L_frame, 1 ), sub( -1, st_fx->Q_syn ) ); /*Q-1*/ - } - Copy_Scale_sig( syn_fx + st_fx->L_frame - M - 1, st_fx->syn, M + 1, sub( 0, st_fx->Q_syn ) ); /*Q0*/ - - /*------------------------------------------------------------------* - * Formant post-filter - *-----------------------------------------------------------------*/ - - IF( st_fx->hPFstat != NULL ) - { - test(); - test(); - test(); - IF( GE_16( st_fx->last_bwidth, WB ) && ( GT_32( st_fx->core_brate, ACELP_24k40 ) || ( st_fx->element_mode > EVS_MONO ) ) && LE_32( st_fx->core_brate, ACELP_32k ) ) - { - Copy( syn_fx, temp_buf + L_SYN_MEM, L_FRAME16k ); - st_fx->hPFstat->on = 1; - move16(); - formant_post_filt_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0 ); - } - ELSE IF( GE_16( st_fx->last_bwidth, WB ) ) - { - IF( st_fx->hPFstat->on ) - { - Copy( st_fx->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf, M ); - Copy( syn_fx, temp_buf + M, L_SUBFR ); - Residu3_fx( Aq_fx, temp_buf + M, temp_buf + M + L_SUBFR, L_SUBFR, 1 ); - E_UTIL_synthesis( 1, Aq_fx, temp_buf + M + L_SUBFR, temp_buf, L_SUBFR, st_fx->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - scale_st_fx( syn_fx, temp_buf, &st_fx->hPFstat->gain_prec, L_SUBFR ); - Copy( temp_buf, syn_fx, L_SUBFR / 2 ); - blend_subfr2_fx( temp_buf + L_SUBFR / 2, syn_fx + L_SUBFR / 2, syn_fx + L_SUBFR / 2 ); - } - st_fx->hPFstat->on = 0; - move16(); - } - } - /*----------------------------------------------------------------* - * Comfort noise addition - *----------------------------------------------------------------*/ - - test(); - test(); - IF( ( st_fx->hFdCngDec != NULL || EQ_16( st_fx->idchan, 1 ) ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || st_fx->flag_cna || ( EQ_16( st_fx->cng_type, FD_CNG ) && LE_32( st_fx->total_brate, ACELP_32k ) ) || ( ( st_fx->cng_type == LP_CNG ) && LE_32( st_fx->total_brate, SID_2k40 ) ) ) - { - /*VAD only for non inactive frame*/ - test(); - st_fx->VAD = st_fx->VAD && ( st_fx->coder_type != INACTIVE ); - move16(); - test(); - test(); - test(); - test(); - test(); - IF( st_fx->idchan == 0 && ( st_fx->flag_cna || ( EQ_16( st_fx->cng_type, FD_CNG ) && LE_32( st_fx->total_brate, ACELP_32k ) ) || - ( EQ_16( st_fx->cng_type, LP_CNG ) && LE_32( st_fx->total_brate, SID_2k40 ) ) ) ) - { - /*Noisy speech detector*/ - noisy_speech_detection_fx( st_fx->hFdCngDec, st_fx->VAD, syn_fx, st_fx->Q_syn ); - - st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); - move16(); - IF( st_fx->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) - { - st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); - move16(); - } - } - if ( st_fx->idchan == 0 ) - { - st_fx->lp_noise = st_fx->hFdCngDec->lp_noise; - move32(); - } - /*Noise estimate*/ - IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) /* && !st->cng_ism_flag IVAS_CODE */ ) - { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMT( "Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done" ) - ApplyFdCng_fx( syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); -#else - ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); -#endif - } - /* CNA: Generate additional comfort noise to mask potential coding artefacts */ - } - - test(); - test(); - test(); - test(); - IF( st_fx->flag_cna && NE_16( st_fx->coder_type, AUDIO ) ) - { - generate_masking_noise_fx( syn_fx, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, 0 ); - } - ELSE IF( st_fx->flag_cna && EQ_16( st_fx->coder_type, AUDIO ) && st_fx->last_core == ACELP_CORE && NE_16( st_fx->last_coder_type, AUDIO ) ) - { - FOR( i = 0; i < st_fx->hFdCngDec->hFdCngCom->frameSize / 2; i++ ) - { - syn_fx[i] = add( syn_fx[i], shr_r( mult_r( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st_fx->hFdCngDec->hFdCngCom->frameSize / 4], st_fx->hFdCngDec->hFdCngCom->fftlenFac ), -st_fx->Q_syn ) ); - move16(); - } - } - - test(); - test(); - test(); - test(); - test(); - IF( st_fx->flag_cna == 0 && EQ_16( st_fx->L_frame, L_FRAME16k ) && EQ_16( st_fx->last_flag_cna, 1 ) && ( ( st_fx->last_core == ACELP_CORE && NE_16( st_fx->last_coder_type, AUDIO ) ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) - { - FOR( i = 0; i < st_fx->L_frame / 2; i++ ) - { - syn_fx[i] = add( syn_fx[i], shr_r( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st_fx->L_frame / 4], negate( st_fx->Q_syn ) ) ); - move16(); - } - } - - test(); - IF( st_fx->flag_cna == 0 || EQ_16( st_fx->coder_type, AUDIO ) ) - { - set16_fx( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st_fx->hFdCngDec->hFdCngCom->fftlen ); - } - } - - /*----------------------------------------------------------------* - * Resample to the output sampling rate (8/16/32/48 kHz) - * Bass post-filter - *----------------------------------------------------------------*/ - - /* check if the CLDFB works on the right sample rate */ - IF( ( st_fx->cldfbAna->usb * st_fx->cldfbAna->no_col ) != st_fx->L_frame ) - { - /* resample to ACELP internal sampling rate */ - Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb( st_fx->cldfbAna, newCldfbBands, st_fx->L_frame, 0 ); - resampleCldfb( st_fx->cldfbBPF, newCldfbBands, st_fx->L_frame, 0 ); - - IF( st_fx->ini_frame > 0 ) - { - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); - move16(); - } - } - - test(); - IF( !( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->bpf_off ) ) - { - test(); - IF( NE_16( st_fx->L_frame, st_fx->last_L_frame ) && NE_16( st_fx->last_codec_mode, MODE2 ) ) - { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - retro_interp5_4_fx( hBPF->pst_old_syn_fx ); - } - ELSE IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - retro_interp4_5_fx( syn_fx, hBPF->pst_old_syn_fx ); - } - } - - bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, syn_fx, st_fx->L_frame, pitch_buf_fx, st_fx->bpf_off, - st_fx->stab_fac_fx, &st_fx->stab_fac_smooth_fx, st_fx->coder_type, st_fx->Q_syn, bpf_error_signal ); - } - test(); - IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) - { - /* analysis of the synthesis at internal sampling rate */ - cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); - - scaleFactor.hb_scale = scaleFactor.lb_scale; - move16(); - - /* analysis and add the BPF error signal */ - i = 0; - move16(); - if ( st_fx->bpf_off == 0 ) - { - i = CLDFB_NO_COL_MAX; - move16(); - } - addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate( st_fx->Q_syn ), - i, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &scaleFactor ); - - /* set output mask for upsampling */ - IF( EQ_16( st_fx->bwidth, NB ) ) - { - /* set NB mask for upsampling */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, 10 ); - move16(); - } - ELSE IF( NE_16( st_fx->cldfbSyn->bandsToZero, sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ) ) ) - { - /* in case of BW switching, re-init to default */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); - move16(); - } - - /*WB/SWB-FD_CNG*/ - scaleFactor.hb_scale = scaleFactor.lb_scale; - move16(); - - - test(); - IF( !st_fx->cng_sba_flag || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - IF( ( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && ( EQ_16( st_fx->cng_type, FD_CNG ) ) && ( LT_16( st_fx->hFdCngDec->hFdCngCom->numCoreBands, st_fx->cldfbSyn->no_channels ) ) ) - { - generate_comfort_noise_dec_hf_fx( realBuffer, imagBuffer, &scaleFactor.hb_scale, st_fx ); - - st_fx->cldfbSyn->bandsToZero = 0; - move16(); - IF( LT_16( st_fx->hFdCngDec->hFdCngCom->regularStopBand, st_fx->cldfbSyn->no_channels ) ) - { - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->hFdCngDec->hFdCngCom->regularStopBand ); - move16(); - } - st_fx->cldfbSyn->lsb = st_fx->cldfbAna->no_channels; - move16(); - } - } - /* synthesis of the combined signal */ - st_fx->Q_syn2 = st_fx->Q_syn; - move16(); - { - cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); - } - /* Bring CLDFB output to Q0 */ - Scale_sig( synth_out, output_frame, negate( st_fx->Q_syn2 ) ); - st_fx->Q_syn2 = 0; - move16(); - - /* save synthesis - needed in case of core switching */ - Copy( synth_out, st_fx->previoussynth_fx, output_frame ); - } - - /*-----------------------------------------------------------------* - * Bandwidth extension 6kHz-7kHz - *-----------------------------------------------------------------*/ - IF( st_fx->hBWE_zero != NULL ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_16( st_fx->L_frame, L_FRAME ) && NE_16( st_fx->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && - ( EQ_16( st_fx->extl, -1 ) || EQ_16( st_fx->extl, SWB_CNG ) || ( EQ_16( st_fx->extl, WB_BWE ) && st_fx->extl_brate == 0 && NE_16( st_fx->coder_type, AUDIO ) ) ) ) ) - { - hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, st_fx->Q_syn2 ); - } - ELSE - { - hf_synth_reset_fx( st_fx->hBWE_zero ); - } - } - - /*-----------------------------------------------------------------* - * Populate parameters for SWB TBE - *-----------------------------------------------------------------*/ - - /* Apply a non linearity to the SHB excitation */ - IF( hBWE_TD != NULL ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( !st_fx->bfi && ( st_fx->prev_bfi ) ) || ( ( EQ_16( st_fx->last_vbr_hw_BWE_disable_dec, 1 ) ) && ( st_fx->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st_fx->extl, SWB_TBE ) || EQ_16( st_fx->extl, WB_TBE ) || EQ_16( st_fx->extl, FB_TBE ) ) && NE_16( st_fx->last_extl, SWB_TBE ) && NE_16( st_fx->last_extl, WB_TBE ) && NE_16( st_fx->last_extl, FB_TBE ) ) || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && !st_fx->tdm_LRTD_flag ) ) - { - hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); - move32(); - set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); - } - - test(); - test(); - test(); - test(); - test(); - IF( !st_fx->ppp_mode_dec && ( st_fx->idchan == 0 || NE_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && st_fx->tdm_LRTD_flag ) ) ) - { - non_linearity_fx( bwe_exc_fx, bwe_exc_extended, L_FRAME32k, &hBWE_TD->bwe_non_lin_prev_scale_fx, st_fx->Q_exc, - st_fx->coder_type, voice_factors, st_fx->L_frame ); - } - - test(); - IF( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); - move32(); - } - } - /*----------------------------------------------------------------------* - * Updates - *----------------------------------------------------------------------*/ - - updt_dec_fx( st_fx, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors, old_bwe_exc_fx, gain_buf ); - - test(); - test(); - IF( GT_32( st_fx->core_brate, SID_2k40 ) && st_fx->hTdCngDec != NULL && st_fx->hFdCngDec != NULL ) - { - /* update CNG parameters in active frames */ - cng_params_upd_fx( lsp_new_fx, exc_fx, st_fx->L_frame, &st_fx->hTdCngDec->ho_circ_ptr, st_fx->hTdCngDec->ho_ener_circ_fx, &st_fx->hTdCngDec->ho_circ_size, st_fx->hTdCngDec->ho_lsp_circ_fx, - st_fx->Q_exc, DEC, st_fx->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st_fx->last_active_brate ); - /* Set 16k LSP flag for CNG buffer */ - st_fx->hTdCngDec->ho_16k_lsp[st_fx->hTdCngDec->ho_circ_ptr] = 0; - move16(); - if ( NE_16( st_fx->L_frame, L_FRAME ) ) - { - st_fx->hTdCngDec->ho_16k_lsp[st_fx->hTdCngDec->ho_circ_ptr] = 1; - move16(); - } - } - - return IVAS_ERR_OK; -} -#endif diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index ad8ca9b50..2c72bba78 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -47,12 +47,12 @@ /*-------------------------------------------------------------------* - * acelp_core_dec_ivas_fx() + * acelp_core_dec_fx() * * ACELP core decoder *-------------------------------------------------------------------*/ -ivas_error acelp_core_dec_ivas_fx( +ivas_error acelp_core_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 output_fx[], /* o : synthesis @internal Fs Q_syn*/ Word16 synth_fx16[], /* o : synthesis Q_syn2*/ @@ -81,14 +81,14 @@ ivas_error acelp_core_dec_ivas_fx( Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ Word16 output_frame; /* frame length at output sampling freq. */ Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ - Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ + Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ Word32 enr_q_fx; /* E information for FER protection */ Word16 tmp_noise_fx; /* Long term temporary noise energy */ - Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ + Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ Word16 FEC_pitch_fx; /* FEC pitch */ Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ Word16 *bwe_exc_fx; /* Excitation for SWB TBE */ @@ -181,6 +181,7 @@ ivas_error acelp_core_dec_ivas_fx( st->hFdCngDec->hFdCngCom->sidNoiseEstExp = common_e; move16(); } + FOR( i = 0; i < NPART; i++ ) { st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), @@ -188,14 +189,14 @@ ivas_error acelp_core_dec_ivas_fx( move32(); } - ApplyFdCng_ivas_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); + ApplyFdCng_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); } ELSE { configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); /* decode CNG parameters */ - CNG_dec_ivas_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); /* comfort noise generation */ CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); @@ -636,7 +637,7 @@ ivas_error acelp_core_dec_ivas_fx( /* decode CNG parameters */ IF( st->cng_type == LP_CNG ) { - CNG_dec_ivas_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); Copy( Aq_fx, st->Aq_cng, add( M, 1 ) ); /* comfort noise generation */ @@ -657,13 +658,11 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { FdCng_decodeSID_fx( st->hFdCngDec->hFdCngCom, st ); } ELSE -#endif { Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; move16(); @@ -689,7 +688,7 @@ ivas_error acelp_core_dec_ivas_fx( move32(); } - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); Word16 new_sidNoiseEstExp = 31 - Q4; move16(); @@ -704,7 +703,7 @@ ivas_error acelp_core_dec_ivas_fx( move16(); test(); - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) { @@ -728,13 +727,11 @@ ivas_error acelp_core_dec_ivas_fx( } } -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_comfort_noise_dec_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 2, -1 ); } ELSE -#endif { generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); } @@ -758,7 +755,6 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( st->hMusicPF && st->hGSCDec ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { // VE: TBV: should 'st_fx->L_frame * HIBND_ACB_L_FAC' be corrected in EVS? @@ -766,7 +762,6 @@ ivas_error acelp_core_dec_ivas_fx( st->L_frame * HIBND_ACB_L_FAC, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); } ELSE -#endif { Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); @@ -794,7 +789,6 @@ ivas_error acelp_core_dec_ivas_fx( /* Update music post processing values */ /* Filter energies update */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { FOR( i = 0; i < DCT_L_POST; i++ ) @@ -804,7 +798,6 @@ ivas_error acelp_core_dec_ivas_fx( } } ELSE -#endif { FOR( i = 0; i < DCT_L_POST; i++ ) { @@ -822,15 +815,12 @@ ivas_error acelp_core_dec_ivas_fx( /* reset the decoder */ CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); - -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { /* update st_fx->mem_syn1 for ACELP core switching */ Copy( st->mem_syn3_fx, st->mem_syn1_fx, M ); } ELSE -#endif { st->Q_syn_cng = st->Q_syn; move16(); @@ -889,13 +879,13 @@ ivas_error acelp_core_dec_ivas_fx( move16(); } - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); test(); test(); IF( EQ_16( st->coder_type, TRANSITION ) && LT_16( tc_subfr, L_SUBFR ) && EQ_16( st->L_frame, L_FRAME ) ) { - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } } @@ -934,7 +924,7 @@ ivas_error acelp_core_dec_ivas_fx( IF( !tdm_lp_reuse_flag ) { - lsf_dec_ivas_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); + lsf_dec_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); } ELSE { @@ -1084,7 +1074,7 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE /* GENERIC */ { - decod_gen_2sbfr_ivas_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + decod_gen_2sbfr_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { @@ -1106,7 +1096,7 @@ ivas_error acelp_core_dec_ivas_fx( ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) { /* UNVOICED frames */ - decod_unvoiced_ivas_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); + decod_unvoiced_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } @@ -1131,15 +1121,15 @@ ivas_error acelp_core_dec_ivas_fx( ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( ( st->coder_type == INACTIVE ) && st->inactive_coder_type_flag ) ) { /* AUDIO and INACTIVE frames (coded by GSC technology) */ - decod_audio_ivas_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, - tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + decod_audio_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, + tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } ELSE { /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ - IF( NE_32( ( error = decod_gen_voic_ivas_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = decod_gen_voic_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -1163,7 +1153,7 @@ ivas_error acelp_core_dec_ivas_fx( * Apply energy matching when switching to inactive frames *-----------------------------------------------------------------*/ - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); /*------------------------------------------------------------* * Decode information and modify the excitation signal of stationary unvoiced frames @@ -1212,7 +1202,6 @@ ivas_error acelp_core_dec_ivas_fx( move16(); /* Extrapolation of the last future part, windowing and high resolution DCT transform */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { // VE: TBV: this is likely a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' @@ -1220,7 +1209,6 @@ ivas_error acelp_core_dec_ivas_fx( st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); } ELSE -#endif { Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); } @@ -1229,9 +1217,7 @@ ivas_error acelp_core_dec_ivas_fx( LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBC whether needed in IVAS -#endif { Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ } @@ -1300,13 +1286,9 @@ ivas_error acelp_core_dec_ivas_fx( Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, -#ifdef REMOVE_EVS_DUPLICATES - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); -#else - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); test(); test(); @@ -1384,7 +1366,7 @@ ivas_error acelp_core_dec_ivas_fx( } /* Apply energy matching when switching to inactive frames */ - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); /* update past excitation signals for LD music post-filter */ IF( st->hMusicPF != NULL ) @@ -1452,13 +1434,9 @@ ivas_error acelp_core_dec_ivas_fx( { Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, -#ifdef REMOVE_EVS_DUPLICATES - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); -#else - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ @@ -1544,7 +1522,7 @@ ivas_error acelp_core_dec_ivas_fx( Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); set16_fx( st->hPFstat->mem_zero, 0, M ); - formant_post_filt_ivas_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); + formant_post_filt_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); } ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) { @@ -1612,7 +1590,7 @@ ivas_error acelp_core_dec_ivas_fx( IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) { /* Noise estimate */ - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } IF( !st->cna_dirac_flag ) @@ -1652,13 +1630,11 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); } ELSE -#endif { IF( st->idchan == 0 ) { @@ -1666,10 +1642,13 @@ ivas_error acelp_core_dec_ivas_fx( { set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); } + Word32 psyn_32_fx[L_FRAME16k]; Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); // Q15 + generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 } @@ -1713,7 +1692,7 @@ ivas_error acelp_core_dec_ivas_fx( /*Noise estimate*/ IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) ) { - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } } } @@ -1730,7 +1709,6 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { // VE: TBV - is it correct in EVS? in FLP, it is: @@ -1743,7 +1721,6 @@ ivas_error acelp_core_dec_ivas_fx( } } ELSE -#endif { FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) { @@ -1775,7 +1752,6 @@ ivas_error acelp_core_dec_ivas_fx( * Bass post-filter *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { CLDFB_SCALE_FACTOR scaleFactor; @@ -1880,7 +1856,6 @@ ivas_error acelp_core_dec_ivas_fx( Copy( synth_fx16, st->previoussynth_fx, output_frame ); } ELSE -#endif { /* check if the CLDFB works on the right sample rate */ IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) @@ -1896,9 +1871,7 @@ ivas_error acelp_core_dec_ivas_fx( } /* analyze pitch coherence for bass post-filter */ - Word32 pitch_buf_fx_q20[12]; - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) Word16 lim = shr( st->L_frame, 6 ); FOR( Word16 lp = 0; lp < lim; lp++ ) @@ -1961,7 +1934,9 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 st->cldfbAna->Q_cldfb_state = Q12; move16(); + cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 st->cldfbAna->Q_cldfb_state = Q11; move16(); @@ -1990,6 +1965,7 @@ ivas_error acelp_core_dec_ivas_fx( } addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 st->cldfbBPF->Q_cldfb_state = Q10; move16(); @@ -2186,6 +2162,7 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 st->cldfbAna->Q_cldfb_state = Q12; move16(); + cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 @@ -2215,8 +2192,8 @@ ivas_error acelp_core_dec_ivas_fx( tmp = nSamples; move16(); } - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 st->cldfbBPF->Q_cldfb_state = Q10; @@ -2299,13 +2276,11 @@ ivas_error acelp_core_dec_ivas_fx( IF( ( EQ_16( st->L_frame, L_FRAME ) && ( st->bwidth != NB ) && GE_16( output_frame, L_FRAME16k ) && ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); } ELSE -#endif { Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); @@ -2315,9 +2290,7 @@ ivas_error acelp_core_dec_ivas_fx( ELSE { hf_synth_reset_fx( st->hBWE_zero ); -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but condition is here to keep EVS bit-exact for the moment -#endif { set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); } @@ -2356,13 +2329,11 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); } ELSE -#endif { Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); @@ -2389,14 +2360,12 @@ ivas_error acelp_core_dec_ivas_fx( IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) { /* update CNG parameters in active frames */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { cng_params_upd_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate ); } ELSE -#endif { cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, @@ -2413,9 +2382,7 @@ ivas_error acelp_core_dec_ivas_fx( } } -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st->element_mode, EVS_MONO ) ) -#endif { IF( save_hb_synth_fx16 ) { diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 6d3d0b381..363db8202 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -128,11 +128,7 @@ ivas_error acelp_core_switch_dec_fx( * Excitation decoding *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); -#else - config_acelp1( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); -#endif + config_acelp1_fx( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); decod_gen_voic_core_switch_fx( st_fx, L_frame_for_cs, 0, Aq, exc, cbrate, &st_fx->Q_exc ); @@ -920,11 +916,7 @@ static void decod_gen_voic_core_switch_fx( * Decode pitch lag *----------------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - pitch = pit_decode_ivas_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*Q6*/ -#else - pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ -#endif + pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*Q6*/ /*--------------------------------------------------------------* * Find the adaptive codebook vector. diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index c1c1e6143..96ae82dde 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -373,11 +373,7 @@ ivas_error amr_wb_dec_fx( IF( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_1k75 ) ) { /* decode CNG parameters */ -#ifdef REMOVE_EVS_DUPLICATES - CNG_dec_ivas_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); -#else CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); -#endif /* comfort noise generation */ CNG_exc_fx( st_fx->core_brate, L_FRAME, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate, @@ -630,15 +626,9 @@ ivas_error amr_wb_dec_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); -#else FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif + exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); frame_ener_fx( L_FRAME, st_fx->clas_dec, syn_fx, pitch_buf_tmp[3], &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); } @@ -717,17 +707,10 @@ ivas_error amr_wb_dec_fx( * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, - MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, - st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, - st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, 0, 0 ); -#else FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, - st_fx->Q_exc, st_fx->Q_syn, 0, 0 ); -#endif + st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, 0, 0 ); /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ frame_ener_fx( L_FRAME, st_fx->last_good, syn_fx, shr( FEC_pitch_fx, 6 ), &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); @@ -785,11 +768,7 @@ ivas_error amr_wb_dec_fx( st_fx->hPFstat->on = 1; move16(); test(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, sub( amr_io_class, AUDIO_CLAS ) == 0 ); -#else formant_post_filt_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, sub( amr_io_class, AUDIO_CLAS ) == 0 ); -#endif } /*----------------------------------------------------------------* @@ -813,16 +792,9 @@ ivas_error amr_wb_dec_fx( st_fx->VAD = 0; move16(); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMT( "Fixed point not done here " ) - ApplyFdCng_fx( syn, NULL, NULL, NULL, st, 0, 0 ); -#else -#ifdef REMOVE_EVS_DUPLICATES - ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); -#else - ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); -#endif -#endif + + ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); + st_fx->hFdCngDec->hFdCngCom->frame_type_previous = st_fx->m_frame_type; move16(); diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index ce6ad6568..fdb6488db 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -22,19 +22,19 @@ static void shb_CNG_decod_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word static void shb_CNG_decod_ivas_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word16 *shb_synth_fx, const Word16 sid_bw, const Word16 Qsyn ); /*-----------------------------------------------------------------* + * CNG_dec_fx() + * * Decode residual signal energy *-----------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ + const Word16 last_element_mode, /* i : last element mode Q0 */ Word16 Aq[], /* o : LP coefficients Q12 */ Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw /* i : 0-NB/WB, 1-SWB SID Q0 */ - , + Word16 *sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0 */ Word32 *q_env ) { Word16 istep; @@ -72,7 +72,6 @@ void CNG_dec_fx( Word16 exp_pow; Word16 tmp_loop; Word16 enr_new, Aq_tmp[M + 1]; - Word16 LSF_Q_prediction; /* o : LSF prediction mode - just temporary variable in CNG */ TD_CNG_DEC_HANDLE hTdCngDec; #ifdef BASOP_NOGLOB_DECLARE_LOCAL @@ -108,681 +107,9 @@ void CNG_dec_fx( } ELSE { - lsf_dec_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, - NULL ); - /* check IF LSPs may trigger too much synthesis energy */ - - E_LPC_f_lsp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - - IF( shr( enr_new, 14 ) > 0 ) - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - } - } - ELSE - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - - /* Initialize the CNG spectral envelope in case of the very first CNG frame */ - IF( st_fx->first_CNG == 0 ) - { - Copy( st_fx->lsp_old_fx, st_fx->lspCNG_fx, M ); /* Q15 */ - } - - /*-----------------------------------------------------------------* - * Decode residual signal energy - *-----------------------------------------------------------------*/ - - *allow_cn_step = 0; - move16(); - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - istep = ISTEP_AMR_WB_SID_FX; /* Q15 */ - move16(); - if ( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - istep = ISTEP_SID_FX; /* Q15 */ - move16(); - } - - /* initialize the energy quantization parameters */ - num_bits = 6; - move16(); - if ( st_fx->Opt_AMR_WB == 0 ) - { - num_bits = 7; - move16(); - } - - /* decode the energy index */ - L_enr_index = get_next_indice_fx( st_fx, num_bits ); - - IF( LE_32( st_fx->last_core_brate, SID_2k40 ) || EQ_16( st_fx->prev_bfi, 1 ) ) - { - tmp1 = add( hTdCngDec->old_enr_index, 20 ); - } - ELSE - { - tmp1 = add( hTdCngDec->old_enr_index, 40 ); - } - IF( GT_16( L_enr_index, tmp1 ) && hTdCngDec->old_enr_index >= 0 ) /* Likely bit error and not startup */ - { - L_enr_index = tmp1; - move16(); - L_enr_index = s_min( L_enr_index, 127 ); /* Q0 */ - IF( st_fx->Opt_AMR_WB ) - { - L_enr_index = s_min( L_enr_index, 63 ); /* Q0 */ - } - } - - test(); - test(); - test(); - IF( GT_32( st_fx->last_core_brate, SID_1k75 ) && - NE_16( st_fx->first_CNG, 0 ) && - GE_16( hTdCngDec->old_enr_index, 0 ) && - GT_16( L_enr_index, add( hTdCngDec->old_enr_index, 1 ) ) ) - { - *allow_cn_step = 1; - move16(); - } - - hTdCngDec->old_enr_index = L_enr_index; - move16(); - if ( !L_enr_index ) - { - L_enr_index = -5; - move16(); - } - /* st_fx->Enew = L_enr_index / step - 2.0f;*/ - L_ener = L_mult( L_enr_index, istep ); /* Q16 (0+15) */ - /* subtract by 2 not done to leave Energy in Q2 */ - - /* extract integral and fractional parts */ - ener_fra = L_Extract_lc( L_ener, &ener_int ); - ener_int = add( ener_int, 4 ); /* Q2 to Q6 */ - - /* find the new energy value */ - hTdCngDec->Enew_fx = Pow2( ener_int, ener_fra ); - move32(); - - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - burst_ho_cnt = get_next_indice_fx( st_fx, 3 ); /* 3bit */ - - *sid_bw = get_next_indice_fx( st_fx, 1 ); - move16(); - IF( *sid_bw == 0 ) - { - env_idx[0] = get_next_indice_fx( st_fx, 6 ); - move16(); - - /* get quantized res_env_details */ - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - q_env[i] = L_deposit_l( CNG_details_codebook_fx[env_idx[0]][i] ); - move32(); - } - } - } - /* Reset CNG history IF CNG frame length is changed */ - test(); - test(); - IF( EQ_16( st_fx->bwidth, WB ) && NE_16( st_fx->first_CNG, 0 ) && NE_16( st_fx->L_frame, st_fx->last_CNG_L_frame ) ) - { - hTdCngDec->ho_hist_size = 0; - move16(); - } - } - - /*---------------------------------------------------------------------* - * CNG spectral envelope update - * Find A(z) coefficients - *---------------------------------------------------------------------*/ - test(); - test(); - test(); - IF( LE_32( st_fx->last_core_brate, SID_2k40 ) ) - { - /* Reset hangover counter if not first SID period */ - if ( GT_32( st_fx->core_brate, FRAME_NO_DATA ) ) - { - hTdCngDec->num_ho = 0; - move16(); - } - /* Update LSPs IF last SID energy not outliers or insufficient number of hangover frames */ - test(); - IF( LT_16( hTdCngDec->num_ho, 3 ) || LT_32( Mult_32_16( hTdCngDec->Enew_fx, 21845 /*1/1.5f, Q15*/ ), st_fx->lp_ener_fx ) ) - { - FOR( i = 0; i < M; i++ ) - { - /* AR low-pass filter */ - st_fx->lspCNG_fx[i] = mac_r( L_mult( CNG_ISF_FACT_FX, st_fx->lspCNG_fx[i] ), 32768 - CNG_ISF_FACT_FX, lsp_new[i] ); - move16(); /* Q15 (15+15+1-16) */ - } - } - } - ELSE - { - /* Update CNG_mode IF allowed */ - test(); - test(); - test(); - IF( ( st_fx->Opt_AMR_WB || EQ_16( st_fx->bwidth, WB ) ) && ( !st_fx->first_CNG || GE_16( hTdCngDec->act_cnt2, MIN_ACT_CNG_UPD ) ) ) - { - IF( GT_32( st_fx->last_active_brate, ACELP_16k40 ) ) - { - st_fx->CNG_mode = -1; - move16(); - } - ELSE - { - st_fx->CNG_mode = get_cng_mode( st_fx->last_active_brate ); - move16(); - } - } - - /* If first sid after active burst update LSF history from circ buffer */ - burst_ho_cnt = s_min( burst_ho_cnt, hTdCngDec->ho_circ_size ); /* MODE1_DTX_IN_CODEC_B_FIX Q0*/ - hTdCngDec->act_cnt = 0; - move16(); - s_ptr = add( sub( hTdCngDec->ho_circ_ptr, burst_ho_cnt ), 1 ); - IF( s_ptr < 0 ) - { - s_ptr = add( s_ptr, hTdCngDec->ho_circ_size ); - } - - FOR( ll = burst_ho_cnt; ll > 0; ll-- ) - { - hTdCngDec->ho_hist_ptr = add( hTdCngDec->ho_hist_ptr, 1 ); /* Q0 */ - move16(); - if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_ptr = 0; - move16(); - } - - /* Conversion between 12.8k and 16k LSPs */ - test(); - test(); - test(); - IF( ( EQ_16( st_fx->L_frame, L_FRAME16k ) && hTdCngDec->ho_16k_lsp[s_ptr] == 0 ) || ( EQ_16( st_fx->L_frame, L_FRAME ) && EQ_16( hTdCngDec->ho_16k_lsp[s_ptr], 1 ) ) ) - { - /* Conversion from 16k LPSs to 12k8 */ - lsp_convert_poly_fx( &( hTdCngDec->ho_lsp_circ_fx[s_ptr * M] ), st_fx->L_frame, 0 ); - } - /* update the circular buffers */ - Copy( &( hTdCngDec->ho_lsp_circ_fx[s_ptr * M] ), &( hTdCngDec->ho_lsp_hist_fx[hTdCngDec->ho_hist_ptr * M] ), M ); /* Qx */ - Copy32( &( hTdCngDec->ho_ener_circ_fx[s_ptr] ), &( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] ), 1 ); /* Q6 */ - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); - move32(); - Copy32( &( hTdCngDec->ho_env_circ_fx[s_ptr * NUM_ENV_CNG] ), &( hTdCngDec->ho_env_hist_fx[hTdCngDec->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); /* Qx */ - - hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); - move16(); - - if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_size = HO_HIST_SIZE; - move16(); - } - - s_ptr = add( s_ptr, 1 ); - if ( EQ_16( s_ptr, hTdCngDec->ho_circ_size ) ) - { - s_ptr = 0; - move16(); - } - } - - IF( hTdCngDec->ho_hist_size > 0 ) /* can be -1 at init MODE1_DTX_IN_CODEC_B_FIX */ - { - /* *allow_cn_step |= ( st_fx->ho_ener_hist[st_fx->ho_hist_ptr] > 4.0f * st_fx->lp_ener );*/ - L_tmp1 = L_shr( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr], 2 ); - L_tmp1 = L_sub( L_tmp1, st_fx->lp_ener_fx ); + lsf_dec_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, NULL ); - test(); - test(); - IF( ( L_tmp1 > 0 && ( st_fx->first_CNG || st_fx->element_mode == EVS_MONO ) ) ) - { - *allow_cn_step = s_or( *allow_cn_step, 1 ); - move16(); - } - } - IF( EQ_16( last_element_mode, IVAS_CPE_TD ) ) - { - *allow_cn_step = 1; - move16(); - } - test(); - IF( EQ_16( *allow_cn_step, 0 ) && GT_16( hTdCngDec->ho_hist_size, 0 ) ) - { - /* Use average of energies below last energy */ - ptr = hTdCngDec->ho_hist_ptr; - move16(); - Copy( &( hTdCngDec->ho_lsp_hist_fx[ptr * M] ), tmp, M ); /* Qx */ - m1 = 0; - move16(); - IF( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x1 ) == 0 ) - { - Copy32( &hTdCngDec->ho_env_hist_fx[ptr * NUM_ENV_CNG], tmp_env, NUM_ENV_CNG ); - m1 = 1; - move16(); - } - L_enr = Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], W_DTX_HO_FX[0] ); /* Q6+15-15->Q6 */ - - weights = W_DTX_HO_FX[0]; /* Q15 */ - move16(); - - m = 1; - move16(); - FOR( k = 1; k < hTdCngDec->ho_hist_size; k++ ) - { - ptr--; - if ( ptr < 0 ) - { - ptr = HO_HIST_SIZE - 1; - move16(); - } - - test(); - IF( LT_32( Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], ONE_OVER_BUF_H_NRG_FX ), hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] ) && - GT_32( hTdCngDec->ho_ener_hist_fx[ptr], Mult_32_16( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr], BUF_L_NRG_FX ) ) ) - { - /*enr += W_DTX_HO[k] * st_fx->ho_ener_hist[ptr];*/ - L_tmp1 = Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], W_DTX_HO_FX[k] ); /* Q6+15-15->Q6 */ - L_enr = L_add( L_enr, L_tmp1 ); /* Q6 */ - - /*weights += W_DTX_HO[k];*/ - weights = add( weights, W_DTX_HO_FX[k] ); /* Q15 */ - - Copy( &hTdCngDec->ho_lsp_hist_fx[ptr * M], &tmp[m * M], M ); /* Qx */ - IF( EQ_32( L_and( hTdCngDec->ho_sid_bw, L_shl( (Word32) 0x1, k ) ), 0 ) ) - { - Copy32( &hTdCngDec->ho_env_hist_fx[ptr * NUM_ENV_CNG], &tmp_env[m1 * NUM_ENV_CNG], NUM_ENV_CNG ); /* Qx */ - m1++; - } - m++; - } - } - - /*enr /= weights;*/ - exp = norm_s( weights ); - tmp1 = div_s( shl( 1, sub( 14, exp ) ), weights ); /* Q(15+14-exp-15) */ - L_tmp1 = Mult_32_16( L_enr, tmp1 ); /* Q(14-exp+6-15)->Q(5-exp) */ - L_enr = L_shl( L_tmp1, add( exp, 1 ) ); /* Q6 */ - - st_fx->lp_ener_fx = L_enr; /* Q6 */ - move32(); - set32_fx( max_val, 0, 2 ); - set16_fx( max_idx, 0, 2 ); - - FOR( i = 0; i < m; i++ ) - { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - lsp2lsf_fx( &tmp[i * M], lsf_tmp, M, INT_FS_FX ); - ftmp_fx = 964; - move16(); /*X2.56 */ - tmpv = sub( 16384, add( lsf_tmp[M - 1], ftmp_fx ) ); /*QX2.56*/ - L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ - } - ELSE - { - lsp2lsf_fx( &tmp[i * M], lsf_tmp, M, INT_FS_16k_FX ); - ftmp_fx = 1205; - move16(); /*QX2.56*/ - tmpv = sub( 20480, add( lsf_tmp[M - 1], ftmp_fx ) ); /*QX2.56*/ - L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ - } - - tmpv = sub( lsf_tmp[0], ftmp_fx ); /*QX2.56*/ - L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ - FOR( j = 0; j < M - 1; j++ ) - { - tmpv = sub( sub( lsf_tmp[j + 1], lsf_tmp[j] ), ftmp_fx ); /*QX2.56*/ - L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ - } - - C[i] = Mpy_32_16_1( L_tmp, 1928 ); /*QX6.5536*/ - move32(); - - IF( GT_32( C[i], max_val[0] ) ) - { - max_val[1] = max_val[0]; - move32(); - max_idx[1] = max_idx[0]; - move16(); - max_val[0] = C[i]; - move32(); - max_idx[0] = i; - move16(); - } - ELSE IF( GT_32( C[i], max_val[1] ) ) - { - max_val[1] = C[i]; - move32(); - max_idx[1] = i; - move16(); - } - } - - IF( EQ_16( m, 1 ) ) - { - Copy( tmp, lsp_tmp, M ); /* Qx */ - } - ELSE IF( LT_16( m, 4 ) ) - { - FOR( i = 0; i < M; i++ ) - { - L_tmp1 = 0; - move32(); - FOR( j = 0; j < m; j++ ) - { - L_tmp1 = L_add( L_tmp1, L_deposit_l( tmp[j * M + i] ) ); - } - - L_tmp1 = L_sub( L_tmp1, L_deposit_l( tmp[max_idx[0] * M + i] ) ); - tmpv = div_s( 1, sub( m, 1 ) ); /*Q15*/ - L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ - lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ - move16(); - } - } - ELSE - { - FOR( i = 0; i < M; i++ ) - { - L_tmp1 = 0; - move32(); - FOR( j = 0; j < m; j++ ) - { - L_tmp1 = L_add( L_tmp1, L_deposit_l( tmp[j * M + i] ) ); - } - - L_tmp1 = L_sub( L_tmp1, L_add( L_deposit_l( tmp[max_idx[0] * M + i] ), L_deposit_l( tmp[max_idx[1] * M + i] ) ) ); /*Q15*/ - tmpv = div_s( 1, sub( m, 2 ) ); /*Q15*/ - L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ - lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ - move16(); - } - } - - dist = 0; - move16(); /*Q15*/ - max_dev = 0; - move16(); /*Q15*/ - FOR( i = 0; i < M; i++ ) - { - dev = abs_s( sub( lsp_tmp[i], lsp_new[i] ) ); /*Q15*/ - dist = add_o( dist, dev, &Overflow ); /*Q15*/ - if ( GT_16( dev, max_dev ) ) - { - max_dev = dev; - move16(); - } - } - - test(); - IF( GT_16( dist, 13107 ) || GT_16( max_dev, 3277 ) ) /* 0.4 and 0.1 in Q15 */ - { - FOR( i = 0; i < M; i++ ) - { - st_fx->lspCNG_fx[i] = lsp_tmp[i]; - move16(); /*Q15*/ - } - } - ELSE - { - FOR( i = 0; i < M; i++ ) - { - /* AR low-pass filter */ - st_fx->lspCNG_fx[i] = add( mult_r( 26214, lsp_tmp[i] ), mult_r( 6554, lsp_new[i] ) ); /* Q15 */ - move16(); - } - } - IF( m1 > 0 ) - { - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - L_tmp = L_deposit_l( 0 ); - FOR( j = 0; j < m1; j++ ) - { - /* env[i] += tmp_env[j*NUM_ENV_CNG+i];*/ - L_tmp = L_add_sat( L_tmp, tmp_env[j * NUM_ENV_CNG + i] ); - } - /* env[i] /= (float)m1; */ - /* env[i] = env[i] - 2*st_fx->lp_ener_fx; */ - IF( EQ_16( m1, 1 ) ) - { - L_tmp = L_sub_sat( L_tmp, L_add_sat( st_fx->lp_ener_fx, st_fx->lp_ener_fx ) ); /* Q6 */ - } - ELSE - { - tmp1 = div_s( 1, m1 ); - L_tmp = Mult_32_16( L_tmp, tmp1 ); /* Q6 */ - L_tmp = L_sub_sat( L_tmp, L_add_sat( st_fx->lp_ener_fx, st_fx->lp_ener_fx ) ); /* Q6 */ - } - env[i] = L_tmp; /* Q6 */ - move32(); - } - - Copy32( env, hTdCngDec->lp_env_fx, NUM_ENV_CNG ); /* Q6 */ - } - } - ELSE - { - Copy( lsp_new, st_fx->lspCNG_fx, M ); /* use newly analyzed ISFs */ /* Q15 */ - } - } - - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* Update hangover memory during CNG */ - test(); - IF( ( *allow_cn_step == 0 ) && LT_32( hTdCngDec->Enew_fx, L_add_sat( st_fx->lp_ener_fx, L_shr( st_fx->lp_ener_fx, 1 ) ) ) ) - { - /* update the pointer to circular buffer of old LSP vectors */ - hTdCngDec->ho_hist_ptr++; - move16(); - if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_ptr = 0; - move16(); - } - - /* update the circular buffer of old LSP vectors with the new LSP vector */ - Copy( lsp_new, &( hTdCngDec->ho_lsp_hist_fx[( hTdCngDec->ho_hist_ptr ) * M] ), M ); /* Q15 */ - - /* update the hangover energy buffer */ - hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] = hTdCngDec->Enew_fx; /* Q6 */ - move32(); - test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && ( *sid_bw == 0 ) ) - { - /* enr1 = (float)log10( st->Enew*L_frame + 0.1f ) / (float)log10( 2.0f );*/ - exp = norm_l( hTdCngDec->Enew_fx ); - L_tmp = L_shl( hTdCngDec->Enew_fx, exp ); /*Q(exp+6)*/ - L_tmp = Mult_32_16( L_tmp, shl( st_fx->L_frame, 5 ) ); /*Q(exp+6+5-15=exp-4)*/ - L_tmp = L_shr_sat( L_tmp, sub( exp, 10 ) ); /*Q6*/ - exp = norm_l( L_tmp ); - fra = Log2_norm_lc( L_shl( L_tmp, exp ) ); - exp = sub( sub( 30, exp ), 6 ); - L_tmp = L_Comp( exp, fra ); - enr1 = L_shr( L_tmp, 10 ); /* Q6 */ - - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - /* get quantized envelope */ - /* env[i] = pow(2.0f,(enr1 - q_env[i])) + 2*st->Enew;*/ - L_tmp = L_sub( enr1, q_env[i] ); /* Q6 */ - L_tmp = L_shl( L_tmp, 10 ); /* 16 */ - temp_lo_fx = L_Extract_lc( L_tmp, &temp_hi_fx ); - - exp_pow = sub( 14, temp_hi_fx ); - L_tmp = Pow2( 14, temp_lo_fx ); /* Qexp_pow */ - env[i] = L_shl( L_tmp, sub( 6, exp_pow ) ); /* Q6 */ - move32(); - L_tmp = L_add( hTdCngDec->Enew_fx, hTdCngDec->Enew_fx ); - env[i] = L_add( env[i], L_tmp ); /* Q6 */ - move32(); - } - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); /* Q0 */ - move32(); - Copy32( env, &( hTdCngDec->ho_env_hist_fx[hTdCngDec->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); /* Q6 */ - } - ELSE IF( ( *sid_bw != 0 ) ) - { - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); /* Q0 */ - move32(); - hTdCngDec->ho_sid_bw = L_or( hTdCngDec->ho_sid_bw, 0x1L ); /* Q0 */ - move32(); - } - - hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); - move16(); - if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_size = HO_HIST_SIZE; - move16(); - } - } - /* Update the frame length memory */ - st_fx->last_CNG_L_frame = st_fx->L_frame; - move16(); - - if ( NE_32( st_fx->core_brate, SID_1k75 ) ) - { - hTdCngDec->num_ho = m; - move16(); - } - } - - IF( st_fx->element_mode == EVS_MONO ) - { - st_fx->last_CNG_L_frame = st_fx->L_frame; - move16(); - - IF( NE_32( st_fx->core_brate, SID_1k75 ) ) - { - hTdCngDec->num_ho = m; - move16(); - } - } - IF( st_fx->Opt_AMR_WB ) - { - E_LPC_f_isp_a_conversion( st_fx->lspCNG_fx, Aq, M ); - } - ELSE - { - E_LPC_f_lsp_a_conversion( st_fx->lspCNG_fx, Aq, M ); - } - - tmp_loop = shr( st_fx->L_frame, 6 ); - FOR( i = 1; i < tmp_loop; i++ ) /* L_frame/L_SUBFR */ - { - Copy( Aq, &Aq[i * ( M + 1 )], add( M, 1 ) ); /* Q12 */ - } - - return; -} -#endif -void CNG_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ - Word16 Aq[], /* o : LP coefficients Q12 */ - Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ - Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ - Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw /* i : 0-NB/WB, 1-SWB SID Q0 */ - , - Word32 *q_env ) -{ - Word16 istep; - Word16 i, L_enr_index; - Word32 L_ener; - Word16 ener_fra, ener_int; - Word16 num_bits; - Word16 weights, ptr, j, k; - Word16 m1; - Word16 m = 0; - move16(); - Word16 tmp[HO_HIST_SIZE * M]; - Word16 burst_ho_cnt = 0; - move16(); - Word16 ll, s_ptr; - Word32 L_enr, L_tmp1; - Word16 tmp1, exp; - Word16 lsf_tmp[M]; - Word32 C[M]; - Word32 max_val[2]; - Word16 max_idx[2]; - Word16 ftmp_fx; - Word16 lsp_tmp[M]; - Word16 dev; - Word16 max_dev; - Word16 dist; - Word16 tmpv; - Word16 env_idx[2]; - Word32 enr1; - Word32 env[NUM_ENV_CNG]; - Word32 tmp_env[HO_HIST_SIZE * NUM_ENV_CNG]; - Word32 L_tmp; - Word16 fra; - Word16 temp_lo_fx, temp_hi_fx; - Word16 exp_pow; - Word16 tmp_loop; - Word16 enr_new, Aq_tmp[M + 1]; - - Word16 LSF_Q_prediction; /* o : LSF prediction mode - just temporary variable in CNG */ - TD_CNG_DEC_HANDLE hTdCngDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - hTdCngDec = st_fx->hTdCngDec; - - m = 0; - move16(); - /*-----------------------------------------------------------------* - * Decode CNG spectral envelope (only in SID frame) - *-----------------------------------------------------------------*/ - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* de-quantize the LSF vector */ - IF( st_fx->Opt_AMR_WB != 0 ) - { - /* Flt function */ - isf_dec_amr_wb_fx( st_fx, Aq, lsf_new, lsp_new ); - /* check IF ISPs may trigger too much synthesis energy */ - - E_LPC_f_isp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - - IF( ( shr( enr_new, 14 ) > 0 ) ) - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - } - ELSE - { - lsf_dec_ivas_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, - NULL ); /* check IF LSPs may trigger too much synthesis energy */ - E_LPC_f_lsp_a_conversion( lsp_new, Aq_tmp, M ); enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index f53234ded..d95359665 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -556,11 +556,7 @@ void decoder_LPD_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES int_lsp4_ivas_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); -#else - int_lsp4_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); -#endif } ELSE { diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index 16f749156..9c366e3f3 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -532,35 +532,24 @@ void decoder_acelp_fx( move16(); IF( st->igf != 0 ) { -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, - gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); -#else - prep_tbe_exc_fx( st->L_frame, -#ifdef ADD_IVAS_TBE_CODE - L_SUBFR, -#endif - i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, - gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate -#ifdef ADD_IVAS_TBE_CODE - , - st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 -#endif - ); -#endif + prep_tbe_exc_fx( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, + gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); } /*---------------------------------------------------------* * Enhance the excitation * *---------------------------------------------------------*/ + E_UTIL_enhancer( st->voice_fac, stab_fac, st->past_gcode, gain_inov, &( st->gc_threshold_fx ), code, &exc2[i_subfr], gain_pit, &st->dm_fx.prev_gain_code, st->dm_fx.prev_gain_pit, &st->dm_fx.prev_state, st->coder_type, acelp_cfg.fixed_cdk_index[idx], L_SUBFR, st->L_frame, st->Q_exc ); } /* !RF_NELP frame partial copy */ + /*----------------------------------------------------------* * - compute the synthesis speech * *----------------------------------------------------------*/ + rescale_mem( &st->Q_exc, &prev_Q_syn, &st->Q_syn, mem_syn, syn, M, i_subfr ); E_UTIL_synthesis( sub( st->Q_exc, st->Q_syn ), p_A, &exc2[i_subfr], &syn[i_subfr], L_SUBFR, mem_syn, 1, M ); @@ -686,16 +675,11 @@ void decoder_acelp_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, syn, pBuf_scaleSyn, st->enr_old_fx, 0, - st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, force_scale_syn ); -#else FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, syn, pBuf_scaleSyn, st->enr_old_fx, 0, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, force_scale_syn ); -#endif + exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, force_scale_syn ); } + /* update ACELP synthesis memory */ Copy( mem_syn, st->mem_syn2_fx, M ); Copy( syn + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index b03b6d69c..500fe34ba 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -71,11 +71,7 @@ void decod_amr_wb_fx( * Decode pitch lag *----------------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); -#else - *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); -#endif + *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*--------------------------------------------------------------* * Find the adaptive codebook vector diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 7411d59f2..3e42d9535 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -18,8 +18,7 @@ /*----------------------------------------------------------------------*/ /* GLOBAL INPUT ARGUMENTS : */ /* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ - +/* _ (Word16) L_frame : length of the frame */ /* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ /* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ /* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ @@ -29,503 +28,30 @@ /* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ /* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /*----------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES ivas_error decod_gen_voic_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient Q12 */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6 */ - Word16 *voice_factors_fx, /* o : voicing factors Q15 */ - Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf /*Q14*/ -) -{ - - - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx = 0; /* pitch gain Q14 */ - move16(); - Word32 gain_code_fx = 0; /* gain/normalized gain of the algebraic excitation Q16 */ - move32(); - Word32 norm_gain_code_fx = 0; /* normalized gain of the algebraic excitation Q16 */ - move32(); - Word16 gain_inov_fx = 0; /* Innovation gain Q12 */ - move16(); - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ - Word16 voice_fac_fx; /* voicing factor Q15 */ - Word16 code_fx[L_SUBFR]; /* algebraic codevector Q12 */ - - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to floating pitch Q6 */ - Word16 i_subfr_fx, i; /* tmp variables */ - Word16 error_fx = 0; - move16(); - Word16 gain_preQ_fx = 0; /* Gain of prequantizer excitation */ - move16(); - Word16 code_preQ_fx[L_SUBFR]; /* Prequantizer excitation */ - Word32 norm_gain_preQ_fx; - Word16 pitch_limit_flag_fx; - - Word16 tmp1_fx, gain_code16; - Word32 L_tmp_GC; - Word32 L_tmp; - - Word16 harm_flag_acelp; - - Word16 shft_prev, ph_offset_fx; - Word32 prev_res_nrg; - Word32 prev_spch_nrg; - Word32 curr_res_nrg; - Word32 curr_spch_nrg; - Word16 rint_bfi_pitch, rint_pitch; - Word16 fraca, fracb, expa, expb, scale, exp1; - Word16 *p_exc; - Word16 mem_tmp_fx[M]; - Word16 syn_tmp_fx[L_FRAME16k]; - Word16 shft_curr; - Word16 *p_syn; - Word16 sp_enratio, Qsp_enratio; - Word16 enratio, Qenratio; - DTFS_STRUCTURE *PREVP, *CURRP; - Word16 S_fx[PIT_MAX * 4 + 1], C_fx[PIT_MAX * 4 + 1]; - Word16 dummy2[2]; - Word16 out_fx[L_FRAME16k]; - - Word16 pf_temp1[MAXLAG_WI]; /*may not need more than MAXLAG_WI/2+1 */ - Word16 pf_temp2[MAXLAG_WI]; - Word16 pf_temp[MAXLAG_WI]; - Word16 pf_n2[MAXLAG_WI]; - MUSIC_POSTFILT_HANDLE hMusicPF; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - hMusicPF = st_fx->hMusicPF; - - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - T0_fx = PIT_MIN; - move16(); - T0_frac_fx = 0; - move16(); - - /* read harmonicity flag */ - harm_flag_acelp = 0; - move16(); - test(); - test(); - IF( ( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && LE_32( st_fx->core_brate, MAX_BRATE_AVQ_EXC_TD ) ) && EQ_16( st_fx->coder_type, GENERIC ) ) - { - harm_flag_acelp = (Word16) get_next_indice( st_fx, 1 ); - } - - /*------------------------------------------------------------------* - * ACELP subframe loop - *------------------------------------------------------------------*/ - - p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ - norm_gain_preQ_fx = 0; - move32(); - gain_preQ_fx = 0; - move16(); - set16_fx( code_preQ_fx, 0, L_SUBFR ); - - FOR( i_subfr_fx = 0; i_subfr_fx < L_frame; i_subfr_fx += L_SUBFR ) - { - /*----------------------------------------------------------------------* - * Decode pitch lag - *----------------------------------------------------------------------*/ - - *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR ); - move16(); /*Q6*/ - - /*--------------------------------------------------------------* - * Find the adaptive codebook vector - *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - - tbe_celp_exc( L_frame, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx ); - - /*--------------------------------------------------------------* - * LP filtering of the adaptive excitation - *--------------------------------------------------------------*/ - lp_filt_exc_dec_fx( st_fx, MODE1, i_subfr_fx, L_SUBFR, L_frame, st_fx->acelp_cfg.ltf_mode, exc_fx ); - /*-----------------------------------------------------------------* - * Transform-domain contribution decoding (active frames) - *-----------------------------------------------------------------*/ - - test(); - IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && ( st_fx->coder_type != INACTIVE ) ) - { - gain_code_fx = 0; - move16(); - transf_cdbk_dec_fx( st_fx, harm_flag_acelp, i_subfr_fx, Es_pred_fx, gain_code_fx, &gain_preQ_fx, &norm_gain_preQ_fx, code_preQ_fx, unbits ); - } - - /*--------------------------------------------------------------* - * Innovation decoding - *--------------------------------------------------------------*/ - - inov_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, sharpFlag_fx, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_SUBFR ); - - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) - { - gain_dec_lbr_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); - } - ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) - { - gain_dec_SQ_fx( st_fx, i_subfr_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - } - ELSE - { - gain_dec_mless_fx( st_fx, L_frame, st_fx->coder_type, i_subfr_fx, -1, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - } - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, st_fx->Q_exc ); // Q15 - move16(); - - /*-----------------------------------------------------------------* - * Transform domain contribution decoding - *-----------------------------------------------------------------*/ - test(); - IF( GE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) && ( st_fx->coder_type == INACTIVE ) ) - { - transf_cdbk_dec_fx( st_fx, harm_flag_acelp, i_subfr_fx, Es_pred_fx, gain_code_fx, &gain_preQ_fx, &norm_gain_preQ_fx, code_preQ_fx, unbits ); - } - - /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); - - /*----------------------------------------------------------------------* - * Find the total excitation - *----------------------------------------------------------------------*/ - - IF( EQ_16( L_frame, L_FRAME ) ) /* Rescaling for 12.8k core */ - { - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[i_subfr_fx * HIBND_ACB_L_FAC], hGSCDec->last_exc_dct_in_fx, - L_SUBFR, L_SUBFR * HIBND_ACB_L_FAC, gain_code_fx, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, i_subfr_fx, st_fx->coder_type ); - } - ELSE /* Rescaling for 16k core */ - { - - L_tmp_GC = L_max( gain_code_fx, L_shl( gain_preQ_fx, 16 ) ); /* Chose the maximum of gain_code or the prequantizer excitation x4 to keep some room*/ - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[i_subfr_fx * 2], hGSCDec->last_exc_dct_in_fx, - L_SUBFR, L_SUBFR * 2, L_tmp_GC, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, i_subfr_fx, st_fx->coder_type ); - } - - gain_code16 = round_fx( L_shl( gain_code_fx, st_fx->Q_exc ) ); /*Q_exc*/ - - /*-----------------------------------------------------------------* - * Add the ACELP pre-quantizer contribution - *-----------------------------------------------------------------*/ - - IF( gain_preQ_fx != 0 ) - { - IF( st_fx->element_mode == EVS_MONO ) - { - tmp1_fx = add( 15 - Q_AVQ_OUT_DEC - 2, st_fx->Q_exc ); - } - ELSE - { - tmp1_fx = add( 15 - Q_AVQ_OUT - 2, st_fx->Q_exc ); - } - FOR( i = 0; i < L_SUBFR; i++ ) - { - Word32 Ltmp1; - /* Contribution from AVQ layer */ - Ltmp1 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /* Q2 + Q6 -> Q9*/ - Ltmp1 = L_shl_sat( Ltmp1, tmp1_fx ); /* Q16 + Q_exc */ - - /* Compute exc2 */ - L_tmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); // Q_exc+Q14+1+1 - exc2_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( L_tmp, Ltmp1 ) ); // Q_exc - move16(); - /* gain_pit in Q14 */ - L_tmp = L_mult( gain_code16, code_fx[i] ); // Q_exc+Q9+1 - L_tmp = L_shl_sat( L_tmp, 5 ); // Q_exc+Q9+1+5 - L_tmp = L_mac_sat( L_tmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); // Q_exc+Q15 +1 - L_tmp = L_shl_sat( L_tmp, 1 ); /* saturation can occur here */ - - exc_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( L_tmp, Ltmp1 ) ); // Q_exc - move16(); - } - } - ELSE - { - Acelp_dec_total_exc( exc_fx, exc2_fx, gain_code16, gain_pit_fx, i_subfr_fx, code_fx, L_SUBFR ); - } - - /*-----------------------------------------------------------------* - * Prepare TBE excitation - *-----------------------------------------------------------------*/ - - Word16 idx = 0; - move16(); - IF( i_subfr_fx != 0 ) - { - idx = idiv1616( i_subfr_fx, L_SUBFR ); - } - - prep_tbe_exc_fx( L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate ); - - - /*----------------------------------------------------------------* - * Excitation enhancements (update of total excitation signal) - *----------------------------------------------------------------*/ - - test(); - IF( GT_32( st_fx->core_brate, ACELP_32k ) || ( st_fx->coder_type == INACTIVE ) ) - { - Copy( exc_fx + i_subfr_fx, exc2_fx + i_subfr_fx, L_SUBFR ); - } - ELSE - { - enhancer_fx( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); - } - - p_Aq_fx += ( M + 1 ); - pt_pitch_fx++; - gain_buf[idx] = gain_pit_fx; // Q14 - move16(); - } - - /* FEC fast recovery */ - - IF( do_WI_fx ) - { - /* shft_prev = L_EXC_MEM - rint_new_fx(st_fx->bfi_pitch_fx);*/ - L_tmp = L_shl( L_deposit_l( st_fx->bfi_pitch_fx ), 10 ); /*Q16*/ - rint_bfi_pitch = rint_new_fx( L_tmp ); /*Q0*/ - shft_prev = sub( L_EXC_MEM, rint_bfi_pitch ); /*Q0*/ - - p_exc = st_fx->hWIDec->old_exc2_fx + shft_prev; - p_syn = st_fx->hWIDec->old_syn2_fx + shft_prev; - move16(); - move16(); - - prev_res_nrg = L_deposit_l( 1 ); - prev_spch_nrg = L_deposit_l( 1 ); - FOR( i = 0; i < rint_bfi_pitch; i++ ) - { - prev_res_nrg = L_mac0_sat( prev_res_nrg, *p_exc, *p_exc ); /* 2*st_fx->prev_Q_exc_fr */ - prev_spch_nrg = L_mac0_sat( prev_spch_nrg, *p_syn, *p_syn ); /* 2*st_fx->prev_Q_syn_fr */ - p_exc++; - p_syn++; - } - - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); - - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_tmp_fx, mem_tmp_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - - L_tmp = L_shl( L_deposit_l( pitch_buf_fx[NB_SUBFR16k - 1] ), 10 ); /*Q16*/ - rint_pitch = rint_new_fx( L_tmp ); /*Q0*/ - shft_curr = sub( st_fx->L_frame, rint_pitch ); /*Q0*/ - - p_exc = exc2_fx + shft_curr; - p_syn = syn_tmp_fx + shft_curr; - - curr_res_nrg = L_deposit_l( 1 ); - curr_spch_nrg = L_deposit_l( 1 ); - FOR( i = 0; i < rint_pitch; i++ ) - { - curr_res_nrg = L_mac0_sat( curr_res_nrg, *p_exc, *p_exc ); /* 2*st_fx->Q_exc */ - curr_spch_nrg = L_mac0_sat( curr_spch_nrg, *p_syn, *p_syn ); /* 2*st_fx->Q_syn */ - p_exc++; - p_syn++; - } - - /* enratio = (curr_res_nrg / prev_res_nrg); */ - IF( prev_res_nrg > 0 ) - { - expa = norm_l( prev_res_nrg ); - fraca = extract_h( L_shl( prev_res_nrg, expa ) ); /* 2*st_fx->prev_Q_exc_fr -16+expa +1*/ - expa = sub( 30, add( expa, ( shl( st_fx->prev_Q_exc_fr, 1 ) ) ) ); - - expb = norm_l( curr_res_nrg ); - fracb = round_fx_sat( L_shl_sat( curr_res_nrg, expb ) ); /* 2*st_fx->Q_exc +expb+1 -16*/ - expb = sub( 30, add( expb, shl( st_fx->Q_exc, 1 ) ) ); - - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl( fracb, scale ); // Q(15-expb)+scale - expb = sub( expb, scale ); - - enratio = div_s( fracb, fraca ); // Q(15-(expb-expa)) - exp1 = sub( expb, expa ); - Qenratio = sub( 15, exp1 ); - } - ELSE - { - enratio = 0; - move16(); - Qenratio = 0; - move16(); - } - - /* sp_enratio = curr_spch_nrg/prev_spch_nrg */ - IF( prev_spch_nrg > 0 ) - { - expa = norm_l( prev_spch_nrg ); - fraca = extract_h( L_shl( prev_spch_nrg, expa ) ); /* 2*st_fx->prev_Q_syn_fr +expa+1-16*/ - expa = sub( 30, add( expa, shl( st_fx->prev_Q_syn_fr, 1 ) ) ); - - expb = norm_l( curr_spch_nrg ); - fracb = round_fx_sat( L_shl_sat( curr_spch_nrg, expb ) ); /* 2*st_fx->Q_syn +expb-16 */ - expb = sub( 30, add( expb, shl( st_fx->Q_syn, 1 ) ) ); - - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl( fracb, scale ); // Q(15-expb) +scale - expb = sub( expb, scale ); - - sp_enratio = div_s( fracb, fraca ); // Q(15-(expb-expa)) - exp1 = sub( expb, expa ); - Qsp_enratio = sub( 15, exp1 ); - } - ELSE - { - sp_enratio = 0; - move16(); - Qsp_enratio = 0; - move16(); - } - - test(); - test(); - test(); - test(); - IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( shl_ro( sp_enratio, sub( 15, Qsp_enratio ), &Overflow ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[NB_SUBFR16k - 1], 9600 ) ) /*Q6*/ - { - IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = DTFS_new_fx( &CURRP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - GetSinCosTab_fx( rint_bfi_pitch, S_fx, C_fx ); - DTFS_to_fs_fx( st_fx->hWIDec->old_exc2_fx + shft_prev, rint_bfi_pitch, PREVP, (Word16) st_fx->output_Fs, do_WI_fx, S_fx, C_fx ); - PREVP->Q = add( PREVP->Q, st_fx->prev_Q_exc_fr ); - move16(); - - GetSinCosTab_fx( rint_pitch, S_fx, C_fx ); - DTFS_to_fs_fx( exc2_fx + shft_curr, rint_pitch, CURRP, (Word16) st_fx->output_Fs, do_WI_fx, S_fx, C_fx ); - CURRP->Q = add( CURRP->Q, st_fx->Q_exc ); - move16(); - - ph_offset_fx = 0; - move16(); - IF( NE_32( ( error = WIsyn_fx( *PREVP, CURRP, dummy2, &( ph_offset_fx ), out_fx, (Word16) st_fx->L_frame, 1, S_fx, C_fx, pf_temp1, pf_temp2, pf_temp, pf_n2 ) ), IVAS_ERR_OK ) ) - { - return error; - } - - - Copy_Scale_sig( out_fx, exc2_fx, st_fx->L_frame, st_fx->Q_exc ); // Q_exc - Copy_Scale_sig( out_fx, exc_fx, st_fx->L_frame, st_fx->Q_exc ); // Q_exc - - /* update bwe_exc for SWB-TBE */ - FOR( i_subfr_fx = 0; i_subfr_fx < L_frame; i_subfr_fx += L_SUBFR ) - { - interp_code_4over2_fx( exc_fx + i_subfr_fx, bwe_exc_fx + shl( i_subfr_fx, 1 ), L_SUBFR ); - } - - free( PREVP ); - free( CURRP ); - } - } - - /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = gain_pit_fx; - move16(); /*Q14*/ - st_fx->prev_tilt_code_dec_fx = st_fx->tilt_code_fx; - move16(); /*Q15*/ - - return error; -} - -/*======================================================================*/ -/* FUNCTION : decod_gen_voic_ivas_fx() */ -/*----------------------------------------------------------------------*/ -/* PURPOSE : Decode generic (GC), voiced (VC) and AMR-WB IO frames */ -/* */ -/*----------------------------------------------------------------------*/ -/* GLOBAL INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ - -/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ -/*----------------------------------------------------------------------*/ - - -/*----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================*/ -#endif -ivas_error decod_gen_voic_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient Q12*/ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15 */ - Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf, - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 sharpFlag_fx, /* i : formant sharpening flag */ + const Word16 *Aq_fx, /* i : LP filter coefficient Q12 */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ + const Word16 do_WI_fx, /* i : do interpolation after a FER */ + Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe Q6 */ + Word16 *voice_factors_fx, /* o : voicing factors Q15 */ + Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ + Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ + Word16 *unbits, /* number of unused bits */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14 */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ ) { - - - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ + Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ Word16 gain_pit_fx; /* pitch gain Q14 */ Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ @@ -536,7 +62,7 @@ ivas_error decod_gen_voic_ivas_fx( Word16 code_fx[L_SUBFR]; /* algebraic codevector Q12 */ const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ + Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ Word16 i_subfr_fx, i; /* tmp variables */ Word16 error_fx; Word16 gain_preQ_fx; /* Gain of prequantizer excitation */ @@ -633,10 +159,8 @@ ivas_error decod_gen_voic_ivas_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - /**pt_pitch_fx = pit_decode_fx(st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR);*/ - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, + &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); move16(); /*Q6*/ /*--------------------------------------------------------------* @@ -677,7 +201,7 @@ ivas_error decod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { - gain_dec_lbr_ivas_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); + gain_dec_lbr_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { @@ -700,13 +224,11 @@ ivas_error decod_gen_voic_ivas_fx( } /* update LP filtered gains for the case of frame erasures */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); } ELSE -#endif { lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); } @@ -790,10 +312,6 @@ ivas_error decod_gen_voic_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - /*prep_tbe_exc_fx(L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate);*/ - Word16 idx; idx = 0; move16(); @@ -802,10 +320,10 @@ ivas_error decod_gen_voic_ivas_fx( idx = idiv1616( i_subfr_fx, L_SUBFR ); } - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, + st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*----------------------------------------------------------------* @@ -819,14 +337,12 @@ ivas_error decod_gen_voic_ivas_fx( } ELSE { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { enhancer_fx( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); } ELSE -#endif { enhancer_ivas_fx2( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index fe7d2daaf..a18029cdc 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -14,13 +14,13 @@ /*--------------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ /* _ (Word16*) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ +/* _ (Word16) coder_type : coding type Q0 */ /* _ (Word16) nb_subfr_fx :Number of subframe considered */ /* _ (Word16) Es_pred_fx :predicted scaled innov. energy */ /*--------------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ /* _ (Word16*) pitch_buf_fx : floating pitch values for each subframe Q6 */ -/* _ (Word16*) code_fx : innovation Q12 */ +/* _ (Word16*) code_fx : innovation Q12 */ /*--------------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ /* Decoder_State_fx *st_fx : decoder state structure */ @@ -30,438 +30,29 @@ /* _ None */ /*==========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void dec_pit_exc_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 coder_type, /* i : coding type */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *code_fx, /* o : innovation */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - const Word16 nb_subfr_fx /* i : Number of subframe considered */ - , - Word16 *gain_buf /*Q14*/ -) -{ - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx; /* pitch gain Q14 */ - Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ - Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ - Word16 gain_inov_fx; /* Innovation gain Q12 */ - Word16 voice_fac_fx; /* voicing factor Q15 */ - Word16 L_subfr_fx, pit_idx_fx; - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to floating pitch Q6 */ - Word16 i_subfr_fx, i; /* tmp variables */ - Word32 Local_BR_fx, Pitch_BR_fx; - Word16 pitch_limit_flag, Pitch_CT_fx; - Word16 exc2_bidon[L_SUBFR]; - Word16 *pt_gain; /* Pointer to floating gain values for each subframe */ - - Word16 gain_code16, gain_pitx2; - Word32 L_tmp; - Word16 nbits; - GSC_DEC_HANDLE hGSCDec; - gain_pit_fx = 0; - move16(); - hGSCDec = st_fx->hGSCDec; - - MUSIC_POSTFILT_HANDLE hMusicPF; - hMusicPF = st_fx->hMusicPF; - - Word16 use_fcb; - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - - use_fcb = 0; - move16(); - test(); - test(); - IF( ( st_fx->GSC_IVAS_mode > 0 ) && ( EQ_16( st_fx->GSC_noisy_speech, 1 ) || GT_32( st_fx->core_brate, GSC_H_RATE_STG ) ) ) - { - Local_BR_fx = ACELP_8k00; - Pitch_CT_fx = GENERIC; - Pitch_BR_fx = ACELP_8k00; - move32(); - move32(); - move16(); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Local_BR_fx = ACELP_14k80; - move32(); - if ( st_fx->GSC_IVAS_mode > 0 ) - { - Local_BR_fx = ACELP_9k60; - move32(); - } - Pitch_BR_fx = st_fx->core_brate; - move32(); - } - } - ELSE IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) ) - { - Local_BR_fx = ACELP_7k20; - move32(); - Pitch_CT_fx = GENERIC; - move16(); - Pitch_BR_fx = ACELP_7k20; - move32(); - if ( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Pitch_BR_fx = st_fx->core_brate; - move32(); - } - } - ELSE - { - Local_BR_fx = ACELP_7k20; - move32(); - Pitch_CT_fx = AUDIO; - move16(); - Pitch_BR_fx = st_fx->core_brate; - move32(); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Pitch_BR_fx = ACELP_13k20; - move32(); - Pitch_CT_fx = GENERIC; - move16(); - } - } - L_subfr_fx = mult_r( st_fx->L_frame, div_s( 1, nb_subfr_fx ) ); /* TV2Opt : this could be less complex with 2 ifs*/ - - - gain_code_fx = 0; - move16(); - pitch_limit_flag = 1; - move16(); /* always extended pitch Q range */ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) - { - use_fcb = 1; - move16(); - } - ELSE IF( ( st_fx->GSC_IVAS_mode > 0 ) && EQ_16( L_subfr_fx, 2 * L_SUBFR ) && LT_16( st_fx->GSC_IVAS_mode, 3 ) ) - { - use_fcb = 2; - st_fx->acelp_cfg.fcb_mode = 1; - move16(); - move16(); - set16_fx( st_fx->acelp_cfg.gains_mode, 6, 4 ); - set16_fx( st_fx->acelp_cfg.pitch_bits, 9, 4 ); - set16_fx( st_fx->acelp_cfg.fixed_cdk_index, 14, 5 ); - } - /*------------------------------------------------------------------* - * ACELP subframe loop - *------------------------------------------------------------------*/ - p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ - pt_gain = gain_buf; /* pointer to the gain buffer */ - FOR( i_subfr_fx = 0; i_subfr_fx < st_fx->L_frame; i_subfr_fx += L_subfr_fx ) - { - /*----------------------------------------------------------------------* - * Decode pitch lag - *----------------------------------------------------------------------*/ - *pt_pitch_fx = pit_decode_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx ); - move16(); - - /*--------------------------------------------------------------* - * Find the adaptive codebook vector. - *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - - /*--------------------------------------------------------------* - * Innovation decoding - *--------------------------------------------------------------*/ - - IF( EQ_16( use_fcb, 1 ) ) - { - inov_decode_fx( st_fx, Local_BR_fx, 0, st_fx->L_frame, 1, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_subfr_fx ); - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - gain_dec_mless_fx( st_fx, st_fx->L_frame, LOCAL_CT, i_subfr_fx, -1, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0 ); - move16(); - } - ELSE IF( EQ_16( use_fcb, 2 ) ) /* IVAS only */ - { - inov_decode_fx( st_fx, Local_BR_fx, 0, st_fx->L_frame, 1, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_subfr_fx ); - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - gain_dec_lbr_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); - - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0 ); - move16(); - } - ELSE - { - nbits = 5; - move16(); - if ( LT_32( st_fx->core_brate, MIN_RATE_FCB ) ) - { - nbits = 4; - move16(); - } - - set16_fx( code_fx, 0, L_SUBFR ); - gain_code_fx = L_deposit_l( 0 ); - st_fx->tilt_code_fx = 0; - move16(); - pit_idx_fx = (Word16) get_next_indice( st_fx, nbits ); - move16(); - - gain_pit_fx = add( 9590, dic_gp_fx[pit_idx_fx] ); - move16(); /*Q14 0.5853 in Q14 9590*/ - - if ( st_fx->BER_detect ) /* Bitstream is corrupted, use the past pitch gain */ - { - gain_pit_fx = st_fx->lp_gainp_fx; - move16(); - } - gain_code_fx = L_mult0( s_max( sub( 32767, shl_o( gain_pit_fx, 1, &Overflow ) ), 16384 ), st_fx->lp_gainc_fx ); /* Use gain pitch and past gain code as an indicator to help finding the best scaling value. gain_code_fx used a temp var*/ - } - - /*----------------------------------------------------------------------* - * Find the total excitation - *----------------------------------------------------------------------*/ - - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[( i_subfr_fx * ( 2 * HIBND_ACB_L_FAC ) ) / 2], hGSCDec->last_exc_dct_in_fx, - L_subfr_fx, shr( imult1616( L_subfr_fx, 2 * HIBND_ACB_L_FAC ), 1 ), gain_code_fx, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, i_subfr_fx, coder_type ); - - gain_code16 = round_fx( L_shl( gain_code_fx, st_fx->Q_exc ) ); /*Q_exc*/ - - IF( use_fcb != 0 ) - { - Acelp_dec_total_exc( exc_fx, exc2_bidon - i_subfr_fx, gain_code16, gain_pit_fx, i_subfr_fx, code_fx, L_subfr_fx ); - } - ELSE - { - IF( norm_s( s_or( gain_pit_fx, 1 ) ) == 0 ) - { - FOR( i = 0; i < L_subfr_fx; i++ ) - { - L_tmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); /*Q16+Q_exc*/ - exc_fx[i + i_subfr_fx] = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - } - } - ELSE - { - gain_pitx2 = shl( gain_pit_fx, 1 ); /*Q15*/ - - FOR( i = 0; i < L_subfr_fx; i++ ) - { - L_tmp = L_mult( gain_pitx2, exc_fx[i + i_subfr_fx] ); /*Q16+Q_exc*/ - exc_fx[i + i_subfr_fx] = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - } - } - } - - IF( EQ_16( L_subfr_fx, L_FRAME16k ) ) - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = gain_pit_fx; - move16(); - st_fx->lp_gainc_fx = 0; - move32(); - - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - move16(); - move16(); - move16(); - move16(); - p_Aq_fx += 5 * ( M + 1 ); - } - ELSE IF( EQ_16( L_subfr_fx, L_FRAME16k / 2 ) ) - { - IF( i_subfr_fx == 0 ) - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - p_Aq_fx += 2 * ( M + 1 ); - move16(); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 6554, gain_pit_fx ) ); /*Q14 (3/15 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - ELSE - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - p_Aq_fx += 3 * ( M + 1 ); - move16(); - move16(); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 26214, gain_pit_fx ) ); /*Q14 (12/15 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - } - ELSE IF( EQ_16( L_subfr_fx, 128 ) ) /*2*L_SUBFR*/ - { - p_Aq_fx += 2 * ( M + 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - IF( i_subfr_fx == 0 ) - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 9830, gain_pit_fx ) ); /*Q14 (3/10 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - ELSE - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 22938, gain_pit_fx ) ); /*Q14 (7/10 in Q15 22938)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - } - ELSE IF( EQ_16( L_subfr_fx, 256 ) ) /*4*L_SUBFR*/ - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - p_Aq_fx += 4 * ( M + 1 ); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = gain_pit_fx; - move16(); - st_fx->lp_gainc_fx = 0; - move16(); - } - ELSE - { - p_Aq_fx += ( M + 1 ); - move16(); - pt_pitch_fx++; - move16(); - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, 0, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, st_fx->L_frame ); - } - } - - return; -} - -/*==========================================================================*/ -/* FUNCTION : void dec_pit_exc_ivas_fx() */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Decode pitch only contribution */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) nb_subfr_fx :Number of subframe considered */ -/* _ (Word16) Es_pred_fx :predicted scaled innov. energy */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) pitch_buf_fx : Word16 pitch values for each subframe Q6 */ -/* _ (Word16*) code_fx : innovation */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State_fx *st_fx : decoder state structure */ -/* _ (Word16*) exc_fx : adapt. excitation exc */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==========================================================================*/ -#endif -void dec_pit_exc_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ const Word16 coder_type, /* i : coding type */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe */ + Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe */ Word16 *code_fx, /* o : innovation */ Word16 *exc_fx, /* i/o: adapt. excitation exc */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ const Word16 nb_subfr_fx, /* i : Number of subframe considered */ - Word16 *gain_buf, /*Q14*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ) { - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx; /* pitch gain Q14 */ - Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ + Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ + Word16 gain_pit_fx; /* pitch gain Q14 */ + Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ - Word16 gain_inov_fx; /* Innovation gain Q12 */ + Word16 gain_inov_fx; /* Innovation gain Q12 */ Word16 voice_fac_fx; /* voicing factor Q15 */ Word16 L_subfr_fx, pit_idx_fx; - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ + const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ Word16 i_subfr_fx, i; /* tmp variables */ Word32 Local_BR_fx, Pitch_BR_fx; @@ -578,13 +169,14 @@ void dec_pit_exc_ivas_fx( p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ pt_gain = gain_buf; /* pointer to the gain buffer */ + FOR( i_subfr_fx = 0; i_subfr_fx < st_fx->L_frame; i_subfr_fx += L_subfr_fx ) { /*----------------------------------------------------------------------* * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + *pt_pitch_fx = pit_decode_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); move16(); /*--------------------------------------------------------------* @@ -621,7 +213,7 @@ void dec_pit_exc_ivas_fx( * Estimate spectrum tilt and voicing *--------------------------------------------------------------*/ - gain_dec_lbr_ivas_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); + gain_dec_lbr_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); st_fx->tilt_code_fx = est_tilt_ivas_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0, L_subfr_fx, 0 ); move16(); diff --git a/lib_dec/dec_post_fx.c b/lib_dec/dec_post_fx.c index 281281ed6..37d088a8f 100644 --- a/lib_dec/dec_post_fx.c +++ b/lib_dec/dec_post_fx.c @@ -33,10 +33,7 @@ static void calc_st_filt_local_fx( Word16 *apond2, Word16 *apond1, Word16 *parco static void modify_pst_param_fx( const Word16 lp_noise, Word16 *g1, Word16 *g2, const Word16 coder_type, Word16 *gain_factor ); -#ifndef REMOVE_EVS_DUPLICATES static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); -#endif -static void Dec_formant_postfilt_ivas_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); static void calc_st_filt_ivas_fx( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero, const Word16 extl ); @@ -82,7 +79,7 @@ void Init_post_filter_fx( *--------------------------------------------------------------------------*/ void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *psf_lp_noise, /* i : Long term noise Q8 */ const Word16 tmp_noise, /* i : noise energy Q0 */ Word16 *Synth, /* i : 12k8 synthesis Qsyn */ @@ -257,22 +254,20 @@ static void Dec_postfilt_fx( * Main routine to perform formant post filtering *--------------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES void formant_post_filt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient Q12 */ + Word16 *Aq, /* i : LP filter coefficient Q12 */ Word16 *synth_out, /* i/o: input signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 brate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ + const Word16 L_frame, /* i : frame length */ + const Word32 lp_noise, /* (i) : background noise energy (15Q16) */ + const Word32 brate, /* (i) : bit-rate */ + const Word16 off_flag /* i : off flag */ ) { Word16 i_subfr; Word16 *p_Aq; - Word16 post_G1, post_G2; // Q15 - + Word16 post_G1, post_G2; /*default parameter for noisy speech and high bit-rates*/ IF( EQ_16( L_frame, L_FRAME ) ) @@ -381,134 +376,13 @@ void formant_post_filt_fx( Dec_formant_postfilt_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); p_Aq += ( M + 1 ); } -} -#endif -void formant_post_filt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient Q12 */ - Word16 *synth_out, /* i/o: input signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 brate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ -) -{ - Word16 i_subfr; - Word16 *p_Aq; - Word16 post_G1, post_G2; - - - /*default parameter for noisy speech and high bit-rates*/ - IF( EQ_16( L_frame, L_FRAME ) ) - { - post_G2 = 22938 /*0.7f Q15*/; - move16(); - IF( LT_32( lp_noise, LP_NOISE_THRESH ) ) - { - /*Clean speech*/ - IF( LT_32( brate, ACELP_13k20 ) ) - { - /*Low rates*/ - - post_G1 = 26214 /*0.8f Q15*/; - move16(); - } - ELSE IF( LT_32( brate, ACELP_24k40 ) ) - { - /*Low rates*/ - - post_G1 = 24576 /*0.75f Q15*/; - move16(); - } - ELSE - { - post_G1 = 23593 /*0.72f Q15*/; - move16(); - } - } - ELSE /*Noisy speech*/ - { - post_G1 = 22938 /*0.7f Q15*/; - move16(); - if ( LT_32( brate, ACELP_15k85 ) ) - { - /*Low rates*/ - post_G1 = 24576 /*0.75f Q15*/; - move16(); - } - } - } - ELSE - { - post_G2 = 24904 /*0.76f Q15*/; - move16(); - test(); - IF( GE_32( lp_noise, LP_NOISE_THRESH ) ) - { - post_G1 = 24904 /*0.76f Q15*/; - } - ELSE IF( EQ_32( brate, ACELP_13k20 ) ) - { - post_G1 = 26870 /*0.82f Q15*/; - move16(); - } - ELSE IF( EQ_32( brate, ACELP_16k40 ) ) - { - post_G1 = 26214 /*0.80f Q15*/; - move16(); - } - ELSE IF( EQ_32( brate, ACELP_24k40 ) || EQ_32( brate, ACELP_32k ) ) - { - post_G1 = 25559 /*0.78f Q15*/; - move16(); - } - ELSE - { - post_G1 = 24904 /*0.76f Q15*/; - move16(); - } - } - /* Switch off post-filter */ - if ( off_flag != 0 ) - { - post_G1 = post_G2; - move16(); - } - - /* Reset post filter */ - IF( hPFstat->reset != 0 ) - { - post_G1 = MAX16B; - move16(); - post_G2 = MAX16B; - move16(); - hPFstat->reset = 0; - move16(); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_stp, L_SYN_MEM ); - hPFstat->gain_prec = 16384; // 1.Q14 - move16(); - Copy( synth_in, synth_out, L_frame ); - - return; - } + return; +} - /* input memory*/ - Copy( hPFstat->mem_pf_in, synth_in - L_SYN_MEM, L_SYN_MEM ); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); - move16(); - p_Aq = Aq; // Q12 - FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) - { - Dec_formant_postfilt_ivas_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); - p_Aq += ( M + 1 ); - } -} /*---------------------------------------------------------------------------- - * Dec_formant_postfilt_fx + * Dec_formant_postfilt_fx() * * Post - adaptive postfilter main function * Short term postfilter : @@ -522,93 +396,14 @@ void formant_post_filt_ivas_fx( * k1 = 1st parcor calculated on {hi} * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 *----------------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES -static void Dec_formant_postfilt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ - Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ - Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ -) -{ - /* Local variables and arrays */ - Word16 apond1[M + 1]; /* s.t. denominator coeff. Q12*/ - Word16 apond2[LONG_H_ST]; // Q12 - Word16 res2[L_SUBFR]; // Q14 - Word16 resynth[L_SUBFR + 1]; // Qy - Word16 parcor0; // Q15 - Word16 i, max; - Word16 scale_down; - - /* Compute weighted LPC coefficients */ - weight_a_fx( coeff, apond1, gamma1, M ); - weight_a_fx( coeff, apond2, gamma2, M ); - set16_fx( &apond2[M + 1], 0, LONG_H_ST - ( M + 1 ) ); - max = abs_s( signal_ptr[0] ); // Q14 - FOR( i = 1; i < L_SUBFR; i++ ) - { - max = s_max( max, abs_s( signal_ptr[i] ) ); - } - scale_down = 0; - move16(); - if ( GT_16( max, 16384 /*1.Q14*/ ) ) - { - scale_down = 1; - move16(); - } - - /* Compute A(gamma2) residual */ - IF( !scale_down ) - { - Residu3_fx( apond2, signal_ptr, res2, L_SUBFR, 1 ); - } - ELSE - { - Residu3_fx( apond2, signal_ptr, res2, L_SUBFR, 0 ); - Scale_sig( hPFstat->mem_stp, L_SYN_MEM, -1 ); - } - - /* Controls short term pst filter gain and compute parcor0 */ - calc_st_filt_local_fx( apond2, apond1, &parcor0, res2, hPFstat->mem_zero ); - - /* 1/A(gamma1) filtering, mem_stp is updated */ - resynth[0] = *( hPFstat->mem_stp + sub( L_SYN_MEM, 1 ) ); - move16(); - - E_UTIL_synthesis( 1, apond1, res2, &( resynth[1] ), L_SUBFR, hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - - IF( !scale_down ) - { - Copy( &( resynth[1] ) + L_SUBFR - L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM ); - } - ELSE - { - Copy_Scale_sig( &( resynth[1] ) + L_SUBFR - L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM, 1 ); - } - - /* Tilt filtering */ - Filt_mu_fx( resynth, sig_out, parcor0, L_SUBFR ); - IF( scale_down ) - { - Scale_sig( sig_out, L_SUBFR, 1 ); - } - - /* Gain control */ - scale_st_fx( signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR ); - - - return; -} -#endif -static void Dec_formant_postfilt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ - Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ - Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ +static void Dec_formant_postfilt_fx( + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ + Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ + Word16 *sig_out, /* o : postfiltered output */ + Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ + Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ ) { /* Local variables and arrays */ diff --git a/lib_dec/dec_ppp_fx.c b/lib_dec/dec_ppp_fx.c index 4849e147a..4b3f4f554 100644 --- a/lib_dec/dec_ppp_fx.c +++ b/lib_dec/dec_ppp_fx.c @@ -6,6 +6,7 @@ #include #include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ + /*===================================================================*/ /* FUNCTION : void decod_ppp_fx () */ /*-------------------------------------------------------------------*/ @@ -45,20 +46,20 @@ /*-------------------------------------------------------------------*/ /* CALLED FROM : RX */ /*===================================================================*/ + ivas_error decod_ppp_fx( - Decoder_State *st_fx, /* i/o: state structure */ - const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ - Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ - Word16 *exc_fx, /* i/o: current non-enhanced excitation */ - Word16 *exc2_fx, /* i/o: current enhanced excitation */ - Word16 bfi, /* i : bad frame indicator */ - Word16 *gain_buf, + Decoder_State *st_fx, /* i/o: state structure */ + const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ + Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ + Word16 *exc_fx, /* i/o: current non-enhanced excitation */ + Word16 *exc2_fx, /* i/o: current enhanced excitation */ + Word16 bfi, /* i : bad frame indicator */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ Word16 *voice_factors, /* o : voicing factors */ Word16 *bwe_exc_fx /* o : excitation for SWB TBE */ ) { Word16 k; - Word16 LPC_de_curr_fx[M + 1], p_Aq_curr_fx[M], p_Aq_old_fx[M + 1]; Word16 excQ_ppp_fx[L_FRAME], pitch_fx[NB_SUBFR], LPC_de_old_fx[M + 1]; ivas_error error; diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index c5b06724a..de3a1ff3f 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -254,16 +254,10 @@ void decod_tran_fx( tmp_idx_2 = idiv1616( i_subfr, L_SUBFR ); } -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); -#endif + st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*----------------------------------------------------------------* * Excitation enhancements (update of total excitation signal) diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index fcc2600a3..f1ba21979 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -25,96 +25,7 @@ static void gain_dec_gacelp_uv_fx( * Decode unvoiced (UC) frames *-------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ - Word16 *gain_buf ) -{ - Word16 gain_pit_fx; /* Quantized pitch gain */ - Word32 gain_code_fx; /* Quantized algebraic codeebook gain */ - Word16 gain_inov_fx; /* inovation gain */ - Word32 norm_gain_code_fx; /* normalized algebraic codeebook gain */ - Word16 voice_fac_fx; /* Voicing factor */ - Word16 code_fx[L_SUBFR]; /* algebraic codevector */ - Word16 i_subfr_fx; - const Word16 *p_Aq_fx; - Word16 *pt_pitch_fx; - - gain_pit_fx = 0; - move16(); - - test(); - IF( EQ_16( st_fx->last_ppp_mode_dec, 1 ) || EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) - { - /* SC_VBR - reset the decoder, to avoid memory not updated issue for this unrealistic case */ - CNG_reset_dec_fx( st_fx, pitch_buf_fx, voice_factors_fx ); - } - - p_Aq_fx = Aq_fx; - move16(); /*Q12*/ /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; - move16(); /* pointer to the pitch buffer */ - - FOR( i_subfr_fx = 0; i_subfr_fx < L_FRAME; i_subfr_fx += L_SUBFR ) - { - /*----------------------------------------------------------------* - * Unvoiced subframe processing - *----------------------------------------------------------------*/ - - gaus_dec_fx( st_fx, i_subfr_fx, code_fx, &norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, &gain_inov_fx, &st_fx->tilt_code_fx, - &voice_fac_fx, &gain_pit_fx, pt_pitch_fx, exc_fx, &gain_code_fx, exc2_fx, bwe_exc_fx, &( st_fx->Q_exc ), st_fx->Q_subfr ); - - *tmp_noise_fx = extract_h( norm_gain_code_fx ); /*Q16*/ - move16(); - - /*----------------------------------------------------------------* - * Excitation enhancements (update of total excitation signal) - *----------------------------------------------------------------*/ - - enhancer_fx( st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); - - Word16 tmp_idx = 0; - move16(); - IF( i_subfr_fx != 0 ) - { - tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); - } - voice_factors_fx[tmp_idx] = 0; - move16(); - - interp_code_5over2_fx( &exc_fx[i_subfr_fx], &bwe_exc_fx[( ( i_subfr_fx * 2 * HIBND_ACB_L_FAC ) >> 1 )], L_SUBFR ); - - p_Aq_fx += ( M + 1 ); - pt_pitch_fx++; - st_fx->tilt_code_dec_fx[tmp_idx] = st_fx->tilt_code_fx; - move16(); - } - - /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = gain_pit_fx; - move16(); - - set16_fx( gain_buf, 0, NB_SUBFR ); - - return; -} - -/*-------------------------------------------------------------------* - * decod_unvoiced() - * - * Decode unvoiced (UC) frames - *-------------------------------------------------------------------*/ -#endif -void decod_unvoiced_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ @@ -208,13 +119,11 @@ void decod_unvoiced_ivas_fx( move16(); /* update LP filtered gains for the case of frame erasures */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); } ELSE -#endif { lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); } @@ -250,6 +159,7 @@ void decod_unvoiced_ivas_fx( } // Scale_sig(code_fx, L_SUBFR, 3); //Q12 } + *tmp_noise_fx = extract_h( norm_gain_code_fx ); /*Q16*/ move16(); @@ -257,14 +167,12 @@ void decod_unvoiced_ivas_fx( * Excitation enhancements (update of total excitation signal) *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { enhancer_fx( st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); } ELSE -#endif { enhancer_ivas_fx( MODE1, st_fx->core_brate, uc_two_stage_flag, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx /*Q9/Q12?*/, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); @@ -276,12 +184,6 @@ void decod_unvoiced_ivas_fx( IF( i_subfr_fx != 0 ) { tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); -#ifdef REMOVE_EVS_DUPLICATES - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) - { - tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); - } -#endif } voice_factors_fx[tmp_idx] = 0; move16(); diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 090409b4c..fdd442bf6 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -332,11 +332,7 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ -#ifdef REMOVE_EVS_DUPLICATES - IF( ( error = acelp_core_dec_ivas_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -#else IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -957,15 +953,9 @@ ivas_error evs_dec_fx( } st_fx->lp_noise = hFdCngDec->lp_noise; /*Q9.23*/ move32(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - ApplyFdCng_fx( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); -#else -#ifdef REMOVE_EVS_DUPLICATES - ApplyFdCng_ivas_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); -#else - ApplyFdCng_fx( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); -#endif -#endif + + ApplyFdCng_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); + /* Generate additional comfort noise to mask potential coding artefacts */ test(); IF( EQ_16( st_fx->m_frame_type, ACTIVE_FRAME ) && st_fx->flag_cna ) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index d0fd178f2..7aaaeb161 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -555,573 +555,9 @@ void deleteFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec ) error */ -#ifndef REMOVE_EVS_DUPLICATES Word16 ApplyFdCng_fx( Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - Word16 *powerSpectrum, -#endif - Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer cldfbBufferScale*/ - Word32 **cldfbBufferImag, /* i/o: imaginary part of the CLDFB buffer cldfbBufferScale*/ - Word16 *cldfbBufferScale, /* o : pointer to the scalefactor for real and imaginary part of the CLDFB buffer */ - Decoder_State *st, - const Word16 concealWholeFrame, /* i : binary flag indicating frame loss Q0*/ - Word16 is_music /*Q0*/ ) -{ - Word16 j, k, nBins; - Word16 s, s1, s2, num, denom; - Word32 *cngNoiseLevel; - Word16 *cngNoiseLevel_exp; - Word32 L_tmp; - Word16 L_tmp_exp; - Word16 facTab[NPART]; - Word16 facTabExp[NPART]; - Word16 tmp_loop; - Word32 L_c; - Word16 lsp_cng[M]; - HANDLE_FD_CNG_DEC hFdCngDec; - HANDLE_FD_CNG_COM hFdCngCom; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; - move16(); - move16(); -#endif -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - int16_t L_frame, last_L_frame; - int32_t sr_core; - - PMT( "Fix point code missing for IVAS_CODE_CNG_FIX185_PLC_FADEOUT" ) - /* limit L_frame and core fs values for MDCT-Stereo modes which can have higher core sampling than 16kHz, but use a downsampled buffer */ - L_frame = min( st->L_frame, L_FRAME16k ); - last_L_frame = min( st->last_L_frame, L_FRAME16k ); - sr_core = min( st->sr_core, INT_FS_16k ); -#endif - - hFdCngDec = st->hFdCngDec; - hFdCngCom = hFdCngDec->hFdCngCom; - - - if ( EQ_16( hFdCngCom->frame_type_previous, ACTIVE_FRAME ) ) - { - hFdCngCom->inactive_frame_counter = 0; - move16(); - } - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - hFdCngDec->flag_dtx_mode = hFdCngDec->flag_dtx_mode || st->first_CNG; - test(); - move16(); - } - cngNoiseLevel = hFdCngCom->cngNoiseLevel; /*Q31 - hFdCngCom->cngNoiseLevelExp*/ - move32(); - cngNoiseLevel_exp = &hFdCngCom->cngNoiseLevelExp; - move16(); - nBins = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - - SWITCH( st->m_frame_type ) - { - case ACTIVE_FRAME: - - /************************** - * ACTIVE_FRAME at DECODER * - **************************/ - - hFdCngCom->inactive_frame_counter = 0; - move16(); - hFdCngCom->sid_frame_counter = 0; - move16(); - - /* set noise estimation inactive during concealment, as no update with noise generated by concealment should be performed. */ - /* set noise estimation inactive during concealment, no update with noise generated by concealment should be performed. */ - -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - if ( concealWholeFrame == 0 && - ( timeDomainInput == NULL || - ( *timeDomainInput( -FLT_MAX ) && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) < FLT_MAX && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && - ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD ) && - !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || - ( st->element_mode == IVAS_CPE_TD ) ) && - ( !st->BER_detect ) ) -#else - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( - ( concealWholeFrame == 0 ) && - ( LT_16( *timeDomainInput, MAXVAL_WORD16 ) ) && GT_16( *timeDomainInput, MINVAL_WORD16 ) && ( LT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MAXVAL_WORD16 ) ) && GT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MINVAL_WORD16 ) && ( ( ( hFdCngDec->flag_dtx_mode == 0 ) && ( st->VAD != 0 ) ) == 0 ) && ( ( ( st->cng_type == LP_CNG ) && ( hFdCngDec->flag_dtx_mode != 0 ) ) == 0 ) && ( is_music == 0 ) && ( st->BER_detect == 0 ) ) -#endif - { - /* Perform noise estimation at the decoder */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif - - /* Update the shaping parameters */ - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); - } - hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - move16(); - - - /* Update CNG levels */ - test(); - IF( hFdCngDec->flag_dtx_mode != 0 && EQ_16( st->cng_type, FD_CNG ) ) - { - /* This needs to be done only once per inactive phase */ - bandcombinepow( - hFdCngDec->bandNoiseShape, - hFdCngDec->bandNoiseShape_exp, - nBins, - hFdCngCom->part, - hFdCngCom->nFFTpart, - hFdCngCom->psize_inv, - hFdCngDec->partNoiseShape, - &hFdCngDec->partNoiseShape_exp ); - - - j = 0; - move16(); - s2 = -( WORD32_BITS - 1 ); - move16(); - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - assert( hFdCngDec->partNoiseShape[k] >= 0 ); - assert( hFdCngCom->sidNoiseEst[k] >= 0 ); - - /* add DELTA as it is done in FLC version, in order to avoid num > denom */ - facTab[k] = 0; - move16(); - IF( hFdCngDec->partNoiseShape[k] != 0 ) - { - s1 = norm_l( hFdCngCom->sidNoiseEst[k] ); - L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 ); /*Q31 - hFdCngCom->sidNoiseEstExp + s1*/ - L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - L_tmp = L_shr( L_tmp, 1 ); - s = add( L_tmp_exp, 1 ); - num = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - s1 = norm_l( hFdCngDec->partNoiseShape[k] ); - L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 ); /*Q31 - hFdCngDec->partNoiseShape_exp + s1*/ - L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - s = sub( s, L_tmp_exp ); - denom = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - facTab[k] = div_s( num, denom ); /*Q15 - s*/ - move16(); - facTabExp[k] = s; - move16(); - } - /* Set unique exponent, if mantissa is equal to zero */ - if ( facTab[k] == 0 ) - { - facTabExp[k] = -( WORD32_BITS - 1 ); - move16(); - } - s2 = s_max( s2, facTabExp[k] ); - } - - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - s = sub( facTabExp[k], s2 ); - s = s_max( s_min( s, WORD32_BITS - 1 ), -( WORD32_BITS - 1 ) ); - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - move32(); - } - } - - /* adapt scaling for rest of the buffer */ - IF( NE_16( s2, -( WORD32_BITS - 1 ) ) ) - { - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) - { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } - } - - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); - move16(); - } - } - ELSE - { - /* This sets the new CNG levels until a SID update overwrites it */ - test(); - test(); - test(); - IF( !( EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( EQ_16( st->element_mode, IVAS_CPE_TD ) && !hFdCngDec->flag_dtx_mode && !st->VAD ) ) - { - Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, nBins ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; - move16(); - } - } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( st->element_mode == IVAS_CPE_MDCT && timeDomainInput == NULL ) - { - st->hTcxDec->CngLevelBackgroundTrace_bfi = sqrtf( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / NORM_MDCT_FACTOR ); - } - else - { - st->hTcxDec->CngLevelBackgroundTrace_bfi = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); - } -#endif - /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs( L_c, 0, 0 ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ - L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - - L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ - - L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ - - st->cngTDLevel = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/ - st->cngTDLevel_e = L_tmp_exp; - move16(); - } - ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - IF( hFdCngCom->active_frame_counter > 0 ) - { - /* Perform noise estimation in active frames in the decoder for downward updates */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif - } - } - test(); - test(); - L_tmp = 0; - FOR( j = hFdCngCom->startBand; j < hFdCngCom->stopFFTbin; j++ ) - { - L_tmp = L_add( L_tmp, L_shr( cngNoiseLevel[j], 16 ) ); - } - L_tmp_exp = add( *cngNoiseLevel_exp, 16 ); - test(); - test(); - IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( GT_32( L_shl_o( L_tmp, L_tmp_exp, &Overflow ), 21474836 ) /*0.01f Q31*/ ) ) - { - /* update isf cng estimate for concealment. Do that during concealment, in order to avoid addition clean channel complexity*/ -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0 ); - E_LPC_a_lsp_conversion( hFdCngCom->A_cng, lsp_cng, st->lspold_cng, M ); - Copy( lsp_cng, st->lspold_cng, M ); /*Q15*/ - - lsp2lsf_fx( lsp_cng, st->lsf_cng, M, st->sr_core ); -#else - if ( st->element_mode == IVAS_CPE_MDCT && st->core != ACELP_CORE ) - { - float scf[SNS_NPTS]; - float scf_int[FDNS_NPTS]; - float whitenend_noise_shape[L_FRAME16k]; - int16_t inc, start_idx, stop_idx; - float *noiseLevelPtr; - - - inc = ( st->core > TCX_20 ) ? 2 : 1; - start_idx = hFdCngCom->startBand / inc; - stop_idx = L_frame / inc; - noiseLevelPtr = cngNoiseLevel; - - set_zero( whitenend_noise_shape, start_idx ); - for ( j = start_idx; j < stop_idx; j++, noiseLevelPtr += inc ) - { - whitenend_noise_shape[j] = *noiseLevelPtr; - } - if ( st->core == TCX_20_CORE ) - { - st->hTonalMDCTConc->psychParams = &st->hTonalMDCTConc->psychParamsTCX20; - } - else - { - st->hTonalMDCTConc->psychParams = &st->hTonalMDCTConc->psychParamsTCX10; - } - - sns_compute_scf( whitenend_noise_shape, st->hTonalMDCTConc->psychParams, L_frame, scf ); - sns_interpolate_scalefactors( scf_int, scf, ENC ); - sns_interpolate_scalefactors( st->hTonalMDCTConc->scaleFactorsBackground_flt, scf, DEC ); - sns_shape_spectrum( whitenend_noise_shape, st->hTonalMDCTConc->psychParams, scf_int, L_frame ); - - mvr2r( whitenend_noise_shape + start_idx, cngNoiseLevel, stop_idx - start_idx ); - wmops_sub_end(); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0.f ); - a2lsp_stab( hFdCngCom->A_cng, lsp_cng, st->lspold_cng ); - mvr2r( lsp_cng, st->lspold_cng, M ); - lsp2lsf( lsp_cng, st->lsf_cng, M, sr_core ); - } - -#endif - st->plcBackgroundNoiseUpdated = 1; - move16(); - } - BREAK; - - case SID_FRAME: - - hFdCngDec->flag_dtx_mode = 1; - move16(); - /* no break */ - - case ZERO_FRAME: - - test(); - IF( st != NULL && st->cng_type == LP_CNG ) - { - /* Perform noise estimation on inactive phase at the decoder */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif - /* Update the shaping parameters */ - - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); - } - hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - move16(); - /* This sets the new CNG levels until a SID update overwrites it */ - Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it Q31 - hFdCngDec->bandNoiseShape_exp*/ - *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; - move16(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - st->cngTDLevel = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); -#else - /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ - L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - - L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ - - L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ - - st->cngTDLevel = round_fx_o( Sqrt32( L_tmp, &L_tmp_exp ), &Overflow ); /*Q15 - L_tmp_exp*/ - move16(); - st->cngTDLevel_e = L_tmp_exp; - move16(); -#endif - BREAK; - } - hFdCngCom->inactive_frame_counter = add( hFdCngCom->inactive_frame_counter, 1 ); - move16(); - - /************************************* - * SID_FRAME or ZERO_FRAME at DECODER * - *************************************/ - - /* Detect first non-active frame */ - IF( EQ_16( hFdCngCom->inactive_frame_counter, 1 ) ) - { - /* Compute the fine spectral structure of the comfort noise shape using the decoder-side noise estimates */ - bandcombinepow( - hFdCngDec->bandNoiseShape, - hFdCngDec->bandNoiseShape_exp, - nBins, - hFdCngCom->part, - hFdCngCom->nFFTpart, - hFdCngCom->psize_inv, - hFdCngDec->partNoiseShape, - &hFdCngDec->partNoiseShape_exp ); - } - - IF( EQ_16( st->m_frame_type, SID_FRAME ) ) - { - IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) - { - /* At initialization, interpolate the bin/band-wise levels from the partition levels */ - scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); - *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; - move16(); - } - ELSE - { - if ( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - } - - /* Interpolate the CLDFB band levels from the SID (partition) levels */ - IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) - { - scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); - *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; - move16(); - } - - s2 = -( WORD32_BITS - 1 ); - move16(); - /* Shape the SID noise levels in each FFT bin */ - j = 0; - move16(); - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - assert( hFdCngDec->partNoiseShape[k] >= 0 ); - - /* add DELTA as it is done in FLC version, in order to avoid num > denom */ - facTab[k] = 0; - move16(); - IF( hFdCngDec->partNoiseShape[k] != 0 ) - { - s1 = norm_l( hFdCngCom->sidNoiseEst[k] ); - L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 ); /*Q31 - hFdCngCom->sidNoiseEstExp + s1*/ - L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( hFdCngCom->sidNoiseEst[k], hFdCngCom->sidNoiseEstExp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - L_tmp = L_shr( L_tmp, 1 ); - s = add( L_tmp_exp, 1 ); - num = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - s1 = norm_l( hFdCngDec->partNoiseShape[k] ); - L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 ); /*Q31 - hFdCngDec->partNoiseShape_exp + s1*/ - L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - s = sub( s, L_tmp_exp ); - denom = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - facTab[k] = div_s( num, denom ); /*Q15 - s*/ - move16(); - facTabExp[k] = s; - move16(); - } - /* Set unique exponent, if mantissa is equal to zero */ - if ( facTab[k] == 0 ) - { - facTabExp[k] = -( WORD32_BITS - 1 ); - move16(); - } - s2 = s_max( s2, facTabExp[k] ); - } - - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - s = sub( facTabExp[k], s2 ); - s = s_max( s_min( s, WORD32_BITS - 1 ), -( WORD32_BITS - 1 ) ); - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - move32(); - } - } - /* adapt scaling for rest of the buffer */ - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) - { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } - } - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); - move16(); - } - } - - IF( EQ_16( st->codec_mode, MODE2 ) ) - { - /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); - } - - BREAK; - - default: - return -1; - } - - - return 0; -} -#endif -Word16 ApplyFdCng_ivas_fx( - Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ - Word16 Q, Word32 *powerSpectrum, /*Q_power_spectrum*/ Word16 Q_power_spectrum, Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer cldfbBufferScale*/ @@ -1221,27 +657,22 @@ Word16 ApplyFdCng_ivas_fx( ( !st->BER_detect ) ) { /* Perform noise estimation at the decoder */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); } ELSE -#endif { perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } /* Update the shaping parameters */ test(); -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } - ELSE -#endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + ELSE IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1477,13 +908,11 @@ Word16 ApplyFdCng_ivas_fx( IF( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); } ELSE -#endif { perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } @@ -1544,44 +973,37 @@ Word16 ApplyFdCng_ivas_fx( IF( st != NULL && EQ_16( st->cng_type, LP_CNG ) ) { /* Perform noise estimation on inactive phase at the decoder */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); } ELSE -#endif { perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } /* Update the shaping parameters */ - test(); -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } - ELSE -#endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + ELSE IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; move16(); + /* This sets the new CNG levels until a SID update overwrites it */ Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it */ /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; move16(); } ELSE -#endif { Word16 shift1 = L_norm_arr( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); Word16 shift2 = L_norm_arr( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ) ); @@ -1662,16 +1084,15 @@ Word16 ApplyFdCng_ivas_fx( IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) { /* At initialization, interpolate the bin/band-wise levels from the partition levels */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); } ELSE -#endif { scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); } + *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } @@ -1684,13 +1105,11 @@ Word16 ApplyFdCng_ivas_fx( /* Interpolate the CLDFB band levels from the SID (partition) levels */ IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); } ELSE -#endif { scalebands_fx( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); } @@ -1757,7 +1176,6 @@ Word16 ApplyFdCng_ivas_fx( } } -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { /* adapt scaling for rest of the buffer */ @@ -1774,7 +1192,6 @@ Word16 ApplyFdCng_ivas_fx( move16(); } ELSE -#endif { Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); @@ -1863,13 +1280,11 @@ Word16 ApplyFdCng_ivas_fx( IF( EQ_16( st->codec_mode, MODE2 ) ) { /* Generate comfort noise during SID or zero frames */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); } ELSE -#endif { generate_comfort_noise_dec_ivas_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); } diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index 00eca187d..db325cd80 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -602,7 +602,6 @@ void gain_dec_mless_fx( /* _ None */ /*==================================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void gain_dec_lbr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ @@ -653,375 +652,6 @@ void gain_dec_lbr_fx( ctype = shl( sub( coder_type, 1 ), 1 ); - /*-----------------------------------------------------------------* - * calculate prediction of gcode - * search for the best codeword - *-----------------------------------------------------------------*/ - IF( i_subfr == 0 ) - { - b_fx = b_1sfr_fx; - move16(); - n_pred = 2; - move16(); - cdbk_fx = gp_gamma_1sfr_6b_fx; - SWITCH( nBits ) - { - case 8: - { - cdbk_fx = gp_gamma_1sfr_8b_fx; /* Q14/Q9*/ - BREAK; - } - case 7: - { - cdbk_fx = gp_gamma_1sfr_7b_fx; /* Q14/Q9*/ - BREAK; - } - case 6: - { - cdbk_fx = gp_gamma_1sfr_6b_fx; /* Q14/Q9*/ - BREAK; - } - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); - gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); - gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ - - e_tmp = norm_l( L_tmp2 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp2, e_tmp ) ); /*Q15*/ - e_tmp = sub( expg2, add( 1, e_tmp ) ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ - - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 160 ); /*Q13, 20 in Q3*/ - L_tmp = L_sub( L_tmp, L_tmp1 ); /*Q13*/ - - gcode0_fx = round_fx( L_shl( L_tmp, 11 ) ); /* Q8 */ - - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) - *-----------------------------------------------------------------*/ - - L_tmp = L_mult( gcode0_fx, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - /*index = (Word16)get_indice( st_fx,"gain", i_subfr, ACELP_CORE);move16();*/ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - - *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ - move16(); - - gc_mem[0] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[0] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, L_SUBFR ) || EQ_16( L_subfr, 2 * L_SUBFR ) ) - { - b_fx = b_2sfr_fx; /*Q12*/ - move16(); - n_pred = 4; - move16(); - - cdbk_fx = gp_gamma_1sfr_6b_fx; /*Q14/Q9 */ - SWITCH( nBits ) - { - case 7: - { - cdbk_fx = gp_gamma_2sfr_7b_fx; /* Q14/Q9*/ - BREAK; - } - case 6: - { - cdbk_fx = gp_gamma_2sfr_6b_fx; /* Q14/Q9*/ - BREAK; - } - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux_fx[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[3] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - - *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ - move16(); - - gc_mem[1] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[1] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - b_fx = b_3sfr_fx; - move16(); - n_pred = 6; - move16(); - - cdbk_fx = gp_gamma_3sfr_6b_fx; /*Q14/Q9 */ - - if ( EQ_16( nBits, 7 ) ) - { - cdbk_fx = gp_gamma_3sfr_7b_fx; /*Q14*/ - // PMT("verify if gp_gamma_3sfr_7b_fx is correct") - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux_fx[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[4] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - aux_fx[5] = shr( gp_mem[1], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); - move16(); - - *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ - move32(); - gc_mem[2] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[2] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) - { - b_fx = b_4sfr_fx; /*Q12*/ - n_pred = 8; - move16(); - - - cdbk_fx = gp_gamma_4sfr_6b_fx; /*Q14*/ -#ifdef IVAS_GAIN_MOD - IF( EQ_16( nBits, 7 ) ) - { - cdbk_fx = gp_gamma_4sfr_7b_fx; - PMT( "verify if gp_gamma_4sfr_7b_fx is correct" ) - } -#endif - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[4] = (float)log10(gc_mem[2]); - = log2(gc_mem[2])*log10(2);*/ - e_tmp = norm_l( gc_mem[2] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[2], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[5] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - aux_fx[6] = shr( gp_mem[1], 2 ); /*Q12*/ - move16(); - aux_fx[7] = shr( gp_mem[2], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ - move32(); - } - - /* *norm_gain_code = *gain_code / *gain_inov; */ - expg = sub( norm_s( *gain_inov_fx ), 1 ); - expg = s_max( expg, 0 ); - - tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); /*Q15*/ - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q16*/ - move32(); - - return; -} -#endif -void gain_dec_lbr_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - const Word16 i_subfr, /* i : subframe index */ - const Word16 *code_fx, /* i : algebraic excitation Q9 */ - Word16 *gain_pit_fx, /* o : quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ - const Word16 L_subfr /* i : subfr lenght */ -) -{ - Word16 index, nBits, n_pred, ctype; - Word16 gcode0_fx, aux_fx[10]; - Word32 L_tmp, L_tmp1, L_tmp2; - Word16 expg, expg2, e_tmp, exp_gcode0, f_tmp, frac, tmp_fx; - const Word16 *b_fx, *cdbk_fx = 0; - /* Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; - *gain_inov = 1.0f / (float)sqrt(Ecode); */ - Word16 shift_L_subfr; - shift_L_subfr = 6; - move16(); // for *cdbk_fx - move16(); - if ( GT_16( L_subfr, L_SUBFR ) ) - { - shift_L_subfr = add( shift_L_subfr, 1 ); - } - L_tmp = Dot_product12( code_fx, code_fx, L_subfr, &expg ); /*Q31 - expg*/ - expg = sub( expg, add( 18, shift_L_subfr ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - - expg2 = expg; - move16(); - L_tmp2 = L_tmp; /* sets to 'L_tmp' in 1 clock */ - move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ - - *gain_inov_fx = extract_h( L_shl_sat( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ - move16(); - - /*-----------------------------------------------------------------* - * select the codebook, size and number of bits - * set the gains searching range - *-----------------------------------------------------------------*/ - nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr, shift_L_subfr )]; - move16(); - - ctype = shl( sub( coder_type, 1 ), 1 ); - /*-----------------------------------------------------------------* * calculate prediction of gcode * search for the best codeword @@ -1583,24 +1213,28 @@ void lp_gain_updt_ivas_fx( } /*-------------------------------------------------* - * Gain_dec_gaus_vbr + * gain_dec_gaus_fx() * * Decode gains of purely unvoiced sounds *-------------------------------------------------*/ -Word32 gain_dec_gaus_fx( /* o : quantized codebook gain Q16 */ - Word16 index, /* i : quantization index */ - const Word16 bits, /* i : number of bits to quantize */ - const Word16 lowBound, /* i : lower bound of quantizer (dB) */ - const Word16 topBound, /* i : upper bound of quantizer (dB) */ - const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ + +/*! r: quantized codebook gain Q16 */ +Word32 gain_dec_gaus_fx( + Word16 index, /* i : quantization index */ + const Word16 bits, /* i : number of bits to quantize */ + const Word16 lowBound, /* i : lower bound of quantizer (dB) */ + const Word16 topBound, /* i : upper bound of quantizer (dB) */ + const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ ) { Word16 stepSize, gain, expg, frac, expi, tmp_igi; Word32 L_tmp, L_enr_q, L_gain; Word16 stepSize_Exp; + stepSize_Exp = 14; move16(); + /*------------------------------------------------------------------------------------------* * Quantize linearly the log E *------------------------------------------------------------------------------------------*/ diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index cf0fabc76..70639810c 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -23,7 +23,7 @@ /* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ /*--------------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx : decoder memory structure */ +/* Decoder_State *st_fx : decoder memory structure */ /* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ /* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /*--------------------------------------------------------------------------*/ @@ -31,439 +31,17 @@ /* _ None */ /*==========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void decod_audio_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf /*Q14*/ -) -{ - Word16 tmp_nb_bits_tot, pit_band_idx; - Word16 code[4 * L_SUBFR]; - Word16 Diff_len, nb_subfr, i; - Word16 nb_frame_flg; - Word16 Es_pred = 0; - Word16 Len, max_len; - Word16 gsc_attack_flag; - - Word16 low_pit; - Word16 last_bin; - Word16 nbits; - - Word16 exc_wo_nf[L_FRAME16k]; - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - - - /*---------------------------------------------------------------* - * Initialization - *---------------------------------------------------------------*/ - move16(); // corresponding to initialization of Es_pred - Diff_len = 0; - move16(); - - /* decode GSC attack flag (used to reduce possible pre-echo) */ - gsc_attack_flag = (Word16) get_next_indice_fx( st_fx, 1 ); /* Q0 */ - move16(); - - /* decode GSC SWB speech flag */ - test(); - IF( st_fx->coder_type != INACTIVE && GE_32( st_fx->total_brate, ACELP_13k20 ) ) - { - st_fx->GSC_noisy_speech = (Word16) get_next_indice_fx( st_fx, 1 ); /* Q0 */ - move16(); - } - - /* safety check in case of bit errors */ - test(); - test(); - IF( st_fx->GSC_noisy_speech && LT_16( st_fx->bwidth, SWB ) && st_fx->GSC_IVAS_mode == 0 ) - { - st_fx->BER_detect = 1; /* Q0 */ - move16(); - st_fx->GSC_noisy_speech = 0; /* Q0 */ - move16(); - } - - /* set bit-allocation */ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif - - /*---------------------------------------------------------------* - * Decode energy dynamics - *---------------------------------------------------------------*/ - - IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) ) - { - nb_subfr = NB_SUBFR; /* Q0 */ - move16(); - hGSCDec->cor_strong_limit = 0; - move16(); - hGSCDec->noise_lev = NOISE_LEVEL_SP3; /* Q0 */ - move16(); - } - ELSE - { - IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) - { - hGSCDec->noise_lev = add( (Word16) get_next_indice_fx( st_fx, 2 ), NOISE_LEVEL_SP2 ); /* Q0 */ - move16(); - } - ELSE - { - hGSCDec->noise_lev = add( (Word16) get_next_indice_fx( st_fx, 3 ), NOISE_LEVEL_SP0 ); /* Q0 */ - move16(); - } - - /*---------------------------------------------------------------* - * Decode number of subframes - *---------------------------------------------------------------*/ - - - hGSCDec->cor_strong_limit = 1; /* Q0 */ - move16(); - nb_subfr = SWNB_SUBFR; - move16(); - - IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) - { - nbits = 1; - move16(); - nb_frame_flg = (Word16) get_next_indice_fx( st_fx, nbits ); /* Q0 */ - move16(); - - IF( s_and( nb_frame_flg, 0x1 ) == 0 ) - { - nb_subfr = 2 * SWNB_SUBFR; /* Q0 */ - move16(); - hGSCDec->cor_strong_limit = 0; - move16(); - } - } - } - - /*---------------------------------------------------------------* - * Decode the last band where the adaptive (pitch) contribution is significant - *---------------------------------------------------------------*/ - - IF( LT_32( st_fx->core_brate, CFREQ_BITRATE ) ) - { - nbits = 3; /* Q0 */ - move16(); - test(); - if ( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type == INACTIVE ) - { - nbits = 1; /* Q0 */ - move16(); - } - } - ELSE - { - nbits = 4; /* Q0 */ - move16(); - } - test(); - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type != INACTIVE ) - { - pit_band_idx = 1; /* Q0 */ - move16(); - } - ELSE - { - pit_band_idx = (Word16) get_next_indice_fx( st_fx, nbits ); /* Q0 */ - move16(); - } - - IF( pit_band_idx != 0 ) - { - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) - { - pit_band_idx = 7 + BAND1k2; /* Q0 */ - move16(); /* At low rate, if pitch model is chosen, then for to be use on extented and constant frequency range */ - } - ELSE - { - pit_band_idx = add( pit_band_idx, BAND1k2 ); /* Q0 */ - } - - /* detect bit errors in the bitstream */ - IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ - { - pit_band_idx = 13; /* Q0 */ - move16(); - st_fx->BER_detect = 1; /* Q0 */ - move16(); - } - Diff_len = mfreq_loc_div_25[pit_band_idx]; /* Q0 */ - move16(); - } - hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; /* Q0 */ - move16(); - - - /*--------------------------------------------------------------------------------------* - * Decode adaptive (pitch) excitation contribution - * Reset unvaluable part of the adaptive (pitch) excitation contribution - *--------------------------------------------------------------------------------------*/ - IF( GT_16( pit_band_idx, BAND1k2 ) ) - { - /*---------------------------------------------------------------* - * Decode adaptive (pitch) excitation contribution - *---------------------------------------------------------------*/ - test(); - IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) && EQ_16( nb_subfr, NB_SUBFR ) ) - { - Word16 indice; - nbits = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( st_fx->core_brate, GENERIC, -1, -1 )]; /* Q0 */ - move16(); - if ( st_fx->element_mode > EVS_MONO ) - { - nbits = 5; - move16(); - } - - indice = get_next_indice_fx( st_fx, nbits ); /* Q0 */ - - Es_pred_dec_fx( &Es_pred, indice, nbits, 0 ); - } - - dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); - - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) - { - minimum_fx( pitch_buf, shr( st_fx->L_frame, 6 ), &low_pit ); - low_pit = shr( low_pit, 6 ); /*Q6 -> Q0 */ - - IF( LT_16( low_pit, 64 ) ) - { - pit_band_idx = 9 + BAND1k2; /* Q0 */ - move16(); - if ( st_fx->bwidth == NB ) - { - pit_band_idx = 7 + BAND1k2; /* Q0 */ - move16(); - } - } - ELSE IF( LT_16( low_pit, 128 ) ) - { - pit_band_idx = 5 + BAND1k2; /* Q0 */ - move16(); - } - ELSE - { - pit_band_idx = 3 + BAND1k2; /* Q0 */ - move16(); - } - - Diff_len = mfreq_loc_div_25[pit_band_idx]; /* Q0 */ - move16(); - hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; /* Q0 */ - move16(); - } - - /*---------------------------------------------------------------* - * DCT transform - *---------------------------------------------------------------*/ - edct_16fx( exc, dct_epit, st_fx->L_frame, 7, st_fx->element_mode ); - - /*---------------------------------------------------------------* - * Reset unvaluable part of the adaptive (pitch) excitation contribution - *---------------------------------------------------------------*/ - - max_len = sub( st_fx->L_frame, Diff_len ); /* Q0 */ - - if ( st_fx->bwidth == NB ) - { - max_len = sub( 160, Diff_len ); /* Q0 */ - } - - Len = 80; - move16(); - if ( LT_16( max_len, 80 ) ) - { - Len = max_len; /* Q0 */ - move16(); - } - - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) - { - FOR( i = 0; i < max_len; i++ ) - { - dct_epit[i + Diff_len] = 0; - move16(); - } - } - ELSE - { - FOR( i = 0; i < Len; i++ ) - { - dct_epit[i + Diff_len] = mult_r( dct_epit[i + Diff_len], sm_table_fx[i] ); /* Qx */ - move16(); - } - - FOR( ; i < max_len; i++ ) - { - dct_epit[i + Diff_len] = 0; - move16(); - } - } - // PMT("in the rare case of 4 subfr, bfi_pitch_fx might be wrong") - st_fx->bfi_pitch_fx = mean_fx( pitch_buf, nb_subfr ); /* Q6 */ - move16(); - st_fx->bfi_pitch_frame = st_fx->L_frame; /* Q0 */ - move16(); - - Diff_len = add( Diff_len, 1 ); /* Q0 */ - st_fx->bpf_off = 0; - move16(); - } - ELSE - { - /* No adaptive (pitch) excitation contribution */ - st_fx->bpf_off = 1; /* Q0 */ - move16(); - set16_fx( dct_epit, 0, st_fx->L_frame ); - - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - set16_fx( pitch_buf, L_SUBFR16k * 64, NB_SUBFR16k ); - } - ELSE - { - set16_fx( pitch_buf, L_SUBFR * 64, NB_SUBFR ); - } - - set16_fx( gain_buf, 0, NB_SUBFR16k ); - - st_fx->bfi_pitch_fx = L_SUBFR * 64; - move16(); - st_fx->bfi_pitch_frame = st_fx->L_frame; /* Q0 */ - move16(); - st_fx->lp_gainp_fx = 0; - move16(); - st_fx->lp_gainc_fx = 0; - move16(); - st_fx->tilt_code_fx = 0; - move16(); - pit_band_idx = 0; - move16(); - Diff_len = 0; - move16(); - } - - /*--------------------------------------------------------------------------------------* - * GSC decoder - *--------------------------------------------------------------------------------------*/ - - /* find the current total number of bits used */ - - tmp_nb_bits_tot = st_fx->next_bit_pos; /* Q0 */ - move16(); - - if ( st_fx->extl_brate > 0 ) - { - /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ - tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); /* Q0 */ - } - - test(); - if ( st_fx->coder_type == INACTIVE && LE_32( st_fx->core_brate, ACELP_9k60 ) ) - { - tmp_nb_bits_tot = add( tmp_nb_bits_tot, 5 ); /* Q0 */ - } - - gsc_dec_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, st_fx->Q_exc ); - /*--------------------------------------------------------------------------------------* - * iDCT transform - *--------------------------------------------------------------------------------------*/ - - edct_16fx( dct_epit, exc, st_fx->L_frame, 7, st_fx->element_mode ); - edct_16fx( exc_wo_nf, exc_wo_nf, st_fx->L_frame, 7, st_fx->element_mode ); - /*----------------------------------------------------------------------* - * Remove potential pre-echo in case an onset has been detected - *----------------------------------------------------------------------*/ - - pre_echo_att_fx( &hGSCDec->Last_frame_ener_fx, exc, gsc_attack_flag, st_fx->Q_exc, st_fx->last_coder_type, st_fx->L_frame ); - - /*--------------------------------------------------------------------------------------* - * Update BWE excitation - *--------------------------------------------------------------------------------------*/ - - IF( st_fx->hBWE_TD != NULL ) - { - set16_fx( voice_factors, 0, NB_SUBFR16k ); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - interp_code_4over2_fx( exc, bwe_exc, st_fx->L_frame ); - } - ELSE - { - interp_code_5over2_fx( exc, bwe_exc, L_FRAME ); - } - } - /*--------------------------------------------------------------------------------------* - * Updates - *--------------------------------------------------------------------------------------*/ - - Copy( exc, exc2, st_fx->L_frame ); /* Q_exc */ - Copy( exc_wo_nf, exc, st_fx->L_frame ); /* Q_exc */ - - /*--------------------------------------------------------------------------------------* - * Channel aware mode parameters - *--------------------------------------------------------------------------------------*/ - - set16_fx( st_fx->tilt_code_dec_fx, 0, NB_SUBFR16k ); - - return; -} - -/*=========================================================================*/ -/* FUNCTION : void decod_audio_ivas_fx(); */ -/*-------------------------------------------------------------------------*/ -/* PURPOSE : Decode audio (AC) frames */ -/*-------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16[]) Aq : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _(Word16) Q_exc :Q format of excitation */ -/*-------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) pitch_buf_fx : Word16 pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx : decoder memory structure */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==========================================================================*/ -#endif -void decod_audio_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf, /*Q14*/ + Decoder_State *st_fx, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag Q0*/ const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ @@ -525,7 +103,7 @@ void decod_audio_ivas_fx( } /* set bit-allocation */ - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); /*---------------------------------------------------------------* * Decode energy dynamics @@ -735,7 +313,7 @@ void decod_audio_ivas_fx( Es_pred_dec_fx( &Es_pred, indice, nbits, 0 ); } - dec_pit_exc_ivas_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -894,7 +472,7 @@ void decod_audio_ivas_fx( Word16 Q_exc_old = st_fx->Q_exc; move16(); - gsc_dec_ivas_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); + gsc_dec_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); IF( NE_16( Q_exc_old, st_fx->Q_exc ) ) { @@ -976,250 +554,17 @@ void decod_audio_ivas_fx( /* _None */ /*==========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void gsc_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ - Word16 Q_exc ) -{ - Word16 i, j, bit, nb_subbands, pvq_len; - Word16 bitallocation_band[MBANDS_GN_BITALLOC16k]; - Word16 bitallocation_exc[2]; - Word16 Ener_per_bd_iQ[MBANDS_GN_BITALLOC16k]; - Word16 max_ener_band[MBANDS_GN_BITALLOC16k]; - Word16 exc_diffQ[L_FRAME16k]; - Word16 bits_per_bands[MBANDS_GN_BITALLOC16k]; - Word16 concat_out[L_FRAME16k]; - Word16 inpulses_fx[NB_SFM]; - Word16 imaxpulse_fx[NB_SFM]; - Word16 mean_gain; - Word16 Mbands_gn = 16; - Word16 Qexc_diffQ = Q_PVQ_OUT; - Word32 L_tmp; - Word16 Q_tmp; - Word16 seed_init; - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - move16(); - move16(); - - move16(); // for Mbands_gn - move16(); // for Qexc_diffQ - set16_fx( inpulses_fx, 0, NB_SFM ); - set16_fx( imaxpulse_fx, 0, NB_SFM ); - - /*--------------------------------------------------------------------------------------* - * Initialization - *--------------------------------------------------------------------------------------*/ - bit = bits_used; - move16(); - - set16_fx( exc_diffQ, 0, st_fx->L_frame ); - - /*--------------------------------------------------------------------------------------* - * Gain decoding - *--------------------------------------------------------------------------------------*/ - - test(); - IF( st_fx->bfi || st_fx->BER_detect ) - { - /* copy old gain */ - Copy( hGSCDec->old_y_gain_fx, Ener_per_bd_iQ, Mbands_gn ); /* Q_old_gain */ - mean_gain = mult_r( st_fx->lp_gainc_fx, 3277 ); /*Q3*/ - FOR( i = 0; i < Mbands_gn; i++ ) - { - Ener_per_bd_iQ[i] = add( Ener_per_bd_iQ[i], shl( mean_gain, 9 ) ); /*Q12*/ - move16(); - } - - st_fx->lp_gainc_fx = mult_r( st_fx->lp_gainc_fx, 32112 ); /*Q3*/ - move16(); - } - ELSE - { - mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, st_fx->core_brate, hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q12 */ - - st_fx->lp_gainc_fx = mult_r( 640, mean_gain ); /*10 in Q6 x Q12 -> lp_gainc in Q3 */ - move16(); - } - - *last_bin = 0; - move16(); - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) - { - bitallocation_exc[0] = 0; - move16(); - bitallocation_exc[1] = 0; - move16(); - } - - set16_fx( bitallocation_band, 0, MBANDS_GN ); - - test(); - IF( ( EQ_16( st_fx->bfi, 1 ) ) || st_fx->BER_detect ) - { - /*--------------------------------------------------------------------------------------* - * Copy old spectrum - * reduce spectral dynamic - * save spectrum - *--------------------------------------------------------------------------------------*/ - - test(); - IF( EQ_16( st_fx->last_good, INACTIVE_CLAS ) || EQ_16( st_fx->Last_GSC_noisy_speech_flag, 1 ) ) - { - FOR( i = 0; i < st_fx->L_frame; i++ ) - { - L_tmp = L_shr( L_mult( Random( &hGSCDec->seed_tcx ), 26214 ), 5 ); /*Q10*/ - L_tmp = L_mac( L_tmp, hGSCDec->Last_GSC_spectrum_fx[i], 6554 ); /* Q10 */ - hGSCDec->Last_GSC_spectrum_fx[i] = round_fx( L_tmp ); /*Q10*/ - move16(); - } - } - - Copy( hGSCDec->Last_GSC_spectrum_fx, exc_diffQ, st_fx->L_frame ); /* Q10 */ - - FOR( i = 0; i < st_fx->L_frame; i++ ) - { - hGSCDec->Last_GSC_spectrum_fx[i] = mult_r( hGSCDec->Last_GSC_spectrum_fx[i], 24576 ); /*Q10*/ - move16(); - } - } - ELSE - { - /*--------------------------------------------------------------------------------------* - * PVQ decoder - *--------------------------------------------------------------------------------------*/ - - bands_and_bit_alloc_fx( hGSCDec->cor_strong_limit, hGSCDec->noise_lev, st_fx->core_brate, Diff_len, bit, &bit, Ener_per_bd_iQ, - max_ener_band, bits_per_bands, &nb_subbands, NULL, NULL, &pvq_len, coder_type, st_fx->bwidth, st_fx->GSC_noisy_speech, - st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); - - { - pvq_core_dec_fx( st_fx, gsc_sfm_start, gsc_sfm_end, gsc_sfm_size, concat_out, &Q_tmp, bit, nb_subbands, bits_per_bands, NULL, inpulses_fx, imaxpulse_fx, ACELP_CORE ); - Scale_sig( concat_out, gsc_sfm_end[nb_subbands - 1], sub( Q_PVQ_OUT, Q_tmp ) ); /* Q_PVQ_OUT */ - } - seed_init = 0; - move16(); - - /* Reorder Q bands */ - FOR( j = 0; j < nb_subbands; j++ ) - { - Copy( concat_out + shl( j, 4 ), exc_diffQ + shl( max_ener_band[j], 4 ), 16 ); /* Q_PVQ_OUT */ - - *last_bin = s_max( *last_bin, max_ener_band[j] ); /* Q0 */ - move16(); - - bitallocation_band[max_ener_band[j]] = 1; /* Q0 */ - move16(); - - seed_init = add( seed_init, inpulses_fx[j] ); /* Q0 */ - } - test(); - IF( NE_16( st_fx->last_coder_type, AUDIO ) /* First audio frame */ - && NE_16( st_fx->last_coder_type, UNVOICED ) ) /* last_coder_type == INACTIVE is overwritten in update_dec to UNVOICED */ - { - FOR( j = 0; j < nb_subbands * 16; j++ ) - { - IF( concat_out[j] > 0 ) - { - seed_init = extract_l( L_shl( seed_init, 3 ) ); /* Q0 */ - } - if ( concat_out[j] < 0 ) - { - seed_init = add( seed_init, 3 ); /* Q0 */ - move16(); - } - } - - hGSCDec->seed_tcx = seed_init; /* Q0 */ - move16(); - } - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) - { - if ( exc_diffQ[L_FRAME8k - 2] != 0 ) - { - bitallocation_exc[0] = 1; /* Q0 */ - move16(); - } - - if ( exc_diffQ[L_FRAME8k - 1] != 0 ) - { - bitallocation_exc[1] = 1; /* Q0 */ - move16(); - } - } - - Copy( exc_diffQ, hGSCDec->Last_GSC_spectrum_fx, st_fx->L_frame ); /* Q_PVQ_OUT */ - - /*--------------------------------------------------------------------------------------* - * Skip adaptive (pitch) contribution frequency band (no noise added over the time contribution) - * Find x pulses between 1.6-3.2kHz to code in the spectrum of the residual signal - * Gain is based on the inter-correlation gain between the pulses found and residual signal - *--------------------------------------------------------------------------------------*/ - - freq_dnw_scaling_fx( hGSCDec->cor_strong_limit, st_fx->coder_type, hGSCDec->noise_lev, st_fx->core_brate, exc_diffQ, Qexc_diffQ, st_fx->L_frame ); - } - - /*--------------------------------------------------------------------------------------* - * Estimate noise level - *--------------------------------------------------------------------------------------*/ - - highband_exc_dct_in_fx( st_fx->core_brate, mfreq_bindiv_loc, *last_bin, Diff_len, hGSCDec->noise_lev, pit_band_idx, exc_diffQ, - &hGSCDec->seed_tcx, Ener_per_bd_iQ, nb_subfr, exc_dct_in, st_fx->last_coder_type, bitallocation_band, lsf_new, - hGSCDec->last_exc_dct_in_fx, &hGSCDec->last_ener_fx, hGSCDec->last_bitallocation_band, bitallocation_exc, st_fx->bfi, coder_type, - st_fx->bwidth, exc_wo_nf, Qexc_diffQ, Q_exc, st_fx->GSC_noisy_speech, hGSCDec->lt_ener_per_band_fx, st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); - - exc_dct_in[0] = 0; - move16(); - - return; -} - -/*==========================================================================*/ -/* FUNCTION : void gsc_dec_ivas_fx () */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Generic audio signal decoder */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) pit_band_idx : bin position of the cut-off frequency Q0 */ -/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) bits_used : Number of bit used before frequency Q Q0 */ -/* _ (Word16) nb_subfr : Number of subframe considered Q0 */ -/* _ (Word16) Qexc : Q format of exc_dct_in */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx:Decoder State Structure */ -/* _ (Word16[]) exc_dct_in : dctof pitch-only excitation / total excitation Qexc*/ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _None */ -/*==========================================================================*/ -#endif -void gsc_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ + Decoder_State *st_fx, /* i/o: State structure */ + Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ const Word16 coder_type, /* i : coding type Q0*/ Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ + const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ Word16 *Q_exc ) { Word16 i, j, bit, nb_subbands, pvq_len; @@ -1310,13 +655,11 @@ void gsc_dec_ivas_fx( i--; } -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ } ELSE -#endif { mean_gain = gsc_gaindec_ivas_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ } diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 03f0e4b40..cfbc1581a 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -520,7 +520,7 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, add( M, 1 ), sub( norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ), 3 ) ); // Qx } - IF( NE_32( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = acelp_core_dec_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 10b8059b9..9c319489e 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2186,7 +2186,7 @@ void ivas_dirac_dec_render_sf_fx( move16(); - FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { @@ -2195,7 +2195,7 @@ void ivas_dirac_dec_render_sf_fx( } } - FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 890e5fc9e..89cb92a4d 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1097,8 +1097,8 @@ static void run_min_stats_fx( { arr_tmp = power_spec; } - ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, power_spec_q, NULL, NULL, NULL, st, st->bfi, 0 ); - /*=================================================*/ + + ApplyFdCng_fx( NULL, 0, arr_tmp, power_spec_q, NULL, NULL, NULL, st, st->bfi, 0 ); } /* restore VAD (see above) */ diff --git a/lib_dec/ivas_tcx_core_dec_fx.c b/lib_dec/ivas_tcx_core_dec_fx.c index aa5a379e8..0be01f7b8 100644 --- a/lib_dec/ivas_tcx_core_dec_fx.c +++ b/lib_dec/ivas_tcx_core_dec_fx.c @@ -875,11 +875,11 @@ void stereo_tcx_core_dec_fx( { Word16 buffer[L_FRAME16k]; lerp( signal_outFB_fx, buffer, st->L_frame, hTcxDec->L_frameTCX ); - ApplyFdCng_ivas_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } ELSE { - ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -915,7 +915,7 @@ void stereo_tcx_core_dec_fx( test(); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && st->idchan == 0 ) { - ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -923,6 +923,7 @@ void stereo_tcx_core_dec_fx( return; } + static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ diff --git a/lib_dec/ivas_td_low_rate_dec_fx.c b/lib_dec/ivas_td_low_rate_dec_fx.c index 3191a8b4a..8f09c1c7d 100644 --- a/lib_dec/ivas_td_low_rate_dec_fx.c +++ b/lib_dec/ivas_td_low_rate_dec_fx.c @@ -127,7 +127,7 @@ void tdm_low_rate_dec_fx( tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); /* Q0 */ } - gsc_dec_ivas_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); + gsc_dec_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); /*--------------------------------------------------------------------------------------* * iDCT transform @@ -193,14 +193,9 @@ void tdm_low_rate_dec_fx( * * Decode generic (GC), 2 subframes mode *---------------------------------------------------------------------*/ -/*---------------------------------------------------------------------* - * decod_gen_2sbfr_ivas_fx() - * - * Decode generic (GC), 2 subframes mode - *---------------------------------------------------------------------*/ -void decod_gen_2sbfr_ivas_fx( - Decoder_State *st, /* i/o: decoder static memory */ +void decod_gen_2sbfr_fx( + Decoder_State *st, /* i/o: decoder static memory */ const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ const Word16 *Aq, /* i : LP filter coefficient Q12*/ Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ @@ -263,7 +258,7 @@ void decod_gen_2sbfr_ivas_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch = pit_decode_ivas_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ + *pt_pitch = pit_decode_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ test(); test(); @@ -295,7 +290,7 @@ void decod_gen_2sbfr_ivas_fx( * Estimate spectrum tilt and voicing *--------------------------------------------------------------*/ - gain_dec_lbr_ivas_fx( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gc_mem, gp_mem, 2 * L_SUBFR ); + gain_dec_lbr_fx( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gc_mem, gp_mem, 2 * L_SUBFR ); st->tilt_code_fx = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, st->Q_exc, 2 * L_SUBFR, 0 ); /* Q15 */ move16(); @@ -312,10 +307,12 @@ void decod_gen_2sbfr_ivas_fx( Word16 gain_code16 = round_fx( L_shl( gain_code, st->Q_exc ) ); /*Q_exc*/ Acelp_dec_total_exc( exc, exc2, gain_code16, gain_pit, i_subfr, code, 2 * L_SUBFR ); + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, 2 * L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/], bwe_exc, 0, NULL, st->Q_exc, T0, T0_frac, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + prep_tbe_exc_fx( L_frame, 2 * L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/], bwe_exc, 0, NULL, st->Q_exc, T0, T0_frac, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/]; /* Q15 */ move16(); @@ -323,6 +320,7 @@ void decod_gen_2sbfr_ivas_fx( * Excitation enhancements (update of total excitation signal) * called twice because adapting it to double the subfr length would need lot of modifications *----------------------------------------------------------------*/ + enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code, exc2, gain_pit, &st->dm_fx, st->Q_exc ); enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code + L_SUBFR, exc2 + L_SUBFR, gain_pit, &st->dm_fx, st->Q_exc ); diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index 9b7f77c79..913543db8 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -8,9 +8,11 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ + static void dqlsf_CNG_fx( Decoder_State *st_fx, Word16 *lsf_q ); /*--------------------------------------------------------------------------------------* @@ -88,7 +90,6 @@ static void dqlsf_CNG_fx( /* _ (Word16*) lsp_new : LP filter coefficient Q15 */ /* _ (Word16*) lsp_mid : LP filter coefficient Q15 */ /*---------------------------------------------------------------------------*/ - /* _ (Word16[]) st_fx->lsf_adaptive_mean_fx : FEC - adaptive mean LSF */ /* vector for FEC Q(x2.56) */ /* _ (Word16[]) st_fx->mem_AR_fx : AR memory of LSF quantizer */ @@ -99,271 +100,16 @@ static void dqlsf_CNG_fx( /* _ None */ /*===========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void lsf_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ -) -{ - Word16 i; - Word16 no_param_lpc; - Word16 param_lpc[NPRM_LPC_NEW]; - Word32 L_tmp; - Word16 nBits = 0; - move16(); - Word16 tmp_old[M + 1], tmp_new[M + 1]; - Word16 enr_old = 0, enr_new = 0; - move16(); - move16(); - Word16 lsf_diff, coder_type; - - /* initialize */ - coder_type = st_fx->coder_type; - if ( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - coder_type = INACTIVE; /* Q0 */ - move16(); - } - test(); - if ( EQ_16( coder_type, AUDIO ) && st_fx->GSC_IVAS_mode > 0 ) - { - coder_type = GENERIC; /* Q0 */ - move16(); - } - no_param_lpc = 0; - nBits = 0; - move16(); - move16(); - - /* Find the number of bits for LSF quantization */ - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - nBits = LSF_BITS_CNG; /* Q0 */ - move16(); - } - ELSE - { - test(); - IF( st_fx->nelp_mode_dec == 0 && st_fx->ppp_mode_dec == 0 ) - { - nBits = st_fx->acelp_cfg.lsf_bits; /* Q0 */ - move16(); - } - ELSE IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) - { - IF( EQ_16( coder_type, UNVOICED ) ) - { - nBits = 30; /* Q0 */ - move16(); - if ( st_fx->bwidth == NB ) - { - nBits = 32; /* Q0 */ - move16(); - } - } - } - ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) - { - nBits = 26; /* Q0 */ - move16(); - } - } - - /* LSF de-quantization */ - lsf_end_dec_fx( st_fx, 0, coder_type, st_fx->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc, - tdm_lsfQ_PCh ); - - /* convert quantized LSFs to LSPs */ - - lsf2lsp_fx( lsf_new, lsp_new, M, st_fx->sr_core ); - /* set seed_acelp used in UC mode */ - test(); - IF( EQ_16( coder_type, UNVOICED ) && GT_16( st_fx->element_mode, EVS_MONO ) ) - { - st_fx->seed_acelp = 0; - move16(); - FOR( i = no_param_lpc - 1; i >= 0; i-- ) - { - /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ - st_fx->seed_acelp = extract_l( L_add( imult3216( 31821L /* Q0 */, add( shr( ( st_fx->seed_acelp ), 1 ), param_lpc[i] ) ), 13849L /* Q0 */ ) ); /* Q0 */ - move16(); - } - } - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* return if SID frame (conversion to A(z) done in the calling function) */ - return; - } - - /*-------------------------------------------------------------------------------------* - * FEC - update adaptive LSF mean vector - *-------------------------------------------------------------------------------------*/ - - FOR( i = 0; i < M; i++ ) - { - L_tmp = L_mult( lsf_new[i], 10922 ); /*Q(x2.56+16)*/ - L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi1_fx[i], 10922 ); /*Q(x2.56+16)*/ - L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi0_fx[i], 10922 ); /*Q(x2.56+16)*/ - st_fx->lsf_adaptive_mean_fx[i] = round_fx( L_tmp ); /*Q(x2.56)*/ - move16(); - } - - test(); - test(); - IF( ( st_fx->prev_bfi && ( EQ_16( coder_type, TRANSITION ) ) && ( EQ_16( tc_subfr, sub( st_fx->L_frame, L_SUBFR ) ) ) ) ) - { - lsf_diff = 1205; - move16(); /*int_fs / (float)(2*(M+1)); = 470.588 -> 1205 in Q2.56 */ - if ( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - lsf_diff = 964; - move16(); /*int_fs / (float)(2*(M+1)); = 376.47 -> 964 in Q2.56 */ - } - st_fx->lsf_old_fx[0] = lsf_diff; - move16(); - - FOR( i = 1; i < M; i++ ) - { - st_fx->lsf_old_fx[i] = add( st_fx->lsf_old_fx[i - 1], lsf_diff ); /* Q2.56 */ - move16(); - } - lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, st_fx->sr_core ); - } - /*-------------------------------------------------------------------------------------* - * Mid-frame LSF decoding - * LSP interpolation and conversion of LSPs to A(z) - *-------------------------------------------------------------------------------------*/ - IF( st_fx->rate_switching_reset ) - { - /*extrapolation in case of unstable LSF convert*/ - Copy( lsp_new, st_fx->lsp_old_fx, M ); /* Q15 */ - Copy( lsf_new, st_fx->lsf_old_fx, M ); /* Q2.56 */ - } - { - /* Mid-frame LSF decoding */ - lsf_mid_dec_fx( st_fx, lsp_new, coder_type, lsp_mid ); - } - test(); - test(); - IF( !( st_fx->prev_bfi && ( EQ_16( coder_type, TRANSITION ) ) && ( EQ_16( tc_subfr, sub( st_fx->L_frame, L_SUBFR ) ) ) ) ) - { - IF( st_fx->prev_bfi ) - { - /* check, if LSP interpolation can be relaxed */ - E_LPC_f_lsp_a_conversion( st_fx->lsp_old_fx, tmp_old, M ); - enr_old = Enr_1_Az_fx( tmp_old, 2 * L_SUBFR ); /* Q3 */ - - E_LPC_f_lsp_a_conversion( lsp_new, tmp_new, M ); - enr_new = Enr_1_Az_fx( tmp_new, 2 * L_SUBFR ); /* Q3 */ - - IF( LT_16( enr_new, mult_r( 9830 /*0.3 Q15*/, enr_old ) ) ) - { - /* OLD CODE : if( st->safety_net == 1), replaced with a decision similar to MODE2 */ - st_fx->relax_prev_lsf_interp = -1; - move16(); - test(); - test(); - test(); - test(); - if ( st_fx->clas_dec == UNVOICED_CLAS || EQ_16( st_fx->clas_dec, SIN_ONSET ) || st_fx->clas_dec == INACTIVE_CLAS || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) - { - st_fx->relax_prev_lsf_interp = 1; - move16(); - } - } - } - } - test(); - IF( EQ_16( st_fx->last_core, HQ_CORE ) && st_fx->core == ACELP_CORE ) - { - /* update old LSPs/LSFs in case of HQ->ACELP core switching */ - Copy( lsp_mid, st_fx->lsp_old_fx, M ); /* Q15 */ - lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core ); /* Q15 */ - } - test(); - IF( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( coder_type, UNVOICED ) ) - { - // PMT("To be verified") - IF( EQ_16( st_fx->active_cnt, 1 ) ) - { - Copy( lsp_mid, st_fx->lsp_old_fx, M ); /* Q15 */ - lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core ); /* Q15 */ - Copy( lsp_new, lsp_mid, M ); /* Q15 */ - } - - /* LSP interpolation and conversion of LSPs to A(z) - two-subframe mode */ - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, -2 ); - } - ELSE - { - /* LSP interpolation and conversion of LSPs to A(z) */ - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, st_fx->relax_prev_lsf_interp ); - } - /*------------------------------------------------------------------* - * Check LSF stability (distance between old LSFs and current LSFs) - *------------------------------------------------------------------*/ - - IF( st_fx->element_mode == EVS_MONO ) - { - st_fx->stab_fac_fx = lsf_stab_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); /*Q15*/ - move16(); - } - ELSE - { - st_fx->stab_fac_fx = lsf_stab_ivas_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); /* Q15 */ - move16(); - } - - return; -} - -/*===========================================================================*/ -/* FUNCTION : lsf_dec_ivas_fx() */ -/*---------------------------------------------------------------------------*/ -/* PURPOSE : LSF decoder */ -/*---------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16) bwidth : input signal bandwidth */ -/*---------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) Aq : LP filter coefficient Q12 */ -/* _ (Word16*) lsf_new : LP filter coefficient Q(x2.56) */ -/* _ (Word16*) lsp_new : LP filter coefficient Q15 */ -/* _ (Word16*) lsp_mid : LP filter coefficient Q15 */ -/*---------------------------------------------------------------------------*/ - -/* _ (Word16[]) st_fx->lsf_adaptive_mean_fx : FEC - adaptive mean LSF */ -/* vector for FEC Q(x2.56) */ -/* _ (Word16[]) st_fx->mem_AR_fx : AR memory of LSF quantizer */ -/* (past quantized LSFs without mean) Q(x2.56) */ -/* _ (Word16) st_fx->stab_fac_fx : LSF stability factor Q15 */ -/*---------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*===========================================================================*/ -#endif -void lsf_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + Decoder_State *st_fx, /* i/o: State structure */ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ + Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ + Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ) { Word16 i; diff --git a/lib_dec/pit_dec_fx.c b/lib_dec/pit_dec_fx.c index e8cebedbd..38ec41cb2 100644 --- a/lib_dec/pit_dec_fx.c +++ b/lib_dec/pit_dec_fx.c @@ -319,246 +319,22 @@ void Mode2_delta_pit_dec( /* _ (Word16 ) pitch : close loop integer pitch Q6 */ /*=======================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES -Word16 pit_decode_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr /* i : subframe length */ -) -{ - Word16 pitch; /*Q2*/ - Word16 pitch_index, nBits, pit_flag; - - pitch_index = 0; - move16(); - - /*----------------------------------------------------------------* - * Set pit_flag = 0 for every subframe with absolute pitch search - *----------------------------------------------------------------*/ - pit_flag = i_subfr; - move16(); - - if ( EQ_16( i_subfr, PIT_DECODE_2XL_SUBFR ) ) - { - pit_flag = 0; - move16(); - } - - /*-------------------------------------------------------* - * Retrieve the pitch index - *-------------------------------------------------------*/ - IF( !Opt_AMR_WB ) - { - /*----------------------------------------------------------------* - * pitch Q: Set limit_flag to 0 for restrained limits, and 1 for extended limits - *----------------------------------------------------------------*/ - test(); - test(); - IF( i_subfr == 0 ) - { - *limit_flag = 1; - move16(); - - if ( EQ_16( coder_type, VOICED ) ) - { - *limit_flag = 2; - move16(); /* double-extended limits */ - } - test(); - if ( EQ_16( coder_type, GENERIC ) && EQ_32( core_brate, ACELP_7k20 ) ) - { - *limit_flag = 0; - move16(); - } - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) && EQ_32( coder_type, GENERIC ) && LE_32( core_brate, ACELP_13k20 ) ) - { - if ( GT_16( *T0, shr( add( PIT_FR1_EXTEND_8b, PIT_MIN ), 1 ) ) ) - { - *limit_flag = 0; - move16(); - } - } - - /*-------------------------------------------------------* - * Retrieve the number of Q bits - *-------------------------------------------------------*/ - - nBits = 0; - move16(); - IF( NE_16( coder_type, AUDIO ) ) - { - /* find the number of bits */ - nBits = st_fx->acelp_cfg.pitch_bits[shr( i_subfr, 6 )]; - move16(); - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - } - - /*-------------------------------------------------------* - * Pitch decoding in AUDIO mode - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - IF( EQ_16( coder_type, AUDIO ) ) - { - test(); - if ( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 ) - { - pit_flag = L_SUBFR; - move16(); - } - if ( pit_flag == 0 ) - { - nBits = 10; - move16(); - } - if ( pit_flag != 0 ) - { - nBits = 6; - move16(); - } - - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - - test(); - test(); - IF( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 && GE_16( pitch_index, 32 ) ) /* safety check in case of bit errors */ - { - pitch_index = shr( pitch_index, 1 ); - st_fx->BER_detect = 1; - move16(); - } - - pit_Q_dec_fx( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE IF( EQ_16( coder_type, VOICED ) ) - { - /*-------------------------------------------------------* - * Pitch decoding in VOICED mode - * (ACELP@12k8 core only) - *-------------------------------------------------------*/ - if ( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - pit_flag = i_subfr; - move16(); - } - - pit_Q_dec_fx( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE - { - /*-------------------------------------------------------* - * Pitch decoding in GENERIC mode - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - IF( EQ_16( L_frame, L_FRAME ) ) - { - pit_Q_dec_fx( 0, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE - { - pit16k_Q_dec_fx( pitch_index, nBits, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - } - } - - /*-------------------------------------------------------* - * Pitch decoding in AMR-WB IO mode - *-------------------------------------------------------*/ - - ELSE - { - *limit_flag = 0; - move16(); - test(); - test(); - IF( i_subfr == 0 || ( EQ_16( i_subfr, 2 * L_SUBFR ) && EQ_32( core_brate, ACELP_8k85 ) ) ) - { - nBits = 8; - move16(); - } - ELSE - { - nBits = 5; - move16(); - } - IF( GT_32( core_brate, ACELP_8k85 ) ) - { - nBits = 6; - move16(); - test(); - if ( i_subfr == 0 || EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - nBits = 9; - move16(); - } - } - - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - - pit_Q_dec_fx( 1, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - - /*-------------------------------------------------------* - * Compute floating pitch output - *-------------------------------------------------------*/ - - pitch = shl( add( shl( *T0, 2 ), *T0_frac ), 4 ); /* save subframe pitch values Q6 */ - - return pitch; -} - -/*======================================================================*/ -/* FUNCTION : pit_decode_ivas_fx() */ -/*-----------------------------------------------------------------------*/ -/* PURPOSE : calculate pitch value */ -/* */ -/*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate : Core bitrate Q0 */ -/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ -/* _ (Word16) L_frame : length of the frame Q0 */ -/* _ (Word16) i_subfr : length of the frame Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) L_subfr : subframe length */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16 *) T0 : close loop integer pitch */ -/* _ (Word16 *) T0_frac : close loop fractional part of the pitch */ -/* _ (Word16 ) pitch : pitch value Q6 */ -/*-----------------------------------------------------------------------*/ -/* INPUT OUTPUT ARGUMENTS */ -/* _ (Word16 *) T0_min : delta search min for sf 2 & 4 */ -/* _ (Word16 *) T0_max : delta search max for sf 2 & 4 */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ (Word16 ) pitch : close loop integer pitch Q6 */ -/*=======================================================================*/ - -#endif -Word16 pit_decode_ivas_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ +/*! r: floating pitch value */ +Word16 pit_decode_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame, /* i : length of the frame */ + Word16 i_subfr, /* i : subframe index */ + const Word16 coder_type, /* i : coding type */ + Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + Word16 *T0, /* o : close loop integer pitch */ + Word16 *T0_frac, /* o : close loop fractional part of the pitch */ + Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ + Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ ) { Word16 pitch; /*Q2*/ diff --git a/lib_dec/post_dec_fx.c b/lib_dec/post_dec_fx.c index b5d56d8fb..cbcb225bc 100644 --- a/lib_dec/post_dec_fx.c +++ b/lib_dec/post_dec_fx.c @@ -139,21 +139,13 @@ void post_decoder( { st->hPFstat->on = 1; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#endif } ELSE { st->hPFstat->on = 0; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#endif } } @@ -176,10 +168,10 @@ void post_decoder( /* Update synth2 memory */ Copy( synth_buf2 + L_frame, hBPF->pst_old_syn_fx, NBPSF_PIT_MAX ); - return; } + void post_decoder_ivas_fx( Decoder_State *st, Word16 synth_buf[], // Q0 @@ -310,21 +302,13 @@ void post_decoder_ivas_fx( { st->hPFstat->on = 1; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#endif } ELSE { st->hPFstat->on = 0; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#endif } } diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index 4c3f7152c..ceba860a1 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -394,14 +394,10 @@ ivas_error acelp_core_enc_fx( test(); IF( !nelp_mode && !ppp_mode ) { -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, - tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, - tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, + tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, + tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } /*-----------------------------------------------------------------* @@ -464,19 +460,16 @@ ivas_error acelp_core_enc_fx( { tc_classif_enc_fx( Q_new, st_fx->L_frame, &tc_subfr_fx, &position, attack_flag, st_fx->pitch[0], res_fx ); -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#endif - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, - tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, + tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } /*---------------------------------------------------------------* * Calculation of prediction for scaled innovation energy * (for memory-less gain quantizer) *---------------------------------------------------------------*/ + IF( nb_bits > 0 ) { Es_pred_enc_fx( &Es_pred_fx, &indice, st_fx->L_frame, res_fx, st_fx->voicing_fx, nb_bits, 0, Q_new ); @@ -521,13 +514,9 @@ ivas_error acelp_core_enc_fx( lsp_mid_bck_fx, mCb1_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen_fx ); /* Configure ACELP bit allocation */ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#endif - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, - st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, + st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); /* redo LSF quantization */ lsf_enc_fx( st_fx, lsf_new_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, st_fx->Nb_ACELP_frames, tdm_low_rate_mode, st_fx->GSC_IVAS_mode, Q_new ); @@ -1185,7 +1174,7 @@ ivas_error acelp_core_enc_ivas_fx( test(); IF( !nelp_mode && !ppp_mode ) { - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*-----------------------------------------------------------------* @@ -1322,7 +1311,7 @@ ivas_error acelp_core_enc_ivas_fx( { tc_classif_enc_fx( Q_new, st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res_fx ); - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*---------------------------------------------------------------* @@ -1381,7 +1370,7 @@ ivas_error acelp_core_enc_ivas_fx( lsf_syn_mem_restore_ivas_fx( st, tilt_code_bck_fx, gc_threshold_bck_fx, clip_var_bck_fx, next_force_sf_bck, lsp_new, lsp_mid, clip_var_fx, mem_AR_fx, mem_MA_fx, lsp_new_bck_fx, lsp_mid_bck_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen ); /* Configure ACELP bit allocation */ - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); /* redo LSF quantization */ lsf_enc_ivas_fx( st, lsf_new_fx, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL, Q_new ); @@ -1390,6 +1379,7 @@ ivas_error acelp_core_enc_ivas_fx( calc_residu_fx( st, inp, res_fx, Aq ); st->hTdCngEnc->burst_ho_cnt = 0; move16(); + /* VOICED frames in SC-VBR */ encod_gen_voic_ivas_fx( st, inp, Aw, Aq, Es_pred_fx, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf, voice_factors_fx, bwe_exc_fx, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf_fx, 0, Q_new ); } diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 854f0ff67..52f5d4010 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -11,32 +11,17 @@ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*---------------------------------------------------------------------* * Local function prototypes *---------------------------------------------------------------------*/ -static void encod_gen_voic_core_switch_fx( Encoder_State *st_fx, - const Word16 L_frame_fx, - const Word16 inp_fx[], - const Word16 Aq_fx[], - const Word16 A_fx[], - const Word16 T_op[], - Word16 *exc_fx, - const Word32 core_bitrate_fx, - Word16 shift, - Word16 Q_new ); -static void encod_gen_voic_core_switch_ivas_fx( Encoder_State *st_fx, - const Word16 L_frame_fx, - const Word16 inp_fx[], - const Word16 Aq_fx[], - const Word16 A_fx[], - const Word16 T_op[], - Word16 *exc_fx, - const Word32 core_bitrate_fx, - Word16 shift, - Word16 Q_new ); +static void encod_gen_voic_core_switch_fx( Encoder_State *st_fx, const Word16 L_frame_fx, const Word16 inp_fx[], const Word16 Aq_fx[], const Word16 A_fx[], const Word16 T_op[], Word16 *exc_fx, const Word32 core_bitrate_fx, Word16 shift, Word16 Q_new ); + +static void encod_gen_voic_core_switch_ivas_fx( Encoder_State *st_fx, const Word16 L_frame_fx, const Word16 inp_fx[], const Word16 Aq_fx[], const Word16 A_fx[], const Word16 T_op[], Word16 *exc_fx, const Word32 core_bitrate_fx, Word16 shift, Word16 Q_new ); static void bwe_switch_enc_fx( Encoder_State *st_fx, const Word16 *new_speech ); + static void bwe_switch_enc_ivas_fx( Encoder_State *st_fx, const Word16 *new_speech ); static Word16 dotprod_satcont( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len, Word16 delta ); @@ -151,12 +136,8 @@ void acelp_core_switch_enc_fx( * Excitation encoding *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, -#else - config_acelp1( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, -#endif - GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, + GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); encod_gen_voic_core_switch_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); @@ -279,8 +260,8 @@ void acelp_core_switch_enc_ivas_fx( * Excitation encoding *----------------------------------------------------------------*/ - config_acelp1_IVAS( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, - GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, + GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); encod_gen_voic_core_switch_ivas_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); diff --git a/lib_enc/analy_lp_fx.c b/lib_enc/analy_lp_fx.c index 78a02eeec..9b6ff2108 100644 --- a/lib_enc/analy_lp_fx.c +++ b/lib_enc/analy_lp_fx.c @@ -3,17 +3,16 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -#include "rom_enc.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com_fx.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ +#include "rom_enc.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* - * analy_lp() + * analy_lp_fx() * * Perform LP analysis * @@ -23,26 +22,26 @@ * - find interpolated LSPs and convert back to A(z) for all subframes * - update LSPs for the next frame *-------------------------------------------------------------------*/ -void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ - Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif - const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ - Word16 Q_new, /*i: stores Q for speech*/ - Word16 *Q_r /*stores q for ener*/ ) + +void analy_lp_fx( + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ + Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 element_mode, /* i : element mode */ + const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ + Word16 Q_new, /* i : stores Q for speech */ + Word16 *Q_r /*stores q for ener*/ +) { Word16 r_h[M + 1]; /* Autocorrelations of windowed speech MSB */ Word16 r_l[M + 1]; /* Autocorrelations of windowed speech LSB */ @@ -77,9 +76,7 @@ void analy_lp_ivas_fx( /* Autocorrelations */ autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( element_mode, EVS_MONO ) ) -#endif { /*if ( r[0] < 100.0f && no_thr == 0 )*/ /*r[0] = 100.0f*/ @@ -132,101 +129,6 @@ void analy_lp_ivas_fx( return; } -#ifndef REMOVE_EVS_DUPLICATES -void analy_lp_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 L_look, /* i : look-ahead Q0*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 lsp_new[], /* o : current frame LSPs Q15*/ - Word16 lsp_mid[], /* o : current mid-frame LSPs Q15*/ - Word16 lsp_old[], /* i/o: previous frame unquantized LSPs Q15*/ - const Word16 Top[2], /* i : open loop pitch lag Q0*/ - const Word16 Tnc[2], /* i : open loop pitch gain Q15*/ - const Word32 Core_sr, /* i : Internal core sampling rate Q0*/ - const Word16 sec_chan_low_rate, /* i : flag to signal second channel Q0*/ - Word16 Q_new, - Word16 *Q_r ) -{ - Word16 r_h[M + 1]; /* Autocorrelations of windowed speech MSB */ - Word16 r_l[M + 1]; /* Autocorrelations of windowed speech LSB */ - Word32 LepsP[M + 1]; - Word16 i, i_subfr, wind_length = 0; - Word16 *lsp; - const Word16 *wind = NULL; - const Word16 *pt; - Word16 half_frame; - - IF( EQ_16( L_frame, L_FRAME ) ) - { - wind_length = L_LP; - move16(); - wind = Assym_window_W16fx; /* Q15 */ - } - ELSE /* L_frame == L_FRAME16k */ - { - wind_length = L_LP_16k; - move16(); - wind = assym_window_16k_fx; /* Q15 */ - } - lsp = lsp_mid; /* Q15 */ - half_frame = shr( L_frame, 1 ); - - FOR( i_subfr = 0; i_subfr <= 1; i_subfr++ ) - { - pt = speech + sub( add( half_frame, L_look ), wind_length ); - half_frame = shl( half_frame, 1 ); - - /* Autocorrelations */ - autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); - - /* Lag windowing */ - adapt_lag_wind( r_h, r_l, M, Top[i_subfr], Tnc[i_subfr], Core_sr ); - - /* Levinson-Durbin */ - E_LPC_lev_dur( r_h, r_l, A, LepsP, M, NULL ); - FOR( i = 0; i <= M; i++ ) - { - L_Extract( LepsP[i], &epsP_h[i], &epsP_l[i] ); - } - /*Q_r[... might not be needed from external...*/ - Q_r[1 - i_subfr] = add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ); - move16(); - - /* Conversion of A(z) to LSPs */ - E_LPC_a_lsp_conversion( A, lsp, lsp_old, M ); - - lsp = lsp_new; /* Q15 */ - } - IF( EQ_16( sec_chan_low_rate, 1 ) ) - { - /* LSP interpolation */ -#ifdef REMOVE_EVS_DUPLICATES - int_lsp4_ivas_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); -#else - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); -#endif - } - ELSE - { - /* LSP interpolation */ -#ifdef REMOVE_EVS_DUPLICATES - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); -#else - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); -#endif - } - Copy( lsp_new, lsp_old, M ); /* Q15 */ - *ener = L_Comp( epsP_h[M], epsP_l[M] ); /* Q_r */ - move32(); - - return; -} -#endif - /*-------------------------------------------------------------------* * analy_lp_AMR_WB() * diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index b5c18d44b..e1914aeb5 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -366,14 +366,9 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * IF( st->igf != 0 ) { -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate, - st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate ); -#endif + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate, + st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); } /*---------------------------------------------------------* diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index a60828a94..87bba1fae 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -363,20 +363,15 @@ void encod_gen_voic_fx( exc_fx[i + i_subfr_fx] = round_fx_o( Ltmp, &Overflow ); /* Q0 */ } } + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate ); -#endif + T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. @@ -405,9 +400,11 @@ void encod_gen_voic_fx( hSC_VBR->prev_tilt_code_fx = hLPDmem->tilt_code; /* Q15 */ move16(); } + return; } + void encod_gen_voic_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 speech_fx[], /* i : input speech Qnew -1 */ @@ -763,10 +760,10 @@ void encod_gen_voic_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, + T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 394b22c30..eba991f57 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -308,13 +308,8 @@ Word16 encod_tran_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); -#endif + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. @@ -717,9 +712,9 @@ Word16 encod_tran_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 67c4f256f..5f4a5dd60 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1150,12 +1150,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, *Q_new, Q_r ); -#else - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, - INT_FS_12k8, i, *Q_new, Q_r ); -#endif + analy_lp_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, *Q_new, Q_r ); FOR( Word16 idx = 0; idx < M + 1; idx++ ) { diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 6fe6b6720..4fcb9e1ec 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -1134,20 +1134,11 @@ ivas_error ivas_compute_core_buffers_fx( IF( Q_new ) { -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, sub( *Q_new, 1 ), Q_r ); -#else - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, sub( *Q_new, 1 ), Q_r ); -#endif + analy_lp_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, sub( *Q_new, 1 ), Q_r ); } ELSE { -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, -1, Q_r ); - -#else - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, -1, Q_r ); -#endif + analy_lp_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, -1, Q_r ); } /*--------------------------------------------------------------* diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index f3cf05e63..9e2e1402e 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -637,11 +637,7 @@ ivas_error front_vad_spar_fx( hFrontVad->q_buffer_12k8 = Q_inp_12k8; move16(); -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, st->element_mode, 0, Q_inp_12k8, Q_r ); -#else - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */, Q_inp_12k8, Q_r ); -#endif + analy_lp_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, st->element_mode, 0, Q_inp_12k8, Q_r ); FOR( Word16 i = 0; i <= M; i++ ) { diff --git a/lib_enc/ivas_td_low_rate_enc_fx.c b/lib_enc/ivas_td_low_rate_enc_fx.c index 77ddb35aa..d10527a24 100644 --- a/lib_enc/ivas_td_low_rate_enc_fx.c +++ b/lib_enc/ivas_td_low_rate_enc_fx.c @@ -365,11 +365,12 @@ void encod_gen_2sbfr( move16(); move16(); } + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q_new, T0, T0_frac, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q_new, T0, T0_frac, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR]; /* Q15 */ move16(); @@ -378,6 +379,7 @@ void encod_gen_2sbfr( * Synthesize speech to update mem_syn_flt[]. * Update A(z) filters *-----------------------------------------------------------------*/ + Syn_filt_s( 1, p_Aq, M, &exc[i_subfr], &syn[i_subfr], 2 * L_SUBFR, hLPDmem->mem_syn, 1 ); p_Aw += 2 * ( M + 1 ); p_Aq += 2 * ( M + 1 ); diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index 8fe425d74..b26532b15 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -289,13 +289,16 @@ void lsf_enc_fx( { int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, 0 ); } + /*------------------------------------------------------------------* * Check LSF stability (distance between old LSFs and current LSFs) *------------------------------------------------------------------*/ + IF( NE_32( st_fx->core_brate, SID_2k40 ) ) { st_fx->stab_fac_fx = lsf_stab_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); } + return; } @@ -1982,7 +1985,7 @@ static void first_VQstages( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ @@ -2172,7 +2175,7 @@ static void first_VQstages_ivas_fx( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index e8d4a0722..cc8b64ca4 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -213,7 +213,7 @@ void pre_proc_fx( /*----------------------------------------------------------------* * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ) ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, (const Word16) ( EQ_16( st->max_bwidth, NB ) ) ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* @@ -414,11 +414,7 @@ void pre_proc_fx( alw_voicing[1] = st->voicing_fx[2]; move16(); -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, EVS_MONO, 0, *Q_new, Q_r ); -#else - analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); -#endif + analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, EVS_MONO, 0, *Q_new, Q_r ); lsp2lsf_fx( lsp_new, lsf_new, M, INT_FS_12k8 ); stab_fac = lsf_stab_fx( lsf_new, st->lsf_old1_fx, 0, L_FRAME ); @@ -1131,11 +1127,7 @@ void pre_proc_fx( Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); } -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, EVS_MONO, 0, *Q_new, Q_r ); -#else - analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); -#endif + analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, EVS_MONO, 0, *Q_new, Q_r ); /*--------------------------------------------------------------* * Compute Weighted Input diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index d9389eb9c..9eb43c82b 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -41,9 +41,8 @@ #include "ivas_error_utils.h" #include "complex_basop.h" #include "ivas_stat_enc.h" -/*----------------------------------------------------------------------------------* - * Prototypes of RAM counting tool macros - *----------------------------------------------------------------------------------*/ + + ivas_error acelp_core_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 inp_fx[], /* i : input signal of the current frame Q_new*/ @@ -68,57 +67,37 @@ ivas_error acelp_core_enc_fx( ); -void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ - Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif - const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ - Word16 Q_new, /*i: stores Q for speech*/ - Word16 *Q_r /*stores q for ener*/ ); - -#ifndef REMOVE_EVS_DUPLICATES void analy_lp_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 L_look, /* i : look-ahead Q0*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 lsp_new[], /* o : current frame LSPs Q15*/ - Word16 lsp_mid[], /* o : current mid-frame LSPs Q15*/ - Word16 lsp_old[], /* i/o: previous frame unquantized LSPs Q15*/ - const Word16 Top[2], /* i : open loop pitch lag Q0*/ - const Word16 Tnc[2], /* i : open loop pitch gain Q15*/ - const Word32 Core_sr, /* i : Internal core sampling rate Q0*/ - const Word16 sec_chan_low_rate, /* i : flag to signal second channel Q0*/ - Word16 Q_new, - Word16 *Q_r ); -#endif - -void AVQ_cod_fx( /* o: comfort noise gain factor */ - const Word16 xri[], /* i: vector to quantize */ - Word16 xriq[], /* o: quantized normalized vector (assuming the bit budget is enough) */ - const Word16 NB_BITS, /* i: number of allocated bits */ - const Word16 Nsv, /* i: number of subvectors (lg=Nsv*8) */ - const Word16 Q_in_ref /* i: Scaling i */ + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ + Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 element_mode, /* i : element mode */ + const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ + Word16 Q_new, /* i : stores Q for speech */ + Word16 *Q_r /*stores q for ener*/ +); + +/*1 r: comfort noise gain factor */ +void AVQ_cod_fx( + const Word16 xri[], /* i: vector to quantize */ + Word16 xriq[], /* o: quantized normalized vector (assuming the bit budget is enough) */ + const Word16 NB_BITS, /* i: number of allocated bits */ + const Word16 Nsv, /* i: number of subvectors (lg=Nsv*8) */ + const Word16 Q_in_ref /* i: Scaling i */ ); void AVQ_encmux_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 extl, /* i : extension layer */ Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ @@ -130,7 +109,7 @@ void AVQ_encmux_fx( ); void AVQ_encmux_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 extl, /* i : extension layer */ Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ @@ -151,15 +130,15 @@ void bw_detect_fx( const Word16 mct_on, /* i : flag MCT mode */ const Word16 Q_spec ); -void core_switching_post_enc_fx( /*done */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 inp12k8[], /* i : i signal @12.8 kHz Qinp*/ - const Word16 inp16k[], /* i : i signal @16 kHz Qinp*/ - const Word16 A[], /* i : unquant. LP filter coefs. (Q12) */ - Word16 Qshift, - Word16 Q_new, - const Word16 Qsp, /* i/o : Q from acelp synthsis */ - Word16 *Qmus /* i/o : Q from mdct synthsis / Q of output synthesis */ +void core_switching_post_enc_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 inp12k8[], /* i : i signal @12.8 kHz Qinp*/ + const Word16 inp16k[], /* i : i signal @16 kHz Qinp*/ + const Word16 A[], /* i : unquant. LP filter coefs. (Q12) */ + Word16 Qshift, + Word16 Q_new, + const Word16 Qsp, /* i/o : Q from acelp synthsis */ + Word16 *Qmus /* i/o : Q from mdct synthsis / Q of output synthesis */ ); void core_switching_pre_enc_fx( @@ -170,8 +149,9 @@ void core_switching_pre_enc_fx( const Word16 last_element_mode /* i : last_element_mode Q0*/ ); -Word16 correlation_shift_fx( /* o : noise dependent voicing correction Q15 */ - const Word16 totalNoise_fx /* i/o: noise estimate over all critical bands Q8 */ +/*! r: noise dependent voicing correction Q15 */ +Word16 correlation_shift_fx( + const Word16 totalNoise_fx /* i/o: noise estimate over all critical bands Q8 */ ); void dtx_fx( diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 5e50cac15..e0dd32927 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -212,13 +212,9 @@ void transition_enc_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { /* this is called only to compute unused bits */ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, - st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, + st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, sub( shift_wsp, 1 ) ); @@ -328,13 +324,9 @@ void transition_enc_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, - unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, + unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } /*-----------------------------------------------------------------* @@ -1042,14 +1034,9 @@ void transition_enc_ivas_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { /* this is called only to compute unused bits */ - -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, - st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, + st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } @@ -1160,13 +1147,9 @@ void transition_enc_ivas_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, - unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, + unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } /*-----------------------------------------------------------------* -- GitLab From 1ecdfd6f7aecdf1da3655ac16fd8942d1f409f65 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 17 Apr 2025 15:52:49 +0200 Subject: [PATCH 0384/1310] rename file --- Workspace_msvc/lib_dec.vcxproj | 2 +- Workspace_msvc/lib_dec.vcxproj.filters | 6 +++--- ...celp_core_dec_ivas_fx.c => acelp_core_dec_fx.c} | 0 lib_dec/ivas_td_low_rate_dec_fx.c | 14 +++++++++++--- 4 files changed, 15 insertions(+), 7 deletions(-) rename lib_dec/{acelp_core_dec_ivas_fx.c => acelp_core_dec_fx.c} (100%) diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2839a5812..12f77b346 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -139,7 +139,7 @@ false - + diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index ebf15bd4c..25079058c 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -119,9 +119,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c @@ -515,6 +512,9 @@ decoder_ivas_c + + decoder_all_c + diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_fx.c similarity index 100% rename from lib_dec/acelp_core_dec_ivas_fx.c rename to lib_dec/acelp_core_dec_fx.c diff --git a/lib_dec/ivas_td_low_rate_dec_fx.c b/lib_dec/ivas_td_low_rate_dec_fx.c index 8f09c1c7d..6419f8517 100644 --- a/lib_dec/ivas_td_low_rate_dec_fx.c +++ b/lib_dec/ivas_td_low_rate_dec_fx.c @@ -40,6 +40,13 @@ #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" + +/*-------------------------------------------------------------------* + * tdm_low_rate_dec_fx() + * + * Low-bitrate decoder + *-------------------------------------------------------------------*/ + void tdm_low_rate_dec_fx( Decoder_State *st, /* i/o: decoder static memory */ Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ @@ -188,6 +195,7 @@ void tdm_low_rate_dec_fx( return; } + /*---------------------------------------------------------------------* * decod_gen_2sbfr() * @@ -217,12 +225,12 @@ void decod_gen_2sbfr_fx( move32(); Word16 gain_inov = 0; /* Innovation gain */ move16(); - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ + Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ + Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ Word16 voice_fac; /* voicing factor */ Word16 code[2 * L_SUBFR]; /* algebraic codevector */ const Word16 *p_Aq; /* Pointer to frame LP coefficient */ - Word16 *pt_pitch; /* pointer to Word16 pitch */ + Word16 *pt_pitch; /* pointer to Word16 pitch */ Word16 i_subfr; /* tmp variables */ Word16 L_frame; Word16 pitch_limit_flag; -- GitLab From 30d174cd2602b630f7ad4ea56061d8da79c6d5c5 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 17 Apr 2025 16:04:05 +0200 Subject: [PATCH 0385/1310] clang-format --- lib_enc/lsf_enc_fx.c | 4 ++-- lib_enc/pre_proc_fx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index b26532b15..23ed7d0c2 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -1985,7 +1985,7 @@ static void first_VQstages( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ @@ -2175,7 +2175,7 @@ static void first_VQstages_ivas_fx( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index cc8b64ca4..f7ebc8298 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -213,7 +213,7 @@ void pre_proc_fx( /*----------------------------------------------------------------* * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, (const Word16) ( EQ_16( st->max_bwidth, NB ) ) ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ) ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* -- GitLab From 03845cc8a08ec94c81328e1146630a7ed45e81eb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 21 Apr 2025 10:50:02 +0530 Subject: [PATCH 0386/1310] Removed the dependency of common exp for mdst_spectrum_fx and spectrum_fx, fb_tbe_enc exponent correction --- lib_com/ivas_prot_fx.h | 3 +- lib_enc/ivas_core_enc_fx.c | 2 +- lib_enc/ivas_mct_enc_mct_fx.c | 8 +- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 140 +++++++++++------------ lib_enc/ivas_stereo_mdct_stereo_enc_fx.c | 39 ++++--- lib_enc/prot_fx_enc.h | 5 +- lib_enc/swb_tbe_enc_fx.c | 7 +- 7 files changed, 103 insertions(+), 101 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 8da9cd9ac..17566e3cb 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2711,7 +2711,8 @@ void stereo_coder_tcx_fx( Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ - Word16 q_spec ); + Word16 exp_spec, + Word16 exp_mdst_spec ); // bw_detect_fx.c Word16 set_bw_mct_fx( diff --git a/lib_enc/ivas_core_enc_fx.c b/lib_enc/ivas_core_enc_fx.c index 066d105d5..f5d3c4d73 100644 --- a/lib_enc/ivas_core_enc_fx.c +++ b/lib_enc/ivas_core_enc_fx.c @@ -744,7 +744,7 @@ ivas_error ivas_core_enc_fx( IF( EQ_16( st->extl, FB_TBE ) ) { /* FB TBE encoder */ - fb_tbe_enc_ivas_fx( st, st->input_fx, fb_exc_fx, Q_fb_exc ); + fb_tbe_enc_ivas_fx( st, st->input_fx, fb_exc_fx, Q_fb_exc, st->q_inp ); } } } diff --git a/lib_enc/ivas_mct_enc_mct_fx.c b/lib_enc/ivas_mct_enc_mct_fx.c index 66bdb1235..aed6aefa4 100644 --- a/lib_enc/ivas_mct_enc_mct_fx.c +++ b/lib_enc/ivas_mct_enc_mct_fx.c @@ -385,7 +385,7 @@ static void getBlockValues_fx( p_st[0] = sts[ch1]; p_st[1] = sts[ch2]; - stereo_coder_tcx_fx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1, q_spec ); + stereo_coder_tcx_fx( hBlock->hStereoMdct, p_st, hBlock->mask, p_mdst_spectrum, p_inv_spectrum, p_inv_mdst_spectrum, 1, sub( 31, q_spec ), sub( 31, q_spec ) ); test(); test(); @@ -1073,6 +1073,7 @@ void mctStereoIGF_enc_fx( EQ_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], SMDCT_BW_MS ) ) { Word16 exp_powerSpec_tmp[CPE_CHANNELS]; + Word16 exp_p_inv_spectrum[CPE_CHANNELS]; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { s = s_min( s, sub( 31, p_st[ch]->hTcxEnc->spectrum_e[n] ) ); @@ -1097,10 +1098,13 @@ void mctStereoIGF_enc_fx( } exp_powerSpec_tmp[0] = p_st[0]->hTcxEnc->spectrum_e[0]; exp_powerSpec_tmp[1] = p_st[1]->hTcxEnc->spectrum_e[0]; + exp_p_inv_spectrum[0] = exp_p_inv_spectrum[1] = p_st[0]->hTcxEnc->spectrum_e[0]; + move16(); + move16(); move16(); move16(); ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, q_origSpec, q_origSpec, p_powerSpec_fx, exp_powerSpec_tmp, - p_powerSpecMsInv_fx, exp_powerSpec_tmp, p_inv_spectrum_fx, exp_powerSpec_tmp, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); + p_powerSpecMsInv_fx, exp_powerSpec_tmp, p_inv_spectrum_fx, exp_p_inv_spectrum, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); } ELSE { diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index 46134a270..39e77050b 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -152,8 +152,8 @@ void stereo_mdct_core_enc_fx( Word32 *p_mdst_spectrum_long_fx[CPE_CHANNELS]; Word32 mdst_spectrum_long_fx[CPE_CHANNELS][N_MAX]; Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV]; - Word16 exp_powSpecMsInv[MCT_MAX_CHANNELS], q_spec, tmp_s; - Word16 tmp_q_powSpecInv[N_MAX], *tmp_q_psi[2]; + Word16 exp_powSpecMsInv[MCT_MAX_CHANNELS]; + Word16 tmp_q_powSpecInv[N_MAX], *exp_powSpecInv[2]; Word64 W_tmp; Encoder_State *st, **sts; STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; @@ -188,8 +188,8 @@ void stereo_mdct_core_enc_fx( set16_fx( tmp_q_powSpecInv, 63, N_MAX ); - tmp_q_psi[0] = tmp_q_powSpecInv; - tmp_q_psi[1] = &tmp_q_powSpecInv[N_TCX10_MAX]; + exp_powSpecInv[0] = tmp_q_powSpecInv; + exp_powSpecInv[1] = &tmp_q_powSpecInv[N_TCX10_MAX]; sts = hCPE->hCoreCoder; hStereoMdct = hCPE->hStereoMdct; @@ -343,61 +343,59 @@ void stereo_mdct_core_enc_fx( IF( !hStereoMdct->isSBAStereoMode ) { /* Common q for mdst_spectrum and spectrum */ - Word16 k; - q_spec = 0; + Word16 exp1, exp2; Word16 length; - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) - { - q_spec = s_max( q_spec, sts[ch]->hTcxEnc->spectrum_e[k] ); - q_spec = s_max( q_spec, mdst_spectrum_e[ch][k] ); - } - } - q_spec = sub( Q31, q_spec ); /*find headroom to increase precision*/ - Word16 hdrm_min = MAX_16; + exp1 = MIN_16; + exp2 = MIN_16; + move16(); move16(); FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { length = sts[ch]->hTcxEnc->spectrum_length; move16(); - IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + if ( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { length = shr( length, 1 ); } - hdrm_min = s_min( hdrm_min, L_norm_arr( sts[ch]->hTcxEnc->spectrum_fx[0], length ) ); - hdrm_min = s_min( hdrm_min, L_norm_arr( mdst_spectrum_fx[ch][0], length ) ); + exp1 = s_max( exp1, sub( sts[ch]->hTcxEnc->spectrum_e[0], L_norm_arr( sts[ch]->hTcxEnc->spectrum_fx[0], length ) ) ); + exp2 = s_max( exp2, sub( mdst_spectrum_e[ch][0], L_norm_arr( mdst_spectrum_fx[ch][0], length ) ) ); IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { - hdrm_min = s_min( hdrm_min, L_norm_arr( sts[ch]->hTcxEnc->spectrum_fx[1], length ) ); - hdrm_min = s_min( hdrm_min, L_norm_arr( mdst_spectrum_fx[ch][1], length ) ); + exp1 = s_max( exp1, sub( sts[ch]->hTcxEnc->spectrum_e[1], L_norm_arr( sts[ch]->hTcxEnc->spectrum_fx[1], length ) ) ); + exp2 = s_max( exp2, sub( mdst_spectrum_e[ch][1], L_norm_arr( mdst_spectrum_fx[ch][1], length ) ) ); } } - q_spec = sub( add( hdrm_min, q_spec ), 1 ); /* 1 guard bit to avoid over-flows in stereo_coder_tcx_fx */ + exp1 = add( exp1, 1 ); /* 1 guard bit to avoid over-flows in stereo_coder_tcx_fx */ + exp2 = add( exp2, 1 ); /* 1 guard bit to avoid over-flows in stereo_coder_tcx_fx */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { length = sts[ch]->hTcxEnc->spectrum_length; move16(); - IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) + if ( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { length = shr( length, 1 ); } - FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) + + scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[0], length, sub( sts[ch]->hTcxEnc->spectrum_e[0], exp1 ) ); /* exp1 */ + sts[ch]->hTcxEnc->spectrum_e[0] = exp1; + scale_sig32( mdst_spectrum_fx[ch][0], length, sub( mdst_spectrum_e[ch][0], exp2 ) ); /* exp2 */ + mdst_spectrum_e[ch][0] = exp2; + IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { - Scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[k], length, sub( q_spec, sub( Q31, sts[ch]->hTcxEnc->spectrum_e[k] ) ) ); /* q_spec */ - sts[ch]->hTcxEnc->spectrum_e[k] = sub( Q31, q_spec ); - Scale_sig32( mdst_spectrum_fx[ch][k], length, sub( q_spec, sub( Q31, mdst_spectrum_e[ch][k] ) ) ); /* q_spec */ - mdst_spectrum_e[ch][k] = sub( Q31, q_spec ); + scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[1], length, sub( sts[ch]->hTcxEnc->spectrum_e[1], exp1 ) ); /* exp1 */ + sts[ch]->hTcxEnc->spectrum_e[1] = exp1; + scale_sig32( mdst_spectrum_fx[ch][1], length, sub( mdst_spectrum_e[ch][1], exp2 ) ); /* exp2 */ + mdst_spectrum_e[ch][1] = exp2; } } - stereo_coder_tcx_fx( hStereoMdct, sts, ms_mask, mdst_spectrum_fx, inv_spectrum_fx, inv_mdst_spectrum_fx, 0, q_spec ); - exp_inv_spectrum[0] = exp_inv_spectrum[1] = sub( Q31, q_spec ); + stereo_coder_tcx_fx( hStereoMdct, sts, ms_mask, mdst_spectrum_fx, inv_spectrum_fx, inv_mdst_spectrum_fx, 0, sts[0]->hTcxEnc->spectrum_e[0], mdst_spectrum_e[0][0] ); + exp_inv_spectrum[0] = exp_inv_spectrum[1] = sts[0]->hTcxEnc->spectrum_e[0]; move16(); move16(); } @@ -406,10 +404,13 @@ void stereo_mdct_core_enc_fx( * Power spectrum calculation *---------------------------------------------------------------*/ Word16 length, exp, shift1, shift2, norm; - Word32 mdct, mdst; + Word32 mdct, mdst, imdct, imdst; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { + L_subframeTCX = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); /* Q0 */ + nSubframes = NB_DIV; + move16(); IF( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) ) { nSubframes = 1; @@ -417,12 +418,6 @@ void stereo_mdct_core_enc_fx( move16(); move16(); } - ELSE - { - nSubframes = NB_DIV; - move16(); - L_subframeTCX = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 ); /* Q0 */ - } /* in MCT only relevant for bitrate switching from non-MCT bitrates */ IF( EQ_16( sts[ch]->last_core, ACELP_CORE ) ) @@ -432,8 +427,6 @@ void stereo_mdct_core_enc_fx( FOR( n = 0; n < nSubframes; n++ ) { - q_spec = sub( 31, sts[ch]->hTcxEnc->spectrum_e[n] ); - IF( sts[ch]->hTcxEnc->tns_ms_flag[n] ) { exp = add( s_max( mdst_spectrum_e[ch][n], sts[ch]->hTcxEnc->spectrum_e[n] ), 1 ); @@ -443,16 +436,18 @@ void stereo_mdct_core_enc_fx( /* power spectrum: MDCT^2 + MDST^2 */ FOR( i = 0; i < L_subframeTCX; i++ ) { - W_tmp = W_mac_32_32( W_mult_32_32( inv_mdst_spectrum_fx[ch][n][i], inv_mdst_spectrum_fx[ch][n][i] ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + mdst = L_shl( mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp + mdct = L_shl( sts[ch]->hTcxEnc->spectrum_fx[n][i], shift2 ); // exp: exp + imdst = L_shl( inv_mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp + imdct = L_shl( inv_spectrum_fx[ch][n][i], shift2 ); // exp: exp + + W_tmp = W_mac_32_32( W_mult_32_32( imdct, imdct ), imdst, imdst ); // exp: 2*exp + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*exp-norm + exp_powSpecInv[n][i] = sub( shl( exp, 1 ), norm ); move32(); move16(); - mdst = L_shl( mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp - mdct = L_shl( sts[ch]->hTcxEnc->spectrum_fx[n][i], shift2 ); // exp: exp powerSpec64[ch][i + n * L_subframeTCX] = W_mac_32_32( W_mult_32_32( mdct, mdct ), mdst, mdst ); // exp: 2*exp move64(); } @@ -464,32 +459,28 @@ void stereo_mdct_core_enc_fx( IF( NE_16( hStereoMdct->mdct_stereo_mode[n], SMDCT_DUAL_MONO ) ) { /* power spectrum: MDCT^2 + MDST^2 */ - W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][0], inv_spectrum_fx[ch][n][0] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][0], inv_spectrum_fx[ch][n][0] ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n] + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n]-norm + exp_powSpecInv[n][0] = sub( shl( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), norm ); move32(); move16(); FOR( i = 1; i < L_subframeTCX - 1; i++ ) { - Word32 mdst_fx = L_sub( inv_spectrum_fx[ch][n][i + 1], inv_spectrum_fx[ch][n][i - 1] ); /* An MDST estimate q_spec*/ - - W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + Word32 mdst_fx = L_sub( inv_spectrum_fx[ch][n][i + 1], inv_spectrum_fx[ch][n][i - 1] ); // exp: sts[ch]->hTcxEnc->spectrum_e[n] + W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n] + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n]-norm + exp_powSpecInv[n][i] = sub( shl( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), norm ); move32(); move16(); } - W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][L_subframeTCX - 1], inv_spectrum_fx[ch][n][L_subframeTCX - 1] ); /* 2*q_spec+1 */ - tmp_s = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, tmp_s ); /* 2*q_spec+1+tmp_s */ - powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_tmp ); /* 2*q_spec+1+tmp_s-32 */ - tmp_q_psi[n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][L_subframeTCX - 1], inv_spectrum_fx[ch][n][L_subframeTCX - 1] ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n] + norm = W_norm( W_tmp ); + powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n]-norm + exp_powSpecInv[n][L_subframeTCX - 1] = sub( shl( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), norm ); move32(); move16(); } @@ -517,30 +508,31 @@ void stereo_mdct_core_enc_fx( } /* Aligning the Q-factors */ + exp = MIN_16; + move16(); + FOR( n = 0; n < nSubframes; n++ ) { - Word16 q_temp = Q31; - move16(); - FOR( n = 0; n < nSubframes; n++ ) + FOR( i = 0; i < L_subframeTCX; i++ ) { - FOR( i = 0; i < L_subframeTCX; i++ ) + if ( powerSpecMsInv_fx[ch][n][i] != 0 ) { - if ( powerSpecMsInv_fx[ch][n][i] != 0 ) - { - q_temp = s_min( q_temp, tmp_q_psi[n][i] ); - } + exp = s_max( exp, exp_powSpecInv[n][i] ); } } + } + IF( NE_16( exp, MIN_16 ) ) + { FOR( n = 0; n < nSubframes; n++ ) { FOR( i = 0; i < L_subframeTCX; i++ ) { - powerSpecMsInv_fx[ch][n][i] = L_shr_sat( powerSpecMsInv_fx[ch][n][i], sub( tmp_q_psi[n][i], q_temp ) ); + powerSpecMsInv_fx[ch][n][i] = L_shl( powerSpecMsInv_fx[ch][n][i], sub( exp_powSpecInv[n][i], exp ) ); move32(); } } - exp_powSpecMsInv[ch] = sub( Q31, q_temp ); - move16(); } + exp_powSpecMsInv[ch] = exp; + move16(); } FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c index b1eae7862..2f1b7d6c8 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c @@ -190,7 +190,8 @@ void stereo_coder_tcx_fx( Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ // Q( q_spec ) (same as spectrum buffer in hTcxEnc) const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ - Word16 q_spec ) + Word16 exp_spec, + Word16 exp_mdct_spec ) { STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; Word32 nrgRatio_fx[CPE_CHANNELS]; @@ -255,8 +256,8 @@ void stereo_coder_tcx_fx( tmp = Inv16( extract_h( nrgRatio_fx[k] ), &e_tmp ); /* Q15-e_tmp */ tmp = shl( tmp, e_tmp ); /* Q15 */ - v_multc_fixed_16( sts[1]->hTcxEnc->spectrum_fx[k], tmp, sts[1]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* Q31-spectrum_e[k] */ - v_multc_fixed_16( mdst_spectrum_fx[1][k], tmp, mdst_spectrum_fx[1][k], L_frameTCX ); /* q_spec */ + v_multc_fixed_16( sts[1]->hTcxEnc->spectrum_fx[k], tmp, sts[1]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* exp: exp_spec */ + v_multc_fixed_16( mdst_spectrum_fx[1][k], tmp, mdst_spectrum_fx[1][k], L_frameTCX ); /* exp: exp_mdct_spec */ } ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( nrgRatio_fx[k], nrgRatio_e[k], ONE_IN_Q27, 4 ), -1 ) && LT_16( k, EQ_16( sts[0]->core, TCX_20_CORE ) ? 1 : NB_DIV ) ) { @@ -264,8 +265,8 @@ void stereo_coder_tcx_fx( L_frameTCX = idiv1616( L_frameTCX, ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV ); /* Q0 */ /* This operation is resulting in some high MLDs in fixed point. */ - v_multc_fixed_16( sts[0]->hTcxEnc->spectrum_fx[k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), sts[0]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* Q31-spectrum_e[k] */ - v_multc_fixed_16( mdst_spectrum_fx[0][k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), mdst_spectrum_fx[0][k], L_frameTCX ); /* q_spec */ + v_multc_fixed_16( sts[0]->hTcxEnc->spectrum_fx[k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), sts[0]->hTcxEnc->spectrum_fx[k], L_frameTCX ); /* exp: exp_spec */ + v_multc_fixed_16( mdst_spectrum_fx[0][k], extract_l( L_shr( nrgRatio_fx[k], 16 - nrgRatio_e[k] ) ), mdst_spectrum_fx[0][k], L_frameTCX ); /* exp: exp_mdct_spec */ } } } @@ -356,7 +357,7 @@ void stereo_coder_tcx_fx( move16(); const Word16 sfbWidth = sub( endLine, startLine ); - nrgRatio_e[0] = nrgRatio_e[1] = sub( Q31, q_spec ); + nrgRatio_e[0] = nrgRatio_e[1] = exp_spec; move16(); move16(); @@ -370,10 +371,12 @@ void stereo_coder_tcx_fx( { Word32 tmp_fx; Word16 tmp_e; - tmp_e = sub( Q31, q_spec ); + tmp_e = exp_mdct_spec; + move16(); tmp_fx = sum2_32_fx( &mdst_spectrum_fx[0][k][startLine], sfbWidth, &tmp_e ); /* Q31-tmp_e */ nrgRatio_fx[0] = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[0], nrgRatio_e[0], tmp_fx, tmp_e, &nrgRatio_e[0] ); /* Q31-nrgRatio_e[0] */ - tmp_e = sub( Q31, q_spec ); + tmp_e = exp_mdct_spec; + move16(); tmp_fx = sum2_32_fx( &mdst_spectrum_fx[1][k][startLine], sfbWidth, &tmp_e ); /* Q31-tmp_e */ nrgRatio_fx[1] = BASOP_Util_Add_Mant32Exp( nrgRatio_fx[1], nrgRatio_e[1], tmp_fx, tmp_e, &nrgRatio_e[1] ); /* Q31-nrgRatio_e[1] */ } @@ -426,15 +429,15 @@ void stereo_coder_tcx_fx( move32(); - v_multc_fixed( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[0], &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* q_spec+30-31 */ - v_multc_fixed( &mdst_spectrum_fx[0][k][startLine], nrgRatio_fx[0], &mdst_spectrum_fx[0][k][startLine], sfbWidth ); /* q_spec+30-31 */ - scale_sig32( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec - scale_sig32( &mdst_spectrum_fx[0][k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + v_multc_fixed( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[0], &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* exp: exp_spec+1 */ + v_multc_fixed( &mdst_spectrum_fx[0][k][startLine], nrgRatio_fx[0], &mdst_spectrum_fx[0][k][startLine], sfbWidth ); /* exp: exp_mdct_spec+1 */ + scale_sig32( &sts[0]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // exp: exp_spec + scale_sig32( &mdst_spectrum_fx[0][k][startLine], sfbWidth, Q1 ); // exp: exp_mdct_spec - v_multc_fixed( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[1], &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* q_spec+30-31 */ - v_multc_fixed( &mdst_spectrum_fx[1][k][startLine], nrgRatio_fx[1], &mdst_spectrum_fx[1][k][startLine], sfbWidth ); /* q_spec+30-31 */ - scale_sig32( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec - scale_sig32( &mdst_spectrum_fx[1][k][startLine], sfbWidth, Q1 ); // Scaling back to q_spec + v_multc_fixed( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], nrgRatio_fx[1], &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth ); /* exp: exp_spec+1 */ + v_multc_fixed( &mdst_spectrum_fx[1][k][startLine], nrgRatio_fx[1], &mdst_spectrum_fx[1][k][startLine], sfbWidth ); /* exp: exp_mdct_spec+1 */ + scale_sig32( &sts[1]->hTcxEnc->spectrum_fx[k][startLine], sfbWidth, Q1 ); // exp: exp_spec + scale_sig32( &mdst_spectrum_fx[1][k][startLine], sfbWidth, Q1 ); // exp: exp_mdct_spec } } } @@ -469,11 +472,11 @@ void stereo_coder_tcx_fx( nAvailBitsMS[k] = idiv1616( nAvailBitsMS[k], nSubframes ); /* Q0 */ move16(); - MsStereoDecision_fx( sfbConf, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], inv_spectrum_fx[0][k], inv_spectrum_fx[1][k], q_spec, &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); + MsStereoDecision_fx( sfbConf, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], inv_spectrum_fx[0][k], inv_spectrum_fx[1][k], sub( Q31, exp_spec ), &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); IF( sts[0]->igf ) { - IGFEncStereoEncoder_fx( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], q_spec, &ms_mask[k][0], + IGFEncStereoEncoder_fx( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum_fx[k], sts[1]->hTcxEnc->spectrum_fx[k], sub( Q31, exp_spec ), &ms_mask[k][0], &hStereoMdct->IGFStereoMode[k], hStereoMdct->mdct_stereo_mode[k], (Word16) EQ_16( sts[0]->core, TCX_20_CORE ), (Word16) EQ_16( sts[0]->last_core, ACELP_CORE ) ); } ELSE diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index d9389eb9c..73ec00cbd 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -216,9 +216,10 @@ void fb_tbe_enc_fx( void fb_tbe_enc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ - const Word16 new_input[], /* i : i speech at 48 kHz sample rate Q0*/ + const Word16 new_input[], /* i : i speech at 48 kHz sample rate Q_new_input*/ const Word16 fb_exc[], /* i : FB excitation from the SWB part Q_fb_exc*/ - Word16 Q_fb_exc ); + Word16 Q_fb_exc, + Word16 Q_new_input ); void fb_tbe_reset_enc_fx( Word32 elliptic_bpf_2_48k_mem_fx[][4], diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 316a5b549..633ede535 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7415,9 +7415,10 @@ void fb_tbe_enc_fx( void fb_tbe_enc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ - const Word16 new_input[], /* i : input speech at 48 kHz sample rate Q0 */ + const Word16 new_input[], /* i : input speech at 48 kHz sample rate Q_new_input */ const Word16 fb_exc[], /* i : FB excitation from the SWB part Q_fb_exc */ - Word16 Q_fb_exc ) + Word16 Q_fb_exc, + Word16 Q_new_input ) { Word16 ratio; Word16 tmp_vec[L_FRAME48k]; @@ -7446,7 +7447,7 @@ void fb_tbe_enc_ivas_fx( } Copy_Scale_sig( new_input - NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_fhb_new, L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), exp_temp ); - + exp_temp = add( exp_temp, Q_new_input ); IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -- GitLab From 85fb64b8f0899b9ad53b9f293bb315ec8bf055a5 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 21 Apr 2025 10:53:34 +0530 Subject: [PATCH 0387/1310] Clang formatting --- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index 39e77050b..aa762a77c 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -438,8 +438,8 @@ void stereo_mdct_core_enc_fx( { mdst = L_shl( mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp mdct = L_shl( sts[ch]->hTcxEnc->spectrum_fx[n][i], shift2 ); // exp: exp - imdst = L_shl( inv_mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp - imdct = L_shl( inv_spectrum_fx[ch][n][i], shift2 ); // exp: exp + imdst = L_shl( inv_mdst_spectrum_fx[ch][n][i], shift1 ); // exp: exp + imdct = L_shl( inv_spectrum_fx[ch][n][i], shift2 ); // exp: exp W_tmp = W_mac_32_32( W_mult_32_32( imdct, imdct ), imdst, imdst ); // exp: 2*exp norm = W_norm( W_tmp ); -- GitLab From 9d4b8adbad35b11b2440cbf1ad9aae2c7bf9f925 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 21 Apr 2025 12:04:36 +0530 Subject: [PATCH 0388/1310] Fix for 3GPP issue 1254: BASOP encoder OSBA 256 kbps: broken signal envelope Link #1254 --- lib_enc/ivas_mct_enc_mct_fx.c | 37 +++++++++-------------------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/lib_enc/ivas_mct_enc_mct_fx.c b/lib_enc/ivas_mct_enc_mct_fx.c index aed6aefa4..1a820ac96 100644 --- a/lib_enc/ivas_mct_enc_mct_fx.c +++ b/lib_enc/ivas_mct_enc_mct_fx.c @@ -997,7 +997,7 @@ void mctStereoIGF_enc_fx( Word32 *p_powerSpec_fx[NB_DIV]; Word16 b, nSubframes, L_subframeTCX; - Word16 p_ch[2], n, ch, ch1, ch2, s = 31; + Word16 p_ch[2], n, ch, ch1, ch2; Word16 q_pSI_ch[2]; Word16 q_pS_ch[2]; Encoder_State *p_st[NB_DIV]; @@ -1072,39 +1072,20 @@ void mctStereoIGF_enc_fx( IF( NE_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[n] ) || EQ_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], SMDCT_BW_MS ) ) { - Word16 exp_powerSpec_tmp[CPE_CHANNELS]; - Word16 exp_p_inv_spectrum[CPE_CHANNELS]; - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - s = s_min( s, sub( 31, p_st[ch]->hTcxEnc->spectrum_e[n] ) ); - s = s_min( s, q_pS_ch[ch] ); - s = s_min( s, q_pSI_ch[ch] ); - } + Word16 exp_powerSpec_fx[CPE_CHANNELS], exp_powerSpecMsInv_fx[CPE_CHANNELS], exp_inv_spectrum_fx[CPE_CHANNELS]; + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - scale_sig32( p_st[ch]->hTcxEnc->spectrum_fx[0], N_MAX, sub( s, sub( 31, p_st[ch]->hTcxEnc->spectrum_e[0] ) ) ); - scale_sig32( p_inv_spectrum_fx[ch][0], L_FRAME48k, sub( s, sub( 31, p_st[ch]->hTcxEnc->spectrum_e[0] ) ) ); - p_st[ch]->hTcxEnc->spectrum_e[0] = sub( 31, s ); - p_st[ch]->hTcxEnc->spectrum_e[1] = sub( 31, s ); - move16(); + exp_powerSpec_fx[ch] = sub( Q31, q_pS_ch[ch] ); + exp_powerSpecMsInv_fx[ch] = sub( Q31, q_pSI_ch[ch] ); + exp_inv_spectrum_fx[ch] = p_st[ch]->hTcxEnc->spectrum_e[n]; move16(); - - scale_sig32( p_powerSpecMsInv_fx[ch][0], L_FRAME48k, sub( s, q_pSI_ch[ch] ) ); - scale_sig32( &p_powerSpec_fx[ch][0], sts[ch]->hTcxEnc->L_frameTCX, sub( s, q_pS_ch[ch] ) ); - q_powerSpec[ch1] = s; - q_powerSpec[ch2] = s; move16(); move16(); } - exp_powerSpec_tmp[0] = p_st[0]->hTcxEnc->spectrum_e[0]; - exp_powerSpec_tmp[1] = p_st[1]->hTcxEnc->spectrum_e[0]; - exp_p_inv_spectrum[0] = exp_p_inv_spectrum[1] = p_st[0]->hTcxEnc->spectrum_e[0]; - move16(); - move16(); - move16(); - move16(); - ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, q_origSpec, q_origSpec, p_powerSpec_fx, exp_powerSpec_tmp, - p_powerSpecMsInv_fx, exp_powerSpec_tmp, p_inv_spectrum_fx, exp_p_inv_spectrum, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); + + ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, q_origSpec, q_origSpec, p_powerSpec_fx, exp_powerSpec_fx, + p_powerSpecMsInv_fx, exp_powerSpecMsInv_fx, p_inv_spectrum_fx, exp_inv_spectrum_fx, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); } ELSE { -- GitLab From 86a16ee117dcb1d7e236574cc9d6d13faaa91cc6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 21 Apr 2025 12:09:33 +0530 Subject: [PATCH 0389/1310] Fix for complexity measure crash - [ltv48_OMASA_2ISM_1TC_OMASA_ISM2_1TC_b16_4_wb_cbr_fer_ep_10pct_fer_g192.192] --- lib_enc/ivas_masa_enc_fx.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 5c5de97ab..ceb5dec1d 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -2302,7 +2302,7 @@ static void reduce_metadata_further_fx( Word16 bandEnergy_exp, shift; UWord8 mergeOverFreqBands; Word32 meanRatio; - Word16 tmp, tmp2; + Word16 tmp, tmp2, q_totalEnergySum; numCodingBands = hMasa->config.numCodingBands; test(); @@ -2373,6 +2373,7 @@ static void reduce_metadata_further_fx( tmp2 = s_min( 32, tmp2 ); totalEnergySum = W_extract_h( W_shl( W_tmp, tmp2 ) ); tmp2 = sub( tmp2, 32 ); + q_totalEnergySum = add( hMasa->data.q_energy, tmp2 ); /* Determine onsets */ hMasa->data.onset_detector_1_fx = Mpy_32_32( hMasa->data.onset_detector_1_fx, LOWBITRATE_ONSET_ALPHA_Q31 ); @@ -2380,12 +2381,17 @@ static void reduce_metadata_further_fx( tmp = hMasa->data.q_onset_detector; move16(); - IF( BASOP_Util_Cmp_Mant32Exp( hMasa->data.onset_detector_1_fx, sub( 31, hMasa->data.q_onset_detector ), totalEnergySum, sub( 31, hMasa->data.q_energy ) ) < 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( hMasa->data.onset_detector_1_fx, sub( 31, hMasa->data.q_onset_detector ), totalEnergySum, sub( 31, q_totalEnergySum ) ) < 0 ) { hMasa->data.onset_detector_1_fx = totalEnergySum; // hMasa->data.q_energy hMasa->data.q_onset_detector = add( hMasa->data.q_energy, tmp2 ); move32(); move16(); + + shift = norm_l( hMasa->data.onset_detector_2_fx ); + hMasa->data.onset_detector_2_fx = L_shl( hMasa->data.onset_detector_2_fx, shift ); + move32(); + tmp = add( tmp, shift ); } IF( LT_16( tmp, hMasa->data.q_onset_detector ) ) { -- GitLab From ec8f88dc5e91646b110a2449cfe1303df024aae5 Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 15 Apr 2025 12:42:10 +0200 Subject: [PATCH 0390/1310] align the usage of IND_SHB_RES_GS with the float code --- lib_com/cnst.h | 4 ++++ lib_com/options.h | 1 + lib_enc/swb_tbe_enc_fx.c | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 379dd7c85..ae84dbd2c 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -532,12 +532,16 @@ enum IND_STEREO_ICBWE_MSFLAG, IND_SHB_ENER_SF, IND_SHB_RES_GS, +#ifndef FIX_1486_IND_SHB_RES IND_SHB_RES_GS1, IND_SHB_RES_GS2, IND_SHB_RES_GS3, IND_SHB_RES_GS4, IND_SHB_RES_GS5, IND_SHB_VF, +#else + IND_SHB_VF = IND_SHB_RES_GS + 5, +#endif IND_SHB_LSF, IND_SHB_MIRROR = IND_SHB_LSF + 5, IND_SHB_GRID, diff --git a/lib_com/options.h b/lib_com/options.h index daa609ed4..3f158a8e8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -91,6 +91,7 @@ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ +#define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ #define TEST_HR diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 633ede535..acfc5043c 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -5683,7 +5683,11 @@ static void Quant_shb_res_gshape_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { +#ifdef FIX_1486_IND_SHB_RES + push_indice( st_fx->hBstr, IND_SHB_RES_GS + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); +#else push_indice( st_fx->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); +#endif } } } @@ -5719,7 +5723,11 @@ static void Quant_shb_res_gshape_ivas_fx( } ELSE { +#ifdef FIX_1486_IND_SHB_RES + push_indice( st->hBstr, IND_SHB_RES_GS + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); +#else push_indice( st->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); +#endif } } } -- GitLab From 1c32f217ea08b6ddcbfc02d2d0c870ee8769de81 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 21 Apr 2025 16:38:00 +0530 Subject: [PATCH 0391/1310] Q-mismatch bug fix for ProcessIGF in mct path --- lib_dec/ivas_dirac_dec_fx.c | 4 ++-- lib_enc/ext_sig_ana_fx.c | 2 +- lib_enc/ivas_mct_core_enc_fx.c | 2 +- lib_enc/ivas_mct_enc_mct_fx.c | 4 ++-- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 4 ++-- lib_enc/prot_fx_enc.h | 3 ++- lib_enc/tcx_utils_enc_fx.c | 5 +++-- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 10b8059b9..9c319489e 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2186,7 +2186,7 @@ void ivas_dirac_dec_render_sf_fx( move16(); - FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { @@ -2195,7 +2195,7 @@ void ivas_dirac_dec_render_sf_fx( } } - FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) { diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index 200e7e8ed..eeeb294b4 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -1401,7 +1401,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( IF( st->igf ) { Word16 q_spectrum = sub( Q31, hTcxEnc->spectrum_e[frameno] ); - ProcessIGF_ivas_fx( st, N_MAX + L_MDCT_OVLP_MAX, hTcxEnc->spectrum_fx[frameno], hTcxEnc->spectrum_fx[frameno], &q_spectrum, powerSpec, powerSpec_e, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); + ProcessIGF_ivas_fx( st, N_MAX + L_MDCT_OVLP_MAX, hTcxEnc->spectrum_fx[frameno], &q_spectrum, hTcxEnc->spectrum_fx[frameno], q_spectrum, powerSpec, powerSpec_e, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); } } } diff --git a/lib_enc/ivas_mct_core_enc_fx.c b/lib_enc/ivas_mct_core_enc_fx.c index 548a56717..0ab232dd9 100644 --- a/lib_enc/ivas_mct_core_enc_fx.c +++ b/lib_enc/ivas_mct_core_enc_fx.c @@ -646,7 +646,7 @@ void ivas_mct_core_enc_fx( q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); set16_fx( exp_powerSpec[ch], sub( Q31, q_powSpec[ch] ), N_MAX + L_MDCT_OVLP_MAX ); - ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); + ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_origSpec, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hIGFEnc->spec_be_igf_e = sub( 31, q_origSpec ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); diff --git a/lib_enc/ivas_mct_enc_mct_fx.c b/lib_enc/ivas_mct_enc_mct_fx.c index aed6aefa4..67f3b3d47 100644 --- a/lib_enc/ivas_mct_enc_mct_fx.c +++ b/lib_enc/ivas_mct_enc_mct_fx.c @@ -1122,7 +1122,7 @@ void mctStereoIGF_enc_fx( q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); set16_fx( exp_powerSpec[p_ch[ch]], sub( Q31, q_powerSpec[p_ch[ch]] ), N_MAX + L_MDCT_OVLP_MAX ); - ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[p_ch[ch]][n], &q_spectrum, &powerSpec_fx[p_ch[ch]][n * L_subframeTCX], &exp_powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); + ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[p_ch[ch]][n], q_origSpec, &powerSpec_fx[p_ch[ch]][n * L_subframeTCX], &exp_powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); move16(); @@ -1163,7 +1163,7 @@ void mctStereoIGF_enc_fx( q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); set16_fx( exp_powerSpec[ch], sub( Q31, q_powerSpec[ch] ), N_MAX + L_MDCT_OVLP_MAX ); - ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); + ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_origSpec, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); move16(); diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index aa762a77c..c38494669 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -710,7 +710,7 @@ void stereo_mdct_core_enc_fx( q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ - ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); + ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); } } } @@ -787,7 +787,7 @@ void stereo_mdct_core_enc_fx( Scale_sig32( orig_spectrum_fx[ch][n], st->hIGFEnc->infoStopLine, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ - ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); + ProcessIGF_ivas_fx( st, N_MAX, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); } } } diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 73ec00cbd..120dd42b5 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -1244,8 +1244,9 @@ void ProcessIGF_ivas_fx( Encoder_State *st, /* i : Encoder state */ Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum */ - const Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ Word16 *q_spectrum, /* i/o: Q of spectrum */ + const Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ + const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ Word32 *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ Word16 *q_powerSpec, /* i/o: Q of power spectrum */ const Word16 isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 228e522bf..7d5f486cc 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -3926,8 +3926,9 @@ void ProcessIGF_ivas_fx( Encoder_State *st, /* i : Encoder state */ Word16 powerSpec_len, /* i : length of pPowerSpectrum buffer */ Word32 *pMDCTSpectrum, /* i : MDCT spectrum (*q_spectrum) */ - const Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ Word16 *q_spectrum, /* i/o: Q of spectrum */ + const Word32 *pITFMDCTSpectrum, /* i : MDCT spectrum fir ITF */ + const Word16 q_ITFMDCTSpectrum, /* i : Q of MDCT spectrum fir ITF */ Word32 *pPowerSpectrum, /* i : MDCT^2 + MDST^2 spectrum, or estimate (*q_powerSpec) */ Word16 *exp_powerSpec, /* i/o: Q of power spectrum */ const Word16 isTCX20, /* i : flag indicating if the input is TCX20 or TCX10/2xTCX5 */ @@ -3969,7 +3970,7 @@ void ProcessIGF_ivas_fx( } } - IGFSaveSpectrumForITF_ivas_fx( hIGFEnc, igfGridIdx, pITFMDCTSpectrum, sub( Q31, *q_spectrum ) ); + IGFSaveSpectrumForITF_ivas_fx( hIGFEnc, igfGridIdx, pITFMDCTSpectrum, sub( Q31, q_ITFMDCTSpectrum ) ); IGFEncApplyMono_ivas_fx( st, powerSpec_len, igfGridIdx, pMDCTSpectrum, sub( Q31, *q_spectrum ), pPowerSpectrum, exp_powerSpec, isTCX20, st->hTcxEnc->fUseTns[frameno], sp_aud_decision0, vad_hover_flag ); -- GitLab From f325d96e34c46d7dc59d04289b830371fefed00f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 22 Apr 2025 10:37:39 +0200 Subject: [PATCH 0392/1310] Revert "[revert-me] use other branch for testing" This reverts commit ca78d64b8655295422fafd8100f4bd609b71a8c9. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c500107c1..01ac69a92 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "kiene/tmp-branch-for-ltv-split-testing" + BASOP_CI_BRANCH_PC_REPO: "ci/split-output-files-b4-comparison" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 -- GitLab From 7c5a7682fe42f3b38974c1225ebb53924dea7478 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 22 Apr 2025 10:37:53 +0200 Subject: [PATCH 0393/1310] Revert "[revert-me] change branch for getting the scripts" This reverts commit e538224816eff3d9455bc28e81be5d5eb29c18d0. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 01ac69a92..275b91bfb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "ci/split-output-files-b4-comparison" + BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 -- GitLab From e4c2db922a44e2bc9270262e4825c140f2c04126 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 22 Apr 2025 13:57:28 +0200 Subject: [PATCH 0394/1310] fix lineendings --- lib_com/options.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 99206fa9d..2f1e82de8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -90,8 +90,8 @@ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ +#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ -- GitLab From 32903074dd6dbee6e4737651a15a4873cec378b5 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 22 Apr 2025 23:03:07 +0530 Subject: [PATCH 0395/1310] Fix for LTV encoder +10dB crash --- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index c38494669..646f3e725 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -458,29 +458,35 @@ void stereo_mdct_core_enc_fx( { IF( NE_16( hStereoMdct->mdct_stereo_mode[n], SMDCT_DUAL_MONO ) ) { + exp = shl( add( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), 1 ); // 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) /* power spectrum: MDCT^2 + MDST^2 */ - W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][0], inv_spectrum_fx[ch][n][0] ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n] + mdct = L_shr( inv_spectrum_fx[ch][n][0], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + W_tmp = W_mult_32_32( mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) norm = W_norm( W_tmp ); - powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n]-norm - exp_powSpecInv[n][0] = sub( shl( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), norm ); + powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) + exp_powSpecInv[n][0] = sub( exp, norm ); move32(); move16(); FOR( i = 1; i < L_subframeTCX - 1; i++ ) { - Word32 mdst_fx = L_sub( inv_spectrum_fx[ch][n][i + 1], inv_spectrum_fx[ch][n][i - 1] ); // exp: sts[ch]->hTcxEnc->spectrum_e[n] - W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), inv_spectrum_fx[ch][n][i], inv_spectrum_fx[ch][n][i] ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n] + /* float mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; */ + mdst = L_sub( L_shr( inv_spectrum_fx[ch][n][i + 1], 1 ), L_shr( inv_spectrum_fx[ch][n][i - 1], 1 ) ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + mdct = L_shr( inv_spectrum_fx[ch][n][i], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + W_tmp = W_mac_32_32( W_mult_32_32( mdst, mdst ), mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) norm = W_norm( W_tmp ); - powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n]-norm - exp_powSpecInv[n][i] = sub( shl( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), norm ); + powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) + exp_powSpecInv[n][i] = sub( exp, norm ); move32(); move16(); } - W_tmp = W_mult_32_32( inv_spectrum_fx[ch][n][L_subframeTCX - 1], inv_spectrum_fx[ch][n][L_subframeTCX - 1] ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n] + mdct = L_shr( inv_spectrum_fx[ch][n][L_subframeTCX - 1], 1 ); // exp: sts[ch]->hTcxEnc->spectrum_e[n]+1 + W_tmp = W_mult_32_32( mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) norm = W_norm( W_tmp ); - powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*sts[ch]->hTcxEnc->spectrum_e[n]-norm - exp_powSpecInv[n][L_subframeTCX - 1] = sub( shl( sts[ch]->hTcxEnc->spectrum_e[n], 1 ), norm ); + powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) + exp_powSpecInv[n][L_subframeTCX - 1] = sub( exp, norm ); move32(); move16(); } -- GitLab From 6c3c58e60b677cdd1a2b4b9dd339c3c4c44f1fcf Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 23 Apr 2025 10:42:57 +0200 Subject: [PATCH 0396/1310] Make q_win dependent on multichannel mode to avoid saturation of downmix signals. --- lib_com/options.h | 4 ++-- lib_com/prot_fx.h | 3 +++ lib_dec/ivas_mct_dec_fx.c | 4 ++++ lib_dec/ivas_mdct_core_dec_fx.c | 10 +++++++++- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 4 ++++ 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 62cf19b7c..1f0f7c641 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -98,7 +98,7 @@ #define TEST_HR #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ -//#define FIX_1348_BIT_PRECISION_IMPROVEMENT -//#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#define FIX_1348_BIT_PRECISION_IMPROVEMENT +#define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD //#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 924a9955b..42fa6da76 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10004,6 +10004,9 @@ void ivas_mdct_core_reconstruct_fx( /* o : synthesis @output_FS */ // e_sig Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + const Word16 isParamMC, +#endif Word16 q_x, Word16 e_sig[CPE_CHANNELS] ); diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 32403b11a..058b57593 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -346,7 +346,11 @@ ivas_error ivas_mct_dec_fx( } Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, st_ivas->mc_mode == MC_MODE_PARAMMC, q_output, e_sig ); +#else ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, e_sig ); +#endif Word16 hdrm, sh; hdrm = getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 77673c3bb..6c527e9ce 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1083,6 +1083,9 @@ void ivas_mdct_core_reconstruct_fx( /* o : synthesis @output_FS */ // e_sig Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + const Word16 isParamMC, +#endif Word16 q_x, Word16 e_sig[CPE_CHANNELS] ) { @@ -1122,6 +1125,11 @@ void ivas_mdct_core_reconstruct_fx( bfi = sts[0]->bfi; move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + if ( isParamMC ) + q_win = -2; +#endif + /* TNS, ITF, IMDCT and updates */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -1265,7 +1273,7 @@ void ivas_mdct_core_reconstruct_fx( st->hHQ_core->Q_old_wtda_LB = st->Q_syn; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - Scale_sig( st->mem_syn2_fx, M, -1 ); // -1 should be calculated from q_win. + Scale_sig( st->mem_syn2_fx, M, sub( negate( q_win ), 2 ) ); #endif } ELSE /*ACELP core for ACELP-PLC */ diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 890e5fc9e..fd9398769 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -550,7 +550,11 @@ void stereo_mdct_core_dec_fx( } Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, st_ivas->mc_mode == MC_MODE_PARAMMC, Q11, e_sigFB ); +#else ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, Q11, e_sigFB ); +#endif Copy32( signal_out_tmp_fx[0], signal_out_fx[0], L_FRAME48k ); /* Q11 */ Copy32( signal_out_tmp_fx[1], signal_out_fx[1], L_FRAME48k ); /* Q11 */ -- GitLab From c4169554ee53d088799b7fd4b8c56fd83fd05c36 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 23 Apr 2025 17:02:33 +0530 Subject: [PATCH 0397/1310] Fix for 3GPP issue 1505: [regression] Encoder crash for McMASA 7.1+4 16kHz input at 64kbps in convertToBwMS_fx() Link #1505 --- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index 646f3e725..1bd5c936b 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -371,7 +371,7 @@ void stereo_mdct_core_enc_fx( } exp1 = add( exp1, 1 ); /* 1 guard bit to avoid over-flows in stereo_coder_tcx_fx */ - exp2 = add( exp2, 1 ); /* 1 guard bit to avoid over-flows in stereo_coder_tcx_fx */ + exp2 = add( exp2, 2 ); /* 2 guard bit to avoid over-flows in stereo_coder_tcx_fx (ms_processing_fx) */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { -- GitLab From 6ed7ba270608ea31f61e5ed9ebc51d7eb24ada98 Mon Sep 17 00:00:00 2001 From: Anjaneyulu Sana Date: Tue, 15 Apr 2025 17:03:53 +0530 Subject: [PATCH 0398/1310] Fix for 3GPP issue 1479: Renderer crashes for MASA long test vector input --- lib_rend/ivas_dirac_rend_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 03831e407..030287b7f 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4166,7 +4166,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i] = L_add( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], surCohEner_fx ); // q29 move32(); - surCohRatio_fx[i] = L_deposit_h( BASOP_Util_Divide3232_Scale( surCohEner_fx, L_add( L_add( 1, dirEne_fx ), surCohEner_fx ), &surCohRatio_exp[i] ) ); // 31-surCohRatio_exp + surCohRatio_fx[i] = BASOP_Util_Divide3232_Scale_cadence( surCohEner_fx, L_add( L_add( 1, dirEne_fx ), surCohEner_fx ), &surCohRatio_exp[i] ); // 31-surCohRatio_exp move32(); temp_exp = s_max( temp_exp, surCohRatio_exp[i] ); } @@ -4961,7 +4961,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( hSpatParamRendCom->num_freq_bands ) ); } } - scale_factor = sub( scale_factor, 3 ); // guard bits + scale_factor = sub( scale_factor, find_guarded_bits_fx( hSpatParamRendCom->num_freq_bands ) ); // guard bits FOR( ch = 0; ch < hDirACRend->num_outputs_dir; ch++ ) { -- GitLab From f1e41eb33e60dbf624ddf474d5e25af517b88aa8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 23 Apr 2025 17:06:22 +0530 Subject: [PATCH 0399/1310] Replace BASOP_Util_Divide3232_Scale_cadence() with BASOP_Util_Divide3232_Scale_newton() --- lib_rend/ivas_dirac_rend_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 030287b7f..2f748289a 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4166,7 +4166,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i] = L_add( hDirACRend->h_output_synthesis_psd_state.direct_power_factor_fx[i], surCohEner_fx ); // q29 move32(); - surCohRatio_fx[i] = BASOP_Util_Divide3232_Scale_cadence( surCohEner_fx, L_add( L_add( 1, dirEne_fx ), surCohEner_fx ), &surCohRatio_exp[i] ); // 31-surCohRatio_exp + surCohRatio_fx[i] = BASOP_Util_Divide3232_Scale_newton( surCohEner_fx, L_add( L_add( 1, dirEne_fx ), surCohEner_fx ), &surCohRatio_exp[i] ); // 31-surCohRatio_exp move32(); temp_exp = s_max( temp_exp, surCohRatio_exp[i] ); } -- GitLab From e550b83e38222f2720b5b49f8bf857cc02b66eca Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 14:46:13 +0200 Subject: [PATCH 0400/1310] remove some debug output and add silent/quiet flags --- .gitlab-ci.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 275b91bfb..5f8168e3a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1703,8 +1703,7 @@ voip-be-on-merge-request: # see below in the concrete complexity jobs - if [ "$JOB_ID_INJECT" != "" ]; then job_id=$JOB_ID_INJECT; fi - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - - unzip artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - - ls + - unzip -qq artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - public_dir="$CI_JOB_NAME-public" # if is needed to catch case when no artifact is there (first run), similarly as above @@ -1727,15 +1726,14 @@ voip-be-on-merge-request: - fi - fi - - ls wmops - rm artifacts.zip - rm -rf $public_dir ### 1.5.part: get the corresponding measurement from ivas-float-update - job_id=$(python3 ci/get_id_of_last_job_occurence.py ivas-float-update $CI_JOB_NAME $CI_PROJECT_ID) - echo $job_id - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip - - unzip -j artifacts_ref.zip "*latest_WMOPS.csv" || true + - curl --silent --show-error --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip + - unzip -qq -j artifacts_ref.zip "*latest_WMOPS.csv" || true # add file to arguments only if the artifact could be retrieved to prevent error later. - if [ -f latest_WMOPS.csv ]; then GET_WMOPS_ARGS="$GET_WMOPS_ARGS latest_WMOPS.csv"; fi @@ -1748,8 +1746,6 @@ voip-be-on-merge-request: - mkdir $public_dir/logs # first move logs - log_files=$(cat $public_dir/graphs*.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - - echo $log_files - - ls wmops/logs - for f in $log_files; do [ -f wmops/logs/$f ] && mv wmops/logs/$f $public_dir/logs/$f; done # copy index page blueprint - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html @@ -1757,7 +1753,6 @@ voip-be-on-merge-request: - sed -i "s/IVAS FORMAT/IVAS $in_format to $out_format/g" ${public_dir}/index.html # do separately here to avoid overwrite complaints by mv - mv -f ci/complexity_measurements/style.css ${public_dir}/ - - ls $public_dir .complexity-template: extends: @@ -1775,7 +1770,6 @@ voip-be-on-merge-request: - *complexity-measurements-setup # delete previous jobs logfiles if present (-f flag ensures return calue of 0 even in first run where this folder is not present) - rm -rf COMPLEXITY/logs - - which coan allow_failure: exit_codes: - 123 -- GitLab From bbfe0be3b8cd96fbde157aeff57c71c05ddc2624 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 17:01:03 +0200 Subject: [PATCH 0401/1310] fix artifact name to conform to new scripts --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 275b91bfb..382b3992d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -738,7 +738,7 @@ stages: - $MERGE_TARGET_COMMIT_FILE - regressions_crashes.csv - regressions_MLD.csv - - regressions_MAXIMUM_ABS_DIFF.csv + - regressions_MAX_ABS_DIFF.csv - regressions_MIN_SSNR.csv - regressions_MIN_ODG.csv - improvements_crashes.csv -- GitLab From 240e70d6c66c70962219efbd7f5695f004f54010 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 17:03:53 +0200 Subject: [PATCH 0402/1310] fix other occasions as well --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 382b3992d..0b7fe26eb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -622,7 +622,7 @@ stages: - *print-common-info # create empty files for all artifacts to suppress warnings in case of no regressions found or all is BE - - touch $XML_REPORT_BRANCH $XML_REPORT_MAIN $HTML_REPORT_BRANCH $HTML_REPORT_MAIN $CSV_BRANCH $CSV_MAIN $SUMMARY_HTML_ARTIFACT_NAME $FLOAT_REF_COMMIT_FILE $CUT_COMMIT_FILE $MERGE_TARGET_COMMIT_FILE regressions_crashes.csv regressions_MLD.csv regressions_MAXIMUM_ABS_DIFF.csv regressions_MIN_SSNR.csv regressions_MIN_ODG.csv improvements_crashes.csv improvements_MLD.csv improvements_MAXIMUM_ABS_DIFF.csv improvements_MIN_SSNR.csv improvements_MIN_ODG.csv + - touch $XML_REPORT_BRANCH $XML_REPORT_MAIN $HTML_REPORT_BRANCH $HTML_REPORT_MAIN $CSV_BRANCH $CSV_MAIN $SUMMARY_HTML_ARTIFACT_NAME $FLOAT_REF_COMMIT_FILE $CUT_COMMIT_FILE $MERGE_TARGET_COMMIT_FILE regressions_crashes.csv regressions_MLD.csv regressions_MAX_ABS_DIFF.csv regressions_MIN_SSNR.csv regressions_MIN_ODG.csv improvements_crashes.csv improvements_MLD.csv improvements_MAX_ABS_DIFF.csv improvements_MIN_SSNR.csv improvements_MIN_ODG.csv - mkdir $IMAGES_ARTIFACT_NAME - set -euxo pipefail @@ -743,7 +743,7 @@ stages: - regressions_MIN_ODG.csv - improvements_crashes.csv - improvements_MLD.csv - - improvements_MAXIMUM_ABS_DIFF.csv + - improvements_MAX_ABS_DIFF.csv - improvements_MIN_SSNR.csv - improvements_MIN_ODG.csv expose_as: "pytest compare results" -- GitLab From 1acdddb6af021c28246ffe812cb56f1724d2440a Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 17:11:14 +0200 Subject: [PATCH 0403/1310] add summary printout at end of complexity jobs --- .gitlab-ci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5f8168e3a..644ed7355 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1754,6 +1754,16 @@ voip-be-on-merge-request: # do separately here to avoid overwrite complaints by mv - mv -f ci/complexity_measurements/style.css ${public_dir}/ +.complexity-measurements-report-summary: &complexity-measurements-report-summary + - *print-results-banner + - if [ $ret_val -eq 0 ]; then + - echo -e "No crashes occured.\nNo changes in complexity or memory usage (>1%) detected." + - elif [ $ret_val -eq 123 ]; then + - echo -e "Changes in complexity or memory usage (>1%) detected!!!\nNo crashes occured." + - else + - echo -e "Something went wrong in running the codec. Likely some modes were crashing." + - fi + .complexity-template: extends: - .test-job-linux @@ -1793,6 +1803,7 @@ complexity-stereo-in-stereo-out: - out_format=stereo - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-ism-in-binaural-out: @@ -1810,6 +1821,7 @@ complexity-ism-in-binaural-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-ism-in-binaural_room_ir-out: @@ -1827,6 +1839,7 @@ complexity-ism-in-binaural_room_ir-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-ism-in-ext-out: @@ -1844,6 +1857,7 @@ complexity-ism-in-ext-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-sba-hoa3-in-hoa3-out: @@ -1861,6 +1875,7 @@ complexity-sba-hoa3-in-hoa3-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-sba-hoa3-in-binaural-out: @@ -1878,6 +1893,7 @@ complexity-sba-hoa3-in-binaural-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-sba-hoa3-in-binaural_room_ir-out: @@ -1895,6 +1911,7 @@ complexity-sba-hoa3-in-binaural_room_ir-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-mc-in-7_1_4-out: @@ -1912,6 +1929,7 @@ complexity-mc-in-7_1_4-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-mc-in-binaural-out: @@ -1929,6 +1947,7 @@ complexity-mc-in-binaural-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-mc-in-binaural_room_ir-out: @@ -1946,6 +1965,7 @@ complexity-mc-in-binaural_room_ir-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-masa-in-ext-out: @@ -1963,6 +1983,7 @@ complexity-masa-in-ext-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-masa-in-binaural-out: @@ -1980,6 +2001,7 @@ complexity-masa-in-binaural-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-masa-in-hoa3-out: @@ -1997,6 +2019,7 @@ complexity-masa-in-hoa3-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val # complexity-omasa-in-ext-out: @@ -2014,6 +2037,7 @@ complexity-masa-in-hoa3-out: # - ret_val=0 # - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? # - *complexity-measurements-prepare-artifacts +# - *complexity-measurements-report-summary # - exit $ret_val complexity-omasa-in-binaural-out: @@ -2031,6 +2055,7 @@ complexity-omasa-in-binaural-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-omasa-in-hoa3-out: @@ -2048,6 +2073,7 @@ complexity-omasa-in-hoa3-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-StereoDmxEVS-stereo-in-mono-out: @@ -2065,6 +2091,7 @@ complexity-StereoDmxEVS-stereo-in-mono-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val # complexity-osba-in-ext-out: @@ -2080,6 +2107,7 @@ complexity-StereoDmxEVS-stereo-in-mono-out: # - ret_val=0 # - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? # - *complexity-measurements-prepare-artifacts +# - *complexity-measurements-report-summary # - exit $ret_val complexity-osba-in-binaural-out: @@ -2097,6 +2125,7 @@ complexity-osba-in-binaural-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val complexity-osba-in-binaural_room_ir-out: @@ -2114,6 +2143,7 @@ complexity-osba-in-binaural_room_ir-out: - ret_val=0 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - *complexity-measurements-prepare-artifacts + - *complexity-measurements-report-summary - exit $ret_val # job that sets up gitlab pages website -- GitLab From 1b059d6ef99d5f8155b0160e609fe56cc3c602f4 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 17:14:58 +0200 Subject: [PATCH 0404/1310] [revert-me] temporarily disable delay for testing --- .gitlab-ci.yml | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 644ed7355..ae4c41ec6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1811,8 +1811,6 @@ complexity-ism-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 1 hour variables: JOB_ID_INJECT: "" script: @@ -1829,8 +1827,6 @@ complexity-ism-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 2 hours variables: JOB_ID_INJECT: "" script: @@ -1847,8 +1843,6 @@ complexity-ism-in-ext-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 3 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1865,8 +1859,6 @@ complexity-sba-hoa3-in-hoa3-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 4 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1883,8 +1875,6 @@ complexity-sba-hoa3-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 5 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1901,8 +1891,6 @@ complexity-sba-hoa3-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 6 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1919,8 +1907,6 @@ complexity-mc-in-7_1_4-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 7 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1937,8 +1923,6 @@ complexity-mc-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 10 hours variables: JOB_ID_INJECT: "" script: @@ -1955,8 +1939,6 @@ complexity-mc-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 12 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1973,8 +1955,6 @@ complexity-masa-in-ext-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 15 hours variables: JOB_ID_INJECT: "" script: @@ -1991,8 +1971,6 @@ complexity-masa-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 16 hours variables: JOB_ID_INJECT: "" script: @@ -2009,8 +1987,6 @@ complexity-masa-in-hoa3-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 17 hours variables: JOB_ID_INJECT: "" script: @@ -2045,8 +2021,6 @@ complexity-omasa-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 18 hours variables: JOB_ID_INJECT: "" script: @@ -2063,8 +2037,6 @@ complexity-omasa-in-hoa3-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 20 hours variables: JOB_ID_INJECT: "" script: @@ -2081,8 +2053,6 @@ complexity-StereoDmxEVS-stereo-in-mono-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 22 hours variables: JOB_ID_INJECT: "" script: @@ -2099,8 +2069,6 @@ complexity-StereoDmxEVS-stereo-in-mono-out: # - .complexity-template # rules: # - if: $MEASURE_COMPLEXITY_LINUX -# when: delayed -# start_in: 17 hours # script: # - in_format=OSBA # - out_format=EXT @@ -2115,8 +2083,6 @@ complexity-osba-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 22 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -2133,8 +2099,6 @@ complexity-osba-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 25 hours variables: JOB_ID_INJECT: "" script: -- GitLab From f9354b9c882b9f2206bc78976073c3ed5b572413 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 17:20:38 +0200 Subject: [PATCH 0405/1310] [revert-me] change script branch for testing --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ae4c41ec6..f29544856 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" + BASOP_CI_BRANCH_PC_REPO: "kiene/tmp-branch-for-complexity-cleanup" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 -- GitLab From 4200ee7afd5b315ea0fcbae54c382585e0ba3d40 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 17:29:49 +0200 Subject: [PATCH 0406/1310] silent flag for another curl call --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f29544856..49bff6ad4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1702,7 +1702,7 @@ voip-be-on-merge-request: # this is a testing/maintenance mechanism to force getting the log history from a specific job id # see below in the concrete complexity jobs - if [ "$JOB_ID_INJECT" != "" ]; then job_id=$JOB_ID_INJECT; fi - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip + - curl --silent --show-error --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - unzip -qq artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - public_dir="$CI_JOB_NAME-public" -- GitLab From e4ed9c4fc8ce3752a732321b22278150ebc8dea8 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Apr 2025 18:39:57 +0200 Subject: [PATCH 0407/1310] [revert-me] add intentional crash + changed complexity --- lib_dec/ivas_jbm_dec_fx.c | 8 ++++---- lib_enc/ivas_enc_fx.c | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 74af57bd5..8d4b10dec 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -159,10 +159,10 @@ ivas_error ivas_jbm_dec_tc_fx( set32_fx( &p_output_fx[0][0], 0, L_FRAME48k ); set32_fx( &p_output_fx[1][0], 0, L_FRAME48k ); - IF( ( error = ivas_cpe_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } + // IF( ( error = ivas_cpe_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, 0 ) ) != IVAS_ERR_OK ) + // { + // return error; + // } IF( NE_16( q_output, Q11 ) ) { diff --git a/lib_enc/ivas_enc_fx.c b/lib_enc/ivas_enc_fx.c index ff5f65b32..95f690c15 100644 --- a/lib_enc/ivas_enc_fx.c +++ b/lib_enc/ivas_enc_fx.c @@ -31,6 +31,7 @@ *******************************************************************************************************/ #include +#include #include #include "options.h" #include "cnst.h" @@ -187,6 +188,7 @@ ivas_error ivas_enc_fx( } ELSE IF( EQ_32( ivas_format, ISM_FORMAT ) ) { + assert( 0 ); /* select ISM format mode; reconfigure the ISM format encoder */ IF( ( error = ivas_ism_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { -- GitLab From 88b7a0ddcb1027f59e41c5fe146c96f0466fd8cb Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 23 Apr 2025 19:16:09 +0200 Subject: [PATCH 0408/1310] Change st->hHQ_core->Q_old_wtda_LB to st->hHQ_core->q_old_out_LB_fx since with FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD active it is not st->Q_syn anymore. Fixes TCX to ACELP transition. --- lib_dec/dec_tcx_fx.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 56f2b2e6b..070d129c5 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3686,10 +3686,17 @@ void decoder_tcx_ivas_fx( Scale_sig( synth_fx, L_frame_glob, negate( st->Q_syn ) ); Scale_sig( synthFB_fx, L_frameTCX_glob, negate( st->Q_syn ) ); // Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, 1 ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD + st->hHQ_core->Q_old_wtda = st->hHQ_core->q_old_out_fx; + // Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); + st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->q_old_out_LB_fx; + // Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); +#else st->hHQ_core->Q_old_wtda = st->Q_syn; // Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); st->hHQ_core->Q_old_wtda_LB = st->Q_syn; // Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); +#endif Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( -2 - st->hTcxDec->Q_old_syn_Overl ) ); // Scaling to Q-2 st->hTcxDec->Q_old_syn_Overl = -2; } -- GitLab From f9ad8577f709290fe1777fce1a9184da66939933 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Wed, 23 Apr 2025 20:49:05 +0200 Subject: [PATCH 0409/1310] compiling ok ready to test --- apps/decoder.c | 141 ++++- apps/renderer.c | 163 ++++- lib_com/ivas_cnst.h | 9 + lib_com/ivas_error.h | 7 + lib_com/options.h | 10 + lib_dec/ivas_init_dec.c | 4 + lib_dec/lib_dec.h | 34 +- lib_dec/lib_dec_fx.c | 40 +- lib_rend/ivas_crend_fx.c | 66 ++ lib_rend/ivas_hrtf_fx.c | 8 + lib_rend/ivas_objectRenderer_fx.c | 5 +- lib_rend/ivas_objectRenderer_mix_fx.c | 40 ++ lib_rend/ivas_rom_binaural_crend_head.h | 171 ++--- lib_rend/ivas_rom_binaural_crend_head_fx.c | 501 ++++++++++++--- lib_rend/ivas_rom_rend.h | 8 + lib_rend/ivas_rom_rend_fx.c | 2 + lib_rend/ivas_stat_rend.h | 15 +- lib_rend/lib_rend.c | 594 +++++++++++++++--- lib_rend/lib_rend.h | 32 + lib_util/hrtf_file_reader.c | 696 ++++++++++++++++++++- lib_util/hrtf_file_reader.h | 70 ++- lib_util/render_config_reader.c | 4 + 22 files changed, 2326 insertions(+), 294 deletions(-) mode change 100755 => 100644 lib_com/options.h diff --git a/apps/decoder.c b/apps/decoder.c index 2bff1fab6..3aa9d26eb 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -174,6 +174,10 @@ int main( RenderConfigReader *renderConfigReader = NULL; int16_t *pcmBuf = NULL; IVAS_RENDER_FRAMESIZE asked_frame_size; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; +#endif #ifdef WMOPS reset_wmops(); @@ -599,58 +603,171 @@ int main( if ( arg.hrtfReaderEnabled ) { +#ifndef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; - +#endif if ( ( error = IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( error = load_HRTF_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { +#ifdef FIX_OLD_BINARY_FORMAT + hrtfFileReader_close( &hrtfReader ); + strcat( arg.hrtfFileName, "new" ); + + if ( hrtfFileReader_open( arg.hrtfFileName, &hrtfReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + + if ( ( error = load_HRTF_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + else + { + destroy_td_hrtf( hHrtfTD ); + } + } +#else + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; +#endif + } + else + { + destroy_td_hrtf( hHrtfTD ); + } + } +#else if ( ( error = load_HRTF_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); goto cleanup; } +#endif +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( *hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + } +#else + if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } +#endif +#endif +#ifndef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; +#endif if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfCRendHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + else + { + destroy_SetOfHRTF( hSetOfHRTF ); + } + } +#else if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfFileName ); goto cleanup; } +#endif +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; +#else IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL; +#endif if ( ( error = IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfFastConvHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( error = load_fastconv_HRTF_from_binary( *hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + else + { + destroy_fastconv_hrtf( hHrtfFastConv ); + } + } +#else if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfFileName ); goto cleanup; } +#endif +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; +#else IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL; +#endif if ( ( error = IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfParamBinHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( error = load_parambin_HRTF_from_binary( *hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + else + { + destroy_parambin_hrtf( hHrtfParambin ); + } + } +#else if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in loading HRTF binary file %s for parametric binauralizer \n\n", arg.hrtfFileName ); goto cleanup; } +#endif } /*------------------------------------------------------------------------------------------* @@ -713,12 +830,34 @@ cleanup: if ( arg.hrtfReaderEnabled ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; +#else IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; +#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( hHrtfTD != NULL ) + { + destroy_td_hrtf( hHrtfTD ); + } +#else dealloc_HRTF_binary( hHrtfTD ); +#endif +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; +#else IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; +#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( hSetOfHRTF != NULL ) + { + destroy_SetOfHRTF( hSetOfHRTF ); + } +#else destroy_SetOfHRTF( hSetOfHRTF ); +#endif } IVAS_DEC_Close( &hIvasDec ); diff --git a/apps/renderer.c b/apps/renderer.c index 2a14e2811..b12aa43a5 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -762,6 +762,12 @@ int main( #endif Vector3PairFileReader *referenceVectorReader = NULL; hrtfFileReader *hrtfFileReader = NULL; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; + IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; +#endif IsmPositionProvider *positionProvider; LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; RenderConfigReader *renderConfigReader = NULL; @@ -816,8 +822,10 @@ int main( #ifdef SPLIT_REND_WITH_HEAD_ROT hSplitRendFileReadWrite = NULL; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING CLDFBframeSize_smpls = 0; cldfb_in_flag = 0; +#endif bitsBuffer.bits = NULL; bitsBuffer.config.bitsRead = 0; bitsBuffer.config.bitsWritten = 0; @@ -906,6 +914,7 @@ int main( } } +#ifndef NONBE_FIX_BINARY_BINAURAL_READING if ( !isEmptyString( args.customHrtfFilePath ) ) { if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) @@ -914,6 +923,7 @@ int main( exit( -1 ); } } +#endif if ( !isEmptyString( args.renderConfigFilePath ) ) { @@ -999,14 +1009,142 @@ int main( } const int16_t frameSize_smpls = (int16_t) ( ( args.render_framesize ) * args.sampleRate * 5 / ( 1000 ) ); - Word32 nonDiegeticPanGain_fx = ( args.nonDiegeticPanGain == 1.0f ) ? ONE_IN_Q31 : ( args.nonDiegeticPanGain == -1.0f ) ? L_negate( ONE_IN_Q31 ) - : (Word32) ( args.nonDiegeticPanGain * ( 1LL << Q31 ) ); - IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, nonDiegeticPanGain_fx, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) + +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, !isEmptyString( args.customHrtfFilePath ), args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( !isEmptyString( args.customHrtfFilePath ) ) + { + if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.customHrtfFilePath ); + exit( -1 ); + } + + if ( hrtfFileReader != NULL ) + { + if ( ( error = IVAS_REND_GetHrtfHandle( hIvasRend, &hHrtfTD ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_GetHrtfHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = load_HRTF_binary( *hHrtfTD, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { +#ifdef FIX_OLD_BINARY_FORMAT + hrtfFileReader_close( &hrtfFileReader ); + strcat( args.customHrtfFilePath, "new" ); + if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + if ( ( error = load_HRTF_binary( *hHrtfTD, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_td_hrtf( hHrtfTD ); + } + } +#else + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; +#endif + } + else + { + destroy_td_hrtf( hHrtfTD ); + } + } + +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + } +#endif + + if ( ( error = IVAS_REND_GetHrtfCRendHandle( hIvasRend, &hSetOfHRTF ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_Rend_GetHrtfCRendHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfFileReader, args.sampleRate ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_SetOfHRTF( hSetOfHRTF ); + } + } + + if ( ( error = IVAS_REND_GetHrtfFastConvHandle( hIvasRend, &hHrtfFastConv ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_GetHrtfFastConvHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = load_fastconv_HRTF_from_binary( *hHrtfFastConv, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_fastconv_hrtf( hHrtfFastConv ); + } + } + + if ( ( error = IVAS_REND_GetHrtfParamBinHandle( hIvasRend, &hHrtfParambin ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfParamBinHandle failed: %s\n\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + if ( ( error = load_parambin_HRTF_from_binary( *hHrtfParambin, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_parambin_hrtf( hHrtfParambin ); + } + } + } + + hrtfFileReader_close( &hrtfFileReader ); + } +#endif + fprintf( stdout, "Input audio file: %s\n", args.inputFilePath ); fprintf( stdout, "Output audio file: %s\n\n", args.outputFilePath ); @@ -1052,7 +1190,7 @@ int main( /* === Configure === */ if ( ( error = IVAS_REND_InitConfig( hIvasRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Renderer Config Init\n" ); + fprintf( stderr, "Error in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } @@ -1129,9 +1267,11 @@ int main( exit( -1 ); } +#ifndef NONBE_FIX_BINARY_BINAURAL_READING #ifdef SPLIT_REND_WITH_HEAD_ROT CLDFBframeSize_smpls = frameSize_smpls * 2; cldfb_in_flag = get_cldfb_in_flag( args.outConfig.audioConfig, &renderConfig ); +#endif #endif } @@ -2074,6 +2214,9 @@ int main( free( outFloatBuffer ); free( outInt32Buffer ); free( inInt32Buffer ); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +cleanup: +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT if ( bitsBufferData != NULL ) @@ -2107,7 +2250,19 @@ int main( RotationFileReader_close( &externalOrientationFileReader ); RotationFileReader_close( &referenceRotReader ); Vector3PairFileReader_close( &referenceVectorReader ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING hrtfFileReader_close( &hrtfFileReader ); +#endif +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( hSetOfHRTF != NULL && *hSetOfHRTF != NULL ) + { + destroy_SetOfHRTF( hSetOfHRTF ); + } + if ( hHrtfTD != NULL && *hHrtfTD != NULL ) + { + destroy_td_hrtf( hHrtfTD ); + } +#endif IVAS_REND_Close( &hIvasRend ); IsmPositionProvider_close( positionProvider ); RenderConfigReader_close( &renderConfigReader ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e65ecc2cf..e249cb6ce 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1685,7 +1685,9 @@ typedef enum #define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP ) #define MAX_INTERPOLATION_STEPS 12 +#ifndef NONBE_FIX_BINARY_BINAURAL_READING #define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) +#endif #define DEG_360_IN_Q22 ( 360 << Q22 ) // Q22 #define DEG_180_IN_Q22 ( 180 << Q22 ) // Q22 @@ -1745,8 +1747,15 @@ typedef enum #define RV_FILTER_MAX_HISTORY ( 512 - 160 ) /* for longest history */ #define RV_LENGTH_NR_FC ( RV_FILTER_MAX_FFT_SIZE / 2 ) + 1 +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +#define RV_LENGTH_NR_FC_16KHZ ( RV_FILTER_MAX_FFT_SIZE / 4 ) + 1 +#endif #define IVAS_REVERB_DEFAULT_N_BANDS 31 +#define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +#define LR_IAC_LENGTH_NR_FC_16KHZ ( RV_LENGTH_NR_FC_16KHZ ) +#endif /*----------------------------------------------------------------------------------* * FB mixer constants diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 506c6ac00..4955c7e2c 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -78,6 +78,9 @@ typedef enum IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, IVAS_ERR_INVALID_HRTF, +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA, +#endif IVAS_ERR_INVALID_INPUT_FORMAT, IVAS_ERR_INVALID_INDEX, IVAS_ERR_NOT_SUPPORTED_OPTION, @@ -257,6 +260,10 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Acoustic environment not supported"; case IVAS_ERR_INVALID_HRTF: return "Unsupported HRTF filter set"; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + case IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA: + return "Renderer data missing in HRTF binary file"; +#endif case IVAS_ERR_INVALID_INPUT_FORMAT: return "Invalid input format"; case IVAS_ERR_INVALID_INDEX: diff --git a/lib_com/options.h b/lib_com/options.h old mode 100755 new mode 100644 index c301e5bea..9eedf04d7 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,6 +97,16 @@ #define NONBE_FIX_944_FEC_OMASA_1SEP_OBJ_MASA /* Nokia: issue 944: fix FEC error in OMASA */ #define NONBE_FIX_949_MC_5MS_FRAMING /*Dlb: Issue 949: fix for 5ms framing/rendering in MC mode */ +//#define SPLIT_REND_WITH_HEAD_ROT_NEW /* Orange: split rendering code differ between branchs main-pc and float-pc, do not know what to do/ +#define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ +//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT +#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#define NONBE_FIX_AVG_IAC_CLDFB_REVERB +#endif +#define FIX_OLD_BINARY_FORMAT +#endif /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index ba4905189..69e246164 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -3078,7 +3078,11 @@ void ivas_destroy_dec_fx( { ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( st_ivas->hHrtfTD != NULL ) +#else ELSE IF( st_ivas->hHrtfTD != NULL ) +#endif { BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 999e15328..f2281b779 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -358,25 +358,41 @@ ivas_error IVAS_DEC_FeedCustomLsData( ); /*! r: error code */ -ivas_error IVAS_DEC_GetHrtfHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ +ivas_error IVAS_DEC_GetHrtfHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ +#else + IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ +#endif ); /*! r: error code */ ivas_error IVAS_DEC_GetHrtfCRendHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + #ifdef NONBE_FIX_BINARY_BINAURAL_READING +IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ +#else + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ +#endif ); ivas_error IVAS_DEC_GetHrtfFastConvHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ +#else + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ +#endif ); ivas_error IVAS_DEC_GetHrtfParamBinHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +#else + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +#endif ); diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 95d599d6d..e2bd37600 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2511,8 +2511,12 @@ ivas_error IVAS_DEC_FeedCustomLsData( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ +#else IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ +#endif ) { test(); @@ -2522,7 +2526,11 @@ ivas_error IVAS_DEC_GetHrtfHandle( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + *hHrtfTD = &hIvasDec->st_ivas->hHrtfTD; +#else *hHrtfTD = hIvasDec->st_ivas->hHrtfTD; +#endif return IVAS_ERR_OK; } @@ -2535,8 +2543,12 @@ ivas_error IVAS_DEC_GetHrtfHandle( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfCRendHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ +#else IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ +#endif ) { test(); @@ -2546,7 +2558,11 @@ ivas_error IVAS_DEC_GetHrtfCRendHandle( return IVAS_ERR_WRONG_PARAMS; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + *hSetOfHRTF = &hIvasDec->st_ivas->hSetOfHRTF; +#else *hSetOfHRTF = hIvasDec->st_ivas->hSetOfHRTF; +#endif return IVAS_ERR_OK; } @@ -2559,8 +2575,12 @@ ivas_error IVAS_DEC_GetHrtfCRendHandle( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfFastConvHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ +#else IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ +#endif ) { test(); @@ -2570,7 +2590,11 @@ ivas_error IVAS_DEC_GetHrtfFastConvHandle( return IVAS_ERR_WRONG_PARAMS; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + *hHrtfFastConv = &hIvasDec->st_ivas->hHrtfFastConv; +#else *hHrtfFastConv = hIvasDec->st_ivas->hHrtfFastConv; +#endif return IVAS_ERR_OK; } @@ -2583,8 +2607,12 @@ ivas_error IVAS_DEC_GetHrtfFastConvHandle( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfParamBinHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +#else IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +#endif ) { test(); @@ -2594,7 +2622,11 @@ ivas_error IVAS_DEC_GetHrtfParamBinHandle( return IVAS_ERR_WRONG_PARAMS; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + *hHrtfParambin = &hIvasDec->st_ivas->hHrtfParambin; +#else *hHrtfParambin = hIvasDec->st_ivas->hHrtfParambin; +#endif return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index ef2c477a3..c6644b573 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -101,6 +101,10 @@ ivas_error ivas_hrtf_init( hHrtf->pOut_to_bin_diffuse_im_fx[j] = NULL; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hHrtf->init_from_rom = 1; +#endif + return IVAS_ERR_OK; } @@ -220,8 +224,36 @@ static ivas_error ivas_rend_initCrend_fx( return IVAS_ERR_INTERNAL_FATAL; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( hSetOfHRTF == NULL ) || + ( ( hSetOfHRTF->hHRTF_hrir_combined == NULL ) && ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) && ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) || + ( ( hSetOfHRTF->hHRTF_hrir_combined == NULL ) && ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) && ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL ) ) || + ( ( hSetOfHRTF->hHRTF_brir_combined == NULL ) && ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) && ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) || + ( ( hSetOfHRTF->hHRTF_hrir_foa == NULL ) && ( inConfig == IVAS_AUDIO_CONFIG_FOA ) ) || + ( ( hSetOfHRTF->hHRTF_hrir_hoa2 == NULL ) && ( inConfig == IVAS_AUDIO_CONFIG_HOA2 ) ) || + ( ( hSetOfHRTF->hHRTF_hrir_hoa3 == NULL ) && ( inConfig == IVAS_AUDIO_CONFIG_HOA3 ) ) ) +#else IF( hSetOfHRTF == NULL ) +#endif { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hHrtf->init_from_rom = 1; +#endif IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { hHrtf->max_num_ir = sub( hHrtf->max_num_ir, 1 ); /* subtract LFE */ @@ -903,6 +935,10 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hHrtf->init_from_rom = 0; + move16(); +#endif IF( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { hHrtf->max_num_ir = sub( hHrtf->max_num_ir, 1 ); /* subtract LFE */ @@ -912,12 +948,24 @@ static ivas_error ivas_rend_initCrend_fx( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( hSetOfHRTF->hHRTF_brir_combined == NULL ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); + } +#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_brir_combined->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_brir_combined->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_brir_combined->index_frequency_max_diffuse; } ELSE { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( hSetOfHRTF->hHRTF_hrir_combined == NULL ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); + } +#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_combined->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_combined->index_frequency_max_diffuse; @@ -1017,6 +1065,12 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA3 ) ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( hSetOfHRTF->hHRTF_hrir_hoa3 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); + } +#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; @@ -1057,6 +1111,12 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA2 ) ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( hSetOfHRTF->hHRTF_hrir_hoa2 == NULL ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); + } +#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse; @@ -1097,6 +1157,12 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_FOA ) ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( hSetOfHRTF->hHRTF_hrir_foa == NULL ) + { + return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); + } +#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse; diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 93f9fbd83..a9167f95b 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -54,6 +54,10 @@ ivas_error ivas_HRTF_binary_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary!" ); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + set_c( (int8_t *) ( *hHrtfTD ), 0, (int32_t) sizeof( TDREND_HRFILT_FiltSet_t ) ); +#endif + return IVAS_ERR_OK; } @@ -184,6 +188,10 @@ ivas_error ivas_HRTF_parambin_binary_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for parametric binauralizer HRTF tables!" ); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + set_c( (int8_t *) ( *hHrtfParambin ), 0, (int32_t) sizeof( HRTFS_PARAMBIN ) ); +#endif + return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index 1b5bc0d1b..8b11d1f7a 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -802,8 +802,11 @@ ivas_error ivas_td_binaural_open_ext_fx( { directivity_fx = hRendCfg->directivity_fx; } - +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + return ivas_td_binaural_open_unwrap_fx( pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity_fx, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns, SrcInd ); +#else return ivas_td_binaural_open_unwrap_fx( &pTDRend->hHrtfTD, outFs, *num_src, ivas_format, transport_config, directivity_fx, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns, SrcInd ); +#endif } /*---------------------------------------------------------------------* * ivas_td_binaural_renderer_ext() diff --git a/lib_rend/ivas_objectRenderer_mix_fx.c b/lib_rend/ivas_objectRenderer_mix_fx.c index 0e61282d4..589baf509 100644 --- a/lib_rend/ivas_objectRenderer_mix_fx.c +++ b/lib_rend/ivas_objectRenderer_mix_fx.c @@ -38,6 +38,9 @@ #include "ivas_error.h" #include "wmc_auto.h" #include "ivas_rom_rend.h" +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#include "ivas_rom_binaural_crend_head.h" +#endif #include "ivas_prot_fx.h" /*-------------------------------------------------------------------* @@ -153,7 +156,12 @@ void TDREND_MIX_Dealloc_fx( hBinRendererTd->Listener_p = NULL; } /* Dealloc HR filter set */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + test(); + IF( ( *hBinRendererTd->pHrFiltSet_p != NULL ) && ( hBinRendererTd->HrFiltSet_p != NULL ) ) +#else IF( hBinRendererTd->HrFiltSet_p != NULL ) +#endif { IF( EQ_16( hBinRendererTd->HrFiltSet_p->FilterMethod, TDREND_HRFILT_Method_BSplineModel ) ) { @@ -182,8 +190,18 @@ void TDREND_MIX_Dealloc_fx( hBinRendererTd->HrFiltSet_p->RightFiltSet_p_fx = NULL; } } + +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( EQ_16( hBinRendererTd->HrFiltSet_p->ModelParams.modelROM, 1 ) ) + { + free( hBinRendererTd->HrFiltSet_p ); + hBinRendererTd->HrFiltSet_p = NULL; + *hBinRendererTd->pHrFiltSet_p = NULL; + } +#else free( hBinRendererTd->HrFiltSet_p ); hBinRendererTd->HrFiltSet_p = NULL; +#endif } return; @@ -247,6 +265,11 @@ ivas_error TDREND_MIX_Init_fx( { hBinRendererTd->HrFiltSet_p = *hHrtfTD; } + +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hBinRendererTd->pHrFiltSet_p = hHrtfTD; +#endif + IF( NE_32( hBinRendererTd->HrFiltSet_p->SampleRate, output_Fs ) ) { return ( IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "The sampling rate for the HR filter set does not match the output sampling rate.\n" ) ); @@ -410,9 +433,26 @@ static ivas_error DefaultBSplineModel_fx( HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; // Q23 BREAK; case 16000: +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + for ( i = 0; i < 3; i++ ) + { + HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); + if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + } + floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + HrFiltSet_p->lr_energy_and_iac_fx[0] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[0]; + HrFiltSet_p->lr_energy_and_iac_fx[1] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[1]; + HrFiltSet_p->lr_energy_and_iac_fx[2] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[2]; +#else HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; // Q23 HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; // Q23 HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; // Q23 +#endif BREAK; } diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 2b4c3e919..456db9e26 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -57,42 +57,42 @@ extern Word32 CRendBin_Combined_HRIR_latency_s_fx; /* Sample Rate = 48000 */ extern Word16 CRendBin_Combined_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[15]; +extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]; extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ extern Word16 CRendBin_Combined_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[15]; +extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]; extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ extern Word16 CRendBin_Combined_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[15]; +extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]; extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; @@ -106,42 +106,42 @@ extern Word32 CRendBin_FOA_HRIR_latency_s_fx; /* Sample Rate = 48000 */ extern Word16 CRendBin_FOA_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[4]; +extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[FOA_CHANNELS]; extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[4][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[4][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ extern Word16 CRendBin_FOA_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[4]; +extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[FOA_CHANNELS]; extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[4][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[4][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ extern Word16 CRendBin_FOA_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[4]; +extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[FOA_CHANNELS]; extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[4][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[4][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; @@ -154,42 +154,42 @@ extern Word32 CRendBin_HOA2_HRIR_latency_s_fx; /* Sample Rate = 48000 */ extern Word16 CRendBin_HOA2_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[9]; +extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[HOA2_CHANNELS]; extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[9][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[9][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ extern Word16 CRendBin_HOA2_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[9]; +extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[HOA2_CHANNELS]; extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[9][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[9][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ extern Word16 CRendBin_HOA2_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[9]; +extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[HOA2_CHANNELS]; extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[9][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[9][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; @@ -201,42 +201,42 @@ extern Word32 CRendBin_HOA3_HRIR_latency_s_fx; /* Sample Rate = 48000 */ extern Word16 CRendBin_HOA3_HRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[16]; +extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[HOA3_CHANNELS]; extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[16][BINAURAL_CHANNELS][240]; -extern Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[16][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240]; +extern Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 32000 */ extern Word16 CRendBin_HOA3_HRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[16]; +extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[HOA3_CHANNELS]; extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[16][BINAURAL_CHANNELS][160]; -extern Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[16][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160]; +extern Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]; /* Sample Rate = 16000 */ extern Word16 CRendBin_HOA3_HRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; +extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[16]; +extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[HOA3_CHANNELS]; extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[16][BINAURAL_CHANNELS][80]; -extern Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[16][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80]; +extern Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]; extern Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]; @@ -249,42 +249,63 @@ extern Word32 CRendBin_Combined_BRIR_latency_s_fx; /* Sample Rate = 48000 */ extern Word16 CRendBin_Combined_BRIR_max_num_iterations_48kHz; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]; +extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[15]; +extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; -extern Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][2955]; -extern Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][2955]; +extern Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; +extern Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS][2885]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS][2885]; /* Sample Rate = 32000 */ extern Word16 CRendBin_Combined_BRIR_max_num_iterations_32kHz; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]; +extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[15]; +extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; -extern Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][2819]; -extern Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][2819]; +extern Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819]; +extern Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS][2870]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS][2870]; /* Sample Rate = 16000 */ extern Word16 CRendBin_Combined_BRIR_max_num_iterations_16kHz; -extern UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]; +extern UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]; +extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[15]; +extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; -extern Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][1774]; -extern Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][1774]; +extern Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774]; +extern Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2522]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2522]; + +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +extern const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ + +extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ + +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +#else +extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +#endif +#endif + #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index be015058b..8b51d8f2a 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -57,33 +57,33 @@ const Word32 CRendBin_Combined_HRIR_latency_s_fx = 44741;/*Q-31*/ /* Sample Rate = 48000 */ const Word16 CRendBin_Combined_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[15]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 32000 */ const Word16 CRendBin_Combined_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[15]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 16000 */ const Word16 CRendBin_Combined_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[15]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -97,33 +97,33 @@ const Word32 CRendBin_FOA_HRIR_latency_s_fx = 44741; // Q31 /* Sample Rate = 48000 */ const Word16 CRendBin_FOA_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[4]={0, 0, 0, 0}; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 32000 */ const Word16 CRendBin_FOA_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[4]={0, 0, 0, 0}; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 16000 */ const Word16 CRendBin_FOA_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[4]={0, 0, 0, 0}; +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -136,33 +136,33 @@ const Word32 CRendBin_HOA2_HRIR_latency_s_fx = 44741; // Q31 /* Sample Rate = 48000 */ const Word16 CRendBin_HOA2_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[9]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 32000 */ const Word16 CRendBin_HOA2_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[9]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 16000 */ const Word16 CRendBin_HOA2_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[9]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -174,34 +174,34 @@ const Word32 CRendBin_HOA3_HRIR_latency_s_fx = 44741;/*Q-31*/ /* Sample Rate = 48000 */ const Word16 CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 1; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 32000 */ const Word16 CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 1; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; /* Sample Rate = 16000 */ const Word16 CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 1; -const UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; -const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[HOA3_CHANNELS]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -213,35 +213,35 @@ const Word32 CRendBin_Combined_BRIR_latency_s_fx = 313176;/*Q-31*/ /* Sample Rate = 48000 */ const Word16 CRendBin_Combined_BRIR_max_num_iterations_48kHz = 22; -const UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[15][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; +const UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {40, 40}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[15][BINAURAL_CHANNELS][22]={{{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240},{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240}},{{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240},{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240}},{{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240},{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240}},{{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240},{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240}},{{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240},{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240}},{{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240},{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240}},{{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240},{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240}},{{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240},{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240}},{{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240},{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240}},{{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240},{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240}},{{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240},{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240}},{{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240},{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240}},{{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240},{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240}},{{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240},{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240}},{{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240},{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240}}}; +const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240},{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240}},{{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240},{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240}},{{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240},{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240}},{{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240},{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240}},{{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240},{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240}},{{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240},{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240}},{{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240},{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240}},{{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240},{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240}},{{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240},{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240}},{{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240},{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240}},{{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240},{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240}},{{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240},{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240}},{{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240},{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240}},{{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240},{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240}},{{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240},{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz = 98; -const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[15]={0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[15]={7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907,}; +const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[HRTF_LS_CHANNELS]={0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907,}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98},{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98}}; /* Sample Rate = 32000 */ const Word16 CRendBin_Combined_BRIR_max_num_iterations_32kHz = 22; -const UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[15][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; +const UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22}, {22, 22} }; const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {40, 40}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[15][BINAURAL_CHANNELS][22]={{{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160},{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160}},{{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160},{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160}},{{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160},{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160}},{{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160},{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160}},{{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160},{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160}},{{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160},{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160}},{{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160},{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160}},{{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160},{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160}},{{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160},{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160}},{{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160},{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160}},{{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160},{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160}},{{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160},{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160}},{{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160},{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160}},{{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160},{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160}},{{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160},{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160}}}; +const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160},{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160}},{{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160},{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160}},{{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160},{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160}},{{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160},{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160}},{{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160},{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160}},{{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160},{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160}},{{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160},{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160}},{{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160},{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160}},{{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160},{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160}},{{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160},{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160}},{{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160},{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160}},{{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160},{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160}},{{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160},{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160}},{{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160},{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160}},{{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160},{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz = 97; -const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[15]={0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[15]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907,}; +const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[HRTF_LS_CHANNELS]={0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907,}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97},{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97}}; /* Sample Rate = 16000 */ const Word16 CRendBin_Combined_BRIR_max_num_iterations_16kHz = 23; -const UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[15][BINAURAL_CHANNELS]={{23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23} }; +const UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS]={{23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23}, {23, 23} }; const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {40, 40}; -const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[15][BINAURAL_CHANNELS][23]={{{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80},{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80}},{{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80},{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80}},{{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80},{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80}},{{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80},{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80}},{{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80},{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80}},{{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80},{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80}},{{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80},{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80}},{{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80},{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80}},{{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80},{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80}},{{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80},{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80}},{{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80},{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80}},{{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80},{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80}},{{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80},{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80}},{{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80},{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80}},{{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80},{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80}}}; +const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]={{{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80},{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80}},{{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80},{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80}},{{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80},{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80}},{{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80},{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80}},{{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80},{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80}},{{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80},{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80}},{{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80},{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80}},{{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80},{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80}},{{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80},{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80}},{{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80},{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80}},{{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80},{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80}},{{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80},{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80}},{{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80},{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80}},{{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80},{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80}},{{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80},{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz = 77; -const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[15]={0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[15]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; +const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[HRTF_LS_CHANNELS]={0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]={{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77},{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77}}; //BRIR and HRIR coeff tables in Q29 -const Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][2955] ={ +const Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955] ={ { { -4881767, @@ -9213,7 +9213,7 @@ const Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][295 0, 0, 0, 0, }, }, }; -const Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][2955] ={ +const Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955] ={ { { 5294084, @@ -18185,7 +18185,7 @@ const Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][295 0, 0, 0, 0, }, }, }; -const Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][2819] ={ +const Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819] ={ { { -4883915, @@ -26737,7 +26737,7 @@ const Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][281 0, 0, 0, 0, 0, 0, 0, 0, }, }, }; -const Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][2819] ={ +const Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819] ={ { { 5241471, @@ -35289,7 +35289,7 @@ const Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][281 0, 0, 0, 0, 0, 0, 0, 0, }, }, }; -const Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][1774] ={ +const Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774] ={ { { 5815386, @@ -40721,7 +40721,7 @@ const Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][177 0, 0, 0, }, }, }; -const Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][1774] ={ +const Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774] ={ { { -2848100, @@ -46153,7 +46153,7 @@ const Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][177 0, 0, 0, }, }, }; -const Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 591356864, @@ -46965,7 +46965,7 @@ const Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[15][BINAURAL_CHANNELS][240 -40265, 80531, 23622, -60130, 4295, 62277, 0, -26844, 38118, }, }, }; -const Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 11671574, @@ -47777,7 +47777,7 @@ const Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[15][BINAURAL_CHANNELS][240 74088, 16643, -84826, -23085, 49392, -11811, -51540, 14496, 30602, }, }, }; -const Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 684059456, @@ -48349,7 +48349,7 @@ const Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[15][BINAURAL_CHANNELS][160 -338522336, -360246272, -386598592, -406292640, -400060640, -361901472, -311420032, -275072800, -260514992, }, }, }; -const Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 12131672, @@ -48921,7 +48921,7 @@ const Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[15][BINAURAL_CHANNELS][160 -154181280, -140419664, -114481280, -68539624, -9762461, 36551784, 49731428, 34809636, 11406359, }, }, }; -const Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 665281280, @@ -49253,7 +49253,7 @@ const Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[15][BINAURAL_CHANNELS][80] 47567300, 14498199, -13151190, -28034862, -46559592, -86153288, -128819488, -143185616, -134899024, }, }, }; -const Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 12014097, @@ -49585,7 +49585,7 @@ const Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[15][BINAURAL_CHANNELS][80] -284300000, -264724608, -235417888, -208847072, -196258528, -178760304, -131210712, -66350264, -17217988, }, }, }; -const Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[16][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 523696096, @@ -50451,7 +50451,7 @@ const Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[16][BINAURAL_CHANNELS][240] ={ 40212704, 35827544, 37678676, 43050604, 45202920, 52891448, 79491256, 120323512, 151594096, }, }, }; -const Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[16][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240] ={ { { -94963336, @@ -51317,7 +51317,7 @@ const Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[16][BINAURAL_CHANNELS][240] ={ 50771344, 46590196, 50434728, 51454780, 54419384, 66729296, 78190416, 67669360, 27167816, }, }, }; -const Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[16][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 500112448, @@ -51927,7 +51927,7 @@ const Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[16][BINAURAL_CHANNELS][160] ={ 147960544, 147701776, 143530832, 130539624, 107595912, 81434192, 62075700, 53886272, 52787832, }, }, }; -const Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[16][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160] ={ { { -95109368, @@ -52537,7 +52537,7 @@ const Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[16][BINAURAL_CHANNELS][160] ={ 11628087, -2854006, -20797842, -39668316, -51709260, -50203336, -36630704, -19493246, -5658620, }, }, }; -const Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[16][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 474517120, @@ -52891,7 +52891,7 @@ const Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[16][BINAURAL_CHANNELS][80] ={ -74211128, -74067784, -72268728, -71680320, -70314520, -61509300, -43222404, -22516366, -9305047, }, }, }; -const Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[16][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80] ={ { { -95201168, @@ -53245,7 +53245,7 @@ const Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[16][BINAURAL_CHANNELS][80] ={ -7124814, -360777, 5003637, 10241886, 19488950, 31398358, 37372120, 30353608, 11592654, }, }, }; -const Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[9][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 512962432, @@ -53733,7 +53733,7 @@ const Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[9][BINAURAL_CHANNELS][240] ={ -28724742, -38796440, -25851408, -2009508, -9972914, -33472828, 14603426, 167614864, 316267424, }, }, }; -const Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[9][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240] ={ { { -150097296, @@ -54221,7 +54221,7 @@ const Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[9][BINAURAL_CHANNELS][240] ={ 21925272, 38224672, 65255048, 67648416, 60901024, 105280384, 197452000, 226874128, 103426568, }, }, }; -const Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[9][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 481896416, @@ -54565,7 +54565,7 @@ const Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[9][BINAURAL_CHANNELS][160] ={ 83516712, 79278656, 72248864, 60511796, 45328012, 31496606, 23372138, 21165598, 21604760, }, }, }; -const Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[9][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160] ={ { { -150290032, @@ -54909,7 +54909,7 @@ const Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[9][BINAURAL_CHANNELS][160] ={ -6684043, -15480136, -24956982, -32718524, -34671124, -29163902, -19150186, -9488120, -2658048, }, }, }; -const Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[9][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 458548416, @@ -55109,7 +55109,7 @@ const Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[9][BINAURAL_CHANNELS][80] ={ 79717816, 70102456, 60736744, 54407572, 46471008, 30596274, 10727755, -2694018, -6955163, }, }, }; -const Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[9][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80] ={ { { -150242784, @@ -55309,7 +55309,7 @@ const Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[9][BINAURAL_CHANNELS][80] ={ -54154168, -55454472, -53721452, -52272436, -55008332, -56615184, -47854524, -29224568, -9227200, }, }, }; -const Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[4][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 518734336, @@ -55527,7 +55527,7 @@ const Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[4][BINAURAL_CHANNELS][240] ={ -180487408, -169009648, -181035552, -197899744, -193123744, -179249920, -193284272, -243472032, -290958272, }, }, }; -const Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[4][BINAURAL_CHANNELS][240] ={ +const Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240] ={ { { -124898720, @@ -55745,7 +55745,7 @@ const Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[4][BINAURAL_CHANNELS][240] ={ -23336704, -32086090, -45628660, -37964828, -24686936, -36248452, -67124968, -75412112, -33794412, }, }, }; -const Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[4][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 542228352, @@ -55899,7 +55899,7 @@ const Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[4][BINAURAL_CHANNELS][160] ={ -234983568, -235941344, -236356880, -230784160, -213989760, -188165200, -163468608, -148763712, -143858320, }, }, }; -const Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[4][BINAURAL_CHANNELS][160] ={ +const Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160] ={ { { -124746248, @@ -56053,7 +56053,7 @@ const Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[4][BINAURAL_CHANNELS][160] ={ -13269838, -4217121, 9205726, 27543626, 44898516, 51582020, 43380780, 26081188, 8227547, }, }, }; -const Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[4][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 572464896, @@ -56143,7 +56143,7 @@ const Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[4][BINAURAL_CHANNELS][80] ={ -159711040, -163078832, -164956816, -167140800, -170631536, -168793824, -151206464, -119230440, -92601104, }, }, }; -const Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[4][BINAURAL_CHANNELS][80] ={ +const Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80] ={ { { -124641560, @@ -59586,6 +59586,348 @@ const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS] -48022028, -25965224, -49312668, 19488414, 23572928, -15180562, -392990, -47734268, -2894808, 14061723, -6515466, }, }; + +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { + 131936432,125285536,105934832,77097344,45729324,19356880,2523696,0,0, + 0,1602425,4763253,5796595,5698884,5608690,5175704,3880368,2303444, + 1553033,1902670,2661537,3300414,3919560,4475624,4485288,3976468,3688169, + 3682129,3375844,2619661,1976758,1906026,2165066,2186943,1765500,1162325, + 671759,348160,140123,27783,0,0,0,148981,534991, + 939926,1281242,1547798,1665910,1550617,1228897,835102,478486,185757, + 0,0,0,0,4294,124554,284273,410840,479828, + 507343,493652,417417,278367,114890,0,0,0,0, + 0,0,0,0,0,29125,130728,242531,313264, + 326954,282528,204816,121735,46976,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,31943,114353,173543, + 205218,205755,176362,128043,69927,20803,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,3355,38117,83214,127372,170993,215553,257966, + 294607,327222,360643,395137,425738,452447,480096,507208,525462, + 533247,534186,526804,505463,469896,424799,372856,312190,242397, + 168711,95831,28319,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,102810,72074,0, + 226962,443858,219445,0,214882,1013209,77846,0,273535, + 1385798,289239,0,472983,1241648,688671,0,306821,870536, + 792153,0,115695,613375,552574,0,0,434462,205890, + 34762,26709,182938,117843,0 +}; +const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8209721,8156956,8050127,7984940,7992858,8011649,7974747,7910306,7917252, + 8038476,8174723,8228729,8192717,8124794,8070352,8029995,7989956,7953608, + 7931152,7912210,7870745,7803402,7745101,7727896,7735563,7724331,7693670, + 7672548,7668253,7662666,7647508,7638633,7652147,7680265,7699593,7698955, + 7689828,7687614,7690835,7685852,7667229,7645042,7629506,7617787,7601639, + 7578545,7554822,7537315,7524279,7507108,7481430,7453328,7431803,7415991, + 7395254,7364820,7335141,7319069,7310202,7296948,7280120,7270700,7273946, + 7282989,7288836,7292510,7303600,7327768,7359376,7389357,7418784,7458856, + 7515186,7577119,7632232,7684091,7741771,7803922,7858506,7897295,7924793, + 7950529,7975309,7989134,7983815,7964337,7942418,7920028,7885853,7832460, + 7773178,7719675,7667640,7605540,7531820,7456659,7388182,7322718,7251305, + 7173342,7099371,7039023,6989942,6943645,6900871,6876377,6876200,6891753, + 6912280,6938008,6976184,7027514,7081939,7129159,7169768,7212416,7260113, + 7303961,7334160,7353923,7375390,7399868,7413919,7410756,7397888,7384995, + 7371128,7347783,7311469,7269433,7231533,7198642,7162562,7118413,7073358, + 7038218,7011467,6978885,6936976,6896929,6866243,6838636,6804318,6763793, + 6726715,6699377,6677726,6654422,6630095,6613880,6612001,6619165,6625113, + 6629517,6642997,6668750,6697196,6718344,6734173,6753895,6779589,6802146, + 6813185,6816633,6823486,6836086,6844013,6839567,6830432,6829887,6834652, + 6833897,6825424,6817447,6817430,6823444,6827572,6826137,6824845,6832135, + 6847612,6860472,6863735,6867082,6885344,6912573,6928050,6933679,6949215, + 6980018,7009084,7024486,7037715,7065515,7103221,7130283,7141717,7156523, + 7182804,7191302,7148830,7066479,6973039,6845448,6642997,6369529,6067757, + 5757018,5407708,4989863,4529504,4091224,3695693,3270760,2711684,2000297, + 1252050,651123,273904,89170,20652,2843,209,134,134, + 125,117,92,75,75,75,58,50,50, + 58,50,41,41,50,41,41,41,41, + 41,41,41,41,41,41,41,41,41, + 41,41,41,41,41 +}; +const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8209721,8156956,8050144,7984965,7992850,8011640,7974756,7910323,7917252, + 8038484,8174707,8228738,8192709,8124794,8070361,8030003,7989948,7953583, + 7931127,7912202,7870737,7803402,7745101,7727896,7735563,7724331,7693679, + 7672548,7668236,7662658,7647491,7638624,7652147,7680265,7699609,7698964, + 7689820,7687597,7690827,7685844,7667229,7645050,7629472,7617779,7601639, + 7578545,7554822,7537315,7524288,7507133,7481447,7453337,7431803,7415982, + 7395229,7364812,7335141,7319077,7310185,7296931,7280120,7270700,7273955, + 7282998,7288836,7292494,7303583,7327776,7359401,7389382,7418776,7458856, + 7515186,7577127,7632241,7684082,7741787,7803939,7858523,7897295,7924793, + 7950529,7975309,7989125,7983824,7964320,7942426,7920062,7885853,7832443, + 7773194,7719675,7667640,7605556,7531829,7456675,7388199,7322726,7251305, + 7173333,7099379,7039032,6989967,6943653,6900880,6876377,6876226,6891753, + 6912271,6937999,6976184,7027514,7081931,7129151,7169768,7212416,7260122, + 7303961,7334160,7353940,7375398,7399868,7413910,7410731,7397871,7384978, + 7371145,7347791,7311477,7269450,7231542,7198633,7162554,7118413,7073358, + 7038218,7011475,6978885,6936976,6896920,6866226,6838628,6804310,6763785, + 6726707,6699369,6677709,6654414,6630095,6613889,6612010,6619148,6625071, + 6629508,6642989,6668750,6697204,6718352,6734190,6753920,6779597,6802146, + 6813210,6816641,6823495,6836095,6844030,6839559,6830457,6829904,6834677, + 6833905,6825416,6817455,6817421,6823428,6827555,6826129,6824837,6832135, + 6847620,6860472,6863735,6867082,6885336,6912582,6928059,6933679,6949232, + 6980026,7009084,7024477,7037706,7065489,7103188,7130275,7141708,7156497, + 7182812,7191285,7148847,7066488,6973047,6845439,6642997,6369529,6067757, + 5757001,5407699,4989863,4529504,4091224,3695702,3270751,2711693,2000297, + 1252050,651123,273904,89170,20652,2843,209,134,134, + 125,117,92,75,75,75,58,50,50, + 58,50,41,41,50,41,41,41,41, + 41,41,41,41,41,41,41,41,41, + 41,41,41,41,41 +}; +const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { + 131125216,129227112,119736576,105149792,87165424,65548180,45102524,26414452,12630962, + 2261837,646258,0,0,0,362790,1269699,3305916,5226035, + 5552185,5544266,5313545,5242007,4972498,4406099,3304843,2138491,1245809, + 945832,1040724,1586856,2087488,2519669,2930509,3330210,3706959,3852988, + 3845069,3506438,3230889,3049963,3020838,2972117,2692944,2226269,1634369, + 1306206,1176284,1344056,1533169,1651817,1468073,1147695,736184,393929, + 141465,23622,0,0,0,0,0,0,0, + 0,0,31004,186025,403995,663840,869999,1052669,1200174, + 1230910,1195208,1010927,774704,504121,258100,82812,13824,0, + 0,0,0,0,0,0,0,0,0, + 0,35567,94757,127104,150189,159048,139586,103616,29662, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,13287,46305,75833,95294,77980,44426,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,13153,45768,78383,106434, + 117574,114487,101871,68719,36641,6039,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,1476, + 5234,21072,40667,63619,89120,116098,144015,171932,199715, + 227901,255818,281723,304405,324941,341584,357824,373796,388962, + 403995,419296,437818,458621,488820,521301,557674,596329,636728, + 680886,727728,776315,821546,862751,897916,926773,952409,971870, + 980460,981802,955227,918049,865167,793897,713233,613106,507477, + 398224,342255,316082,334604,338228 +}; +const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8747993,8732977,8657866,8592845,8534553,8549703,8574332,8613196,8612450, + 8594632,8548151,8528631,8527079,8602383,8683241,8772412,8811402,8825092, + 8787822,8745552,8699960,8676052,8653847,8634210,8606620,8577981,8553109, + 8534922,8521190,8494783,8457906,8405301,8354525,8310963,8294462,8290268, + 8294278,8284279,8267812,8241648,8222362,8207531,8203647,8196752,8187852, + 8170672,8158450,8153660,8165857,8182684,8201064,8209352,8210920,8201391, + 8193506,8188086,8186669,8185008,8178398,8165219,8147653,8126564,8107262, + 8090653,8075973,8060647,8040892,8017060,7990510,7965369,7942812,7924139, + 7905508,7885266,7858574,7828903,7797253,7770124,7745051,7723047,7698192, + 7671231,7638683,7606840,7575458,7552800,7532081,7514280,7493736,7472068, + 7448614,7429295,7412736,7405756,7399180,7393182,7382990,7372018,7362119, + 7358680,7359552,7368629,7377118,7384718,7391127,7398953,7413675,7435679, + 7462522,7492302,7520043,7544714,7568412,7592915,7621662,7651325,7681599, + 7702873,7719423,7728886,7735043,7740672,7747517,7751812,7754412,7743650, + 7728089,7705339,7680970,7656341,7632308,7603568,7571683,7527366,7481606, + 7433699,7390347,7348345,7307132,7260525,7210319,7153108,7097458,7044149, + 6995864,6948351,6898883,6845179,6788657,6732512,6680016,6632990,6592154, + 6553113,6515029,6478094,6441947,6416664,6397714,6388260,6386465,6386851, + 6388319,6391700,6396364,6411102,6429029,6451720,6471844,6489796,6501641, + 6513435,6525204,6542518,6559405,6575670,6584344,6589771,6589813,6590845, + 6592531,6595845,6596365,6592707,6580091,6564161,6543961,6524642,6505902, + 6486113,6462969,6434800,6400113,6364034,6328861,6297445,6268521,6239597, + 6208098,6172732,6136241,6100909,6071330,6044722,6020084,5990858,5959116, + 5923599,5889046,5855634,5825838,5795177,5763938,5725518,5685253,5642211, + 5600763,5560540,5523688,5486661,5449525,5408043,5366612,5325264,5291257, + 5260940,5238031,5214778,5191290,5165126,5142795,5126186,5122067,5121799, + 5124433,5124877,5123837,5133241,5151268,5182239,5223192,5269715,5328527, + 5411331,5510141,5612029,5649811,5591443,5269488,4824515,4151102,3472472, + 2790361,2355655,2029229,1865232,1832432 +}; +const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 8747984,8732969,8657857,8592837,8534561,8549686,8574315,8613188,8612450, + 8594632,8548151,8528622,8527070,8602392,8683241,8772404,8811402,8825109, + 8787822,8745552,8699951,8676044,8653847,8634226,8606620,8577964,8553100, + 8534914,8521190,8494808,8457931,8405310,8354525,8310963,8294471,8290276, + 8294278,8284287,8267820,8241639,8222362,8207540,8203664,8196752,8187826, + 8170663,8158450,8153685,8165873,8182684,8201064,8209360,8210945,8201416, + 8193531,8188095,8186669,8185008,8178398,8165219,8147653,8126539,8107237, + 8090644,8075973,8060664,8040875,8017043,7990510,7965369,7942812,7924122, + 7905499,7885283,7858574,7828903,7797270,7770116,7745034,7723056,7698192, + 7671222,7638675,7606840,7575466,7552809,7532089,7514280,7493736,7472068, + 7448597,7429287,7412753,7405756,7399163,7393174,7382981,7372009,7362111, + 7358680,7359560,7368637,7377126,7384718,7391135,7398970,7413692,7435679, + 7462514,7492293,7520026,7544705,7568403,7592915,7621688,7651341,7681582, + 7702873,7719423,7728877,7735026,7740663,7747517,7751829,7754437,7743650, + 7728080,7705330,7680970,7656349,7632308,7603568,7571700,7527383,7481623, + 7433716,7390363,7348353,7307132,7260525,7210327,7153125,7097475,7044149, + 6995872,6948359,6898883,6845179,6788657,6732520,6680024,6632990,6592154, + 6553113,6515037,6478102,6441947,6416664,6397714,6388269,6386457,6386843, + 6388327,6391700,6396347,6411102,6429029,6451712,6471844,6489796,6501624, + 6513427,6525213,6542518,6559405,6575653,6584327,6589763,6589813,6590845, + 6592531,6595836,6596365,6592716,6580099,6564169,6543978,6524642,6505894, + 6486122,6462994,6434817,6400122,6364034,6328852,6297428,6268521,6239597, + 6208090,6172723,6136241,6100909,6071330,6044722,6020076,5990842,5959107, + 5923599,5889037,5855617,5825829,5795169,5763921,5725518,5685253,5642194, + 5600755,5560548,5523688,5486661,5449508,5408026,5366603,5325256,5291257, + 5260949,5238040,5214778,5191281,5165134,5142795,5126194,5122075,5121799, + 5124441,5124877,5123854,5133241,5151259,5182230,5223192,5269715,5328527, + 5411340,5510149,5612037,5649820,5591435,5269472,4824498,4151094,3472472, + 2790378,2355663,2029237,1865240,1832432 +}; + +#ifndef NONBE_FIX_AVG_IAC_CLDFB_REVERB + +const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { + 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, + 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, + 1532229,985023,437818,0,0,0,0,0,0, + 0,343865,773496,1203261,2004810,3054258,4103707,4777480,4887673, + 4998000,5066316,4966727,4867271,4767816,4765534,4763253,4760971,4569174, + 4329998,4090822,3659312,3099355,2539533,2037290,1621350,1205543,880065, + 916304,952677,988916,1233058,1477200,1721342,1912602,2090441,2268413, + 2427327,2573490,2719788,2859643,2989834,3120025,3219078,3193576,3168075, + 3142574,2987686,2832665,2677778,2583691,2504771,2425851,2397128,2401692, + 2406255,2356594,2225464,2094333,1933137,1651280,1369423,1087566,924357, + 761148,597940,625051,699677,774302,854295,937779,1021128,1026631, + 915230,803830,670014,446676,223338,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,5100,30735, + 56371,81872,173140,264408,355542,419698,477144,534455,552037, + 543044,533918,485599,378494,271254,173946,115964,57982,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,671,1476,2415,99723,261321,423054,646795, + 963549,1280302,1632087,2124129,2616037,3108080,3841982,4575885,5309922, + 6280181,7309766,8339216,8750996,8750996 +}; +const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 9335246,9335246,9316514,9269680,9222847,9180350,9155201,9130044,9104894, + 9126688,9148473,9170267,9191549,9212688,9233844,9234423,9221295,9208167, + 9191205,9168497,9145789,9127997,9129884,9131780,9133676,9164823,9195978, + 9227125,9267550,9310290,9353038,9385225,9410374,9435531,9445170,9431538, + 9417907,9399855,9364128,9328409,9292682,9270670,9248667,9226655,9215783, + 9207688,9199593,9183605,9162356,9141108,9116244,9085961,9055678,9028608, + 9014432,9000255,8986078,8975962,8965845,8955728,8926108,8891606,8857103, + 8819145,8778896,8738639,8710806,8701604,8692401,8686227,8692209,8698190, + 8704171,8686706,8669232,8651767,8623917,8593466,8563024,8543554,8531399, + 8519252,8509748,8504203,8498667,8489716,8467083,8444459,8421835,8399773, + 8377711,8355649,8351698,8352268,8352847,8355833,8360430,8365027,8363484, + 8352721,8341959,8331028,8319460,8307884,8296308,8292063,8287827,8283582, + 8271142,8256647,8242159,8221389,8196442,8171494,8150547,8135607,8120659, + 8106465,8095225,8083992,8072760,8043073,8013394,7983706,7949422,7913997, + 7878564,7853893,7836394,7818904,7801472,7784141,7766811,7744782,7703972, + 7663169,7622359,7580802,7539253,7497696,7474266,7455367,7436467,7415496, + 7393140,7370784,7338471,7291235,7244007,7197551,7154232,7110914,7067595, + 7046615,7025627,7004647,6977485,6948779,6920073,6878751,6829015,6779278, + 6733644,6694184,6654724,6618804,6597044,6575284,6553524,6518183,6482842, + 6447501,6401632,6353137,6304634,6267229,6237215,6207201,6181045,6160677, + 6140310,6115580,6073427,6031275,5989122,5942817,5896503,5850198,5825150, + 5805428,5785707,5765742,5745626,5725510,5693398,5643285,5593180,5544358, + 5500720,5457091,5413454,5404126,5394797,5385469,5366930,5346085,5325239, + 5282164,5224274,5166376,5115566,5075376,5035186,5002731,5001238,4999736, + 4998243,4969436,4940630,4911823,4847290,4773822,4700355,4646282,4605153, + 4564023,4540250,4542523,4544788,4536869,4488241,4439612,4390983,4285488, + 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, + 4073222,4038317,3957300,3691818,3426335,3160861,2774481,2388110,2001740, + 1708239,1437966,1167685,1059581,1059581 +}; +const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 9335246,9335246,9316514,9269689,9222855,9180358,9155201,9130035,9104869, + 9126663,9148465,9170258,9191540,9212688,9233827,9234415,9221295,9208175, + 9191213,9168488,9145755,9127963,9129867,9131772,9133676,9164831,9195978, + 9227133,9267550,9310281,9353021,9385200,9410357,9435506,9445153,9431522, + 9417899,9399855,9364119,9328384,9292648,9270653,9248658,9226663,9215792, + 9207688,9199593,9183596,9162348,9141100,9116236,9085953,9055678,9028617, + 9014432,9000255,8986070,8975962,8965853,8955745,8926116,8891614,8857103, + 8819145,8778888,8738631,8710789,8701587,8692385,8686219,8692200,8698181, + 8704162,8686697,8669232,8651775,8623917,8593466,8563016,8543546,8531390, + 8519244,8509739,8504203,8498675,8489724,8467100,8444468,8421844,8399773, + 8377703,8355641,8351681,8352252,8352830,8355817,8360414,8365019,8363475, + 8352721,8341959,8331037,8319469,8307893,8296316,8292072,8287835,8283591, + 8271142,8256647,8242151,8221381,8196433,8171494,8150547,8135616,8120676, + 8106482,8095250,8084009,8072777,8043081,8013385,7983698,7949405,7913972, + 7878547,7853876,7836386,7818904,7801481,7784150,7766819,7744790,7703980, + 7663161,7622350,7580793,7539244,7497696,7474258,7455358,7436459,7415487, + 7393132,7370776,7338471,7291244,7244016,7197560,7154241,7110914,7067587, + 7046607,7025627,7004647,6977485,6948770,6920064,6878742,6829006,6779270, + 6733644,6694184,6654724,6618813,6597053,6575301,6553549,6518191,6482842, + 6447492,6401623,6353137,6304643,6267229,6237215,6207201,6181037,6160677, + 6140310,6115580,6073427,6031275,5989122,5942817,5896512,5850207,5825167, + 5805445,5785723,5765750,5745626,5725493,5693382,5643276,5593180,5544375, + 5500729,5457074,5413429,5404109,5394789,5385478,5366939,5346093,5325247, + 5282172,5224282,5166384,5115574,5075384,5035195,5002739,5001238,4999736, + 4998243,4969436,4940630,4911823,4847290,4773814,4700338,4646274,4605153, + 4564023,4540258,4542523,4544788,4536878,4488249,4439612,4390983,4285480, + 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, + 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, + 1708239,1437966,1167685,1059573,1059573 +}; +#else +/* Sample Rate = 16000 */ + +const float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {0.983044f, 0.960794f, 0.893756f, 0.783586f, 0.638963f, 0.477338f, 0.319879f, 0.183374f, 0.075909f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003842f, 0.025288f, 0.035886f, + 0.037785f, 0.035991f, 0.034784f, 0.035091f, 0.034683f, 0.030849f, 0.023146f, 0.014061f, 0.007275f, + 0.005053f, 0.006930f, 0.010589f, 0.013905f, 0.016288f, 0.018404f, 0.020849f, 0.023164f, 0.024149f, + 0.023098f, 0.020635f, 0.018325f, 0.017381f, 0.017611f, 0.017534f, 0.015650f, 0.011786f, 0.007342f, + 0.004290f, 0.003732f, 0.005148f, 0.006838f, 0.007172f, 0.005579f, 0.002632f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.001738f, 0.003011f, 0.003910f, + 0.004120f, 0.003394f, 0.001769f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.002101f, 0.004247f, 0.006330f, 0.008300f, 0.010110f, 0.011735f, 0.013165f, 0.014384f, + 0.015345f, 0.015972f, 0.016191f}; + +const float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {1.118974f, 1.115256f, 1.106210f, 1.096901f, 1.092316f, 1.094422f, 1.101140f, 1.107775f, 1.110000f, + 1.106535f, 1.099921f, 1.094914f, 1.095643f, 1.103178f, 1.114955f, 1.126292f, 1.132973f, 1.133288f, + 1.128471f, 1.121439f, 1.114842f, 1.109721f, 1.105480f, 1.100966f, 1.095650f, 1.090074f, 1.085225f, + 1.081525f, 1.078267f, 1.074026f, 1.067777f, 1.059839f, 1.051856f, 1.045772f, 1.042531f, 1.041432f, + 1.040607f, 1.038291f, 1.033910f, 1.028286f, 1.022846f, 1.018514f, 1.015152f, 1.011898f, 1.008047f, + 1.003762f, 0.999992f, 0.997770f, 0.997349f, 0.997960f, 0.998259f, 0.997177f, 0.994506f, 0.990883f, + 0.987207f, 0.984003f, 0.981133f, 0.977984f, 0.973950f, 0.968837f, 0.962915f, 0.956690f, 0.950584f, + 0.944679f, 0.938744f, 0.932399f, 0.925372f, 0.917663f, 0.909568f, 0.901511f, 0.893804f, 0.886455f, + 0.879155f, 0.871463f, 0.863142f, 0.854285f, 0.845334f, 0.836740f, 0.828656f, 0.820817f, 0.812713f, + 0.803960f, 0.794564f, 0.784952f, 0.775633f, 0.766881f, 0.758539f, 0.750156f, 0.741330f, 0.732004f, + 0.722524f, 0.713387f, 0.704919f, 0.697057f, 0.689419f, 0.681576f, 0.673350f, 0.664931f, 0.656703f, + 0.648997f, 0.641801f, 0.634760f, 0.627357f, 0.619192f, 0.610186f, 0.600526f, 0.590442f, 0.579952f, + 0.568762f, 0.556384f, 0.542389f, 0.526648f, 0.509355f, 0.490884f, 0.471542f, 0.451447f, 0.430550f, + 0.408842f, 0.386537f, 0.364126f, 0.342284f, 0.321675f, 0.302809f, 0.286016f, 0.271536f, 0.259639f, + 0.250691f, 0.245099f, 0.243192f}; + +const float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {1.118974f, 1.115254f, 1.106207f, 1.096903f, 1.092317f, 1.094425f, 1.101145f, 1.107775f, 1.109999f, + 1.106540f, 1.099921f, 1.094912f, 1.095644f, 1.103178f, 1.114952f, 1.126292f, 1.132973f, 1.133288f, + 1.128472f, 1.121439f, 1.114842f, 1.109719f, 1.105481f, 1.100965f, 1.095650f, 1.090072f, 1.085224f, + 1.081527f, 1.078270f, 1.074025f, 1.067775f, 1.059840f, 1.051856f, 1.045772f, 1.042533f, 1.041433f, + 1.040611f, 1.038292f, 1.033911f, 1.028286f, 1.022844f, 1.018512f, 1.015153f, 1.011899f, 1.008050f, + 1.003762f, 0.999995f, 0.997769f, 0.997349f, 0.997959f, 0.998259f, 0.997178f, 0.994509f, 0.990883f, + 0.987204f, 0.984003f, 0.981133f, 0.977983f, 0.973949f, 0.968836f, 0.962914f, 0.956689f, 0.950583f, + 0.944681f, 0.938745f, 0.932399f, 0.925373f, 0.917662f, 0.909567f, 0.901511f, 0.893804f, 0.886456f, + 0.879153f, 0.871467f, 0.863138f, 0.854286f, 0.845334f, 0.836740f, 0.828656f, 0.820816f, 0.812712f, + 0.803961f, 0.794567f, 0.784951f, 0.775631f, 0.766882f, 0.758540f, 0.750158f, 0.741330f, 0.732005f, + 0.722523f, 0.713388f, 0.704920f, 0.697057f, 0.689418f, 0.681575f, 0.673352f, 0.664930f, 0.656706f, + 0.648998f, 0.641802f, 0.634762f, 0.627355f, 0.619192f, 0.610187f, 0.600527f, 0.590442f, 0.579953f, + 0.568763f, 0.556383f, 0.542389f, 0.526646f, 0.509355f, 0.490883f, 0.471543f, 0.451446f, 0.430550f, + 0.408843f, 0.386537f, 0.364127f, 0.342285f, 0.321676f, 0.302809f, 0.286016f, 0.271535f, 0.259640f, + 0.250692f, 0.245099f, 0.243192f}; + + +#endif +#endif + Word32 sine_table_Q31 [361] = { 187, -37478868, -74946000, -112390808, -149800880, -187165824, -224473232, -261712288, -298872128, -335940416, -372906880, @@ -59648,4 +59990,5 @@ Word32 cosine_table_Q31 [181] = { -2121044608, -2126584448, -2131476608, -2135719552, -2139311744, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, }; + #undef WMC_TOOL_SKIP diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index a3f7bab5d..2a661121b 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -93,6 +93,7 @@ extern const Word16 HRTF_MODEL_N_CPTS_VAR[HRTF_MODEL_N_SECTIONS]; extern const Word32 SincTable_fx[321]; +#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES extern const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ @@ -101,9 +102,16 @@ extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; / extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +#else extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +#endif +#endif /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 1fe8e6a38..df3dc4e22 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -207,6 +207,7 @@ const Word32 SincTable_fx[321] /*Q31*/ = { 8716980, 8185692, 7649294, 7108665, 6564643, 6017979, 5469361, 4919434, 4368840, 3818118, 3267783, 2718370, 2170290, 1624034, 1079948, 538481, }; +#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { 131936432,125285536,105934832,77097344,45729324,19356880,2523696,0,0, 0,1602425,4763253,5796595,5698884,5608690,5175704,3880368,2303444, @@ -486,6 +487,7 @@ const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, 1708239,1437966,1167685,1059573,1059573 }; +#endif /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index fc434df90..bcc470ead 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1296,6 +1296,9 @@ typedef struct ivas_binaural_td_rendering_struct TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + TDREND_HRFILT_FiltSet_t **pHrFiltSet_p; /* pointer to HR filter set */ +#endif Word16 UseCommonDistAttenModel; /* Use common dist atten model (TRUE/FALSE) */ Word16 DistAttenEnabled; /* (TRUE/FALSE) */ @@ -1307,8 +1310,11 @@ typedef struct { Word32 binaural_latency_ns; BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + TDREND_HRFILT_FiltSet_t **hHrtfTD; +#else TDREND_HRFILT_FiltSet_t *hHrtfTD; - +#endif } TDREND_WRAPPER, *TDREND_WRAPPER_HANDLE; @@ -1330,6 +1336,9 @@ typedef struct ivas_hrtfs_structure Word16 max_num_iterations; Word16 inv_diffuse_weight_fx[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] Q15 */ Word32 latency_s_fx; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + Word16 init_from_rom; +#endif Word16 gain_lfe_fx; // Q14 } HRTFS_DATA, *HRTFS_HANDLE; /* Main Crend structure */ @@ -1580,7 +1589,11 @@ typedef struct ivas_masa_external_rendering_struct #endif REVERB_STRUCT_HANDLE hReverb; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + HRTFS_PARAMBIN_HANDLE *hHrtfParambin; +#else HRTFS_PARAMBIN_HANDLE hHrtfParambin; +#endif VBAP_HANDLE hVBAPdata; Word32 *hoa_dec_mtx; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index aea39eaa9..ab9c806f6 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -55,11 +55,13 @@ * Local constants *-------------------------------------------------------------------*/ -/* Maximum buffer length (per channel) in samples. - * Keep this separate from L_FRAME48k in case we want to support different size later */ -#define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) +/* Maximum buffer length (total) in samples. */ +#define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING #define MAX_BIN_DELAY_SAMPLES 150 /* Maximum supported rendering latency for binaural IRs */ - +#else +#define MAX_BIN_DELAY_SAMPLES 50 /* Maximum supported rendering latency for binaural IRs */ +#endif /*-------------------------------------------------------------------* * Local types @@ -207,6 +209,17 @@ typedef struct MASA_EXT_REND_HANDLE hMasaExtRend; MASA_PREREND_HANDLE hMasaPrerend; } input_masa; + +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +typedef struct hrtf_handles +{ + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; + IVAS_DEC_HRTF_HANDLE hHrtfTD; +} hrtf_handles; +#endif + struct IVAS_REND { Word32 sampleRateOut; @@ -238,13 +251,26 @@ struct IVAS_REND RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ Word16 num_subframes; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hrtf_handles hHrtfs; +#else + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; + IVAS_DEC_HRTF_HANDLE hHrtfTD; +#endif }; /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, hrtf_handles *hHrtfs ); +#else static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig ); +#endif + static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE *hMasaExtRendOut ); static void intermidiate_ext_dirac_render( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ @@ -1414,7 +1440,9 @@ static ivas_error initIsmMasaRendering( IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING inputIsm->tdRendWrapper.hHrtfTD = NULL; +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -1437,7 +1465,12 @@ static ivas_error setRendInputActiveIsm( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) + RENDER_CONFIG_DATA *hRendCfg +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + , + hrtf_handles *hrtfs +#endif +) { ivas_error error; rendering_context rendCtx; @@ -1477,7 +1510,11 @@ static ivas_error setRendInputActiveIsm( #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + inputIsm->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; +#else inputIsm->splitTdRendWrappers[i] = defaultTdRendWrapper(); +#endif } #endif @@ -1486,85 +1523,116 @@ static ivas_error setRendInputActiveIsm( error = IVAS_ERR_OK; move32(); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + inputIsm->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; +#endif + test(); - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ){ -#ifdef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ){ - return error; -} +#ifdef SPLIT_REND_WITH_HEAD_ROT_NEW + test(); + test(); + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) #else - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ){ - return error; -} + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) #endif -} -ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) -{ - IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { - return error; +#ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#endif +#else +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#endif +#endif + { + return error; + } } -} -ELSE -{ - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - Word16 ivas_format; - IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { - ivas_format = MC_FORMAT; + IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } } ELSE { - ivas_format = ISM_FORMAT; - } - - move16(); - IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - +#ifdef SPLIT_REND_WITH_HEAD_ROT_NEW +#ifndef SPLIT_REND_WITH_HEAD_ROT + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } - Word16 nchan_rend = num_src; - move16(); + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#else + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } - test(); - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - IF( Src_p->SrcSpatial_p != NULL ) + if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); + return error; } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); } - } + else if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + } +#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT - /* Open TD renderer wrappers */ - FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) - { - if ( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) +#else + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + Word16 ivas_format; + IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + ivas_format = MC_FORMAT; + } + ELSE + { + ivas_format = ISM_FORMAT; + } + + move16(); + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } - /* Assert same delay as main TD renderer */ - assert( inputIsm->splitTdRendWrappers[i].binaural_latency_ns == inputIsm->tdRendWrapper.binaural_latency_ns ); + Word16 nchan_rend = num_src; + move16(); + + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { - TDREND_SRC_t *Src_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[SrcInd[nS]]; + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; IF( Src_p != NULL ) { IF( Src_p->SrcSpatial_p != NULL ) @@ -1572,25 +1640,68 @@ ELSE Src_p->SrcSpatial_p->q_Pos_p = Q31; move16(); } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[nS]->SrcSpatial_p; + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; SrcSpatial_p->q_Pos_p = Q31; move16(); } } - } + +#ifdef SPLIT_REND_WITH_HEAD_ROT + /* Open TD renderer wrappers */ + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + if ( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Assert same delay as main TD renderer */ + assert( inputIsm->splitTdRendWrappers[i].binaural_latency_ns == inputIsm->tdRendWrapper.binaural_latency_ns ); + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } + } #endif - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { - return error; + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } } +#ifdef SPLIT_REND_WITH_HEAD_ROT_NEW + ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#endif + { + return error; + } + } +#endif + +#endif /* SPLIT_REND_WITH_HEAD_ROT_NEW */ } -} -return IVAS_ERR_OK; + return IVAS_ERR_OK; } static void clearInputIsm( @@ -1619,14 +1730,18 @@ static void clearInputIsm( IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING inputIsm->tdRendWrapper.hHrtfTD = NULL; +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { ivas_td_binaural_close_fx( &inputIsm->splitTdRendWrappers[i].hBinRendererTd ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING inputIsm->splitTdRendWrappers[i].hHrtfTD = NULL; +#endif } #endif @@ -2405,7 +2520,10 @@ static ivas_error initMcBinauralRendering( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, - UWord8 reconfigureFlag ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IVAS_DEC_HRTF_CREND_HANDLE hMixconv, +#endif + uint8_t reconfigureFlag ) { ivas_error error; Word32 binauralDelayNs; @@ -2442,7 +2560,9 @@ static ivas_error initMcBinauralRendering( IF( !reconfigureFlag || ( !useTDRend && inputMc->tdRendWrapper.hBinRendererTd != NULL ) ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING inputMc->tdRendWrapper.hHrtfTD = NULL; +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2453,7 +2573,9 @@ static ivas_error initMcBinauralRendering( IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING inputMc->splitTdRendWrappers[i].hHrtfTD = NULL; +#endif } } } @@ -2532,7 +2654,7 @@ static ivas_error initMcBinauralRendering( /* Open TD renderer wrappers */ FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { - IF( ( error = ivas_td_binaural_open_ext_fx( &inputMc->splitTdRendWrappers[i], inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputMc->splitTdRendWrappers[i], inConfig, hRendCfg, &inputMc->customLsInput, outSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } @@ -2576,9 +2698,30 @@ static ivas_error initMcBinauralRendering( { /* open CREND */ #ifdef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + hMixconv, + outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), + IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, NULL, outSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + NULL, + outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), + IVAS_ERR_OK ) ) +#endif +#else +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + hMixconv, + outSampleRate ) ), + IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + NULL, + outSampleRate ) ), + IVAS_ERR_OK ) ) + +#endif #endif { return error; @@ -2635,7 +2778,9 @@ static ivas_error initMcMasaRendering( IF( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING inputMc->tdRendWrapper.hHrtfTD = NULL; +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2726,7 +2871,12 @@ static ivas_error setRendInputActiveMc( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) + RENDER_CONFIG_DATA *hRendCfg +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + , + hrtf_handles *hrtfs +#endif +) { #ifdef SPLIT_REND_WITH_HEAD_ROT Word16 i; @@ -2761,7 +2911,15 @@ static ivas_error setRendInputActiveMc( setZeroPanMatrix_fx( inputMc->panGains_fx ); inputMc->customLsInput = defaultCustomLs(); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( hrtfs->hHrtfTD ) + { + inputMc->tdRendWrapper.binaural_latency_ns = (int32_t) ( hrtfs->hHrtfTD->latency_s_fx * 1000000000.f ); + } + inputMc->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; +#else inputMc->tdRendWrapper = defaultTdRendWrapper(); +#endif inputMc->crendWrapper = NULL; inputMc->hReverb = NULL; inputMc->hMcMasa = NULL; @@ -2784,7 +2942,15 @@ static ivas_error setRendInputActiveMc( #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( hrtfs->hHrtfTD ) + { + inputMc->splitTdRendWrappers[i].binaural_latency_ns = (int32_t) ( hrtfs->hHrtfTD->latency_s_fx * 1000000000.f ); + } + inputMc->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; +#else inputMc->splitTdRendWrappers[i] = defaultTdRendWrapper(); +#endif } IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) @@ -2792,7 +2958,15 @@ static ivas_error setRendInputActiveMc( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, FALSE ) ), IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, + hrtfs->hSetOfHRTF, + FALSE ) ), + IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, FALSE ) ), + IVAS_ERR_OK ) ) +#endif { return error; } @@ -2844,17 +3018,26 @@ static void clearInputMc( IF( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); +#ifndef NONBE_FIX_BINARY_BINAURAL_READING inputMc->tdRendWrapper.hHrtfTD = NULL; +#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); inputMc->splitTdRendWrappers[i].hHrtfTD = NULL; } +#else + IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) + { + ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); + } +#endif } #endif @@ -2952,10 +3135,18 @@ static ivas_error initSbaPanGainsForSbaOut( return error; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +static ivas_error updateSbaPanGains( + input_sba *inputSba, + const AUDIO_CONFIG outConfig, + RENDER_CONFIG_DATA *hRendCfg, + IVAS_DEC_HRTF_CREND_HANDLE hMixconv ) +#else static ivas_error updateSbaPanGains( input_sba *inputSba, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg ) +#endif { ivas_error error; AUDIO_CONFIG inConfig; @@ -3017,19 +3208,25 @@ static ivas_error updateSbaPanGains( else #endif { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING #ifdef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) - { - return error; - } +#else + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + +#endif +#else +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#endif +#endif { return error; } -#endif } } BREAK; @@ -3039,17 +3236,22 @@ static ivas_error updateSbaPanGains( { return error; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#endif +#else #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) - { - return error; - } #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#endif +#endif { return error; } -#endif BREAK; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; @@ -3096,7 +3298,13 @@ static ivas_error setRendInputActiveSba( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) + RENDER_CONFIG_DATA *hRendCfg +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + , + hrtf_handles *hrtfs +#endif + +) { ivas_error error; rendering_context rendCtx; @@ -3143,6 +3351,9 @@ static ivas_error setRendInputActiveSba( { initRotGains_fx( inputSba->rot_gains_prev_fx[pos_idx] ); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + inputSba->cldfbRendWrapper.hHrtfFastConv = hrtfs->hHrtfFastConv; +#endif #else initRotGains_fx( inputSba->rot_gains_prev_fx ); #endif @@ -3155,8 +3366,11 @@ static ivas_error setRendInputActiveSba( return error; } } - +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -3195,7 +3409,13 @@ static ivas_error setRendInputActiveMasa( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ + RENDER_CONFIG_DATA *hRendCfg +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + , + hrtf_handles *hrtfs +#endif + + ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ { ivas_error error; rendering_context rendCtx; @@ -3246,7 +3466,11 @@ static ivas_error setRendInputActiveMasa( } ELSE { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hrtfs ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -3286,6 +3510,9 @@ ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, const Word32 outputSampleRate, const AUDIO_CONFIG outConfig, +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + const bool asHrtfBinary, +#endif const Word16 nonDiegeticPan, const Word32 nonDiegeticPanGain, /* Q31 */ const Word16 num_subframes ) @@ -3437,6 +3664,31 @@ ivas_error IVAS_REND_Open( move16(); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hIvasRend->hHrtfs.hHrtfFastConv = NULL; + hIvasRend->hHrtfs.hHrtfParambin = NULL; + hIvasRend->hHrtfs.hHrtfTD = NULL; + hIvasRend->hHrtfs.hSetOfHRTF = NULL; + IF( asHrtfBinary ) + { + IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfTD ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( hIvasRend->hHrtfs.hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfFastConv ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfParambin ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + } +#endif return IVAS_ERR_OK; } @@ -3583,7 +3835,11 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Input inactive, skip. */ CONTINUE; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig, NULL ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -3964,7 +4220,11 @@ ivas_error IVAS_REND_AddInput_fx( Word32 maxNumInputsOfType; void *inputsArray; Word32 inputStructSize; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA *, hrtf_handles *hrtfs ); +#else ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA * ); +#endif Word32 inputIndex; /* Validate function arguments */ @@ -4034,8 +4294,11 @@ ivas_error IVAS_REND_AddInput_fx( *inputId = makeInputId( inConfig, inputIndex ); move16(); - +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig, &hIvasRend->hHrtfs ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = activateInput( (UWord8 *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -4101,7 +4364,15 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, FALSE ) ), IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, + hIvasRend->hHrtfs.hSetOfHRTF, + FALSE ) ), + IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, FALSE ) ), + IVAS_ERR_OK ) ) +#endif { return error; } @@ -4932,7 +5203,15 @@ ivas_error IVAS_REND_SetHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, + hIvasRend->hHrtfs.hSetOfHRTF, + TRUE ) ), + IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), + IVAS_ERR_OK ) ) +#endif { return error; } @@ -5036,7 +5315,16 @@ ivas_error IVAS_REND_DisableHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, + hIvasRend->hHrtfs.hSetOfHRTF, + TRUE ) ), + IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), + IVAS_ERR_OK ) ) + +#endif { return error; @@ -9203,11 +9491,20 @@ void IVAS_REND_Close( ISAR_PRE_REND_close( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer ); #endif - closeHeadRotation( hIvasRend ); ivas_external_orientation_close_fx( &hIvasRend->hExternalOrientationData ); ivas_combined_orientation_close_fx( &hIvasRend->hCombinedOrientationData ); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close( &hIvasRend->hHrtfs.hHrtfFastConv ); + + /* Parametric binauralizer HRTF filters */ + ivas_HRTF_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfTD ) ); + ivas_HRTF_CRend_binary_close_fx( &( hIvasRend->hHrtfs.hSetOfHRTF ) ); + ivas_HRTF_fastconv_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfFastConv ) ); + ivas_HRTF_parambin_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfParambin ) ); +#endif free( hIvasRend ); *phIvasRend = NULL; @@ -9353,6 +9650,95 @@ void IVAS_REND_cldfbSynthesis_wrapper( #endif +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ +) +{ + if ( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfTD == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + *hHrtfTD = &hIvasRend->hHrtfs.hHrtfTD; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfCRendHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfCRendHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ +) +{ + if ( hIvasRend == NULL || hIvasRend->hHrtfs.hSetOfHRTF == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hSetOfHRTF = &hIvasRend->hHrtfs.hSetOfHRTF; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfFastConvHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfFastConvHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ +) +{ + if ( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfFastConv == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hHrtfFastConv = &hIvasRend->hHrtfs.hHrtfFastConv; + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfParamBinHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfParamBinHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +) +{ + if ( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfParambin == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hHrtfParambin = &hIvasRend->hHrtfs.hHrtfParambin; + + return IVAS_ERR_OK; +} +#endif + static ivas_error ivas_masa_ext_rend_dirac_rend_init( input_masa *inputMasa ) { @@ -9806,8 +10192,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( error = IVAS_ERR_OK; move32(); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hHrtfParambin = *( inputMasa->hMasaExtRend->hHrtfParambin ); +#else hHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; - +#endif /* Set common variables and defaults */ output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); move32(); @@ -9981,7 +10370,12 @@ static ivas_error ivas_masa_ext_rend_parambin_init( static ivas_error initMasaExtRenderer( input_masa *inputMasa, - const AUDIO_CONFIG outConfig ) + const AUDIO_CONFIG outConfig +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + , + hrtf_handles *hrtfs +#endif +) { Word16 i; ivas_error error; @@ -10011,7 +10405,11 @@ static ivas_error initMasaExtRenderer( hMasaExtRend->hDiracDecBin = NULL; #endif hMasaExtRend->hReverb = NULL; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + hMasaExtRend->hHrtfParambin = &hrtfs->hHrtfParambin; +#else hMasaExtRend->hHrtfParambin = NULL; +#endif hMasaExtRend->hVBAPdata = NULL; hMasaExtRend->hoa_dec_mtx = NULL; @@ -10110,7 +10508,11 @@ static ivas_error initMasaExtRenderer( { IF( NE_16( hMasaExtRend->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -10204,7 +10606,11 @@ static void freeMasaExtRenderer( IF( hMasaExtRend->hHrtfParambin != NULL ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + ivas_HRTF_parambin_binary_close_fx( hMasaExtRend->hHrtfParambin ); +#else ivas_HRTF_parambin_binary_close_fx( &hMasaExtRend->hHrtfParambin ); +#endif } IF( hMasaExtRend->hVBAPdata != NULL ) diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 54903bc5c..eea8a9548 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -116,6 +116,9 @@ ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ const Word32 outputSampleRate, /* i : output sampling rate */ const IVAS_AUDIO_CONFIG outConfig, /* i : output audio config */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + const bool asHrtfBinary, /* i : load hrtf binary file */ +#endif const Word16 nonDiegeticPan, /* i : non-diegetic object flag */ const Word32 nonDiegeticPanGain, /* i : non-diegetic panning gain Q31 */ const Word16 num_subframes /* i : number of subframes */ @@ -184,6 +187,35 @@ ivas_error IVAS_REND_GetDelay_fx( Word16 *nSamples, /* o : Renderer delay in samples */ Word32 *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ ); +ivas_error IVAS_REND_GetDelay( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + int16_t *nSamples, /* o : Renderer delay in samples */ + int32_t *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ +); + +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +/*! r: error code */ +ivas_error IVAS_REND_GetHrtfHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ +); + +/*! r: error code */ +ivas_error IVAS_REND_GetHrtfCRendHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ +); + +ivas_error IVAS_REND_GetHrtfFastConvHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ +); + +ivas_error IVAS_REND_GetHrtfParamBinHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ +); +#endif /* Functions to be called during rendering */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index c2e3d8a2a..af13fe866 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -35,6 +35,9 @@ #include "prot_fx.h" #include "ivas_prot_rend_fx.h" #include "ivas_prot_fx.h" +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#include "ivas_rom_binaural_crend_head.h" +#endif /*---------------------------------------------------------------------* * Local structures @@ -189,6 +192,16 @@ static ivas_error check_hrtf_binary_header( ivas_hrtfs_header_t *hrtf_header ) { /* Check the renderer type */ + +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_MIXER_CONV ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM ) && + ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_FASTCONV ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) && + ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_PARAMETRIC ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_PARAMETRIC_ROOM ) && + ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_REVERB_ALL ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (renderer type)" ); + } +#else if ( ( hrtf_header->rend_type != RENDERER_BINAURAL_MIXER_CONV ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_FASTCONV ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_FASTCONV_ROOM ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_PARAMETRIC ) && ( hrtf_header->rend_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) && @@ -196,7 +209,7 @@ static ivas_error check_hrtf_binary_header( { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (renderer type)" ); } - +#endif /* Check the output format of the decoder */ if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) @@ -225,7 +238,7 @@ static ivas_error read_hrtf_binary_header( FILE *f_hrtf ) { /* HRTF Header */ - /* Renderer type (4 bytes) : See "RENDERER_TYPE" */ + /* Renderer type (4 bytes) : See "HRTF_READER_RENDERER_TYPE" */ /* Input configuration (4 bytes) : See "BINAURAL_INPUT_AUDIO_CONFIG" */ /* Sampling Frequency (4 bytes) */ /* Raw data size (4 bytes) */ @@ -332,6 +345,7 @@ static void LoadBSplineBinaryITD( return; } + /*-------------------------------------------------------------------* * LoadBSplineBinary() * @@ -348,7 +362,10 @@ static ivas_error LoadBSplineBinary( float f_tmp_latency_s; + +#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; +#endif fread( &f_tmp_latency_s, sizeof( float ), 1, f_hrtf ); HrFiltSet_p->latency_s_fx = float_to_fix( f_tmp_latency_s, Q31 ); @@ -534,11 +551,16 @@ static ivas_error LoadBSplineBinary( LoadBSplineBinaryITD( &HrFiltSet_p->ModelParamsITD, f_hrtf ); } +#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES /* left/right energy and interaural coherence for late reverb */ FOR( i = 0; i < 3; i++ ) { fread( f_tmp_lr_energy_and_iac_dyn, sizeof( const float ), LR_IAC_LENGTH_NR_FC, f_hrtf ); HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } IF( i == 2 ) { floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ @@ -549,11 +571,286 @@ static ivas_error LoadBSplineBinary( } HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; } +#endif return IVAS_ERR_OK; } +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +/*-------------------------------------------------------------------* + * set_default_reverb_iac_energy() + * + * Loads reverb data from file. + --------------------------------------------------------------------*/ + +static ivas_error set_default_reverb_iac_energy( + IVAS_DEC_HRTF_HANDLE HrFiltSet_p /* i/o: HR filter model parameter structure */ +) +{ + int16_t i; +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + int16_t lr_iac_len; +#endif + + if ( HrFiltSet_p == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + lr_iac_len = LR_IAC_LENGTH_NR_FC; + if ( HrFiltSet_p->SampleRate == 16000 ) + { + lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; + } +#endif + + if ( HrFiltSet_p->ModelParams.modelROM == 0 ) + { + for ( i = 0; i < 3; i++ ) + { +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); +#else + HrFiltSet_p->lr_energy_and_iac_dyn[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); +#endif +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } +#endif + } + switch ( HrFiltSet_p->SampleRate ) + { + case 48000: + mvl2l( defaultHRIR_left_avg_power_48kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], LR_IAC_LENGTH_NR_FC ); + mvl2l( defaultHRIR_right_avg_power_48kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], LR_IAC_LENGTH_NR_FC ); + mvl2l( defaultHRIR_coherence_48kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], LR_IAC_LENGTH_NR_FC ); + break; + case 32000: + mvl2l( defaultHRIR_left_avg_power_32kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], LR_IAC_LENGTH_NR_FC ); + mvl2l( defaultHRIR_right_avg_power_32kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], LR_IAC_LENGTH_NR_FC ); + mvl2l( defaultHRIR_coherence_32kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], LR_IAC_LENGTH_NR_FC ); + break; + case 16000: +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], Q27, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ +#else + mvl2l( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], LR_IAC_LENGTH_NR_FC ); + mvl2l( defaultHRIR_right_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], LR_IAC_LENGTH_NR_FC ); + mvl2l( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], LR_IAC_LENGTH_NR_FC ); +#endif + break; + } + } + else + { + switch ( HrFiltSet_p->SampleRate ) + { + case 48000: + HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx; + break; + case 32000: + HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; + break; + case 16000: +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + for ( i = 0; i < 3; i++ ) + { + HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); + if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + } + floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], Q27, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + HrFiltSet_p->lr_energy_and_iac_fx[0] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[0]; + HrFiltSet_p->lr_energy_and_iac_fx[1] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[1]; + HrFiltSet_p->lr_energy_and_iac_fx[2] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[2]; +#else + HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; +#endif + + + break; + } + } + + return IVAS_ERR_OK; +} + +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +/*-------------------------------------------------------------------* + * load_reverb_from_binary() + * + * Loads reverb data from file. + --------------------------------------------------------------------*/ + +static ivas_error load_reverb_from_binary( + IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ + FILE *f_hrtf /* i : HR filter data file handle */ +) +{ + int16_t i; + bool is_reverb; + ivas_error header_check_result; + ivas_hrtfs_file_header_t hrtfs_file_header; + int16_t hrtf_id; + ivas_hrtfs_header_t hrtf_header; + int32_t hrtf_data_size_max; + char *hrtf_data; +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + int16_t lr_iac_len; + float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; + + if ( HrFiltSet_p == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + lr_iac_len = LR_IAC_LENGTH_NR_FC; + if ( HrFiltSet_p->SampleRate == 16000 ) + { + lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; + } +#endif + + header_check_result = IVAS_ERR_OK; + + if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) + { + return header_check_result; + } + + is_reverb = FALSE; + hrtf_data_size_max = hrtfs_file_header.max_data_size; + + /* Allocate the memory */ + + if ( hrtf_data_size_max == 0 ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (hrtf_data_size_max)" ); + } + + hrtf_data = (char *) malloc( hrtf_data_size_max ); + if ( hrtf_data == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + + for ( hrtf_id = 0; ( hrtf_id < hrtfs_file_header.nb_hrtf ) && ( !is_reverb ); hrtf_id++ ) + { + if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "HRTF binary file not compliant (number of HRTF)" ); + } + + if ( ( header_check_result = check_hrtf_binary_header( &hrtf_header ) ) != IVAS_ERR_OK ) + { + free( hrtf_data ); + return header_check_result; + } + + is_reverb = ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_REVERB_ALL ); + if ( !is_reverb ) + { + if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) + { + free( hrtf_data ); + return IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + } + } + + free( hrtf_data ); + + if ( is_reverb ) + { + /* left/right energy and interaural coherence for late reverb */ + FOR( i = 0; i < 3; i++ ) + { +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); + IF( i == 2 ) + { + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + } + ELSE + { + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + } + HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; +#else + HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); + if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( const float ), LR_IAC_LENGTH_NR_FC_16KHZ, f_hrtf ); + IF( i == 2 ) + { + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + } + ELSE + { + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ + } + HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; +#endif + } + } + else + { + if ( ( header_check_result = set_default_reverb_iac_energy( HrFiltSet_p ) ) != IVAS_ERR_OK ) + { + return header_check_result; + } + +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; +#else + return IVAS_ERR_FAILED_FILE_READ; +#endif + } + + return IVAS_ERR_OK; +} +#endif + +/*---------------------------------------------------------------------* + * load_reverb_binary() + * + * Load HRTF binary data into the HRTF handle + *---------------------------------------------------------------------*/ + +ivas_error load_reverb_binary( + IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +) +{ + fseek( hrtfReader->file, 0, SEEK_SET ); + + return load_reverb_from_binary( hHrtf, hrtfReader->file ); +} +#endif /*-------------------------------------------------------------------* * TDREND_MIX_LoadHRTF() * @@ -566,7 +863,9 @@ static ivas_error TDREND_MIX_LoadHRTF( ) { int16_t tmp; +#ifndef NONBE_FIX_BINARY_BINAURAL_READING ivas_error error; +#endif bool is_tdrend; ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; @@ -575,12 +874,36 @@ static ivas_error TDREND_MIX_LoadHRTF( int32_t hrtf_data_size_max; char *hrtf_data; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + header_check_result = IVAS_ERR_OK; +#else error = IVAS_ERR_OK; - +#endif if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + + /* try if it is old format for BE tests*/ + fseek( f_hrtf, 0, SEEK_SET ); + if ( fread( &tmp, 1, sizeof( int16_t ), f_hrtf ) == 0 ) + { + header_check_result = IVAS_ERROR( IVAS_ERR_FAILED_FILE_READ, "Error in HRTF file reading" ); + } + + HrFiltSet_p->FilterMethod = (TDREND_HRFILT_Method_t) tmp; + + if ( HrFiltSet_p->FilterMethod != TDREND_HRFILT_Method_BSplineModel ) + { + header_check_result = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); + } + else + { + header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); + } + return header_check_result; +#endif } is_tdrend = FALSE; @@ -611,7 +934,11 @@ static ivas_error TDREND_MIX_LoadHRTF( return header_check_result; } +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + is_tdrend = ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD ); +#else is_tdrend = ( hrtf_header.rend_type == RENDERER_BINAURAL_OBJECTS_TD ); +#endif if ( !is_tdrend ) { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) @@ -634,19 +961,35 @@ static ivas_error TDREND_MIX_LoadHRTF( if ( HrFiltSet_p->FilterMethod != TDREND_HRFILT_Method_BSplineModel ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + header_check_result = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); +#else error = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); +#endif } else { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); +#else error = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); +#endif } } else { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; +#else return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "HR filter not found in binary file." ); +#endif } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + return header_check_result; +#else return error; +#endif } @@ -737,7 +1080,76 @@ static void HRTF_energy_sections_precalc( return; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +/*---------------------------------------------------------------------* + * dealloc_HRTF_binary() + * + * Deallocated memory allocated by load_HRTF_binary + *---------------------------------------------------------------------*/ + +void destroy_td_hrtf( + IVAS_DEC_HRTF_HANDLE *hHrtf /* i/o: HRTF handle */ +) +{ + int16_t i; + + if ( ( hHrtf == NULL ) || ( *hHrtf == NULL ) ) + { + return; + } + if ( !( *hHrtf )->ModelParams.modelROM ) + { + if ( ( *hHrtf )->ModelParams.UseItdModel ) + { + free( ( *hHrtf )->ModelParamsITD.elevKSeq_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.azimKSeq_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.W_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.azimBsShape_dyn_fx ); + free( ( *hHrtf )->ModelParamsITD.elevBsShape_dyn_fx ); + } + free( ( *hHrtf )->ModelParams.elevKSeq_dyn_fx ); + free( ( *hHrtf )->ModelParams.azim_start_idx_dyn ); + free( ( *hHrtf )->ModelParams.azimDim2_dyn ); + free( ( *hHrtf )->ModelParams.azimDim3_dyn ); + free( ( *hHrtf )->ModelParams.AlphaL_dyn_fx ); + free( ( *hHrtf )->ModelParams.AlphaR_dyn_fx ); + free( ( *hHrtf )->ModelParams.azimSegSamples_dyn ); + + free( ( *hHrtf )->ModelParams.azimShapeIdx_dyn ); + free( ( *hHrtf )->ModelParams.azimShapeSampFactor_dyn ); + free( ( *hHrtf )->ModelParams.elevBsShape_dyn_fx ); + + for ( i = 0; i < ( *hHrtf )->ModelParams.num_unique_azim_splines; i++ ) + { + free( ( *hHrtf )->ModelParams.azimBsShape_dyn_fx[i] ); + } + free( ( *hHrtf )->ModelParams.azimBsShape_dyn_fx ); + + free( (void *) ( *hHrtf )->ModelParams.azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ + for ( i = 0; i < ( *hHrtf )->ModelParams.elevDim3; i++ ) + { + free( ( *hHrtf )->ModelParams.azimKSeq_fx[i] ); + } + free( ( *hHrtf )->ModelParams.azimKSeq_fx ); + + free( ( *hHrtf )->ModelParams.EL_dyn_fx ); + free( ( *hHrtf )->ModelParams.ER_dyn_fx ); + + free( ( *hHrtf )->ModelEval.hrfModL_fx ); + free( ( *hHrtf )->ModelEval.hrfModR_fx ); + + for ( i = 0; i < 3; i++ ) + { + free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); + } + } + + ivas_HRTF_binary_close_fx( hHrtf ); + + return; +} +#else /*---------------------------------------------------------------------* * dealloc_HRTF_binary() * @@ -805,6 +1217,7 @@ ivas_error dealloc_HRTF_binary( return error; } +#endif /*---------------------------------------------------------------------* * create_HRTF_from_rawdata() @@ -829,7 +1242,11 @@ static ivas_error create_HRTF_from_rawdata( { if ( ( ( *hHRTF ) = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL ) { +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary data\n" ); +#else return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for HRTF binary data\n" ); +#endif } if ( ( error = ivas_hrtf_init( *hHRTF ) ) != IVAS_ERR_OK ) @@ -842,6 +1259,9 @@ static ivas_error create_HRTF_from_rawdata( return IVAS_ERR_INTERNAL; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + ( *hHRTF )->init_from_rom = 0; +#endif hrtf_data_rptr = hrtf_data; /* latency_s */ @@ -1070,10 +1490,14 @@ static ivas_error create_HRTF_from_rawdata( static ivas_error create_fastconv_HRTF_from_rawdata( - HRTFS_FASTCONV_HANDLE *hHRTF, /* i/o: HRTF FastConv handle */ - char *hrtf_data, /* i : pointer to binary file */ - RENDERER_TYPE rend_type, /* i : Renderer type */ - BINAURAL_INPUT_AUDIO_CONFIG input_cfg /* i : Input binaural config */ + HRTFS_FASTCONV_HANDLE *hHRTF, /* i/o: HRTF FastConv handle */ + char *hrtf_data, /* i : pointer to binary file */ +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + HRTF_READER_RENDERER_TYPE rend_type, /* i : Renderer type */ +#else + RENDERER_TYPE rend_type, /* i : Renderer type */ +#endif + BINAURAL_INPUT_AUDIO_CONFIG input_cfg /* i : Input binaural config */ ) { int16_t i, j; @@ -1082,24 +1506,63 @@ static ivas_error create_fastconv_HRTF_from_rawdata( float f_tmp_ntaps_max[BINAURAL_NTAPS_MAX]; float f_tmp_brir_reverb[CLDFB_NO_CHANNELS_MAX]; char *hrtf_data_rptr; +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + ivas_error error; +#endif + ( *hHRTF )->allocate_init_flag = 0; + +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV ) + { + if ( ( error = ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, RENDERER_BINAURAL_FASTCONV, ( *hHRTF )->allocate_init_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) + { + if ( ( error = ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, RENDERER_BINAURAL_FASTCONV_ROOM, ( *hHRTF )->allocate_init_flag ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "renderer type not compliant" ); + } +#else ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, rend_type, ( *hHRTF )->allocate_init_flag ); +#endif hrtf_data_rptr = hrtf_data; +#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT /* BINAURAL_CONVBANDS */ if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); } hrtf_data_rptr += sizeof( uint16_t ); +#endif - /* HRIR */ +/* HRIR */ +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#endif { f_tmp = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); ( *hHRTF )->FASTCONV_HRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); +#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); +#endif if ( HRTF_LS_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { @@ -1150,13 +1613,25 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#endif { /* HRIR_HOA3 */ f_tmp = *( (float *) ( hrtf_data_rptr ) ); ( *hHRTF )->FASTCONV_HOA3_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); +#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); +#endif + if ( HOA3_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HOA3_CHANNELS)" ); @@ -1205,7 +1680,11 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) +#else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) +#endif { /* HRIR_HOA2 */ f_tmp = *( (float *) ( hrtf_data_rptr ) ); @@ -1217,6 +1696,13 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } hrtf_data_rptr += sizeof( uint16_t ); +#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); +#endif if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); @@ -1260,12 +1746,25 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) +#else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) +#endif { /* HRIR_FOA */ f_tmp = *( (float *) ( hrtf_data_rptr ) ); ( *hHRTF )->FASTCONV_FOA_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); + +#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); +#endif + if ( FOA_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (FOA_CHANNELS)" ); @@ -1315,13 +1814,25 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } - /* BRIR */ +/* BRIR */ +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#else else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#endif { f_tmp = *( (float *) ( hrtf_data_rptr ) ); ( *hHRTF )->FASTCONV_BRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); +#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT + if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); +#endif + if ( HRTF_LS_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_LS_CHANNELS)" ); @@ -1378,6 +1889,8 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } hrtf_data_rptr += sizeof( uint16_t ); + +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); @@ -1385,6 +1898,16 @@ static ivas_error create_fastconv_HRTF_from_rawdata( memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); +#else // old binary file is wrong +#include "ivas_rom_binauralRenderer.h" + memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + + memcpy( f_tmp_brir_reverb, fastconvReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); +#endif } return IVAS_ERR_OK; @@ -1408,6 +1931,9 @@ ivas_error load_fastconv_HRTF_from_binary( ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + int16_t asFastconv = 0; +#endif f_hrtf = hrtfReader->file; @@ -1439,7 +1965,11 @@ ivas_error load_fastconv_HRTF_from_binary( free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); } +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) ) +#else if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) +#endif { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) { @@ -1453,6 +1983,9 @@ ivas_error load_fastconv_HRTF_from_binary( free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + asFastconv = 1; +#endif } else { @@ -1461,6 +1994,18 @@ ivas_error load_fastconv_HRTF_from_binary( } free( hrtf_data ); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( asFastconv ) + { + return IVAS_ERR_OK; + } + else + { + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; + } +#else + return IVAS_ERR_OK; +#endif return IVAS_ERR_OK; } @@ -1565,6 +2110,9 @@ ivas_error load_parambin_HRTF_from_binary( ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + int16_t asParam = 0; +#endif f_hrtf = hrtfReader->file; @@ -1599,7 +2147,12 @@ ivas_error load_parambin_HRTF_from_binary( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); } + +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ +#else if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ +#endif { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) { @@ -1613,6 +2166,9 @@ ivas_error load_parambin_HRTF_from_binary( free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + asParam = 1; +#endif } else { @@ -1620,7 +2176,18 @@ ivas_error load_parambin_HRTF_from_binary( } } free( hrtf_data ); - +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( asParam ) + { + return IVAS_ERR_OK; + } + else + { + return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; + } +#else + return IVAS_ERR_OK; +#endif return IVAS_ERR_OK; } @@ -1681,7 +2248,11 @@ ivas_error create_SetOfHRTF_from_binary( hHRTF = NULL; if ( hrtf_header.frequency == output_Fs ) { +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV ) +#else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) +#endif { if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { @@ -1700,7 +2271,11 @@ ivas_error create_SetOfHRTF_from_binary( hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa ); } } +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + else if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM ) +#else else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) +#endif { if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { @@ -1725,13 +2300,15 @@ ivas_error create_SetOfHRTF_from_binary( } free( hrtf_data ); - if ( ( ( *hSetOfHRTF ).hHRTF_hrir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_brir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 == NULL ) ) +#ifndef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( ( *hSetOfHRTF ).hHRTF_hrir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_brir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_foa == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 == NULL ) ) { if ( destroy_SetOfHRTF( hSetOfHRTF ) != IVAS_ERR_OK ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create all the HRTF from binary file" ); } } +#endif return IVAS_ERR_OK; } @@ -1741,43 +2318,54 @@ ivas_error create_SetOfHRTF_from_binary( * Destroy the HRTF CRend handle *---------------------------------------------------------------------*/ -static ivas_error destroy_HRTF( - HRTFS_HANDLE *hHRTF /* i/o: HRTF CRend handle */ -) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +static void destroy_HRTF +#else +static ivas_error destroy_HRTF +#endif + ( + HRTFS_HANDLE *hHRTF /* i/o: HRTF CRend handle */ + ) { uint16_t i, j; - if ( *hHRTF != NULL && hHRTF != NULL ) +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + test(); + test(); + IF( *hHRTF != NULL && hHRTF != NULL && ( *hHRTF )->init_from_rom == 0 ) +#else + IF( *hHRTF != NULL && hHRTF != NULL ) +#endif { - for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { - if ( ( *hHRTF )->pIndex_frequency_max[i][j] != NULL ) + IF( ( *hHRTF )->pIndex_frequency_max[i][j] != NULL ) { free( ( *hHRTF )->pIndex_frequency_max[i][j] ); } - if ( ( *hHRTF )->pOut_to_bin_re_fx[i][j] != NULL ) + IF( ( *hHRTF )->pOut_to_bin_re_fx[i][j] != NULL ) { free( ( *hHRTF )->pOut_to_bin_re_fx[i][j] ); } - if ( ( *hHRTF )->pOut_to_bin_im_fx[i][j] != NULL ) + IF( ( *hHRTF )->pOut_to_bin_im_fx[i][j] != NULL ) { free( ( *hHRTF )->pOut_to_bin_im_fx[i][j] ); } } } - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { - if ( ( *hHRTF )->pIndex_frequency_max_diffuse[j] != NULL ) + IF( ( *hHRTF )->pIndex_frequency_max_diffuse[j] != NULL ) { free( ( *hHRTF )->pIndex_frequency_max_diffuse[j] ); } - if ( ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] != NULL ) + IF( ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] != NULL ) { free( ( *hHRTF )->pOut_to_bin_diffuse_re_fx[j] ); } - if ( ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] != NULL ) + IF( ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] != NULL ) { free( ( *hHRTF )->pOut_to_bin_diffuse_im_fx[j] ); } @@ -1787,14 +2375,73 @@ static ivas_error destroy_HRTF( *hHRTF = NULL; } +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + return; +#else return IVAS_ERR_OK; +#endif } /*---------------------------------------------------------------------* * destroy_SetOfHRTF() * * Destroy the HRTF data set. *---------------------------------------------------------------------*/ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +void destroy_SetOfHRTF( + HRTFS_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +) +{ + test(); + IF( ( hSetOfHRTF != NULL ) && ( *hSetOfHRTF != NULL ) ) + { + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_combined ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_hoa3 ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_hoa2 ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_foa ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_brir_combined ) ); + } + + ivas_HRTF_CRend_binary_close_fx( hSetOfHRTF ); + + return; +} + + +/*---------------------------------------------------------------------* + * destroy_fastconv_hrtf() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ +void destroy_fastconv_hrtf( + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* i/o: FastConv HRTF handle */ +) +{ + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close( hHrtfFastConv ); + + /* Fastconv HRTF filters */ + ivas_HRTF_fastconv_binary_close_fx( hHrtfFastConv ); + + return; +} + + +/*---------------------------------------------------------------------* + * destroy_parambin_hrtf() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ + +void destroy_parambin_hrtf( + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* i/o: Parambin HRTF handle */ +) +{ + ivas_HRTF_parambin_binary_close_fx( hHrtfParambin ); + + return; +} +#else ivas_error destroy_SetOfHRTF( HRTFS_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ ) @@ -1810,3 +2457,4 @@ ivas_error destroy_SetOfHRTF( return IVAS_ERR_OK; } +#endif diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 104cc5c7a..96bb09736 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -47,6 +47,21 @@ typedef struct ivas_hrtfs_header_t } ivas_hrtfs_header_t; +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +typedef enum +{ + HRTF_READER_RENDERER_BINAURAL_INVALID, + HRTF_READER_RENDERER_BINAURAL_FASTCONV, + HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM, + HRTF_READER_RENDERER_BINAURAL_PARAMETRIC, + HRTF_READER_RENDERER_BINAURAL_PARAMETRIC_ROOM, + HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD, + HRTF_READER_RENDERER_BINAURAL_MIXER_CONV, + HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM, + HRTF_READER_RENDERER_BINAURAL_REVERB_ALL +} HRTF_READER_RENDERER_TYPE; +#endif + /*---------------------------------------------------------------------* * hrtfFileReader_open() * @@ -79,6 +94,19 @@ ivas_error load_HRTF_binary( const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +/*---------------------------------------------------------------------* + * load_reverb_from_binary() + * + * Load reverb binary data into the HRTF handle + *---------------------------------------------------------------------*/ + +ivas_error load_reverb_binary( + IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +); +#endif + /*---------------------------------------------------------------------* * create_SetOfHRTF_from_binary() * @@ -98,10 +126,16 @@ ivas_error create_SetOfHRTF_from_binary( * Destroy the HRTF data set. *---------------------------------------------------------------------*/ + +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +void destroy_SetOfHRTF( + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +); +#else ivas_error destroy_SetOfHRTF( IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ ); - +#endif /*---------------------------------------------------------------------* * load_fastconv_HRTF_from_binary() @@ -114,6 +148,17 @@ ivas_error load_fastconv_HRTF_from_binary( const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ); +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +/*---------------------------------------------------------------------* + * destroy_fastconv_hrtf() + * + * free memory allocated for FastConv HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +void destroy_fastconv_hrtf( + IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* i/o: FastConv HRTF handle */ +); +#endif /*---------------------------------------------------------------------* * load_parambin_HRTF_from_binary() @@ -132,9 +177,30 @@ ivas_error load_parambin_HRTF_from_binary( * * Deallocated memory allocated by load_HRTF_binary *---------------------------------------------------------------------*/ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING +/*---------------------------------------------------------------------* + * destroy_parambin_hrtf() + * + * free memory allocated for Parambin HRTF binary data into the handle + *---------------------------------------------------------------------*/ + +void destroy_parambin_hrtf( + IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* i/o: Parambin HRTF handle */ +); +/*---------------------------------------------------------------------* + * destroy_td_hrtf() + * + * Destroy the HRTF TD handle + *---------------------------------------------------------------------*/ + +void destroy_td_hrtf( + IVAS_DEC_HRTF_HANDLE *hHRTF /* i/o: HRTF handle */ +); + +#else ivas_error dealloc_HRTF_binary( IVAS_DEC_HRTF_HANDLE hHrtf /* i/o: HRTF handle */ ); - +#endif #endif /* IVAS_HRTF_FILE_READER_H */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 92c1a2fed..a1f806d6b 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -440,7 +440,11 @@ static ivas_error read_bin_bits( *pTarget = 0; for ( n = 0; n < nBits; n++ ) { +#ifdef FIX_WARNING_RENDER_CONFIG + nByte = (uint32_t) ( ( this->readOffset + n ) >> 3 ); +#else nByte = ( this->readOffset + n ) >> 3; +#endif bit = this->pBitstream[nByte] >> ( 7 - ( ( this->readOffset + n ) % 8 ) ) & 1; *pTarget = ( *pTarget << 1 ) + bit; } -- GitLab From fe603f822ce6da6933b81b3ba20f11f30fb616ba Mon Sep 17 00:00:00 2001 From: Stefan Doehla Date: Tue, 15 Apr 2025 07:59:10 +0000 Subject: [PATCH 0410/1310] [fix] L_mult -> L_mult_o in L_msuNs_co --- lib_com/basop32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/basop32.c b/lib_com/basop32.c index 20dbe663e..65d449a32 100644 --- a/lib_com/basop32.c +++ b/lib_com/basop32.c @@ -1575,7 +1575,7 @@ Word32 L_msuNs_co( Word32 L_var3, Word16 var1, Word16 var2, Flag *Carry, Flag *O { Word32 L_var_out; - L_var_out = L_mult( var1, var2 ); + L_var_out = L_mult_o( var1, var2, Overflow ); L_var_out = L_sub_co( L_var3, L_var_out, Carry, Overflow ); return ( L_var_out ); -- GitLab From f783eba95c52904c34d86e37a6f371f3f4461dcf Mon Sep 17 00:00:00 2001 From: Stefan Doehla Date: Tue, 22 Apr 2025 16:23:37 +0200 Subject: [PATCH 0411/1310] [fix] missing overflow handling as in legacy STL --- lib_com/basop32.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib_com/basop32.c b/lib_com/basop32.c index 65d449a32..aec1573be 100644 --- a/lib_com/basop32.c +++ b/lib_com/basop32.c @@ -2044,6 +2044,8 @@ Word32 L_sub_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) Word32 L_test; Flag carry_int = 0; + /* TODO: unset overflow, but not done */ + /* unset_overflow( Overflow ); */ if ( get_carry( Carry ) ) { unset_carry( Carry ); @@ -2056,6 +2058,7 @@ Word32 L_sub_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) L_var_out = L_var1 - L_var2; if ( L_var1 > 0L ) { + set_overflow( Overflow ); unset_carry( Carry ); } } @@ -2067,18 +2070,22 @@ Word32 L_sub_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) if ( ( L_test < 0 ) && ( L_var1 > 0 ) && ( L_var2 < 0 ) ) { + set_overflow( Overflow ); carry_int = 0; } else if ( ( L_test > 0 ) && ( L_var1 < 0 ) && ( L_var2 > 0 ) ) { + set_overflow( Overflow ); carry_int = 1; } else if ( ( L_test > 0 ) && ( ( L_var1 ^ L_var2 ) > 0 ) ) { + unset_overflow( Overflow ); carry_int = 1; } if ( L_test == MIN_32 ) { + set_overflow( Overflow ); carry_int ? set_carry( Carry ) : unset_carry( Carry ); } else -- GitLab From 8ee4fc159676449962ebfa9426aa689a2c654b70 Mon Sep 17 00:00:00 2001 From: Stefan Doehla Date: Wed, 23 Apr 2025 21:47:58 +0200 Subject: [PATCH 0412/1310] remove unnecessary comment --- lib_com/basop32.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_com/basop32.c b/lib_com/basop32.c index aec1573be..fbe08a11f 100644 --- a/lib_com/basop32.c +++ b/lib_com/basop32.c @@ -2038,14 +2038,13 @@ Word32 DEPR_L_sub_c( Word32 L_var1, Word32 L_var2, Flag *Carry ) return ( L_var_out ); } + Word32 L_sub_co( Word32 L_var1, Word32 L_var2, Flag *Carry, Flag *Overflow ) { Word32 L_var_out; Word32 L_test; Flag carry_int = 0; - /* TODO: unset overflow, but not done */ - /* unset_overflow( Overflow ); */ if ( get_carry( Carry ) ) { unset_carry( Carry ); -- GitLab From f2d5e62ed9989c2119241bec4cc1113211fb3cdf Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 23 Apr 2025 17:21:44 +0530 Subject: [PATCH 0413/1310] Fix for 3GPP issue 1499: Spike in BASOP encoded signal of MASA selection material Link #1499 --- lib_enc/analy_sp_fx.c | 10 ++--- lib_enc/find_uv_fx.c | 2 +- lib_enc/ivas_core_pre_proc_front_fx.c | 32 ++++++++-------- lib_enc/ivas_cpe_enc_fx.c | 4 +- lib_enc/ivas_front_vad_fx.c | 12 +++--- lib_enc/ivas_stereo_td_analysis_fx.c | 8 ++-- lib_enc/long_enr_fx.c | 4 +- lib_enc/nois_est_fx.c | 55 ++++++++++++++------------- lib_enc/prot_fx_enc.h | 6 +-- lib_enc/stat_enc.h | 6 ++- lib_enc/updt_enc_fx.c | 9 ++++- 11 files changed, 80 insertions(+), 68 deletions(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 57dbb369c..49bb03f57 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -438,7 +438,7 @@ void ivas_analy_sp_fx( Word16 *q_fr_bands, /* o : energy in critical frequency bands Q0 */ Word32 *lf_E, /* o : per bin E for first... q_lf_E */ Word16 *q_lf_E, /* o : per bin E for first... Q0 */ - Word16 *Etot, /* o : total input energy Q8 */ + Word32 *Etot, /* o : total input energy Q24 */ const Word16 min_band, /* i : minimum critical band Q0 */ const Word16 max_band, /* i : maximum critical band Q0 */ Word32 *Bin_E, /* o : per-bin energy spectrum q_Bin_E */ @@ -557,7 +557,7 @@ void ivas_analy_sp_fx( /* Average total log energy over both half-frames */ /* *Etot = 10.0f * (float)log10(0.5f * *Etot); */ - *Etot = -12800 /* 10.f * logf(0.00001f) in Q8 */; + *Etot = -838860800 /* 10.f * log10f(0.00001f) in Q24 : This is when LEtot is 0*/; move16(); IF( LEtot != 0 ) { @@ -566,7 +566,7 @@ void ivas_analy_sp_fx( LEtot = W_shl( LEtot, exp ); // q_fr_bands+2+exp Ltmp = BASOP_Util_Log10( W_extract_h( LEtot ), sub( 61, add( *q_fr_bands, exp ) ) /* 31-(q_fr_bands+2+exp-32) */ ); // Q25 Ltmp = Mpy_32_32( Ltmp, 1342177280 /* 10.f in Q27 */ ); // (Q25, Q27) -> Q21 - *Etot = extract_h( L_shl( Ltmp, Q24 - Q21 ) ); // Q8 + *Etot = L_shl( Ltmp, Q24 - Q21 ); // Q24 move16(); } } @@ -599,7 +599,7 @@ void ivas_analy_sp_fx( } /* Average total log energy over both half-frames */ - *Etot = -12800 /* 10.f * logf(0.00001f) in Q8 */; + *Etot = -838860800 /* 10.f * log10f(0.00001f) in Q24 : This is when LEtot is 0*/; move16(); IF( LEtot != 0 ) { @@ -607,7 +607,7 @@ void ivas_analy_sp_fx( LEtot = W_shl( LEtot, exp ); // q_fr_bands+exp Ltmp = BASOP_Util_Log10( W_extract_h( LEtot ), sub( 62, add( *q_fr_bands, exp ) ) /* 31-(q_fr_bands+1+exp-32) */ ); // Q25 Ltmp = Mpy_32_32( Ltmp, 1342177280 /* 10.f in Q27 */ ); // (Q25, Q27) -> Q21 - *Etot = extract_h( L_shl( Ltmp, Q24 - Q21 ) ); // Q8 + *Etot = L_shl( Ltmp, Q24 - Q21 ); // Q24 move16(); } } diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index 79dc78c6d..c4fe2e895 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -729,7 +729,7 @@ Word16 find_uv_ivas_fx( /* o : coding typ * Total frame energy difference (dE3) *-----------------------------------------------------------------*/ - dE3 = sub( Etot, hNoiseEst->Etot_last_fx ); /*Q8*/ + dE3 = sub( Etot, extract_h( hNoiseEst->Etot_last_32fx ) ); /*Q8*/ /*-----------------------------------------------------------------* * Energy decrease after spike (dE2) diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 67c4f256f..b9a15cd35 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -205,7 +205,7 @@ ivas_error pre_proc_front_ivas_fx( Word16 S_map_fx[L_FFT / 2]; Word16 cor_map_sum_LR_fx[CPE_CHANNELS]; /* speech/music clasif. parameter */ Word16 S_map_LR_fx[L_FFT / 2]; /* short-term correlation map */ - Word16 Etot_fx; /* total energy Q8 */ + Word32 Etot_fx; /* total energy Q8 */ Word32 tmpN_fx[NB_BANDS]; /* Temporary noise update */ Word32 tmpE_fx[NB_BANDS]; /* Temporary averaged energy of 2 sf. */ Word32 tmpN_LR_fx[CPE_CHANNELS][NB_BANDS]; /* Temporary noise update */ @@ -739,7 +739,7 @@ ivas_error pre_proc_front_ivas_fx( IF( hStereoClassif != NULL ) { - IF( GT_32( sub( st->lp_speech_fx, Etot_fx ), 25 << Q8 ) ) /*Q8*/ + IF( GT_32( sub( st->lp_speech_fx, extract_h( Etot_fx ) ), 25 << Q8 ) ) /*Q8*/ { hStereoClassif->silence_flag = 2; move16(); @@ -759,11 +759,11 @@ ivas_error pre_proc_front_ivas_fx( IF( hCPE != NULL ) { - noise_est_pre_32fx( L_deposit_h( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, hCPE->last_element_mode ); + noise_est_pre_32fx( ( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, hCPE->last_element_mode ); } ELSE { - noise_est_pre_32fx( L_deposit_h( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, element_mode ); + noise_est_pre_32fx( ( Etot_fx ), st->ini_frame, st->hNoiseEst, st->idchan, element_mode, element_mode ); } test(); @@ -913,18 +913,18 @@ ivas_error pre_proc_front_ivas_fx( *----------------------------------------------------------------*/ noise_est_down_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, &st->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, - &st->hNoiseEst->totalNoise_fx, Etot_fx, &st->hNoiseEst->Etot_last_fx, &st->hNoiseEst->Etot_v_h2_fx ); + &st->hNoiseEst->totalNoise_fx, Etot_fx, &st->hNoiseEst->Etot_last_32fx, &st->hNoiseEst->Etot_v_h2_fx ); test(); IF( lr_vad_enabled && st->idchan == 0 ) { - noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, Etot_LR_fx[0], &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx ); - noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, Etot_LR_fx[1], &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[0] ), &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[1] ), &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx ); corr_shiftL_fx = correlation_shift_fx( hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx ); // Q15 corr_shiftR_fx = correlation_shift_fx( hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx ); // Q15 } - *relE_fx = sub( Etot_fx, st->lp_speech_fx ); // Q8 + *relE_fx = sub( extract_h( Etot_fx ), st->lp_speech_fx ); // Q8 move16(); corr_shift_fx = correlation_shift_fx( st->hNoiseEst->totalNoise_fx ); /* Q15 */ @@ -1307,8 +1307,8 @@ ivas_error pre_proc_front_ivas_fx( move16(); move16(); - noise_est_ivas_fx( st, old_pitch1, tmpN_fx, epsP_fx, Etot_fx, *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, - &ncharX_fx, &sp_div_fx, &q_sp_div, &non_staX_fx, loc_harm, lf_E_fx, q_lf_E_fx, &st->hNoiseEst->harm_cor_cnt, st->hNoiseEst->Etot_l_lp_fx, + noise_est_ivas_fx( st, old_pitch1, tmpN_fx, epsP_fx, extract_h( Etot_fx ), *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, + &ncharX_fx, &sp_div_fx, &q_sp_div, &non_staX_fx, loc_harm, lf_E_fx, q_lf_E_fx, &st->hNoiseEst->harm_cor_cnt, extract_h( st->hNoiseEst->Etot_l_lp_32fx ), st->hNoiseEst->Etot_v_h2_fx, &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, hStereoClassif, NULL, st->ini_frame ); @@ -1352,14 +1352,14 @@ ivas_error pre_proc_front_ivas_fx( noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[0], epsP_fx, Etot_LR_fx[0], sub( Etot_LR_fx[0], hCPE->hFrontVad[0]->lp_speech_fx ), corr_shiftL_fx, tmpE_LR_fx[0], q_tmpE_LR[0], fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], &cor_map_sum_LR_fx[0], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[0], lf_E_LR_fx_q, &hCPE->hFrontVad[0]->hNoiseEst->harm_cor_cnt, - hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_fx, hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[0], hCPE->hFrontVad[0]->ini_frame ); /* Note: the index [0] in the last argument is intended, the ini_frame counter is only maintained in the zero-th channel's VAD handle */ noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[1], epsP_fx, Etot_LR_fx[1], sub( Etot_LR_fx[1], hCPE->hFrontVad[1]->lp_speech_fx ), corr_shiftR_fx, tmpE_LR_fx[1], q_tmpE_LR[1], fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], &cor_map_sum_LR_fx[1], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[1], lf_E_LR_fx_q, &hCPE->hFrontVad[1]->hNoiseEst->harm_cor_cnt, - hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_fx, hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[1], hCPE->hFrontVad[0]->ini_frame ); } @@ -1387,7 +1387,7 @@ ivas_error pre_proc_front_ivas_fx( find_tilt_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, st->hNoiseEst->q_bckr, ee_fx, st->pitch, st->voicing_fx, lf_E_fx, q_lf_E_fx, corr_shift_fx, st->input_bwidth, st->max_band, hp_E_fx, MODE1, &( st->bckr_tilt_lt ), st->Opt_SC_VBR ); - st->coder_type = find_uv_ivas_fx( st, pitch_fr_fx, voicing_fr_fx, inp_12k8_fx, ee_fx, &dE1X_fx, corr_shift_fx, *relE_fx, Etot_fx, hp_E_fx, + st->coder_type = find_uv_ivas_fx( st, pitch_fr_fx, voicing_fr_fx, inp_12k8_fx, ee_fx, &dE1X_fx, corr_shift_fx, *relE_fx, extract_h( Etot_fx ), hp_E_fx, &flag_spitch, last_core_orig, hStereoClassif, *Q_new /*q_inp_12k8*/, fr_bands_fx_q ); // Q0 Copy_Scale_sig_16_32_no_sat( st->lgBin_E_fx, st->Bin_E_fx, L_FFT / 2, sub( st->q_Bin_E, Q7 ) ); @@ -1461,7 +1461,7 @@ ivas_error pre_proc_front_ivas_fx( scale_sig32( PS_fx, 128, shift ); Qfact_PS = add( Qfact_PS, shift ); - smc_dec = ivas_smc_gmm_fx( st, hStereoClassif, localVAD_HE_SAD, Etot_fx, lsp_new_fx, *cor_map_sum_fx /*Q8*/, epsP_fx, PS_fx, non_staX_fx, *relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, *epsP_fx_q, hSpMusClas->past_PS_Q ); /* Q0 */ + smc_dec = ivas_smc_gmm_fx( st, hStereoClassif, localVAD_HE_SAD, extract_h( Etot_fx ), lsp_new_fx, *cor_map_sum_fx /*Q8*/, epsP_fx, PS_fx, non_staX_fx, *relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, *epsP_fx_q, hSpMusClas->past_PS_Q ); /* Q0 */ #ifdef DEBUG_FORCE_DIR if ( st->force_dir[0] != '\0' ) @@ -1495,7 +1495,7 @@ ivas_error pre_proc_front_ivas_fx( * Update of old per-band energy spectrum *----------------------------------------------------------------*/ - ivas_long_enr_fx( st, Etot_fx, localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); + ivas_long_enr_fx( st, extract_h( Etot_fx ), localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); Copy32( fr_bands_fx + NB_BANDS, st->hNoiseEst->enrO_fx, NB_BANDS ); /* fr_bands_fx_q */ st->hNoiseEst->q_enrO = fr_bands_fx_q; @@ -1676,7 +1676,7 @@ ivas_error pre_proc_front_ivas_fx( st->q_Bin_E = add( *Q_new, Q_SCALE - 2 ); move16(); /* 2nd stage speech/music classification (ACELP/GSC/TCX core selection) */ - ivas_smc_mode_selection_fx( st, element_brate, smc_dec, *relE_fx, Etot_fx, attack_flag, inp_12k8_fx, *Q_new, S_map_fx, flag_spitch ); + ivas_smc_mode_selection_fx( st, element_brate, smc_dec, *relE_fx, extract_h( Etot_fx ), attack_flag, inp_12k8_fx, *Q_new, S_map_fx, flag_spitch ); } #ifdef DEBUG_FORCE_DIR diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index b5ed69560..a05493aa4 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -735,8 +735,8 @@ ivas_error ivas_cpe_enc_fx( move16(); } - Etot_last_fx[0] = sts[0]->hNoiseEst->Etot_last_fx; /* Q8 */ - Etot_last_fx[1] = sts[1]->hNoiseEst->Etot_last_fx; /* Q8 */ + Etot_last_fx[0] = extract_h( sts[0]->hNoiseEst->Etot_last_32fx ); /* Q8 */ + Etot_last_fx[1] = extract_h( sts[1]->hNoiseEst->Etot_last_32fx ); /* Q8 */ move16(); move16(); } diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index f3cf05e63..124ab2996 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -90,6 +90,7 @@ ivas_error front_vad_fx( ivas_error error; Word16 Q_new; Word16 Qband, mem_decim_size; + Word32 Etot_LR_32fx; error = IVAS_ERR_OK; push_wmops( "front_vad" ); move16(); @@ -248,7 +249,7 @@ ivas_error front_vad_fx( move16(); ivas_analy_sp_fx( IVAS_CPE_TD, hCPE, sts[0]->input_Fs, hFrontVad->buffer_12k8_fx + L_FFT / 2 - 3 * ( L_SUBFR / 2 ), Q_new, fr_bands_fx[n], - &q_fr_bands[n], lf_E_fx[n], &q_lf_E[n], &Etot_LR_fx[n], sts[0]->min_band, sts[0]->max_band, Bin_E_fx, &q_Bin_E, Bin_E_old_fx, + &q_fr_bands[n], lf_E_fx[n], &q_lf_E[n], &Etot_LR_32fx, sts[0]->min_band, sts[0]->max_band, Bin_E_fx, &q_Bin_E, Bin_E_old_fx, &q_Bin_E_old, PS_fx, q_PS_out, lgBin_E_fx, band_energies_fx, &q_band_energies, fft_buffLR_fx, &q_fft_buffLR ); if ( n == 0 ) { @@ -275,9 +276,10 @@ ivas_error front_vad_fx( /* add up energies for later calculating average of channel energies */ - Word32 Etot_fx = L_deposit_h( Etot_LR_fx[n] ); /* Q24 */ + noise_est_pre_32fx( Etot_LR_32fx, hFrontVads[0]->ini_frame, hFrontVad->hNoiseEst, 0, 0, 0 ); - noise_est_pre_32fx( Etot_fx, hFrontVads[0]->ini_frame, hFrontVad->hNoiseEst, 0, 0, 0 ); + Etot_LR_fx[n] = extract_h( Etot_LR_32fx ); + move16(); /* wb_vad */ Word16 scale = s_min( q_fr_bands[n], add( hFrontVads[n]->hNoiseEst->q_enrO, L_norm_arr( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS ) ) ); @@ -611,7 +613,7 @@ ivas_error front_vad_spar_fx( Word16 q_tmpN, q_tmpE; noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, &hFrontVad->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, - &hFrontVad->hNoiseEst->totalNoise_fx, Etot_fx[0], &hFrontVad->hNoiseEst->Etot_last_fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx ); + &hFrontVad->hNoiseEst->totalNoise_fx, Etot_fx[0], &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx ); corr_shift_fx = correlation_shift_fx( hFrontVad->hNoiseEst->totalNoise_fx ); /* Q15 */ @@ -753,7 +755,7 @@ ivas_error front_vad_spar_fx( noise_est_ivas_fx( st, old_pitch, tmpN_fx, epsP_fx, Etot_fx[0], sub( Etot_fx[0], hFrontVad->lp_speech_fx ), corr_shift_fx, tmpE_fx, hFrontVad->hNoiseEst->ave_enr_q, fr_bands_fx[0], q_fr_bands[0], &cor_map_sum_fx, NULL, &sp_div_fx, &Q_sp_div, &non_staX_fx, &loc_harm, - lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, hFrontVad->hNoiseEst->Etot_l_lp_fx, hFrontVad->hNoiseEst->Etot_v_h2_fx, + lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, extract_h( hFrontVad->hNoiseEst->Etot_l_lp_32fx ), hFrontVad->hNoiseEst->Etot_v_h2_fx, &hFrontVad->hNoiseEst->bg_cnt, st->lgBin_E_fx, &sp_floor, S_map_fx, NULL, hFrontVad, hFrontVad->ini_frame ); MVR2R_WORD16( st->pitch, st->pitch, 3 ); diff --git a/lib_enc/ivas_stereo_td_analysis_fx.c b/lib_enc/ivas_stereo_td_analysis_fx.c index 1856370f6..909d0c206 100644 --- a/lib_enc/ivas_stereo_td_analysis_fx.c +++ b/lib_enc/ivas_stereo_td_analysis_fx.c @@ -340,8 +340,8 @@ Word16 stereo_tdm_ener_analysis_fx( test(); IF( ( LE_32( hStereoTD->tdm_lt_rms_L_fx, rms_thd_fx ) && LE_32( hStereoTD->tdm_lt_rms_R_fx, L_shl( rms_thd_fx, 1 ) ) ) || ( LE_32( hStereoTD->tdm_lt_rms_R_fx, rms_thd_fx ) && LE_32( hStereoTD->tdm_lt_rms_L_fx, L_shl( rms_thd_fx, 1 ) ) ) || - ( sts[0]->hVAD->hangover_cnt != 0 && LT_16( sts[1]->hNoiseEst->Etot_last_fx, 3072 /*12 in Q8*/ ) ) || - ( sts[1]->hVAD->hangover_cnt != 0 && LT_16( sts[0]->hNoiseEst->Etot_last_fx, 3072 /*12 in Q8*/ ) ) || + ( sts[0]->hVAD->hangover_cnt != 0 && LT_32( sts[1]->hNoiseEst->Etot_last_32fx, 201326592 /*12 in Q24*/ ) ) || + ( sts[1]->hVAD->hangover_cnt != 0 && LT_32( sts[0]->hNoiseEst->Etot_last_32fx, 201326592 /*12 in Q24*/ ) ) || ( NE_16( sts[0]->hSpMusClas->past_dec[0], sts[1]->hSpMusClas->past_dec[0] ) ) ) { test(); @@ -873,8 +873,8 @@ static Word16 Get_dt_lt_ener_fx( move32(); *tdm_lt_rms_R = L_shl( Mpy_32_32( 1932735282 /* 0.9f in Q31 */, rms_R ), sub( Q16, q_rms_R ) ); // (Q31, q_rms_R) -> q_rms_R -> Q16 move32(); - L_tmp = Mpy_32_16_1( 1932735282 /* 0.9f in Q31 */, sts[0]->hNoiseEst->Etot_last_fx ); //(Q31, Q8) -> Q24 - sts[1]->hNoiseEst->Etot_last_fx = extract_h( L_tmp ); // (Q24 >> Q16) -> Q8 + L_tmp = Mpy_32_32( 1932735282 /* 0.9f in Q31 */, sts[0]->hNoiseEst->Etot_last_32fx ); //(Q31, Q24) -> Q24 + sts[1]->hNoiseEst->Etot_last_32fx = L_tmp; // (Q24 >> Q16) -> Q8 sts[1]->hVAD->hangover_cnt = 0; move16(); } diff --git a/lib_enc/long_enr_fx.c b/lib_enc/long_enr_fx.c index af57edd3b..60c40b3fe 100644 --- a/lib_enc/long_enr_fx.c +++ b/lib_enc/long_enr_fx.c @@ -94,7 +94,7 @@ void ivas_long_enr_fx( } FOR( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->hNoiseEst->Etot_last_fx = Etot_LR[n]; /* Q8 */ + hFrontVad[n]->hNoiseEst->Etot_last_32fx = L_deposit_h( Etot_LR[n] ); /* Q24 */ move16(); } } @@ -141,7 +141,7 @@ void ivas_long_enr_fx( } } /* Update */ - st_fx->hNoiseEst->Etot_last_fx = Etot; /* Q8 */ + st_fx->hNoiseEst->Etot_last_32fx = L_deposit_h( Etot ); /* Q24 */ move16(); } diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index c8f698da9..d8131f10e 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -359,8 +359,8 @@ void noise_est_init_ivas_fx( hNoiseEst->Etot_lp_fx = 0; hNoiseEst->Etot_h_fx = 0; hNoiseEst->Etot_l_fx = 0; - hNoiseEst->Etot_l_lp_fx = 0; - hNoiseEst->Etot_last_fx = 0; + hNoiseEst->Etot_l_lp_32fx = 0; + hNoiseEst->Etot_last_32fx = 0; hNoiseEst->Etot_v_h2_fx = 0; hNoiseEst->sign_dyn_lp_fx = 0; move16(); @@ -368,8 +368,8 @@ void noise_est_init_ivas_fx( move16(); move16(); move16(); - move16(); - move16(); + move32(); + move32(); return; } @@ -510,10 +510,10 @@ void noise_est_pre_32fx( move32(); Etot_l_32fx = Etot; move32(); - hNoiseEst->Etot_l_lp_fx = extract_h( Etot ); // Q8 - move16(); - hNoiseEst->Etot_last_fx = extract_h( Etot ); // Q8 - move16(); + hNoiseEst->Etot_l_lp_32fx = Etot; // Q24 + move32(); + hNoiseEst->Etot_last_32fx = Etot; // Q24 + move32(); hNoiseEst->Etot_v_h2_fx = 0; move16(); Etot_lp_32fx = Etot; @@ -538,20 +538,20 @@ void noise_est_pre_32fx( ) { /* *Etot_l += min(2,(*Etot_last-*Etot_l)*0.1f); */ - tmp = Mpy_32_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 214748365 ); /* 0.1f factor in Q31 */ - tmp = L_min( 33554432, tmp ); /* 2.0 in Q24 is 33554432 */ - Etot_l_32fx = L_add( Etot_l_32fx, tmp ); /* Q24 */ + tmp = Mpy_32_32( L_sub( ( hNoiseEst->Etot_last_32fx ), Etot_l_32fx ), 214748365 ); /* 0.1f factor in Q31 */ + tmp = L_min( 33554432, tmp ); /* 2.0 in Q24 is 33554432 */ + Etot_l_32fx = L_add( Etot_l_32fx, tmp ); /* Q24 */ } /* Avoids large steps in short active segments */ test(); - IF( ( GT_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 503316480 ) ) /* 30.0f*Q24 */ + IF( ( GT_32( L_sub( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), 503316480 ) ) /* 30.0f*Q24 */ && ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_PRE_SHORT_FX ) ) ) { /* *Etot_l += (*Etot_last-*Etot_l)*0.02f; */ - Etot_l_32fx = L_add( Etot_l_32fx, Mpy_32_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 42949673 ) ); /* 0.02 in Q24*/ + Etot_l_32fx = L_add( Etot_l_32fx, Mpy_32_32( L_sub( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), 42949673 ) ); /* 0.02 in Q24*/ } - ELSE IF( GT_32( L_sub( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), 167772160 ) ) /* 10.0 in Q24*/ + ELSE IF( GT_32( L_sub( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), 167772160 ) ) /* 10.0 in Q24*/ { Etot_l_32fx = L_add( Etot_l_32fx, 1342177 ); /* 0.08 in Q24*/ } @@ -560,10 +560,10 @@ void noise_est_pre_32fx( Etot_l_32fx = L_min( Etot_l_32fx, Etot ); // Q24 test(); - IF( LT_16( ini_frame_fx, 100 ) && LT_32( Etot_l_32fx, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) + IF( LT_16( ini_frame_fx, 100 ) && LT_32( Etot_l_32fx, ( hNoiseEst->Etot_l_lp_32fx ) ) ) { /**Etot_l_lp = 0.1f * *Etot_l + (1.0f - 0.1) * *Etot_l_lp; */ - hNoiseEst->Etot_l_lp_fx = extract_h( L_add( Mpy_32_32( 214748364 /* 0.1f in Q31*/, Etot_l_32fx ), Mpy_32_32( 1932735283 /* 0.9f in Q31*/, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) ); // Q8 + hNoiseEst->Etot_l_lp_32fx = W_round64_L( W_add( W_mult_32_32( 214748364 /* 0.1f in Q31*/, Etot_l_32fx ), W_mult_32_32( 1932735283 /* 0.9f in Q31*/, hNoiseEst->Etot_l_lp_32fx ) ) ); // Q8 move16(); } ELSE @@ -572,16 +572,16 @@ void noise_est_pre_32fx( test(); test(); test(); - IF( ( ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) ) && ( GT_32( L_sub_sat( L_deposit_h( hNoiseEst->Etot_last_fx ), Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) || ( ( sub( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) > 0 ) && ( LT_16( ini_frame_fx, HE_LT_CNT_INIT_FX ) ) ) || ( GT_32( L_sub_sat( L_deposit_h( hNoiseEst->Etot_l_lp_fx ), Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) + IF( ( ( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) ) && ( GT_32( L_sub_sat( hNoiseEst->Etot_last_32fx, Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) || ( ( sub( hNoiseEst->harm_cor_cnt, HE_LT_CNT_FX ) > 0 ) && ( LT_16( ini_frame_fx, HE_LT_CNT_INIT_FX ) ) ) || ( GT_32( L_sub_sat( hNoiseEst->Etot_l_lp_32fx, Etot_l_32fx ), HE_LT_THR2_Q24 ) ) ) { /**Etot_l_lp = 0.03f * *Etot_l + (1.0f - 0.03f) * *Etot_l_lp; */ - hNoiseEst->Etot_l_lp_fx = extract_h( L_add( Mpy_32_32( 64424509 /* 0.03f in Q31*/, Etot_l_32fx ), Mpy_32_32( 2083059139 /* 0.97f in Q31*/, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) ); // Q8 + hNoiseEst->Etot_l_lp_32fx = W_extract_h( W_add( W_mult_32_32( 64424509 /* 0.03f in Q31*/, Etot_l_32fx ), W_mult_32_32( 2083059139 /* 0.97f in Q31*/, hNoiseEst->Etot_l_lp_32fx ) ) ); // Q24 move16(); } ELSE { /* *Etot_l_lp = 0.02f * *Etot_l + (1.0f - 0.02f) * *Etot_l_lp; */ - hNoiseEst->Etot_l_lp_fx = extract_h( L_add( Mpy_32_32( 42949673 /* 0.02f in Q31*/, Etot_l_32fx ), Mpy_32_32( 2104533975 /* 0.98f in Q31*/, L_deposit_h( hNoiseEst->Etot_l_lp_fx ) ) ) ); // Q8 + hNoiseEst->Etot_l_lp_32fx = W_extract_h( W_add( W_mult_32_32( 42949673 /* 0.02f in Q31*/, Etot_l_32fx ), W_mult_32_32( 2104533975 /* 0.98f in Q31*/, hNoiseEst->Etot_l_lp_32fx ) ) ); // Q24 move16(); } } @@ -748,8 +748,8 @@ void noise_est_down_ivas_fx( const Word16 min_band, /* i : minimum critical band */ const Word16 max_band, /* i : maximum critical band */ Word16 *totalNoise, /* o : noise estimate over all critical bands */ - Word16 Etot, /* i : Energy of current frame */ - Word16 *Etot_last, /* i/o: Energy of last frame Q8 */ + Word32 Etot, /* i : Energy of current frame */ + Word32 *Etot_last, /* i/o: Energy of last frame Q8 */ Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ ) @@ -770,8 +770,9 @@ void noise_est_down_ivas_fx( Copy32( bckr, bckr32, NB_BANDS ); set16_fx( bckr_q, *q_bckr, NB_BANDS ); - L_Etot = L_shl( Etot, 16 ); /*Q24 for later AR1 computations*/ - L_Etot_last = L_shl( *Etot_last, 16 ); + L_Etot = Etot; /*Q24 for later AR1 computations*/ + move32(); + L_Etot_last = *Etot_last; L_Etot_v_h2 = L_shl( *Etot_v_h2, 16 ); /*-----------------------------------------------------------------* @@ -2989,7 +2990,7 @@ void noise_est_ivas_fx( move16(); /* st->lt_Ellp_dist = 0.03f* (Etot - st->Etot_l_lp) + 0.97f*st->lt_Ellp_dist;*/ - tmp = sub( Etot, hNoiseEst->Etot_l_lp_fx ); /* Q8 */ + tmp = sub( Etot, extract_h( hNoiseEst->Etot_l_lp_32fx ) ); /* Q8 */ hNoiseEst->lt_Ellp_dist_fx = mac_r( L_mult( tmp, 983 /* 0.03 in Q15*/ ), hNoiseEst->lt_Ellp_dist_fx, 31785 /* 0.97 in Q15*/ ); // Q8 move16(); @@ -3180,7 +3181,7 @@ void noise_est_ivas_fx( { tmp = shl( tmp, 1 ); /*1.5 + 1.5 Q13 */ } - Ltmp = L_deposit_h( hNoiseEst->Etot_l_lp_fx ); + Ltmp = hNoiseEst->Etot_l_lp_32fx; Etot_l_lp_thr = round_fx( L_add( Ltmp, L_shl( L_mult( tmp, Etot_v_h2 ), 2 ) ) ); /* Q13+Q8+1 +2 = Q24 -> Q8*/ /* enr_bgd = Etot < Etot_l_lp_thr; */ @@ -3365,8 +3366,8 @@ void noise_est_ivas_fx( move16(); test(); test(); - if ( ( GT_16( hNoiseEst->sign_dyn_lp_fx, 15 * 256 ) ) /* 15 in Q8 */ - && ( LT_16( sub( Etot, hNoiseEst->Etot_l_lp_fx ), shl( Etot_v_h2, 1 ) ) ) /* Q8 , Etot_v_h2 has limited dynmics can be upscaled*/ + if ( ( GT_16( hNoiseEst->sign_dyn_lp_fx, 15 * 256 ) ) /* 15 in Q8 */ + && ( LT_16( sub( Etot, extract_h( hNoiseEst->Etot_l_lp_32fx ) ), shl( Etot_v_h2, 1 ) ) ) /* Q8 , Etot_v_h2 has limited dynmics can be upscaled*/ && ( GT_16( *st_harm_cor_cnt, 20 ) ) ) { sd1_bgd = 1; diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 120dd42b5..4237aa9c3 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -369,8 +369,8 @@ void noise_est_down_ivas_fx( const Word16 min_band, /* i : minimum critical band */ const Word16 max_band, /* i : maximum critical band */ Word16 *totalNoise, /* o : noise estimate over all critical bands */ - Word16 Etot, /* i : Energy of current frame */ - Word16 *Etot_last, /* i/o: Energy of last frame Q8 */ + Word32 Etot, /* i : Energy of current frame */ + Word32 *Etot_last, /* i/o: Energy of last frame Q8 */ Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ ); @@ -2230,7 +2230,7 @@ void ivas_analy_sp_fx( Word16 *q_fr_bands, /* o : energy in critical frequency bands Q0 */ Word32 *lf_E, /* o : per bin E for first... q_lf_E */ Word16 *q_lf_E, /* o : per bin E for first... Q0 */ - Word16 *Etot, /* o : total input energy Q8 */ + Word32 *Etot, /* o : total input energy Q24 */ const Word16 min_band, /* i : minimum critical band Q0 */ const Word16 max_band, /* i : maximum critical band Q0 */ Word32 *Bin_E, /* o : per-bin energy spectrum q_Bin_E */ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index c6176709b..4fe5bb8a4 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -545,8 +545,10 @@ typedef struct noise_estimation_structure Word16 bg_cnt; /* Noise estimator - pause length counter */ Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ - Word16 Etot_l_lp_fx; /* Q8 Noise estimator - Smoothed low energy */ - Word16 Etot_last_fx; /*Q8*/ + Word16 Etot_l_lp_fx; /* EVS- Q8 Noise estimator - Smoothed low energy */ + Word32 Etot_l_lp_32fx; /* IVAS-Q24 Noise estimator - Smoothed low energy */ + Word16 Etot_last_fx; /*EVS- Q8*/ + Word32 Etot_last_32fx; /* IVAS - Q24*/ Word16 Etot_lp_fx; /* Q8 Noise estimator - Filtered input energy */ Word16 lt_tn_track_fx; /* Q15 */ diff --git a/lib_enc/updt_enc_fx.c b/lib_enc/updt_enc_fx.c index fb2a6215b..1210bfd04 100644 --- a/lib_enc/updt_enc_fx.c +++ b/lib_enc/updt_enc_fx.c @@ -362,7 +362,14 @@ void updt_enc_common_fx( move16(); st->last_bwidth = st->bwidth; move16(); - st->hNoiseEst->Etot_last_fx = Etot; + IF( GT_16( st->element_mode, EVS_MONO ) ) + { + st->hNoiseEst->Etot_last_32fx = L_deposit_h( Etot ); + } + ELSE + { + st->hNoiseEst->Etot_last_fx = Etot; + } move16(); st->last_coder_type_raw = st->coder_type_raw; move16(); -- GitLab From 349ac68863f3031e5bae907dacb9057e43856504 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 23 Apr 2025 17:10:00 +0530 Subject: [PATCH 0414/1310] Fix for 3GPP issue 1487: Basop Encoder: Stereo DTX Front VAD Flag Mismatch Link #1487 --- lib_enc/nois_est_fx.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index c8f698da9..2e03f40a9 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -2253,6 +2253,7 @@ void noise_est_ivas_fx( Word16 tmp_enr, tmp_floor; /* constants in Q8 */ Word16 vad_bwidth_fx; /* vad ns control variabel for input bwidth from teh BWD */ /* for DTX operation */ + Word32 L_tmp; Word16 lim_Etot_fx; /* Q8 */ Word32 lim_Etot_sq_fx; /* Q16 */ @@ -3001,7 +3002,7 @@ void noise_est_ivas_fx( } */ IF( *st_harm_cor_cnt == 0 ) { - hNoiseEst->lt_haco_ev_fx = mac_r( 64424509 /* 0.03 in Q32*/, hNoiseEst->lt_haco_ev_fx, 31785 /* 0.97 in Q15*/ ); // Q15 + hNoiseEst->lt_haco_ev_fx = mac_r( 64424509 /* 0.03 in Q31*/, hNoiseEst->lt_haco_ev_fx, 31785 /* 0.97 in Q15*/ ); // Q15 move16(); } ELSE @@ -3558,14 +3559,14 @@ void noise_est_ivas_fx( } /*st->lt_aEn_zero = 0.2f * (st->aEn==0) + (1-0.2f) *st->lt_aEn_zero;*/ /* y(n+1)= alpha*tmp + (1-alpha)*y(n) */ - tmp = 0; - move16(); + L_tmp = 0; + move32(); if ( hNoiseEst->aEn == 0 ) { - tmp = 6554; // 0.2 in Q15 - move16(); + L_tmp = 429496730; // 0.2 in Q31 + move32(); } - hNoiseEst->lt_aEn_zero_fx = mac_r( tmp, hNoiseEst->lt_aEn_zero_fx, 26214 /* 0.8 in Q15*/ ); // Q15 + hNoiseEst->lt_aEn_zero_fx = mac_r( L_tmp, hNoiseEst->lt_aEn_zero_fx, 26214 /* 0.8 in Q15*/ ); // Q15 move16(); IF( st_fx->element_mode > EVS_MONO ) -- GitLab From 378ba3b0fea391be2efeffe706c7fae3c064f760 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 24 Apr 2025 11:26:14 +1000 Subject: [PATCH 0415/1310] increase instrumentation build timeout to 10 mins --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0b7fe26eb..73af86312 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1002,7 +1002,7 @@ build-codec-linux-instrumented-make: when: never extends: - .build-job-linux - timeout: "7 minutes" + timeout: "10 minutes" script: - *print-common-info - *update-scripts-repo -- GitLab From d380e91f41bac21f7b4a96e1b776fb8d53a75304 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 24 Apr 2025 12:35:36 +0530 Subject: [PATCH 0416/1310] Fix for 3GPP issue 1507: BASOP decoder asserts in ivas_hq_phase_ecu_fx with OMASA FER bitstream from BASOP encoder Link #1507 --- lib_dec/ivas_stereo_dft_plc_fx.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 90d9c5823..3fed308b2 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -188,6 +188,8 @@ Word32 imax_pos_fx( Word32 posi, y1, y2, y3, y3_y1, y2i; Word32 ftmp_den1, ftmp_den2; Word16 q_div_2i, q_div_posi; + Word64 W_tmp; + Word16 shift1, shift2; /* Seek the extrema of the parabola P(x) defined by 3 consecutive points so that P([-1 0 1]) = [y1 y2 y3] */ y1 = y[0]; /* Qx */ move32(); @@ -195,9 +197,13 @@ Word32 imax_pos_fx( move32(); y3 = y[2]; /* Qx */ move32(); - y3_y1 = L_sub( y3, y1 ); /* Qx */ - ftmp_den1 = L_sub( L_add( y1, y3 ), L_shl( y2, 1 ) ); /* Qx */ - ftmp_den2 = L_shl( L_sub( L_sub( L_shl( y2, 1 ), y1 ), y3 ), 1 ); /* Qx */ + y3_y1 = L_sub( y3, y1 ); /* Qx */ + W_tmp = W_sub( W_add( y1, y3 ), W_shl( y2, 1 ) ); /* Qx */ + shift1 = W_norm( W_tmp ); + ftmp_den1 = W_extract_h( W_shl( W_tmp, shift1 ) ); /* Qx + shift1 - 32 */ + W_tmp = W_shl( W_sub( W_sub( W_shl( y2, 1 ), y1 ), y3 ), 1 ); /* Qx */ + shift2 = W_norm( W_tmp ); + ftmp_den2 = W_extract_h( W_shl( W_tmp, shift2 ) ); /* Qx + shift2 - 32 */ test(); IF( ( ftmp_den2 == 0 ) || ( ftmp_den1 == 0 ) ) @@ -206,6 +212,7 @@ Word32 imax_pos_fx( } y2i = Mpy_32_16_1( Mpy_32_16_1( y3_y1, BASOP_Util_Divide3232_Scale( y3_y1, ftmp_den1, &q_div_2i ) ), (Word16) ( 0xF000 ) ); /* q_div_2i */ + q_div_2i = sub( add( q_div_2i, shift1 ), 32 ); IF( q_div_2i < 0 ) { y2i = L_shl( y2i, q_div_2i ); @@ -219,6 +226,7 @@ Word32 imax_pos_fx( } /* their corresponding normalized locations */ posi = BASOP_Util_Divide3232_Scale( y3_y1, ( ftmp_den2 ), &q_div_posi ); /* q_div_posi */ + q_div_posi = sub( add( q_div_posi, shift2 ), 32 ); IF( ( q_div_posi != 0 ) ) { posi = L_shl( posi, q_div_posi ); -- GitLab From 4497161299ef1dede088c335652edca3d7d9aa8f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 09:06:20 +0200 Subject: [PATCH 0417/1310] increase timeout for build jobs --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 73af86312..4e7d36f24 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -986,6 +986,7 @@ build-codec-linux-make: when: never extends: - .build-job-linux + timeout: "10 minutes" script: - *print-common-info - *activate-Werror-linux @@ -1019,7 +1020,7 @@ build-codec-linux-debugging-make: when: never extends: - .build-job-linux - timeout: "7 minutes" + timeout: "10 minutes" variables: BUILD_WITH_DEBUG_MODE_INFO: "true" script: @@ -1037,7 +1038,7 @@ build-codec-windows-msbuild: when: never extends: - .build-job-windows - timeout: "7 minutes" + timeout: "10 minutes" tags: - ivas-windows script: -- GitLab From 70db4d8ec6578dfc7a68a93ac9b8a50c0739313c Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 24 Apr 2025 09:24:12 +0200 Subject: [PATCH 0418/1310] bug fix --- lib_util/hrtf_file_reader.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index af13fe866..7626b19e9 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1556,7 +1556,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( f_tmp = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); ( *hHRTF )->FASTCONV_HRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); -#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1624,7 +1624,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ( *hHRTF )->FASTCONV_HOA3_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); -#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1696,7 +1696,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } hrtf_data_rptr += sizeof( uint16_t ); -#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1757,7 +1757,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ( *hHRTF )->FASTCONV_FOA_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); -#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1825,7 +1825,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ( *hHRTF )->FASTCONV_BRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); -#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); -- GitLab From 633745fa5271180e9f2687d2544bf5588f159fcd Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 24 Apr 2025 12:30:34 +0530 Subject: [PATCH 0419/1310] Changes to address 3GPP issue 1276 --- lib_enc/init_enc_fx.c | 9 ++++ lib_enc/ivas_core_pre_proc_front_fx.c | 70 ++++++++++++++------------ lib_enc/ivas_stereo_mdct_core_enc_fx.c | 2 +- lib_enc/stat_enc.h | 15 ++++-- 4 files changed, 58 insertions(+), 38 deletions(-) diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index e200d0f00..98d7fe957 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1184,6 +1184,8 @@ ivas_error init_encoder_ivas_fx( st->mem_preemph_fx = 0; move16(); + st->mem_preemph_fx_q_inp = 0; + move16(); st->mem_preemph16k_fx = 0; move16(); st->mem_preemph_enc = 0; @@ -1298,6 +1300,8 @@ ivas_error init_encoder_ivas_fx( /* stereo switching memories */ st->mem_preemph_DFT_fx = 0; move16(); + st->mem_preemph_DFT_fx_q_inp = 0; + move16(); set16_fx( st->inp_12k8_mem_stereo_sw_fx, 0, sub( sub( STEREO_DFT_OVL_12k8, L_MEM_RECALC_12K8 ), L_FILT ) ); st->mem_preemph16k_DFT_fx = 0; move16(); @@ -1397,6 +1401,7 @@ ivas_error init_encoder_ivas_fx( st->q_Bin_E_old = Q31; move16(); set16_fx( st->mem_decim_fx, 0, shl( L_FILT_MAX, 1 ) ); + set16_fx( st->mem_decim_fx_q_inp, 0, shl( L_FILT_MAX, 1 ) ); set16_fx( st->mem_decim16k_fx, 0, shl( L_FILT_MAX, 1 ) ); set16_fx( st->old_inp_12k8_fx, 0, L_INP_MEM ); set16_fx( st->old_inp_16k_fx, 0, L_INP_MEM ); @@ -1410,6 +1415,10 @@ ivas_error init_encoder_ivas_fx( set16_fx( st->input_buff_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ); st->q_inp = Q15; move16(); + st->mem_preemph_q = Q15; + move16(); + st->mem_q = Q15; + move16(); st->q_old_inp = Q15; move16(); set32_fx( st->input_buff32_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ); diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index b9a15cd35..3d7d87bc2 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -499,15 +499,16 @@ ivas_error pre_proc_front_ivas_fx( * Change the sampling frequency to 12.8 kHz * (if not available from downsampled DMX) *----------------------------------------------------------------*/ - - Scale_sig( st->mem_decim_fx, 2 * L_FILT_MAX, sub( st->q_inp, Q_inp_const ) ); /* st->q_inp */ + Scale_sig( st->mem_decim_fx_q_inp, 2 * L_FILT_MAX, sub( st->q_inp, st->mem_q ) ); /* st->q_inp */ test(); + IF( EQ_16( element_mode, IVAS_SCE ) ) { - new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx, input_frame, input_Fs, new_inp_12k8_fx, INT_FS_12k8, st->mem_decim_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */ - Scale_sig( new_inp_12k8_fx, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ - - Copy( st->mem_decim_fx, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* Q(-1) */ + new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx, input_frame, input_Fs, new_inp_12k8_fx, INT_FS_12k8, st->mem_decim_fx_q_inp, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ + st->mem_q = st->q_inp; + move16(); + Copy( st->mem_decim_fx_q_inp, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* Q(-1) */ set16_fx( temp1F_icatdmResampBuf_fx, 0, L_FILT_MAX ); new_inp_out_size = modify_Fs_ivas_fx( temp1F_icatdmResampBuf_fx, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), input_Fs, new_inp_12k8_fx + L_FRAME, INT_FS_12k8, mem_decim_dummy_fx, 0, &Q_new_inp, &mem_decim_size ); /* st->q_inp */ Scale_sig( new_inp_12k8_fx + L_FRAME, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ @@ -521,13 +522,15 @@ ivas_error pre_proc_front_ivas_fx( Word16 length_inp = NS2SA_FX2( input_Fs, L_MEM_RECALC_SCH_NS ); Word16 length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); - new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, INT_FS_12k8, st->mem_decim_fx, 0, &Q_new_inp, &mem_decim_size ); /* st->q_inp */ - Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ + new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc - length_inp, length_inp, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, INT_FS_12k8, st->mem_decim_fx_q_inp, 0, &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ } - new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc, input_frame, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8, INT_FS_12k8, st->mem_decim_fx, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */ - Copy( st->mem_decim_fx, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* st->q_inp */ - Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ + new_inp_out_size = modify_Fs_ivas_fx( signal_in_fx - lMemRecalc, input_frame, input_Fs, new_inp_12k8_fx - lMemRecalc_12k8, INT_FS_12k8, st->mem_decim_fx_q_inp, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */ + st->mem_q = st->q_inp; + move16(); + Copy( st->mem_decim_fx_q_inp, mem_decim_dummy_fx, 2 * L_FILT_MAX ); /* st->q_inp */ + Scale_sig( new_inp_12k8_fx - lMemRecalc_12k8, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/ IF( lMemRecalc > 0 ) { @@ -541,10 +544,13 @@ ivas_error pre_proc_front_ivas_fx( ELSE /* DFT stereo */ { /* update the FIR resampling filter memory, needed for switching to time-domain (FIR) resampling */ - Copy( signal_in_fx + sub( input_frame, add( NS2SA_FX2( input_Fs, L_MEM_RECALC_NS ), 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ) ), st->mem_decim_fx, 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ); /* st->q_inp */ + Copy( signal_in_fx + sub( input_frame, add( NS2SA_FX2( input_Fs, L_MEM_RECALC_NS ), 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ) ), st->mem_decim_fx_q_inp, 2 * NS2SA_FX2( input_Fs, DELAY_FIR_RESAMPL_NS ) ); /* st->q_inp */ + st->mem_q = st->q_inp; + move16(); scale_sig( old_inp_12k8_fx, L_INP_MEM - STEREO_DFT_OVL_12k8, sub( Q_inp_const, st->q_inp ) ); scale_sig( st->input_fx - input_frame, input_frame_full, sub( Q_inp_const, st->q_inp ) ); - Scale_sig( st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ + Copy_Scale_sig( st->mem_decim_fx_q_inp, st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ + // Scale_sig( st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ st->q_inp = Q_inp_const; move16(); st->q_old_inp = Q_inp_const; @@ -552,7 +558,7 @@ ivas_error pre_proc_front_ivas_fx( } IF( NE_16( Q_inp_const, st->q_inp ) ) { - Scale_sig( st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ + Copy_Scale_sig( st->mem_decim_fx_q_inp, st->mem_decim_fx, 2 * L_FILT_MAX, sub( Q_inp_const, st->q_inp ) ); /* Q(-1) */ } Scale_sig( st->buf_speech_enc, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, sub( -1, sub( 15, st->exp_buf_speech_enc ) ) ); /* Q(-1) */ @@ -585,24 +591,23 @@ ivas_error pre_proc_front_ivas_fx( headroom = 2; move16(); - - st->mem_preemph_fx = shl_sat( st->mem_preemph_fx, sub( st->q_inp, -1 ) ); /*st->q_inp*/ + st->mem_preemph_fx_q_inp = shl_sat( st->mem_preemph_fx_q_inp, sub( st->q_inp, st->mem_preemph_q ) ); /*st->q_inp*/ move16(); - st->mem_preemph_DFT_fx = shl_sat( st->mem_preemph_DFT_fx, sub( st->q_inp, -1 ) ); /*st->q_inp*/ + st->mem_preemph_DFT_fx_q_inp = shl_sat( st->mem_preemph_DFT_fx_q_inp, sub( st->q_inp, st->mem_preemph_q ) ); /*st->q_inp*/ move16(); test(); IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { Copy_Scale_sig( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, st->inp_12k8_mem_stereo_sw_fx, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, sub( Q_inp_const, st->q_inp ) ); /* memory for TD/DFT stereo switching Q_inp_const*/ - st->mem_preemph_fx = st->mem_preemph_DFT_fx; /* st->q_inp */ + st->mem_preemph_fx_q_inp = st->mem_preemph_DFT_fx_q_inp; /* st->q_inp */ move16(); - st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* st->q_inp */ + st->mem_preemph_DFT_fx_q_inp = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* st->q_inp */ move16(); // PREEMPH_FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - dummy_fx = st->mem_preemph_fx; + PREEMPH_32FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx_q_inp ); + dummy_fx = st->mem_preemph_fx_q_inp; move16(); // PREEMPH_FX( new_inp_12k8_fx - STEREO_DFT_OVL_12k8 + L_FRAME, PREEMPH_FAC, STEREO_DFT_OVL_12k8, &dummy_fx ); @@ -618,18 +623,18 @@ ivas_error pre_proc_front_ivas_fx( { IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { - st->mem_preemph_fx = st->mem_preemph_DFT_fx; /* st->q_inp */ + st->mem_preemph_fx_q_inp = st->mem_preemph_DFT_fx_q_inp; /* st->q_inp */ move16(); Copy_Scale_sig( st->inp_12k8_mem_stereo_sw_fx, new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, sub( st->q_inp, Q_inp_const ) ); /* st->q_inp */ // PREEMPH_FX( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), sig_out, PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph_fx ); + PREEMPH_32FX( new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ), sig_out, PREEMPH_FAC, STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT, &st->mem_preemph_fx_q_inp ); preemp_start_idx = new_inp_12k8_fx - L_MEM_RECALC_12K8 - ( STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT ); move16(); preemp_len = STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT; move16(); } - st->mem_preemph_DFT_fx = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* st->q_inp */ + st->mem_preemph_DFT_fx_q_inp = old_inp_12k8_fx[L_INP_MEM - STEREO_DFT_OVL_12k8 + L_FRAME - 1]; /* st->q_inp */ move16(); } @@ -640,15 +645,15 @@ ivas_error pre_proc_front_ivas_fx( Word16 length_12k8 = NS2SA( INT_FS_12k8, L_MEM_RECALC_SCH_NS ); move16(); // PREEMPH_FX( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, PREEMPH_FAC, length_12k8, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, sig_out, PREEMPH_FAC, length_12k8, &st->mem_preemph_fx ); + PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8, sig_out, PREEMPH_FAC, length_12k8, &st->mem_preemph_fx_q_inp ); preemp_start_idx = new_inp_12k8_fx - lMemRecalc_12k8 - length_12k8; preemp_len = length_12k8; move16(); } // PREEMPH_FX( new_inp_12k8_fx - lMemRecalc_12k8, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8, sig_out + preemp_len, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - dummy_fx = st->mem_preemph_fx; /* st->q_inp */ + PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8, sig_out + preemp_len, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx_q_inp ); + dummy_fx = st->mem_preemph_fx_q_inp; /* st->q_inp */ move16(); // PREEMPH_FX( new_inp_12k8_fx - lMemRecalc_12k8 + L_FRAME, PREEMPH_FAC, lMemRecalc_12k8 + L_FILT, &dummy_fx ); PREEMPH_32FX( new_inp_12k8_fx - lMemRecalc_12k8 + L_FRAME, sig_out + preemp_len + L_FRAME, PREEMPH_FAC, lMemRecalc_12k8 + L_FILT, &dummy_fx ); @@ -669,8 +674,8 @@ ivas_error pre_proc_front_ivas_fx( ELSE /* IVAS_SCE or IVAS_CPE_MDCT */ { // PREEMPH_FX( new_inp_12k8_fx, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - PREEMPH_32FX( new_inp_12k8_fx, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx ); - dummy_fx = st->mem_preemph_fx; + PREEMPH_32FX( new_inp_12k8_fx, sig_out, PREEMPH_FAC, L_FRAME, &st->mem_preemph_fx_q_inp ); + dummy_fx = st->mem_preemph_fx_q_inp; move16(); // PREEMPH_FX( new_inp_12k8_fx + L_FRAME, PREEMPH_FAC, L_FILT, &dummy_fx ); PREEMPH_32FX( new_inp_12k8_fx + L_FRAME, sig_out + L_FRAME, PREEMPH_FAC, L_FILT, &dummy_fx ); @@ -678,11 +683,12 @@ ivas_error pre_proc_front_ivas_fx( preemp_len = L_FRAME + L_FILT; move16(); } - st->mem_preemph_fx = shl_sat( st->mem_preemph_fx, sub( -1, st->q_inp ) ); /*Q(-1) saturation added as float value goes above 65536 for +10 dB test (ltv48_MC512.wav and ltv48_MC51.wav) */ + st->mem_preemph_fx = shl_sat( st->mem_preemph_fx_q_inp, sub( -1, st->q_inp ) ); /*Q(-1) saturation added as float value goes above 65536 for +10 dB test (ltv48_MC512.wav and ltv48_MC51.wav) */ move16(); - st->mem_preemph_DFT_fx = shl( st->mem_preemph_DFT_fx, sub( -1, st->q_inp ) ); /*Q(-1)*/ + st->mem_preemph_DFT_fx = shl( st->mem_preemph_DFT_fx_q_inp, sub( -1, st->q_inp ) ); /*Q(-1)*/ + move16(); + st->mem_preemph_q = st->q_inp; move16(); - maximum_abs_32_fx( sig_out, preemp_len, &max_32 ); inp_max = s_max( extract_h( max_32 ), 1 ); diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index 1bd5c936b..8acbc3e87 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -370,7 +370,7 @@ void stereo_mdct_core_enc_fx( } } - exp1 = add( exp1, 1 ); /* 1 guard bit to avoid over-flows in stereo_coder_tcx_fx */ + exp1 = add( exp1, 2 ); /* 2 guard bit to avoid over-flows in stereo_coder_tcx_fx */ exp2 = add( exp2, 2 ); /* 2 guard bit to avoid over-flows in stereo_coder_tcx_fx (ms_processing_fx) */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 4fe5bb8a4..45ec01b31 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -1361,7 +1361,10 @@ typedef struct enc_core_structure Word16 no_scales_fx[MAX_NO_MODES][2]; /* LSF LVQ structure Q0*/ Word16 no_scales_p_fx[MAX_NO_MODES_p][2]; /* LSF LVQ structure Q0*/ - Word16 mem_preemph_fx; /* preemphasis filter memory Q(-1) */ + Word16 mem_preemph_fx; /* preemphasis filter memory Q(-1) */ + Word16 mem_q; /* preemphasis filter memory Q(-1) */ + Word16 mem_preemph_q; /* preemphasis filter memory Q(-1) */ + Word16 mem_preemph_fx_q_inp; /* preemphasis filter memory Q(-1) */ Word16 old_wsp_fx[L_WSP_MEM]; /* old weighted signal vector */ Word16 exp_old_wsp; @@ -1460,10 +1463,11 @@ typedef struct enc_core_structure SIGNAL_BUFFERS_ENC_HANDLE hSignalBuf; Word32 *Bin_E_old_fx; /* per bin energy of old 2nd frames */ Word16 q_Bin_E_old; - Word16 *mem_decim_fx; /* decimation filter memory Q(-1) */ - Word16 *mem_decim16k_fx; /* ACELP@16kHz - decimation filter memory @16kHz Q(-1) */ - Word16 *old_inp_12k8_fx; /* memory of input signal at 12.8kHz */ - Word16 *old_inp_16k_fx; /* ACELP@16kHz - memory of input signal @16 kHz */ + Word16 *mem_decim_fx; /* decimation filter memory Q(-1) */ + Word16 mem_decim_fx_q_inp[2 * L_FILT_MAX]; /* decimation filter memory Q(-1) */ + Word16 *mem_decim16k_fx; /* ACELP@16kHz - decimation filter memory @16kHz Q(-1) */ + Word16 *old_inp_12k8_fx; /* memory of input signal at 12.8kHz */ + Word16 *old_inp_16k_fx; /* ACELP@16kHz - memory of input signal @16 kHz */ Word16 *buf_speech_enc_pe; // exp_buf_speech_enc_pe Word16 *buf_synth; /*can be reduced to PIT_MAX_MAX+L_FRAME_MAX if no rate switching*/ @@ -1773,6 +1777,7 @@ typedef struct enc_core_structure /* stereo switching memories */ Word16 mem_preemph_DFT_fx; /* Q(-1) */ + Word16 mem_preemph_DFT_fx_q_inp; /* Q(-1) */ Word16 inp_12k8_mem_stereo_sw_fx[STEREO_DFT_OVL_12k8 - L_MEM_RECALC_12K8 - L_FILT]; /* Q(-1) */ Word16 mem_preemph16k_DFT_fx; /* Q(-1) */ Word16 inp_16k_mem_stereo_sw_fx[STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k]; /* Q(-1) */ -- GitLab From 92fc63690bd364029401987607c5eced0644944c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 11:00:24 +0200 Subject: [PATCH 0420/1310] Revert "[revert-me] add intentional crash + changed complexity" This reverts commit e4ed9c4fc8ce3752a732321b22278150ebc8dea8. --- lib_dec/ivas_jbm_dec_fx.c | 8 ++++---- lib_enc/ivas_enc_fx.c | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 8d4b10dec..74af57bd5 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -159,10 +159,10 @@ ivas_error ivas_jbm_dec_tc_fx( set32_fx( &p_output_fx[0][0], 0, L_FRAME48k ); set32_fx( &p_output_fx[1][0], 0, L_FRAME48k ); - // IF( ( error = ivas_cpe_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, 0 ) ) != IVAS_ERR_OK ) - // { - // return error; - // } + IF( ( error = ivas_cpe_dec_fx( st_ivas, 0, &p_output_fx[0], output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } IF( NE_16( q_output, Q11 ) ) { diff --git a/lib_enc/ivas_enc_fx.c b/lib_enc/ivas_enc_fx.c index 95f690c15..ff5f65b32 100644 --- a/lib_enc/ivas_enc_fx.c +++ b/lib_enc/ivas_enc_fx.c @@ -31,7 +31,6 @@ *******************************************************************************************************/ #include -#include #include #include "options.h" #include "cnst.h" @@ -188,7 +187,6 @@ ivas_error ivas_enc_fx( } ELSE IF( EQ_32( ivas_format, ISM_FORMAT ) ) { - assert( 0 ); /* select ISM format mode; reconfigure the ISM format encoder */ IF( ( error = ivas_ism_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { -- GitLab From d22d0d30279d95de9b0d4d6863f2074b8b083451 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 11:00:37 +0200 Subject: [PATCH 0421/1310] Revert "[revert-me] change script branch for testing" This reverts commit f9354b9c882b9f2206bc78976073c3ed5b572413. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f12628044..756432136 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "kiene/tmp-branch-for-complexity-cleanup" + BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 -- GitLab From 59e90cdd679f559b3431276b75258e0e1d4224e0 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 11:00:46 +0200 Subject: [PATCH 0422/1310] Revert "[revert-me] temporarily disable delay for testing" This reverts commit 1b059d6ef99d5f8155b0160e609fe56cc3c602f4. --- .gitlab-ci.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 756432136..780a51995 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1812,6 +1812,8 @@ complexity-ism-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 1 hour variables: JOB_ID_INJECT: "" script: @@ -1828,6 +1830,8 @@ complexity-ism-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 2 hours variables: JOB_ID_INJECT: "" script: @@ -1844,6 +1848,8 @@ complexity-ism-in-ext-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 3 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1860,6 +1866,8 @@ complexity-sba-hoa3-in-hoa3-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 4 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1876,6 +1884,8 @@ complexity-sba-hoa3-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 5 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1892,6 +1902,8 @@ complexity-sba-hoa3-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 6 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1908,6 +1920,8 @@ complexity-mc-in-7_1_4-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 7 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1924,6 +1938,8 @@ complexity-mc-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 10 hours variables: JOB_ID_INJECT: "" script: @@ -1940,6 +1956,8 @@ complexity-mc-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 12 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -1956,6 +1974,8 @@ complexity-masa-in-ext-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 15 hours variables: JOB_ID_INJECT: "" script: @@ -1972,6 +1992,8 @@ complexity-masa-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 16 hours variables: JOB_ID_INJECT: "" script: @@ -1988,6 +2010,8 @@ complexity-masa-in-hoa3-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 17 hours variables: JOB_ID_INJECT: "" script: @@ -2022,6 +2046,8 @@ complexity-omasa-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 18 hours variables: JOB_ID_INJECT: "" script: @@ -2038,6 +2064,8 @@ complexity-omasa-in-hoa3-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 20 hours variables: JOB_ID_INJECT: "" script: @@ -2054,6 +2082,8 @@ complexity-StereoDmxEVS-stereo-in-mono-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 22 hours variables: JOB_ID_INJECT: "" script: @@ -2070,6 +2100,8 @@ complexity-StereoDmxEVS-stereo-in-mono-out: # - .complexity-template # rules: # - if: $MEASURE_COMPLEXITY_LINUX +# when: delayed +# start_in: 17 hours # script: # - in_format=OSBA # - out_format=EXT @@ -2084,6 +2116,8 @@ complexity-osba-in-binaural-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 22 hours 30 minutes variables: JOB_ID_INJECT: "" script: @@ -2100,6 +2134,8 @@ complexity-osba-in-binaural_room_ir-out: - .complexity-template rules: - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 25 hours variables: JOB_ID_INJECT: "" script: -- GitLab From 8cdaa39df0c7b287efe951b8e5b72a52c172be9b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 24 Apr 2025 14:42:03 +0530 Subject: [PATCH 0423/1310] optimizing vector add and subtract, hp20 optimizations --- lib_com/hp50_fx.c | 85 +++++-------------- lib_com/mslvq_com_fx.c | 35 ++++++-- lib_com/options.h | 3 +- lib_com/prot_fx.h | 18 ++++ lib_com/tools.c | 20 +++++ lib_com/tools_fx.c | 20 +++++ lib_dec/fd_cng_dec_fx.c | 4 + lib_dec/ivas_dirac_dec_fx.c | 4 + lib_dec/ivas_jbm_dec_fx.c | 4 + lib_dec/ivas_mc_param_dec_fx.c | 5 ++ lib_enc/ivas_qmetadata_enc_fx.c | 18 +++- lib_enc/ivas_sns_enc_fx.c | 4 + lib_enc/speech_music_classif_fx.c | 4 + lib_rend/ivas_dirac_ana_fx.c | 4 + lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 7 ++ lib_rend/ivas_dirac_rend_fx.c | 12 ++- lib_rend/ivas_efap_fx.c | 29 ++++++- lib_rend/ivas_omasa_ana_fx.c | 5 ++ lib_rend/ivas_reverb_fx.c | 30 +++++++ lib_rend/lib_rend.c | 8 ++ 20 files changed, 238 insertions(+), 81 deletions(-) diff --git a/lib_com/hp50_fx.c b/lib_com/hp50_fx.c index f5e7105cf..f1864d7a7 100644 --- a/lib_com/hp50_fx.c +++ b/lib_com/hp50_fx.c @@ -458,14 +458,8 @@ void hp20_fx_32( { Word16 i; Word32 a1_fx, a2_fx, b1_fx, b2_fx; -#ifdef OPT_STEREO_32KBPS_V1 - Word16 Qy1, Qy2, Qmin; - Word64 y0_fx64, y1_fx64, y2_fx64; - Word32 x0, x1, x2; -#else /* OPT_STEREO_32KBPS_V1 */ Word16 Qx0, Qx1, Qx2, Qy1, Qprev_y1, Qy2, Qprev_y2, Qmin; Word64 x0_fx64, x1_fx64, x2_fx64, y0_fx64, y1_fx64, y2_fx64, R1, R2, R3, R4, R5; -#endif /* OPT_STEREO_32KBPS_V1 */ IF( EQ_32( Fs, 8000 ) ) { @@ -516,64 +510,15 @@ void hp20_fx_32( move32(); move32(); -#ifdef OPT_STEREO_32KBPS_V1 - y1_fx64 = W_add( W_deposit32_l( mem_fx[0] ), W_deposit32_h( mem_fx[1] ) ); - y2_fx64 = W_add( W_deposit32_l( mem_fx[2] ), W_deposit32_h( mem_fx[3] ) ); - - x0 = mem_fx[4]; - move32(); - x1 = mem_fx[5]; - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ Qprev_y1 = extract_l( mem_fx[4] ); Qprev_y2 = extract_l( mem_fx[5] ); y1_fx64 = W_deposit32_l( mem_fx[0] ); y2_fx64 = W_deposit32_l( mem_fx[1] ); x0_fx64 = W_deposit32_l( mem_fx[2] ); x1_fx64 = W_deposit32_l( mem_fx[3] ); -#endif /* OPT_STEREO_32KBPS_V1 */ FOR( i = 0; i < lg; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 - x2 = x1; - move32(); - x1 = x0; - move32(); - x0 = signal_fx[i]; - move32(); - - Qy1 = W_norm( y1_fx64 ); - if ( y1_fx64 == 0 ) - { - Qy1 = 62; - move16(); - } - - Qy2 = W_norm( y2_fx64 ); - if ( y2_fx64 == 0 ) - { - Qy2 = 62; - move16(); - } - - Qmin = s_min( Qy1, Qy2 ); - - Qmin = sub( Qmin, 34 ); - - y0_fx64 = W_mac_32_32( W_mult_32_32( W_shl_sat_l( y1_fx64, Qmin ), a1_fx ), W_shl_sat_l( y2_fx64, Qmin ), a2_fx ); // Qmin + Q29 + Q30 + 1 - - Word64 temp = W_mac_32_32( W_mac_32_32( W_mult_32_32( x2, b2_fx ), x1, b1_fx ), x0, b2_fx ); // Q30 - Word64 y0_fx = W_shr( y0_fx64, add( Qmin, Q30 ) ); // Q30 - y0_fx64 = W_add( temp, y0_fx ); // Q30 - signal_fx[i] = W_shl_sat_l( y0_fx64, -Q30 ); - move32(); - - y2_fx64 = y1_fx64; - move64(); - y1_fx64 = y0_fx64; - move64(); -#else /* OPT_STEREO_32KBPS_V1 */ x2_fx64 = x1_fx64; move64(); x1_fx64 = x0_fx64; @@ -587,7 +532,11 @@ void hp20_fx_32( move16(); } Qy1 = sub( Qy1, 34 ); +#ifdef OPT_STEREO_32KBPS_V1 + R1 = W_mult0_32_32( W_shl_sat_l( y1_fx64, Qy1 ), a1_fx ); +#else /* OPT_STEREO_32KBPS_V1 */ R1 = W_mult0_32_32( W_extract_l( W_shl( y1_fx64, Qy1 ) ), a1_fx ); +#endif /* OPT_STEREO_32KBPS_V1 */ Qy1 = add( Qy1, Qprev_y1 ); Qy2 = W_norm( y2_fx64 ); @@ -597,7 +546,11 @@ void hp20_fx_32( move16(); } Qy2 = sub( Qy2, 34 ); +#ifdef OPT_STEREO_32KBPS_V1 + R2 = W_mult0_32_32( W_shl_sat_l( y2_fx64, Qy2 ), a2_fx ); +#else /* OPT_STEREO_32KBPS_V1 */ R2 = W_mult0_32_32( W_extract_l( W_shl( y2_fx64, Qy2 ) ), a2_fx ); +#endif /* OPT_STEREO_32KBPS_V1 */ Qy2 = add( Qy2, Qprev_y2 ); Qx0 = W_norm( x0_fx64 ); @@ -607,7 +560,11 @@ void hp20_fx_32( move16(); } Qx0 = sub( Qx0, 34 ); +#ifdef OPT_STEREO_32KBPS_V1 + R3 = W_mult0_32_32( W_shl_sat_l( x0_fx64, Qx0 ), b2_fx ); +#else /* OPT_STEREO_32KBPS_V1 */ R3 = W_mult0_32_32( W_extract_l( W_shl( x0_fx64, Qx0 ) ), b2_fx ); +#endif /* OPT_STEREO_32KBPS_V1 */ Qx1 = W_norm( x1_fx64 ); if ( x1_fx64 == 0 ) @@ -616,7 +573,11 @@ void hp20_fx_32( move16(); } Qx1 = sub( Qx1, 34 ); +#ifdef OPT_STEREO_32KBPS_V1 + R4 = W_mult0_32_32( W_shl_sat_l( x1_fx64, Qx1 ), b1_fx ); +#else /* OPT_STEREO_32KBPS_V1 */ R4 = W_mult0_32_32( W_extract_l( W_shl( x1_fx64, Qx1 ) ), b1_fx ); +#endif /* OPT_STEREO_32KBPS_V1 */ Qx2 = W_norm( x2_fx64 ); if ( x2_fx64 == 0 ) @@ -625,7 +586,11 @@ void hp20_fx_32( move16(); } Qx2 = sub( Qx2, 34 ); +#ifdef OPT_STEREO_32KBPS_V1 + R5 = W_mult0_32_32( W_shl_sat_l( x2_fx64, Qx2 ), b2_fx ); +#else /* OPT_STEREO_32KBPS_V1 */ R5 = W_mult0_32_32( W_extract_l( W_shl( x2_fx64, Qx2 ) ), b2_fx ); +#endif /* OPT_STEREO_32KBPS_V1 */ Qmin = s_min( Qy1, Qy2 ); @@ -655,17 +620,8 @@ void hp20_fx_32( move64(); move16(); move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifdef OPT_STEREO_32KBPS_V1 - mem_fx[0] = W_extract_l( y1_fx64 ); - mem_fx[1] = W_extract_h( y1_fx64 ); - mem_fx[2] = W_extract_l( y2_fx64 ); - mem_fx[3] = W_extract_h( y2_fx64 ); - mem_fx[4] = x0; - mem_fx[5] = x1; -#else /* OPT_STEREO_32KBPS_V1 */ Qy1 = W_norm( y1_fx64 ); test(); IF( y1_fx64 != 0 && LT_16( Qy1, 32 ) ) @@ -688,7 +644,6 @@ void hp20_fx_32( mem_fx[3] = W_extract_l( x1_fx64 ); mem_fx[4] = Qprev_y1; mem_fx[5] = Qprev_y2; -#endif /* OPT_STEREO_32KBPS_V1 */ move32(); move32(); diff --git a/lib_com/mslvq_com_fx.c b/lib_com/mslvq_com_fx.c index cf2ad8a8a..7fcf36bfc 100644 --- a/lib_com/mslvq_com_fx.c +++ b/lib_com/mslvq_com_fx.c @@ -128,21 +128,31 @@ void init_lvq_fx( FOR( i = 0; i < MAX_NO_MODES; i++ ) { #ifdef OPT_STEREO_32KBPS_V1 - FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; ( j++, k++ ) ) + FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; j++ ) { - if ( ( no_lead_fx[i][j] <= 0 ) ) + if ( no_lead_fx[i][j] > 0 ) { - j = MAX_NO_SCALES; + k = add( k, 1 ); + } + if ( no_lead_fx[i][j] <= 0 ) + { + j = MAX_NO_SCALES - 1; + move16(); } } no_scales[i][0] = k; move16(); - FOR( k = 0; j < MAX_NO_SCALES << 1; ( j++, k++ ) ) + FOR( k = 0; j < MAX_NO_SCALES << 1; j++ ) { + if ( no_lead_fx[i][j] > 0 ) + { + k = add( k, 1 ); + } if ( no_lead_fx[i][j] <= 0 ) { j = MAX_NO_SCALES << 1; + move16(); } } no_scales[i][1] = k; @@ -172,23 +182,32 @@ void init_lvq_fx( FOR( i = 0; i < MAX_NO_MODES_p; i++ ) { #ifdef OPT_STEREO_32KBPS_V1 - FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; ( j++, k++ ) ) + FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; j++ ) { - + if ( no_lead_p_fx[i][j] > 0 ) + { + k = add( k, 1 ); + } if ( ( no_lead_p_fx[i][j] <= 0 ) ) { - j = MAX_NO_SCALES; + j = MAX_NO_SCALES - 1; + move16(); } } no_scales_p[i][0] = k; move16(); - FOR( k = 0; j < MAX_NO_SCALES << 1; ( j++, k++ ) ) + FOR( k = 0; j < MAX_NO_SCALES << 1; j++ ) { + if ( no_lead_p_fx[i][j] > 0 ) + { + k = add( k, 1 ); + } if ( ( no_lead_p_fx[i][j] <= 0 ) ) { j = MAX_NO_SCALES << 1; + move16(); } } diff --git a/lib_com/options.h b/lib_com/options.h index 2f1e82de8..cbc77b6e7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -74,7 +74,7 @@ #define FIX_1379_MASA_ANGLE_ROUND /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ -//#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ +#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ #define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ #define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ #define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ @@ -93,6 +93,7 @@ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ +#define VEC_ARITH_OPT_v1 #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ #define TEST_HR diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 41f68807e..86b5ec0b7 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -6184,6 +6184,15 @@ void v_add_fixed( const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ ); +#ifdef VEC_ARITH_OPT_v1 +void v_add_fixed_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N /* i : Vector length */ +); +#endif /* VEC_ARITH_OPT_v1 */ + void v_add_fixed_me( const Word32 x1[], /* i : Input vector 1 */ const Word16 x1_e, /* i : Exponent for input vector 1 */ @@ -6218,6 +6227,15 @@ void v_sub_fixed( const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ ); +#ifdef VEC_ARITH_OPT_v1 +void v_sub_fixed_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +); +#endif /* VEC_ARITH_OPT_v1 */ + /*! r: dot product of x[] and y[] */ Word32 dotp_fixed( const Word32 x[], /* i : vector x[] */ diff --git a/lib_com/tools.c b/lib_com/tools.c index b1a9f4d13..f7303c6f3 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -888,6 +888,26 @@ void v_sub_fixed( return; } +#ifdef VEC_ARITH_OPT_v1 +void v_sub_fixed_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = L_sub( x1[i], x2[i] ); + move32(); + } + + return; +} +#endif /* VEC_ARITH_OPT_v1 */ + /*-------------------------------------------------------------------* * v_multc_fixed() * diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 6dc1c45f2..44a86b0eb 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -4524,6 +4524,26 @@ void v_add_fixed( return; } +#ifdef VEC_ARITH_OPT_v1 +void v_add_fixed_no_hdrm( + const Word32 x1[], /* i : Input vector 1 */ + const Word32 x2[], /* i : Input vector 2 */ + Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ + const Word16 N /* i : Vector length */ +) +{ + Word16 i; + + FOR( i = 0; i < N; i++ ) + { + y[i] = L_add( x1[i], x2[i] ); + move32(); + } + + return; +} +#endif /* VEC_ARITH_OPT_v1 */ + void v_add_fixed_me( const Word32 x1[], /* i : Input vector 1 */ const Word16 x1_e, /* i : Exponent for input vector 1 */ diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index d0fd178f2..47a61a26e 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -5345,7 +5345,11 @@ void generate_masking_noise_ivas_fx( } ELSE { +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ) ); /*Q31 - *exp_out*/ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ), 0 ); /*Q31 - *exp_out*/ +#endif /* VEC_ARITH_OPT_v1 */ } return; diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 9c319489e..37b0bf1ba 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -3100,7 +3100,11 @@ void ivas_dirac_dec_render_sf_fx( v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands, 0 ); /* Q31 */ +#endif /* VEC_ARITH_OPT_v1 */ p_onset_filter_fx = onset_filter_subframe_fx; } ELSE diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 74af57bd5..3f67962dc 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2137,7 +2137,11 @@ ivas_error ivas_jbm_dec_render_fx( /* add already rendered SBA part */ FOR( n = 0; n < nchan_out; n++ ) { +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( p_output_fx[n], p_tc_fx[n + st_ivas->nchan_ism], p_output_fx[n], *nSamplesRendered ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( p_output_fx[n], p_tc_fx[n + st_ivas->nchan_ism], p_output_fx[n], *nSamplesRendered, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ } } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index 5f93c9676..e0671eea0 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -2084,8 +2084,13 @@ void ivas_param_mc_dec_render_fx( { IF( hLsSetup.index_lfe[idx_lfe] != ch ) { +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( Cldfb_RealBuffer_fx[ch][slot_idx], Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer_fx[ch][slot_idx], 1 ); + v_add_fixed_no_hdrm( Cldfb_ImagBuffer_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer_fx[ch][slot_idx], 1 ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( Cldfb_RealBuffer_fx[ch][slot_idx], Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer_fx[ch][slot_idx], 1, 0 ); v_add_fixed( Cldfb_ImagBuffer_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer_fx[ch][slot_idx], 1, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ } } } diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 79a4adee7..744d2c067 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -1069,8 +1069,12 @@ void ivas_qmetadata_enc_sid_encode_fx( { /*compute the average direction */ ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[b].azimuth_fx[m], q_direction->band_data[b].elevation_fx[m], direction_vector_fx ); - scale_sig32( direction_vector_fx, 3, Q22 - Q30 ); // Q30 -> Q22 + scale_sig32( direction_vector_fx, 3, Q22 - Q30 ); // Q30 -> Q22 +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( avg_direction_vector_fx, direction_vector_fx, avg_direction_vector_fx, 3 ); // Q22 +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( avg_direction_vector_fx, direction_vector_fx, avg_direction_vector_fx, 3, 0 ); // Q22 +#endif /* VEC_ARITH_OPT_v1 */ } ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( avg_direction_vector_fx, Q22, &avg_azimuth_fx[b], &avg_elevation_fx[b] ); @@ -2402,7 +2406,11 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( /*compute the average direction */ ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[i].azimuth_fx[j], q_direction->band_data[i].elevation_fx[j], direction_vector ); scale_sig32( direction_vector, 3, -8 ); // Q30 -> Q22 +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ } } } @@ -2665,7 +2673,11 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( IF( LT_16( idx, 4 ) ) { +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ } } /* project the quantized average azimuth angle to the same grid as the current sample */ @@ -2696,7 +2708,11 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[i].azimuth_fx[j], q_direction->band_data[i].elevation_fx[j], direction_vector ); scale_sig32( direction_vector, 3, -8 ); // Q30 -> Q22 +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( avg_direction_vector, Q22, &avg_azimuth, &avg_elevation ); avg_azimuth_index_upd = quantize_phi_enc_fx( L_add( avg_azimuth, 180 << Q22 ), 0, &avg_azimuth, avg_azimuth_alphabet ); diff --git a/lib_enc/ivas_sns_enc_fx.c b/lib_enc/ivas_sns_enc_fx.c index b7de878a1..2eaefb483 100644 --- a/lib_enc/ivas_sns_enc_fx.c +++ b/lib_enc/ivas_sns_enc_fx.c @@ -672,7 +672,11 @@ Word16 quantize_sns_fx( Word32 ener_side_fx; Word16 ener_side_q; +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( snsQ_out_fx[0][k], snsQ_out_fx[1][k], side_fx, M ); +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( snsQ_out_fx[0][k], snsQ_out_fx[1][k], side_fx, M, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ Word64 L64_sum; L64_sum = 1; diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index cbd8ea19f..cf6ba543b 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -2181,7 +2181,11 @@ Word16 ivas_smc_gmm_fx( } /* PCA */ +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( FV_fx, pca_mean_fx, FV_fx, N_SMC_FEATURES ); +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( FV_fx, pca_mean_fx, FV_fx, N_SMC_FEATURES, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ v_mult_mat_fixed( FV_fx, FV_fx, pca_components_fx, N_SMC_FEATURES, N_PCA_COEF, 0 ); /*------------------------------------------------------------------* * Calculation of posterior probability diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 8124c4967..c2430d008 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -578,7 +578,11 @@ static void ivas_dirac_dmx_fx( v_add_fx( data_in_fx[0], data_in_fx[1], data_out_fx[0], input_frame ); v_multc_fixed( data_out_fx[0], ONE_IN_Q30, data_out_fx[0], input_frame ); // ONE_IN_Q30 = 0.5* ONE_IN_Q31 +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( data_in_fx[0], data_in_fx[1], data_out_fx[1], input_frame ); +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( data_in_fx[0], data_in_fx[1], data_out_fx[1], input_frame, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ v_multc_fixed( data_out_fx[1], ONE_IN_Q30, data_out_fx[1], input_frame ); FOR( i = 0; i < nchan_transport; i++ ) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 0cdbe3a10..509eec6e2 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -1227,10 +1227,17 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { Scale_sig32( aux_buf, num_freq_bands, sub( h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, temp_q ) ); /*temp_q->(h_dirac_output_synthesis_state->q_cy_auto_diff_smooth)*/ } +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); /*h_dirac_output_synthesis_state->q_cy_auto_diff_smooth*/ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( aux_buf, &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], num_freq_bands_diff, 0 ); /*h_dirac_output_synthesis_state->q_cy_auto_diff_smooth*/ +#endif /* VEC_ARITH_OPT_v1 */ } return; diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 2f748289a..2540426cc 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4528,9 +4528,13 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_freq_domain_decorr_ap_params, hDirACRend->h_freq_domain_decorr_ap_state ); - v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ + v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands, 0 ); /* Q31 */ - p_onset_filter_fx = onset_filter_subframe_fx; /*q31*/ +#endif /* VEC_ARITH_OPT_v1 */ + p_onset_filter_fx = onset_filter_subframe_fx; /*q31*/ } ELSE { @@ -4627,7 +4631,11 @@ static void ivas_masa_ext_dirac_render_sf_fx( DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; move16(); #endif +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( reference_power_fix, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands ); // DirAC_mem.reference_power_smooth_q +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( reference_power_fix, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands, 0 ); // DirAC_mem.reference_power_smooth_q +#endif /* VEC_ARITH_OPT_v1 */ } } /*Rescaling proto_direct_buffer_f*/ diff --git a/lib_rend/ivas_efap_fx.c b/lib_rend/ivas_efap_fx.c index 543decbdd..4fb88643b 100644 --- a/lib_rend/ivas_efap_fx.c +++ b/lib_rend/ivas_efap_fx.c @@ -1525,7 +1525,11 @@ static void get_poly_gains_fx( A[1] = elePoly[i - 1]; // q22 move32(); +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ +#endif /* VEC_ARITH_OPT_v1 */ FOR( j = i; j < numChan - 2 + i; ++j ) { @@ -1578,7 +1582,11 @@ static Word32 get_tri_gain_fx( tmpN[1] = L_sub( C[0], B[0] ); // q22 move32(); - v_sub_fixed( B, A, tmpSub1, 2, 0 ); // tmpSub1 q22 +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( B, A, tmpSub1, 2 ); // tmpSub1 q22 +#else /* VEC_ARITH_OPT_v1 */ + v_sub_fixed( B, A, tmpSub1, 2, 0 ); // tmpSub1 q22 +#endif /* VEC_ARITH_OPT_v1 */ tmpDot1 = dotp_fixed( tmpN, tmpSub1, 2 ); // Q13 @@ -2237,7 +2245,11 @@ static void sort_channels_vertex_fx( move32(); } +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( tmpV1, tmpV2, tmpV3, 3 ); // tmpV3 Q30 +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( tmpV1, tmpV2, tmpV3, 3, 0 ); // tmpV3 Q30 +#endif /* VEC_ARITH_OPT_v1 */ Word16 exp2 = 2; move16(); normV = ISqrt32( dotp_fixed( tmpV3, tmpV3, 3 ) /*q29*/, &exp2 ); // q=31-exp2 @@ -2419,7 +2431,11 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ A[1] = poly.polyEle[0]; // q22 move32(); - v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ +#else /* VEC_ARITH_OPT_v1 */ + v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ +#endif /* VEC_ARITH_OPT_v1 */ FOR( n = 1; n < sub( numVertices, 1 ); ++n ) { @@ -2487,8 +2503,13 @@ static Word16 in_tri_fx( I'll just compute the determinant and if it's equal to 0, that means the two vectors are colinear */ - v_sub_fixed( B, A, tmpDot1, 2, 0 ); // tmpDot1 q22 - v_sub_fixed( C, A, tmpDot2, 2, 0 ); // tmpDot2 q22 +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( B, A, tmpDot1, 2 ); // tmpDot1 q22 + v_sub_fixed_no_hdrm( C, A, tmpDot2, 2 ); // tmpDot2 q22 +#else /* VEC_ARITH_OPT_v1 */ + v_sub_fixed( B, A, tmpDot1, 2, 0 ); // tmpDot1 q22 + v_sub_fixed( C, A, tmpDot2, 2, 0 ); // tmpDot2 q22 +#endif /* VEC_ARITH_OPT_v1 */ /* Verification of the non-colinearity : Q22 * Q22 = Q13 */ invFactor = L_sub( Mpy_32_32( tmpDot1[0], tmpDot2[1] ), Mpy_32_32( tmpDot1[1], tmpDot2[0] ) ); /*q22+q22-q31->q13*/ diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index ba632c6ba..7b7f64c84 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -538,8 +538,13 @@ static void ivas_omasa_param_est_ana_fx( FOR( i = 1; i < nchan_ism; i++ ) { +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( Chnl_RealBuffer_fx[i], Foa_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_add_fixed_no_hdrm( Chnl_ImagBuffer_fx[i], Foa_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins ); // Q: Chnl_ImagBuffer_q +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( Chnl_RealBuffer_fx[i], Foa_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins, 0 ); // Q: Chnl_RealBuffer_q v_add_fixed( Chnl_ImagBuffer_fx[i], Foa_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins, 0 ); // Q: Chnl_ImagBuffer_q +#endif /* VEC_ARITH_OPT_v1 */ } /* Y */ diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 9b149940c..12b94b1a2 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2177,13 +2177,23 @@ void ivas_binaural_reverb_processSubframe_fx( { IF( s_and( ch, 1 ) ) { +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins ); + v_add_fixed_no_hdrm( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ } ELSE { +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( hReverb->preDelayBufferReal_fx[idx], inImag[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins ); + v_add_fixed_no_hdrm( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins ); +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( hReverb->preDelayBufferReal_fx[idx], inImag[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ } } idx = add( idx, 1 ) % hReverb->preDelayBufferLength; @@ -2213,20 +2223,40 @@ void ivas_binaural_reverb_processSubframe_fx( SWITCH( phaseShiftTypePr[tapIdx] ) { case 0: /* 0 degrees phase */ +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_add_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); v_add_fixed( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ BREAK; case 1: /* 90 degrees phase */ +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_add_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); v_add_fixed( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ BREAK; case 2: /* 180 degrees phase */ +#ifdef VEC_ARITH_OPT_v1 + v_sub_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_sub_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); +#else /* VEC_ARITH_OPT_v1 */ v_sub_fixed( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); v_sub_fixed( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ BREAK; default: /* 270 degrees phase */ +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); + v_sub_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); v_sub_fixed( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ BREAK; } } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 859768784..ad84c92e9 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5772,7 +5772,11 @@ static ivas_error renderLfeToBinaural_fx( { writePtr = getSmplPtr_fx( outAudio, ear_idx, 0 ); move32(); +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( writePtr, tmpLfeBuffer, writePtr, frame_size ); /* Q(out_q) */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( writePtr, tmpLfeBuffer, writePtr, frame_size, 0 ); /* Q(out_q) */ +#endif /* VEC_ARITH_OPT_v1 */ } pop_wmops(); @@ -6793,7 +6797,11 @@ static void renderMasaToMasa( ELSE IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 2 ) && EQ_16( outAudio.config.numChannels, 1 ) ) { // v_add( tmpBuffer[0], tmpBuffer[1], tmpBuffer[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); +#ifdef VEC_ARITH_OPT_v1 + v_add_fixed_no_hdrm( tmpBuffer_fx[0], tmpBuffer_fx[1], tmpBuffer_fx[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( tmpBuffer_fx[0], tmpBuffer_fx[1], tmpBuffer_fx[0], masaInput->base.inputBuffer.config.numSamplesPerChannel, 0 ); +#endif /* VEC_ARITH_OPT_v1 */ } /* Copy metadata */ -- GitLab From b4c064df41e2010a1a5b69fe30a64828cfdf3bfd Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 24 Apr 2025 13:08:39 +0200 Subject: [PATCH 0424/1310] bug fix test on goinf --- apps/renderer.c | 7 ++++--- lib_com/options.h | 2 +- lib_rend/lib_rend.c | 6 +++--- lib_util/hrtf_file_reader.c | 36 +++++++++++++++++++++++++++++++----- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index b12aa43a5..355c04798 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1009,11 +1009,12 @@ int main( } const int16_t frameSize_smpls = (int16_t) ( ( args.render_framesize ) * args.sampleRate * 5 / ( 1000 ) ); - + Word32 nonDiegeticPanGain_fx = ( args.nonDiegeticPanGain == 1.0f ) ? ONE_IN_Q31 : ( args.nonDiegeticPanGain == -1.0f ) ? L_negate( ONE_IN_Q31 ) + : (Word32) ( args.nonDiegeticPanGain * ( 1LL << Q31 ) ); #ifdef NONBE_FIX_BINARY_BINAURAL_READING - if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, !isEmptyString( args.customHrtfFilePath ), args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) + IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, !isEmptyString( args.customHrtfFilePath ), args.nonDiegeticPan, nonDiegeticPanGain_fx, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) #else - if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) + IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, nonDiegeticPanGain_fx, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) #endif { fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); diff --git a/lib_com/options.h b/lib_com/options.h index 9eedf04d7..bf4c38f21 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -98,7 +98,7 @@ #define NONBE_FIX_949_MC_5MS_FRAMING /*Dlb: Issue 949: fix for 5ms framing/rendering in MC mode */ //#define SPLIT_REND_WITH_HEAD_ROT_NEW /* Orange: split rendering code differ between branchs main-pc and float-pc, do not know what to do/ -#define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ +//#define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index ab9c806f6..e96257115 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1540,7 +1540,7 @@ static ivas_error setRendInputActiveIsm( #ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #endif #else #ifdef NONBE_FIX_BINARY_BINAURAL_READING @@ -2914,7 +2914,7 @@ static ivas_error setRendInputActiveMc( #ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( hrtfs->hHrtfTD ) { - inputMc->tdRendWrapper.binaural_latency_ns = (int32_t) ( hrtfs->hHrtfTD->latency_s_fx * 1000000000.f ); + inputMc->tdRendWrapper.binaural_latency_ns = Mult_32_32( hrtfs->hHrtfTD->latency_s_fx, 1000000000 ); } inputMc->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; #else @@ -2945,7 +2945,7 @@ static ivas_error setRendInputActiveMc( #ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( hrtfs->hHrtfTD ) { - inputMc->splitTdRendWrappers[i].binaural_latency_ns = (int32_t) ( hrtfs->hHrtfTD->latency_s_fx * 1000000000.f ); + inputMc->splitTdRendWrappers[i].binaural_latency_ns = Mult_32_32( hrtfs->hHrtfTD->latency_s_fx, 1000000000 ); } inputMc->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; #else diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 7626b19e9..40fc592fb 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1144,6 +1144,18 @@ void destroy_td_hrtf( free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); } } +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + else + { + for ( i = 0; i < 3; i++ ) + { + if ( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ) + { + free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); + } + } + } +#endif ivas_HRTF_binary_close_fx( hHrtf ); @@ -1214,6 +1226,18 @@ ivas_error dealloc_HRTF_binary( free( hHrtf->lr_energy_and_iac_dyn_fx[i] ); } } +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + else + { + for ( i = 0; i < 3; i++ ) + { + if ( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ) + { + free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); + } + } + } +#endif return error; } @@ -1690,11 +1714,6 @@ static ivas_error create_fastconv_HRTF_from_rawdata( f_tmp = *( (float *) ( hrtf_data_rptr ) ); ( *hHRTF )->FASTCONV_HOA2_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); - if ( HOA2_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HOA2_CHANNELS)" ); - } - hrtf_data_rptr += sizeof( uint16_t ); #if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) @@ -1703,6 +1722,13 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } hrtf_data_rptr += sizeof( uint16_t ); #endif + + if ( HOA2_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HOA2_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + if ( BINAURAL_NTAPS_SBA != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS_SBA)" ); -- GitLab From b48f3307e3e29e0efc26ea8e07b5980ec77d5f54 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 24 Apr 2025 13:30:38 +0200 Subject: [PATCH 0425/1310] update option --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index fca41b23b..037b7b2dd 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -99,7 +99,7 @@ #define NONBE_FIX_952_MC_PARAMUPMIX_5MS /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/ //#define SPLIT_REND_WITH_HEAD_ROT_NEW /* Orange: split rendering code differ between branchs main-pc and float-pc, do not know what to do/ -//#define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ +#define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ -- GitLab From 098a015dfa4609f6cf1ff76c1aef0586facacf0a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 24 Apr 2025 17:12:50 +0530 Subject: [PATCH 0426/1310] Fix for MSAN ASAN error in decoder, renderer crash fix and macro code cleanup --- lib_dec/ivas_core_dec_fx.c | 11 +---------- lib_dec/ivas_dirac_dec_fx.c | 21 +++++++++++++++++++-- lib_rend/lib_rend.c | 13 ++++++++----- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 03f0e4b40..320d9d4bc 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -266,11 +266,7 @@ ivas_error ivas_core_dec_fx( test(); test(); test(); -#ifdef NONBE_MDCT_ST_PLC_DO_NOT_SCALE_OLD_OUT_IF_FIRST_GOOD_IS_SID IF( !st->bfi && st->prev_bfi && GT_32( st->total_brate, SID_2k40 ) && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && st->hTcxDec != NULL ) -#else - IF( !st->bfi && st->prev_bfi && ( EQ_16( st->last_core_bfi, TCX_20_CORE ) || EQ_16( st->last_core_bfi, TCX_10_CORE ) ) && st->hTcxDec != NULL ) -#endif { conceal_eof_gain32 = L_shr_sat( st->hTcxDec->conceal_eof_gain32, sub( 16, st->hTcxDec->conceal_eof_gain_e ) ); // e = 31 - Q , 16 - e => 16 - (31 - Q) => Q - 15, // shr(16 -e ) = shr(Q -15) => 15 - Q ==> Q15 @@ -604,7 +600,7 @@ ivas_error ivas_core_dec_fx( st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->Q_old_wtda; move16(); - Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], L_FRAME48k, Q11 ); // Q11 + Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], output_frame, Q11 ); // Q11 IF( st->hTcxDec ) { @@ -771,13 +767,8 @@ ivas_error ivas_core_dec_fx( test(); test(); -#ifdef NONBE_MDCT_ST_DTX_SKIP_DEWHITENING_OF_NOISE_SHAPES_ON_SID_FRAMES /* On first good active frame after frameloss undo the whitening of the bg noise shape */ IF( GT_32( sts[0]->core_brate, SID_2k40 ) && sts[0]->bfi == 0 && EQ_16( sts[0]->prev_bfi, 1 ) ) -#else - IF( sts[0]->bfi == 0 && EQ_16( sts[0]->prev_bfi, 1 ) ) - /* On first good frame after frameloss undo the whitening of the bg noise shape */ -#endif { FOR( n = 0; n < n_channels; ++n ) { diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 37b0bf1ba..403e11f00 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1446,10 +1446,27 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { - hSpatParamRendCom->azimuth[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); + /* Right shifting -1 -> -1, Hence this change is done */ + Word32 L_tmp = L_abs( q_direction->band_data[band].azimuth_fx[block] ); + hSpatParamRendCom->azimuth[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); - hSpatParamRendCom->elevation[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); + + IF( q_direction->band_data[band].azimuth_fx[block] < 0 ) + { + hSpatParamRendCom->azimuth[meta_write_index][b] = negate( hSpatParamRendCom->azimuth[meta_write_index][b] ); + move16(); + } + + L_tmp = L_abs( q_direction->band_data[band].elevation_fx[block] ); + hSpatParamRendCom->elevation[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); + + IF( q_direction->band_data[band].elevation_fx[block] < 0 ) + { + hSpatParamRendCom->elevation[meta_write_index][b] = negate( hSpatParamRendCom->elevation[meta_write_index][b] ); + move16(); + } + hSpatParamRendCom->energy_ratio1_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( ONE_IN_Q30, q_direction->band_data[band].energy_ratio_fx[block] ); diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index ad84c92e9..e39b9a61e 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -8511,13 +8511,16 @@ static void intermidiate_ext_dirac_render( move16(); #endif } + IF( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx != NULL ) + { - tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len ); - scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q + tmp) */ - hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q, tmp ); - move16(); + tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len ); + scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q + tmp) */ + hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q = add( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_q, tmp ); + move16(); + } - IF( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx != 0 ) + IF( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx != NULL ) { tmp = L_norm_arr( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len ); scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_fx, hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_len, tmp ); /* Q(hDirACRend->h_output_synthesis_psd_state.proto_power_diff_smooth_prev_q + tmp) */ -- GitLab From b755243c371c14f14304d427c4805c88c543be15 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 15:53:29 +0200 Subject: [PATCH 0427/1310] only pass --split-csv-file if SPLIT_COMPARISON is given --- .gitlab-ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 780a51995..894265e41 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -423,7 +423,11 @@ stages: - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true ### create histograms - - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME --split-csv-file $CSV_ARTIFACT_SPLIT + - if [ "$SPLIT_COMPARISON" = "true" ]; then + - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME --split-csv-file $CSV_ARTIFACT_SPLIT + - else + - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME + - fi # first for "whole" files comparison - python3 scripts/create_histograms.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms -- GitLab From 3eae44e31f3f549c179cfa4611e57e51507a38f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Mon, 10 Mar 2025 17:12:35 +0100 Subject: [PATCH 0428/1310] Use default variables from ivas-codec-ci Also extracts the project's own (override) variables into a separate file. --- .gitlab-ci.yml | 80 ++++------------------------------------ .gitlab-ci/variables.yml | 65 ++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 72 deletions(-) create mode 100644 .gitlab-ci/variables.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 894265e41..7c29145b0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,76 +1,12 @@ variables: - TESTV_DIR: "/usr/local/testv" - LTV_DIR: "/usr/local/ltv" - EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" - FLOAT_REF_BRANCH: "ivas-float-update" - BUILD_OUTPUT: "build_output.txt" - SCRIPTS_DIR: "/usr/local/scripts" - EXIT_CODE_NON_BE: 123 - EXIT_CODE_FAIL: 1 - LONG_TEST_SUITE: "tests/codec_be_on_mr_nonselection tests/renderer --param_file scripts/config/self_test_ltv.prm --use_ltv" - LONG_TEST_SUITE_NO_RENDERER: "tests/codec_be_on_mr_nonselection --param_file scripts/config/self_test_ltv.prm --use_ltv" - SHORT_TEST_SUITE: "tests/codec_be_on_mr_nonselection" - SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" - LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" - TEST_SUITE: "" - # These path variables are used by the pytest calls. - # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain - DUT_ENCODER_PATH: "./IVAS_cod" - DUT_DECODER_PATH: "./IVAS_dec" - REF_ENCODER_PATH: "./IVAS_cod_ref" - REF_DECODER_PATH: "./IVAS_dec_ref" - MERGE_TARGET_ENCODER_PATH: "./IVAS_cod_merge_target" - MERGE_TARGET_DECODER_PATH: "./IVAS_dec_merge_target" - # These path variables are used for building the binaries - # They should never be overwritten! - REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" - REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" - MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_merge_target" - MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" - LEVEL_SCALING: "1.0" - IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" - PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" - TESTCASE_TIMEOUT_STV: 900 - TESTCASE_TIMEOUT_LTV: 2400 - TESTCASE_TIMEOUT_LTV_SANITIZERS: 10800 - CI_REGRESSION_THRESH_MLD: "0.1" - CI_REGRESSION_THRESH_MAX_ABS_DIFF: "50" - CI_REGRESSION_THRESH_SSNR: "-1" - CI_REGRESSION_THRESH_ODG: "-0.05" - GIT_CLEAN_FLAGS: -ffdxq - INSTR_DIR: "scripts/c-code_instrument" - BUILD_WITH_DEBUG_MODE_INFO: "" - ENCODER_TEST: "" - DELTA_ODG: "" - COMPARE_DMX: "" - SPLIT_COMPARISON: "" - SKIP_REGRESSION_CHECK: "" - FAILED_TESTCASES_LIST: "failed-testcases.txt" - ERRORS_TESTCASES_LIST: "errors-testcases.txt" - PYTEST_CACHE_ARTIFACT: "pytest_cache.zip" - MEASURES_FOR_REPORT: "MLD MAX_ABS_DIFF MIN_SSNR MIN_ODG" - FLOAT_REF_COMMIT_FILE: "float-ref-git-sha.txt" - CUT_COMMIT_FILE: "CuT-git-sha.txt" - MERGE_TARGET_COMMIT_FILE: "merge-target-git-sha.txt" - MANUAL_PIPELINE_TYPE: - description: "Type for the manual pipeline run. Use 'pytest-compare' to run comparison test against reference float codec." - value: 'default' - options: - - 'default' - - 'pytest-compare' - - 'pytest-compare-enc-dmx' - - 'pytest-compare-long' - - 'pytest-compare-to-input' - - 'pytest-saturation-smoke-test' - - 'evs-26444' - - 'sanitizer' - - 'pytest-renderer' - - 'complexity' - - 'coverage' - - 'voip-be-test' - - 'peaq-enc-passthrough' - + # note: GitLab cannot reference the variable in the include ref:, we need to use a YAML anchor for this + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF mullerfa/ci-refactor + +include: + - local: .gitlab-ci/variables.yml + - project: ivas-codec-pc/ivas-codec-ci + ref: *IVAS_CODEC_CI_REF + file: main.yml default: interruptible: true # Make all jobs by default interruptible diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml new file mode 100644 index 000000000..94bb71fb3 --- /dev/null +++ b/.gitlab-ci/variables.yml @@ -0,0 +1,65 @@ +variables: + EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" + FLOAT_REF_BRANCH: "ivas-float-update" + SCRIPTS_DIR: "/usr/local/scripts" + LONG_TEST_SUITE: "tests/codec_be_on_mr_nonselection tests/renderer --param_file scripts/config/self_test_ltv.prm --use_ltv" + LONG_TEST_SUITE_NO_RENDERER: "tests/codec_be_on_mr_nonselection --param_file scripts/config/self_test_ltv.prm --use_ltv" + SHORT_TEST_SUITE: "tests/codec_be_on_mr_nonselection" + SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" + LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" + TEST_SUITE: "" + # These path variables are used by the pytest calls. + # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain + DUT_ENCODER_PATH: "./IVAS_cod" + DUT_DECODER_PATH: "./IVAS_dec" + REF_ENCODER_PATH: "./IVAS_cod_ref" + REF_DECODER_PATH: "./IVAS_dec_ref" + MERGE_TARGET_ENCODER_PATH: "./IVAS_cod_merge_target" + MERGE_TARGET_DECODER_PATH: "./IVAS_dec_merge_target" + # These path variables are used for building the binaries + # They should never be overwritten! + REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" + REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" + MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_merge_target" + MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" + LEVEL_SCALING: "1.0" + BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" + PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" + TESTCASE_TIMEOUT_STV: 900 + TESTCASE_TIMEOUT_LTV: 2400 + TESTCASE_TIMEOUT_LTV_SANITIZERS: 10800 + CI_REGRESSION_THRESH_MLD: "0.1" + CI_REGRESSION_THRESH_MAX_ABS_DIFF: "50" + CI_REGRESSION_THRESH_SSNR: "-1" + CI_REGRESSION_THRESH_ODG: "-0.05" + INSTR_DIR: "scripts/c-code_instrument" + BUILD_WITH_DEBUG_MODE_INFO: "" + ENCODER_TEST: "" + DELTA_ODG: "" + COMPARE_DMX: "" + SPLIT_COMPARISON: "" + SKIP_REGRESSION_CHECK: "" + FAILED_TESTCASES_LIST: "failed-testcases.txt" + ERRORS_TESTCASES_LIST: "errors-testcases.txt" + PYTEST_CACHE_ARTIFACT: "pytest_cache.zip" + MEASURES_FOR_REPORT: "MLD MAX_ABS_DIFF MIN_SSNR MIN_ODG" + FLOAT_REF_COMMIT_FILE: "float-ref-git-sha.txt" + CUT_COMMIT_FILE: "CuT-git-sha.txt" + MERGE_TARGET_COMMIT_FILE: "merge-target-git-sha.txt" + MANUAL_PIPELINE_TYPE: + description: "Type for the manual pipeline run. Use 'pytest-compare' to run comparison test against reference float codec." + value: 'default' + options: + - 'default' + - 'pytest-compare' + - 'pytest-compare-enc-dmx' + - 'pytest-compare-long' + - 'pytest-compare-to-input' + - 'pytest-saturation-smoke-test' + - 'evs-26444' + - 'sanitizer' + - 'pytest-renderer' + - 'complexity' + - 'coverage' + - 'voip-be-test' + - 'peaq-enc-passthrough' -- GitLab From f202e60605b0d31b123439a4b9ead9c21ae0261a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Wed, 26 Mar 2025 20:00:10 +0100 Subject: [PATCH 0429/1310] Use stages from ivas-codec-ci --- .gitlab-ci.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c29145b0..c4162e0f7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -64,16 +64,6 @@ workflow: variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - -stages: - - .pre - - prevalidate - - build - - check-be - - test - - postvalidate - - deploy - # --------------------------------------------------------------- # Generic script anchors # --------------------------------------------------------------- -- GitLab From f4344fb875f6e4a732396a228f3bd3bd48250f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Wed, 26 Mar 2025 20:32:18 +0100 Subject: [PATCH 0430/1310] Use snippets from ivas-codec-ci --- .gitlab-ci.yml | 257 ++++++++++++++++--------------------------------- 1 file changed, 81 insertions(+), 176 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c4162e0f7..2f3176df7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -71,13 +71,6 @@ workflow: # These can be used later on to do common tasks # Prints useful information for every job and should be used at the beginning of each job -.print-common-info: &print-common-info - - | - echo "Printing common information for build job." - echo "Current job is run on commit $CI_COMMIT_SHA" - echo "Commit time was $CI_COMMIT_TIMESTAMP" - date | xargs echo "System time is" - .print-common-info-windows: &print-common-info-windows - | echo "Printing common information for build job." @@ -85,107 +78,6 @@ workflow: echo "Commit time was $CI_COMMIT_TIMESTAMP" ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression -.activate-debug-mode-info-if-set: &activate-debug-mode-info-if-set - - if [ "$BUILD_WITH_DEBUG_MODE_INFO" = "true" ]; then - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUGGING\ *\)\*\//\1/g" lib_com/options.h - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUG_MODE_INFO\ *\)\*\//\1/g" lib_com/options.h - - fi - -.build-float-ref-binaries: &build-float-ref-binaries - - git rev-parse HEAD > $CUT_COMMIT_FILE - - current_commit_sha=$(git rev-parse HEAD) - ### build reference binaries - - git checkout $FLOAT_REF_BRANCH - - git pull origin $FLOAT_REF_BRANCH - - *activate-debug-mode-info-if-set - - make clean - - make -j >> /dev/null - - mv ./IVAS_cod ./$REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_dec ./$REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./IVAS_rend_ref - ### Return to current branch - - git restore . - - git rev-parse HEAD > $FLOAT_REF_COMMIT_FILE - - git checkout $current_commit_sha - -.build-merge-target-binaries: &build-merge-target-binaries - - current_commit_sha=$(git rev-parse HEAD) - ### build merge target binaries - - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - *activate-debug-mode-info-if-set - - make clean - - make -j >> /dev/null - - mv ./IVAS_cod ./$MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_dec ./$MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./IVAS_rend_merge_target - ### Return to current branch - - git restore . - - git rev-parse HEAD > $MERGE_TARGET_COMMIT_FILE - - git checkout $current_commit_sha - -.build-float-ref-and-dut-binaries: &build-float-ref-and-dut-binaries -### build reference binaries - - *build-float-ref-binaries -### build dut binaries - - *activate-debug-mode-info-if-set - - make clean - - make -j >> /dev/null - -.build-and-create-float-ref-outputs: &build-and-create-float-ref-outputs - - *build-float-ref-and-dut-binaries - - ### prepare pytest - # create short test vectors - - python3 tests/create_short_testvectors.py - # create references - - exit_code=0 - - - enc_stats_arg="" - - if [ "$ENCODER_TEST" = "true" ]; then - - enc_stats_arg="--enc_stats" - - fi - - - enc_dmx_arg="" - - if [ "$COMPARE_DMX" = "true" ]; then - - enc_dmx_arg="--compare_enc_dmx" - - fi - - - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - -.update-scripts-repo: &update-scripts-repo - - cd $SCRIPTS_DIR - - sed -i '/fetch/d' .git/config # Remove all fetch lines to clean out dead links - - git remote set-branches --add origin $BASOP_CI_BRANCH_PC_REPO # Add currently used branch - - git fetch - - git restore . # Just as a precaution - - git checkout $BASOP_CI_BRANCH_PC_REPO - - git pull origin $BASOP_CI_BRANCH_PC_REPO - - cd - - - cp -r $SCRIPTS_DIR/ci . - - cp -r $SCRIPTS_DIR/scripts . - - cp -r $SCRIPTS_DIR/tests . - - cp $SCRIPTS_DIR/pytest.ini . - -.apply-testv-scaling: &apply-testv-scaling - - echo "Applying level scaling in scripts/testv using scale=$LEVEL_SCALING" - - tests/scale_pcm.py ./scripts/testv/ $LEVEL_SCALING - -.update-ltv-repo: &update-ltv-repo - - cd $LTV_DIR - - git pull - - cd - - -.get-commits-behind-count: &get-commits-behind-count - - echo $CI_COMMIT_SHA - - echo $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - commits_behind_count=$(git rev-list --count $CI_COMMIT_SHA..origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) - -.copy-ltv-files-to-testv-dir: ©-ltv-files-to-testv-dir - - cp "$LTV_DIR"/*.wav scripts/testv/ - - cp "$LTV_DIR"/*.met scripts/testv/ - - cp "$LTV_DIR"/*.csv scripts/testv/ - .activate-Werror-linux: &activate-Werror-linux - sed -i.bak "s/^# \(CFLAGS += -Werror\)/\1/" Makefile @@ -261,22 +153,18 @@ workflow: # Job templates # --------------------------------------------------------------- -# templates to define stages and platforms -.test-job-linux: - tags: - - ivas-basop-linux - -.build-job-linux: - stage: build - timeout: "2 minutes" +# override for centrally defined job to make use of the basop runners +.job-linux: tags: - ivas-basop-linux -.build-job-windows: - stage: build - timeout: "4 minutes" - tags: - - ivas-windows +# custom variant of this template, we need to update the scripts repo before every build +.test-job-linux: + extends: + - .job-linux + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - !reference [.job-linux, before_script] .print-results-banner: &print-results-banner - set +x @@ -307,11 +195,11 @@ workflow: IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" script: - set -euxo pipefail - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV @@ -319,12 +207,13 @@ workflow: - python3 ci/remove_unsupported_testcases.py $PRM_FILES - if [ $LEVEL_SCALING != "1.0" ]; then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - if [ "$COMPARE_DMX" = "true" ] || [ "$ENCODER_TEST" = "true" ]; then - BUILD_WITH_DEBUG_MODE_INFO="true" - fi + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" @@ -417,8 +306,8 @@ workflow: - report-junit.xml .check-up-to-date-in-comparison-jobs: &check-up-to-date-in-comparison-jobs - - *get-commits-behind-count - | + commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" if [ $commits_behind_count -ne 0 ]; then set +x echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run. Checking bitexactness or testing for regressions now can result in meaningless results. Run\n\t git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." @@ -426,6 +315,8 @@ workflow: fi .check-be-to-target-anchor: &check-be-to-target-anchor + extends: + - .job-linux stage: check-be needs: ["build-codec-linux-make"] timeout: "300 minutes" @@ -434,16 +325,16 @@ workflow: HTML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" PYTEST_LOG_TARGET_BRANCH: "pytest-log-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME.txt" script: - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - set -euxo pipefail - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - python3 tests/create_short_testvectors.py - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV @@ -453,11 +344,11 @@ workflow: - python3 scripts/prepare_combined_format_inputs.py - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - - *build-float-ref-binaries - - *build-merge-target-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target - make clean - make -j >> /dev/null - *check-up-to-date-in-comparison-jobs @@ -537,6 +428,8 @@ workflow: - fi .check-regressions-pytest-anchor: &check-regressions-pytest-anchor + extends: + - .job-linux stage: test timeout: "300 minutes" variables: @@ -549,7 +442,9 @@ workflow: IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" script: - - *print-common-info + - !reference [ .job-linux, before_script ] + + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh # create empty files for all artifacts to suppress warnings in case of no regressions found or all is BE - touch $XML_REPORT_BRANCH $XML_REPORT_MAIN $HTML_REPORT_BRANCH $HTML_REPORT_MAIN $CSV_BRANCH $CSV_MAIN $SUMMARY_HTML_ARTIFACT_NAME $FLOAT_REF_COMMIT_FILE $CUT_COMMIT_FILE $MERGE_TARGET_COMMIT_FILE regressions_crashes.csv regressions_MLD.csv regressions_MAX_ABS_DIFF.csv regressions_MIN_SSNR.csv regressions_MIN_ODG.csv improvements_crashes.csv improvements_MLD.csv improvements_MAX_ABS_DIFF.csv improvements_MIN_SSNR.csv improvements_MIN_ODG.csv @@ -570,8 +465,8 @@ workflow: - *update-scripts-repo - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV @@ -579,7 +474,7 @@ workflow: - python3 ci/remove_unsupported_testcases.py $PRM_FILES - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi # check MR title for flag that allows regressions to be mergable @@ -591,7 +486,7 @@ workflow: ### run branch first # this per default builds the branch and the reference and creates the reference outputs - - *build-and-create-float-ref-outputs + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh - *check-up-to-date-in-comparison-jobs # need to restore cache again - *overwrite-pytest-cache-with-artifact @@ -684,6 +579,8 @@ workflow: .ivas-pytest-sanitizers-anchor: &ivas-pytest-sanitizers-anchor + extends: + - .job-linux stage: test needs: ["build-codec-linux-make"] timeout: "600 minutes" @@ -695,12 +592,14 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'schedule' && $IVAS_PYTEST_MSAN - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "sanitizer" script: - - *print-common-info - - *update-scripts-repo - - *copy-ltv-files-to-testv-dir + - !reference [ .job-linux, before_script ] + + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - python3 ci/remove_unsupported_testcases.py $PRM_FILES - - *build-float-ref-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - set -euxo pipefail - make_args="CLANG=$CLANG_NUM" - if [[ $CLANG_NUM == 3 ]]; then @@ -728,6 +627,8 @@ workflow: - report-junit.xml .ivas-pytest-compare-to-input-anchor: &ivas-pytest-compare-to-input-anchor + extends: + - .job-linux stage: test needs: ["build-codec-linux-make"] timeout: "360 minutes" @@ -735,11 +636,13 @@ workflow: SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" script: - - *print-common-info - - *update-scripts-repo + - !reference [ .job-linux, before_script ] + + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV @@ -747,9 +650,9 @@ workflow: - python3 ci/remove_unsupported_testcases.py $PRM_FILES - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - - *build-float-ref-and-dut-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" @@ -822,14 +725,15 @@ uninterruptible: branch-is-up-to-date-with-target-pre: extends: + - .job-linux - .rules-merge-request stage: prevalidate needs: [] tags: - ivas-basop-linux script: - - *get-commits-behind-count - | + commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" if [ $commits_behind_count -ne 0 ]; then echo -e "Your branch is $commits_behind_count commits behind the target branch, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 1 @@ -837,13 +741,14 @@ branch-is-up-to-date-with-target-pre: branch-is-up-to-date-with-target-post: extends: + - .job-linux - .rules-merge-request stage: postvalidate tags: - ivas-basop-linux script: - - *get-commits-behind-count - | + commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" if [ $commits_behind_count -ne 0 ]; then echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 1 @@ -864,7 +769,7 @@ clang-format-check: needs: [] timeout: "5 minutes" script: - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh # Set up variables. This can't be done in the "variables" section because variables are not expanded properly there - PATCH_FILE_NAME="$ARTIFACT_BASE_NAME".patch - > @@ -918,7 +823,7 @@ build-codec-linux-make: - .build-job-linux timeout: "10 minutes" script: - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - *activate-Werror-linux - make -j @@ -935,8 +840,8 @@ build-codec-linux-instrumented-make: - .build-job-linux timeout: "10 minutes" script: - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash scripts/prepare_instrumentation.sh -m MEM_ONLY - make -j -C $INSTR_DIR @@ -954,8 +859,8 @@ build-codec-linux-debugging-make: variables: BUILD_WITH_DEBUG_MODE_INFO: "true" script: - - *print-common-info - - *activate-debug-mode-info-if-set + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/activate-debug-mode-info-if-set.sh - make -j build-codec-windows-msbuild: @@ -1444,14 +1349,14 @@ ivas-smoke-test-saturation: - USE_LTV=1 - LEVEL_SCALING=32768 - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - fi - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - cp -r scripts/testv/* $TESTV_DIR/ @@ -1487,11 +1392,11 @@ coverage-test-on-main-scheduled: stage: test timeout: 3 hours script: - - *print-common-info - - *update-scripts-repo - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - *build-float-ref-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref # Build DuT binaries with GCOV - make clean >> /dev/null - make GCOV=1 -j @@ -1548,8 +1453,8 @@ be-2-evs-26444: stage: test timeout: "120 minutes" # To be revisited script: - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - sed -i".bak" "s/\(#define EVS_FLOAT\)/\/\/\1/" lib_com/options.h - make -j >> /dev/null @@ -1613,7 +1518,7 @@ voip-be-on-merge-request: needs: ["build-codec-linux-make"] timeout: "10 minutes" script: - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - make clean - make -j >> /dev/null - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py @@ -1704,10 +1609,10 @@ voip-be-on-merge-request: GET_WMOPS_ARGS: "mem_only" timeout: 3 hours 30 minutes before_script: - - *print-common-info - - *update-scripts-repo - - *update-ltv-repo - - *build-float-ref-and-dut-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - *complexity-measurements-setup # delete previous jobs logfiles if present (-f flag ensures return calue of 0 even in first run where this folder is not present) - rm -rf COMPLEXITY/logs @@ -2085,8 +1990,8 @@ pages: rules: - if: $UPDATE_PAGES script: - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - python3 ci/setup_pages.py - ls - ls -lh public -- GitLab From 8b86fdaebc520a6418208d4ddd20119b637cd82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Thu, 24 Apr 2025 17:54:06 +0200 Subject: [PATCH 0431/1310] Post-rebase fixes --- .gitlab-ci.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f3176df7..90afc1508 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -164,7 +164,6 @@ workflow: - .job-linux script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - !reference [.job-linux, before_script] .print-results-banner: &print-results-banner - set +x @@ -175,7 +174,7 @@ workflow: .test-job-linux-needs-testv-dir: extends: .test-job-linux before_script: - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ ! -d "$TESTV_DIR" ]; then mkdir -p $TESTV_DIR; fi - cp -r scripts/testv/* $TESTV_DIR/ @@ -223,7 +222,7 @@ workflow: - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; MEASURES_FOR_REPORT="$MEASURES_FOR_REPORT DELTA_ODG"; fi - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; fi - - *build-and-create-float-ref-outputs + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh # DMX comparison only in manual job with no other metrics - if [ "$COMPARE_DMX" = "true" ]; then @@ -462,7 +461,7 @@ workflow: - exit 0 - fi - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh -- GitLab From c65468f22f7f7f634fce60979d8eca266d91fc18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Thu, 24 Apr 2025 19:25:22 +0200 Subject: [PATCH 0432/1310] Fix missing update hook --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 90afc1508..20c8510a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -162,8 +162,9 @@ workflow: .test-job-linux: extends: - .job-linux - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + before_script: + - !reference [.job-linux, before_script] + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh .print-results-banner: &print-results-banner - set +x -- GitLab From 30a45771fdcc00dae848430c0b8fc53c736358ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Thu, 24 Apr 2025 20:53:47 +0200 Subject: [PATCH 0433/1310] Clean up and fix check-be-to-target/check-regressions-pytest jobs --- .gitlab-ci.yml | 224 ++++++++++++++++++------------------------------- 1 file changed, 80 insertions(+), 144 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 20c8510a8..ee0b8a104 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -314,9 +314,22 @@ workflow: exit 1 fi -.check-be-to-target-anchor: &check-be-to-target-anchor +.check-be-job: extends: - - .job-linux + - .test-job-linux + before_script: + - !reference [ .test-job-linux, before_script ] + - rm -rf tests/dut tests/ref + variables: + USE_LTV: 0 + DUT_ENCODER_PATH: ./IVAS_cod_ref + DUT_DECODER_PATH: ./IVAS_dec_ref + MERGE_TARGET_ENCODER_PATH: ./IVAS_cod_ref + MERGE_TARGET_DECODER_PATH: ./IVAS_dec_ref + +.check-be-to-target-job: + extends: + - .check-be-job stage: check-be needs: ["build-codec-linux-make"] timeout: "300 minutes" @@ -427,10 +440,13 @@ workflow: - unzip $PYTEST_CACHE_ARTIFACT - fi -.check-regressions-pytest-anchor: &check-regressions-pytest-anchor +.check-regressions-pytest-job: extends: - - .job-linux + - .check-be-job stage: test + needs: + - job: "check-be-to-target-short-enc-0db" + artifacts: true timeout: "300 minutes" variables: XML_REPORT_BRANCH: "report-junit-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" @@ -442,8 +458,6 @@ workflow: IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" script: - - !reference [ .job-linux, before_script ] - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh # create empty files for all artifacts to suppress warnings in case of no regressions found or all is BE @@ -888,178 +902,100 @@ build-codec-windows-msbuild: ### jobs that check for bitexactness of fx encoder and decoder check-be-to-target-short-enc-0db: extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # -/-0dB + LEVEL_SCALING: "1.0" check-be-to-target-short-enc-+10db: extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # +10dB + LEVEL_SCALING: "3.162" check-be-to-target-short-enc--10db: extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # -10dB + LEVEL_SCALING: "0.3162" check-be-to-target-short-dec-0db: extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +/-0dB + LEVEL_SCALING: "1.0" check-be-to-target-short-dec-+10db: extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +10dB + LEVEL_SCALING: "3.162" check-be-to-target-short-dec--10db: extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # -10dB + LEVEL_SCALING: "0.3162" ### jobs that check for regressions on non-BE testcases check-regressions-short-enc-0db: - stage: test - needs: - - job: "check-be-to-target-short-enc-0db" - artifacts: true extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + - .check-regressions-pytest-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # +/-0dB + LEVEL_SCALING: "1.0" check-regressions-short-enc-+10db: - stage: test - needs: - - job: "check-be-to-target-short-enc-+10db" - artifacts: true extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + - .check-regressions-pytest-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # +10dB + LEVEL_SCALING: "3.162" check-regressions-short-enc--10db: - stage: test - needs: - - job: "check-be-to-target-short-enc--10db" - artifacts: true extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + - .check-regressions-pytest-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # -10dB + LEVEL_SCALING: "0.3162" check-regressions-short-dec-0db: - stage: test - needs: - - job: "check-be-to-target-short-dec-0db" - artifacts: true extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + - .check-regressions-pytest-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +/-0dB + LEVEL_SCALING: "1" check-regressions-short-dec-+10db: - stage: test - needs: - - job: "check-be-to-target-short-dec-+10db" - artifacts: true extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + - .check-regressions-pytest-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +10dB + LEVEL_SCALING: "3.162" check-regressions-short-dec--10db: - stage: test - needs: - - job: "check-be-to-target-short-dec--10db" - artifacts: true extends: - - .rules-pytest-to-main-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + - .check-regressions-pytest-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # -10dB + LEVEL_SCALING: "0.3162" # --------------------------------------------------------------- # Short test jobs for running from web interface or schedule -- GitLab From 77a11c98b87dccc84b95815cf92765c9404cd588 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 24 Apr 2025 21:35:41 +0200 Subject: [PATCH 0434/1310] fix split renderering test fail --- apps/renderer.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 355c04798..851583bbf 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -822,10 +822,8 @@ int main( #ifdef SPLIT_REND_WITH_HEAD_ROT hSplitRendFileReadWrite = NULL; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING CLDFBframeSize_smpls = 0; cldfb_in_flag = 0; -#endif bitsBuffer.bits = NULL; bitsBuffer.config.bitsRead = 0; bitsBuffer.config.bitsWritten = 0; @@ -1268,11 +1266,9 @@ int main( exit( -1 ); } -#ifndef NONBE_FIX_BINARY_BINAURAL_READING #ifdef SPLIT_REND_WITH_HEAD_ROT CLDFBframeSize_smpls = frameSize_smpls * 2; cldfb_in_flag = get_cldfb_in_flag( args.outConfig.audioConfig, &renderConfig ); -#endif #endif } -- GitLab From 902091762193d58abec887465b73a18b3070a2bd Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 24 Apr 2025 22:10:45 +0200 Subject: [PATCH 0435/1310] fix windows build --- apps/decoder.c | 8 ++------ lib_util/hrtf_file_reader.c | 2 -- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 3aa9d26eb..1ccc82902 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -830,9 +830,7 @@ cleanup: if ( arg.hrtfReaderEnabled ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING - IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; -#else +#ifndef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; #endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); @@ -844,9 +842,7 @@ cleanup: #else dealloc_HRTF_binary( hHrtfTD ); #endif -#ifdef NONBE_FIX_BINARY_BINAURAL_READING - IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; -#else +#ifndef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; #endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 40fc592fb..8b18aac0f 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -2032,7 +2032,6 @@ ivas_error load_fastconv_HRTF_from_binary( #else return IVAS_ERR_OK; #endif - return IVAS_ERR_OK; } @@ -2214,7 +2213,6 @@ ivas_error load_parambin_HRTF_from_binary( #else return IVAS_ERR_OK; #endif - return IVAS_ERR_OK; } -- GitLab From 409948139be266df763bc613d756a51fbfe85edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Thu, 24 Apr 2025 22:29:14 +0200 Subject: [PATCH 0436/1310] Pin latest commit on main --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ee0b8a104..a00af3162 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,7 @@ variables: - # note: GitLab cannot reference the variable in the include ref:, we need to use a YAML anchor for this - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF mullerfa/ci-refactor + # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this + # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 4eb4c0dfbdc845280a9994b5f7540f69c737537b include: - local: .gitlab-ci/variables.yml -- GitLab From 1b02d8c28c0816e04778013bce56b2dcaa8c7144 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 24 Apr 2025 23:54:38 +0200 Subject: [PATCH 0437/1310] Remove all q_old_out_something variables and use Q_old_wtda/Q_old_wtda_LB instead. Cleanup some not needed rescaling of old_out buffers. Resolves some regression cases. --- lib_dec/dec_tcx_fx.c | 21 +++++++++------------ lib_dec/hq_core_dec_fx.c | 4 ---- lib_dec/ivas_core_dec_fx.c | 2 ++ lib_dec/ivas_cpe_dec_fx.c | 2 ++ lib_dec/ivas_jbm_dec_fx.c | 7 ++++++- lib_dec/ivas_mdct_core_dec_fx.c | 16 ++++++++++------ lib_dec/ivas_post_proc_fx.c | 4 ++++ lib_dec/stat_dec.h | 10 ++++------ 8 files changed, 37 insertions(+), 29 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 070d129c5..fc8fda9ad 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3665,12 +3665,14 @@ void decoder_tcx_ivas_fx( Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDAC ) ); // Scaling to Q_syn st->hTcxDec->Q_syn_Overl_TDAC = st->Q_syn; move16(); - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, negate( st->hHQ_core->Q_old_wtda ) ); // Scaling to Q_syn - Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, negate( st->hHQ_core->Q_old_wtda_LB ) ); // Scaling to Q_syn +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD + Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, negate( st->hHQ_core->Q_old_wtda ) ); // Scaling to Q0 + Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, negate( st->hHQ_core->Q_old_wtda_LB ) ); // Scaling to Q0 st->hHQ_core->Q_old_wtda = 0; move16(); st->hHQ_core->Q_old_wtda_LB = 0; move16(); +#endif Scale_sig( st->hTcxDec->old_syn_Overl, 320, st->Q_syn - st->hTcxDec->Q_old_syn_Overl ); // Scaling to Q_syn st->hTcxDec->Q_old_syn_Overl = st->Q_syn; @@ -3686,12 +3688,7 @@ void decoder_tcx_ivas_fx( Scale_sig( synth_fx, L_frame_glob, negate( st->Q_syn ) ); Scale_sig( synthFB_fx, L_frameTCX_glob, negate( st->Q_syn ) ); // Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, 1 ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - st->hHQ_core->Q_old_wtda = st->hHQ_core->q_old_out_fx; - // Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); - st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->q_old_out_LB_fx; - // Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); -#else +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD st->hHQ_core->Q_old_wtda = st->Q_syn; // Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, ( sub( st->hHQ_core->Q_old_wtda, st->Q_syn ) ) ); st->hHQ_core->Q_old_wtda_LB = st->Q_syn; @@ -5267,7 +5264,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->q_old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); #endif @@ -5293,7 +5290,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->q_old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); #endif @@ -5314,7 +5311,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->q_old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #endif @@ -5324,7 +5321,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->q_old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #endif diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 7d2a3c7a5..4d1ef6774 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -1202,10 +1202,6 @@ void HQ_core_dec_init_fx( hHQ_core->Q_old_wtda = 15; hHQ_core->Q_old_postdec = 0; hHQ_core->Q_old_wtda_LB = 0; -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - hHQ_core->q_old_out_fx = 0; - hHQ_core->q_old_out_LB_fx = 0; -#endif move16(); move16(); move16(); diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 320d9d4bc..12259f395 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -578,12 +578,14 @@ ivas_error ivas_core_dec_fx( /* TCX decoder */ Scale_sig( st->hPFstat->mem_stp, L_SUBFR, -Qsyn_temp ); // Q0 Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, -Qsyn_temp ); // Q0 +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, -st->hHQ_core->Q_old_wtda_LB ); // Q0 Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, -st->hHQ_core->Q_old_wtda ); // Q0 st->hHQ_core->Q_old_wtda_LB = 0; move16(); st->hHQ_core->Q_old_wtda = 0; move16(); +#endif IF( st_ivas == NULL ) { diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index c10c6beda..dcec695f3 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -132,7 +132,9 @@ ivas_error ivas_cpe_dec_fx( IF( hCPE->hCoreCoder[ind1]->hHQ_core ) { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11 +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT hCPE->hCoreCoder[ind1]->hHQ_core->q_old_outLB_fx = Q11; +#endif move16(); } } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 3f67962dc..33d11d380 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -434,8 +434,10 @@ ivas_error ivas_jbm_dec_tc_fx( { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; move16(); +#endif } IF( hCPE->hStereoDft != NULL ) { @@ -950,8 +952,10 @@ ivas_error ivas_jbm_dec_tc_fx( { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; move16(); +#endif } IF( hCPE->hStereoDft != NULL ) { @@ -996,7 +1000,6 @@ ivas_error ivas_jbm_dec_tc_fx( IF( hCPE->hCoreCoder[0] != NULL ) { - Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB, q ) ); // Q_old_wtda_LB Copy_Scale_sig_32_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, L_FRAME48k, sub( hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda, q ) ); // Q_old_wtda } @@ -1386,8 +1389,10 @@ ivas_error ivas_jbm_dec_tc_fx( { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; move16(); +#endif } IF( hCPE->hStereoDft != NULL ) { diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 6c527e9ce..243f6733b 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1186,9 +1186,13 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_old_syn_Overl = q_win; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD + st->hHQ_core->Q_old_wtda = q_win; + move16(); + st->hHQ_core->Q_old_wtda_LB = q_win; + move16(); #endif Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win @@ -1220,9 +1224,9 @@ void ivas_mdct_core_reconstruct_fx( /* Note: these buffers are not subframe-based, hence no indexing with k */ set16_fx( &st->hHQ_core->old_out_LB_fx[0], 0, L_frame[ch] ); set16_fx( &st->hHQ_core->old_out_fx[0], 0, L_frameTCX[ch] ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - st->hHQ_core->q_old_out_LB_fx = 0; - st->hHQ_core->q_old_out_fx = 0; +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD_NO + st->hHQ_core->Q_old_wtda = Q15; + st->hHQ_core->Q_old_wtda_LB = Q15; #endif set16_fx( &st->hTcxDec->syn_Overl[0], 0, shr( L_frame[ch], 1 ) ); set16_fx( &st->hTcxDec->syn_OverlFB[0], 0, shr( L_frameTCX[ch], 1 ) ); @@ -1267,12 +1271,12 @@ void ivas_mdct_core_reconstruct_fx( #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn -#endif st->hHQ_core->Q_old_wtda = st->Q_syn; move16(); st->hHQ_core->Q_old_wtda_LB = st->Q_syn; move16(); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#endif +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->mem_syn2_fx, M, sub( negate( q_win ), 2 ) ); #endif } diff --git a/lib_dec/ivas_post_proc_fx.c b/lib_dec/ivas_post_proc_fx.c index c0e69b916..b82cc1d00 100644 --- a/lib_dec/ivas_post_proc_fx.c +++ b/lib_dec/ivas_post_proc_fx.c @@ -588,7 +588,11 @@ void stereo_dft_dec_core_switching_fx( Word32 tmp_fade_fx[max( STEREO_DFT_ALLPASS_FADELEN_12k8, STEREO_DFT_ALLPASS_FADELEN_16k )]; Copy32( st->hHQ_core->old_out_LB_fx32 + numZeros, hCPE->hStereoDft->ap_fade_mem_fx, ap_fade_len ); /*st->hHQ_core->q_old_outLB_fx*/ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->Q_old_wtda_LB; +#else hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->q_old_outLB_fx; +#endif move16(); test(); diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 84f8d83bd..9d6f49436 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -698,15 +698,13 @@ typedef struct hq_nbfec_structure typedef struct hq_dec_structure { Word32 old_out_fx32[L_FRAME48k]; /* HQ core - previous synthesis for OLA */ - Word16 old_out_fx[L_FRAME48k]; /* HQ core - previous synthesis for OLA */ + Word16 old_out_fx[L_FRAME48k]; /* HQ core - previous synthesis for OLA. Q_old_wtda */ Word16 exp_old_out; - Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band */ + Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band. Q_old_wtda_LB */ Word32 old_out_LB_fx32[L_FRAME32k]; -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - Word16 q_old_out_LB_fx; - Word16 q_old_out_fx; -#endif +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_old_outLB_fx; +#endif Word16 Q_old_wtda_LB; Word16 Q_old_wtda; Word16 Q_old_postdec; /*scaling of the output of core_switching_post_dec_fx() */ -- GitLab From e3ee7268a49054531e72ed23706a7a6596b03920 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Fri, 25 Apr 2025 00:41:17 +0200 Subject: [PATCH 0438/1310] clang format --- lib_dec/ivas_core_dec_fx.c | 4 ++-- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 12259f395..e4d54a72c 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -576,8 +576,8 @@ ivas_error ivas_core_dec_fx( move32(); /* TCX decoder */ - Scale_sig( st->hPFstat->mem_stp, L_SUBFR, -Qsyn_temp ); // Q0 - Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, -Qsyn_temp ); // Q0 + Scale_sig( st->hPFstat->mem_stp, L_SUBFR, -Qsyn_temp ); // Q0 + Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, -Qsyn_temp ); // Q0 #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, -st->hHQ_core->Q_old_wtda_LB ); // Q0 Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, -st->hHQ_core->Q_old_wtda ); // Q0 diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 243f6733b..fc757feec 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1184,8 +1184,8 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win st->hTcxDec->Q_old_syn_Overl = q_win; - Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win - Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win + Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win + Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( q_win, st->hHQ_core->Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD -- GitLab From a4a26f8cb09e240a365b8d4b474ed2cc173bbe73 Mon Sep 17 00:00:00 2001 From: Hiromi Sekine Date: Fri, 25 Apr 2025 09:43:33 +0900 Subject: [PATCH 0439/1310] =?UTF-8?q?Enhanced=20accuracy=20by=20renormaliz?= =?UTF-8?q?ation=20in=20the=20frequency=20domain.=E3=80=80=20Added=20WMOPS?= =?UTF-8?q?=20counter=20#estimate=5Fitd=5Fwnd=5Ffft=5Ffx,#calc=5Fpoc=5Ffx,?= =?UTF-8?q?#find=5Fpoc=5Fpeak=5Ffx,#estimate=5Fitd=5Ffx,#weighted=5Fave=5F?= =?UTF-8?q?fx,#calc=5Fenergy=5Ffx,#adapt=5Fgain=5Ffx,#create=5FM=5Fsignal?= =?UTF-8?q?=5Ffx,#stereo=5Fdmx=5Fevs=5Fenc=5Ffx.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib_com/options.h | 12 +-- lib_enc/ivas_stereo_dmx_evs_fx.c | 147 +++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2f1e82de8..b297f0d1a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -53,12 +53,12 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -/*#define WMOPS*/ /* Activate complexity and memory counters */ +#define WMOPS /* Activate complexity and memory counters */ #ifdef WMOPS -/*#define WMOPS_PER_FRAME*/ /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ -/*#define WMOPS_DETAIL*/ /* Output detailed complexity printout for every function. Increases runtime overhead */ -/*#define WMOPS_WC_FRAME_ANALYSIS*/ /* Output detailed complexity analysis for the worst-case frame */ -/*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ +#define WMOPS_PER_FRAME /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ +#define WMOPS_DETAIL /* Output detailed complexity printout for every function. Increases runtime overhead */ +#define WMOPS_WC_FRAME_ANALYSIS /* Output detailed complexity analysis for the worst-case frame */ +/*define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ #endif /* #################### End DEBUGGING switches ############################ */ @@ -94,6 +94,8 @@ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ +#define FIX_1511_RENORM +#define FIX_1511_WMOPS #define TEST_HR #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 13ecbba00..21f5f48aa 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -223,6 +223,10 @@ void estimate_itd_wnd_fft_fx( Word16 step, bias; Word16 rshift; +#ifdef FIX_1511_WMOPS + push_wmops("estimate_itd_wnd_fft_fx"); +#endif + n0 = shr( input_frame, 1 ); IF( EQ_16( input_frame, L_FRAME16k ) ) { @@ -269,6 +273,10 @@ void estimate_itd_wnd_fft_fx( speci[n0] = 0; move32(); +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return; } @@ -322,6 +330,10 @@ static void calc_poc_fx( Word64 W_tmp; Word16 W_tmp_q; +#ifdef FIX_1511_WMOPS + push_wmops("calc_poc_fx"); +#endif + /* Initialization */ // iN = 1.0f / (float) input_frame; s = hPOC->sin_fx; @@ -412,6 +424,23 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); +#ifdef FIX_1511_RENORM + { + Word32 TH1 = 65536 * 512; + Word16 SHIFT1 = 4; + IF((LT_32(L_abs(Lr), TH1)) && + (LT_32(L_abs(Li), TH1)) && + (LT_32(L_abs(Rr), TH1)) && + (LT_32(L_abs(Ri), TH1))) + { + Lr = L_shl(Lr, SHIFT1); + Li = L_shl(Li, SHIFT1); + Rr = L_shl(Rr, SHIFT1); + Ri = L_shl(Ri, SHIFT1); + } + } +#endif + specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -424,6 +453,23 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); +#ifdef FIX_1511_RENORM + { + Word32 TH1 = 65536 * 512; + Word16 SHIFT1 = 4; + IF((LT_32(L_abs(Lr), TH1)) && + (LT_32(L_abs(Li), TH1)) && + (LT_32(L_abs(Rr), TH1)) && + (LT_32(L_abs(Ri), TH1))) + { + Lr = L_shl(Lr, SHIFT1); + Li = L_shl(Li, SHIFT1); + Rr = L_shl(Rr, SHIFT1); + Ri = L_shl(Ri, SHIFT1); + } + } +#endif + specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[j] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -444,6 +490,24 @@ static void calc_poc_fx( Li = L_add( L_sub( specLi[i], Mpy_32_32_r( specRr[i], eps_sin ) ), Mpy_32_32_r( specRi[i], eps_cos ) ); Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); + +#ifdef FIX_1511_RENORM + { + Word32 TH1 = 65536 * 512; + Word16 SHIFT1 = 4; + IF((LT_32(L_abs(Lr), TH1)) && + (LT_32(L_abs(Li), TH1)) && + (LT_32(L_abs(Rr), TH1)) && + (LT_32(L_abs(Ri), TH1))) + { + Lr = L_shl(Lr, SHIFT1); + Li = L_shl(Li, SHIFT1); + Rr = L_shl(Rr, SHIFT1); + Ri = L_shl(Ri, SHIFT1); + } + } +#endif + specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -454,6 +518,24 @@ static void calc_poc_fx( Li = L_sub( L_sub( specLi[j], Mpy_32_32_r( specRr[j], eps_sin ) ), Mpy_32_32_r( specRi[j], eps_cos ) ); Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); + +#ifdef FIX_1511_RENORM + { + Word32 TH1 = 65536 * 512; + Word16 SHIFT1 = 4; + IF((LT_32(L_abs(Lr), TH1)) && + (LT_32(L_abs(Li), TH1)) && + (LT_32(L_abs(Rr), TH1)) && + (LT_32(L_abs(Ri), TH1))) + { + Lr = L_shl(Lr, SHIFT1); + Li = L_shl(Li, SHIFT1); + Rr = L_shl(Rr, SHIFT1); + Ri = L_shl(Ri, SHIFT1); + } + } +#endif + specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[j] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -1125,6 +1207,10 @@ static void calc_poc_fx( } } +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return; } @@ -1144,6 +1230,11 @@ static Word32 find_poc_peak_fx( Word16 itd_cand[CPE_CHANNELS], i, n, cnt[CPE_CHANNELS], Lh, peak_range, *on, *itdLR, prev_off[CPE_CHANNELS], eps_fx; Word32 Q_fx[CPE_CHANNELS], aQ_fx[CPE_CHANNELS], cQ_fx[CPE_CHANNELS], width_fx, *peak_width_fx, *peakQ_fx, cconfidence_fx, *P_fx, tmpf_fx, eps2_fx; Word16 tmpf_e = 0, eps2_e = 0, Q_e[CPE_CHANNELS], eps_e = 15, peakQ_e[CPE_CHANNELS]; + +#ifdef FIX_1511_WMOPS + push_wmops("find_poc_peak_fx"); +#endif + move16(); move16(); move16(); @@ -1434,6 +1525,10 @@ static Word32 find_poc_peak_fx( hPOC->confidence_fx = L_add( cconfidence_var1, L_shl( cconfidence_var2, 1 ) ); // Q31 move32(); +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return hPOC->confidence_fx; } @@ -1459,6 +1554,10 @@ static ivas_error estimate_itd_fx( Word16 rfft_coef_step; ivas_error error; +#ifdef FIX_1511_WMOPS + push_wmops("estimate_itd_fx"); +#endif + error = IVAS_ERR_OK; move32(); @@ -1515,6 +1614,10 @@ static ivas_error estimate_itd_fx( *corr = round_fx( find_poc_peak_fx( hPOC, itd, input_frame, STEREO_DMX_EVS_POC_W_FORGETTING_FX ) ); move16(); +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return error; } @@ -1535,6 +1638,11 @@ static void weighted_ave_fx( { Word16 i, len; Word32 gain_tmp_fx = 0, gain_sub_fx; + +#ifdef FIX_1511_WMOPS + push_wmops("weighted_ave_fx"); +#endif + move32(); len = shr( input_frame, 4 ); gain_sub_fx = L_sub( gain_fx, old_gain_fx ); @@ -1550,6 +1658,10 @@ static void weighted_ave_fx( move32(); } +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return; } /*-------------------------------------------------------------------* @@ -1569,6 +1681,11 @@ static void calc_energy_fx( Word32 E_32_fx, wnd_fx, wnd_diff_fx; Word16 i, adaptlen; Word64 E_fx; + +#ifdef FIX_1511_WMOPS + push_wmops("calc_energy_fx"); +#endif + /* Initialization */ E_fx = 0; move32(); @@ -1630,6 +1747,11 @@ static void calc_energy_fx( // *energy = *energy * ratio_float + ( E / (float) input_frame ) * ( 1.0f - ratio_float ); *energy_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( *energy_fx, ratio_float_fx ), *energy_fx_e, Mpy_32_32( temp32, L_sub( MAX_32, ratio_float_fx ) ), sub( 31, q_temp32 ), energy_fx_e ); move32(); + +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return; } @@ -1650,6 +1772,10 @@ static void adapt_gain_fx( Word16 i, len; Word32 gain_tmp_fx, gain_sub_fx; +#ifdef FIX_1511_WMOPS + push_wmops("adapt_gain_fx"); +#endif + len = shr( input_frame, 4 ); // gain_sub = gain - old_gain; gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 @@ -1668,6 +1794,10 @@ static void adapt_gain_fx( move32(); } +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return; } @@ -1696,6 +1826,11 @@ static void create_M_signal_fx( Word32 temp32_1, temp32_2; Word16 temp_e; Word16 temp_e_1, temp_e_2; + +#ifdef FIX_1511_WMOPS + push_wmops("create_M_signal_fx"); +#endif + /* Initialization */ eps_fx = 1024; // 1024.0f in Q0 move32(); @@ -1761,6 +1896,10 @@ static void create_M_signal_fx( w_prev_fx[2] = amp_mod_fx[1]; move32(); +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return; } @@ -1799,6 +1938,10 @@ void stereo_dmx_evs_enc_fx( Word64 W_tmp; Word16 W_tmp_q; +#ifdef FIX_1511_WMOPS + push_wmops("stereo_dmx_evs_enc_fx"); +#endif + if ( is_binaural ) { /* use of is_binaural flag is to be considered */ @@ -2150,6 +2293,10 @@ void stereo_dmx_evs_enc_fx( Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 +#ifdef FIX_1511_WMOPS + pop_wmops(); +#endif + return; } -- GitLab From bbf760a19cbfbc975b508140b4e03d2c622f798b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 25 Apr 2025 11:57:02 +0530 Subject: [PATCH 0440/1310] Fix for 3GPP issue 1508: BASOP decoder asserts in ivas_wb_tbe_dec_fx with OMASA FER bitstream from BASOP encoder Link #1508 --- lib_com/swb_tbe_com_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5f391b271..5631dfa94 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -1645,7 +1645,12 @@ void GenShapedWBExcitation_ivas_fx( } } - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + Scale_sig( state_lpc_syn, LPC_SHB_ORDER, -Q2 ); /* Q(Q_bwe_exc) -> Q(Q_bwe_exc - 2) */ + + Syn_filt_s( Q2, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + + Scale_sig( state_lpc_syn, LPC_SHB_ORDER, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */ + Scale_sig( excSHB, L_FRAME16k / 4, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */ return; } -- GitLab From 8cbfea6c3aa81df3b8df6e8a0764dae0860be894 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 25 Apr 2025 12:28:57 +0530 Subject: [PATCH 0441/1310] Fix for LTV crash observed for test case: [ltv_basop_encoder-MASA 2TC at 192 kbps, 48kHz in, 48kHz out, EXT out] --- lib_enc/speech_music_classif_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index cf6ba543b..65000a7b3 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -2006,8 +2006,8 @@ Word16 ivas_smc_gmm_fx( { Word32 tmp_max; tmp_max = L_max( PS_norm_fx[i], hSpMusClas->past_PS_fx[i - LOWEST_FBIN] ); - - temp32 = BASOP_Util_Divide3232_Scale_newton( tmp_max, L_add( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp + /* Saturation doesn't have a significant impact here, as a value of 1e-5 in Q31 format is added to prevent division by zero */ + temp32 = BASOP_Util_Divide3232_Scale_newton( tmp_max, L_add_sat( dPS_fx[i], avoid_divide_by_zero ), &temp_exp ); // 31-temp_exp ps_sta_fx = BASOP_Util_Add_Mant32Exp( temp32, temp_exp, ps_sta_fx, ps_sta_exp, &ps_sta_exp ); } temp32_log = L_add( BASOP_Util_Log2( L_add_sat( ps_sta_fx, L_shr( 21475, ps_sta_exp ) ) ), L_shl( ps_sta_exp, Q25 ) ); -- GitLab From c0729f2c508b01ea9553dd102a129284780b2e0f Mon Sep 17 00:00:00 2001 From: emerit Date: Fri, 25 Apr 2025 10:48:28 +0200 Subject: [PATCH 0442/1310] fix linux build --- lib_util/hrtf_file_reader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 8b18aac0f..4cf892096 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1925,7 +1925,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #else // old binary file is wrong -#include "ivas_rom_binauralRenderer.h" + extern const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); -- GitLab From a6621c0de4709c34666afddbe0f4d6d80fec78a3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 25 Apr 2025 14:31:35 +0530 Subject: [PATCH 0443/1310] ASAN and MSAN error fix for decoder pipeline --- lib_dec/ivas_core_dec_fx.c | 2 +- lib_dec/ivas_dirac_dec_fx.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 320d9d4bc..38ec5b943 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -1030,7 +1030,7 @@ ivas_error ivas_core_dec_fx( /* Memories Re-Scaling */ Copy_Scale_sig_16_32_no_sat( hb_synth_16_fx[n], hb_synth_32_fx[n], L_FRAME48k, sub( Q11, Q_hb_synth_fx ) ); // Q11 Copy_Scale_sig_16_32_no_sat( output_16_fx[n], output_32_fx[n], L_FRAME48k, sub( Q11, Q_input ) ); // Q11 // Q_input can get value <= -5 - Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], synth_32_fx[n], L_FRAME48k, sub( Q11, Q_synth_fx ) ); // Q11 + Copy_Scale_sig_16_32_no_sat( synth_16_fx[n], synth_32_fx[n], output_frame, sub( Q11, Q_synth_fx ) ); // Q11 IF( hBWE_FD != NULL ) { diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 403e11f00..7fecb7ca7 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1511,10 +1511,25 @@ void ivas_qmetadata_to_dirac_fx( { FOR( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) { - hSpatParamRendCom->azimuth2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].azimuth_fx[block], 6 ) ); + /* Right shifting -1 -> -1, Hence this change is done */ + Word32 L_tmp = L_abs( q_direction->band_data[band].azimuth_fx[block] ); + hSpatParamRendCom->azimuth2[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); - hSpatParamRendCom->elevation2[meta_write_index][b] = extract_h( L_shr( q_direction->band_data[band].elevation_fx[block], 6 ) ); + IF( q_direction->band_data[band].azimuth_fx[block] < 0 ) + { + hSpatParamRendCom->azimuth2[meta_write_index][b] = negate( hSpatParamRendCom->azimuth2[meta_write_index][b] ); + move16(); + } + + L_tmp = L_abs( q_direction->band_data[band].elevation_fx[block] ); + hSpatParamRendCom->elevation2[meta_write_index][b] = extract_h( L_shr( L_tmp, 6 ) ); move16(); + IF( q_direction->band_data[band].elevation_fx[block] < 0 ) + { + hSpatParamRendCom->elevation2[meta_write_index][b] = negate( hSpatParamRendCom->elevation2[meta_write_index][b] ); + move16(); + } + hSpatParamRendCom->energy_ratio2_fx[meta_write_index][b] = q_direction->band_data[band].energy_ratio_fx[block]; move32(); hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b] = L_sub( hSpatParamRendCom->diffuseness_vector_fx[meta_write_index][b], q_direction->band_data[band].energy_ratio_fx[block] ); -- GitLab From 1917992dcf9d8c7c899debc82fc0b11a882044ed Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 25 Apr 2025 15:20:40 +0530 Subject: [PATCH 0444/1310] Fix for 3GPP issue 1509: BASOP decoder asserts in ivas_dirac_dec_binaural_determine_processing_matrices_fx with OMASA rate switching bitstream from BASOP encoder Link #1509 --- lib_dec/ivas_stereo_switching_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index bcf714352..677c91ef0 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -2351,7 +2351,7 @@ static Word32 ncross_corr_self_fx( q_prod = sub( 81, add( add( headroom_left_x, headroom_left_y ), q_prod ) ); energy = Sqrt32( energy, &q_prod ); - IF( LT_32( energy, L_shl_sat( 1, sub( 31, q_prod ) ) ) ) + IF( LE_32( energy, L_shl_sat( 1, sub( 31, q_prod ) ) ) ) { c_c_fx_return = W_shl_sat_l( c_c_fx, 31 - ( 2 * OUTPUT_Q + 1 ) ); // Q31 } -- GitLab From d80b5ea123605a6e959539370ccab5f1be076e88 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 25 Apr 2025 14:27:46 +0530 Subject: [PATCH 0445/1310] Fix for 3GPP issue 1516: BASOP encoder crash with OSBA with 4 objects Link #1516 --- lib_enc/bw_detect_fx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 30382cfba..050adbf01 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -48,7 +48,7 @@ void bw_detect_fx( const Word16 mct_on, /* i : flag MCT mode */ const Word16 Q_spec ) { - Word16 Q_dct; + Word16 Q_dct, E_spect_bin, tmp_1; Word16 i, j, k, bw_max, bin_width, n_bins; Word16 max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB; /* Q11*/ const Word16 *pt, *pt1; @@ -324,6 +324,7 @@ void bw_detect_fx( set16_fx( spect_bin, 1, n_bins ); Q_dct = shl( Q_dct, 1 ); + E_spect_bin = sub( Q31, Q_dct ); FOR( k = 0; k <= bw_max; k++ ) { @@ -336,9 +337,9 @@ void bw_detect_fx( sum32 = L_mac0_o( sum32, *pt1, *pt1, &Overflow ); pt1++; } + tmp_1 = BASOP_Util_Cmp_Mant32Exp( sum32, E_spect_bin, MAX_32, Q31 - 41 ); /* Any sum32 in Q_dct if it is less than MAX_32 in Q41 will be less than 0.001 */ test(); - test(); - IF( st->element_mode != EVS_MONO && EQ_32( sum32, MAX_32 ) && GT_16( Q_dct, 41 ) /* Any Q-value greater than Q41 for MAX_32 will be less than 0.001*/ ) + IF( st->element_mode != EVS_MONO && tmp_1 < 0 ) { spect_bin[i] = -6144; /* log10f( 0.00100000005 ) in Q11 */ move16(); -- GitLab From 397e5e5a5b24ecae8df2d8ad75938371c2f53223 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Fri, 25 Apr 2025 15:38:30 +0200 Subject: [PATCH 0446/1310] Trigger Build -- GitLab From 2589256847caa1453f787a380c4ba480fa0ef6fa Mon Sep 17 00:00:00 2001 From: marc emerit Date: Fri, 25 Apr 2025 16:22:58 +0200 Subject: [PATCH 0447/1310] fix test non BE --- lib_com/options.h | 3 ++- lib_util/hrtf_file_reader.c | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 037b7b2dd..f95bc9138 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,7 +106,8 @@ #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #define NONBE_FIX_AVG_IAC_CLDFB_REVERB #endif -#define FIX_OLD_BINARY_FORMAT +#define FIX_OLD_BINARY_FORMAT /* Orange: trick to make tests succesful when changing hrtf binary format between ref and new branch*/ +#define FIX_OLD_BINARY_FILE /* Orange: current hrtf binary file in ref branch contains wrong values for fastconv value. This switch can be activated to compre running codec with and without hrtf file*/ #endif /* #################### End BASOP porting switches ############################ */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 4cf892096..8f7f60e59 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1916,21 +1916,21 @@ static ivas_error create_fastconv_HRTF_from_rawdata( hrtf_data_rptr += sizeof( uint16_t ); -#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT +#ifdef FIX_OLD_BINARY_FILE // old binary file is wrong + extern const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + memcpy( f_tmp_brir_reverb, fastconvReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); -#else // old binary file is wrong - extern const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; +#else memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); - memcpy( f_tmp_brir_reverb, fastconvReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #endif -- GitLab From 8fee9f247c36fd5d0f6834a2912c40be0938cced Mon Sep 17 00:00:00 2001 From: marc emerit Date: Fri, 25 Apr 2025 16:52:55 +0200 Subject: [PATCH 0448/1310] Trigger Build -- GitLab From 868dd2439660c01d806e5264ee392e873ce51a35 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 17:12:17 +0200 Subject: [PATCH 0449/1310] add DISABLE_LIMITER switch and framesize-be test --- .gitlab-ci.yml | 46 +++++++++++++++++++++++++++++++++++++++++++++ lib_com/options.h | 2 ++ lib_rend/lib_rend.c | 4 ++++ 3 files changed, 52 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a00af3162..36768312d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -998,6 +998,52 @@ check-regressions-short-dec--10db: # -10dB LEVEL_SCALING: "0.3162" +check-be-between-renderer-framesizes: + extends: + - .test-job-linux + - .rules-pytest-to-main-short + stage: test + needs: ["build-codec-linux-cmake", "build-codec-linux-make", "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] + script: + - *print-common-info + - *disable-limiter + - *build-float-ref-and-dut-binaries + - pytest_args="$SHORT_TEST_SUITE --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec" + + - python3 -m pytest --update_ref 1 "$pytest_args" + + - exit_code=0 + - exit_code5=0 + - exit_code10=0 + - python3 -m pytest $pytest_args --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? + - python3 -m pytest $pytest_args --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? + + - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true + - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true + - zero_errors=1 + + - if [ $zero_errors5 != 1 ]; then echo "run error in with 5ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors10 != 1 ]; then echo "run error in with 10ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors != 1 ]; then exit $EXIT_CODE_FAIL; fi + - if [ $exit_code5 -ne 0 ]; then echo "Non-bitexact cases encountered with 5ms rendering!"; exit_code=1; fi + - if [ $exit_code10 -ne 0 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi + - if [ $exit_code -ne 0 ]; then exit $EXIT_CODE_FAIL; fi + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week + when: always + expose_as: "pytest 5ms and 10ms vs 20ms results" + paths: + - report-junit-5ms.xml + - report-5ms.html + - report-junit-10ms.xml + - report-10ms.html + reports: + junit: + - report-junit-5ms.xml + - report-junit-10ms.xml + + # --------------------------------------------------------------- # Short test jobs for running from web interface or schedule # --------------------------------------------------------------- diff --git a/lib_com/options.h b/lib_com/options.h index cbc77b6e7..646bb3ff2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -61,6 +61,8 @@ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ #endif +#define DISABLE_LIMITER + /* #################### End DEBUGGING switches ############################ */ #ifndef BASOP_NOGLOB_DEV_USE_GLOBALS diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index e39b9a61e..6f85b8fa0 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -350,6 +350,7 @@ static void accumulate2dArrayToBuffer_fx( * In-place saturation control for multichannel buffers with adaptive release time *-------------------------------------------------------------------*/ +#ifndef DISABLE_LIMITER /*! r: number of clipped output samples */ static Word32 limitRendererOutput_fx( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ @@ -393,6 +394,7 @@ static Word32 limitRendererOutput_fx( return numClipping; } +#endif /*-------------------------------------------------------------------* * validateOutputAudioConfig() @@ -7361,7 +7363,9 @@ static ivas_error getSamplesInternal( test(); Word32 limiter_thresold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); +#ifndef DISABLE_LIMITER limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_thresold, *outAudio.pq_fact ); +#endif /* update global cominbed orientation start index */ ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel ); -- GitLab From 7f31b3174b49885e497b851597fff9d564358bea Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 17:16:35 +0200 Subject: [PATCH 0450/1310] fix CI setup --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 36768312d..41a138d6a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1003,7 +1003,7 @@ check-be-between-renderer-framesizes: - .test-job-linux - .rules-pytest-to-main-short stage: test - needs: ["build-codec-linux-cmake", "build-codec-linux-make", "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] + needs: ["build-codec-linux-make"] script: - *print-common-info - *disable-limiter -- GitLab From 662aeb4527ead3e2234e0f3da87cccc0dcd284ed Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Apr 2025 17:23:28 +0200 Subject: [PATCH 0451/1310] deactivate DISABLE_LIMITER --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 646bb3ff2..673fcae4d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -61,7 +61,7 @@ /*#define MEM_COUNT_DETAILS*/ /* Output detailed memory analysis for the worst-case frame (writes to the file "mem_analysis.csv") */ #endif -#define DISABLE_LIMITER +/*#define DISABLE_LIMITER*/ /* #################### End DEBUGGING switches ############################ */ -- GitLab From 4c94d705e6fa65644ee7c3cfa96abb203bab1326 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Apr 2025 17:13:52 +0200 Subject: [PATCH 0452/1310] [revert-me] point to wip branch in ci repo --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 41a138d6a..53ec5f6e5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 4eb4c0dfbdc845280a9994b5f7540f69c737537b + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF framesize-be-test-to-basop include: - local: .gitlab-ci/variables.yml -- GitLab From 415250fa874a2d32b875482cc3f8a252dda0d047 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Apr 2025 17:15:53 +0200 Subject: [PATCH 0453/1310] use snippets instead of yaml anchors --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 53ec5f6e5..e4c552cde 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1005,9 +1005,9 @@ check-be-between-renderer-framesizes: stage: test needs: ["build-codec-linux-make"] script: - - *print-common-info - - *disable-limiter - - *build-float-ref-and-dut-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - pytest_args="$SHORT_TEST_SUITE --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec" - python3 -m pytest --update_ref 1 "$pytest_args" -- GitLab From 464e2f9c571f72e814b6a2285a94b75b66d9faec Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Apr 2025 19:02:02 +0200 Subject: [PATCH 0454/1310] use commit sha instead of branch name --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e4c552cde..f3adb0c7a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF framesize-be-test-to-basop + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 74a8d426730ed21183fe047503e7097262fcb796 include: - local: .gitlab-ci/variables.yml -- GitLab From 0f3ed1d91bae5e3718922a7d92a2886f3169ea09 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 27 Apr 2025 09:46:59 +0200 Subject: [PATCH 0455/1310] Attempt to fix missing rules and missing fetch of ci scripts --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a00af3162..8fb379bf9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -195,6 +195,8 @@ workflow: IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" script: + - !reference [ .job-linux, before_script ] + - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh @@ -318,6 +320,7 @@ workflow: .check-be-job: extends: - .test-job-linux + - .rules-pytest-to-main-short before_script: - !reference [ .test-job-linux, before_script ] - rm -rf tests/dut tests/ref -- GitLab From a0344f22fb0744054e98f0a5c142e302e4cea783 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Sun, 27 Apr 2025 11:25:35 +0200 Subject: [PATCH 0456/1310] Add changes back and forth to q_old_outLB_fx/Q_old_wtda_LB again, the assumption that this does not have an effect was wrong. --- lib_dec/ivas_jbm_dec_fx.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 33d11d380..e313304e2 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -434,7 +434,10 @@ ivas_error ivas_jbm_dec_tc_fx( { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB = q; + move16(); +#else hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; move16(); #endif @@ -952,7 +955,10 @@ ivas_error ivas_jbm_dec_tc_fx( { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB = q; + move16(); +#else hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; move16(); #endif @@ -1389,7 +1395,10 @@ ivas_error ivas_jbm_dec_tc_fx( { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB = q; + move16(); +#else hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; move16(); #endif -- GitLab From 5d486dc952b6a20ea856c3e144e3c7336e223393 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 27 Apr 2025 20:59:49 +0200 Subject: [PATCH 0457/1310] Add fix to pages job --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8fb379bf9..bebb7d024 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1930,6 +1930,8 @@ pages: rules: - if: $UPDATE_PAGES script: + - !reference [ .job-linux, before_script ] + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - python3 ci/setup_pages.py -- GitLab From bd8637d94fda7573c15f0e07b714299f3bb4ac7e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 25 Apr 2025 14:55:08 +0530 Subject: [PATCH 0458/1310] Fix for 3GPP issue 1427: Basop Encoder Spectral Gaps in Stereo DTX 13.2 kbps Noisy Signal Link #1427 --- lib_enc/ivas_core_enc_fx.c | 19 ++++++------------- lib_enc/ivas_core_pre_proc_fx.c | 14 ++++++++++---- lib_enc/prot_fx_enc.h | 1 + lib_enc/stat_enc.h | 2 +- lib_enc/swb_bwe_enc_fx.c | 17 +++++++++-------- lib_enc/swb_pre_proc_fx.c | 15 ++++++++++++++- 6 files changed, 41 insertions(+), 27 deletions(-) diff --git a/lib_enc/ivas_core_enc_fx.c b/lib_enc/ivas_core_enc_fx.c index f5d3c4d73..6fcb8abd0 100644 --- a/lib_enc/ivas_core_enc_fx.c +++ b/lib_enc/ivas_core_enc_fx.c @@ -675,12 +675,6 @@ ivas_error ivas_core_enc_fx( wb_bwe_enc_ivas_fx( st, new_inp_resamp16k_fx[n] ); } - IF( st->hBWE_FD != NULL ) - { - Scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, Q1 ); // Q-1 -> Q0 - st->Q_old_wtda = add( st->Q_old_wtda, Q1 ); - move16(); - } /*---------------------------------------------------------------------* * SWB(FB) TBE encoding @@ -725,8 +719,6 @@ ivas_error ivas_core_enc_fx( Scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, shift ); // st->Q_old_wtda } - Word16 q_new_swb_speech_buffer = getScaleFactor16( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX ); - Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, q_new_swb_speech_buffer ); // Q0->q_new_swb_speech_buffer /* SWB TBE encoder */ test(); @@ -750,11 +742,9 @@ ivas_error ivas_core_enc_fx( } ELSE IF( EQ_16( st->extl, SWB_BWE ) || EQ_16( st->extl, FB_BWE ) ) { - Copy_Scale_sig_32_16( shb_speech_fx32, shb_speech_fx, L_FRAME16k, -Q16 ); // Q_shb_spch - 16 - Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, negate( q_new_swb_speech_buffer ) ); // q_new_swb_speech_buffer -> Q0 + Copy_Scale_sig_32_16( shb_speech_fx32, shb_speech_fx, L_FRAME16k, -Q16 ); // Q_shb_spch - 16 /* SWB(FB) BWE encoder */ - swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx[n], old_inp_16k_fx[n], old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, shb_speech_fx, sub( Q_shb_spch, Q16 ), sub( Q_new[n], 1 ) ); - Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, q_new_swb_speech_buffer ); // Q0 -> q_new_swb_speech_buffer + swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx[n], old_inp_16k_fx[n], old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, st->q_inp, shb_speech_fx, sub( Q_shb_spch, Q16 ), sub( Q_new[n], 1 ) ); } Scale_sig( old_syn_12k8_16k_fx[n], L_FRAME16k, sub( Q1, Q_new[n] ) ); // Q0 @@ -776,6 +766,9 @@ ivas_error ivas_core_enc_fx( * Inter-channel BWE encoding *-------------------------------------------------------------------*/ + Word16 q_new_swb_speech_buffer = getScaleFactor16( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX ); + Scale_sig( new_swb_speech_buffer_fx_16, L_FRAME48k + STEREO_DFT_OVL_MAX, q_new_swb_speech_buffer ); // st->q_inp+q_new_swb_speech_buffer + q_new_swb_speech_buffer = add( st->q_inp, q_new_swb_speech_buffer ); test(); test(); IF( n == 0 && GE_32( input_Fs, 32000 ) && hStereoICBWE != NULL ) @@ -784,7 +777,7 @@ ivas_error ivas_core_enc_fx( stereo_icBWE_preproc_fx( hCPE, input_frame, new_swb_speech_buffer_fx_16 /*tmp buffer*/, q_new_swb_speech_buffer ); q_new_swb_speech_buffer = add( q_new_swb_speech_buffer, 16 ); - Copy_Scale_sig_16_32_no_sat( new_swb_speech_buffer_fx_16, new_swb_speech_buffer_fx, L_FRAME48k + STEREO_DFT_OVL_MAX, Q16 ); // q_new_swb_speech_buffer - 16 - > q_new_swb_speech_buffer + Copy_Scale_sig_16_32_no_sat( new_swb_speech_buffer_fx_16, new_swb_speech_buffer_fx, L_FRAME48k + STEREO_DFT_OVL_MAX, Q16 ); // q_new_swb_speech_buffer+st->q_inp - 16 - > q_new_swb_speech_buffer+st->q_inp Copy_Scale_sig_16_32_no_sat( voice_factors_fx[0], voice_factors_fx32[0], NB_SUBFR16k, Q16 ); // Q31 stereo_icBWE_enc_ivas_fx( hCPE, shb_speech_fx32, sub( Q31, Q_shb_spch ), new_swb_speech_buffer_fx, sub( Q31, q_new_swb_speech_buffer ), voice_factors_fx32[0] ); diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 6fe6b6720..48253aed6 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -886,8 +886,11 @@ ivas_error ivas_compute_core_buffers_fx( IF( EQ_16( st->bwidth, WB ) ) { - Copy_Scale_sig( new_inp_16k_fx - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ - Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - STEREO_DFT_OVL_16k + delay, sub( STEREO_DFT_OVL_16k, delay ) ); /* Check Q here once. Q should be Q_old_wtda */ + Copy_Scale_sig( new_inp_16k_fx - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ + scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( Q_old_inp_16k, st->Q_old_wtda ) ); // st->Q_old_wtda->Q_old_inp_16k + Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - STEREO_DFT_OVL_16k + delay, sub( STEREO_DFT_OVL_16k, delay ) ); + st->Q_old_wtda = Q_old_inp_16k; + move16(); } } ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) ) @@ -898,8 +901,11 @@ ivas_error ivas_compute_core_buffers_fx( test(); IF( EQ_16( st->bwidth, WB ) && st->hBWE_FD != NULL ) { - Copy_Scale_sig( new_inp_16k_fx + L_FILT16k - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ - Copy( new_inp_16k_fx - L_MEM_RECALC_16K, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - L_MEM_RECALC_16K - L_FILT16k + delay, sub( L_MEM_RECALC_16K + L_FILT16k, delay ) ); /* Check Q here once. Q should be Q_old_wtda */ + Copy_Scale_sig( new_inp_16k_fx + L_FILT16k - delay, st->hBWE_FD->old_input_wb_fx, delay, negate( add( Q_old_inp_16k, 1 ) ) ); /* Scaling to Q(-1) */ + scale_sig( st->hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( Q_old_inp_16k, st->Q_old_wtda ) ); // st->Q_old_wtda->Q_old_inp_16k + Copy( new_inp_16k_fx - L_MEM_RECALC_16K, st->hBWE_FD->L_old_wtda_swb_fx + L_FRAME16k - L_MEM_RECALC_16K - L_FILT16k + delay, sub( L_MEM_RECALC_16K + L_FILT16k, delay ) ); + st->Q_old_wtda = Q_old_inp_16k; + move16(); } } ELSE IF( element_mode == IVAS_SCE ) diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 4237aa9c3..11d6404b7 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -639,6 +639,7 @@ void swb_bwe_enc_ivas_fx( Word16 *old_input_16k_fx, /* i : input signal @16kHz for SWB BWE */ const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz */ const Word16 *new_swb_speech_fx, /* i : original input signal at 32kHz */ + const Word16 Q_new_swb_speech, /* i : Q for new_swb_speech_fx */ Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz */ Word16 Q_shb_speech, Word16 Q_slb_speech ); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 45ec01b31..4da0bff61 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -1013,7 +1013,7 @@ typedef struct fd_bwe_enc_structure { Word16 new_input_hp_fx[NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS )]; // Q_new_input_hp Word16 Q_new_input_hp; - Word16 old_input_fx[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS )]; // q0 + Word16 old_input_fx[NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS )]; // st->q_inp Word16 old_input_wb_fx[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; /* Q(-1) */ Word16 old_input_lp_fx[NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS )]; // st->hBWE_FD->prev_Q_input_lp Word16 old_syn_12k8_16k_fx[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )]; // st->Q_syn diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c index 1ebef7404..6b309c334 100644 --- a/lib_enc/swb_bwe_enc_fx.c +++ b/lib_enc/swb_bwe_enc_fx.c @@ -270,6 +270,7 @@ void swb_bwe_enc_ivas_fx( Word16 *old_input_16k_fx, /* i : input signal @16kHz for SWB BWE */ const Word16 *old_syn_12k8_16k_fx, /* i : ACELP core synthesis at 12.8kHz or 16kHz */ const Word16 *new_swb_speech_fx, /* i : original input signal at 32kHz */ + const Word16 Q_new_swb_speech, /* i : Q for new_swb_speech_fx */ Word16 *shb_speech_fx, /* i : SHB target signal (6-14kHz) at 16kHz */ Word16 Q_shb_speech, Word16 Q_slb_speech ) @@ -287,7 +288,7 @@ void swb_bwe_enc_ivas_fx( Word16 old_input_lp_fx[L_FRAME16k]; Word16 new_input_hp_fx[L_FRAME16k]; Word16 yorig_fx[L_FRAME48k]; - Word16 scl, new_input_fx_exp; + Word16 scl, new_input_fx_q; Word16 max; Word16 Sample_Delay_SWB_BWE; Word16 Sample_Delay_HP; @@ -412,7 +413,7 @@ void swb_bwe_enc_ivas_fx( * SWB BWE encoding * FB BWE encoding *---------------------------------------------------------------------*/ - new_input_fx_exp = 0; + new_input_fx_q = Q_new_swb_speech; move16(); test(); IF( ( EQ_16( st_fx->idchan, 1 ) ) && ( EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) @@ -424,12 +425,12 @@ void swb_bwe_enc_ivas_fx( } } /* MDCT of the core synthesis signal */ - wtda_fx( old_input_fx, &new_input_fx_exp, L_old_input_fx, hBWE_FD->L_old_wtda_swb_fx, + wtda_fx( old_input_fx, &new_input_fx_q, L_old_input_fx, hBWE_FD->L_old_wtda_swb_fx, &st_fx->Q_old_wtda, ALDO_WINDOW, ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ inner_frame ); /* DCT of the ACELP core synthesis */ - direct_transform_fx( L_old_input_fx, yorig_32, 0, inner_frame, &new_input_fx_exp, st_fx->element_mode ); + direct_transform_fx( L_old_input_fx, yorig_32, 0, inner_frame, &new_input_fx_q, st_fx->element_mode ); /* high-band gain control in case of BWS */ IF( st_fx->bwidth_sw_cnt > 0 ) @@ -438,7 +439,7 @@ void swb_bwe_enc_ivas_fx( } /* Convert to 16 Bits (Calc Shift Required to Stay within MAX_Q_NEW_INPUT) */ - scl = sub( 16 + 8, new_input_fx_exp ); + scl = sub( 16 + 8, new_input_fx_q ); /* Possible to Upscale? */ IF( scl > 0 ) { @@ -449,7 +450,7 @@ void swb_bwe_enc_ivas_fx( scl = s_min( Q_synth, scl ); } Copy_Scale_sig32_16( yorig_32, yorig_fx, inner_frame, scl ); - Q_synth = add( sub( new_input_fx_exp, 16 ), scl ); + Q_synth = add( sub( new_input_fx_q, 16 ), scl ); max = 0; move16(); Q_synth_hf = 0; @@ -558,12 +559,12 @@ void swb_bwe_enc_ivas_fx( IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) { SWB_BWE_encoding_ivas_fx( st_fx, old_input_fx, old_input_lp_fx, new_input_hp_fx, old_syn_12k8_16k_fx, yorig_32, - SWB_fenv_fx, tilt_nb_fx, 80, Q_slb_speech, Q_shb, new_input_fx_exp, new_input_fx_exp ); + SWB_fenv_fx, tilt_nb_fx, 80, Q_slb_speech, Q_shb, new_input_fx_q, new_input_fx_q ); } ELSE { SWB_BWE_encoding_ivas_fx( st_fx, old_input_fx, old_input_lp_fx, new_input_hp_fx, old_syn_12k8_16k_fx, yorig_32, - SWB_fenv_fx, tilt_nb_fx, 6, Q_slb_speech, Q_shb, new_input_fx_exp, new_input_fx_exp ); + SWB_fenv_fx, tilt_nb_fx, 6, Q_slb_speech, Q_shb, new_input_fx_q, new_input_fx_q ); } diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c index ba165cba4..30cfb4920 100644 --- a/lib_enc/swb_pre_proc_fx.c +++ b/lib_enc/swb_pre_proc_fx.c @@ -166,6 +166,8 @@ void wb_pre_proc_fx( Copy( hBWE_FD->old_input_wb_fx, old_input, Sample_Delay_WB_BWE ); Copy( new_inp_resamp16k + L_FRAME16k - Sample_Delay_WB_BWE, hBWE_FD->old_input_wb_fx, Sample_Delay_WB_BWE ); Copy( old_input, hBWE_FD->L_old_wtda_swb_fx, L_FRAME16k ); + st_fx->Q_old_wtda = -1; + move16(); } return; } @@ -778,7 +780,7 @@ void swb_pre_proc_fx( /*full implementation pending*/ void swb_pre_proc_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ - Word16 *new_swb_speech, /* o : original input signal at 32kHz - Q0 */ + Word16 *new_swb_speech, /* o : original input signal at 32kHz - st->q_inp */ Word32 *new_swb_speech_fx, /* o : original input signal at 32kHz - Q - q_reImBuffer */ Word16 *shb_speech, /* o : SHB target signal (6-14kHz) at 16kHz- Q(Q_shb_spch) */ Word16 *Q_shb_spch, @@ -846,6 +848,9 @@ void swb_pre_proc_ivas_fx( test(); test(); + scale_sig( hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( st->q_inp, st->Q_old_wtda ) ); // st->Q_old_wtda -> st->q_inp + st->Q_old_wtda = st->q_inp; + move16(); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && GE_16( st->bwidth, SWB ) ) { Copy( st->input_fx - hCPE->hStereoTCA->lMemRecalc, hBWE_FD->L_old_wtda_swb_fx + L_FRAME32k - sub( hCPE->hStereoTCA->lMemRecalc, Sample_Delay_SWB_BWE ), sub( hCPE->hStereoTCA->lMemRecalc, Sample_Delay_SWB_BWE ) ); @@ -880,6 +885,8 @@ void swb_pre_proc_ivas_fx( IF( NE_16( st->extl, WB_BWE ) ) { Copy( old_input_fx, hBWE_FD->L_old_wtda_swb_fx, L_FRAME32k ); + st->Q_old_wtda = st->q_inp; + move16(); } } @@ -929,6 +936,10 @@ void swb_pre_proc_ivas_fx( test(); test(); + scale_sig( hBWE_FD->L_old_wtda_swb_fx, L_FRAME48k, sub( st->q_inp, st->Q_old_wtda ) ); // st->Q_old_wtda -> st->q_inp + st->Q_old_wtda = st->q_inp; + move16(); + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && GE_16( st->bwidth, SWB ) ) { IF( EQ_16( st->bwidth, SWB ) ) @@ -1029,6 +1040,8 @@ void swb_pre_proc_ivas_fx( set16_fx( old_input_fx, 0, Sample_Delay_SWB_BWE ); Copy( new_swb_speech + inner_frame - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE ); Copy( old_input_fx, hBWE_FD->L_old_wtda_swb_fx, inner_frame ); + st->Q_old_wtda = st->q_inp; + move16(); } /* resample 48 kHz to 32kHz */ -- GitLab From 6e4399ee5756cb057a36cfd0e8a8b99367f53b03 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 08:46:47 +0530 Subject: [PATCH 0459/1310] EVS bitexactness fix --- lib_enc/swb_pre_proc_fx.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c index 30cfb4920..8991696e6 100644 --- a/lib_enc/swb_pre_proc_fx.c +++ b/lib_enc/swb_pre_proc_fx.c @@ -166,8 +166,6 @@ void wb_pre_proc_fx( Copy( hBWE_FD->old_input_wb_fx, old_input, Sample_Delay_WB_BWE ); Copy( new_inp_resamp16k + L_FRAME16k - Sample_Delay_WB_BWE, hBWE_FD->old_input_wb_fx, Sample_Delay_WB_BWE ); Copy( old_input, hBWE_FD->L_old_wtda_swb_fx, L_FRAME16k ); - st_fx->Q_old_wtda = -1; - move16(); } return; } -- GitLab From 88d341f8f88423ca0ab7073d99a5a78b47e23140 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 08:50:42 +0530 Subject: [PATCH 0460/1310] Fix for renderer crashes in CI ltv test --- lib_rend/ivas_dirac_rend_fx.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 2540426cc..06b37ff5a 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -5007,10 +5007,20 @@ static void ivas_masa_ext_dirac_render_sf_fx( ELSE { /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + /* cldfb_state_fx should be in 1 less q-factor compared to cld buffers for cldfbSynthesis_ivas_fx function */ Word16 q_out = sub( q_cldfb, 1 ); - scale_sig32( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ); // q_out - hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state = q_out; - move16(); + Word16 max_shift = L_norm_arr( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length ); + IF( GT_16( max_shift, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ) ) + { + scale_sig32( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ); // q_out + hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state = q_out; + move16(); + } + ELSE + { + scale_sig32( Cldfb_RealBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + scale_sig32( Cldfb_ImagBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + } FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) { RealBuffer_fx[i] = Cldfb_RealBuffer_fx[idx_in][i]; // q_cldfb -- GitLab From 7d21ca8a794b7ff59fa8b2b2ec43c102e0d52f38 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 28 Apr 2025 07:23:59 +0200 Subject: [PATCH 0461/1310] fix build for framesize-be-test --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f3adb0c7a..8589c4094 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1007,7 +1007,8 @@ check-be-between-renderer-framesizes: script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh + - make clean + - make -j "${nproc}" - pytest_args="$SHORT_TEST_SUITE --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec" - python3 -m pytest --update_ref 1 "$pytest_args" -- GitLab From 9c50097157b901617b3818c75a642b40e2bb6461 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 27 Apr 2025 09:46:59 +0200 Subject: [PATCH 0462/1310] Attempt to fix missing rules and missing fetch of ci scripts --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8589c4094..5b77d3bb8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -195,6 +195,8 @@ workflow: IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" script: + - !reference [ .job-linux, before_script ] + - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh @@ -318,6 +320,7 @@ workflow: .check-be-job: extends: - .test-job-linux + - .rules-pytest-to-main-short before_script: - !reference [ .test-job-linux, before_script ] - rm -rf tests/dut tests/ref -- GitLab From 0fd4d559f75ae967d5631610db971302b2d42596 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 27 Apr 2025 20:59:49 +0200 Subject: [PATCH 0463/1310] Add fix to pages job --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5b77d3bb8..596c973b9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1977,6 +1977,8 @@ pages: rules: - if: $UPDATE_PAGES script: + - !reference [ .job-linux, before_script ] + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - python3 ci/setup_pages.py -- GitLab From 0987e660e150af270960c3918893964a01d4be6e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 25 Apr 2025 11:57:02 +0530 Subject: [PATCH 0464/1310] Fix for 3GPP issue 1508: BASOP decoder asserts in ivas_wb_tbe_dec_fx with OMASA FER bitstream from BASOP encoder Link #1508 --- lib_com/swb_tbe_com_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5f391b271..5631dfa94 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -1645,7 +1645,12 @@ void GenShapedWBExcitation_ivas_fx( } } - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + Scale_sig( state_lpc_syn, LPC_SHB_ORDER, -Q2 ); /* Q(Q_bwe_exc) -> Q(Q_bwe_exc - 2) */ + + Syn_filt_s( Q2, lpc_shb, LPC_SHB_ORDER_WB, exc4kWhtnd, excSHB, L_FRAME16k / 4, state_lpc_syn, 1 ); + + Scale_sig( state_lpc_syn, LPC_SHB_ORDER, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */ + Scale_sig( excSHB, L_FRAME16k / 4, Q2 ); /* Q(Q_bwe_exc - 2) -> Q(Q_bwe_exc) */ return; } -- GitLab From 9cc2505f643f0a6f765e283f4ab2939cca604134 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 08:50:42 +0530 Subject: [PATCH 0465/1310] Fix for renderer crashes in CI ltv test --- lib_rend/ivas_dirac_rend_fx.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 2540426cc..06b37ff5a 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -5007,10 +5007,20 @@ static void ivas_masa_ext_dirac_render_sf_fx( ELSE { /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + /* cldfb_state_fx should be in 1 less q-factor compared to cld buffers for cldfbSynthesis_ivas_fx function */ Word16 q_out = sub( q_cldfb, 1 ); - scale_sig32( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ); // q_out - hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state = q_out; - move16(); + Word16 max_shift = L_norm_arr( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length ); + IF( GT_16( max_shift, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ) ) + { + scale_sig32( hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_fx, hMasaExtRend->cldfbSynRend[idx_in]->cldfb_state_length, sub( q_out, hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state ) ); // q_out + hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state = q_out; + move16(); + } + ELSE + { + scale_sig32( Cldfb_RealBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + scale_sig32( Cldfb_ImagBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + } FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) { RealBuffer_fx[i] = Cldfb_RealBuffer_fx[idx_in][i]; // q_cldfb -- GitLab From 877a75aace513c106243d92e10938e4c034d516b Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 28 Apr 2025 08:12:38 +0200 Subject: [PATCH 0466/1310] remove nproc again --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 596c973b9..945de8500 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1011,7 +1011,7 @@ check-be-between-renderer-framesizes: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh - make clean - - make -j "${nproc}" + - make -j - pytest_args="$SHORT_TEST_SUITE --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec" - python3 -m pytest --update_ref 1 "$pytest_args" -- GitLab From d0c0db1c0c943fa2a048363c792ca5a934e92b7d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 17:23:12 +0530 Subject: [PATCH 0467/1310] Complexity measure crash fix for ltv48_STEREO_StereoDmxEvs_b07_16_dtx_wb_rs_fer_ep_10pct_fer_g192 --- lib_dec/igf_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index 0010b9466..aa3f35b26 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -244,7 +244,7 @@ static void IGF_replaceTCXNoise_2( Word32 *in, /**< in g = getSqrtWord32( L_mult( divide3232( totalNoiseNrg, rE ), 8192 /*1.0f / 4.0f Q15*/ ) ); // ((Q15 + Q15 + Q1) / 2) -> Q15 - g = shl( g, 1 ); // Q16 + g = shl_sat( g, 1 ); // Q16 FOR( sb = start; sb < stop; sb++ ) { -- GitLab From 66f93c33e18041835fe487df49e96c09f6bfda20 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 17:28:03 +0530 Subject: [PATCH 0468/1310] Clang formatting changes --- lib_dec/igf_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index aa3f35b26..511d8a977 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -244,7 +244,7 @@ static void IGF_replaceTCXNoise_2( Word32 *in, /**< in g = getSqrtWord32( L_mult( divide3232( totalNoiseNrg, rE ), 8192 /*1.0f / 4.0f Q15*/ ) ); // ((Q15 + Q15 + Q1) / 2) -> Q15 - g = shl_sat( g, 1 ); // Q16 + g = shl_sat( g, 1 ); // Q16 FOR( sb = start; sb < stop; sb++ ) { -- GitLab From 62465ef34e84a79f011e1cd7da55dea4e57fed0b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 17:37:40 +0530 Subject: [PATCH 0469/1310] Fix for 3GPP issue 1524: BASOP decoder asserts in ivas_dirac_dec_binaural_determine_processing_matrices_fx with OMASA BASOP encoder bitstream using rate switching Link #1524 --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 922a4ef12..412b8c226 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -2096,6 +2096,21 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( exp = sub( get_min_scalefactor( resultMtxRe_fx[0][0], resultMtxRe_fx[1][1] ), 2 ); tmp2 = L_add( L_shl( resultMtxRe_fx[0][0], exp ), L_shl( resultMtxRe_fx[1][1], exp ) ); q_tmp2 = add( q_res, exp ); + + /*Limiting value to Q63*/ + IF( GT_16( q_tmp2, 63 ) ) + { + tmp2 = L_shl( tmp2, sub( 63, q_tmp2 ) ); + q_tmp2 = 63; + move16(); + IF( EQ_32( tmp2, -1 ) ) + { + tmp2 = 0; + move32(); + q_tmp2 = 31; + move16(); + } + } IF( LT_16( q_CrEne, q_tmp2 ) ) { realizedOutputEne_fx = L_add( tmp1, L_shr( tmp2, sub( q_tmp2, q_CrEne ) ) ); -- GitLab From 6ee710fdf94a104a3bfc33db55f2225c6feaead6 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 28 Apr 2025 15:13:02 +0200 Subject: [PATCH 0470/1310] fix bug in CI config wrt binary naming in BE and regression checks --- .gitlab-ci.yml | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bebb7d024..95edafd47 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -326,10 +326,6 @@ workflow: - rm -rf tests/dut tests/ref variables: USE_LTV: 0 - DUT_ENCODER_PATH: ./IVAS_cod_ref - DUT_DECODER_PATH: ./IVAS_dec_ref - MERGE_TARGET_ENCODER_PATH: ./IVAS_cod_ref - MERGE_TARGET_DECODER_PATH: ./IVAS_dec_ref .check-be-to-target-job: extends: @@ -911,6 +907,9 @@ check-be-to-target-short-enc-0db: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # -/-0dB LEVEL_SCALING: "1.0" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-be-to-target-short-enc-+10db: extends: @@ -919,6 +918,9 @@ check-be-to-target-short-enc-+10db: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # +10dB LEVEL_SCALING: "3.162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-be-to-target-short-enc--10db: extends: @@ -927,6 +929,9 @@ check-be-to-target-short-enc--10db: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # -10dB LEVEL_SCALING: "0.3162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-be-to-target-short-dec-0db: extends: @@ -935,6 +940,9 @@ check-be-to-target-short-dec-0db: TEST_SUITE: "$SHORT_TEST_SUITE" # +/-0dB LEVEL_SCALING: "1.0" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" check-be-to-target-short-dec-+10db: extends: @@ -943,6 +951,9 @@ check-be-to-target-short-dec-+10db: TEST_SUITE: "$SHORT_TEST_SUITE" # +10dB LEVEL_SCALING: "3.162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-be-to-target-short-dec--10db: extends: @@ -951,6 +962,9 @@ check-be-to-target-short-dec--10db: TEST_SUITE: "$SHORT_TEST_SUITE" # -10dB LEVEL_SCALING: "0.3162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" ### jobs that check for regressions on non-BE testcases check-regressions-short-enc-0db: @@ -960,6 +974,9 @@ check-regressions-short-enc-0db: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # +/-0dB LEVEL_SCALING: "1.0" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-regressions-short-enc-+10db: extends: @@ -968,6 +985,9 @@ check-regressions-short-enc-+10db: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # +10dB LEVEL_SCALING: "3.162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-regressions-short-enc--10db: extends: @@ -976,6 +996,9 @@ check-regressions-short-enc--10db: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # -10dB LEVEL_SCALING: "0.3162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-regressions-short-dec-0db: extends: @@ -984,6 +1007,9 @@ check-regressions-short-dec-0db: TEST_SUITE: "$SHORT_TEST_SUITE" # +/-0dB LEVEL_SCALING: "1" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-regressions-short-dec-+10db: extends: @@ -992,6 +1018,9 @@ check-regressions-short-dec-+10db: TEST_SUITE: "$SHORT_TEST_SUITE" # +10dB LEVEL_SCALING: "3.162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" check-regressions-short-dec--10db: extends: @@ -1000,6 +1029,9 @@ check-regressions-short-dec--10db: TEST_SUITE: "$SHORT_TEST_SUITE" # -10dB LEVEL_SCALING: "0.3162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" # --------------------------------------------------------------- # Short test jobs for running from web interface or schedule -- GitLab From ba4e30212f18189f5e8698b86f75c7e73a1e7468 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 28 Apr 2025 15:22:14 +0200 Subject: [PATCH 0471/1310] fix binary name overwrite for decoder BE jobs --- .gitlab-ci.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 95edafd47..0e9e06a56 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -951,9 +951,9 @@ check-be-to-target-short-dec-+10db: TEST_SUITE: "$SHORT_TEST_SUITE" # +10dB LEVEL_SCALING: "3.162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" check-be-to-target-short-dec--10db: extends: @@ -962,9 +962,9 @@ check-be-to-target-short-dec--10db: TEST_SUITE: "$SHORT_TEST_SUITE" # -10dB LEVEL_SCALING: "0.3162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" ### jobs that check for regressions on non-BE testcases check-regressions-short-enc-0db: @@ -1007,9 +1007,9 @@ check-regressions-short-dec-0db: TEST_SUITE: "$SHORT_TEST_SUITE" # +/-0dB LEVEL_SCALING: "1" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" check-regressions-short-dec-+10db: extends: @@ -1018,9 +1018,9 @@ check-regressions-short-dec-+10db: TEST_SUITE: "$SHORT_TEST_SUITE" # +10dB LEVEL_SCALING: "3.162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" check-regressions-short-dec--10db: extends: @@ -1029,9 +1029,9 @@ check-regressions-short-dec--10db: TEST_SUITE: "$SHORT_TEST_SUITE" # -10dB LEVEL_SCALING: "0.3162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" # --------------------------------------------------------------- # Short test jobs for running from web interface or schedule -- GitLab From 2ebe23b3ec8be37c4e9e3a9bb061dad62de88bb9 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 28 Apr 2025 15:38:58 +0200 Subject: [PATCH 0472/1310] fix job dependencies for regression check jobs --- .gitlab-ci.yml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0e9e06a56..364e522aa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -444,9 +444,6 @@ workflow: extends: - .check-be-job stage: test - needs: - - job: "check-be-to-target-short-enc-0db" - artifacts: true timeout: "300 minutes" variables: XML_REPORT_BRANCH: "report-junit-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" @@ -970,6 +967,9 @@ check-be-to-target-short-dec--10db: check-regressions-short-enc-0db: extends: - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-enc-0db" + artifacts: true variables: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # +/-0dB @@ -981,6 +981,9 @@ check-regressions-short-enc-0db: check-regressions-short-enc-+10db: extends: - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-enc-+10db" + artifacts: true variables: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # +10dB @@ -992,6 +995,9 @@ check-regressions-short-enc-+10db: check-regressions-short-enc--10db: extends: - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-enc--10db" + artifacts: true variables: TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" # -10dB @@ -1003,6 +1009,9 @@ check-regressions-short-enc--10db: check-regressions-short-dec-0db: extends: - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-dec-0db" + artifacts: true variables: TEST_SUITE: "$SHORT_TEST_SUITE" # +/-0dB @@ -1014,6 +1023,9 @@ check-regressions-short-dec-0db: check-regressions-short-dec-+10db: extends: - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-dec-+10db" + artifacts: true variables: TEST_SUITE: "$SHORT_TEST_SUITE" # +10dB @@ -1025,6 +1037,9 @@ check-regressions-short-dec-+10db: check-regressions-short-dec--10db: extends: - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-dec--10db" + artifacts: true variables: TEST_SUITE: "$SHORT_TEST_SUITE" # -10dB -- GitLab From f17a648cd92bad1c20c46971eb9fd9b98097f182 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 17:37:40 +0530 Subject: [PATCH 0473/1310] Fix for 3GPP issue 1524: BASOP decoder asserts in ivas_dirac_dec_binaural_determine_processing_matrices_fx with OMASA BASOP encoder bitstream using rate switching Link #1524 --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 922a4ef12..412b8c226 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -2096,6 +2096,21 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( exp = sub( get_min_scalefactor( resultMtxRe_fx[0][0], resultMtxRe_fx[1][1] ), 2 ); tmp2 = L_add( L_shl( resultMtxRe_fx[0][0], exp ), L_shl( resultMtxRe_fx[1][1], exp ) ); q_tmp2 = add( q_res, exp ); + + /*Limiting value to Q63*/ + IF( GT_16( q_tmp2, 63 ) ) + { + tmp2 = L_shl( tmp2, sub( 63, q_tmp2 ) ); + q_tmp2 = 63; + move16(); + IF( EQ_32( tmp2, -1 ) ) + { + tmp2 = 0; + move32(); + q_tmp2 = 31; + move16(); + } + } IF( LT_16( q_CrEne, q_tmp2 ) ) { realizedOutputEne_fx = L_add( tmp1, L_shr( tmp2, sub( q_tmp2, q_CrEne ) ) ); -- GitLab From f612e8ac248e91898b76604b7e77fef0e9f900af Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 17:23:12 +0530 Subject: [PATCH 0474/1310] Complexity measure crash fix for ltv48_STEREO_StereoDmxEvs_b07_16_dtx_wb_rs_fer_ep_10pct_fer_g192 --- lib_dec/igf_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index 0010b9466..aa3f35b26 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -244,7 +244,7 @@ static void IGF_replaceTCXNoise_2( Word32 *in, /**< in g = getSqrtWord32( L_mult( divide3232( totalNoiseNrg, rE ), 8192 /*1.0f / 4.0f Q15*/ ) ); // ((Q15 + Q15 + Q1) / 2) -> Q15 - g = shl( g, 1 ); // Q16 + g = shl_sat( g, 1 ); // Q16 FOR( sb = start; sb < stop; sb++ ) { -- GitLab From 9da25323dad175bfcd4f8324dfb806f16ec9cc02 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 17:28:03 +0530 Subject: [PATCH 0475/1310] Clang formatting changes --- lib_dec/igf_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/igf_dec_fx.c b/lib_dec/igf_dec_fx.c index aa3f35b26..511d8a977 100644 --- a/lib_dec/igf_dec_fx.c +++ b/lib_dec/igf_dec_fx.c @@ -244,7 +244,7 @@ static void IGF_replaceTCXNoise_2( Word32 *in, /**< in g = getSqrtWord32( L_mult( divide3232( totalNoiseNrg, rE ), 8192 /*1.0f / 4.0f Q15*/ ) ); // ((Q15 + Q15 + Q1) / 2) -> Q15 - g = shl_sat( g, 1 ); // Q16 + g = shl_sat( g, 1 ); // Q16 FOR( sb = start; sb < stop; sb++ ) { -- GitLab From 6bc3038a7056b9761f6a9c11ac0b1a0c6b167c43 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 19:24:51 +0530 Subject: [PATCH 0476/1310] Q related fixed for encoder transition and decoder msan fixes --- lib_dec/ivas_mct_dec_fx.c | 2 +- lib_dec/ivas_stereo_dft_dec_dmx_fx.c | 2 ++ lib_enc/acelp_enc_util_fx.c | 12 ++++++------ lib_enc/enc_tran_fx.c | 3 ++- lib_enc/ivas_core_pre_proc_fx.c | 7 ++----- lib_enc/transition_enc_fx.c | 16 ++-------------- 6 files changed, 15 insertions(+), 27 deletions(-) diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 32403b11a..b34ce0c56 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -398,7 +398,7 @@ ivas_error ivas_mct_dec_fx( test(); IF( ( st_ivas->sba_dirac_stereo_flag != 0 ) && ( NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) || GE_16( cpe_id, sub( nCPE, 2 ) ) ) ) { - Copy_Scale_sig_16_32_no_sat( synth_fx[n], synth_fx_32[n], L_FRAME48k, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11 + Copy_Scale_sig_16_32_no_sat( synth_fx[n], synth_fx_32[n], output_frame, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->old_out_fx32, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) ); ivas_post_proc_fx( NULL, hCPE, n, synth_fx_32[n], NULL, output_frame, 1, Q11 ); Copy_Scale_sig_32_16( synth_fx_32[n], synth_fx[n], output_frame, sub( sub( 15, e_sig[n] ), Q11 ) ); // Q0 diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index e82005965..8035af217 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -102,6 +102,8 @@ void stereo_dft_unify_dmx_fx( Word16 num_plocs; Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; + set32_fx( DFT_PRED_RES, 0, STEREO_DFT32MS_N_32k ); + output_frame = extract_l( Mult_32_16( st0->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ samp_ratio = BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); diff --git a/lib_enc/acelp_enc_util_fx.c b/lib_enc/acelp_enc_util_fx.c index 181583e91..7f57b55da 100644 --- a/lib_enc/acelp_enc_util_fx.c +++ b/lib_enc/acelp_enc_util_fx.c @@ -180,9 +180,9 @@ void E_ACELP_conv( } void E_ACELP_conv_ivas_fx( - const Word16 xn2[], /* i Qx*/ + const Word16 xn2[], /* i Qnew - 1*/ const Word16 h2[], /* i Q12*/ - Word16 cn2[] /* o Q0*/ + Word16 cn2[] /* o Qnew*/ ) { Word16 i, k; @@ -194,14 +194,14 @@ void E_ACELP_conv_ivas_fx( { /*cn2[k] = xn2[k]; */ Word64 L_tmp_64; - L_tmp_64 = W_deposit32_l( L_mult0( xn2[k], 0x800 ) ); /* 4Q11 */ + L_tmp_64 = W_deposit32_l( L_mult0( xn2[k], 0x800 ) ); /* Qnew -1 + 12 */ FOR( i = 0; i < k; i++ ) { /*cn2[k]-=cn2[i]*h2[k-i];*/ - L_tmp_64 = W_msu0_16_16( L_tmp_64, cn2[i], h2[k - i] ); /*h2 4Q11*/ + L_tmp_64 = W_msu0_16_16( L_tmp_64, cn2[i], h2[k - i] ); /*Qnew + 11*/ } - L_tmp = W_sat_l( L_tmp_64 ); /* 4Q11 */ - cn2[k] = round_fx_o( L_shl_o( L_tmp, 5, &Overflow ), &Overflow ); /* Q0*/ + L_tmp = W_sat_l( L_tmp_64 ); /* Qnew + 11 */ + cn2[k] = round_fx_o( L_shl_o( L_tmp, 5, &Overflow ), &Overflow ); /* Qnew*/ move16(); } } diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 394b22c30..f308e9e87 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -545,7 +545,7 @@ Word16 encod_tran_ivas_fx( Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ - find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, + find_targets_ivas_new_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); @@ -555,6 +555,7 @@ Word16 encod_tran_ivas_fx( #else Scale_sig( h1, L_SUBFR, sub( 13, q_h1 ) ); #endif + /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn, L_SUBFR, shift ); diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 6fe6b6720..5853e2739 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -1174,11 +1174,8 @@ ivas_error ivas_compute_core_buffers_fx( ELSE IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) ) { Copy( &old_inp_16k_fx[L_frame_tmp], st->old_inp_16k_fx, L_INP_MEM ); - IF( Q_new ) - { - st->exp_old_inp_16k = sub( Q16, *Q_new ); //(*Q_new - 1) - move16(); - } + st->exp_old_inp_16k = sub(Q16, *Q_new); //(*Q_new - 1) + move16(); } ELSE IF( GT_32( input_Fs, 8000 ) ) { diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 5e50cac15..c724ffd6c 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -924,8 +924,6 @@ void transition_enc_ivas_fx( /* set limit_flag to 0 for restrained limits, and 1 for extended limits */ limit_flag = 0; move16(); - Word16 h1_fx_q15[L_SUBFR + ( M + 1 )]; - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 0 ); pit_start = PIT_MIN; move16(); @@ -1443,12 +1441,7 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, ( Q_new + shift - 1 ) ); move16(); -#ifdef TEST_HR - Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ) ); -#else - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); -#endif - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, + lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx, xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) @@ -1684,12 +1677,7 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, Q_new ); move16(); -#ifdef TEST_HR - Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ) ); -#else - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); -#endif - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, + lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx, xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { -- GitLab From c5d45b9cdad87c45d937da2462ce0defad4d3d73 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 29 Apr 2025 08:11:58 +0530 Subject: [PATCH 0477/1310] Clang formatting changes --- lib_dec/ivas_stereo_dft_dec_dmx_fx.c | 2 +- lib_enc/enc_tran_fx.c | 2 +- lib_enc/ivas_core_pre_proc_fx.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index 8035af217..cdb64e46c 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -103,7 +103,7 @@ void stereo_dft_unify_dmx_fx( Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; set32_fx( DFT_PRED_RES, 0, STEREO_DFT32MS_N_32k ); - + output_frame = extract_l( Mult_32_16( st0->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ samp_ratio = BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index f308e9e87..865972819 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -546,7 +546,7 @@ Word16 encod_tran_ivas_fx( Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ find_targets_ivas_new_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, - res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); + res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); Copy_Scale_sig( h1, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 5853e2739..e2c099cd2 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -1174,7 +1174,7 @@ ivas_error ivas_compute_core_buffers_fx( ELSE IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) ) { Copy( &old_inp_16k_fx[L_frame_tmp], st->old_inp_16k_fx, L_INP_MEM ); - st->exp_old_inp_16k = sub(Q16, *Q_new); //(*Q_new - 1) + st->exp_old_inp_16k = sub( Q16, *Q_new ); //(*Q_new - 1) move16(); } ELSE IF( GT_32( input_Fs, 8000 ) ) -- GitLab From 34c9080325f97b34ea73c8d98f1cfafc30a26ba2 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Apr 2025 08:01:15 +0200 Subject: [PATCH 0478/1310] add missing reference to common before_script section --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 364e522aa..71a5704aa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1596,6 +1596,7 @@ voip-be-on-merge-request: GET_WMOPS_ARGS: "mem_only" timeout: 3 hours 30 minutes before_script: + - !reference [ .job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh -- GitLab From 1a9dfb950313aeaa5626608e2d32d53458ab7c7c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Apr 2025 08:22:37 +0200 Subject: [PATCH 0479/1310] update CI ref --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 364e522aa..59c8d2b72 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 4eb4c0dfbdc845280a9994b5f7540f69c737537b + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 7c6b6f261883e282ebe050e18d48c00ce623b8be include: - local: .gitlab-ci/variables.yml -- GitLab From 997852da13bcfddae4a4e4fb863cf455e03c4421 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Apr 2025 08:50:20 +0200 Subject: [PATCH 0480/1310] update commit to point to CI repo main --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 59c8d2b72..4b7d05c7b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 7c6b6f261883e282ebe050e18d48c00ce623b8be + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF f5e61349c22ededcdfe1cc54e533dea477f2d003 include: - local: .gitlab-ci/variables.yml -- GitLab From ee28fb4d85ca4d1adfb0c01eb774bc8b9fda35f5 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Apr 2025 08:01:15 +0200 Subject: [PATCH 0481/1310] add missing reference to common before_script section --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4b7d05c7b..1f5a98321 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1596,6 +1596,7 @@ voip-be-on-merge-request: GET_WMOPS_ARGS: "mem_only" timeout: 3 hours 30 minutes before_script: + - !reference [ .job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh -- GitLab From 8f5cd954654c320df786feb4638dc89aba703792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Tue, 29 Apr 2025 01:21:37 +0200 Subject: [PATCH 0482/1310] Inherit before_script from .test-job-linux --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1f5a98321..bb2259810 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1596,7 +1596,7 @@ voip-be-on-merge-request: GET_WMOPS_ARGS: "mem_only" timeout: 3 hours 30 minutes before_script: - - !reference [ .job-linux, before_script ] + - !reference [ .test-job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh -- GitLab From 8ebc89d0a003b2287ebbb33aa941d8e8e6e5cfeb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 29 Apr 2025 14:54:13 +0530 Subject: [PATCH 0483/1310] Fix for 3GPP issue 1525: Second channel of BASOP decoder MASA format output to FOA has missing energy or wrong signal Link #1525 --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 509eec6e2..37b5f1e05 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -2134,9 +2134,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); } - subtract_power_y = masa_stereo_type_detect->subtract_power_y_fx; // q_subtract_power_y - move32(); - a = 858993; /* ( 0.0004f in Q31 ); Temporal smoothing coefficient */ move32(); b = L_sub( ONE_IN_Q31, a ); /* Temporal smoothing coefficient */ @@ -2152,24 +2149,42 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); masa_stereo_type_detect->q_target_power_y_smooth = q_com; move16(); - masa_stereo_type_detect->subtract_power_y_smooth_fx = - L_add( Mpy_32_32( a, subtract_power_y ), - Mpy_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); //(Q31, q_subtract_power_y) -> q_subtract_power_y + + IF( NE_16( masa_stereo_type_detect->q_subtract_power_y, masa_stereo_type_detect->q_subtract_power_y_smooth ) ) + { + exp = s_min( add( masa_stereo_type_detect->q_subtract_power_y, norm_l( masa_stereo_type_detect->subtract_power_y_fx ) ), add( masa_stereo_type_detect->q_subtract_power_y_smooth, norm_l( masa_stereo_type_detect->subtract_power_y_smooth_fx ) ) ); + masa_stereo_type_detect->subtract_power_y_fx = L_shl( masa_stereo_type_detect->subtract_power_y_fx, sub( exp, masa_stereo_type_detect->q_subtract_power_y ) ); + move32(); + masa_stereo_type_detect->subtract_power_y_smooth_fx = L_shl( masa_stereo_type_detect->subtract_power_y_smooth_fx, sub( exp, masa_stereo_type_detect->q_subtract_power_y_smooth ) ); + move32(); + masa_stereo_type_detect->q_subtract_power_y = exp; + move16(); + masa_stereo_type_detect->q_subtract_power_y_smooth = exp; + move16(); + } + subtract_power_y = masa_stereo_type_detect->subtract_power_y_fx; // q_subtract_power_y move32(); + W_temp = W_add( W_mult0_32_32( a, subtract_power_y ), W_mult0_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + exp = W_norm( W_temp ); + masa_stereo_type_detect->subtract_power_y_smooth_fx = W_extract_h( W_shl( W_temp, exp ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + exp - 32 + move32(); + masa_stereo_type_detect->q_subtract_power_y_smooth = sub( add( masa_stereo_type_detect->q_subtract_power_y_smooth, exp ), 1 ); + move16(); + exp = 0; move16(); IF( masa_stereo_type_detect->target_power_y_smooth_fx != 0 ) { subtract_target_ratio = L_sub( BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ), BASOP_Util_Log2( masa_stereo_type_detect->target_power_y_smooth_fx ) ); // Q25 - exp = sub( masa_stereo_type_detect->q_subtract_power_y, q_com ); + exp = sub( masa_stereo_type_detect->q_subtract_power_y_smooth, q_com ); L_tmp = Mpy_32_32( L_sub( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ); // Q25 } ELSE { subtract_target_ratio = BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ); // Q25 - exp = sub( 31, masa_stereo_type_detect->q_subtract_power_y ); + exp = sub( 31, masa_stereo_type_detect->q_subtract_power_y_smooth ); L_tmp = L_sub( Mpy_32_32( L_add( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ), -503316480 /* L_shl( -15, 25 ) */ /*log(EPSILON)*/ ); // Q25 } subtract_target_ratio_db = Mpy_32_32( 1342177280 /* 10.0f * in Q27*/, L_tmp ); // (Q27, (Q25, Q31)) -> (Q27, Q25) -> Q21 @@ -2178,6 +2193,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); masa_stereo_type_detect->subtract_power_y_fx = 0; move32(); + masa_stereo_type_detect->q_subtract_power_y = Q31; + move16(); } /*-----------------------------------------------------------------* -- GitLab From 6b052e9535277432f63a9daf3cc2c7bc88a184e2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 29 Apr 2025 13:33:19 +0530 Subject: [PATCH 0484/1310] Fix for 3GPP issue 1417: Audible artifact at SBA 13.2 kbps, 48KHz Link #1417 --- lib_enc/sig_clas_fx.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/lib_enc/sig_clas_fx.c b/lib_enc/sig_clas_fx.c index cf5d31d22..ed34798fc 100644 --- a/lib_enc/sig_clas_fx.c +++ b/lib_enc/sig_clas_fx.c @@ -53,9 +53,10 @@ Word16 signal_clas_fx( /* o : classification for current { Word32 Ltmp; Word16 mean_voi2, een, corn, zcn, relEn, pcn, fmerit1; - Word16 i, clas, pc, zc, lo, lo2, hi, hi2, exp_ee, frac_ee; + Word16 i, clas, pc, zc, exp_ee; Word16 tmp16, tmpS; const Word16 *pt1; + Word64 tmp64; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); @@ -73,34 +74,34 @@ Word16 signal_clas_fx( /* o : classification for current mean_voi2 = mac_r( Ltmp, st->voicing_fx[2], 16384 ); /* average spectral tilt in dB */ - lo = L_Extract_lc( ee[0], &hi ); - lo2 = L_Extract_lc( ee[1], &hi2 ); - Ltmp = L_mult( lo, lo2 ); /* Q5*Q5->Q11 */ - - test(); - test(); - IF( LT_32( Ltmp, 2048 ) ) + tmp64 = W_mult0_32_32( ee[0], ee[1] ); + exp_ee = W_norm( tmp64 ); + Ltmp = W_extract_h( W_shl( tmp64, exp_ee ) ); // Q = Q6+Q6 + exp_ee - 32 + exp_ee = sub( 31, sub( add( Q12, exp_ee ), 32 ) ); + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( Ltmp, exp_ee, ONE_IN_Q31, 0 ), -1 ) ) { een = 0; move16(); } - ELSE IF( GT_32( Ltmp, THRES_EEN ) || hi > 0 || hi2 > 0 ) - { - een = 512; - move16(); - } ELSE { /* mean_ee2 = 0.5f * 20.0f * (float)log10( tmp ); */ /* een = K_EE_ENC * mean_ee2 + C_EE_ENC; */ - exp_ee = norm_l( Ltmp ); - frac_ee = Log2_norm_lc( L_shl( Ltmp, exp_ee ) ); - exp_ee = sub( 30 - 11, exp_ee ); - Ltmp = Mpy_32_16( exp_ee, frac_ee, LG10 ); /* Ltmp Q14 */ - een = round_fx( L_shl( Ltmp, 16 - 5 ) ); /* Q14 -> Q9 */ - een = mac_r( C_EE_FX, een, K_EE_FX ); - } + Ltmp = BASOP_Util_Log10( Ltmp, exp_ee ); // Q25 + Ltmp = Mpy_32_32( Ltmp, 671088640 /*20.f in Q25*/ ); // Q25 + Q25 -Q31 = Q19 * 0.5 = Q20 + een = extract_l( L_shl( Mpy_32_16_1( Ltmp, K_EE_FX ), Q9 - Q20 ) ); // Q9 + IF( GT_16( een, 512 ) ) + { + een = 512; + move16(); + } + ELSE IF( een < 0 ) + { + een = 0; + move16(); + } + } /* compute zero crossing rate */ pt1 = speech + sub( L_look, 1 ); tmpS = shr( *pt1, 15 ); /* sets 'tmpS to -1 if *pt1 < 0 */ -- GitLab From 9891182d9469eaa7433f31e765122c1663cdc7ca Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 29 Apr 2025 14:36:41 +0530 Subject: [PATCH 0485/1310] Fix for EVS Bitexactness issue --- lib_enc/ivas_core_pre_proc_front_fx.c | 2 +- lib_enc/prot_fx_enc.h | 9 + lib_enc/sig_clas_fx.c | 231 ++++++++++++++++++++++++++ 3 files changed, 241 insertions(+), 1 deletion(-) diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 3d7d87bc2..4a8c4edd2 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1425,7 +1425,7 @@ ivas_error pre_proc_front_ivas_fx( * TC frame selection *-----------------------------------------------------------------*/ - st->clas = signal_clas_fx( st, inp_12k8_fx, ee_fx, *relE_fx, L_look, tdm_SM_last_clas ); /* Q0 */ + st->clas = signal_clas_ivas_fx( st, inp_12k8_fx, ee_fx, *relE_fx, L_look, tdm_SM_last_clas ); /* Q0 */ move16(); select_TC_fx( MODE1, st->tc_cnt, &st->coder_type, st->localVAD ); diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 4237aa9c3..2aa5df5c4 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -570,6 +570,15 @@ Word16 signal_clas_fx( /* o : classification for current Word16 *uc_clas /* o : temporary classification used in music/speech class*/ ); +Word16 signal_clas_ivas_fx( /* o : classification for current frames */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *speech, /* i : pointer to speech signal for E computation */ + const Word32 *ee, /* i : lf/hf E ration for 2 half-frames */ + const Word16 relE, /* i : frame relative E to the long term average */ + const Word16 L_look, /* i : look-ahead */ + Word16 *uc_clas /* o : temporary classification used in music/speech class*/ +); + void speech_music_classif_fx( Encoder_State *st, /* i/o: state structure */ const Word16 *new_inp, /* i : new input signal */ diff --git a/lib_enc/sig_clas_fx.c b/lib_enc/sig_clas_fx.c index ed34798fc..beb97514a 100644 --- a/lib_enc/sig_clas_fx.c +++ b/lib_enc/sig_clas_fx.c @@ -50,6 +50,236 @@ Word16 signal_clas_fx( /* o : classification for current const Word16 L_look, /* i : look-ahead */ Word16 *clas_mod /* o : class flag for NOOP detection */ ) +{ + Word32 Ltmp; + Word16 mean_voi2, een, corn, zcn, relEn, pcn, fmerit1; + Word16 i, clas, pc, zc, lo, lo2, hi, hi2, exp_ee, frac_ee; + Word16 tmp16, tmpS; + const Word16 *pt1; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + /*----------------------------------------------------------------* + * Calculate average voicing + * Calculate average spectral tilt + * Calculate zero-crossing rate + * Calculate pitch stability + *----------------------------------------------------------------*/ + + /* average voicing on second half-frame and look-ahead */ + Ltmp = L_mult( st->voicing_fx[1], 16384 ); /* Q15*Q14->Q30 */ + mean_voi2 = mac_r( Ltmp, st->voicing_fx[2], 16384 ); + + /* average spectral tilt in dB */ + lo = L_Extract_lc( ee[0], &hi ); + lo2 = L_Extract_lc( ee[1], &hi2 ); + Ltmp = L_mult( lo, lo2 ); /* Q5*Q5->Q11 */ + + test(); + test(); + IF( LT_32( Ltmp, 2048 ) ) + { + een = 0; + move16(); + } + ELSE IF( GT_32( Ltmp, THRES_EEN ) || hi > 0 || hi2 > 0 ) + { + een = 512; + move16(); + } + ELSE + { + /* mean_ee2 = 0.5f * 20.0f * (float)log10( tmp ); */ + /* een = K_EE_ENC * mean_ee2 + C_EE_ENC; */ + exp_ee = norm_l( Ltmp ); + frac_ee = Log2_norm_lc( L_shl( Ltmp, exp_ee ) ); + exp_ee = sub( 30 - 11, exp_ee ); + Ltmp = Mpy_32_16( exp_ee, frac_ee, LG10 ); /* Ltmp Q14 */ + een = round_fx( L_shl( Ltmp, 16 - 5 ) ); /* Q14 -> Q9 */ + een = mac_r( C_EE_FX, een, K_EE_FX ); + } + /* compute zero crossing rate */ + pt1 = speech + sub( L_look, 1 ); + tmpS = shr( *pt1, 15 ); /* sets 'tmpS to -1 if *pt1 < 0 */ + Ltmp = L_deposit_l( 0 ); + FOR( i = 0; i < L_FRAME; i++ ) + { + tmp16 = add( 1, tmpS ); + pt1++; + tmpS = shr( *pt1, 15 ); /* pt1 >=0 ---> 0 OTHERWISE -1 */ + Ltmp = L_msu0( Ltmp, tmpS, tmp16 ); + } + zc = extract_l( Ltmp ); + + /* compute pitch stability */ + pc = add( abs_s( sub( st->pitch[1], st->pitch[0] ) ), abs_s( sub( st->pitch[2], st->pitch[1] ) ) ); + st->tdm_pc = pc; + move16(); + /*-----------------------------------------------------------------* + * Transform parameters to the range <0:1> + * Compute the merit function + *-----------------------------------------------------------------*/ + + /* corn = K_COR * mean_voi2 + C_COR */ + Ltmp = L_mult( C_COR_FX, 32767 ); + corn = round_fx( L_shl( L_mac( Ltmp, mean_voi2, K_COR_FX ), -4 ) ); /*Q13+Q13*Q15 =>Q13->Q9*/ + /* Limit [0, 1] */ + corn = s_max( corn, 0 ); + corn = s_min( corn, 512 ); + + Ltmp = L_mult( C_ZC_FX, 4 ); /*Q13*Q2 -> Q16*/ + zcn = round_fx( L_shl( L_mac( Ltmp, zc, K_ZC_FX ), 16 - 7 ) ); /*Q0*Q15 + Q16*/ + /* Limit [0, 1] */ + zcn = s_max( zcn, 0 ); + zcn = s_min( zcn, 512 ); + + Ltmp = L_mult( C_RELE_FX, 256 ); /*Q15*Q8 ->Q24*/ + relEn = round_fx( L_shl( L_mac( Ltmp, relE, K_RELE_FX ), 1 ) ); /*relE in Q8 but relEn in Q9*/ + /* Limit [0.5, 1] */ + relEn = s_max( relEn, 256 ); + relEn = s_min( relEn, 512 ); + + Ltmp = L_mult( C_PC_FX, 2 ); /*Q14*Q1 -> Q16*/ + pcn = round_fx( L_shl( L_mac( Ltmp, pc, K_PC_FX ), 16 - 7 ) ); /*Q16 + Q0*Q15*/ + /* Limit [0, 1] */ + pcn = s_max( pcn, 0 ); + pcn = s_min( pcn, 512 ); + + Ltmp = L_mult( een, 10923 ); + Ltmp = L_mac( Ltmp, corn, 21845 ); + Ltmp = L_mac( Ltmp, zcn, 10923 ); + Ltmp = L_mac( Ltmp, relEn, 10923 ); + Ltmp = L_mac( Ltmp, pcn, 10923 ); + + fmerit1 = round_fx_o( L_shl_o( Ltmp, 16 - 10 - 1, &Overflow ), &Overflow ); /* fmerit1 ->Q15 */ + + /*-----------------------------------------------------------------* + * FEC classification + *-----------------------------------------------------------------*/ + + st->fmerit_dt = sub( st->prev_fmerit, fmerit1 ); /*Q15*/ + move16(); + st->prev_fmerit = fmerit1; + move16(); + + /* FEC classification */ + test(); + test(); + IF( st->localVAD == 0 || EQ_16( st->coder_type, UNVOICED ) || LT_16( relE, -1536 ) ) + { + clas = UNVOICED_CLAS; + *clas_mod = clas; + move16(); + move16(); + } + ELSE + { + SWITCH( st->last_clas ) + { + case VOICED_CLAS: + case ONSET: + case VOICED_TRANSITION: + + IF( LT_16( fmerit1, 16056 ) ) /*0.49f*/ + { + clas = UNVOICED_CLAS; + move16(); + } + ELSE IF( LT_16( fmerit1, 21626 ) ) /*0.66*/ + { + clas = VOICED_TRANSITION; + move16(); + } + ELSE + { + clas = VOICED_CLAS; + move16(); + } + IF( LT_16( fmerit1, 14745 /* 0.45f*/ ) ) + { + *clas_mod = UNVOICED_CLAS; + move16(); + } + ELSE IF( LT_16( fmerit1, 21626 /* 0.66f*/ ) ) + { + *clas_mod = VOICED_TRANSITION; + move16(); + } + ELSE + { + *clas_mod = VOICED_CLAS; + move16(); + } + BREAK; + + case UNVOICED_CLAS: + case UNVOICED_TRANSITION: + IF( GT_16( fmerit1, 20643 ) ) /*0.63*/ + { + clas = ONSET; + move16(); + } + ELSE IF( GT_16( fmerit1, 19169 ) ) /*0.585*/ + { + clas = UNVOICED_TRANSITION; + move16(); + } + ELSE + { + clas = UNVOICED_CLAS; + move16(); + } + *clas_mod = clas; + move16(); + + BREAK; + + default: + clas = UNVOICED_CLAS; + *clas_mod = clas; + move16(); + move16(); + BREAK; + } + } + /* Onset classification */ + + /* tc_cnt == -1: frame after TC frame in continuous block of GC/VC frames */ + /* tc_cnt == 0: UC frame */ + /* tc_cnt == 1: onset/transition frame, coded by GC coder type */ + /* tc_cnt == 2: frame after onset/transition frame, coded by TC coder type */ + + if ( clas == 0 ) + { + st->tc_cnt = 0; + move16(); + } + + test(); + IF( GE_16( clas, VOICED_TRANSITION ) && st->tc_cnt >= 0 ) + { + st->tc_cnt = add( st->tc_cnt, 1 ); + move16(); + } + + if ( GT_16( st->tc_cnt, 2 ) ) + { + st->tc_cnt = -1; + move16(); + } + return clas; +} + +Word16 signal_clas_ivas_fx( /* o : classification for current frames */ + Encoder_State *st, /* i/o: encoder state structure */ + const Word16 *speech, /* i : pointer to speech signal for E computation in Qx */ + const Word32 *ee, /* i : lf/hf E ration for 2 half-frames in Q6 */ + const Word16 relE, /* i : frame relative E to the long term average in Q8 */ + const Word16 L_look, /* i : look-ahead */ + Word16 *clas_mod /* o : class flag for NOOP detection */ +) { Word32 Ltmp; Word16 mean_voi2, een, corn, zcn, relEn, pcn, fmerit1; @@ -273,6 +503,7 @@ Word16 signal_clas_fx( /* o : classification for current } return clas; } + /*-------------------------------------------------------------------* * select_TC_fx() * -- GitLab From fdd58b16039c3a097cbbc044684fcd88f2986254 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 29 Apr 2025 16:35:26 +0530 Subject: [PATCH 0486/1310] Fix for 3GPP issue 1461: Issue with VAD sensitivity in SBA DTX mode at 48 and 80 kbps Link #1461 --- lib_enc/vad_fx.c | 73 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 1fdcb94fa..531265236 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -213,6 +213,29 @@ void wb_vad_init_ivas_fx( * * accumulate snr_sum with significance thresholds *-----------------------------------------------------------------*/ +static void sign_thr_snr_acc_ivas_fx( + Word32 *L_snr_sum, /* o: q_snr_sum */ + Word16 *q_snr_sum, + Word32 L_snr, /* i: q_snr */ + Word16 q_snr, + Word32 sign_thr, /* i: q_snr */ + Word32 min_snr /* i: q_snr */ +) +{ + /*if( snr >= sign_thr ) */ + Word32 L_tmp; + Word16 exp_snr_sum = sub( 31, *q_snr_sum ); + L_tmp = min_snr; + move32(); + IF( GE_32( L_snr, sign_thr ) ) + { + L_tmp = L_add( L_snr, 0 ); /* q_snr */ + } + *L_snr_sum = BASOP_Util_Add_Mant32Exp( *L_snr_sum, exp_snr_sum, L_tmp, sub( 31, q_snr ), &exp_snr_sum ); /* q_snr */ + *q_snr_sum = sub( 31, exp_snr_sum ); + move32(); + move32(); +} static void sign_thr_snr_acc_fx( Word32 *L_snr_sum, /* o: Q4 */ Word32 L_snr, /* i: Q4 */ @@ -2186,6 +2209,10 @@ Word16 wb_vad_ivas_fx( L_snr_sum = L_deposit_l( 0 ); L_snr_sum_HE_SAD = L_deposit_l( 0 ); + Word16 q_snr_sum = 0; + Word16 q_snr_sum_HE_SAD = 0; + move16(); + move16(); snr_sumt = 0; move16(); L_mssnr_hov = L_deposit_l( 0 ); @@ -2199,7 +2226,7 @@ Word16 wb_vad_ivas_fx( q_snr = 0; move16(); move16(); - q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 15 - 4 ); + q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 14 - 4 ); FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) { ftmp = L_add( *pt1++, 0 ); @@ -2207,12 +2234,12 @@ Word16 wb_vad_ivas_fx( ftmp2 = L_add( *pt3++, 0 ); /*fr_enr = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 );*/ - L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 13107 ); /* L_tmp(high word) = Qenr0fx*Q16+1 -16 -> Qener0+1 */ - L_tmp1 = Madd_32_16( L_tmp, ftmp, 26214 ); /* 26214 = .4 in Q16 */ - L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 26214 ); /* L_tmp1 re_used a bit later for final snr[i]*/ + L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 6554 ); /* L_tmp(high word) = Qenr0fx*Q15+1 -16 -> Qener0 */ + L_tmp1 = Madd_32_16( L_tmp, ftmp, 13107 ); /* 13107 = .4 in Q15 */ + L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 13107 ); /* L_tmp1 re_used a bit later for final snr[i]*/ - L_tmp2 = Madd_32_16( L_tmp, ftmp, 19661 ); /* 19661 = 0.3 in Q16 */ - L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -32768 ); /* -32768= -0.5 in Q16 */ + L_tmp2 = Madd_32_16( L_tmp, ftmp, 9830 ); /* 9830 = 0.3 in Q15 */ + L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -16384 ); /* -16384= -0.5 in Q15 */ IF( GT_32( ftmp, ftmp1 ) ) { @@ -2221,12 +2248,12 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 + m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( ftmp2 ); m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 + m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 shift_snr = add( sub( e_num, e_noise ), q_shift ); snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise @@ -2234,7 +2261,7 @@ Word16 wb_vad_ivas_fx( } ELSE { - L_snr = L_shr_o( L_tmp1, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 + L_snr = L_shl_o( L_tmp1, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 } } ELSE @@ -2244,12 +2271,12 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp2 ); - m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+1+e_num-16 + m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( ftmp2 ); m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 + m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 shift_snr = add( sub( e_num, e_noise ), q_shift ); snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise @@ -2257,7 +2284,7 @@ Word16 wb_vad_ivas_fx( } ELSE { - L_snr = L_shr_o( L_tmp2, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 + L_snr = L_shl_o( L_tmp2, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 } } @@ -2350,25 +2377,31 @@ Word16 wb_vad_ivas_fx( IF( hNoiseEst->bckr_fx[i] != 0 ) { e_num = sub( norm_l( L_tmp1 ), 1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 + m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( hNoiseEst->bckr_fx[i] ); m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 L_snr_tmp = L_deposit_h( div_s( m_num, m_noise_local ) ); // 32+q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise - q_snr_tmp = add( 32, sub( add( q_fr_bands, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); + q_snr_tmp = add( 31, sub( add( q_fr_bands, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); } ELSE { - L_snr_tmp = Mpy_32_16_1( L_tmp1, 18286 /* 1/E_MIN in Q6 */ ); // q_fr_bands-8 - q_snr_tmp = sub( q_fr_bands, 8 ); + L_snr_tmp = Mpy_32_16_1( L_tmp1, 18286 /* 1/E_MIN in Q6 */ ); // q_fr_bands-9 + q_snr_tmp = sub( q_fr_bands, 9 ); } /* conditional snrsum, snr_sum = snr_sum + snr[i];*/ + IF( GT_16( q_snr_tmp, 28 ) ) // added to avoid overflow while scaling sign_thr_HE_SAD,min_snr_HE_SAD,sign_thr and min_snr while scaling to q_snr_tmp + { + L_snr_tmp = L_shl( L_snr_tmp, sub( 28, q_snr_tmp ) ); + q_snr_tmp = 28; + move16(); + } exp = sub( Q4, q_snr_tmp ); L_snr = L_shl_sat( L_snr_tmp, exp ); // Q4 - sign_thr_snr_acc_fx( &L_snr_sum_HE_SAD, L_snr, sign_thr_HE_SAD, min_snr_HE_SAD ); - sign_thr_snr_acc_fx( &L_snr_sum, L_snr, sign_thr, min_snr ); + sign_thr_snr_acc_ivas_fx( &L_snr_sum_HE_SAD, &q_snr_sum_HE_SAD, L_snr_tmp, q_snr_tmp, L_shl( sign_thr_HE_SAD, sub( q_snr_tmp, 4 ) ), L_shl( min_snr_HE_SAD, sub( q_snr_tmp, 4 ) ) ); + sign_thr_snr_acc_ivas_fx( &L_snr_sum, &q_snr_sum, L_snr_tmp, q_snr_tmp, L_shl( sign_thr, sub( q_snr_tmp, 4 ) ), L_shl( min_snr, sub( q_snr_tmp, 4 ) ) ); /* if( snr[i] < 1.0f ) { snr[i] = 1.0f;} */ IF( LT_32( L_snr, 16 /* 1.0 in Q4 */ ) ) @@ -2412,7 +2445,9 @@ Word16 wb_vad_ivas_fx( move16(); move16(); } - } /* end of band loop */ + } /* end of band loop */ + L_snr_sum = L_shl_o( L_snr_sum, sub( 4, q_snr_sum ), &Overflow ); // q_snr_sum->q4 + L_snr_sum_HE_SAD = L_shl_o( L_snr_sum_HE_SAD, sub( 4, q_snr_sum_HE_SAD ), &Overflow ); // q_snr_sum_HE_SAD->q4 L_snr_outlier = L_shl_sat( L_snr_outlier, sub( Q4, q_snr ) ); // q_snr -> Q4 snr_sumt = extract_h( L_shl( L_snr_sumt, Q4 ) ); // Q16 -> Q4 -- GitLab From 5785fc2be7ec1c0b9b3900ad02fe5e561311ba53 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 29 Apr 2025 13:20:37 +0200 Subject: [PATCH 0487/1310] made 1st parameter const - fix msvc warning fixed two more warnings 'uninitialized local variable' --- lib_com/swb_tbe_com_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5631dfa94..ae5fb0323 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6701,7 +6701,7 @@ void wb_tbe_extras_reset_synth_fx( void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - int16_t element_mode, + const int16_t element_mode, #endif #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, @@ -7360,8 +7360,8 @@ void synthesise_fb_high_band_fx( { #ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32; - Word16 tmp16; + Word32 L_tmp32 = L_add(0,0); + Word16 tmp16 = add( 0, 0 ); // if (L_tmp < 0) if ( L_tmp < 0 ) -- GitLab From 5f81a24eba14c191d0af5d8b02c27a713948c07e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 29 Apr 2025 15:16:40 +0200 Subject: [PATCH 0488/1310] fix formatting --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index ae5fb0323..a3a18e32c 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7360,7 +7360,7 @@ void synthesise_fb_high_band_fx( { #ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32 = L_add(0,0); + Word32 L_tmp32 = L_add( 0, 0 ); Word16 tmp16 = add( 0, 0 ); // if (L_tmp < 0) -- GitLab From 20e7299b27635e3b3f7a8e55f2274a5f2f672450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Tue, 29 Apr 2025 16:44:20 +0200 Subject: [PATCH 0489/1310] Restore old base rules from BASOP branch Should re-introduce the expected behavior for BASOP builds. --- .gitlab-ci.yml | 1 + .gitlab-ci/rules-basis.yml | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 .gitlab-ci/rules-basis.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bb2259810..e03f48d00 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ variables: include: - local: .gitlab-ci/variables.yml + - local: .gitlab-ci/rules-basis.yml - project: ivas-codec-pc/ivas-codec-ci ref: *IVAS_CODEC_CI_REF file: main.yml diff --git a/.gitlab-ci/rules-basis.yml b/.gitlab-ci/rules-basis.yml new file mode 100644 index 000000000..c650f574a --- /dev/null +++ b/.gitlab-ci/rules-basis.yml @@ -0,0 +1,53 @@ +# overwrites the default rules in the IVAS CI repository +# should be refactored and unified +.rules-basis: + rules: + # see https://docs.gitlab.com/ee/ci/yaml/workflow.html#switch-between-branch-pipelines-and-merge-request-pipelines + - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push" + when: never + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + variables: + IVAS_PIPELINE_NAME: 'MR pipeline: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME' + ### disabled for now because pipeline cd is redundant with MR pipeline with current workflow + # - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main + # variables: + # IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing + variables: + IVAS_PIPELINE_NAME: 'Web run pipeline: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare' + variables: + IVAS_PIPELINE_NAME: 'Run comparison tools against float ref: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-enc-dmx' + variables: + IVAS_PIPELINE_NAME: 'Run encoder dmx comparison against float ref: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long' + variables: + IVAS_PIPELINE_NAME: 'Run comparison tools against float ref (long test vectors): $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-to-input' + variables: + IVAS_PIPELINE_NAME: 'Run comparison tools against input (pass-through only): $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-saturation-smoke-test' + variables: + IVAS_PIPELINE_NAME: 'Run saturation smoke-test: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'evs-26444' + variables: + IVAS_PIPELINE_NAME: 'EVS 26.444 test: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'sanitizer' + variables: + IVAS_PIPELINE_NAME: 'Short testvectors sanitizers' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-renderer' + variables: + IVAS_PIPELINE_NAME: 'Renderer test: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'complexity' + variables: + IVAS_PIPELINE_NAME: 'Complexity Measurement on $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'voip-be-test' + variables: + IVAS_PIPELINE_NAME: 'Voip BE test on $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' + variables: + IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch + variables: + IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' -- GitLab From e6c34b93f38f223762245d4b2b25dadb766cfcaa Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Tue, 29 Apr 2025 17:15:38 +0200 Subject: [PATCH 0490/1310] Port Issue 947 : NONBE_FIX_947_STEREO_DMX_EVS_POC and NONBE_FIX_947_STEREO_DMX_EVS_PHA. --- lib_com/options.h | 3 + lib_enc/ivas_rom_enc.h | 6 + lib_enc/ivas_rom_enc_fx.c | 110 +++ lib_enc/ivas_stat_enc.h | 35 + lib_enc/ivas_stereo_dmx_evs_fx.c | 1126 +++++++++++++++++++++++++++++- 5 files changed, 1246 insertions(+), 34 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3ad74ec35..9829b1975 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -98,6 +98,9 @@ #define NONBE_FIX_949_MC_5MS_FRAMING /*Dlb: Issue 949: fix for 5ms framing/rendering in MC mode */ #define NONBE_FIX_952_MC_PARAMUPMIX_5MS /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/ +#define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ +#define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ + /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 0d0941cc4..53fa3fd09 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -111,9 +111,15 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ + #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1]; + extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1]; + extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1]; + #else extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4]; extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4]; +#endif extern const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k]; extern const Word32 Stereo_dmx_wnd_coef_48k_fx[L_FRAME48k]; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_rom_enc_fx.c b/lib_enc/ivas_rom_enc_fx.c index b26972b8a..9b1b4dd23 100644 --- a/lib_enc/ivas_rom_enc_fx.c +++ b/lib_enc/ivas_rom_enc_fx.c @@ -508,6 +508,114 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ + + #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC +// Q31 + const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1] = { + 204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, + 24639688, 29301856, 34361688, 39817260, 45666492, 51907160, 58536884, 65553148, 72953272, 80734440, + 88893688, 97427912, 106333872, 115608160, 125247248, 135247472, 145605040, 156315968, 167376224, 178781552, + 190527648, 202610016, 215024064, 227765072, 240828160, 254208400, 267900656, 281899744, 296200320, 310796928, + 325684032, 340855968, 356306944, 372031072, 388022368, 404274752, 420782016, 437537920, 454536032, 471769920, + 489232992, 506918624, 524820096, 542930496, 561243072, 579750720, 598446528, 617323264, 636373760, 655590784, + 674967040, 694495104, 714167552, 733976960, 753915712, 773976192, 794150848, 814431936, 834811776, 855282624, + 875836544, 896465920, 917162752, 937919168, 958727360, 979579264, 1000467072, 1021382784, 1042318400, 1063266048, + 1084217599, 1105165183, 1126100863, 1147016575, 1167904383, 1188756351, 1209564415, 1230320895, 1251017727, 1271647103, + 1292201087, 1312671871, 1333051647, 1353332735, 1373507455, 1393567999, 1413506687, 1433316095, 1452988543, 1472516607, + 1491892863, 1511109887, 1530160383, 1549037183, 1567732863, 1586240511, 1604553087, 1622663551, 1640564991, 1658250623, + 1675713663, 1692947583, 1709945727, 1726701567, 1743208959, 1759461247, 1775452543, 1791176703, 1806627711, 1821799551, + 1836686719, 1851283327, 1865583871, 1879582975, 1893275263, 1906655487, 1919718527, 1932459519, 1944873599, 1956956031, + 1968702079, 1980107391, 1991167615, 2001878655, 2012236159, 2022236415, 2031875455, 2041149823, 2050055679, 2058589951, + 2066749183, 2074530431, 2081930495, 2088946815, 2095576447, 2101817215, 2107666431, 2113121919, 2118181759, 2122843903, + 2127106687, 2130968319, 2134427519, 2137482751, 2140132991, 2142377215, 2144214655, 2145644415, 2146666111, 2147279231 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1] = { + 51423, 205686, 462776, 822667, 1285325, 1850705, 2518754, 3289407, 4162591, 5138222, + 6216206, 7396441, 8678813, 10063200, 11549468, 13137475, 14827070, 16618091, 18510366, 20503712, + 22597942, 24792852, 27088232, 29483864, 31979518, 34574956, 37269924, 40064172, 42957428, 45949412, + 49039844, 52228420, 55514844, 58898792, 62379948, 65957972, 69632528, 73403256, 77269800, 81231792, + 85288840, 89440576, 93686584, 98026464, 102459800, 106986176, 111605144, 116316264, 121119096, 126013168, + 130998016, 136073168, 141238128, 146492400, 151835488, 157266880, 162786064, 168392496, 174085632, 179864960, + 185729888, 191679888, 197714368, 203832752, 210034448, 216318896, 222685456, 229133536, 235662512, 242271760, + 248960656, 255728544, 262574784, 269498720, 276499680, 283577024, 290730048, 297958048, 305260384, 312636288, + 320085120, 327606144, 335198624, 342861856, 350595072, 358397568, 366268576, 374207360, 382213120, 390285152, + 398422624, 406624768, 414890848, 423220000, 431611456, 440064448, 448578112, 457151680, 465784288, 474475136, + 483223360, 492028160, 500888704, 509804096, 518773504, 527796064, 536870912, 545997184, 555174016, 564400512, + 573675776, 582998976, 592369152, 601785472, 611246976, 620752768, 630301952, 639893568, 649526784, 659200640, + 668914176, 678666496, 688456704, 698283776, 708146816, 718044864, 727976960, 737942208, 747939584, 757968192, + 768027072, 778115200, 788231680, 798375424, 808545600, 818741184, 828961216, 839204672, 849470528, 859757952, + 870065856, 880393216, 890739136, 901102592, 911482560, 921878080, 932288192, 942711808, 953147968, 963595648, + 974053952, 984521728, 994998080, 1005481984, 1015972480, 1026468416, 1036968960, 1047472960, 1057979520, 1068487552, + 1078996095, 1089504127, 1100010751, 1110514687, 1121015167, 1131511167, 1142001663, 1152485503, 1162961919, 1173429759, + 1183887999, 1194335743, 1204771839, 1215195519, 1225605503, 1236001023, 1246381055, 1256744447, 1267090431, 1277417855, + 1287725695, 1298013055, 1308279039, 1318522495, 1328742399, 1338937983, 1349108223, 1359251967, 1369368447, 1379456639, + 1389515391, 1399544063, 1409541503, 1419506687, 1429438847, 1439336831, 1449199871, 1459026943, 1468817151, 1478569471, + 1488283007, 1497956863, 1507590015, 1517181695, 1526730879, 1536236671, 1545698175, 1555114495, 1564484735, 1573807871, + 1583083135, 1592309631, 1601486463, 1610612735, 1619687551, 1628710143, 1637679615, 1646594943, 1655455487, 1664260223, + 1673008511, 1681699327, 1690332031, 1698905471, 1707419135, 1715872127, 1724263679, 1732592767, 1740858879, 1749060991, + 1757198463, 1765270527, 1773276287, 1781215103, 1789086079, 1796888575, 1804621823, 1812285055, 1819877503, 1827398527, + 1834847359, 1842223231, 1849525631, 1856753663, 1863906687, 1870983935, 1877984895, 1884908927, 1891755135, 1898523007, + 1905211903, 1911821183, 1918350079, 1924798207, 1931164799, 1937449215, 1943650943, 1949769343, 1955803775, 1961753727, + 1967618687, 1973398015, 1979091199, 1984697599, 1990216703, 1995648127, 2000991231, 2006245503, 2011410431, 2016485631, + 2021470463, 2026364543, 2031167359, 2035878527, 2040497535, 2045023871, 2049457151, 2053797119, 2058043135, 2062194815, + 2066251903, 2070213887, 2074080383, 2077851135, 2081525631, 2085103743, 2088584831, 2091968767, 2095255167, 2098443775, + 2101534207, 2104526207, 2107419519, 2110213759, 2112908671, 2115504127, 2117999743, 2120395391, 2122690815, 2124885759, + 2126979967, 2128973311, 2130865535, 2132656639, 2134346111, 2135934207, 2137420415, 2138804863, 2140087167, 2141267455, + 2142345471, 2143321087, 2144194303, 2144964863, 2145632895, 2146198271, 2146660991, 2147020927, 2147277951, 2147432191 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1] = { + 22902, 91608, 206114, 366416, 572507, 824378, 1122018, 1465415, 1854554, 2289418, + 2769989, 3296246, 3868167, 4485728, 5148901, 5857660, 6611973, 7411808, 8257132, 9147909, + 10084099, 11065664, 12092561, 13164746, 14282175, 15444799, 16652568, 17905432, 19203336, 20546226, + 21934042, 23366728, 24844222, 26366462, 27933380, 29544910, 31200986, 32901534, 34646484, 36435760, + 38269288, 40146984, 42068776, 44034576, 46044300, 48097868, 50195188, 52336168, 54520724, 56748756, + 59020172, 61334876, 63692768, 66093744, 68537712, 71024552, 73554176, 76126456, 78741304, 81398592, + 84098208, 86840048, 89623984, 92449904, 95317680, 98227200, 101178336, 104170952, 107204936, 110280144, + 113396456, 116553736, 119751848, 122990656, 126270024, 129589808, 132949864, 136350064, 139790240, 143270256, + 146789968, 150349232, 153947888, 157585760, 161262736, 164978624, 168733280, 172526544, 176358256, 180228256, + 184136368, 188082416, 192066256, 196087712, 200146592, 204242752, 208376000, 212546160, 216753072, 220996528, + 225276352, 229592384, 233944432, 238332288, 242755792, 247214752, 251708960, 256238240, 260802384, 265401216, + 270034528, 274702112, 279403808, 284139392, 288908640, 293711360, 298547360, 303416448, 308318400, 313252960, + 318220000, 323219264, 328250528, 333313632, 338408288, 343534304, 348691488, 353879616, 359098432, 364347744, + 369627296, 374936928, 380276320, 385645312, 391043680, 396471168, 401927520, 407412544, 412925984, 418467616, + 424037216, 429634528, 435259328, 440911328, 446590336, 452296128, 458028416, 463786944, 469571520, 475381856, + 481217728, 487078848, 492965024, 498875968, 504811424, 510771168, 516754912, 522762432, 528793440, 534847712, + 540924928, 547024960, 553147392, 559292032, 565458624, 571646912, 577856640, 584087488, 590339264, 596611584, + 602904320, 609217152, 615549760, 621901888, 628273344, 634663808, 641072960, 647500608, 653946432, 660410176, + 666891520, 673390208, 679906048, 686438592, 692987712, 699553088, 706134400, 712731392, 719343808, 725971328, + 732613696, 739270592, 745941760, 752626880, 759325760, 766038016, 772763456, 779501696, 786252480, 793015488, + 799790528, 806577216, 813375360, 820184576, 827004608, 833835136, 840675968, 847526656, 854387072, 861256832, + 868135616, 875023168, 881919232, 888823488, 895735616, 902655296, 909582336, 916516352, 923457088, 930404224, + 937357504, 944316544, 951281152, 958250944, 965225728, 972205056, 979188800, 986176512, 993168000, 1000162880, + 1007160960, 1014161856, 1021165248, 1028170944, 1035178560, 1042187776, 1049198400, 1056210048, 1063222464, 1070235328, + 1077248383, 1084261119, 1091273599, 1098285183, 1105295871, 1112305151, 1119312767, 1126318335, 1133321855, 1140322687, + 1147320703, 1154315647, 1161307135, 1168294911, 1175278591, 1182257919, 1189232639, 1196202495, 1203167103, 1210126207, + 1217079423, 1224026495, 1230967295, 1237901311, 1244828287, 1251748095, 1258660223, 1265564415, 1272460415, 1279348095, + 1286226815, 1293096575, 1299956991, 1306807679, 1313648511, 1320479103, 1327299071, 1334108287, 1340906367, 1347693183, + 1354468095, 1361231231, 1367981951, 1374720255, 1381445631, 1388157823, 1394856703, 1401541887, 1408213119, 1414870015, + 1421512319, 1428139903, 1434752255, 1441349247, 1447930623, 1454495871, 1461044991, 1467577599, 1474093439, 1480592127, + 1487073535, 1493537151, 1499982975, 1506410623, 1512819839, 1519210239, 1525581695, 1531933951, 1538266495, 1544579327, + 1550872063, 1557144447, 1563396095, 1569627007, 1575836671, 1582024959, 1588191615, 1594336255, 1600458751, 1606558719, + 1612635903, 1618690175, 1624721279, 1630728703, 1636712447, 1642672255, 1648607743, 1654518655, 1660404735, 1666265983, + 1672101759, 1677912191, 1683696639, 1689455231, 1695187583, 1700893311, 1706572287, 1712224383, 1717849087, 1723446399, + 1729016063, 1734557695, 1740071167, 1745556095, 1751012479, 1756439935, 1761838335, 1767207295, 1772546687, 1777856383, + 1783135871, 1788385151, 1793604095, 1798792191, 1803949311, 1809075327, 1814169983, 1819233151, 1824264319, 1829263615, + 1834230655, 1839165311, 1844067199, 1848936319, 1853772287, 1858574975, 1863344255, 1868079871, 1872781567, 1877449087, + 1882082431, 1886681215, 1891245439, 1895774719, 1900268927, 1904727807, 1909151359, 1913539199, 1917891199, 1922207231, + 1926487167, 1930730623, 1934937471, 1939107583, 1943240831, 1947337087, 1951395967, 1955417343, 1959401215, 1963347327, + 1967255423, 1971125375, 1974957055, 1978750335, 1982504959, 1986220927, 1989897855, 1993535743, 1997134463, 2000693631, + 2004213375, 2007693439, 2011133567, 2014533759, 2017893887, 2021213567, 2024493055, 2027731839, 2030929919, 2034087167, + 2037203455, 2040278655, 2043312639, 2046305279, 2049256447, 2052166015, 2055033727, 2057859711, 2060643583, 2063385471, + 2066085119, 2068742399, 2071357183, 2073929471, 2076459135, 2078945919, 2081389951, 2083790847, 2086148735, 2088463487, + 2090734847, 2092962943, 2095147519, 2097288447, 2099385727, 2101439359, 2103449087, 2105414911, 2107336703, 2109214335, + 2111047935, 2112837119, 2114582143, 2116282623, 2117938687, 2119550207, 2121117183, 2122639487, 2124116863, 2125549567, + 2126937471, 2128280319, 2129578239, 2130831103, 2132038911, 2133201535, 2134318847, 2135391103, 2136418047, 2137399551, + 2138335743, 2139226495, 2140071807, 2140871679, 2141625983, 2142334719, 2142997887, 2143615487, 2144187391, 2144713599, + 2145194239, 2145629055, 2146018175, 2146361599, 2146659327, 2146911103, 2147117183, 2147277567, 2147391999, 2147460735 + }; + #else // Q31 const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4] = { 3309988, 29667578, 81733728, 158226416, 257262128, 376402368, 512713184, 662838656, 823081792, 989497088, @@ -529,6 +637,8 @@ const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4] = { 1634770560, 1681915904, 1727394560, 1771081600, 1812856960, 1852606720, 1890221568, 1925598592, 1958640640, 1989257344, 2017364480, 2042885504, 2065750016, 2085895424, 2103266688, 2117816064, 2129503616, 2138297728, 2144173568, 2147115776 }; +#endif + // Q31 const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k] = { 5270712, 15812011, 26352928, 36893212, 47432604, 57970856, 68507712, 79042912, 89576208, 100107344, diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index f5dddcb77..e1390dc78 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1180,7 +1180,9 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure typedef struct stereo_dmx_evs_correlation_filter_structure { +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA Word16 init_frmCntr; +#endif Word32 isd_rate_s_fx; // Q31 Word32 iccr_s_fx; // Q31 @@ -1204,6 +1206,18 @@ typedef struct stereo_dmx_evs_correlation_filter_structure STEREO_DMX_EVS_PHA prev_pha; Word16 pha_hys_cnt; +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + STEREO_DMX_EVS_PHA proc_pha; + Word16 force_poc; + + Word16 pha_ipd_chan2rephase; + Word16 pha_ipd_previouschan2rephase; + Word16 pha_ipd_chan_cnt; + Word16 pha_ipd_chan_thresh; + Word16 pha_ipd_chanswitch; + Word16 pha_ipd_chanswitch_allowed; +#endif + Word16 prc_thres; STEREO_DMX_EVS_PRC curr_prc; STEREO_DMX_EVS_PRC prev_prc; @@ -1216,6 +1230,27 @@ typedef struct stereo_dmx_evs_correlation_filter_structure Word16 trns_aux_energy_fx_e[CPE_CHANNELS]; Word32 crst_fctr_fx; // Q0 +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Word16 n_fad_g; + Word16 n_fad_cnt; + + Word32 dmx_pha_ener_fx; + Word16 dmx_pha_ener_fx_e; + Word32 dmx_poc_ener_fx; + Word16 dmx_poc_ener_fx_e; + + Word32 dmx_pha_ener_sgc_fx; + Word16 dmx_pha_ener_sgc_fx_e; + Word32 dmx_poc_ener_sgc_fx; + Word16 dmx_poc_ener_sgc_fx_e; + + Word32 dmx_pha_gain_sgc_fx; + Word32 dmx_poc_gain_sgc_fx; + + Word32 low_egy_thres_sgc; + Word16 low_egy_thres_sgc_e; +#endif + } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; typedef struct stereo_dmx_evs_enc_data_structure diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 625ff8ee9..26487089d 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -88,7 +88,9 @@ #define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 -#define STEREO_DMX_EVS_FADE_LEN_PRC_Q0 20 +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA +#define STEREO_DMX_EVS_FADE_LEN_PRC_Q0 20 +#endif #define STEREO_DMX_EVS_NB_SBFRM 5 #define STEREO_DMX_EVS_TRNS_DTC_INST_Q0 75 @@ -98,6 +100,48 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +#define STEREO_DMX_EVS_FAD_R 3 +#define STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 29491 // 0.9f +#define STEREO_DMX_EVS_SGC_GR_S 32919 // 1.00461543f +#define STEREO_DMX_EVS_SGC_GIR_S 32617 // 1/1.00461543f +#define STEREO_DMX_EVS_SGC_GL 32391 // 0.9885f +#define STEREO_DMX_EVS_SGC_GH 33148 // 1.0116f +#define STEREO_DMX_EVS_SGC_LEGY_THRES_16 2.5E8 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_32 3.E8 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_48 5.E8 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_E 22 +#define STEREO_DMX_EVS_SGC_GMAX 46340 // 1.4142f +#define STEREO_DMX_EVS_SGC_GMIN 23170 // 0.7071f +#define STEREO_DMX_EVS_IPD_ILD_THRES_Q29 1696512082 // 3.16f (5dB) +#define STEREO_DMX_EVS_IPD_SF_THRES_Q31 107374182 // 0.05f +const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, + 2027355520, 2023718912, 2020082304, 2016445696, 2012809088, 2009172480, 2005535872, 2001899264, 1998262656, 1994625920, + 1990989312, 1987352704, 1983716096, 1980079488, 1976442880, 1972806272, 1969169664, 1965533056, 1961896448, 1958259840, + 1954623232, 1950986624, 1947350016, 1943713408, 1940076800, 1936440192, 1932803584, 1929166848, 1925530240, 1921893632, + 1918257024, 1914620416, 1910983808, 1907347200, 1903710592, 1900073984, 1896437376, 1892800768, 1889164160, 1885527552, + 1881890944, 1878254336, 1874617600, 1870981120, 1867344384, 1863707776, 1860071168, 1856434560, 1852797952, 1849161344, + 1845524736, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, + 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128 +}; +#else const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, @@ -124,6 +168,7 @@ const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872 }; +#endif /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ @@ -202,6 +247,13 @@ static Word32 find_poc_peak_fx( const Word16 input_frame, /* i : input frame length per channel */ const Word32 ratio_fixed /* i : adapting ratio */ ); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +static Word32 spectral_flatness_fx( + const Word32 *sig_fx, /* i : input signal (mantissa) */ + const Word16 *sig_fx_e, /* i : input signal (exponent) - can be NULL */ + const Word16 sig_length /* i : input signal length */ +); +#endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * @@ -307,7 +359,11 @@ static void calc_poc_fx( Word16 cos_step, cos_max; Word32 eps_cos, eps_sin, EPS; +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha, pha_ipd_ild_chan2rephase; +#else Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; +#endif Word32 Nr, Ni, Dr, Di, tPr, tPi, Pn, energy; Word16 Nr_e, Ni_e, tPr_e, tPi_e, Pn_e, energy_e; Word16 isd_rate, isd_rate_e; @@ -567,7 +623,7 @@ static void calc_poc_fx( specPOr[n0] = imult3216( Mpy_32_32_r( wnd[i * step + bias], gamma ), sign_fx( Mpy_32_32_r( specLr[n0], specRr[n0] ) ) ); // Q31 move32(); - +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA hPHA->init_frmCntr = sub( hPHA->init_frmCntr, 1 ); move16(); if ( hPHA->init_frmCntr < 0 ) @@ -575,6 +631,7 @@ static void calc_poc_fx( hPHA->init_frmCntr = 0; move16(); } +#endif freq_8k = L_FRAME16k / 2; move16(); // freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) ); @@ -799,6 +856,22 @@ static void calc_poc_fx( tPr = L_shl_sat( Mpy_32_32_r( tPr, Pn ), add( tPr_e, Pn_e ) ); // Q31 tPi = L_shl_sat( Mpy_32_32_r( tPi, Pn ), add( tPi_e, Pn_e ) ); // Q31 +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); + move32(); + Pi[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pi[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPi ) ); + move32(); + + // Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); + Pn = L_add( L_shr( Mpy_32_32_r( Pr[n], Pr[n] ), 1 ), L_shr( Mpy_32_32_r( Pi[n], Pi[n] ), 1 ) ); + Pn = BASOP_Util_Add_Mant32Exp( Pn, 1, EPSILON_FX_M, EPSILON_FX_E, &Pn_e ); + Pn = Isqrt_lc( Pn, &Pn_e ); + + Pr[n] = L_shl_sat( Mpy_32_32_r( Pr[n], Pn ), Pn_e ); // Q31 + move32(); + Pi[n] = L_shl_sat( Mpy_32_32_r( Pi[n], Pn ), Pn_e ); // Q31 + move32(); +#else IF( hPHA->init_frmCntr == 0 ) { Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); @@ -823,10 +896,26 @@ static void calc_poc_fx( Pi[n] = tPi; move32(); } - +#endif // Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; // Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; } + +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + /* Computes Spectral flatness on one channel */ + tmp1 = spectral_flatness_fx( &tEl[1], &tEl_e[1], nsbd - 1 ); + IF( LT_32( tmp1, STEREO_DMX_EVS_IPD_SF_THRES_Q31 ) ) + { + hPHA->pha_ipd_chanswitch_allowed = 0; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch_allowed = 1; + move16(); + } +#endif + // ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( Nr, Nr ), shl( Nr_e, 1 ), Mpy_32_32_r( Ni, Ni ), shl( Ni_e, 1 ), &L_tmp1_e ); L_tmp2 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( eneL, eneR ), add( eneL_e, eneR_e ), EPSILON_FX_M, EPSILON_FX_E, &L_tmp2_e ); @@ -840,6 +929,322 @@ static void calc_poc_fx( hPHA->iccr_s_fx = L_add( Mpy_32_32_r( STEREO_DMX_EVS_ICCR_FORGETTING_Q31, hPHA->iccr_s_fx ), Mpy_32_32_r( MAX_32 - STEREO_DMX_EVS_ICCR_FORGETTING_Q31, ICCr ) ); // Q31 move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + + IF( EQ_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) + { + hPHA->force_poc = FALSE; + hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; + move16(); + move32(); + } + ELSE + { + test(); + test(); + test(); + IF( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_L_Q31 ) || ( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_H_Q31 ) && EQ_32( hPHA->proc_pha, STEREO_DMX_EVS_PHA_IPD2 ) && EQ_16( hPHA->force_poc, FALSE ) ) ) + { + hPHA->force_poc = FALSE; + hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD2; + move16(); + move32(); + } + ELSE + { + hPHA->force_poc = TRUE; + move16(); + } + } + + IF( hPHA->proc_pha == STEREO_DMX_EVS_PHA_IPD ) + { + rfft_pha_buf[0] = ONE_IN_Q22; + move32(); + rfft_pha_buf[1] = ONE_IN_Q22; + move32(); + + ild_cnt = 0; + move16(); + FOR( i = 1; i < nsbd; i++ ) + { + rfft_pha_buf[i * 2] = L_shr_r( Pr[i], 9 ); // Q31->Q22 + move32(); + rfft_pha_buf[i * 2 + 1] = L_shr_r( Pi[i], 9 ); // Q31->Q22 + move32(); + // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + test(); + IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) + { + ild_cnt = add( ild_cnt, 1 ); + tEr[i] = MAX_32; + move32(); + tEr_e[i] = 0; + move16(); + } + ELSE + { + tEr[i] = MIN_32; + move32(); + tEr_e[i] = 0; + move16(); + } + } + IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) + { + FOR( i = 1; i < nsbd; i++ ) + { + IF( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = ONE_IN_Q22; + move32(); + rfft_pha_buf[i * 2 + 1] = 0; + move32(); + } + } + } + + rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); + + /* Choose best channel to phase align */ + /* Channel selection based on ILD */ + IF( BASOP_Util_Cmp_Mant32Exp( hPHA->trns_aux_energy_fx[0], hPHA->trns_aux_energy_fx_e[0], Mpy_32_32_r( STEREO_DMX_EVS_IPD_ILD_THRES_Q29, hPHA->trns_aux_energy_fx[1] ), add( 2, hPHA->trns_aux_energy_fx_e[1] ) ) > 0 ) + { + pha_ipd_ild_chan2rephase = 1; + } + ELSE IF( BASOP_Util_Cmp_Mant32Exp( hPHA->trns_aux_energy_fx[1], hPHA->trns_aux_energy_fx_e[1], Mpy_32_32_r( STEREO_DMX_EVS_IPD_ILD_THRES_Q29, hPHA->trns_aux_energy_fx[0] ), add( 2, hPHA->trns_aux_energy_fx_e[0] ) ) > 0 ) + { + pha_ipd_ild_chan2rephase = 0; + } + ELSE + { + pha_ipd_ild_chan2rephase = -1; + } + move16(); + + Word16 rfft_pha_buf_0[L_FRAME48k]; // Temporary solution + FOR( n = 0; n < L_FRAME48k; n++ ) + { + rfft_pha_buf_0[n] = 0; + } + + /* Channel selection based on spikyness of R2L/L2R impulse responses */ + tmp1 = spectral_flatness_fx( rfft_pha_buf, NULL, hPHA->pha_len ); + rfft_pha_buf[sub( input_frame_pha, hPHA->pha_len )] = rfft_pha_buf[0]; + move32(); + tmp2 = spectral_flatness_fx( &rfft_pha_buf[sub( input_frame_pha, hPHA->pha_len )], NULL, hPHA->pha_len ); + + // /* Combined ILD/SF channel selection with tempo */ + IF( ( GT_32( tmp1, tmp2 ) && ( EQ_16( pha_ipd_ild_chan2rephase, -1 ) ) ) || EQ_16( pha_ipd_ild_chan2rephase, 0 ) ) /* L => R */ + { + IF( EQ_16( hPHA->pha_ipd_previouschan2rephase, 0 ) ) + { + hPHA->pha_ipd_chan_cnt = add( hPHA->pha_ipd_chan_cnt, 1 ); + IF( GE_32( hPHA->pha_ipd_chan_cnt, hPHA->pha_ipd_chan_thresh ) ) + { + /* Avoid channel switch in case of too harmonic signals */ + IF( EQ_16( hPHA->pha_ipd_chanswitch_allowed, 1 ) ) + { + IF( NE_16( hPHA->pha_ipd_chan2rephase, 0 ) ) + { + hPHA->pha_ipd_chanswitch = 1; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch = 0; + move16(); + } + hPHA->pha_ipd_chan2rephase = 0; + move16(); + } + } + } + ELSE + { + hPHA->pha_ipd_previouschan2rephase = 0; + hPHA->pha_ipd_chan_cnt = 1; + hPHA->pha_ipd_chanswitch = 0; + move16(); + move16(); + move16(); + } + } + ELSE + { + IF( EQ_16( hPHA->pha_ipd_previouschan2rephase, 1 ) ) + { + hPHA->pha_ipd_chan_cnt = add( hPHA->pha_ipd_chan_cnt, 1 ); + + IF( GE_16( hPHA->pha_ipd_chan_cnt, hPHA->pha_ipd_chan_thresh ) ) + { + /* Avoid channel switch in case of too harmonic signals */ + IF( EQ_16( hPHA->pha_ipd_chanswitch_allowed, 1 ) ) + { + IF( NE_16( hPHA->pha_ipd_chan2rephase, 1 ) ) + { + hPHA->pha_ipd_chanswitch = 1; + move16(); + } + ELSE + { + hPHA->pha_ipd_chanswitch = 0; + move16(); + } + hPHA->pha_ipd_chan2rephase = 1; + move16(); + } + hPHA->pha_ipd_chan_cnt = hPHA->pha_ipd_chan_thresh; + move16(); + } + } + ELSE + { + hPHA->pha_ipd_previouschan2rephase = 1; + hPHA->pha_ipd_chan_cnt = 1; + hPHA->pha_ipd_chanswitch = 0; + move16(); + move16(); + move16(); + } + } + + IF( EQ_16( hPHA->pha_ipd_chanswitch, 0 ) ) + { + IF( EQ_16( hPHA->pha_ipd_chan2rephase, 0 ) ) + { + hPHA->p_curr_taps_fx[1] = NULL; + hPHA->p_curr_taps_fx[0] = hPHA->curr_taps_fx[0]; + p_curr_taps = hPHA->p_curr_taps_fx[0]; + + L_tmp = L_shl( 1, 8 ); + p_curr_taps[0] = W_extract_l( W_mult_32_32( L_tmp, rfft_pha_buf[0] ) ); // Q22 -> Q31 + j = sub( input_frame_pha, 1 ); + FOR( i = 1; i < hPHA->pha_len; i++ ) + { + p_curr_taps[i] = W_extract_l( W_mult_32_32( L_tmp, rfft_pha_buf[j] ) ); // Q22 -> Q31 + j = sub( j, 1 ); + } + } + ELSE + { + hPHA->p_curr_taps_fx[0] = NULL; + hPHA->p_curr_taps_fx[1] = hPHA->curr_taps_fx[1]; + Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 + } + } + } + + IF( EQ_16( hPHA->pha_ipd_chanswitch, 1 ) ) + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps_fx[n] = NULL; + } + } + ELSE IF( EQ_32( hPHA->proc_pha, STEREO_DMX_EVS_PHA_IPD2 ) ) + { + /* IPDn */ + + set32_fx( &( Pr[freq_ipd_max] ), MAX_32, sub( nsbd, freq_ipd_max ) ); + set32_fx( &( Pi[freq_ipd_max] ), 0, sub( nsbd, freq_ipd_max ) ); + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps_fx[n] = hPHA->curr_taps_fx[n]; + } + + rfft_pha_buf[0] = ONE_IN_Q22; + move32(); + rfft_pha_buf[1] = ONE_IN_Q22; + move32(); + + ild_cnt = 0; + move16(); + isd_rate = BASOP_Util_Divide1616_Scale( isd_cnt_l, freq_8k, &isd_rate_e ); + // Saturation to handle values close to 1.0f + isd_rate = shl_sat( isd_rate, isd_rate_e ); // Q15 + FOR( i = 1; i < nsbd; i++ ) + { + // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); + L_tmp = L_add( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); + L_tmp_e = 0; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 + move32(); + // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); + L_tmp = L_sub_sat( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); // saturating as Pr does not exceed 1.0f + L_tmp_e = 0; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( Pi[i] ) ); // Q22 + move32(); + IF( GT_16( isd_rate, STEREO_DMX_EVS_ISD_DIST_THRES_IPD_Q15 ) ) + { + // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); + L_tmp = L_sub( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); + L_tmp_e = 9; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( rfft_pha_buf[i * 2 + 1] ) ); // Q22 + move32(); + // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); + L_tmp = L_add( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); // Q22 + L_tmp_e = 9; + move16(); + L_tmp = Sqrt32( L_tmp, &L_tmp_e ); + rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 + move32(); + } + + // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + test(); + IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) + { + ild_cnt = add( ild_cnt, 1 ); + tEr[i] = MAX_32; + move32(); + tEr_e[i] = 0; + move16(); + } + ELSE + { + tEr[i] = MIN_32; + move32(); + tEr_e[i] = 0; + move16(); + } + } + IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) + { + FOR( i = 1; i < nsbd; i++ ) + { + IF( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = ONE_IN_Q22; + move32(); + rfft_pha_buf[i * 2 + 1] = 0; + move32(); + } + } + } + + rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); + // mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); + Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 + + /* PHA L2R */ + p_curr_taps = hPHA->p_curr_taps_fx[0]; + p_curr_taps[0] = L_shl( rfft_pha_buf[0], 9 ); // Q22->Q31 + move32(); + FOR( i = 1; i < hPHA->pha_len; i++ ) + { + p_curr_taps[i] = L_shl( rfft_pha_buf[input_frame_pha - i], 9 ); // Q22->Q31 + move32(); + } + } +#else IF( EQ_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) { hPHA->p_curr_taps_fx[0] = NULL; @@ -1008,6 +1413,7 @@ static void calc_poc_fx( } } } +#endif FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -1536,7 +1942,11 @@ static void weighted_ave_fx( Word16 i, len; Word32 gain_tmp_fx = 0, gain_sub_fx; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + len = shr( input_frame, 1 ); +#else len = shr( input_frame, 4 ); +#endif gain_sub_fx = L_sub( gain_fx, old_gain_fx ); FOR( i = 0; i < len; i++ ) { @@ -1552,6 +1962,61 @@ static void weighted_ave_fx( return; } + +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +/*-------------------------------------------------------------------* + * spectral_flatness_fx() + * + * computes spectral flatness SF + * SF(x) = exp(mean_i(ln(x_i))) / mean_i(x_i) + *-------------------------------------------------------------------*/ +static Word32 spectral_flatness_fx( + const Word32 *sig_fx, /* i : input signal (mantissa) */ + const Word16 *sig_fx_e, /* i : input signal (exponent) */ + const Word16 sig_length /* i : input signal length */ +) +{ + Word32 L_geoMean, L_ariMean, L_tmp; + Word16 i, geoMean, ariMean, geoMean_e, ariMean_e, L_tmp_e, sf; + + L_geoMean = 0; + geoMean_e = 0; + L_ariMean = 0; + ariMean_e = 0; + + IF( sig_fx_e == NULL ) + { + FOR( i = 0; i < sig_length; i++ ) + { + L_tmp = BASOP_Util_Add_Mant32Exp( L_abs( sig_fx[i] ), 0, EPSILON_FX_M, EPSILON_FX_E, &L_tmp_e ); + L_ariMean = BASOP_Util_Add_Mant32Exp( L_ariMean, ariMean_e, L_tmp, L_tmp_e, &ariMean_e ); + L_geoMean = BASOP_Util_Add_Mant32Exp( L_geoMean, geoMean_e, BASOP_Util_Loge( L_tmp, L_tmp_e ), 6, &geoMean_e ); // +6 : compensate result of log /64 + } + } + ELSE + { + FOR( i = 0; i < sig_length; i++ ) + { + L_tmp = BASOP_Util_Add_Mant32Exp( L_abs( sig_fx[i] ), sig_fx_e[i], EPSILON_FX_M, EPSILON_FX_E, &L_tmp_e ); + L_ariMean = BASOP_Util_Add_Mant32Exp( L_ariMean, ariMean_e, L_tmp, L_tmp_e, &ariMean_e ); + L_geoMean = BASOP_Util_Add_Mant32Exp( L_geoMean, geoMean_e, BASOP_Util_Loge( L_tmp, L_tmp_e ), 6, &geoMean_e ); // +6 : compensate result of log /64 + } + } + + ariMean = BASOP_Util_Divide3216_Scale( L_ariMean, sig_length, &L_tmp_e ); + ariMean_e = add( sub( ariMean_e, Q15 ), L_tmp_e ); // (Q16)-1 : compensate result of division + + geoMean = BASOP_Util_Divide3216_Scale( L_geoMean, sig_length, &L_tmp_e ); + geoMean_e = add( sub( geoMean_e, Q15 ), L_tmp_e ); // (Q16)-1 : compensate result of division + geoMean = extract_h( BASOP_Util_fPow( (Word32) 1459366444, (Word16) 2, L_deposit_h( geoMean ), geoMean_e, &geoMean_e ) ); /* e=2,718281828459045 */ + + sf = BASOP_Util_Divide1616_Scale( geoMean, ariMean, &L_tmp_e ); + L_tmp_e = add( sub( geoMean_e, ariMean_e ), L_tmp_e ); + + return L_shl_sat( L_deposit_h( sf ), L_tmp_e ); +} +#endif + /*-------------------------------------------------------------------* * calc_energy() * @@ -1633,25 +2098,68 @@ static void calc_energy_fx( return; } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* - * adapt_gain() + * calc_energy_sgc() * - * adapt gain to the signal + * calculate energy for switch gain control *-------------------------------------------------------------------*/ -static void adapt_gain_fx( - const Word32 src_fx[], /* i : input signal Q16 */ - Word32 dst_fx[], /* o : output signal Q16 */ - const Word32 gain_fx, /* i : adapting gain Q31*/ - const Word32 old_gain_fx, /* i : adapting prev gain Q31*/ - const Word16 input_frame, /* i : input frame length per channel */ - const Word32 wnd_fx[] /* i : window coef Q31 */ +static void calc_energy_sgc( + const Word32 src[], /* i : input signal */ + Word32 *energy, /* i/o : calculated energy (mantissa) */ + Word16 *energy_e, /* i/o : calculated energy (exponent) */ + const Word16 input_frame, /* i : input frame length */ + const Word16 ratio /* i : adapting ratio */ ) { - Word16 i, len; - Word32 gain_tmp_fx, gain_sub_fx; + Word16 i, l_tmp_e, l_energy_e; + Word32 l_energy; + Word64 w_tmp; - len = shr( input_frame, 4 ); - // gain_sub = gain - old_gain; + l_energy = 0; + l_energy_e = 0; + FOR( i = 0; i < input_frame; i++ ) + { + w_tmp = W_mult0_32_32( src[i], src[i] ); + l_tmp_e = W_norm( w_tmp ); + IF( l_tmp_e != 0 ) + { + w_tmp = W_shl( w_tmp, l_tmp_e ); + } + l_energy = BASOP_Util_Add_Mant32Exp( l_energy, l_energy_e, W_round64_L( w_tmp ), sub( 32, l_tmp_e ), &l_energy_e ); // Q(2x26 - l_energy_e) + } + + *energy = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( *energy, ratio ), *energy_e, Mpy_32_16_1( l_energy, sub( MAX_16, ratio ) ), l_energy_e, energy_e ); + move32(); + + return; +} +#endif + +/*-------------------------------------------------------------------* + * adapt_gain() + * + * adapt gain to the signal + *-------------------------------------------------------------------*/ +static void adapt_gain_fx( + const Word32 src_fx[], /* i : input signal Q16 */ + Word32 dst_fx[], /* o : output signal Q16 */ + const Word32 gain_fx, /* i : adapting gain Q31*/ + const Word32 old_gain_fx, /* i : adapting prev gain Q31*/ + const Word16 input_frame, /* i : input frame length per channel */ + const Word32 wnd_fx[] /* i : window coef Q31 */ +) +{ + Word16 i, len; + Word32 gain_tmp_fx, gain_sub_fx; + +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + len = shr( input_frame, 1 ); +#else + len = shr( input_frame, 4 ); +#endif + + // gain_sub = gain - old_gain; gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 FOR( i = 0; i < len; i++ ) @@ -1764,6 +2272,52 @@ static void create_M_signal_fx( return; } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +/*-------------------------------------------------------------------* + * apply_gain_sgc() + * + * Apply gain for switching + *-------------------------------------------------------------------*/ + +static void apply_gain_sgc( + Word32 data[], /* i/o : input signal */ + Word32 *gain, /* i : gain */ + const Word16 input_frame /* i : input frame length */ +) +{ + Word16 n; + Word32 lr; + Word64 W_tmp; + + IF( GT_32( *gain, STEREO_DMX_EVS_SGC_GH ) ) + { + lr = STEREO_DMX_EVS_SGC_GIR_S; + move32(); + } + ELSE IF( LT_32( *gain, STEREO_DMX_EVS_SGC_GL ) ) + { + lr = STEREO_DMX_EVS_SGC_GR_S; + move32(); + } + ELSE + { + return; + } + + FOR( n = 0; n < input_frame; n++ ) + { + W_tmp = W_mult_32_32( data[n], *gain ); + W_tmp = W_shr( W_tmp, 16 ); + data[n] = W_extract_l( W_tmp ); + } + + W_tmp = W_mult_32_32( *gain, lr ); + *gain = W_shr( W_tmp, 16 ); + + return; +} +#endif + /*-------------------------------------------------------------------* * stereo_dmx_evs_enc() * @@ -1777,6 +2331,459 @@ void stereo_dmx_evs_enc_fx( const bool is_binaural /* i : indication that input is binaural audio */ ) { +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + Word16 n; + Word16 dmx_weight, corr; // Q15 + Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 + + Word16 k, m, pha_len, fad_len; + Word32 mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; // Q11 + Word32 *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; + + Word32 dmx_poc_data[L_FRAME48k] /*Q11*/, dmx_pha_data[L_FRAME48k] /*Q11*/, *p_dmx_data, fx_tmp, *p_dmx_data_fo; + Word16 n_fad_r, n_fad_g, m_fad_g, n_fad_cnt; + + STEREO_DMX_EVS_PRC prev_prc; + Word16 input_subframe, is_transient, dmx_gain_sgc; + Word32 *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; + Word16 subframe_energy_e[STEREO_DMX_EVS_NB_SBFRM]; + + Word16 input_frame; + + Word32 L_tmp1, L_tmp2; + Word16 L_tmp1_e, L_tmp2_e; + + Word64 W_tmp; + Word16 W_tmp_q; + + if ( is_binaural ) + { + /* use of is_binaural flag is to be considered */ + } + + // input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + SWITCH( input_Fs ) + { + case 8000: + input_frame = 160; + BREAK; + case 16000: + input_frame = 320; + BREAK; + case 32000: + input_frame = 640; + BREAK; + case 48000: + input_frame = 960; + BREAK; + default: + input_frame = 960; + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); + BREAK; + } + move16(); + + FOR( n = 0; n < input_frame; n++ ) + { + data_fx[0][n] = L_deposit_h( data[2 * n] ); + move32(); + data_fx[1][n] = L_deposit_h( data[2 * n + 1] ); + move32(); + } + IF( LT_16( n_samples, input_frame ) ) + { + set32_fx( data_fx[0] + n_samples, 0, sub( input_frame, n_samples ) ); + set32_fx( data_fx[1] + n_samples, 0, sub( input_frame, n_samples ) ); + } + + // input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; + IF( EQ_16( n_samples, L_FRAME16k ) ) + { + input_subframe = 64; + move16(); + } + ELSE IF( EQ_16( n_samples, L_FRAME32k ) ) + { + input_subframe = 128; + move16(); + } + ELSE IF( EQ_16( n_samples, L_FRAME48k ) ) + { + input_subframe = 192; + move16(); + } + ELSE + { + input_subframe = 192; + move16(); + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" ); + } + + is_transient = 0; + move16(); + FOR( k = 0; k < CPE_CHANNELS; k++ ) + { + fx_tmp = 0; + move32(); + FOR( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) + { + p_sub_frame = &( data_fx[k][m * input_subframe] ); + subframe_energy[m] = 0; + move32(); + subframe_energy_e[m] = 0; + move16(); + FOR( n = 0; n < input_subframe; n++ ) + { + // subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; + W_tmp = W_mult_32_32( p_sub_frame[n], p_sub_frame[n] ); + W_tmp_q = W_norm( W_tmp ); + W_tmp = W_shl( W_tmp, W_tmp_q ); + L_tmp1 = W_extract_h( W_tmp ); // Q(31-(30-W_tmp_q)) + L_tmp1_e = sub( 15 * 2, W_tmp_q ); + subframe_energy[m] = BASOP_Util_Add_Mant32Exp( subframe_energy[m], subframe_energy_e[m], L_tmp1, L_tmp1_e, &subframe_energy_e[m] ); + move32(); + } + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); + // if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) + if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDmxEVS->hPHA->crst_fctr_fx, 31 ) > 0 ) + { + is_transient = 1; + move16(); + } + + // hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; + hStereoDmxEVS->hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ), hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], Mpy_32_16_1( subframe_energy[m], sub( MAX_16, STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ) ), subframe_energy_e[m], &hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k] ); + move32(); + } + + FOR( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) + { + L_tmp1 = BASOP_Util_Add_Mant32Exp( subframe_energy[m - 1], subframe_energy_e[m - 1], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); + L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); + // if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) + if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, STEREO_DMX_EVS_TRNS_DTC_INST_Q0, 31 ) > 0 ) + { + is_transient = 1; + move16(); + } + } + } + + estimate_itd_fx( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_fx[0], data_fx[1], &hStereoDmxEVS->itd_fx, input_frame ); + + /* poc */ + + IF( hStereoDmxEVS->itd_fx ) + { + // dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; + IF( hStereoDmxEVS->itd_fx > 0 ) + { + dmx_weight = add( negate( shr( corr, 1 ) ), ONE_IN_Q14 ); + } + ELSE + { + dmx_weight = add( shr( corr, 1 ), ONE_IN_Q14 ); + } + } + ELSE + { + dmx_weight = ONE_IN_Q14; + move16(); + } + + create_M_signal_fx( data_fx[0], data_fx[1], dmx_poc_data, L_deposit_h( dmx_weight ), input_frame, hStereoDmxEVS->s_wnd_fx, + hStereoDmxEVS->dmx_weight_fx, hStereoDmxEVS->pre_dmx_energy_fx, hStereoDmxEVS->pre_dmx_energy_fx_e, hStereoDmxEVS->aux_dmx_energy_fx, hStereoDmxEVS->aux_dmx_energy_fx_e ); + + // Downscaling signals to avoid accumulation overflows + scale_sig32( data_fx[0], input_frame, -5 ); // Q31->Q26 + scale_sig32( data_fx[1], input_frame, -5 ); // Q31->Q26 + scale_sig32( dmx_poc_data, input_frame, -5 ); // Q31->Q26 + + /* pha */ + + pha_len = hStereoDmxEVS->hPHA->pha_len; + move16(); + fad_len = hStereoDmxEVS->hPHA->fad_len; + move16(); + fad_g = hStereoDmxEVS->hPHA->fad_g_fx; + + set_zero_fx( dmx_pha_data, n_samples ); + set_zero_fx( mem_prev, fad_len ); + + FOR( k = 0; k < CPE_CHANNELS; k++ ) + { + p_data = data_fx[k]; + Copy32( hStereoDmxEVS->hPHA->data_mem_fx[k], data_mem, pha_len ); + Copy32( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem_fx[k], pha_len ); + p_data_mem = &( data_mem[pha_len] ); + Copy32( p_data, p_data_mem, n_samples ); + + p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps_fx[k]; + IF( p_prev_taps ) + { + FOR( n = 0; n < fad_len; n++ ) + { + FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) + { + // ftmp += p_data_mem[n - m] * p_prev_taps[m]; + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_prev_taps[m] ) ); // Q25 + } + fx_tmp = L_shl( fx_tmp, 1 ); // Q26 + mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); + move32(); + } + } + ELSE + { + FOR( n = 0; n < fad_len; n++ ) + { + // mem_prev[n] += p_data[n] * INV_SQRT_2; + mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 + move32(); + } + } + + p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps_fx[k]; + IF( p_curr_taps ) + { + FOR( n = 0; n < n_samples; n++ ) + { + FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) + { + // ftmp += p_data_mem[n - m] * p_curr_taps[m]; + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_curr_taps[m] ) ); // Q25 + } + fx_tmp = L_shl( fx_tmp, 1 ); // Q26 + // dmx_pha_data[n] += ftmp * INV_SQRT_2; + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); // Q26 + move32(); + } + } + ELSE + { + FOR( n = 0; n < n_samples; n++ ) + { + // dmx_pha_data[n] += p_data[n] * INV_SQRT_2; + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 + move32(); + } + } + } + + FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len; ( n++, m-- ) ) + { + dmx_pha_data[n] = Mpy_32_32( dmx_pha_data[n], fad_g[n] ); + move32(); + dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( mem_prev[n], fad_g[m] ) ); // Q26 + move32(); + } + + /* prc switch */ + + prev_prc = hStereoDmxEVS->hPHA->curr_prc; + move32(); + // if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) + IF( GT_16( abs_s( hStereoDmxEVS->itd_fx ), hStereoDmxEVS->hPHA->prc_thres ) ) + { + IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + move16(); + } + + if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + move32(); + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; + move32(); + } + ELSE + { + IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_PHA ) ) + { + IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_PHA ) ) + { + hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + move16(); + } + + if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; + move32(); + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; + move32(); + } + + // if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) + test(); + test(); + test(); + test(); + IF( EQ_16( is_transient, 1 ) || + BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[0], hStereoDmxEVS->aux_dmx_energy_fx_e[0], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[1] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[1], 14 ) ) > 0 || + BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[1], hStereoDmxEVS->aux_dmx_energy_fx_e[1], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[0] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[0], 14 ) ) > 0 || + EQ_16( hStereoDmxEVS->hPHA->force_poc, TRUE ) ) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + move32(); + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + move16(); + } + + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + IF( NE_32( prev_prc, hStereoDmxEVS->hPHA->curr_prc ) && EQ_16( is_transient, 0 ) && !( ( BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->hPHA->dmx_pha_ener_fx, hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e, hStereoDmxEVS->hPHA->low_egy_thres_sgc, hStereoDmxEVS->hPHA->low_egy_thres_sgc_e ) < 0 ) && ( BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->hPHA->dmx_poc_ener_fx, hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e, hStereoDmxEVS->hPHA->low_egy_thres_sgc, hStereoDmxEVS->hPHA->low_egy_thres_sgc_e ) < 0 ) ) ) + { + IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->dmx_poc_ener_fx, hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_min( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_max( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + + apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + ELSE + { + apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->dmx_pha_ener_fx, hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_min( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_max( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + + apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + } + ELSE + { + apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + + apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + } + + IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + { + p_dmx_data = dmx_poc_data; + p_dmx_data_fo = dmx_pha_data; + } + ELSE + { + p_dmx_data = dmx_pha_data; + p_dmx_data_fo = dmx_poc_data; + } + + IF( EQ_16( is_transient, 1 ) ) + { + n_fad_r = 1; + move16(); + } + ELSE + { + n_fad_r = STEREO_DMX_EVS_FAD_R; + move16(); + } + + IF( NE_32( prev_prc, hStereoDmxEVS->hPHA->curr_prc ) ) + { + IF( EQ_16( hStereoDmxEVS->hPHA->n_fad_g, input_frame ) ) + { + hStereoDmxEVS->hPHA->n_fad_g = 0; + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->n_fad_g = sub( input_frame, add( hStereoDmxEVS->hPHA->n_fad_g, 1 ) ); + IF( EQ_16( is_transient, 1 ) ) + { + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + } + ELSE + { + hStereoDmxEVS->hPHA->n_fad_cnt = sub( n_fad_r, hStereoDmxEVS->hPHA->n_fad_cnt ); + } + } + } + ELSE IF( is_transient ) + { + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + } + + fad_len = s_min( n_samples, sub( mult0( input_frame, n_fad_r ), add( mult0( hStereoDmxEVS->hPHA->n_fad_g, n_fad_r ), hStereoDmxEVS->hPHA->n_fad_cnt ) ) ); + + IF( NE_16( fad_len, 0 ) ) + { + fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; + move32(); + n_fad_g = hStereoDmxEVS->hPHA->n_fad_g; + n_fad_cnt = hStereoDmxEVS->hPHA->n_fad_cnt; + move16(); + move16(); + m_fad_g = sub( input_frame, add( n_fad_g, 1 ) ); + + FOR( n = 0; n < fad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + + n_fad_cnt = add( n_fad_cnt, 1 ); + IF( GE_16( n_fad_cnt, n_fad_r ) ) + { + n_fad_cnt = 0; + move16(); + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } + } + + hStereoDmxEVS->hPHA->n_fad_g = n_fad_g; + hStereoDmxEVS->hPHA->n_fad_cnt = n_fad_cnt; + move16(); + move16(); + } + + Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 + +#else Word16 n; Word16 dmx_weight, corr; // Q15 Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 @@ -2149,6 +3156,7 @@ void stereo_dmx_evs_enc_fx( } Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 +#endif return; } @@ -2359,6 +3367,12 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_16_Q0; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_16; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); +#endif } ELSE IF( EQ_32( input_Fs, 32000 ) ) { @@ -2370,6 +3384,12 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_32_Q0; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_32; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); +#endif } ELSE IF( EQ_32( input_Fs, 48000 ) ) { @@ -2381,6 +3401,12 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_48_Q0; move32(); +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_48; + hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; + move32(); + move16(); +#endif } ELSE { @@ -2389,8 +3415,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->pha_len = shr( len, 1 ); move16(); +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->init_frmCntr = 10; // (int16_t)(FRAMES_PER_SEC * 0.2f) move16(); +#endif hStereoDmxEVS->hPHA->isd_rate_s_fx = 0; move32(); hStereoDmxEVS->hPHA->iccr_s_fx = 0; @@ -2442,23 +3470,25 @@ ivas_error stereo_dmx_evs_init_encoder_fx( ipd_ff = hStereoDmxEVS->hPHA->ipd_ff_fx; Copy32( ipd_ff_Q31, ipd_ff, STEREO_DMX_EVS_NB_SUBBAND_MAX ); - // a_min = 0.8576958985908941f; - // a_max = 0.9440608762859234f; - // itrh = (int16_t)((3000 * input_frame) / (input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE)); /* 3kHz */ - // n0 = L_FRAME16k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE); - // a_step = (a_min - a_max) / (n0 + 1 - itrh); - // for (n = 0; n < itrh; n++) - //{ - // ipd_ff[n] = a_max; - // } - // for (; n < (n0 + 1); n++) /* 8kHz */ - //{ - // ipd_ff[n] = a_max + (n - itrh) * a_step; - // } - // for (; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++) - //{ - // ipd_ff[n] = a_min; - // } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + hStereoDmxEVS->hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; + hStereoDmxEVS->hPHA->force_poc = FALSE; + move16(); + move32(); + + hStereoDmxEVS->hPHA->pha_ipd_chan_cnt = 0; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chan_thresh = 10; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chan2rephase = 1; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_previouschan2rephase = 1; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chanswitch = 0; + move16(); + hStereoDmxEVS->hPHA->pha_ipd_chanswitch_allowed = 0; + move16(); +#endif set32_fx( hStereoDmxEVS->hPHA->Pr_fx, MAX_32, STEREO_DMX_EVS_NB_SUBBAND_MAX ); set_zero_fx( hStereoDmxEVS->hPHA->Pi_fx, STEREO_DMX_EVS_NB_SUBBAND_MAX ); @@ -2510,6 +3540,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->prc_hys_cnt = 0; move16(); +#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA // hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f ); SWITCH( input_Fs ) { @@ -2533,9 +3564,11 @@ ivas_error stereo_dmx_evs_init_encoder_fx( IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); BREAK; } - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; +#endif + fad_len = input_frame; move16(); fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; + move32(); // fad_r = 1.0f / (float) ( fad_len + 1 ); fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); fad_r = L_shl_r( fad_r, tmp_e ); @@ -2556,6 +3589,31 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); } +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA + + hStereoDmxEVS->hPHA->dmx_poc_ener_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e = 0; + move16(); + hStereoDmxEVS->hPHA->dmx_pha_ener_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e = 0; + move16(); + + hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e = 0; + move16(); + hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx = 0; + move32(); + hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e = 0; + move16(); + + hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = ONE_IN_Q15; + hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = ONE_IN_Q15; + +#endif + *hStereoDmxEVS_out = hStereoDmxEVS; return IVAS_ERR_OK; -- GitLab From ded7d14aac5cfd179b1e1b80f64c0dc84dd5f346 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 29 Apr 2025 17:39:47 +0200 Subject: [PATCH 0491/1310] remove UTF-8 BOMs at beginning of files --- lib_dec/lib_dec_fx.c | 2 +- lib_enc/init_enc_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 77deb9e7d..421137631 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1,4 +1,4 @@ -/****************************************************************************************************** +/****************************************************************************************************** (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 98d7fe957..cf79a4de3 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1,4 +1,4 @@ -/*==================================================================================== +/*==================================================================================== EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ -- GitLab From 8a5d21c9855023b9da4dfa0d80e1d4e12cfc002a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 29 Apr 2025 19:39:31 +0200 Subject: [PATCH 0492/1310] Fix for ivas-pytest-compare-to-input-anchor --- .gitlab-ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e03f48d00..b93061941 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -639,8 +639,6 @@ workflow: - report-junit.xml .ivas-pytest-compare-to-input-anchor: &ivas-pytest-compare-to-input-anchor - extends: - - .job-linux stage: test needs: ["build-codec-linux-make"] timeout: "360 minutes" -- GitLab From d584233e8cfa3ce51c96b212d8134d802b1cf7b3 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 29 Apr 2025 20:48:44 +0200 Subject: [PATCH 0493/1310] fix closing comment - this has confused the prepare_instrumentation.sh (to be more precise: parse_options_h.sh) script --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index f95bc9138..7bcd5473d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -98,7 +98,7 @@ #define NONBE_FIX_949_MC_5MS_FRAMING /*Dlb: Issue 949: fix for 5ms framing/rendering in MC mode */ #define NONBE_FIX_952_MC_PARAMUPMIX_5MS /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/ -//#define SPLIT_REND_WITH_HEAD_ROT_NEW /* Orange: split rendering code differ between branchs main-pc and float-pc, do not know what to do/ +//#define SPLIT_REND_WITH_HEAD_ROT_NEW /* Orange: split rendering code differ between branchs main-pc and float-pc, do not know what to do */ #define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT -- GitLab From 46b0f8045f18cf29b007a5a72378eac94f8b9552 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 28 Apr 2025 19:24:51 +0530 Subject: [PATCH 0494/1310] Q related fixed for encoder transition and decoder msan fixes --- lib_dec/ivas_mct_dec_fx.c | 2 +- lib_dec/ivas_stereo_dft_dec_dmx_fx.c | 2 ++ lib_enc/acelp_enc_util_fx.c | 12 ++++++------ lib_enc/enc_tran_fx.c | 3 ++- lib_enc/ivas_core_pre_proc_fx.c | 7 ++----- lib_enc/transition_enc_fx.c | 16 ++-------------- 6 files changed, 15 insertions(+), 27 deletions(-) diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 058b57593..bb985ac7b 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -402,7 +402,7 @@ ivas_error ivas_mct_dec_fx( test(); IF( ( st_ivas->sba_dirac_stereo_flag != 0 ) && ( NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) || GE_16( cpe_id, sub( nCPE, 2 ) ) ) ) { - Copy_Scale_sig_16_32_no_sat( synth_fx[n], synth_fx_32[n], L_FRAME48k, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11 + Copy_Scale_sig_16_32_no_sat( synth_fx[n], synth_fx_32[n], output_frame, sub( Q11, ( sub( 15, e_sig[n] ) ) ) ); // Q11 Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[n]->hHQ_core->old_out_fx, hCPE->hCoreCoder[n]->hHQ_core->old_out_fx32, output_frame, sub( Q11, hCPE->hCoreCoder[n]->hHQ_core->Q_old_wtda ) ); ivas_post_proc_fx( NULL, hCPE, n, synth_fx_32[n], NULL, output_frame, 1, Q11 ); Copy_Scale_sig_32_16( synth_fx_32[n], synth_fx[n], output_frame, sub( sub( 15, e_sig[n] ), Q11 ) ); // Q0 diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index e82005965..8035af217 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -102,6 +102,8 @@ void stereo_dft_unify_dmx_fx( Word16 num_plocs; Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; + set32_fx( DFT_PRED_RES, 0, STEREO_DFT32MS_N_32k ); + output_frame = extract_l( Mult_32_16( st0->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ samp_ratio = BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); diff --git a/lib_enc/acelp_enc_util_fx.c b/lib_enc/acelp_enc_util_fx.c index 181583e91..7f57b55da 100644 --- a/lib_enc/acelp_enc_util_fx.c +++ b/lib_enc/acelp_enc_util_fx.c @@ -180,9 +180,9 @@ void E_ACELP_conv( } void E_ACELP_conv_ivas_fx( - const Word16 xn2[], /* i Qx*/ + const Word16 xn2[], /* i Qnew - 1*/ const Word16 h2[], /* i Q12*/ - Word16 cn2[] /* o Q0*/ + Word16 cn2[] /* o Qnew*/ ) { Word16 i, k; @@ -194,14 +194,14 @@ void E_ACELP_conv_ivas_fx( { /*cn2[k] = xn2[k]; */ Word64 L_tmp_64; - L_tmp_64 = W_deposit32_l( L_mult0( xn2[k], 0x800 ) ); /* 4Q11 */ + L_tmp_64 = W_deposit32_l( L_mult0( xn2[k], 0x800 ) ); /* Qnew -1 + 12 */ FOR( i = 0; i < k; i++ ) { /*cn2[k]-=cn2[i]*h2[k-i];*/ - L_tmp_64 = W_msu0_16_16( L_tmp_64, cn2[i], h2[k - i] ); /*h2 4Q11*/ + L_tmp_64 = W_msu0_16_16( L_tmp_64, cn2[i], h2[k - i] ); /*Qnew + 11*/ } - L_tmp = W_sat_l( L_tmp_64 ); /* 4Q11 */ - cn2[k] = round_fx_o( L_shl_o( L_tmp, 5, &Overflow ), &Overflow ); /* Q0*/ + L_tmp = W_sat_l( L_tmp_64 ); /* Qnew + 11 */ + cn2[k] = round_fx_o( L_shl_o( L_tmp, 5, &Overflow ), &Overflow ); /* Qnew*/ move16(); } } diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 394b22c30..f308e9e87 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -545,7 +545,7 @@ Word16 encod_tran_ivas_fx( Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ - find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, + find_targets_ivas_new_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); @@ -555,6 +555,7 @@ Word16 encod_tran_ivas_fx( #else Scale_sig( h1, L_SUBFR, sub( 13, q_h1 ) ); #endif + /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn, L_SUBFR, shift ); diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 6fe6b6720..5853e2739 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -1174,11 +1174,8 @@ ivas_error ivas_compute_core_buffers_fx( ELSE IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) ) { Copy( &old_inp_16k_fx[L_frame_tmp], st->old_inp_16k_fx, L_INP_MEM ); - IF( Q_new ) - { - st->exp_old_inp_16k = sub( Q16, *Q_new ); //(*Q_new - 1) - move16(); - } + st->exp_old_inp_16k = sub(Q16, *Q_new); //(*Q_new - 1) + move16(); } ELSE IF( GT_32( input_Fs, 8000 ) ) { diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 5e50cac15..c724ffd6c 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -924,8 +924,6 @@ void transition_enc_ivas_fx( /* set limit_flag to 0 for restrained limits, and 1 for extended limits */ limit_flag = 0; move16(); - Word16 h1_fx_q15[L_SUBFR + ( M + 1 )]; - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 0 ); pit_start = PIT_MIN; move16(); @@ -1443,12 +1441,7 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, ( Q_new + shift - 1 ) ); move16(); -#ifdef TEST_HR - Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ) ); -#else - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); -#endif - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, + lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx, xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) @@ -1684,12 +1677,7 @@ void transition_enc_ivas_fx( *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, Q_new ); move16(); -#ifdef TEST_HR - Copy( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ) ); -#else - Copy_Scale_sig( h1_fx, h1_fx_q15, L_SUBFR + ( M + 1 ), 1 ); -#endif - lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx_q15, + lp_select = lp_filt_exc_enc_ivas_fx( MODE1, TRANSITION, i_subfr, exc_fx, h1_fx, xn_fx, y1_fx, xn2_fx, L_SUBFR, st_fx->L_frame, g_corr_fx, *clip_gain, gain_pit_fx, &lp_flag ); IF( EQ_16( lp_flag, NORMAL_OPERATION ) ) { -- GitLab From a0f7b9ad985fb60dfa47e5057f2afb1b76ccad9d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 29 Apr 2025 08:11:58 +0530 Subject: [PATCH 0495/1310] Clang formatting changes --- lib_dec/ivas_stereo_dft_dec_dmx_fx.c | 2 +- lib_enc/enc_tran_fx.c | 2 +- lib_enc/ivas_core_pre_proc_fx.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index 8035af217..cdb64e46c 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -103,7 +103,7 @@ void stereo_dft_unify_dmx_fx( Word32 plocsi[STEREO_DFT_RES_N_PEAKS_MAX]; set32_fx( DFT_PRED_RES, 0, STEREO_DFT32MS_N_32k ); - + output_frame = extract_l( Mult_32_16( st0->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ samp_ratio = BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index f308e9e87..865972819 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -546,7 +546,7 @@ Word16 encod_tran_ivas_fx( Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ find_targets_ivas_new_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, - res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); + res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); Copy_Scale_sig( h1, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 5853e2739..e2c099cd2 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -1174,7 +1174,7 @@ ivas_error ivas_compute_core_buffers_fx( ELSE IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) ) { Copy( &old_inp_16k_fx[L_frame_tmp], st->old_inp_16k_fx, L_INP_MEM ); - st->exp_old_inp_16k = sub(Q16, *Q_new); //(*Q_new - 1) + st->exp_old_inp_16k = sub( Q16, *Q_new ); //(*Q_new - 1) move16(); } ELSE IF( GT_32( input_Fs, 8000 ) ) -- GitLab From 9585f03fd4c0c025d93f27d25a928098c5413bc5 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Apr 2025 08:22:37 +0200 Subject: [PATCH 0496/1310] update CI ref --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 364e522aa..59c8d2b72 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 4eb4c0dfbdc845280a9994b5f7540f69c737537b + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 7c6b6f261883e282ebe050e18d48c00ce623b8be include: - local: .gitlab-ci/variables.yml -- GitLab From 7748c9d9bb56bbaedff4f11201382a04a6215546 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Apr 2025 08:50:20 +0200 Subject: [PATCH 0497/1310] update commit to point to CI repo main --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 59c8d2b72..4b7d05c7b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 7c6b6f261883e282ebe050e18d48c00ce623b8be + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF f5e61349c22ededcdfe1cc54e533dea477f2d003 include: - local: .gitlab-ci/variables.yml -- GitLab From ac17f4d1fe6fa8764b0b681ccacf6e0fd15a3372 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Apr 2025 08:01:15 +0200 Subject: [PATCH 0498/1310] add missing reference to common before_script section --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4b7d05c7b..1f5a98321 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1596,6 +1596,7 @@ voip-be-on-merge-request: GET_WMOPS_ARGS: "mem_only" timeout: 3 hours 30 minutes before_script: + - !reference [ .job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh -- GitLab From d2434f48518de163574aec2ab0e3dc8d9497464f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Tue, 29 Apr 2025 01:21:37 +0200 Subject: [PATCH 0499/1310] Inherit before_script from .test-job-linux --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1f5a98321..bb2259810 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1596,7 +1596,7 @@ voip-be-on-merge-request: GET_WMOPS_ARGS: "mem_only" timeout: 3 hours 30 minutes before_script: - - !reference [ .job-linux, before_script ] + - !reference [ .test-job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh -- GitLab From e5640c2b37ba403cd4195e4468de87561facdde4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 29 Apr 2025 14:54:13 +0530 Subject: [PATCH 0500/1310] Fix for 3GPP issue 1525: Second channel of BASOP decoder MASA format output to FOA has missing energy or wrong signal Link #1525 --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 509eec6e2..37b5f1e05 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -2134,9 +2134,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); } - subtract_power_y = masa_stereo_type_detect->subtract_power_y_fx; // q_subtract_power_y - move32(); - a = 858993; /* ( 0.0004f in Q31 ); Temporal smoothing coefficient */ move32(); b = L_sub( ONE_IN_Q31, a ); /* Temporal smoothing coefficient */ @@ -2152,24 +2149,42 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); masa_stereo_type_detect->q_target_power_y_smooth = q_com; move16(); - masa_stereo_type_detect->subtract_power_y_smooth_fx = - L_add( Mpy_32_32( a, subtract_power_y ), - Mpy_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); //(Q31, q_subtract_power_y) -> q_subtract_power_y + + IF( NE_16( masa_stereo_type_detect->q_subtract_power_y, masa_stereo_type_detect->q_subtract_power_y_smooth ) ) + { + exp = s_min( add( masa_stereo_type_detect->q_subtract_power_y, norm_l( masa_stereo_type_detect->subtract_power_y_fx ) ), add( masa_stereo_type_detect->q_subtract_power_y_smooth, norm_l( masa_stereo_type_detect->subtract_power_y_smooth_fx ) ) ); + masa_stereo_type_detect->subtract_power_y_fx = L_shl( masa_stereo_type_detect->subtract_power_y_fx, sub( exp, masa_stereo_type_detect->q_subtract_power_y ) ); + move32(); + masa_stereo_type_detect->subtract_power_y_smooth_fx = L_shl( masa_stereo_type_detect->subtract_power_y_smooth_fx, sub( exp, masa_stereo_type_detect->q_subtract_power_y_smooth ) ); + move32(); + masa_stereo_type_detect->q_subtract_power_y = exp; + move16(); + masa_stereo_type_detect->q_subtract_power_y_smooth = exp; + move16(); + } + subtract_power_y = masa_stereo_type_detect->subtract_power_y_fx; // q_subtract_power_y move32(); + W_temp = W_add( W_mult0_32_32( a, subtract_power_y ), W_mult0_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + exp = W_norm( W_temp ); + masa_stereo_type_detect->subtract_power_y_smooth_fx = W_extract_h( W_shl( W_temp, exp ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + exp - 32 + move32(); + masa_stereo_type_detect->q_subtract_power_y_smooth = sub( add( masa_stereo_type_detect->q_subtract_power_y_smooth, exp ), 1 ); + move16(); + exp = 0; move16(); IF( masa_stereo_type_detect->target_power_y_smooth_fx != 0 ) { subtract_target_ratio = L_sub( BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ), BASOP_Util_Log2( masa_stereo_type_detect->target_power_y_smooth_fx ) ); // Q25 - exp = sub( masa_stereo_type_detect->q_subtract_power_y, q_com ); + exp = sub( masa_stereo_type_detect->q_subtract_power_y_smooth, q_com ); L_tmp = Mpy_32_32( L_sub( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ); // Q25 } ELSE { subtract_target_ratio = BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ); // Q25 - exp = sub( 31, masa_stereo_type_detect->q_subtract_power_y ); + exp = sub( 31, masa_stereo_type_detect->q_subtract_power_y_smooth ); L_tmp = L_sub( Mpy_32_32( L_add( subtract_target_ratio, L_shl( exp, 25 ) ), LOG10_2_Q31 ), -503316480 /* L_shl( -15, 25 ) */ /*log(EPSILON)*/ ); // Q25 } subtract_target_ratio_db = Mpy_32_32( 1342177280 /* 10.0f * in Q27*/, L_tmp ); // (Q27, (Q25, Q31)) -> (Q27, Q25) -> Q21 @@ -2178,6 +2193,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); masa_stereo_type_detect->subtract_power_y_fx = 0; move32(); + masa_stereo_type_detect->q_subtract_power_y = Q31; + move16(); } /*-----------------------------------------------------------------* -- GitLab From 9b20d04ce34cdf85e5e838a3ac26daba4d05e418 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 29 Apr 2025 23:34:46 +0200 Subject: [PATCH 0501/1310] Correct value of q_ap_fade_mem_fx. Add Q_old_out_fx32 to represent Q of 32 bit versions of out_old buffers and avoid mixing it with 16 bit versions. --- lib_dec/hq_core_dec_fx.c | 4 ++++ lib_dec/ivas_core_dec_fx.c | 8 ++++++++ lib_dec/ivas_cpe_dec_fx.c | 6 ++++-- lib_dec/ivas_jbm_dec_fx.c | 15 ++++++--------- lib_dec/ivas_mdct_core_dec_fx.c | 3 ++- lib_dec/ivas_post_proc_fx.c | 2 +- lib_dec/ivas_stereo_switching_dec_fx.c | 3 +++ lib_dec/stat_dec.h | 4 +++- 8 files changed, 31 insertions(+), 14 deletions(-) diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 4d1ef6774..453b89924 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -1205,6 +1205,10 @@ void HQ_core_dec_init_fx( move16(); move16(); move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hHQ_core->Q_old_out_fx32 = Q11; + move16(); +#endif hHQ_core->last_hq_core_type = -1; /* Q0 */ move16(); diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index 6ca2982f5..a27213b6e 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -337,6 +337,10 @@ ivas_error ivas_core_dec_fx( Copy_Scale_sig_16_32_no_sat( sts[0]->hHQ_core->old_out_LB_fx, sts[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, sts[0]->hHQ_core->Q_old_wtda_LB ) ); // Q11 L_lerp_fx_q11( sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->L_frame, sts[0]->last_L_frame ); Copy_Scale_sig_32_16( sts[0]->hHQ_core->old_out_LB_fx32, sts[0]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( sts[0]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda_LB +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + sts[0]->hHQ_core->Q_old_out_fx32 = Q11; + move16(); +#endif } IF( NE_16( sts[0]->L_frame, L_FRAME16k ) ) { @@ -1403,6 +1407,10 @@ ivas_error ivas_core_dec_fx( { Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_LB_fx, st->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, st->hHQ_core->Q_old_wtda_LB ) ); // Q11 Copy_Scale_sig_16_32_no_sat( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_fx32, L_FRAME48k, sub( Q11, st->hHQ_core->Q_old_wtda ) ); // Q11 +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hHQ_core->Q_old_out_fx32 = Q11; + move16(); +#endif } IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index dcec695f3..ba63d8e8a 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -132,7 +132,9 @@ ivas_error ivas_cpe_dec_fx( IF( hCPE->hCoreCoder[ind1]->hHQ_core ) { Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( Q11, hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB ) ); // Q11 -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_out_fx32 = Q11; +#else hCPE->hCoreCoder[ind1]->hHQ_core->q_old_outLB_fx = Q11; #endif move16(); @@ -157,7 +159,7 @@ ivas_error ivas_cpe_dec_fx( test(); IF( hCPE->hCoreCoder[ind1] && hCPE->hCoreCoder[ind1]->hHQ_core ) { - Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda + Copy_Scale_sig_32_16( hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx32, hCPE->hCoreCoder[ind1]->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( hCPE->hCoreCoder[ind1]->hHQ_core->Q_old_wtda_LB, Q11 ) ); // Q_old_wtda_LB } } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index e313304e2..22c9423bf 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -435,12 +435,11 @@ ivas_error ivas_jbm_dec_tc_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB = q; - move16(); + hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 = q; #else hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; - move16(); #endif + move16(); } IF( hCPE->hStereoDft != NULL ) { @@ -956,12 +955,11 @@ ivas_error ivas_jbm_dec_tc_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ) ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, sub( q, hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ) ); // q #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB = q; - move16(); + hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 = q; #else hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; - move16(); #endif + move16(); } IF( hCPE->hStereoDft != NULL ) { @@ -1396,12 +1394,11 @@ ivas_error ivas_jbm_dec_tc_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_LB_fx32, L_FRAME32k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB ); // q Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, L_FRAME48k, q - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda ); // q #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - hCPE->hCoreCoder[0]->hHQ_core->Q_old_wtda_LB = q; - move16(); + hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 = q; #else hCPE->hCoreCoder[0]->hHQ_core->q_old_outLB_fx = q; - move16(); #endif + move16(); } IF( hCPE->hStereoDft != NULL ) { diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index fc757feec..c180426f1 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1277,7 +1277,8 @@ void ivas_mdct_core_reconstruct_fx( move16(); #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - Scale_sig( st->mem_syn2_fx, M, sub( negate( q_win ), 2 ) ); + Scale_sig( st->mem_syn2_fx, M, sub( -2, q_win ) ); + //Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn #endif } ELSE /*ACELP core for ACELP-PLC */ diff --git a/lib_dec/ivas_post_proc_fx.c b/lib_dec/ivas_post_proc_fx.c index b82cc1d00..4232116fa 100644 --- a/lib_dec/ivas_post_proc_fx.c +++ b/lib_dec/ivas_post_proc_fx.c @@ -589,7 +589,7 @@ void stereo_dft_dec_core_switching_fx( Copy32( st->hHQ_core->old_out_LB_fx32 + numZeros, hCPE->hStereoDft->ap_fade_mem_fx, ap_fade_len ); /*st->hHQ_core->q_old_outLB_fx*/ #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->Q_old_wtda_LB; + hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->Q_old_out_fx32; #else hCPE->hStereoDft->q_ap_fade_mem_fx = st->hHQ_core->q_old_outLB_fx; #endif diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 677c91ef0..454395648 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -418,6 +418,7 @@ ivas_error stereo_memory_dec_fx( test(); IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { + assert( hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 == hCPE->hCoreCoder[1]->hHQ_core->Q_old_out_fx32 ); v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[1]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */ v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */ @@ -2149,6 +2150,8 @@ void stereo_td2dft_update_fx( move16(); /* update buffers used for fading when switching to DFT Stereo */ + assert( sts[0]->hHQ_core->Q_old_out_fx32 == sts[1]->hHQ_core->Q_old_out_fx32 ); + v_add_fx( sts[0]->hHQ_core->old_out_LB_fx32 + nsLB, sts[1]->hHQ_core->old_out_LB_fx32 + nsLB, hCPE->old_outLB_mdct_fx, old_outLB_len ); L_lerp_fx_q11( hCPE->old_outLB_mdct_fx, hCPE->old_outLB_mdct_fx, STEREO_MDCT2DFT_FADE_LEN_48k, old_outLB_len ); FOR( i = 0; i < old_outLB_len; i++ ) diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 9d6f49436..2749c06b4 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -702,7 +702,9 @@ typedef struct hq_dec_structure Word16 exp_old_out; Word16 old_out_LB_fx[L_FRAME32k]; /* HQ core - previous synthesis for OLA for Low Band. Q_old_wtda_LB */ Word32 old_out_LB_fx32[L_FRAME32k]; -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Word16 Q_old_out_fx32; /* Q for both old_out_fx32 and old_out_LB_fx32 */ +#else Word16 q_old_outLB_fx; #endif Word16 Q_old_wtda_LB; -- GitLab From aecbdde8f450dfaa1f8d679190175a0f29cf28c8 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 29 Apr 2025 23:40:04 +0200 Subject: [PATCH 0502/1310] clang format --- lib_dec/ivas_mdct_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index c180426f1..d8c64d516 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1278,7 +1278,7 @@ void ivas_mdct_core_reconstruct_fx( #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->mem_syn2_fx, M, sub( -2, q_win ) ); - //Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn + // Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn #endif } ELSE /*ACELP core for ACELP-PLC */ -- GitLab From 51e39130bb2fbda03cc3e8d145e17f7f028698b6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 30 Apr 2025 11:56:09 +0530 Subject: [PATCH 0503/1310] Fix for 3GPP issue 1415: Cleanup of pre-processor macros Link #1415 --- lib_com/basop_util.c | 10 - lib_com/bitstream_fx.c | 2 - lib_com/cldfb_evs.c | 7 - lib_com/core_com_config.c | 55 +- lib_com/hq_conf_fx.c | 4 - lib_com/interleave_spectrum.c | 12 - lib_com/prot_fx.h | 81 +-- lib_com/swb_tbe_com_fx.c | 422 +----------- lib_com/tcx_mdct_window.c | 39 -- lib_com/tns_base.c | 20 - lib_dec/FEC_HQ_phase_ecu_fx.c | 525 --------------- lib_dec/TonalComponentDetection_fx.c | 9 - lib_dec/acelp_core_dec_fx.c | 5 - lib_dec/amr_wb_dec_fx.c | 5 - lib_dec/core_dec_init_fx.c | 116 ---- lib_dec/core_dec_switch_fx.c | 22 - lib_dec/dec_LPD_fx.c | 8 - lib_dec/dec_ace_fx.c | 7 - lib_dec/dec_acelp_tcx_main_fx.c | 4 - lib_dec/dec_tcx_fx.c | 3 - lib_dec/er_dec_tcx_fx.c | 114 ---- lib_dec/evs_dec_fx.c | 4 - lib_dec/fd_cng_dec_fx.c | 155 +---- lib_dec/gs_dec_amr_wb_fx.c | 43 -- lib_dec/hq_classifier_dec_fx.c | 10 - lib_dec/hq_core_dec_fx.c | 111 ---- lib_dec/hq_hr_dec_fx.c | 1 - lib_dec/ivas_output_config_fx.c | 10 - lib_dec/tns_base_dec_fx.c | 53 +- lib_dec/tonalMDCTconcealment_fx.c | 456 ------------- lib_dec/updt_dec_fx.c | 35 - lib_enc/cng_enc_fx.c | 5 - lib_enc/cod_tcx_fx.c | 628 ------------------ lib_enc/core_enc_init_fx.c | 7 - lib_enc/core_enc_switch_fx.c | 11 - lib_enc/core_enc_updt_fx.c | 14 - lib_enc/enc_pit_exc_fx.c | 5 - lib_enc/evs_enc_fx.c | 22 - lib_enc/ext_sig_ana_fx.c | 152 ----- lib_enc/hq_classifier_enc_fx.c | 195 +----- lib_enc/hq_core_enc_fx.c | 117 ---- lib_enc/hq_hr_enc_fx.c | 14 - lib_enc/init_enc_fx.c | 15 +- lib_enc/ivas_omasa_enc_fx.c | 5 - lib_enc/lib_enc.c | 36 +- lib_enc/mdct_classifier_fx.c | 78 +-- lib_enc/tcx_utils_enc_fx.c | 4 +- lib_enc/transient_detection_fx.c | 75 --- lib_enc/updt_enc_fx.c | 31 - .../ivas_dirac_dec_binaural_functions_fx.c | 14 - 50 files changed, 20 insertions(+), 3756 deletions(-) diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index ec15e9769..dc9013a42 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -1409,15 +1409,6 @@ Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, Word32 y, Word16 *s ) *s = 0; return ( (Word32) 0 ); } - -#if 0 - sign = L_xor( x, y ); /* check (sign < 0) for result negation */ - - if ( x < 0 ) - { - x = L_negate( x ); - } -#else IF( EQ_32( y, 0x80000000 ) ) { /* Division by -1.0: same as negation of numerator */ @@ -1429,7 +1420,6 @@ Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, Word32 y, Word16 *s ) } sign = y; move32(); -#endif if ( y < 0 ) { y = L_negate( y ); diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 07a6a632f..4fcac20b6 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -52,7 +52,6 @@ int16_t FEC_seed = 12558; /* Seed for random FEC generator */ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ -#ifndef IVAS_CODE float FEC_random = 0; /* FEC rate in percent (for simulation of FEC) */ /*-------------------------------------------------------------------* * file_read_FECpattern() @@ -109,7 +108,6 @@ static int16_t file_read_FECpattern( void ) return bfi; } #endif -#endif /*-------------------------------------------------------------------* * pack_bit() * diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs.c index c28a534d6..51c9ee6f9 100644 --- a/lib_com/cldfb_evs.c +++ b/lib_com/cldfb_evs.c @@ -981,10 +981,6 @@ ivas_error openCldfb( const Word16 type, /*!< analysis or synthesis */ const Word16 maxCldfbBands, /*!< number of cldfb bands */ const Word16 frameSize /*!< FrameSize */ -#ifdef ADD_IVAS_CLDFB - , - CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ -#endif ) { HANDLE_CLDFB_FILTER_BANK hs; @@ -996,9 +992,6 @@ ivas_error openCldfb( } hs->type = type; -#ifdef ADD_IVAS_CLDFB - hs->prototype = prototype; -#endif move16(); IF( type == CLDFB_ANALYSIS ) diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index f0ee8efd8..f75f28a18 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -246,67 +246,18 @@ Word16 getTcxonly_ivas_fx( } Word16 getTcxonly( -#ifdef IVAS_CODE_SWITCHING - const Word16 element_mode, /* i : IVAS element mode */ -#endif const Word32 total_brate /* i : total bitrate */ -#ifdef IVAS_CODE_SWITCHING - , - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const int16_t is_ism_format /* i : flag indicating ISM format */ -#endif ) { Word16 tcxonly; tcxonly = 0; move16(); -#ifdef IVAS_CODE_SWITCHING - SWITCH( element_mode ) + if ( GT_32( total_brate, 32000 ) ) { - case EVS_MONO: -#endif - if ( GT_32( total_brate, 32000 ) ) - { - tcxonly = 1; - move16(); - } -#ifdef IVAS_CODE_SWITCHING - break; - case IVAS_SCE: - if ( is_ism_format ) - { - if ( total_brate > MAX_ACELP_BRATE_ISM ) - { - tcxonly = 1; - } - } - else - { - if ( total_brate > MAX_ACELP_BRATE ) - { - tcxonly = 1; - } - } - break; - - case IVAS_CPE_DFT: - case IVAS_CPE_TD: - if ( total_brate > MAX_ACELP_BRATE ) - { - tcxonly = 1; - } - break; - case IVAS_CPE_MDCT: - if ( total_brate >= ( MCT_flag ? IVAS_32k : IVAS_48k ) ) - { - tcxonly = 1; - } - break; -#endif -#ifdef IVAS_CODE_SWITCHING + tcxonly = 1; + move16(); } -#endif return tcxonly; /*Q0*/ } diff --git a/lib_com/hq_conf_fx.c b/lib_com/hq_conf_fx.c index 503975363..f6a01adfc 100644 --- a/lib_com/hq_conf_fx.c +++ b/lib_com/hq_conf_fx.c @@ -303,11 +303,7 @@ void hq_configure_evs_fx( *start_norm = 0; move16(); -#ifndef SOLVED_COMP_ENC_DEC IF( EQ_16( length, L_FRAME48k ) ) /*tbv SOLVED_COMP_ENC_DEC*/ -#else - IF( EQ_16( length, L_SPEC48k ) ) -#endif { IF( EQ_16( hqswb_clas, HQ_GEN_FB ) ) { diff --git a/lib_com/interleave_spectrum.c b/lib_com/interleave_spectrum.c index 5c4c98e29..e8bb728ff 100644 --- a/lib_com/interleave_spectrum.c +++ b/lib_com/interleave_spectrum.c @@ -63,11 +63,7 @@ void interleave_spectrum_fx( /* Common inits */ p1 = coefs; /*Q12*/ p_out = coefs_out; -#ifdef SOLVED_COMP_ENC_DEC - IF( EQ_16( length, L_SPEC48k ) ) -#else IF( EQ_16( length, L_FRAME48k ) ) -#endif { bw = intl_bw_48; /*Q0*/ cnt = intl_cnt_48; /*Q0*/ @@ -337,20 +333,12 @@ void de_interleave_spectrum_fx( p1 = coefs_out; l_frame = length; move16(); -#ifdef SOLVED_COMP_ENC_DEC - IF( EQ_16( length, L_SPEC48k ) ) -#else IF( EQ_16( length, L_FRAME48k ) ) -#endif { bw = intl_bw_48; /*Q0*/ cnt = intl_cnt_48; /*Q0*/ grps = N_INTL_GRP_48; move16(); -#ifdef SOLVED_COMP_ENC_DEC - l_frame = L_FRAME48k; - move16(); -#endif p2 = coefs_out + sublen[2]; /* 240, length/4 */ p3 = coefs_out + sublen[4]; /* 480, 2*length/4 */ p4 = coefs_out + sublen[5]; /* 720, 3*length/4 */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 86b5ec0b7..fde3949fd 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3062,20 +3062,6 @@ void GenShapedSHBExcitation_fx( Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, const Word16 prev_bfi -#ifdef ADD_IVAS_TBE_CODE - , /* i : previous frame was concealed */ - const Word16 element_mode, /* i : element mode */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ - Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ - const Word32 extl_brate, /* i : extension layer bitarte */ - const Word16 MSFlag, /* i : Multi Source flag */ - Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ - Word16 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ - Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ - Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ - Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -#endif ); void GenShapedSHBExcitation_ivas_enc_fx( @@ -3152,7 +3138,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, const Word16 prev_bfi -#if 1 // def ADD_IVAS_TBE_CODE , /* i : previous frame was concealed */ const Word16 element_mode, /* i : element mode */ const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ @@ -3165,7 +3150,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -#endif ); void GenSHBSynth_fx( @@ -3309,9 +3293,6 @@ void synthesise_fb_high_band_fx( #ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ -#ifdef ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif const Word16 i_subfr_fx, /* i : subframe index */ const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ @@ -3326,21 +3307,12 @@ void prep_tbe_exc_fx( Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ Word32 core_brate /* i :core bitrate */ -#ifdef ADD_IVAS_TBE_CODE - , - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif ); #endif void prep_tbe_exc_ivas_fx( const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE const Word16 L_subfr, -#endif const Word16 i_subfr_fx, /* i : subframe index */ const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ @@ -3355,13 +3327,11 @@ void prep_tbe_exc_ivas_fx( Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE , /* i : core bitrate */ const Word16 element_mode, /* i : element mode */ const Word16 idchan, /* i : channel ID */ const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif ); Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ @@ -4180,15 +4150,7 @@ Word16 get_codec_mode( ); Word16 getTcxonly( -#ifdef IVAS_CODE_SWITCHING - const Word16 element_mode, /* i : IVAS element mode */ -#endif const Word32 total_brate /* i : total bitrate */ -#ifdef IVAS_CODE_SWITCHING - , - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const int16_t is_ism_format /* i : flag indicating ISM format */ -#endif ); Word16 getTcxonly_fx( @@ -6578,10 +6540,6 @@ void TonalMDCTConceal_SaveFreqSignal( const Word16 *scaleFactors, const Word16 *scaleFactors_exp, const Word16 gain_tcx_exp -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const Word16 infoIGFStartLine -#endif ); void TonalMDCTConceal_SaveFreqSignal_ivas_fx( @@ -6650,9 +6608,6 @@ void TonalMDCTConceal_InsertNoise( Word16 *pSeed, /*IN/OUT*/ const Word16 tiltCompFactor, Word16 crossfadeGain, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16concealment_noise[L_FRAME48k], -#endif const Word16 crossOverFreq ); void TonalMDCTConceal_SaveTimeSignal( @@ -7646,9 +7601,6 @@ void configureFdCngDec_fx( Word16 ApplyFdCng_fx( Word16 *timeDomainInput, /* i : pointer to time domain i */ Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - Word16 *powerSpectrum, -#endif Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer */ Word32 **cldfbBufferImag, /* i/o: imaginary part of the CLDFB buffer */ Word16 *cldfbBufferScale, /* o : pointer to the scalefactor for real and imaginary part of the CLDFB buffer */ @@ -7672,9 +7624,6 @@ Word16 ApplyFdCng_ivas_fx( void perform_noise_estimation_dec_fx( const Word16 *timeDomainInput, /* i: pointer to time domain i */ const Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - float *power_spectrum, -#endif HANDLE_FD_CNG_DEC hFdCngDec /* i/o: FD_CNG structure containing all buffers and variables */ ); @@ -8389,10 +8338,6 @@ void improv_amr_wb_gs_fx( const Word16 Last_ener_fx, /* i : Last energy (Q8) Q0*/ const Word16 rate_switching_reset, /* i : rate switching reset flag Q0*/ const Word16 last_coder_type /* i : Last coder_type Q0*/ -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ -#endif ); // dec_amr_wb_fx.c @@ -8444,18 +8389,7 @@ ivas_error ppp_quarter_decoder_fx( void open_decoder_LPD_fx( Decoder_State *st, const Word32 total_brate, /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - const Word32 last_total_brate, -#endif const Word16 bwidth /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - , - const Word16 is_mct, /* i : MCT mode flag */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16 last_element_mode, -#endif - const Word16 is_init /* i : indicate call from init_decoder() to avoid double TC initialization */ -#endif ); void open_decoder_LPD_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ @@ -9010,28 +8944,19 @@ void tcx_hm_modify_envelope( ); // tns_base_dec_fx.c -#ifdef IVAS_CODE -void -#else Word16 -#endif ReadTnsData( STnsConfig const *pTnsConfig, Decoder_State *st, Word16 *pnBits, Word16 *stream, Word16 *pnSize ); -#define IVAS_CODE -#ifdef IVAS_CODE + void -#else -Word16 -#endif ReadTnsData_ivas_fx( STnsConfig const *pTnsConfig, Decoder_State *st, Word16 *pnBits, Word16 *stream, Word16 *pnSize ); -#undef IVAS_CODE Word16 DecodeTnsData( STnsConfig const *pTnsConfig, Word16 const *stream, @@ -9454,10 +9379,6 @@ void con_tcx_fx( const Word16 coh, /* i : coherence of stereo signal */ Word16 *noise_seed, /* i/o: noise seed for stereo */ const Word16 only_left /* i : TD-PLC only in left channel */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const float *A_cng /* i : CNG LP filter coefficients */ -#endif #endif ); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 5631dfa94..d1883efde 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -2103,20 +2103,6 @@ void GenShapedSHBExcitation_fx( Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, const Word16 prev_bfi -#ifdef ADD_IVAS_TBE_CODE - , /* i : previous frame was concealed */ - const Word16 element_mode, /* i : element mode */ - const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ - Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ - Word16 *mixExc16k, /* i/o: exc spreading for IC-BWE */ - const Word32 extl_brate, /* i : extension layer bitarte */ - const Word16 MSFlag, /* i : Multi Source flag */ - Word16 EnvSHBres_4k[], /* i/o: TD envelope of the SHB residual signal */ - Word16 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */ - Word16 *prev_mix_factor, /* i/o: mixing factor in the previous frame */ - Word16 *Env_error, /* o : error in SHB residual envelope modelling*/ - Word16 Env_error_part[] /* o : per-segment error in SHB residual envelope modelling */ -#endif ) { Word16 i, j, k; @@ -2160,20 +2146,6 @@ void GenShapedSHBExcitation_fx( Word16 Q_temp; Word16 prev_Q_bwe_exc_fb; -#ifdef ADD_IVAS_TBE_CODE - Word32 tempD; - Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; - Word16 cbsize; - Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; - Word16 c0, c1, c2, c3, c4, c5, g1, g2, g, den; - Word16 EnvWhiteExc16k[L_FRAME16k], EnvExc16kWhtnd[L_FRAME16k]; - Word16 EnvWhiteExc16k_4k[L_FRAME4k] = { 0 }, EnvExc16kWhtnd_4k[L_FRAME4k] = { 0 }; - Word16 flag_plosive; - Word16 delta; - Word16 c0_part[NUM_SHB_SUBGAINS], c1_part[NUM_SHB_SUBGAINS], c2_part[NUM_SHB_SUBGAINS], c3_part[NUM_SHB_SUBGAINS], c4_part[NUM_SHB_SUBGAINS], c5_part[NUM_SHB_SUBGAINS]; - - mix_factor = 0.0f; -#endif set16_fx( zero_mem, 0, LPC_SHB_ORDER ); set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); @@ -2205,12 +2177,7 @@ void GenShapedSHBExcitation_fx( /* i: exc16k in Q_bwe_exc */ /* o: exc16kWhtnd in Q_bwe_exc */ - -#ifdef ADD_IVAS_TBE_CODE - IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) -#else IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { temp2 = 0; move16(); @@ -2244,11 +2211,7 @@ void GenShapedSHBExcitation_fx( Q_pow1 = shl( *Q_bwe_exc, 1 ); test(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( flag_ACELP16k, 0 ) ) -#else IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) -#endif { /* varEnvShape = mean_fx(voice_factors, 4); */ /* unroll the loop */ @@ -2294,11 +2257,7 @@ void GenShapedSHBExcitation_fx( test(); test(); test(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#else IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#endif { /* pre-init smoothing filter to avoid energy drop outs */ L_tmp = L_mult( excTmp2[0], 1638 ); @@ -2325,42 +2284,6 @@ void GenShapedSHBExcitation_fx( *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); move32(); } -#ifdef ADD_IVAS_TBE_CODE - if ( MSFlag > 0 ) - { - varEnvShape = 0.995f; - csfilt_num2[0] = 1.0f - varEnvShape; - csfilt_den2[1] = -varEnvShape; - } - - White_exc16k = exc16k; - - /* Track the low band envelope */ - if ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) - { - if ( extl_brate != SWB_TBE_1k10 && extl_brate != SWB_TBE_1k75 ) - { - mem_csfilt_left = 0.0f; - mem_csfilt_right = 0.0f; - for ( k = 0; k < L_FRAME16k; k++ ) - { - excNoisyEnvLeft[k] = mem_csfilt_left + csfilt_num2[0] * excTmp2[k]; - mem_csfilt_left = -csfilt_den2[1] * excNoisyEnvLeft[k]; - excNoisyEnvRight[L_FRAME16k - k - 1] = mem_csfilt_right + csfilt_num2[0] * excTmp2[L_FRAME16k - k - 1]; - mem_csfilt_right = -csfilt_den2[1] * excNoisyEnvRight[L_FRAME16k - k - 1]; - } - - alpha = 0.0f; - step = 1.0f / L_FRAME16k; - for ( k = 0; k < L_FRAME16k; k++ ) - { - excNoisyEnv[k] = alpha * excNoisyEnvLeft[k] + ( 1 - alpha ) * excNoisyEnvRight[k]; - alpha += step; - } - } - } - else -#endif { /* Track the low band envelope */ L_tmp = *mem_csfilt; @@ -2376,21 +2299,6 @@ void GenShapedSHBExcitation_fx( *mem_csfilt = L_tmp; move32(); } -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - /* generate gaussian (white) excitation */ - for ( k = 0; k < L_FRAME16k; k++ ) - { - White_exc16k[k] = (float) own_random( &bwe_seed[0] ); - } - - /* normalize the amplitude of the gaussian excitation to that of the LB exc. */ - pow22 = POW_EXC16k_WHTND; - v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), White_exc16k, L_FRAME16k ); - } - else -#endif { /* create a random excitation - Reuse exc16k memory */ White_exc16k = exc16k; @@ -2439,98 +2347,10 @@ void GenShapedSHBExcitation_fx( Q_pow22 = shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ); } -#ifdef ADD_IVAS_TBE_CODE - flag_plosive = 0; - move16(); - test(); - test(); - test(); - IF(GE_32(extl_brate, SWB_TBE_2k8) || EQ_32(extl_brate, SWB_TBE_1k10) || EQ_32(extl_brate, SWB_TBE_1k75))) -#else IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ { -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - /* calculate TD envelopes of exc16kWhtnd and White_exc16k */ - find_td_envelope( White_exc16k, L_FRAME16k, 20, NULL, EnvWhiteExc16k ); - find_td_envelope( exc16kWhtnd, L_FRAME16k, 20, NULL, EnvExc16kWhtnd ); - - for ( k = 0; k < L_FRAME4k; k++ ) - { - EnvWhiteExc16k_4k[k] = EnvWhiteExc16k[4 * k]; - EnvExc16kWhtnd_4k[k] = EnvExc16kWhtnd[4 * k]; - } - - /* calculate the optimal mix factor */ - c0 = c1 = c2 = c3 = c4 = c5 = 0.0f; - for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c1_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c2_part[i] = sum2_f( &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c3_part[i] = -2.0f * dotp( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c4_part[i] = 2.0f * dotp( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], &EnvWhiteExc16k_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - c5_part[i] = sum2_f( &EnvSHBres_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS ); - - c0 += c0_part[i]; - c1 += c1_part[i]; - c2 += c2_part[i]; - c3 += c3_part[i]; - c4 += c4_part[i]; - c5 += c5_part[i]; - } - - den = 4.0f * c0 * c2 - c4 * c4; - g1 = ( c3 * c4 - 2 * c1 * c2 ) / den; - g2 = ( c1 * c4 - 2 * c0 * c3 ) / den; - - *Env_error = 0.0f; - flag_plosive = 0; - for ( i = 0; i < NUM_SHB_SUBGAINS; i++ ) - { - Env_error_part[i] = c5_part[i] + g1 * g1 * c0_part[i] + g1 * c1_part[i] + g2 * g2 * c2_part[i] + g2 * c3_part[i] + g1 * g2 * c4_part[i]; - *Env_error += Env_error_part[i]; - - if ( Env_error_part[i] > THR_ENV_ERROR_PLOSIVE ) - { - /* envelope error is too high -> likely a plosive */ - flag_plosive = 1; - } - } - - if ( flag_plosive ) - { - /* plosive detected -> set the mixing factor to 0 */ - *vf_ind = 0; - mix_factor = 0.0f; - } - else - { - /* normalize gain */ - g = g2 / ( g1 + g2 ); - - /* quantization of the mixing factor */ - cbsize = 1 << NUM_BITS_SHB_VF; - delta = 1.0f / ( cbsize - 1 ); - if ( g > 1.0f ) - { - g = 1.0f; - } - else if ( g < delta ) - { - /* prevent low gains to be quantized to 0 as this is reserved for plosives */ - g = delta; - } - - *vf_ind = usquant( g, &mix_factor, 0.0f, 1.0f / ( cbsize - 1 ), cbsize ); - } - } - else -#endif { Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); @@ -2547,21 +2367,6 @@ void GenShapedSHBExcitation_fx( } ELSE /* decoder side */ { -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - if ( *vf_ind == 0 ) - { - mix_factor = 0.0f; - flag_plosive = 1; - } - else - { - mix_factor = usdequant( *vf_ind, 0.0f, 1.0f / ( ( 1 << NUM_BITS_SHB_VF ) - 1 ) ); - } - } - else -#endif { /* *vf_ind is an integer scale by 0.125f*/ tmp = shl( *vf_ind, ( 15 - 3 ) ); @@ -2574,9 +2379,6 @@ void GenShapedSHBExcitation_fx( } } } -#ifdef ADD_IVAS_TBE_CODE - IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) -#endif { voice_factors[0] = mult_r( voice_factors[0], tmp2 ); move16(); @@ -2590,14 +2392,6 @@ void GenShapedSHBExcitation_fx( move16(); } } -#ifdef ADD_IVAS_TBE_CODE - if ( element_mode >= IVAS_CPE_DFT && nlExc16k != NULL ) - { - /* save buffers for IC-BWE */ - mvr2r( exc16kWhtnd, nlExc16k, L_FRAME16k ); - v_multc( White_exc16k, (float) sqrt( pow1 / pow22 ), mixExc16k, L_FRAME16k ); - } -#endif tmp = sub( Q_temp, 3 ); FOR( k = 0; k < L_FRAME16k; k++ ) @@ -2611,47 +2405,8 @@ void GenShapedSHBExcitation_fx( deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ -#ifdef ADD_IVAS_TBE_CODE - if ( extl_brate == SWB_TBE_1k10 || extl_brate == SWB_TBE_1k75 ) - { - if ( !flag_plosive ) /* use only LB excitation in case of plosives */ - { - /* re-scale gaussian excitation at the beginning to gradually move from old energy to new energy */ - old_scale = (float) sqrt( *prev_pow_exc16kWhtnd / pow1 ); - new_scale = 1.0f; - step_scale = ( new_scale - old_scale ) / ( L_FRAME16k / 2 ); - scale = old_scale; - - /* interpolate between the old and the new value of the mixing factor */ - old_fact = *prev_mix_factor; - new_fact = mix_factor; - step = ( new_fact - old_fact ) / ( L_FRAME16k / 2 ); - fact = old_fact; - - /* mixing of LB and gaussian excitation in the first half of the frame */ - for ( k = 0; k < L_FRAME16k / 2; k++ ) - { - exc16kWhtnd[k] = (float) fact * ( White_exc16k[k] * scale ) + (float) ( 1 - fact ) * exc16kWhtnd[k]; - fact += step; - scale += step_scale; - } - - /* mixing of LB and gaussian excitation in the second half of the frame */ - for ( ; k < L_FRAME16k; k++ ) - { - exc16kWhtnd[k] = (float) new_fact * White_exc16k[k] + (float) ( 1 - new_fact ) * exc16kWhtnd[k]; - } - } - preemph( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - } - else -#endif { -#ifdef ADD_IVAS_TBE_CODE - if ( coder_type == UNVOICED || MSFlag == 1 ) -#else IF( EQ_16( coder_type, UNVOICED ) ) -#endif { L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ @@ -2753,11 +2508,7 @@ void GenShapedSHBExcitation_fx( } } -#ifdef ADD_IVAS_TBE_CODE - IF( LT_32( extl_brate, SWB_TBE_2k8 ) ) -#else IF( LT_32( bitrate, ACELP_24k40 ) ) -#endif { Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); /* i: exc16kWhtnd in Q_bwe_exc */ @@ -2866,10 +2617,6 @@ void GenShapedSHBExcitation_fx( set16_fx( White_exc16k_FB, 0, L_FRAME16k ); } -#ifdef ADD_IVAS_TBE_CODE - *prev_pow_exc16kWhtnd = pow1; - *prev_mix_factor = mix_factor; -#endif return; } @@ -3288,7 +3035,6 @@ void GenShapedSHBExcitation_ivas_enc_fx( { IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ { -#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! test(); IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { @@ -3474,33 +3220,6 @@ void GenShapedSHBExcitation_ivas_enc_fx( } } ELSE -#else - UNUSED_PARAM( Env_error_part ); - UNUSED_PARAM( Env_error ); - UNUSED_PARAM( EnvSHBres_4k ); - UNUSED_PARAM( c5_part ); - UNUSED_PARAM( c1 ); - UNUSED_PARAM( den ); - UNUSED_PARAM( c3_part ); - UNUSED_PARAM( c0 ); - UNUSED_PARAM( delta ); - UNUSED_PARAM( c3 ); - UNUSED_PARAM( c2_part ); - UNUSED_PARAM( c1_part ); - UNUSED_PARAM( EnvWhiteExc16k ); - UNUSED_PARAM( g2 ); - UNUSED_PARAM( c5 ); - UNUSED_PARAM( c4_part ); - UNUSED_PARAM( EnvWhiteExc16k_4k ); - UNUSED_PARAM( c2 ); - UNUSED_PARAM( g ); - UNUSED_PARAM( cbsize ); - UNUSED_PARAM( g1 ); - UNUSED_PARAM( EnvExc16kWhtnd ); - UNUSED_PARAM( c0_part ); - UNUSED_PARAM( EnvExc16kWhtnd_4k ); - UNUSED_PARAM( c4 ); -#endif { Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); @@ -4003,7 +3722,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( move16(); move32(); -#if 1 // def ADD_IVAS_TBE_CODE Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k]; Word16 cbsize; Word16 mix_factor, old_fact, new_fact, fact, old_scale, new_scale, step_scale; @@ -4018,7 +3736,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( mix_factor = 0; /* Q15 */ move16(); -#endif + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); set16_fx( wht_fil_mem, 0, LPC_WHTN_ORDER ); FOR( i = 0; i < L_FRAME32k; i = i + 2 ) @@ -4050,11 +3768,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( /* i: exc16k in Q_bwe_exc */ /* o: exc16kWhtnd in Q_bwe_exc */ -#if 1 // def ADD_IVAS_TBE_CODE IF( GE_32( extl_brate, SWB_TBE_2k8 ) ) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { temp2 = 0; move16(); @@ -4089,11 +3803,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( Q_pow1 = shl( *Q_bwe_exc, 1 ); test(); -#if 1 // ADD_IVAS_TBE_CODE + IF( flag_ACELP16k == 0 ) -#else - IF( ( LE_32( bitrate, ACELP_13k20 ) ) && ( GE_32( bitrate, ACELP_7k20 ) ) ) -#endif { /* varEnvShape = mean_fx(voice_factors, 4); */ /* unroll the loop */ @@ -4139,12 +3850,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( test(); test(); test(); -#if 1 // def ADD_IVAS_TBE_CODE - test(); + IF( EQ_16( element_mode, EVS_MONO ) && *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#else - IF( *mem_csfilt == 0 && ( ( EQ_32( bitrate, ACELP_9k60 ) ) || ( EQ_32( bitrate, ACELP_16k40 ) ) || ( EQ_32( bitrate, ACELP_24k40 ) ) ) ) -#endif { /* pre-init smoothing filter to avoid energy drop outs */ L_tmp = L_mult( excTmp2[0], 1638 ); @@ -4171,7 +3878,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( *mem_csfilt = Mult_32_16( L_tmp, varEnvShape ); move32(); } -#if 1 // def ADD_IVAS_TBE_CODE + IF( MSFlag > 0 ) { // varEnvShape = 0.995f; @@ -4231,7 +3938,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#endif + { /* Track the low band envelope */ L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) ); @@ -4257,7 +3964,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) ); move32(); } -#if 1 // def ADD_IVAS_TBE_CODE test(); IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { @@ -4303,7 +4009,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#endif { /* create a random excitation - Reuse exc16k memory */ White_exc16k = exc16k; @@ -4352,20 +4057,15 @@ void GenShapedSHBExcitation_ivas_dec_fx( Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) ); } -#if 1 // def ADD_IVAS_TBE_CODE flag_plosive = 0; move16(); test(); test(); test(); IF( GE_32( extl_brate, SWB_TBE_2k8 ) || EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) -#else - IF( GE_32( bitrate, ACELP_24k40 ) ) -#endif { IF( EQ_16( *vf_ind, 20 ) ) /* encoder side */ { -#ifndef ADD_IVAS_TBE_CODE // BELOW PART WILL NEED TO BE CONVERTED FOR ENCODER!! test(); IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { @@ -4544,33 +4244,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#else - UNUSED_PARAM( Env_error_part ); - UNUSED_PARAM( Env_error ); - UNUSED_PARAM( EnvSHBres_4k ); - UNUSED_PARAM( c5_part ); - UNUSED_PARAM( c1 ); - UNUSED_PARAM( den ); - UNUSED_PARAM( c3_part ); - UNUSED_PARAM( c0 ); - UNUSED_PARAM( delta ); - UNUSED_PARAM( c3 ); - UNUSED_PARAM( c2_part ); - UNUSED_PARAM( c1_part ); - UNUSED_PARAM( EnvWhiteExc16k ); - UNUSED_PARAM( g2 ); - UNUSED_PARAM( c5 ); - UNUSED_PARAM( c4_part ); - UNUSED_PARAM( EnvWhiteExc16k_4k ); - UNUSED_PARAM( c2 ); - UNUSED_PARAM( g ); - UNUSED_PARAM( cbsize ); - UNUSED_PARAM( g1 ); - UNUSED_PARAM( EnvExc16kWhtnd ); - UNUSED_PARAM( c0_part ); - UNUSED_PARAM( EnvExc16kWhtnd_4k ); - UNUSED_PARAM( c4 ); -#endif { Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k, ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind ); @@ -4588,7 +4261,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( ELSE /* decoder side */ { test(); -#if 1 // def ADD_IVAS_TBE_CODE IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) ) { IF( *vf_ind == 0 ) @@ -4606,7 +4278,6 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } ELSE -#endif { /* *vf_ind is an integer scale by 0.125f*/ tmp = shl( *vf_ind, ( 15 - 3 ) ); @@ -4619,10 +4290,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( } } } -#if 1 // def ADD_IVAS_TBE_CODE test(); IF( NE_32( extl_brate, SWB_TBE_1k10 ) && NE_32( extl_brate, SWB_TBE_1k75 ) ) -#endif { voice_factors[0] = mult_r( voice_factors[0], tmp2 ); move16(); @@ -4979,10 +4648,8 @@ void GenShapedSHBExcitation_ivas_dec_fx( set16_fx( White_exc16k_FB, 0, L_FRAME16k ); } -#if 1 // def ADD_IVAS_TBE_CODE *prev_pow_exc16kWhtnd = L_shr_sat( pow1, Q_pow1 ); // power goes above MAX_32 *prev_mix_factor = mix_factor; -#endif return; } @@ -7566,56 +7233,7 @@ void Estimate_mix_factors_fx( return; } -#ifdef ADD_IVAS_TBE_CODE -/*-------------------------------------------------------------------* - * tbe_celp_exc() * - * * - * Prepare adaptive part of TBE excitation * - *-------------------------------------------------------------------*/ - -void tbe_celp_exc( - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - float *bwe_exc, /* i/o: BWE excitation */ - const int16_t L_frame, /* i : frame length */ - const int16_t L_subfr, /* i : subframe length */ - const int16_t i_subfr, /* i : subframe index */ - const int16_t T0, /* i : integer pitch lag */ - const int16_t T0_frac, /* i : fraction of lag */ - float *error, /* i/o: error */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ -) -{ - int16_t i, offset; - - if ( element_mode == IVAS_CPE_TD && idchan == 1 && !tdm_LRTD_flag ) - { - return; - } - - if ( L_frame == L_FRAME ) - { - offset = tbe_celp_exc_offset( T0, T0_frac ); - - for ( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - bwe_exc[i + i_subfr * HIBND_ACB_L_FAC] = bwe_exc[i + i_subfr * HIBND_ACB_L_FAC - offset + (int16_t) *error]; - } - *error += (float) offset - (float) T0 * HIBND_ACB_L_FAC - 0.25f * HIBND_ACB_L_FAC * (float) T0_frac; - } - else - { - offset = T0 * 2 + (int16_t) ( (float) T0_frac * 0.5f + 4 + 0.5f ) - 4; - for ( i = 0; i < L_subfr * 2; i++ ) - { - bwe_exc[i + i_subfr * 2] = bwe_exc[i + i_subfr * 2 - offset + (int16_t) *error]; - } - *error += (float) offset - (float) T0 * 2 - 0.5f * (float) T0_frac; - } - return; -} -#endif /*======================================================================================*/ /* FUNCTION : prep_tbe_exc_fx() */ /*--------------------------------------------------------------------------------------*/ @@ -7647,9 +7265,6 @@ void tbe_celp_exc( #ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ -#ifdef ADD_IVAS_TBE_CODE - const Word16 L_subfr, -#endif const Word16 i_subfr_fx, /* i : subframe index */ const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ @@ -7664,13 +7279,6 @@ void prep_tbe_exc_fx( Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ Word32 core_brate -#ifdef ADD_IVAS_TBE_CODE - , /* i : core bitrate */ - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - const int16_t flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif ) { Word16 i; @@ -7685,10 +7293,8 @@ void prep_tbe_exc_fx( Word32 L_tmp, Ltemp1, Ltemp2; Word32 tempQ31; Word16 tempQ15; -#ifndef ADD_IVAS_TBE_CODE Word16 L_subfr = L_SUBFR; move16(); -#endif #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); @@ -7719,17 +7325,6 @@ void prep_tbe_exc_fx( *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); move16(); -#ifdef ADD_IVAS_TBE_CODE - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) - { - IF( flag_TD_BWE && i_subfr == 0 ) - { - set16_fx( bwe_exc, 0, L_FRAME32k ); - } - return; - } - -#endif IF( EQ_16( L_frame_fx, L_FRAME ) ) { interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ @@ -7816,9 +7411,7 @@ void prep_tbe_exc_fx( #endif void prep_tbe_exc_ivas_fx( const Word16 L_frame_fx, /* i : length of the frame */ -#if 1 // def ADD_IVAS_TBE_CODE const Word16 L_subfr, -#endif const Word16 i_subfr_fx, /* i : subframe index */ const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ @@ -7833,13 +7426,11 @@ void prep_tbe_exc_ivas_fx( Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ Word32 core_brate -#if 1 // def ADD_IVAS_TBE_CODE , /* i : core bitrate */ const Word16 element_mode, /* i : element mode */ const Word16 idchan, /* i : channel ID */ const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -#endif ) { Word16 i; @@ -7885,7 +7476,7 @@ void prep_tbe_exc_ivas_fx( *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); move16(); -#if 1 // def ADD_IVAS_TBE_CODE + test(); test(); IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( idchan, 1 ) && !tdm_LRTD_flag ) @@ -7898,7 +7489,6 @@ void prep_tbe_exc_ivas_fx( return; } -#endif IF( EQ_16( L_frame_fx, L_FRAME ) ) { interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window.c index 44ce806f7..0316ec582 100644 --- a/lib_com/tcx_mdct_window.c +++ b/lib_com/tcx_mdct_window.c @@ -123,9 +123,6 @@ void mdct_window_sine( Word16 n /* Q0 */ ) { -#ifdef IVAS_CODE - if ( element_mode == EVS_MONO ) -#endif { const PWord16 *table; table = getSineWindowTable( n ); @@ -138,42 +135,6 @@ void mdct_window_sine( } // PMT("getSineWindowTable needs to be updated for IVAS") } -#ifdef IVAS_CODE - else - { - const float *window_table = 0; - Word16 buf_in_size = 0; - switch ( window_type ) - { - case FULL_OVERLAP: - window_table = tcx_mdct_window_48; - buf_in_size = 420; - break; - case HALF_OVERLAP: - window_table = tcx_mdct_window_half_48; - buf_in_size = 180; - break; - case TRANSITION_OVERLAP: - case MIN_OVERLAP: - window_table = tcx_mdct_window_trans_48; - buf_in_size = 60; - break; - - default: - assert( 0 && "Unsupported window type" ); - break; - } - - if ( Fs == 48000 ) - { - mvr2r( window_table, window, n ); - } - else - { - lerp( window_table, window, n, buf_in_size ); - } - } -#endif } diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index 101bc1df8..82de45023 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -96,10 +96,8 @@ void InitTnsConfiguration( Word32 nSampleRate; Word16 s1; Word16 s2; -#ifndef ADD_IVAS_TNS (void) ( element_mode ); (void) ( is_mct ); -#endif nSampleRate = bwMode2fs[bwidth]; move32(); startLineFilter = &pTnsConfig->iFilterBorders[1]; @@ -138,21 +136,6 @@ void InitTnsConfiguration( ELSE IF( GT_32( nSampleRate, INT_FS_16k ) ) { -#ifdef ADD_IVAS_TNS - if ( ( element_mode > IVAS_SCE ) && ( total_brate >= ( is_mct ? IVAS_32k : IVAS_48k ) ) ) - { - pTnsConfig->nMaxFilters = sizeof( tnsParameters32kHz_Stereo ) / sizeof( tnsParameters32kHz_Stereo[0] ); - if ( nSampleRate == 100 * frameLength ) /* sub-frame length is <= 10 ms */ - { - pTnsConfig->pTnsParameters = tnsParameters32kHz_grouped; - } - else - { - pTnsConfig->pTnsParameters = tnsParameters32kHz_Stereo; - } - } - else -#endif { move16(); @@ -212,9 +195,6 @@ void InitTnsConfiguration( move16(); pTnsConfig->iFilterBorders[0] = frameLength; } -#ifdef ADD_IVAS_TNS - pTnsConfig->allowTnsOnWhite = 0; -#endif return; /*TNS_NO_ERROR;*/ } diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index ef09c3de3..dedf9f859 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -65,25 +65,12 @@ static void windowing_ROM_optimized( const Word16 *, Word16 *, const Word16, con static void fft_spec2_fx( const Word16[], Word32[], const Word16 ); static void trans_ana_fx( const Word16 *, Word16 *, Word16 *, Word16 *, const Word16, const Word16, const Word16, const Word16, Word16 *, Word16 *, Word16 *, Word16 * ); static void peakfinder_fx( const Word16 *, const Word16, Word16 *, Word16 *, const Word16 -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 endpoints /* i : Flag to include endpoints in peak search */ -#endif ); static Word16 imax_fx( const Word16 *, const Word16 ); static void spec_ana_fx( const Word16 *prevsynth, Word16 *plocs, Word32 *plocsi, Word16 *num_plocs, Word16 *X_sav, const Word16 output_frame, const Word16 bwidth_fx, Word16 *Q -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, - Word16 *noise_fac, - const Word16 pcorr -#endif ); static void subst_spec_fx( const Word16 *, const Word32 *, Word16 *, const Word16, Word16 *, const Word16 *, const Word16, const Word16 *, const Word16, Word16 *, const Word16 *, const Word16 *, Word16, const Word16 * ); static Word16 rand_phase_fx( const Word16 seed, Word16 *sin_F, Word16 *cos_F ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE -static float imax2_jacobsen_mag( const float *y_re, const float *y_im ); -#endif /*------------------------------------------------------------------* * rand_phase() @@ -666,9 +653,6 @@ static void ivas_peakfinder_fx( move16(); } len0Minus2 = sub( len0, 2 ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - PMT( "\nlen0Minus2 = sub(len0, 2) is it still correct if IVAS_FEC_ECU_TO_COMPLETE is activated\n" ) -#endif FOR( i = 0; i < len0Minus2; i++ ) { @@ -912,10 +896,6 @@ static void peakfinder_fx( Word16 *plocs, /* o : the indices of the identified peaks in x0 Q0 */ Word16 *cInd, /* o : number of identified peaks Q0 */ const Word16 sel /* i : The amount above surrounding data for a peak to be identified */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 endpoints /* i : Flag to include endpoints in peak search */ -#endif ) { const Word16 *pX0; @@ -951,11 +931,6 @@ static void peakfinder_fx( pInd = indarr; pDx01 = dx0; pDx0 = pDx01 + 1; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - len = 0; - move16(); - IF( endpoints ) -#endif { *pX++ = *pX0++; move16(); @@ -965,9 +940,6 @@ static void peakfinder_fx( move16(); } len0Minus2 = sub( len0, 2 ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - PMT( "\nlen0Minus2 = sub(len0, 2) is it still correct if IVAS_FEC_ECU_TO_COMPLETE is activated\n" ) -#endif FOR( i = 0; i < len0Minus2; i++ ) { @@ -981,9 +953,6 @@ static void peakfinder_fx( } pX0++; } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( endpoints ) -#endif { *pInd = len0Minus1; move16(); @@ -994,13 +963,7 @@ static void peakfinder_fx( minimum_fx( x, len, &minMag ); pInd = indarr; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - test(); - test(); - IF( GT_16( len, 2 ) || ( !endpoints && ( len > 0 ) ) ) -#else IF( GT_16( len, 2 ) ) -#endif { /* Set initial parameters for loop */ tempMag = minMag; @@ -1011,9 +974,6 @@ static void peakfinder_fx( move16(); threshold = add( leftMin, sel ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( len > 0 ) -#endif { /* Deal with first point a little differently since tacked it on Calculate the sign of the derivative since we took the first point @@ -1060,20 +1020,6 @@ static void peakfinder_fx( } pX--; /* After decrement, pX points to either x[-1] or x[0]. */ } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - ii = -1; /* First point is a peak */ - if ( len >= 2 ) - { - if ( x[1] >= x[0] ) - { - ii = 0; /* First point is a valley, skip it */ - } - } - } -#endif *cInd = 0; move16(); /*Loop through extrema which should be peaks and then valleys*/ @@ -1179,9 +1125,6 @@ static void peakfinder_fx( } ELSE /* This is a monotone function where an endpoint is the only peak */ { -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( endpoints ) -#endif { xInd = 1; move16(); @@ -1206,13 +1149,6 @@ static void peakfinder_fx( move16(); } } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { /* Input constant or all zeros -- no peaks found */ - *cInd = 0; - move16(); - } -#endif } } @@ -1709,12 +1645,6 @@ static void spec_ana_fx( const Word16 output_frame, /* i : Frame length Q0 */ const Word16 bwidth_fx, /* i : Encoded bandwidth index Q0 */ Word16 *Q /* o : Q value of the fft spectrum */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, /* i : IVAS element mode */ - Word16 *noise_fac, /* o : for few peaks zeroing valleys decision making */ - const Word16 pcorr -#endif ) { Word16 Lprot, LprotLog2Minus1, hamm_len2, Lprot2, Lprot2_1, m, n; @@ -1782,52 +1712,18 @@ static void spec_ana_fx( IF( EQ_16( output_frame, L_FRAME48k ) ) { /* Apply hamming-rect window */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { windowing( xfp, xfp, w_hamm_sana48k_2_fx, rectLength, hamm_len2 ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // window_corr = w_hamm[0]; - // window_corr_step = w_hamm[0] / hamm_len2; - // for (i = 0; i < hamm_len2; i++) - //{ - // xfp[i] = prevsynth[i] * (w_hamm[i] - window_corr); - // xfp[Lprot - i - 1] = prevsynth[Lprot - i - 1] * (w_hamm[i] - window_corr); - // window_corr -= window_corr_step; - // } - } -#endif /* Spectrum */ fft3_fx( xfp, xfp, Lprot ); } ELSE { -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { /* Apply hamming-rect window */ windowing_ROM_optimized( xfp, xfp, sinTblOffset, rectLength, hamm_len2 ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // window_corr = w_hamm[0]; - // window_corr_step = w_hamm[0] / hamm_len2; - // for (i = 0; i < hamm_len2; i++) - //{ - // xfp[i] = prevsynth[i] * (w_hamm[i] - window_corr); - // xfp[Lprot - i - 1] = prevsynth[Lprot - i - 1] * (w_hamm[i] - window_corr); - // window_corr -= window_corr_step; - // } - } -#endif /* Spectrum */ r_fft_fx_lc( pFftTbl, Lprot, Lprot2, LprotLog2Minus1, xfp, xfp, 1 ); } @@ -1880,35 +1776,13 @@ static void spec_ana_fx( /* Find maximum and minimum. */ maximum_fx( xfp, Lprot2_1, &Xmax ); minimum_fx( xfp, Lprot2_1, &Xmin ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { sel = mult_r( sub( Xmax, Xmin ), CMPLMNT_PFIND_SENS_FX ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - sel = ( Xmax - Xmin ) * ( 1.0f - ST_PFIND_SENS ); - } -#endif peakfinder_fx( xfp, Lprot2_1, plocs, num_plocs, sel -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - endpoints -#endif ); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - /* Currently not the pitch correlation but some LF correlation */ - if ( element_mode != EVS_MONO && *num_plocs > 50 && pcorr < 0.6f ) - { - *num_plocs = 0; - } - - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { /* Refine peaks */ @@ -1955,105 +1829,6 @@ static void spec_ana_fx( move32(); /* in Q16. Append the fractional part to the integral part. */ } } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - Lprot2p1 = Lprot / 2 + 1; - - /* Refine peaks */ - pPlocsi = plocsi; - pPlocs = plocs; - n = *num_plocs; /* number of peaks to process */ - - /* Special case-- The very 1st peak if it is at 0 index position (DC) */ - /* With DELTA_CORR_F0_INT == 2 one needs to handle both *pPlocs==0 and *pPlocs==1 */ - if ( n > 0 && *pPlocs == 0 ) /* Very 1st peak position possible to have a peak at 0/DC index position. */ - { - *pPlocsi++ = *pPlocs + imax_pos( &xfp[*pPlocs] ); - pPlocs++; - n = n - 1; - } - - if ( n > 0 && *pPlocs == 1 ) /* Also 2nd peak position uses DC which makes jacobsen unsuitable. */ - { - *pPlocsi++ = *pPlocs - 1 + imax_pos( &xfp[*pPlocs - 1] ); - currPlocs = *pPlocs++; - n = n - 1; - } - - /* All remaining peaks except the very last two possible integer positions */ - currPlocs = *pPlocs++; - endPlocs = Lprot2p1 - DELTA_CORR_F0_INT; /* last *pPlocs position for Jacobsen */ - - /* precompute number of turns based on endpoint integer location and make into a proper for loop */ - if ( n > 0 ) - { - nJacob = n; - if ( sub( endPlocs, plocs[sub( *num_plocs, 1 )] ) <= 0 ) - { - nJacob = sub( nJacob, 1 ); - } - - for ( k = 0; k < nJacob; k++ ) - { - *pPlocsi++ = currPlocs + imax2_jacobsen_mag( &( X_sav[currPlocs - 1] ), &( X_sav[Lprot - 1 - currPlocs] ) ); - currPlocs = *pPlocs++; - } - n = n - nJacob; - } - - /* At this point there should at most two plocs left to process */ - /* the position before fs/2 and fs/2 both use the same magnitude points */ - if ( n > 0 ) - { - /* [ . . . . . . . ] Lprot/2+1 positions */ - /* | | | */ - /* 0 (Lprot/2-2) (Lprot/2) */ - - if ( currPlocs == ( Lprot2p1 - DELTA_CORR_F0_INT ) ) /* Also 2nd last peak position uses fs/2 which makes jacobsen less suitable. */ - { - *pPlocsi++ = currPlocs - 1 + imax_pos( &xfp[currPlocs - 1] ); - currPlocs = *pPlocs++; - n = n - 1; - } - - /* Here the only remaining point would be a fs/2 plocs */ - /* pXfp = xfp + sub(Lprot2,1); already set just a reminder where it - * whould point */ - if ( n > 0 ) /* fs/2 which makes special case . */ - { - *pPlocsi++ = currPlocs - 2 + imax_pos( &xfp[currPlocs - 2] ); - currPlocs = *pPlocs++; - n = n - 1; - } - } - - /* For few peaks decide noise floor attenuation */ - if ( *num_plocs < 3 && *num_plocs > 0 ) - { - sig = sum_f( xfp, Lprot2_1 ) + EPSILON; - - /*excluding peaks and neighboring bins*/ - for ( i = 0; i < *num_plocs; i++ ) - { - st_point = max( 0, plocs[i] - DELTA_CORR ); - end_point = min( Lprot2_1 - 1, plocs[i] + DELTA_CORR ); - set_f( &xfp[st_point], 0.0f, end_point - st_point + 1 ); - } - noise = sum_f( xfp, Lprot2_1 ) + EPSILON; - nsr = noise / sig; - - if ( nsr < 0.03f ) - { - *noise_fac = 0.5f; - } - else - { - *noise_fac = 1.0f; - } - } - } -#endif } /*-------------------------------------------------------------------* @@ -2474,12 +2249,6 @@ static void subst_spec_fx( const Word16 *beta, /* i : Magnitude modification factors for fade to average Q15 */ Word16 beta_mute, /* i : Factor for long-term mute Q15 */ const Word16 *Xavg /* i : Frequency group averages to fade to Q0 */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, /* i : IVAS element mode */ - const Word16 ph_ecu_lookahead, /* i : Phase ECU lookahead */ - const Word16 noise_fac /* i : noise factor */ -#endif ) { Word16 Xph_short; @@ -2500,11 +2269,6 @@ static void subst_spec_fx( Word16 alpha_local; Word16 beta_local; Word16 expo; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - Word16 one_peak_flag_mask; - Word16 alpha_local; - Word16 beta_local; -#endif Word16 mag_chg_local; /*for peak attenuation in burst */ Lprot = 512; @@ -2560,21 +2324,6 @@ static void subst_spec_fx( move32(); } } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - one_peak_flag_mask = 1; /* all ones mask -> keep */ - IF( NE_16( element_mode, EVS_MONO ) ) - { - if ( ( *num_plocs > 0 ) && sub( *num_plocs, 3 ) < 0 ) - { - one_peak_flag_mask = noise_fac; /* all zeroes mask -> zero */ - } - if ( *num_plocs == 0 ) - { - X[0] = 0; /* reset DC if there are no peaks */ - X[shr( Lprot, 1 )] = 0; /* also reset fs/2 if there are no peaks */ - } - } -#endif lprotBy2Minus1 = sub( shr( Lprot, 1 ), 1 ); i = 1; move16(); @@ -2635,21 +2384,10 @@ static void subst_spec_fx( move16(); im = *pImX; move16(); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // tmp = one_peak_flag_mask * (X[i] * cos_F - X[im_ind] * sin_F); - // X[im_ind] = one_peak_flag_mask * (X[i] * sin_F + X[im_ind] * cos_F); - } -#endif IF( LT_16( alpha[k], 32766 ) ) { *seed = rand_phase_fx( *seed, &sin_F, &cos_F ); @@ -2766,21 +2504,10 @@ static void subst_spec_fx( move16(); im = *pImX; move16(); -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( EQ_16( element_mode, EVS_MONO ) ) -#endif { tmp = sub_sat( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add_sat( mult_r( re, sin_F ), mult_r( im, cos_F ) ); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - ELSE - { - PMTE() - // tmp = one_peak_flag_mask * (X[i] * cos_F - X[im_ind] * sin_F); - // X[im_ind] = one_peak_flag_mask * (X[i] * sin_F + X[im_ind] * cos_F); - } -#endif IF( LT_16( alpha[k], 32766 ) ) { alpha_local = mag_chg_local; @@ -3032,97 +2759,7 @@ static void rec_wtda_fx( Word16 *p_ecu; Word16 g; Word16 tbl_delta; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - float xsubst_[2 * L_FRAME48k]; - const float *w_hamm; - float *pX_start, *pX_end; - float tmp; - int16_t hamm_len2; - float *pNew; - const float *pOldW, *pNewW; - float xfwin[NS2SA( L_FRAME48k * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 )]; - const float *pOld; - int16_t copy_len; - int16_t ola_len; - - copy_len = NS2SA( output_frame * FRAMES_PER_SEC, ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* prototype fill on each side of xsubst to fill MDCT Frame */ - ola_len = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS - ( 2 * FRAME_SIZE_NS - L_PROT_NS ) / 2 ); /* remaining lengt of LA_ZEROS to overlap add decoded with xsubst */ - - if ( output_frame == L_FRAME48k ) - { - w_hamm = w_hamm_sana48k_2; - hamm_len2 = L_PROT_HAMM_LEN2_48k; - } - else if ( output_frame == L_FRAME32k ) - { - w_hamm = w_hamm_sana32k_2; - hamm_len2 = L_PROT_HAMM_LEN2_32k; - } - else - { - w_hamm = w_hamm_sana16k_2; - hamm_len2 = L_PROT_HAMM_LEN2_16k; - } - - if ( element_mode != EVS_MONO && *num_p > 0 && plocs[0] > 3 ) - { - /* Perform inverse windowing of hammrect */ - pX_start = X; - pX_end = X + Lprot - 1; - for ( i = 0; i < hamm_len2; i++ ) - { - tmp = 1.0f / *w_hamm; - *pX_start *= tmp; - *pX_end *= tmp; - pX_start++; - pX_end--; - w_hamm++; - } - } - - /* extract reconstructed frame with aldo window */ - timesh = NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ) - ( 2 * output_frame - Lprot ) / 2; - - set_f( xsubst_, 0.0f, 2 * output_frame - Lprot + timesh ); - mvr2r( X, xsubst_ + 2 * output_frame - Lprot + timesh, Lprot - timesh ); - - /* Copy and OLA look ahead zero part of MDCT window from decoded signal */ - if ( element_mode != EVS_MONO ) - { - mvr2r( old_dec, xsubst_ + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ), copy_len ); /* also need to scale to Q0 ?? */ - pOld = old_dec + copy_len; - pNew = xsubst_ + copy_len + NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); - sinq( EVS_PI / ( ola_len * 2 ), 0.0f, ola_len, xfwin ); - v_mult( xfwin, xfwin, xfwin, ola_len ); /* xfwin = sin^2 of 0..pi/4 */ - pOldW = xfwin + ola_len - 1; - pNewW = xfwin; - for ( i = 0; i < ola_len; i++ ) - { - *pNew = *pOld * *pOldW + *pNew * *pNewW; - pOld += 1; - pNew += 1; - pOldW -= 1; - pNewW += 1; - } - } - else - { - /* Smoothen onset of ECU frame */ - xf_len = (int16_t) ( (float) output_frame * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) - ( output_frame - Lprot / 2 ); - p_ecu = xsubst_ + 2 * output_frame - Lprot + timesh; - tbl_delta = 64.f / xf_len; /* 64 samples = 1/4 cycle in sincos_t */ - for ( i = 0; i < xf_len; i++, p_ecu++ ) - { - g = sincos_t[( (int16_t) ( i * tbl_delta ) )]; - g *= g; - *p_ecu = g * ( *p_ecu ); - } - } - - /* Apply TDA and windowing to ECU frame */ - wtda( xsubst_ + output_frame, ecu_rec, NULL, ALDO_WINDOW, ALDO_WINDOW, output_frame ); -#else // PMTE() xsubst_ = rec_buf + output_frame; Lprot2 = shr( Lprot, 1 ); @@ -3175,7 +2812,6 @@ static void rec_wtda_fx( out_ptr = rec_buf + sub( shl( output_frame, 1 ), timesh ); wtda_fx( out_ptr, &Qin, ecu_rec, NULL, 0, ALDO_WINDOW, ALDO_WINDOW, /* window overlap of current frame (0: full, 2: none, or 3: half) */ output_frame ); -#endif return; } @@ -3240,13 +2876,6 @@ static void rec_frame_fx( Word32 *ecu_rec, /* o : Reconstructed frame in tda domain */ const Word16 output_frame, /* i : Frame length */ const Word16 Q -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const float *old_dec, /* i : end of last decoded for OLA before tda and itda */ - const int16_t element_mode, /* i : IVAS element mode */ - const int16_t *num_p, /* i : Number of peaks */ - const int16_t *plocs /* i : Peak locations */ -#endif ) { const Word16 *pFftTbl; @@ -4034,28 +3663,11 @@ static void fec_ecu_dft_fx( Word16 *Tf_abs, /*Qout */ Word16 *Nfft, Word16 *exp /*Qout = Qin+exp */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const int16_t element_mode /* i : IVAS element mode */ -#endif ) { Word32 L_tmp, Tmp, Tfr32[512], Tfi32[512], fac, *Pt1, *Pt2; Word16 i, tmp, tmp_short, N_LP, target[2 * L_FRAME48k], Tfr16[FEC_FFT_MAX_SIZE], *pt1, *pt2, *pt3; Word16 tmp_loop; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - int16_t alignment_point; - - Lon20 = (int16_t) 160 / 20; - if ( element_mode == EVS_MONO ) - { - alignment_point = 2 * 160 - 3 * Lon20; - } - else - { - alignment_point = 2 * 160; - } -#endif tmp = sub( 296, N ); Copy( &prevsynth_LP[tmp], target, N ); @@ -4588,11 +4200,6 @@ static void fec_noise_filling_fx( const Word16 N, const Word16 HqVoicing, Word16 *gapsynth_fx /*Qsynth */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const int16_t element_mode, /* i : IVAS element mode */ - const float *old_out -#endif ) { @@ -4607,22 +4214,6 @@ static void fec_noise_filling_fx( Word32 L_tmp; const Word16 *sinq_tab; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - - const float *p_mdct_ola; - int16_t alignment_point; - PMTE() - if ( element_mode == EVS_MONO ) - { - alignment_point = 2 * L - 3 * L / 20; - } - else - { - alignment_point = 2 * L; - } - mvr2r( prevsynth + alignment_point - N, noisevect, N ); -#endif - IF( EQ_16( L, L_FRAME32k ) ) { sinq_tab = sinq_32k; @@ -4693,18 +4284,6 @@ static void fec_noise_filling_fx( tmp_fx = div_s( 1, Rnd_N_noise ); /*Q15 */ tmp_fx = round_fx_sat( L_shl_sat( L_mult( tmp_fx, 25736 ), 2 ) ); /*Q15 */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - if ( element_mode == EVS_MONO ) - { - kk = 7 * L / 20; - p_mdct_ola = prevsynth + 37 * L / 20; - } - else - { - kk = NS2SA( L * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); - p_mdct_ola = old_out + kk; - } -#endif sinq_fx( shr( tmp_fx, 1 ), shr( tmp_fx, 2 ), Rnd_N_noise, SS_fx ); @@ -4812,11 +4391,6 @@ static void fec_alg_fx( const Word16 decimatefactor, const Word16 HqVoicing, Word16 *gapsynth /*Qin */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 element_mode, /* i : IVAS element mode */ - const Word16 *old_out -#endif ) { Word16 Nfft; @@ -4829,19 +4403,11 @@ static void fec_alg_fx( Word16 n, Q; fec_ecu_dft_fx( prevsynth_LP, N, Tfr, Tfi, &sum_Tf_abs, Tf_abs, &Nfft, &exp -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode -#endif ); sinusoidal_synthesis_fx( Tfr, Tfi, Tf_abs, N, output_frame, decimatefactor, Nfft, sum_Tf_abs, synthesis, HqVoicing, exp ); fec_noise_filling_fx( prevsynth, synthesis, ni_seed_forfec, output_frame, i_mult2( N, decimatefactor ), HqVoicing, gapsynth -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode, old_out -#endif ); n = R1_48 - R2_48; @@ -5018,11 +4584,6 @@ static void hq_phase_ecu_fx( Word16 *beta_mute, /* o : Factor for long-term mute Q15 */ const Word16 bwidth_fx, /* i : Encoded bandwidth */ const Word16 output_frame /* i : frame length */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - const Word16 pcorr, - const Word16 element_mode /* i : IVAS element mode */ -#endif ) { Word16 lprot, offset; @@ -5030,22 +4591,6 @@ static void hq_phase_ecu_fx( Word16 seed; Word16 alpha[LGW_MAX], beta[LGW_MAX]; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - const float *old_dec; - float noise_fac; - int16_t ph_ecu_lookahead; - - noise_fac = 1.0f; - - if ( element_mode == EVS_MONO ) - { - ph_ecu_lookahead = NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); - } - else - { - ph_ecu_lookahead = 0; - } -#endif IF( EQ_16( output_frame, L_FRAME48k ) ) { lprot = L_PROT48k; /* 1536 = (2*output_frame)*1024/1280 */ @@ -5074,29 +4619,17 @@ static void hq_phase_ecu_fx( { test(); // PMT("verify condition compared to float") -#ifdef IVAS_FEC_ECU_TO_COMPLETE - IF( !( prev_bfi != 0 && *last_fec != 0 ) && EQ_16( element_mode == EVS_MONO ) ) -#else if ( !( prev_bfi != 0 && *last_fec != 0 ) ) -#endif { *time_offs = 0; move16(); } -#ifdef IVAS_FEC_ECU_TO_COMPLETE - offset = add( sub( sub( shl( output_frame, 1 ), lprot ), *time_offs ), ph_ecu_lookahead ); -#else offset = sub( sub( shl( output_frame, 1 ), lprot ), *time_offs ); -#endif trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, *last_fec, alpha, beta, beta_mute, Xavg ); spec_ana_fx( prevsynth + offset, plocs, plocsi, num_p, X_sav, output_frame, bwidth_fx, Q_spec -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode, noise_fac, pcorr -#endif ); test(); @@ -5128,21 +4661,10 @@ static void hq_phase_ecu_fx( subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, alpha, beta, *beta_mute, Xavg -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - element_mode, ph_ecu_lookahead, noise_fac -#endif ); /* reconstructed frame in tda domain */ -#ifdef IVAS_FEC_ECU_TO_COMPLETE - old_dec = prevsynth + 2 * output_frame - NS2SA( output_frame * FRAMES_PER_SEC, N_ZERO_MDCT_NS ); -#endif rec_frame_fx( X, ecu_rec, output_frame, *Q_spec -#ifdef IVAS_FEC_ECU_TO_COMPLETE - , - old_dec, element_mode, num_p, plocs -#endif ); *last_fec = 0; @@ -5297,22 +4819,6 @@ void hq_ecu_fx( Word16 decimatefactor; Word16 corr; /*Q15 */ Word16 prevsynth_LP[2 * L_FRAME8k]; -#ifdef IVAS_FEC_ECU_TO_COMPLETE - HQ_DEC_HANDLE hHQ_core; - const float *fec_alg_input; - int16_t evs_mode_selection; - int16_t ivas_mode_selection; - - hHQ_core = st->hHQ_core; - if ( st->element_mode == EVS_MONO ) - { - fec_alg_input = prevsynth + NS2SA( output_frame * FRAMES_PER_SEC, ACELP_LOOK_NS / 2 - PH_ECU_LOOKAHEAD_NS ); - } - else - { - fec_alg_input = prevsynth - NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ); - } -#endif /* init (values ar changed after) */ decimatefactor = 4; move16(); @@ -5323,11 +4829,7 @@ void hq_ecu_fx( IF( !( LT_16( output_frame, L_FRAME16k ) ) ) { -#ifdef IVAS_FEC_ECU_TO_COMPLETE - fec_ecu_pitch_fx( fec_alg_input, prevsynth_LP, output_frame, &N, &corr, &decimatefactor, ph_ecu_HqVoicing ); -#else fec_ecu_pitch_fx( prevsynth + NS2SA_FX2( L_mult0( output_frame, 50 ), ACELP_LOOK_NS / 2 - PH_ECU_LOOKAHEAD_NS ), prevsynth_LP, output_frame, &N, &corr, &decimatefactor, ph_ecu_HqVoicing ); -#endif } ELSE { @@ -5350,32 +4852,6 @@ void hq_ecu_fx( test(); test(); test(); -#if defined IVAS_FEC_ECU_TO_COMPLETE - evs_mode_selection = ( st->total_brate >= 48000 && ( output_frame >= L_FRAME16k && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) && - ( ph_ecu_HqVoicing || ( ( ( hHQ_core->env_stab_plc > 0.5 ) && ( corr < 0.6 ) ) || ( hHQ_core->env_stab_plc < 0.5 && ( corr > 0.85 ) ) ) ) ) ) || - ( st->total_brate < 48000 && ( ( ph_ecu_HqVoicing || corr > 0.85 ) && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) ) ); - - ivas_mode_selection = ( N < PH_ECU_N_LIMIT ) || ( corr < PH_ECU_CORR_LIMIT ); - if ( ( ( st->element_mode == EVS_MONO ) && evs_mode_selection ) || - ( ( st->element_mode != EVS_MONO ) && evs_mode_selection && ivas_mode_selection ) ) - - { - fec_alg_fx( fec_alg_input, prevsynth_LP, ecu_rec, output_frame, N, decimatefactor, ph_ecu_HqVoicing, gapsynth, &hHQ_core->ni_seed_forfec, st->element_mode, st->hHQ_core->old_out ); - *last_fec = 1; - *ph_ecu_active = 0; - move16(); - *time_offs = output_frame; - move16(); - ; - } - else - { - hq_phase_ecu( prevsynth - NS2SA( output_frame * FRAMES_PER_SEC, PH_ECU_LOOKAHEAD_NS ), ecu_rec, time_offs, X_sav, num_p, plocs, plocsi, env_stab, last_fec, prev_bfi, old_is_transient, mag_chg_1st, Xavg, beta_mute, st->bwidth, output_frame, corr, st->element_mode ); - - *last_fec = 0; - *ph_ecu_active = 1; - } -#else IF( ( GE_32( st_fx->total_brate, 48000 ) && ( GE_16( output_frame, L_FRAME16k ) && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) && ( NE_16( ph_ecu_HqVoicing, 0 ) || ( ( ( NE_16( st_fx->hHQ_core->env_stab_plc_fx, 0 ) ) && ( LT_16( corr, 19661 ) ) ) || ( !( NE_16( st_fx->hHQ_core->env_stab_plc_fx, 0 ) ) && ( GT_16( corr, 27853 ) ) ) ) ) ) ) || ( LT_32( st_fx->total_brate, 48000 ) && ( ( ph_ecu_HqVoicing || GT_16( corr, 27853 ) ) && !prev_bfi && ( !old_is_transient[0] || old_is_transient[1] ) ) ) ) @@ -5395,7 +4871,6 @@ void hq_ecu_fx( env_stab, last_fec, ph_ecu_active, prev_bfi, old_is_transient, mag_chg_1st, Xavg, beta_mute, st_fx->bwidth, output_frame ); } -#endif return; } diff --git a/lib_dec/TonalComponentDetection_fx.c b/lib_dec/TonalComponentDetection_fx.c index e820f1399..4b2cf0213 100644 --- a/lib_dec/TonalComponentDetection_fx.c +++ b/lib_dec/TonalComponentDetection_fx.c @@ -740,15 +740,6 @@ static void CorrectF0( Word16 tmp; -#ifdef IVAS_CODE - FOR( i = 0; i < MAX_PEAKS_FROM_PITCH - 1; i++ ) - { - diff[i] = 0; - sortedDiff[i] = 0; - move16)); - move16)); - } -#endif F0 = *pF0; /*Q10*/ test(); diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 0fbedff60..3570ce86d 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -1287,12 +1287,7 @@ ivas_error acelp_core_dec_fx( /*Noise estimate*/ IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) /* && !st->cng_ism_flag IVAS_CODE */ ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMT( "Code for IVAS_CODE_CNG_FIX185_PLC_FADEOUT not done" ) - ApplyFdCng_fx( syn, st_fx->Q_syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); -#else ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); -#endif } /* CNA: Generate additional comfort noise to mask potential coding artefacts */ } diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index c1c1e6143..971af2b56 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -813,15 +813,10 @@ ivas_error amr_wb_dec_fx( st_fx->VAD = 0; move16(); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMT( "Fixed point not done here " ) - ApplyFdCng_fx( syn, NULL, NULL, NULL, st, 0, 0 ); -#else #ifdef REMOVE_EVS_DUPLICATES ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); #else ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); -#endif #endif st_fx->hFdCngDec->hFdCngCom->frame_type_previous = st_fx->m_frame_type; move16(); diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 967a93bfb..86d8e805a 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -20,18 +20,7 @@ void open_decoder_LPD_fx( Decoder_State *st, const Word32 total_brate, /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - const Word32 last_total_brate, -#endif const Word16 bwidth /* Q0 */ -#ifdef NEW_IVAS_OPEN_DEC - , - const Word16 is_mct, /* i : MCT mode flag */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16 last_element_mode, -#endif - const Word16 is_init /* i : indicate call from init_decoder() to avoid double TC initialization */ -#endif ) { Word16 i; @@ -50,10 +39,8 @@ void open_decoder_LPD_fx( hTcxLtpDec = st->hTcxLtpDec; hTcxDec = st->hTcxDec; -#ifndef NEW_IVAS_OPEN_DEC st->total_brate = total_brate; move32(); -#endif if ( NE_16( st->codec_mode, MODE1 ) ) /*already updated in MODE1*/ { @@ -70,40 +57,18 @@ void open_decoder_LPD_fx( /* initializing variables for frame lengths etc. right in the beginning */ st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); move16(); -#ifndef NEW_IVAS_OPEN_DEC hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); move16(); -#endif IF( st->ini_frame == 0 ) { st->last_L_frame = st->L_frame_past = st->L_frame; move16(); move16(); -#ifndef NEW_IVAS_OPEN_DEC st->L_frameTCX_past = hTcxDec->L_frameTCX; -#endif move16(); } -#ifdef NEW_IVAS_OPEN_DEC - IF( st->hTcxDec != NULL ) - { - hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, 0x0290 ) ); - IF( st->ini_frame == 0 ) - { - st->L_frameTCX_past = st->hTcxDec->L_frameTCX; - move16(); - } - } -#endif st->tcxonly = getTcxonly( -#ifdef IVAS_CODE_SWITCHING - st->element_mode, -#endif st->total_brate -#ifdef IVAS_CODE_SWITCHING - , - is_mct -#endif /*, st->is_ism_format Needed in the last version of float IVAS */ ); move16(); @@ -155,9 +120,6 @@ void open_decoder_LPD_fx( // st->pit_res_max = initPitchLagParameters(12800, &st->pit_min, &st->pit_fr1, &st->pit_fr1b, &st->pit_fr2, &st->pit_max); // hTcxDec->pit_max_TCX = (int16_t)(st->pit_max * st->output_Fs / 12800); // hTcxDec->pit_min_TCX = (int16_t)(st->pit_min * st->output_Fs / 12800); -#if 0 - PMT("Fixed point to be verified here") -#endif i = mult_r( hTcxDec->L_frameTCX, getInvFrameLen( L_FRAME ) ); /* Q6 */ hTcxDec->pit_max_TCX = extract_l( L_shr( L_mult( st->pit_max, i ), 7 ) ); /* Q0 */ move16(); @@ -243,7 +205,6 @@ void open_decoder_LPD_fx( } /*TCX config*/ -#ifndef NEW_IVAS_OPEN_DEC st->hTcxCfg->preemph_fac = st->preemph_fac; move16(); st->hTcxCfg->tcx_mdct_window_length_old = st->hTcxCfg->tcx_mdct_window_length; @@ -304,34 +265,6 @@ void open_decoder_LPD_fx( } resetTecDec_Fx( st->hTECDec ); - -#else - if ( st->hIGFDec != NULL ) - { - PMT( "To be done" ) - // IF (!is_init || st->element_mode != IVAS_CPE_MDCT) - //{ - // init_tcx_cfg(st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag); - // } - // else - //{ - // st->hTcxCfg->tcx_curr_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW; - // st->hTcxCfg->last_aldo = 1; - // } - } - /*Constraint for adaptive BPF, otherwise parameter estimation and post-processing not time aligned*/ - IF( st->tcxonly == 0 ) - { - assert( 0 == ( st->hTcxCfg->lfacNext > 0 ? st->hTcxCfg->lfacNext : 0 ) ); - } - // IF (st->tecDec_fx != NULL) - { - resetTecDec_Fx( &( st->tecDec_fx ) ); - } - -#endif - - /* Initialize decoder delay */ @@ -447,7 +380,6 @@ void open_decoder_LPD_fx( move16(); /*PLC*/ -#ifndef NEW_IVAS_OPEN_DEC IF( st->prev_bfi != 0 ) { PWord16 const *w; @@ -498,10 +430,6 @@ void open_decoder_LPD_fx( hTcxDec->Q_syn_Overl_TDAC = hHQ_core->Q_old_wtda_LB; move16(); } -#else - PMT( "acelp_plc_mdct_transition is missing" ) - // acelp_plc_mdct_transition(st); -#endif } test(); @@ -545,9 +473,6 @@ void open_decoder_LPD_fx( set16_fx( hTcxDec->syn_Overl_TDAC, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ /* Q_syn_Overl_TDAC */ set16_fx( hTcxDec->syn_Overl_TDACFB, 0, L_FRAME_MAX / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ /* Q_syn_Overl_TDACFB */ set16_fx( hTcxDec->syn_Overl, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ /* Q_syn_Overl */ -#if 0 - PMT("to be moved to reset_tcx_overl_buf") -#endif } IF( st->hTcxCfg != NULL ) { @@ -575,15 +500,6 @@ void open_decoder_LPD_fx( cldfb_reset_memory( st->cldfbAna ); cldfb_reset_memory( st->cldfbBPF ); cldfb_reset_memory( st->cldfbSyn ); -#ifndef NEW_IVAS_OPEN_DEC -#if 0 - PMT("cldfbSynHB is missing ") -#endif - // IF (st->cldfbSynHB != NULL) - //{ - // cldfb_reset_memory(st->cldfbSynHB); - // } -#endif } ELSE IF( ( NE_16( st->L_frame, st->last_L_frame ) ) && ( LE_16( st->L_frame, L_FRAME16k ) ) && ( LE_16( st->last_L_frame, L_FRAME16k ) ) ) /* Rate switching between 12.8 and 16 kHz*/ { @@ -817,10 +733,6 @@ void open_decoder_LPD_fx( test(); IF( EQ_16( st->core, ACELP_CORE ) && EQ_16( st->last_core, HQ_CORE ) ) { - /*_DIFF_FLOAT_FIX_*/ -#if 0 - PMT("floating point is using L_frameTCX instead of output_frame, is it ok?") -#endif frame_ener_fx( st->output_frame_fx, UNVOICED_CLAS, st->previoussynth_fx, -1, &st->enr_old_fx, 1, 0, 0, 0 ); } } @@ -840,20 +752,6 @@ void open_decoder_LPD_fx( move16(); if ( st->hTcxDec != NULL ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - /* Todo: should be considered for other stereo modes as well */ - IF( is_init || MCT_flag || !( st->element_mode == IVAS_CPE_MDCT && st->element_mode == last_element_mode ) ) - { - PMT( "Fixed point to be done" ) - st->hTcxDec->CngLevelBackgroundTrace_bfi = PLC_MIN_CNG_LEV; - st->hTcxDec->NoiseLevelIndex_bfi = PLC_MIN_STAT_BUFF_SIZE - 1; - st->hTcxDec->CurrLevelIndex_bfi = 0; - st->hTcxDec->LastFrameLevel_bfi = PLC_MIN_CNG_LEV; - set_f( st->hTcxDec->NoiseLevelMemory_bfi, PLC_MIN_CNG_LEV, PLC_MIN_STAT_BUFF_SIZE ); - - st->hTcxDec->cummulative_damping_tcx = 1.0f; - } -#else hTcxDec->conCngLevelBackgroundTrace = PLC_MIN_CNG_LEV_Q21; /*Q21*/ move16(); hTcxDec->conNoiseLevelIndex = PLC_MIN_STAT_BUFF_SIZE - 1; /* Q0 */ @@ -871,7 +769,6 @@ void open_decoder_LPD_fx( hTcxDec->cummulative_damping_tcx = 32767 /*1.0f Q15*/; move16(); -#endif } st->cummulative_damping = 32767 /*1.0f Q15*/; move16(); @@ -891,10 +788,8 @@ void open_decoder_LPD_fx( st->old_fpitch = L_deposit_h( st->pit_min ); move32(); -#ifndef NEW_IVAS_OPEN_DEC st->old_fpitchFB = L_deposit_h( hTcxDec->pit_min_TCX ); move32(); -#endif st->rate_switching_init = 1; move16(); @@ -924,9 +819,6 @@ void open_decoder_LPD_fx( test(); IF( hTcxLtpDec != NULL && ( EQ_16( st->ini_frame, 0 ) || ( EQ_16( st->last_codec_mode, MODE1 ) && st->element_mode == EVS_MONO ) ) ) { -#if 0 - PMT("TO be verify, update seems to differ from float") -#endif hTcxLtpDec->tcxltp_pitch_int = st->pit_max; /* Q0 */ move16(); hTcxLtpDec->tcxltp_pitch_fr = 0; /* Q0 */ @@ -1059,12 +951,6 @@ void open_decoder_LPD_fx( move16(); st->second_last_core = -1; move16(); -#ifdef NEW_IVAS_OPEN_DEC - IF( st->hTcxCfg != NULL && st->element_mode != EVS_MONO ) - { - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf ); - } -#endif IF( hTcxDec != NULL ) { hTcxDec->tcxltp_second_last_pitch = st->old_fpitch; /*15Q16*/ @@ -1105,10 +991,8 @@ void open_decoder_LPD_fx( hTcxDec->tcx_hm_LtpPitchLag = -1; move16(); } -#ifndef NEW_IVAS_OPEN_DEC st->hTcxCfg->na_scale = 32767 /*1.0f Q15*/; move16(); -#endif if ( hTcxLtpDec != NULL ) { hTcxLtpDec->tcxltp_gain = 0; /* Q15 */ diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c index 63c35f876..8c68f39ce 100644 --- a/lib_dec/core_dec_switch_fx.c +++ b/lib_dec/core_dec_switch_fx.c @@ -13,18 +13,7 @@ void mode_switch_decoder_LPD_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 bwidth, /* i : audio bandwidth Q0*/ Word32 total_brate, /* i : total bitrate Q0*/ -#ifdef IVAS_CODE_SWITCHING - const Word32 last_total_brate, /* i : last frame total bitrate */ -#endif Word16 frame_size_index /* i : index determining the frame size Q0*/ -#ifdef IVAS_CODE_SWITCHING - , - const Word16 MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const Word16 last_element_mode -#endif -#endif ) { Word16 fscale, switchWB; @@ -100,15 +89,7 @@ void mode_switch_decoder_LPD_fx( test(); IF( NE_16( fscale, st->fscale ) || ( switchWB != 0 ) || ( bSwitchFromAmrwbIO != 0 ) || EQ_16( st->last_codec_mode, MODE1 ) || st->force_lpd_reset ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - open_decoder_LPD_fx( st, total_brate, last_total_brate, bwidth, MCT_flag, last_element_mode, 0 ); -#else -#ifdef IVAS_CODE - open_decoder_LPD_fx( st, total_brate, last_total_brate, bwidth, is_mct, 0 ); -#else open_decoder_LPD_fx( st, total_brate, bwidth ); -#endif -#endif } ELSE { @@ -153,9 +134,6 @@ void mode_switch_decoder_LPD_fx( IF( ( st->hTcxCfg->fIsTNSAllowed != 0 ) && st->hIGFDec != NULL ) { InitTnsConfigs( bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFDec->infoIGFStopFreq, total_brate, st->element_mode, 0 /* 0 should be replaced with MCT_flag*/ ); -#ifdef IVAS_CODE - SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, st->element_mode == IVAS_CPE_MDCT ); -#endif } } } diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index f53234ded..c04ee9dc5 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -574,11 +574,7 @@ void decoder_LPD_fx( IF( bfi != 0 && ( st->last_core != ACELP_CORE ) ) { /* PLC: [TCX: TD PLC] */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - con_tcx_fx( st, &synthFB[0], -1.f, NULL, 0, NULL ); -#else con_tcx_fx( st, &synthFB[0] ); -#endif lerp( synthFB, synth, st->L_frame, hTcxDec->L_frameTCX ); st->con_tcx = 1; move16(); @@ -778,11 +774,7 @@ void decoder_LPD_fx( { TonalMDCTConceal_SaveTimeSignal( st->hTonalMDCTConc, synthFB, L_frameTCX ); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - decoder_tcx_post_fx( st, synth, synthFB, Aq, bfi, 0 ); -#else decoder_tcx_post_fx( st, synth, synthFB, Aq, bfi ); -#endif IF( EQ_16( st->core, TCX_20_CORE ) ) { /* LPC Interpolation for BWE/post-processing */ diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index 16f749156..55d3ebbae 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -537,15 +537,8 @@ void decoder_acelp_fx( gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); #else prep_tbe_exc_fx( st->L_frame, -#ifdef ADD_IVAS_TBE_CODE - L_SUBFR, -#endif i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate -#ifdef ADD_IVAS_TBE_CODE - , - st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 -#endif ); #endif } diff --git a/lib_dec/dec_acelp_tcx_main_fx.c b/lib_dec/dec_acelp_tcx_main_fx.c index 04a41ed46..21bf7cf12 100644 --- a/lib_dec/dec_acelp_tcx_main_fx.c +++ b/lib_dec/dec_acelp_tcx_main_fx.c @@ -208,11 +208,7 @@ static void decode_frame_type_fx( Decoder_State *st ) move16(); /* Reconf Core */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - mode_switch_decoder_LPD_fx( st, st->bwidth, st->total_brate, st->last_total_brate, frame_size_index, 0, st->element_mode ); -#else mode_switch_decoder_LPD_fx( st, st->bwidth, st->total_brate, frame_size_index ); -#endif /* Reconf CLDFB */ IF( NE_16( i_mult( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) { diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index af80ee1f5..883024002 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -893,9 +893,6 @@ void decoder_tcx_fx( TonalMDCTConceal_InsertNoise( st->hTonalMDCTConc, x, &x_e, st->tonal_mdct_plc_active, &st->seed_tcx_plc, noiseTiltFactor, f, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - concealment_noise, -#endif infoIGFStartLine ); } } diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index e804d2009..1a8a8b30d 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -126,10 +126,6 @@ void con_tcx_fx( const Word16 coh, /* i : coherence of stereo signal Q14*/ Word16 *noise_seed, /* i/o: noise seed for stereo Q0*/ const Word16 only_left /* i : TD-PLC only in left channel Q0*/ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const float *A_cng /* i : CNG LP filter coefficients Q14*/ -#endif #endif ) @@ -489,19 +485,7 @@ void con_tcx_fx( move16(); /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif IF( EQ_16( st->nbLostCmpt, 1 ) ) { st->cummulative_damping = 32767 /*1.f Q15*/; @@ -568,19 +552,7 @@ void con_tcx_fx( } set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif } /*-----------------------------------------------------------------* @@ -707,20 +679,9 @@ void con_tcx_fx( } /* PLC: [TCX: Fade-out] retrieve background level */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( A_cng != NULL ) - { - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp ), A_cng, L_frame / 4, st->preemph_fac, 1 ) / 4.f; - } - else - { - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp ), A_local, L_frame / 4, st->preemph_fac, 1 ); - } -#else tmp16 = 32767; move16(); gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q5*/ -#endif IF( st->tcxonly != 0 ) { /* gainCNG = st->conCngLevelBackgroundTrace/gainSynthDeemph; */ @@ -728,19 +689,6 @@ void con_tcx_fx( hTcxDec->conCngLevelBackgroundTrace_e, gainSynthDeemph, gainSynthDeemph_e, &gainCNG, &gainCNG_e ); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( st->element_mode == IVAS_CPE_MDCT && A_cng != NULL ) - { - if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME + MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN ) - { - gainCNG = 0.f; - } - else if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) - { - gainCNG *= 1.f - (float) ( st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME ) / MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN; - } - } -#endif } ELSE { @@ -907,34 +855,6 @@ void con_tcx_fx( /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1: exc*/ /*buf[0;M] Q0: mem_syn*/ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( A_cng != NULL ) - { - float alpha_delayed; - - alpha_delayed = 1.0f; - if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE ) - { - alpha_delayed = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); - } - - if ( st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f ) - { - float lsp_local[M], lsp_fade[M], alpha_inv; - - alpha_inv = 1.0f - alpha_delayed; - - a2lsp_stab( A_local, lsp_local, lsp_local ); - - for ( i = 0; i < M; i++ ) - { - lsp_fade[i] = alpha_delayed * lsp_local[i] + alpha_inv * st->lspold_cng[i]; - } - - lsp2a_stab( lsp_fade, A_local, M ); - } - } -#endif E_UTIL_synthesis( sub( Q_exc, Q_syn ), A_local, @@ -1434,19 +1354,7 @@ void con_tcx_ivas_fx( move16(); /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif IF( EQ_16( st->nbLostCmpt, 1 ) ) { st->cummulative_damping = 32767 /*1.f Q15*/; @@ -1513,19 +1421,7 @@ void con_tcx_ivas_fx( } set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ /* PLC: calculate damping factor */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - alpha = 1.0f; - if ( st->element_mode == IVAS_CPE_MDCT && st->nbLostCmpt >= MDCT_ST_PLC_FADEOUT_START_FRAME ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_START_FRAME, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac, &( st->lp_gainp ), 0 ); - } -#else alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ -#endif } /*-----------------------------------------------------------------* @@ -1666,7 +1562,6 @@ void con_tcx_ivas_fx( } /* PLC: [TCX: Fade-out] retrieve background level */ -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT tmp16 = 32767; move16(); IF( A_cng != NULL ) @@ -1677,11 +1572,6 @@ void con_tcx_ivas_fx( { gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q13*/ } -#else - tmp16 = 32767; - move16(); - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); -#endif IF( st->tcxonly != 0 ) { /* gainCNG = st->conCngLevelBackgroundTrace/gainSynthDeemph; */ @@ -1689,7 +1579,6 @@ void con_tcx_ivas_fx( hTcxDec->conCngLevelBackgroundTrace_e, gainSynthDeemph, gainSynthDeemph_e, &gainCNG, &gainCNG_e ); -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT test(); IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && A_cng != NULL ) { @@ -1705,7 +1594,6 @@ void con_tcx_ivas_fx( gainCNG = extract_l( Mpy_32_32( gainCNG, L_tmp ) ); /*Q15-gainCNG_e*/ } } -#endif } ELSE { @@ -1882,7 +1770,6 @@ void con_tcx_ivas_fx( /*buf[OLD_EXC_SIZE_DEC;3/2 L_frame] Q1: exc*/ /*buf[0;M] Q0: mem_syn*/ -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT IF( A_cng != NULL ) { Word16 alpha_delayed; @@ -1914,7 +1801,6 @@ void con_tcx_ivas_fx( E_LPC_f_lsp_a_conversion( lsp_fade, A_local, M ); } } -#endif E_UTIL_synthesis( sub( Q_exc, Q_syn ), diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 090409b4c..c0281c7e3 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -957,14 +957,10 @@ ivas_error evs_dec_fx( } st_fx->lp_noise = hFdCngDec->lp_noise; /*Q9.23*/ move32(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - ApplyFdCng_fx( output, NULL, realBuffer, imagBuffer, st, concealWholeFrame, 0 ); -#else #ifdef REMOVE_EVS_DUPLICATES ApplyFdCng_ivas_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); #else ApplyFdCng_fx( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); -#endif #endif /* Generate additional comfort noise to mask potential coding artefacts */ test(); diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 47a61a26e..893b49241 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -559,9 +559,6 @@ void deleteFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec ) Word16 ApplyFdCng_fx( Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - Word16 *powerSpectrum, -#endif Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer cldfbBufferScale*/ Word32 **cldfbBufferImag, /* i/o: imaginary part of the CLDFB buffer cldfbBufferScale*/ Word16 *cldfbBufferScale, /* o : pointer to the scalefactor for real and imaginary part of the CLDFB buffer */ @@ -588,16 +585,6 @@ Word16 ApplyFdCng_fx( move16(); move16(); #endif -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - int16_t L_frame, last_L_frame; - int32_t sr_core; - - PMT( "Fix point code missing for IVAS_CODE_CNG_FIX185_PLC_FADEOUT" ) - /* limit L_frame and core fs values for MDCT-Stereo modes which can have higher core sampling than 16kHz, but use a downsampled buffer */ - L_frame = min( st->L_frame, L_FRAME16k ); - last_L_frame = min( st->last_L_frame, L_FRAME16k ); - sr_core = min( st->sr_core, INT_FS_16k ); -#endif hFdCngDec = st->hFdCngDec; hFdCngCom = hFdCngDec->hFdCngCom; @@ -636,27 +623,6 @@ Word16 ApplyFdCng_fx( /* set noise estimation inactive during concealment, as no update with noise generated by concealment should be performed. */ /* set noise estimation inactive during concealment, no update with noise generated by concealment should be performed. */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - if ( concealWholeFrame == 0 && - ( timeDomainInput == NULL || - ( *timeDomainInput( -FLT_MAX ) && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) < FLT_MAX && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && - ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD ) && - !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || - ( st->element_mode == IVAS_CPE_TD ) ) && - ( !st->BER_detect ) ) -#else test(); test(); test(); @@ -671,14 +637,9 @@ Word16 ApplyFdCng_fx( IF( ( concealWholeFrame == 0 ) && ( LT_16( *timeDomainInput, MAXVAL_WORD16 ) ) && GT_16( *timeDomainInput, MINVAL_WORD16 ) && ( LT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MAXVAL_WORD16 ) ) && GT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MINVAL_WORD16 ) && ( ( ( hFdCngDec->flag_dtx_mode == 0 ) && ( st->VAD != 0 ) ) == 0 ) && ( ( ( st->cng_type == LP_CNG ) && ( hFdCngDec->flag_dtx_mode != 0 ) ) == 0 ) && ( is_music == 0 ) && ( st->BER_detect == 0 ) ) -#endif { /* Perform noise estimation at the decoder */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif /* Update the shaping parameters */ test(); @@ -790,16 +751,6 @@ Word16 ApplyFdCng_fx( move16(); } } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( st->element_mode == IVAS_CPE_MDCT && timeDomainInput == NULL ) - { - st->hTcxDec->CngLevelBackgroundTrace_bfi = sqrtf( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / NORM_MDCT_FACTOR ); - } - else - { - st->hTcxDec->CngLevelBackgroundTrace_bfi = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); - } -#endif /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); L_tmp = L_deposit_h( 0 ); @@ -840,11 +791,8 @@ Word16 ApplyFdCng_fx( IF( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif + } } test(); @@ -860,58 +808,11 @@ Word16 ApplyFdCng_fx( IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( GT_32( L_shl_o( L_tmp, L_tmp_exp, &Overflow ), 21474836 ) /*0.01f Q31*/ ) ) { /* update isf cng estimate for concealment. Do that during concealment, in order to avoid addition clean channel complexity*/ -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0 ); E_LPC_a_lsp_conversion( hFdCngCom->A_cng, lsp_cng, st->lspold_cng, M ); Copy( lsp_cng, st->lspold_cng, M ); /*Q15*/ lsp2lsf_fx( lsp_cng, st->lsf_cng, M, st->sr_core ); -#else - if ( st->element_mode == IVAS_CPE_MDCT && st->core != ACELP_CORE ) - { - float scf[SNS_NPTS]; - float scf_int[FDNS_NPTS]; - float whitenend_noise_shape[L_FRAME16k]; - int16_t inc, start_idx, stop_idx; - float *noiseLevelPtr; - - - inc = ( st->core > TCX_20 ) ? 2 : 1; - start_idx = hFdCngCom->startBand / inc; - stop_idx = L_frame / inc; - noiseLevelPtr = cngNoiseLevel; - - set_zero( whitenend_noise_shape, start_idx ); - for ( j = start_idx; j < stop_idx; j++, noiseLevelPtr += inc ) - { - whitenend_noise_shape[j] = *noiseLevelPtr; - } - if ( st->core == TCX_20_CORE ) - { - st->hTonalMDCTConc->psychParams = &st->hTonalMDCTConc->psychParamsTCX20; - } - else - { - st->hTonalMDCTConc->psychParams = &st->hTonalMDCTConc->psychParamsTCX10; - } - - sns_compute_scf( whitenend_noise_shape, st->hTonalMDCTConc->psychParams, L_frame, scf ); - sns_interpolate_scalefactors( scf_int, scf, ENC ); - sns_interpolate_scalefactors( st->hTonalMDCTConc->scaleFactorsBackground_flt, scf, DEC ); - sns_shape_spectrum( whitenend_noise_shape, st->hTonalMDCTConc->psychParams, scf_int, L_frame ); - - mvr2r( whitenend_noise_shape + start_idx, cngNoiseLevel, stop_idx - start_idx ); - wmops_sub_end(); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0.f ); - a2lsp_stab( hFdCngCom->A_cng, lsp_cng, st->lspold_cng ); - mvr2r( lsp_cng, st->lspold_cng, M ); - lsp2lsf( lsp_cng, st->lsf_cng, M, sr_core ); - } - -#endif st->plcBackgroundNoiseUpdated = 1; move16(); } @@ -929,11 +830,7 @@ Word16 ApplyFdCng_fx( IF( st != NULL && st->cng_type == LP_CNG ) { /* Perform noise estimation on inactive phase at the decoder */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - perform_noise_estimation_dec_fx( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); -#else perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); -#endif /* Update the shaping parameters */ test(); @@ -947,9 +844,6 @@ Word16 ApplyFdCng_fx( Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it Q31 - hFdCngDec->bandNoiseShape_exp*/ *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; move16(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - st->cngTDLevel = (float) sqrt( ( sum_f( cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand ) / 2 * hFdCngCom->fftlen ) / L_frame ); -#else /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); L_tmp = L_deposit_h( 0 ); @@ -985,7 +879,6 @@ Word16 ApplyFdCng_fx( move16(); st->cngTDLevel_e = L_tmp_exp; move16(); -#endif BREAK; } hFdCngCom->inactive_frame_counter = add( hFdCngCom->inactive_frame_counter, 1 ); @@ -1903,9 +1796,6 @@ Word16 ApplyFdCng_ivas_fx( void perform_noise_estimation_dec_fx( const Word16 *timeDomainInput, /* i: pointer to time domain input Q*/ const Word16 Q, -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - float *power_spectrum, -#endif HANDLE_FD_CNG_DEC hFdCngDec /* i/o: FD_CNG structure containing all buffers and variables */ ) { @@ -1936,53 +1826,11 @@ void perform_noise_estimation_dec_fx( move16(); /* Perform STFT analysis */ -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - IF( !( EQ_16( element_mode, IVAS_CPE_MDCT ) && power_spectrum != NULL ) ) - { - /* Perform STFT analysis */ - AnalysisSTFT( timeDomainInput, Q, fftBuffer, &fftBuffer_exp, hFdCngDec->hFdCngCom ); - } -#else /* Perform STFT analysis */ AnalysisSTFT( timeDomainInput, Q, fftBuffer, &fftBuffer_exp, hFdCngDec->hFdCngCom ); -#endif fftBuffer_exp = add( fftBuffer_exp, WORD16_BITS - 1 ); { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - if ( element_mode == IVAS_CPE_MDCT && power_spectrum != NULL ) - { - /* use power spectrum calculated in the MDCT-domain instead of calculating new power spectrum */ - periodog = power_spectrum; - } - else - { - /* Compute the squared magnitude in each FFT bin */ - if ( startBand == 0 ) - { - ( *ptr_per ) = fftBuffer[0] * fftBuffer[0]; /* DC component */ - ptr_per++; - ptr_r = fftBuffer + 2; - } - else - { - ptr_r = fftBuffer + 2 * startBand; - } - - ptr_i = ptr_r + 1; - - for ( ; ptr_per < periodog + stopFFTbin - startBand; ptr_per++ ) - { - ( *ptr_per ) = ( *ptr_r ) * ( *ptr_r ) + ( *ptr_i ) * ( *ptr_i ); - ptr_r += 2; - ptr_i += 2; - } - /* Nyquist frequency is discarded */ - - /* Rescale to get energy/sample: it should be 2*(1/N)*(2/N), parseval relation with 1/N,*2 for nrg computed till Nyquist only, 2/N as windowed samples correspond to half a frame*/ - v_multc( periodog, 4.f / (float) ( hFdCngDec->hFdCngCom->fftlen * hFdCngDec->hFdCngCom->fftlen ), periodog, stopFFTbin - startBand ); - } -#else assert( startBand != 0 ); len = sub( stopFFTbin, startBand ); @@ -2062,7 +1910,6 @@ void perform_noise_estimation_dec_fx( } hFdCngDec->hFdCngCom->periodog_exp = add( hFdCngDec->hFdCngCom->periodog_exp, sub( 2, s ) ); move16(); -#endif /* Adjust to the desired frequency resolution by averaging over spectral partitions for SID transmission */ bandcombinepow( periodog, hFdCngDec->hFdCngCom->periodog_exp, sub( stopFFTbin, startBand ), part, npart, psize_inv, hFdCngDec->msPeriodog, &hFdCngDec->msPeriodog_exp ); diff --git a/lib_dec/gs_dec_amr_wb_fx.c b/lib_dec/gs_dec_amr_wb_fx.c index 65e9eaa87..331142a44 100644 --- a/lib_dec/gs_dec_amr_wb_fx.c +++ b/lib_dec/gs_dec_amr_wb_fx.c @@ -24,9 +24,6 @@ #define NORMALIZE_SPECS_Q_OUT 6 #define ENER_FX_Q_GUARD 1 -#ifdef ADD_IVAS_GS_DEC_IMPR -#define CONTR_LIMIT 3012 to be verified for fixed point /* Threshold to allow an increase in the contribution length */ -#endif /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -35,10 +32,6 @@ static void Ener_per_band_fx( const Word16 exc_diff_fx[], const Word16 exc_diff_ static void Apply_gain_fx( Word16 exc_diffQ_fx[], Word32 L_Ener_per_bd_iQ[], Word32 L_Ener_per_bd_yQ[], const Word16 Q_out ); static void normalize_spec_fx( Word16 fac_up_fx, Word16 fy_norm_fx[], const Word16 L_frame, const Word16 Q_out ); static void gs_dec_amr_wb_fx( const long core_brate, Word16 *seed_tcx, const Word16 dct_in_fx[], const Word16 Q_dct_in, Word16 dct_out_fx[], Word16 Q_dct_out, const Word16 pitch_fx[], const Word16 voice_fac, const Word16 clas, const Word16 coder_type -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag -#endif ); /*-------------------------------------------------------------------* @@ -223,10 +216,6 @@ static void gs_dec_amr_wb_fx( const Word16 voice_fac, /* i : gain pitch Q15*/ const Word16 clas, /* i : signal frame class Q0*/ const Word16 coder_type /* i : coder type Q0*/ -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ -#endif ) { Word16 i, mDiff_len; @@ -280,13 +269,7 @@ static void gs_dec_amr_wb_fx( temp = Invert16( temp, &exp ); /* Q15 */ L_temp = L_mult( temp, 12800 ); /* Q15 */ L_temp = L_shl( L_temp, sub( 3, exp ) ); /* *8.0f */ /* Q15 */ -#ifdef ADD_IVAS_GS_DEC_IMPR - test(); - test(); - IF( L_temp <= CONTR_LIMIT && ( VeryLowRateSTflag || GE_32( core_brate, ACELP_12k65 ) ) ) -#else if ( GE_32( core_brate, ACELP_12k65 ) ) -#endif { L_temp = L_shl( L_temp, 1 ); /* Q16 */ } @@ -311,16 +294,6 @@ static void gs_dec_amr_wb_fx( mDiff_len = s_max( round_fx( L_temp ), BIN_1k2 ); /* Q0 */ -#ifdef ADD_IVAS_GS_DEC_IMPR - IF( ( VeryLowRateSTflag && ( EQ_16( clas, VOICED_CLAS ) || EQ_16( clas, AUDIO_CLAS ) ) ) ) /* Do not apply normalization on VOICED signal in case of stereo */ - { - Copy( dct_in_fx, exc_diffQ, L_FRAME ); - - /* normalization of the spectrum and noise fill */ - normalize_spec_fx( 1 * 256, exc_diffQ + mDiff_len, sub( L_FRAME, mDiff_len ), NORMALIZE_SPECS_Q_OUT ); - } - ELSE -#endif { Copy( dct_in_fx, exc_diffQ_fx, mDiff_len ); /* Q_dct_in */ set16_fx( exc_diffQ_fx + mDiff_len, 0, sub( L_FRAME, mDiff_len ) ); @@ -387,10 +360,6 @@ void improv_amr_wb_gs_fx( const Word16 Last_ener_fx, /* i : Last energy (Q8) Q0*/ const Word16 rate_switching_reset, /* i : rate switching reset flag Q0*/ const Word16 last_coder_type /* i : Last coder_type Q0*/ -#ifdef ADD_IVAS_GS_DEC_IMPR - , - const Word16 VeryLowRateSTflag /* i : Enable the noise enhancement for very low rate stereo generic mode */ -#endif ) { Word16 i, exp_a, exp_b, exp_diff, j; @@ -413,18 +382,10 @@ void improv_amr_wb_gs_fx( test(); test(); test(); -#ifdef ADD_IVAS_GS_DEC_IMPR - IF( VeryLowRateSTflag || - ( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && - ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && - ( EQ_16( clas, UNVOICED_CLAS ) || EQ_16( clas, VOICED_TRANSITION ) ) ) || - EQ_16( coder_type, INACTIVE ) ) ) ) -#else IF( ( locattack == 0 && LE_32( core_brate, ACELP_12k65 ) ) && ( ( LT_32( core_brate, ACELP_8k85 ) && NE_16( clas, AUDIO_CLAS ) && ( ( clas == UNVOICED_CLAS ) || EQ_16( clas, VOICED_TRANSITION ) ) ) || ( EQ_16( coder_type, INACTIVE ) ) ) ) -#endif { /*------------------------------------------------------------* * two differents paths: @@ -495,10 +456,6 @@ void improv_amr_wb_gs_fx( *------------------------------------------------------------*/ edct_16fx( exc2_fx, dct_exc_in_fx, L_FRAME, 6, EVS_MONO ); gs_dec_amr_wb_fx( core_brate, seed_tcx, dct_exc_in_fx, Q_exc2, dct_exc_out_fx, Q_exc2, pitch_buf_fx, lt_voice_fac_fx, clas, coder_type -#ifdef ADD_IVAS_GS_DEC_IMPR - , - VeryLowRateSTflag -#endif ); edct_16fx( dct_exc_out_fx, exc2_fx, L_FRAME, 6, EVS_MONO ); diff --git a/lib_dec/hq_classifier_dec_fx.c b/lib_dec/hq_classifier_dec_fx.c index 5ff5dec58..c8dac0a0b 100644 --- a/lib_dec/hq_classifier_dec_fx.c +++ b/lib_dec/hq_classifier_dec_fx.c @@ -99,17 +99,11 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits max_brate = HQ_48k; /* Q0 */ move32(); } -#ifndef SOLVED_COMP_ENC_DEC test(); test(); test(); test(); IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_FRAME48k ) ) && LE_32( core_brate, max_brate ) ) -#else - /*_DIFF_FLOAT_FIX_ -> could this modification break the interoperability with EVS ?? */ - test(); - IF( ( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) && LE_32( core_brate, max_brate ) ) -#endif { *hqswb_clas = get_next_indice( st_fx, 2 ); /* Q0 */ move16(); @@ -147,11 +141,7 @@ Word16 hq_classifier_dec_fx( /* o : Consumed bits *hqswb_clas = HQ_GEN_SWB; /* Q0 */ move16(); } -#ifndef SOLVED_COMP_ENC_DEC ELSE IF( EQ_16( length, L_FRAME48k ) ) -#else - ELSE IF( EQ_16( length, L_SPEC48k ) ) -#endif { *hqswb_clas = HQ_GEN_FB; /* Q0 */ move16(); diff --git a/lib_dec/hq_core_dec_fx.c b/lib_dec/hq_core_dec_fx.c index 4d1ef6774..3c2cd5a80 100644 --- a/lib_dec/hq_core_dec_fx.c +++ b/lib_dec/hq_core_dec_fx.c @@ -78,22 +78,10 @@ void hq_core_dec_fx( /*num_bits = (short)(st->total_brate / 50); */ Mpy_32_16_ss( st_fx->total_brate, 5243, &L_tmp, &lsb ); /* 5243 is 1/50 in Q18. (0+18-15=3) */ num_bits = extract_l( L_shr( L_tmp, 3 ) ); /*Q0 */ - -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - /* Set default spectrum length */ - L_spec = l_spec_tbl[st_fx->bwidth]; -#endif IF( !st_fx->bfi ) { IF( EQ_16( core_switching_flag, 1 ) ) { -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) - { - L_spec = l_spec_ext_tbl[st_fx->bwidth]; - } - ELSE -#endif { core_switching_hq_prepare_dec_fx( st_fx, &num_bits, output_frame ); @@ -105,12 +93,6 @@ void hq_core_dec_fx( } } } -#ifdef ADD_IVAS_HQ_CODE - IF( hq_recovery_flag ) - { - acelp_plc_mdct_transition( st ); - } -#endif /* subtract signalling bits */ num_bits = sub( num_bits, st_fx->next_bit_pos ); /* Q0 */ @@ -145,9 +127,7 @@ void hq_core_dec_fx( /* set inner frame (== coded bandwidth) length */ inner_frame = inner_frame_tbl[st_fx->bwidth]; /* Q0 */ move16(); -#ifndef ADD_IVAS_HQ_CODE_L_SPEC L_spec = inner_frame; /* Q0 */ -#endif move16(); IF( st_fx->bfi == 0 ) @@ -233,12 +213,6 @@ void hq_core_dec_fx( move16(); } -#ifdef ADD_IVAS_HQ_CODE - test(); - test(); - test(); - IF( EQ_16( st_fx->element_mode, EVS_MONO ) || ( !core_switching_flag && !hq_recovery_flag ) ) -#endif { /* scaling (coefficients are in nominal level) */ IF( NE_16( output_frame, NORM_MDCT_FACTOR ) ) @@ -322,59 +296,6 @@ void hq_core_dec_fx( * Overlap-add * Pre-echo reduction *--------------------------------------------------------------------------*/ -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO && ( core_switching_flag || hq_recovery_flag ) ) - { - /* Initializations for TCX MDCT framework, to be used for switching frame */ - tcx_cfg = st->hTcxCfg; - L_frameTCX_glob = hTcxDec->L_frameTCX; - L_frame_glob = st->L_frame; - L_spec = hTcxDec->L_frameTCX; - st->fscale = sr2fscale( st->sr_core ); - fscaleFB = sr2fscale( st->output_Fs ); - encoderLookahead = ( L_LOOK_12k8 * st->fscale ) / FSCALE_DENOM; - encoderLookaheadFB = ( L_LOOK_12k8 * fscaleFB ) / FSCALE_DENOM; - mdctWindowLength = getMdctWindowLength( st->fscale ); - mdctWindowLengthFB = (int16_t) ( mdctWindowLength * st->output_Fs / st->sr_core ); - if ( core_switching_flag ) - { - tcx_cfg->tcx_last_overlap_mode = TRANSITION_OVERLAP; - tcx_cfg->tcx_curr_overlap_mode = FULL_OVERLAP; - } - else - { - tcx_cfg->tcx_last_overlap_mode = ALDO_WINDOW; - tcx_cfg->tcx_curr_overlap_mode = ALDO_WINDOW; - st->last_core = HQ_CORE; /* Needed to decode non-transition frame */ - } - - init_tcx_window_cfg( tcx_cfg, st->sr_core, st->output_Fs, st->L_frame, hTcxDec->L_frameTCX, encoderLookahead, encoderLookaheadFB, mdctWindowLength, mdctWindowLengthFB, st->element_mode ); - - init_tcx_info( st, L_frame_glob, L_frameTCX_glob, 0, st->bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); - - overlap = tcx_cfg->tcx_mdct_window_length; - overlapFB = tcx_cfg->tcx_mdct_window_lengthFB; - index = tcx_cfg->tcx_last_overlap_mode; - - /* LB synthesis */ - IMDCT_fx( t_audio_q, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, wtda_audio, tcx_cfg->tcx_aldo_window_1_trunc, tcx_cfg->tcx_aldo_window_2, tcx_cfg->tcx_mdct_window_half, tcx_cfg->tcx_mdct_window_minimum, tcx_cfg->tcx_mdct_window_trans, tcx_cfg->tcx_mdct_window_half_length, tcx_cfg->tcx_mdct_window_min_length, index, - MDCT_IV, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, 0, st->bfi, hHQ_core->old_outLB, 0, st, 0, acelp_zir ); - - mvr2r( wtda_audio + ( overlap >> 1 ) - tcx_offset, output, L_frame_glob ); - - /* FB synthesis */ - IMDCT_fx( t_audio_q, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, wtda_audio, tcx_cfg->tcx_aldo_window_1_FB_trunc, tcx_cfg->tcx_aldo_window_2_FB, tcx_cfg->tcx_mdct_window_halfFB, tcx_cfg->tcx_mdct_window_minimumFB, tcx_cfg->tcx_mdct_window_transFB, tcx_cfg->tcx_mdct_window_half_lengthFB, tcx_cfg->tcx_mdct_window_min_lengthFB, index, - MDCT_IV, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, 0, st->bfi, hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); - - mvr2r( wtda_audio + ( overlapFB >> 1 ) - tcx_offsetFB, synth, L_frameTCX_glob ); - - if ( !core_switching_flag ) - { - st->last_core = ACELP_CORE; /* Restore last core */ - } - } - else -#endif { test(); IF( EQ_16( output_frame, L_FRAME8k ) || st_fx->bfi == 0 ) @@ -392,24 +313,6 @@ void hq_core_dec_fx( move16(); } } -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO ) - { - if ( st->bfi ) - { - /* Rough resampling, but reduces energy loss in case of switch to ACELP in first good frame */ - lerp( t_audio_q, wtda_audio_LB, st->L_frame, inner_frame ); - v_multc( t_audio_q, 0.5f, wtda_audio_LB, st->L_frame ); - } - else - { - /* LB synthesis for potential switch to ACELP */ - ener_match = (float) sqrt( (float) st->L_frame / (float) output_frame ); - v_multc( t_audio_q, ener_match, t_audio_q, inner_frame ); - inverse_transform( t_audio_q, wtda_audio_LB, is_transient, st->L_frame, inner_frame, st->element_mode ); - } - } -#endif IF( EQ_16( output_frame, L_FRAME8k ) ) { test(); @@ -465,13 +368,6 @@ void hq_core_dec_fx( window_ola_fx( wtda_audio, synth, Q_synth, hHQ_core->old_out_fx, &hHQ_core->Q_old_wtda, output_frame, st_fx->hTcxCfg->tcx_last_overlap_mode, st_fx->hTcxCfg->tcx_curr_overlap_mode, st_fx->prev_bfi && !hHQ_core->ph_ecu_active, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth_fx ); } -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO ) - { - /* LB synthesis for potential switch to ACELP */ - window_ola( wtda_audio_LB, output, hHQ_core->old_outLB, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, st->prev_bfi && !hHQ_core->ph_ecu_active, hHQ_core->oldHqVoicing, hHQ_core->oldgapsynth ); - } -#endif test(); test(); IF( ( st_fx->bfi == 0 && st_fx->prev_bfi == 0 ) || !( GE_16( output_frame, L_FRAME16k ) ) ) @@ -561,13 +457,6 @@ void hq_core_dec_fx( Copy( &st_fx->mem_pitch_gain[2], &st_fx->mem_pitch_gain[nbsubfr + 2], nbsubfr ); /* Q14 */ set16_fx( &st_fx->mem_pitch_gain[2], 0, nbsubfr ); } -#ifdef ADD_IVAS_HQ_CODE - /* Move LB excitation to old_exc memory in case of switch HQ->ACELP */ - if ( st->element_mode > EVS_MONO ) - { - mvr2r( output, st->old_exc + L_EXC_MEM_DEC - st->L_frame, st->L_frame ); - } -#endif return; } diff --git a/lib_dec/hq_hr_dec_fx.c b/lib_dec/hq_hr_dec_fx.c index 89864bc3b..6423015bc 100644 --- a/lib_dec/hq_hr_dec_fx.c +++ b/lib_dec/hq_hr_dec_fx.c @@ -46,7 +46,6 @@ void ivas_hq_pred_hb_bws_fx( } ELSE { - // EVS_FUNC_MODIFIED st_fx->prev_ener_shb_fx = 0; move16(); L_tmp = L_deposit_l( 0 ); diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index 3a0960960..17999496e 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -239,16 +239,6 @@ void ivas_renderer_select( move16(); } -#if 0 // def DEBUGGING /*temp disabling this as paramMC crashes with CREND*/ - IF ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_CREND ) - { - *renderer_type = RENDERER_BINAURAL_MIXER_CONV; - } - ELSE IF ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) - { - *renderer_type = RENDERER_BINAURAL_FASTCONV; - } -#endif test(); IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { diff --git a/lib_dec/tns_base_dec_fx.c b/lib_dec/tns_base_dec_fx.c index 13f6ca461..def1ffefb 100644 --- a/lib_dec/tns_base_dec_fx.c +++ b/lib_dec/tns_base_dec_fx.c @@ -26,11 +26,8 @@ typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff * * *---------------------------------------------------------------------*/ -#ifdef IVAS_CODE -void -#else + Word16 -#endif ReadTnsData( STnsConfig const *pTnsConfig, Decoder_State *st, @@ -47,20 +44,6 @@ ReadTnsData( IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) { -#ifdef IVAS_CODE - IF( pTnsConfig->allowTnsOnWhite ) - { - IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) - { - ReadFromBitstream( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, st, &stream, pnSize ); - } - ELSE - { - ReadFromBitstream( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, st, &stream, pnSize ); - } - } - ELSE -#endif { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) @@ -81,19 +64,10 @@ ReadTnsData( move16(); *pnBits = sub( st->next_bit_pos, start_bit_pos ); - -#ifdef IVAS_CODE - return; -#else return TNS_NO_ERROR; -#endif } -#define IVAS_CODE -#ifdef IVAS_CODE + void -#else -Word16 -#endif ReadTnsData_ivas_fx( STnsConfig const *pTnsConfig, Decoder_State *st, @@ -109,7 +83,6 @@ ReadTnsData_ivas_fx( IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) { -#ifdef IVAS_CODE IF( pTnsConfig->allowTnsOnWhite ) { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) @@ -122,7 +95,6 @@ ReadTnsData_ivas_fx( } } ELSE -#endif { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) @@ -143,13 +115,9 @@ ReadTnsData_ivas_fx( move16(); *pnBits = sub( st->next_bit_pos, start_bit_pos ); -#ifdef IVAS_CODE return; -#else - return TNS_NO_ERROR; -#endif } -#undef IVAS_CODE + /*---------------------------------------------------------------------* * DecodeTnsData() * @@ -169,21 +137,6 @@ Word16 DecodeTnsData( IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) { - -#ifdef IVAS_CODE - IF( pTnsConfig->allowTnsOnWhite ) - { - IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) - { - SetParameters( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, pTnsData, &stream, pnSize ); - } - ELSE - { - SetParameters( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); - } - } - ELSE -#endif { IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) { diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index bc7e1d536..7465a7f65 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -103,18 +103,6 @@ ivas_error TonalMDCTConceal_Init( hTonalMDCTConc->nScaleFactors = nScaleFactors; move16(); -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - PMTE() - set_zero( hTonalMDCTConc->scaleFactorsBackground, FDNS_NPTS ); - PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); - PsychoacousticParameters_Init( INT_FS_16k, L_FRAME16k / 2, 64, 0, 1, &hTonalMDCTConc->psychParamsTCX10 ); - hTonalMDCTConc->psychParams = NULL; - hTonalMDCTConc->scf_fadeout = 1.0f; - hTonalMDCTConc->last_block_nrg = 0.0f; - hTonalMDCTConc->curr_noise_nrg = 0.0f; - hTonalMDCTConc->faded_signal_nrg = 0.0f; - -#endif /* Offset the pointer to the end of buffer, so that pTCI is not destroyed when new time samples are stored in lastPcmOut */ move16(); @@ -198,9 +186,6 @@ ivas_error TonalMDCTConceal_Init_ivas_fx( hTonalMDCTConc->nScaleFactors = nScaleFactors; move16(); - //#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - // PMTE() - // To be uncommented when field of fixed type is added for scaleFactorsBackground set32_fx( hTonalMDCTConc->scaleFactorsBackground_fx, 0, FDNS_NPTS ); hTonalMDCTConc->scf_fadeout = 16384 /*1.000000 Q14*/; PsychoacousticParameters_Init_fx( INT_FS_16k, L_FRAME16k, 64, 1, 1, &hTonalMDCTConc->psychParamsTCX20 ); @@ -243,10 +228,6 @@ void TonalMDCTConceal_SaveFreqSignal( const Word16 *scaleFactors, // Q31-scaleFactors_exp const Word16 *scaleFactors_exp, const Word16 gain_tcx_exp -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - , - const int16_t infoIGFStartLine -#endif ) { Word16 *temp; @@ -340,20 +321,6 @@ void TonalMDCTConceal_SaveFreqSignal( test(); IF( ( nNewSamples > 0 ) && ( LE_16( nNewSamples, 2 * L_FRAME_MAX ) ) ) { -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - int16_t i; - PMTE() - hTonalMDCTConc->last_block_nrg_flt = 0.0f; - for ( i = 0; i < infoIGFStartLine; i++ ) - { - hTonalMDCTConc->lastBlockData.spectralData[i] = mdctSpectrum[i]; - hTonalMDCTConc->last_block_nrg_flt += mdctSpectrum[i] * mdctSpectrum[i]; - } - for ( ; i < nNewSamples; i++ ) - { - hTonalMDCTConc->lastBlockData.spectralData[i] = mdctSpectrum[i]; - } -#else /* Store new data */ s = getScaleFactor32( mdctSpectrum, nNewSamples ); @@ -375,7 +342,6 @@ void TonalMDCTConceal_SaveFreqSignal( move16(); } hTonalMDCTConc->lastBlockData.spectralData_exp = sub( mdctSpectrum_exp, s ); -#endif move16(); hTonalMDCTConc->lastBlockData.gain_tcx_exp = gain_tcx_exp; @@ -2207,19 +2173,12 @@ void TonalMDCTConceal_InsertNoise( Word16 *pSeed, /*IN/OUT*/ const Word16 tiltCompFactor, // Q15 Word16 crossfadeGain, // Q15 -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - const Word16concealment_noise[L_FRAME48k], - const float cngLevelBackgroundTrace_bfi, -#endif const Word16 crossOverFreq ) { Word16 i, ld, fac; Word16 rnd, exp, exp_last, exp_noise, inv_samples, inv_exp; Word16 g, tiltFactor, tilt, tmp; Word32 nrgNoiseInLastFrame, nrgWhiteNoise, L_tmp, L_tmp2; -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - float last_block_nrg_correct; -#endif g = sub( 32767 /*1.0f Q15*/, crossfadeGain ); @@ -2230,16 +2189,6 @@ void TonalMDCTConceal_InsertNoise( rnd = *pSeed; move16(); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - /* based on what is done in tcx_noise_filling() */ - /* always initialize these to avoid compiler warnings */ - tiltFactor = (float) pow( max( 0.375f, tiltCompFactor ), 1.0f / hTonalMDCTConc->lastBlockData.nSamples ); - tilt = 1.0f; - nrgNoiseInLastFrame = 0.0f; - nrgWhiteNoise = 0.0f; - hTonalMDCTConc->faded_signal_nrg_flt = 0.0f; - last_block_nrg_correct = 0.0f; -#endif IF( hTonalMDCTConc->lastBlockData.blockIsValid == 0 ) { /* may just become active if the very first frame is lost */ @@ -2247,199 +2196,8 @@ void TonalMDCTConceal_InsertNoise( *mdctSpectrum_exp = SPEC_EXP_DEC; move16(); } -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT - else if ( concealment_noise != NULL ) - { - if ( !tonalConcealmentActive ) - { - /* if fadeout has not started yet, only apply sign scrambling */ - if ( crossfadeGain == 1.0f ) - { - for ( i = 0; i < crossOverFreq; i++ ) - { - if ( concealment_noise[i] > 0 ) - { - mdctSpectrum[i] = hTonalMDCTConc->lastBlockData.spectralData[i]; - } - else - { - mdctSpectrum[i] = -hTonalMDCTConc->lastBlockData.spectralData[i]; - } - } - - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - /* actual fadeout is done in this case */ - else - { - g *= (float) sqrt( cngLevelBackgroundTrace_bfi / hTonalMDCTConc->curr_noise_nrg_flt ); - - for ( i = 0; i < crossOverFreq; i++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[i]; - y = concealment_noise[i]; - - if ( y > 0 ) - { - mdctSpectrum[i] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[i] = g * y - crossfadeGain * x; - } - - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[i] * mdctSpectrum[i]; - } - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = 0.0f; - } - } - } - else - { - assert( hTonalMDCTConc->pTCI->numIndexes > 0 ); - - /* initialize bins of tonal components with zero: basically not - necessary, but currently the whole spectrum is rescaled in - mdct_noiseShaping() and then there would be a processing of - uninitialized values */ - for ( i = 0; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - for ( l = hTonalMDCTConc->pTCI->lowerIndex[i]; l <= hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) - { - mdctSpectrum[l] = 0; - if ( l < crossOverFreq ) - { - last_block_nrg_correct += hTonalMDCTConc->lastBlockData.spectralData[l] * hTonalMDCTConc->lastBlockData.spectralData[l]; - hTonalMDCTConc->curr_noise_nrg_flt -= concealment_noise[l] * concealment_noise[l]; - } - } - } - - /* if fadeout has not started yet, only apply sign scrambling */ - if ( crossfadeGain == 1.0f ) - { - for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) - { - if ( concealment_noise[l] > 0 ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - else - { - mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) - { - if ( concealment_noise[l] > 0 ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - else - { - mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - } - - for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) - { - if ( concealment_noise[l] > 0 ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - else - { - mdctSpectrum[l] = -hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = hTonalMDCTConc->lastBlockData.spectralData[l]; - } - } - /* actual fadeout is done in this case */ - else - { - g *= (float) sqrt( cngLevelBackgroundTrace_bfi / hTonalMDCTConc->curr_noise_nrg_flt ); - - for ( l = 0; l < hTonalMDCTConc->pTCI->lowerIndex[0]; l++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[l]; - y = concealment_noise[l]; - - if ( y > 0 ) - { - mdctSpectrum[l] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[l] = g * y - crossfadeGain * x; - } - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[l] * mdctSpectrum[l]; - } - for ( i = 1; i < hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - for ( l = hTonalMDCTConc->pTCI->upperIndex[i - 1] + 1; l < hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[l]; - y = concealment_noise[l]; - - if ( y > 0 ) - { - mdctSpectrum[l] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[l] = g * y - crossfadeGain * x; - } - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[l] * mdctSpectrum[l]; - } - } - - for ( l = hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1; l < crossOverFreq; l++ ) - { - x = hTonalMDCTConc->lastBlockData.spectralData[l]; - y = concealment_noise[l]; - - if ( y > 0 ) - { - mdctSpectrum[l] = g * y + crossfadeGain * x; - } - else - { - mdctSpectrum[l] = g * y - crossfadeGain * x; - } - hTonalMDCTConc->faded_signal_nrg_flt += mdctSpectrum[l] * mdctSpectrum[l]; - } - - for ( l = crossOverFreq; l < hTonalMDCTConc->lastBlockData.nSamples; l++ ) - { - mdctSpectrum[l] = 0.0f; - } - } - } - - if ( hTonalMDCTConc->faded_signal_nrg_flt > 0.0f && hTonalMDCTConc->curr_noise_nrg_flt > MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG ) - { - float nrg_corr_factor; - - nrg_corr_factor = sqrtf( ( hTonalMDCTConc->last_block_nrg_flt - last_block_nrg_correct ) / hTonalMDCTConc->faded_signal_nrg_flt ); - v_multc( mdctSpectrum, nrg_corr_factor, mdctSpectrum, crossOverFreq ); - } - } -#endif ELSE { -#ifndef IVAS_CODE_CNG_FIX185_PLC_FADEOUT L_tmp = 805306368l /*0.375f Q31*/; move32(); inv_exp = 15; @@ -2456,7 +2214,6 @@ void TonalMDCTConceal_InsertNoise( nrgNoiseInLastFrame = L_deposit_h( 0 ); nrgWhiteNoise = L_deposit_h( 0 ); exp_last = exp_noise = 0; -#endif move16(); move16(); IF( !tonalConcealmentActive ) @@ -3576,216 +3333,3 @@ void TonalMdctConceal_whiten_noise_shape_ivas_fx( pop_wmops(); } - - -#ifdef IVAS_CODE_CNG_FIX185_PLC_FADEOUT -void TonalMdctConceal_create_concealment_noise( - float concealment_noise[L_FRAME48k], - CPE_DEC_HANDLE hCPE, - const int16_t L_frameTCX, - const int16_t L_frame, - const int16_t idchan, - const int16_t subframe_idx, - const int16_t core, - const int16_t crossfade_gain, - const TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode ) -{ - STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct; - TonalMDCTConcealPtr hTonalMDCTConc; - Decoder_State *st; - HANDLE_FD_CNG_COM hFdCngCom; - int16_t *rnd_c, *rnd; - int16_t crossOverFreq, i, save_rnd_c, max_noise_line; - float c, c_inv; - float noise_shape_buffer[L_FRAME48k]; - int16_t inc, start_idx, stop_idx; - float *cngNoiseLevelPtr; - float last_scf; - - wmops_sub_start( "create_conc_noise" ); - - hStereoMdct = hCPE->hStereoMdct; - st = hCPE->hCoreCoder[idchan]; - hTonalMDCTConc = st->hTonalMDCTConc; - hFdCngCom = st->hFdCngDec->hFdCngCom; - rnd = &hStereoMdct->noise_seeds_channels[idchan]; - rnd_c = &hStereoMdct->noise_seed_common; - - /* determine start bin for IGF */ - if ( st->igf == 0 ) - { - if ( st->narrowBand == 0 ) - { - /* minimum needed for output with sampling rates lower then the - nominal sampling rate */ - crossOverFreq = min( L_frameTCX, L_frame ); - } - else - { - crossOverFreq = L_frameTCX; - } - } - else - { - crossOverFreq = min( st->hIGFDec->infoIGFStartLine, L_frameTCX ); - } - - /* for tonal mdct concealment with tonal components above the crossover frequency, conditionally raise the frequency index until which noise is generated */ - max_noise_line = crossOverFreq; - if ( st->tonal_mdct_plc_active ) - { - max_noise_line = max( max_noise_line, hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] + 1 ); - } - - /* first lost frame is handled separately */ - if ( !hTonalMDCTConc->lastBlockData.blockIsConcealed ) - { - *rnd = 1977 + idchan; - /* will be set twice when looping over two channels, but does not matter */ - *rnd_c = 1979; - } - - if ( crossfade_gain == 1.0f ) - { - /* In first frame, noise is weighted with zero anyway, we only need the random numbers for the sign scrambling */ - for ( i = 0; i < max_noise_line; i++ ) - { - *rnd = own_random( rnd ); - concealment_noise[i] = *rnd; - } - - wmops_sub_end(); - - return; - } - - save_rnd_c = *rnd_c; - - c = sqrtf( hStereoMdct->lastCoh ); - c_inv = sqrtf( 1 - hStereoMdct->lastCoh ); - - /* pre-compute the noise shape for later weighting of the noise spectra */ - cngNoiseLevelPtr = &hFdCngCom->cngNoiseLevel_flt[0]; - inc = ( st->core > TCX_20_CORE ) ? 2 : 1; - start_idx = hFdCngCom->startBand / inc; - stop_idx = hFdCngCom->stopFFTbin / inc; - - for ( i = 0; i < start_idx; i++ ) - { - noise_shape_buffer[i] = 0.0f; - } - for ( ; i < stop_idx; i++, cngNoiseLevelPtr += inc ) - { - noise_shape_buffer[i] = sqrtf( *( cngNoiseLevelPtr ) ); - } - - last_scf = sqrtf( *( cngNoiseLevelPtr - inc ) ); - - for ( ; i < max_noise_line; i++ ) - { - noise_shape_buffer[i] = last_scf; - } - - /* fill the noise vector */ - hTonalMDCTConc->curr_noise_nrg_flt = MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG; - if ( noise_gen_mode == EQUAL_CORES || ( ( noise_gen_mode == TCX20_IN_0_TCX10_IN_1 && idchan == 0 ) || ( noise_gen_mode == TCX10_IN_0_TCX20_IN_1 && idchan == 1 ) ) ) - { - /* current channel is TCX20 -> generate noise for "full-length" spectrum */ - for ( i = 0; i < max_noise_line; i++ ) - { - *rnd = own_random( rnd ); - *rnd_c = own_random( rnd_c ); - - concealment_noise[i] = ( c_inv * *rnd + c * *rnd_c ) * noise_shape_buffer[i]; - hTonalMDCTConc->curr_noise_nrg_flt += concealment_noise[i] * concealment_noise[i]; - } - } - else /* ( ( noise_gen_mode == TCX10_IN_0_TCX20_IN_1 && idchan == 0 ) || ( noise_gen_mode == TCX20_IN_0_TCX10_IN_1 && idchan == 1 ) ) */ - { - /* current channel is TCX10 and the other is TCX20 -> generate noise for "half-length" spectrum, but "increment" mid seed twice, to have the same seed in mid as the other (TCX20) channel for next frame */ - for ( i = 0; i < max_noise_line; i++ ) - { - *rnd = own_random( rnd ); - *rnd_c = own_random( rnd_c ); - - concealment_noise[i] = ( c_inv * *rnd + c * *rnd_c ) * noise_shape_buffer[i]; - hTonalMDCTConc->curr_noise_nrg_flt += concealment_noise[i] * concealment_noise[i]; - - *rnd_c = own_random( rnd_c ); - } - } - if ( st->tonal_mdct_plc_active ) - { - for ( i = crossOverFreq; i < max( crossOverFreq, hTonalMDCTConc->pTCI->lowerIndex[hTonalMDCTConc->pTCI->numIndexes - 1] ); ++i ) - { - concealment_noise[i] *= 0.0f; - } - } - /* restore common seed - - after finishing the first channel - - after a first subframe if the current channel is TCX10 */ - if ( ( idchan == 0 && ( core == TCX_20 || ( core == TCX_10 && subframe_idx == 1 ) ) ) || ( core == TCX_10 && subframe_idx == 0 ) ) - { - *rnd_c = save_rnd_c; - } - st->seed_tcx_plc = *rnd; - wmops_sub_end(); - - return; -} -void TonalMdctConceal_whiten_noise_shape( - Decoder_State *st, - const int16_t L_frame, - const TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE whitening_mode ) -{ - int16_t inc, start_idx, stop_idx; - float *noiseLevelPtr, *scfs_bg, *scfs_for_shaping; - HANDLE_FD_CNG_COM hFdCngCom; - float whitenend_noise_shape[L_FRAME16k]; - float scfs_int[FDNS_NPTS]; - const PsychoacousticParameters *psychParams; - - push_wmops( "apply_sns_on_noise_shape" ); - - scfs_bg = &st->hTonalMDCTConc->scaleFactorsBackground_flt[0]; - psychParams = st->hTonalMDCTConc->psychParams; - hFdCngCom = st->hFdCngDec->hFdCngCom; - - inc = ( ( whitening_mode == ON_FIRST_LOST_FRAME ? st->core : st->last_core ) > TCX_20_CORE ) ? 2 : 1; - start_idx = hFdCngCom->startBand / inc; - stop_idx = L_frame / inc; - noiseLevelPtr = hFdCngCom->cngNoiseLevel_flt; - - set_zero( whitenend_noise_shape, start_idx ); - for ( int16_t j = start_idx; j < stop_idx; j++, noiseLevelPtr += inc ) - { - whitenend_noise_shape[j] = *noiseLevelPtr; - } - - if ( whitening_mode == ON_FIRST_LOST_FRAME ) - { - float scf[SNS_NPTS]; - - sns_compute_scf( whitenend_noise_shape, psychParams, L_frame, scf ); - sns_interpolate_scalefactors( scfs_int, scf, ENC ); - sns_interpolate_scalefactors( scfs_bg, scf, DEC ); - scfs_for_shaping = &scfs_int[0]; - } - else /* whitening_mode == ON_FIRST_GOOD_FRAME */ - { - scfs_for_shaping = &scfs_bg[0]; - } - - if ( sum_f( scfs_for_shaping, FDNS_NPTS ) > 0.0f ) - { - sns_shape_spectrum( whitenend_noise_shape, psychParams, scfs_for_shaping, L_frame ); - mvr2r( whitenend_noise_shape + start_idx, hFdCngCom->cngNoiseLevel_flt, stop_idx - start_idx ); - } - else - { - set_zero( hFdCngCom->cngNoiseLevel_flt, stop_idx - start_idx ); - } - - pop_wmops(); -} -#endif diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index 0e1b951bb..81046fb19 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -576,23 +576,6 @@ void updt_dec_common_fx( test(); test(); test(); -#ifdef IVAS_CODE - /* Store long-term estimates of stab_fac and log energy diff to estimate env_stab in case of core switch ACELP/TCX->HQ */ - if ( st->element_mode != EVS_MONO ) - { - output_frame = NS2SA( st->output_Fs, FRAME_SIZE_NS ); - log_energy = log2f( ( sum2_f( synth, output_frame ) / output_frame ) + 1.0f ); - log_energy_diff = fabsf( st->log_energy_old - log_energy ); - st->log_energy_old = log_energy; - st->log_energy_diff_lt = ENV_SMOOTH_FAC * log_energy_diff + ( 1.0f - ENV_SMOOTH_FAC ) * st->log_energy_diff_lt; - if ( st->core == HQ_CORE ) - { - st->stab_fac = min( 1, ( STAB_FAC_EST1 + ( STAB_FAC_EST2 * st->hHQ_core->mem_env_delta ) + ( STAB_FAC_EST3 * st->log_energy_diff_lt ) ) ); - st->stab_fac = max( 0, st->stab_fac ); - } - st->stab_fac_smooth_lt = ENV_SMOOTH_FAC * st->stab_fac + ( 1.0f - ENV_SMOOTH_FAC ) * st->stab_fac_smooth_lt; - } -#endif IF( ( ( LE_32( st_fx->core_brate, SID_2k40 ) ) && EQ_16( st_fx->cng_type, FD_CNG ) ) || ( st_fx->tcxonly && EQ_16( st_fx->codec_mode, MODE2 ) ) ) { @@ -964,23 +947,6 @@ void ivas_updt_dec_common_fx( test(); test(); test(); -#ifdef IVAS_CODE - /* Store long-term estimates of stab_fac and log energy diff to estimate env_stab in case of core switch ACELP/TCX->HQ */ - if ( st->element_mode != EVS_MONO ) - { - output_frame = NS2SA( st->output_Fs, FRAME_SIZE_NS ); - log_energy = log2f( ( sum2_f( synth, output_frame ) / output_frame ) + 1.0f ); - log_energy_diff = fabsf( st->log_energy_old - log_energy ); - st->log_energy_old = log_energy; - st->log_energy_diff_lt = ENV_SMOOTH_FAC * log_energy_diff + ( 1.0f - ENV_SMOOTH_FAC ) * st->log_energy_diff_lt; - if ( st->core == HQ_CORE ) - { - st->stab_fac = min( 1, ( STAB_FAC_EST1 + ( STAB_FAC_EST2 * st->hHQ_core->mem_env_delta ) + ( STAB_FAC_EST3 * st->log_energy_diff_lt ) ) ); - st->stab_fac = max( 0, st->stab_fac ); - } - st->stab_fac_smooth_lt = ENV_SMOOTH_FAC * st->stab_fac + ( 1.0f - ENV_SMOOTH_FAC ) * st->stab_fac_smooth_lt; - } -#else IF( st_fx->element_mode != EVS_MONO ) { Word16 q_div = sub( Q31, shl( Qpostd, 1 ) ); @@ -1003,7 +969,6 @@ void ivas_updt_dec_common_fx( st_fx->stab_fac_smooth_lt_fx = extract_h( L_add( L_mult( ENV_SMOOTH_FAC_FX, st_fx->stab_fac_fx ), L_mult( sub( MAX_16, ENV_SMOOTH_FAC_FX ), st_fx->stab_fac_smooth_lt_fx ) ) ); // Q15 } -#endif test(); test(); diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index b031ca528..9dea812a6 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -462,7 +462,6 @@ void CNG_enc_fx( IF( hTdCngEnc->burst_ho_cnt > 0 ) { /**allow_cn_step |= ( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr] > 4 * hTdCngEnc->lp_ener_fx ); */ -#if 1 /*allow_cn_step |= (hDtxEnc->first_CNG || st->element_mode == EVS_MONO) && (hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] > lp_ener_thr_scale * hTdCngEnc->lp_ener);*/ /* (hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] > lp_ener_thr_scale * hTdCngEnc->lp_ener); */ L_tmp1 = L_shr( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr], 2 ); @@ -471,10 +470,6 @@ void CNG_enc_fx( L_tmp1 = L_add( L_tmp1, L_shr( hTdCngEnc->lp_ener_fx, 8 ) ); } L_tmp1 = L_sub( L_tmp1, hTdCngEnc->lp_ener_fx ); -#else - L_tmp1 = L_shr( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr], 2 ); - L_tmp1 = L_sub( L_tmp1, hTdCngEnc->lp_ener_fx ); -#endif test(); test(); IF( ( hDtxEnc->first_CNG > 0 || st_fx->element_mode == EVS_MONO ) && L_tmp1 > 0 ) diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index 4bb44eae2..c40db6678 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -138,487 +138,7 @@ void HBAutocorrelation_fx( move32(); } } -#ifdef ADD_IVAS_TNS -/*-------------------------------------------------------------------* - * TNSAnalysisStereo() - * - * - *-------------------------------------------------------------------*/ - -#define SIMILAR_TNS_THRESHOLD ( 0.04f ) -#define TNS_GAIN_THRESHOLD_FOR_WHITE ( 3.0f ) - -void TNSAnalysisStereo( - Encoder_State **sts, /* i : encoder state handle */ - float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* o : MDST spectrum */ - const int16_t bWhitenedDomain, /* i : whitened domain flag */ - int16_t tnsSize[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm */ - int16_t tnsBits[MCT_MAX_CHANNELS][NB_DIV], /* i : number of tns bits in the frame */ - int16_t param_core[][NB_DIV * NPRM_DIV], /* o : TNS parameters */ - const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ -) -{ - int16_t ch, k, L_spec, L_frame, nSubframes, iFilter; - float *spectrum; - Encoder_State *st = NULL; - TCX_ENC_HANDLE hTcxEnc = NULL; - int16_t individual_decision[NB_DIV]; - float maxPredictionGain = 0.f, meanPredictionGain; - - individual_decision[0] = 0; - individual_decision[1] = 0; - L_spec = -1; - L_frame = -1; - - /* TNS filter analysis, loop over channels */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - hTcxEnc = st->hTcxEnc; - - nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - /* reset tns on whitened domain flag */ - if ( !bWhitenedDomain ) - { - hTcxEnc->bTnsOnWhithenedSpectra[k] = 0; - hTcxEnc->fUseTns[k] = 0; - } - - if ( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - - spectrum = hTcxEnc->spectrum[k]; - L_frame = hTcxEnc->L_frameTCX; - st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )]; - L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; - - /*-----------------------------------------------------------* - * Temporal Noise Shaping analysis * - *-----------------------------------------------------------*/ - - if ( hTcxEnc->transform_type[k] == TCX_5 ) - { - /* rearrange LF sub-window lines prior to TNS analysis & filtering */ - tcx5TnsGrouping( L_frame >> 2, L_spec >> 1, spectrum ); - } - - /* WMOPS: All initializations are either for safety or static (tables) and thus not to be counted */ - ResetTnsData( &hTcxEnc->tnsData[k] ); - if ( st->hTcxCfg->pCurrentTnsConfig->maxOrder <= 0 ) - { - break; - } - - CalculateTnsFilt( st->hTcxCfg->pCurrentTnsConfig, spectrum, &hTcxEnc->tnsData[k], NULL ); - } - } - } - - if ( !mct_on ) - { - /* TNS decision */ - /* if framing differs between channels, keep the filter decision per channel */ - if ( ( sts[0]->hTcxEnc->transform_type[0] != sts[1]->hTcxEnc->transform_type[0] && - sts[0]->hTcxEnc->transform_type[1] != sts[1]->hTcxEnc->transform_type[1] ) || - sts[0]->hTcxCfg->fIsTNSAllowed != sts[1]->hTcxCfg->fIsTNSAllowed ) - { - individual_decision[0] = individual_decision[1] = 1; - } - else if ( bWhitenedDomain ) - { - nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] != sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) - { - individual_decision[k] = 1; - } - } - } - - /* framing equal, check for similar filters, if very similar (also indicator for and M signal), - * use at least the same decision, maybe use the same filter - */ - { - int16_t isTCX10; - isTCX10 = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 0 : 1; - - nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[0]->hTcxCfg->fIsTNSAllowed && individual_decision[k] != 1 && ( !bWhitenedDomain || sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - float maxPredGain = -1.0f; - sts[0]->hTcxCfg->pCurrentTnsConfig = &sts[0]->hTcxCfg->tnsConfig[sts[0]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[0]->last_core == ACELP_CORE )]; - sts[1]->hTcxCfg->pCurrentTnsConfig = &sts[1]->hTcxCfg->tnsConfig[sts[1]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[1]->last_core == ACELP_CORE )]; - -#ifdef DEBUGGING - assert( sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters == sts[1]->hTcxCfg->pCurrentTnsConfig->nMaxFilters ); -#endif - for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - STnsFilter *pFilter[2]; - struct TnsParameters const *pTnsParameters[2]; - pFilter[0] = sts[0]->hTcxEnc->tnsData[k].filter + iFilter; - pTnsParameters[0] = sts[0]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; - pFilter[1] = sts[1]->hTcxEnc->tnsData[k].filter + iFilter; - pTnsParameters[1] = sts[1]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; - -#ifdef DEBUGGING - assert( pTnsParameters[0]->startLineFrequency == pTnsParameters[1]->startLineFrequency ); - assert( pTnsParameters[0]->nSubdivisions == pTnsParameters[1]->nSubdivisions ); -#endif - /* if prediction gain and avgSqrCoef are both close we are pretty sure the filters are quite similar, use the avg of - * both filters for the decision - */ - meanPredictionGain = ( pFilter[0]->predictionGain + pFilter[1]->predictionGain ) * 0.5f; - maxPredictionGain = max( maxPredictionGain, meanPredictionGain ); - - if ( ( pFilter[0]->predictionGain > pTnsParameters[0]->minPredictionGain ) && ( sts[0]->element_brate < IVAS_80k ) && - ( pFilter[1]->predictionGain > pTnsParameters[1]->minPredictionGain ) && ( sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) ) - { - pFilter[0]->predictionGain = pFilter[1]->predictionGain = meanPredictionGain; /* more TNS filter sync at 48kbps */ - } - if ( ( fabs( pFilter[0]->predictionGain - pFilter[1]->predictionGain ) < SIMILAR_TNS_THRESHOLD * meanPredictionGain ) && - ( sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) ) - { - float maxAvgSqrCoef = max( pFilter[0]->avgSqrCoef, pFilter[1]->avgSqrCoef ); - float meanLtpGain = ( sts[0]->hTcxEnc->tcxltp_gain + sts[1]->hTcxEnc->tcxltp_gain ) * 0.5f; - maxPredGain = max( maxPredGain, meanPredictionGain ); - if ( ( meanPredictionGain > pTnsParameters[0]->minPredictionGain ) || ( maxAvgSqrCoef > pTnsParameters[0]->minAvgSqrCoef ) ) - { - if ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 || sts[1]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || meanLtpGain < 0.6f ) - { - ++sts[0]->hTcxEnc->tnsData[k].nFilters; - pFilter[0]->filterType = TNS_FILTER_ON; - ++sts[1]->hTcxEnc->tnsData[k].nFilters; - pFilter[1]->filterType = TNS_FILTER_ON; - } - else - { - const float maxEnergyChange = ( GetTCXMaxenergyChange( sts[0]->hTranDet, isTCX10, NSUBBLOCKS, 3 ) + GetTCXMaxenergyChange( sts[1]->hTranDet, isTCX10, NSUBBLOCKS, 3 ) ) * 0.5f; - - if ( maxEnergyChange >= pTnsParameters[0]->minEnergyChange ) - { - ++sts[0]->hTcxEnc->tnsData[k].nFilters; - pFilter[0]->filterType = TNS_FILTER_ON; - ++sts[1]->hTcxEnc->tnsData[k].nFilters; - pFilter[1]->filterType = TNS_FILTER_ON; - } - else - { - pFilter[0]->filterType = TNS_FILTER_OFF; - pFilter[1]->filterType = TNS_FILTER_OFF; - } - } - } - else if ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 && sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */ - { - pFilter[0]->filterType = TNS_FILTER_ON_ZERO; - pFilter[1]->filterType = TNS_FILTER_ON_ZERO; - ++sts[0]->hTcxEnc->tnsData[k].nFilters; - ++sts[1]->hTcxEnc->tnsData[k].nFilters; - } - else if ( sts[0]->hTcxEnc->tnsData[k].nFilters != sts[1]->hTcxEnc->tnsData[k].nFilters ) /* sanity check */ - { - assert( 0 ); - } - else - { - pFilter[0]->filterType = TNS_FILTER_OFF; - pFilter[1]->filterType = TNS_FILTER_OFF; - } - if ( ( pFilter[0]->filterType == TNS_FILTER_ON ) && ( pFilter[1]->filterType == TNS_FILTER_ON ) && ( sts[0]->element_brate < IVAS_80k ) ) - { - int16_t tmpIntValue = 0; - int16_t tmpCoeff[TNS_MAX_FILTER_ORDER]; - int16_t i, maxOrder = max( pFilter[0]->order, pFilter[1]->order ); - - set_s( tmpCoeff, 0, TNS_MAX_FILTER_ORDER ); - for ( i = 0; i < maxOrder; i++ ) - { - tmpIntValue = (int16_t) max( tmpIntValue, abs( pFilter[0]->coefIndex[i] - pFilter[1]->coefIndex[i] ) ); - } - if ( tmpIntValue == 1 ) /* the TNS coefficients are sufficiently similar to equalize the two filters */ - { - for ( i = maxOrder - 1; i >= 0; i-- ) - { - tmpCoeff[i] = ( abs( pFilter[0]->coefIndex[i] ) < abs( pFilter[1]->coefIndex[i] ) ? pFilter[0]->coefIndex[i] : pFilter[1]->coefIndex[i] ); - if ( ( tmpIntValue > 0 ) && ( tmpCoeff[i] == 0 ) ) - { - maxOrder--; - } - else - { - tmpIntValue = 0; - } - } - /* make sure that maxOrder is non zero and not all coefficients are zero (could happen in rare cases) */ - if ( maxOrder > 0 ) - { - for ( i = TNS_MAX_FILTER_ORDER - 1; i >= 0; i-- ) - { - pFilter[0]->coefIndex[i] = pFilter[1]->coefIndex[i] = tmpCoeff[i]; - } - - pFilter[0]->order = pFilter[1]->order = maxOrder; - } - } - } - } - else - { - individual_decision[k] = 1; - } - } - - if ( individual_decision[k] == 0 ) - { - sts[0]->hTcxEnc->fUseTns[k] = ( sts[0]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; - sts[1]->hTcxEnc->fUseTns[k] = ( sts[1]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; - } - else - { - sts[0]->hTcxEnc->tnsData[k].nFilters = 0; - sts[1]->hTcxEnc->tnsData[k].nFilters = 0; - sts[0]->hTcxEnc->fUseTns[k] = 0; - sts[1]->hTcxEnc->fUseTns[k] = 0; - for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - sts[0]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; - sts[1]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; - } - } - - if ( !bWhitenedDomain && individual_decision[k] == 0 && maxPredGain < TNS_GAIN_THRESHOLD_FOR_WHITE && sts[0]->hTcxEnc->transform_type[k] != TCX_5 ) - { - sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; - sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; - sts[0]->hTcxEnc->tnsData[k].nFilters = 0; - sts[1]->hTcxEnc->tnsData[k].nFilters = 0; - sts[0]->hTcxEnc->fUseTns[k] = 0; - sts[1]->hTcxEnc->fUseTns[k] = 0; - for ( iFilter = sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - ClearTnsFilterCoefficients( sts[0]->hTcxEnc->tnsData[k].filter + iFilter ); - ClearTnsFilterCoefficients( sts[1]->hTcxEnc->tnsData[k].filter + iFilter ); - } - } - maxPredictionGain = max( maxPredictionGain, maxPredGain ); - } - } - } - } - - /* individual decision for each channel */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - int16_t isTCX10; - isTCX10 = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 0 : 1; - - nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[ch]->hTcxCfg->fIsTNSAllowed && ( individual_decision[k] || mct_on ) && - ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - float maxPredGain = -1.0f; - - sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )]; - - for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - STnsFilter *pFilter; - const struct TnsParameters *pTnsParameters; - pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter; - pTnsParameters = sts[ch]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter; - maxPredGain = max( maxPredGain, pFilter->predictionGain ); - - if ( ( pFilter->predictionGain > pTnsParameters->minPredictionGain ) || ( pFilter->avgSqrCoef > pTnsParameters->minAvgSqrCoef ) ) - { - if ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 || isTCX10 || sts[ch]->hTcxEnc->tcxltp_gain < 0.6f ) - { - ++sts[ch]->hTcxEnc->tnsData[k].nFilters; - pFilter->filterType = TNS_FILTER_ON; - } - else - { - const float maxEnergyChange = GetTCXMaxenergyChange( sts[ch]->hTranDet, isTCX10, NSUBBLOCKS, 3 ); - - if ( maxEnergyChange >= pTnsParameters->minEnergyChange ) - { - ++sts[ch]->hTcxEnc->tnsData[k].nFilters; - pFilter->filterType = TNS_FILTER_ON; - } - else - { - pFilter->filterType = TNS_FILTER_OFF; - } - } - } - else if ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) /* If a previous filter is turned on */ - { - pFilter->filterType = TNS_FILTER_ON_ZERO; - ++sts[ch]->hTcxEnc->tnsData[k].nFilters; - } - else - { - pFilter->filterType = TNS_FILTER_OFF; - } - } - - sts[ch]->hTcxEnc->fUseTns[k] = ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) ? 1 : 0; - - if ( !bWhitenedDomain && maxPredGain < TNS_GAIN_THRESHOLD_FOR_WHITE && sts[ch]->hTcxEnc->transform_type[k] != TCX_5 ) - { - sts[ch]->hTcxEnc->fUseTns[k] = 0; - sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1; - sts[ch]->hTcxEnc->tnsData[k].nFilters = 0; - for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter ); - sts[ch]->hTcxEnc->tnsData[k].filter[iFilter].filterType = TNS_FILTER_OFF; - } - } - maxPredictionGain = max( maxPredictionGain, maxPredGain ); - } - } - } - - - /* we have the decision, set filter data accordingly */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( sts[ch]->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || sts[ch]->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - sts[ch]->hTcxCfg->pCurrentTnsConfig = &sts[ch]->hTcxCfg->tnsConfig[sts[ch]->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( sts[ch]->last_core == ACELP_CORE )]; - - for ( iFilter = sts[ch]->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - STnsFilter *pFilter; - pFilter = sts[ch]->hTcxEnc->tnsData[k].filter + iFilter; - switch ( pFilter->filterType ) - { - case TNS_FILTER_OFF: - ClearTnsFilterCoefficients( sts[ch]->hTcxEnc->tnsData[k].filter + iFilter ); - break; - case TNS_FILTER_ON_ZERO: - /* Since TNS filter of order 0 is not allowed we have to signal in the stream filter of order 1 with the 0th coefficient equal to 0 */ - ClearTnsFilterCoefficients( pFilter ); - pFilter->order = 1; - break; - } - } - } - } - } - - /* Apply filters, loop over channels */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - for ( k = 0; k < nSubframes; k++ ) - { - if ( bWhitenedDomain && ( ch > 0 ) && /* test for identical TNS filter data in both channels */ - sts[0]->hTcxCfg->fIsTNSAllowed && sts[0]->hTcxEnc->fUseTns[k] && - sts[1]->hTcxCfg->fIsTNSAllowed && sts[1]->hTcxEnc->fUseTns[k] ) - { - int16_t equalFilterData = ( sts[0]->hTcxCfg->pCurrentTnsConfig->nMaxFilters == sts[1]->hTcxCfg->pCurrentTnsConfig->nMaxFilters && - sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] == sts[1]->hTcxEnc->bTnsOnWhithenedSpectra[k] && - sts[0]->hTcxEnc->tnsData[k].nFilters == sts[1]->hTcxEnc->tnsData[k].nFilters ) - ? 1 - : 0; - if ( equalFilterData ) - { - for ( iFilter = st->hTcxCfg->pCurrentTnsConfig->nMaxFilters - 1; iFilter >= 0; iFilter-- ) - { - const int16_t *pDataCh0 = (const int16_t *) &sts[0]->hTcxEnc->tnsData[k].filter[iFilter]; - const int16_t *pDataCh1 = (const int16_t *) &sts[1]->hTcxEnc->tnsData[k].filter[iFilter]; - int16_t i = 2 + TNS_MAX_FILTER_ORDER; /* excl. informative float data. Portable? */ - - while ( ( i >= 0 ) && ( pDataCh0[i] == pDataCh1[i] ) ) - { - i--; - } - if ( i >= 0 ) - { - equalFilterData = 0; - break; - } - } - if ( equalFilterData ) - { - st->hTcxEnc->tnsData[k].nFilters *= -1; /* signals common TNS */ - } - } - } - if ( st->hTcxCfg->fIsTNSAllowed && ( !bWhitenedDomain || st->hTcxEnc->bTnsOnWhithenedSpectra[k] ) ) - { - L_spec = st->hTcxCfg->pCurrentTnsConfig->iFilterBorders[0]; - spectrum = st->hTcxEnc->spectrum[k]; - /* If TNS should be used then get the residual after applying it inplace in the spectrum */ - if ( st->hTcxEnc->fUseTns[k] ) - { - st->hTcxCfg->pCurrentTnsConfig = &st->hTcxCfg->tnsConfig[st->hTcxEnc->transform_type[k] == TCX_20][( k == 0 ) && ( st->last_core == ACELP_CORE )]; - - ApplyTnsFilter( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], spectrum, 1 ); - } - - if ( st->hTcxEnc->transform_type[k] == TCX_5 ) - { - tcx5TnsUngrouping( L_frame >> 2, L_spec >> 1, st->hTcxEnc->spectrum[k], ENC ); - } - - st->hTcxEnc->tnsData[k].tnsOnWhitenedSpectra = st->hTcxEnc->bTnsOnWhithenedSpectra[k]; - - EncodeTnsData( st->hTcxCfg->pCurrentTnsConfig, &st->hTcxEnc->tnsData[k], param_core[ch] + k * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, tnsSize[ch] + k, tnsBits[ch] + k ); - } - - if ( st->hTcxEnc->transform_type[k] == TCX_5 ) - { - tcx5SpectrumInterleaving( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum[k] ); - tcx5SpectrumInterleaving( st->hTcxCfg->tcx5SizeFB, mdst_spectrum[ch][k] ); - } - } - } - - return; -} - - -#endif void TNSAnalysis_fx( TCX_CONFIG_HANDLE hTcxCfg, /* i : configuration of TCX */ Word16 L_frame, /* input: frame length */ @@ -1317,154 +837,6 @@ void ShapeSpectrum_ivas_fx( } } -#ifdef ADD_IVAS_TNS -/*-----------------------------------------------------------* - * EstimateStereoTCXNoiseLevel() - * - * Estimate and quantize stereo noise factors - *-----------------------------------------------------------*/ - -void EstimateStereoTCXNoiseLevel( - Encoder_State **sts, /* i : state handle */ - float *q_spectrum[CPE_CHANNELS][NB_DIV], /* i : quantized MDCT spectrum */ - float gain_tcx[][NB_DIV], /* i : global gain */ - int16_t L_frame[][NB_DIV], /* i : frame length */ - int16_t noiseFillingBorder[][NB_DIV], /* i : noise filling border */ - int16_t hm_active[][NB_DIV], /* i : flag indicating if the harmonic model is active */ - const int16_t ignore_chan[], /* i : flag indicating whether the channel should be ignored */ - float fac_ns[][NB_DIV], /* o : noise filling level */ - int16_t param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -) -{ - int16_t ch, n; - int16_t nSubframes, maxNfCalcBw, iStart, noiseTransWidth; - float smooth_gain; - float combined_q_spectrum[N_MAX]; - int16_t *fac_ns_q; - int32_t total_brate; - - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - Encoder_State *st = sts[ch]; - TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; - - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - - if ( ignore_chan[ch] ) - { - continue; - } - total_brate = ( st->element_mode == IVAS_CPE_MDCT && !MCT_flag ) ? st->element_brate : st->total_brate; - - for ( n = 0; n < nSubframes; n++ ) - { - fac_ns_q = param_core[ch] + n * NPRM_DIV + 1; - maxNfCalcBw = min( noiseFillingBorder[ch][n], (int16_t) ( hTcxEnc->measuredBwRatio * (float) L_frame[ch][n] + 0.5f ) ); - if ( ( total_brate >= HQ_96k && ( st->element_mode <= IVAS_SCE || st->bwidth < SWB ) ) || total_brate > IVAS_192k ) - { - fac_ns[ch][n] = 0.0f; - *fac_ns_q = 0; - } - else - { - iStart = L_frame[ch][n] / ( ( total_brate >= ACELP_13k20 && !st->rf_mode ) ? 6 : 8 ); /* noise filling start bin*/ - - if ( n == 0 ) - { - mvr2r( hTcxEnc->ltpGainMemory, &hTcxEnc->ltpGainMemory[1], N_LTP_GAIN_MEMS - 1 ); - hTcxEnc->ltpGainMemory[0] = st->hTcxEnc->tcxltp_gain; - } - - smooth_gain = dotp( hTcxEnc->ltpGainMemory, nf_tw_smoothing_coeffs, N_LTP_GAIN_MEMS ); - - noiseTransWidth = GetTransWidth( st->tcxonly, ( L_frame[ch][n] == st->L_frame >> 1 ), smooth_gain, ( st->hTcxCfg->ctx_hm && st->last_core != ACELP_CORE && hm_active[ch][n] ) ); - - mvr2r( q_spectrum[ch][n], combined_q_spectrum, L_frame[ch][n] ); - tcx_noise_factor( hTcxEnc->spectrum[n], combined_q_spectrum, iStart, maxNfCalcBw, noiseTransWidth, L_frame[ch][n], gain_tcx[ch][n], hTcxEnc->noiseTiltFactor, &fac_ns[ch][n], fac_ns_q, st->element_mode ); - - /* hysteresis for very tonal passages (more stationary noise filling level) */ - if ( *fac_ns_q == 1 ) - { - hTcxEnc->noiseLevelMemory_cnt = (int16_t) min( INT16_MAX, 1 + abs( hTcxEnc->noiseLevelMemory_cnt ) ); /* update counter */ - } - else - { - if ( ( *fac_ns_q == 2 ) && ( abs( hTcxEnc->noiseLevelMemory_cnt ) > 5 ) ) - { - *fac_ns_q = 1; /* reduce noise filling level by one step */ - fac_ns[ch][n] = 0.75f / ( 1 << NBITS_NOISE_FILL_LEVEL ); - - /* signal that noise level is changed by inverting sign of level memory */ - hTcxEnc->noiseLevelMemory_cnt = ( hTcxEnc->noiseLevelMemory_cnt < 0 ) ? 5 : -1 - hTcxEnc->noiseLevelMemory_cnt; - } - else - { - hTcxEnc->noiseLevelMemory_cnt = 0; /* reset memory since level is too different */ - } - } - } /* bitrate */ - } -#ifdef DEBUG_MODE_MDCT - dbgwrite( &smooth_gain, sizeof( float ), 1, 1, "./res/smooth_gain" ); - dbgwrite( &st->hTcxEnc->tcxltp_gain, sizeof( float ), 1, 1, "./res/tcxltp_gain" ); - dbgwrite( &noiseTransWidth, sizeof( int16_t ), 1, 1, "./res/noiseTrans" ); - dbgwrite( &fac_ns[ch][0], sizeof( float ), 2, 1, "./res/fac_ns" ); -#endif - } - - return; -} - - -/*-----------------------------------------------------------* - * DecideTonalSideInfo() - * - * - *-----------------------------------------------------------*/ - -static int16_t DecideTonalSideInfo( - const float spectrum[], - const int16_t L_frame_glob, - float SFM2 ) -{ - float SFM, K, K2; - int16_t Tonal_SideInfo; - - SFM = SFM_Cal( spectrum, min( 200, L_frame_glob ) ); - - if ( L_frame_glob <= 256 ) - { - K = 0.4f; - K2 = 0.1f; - } - else if ( L_frame_glob == 320 || L_frame_glob == 512 ) - { - K = 0.4f; - K2 = 0.1f; - } - else /*FrameSize_Core == 640*/ - { - K = 0.35f; - K2 = 0.04f; - } - - - Tonal_SideInfo = 0; - if ( SFM < K ) - { - Tonal_SideInfo = 1; - } - - if ( SFM2 < K2 ) - { - Tonal_SideInfo = 1; - } - - return Tonal_SideInfo; -} -#endif - /*-------------------------------------------------------------------* * GetTransWidth() * diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c index 05f838a3a..5c0e4911c 100644 --- a/lib_enc/core_enc_init_fx.c +++ b/lib_enc/core_enc_init_fx.c @@ -53,14 +53,7 @@ void init_coder_ace_plus_fx( /* Bitrate */ st->tcxonly = (Word8) getTcxonly( -#ifdef IVAS_CODE_SWITCHING - st->element_mode, -#endif st->total_brate -#ifdef IVAS_CODE_SWITCHING - , - MCT_flag, st->is_ism_format -#endif ); move16(); diff --git a/lib_enc/core_enc_switch_fx.c b/lib_enc/core_enc_switch_fx.c index 2f21f1015..fb5fd037a 100644 --- a/lib_enc/core_enc_switch_fx.c +++ b/lib_enc/core_enc_switch_fx.c @@ -49,11 +49,7 @@ void core_coder_mode_switch_fx( switchWB = 1; /*force init when coming from MODE1*/ } -#ifdef IVAS_CODE_SWITCHING - tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); -#else tcxonly_tmp = getTcxonly( st->total_brate ); -#endif if ( NE_16( tcxonly_tmp, st->tcxonly ) ) { @@ -71,11 +67,7 @@ void core_coder_mode_switch_fx( move32(); st->L_frame = extract_l( Mult_32_16( st->sr_core, 0x0290 ) ); assert( st->L_frame == st->sr_core / 50 ); -#ifdef IVAS_CODE_SWITCHING - st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag, st->is_ism_format ); -#else st->tcxonly = (Word8) getTcxonly( st->total_brate ); -#endif /* st->bits_frame_nominal = (int)( (float)st->L_frame/(float)st->fscale ) * (float)FSCALE_DENOM/128.0f * (float)st->bitrate/100.0f + 0.49f ; */ /* st->bits_frame_nominal = extract_l(L_shr(Mpy_32_16_1( L_shl(st->bitrate,8), mult_r(div_s(st->fscale, shl(st->L_frame,4)), FL2WORD16(FSCALE_DENOM/12800.f))), 6)); */ tmp32 = L_shl( st->total_brate, 1 ); /* (float)st->L_frame/(float)st->fscale * (float)FSCALE_DENOM/128.0f * (float)st->bitrate */ @@ -118,9 +110,6 @@ void core_coder_mode_switch_fx( IF( st->hTcxCfg->fIsTNSAllowed != 0 ) { InitTnsConfigs( st->bwidth, st->hTcxCfg->tcx_coded_lines, st->hTcxCfg->tnsConfig, st->hIGFEnc->infoStopFrequency, st->total_brate, st->element_mode, MCT_flag ); -#ifdef IVAS_CODE - SetAllowTnsOnWhite( st->hTcxCfg->tnsConfig, EQ_16( st->element_mode, IVAS_CPE_MDCT ) ); -#endif } st->narrowBand = 0; diff --git a/lib_enc/core_enc_updt_fx.c b/lib_enc/core_enc_updt_fx.c index ce2681e75..dcf57738a 100644 --- a/lib_enc/core_enc_updt_fx.c +++ b/lib_enc/core_enc_updt_fx.c @@ -48,20 +48,6 @@ void core_encode_update_fx( Encoder_State *st ) if ( hTcxEnc != NULL ) { Copy( hTcxEnc->buf_speech_ltp + st->L_frame, hTcxEnc->buf_speech_ltp, n ); - -#ifdef IVAS_CODE - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - st->hTcxEnc->kernel_switch_corr_past = 0.f; - st->hTcxEnc->kernel_type[0] = MDCT_IV; - st->hTcxEnc->kernel_symmetry_past = 0; - st->hTcxEnc->enc_ste_pre_corr_past = 0; - move16(); - move16(); - move16(); - move16(); - } -#endif } /* Update previous mode */ diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index 9180d73b8..f16dd80cb 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -250,13 +250,8 @@ void enc_pit_exc_fx( *----------------------------------------------------------------*/ Copy( &res[i_subfr], &exc[i_subfr], L_subfr ); /* Q_new */ /* condition on target (compared to float) has been put outside the loop */ -#if 1 // ndef BUG_FIX find_targets_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, L_subfr, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); -#else - find_targets_fx( speech, hGSCEnc->mem_syn_tmp_fx, i_subfr, &hLPDmem->mem_w0, p_Aq, /*_DIFF_FLOAT_FIX_ --> Here I think mem_syn_tmp_fx should be used */ - res, L_subfr, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); -#endif Copy_Scale_sig( h1, h2, L_subfr, -2 ); /* Q13 */ Scale_sig( h1, L_subfr, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index 396e97c6f..624ec20fc 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -169,18 +169,6 @@ ivas_error evs_enc_fx( { updt_IO_switch_enc_fx( st, input_frame ); set16_fx( hBWE_TD->old_speech_shb_fx, 0, L_LOOK_16k + L_SUBFR16k ); -#if defined IVAS_CODE - PMT( "find scaling factor for prev_enr_EnvSHBres, prev_pow_exc16kWhtnd and prev_mix_factor " ) - set16_fx( st->hBWE_TD->old_speech_shb, 0, L_LOOK_16k + L_SUBFR16k ); - set16_fx( st->hBWE_TD->mem_shb_res, 0, MAX_LEN_MA_FILTER ); - set16_fx( st->hBWE_TD->old_EnvSHBres, 0, L_FRAME4k ); - st->hBWE_TD->old_mean_EnvSHBres = 0; - st->hBWE_TD->prev_enr_EnvSHBres = 1.0f; - st->hBWE_TD->prev_shb_env_tilt = 0; - st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; - st->hBWE_TD->prev_mix_factor = 1.0f; - st->hBWE_TD->prev_Env_error = 0; -#endif cldfb_reset_memory( st->cldfbAnaEnc ); cldfb_reset_memory( st->cldfbSynTd ); } @@ -466,16 +454,6 @@ ivas_error evs_enc_fx( { set16_fx( hBWE_TD->old_speech_shb_fx, 0, L_LOOK_16k + L_SUBFR16k ); set16_fx( shb_speech, 0, L_FRAME16k ); -#if defined IVAS_CODE - set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); - set_f( st->hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); - st->hBWE_TD->old_mean_EnvSHBres = 0.0f; - st->hBWE_TD->prev_enr_EnvSHBres = 1.0f; - st->hBWE_TD->prev_shb_env_tilt = 0.0f; - st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; - st->hBWE_TD->prev_mix_factor = 1.0f; - st->hBWE_TD->prev_Env_error = 0.0f; -#endif } /* SWB TBE encoder */ diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index eeeb294b4..49d757be3 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -70,24 +70,12 @@ void core_signal_analysis_high_bitrate_fx( Word32 *tmpP32; Word16 Q_exp; -#ifdef IVAS_CODE - int16_t disable_ltp = 0; -#endif TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; -#ifndef IVAS_CODE /* dummy */ (void) vad_hover_flag; (void) last_element_mode; -#endif -#ifdef IVAS_CODE - if ( NE_16( last_element_mode, st->element_mode ) ) - { - disable_ltp = 1; /* disable TCX-LTP in stereo switching to avoid discontinuities in synthesis */ - move16(); - } -#endif left_overlap = -1; move16(); right_overlap = -1; @@ -300,15 +288,6 @@ void core_signal_analysis_high_bitrate_fx( WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno], overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, st->element_mode != IVAS_CPE_MDCT /* truncate_aldo */, 1 ); -#ifdef IVAS_CODE - if ( windowed_samples != NULL ) /* save windowed speech_TCX samples */ - { - assert( L_subframe + ( left_overlap + right_overlap ) / 2 < 2 * L_FRAME_MAX / nSubframes - L_FRAME_MAX / 8 ); - windowed_samples[frameno * L_FRAME_MAX + 0] = (float) overlap_mode[frameno]; - windowed_samples[frameno * L_FRAME_MAX + 1] = (float) overlap_mode[frameno + 1]; - mvr2r( tcx20Win, windowed_samples + frameno * L_FRAME_MAX + 2, L_subframe + ( left_overlap + right_overlap ) / 2 ); - } -#endif } IF( EQ_16( transform_type[frameno], TCX_5 ) ) @@ -321,15 +300,6 @@ void core_signal_analysis_high_bitrate_fx( tcx20Win[folding_offset + i] = sub_sat( tcx20Win[folding_offset + i], tcx20Win[folding_offset - 1 - i] ); // Q0 move16(); } -#ifdef IVAS_CODE - if ( st->element_mode == IVAS_CPE_MDCT && frameno == 0 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - tcx20Win[left_overlap + i] -= hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } -#endif /* Outter right folding */ tmp = shr( right_overlap, 1 ); FOR( i = 0; i < tmp; i++ ) @@ -365,13 +335,6 @@ void core_signal_analysis_high_bitrate_fx( tmpP16 += tcx5SizeFB; tmpP32 += tcx5SizeFB; -#ifdef IVAS_CODE - /* high-band gain control in case of BWS */ - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( hTcxEnc->spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); - } -#endif } } ELSE /* transform_type[frameno] != TCX_5 */ @@ -414,33 +377,12 @@ void core_signal_analysis_high_bitrate_fx( } ELSE { -#ifdef IVAS_CODE - if ( st->element_mode == IVAS_CPE_MDCT && frameno == 0 && transform_type[0] == TCX_10 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - tcx20Win[left_overlap + i] -= hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } -#endif TCX_MDCT( tcx20Win, spectrum[frameno], &spectrum_e[frameno], left_overlap, sub( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st->element_mode ); } /* For TCX20 at bitrates up to 64 kbps we need the power spectrum */ /* high-band gain control in case of BWS */ -#ifdef IVAS_CODE - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); - } - - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - set_f( &hTcxEnc->spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE ); - st->hTcxCfg->tcx_coded_lines = MCT_LFE_MAX_LINE; - } -#endif IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { test(); @@ -461,94 +403,6 @@ void core_signal_analysis_high_bitrate_fx( pMdstWin, powerSpec, &powerSpec_e ); } } -#ifdef IVAS_CODE - if ( st->element_mode == IVAS_CPE_MDCT ) - { - L_subframe = L_frameTCX / nSubframes; - - if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP && st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { - wtda_ext( hTcxEnc->new_speech_TCX, mdstWin, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX, 3 ); - } - else - { - /* Windowing for the MDST */ - WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 0, 1 ); - } - - if ( transform_type[frameno] == TCX_5 ) - { - /* Outer left folding */ - for ( i = 0; i < left_overlap / 2; i++ ) - { - mdstWin[left_overlap / 2 + i] += mdstWin[left_overlap / 2 - 1 - i]; - } - - if ( frameno == 0 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - mdstWin[left_overlap + i] += hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } - - /* Outer right folding */ - for ( i = 0; i < right_overlap / 2; i++ ) - { - mdstWin[L_subframe + left_overlap / 2 - 1 - i] -= mdstWin[L_subframe + left_overlap / 2 + i]; - } - - /* 2xTCX5 */ - L_subframe = tcx5SizeFB; - folding_offset = left_overlap / 2; - - for ( i = 0; i < 2; i++ ) - { - assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE ); - WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, mdstWin + i * tcx5SizeFB, &L_subframe, tcx5Win, 0, 1 ); - - TCX_MDST( tcx5Win, mdst_spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); - /* high-band gain control in case of BWS */ - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( mdst_spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + i * tcx5SizeFB + L_FRAME16k / ( 2 * nSubframes ), L_subframe - L_FRAME16k / ( 2 * nSubframes ) ); - } - } - } - else /* transform_type[frameno] != TCX_5 */ - { - if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP && st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { - edst( mdstWin, mdst_spectrum[frameno], L_subframe, st->element_mode ); - - v_multc( mdst_spectrum[frameno], (float) sqrt( (float) NORM_MDCT_FACTOR / L_subframe ), mdst_spectrum[frameno], L_subframe ); - } - else - { - if ( frameno == 0 && transform_type[0] == TCX_10 && overlap_mode[0] == FULL_OVERLAP && L_subframe - left_overlap > minWindowLen ) - { - for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ - { - mdstWin[left_overlap + i] += hTcxEnc->speech_TCX[-1 - i] * st->hTcxCfg->tcx_aldo_window_1_FB[left_overlap / 2 + minWindowLen - i] * st->hTcxCfg->tcx_mdct_window_minimumFB[minWindowLen - i]; - } - } - - TCX_MDST( mdstWin, mdst_spectrum[frameno], left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); - } - - /* high-band gain control in case of BWS */ - if ( st->bwidth_sw_cnt > 0 ) - { - v_multc( mdst_spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); - } - } - - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - set_f( &mdst_spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE ); - } - } -#endif } IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -559,9 +413,6 @@ void core_signal_analysis_high_bitrate_fx( st->hTcxCfg->tcx_coded_lines, transform_type[frameno], ( frameno == 0 ) && ( st->last_core == ACELP_CORE ), spectrum[frameno], &hTcxEnc->tnsData[frameno], &hTcxEnc->fUseTns[frameno], NULL ); -#ifdef IVAS_CODE - IF( st->hTcxCfg->fIsTNSAllowed ) -#endif { EncodeTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, &hTcxEnc->tnsData[frameno], param_core + frameno * NPRM_DIV + 1 + NOISE_FILL_RANGES + LTPSIZE, pTnsSize + frameno, pTnsBits + frameno ); @@ -583,9 +434,6 @@ void core_signal_analysis_high_bitrate_fx( * LPC analysis *---------------------------------------------------------------*/ -#ifdef IVAS_CODE - IF( st->tcxonly ) -#endif { HBAutocorrelation_fx( st->hTcxCfg, lpc_left_overlap_mode, lpc_right_overlap_mode, &st->speech_enc_pe[frameno * tcx10Size], shr( L_frame, sub( nSubframes, 1 ) ), r, M ); diff --git a/lib_enc/hq_classifier_enc_fx.c b/lib_enc/hq_classifier_enc_fx.c index 558ae89a7..aa2c319f1 100644 --- a/lib_enc/hq_classifier_enc_fx.c +++ b/lib_enc/hq_classifier_enc_fx.c @@ -194,7 +194,6 @@ Word16 hq_classifier_enc_fx( /* o : Consumed bits Word16 *hqswb_clas /* o : HQ class Q0 */ ) { -#ifndef SOLVED_COMP_ENC_DEC Word16 bits; HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core; @@ -277,88 +276,7 @@ Word16 hq_classifier_enc_fx( /* o : Consumed bits *hqswb_clas = HQ_GEN_SWB; /* Q0 */ move16(); } -#else - Word16 bits; - HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core; - Word32 max_brate; - Word16 harmonic_decision; - - - max_brate = HQ_32k; - move32(); - if ( st_fx->element_mode > EVS_MONO ) - { - max_brate = HQ_48k; - move32(); - } - - *hqswb_clas = HQ_NORMAL; - bits = 1; - move16(); - IF( EQ_16( is_transient, 1 ) ) - { - *hqswb_clas = HQ_TRANSIENT; - move16(); - } - - /* classification and limit bandwidth for bit allocation */ - test(); - IF( EQ_16( length, L_SPEC32k ) || EQ_16( length, L_SPEC48k ) ) - { - IF( LE_32( st_fx->core_brate, max_brate ) ) - { - test(); - IF( !is_transient && EQ_16( st_fx->bwidth, st_fx->last_bwidth ) ) - { - /* Detect HQ_HARMONIC mode */ - *hqswb_clas = peak_avrg_ratio_fx( st_fx->total_brate, coefs, NUMC_N + 96, &hHQ_core->mode_count, &hHQ_core->mode_count1, 12 ); - -#if 0 - harmonic_decision = hf_spectrum_sparseness( st, coefs ); -#else - harmonic_decision = 0; - move16(); -#endif - test(); - IF( EQ_16( *hqswb_clas, HQ_HARMONIC ) && !harmonic_decision ) - { - *hqswb_clas = HQ_NORMAL; - move16(); - } - ELSE - { - /* Detect harmonic VQ mode HQ_HVQ */ - hvq_classifier_fx( coefs, &hHQ_core->prev_Npeaks, hHQ_core->prev_peaks, hqswb_clas, Npeaks, peaks, st_fx->core_brate, st_fx->last_core, - nf_gains, &hHQ_core->hvq_hangover, pe_gains ); - } - } - bits = 2; - move16(); - } - } - ELSE IF( EQ_16( length, L_SPEC16k_EXT ) || EQ_16( length, L_SPEC48k_EXT ) ) - { - bits = 0; /* HQ_NORMAL only -- no signalling needed */ - move16(); - } - /* write signalling info to the bitstream */ - push_indice( st_fx->hBstr, IND_HQ_SWB_CLAS, *hqswb_clas, bits ); - - IF( LE_32( st_fx->core_brate, HQ_32k ) && EQ_16( *hqswb_clas, HQ_NORMAL ) ) - { - IF( EQ_16( length, L_SPEC32k ) ) - { - *hqswb_clas = HQ_GEN_SWB; - move16(); - } - ELSE IF( EQ_16( length, L_SPEC48k ) ) - { - *hqswb_clas = HQ_GEN_FB; - move16(); - } - } -#endif return bits; } Word16 hq_classifier_enc_ivas_fx( /* o : Consumed bits Q0 */ @@ -677,11 +595,8 @@ Word16 peak_avrg_ratio_fx( test(); test(); test(); -#ifndef SOLVED_COMP_ENC_DEC /*This affect BE even if it shouldn't*/ + IF( ( GE_16( add( k, k1 ), 5 ) && GT_16( k1, 2 ) && EQ_32( total_brate, HQ_24k40 ) ) || ( ( ( GE_16( add( k, k1 ), 10 ) && GT_16( k1, 5 ) ) || GE_16( *mode_count, 5 ) ) && LT_16( *mode_count1, 5 ) ) ) -#else - if ( ( GE_16( add( k, k1 ), 5 ) && GT_16( k1, 2 ) && LT_32( total_brate, HQ_BWE_CROSSOVER_BRATE ) ) || ( ( ( GE_16( add( k, k1 ), 10 ) && GT_16( k1, 5 ) ) || GE_16( *mode_count, 5 ) ) && LT_16( *mode_count1, 5 ) ) ) -#endif { hqswb_clas = HQ_HARMONIC; move16(); @@ -1177,11 +1092,7 @@ void hvq_classifier_fx( L_input_max = L_deposit_l( 0 ); set32_fx( L_thr, 0, L_FRAME16k ); -#ifndef SOLVED_COMP_ENC_DEC IF( EQ_32( L_core_brate, HQ_24k40 ) ) -#else - IF( LT_32( L_core_brate, HQ_BWE_CROSSOVER_BRATE ) ) -#endif { nsub = HVQ_NSUB_24k; move16(); @@ -1420,7 +1331,6 @@ void hvq_classifier_fx( num_peak_cands = add( num_peak_cands, 1 ); } } -#ifndef ADD_IVAS_HQ_CODE IF( EQ_32( L_core_brate, HQ_24k40 ) ) { peak_th = HVQ_MAX_PEAKS_24k_CLAS; @@ -1431,9 +1341,6 @@ void hvq_classifier_fx( peak_th = HVQ_MAX_PEAKS_32k; move16(); } -#else - peak_th = (int16_t) ( ( core_brate * HVQ_PEAKS_PER_DELTA_THR + HVQ_PEAKS_PER_DELTA_THR_OFFS ) / HVQ_PEAKS_BPS_DELTA ); -#endif /* Find peaks */ pindx = maximum_32_fx( L_input_abs, num_peak_cands, &L_m ); i = 0; @@ -1555,7 +1462,6 @@ void hvq_classifier_fx( move16(); } -#ifndef ADD_IVAS_HQ_CODE IF( EQ_32( L_core_brate, HQ_24k40 ) ) { *Npeaks = s_min( HVQ_MAX_PEAKS_24k, *Npeaks ); /* Q0 */ @@ -1566,9 +1472,6 @@ void hvq_classifier_fx( *Npeaks = s_min( HVQ_MAX_PEAKS_32k, *Npeaks ); /* Q0 */ move16(); } -#else - *Npeaks = (int16_t) ( min( ( core_brate * HVQ_PEAKS_PER_DELTA + HVQ_PEAKS_PER_DELTA_OFFS ) / HVQ_PEAKS_BPS_DELTA, *Npeaks ) ); -#endif } ELSE { @@ -1581,99 +1484,3 @@ void hvq_classifier_fx( return; } - -#ifdef ADD_IVAS_HQ_CODE -/*--------------------------------------------------------------------------* - * hf_spectrum_sparseness() - * - * Detection of sparse spectrum in high band for activation of harmonic - * modes HQ_HARMONIC and HQ_HVQ - *--------------------------------------------------------------------------*/ -/*! r: Harmonic decision for high band */ -static int16_t hf_spectrum_sparseness( - Encoder_State *st, /* i/o: encoder state structure */ - const float *coefs /* i : MDCT spectrum */ -) -{ - int16_t i; - float thr; - int16_t low_count; - float A[L_SPEC_HB]; - float Amax; - float movmean; - float inv_rms; - float crest; - float crest_mod; - const float *p_num; - float *crest_lp; - float *crest_mod_lp; - int16_t result; - - crest_lp = &st->hHQ_core->crest_lp; - crest_mod_lp = &st->hHQ_core->crest_mod_lp; - - result = TRUE; - if ( st->element_mode != EVS_MONO ) - { - for ( i = 0; i < L_SPEC_HB; i++ ) - { - A[i] = (float) fabsf( coefs[i + L_SPEC_HB] ); - } - low_count = 0; - inv_rms = 0.0f; - crest_mod = 0.0f; - maximum( A, L_SPEC_HB, &Amax ); - thr = Amax * PEAK_THRESHOLD; - movmean = 0.0f; /* avoid uninitialized warning */ - p_num = &inv_tbl[HALF_WIN_LENGTH + 1]; /* Table for division 1./(11:21) */ - for ( i = 0; i < L_SPEC_HB; i++ ) - { - inv_rms += A[i] * A[i]; - if ( A[i] < thr ) - { - low_count += 1; - } - if ( i <= HALF_WIN_LENGTH ) - { - if ( i == 0 ) - { - movmean = sum_f( &A[0], i + HALF_WIN_LENGTH + 1 ) * ( *p_num ); - } - else - { - p_num++; - movmean = movmean + ( A[i + HALF_WIN_LENGTH] - movmean ) * ( *p_num ); - } - } - else - { - if ( L_SPEC_HB <= i + HALF_WIN_LENGTH ) - { - p_num--; - movmean = movmean + ( movmean - A[i - HALF_WIN_LENGTH - 1] ) * ( *p_num ); - } - else - { - movmean = movmean + ( A[i + HALF_WIN_LENGTH] - A[i - HALF_WIN_LENGTH - 1] ) * ( *p_num ); - } - } - if ( crest_mod < movmean ) - { - crest_mod = movmean; - } - } - inv_rms = 1.0f / (float) sqrtf( inv_rms / L_SPEC_HB ); - crest = Amax * inv_rms; - crest_mod = crest_mod * inv_rms; - *crest_lp = HQ_CREST_FAC_SM * ( *crest_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * crest; - *crest_mod_lp = HQ_CREST_FAC_SM * ( *crest_mod_lp ) + ( 1.0f - HQ_CREST_FAC_SM ) * crest_mod; - - if ( ( ( *crest_lp ) > HQ_CREST_THRESHOLD ) && ( ( *crest_mod_lp ) > HQ_CREST_MOD_THRESHOLD ) && ( low_count > LOW_COUNT_THRESHOLD ) ) - { - result = FALSE; - } - } - - return result; -} -#endif diff --git a/lib_enc/hq_core_enc_fx.c b/lib_enc/hq_core_enc_fx.c index 66430cb8e..b5e1abbca 100644 --- a/lib_enc/hq_core_enc_fx.c +++ b/lib_enc/hq_core_enc_fx.c @@ -35,15 +35,6 @@ void hq_core_enc_fx( Word16 tmp; Word32 L_tmp; UWord16 lsb; -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - Word16 L_spec; -#endif -#ifdef ADD_IVAS_HQ_CODE - Word16 left_overlap, right_overlap; - Word16 overlap, nz, tcx_offset, L_frame; - Word16 Aq_old[M + 1]; - Word16 output[L_FRAME16k]; -#endif Word16 two_frames_buffer[2 * L_FRAME48k]; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; @@ -87,37 +78,6 @@ void hq_core_enc_fx( is_transient = detect_transient_fx( audio, input_frame, 0, st_fx ); /* Q0 */ -#ifdef ADD_IVAS_HQ_CODE - test(); - test(); - test(); - IF( ( st_fx->element_mode > EVS_MONO ) && ( ( st_fx->last_core == ACELP_CORE ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) - { - /*-------------------------------------------------------------------------- - * IVAS switching frame - *--------------------------------------------------------------------------*/ - - L_spec = input_frame; - left_overlap = -1; - right_overlap = -1; - move16(); - move16(); - move16(); - - WindowSignal( &( st_fx->tcx_cfg ), st_fx->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st_fx->hTcxEnc->speech_TCX, &L_spec, wtda_audio, 1, 1 ); - Q_audio = 16; - move16(); /*tbv inspired from core_enc_ol*/ - TCX_MDCT( wtda_audio, t_audio, &Q_audio, left_overlap, sub( L_spec, shr( add( left_overlap, right_overlap ), 1 ) ), right_overlap, st_fx->element_mode ); - - inner_frame = inner_frame_tbl[st_fx->bwidth]; - L_spec = l_spec_ext_tbl[st_fx->bwidth]; - is_transient = 0; - move16(); - move16(); - move16(); - } - ELSE -#endif { /*-------------------------------------------------------------------------- * Windowing and time-domain aliasing @@ -144,10 +104,8 @@ void hq_core_enc_fx( move16(); } } -#ifndef ADD_IVAS_HQ_CODE /* subtract signalling bits */ num_bits = sub( num_bits, hBstr->nb_bits_tot ); /* Q0 */ -#endif direct_transform_fx( wtda_audio, t_audio, is_transient, input_frame, &Q_audio, st_fx->element_mode ); /* scale coefficients to their nominal level (8kHz) */ @@ -174,10 +132,6 @@ void hq_core_enc_fx( /* limit encoded band-width according to the command-line OR BWD limitation */ inner_frame = inner_frame_tbl[st_fx->bwidth]; /* Q0 */ move16(); -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - L_spec = l_spec_tbl[st_fx->bwidth]; - move16(); -#endif IF( GT_16( input_frame, inner_frame ) ) { IF( EQ_16( is_transient, 1 ) ) @@ -193,31 +147,10 @@ void hq_core_enc_fx( set32_fx( t_audio + inner_frame, 0, sub( input_frame, inner_frame ) ); } } -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - /* subtract signalling bits */ - num_bits = sub( num_bits, hBstr->nb_bits_tot_fx ); -#endif - /*-------------------------------------------------------------------------- * High-band gain control in case of BWS *--------------------------------------------------------------------------*/ -#ifdef ADD_IVAS_HQ_CODE - IF( st_fx->bwidth_sw_cnt > 0 ) - { - IF( is_transient ) - { - FOR( i = 0; i < NUM_TIME_SWITCHING_BLOCKS; i++ ) - { - v_multc( t_audio + i * inner_frame / NUM_TIME_SWITCHING_BLOCKS + L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, t_audio + i * inner_frame / NUM_TIME_SWITCHING_BLOCKS + L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS, inner_frame / NUM_TIME_SWITCHING_BLOCKS - L_FRAME16k / NUM_TIME_SWITCHING_BLOCKS ); - } - } - ELSE - { - v_multc( t_audio + L_FRAME16k, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, t_audio + L_FRAME16k, L_spec - L_FRAME16k ); - } - } -#endif /*-------------------------------------------------------------------------- * Classify whether to put extra bits for FER mitigation *--------------------------------------------------------------------------*/ @@ -263,12 +196,7 @@ void hq_core_enc_fx( t_audio[i] = L_shr( t_audio[i], sub( Q_audio, 12 ) ); /* Q12 */ move32(); } - -#ifdef ADD_IVAS_HQ_CODE_L_SPEC - hq_hr_enc_fx( st_fx, t_audio, L_spec, &num_bits, is_transient, vad_hover_flag ); -#else hq_hr_enc_fx( st_fx, t_audio, inner_frame, &num_bits, is_transient, vad_hover_flag ); -#endif Q_audio = 12; move16(); } @@ -286,51 +214,6 @@ void hq_core_enc_fx( { push_indice( hBstr, IND_UNUSED, 0, num_bits ); } -#ifdef ADD_IVAS_HQ_CODE - if ( st->element_mode > EVS_MONO && ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) ) - { - overlap = st->hTcxCfg->tcx_mdct_window_length; - nz = NS2SA( st->sr_core, N_ZERO_MDCT_NS ); - L_frame = (int16_t) ( st->L_frame + st->hTcxCfg->tcx_offset - st->hTcxCfg->lfacNext ); - tcx_offset = st->hTcxCfg->lfacNext; - set_f( Aq_old, 0, M + 1 ); /* Dummy filter */ - Aq_old[0] = 1; - - /* Code taken from InternalTCXDecoder() */ - TCX_MDCT_Inverse( t_audio, wtda_audio, overlap, L_frame - overlap, overlap, st->element_mode ); - - /* Window current frame */ - tcx_windowing_synthesis_current_frame( wtda_audio, st->hTcxCfg->tcx_aldo_window_2, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, /*st->hTcxCfg->tcx_mdct_window_length*/ st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, st->last_core == ACELP_CORE, st->hTcxCfg->tcx_last_overlap_mode, /*left mode*/ st->hTcxEnc->acelp_zir, st->hTcxEnc->Txnq, NULL, Aq_old, st->hTcxCfg->tcx_mdct_window_trans, st->L_frame >> 1, tcx_offset < 0 ? -tcx_offset : 0, st->last_core, 0, 0 ); - - /*Compute windowed synthesis in case of switching to ALDO windows in next frame*/ - mvr2r( wtda_audio + L_frame - nz, st->hTcxEnc->old_out, nz + overlap ); - set_zero( st->hTcxEnc->old_out + nz + overlap, nz ); - - tcx_windowing_synthesis_past_frame( st->hTcxEnc->old_out + nz, st->hTcxCfg->tcx_aldo_window_1_trunc, st->hTcxCfg->tcx_mdct_window_half, st->hTcxCfg->tcx_mdct_window_minimum, overlap, st->hTcxCfg->tcx_mdct_window_half_length, st->hTcxCfg->tcx_mdct_window_min_length, FULL_OVERLAP ); - - for ( i = 0; i < nz; i++ ) - { - st->hTcxEnc->old_out[nz + overlap + i] = wtda_audio[L_frame - 1 - i] * st->hTcxCfg->tcx_aldo_window_1_trunc[-1 - i]; - } - mvr2r( wtda_audio + ( overlap >> 1 ) - tcx_offset, output, st->L_frame ); - } - else - { - ener_match = (float) sqrt( (float) L_FRAME16k / (float) NORM_MDCT_FACTOR ); - v_multc( t_audio, ener_match, t_audio, inner_frame ); - - inverse_transform( t_audio, wtda_audio, is_transient, L_FRAME16k, inner_frame, st->element_mode ); - - window_ola( wtda_audio, output, st->hTcxEnc->old_out, L_FRAME16k, st->hTcxCfg->tcx_last_overlap_mode, st->hTcxCfg->tcx_curr_overlap_mode, 0, 0, NULL ); - } - - if ( st->element_mode > EVS_MONO ) - { - /* Store LB synthesis in case of switch to ACELP */ - mvr2r( output, st->hLPDmem->old_exc, L_FRAME16k ); - } -#endif - return; } diff --git a/lib_enc/hq_hr_enc_fx.c b/lib_enc/hq_hr_enc_fx.c index 705db9ecd..05654e775 100644 --- a/lib_enc/hq_hr_enc_fx.c +++ b/lib_enc/hq_hr_enc_fx.c @@ -249,20 +249,6 @@ void hq_hr_enc_fx( move16(); /* Prepare synthesis for LB generation in case of switch to ACELP */ -#ifdef ADD_IVAS_HQ_CODE - IF( NE_16( hqswb_clas, HQ_HVQ ) ) - { - apply_envelope_enc( t_audio_q, ynrm, num_sfm, sfm_start, sfm_end ); - } - - IF( is_transient ) - { - de_interleave_spectrum( t_audio_q, length ); - } - Copy32( t_audio_q, t_audio, length ); -#endif - - return; } diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 98d7fe957..e80ca0d59 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -20,7 +20,6 @@ * * Initialization of state variables *-----------------------------------------------------------------------*/ -#if 1 ivas_error init_encoder_fx( Encoder_State *st_fx /* i/o: Encoder static variables structure */ ) @@ -946,7 +945,7 @@ ivas_error init_encoder_fx( move32(); return error; } -#endif + /*-----------------------------------------------------------------------* * LPDmem_enc_init_fx() * @@ -1193,10 +1192,8 @@ ivas_error init_encoder_ivas_fx( st->exp_mem_preemph_enc = 0; move16(); -#if 1 // TODO: Float Initializations. To be removed later st->active_cnt = 0; move16(); -#endif st->pst_mem_deemp_err_fx = 0; move16(); @@ -1438,8 +1435,6 @@ ivas_error init_encoder_ivas_fx( st->input32_fx = st->input_buff32_fx + Mpy_32_32( st->input_Fs, 42949673 ) /* 1/50 in Q31*/; // st->input_Fs / FRAMES_PER_SEC st->input_fx = st->input_buff_fx + frame_length; } -#if 1 // TODO: To be removed later -#endif } ELSE { @@ -1454,8 +1449,6 @@ ivas_error init_encoder_ivas_fx( st->buf_speech_enc = NULL; st->buf_wspeech_enc = NULL; st->input_buff_fx = NULL; -#if 1 -#endif } /*-----------------------------------------------------------------* @@ -1956,12 +1949,6 @@ ivas_error init_encoder_ivas_fx( st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0; move16(); move16(); -#if 1 - // set_f( st->hTcxEnc->spectrum_long, 0, N_MAX ); - // st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; - // st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; - // set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); -#endif set16_fx( st->hTcxEnc->old_out_fx, 0, L_FRAME32k ); st->hTcxEnc->Q_old_out = 0; diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index f1187bc6c..b5b592582 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -1112,11 +1112,6 @@ static void ivas_omasa_param_est_enc_fx( { q = q_data; move16(); -#if 0 - scale_sig32( hOMasa->cldfbAnaEnc[i]->cldfb_state_fx, hOMasa->cldfbAnaEnc[i]->cldfb_state_length, sub( q, hOMasa->cldfbAnaEnc[i]->Q_cldfb_state ) ); - hOMasa->cldfbAnaEnc[i]->Q_cldfb_state = q; - move16(); -#endif cldfbAnalysis_ts_fx_var_q( &( data[i][l_ts * ts] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &q ); /*q_data-5*/ norm_buff = s_min( norm_buff, L_norm_arr( Chnl_RealBuffer_fx[i], 60 ) ); norm_buff = s_min( norm_buff, L_norm_arr( Chnl_ImagBuffer_fx[i], 60 ) ); diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 063f39dea..f90b2d8ec 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -2650,41 +2650,7 @@ static ivas_error sanitizeBandwidth_fx( } } - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { -#if 0 // IVAS_fmToDo: temporary disabled to keep EVS bit-exactness -> to be verified - if (max_bwidth_tmp == FB && hEncoderConfig->ivas_total_brate < ACELP_16k40) - { - if (hEncoderConfig->ivas_total_brate < ACELP_9k60) - { - max_bwidth_tmp = WB; - } - else - { - max_bwidth_tmp = SWB; - } - } - - if (max_bwidth_tmp == SWB && hEncoderConfig->ivas_total_brate < ACELP_9k60) - { - max_bwidth_tmp = WB; - } - - /* in case of 8kHz input sampling or "-max_band NB", require the total bitrate to be below 24.40 kbps */ - if ((max_bwidth_tmp == NB || hEncoderConfig->input_Fs == 8000) && hEncoderConfig->ivas_total_brate > ACELP_24k40) - { - if (hEncoderConfig->input_Fs >= 16000) - { - max_bwidth_tmp = WB; - } - else - { - return IVAS_ERR_INVALID_BITRATE; - } - } -#endif - } - ELSE + IF( NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) { Word32 quo = 0, rem; move32(); diff --git a/lib_enc/mdct_classifier_fx.c b/lib_enc/mdct_classifier_fx.c index a4e19e040..ea06878c1 100644 --- a/lib_enc/mdct_classifier_fx.c +++ b/lib_enc/mdct_classifier_fx.c @@ -117,88 +117,15 @@ Word16 mdct_classifier_fx( /* o: MDCT A/B decision Word32 gain1_tmp = 0, gain2_tmp = 0; Word16 exp, exp1, exp2, exp3; Word32 L_tmp, L_tmp1; -#ifdef IVAS_CODE - Word16 gain2_start, gain3_start, gain4_start, H1_start, H2_start, H_length; - Word16 gain2_start_rs, gain3_start_rs; -#endif TCX_ENC_HANDLE hTcxEnc = st_fx->hTcxEnc; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; #endif test(); -#ifdef IVAS_CODE - IF( EQ_32( st_fx->input_Fs, 32000 ) || EQ_32( st_fx->input_Fs, 48000 ) ) - { - gain2_start = GAIN2_START_SWB; - gain2_start_rs = GAIN2_START_SWB_RS; - gain3_start = GAIN3_START_SWB; - gain3_start_rs = GAIN3_START_SWB_RS; - gain4_start = GAIN4_START_SWB; - // gain4_start_rs = GAIN4_START_SWB_RS; - H1_start = H1_START_SWB; - H2_start = H2_START_SWB; - H_length = H_LENGTH_SWB; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - ELSE IF( EQ_32( st_fx->input_Fs, 16000 ) ) - { - gain2_start = GAIN2_START_WB; - gain2_start_rs = GAIN2_START_SWB_RS; - gain3_start = GAIN3_START_WB; - gain2_start_rs = GAIN2_START_SWB_RS; - gain4_start = GAIN4_START_WB; - H1_start = H1_START_WB; - H2_start = H2_START_WB; - H_length = H_LENGTH_WB; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } - ELSE - { - assert( !"Unknown sampling frequency in MDCT_classifier" ); - H1_start = -1; /* to avoid compilation warning */ - H2_start = -1; /* to avoid compilation warning */ - H_length = -1; /* to avoid compilation warning */ - gain2_start = -1; /* to avoid compilation warning */ - gain3_start = -1; /* to avoid compilation warning */ - gain4_start = -1; /* to avoid compilation warning */ - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - } -#endif -#ifdef IVAS_CODE - if ( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) ) -#endif { dft_mag_square_fx( fft_buff, magSq, 256 ); } -#ifdef IVAS_CODE - ELSE - { - float norm_val; - - norm_val = ( L_FFT * L_FFT ) / 4.f; - for ( k = 0; k < 128; k++ ) - { - X[k + 1] = st->Bin_E_old[k] * norm_val; - } - X[0] = X[1]; - } -#endif nf = L_add( magSq[0], 0 ); pe = L_add( magSq[0], 0 ); np = 0; @@ -295,10 +222,7 @@ Word16 mdct_classifier_fx( /* o: MDCT A/B decision gain1 = L_deposit_l( 0 ); gain2 = L_deposit_l( 0 ); gain3 = L_deposit_l( 0 ); -#ifdef IVAS_CODE - PMT( "MDCT_classifier needs review for different sampling rate" ) -#endif - // IVAS_CODE to adapt + FOR( k = 0; k < 8; k++ ) { gain1 = L_add( gain1, L_shr( cldfbBuf_Ener[k], 3 ) ); diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 7d5f486cc..acc52c2aa 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -3761,7 +3761,7 @@ Word16 tcx_res_Q_spec_ivas_fx( return bits; } -#if 1 // TV + void ProcessIGF_fx( IGF_ENC_INSTANCE_HANDLE const hInstance, /**< in: instance handle of IGF Encoder */ Encoder_State *st, /**< in: Encoder state */ @@ -3893,7 +3893,7 @@ void ProcessIGF_fx( } #endif } -#endif + void attenuateNbSpectrum_fx( Word16 L_frame, Word32 *spectrum ) { Word16 i, length, att; diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c index 2ade624b6..1ad69a330 100644 --- a/lib_enc/transient_detection_fx.c +++ b/lib_enc/transient_detection_fx.c @@ -638,16 +638,6 @@ void RunTransientDetection_fx( Word16 const *input, Word16 nSamplesAvailable, Tr /* Update the delay buffer. */ UpdateDelayBuffer( filteredInput, nSamplesAvailable, &pTransientDetection->delayBuffer ); -#ifdef IVAS_CODE - /* compute ramp up flag */ - pSubblockEnergies->ramp_up_flag = ( ( pSubblockEnergies->ramp_up_flag << 1 ) & 0x0003 ); - e0 = dotp( filteredInput + length / 2, filteredInput + length / 2, pSubblockEnergies->pDelayBuffer->nSubblockSize / 2 ) + 0.5f * MIN_BLOCK_ENERGY; - e1 = pSubblockEnergies->subblockNrg[pSubblockEnergies->nDelay + 4] - e0; - if ( e1 > e0 ) - { - pSubblockEnergies->ramp_up_flag |= 0x0001; - } -#endif } @@ -1582,72 +1572,7 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp } } } -#ifdef IVAS_CODE -/*-------------------------------------------------------------------* - * set_transient_stereo() - * - * - *-------------------------------------------------------------------*/ - -void set_transient_stereo( - CPE_ENC_HANDLE hCPE, /* i : CPE structure */ - float currFlatness[] /* i/o: current flatness */ -) -{ - int16_t n, attackIsPresent; - float currFlatnessMax; - Encoder_State **sts; - - sts = hCPE->hCoreCoder; - - /* for DFT/TD based stereo ,map avg. flatness to individual stereo channels (M/S or X/Y) */ - maximum( currFlatness, CPE_CHANNELS, &currFlatnessMax ); - attackIsPresent = 0; - - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - attackIsPresent = max( attackIsPresent, sts[n]->hTranDet->transientDetector.bIsAttackPresent ); - } - - set_f( currFlatness, currFlatnessMax, CPE_CHANNELS ); - - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - sts[n]->hTranDet->transientDetector.bIsAttackPresent = attackIsPresent; - } - - if ( hCPE->hStereoDft != NULL ) - { - if ( hCPE->hStereoDft->attackPresent ) - { - hCPE->hStereoDft->wasTransient = 1; - } - else if ( hCPE->hStereoDft->wasTransient ) - { - hCPE->hStereoDft->wasTransient = 0; - } - - hCPE->hStereoDft->attackPresent = attackIsPresent; - hCPE->hStereoDft->hItd->currFlatness = 0; - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - hCPE->hStereoDft->hItd->currFlatness = max( hCPE->hStereoDft->hItd->currFlatness, currFlatness[n] ); - } - } - - if ( hCPE->hStereoMdct != NULL ) - { - hCPE->hStereoMdct->hItd->currFlatness = 0; - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - hCPE->hStereoMdct->hItd->currFlatness = max( hCPE->hStereoMdct->hItd->currFlatness, currFlatness[n] ); - } - } - - return; -} -#endif /*-------------------------------------------------------------------* * transient_analysis() * diff --git a/lib_enc/updt_enc_fx.c b/lib_enc/updt_enc_fx.c index 1210bfd04..aed3bf812 100644 --- a/lib_enc/updt_enc_fx.c +++ b/lib_enc/updt_enc_fx.c @@ -204,20 +204,6 @@ void updt_IO_switch_enc_fx( set16_fx( hBWE_TD->old_speech_wb_fx, 0, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ); set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); -#ifdef IVAS_CODE - set16_fx( st->hBWE_TD->mem_shb_res, 0, MAX_LEN_MA_FILTER ); - set16_fx( st->hBWE_TD->old_EnvSHBres, 0, L_FRAME4k ); - st->hBWE_TD->old_mean_EnvSHBres = 0; - st->hBWE_TD->prev_enr_EnvSHBres = 32767; - st->hBWE_TD->prev_pow_exc16kWhtnd = 32767; - st->hBWE_TD->prev_mix_factor = 32767; - st->hBWE_TD->prev_Env_error = 0; - move16(); - move16(); - move16(); - move16(); - move16(); -#endif hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move16(); set16_fx( hBWE_TD->decim_state1_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); @@ -251,23 +237,6 @@ void updt_IO_switch_enc_fx( st->use_acelp_preq = 0; move16(); -#ifdef IVAS_CODE - set16_fx( st->hSpMusClas->finc_prev, 0, ATT_NSEG ); - set16_fx( st->hSpMusClas->tod_lt_Bin_E, 0, TOD_NSPEC ); - set16_fx( st->hSpMusClas->tod_S_map_lt, 0, TOD_NSPEC ); - st->hSpMusClas->lt_finc = 0; - st->hSpMusClas->last_strong_attack = 0; - st->hSpMusClas->tod_thr_lt = TOD_THR_MASS; - st->hSpMusClas->tod_weight = 0; - st->hSpMusClas->tod_S_mass_prev = TOD_THR_MASS; - st->hSpMusClas->tod_S_mass_lt = TOD_THR_MASS; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); -#endif } ELSE /* switching to AMR-WB IO mode */ { diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 412b8c226..16fefa3bb 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3327,17 +3327,10 @@ static void eig2x2_fx( tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); -#if 1 tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); -#else - /* Note: This code part does not work yet, see pipeline issue for BASOP #1009 */ - /* although the same code works at other places: mantissa and q_format is fine */ - normVal_fx = ISqrt32( tmp3, &exp ); - q_tmp2 = sub( 31, exp ); -#endif IF( LT_16( q_tmp1, q_c ) ) { @@ -3403,17 +3396,10 @@ static void eig2x2_fx( tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); -#if 1 tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 q_tmp2 = sub( 31, exp ); -#else - /* Note: This code part does not work yet, see pipeline issue for BASOP #1009 */ - /* although the same code works at other places: mantissa and q_format is fine */ - normVal_fx = ISqrt32( tmp3, &exp_tmp3 ); - q_tmp2 = sub( 31, exp_tmp3 ); -#endif IF( LT_16( q_tmp1, q_c ) ) { -- GitLab From 6f1ac6e49513f6ba4d675f428489cd8fba35fdc2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 30 Apr 2025 12:01:49 +0530 Subject: [PATCH 0504/1310] Clang formatting changes --- lib_com/bitstream_fx.c | 2 +- lib_com/prot_fx.h | 35 ++- lib_com/swb_tbe_com_fx.c | 428 +++++++++++++++--------------- lib_dec/FEC_HQ_phase_ecu_fx.c | 27 +- lib_dec/core_dec_init_fx.c | 2 +- lib_dec/core_dec_switch_fx.c | 6 +- lib_dec/dec_ace_fx.c | 3 +- lib_dec/er_dec_tcx_fx.c | 10 +- lib_dec/fd_cng_dec_fx.c | 1 - lib_dec/gs_dec_amr_wb_fx.c | 6 +- lib_dec/tns_base_dec_fx.c | 3 +- lib_dec/tonalMDCTconcealment_fx.c | 3 +- lib_enc/core_enc_init_fx.c | 3 +- 13 files changed, 252 insertions(+), 277 deletions(-) diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 4fcac20b6..2b66f92cd 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -52,7 +52,7 @@ int16_t FEC_seed = 12558; /* Seed for random FEC generator */ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ -float FEC_random = 0; /* FEC rate in percent (for simulation of FEC) */ +float FEC_random = 0; /* FEC rate in percent (for simulation of FEC) */ /*-------------------------------------------------------------------* * file_read_FECpattern() * diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index fde3949fd..f422d5e50 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3061,8 +3061,7 @@ void GenShapedSHBExcitation_fx( Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, - const Word16 prev_bfi -); + const Word16 prev_bfi ); void GenShapedSHBExcitation_ivas_enc_fx( Word16 *excSHB, /* o : synthesized shaped shb excitation Q_bwe_exc*/ @@ -3137,8 +3136,7 @@ void GenShapedSHBExcitation_ivas_dec_fx( Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, - const Word16 prev_bfi - , /* i : previous frame was concealed */ + const Word16 prev_bfi, /* i : previous frame was concealed */ const Word16 element_mode, /* i : element mode */ const Word16 flag_ACELP16k, /* i : ACELP@16kHz flag */ Word16 *nlExc16k, /* i/o: NL exc for IC-BWE */ @@ -3292,7 +3290,7 @@ void synthesise_fb_high_band_fx( #ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_frame_fx, /* i : length of the frame */ const Word16 i_subfr_fx, /* i : subframe index */ const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ @@ -3326,12 +3324,11 @@ void prep_tbe_exc_ivas_fx( Word16 T0, /* i : integer pitch variables Q0 */ Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ - Word32 core_brate - , /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ + Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ ); Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ @@ -6539,8 +6536,7 @@ void TonalMDCTConceal_SaveFreqSignal( Word16 nNewSamplesCore, const Word16 *scaleFactors, const Word16 *scaleFactors_exp, - const Word16 gain_tcx_exp -); + const Word16 gain_tcx_exp ); void TonalMDCTConceal_SaveFreqSignal_ivas_fx( TonalMDCTConcealPtr hTonalMDCTConc, @@ -8389,7 +8385,7 @@ ivas_error ppp_quarter_decoder_fx( void open_decoder_LPD_fx( Decoder_State *st, const Word32 total_brate, /* Q0 */ - const Word16 bwidth /* Q0 */ + const Word16 bwidth /* Q0 */ ); void open_decoder_LPD_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ @@ -8951,12 +8947,11 @@ ReadTnsData( STnsConfig const *pTnsConfig, Word16 *stream, Word16 *pnSize ); -void -ReadTnsData_ivas_fx( STnsConfig const *pTnsConfig, - Decoder_State *st, - Word16 *pnBits, - Word16 *stream, - Word16 *pnSize ); +void ReadTnsData_ivas_fx( STnsConfig const *pTnsConfig, + Decoder_State *st, + Word16 *pnBits, + Word16 *stream, + Word16 *pnSize ); Word16 DecodeTnsData( STnsConfig const *pTnsConfig, Word16 const *stream, diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d1883efde..c4605393d 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -2102,8 +2102,7 @@ void GenShapedSHBExcitation_fx( Word16 n_mem2, /* i : n_mem2 scale factor to adjust 24.4/32kbps memories */ Word16 prev_Q_bwe_syn, /* i : st_fx->prev_Q_bwe_syn */ const Word32 bitrate, - const Word16 prev_bfi -) + const Word16 prev_bfi ) { Word16 i, j, k; Word16 wht_fil_mem[LPC_WHTN_ORDER]; @@ -2366,258 +2365,257 @@ void GenShapedSHBExcitation_fx( } } ELSE /* decoder side */ - { { - /* *vf_ind is an integer scale by 0.125f*/ - tmp = shl( *vf_ind, ( 15 - 3 ) ); - tmp2 = MAX_16; - move16(); - if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) - { - tmp2 = 26214 /*0.8f Q15*/; - move16(); - } - } - } + { /* *vf_ind is an integer scale by 0.125f*/ + tmp = shl( *vf_ind, ( 15 - 3 ) ); + tmp2 = MAX_16; + move16(); + if ( LE_16( tmp, 22938 /*0.7f Q15*/ ) ) { - voice_factors[0] = mult_r( voice_factors[0], tmp2 ); - move16(); - voice_factors[1] = mult_r( voice_factors[1], tmp2 ); - move16(); - voice_factors[2] = mult_r( voice_factors[2], tmp2 ); - move16(); - voice_factors[3] = mult_r( voice_factors[3], tmp2 ); - move16(); - voice_factors[4] = mult_r( voice_factors[4], tmp2 ); + tmp2 = 26214 /*0.8f Q15*/; move16(); } } +} +{ + voice_factors[0] = mult_r( voice_factors[0], tmp2 ); + move16(); + voice_factors[1] = mult_r( voice_factors[1], tmp2 ); + move16(); + voice_factors[2] = mult_r( voice_factors[2], tmp2 ); + move16(); + voice_factors[3] = mult_r( voice_factors[3], tmp2 ); + move16(); + voice_factors[4] = mult_r( voice_factors[4], tmp2 ); + move16(); +} +} - tmp = sub( Q_temp, 3 ); - FOR( k = 0; k < L_FRAME16k; k++ ) +tmp = sub( Q_temp, 3 ); +FOR( k = 0; k < L_FRAME16k; k++ ) +{ + White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ +} +prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; +move16(); +*Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); +move16(); +deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); +/* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ +/* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ +{ + IF( EQ_16( coder_type, UNVOICED ) ) { - White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ + L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); + scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ + FOR( k = 0; k < L_FRAME16k; k++ ) + { + /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */ + L_tmp = L_mult( White_exc16k[k], scale ); + /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ + exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); + move16(); + /* exc16kWhtnd: Q_bwe_exc */ + } + PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); + /* i/o: exc16kWhtnd (Q_bwe_exc) */ + /* i/o: tbe_premph (Q_bwe_exc) */ } - prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; - move16(); - *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); - move16(); - deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); - /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ - /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */ + ELSE { - IF( EQ_16( coder_type, UNVOICED ) ) + Word16 nbSubFr, lSubFr; + Word16 tempQ15; + Word32 tempQ31; + /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/ + nbSubFr = NB_SUBFR16k; + lSubFr = ( L_FRAME16k / NB_SUBFR16k ); + IF( LT_32( bitrate, ACELP_24k40 ) ) { - L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp ); - scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */ - FOR( k = 0; k < L_FRAME16k; k++ ) - { - /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */ - L_tmp = L_mult( White_exc16k[k], scale ); - /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */ - exc16kWhtnd[k] = round_fx( L_shl( L_tmp, NOISE_QADJ ) ); - move16(); - /* exc16kWhtnd: Q_bwe_exc */ - } - PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); - /* i/o: exc16kWhtnd (Q_bwe_exc) */ - /* i/o: tbe_premph (Q_bwe_exc) */ + nbSubFr = NB_SUBFR; + move16(); + lSubFr = ( L_FRAME16k / NB_SUBFR ); + move16(); } - ELSE + k = 0; + FOR( i = 0; i < nbSubFr; i++ ) { - Word16 nbSubFr, lSubFr; - Word16 tempQ15; - Word32 tempQ31; - /*nbSubFr = ( bitrate < ACELP_24k40 )? NB_SUBFR : NB_SUBFR16k;*/ - nbSubFr = NB_SUBFR16k; - lSubFr = ( L_FRAME16k / NB_SUBFR16k ); - IF( LT_32( bitrate, ACELP_24k40 ) ) + test(); + IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) { - nbSubFr = NB_SUBFR; + exp = 0; move16(); - lSubFr = ( L_FRAME16k / NB_SUBFR ); + tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ + temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + exp = 0; move16(); + tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ + temp = sub( MAX_16, temp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ } - k = 0; - FOR( i = 0; i < nbSubFr; i++ ) + ELSE { - test(); - IF( EQ_16( coder_type, VOICED ) && ( LT_32( bitrate, ACELP_24k40 ) ) ) - { - exp = 0; - move16(); - tempQ15 = Sqrt16( voice_factors[i], &exp ); /* Q15 */ - temp = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - exp = 0; - move16(); - tempQ15 = Sqrt16( temp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b_fx( pow1 * (1.0f - temp), pow22 ); */ - temp = sub( MAX_16, temp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } - ELSE - { - /* Adjust noise mixing for formant sharpening filter */ - tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); - /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ - vf_tmp = sub( MAX_16, tempQ15 ); - vf_tmp = mult_r( voice_factors[i], vf_tmp ); - - exp = 0; - move16(); - tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ - temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ - - /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ - temp = sub( MAX_16, vf_tmp ); - tempQ31 = Mult_32_16( pow1, temp ); - L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); - temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ - } + /* Adjust noise mixing for formant sharpening filter */ + tempQ15 = mult_r( SWB_NOISE_MIX_FAC_FX, formant_fac ); + /* vf_tmp = voice_factors[i] * (1.0f - vf_tmp); */ + vf_tmp = sub( MAX_16, tempQ15 ); + vf_tmp = mult_r( voice_factors[i], vf_tmp ); - FOR( j = 0; j < lSubFr; j++ ) - { - /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ - L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/ - L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */ - exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); - move16(); - /* Q_bwe_exc */ - } - k = add( k, lSubFr ); - - /* estimate the pre-emph factor */ - tempQ15 = sub( MAX_16, voice_factors[i] ); exp = 0; move16(); - temp = Sqrt16( tempQ15, &exp ); - temp = shl( temp, exp - 1 ); - - temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ - temp = div_s( temp, temp2 ); /* Q15 */ - temp = mult_r( PREEMPH_FAC, temp ); + tempQ15 = Sqrt16( vf_tmp, &exp ); /* Q15 */ + temp1 = shl( tempQ15, exp ); /* Q15 exc16kWhtnd scale factor */ + + /*temp2 = root_a_over_b(pow1 * (1.0f - vf_tmp), pow22); */ + temp = sub( MAX_16, vf_tmp ); + tempQ31 = Mult_32_16( pow1, temp ); + L_tmp = root_a_over_b_fx( tempQ31, Q_pow1, pow22, Q_pow22, &exp ); + temp2 = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q15 whiteEnvShapedExc scale factor */ + } - PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); - /* exc16kWhtnd: Q_bwe_exc; - tbe_premph: Q_bwe_exc*/ + FOR( j = 0; j < lSubFr; j++ ) + { + /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */ + L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/ + L_tmp = L_shl_sat( L_tmp, NOISE_QADJ ); /* 16+(Q_bwe_exc) */ + exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); + move16(); + /* Q_bwe_exc */ } + k = add( k, lSubFr ); + + /* estimate the pre-emph factor */ + tempQ15 = sub( MAX_16, voice_factors[i] ); + exp = 0; + move16(); + temp = Sqrt16( tempQ15, &exp ); + temp = shl( temp, exp - 1 ); + + temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */ + temp = div_s( temp, temp2 ); /* Q15 */ + temp = mult_r( PREEMPH_FAC, temp ); + + PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); + /* exc16kWhtnd: Q_bwe_exc; + tbe_premph: Q_bwe_exc*/ } } +} - IF( LT_32( bitrate, ACELP_24k40 ) ) - { - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: excSHB in Q_bwe_exc */ - } - ELSE - { - set16_fx( zero_mem, 0, LPC_SHB_ORDER ); +IF( LT_32( bitrate, ACELP_24k40 ) ) +{ + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: excSHB in Q_bwe_exc */ +} +ELSE +{ + set16_fx( zero_mem, 0, LPC_SHB_ORDER ); - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[0] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[1] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[2] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); - syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); - move32(); + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, tempSHB, 80, zero_mem, 1 ); + syn_shb_ener_sf[3] = L_shr( sum2_fx( tempSHB, 80 ), 3 ); + move32(); - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: tempSHB in Q_bwe_exc */ - /* o: syn_shb_ener_sf in (2*Q_bwe_exc+1) */ - IF( LE_32( bitrate, ACELP_32k ) ) - { - L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: tempSHB in Q_bwe_exc */ + /* o: syn_shb_ener_sf in (2*Q_bwe_exc+1) */ + IF( LE_32( bitrate, ACELP_32k ) ) + { + L_tmp = sum32_fx( syn_shb_ener_sf, 4 ); - /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ - tmp = shl( Q_shb, 1 ); - tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 ); - L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ + /* find root_a(tempSHB[0]) = root_a_over_b(shb_ener_sf[0]), L_tmp) */ + tmp = shl( Q_shb, 1 ); + tmp2 = add( shl( *Q_bwe_exc, 1 ), 1 ); + L_tmp2 = root_a_over_b_fx( shb_ener_sf_32, tmp, L_tmp, tmp2, &exp ); /* L_tmp2 in (Q31-exp) */ - *Q_bwe_exc = sub( *Q_bwe_exc, exp ); - move16(); /* compensate for the exp shift */ - tmp2 = add( prev_Q_bwe_syn, n_mem2 ); - IF( GT_16( *Q_bwe_exc, tmp2 ) ) - { - L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); - *Q_bwe_exc = tmp2; - move16(); - } - FOR( i = 0; i < L_FRAME16k; i++ ) - { - L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ - exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ - move16(); - } - } - /* i: L_tmp2 in (Q31-exp) */ - /* i: exc16kWhtnd in Q_bwe_exc */ - /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ - - /* Rescale the past memories: LP synth and SHB look ahead buffers */ - tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); - FOR( i = 0; i < LPC_SHB_ORDER; i++ ) + *Q_bwe_exc = sub( *Q_bwe_exc, exp ); + move16(); /* compensate for the exp shift */ + tmp2 = add( prev_Q_bwe_syn, n_mem2 ); + IF( GT_16( *Q_bwe_exc, tmp2 ) ) { - state_lpc_syn[i] = shl( state_lpc_syn[i], tmp ); + L_tmp2 = L_shl( L_tmp2, sub( tmp2, *Q_bwe_exc ) ); + *Q_bwe_exc = tmp2; move16(); } - FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) + FOR( i = 0; i < L_FRAME16k; i++ ) { - excSHB[i] = shl( excSHB[i], tmp ); + L_tmp3 = Mult_32_16( L_tmp2, exc16kWhtnd[i] ); /* *Q_bwe_exc + (31-exp) - 15 */ + exc16kWhtnd[i] = round_fx( L_tmp3 ); /* *Q_bwe_exc - exp */ move16(); } - /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ - - Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); - Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); - /* i: exc16kWhtnd in (Q_bwe_exc) */ - /* o: excSHB in (Q_bwe_exc) */ } + /* i: L_tmp2 in (Q31-exp) */ + /* i: exc16kWhtnd in Q_bwe_exc */ + /* o: exc16kWhtnd in Q_bwe_exc: (Q_bwe_exc-exp) */ - IF( EQ_16( extl, FB_TBE ) ) + /* Rescale the past memories: LP synth and SHB look ahead buffers */ + tmp = sub( *Q_bwe_exc, prev_Q_bwe_syn ); + FOR( i = 0; i < LPC_SHB_ORDER; i++ ) { - tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); - Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); - Scale_sig( fb_tbe_demph, 1, tmp ); - Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); - /* i: White_exc16k_FB in (14-n2) */ - /* o: White_exc16k_FB_temp in (14-n2) */ + state_lpc_syn[i] = shl( state_lpc_syn[i], tmp ); + move16(); + } + FOR( i = -L_SHB_LAHEAD; i < 0; i++ ) + { + excSHB[i] = shl( excSHB[i], tmp ); + move16(); + } + /* Do mem_stp_swb_fx scaling before PostShortTerm_fx */ - FOR( i = 0; i < 10; i++ ) - { - FOR( j = 0; j < 32; ++j ) - { - White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); - move16(); - } - } + Syn_filt_s( 0, lpc_shb_sf, LPC_SHB_ORDER, exc16kWhtnd, excSHB, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 80, excSHB + 80, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 2 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 160, excSHB + 160, 80, state_lpc_syn, 1 ); + Syn_filt_s( 0, lpc_shb_sf + 3 * ( LPC_SHB_ORDER + 1 ), LPC_SHB_ORDER, exc16kWhtnd + 240, excSHB + 240, 80, state_lpc_syn, 1 ); + /* i: exc16kWhtnd in (Q_bwe_exc) */ + /* o: excSHB in (Q_bwe_exc) */ +} - *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); - move16(); /**Q_bwe_exc_fb +35 +1 -16*/ - flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); +IF( EQ_16( extl, FB_TBE ) ) +{ + tmp = sub( add( *Q_bwe_exc_fb, 20 ), prev_Q_bwe_exc_fb ); + Scale_sig( fb_state_lpc_syn, LPC_SHB_ORDER, tmp ); + Scale_sig( fb_tbe_demph, 1, tmp ); + Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, White_exc16k_FB, White_exc16k_FB_temp, L_FRAME16k, fb_state_lpc_syn, 1 ); + /* i: White_exc16k_FB in (14-n2) */ + /* o: White_exc16k_FB_temp in (14-n2) */ - deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); - } - ELSE + FOR( i = 0; i < 10; i++ ) { - set16_fx( White_exc16k_FB, 0, L_FRAME16k ); + FOR( j = 0; j < 32; ++j ) + { + White_exc16k_FB_temp[i * 32 + j] = mult_r( White_exc16k_FB_temp[i * 32 + j], cos_fb_exc_fx[j] ); + move16(); + } } - return; + *Q_bwe_exc_fb = add( *Q_bwe_exc_fb, 20 ); + move16(); /**Q_bwe_exc_fb +35 +1 -16*/ + flip_spectrum_fx( White_exc16k_FB_temp, White_exc16k_FB, L_FRAME16k ); + + deemph_fx( White_exc16k_FB, fb_deemph_fac, L_FRAME16k, fb_tbe_demph ); +} +ELSE +{ + set16_fx( White_exc16k_FB, 0, L_FRAME16k ); +} + +return; } void GenShapedSHBExcitation_ivas_enc_fx( @@ -7264,7 +7262,7 @@ void Estimate_mix_factors_fx( #ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_frame_fx, /* i : length of the frame */ const Word16 i_subfr_fx, /* i : subframe index */ const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ @@ -7278,8 +7276,7 @@ void prep_tbe_exc_fx( Word16 T0, /* i : integer pitch variables Q0 */ Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ - Word32 core_brate -) + Word32 core_brate ) { Word16 i; Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; @@ -7425,12 +7422,11 @@ void prep_tbe_exc_ivas_fx( Word16 T0, /* i : integer pitch variables Q0 */ Word16 T0_frac, /* i : Fractional pitch variables Q0*/ const Word16 coder_type, /* i : coding type */ - Word32 core_brate - , /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ + Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ ) { Word16 i; diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index dedf9f859..ad2f86073 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -64,11 +64,9 @@ static void windowing( const Word16 *, Word16 *, const Word16 *, const Word16, c static void windowing_ROM_optimized( const Word16 *, Word16 *, const Word16, const Word16, const Word16 ); static void fft_spec2_fx( const Word16[], Word32[], const Word16 ); static void trans_ana_fx( const Word16 *, Word16 *, Word16 *, Word16 *, const Word16, const Word16, const Word16, const Word16, Word16 *, Word16 *, Word16 *, Word16 * ); -static void peakfinder_fx( const Word16 *, const Word16, Word16 *, Word16 *, const Word16 -); +static void peakfinder_fx( const Word16 *, const Word16, Word16 *, Word16 *, const Word16 ); static Word16 imax_fx( const Word16 *, const Word16 ); -static void spec_ana_fx( const Word16 *prevsynth, Word16 *plocs, Word32 *plocsi, Word16 *num_plocs, Word16 *X_sav, const Word16 output_frame, const Word16 bwidth_fx, Word16 *Q -); +static void spec_ana_fx( const Word16 *prevsynth, Word16 *plocs, Word32 *plocsi, Word16 *num_plocs, Word16 *X_sav, const Word16 output_frame, const Word16 bwidth_fx, Word16 *Q ); static void subst_spec_fx( const Word16 *, const Word32 *, Word16 *, const Word16, Word16 *, const Word16 *, const Word16, const Word16 *, const Word16, Word16 *, const Word16 *, const Word16 *, Word16, const Word16 * ); static Word16 rand_phase_fx( const Word16 seed, Word16 *sin_F, Word16 *cos_F ); @@ -1779,8 +1777,7 @@ static void spec_ana_fx( { sel = mult_r( sub( Xmax, Xmin ), CMPLMNT_PFIND_SENS_FX ); } - peakfinder_fx( xfp, Lprot2_1, plocs, num_plocs, sel - ); + peakfinder_fx( xfp, Lprot2_1, plocs, num_plocs, sel ); { @@ -2875,8 +2872,7 @@ static void rec_frame_fx( Word16 *X, /* i : FFT spectrum */ Word32 *ecu_rec, /* o : Reconstructed frame in tda domain */ const Word16 output_frame, /* i : Frame length */ - const Word16 Q -) + const Word16 Q ) { const Word16 *pFftTbl; Word16 Lprot, lprotLog2Minus1; @@ -4402,13 +4398,11 @@ static void fec_alg_fx( Word16 exp; Word16 n, Q; - fec_ecu_dft_fx( prevsynth_LP, N, Tfr, Tfi, &sum_Tf_abs, Tf_abs, &Nfft, &exp - ); + fec_ecu_dft_fx( prevsynth_LP, N, Tfr, Tfi, &sum_Tf_abs, Tf_abs, &Nfft, &exp ); sinusoidal_synthesis_fx( Tfr, Tfi, Tf_abs, N, output_frame, decimatefactor, Nfft, sum_Tf_abs, synthesis, HqVoicing, exp ); - fec_noise_filling_fx( prevsynth, synthesis, ni_seed_forfec, output_frame, i_mult2( N, decimatefactor ), HqVoicing, gapsynth - ); + fec_noise_filling_fx( prevsynth, synthesis, ni_seed_forfec, output_frame, i_mult2( N, decimatefactor ), HqVoicing, gapsynth ); n = R1_48 - R2_48; move16(); @@ -4629,8 +4623,7 @@ static void hq_phase_ecu_fx( trans_ana_fx( prevsynth + offset, mag_chg, &ph_dith, mag_chg_1st, output_frame, *time_offs, env_stab, *last_fec, alpha, beta, beta_mute, Xavg ); - spec_ana_fx( prevsynth + offset, plocs, plocsi, num_p, X_sav, output_frame, bwidth_fx, Q_spec - ); + spec_ana_fx( prevsynth + offset, plocs, plocsi, num_p, X_sav, output_frame, bwidth_fx, Q_spec ); test(); IF( prev_bfi != 0 && *last_fec != 0 ) @@ -4660,12 +4653,10 @@ static void hq_phase_ecu_fx( } subst_spec_fx( plocs, plocsi, num_p, *time_offs, X, mag_chg, ph_dith, old_is_transient, output_frame, &seed, - alpha, beta, *beta_mute, Xavg - ); + alpha, beta, *beta_mute, Xavg ); /* reconstructed frame in tda domain */ - rec_frame_fx( X, ecu_rec, output_frame, *Q_spec - ); + rec_frame_fx( X, ecu_rec, output_frame, *Q_spec ); *last_fec = 0; move16(); diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 86d8e805a..eb34e1bc1 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -20,7 +20,7 @@ void open_decoder_LPD_fx( Decoder_State *st, const Word32 total_brate, /* Q0 */ - const Word16 bwidth /* Q0 */ + const Word16 bwidth /* Q0 */ ) { Word16 i; diff --git a/lib_dec/core_dec_switch_fx.c b/lib_dec/core_dec_switch_fx.c index 8c68f39ce..94b6efb1b 100644 --- a/lib_dec/core_dec_switch_fx.c +++ b/lib_dec/core_dec_switch_fx.c @@ -10,9 +10,9 @@ #include "rom_com.h" void mode_switch_decoder_LPD_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 bwidth, /* i : audio bandwidth Q0*/ - Word32 total_brate, /* i : total bitrate Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 bwidth, /* i : audio bandwidth Q0*/ + Word32 total_brate, /* i : total bitrate Q0*/ Word16 frame_size_index /* i : index determining the frame size Q0*/ ) { diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index 55d3ebbae..ad89ca556 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -538,8 +538,7 @@ void decoder_acelp_fx( #else prep_tbe_exc_fx( st->L_frame, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, - gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate - ); + gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate ); #endif } diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 1a8a8b30d..161cefe76 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -550,8 +550,8 @@ void con_tcx_fx( { calcGainc2_fx( &exc[0], Q_exc, L_subfr, &( st->Mode2_lp_gainc ) ); } - set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ - /* PLC: calculate damping factor */ + set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ + /* PLC: calculate damping factor */ alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ } @@ -681,7 +681,7 @@ void con_tcx_fx( /* PLC: [TCX: Fade-out] retrieve background level */ tmp16 = 32767; move16(); - gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q5*/ + gainSynthDeemph = getLevelSynDeemph_fx( &( tmp16 ), A_local, M, shr( L_frame, 2 ), st->preemph_fac, 1, &gainSynthDeemph_e ); /*Q5*/ IF( st->tcxonly != 0 ) { /* gainCNG = st->conCngLevelBackgroundTrace/gainSynthDeemph; */ @@ -1419,8 +1419,8 @@ void con_tcx_ivas_fx( { calcGainc2_fx( &exc[0], Q_exc, L_subfr, &( st->Mode2_lp_gainc ) ); } - set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ - /* PLC: calculate damping factor */ + set32_fx( pitch_buf, L_deposit_h( L_SUBFR ), st->nb_subfr ); /*Q16*/ + /* PLC: calculate damping factor */ alpha = Damping_fact_fx( st->core_ext_mode, st->nbLostCmpt, st->last_good, st->stab_fac_fx, &( st->Mode2_lp_gainp ), 0 ); /*Q14*/ } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 893b49241..3fe93854e 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -792,7 +792,6 @@ Word16 ApplyFdCng_fx( { /* Perform noise estimation in active frames in the decoder for downward updates */ perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); - } } test(); diff --git a/lib_dec/gs_dec_amr_wb_fx.c b/lib_dec/gs_dec_amr_wb_fx.c index 331142a44..eea37431a 100644 --- a/lib_dec/gs_dec_amr_wb_fx.c +++ b/lib_dec/gs_dec_amr_wb_fx.c @@ -31,8 +31,7 @@ static void NoiseFill_fx( Word16 *exc_diffQ_fx, Word16 *seed_tcx, const Word16 M static void Ener_per_band_fx( const Word16 exc_diff_fx[], const Word16 exc_diff_exp, Word32 y_gain4_fx[] ); static void Apply_gain_fx( Word16 exc_diffQ_fx[], Word32 L_Ener_per_bd_iQ[], Word32 L_Ener_per_bd_yQ[], const Word16 Q_out ); static void normalize_spec_fx( Word16 fac_up_fx, Word16 fy_norm_fx[], const Word16 L_frame, const Word16 Q_out ); -static void gs_dec_amr_wb_fx( const long core_brate, Word16 *seed_tcx, const Word16 dct_in_fx[], const Word16 Q_dct_in, Word16 dct_out_fx[], Word16 Q_dct_out, const Word16 pitch_fx[], const Word16 voice_fac, const Word16 clas, const Word16 coder_type -); +static void gs_dec_amr_wb_fx( const long core_brate, Word16 *seed_tcx, const Word16 dct_in_fx[], const Word16 Q_dct_in, Word16 dct_out_fx[], Word16 Q_dct_out, const Word16 pitch_fx[], const Word16 voice_fac, const Word16 clas, const Word16 coder_type ); /*-------------------------------------------------------------------* * NoiseFill_fx() @@ -455,8 +454,7 @@ void improv_amr_wb_gs_fx( * Go back to time domain -> Overwrite exctiation *------------------------------------------------------------*/ edct_16fx( exc2_fx, dct_exc_in_fx, L_FRAME, 6, EVS_MONO ); - gs_dec_amr_wb_fx( core_brate, seed_tcx, dct_exc_in_fx, Q_exc2, dct_exc_out_fx, Q_exc2, pitch_buf_fx, lt_voice_fac_fx, clas, coder_type - ); + gs_dec_amr_wb_fx( core_brate, seed_tcx, dct_exc_in_fx, Q_exc2, dct_exc_out_fx, Q_exc2, pitch_buf_fx, lt_voice_fac_fx, clas, coder_type ); edct_16fx( dct_exc_out_fx, exc2_fx, L_FRAME, 6, EVS_MONO ); /*------------------------------------------------------------* diff --git a/lib_dec/tns_base_dec_fx.c b/lib_dec/tns_base_dec_fx.c index def1ffefb..a5df03490 100644 --- a/lib_dec/tns_base_dec_fx.c +++ b/lib_dec/tns_base_dec_fx.c @@ -67,8 +67,7 @@ ReadTnsData( return TNS_NO_ERROR; } -void -ReadTnsData_ivas_fx( +void ReadTnsData_ivas_fx( STnsConfig const *pTnsConfig, Decoder_State *st, Word16 *pnBits, /*Q0*/ diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index 7465a7f65..b45b78ad1 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -227,8 +227,7 @@ void TonalMDCTConceal_SaveFreqSignal( Word16 nNewSamplesCore, // Q0 const Word16 *scaleFactors, // Q31-scaleFactors_exp const Word16 *scaleFactors_exp, - const Word16 gain_tcx_exp -) + const Word16 gain_tcx_exp ) { Word16 *temp; Word16 nOldSamples, tmp_exp, s, i, max_exp; diff --git a/lib_enc/core_enc_init_fx.c b/lib_enc/core_enc_init_fx.c index 5c0e4911c..2f7870ab6 100644 --- a/lib_enc/core_enc_init_fx.c +++ b/lib_enc/core_enc_init_fx.c @@ -53,8 +53,7 @@ void init_coder_ace_plus_fx( /* Bitrate */ st->tcxonly = (Word8) getTcxonly( - st->total_brate - ); + st->total_brate ); move16(); /* Core Sampling Rate */ -- GitLab From fc704082890a05725cf377017c86755710fd7478 Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Wed, 30 Apr 2025 10:10:42 +0200 Subject: [PATCH 0505/1310] clang-format. --- lib_debug/debug.c | 2 +- lib_debug/wmc_auto.c | 8 ++++---- lib_enc/ivas_rom_enc.h | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib_debug/debug.c b/lib_debug/debug.c index aafc1b663..ee6040faf 100644 --- a/lib_debug/debug.c +++ b/lib_debug/debug.c @@ -788,7 +788,7 @@ char *fname( #ifdef DEBUG_FORCE_DIR size_t len; len = strlen( tmp_fname ); - if (tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) + if ( tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) { /* add trailing '/' slash */ strcat( tmp_fname, "/" ); diff --git a/lib_debug/wmc_auto.c b/lib_debug/wmc_auto.c index d357c03dd..9a4b371fc 100644 --- a/lib_debug/wmc_auto.c +++ b/lib_debug/wmc_auto.c @@ -1018,7 +1018,7 @@ int push_stack( const char *filename, const char *fctname ) } /* Check, if This is the New Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size < 0 ) { @@ -1226,7 +1226,7 @@ void *mem_alloc( current_heap_size += ptr_record->block_size; /* Check, if this is the new Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size + current_heap_size > wc_ram_size ) { wc_ram_size = current_stack_size + current_heap_size; @@ -2416,7 +2416,7 @@ int EQ_64( long long int L64_var1, long long int L64_var2 ) #endif return F_ret; } -int NE_64( long long int L64_var1, long long int L64_var2 ) +int NE_64( long long int L64_var1, long long int L64_var2 ) { int F_ret = 0; @@ -2503,7 +2503,7 @@ void Reset_BASOP_WMOPS_counter( unsigned int counterId ) /* reset the current BASOP operation counter */ ptr = (unsigned int *) &multiCounter[counterId]; - for ( i = 0; i < (int) (sizeof(BASIC_OP) / sizeof(unsigned int)); i++ ) + for ( i = 0; i < (int) ( sizeof( BASIC_OP ) / sizeof( unsigned int ) ); i++ ) { *ptr++ = 0; } diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 53fa3fd09..27fa27463 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -111,11 +111,11 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ - #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC - extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1]; - extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1]; - extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1]; - #else +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC +extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1]; +extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1]; +extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1]; +#else extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4]; extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4]; -- GitLab From 6dcf203d59ad42b0e2c7b2e98df9c55167d8b0b8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 30 Apr 2025 14:52:40 +0530 Subject: [PATCH 0506/1310] Fix for 3GPP issue 1535: Assert in ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx of BASOP decoder for OMASA bitstream Link #1535 --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 37b5f1e05..9212e3d23 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -2166,15 +2166,25 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move32(); W_temp = W_add( W_mult0_32_32( a, subtract_power_y ), W_mult0_32_32( b, masa_stereo_type_detect->subtract_power_y_smooth_fx ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth - exp = W_norm( W_temp ); - masa_stereo_type_detect->subtract_power_y_smooth_fx = W_extract_h( W_shl( W_temp, exp ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + exp - 32 - move32(); - masa_stereo_type_detect->q_subtract_power_y_smooth = sub( add( masa_stereo_type_detect->q_subtract_power_y_smooth, exp ), 1 ); - move16(); - + IF( W_temp ) + { + exp = W_norm( W_temp ); + masa_stereo_type_detect->subtract_power_y_smooth_fx = W_extract_h( W_shl( W_temp, exp ) ); // Q31 + masa_stereo_type_detect->q_subtract_power_y_smooth + exp - 32 + move32(); + masa_stereo_type_detect->q_subtract_power_y_smooth = sub( add( masa_stereo_type_detect->q_subtract_power_y_smooth, exp ), 1 ); + move16(); + } + ELSE + { + masa_stereo_type_detect->subtract_power_y_smooth_fx = 0; // Q31 + move32(); + masa_stereo_type_detect->q_subtract_power_y_smooth = Q31; + move16(); + } exp = 0; move16(); - IF( masa_stereo_type_detect->target_power_y_smooth_fx != 0 ) + test(); + IF( masa_stereo_type_detect->target_power_y_smooth_fx && masa_stereo_type_detect->subtract_power_y_smooth_fx ) { subtract_target_ratio = L_sub( BASOP_Util_Log2( masa_stereo_type_detect->subtract_power_y_smooth_fx ), BASOP_Util_Log2( masa_stereo_type_detect->target_power_y_smooth_fx ) ); // Q25 -- GitLab From 680ce4707de4e23974435f6dfd66ff72a96b76b6 Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Wed, 30 Apr 2025 11:47:27 +0200 Subject: [PATCH 0507/1310] Useless code removed. --- lib_enc/ivas_stereo_dmx_evs_fx.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 26487089d..97c53e369 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -1022,12 +1022,6 @@ static void calc_poc_fx( } move16(); - Word16 rfft_pha_buf_0[L_FRAME48k]; // Temporary solution - FOR( n = 0; n < L_FRAME48k; n++ ) - { - rfft_pha_buf_0[n] = 0; - } - /* Channel selection based on spikyness of R2L/L2R impulse responses */ tmp1 = spectral_flatness_fx( rfft_pha_buf, NULL, hPHA->pha_len ); rfft_pha_buf[sub( input_frame_pha, hPHA->pha_len )] = rfft_pha_buf[0]; -- GitLab From 528f8406425967c1634066eda5c83654d1feb415 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 30 Apr 2025 12:57:09 +0200 Subject: [PATCH 0508/1310] update CI commit SHA --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b93061941..605eb30d2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF f5e61349c22ededcdfe1cc54e533dea477f2d003 + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF e0b6e4f4f5f9281794beca2a669fce9be8f8405e include: - local: .gitlab-ci/variables.yml -- GitLab From afce099d46d4481ffbc828cf44a6d42faeaf054e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 30 Apr 2025 13:02:43 +0200 Subject: [PATCH 0509/1310] update sha again to test branch --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 605eb30d2..38aa72681 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF e0b6e4f4f5f9281794beca2a669fce9be8f8405e + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 725e23e7813092e0aab0d8be711356c374dd7663 include: - local: .gitlab-ci/variables.yml -- GitLab From 7d9c257e5781c5eb849bec81611627dbe1b6dfe1 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 30 Apr 2025 14:35:09 +0530 Subject: [PATCH 0510/1310] Fix for 3GPP issue 1525: Second channel of BASOP decoder MASA format output to FOA has missing energy or wrong signal - 2 Link #1525 --- lib_rend/ivas_dirac_decorr_dec_fx.c | 75 +++++++++++++++-------------- lib_rend/ivas_rom_rend.h | 8 +-- lib_rend/ivas_rom_rend_fx.c | 9 ++-- lib_rend/ivas_stat_rend.h | 4 +- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index 1afac99c4..4db9cd09a 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -63,8 +63,8 @@ * Local function prototypes *------------------------------------------------------------------------*/ -static void get_lattice_coeffs_fx( const Word16 band_index, const Word16 channel_index, Word16 *lattice_coeffs ); -static void lattice2allpass_fx( const Word16 filter_length, const Word16 *lattice_coeffs_fx, Word16 *filter_coeffs_num_real_fx, Word16 *filter_coeffs_den_real_fx ); +static void get_lattice_coeffs_fx( const Word16 band_index, const Word16 channel_index, Word32 *lattice_coeffs ); +static void lattice2allpass_fx( const Word16 filter_length, const Word32 *lattice_coeffs_fx, Word32 *filter_coeffs_num_real_fx, Word32 *filter_coeffs_den_real_fx ); /*------------------------------------------------------------------------- * ivas_dirac_dec_decorr_open() @@ -90,7 +90,8 @@ ivas_error ivas_dirac_dec_decorr_open_fx( Word16 split_frequencies_bands[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = { 0, 0, 0, 23768 }; move16(); Word16 *split_freq_ptr; - Word16 cur_lattice_delta_phi_fx, lattice_coeffs_fx[2 * DIRAC_MAX_DECORR_FILTER_LEN]; + Word16 cur_lattice_delta_phi_fx; + Word32 lattice_coeffs_fx[2 * DIRAC_MAX_DECORR_FILTER_LEN]; ivas_error error; @@ -277,12 +278,12 @@ ivas_error ivas_dirac_dec_decorr_open_fx( freq_domain_decorr_ap_state->q_decorr_buffer = Q31; move16(); - IF( ( freq_domain_decorr_ap_params->filter_coeff_num_real_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->filter_coeff_num_real_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } - IF( ( freq_domain_decorr_ap_params->filter_coeff_den_real_fx = (Word16 *) malloc( sizeof( Word16 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) + IF( ( freq_domain_decorr_ap_params->filter_coeff_den_real_fx = (Word32 *) malloc( sizeof( Word32 ) * imult1616( add( ap_filter_length[split_band_index_start], 1 ), imult1616( freq_domain_decorr_ap_params->max_band_decorr, num_outputs_diff ) ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TD decorrelator\n" ) ); } @@ -414,7 +415,7 @@ void ivas_dirac_dec_decorr_process_fx( Word32 frame_ma_fx[2 * ( DIRAC_MAX_DECORR_FILTER_LEN + 1 )]; Word32 *p_frame_dec_fx, *decorr_buffer_fx; Word16 *phase_coeff_real_fx, *phase_coeff_imag_fx; - Word16 *filter_coeff_num_real_fx, *filter_coeff_den_real_fx; + Word32 *filter_coeff_num_real_fx, *filter_coeff_den_real_fx; Word32 *decorr_buffer_start_ptr_fx, *decorr_buffer_ptr_fx; Word32 input_real_fx, input_imag_fx, filter_frame_imag_fx, filter_frame_real_fx; Word16 q_aux_buffer, q_onset_dec, q_frame_f; @@ -666,8 +667,8 @@ void ivas_dirac_dec_decorr_process_fx( /* MA part of filter impulse response */ FOR( l = 0; l < filter_length; l++ ) { - frame_ma_fx[2 * l] = Mpy_32_16_1( input_real_fx, filter_coeff_num_real_fx[l] ); // Q_qux -3 = q_deorr - frame_ma_fx[2 * l + 1] = Mpy_32_16_1( input_imag_fx, filter_coeff_num_real_fx[l] ); // Q_qux - 3 = q_deorr + frame_ma_fx[2 * l] = Mpy_32_32( input_real_fx, filter_coeff_num_real_fx[l] ); // Q_qux -3 = q_deorr + frame_ma_fx[2 * l + 1] = Mpy_32_32( input_imag_fx, filter_coeff_num_real_fx[l] ); // Q_qux - 3 = q_deorr move32(); move32(); } @@ -691,12 +692,12 @@ void ivas_dirac_dec_decorr_process_fx( FOR( l = 1; l < filter_length; l++ ) { // q adjustment needed// - Word32 temp_1 = Mpy_32_16_1( filter_frame_real_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 + Word32 temp_1 = Mpy_32_32( filter_frame_real_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 temp_1 = L_shl( temp_1, 3 ); // q_decorr decorr_buffer_ptr_fx[0] = L_sub( L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[2 * l] ), temp_1 ); // q_deocor move32(); - Word32 temp_2 = Mpy_32_16_1( filter_frame_imag_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 + Word32 temp_2 = Mpy_32_32( filter_frame_imag_fx, filter_coeff_den_real_fx[l] ); // q_decorr - 3 temp_2 = L_shl( temp_2, 3 ); // q_decorr decorr_buffer_ptr_fx[1] = L_sub( L_add( decorr_buffer_ptr_fx[1], frame_ma_fx[2 * l + 1] ), temp_2 ); // q_decorr move32(); @@ -1146,16 +1147,16 @@ void ivas_dirac_dec_decorr_close_fx( static void get_lattice_coeffs_fx( const Word16 band_index, // Q0 const Word16 channel_index, // Q0 - Word16 *lattice_coeffs ) // Q12 + Word32 *lattice_coeffs ) // Q31 { Word16 k; FOR( k = 0; k < ap_filter_length[band_index]; k++ ) { - Word16 cur_lattice_coeff = ap_lattice_coeffs_fx[band_index][add( imult1616( channel_index, ap_filter_length[band_index] ), k )]; // Q12 - lattice_coeffs[k] = cur_lattice_coeff; // Q12 - move16(); - move16(); + Word32 cur_lattice_coeff = ap_lattice_coeffs_fx[band_index][add( imult1616( channel_index, ap_filter_length[band_index] ), k )]; // Q31 + lattice_coeffs[k] = cur_lattice_coeff; // Q31 + move32(); + move32(); } return; @@ -1165,40 +1166,40 @@ static void get_lattice_coeffs_fx( /* convert lattice filter coeffs to all pass transfer function coeffs */ static void lattice2allpass_fx( const Word16 filter_length, // Q0 - const Word16 *lattice_coeffs_fx, // Q15 - Word16 *filter_coeffs_num_real_fx, // Q12 - Word16 *filter_coeffs_den_real_fx ) // Q12 + const Word32 *lattice_coeffs_fx, // Q31 + Word32 *filter_coeffs_num_real_fx, // Q28 + Word32 *filter_coeffs_den_real_fx ) // Q28 { Word16 i, p; - Word16 alpha_real_fx[2][DIRAC_MAX_DECORR_FILTER_LEN + 1]; - Word16 *alpha_real_p_old_fx = &alpha_real_fx[0][0]; - Word16 *alpha_real_p_fx = &alpha_real_fx[1][0]; - Word16 *tmp_fx; + Word32 alpha_real_fx[2][DIRAC_MAX_DECORR_FILTER_LEN + 1]; + Word32 *alpha_real_p_old_fx = &alpha_real_fx[0][0]; + Word32 *alpha_real_p_fx = &alpha_real_fx[1][0]; + Word32 *tmp_fx; FOR( i = 0; i < 2; i++ ) { - set16_fx( alpha_real_fx[i], 0, DIRAC_MAX_DECORR_FILTER_LEN + 1 ); + set32_fx( alpha_real_fx[i], 0, DIRAC_MAX_DECORR_FILTER_LEN + 1 ); } - alpha_real_p_fx[0] = ONE_IN_Q12; - move16(); - alpha_real_p_old_fx[0] = ONE_IN_Q12; - move16(); + alpha_real_p_fx[0] = ONE_IN_Q28; + move32(); + alpha_real_p_old_fx[0] = ONE_IN_Q28; + move32(); /* recursion */ - Word16 lattice_alpha = 0; - move16(); + Word32 lattice_alpha = 0; + move32(); FOR( p = 1; p < filter_length; p++ ) { - alpha_real_p_fx[p] = shr( lattice_coeffs_fx[( p - 1 )], 3 ); /* Q12 */ + alpha_real_p_fx[p] = L_shr( lattice_coeffs_fx[( p - 1 )], 3 ); /* Q28 */ move16(); FOR( i = 1; i < p; i++ ) { - lattice_alpha = mult( lattice_coeffs_fx[( p - 1 )], alpha_real_p_old_fx[sub( p, i )] ); /* Q12 */ - alpha_real_p_fx[i] = add( alpha_real_p_old_fx[i], lattice_alpha ); /* Q12 */ - move16(); + lattice_alpha = Mpy_32_32( lattice_coeffs_fx[( p - 1 )], alpha_real_p_old_fx[sub( p, i )] ); /* Q28 */ + alpha_real_p_fx[i] = L_add( alpha_real_p_old_fx[i], lattice_alpha ); /* Q28 */ + move32(); } /* switch pointers */ tmp_fx = alpha_real_p_old_fx; @@ -1208,10 +1209,10 @@ static void lattice2allpass_fx( FOR( i = 0; i < filter_length; i++ ) { - filter_coeffs_den_real_fx[i] = alpha_real_p_old_fx[i]; /* Q12 */ - move16(); - filter_coeffs_num_real_fx[i] = alpha_real_p_old_fx[sub( sub( filter_length, i ), 1 )]; /* Q12 */ - move16(); + filter_coeffs_den_real_fx[i] = alpha_real_p_old_fx[i]; /* Q28 */ + move32(); + filter_coeffs_num_real_fx[i] = alpha_real_p_old_fx[sub( sub( filter_length, i ), 1 )]; /* Q28 */ + move32(); } return; diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index e7d6c6293..f62440749 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -51,10 +51,10 @@ extern const Word16 diffuse_response_CICP16_fx[9]; /*Q-15*/ extern const Word16 ap_pre_delay[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const Word16 ap_filter_length[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const Word16 ap_lattice_delta_phi_fx[DIRAC_MAX_NUM_DECORR_FILTERS * DIRAC_MAX_DECORR_FILTER_LEN]; /*Q-14*/ -extern const Word16 ap_lattice_coeffs_1_fx[DIRAC_DECORR_FILTER_LEN_1 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ -extern const Word16 ap_lattice_coeffs_2_fx[DIRAC_DECORR_FILTER_LEN_2 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ -extern const Word16 ap_lattice_coeffs_3_fx[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ -extern const Word16 *const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS]; +extern const Word32 ap_lattice_coeffs_1_fx[DIRAC_DECORR_FILTER_LEN_1 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ +extern const Word32 ap_lattice_coeffs_2_fx[DIRAC_DECORR_FILTER_LEN_2 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ +extern const Word32 ap_lattice_coeffs_3_fx[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM_DECORR_FILTERS]; /*Q-15*/ +extern const Word32 *const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const Word16 ap_split_frequencies_fx[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; /*Q-14*/ extern const Word16 sba_map_tc[11]; /*Q-0*/ diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 2b46ff611..4f101582c 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -76,11 +76,10 @@ const Word16 ap_lattice_delta_phi_fx[DIRAC_MAX_NUM_DECORR_FILTERS*DIRAC_MAX_DECO 29799 , 15800 , 24520 , 10977 , 25165 , 30177 , 16042 , 10060 , 30789 , 8397 , 19121 , 1339 , 29056 , 25160 , 12415 , 3611 , 25203 , 20991 , 4951 , 14580 , 13083 , 24188 , 27295 , 14997 , 22841 , 12403 , 5735 , 19656 , 21619 , 18488 , 10360 , 12954 , 7563 , 27744 , 25189 , 5677 , 7107 , 28747 , 9026 , 11251 , 12524 , 29372 , 24412 }; -const Word16 ap_lattice_coeffs_1_fx[330] /* Q15 */ = { 26061, 16472, 6699, 13650, 15061, 8862, -6617, 917, 2222, -1724, -1270, -1880, 671, 12048, -19454, 17487, 6635, -63, 6392, -6044, -7663, 7474, -10790, -11098, -2611, 1716, -310, 5859, 6253, -15691, 1442, 25837, 4375, -5690, 17871, 22329, 10907, 9656, 10658, 1560, 5157, 3810, 7175, -6201, -10400, -24696, 25309, -16625, 9076, -22700, 7612, -11624, -511, -7309, 10174, -1147, 2810, -16383, 7053, 6599, -16238, -9884, 6439, 10687, -19476, 10319, 21911, 2511, 1497, -4089, -6660, -9738, 4122, -5881, -6611, 5279, 12977, 8745, 11684, 15995, -1843, 4563, -9712, -3697, 1225, -12039, -7087, -9088, 12760, 3772, -7879, -8880, 13982, -362, 4974, 8306, 7397, 16341, -4468, 14516, -9994, -1025, -352, 5581, 16268, -4583, -7929, -3435, 9645, -2219, -16128, -15978, 1192, 3584, 12981, -11562, -6747, -2719, -15172, -10135, 848, -3029, -4100, -5115, -160, 5847, 2935, 1468, 7805, -10227, -12802, -5850, 14890, 12681, -12742, -6481, 1164, 14922, -1782, 12452, 9534, 1599, 2576, 7265, -7128, 3974, -12998, -7159, -4170, -8831, -11279, -15238, -13808, -852, 7259, 11861, -11411, 9666, 11998, 2315, -2819, 8261, 5113, -2057, 13401, 7944, -9888, -2167, 12735, -15146, -5206, 7562, -3053, 1542, 2405, -10977, 751, 11619, 2372, 638, 11039, -15746, 5579, 8508, -12896, -11422, -3570, 9137, 12631, 11870, -10444, 11872, 9467, 9542, -9110, -14722, -9453, -13565, -13280, -9671, -8031, 82, 9433, 11410, -5844, -6767, 11504, -15800, 699, -16128, 1593, 14853, 3576, 7621, -15524, 4603, 11551, -3231, 4822, -1828, 3530, -7570, 11708, 11404, 7615, -10642, 5324, 1888, -1990, -319, -7346, -9252, -2144, 2119, 9187, -9335, -15417, 638, -14493, 12360, 14659, -9519, 11322, 12130, -10260, 3918, 9830, 13336, -9106, 14648, 6383, 5167, -7320, -4822, 12421, -7089, 4520, -13014, 2421, -8949, -14517, -5515, 11346, 1230, 2142, 5370, -4014, 11975, -10365, 3842, -9872, 5558, -11025, 8844, -13767, -10855, 16335, -12878, -15144, -10587, 15432, -11778, 8661, 7104, 16167, 4963, -10539, 15217, -11654, 13775, 6039, -9900, 4474, -8285, 6353, 9790, 7825, -12658, -5963, -2533, 4090, -8630, 12766, 147, 11134, 13605, 12378, 13114, 11548, -124, -6046, 14199, -7784, 4839, 13343, 2215, -8169, -11600, 10516, 13959, 10144, -6215, -6863, 5209, -2684, 12675, 5851, -13341, 7280, -4885, }; -const Word16 ap_lattice_coeffs_2_fx[132] /* Q15 */ = { 20764, 22321, -1619, 9395, 4784, 4436, -13439, -6775, -21527, -3334, 14296, 11135, -4305, -25354, -9883, 10733, 10886, 6745, 23514, -18100, -4919, 1787, 7848, -21249, -23653, 6205, 2234, 203, 2523, 1267, 13874, -3560, 14157, -13586, 9104, 13712, 2549, -9275, -11698, 151, -14504, -12200, 13216, 7963, 10301, 14565, 11387, 16254, 3552, 15380, -5579, 10692, 5641, 14428, 1914, 11130, -6388, 16096, -9217, -1412, -15810, -10977, -11015, 6437, -5394, 14499, -4429, -11612, 14815, -10198, -11391, 16329, -9469, 12334, -5830, 6407, 10940, -5003, 1744, 15000, 14499, 7708, -11310, -9374, 5093, 13283, 7113, -3537, 350, 12090, -16330, -16246, -7060, -3075, 10494, -453, 16036, 15427, -2157, 11366, 893, 4918, 15860, -16298, 5531, -16182, -5686, 10966, 8658, -13914, -10319, 8293, 13021, -16107, -14867, -15183, -626, 11, 10336, 15477, 3117, 9285, -7375, -3924, -15626, 1229, 11041, 16204, -2051, 5821, 15200, 16032, }; -const Word16 ap_lattice_coeffs_3_fx[66] /* Q15 */ = { 621, -6953, 13851, -13128, -3502, -805, 4587, 9161, 1060, 20726, 18957, -24071, 563, 433, -908, -11578, -15799, -16097, 14975, 5410, 15391, -6412, 14421, -15642, 11802, -16074, 15880, -5694, 247, 9115, 14234, 1977, -6347, -1104, 16260, 96, -15756, -3589, -760, 10639, -9570, -11670, -12012, 12481, -9887, 3614, 12575, 9960, -16373, -11455, 10969, -662, -14092, -5069, -12161, 10947, 11367, -5465, -7506, 3865, 11183, 16071, 16176, -12049, 13976, -1499, }; - -const Word16 * const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS] = +const Word32 ap_lattice_coeffs_1_fx[330] /* Q31 */ = { 1707955968, 1079539968, 439065920, 894568704, 987086592, 580795520, -433671424, 60123100, 145623008, -113015624, -83277272, -123237648, 43980464, 789623296, -1274971776, 1146041216, 434865440, -4194035, 418933248, -396120544, -502225568, 489841024, -707151360, -727382784, -171154448, 112504520, -20332376, 383985120, 409832224, -1028380544, 94536528, 1693286528, 286751360, -372925568, 1171218304, 1463361920, 714828608, 632831232, 698492672, 102256728, 338016064, 249692224, 470255968, -406406976, -681613440, -1618517632, 1658684160, -1089598848, 594810048, -1487723008, 498864736, -761839168, -33543694, -479015552, 666806528, -75234944, 184217584, -1073737536, 462267328, 432535424, -1064187648, -647809920, 422002016, 700395328, -1276386944, 676287680, 1435960064, 164589584, 98163624, -267984480, -436523296, -638210688, 270166336, -385436800, -433269856, 346019744, 850510912, 573156928, 765762624, 1048283392, -120804544, 299101536, -636524864, -242330640, 80326624, -789039168, -464483520, -595626048, 836273088, 247207584, -516360288, -582000256, 916374208, -23749022, 326015936, 544365632, 484824512, 1070984448, -292867392, 951343872, -655019008, -67237712, -23117662, 365821696, 1066178368, -300379264, -519686752, -225163664, 632096768, -145444768, -1056995776, -1047134528, 78157664, 234919680, 850736384, -757728896, -442194816, -178238992, -994355776, -664208128, 55589760, -198547744, -268733952, -335258720, -10494753, 383196992, 192384464, 96265248, 511571392, -670272576, -838996096, -383418176, 975855232, 831101952, -835100544, -424765824, 76321568, 977938304, -116844584, 816118976, 624840448, 104805792, 168871664, 476183040, -467180768, 260466144, -851865984, -469186528, -273299520, -578761856, -739202496, -998661504, -904981824, -55901148, 475768544, 777374080, -747846144, 633471168, 786354816, 151747632, -184790960, 541442880, 335149184, -134861968, 878260672, 520681024, -648033280, -142077520, 834621696, -992624896, -341192192, 495630624, -200100384, 101094944, 157629600, -719445696, 49263276, 761521344, 155458496, 41817948, 723487232, -1031938880, 365645600, 557622016, -845198016, -748587008, -233994112, 598808640, 827833472, 777923776, -684486784, 778044032, 620485312, 625355840, -597041280, -964868672, -619576960, -889000256, -870330048, -633834112, -526369728, 5433133, 618239040, 747816064, -383012288, -443491872, 753940736, -1035527360, 45870252, -1057006464, 104457896, 973415680, 234419312, 499502560, -1017436928, 301725760, 757045952, -211754768, 316049472, -119823144, 231367744, -496124544, 767317376, 747390912, 499083776, -697476928, 348923136, 123795992, -130425272, -20920786, -481433632, -606352768, -140537776, 138935744, 602089984, -611830976, -1010393216, 41841572, -949849216, 810060928, 960749824, -623839680, 742015744, 795013504, -672420096, 256821872, 644275136, 874015104, -596832960, 960008960, 418381344, 338664608, -479752128, -316038720, 814053056, -464590912, 296281888, -852937536, 158709776, -586499264, -951414720, -361479488, 743596288, 80622976, 140417520, 351974720, -263116144, 784855872, -679294144, 251841856, -646998144, 364266912, -722555264, 579635904, -902286720, -711452736, 1070569984, -843980416, -992532608, -693845504, 1011415424, -771940928, 567612160, 465568000, 1059568448, 325320160, -690744576, 997319296, -763801920, 902804288, 395774784, -648814912, 293208832, -542989120, 416409952, 641614400, 512836288, -829568640, -390839872, -166056320, 268091856, -565634304, 836672512, 9667971, 729723520, 891643776, 811214080, 859468032, 756829056, -8177617, -396275168, 930607744, -510143328, 317148960, 874476800, 145204256, -535395584, -760230656, 689206976, 914828032, 664809408, -407354016, -449784000, 341379040, -175941184, 830706816, 383501920, -874332928, 477147232, -320183360}; +const Word32 ap_lattice_coeffs_2_fx[132] /* Q31 */ = { 1360843264, 1462880896, -106124344, 615715776, 313579872, 290773568, -880779712, -444026592, -1410828032, -218497872, 936944960, 729753600, -282142848, -1661606912, -647739072, 703431872, 713452032, 442076704, 1541038592, -1186205568, -322414592, 117158120, 514363136, -1392593792, -1550156800, 406684000, 146426176, 13348758, 165409920, 83060376, 909276800, -233341280, 927820288, -890434752, 596656832, 898691840, 167097856, -607873152, -766668864, 9951439, -950562176, -799540352, 866157440, 521887904, 675097984, 954584384, 746287104, 1065244224, 232804400, 1007990144, -365686400, 700745408, 369704352, 945610048, 125449552, 729442240, -418684160, 1054884800, -604078592, -92599496, -1036132928, -719417728, -721895936, 421913952, -353525216, 950242176, -290318304, -761035968, 970948224, -668342016, -746551232, 1070181312, -620620608, 808379392, -382088896, 419923232, 716984640, -327914304, 114310552, 983047168, 950209984, 505204128, -741223296, -614390784, 333800576, 870574848, 466160704, -231842336, 22973780, 792393536, -1070215680, -1064756736, -462737632, -201582144, 687787456, -29725468, 1050991360, 1011065344, -141377440, 744899776, 58581208, 322307232, 1039409984, -1068139008, 362486656, -1060515456, -372648544, 718711232, 567440320, -911931072, -676298432, 543498048, 853369216, -1055627776, -974371328, -995053760, -41077068, 738734, 677385088, 1014353152, 204309440, 608543168, -483372800, -257186944, -1024072704, 80584320, 723596736, 1061954304, -134438912, 381504768, 996200512, 1050733696}; +const Word32 ap_lattice_coeffs_3_fx[66] /* Q31 */ = { 1360843264, 1462880896, -106124344, 615715776, 313579872, 290773568, -880779712, -444026592, -1410828032, -218497872, 936944960, 729753600, -282142848, -1661606912, -647739072, 703431872, 713452032, 442076704, 1541038592, -1186205568, -322414592, 117158120, 514363136, -1392593792, -1550156800, 406684000, 146426176, 13348758, 165409920, 83060376, 909276800, -233341280, 927820288, -890434752, 596656832, 898691840, 167097856, -607873152, -766668864, 9951439, -950562176, -799540352, 866157440, 521887904, 675097984, 954584384, 746287104, 1065244224, 232804400, 1007990144, -365686400, 700745408, 369704352, 945610048, 125449552, 729442240, -418684160, 1054884800, -604078592, -92599496, -1036132928, -719417728, -721895936, 421913952, -353525216, 950242176}; +const Word32 * const ap_lattice_coeffs_fx[DIRAC_DECORR_NUM_SPLIT_BANDS] = { &ap_lattice_coeffs_1_fx[0], &ap_lattice_coeffs_2_fx[0], diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 0515e4038..17474bfe7 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -120,8 +120,8 @@ typedef struct dirac_decorr_params_structure Word16 *pre_delay; Word16 *filter_length; - Word16 *filter_coeff_num_real_fx; /* Q12 */ - Word16 *filter_coeff_den_real_fx; /* Q12 */ + Word32 *filter_coeff_num_real_fx; /* Q28 */ + Word32 *filter_coeff_den_real_fx; /* Q28 */ Word16 *phase_coeff_real_fx; /* Q14 */ Word16 *phase_coeff_imag_fx; /* Q14 */ Word16 *split_frequency_bands; -- GitLab From 1609478cc3e8fee37f8a9bf2d43f9da3fc9d0f36 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 30 Apr 2025 14:46:00 +0530 Subject: [PATCH 0511/1310] Clang formatting changes --- lib_rend/ivas_dirac_decorr_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index 4db9cd09a..9b2bf02d7 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -1154,7 +1154,7 @@ static void get_lattice_coeffs_fx( FOR( k = 0; k < ap_filter_length[band_index]; k++ ) { Word32 cur_lattice_coeff = ap_lattice_coeffs_fx[band_index][add( imult1616( channel_index, ap_filter_length[band_index] ), k )]; // Q31 - lattice_coeffs[k] = cur_lattice_coeff; // Q31 + lattice_coeffs[k] = cur_lattice_coeff; // Q31 move32(); move32(); } -- GitLab From 87f833e2f2c14ee78f51cd74fc6d5c9a0b6c649f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 30 Apr 2025 13:15:53 +0200 Subject: [PATCH 0512/1310] update CI repo SHA for latest main commit --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 38aa72681..6d9128027 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 725e23e7813092e0aab0d8be711356c374dd7663 + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 44cb5638949b874ce0f5c3bf4359f9db860d88bc include: - local: .gitlab-ci/variables.yml -- GitLab From bbc238ef5ff9e55a3daa76f3385e239e2b355294 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 30 Apr 2025 17:40:40 +0530 Subject: [PATCH 0513/1310] Fix for decoder msan error --- lib_dec/ivas_stereo_dft_dec_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 324f2b7f3..f1ccc1d7f 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -402,6 +402,8 @@ ivas_error stereo_dft_dec_create_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for TCX-LTP handle\n" ) ); } set_zero_fx( hStereoDft_loc->hb_nrg_subr_fx, STEREO_DFT_NBDIV ); /*Setting hb_nrg_subr_fx to zero*/ + hStereoDft_loc->q_hb_nrg_subr = Q31; + move16(); hStereoDft_loc->hConfig->force_mono_transmission = 0; move16(); -- GitLab From 97117fd61051f35fe7546805a6a518eed474fb1d Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Mon, 5 May 2025 10:45:37 +0200 Subject: [PATCH 0514/1310] missing pop_wmops() added. --- lib_enc/ivas_cpe_enc_fx.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index a05493aa4..d020b398a 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -329,6 +329,7 @@ ivas_error ivas_cpe_enc_fx( &q_band_energies_LR, NULL, NULL, NULL, Q_inp, Q_buffer, Q_add, &front_create_flag ) ), IVAS_ERR_OK ) ) { + pop_wmops(); return error; } @@ -362,6 +363,7 @@ ivas_error ivas_cpe_enc_fx( *----------------------------------------------------------------*/ IF( ( error = stereo_memory_enc_fx( hCPE, input_Fs, max_bwidth, ivas_format, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) { + pop_wmops(); return error; } @@ -372,6 +374,7 @@ ivas_error ivas_cpe_enc_fx( IF( ( error = stereo_set_tdm_fx( hCPE, input_frame, sts[1]->q_inp32 ) ) != IVAS_ERR_OK ) { + pop_wmops(); return error; } @@ -917,6 +920,7 @@ ivas_error ivas_cpe_enc_fx( move16(); IF( error != IVAS_ERR_OK ) { + pop_wmops(); return error; } } @@ -991,6 +995,7 @@ ivas_error ivas_cpe_enc_fx( igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->rf_mode ); /* Q0 */ IF( ( error = IGF_Reconfig_fx( &sts[n]->hIGFEnc, igf, 0, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) { + pop_wmops(); return error; } } @@ -1019,6 +1024,7 @@ ivas_error ivas_cpe_enc_fx( { IF( ( error = initMdctItdHandling_fx( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) { + pop_wmops(); return error; } } @@ -1195,6 +1201,7 @@ ivas_error ivas_cpe_enc_fx( } IF( NE_32( ( error = ivas_core_enc_fx( NULL, hCPE, st_ivas->hMCT, n_CoreChannels, old_inp_12k8_16fx, old_inp_16k_16fx, Q_new, ener_fx, A_fx, Aw_fx, epsP_fx, epsP_fx_q, lsp_new_fx, lsp_mid_fx, vad_hover_flag, attack_flag, realBuffer_fx, imagBuffer_fx, q_re_im_buf, old_wsp_fx, e_old_wsp, loc_harm, cor_map_sum_fx, vad_flag_dtx, enerBuffer_fx, enerBuffer_fx_exp, fft_buff_fx, tdm_SM_or_LRTD_Pri, ivas_format, 0 ) ), IVAS_ERR_OK ) ) { + pop_wmops(); return error; } -- GitLab From fdfd1c02f905d22b41baf98e6d0109313920ad89 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 6 May 2025 09:37:10 +0530 Subject: [PATCH 0515/1310] Fix for crash observed with complexity measurement pipeline for stereodownmix --- lib_com/phase_dispersion_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/phase_dispersion_fx.c b/lib_com/phase_dispersion_fx.c index 723d173bc..3103723be 100644 --- a/lib_com/phase_dispersion_fx.c +++ b/lib_com/phase_dispersion_fx.c @@ -114,12 +114,12 @@ void phase_dispersion( scale2 = getScaleFactor32( x32, L_subfr ); FOR( i = 0; i < L_subfr / 2 - 1; i++ ) { - code[i] = round_fx_sat( L_shl_sat( x32[2 * i + 0], scale2 ) ); + code[i] = round_fx_sat( L_shl_sat( x32[2 * i], scale2 ) ); code[L_subfr - 1 - i] = round_fx_sat( L_shl_sat( x32[2 * i + 3], scale2 ) ); } - code[L_subfr / 2 - 1] = round_fx( L_shl( x32[L_subfr - 2], scale2 ) ); - code[L_subfr / 2] = round_fx( L_shl( x32[1], scale2 ) ); + code[L_subfr / 2 - 1] = round_fx_sat( L_shl_sat( x32[L_subfr - 2], scale2 ) ); + code[L_subfr / 2] = round_fx_sat( L_shl_sat( x32[1], scale2 ) ); j = sub( j, scale2 ); -- GitLab From 4fcac19d00b8401c48753423cd399ccaeea01210 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 6 May 2025 09:46:22 +0530 Subject: [PATCH 0516/1310] Bug fix for energy level drop Link #1084 --- lib_enc/ivas_front_vad_fx.c | 2 +- lib_enc/nois_est_fx.c | 4 ++-- lib_enc/prot_fx_enc.h | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index 124ab2996..fff68e5a2 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -613,7 +613,7 @@ ivas_error front_vad_spar_fx( Word16 q_tmpN, q_tmpE; noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, &hFrontVad->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, - &hFrontVad->hNoiseEst->totalNoise_fx, Etot_fx[0], &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx ); + &hFrontVad->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_fx[0] ) /*q8->q24*/, &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx ); corr_shift_fx = correlation_shift_fx( hFrontVad->hNoiseEst->totalNoise_fx ); /* Q15 */ diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index e8c72baa1..733576975 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -748,8 +748,8 @@ void noise_est_down_ivas_fx( const Word16 min_band, /* i : minimum critical band */ const Word16 max_band, /* i : maximum critical band */ Word16 *totalNoise, /* o : noise estimate over all critical bands */ - Word32 Etot, /* i : Energy of current frame */ - Word32 *Etot_last, /* i/o: Energy of last frame Q8 */ + Word32 Etot, /* i : Energy of current frame Q24*/ + Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ ) diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 54e203db1..2d7e708bb 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -369,8 +369,8 @@ void noise_est_down_ivas_fx( const Word16 min_band, /* i : minimum critical band */ const Word16 max_band, /* i : maximum critical band */ Word16 *totalNoise, /* o : noise estimate over all critical bands */ - Word32 Etot, /* i : Energy of current frame */ - Word32 *Etot_last, /* i/o: Energy of last frame Q8 */ + Word32 Etot, /* i : Energy of current frame Q24*/ + Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ ); -- GitLab From 88c70599bf3fb7b39d338e5df8b2f56587642f7b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 6 May 2025 09:21:34 +0200 Subject: [PATCH 0517/1310] Reserve ivas-pytest-compare_ref-long-dec* jobs to high-memory-capacity runners --- .gitlab-ci.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b93061941..279e90e46 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1270,7 +1270,10 @@ ivas-pytest-compare_ref-long-enc: ivas-pytest-compare_ref-long-dec: extends: - .rules-pytest-long - - .test-job-linux + - .test-job-linux + tags: + - ivas-basop-linux + - high-memory-capacity before_script: - USE_LTV=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1282,7 +1285,7 @@ ivas-pytest-compare_ref-long-dec: ivas-pytest-compare_ref-long-enc-lev-10: extends: - .rules-pytest-long - - .test-job-linux + - .test-job-linux before_script: - USE_LTV=1 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1294,7 +1297,10 @@ ivas-pytest-compare_ref-long-enc-lev-10: ivas-pytest-compare_ref-long-dec-lev-10: extends: - .rules-pytest-long - - .test-job-linux + - .test-job-linux + tags: + - ivas-basop-linux + - high-memory-capacity before_script: - USE_LTV=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1318,7 +1324,10 @@ ivas-pytest-compare_ref-long-enc-lev+10: ivas-pytest-compare_ref-long-dec-lev+10: extends: - .rules-pytest-long - - .test-job-linux + - .test-job-linux + tags: + - ivas-basop-linux + - high-memory-capacity before_script: - USE_LTV=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH -- GitLab From 65692897fffed98f744153d0dcba5aa755a8d1e9 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 6 May 2025 13:57:38 +0530 Subject: [PATCH 0518/1310] Fix for 3GPP issue 1448: Complexity measurement crashes: StereoDmxEVS Link #1448 --- lib_dec/evs_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index c0281c7e3..9f08a281b 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -1151,7 +1151,7 @@ ivas_error evs_dec_fx( FOR( i = 0; i < tmps; i++ ) { - output_sp[i + delay_comp] = msu_r_sat( L_mult_sat( output_sp[i + delay_comp], alpha ), shr( hHQ_core->old_out_fx[i + nz], timeIn_e ), add( alpha, -32768 ) ); /*timeIn_e*/ + output_sp[i + delay_comp] = msu_r_sat( L_mult_sat( output_sp[i + delay_comp], alpha ), shr_sat( hHQ_core->old_out_fx[i + nz], timeIn_e ), add( alpha, -32768 ) ); /*timeIn_e*/ move16(); alpha = add( alpha, step ); } -- GitLab From 28ce1f371027412d1377cddff49d7f03797bcf7f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 6 May 2025 15:30:48 +0200 Subject: [PATCH 0519/1310] port 1298 from float --- lib_com/options.h | 1 + lib_dec/ivas_output_config_fx.c | 8 ++++++++ lib_dec/ivas_sba_dec_fx.c | 8 ++++++++ lib_dec/ivas_spar_decoder_fx.c | 6 ++++++ 4 files changed, 23 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 71e860604..d696d9339 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -99,6 +99,7 @@ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ +#define NONBE_FIX_935_SBA_REVERB /* FhG: issue 935: fix MSAN error for SBA related to BINAURAL_ROOM_REVERB */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index 9d8a592e0..75a592e1e 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -158,11 +158,19 @@ void ivas_renderer_select( move16(); test(); +#ifdef NONBE_FIX_935_SBA_REVERB +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) +#else + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) +#endif +#else #ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) #else IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif +#endif /* NONBE_FIX_935_SBA_REVERB */ { *renderer_type = RENDERER_BINAURAL_FASTCONV; move16(); diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index fdbcdef48..b5d494eae 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -216,11 +216,19 @@ ivas_error ivas_sba_dec_reconfigure_fx( ELSE { test(); +#ifdef NONBE_FIX_935_SBA_REVERB +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) +#else + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) +#endif +#else #ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) #else IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif +#endif /* NONBE_FIX_935_SBA_REVERB */ { renderer_type_new = RENDERER_BINAURAL_FASTCONV; move16(); diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index 38b403606..b95a93678 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -294,8 +294,14 @@ ivas_error ivas_spar_dec_open_fx( test(); test(); +#ifdef NONBE_FIX_935_SBA_REVERB + + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) +#else test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) +#endif { /* get correct granularity in case of binaural rendering of the discrete objects with the td obj renderer */ Word32 quo, rem; -- GitLab From 69e2488291842285710c67440681d342844781f8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 6 May 2025 17:31:17 +0530 Subject: [PATCH 0520/1310] Improvements related to input_fx and input32_fx buffers scalings --- lib_com/ivas_prot_fx.h | 2 +- lib_enc/init_enc_fx.c | 6 +- lib_enc/ivas_corecoder_enc_reconfig_fx.c | 76 +++++++--- lib_enc/ivas_cpe_enc_fx.c | 181 ++++++++++++----------- lib_enc/ivas_ism_enc_fx.c | 6 +- lib_enc/ivas_mct_enc_fx.c | 3 + lib_enc/ivas_sce_enc_fx.c | 6 +- lib_enc/ivas_stereo_dft_enc_fx.c | 12 +- lib_enc/ivas_stereo_dft_td_itd_fx.c | 38 +---- lib_enc/ivas_stereo_ica_enc_fx.c | 16 +- lib_enc/ivas_stereo_switching_enc_fx.c | 47 ++---- lib_enc/stat_enc.h | 2 + 12 files changed, 198 insertions(+), 197 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 17566e3cb..5816c60b5 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4746,7 +4746,7 @@ ivas_error stereo_memory_enc_fx( void stereo_switching_enc_fx( CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word16 old_input_signal_pri[], /* i : old input signal of primary channel */ + Word32 old_input_signal_pri[], /* i : old input signal of primary channel */ const Word16 input_frame, /* i : input frame length */ const Word16 q_inp ); diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 1513cbe23..97cd57308 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1421,7 +1421,10 @@ ivas_error init_encoder_ivas_fx( set32_fx( st->input_buff32_fx, 0, add( L_FRAME48k, add( L_FRAME48k, NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ) ); st->q_inp32 = Q31; move16(); + st->q_old_inp32 = Q31; + move16(); st->old_input_signal_fx = st->input_buff_fx; + st->old_input_signal32_fx = st->input_buff32_fx; /* st->input_Fs / FRAMES_PER_SEC */ Word16 frame_length = extract_l( Mpy_32_32( st->input_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); @@ -1432,7 +1435,8 @@ ivas_error init_encoder_ivas_fx( } ELSE { - st->input32_fx = st->input_buff32_fx + Mpy_32_32( st->input_Fs, 42949673 ) /* 1/50 in Q31*/; // st->input_Fs / FRAMES_PER_SEC + // st->input32_fx = st->input_buff32_fx + Mpy_32_32( st->input_Fs, 42949673 ) /* 1/50 in Q31*/; // st->input_Fs / FRAMES_PER_SEC + st->input32_fx = st->input_buff32_fx + frame_length; st->input_fx = st->input_buff_fx + frame_length; } } diff --git a/lib_enc/ivas_corecoder_enc_reconfig_fx.c b/lib_enc/ivas_corecoder_enc_reconfig_fx.c index 2e09c42ed..a8698bacc 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig_fx.c +++ b/lib_enc/ivas_corecoder_enc_reconfig_fx.c @@ -213,24 +213,37 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); } - Word16 q_com_sce = Q15; + Word16 q_com_sce = Q15, q_com_sce32 = Q31; + move16(); + move16(); + Word16 q_com_cpe = Q15, q_com_cpe32 = Q31; move16(); - Word16 q_com_cpe = Q15; move16(); IF( nSCE_old > 0 ) { FOR( k = 0; k < nSCE_old; k++ ) { shift = sub( getScaleFactor16( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame ), Q1 ); - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp + shift */ + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp + shift */ st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp, shift ); move16(); q_com_sce = s_min( q_com_sce, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp ); shift = sub( getScaleFactor16( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_inp + shift */ + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_inp + shift */ st_ivas->hSCE[k]->hCoreCoder[0]->q_inp = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_inp, shift ); move16(); q_com_sce = s_min( q_com_sce, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp ); + + shift = sub( getScaleFactor32( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal32_fx, input_frame ), Q1 ); + scale_sig32( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal32_fx, input_frame, shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp + shift */ + st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32 = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32, shift ); + move16(); + q_com_sce32 = s_min( q_com_sce32, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32 ); + shift = sub( getScaleFactor32( st_ivas->hSCE[k]->hCoreCoder[0]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); + scale_sig32( st_ivas->hSCE[k]->hCoreCoder[0]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hSCE[k]->hCoreCoder[0]->q_inp + shift */ + st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32 = add( st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32, shift ); + move16(); + q_com_sce32 = s_min( q_com_sce32, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32 ); } } @@ -242,15 +255,26 @@ ivas_error ivas_corecoder_enc_reconfig_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { shift = sub( getScaleFactor16( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame ), Q1 ); - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp + shift */ + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp + shift */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp, shift ); move16(); q_com_cpe = s_min( q_com_cpe, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp ); shift = sub( getScaleFactor16( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp + shift */ + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp + shift */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp, shift ); move16(); q_com_cpe = s_min( q_com_cpe, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp ); + + shift = sub( getScaleFactor32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal32_fx, input_frame ), Q1 ); + scale_sig32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal32_fx, input_frame, shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp + shift */ + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32, shift ); + move16(); + q_com_cpe32 = s_min( q_com_cpe32, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 ); + shift = sub( getScaleFactor32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ) ), Q1 ); + scale_sig32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input32_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), shift ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp + shift */ + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 = add( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32, shift ); + move16(); + q_com_cpe32 = s_min( q_com_cpe32, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 ); } } } @@ -259,14 +283,16 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { FOR( k = 0; k < nSCE_old; k++ ) { - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp ) ); /* q_com */ + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp ) ); /* q_com */ st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp = q_com; move16(); - Scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp ) ); /* q_com */ + scale_sig( st_ivas->hSCE[k]->hCoreCoder[0]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hSCE[k]->hCoreCoder[0]->q_inp ) ); /* q_com */ st_ivas->hSCE[k]->hCoreCoder[0]->q_inp = q_com; move16(); Copy_Scale_sig_16_32_DEPREC( st_ivas->hSCE[k]->hCoreCoder[0]->input_buff_fx, st_ivas->hSCE[k]->hCoreCoder[0]->input_buff32_fx, L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS ) + L_FRAME48k, Q6 ); /* Q6 + q_com */ st_ivas->hSCE[k]->hCoreCoder[0]->q_inp32 = add( Q6, q_com ); + st_ivas->hSCE[k]->hCoreCoder[0]->q_old_inp32 = add( Q6, q_com ); + move16(); move16(); } } @@ -277,14 +303,16 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { FOR( n = 0; n < CPE_CHANNELS; n++ ) { - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp ) ); /* q_com */ + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp ) ); /* q_com */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp = q_com; move16(); - Scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp ) ); /* q_com */ + scale_sig( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_fx, sub( L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), input_frame ), sub( q_com, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp ) ); /* q_com */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp = q_com; move16(); Copy_Scale_sig_16_32_DEPREC( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff_fx, st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff32_fx, L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS ) + L_FRAME48k, Q6 ); /* Q6 + q_com */ st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 = add( Q6, q_com ); + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 = add( Q6, q_com ); + move16(); move16(); } } @@ -301,7 +329,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { set32_fx( input_buff_fx[0], 0, len_inp_memory ); Copy32( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, input_buff_fx[0], len_inp_memory ); /* st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 */ - q_input_buff[0] = st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32; + q_input_buff[0] = st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32; move16(); } @@ -311,7 +339,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( nCPE_old > 0 ) { Copy32( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, input_buff_fx[n + 1], len_inp_memory ); /* st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 */ - q_input_buff[n + 1] = st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32; + q_input_buff[n + 1] = st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32; move16(); } } @@ -334,7 +362,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( GT_16( n_CoreCoder_existing, sce_id ) ) { Copy32( st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff32_fx, input_buff_fx[sce_id], len_inp_memory ); /* st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_inp32 */ - q_input_buff[sce_id] = st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_inp32; + q_input_buff[sce_id] = st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_old_inp32; move16(); } destroy_sce_enc_fx( st_ivas->hSCE[sce_id], ( EQ_16( st_ivas->hEncoderConfig->element_mode_init, EVS_MONO ) && !st_ivas->hEncoderConfig->stereo_dmx_evs ) ); @@ -349,7 +377,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n ) { Copy32( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff32_fx, input_buff_fx[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n], len_inp_memory ); /* st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 */ - q_input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n] = st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32; + q_input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n] = st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32; move16(); } } @@ -398,7 +426,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( GT_16( n_CoreCoder_existing, sce_id ) && NE_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) { Copy32( input_buff_fx[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff32_fx, len_inp_memory ); /* q_input_buff[sce_id] */ - st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_inp32 = q_input_buff[sce_id]; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->q_old_inp32 = q_input_buff[sce_id]; move16(); } test(); @@ -475,7 +503,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( GT_16( n_CoreCoder_existing, add( i_mult( cpe_id, CPE_CHANNELS ), n ) ) ) { Copy32( input_buff_fx[n], st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff32_fx, len_inp_memory ); /* q_input_buff */ - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_inp32 = q_input_buff[n]; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->q_old_inp32 = q_input_buff[n]; move16(); } } @@ -560,7 +588,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( IF( st_ivas->nSCE ) { Copy32( input_buff_fx[0], st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, len_inp_memory ); /* q_input_buff */ - st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 = q_input_buff[0]; + // st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 = q_input_buff[0]; + st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32 = q_input_buff[0]; + move16(); move16(); } @@ -569,7 +599,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { Copy32( input_buff_fx[n + 1], st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, len_inp_memory ); /* q_input_buff */ - st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 = q_input_buff[n + 1]; + // st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 = q_input_buff[n + 1]; + st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32 = q_input_buff[n + 1]; + move16(); move16(); } } @@ -579,7 +611,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { IF( NE_16( input_frame, len_inp_memory ) ) { - Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp = 0; move16(); Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx + sub( len_inp_memory, input_frame ), st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx + sub( len_inp_memory, input_frame ), sub( len_inp_memory, input_frame ), sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) @@ -588,7 +620,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( } ELSE { - Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hSCE[0]->hCoreCoder[0]->input_buff32_fx, st_ivas->hSCE[0]->hCoreCoder[0]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hSCE[0]->hCoreCoder[0]->q_old_inp = 0; move16(); } @@ -600,7 +632,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( { IF( NE_16( input_frame, len_inp_memory ) ) { - Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp = 0; move16(); @@ -610,7 +642,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( } ELSE { - Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_inp32 ) ); // Q(q_data_fx) -> Q(q_input) + Copy_Scale_sig32_16( st_ivas->hCPE[0]->hCoreCoder[n]->input_buff32_fx, st_ivas->hCPE[0]->hCoreCoder[n]->input_buff_fx, len_inp_memory, sub( add( Q16, 0 ), st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp32 ) ); // Q(q_data_fx) -> Q(q_input) st_ivas->hCPE[0]->hCoreCoder[n]->q_old_inp = 0; move16(); } diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index d020b398a..19a850a89 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -113,7 +113,9 @@ ivas_error ivas_cpe_enc_fx( Word32 band_energies_LR_fx[2 * NB_BANDS]; /* energy in critical bands without minimum noise floor E_MIN (Q_buffer + QSCALE - band_ener_guardbits) */ Word16 Q_buffer[2]; Word16 orig_input_fx[CPE_CHANNELS][L_FRAME48k]; + Word32 orig_input_fx32[CPE_CHANNELS][L_FRAME48k]; Word16 Q_orig_inp[CPE_CHANNELS]; + Word16 Q_orig_inp32[CPE_CHANNELS]; Word16 Etot_last_fx[CPE_CHANNELS]; Word32 tmp, input_Fs; Word16 max_bwidth, ivas_format; @@ -127,7 +129,7 @@ ivas_error ivas_cpe_enc_fx( Word16 e_old_wsp[CPE_CHANNELS], q_old_wsp; move16(); // Q_new move16(); // Q_new - Word16 q_com; + Word16 q_com, shift, q_min, gb; error = IVAS_ERR_OK; move32(); @@ -217,27 +219,32 @@ ivas_error ivas_cpe_enc_fx( #endif } - Word16 Q_min = s_min( q_data_fx, add( sts[0]->q_inp32, L_norm_arr( sts[0]->input32_fx - input_frame, input_frame ) ) ); - scale_sig32( sts[0]->input32_fx - input_frame, input_frame, sub( Q_min, sts[0]->q_inp32 ) ); + Word16 norm, Q_min = s_min( q_data_fx, add( sts[0]->q_old_inp32, L_norm_arr( sts[0]->input32_fx - input_frame, input_frame ) ) ); + norm = L_norm_arr( data_fx_ch0, input_frame ); + IF( data_fx_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ + { + Q_min = s_min( Q_min, add( sts[1]->q_old_inp32, L_norm_arr( sts[1]->input32_fx - input_frame, input_frame ) ) ); + norm = s_min( norm, L_norm_arr( data_fx_ch1, input_frame ) ); + } + scale_sig32( sts[0]->input32_fx - input_frame, input_frame, sub( Q_min, sts[0]->q_old_inp32 ) ); + sts[0]->q_old_inp32 = Q_min; + move16(); Copy_Scale_sig32( data_fx_ch0, sts[0]->input32_fx, input_frame, sub( Q_min, q_data_fx ) ); // Q(Q_min) sts[0]->q_inp32 = Q_min; move16(); - Word16 norm = L_norm_arr( sts[0]->input32_fx, input_frame ); - Copy_Scale_sig32_16( sts[0]->input32_fx, sts[0]->input_fx, input_frame, norm ); sts[0]->q_inp = add( sub( sts[0]->q_inp32, Q16 ), norm ); move16(); IF( data_fx_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ { - Q_min = s_min( q_data_fx, add( sts[1]->q_inp32, L_norm_arr( sts[1]->input32_fx - input_frame, input_frame ) ) ); - scale_sig32( sts[1]->input32_fx - input_frame, input_frame, sub( Q_min, sts[1]->q_inp32 ) ); + scale_sig32( sts[1]->input32_fx - input_frame, input_frame, sub( Q_min, sts[1]->q_old_inp32 ) ); + sts[1]->q_old_inp32 = Q_min; + move16(); Copy_Scale_sig32( data_fx_ch1, sts[1]->input32_fx, input_frame, sub( Q_min, q_data_fx ) ); // Q(Q_min) sts[1]->q_inp32 = Q_min; move16(); - norm = L_norm_arr( sts[1]->input32_fx, input_frame ); - Copy_Scale_sig32_16( sts[1]->input32_fx, sts[1]->input_fx, input_frame, norm ); sts[1]->q_inp = add( sub( sts[1]->q_inp32, Q16 ), norm ); move16(); @@ -297,8 +304,8 @@ ivas_error ivas_cpe_enc_fx( } FOR( n = 0; n < CPE_CHANNELS; n++ ) { - Scale_sig( sts[n]->input_fx, input_frame, sub( scale_inp, sts[n]->q_inp ) ); - Scale_sig( hCPE->hFrontVad[n]->mem_decim_fx, 2 * L_FILT_MAX, sub( scale_inp, hCPE->hFrontVad[n]->q_mem_decim ) ); + scale_sig( sts[n]->input_fx, input_frame, sub( scale_inp, sts[n]->q_inp ) ); + scale_sig( hCPE->hFrontVad[n]->mem_decim_fx, 2 * L_FILT_MAX, sub( scale_inp, hCPE->hFrontVad[n]->q_mem_decim ) ); sts[n]->q_inp = scale_inp; move16(); hCPE->hFrontVad[n]->q_mem_decim = scale_inp; @@ -382,53 +389,44 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * Resets/updates in case of stereo switching *----------------------------------------------------------------*/ - Word16 shift = norm_arr( sts[1]->old_input_signal_fx, input_frame ); - Scale_sig( sts[1]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */ - sts[1]->q_old_inp = add( sts[1]->q_old_inp, shift ); - move16(); - shift = norm_arr( sts[1]->input_fx, input_frame ); - Scale_sig( sts[1]->input_fx, input_frame, shift ); /* sts[1]->q_inp + shift */ - sts[1]->q_inp = add( sts[1]->q_inp, shift ); - move16(); - - shift = norm_arr( sts[0]->old_input_signal_fx, input_frame ); - Scale_sig( sts[0]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */ - sts[0]->q_old_inp = add( sts[0]->q_old_inp, shift ); - move16(); - shift = norm_arr( sts[0]->input_fx, input_frame ); - Scale_sig( sts[0]->input_fx, input_frame, shift ); /* sts[1]->q_inp, shift */ - sts[0]->q_inp = add( sts[0]->q_inp, shift ); - move16(); - - Word16 q_inp = s_min( s_min( sts[0]->q_inp, sts[0]->q_old_inp ), s_min( sts[1]->q_inp, sts[1]->q_old_inp ) ); - - Scale_sig( sts[1]->input_fx, input_frame, sub( q_inp, sts[1]->q_inp ) ); /* q_inp */ - Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( q_inp, sts[1]->q_old_inp ) ); /* q_inp */ - sts[1]->q_inp = q_inp; - sts[1]->q_old_inp = q_inp; - move16(); - move16(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) + { + gb = find_guarded_bits_fx( sts[0]->encoderLookahead_FB ); + shift = L_norm_arr( sts[1]->old_input_signal32_fx, shl( input_frame, 1 ) ); + shift = s_min( shift, L_norm_arr( sts[0]->old_input_signal32_fx, shl( input_frame, 1 ) ) ); + + IF( LT_16( shift, gb ) ) + { + shift = sub( shift, gb ); + scale_sig32( sts[1]->input32_fx, input_frame, shift ); /* q_inp32 + shift */ + scale_sig32( sts[0]->input32_fx, input_frame, shift ); /* q_inp32 + shift */ + scale_sig32( sts[1]->old_input_signal32_fx, input_frame, shift ); /* q_old_inp32 + shift */ + scale_sig32( sts[0]->old_input_signal32_fx, input_frame, shift ); /* q_old_inp32 + shift */ + sts[1]->q_inp32 = add( sts[1]->q_inp32, shift ); + sts[0]->q_inp32 = add( sts[0]->q_inp32, shift ); + sts[1]->q_old_inp32 = add( sts[1]->q_old_inp32, shift ); + sts[0]->q_old_inp32 = add( sts[0]->q_old_inp32, shift ); + move16(); + move16(); + move16(); + move16(); + } + } - Scale_sig( sts[0]->input_fx, input_frame, sub( q_inp, sts[0]->q_inp ) ); /* q_inp */ - Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( q_inp, sts[0]->q_old_inp ) ); /* q_inp */ - sts[0]->q_inp = q_inp; - move16(); - sts[0]->q_old_inp = q_inp; - move16(); - Scale_sig( sts[0]->buf_speech_enc, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k, sub( q_inp, sub( Q15, sts[0]->exp_buf_speech_enc ) ) ); // q_inp - sts[0]->exp_buf_speech_enc = sub( Q15, q_inp ); - move16(); - stereo_switching_enc_fx( hCPE, sts[0]->old_input_signal_fx, input_frame, q_inp ); + stereo_switching_enc_fx( hCPE, sts[0]->old_input_signal32_fx, input_frame, sts[0]->q_old_inp32 ); /*----------------------------------------------------------------* * Temporal inter-channel alignment, stereo adjustment *----------------------------------------------------------------*/ - - Copy_Scale_sig_16_32_DEPREC( sts[0]->input_buff_fx, sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), Q6 ); /* Q6 + sts[0]->q_inp */ - sts[0]->q_inp32 = add( Q6, sts[0]->q_inp ); + shift = s_min( L_norm_arr( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ), L_norm_arr( sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ) ); + q_min = add( sts[0]->q_inp32, sub( shift, find_guarded_bits_fx( input_frame ) ) ); + scale_sig32( sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( q_min, sts[1]->q_inp32 ) ); /* q_min */ + scale_sig32( sts[0]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), sub( q_min, sts[0]->q_inp32 ) ); /* q_min */ + sts[0]->q_inp32 = sts[1]->q_inp32 = sts[0]->q_old_inp32 = sts[1]->q_old_inp32 = q_min; + move16(); + move16(); move16(); - Copy_Scale_sig_16_32_DEPREC( sts[1]->input_buff_fx, sts[1]->input_buff32_fx, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), Q6 ); /* Q6 + sts[0]->q_inp */ - sts[1]->q_inp32 = add( Q6, sts[1]->q_inp ); move16(); stereo_tca_enc_fx( hCPE, input_frame ); @@ -449,9 +447,12 @@ ivas_error ivas_cpe_enc_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { + Copy32( sts[n]->input32_fx, orig_input_fx32[n], input_frame ); /* sts->q_inp32 */ Copy( sts[n]->input_fx, orig_input_fx[n], input_frame ); /* sts->q_inp */ Scale_sig( orig_input_fx[n], input_frame, sub( -1, sts[n]->q_inp ) ); // Q(-1) Q_orig_inp[n] = -1; + Q_orig_inp32[n] = sts[n]->q_inp32; + move16(); move16(); IF( hCPE->hStereoICBWE != NULL ) @@ -633,10 +634,8 @@ ivas_error ivas_cpe_enc_fx( * Stereo processing * Stereo down-mix *----------------------------------------------------------------*/ - // printf("\n%f %f ", hCPE->hStereoClassif->is_speech, hCPE->hCoreCoder[0]->hSpMusClas->past_dlp[0]); IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - /*flt2fix: dft_synthesize*/ test(); if ( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET] ) { @@ -657,7 +656,7 @@ ivas_error ivas_cpe_enc_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { q_com = sub( add( L_norm_arr( sts[n]->input32_fx, input_frame ), sts[n]->q_inp32 ), 16 ); - q_com = s_min( q_com, add( norm_arr( sts[n]->old_input_signal_fx, input_frame ), sts[n]->q_old_inp ) ); + q_com = s_min( q_com, sub( add( L_norm_arr( sts[n]->old_input_signal32_fx, input_frame ), sts[n]->q_old_inp32 ), 16 ) ); q_com = s_min( q_com, add( norm_arr( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl ), hCPE->q_input_mem[n] ) ); if ( EQ_16( q_com, Q15 ) ) @@ -670,7 +669,7 @@ ivas_error ivas_cpe_enc_fx( sts[n]->q_inp = q_com; move16(); - scale_sig( sts[n]->old_input_signal_fx, input_frame, sub( q_com, sts[n]->q_old_inp ) ); + Copy_Scale_sig_32_16( sts[n]->old_input_signal32_fx, sts[n]->old_input_signal_fx, input_frame, sub( q_com, sts[n]->q_old_inp32 ) ); sts[n]->q_old_inp = q_com; move16(); @@ -754,29 +753,32 @@ ivas_error ivas_cpe_enc_fx( sts[1]->exp_old_inp_12k8 = Q15; move16(); } - } - test(); - IF( hCPE->hStereoMdct != NULL && hCPE->hStereoMdct->hItd != NULL ) - { - Word16 q_min; + q_min = sts[1]->q_old_inp; move16(); q_min = s_min( q_min, sts[1]->q_inp ); q_min = s_min( q_min, sts[0]->q_old_inp ); q_min = s_min( q_min, sts[0]->q_inp ); + q_min = s_min( q_min, hCPE->q_input_mem[0] ); + q_min = s_min( q_min, hCPE->q_input_mem[1] ); shift = norm_arr( sts[1]->old_input_signal_fx, input_frame ); shift = s_min( shift, norm_arr( sts[1]->input_fx, input_frame ) ); shift = s_min( shift, norm_arr( sts[0]->old_input_signal_fx, input_frame ) ); shift = s_min( shift, norm_arr( sts[0]->input_fx, input_frame ) ); + shift = s_min( shift, norm_arr( hCPE->input_mem_fx[0], hCPE->hStereoMdct->hDft_ana->dft_ovl ) ); + shift = s_min( shift, norm_arr( hCPE->input_mem_fx[1], hCPE->hStereoMdct->hDft_ana->dft_ovl ) ); q_min = add( q_min, shift ); - scale_sig( sts[1]->input_fx, input_frame, sub( q_min, sts[1]->q_inp ) ); /* q_min */ - scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( q_min, sts[1]->q_old_inp ) ); /* q_min */ - scale_sig( sts[0]->input_fx, input_frame, sub( q_min, sts[0]->q_inp ) ); /* q_min */ - scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( q_min, sts[0]->q_old_inp ) ); /* q_min */ - + scale_sig( sts[1]->input_fx, input_frame, sub( q_min, sts[1]->q_inp ) ); /* q_min */ + scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( q_min, sts[1]->q_old_inp ) ); /* q_min */ + scale_sig( sts[0]->input_fx, input_frame, sub( q_min, sts[0]->q_inp ) ); /* q_min */ + scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( q_min, sts[0]->q_old_inp ) ); /* q_min */ + scale_sig( hCPE->input_mem_fx[0], hCPE->hStereoMdct->hDft_ana->dft_ovl, sub( q_min, hCPE->q_input_mem[0] ) ); /* q_min */ + scale_sig( hCPE->input_mem_fx[1], hCPE->hStereoMdct->hDft_ana->dft_ovl, sub( q_min, hCPE->q_input_mem[1] ) ); /* q_min */ + hCPE->q_input_mem[1] = q_min; + hCPE->q_input_mem[0] = q_min; sts[1]->q_old_inp = q_min; sts[0]->q_old_inp = q_min; sts[1]->q_inp = q_min; @@ -785,12 +787,11 @@ ivas_error ivas_cpe_enc_fx( move16(); move16(); move16(); + move16(); + move16(); } stereo_td_itd_mdct_stereo_fx( hCPE, vad_flag_dtx, vad_hover_flag, input_frame ); - - Copy_Scale_sig_16_32_no_sat( sts[0]->input_fx - input_frame, sts[0]->input32_fx - input_frame, shl( input_frame, 1 ), sub( sts[0]->q_inp32, sts[0]->q_inp ) ); - Copy_Scale_sig_16_32_no_sat( sts[1]->input_fx - input_frame, sts[1]->input32_fx - input_frame, shl( input_frame, 1 ), sub( sts[1]->q_inp32, sts[1]->q_inp ) ); } /*----------------------------------------------------------------* @@ -816,30 +817,28 @@ ivas_error ivas_cpe_enc_fx( Word16 out_16k_start_ind = 0, out_16k_end_ind = 0; move16(); move16(); + stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, sts[0]->input32_fx, &out_start_ind, &out_end_ind, 0, input_Fs, input_Fs, 0, NULL ); - Scale_sig32( sts[0]->input32_fx - input_frame, add( out_start_ind, input_frame ), sub( Q15, sts[0]->q_inp32 ) ); // scaling initial part of the input buffer + + scale_sig32( sts[0]->input32_fx - input_frame, add( out_start_ind, input_frame ), sub( Q15, sts[0]->q_old_inp32 ) ); // scaling initial part of the input buffer + scale_sig32( sts[0]->input32_fx + out_end_ind, sub( input_frame, out_end_ind ), sub( Q15, sts[0]->q_inp32 ) ); // scaling initial part of the input buffer sts[0]->q_inp32 = Q15; + sts[0]->q_old_inp32 = Q15; move16(); - - // Normalise the input buffer from Q15 - Word16 input_norm, q_inp32, common_q, fir_delay_len; - input_norm = L_norm_arr( sts[0]->input32_fx + out_start_ind, sub( out_end_ind, out_start_ind ) ); - q_inp32 = add( Q15, input_norm ); - fir_delay_len = NS2SA_FX2( sts[0]->input_Fs, DELAY_FIR_RESAMPL_NS ); move16(); - // Find common Q-factor between { q_inp, q_old_inp and q_inp32-16 } - common_q = s_min( s_min( sub( q_inp32, 16 ), sts[0]->q_inp ), sts[0]->q_old_inp ); + // Normalise the input buffer from Q15 + Word16 input_norm, q_inp; //, common_q, fir_delay_len; + input_norm = L_norm_arr( sts[0]->input32_fx - input_frame, shl( input_frame, 1 ) ); + q_inp = sub( add( Q15, input_norm ), 16 ); // Rescale the old input, input and FIR delay section of input buffer - scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( common_q, sts[0]->q_old_inp ) ); // q_old_inp -> common_q - Copy_Scale_sig32_16( sts[0]->input32_fx + out_start_ind, sts[0]->input_fx + out_start_ind, sub( out_end_ind, out_start_ind ), sub( add( Q16, common_q ), Q15 ) ); // Q15 -> common_q - scale_sig( sts[0]->input_fx + out_end_ind, add( sub( input_frame, out_end_ind ), fir_delay_len ), sub( common_q, sts[0]->q_inp ) ); // q_inp -> common_q + Copy_Scale_sig32_16( sts[0]->input32_fx - input_frame, sts[0]->input_fx - input_frame, shl( input_frame, 1 ), sub( add( Q16, q_inp ), Q15 ) ); // Q15 -> q_inp // Update the Q-factors - sts[0]->q_inp = common_q; + sts[0]->q_inp = q_inp; move16(); - sts[0]->q_old_inp = common_q; + sts[0]->q_old_inp = q_inp; move16(); /* iDFT & resampling to 12.8kHz internal sampling rate */ @@ -849,7 +848,7 @@ ivas_error ivas_cpe_enc_fx( /* iDFT & resampling to 16kHz internal sampling rate for M channel */ IF( EQ_32( input_Fs, internal_Fs ) ) { - Copy32( sts[0]->input32_fx - STEREO_DFT_OVL_16k, old_inp_16k_fx[0] + L_INP_MEM - STEREO_DFT_OVL_16k, add( input_frame, STEREO_DFT_OVL_16k ) ); /* Q_inp */ + Copy32( sts[0]->input32_fx - STEREO_DFT_OVL_16k, old_inp_16k_fx[0] + L_INP_MEM - STEREO_DFT_OVL_16k, add( input_frame, STEREO_DFT_OVL_16k ) ); /* sts[0]->q_inp32 */ out_16k_start_ind = -STEREO_DFT_OVL_16k; out_16k_end_ind = add( out_16k_start_ind, add( input_frame, STEREO_DFT_OVL_16k ) ); move16(); @@ -1225,12 +1224,12 @@ ivas_error ivas_cpe_enc_fx( /* update input samples buffer */ FOR( n = 0; n < CPE_CHANNELS; n++ ) { + Copy32( orig_input_fx32[n], sts[n]->old_input_signal32_fx, input_frame ); /* Q_orig_inp32 */ + sts[n]->q_old_inp32 = Q_orig_inp32[n]; + move16(); Copy( orig_input_fx[n], sts[n]->old_input_signal_fx, input_frame ); /* Q_orig_inp */ sts[n]->q_old_inp = Q_orig_inp[n]; move16(); - Copy_Scale_sig_16_32_no_sat( sts[n]->input_fx - input_frame, sts[n]->input32_fx - input_frame, input_frame, 16 ); // duplicating the data for input32_fx - sts[n]->q_inp32 = add( Q_orig_inp[n], 16 ); - move16(); } } ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) @@ -1238,7 +1237,9 @@ ivas_error ivas_cpe_enc_fx( Copy( sts[0]->input_fx, sts[0]->old_input_signal_fx, input_frame ); /* sts[n]->q_inp */ sts[0]->q_old_inp = sts[0]->q_inp; move16(); - Copy32( sts[0]->input32_fx, sts[0]->input32_fx - input_frame, input_frame ); /* st->q_inp32 */ + Copy32( sts[0]->input32_fx, sts[0]->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + sts[0]->q_old_inp32 = sts[0]->q_inp32; + move16(); } ELSE IF( st_ivas->hMCT == NULL ) /* note: in MCT, input buffers are updated later in ivas_mct_enc() */ { @@ -1248,7 +1249,9 @@ ivas_error ivas_cpe_enc_fx( Copy( sts[n]->input_fx, sts[n]->old_input_signal_fx, input_frame ); /* sts[n]->q_inp */ sts[n]->q_old_inp = sts[n]->q_inp; move16(); - Copy32( sts[n]->input32_fx, sts[n]->input32_fx - input_frame, input_frame ); /* st->q_inp32 */ + Copy32( sts[n]->input32_fx, sts[n]->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + sts[n]->q_old_inp32 = sts[n]->q_inp32; + move16(); } } diff --git a/lib_enc/ivas_ism_enc_fx.c b/lib_enc/ivas_ism_enc_fx.c index 81c9e01ef..122ea1d75 100644 --- a/lib_enc/ivas_ism_enc_fx.c +++ b/lib_enc/ivas_ism_enc_fx.c @@ -167,6 +167,8 @@ ivas_error ivas_ism_enc_fx( *-----------------------------------------------------------------*/ Word16 Q_min = s_min( q_data, add( st->q_inp32, L_norm_arr( st->input32_fx - input_frame, input_frame ) ) ); scale_sig32( st->input32_fx - input_frame, input_frame, sub( Q_min, st->q_inp32 ) ); + st->q_old_inp32 = Q_min; + move16(); Copy_Scale_sig32( data[sce_id], st->input32_fx, input_frame, sub( Q_min, q_data ) ); // Q(Q_min) st->q_inp32 = Q_min; move16(); @@ -474,7 +476,9 @@ ivas_error ivas_ism_enc_fx( Copy( st->input_fx, st->old_input_signal_fx, input_frame ); /* st->q_inp */ st->q_old_inp = st->q_inp; move16(); - Copy32( st->input32_fx, st->input32_fx - input_frame, input_frame ); /* st->q_inp32 */ + Copy32( st->input32_fx, st->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + st->q_old_inp32 = st->q_inp32; + move16(); hSCE->last_element_brate = hSCE->element_brate; /* Q0 */ move32(); diff --git a/lib_enc/ivas_mct_enc_fx.c b/lib_enc/ivas_mct_enc_fx.c index 56f5e44db..ee9353379 100644 --- a/lib_enc/ivas_mct_enc_fx.c +++ b/lib_enc/ivas_mct_enc_fx.c @@ -484,6 +484,9 @@ ivas_error ivas_mct_enc_fx( Copy( hCPE->hCoreCoder[n]->input_fx, hCPE->hCoreCoder[n]->old_input_signal_fx, input_frame ); hCPE->hCoreCoder[n]->q_old_inp = hCPE->hCoreCoder[n]->q_inp; move16(); + Copy32( hCPE->hCoreCoder[n]->input32_fx, hCPE->hCoreCoder[n]->old_input_signal32_fx, input_frame ); + hCPE->hCoreCoder[n]->q_old_inp32 = hCPE->hCoreCoder[n]->q_inp32; + move16(); /* common encoder updates */ updt_enc_common_ivas_fx( hCPE->hCoreCoder[n], Q_new_out[cpe_id][n] ); diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c index a578a3cfa..f0811aea6 100644 --- a/lib_enc/ivas_sce_enc_fx.c +++ b/lib_enc/ivas_sce_enc_fx.c @@ -124,6 +124,8 @@ ivas_error ivas_sce_enc_fx( Word16 Q_min = s_min( q_data_fx, add( st->q_inp32, L_norm_arr( st->input32_fx - input_frame, input_frame ) ) ); scale_sig32( st->input32_fx - input_frame, input_frame, sub( Q_min, st->q_inp32 ) ); + st->q_old_inp32 = Q_min; + move16(); Copy_Scale_sig32( data_fx, st->input32_fx, input_frame, sub( Q_min, q_data_fx ) ); // Q(Q_min) st->q_inp32 = Q_min; move16(); @@ -366,7 +368,9 @@ ivas_error ivas_sce_enc_fx( Copy( st->input_fx, st->old_input_signal_fx, input_frame ); st->q_old_inp = st->q_inp; move16(); - Copy32( st->input32_fx, st->input32_fx - input_frame, input_frame ); /* st->q_inp32 */ + Copy32( st->input32_fx, st->old_input_signal32_fx, input_frame ); /* st->q_inp32 */ + st->q_old_inp32 = st->q_inp32; + move16(); hSCE->last_element_brate = hSCE->element_brate; move32(); diff --git a/lib_enc/ivas_stereo_dft_enc_fx.c b/lib_enc/ivas_stereo_dft_enc_fx.c index 6406158b4..80c4b5a21 100644 --- a/lib_enc/ivas_stereo_dft_enc_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_fx.c @@ -1030,7 +1030,7 @@ void stereo_dft_enc_analyze_fx( FOR( n = 0; n < n_channels; n++ ) { - Scale_sig( &mem[n][0], dft_ovl, sts[n]->q_inp - q_input_mem[n] ); // Q(sts[n]->q_inp) + Scale_sig( &mem[n][0], dft_ovl, sub( sts[n]->q_inp, q_input_mem[n] ) ); // Q(sts[n]->q_inp) q_input_mem[n] = sts[n]->q_inp; move16(); } @@ -1115,8 +1115,7 @@ void stereo_dft_enc_analyze_fx( Word32 stereo_dft_enc_synthesize_fx( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ - // float *output, /* o : output synthesis */ - Word32 *output_fx, /* o : output synthesis Q15 */ + Word32 *output_fx, /* o : output synthesis Q15 */ Word16 *output_start_index, Word16 *output_end_index, const Word16 chan, /* i : channel number */ @@ -1126,25 +1125,18 @@ Word32 stereo_dft_enc_synthesize_fx( Word16 *nrg_out_fx_e ) { Word16 i, j, sign; - // float *pDFT_in; Word32 *pDFT_in_fx; Word16 DFT_in_fx_e; Word16 offset, NFFT, N, ovl, zp; Word16 temp_exp; - // float fac; Word32 fac_fx; - // float *mem; Word32 *mem_fx; - // const float *trigo, *win, *win_ana; const Word16 *trigo_fx; const Word32 *win_fx; const Word16 *win_ana_fx; - // float tmp[STEREO_DFT_N_MAX_ENC]; Word32 tmp_fx[STEREO_DFT_N_MAX_ENC]; - // float nrg; Word32 nrg_fx; Word16 nrg_fx_e; - // float trigo_enc[STEREO_DFT_N_MAX_ENC / 2 + 1]; Word16 trigo_enc_fx[STEREO_DFT_N_MAX_ENC / 2 + 1]; Word16 trigo_step; Word16 scal_fac; diff --git a/lib_enc/ivas_stereo_dft_td_itd_fx.c b/lib_enc/ivas_stereo_dft_td_itd_fx.c index c457faa4f..309ec3377 100644 --- a/lib_enc/ivas_stereo_dft_td_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_td_itd_fx.c @@ -499,8 +499,8 @@ void stereo_td_itd_fx( Copy( shift_input, sts[ch]->input_fx, input_frame ); sts[ch]->q_inp = q_new_shift; move16(); - /*sts[ch]->q_old_inp = q_new_shift; - move16();*/ + Copy_Scale_sig_16_32_no_sat( sts[ch]->input_fx, sts[ch]->input32_fx, input_frame, sub( sts[ch]->q_inp32, sts[ch]->q_inp ) ); + IF( EQ_16( sts[0]->element_mode, IVAS_CPE_DFT ) ) { // here shift_mem has same as input_mem, no need to update q // @@ -512,6 +512,7 @@ void stereo_td_itd_fx( sts[ch]->q_old_inp = q_new_shift; move16(); Scale_sig( mdct_mem[ch], input_frame, sub( sts[ch]->q_inp, q_shift_mem ) ); // Q(sts[ch]->q_inp) + Copy_Scale_sig_16_32_no_sat( shift_mem, sts[ch]->old_input_signal32_fx, input_frame, sub( sts[ch]->q_old_inp32, q_shift_mem ) ); } } } @@ -531,7 +532,7 @@ void stereo_td_itd_mdct_stereo_fx( const Word16 input_frame /* i : frame length */ ) { - Word16 i, n, q_com; + Word16 i; Word32 bin_nrgL_fx[STEREO_DFT_N_32k_ENC]; Word16 bin_nrgL_e[STEREO_DFT_N_32k_ENC]; Word32 bin_nrgR_fx[STEREO_DFT_N_32k_ENC]; @@ -575,37 +576,6 @@ void stereo_td_itd_mdct_stereo_fx( /*call ITD function*/ stereo_dft_enc_compute_itd_fx( hCPE, DFT_fx[0], DFT_tmp_e[0], DFT_fx[1], DFT_tmp_e[1], STEREO_DFT_OFFSET, input_frame, vad_flag_dtx, vad_hover_flag, bin_nrgL_fx, bin_nrgL_e, bin_nrgR_fx, bin_nrgR_e ); - q_com = MAX_16; - move16(); - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - q_com = s_min( q_com, add( norm_arr( hCPE->hCoreCoder[n]->input_fx, input_frame ), hCPE->hCoreCoder[n]->q_inp ) ); - q_com = s_min( q_com, add( norm_arr( hCPE->hCoreCoder[n]->old_input_signal_fx, input_frame ), hCPE->hCoreCoder[n]->q_old_inp ) ); - q_com = s_min( q_com, add( norm_arr( hCPE->input_mem_fx[n], hStereoMdct->hDft_ana->dft_ovl ), hCPE->q_input_mem[n] ) ); - - if ( EQ_16( q_com, Q15 ) ) - { - q_com = 0; - move16(); - } - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - scale_sig( hCPE->hCoreCoder[n]->input_fx, input_frame, sub( q_com, hCPE->hCoreCoder[n]->q_inp ) ); - hCPE->hCoreCoder[n]->q_inp = q_com; - move16(); - - scale_sig( hCPE->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( q_com, hCPE->hCoreCoder[n]->q_old_inp ) ); - hCPE->hCoreCoder[n]->q_old_inp = q_com; - move16(); - - scale_sig( hCPE->input_mem_fx[n], hStereoMdct->hDft_ana->dft_ovl, sub( q_com, hCPE->q_input_mem[n] ) ); - hCPE->q_input_mem[n] = q_com; - move16(); - } - /* Time Domain ITD compensation using extrapolation */ stereo_td_itd_fx( hStereoMdct->hItd, NULL, NULL, 1, hStereoMdct->hDft_ana->dft_ovl, hCPE->hCoreCoder, input_frame, hCPE->input_mem_fx, hCPE->q_input_mem ); } diff --git a/lib_enc/ivas_stereo_ica_enc_fx.c b/lib_enc/ivas_stereo_ica_enc_fx.c index 6057ace6b..d0252a1f1 100644 --- a/lib_enc/ivas_stereo_ica_enc_fx.c +++ b/lib_enc/ivas_stereo_ica_enc_fx.c @@ -2088,6 +2088,10 @@ void stereo_tca_enc_fx( move16(); sts[1]->q_inp32 = sub( sts[1]->q_inp32, 2 ); move16(); + sts[0]->q_old_inp32 = sub( sts[0]->q_old_inp32, 2 ); + move16(); + sts[1]->q_old_inp32 = sub( sts[1]->q_old_inp32, 2 ); + move16(); } /* update L/R DS memories */ @@ -2319,17 +2323,17 @@ static void unclr_calc_corr_features_fx( move32(); } - hStereoClassif->unclr_fv_fx[E_corrEst0] = L_shl( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->unclr_fv_fx[E_corrEst0] = L_shl_sat( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->unclr_fv_fx[E_corrEstMax] = L_shl( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->unclr_fv_fx[E_corrEstMax] = L_shl_sat( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->unclr_fv_fx[E_corrLagMax] = L_shl( corrLagMax, 15 ); /* Q15 */ + hStereoClassif->unclr_fv_fx[E_corrLagMax] = L_shl_sat( corrLagMax, 15 ); /* Q15 */ move32(); - hStereoClassif->xtalk_fv_fx[E_corrEst0] = L_shl( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->xtalk_fv_fx[E_corrEst0] = L_shl_sat( corrEst[abs_s( lagSearchRange[0] )], sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->xtalk_fv_fx[E_corrEstMax] = L_shl( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ + hStereoClassif->xtalk_fv_fx[E_corrEstMax] = L_shl_sat( corrEstMax, sub( corrEst_exp, 16 ) ); /* Q15 */ move32(); - hStereoClassif->xtalk_fv_fx[E_corrLagMax] = L_shl( corrLagMax, 15 ); /* Q15 */ + hStereoClassif->xtalk_fv_fx[E_corrLagMax] = L_shl_sat( corrLagMax, 15 ); /* Q15 */ move32(); /* L/M and R/M correlation */ diff --git a/lib_enc/ivas_stereo_switching_enc_fx.c b/lib_enc/ivas_stereo_switching_enc_fx.c index 5f1208ba7..8e372b311 100644 --- a/lib_enc/ivas_stereo_switching_enc_fx.c +++ b/lib_enc/ivas_stereo_switching_enc_fx.c @@ -628,23 +628,6 @@ ivas_error stereo_memory_enc_fx( return error; } -static void v_multc_fixed_32_16( - const Word16 x[], /* i : Input vector Qx*/ - const Word32 c, /* i : Constant Q31*/ - Word32 y[], /* o : Output vector that contains c*x Qx*/ - const Word16 N /* i : Vector length Q0*/ -) -{ - Word16 i; - - FOR( i = 0; i < N; i++ ) - { - y[i] = Mpy_32_16_1( c, x[i] ); /* Q16+Qx */ - move32(); - } - - return; -} /*-------------------------------------------------------------------* * Function stereo_switching_enc() * @@ -653,7 +636,7 @@ static void v_multc_fixed_32_16( void stereo_switching_enc_fx( CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word16 old_input_signal_pri[], /* i : old input signal of primary channel q_inp*/ + Word32 old_input_signal_pri[], /* i : old input signal of primary channel q_inp*/ const Word16 input_frame, /* i : input frame length Q0*/ const Word16 q_inp ) { @@ -672,8 +655,8 @@ void stereo_switching_enc_fx( { FOR( n = 0; n < CPE_CHANNELS; n++ ) { - Copy( sts[n]->input_fx + input_frame - dft_ovl, hCPE->input_mem_fx[n], dft_ovl ); /* sts[n]->q_inp */ - hCPE->q_input_mem[n] = sts[n]->q_inp; + Copy_Scale_sig32_16( sts[n]->input32_fx + input_frame - dft_ovl, hCPE->input_mem_fx[n], dft_ovl, 0 ); /* sts[n]->q_inp32 - 16*/ + hCPE->q_input_mem[n] = sub( sts[n]->q_inp32, 16 ); move16(); } } @@ -681,9 +664,9 @@ void stereo_switching_enc_fx( /* save original stereo input (MDCT overlap part) for both channels in unused old input of right channel for possible DFT->MDCT transition */ IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { - Copy( sts[0]->input_fx + sub( (Word16) Mpy_32_32( sts[0]->input_Fs, 42949673 /* 1/50 in Q31*/ ), sts[0]->encoderLookahead_FB ), sts[1]->input_fx - shl( sts[0]->encoderLookahead_FB, 1 ), sts[0]->encoderLookahead_FB ); /* sts[0]->q_inp */ + Copy32( sts[0]->input32_fx + sub( extract_l( Mpy_32_32( sts[0]->input_Fs, 42949673 /* 1/50 in Q31*/ ) ), sts[0]->encoderLookahead_FB ), sts[1]->input32_fx - shl( sts[0]->encoderLookahead_FB, 1 ), sts[0]->encoderLookahead_FB ); /* sts[0]->q_inp32 */ - Copy( sts[1]->input_fx + sub( (Word16) Mpy_32_32( sts[1]->input_Fs, 42949673 /* 1/50 in Q31*/ ), sts[1]->encoderLookahead_FB ), sts[1]->input_fx - sts[1]->encoderLookahead_FB, sts[1]->encoderLookahead_FB ); /* sts[1]->q_inp */ + Copy32( sts[1]->input32_fx + sub( extract_l( Mpy_32_32( sts[1]->input_Fs, 42949673 /* 1/50 in Q31*/ ) ), sts[1]->encoderLookahead_FB ), sts[1]->input32_fx - sts[1]->encoderLookahead_FB, sts[1]->encoderLookahead_FB ); /* sts[1]->q_inp32 */ } @@ -694,7 +677,7 @@ void stereo_switching_enc_fx( /* window DFT synthesis overlap memory @input_Fs, primary channel */ FOR( i = 0; i < dft_ovl; i++ ) { - hCPE->hStereoDft->output_mem_dmx_fx[i] = L_shr( Mpy_32_16_r( hCPE->hStereoDft->win_fx[dft_ovl - 1 - i], old_input_signal_pri[input_frame - dft_ovl + i] ), add( q_inp, 1 ) ); // Q31 + q_inp - Q15 - (q_inp + 1) -> Q15 + hCPE->hStereoDft->output_mem_dmx_fx[i] = L_shl( Mpy_32_32_r( hCPE->hStereoDft->win_fx[dft_ovl - 1 - i], old_input_signal_pri[input_frame - dft_ovl + i] ), sub( 15, q_inp ) ); // Q15 move32(); } /* reset 48kHz BWE overlap memory */ @@ -728,7 +711,7 @@ void stereo_switching_enc_fx( /* update DFT synthesis overlap memory @12.8kHz */ FOR( i = 0; i < STEREO_DFT_OVL_12k8; i++ ) { - hCPE->hStereoDft->output_mem_dmx_12k8_fx[i] = L_shr( Mpy_32_16_r( hCPE->hStereoDft->win_12k8_fx[STEREO_DFT_OVL_12k8 - 1 - i], sts[0]->buf_speech_enc[L_FRAME32k + L_FRAME - STEREO_DFT_OVL_12k8 + i] ), q_inp + 1 ); /* Q15 */ + hCPE->hStereoDft->output_mem_dmx_12k8_fx[i] = L_shr( Mpy_32_16_r( hCPE->hStereoDft->win_12k8_fx[STEREO_DFT_OVL_12k8 - 1 - i], sts[0]->buf_speech_enc[L_FRAME32k + L_FRAME - STEREO_DFT_OVL_12k8 + i] ), sub( 16, sts[0]->exp_buf_speech_enc ) ); /* Q15 */ move32(); } Word16 q_dmx = Q15; @@ -816,10 +799,10 @@ void stereo_switching_enc_fx( offset = sub( sts[0]->cldfbAnaEnc->p_filter_length, sts[0]->cldfbAnaEnc->no_channels ); /* Q0 */ FOR( i = 0; i < offset; i++ ) { - sts[0]->cldfbAnaEnc->cldfb_state_fx[i] = L_deposit_h( old_input_signal_pri[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i] ); /* Q16+q_inp */ + sts[0]->cldfbAnaEnc->cldfb_state_fx[i] = old_input_signal_pri[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i]; /* q_inp */ move32(); } - sts[0]->cldfbAnaEnc->Q_cldfb_state = add( Q16, q_inp ); + sts[0]->cldfbAnaEnc->Q_cldfb_state = q_inp; move16(); } @@ -838,18 +821,18 @@ void stereo_switching_enc_fx( test(); IF( hCPE->hStereoTD != NULL && EQ_16( hCPE->hStereoTD->tdm_last_ratio_idx, LRTD_STEREO_LEFT_IS_PRIM ) ) { - v_multc_fixed_32_16( hCPE->hCoreCoder[1]->old_input_signal_fx + sub( input_frame, add( offset, NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) ) ), -MAX_32, sts[1]->cldfbAnaEnc->cldfb_state_fx, offset ); /* Q16+q_inp */ - sts[1]->cldfbAnaEnc->Q_cldfb_state = add( Q16, q_inp ); + v_multc_fixed( hCPE->hCoreCoder[1]->old_input_signal32_fx + sub( input_frame, add( offset, NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) ) ), -MAX_32, sts[1]->cldfbAnaEnc->cldfb_state_fx, offset ); /* Q16+q_inp */ + sts[1]->cldfbAnaEnc->Q_cldfb_state = q_inp; move16(); } ELSE { FOR( i = 0; i < offset; i++ ) { - sts[1]->cldfbAnaEnc->cldfb_state_fx[i] = L_shr( L_deposit_h( hCPE->hCoreCoder[1]->old_input_signal_fx[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i] ), 5 ); /* Q11+q_inp */ + sts[1]->cldfbAnaEnc->cldfb_state_fx[i] = ( hCPE->hCoreCoder[1]->old_input_signal32_fx[input_frame - offset - NS2SA_FX2( L_mult0( input_frame, FRAMES_PER_SEC ), L_MEM_RECALC_TBE_NS ) + i] ); /* q_inp */ move32(); } - sts[1]->cldfbAnaEnc->Q_cldfb_state = add( Q16 - 5, q_inp ); + sts[1]->cldfbAnaEnc->Q_cldfb_state = q_inp; move16(); } @@ -929,9 +912,9 @@ void stereo_switching_enc_fx( tmp_fx = div_s( 64, shl( sts[0]->encoderLookahead_FB, Q6 ) ); /* Q15 */ FOR( i = 0; i < sts[0]->encoderLookahead_FB; i++ ) { - sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i] = L_shr( Mpy_32_16_1( L_add( Mpy_32_16_1( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), Mpy_32_16_1( sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ), 13 ); /* q_inp32+0-15+15-15-13 */ + sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i] = ( Mpy_32_16_1( L_add( imult3216( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), imult3216( sts[1]->input32_fx[-sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ) ); /* sts[0]->q_inp32 */ move32(); - sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i] = L_shr( Mpy_32_16_1( L_add( Mpy_32_16_1( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), Mpy_32_16_1( sts[1]->input32_fx[-2 * sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ), 13 ); /* q_inp32+0-15+15-15-13 */ + sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i] = ( Mpy_32_16_1( L_add( imult3216( sts[0]->input32_fx[-sts[0]->encoderLookahead_FB + i], sts[0]->encoderLookahead_FB - i ), imult3216( sts[1]->input32_fx[-2 * sts[0]->encoderLookahead_FB + i], i ) ), tmp_fx ) ); /* sts[0]->q_inp32 */ move32(); } /* restore continuous signal in right channel (part of old_output was used to store original left channel) */ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 4da0bff61..3d6f23dd3 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -1457,7 +1457,9 @@ typedef struct enc_core_structure Word16 q_inp32; Word16 q_inp; Word16 *old_input_signal_fx; + Word32 *old_input_signal32_fx; Word16 q_old_inp; + Word16 q_old_inp32; Word16 Q_old_wtda; SIGNAL_BUFFERS_ENC_HANDLE hSignalBuf; -- GitLab From 1315314d6dd10a3a78ae888cac411bf27d5ad0f3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 10:17:35 +0530 Subject: [PATCH 0521/1310] Fix for 3GPP issue 1548: MASA coherence codebook fixed point values Link #1548 --- lib_com/ivas_rom_com_fx.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index ffb18d6d2..e7ee30e8d 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1604,15 +1604,22 @@ const Word16 coherence_cb0_masa_Q14[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = // q = 21 const Word32 coherence_cb0_masa_fx[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = { - 100243, 534144, 1156579, 2068840, 2846464, 3531184, 4125936, 0, 253965, 864655, 1467377, - 2129448, 2977326, 3768791, 0, 0, 338480, 1189924, 2035915, 2872888, 3640026, 0, 0, 0, - 492621, 1532179, 2527278, 3470157, 0, 0, 0, 0, 499331, 1506803, 2465831, 3425697, 0, - 0, 0, 0, 503316, 1473668, 2392221, 3406404, 0, 0, 0, 0, 737778, 1970903, 3450654, 0, 0, - 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0, 303038, 719742, 1122186, 1577897, 2117075, 2770337, - 3648834, 0, 419849, 932603, 1440533, 2011797, 2745172, 3571240, 0, 0, 548824, 1165177, - 1812987, 2555379, 3366138, 0, 0, 0, 695835, 1428160, 2190475, 3084910, 0, 0, 0, 0, 697093, - 1381603, 2092957, 2970406, 0, 0, 0, 0, 708417, 1396283, 2099039, 2992426, 0, 0, 0, 0, 835924, - 1728892, 2836607, 0, 0, 0, 0, 0, 2097152, 0, 0, 0, 0, 0, 0, 0 + 100244, 534145, 1156579, 2068841, 2846465, 3531185, 4125937, 0, + 253965, 864656, 1467377, 2129448, 2977327, 3768792, 0, 0, + 338480, 1189924, 2035915, 2872889, 3640027, 0, 0, 0, + 492621, 1532179, 2527278, 3470158, 0, 0, 0, 0, + 499332, 1506804, 2465831, 3425698, 0, 0, 0, 0, + 503316, 1473669, 2392221, 3406404, 0, 0, 0, 0, + 737778, 1970904, 3450654, 0, 0, 0, 0, 0, + 2097152, 0, 0, 0, 0, 0, 0, 0, + 303038, 719743, 1122186, 1577897, 2117075, 2770338, 3648835, 0, + 419850, 932604, 1440534, 2011798, 2745172, 3571240, 0, 0, + 548825, 1165178, 1812988, 2555380, 3366139, 0, 0, 0, + 695835, 1428161, 2190475, 3084911, 0, 0, 0, 0, + 697093, 1381604, 2092958, 2970406, 0, 0, 0, 0, + 708418, 1396284, 2099040, 2992426, 0, 0, 0, 0, + 835925, 1728892, 2836608, 0, 0, 0, 0, 0, + 2097152, 0, 0, 0, 0, 0, 0, 0 }; // q = 15 @@ -1626,9 +1633,11 @@ const Word16 coherence_cb1_masa_Q15[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBAN // q = 21 const Word32 coherence_cb1_masa_fx[MASA_NO_CV_COH1 * MASA_MAXIMUM_CODING_SUBBANDS] = { - -3984, 544630, -565392, 1314704, -1320157, -11534, 541484, -583847, 1357486, -1371118, - -6081, 525546, -551551, 1362729, -1371537, -838, 533934, -540855, 1436758, -1414109, - 3565, 528692, -519883, 1513514, -1500931 + -3985, 544630, -565392, 1314705, -1320157, + -11534, 541485, -583847, 1357487, -1371118, + -6082, 525546, -551551, 1362729, -1371537, + -839, 533935, -540856, 1436759, -1414110, + 3565, 528692, -519884, 1513515, -1500932 }; /* Multi-channel input and output setups */ -- GitLab From 86df3c3d2fd583636cad66804c676d9948310497 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 10:38:23 +0530 Subject: [PATCH 0522/1310] Q fixes in inov_encode function --- lib_enc/acelp_core_switch_enc_fx.c | 3 +- lib_enc/corr_xh_fx.c | 14 +-- lib_enc/enc_gen_voic_fx.c | 2 +- lib_enc/enc_pit_exc_fx.c | 2 +- lib_enc/enc_tran_fx.c | 3 +- lib_enc/find_tar_fx.c | 135 ----------------------------- lib_enc/inov_enc_fx.c | 37 +++++--- lib_enc/prot_fx_enc.h | 16 +--- 8 files changed, 39 insertions(+), 173 deletions(-) diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 854f0ff67..4852cb567 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -6,7 +6,6 @@ #include "options.h" #include "cnst.h" #include "rom_com_fx.h" -//#include "prot_fx.h" #include "rom_com.h" /* Common constants */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ @@ -630,7 +629,7 @@ static void encod_gen_voic_core_switch_ivas_fx( ELSE { weight_a_fx( A, Ap, GAMMA1, M ); /* Bandwidth expansion of A(z) filter coefficients */ - find_targets_ivas_fx( inp, hLPDmem->mem_syn, 0, &( hLPDmem->mem_w0 ), Aq, res, L_SUBFR, Ap, TILT_FAC_FX, xn, cn, h1 ); + find_targets_ivas_fx( inp, hLPDmem->mem_syn, 0, &( hLPDmem->mem_w0 ), Aq, res, L_SUBFR, Ap, TILT_FAC_FX, xn, cn, h1 ); } q_h1 = sub( 14, norm_s( h1[0] ) ); diff --git a/lib_enc/corr_xh_fx.c b/lib_enc/corr_xh_fx.c index 51165d141..5fb7c628a 100644 --- a/lib_enc/corr_xh_fx.c +++ b/lib_enc/corr_xh_fx.c @@ -133,7 +133,7 @@ void corr_xh_ivas_fx( const Word16 Qx, Word16 dn[], /* o : correlation between x[] and h[] Qdn*/ Word16 *Qdn, - const Word16 h[], /* i : impulse response (of weighted synthesis filter) (Q15 - norm_s(h[0]))*/ + const Word16 h[], /* i : impulse response (of weighted synthesis filter) (Q14 - norm_s(h[0]))*/ const Word16 L_subfr /* i : length of the subframe Q0*/ ) { @@ -152,16 +152,16 @@ void corr_xh_ivas_fx( L_maxloc = L_deposit_l( 0 ); FOR( i = k; i < L_subfr; i += STEP ) { - L_tmp = L_mac( 0, x[i], h[0] ); // Qx+(15 - norm_s(h[0])) + L_tmp = L_mac( 0, x[i], h[0] ); // Qx+(14 - norm_s(h[0])) + 1 FOR( j = i; j < L_subfr - 1; j++ ) { - L_tmp = L_mac_o( L_tmp, x[j + 1], h[j + 1 - i], &Overflow ); // Qx+(15 - norm_s(h[0])) + L_tmp = L_mac_o( L_tmp, x[j + 1], h[j + 1 - i], &Overflow ); // Qx+(14 - norm_s(h[0])) + 1 } - y32[i] = L_tmp; // Qx+(15 - norm_s(h[0])) + y32[i] = L_tmp; // Qx+(14 - norm_s(h[0])) + 1 move32(); L_tmp = L_abs( L_tmp ); - L_maxloc = L_max( L_tmp, L_maxloc ); // Qx+(15 - norm_s(h[0])) + L_maxloc = L_max( L_tmp, L_maxloc ); // Qx+(14 - norm_s(h[0])) +1 } /* tot += 3*max / 8 */ L_maxloc = L_shr( L_maxloc, 2 ); @@ -176,11 +176,11 @@ void corr_xh_ivas_fx( FOR( i = 0; i < L_subfr; i++ ) { - dn[i] = round_fx( L_shl( y32[i], j ) ); // Qx+(15 - norm_s(h[0])) +j - 16 + dn[i] = round_fx( L_shl( y32[i], j ) ); // Qx+(14 - norm_s(h[0])) + 1 +j - 16 move16(); } - *Qdn = sub( add( add( Qx, sub( 15, norm_s( h[0] ) ) ), j ), 16 ); + *Qdn = sub( add( add( Qx, add( sub( 14, norm_s( h[0] ) ), 1 ) ), j ), 16 ); move16(); return; } diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index a60828a94..bb305e9c9 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -562,7 +562,7 @@ void encod_gen_voic_ivas_fx( Copy( &res_fx[i_subfr_fx], &exc_fx[i_subfr_fx], L_SUBFR ); /*Q_new*/ - find_targets_ivas_new_fx( speech_fx, hLPDmem->mem_syn, i_subfr_fx, &hLPDmem->mem_w0, p_Aq_fx, + find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr_fx, &hLPDmem->mem_w0, p_Aq_fx, res_fx, L_SUBFR, p_Aw_fx, st_fx->preemph_fac, xn_fx, cn_fx, h1_fx ); q_h1 = sub( 14, norm_s( h1_fx[0] ) ); diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index f16dd80cb..e87462988 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -721,7 +721,7 @@ void enc_pit_exc_ivas_fx( Copy( &res[i_subfr], &exc[i_subfr], L_subfr ); /* Q_new */ /* condition on target (compared to float) has been put outside the loop */ - find_targets_ivas_new_fx( speech, hGSCEnc->mem_syn_tmp_fx, i_subfr, &hGSCEnc->mem_w0_tmp_fx, p_Aq, + find_targets_ivas_fx( speech, hGSCEnc->mem_syn_tmp_fx, i_subfr, &hGSCEnc->mem_w0_tmp_fx, p_Aq, res, L_subfr, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 865972819..c92e1b6db 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -545,7 +545,8 @@ Word16 encod_tran_ivas_fx( Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); /* Q_new */ - find_targets_ivas_new_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, + + find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); diff --git a/lib_enc/find_tar_fx.c b/lib_enc/find_tar_fx.c index 4f24ec39f..8d3efb834 100644 --- a/lib_enc/find_tar_fx.c +++ b/lib_enc/find_tar_fx.c @@ -173,141 +173,6 @@ void find_targets_ivas_fx( Word16 *cn, /* o : target vector in residual domain Q_new*/ Word16 *h1 /* o : impulse response of weighted synthesis filter Q(14 - norm_s(h1[0]))*/ ) -{ - Word16 i; - Word16 temp[M + 6 * L_SUBFR]; /* error of quantization */ - Word16 scale, scaleq, j, d, s, s2, tmp; - Word16 Aqs[M + 1]; - Word32 h1_32[6 * L_SUBFR]; - Word16 sf; - Word64 Ltmp64; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - /*------------------------------------------------------------------------* - * Find the target vector for excitation search: - * - * |------| res[n] - * speech[n]---| A(z) |-------- - * |------| | |--------| error[n] |------| - * zero -- (-)--| 1/A(z) |-----------| W(z) |-- target - * exc |--------| |------| - * - * Instead of subtracting the zero-input response of filters from - * the weighted input speech, the above configuration is used to - * compute the target vector. - *-----------------------------------------------------------------------*/ - FOR( i = 0; i < M; i++ ) - { - temp[i] = sub_sat( speech[i + i_subfr - M], mem_syn[i] ); /* Q_new - 1 */ - move16(); - } - Scale_sig( temp, M, 1 ); // scaling to make belong function output alligned //Qnew - - syn_filt_fx( 0, p_Aq, M, &res[i_subfr], temp + M, L_subfr, temp, 0 ); - - Residu3_fx( Ap, temp + M, xn, L_subfr, 0 ); /* xn in Q_new */ - - deemph_fx( xn, tilt_fac, L_subfr, mem_w0 ); /* xn in Q_new */ - - *mem_w0 = shr( *mem_w0, 1 ); // Q_new - 1 - - /*-----------------------------------------------------------------* - * Find target in residual domain (cn[]) for innovation search - *--------------------------------------------------------------*/ - IF( cn != NULL ) - { - /* first half: xn[] --> cn[] */ - temp[0] = 0; - move16(); - preemph_copy_fx( xn, cn, tilt_fac, shr( L_subfr, 1 ), temp ); - syn_filt_s_lc_fx( 1, Ap, cn, temp, shr( L_subfr, 1 ) ); /* Q_new -> Q_new - 1 */ - Residu3_lc_fx( p_Aq, M, temp, cn, shr( L_subfr, 1 ), 1 ); /* Q_new - 1 -> Q_new */ - - /* second half: res[] --> cn[] (approximated and faster) */ - Copy( &res[i_subfr + shr( L_subfr, 1 )], cn + shr( L_subfr, 1 ), shr( L_subfr, 1 ) ); /* Q_new */ - } - scale_sig( xn, L_subfr, -1 ); // Q_new - 1 - - /*---------------------------------------------------------------* - * Compute impulse response, h1[], of weighted synthesis filter * - *---------------------------------------------------------------*/ - - scale = norm_s( Ap[0] ); - scaleq = norm_s( p_Aq[0] ); - d = sub( scaleq, scale ); - IF( d >= 0 ) - { - Copy( p_Aq, Aqs, M + 1 ); /* Q12 */ - s = add( scaleq, 1 ); - s2 = shr( 16384, d ); - } - ELSE - { - Copy_Scale_sig( p_Aq, Aqs, M + 1, d ); /* Q12 */ - s = add( scale, 1 ); - s2 = 16384; - move16(); - } - - set32_fx( h1_32, 0, L_subfr ); - Overflow = 0; - move16(); - FOR( i = 0; i < M; i++ ) - { - Ltmp64 = W_mult_16_16( Ap[i], s2 ); /* Q27 */ - FOR( j = 1; j <= i; j++ ) - { - Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_o( h1_32[i - j], s, &Overflow ) ) ); /* Q27 */ - } - h1_32[i] = W_extract_l( Ltmp64 ); /* Q27 */ - move32(); - } - - Ltmp64 = W_mult_16_16( Ap[i], s2 ); /* Q27 */ - FOR( j = 1; j <= M; j++ ) - { - Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_o( h1_32[i - j], s, &Overflow ) ) ); /* Q27 */ - } - h1_32[M] = W_extract_l( Ltmp64 ); /* Q27 */ - move32(); - - FOR( i = M + 1; i < L_subfr; i++ ) - { - Ltmp64 = W_msu_16_16( 0, Aqs[1], extract_h( L_shl_o( h1_32[i - 1], s, &Overflow ) ) ); /* Q27 */ - FOR( j = 2; j <= M; j++ ) - { - Ltmp64 = W_msu_16_16( Ltmp64, Aqs[j], extract_h( L_shl_o( h1_32[i - j], s, &Overflow ) ) ); /* Q27 */ - } - h1_32[i] = W_extract_l( Ltmp64 ); /* Q27 */ - move32(); - } - - sf = sub( L_norm_arr( h1_32, L_subfr ), 1 ); - Copy_Scale_sig32_16( h1_32, h1, L_subfr, sf ); // Q11 + sf - - tmp = 0; - move16(); - Deemph2( h1, tilt_fac, L_subfr, &tmp ); // Q11 + sf - 1 - - return; -} - -void find_targets_ivas_new_fx( - const Word16 *speech, /* i : pointer to the speech frame Q_new-1*/ - const Word16 *mem_syn, /* i : memory of the synthesis filter Q_new-1*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - Word16 *mem_w0, /* i/o: weighting filter denominator memory Q_new-1*/ - const Word16 *p_Aq, /* i : interpolated quantized A(z) filter Q12*/ - const Word16 *res, /* i : residual signal Q_new*/ - const Word16 L_subfr, /* i : length of vectors for gain quantization Q0*/ - const Word16 *Ap, /* i : unquantized A(z) filter with bandwidth expansion Q12*/ - Word16 tilt_fac, /* i : tilt factor Q15*/ - Word16 *xn, /* o : Close-loop Pitch search target vector Q_new-1*/ - Word16 *cn, /* o : target vector in residual domain Q_new*/ - Word16 *h1 /* o : impulse response of weighted synthesis filter Q(14 - norm_s(h1[0]))*/ -) { Word16 i; Word16 temp[M + 6 * L_SUBFR]; /* error of quantization */ diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index fe22ee398..62ea723a3 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -370,7 +370,7 @@ Word16 inov_encode_ivas_fx( Word16 shift, Word16 Q_new ) { - Word16 dn[2 * L_SUBFR], Qdn; + Word16 dn[2 * L_SUBFR], Qdn, Qcn; Word16 nBits, cmpl_flag; Word16 stack_pulses; Word16 g1, g2; @@ -378,7 +378,7 @@ Word16 inov_encode_ivas_fx( Word16 acelpautoc; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; Word16 i, k; - Word16 Qxn, Rw_q, j, max_xn2; + Word16 Qxn, max_xn2; stack_pulses = 0; move16(); @@ -416,20 +416,22 @@ Word16 inov_encode_ivas_fx( test(); test(); + Qcn = Q_new; + move16(); IF( GT_32( core_brate, ACELP_13k20 ) && !Opt_AMR_WB && EQ_16( L_subfr, L_SUBFR ) ) { acelpautoc = 1; move16(); - Word16 q_h1 = sub( 14, norm_s( h2[0] ) ); - Scale_sig( h2, L_SUBFR, sub( 11, q_h1 ) ); /* set h2[] in Q11*/ - cb_shape_fx( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h2, tilt_code, shr( add( pt_pitch, 26 ), 6 ), 0, L_SUBFR ); + cb_shape_fx(1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h2, tilt_code, shr(add(pt_pitch, 26), 6), 0, L_SUBFR); /* h2: Q11, Rw: (Rw_e)Q */ - corr_hh_ivas_fx( h2, Rw, &Rw_q, L_subfr ); // Q(Rw) = Q11-2 - E_ACELP_conv_ivas_fx( xn2, h2, cn ); // Qcn = Qxn2 + /* Rw_e = */ E_ACELP_hh_corr(h2, Rw, L_SUBFR, 3); + + E_ACELP_conv(xn2, h2, cn); /* dn_e -> Rw_e*Q_xn */ - j = E_ACELP_toeplitz_mul_fx( Rw, cn, dn, L_SUBFR, 1 ); - Qdn = add( add( Qxn, Rw_q ), add( j, 1 ) ); + /*dn_e = */ E_ACELP_toeplitz_mul_fx(Rw, cn, dn, L_SUBFR, 1); + Qdn = Qcn; + move16(); } ELSE { @@ -442,6 +444,19 @@ Word16 inov_encode_ivas_fx( Scale_sig( h2, L_SUBFR, sub( 11, q_h1 ) ); /* set h2[] in Q11*/ cb_shape_fx( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h2, tilt_code, shr( add( pt_pitch, 26 ), 6 ), 0, L_subfr ); corr_xh_ivas_fx( xn2, Qxn, dn, &Qdn, h2, L_subfr ); // Q(dn) = Q_new+1 + IF( LT_16( Qdn, Qcn ) ) + { + scale_sig( cn, L_subfr, sub(Qdn, Qcn) ); + Qcn = Qdn; + move16(); + } + ELSE + { + scale_sig( dn, L_subfr, sub(Qcn, Qdn) ); + Qdn = Qcn; + move16(); + } + } /*-----------------------------------------------------------------* @@ -607,7 +622,7 @@ Word16 inov_encode_ivas_fx( } ELSE { - acelp_fast_fx( hBstr, nBits, dn, Qdn, cn, Q_new, h2, code, y2, L_subfr ); + acelp_fast_fx( hBstr, nBits, dn, Qdn, cn, Qcn, h2, code, y2, L_subfr ); } } ELSE IF( ( EQ_16( st_fx->idchan, 1 ) && LE_16( st_fx->acelp_cfg.fixed_cdk_index[idx2], 7 ) ) || ( st_fx->idchan == 0 && LE_16( st_fx->acelp_cfg.fixed_cdk_index[idx2], 3 ) ) ) @@ -618,7 +633,7 @@ Word16 inov_encode_ivas_fx( } ELSE { - acelp_fast_fx( hBstr, st_fx->acelp_cfg.fixed_cdk_index[idx2], dn, Qdn, cn, Q_new, h2, code, y2, L_SUBFR ); + acelp_fast_fx( hBstr, st_fx->acelp_cfg.fixed_cdk_index[idx2], dn, Qdn, cn, Qcn, h2, code, y2, L_SUBFR ); } } ELSE diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 2d7e708bb..05bb16832 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -2334,22 +2334,8 @@ void find_targets_fx( Word16 *cn, /* o : target vector in residual domain Q_new*/ Word16 *h1 /* o : impulse response of weighted synthesis filter Q14*/ ); -void find_targets_ivas_fx( - const Word16 *speech, /* i : pointer to the speech frame Q_new-1*/ - const Word16 *mem_syn, /* i : memory of the synthesis filter Q_new-1*/ - const Word16 i_subfr, /* i : subframe index Q0*/ - Word16 *mem_w0, /* i/o: weighting filter denominator memory Q_new-1*/ - const Word16 *p_Aq, /* i : interpolated quantized A(z) filter Q12*/ - const Word16 *res, /* i : residual signal Q_new*/ - const Word16 L_subfr, /* i : length of vectors for gain quantization Q0*/ - const Word16 *Ap, /* i : unquantized A(z) filter with bandwidth expansion Q12*/ - Word16 tilt_fac, /* i : tilt factor Q15*/ - Word16 *xn, /* o : Close-loop Pitch search target vector Q_new-1*/ - Word16 *cn, /* o : target vector in residual domain Q_new*/ - Word16 *h1 /* o : impulse response of weighted synthesis filter Q(14 - norm_s(h1[0]))*/ -); -void find_targets_ivas_new_fx( +void find_targets_ivas_fx( const Word16 *speech, /* i : pointer to the speech frame Q_new-1*/ const Word16 *mem_syn, /* i : memory of the synthesis filter Q_new-1*/ const Word16 i_subfr, /* i : subframe index Q0*/ -- GitLab From 89c0af8f9c3de8b0fa689f96e4280438f1cc066b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 10:48:05 +0530 Subject: [PATCH 0523/1310] Clang formatting changes --- lib_enc/acelp_core_switch_enc_fx.c | 2 +- lib_enc/corr_xh_fx.c | 2 +- lib_enc/enc_gen_voic_fx.c | 2 +- lib_enc/enc_pit_exc_fx.c | 2 +- lib_enc/enc_tran_fx.c | 2 +- lib_enc/inov_enc_fx.c | 13 ++++++------- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 4852cb567..bad70b08c 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -629,7 +629,7 @@ static void encod_gen_voic_core_switch_ivas_fx( ELSE { weight_a_fx( A, Ap, GAMMA1, M ); /* Bandwidth expansion of A(z) filter coefficients */ - find_targets_ivas_fx( inp, hLPDmem->mem_syn, 0, &( hLPDmem->mem_w0 ), Aq, res, L_SUBFR, Ap, TILT_FAC_FX, xn, cn, h1 ); + find_targets_ivas_fx( inp, hLPDmem->mem_syn, 0, &( hLPDmem->mem_w0 ), Aq, res, L_SUBFR, Ap, TILT_FAC_FX, xn, cn, h1 ); } q_h1 = sub( 14, norm_s( h1[0] ) ); diff --git a/lib_enc/corr_xh_fx.c b/lib_enc/corr_xh_fx.c index 5fb7c628a..56b22c206 100644 --- a/lib_enc/corr_xh_fx.c +++ b/lib_enc/corr_xh_fx.c @@ -161,7 +161,7 @@ void corr_xh_ivas_fx( y32[i] = L_tmp; // Qx+(14 - norm_s(h[0])) + 1 move32(); L_tmp = L_abs( L_tmp ); - L_maxloc = L_max( L_tmp, L_maxloc ); // Qx+(14 - norm_s(h[0])) +1 + L_maxloc = L_max( L_tmp, L_maxloc ); // Qx+(14 - norm_s(h[0])) +1 } /* tot += 3*max / 8 */ L_maxloc = L_shr( L_maxloc, 2 ); diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index bb305e9c9..3ff99812f 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -563,7 +563,7 @@ void encod_gen_voic_ivas_fx( Copy( &res_fx[i_subfr_fx], &exc_fx[i_subfr_fx], L_SUBFR ); /*Q_new*/ find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr_fx, &hLPDmem->mem_w0, p_Aq_fx, - res_fx, L_SUBFR, p_Aw_fx, st_fx->preemph_fac, xn_fx, cn_fx, h1_fx ); + res_fx, L_SUBFR, p_Aw_fx, st_fx->preemph_fac, xn_fx, cn_fx, h1_fx ); q_h1 = sub( 14, norm_s( h1_fx[0] ) ); Copy_Scale_sig( h1_fx, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index e87462988..bfdf46ea0 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -722,7 +722,7 @@ void enc_pit_exc_ivas_fx( /* condition on target (compared to float) has been put outside the loop */ find_targets_ivas_fx( speech, hGSCEnc->mem_syn_tmp_fx, i_subfr, &hGSCEnc->mem_w0_tmp_fx, p_Aq, - res, L_subfr, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); + res, L_subfr, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); Copy_Scale_sig( h1, h2, L_subfr, sub( 11, q_h1 ) ); /*Q11*/ diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index c92e1b6db..dde834b2b 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -547,7 +547,7 @@ Word16 encod_tran_ivas_fx( find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, - res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); + res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); q_h1 = sub( 14, norm_s( h1[0] ) ); Copy_Scale_sig( h1, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index 62ea723a3..d019bf474 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -422,14 +422,14 @@ Word16 inov_encode_ivas_fx( { acelpautoc = 1; move16(); - cb_shape_fx(1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h2, tilt_code, shr(add(pt_pitch, 26), 6), 0, L_SUBFR); + cb_shape_fx( 1, 1, 0, sharpFlag, 0, g1, g2, p_Aq, h2, tilt_code, shr( add( pt_pitch, 26 ), 6 ), 0, L_SUBFR ); /* h2: Q11, Rw: (Rw_e)Q */ - /* Rw_e = */ E_ACELP_hh_corr(h2, Rw, L_SUBFR, 3); + /* Rw_e = */ E_ACELP_hh_corr( h2, Rw, L_SUBFR, 3 ); - E_ACELP_conv(xn2, h2, cn); + E_ACELP_conv( xn2, h2, cn ); /* dn_e -> Rw_e*Q_xn */ - /*dn_e = */ E_ACELP_toeplitz_mul_fx(Rw, cn, dn, L_SUBFR, 1); + /*dn_e = */ E_ACELP_toeplitz_mul_fx( Rw, cn, dn, L_SUBFR, 1 ); Qdn = Qcn; move16(); } @@ -446,17 +446,16 @@ Word16 inov_encode_ivas_fx( corr_xh_ivas_fx( xn2, Qxn, dn, &Qdn, h2, L_subfr ); // Q(dn) = Q_new+1 IF( LT_16( Qdn, Qcn ) ) { - scale_sig( cn, L_subfr, sub(Qdn, Qcn) ); + scale_sig( cn, L_subfr, sub( Qdn, Qcn ) ); Qcn = Qdn; move16(); } ELSE { - scale_sig( dn, L_subfr, sub(Qcn, Qdn) ); + scale_sig( dn, L_subfr, sub( Qcn, Qdn ) ); Qdn = Qcn; move16(); } - } /*-----------------------------------------------------------------* -- GitLab From 0a393ee24aa2a754f068ff36f72e760f812482ba Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Wed, 7 May 2025 08:24:39 +0200 Subject: [PATCH 0524/1310] removed the pop_wmops() --- lib_enc/ivas_cpe_enc_fx.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index 19a850a89..d0a33ed09 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -336,7 +336,6 @@ ivas_error ivas_cpe_enc_fx( &q_band_energies_LR, NULL, NULL, NULL, Q_inp, Q_buffer, Q_add, &front_create_flag ) ), IVAS_ERR_OK ) ) { - pop_wmops(); return error; } @@ -370,7 +369,6 @@ ivas_error ivas_cpe_enc_fx( *----------------------------------------------------------------*/ IF( ( error = stereo_memory_enc_fx( hCPE, input_Fs, max_bwidth, ivas_format, st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) { - pop_wmops(); return error; } @@ -381,7 +379,6 @@ ivas_error ivas_cpe_enc_fx( IF( ( error = stereo_set_tdm_fx( hCPE, input_frame, sts[1]->q_inp32 ) ) != IVAS_ERR_OK ) { - pop_wmops(); return error; } @@ -919,7 +916,6 @@ ivas_error ivas_cpe_enc_fx( move16(); IF( error != IVAS_ERR_OK ) { - pop_wmops(); return error; } } @@ -994,7 +990,6 @@ ivas_error ivas_cpe_enc_fx( igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->rf_mode ); /* Q0 */ IF( ( error = IGF_Reconfig_fx( &sts[n]->hIGFEnc, igf, 0, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) { - pop_wmops(); return error; } } @@ -1023,7 +1018,6 @@ ivas_error ivas_cpe_enc_fx( { IF( ( error = initMdctItdHandling_fx( hCPE->hStereoMdct, input_Fs ) ) != IVAS_ERR_OK ) { - pop_wmops(); return error; } } @@ -1200,7 +1194,6 @@ ivas_error ivas_cpe_enc_fx( } IF( NE_32( ( error = ivas_core_enc_fx( NULL, hCPE, st_ivas->hMCT, n_CoreChannels, old_inp_12k8_16fx, old_inp_16k_16fx, Q_new, ener_fx, A_fx, Aw_fx, epsP_fx, epsP_fx_q, lsp_new_fx, lsp_mid_fx, vad_hover_flag, attack_flag, realBuffer_fx, imagBuffer_fx, q_re_im_buf, old_wsp_fx, e_old_wsp, loc_harm, cor_map_sum_fx, vad_flag_dtx, enerBuffer_fx, enerBuffer_fx_exp, fft_buff_fx, tdm_SM_or_LRTD_Pri, ivas_format, 0 ) ), IVAS_ERR_OK ) ) { - pop_wmops(); return error; } -- GitLab From 79bbea04f183761a567c9055f58c54de02af8dfd Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 May 2025 10:32:30 +0200 Subject: [PATCH 0525/1310] port FIX_997_REMOVE_SPAR_DEC_UPMIXER --- lib_com/options.h | 1 + lib_dec/ivas_spar_decoder_fx.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index c568a52fa..503f5bb8d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,6 +101,7 @@ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define FIX_969_USAN_IGF_ARITH /* FhG: issue 969: fix USAN error in igf_sce_dec; same issue as #962 */ +#define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index 38b403606..737a42c98 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -1534,12 +1534,20 @@ void ivas_spar_dec_set_render_map_fx( return; } +#ifdef FIX_997_REMOVE_SPAR_DEC_UPMIXER +/*-------------------------------------------------------------------* + * ivas_spar_dec_set_render_params() + * + * IVAS SPAR set rendering parameters + *-------------------------------------------------------------------*/ +#else /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer() * * IVAS SPAR upmixer *-------------------------------------------------------------------*/ +#endif void ivas_spar_dec_set_render_params_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ -- GitLab From 11a2331d7320e6ddc5d147e93044317a6e0052d7 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 May 2025 10:59:43 +0200 Subject: [PATCH 0526/1310] port FIX_699_FILE_READER_JBM_TSM --- apps/encoder.c | 4 ++++ lib_com/options.h | 1 + 2 files changed, 5 insertions(+) diff --git a/apps/encoder.c b/apps/encoder.c index af9554589..193587f31 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -681,7 +681,11 @@ int main( { if ( ( error = JbmFileReader_readCAconfig( jbmReader, &caConfig ) ) != IVAS_ERR_OK ) { +#ifdef FIX_699_FILE_READER_JBM_TSM + fprintf( stderr, "\nError (%s) while reading Channel-Aware Config. from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), JbmFileReader_getFilePath( jbmReader ) ); +#else fprintf( stderr, "JbmFileReader_readCAconfig() failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); +#endif goto cleanup; } diff --git a/lib_com/options.h b/lib_com/options.h index c568a52fa..269f1004c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,6 +101,7 @@ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define FIX_969_USAN_IGF_ARITH /* FhG: issue 969: fix USAN error in igf_sce_dec; same issue as #962 */ +#define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ /* #################### End BASOP porting switches ############################ */ -- GitLab From 0e4cf38fb376789c6fda4bb44c2ada3155554464 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 May 2025 11:13:59 +0200 Subject: [PATCH 0527/1310] port FIX_993_REMOVE_SBA_GET_ORDER --- lib_com/ivas_prot_fx.h | 3 ++- lib_com/ivas_sba_config_fx.c | 8 ++++++-- lib_com/options.h | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 6c9166111..5c396140f 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4937,12 +4937,13 @@ ivas_error ivas_cldfb_dec_reconfig_fx( ivas_error ivas_sba_enc_reconfigure_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); - +#ifndef FIX_993_REMOVE_SBA_GET_ORDER Word16 ivas_sba_get_order_fx( const Word16 nb_channels, /* i : Number of ambisonic channels */ const Word16 sba_planar /* i : SBA planar flag */ ); +#endif /*! r: Ambisonic (SBA) order used for analysis and coding */ Word16 ivas_sba_get_analysis_order( const Word32 ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_sba_config_fx.c b/lib_com/ivas_sba_config_fx.c index b3a0806d4..6dbe215ea 100644 --- a/lib_com/ivas_sba_config_fx.c +++ b/lib_com/ivas_sba_config_fx.c @@ -60,6 +60,7 @@ void ivas_sba_config_fx( Word16 *element_mode /* o : element mode of the core coder */ ) { +#ifndef FIX_993_REMOVE_SBA_GET_ORDER test(); IF( sba_order < 0 && nb_channels < 0 ) { @@ -74,6 +75,9 @@ void ivas_sba_config_fx( nb_channels = ivas_sba_get_nchan_fx( sba_order, sba_planar ); } ELSE +#else + IF( nb_channels > 0 ) +#endif { IF( sba_planar ) { @@ -124,7 +128,7 @@ void ivas_sba_config_fx( return; } - +#ifndef FIX_993_REMOVE_SBA_GET_ORDER /*-------------------------------------------------------------------* * ivas_sba_get_order() * @@ -174,7 +178,7 @@ Word16 ivas_sba_get_order_fx( return ( sba_order ); } - +#endif /*-------------------------------------------------------------------* * ivas_sba_get_analysis_order() diff --git a/lib_com/options.h b/lib_com/options.h index c568a52fa..1b05236bb 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,6 +101,7 @@ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define FIX_969_USAN_IGF_ARITH /* FhG: issue 969: fix USAN error in igf_sce_dec; same issue as #962 */ +#define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ /* #################### End BASOP porting switches ############################ */ -- GitLab From ec12834622a01b2833817478d5d10c450a43f476 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 May 2025 11:20:16 +0200 Subject: [PATCH 0528/1310] remove sum_l() leftover --- lib_com/prot_fx.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 45641b3f8..afae8dfbf 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -11252,12 +11252,6 @@ int16_t sum_s( const int16_t lvec /* i : length of input vector */ ); -/*! r: sum of all vector elements */ -int32_t sum_l( - const int32_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - /*! r: sum of all squared vector elements */ float sum2_f( const float *vec, /* i : input vector */ -- GitLab From 59ddeb18819bb6400722762c280b2ceb809eab3a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 14:54:52 +0530 Subject: [PATCH 0529/1310] Bug fixes in front vad and pre-proc front functions --- lib_enc/analy_sp_fx.c | 2 +- lib_enc/ivas_core_pre_proc_front_fx.c | 83 ++++++++------------------- lib_enc/ivas_front_vad_fx.c | 6 +- 3 files changed, 27 insertions(+), 64 deletions(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 49bb03f57..dc59ec752 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -620,7 +620,7 @@ void ivas_analy_sp_fx( *q_fr_bands = add( *q_fr_bands, exp ); move16(); - exp = sub( getScaleFactor32( band_energies, 2 * NB_BANDS ), 1 ); + exp = getScaleFactor32( band_energies, 2 * NB_BANDS ); scale_sig32( band_energies, 2 * NB_BANDS, exp ); /* q_band_energies + exp */ *q_band_energies = add( *q_band_energies, exp ); move16(); diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 4a8c4edd2..e883d9ec1 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -945,78 +945,41 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( st->idchan == 0 || EQ_16( element_mode, IVAS_CPE_MDCT ) ) { - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && lr_vad_enabled && band_energies_LR_fx != NULL ) + Word16 norm; + norm = L_norm_arr( st->hFdCngEnc->msPeriodog_fx, NPART ); + IF( NE_16( norm, Q31 ) ) { - Word16 normmsPeriodog_fx = Q31, zero_flag = 0; - move16(); - move16(); - zero_flag = get_zero_flag( st->hFdCngEnc->msPeriodog_fx, NPART ); - IF( zero_flag ) - { - normmsPeriodog_fx = getScaleFactor32( st->hFdCngEnc->msPeriodog_fx, NPART ); - move16(); - } - st->hFdCngEnc->msPeriodog_fx_exp_cldfb = sub( 31, normmsPeriodog_fx ); - st->hFdCngEnc->msPeriodog_fx_exp_fft = sub( 31, normmsPeriodog_fx ); + scale_sig32( st->hFdCngEnc->msPeriodog_fx, NPART, norm ); // exp:st->hFdCngEnc->msPeriodog_fx_exp-norm + st->hFdCngEnc->msPeriodog_fx_exp = sub( st->hFdCngEnc->msPeriodog_fx_exp, norm ); + st->hFdCngEnc->msPeriodog_fx_exp_cldfb = sub( st->hFdCngEnc->msPeriodog_fx_exp_cldfb, norm ); + st->hFdCngEnc->msPeriodog_fx_exp_fft = sub( st->hFdCngEnc->msPeriodog_fx_exp_fft, norm ); move16(); move16(); - Scale_sig32( st->hFdCngEnc->msPeriodog_fx, NPART, normmsPeriodog_fx ); /* exp(st->hFdCngEnc->msPeriodog_fx_exp - normmsPeriodog_fx) */ - st->hFdCngEnc->msPeriodog_fx_exp = sub( st->hFdCngEnc->msPeriodog_fx_exp, normmsPeriodog_fx ); - Word16 msNoiseEst_Q = Q31; move16(); + } + norm = L_norm_arr( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); + IF( NE_16( norm, Q31 ) ) + { + scale_sig32( st->hFdCngEnc->msNoiseEst_old_fx, NPART, norm ); // exp:st->hFdCngEnc->msNoiseEst_old_fx_exp-norm + st->hFdCngEnc->msNoiseEst_old_fx_exp = sub( st->hFdCngEnc->msNoiseEst_old_fx_exp, norm ); move16(); - zero_flag = get_zero_flag( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); - IF( zero_flag ) - { - msNoiseEst_Q = getScaleFactor32( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); - scale_sig32( st->hFdCngEnc->msNoiseEst_old_fx, NPART, msNoiseEst_Q ); /* exp(st->hFdCngEnc->msNoiseEst_old_fx_exp - msNoiseEst_Q) */ - st->hFdCngEnc->msNoiseEst_old_fx_exp = sub( st->hFdCngEnc->msNoiseEst_old_fx_exp, msNoiseEst_Q ); - move16(); - } + } + + test(); + test(); + IF( EQ_16( element_mode, IVAS_CPE_TD ) && lr_vad_enabled && band_energies_LR_fx != NULL ) + { perform_noise_estimation_enc_ivas_fx( band_energies_LR_fx, sub( Q31, band_energies_LR_fx_q ), enerBuffer_fx, *enerBuffer_fx_exp, st->hFdCngEnc, input_Fs, hCPE ); } ELSE { - Word16 normmsPeriodog_fx = Q31, zero_flag = 0; - move16(); - move16(); - shift = getScaleFactor32( band_energies_fx, 2 * NB_BANDS ); - scale_sig32( band_energies_fx, 2 * NB_BANDS, shift ); - q_band_energies = add( q_band_energies, shift ); - - zero_flag = get_zero_flag( st->hFdCngEnc->msPeriodog_fx, NPART ); /* Q0 */ - IF( zero_flag ) - { - normmsPeriodog_fx = getScaleFactor32( st->hFdCngEnc->msPeriodog_fx, NPART ); - } - st->hFdCngEnc->msPeriodog_fx_exp_cldfb = sub( 31, normmsPeriodog_fx ); - st->hFdCngEnc->msPeriodog_fx_exp_fft = sub( 31, normmsPeriodog_fx ); - move16(); - move16(); - Scale_sig32( st->hFdCngEnc->msPeriodog_fx, NPART, normmsPeriodog_fx ); /* exp(st->hFdCngEnc->msPeriodog_fx_exp - normmsPeriodog_fx)*/ - st->hFdCngEnc->msPeriodog_fx_exp = sub( st->hFdCngEnc->msPeriodog_fx_exp, normmsPeriodog_fx ); - move16(); - Word16 msNoiseEst_Q = Q31; - move16(); - zero_flag = get_zero_flag( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); /* Q0 */ - IF( zero_flag ) + norm = L_norm_arr( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN ); + IF( NE_16( norm, Q31 ) ) { - msNoiseEst_Q = getScaleFactor32( st->hFdCngEnc->msNoiseEst_old_fx, NPART ); - scale_sig32( st->hFdCngEnc->msNoiseEst_old_fx, NPART, msNoiseEst_Q ); /* exp(st->hFdCngEnc->msNoiseEst_old_fx_exp - msNoiseEst_Q) */ - st->hFdCngEnc->msNoiseEst_old_fx_exp = sub( st->hFdCngEnc->msNoiseEst_old_fx_exp, msNoiseEst_Q ); + scale_sig32( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN, norm ); // exp:st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog-norm + st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog = sub( st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog, norm ); move16(); } - zero_flag = get_zero_flag( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN ); /* Q0 */ - Word16 normmsperiodog = 31; - move16(); - IF( zero_flag ) - { - normmsperiodog = getScaleFactor32( st->hFdCngEnc->hFdCngCom->periodog, PERIODOGLEN ); - } - st->hFdCngEnc->hFdCngCom->exp_cldfb_periodog = sub( 31, normmsperiodog ); - move16(); perform_noise_estimation_enc_ivas_fx( band_energies_fx, sub( Q31, q_band_energies ), enerBuffer_fx, *enerBuffer_fx_exp, st->hFdCngEnc, input_Fs, hCPE ); } diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index fff68e5a2..ab090edb8 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -241,9 +241,9 @@ ivas_error front_vad_fx( PREEMPH_FX( hFrontVad->buffer_12k8_fx + L_FFT / 2, PREEMPH_FAC, L_FRAME, &hFrontVad->mem_preemph_fx ); - Q_new = add( sub( Q_inp, Qband ), Q_add ); - Scale_sig( hFrontVad->buffer_12k8_fx, L_FFT / 2, sub( Q_new, Q_buffer[n] ) ); /* Q_new */ - Scale_sig( hFrontVad->buffer_12k8_fx + L_FFT / 2, 384 - L_FFT / 2, sub( Q_new, add( Q_inp, Qband ) ) ); /* Q_new */ + Q_new = s_min( add( add( Q_inp, Qband ), Q_add ), Q_buffer[n] ); + scale_sig( hFrontVad->buffer_12k8_fx, L_FFT / 2, sub( Q_new, Q_buffer[n] ) ); /* Q_new */ + scale_sig( hFrontVad->buffer_12k8_fx + L_FFT / 2, 3 * L_FRAME / 2 - L_FFT / 2, sub( Q_new, add( Q_inp, Qband ) ) ); /* Q_new */ Q_buffer[n] = Q_new; move16(); -- GitLab From ea6a9c3a8509d2a9d050ac5d33b4c9ea26350735 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 May 2025 11:33:01 +0200 Subject: [PATCH 0530/1310] remove planarCP static variable --- lib_com/ivas_stat_com.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index fb11d3934..847442c35 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -176,6 +176,7 @@ typedef struct ivas_band_coeffs_t Word32 pred_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; Word32 C_quant_re_fx[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS][IVAS_SPAR_MAX_DMX_CHS - 1]; Word32 P_quant_re_fx[IVAS_SPAR_MAX_CH - 1]; + } ivas_band_coeffs_t; typedef struct ivas_band_coeffs_ind_t @@ -197,6 +198,7 @@ typedef struct ivas_spar_md_t Word32 ref_pow_slow_fx[IVAS_MAX_NUM_BANDS]; Word16 res_ind; Word16 prior_dyn_active_w_flag; + } ivas_spar_md_t; typedef struct ivas_spar_md_prev_t @@ -211,6 +213,7 @@ typedef struct ivas_quant_coeffs_t Word32 min_fx; /* Q28 */ Word32 max_fx; /* Q28 */ Word16 q_levels[2]; + } ivas_quant_coeffs_t; typedef struct ivas_quant_strat_t @@ -238,7 +241,6 @@ typedef struct ivas_spar_md_com_cfg Word16 max_bits_per_blk; Word16 prev_quant_idx; Word16 agc_bits_ch_idx; - Word16 planarCP; Word16 num_umx_chs; Word16 max_md_bits_spar; @@ -292,6 +294,7 @@ typedef struct ivas_arith_t Word16 range; Word16 num_models; Word32 saved_dist_arr[IVAS_NUM_PROB_MODELS][IVAS_MAX_QUANT_LEVELS]; /* Q15 */ + } ivas_arith_t; typedef struct ivas_arith_coeffs_t -- GitLab From beed21040591e3ca90fe6c83970e3e67cc2df37b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 6 May 2025 10:57:48 +0530 Subject: [PATCH 0531/1310] Fix for 3GPP issue 1542: One bit systematic error between BASOP and float decoder MASA EXT output of energy ratios Link #1542 --- lib_dec/ivas_masa_dec_fx.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index dec4d3465..039ad4137 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -2572,13 +2572,9 @@ static void create_masa_ext_out_meta_fx( { FOR( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) { - IF( EQ_32( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], ONE_IN_Q30 ) ) - { - hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf]--; - } - UWord8 tmp = (UWord8) L_shr( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], Q30 - 8 ); // Q8 + UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); //Q0 move16(); - extOutMeta->directToTotalRatio[dir][sf][b_new] = tmp; // Q8 + extOutMeta->directToTotalRatio[dir][sf][b_new] = tmp; // Q0 move16(); } } @@ -2637,12 +2633,8 @@ static void create_masa_ext_out_meta_fx( move16(); FOR( dir = 0; dir < numDirections; dir++ ) { - /* todo: not optimal, but less invasive */ - IF( EQ_32( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], ONE_IN_Q30 ) ) - { - hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf]--; - } - UWord8 tmp = (UWord8) L_shr( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], Q30 - 8 ); // Q8 + + UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); //Q0 move16(); extOutMeta->diffuseToTotalRatio[sf][b_new] = (UWord8) sub( extOutMeta->diffuseToTotalRatio[sf][b_new], tmp ); // Q8 move16(); -- GitLab From fb5f45affe1237b29fe3a4fbff3c636209363555 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 6 May 2025 11:44:11 +0530 Subject: [PATCH 0532/1310] Clang formatting changes --- lib_dec/ivas_masa_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index 039ad4137..36900867e 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -2572,7 +2572,7 @@ static void create_masa_ext_out_meta_fx( { FOR( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) { - UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); //Q0 + UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); // Q0 move16(); extOutMeta->directToTotalRatio[dir][sf][b_new] = tmp; // Q0 move16(); @@ -2634,7 +2634,7 @@ static void create_masa_ext_out_meta_fx( FOR( dir = 0; dir < numDirections; dir++ ) { - UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); //Q0 + UWord8 tmp = (UWord8) W_extract_h( W_mult_32_16( hQMetaData->q_direction[dir].band_data[b_old].energy_ratio_fx[sf], UINT8_MAX << 1 ) ); // Q0 move16(); extOutMeta->diffuseToTotalRatio[sf][b_new] = (UWord8) sub( extOutMeta->diffuseToTotalRatio[sf][b_new], tmp ); // Q8 move16(); -- GitLab From 1f7ede4373cf94a1851008823c4dbe6bfaf0905b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 16:43:09 +0530 Subject: [PATCH 0533/1310] Fix for new stream shared --- lib_com/prot_fx.h | 6 ++++++ lib_com/tools_fx.c | 24 ++++++++++++++++++++++++ lib_dec/ivas_qmetadata_dec_fx.c | 25 ++++++++++++++++--------- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index f422d5e50..912b3b713 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9969,6 +9969,12 @@ Word16 usdequant_fx( /* Qx*/ const Word16 delta /* i: quantization step Qy*/ ); +Word32 usdequant32_fx( /* Qx*/ + const Word16 idx, /* i: quantizer index Q0*/ + const Word32 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word32 delta /* i: quantization step Qy*/ +); + Word16 usquant_fx( /* o: index of the winning codeword */ const Word16 x, /* i: scalar value to quantize Qx*/ Word16 *xq, /* o: quantized value Qx*/ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 44a86b0eb..a4c0c5484 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -284,6 +284,30 @@ Word16 usdequant_fx( /* Qx*/ return ( g ); } +Word32 usdequant32_fx( /* Qx*/ + const Word16 idx, /* i: quantizer index Q0*/ + const Word32 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word32 delta /* i: quantization step Qx-1*/ +) +{ + Word32 g; + Word64 L_tmp; + + /*g = idx * delta + qlow;*/ + L_tmp = W_deposit32_l( qlow ); /*Qx */ + L_tmp = W_mac_32_16( L_tmp, delta, idx ); + IF( GE_64( L_tmp, MAX_32 ) ) + { + g = MAX_32; + move32(); + } + ELSE + { + g = W_extract_l(L_tmp); /*Qx */ + } + return ( g ); +} + /*-------------------------------------------------------------------* * usquant() * diff --git a/lib_dec/ivas_qmetadata_dec_fx.c b/lib_dec/ivas_qmetadata_dec_fx.c index 6e36c7765..c1be6caf8 100644 --- a/lib_dec/ivas_qmetadata_dec_fx.c +++ b/lib_dec/ivas_qmetadata_dec_fx.c @@ -72,8 +72,7 @@ static Word16 read_coherence_data_fx( UWord16 *bitstream, Word16 *p_bit_pos, IVA static Word16 ivas_qmetadata_raw_decode_dir_512_fx( IVAS_QDIRECTION *q_direction, UWord16 *bitstream, Word16 *index, const Word16 nbands, const Word16 start_band, const SPHERICAL_GRID_DATA *sph_grid16 ); static Word16 read_surround_coherence( UWord16 *bitstream, Word16 *p_bit_pos, IVAS_QMETADATA *hQMetaData ); static ivas_error read_huf( Word16 *num_bits_read, const UWord16 *bitstream, UWord16 *out, const Word16 start_pos, const Word16 len, const Word16 *huff_code, const Word16 max_len ); -const Word16 inv_dfRatio_qsteps[9] = { 0, 0, ONE_IN_Q14, 0, 5461, 0, 0, 0, 2341 }; // Q14 - +const Word32 inv_dfRatio_qsteps[9] = { 0, 0, ONE_IN_Q30, 0, 357913941, 0, 0, 0, 153391689 }; // Q30 /*-----------------------------------------------------------------------* * Global function definitions @@ -223,7 +222,7 @@ Word16 ivas_qmetadata_dec_decode( IF( EQ_16( hQMetaData->twoDirBands[b], 1 ) ) { Word32 diffRatio_fx, dir1ratio_fx, dir2ratio_fx; - Word16 dfRatio_fx; + Word32 dfRatio_fx; Word16 dfRatio_qsteps; diffRatio_fx = diffuseness_reconstructions_fx[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; // Q30 @@ -233,17 +232,25 @@ Word16 ivas_qmetadata_dec_decode( /* already encoded as total and ratios in HO-DirAC */ IF( hodirac_flag ) { - - dfRatio_fx = usdequant_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0 /* Q15 */, inv_dfRatio_qsteps[dfRatio_qsteps] ); // Q15 + dfRatio_fx = usdequant32_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0 /* Q15 */, inv_dfRatio_qsteps[dfRatio_qsteps] ); // Q31 dir1ratio_fx = L_sub( ONE_IN_Q30, diffRatio_fx ); - dir2ratio_fx = L_shl( (Word32) dfRatio_fx, Q15 ); /*Q30*/ + dir2ratio_fx = L_shr( dfRatio_fx, 1 ); /*Q30*/ } ELSE { - dfRatio_fx = usdequant_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], shr( MAX_16, 1 ), shr( inv_dfRatio_qsteps[dfRatio_qsteps], 1 ) ); // Q15 + IF( EQ_16( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], sub( dfRatio_qsteps, 1 ) ) ) + { + dfRatio_fx = MAX_32; // Q31 + move16(); + dir1ratio_fx = L_sub( ONE_IN_Q30, diffRatio_fx ); // Q30 + } + ELSE + { + dfRatio_fx = usdequant32_fx( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], L_shr( MAX_32, 1 ), L_shr( inv_dfRatio_qsteps[dfRatio_qsteps], 1 ) ); // Q31 + dir1ratio_fx = Mpy_32_32( L_sub( ONE_IN_Q30, diffRatio_fx ), dfRatio_fx ); // Q30 + } - dir1ratio_fx = Mpy_32_16_1( L_sub( ONE_IN_Q30, diffRatio_fx ), dfRatio_fx ); // Q30 - dir2ratio_fx = L_sub( L_sub( ONE_IN_Q30, diffRatio_fx ), dir1ratio_fx ); // Q30 + dir2ratio_fx = L_sub( L_sub( ONE_IN_Q30, diffRatio_fx ), dir1ratio_fx ); // Q30 } /* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */ -- GitLab From 1497f24e8bc2e79aeae636a3430394d5c6828c7b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 16:47:36 +0530 Subject: [PATCH 0534/1310] Clang formatting changes --- lib_com/prot_fx.h | 6 +++--- lib_com/tools_fx.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 912b3b713..9b78b44d8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9970,9 +9970,9 @@ Word16 usdequant_fx( /* Qx*/ ); Word32 usdequant32_fx( /* Qx*/ - const Word16 idx, /* i: quantizer index Q0*/ - const Word32 qlow, /* i: lowest codebook entry (index 0) Qx*/ - const Word32 delta /* i: quantization step Qy*/ + const Word16 idx, /* i: quantizer index Q0*/ + const Word32 qlow, /* i: lowest codebook entry (index 0) Qx*/ + const Word32 delta /* i: quantization step Qy*/ ); Word16 usquant_fx( /* o: index of the winning codeword */ diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index a4c0c5484..14a97a034 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -303,7 +303,7 @@ Word32 usdequant32_fx( /* Qx*/ } ELSE { - g = W_extract_l(L_tmp); /*Qx */ + g = W_extract_l( L_tmp ); /*Qx */ } return ( g ); } -- GitLab From 68e750905d1ede809013fd7fd2a93764f9897fc7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 6 May 2025 21:23:11 +0530 Subject: [PATCH 0535/1310] Fix for 3GPP issue 1449: OMASA Complexity measurement crashes Link #1449 --- lib_enc/ivas_masa_enc_fx.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index ceb5dec1d..9d0579d12 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -2463,19 +2463,23 @@ static void reduce_metadata_further_fx( } /* Determine if to merge over frequency instead of time */ - meanRatio = 0; - move32(); + W_tmp = 0; + move64(); FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { FOR( band = 0; band < numCodingBands; band++ ) { - meanRatio = L_add( meanRatio, Mpy_32_32( hqmetadata->q_direction[0].band_data[band].energy_ratio_fx[sf], energy[sf][band] ) ); // hMasa->data.q_energy - 1 + W_tmp = W_mac_32_16( W_tmp, Mpy_32_32( hqmetadata->q_direction[0].band_data[band].energy_ratio_fx[sf], energy[sf][band] ), 1 ); // hMasa->data.q_energy } } + shift = W_norm( W_tmp ); + meanRatio = W_extract_h( W_shl( W_tmp, shift ) ); // Q:sub( add( hMasa->data.q_energy, shift ), 32 ) + shift = sub( 31, sub( add( hMasa->data.q_energy, shift ), 32 ) ); + IF( totalEnergySum != 0 ) { meanRatio = BASOP_Util_Divide3232_Scale_newton( meanRatio, totalEnergySum, &exp ); - exp = add( add( exp, 1 ), tmp2 ); // 31 - (hMasa->data.q_energy - 1) - 31 - hMasa->data.q_energy - tmp2 => 1 + tmp2 + exp = add( exp, sub( shift, sub( 31, add( hMasa->data.q_energy, tmp2 ) ) ) ); // exp + (shift - (31 - hMasa->data.q_energy - tmp2)) => 1 + tmp2 } ELSE { -- GitLab From 4fc3bd03def4d5cfdc82c15b2772ec97bf5f2c65 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 10:23:34 +0530 Subject: [PATCH 0536/1310] Fix for crash in acelp path --- lib_enc/set_impulse_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/set_impulse_fx.c b/lib_enc/set_impulse_fx.c index 9ad5f4a2c..d4dd73abe 100644 --- a/lib_enc/set_impulse_fx.c +++ b/lib_enc/set_impulse_fx.c @@ -285,10 +285,10 @@ static void convolve_tc_fx( L_sum = L_mult( g[0], h[n] ); /* Qx */ FOR( i = 1; i < len; i++ ) { - L_sum = L_mac( L_sum, g[i], h[n - i] ); /* Qx + 16 */ + L_sum = L_mac_sat( L_sum, g[i], h[n - i] ); /* Qx + 16 */ } - y[n] = round_fx( L_sum ); /* Qx */ + y[n] = round_fx_sat( L_sum ); /* Qx */ } } /*-------------------------------------------------------------------* -- GitLab From e123cac9ebda717c88eb823b15af0d206d4a6e34 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 16:54:37 +0530 Subject: [PATCH 0537/1310] Fix for decoder crash --- lib_dec/swb_tbe_dec_fx.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 890e0e5c8..a541ebf7b 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -618,6 +618,7 @@ void ivas_wb_tbe_dec_fx( move16(); Word32 dummy2[HILBERT_MEM_SIZE]; Word16 f, inc; + Word64 W_tmp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); @@ -853,17 +854,20 @@ void ivas_wb_tbe_dec_fx( move16(); /* restrict this to 21 due to the Q factor requireemnt of the random number generator (keep 1 bit headroom) */ } - prev_pow = 0; - move32(); + W_tmp = 0; + move64(); IF( st_fx->element_mode > EVS_MONO ) { tmp = sub( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 31 + 16 ); - prev_pow = L_shl_sat( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ + W_tmp = L_shl( 1407374848l /*0.00001f Q47*/, tmp ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ } FOR( i = 0; i < L_SHB_LAHEAD / 4; i++ ) { - prev_pow = L_mac0( prev_pow, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /*Q(2*(st_fx->prev_Q_bwe_exc-16))*/ + W_tmp = W_mac_16_16( W_tmp, hBWE_TD->state_syn_shbexc_fx[i], hBWE_TD->state_syn_shbexc_fx[i] ); /*Q(2*(st_fx->prev_Q_bwe_exc-16 + 1))*/ } + exp = W_norm( W_tmp ); + prev_pow = W_extract_h( W_shl( W_tmp, exp ) ); + exp = sub( add( add( shl( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), 1 ), exp ), 32 ); rescale_genWB_mem( st_fx, sub( Q_bwe_exc, st_fx->prev_Q_bwe_exc ) ); @@ -901,7 +905,7 @@ void ivas_wb_tbe_dec_fx( } Lscale = root_a_over_b_fx( curr_pow, shl_r( Q_bwe_exc_ext, 1 ), prev_pow, - shl_r( sub( st_fx->prev_Q_bwe_exc, 16 ), 1 ), &exp ); + exp, &exp ); FOR( i = 0; i < L_SHB_LAHEAD / 4 - 1; i++ ) { -- GitLab From 813cd3820153fdcea08c1f8ff475b87afdf5e1ca Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 7 May 2025 17:52:15 +0530 Subject: [PATCH 0538/1310] Fix for 3GPP issue 1566: Complexity measurement crashes: MC7_1 encoder (core dumped) Link #1566 --- lib_dec/tonalMDCTconcealment_fx.c | 33 +++++-------------- lib_enc/ivas_mc_param_enc_fx.c | 17 ++++++++-- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 5 +-- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index b45b78ad1..5afceff55 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -1563,9 +1563,12 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( move16(); Word32 y = concealment_noise[l]; // concealment_noise_e move32(); - last_block_nrg_correct = L_add( last_block_nrg_correct, Mpy_32_16_1( L_msu( 0, x, fac ), x ) ); // exp = 2 * x_exp + ld - y = L_negate( Mpy_32_32( y, y ) ); // Q31-2* concealment_noise_e - hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, y, 2 * concealment_noise_e, &hTonalMDCTConc->curr_noise_nrg_exp ); // Q31- hTonalMDCTConc->curr_noise_nrg_exp + shift1 = norm_l( y ); + y = L_shl( y, shift1 ); + + last_block_nrg_correct = L_add( last_block_nrg_correct, Mpy_32_16_1( L_msu( 0, x, fac ), x ) ); // exp = 2 * x_exp + ld + y = L_negate( Mpy_32_32( y, y ) ); // Q31-(2* concealment_noise_e + shift1) + hTonalMDCTConc->curr_noise_nrg = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->curr_noise_nrg, hTonalMDCTConc->curr_noise_nrg_exp, y, shl( sub( concealment_noise_e, shift1 ), 1 ), &hTonalMDCTConc->curr_noise_nrg_exp ); // Q31- hTonalMDCTConc->curr_noise_nrg_exp move32(); } } @@ -1631,29 +1634,9 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( /* actual fadeout is done in this case */ ELSE { - Word32 num, den; - Word16 exp_num, exp_den; - - exp_num = cngLevelBackgroundTrace_bfi_e; - move16(); - exp_den = hTonalMDCTConc->curr_noise_nrg_exp; - move16(); + tmp = BASOP_Util_Divide3232_Scale( cngLevelBackgroundTrace_bfi, hTonalMDCTConc->curr_noise_nrg, &exp ); + exp = add( exp, sub( cngLevelBackgroundTrace_bfi_e, hTonalMDCTConc->curr_noise_nrg_exp ) ); - ld = norm_l( cngLevelBackgroundTrace_bfi ); - num = L_shl( cngLevelBackgroundTrace_bfi, ld ); // Q15 - exp_num + ld - exp_num = sub( exp_num, ld ); - ld = norm_l( hTonalMDCTConc->curr_noise_nrg ); - den = L_shl( hTonalMDCTConc->curr_noise_nrg, ld ); // Q15 - exp_den + ld - exp_den = sub( exp_den, ld ); - - exp = sub( exp_num, exp_den ); - - IF( GT_32( num, den ) ) - { - num = L_shr( num, 1 ); // Q31- exp -1 - exp = add( exp, 1 ); - } - tmp = div_l( num, round_fx( den ) ); tmp = Sqrt16( tmp, &exp ); g = mult_r( g, tmp ); // exponent of g = exp diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 22eacdb32..0c996b25a 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -1613,9 +1613,22 @@ static void ivas_param_mc_quantize_ilds_fx( { dmx_ener_fx = BASOP_Util_Add_Mant32Exp( dmx_ener_fx, dmx_ener_e, Cx_fx[k][k], Cx_e[k][k], &dmx_ener_e ); } + /* ener_fac = 10.0f * log10f( ( tot_ener + EPSILON ) / ( dmx_ener + EPSILON ) ); */ + IF( tot_ener_fx == 0 ) + { + tot_ener_fx = 9223; // 1e-15(EPSILON) in Q63 + tot_ener_e = -32; + move32(); + move16(); + } + IF( dmx_ener_fx == 0 ) + { + dmx_ener_fx = 9223; // 1e-15(EPSILON) in Q63 + dmx_ener_e = -32; + move32(); + move16(); + } - tot_ener_fx = BASOP_Util_Add_Mant32Exp( tot_ener_fx, tot_ener_e, EPSILON_FX, 0, &tot_ener_e ); - dmx_ener_fx = BASOP_Util_Add_Mant32Exp( dmx_ener_fx, dmx_ener_e, EPSILON_FX, 0, &dmx_ener_e ); L_tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( tot_ener_fx, dmx_ener_fx, &tmp_e ) ); tmp_e = add( sub( tot_ener_e, dmx_ener_e ), tmp_e ); ener_fac_fx = BASOP_Util_Log10( L_tmp, tmp_e ); // Q25 diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 9212e3d23..622ebf89a 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4016,10 +4016,11 @@ void ivas_lfe_synth_with_filters_fx( } ELSE { + Flag overFlow; lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); - lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp - lfeGain_fx = shl_r( lfeGain_fx, lfeGain_fx_exp ); // Q15 + lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp + lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp, &overFlow ); // Q15 } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { -- GitLab From 30d55ece7594d0b00c20dcb3913bc2fe18b7c57c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 7 May 2025 15:56:39 +0200 Subject: [PATCH 0539/1310] use saturated subtraction in loop --- lib_dec/ivas_binRenderer_internal_fx.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 0709c6b75..313815a58 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1098,20 +1098,24 @@ static void ivas_binaural_obtain_DMX_fx( FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { Word32 foa_const_fx = L_shl( hBinRenderer->hReverb->foa_enc_fx[chIdx][1], 1 ); // Q30 + Word32 one_add_foa_const, one_sub_foa_const; + + one_add_foa_const = L_add( ONE_IN_Q30, foa_const_fx ); // Q30 + one_sub_foa_const = L_sub_sat( ONE_IN_Q30, foa_const_fx ); // Q30 inRealPtr_fx = (Word32 *) &( RealBuffer[chIdx][k][0] ); inImagPtr_fx = (Word32 *) &( ImagBuffer[chIdx][k][0] ); FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - outRealLeftPtr_fx[bandIdx] = L_add( outRealLeftPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], L_add( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 + outRealLeftPtr_fx[bandIdx] = L_add( outRealLeftPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 move32(); - outImagLeftPtr_fx[bandIdx] = L_add( outImagLeftPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], L_add( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 + outImagLeftPtr_fx[bandIdx] = L_add( outImagLeftPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 move32(); - outRealRightPtr_fx[bandIdx] = L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 + outRealRightPtr_fx[bandIdx] = L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 move32(); - outImagRightPtr_fx[bandIdx] = L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], L_sub( ONE_IN_Q30, foa_const_fx ) ) ); // Q_in - 1 + outImagRightPtr_fx[bandIdx] = L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 move32(); } } -- GitLab From 4f13a0afc15a8ebe125bae11a0a395e113b9c242 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 7 May 2025 16:12:26 +0200 Subject: [PATCH 0540/1310] apply clang format --- lib_dec/ivas_binRenderer_internal_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 313815a58..9b7bd86b6 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1100,7 +1100,7 @@ static void ivas_binaural_obtain_DMX_fx( Word32 foa_const_fx = L_shl( hBinRenderer->hReverb->foa_enc_fx[chIdx][1], 1 ); // Q30 Word32 one_add_foa_const, one_sub_foa_const; - one_add_foa_const = L_add( ONE_IN_Q30, foa_const_fx ); // Q30 + one_add_foa_const = L_add( ONE_IN_Q30, foa_const_fx ); // Q30 one_sub_foa_const = L_sub_sat( ONE_IN_Q30, foa_const_fx ); // Q30 inRealPtr_fx = (Word32 *) &( RealBuffer[chIdx][k][0] ); -- GitLab From d39396e9704e0c596a1682ef73c0e161aaa616fd Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 8 May 2025 08:16:01 +0200 Subject: [PATCH 0541/1310] port MR 1335 from float --- lib_com/ivas_dirac_com_fx.c | 4 ++++ lib_com/options.h | 1 + 2 files changed, 5 insertions(+) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index f68b976a7..c3ba55b50 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -578,10 +578,14 @@ ivas_error ivas_dirac_sba_config_fx( { hQMetaData->useLowerBandRes = 0; move16(); +#ifndef NONBE_FIX_973_HODIRAC_BAND_GROUPING IF( hodirac_flag == 0 ) { nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */ } +#else + nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */ +#endif } { diff --git a/lib_com/options.h b/lib_com/options.h index d39d42e25..d8f9a4a67 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -102,6 +102,7 @@ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_935_SBA_REVERB /* FhG: issue 935: fix MSAN error for SBA related to BINAURAL_ROOM_REVERB */ #define FIX_969_USAN_IGF_ARITH /* FhG: issue 969: fix USAN error in igf_sce_dec; same issue as #962 */ +#define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ /* #################### End BASOP porting switches ############################ */ -- GitLab From 6f1d6deeac2513af3b2b32fd3efd99265e39a126 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 8 May 2025 08:35:03 +0200 Subject: [PATCH 0542/1310] remove unintentionally added jobs from Draft pipeline --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f48458c78..cff514a63 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1337,7 +1337,7 @@ build-codec-linux-debugging-make: split-rendering-smoke-test: extends: - .test-job-linux - - .rules-merge-request + - .rules-merge-request-to-main-pc needs: ["build-codec-linux-make"] stage: test script: @@ -1361,7 +1361,7 @@ split-rendering-smoke-test: lc3-wrapper-unit-test: extends: - .test-job-linux - - .rules-merge-request + - .rules-merge-request-to-main-pc needs: ["build-codec-linux-make"] stage: test script: @@ -1376,7 +1376,7 @@ lc3-wrapper-unit-test: split-rendering-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - - .rules-merge-request + - .rules-merge-request-to-main-pc needs: ["build-codec-linux-make"] timeout: "45 minutes" stage: compare -- GitLab From 22a2c05ed8af6fcbed7a33c01c497c358a283f21 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 8 May 2025 08:37:50 +0200 Subject: [PATCH 0543/1310] also remove up-to-date jobs from Draft pls --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cff514a63..5f42dc146 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1047,7 +1047,7 @@ uninterruptible: branch-is-up-to-date-with-target-pre: extends: - - .rules-merge-request + - .rules-merge-request-to-main-pc stage: prevalidate needs: [] tags: @@ -1063,7 +1063,7 @@ branch-is-up-to-date-with-target-pre: branch-is-up-to-date-with-target-post: extends: - - .rules-merge-request + - .rules-merge-request-to-main-pc stage: postvalidate tags: - ivas-basop-linux -- GitLab From 30f81a176096066c1fc65ea263ac2b83b722591b Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 8 May 2025 09:23:21 +0200 Subject: [PATCH 0544/1310] increase timeout of build jobs to be in line with main --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5f42dc146..c16992fdc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1251,6 +1251,7 @@ build-codec-linux-cmake: - .build-job-linux tags: - ivas-basop-linux + timeout: "10 minutes" script: - *print-common-info - *update-scripts-repo @@ -1322,7 +1323,7 @@ build-codec-linux-debugging-make: when: never extends: - .build-job-linux - timeout: "7 minutes" + timeout: "10 minutes" variables: BUILD_WITH_DEBUG_MODE_INFO: "true" script: -- GitLab From eddf4391f0f8d950af6854249e0399f3ec2d39f8 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 8 May 2025 09:56:23 +0200 Subject: [PATCH 0545/1310] dummy commit to trigger CI -- GitLab From 5c45d51c5ba179a99a9e56f371ab255fcf3f87ac Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 10:52:28 +0200 Subject: [PATCH 0546/1310] Add macro FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN to make q_win value variable for the ivas_mdct_core_reconstruct_fx() data path, but not decoder_tcx_ivas_fx() for now. --- lib_com/ivas_prot_fx.h | 4 + lib_com/options.h | 1 + lib_com/prot_fx.h | 13 +- lib_dec/dec_tcx_fx.c | 545 ++++++++++++++++++++++++- lib_dec/er_dec_acelp_fx.c | 8 +- lib_dec/er_dec_tcx_fx.c | 10 + lib_dec/ivas_mct_dec_fx.c | 2 +- lib_dec/ivas_mdct_core_dec_fx.c | 42 +- lib_dec/ivas_post_proc_fx.c | 1 + lib_dec/ivas_stereo_mdct_core_dec_fx.c | 2 +- 10 files changed, 617 insertions(+), 11 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 17566e3cb..5dd11390a 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1582,7 +1582,11 @@ void decoder_tcx_imdct_fx( Word32 x_fx[N_MAX], Word16 q_x, Word16 xn_buf_fx[], +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *q_win, +#else Word16 q_win, +#endif const UWord16 kernelType, /* i : TCX transform kernel type */ const Word16 fUseTns, /* i : flag that is set if TNS data is present */ Word16 synth_fx[], /* i/o: synth[-M..L_frame] */ diff --git a/lib_com/options.h b/lib_com/options.h index 63fe353e0..d86502dfd 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -100,6 +100,7 @@ #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ #define FIX_1348_BIT_PRECISION_IMPROVEMENT +#define FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN #define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD //#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 3c07b8140..8602a331f 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9886,8 +9886,15 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T void IMDCT_ivas_fx( Word32 *x_fx, Word16 q_x, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 *old_syn_overl_fx, + Word16 *Q_old_syn_overl_fx, Word16 *syn_Overl_TDAC_fx, + Word16 *Q_syn_Overl_TDAC_fx, +#else + Word16 *old_syn_overl_fx, + Word16 *syn_Overl_TDAC_fx, +#endif Word16 *xn_buf_fx, const Word16 *tcx_aldo_window_1_fx, const PWord16 *tcx_aldo_window_1_trunc_fx, @@ -9916,7 +9923,11 @@ void IMDCT_ivas_fx( Decoder_State *st, const Word16 fullbandScale, Word16 *acelp_zir_fx, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *q_win); +#else Word16 q_win ); +#endif void v_mult16_fixed( const Word16 x1[], /* i : Input vector 1 */ @@ -10022,7 +10033,7 @@ void ivas_mdct_core_reconstruct_fx( /* o : synthesis @output_FS */ // e_sig Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) const Word16 isParamMC, #endif Word16 q_x, diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index fc8fda9ad..7bbe93ad8 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2575,11 +2575,349 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T } } +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN +static +Word16 IMDCT_ivas_fx_adjust_qwin( + Word16 Q_syn_Overl_TDAC, + Word16 Q_syn_Overl, + Word16 Q_old_syn_Overl, + Word16 Q_old_wtda, + Word16 q_win) +{ + //q_win = s_min( s_min( s_min( s_min( Q_syn_Overl_TDAC , Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ), q_win ); + q_win = s_min( s_min( s_min( Q_syn_Overl_TDAC , Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ); + q_win = s_min ( q_win, -1 ); + q_win = s_max ( q_win, -2 ); + + return q_win; +} + +static +void IMDCT_ivas_fx_rescale( + Word16 *syn_Overl_TDAC, + Word16 *Q_syn_Overl_TDAC, + Word16 *syn_Overl, + Word16 *Q_syn_Overl, + Word16 *old_syn_Overl, + Word16 *Q_old_syn_Overl, + Word16 *old_out_fx, + Word16 *Q_old_wtda, + Word16 q_win, + const Word16 FB_flag +#if 0 + Word16 *synth_buf_fx, + Word16 q_syn +#endif + ) +{ + Word16 oldLength; + + oldLength = L_FRAME32k; + move16(); + if ( FB_flag ) { + oldLength = L_FRAME48k; + move16(); + } + +#if 1 + Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win + *Q_syn_Overl = q_win; + move16(); + Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win + *Q_syn_Overl_TDAC = q_win; + move16(); + Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win + *Q_old_syn_Overl = q_win; + move16(); + + Scale_sig( old_out_fx, oldLength, sub( q_win, *Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win + *Q_old_wtda = q_win; + move16(); +#endif + //Scale_sig( synth_buf_fx, add( add( old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win +} + +static Word16 TCX_MDCT_Inverse_GetScaleFactor( + const Word16 L, /* Q0 */ + Word16 *factor_e /* Q0 */ +) +{ + + Word16 factor; + + IF( EQ_16( L, NORM_MDCT_FACTOR ) ) + { + factor = 32767; + move16(); + *factor_e = 0; + move16(); + } + ELSE IF( EQ_16( L, 2 * NORM_MDCT_FACTOR ) ) + { + factor = 23170; + move16(); + *factor_e = 1; + move16(); + } + ELSE IF( EQ_16( L, 4 * NORM_MDCT_FACTOR ) ) + { + factor = 32767; + move16(); + *factor_e = 1; + move16(); + } + ELSE + { + factor = mult_r( shl( L, 4 ), 26214 /*128.f / NORM_MDCT_FACTOR*/ ); /* 4Q11 */ + *factor_e = 4; + move16(); + + factor = Sqrt16( factor, factor_e ); + } + + return factor; +} + +static +void TCX_MDCT_Inverse_qwin_fx( + Word32 *x, // Q( 31 - x_e ) + Word16 x_e, + Word16 *y, /* Qy */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + const Word16 element_mode,/* Q0 */ + Word16 *q_win +) +{ + + Word16 i, fac, negfac, s; + Word16 L2 = l, R2 = r; + Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; + Word16 fac_e; + (void) element_mode; + L2 = shr( l, 1 ); + R2 = shr( r, 1 ); + + x_e = sub( 15, x_e ); + edct_fx( x, tmp_buf + L2, add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &x_e ); + x_e = sub( 15, x_e ); + + fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); /* exp(fac_e) */ + x_e = add( x_e, fac_e ); + + negfac = negate( fac ); + +#if 1 + IF ( *q_win == -2 ) { + // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); + // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; + s = L_norm_arr( tmp_buf + L2, m + R2 + L2); + *q_win = s_min( sub( s, x_e ), *q_win ); + } +#else + assert( *q_win == 0 || *q_win == -2 ); +#endif + s = add( x_e, *q_win ); + move16(); + + FOR( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ + + move16(); + } + + FOR( i = 0; i < L2; i++ ) + { + y[i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], fac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + Word16 f; + + f = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); + y[L2 + i] = round_fx_sat( L_shl_sat( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + move16(); + y[l + m + R2 - 1 - i] = f; + move16(); + } +} + +static +void TCX_MDST_Inverse_qwin_fx( + Word32 *x, /* exp(x_e) */ + Word16 x_e, + Word16 *y, /* Qx */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + Word16 *q_win +) +{ + + Word16 i, fac, negfac, s; + Word16 L2 = l, R2 = r; + move16(); + move16(); + Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; + Word16 fac_e; + + L2 = shr( l, 1 ); + R2 = shr( r, 1 ); + + x_e = sub( 15, x_e ); + edst_fx( x, tmp_buf + L2, add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &x_e ); + x_e = sub( 15, x_e ); + + fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); + x_e = add( x_e, fac_e ); + + negfac = negate( fac ); + +#if 1 + IF ( *q_win == -2 ) { + // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); + // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; + s = L_norm_arr( tmp_buf + L2, m + R2 + L2); + *q_win = s_min( sub( s, x_e ), *q_win ); + } +#else + assert( *q_win == 0 || *q_win == -2 ); +#endif + s = add( x_e, *q_win ); + move16(); + + FOR( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); /* fold out right end of DCT exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < L2; i++ ) + { + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], negfac ), s ) ); /* negate, fold out left end of DCT exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + Word16 f; + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], fac ), s ) ); + + y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + move16(); + + y[l + m + R2 - 1 - i] = negate( f ); + move16(); + } +} + +/*-------------------------------------------------------------------* + * TCX_MDXT_Inverse_fx() + * + * + *-------------------------------------------------------------------*/ +static +void TCX_MDXT_Inverse_qwin_fx( + const Word32 *x, /* exp(x_e) */ + Word16 x_e, + Word16 *y, /* Qx */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + const UWord16 kernel_type,/* Q0 */ + Word16 *q_win +) +{ + Word16 signLeft; + Word16 signRight; + Word16 i, fac, negfac, s, fac_e; + const Word16 L2 = shr( l, 1 ), R2 = shr( r, 1 ); + Word32 tmp_buf[N_MAX + L_MDCT_OVLP_MAX / 2]; + Word16 f; + + set32_fx( tmp_buf, 0, N_MAX + L_MDCT_OVLP_MAX / 2 ); + + edxt_fx( x, tmp_buf + L2, add( add( L2, m ), R2 ), kernel_type, TRUE ); + + fac = TCX_MDCT_Inverse_GetScaleFactor( add( add( shr( l, 1 ), m ), shr( r, 1 ) ), &fac_e ); + x_e = add( x_e, fac_e ); + + negfac = negate( fac ); + IF( GE_16( kernel_type, MDCT_II ) ) + { + signLeft = negfac; + } + ELSE + { + signLeft = fac; + } + // signRight = ( kernel_type & 1 ? fac : negfac ); + IF( L_and( kernel_type, 1 ) ) + { + signRight = fac; + } + ELSE + { + signRight = negfac; + } + +#if 1 + IF ( *q_win == -2 ) { + // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); + // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; + s = L_norm_arr( tmp_buf + L2, m + R2 + L2); + *q_win = s_min( sub( s, x_e ), *q_win ); + } +#else + assert( *q_win == 0 || *q_win == -2 ); +#endif + s = add( x_e, *q_win ); + move16(); + + FOR( i = 0; i < L2; i++ ) + { + y[i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + m + R2 + i], signLeft ), s ) ); /* fold out the left end exp(fac_e)*/ + } + + FOR( i = 0; i < R2; i++ ) + { + y[l + m + R2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], signRight ), s ) ); /* ...and right end exp(fac_e)*/ + move16(); + } + + FOR( i = 0; i < ( ( L2 + m + R2 ) >> 1 ); i++ ) + { + + f = round_fx( L_shl( Mpy_32_16_1( tmp_buf[L2 + i], negfac ), s ) ); + + y[L2 + i] = round_fx( L_shl( Mpy_32_16_1( tmp_buf[l + m + R2 - 1 - i], negfac ), s ) ); /* time-reverse mid of DCT exp(fac_e)*/ + move16(); + + y[l + m + R2 - 1 - i] = f; + move16(); + } + + return; +} + +#endif + void IMDCT_ivas_fx( Word32 *x_fx, // Q(q_x) Word16 q_x, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *old_syn_overl_fx, // *Q_old_syn_overl_fx + Word16 *Q_old_syn_overl_fx, + Word16 *syn_Overl_TDAC_fx, // *Q_syn_Overl_TDAC_fx + Word16 *Q_syn_Overl_TDAC_fx, +#else Word16 *old_syn_overl_fx, // Q(-2) Word16 *syn_Overl_TDAC_fx, // Q(-2) +#endif Word16 *xn_buf_fx, // Q(-2) const Word16 *tcx_aldo_window_1_fx, // Q(15) const PWord16 *tcx_aldo_window_1_trunc_fx, // Q(15) @@ -2608,7 +2946,11 @@ void IMDCT_ivas_fx( Decoder_State *st, const Word16 fullbandScale, Word16 *acelp_zir_fx, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *pq_win) +#else Word16 q_win ) // Q(-2) +#endif { Word16 i, nz, aldo, w, L_win, L_ola; Word16 win_fx[( L_FRAME_PLUS + L_MDCT_OVLP_MAX ) / 2]; @@ -2617,7 +2959,16 @@ void IMDCT_ivas_fx( Word16 x_e_hdrm; Word32 c; Word16 exp; +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_win = *pq_win; + move16(); + x_e_hdrm = sub( Q16, q_x ); + IF ( q_win == -2 ) { + q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); + } +#else x_e_hdrm = add( q_win, sub( Q16, q_x ) ); +#endif aldo = 0; move16(); @@ -2691,11 +3042,37 @@ void IMDCT_ivas_fx( Word16 L_spec_TCX5_tmp = 0; move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_win_prev; +#endif + FOR( w = 0; w < 2; w++ ) { test(); test(); L_spec_TCX5_tmp = imult1616( w, L_spec_TCX5 ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) + { + TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win ); + } + ELSE IF( ( kernel_type != 0 ) && ( w == 0 ) ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, kernel_type, &q_win ); + } + ELSE + { + TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win ); + } + + if ( w > 0 ) { + assert( q_win_prev == q_win ); + } else { + q_win_prev = q_win; + } + + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); +#else IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) { TCX_MDST_Inverse_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola ); @@ -2708,6 +3085,7 @@ void IMDCT_ivas_fx( { TCX_MDCT_Inverse( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode ); } +#endif tcx_windowing_synthesis_current_frame( win_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, ( w > 0 ) ? 0 : left_rect, ( w > 0 ) || ( w == 0 && index == 2 ) ? MIN_OVERLAP : hTcxCfg->tcx_last_overlap_mode, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, L_win, tcx_offset < 0 ? -tcx_offset : 0, ( w > 0 ) || ( frame_cnt > 0 ) ? 1 : st->last_core, ( w > 0 ) || ( frame_cnt > 0 ) ? 0 : (Word8) st->last_is_cng, fullbandScale ); @@ -2746,6 +3124,23 @@ void IMDCT_ivas_fx( set16_fx( win_fx, 0, shr( add( L_FRAME_PLUS, L_MDCT_OVLP_MAX ), 1 ) ); /* 1st TCX-5 window, special MDCT with minimum overlap on right side */ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_win_prev; + + IF( EQ_16( kernel_type, MDST_IV ) ) + { + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, &q_win ); + } + ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, kernel_type, &q_win ); + } + ELSE + { + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, st->element_mode, &q_win ); + } + q_win_prev = q_win; +#else IF( EQ_16( kernel_type, MDST_IV ) ) { TCX_MDST_Inverse_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola ); @@ -2758,6 +3153,7 @@ void IMDCT_ivas_fx( { TCX_MDCT_Inverse( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, st->element_mode ); } +#endif set16_fx( xn_buf_fx, 0, shr( overlap, 1 ) ); @@ -2765,6 +3161,20 @@ void IMDCT_ivas_fx( Copy( win_fx + L_win, xn_buf_fx + shr( overlap, 1 ), add( L_win, shr( L_ola, 1 ) ) ); /* 2nd TCX-5 window, regular MDCT with minimum overlap on both sides */ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( s_and( kernel_type, 1 ) ) + { + TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win ); + } + ELSE + { + TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win ); + } + + assert( q_win_prev == q_win ); + + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); +#else IF( s_and( kernel_type, 1 ) ) { TCX_MDST_Inverse_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola ); @@ -2773,6 +3183,7 @@ void IMDCT_ivas_fx( { TCX_MDCT_Inverse( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode ); } +#endif tcx_windowing_synthesis_current_frame( win_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, L_ola, tcx_mdct_window_half_length, tcx_mdct_window_min_length, 0, /* left_rect */ MIN_OVERLAP, /* left_mode */ acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, L_win, ( tcx_offset < 0 ) ? -tcx_offset : 0, 1, /* st->last_mode_bfi */ 0, /* st->last_is_cng */ fullbandScale ); @@ -2807,6 +3218,22 @@ void IMDCT_ivas_fx( ELSE { /* default, i.e. maximum overlap, single transform, no grouping */ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( EQ_16( kernel_type, MDST_IV ) ) + { + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, &q_win ); + } + ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, kernel_type, &q_win ); + } + ELSE + { + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode, &q_win ); + } + + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); +#else IF( EQ_16( kernel_type, MDST_IV ) ) { TCX_MDST_Inverse_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap ); @@ -2819,6 +3246,7 @@ void IMDCT_ivas_fx( { TCX_MDCT_Inverse( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode ); } +#endif tcx_windowing_synthesis_current_frame( xn_buf_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, !bfi && ( frame_cnt > 0 ) && ( index == 0 ) && NE_16( st->last_core, ACELP_CORE ) ? MIN_OVERLAP : index, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, shr( L_frame_glob, 1 ), ( tcx_offset < 0 ) ? -tcx_offset : 0, ( frame_cnt > 0 /*|| (st->last_con_tcx )*/ ) ? 1 : st->last_core_bfi, ( frame_cnt > 0 ) ? 0 : (Word8) st->last_is_cng, fullbandScale ); @@ -2864,6 +3292,10 @@ void IMDCT_ivas_fx( q_tmp_fx_32 = q_xn_buf_fx_32; move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); +#endif + Word16 diff = sub( q_tmp_fx_32, q_win ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); @@ -2871,6 +3303,7 @@ void IMDCT_ivas_fx( FOR( Word16 ind = 0; ind < L_frame; ind++ ) { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD + assert( L_shr(L_shl( old_out_fx[ind], q_old_out_diff ), q_old_out_diff ) == old_out_fx[ind] ); old_out_fx_32[ind] = L_shl( old_out_fx[ind], q_old_out_diff ); #else old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff ); @@ -2884,10 +3317,12 @@ void IMDCT_ivas_fx( { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], q_old_out_diff ) ); + assert( extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == 0 ); #else old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) ); #endif xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) ); + assert( extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == 0 ); move16(); move16(); } @@ -2896,8 +3331,8 @@ void IMDCT_ivas_fx( { #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 q_old_out = q_win; -#endif move16(); +#endif edct_fx( x_fx, xn_buf_fx_32 + add( shr( overlap, 1 ), nz ), L_frame, &q_xn_buf_fx_32 ); Word16 res_m, res_e; res_e = 0; @@ -2913,9 +3348,15 @@ void IMDCT_ivas_fx( q_tmp_fx_32 = sub( q_xn_buf_fx_32, res_e ); // v_multc_fixed( xn_buf_fx_32 + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp_fx_32, L_frame ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + // L_norm_arr( xn_buf_fx, L_frame ) + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); +#endif + Word16 q_diff = sub( q_xn_buf_fx_32, q_win ); FOR( Word16 ind = 0; ind < L_frame; ind++ ) { + assert( extract_h( L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], q_diff ) ) == 0 || extract_h( L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], q_diff ) ) == -1 ); xn_buf_fx[( ind + ( overlap / 2 ) ) + nz] = extract_l( L_shr( xn_buf_fx_32[( ind + ( overlap / 2 ) ) + nz], q_diff ) ); move16(); } @@ -2961,7 +3402,23 @@ void IMDCT_ivas_fx( acelp_mem_len = 0; move16(); } +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( EQ_16( kernel_type, MDST_IV ) ) + { + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, &q_win ); + } + ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ + { + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, kernel_type, &q_win ); + } + ELSE + { + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win ); + } + // xn_buf_fx, NULL, L_frame, + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); +#else IF( EQ_16( kernel_type, MDST_IV ) ) { TCX_MDST_Inverse_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap ); @@ -2974,7 +3431,7 @@ void IMDCT_ivas_fx( { TCX_MDCT_Inverse( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode ); } - +#endif /*-----------------------------------------------------------* * Windowing, overlap and add * *-----------------------------------------------------------*/ @@ -3228,6 +3685,10 @@ void IMDCT_ivas_fx( } } } +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + *pq_win = q_win; + move16(); +#endif return; } @@ -3647,6 +4108,52 @@ void decoder_tcx_ivas_fx( decoder_tcx_tns_fx( st, L_frame_glob, L_spec, L_frame, L_frameTCX, x_fx, fUseTns, &tnsData, bfi, frame_cnt, 0, NULL ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Scale_sig32( x_fx, N_MAX, sub( x_e, 20 ) ); // Scaling x_fx to Q11 + Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( st->Q_syn, 14 ) ); // Scaling xn_buf_fx to Q_syn + x_e = sub( 31, 11 ); + + IF( st->igf != 0 ) + { + Scale_sig32( st->hIGFDec->virtualSpec, ( N_MAX_TCX - IGF_START_MN ), ( sub( st->hIGFDec->virtualSpec_e, x_e ) ) ); + st->hIGFDec->virtualSpec_e = x_e; + move16(); + } + +#if 1 + /* Scaling down buffers for decoder_tcx_imdct_fx*/ + Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // Scaling to Q_syn + st->hTcxDec->Q_syn_Overl_TDACFB = st->Q_syn; + Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDAC ) ); // Scaling to Q_syn + st->hTcxDec->Q_syn_Overl_TDAC = st->Q_syn; + Scale_sig( st->hTcxDec->old_syn_Overl, 320, st->Q_syn - st->hTcxDec->Q_old_syn_Overl ); // Scaling to Q_syn + st->hTcxDec->Q_old_syn_Overl = st->Q_syn; +#endif + +#if 1 + Scale_sig( synth_fx, L_frame_glob, st->Q_syn ); // Scaling to Q_syn + Scale_sig( synthFB_fx, L_frameTCX_glob, st->Q_syn ); // Scaling to Q_syn +#endif + + Copy_Scale_sig_16_32_no_sat( st->old_Aq_12_8_fx, st->old_Aq_12_8_fx_32, M + 1, ( sub( 28, ( sub( 15, norm_s( sub( st->old_Aq_12_8_fx[0], 1 ) ) ) ) ) ) ); + + Word16 q_win; + q_win = st->Q_syn; + + decoder_tcx_imdct_fx( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x_fx[0], q_x, xn_buf_fx, &q_win, MDCT_IV, + fUseTns, &synth_fx[0], &synthFB_fx[0], bfi, frame_cnt, sba_dirac_stereo_flag ); + + assert( q_win == 0 ); + + /* Scaling up again */ + Scale_sig( synth_fx, L_frame_glob, sub( st->Q_syn, q_win ) ); + Scale_sig( synthFB_fx, L_frameTCX_glob, sub( st->Q_syn, q_win ) ); + // Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, 1 ); + + Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( -2 - st->hTcxDec->Q_old_syn_Overl ) ); // Scaling to Q-2 + st->hTcxDec->Q_old_syn_Overl = -2; + +#else Scale_sig32( x_fx, N_MAX, sub( x_e, 20 ) ); // Scaling x_fx to Q11 Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( st->Q_syn, 14 ) ); // Scaling xn_buf_fx to Q_syn x_e = sub( 31, 11 ); @@ -3696,6 +4203,7 @@ void decoder_tcx_ivas_fx( #endif Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( -2 - st->hTcxDec->Q_old_syn_Overl ) ); // Scaling to Q-2 st->hTcxDec->Q_old_syn_Overl = -2; +#endif } /*-------------------------------------------------------------------* @@ -5082,7 +5590,11 @@ void decoder_tcx_imdct_fx( Word32 x_fx[N_MAX], // Q(11) Word16 q_x, Word16 xn_buf_fx[], // Q(-2) +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *q_win, +#else Word16 q_win, +#endif const UWord16 kernelType, /* i : TCX transform kernel type */ const Word16 fUseTns, /* i : flag that is set if TNS data is present */ Word16 synth_fx[], // Q(-2) /* i/o: synth[-M..L_frame] */ @@ -5108,7 +5620,9 @@ void decoder_tcx_imdct_fx( Word16 q_a_itf = 15; Word16 x_e = sub( 31, q_x ); move16(); +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 shift_q = sub( q_x, q_win ); +#endif /*-----------------------------------------------------------------* * Initializations @@ -5261,7 +5775,11 @@ void decoder_tcx_imdct_fx( IF( NE_16( st->element_mode, IVAS_CPE_DFT ) && !sba_dirac_stereo_flag ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, +#else IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, +#endif hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, q_win ); @@ -5287,8 +5805,11 @@ void decoder_tcx_imdct_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || ( sba_dirac_stereo_flag != 0 ) ) { Copy32( x_fx, xn_bufFB_fx, s_max( L_spec, s_max( L_frame, L_frameTCX ) ) ); // q_x - +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, +#else IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, +#endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, q_win ); #else @@ -5296,6 +5817,10 @@ void decoder_tcx_imdct_fx( #endif } +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 shift_q = sub( q_x, *q_win ); +#endif + FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { xn_bufFB_fx_16[ind] = extract_l( L_shr( xn_bufFB_fx[ind], shift_q ) ); // q_x @@ -5308,7 +5833,11 @@ void decoder_tcx_imdct_fx( IF( st->element_mode != EVS_MONO ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, +#else IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, +#endif hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_win ); @@ -5318,14 +5847,22 @@ void decoder_tcx_imdct_fx( } ELSE { - +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, +#else IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, +#endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #endif } + +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + shift_q = sub( q_x, *q_win ); +#endif + FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { xn_bufFB_fx[ind] = L_shl( L_deposit_l( xn_bufFB_fx_16[ind] ), shift_q ); // Q_x diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index e30553d38..e1321d9aa 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -1057,10 +1057,10 @@ void con_acelp_fx( move16(); } set16_fx( &hHQ_core->old_out_LB_fx[( W1 + n )], 0, n ); - +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; move16(); - +#endif FOR( i = 0; i < W2; i++ ) { @@ -1105,6 +1105,10 @@ void con_acelp_fx( move16(); lerp( hTcxDec->syn_Overl, hTcxDec->syn_OverlFB, shr( hTcxDec->L_frameTCX, 1 ), shr( st->L_frame, 1 ) ); lerp( hHQ_core->old_out_LB_fx, hHQ_core->old_out_fx, hTcxDec->L_frameTCX, st->L_frame ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; + move16(); +#endif /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */ IF( st->hWIDec != NULL ) diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index e804d2009..e64eb9c38 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -1057,6 +1057,10 @@ void con_tcx_fx( hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hHQ_core->Q_old_wtda_LB = hHQ_core->Q_old_wtda; + move16(); +#endif st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/ move16(); @@ -1947,6 +1951,10 @@ void con_tcx_ivas_fx( lerp( syn + sub( L_frame, shr( L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hTcxDec->Q_old_syn_Overl = Q_syn; + move16(); +#endif Copy( syn + sub( L_frame, n ), hHQ_core->old_out_fx, sub( L_frame, n ) ); /*Q_syn*/ FOR( i = 0; i < W12; i++ ) @@ -2035,8 +2043,10 @@ void con_tcx_ivas_fx( /* update memory for low band */ st->Q_syn = Q_syn; move16(); +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/ st->hTcxDec->Q_old_syn_Overl = -1; +#endif lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index bb985ac7b..4c3b8b782 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -346,7 +346,7 @@ ivas_error ivas_mct_dec_fx( } Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, st_ivas->mc_mode == MC_MODE_PARAMMC, q_output, e_sig ); #else ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, e_sig ); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index d8c64d516..e3ece34ed 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1083,7 +1083,7 @@ void ivas_mdct_core_reconstruct_fx( /* o : synthesis @output_FS */ // e_sig Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) const Word16 isParamMC, #endif Word16 q_x, @@ -1101,12 +1101,16 @@ void ivas_mdct_core_reconstruct_fx( Word16 *synthFB_fx; Word16 q_syn = 0; move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_win = -2; +#else #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_win = -1; #else Word16 q_win = -2; #endif move16(); +#endif /* TCX */ Word16 xn_buf_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; // Q(-2) Word16 tcx_offset[CPE_CHANNELS]; @@ -1125,9 +1129,11 @@ void ivas_mdct_core_reconstruct_fx( bfi = sts[0]->bfi; move16(); +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT if ( isParamMC ) q_win = -2; +#endif #endif /* TNS, ITF, IMDCT and updates */ @@ -1180,10 +1186,16 @@ void ivas_mdct_core_reconstruct_fx( set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); IF( st->core != ACELP_CORE ) { +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win + st->hTcxDec->Q_syn_Overl_TDACFB = q_win; + move16(); Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win + st->hTcxDec->Q_syn_Overl_TDAC = q_win; + move16(); Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win st->hTcxDec->Q_old_syn_Overl = q_win; + move16(); Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( q_win, st->hHQ_core->Q_old_wtda_LB ) ); // Q(st->hHQ_core->Q_old_wtda_LB) -> q_win @@ -1197,6 +1209,13 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win +#endif +#if 0 + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win + Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win + Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win +#endif + FOR( k = 0; k < nSubframes[ch]; k++ ) { init_tcx_info_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch], @@ -1206,6 +1225,18 @@ void ivas_mdct_core_reconstruct_fx( { test(); test(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) + { + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, + MDCT_IV, fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); + } + ELSE + { + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, + st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); + } +#else IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, @@ -1216,9 +1247,14 @@ void ivas_mdct_core_reconstruct_fx( decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } +#endif } ELSE { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + q_win = -2; + move16(); +#endif set16_fx( &synth_fx[k * L_frame[ch]], 0, L_frame[ch] ); set16_fx( &synthFB_fx[k * L_frame[ch]], 0, L_frameTCX[ch] ); /* Note: these buffers are not subframe-based, hence no indexing with k */ @@ -1267,7 +1303,9 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn + st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn + st->hTcxDec->Q_syn_Overl = st->Q_syn; #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn @@ -1278,7 +1316,7 @@ void ivas_mdct_core_reconstruct_fx( #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->mem_syn2_fx, M, sub( -2, q_win ) ); - // Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn + //Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn #endif } ELSE /*ACELP core for ACELP-PLC */ diff --git a/lib_dec/ivas_post_proc_fx.c b/lib_dec/ivas_post_proc_fx.c index 4232116fa..01182a493 100644 --- a/lib_dec/ivas_post_proc_fx.c +++ b/lib_dec/ivas_post_proc_fx.c @@ -112,6 +112,7 @@ void ivas_post_proc_fx( { Word16 numZeros = (Word16) ( NS2SA_FX2( output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/ move16(); + assert( sts[n]->hHQ_core->Q_old_out_fx32 == Q11 ); Copy32( sts[n]->hHQ_core->old_out_fx32 + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/ } diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index fd9398769..e70b1c137 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -550,7 +550,7 @@ void stereo_mdct_core_dec_fx( } Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, st_ivas->mc_mode == MC_MODE_PARAMMC, Q11, e_sigFB ); #else ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, Q11, e_sigFB ); -- GitLab From 6d0bec24880a27f4ee832068dc59b1df82d6c40c Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 10:59:36 +0200 Subject: [PATCH 0547/1310] clang format --- lib_com/prot_fx.h | 2 +- lib_dec/dec_tcx_fx.c | 114 ++++++++++++++++---------------- lib_dec/ivas_mdct_core_dec_fx.c | 8 +-- 3 files changed, 62 insertions(+), 62 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 5d15327a1..a84d0d8dc 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9840,7 +9840,7 @@ void IMDCT_ivas_fx( const Word16 fullbandScale, Word16 *acelp_zir_fx, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 *q_win); + Word16 *q_win ); #else Word16 q_win ); #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 63820a2a9..9ea271b39 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2573,24 +2573,22 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN -static -Word16 IMDCT_ivas_fx_adjust_qwin( +static Word16 IMDCT_ivas_fx_adjust_qwin( Word16 Q_syn_Overl_TDAC, Word16 Q_syn_Overl, Word16 Q_old_syn_Overl, Word16 Q_old_wtda, - Word16 q_win) + Word16 q_win ) { - //q_win = s_min( s_min( s_min( s_min( Q_syn_Overl_TDAC , Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ), q_win ); - q_win = s_min( s_min( s_min( Q_syn_Overl_TDAC , Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ); - q_win = s_min ( q_win, -1 ); - q_win = s_max ( q_win, -2 ); + // q_win = s_min( s_min( s_min( s_min( Q_syn_Overl_TDAC , Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ), q_win ); + q_win = s_min( s_min( s_min( Q_syn_Overl_TDAC, Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ); + q_win = s_min( q_win, -1 ); + q_win = s_max( q_win, -2 ); return q_win; } -static -void IMDCT_ivas_fx_rescale( +static void IMDCT_ivas_fx_rescale( Word16 *syn_Overl_TDAC, Word16 *Q_syn_Overl_TDAC, Word16 *syn_Overl, @@ -2605,33 +2603,34 @@ void IMDCT_ivas_fx_rescale( Word16 *synth_buf_fx, Word16 q_syn #endif - ) +) { Word16 oldLength; oldLength = L_FRAME32k; move16(); - if ( FB_flag ) { + if ( FB_flag ) + { oldLength = L_FRAME48k; move16(); } #if 1 - Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win + Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win *Q_syn_Overl = q_win; move16(); - Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win + Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win *Q_syn_Overl_TDAC = q_win; move16(); - Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win + Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win *Q_old_syn_Overl = q_win; move16(); - Scale_sig( old_out_fx, oldLength, sub( q_win, *Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win + Scale_sig( old_out_fx, oldLength, sub( q_win, *Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win *Q_old_wtda = q_win; move16(); #endif - //Scale_sig( synth_buf_fx, add( add( old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win + // Scale_sig( synth_buf_fx, add( add( old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win } static Word16 TCX_MDCT_Inverse_GetScaleFactor( @@ -2675,17 +2674,15 @@ static Word16 TCX_MDCT_Inverse_GetScaleFactor( return factor; } -static -void TCX_MDCT_Inverse_qwin_fx( +static void TCX_MDCT_Inverse_qwin_fx( Word32 *x, // Q( 31 - x_e ) Word16 x_e, - Word16 *y, /* Qy */ - const Word16 l, /* Q0 */ - const Word16 m, /* Q0 */ - const Word16 r, /* Q0 */ - const Word16 element_mode,/* Q0 */ - Word16 *q_win -) + Word16 *y, /* Qy */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + const Word16 element_mode, /* Q0 */ + Word16 *q_win ) { Word16 i, fac, negfac, s; @@ -2706,10 +2703,11 @@ void TCX_MDCT_Inverse_qwin_fx( negfac = negate( fac ); #if 1 - IF ( *q_win == -2 ) { + IF( *q_win == -2 ) + { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; - s = L_norm_arr( tmp_buf + L2, m + R2 + L2); + s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); *q_win = s_min( sub( s, x_e ), *q_win ); } #else @@ -2743,16 +2741,14 @@ void TCX_MDCT_Inverse_qwin_fx( } } -static -void TCX_MDST_Inverse_qwin_fx( +static void TCX_MDST_Inverse_qwin_fx( Word32 *x, /* exp(x_e) */ Word16 x_e, Word16 *y, /* Qx */ const Word16 l, /* Q0 */ const Word16 m, /* Q0 */ const Word16 r, /* Q0 */ - Word16 *q_win -) + Word16 *q_win ) { Word16 i, fac, negfac, s; @@ -2775,10 +2771,11 @@ void TCX_MDST_Inverse_qwin_fx( negfac = negate( fac ); #if 1 - IF ( *q_win == -2 ) { + IF( *q_win == -2 ) + { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; - s = L_norm_arr( tmp_buf + L2, m + R2 + L2); + s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); *q_win = s_min( sub( s, x_e ), *q_win ); } #else @@ -2817,17 +2814,15 @@ void TCX_MDST_Inverse_qwin_fx( * * *-------------------------------------------------------------------*/ -static -void TCX_MDXT_Inverse_qwin_fx( +static void TCX_MDXT_Inverse_qwin_fx( const Word32 *x, /* exp(x_e) */ Word16 x_e, - Word16 *y, /* Qx */ - const Word16 l, /* Q0 */ - const Word16 m, /* Q0 */ - const Word16 r, /* Q0 */ - const UWord16 kernel_type,/* Q0 */ - Word16 *q_win -) + Word16 *y, /* Qx */ + const Word16 l, /* Q0 */ + const Word16 m, /* Q0 */ + const Word16 r, /* Q0 */ + const UWord16 kernel_type, /* Q0 */ + Word16 *q_win ) { Word16 signLeft; Word16 signRight; @@ -2863,10 +2858,11 @@ void TCX_MDXT_Inverse_qwin_fx( } #if 1 - IF ( *q_win == -2 ) { + IF( *q_win == -2 ) + { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; - s = L_norm_arr( tmp_buf + L2, m + R2 + L2); + s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); *q_win = s_min( sub( s, x_e ), *q_win ); } #else @@ -2907,13 +2903,13 @@ void IMDCT_ivas_fx( Word32 *x_fx, // Q(q_x) Word16 q_x, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 *old_syn_overl_fx, // *Q_old_syn_overl_fx + Word16 *old_syn_overl_fx, // *Q_old_syn_overl_fx Word16 *Q_old_syn_overl_fx, - Word16 *syn_Overl_TDAC_fx, // *Q_syn_Overl_TDAC_fx + Word16 *syn_Overl_TDAC_fx, // *Q_syn_Overl_TDAC_fx Word16 *Q_syn_Overl_TDAC_fx, #else - Word16 *old_syn_overl_fx, // Q(-2) - Word16 *syn_Overl_TDAC_fx, // Q(-2) + Word16 *old_syn_overl_fx, // Q(-2) + Word16 *syn_Overl_TDAC_fx, // Q(-2) #endif Word16 *xn_buf_fx, // Q(-2) const Word16 *tcx_aldo_window_1_fx, // Q(15) @@ -2944,9 +2940,9 @@ void IMDCT_ivas_fx( const Word16 fullbandScale, Word16 *acelp_zir_fx, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 *pq_win) + Word16 *pq_win ) #else - Word16 q_win ) // Q(-2) + Word16 q_win ) // Q(-2) #endif { Word16 i, nz, aldo, w, L_win, L_ola; @@ -2960,7 +2956,8 @@ void IMDCT_ivas_fx( Word16 q_win = *pq_win; move16(); x_e_hdrm = sub( Q16, q_x ); - IF ( q_win == -2 ) { + IF( q_win == -2 ) + { q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); } #else @@ -3062,9 +3059,12 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win ); } - if ( w > 0 ) { + if ( w > 0 ) + { assert( q_win_prev == q_win ); - } else { + } + else + { q_win_prev = q_win; } @@ -3300,7 +3300,7 @@ void IMDCT_ivas_fx( FOR( Word16 ind = 0; ind < L_frame; ind++ ) { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - assert( L_shr(L_shl( old_out_fx[ind], q_old_out_diff ), q_old_out_diff ) == old_out_fx[ind] ); + assert( L_shr( L_shl( old_out_fx[ind], q_old_out_diff ), q_old_out_diff ) == old_out_fx[ind] ); old_out_fx_32[ind] = L_shl( old_out_fx[ind], q_old_out_diff ); #else old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff ); @@ -3413,7 +3413,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win ); } - // xn_buf_fx, NULL, L_frame, + // xn_buf_fx, NULL, L_frame, IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) @@ -4151,8 +4151,8 @@ void decoder_tcx_ivas_fx( st->hTcxDec->Q_old_syn_Overl = -2; #else - Scale_sig32( x_fx, N_MAX, sub( x_e, 20 ) ); // Scaling x_fx to Q11 - Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( st->Q_syn, 14 ) ); // Scaling xn_buf_fx to Q_syn + Scale_sig32( x_fx, N_MAX, sub( x_e, 20 ) ); // Scaling x_fx to Q11 + Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( st->Q_syn, 14 ) ); // Scaling xn_buf_fx to Q_syn x_e = sub( 31, 11 ); IF( st->igf != 0 ) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index e3ece34ed..b1a78b1a8 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1190,10 +1190,10 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win st->hTcxDec->Q_syn_Overl_TDACFB = q_win; move16(); - Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win + Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win st->hTcxDec->Q_syn_Overl_TDAC = q_win; move16(); - Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win + Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( q_win, st->hTcxDec->Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win st->hTcxDec->Q_old_syn_Overl = q_win; move16(); Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( q_win, st->Q_syn ) ); // Q(st->Q_syn) -> q_win @@ -1304,7 +1304,7 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_OverlFB = st->Q_syn; - Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn + Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, q_win ) ); // q_win -> st->Q_syn @@ -1316,7 +1316,7 @@ void ivas_mdct_core_reconstruct_fx( #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->mem_syn2_fx, M, sub( -2, q_win ) ); - //Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn + // Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn #endif } ELSE /*ACELP core for ACELP-PLC */ -- GitLab From d674b7d856e3957e822e76cb06cc1bca57369820 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 11:34:54 +0200 Subject: [PATCH 0548/1310] Correct assert checking for overflow for negative values. --- lib_dec/dec_tcx_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 9ea271b39..cbc5579b6 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3314,12 +3314,12 @@ void IMDCT_ivas_fx( { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], q_old_out_diff ) ); - assert( extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == 0 ); + assert( extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == 0 || extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == -1 ); #else old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) ); #endif xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) ); - assert( extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == 0 ); + assert( extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == 0 || extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == -1 ); move16(); move16(); } -- GitLab From 0288d39e52a9dc7ad3e2d5fcba72a7ddbb4bd332 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 8 May 2025 16:18:54 +0530 Subject: [PATCH 0549/1310] Fix for complexity measurement CI pipeline crashes --- lib_com/gs_noisefill_fx.c | 3 +- lib_com/lpc_tools_fx.c | 2 +- lib_dec/tonalMDCTconcealment_fx.c | 43 ++++++----------------- lib_rend/ivas_objectRenderer_hrFilt_fx.c | 2 +- lib_rend/ivas_objectRenderer_sfx_fx.c | 20 +++++------ lib_rend/ivas_objectRenderer_sources_fx.c | 20 +++++------ lib_rend/ivas_prot_rend_fx.h | 6 ++-- lib_rend/ivas_stat_rend.h | 4 +-- 8 files changed, 40 insertions(+), 60 deletions(-) diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 61aa1333c..1198fb793 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -1418,7 +1418,8 @@ void highband_exc_dct_in_ivas_fx( envelop_modify_fx( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ, *Q_exc, &Q_hb_exc ); #ifdef REMOVE_EVS_DUPLICATES test(); - IF( GT_16( *Q_exc, Q_hb_exc ) && GT_16( element_mode, EVS_MONO ) ) + test(); + IF( GT_16( *Q_exc, Q_hb_exc ) && GT_16( element_mode, EVS_MONO ) && exc_wo_nf != NULL ) #else IF( GT_16( *Q_exc, Q_hb_exc ) ) #endif diff --git a/lib_com/lpc_tools_fx.c b/lib_com/lpc_tools_fx.c index bde05b4f4..1035f017a 100644 --- a/lib_com/lpc_tools_fx.c +++ b/lib_com/lpc_tools_fx.c @@ -1114,7 +1114,7 @@ static void lsp_reorder( { lsp[i] = s_max( lsp[i], lsp_min ); move16(); - lsp_min = add( lsp[i], min_dist ); + lsp_min = add_sat( lsp[i], min_dist ); } /* Reverify the LSF ordering and minimum GAP in the reverse order (security) */ diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index 5afceff55..f33a6c84f 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -450,17 +450,16 @@ void TonalMDCTConceal_SaveFreqSignal_ivas_fx( IF( ( nNewSamples > 0 ) && ( LE_16( nNewSamples, 2 * L_FRAME_MAX ) ) ) { /* Store new data */ - hTonalMDCTConc->last_block_nrg = 0; - move32(); - + Word64 W_tmp = 0; + move64(); FOR( i = 0; i < infoIGFStartLine; i++ ) { - Word16 tmp = extract_h( mdctSpectrum[i] ); - hTonalMDCTConc->last_block_nrg = L_add( hTonalMDCTConc->last_block_nrg, - L_shr( L_mult0( tmp, tmp ), 16 ) ); // Q31-last_block_nrg_exp - move32(); + W_tmp = W_mac_32_16( W_tmp, Mpy_32_32( mdctSpectrum[i], mdctSpectrum[i] ), 1 ); // exp: mdctSpectrum_exp + mdctSpectrum_exp - 1 } - hTonalMDCTConc->last_block_nrg_exp = sub( 31, sub( shl( sub( 15, mdctSpectrum_exp ), 1 ), 16 ) ); + s = W_norm( W_tmp ); + hTonalMDCTConc->last_block_nrg = W_extract_h( W_shl( W_tmp, s ) ); // exp:add( sub( shl( mdctSpectrum_exp, 1 ), s ), 31 ) + move32(); + hTonalMDCTConc->last_block_nrg_exp = add( sub( shl( mdctSpectrum_exp, 1 ), s ), 31 ); move16(); /* Store new data */ @@ -1765,32 +1764,12 @@ void TonalMDCTConceal_InsertNoise_ivas_fx( test(); IF( GT_32( hTonalMDCTConc->faded_signal_nrg, 0 ) && flag ) { - Word16 num_exp, den_exp; - Word32 num, den; + Word16 num_exp; + Word32 num; num = BASOP_Util_Add_Mant32Exp( hTonalMDCTConc->last_block_nrg, hTonalMDCTConc->last_block_nrg_exp, L_negate( last_block_nrg_correct ), last_block_nrg_correct_e, &num_exp ); // Q31-num_exp - - den = hTonalMDCTConc->faded_signal_nrg; // Q31 - hTonalMDCTConc->faded_signal_nrg_exp - move32(); - den_exp = hTonalMDCTConc->faded_signal_nrg_exp; - move16(); - - ld = norm_l( num ); - num = L_shl( num, ld ); // Q31-num_exp + ld - num_exp = sub( num_exp, ld ); - - ld = norm_l( den ); - den = L_shl( den, ld ); // Q31-den_exp + ld - den_exp = sub( den_exp, ld ); - - exp = sub( num_exp, den_exp ); - - IF( GT_32( num, den ) ) - { - num = L_shr( num, 1 ); // Q31- exp -1 - exp = add( exp, 1 ); - } - tmp = div_l( num, extract_h( den ) ); + tmp = BASOP_Util_Divide3232_Scale( num, hTonalMDCTConc->faded_signal_nrg, &exp ); + exp = add( exp, sub( num_exp, hTonalMDCTConc->faded_signal_nrg_exp ) ); tmp = Sqrt16( tmp, &exp ); FOR( i = 0; i < crossOverFreq; i++ ) diff --git a/lib_rend/ivas_objectRenderer_hrFilt_fx.c b/lib_rend/ivas_objectRenderer_hrFilt_fx.c index 30bf8f00a..a098aaa25 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt_fx.c +++ b/lib_rend/ivas_objectRenderer_hrFilt_fx.c @@ -97,7 +97,7 @@ ivas_error TDREND_REND_RenderSourceHRFilt_fx( TDREND_firfilt_fx( RightOutputFrame_fx, Src_p->hrf_right_prev_fx, right_filter_e, hrf_right_delta_fx, intp_count, Src_p->mem_hrf_right_fx, subframe_length, Src_p->filterlength, Src_p->Gain_fx, Src_p->prevGain_fx ); Src_p->prevGain_fx = Src_p->Gain_fx; - move16(); + move32(); /* Copy to accumulative output frame */ v_add_32( LeftOutputFrame_fx, output_buf_fx[0], output_buf_fx[0], subframe_length ); // Same Q as Src_p->InputFrame_p_fx Q11 diff --git a/lib_rend/ivas_objectRenderer_sfx_fx.c b/lib_rend/ivas_objectRenderer_sfx_fx.c index 210706d5b..a570273cf 100644 --- a/lib_rend/ivas_objectRenderer_sfx_fx.c +++ b/lib_rend/ivas_objectRenderer_sfx_fx.c @@ -278,8 +278,8 @@ void TDREND_firfilt_fx( Word32 *mem_fx, /* i/o: filter memory Qx */ const Word16 subframe_length, /* i : Length of signal Q0 */ const Word16 filterlength, /* i : Filter length Q0 */ - const Word16 Gain_fx, /* i : Gain Q14 */ - const Word16 prevGain_fx /* i : Previous gain Q14 */ + const Word32 Gain_fx, /* i : Gain Q30 */ + const Word32 prevGain_fx /* i : Previous gain Q30 */ ) { /* NOTE: this function is implemented with the assumption that the exponent/Q-factor of input signal will not change. */ @@ -289,15 +289,15 @@ void TDREND_firfilt_fx( Word32 *p_filter_fx; // exp(filter_e) Word16 i, j; Word32 tmp_fx; - Word16 step_fx /* Q15 */, gain_tmp_fx /* Q15 */, gain_delta_fx /* Q14 */; + Word32 step_fx /* Q31 */, gain_tmp_fx /* Q31 */, gain_delta_fx /* Q30 */; Word16 tmp_e; Word64 tmp64_fx; - gain_delta_fx = sub( Gain_fx, prevGain_fx ); // Q14 - step_fx = BASOP_Util_Divide1616_Scale( gain_delta_fx, subframe_length, &tmp_e ); // exp(tmp_e) - tmp_e = sub( tmp_e, Q14 ); - step_fx = shl_sat( step_fx, tmp_e ); // Q15 - gain_tmp_fx = shl_sat( prevGain_fx, 1 ); // Q15 + gain_delta_fx = L_sub( Gain_fx, prevGain_fx ); // Q30 + step_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( gain_delta_fx, subframe_length, &tmp_e ) ); // exp(tmp_e) + tmp_e = sub( tmp_e, Q30 ); + step_fx = L_shl_sat( step_fx, tmp_e ); // Q31 + gain_tmp_fx = L_shl_sat( prevGain_fx, 1 ); // Q31 /* Handle memory */ p_signal_fx = buffer_fx + sub( filterlength, 1 ); // Qx @@ -328,8 +328,8 @@ void TDREND_firfilt_fx( tmp_fx = W_extract_h( tmp64_fx ); // Qx /* Apply linear gain interpolation in case of abrupt gain changes */ - gain_tmp_fx = add( gain_tmp_fx, step_fx ); // Q15 - signal_fx[i] = Mpy_32_16_1( tmp_fx, gain_tmp_fx ); // Qx + gain_tmp_fx = L_add_sat( gain_tmp_fx, step_fx ); /* Saturating values which just exceeds 1, Q31*/ + signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx move32(); IF( LT_16( i, intp_count ) ) { diff --git a/lib_rend/ivas_objectRenderer_sources_fx.c b/lib_rend/ivas_objectRenderer_sources_fx.c index 7e35b80b2..cdb2d9847 100644 --- a/lib_rend/ivas_objectRenderer_sources_fx.c +++ b/lib_rend/ivas_objectRenderer_sources_fx.c @@ -275,8 +275,8 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( /* o : Length of filters */ // Q0 Word16 *itd, /* o : ITD value */ // Q0 - Word16 *Gain, - /* o : Gain value */ // Q14 + Word32 *Gain, + /* o : Gain value */ // Q30 TDREND_SRC_t *Src_p, /* i/o: Source pointer */ const Word16 subframe_update_flag ) { @@ -368,8 +368,8 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( /* Update total gains */ - *Gain = extract_h( L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ) ); // Q14 - move16(); + *Gain = L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ); // Q30 + move32(); /* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ Word32 ele_tmp = Src_p->elev_prev_fx; // Q22 move32(); @@ -417,8 +417,8 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( { *itd = 0; // Q0 move16(); - *Gain = ONE_IN_Q14; // Q14 - move16(); + *Gain = ONE_IN_Q30; // Q30 + move32(); set32_fx( hrf_left, 0, *filterlength ); set32_fx( hrf_right, 0, *filterlength ); hrf_left[0] = L_shr( L_add( SrcSpatial_p->Pos_p_fx[1], ONE_IN_Q25 ), 1 ); // Q25 @@ -886,9 +886,9 @@ void TDREND_SRC_Init_fx( move32(); Src_p->elev_prev_fx = 0; // Q22 move32(); - Src_p->Gain_fx = ONE_IN_Q14; // Q14 - move16(); - Src_p->prevGain_fx = ONE_IN_Q14; // Q14 - move16(); + Src_p->Gain_fx = ONE_IN_Q30; // Q30 + move32(); + Src_p->prevGain_fx = ONE_IN_Q30; // Q30 + move32(); return; } diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 983c814aa..7cd547cb8 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -755,7 +755,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( Word16 *intp_count, /* o : Interpolation count */ Word16 *filterlength, /* o : Length of filters */ Word16 *itd, /* o : ITD value */ - Word16 *Gain, /* o : Gain value */ + Word32 *Gain, /* o : Gain value Q30 */ TDREND_SRC_t *Src_p, /* i/o: Source pointer */ const Word16 subframe_update_flag); @@ -842,8 +842,8 @@ void TDREND_firfilt_fx( Word32 *mem_fx, /* i/o: filter memory Qx */ const Word16 subframe_length, /* i : Length of signal */ const Word16 filterlength, /* i : Filter length */ - const Word16 Gain_fx, /* i : Gain Q14 */ - const Word16 prevGain_fx /* i : Previous gain Q14 */ + const Word32 Gain_fx, /* i : Gain Q30 */ + const Word32 prevGain_fx /* i : Previous gain Q30 */ ); diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 17474bfe7..90e4f5d69 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1259,8 +1259,8 @@ typedef struct Word16 hrf_right_prev_e; Word32 azim_prev_fx; Word32 elev_prev_fx; - Word16 Gain_fx; // Q14 - Word16 prevGain_fx; // Q14 + Word32 Gain_fx; // Q30 + Word32 prevGain_fx; // Q30 } TDREND_SRC_t; -- GitLab From 4b492033ebd8e2f8991d4c4275a86de83889ad41 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 15:15:42 +0200 Subject: [PATCH 0550/1310] Avoid throwing assert, the actual problems will be fixed in a next change. --- lib_dec/dec_tcx_fx.c | 130 ++++++++++++++++++++++++++++++++----------- 1 file changed, 98 insertions(+), 32 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index cbc5579b6..807e39202 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2588,6 +2588,41 @@ static Word16 IMDCT_ivas_fx_adjust_qwin( return q_win; } +static Word16 IMDCT_ivas_fx_calc_qwin( + Word16 *syn_Overl_TDAC, + Word16 Q_syn_Overl_TDAC, + Word16 *syn_Overl, + Word16 Q_syn_Overl, + Word16 *old_syn_Overl, + Word16 Q_old_syn_Overl, + Word16 *old_out_fx, + Word16 Q_old_out_fx, + const Word16 FB_flag, + Word16 q_win ) +{ + Word16 oldLength; + + oldLength = L_FRAME32k; + move16(); + if ( FB_flag ) + { + oldLength = L_FRAME48k; + move16(); + } + q_win = 2; + move16(); + + // q_win == norm + Q_syn_Overl_TDAC + q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, oldLength / 2 ) + Q_syn_Overl_TDAC); + q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); + q_win = s_min( q_win, norm_arr( old_syn_Overl, oldLength / 2 ) + Q_old_syn_Overl ); + q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); + + //q_win = sub( q_win, 1 ); + + return q_win; +} + static void IMDCT_ivas_fx_rescale( Word16 *syn_Overl_TDAC, Word16 *Q_syn_Overl_TDAC, @@ -2596,7 +2631,7 @@ static void IMDCT_ivas_fx_rescale( Word16 *old_syn_Overl, Word16 *Q_old_syn_Overl, Word16 *old_out_fx, - Word16 *Q_old_wtda, + Word16 *Q_old_out_fx, Word16 q_win, const Word16 FB_flag #if 0 @@ -2616,18 +2651,17 @@ static void IMDCT_ivas_fx_rescale( } #if 1 - Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win - *Q_syn_Overl = q_win; - move16(); Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win *Q_syn_Overl_TDAC = q_win; move16(); + Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win + *Q_syn_Overl = q_win; + move16(); Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win *Q_old_syn_Overl = q_win; move16(); - - Scale_sig( old_out_fx, oldLength, sub( q_win, *Q_old_wtda ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win - *Q_old_wtda = q_win; + Scale_sig( old_out_fx, oldLength, sub( q_win, *Q_old_out_fx ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win + *Q_old_out_fx = q_win; move16(); #endif // Scale_sig( synth_buf_fx, add( add( old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win @@ -2682,7 +2716,8 @@ static void TCX_MDCT_Inverse_qwin_fx( const Word16 m, /* Q0 */ const Word16 r, /* Q0 */ const Word16 element_mode, /* Q0 */ - Word16 *q_win ) + Word16 *q_win, + Word16 allow_qwin_change ) { Word16 i, fac, negfac, s; @@ -2703,7 +2738,7 @@ static void TCX_MDCT_Inverse_qwin_fx( negfac = negate( fac ); #if 1 - IF( *q_win == -2 ) + IF( allow_qwin_change ) { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; @@ -2748,7 +2783,8 @@ static void TCX_MDST_Inverse_qwin_fx( const Word16 l, /* Q0 */ const Word16 m, /* Q0 */ const Word16 r, /* Q0 */ - Word16 *q_win ) + Word16 *q_win, + Word16 allow_qwin_change ) { Word16 i, fac, negfac, s; @@ -2771,7 +2807,7 @@ static void TCX_MDST_Inverse_qwin_fx( negfac = negate( fac ); #if 1 - IF( *q_win == -2 ) + IF( allow_qwin_change ) { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; @@ -2822,7 +2858,8 @@ static void TCX_MDXT_Inverse_qwin_fx( const Word16 m, /* Q0 */ const Word16 r, /* Q0 */ const UWord16 kernel_type, /* Q0 */ - Word16 *q_win ) + Word16 *q_win, + Word16 allow_qwin_change ) { Word16 signLeft; Word16 signRight; @@ -2858,7 +2895,7 @@ static void TCX_MDXT_Inverse_qwin_fx( } #if 1 - IF( *q_win == -2 ) + IF( allow_qwin_change ) { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); // q_win = L_norm_arr(tmp_buf, , *q_win ) - x_e; @@ -2954,11 +2991,19 @@ void IMDCT_ivas_fx( Word16 exp; #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win = *pq_win; + Word16 allow_qwin_change = 1; + move16(); move16(); x_e_hdrm = sub( Q16, q_x ); - IF( q_win == -2 ) + IF( *pq_win == 0 ) { - q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); + allow_qwin_change = 0; + } + IF ( allow_qwin_change ) + { + //q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); + q_win = IMDCT_ivas_fx_calc_qwin( syn_Overl_TDAC_fx, *Q_syn_Overl_TDAC_fx, old_syn_overl_fx, *Q_old_syn_overl_fx, + hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, FB_flag, q_win ); } #else x_e_hdrm = add( q_win, sub( Q16, q_x ) ); @@ -3038,6 +3083,14 @@ void IMDCT_ivas_fx( move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win_prev; +#if 0 + IF ( allow_qwin_change ) { + q_win = -2; + move16(); + allow_qwin_change = 0; + move16(); + } +#endif #endif FOR( w = 0; w < 2; w++ ) @@ -3048,20 +3101,24 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) { - TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win ); + TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, allow_qwin_change ); } ELSE IF( ( kernel_type != 0 ) && ( w == 0 ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, kernel_type, &q_win ); + TCX_MDXT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win ); + TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } if ( w > 0 ) { - assert( q_win_prev == q_win ); + //assert( q_win_prev == q_win ); + if ( q_win_prev != q_win ) { + extern int frame; + printf("\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); + } } else { @@ -3126,15 +3183,15 @@ void IMDCT_ivas_fx( IF( EQ_16( kernel_type, MDST_IV ) ) { - TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, &q_win ); + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, &q_win, allow_qwin_change ); } ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, kernel_type, &q_win ); + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, st->element_mode, &q_win ); + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } q_win_prev = q_win; #else @@ -3161,11 +3218,11 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( s_and( kernel_type, 1 ) ) { - TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win ); + TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, 0 ); } ELSE { - TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win ); + TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, 0 ); } assert( q_win_prev == q_win ); @@ -3218,15 +3275,15 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( EQ_16( kernel_type, MDST_IV ) ) { - TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, &q_win ); + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, &q_win, allow_qwin_change ); } ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, kernel_type, &q_win ); + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode, &q_win ); + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode, &q_win, allow_qwin_change ); } IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); @@ -3290,6 +3347,7 @@ void IMDCT_ivas_fx( move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + // L_norm_arr(xn_buf_fx_32, ) IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif @@ -3346,7 +3404,16 @@ void IMDCT_ivas_fx( // v_multc_fixed( xn_buf_fx_32 + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp_fx_32, L_frame ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - // L_norm_arr( xn_buf_fx, L_frame ) + if ( allow_qwin_change) { +#if 1 + // sub( q_xn_buf_fx_32, q_win ) == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) + // q_xn_buf_fx_32 - q_win == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) + // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 + q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 1 ); +#else + q_win = -2; +#endif + } IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif @@ -3402,18 +3469,17 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( EQ_16( kernel_type, MDST_IV ) ) { - TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, &q_win ); + TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, &q_win, allow_qwin_change ); } ELSE IF( NE_16( kernel_type, MDCT_IV ) ) /* type 1 or 2 */ { - TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, kernel_type, &q_win ); + TCX_MDXT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, kernel_type, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win ); + TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win, allow_qwin_change ); } - // xn_buf_fx, NULL, L_frame, IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) -- GitLab From 5efbe4bdf5f5c6bad2f6fcafd3c7ed6e02fb236d Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 15:27:02 +0200 Subject: [PATCH 0551/1310] clang format --- lib_dec/dec_tcx_fx.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 807e39202..d506b508e 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2613,12 +2613,12 @@ static Word16 IMDCT_ivas_fx_calc_qwin( move16(); // q_win == norm + Q_syn_Overl_TDAC - q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, oldLength / 2 ) + Q_syn_Overl_TDAC); + q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, oldLength / 2 ) + Q_syn_Overl_TDAC ); q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); q_win = s_min( q_win, norm_arr( old_syn_Overl, oldLength / 2 ) + Q_old_syn_Overl ); q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); - //q_win = sub( q_win, 1 ); + // q_win = sub( q_win, 1 ); return q_win; } @@ -2999,9 +2999,9 @@ void IMDCT_ivas_fx( { allow_qwin_change = 0; } - IF ( allow_qwin_change ) + IF( allow_qwin_change ) { - //q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); + // q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); q_win = IMDCT_ivas_fx_calc_qwin( syn_Overl_TDAC_fx, *Q_syn_Overl_TDAC_fx, old_syn_overl_fx, *Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, FB_flag, q_win ); } @@ -3114,10 +3114,11 @@ void IMDCT_ivas_fx( if ( w > 0 ) { - //assert( q_win_prev == q_win ); - if ( q_win_prev != q_win ) { + // assert( q_win_prev == q_win ); + if ( q_win_prev != q_win ) + { extern int frame; - printf("\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); + printf( "\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); } } else @@ -3404,7 +3405,8 @@ void IMDCT_ivas_fx( // v_multc_fixed( xn_buf_fx_32 + overlap / 2 + nz, (float) sqrt( (float) L_frame / NORM_MDCT_FACTOR ), tmp_fx_32, L_frame ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - if ( allow_qwin_change) { + if ( allow_qwin_change ) + { #if 1 // sub( q_xn_buf_fx_32, q_win ) == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_xn_buf_fx_32 - q_win == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) -- GitLab From c5db649c54963696a26009fbb76b9997968f0fa0 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 16:32:39 +0200 Subject: [PATCH 0552/1310] Fix warning, causing error in pipeline. --- lib_dec/dec_tcx_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index d506b508e..9b45460d5 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2573,6 +2573,7 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN +#if 0 static Word16 IMDCT_ivas_fx_adjust_qwin( Word16 Q_syn_Overl_TDAC, Word16 Q_syn_Overl, @@ -2587,6 +2588,7 @@ static Word16 IMDCT_ivas_fx_adjust_qwin( return q_win; } +#endif static Word16 IMDCT_ivas_fx_calc_qwin( Word16 *syn_Overl_TDAC, -- GitLab From 93c1ca20e5f1379866686d2805462f6fb19d6b17 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 16:37:24 +0200 Subject: [PATCH 0553/1310] Fix error in debug printf that happens in pipeline but not locally. --- lib_dec/dec_tcx_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 9b45460d5..051d03828 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3116,12 +3116,13 @@ void IMDCT_ivas_fx( if ( w > 0 ) { - // assert( q_win_prev == q_win ); +#if 0 if ( q_win_prev != q_win ) { extern int frame; printf( "\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); } +#endif } else { -- GitLab From 317c692ac28e249f58792b12c4f706958bd711dc Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 8 May 2025 16:41:44 +0200 Subject: [PATCH 0554/1310] Fix warning, causing error in pipeline. --- lib_dec/dec_tcx_fx.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 051d03828..1702a5fb5 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3116,13 +3116,12 @@ void IMDCT_ivas_fx( if ( w > 0 ) { -#if 0 if ( q_win_prev != q_win ) { - extern int frame; - printf( "\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); + // extern int frame; + // printf( "\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); + printf( "\nWarning: q_win changed in TCX5. Frame X, q_win %d %d\n", q_win_prev, q_win ); } -#endif } else { -- GitLab From 65394e1eb1ba66c3eacba3befa501f54a18a68de Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 9 May 2025 10:56:20 +0200 Subject: [PATCH 0555/1310] fix for correct float ref setting in check-be branches --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c16992fdc..27535f94c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1468,6 +1468,7 @@ check-be-to-target-short-enc-0db: - .rules-mr-to-main-or-main-pc - .test-job-linux before_script: + - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_DECODER_PATH=./IVAS_dec_ref - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref @@ -1481,6 +1482,7 @@ check-be-to-target-short-enc-+10db: - .rules-mr-to-main-or-main-pc - .test-job-linux before_script: + - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_DECODER_PATH=./IVAS_dec_ref - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref @@ -1494,6 +1496,7 @@ check-be-to-target-short-enc--10db: - .rules-mr-to-main-or-main-pc - .test-job-linux before_script: + - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_DECODER_PATH=./IVAS_dec_ref - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref @@ -1507,6 +1510,7 @@ check-be-to-target-short-dec-0db: - .rules-mr-to-main-or-main-pc - .test-job-linux before_script: + - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_ENCODER_PATH=./IVAS_cod_ref - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref @@ -1520,6 +1524,7 @@ check-be-to-target-short-dec-+10db: - .rules-mr-to-main-or-main-pc - .test-job-linux before_script: + - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_ENCODER_PATH=./IVAS_cod_ref - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref @@ -1533,6 +1538,7 @@ check-be-to-target-short-dec--10db: - .rules-mr-to-main-or-main-pc - .test-job-linux before_script: + - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_ENCODER_PATH=./IVAS_cod_ref - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref -- GitLab From a4db18ff59700dd91b92e6cb01e6b71d396b36f2 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 12 May 2025 10:51:16 +0200 Subject: [PATCH 0556/1310] Fix assert becaus of ininitialized hTcxDec->Q_syn_OverlFB --- lib_dec/core_dec_init_fx.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index eb34e1bc1..3ddecdbd5 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -2090,6 +2090,11 @@ void reset_tcx_overl_buf_fx( set16_fx( hTcxDec->syn_Overl, 0, L_FRAME32k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ hTcxDec->Q_syn_Overl = 0; move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + set16_fx( hTcxDec->syn_OverlFB, 0, L_FRAME48k / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ + hTcxDec->Q_syn_OverlFB = 0; + move16(); +#endif set16_fx( hTcxDec->syn_Overl_TDACFB, 0, L_FRAME_MAX / 2 ); /*HQ-CORE(bfi)->TCX don't need it*/ hTcxDec->Q_syn_Overl_TDACFB = 0; move16(); -- GitLab From e155b386f761bcf00066746bb25a1e599dce4efa Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 12 May 2025 14:56:02 +0530 Subject: [PATCH 0557/1310] Fix for 3GPP issue 1574: Complexity measurement crashes: ISM Link #1574 --- lib_dec/swb_tbe_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index a541ebf7b..83c229a6b 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -6468,7 +6468,7 @@ void ivas_swb_tbe_dec_fx( exp_ener = norm_s( ener_fx ); tmp = shl( ener_fx, exp_ener ); /*Q(2+exp)*/ inv_ener = div_s( 16384, tmp ); /*Q(15+14-2-exp)*/ - prev_ener_ratio_fx = L_shr( L_mult0( st->prev_ener_shb_fx, inv_ener ), add( sub( 9, exp_ener ), 1 ) ); /*Q: 1+27-exp-9+exp-1 = 18 */ + prev_ener_ratio_fx = L_shr_sat( L_mult0( st->prev_ener_shb_fx, inv_ener ), add( sub( 9, exp_ener ), 1 ) ); /*Q: 1+27-exp-9+exp-1 = 18 */ } IF( EQ_16( st->nbLostCmpt, 1 ) ) -- GitLab From 9dfd2133c045d7e5a0e3e8d465e78295ad0b2dc6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 12 May 2025 15:01:49 +0530 Subject: [PATCH 0558/1310] Clang formatting changes --- lib_dec/swb_tbe_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 83c229a6b..bd8700063 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -6466,8 +6466,8 @@ void ivas_swb_tbe_dec_fx( { ener_fx = s_max( 1, ener_fx ); exp_ener = norm_s( ener_fx ); - tmp = shl( ener_fx, exp_ener ); /*Q(2+exp)*/ - inv_ener = div_s( 16384, tmp ); /*Q(15+14-2-exp)*/ + tmp = shl( ener_fx, exp_ener ); /*Q(2+exp)*/ + inv_ener = div_s( 16384, tmp ); /*Q(15+14-2-exp)*/ prev_ener_ratio_fx = L_shr_sat( L_mult0( st->prev_ener_shb_fx, inv_ener ), add( sub( 9, exp_ener ), 1 ) ); /*Q: 1+27-exp-9+exp-1 = 18 */ } -- GitLab From 8b5de0a80364e7b3dc2ed03fd0fd0a19ef9d4f90 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 12 May 2025 18:04:32 +0530 Subject: [PATCH 0559/1310] Fix for 3GPP issue 1337: energy mismatch when switching from ACELP to TCX Link #1337 --- lib_enc/swb_pre_proc_fx.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c index 8991696e6..0e89e16c1 100644 --- a/lib_enc/swb_pre_proc_fx.c +++ b/lib_enc/swb_pre_proc_fx.c @@ -1068,8 +1068,9 @@ void swb_pre_proc_ivas_fx( { Word16 out_start_ind, out_end_ind; stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, new_swb_speech_fx, &out_start_ind, &out_end_ind, st->idchan, input_Fs, 32000, 0, NULL ); - Copy_Scale_sig32_16( new_swb_speech_fx - STEREO_DFT_OVL_MAX, new_swb_speech - STEREO_DFT_OVL_MAX, L_FRAME48k + STEREO_DFT_OVL_MAX, add( q_reImBuffer, 1 ) ); // Q0 - Copy( new_swb_speech - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE32k ); // Q0 + Copy_Scale_sig32_16( new_swb_speech_fx - STEREO_DFT_OVL_MAX, new_swb_speech - STEREO_DFT_OVL_MAX, L_FRAME48k + STEREO_DFT_OVL_MAX, add( st->q_inp, add( q_reImBuffer, 1 ) ) ); // st->q_inp + + Copy( new_swb_speech - Sample_Delay_SWB_BWE32k, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE32k ); // st->q_inp } } } -- GitLab From 9aa816c470adf5b4a65d64f6c13edb2637f67f78 Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Mon, 12 May 2025 15:13:34 +0200 Subject: [PATCH 0560/1310] Fix 1511 - POC renorm cleaned and tuned. --- lib_com/options.h | 3 +- lib_enc/ivas_stereo_dmx_evs_fx.c | 189 ++++++++++--------------------- 2 files changed, 58 insertions(+), 134 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1ca29ab76..fb32b2240 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,8 +95,7 @@ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ #define VEC_ARITH_OPT_v1 #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ -#define FIX_1511_RENORM -#define FIX_1511_WMOPS +#define FIX_1511_POC_RENORM /* NTT: Fix for issue 1511: Renorm for POC. */ #define TEST_HR #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 21f5f48aa..36315d2ed 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -98,6 +98,11 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 +#ifdef FIX_1511_POC_RENORM +#define STEREO_DMX_EVS_POC_RENORM_TH 33554432 // 65536 << 9 +#define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 +#endif + const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, @@ -223,10 +228,6 @@ void estimate_itd_wnd_fft_fx( Word16 step, bias; Word16 rshift; -#ifdef FIX_1511_WMOPS - push_wmops("estimate_itd_wnd_fft_fx"); -#endif - n0 = shr( input_frame, 1 ); IF( EQ_16( input_frame, L_FRAME16k ) ) { @@ -273,10 +274,6 @@ void estimate_itd_wnd_fft_fx( speci[n0] = 0; move32(); -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return; } @@ -330,10 +327,6 @@ static void calc_poc_fx( Word64 W_tmp; Word16 W_tmp_q; -#ifdef FIX_1511_WMOPS - push_wmops("calc_poc_fx"); -#endif - /* Initialization */ // iN = 1.0f / (float) input_frame; s = hPOC->sin_fx; @@ -424,22 +417,18 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); -#ifdef FIX_1511_RENORM - { - Word32 TH1 = 65536 * 512; - Word16 SHIFT1 = 4; - IF((LT_32(L_abs(Lr), TH1)) && - (LT_32(L_abs(Li), TH1)) && - (LT_32(L_abs(Rr), TH1)) && - (LT_32(L_abs(Ri), TH1))) - { - Lr = L_shl(Lr, SHIFT1); - Li = L_shl(Li, SHIFT1); - Rr = L_shl(Rr, SHIFT1); - Ri = L_shl(Ri, SHIFT1); - } - } -#endif +#ifdef FIX_1511_POC_RENORM + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } +#endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -453,22 +442,18 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); -#ifdef FIX_1511_RENORM - { - Word32 TH1 = 65536 * 512; - Word16 SHIFT1 = 4; - IF((LT_32(L_abs(Lr), TH1)) && - (LT_32(L_abs(Li), TH1)) && - (LT_32(L_abs(Rr), TH1)) && - (LT_32(L_abs(Ri), TH1))) - { - Lr = L_shl(Lr, SHIFT1); - Li = L_shl(Li, SHIFT1); - Rr = L_shl(Rr, SHIFT1); - Ri = L_shl(Ri, SHIFT1); - } - } -#endif +#ifdef FIX_1511_POC_RENORM + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } +#endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -491,22 +476,18 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); -#ifdef FIX_1511_RENORM - { - Word32 TH1 = 65536 * 512; - Word16 SHIFT1 = 4; - IF((LT_32(L_abs(Lr), TH1)) && - (LT_32(L_abs(Li), TH1)) && - (LT_32(L_abs(Rr), TH1)) && - (LT_32(L_abs(Ri), TH1))) - { - Lr = L_shl(Lr, SHIFT1); - Li = L_shl(Li, SHIFT1); - Rr = L_shl(Rr, SHIFT1); - Ri = L_shl(Ri, SHIFT1); - } - } -#endif +#ifdef FIX_1511_POC_RENORM + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } +#endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -519,22 +500,18 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); -#ifdef FIX_1511_RENORM - { - Word32 TH1 = 65536 * 512; - Word16 SHIFT1 = 4; - IF((LT_32(L_abs(Lr), TH1)) && - (LT_32(L_abs(Li), TH1)) && - (LT_32(L_abs(Rr), TH1)) && - (LT_32(L_abs(Ri), TH1))) - { - Lr = L_shl(Lr, SHIFT1); - Li = L_shl(Li, SHIFT1); - Rr = L_shl(Rr, SHIFT1); - Ri = L_shl(Ri, SHIFT1); - } - } -#endif +#ifdef FIX_1511_POC_RENORM + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } +#endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -1207,10 +1184,6 @@ static void calc_poc_fx( } } -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return; } @@ -1231,10 +1204,6 @@ static Word32 find_poc_peak_fx( Word32 Q_fx[CPE_CHANNELS], aQ_fx[CPE_CHANNELS], cQ_fx[CPE_CHANNELS], width_fx, *peak_width_fx, *peakQ_fx, cconfidence_fx, *P_fx, tmpf_fx, eps2_fx; Word16 tmpf_e = 0, eps2_e = 0, Q_e[CPE_CHANNELS], eps_e = 15, peakQ_e[CPE_CHANNELS]; -#ifdef FIX_1511_WMOPS - push_wmops("find_poc_peak_fx"); -#endif - move16(); move16(); move16(); @@ -1525,10 +1494,6 @@ static Word32 find_poc_peak_fx( hPOC->confidence_fx = L_add( cconfidence_var1, L_shl( cconfidence_var2, 1 ) ); // Q31 move32(); -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return hPOC->confidence_fx; } @@ -1554,10 +1519,6 @@ static ivas_error estimate_itd_fx( Word16 rfft_coef_step; ivas_error error; -#ifdef FIX_1511_WMOPS - push_wmops("estimate_itd_fx"); -#endif - error = IVAS_ERR_OK; move32(); @@ -1614,10 +1575,6 @@ static ivas_error estimate_itd_fx( *corr = round_fx( find_poc_peak_fx( hPOC, itd, input_frame, STEREO_DMX_EVS_POC_W_FORGETTING_FX ) ); move16(); -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return error; } @@ -1639,10 +1596,6 @@ static void weighted_ave_fx( Word16 i, len; Word32 gain_tmp_fx = 0, gain_sub_fx; -#ifdef FIX_1511_WMOPS - push_wmops("weighted_ave_fx"); -#endif - move32(); len = shr( input_frame, 4 ); gain_sub_fx = L_sub( gain_fx, old_gain_fx ); @@ -1658,10 +1611,6 @@ static void weighted_ave_fx( move32(); } -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return; } /*-------------------------------------------------------------------* @@ -1682,10 +1631,6 @@ static void calc_energy_fx( Word16 i, adaptlen; Word64 E_fx; -#ifdef FIX_1511_WMOPS - push_wmops("calc_energy_fx"); -#endif - /* Initialization */ E_fx = 0; move32(); @@ -1748,10 +1693,6 @@ static void calc_energy_fx( *energy_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( *energy_fx, ratio_float_fx ), *energy_fx_e, Mpy_32_32( temp32, L_sub( MAX_32, ratio_float_fx ) ), sub( 31, q_temp32 ), energy_fx_e ); move32(); -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return; } @@ -1772,10 +1713,6 @@ static void adapt_gain_fx( Word16 i, len; Word32 gain_tmp_fx, gain_sub_fx; -#ifdef FIX_1511_WMOPS - push_wmops("adapt_gain_fx"); -#endif - len = shr( input_frame, 4 ); // gain_sub = gain - old_gain; gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 @@ -1794,10 +1731,6 @@ static void adapt_gain_fx( move32(); } -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return; } @@ -1827,10 +1760,6 @@ static void create_M_signal_fx( Word16 temp_e; Word16 temp_e_1, temp_e_2; -#ifdef FIX_1511_WMOPS - push_wmops("create_M_signal_fx"); -#endif - /* Initialization */ eps_fx = 1024; // 1024.0f in Q0 move32(); @@ -1896,10 +1825,6 @@ static void create_M_signal_fx( w_prev_fx[2] = amp_mod_fx[1]; move32(); -#ifdef FIX_1511_WMOPS - pop_wmops(); -#endif - return; } @@ -1938,8 +1863,8 @@ void stereo_dmx_evs_enc_fx( Word64 W_tmp; Word16 W_tmp_q; -#ifdef FIX_1511_WMOPS - push_wmops("stereo_dmx_evs_enc_fx"); +#ifdef FIX_1511_POC_RENORM + push_wmops( "stereo_dmx_evs_enc_fx" ); #endif if ( is_binaural ) @@ -2293,8 +2218,8 @@ void stereo_dmx_evs_enc_fx( Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 -#ifdef FIX_1511_WMOPS - pop_wmops(); +#ifdef FIX_1511_POC_RENORM + pop_wmops(); #endif return; -- GitLab From e6a26d0b423fa365fcea4cb29449b557a48a7176 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 12 May 2025 17:56:28 +0200 Subject: [PATCH 0561/1310] Add 2 bits headroom to dynamic q_win calculation as the default static value of q_win did. --- lib_dec/dec_tcx_fx.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 1702a5fb5..0f3688a58 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2611,7 +2611,7 @@ static Word16 IMDCT_ivas_fx_calc_qwin( oldLength = L_FRAME48k; move16(); } - q_win = 2; + q_win = 4; move16(); // q_win == norm + Q_syn_Overl_TDAC @@ -2620,12 +2620,13 @@ static Word16 IMDCT_ivas_fx_calc_qwin( q_win = s_min( q_win, norm_arr( old_syn_Overl, oldLength / 2 ) + Q_old_syn_Overl ); q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); - // q_win = sub( q_win, 1 ); + q_win = s_max( -3, sub( q_win, 2 ) ); return q_win; } static void IMDCT_ivas_fx_rescale( + Decoder_State *st, Word16 *syn_Overl_TDAC, Word16 *Q_syn_Overl_TDAC, Word16 *syn_Overl, @@ -2666,6 +2667,8 @@ static void IMDCT_ivas_fx_rescale( *Q_old_out_fx = q_win; move16(); #endif + Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win + // Scale_sig( synth_buf_fx, add( add( old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win } @@ -3084,8 +3087,9 @@ void IMDCT_ivas_fx( Word16 L_spec_TCX5_tmp = 0; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 q_win_prev; #if 0 + Word16 q_win_prev; +#else IF ( allow_qwin_change ) { q_win = -2; move16(); @@ -3114,6 +3118,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } +#if 0 if ( w > 0 ) { if ( q_win_prev != q_win ) @@ -3122,13 +3127,15 @@ void IMDCT_ivas_fx( // printf( "\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); printf( "\nWarning: q_win changed in TCX5. Frame X, q_win %d %d\n", q_win_prev, q_win ); } + // Rescale both subframes some how ? } else { q_win_prev = q_win; } +#endif - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) { @@ -3230,7 +3237,7 @@ void IMDCT_ivas_fx( assert( q_win_prev == q_win ); - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( s_and( kernel_type, 1 ) ) { @@ -3289,7 +3296,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode, &q_win, allow_qwin_change ); } - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) { @@ -3351,7 +3358,7 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN // L_norm_arr(xn_buf_fx_32, ) - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 diff = sub( q_tmp_fx_32, q_win ); @@ -3418,7 +3425,7 @@ void IMDCT_ivas_fx( q_win = -2; #endif } - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 q_diff = sub( q_xn_buf_fx_32, q_win ); @@ -3484,7 +3491,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win, allow_qwin_change ); } - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) { @@ -4187,7 +4194,7 @@ void decoder_tcx_ivas_fx( move16(); } -#if 1 +#if 0 /* Scaling down buffers for decoder_tcx_imdct_fx*/ Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // Scaling to Q_syn st->hTcxDec->Q_syn_Overl_TDACFB = st->Q_syn; @@ -4197,7 +4204,7 @@ void decoder_tcx_ivas_fx( st->hTcxDec->Q_old_syn_Overl = st->Q_syn; #endif -#if 1 +#if 0 Scale_sig( synth_fx, L_frame_glob, st->Q_syn ); // Scaling to Q_syn Scale_sig( synthFB_fx, L_frameTCX_glob, st->Q_syn ); // Scaling to Q_syn #endif -- GitLab From 0b43f51ad30f134bb73ae4218af27bdb0c6b2610 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 12 May 2025 18:04:18 +0200 Subject: [PATCH 0562/1310] clang format --- lib_dec/dec_tcx_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 0f3688a58..fd9e0ff30 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3090,7 +3090,8 @@ void IMDCT_ivas_fx( #if 0 Word16 q_win_prev; #else - IF ( allow_qwin_change ) { + IF( allow_qwin_change ) + { q_win = -2; move16(); allow_qwin_change = 0; -- GitLab From a965dd81d6b2521322b1d0cecf814f5f44adf576 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 12 May 2025 18:15:48 +0200 Subject: [PATCH 0563/1310] Extend timeout for build jobs --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b3f2be0c3..9f37f50f2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -831,7 +831,7 @@ build-codec-linux-make: when: never extends: - .build-job-linux - timeout: "10 minutes" + timeout: "100 minutes" script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - *activate-Werror-linux @@ -848,7 +848,7 @@ build-codec-linux-instrumented-make: when: never extends: - .build-job-linux - timeout: "10 minutes" + timeout: "100 minutes" script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh @@ -865,7 +865,7 @@ build-codec-linux-debugging-make: when: never extends: - .build-job-linux - timeout: "10 minutes" + timeout: "100 minutes" variables: BUILD_WITH_DEBUG_MODE_INFO: "true" script: -- GitLab From 7079ea23e0d39d93b3998a1f99676a4c8b93b37a Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Tue, 13 May 2025 09:37:25 +0200 Subject: [PATCH 0564/1310] Missing initialization added. --- lib_enc/ivas_stereo_dmx_evs_fx.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 97c53e369..f8731bd0b 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -2756,8 +2756,8 @@ void stereo_dmx_evs_enc_fx( FOR( n = 0; n < fad_len; n++ ) { - p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; - p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add_sat( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 n_fad_cnt = add( n_fad_cnt, 1 ); IF( GE_16( n_fad_cnt, n_fad_r ) ) @@ -3605,6 +3605,13 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = ONE_IN_Q15; hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = ONE_IN_Q15; + move32(); + move32(); + + hStereoDmxEVS->hPHA->n_fad_g = input_frame; + hStereoDmxEVS->hPHA->n_fad_cnt = 0; + move16(); + move16(); #endif -- GitLab From 5f77256c31f9f455f48b343692c6a7b0cae0f062 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 12 May 2025 19:44:36 +0530 Subject: [PATCH 0565/1310] Fix for 3GPP issue 1254: BASOP encoder OSBA 256 kbps: broken signal envelope Link #1254 --- lib_com/ivas_prot_fx.h | 2 +- lib_com/prot_fx.h | 46 ++++++++-------- lib_enc/igf_enc.c | 75 ++++++++++++++++++-------- lib_enc/ivas_mct_core_enc_fx.c | 31 +++++------ lib_enc/ivas_mct_enc_mct_fx.c | 14 +++-- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 51 ++++-------------- lib_enc/tcx_utils_enc_fx.c | 20 +++---- 7 files changed, 116 insertions(+), 123 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 5816c60b5..5bdbd7d73 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -3341,7 +3341,7 @@ void mctStereoIGF_enc_fx( Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ Word16 q_powerSpec[MCT_MAX_CHANNELS], /* i : Q for powSpec_fx */ Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : same as powerSpec_fx but for inverse spect.*/ - Word16 q_powerSpecMsInv[MCT_MAX_CHANNELS], /* i : Q for powSpecMsInv_fx */ + Word16 *q_powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : Q for powSpecMsInv_fx */ Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ const Word16 sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ ); diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 9b78b44d8..bbd5416da 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10841,32 +10841,32 @@ void ProcessStereoIGF_fx( Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ - Word16 exp_pPowerSpectrumMsInv_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrumMsInv_fx */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i/o: exp of inv_spectrum_fx */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i/o: exp of inv_spectrum_fx */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ); /*igf_enc.c*/ void IGFEncApplyStereo_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ - Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ - const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ - const Word16 igfGridIdx, /* i : IGF grid index */ - Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ - Word16 exp_pPowerSpectrumMsInv_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrumMsInv_fx */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i : exp of inverse spectrum */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const Word16 igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i : exp of inverse spectrum */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ); void IGFSaveSpectrumForITF_ivas_fx( diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 9769d83b6..18995bd1d 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1002,12 +1002,12 @@ static void IGF_CalculateStereoEnvelope_fx( const Word32 *pPowerSpectrum_fx, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ Word16 pPowerSpectrum_e, /* i : exponent for pPowerSpectrum_fx */ const Word32 *pPowerSpectrumMsInv_fx, /* i : inverse power spectrum */ - Word16 pPowerSpectrumMsInv_e, /* i : exponent for pPowerSpectrumMsInv_fx */ + Word16 *q_pPowerSpectrumMsInv, /* i : Q for pPowerSpectrumMsInv_fx */ const Word16 igfGridIdx, /* i : IGF grid index */ const Word16 coreMsMask[N_MAX], /* i : line wise ms Mask */ const Word16 isTransient, /* i : flag indicating if transient is detected */ - const Word16 last_core_acelp /* i : indicator if last frame was ACELP core */ -) + const Word16 last_core_acelp, /* i : indicator if last frame was ACELP core */ + const Word16 mct_on ) { IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; H_IGF_GRID hGrid; @@ -1047,6 +1047,32 @@ static void IGF_CalculateStereoEnvelope_fx( Word16 slope_e; /*stores exponent for slope_fx*/ Word16 sfbEnergyR_e; /*stores exponent for sfbEnergyR*/ Word16 tmp_e; + Word32 temp_pPowerSpectrumMsInv[N_MAX], length; + Word16 q_temp_pPowerSpectrumMsInv = Q31, i; + move16(); + + IF( pPowerSpectrumMsInv_fx != NULL ) + { + length = N_MAX; + move16(); + if ( mct_on ) + { + length = L_FRAME48k; + move16(); + } + FOR( i = 0; i < length; i++ ) + { + IF( pPowerSpectrumMsInv_fx[i] != 0 ) + { + q_temp_pPowerSpectrumMsInv = s_min( q_temp_pPowerSpectrumMsInv, add( q_pPowerSpectrumMsInv[i], norm_l( pPowerSpectrumMsInv_fx[i] ) ) ); + } + } + FOR( i = 0; i < length; i++ ) + { + temp_pPowerSpectrumMsInv[i] = L_shl( pPowerSpectrumMsInv_fx[i], sub( q_temp_pPowerSpectrumMsInv, q_pPowerSpectrumMsInv[i] ) ); + move32(); + } + } hPrivateData = &hIGFEnc->igfData; hGrid = &hPrivateData->igfInfo.grid[(Word16) igfGridIdx]; @@ -1130,10 +1156,10 @@ static void IGF_CalculateStereoEnvelope_fx( norm_exp = norm_l( pMDCTSpectrumMsInv_fx[strt_cpy] ); final_exp = sub( pMDCTSpectrumMsInv_e, norm_exp ); scaled_value = L_shl( pMDCTSpectrumMsInv_fx[strt_cpy], norm_exp ); - sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ - sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], pPowerSpectrumMsInv_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ - tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrumMsInv_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ - tileSrcSpec_e = pPowerSpectrumMsInv_e; + sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], sub( 31, q_pPowerSpectrumMsInv[strt_cpy] ), &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[sub( strt_cpy, tmp )] = temp_pPowerSpectrumMsInv[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + tileSrcSpec_e = sub( 31, q_temp_pPowerSpectrumMsInv ); } ELSE { @@ -2620,24 +2646,25 @@ void IGFEncApplyMono_ivas_fx( *-------------------------------------------------------------------*/ void IGFEncApplyStereo_fx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ - Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ - const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ - const Word16 igfGridIdx, /* i : IGF grid index */ - Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ - Word16 exp_pPowerSpectrumMsInv_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrumMsInv_fx */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i : exp of inverse spectrum */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ + STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo encoder structure */ + Word16 ms_mask[2][MAX_SFB], /* i : bandwise MS mask */ + const IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS], /* i : instance handle of IGF Encoder */ + const Word16 igfGridIdx, /* i : IGF grid index */ + Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i : exp of inverse spectrum */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ) { Word32 *pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ Word32 *pPowerSpectrumParameterMsInv_fx[NB_DIV]; + Word16 *q_pPowerSpectrumParameterMsInv_fx[NB_DIV]; Word16 coreMsMask[N_MAX]; Word16 sfb, ch, last_core_acelp; STEREO_MDCT_BAND_PARAMETERS *sfbConf; @@ -2681,6 +2708,8 @@ void IGFEncApplyStereo_fx( pPowerSpectrumParameter_fx[1] = &pPowerSpectrum_fx[1][0]; pPowerSpectrumParameterMsInv_fx[0] = pPowerSpectrumMsInv_fx[0][0]; pPowerSpectrumParameterMsInv_fx[1] = pPowerSpectrumMsInv_fx[1][0]; + q_pPowerSpectrumParameterMsInv_fx[0] = q_pPowerSpectrumMsInv_fx[0][0]; + q_pPowerSpectrumParameterMsInv_fx[1] = q_pPowerSpectrumMsInv_fx[1][0]; } ELSE { @@ -2688,6 +2717,8 @@ void IGFEncApplyStereo_fx( pPowerSpectrumParameter_fx[1] = NULL; pPowerSpectrumParameterMsInv_fx[0] = NULL; pPowerSpectrumParameterMsInv_fx[1] = NULL; + q_pPowerSpectrumParameterMsInv_fx[0] = NULL; + q_pPowerSpectrumParameterMsInv_fx[1] = NULL; } FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -2696,7 +2727,7 @@ void IGFEncApplyStereo_fx( IGF_UpdateInfo( hIGFEnc[ch], igfGridIdx ); IGF_CalculateStereoEnvelope_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], sts[ch]->hTcxEnc->spectrum_e[frameno], inv_spectrum_fx[ch][frameno], exp_inv_spectrum_fx[ch], pPowerSpectrumParameter_fx[ch], exp_pPowerSpectrum_fx[ch], pPowerSpectrumParameterMsInv_fx[ch], - exp_pPowerSpectrumMsInv_fx[ch], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp ); + q_pPowerSpectrumParameterMsInv_fx[ch], igfGridIdx, coreMsMask, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, mct_on ); IF( EQ_16( sts[ch]->core, TCX_20_CORE ) ) { diff --git a/lib_enc/ivas_mct_core_enc_fx.c b/lib_enc/ivas_mct_core_enc_fx.c index 0ab232dd9..71890120b 100644 --- a/lib_enc/ivas_mct_core_enc_fx.c +++ b/lib_enc/ivas_mct_core_enc_fx.c @@ -244,8 +244,8 @@ void ivas_mct_core_enc_fx( Word32 inv_spectrum_long_fx[MCT_MAX_CHANNELS][L_FRAME48k]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ Word16 total_side_bits; Word16 chBitRatios[MCT_MAX_CHANNELS]; - Word16 q_powSpec[MCT_MAX_CHANNELS], q_powerSpecMsInv[MCT_MAX_CHANNELS], q_spec, q_origSpec, tmp_s; - Word16 tmp_q_powSpec[L_FRAME48k], tmp_q_powSpecInv[L_FRAME48k], *tmp_q_psi[2]; + Word16 q_powSpec[MCT_MAX_CHANNELS], q_spec, q_origSpec, tmp_s; + Word16 tmp_q_powSpec[L_FRAME48k], tmp_q_powSpecInv[MCT_MAX_CHANNELS][L_FRAME48k], *tmp_q_psi[MCT_MAX_CHANNELS][2]; Word64 W_tmp; Encoder_State *sts[MCT_MAX_CHANNELS]; Encoder_State *st; @@ -285,16 +285,17 @@ void ivas_mct_core_enc_fx( inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + set16_fx( tmp_q_powSpecInv[ch], 63, L_FRAME48k ); + + tmp_q_psi[ch][0] = tmp_q_powSpecInv[ch]; + tmp_q_psi[ch][1] = &tmp_q_powSpecInv[ch][N_TCX10_MAX]; + inv_spectrum_fx[ch][0] = inv_spectrum_long_fx[ch]; inv_spectrum_fx[ch][1] = inv_spectrum_long_fx[ch] + N_TCX10_MAX; } - set16_fx( tmp_q_powSpecInv, 63, L_FRAME48k ); set16_fx( tmp_q_powSpec, 63, L_FRAME48k ); - tmp_q_psi[0] = tmp_q_powSpecInv; - tmp_q_psi[1] = &tmp_q_powSpecInv[N_TCX10_MAX]; - FOR( ( cpe_id = 0, i = 0 ); cpe_id < nCPE; cpe_id++ ) { FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -451,7 +452,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); } @@ -465,7 +466,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_tmp ); - tmp_q_psi[n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][0] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); @@ -477,7 +478,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_tmp ); - tmp_q_psi[n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][i] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); } @@ -486,7 +487,7 @@ void ivas_mct_core_enc_fx( tmp_s = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, tmp_s ); powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_tmp ); - tmp_q_psi[n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 + tmp_q_psi[ch][n][L_subframeTCX - 1] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32 move32(); move16(); } @@ -529,8 +530,6 @@ void ivas_mct_core_enc_fx( { q_powSpec[ch] = Q31; move16(); - q_powerSpecMsInv[ch] = Q31; - move16(); /* NOTE: This logic has been added because using a constant headroom while computing `powSpec` and `powSpecMsInv` leads to significant precision loss, which results in poor quality. */ FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -539,18 +538,12 @@ void ivas_mct_core_enc_fx( q_powSpec[ch] = s_min( q_powSpec[ch], add( tmp_q_powSpec[i], norm_l( powerSpec_fx[ch][i] ) ) ); move16(); } - IF( powerSpecMsInv_fx[ch][0][i] != 0 ) - { - q_powerSpecMsInv[ch] = s_min( q_powerSpecMsInv[ch], add( tmp_q_powSpecInv[i], norm_l( powerSpecMsInv_fx[ch][0][i] ) ) ); - move16(); - } } FOR( n = 0; n < nSubframes; n++ ) { FOR( i = 0; i < L_subframeTCX; i++ ) { - powerSpecMsInv_fx[ch][n][i] = L_shr( powerSpecMsInv_fx[ch][n][i], sub( tmp_q_psi[n][i], q_powerSpecMsInv[ch] ) ); powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )] = L_shr( powerSpec_fx[ch][( i + ( n * L_subframeTCX ) )], sub( tmp_q_powSpec[i + ( n * L_subframeTCX )], q_powSpec[ch] ) ); move32(); move32(); @@ -609,7 +602,7 @@ void ivas_mct_core_enc_fx( { IF( hMCT->currBlockDataCnt > 0 ) { - mctStereoIGF_enc_fx( hMCT, sts, orig_spectrum_fx, q_origSpec, powerSpec_fx, q_powSpec, powerSpecMsInv_fx, q_powerSpecMsInv, inv_spectrum_fx, sp_aud_decision0 ); + mctStereoIGF_enc_fx( hMCT, sts, orig_spectrum_fx, q_origSpec, powerSpec_fx, q_powSpec, powerSpecMsInv_fx, tmp_q_psi, inv_spectrum_fx, sp_aud_decision0 ); } ELSE { diff --git a/lib_enc/ivas_mct_enc_mct_fx.c b/lib_enc/ivas_mct_enc_mct_fx.c index 94015abb7..8ff17ae01 100644 --- a/lib_enc/ivas_mct_enc_mct_fx.c +++ b/lib_enc/ivas_mct_enc_mct_fx.c @@ -986,19 +986,19 @@ void mctStereoIGF_enc_fx( Word32 powerSpec_fx[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ Word16 q_powerSpec[MCT_MAX_CHANNELS], /* i : Q for powSpec_fx */ Word32 *powerSpecMsInv_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : same as powerSpec_fx but for inverse spect.*/ - Word16 q_powerSpecMsInv[MCT_MAX_CHANNELS], /* i : Q for powSpecMsInv_fx */ + Word16 *q_powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : Q for powSpecMsInv_fx */ Word32 *inv_spectrum_fx[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ const Word16 sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ ) { Word32 *p_powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; + Word16 *q_p_powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_inv_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_orig_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_powerSpec_fx[NB_DIV]; Word16 b, nSubframes, L_subframeTCX; Word16 p_ch[2], n, ch, ch1, ch2; - Word16 q_pSI_ch[2]; Word16 q_pS_ch[2]; Encoder_State *p_st[NB_DIV]; Encoder_State *st; @@ -1059,12 +1059,12 @@ void mctStereoIGF_enc_fx( p_orig_spectrum_fx[1][n] = orig_spectrum_fx[ch2][n]; p_powerSpecMsInv_fx[0][n] = powerSpecMsInv_fx[ch1][n]; // q_powerSpec p_powerSpecMsInv_fx[1][n] = powerSpecMsInv_fx[ch2][n]; + q_p_powerSpecMsInv_fx[0][n] = q_powerSpecMsInv[ch1][n]; // q_powerSpec + q_p_powerSpecMsInv_fx[1][n] = q_powerSpecMsInv[ch2][n]; p_inv_spectrum_fx[0][n] = inv_spectrum_fx[ch1][n]; p_inv_spectrum_fx[1][n] = inv_spectrum_fx[ch2][n]; q_pS_ch[0] = q_powerSpec[ch1]; - q_pSI_ch[0] = q_powerSpecMsInv[ch1]; q_pS_ch[1] = q_powerSpec[ch2]; - q_pSI_ch[1] = q_powerSpecMsInv[ch2]; move16(); move16(); @@ -1072,20 +1072,18 @@ void mctStereoIGF_enc_fx( IF( NE_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[n] ) || EQ_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], SMDCT_BW_MS ) ) { - Word16 exp_powerSpec_fx[CPE_CHANNELS], exp_powerSpecMsInv_fx[CPE_CHANNELS], exp_inv_spectrum_fx[CPE_CHANNELS]; + Word16 exp_powerSpec_fx[CPE_CHANNELS], exp_inv_spectrum_fx[CPE_CHANNELS]; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { exp_powerSpec_fx[ch] = sub( Q31, q_pS_ch[ch] ); - exp_powerSpecMsInv_fx[ch] = sub( Q31, q_pSI_ch[ch] ); exp_inv_spectrum_fx[ch] = p_st[ch]->hTcxEnc->spectrum_e[n]; move16(); move16(); - move16(); } ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, q_origSpec, q_origSpec, p_powerSpec_fx, exp_powerSpec_fx, - p_powerSpecMsInv_fx, exp_powerSpecMsInv_fx, p_inv_spectrum_fx, exp_inv_spectrum_fx, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); + p_powerSpecMsInv_fx, q_p_powerSpecMsInv_fx, p_inv_spectrum_fx, exp_inv_spectrum_fx, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); } ELSE { diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index 8acbc3e87..cbbc0d000 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -137,8 +137,10 @@ void stereo_mdct_core_enc_fx( Word32 *orig_spectrum_fx[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ Word64 powerSpec64[CPE_CHANNELS][N_MAX]; Word16 exp_powerSpec64[CPE_CHANNELS][NB_DIV]; - Word32 powerSpecMsInv_long_fx[CPE_CHANNELS][N_MAX]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word32 powerSpecMsInv_long_fx[CPE_CHANNELS][N_MAX]; /* MS inv power spectrum, also inverse MDST spectrum */ + Word16 q_powerSpecMsInv_long_fx[CPE_CHANNELS][N_MAX]; /*Q: MS inv power spectrum, also inverse MDST spectrum */ Word32 *powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; + Word16 *q_powerSpecMsInv_fx[CPE_CHANNELS][NB_DIV]; Word32 quantized_spectrum_long_fx[CPE_CHANNELS][N_MAX]; /* quantized MDCT spectrum, inv ms mask mdst spectrum, scratch for MS spectra in the MS decision */ Word32 *quantized_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *inv_mdst_spectrum_fx[CPE_CHANNELS][NB_DIV]; @@ -152,8 +154,6 @@ void stereo_mdct_core_enc_fx( Word32 *p_mdst_spectrum_long_fx[CPE_CHANNELS]; Word32 mdst_spectrum_long_fx[CPE_CHANNELS][N_MAX]; Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV]; - Word16 exp_powSpecMsInv[MCT_MAX_CHANNELS]; - Word16 tmp_q_powSpecInv[N_MAX], *exp_powSpecInv[2]; Word64 W_tmp; Encoder_State *st, **sts; STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct; @@ -186,11 +186,6 @@ void stereo_mdct_core_enc_fx( set16_fx( exp_powerSpec64[ch], 0, NB_DIV ); } - set16_fx( tmp_q_powSpecInv, 63, N_MAX ); - - exp_powSpecInv[0] = tmp_q_powSpecInv; - exp_powSpecInv[1] = &tmp_q_powSpecInv[N_TCX10_MAX]; - sts = hCPE->hCoreCoder; hStereoMdct = hCPE->hStereoMdct; hBstr = sts[0]->hBstr; @@ -254,6 +249,9 @@ void stereo_mdct_core_enc_fx( { inv_mdst_spectrum_fx[ch][0] = powerSpecMsInv_fx[ch][0] = powerSpecMsInv_long_fx[ch]; inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + q_powerSpecMsInv_fx[ch][0] = q_powerSpecMsInv_long_fx[ch]; + q_powerSpecMsInv_fx[ch][1] = q_powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; + set16_fx( q_powerSpecMsInv_long_fx[ch], 63, L_FRAME48k ); quantized_spectrum_fx[ch][0] = quantized_spectrum_long_fx[ch]; quantized_spectrum_fx[ch][1] = quantized_spectrum_long_fx[ch] + N_TCX10_MAX; inv_spectrum_fx[ch][0] = quantized_spectrum_fx[ch][0]; @@ -444,7 +442,7 @@ void stereo_mdct_core_enc_fx( W_tmp = W_mac_32_32( W_mult_32_32( imdct, imdct ), imdst, imdst ); // exp: 2*exp norm = W_norm( W_tmp ); powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*exp-norm - exp_powSpecInv[n][i] = sub( shl( exp, 1 ), norm ); + q_powerSpecMsInv_fx[ch][n][i] = sub( 31, sub( shl( exp, 1 ), norm ) ); move32(); move16(); @@ -464,7 +462,7 @@ void stereo_mdct_core_enc_fx( W_tmp = W_mult_32_32( mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) norm = W_norm( W_tmp ); powerSpecMsInv_fx[ch][n][0] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) - exp_powSpecInv[n][0] = sub( exp, norm ); + q_powerSpecMsInv_fx[ch][n][0] = sub( 31, sub( exp, norm ) ); move32(); move16(); @@ -477,7 +475,7 @@ void stereo_mdct_core_enc_fx( W_tmp = W_mac_32_32( W_mult_32_32( mdst, mdst ), mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) norm = W_norm( W_tmp ); powerSpecMsInv_fx[ch][n][i] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) - exp_powSpecInv[n][i] = sub( exp, norm ); + q_powerSpecMsInv_fx[ch][n][i] = sub( 31, sub( exp, norm ) ); move32(); move16(); } @@ -486,7 +484,7 @@ void stereo_mdct_core_enc_fx( W_tmp = W_mult_32_32( mdct, mdct ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1) (exp) norm = W_norm( W_tmp ); powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = W_extract_h( W_shl( W_tmp, norm ) ); // exp: 2*(sts[ch]->hTcxEnc->spectrum_e[n]+1)-norm (exp-norm) - exp_powSpecInv[n][L_subframeTCX - 1] = sub( exp, norm ); + q_powerSpecMsInv_fx[ch][n][L_subframeTCX - 1] = sub( 31, sub( exp, norm ) ); move32(); move16(); } @@ -512,33 +510,6 @@ void stereo_mdct_core_enc_fx( move16(); } } - - /* Aligning the Q-factors */ - exp = MIN_16; - move16(); - FOR( n = 0; n < nSubframes; n++ ) - { - FOR( i = 0; i < L_subframeTCX; i++ ) - { - if ( powerSpecMsInv_fx[ch][n][i] != 0 ) - { - exp = s_max( exp, exp_powSpecInv[n][i] ); - } - } - } - IF( NE_16( exp, MIN_16 ) ) - { - FOR( n = 0; n < nSubframes; n++ ) - { - FOR( i = 0; i < L_subframeTCX; i++ ) - { - powerSpecMsInv_fx[ch][n][i] = L_shl( powerSpecMsInv_fx[ch][n][i], sub( exp_powSpecInv[n][i], exp ) ); - move32(); - } - } - } - exp_powSpecMsInv[ch] = exp; - move16(); } FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -656,7 +627,7 @@ void stereo_mdct_core_enc_fx( move16(); ProcessStereoIGF_fx( hStereoMdct, sts, ms_mask, orig_spectrum_fx, sub( Q31, p_orig_spectrum_e[0] ), sub( Q31, p_orig_spectrum_e[1] ), - p_powerSpec_fx, exp_powSpec, powerSpecMsInv_fx, exp_powSpecMsInv, inv_spectrum_fx, exp_inv_spectrum, + p_powerSpec_fx, exp_powSpec, powerSpecMsInv_fx, q_powerSpecMsInv_fx, inv_spectrum_fx, exp_inv_spectrum, n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); } ELSE diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index acc52c2aa..680a69fa5 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -4029,15 +4029,15 @@ void ProcessStereoIGF_fx( Word32 *pITFMDCTSpectrum_fx[CPE_CHANNELS][NB_DIV], /* i : MDCT spectrum fir ITF */ Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, - Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ - Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ - Word16 exp_pPowerSpectrumMsInv_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrumMsInv_fx */ - Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ - Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i/o: exp of inv_spectrum_fx */ - const Word16 frameno, /* i : flag indicating index of current subfr. */ - const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ - const Word32 element_brate, /* i : element bitrate */ + Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ + Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ + Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ + Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ + Word16 exp_inv_spectrum_fx[CPE_CHANNELS], /* i/o: exp of inv_spectrum_fx */ + const Word16 frameno, /* i : flag indicating index of current subfr. */ + const Word16 sp_aud_decision0, /* i : sp_aud_decision0 */ + const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ) { Word16 ch, igfGridIdx, isIndepFlag, bsBits, pBsStart, curr_order; @@ -4078,7 +4078,7 @@ void ProcessStereoIGF_fx( IGFSaveSpectrumForITF_ivas_fx( hIGFEnc[1], igfGridIdx, pITFMDCTSpectrum_fx[1][frameno], sub( Q31, q_pITFMDCTSpectrum_2 ) ); - IGFEncApplyStereo_fx( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum_fx, exp_pPowerSpectrum_fx, pPowerSpectrumMsInv_fx, exp_pPowerSpectrumMsInv_fx, + IGFEncApplyStereo_fx( hStereoMdct, ms_mask, hIGFEnc, igfGridIdx, sts, pPowerSpectrum_fx, exp_pPowerSpectrum_fx, pPowerSpectrumMsInv_fx, q_pPowerSpectrumMsInv_fx, inv_spectrum_fx, exp_inv_spectrum_fx, frameno, sp_aud_decision0, element_brate, mct_on ); FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) -- GitLab From 253d721065338c97b05c4b32f4fe544bb8c650ba Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 13 May 2025 11:58:42 +0530 Subject: [PATCH 0566/1310] Fix for LTV Crash: Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, 7_1_4 out --- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index cbbc0d000..2a71fc34d 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -251,7 +251,7 @@ void stereo_mdct_core_enc_fx( inv_mdst_spectrum_fx[ch][1] = powerSpecMsInv_fx[ch][1] = powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; q_powerSpecMsInv_fx[ch][0] = q_powerSpecMsInv_long_fx[ch]; q_powerSpecMsInv_fx[ch][1] = q_powerSpecMsInv_long_fx[ch] + N_TCX10_MAX; - set16_fx( q_powerSpecMsInv_long_fx[ch], 63, L_FRAME48k ); + set16_fx( q_powerSpecMsInv_long_fx[ch], 63, N_MAX ); quantized_spectrum_fx[ch][0] = quantized_spectrum_long_fx[ch]; quantized_spectrum_fx[ch][1] = quantized_spectrum_long_fx[ch] + N_TCX10_MAX; inv_spectrum_fx[ch][0] = quantized_spectrum_fx[ch][0]; -- GitLab From 9853dc8b3dc2c69104377492bdea69d721e0241d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 13 May 2025 10:52:01 +0200 Subject: [PATCH 0567/1310] Add push/pop wmops for stereo_dmx_evs_enc --- lib_enc/ivas_stereo_dmx_evs_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 13ecbba00..9d0bb92af 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -1799,6 +1799,7 @@ void stereo_dmx_evs_enc_fx( Word64 W_tmp; Word16 W_tmp_q; + push_wmops( "stereo_dmx_evs_enc" ); if ( is_binaural ) { /* use of is_binaural flag is to be considered */ @@ -2149,6 +2150,7 @@ void stereo_dmx_evs_enc_fx( } Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 + pop_wmops(); return; } -- GitLab From e6ee6c58dfcd22133883e20609e6e3834bcaa9bc Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Tue, 13 May 2025 12:17:33 +0200 Subject: [PATCH 0568/1310] clang formatted. --- lib_debug/debug.c | 2 +- lib_debug/wmc_auto.c | 8 ++--- lib_debug/wmc_auto.h | 52 +++++++++++++++++--------------- lib_enc/ivas_stereo_dmx_evs_fx.c | 1 + 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/lib_debug/debug.c b/lib_debug/debug.c index aafc1b663..ee6040faf 100644 --- a/lib_debug/debug.c +++ b/lib_debug/debug.c @@ -788,7 +788,7 @@ char *fname( #ifdef DEBUG_FORCE_DIR size_t len; len = strlen( tmp_fname ); - if (tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) + if ( tmp_fname[len - 1] != '/' && tmp_fname[len - 1] != '\\' ) { /* add trailing '/' slash */ strcat( tmp_fname, "/" ); diff --git a/lib_debug/wmc_auto.c b/lib_debug/wmc_auto.c index d357c03dd..9a4b371fc 100644 --- a/lib_debug/wmc_auto.c +++ b/lib_debug/wmc_auto.c @@ -1018,7 +1018,7 @@ int push_stack( const char *filename, const char *fctname ) } /* Check, if This is the New Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size < 0 ) { @@ -1226,7 +1226,7 @@ void *mem_alloc( current_heap_size += ptr_record->block_size; /* Check, if this is the new Worst-Case RAM (stack + heap) */ - current_stack_size = ( int32_t )( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); + current_stack_size = (int32_t) ( ( ( ptr_base_stack - ptr_current_stack ) * sizeof( int16_t ) ) ); if ( current_stack_size + current_heap_size > wc_ram_size ) { wc_ram_size = current_stack_size + current_heap_size; @@ -2416,7 +2416,7 @@ int EQ_64( long long int L64_var1, long long int L64_var2 ) #endif return F_ret; } -int NE_64( long long int L64_var1, long long int L64_var2 ) +int NE_64( long long int L64_var1, long long int L64_var2 ) { int F_ret = 0; @@ -2503,7 +2503,7 @@ void Reset_BASOP_WMOPS_counter( unsigned int counterId ) /* reset the current BASOP operation counter */ ptr = (unsigned int *) &multiCounter[counterId]; - for ( i = 0; i < (int) (sizeof(BASIC_OP) / sizeof(unsigned int)); i++ ) + for ( i = 0; i < (int) ( sizeof( BASIC_OP ) / sizeof( unsigned int ) ); i++ ) { *ptr++ = 0; } diff --git a/lib_debug/wmc_auto.h b/lib_debug/wmc_auto.h index 59bbc5bbf..8c6396313 100644 --- a/lib_debug/wmc_auto.h +++ b/lib_debug/wmc_auto.h @@ -34,7 +34,7 @@ #define ENH_64_BIT_OPERATOR #define ENH_U_32_BIT_OPERATOR #define COMPLEX_OPERATOR -#define CONTROL_CODE_OPS /* enable control code operators such as LT_16, GT_16, ... */ +#define CONTROL_CODE_OPS /* enable control code operators such as LT_16, GT_16, ... */ #define WMOPS_DISABLE_FCN_CALL_PENALIZATION /* do not count the complexity of function calls */ #ifdef WMOPS @@ -258,7 +258,7 @@ void update_mem( void ); { \ ops_cnt += ( 2 * _TRANS_C * ( x ) ); \ inst_cnt[_TRANS] += ( x ); \ - } + } #else @@ -335,29 +335,29 @@ extern int cntr_push_pop; #endif /* Define all Macros without '{' & '}' (None of these should be called externally!) */ -#define ABS_( x ) OP_COUNT_( _ABS, ( x ) ) -#define ADD_( x ) OP_COUNT_( _ADD, ( x ) ) -#define MULT_( x ) OP_COUNT_( _MULT, ( x ) ) -#define MAC_( x ) OP_COUNT_( _MAC, ( x ) ) -#define MOVE_( x ) OP_COUNT_( _MOVE, ( x ) ) -#define STORE_( x ) OP_COUNT_( _STORE, ( x ) ) -#define LOGIC_( x ) OP_COUNT_( _LOGIC, ( x ) ) -#define SHIFT_( x ) OP_COUNT_( _SHIFT, ( x ) ) -#define BRANCH_( x ) OP_COUNT_( _BRANCH, ( x ) ) -#define DIV_( x ) OP_COUNT_( _DIV, ( x ) ) -#define SQRT_( x ) OP_COUNT_( _SQRT, ( x ) ) -#define TRANS_( x ) OP_COUNT_( _TRANS, ( x ) ) +#define ABS_( x ) OP_COUNT_( _ABS, ( x ) ) +#define ADD_( x ) OP_COUNT_( _ADD, ( x ) ) +#define MULT_( x ) OP_COUNT_( _MULT, ( x ) ) +#define MAC_( x ) OP_COUNT_( _MAC, ( x ) ) +#define MOVE_( x ) OP_COUNT_( _MOVE, ( x ) ) +#define STORE_( x ) OP_COUNT_( _STORE, ( x ) ) +#define LOGIC_( x ) OP_COUNT_( _LOGIC, ( x ) ) +#define SHIFT_( x ) OP_COUNT_( _SHIFT, ( x ) ) +#define BRANCH_( x ) OP_COUNT_( _BRANCH, ( x ) ) +#define DIV_( x ) OP_COUNT_( _DIV, ( x ) ) +#define SQRT_( x ) OP_COUNT_( _SQRT, ( x ) ) +#define TRANS_( x ) OP_COUNT_( _TRANS, ( x ) ) #define POWER_( x ) TRANS_( x ) #define LOG_( x ) TRANS_( x ) -#define LOOP_( x ) OP_COUNT_( _LOOP, ( x ) ) -#define INDIRECT_( x ) OP_COUNT_( _INDIRECT, ( x ) ) -#define PTR_INIT_( x ) OP_COUNT_( _PTR_INIT, ( x ) ) +#define LOOP_( x ) OP_COUNT_( _LOOP, ( x ) ) +#define INDIRECT_( x ) OP_COUNT_( _INDIRECT, ( x ) ) +#define PTR_INIT_( x ) OP_COUNT_( _PTR_INIT, ( x ) ) #ifdef WMOPS_DISABLE_FCN_CALL_PENALIZATION -#define FUNC_( x ) ( x ) +#define FUNC_( x ) ( x ) #else -#define FUNC_( x ) ( OP_COUNT_( _MOVE, ( x ) ), OP_COUNT_( _FUNC, 1 ) ) +#define FUNC_( x ) ( OP_COUNT_( _MOVE, ( x ) ), OP_COUNT_( _FUNC, 1 ) ) #endif -#define MISC_( x ) ABS_( x ) +#define MISC_( x ) ABS_( x ) /* Math Operations */ #define abs_ OP_COUNT_WRAPPER1_( ABS_( 1 ), abs ) @@ -401,8 +401,8 @@ extern int cntr_push_pop; #define frexp_ OP_COUNT_WRAPPER1_( MISC_( 2 ), frexp ) #define frexpf_ OP_COUNT_WRAPPER1_( MISC_( 2 ), frexpf ) -/* the macros below are instrumented versions of user-defined macros that might be used in the source code - representing some well-known and recognized mathematical operations (that are not defined in math.h) +/* the macros below are instrumented versions of user-defined macros that might be used in the source code + representing some well-known and recognized mathematical operations (that are not defined in math.h) Note: the 'wmc_flag_=wmc_flag_' is used to avoid warning: left-hand operand of comma expression has no effect with gcc */ #define min_( a, b ) OP_COUNT_WRAPPER1_( MISC_( 1 ), min( ( a ), ( b ) ) ) @@ -928,7 +928,7 @@ typedef struct unsigned int Madd_32_32_r; /* Complexity Weight of 1 */ unsigned int Msub_32_32; /* Complexity Weight of 1 */ unsigned int Msub_32_32_r; /* Complexity Weight of 1 */ -#endif /* #ifdef ENH_32_BIT_OPERATOR */ +#endif /* #ifdef ENH_32_BIT_OPERATOR */ #ifdef ENH_U_32_BIT_OPERATOR unsigned int UL_addNs; /* Complexity Weight of 1 */ @@ -938,7 +938,7 @@ typedef struct unsigned int Mpy_32_16_uu; /* Complexity Weight of 2 */ unsigned int norm_ul_float; /* Complexity Weight of 1 */ unsigned int UL_deposit_l; /* Complexity Weight of 1 */ -#endif /* #ifdef ENH_U_32_BIT_OPERATOR */ +#endif /* #ifdef ENH_U_32_BIT_OPERATOR */ #ifdef CONTROL_CODE_OPS unsigned int LT_16; /* Complexity Weight of 1 */ @@ -1095,7 +1095,9 @@ void incrIf( const char *func_name ); #ifndef WMOPS #define ELSE else #else /* ifndef WMOPS */ -#define ELSE else if ( incrElse( __func__ ), 0 ); else +#define ELSE \ + else if ( incrElse( __func__ ), 0 ); \ + else void incrElse( const char *func_name ); #endif /* ifndef WMOPS */ diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 793f204d8..f84f90e46 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -2214,6 +2214,7 @@ void stereo_dmx_evs_enc_fx( } Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 + pop_wmops(); return; -- GitLab From 430ae6cf3ae9af91659c7046cc42acf26329ee74 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 12:38:38 +0200 Subject: [PATCH 0569/1310] deactivcate FIX_1439_SPEEDUP_synthesise_fb_high_band_fx --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index cbc77b6e7..1574146cc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -89,7 +89,7 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ -- GitLab From b05870404f337050d4cb7e805a8b1f1482c4326b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 14:40:11 +0200 Subject: [PATCH 0570/1310] delete FIX_1439_SPEEDUP_synthesise_fb_high_band_fx wrapped code --- lib_com/swb_tbe_com_fx.c | 46 +--------------------------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c4605393d..408f75441 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7023,50 +7023,6 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx - L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32; - Word16 tmp16; - - // if (L_tmp < 0) - if ( L_tmp < 0 ) - { - L_tmp32 = L_negate( L_tmp ); - } - if ( L_tmp < 0 ) - { - L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); - } - if ( L_tmp < 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - if ( L_tmp < 0 ) - { - tmp16 = negate( tmp16 ); - } - - // if (L_tmp == 0) - if ( L_tmp == 0 ) - { - tmp16 = 0; - move16(); - } - - // if (L_tmp > 0) - if ( L_tmp > 0 ) - { - L_tmp32 = L_shl_sat( L_tmp, tmp3 ); - } - if ( L_tmp > 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - - output[i] = tmp16; - move16(); - -#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7077,8 +7033,8 @@ void synthesise_fb_high_band_fx( { output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); + } -#endif } return; } -- GitLab From b09eaf4c04bf1d2fefe34427a77d5dcd9ddb650c Mon Sep 17 00:00:00 2001 From: marc emerit Date: Tue, 13 May 2025 14:59:58 +0200 Subject: [PATCH 0571/1310] merge float-pc and main_pc --- lib_com/options.h | 1 - lib_rend/lib_rend.c | 161 +++++++++----------------------------------- 2 files changed, 31 insertions(+), 131 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0b0d18cac..d040b705a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -103,7 +103,6 @@ #define FIX_956_DECODER_COMMAND_LINE_FIX /* VA: Output correct error message when the decoder command-line has too many mandatory arguments. */ -//#define SPLIT_REND_WITH_HEAD_ROT_NEW /* Orange: split rendering code differ between branchs main-pc and float-pc, do not know what to do */ #define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index e96257115..02a812cf1 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1479,6 +1479,9 @@ static ivas_error setRendInputActiveIsm( #ifdef SPLIT_REND_WITH_HEAD_ROT Word16 i; #endif + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + inputIsm = (input_ism *) input; rendCtx = inputIsm->base.ctx; outConfig = *rendCtx.pOutConfig; @@ -1528,7 +1531,7 @@ static ivas_error setRendInputActiveIsm( #endif test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT_NEW +#ifdef SPLIT_REND_WITH_HEAD_ROT test(); test(); IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) @@ -1536,22 +1539,33 @@ static ivas_error setRendInputActiveIsm( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) #endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef NONBE_FIX_BINARY_BINAURAL_READING - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif -#else +#ifndef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif -#endif { return error; } +#else + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Open TD renderer wrappers */ + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /* Assert same delay as main TD renderer */ + assert( inputIsm->splitTdRendWrappers[i].binaural_latency_ns == inputIsm->tdRendWrapper.binaural_latency_ns ); + } +#endif } ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { @@ -1562,121 +1576,25 @@ static ivas_error setRendInputActiveIsm( } ELSE { -#ifdef SPLIT_REND_WITH_HEAD_ROT_NEW #ifndef SPLIT_REND_WITH_HEAD_ROT - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) { return error; } if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } } #else - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { - if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) - { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING - if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) -#endif - { - return error; - } - } -#endif - -#else - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - Word16 ivas_format; - IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) - { - ivas_format = MC_FORMAT; - } - ELSE - { - ivas_format = ISM_FORMAT; - } - - move16(); IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } - - Word16 nchan_rend = num_src; - move16(); - - test(); - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) - { - IF( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - } - -#ifdef SPLIT_REND_WITH_HEAD_ROT - /* Open TD renderer wrappers */ - FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) - { - if ( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->splitTdRendWrappers[i], inConfig, hRendCfg, NULL, *inputIsm->base.ctx.pOutSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Assert same delay as main TD renderer */ - assert( inputIsm->splitTdRendWrappers[i].binaural_latency_ns == inputIsm->tdRendWrapper.binaural_latency_ns ); - - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) - { - IF( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - } - } - -#endif - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) @@ -1684,7 +1602,6 @@ static ivas_error setRendInputActiveIsm( return error; } } -#ifdef SPLIT_REND_WITH_HEAD_ROT_NEW ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { #ifdef NONBE_FIX_BINARY_BINAURAL_READING @@ -1697,8 +1614,6 @@ static ivas_error setRendInputActiveIsm( } } #endif - -#endif /* SPLIT_REND_WITH_HEAD_ROT_NEW */ } return IVAS_ERR_OK; @@ -6273,10 +6188,7 @@ static ivas_error renderIsmToBinauralRoom( IF( NE_32( ( error = ivas_rend_crendProcessSubframe( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, ismInput->base.inputBuffer.config.numSamplesPerChannel, *ismInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) #else /* render 7_1_4 with BRIRs */ - IF( NE_32( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *ismInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, ismInput->base.inputBuffer.config.numSamplesPerChannel, *ismInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -7089,9 +7001,7 @@ static ivas_error renderMcToBinaural( #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, p_tmpRendBuffer_fx, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, *mcInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, p_tmpRendBuffer_fx, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -7234,9 +7144,7 @@ static ivas_error renderMcToBinauralRoom( #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -7367,9 +7275,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, - p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate, getNumSubframesInBuffer( &outAudio, *mcInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -8087,9 +7993,7 @@ static ivas_error renderSbaToBinaural( #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, output_fx, output_fx, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, output_fx, *sbaInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, output_fx, output_fx, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -8218,10 +8122,7 @@ static ivas_error renderSbaToBinauralRoom( #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, - NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate, - getNumSubframesInBuffer( &outAudio, *sbaInput->base.ctx.pOutSampleRate ) ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif { return error; -- GitLab From a20cf2d141040cb2e23050cfd5902952f91c9d1f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 15:31:17 +0200 Subject: [PATCH 0572/1310] apply clang patch --- lib_com/swb_tbe_com_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 408f75441..85ea15e9d 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7033,7 +7033,6 @@ void synthesise_fb_high_band_fx( { output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); - } } return; -- GitLab From 10325469adbe638293dd59ce6d413218af4196b9 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 14:57:45 +0000 Subject: [PATCH 0573/1310] delete FIX_1439_SPEEDUP_synthesise_fb_high_band_fx from options --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1574146cc..cce7932de 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -89,7 +89,6 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ -- GitLab From 36bbe074068be90ed62402797f52b1b0ec3b8574 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 13 May 2025 19:36:04 +0200 Subject: [PATCH 0574/1310] Separate q_win into q_win and q_winFB for low band / high band, because these can be different. Correct q_win calculation for TCX20, which fixes assert fail. --- lib_com/ivas_prot_fx.h | 1 + lib_dec/dec_tcx_fx.c | 87 ++++++++++----------------------- lib_dec/ivas_mdct_core_dec_fx.c | 51 ++++++++++++++++--- 3 files changed, 72 insertions(+), 67 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 5a19dcc41..904aaf090 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1584,6 +1584,7 @@ void decoder_tcx_imdct_fx( Word16 xn_buf_fx[], #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 *q_win, + Word16 *q_winFB, #else Word16 q_win, #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index fd9e0ff30..037f2e3cb 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2626,7 +2626,6 @@ static Word16 IMDCT_ivas_fx_calc_qwin( } static void IMDCT_ivas_fx_rescale( - Decoder_State *st, Word16 *syn_Overl_TDAC, Word16 *Q_syn_Overl_TDAC, Word16 *syn_Overl, @@ -2637,10 +2636,6 @@ static void IMDCT_ivas_fx_rescale( Word16 *Q_old_out_fx, Word16 q_win, const Word16 FB_flag -#if 0 - Word16 *synth_buf_fx, - Word16 q_syn -#endif ) { Word16 oldLength; @@ -2660,16 +2655,15 @@ static void IMDCT_ivas_fx_rescale( Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win *Q_syn_Overl = q_win; move16(); - Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win - *Q_old_syn_Overl = q_win; - move16(); + if ( FB_flag == 0 ) { + Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win + *Q_old_syn_Overl = q_win; + move16(); + } Scale_sig( old_out_fx, oldLength, sub( q_win, *Q_old_out_fx ) ); // Q(st->hHQ_core->Q_old_wtda) -> q_win *Q_old_out_fx = q_win; move16(); #endif - Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win - - // Scale_sig( synth_buf_fx, add( add( old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win } static Word16 TCX_MDCT_Inverse_GetScaleFactor( @@ -3087,9 +3081,6 @@ void IMDCT_ivas_fx( Word16 L_spec_TCX5_tmp = 0; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN -#if 0 - Word16 q_win_prev; -#else IF( allow_qwin_change ) { q_win = -2; @@ -3097,7 +3088,6 @@ void IMDCT_ivas_fx( allow_qwin_change = 0; move16(); } -#endif #endif FOR( w = 0; w < 2; w++ ) @@ -3119,24 +3109,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } -#if 0 - if ( w > 0 ) - { - if ( q_win_prev != q_win ) - { - // extern int frame; - // printf( "\nWarning: q_win changed in TCX5. Frame %d, q_win %d %d\n", frame, q_win_prev, q_win ); - printf( "\nWarning: q_win changed in TCX5. Frame X, q_win %d %d\n", q_win_prev, q_win ); - } - // Rescale both subframes some how ? - } - else - { - q_win_prev = q_win; - } -#endif - - IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) { @@ -3238,7 +3211,7 @@ void IMDCT_ivas_fx( assert( q_win_prev == q_win ); - IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( s_and( kernel_type, 1 ) ) { @@ -3297,7 +3270,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode, &q_win, allow_qwin_change ); } - IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) { @@ -3358,8 +3331,9 @@ void IMDCT_ivas_fx( move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - // L_norm_arr(xn_buf_fx_32, ) - IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + // q_win < norm + q_tmp_fx_32 - 16 + q_win = s_min( q_win, L_norm_arr( tmp_fx_32, L_frame ) + q_tmp_fx_32 - 16 ); + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 diff = sub( q_tmp_fx_32, q_win ); @@ -3370,7 +3344,7 @@ void IMDCT_ivas_fx( { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD assert( L_shr( L_shl( old_out_fx[ind], q_old_out_diff ), q_old_out_diff ) == old_out_fx[ind] ); - old_out_fx_32[ind] = L_shl( old_out_fx[ind], q_old_out_diff ); + old_out_fx_32[ind] = L_shl( L_deposit_l( old_out_fx[ind] ), q_old_out_diff ); #else old_out_fx_32[ind] = L_shl( old_out_fx[ind], diff ); #endif @@ -3382,9 +3356,10 @@ void IMDCT_ivas_fx( FOR( Word16 ind = 0; ind < L_frame; ind++ ) { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], q_old_out_diff ) ); assert( extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == 0 || extract_h( L_shr( old_out_fx_32[ind], q_old_out_diff ) ) == -1 ); + old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], q_old_out_diff ) ); #else + assert( extract_h( L_shr( old_out_fx_32[ind], diff ) ) == 0 || extract_h( L_shr( old_out_fx_32[ind], diff ) ) == -1 ); old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) ); #endif xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) ); @@ -3426,7 +3401,7 @@ void IMDCT_ivas_fx( q_win = -2; #endif } - IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 q_diff = sub( q_xn_buf_fx_32, q_win ); @@ -3492,7 +3467,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win, allow_qwin_change ); } - IMDCT_ivas_fx_rescale( st, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) { @@ -4195,30 +4170,21 @@ void decoder_tcx_ivas_fx( move16(); } -#if 0 - /* Scaling down buffers for decoder_tcx_imdct_fx*/ - Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // Scaling to Q_syn - st->hTcxDec->Q_syn_Overl_TDACFB = st->Q_syn; - Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl_TDAC ) ); // Scaling to Q_syn - st->hTcxDec->Q_syn_Overl_TDAC = st->Q_syn; - Scale_sig( st->hTcxDec->old_syn_Overl, 320, st->Q_syn - st->hTcxDec->Q_old_syn_Overl ); // Scaling to Q_syn - st->hTcxDec->Q_old_syn_Overl = st->Q_syn; -#endif - -#if 0 - Scale_sig( synth_fx, L_frame_glob, st->Q_syn ); // Scaling to Q_syn - Scale_sig( synthFB_fx, L_frameTCX_glob, st->Q_syn ); // Scaling to Q_syn -#endif - Copy_Scale_sig_16_32_no_sat( st->old_Aq_12_8_fx, st->old_Aq_12_8_fx_32, M + 1, ( sub( 28, ( sub( 15, norm_s( sub( st->old_Aq_12_8_fx[0], 1 ) ) ) ) ) ) ); - Word16 q_win; + Word16 q_win, q_winFB; q_win = st->Q_syn; + move16(); + q_winFB = st->Q_syn; + move16(); + + assert( q_win == 0 ); - decoder_tcx_imdct_fx( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x_fx[0], q_x, xn_buf_fx, &q_win, MDCT_IV, + decoder_tcx_imdct_fx( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x_fx[0], q_x, xn_buf_fx, &q_win, &q_winFB, MDCT_IV, fUseTns, &synth_fx[0], &synthFB_fx[0], bfi, frame_cnt, sba_dirac_stereo_flag ); assert( q_win == 0 ); + assert( q_win == q_winFB ); /* Scaling up again */ Scale_sig( synth_fx, L_frame_glob, sub( st->Q_syn, q_win ) ); @@ -5667,6 +5633,7 @@ void decoder_tcx_imdct_fx( Word16 xn_buf_fx[], // Q(-2) #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 *q_win, + Word16 *q_winFB, #else Word16 q_win, #endif @@ -5915,7 +5882,7 @@ void decoder_tcx_imdct_fx( #endif hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_winFB ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #endif @@ -5928,7 +5895,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_winFB ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #endif diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index b1a78b1a8..3ae1a5036 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1103,6 +1103,7 @@ void ivas_mdct_core_reconstruct_fx( move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win = -2; + Word16 q_winFB = -2; #else #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_win = -1; @@ -1210,11 +1211,6 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win #endif -#if 0 - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win - Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_win, q_syn ) ); // q_syn -> q_win - Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win -#endif FOR( k = 0; k < nSubframes[ch]; k++ ) { @@ -1228,14 +1224,16 @@ void ivas_mdct_core_reconstruct_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { - decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, MDCT_IV, fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } ELSE { - decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, + decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } + + Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win #else IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { @@ -1254,6 +1252,8 @@ void ivas_mdct_core_reconstruct_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN q_win = -2; move16(); + q_winFB = -2; + move16(); #endif set16_fx( &synth_fx[k * L_frame[ch]], 0, L_frame[ch] ); set16_fx( &synthFB_fx[k * L_frame[ch]], 0, L_frameTCX[ch] ); @@ -1270,7 +1270,43 @@ void ivas_mdct_core_reconstruct_fx( set16_fx( &st->hTcxDec->syn_Overl_TDACFB[0], 0, shr( L_frameTCX[ch], 1 ) ); } } +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + test(); + IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) + { + TonalMDCTConceal_SaveTimeSignal_ivas_fx( st->hTonalMDCTConc, synthFB_fx, q_winFB, L_frameTCX[ch] ); + } + decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_winFB, NULL, bfi, MCT_flag ); + + sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) ); + IF( LT_16( sf, 2 ) ) + { + q_syn = sub( sf, 2 ); + st->Q_syn = q_syn; + move16(); + } + sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); + IF( LT_16( sf, sub( st->Q_syn, q_win ) ) ) + { + st->Q_syn = add( q_win, sf ); + } + Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDACFB ) ); // q_winFB -> Q(-1 - st->Q_syn) + st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn ); + move16(); + Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDAC ) ); // q_win -> Q(-1 - st->Q_syn) + st->hTcxDec->Q_syn_Overl_TDAC = sub( -1, st->Q_syn ); + move16(); + Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) + st->hTcxDec->Q_old_syn_Overl = sub( -1, st->Q_syn ); + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn + Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // q_win -> q_syn + Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); + Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_OverlFB ) ); // q_winFB -> st->Q_syn + st->hTcxDec->Q_syn_OverlFB = st->Q_syn; + Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn + st->hTcxDec->Q_syn_Overl = st->Q_syn; +#else test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) { @@ -1314,6 +1350,7 @@ void ivas_mdct_core_reconstruct_fx( st->hHQ_core->Q_old_wtda_LB = st->Q_syn; move16(); #endif +#endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Scale_sig( st->mem_syn2_fx, M, sub( -2, q_win ) ); // Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn -- GitLab From dd49640f2b28b53196c4ba39266ba19aaeb0e9f1 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 13 May 2025 19:38:32 +0200 Subject: [PATCH 0575/1310] clang format --- lib_dec/dec_tcx_fx.c | 6 +++--- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 037f2e3cb..2f8bf396f 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2635,8 +2635,7 @@ static void IMDCT_ivas_fx_rescale( Word16 *old_out_fx, Word16 *Q_old_out_fx, Word16 q_win, - const Word16 FB_flag -) + const Word16 FB_flag ) { Word16 oldLength; @@ -2655,7 +2654,8 @@ static void IMDCT_ivas_fx_rescale( Scale_sig( syn_Overl, oldLength / 2, sub( q_win, *Q_syn_Overl ) ); // st->hTcxDec->Q_syn_Overl -> q_win *Q_syn_Overl = q_win; move16(); - if ( FB_flag == 0 ) { + if ( FB_flag == 0 ) + { Scale_sig( old_syn_Overl, oldLength / 2, sub( q_win, *Q_old_syn_Overl ) ); // Q(-1 - st->Q_syn) -> q_win *Q_old_syn_Overl = q_win; move16(); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 3ae1a5036..995aa70e1 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1233,7 +1233,7 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } - Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win + Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win #else IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { @@ -1299,7 +1299,7 @@ void ivas_mdct_core_reconstruct_fx( move16(); Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) st->hTcxDec->Q_old_syn_Overl = sub( -1, st->Q_syn ); - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // q_win -> q_syn Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_OverlFB ) ); // q_winFB -> st->Q_syn -- GitLab From 42f1abb6475c802742ad48580d3a1e1782d17a93 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Tue, 13 May 2025 20:54:09 +0200 Subject: [PATCH 0576/1310] initialize q factor --- lib_rend/lib_rend.c | 106 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 02a812cf1..4b4d5c456 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1481,6 +1481,16 @@ static ivas_error setRendInputActiveIsm( #endif Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; + Word16 ivas_format; + IF( EQ_32( getAudioConfigType( inConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) + { + ivas_format = MC_FORMAT; + } + ELSE + { + ivas_format = ISM_FORMAT; + } + inputIsm = (input_ism *) input; rendCtx = inputIsm->base.ctx; @@ -1554,6 +1564,31 @@ static ivas_error setRendInputActiveIsm( return error; } + Word16 nchan_rend = num_src; + move16(); + + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } + /* Open TD renderer wrappers */ FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { @@ -1564,6 +1599,22 @@ static ivas_error setRendInputActiveIsm( /* Assert same delay as main TD renderer */ assert( inputIsm->splitTdRendWrappers[i].binaural_latency_ns == inputIsm->tdRendWrapper.binaural_latency_ns ); + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->splitTdRendWrappers[i].hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } } #endif } @@ -1577,14 +1628,38 @@ static ivas_error setRendInputActiveIsm( ELSE { #ifndef SPLIT_REND_WITH_HEAD_ROT - if ( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; } + Word16 nchan_rend = num_src; + move16(); - if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) { - if ( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } + + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { return error; } @@ -1595,6 +1670,31 @@ static ivas_error setRendInputActiveIsm( return error; } + Word16 nchan_rend = num_src; + move16(); + + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) + { + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -- GitLab From 361e8c5a62a47569ba7f61dbaaa51f01a04b267d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 14 May 2025 08:53:17 +0530 Subject: [PATCH 0577/1310] Fix for 3GPP issue 1375: Underflow observed in the quantize_pars_fx() function in the MC param upmix Link #1375 --- lib_com/basop_util.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index dc9013a42..e52f404f6 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -2640,10 +2640,16 @@ Word32 BASOP_Util_Add_Mant32Exp /* o : normalized result mantissa */ */ if ( !a_m ) - a_e = add( b_e, 0 ); + { + a_e = b_e; + move16(); + } if ( !b_m ) - b_e = add( a_e, 0 ); + { + b_e = a_e; + move16(); + } shift = sub( a_e, b_e ); shift = s_max( -31, shift ); @@ -2664,7 +2670,10 @@ Word32 BASOP_Util_Add_Mant32Exp /* o : normalized result mantissa */ if ( shift ) L_tmp = L_shl( L_tmp, shift ); if ( L_tmp == 0 ) - a_e = add( 0, 0 ); + { + a_e = 0; + move16(); + } if ( L_tmp != 0 ) a_e = sub( a_e, shift ); *ptr_e = a_e; -- GitLab From f1dbfb661fd3759e15d0b306bed7751377c59e02 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 9 May 2025 12:05:04 +0530 Subject: [PATCH 0578/1310] Bug fix in find_targets_ivas_fx and GetEnergyCldfb --- lib_com/cldfb.c | 177 +++++++++++++++++++++++++++++++++++++++++- lib_enc/find_tar_fx.c | 10 +-- 2 files changed, 181 insertions(+), 6 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 6a9581498..bf832b640 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -60,6 +60,19 @@ static void cldfb_init_proto_and_twiddles( HANDLE_CLDFB_FILTER_BANK hs ); static void cldfb_init_proto_and_twiddles_enc_fx( HANDLE_CLDFB_FILTER_BANK hs ); +static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */ + Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */ + const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ + Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */ + Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */ + Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ + Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ + Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ + Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ + Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ + Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/ + Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ + TEC_ENC_HANDLE hTecEnc ); /*-------------------------------------------------------------------* * cplxMult() @@ -1552,6 +1565,168 @@ void resampleCldfb_ivas_fx( return; } +static void GetEnergyCldfb_ivas_fx( Word32 *energyLookahead, /*!< o: Q(*sf_energyLookahead) | pointer to the result in the core look-ahead slot */ + Word16 *sf_energyLookahead, /*!< o: pointer to the scalefactor of the result in the core look-ahead slot */ + const Word16 numLookahead, /*!< i: Q0 the number of look-ahead time-slots */ + Word16 **realValues, /*!< i: Q(sf_Values) | the real part of the CLDFB subsamples */ + Word16 **imagValues, /*!< i: Q(sf_Values) | the imaginary part of the CLDFB subsamples */ + Word16 sf_Values, /*!< i: scalefactor of the CLDFB subcamples - apply as a negated Exponent */ + Word16 numberBands, /*!< i: Q0 | number of CLDFB bands */ + Word16 numberCols, /*!< i: Q0 | number of CLDFB subsamples */ + Word32 *energyHF, /*!< o: Q31 | pointer to HF energy */ + Word16 *energyHF_Exp, /*!< o: pointer to exponent of HF energy */ + Word32 *energyValuesSum, /*!< o: Q(2*sf_Values-4) | pointer to sum array of energy values, not initialized*/ + Word16 *energyValuesSum_Exp, /*!< o: pointer to exponents of energyValuesSum, not initialized */ + TEC_ENC_HANDLE hTecEnc ) +{ + Word16 j; + Word16 k; + Word16 s; + Word16 sm; + Word32 nrg; + Word16 numberColsL; + Word16 numberBandsM; + Word16 numberBandsM20; + Word32 energyValues[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 energyValuesSumE[CLDFB_NO_CHANNELS_MAX]; + // Word16 freqTable[2] = {20, 40}; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + FOR( k = 0; k < numberCols; k++ ) + { + FOR( j = 0; j < numberBands; j++ ) + { + nrg = L_mult0( realValues[k][j], realValues[k][j] ); // Q(2*sf_Values) + nrg = L_mac0( nrg, imagValues[k][j], imagValues[k][j] ); // Q(2*sf_Values) + + energyValues[k][j] = nrg; + move32(); + } + } + + IF( GE_16( numberBands, freqTable[1] ) && hTecEnc != NULL ) + { + Word32 *tempEnergyValuesArry[CLDFB_NO_COL_MAX]; + Word16 ScaleX2; + assert( numberCols == CLDFB_NO_COL_MAX ); + FOR( j = 0; j < numberCols; j++ ) + { + tempEnergyValuesArry[j] = &energyValues[j][0]; + } + + ScaleX2 = shl( sf_Values, 1 ); + calcHiEnvLoBuff_Fix( + numberCols, + freqTable, + 1, + tempEnergyValuesArry, + hTecEnc->loBuffer, + hTecEnc->hiTempEnv, + ScaleX2 ); + } + + FOR( j = 0; j < numberBands; j++ ) + { + energyValuesSum[j] = 0; + move32(); + energyValuesSumE[j] = 31; + move16(); + FOR( k = 0; k < CLDFB_NO_COL_MAX; k++ ) + { + nrg = L_shr_r( energyValues[k][j], sub( energyValuesSumE[j], 31 ) ); // Q(2*sf_Values - (energyValuesSumE[j]-31)) + IF( LT_32( L_sub( maxWord32, nrg ), energyValuesSum[j] ) ) + { + energyValuesSumE[j] = add( energyValuesSumE[j], 1 ); + move16(); + energyValuesSum[j] = L_shr_r( energyValuesSum[j], 1 ); + move32(); + nrg = L_shr_r( nrg, 1 ); + } + energyValuesSum[j] = L_add( energyValuesSum[j], nrg ); + move32(); + } + test(); + if ( j == 0 || GT_16( energyValuesSumE[j], *energyValuesSum_Exp ) ) + { + *energyValuesSum_Exp = energyValuesSumE[j]; + move16(); + } + } + FOR( j = 0; j < numberBands; j++ ) + { + energyValuesSum[j] = L_shr_r( energyValuesSum[j], sub( *energyValuesSum_Exp, energyValuesSumE[j] ) ); // Q(energyValuesSum_Exp - (2*sf_Values)) + move32(); + } + *energyValuesSum_Exp = sub( *energyValuesSum_Exp, shl( sf_Values, 1 ) ); + move16(); + + IF( GT_16( numberBands, 20 ) ) + { + numberBandsM = s_min( numberBands, 40 ); + numberBandsM20 = sub( numberBandsM, 20 ); + + numberColsL = sub( numberCols, numLookahead ); + + /* sum up CLDFB energy above 8 kHz */ + s = BASOP_util_norm_s_bands2shift( i_mult( numberColsL, numberBandsM20 ) ); + s = sub( s, 4 ); + nrg = 0; + move32(); + FOR( k = 0; k < numberColsL; k++ ) + { + FOR( j = 20; j < numberBandsM; j++ ) + { + nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); + } + } + + s = sub( sub( shl( sf_Values, 1 ), 1 ), s ); + sm = sub( s_min( s, *sf_energyLookahead ), 1 ); + + *energyHF = L_add( L_shr( nrg, limitScale32( sub( s, sm ) ) ), + L_shr( *energyLookahead, sub( *sf_energyLookahead, sm ) ) ); // Q(31-(-nm)) + move32(); + + *energyHF_Exp = negate( sm ); + move16(); + + /* process look-ahead region */ + s = BASOP_util_norm_s_bands2shift( i_mult( numLookahead, numberBandsM20 ) ); + s = sub( s, 2 ); + nrg = 0; + move32(); + FOR( k = numberColsL; k < numberCols; k++ ) + { + FOR( j = 20; j < numberBandsM; j++ ) + { + nrg = L_add_o( nrg, L_shr_o( energyValues[k][j], s, &Overflow ), &Overflow ); + } + } + + s = sub( shl( sf_Values, 1 ), s ); + sm = sub( s_min( s, 44 ), 1 ); + BASOP_SATURATE_WARNING_OFF_EVS + /* nrg + 6.1e-5f => value 0x40000000, scale 44 */ + *energyLookahead = L_add_sat( L_shr_sat( nrg, sub( s, sm ) ), + L_shr_sat( 0x40000000, s_max( -31, s_min( 31, sub( 44, sm ) ) ) ) ); + move32(); + BASOP_SATURATE_WARNING_ON_EVS + *sf_energyLookahead = sm; + move16(); + + return; + } + + + *energyHF = 0x40000000; + move32(); + *energyHF_Exp = 17; + move16(); +} + void analysisCldfbEncoder_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ @@ -1613,7 +1788,7 @@ void analysisCldfbEncoder_ivas_fx( AnalysisPostSpectrumScaling_Fx( st->cldfbAnaEnc, ppBuf_Real, ppBuf_Imag, ppBuf_Real16, ppBuf_Imag16, &enerScale.lb_scale16 ); - GetEnergyCldfb( &st->energyCoreLookahead_Fx, &st->sf_energyCoreLookahead_Fx, 1, ppBuf_Real16, ppBuf_Imag16, enerScale.lb_scale16, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, &st->currEnergyHF_fx, &st->currEnergyHF_e_fx, ppBuf_Ener, enerBuffSum_exp, st->hTECEnc ); + GetEnergyCldfb_ivas_fx( &st->energyCoreLookahead_Fx, &st->sf_energyCoreLookahead_Fx, 1, ppBuf_Real16, ppBuf_Imag16, enerScale.lb_scale16, st->cldfbAnaEnc->no_channels, st->cldfbAnaEnc->no_col, &st->currEnergyHF_fx, &st->currEnergyHF_e_fx, ppBuf_Ener, enerBuffSum_exp, st->hTECEnc ); return; } diff --git a/lib_enc/find_tar_fx.c b/lib_enc/find_tar_fx.c index 8d3efb834..989f309d2 100644 --- a/lib_enc/find_tar_fx.c +++ b/lib_enc/find_tar_fx.c @@ -219,13 +219,13 @@ void find_targets_ivas_fx( /* first half: xn[] --> cn[] */ temp[0] = 0; move16(); - preemph_copy_fx( xn, cn, tilt_fac, L_SUBFR / 2, temp ); - syn_filt_s_lc_fx( 1, Ap, cn, temp, L_SUBFR / 2 ); /* Q-1 -> Q-2 */ - Residu3_lc_fx( p_Aq, M, temp, cn, L_SUBFR / 2, 1 ); /* Q-2 -> Q-1 */ - Scale_sig( cn, L_SUBFR / 2, 1 ); + preemph_copy_fx( xn, cn, tilt_fac, L_subfr / 2, temp ); + syn_filt_s_lc_fx( 1, Ap, cn, temp, L_subfr / 2 ); /* Q-1 -> Q-2 */ + Residu3_lc_fx( p_Aq, M, temp, cn, L_subfr / 2, 1 ); /* Q-2 -> Q-1 */ + Scale_sig( cn, L_subfr / 2, 1 ); /* second half: res[] --> cn[] (approximated and faster) */ - Copy( &res[i_subfr + ( L_SUBFR / 2 )], cn + ( L_SUBFR / 2 ), L_SUBFR / 2 ); + Copy( &res[i_subfr + ( L_subfr / 2 )], cn + ( L_subfr / 2 ), L_subfr / 2 ); } /*---------------------------------------------------------------* -- GitLab From 441cc348071908a2d4030877dc8a5e3a19ac51ac Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 14 May 2025 16:29:38 +0530 Subject: [PATCH 0579/1310] Fix for 3GPP issue 1395: Stereo Encoder 32 kbps, DTX on: Plop-artefact in right Channel LTV Link #1395 --- lib_enc/ivas_stereo_switching_enc_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_enc/ivas_stereo_switching_enc_fx.c b/lib_enc/ivas_stereo_switching_enc_fx.c index 8e372b311..a54e56fb9 100644 --- a/lib_enc/ivas_stereo_switching_enc_fx.c +++ b/lib_enc/ivas_stereo_switching_enc_fx.c @@ -898,6 +898,8 @@ void stereo_switching_enc_fx( IF( sts[0]->hLPDmem != NULL ) { Copy( sts[0]->hLPDmem->old_exc, sts[1]->hLPDmem->old_exc, L_EXC_MEM ); + sts[1]->hLPDmem->q_lpd_old_exc = sts[0]->hLPDmem->q_lpd_old_exc; + move16(); } Copy( sts[0]->lsf_old_fx, sts[1]->lsf_old_fx, M ); /* Qlog2(2.56) */ Copy( sts[0]->lsp_old_fx, sts[1]->lsp_old_fx, M ); /* Q15 */ -- GitLab From d6a5545a87cf88d7866d7e4bb7db26f9e4efee29 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 14 May 2025 14:39:40 +0200 Subject: [PATCH 0580/1310] Correct scaling of synth_buf_fx/synth_bufFB_fx. Cleanup of obsolete code. --- lib_com/prot_fx.h | 3 - lib_dec/dec_tcx_fx.c | 79 +++++++++++++------------- lib_dec/ivas_mct_dec_fx.c | 4 -- lib_dec/ivas_mdct_core_dec_fx.c | 22 +++---- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 4 -- 5 files changed, 46 insertions(+), 66 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index a84d0d8dc..704049d9f 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9949,9 +9949,6 @@ void ivas_mdct_core_reconstruct_fx( /* o : synthesis @output_FS */ // e_sig Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ -#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) - const Word16 isParamMC, -#endif Word16 q_x, Word16 e_sig[CPE_CHANNELS] ); diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 2f8bf396f..1eee95a3b 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2573,22 +2573,6 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN -#if 0 -static Word16 IMDCT_ivas_fx_adjust_qwin( - Word16 Q_syn_Overl_TDAC, - Word16 Q_syn_Overl, - Word16 Q_old_syn_Overl, - Word16 Q_old_wtda, - Word16 q_win ) -{ - // q_win = s_min( s_min( s_min( s_min( Q_syn_Overl_TDAC , Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ), q_win ); - q_win = s_min( s_min( s_min( Q_syn_Overl_TDAC, Q_syn_Overl ), Q_old_syn_Overl ), Q_old_wtda ); - q_win = s_min( q_win, -1 ); - q_win = s_max( q_win, -2 ); - - return q_win; -} -#endif static Word16 IMDCT_ivas_fx_calc_qwin( Word16 *syn_Overl_TDAC, @@ -2599,9 +2583,12 @@ static Word16 IMDCT_ivas_fx_calc_qwin( Word16 Q_old_syn_Overl, Word16 *old_out_fx, Word16 Q_old_out_fx, - const Word16 FB_flag, - Word16 q_win ) + Word16 q_win, + const Word16 L_frame, + const Word16 L_frameTCX, + const Word16 FB_flag ) { +#if 0 Word16 oldLength; oldLength = L_FRAME32k; @@ -2611,6 +2598,18 @@ static Word16 IMDCT_ivas_fx_calc_qwin( oldLength = L_FRAME48k; move16(); } +#else + Word16 oldLength; + + oldLength = L_frame; + move16(); + if ( FB_flag ) + { + oldLength = L_frameTCX; + move16(); + } +#endif + q_win = 4; move16(); @@ -2736,7 +2735,6 @@ static void TCX_MDCT_Inverse_qwin_fx( negfac = negate( fac ); -#if 1 IF( allow_qwin_change ) { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); @@ -2744,9 +2742,7 @@ static void TCX_MDCT_Inverse_qwin_fx( s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); *q_win = s_min( sub( s, x_e ), *q_win ); } -#else - assert( *q_win == 0 || *q_win == -2 ); -#endif + s = add( x_e, *q_win ); move16(); @@ -2805,7 +2801,6 @@ static void TCX_MDST_Inverse_qwin_fx( negfac = negate( fac ); -#if 1 IF( allow_qwin_change ) { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); @@ -2813,9 +2808,7 @@ static void TCX_MDST_Inverse_qwin_fx( s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); *q_win = s_min( sub( s, x_e ), *q_win ); } -#else - assert( *q_win == 0 || *q_win == -2 ); -#endif + s = add( x_e, *q_win ); move16(); @@ -2893,7 +2886,6 @@ static void TCX_MDXT_Inverse_qwin_fx( signRight = negfac; } -#if 1 IF( allow_qwin_change ) { // x_e + q_win == L_norm_arr(tmp_buf, , *q_win ); @@ -2901,9 +2893,7 @@ static void TCX_MDXT_Inverse_qwin_fx( s = L_norm_arr( tmp_buf + L2, m + R2 + L2 ); *q_win = s_min( sub( s, x_e ), *q_win ); } -#else - assert( *q_win == 0 || *q_win == -2 ); -#endif + s = add( x_e, *q_win ); move16(); @@ -2932,7 +2922,6 @@ static void TCX_MDXT_Inverse_qwin_fx( return; } - #endif void IMDCT_ivas_fx( @@ -3002,7 +2991,7 @@ void IMDCT_ivas_fx( { // q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); q_win = IMDCT_ivas_fx_calc_qwin( syn_Overl_TDAC_fx, *Q_syn_Overl_TDAC_fx, old_syn_overl_fx, *Q_old_syn_overl_fx, - hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, FB_flag, q_win ); + hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, q_win, L_frame, L_frameTCX, FB_flag ); } #else x_e_hdrm = add( q_win, sub( Q16, q_x ) ); @@ -3083,6 +3072,7 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( allow_qwin_change ) { + /* Use fixed q_win to avoid the need to adapt scaling of two TCX5 blocks (less effort with maybe not ideal scaling) */ q_win = -2; move16(); allow_qwin_change = 0; @@ -3165,6 +3155,17 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win_prev; +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( allow_qwin_change ) + { + /* Use fixed q_win to avoid the need to adapt scaling of two TCX5 blocks (less effort with maybe not ideal scaling) */ + q_win = -2; + move16(); + allow_qwin_change = 0; + move16(); + } +#endif + IF( EQ_16( kernel_type, MDST_IV ) ) { TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, win_fx + L_win, 0, sub( L_win, shr( L_ola, 1 ) ), L_ola, &q_win, allow_qwin_change ); @@ -3202,11 +3203,11 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( s_and( kernel_type, 1 ) ) { - TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, 0 ); + TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, allow_qwin_change ); } ELSE { - TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, 0 ); + TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } assert( q_win_prev == q_win ); @@ -3392,14 +3393,10 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN if ( allow_qwin_change ) { -#if 1 // sub( q_xn_buf_fx_32, q_win ) == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_xn_buf_fx_32 - q_win == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 1 ); -#else - q_win = -2; -#endif } IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif @@ -4188,7 +4185,7 @@ void decoder_tcx_ivas_fx( /* Scaling up again */ Scale_sig( synth_fx, L_frame_glob, sub( st->Q_syn, q_win ) ); - Scale_sig( synthFB_fx, L_frameTCX_glob, sub( st->Q_syn, q_win ) ); + Scale_sig( synthFB_fx, L_frameTCX_glob, sub( st->Q_syn, q_winFB ) ); // Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, 1 ); Scale_sig( st->hTcxDec->old_syn_Overl, 320, ( -2 - st->hTcxDec->Q_old_syn_Overl ) ); // Scaling to Q-2 @@ -5860,7 +5857,7 @@ void decoder_tcx_imdct_fx( } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 shift_q = sub( q_x, *q_win ); + Word16 shift_q = sub( q_x, *q_winFB ); #endif FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) @@ -5902,7 +5899,7 @@ void decoder_tcx_imdct_fx( } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - shift_q = sub( q_x, *q_win ); + shift_q = sub( q_x, *q_winFB ); #endif FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 4c3b8b782..b34ce0c56 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -346,11 +346,7 @@ ivas_error ivas_mct_dec_fx( } Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); -#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) - ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, st_ivas->mc_mode == MC_MODE_PARAMMC, q_output, e_sig ); -#else ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, e_sig ); -#endif Word16 hdrm, sh; hdrm = getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 995aa70e1..56cd70609 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1083,9 +1083,6 @@ void ivas_mdct_core_reconstruct_fx( /* o : synthesis @output_FS */ // e_sig Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ -#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) - const Word16 isParamMC, -#endif Word16 q_x, Word16 e_sig[CPE_CHANNELS] ) { @@ -1103,7 +1100,9 @@ void ivas_mdct_core_reconstruct_fx( move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win = -2; + move16(); Word16 q_winFB = -2; + move16(); #else #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_win = -1; @@ -1130,13 +1129,6 @@ void ivas_mdct_core_reconstruct_fx( bfi = sts[0]->bfi; move16(); -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - if ( isParamMC ) - q_win = -2; -#endif -#endif - /* TNS, ITF, IMDCT and updates */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -1233,7 +1225,9 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } - Scale_sig( st->syn, M + 1, sub( q_win, st->Q_syn ) ); // st->Q_syn -> q_win + // Need to rescale for each subframe, because q_win/q_winFB might change for the next subframe. Other OLA buffers are rescaled each time. + Scale_sig( &synth_fx[k * L_frame[ch]], add( L_frame[ch], M ), sub( st->hTcxDec->q_old_synth, q_win ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( &synthFB_fx[k * L_frameTCX[ch]], add( L_frameTCX[ch], M ), sub( st->hTcxDec->q_old_synth, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth #else IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { @@ -1299,13 +1293,13 @@ void ivas_mdct_core_reconstruct_fx( move16(); Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) st->hTcxDec->Q_old_syn_Overl = sub( -1, st->Q_syn ); - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // q_win -> q_syn - Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // q_win -> q_syn - Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_OverlFB ) ); // q_winFB -> st->Q_syn st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn + Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn + Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); #else test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index e70b1c137..890e5fc9e 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -550,11 +550,7 @@ void stereo_mdct_core_dec_fx( } Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, M + 1, sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); /* Q28 */ -#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) - ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, st_ivas->mc_mode == MC_MODE_PARAMMC, Q11, e_sigFB ); -#else ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, Q11, e_sigFB ); -#endif Copy32( signal_out_tmp_fx[0], signal_out_fx[0], L_FRAME48k ); /* Q11 */ Copy32( signal_out_tmp_fx[1], signal_out_fx[1], L_FRAME48k ); /* Q11 */ -- GitLab From 85a0fa2eae5acd675c251603a3f733ce51244dfb Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 14 May 2025 14:43:03 +0200 Subject: [PATCH 0581/1310] clang format --- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 56cd70609..bd20c26d0 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1226,7 +1226,7 @@ void ivas_mdct_core_reconstruct_fx( } // Need to rescale for each subframe, because q_win/q_winFB might change for the next subframe. Other OLA buffers are rescaled each time. - Scale_sig( &synth_fx[k * L_frame[ch]], add( L_frame[ch], M ), sub( st->hTcxDec->q_old_synth, q_win ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( &synth_fx[k * L_frame[ch]], add( L_frame[ch], M ), sub( st->hTcxDec->q_old_synth, q_win ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( &synthFB_fx[k * L_frameTCX[ch]], add( L_frameTCX[ch], M ), sub( st->hTcxDec->q_old_synth, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth #else IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) @@ -1297,7 +1297,7 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); #else -- GitLab From 3292aa1527b10f3dce273c9393a3ffe2dc54a4b6 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 14 May 2025 17:22:24 +0200 Subject: [PATCH 0582/1310] Small improvement of synth_buf scaling and get rid of some magic constants that are not the right ones anymore. --- lib_dec/ivas_mdct_core_dec_fx.c | 75 +++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index bd20c26d0..5720da8bb 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1099,10 +1099,8 @@ void ivas_mdct_core_reconstruct_fx( Word16 q_syn = 0; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 q_win = -2; - move16(); - Word16 q_winFB = -2; - move16(); + Word16 q_win; + Word16 q_winFB; #else #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_win = -1; @@ -1171,15 +1169,19 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->q_old_synth = 0; move16(); } +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth +#endif q_syn = st->hTcxDec->q_old_synth; move16(); set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); IF( st->core != ACELP_CORE ) { -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_win0, q_winFB0; +#else Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win st->hTcxDec->Q_syn_Overl_TDACFB = q_win; move16(); @@ -1209,11 +1211,23 @@ void ivas_mdct_core_reconstruct_fx( init_tcx_info_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + assert( nSubframes[ch] <= 2 ); + q_win0 = q_win; + move16(); + q_winFB0 = q_winFB; + move16(); + q_win = -2; + move16(); + q_winFB = -2; + move16(); +#endif + IF( !skip_decoding ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN test(); test(); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, @@ -1224,11 +1238,9 @@ void ivas_mdct_core_reconstruct_fx( decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } - - // Need to rescale for each subframe, because q_win/q_winFB might change for the next subframe. Other OLA buffers are rescaled each time. - Scale_sig( &synth_fx[k * L_frame[ch]], add( L_frame[ch], M ), sub( st->hTcxDec->q_old_synth, q_win ) ); // q_win -> st->hTcxDec->q_old_synth - Scale_sig( &synthFB_fx[k * L_frameTCX[ch]], add( L_frameTCX[ch], M ), sub( st->hTcxDec->q_old_synth, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth #else + test(); + test(); IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, @@ -1265,6 +1277,26 @@ void ivas_mdct_core_reconstruct_fx( } } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + + IF ( nSubframes[ch] > 1 ) { + Word16 q_winN, q_winFBN; + + q_winN = s_min( q_win, q_win0 ); + q_winFBN = s_min( q_winFB, q_winFB0 ); + // Need to rescale for each subframe, because q_win/q_winFB might had changed for the next subframe. Other OLA buffers are rescaled each time. + Scale_sig( synth_fx, L_frame[ch], sub( q_winN, q_win0 ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( synthFB_fx, L_frameTCX[ch], sub( q_winFBN, q_winFB0 ) ); // q_winFB -> st->hTcxDec->q_old_synth + Scale_sig( synth_fx + L_frame[ch], add( L_frame[ch], M ), sub( q_winN, q_win ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( synthFB_fx + L_frameTCX[ch], add( L_frameTCX[ch], M ), sub( q_winFBN, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth + q_win = q_winN; + move16(); + q_winFB = q_winFBN; + move16(); + } + + Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth + Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) ); + test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) { @@ -1272,18 +1304,17 @@ void ivas_mdct_core_reconstruct_fx( } decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_winFB, NULL, bfi, MCT_flag ); + // norm(synth_buf) >= q_syn - q_win + // norm(synth_buf) + q_win >= q_syn sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) ); - IF( LT_16( sf, 2 ) ) - { - q_syn = sub( sf, 2 ); - st->Q_syn = q_syn; - move16(); - } + q_syn = add( sf, s_min( q_win, q_winFB ) ); + st->Q_syn = q_syn; + move16(); + + // norm(old_out) >= st->Q_syn - q_win + // norm(old_out) + q_win >= st->Q_syn sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); - IF( LT_16( sf, sub( st->Q_syn, q_win ) ) ) - { - st->Q_syn = add( q_win, sf ); - } + st->Q_syn = add( sf, s_min( q_win, q_winFB ) ); Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDACFB ) ); // q_winFB -> Q(-1 - st->Q_syn) st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn ); @@ -1297,8 +1328,8 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn - Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn + Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); #else test(); -- GitLab From c1f1d26f60d97674df28fbe160514a335cca2ad6 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 14 May 2025 17:25:01 +0200 Subject: [PATCH 0583/1310] clang format --- lib_dec/ivas_mdct_core_dec_fx.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 5720da8bb..0e36179e4 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1278,15 +1278,16 @@ void ivas_mdct_core_reconstruct_fx( } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - IF ( nSubframes[ch] > 1 ) { + IF( nSubframes[ch] > 1 ) + { Word16 q_winN, q_winFBN; q_winN = s_min( q_win, q_win0 ); q_winFBN = s_min( q_winFB, q_winFB0 ); // Need to rescale for each subframe, because q_win/q_winFB might had changed for the next subframe. Other OLA buffers are rescaled each time. - Scale_sig( synth_fx, L_frame[ch], sub( q_winN, q_win0 ) ); // q_win -> st->hTcxDec->q_old_synth - Scale_sig( synthFB_fx, L_frameTCX[ch], sub( q_winFBN, q_winFB0 ) ); // q_winFB -> st->hTcxDec->q_old_synth - Scale_sig( synth_fx + L_frame[ch], add( L_frame[ch], M ), sub( q_winN, q_win ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( synth_fx, L_frame[ch], sub( q_winN, q_win0 ) ); // q_win -> st->hTcxDec->q_old_synth + Scale_sig( synthFB_fx, L_frameTCX[ch], sub( q_winFBN, q_winFB0 ) ); // q_winFB -> st->hTcxDec->q_old_synth + Scale_sig( synth_fx + L_frame[ch], add( L_frame[ch], M ), sub( q_winN, q_win ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( synthFB_fx + L_frameTCX[ch], add( L_frameTCX[ch], M ), sub( q_winFBN, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth q_win = q_winN; move16(); @@ -1294,7 +1295,7 @@ void ivas_mdct_core_reconstruct_fx( move16(); } - Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth + Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) ); test(); @@ -1328,7 +1329,7 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; - Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); #else -- GitLab From 0f73e249c0a13909a13d4814b07640956c66c1fe Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 14 May 2025 18:03:21 +0200 Subject: [PATCH 0584/1310] Fix uninitialized memory in BFI case. --- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 0e36179e4..1776f82e8 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1384,6 +1384,10 @@ void ivas_mdct_core_reconstruct_fx( } ELSE /*ACELP core for ACELP-PLC */ { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth + Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth +#endif assert( EQ_16( st->bfi, 1 ) ); /* PLC: [TCX: TD PLC] */ IF( MCT_flag != 0 ) -- GitLab From 3b59641e8a6fc5fc7c5d0c0ee7731839f0412bbb Mon Sep 17 00:00:00 2001 From: marc emerit Date: Wed, 14 May 2025 20:20:54 +0200 Subject: [PATCH 0585/1310] compiling ok to test --- apps/decoder.c | 24 + apps/renderer.c | 23 + lib_com/options.h | 5 +- lib_rend/ivas_crend_fx.c | 312 +- lib_rend/ivas_rom_binaural_crend_head.h | 60 + lib_rend/ivas_rom_binaural_crend_head_fx.c | 114453 +++++++++--------- lib_rend/ivas_stat_rend.h | 14 + lib_util/hrtf_file_reader.c | 41 +- lib_util/hrtf_file_reader.h | 11 + 9 files changed, 57723 insertions(+), 57220 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 01a373fe7..64f131206 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -687,6 +687,29 @@ int main( #ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) { +#ifdef FIX_OLD_BINARY_FORMAT + cleanup_SetOfHRTF( hSetOfHRTF ); + hrtfFileReader_close( &hrtfReader ); + strcat( arg.hrtfFileName, "new" ); + + if ( hrtfFileReader_open( arg.hrtfFileName, &hrtfReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + else + { + destroy_SetOfHRTF( hSetOfHRTF ); + } + } +#else if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) { fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); @@ -696,6 +719,7 @@ int main( { destroy_SetOfHRTF( hSetOfHRTF ); } +#endif } #else if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) diff --git a/apps/renderer.c b/apps/renderer.c index 851583bbf..1ef7473c5 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1090,6 +1090,28 @@ int main( if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfFileReader, args.sampleRate ) ) != IVAS_ERR_OK ) { +#ifdef FIX_OLD_BINARY_FORMAT + cleanup_SetOfHRTF( hSetOfHRTF ); + hrtfFileReader_close( &hrtfFileReader ); + strcat( args.customHrtfFilePath, "new" ); + if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfFileReader, args.sampleRate ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); + goto cleanup; + } + else + { + destroy_SetOfHRTF( hSetOfHRTF ); + } + } +#else if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) { fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); @@ -1099,6 +1121,7 @@ int main( { destroy_SetOfHRTF( hSetOfHRTF ); } +#endif } if ( ( error = IVAS_REND_GetHrtfFastConvHandle( hIvasRend, &hHrtfFastConv ) ) != IVAS_ERR_OK ) diff --git a/lib_com/options.h b/lib_com/options.h index 2c698d7ad..1e8036f6b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,7 +106,7 @@ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ #define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ -//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES @@ -114,6 +114,9 @@ #endif #define FIX_OLD_BINARY_FORMAT /* Orange: trick to make tests succesful when changing hrtf binary format between ref and new branch*/ #define FIX_OLD_BINARY_FILE /* Orange: current hrtf binary file in ref branch contains wrong values for fastconv value. This switch can be activated to compre running codec with and without hrtf file*/ +#define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ +#define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ + #endif /* #################### End BASOP porting switches ############################ */ diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index c6644b573..134d02996 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -71,6 +71,10 @@ ivas_error ivas_hrtf_init( hHrtf->max_num_ir = 0; hHrtf->max_num_iterations = 0; hHrtf->index_frequency_max_diffuse = 0; +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->same_inv_diffuse_weight = 1; + move16(); +#endif move32(); move16(); move16(); @@ -79,10 +83,16 @@ ivas_error ivas_hrtf_init( FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = 0; move16(); +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = 0; + move16(); +#endif hHrtf->num_iterations[i][j] = 0; move16(); hHrtf->pIndex_frequency_max[i][j] = NULL; @@ -101,8 +111,9 @@ ivas_error ivas_hrtf_init( hHrtf->pOut_to_bin_diffuse_im_fx[j] = NULL; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING +#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->init_from_rom = 1; + move16(); #endif return IVAS_ERR_OK; @@ -253,6 +264,7 @@ static ivas_error ivas_rend_initCrend_fx( { #ifdef NONBE_FIX_BINARY_BINAURAL_READING hHrtf->init_from_rom = 1; + move16(); #endif IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { @@ -422,6 +434,7 @@ static ivas_error ivas_rend_initCrend_fx( IF( EQ_32( output_Fs, 48000 ) ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 @@ -431,11 +444,14 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 } move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[j][tmp]; +#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -444,6 +460,9 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[j][tmp]; +#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -458,6 +477,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 32000 ) ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 @@ -467,11 +487,14 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 } move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[j][tmp]; +#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -480,6 +503,9 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[j][tmp]; +#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -494,6 +520,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 16000 ) ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 @@ -503,11 +530,14 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 } move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[j][tmp]; +#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -516,6 +546,9 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[j][tmp]; +#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -549,11 +582,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -589,11 +627,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -630,11 +673,17 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 move16(); +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -678,11 +727,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -718,11 +772,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -759,11 +818,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -807,11 +871,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -847,11 +916,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -888,11 +962,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 + move16(); +#endif hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -937,7 +1016,6 @@ static ivas_error ivas_rend_initCrend_fx( { #ifdef NONBE_FIX_BINARY_BINAURAL_READING hHrtf->init_from_rom = 0; - move16(); #endif IF( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { @@ -951,7 +1029,7 @@ static ivas_error ivas_rend_initCrend_fx( #ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( hSetOfHRTF->hHRTF_brir_combined == NULL ) { - return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Invalid command wrong output format" ); } #endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_brir_combined->latency_s_fx; // Q31 @@ -963,7 +1041,7 @@ static ivas_error ivas_rend_initCrend_fx( #ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( hSetOfHRTF->hHRTF_hrir_combined == NULL ) { - return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Invalid command wrong output format" ); } #endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx; // Q31 @@ -1025,6 +1103,7 @@ static ivas_error ivas_rend_initCrend_fx( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); } move16(); +#ifndef FIX_INV_DIFFUSE_WEIGHT IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { @@ -1035,11 +1114,15 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx[tmp]; // Q15 } move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight_fx[j][tmp]; + move16(); +#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max[tmp][j]; @@ -1048,6 +1131,10 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx[j][tmp]; + move16(); +#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max[tmp][j]; @@ -1080,11 +1167,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx[i]; // Q31 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx[j][i]; + move16(); +#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; @@ -1126,11 +1218,16 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx[i]; // Q15 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx[j][i]; + move16(); +#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j]; @@ -1172,11 +1269,17 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { +#ifndef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx[i]; // Q31 move16(); - +#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx[j][i]; + move16(); +#endif + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j]; @@ -1208,6 +1311,21 @@ static ivas_error ivas_rend_initCrend_fx( } } +#ifdef FIX_INV_DIFFUSE_WEIGHT + hHrtf->same_inv_diffuse_weight = 1; + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + if ( hHrtf->inv_diffuse_weight_fx[0][i] != hHrtf->inv_diffuse_weight_fx[1][i] ) + { + hHrtf->same_inv_diffuse_weight = 0; + break; + } + } + } +#endif + pCrend->hHrtfCrend = hHrtf; return IVAS_ERR_OK; @@ -1520,8 +1638,15 @@ ivas_error ivas_rend_initCrendWrapper( } hCrend->hTrack = NULL; +#ifdef FIX_INV_DIFFUSE_WEIGHT + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; +#else hCrend->freq_buffer_re_diffuse_fx = NULL; hCrend->freq_buffer_im_diffuse_fx = NULL; +#endif hCrend->hReverb = NULL; hCrend->reflections = NULL; hCrend->delay_line_rw_index = 0; @@ -1668,22 +1793,80 @@ ivas_error ivas_rend_openCrend( IF( max_total_ir_len > 0 ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + IF( ( hCrend->freq_buffer_re_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_re_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + } + ELSE + { + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + } +#else IF( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } +#endif +#ifdef FIX_INV_DIFFUSE_WEIGHT + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[1], max_total_ir_len ); + } +#else set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx, max_total_ir_len ); - +#endif +#ifdef FIX_INV_DIFFUSE_WEIGHT + IF( ( hCrend->freq_buffer_im_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_im_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + } + ELSE + { + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; + } +#else IF( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } +#endif +#ifdef FIX_INV_DIFFUSE_WEIGHT + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[1], max_total_ir_len ); + } +#else set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx, max_total_ir_len ); +#endif } ELSE { +#ifdef FIX_INV_DIFFUSE_WEIGHT + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; +#else hCrend->freq_buffer_re_diffuse_fx = NULL; hCrend->freq_buffer_im_diffuse_fx = NULL; +#endif } max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ @@ -1837,7 +2020,31 @@ void ivas_rend_closeCrend( free( hCrend->lfe_delay_line_fx ); hCrend->lfe_delay_line_fx = NULL; } +#ifdef FIX_INV_DIFFUSE_WEIGHT + IF( hCrend->freq_buffer_re_diffuse_fx[0] != NULL ) + { + free( hCrend->freq_buffer_re_diffuse_fx[0] ); + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + } + + IF( hCrend->freq_buffer_im_diffuse_fx[0] != NULL ) + { + free( hCrend->freq_buffer_im_diffuse_fx[0] ); + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; + } + + IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) + { + free( hCrend->freq_buffer_re_diffuse_fx[1] ); + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + } + IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) + { + free( hCrend->freq_buffer_im_diffuse_fx[1] ); + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; + } +#else IF( hCrend->freq_buffer_re_diffuse_fx != NULL ) { free( hCrend->freq_buffer_re_diffuse_fx ); @@ -1848,6 +2055,7 @@ void ivas_rend_closeCrend( free( hCrend->freq_buffer_im_diffuse_fx ); hCrend->freq_buffer_im_diffuse_fx = NULL; } +#endif IF( hCrend->hTrack != NULL ) { free( hCrend->hTrack ); @@ -1941,6 +2149,9 @@ static ivas_error ivas_rend_crendConvolver( Word16 nchan_in, nchan_out; const Word32 *pIn; Word32 *pFreq_buf_re, *pFreq_buf_im; +#ifdef FIX_INV_DIFFUSE_WEIGHT + Word32 *pFreq_buf2_re, *pFreq_buf2_im; +#endif const Word32 *pFreq_filt_re, *pFreq_filt_im; Word32 pOut[L_FRAME48k * 2]; Word32 tmp_out_re[L_FRAME48k]; @@ -1987,8 +2198,18 @@ static ivas_error ivas_rend_crendConvolver( IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + set32_fx( &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse], 0, subframe_length ); + set32_fx( &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse], 0, subframe_length ); + if ( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 ) + { + set32_fx( &hCrend->freq_buffer_re_diffuse_fx[1][offset_diffuse], 0, subframe_length ); + set32_fx( &hCrend->freq_buffer_im_diffuse_fx[1][offset_diffuse], 0, subframe_length ); + } +#else set32_fx( &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse], 0, subframe_length ); set32_fx( &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse], 0, subframe_length ); +#endif } i = 0; @@ -2001,6 +2222,38 @@ static ivas_error ivas_rend_crendConvolver( { IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { +#ifdef FIX_INV_DIFFUSE_WEIGHT + IF( pCrend->hHrtfCrend->same_inv_diffuse_weight ) + { + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse]; + pFreq_filt_re = &hCrend->freq_buffer_re_fx[i][offset]; + pFreq_filt_im = &hCrend->freq_buffer_im_fx[i][offset]; + + FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) + { + pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; + pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; + } + } + ELSE + { + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse]; + pFreq_buf2_re = &hCrend->freq_buffer_re_diffuse_fx[1][offset_diffuse]; + pFreq_buf2_im = &hCrend->freq_buffer_im_diffuse_fx[1][offset_diffuse]; + pFreq_filt_re = &hCrend->freq_buffer_re_fx[i][offset]; + pFreq_filt_im = &hCrend->freq_buffer_im_fx[i][offset]; + + for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) + { + pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; + pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; + pFreq_buf2_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i]; + pFreq_buf2_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i]; + } + } +#else pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx pFreq_filt_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx @@ -2012,6 +2265,7 @@ static ivas_error ivas_rend_crendConvolver( move32(); move32(); } +#endif } pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset]; // Qx @@ -2072,9 +2326,21 @@ static ivas_error ivas_rend_crendConvolver( index_in = index_in % pCrend->hHrtfCrend->num_iterations_diffuse[0]; move16(); offset_diffuse = L_mult0( index_in, subframe_length ); - - pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx - pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx +#ifdef FIX_INV_DIFFUSE_WEIGHT + if ( pCrend->hHrtfCrend->same_inv_diffuse_weight ) + { + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse]; + } + else + { + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[j][offset_diffuse]; + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[j][offset_diffuse]; + } +#else + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx +#endif pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re_fx[j][offset]; // Q31 pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im_fx[j][offset]; // Q31 FOR( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max_diffuse[j][m]; k++ ) diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 456db9e26..1d18ec02a 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -61,7 +61,11 @@ extern UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +#else extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]; +#endif extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240]; @@ -75,7 +79,11 @@ extern UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +#else extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]; +#endif extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160]; @@ -89,7 +97,11 @@ extern UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +#else extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]; +#endif extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80]; @@ -110,7 +122,11 @@ extern UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHA extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; +#else extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[FOA_CHANNELS]; +#endif extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240]; @@ -124,7 +140,11 @@ extern UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHA extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; +#else extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[FOA_CHANNELS]; +#endif extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160]; @@ -138,7 +158,11 @@ extern UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHA extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; +#else extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[FOA_CHANNELS]; +#endif extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80]; @@ -158,7 +182,11 @@ extern UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; +#else extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[HOA2_CHANNELS]; +#endif extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240]; @@ -172,7 +200,11 @@ extern UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; +#else extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[HOA2_CHANNELS]; +#endif extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160]; @@ -186,7 +218,11 @@ extern UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; +#else extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[HOA2_CHANNELS]; +#endif extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80]; @@ -205,7 +241,11 @@ extern UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; +#else extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[HOA3_CHANNELS]; +#endif extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240]; @@ -219,7 +259,11 @@ extern UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; +#else extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[HOA3_CHANNELS]; +#endif extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160]; @@ -233,7 +277,11 @@ extern UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; +#else extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[HOA3_CHANNELS]; +#endif extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80]; @@ -253,7 +301,11 @@ extern UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +#else extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]; +#endif extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; extern Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; extern Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; @@ -267,7 +319,11 @@ extern UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +#else extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]; +#endif extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; extern Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819]; extern Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819]; @@ -281,7 +337,11 @@ extern UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; +#ifdef FIX_INV_DIFFUSE_WEIGHT +extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; +#else extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]; +#endif extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; extern Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774]; extern Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774]; diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index 8b51d8f2a..b4ebfe6e5 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -61,7 +61,11 @@ const UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -72,7 +76,11 @@ const UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +#endif const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -83,7 +91,11 @@ const UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +#endif const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -101,7 +113,11 @@ const UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHAN const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; +#else +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; +#endif const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -112,7 +128,11 @@ const UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHAN const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; +#else +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; +#endif const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -123,7 +143,11 @@ const UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHAN const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; +#else +const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; +#endif const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -140,7 +164,11 @@ const UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -151,7 +179,11 @@ const UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -162,7 +194,11 @@ const UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -178,7 +214,11 @@ const UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -189,7 +229,11 @@ const UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -200,8 +244,12 @@ const UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +#else const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[HOA3_CHANNELS]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#endif +const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -217,8 +265,13 @@ const UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {40, 40}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240},{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240}},{{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240},{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240}},{{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240},{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240}},{{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240},{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240}},{{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240},{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240}},{{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240},{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240}},{{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240},{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240}},{{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240},{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240}},{{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240},{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240}},{{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240},{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240}},{{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240},{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240}},{{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240},{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240}},{{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240},{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240}},{{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240},{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240}},{{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240},{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz = 98; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f},{0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907},{7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907}}; +#else const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[HRTF_LS_CHANNELS]={0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907,}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907}; +#endif const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98},{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98}}; /* Sample Rate = 32000 */ @@ -227,8 +280,13 @@ const UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {40, 40}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160},{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160}},{{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160},{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160}},{{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160},{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160}},{{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160},{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160}},{{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160},{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160}},{{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160},{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160}},{{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160},{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160}},{{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160},{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160}},{{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160},{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160}},{{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160},{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160}},{{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160},{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160}},{{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160},{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160}},{{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160},{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160}},{{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160},{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160}},{{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160},{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz = 97; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f},{0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907},{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}}; +#else const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[HRTF_LS_CHANNELS]={0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907,}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; +#endif const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97},{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97}}; /* Sample Rate = 16000 */ @@ -237,59354 +295,59359 @@ const UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {40, 40}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]={{{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80},{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80}},{{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80},{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80}},{{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80},{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80}},{{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80},{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80}},{{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80},{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80}},{{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80},{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80}},{{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80},{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80}},{{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80},{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80}},{{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80},{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80}},{{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80},{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80}},{{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80},{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80}},{{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80},{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80}},{{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80},{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80}},{{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80},{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80}},{{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80},{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz = 77; +#ifdef FIX_INV_DIFFUSE_WEIGHT +const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f},{0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907},{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}}; +#else const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[HRTF_LS_CHANNELS]={0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; +const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; +#endif const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]={{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77},{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77}}; //BRIR and HRIR coeff tables in Q29 const Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955] ={ { { -4881767, -5023501, -1853815, 6442, 4696010, -2676302, 1832340, -340376, 657130, -3187403, -6676527, --1373316, 2622615, -1711545, 1595044, 2317672, 1963874, -1463510, 1111323, -4126927, -760209, -1038845, 1705639, -134755, -98247, 518617, 1014686, -3453154, -2878165, 1218160, 2386928, --1188095, 2498597, 4788889, -6432788, 922344, -3082176, -2074469, 1426466, -788663, 3940096, --1213865, 3547643, 1880122, 572304, -242666, 1890859, 126702, -398895, -1990181, 5753109, --3987340, -1225139, 2041183, 2226404, -84826, -1961190, 1124208, -2168422, 2252710, 416612, -831613, -59593, -746787, -726386, 3005403, -7708393, 1824824, -1005559, -4444755, -772557, -3782256, 1804423, 2357400, -3384971, 2731062, -1190243, 1726040, 1020592, 1348620, -1440962, -586263, 2006824, -1318555, -3025805, 1251446, -2810519, 564788, 2028298, 24696, -1029718, --1138703, 527744, 1123671, -475131, 1345399, 38655, 971736, 788127, -339839, -214748, -387621, -459025, -235686, -361851, 395137, -628139, 330176, -908922, -191126, -855235, --89657, -287763, -908922, -230854, 466541, -8884140, 7032472, -3280281, 1623498, 1366337, -284542, -1851131, -82141, -4964446, -6192806, 1779727, -1127429, 2024003, 2050847, 5713917, --4540854, 741419, 3921305, 3787624, -3668439, -3931506, -2037425, -3405372, 405874, -1095217, --2614561, -2014340, 104690, -6270653, -5959267, -1210644, 1298691, -481036, 597000, -657130, -1471026, -3261491, 3939559, -1287417, 2284386, -409096, 1642288, -2968896, 1127966, 2175938, -2638184, 1169305, 584116, 978179, -991601, -2449742, 5217312, 3939022, 1720134, -1848447, -6446746, 4366908, -1709934, 4109747, -227096, -3093450, -681289, -1073742, -2725694, 1904818, -2211908, 1085553, -2069637, 4555350, -2869038, 2697240, 3890704, -659814, 489089, -5519570, --2377801, -5945309, 980863, 2929705, -2783139, -793495, 1224603, -2651606, -658741, 1396401, --54224, 1021665, -517007, -1378148, -3853123, -1867237, -605054, -881005, -217970, -11811, -355945, -417686, -556735, -1380295, -550830, 115427, 431107, 386547, -686121, -61203, -93952, 287226, -62814, 294742, 37044, 475668, 50466, -637266, -1071594, -1159104, -537, -655519, -850404, 239444, 7524783, 3449396, -2877091, 1291175, 993211, 11982422, --3519189, 3437048, 5852967, -1124745, 5328444, 2168422, 3632469, -4740034, -1738388, -5556077, --2550674, 3743064, -86436, -2645163, 656056, -3898220, -281320, -2554432, 3583613, -1566053, --464930, -1412507, 1917703, 825171, 68719, -464393, 1581085, -5863167, -4482872, 2003065, -565325, -580894, -2938831, 6957847, 2030983, -912681, 2333778, 2744484, 35970, 1348620, -686658, -3464428, 3155190, -4121558, -3068754, 3657165, -4343286, 3754338, 1727651, -3331821, -5717139, 3042984, 2218888, -1577864, 5186173, 1170916, -666257, -1528472, 1606855, 567473, --860604, -6112276, -840203, -1225139, 1896228, -3609920, 4855998, -1720134, 3987340, -4172561, -180926, -479963, 4956929, -2341294, -1570347, 845572, 1872606, -110595, 1009854, -802085, --4478577, -558346, -273804, -286689, -570157, -139586, 69256, -671089, -821413, -983548, --1014686, 28991, -366683, -30602, 668404, -810675, 534723, 549756, 1391033, -1662689, -1108102, 431107, 872415, -151398, 1293859, 416612, -548682, -1033477, -234076, -519691, -12522514, -10364830, -9095667, -2920041, 9592809, -1321776, -5172215, 6571837, -4350802, 3112241, --221728, -7122667, -4836133, 6032819, -3880503, 2995740, -4049617, 3991098, -1751273, -1089311, --433255, -3921305, 2099165, 2895345, -3932580, 983548, -1987496, 829466, 1831267, -563714, -2616172, 797253, 2145873, 3372086, -4283693, -3155727, 3921305, 214212, 3052111, 2964064, --2705293, -4057134, -1589675, 719407, 5391795, -5773510, 2425046, -6448894, -7840463, -1837709, --4466766, -738198, -5298379, -10136660, -5338645, 4728759, 4443681, 2873333, -3339337, 9735080, --2947958, 1654099, -5330592, -5055714, 1379758, 12885, -448824, -6386080, -2046015, -354335, --1248762, -1231045, -3401077, -2761664, 756451, -875100, -1844152, 226023, -3293166, 607201, -1949915, 3332358, 1901597, -2798171, 2998424, -1928440, -136365, 3314104, 1451699, 493384, --1034550, 1708323, 1999307, 1531693, 387621, -848793, 340376, 2356327, 1261647, 1518808, -698469, -879931, 1309965, 244276, -93416, 358630, -617938, 223338, 396748, -701153, -1343251, 1919850, 2317672, -152471, -121333, 323733, -1410360, 2105071, -89657, 1309428, --272730, 15993384, -5283884, 7463580, -2025077, 10040560, -1978906, -1598265, 1681480, 1991791, --1723893, -11630235, 1125818, -1167694, -3096672, -229781, -565325, 4066797, -1331977, 9803263, --1311039, 1054951, -712965, 5519033, -1101122, 1864016, -4614406, -239444, -3169686, -3370476, --944893, -1024887, 41876, 3507915, -6328098, -1951526, 2151779, -813359, 4383014, 919123, --1104880, -2995740, -2881923, -3178813, -5785321, 2086280, 2459406, 2066416, -10086731, -1584843, -7132330, 3897683, -1610076, -423054, -3118146, -7038378, -7342247, 7223062, -2257542, -5035313, --2743410, 3871376, 3180960, 250719, 3565360, 1358820, 3448322, -1812476, -7197829, -2571612, --3238942, -3791919, 5308580, 3390340, -584116, 5787469, 8838506, -2221035, 3747896, -3532074, --432718, -58519, 3850975, -415001, 966905, 761820, 1197222, 2938295, -3033858, 2279017, --1575716, 129386, -1931662, 217433, 1021129, 2059974, 1578937, -155156, 566936, 26307, --235686, 1012002, -2861522, -510564, -2283849, 420370, -409633, -473520, -999654, -708133, --1191317, 1169842, 602369, -23965918, 13195213, 4814659, -1092532, -1052804, 78383, -3637837, --6666863, -1437203, 3279208, 10165114, 6835978, -9239012, -1751810, -5491116, 3780108, -455803, --12481712, -3673271, 7688529, 4753992, 2641405, 6519761, 3959423, -649077, -802622, 1937567, --4737349, -2794950, 1117228, 5690295, -2367601, -4754529, -6883759, -3460670, 3473018, 11194832, -801548, -1938641, 2394981, -2283849, -8261370, 637803, -5823976, -4582193, -5433134, 3423626, --307090, -7747584, 1477469, 2966212, 3064459, -8383776, -4639102, -3107946, -2063195, -893353, --3084324, -1479616, -3994320, -8136279, -930934, -6906308, -8298951, -5131949, -1450625, 1458141, --4932233, -7286949, 2175401, 5889474, -288300, -1054415, -678068, 4290673, -6364068, 4792110, -7549479, 7344394, 5786395, 9869835, 141197, -4034585, 2669322, 464393, -1025423, -893890, -27380, -2224256, 3273839, 190589, 261993, -1978906, -533650, 1094680, 1245541, -1142998, --1047435, 645856, 3377455, -415001, 1294933, 1156420, 2889976, -2308008, 166430, -26307, --2573759, 415001, 378494, 2218888, 259309, 475668, 1905892, 1216013, -3212099, 1233193, --1138703, 1047972, -9897752, 3763465, -4885526, -824634, 1314797, 2950106, -390842, 5151814, -144955, -1009317, -13895293, 6473590, -2568391, -2931852, 5008469, -8039642, -11072963, 4550518, --3870839, -5173288, -1627793, 10037339, 6308770, -3636764, -2148558, 4684736, -1375463, -472446, -1358820, 4573604, 8353175, 5339718, 6760279, -1007707, -283468, 192737, -4440460, 1165010, --1867237, 11389716, -8679055, -5003100, -4588099, -4271345, 2739116, 1570884, 4074850, -645856, --5733245, -7652021, -2218351, -9533754, -13322452, -2641405, 363462, 10384157, 2054068, -8176007, --2106682, 7793218, -3289945, 2632815, 2335925, 4388920, -6169721, -9216463, -4094178, -4674535, -14926085, 1700807, -4790499, 3282966, 2486786, -1066763, 1876901, 3449933, -419296, 6660958, --8778913, -7822209, 2543695, -3593814, 7952132, -3643743, -212064, 4316979, -1320703, 3829500, --238371, -155693, -270583, -1254131, -147640, 3450469, 1258425, 3353833, 1852742, 1693291, -108448, -1175747, -551903, 1428077, -445603, 461172, -689879, 2421288, -1983738, 1427540, --1779190, 2442763, -2305324, 261993, -234613, -202937, 1695438, 2306934, -2412698, 1722819, -908386, -758599, 3505767, 8449274, 2602750, -804770, 5808944, -1219234, -7451769, -1469953, --748398, 7141994, -4187056, -1081795, -2310693, 1065689, -2339684, 340913, 2273648, 3315715, -4847945, 3127810, 1472100, 12599823, 4919348, 4067334, -634581, -10135586, 566936, -8462696, -2457795, -5775121, 1294396, -92342, 3136400, 15517717, 4349192, -2546379, 5530844, -4539781, -4699231, -2863670, 8061117, -4574677, -136902, -6251862, 3634079, 6082748, -7367480, 14576045, --3704946, 960462, -2357937, -4068408, 1481227, -4525285, -12696460, 2025077, -3257196, -805306, --7878044, 1743757, -2850248, -13072807, -5968931, -3723737, -11560978, 6408091, 16432545, 19926500, --19174882, -14671608, -8169565, 712965, 4664872, -5986111, 2642479, -6780143, 1671816, 9148817, -14173929, -9917616, 15882252, 5026186, 1786706, 2636036, 2801393, -3628174, 5398237, 4962835, -6024766, 4605279, 1888712, 7026030, -46708, 2147484, -209380, -101469, 3776887, -1219771, --4735202, -1343788, 2971044, 2280628, 886374, -118112, -370978, -480499, 2995740, 2372970, -1009317, -2820720, 623844, 691490, -24696, 3197066, 1355599, 1956358, -85362, 2373506, -1346472, 2400887, 3360812, 3499325, 158377, 57445, -1867237, 3867618, 3455301, -488016, --1154273, 319438, 2471217, -1005559, 7070590, -13735842, 19587198, 263067, 11410654, 4032974, --4198868, -4343286, 10564546, -6462852, 6622840, 8184597, -1215476, -6022081, 194884, 8469139, -4723927, 4275640, 3717831, -930397, 1254667, 2739116, 10806675, 7543573, -5977521, -5151814, --1023276, -2693481, -1343788, -5905580, -3960497, 5328981, 9517648, 2298881, 14424111, -4228932, -15785615, 555125, 7365332, 17362942, 12287901, 3811784, 3455301, 7752953, -1859721, -7257421, --171262, 7284265, -4427575, -8303246, 174483, -1466731, 15897821, 12700755, -289373, 17941152, --1739999, 9561671, 5015985, 7523172, -1136556, -6436546, 8003672, -1823214, 9385577, 6326487, -19979114, -11430519, -2059974, -22890028, 4702453, -11352672, -1642825, 10256382, -4406637, 4100083, --1988570, 12021613, -3335579, -8707509, -759672, -3091840, 3541738, -744640, 5807870, 6749541, -1728724, -2026688, 5395016, -1414118, 2274185, -172336, -3755412, 2305861, 2460480, 4629975, -2411624, 5211406, 2325725, -304943, 113817, -1880122, -31675, 5101885, -1991791, -4208531, -2209761, -494995, 696322, 4137127, 902480, 855235, 1730335, 2678449, -999117, -742493, -1844152, 3308736, 5588290, 4990215, -82678, 2252174, -22012, -459562, 2404108, 3443490, -3100430, -1967632, -10737, -788663, 4136054, 588947, -842350, 501437, -13181255, -9683004, -4715874, -7831873, 4438312, -4739497, 1265405, 12062416, -2091649, -11455752, 3055869, -4836670, -11615202, -12242804, -8551817, 4920422, 5578089, 8457327, 265214, -895501, 5452998, -3395172, --8381092, 5126044, -3469797, -6716255, 1954747, 6456947, -4820027, 12191265, 4923107, -513785, -1569274, 5931887, 2585570, -21006686, 8514236, -2223719, -2252174, -3694746, 11094437, -19864, -11817066, 405874, 1000727, 1213328, -3170223, -1369021, 5724118, -6802692, 1556926, 18927384, -1642825, 13889924, 1054951, -2951180, -1562294, -9529996, -19597398, -14362908, 6448357, 8872866, --3898220, 14866492, 6381785, -10808822, -6249715, 13601625, 9730248, 8978629, 2773475, -4325569, -109522, -862752, -8442295, -2713883, -4940286, -23137526, -9913321, -648003, 15453829, 3328063, --3585224, 1542430, 13269301, -3413962, 669478, -42413, 3361349, -4483409, -2090575, -3383361, --1870995, -1279363, 3194382, -285078, -567473, -333397, 2506114, 1866163, 3907883, -2895345, --4306242, 1417339, -4555350, -2663954, 590558, 1515050, 549219, -947040, 4795331, -2374580, --1399623, -5673652, 2126009, -5146445, 3970161, 1582696, 2647311, -4386772, 412317, -892816, -2096481, -2604898, 1645509, -2350958, 2673080, -4864588, 213675, -5676873, 6107981, 5746666, -12443594, 4695473, 4124242, 14296872, 11941620, 9955197, 323196, 3659849, 702227, -2406256, --2878165, 2282775, -1220308, -8682813, 1806034, 8372502, -178778, -2508261, 2531346, -21111912, -6920266, -8454643, 5138929, 7052873, 6349036, -7975755, 4175782, -889595, -255551, 12381317, -9028021, 47245, 4799089, 3536369, -1768453, -7190312, 1656247, 6004901, 42950, 8798241, -2583960, 7951595, 15751256, 750546, 6315213, 6700686, 8414378, -432718, -5504001, 13597330, --5360119, 10963441, -13069585, -10766946, 14918569, -826781, 4887136, 8761196, 13011067, 16838956, -7067369, 2255932, -8319352, 3651259, -1752884, -15189689, 12771622, 7925289, -12435004, -799938, -712965, -15566572, 5154498, 12262132, 7227893, -166967, 4683125, 3310883, -7274601, 13427678, -1242319, -2704756, 6899865, 13281649, 5188858, -595390, -4712116, -3715147, -1650878, 2223719, -3714073, 5456219, 1750199, 898185, 1675037, 6386080, 5708012, 7106024, -139050, -811749, -2797098, 6077379, -23622, 516470, -1273995, 2779918, 460098, -758599, -2357400, 1411434, --4461934, -7936563, -402116, 4377646, -155693, 3080565, -3800509, 2354179, 130460, 2680597, -387621, -2181307, 1752347, -1490891, -1202591, -556735, -4808216, 3328600, -1792612, 1344862, -2612414, 79457, -716723, -2270427, -3124589, -704912, -34845608, -21667036, 7091528, 7424388, -14332843, 23693188, -6510634, -3702799, -7533910, -6987375, -8889509, -9532680, 787053, 3822521, -3011309, 14945412, 666257, 14664629, -726923, 5043366, 6803765, 5209796, 10932302, 7775502, -568546, 9606768, -103079, -1146756, -5519033, 6495601, -855235, -14330695, -12362526, 7762617, --1771674, 17066052, 10221485, 10969346, 4089346, -21500070, 5204427, 13495324, -2045478, 3914326, --3264175, 2663954, 16999480, -608812, 14252849, 23688356, 1364189, -8968429, -221728, 228170, --14848776, 20103668, 9622874, -2694555, -1114007, 14558865, 6907381, -17695266, -14356465, 5647882, --6228240, 8425115, 6132140, 2652679, -6963216, -12579422, -572304, 3156801, 2392834, 13559749, --18213882, 2643016, -1218697, -15487115, -7346542, -15575699, 13605920, -4642860, 18800146, -14789183, -1401233, -7130720, 10697153, 4616553, -4587025, -918049, 9862319, 589484, 3102040, -5718749, --2995740, -4840965, 8749922, 4302484, 2684, 2291902, 2649995, -8013872, 578210, -2276870, -2840584, 1640141, -1687922, -8189966, -2805688, -6057515, 7244536, -5388037, 1216013, -1470489, -7176891, -1538672, -1200443, -2568927, -4395899, -294742, -2899103, 2805688, 7919920, 6825240, --429497, -7215008, 9176734, 24713242, -29417304, -8230768, -14341433, -604517, 4662187, 778463, -19720880, -20353850, 9621800, -2778844, 3928821, -2464238, 10828149, -5971615, -10080825, -841814, --2939905, 7656853, -640487, 5177583, 11470784, -2385854, -8603356, -1148367, 12899934, -7589207, -3071975, 2906082, 507343, -1168231, 12810814, -480499, -3311420, -21400748, 6880538, -5291937, --13525389, -11757473, -3131031, -13033615, -7690139, -11317239, 5364951, -13356811, 13326210, -12258374, -8259222, -6330782, 16157130, -15652471, -9105331, -2351495, 9357660, 3863860, 70867, -6437082, --12839805, 1312113, 5005785, 18327700, 9596031, 4007205, -10487236, 6242735, -9304510, -10472741, -9136469, -10166188, 4838281, 11882564, 9894531, -2630131, -3796214, -8553964, 14274324, 1409286, -13660680, 22113176, -4337380, -11584064, -5192079, -3847754, -7975218, 3512210, -13229036, 5770826, -4297652, 3985730, 10437844, -7372848, 373662, -1329829, 2636036, 9521942, 263067, 7492034, --2726231, -162135, 924492, -4220879, -1530619, 4508642, 2358474, -6039261, -7927436, -3741990, -3476776, 3152506, -3491272, 11323681, 3295851, -8242042, 4148939, 6063420, 15052250, 12264816, -6850473, 2561948, 1439888, -6299644, -4968741, -181462, -5033165, 980326, -2924336, -9207873, -5085242, -3025805, -1298691, 1126355, 5015985, 155156, -4264366, 15992311, 22290880, -24363202, -17250200, 11905649, 225486, 8462159, 29749090, -8858907, -9046275, 2470680, 8495982, 12119324, -3753265, -12147241, 12938589, -5280126, 26246008, -1091459, -4759361, 8220568, 6629282, 6531572, --649614, 24592446, -21117818, 4674535, -739271, 6469295, -9018894, -17667348, 8236137, 6389301, -6652368, -6437082, -4958540, 20493974, 7475391, 25854630, 2042794, -10096394, -1398549, 5444408, --2637110, 26854284, -3782256, 14445049, -2994666, 24055574, 8560944, 6206765, -6281390, -1760937, -13107703, -133681, 14061186, 10491531, 12386686, -17293686, 2369748, 11696807, 14185203, 10464151, -7977365, 19168976, 23655606, -18687402, -2532420, 36088464, -9105331, -10260140, 23270132, 31442918, -269509, -700617, -17551920, -14551886, -1257889, 15602006, -2662880, -3392487, 403190, -1602023, --4756677, -12646531, -4799089, -1305670, -7577933, 122407, 7116224, -4521527, 9190693, -9979357, -8067023, -2318746, 6988449, -7569343, -63888, 5041218, 2865817, 8884140, -1939715, -5234492, --2455648, 2399276, 8151311, 2152316, -3316789, 11324218, -3929895, 5810017, 5881958, -1404454, --1593433, -2976949, 16751983, -6556805, 1904281, 4017942, 6054830, -3411815, -11330124, -6733435, --2203318, 12558484, 5961952, -1282585, 496606, 4270808, -1099512, -150324, 4286378, 2115808, -895501, -182536, 9993852, 22502944, -1388885, 7006166, -19249506, 18299246, -9762998, -6044093, --16851842, -10961293, 34517040, 436476, -24321326, -10890963, -733903, 43487, -3219078, 26641682, -12459700, -2341294, -11159399, -1126355, 7011534, -3376918, 35554276, 7485591, 15627775, 5312875, --8019778, -20221242, 4727149, -317291, 3147137, -15693810, -1660542, -10632192, 11985643, -26307, -1960653, 12346957, -11277510, -8366597, 2451353, 439160, 3693135, -17342542, -13544179, -29637422, --15449534, 1152662, -16865800, 2141041, -12239046, -7452842, 21919902, 6765647, -10665478, 6434398, -2484639, -227096, 21089364, -3755412, 25549150, 9629854, -10997801, -31336618, 5437429, 4816806, -17273284, -9494025, -22404160, -8148090, 6497212, 947040, -5343476, -16299401, -5178120, -22963580, --25957708, 7928510, -1442572, 26411902, -8506183, -16402480, -14086419, -1498407, 18811420, -1219234, -6933688, 11858405, 9249212, -4343286, 6139656, 8031052, 2765959, 8230768, 8312373, -6105833, --838056, 11609297, -2332704, 1414118, 11285027, -2382096, 6705518, -8568460, 3274376, 6221797, --3777424, 3609920, 3734474, -8037495, 10356240, -10023380, 5022428, 4911832, 8231305, -2311766, --5609228, 10730976, -1424319, 7855495, -11720429, -6015102, -8595840, -7573101, 1130113, -6296422, -4512937, 301721, 1911797, -12093554, 1336809, -3665755, 16426639, -17712446, -850404, 27506044, --5641977, 8308078, 3061775, 3850975, -25334402, 21470004, -1897839, -20213726, -11771968, 10980084, --2851858, 5623186, 74088, -8228621, -6125697, 3940633, -6137509, -1217086, -166430, -29392608, --7566122, -19620484, 4584878, 7332046, 5369, -8488466, 3702262, -3921842, 11813844, -25974888, -1939715, 4844186, 15195594, -11157788, 14169097, -10985989, 9080098, 2652142, 11062225, -16863116, -5421860, -8217346, -18041010, 12112345, -14566382, -29349660, 4525822, -2505040, 23529978, -10998874, -3441880, 11008538, 15670188, 17819282, 2064269, -5735929, -10871099, 628139, 8533026, 11831561, --22908282, 26146150, -23622, -17184702, -12878996, -22957138, 9641128, 5923834, 9431211, 4373351, -24824910, -8470749, 26965416, -14253923, 6453189, -5623723, -12263205, -37042484, 21249888, 4319664, --9714679, -25053618, -1288490, 4987531, -1984275, 9562208, -6648073, -7858180, -1130650, 4239133, --6926709, -6733435, -4304631, -1022739, 4115653, -1917166, -2069637, -9759239, 7649874, 524523, --5308580, 4889284, -3798362, 8043937, -2206540, 4169340, 5338645, 9872519, -3110093, 8992588, -1165010, 777926, -9195525, -7085623, 2498060, 3830037, 1501091, 795106, -1619740, -5853504, --3209951, -2619930, -6508486, -2784750, 11937862, -5570036, -6467147, 3953518, -14443438, 248571, --3636764, -21937082, -54224, 12146704, -4784057, -23766202, -3757560, -34746284, 16877610, -38405060, -22974316, -26546656, -23154168, 6629282, 19937238, 14886357, -13176960, 13965623, 25074020, 4466766, -3772592, 5906654, 2289755, -14744086, 17995376, -30137248, -18699214, 1703491, -1835025, -1926293, --3975529, -7504919, 4057670, 27752468, 7209103, 3861713, 2633889, -13051869, 16146930, -2911451, --27881318, -4298189, 636192, 599685, -19061064, -13495324, 14733348, -4791573, 25256556, 4673998, -59056, -20526186, -11207180, 7558069, 3300682, -5601711, 21651468, -17107928, -10341744, -754841, --1215476, 20381768, 1709397, 23843510, 59593, -19504520, 4909685, -16631187, 12720619, -2346126, -17315160, 32628866, -50177568, 17100950, 7019587, 9185324, 19086834, 4699768, -22972170, -5364414, --2018098, -4186519, 11851962, -23617488, 2317135, -6200859, -3277597, -16281684, -8654359, -24621436, -2831457, -1574106, 2627983, 6750615, -9887015, -1833414, 12050604, -7386270, 2449742, -4127464, --12015171, 5601711, 7437810, -8533026, -779537, -13464186, -669478, -19464792, 7105487, 4728759, --2297808, 2036351, -4773856, 768799, 4083440, -3164317, -3491272, 11042361, 13700946, -3104725, -4640176, 2128156, 14065481, 6127845, -17375828, 2259690, 10209674, -5786395, 10318122, 3205119, -4518843, 41084048, 35499516, -10193568, -13768591, -841814, -27055610, 15756088, -1569811, 5927055, -2076617, -13692356, 40987408, -17650704, -72368592, -10616622, 14412300, -48730700, -8370892, 15212774, --41280004, 5695664, 26835492, -18993420, 26771604, -25759604, 22997402, 28532542, -18268106, 7749195, --2656437, 590558, -7753490, -11330124, -2108292, 17550846, -11355894, -18891414, -10327786, -15218143, --1632625, -11951820, -1973001, 6269579, -2861522, 17142826, -15176804, -18643380, 14810121, -19718732, --29236916, -37484864, -13074417, -918586, 7262253, 20845624, -8741332, 9329206, 9757092, -6897718, --3251290, 34367792, -22762790, -903554, 23519240, 7274064, 18489298, -4650913, 6727530, 26090852, -13406740, -1443109, -3205119, -16120086, 6581501, 26246546, -24445344, 18559628, -24190866, 7035157, -34160560, 7860327, -19215684, 19417010, 3071439, -12283606, -9592273, 23502062, 7727720, 10129680, --1430224, 1766842, 6439230, 7702487, -712428, -2367064, 9993315, 8716636, 1830193, -11632382, -12787728, 1574642, -4420595, 3140695, 4380330, -8469676, -2249489, 6522982, 1257352, 10869488, --13428215, 20194400, 15649250, -2782602, -12805445, -5203353, 13465259, 15394237, 24836186, -767725, -4783520, 4064113, 13618268, -20718386, -11050414, 20785494, 13006772, 1409286, -3354370, 1786170, -5748277, -10844792, -8507256, -7295002, 1525787, 6628745, -3343632, -27380, 10799158, -11534135, --8179229, 36349920, 24700356, -34613680, -6816650, 31329102, -9260486, -19042812, -13391708, -19107772, --11199127, 31629750, 19363860, -2312840, 14464376, -3211025, 17585744, -10714870, -5871757, 35121020, --14326937, 6528887, -9903121, -3550327, -201863, 9768903, 28589450, 11166915, -19053012, -5418101, --695785, -2687039, 16173773, 2366527, 28783260, -8196945, 5129802, -2717104, 8535174, -23735064, -14592688, -21874268, 15159624, -933082, 22162568, -5491653, 16481400, -7271917, 5317170, 9594957, --9301825, 9934796, 22370338, 27956480, -14493367, 28642600, 12118250, 33935612, -9491878, 6606197, --1080184, -3891240, -6283001, -2068564, -10980621, -54957328, -34594888, -10435697, -532039, 8100845, -4054449, 13027710, 20958366, -30115774, -1553168, -11999065, 46148888, -2940442, -13856101, -3716757, --40219148, -33475512, 50985020, 20970178, 11503533, -7545184, 16062641, 1620813, -36829344, 7861401, -2631204, -13747653, -14302241, 2641942, 322659, 4257923, -7624104, -3605088, -17999672, -14984604, -6593312, 8398272, 7109245, 5747740, -9323300, -13482976, -8345659, -17542258, 11409044, 4227322, --31754304, -3398393, -9160628, -1821603, 15634755, -14275398, -20536386, -4137127, 13359496, 4901632, --14252312, 8938364, 18442590, -33812132, -9177808, 12625056, -595390, -2163053, -6516539, -931471, -5977521, 10698764, 2418067, -4275103, 27278948, -39689256, 37171332, -10973105, -11228118, 9502078, -17248588, -31097710, -6311455, 454193, 6089190, 1580548, -993211, 15466714, -9546102, 1909650, -8062728, 8968965, 12857521, 10650445, 3469260, -17098802, -3549254, 23060754, -22604412, -19304804, -23856396, 8108899, 16815870, 26139170, 40519260, -9298067, -25991532, 34313568, -14027900, -5881958, -35704600, 11188927, -13299903, -37476812, -24838332, -3828427, -13962402, 17525614, 35176856, 18037788, --12278238, 36221068, 12052215, -13211319, 9852655, 40432824, 11560441, 7787850, -8703751, -32499480, --43714176, -34672196, -2661806, 26193932, 7860327, 16533477, 61915176, 30545808, -37327024, -25074556, -16303159, -51483772, -23804320, 44320840, 15677704, -57192860, -47871168, -22159346, -36694052, -34350076, --20716238, 31077310, -9036611, -6544994, 80981608, 13622563, -23549306, -6495065, -25432648, 43111272, --9287867, 9351754, 2782065, 601832, -23826332, -9149891, -2062658, -11980811, 2632278, 9236327, -20900922, 2734284, -14578730, -635118, -300648, -9483825, 4134443, 6113349, 6918656, -18730352, -4567161, -17351668, 2771328, 9086540, -1272384, 13824426, -3610994, -917512, 13743895, -2883534, -7563975, 15525770, -5552856, 4619238, 10448045, 11671574, 9317932, 1918240, 2115272, 8120173, --8874476, -3309272, 5291400, 15343771, -55486144, 38359428, 16440061, 12377559, 15388868, -6000070, -18894098, 15501611, 22158810, -4271345, 30406220, -19197430, 23053236, -8479339, -17744120, -5680631, --29075318, 2945811, -10708427, 10187126, -7416335, -11315091, 27793270, -32068374, 20589000, -1177895, --13989245, -5671505, 12284680, 13861470, 10024454, 26264798, 21194590, -15359340, -3238942, -13753559, -11791296, -12203613, 9185861, 12594992, 5760625, 7019587, 4670777, -7623030, 29046864, -2838974, -8601209, 2789045, 13361106, 7318088, -34839700, 2131378, -20859582, 5181341, 15316390, -2978560, --14781130, -13639742, 32383516, -34404300, -27758910, 50745576, -21661130, 13057237, 5019743, 16200080, --7718593, 8406862, -35454956, 2276870, 34359740, -18573586, -13943611, 29498910, -2059974, -24744380, --18238578, 10773925, -9674414, -5876589, 18362596, -13719736, 4549444, 22752590, -25847114, 1535451, -15086609, -8544301, -5163088, -6911676, 9277666, 2400350, 3731253, -3561065, 5262409, 3803194, --5094368, 221191, 898185, 13499082, 6876780, -12994424, 15669651, 3747896, -7993471, 4401805, -4782446, -1597728, -4679904, 11063836, 13422, 3610994, 1406602, 14358613, -6750615, -5652714, -8830453, -13238700, 16436840, -1417876, -9279277, -1714766, -984621, 1791538, -177167, -6503118, --934692, 8376797, 17611514, -32603096, -132843336, -143325200, -5032091, -82140712, 73058464, 263656768, -115024592, 159074848, 200876688, -75631152, -53428320, -21169894, -180067040, -125899448, -40688372, -197477760, --85950888, -17417702, -80603648, 19429896, 185732096, 168731008, 182606976, 236609216, 142669152, -12641162, -53350472, -52825952, -210161872, -114121040, -84362824, -174628000, -119640608, 6853157, -134372880, -44130252, -29917132, -134300400, -68745248, 100774968, 39242044, 109274704, 271997056, 221112976, 178884848, 321623264, -233545824, -3811784, 33775084, -59936804, -287829376, -275176416, -283816800, -442253856, -299460160, -185071744, --181103744, 2303176, 143847584, 161939600, 226965936, 343455104, 317917248, 268363520, 265022032, 151783600, -53501872, 8539469, -16121697, -120237608, -206951392, -254203552, -272117312, -367538080, -305455936, -235603648, --115174376, 123300456, 363875520, 338856800, 371360576, 260402256, 31915366, -35298724, -111276160, -153110208, --103421200, -50761144, -51122460, -22655416, -23368918, -37251324, 412854, 5426691, 27194122, 84680648, -76976552, 56690884, 77987480, -7340636, -50173272, -6750078, -58942520, -51096688, 31779000, 34293704, -8041253, 7859790, -89912992, -230230656, -217934160, -185678416, -139811392, 68093488, 210111952, 256853536, -324523968, 290842848, 179467888, 124528280, 44261248, -51707648, -108306728, -129288176, -167586944, -205741824, --231963664, -270989888, -240906864, -83403432, 59290412, 139456512, 180895968, 196524288, 147496160, 102245456, -51210504, -2077690, -6065568, 24787866, 39709120, 43389372, 47182364, 38930120, 2864206, -33474976, --71459128, -127287800, -122781840, -100001336, -83619256, -46903192, -7081328, 23574002, 33800856, 35664872, -22436372, 13960791, 20300162, 32255742, 45293652, 61579092, 73202888, 70543768, 51367808, 25616258, --5674726, -28797218, -38020660, -50489488, -63231044, -62474596, -48408576, -36935644, -26674432, -20204600, --12170864, 2449742, 21632140, 32340566, 29753386, 27722940, 23781234, 13908715, 11783243, 9941239, -4184372, 8645232, 17462800, 16416976, 14577119, 15021111, 3346317, -10750303, -20018306, -33758980, --40598716, -34304440, -26386132, -19046570, -2747169, 7810398, 11220065, 14671608, 11000485, 4314295, -4697621, 10699837, 13073880, 20334522, 22259204, 18894098, 15375983, 6019397, -6820408, -17784386, --23818814, -25642566, -22677964, -15161771, -5388574, 3470871, 7589207, 8280160, 6216429, 4721243, -4328790, 4366908, 3847754, 2950106, 1348083, -134755, -1145683, -1647120, -1563905, -1193464, --614717, -255551, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +5023501, -1853815, 6442, 4696010, -2676302, 1832340, -340376, 657130, -3187403, -6676527, +-1373316, 2622615, -1711545, 1595044, 2317672, 1963874, -1463510, 1111323, -4126927, -760209, +1038845, 1705639, -134755, -98247, 518617, 1014686, -3453154, -2878165, 1218160, 2386928, +-1188095, 2498597, 4788889, -6432788, 922344, -3082176, -2074469, 1426466, -788663, 3940096, +-1213865, 3547643, 1880122, 572304, -242666, 1890859, 126702, -398895, -1990181, 5753109, +-3987340, -1225139, 2041183, 2226404, -84826, -1961190, 1124208, -2168422, 2252710, 416612, +831613, -59593, -746787, -726386, 3005403, -7708393, 1824824, -1005559, -4444755, -772557, +3782256, 1804423, 2357400, -3384971, 2731062, -1190243, 1726040, 1020592, 1348620, -1440962, +586263, 2006824, -1318555, -3025805, 1251446, -2810519, 564788, 2028298, 24696, -1029718, +-1138703, 527744, 1123671, -475131, 1345399, 38655, 971736, 788127, -339839, -214748, +387621, -459025, -235686, -361851, 395137, -628139, 330176, -908922, -191126, -855235, +-89657, -287763, -908922, -230854, 466541, -8884140, 7032472, -3280281, 1623498, 1366337, +284542, -1851131, -82141, -4964446, -6192806, 1779727, -1127429, 2024003, 2050847, 5713917, +-4540854, 741419, 3921305, 3787624, -3668439, -3931506, -2037425, -3405372, 405874, -1095217, +-2614561, -2014340, 104690, -6270653, -5959267, -1210644, 1298691, -481036, 597000, -657130, +1471026, -3261491, 3939559, -1287417, 2284386, -409096, 1642288, -2968896, 1127966, 2175938, +2638184, 1169305, 584116, 978179, -991601, -2449742, 5217312, 3939022, 1720134, -1848447, +6446746, 4366908, -1709934, 4109747, -227096, -3093450, -681289, -1073742, -2725694, 1904818, +2211908, 1085553, -2069637, 4555350, -2869038, 2697240, 3890704, -659814, 489089, -5519570, +-2377801, -5945309, 980863, 2929705, -2783139, -793495, 1224603, -2651606, -658741, 1396401, +-54224, 1021665, -517007, -1378148, -3853123, -1867237, -605054, -881005, -217970, -11811, +355945, -417686, -556735, -1380295, -550830, 115427, 431107, 386547, -686121, -61203, +93952, 287226, -62814, 294742, 37044, 475668, 50466, -637266, -1071594, -1159104, +537, -655519, -850404, 239444, 7524783, 3449396, -2877091, 1291175, 993211, 11982422, +-3519189, 3437048, 5852967, -1124745, 5328444, 2168422, 3632469, -4740034, -1738388, -5556077, +-2550674, 3743064, -86436, -2645163, 656056, -3898220, -281320, -2554432, 3583613, -1566053, +-464930, -1412507, 1917703, 825171, 68719, -464393, 1581085, -5863167, -4482872, 2003065, +565325, -580894, -2938831, 6957847, 2030983, -912681, 2333778, 2744484, 35970, 1348620, +686658, -3464428, 3155190, -4121558, -3068754, 3657165, -4343286, 3754338, 1727651, -3331821, +5717139, 3042984, 2218888, -1577864, 5186173, 1170916, -666257, -1528472, 1606855, 567473, +-860604, -6112276, -840203, -1225139, 1896228, -3609920, 4855998, -1720134, 3987340, -4172561, +180926, -479963, 4956929, -2341294, -1570347, 845572, 1872606, -110595, 1009854, -802085, +-4478577, -558346, -273804, -286689, -570157, -139586, 69256, -671089, -821413, -983548, +-1014686, 28991, -366683, -30602, 668404, -810675, 534723, 549756, 1391033, -1662689, +1108102, 431107, 872415, -151398, 1293859, 416612, -548682, -1033477, -234076, -519691, +12522514, -10364830, -9095667, -2920041, 9592809, -1321776, -5172215, 6571837, -4350802, 3112241, +-221728, -7122667, -4836133, 6032819, -3880503, 2995740, -4049617, 3991098, -1751273, -1089311, +-433255, -3921305, 2099165, 2895345, -3932580, 983548, -1987496, 829466, 1831267, -563714, +2616172, 797253, 2145873, 3372086, -4283693, -3155727, 3921305, 214212, 3052111, 2964064, +-2705293, -4057134, -1589675, 719407, 5391795, -5773510, 2425046, -6448894, -7840463, -1837709, +-4466766, -738198, -5298379, -10136660, -5338645, 4728759, 4443681, 2873333, -3339337, 9735080, +-2947958, 1654099, -5330592, -5055714, 1379758, 12885, -448824, -6386080, -2046015, -354335, +-1248762, -1231045, -3401077, -2761664, 756451, -875100, -1844152, 226023, -3293166, 607201, +1949915, 3332358, 1901597, -2798171, 2998424, -1928440, -136365, 3314104, 1451699, 493384, +-1034550, 1708323, 1999307, 1531693, 387621, -848793, 340376, 2356327, 1261647, 1518808, +698469, -879931, 1309965, 244276, -93416, 358630, -617938, 223338, 396748, -701153, +1343251, 1919850, 2317672, -152471, -121333, 323733, -1410360, 2105071, -89657, 1309428, +-272730, 15993384, -5283884, 7463580, -2025077, 10040560, -1978906, -1598265, 1681480, 1991791, +-1723893, -11630235, 1125818, -1167694, -3096672, -229781, -565325, 4066797, -1331977, 9803263, +-1311039, 1054951, -712965, 5519033, -1101122, 1864016, -4614406, -239444, -3169686, -3370476, +-944893, -1024887, 41876, 3507915, -6328098, -1951526, 2151779, -813359, 4383014, 919123, +-1104880, -2995740, -2881923, -3178813, -5785321, 2086280, 2459406, 2066416, -10086731, -1584843, +7132330, 3897683, -1610076, -423054, -3118146, -7038378, -7342247, 7223062, -2257542, -5035313, +-2743410, 3871376, 3180960, 250719, 3565360, 1358820, 3448322, -1812476, -7197829, -2571612, +-3238942, -3791919, 5308580, 3390340, -584116, 5787469, 8838506, -2221035, 3747896, -3532074, +-432718, -58519, 3850975, -415001, 966905, 761820, 1197222, 2938295, -3033858, 2279017, +-1575716, 129386, -1931662, 217433, 1021129, 2059974, 1578937, -155156, 566936, 26307, +-235686, 1012002, -2861522, -510564, -2283849, 420370, -409633, -473520, -999654, -708133, +-1191317, 1169842, 602369, -23965918, 13195213, 4814659, -1092532, -1052804, 78383, -3637837, +-6666863, -1437203, 3279208, 10165114, 6835978, -9239012, -1751810, -5491116, 3780108, -455803, +-12481712, -3673271, 7688529, 4753992, 2641405, 6519761, 3959423, -649077, -802622, 1937567, +-4737349, -2794950, 1117228, 5690295, -2367601, -4754529, -6883759, -3460670, 3473018, 11194832, +801548, -1938641, 2394981, -2283849, -8261370, 637803, -5823976, -4582193, -5433134, 3423626, +-307090, -7747584, 1477469, 2966212, 3064459, -8383776, -4639102, -3107946, -2063195, -893353, +-3084324, -1479616, -3994320, -8136279, -930934, -6906308, -8298951, -5131949, -1450625, 1458141, +-4932233, -7286949, 2175401, 5889474, -288300, -1054415, -678068, 4290673, -6364068, 4792110, +7549479, 7344394, 5786395, 9869835, 141197, -4034585, 2669322, 464393, -1025423, -893890, +27380, -2224256, 3273839, 190589, 261993, -1978906, -533650, 1094680, 1245541, -1142998, +-1047435, 645856, 3377455, -415001, 1294933, 1156420, 2889976, -2308008, 166430, -26307, +-2573759, 415001, 378494, 2218888, 259309, 475668, 1905892, 1216013, -3212099, 1233193, +-1138703, 1047972, -9897752, 3763465, -4885526, -824634, 1314797, 2950106, -390842, 5151814, +144955, -1009317, -13895293, 6473590, -2568391, -2931852, 5008469, -8039642, -11072963, 4550518, +-3870839, -5173288, -1627793, 10037339, 6308770, -3636764, -2148558, 4684736, -1375463, -472446, +1358820, 4573604, 8353175, 5339718, 6760279, -1007707, -283468, 192737, -4440460, 1165010, +-1867237, 11389716, -8679055, -5003100, -4588099, -4271345, 2739116, 1570884, 4074850, -645856, +-5733245, -7652021, -2218351, -9533754, -13322452, -2641405, 363462, 10384157, 2054068, -8176007, +-2106682, 7793218, -3289945, 2632815, 2335925, 4388920, -6169721, -9216463, -4094178, -4674535, +14926085, 1700807, -4790499, 3282966, 2486786, -1066763, 1876901, 3449933, -419296, 6660958, +-8778913, -7822209, 2543695, -3593814, 7952132, -3643743, -212064, 4316979, -1320703, 3829500, +-238371, -155693, -270583, -1254131, -147640, 3450469, 1258425, 3353833, 1852742, 1693291, +108448, -1175747, -551903, 1428077, -445603, 461172, -689879, 2421288, -1983738, 1427540, +-1779190, 2442763, -2305324, 261993, -234613, -202937, 1695438, 2306934, -2412698, 1722819, +908386, -758599, 3505767, 8449274, 2602750, -804770, 5808944, -1219234, -7451769, -1469953, +-748398, 7141994, -4187056, -1081795, -2310693, 1065689, -2339684, 340913, 2273648, 3315715, +4847945, 3127810, 1472100, 12599823, 4919348, 4067334, -634581, -10135586, 566936, -8462696, +2457795, -5775121, 1294396, -92342, 3136400, 15517717, 4349192, -2546379, 5530844, -4539781, +4699231, -2863670, 8061117, -4574677, -136902, -6251862, 3634079, 6082748, -7367480, 14576045, +-3704946, 960462, -2357937, -4068408, 1481227, -4525285, -12696460, 2025077, -3257196, -805306, +-7878044, 1743757, -2850248, -13072807, -5968931, -3723737, -11560978, 6408091, 16432545, 19926500, +-19174882, -14671608, -8169565, 712965, 4664872, -5986111, 2642479, -6780143, 1671816, 9148817, +14173929, -9917616, 15882252, 5026186, 1786706, 2636036, 2801393, -3628174, 5398237, 4962835, +6024766, 4605279, 1888712, 7026030, -46708, 2147484, -209380, -101469, 3776887, -1219771, +-4735202, -1343788, 2971044, 2280628, 886374, -118112, -370978, -480499, 2995740, 2372970, +1009317, -2820720, 623844, 691490, -24696, 3197066, 1355599, 1956358, -85362, 2373506, +1346472, 2400887, 3360812, 3499325, 158377, 57445, -1867237, 3867618, 3455301, -488016, +-1154273, 319438, 2471217, -1005559, 7070590, -13735842, 19587198, 263067, 11410654, 4032974, +-4198868, -4343286, 10564546, -6462852, 6622840, 8184597, -1215476, -6022081, 194884, 8469139, +4723927, 4275640, 3717831, -930397, 1254667, 2739116, 10806675, 7543573, -5977521, -5151814, +-1023276, -2693481, -1343788, -5905580, -3960497, 5328981, 9517648, 2298881, 14424111, -4228932, +15785615, 555125, 7365332, 17362942, 12287901, 3811784, 3455301, 7752953, -1859721, -7257421, +-171262, 7284265, -4427575, -8303246, 174483, -1466731, 15897821, 12700755, -289373, 17941152, +-1739999, 9561671, 5015985, 7523172, -1136556, -6436546, 8003672, -1823214, 9385577, 6326487, +19979114, -11430519, -2059974, -22890028, 4702453, -11352672, -1642825, 10256382, -4406637, 4100083, +-1988570, 12021613, -3335579, -8707509, -759672, -3091840, 3541738, -744640, 5807870, 6749541, +1728724, -2026688, 5395016, -1414118, 2274185, -172336, -3755412, 2305861, 2460480, 4629975, +2411624, 5211406, 2325725, -304943, 113817, -1880122, -31675, 5101885, -1991791, -4208531, +2209761, -494995, 696322, 4137127, 902480, 855235, 1730335, 2678449, -999117, -742493, +1844152, 3308736, 5588290, 4990215, -82678, 2252174, -22012, -459562, 2404108, 3443490, +3100430, -1967632, -10737, -788663, 4136054, 588947, -842350, 501437, -13181255, -9683004, +4715874, -7831873, 4438312, -4739497, 1265405, 12062416, -2091649, -11455752, 3055869, -4836670, +11615202, -12242804, -8551817, 4920422, 5578089, 8457327, 265214, -895501, 5452998, -3395172, +-8381092, 5126044, -3469797, -6716255, 1954747, 6456947, -4820027, 12191265, 4923107, -513785, +1569274, 5931887, 2585570, -21006686, 8514236, -2223719, -2252174, -3694746, 11094437, -19864, +11817066, 405874, 1000727, 1213328, -3170223, -1369021, 5724118, -6802692, 1556926, 18927384, +1642825, 13889924, 1054951, -2951180, -1562294, -9529996, -19597398, -14362908, 6448357, 8872866, +-3898220, 14866492, 6381785, -10808822, -6249715, 13601625, 9730248, 8978629, 2773475, -4325569, +109522, -862752, -8442295, -2713883, -4940286, -23137526, -9913321, -648003, 15453829, 3328063, +-3585224, 1542430, 13269301, -3413962, 669478, -42413, 3361349, -4483409, -2090575, -3383361, +-1870995, -1279363, 3194382, -285078, -567473, -333397, 2506114, 1866163, 3907883, -2895345, +-4306242, 1417339, -4555350, -2663954, 590558, 1515050, 549219, -947040, 4795331, -2374580, +-1399623, -5673652, 2126009, -5146445, 3970161, 1582696, 2647311, -4386772, 412317, -892816, +2096481, -2604898, 1645509, -2350958, 2673080, -4864588, 213675, -5676873, 6107981, 5746666, +12443594, 4695473, 4124242, 14296872, 11941620, 9955197, 323196, 3659849, 702227, -2406256, +-2878165, 2282775, -1220308, -8682813, 1806034, 8372502, -178778, -2508261, 2531346, -21111912, +6920266, -8454643, 5138929, 7052873, 6349036, -7975755, 4175782, -889595, -255551, 12381317, +9028021, 47245, 4799089, 3536369, -1768453, -7190312, 1656247, 6004901, 42950, 8798241, +2583960, 7951595, 15751256, 750546, 6315213, 6700686, 8414378, -432718, -5504001, 13597330, +-5360119, 10963441, -13069585, -10766946, 14918569, -826781, 4887136, 8761196, 13011067, 16838956, +7067369, 2255932, -8319352, 3651259, -1752884, -15189689, 12771622, 7925289, -12435004, -799938, +712965, -15566572, 5154498, 12262132, 7227893, -166967, 4683125, 3310883, -7274601, 13427678, +1242319, -2704756, 6899865, 13281649, 5188858, -595390, -4712116, -3715147, -1650878, 2223719, +3714073, 5456219, 1750199, 898185, 1675037, 6386080, 5708012, 7106024, -139050, -811749, +2797098, 6077379, -23622, 516470, -1273995, 2779918, 460098, -758599, -2357400, 1411434, +-4461934, -7936563, -402116, 4377646, -155693, 3080565, -3800509, 2354179, 130460, 2680597, +387621, -2181307, 1752347, -1490891, -1202591, -556735, -4808216, 3328600, -1792612, 1344862, +2612414, 79457, -716723, -2270427, -3124589, -704912, -34845608, -21667036, 7091528, 7424388, +14332843, 23693188, -6510634, -3702799, -7533910, -6987375, -8889509, -9532680, 787053, 3822521, +3011309, 14945412, 666257, 14664629, -726923, 5043366, 6803765, 5209796, 10932302, 7775502, +568546, 9606768, -103079, -1146756, -5519033, 6495601, -855235, -14330695, -12362526, 7762617, +-1771674, 17066052, 10221485, 10969346, 4089346, -21500070, 5204427, 13495324, -2045478, 3914326, +-3264175, 2663954, 16999480, -608812, 14252849, 23688356, 1364189, -8968429, -221728, 228170, +-14848776, 20103668, 9622874, -2694555, -1114007, 14558865, 6907381, -17695266, -14356465, 5647882, +-6228240, 8425115, 6132140, 2652679, -6963216, -12579422, -572304, 3156801, 2392834, 13559749, +-18213882, 2643016, -1218697, -15487115, -7346542, -15575699, 13605920, -4642860, 18800146, -14789183, +1401233, -7130720, 10697153, 4616553, -4587025, -918049, 9862319, 589484, 3102040, -5718749, +-2995740, -4840965, 8749922, 4302484, 2684, 2291902, 2649995, -8013872, 578210, -2276870, +2840584, 1640141, -1687922, -8189966, -2805688, -6057515, 7244536, -5388037, 1216013, -1470489, +7176891, -1538672, -1200443, -2568927, -4395899, -294742, -2899103, 2805688, 7919920, 6825240, +-429497, -7215008, 9176734, 24713242, -29417304, -8230768, -14341433, -604517, 4662187, 778463, +19720880, -20353850, 9621800, -2778844, 3928821, -2464238, 10828149, -5971615, -10080825, -841814, +-2939905, 7656853, -640487, 5177583, 11470784, -2385854, -8603356, -1148367, 12899934, -7589207, +3071975, 2906082, 507343, -1168231, 12810814, -480499, -3311420, -21400748, 6880538, -5291937, +-13525389, -11757473, -3131031, -13033615, -7690139, -11317239, 5364951, -13356811, 13326210, -12258374, +8259222, -6330782, 16157130, -15652471, -9105331, -2351495, 9357660, 3863860, 70867, -6437082, +-12839805, 1312113, 5005785, 18327700, 9596031, 4007205, -10487236, 6242735, -9304510, -10472741, +9136469, -10166188, 4838281, 11882564, 9894531, -2630131, -3796214, -8553964, 14274324, 1409286, +13660680, 22113176, -4337380, -11584064, -5192079, -3847754, -7975218, 3512210, -13229036, 5770826, +4297652, 3985730, 10437844, -7372848, 373662, -1329829, 2636036, 9521942, 263067, 7492034, +-2726231, -162135, 924492, -4220879, -1530619, 4508642, 2358474, -6039261, -7927436, -3741990, +3476776, 3152506, -3491272, 11323681, 3295851, -8242042, 4148939, 6063420, 15052250, 12264816, +6850473, 2561948, 1439888, -6299644, -4968741, -181462, -5033165, 980326, -2924336, -9207873, +5085242, -3025805, -1298691, 1126355, 5015985, 155156, -4264366, 15992311, 22290880, -24363202, +17250200, 11905649, 225486, 8462159, 29749090, -8858907, -9046275, 2470680, 8495982, 12119324, +3753265, -12147241, 12938589, -5280126, 26246008, -1091459, -4759361, 8220568, 6629282, 6531572, +-649614, 24592446, -21117818, 4674535, -739271, 6469295, -9018894, -17667348, 8236137, 6389301, +6652368, -6437082, -4958540, 20493974, 7475391, 25854630, 2042794, -10096394, -1398549, 5444408, +-2637110, 26854284, -3782256, 14445049, -2994666, 24055574, 8560944, 6206765, -6281390, -1760937, +13107703, -133681, 14061186, 10491531, 12386686, -17293686, 2369748, 11696807, 14185203, 10464151, +7977365, 19168976, 23655606, -18687402, -2532420, 36088464, -9105331, -10260140, 23270132, 31442918, +269509, -700617, -17551920, -14551886, -1257889, 15602006, -2662880, -3392487, 403190, -1602023, +-4756677, -12646531, -4799089, -1305670, -7577933, 122407, 7116224, -4521527, 9190693, -9979357, +8067023, -2318746, 6988449, -7569343, -63888, 5041218, 2865817, 8884140, -1939715, -5234492, +-2455648, 2399276, 8151311, 2152316, -3316789, 11324218, -3929895, 5810017, 5881958, -1404454, +-1593433, -2976949, 16751983, -6556805, 1904281, 4017942, 6054830, -3411815, -11330124, -6733435, +-2203318, 12558484, 5961952, -1282585, 496606, 4270808, -1099512, -150324, 4286378, 2115808, +895501, -182536, 9993852, 22502944, -1388885, 7006166, -19249506, 18299246, -9762998, -6044093, +-16851842, -10961293, 34517040, 436476, -24321326, -10890963, -733903, 43487, -3219078, 26641682, +12459700, -2341294, -11159399, -1126355, 7011534, -3376918, 35554276, 7485591, 15627775, 5312875, +-8019778, -20221242, 4727149, -317291, 3147137, -15693810, -1660542, -10632192, 11985643, -26307, +1960653, 12346957, -11277510, -8366597, 2451353, 439160, 3693135, -17342542, -13544179, -29637422, +-15449534, 1152662, -16865800, 2141041, -12239046, -7452842, 21919902, 6765647, -10665478, 6434398, +2484639, -227096, 21089364, -3755412, 25549150, 9629854, -10997801, -31336618, 5437429, 4816806, +17273284, -9494025, -22404160, -8148090, 6497212, 947040, -5343476, -16299401, -5178120, -22963580, +-25957708, 7928510, -1442572, 26411902, -8506183, -16402480, -14086419, -1498407, 18811420, -1219234, +6933688, 11858405, 9249212, -4343286, 6139656, 8031052, 2765959, 8230768, 8312373, -6105833, +-838056, 11609297, -2332704, 1414118, 11285027, -2382096, 6705518, -8568460, 3274376, 6221797, +-3777424, 3609920, 3734474, -8037495, 10356240, -10023380, 5022428, 4911832, 8231305, -2311766, +-5609228, 10730976, -1424319, 7855495, -11720429, -6015102, -8595840, -7573101, 1130113, -6296422, +4512937, 301721, 1911797, -12093554, 1336809, -3665755, 16426639, -17712446, -850404, 27506044, +-5641977, 8308078, 3061775, 3850975, -25334402, 21470004, -1897839, -20213726, -11771968, 10980084, +-2851858, 5623186, 74088, -8228621, -6125697, 3940633, -6137509, -1217086, -166430, -29392608, +-7566122, -19620484, 4584878, 7332046, 5369, -8488466, 3702262, -3921842, 11813844, -25974888, +1939715, 4844186, 15195594, -11157788, 14169097, -10985989, 9080098, 2652142, 11062225, -16863116, +5421860, -8217346, -18041010, 12112345, -14566382, -29349660, 4525822, -2505040, 23529978, -10998874, +3441880, 11008538, 15670188, 17819282, 2064269, -5735929, -10871099, 628139, 8533026, 11831561, +-22908282, 26146150, -23622, -17184702, -12878996, -22957138, 9641128, 5923834, 9431211, 4373351, +24824910, -8470749, 26965416, -14253923, 6453189, -5623723, -12263205, -37042484, 21249888, 4319664, +-9714679, -25053618, -1288490, 4987531, -1984275, 9562208, -6648073, -7858180, -1130650, 4239133, +-6926709, -6733435, -4304631, -1022739, 4115653, -1917166, -2069637, -9759239, 7649874, 524523, +-5308580, 4889284, -3798362, 8043937, -2206540, 4169340, 5338645, 9872519, -3110093, 8992588, +1165010, 777926, -9195525, -7085623, 2498060, 3830037, 1501091, 795106, -1619740, -5853504, +-3209951, -2619930, -6508486, -2784750, 11937862, -5570036, -6467147, 3953518, -14443438, 248571, +-3636764, -21937082, -54224, 12146704, -4784057, -23766202, -3757560, -34746284, 16877610, -38405060, +22974316, -26546656, -23154168, 6629282, 19937238, 14886357, -13176960, 13965623, 25074020, 4466766, +3772592, 5906654, 2289755, -14744086, 17995376, -30137248, -18699214, 1703491, -1835025, -1926293, +-3975529, -7504919, 4057670, 27752468, 7209103, 3861713, 2633889, -13051869, 16146930, -2911451, +-27881318, -4298189, 636192, 599685, -19061064, -13495324, 14733348, -4791573, 25256556, 4673998, +59056, -20526186, -11207180, 7558069, 3300682, -5601711, 21651468, -17107928, -10341744, -754841, +-1215476, 20381768, 1709397, 23843510, 59593, -19504520, 4909685, -16631187, 12720619, -2346126, +17315160, 32628866, -50177568, 17100950, 7019587, 9185324, 19086834, 4699768, -22972170, -5364414, +-2018098, -4186519, 11851962, -23617488, 2317135, -6200859, -3277597, -16281684, -8654359, -24621436, +2831457, -1574106, 2627983, 6750615, -9887015, -1833414, 12050604, -7386270, 2449742, -4127464, +-12015171, 5601711, 7437810, -8533026, -779537, -13464186, -669478, -19464792, 7105487, 4728759, +-2297808, 2036351, -4773856, 768799, 4083440, -3164317, -3491272, 11042361, 13700946, -3104725, +4640176, 2128156, 14065481, 6127845, -17375828, 2259690, 10209674, -5786395, 10318122, 3205119, +4518843, 41084048, 35499516, -10193568, -13768591, -841814, -27055610, 15756088, -1569811, 5927055, +2076617, -13692356, 40987408, -17650704, -72368592, -10616622, 14412300, -48730700, -8370892, 15212774, +-41280004, 5695664, 26835492, -18993420, 26771604, -25759604, 22997402, 28532542, -18268106, 7749195, +-2656437, 590558, -7753490, -11330124, -2108292, 17550846, -11355894, -18891414, -10327786, -15218143, +-1632625, -11951820, -1973001, 6269579, -2861522, 17142826, -15176804, -18643380, 14810121, -19718732, +-29236916, -37484864, -13074417, -918586, 7262253, 20845624, -8741332, 9329206, 9757092, -6897718, +-3251290, 34367792, -22762790, -903554, 23519240, 7274064, 18489298, -4650913, 6727530, 26090852, +13406740, -1443109, -3205119, -16120086, 6581501, 26246546, -24445344, 18559628, -24190866, 7035157, +34160560, 7860327, -19215684, 19417010, 3071439, -12283606, -9592273, 23502062, 7727720, 10129680, +-1430224, 1766842, 6439230, 7702487, -712428, -2367064, 9993315, 8716636, 1830193, -11632382, +12787728, 1574642, -4420595, 3140695, 4380330, -8469676, -2249489, 6522982, 1257352, 10869488, +-13428215, 20194400, 15649250, -2782602, -12805445, -5203353, 13465259, 15394237, 24836186, -767725, +4783520, 4064113, 13618268, -20718386, -11050414, 20785494, 13006772, 1409286, -3354370, 1786170, +5748277, -10844792, -8507256, -7295002, 1525787, 6628745, -3343632, -27380, 10799158, -11534135, +-8179229, 36349920, 24700356, -34613680, -6816650, 31329102, -9260486, -19042812, -13391708, -19107772, +-11199127, 31629750, 19363860, -2312840, 14464376, -3211025, 17585744, -10714870, -5871757, 35121020, +-14326937, 6528887, -9903121, -3550327, -201863, 9768903, 28589450, 11166915, -19053012, -5418101, +-695785, -2687039, 16173773, 2366527, 28783260, -8196945, 5129802, -2717104, 8535174, -23735064, +14592688, -21874268, 15159624, -933082, 22162568, -5491653, 16481400, -7271917, 5317170, 9594957, +-9301825, 9934796, 22370338, 27956480, -14493367, 28642600, 12118250, 33935612, -9491878, 6606197, +-1080184, -3891240, -6283001, -2068564, -10980621, -54957328, -34594888, -10435697, -532039, 8100845, +4054449, 13027710, 20958366, -30115774, -1553168, -11999065, 46148888, -2940442, -13856101, -3716757, +-40219148, -33475512, 50985020, 20970178, 11503533, -7545184, 16062641, 1620813, -36829344, 7861401, +2631204, -13747653, -14302241, 2641942, 322659, 4257923, -7624104, -3605088, -17999672, -14984604, +6593312, 8398272, 7109245, 5747740, -9323300, -13482976, -8345659, -17542258, 11409044, 4227322, +-31754304, -3398393, -9160628, -1821603, 15634755, -14275398, -20536386, -4137127, 13359496, 4901632, +-14252312, 8938364, 18442590, -33812132, -9177808, 12625056, -595390, -2163053, -6516539, -931471, +5977521, 10698764, 2418067, -4275103, 27278948, -39689256, 37171332, -10973105, -11228118, 9502078, +17248588, -31097710, -6311455, 454193, 6089190, 1580548, -993211, 15466714, -9546102, 1909650, +8062728, 8968965, 12857521, 10650445, 3469260, -17098802, -3549254, 23060754, -22604412, -19304804, +23856396, 8108899, 16815870, 26139170, 40519260, -9298067, -25991532, 34313568, -14027900, -5881958, +35704600, 11188927, -13299903, -37476812, -24838332, -3828427, -13962402, 17525614, 35176856, 18037788, +-12278238, 36221068, 12052215, -13211319, 9852655, 40432824, 11560441, 7787850, -8703751, -32499480, +-43714176, -34672196, -2661806, 26193932, 7860327, 16533477, 61915176, 30545808, -37327024, -25074556, +16303159, -51483772, -23804320, 44320840, 15677704, -57192860, -47871168, -22159346, -36694052, -34350076, +-20716238, 31077310, -9036611, -6544994, 80981608, 13622563, -23549306, -6495065, -25432648, 43111272, +-9287867, 9351754, 2782065, 601832, -23826332, -9149891, -2062658, -11980811, 2632278, 9236327, +20900922, 2734284, -14578730, -635118, -300648, -9483825, 4134443, 6113349, 6918656, -18730352, +4567161, -17351668, 2771328, 9086540, -1272384, 13824426, -3610994, -917512, 13743895, -2883534, +7563975, 15525770, -5552856, 4619238, 10448045, 11671574, 9317932, 1918240, 2115272, 8120173, +-8874476, -3309272, 5291400, 15343771, -55486144, 38359428, 16440061, 12377559, 15388868, -6000070, +18894098, 15501611, 22158810, -4271345, 30406220, -19197430, 23053236, -8479339, -17744120, -5680631, +-29075318, 2945811, -10708427, 10187126, -7416335, -11315091, 27793270, -32068374, 20589000, -1177895, +-13989245, -5671505, 12284680, 13861470, 10024454, 26264798, 21194590, -15359340, -3238942, -13753559, +11791296, -12203613, 9185861, 12594992, 5760625, 7019587, 4670777, -7623030, 29046864, -2838974, +8601209, 2789045, 13361106, 7318088, -34839700, 2131378, -20859582, 5181341, 15316390, -2978560, +-14781130, -13639742, 32383516, -34404300, -27758910, 50745576, -21661130, 13057237, 5019743, 16200080, +-7718593, 8406862, -35454956, 2276870, 34359740, -18573586, -13943611, 29498910, -2059974, -24744380, +-18238578, 10773925, -9674414, -5876589, 18362596, -13719736, 4549444, 22752590, -25847114, 1535451, +15086609, -8544301, -5163088, -6911676, 9277666, 2400350, 3731253, -3561065, 5262409, 3803194, +-5094368, 221191, 898185, 13499082, 6876780, -12994424, 15669651, 3747896, -7993471, 4401805, +4782446, -1597728, -4679904, 11063836, 13422, 3610994, 1406602, 14358613, -6750615, -5652714, +8830453, -13238700, 16436840, -1417876, -9279277, -1714766, -984621, 1791538, -177167, -6503118, +-934692, 8376797, 17611514, -32603096, -132843336, -143325200, -5032091, -82140712, 73058464, 263656768, +115024592, 159074848, 200876688, -75631152, -53428320, -21169894, -180067040, -125899448, -40688372, -197477760, +-85950888, -17417702, -80603648, 19429896, 185732096, 168731008, 182606976, 236609216, 142669152, -12641162, +53350472, -52825952, -210161872, -114121040, -84362824, -174628000, -119640608, 6853157, -134372880, -44130252, +29917132, -134300400, -68745248, 100774968, 39242044, 109274704, 271997056, 221112976, 178884848, 321623264, +233545824, -3811784, 33775084, -59936804, -287829376, -275176416, -283816800, -442253856, -299460160, -185071744, +-181103744, 2303176, 143847584, 161939600, 226965936, 343455104, 317917248, 268363520, 265022032, 151783600, +53501872, 8539469, -16121697, -120237608, -206951392, -254203552, -272117312, -367538080, -305455936, -235603648, +-115174376, 123300456, 363875520, 338856800, 371360576, 260402256, 31915366, -35298724, -111276160, -153110208, +-103421200, -50761144, -51122460, -22655416, -23368918, -37251324, 412854, 5426691, 27194122, 84680648, +76976552, 56690884, 77987480, -7340636, -50173272, -6750078, -58942520, -51096688, 31779000, 34293704, +8041253, 7859790, -89912992, -230230656, -217934160, -185678416, -139811392, 68093488, 210111952, 256853536, +324523968, 290842848, 179467888, 124528280, 44261248, -51707648, -108306728, -129288176, -167586944, -205741824, +-231963664, -270989888, -240906864, -83403432, 59290412, 139456512, 180895968, 196524288, 147496160, 102245456, +51210504, -2077690, -6065568, 24787866, 39709120, 43389372, 47182364, 38930120, 2864206, -33474976, +-71459128, -127287800, -122781840, -100001336, -83619256, -46903192, -7081328, 23574002, 33800856, 35664872, +22436372, 13960791, 20300162, 32255742, 45293652, 61579092, 73202888, 70543768, 51367808, 25616258, +-5674726, -28797218, -38020660, -50489488, -63231044, -62474596, -48408576, -36935644, -26674432, -20204600, +-12170864, 2449742, 21632140, 32340566, 29753386, 27722940, 23781234, 13908715, 11783243, 9941239, +4184372, 8645232, 17462800, 16416976, 14577119, 15021111, 3346317, -10750303, -20018306, -33758980, +-40598716, -34304440, -26386132, -19046570, -2747169, 7810398, 11220065, 14671608, 11000485, 4314295, +4697621, 10699837, 13073880, 20334522, 22259204, 18894098, 15375983, 6019397, -6820408, -17784386, +-23818814, -25642566, -22677964, -15161771, -5388574, 3470871, 7589207, 8280160, 6216429, 4721243, +4328790, 4366908, 3847754, 2950106, 1348083, -134755, -1145683, -1647120, -1563905, -1193464, +-614717, -255551, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -7737921, -3799972, -8803609, 1763084, 674847, 584652, -5995775, -2106682, 1692754, -1291711, 1998234, -3170223, 1929514, -52076, 2508798, -6786049, 199179, -236760, -133144, 3773129, 5731097, --5946382, -1305670, -3596498, -1146219, 2153926, 3944391, 659814, 1005022, -1445793, -1910724, --1559610, -1173063, -2694555, 1523103, -2716567, -1815161, 3144453, -2627983, 2263448, 406411, --6721087, -2249489, -3693672, -854699, 2888366, -1957968, -567473, -1924682, -2006287, -1381906, -2823404, 4296578, 806917, 2405182, 1903207, -2224793, -4268124, 2339684, 1916629, -900333, --3670587, -3042448, 2800319, 600222, 2099165, 1028645, -5654862, -1835562, -2092723, 3169149, -1285806, -5668820, 1520418, -2986613, -918049, -258235, -2050847, 1666447, -1869921, 476205, -2195265, 2287070, 1398549, 1589138, 1030792, -142271, 1099512, 1372779, 143345, -1068373, -1540283, 355409, 28991, -409633, -1007707, 531502, 976568, 214212, 803159, -263067, --507343, 28991, -787590, 883153, -134755, 1036698, -179315, 234613, -84289, 966905, -498216, -6442, -377957, 628139, -427349, -11036992, 7195144, -5310190, 660888, -766115, --2068027, 5496485, -4959077, -3320547, -67646, 5813238, -2246805, -404264, -695248, 4797479, --2997887, -7861401, -1795296, -4074850, -5510980, 138513, -495532, 836445, 3089692, 5125507, -3175592, 437013, 7877507, 3025805, 208843, 5596343, 5879274, -542777, -3258807, 159988, -2565169, 2030983, -104153, -1212255, -4666482, -4131759, -2054068, 4474282, 1823751, 7755101, -4372814, -419833, 2562485, 3117073, 1010391, -4935455, 5209259, -2160906, 2697776, -282394, -1612223, -5871757, -979789, -1917703, 1997160, -1844689, -2242510, 5976984, -470836, -4619238, -1744294, -3533684, 2774012, -2026688, 4485020, 3833795, 4299799, 1388348, -4241817, 2229088, --685584, 2195802, -1863479, 570694, 5910412, -2376191, 2845953, 3840238, -636192, 158914, --226023, -794032, -1631014, 908386, -140123, 1408212, -77846, 1121523, 31675, 15569, -814970, 1366873, 561567, 1308354, 1508607, -379568, -1175210, 1931125, 179315, -143345, -115964, 1142998, -370978, -1195612, 547608, -355409, 280784, -46171, 1173063, 304943, -621160, 308164, -1052267, 2207613, 2478196, 141197, -2120640, 2314987, 911070, 712428, -1101659, -8665633, 2825552, -5516886, 929324, 1807108, 1894618, -2523293, 4619774, 746251, --1698660, -780610, 5389110, 3877282, -2335925, -2997887, -2466385, 2096481, 3823595, -2294586, --2518998, 760209, -9837623, -10737, -4196720, -1645509, -4175245, -5465346, -671626, 4999342, -1375463, -4451197, -1184337, 4282083, 1292248, -2726231, 4830765, -2088965, -6737193, -1993402, -3782256, -1656784, 4474819, 8570607, 6918119, 972810, -97711, 2434173, -1052804, -5033165, -49392, 1919850, -3621194, 3066070, -7177964, -1055488, 440234, -3027415, -2348810, 3143379, -6247030, -4880694, -5124433, 3200288, 3192235, 5908802, 1889249, -3417183, 4694400, 4081293, --1362042, 4548907, -5018133, 5094905, 1219234, 3461744, 683437, -2670933, -1557463, -463856, -1104344, 132070, -2477123, 875100, 11811, -1414118, -1197759, 361314, -381178, 1134945, -47782, 1874216, -1353989, -945430, -86436, 268435, 1578401, -777389, -1614371, 759136, -39192, -301721, 1065689, -210453, 637266, -682900, 641561, 1006096, 103616, 1607928, -14766098, -5761162, -2546916, -964757, 10641318, -1078574, 8043937, -5879274, 7086159, -7048578, --6185827, 1465121, 3346853, -4168803, -1036698, 2102387, -559956, 2747169, -4297115, 4922570, -1770600, -5315559, -217433, 2108829, 1643362, 929860, 10011032, 7974681, 6236830, -17717, -4043175, 363462, 1155346, 2986076, -9268539, -1431298, 5624260, 3653407, 4362613, -120259, --1654636, 2026151, -379031, 11293080, -1726577, 1890859, 1121523, 536871, -3359201, 6766184, --784368, 7035694, -3898220, -4089883, 2909304, -2729989, -9425843, -4352413, 1883343, -909459, --6745246, 1864016, 8053, 8746701, 756451, 745177, -2689187, 3174518, 3224447, -733903, --521302, 7681549, 5647345, 5603859, -3720516, -5297306, -4620311, -9039296, 742493, -6403796, --2165737, 388158, -3490735, -3990025, -2222646, -463856, -1363652, 2109366, 3954591, -755914, --464930, -1793686, 912144, -1302986, -1493038, 620086, 1080721, 2684, 1394254, -830002, -46171, -802085, -533650, -443992, 811749, -501437, -491237, -304943, -1284732, -1473174, -88047, -175020, -1765232, 1486596, 1503239, 1815161, -34360, -1291175, -746251, 1423782, -381178, 10944650, -8536784, -141734, -8932995, -5842766, -3434900, 7889855, 4658429, -10806675, --14804215, -5650567, 5322538, 3810173, -2157684, 5173825, 121333, -1190243, 651224, -7744900, -2426657, -952409, 723702, 2550674, 599685, 51003, 3355980, 2964064, -5127654, -5102421, -5986111, -1793686, -2841121, 3704946, -10107132, 2507724, 2194192, -9294846, 3482145, 9789304, -5949067, 6746320, 1435593, 3761318, 9285182, 1816234, 1826435, -10484015, 5652177, 8056822, -6590628, 1341640, 6694244, -7443179, 7488813, -2136209, -7339026, -11327976, -41876, -7172059, --5788006, -2420214, -6889665, -17264158, 824097, 998580, -510027, 2797098, 8611409, 3308199, -3516505, 2375117, -6130529, 1006096, 2972654, 2588255, 2274185, 2624762, -6293201, -1787780, --7951595, -3518652, -504659, 1976222, -2860985, 2955474, 644245, 610959, -1936493, -214212, --993211, 128849, -1079647, 1188632, 421981, 929324, -220654, -1349157, -1149441, -1087701, -1307281, 913754, 73014, -442382, -1034550, -1078037, -1095217, -3488587, 620623, 635118, --2665027, -1300301, -919123, -23438710, 11577621, 1511829, -9092446, 2237141, -979789, -2669322, --1838246, -5144297, 2796024, -2628520, 567473, 3399467, 3140695, 10182831, -4086662, -9695889, -5307506, -12300249, -5288179, 2026151, 1716913, 1420024, 4012036, 4958003, 4280472, -75162, -5658083, 381178, -2216740, 7499550, 4660577, -2267743, 4474819, -7730941, 14652818, 564788, -2744484, -1360968, -12538620, -2164127, -4652524, -4389994, 1972464, 10479183, 319438, 448824, --1326608, -2879239, -6755447, 2154463, -1094143, 3757560, -8518531, 2891050, 4576825, 2011655, --6303402, -2239826, 1694902, 824634, 5155572, 1014686, 17816062, -5070746, -7552700, -8611409, --2576981, 186831, 6381785, -8578660, -1081258, -3675418, 3956202, -12528956, -511101, -3392487, --5212480, 1563905, -1486059, 3419868, -407485, 6281390, 4016331, -17717, 1376537, 485868, -834834, 7282117, 921271, 5206574, 1935957, -1318018, 183073, 184684, 1555852, -960999, -826244, -282931, 2259690, 403727, -1592359, -2400887, 1996623, -928250, -2794950, -1264331, --1438814, -670015, -807991, -61203, 3598109, 52076, 1063004, 417686, 1498944, -1406602, --704375, -2585570, -2863670, 10741176, -3266860, -2386391, 2422362, 3269544, -8409546, -8485245, --7750806, -7275675, -11992622, 7786239, -6961605, 2284923, 3082176, 11164231, -1688459, -2482491, -8769786, 2138894, 1942399, -10002442, -6511708, 5122286, 2296734, 4100620, 6093485, -10545218, -248571, 4696010, 10323491, 30602, 1091995, -1401233, 134755, -6835441, -1192927, -2033667, --12836584, -907849, 4088272, -7307350, 3311420, -7961259, 78920, -5468030, -1027034, -1615982, -855235, 10584947, -2925410, 268972, 5479842, -2866354, 3259343, -8546985, -15342697, -8272644, --4568772, -2062658, 1764158, 10442139, -4735202, 2892124, 2627446, -7298223, 2622615, -5592585, --1897839, 3899830, 10579041, -1485522, -450435, 3464428, -127238, -9709847, -9196599, -3785477, -9396315, -1001264, -13821742, 1101122, -9045201, -3943854, -1794760, -853625, 3198140, -3409667, --962610, 3580929, -877247, 4185446, 3627637, 2662343, -1550483, 4100620, -3453691, -2560874, --2417530, 713501, -312996, -654446, -741419, -576063, -1131724, 903554, -224949, 2680597, --1680943, -1021129, 1177895, -1436667, -814970, -3916473, -4773856, -323196, 480499, 2502355, -416612, 1552631, 207769, 10230612, 10744934, -3405372, 920734, 11270531, -11641509, -10376641, -8611409, -2176475, 1106491, 7798587, -1640141, -2256469, 7806640, -14705968, 6145562, -758599, -2396055, 7009387, 7257421, -8282308, 1475858, -11342472, 3383897, -3488050, -1275605, -7927973, --471910, -11319386, 1015760, -9826885, 6736120, -3520800, 1219771, 12014097, 5558225, 5315559, --9746891, 1667521, 11179800, -2776696, -16041703, 8457864, -2012729, 1444720, -3204583, -7530689, -10497437, 3672734, 8544301, 2025614, 1189706, -7221451, -9264781, 3191698, 4258460, 4493610, -6075768, 14012331, -519691, -11097659, -7186554, 8380018, -1273995, -9561671, -2524367, -717796, --2613488, -12068321, 147640, 1488743, 2939905, -4466766, 6838125, -498753, 724239, 9632001, -4968204, 10032507, -10051834, -4344897, 1819456, -5664525, 4535486, 2642479, 2768643, -583042, --1298154, -1007170, -177167, -4117263, 5025649, -2021856, 3075734, -993748, 3586835, -1618129, --1804960, 40265, 2056216, -1964948, -81604, -632434, -2001992, -1194001, 903017, -2384244, --692564, -4844723, -3635153, 1761474, 3200288, 1463510, 1455994, -693637, -383863, -2386391, --351650, 2177012, -3103114, -660888, 1431835, -849330, 2509872, 2204929, -1735167, -934155, -2246268, 1319629, -1164473, -77846, 8213588, -10011032, 11712913, -2644089, 12389907, -10129680, -9170292, 1002338, -973347, 15431817, -8069170, 916439, -7831873, -2340220, 23527830, 11348377, -4993973, 3397319, 6690486, -3767760, -32749, -19900730, 3694209, -838592, -8603356, 9531069, -7155953, -306016, 1699196, -11504070, 10130754, -5377299, 10759430, 7040525, 5745593, -8257075, --1449552, -6943889, 10332081, 2369748, -3759707, 18300318, 8754754, -2075006, 964220, -15178951, -2578591, 694174, 12052215, -5422396, -15424838, -2664490, -4265440, -3009698, -21801790, -10877542, --23221278, -11842835, -8295730, 2723546, -5834176, 10955388, 1373853, -12550431, 7573101, -8400419, -11866995, -10583873, -8565775, 6168647, 10572599, 10394895, 44023, -9769977, -7777649, 4760971, --6376416, 227633, -3214246, 3918084, -4371740, -6459094, 11379516, 5257577, 1568200, -1823751, -4299799, 2407866, 5289252, -510564, 3588445, 1248762, 5939403, 99858, -258235, 317291, --2895882, 85899, 1535451, 708670, 672162, 139586, 4583267, 2071248, -3575560, 379568, -2099165, -1158031, -1348083, -891206, 302795, 849867, 2324651, -597000, 1595580, 2645163, --522912, -2728378, -205085, -2972654, -1262184, -2747169, -1719598, 2340220, 198642, -1547262, -1560147, 839666, 3274376, -1931125, -962610, -2940442, 1299765, 640487, -14133127, -16832514, --11062762, -1352915, 59593, -1941325, 4347044, 6469295, 4578435, 275952, 2585034, -5152350, -3844533, -10745471, -15088220, 761283, 12062953, 2341831, -3869229, 9706626, 5860483, 9404368, -15641734, 2273112, -4464082, -9511205, -7558606, 4767414, -8704825, -5952288, 2593087, -6832756, --15393700, -8314520, -586800, -1540820, 3944928, -3246459, 8962523, 2800856, 3574487, 12295418, --1644973, 1705102, 3067144, -9310952, 11594801, 2142652, -10181220, -16838956, 4639102, 1819456, --12156905, 13447543, 8832600, -11251204, 4189204, 11349451, 6512781, 3249143, 9477919, -3923990, --3420942, 978179, -4803384, -7866770, 14236206, -12153147, -1097364, 5486284, 1484448, 21961242, --18527416, 6024229, -2113661, 194884, 6354404, 528281, 1592359, -4777614, 3163780, -10879689, --23376970, -1049583, 8590, -11885785, -7439420, -1413044, 4773856, 4185983, 1968169, 1284195, --3643206, 161598, -5222680, -2502355, -769336, -2924336, -4676683, 1989107, -643171, 1131724, --2244657, -1584306, 1482301, -3779034, -8328479, -2738579, 890669, -2063195, -8018167, -4369056, -3764002, 2646237, 1949378, -1373316, -2887292, -3714073, -426276, -1728188, -4412005, -3639985, --5256503, -2634963, -3442416, -3492882, 208306, -646393, 1831804, -1200443, 1786706, -1005559, -3109020, -4121021, -11110544, 9889162, -20132122, -14292577, 10697690, -449898, -18327700, 9475235, --10697153, 20860120, 4227322, -27359478, -3422552, 2529199, -6856916, 2098092, 4841502, 9759776, -8393977, -15883863, -629213, 1519345, -3231426, -14557255, -2184528, -3000035, -4937602, -4423817, --136902, 1103270, 12490302, 13623099, -4138738, 7345468, 6406481, 6202470, 13636521, 187905, -3729105, -15600395, -5281199, 5515275, -2999498, 7550016, 18697604, 2750927, -16193100, -36287640, -12885, -11183558, 10404558, -6855842, -3597035, -7128572, -19505058, 8536248, 26316338, 1536525, -6976638, -20562156, 4366371, -2332704, -9149354, 2359011, 10167261, 5224828, 8228084, -8857833, -13127031, 7624641, -15038828, -22524420, -1311039, -17129940, -15894600, -10217727, -11683385, 1533303, -21246130, 8101919, 912144, -2829310, 13732621, -6929393, -9982041, -1629403, 2260227, -1600412, -2650532, 2099702, 273804, 2124935, 5355288, 1904281, -407485, 379031, -1856500, -2011118, -5618891, -1661079, 5534066, 121870, -2874944, 650688, -1431835, -2277407, 6664179, -1575716, -3687230, -7988103, -842887, 3870303, 141734, 1578401, 6816113, -4993437, 6247567, -622233, -863825, 1847373, -1847373, 4625680, 869194, 263067, 1014149, 213675, 2317672, 5957657, --2289218, 2079838, 2552821, 2303713, 2851322, -952409, -39602820, -25012278, 17933100, 14439680, -23497230, -98247, 9247065, 2282775, 7404524, -311385, 4768488, -10431402, -12510703, -7765838, --11202885, -7226820, -7988103, 9558450, 22583474, 4929012, -27604828, -6560026, 4811974, -7332046, -6715718, -15773267, -1299765, -537408, 893353, 7683160, 5803575, 1076963, -1924145, -3525631, -6394670, 12475269, -10027138, -15517180, 10295037, 4913443, 13511430, 6180995, 19654308, -13617194, --4808753, 12566537, 18737332, 16305843, 9622874, 4588636, -4056597, 1234266, -2397129, 69793, -6470905, -24522652, 13147432, -1934883, 3536906, -1622961, 18584860, -5683853, -313533, -4085588, -11770895, 10024454, -20958904, 15007153, -17835388, -901406, -9065065, -8952322, 8085276, 1484448, --27783070, -2459406, -2231236, -5119601, -3273302, -652298, -3585761, 14412300, 1372779, 13786845, --4405563, 16302622, 7645042, -8419210, 3540664, -2102387, 889058, 1060320, 1489817, 2200634, -791885, -3157338, -5269925, 8112657, 3546032, 6659884, 1807108, -3955128, 7608535, 304406, -351114, 5780489, -16229608, -7494181, -7241315, 2279554, -270583, -10982768, 423591, 1854352, --561030, -2055679, -81604, 3787088, -4072166, -151398, 4326106, 2194728, 5283884, -4651450, --2339147, 1342177, 5737003, 21943524, -24479702, -593242, -13928042, -39230232, -4667019, -14498199, --30972620, 6153078, -232465, -6043019, 1912334, 16598438, -1108638, -17605608, 5998996, 680752, --5681705, -4257387, -3167539, 860067, 19128710, -4329327, -739271, 8672613, 6396817, -2786897, -9244917, 8463770, -4126390, -4052302, -7733089, 10635950, -2583423, -18387828, 2769180, -1242856, -6274411, 24034100, -16095390, -25787520, -16282758, -7549479, 3526705, 8569533, 4531728, 18290118, -9116605, -12931610, -7489886, -17629768, 15206869, 9356049, 1658931, 3214246, -10138807, 1042603, --10725607, 18440442, 18077518, 1271847, -8478802, -4714264, 1749662, 16786342, 33503966, 20623360, --3214783, -7512972, 423591, 10658498, 4595615, 9836549, 13550622, -13481365, -668404, -25984016, --17541720, -16702591, -11220602, 6967511, 15901043, 10937671, 1693291, -3191698, -1535451, -14470819, --18216030, -4603131, -9698036, -9121974, 2044941, -1858647, -2365990, 84826, 541166, 4138201, --4672388, 9275519, -9483825, 3976603, -12059731, -4039417, -67646, 2214056, -406411, 2101850, -4553739, -3271691, 491774, 11025181, 13424457, 16210280, 8852464, 10150618, 4547297, 1923609, -704375, 278099, 558883, -2847563, -8816494, -8594230, -1481227, 6662568, -64425, 1019518, --3643743, -2557116, 968515, 8155069, 5087389, 9734543, 7824357, 6975564, 8409009, -19132468, --2240899, -9904195, 14416058, -15895674, 3092377, 1403917, 28186796, -17420924, -5097053, -17918604, --3867618, -17699560, -14870251, -10733123, 5563057, -19040126, -13807246, -20705500, -5279589, -3113315, --6328098, -9356586, -23072028, 6034966, -16305843, 6594923, -17108466, 21098490, 3258807, 9455907, --4063576, -19903952, 10671383, 6171868, -6689949, 10654740, 14919106, -8062191, -21435644, -11487964, -28752658, -12285754, -928787, 737124, -4867809, 6314676, 18638010, 3301219, 7932268, -6004365, -13335873, 181462, 10506564, 3193845, 3571802, -331786, 1083942, 22784264, 6915434, 54556824, --33298882, 21254720, 29908542, -7909719, 687195, 15413564, -11172284, -3286187, 25041270, 9906342, --4170950, 13275207, -5685463, -24260122, -17934172, 6069863, 976031, -32411434, -9015673, -3330747, --16825534, 8625368, 5040681, -10959146, -8960376, -6628745, 943819, 2956011, 6851547, -5713380, -800475, 3974455, -1801202, -7232725, 1976759, 1477469, 2258079, 6700686, 1186485, -4141422, -530965, 7763691, 6901476, 3321084, -7763691, -215285, 14228153, -4116726, -3032784, 7855495, --7769059, -13456669, -3851512, 673773, -1778117, -6942278, -2153926, -482647, -7630547, -1646046, -764504, -2182917, -7926362, -13066364, 4879083, 13872744, 4989679, -383326, 437013, -2713346, --8335458, -6707129, 30298310, 33864744, 431644, 24432458, 24334748, -1395328, 10935524, -24574192, --7638063, 21674552, 2034741, 21399674, 29972966, 24671366, -4996658, 16084116, -25166360, -39244188, --16803522, -14708116, 9421548, 26307, 10082436, 10892037, 23600846, 18247168, 6354404, -18734648, --2293513, 18649284, 5996848, -9217000, 12009265, 25730612, -2919504, 8927090, -21049098, 10024454, --16620987, -4547834, -10559714, -21857626, 13354664, 1463510, 6502581, 26064546, -14144401, -15924128, -9401147, 27009438, -21287468, -14275398, 8769249, -6915434, 38191388, 28242632, -26922466, -10206990, --21290690, 1087164, 23285702, -10875931, -16230681, -7442105, 1394254, 5557151, -19423452, 4581657, -38919920, 2760053, -26091926, -39840652, 32052804, -38435124, -32258426, -18911814, -16523813, -27830852, -7356742, 6971269, 44560824, 11076721, 19545860, -9946071, 21258478, -2701535, -9216463, 7962333, -883153, -2157147, 21799106, 2687576, 11100343, 13835700, 7434589, 16608102, -4866735, 4409858, --3738769, -1465658, -3721052, -14172855, -10518912, -11723113, 13259101, 4656282, 11793443, 14638859, --3384971, 8726300, 19011672, 6775848, -6318971, 9757092, 11355357, 3830037, -2831457, -14003741, --12601971, 12295954, 5114769, 8142185, 16216723, 36195300, 15479599, 9046812, 6528887, 10164040, --5564667, -1320703, 18161270, -11880416, -14530948, -2930778, 6907381, -6333466, 6547141, 3888556, --35296040, -20395726, -26501558, 7192997, 14959371, 5339718, 22877144, 20519206, 28975996, 9059160, -31629212, 14156749, 20478940, -9879499, -3753265, -9931575, -24060406, -17309792, -37315212, -22164716, --7020661, -21776558, 5019743, -766115, -371515, 9044127, 7573638, 3486440, 18366890, -4483946, --14838038, 21807160, 2228551, -28678570, -12173011, -3038153, -34319472, -26156350, -25251186, 2422899, -12566537, 3402151, -13015362, -1618666, 14703284, 8947491, 34656628, 6460168, -45978700, -15373299, --7719130, 7422241, 7507066, -5285494, -11976516, 17165374, -25318832, -4730370, -20233590, 15584826, --40053256, -24995636, -32598802, -26440356, 1594507, -14912126, -11179263, -26540214, 13697724, 47670916, --878321, 30804580, -16740172, 7535520, -22269406, -124017, 34339336, 8056285, -15669651, 1752884, -13465796, -22993644, -35128536, -19192062, 9493488, -27709518, 12291123, -490163, -343597, 17645336, -9692131, -4834523, 21024402, 20388746, 16902844, -5527086, -5203353, -3721052, 223338, 14148159, -10748693, 7065758, 853625, 14739791, 8758512, 2126009, 2467459, 10856067, -4077535, -3968013, -8216273, -11680164, 10915123, -10184441, -9256191, -11959873, 21121038, 12553116, 19685982, 6735583, -7798587, 1421097, 1952063, 9046812, -13706314, -23378580, 2454037, 6127845, 6425271, 8456791, --1496259, -9281424, 26570816, 10942503, 26805428, -43408696, 19020262, 32825362, -3042984, 37787124, --19826642, -57363584, -29601988, -293668, -5590437, 6447820, -20443508, 19964618, 28229210, -25186762, -22455162, -13757317, -16799764, -40042516, -16232292, -22975390, -15072651, -18362058, 18260590, 2783139, --35801236, -45967424, 34947612, 7946763, 12635257, -10692321, 2955474, -12389907, 499827, 10650445, -16222628, 14616847, 39122320, 1316944, -27777164, 37845104, -3823058, -9752260, -17363480, 16006269, --30899068, -20813412, 17818208, -16106664, -24023362, -30325690, -26432840, -5631776, 3747896, 2932389, --8027831, 32811940, 28080496, -2639794, -15702400, -27343372, -31242666, 7808788, 6832756, -6138582, --2866891, 45015016, 3240016, -13074954, 19637664, 9377524, -29425358, 23626078, 43010340, -46881180, -76025752, 20297478, 22106734, 8351564, 22264574, -5978058, -46582140, 32101660, 2957085, -5776194, -33541548, -39483636, 7151121, 6985228, 8590, -3782793, 1897302, -3049427, -10688563, 5867462, -11927124, -9701257, -1009317, -14367739, -16274705, 21453362, -4501663, -10486163, 5158793, -5708012, --12895639, -23803782, -5229123, -8079371, 21104932, -19972672, -1769527, 24576876, -4949413, 19641422, --6757594, -17152488, 9186398, -3450469, -7897908, 10171556, 2665027, 27062052, -3351685, -413927, -17643726, 54181012, 23703924, 1108102, -18360986, 25803090, -600222, 1724966, -12633646, 23539106, --27655832, 19917910, 19108846, 20178294, 9655086, -7581154, 26759794, 33652680, -7069516, 13831942, --21122650, 33866892, 14325863, 11261404, -21854942, -47486232, 9260486, -14619532, -11005854, -19318762, --24408836, 14552423, 6388764, -11854110, 2528125, 1066226, -12983686, -57979376, -3796751, -12360916, --6124624, -950798, 40628244, 27808840, -13796509, 10465225, -27078696, 2952790, 19934554, -30774514, --28698972, -23480586, 36751500, -26600344, 7489349, 29620778, -40189620, -37197640, 34019364, 27174258, -28523952, 38330436, 13989782, -49149460, 10870562, 14473503, -4548907, 80142480, -8503498, -12254615, --36451924, -31370978, 15950435, -28916942, 18608482, 6517613, 21074330, 43889732, -28403156, -19259708, -53265112, -32613298, -36197984, 23477902, -46559056, 33668248, -35458712, 8001524, 11886859, -25537876, -10351945, -29640644, 20380694, 37765648, -1781338, 6541235, 7524246, 1389959, -11787001, -10894185, --2718714, 10947335, -5123359, 7387881, -7917236, -23430120, 9795210, 2078227, 15680926, 7907572, -13659070, -4728759, -4898410, -23214836, 16051367, -3110630, -21476448, 4993437, 43420508, 12124693, --11424076, 12894566, 23256712, -11599096, 2301029, 18107582, -9332964, 18064632, 5833640, -5553930, --28382218, 4871567, -11026792, -569620, 34744136, -15888695, 1556926, 6890738, 4803384, -9893457, -11570642, 39775156, 2896956, -34773664, 48527760, 11450383, -3736085, 34481072, 16837882, 27814746, -10081899, -42438036, -9718974, -16131897, 19287624, 48526152, -31511638, 7495255, -15380815, 21392158, -24557012, -33425046, 27074400, -26919782, -24360518, 11754252, 22194780, 588411, 7035694, 17303350, --27237608, 23240604, 1357210, 28449326, -5607080, -7964480, 8898098, 42309724, -19649476, 34119756, --17176648, 6605660, 8516383, 34103652, -2522757, -2573759, 11353746, 51582556, 2922188, -40910636, --3797288, -49182744, 28841242, -215285, 79594336, 16830904, -23920284, -7421704, 17202954, -18035642, -27624692, 51960516, 35281544, 478352, 14700062, 22337588, -3089692, -24628954, -3857418, -5834176, --84131968, 51832204, 38377680, 35583268, 8140037, -36517960, -11368778, 27010512, 13615583, 23487566, -12283606, -80371184, -29169808, 48875116, 12971338, 15578920, 41791644, -30296162, -1543504, -4520990, -23417236, 5761162, -2950643, -6839199, 18323404, -5268315, -22443888, 10526428, -11140608, -12836584, -10734197, 16322486, -12905303, -4161823, -1064078, 12813498, -17428440, 13327820, -15474230, 6693170, --26298084, -26572426, 25413322, 3077344, 1660542, -3320010, -19607600, -6141267, 16797618, 1573569, -5277441, 28742458, -5151277, -22346714, -2780991, -12826383, 9249212, 10578504, -11162083, -9196599, -10788958, 23767812, 29756070, -1234803, 31532040, -19452980, 32090386, -29314762, 4984847, 15346992, --15029701, 2156074, 6077379, -8025147, -15684684, -29677150, 45252312, -10146860, -8836358, -15101105, --2459406, -6255620, 14766634, -30426622, -8682276, -19060528, 6615324, -19166828, 18446348, -179315, -9557376, -21143050, -38308424, 1748052, -27966680, -29406030, 13407277, -22580254, -18917184, 37042484, --13606993, -21800180, 2921115, -22419730, 10621991, 13916231, -3931506, -18343268, -5159330, 10510322, -9523553, -8415452, -608812, 32605244, -5650567, -20344724, -25472378, -3839164, -11052025, -38788388, -36455684, 12373801, -44147968, 27145804, -1753420, -18778134, 85541256, 47860968, 39517996, 20658256, -12232067, -20453708, 3408057, 9175661, 10312753, 3602404, 37622304, 8144332, -10807748, -18633716, --75187160, 15155329, 10208064, -624918, -14430016, -28691456, -5311801, -18585398, -16081431, -1461900, -24154896, -16626892, 41558640, 5746666, -7884486, -3195456, -3160022, 2966749, 17702782, -7057705, -4714801, 11840151, 4574140, 1999307, 9870372, -15731928, 7872138, 2411087, 24520506, -8752606, --5616207, -7016903, -5674726, -19537806, -10004053, 6588480, -20477330, 15188615, -3789772, -10398116, -14816563, 8706972, 12541841, -4945655, -1430761, 1160715, 2778307, -13670881, 7419019, 484794, --130997, -1661616, 9127879, 4320737, -39349952, 65700116, 8141111, 21354578, 11521250, -16622597, -12000675, 18316962, 4365835, -2153926, -16209207, -3055332, 4235912, -7713762, -5925981, 2509335, -7143605, 18935974, -13554917, 7818451, 519154, 15064598, -5671505, 2783676, 4785131, -17844516, -14046154, 2069101, 3281892, 4889821, 5025649, -11395085, 11627550, -9854802, 2174864, 11143830, --6461242, 10922639, -5081483, 13831405, 10652593, 6110665, -17710298, 12814035, 9648107, 7708930, -21481816, -21136070, -2093797, -417149, -4712116, 6172942, -11069204, -17544404, 11617350, 13218836, -6473053, -1875290, 2587718, -2079301, 6723772, -6290517, 2570538, -13077102, 11443940, -20184198, -18589692, 10311143, -6600828, -488553, 7560753, 351114, 6749004, -63888, 525597, -874026, --7046431, 9477919, 12847858, -11771432, -2931852, 2224793, 7006703, -5451924, -5789079, 1338419, -2121177, -1505923, 1039919, -4441533, 1330903, 5216238, -4482872, 970663, 2900177, -4537096, -3453154, 4555887, -714575, -1696512, -2535641, 752156, 9516037, -3855270, 983548, -9259949, -254477, 9940165, -7438347, 7363185, -3767760, 422517, 16423418, -3076270, 31675, -492311, --5461051, 8524436, 3240553, 3590056, 3239479, -2858301, 1925219, 9366787, -3077881, 6346351, --4525822, -821949, 12642773, -52740052, -122714728, -19705310, 71701792, 65058016, 160388576, 83687976, --43239584, -13376139, -88902600, -150936960, -10461467, -68659888, -9595494, 109775072, 46888696, 84780504, -130302328, -15292231, -19128710, -66337916, -112613504, -89646704, -5797669, -33772940, -12768401, 93390304, -29640106, 60695404, 110547624, 17965312, -465467, 11294153, -67262408, -101979704, 17486422, -105378632, --68840808, 23192286, -10584410, 16939352, 135420848, 15369540, 51917028, 110402136, -22025130, 3255585, -24663850, -106780400, -88888104, -31686658, -121310816, -47176996, 15475841, 22253836, 83580064, 117504400, -83919368, 59023588, 51620140, -19805704, -71042520, -58565100, -87835304, -92522184, -39539468, -23601920, -652298, 77263776, 92465280, 28722594, 72266048, 20849918, -22821846, 14979235, -50291384, -70203384, --13643500, -32733556, -21699248, 39222180, -1404454, 27280558, 49131204, -13698798, -1013612, -236223, --24768540, -7889318, -1636919, -18868866, 20863878, 7287486, -4755066, 33705292, 10920491, -5118528, -32725504, -11718818, -34867080, 432718, -53312356, -37652368, 11656541, -35811436, 7718593, 40913860, -30391188, 55863564, 61351460, 22018150, 21781926, -2854006, -50337016, -70839040, -72449120, -76120240, --48037060, -3928821, 24492588, 52068964, 91118808, 97281544, 81201192, 63106492, -3610457, -59942712, --85295904, -109619376, -111293344, -59787556, -17729624, 46332496, 98919536, 89058832, 54117660, 39574904, -11865921, -8658654, -13118441, -39715024, -45245868, -34539052, -28333900, -20845624, -3913252, 3833795, -16726213, 24142548, 25353192, 23786602, 22161494, 10681047, 805306, -8604430, -12870406, -19087908, --18429168, -14185740, -7497939, -3231963, 3518115, 6052146, 8740795, 6889665, 5964636, 4750234, -4688494, 1338956, 1243930, 1018981, 423054, -2266132, -659814, -3400540, -6561100, -7131257, --6762963, -6407555, -265751, 1012002, 3613141, 7634841, 9371619, 8734890, 7911867, 2665027, --877247, -5407901, -8227010, -9317932, -7037304, -5051419, -1835562, 1433445, 4271345, 4689031, -5375152, 4203699, 2879239, 1453846, -31139, -2088965, -1560147, -2231773, -1773822, -1399086, --1402307, -683974, 300648, -1142461, -682363, -148176, 590558, 1393180, 1385664, 1470489, -2398739, 1546188, 823560, -73014, -1124745, -1881196, -1870458, -2114198, -1498407, -860067, --192200, 445603, 1000727, 1009854, 1067836, 875636, 597537, 151398, -43487, -292595, --419833, -466004, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +3799972, -8803609, 1763084, 674847, 584652, -5995775, -2106682, 1692754, -1291711, 1998234, +3170223, 1929514, -52076, 2508798, -6786049, 199179, -236760, -133144, 3773129, 5731097, +-5946382, -1305670, -3596498, -1146219, 2153926, 3944391, 659814, 1005022, -1445793, -1910724, +-1559610, -1173063, -2694555, 1523103, -2716567, -1815161, 3144453, -2627983, 2263448, 406411, +-6721087, -2249489, -3693672, -854699, 2888366, -1957968, -567473, -1924682, -2006287, -1381906, +2823404, 4296578, 806917, 2405182, 1903207, -2224793, -4268124, 2339684, 1916629, -900333, +-3670587, -3042448, 2800319, 600222, 2099165, 1028645, -5654862, -1835562, -2092723, 3169149, +1285806, -5668820, 1520418, -2986613, -918049, -258235, -2050847, 1666447, -1869921, 476205, +2195265, 2287070, 1398549, 1589138, 1030792, -142271, 1099512, 1372779, 143345, -1068373, +1540283, 355409, 28991, -409633, -1007707, 531502, 976568, 214212, 803159, -263067, +-507343, 28991, -787590, 883153, -134755, 1036698, -179315, 234613, -84289, 966905, +498216, -6442, -377957, 628139, -427349, -11036992, 7195144, -5310190, 660888, -766115, +-2068027, 5496485, -4959077, -3320547, -67646, 5813238, -2246805, -404264, -695248, 4797479, +-2997887, -7861401, -1795296, -4074850, -5510980, 138513, -495532, 836445, 3089692, 5125507, +3175592, 437013, 7877507, 3025805, 208843, 5596343, 5879274, -542777, -3258807, 159988, +2565169, 2030983, -104153, -1212255, -4666482, -4131759, -2054068, 4474282, 1823751, 7755101, +4372814, -419833, 2562485, 3117073, 1010391, -4935455, 5209259, -2160906, 2697776, -282394, +1612223, -5871757, -979789, -1917703, 1997160, -1844689, -2242510, 5976984, -470836, -4619238, +1744294, -3533684, 2774012, -2026688, 4485020, 3833795, 4299799, 1388348, -4241817, 2229088, +-685584, 2195802, -1863479, 570694, 5910412, -2376191, 2845953, 3840238, -636192, 158914, +-226023, -794032, -1631014, 908386, -140123, 1408212, -77846, 1121523, 31675, 15569, +814970, 1366873, 561567, 1308354, 1508607, -379568, -1175210, 1931125, 179315, -143345, +115964, 1142998, -370978, -1195612, 547608, -355409, 280784, -46171, 1173063, 304943, +621160, 308164, -1052267, 2207613, 2478196, 141197, -2120640, 2314987, 911070, 712428, +1101659, -8665633, 2825552, -5516886, 929324, 1807108, 1894618, -2523293, 4619774, 746251, +-1698660, -780610, 5389110, 3877282, -2335925, -2997887, -2466385, 2096481, 3823595, -2294586, +-2518998, 760209, -9837623, -10737, -4196720, -1645509, -4175245, -5465346, -671626, 4999342, +1375463, -4451197, -1184337, 4282083, 1292248, -2726231, 4830765, -2088965, -6737193, -1993402, +3782256, -1656784, 4474819, 8570607, 6918119, 972810, -97711, 2434173, -1052804, -5033165, +49392, 1919850, -3621194, 3066070, -7177964, -1055488, 440234, -3027415, -2348810, 3143379, +6247030, -4880694, -5124433, 3200288, 3192235, 5908802, 1889249, -3417183, 4694400, 4081293, +-1362042, 4548907, -5018133, 5094905, 1219234, 3461744, 683437, -2670933, -1557463, -463856, +1104344, 132070, -2477123, 875100, 11811, -1414118, -1197759, 361314, -381178, 1134945, +47782, 1874216, -1353989, -945430, -86436, 268435, 1578401, -777389, -1614371, 759136, +39192, -301721, 1065689, -210453, 637266, -682900, 641561, 1006096, 103616, 1607928, +14766098, -5761162, -2546916, -964757, 10641318, -1078574, 8043937, -5879274, 7086159, -7048578, +-6185827, 1465121, 3346853, -4168803, -1036698, 2102387, -559956, 2747169, -4297115, 4922570, +1770600, -5315559, -217433, 2108829, 1643362, 929860, 10011032, 7974681, 6236830, -17717, +4043175, 363462, 1155346, 2986076, -9268539, -1431298, 5624260, 3653407, 4362613, -120259, +-1654636, 2026151, -379031, 11293080, -1726577, 1890859, 1121523, 536871, -3359201, 6766184, +-784368, 7035694, -3898220, -4089883, 2909304, -2729989, -9425843, -4352413, 1883343, -909459, +-6745246, 1864016, 8053, 8746701, 756451, 745177, -2689187, 3174518, 3224447, -733903, +-521302, 7681549, 5647345, 5603859, -3720516, -5297306, -4620311, -9039296, 742493, -6403796, +-2165737, 388158, -3490735, -3990025, -2222646, -463856, -1363652, 2109366, 3954591, -755914, +-464930, -1793686, 912144, -1302986, -1493038, 620086, 1080721, 2684, 1394254, -830002, +46171, -802085, -533650, -443992, 811749, -501437, -491237, -304943, -1284732, -1473174, +88047, -175020, -1765232, 1486596, 1503239, 1815161, -34360, -1291175, -746251, 1423782, +381178, 10944650, -8536784, -141734, -8932995, -5842766, -3434900, 7889855, 4658429, -10806675, +-14804215, -5650567, 5322538, 3810173, -2157684, 5173825, 121333, -1190243, 651224, -7744900, +2426657, -952409, 723702, 2550674, 599685, 51003, 3355980, 2964064, -5127654, -5102421, +5986111, -1793686, -2841121, 3704946, -10107132, 2507724, 2194192, -9294846, 3482145, 9789304, +5949067, 6746320, 1435593, 3761318, 9285182, 1816234, 1826435, -10484015, 5652177, 8056822, +6590628, 1341640, 6694244, -7443179, 7488813, -2136209, -7339026, -11327976, -41876, -7172059, +-5788006, -2420214, -6889665, -17264158, 824097, 998580, -510027, 2797098, 8611409, 3308199, +3516505, 2375117, -6130529, 1006096, 2972654, 2588255, 2274185, 2624762, -6293201, -1787780, +-7951595, -3518652, -504659, 1976222, -2860985, 2955474, 644245, 610959, -1936493, -214212, +-993211, 128849, -1079647, 1188632, 421981, 929324, -220654, -1349157, -1149441, -1087701, +1307281, 913754, 73014, -442382, -1034550, -1078037, -1095217, -3488587, 620623, 635118, +-2665027, -1300301, -919123, -23438710, 11577621, 1511829, -9092446, 2237141, -979789, -2669322, +-1838246, -5144297, 2796024, -2628520, 567473, 3399467, 3140695, 10182831, -4086662, -9695889, +5307506, -12300249, -5288179, 2026151, 1716913, 1420024, 4012036, 4958003, 4280472, -75162, +5658083, 381178, -2216740, 7499550, 4660577, -2267743, 4474819, -7730941, 14652818, 564788, +2744484, -1360968, -12538620, -2164127, -4652524, -4389994, 1972464, 10479183, 319438, 448824, +-1326608, -2879239, -6755447, 2154463, -1094143, 3757560, -8518531, 2891050, 4576825, 2011655, +-6303402, -2239826, 1694902, 824634, 5155572, 1014686, 17816062, -5070746, -7552700, -8611409, +-2576981, 186831, 6381785, -8578660, -1081258, -3675418, 3956202, -12528956, -511101, -3392487, +-5212480, 1563905, -1486059, 3419868, -407485, 6281390, 4016331, -17717, 1376537, 485868, +834834, 7282117, 921271, 5206574, 1935957, -1318018, 183073, 184684, 1555852, -960999, +826244, -282931, 2259690, 403727, -1592359, -2400887, 1996623, -928250, -2794950, -1264331, +-1438814, -670015, -807991, -61203, 3598109, 52076, 1063004, 417686, 1498944, -1406602, +-704375, -2585570, -2863670, 10741176, -3266860, -2386391, 2422362, 3269544, -8409546, -8485245, +-7750806, -7275675, -11992622, 7786239, -6961605, 2284923, 3082176, 11164231, -1688459, -2482491, +8769786, 2138894, 1942399, -10002442, -6511708, 5122286, 2296734, 4100620, 6093485, -10545218, +248571, 4696010, 10323491, 30602, 1091995, -1401233, 134755, -6835441, -1192927, -2033667, +-12836584, -907849, 4088272, -7307350, 3311420, -7961259, 78920, -5468030, -1027034, -1615982, +855235, 10584947, -2925410, 268972, 5479842, -2866354, 3259343, -8546985, -15342697, -8272644, +-4568772, -2062658, 1764158, 10442139, -4735202, 2892124, 2627446, -7298223, 2622615, -5592585, +-1897839, 3899830, 10579041, -1485522, -450435, 3464428, -127238, -9709847, -9196599, -3785477, +9396315, -1001264, -13821742, 1101122, -9045201, -3943854, -1794760, -853625, 3198140, -3409667, +-962610, 3580929, -877247, 4185446, 3627637, 2662343, -1550483, 4100620, -3453691, -2560874, +-2417530, 713501, -312996, -654446, -741419, -576063, -1131724, 903554, -224949, 2680597, +-1680943, -1021129, 1177895, -1436667, -814970, -3916473, -4773856, -323196, 480499, 2502355, +416612, 1552631, 207769, 10230612, 10744934, -3405372, 920734, 11270531, -11641509, -10376641, +8611409, -2176475, 1106491, 7798587, -1640141, -2256469, 7806640, -14705968, 6145562, -758599, +2396055, 7009387, 7257421, -8282308, 1475858, -11342472, 3383897, -3488050, -1275605, -7927973, +-471910, -11319386, 1015760, -9826885, 6736120, -3520800, 1219771, 12014097, 5558225, 5315559, +-9746891, 1667521, 11179800, -2776696, -16041703, 8457864, -2012729, 1444720, -3204583, -7530689, +10497437, 3672734, 8544301, 2025614, 1189706, -7221451, -9264781, 3191698, 4258460, 4493610, +6075768, 14012331, -519691, -11097659, -7186554, 8380018, -1273995, -9561671, -2524367, -717796, +-2613488, -12068321, 147640, 1488743, 2939905, -4466766, 6838125, -498753, 724239, 9632001, +4968204, 10032507, -10051834, -4344897, 1819456, -5664525, 4535486, 2642479, 2768643, -583042, +-1298154, -1007170, -177167, -4117263, 5025649, -2021856, 3075734, -993748, 3586835, -1618129, +-1804960, 40265, 2056216, -1964948, -81604, -632434, -2001992, -1194001, 903017, -2384244, +-692564, -4844723, -3635153, 1761474, 3200288, 1463510, 1455994, -693637, -383863, -2386391, +-351650, 2177012, -3103114, -660888, 1431835, -849330, 2509872, 2204929, -1735167, -934155, +2246268, 1319629, -1164473, -77846, 8213588, -10011032, 11712913, -2644089, 12389907, -10129680, +9170292, 1002338, -973347, 15431817, -8069170, 916439, -7831873, -2340220, 23527830, 11348377, +4993973, 3397319, 6690486, -3767760, -32749, -19900730, 3694209, -838592, -8603356, 9531069, +7155953, -306016, 1699196, -11504070, 10130754, -5377299, 10759430, 7040525, 5745593, -8257075, +-1449552, -6943889, 10332081, 2369748, -3759707, 18300318, 8754754, -2075006, 964220, -15178951, +2578591, 694174, 12052215, -5422396, -15424838, -2664490, -4265440, -3009698, -21801790, -10877542, +-23221278, -11842835, -8295730, 2723546, -5834176, 10955388, 1373853, -12550431, 7573101, -8400419, +11866995, -10583873, -8565775, 6168647, 10572599, 10394895, 44023, -9769977, -7777649, 4760971, +-6376416, 227633, -3214246, 3918084, -4371740, -6459094, 11379516, 5257577, 1568200, -1823751, +4299799, 2407866, 5289252, -510564, 3588445, 1248762, 5939403, 99858, -258235, 317291, +-2895882, 85899, 1535451, 708670, 672162, 139586, 4583267, 2071248, -3575560, 379568, +2099165, -1158031, -1348083, -891206, 302795, 849867, 2324651, -597000, 1595580, 2645163, +-522912, -2728378, -205085, -2972654, -1262184, -2747169, -1719598, 2340220, 198642, -1547262, +1560147, 839666, 3274376, -1931125, -962610, -2940442, 1299765, 640487, -14133127, -16832514, +-11062762, -1352915, 59593, -1941325, 4347044, 6469295, 4578435, 275952, 2585034, -5152350, +3844533, -10745471, -15088220, 761283, 12062953, 2341831, -3869229, 9706626, 5860483, 9404368, +15641734, 2273112, -4464082, -9511205, -7558606, 4767414, -8704825, -5952288, 2593087, -6832756, +-15393700, -8314520, -586800, -1540820, 3944928, -3246459, 8962523, 2800856, 3574487, 12295418, +-1644973, 1705102, 3067144, -9310952, 11594801, 2142652, -10181220, -16838956, 4639102, 1819456, +-12156905, 13447543, 8832600, -11251204, 4189204, 11349451, 6512781, 3249143, 9477919, -3923990, +-3420942, 978179, -4803384, -7866770, 14236206, -12153147, -1097364, 5486284, 1484448, 21961242, +-18527416, 6024229, -2113661, 194884, 6354404, 528281, 1592359, -4777614, 3163780, -10879689, +-23376970, -1049583, 8590, -11885785, -7439420, -1413044, 4773856, 4185983, 1968169, 1284195, +-3643206, 161598, -5222680, -2502355, -769336, -2924336, -4676683, 1989107, -643171, 1131724, +-2244657, -1584306, 1482301, -3779034, -8328479, -2738579, 890669, -2063195, -8018167, -4369056, +3764002, 2646237, 1949378, -1373316, -2887292, -3714073, -426276, -1728188, -4412005, -3639985, +-5256503, -2634963, -3442416, -3492882, 208306, -646393, 1831804, -1200443, 1786706, -1005559, +3109020, -4121021, -11110544, 9889162, -20132122, -14292577, 10697690, -449898, -18327700, 9475235, +-10697153, 20860120, 4227322, -27359478, -3422552, 2529199, -6856916, 2098092, 4841502, 9759776, +8393977, -15883863, -629213, 1519345, -3231426, -14557255, -2184528, -3000035, -4937602, -4423817, +-136902, 1103270, 12490302, 13623099, -4138738, 7345468, 6406481, 6202470, 13636521, 187905, +3729105, -15600395, -5281199, 5515275, -2999498, 7550016, 18697604, 2750927, -16193100, -36287640, +12885, -11183558, 10404558, -6855842, -3597035, -7128572, -19505058, 8536248, 26316338, 1536525, +6976638, -20562156, 4366371, -2332704, -9149354, 2359011, 10167261, 5224828, 8228084, -8857833, +13127031, 7624641, -15038828, -22524420, -1311039, -17129940, -15894600, -10217727, -11683385, 1533303, +21246130, 8101919, 912144, -2829310, 13732621, -6929393, -9982041, -1629403, 2260227, -1600412, +2650532, 2099702, 273804, 2124935, 5355288, 1904281, -407485, 379031, -1856500, -2011118, +5618891, -1661079, 5534066, 121870, -2874944, 650688, -1431835, -2277407, 6664179, -1575716, +3687230, -7988103, -842887, 3870303, 141734, 1578401, 6816113, -4993437, 6247567, -622233, +863825, 1847373, -1847373, 4625680, 869194, 263067, 1014149, 213675, 2317672, 5957657, +-2289218, 2079838, 2552821, 2303713, 2851322, -952409, -39602820, -25012278, 17933100, 14439680, +23497230, -98247, 9247065, 2282775, 7404524, -311385, 4768488, -10431402, -12510703, -7765838, +-11202885, -7226820, -7988103, 9558450, 22583474, 4929012, -27604828, -6560026, 4811974, -7332046, +6715718, -15773267, -1299765, -537408, 893353, 7683160, 5803575, 1076963, -1924145, -3525631, +6394670, 12475269, -10027138, -15517180, 10295037, 4913443, 13511430, 6180995, 19654308, -13617194, +-4808753, 12566537, 18737332, 16305843, 9622874, 4588636, -4056597, 1234266, -2397129, 69793, +6470905, -24522652, 13147432, -1934883, 3536906, -1622961, 18584860, -5683853, -313533, -4085588, +11770895, 10024454, -20958904, 15007153, -17835388, -901406, -9065065, -8952322, 8085276, 1484448, +-27783070, -2459406, -2231236, -5119601, -3273302, -652298, -3585761, 14412300, 1372779, 13786845, +-4405563, 16302622, 7645042, -8419210, 3540664, -2102387, 889058, 1060320, 1489817, 2200634, +791885, -3157338, -5269925, 8112657, 3546032, 6659884, 1807108, -3955128, 7608535, 304406, +351114, 5780489, -16229608, -7494181, -7241315, 2279554, -270583, -10982768, 423591, 1854352, +-561030, -2055679, -81604, 3787088, -4072166, -151398, 4326106, 2194728, 5283884, -4651450, +-2339147, 1342177, 5737003, 21943524, -24479702, -593242, -13928042, -39230232, -4667019, -14498199, +-30972620, 6153078, -232465, -6043019, 1912334, 16598438, -1108638, -17605608, 5998996, 680752, +-5681705, -4257387, -3167539, 860067, 19128710, -4329327, -739271, 8672613, 6396817, -2786897, +9244917, 8463770, -4126390, -4052302, -7733089, 10635950, -2583423, -18387828, 2769180, -1242856, +6274411, 24034100, -16095390, -25787520, -16282758, -7549479, 3526705, 8569533, 4531728, 18290118, +9116605, -12931610, -7489886, -17629768, 15206869, 9356049, 1658931, 3214246, -10138807, 1042603, +-10725607, 18440442, 18077518, 1271847, -8478802, -4714264, 1749662, 16786342, 33503966, 20623360, +-3214783, -7512972, 423591, 10658498, 4595615, 9836549, 13550622, -13481365, -668404, -25984016, +-17541720, -16702591, -11220602, 6967511, 15901043, 10937671, 1693291, -3191698, -1535451, -14470819, +-18216030, -4603131, -9698036, -9121974, 2044941, -1858647, -2365990, 84826, 541166, 4138201, +-4672388, 9275519, -9483825, 3976603, -12059731, -4039417, -67646, 2214056, -406411, 2101850, +4553739, -3271691, 491774, 11025181, 13424457, 16210280, 8852464, 10150618, 4547297, 1923609, +704375, 278099, 558883, -2847563, -8816494, -8594230, -1481227, 6662568, -64425, 1019518, +-3643743, -2557116, 968515, 8155069, 5087389, 9734543, 7824357, 6975564, 8409009, -19132468, +-2240899, -9904195, 14416058, -15895674, 3092377, 1403917, 28186796, -17420924, -5097053, -17918604, +-3867618, -17699560, -14870251, -10733123, 5563057, -19040126, -13807246, -20705500, -5279589, -3113315, +-6328098, -9356586, -23072028, 6034966, -16305843, 6594923, -17108466, 21098490, 3258807, 9455907, +-4063576, -19903952, 10671383, 6171868, -6689949, 10654740, 14919106, -8062191, -21435644, -11487964, +28752658, -12285754, -928787, 737124, -4867809, 6314676, 18638010, 3301219, 7932268, -6004365, +13335873, 181462, 10506564, 3193845, 3571802, -331786, 1083942, 22784264, 6915434, 54556824, +-33298882, 21254720, 29908542, -7909719, 687195, 15413564, -11172284, -3286187, 25041270, 9906342, +-4170950, 13275207, -5685463, -24260122, -17934172, 6069863, 976031, -32411434, -9015673, -3330747, +-16825534, 8625368, 5040681, -10959146, -8960376, -6628745, 943819, 2956011, 6851547, -5713380, +800475, 3974455, -1801202, -7232725, 1976759, 1477469, 2258079, 6700686, 1186485, -4141422, +530965, 7763691, 6901476, 3321084, -7763691, -215285, 14228153, -4116726, -3032784, 7855495, +-7769059, -13456669, -3851512, 673773, -1778117, -6942278, -2153926, -482647, -7630547, -1646046, +764504, -2182917, -7926362, -13066364, 4879083, 13872744, 4989679, -383326, 437013, -2713346, +-8335458, -6707129, 30298310, 33864744, 431644, 24432458, 24334748, -1395328, 10935524, -24574192, +-7638063, 21674552, 2034741, 21399674, 29972966, 24671366, -4996658, 16084116, -25166360, -39244188, +-16803522, -14708116, 9421548, 26307, 10082436, 10892037, 23600846, 18247168, 6354404, -18734648, +-2293513, 18649284, 5996848, -9217000, 12009265, 25730612, -2919504, 8927090, -21049098, 10024454, +-16620987, -4547834, -10559714, -21857626, 13354664, 1463510, 6502581, 26064546, -14144401, -15924128, +9401147, 27009438, -21287468, -14275398, 8769249, -6915434, 38191388, 28242632, -26922466, -10206990, +-21290690, 1087164, 23285702, -10875931, -16230681, -7442105, 1394254, 5557151, -19423452, 4581657, +38919920, 2760053, -26091926, -39840652, 32052804, -38435124, -32258426, -18911814, -16523813, -27830852, +7356742, 6971269, 44560824, 11076721, 19545860, -9946071, 21258478, -2701535, -9216463, 7962333, +883153, -2157147, 21799106, 2687576, 11100343, 13835700, 7434589, 16608102, -4866735, 4409858, +-3738769, -1465658, -3721052, -14172855, -10518912, -11723113, 13259101, 4656282, 11793443, 14638859, +-3384971, 8726300, 19011672, 6775848, -6318971, 9757092, 11355357, 3830037, -2831457, -14003741, +-12601971, 12295954, 5114769, 8142185, 16216723, 36195300, 15479599, 9046812, 6528887, 10164040, +-5564667, -1320703, 18161270, -11880416, -14530948, -2930778, 6907381, -6333466, 6547141, 3888556, +-35296040, -20395726, -26501558, 7192997, 14959371, 5339718, 22877144, 20519206, 28975996, 9059160, +31629212, 14156749, 20478940, -9879499, -3753265, -9931575, -24060406, -17309792, -37315212, -22164716, +-7020661, -21776558, 5019743, -766115, -371515, 9044127, 7573638, 3486440, 18366890, -4483946, +-14838038, 21807160, 2228551, -28678570, -12173011, -3038153, -34319472, -26156350, -25251186, 2422899, +12566537, 3402151, -13015362, -1618666, 14703284, 8947491, 34656628, 6460168, -45978700, -15373299, +-7719130, 7422241, 7507066, -5285494, -11976516, 17165374, -25318832, -4730370, -20233590, 15584826, +-40053256, -24995636, -32598802, -26440356, 1594507, -14912126, -11179263, -26540214, 13697724, 47670916, +-878321, 30804580, -16740172, 7535520, -22269406, -124017, 34339336, 8056285, -15669651, 1752884, +13465796, -22993644, -35128536, -19192062, 9493488, -27709518, 12291123, -490163, -343597, 17645336, +9692131, -4834523, 21024402, 20388746, 16902844, -5527086, -5203353, -3721052, 223338, 14148159, +10748693, 7065758, 853625, 14739791, 8758512, 2126009, 2467459, 10856067, -4077535, -3968013, +8216273, -11680164, 10915123, -10184441, -9256191, -11959873, 21121038, 12553116, 19685982, 6735583, +7798587, 1421097, 1952063, 9046812, -13706314, -23378580, 2454037, 6127845, 6425271, 8456791, +-1496259, -9281424, 26570816, 10942503, 26805428, -43408696, 19020262, 32825362, -3042984, 37787124, +-19826642, -57363584, -29601988, -293668, -5590437, 6447820, -20443508, 19964618, 28229210, -25186762, +22455162, -13757317, -16799764, -40042516, -16232292, -22975390, -15072651, -18362058, 18260590, 2783139, +-35801236, -45967424, 34947612, 7946763, 12635257, -10692321, 2955474, -12389907, 499827, 10650445, +16222628, 14616847, 39122320, 1316944, -27777164, 37845104, -3823058, -9752260, -17363480, 16006269, +-30899068, -20813412, 17818208, -16106664, -24023362, -30325690, -26432840, -5631776, 3747896, 2932389, +-8027831, 32811940, 28080496, -2639794, -15702400, -27343372, -31242666, 7808788, 6832756, -6138582, +-2866891, 45015016, 3240016, -13074954, 19637664, 9377524, -29425358, 23626078, 43010340, -46881180, +76025752, 20297478, 22106734, 8351564, 22264574, -5978058, -46582140, 32101660, 2957085, -5776194, +33541548, -39483636, 7151121, 6985228, 8590, -3782793, 1897302, -3049427, -10688563, 5867462, +11927124, -9701257, -1009317, -14367739, -16274705, 21453362, -4501663, -10486163, 5158793, -5708012, +-12895639, -23803782, -5229123, -8079371, 21104932, -19972672, -1769527, 24576876, -4949413, 19641422, +-6757594, -17152488, 9186398, -3450469, -7897908, 10171556, 2665027, 27062052, -3351685, -413927, +17643726, 54181012, 23703924, 1108102, -18360986, 25803090, -600222, 1724966, -12633646, 23539106, +-27655832, 19917910, 19108846, 20178294, 9655086, -7581154, 26759794, 33652680, -7069516, 13831942, +-21122650, 33866892, 14325863, 11261404, -21854942, -47486232, 9260486, -14619532, -11005854, -19318762, +-24408836, 14552423, 6388764, -11854110, 2528125, 1066226, -12983686, -57979376, -3796751, -12360916, +-6124624, -950798, 40628244, 27808840, -13796509, 10465225, -27078696, 2952790, 19934554, -30774514, +-28698972, -23480586, 36751500, -26600344, 7489349, 29620778, -40189620, -37197640, 34019364, 27174258, +28523952, 38330436, 13989782, -49149460, 10870562, 14473503, -4548907, 80142480, -8503498, -12254615, +-36451924, -31370978, 15950435, -28916942, 18608482, 6517613, 21074330, 43889732, -28403156, -19259708, +53265112, -32613298, -36197984, 23477902, -46559056, 33668248, -35458712, 8001524, 11886859, -25537876, +10351945, -29640644, 20380694, 37765648, -1781338, 6541235, 7524246, 1389959, -11787001, -10894185, +-2718714, 10947335, -5123359, 7387881, -7917236, -23430120, 9795210, 2078227, 15680926, 7907572, +13659070, -4728759, -4898410, -23214836, 16051367, -3110630, -21476448, 4993437, 43420508, 12124693, +-11424076, 12894566, 23256712, -11599096, 2301029, 18107582, -9332964, 18064632, 5833640, -5553930, +-28382218, 4871567, -11026792, -569620, 34744136, -15888695, 1556926, 6890738, 4803384, -9893457, +11570642, 39775156, 2896956, -34773664, 48527760, 11450383, -3736085, 34481072, 16837882, 27814746, +10081899, -42438036, -9718974, -16131897, 19287624, 48526152, -31511638, 7495255, -15380815, 21392158, +24557012, -33425046, 27074400, -26919782, -24360518, 11754252, 22194780, 588411, 7035694, 17303350, +-27237608, 23240604, 1357210, 28449326, -5607080, -7964480, 8898098, 42309724, -19649476, 34119756, +-17176648, 6605660, 8516383, 34103652, -2522757, -2573759, 11353746, 51582556, 2922188, -40910636, +-3797288, -49182744, 28841242, -215285, 79594336, 16830904, -23920284, -7421704, 17202954, -18035642, +27624692, 51960516, 35281544, 478352, 14700062, 22337588, -3089692, -24628954, -3857418, -5834176, +-84131968, 51832204, 38377680, 35583268, 8140037, -36517960, -11368778, 27010512, 13615583, 23487566, +12283606, -80371184, -29169808, 48875116, 12971338, 15578920, 41791644, -30296162, -1543504, -4520990, +23417236, 5761162, -2950643, -6839199, 18323404, -5268315, -22443888, 10526428, -11140608, -12836584, +10734197, 16322486, -12905303, -4161823, -1064078, 12813498, -17428440, 13327820, -15474230, 6693170, +-26298084, -26572426, 25413322, 3077344, 1660542, -3320010, -19607600, -6141267, 16797618, 1573569, +5277441, 28742458, -5151277, -22346714, -2780991, -12826383, 9249212, 10578504, -11162083, -9196599, +10788958, 23767812, 29756070, -1234803, 31532040, -19452980, 32090386, -29314762, 4984847, 15346992, +-15029701, 2156074, 6077379, -8025147, -15684684, -29677150, 45252312, -10146860, -8836358, -15101105, +-2459406, -6255620, 14766634, -30426622, -8682276, -19060528, 6615324, -19166828, 18446348, -179315, +9557376, -21143050, -38308424, 1748052, -27966680, -29406030, 13407277, -22580254, -18917184, 37042484, +-13606993, -21800180, 2921115, -22419730, 10621991, 13916231, -3931506, -18343268, -5159330, 10510322, +9523553, -8415452, -608812, 32605244, -5650567, -20344724, -25472378, -3839164, -11052025, -38788388, +36455684, 12373801, -44147968, 27145804, -1753420, -18778134, 85541256, 47860968, 39517996, 20658256, +12232067, -20453708, 3408057, 9175661, 10312753, 3602404, 37622304, 8144332, -10807748, -18633716, +-75187160, 15155329, 10208064, -624918, -14430016, -28691456, -5311801, -18585398, -16081431, -1461900, +24154896, -16626892, 41558640, 5746666, -7884486, -3195456, -3160022, 2966749, 17702782, -7057705, +4714801, 11840151, 4574140, 1999307, 9870372, -15731928, 7872138, 2411087, 24520506, -8752606, +-5616207, -7016903, -5674726, -19537806, -10004053, 6588480, -20477330, 15188615, -3789772, -10398116, +14816563, 8706972, 12541841, -4945655, -1430761, 1160715, 2778307, -13670881, 7419019, 484794, +-130997, -1661616, 9127879, 4320737, -39349952, 65700116, 8141111, 21354578, 11521250, -16622597, +12000675, 18316962, 4365835, -2153926, -16209207, -3055332, 4235912, -7713762, -5925981, 2509335, +7143605, 18935974, -13554917, 7818451, 519154, 15064598, -5671505, 2783676, 4785131, -17844516, +14046154, 2069101, 3281892, 4889821, 5025649, -11395085, 11627550, -9854802, 2174864, 11143830, +-6461242, 10922639, -5081483, 13831405, 10652593, 6110665, -17710298, 12814035, 9648107, 7708930, +21481816, -21136070, -2093797, -417149, -4712116, 6172942, -11069204, -17544404, 11617350, 13218836, +6473053, -1875290, 2587718, -2079301, 6723772, -6290517, 2570538, -13077102, 11443940, -20184198, +18589692, 10311143, -6600828, -488553, 7560753, 351114, 6749004, -63888, 525597, -874026, +-7046431, 9477919, 12847858, -11771432, -2931852, 2224793, 7006703, -5451924, -5789079, 1338419, +2121177, -1505923, 1039919, -4441533, 1330903, 5216238, -4482872, 970663, 2900177, -4537096, +3453154, 4555887, -714575, -1696512, -2535641, 752156, 9516037, -3855270, 983548, -9259949, +254477, 9940165, -7438347, 7363185, -3767760, 422517, 16423418, -3076270, 31675, -492311, +-5461051, 8524436, 3240553, 3590056, 3239479, -2858301, 1925219, 9366787, -3077881, 6346351, +-4525822, -821949, 12642773, -52740052, -122714728, -19705310, 71701792, 65058016, 160388576, 83687976, +-43239584, -13376139, -88902600, -150936960, -10461467, -68659888, -9595494, 109775072, 46888696, 84780504, +130302328, -15292231, -19128710, -66337916, -112613504, -89646704, -5797669, -33772940, -12768401, 93390304, +29640106, 60695404, 110547624, 17965312, -465467, 11294153, -67262408, -101979704, 17486422, -105378632, +-68840808, 23192286, -10584410, 16939352, 135420848, 15369540, 51917028, 110402136, -22025130, 3255585, +24663850, -106780400, -88888104, -31686658, -121310816, -47176996, 15475841, 22253836, 83580064, 117504400, +83919368, 59023588, 51620140, -19805704, -71042520, -58565100, -87835304, -92522184, -39539468, -23601920, +652298, 77263776, 92465280, 28722594, 72266048, 20849918, -22821846, 14979235, -50291384, -70203384, +-13643500, -32733556, -21699248, 39222180, -1404454, 27280558, 49131204, -13698798, -1013612, -236223, +-24768540, -7889318, -1636919, -18868866, 20863878, 7287486, -4755066, 33705292, 10920491, -5118528, +32725504, -11718818, -34867080, 432718, -53312356, -37652368, 11656541, -35811436, 7718593, 40913860, +30391188, 55863564, 61351460, 22018150, 21781926, -2854006, -50337016, -70839040, -72449120, -76120240, +-48037060, -3928821, 24492588, 52068964, 91118808, 97281544, 81201192, 63106492, -3610457, -59942712, +-85295904, -109619376, -111293344, -59787556, -17729624, 46332496, 98919536, 89058832, 54117660, 39574904, +11865921, -8658654, -13118441, -39715024, -45245868, -34539052, -28333900, -20845624, -3913252, 3833795, +16726213, 24142548, 25353192, 23786602, 22161494, 10681047, 805306, -8604430, -12870406, -19087908, +-18429168, -14185740, -7497939, -3231963, 3518115, 6052146, 8740795, 6889665, 5964636, 4750234, +4688494, 1338956, 1243930, 1018981, 423054, -2266132, -659814, -3400540, -6561100, -7131257, +-6762963, -6407555, -265751, 1012002, 3613141, 7634841, 9371619, 8734890, 7911867, 2665027, +-877247, -5407901, -8227010, -9317932, -7037304, -5051419, -1835562, 1433445, 4271345, 4689031, +5375152, 4203699, 2879239, 1453846, -31139, -2088965, -1560147, -2231773, -1773822, -1399086, +-1402307, -683974, 300648, -1142461, -682363, -148176, 590558, 1393180, 1385664, 1470489, +2398739, 1546188, 823560, -73014, -1124745, -1881196, -1870458, -2114198, -1498407, -860067, +-192200, 445603, 1000727, 1009854, 1067836, 875636, 597537, 151398, -43487, -292595, +-419833, -466004, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -4391067, -4664335, 1187559, -2494302, -1096290, -5590437, -1477469, 4733591, -2462627, -1784559, 1475858, --703301, -151398, 329102, -1475321, -1174137, 5728950, 2807298, -668941, 312996, -823023, --1668595, 810675, 2073396, 3163244, -766115, 1225139, 1484985, -5024575, -1511829, 13959, --965294, 3120294, 319438, -1039382, 2825552, -2102387, 980326, 4348655, -2360622, 296890, -618475, 3306051, -1226213, 4551592, -6383932, -2323577, 2834679, -1253594, -5404143, 409096, -1133871, 1830730, 1903207, -571231, -2304787, 218506, -2087891, -1430761, 674847, 2711198, -2522220, -3613678, 3234110, -3956202, 3587372, 216896, 3150896, -1197759, -2536178, -1127966, -2131915, -391379, -489089, -617402, 2937221, -3111167, 1646046, 773631, 819265, 1000727, -2357937, 750009, -1452773, -1677722, -892816, 1269700, -234613, -1230508, 277025, -1487132, --290984, -98784, -1486059, -605054, -819265, 205622, 863288, -1025960, -699006, 430034, --168577, -1469416, 27917, 805843, -529892, -71941, 345208, -134755, 622233, 421444, -88584, -1111323, -325881, 41876, -457414, 30602, -75162, -779537, 486405, -1321239, --212064, -15295989, 5012227, -5564667, -2221572, -4557497, -4678830, 2648384, -1565516, -3952981, --2126546, 5358509, 7968775, -4369593, -1630477, -395137, -5750961, -5405753, 397821, -553514, -3502546, 1174674, 2607045, -2310693, -1447941, -2991445, 833761, 5139465, 2228551, 992137, --3325379, 2508261, 754304, 1531693, -2173254, 182536, 754304, 1147293, -2950106, -2162516, -799401, -4073240, -4160750, 1772748, 3144990, -3552475, -1788854, -1376000, 248571, 3131568, -2526515, 1085553, 470836, 8114267, 3184182, -2576981, 3156801, 2242510, -2263985, 3827353, --1437203, -974421, -27917, -1685238, 3404299, -1932735, 889058, 2043868, 1640678, -3048890, -1188632, 554051, 607201, -1074816, -1512902, -645319, 4757750, 303869, -1420024, -1035624, -1116692, -4301947, 822486, 2538863, -173946, 1638530, -952409, -1560147, 1028108, 928787, --408022, 1591285, 819265, -474594, 1131724, 1177895, 1987496, 243203, -2147, -158377, --610422, -866510, -95563, -170188, -541166, 569620, -199716, 1958505, 11601780, 4604742, --843961, 493384, 2632815, 1359894, -820339, -5062156, 129386, 4427038, -4610111, -545998, --8622684, 2219961, 3464428, 198642, -2079301, 6244346, 4380867, -4080756, 1921998, 202937, --3582003, 5568425, 3055332, -399969, 2229088, 5303748, -1689533, -1138166, 322659, -3221, -93416, 1247151, 6521908, 1285269, 943819, -10635413, -595390, 447213, 1231582, -4832375, -1075352, -3905199, -3005403, -4128537, -2709588, -11811, 1195612, -2537252, 2464238, -6126771, --3534221, -408559, -117038, 1916629, -2477123, -605590, -2246805, 1285806, 3260954, -2032056, -317291, -1764695, -351650, 5075578, 3967476, -1653026, 3715684, -1836635, -3238942, -4036733, --339302, -410169, -2735894, 2397666, -468151, 656056, -338766, -927713, 142808, -614180, --2226941, -178241, -3524558, 353798, -1757179, -1160715, -2968359, 3354906, -1083406, 1117228, -2276870, 878321, -1224066, -315143, -1370095, -137976, 540629, -1347009, 1303523, -151934, -102542, 151934, -525060, 749472, 413927, 206695, 53687, 1876364, 875100, -662499, --1355599, -1236414, 1111323, 1516660, -54761, 353261, 1461363, 193274, 18290118, -8063801, -1437203, -744103, -3461207, 2844879, 5075041, -3415573, 5461588, -377420, 5830418, 1563905, -2011118, -2617246, 3273302, 1220845, 3353296, -7298223, 3797825, -4345433, 1264331, -3660923, -4460324, -1310502, 4493610, -2756832, 1608465, -1832340, -469225, -274878, -533650, 1722282, -9417253, 346819, 2713346, -2699924, -4471598, 112743, 12348, 113280, 1371705, -3121368, -6152004, -468151, 5145908, 290984, -2329483, -2927020, -7901129, 3773666, 2477659, -3732864, -335544, 3064996, 1594507, -9190693, 5373004, -379568, 3798362, -5549098, -5970005, -2934537, --5816997, -1126355, 6565932, 1309428, -2617246, 324807, 3681861, -1334661, -3088082, -1637456, --3454228, 2348810, -5199058, -973884, -4006668, -1573569, -92342, 4338454, 1998770, 413391, -1302449, 5464809, 2834679, 608275, 1949915, -1633161, -690953, 302258, 27380, 816581, -388158, -1021665, 467078, 1885491, -210990, 354335, 653372, -1010391, -1352915, 1158567, --1604707, 1750199, 998580, 1616518, -35970, -710817, 958315, 1599875, 359704, -759136, -468688, -114890, 4755603, -11307575, 2250563, -3597035, -10333691, -7978439, 4172561, 4654134, -6145562, -3111704, -1634772, 4211753, 1993939, 6317360, 2032056, -760746, 610959, 4013110, -7878581, -2079301, 2268280, -149250, 6376953, 1423245, -430570, -1340567, -4933844, -7499013, -43487, -1125281, 2201171, -477278, 1716913, 1248225, 418759, 420907, 1447404, -2599529, -250719, 3482682, 5504538, -2769180, 624918, -2447595, -3214783, 4515621, -3543885, -8805757, --3470334, -2301566, 4171487, 288300, 4605816, 4175782, -2276333, 123480, -3658239, -569620, --1586454, 5363878, -6866579, -264677, 2276870, -7309498, -8178155, 57445, 2492155, 5092758, --3624953, -8692477, 4475893, -8026757, 9278203, 5185636, 1506997, 3893925, -117575, -3904125, -11802570, -1150514, 5701032, -293668, 8249559, 5611375, 3002719, -919660, -1633698, -2852932, --1043140, 1171989, 279710, 2206540, -2358474, 1343788, -1261647, -928787, -897111, -1038845, -1104344, -678605, -38118, -1837172, -97711, 996432, 1978369, -2091112, -2467996, 258235, -1069447, -104690, 1289027, -821949, 138513, -1051193, -324270, 584116, 1218697, 1418950, -891743, -1286343, -1801739, -24828132, 5218922, 1346472, -12427488, -15704548, -2454574, -12104828, -9996000, 2925410, -7265474, 546535, -3336653, 1189706, -4934381, 730144, -203474, 146029, -7070053, -2409477, -1546725, -2826089, -2488397, -6501507, -4335770, 6700149, -2647847, 4269735, --3599720, 1898376, 193274, 3867081, -3762928, 2950643, -3780645, 1774358, -1396401, -2320893, -2473364, -6070400, 2449205, -3046206, -1045825, -4387309, 10903311, 5242545, 9570261, -3953518, -4083440, 3313031, -1801739, 1781875, -4411469, 4861366, 10486163, 8319889, -5647345, -1439888, -2519535, -4052302, -2704219, -7166690, -13508746, -4513474, 7052337, 2604361, -3271691, 1477469, -797253, -3604551, -6373732, -6417218, 4715874, 640487, -9907953, 1164473, 1046898, -386547, --664646, 3418257, 7326678, -633508, 74088, 1119376, 75162, -1798518, -6523519, 2294050, -2308545, 1467268, 3168075, 1977833, -2745021, 838056, -1698123, 478889, -1423782, -496606, --1584306, 154082, 455267, -88584, -1124745, -1059246, -273804, 627065, 40802, 2541547, -948114, 2379949, 2532957, 2770254, -3103114, -3117073, -1132261, 2554432, -750009, 1010928, --872952, 1463510, 1491427, 1029182, -1472637, -758599, -9820443, -4126390, -2596845, 7315403, --2008434, 1695438, -7666517, -7990787, 336081, 2250026, -4704600, -2712272, -4418448, 8983998, -1935420, -3074123, -6647536, -6548215, -6415608, -1812476, 3000035, 9029095, 2887829, 5085778, --4127464, 9620727, 5462125, 1741609, 54224, 9898289, -5858873, 913217, 3092377, 6693170, --10933376, -5565204, 4693326, 1887101, -1555315, 11317776, -5010080, 3189013, 6788196, 2109903, -1098438, 4982699, 1979980, 2474438, 2494839, 1074816, 2882997, -175020, 4271345, -1008244, -10546829, -7709467, 8670465, 6928319, -6088116, 6862821, 1218160, 5834176, 5852430, -12954695, --392990, -516470, -3951907, 2076617, -3570192, 3597035, -1522566, 8267812, -951335, 1305670, -3336653, 2330020, 3227668, -5259725, -1818919, -5374078, -5039071, -2850248, 7970386, 1210644, --2604361, 2383170, 2161979, 1036161, -1401233, 852014, -1005559, 3178813, 1151051, 1022202, --1576790, 994285, -3058017, -256624, 3455838, 1847373, -614180, 1188632, 1195075, -954020, -1431298, 1021129, 3351685, 1900523, -1935420, -719407, -1166621, 1069984, -3064996, 916976, -1617592, 1050120, -492311, -116501, -312996, 12948790, -3466576, -2046015, -3219078, 9214315, -4817343, 957241, 3489124, -6283537, 13787382, 4551592, -1132261, 5191542, 6636798, -11316165, --800475, 2646237, 1276142, -40265, 9507984, -4617627, -5847598, 13123809, 1939715, -955630, --1356136, 6848862, 476741, -1018444, -1340567, -3211562, 3374234, -1997697, 4516695, 3197603, --8337606, -7866233, 928787, 15503758, -240518, 3153043, -9630927, 4712653, 6315213, -3974455, -4665945, 5851893, -9767829, -5937256, -1281511, -12445205, -6663105, -7431367, 2117956, -2552821, --2824478, -1373316, 8677445, -11997454, 5228586, 2600066, -3960497, 7315940, -4758287, 699543, --10145250, -214212, 6014565, 5469641, 11386495, -13548474, -3445638, -15040439, -3308736, -306553, --3661460, 1685775, -820339, 13682155, 10536092, 6012954, -6898791, 349503, 2533494, 6669548, -8116952, -187368, -58519, -1167694, 77846, 4668630, -325344, -402116, -288837, 85899, -132607, 570157, 1791001, -1923609, -712428, 1956358, 217970, 1808718, -173409, 206158, --1685238, 2483028, 1413581, 39728, 2211371, -1171452, -267362, 2183454, 462246, -360777, --2818572, -168577, 482647, 406948, -1088774, 2801393, 4539781, -833761, -261456, -2084133, -1409823, 8769249, -10027675, 240518, -6179921, 16931298, -7282117, -4216584, 14661945, 11037529, -1971927, -20656108, -5105643, 9382893, 678068, -1069447, -3018825, -1701344, -1693828, 1357747, -3096672, 2827162, 2674691, 18149458, -3893925, -2723546, -75162, 2302103, -5523865, 3126199, -1845225, -758062, -6070937, -3836480, 6493454, 6972343, 13255343, 3335042, -5582921, 3295851, --261993, 3342022, 158377, 7329362, -6260452, -9280351, -9577777, 6136972, -2796024, 1223529, -2379949, -3466039, -721018, 15765751, 5317170, -13436268, 9411347, 2962991, 15946140, -8414378, --7956964, 4568772, 8540006, 5894843, 3230352, -1546188, 407485, 4057670, -5323612, -1569274, -73551, 6743099, -5036386, 13615583, -594316, -253940, -7175280, -8041253, 15543487, 4586488, --12942347, -3068754, 10681584, 7416335, 1387274, 2646237, -6641093, 1984812, 1636383, 2042794, -1090385, 2275259, -3110630, -3712462, 383863, -170188, -3117073, -1057636, 2698850, 2695092, --4133369, 1009854, -104690, 1702955, 2313914, -725850, -806380, -1045825, 1530082, 4759898, --3580929, 2600066, -322659, 67109, -2138894, -526134, -1616518, -1077500, 2209224, -845572, --1436667, -3172370, -203474, -1816234, -12150999, -10302553, -3977677, 3834869, 3935264, 18884434, -18333604, -2076080, 1525250, 861141, 186831, -155693, -3732864, -12221329, -9366250, -4810900, -4392141, -3372086, -10630581, -2974802, 2075006, -742493, -16322486, -4762582, 3670050, -1625645, -1595580, 1178432, 4964982, 7254200, 1211718, -5175436, 5358509, 5583458, 3937411, -170188, -7217693, -14307610, 4855461, -12671764, 15897285, -11202348, 4376572, -11889006, -1934346, -13288629, --7002944, -8264591, -8948027, 6213207, -7863012, -1481764, 2828236, -55298, -4169876, -2991982, --1337346, -12998719, 475131, 897648, 6517613, -20317880, 528281, -485868, 9546102, 11460046, --7704635, -4720169, 480499, 8813273, -16787954, 10829223, -7522099, -4968204, 871878, -16345035, --798864, -1288490, -2515777, -2893734, -1999844, 16464220, 6747931, 3409667, -3888556, -3658775, --4071092, 545998, 4078072, -6550362, -134755, -1116155, -1726577, 907312, 4898947, -1781338, --3067681, 3099356, 1928977, -39192, 3454228, 1870458, 2901787, -1713155, -2165201, 4158602, --2942590, 1088774, -3871376, -724776, 220117, -771484, -1440962, -3434900, -3760781, -4012036, -1021665, -196495, -835371, -2886218, -2707440, -1101122, -1406602, 933082, 4152697, -1070521, -3189550, -9531606, -25071334, -9928354, -4660577, 4534412, 6945499, -8129836, -2996277, -10262287, --9047885, 4982699, -7934952, 8450885, 3511673, 6110128, -871342, -8043400, 14420353, 5820218, -8126078, -10086731, 4449586, 2003065, -14788646, 9346386, 5623186, 681289, -10040560, -3771518, -5100274, 5441187, -151398, 1963337, 7312719, -6945499, -5146445, 8642548, -16887812, -16604880, --21915070, -4811437, 7137699, -19178640, -16043850, -9649718, 381715, 7067906, 2270964, 2080912, -386547, -5463199, -7652558, -18105434, 9666361, 2836826, 22137872, -5163088, 620623, -13558675, --16322486, 2200097, 10600516, 849330, -10291279, 6934225, 2789045, 15185931, 1503775, 2017561, --7269769, -1261647, 6405407, -14654428, -27590870, -7573101, -6881612, 1613834, 7267622, -13095892, --6684580, 4440460, -4612795, -944356, 4323422, -2426657, -2215666, 5813238, 1402844, -380641, -2802466, 4546760, 4929549, 1074816, -3307125, -8645232, -805306, -5222680, 1450625, 1107028, -1119376, 3774740, -3149822, 3444027, 4519380, 3164317, 2554969, 2675765, -6512781, -5819681, --2263985, -4992900, 564251, 1605781, 1717450, 6241125, -1442572, 4020090, 2371359, -2421825, --1340567, -3590593, -5059472, -1227287, -6664716, -2014340, -1513439, -23601920, -18136574, -8348343, -12462921, -1093069, 21340082, 4207458, -1839320, -11985106, 4271882, 21969294, -22999550, -20730734, --6832756, -3460670, -14418205, 13654238, 4018479, 7387881, 8864276, -14477798, -1707250, 5776731, --9094056, 17026860, 263604, 3808562, -4951024, 4180614, -11256036, -6459094, -3860639, 6381248, -3058017, 10333691, -16979616, 1487132, -118648, -12698071, 13836237, -8302709, -20205136, 3956739, -7296613, 1430224, -6027450, -1510755, -8409009, 1345935, 6899328, 2884071, -13808320, 5366562, --3139084, -15398531, -9062381, -18909130, 430034, -2988760, -491774, 2393371, 11579769, 14324790, -11971684, -6175626, -10424422, 3391951, -2646774, -1816771, -8056822, 14902463, 12372727, -2717641, -22986128, -14720464, 7668664, 14427332, 15607374, 356482, 9924596, -6486475, -2526515, -12930536, --5437966, 7624641, -2612951, -10089415, 6255620, -5812165, 6572911, -3003256, -6832219, 3498788, --1348083, -3987877, -2973191, 2546916, -3317862, 2211371, 4642860, -4944581, 6294275, -847719, --3402688, 2263448, 770947, 326954, -2823941, 3592203, -5565741, 1826972, 2121714, 155693, --3707631, -470836, -2190970, 2760590, 5219996, 11176579, 5734855, 8910983, -427886, -163209, -4653597, -5819144, 1578937, -7868917, -3128347, 1632088, -77846, 8629126, -20440824, 2600066, -248571, -12920872, 1893007, -28755342, -24869472, -5946382, -209380, 1081795, -617402, -10217727, --348966, -2915746, 9210020, 1803886, -570157, 1735704, -21721260, 7521562, 4065187, 12070469, -5016522, 5232881, 14181445, 7065758, 2063195, 35459788, 7596187, 13647259, 18824842, 886374, -13280576, 3331284, -7354595, 8621073, 623844, 4153770, -7202660, 544387, -4668093, 3012920, --4653060, 9978283, 1216013, -6199249, -7739531, 1073205, -21021718, 12233677, 8265665, -1066763, --1889786, 4811437, -5576478, -4634807, -6885907, -8326868, 6970732, -6641630, 11508365, 13378286, -13122199, 13944685, -3218004, -21117818, 355409, 8921721, 21322902, -4937065, -765578, 10098542, -14898705, 21927956, -2822331, 9663676, -6467147, -3754338, -17592722, -13731010, -5982353, -6228240, --5009006, 3684008, 786516, -7547868, 8579734, 5405753, 6747931, 12062953, 4849555, 4526359, --1412507, 22549, -1757715, -3442416, 129386, 2183991, 38118, 6371047, 5112085, 3119757, --334471, -5207648, 332323, -3736622, -4122095, 2666101, 3256659, 979253, -6470905, -1452236, --9424232, -2290291, 3118146, 4695473, -2997887, 3906273, -5373004, -6272800, -3148211, -3776887, -3529390, 1831804, -5498095, -3788698, 4334696, 16988206, 22158810, -17118666, -17897666, -23526220, -20537460, -2530273, -8762270, 6920266, 6688338, 19213536, 15964393, 755377, 17536352, 25056840, -6925635, -13197361, 11870216, -12233677, -6960532, -2749316, -8625368, -10310069, 4948876, -5333276, --5237176, -12380243, 27333172, 3193845, -14928769, -256087, -2232846, 12104828, 12822088, 4907000, --8830990, 12931073, -3810710, 7890392, -25463788, 1084479, 10260677, -11063836, 3400004, -12001749, --9817758, 25817586, 10597295, 7624641, -2043331, -23314694, -5830955, 6449431, 4751845, 3503620, --5695127, 18134962, -13133473, 9974525, -6289443, 6520297, 7216619, 14320495, 19439022, -23066658, --821413, 11509975, 5478768, 16271484, 15773804, -23003308, -164283, -6534793, -12030740, -973884, --12572443, 4844723, 9221832, -4836670, 16893716, -4092567, -10469520, -12660490, 10424959, 12000139, -11942157, -3592203, 1880122, -952409, -17923972, -17355426, -16294569, 9685151, 4747013, 2918430, -7730941, -791348, -4727149, 11810623, 1398012, -345208, 7130720, 11428371, 6812355, 610422, -1010928, -3743601, 6835441, 3264712, 14686104, -1693828, 1529008, 10227391, 8244727, 2636573, --1780264, 6426345, -508954, -1699196, 11523397, -9782862, 205085, 6984154, 274341, -2509872, --3869766, -2132451, -335544, 7553774, 1170379, 233539, 8367670, 5995238, -5920613, 9008694, --742493, 17474612, 34820372, 1487669, -16656957, 4702989, -11147051, 7209640, -9693204, -10420664, -31601296, -23994908, 39680664, 24334210, -5879810, 8026220, 19164680, 2810519, -29950954, 11790759, --24259050, 5810554, 2144799, -11931419, 498753, -1585380, 17303350, -8614094, -882616, -614180, --5284421, 36644124, -2116345, -5440650, 4700842, 12383464, -12484396, -26266946, 20763482, -3259880, --1603633, 23752780, -13944148, -3784403, -16599512, 4507568, -11606075, 13451301, 12321724, 25283398, --7241852, 7124814, 16824460, -23817204, 2913599, -15144592, -24067386, -30656402, -16190416, -33152316, --37402184, -5141076, 2401961, -17501992, -18950470, 11818676, -1347009, -10524280, -20430086, 14823543, --10924249, 3932580, 18493592, -34799972, -10095321, -6311455, 15467788, 41845328, -19776176, 1320703, --12563316, -18415210, 8956617, -22057342, 17832704, 31222802, -8901857, -14421963, -15436112, -3774740, --3714073, 415001, 10065256, 7541963, -8226473, 8360154, -1065152, 6603512, 340913, -7427072, --2184528, 9240622, -15162845, 7230578, -7963406, 2211908, -6491843, -2355253, -9146670, 2202245, --8793946, -13475997, -6587406, 3349538, -10140955, 107911, 3004867, 15051176, -8663486, -4902169, -4860829, 6280853, -10819023, -6586869, 3019899, -2792266, -5790153, 10549513, 1780801, -8006356, -7228967, 2200097, -12628814, 2205466, -10137733, 11254425, -5009543, -16146393, -23897198, -18126372, -20149302, -16412681, 8167954, 19173270, 8227010, 12325482, -22778360, 32864016, 20702816, 17939004, --13154948, 23561116, -2527588, 15591805, 10277857, 3491272, 8537858, 11452530, 7012608, -3806415, --5796595, -5209259, 2428804, -15786152, -18592914, 10523207, 4694936, 6119792, -15280420, 4208531, -4733591, 11516955, 17190606, 25789668, -14487998, 3924526, 36719288, 7930120, 3999152, 3567507, --7486128, 2713883, 36567888, 10611254, 23712514, 6760816, -25222732, -10516227, -18346490, 53014392, -21607980, -20464982, -12752832, -18252000, 3168075, -11972221, -28715078, 6627672, -21725556, 32463510, --2193655, -26851598, 35451732, 28683402, 4182225, -7786776, 4930623, -16341814, 21878564, 38927436, --10314364, 18465138, 43622372, -6845641, -6976638, -4952634, 26605712, -1921461, -14515379, -13733158, --13853954, -231928, -1603633, -12170327, 1091995, -5101885, 13479755, 3331821, -12712566, -8087961, --14494441, -1584306, 2127620, -2375117, -10108206, -11415486, -7984881, 7165079, 12189117, 1890859, --12406013, -1817845, 16103980, 132070, 14774687, 7697655, -8043937, -724776, -12566537, 12508019, -5750961, -16385300, -30698278, 2848637, -1822677, -9343701, 10319196, -65498, -5203890, -4379793, -3352759, 856309, -1029182, 9115531, -24970940, 10110890, -3297998, 25043954, -51946556, -35604204, -20760798, 9997073, 7610145, 17634062, -17621714, -23039816, -12603582, -18955302, 10940355, -20349556, -6131066, 13720273, 22494354, 863288, 18879602, 11020886, 3240553, -5854041, -19415936, -13703093, -11577084, -23834384, 12357158, 2926483, 20566450, 15669651, -7459285, -29699698, -19206020, -1699733, --1316944, -7782481, 20575040, -35932232, -2618320, 1352378, -37553584, -638340, -4469987, -2922725, -4216584, 22176526, -21345988, -59222768, 22318798, 24248312, 14587856, 46336256, -37901476, -4814659, -25881472, 19731080, -23719494, -11038603, -6410239, 36502928, 7356742, 34842384, -50130320, 7399692, --59836412, -35893040, -34610456, 41309532, 13258027, -26564372, 24407226, 2877091, -23159538, 23787140, --34737160, -36617816, 5665062, -38035156, 11483132, -65000036, 10116259, 20549808, -27515172, 30481920, --13626857, -7323456, 20551956, -7013145, -5412733, -14496588, -877784, 4803921, 11416560, -1335735, -10621991, 20511690, -15256261, -1692217, -12095165, 7294465, -7841000, -2143189, 4649302, 2508798, -2920578, -2723546, 21300354, -7034083, 1877438, 9013526, -18485540, -16443282, -17946520, -8472360, --30339112, -14048838, -10992969, 26229366, 5360119, 23334020, 10228465, 4667556, 10781979, 7347616, -1107028, 8784819, 2032056, 18249852, 44950052, 16610786, -16135655, -10553272, 6184216, -11461120, --13423383, -1633698, 20910048, -3674882, 3894999, -22293028, -4616016, 30690226, -22439594, 16955458, -40130028, 20023674, -1712081, -7710003, -13203803, -25720948, -18878528, 22065932, -12602508, 20700668, -14961519, 7066832, 983548, 8045011, -6394670, -32706176, -11316702, 23296976, 18521510, 19352048, --20642150, 35582732, -9162239, 13797582, -26331908, 24070070, 41555420, -8421894, -14775761, -1597191, -1544578, -9300752, 9098351, 18101676, -34057480, 22304838, 21725018, -5380521, 25182466, 13268228, -10882373, -16025597, 3322694, 22436372, -47496432, -42395084, -17601850, 11143293, -21848498, -64404644, -26989574, 17580912, -8313983, -10990284, 521839, -3849901, -22003654, -59170692, -3541201, 41887744, -10222022, -7543037, -4983773, 8986682, 34403760, 27292906, -40303972, -16724603, 26954678, -5779952, --10780368, -46201500, -2652679, 25220048, 8444443, -7184944, 15636902, -5883032, 1688996, -17457432, --2811593, 10485089, 15910169, -9102109, -3221762, 3180423, 9220758, -5768141, 5694590, 669478, --11227045, 6689412, 19344532, 3236795, 5810554, 3524021, 8762807, -9168681, -15887621, 1473174, -17292076, -14201309, 6245956, -4848481, 1603097, -13773960, -26331908, -14427869, 9891847, 32053878, --3217468, 15108621, -21206402, -9409736, -14315126, 8836895, 6314676, 10087268, -7185481, -11048266, --705448, 2275259, 2543158, -4990752, -1094143, 21876416, 28997472, 645856, -32695976, 43296492, --12164421, -30227442, 27084064, -4350802, -16445430, 20932060, 5602248, -4383014, 17657684, -24212342, -22961968, -8206609, 770947, -7041599, -6015102, -33754148, 13364864, -12885976, 5316633, -13532905, --1116692, -10089415, 9664750, -5911486, 36477696, 6444599, 23863912, -9286793, 5967320, 15083925, --6406481, 10424422, -2068027, 18219252, -915902, -6125697, 28806882, -25742960, 14361834, 19684908, --11556146, 22280142, -13641890, -558883, 11463805, -8722542, 26192858, 23450522, 4876399, 39027296, --24055038, -55116240, -9276592, -34080564, -22546968, 80483392, -2050847, 24689620, -3757560, -33973192, --875100, 33811056, 47887276, 29111826, 48238388, -25953950, -7763154, -11632382, -27542552, 18259516, --7733626, -17004850, -1775969, -33431488, -61097520, 15374909, 21509196, -18087182, 12177306, -3808562, --18226768, 19450834, 14328011, -7125351, 20042464, -7369090, -17895518, 9190156, -8886287, 23763518, -2235531, 1773822, 13426068, 4476430, -15141907, -6352257, 7792682, -4988605, 14794015, -20637854, -13316009, -21638046, -5512591, 5394479, -15358803, 9801115, 616328, -23051626, -3736622, 1487132, --6192269, -56908, -4310537, -16911970, 6922414, 5073967, -2695629, 16983912, 26029650, -14187888, --20310364, -1296543, -9691057, 28168544, 28918014, -17043504, -10807211, -3547106, -14343043, 303332, -5078262, 24316494, -26086558, 30828202, -18967112, 4054449, -286689, 3002719, -24087788, -3908957, --21809844, -18073222, -164819, -7254737, -16511465, -6709813, 11710228, -14115947, 10772852, -6780143, -33152852, -15672336, 9739912, 1817308, -8533026, -27012124, -10067403, 20215338, 3454228, -6884833, -26531624, -20007032, -20233590, -2927557, 25322054, -23447300, -3491809, 4361540, 6694244, -26088706, -7548942, 8794482, -9502078, -27270358, 239444, -21219822, 8659191, 4585415, 7814693, -41576896, --17940078, 23408108, 63411436, -29018410, -4235912, 4935455, -11002096, -18170932, -610959, 52993452, -11999065, -5611912, -4932233, -14249091, -3526168, -10955388, 20371030, 894427, -13431436, -14331232, -479426, 9354976, -21470004, 16376710, 4645544, 17871358, 457951, 22781044, 9385040, -16181826, -21297132, 20402706, 50659140, 16041703, 3688303, 5086852, -18860812, 6059125, 16394964, 17063906, -5684926, -1347546, 399432, -2215666, 6163815, 7032472, -1945083, 9128953, -2645163, -1082869, -17333952, 7344931, 2768643, -5389647, 4954245, 13193603, 13761612, 15983721, 5592585, 5794448, --9279814, -183073, -777389, 2837363, 8851391, -484794, -7463043, 8156680, -7808788, 6771016, --583042, 8011725, 967441, -6762963, -2097018, 446677, 1612760, 3942780, -1212255, 2799782, -1945620, -196495, -40537512, 53643068, 7337415, 12146168, 12811351, -12495670, -14384919, 426276, --5592048, 7551090, 17619566, -24947854, 8150238, -5335423, 6385543, 5953899, 4134443, 14069239, -11011222, -10697153, 9893457, 8563628, -8671002, -14944876, 4466766, -5371394, -12380243, 7268159, -5987185, -1149441, -8115341, 118112, -5932961, -2963528, 504659, 3087008, 5592048, -11216844, --1712081, 8773008, -4029753, 7859790, 1466731, 5636071, 11611444, 3329674, -11976516, 1123134, -11078868, -6448357, -640487, 5268851, -19002546, -1281511, -4741107, -17792976, 24368570, -6346888, --1074816, 14359149, 2432562, -11038066, 4249334, -10558103, -2154463, 7921531, -9815611, -3675418, -18008262, -19323058, 2001992, 1576253, 6516539, -8672613, 5764383, -3077881, 5370857, -7465727, -298500, -1924682, 18149994, -8460549, -859530, 4582730, -9229348, -1048509, 12556337, -2824478, -8082592, -5710159, -5252745, 769873, 4847408, -4970888, 9257802, -238908, -2066416, -2197413, --2965675, -3102577, 7895761, -6932614, 7729868, 4061965, -10228465, 2270964, -1060857, -1056562, -5986648, -8683887, -3437048, 1051730, -5683853, 5700496, -5844377, -1050656, 9590662, 1530082, --1817308, 4177930, -4844723, -4045322, -2358474, 4463008, 8000987, -2683281, -2321967, 663036, --6920266, 12566537, -53253300, -108307264, -13989245, 67903432, 52196736, 149959328, 72122704, -35019016, --30605400, -71170296, -124615256, -15794742, -48343616, -15032922, 87898120, 56021404, 59797220, 114428664, --4062502, -25382182, -43229920, -113250768, -62542776, -20146618, -21087216, 3111167, 51484308, 39875012, -42315628, 79861160, 46699180, -29411400, 42543260, -44788456, -104469712, 13327820, -70131448, -97534416, -37977176, -8404177, -18119394, 119859112, 39222180, 31841276, 103282688, -11120744, -20380156, 31424666, --69305200, -86073832, -23197118, -73705936, -65904124, 13931263, 14219026, 29746406, 90103048, 79825192, -48316236, 57248692, 11023034, -45193792, -48700636, -60234232, -82812336, -38665980, -21061446, -28143846, -24955908, 79723720, 52005076, 51399484, 42216308, -29825326, -382252, 8392366, -68357624, -28177670, --17176648, -20016696, 31268436, 16009491, -3986804, 25593174, -6003291, -5350993, 4320200, -18446348, --13955422, 9077413, -11476689, 18545668, 23288386, -8722542, 12600897, 23779086, -13936632, 15570867, -7737921, -46506444, 8170102, -15108621, -50536732, 765578, -28885802, -25812754, 36658620, 39727372, -38316476, 71102648, 22617834, 22623740, 24065238, -31128850, -62147104, -69342248, -88809720, -66136592, --19991462, 11570105, 53782656, 89197880, 98794984, 77186464, 56215752, 11107322, -52376588, -78829832, --96288336, -89441624, -46396384, -2952253, 25212532, 64072860, 59112708, 32298690, 32434520, 12625056, --912144, -186294, -10008348, -19592568, -16251083, -20317880, -24624658, -18060338, -13399761, -3456375, -6895570, 16695612, 20103132, 21766894, 18805514, 13237626, 6739341, -35433, -10909217, -18176302, --16645146, -11653320, -8116415, -6350109, -1699733, 2315524, 7962870, 9302362, 6191732, 5869073, -5098126, 2101313, 2913062, 2610266, -3103651, -4044249, -1980517, -3850438, -3483219, -5171678, --6981470, -3368865, 298500, 693637, 3617436, 5631239, 5721434, 6972343, 5208722, 1904818, --717796, -3526705, -4970888, -4906464, -4493610, -4117263, -2047626, 840740, 2229625, 2108292, -2018635, 1798518, 1785096, 1616518, 572841, 127238, 437550, 316754, 164283, -168577, --993748, -1340567, -2186138, -2949032, -2353105, -1235340, 207232, 1484448, 2149094, 2724620, -2834142, 1893544, 1155883, 581968, -1116692, -1840394, -1715303, -1751810, -1512902, -962610, --784368, -62277, 495532, 667867, 862752, 912681, 585726, 301185, 42950, -235686, --376883, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +4664335, 1187559, -2494302, -1096290, -5590437, -1477469, 4733591, -2462627, -1784559, 1475858, +-703301, -151398, 329102, -1475321, -1174137, 5728950, 2807298, -668941, 312996, -823023, +-1668595, 810675, 2073396, 3163244, -766115, 1225139, 1484985, -5024575, -1511829, 13959, +-965294, 3120294, 319438, -1039382, 2825552, -2102387, 980326, 4348655, -2360622, 296890, +618475, 3306051, -1226213, 4551592, -6383932, -2323577, 2834679, -1253594, -5404143, 409096, +1133871, 1830730, 1903207, -571231, -2304787, 218506, -2087891, -1430761, 674847, 2711198, +2522220, -3613678, 3234110, -3956202, 3587372, 216896, 3150896, -1197759, -2536178, -1127966, +2131915, -391379, -489089, -617402, 2937221, -3111167, 1646046, 773631, 819265, 1000727, +2357937, 750009, -1452773, -1677722, -892816, 1269700, -234613, -1230508, 277025, -1487132, +-290984, -98784, -1486059, -605054, -819265, 205622, 863288, -1025960, -699006, 430034, +-168577, -1469416, 27917, 805843, -529892, -71941, 345208, -134755, 622233, 421444, +88584, -1111323, -325881, 41876, -457414, 30602, -75162, -779537, 486405, -1321239, +-212064, -15295989, 5012227, -5564667, -2221572, -4557497, -4678830, 2648384, -1565516, -3952981, +-2126546, 5358509, 7968775, -4369593, -1630477, -395137, -5750961, -5405753, 397821, -553514, +3502546, 1174674, 2607045, -2310693, -1447941, -2991445, 833761, 5139465, 2228551, 992137, +-3325379, 2508261, 754304, 1531693, -2173254, 182536, 754304, 1147293, -2950106, -2162516, +799401, -4073240, -4160750, 1772748, 3144990, -3552475, -1788854, -1376000, 248571, 3131568, +2526515, 1085553, 470836, 8114267, 3184182, -2576981, 3156801, 2242510, -2263985, 3827353, +-1437203, -974421, -27917, -1685238, 3404299, -1932735, 889058, 2043868, 1640678, -3048890, +1188632, 554051, 607201, -1074816, -1512902, -645319, 4757750, 303869, -1420024, -1035624, +1116692, -4301947, 822486, 2538863, -173946, 1638530, -952409, -1560147, 1028108, 928787, +-408022, 1591285, 819265, -474594, 1131724, 1177895, 1987496, 243203, -2147, -158377, +-610422, -866510, -95563, -170188, -541166, 569620, -199716, 1958505, 11601780, 4604742, +-843961, 493384, 2632815, 1359894, -820339, -5062156, 129386, 4427038, -4610111, -545998, +-8622684, 2219961, 3464428, 198642, -2079301, 6244346, 4380867, -4080756, 1921998, 202937, +-3582003, 5568425, 3055332, -399969, 2229088, 5303748, -1689533, -1138166, 322659, -3221, +93416, 1247151, 6521908, 1285269, 943819, -10635413, -595390, 447213, 1231582, -4832375, +1075352, -3905199, -3005403, -4128537, -2709588, -11811, 1195612, -2537252, 2464238, -6126771, +-3534221, -408559, -117038, 1916629, -2477123, -605590, -2246805, 1285806, 3260954, -2032056, +317291, -1764695, -351650, 5075578, 3967476, -1653026, 3715684, -1836635, -3238942, -4036733, +-339302, -410169, -2735894, 2397666, -468151, 656056, -338766, -927713, 142808, -614180, +-2226941, -178241, -3524558, 353798, -1757179, -1160715, -2968359, 3354906, -1083406, 1117228, +2276870, 878321, -1224066, -315143, -1370095, -137976, 540629, -1347009, 1303523, -151934, +102542, 151934, -525060, 749472, 413927, 206695, 53687, 1876364, 875100, -662499, +-1355599, -1236414, 1111323, 1516660, -54761, 353261, 1461363, 193274, 18290118, -8063801, +1437203, -744103, -3461207, 2844879, 5075041, -3415573, 5461588, -377420, 5830418, 1563905, +2011118, -2617246, 3273302, 1220845, 3353296, -7298223, 3797825, -4345433, 1264331, -3660923, +4460324, -1310502, 4493610, -2756832, 1608465, -1832340, -469225, -274878, -533650, 1722282, +9417253, 346819, 2713346, -2699924, -4471598, 112743, 12348, 113280, 1371705, -3121368, +6152004, -468151, 5145908, 290984, -2329483, -2927020, -7901129, 3773666, 2477659, -3732864, +335544, 3064996, 1594507, -9190693, 5373004, -379568, 3798362, -5549098, -5970005, -2934537, +-5816997, -1126355, 6565932, 1309428, -2617246, 324807, 3681861, -1334661, -3088082, -1637456, +-3454228, 2348810, -5199058, -973884, -4006668, -1573569, -92342, 4338454, 1998770, 413391, +1302449, 5464809, 2834679, 608275, 1949915, -1633161, -690953, 302258, 27380, 816581, +388158, -1021665, 467078, 1885491, -210990, 354335, 653372, -1010391, -1352915, 1158567, +-1604707, 1750199, 998580, 1616518, -35970, -710817, 958315, 1599875, 359704, -759136, +468688, -114890, 4755603, -11307575, 2250563, -3597035, -10333691, -7978439, 4172561, 4654134, +6145562, -3111704, -1634772, 4211753, 1993939, 6317360, 2032056, -760746, 610959, 4013110, +7878581, -2079301, 2268280, -149250, 6376953, 1423245, -430570, -1340567, -4933844, -7499013, +43487, -1125281, 2201171, -477278, 1716913, 1248225, 418759, 420907, 1447404, -2599529, +250719, 3482682, 5504538, -2769180, 624918, -2447595, -3214783, 4515621, -3543885, -8805757, +-3470334, -2301566, 4171487, 288300, 4605816, 4175782, -2276333, 123480, -3658239, -569620, +-1586454, 5363878, -6866579, -264677, 2276870, -7309498, -8178155, 57445, 2492155, 5092758, +-3624953, -8692477, 4475893, -8026757, 9278203, 5185636, 1506997, 3893925, -117575, -3904125, +11802570, -1150514, 5701032, -293668, 8249559, 5611375, 3002719, -919660, -1633698, -2852932, +-1043140, 1171989, 279710, 2206540, -2358474, 1343788, -1261647, -928787, -897111, -1038845, +1104344, -678605, -38118, -1837172, -97711, 996432, 1978369, -2091112, -2467996, 258235, +1069447, -104690, 1289027, -821949, 138513, -1051193, -324270, 584116, 1218697, 1418950, +891743, -1286343, -1801739, -24828132, 5218922, 1346472, -12427488, -15704548, -2454574, -12104828, +9996000, 2925410, -7265474, 546535, -3336653, 1189706, -4934381, 730144, -203474, 146029, +7070053, -2409477, -1546725, -2826089, -2488397, -6501507, -4335770, 6700149, -2647847, 4269735, +-3599720, 1898376, 193274, 3867081, -3762928, 2950643, -3780645, 1774358, -1396401, -2320893, +2473364, -6070400, 2449205, -3046206, -1045825, -4387309, 10903311, 5242545, 9570261, -3953518, +4083440, 3313031, -1801739, 1781875, -4411469, 4861366, 10486163, 8319889, -5647345, -1439888, +2519535, -4052302, -2704219, -7166690, -13508746, -4513474, 7052337, 2604361, -3271691, 1477469, +797253, -3604551, -6373732, -6417218, 4715874, 640487, -9907953, 1164473, 1046898, -386547, +-664646, 3418257, 7326678, -633508, 74088, 1119376, 75162, -1798518, -6523519, 2294050, +2308545, 1467268, 3168075, 1977833, -2745021, 838056, -1698123, 478889, -1423782, -496606, +-1584306, 154082, 455267, -88584, -1124745, -1059246, -273804, 627065, 40802, 2541547, +948114, 2379949, 2532957, 2770254, -3103114, -3117073, -1132261, 2554432, -750009, 1010928, +-872952, 1463510, 1491427, 1029182, -1472637, -758599, -9820443, -4126390, -2596845, 7315403, +-2008434, 1695438, -7666517, -7990787, 336081, 2250026, -4704600, -2712272, -4418448, 8983998, +1935420, -3074123, -6647536, -6548215, -6415608, -1812476, 3000035, 9029095, 2887829, 5085778, +-4127464, 9620727, 5462125, 1741609, 54224, 9898289, -5858873, 913217, 3092377, 6693170, +-10933376, -5565204, 4693326, 1887101, -1555315, 11317776, -5010080, 3189013, 6788196, 2109903, +1098438, 4982699, 1979980, 2474438, 2494839, 1074816, 2882997, -175020, 4271345, -1008244, +10546829, -7709467, 8670465, 6928319, -6088116, 6862821, 1218160, 5834176, 5852430, -12954695, +-392990, -516470, -3951907, 2076617, -3570192, 3597035, -1522566, 8267812, -951335, 1305670, +3336653, 2330020, 3227668, -5259725, -1818919, -5374078, -5039071, -2850248, 7970386, 1210644, +-2604361, 2383170, 2161979, 1036161, -1401233, 852014, -1005559, 3178813, 1151051, 1022202, +-1576790, 994285, -3058017, -256624, 3455838, 1847373, -614180, 1188632, 1195075, -954020, +1431298, 1021129, 3351685, 1900523, -1935420, -719407, -1166621, 1069984, -3064996, 916976, +1617592, 1050120, -492311, -116501, -312996, 12948790, -3466576, -2046015, -3219078, 9214315, +4817343, 957241, 3489124, -6283537, 13787382, 4551592, -1132261, 5191542, 6636798, -11316165, +-800475, 2646237, 1276142, -40265, 9507984, -4617627, -5847598, 13123809, 1939715, -955630, +-1356136, 6848862, 476741, -1018444, -1340567, -3211562, 3374234, -1997697, 4516695, 3197603, +-8337606, -7866233, 928787, 15503758, -240518, 3153043, -9630927, 4712653, 6315213, -3974455, +4665945, 5851893, -9767829, -5937256, -1281511, -12445205, -6663105, -7431367, 2117956, -2552821, +-2824478, -1373316, 8677445, -11997454, 5228586, 2600066, -3960497, 7315940, -4758287, 699543, +-10145250, -214212, 6014565, 5469641, 11386495, -13548474, -3445638, -15040439, -3308736, -306553, +-3661460, 1685775, -820339, 13682155, 10536092, 6012954, -6898791, 349503, 2533494, 6669548, +8116952, -187368, -58519, -1167694, 77846, 4668630, -325344, -402116, -288837, 85899, +132607, 570157, 1791001, -1923609, -712428, 1956358, 217970, 1808718, -173409, 206158, +-1685238, 2483028, 1413581, 39728, 2211371, -1171452, -267362, 2183454, 462246, -360777, +-2818572, -168577, 482647, 406948, -1088774, 2801393, 4539781, -833761, -261456, -2084133, +1409823, 8769249, -10027675, 240518, -6179921, 16931298, -7282117, -4216584, 14661945, 11037529, +1971927, -20656108, -5105643, 9382893, 678068, -1069447, -3018825, -1701344, -1693828, 1357747, +3096672, 2827162, 2674691, 18149458, -3893925, -2723546, -75162, 2302103, -5523865, 3126199, +1845225, -758062, -6070937, -3836480, 6493454, 6972343, 13255343, 3335042, -5582921, 3295851, +-261993, 3342022, 158377, 7329362, -6260452, -9280351, -9577777, 6136972, -2796024, 1223529, +2379949, -3466039, -721018, 15765751, 5317170, -13436268, 9411347, 2962991, 15946140, -8414378, +-7956964, 4568772, 8540006, 5894843, 3230352, -1546188, 407485, 4057670, -5323612, -1569274, +73551, 6743099, -5036386, 13615583, -594316, -253940, -7175280, -8041253, 15543487, 4586488, +-12942347, -3068754, 10681584, 7416335, 1387274, 2646237, -6641093, 1984812, 1636383, 2042794, +1090385, 2275259, -3110630, -3712462, 383863, -170188, -3117073, -1057636, 2698850, 2695092, +-4133369, 1009854, -104690, 1702955, 2313914, -725850, -806380, -1045825, 1530082, 4759898, +-3580929, 2600066, -322659, 67109, -2138894, -526134, -1616518, -1077500, 2209224, -845572, +-1436667, -3172370, -203474, -1816234, -12150999, -10302553, -3977677, 3834869, 3935264, 18884434, +18333604, -2076080, 1525250, 861141, 186831, -155693, -3732864, -12221329, -9366250, -4810900, +4392141, -3372086, -10630581, -2974802, 2075006, -742493, -16322486, -4762582, 3670050, -1625645, +1595580, 1178432, 4964982, 7254200, 1211718, -5175436, 5358509, 5583458, 3937411, -170188, +7217693, -14307610, 4855461, -12671764, 15897285, -11202348, 4376572, -11889006, -1934346, -13288629, +-7002944, -8264591, -8948027, 6213207, -7863012, -1481764, 2828236, -55298, -4169876, -2991982, +-1337346, -12998719, 475131, 897648, 6517613, -20317880, 528281, -485868, 9546102, 11460046, +-7704635, -4720169, 480499, 8813273, -16787954, 10829223, -7522099, -4968204, 871878, -16345035, +-798864, -1288490, -2515777, -2893734, -1999844, 16464220, 6747931, 3409667, -3888556, -3658775, +-4071092, 545998, 4078072, -6550362, -134755, -1116155, -1726577, 907312, 4898947, -1781338, +-3067681, 3099356, 1928977, -39192, 3454228, 1870458, 2901787, -1713155, -2165201, 4158602, +-2942590, 1088774, -3871376, -724776, 220117, -771484, -1440962, -3434900, -3760781, -4012036, +1021665, -196495, -835371, -2886218, -2707440, -1101122, -1406602, 933082, 4152697, -1070521, +3189550, -9531606, -25071334, -9928354, -4660577, 4534412, 6945499, -8129836, -2996277, -10262287, +-9047885, 4982699, -7934952, 8450885, 3511673, 6110128, -871342, -8043400, 14420353, 5820218, +8126078, -10086731, 4449586, 2003065, -14788646, 9346386, 5623186, 681289, -10040560, -3771518, +5100274, 5441187, -151398, 1963337, 7312719, -6945499, -5146445, 8642548, -16887812, -16604880, +-21915070, -4811437, 7137699, -19178640, -16043850, -9649718, 381715, 7067906, 2270964, 2080912, +386547, -5463199, -7652558, -18105434, 9666361, 2836826, 22137872, -5163088, 620623, -13558675, +-16322486, 2200097, 10600516, 849330, -10291279, 6934225, 2789045, 15185931, 1503775, 2017561, +-7269769, -1261647, 6405407, -14654428, -27590870, -7573101, -6881612, 1613834, 7267622, -13095892, +-6684580, 4440460, -4612795, -944356, 4323422, -2426657, -2215666, 5813238, 1402844, -380641, +2802466, 4546760, 4929549, 1074816, -3307125, -8645232, -805306, -5222680, 1450625, 1107028, +1119376, 3774740, -3149822, 3444027, 4519380, 3164317, 2554969, 2675765, -6512781, -5819681, +-2263985, -4992900, 564251, 1605781, 1717450, 6241125, -1442572, 4020090, 2371359, -2421825, +-1340567, -3590593, -5059472, -1227287, -6664716, -2014340, -1513439, -23601920, -18136574, -8348343, +12462921, -1093069, 21340082, 4207458, -1839320, -11985106, 4271882, 21969294, -22999550, -20730734, +-6832756, -3460670, -14418205, 13654238, 4018479, 7387881, 8864276, -14477798, -1707250, 5776731, +-9094056, 17026860, 263604, 3808562, -4951024, 4180614, -11256036, -6459094, -3860639, 6381248, +3058017, 10333691, -16979616, 1487132, -118648, -12698071, 13836237, -8302709, -20205136, 3956739, +7296613, 1430224, -6027450, -1510755, -8409009, 1345935, 6899328, 2884071, -13808320, 5366562, +-3139084, -15398531, -9062381, -18909130, 430034, -2988760, -491774, 2393371, 11579769, 14324790, +11971684, -6175626, -10424422, 3391951, -2646774, -1816771, -8056822, 14902463, 12372727, -2717641, +22986128, -14720464, 7668664, 14427332, 15607374, 356482, 9924596, -6486475, -2526515, -12930536, +-5437966, 7624641, -2612951, -10089415, 6255620, -5812165, 6572911, -3003256, -6832219, 3498788, +-1348083, -3987877, -2973191, 2546916, -3317862, 2211371, 4642860, -4944581, 6294275, -847719, +-3402688, 2263448, 770947, 326954, -2823941, 3592203, -5565741, 1826972, 2121714, 155693, +-3707631, -470836, -2190970, 2760590, 5219996, 11176579, 5734855, 8910983, -427886, -163209, +4653597, -5819144, 1578937, -7868917, -3128347, 1632088, -77846, 8629126, -20440824, 2600066, +248571, -12920872, 1893007, -28755342, -24869472, -5946382, -209380, 1081795, -617402, -10217727, +-348966, -2915746, 9210020, 1803886, -570157, 1735704, -21721260, 7521562, 4065187, 12070469, +5016522, 5232881, 14181445, 7065758, 2063195, 35459788, 7596187, 13647259, 18824842, 886374, +13280576, 3331284, -7354595, 8621073, 623844, 4153770, -7202660, 544387, -4668093, 3012920, +-4653060, 9978283, 1216013, -6199249, -7739531, 1073205, -21021718, 12233677, 8265665, -1066763, +-1889786, 4811437, -5576478, -4634807, -6885907, -8326868, 6970732, -6641630, 11508365, 13378286, +13122199, 13944685, -3218004, -21117818, 355409, 8921721, 21322902, -4937065, -765578, 10098542, +14898705, 21927956, -2822331, 9663676, -6467147, -3754338, -17592722, -13731010, -5982353, -6228240, +-5009006, 3684008, 786516, -7547868, 8579734, 5405753, 6747931, 12062953, 4849555, 4526359, +-1412507, 22549, -1757715, -3442416, 129386, 2183991, 38118, 6371047, 5112085, 3119757, +-334471, -5207648, 332323, -3736622, -4122095, 2666101, 3256659, 979253, -6470905, -1452236, +-9424232, -2290291, 3118146, 4695473, -2997887, 3906273, -5373004, -6272800, -3148211, -3776887, +3529390, 1831804, -5498095, -3788698, 4334696, 16988206, 22158810, -17118666, -17897666, -23526220, +20537460, -2530273, -8762270, 6920266, 6688338, 19213536, 15964393, 755377, 17536352, 25056840, +6925635, -13197361, 11870216, -12233677, -6960532, -2749316, -8625368, -10310069, 4948876, -5333276, +-5237176, -12380243, 27333172, 3193845, -14928769, -256087, -2232846, 12104828, 12822088, 4907000, +-8830990, 12931073, -3810710, 7890392, -25463788, 1084479, 10260677, -11063836, 3400004, -12001749, +-9817758, 25817586, 10597295, 7624641, -2043331, -23314694, -5830955, 6449431, 4751845, 3503620, +-5695127, 18134962, -13133473, 9974525, -6289443, 6520297, 7216619, 14320495, 19439022, -23066658, +-821413, 11509975, 5478768, 16271484, 15773804, -23003308, -164283, -6534793, -12030740, -973884, +-12572443, 4844723, 9221832, -4836670, 16893716, -4092567, -10469520, -12660490, 10424959, 12000139, +11942157, -3592203, 1880122, -952409, -17923972, -17355426, -16294569, 9685151, 4747013, 2918430, +7730941, -791348, -4727149, 11810623, 1398012, -345208, 7130720, 11428371, 6812355, 610422, +1010928, -3743601, 6835441, 3264712, 14686104, -1693828, 1529008, 10227391, 8244727, 2636573, +-1780264, 6426345, -508954, -1699196, 11523397, -9782862, 205085, 6984154, 274341, -2509872, +-3869766, -2132451, -335544, 7553774, 1170379, 233539, 8367670, 5995238, -5920613, 9008694, +-742493, 17474612, 34820372, 1487669, -16656957, 4702989, -11147051, 7209640, -9693204, -10420664, +31601296, -23994908, 39680664, 24334210, -5879810, 8026220, 19164680, 2810519, -29950954, 11790759, +-24259050, 5810554, 2144799, -11931419, 498753, -1585380, 17303350, -8614094, -882616, -614180, +-5284421, 36644124, -2116345, -5440650, 4700842, 12383464, -12484396, -26266946, 20763482, -3259880, +-1603633, 23752780, -13944148, -3784403, -16599512, 4507568, -11606075, 13451301, 12321724, 25283398, +-7241852, 7124814, 16824460, -23817204, 2913599, -15144592, -24067386, -30656402, -16190416, -33152316, +-37402184, -5141076, 2401961, -17501992, -18950470, 11818676, -1347009, -10524280, -20430086, 14823543, +-10924249, 3932580, 18493592, -34799972, -10095321, -6311455, 15467788, 41845328, -19776176, 1320703, +-12563316, -18415210, 8956617, -22057342, 17832704, 31222802, -8901857, -14421963, -15436112, -3774740, +-3714073, 415001, 10065256, 7541963, -8226473, 8360154, -1065152, 6603512, 340913, -7427072, +-2184528, 9240622, -15162845, 7230578, -7963406, 2211908, -6491843, -2355253, -9146670, 2202245, +-8793946, -13475997, -6587406, 3349538, -10140955, 107911, 3004867, 15051176, -8663486, -4902169, +4860829, 6280853, -10819023, -6586869, 3019899, -2792266, -5790153, 10549513, 1780801, -8006356, +7228967, 2200097, -12628814, 2205466, -10137733, 11254425, -5009543, -16146393, -23897198, -18126372, +20149302, -16412681, 8167954, 19173270, 8227010, 12325482, -22778360, 32864016, 20702816, 17939004, +-13154948, 23561116, -2527588, 15591805, 10277857, 3491272, 8537858, 11452530, 7012608, -3806415, +-5796595, -5209259, 2428804, -15786152, -18592914, 10523207, 4694936, 6119792, -15280420, 4208531, +4733591, 11516955, 17190606, 25789668, -14487998, 3924526, 36719288, 7930120, 3999152, 3567507, +-7486128, 2713883, 36567888, 10611254, 23712514, 6760816, -25222732, -10516227, -18346490, 53014392, +21607980, -20464982, -12752832, -18252000, 3168075, -11972221, -28715078, 6627672, -21725556, 32463510, +-2193655, -26851598, 35451732, 28683402, 4182225, -7786776, 4930623, -16341814, 21878564, 38927436, +-10314364, 18465138, 43622372, -6845641, -6976638, -4952634, 26605712, -1921461, -14515379, -13733158, +-13853954, -231928, -1603633, -12170327, 1091995, -5101885, 13479755, 3331821, -12712566, -8087961, +-14494441, -1584306, 2127620, -2375117, -10108206, -11415486, -7984881, 7165079, 12189117, 1890859, +-12406013, -1817845, 16103980, 132070, 14774687, 7697655, -8043937, -724776, -12566537, 12508019, +5750961, -16385300, -30698278, 2848637, -1822677, -9343701, 10319196, -65498, -5203890, -4379793, +3352759, 856309, -1029182, 9115531, -24970940, 10110890, -3297998, 25043954, -51946556, -35604204, +20760798, 9997073, 7610145, 17634062, -17621714, -23039816, -12603582, -18955302, 10940355, -20349556, +6131066, 13720273, 22494354, 863288, 18879602, 11020886, 3240553, -5854041, -19415936, -13703093, +11577084, -23834384, 12357158, 2926483, 20566450, 15669651, -7459285, -29699698, -19206020, -1699733, +-1316944, -7782481, 20575040, -35932232, -2618320, 1352378, -37553584, -638340, -4469987, -2922725, +4216584, 22176526, -21345988, -59222768, 22318798, 24248312, 14587856, 46336256, -37901476, -4814659, +25881472, 19731080, -23719494, -11038603, -6410239, 36502928, 7356742, 34842384, -50130320, 7399692, +-59836412, -35893040, -34610456, 41309532, 13258027, -26564372, 24407226, 2877091, -23159538, 23787140, +-34737160, -36617816, 5665062, -38035156, 11483132, -65000036, 10116259, 20549808, -27515172, 30481920, +-13626857, -7323456, 20551956, -7013145, -5412733, -14496588, -877784, 4803921, 11416560, -1335735, +10621991, 20511690, -15256261, -1692217, -12095165, 7294465, -7841000, -2143189, 4649302, 2508798, +2920578, -2723546, 21300354, -7034083, 1877438, 9013526, -18485540, -16443282, -17946520, -8472360, +-30339112, -14048838, -10992969, 26229366, 5360119, 23334020, 10228465, 4667556, 10781979, 7347616, +1107028, 8784819, 2032056, 18249852, 44950052, 16610786, -16135655, -10553272, 6184216, -11461120, +-13423383, -1633698, 20910048, -3674882, 3894999, -22293028, -4616016, 30690226, -22439594, 16955458, +40130028, 20023674, -1712081, -7710003, -13203803, -25720948, -18878528, 22065932, -12602508, 20700668, +14961519, 7066832, 983548, 8045011, -6394670, -32706176, -11316702, 23296976, 18521510, 19352048, +-20642150, 35582732, -9162239, 13797582, -26331908, 24070070, 41555420, -8421894, -14775761, -1597191, +1544578, -9300752, 9098351, 18101676, -34057480, 22304838, 21725018, -5380521, 25182466, 13268228, +10882373, -16025597, 3322694, 22436372, -47496432, -42395084, -17601850, 11143293, -21848498, -64404644, +26989574, 17580912, -8313983, -10990284, 521839, -3849901, -22003654, -59170692, -3541201, 41887744, +10222022, -7543037, -4983773, 8986682, 34403760, 27292906, -40303972, -16724603, 26954678, -5779952, +-10780368, -46201500, -2652679, 25220048, 8444443, -7184944, 15636902, -5883032, 1688996, -17457432, +-2811593, 10485089, 15910169, -9102109, -3221762, 3180423, 9220758, -5768141, 5694590, 669478, +-11227045, 6689412, 19344532, 3236795, 5810554, 3524021, 8762807, -9168681, -15887621, 1473174, +17292076, -14201309, 6245956, -4848481, 1603097, -13773960, -26331908, -14427869, 9891847, 32053878, +-3217468, 15108621, -21206402, -9409736, -14315126, 8836895, 6314676, 10087268, -7185481, -11048266, +-705448, 2275259, 2543158, -4990752, -1094143, 21876416, 28997472, 645856, -32695976, 43296492, +-12164421, -30227442, 27084064, -4350802, -16445430, 20932060, 5602248, -4383014, 17657684, -24212342, +22961968, -8206609, 770947, -7041599, -6015102, -33754148, 13364864, -12885976, 5316633, -13532905, +-1116692, -10089415, 9664750, -5911486, 36477696, 6444599, 23863912, -9286793, 5967320, 15083925, +-6406481, 10424422, -2068027, 18219252, -915902, -6125697, 28806882, -25742960, 14361834, 19684908, +-11556146, 22280142, -13641890, -558883, 11463805, -8722542, 26192858, 23450522, 4876399, 39027296, +-24055038, -55116240, -9276592, -34080564, -22546968, 80483392, -2050847, 24689620, -3757560, -33973192, +-875100, 33811056, 47887276, 29111826, 48238388, -25953950, -7763154, -11632382, -27542552, 18259516, +-7733626, -17004850, -1775969, -33431488, -61097520, 15374909, 21509196, -18087182, 12177306, -3808562, +-18226768, 19450834, 14328011, -7125351, 20042464, -7369090, -17895518, 9190156, -8886287, 23763518, +2235531, 1773822, 13426068, 4476430, -15141907, -6352257, 7792682, -4988605, 14794015, -20637854, +13316009, -21638046, -5512591, 5394479, -15358803, 9801115, 616328, -23051626, -3736622, 1487132, +-6192269, -56908, -4310537, -16911970, 6922414, 5073967, -2695629, 16983912, 26029650, -14187888, +-20310364, -1296543, -9691057, 28168544, 28918014, -17043504, -10807211, -3547106, -14343043, 303332, +5078262, 24316494, -26086558, 30828202, -18967112, 4054449, -286689, 3002719, -24087788, -3908957, +-21809844, -18073222, -164819, -7254737, -16511465, -6709813, 11710228, -14115947, 10772852, -6780143, +33152852, -15672336, 9739912, 1817308, -8533026, -27012124, -10067403, 20215338, 3454228, -6884833, +26531624, -20007032, -20233590, -2927557, 25322054, -23447300, -3491809, 4361540, 6694244, -26088706, +7548942, 8794482, -9502078, -27270358, 239444, -21219822, 8659191, 4585415, 7814693, -41576896, +-17940078, 23408108, 63411436, -29018410, -4235912, 4935455, -11002096, -18170932, -610959, 52993452, +11999065, -5611912, -4932233, -14249091, -3526168, -10955388, 20371030, 894427, -13431436, -14331232, +479426, 9354976, -21470004, 16376710, 4645544, 17871358, 457951, 22781044, 9385040, -16181826, +21297132, 20402706, 50659140, 16041703, 3688303, 5086852, -18860812, 6059125, 16394964, 17063906, +5684926, -1347546, 399432, -2215666, 6163815, 7032472, -1945083, 9128953, -2645163, -1082869, +17333952, 7344931, 2768643, -5389647, 4954245, 13193603, 13761612, 15983721, 5592585, 5794448, +-9279814, -183073, -777389, 2837363, 8851391, -484794, -7463043, 8156680, -7808788, 6771016, +-583042, 8011725, 967441, -6762963, -2097018, 446677, 1612760, 3942780, -1212255, 2799782, +1945620, -196495, -40537512, 53643068, 7337415, 12146168, 12811351, -12495670, -14384919, 426276, +-5592048, 7551090, 17619566, -24947854, 8150238, -5335423, 6385543, 5953899, 4134443, 14069239, +11011222, -10697153, 9893457, 8563628, -8671002, -14944876, 4466766, -5371394, -12380243, 7268159, +5987185, -1149441, -8115341, 118112, -5932961, -2963528, 504659, 3087008, 5592048, -11216844, +-1712081, 8773008, -4029753, 7859790, 1466731, 5636071, 11611444, 3329674, -11976516, 1123134, +11078868, -6448357, -640487, 5268851, -19002546, -1281511, -4741107, -17792976, 24368570, -6346888, +-1074816, 14359149, 2432562, -11038066, 4249334, -10558103, -2154463, 7921531, -9815611, -3675418, +18008262, -19323058, 2001992, 1576253, 6516539, -8672613, 5764383, -3077881, 5370857, -7465727, +298500, -1924682, 18149994, -8460549, -859530, 4582730, -9229348, -1048509, 12556337, -2824478, +8082592, -5710159, -5252745, 769873, 4847408, -4970888, 9257802, -238908, -2066416, -2197413, +-2965675, -3102577, 7895761, -6932614, 7729868, 4061965, -10228465, 2270964, -1060857, -1056562, +5986648, -8683887, -3437048, 1051730, -5683853, 5700496, -5844377, -1050656, 9590662, 1530082, +-1817308, 4177930, -4844723, -4045322, -2358474, 4463008, 8000987, -2683281, -2321967, 663036, +-6920266, 12566537, -53253300, -108307264, -13989245, 67903432, 52196736, 149959328, 72122704, -35019016, +-30605400, -71170296, -124615256, -15794742, -48343616, -15032922, 87898120, 56021404, 59797220, 114428664, +-4062502, -25382182, -43229920, -113250768, -62542776, -20146618, -21087216, 3111167, 51484308, 39875012, +42315628, 79861160, 46699180, -29411400, 42543260, -44788456, -104469712, 13327820, -70131448, -97534416, +37977176, -8404177, -18119394, 119859112, 39222180, 31841276, 103282688, -11120744, -20380156, 31424666, +-69305200, -86073832, -23197118, -73705936, -65904124, 13931263, 14219026, 29746406, 90103048, 79825192, +48316236, 57248692, 11023034, -45193792, -48700636, -60234232, -82812336, -38665980, -21061446, -28143846, +24955908, 79723720, 52005076, 51399484, 42216308, -29825326, -382252, 8392366, -68357624, -28177670, +-17176648, -20016696, 31268436, 16009491, -3986804, 25593174, -6003291, -5350993, 4320200, -18446348, +-13955422, 9077413, -11476689, 18545668, 23288386, -8722542, 12600897, 23779086, -13936632, 15570867, +7737921, -46506444, 8170102, -15108621, -50536732, 765578, -28885802, -25812754, 36658620, 39727372, +38316476, 71102648, 22617834, 22623740, 24065238, -31128850, -62147104, -69342248, -88809720, -66136592, +-19991462, 11570105, 53782656, 89197880, 98794984, 77186464, 56215752, 11107322, -52376588, -78829832, +-96288336, -89441624, -46396384, -2952253, 25212532, 64072860, 59112708, 32298690, 32434520, 12625056, +-912144, -186294, -10008348, -19592568, -16251083, -20317880, -24624658, -18060338, -13399761, -3456375, +6895570, 16695612, 20103132, 21766894, 18805514, 13237626, 6739341, -35433, -10909217, -18176302, +-16645146, -11653320, -8116415, -6350109, -1699733, 2315524, 7962870, 9302362, 6191732, 5869073, +5098126, 2101313, 2913062, 2610266, -3103651, -4044249, -1980517, -3850438, -3483219, -5171678, +-6981470, -3368865, 298500, 693637, 3617436, 5631239, 5721434, 6972343, 5208722, 1904818, +-717796, -3526705, -4970888, -4906464, -4493610, -4117263, -2047626, 840740, 2229625, 2108292, +2018635, 1798518, 1785096, 1616518, 572841, 127238, 437550, 316754, 164283, -168577, +-993748, -1340567, -2186138, -2949032, -2353105, -1235340, 207232, 1484448, 2149094, 2724620, +2834142, 1893544, 1155883, 581968, -1116692, -1840394, -1715303, -1751810, -1512902, -962610, +-784368, -62277, 495532, 667867, 862752, 912681, 585726, 301185, 42950, -235686, +-376883, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -1049583, -2694555, 4660577, -3473555, -3004867, -4648765, 4219806, 2105071, 372052, 6239514, -619012, --73551, -1902671, -1538672, 1357747, -1663226, -3244848, 1832877, 532039, 5211943, 7121056, --1848447, -4182761, -5153961, -320512, -2945274, -2838437, -1946157, -391916, -4104915, 3961571, --1467268, -1548336, -2713883, -1999844, 762894, 4450660, -459025, -1278827, 1347546, -4363687, -3281355, -2720325, -9791452, 4862977, 3233037, 5401458, 5602248, 1070521, 2952253, -2918430, -834834, 4247186, 335007, -46171, -1017370, -558346, 2280628, -2063732, -1488743, 111669, -2168422, -1791001, -2232309, -3270618, 4197257, 1670205, 521839, -1015760, -4190814, -139586, -3140158, 1953136, -593242, -788663, 3145527, -375810, -225486, -1362578, -1288490, -1911797, --2265595, 147640, 483721, 1085016, -2331630, -919123, 1304060, -1612223, 1407139, 385473, -633508, -598611, -33286, 311385, 688805, 178778, -266825, 435939, -292595, -791348, --254477, -1314797, 882616, 458488, -372588, 25770, -592706, 795643, 817118, 269509, -85899, 313533, 293132, -814433, 34897, -153008, -195421, -314069, -106300, 469225, -142808, -14672682, 7678865, -707596, 234076, 2680597, 3770981, -5457293, -679679, -967978, -3139084, 1202591, -3332895, 10461467, -1103807, -633508, 4664335, 3830037, 1263794, 2661806, -8543764, -4207458, 284542, -2138357, 870805, -2611877, 230318, 279710, 976568, -4721243, -425202, -1123671, -1762547, -190052, 2994666, -1627256, 2785823, 4041027, -6929930, 949725, --2805688, -755377, -4258997, 2147484, -2519535, -423054, -1414118, -4334696, 1681480, -2904472, -2003065, 1102733, -2130304, -3152506, 121870, 2951180, 2232309, 5353140, 2490007, -2297271, --6537477, -428960, 1178432, 8282845, -2543158, -1245004, -69256, -1601486, -4289062, -2046015, --3991635, -530428, 3352759, -743029, 3987340, 2564096, 2071785, 2888903, 542240, -5163625, --1185948, -3319473, -2093260, -5735392, -171262, -1627793, 798327, 1567663, 704375, -846109, --1146219, 206158, 1541893, -1286343, -332323, 45097, -443992, -111669, -506269, 618475, --1951526, -669478, -442382, 67646, -168041, -358093, 30065, -2901251, 10624138, 5491653, --1836635, -4421669, 6037651, -7270843, -1297080, 3882651, -3061775, -2238752, -3189013, 6978248, --2599529, 2083059, 489089, 2056216, 9569724, -9826348, 2786897, 4762045, -3346853, -9103183, --4799089, -722628, 455267, -1384053, -1735704, 3661997, 5372467, -559956, -3994320, 185220, --5032091, 1358820, -3200825, 1630477, 5745593, 2038499, -5992553, -263067, 250719, 8659191, -1531156, 4281009, -1369558, 1839857, 1428614, -10703595, 64425, 4916664, 2220498, 5510980, --5077725, -3159485, -5055714, 1240709, 3073586, -1115618, 979789, 171799, -2586644, 841277, --1967632, 1585380, 1495186, -466004, 2496450, 431644, -482647, 1044214, 6206765, 1056562, -3194382, 4002910, 2173790, -3758, -192200, -6015639, -106300, 6198712, 2132988, 2692408, --213138, -538482, 3869766, -3063386, 236760, -374199, 1923072, 967978, -70867, -2673080, -337155, -1402307, -468688, 333397, -912144, -710280, 537408, -179315, 1955821, 753230, -1781338, 792958, 487479, 907849, -835371, -1119913, 39728, 13959, 2250026, 1324997, -265751, 703301, 2136209, -476741, 144955, 585189, 897648, -23622, 22066468, -5772436, --2124398, -3416647, 4468914, 2960306, 7472170, 2927020, -1167694, 3546032, -216359, 3972845, -1505386, 5545877, 61203, 4643397, 6068789, -6859600, 1161789, 1690607, 1076963, 1003949, -1461900, -4107063, -66035, -4719632, -727997, -236760, -7937100, -5425081, 1918777, -103616, --331249, 3067681, 3022583, -1674500, -6848326, 1966558, 6073084, 3962644, 5661304, -1611687, -3036542, 5596880, -9494562, 2922188, 4102231, -4740570, 5792301, -4143033, -905164, 502511, -1102196, -3219078, 2714956, -905164, -1112933, -3347390, -2718178, 3196530, 3243237, 1404991, -3192771, 4958003, 2716567, 6922951, -1517197, -7962870, 7585986, 1165010, 3702799, 1503775, --1340030, 1909650, 1415729, 249645, 5197448, -1684164, 5128728, -7495255, -1739462, 876173, -2265059, 419296, -4085051, -1955284, 642098, 146566, -459562, 162672, 1536525, -2076080, --1162862, -1210107, -1474248, 759136, -464393, -638340, -1204738, -947040, 2224793, -628139, --767189, -120796, -813896, -744103, 1120987, -544924, 1199907, -351114, 79457, 857920, --290984, 20938, 9922448, -11135776, 7601555, 1697586, 7781944, 1891396, -4197794, 1532230, -6024766, -6939057, -1371705, 922344, -7831873, -1459215, -5990406, -3628711, -4330401, -4773320, -2199023, -7485055, -4592931, -5941551, -1418413, 5957120, 2234457, -7171522, -2710124, -7506529, --1756642, 1771137, 11062225, -8698383, 3738769, -2133525, -3100967, -6456410, 434329, 1226750, -7138236, 3791383, 1010391, -5845988, -10205379, -46708, 3157338, 8221105, 2958159, 2707977, --5873368, 2292439, 5215164, 497142, 920197, -3107946, -3055332, -971200, 3089692, 633508, --1932735, 165356, -6468758, -841277, -5430450, 3608846, -1036161, 3607773, -5316633, -4510790, --7369090, -767725, -4691715, -1975148, 2054605, -7180112, -3008625, 941672, 4147865, -8646306, -5240397, -4016331, -4280472, -4548907, -3746285, 2728378, -2471754, 1317481, 1649804, -2222109, -474057, 1918777, 1555315, 191663, -1934346, -213675, -855235, -2251100, -269509, 1832340, -1175747, -1066226, 1735704, -1265942, -886911, -163746, 690416, -1655173, 271657, -120259, -1338419, 1024887, 2110977, -1486059, 618475, -265751, -517544, 701153, -1661616, -548145, -1082869, 586263, -692564, -27327266, 4422743, 3134789, -7876433, -1744294, -16106, 285615, --1493575, -2612414, -2001992, -8115878, 6274411, -3927211, 883690, -6760279, -2385318, 9797894, -8893804, -5621576, -3374771, 287763, -134755, -4614943, -5363878, -3816615, 663572, 420907, -186831, -555661, 2307471, -6672769, 2108292, 226560, -11745662, -1417339, -3496640, 5377299, -7888781, 1222992, -1358283, 369367, -6871411, -8647380, 4659503, 8537858, 9545028, -2577517, -1764158, 5541045, 5758478, -2980171, 5315022, 8598525, -330712, 7235410, 6176700, -7240241, -2397666, 401579, 7803419, -4781909, -5044439, 4459250, 5924371, -1831804, 561567, -8534637, -6028524, -4784594, 6362457, -10610717, 1187022, 2493766, 5091147, 321049, -4393752, -9058623, --5499706, 7569880, -7464653, -381178, 892279, 4069482, -2228014, -1634235, 3241090, -6069326, --5214627, 2124398, 1483911, -473520, 4365298, -2037425, 1072668, 1079111, 1204202, 1597728, -401579, -1721208, 1098975, 2189360, -874563, 270046, -400506, -1163936, 960462, -2836826, --343061, -3056943, -523986, -613643, -930934, -1592359, 679679, -941135, 13422, -2391223, -992674, -474594, 871342, 902480, 414464, 342524, -10536092, 3815542, -9303973, 11908871, -11454141, 410169, -15377594, 6453189, 934155, -2817499, 10710575, 107911, -9140227, -915902, -11638288, -14463302, 517007, -3571265, -11407433, -3125126, 265751, -2193118, -5814849, 3445101, --4807142, 4019553, -4086662, -7702487, 4197257, -515396, 6005975, -11500312, 4776004, 9167608, --3604015, 814433, 9205726, 13447006, -3503620, -2665564, -11221139, 726923, -9248138, -691490, --6421513, 389768, 960999, 5474473, 2644626, 5009543, -3512210, 978179, 3114925, -516470, -12402255, -8127152, -3996467, 16318728, 16371878, -3149822, -978179, -10169946, -5184026, 593242, --2790655, -6706055, 9907953, 3111704, -2517388, 14537927, 2854006, -6866042, -141734, -13207561, --6612639, -7454990, -6404870, -1688996, -10321343, -7408819, 4321811, 4027606, -714038, 2408403, --3029563, 3550864, -2263985, -3315715, 634045, -4807142, -2185602, 6353867, 548682, 3206730, --1631014, 722628, 526670, 1553704, 1406065, -192737, -79994, -3023657, 9127, 745714, -546535, -791885, -836445, 2181307, 668404, -363998, 118112, -449361, 113817, 1248762, -774705, -333934, -1130650, 408559, -736050, 13082470, -3531000, -188979, 9000104, -2201171, -5306969, -2971581, -11501922, -784905, -17717, -2399276, -6825240, -7625715, 3920768, -6050535, -10590852, -3308736, -7728257, 6524592, 13302051, -3358665, 3712462, -3631395, 7677791, 120796, --16217797, 5718212, 8977019, 846645, -2716030, -9470940, 7880191, 5232881, 5069135, 982474, -3190087, 10516764, -7477538, 1264868, 2054068, -5937793, -11400991, 10790568, 6020471, 20129974, --1042066, 8847633, -2980171, -6402186, 1065152, -1052267, -299037, -1866700, -6589554, 14434848, -324270, 1069984, 2041183, -2085207, 11916387, 1451699, 9975598, 4105452, 1669669, 10611790, --5047661, -12033961, -2374580, 2145873, 1536525, -5017059, 5837935, -3611531, -16759499, 1447941, -3316789, -9320616, 4300336, -1029718, 1796370, -47245, -3813931, -4275103, -29528, 1514513, -5099737, -533650, 1422171, -2046015, -1476395, 2237141, 1504849, -364535, 1551557, -1779727, --205622, 41876, -2306934, -3383361, 2051384, -3758633, -964220, -1683627, -3229816, -972810, --440234, -1273995, 1391569, -629213, -1365800, -481573, 6146635, 2333778, 2339147, -1325534, -870268, -2010045, -2513630, -905701, -873489, 986232, -1666447, 2894808, -3871376, -1302986, -818728, 10547903, -17708688, 2812130, 7810398, 11670500, -12429098, -1858647, 8282845, 5753109, -7055021, 1182727, 14987288, 2717104, 6162205, -1950989, 802622, 6143951, 3321084, 7104950, -478352, -10043781, -14637785, 7640210, 3641059, -2842732, 1617055, 4265977, -13704167, 55298, --8683887, 3947075, -564251, 8849780, -2957085, 3914863, -2159295, 2240899, 1120987, -447750, -4922570, 6636262, 2301029, 3815005, -10764799, 4345433, -1982127, -18661632, -12457553, 3099893, --13683229, -1001801, 11116986, -8254927, 22187264, 7993471, -4597763, 12033425, 457951, -4027606, --9108015, -8977555, -12490839, -1989644, 7124277, -8921721, -1214402, 7969312, 3553012, 4473209, -16219944, 1953673, 10562935, 18790, 1977833, -17597554, 4736812, 1258425, -16082505, -15171435, -8595840, -5824513, 890132, 4529043, -2729452, -4169340, 794569, -973347, -1222455, 862752, --2986076, 2509872, -2185602, 514859, -5173288, 2680597, 710817, 1057099, -410169, 6164352, --5178657, 380105, -1552631, -1308891, 1114544, 1219234, 1593970, 2940442, 4850092, 3035468, --3360275, 727997, -555125, 4500052, -1650878, 2886218, -4815195, -3592203, -2842732, -2309082, --467615, -302258, 2153926, 2658048, -9218610, -298500, 5756867, -102005, 4033511, -9443022, -7299834, -599148, 2107755, 6801081, -12738873, -8763881, 2285996, -193274, 6954089, 14372571, --1359894, 3568581, 15435576, -5762773, -10500658, -622770, 11302743, -2474975, -13066901, 1025960, -4795331, -2585034, -4102768, -980863, 16743930, -3214246, 14410689, 10879689, 13146895, 703838, -1057099, 7669738, 2564632, -2692945, 2696703, -10446434, 7843147, 13164075, 8260833, 1109712, -7344394, -5807333, 5637145, -5650567, 8251169, -7475928, 129386, -617938, -594316, 23432268, --3523484, -1335198, -2056216, 3235721, 6454799, 12326556, 14088566, -7730405, 3366718, 14012331, --7883413, -9797357, 5867462, -4279398, 6049999, 26770532, -12672301, 1789928, 2494839, -7000797, -3009162, 8724152, 6120329, 704375, -5500780, -13220983, 6242198, -5778879, 7223598, -4982699, -1006096, -6556805, -1445257, -10952167, 922881, -3492345, -3876208, -1382443, 1315334, 2738579, -5410585, 2272038, -3119220, -799938, 5516349, -3284039, -2874407, 368293, 381178, -4998805, --75162, -2532957, -1245004, -960462, -903017, 1888712, 1186485, 3893388, -2513630, -2534031, -292595, -3030636, 1401770, 6128382, -3085934, -3306588, -6125160, 3110630, -1553168, -4185446, --1504312, -9036074, -14268955, -10978473, -14848776, -5697274, 1725503, 11969537, 8891119, 3240016, -12618614, 3814468, 7731478, 7099044, -3347927, 10929081, 11870216, 8371965, -15877420, -8903467, --9167608, 3505767, -6300180, 469762, 4607963, -4607426, -11178189, 7300908, -5260798, 2605435, -2494839, 11497091, -11889543, 18626736, -18299782, 19026168, 39728, 9552544, -9139690, 3369939, --20459076, -11429445, -9908490, 9067213, 4261682, 13139916, -1213865, -40265, -6570763, -16465294, -10850698, -8990440, -4576288, 7838316, 18783502, 18078592, 8581882, -1205275, -12126840, 7195144, --18677202, -1464047, -10556493, 6049999, 20384452, -19459960, 7211250, 9026411, -11979201, -1205275, --1944547, 6777459, -7897908, -11559904, 2424509, -4683125, -16840566, 8602283, -1547799, -15952045, -11968463, 15640123, -5028333, 511101, 2348810, -6756521, 10308458, 4694400, -2735894, -2549600, --6528887, -3832722, 8304320, 4650376, 4804995, -377420, -7199976, -2239289, -2340220, -8193724, --1581085, 2428804, -329639, -2420214, -577673, -5852430, 931471, -2010582, 4136054, 2174327, -1002338, -6781217, 5750961, 485331, -2735357, -1739462, -923418, -372052, 3495567, -2524367, --843424, 2496450, 7050189, 3406446, 2226404, -4184909, 5673652, -13493177, -15786152, -4325569, -10481868, -12045236, 8275328, -16616155, -2813741, -6276558, -5732708, -13135621, -1001264, -4786204, --7816304, 6594923, -8730058, 9788767, 2218888, 7686381, -11595338, -21860310, -1640678, 4733591, --9039832, -6573985, 3798362, 3061775, -10604811, -4939213, 15554224, 7643431, -1830193, 8588861, -22254374, 969589, 2992519, 2445447, -1479616, -177704, 3447785, 3139084, -16756278, -5980742, --20518132, -6365142, -19121732, -8925479, 1249299, 22753662, 10733123, -10990821, -12921409, 8595303, -18024904, 11449309, -7778186, 13842143, -5004711, -854699, -23734526, -6943889, -2885681, -2780991, --16170552, -26058640, 8607651, 106837, -18990198, 5055177, 30221538, 4079682, 3598646, -18801220, --1506997, -114354, 4401268, -21134460, 19863150, 3263638, 5633387, 11027329, 4401805, 11947525, --701153, 5688684, -4427038, -9071508, -7476465, 4202626, -5985037, -1815697, -8064338, 2914672, -6953552, 265751, 5888937, 773094, -2084670, 31675, -4551055, 3430068, 3607236, 735513, -822486, -3112778, -1123134, 1927904, 5143224, 3709241, -4151623, -1431835, -1596654, -9844602, --13611288, -10057203, -3134253, -1173600, 1801202, -2275259, -3716221, -4140885, 188979, -2748242, --3486440, -6098854, -3165928, 10053982, -5978595, -5325223, -1372779, 12293270, -18218178, -3615826, -4514548, -8704825, 21276194, -17325362, -17822504, -14488535, 20585242, 9248138, -11709155, -10574209, --6985228, -2122788, -6279242, -6506876, 1151588, 7732552, 20347944, -2142115, 8755291, 7587060, -7432978, -13399761, -16684874, -12011950, 14275398, -2366527, 17314086, 5777805, -1746441, -23394686, --18983756, -1905355, 1712618, -13540421, -8360154, -6324340, -6376953, -30719754, -6533182, -7452305, --10937134, -5368172, -7096897, -14066018, 10098005, 19275814, 10844792, 594853, 11513197, 14490146, --4971425, 4635881, 3843459, 1489280, -423591, -3612068, 10298795, 4139275, 17153026, -3885335, -1860258, 6111739, 33609192, -336081, 17956184, 22534082, -1767916, -19539416, 1883880, 19576998, -3066607, -16634408, -14754823, -19077170, 12683575, -15575699, -4032438, 22437982, -9418326, -14949171, -4845797, -4061429, 650151, 6163278, -9180493, -4172561, 2086280, -2763812, -4039954, -805306, -1942936, 11224897, -820339, -5768141, -4767951, -12885, -4068408, -3497714, -2900177, -5607617, --2433636, 2149094, -2445984, -515933, -7418483, 1988570, -479963, 1561221, 7916162, 4803921, --4263829, 2094870, 1926830, -6760816, -10036802, 3842922, 4387309, 576063, -10256382, -11399380, --1522029, -7976291, -2312840, -1199907, -10116259, 18689014, 13568339, -31836982, 9867150, 12446278, --5721434, 8987756, 29911226, 2287607, 6528351, -10696079, 6806987, -11295227, -7259032, -6109054, -2048699, 7546258, 10663867, -1748052, 4305168, -3471944, -1996623, -6007049, 7813083, 28192166, --9423158, -9358197, 10034117, 6974490, 881542, -20857972, 13243532, -16672526, 9305584, 11639898, -1178969, 2798708, -3546032, 19320374, 14650670, -41339, 9813463, -8032126, 12410845, 1883880, -14034343, 20468740, -586800, 5028333, -2823941, -7845832, -650151, 8795019, 10046465, -19985020, --12125230, 4407710, 21351356, -10629507, 14135274, 9316858, 2657511, -23255638, 2688113, 3354370, --27569932, 15954730, -15475841, -18512920, -34862788, 8227010, 20994338, -9790378, -19492172, 3782793, -23284092, 14669998, 2515240, -3292629, 244276, 8000451, -7232188, 10755135, 17876728, 16859894, --1338956, 6999186, 17692580, -3053185, -303869, -2226404, 15231565, -2520609, 3702262, -7425462, -3833258, -4676683, 542240, -63888, -1245004, -3746285, 3309272, 8725763, 3002182, 2273648, --8170102, 1780801, -8428873, 2258079, 13215077, -5116380, 189515, 1445793, -6290517, -8489003, --9427453, -2444910, 5980742, -3077344, 1612223, -6012418, -566936, -95563, -17421998, -4793184, --711354, 3351685, 4487167, -3944391, 6234682, 2954401, 3359738, -5499706, -5004711, -3466576, -1622424, 8037495, 22104586, 16107201, -5177583, -42331196, 5294084, 21626770, 10465762, 4931696, --18414136, 183073, -12628278, 3299072, -968515, 3832722, 6692633, 9236327, 4086125, -22871238, -13692356, -2923262, 4333622, 17901960, 7044820, 3595425, -6036577, 22135724, -510027, 22004728, --26101590, -7444252, 8665633, -15054934, -13020193, 1239098, -3217468, -11714523, 1656247, 19485730, --394063, 1585380, -9836012, -20645908, -13122199, -5674189, 8920647, -1992865, 2253784, -9992241, --10982231, -5181878, 16899086, -11150809, 9826348, 6773164, 5626407, 2178622, -17030620, -24274618, --1784559, 16783658, -20216948, 10193568, -17378512, 11343545, -18294414, -608275, -18035104, 26204132, --23405962, -13776108, 6314139, 4583267, 12064026, 10203232, -5912560, -2923799, -5951214, 3553012, --50466, 15766288, -18951006, -7243999, -24410446, 13071196, -8544301, 1309965, -825171, 7067906, --5245229, 2869038, -9868761, -14967424, 10051297, -7564511, 455803, 2885681, 13285408, 5580237, --9185324, 2366527, -2970507, -11735461, -2025614, 3196530, 4027606, -10572599, -5121212, 12432857, --1009317, -9800578, -4236449, 14530948, -16399796, -5277441, 3627100, -3496640, 6161668, -877784, --7068980, -9472550, -2906619, -4037806, -2808909, -2861522, 2955474, -390842, 6437082, -6136972, -3696356, 1570347, -2677375, 6579890, -36390720, -5186173, 10853382, 2627983, -8694088, -13014825, -1171452, -12375948, -1178432, -19092204, 17810156, -7175817, 11138998, -24817932, -14079440, -562641, -30334280, -24902758, -2183991, -19507204, -15501074, -4789426, 18997178, -4488241, 8417599, 8832600, --10125385, -21645562, 30370788, 13156022, -17418240, 3289945, 2209224, 8302172, -16947404, 15087683, --1367947, -31877248, 3337190, 6269042, 8175470, -26433914, -6328635, 3221226, 23180476, 4312684, -12907987, -34082712, -20673288, 10314901, -16106, 22063784, -5957120, -3857954, 1685238, 11155104, -10314364, 3821984, -43211664, 12048994, -5038534, 9761387, 23019950, -7413114, -2052994, -26446798, -8536248, 11764452, -13839995, -8356933, 23829552, 37484864, 9844065, 5987185, -10653130, -4566087, --20548198, 1415729, 258235, -25531970, 9259413, -925029, -7421167, -2100776, 11950210, -9888088, --6539625, -1306207, -2705830, -1091995, 10558103, -4731444, 227096, 5886253, 2435783, 8163659, -7055021, 5156108, 3794067, 9800578, 11728482, -15867757, 5005248, -9986336, 7776575, 948114, --9887015, -6942815, -3828963, -3507915, -6471979, 5787469, -3281892, -6662568, 10812580, -1942399, --3379603, 5899675, 11139535, -287226, -3946538, 2809982, 10400800, 10989748, 7124814, -3947075, -1939178, 1818919, 9370545, 5445482, -30714384, -19923816, -6546604, 157840, -17288854, 14591615, --36384280, 2274722, -22150756, 12224014, -7910256, -24674588, -1745367, -6298033, -8382703, -28172838, --20431696, 6463389, 23068270, -14691473, 28363428, -23289998, -15151571, 5567352, -1852205, 13131863, --7432978, -7822209, -11065983, -2758443, -38685844, -10805601, 1593970, -1242319, -6067178, -14954002, -12750684, -13182328, 21364778, -6026913, -2152852, -14375792, -13200045, -25484188, -10836739, 10024991, -4398584, -1116155, 2160369, -8877697, -6585796, -11576011, -9634149, 5730560, 8154533, 4060355, --22073448, 26203058, 3936338, -10755672, 21061982, 15163382, 25014964, -4258997, 14775224, -33272038, --17776870, -31419296, 32803350, -10059350, -22160958, -21348672, -45699524, -18920942, 32339494, -1730872, --15770046, 12037183, -31058520, -20692078, 8315057, -1504312, -25853556, -25310780, 99858, -14406931, -4346507, 5817533, -19131394, 19366544, -11227581, -16751446, 1882269, -9807021, 27599996, -10174778, -12618077, 2255932, 16928614, -8118562, -4450123, 1890323, -7156490, 15569, -15479599, -11719892, --2683818, 6894497, 690416, 11277510, 4806069, 8435316, -6757594, 227633, -13440563, -3118146, --4621922, 4389994, 13526463, 6336688, 5635534, 6532646, 5796595, 1707786, -17646410, -5095442, --12084427, -2852395, 2406792, 8553964, 40581000, 51857436, -4583804, -22624814, -5130339, -8384850, --22818088, 10234370, 980863, -16512002, 49631032, 17353816, -11323681, -33927556, -2702071, 8479876, -9359807, 10242960, 23951958, -6559489, -11273752, 11291469, -42378444, -28370406, -10774462, -2866891, -4993437, -22643604, -20449950, 22184580, 17913234, -13273060, -25460566, 16601122, 916439, 29146722, --23152022, -5260798, -7598871, -1318555, -18196166, -27644558, 23804856, -17095580, -10418517, -21107080, --4277251, 14150843, 13661217, -8446053, 2342905, 2579128, 18109192, 27078158, 20365662, -34467648, --16100759, -20415054, -4616553, 11880416, 4837744, -23550916, -33442226, 28876138, 2363843, -28159954, --46304580, 23687282, -5550172, 12767327, 12302934, 12479027, 2218888, 9218074, -17845052, -6940131, -13214541, 2334852, -8039642, 5257040, -1607928, -24817394, 13123273, -31520228, -1461900, -1527398, --4886599, -11316165, -3793530, 13881871, -329639, -3167002, 7742216, -10196252, 31351650, -2427194, -3386045, -2286533, 943819, 7649337, 169651, 7364795, -15023796, 3375844, -2212982, -10966662, -1789928, 5201743, 10910291, -5200669, 3544422, -26215406, -7869454, -1487669, -13007845, 11604465, --862215, -3223373, -6655052, -10851772, -15180562, -22392886, 7490423, -2319819, 17090748, 19314468, -13103408, -13309030, -17619566, -23412940, -7976828, 21305186, 18254148, 2884608, 8953933, -7611756, --12651900, -10366440, 814433, 2962991, -9757092, 4614406, 18109730, 22435298, -27785218, -23295366, -66279936, -5314485, -6478422, -9914395, -20917028, -2248952, 23911694, 38454988, -17696340, -10654740, --3901978, -17446694, -4356708, -9819906, 15265924, -15760382, 17473538, 8375186, -6011344, -21994528, --1627793, -9035001, 33062122, -18128520, -459562, 99321, -3313567, 15008226, -9548786, -1203128, -6858526, -4481262, -32321240, 16525424, -14760729, -17013440, -3954591, -18147848, -10601053, -33013266, -31609886, 1512902, -21113522, -38689064, 22524420, -22793928, -22360674, 368830, -17428978, 7912404, -14261976, 44146896, -12585328, 17333414, -3768834, -21234318, -18170932, -5209259, 66242356, -58402964, --4349192, 60978872, -55790016, -21049098, 31304942, -4540854, -25259240, 58982248, -29237452, -12015171, -26944478, 6804839, 11442330, -17352742, 19422916, 27567784, 12764643, -6913824, -1916629, 27846958, --4155918, 15982647, -495532, 11192685, -16003585, -1948841, 7187628, 4585952, 2929705, 862215, -994822, 11668889, -5438503, 3112241, 4135517, 4038880, -25070260, -10124312, 7834557, -20970714, -6200859, 12193949, -9082245, -9264244, -7429220, 5200132, -10385231, 12236362, 10074383, -1177358, -5761162, -7344931, -15200963, -14472966, 28927142, 5418101, 17971216, 3912715, 3396246, 11696807, --10124312, -2157684, 18261128, -10781442, -25393994, 19082540, -2749853, 11245835, -3125126, -7248831, --7377143, 30946850, -40259412, 35478040, -6465000, -22613002, 18916646, 6415608, -3923453, 3686693, -2272575, -4658966, 6680285, -8061117, -10328859, -4901095, -14176076, -11882564, -26322244, -10304700, -22008486, 20710870, -32642826, 10444287, 16807280, 14003204, -5893232, -32259500, -3226057, -16154983, --37682968, 23185844, 59471876, -34701188, -4060355, 42130944, -12411919, -15529528, 34176664, 25256018, -12305081, -14301167, -28155122, 8904004, -11673184, -17956184, 62213140, 45656576, -38080252, -28167470, -33443836, -62001076, -22024056, -17833778, -10975252, 42698956, 28302760, 18456548, 20345796, -72784128, --25606058, 68602440, 39628052, 7792145, -18756660, 23379654, -24637544, -49582176, -33136746, 23603530, --18291728, -4254165, 27514634, 51201380, -6561637, -29462938, 3385508, 20002200, -35525820, -13430900, -36294084, 32564442, 32683628, 22536230, -6933688, -21336860, -10739566, 27611272, 7744900, 11382737, --5738077, 2751464, 12404939, 724776, -5434744, -6365142, -8362302, 5834176, 4160750, 26458072, -7176891, -5716602, -11064373, 2246268, 983011, -4354023, -9761387, 2259690, 20423644, -22497576, --6979322, 19568944, -4931160, -932008, 12906377, -5494337, 9452149, 3733937, 11164231, -22752590, --3575024, 4276177, 25067040, 5732171, 11827803, 10197326, 5498095, -5313949, 8021925, 11610907, --13967234, 6276021, -61499636, 26322780, 105764, -6488622, 31217970, -5553393, -23900420, 11709691, -10685879, 30495342, 17223892, -16831976, 716723, 4523675, 20870856, 4650913, -24391656, -1165010, --1551557, 4705137, -22694608, -24813100, 35451196, -13075491, -37393060, 18909668, 32902670, -18847390, --6476274, 1916629, 22514756, -27296128, -35650912, 9483288, 29848412, -6767258, -12921409, -7684234, --7443179, 12771622, 5429376, 7515119, 75459888, 3891240, -9783399, 741419, 2254321, 40529996, -1175210, -14810658, 9084930, -32218160, -18852758, 7966628, 56371, 34770980, 27752468, -18347564, --5375689, -17368310, 716186, 12250320, 3103114, 3568581, 12499965, -9378061, -37241124, 9113921, -25006374, -12210592, 22063784, -34765076, 16130823, 10011032, -30222074, 4791573, 540629, -13533442, -1327682, -6012418, 14949171, 14239427, -25313464, -15983721, 33683280, -26145076, 12370043, -2825552, --9917079, 6976638, -1024350, -15575162, 8609799, 4788352, 6165426, -921271, -2574296, 1221381, -4677757, -6235756, -5466420, 4111358, 3304977, -3673808, -252329, 6969122, 12585865, -7933879, --5038534, 1094680, -2201171, 3877282, -3059627, -2216203, 2967823, -689879, 7610682, -2936147, -3798362, -10331007, 6020471, -7390565, 6367289, 10451803, -881005, -393526, 1643899, -13316546, -10450729, 21100100, -39589936, -130214280, -154093232, -13858249, -106873816, 41982232, 260532176, 140152832, -211603376, 223013488, -24254218, -64273648, 19048716, -162438880, -198572448, -61350924, -218593968, -175475184, -44484588, -126225328, -34413424, 251605088, 91071560, 177882512, 307292576, 182902800, 81787448, 62261456, -21759914, -136901008, -170455440, -56240448, -232802800, -232939696, 30671436, -174201184, -142995568, 85938536, --146616768, -150730272, 113749528, 46227268, -20840256, 268606176, 251486448, 160610832, 340967264, 321362336, -109740176, 127911640, 99643240, -161809136, -162257424, -205122800, -406199232, -479413376, -344867072, -343273120, --253272608, 8677445, 23332946, 167186432, 289026080, 356322304, 324591072, 376766880, 322743168, 190393760, -127935264, 42631308, -63723356, -143001472, -203539568, -174811616, -253581856, -283915584, -235557488, -275279488, --206656112, 32745904, 66126392, 160399312, 321615200, 256187280, 197332816, 149243664, 58674084, -48759152, --39924944, -80635864, -101040720, -77058696, -87799872, -84696752, -36244156, -34275988, 1788317, 52346524, -37096168, 73486888, 88126288, 15408732, 63887640, 61531848, -17208860, 20471962, 14237817, -46772732, -1871532, 15173583, -54303420, -59117004, -82729664, -169825696, -190070560, -147715744, -141366160, -46255188, -69153808, 124996968, 203141216, 306776640, 330991104, 307147616, 214999088, 65689376, -69609072, -148442128, --221878544, -273578688, -269337952, -210184432, -144614768, -68605664, -21357798, 8660265, 24625194, 62510564, -102779640, 106274672, 98368712, 101282848, 71738304, 64864208, 55816320, 22701050, 4789426, 14002130, -11826192, 7431367, 4471061, -12984760, -34911104, -52956948, -76360760, -96848832, -97089344, -78134584, --60030220, -31525060, 5239860, 32794760, 47868484, 55713780, 49017388, 43458088, 47481400, 46005004, -36797132, 31502512, 26009786, 17885318, 9236864, 511101, -17603998, -32460290, -35913980, -33692944, --30681636, -28620052, -26534844, -19709068, -7157026, 732292, -2668249, -8731132, -4916127, 675921, -3926674, 7726110, 8959302, 12268574, 19513648, 26594974, 26102664, 26889716, 23726474, 15349139, -9273908, 5373541, -2098629, -8809515, -13642964, -24398098, -33830920, -37126236, -38620884, -33381022, --21327734, -5653251, 11912629, 27623082, 35036196, 34208876, 26719528, 17685602, 8708583, 462246, --4380867, -6918656, -7317551, -6398965, -6178848, -6049462, -5478768, -4278325, -3321084, -1988570, --689342, 200790, 984084, 1385127, 1319092, 1007170, 503585, 139050, -35433, -62814, --51540, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +2694555, 4660577, -3473555, -3004867, -4648765, 4219806, 2105071, 372052, 6239514, -619012, +-73551, -1902671, -1538672, 1357747, -1663226, -3244848, 1832877, 532039, 5211943, 7121056, +-1848447, -4182761, -5153961, -320512, -2945274, -2838437, -1946157, -391916, -4104915, 3961571, +-1467268, -1548336, -2713883, -1999844, 762894, 4450660, -459025, -1278827, 1347546, -4363687, +3281355, -2720325, -9791452, 4862977, 3233037, 5401458, 5602248, 1070521, 2952253, -2918430, +834834, 4247186, 335007, -46171, -1017370, -558346, 2280628, -2063732, -1488743, 111669, +2168422, -1791001, -2232309, -3270618, 4197257, 1670205, 521839, -1015760, -4190814, -139586, +3140158, 1953136, -593242, -788663, 3145527, -375810, -225486, -1362578, -1288490, -1911797, +-2265595, 147640, 483721, 1085016, -2331630, -919123, 1304060, -1612223, 1407139, 385473, +633508, -598611, -33286, 311385, 688805, 178778, -266825, 435939, -292595, -791348, +-254477, -1314797, 882616, 458488, -372588, 25770, -592706, 795643, 817118, 269509, +85899, 313533, 293132, -814433, 34897, -153008, -195421, -314069, -106300, 469225, +142808, -14672682, 7678865, -707596, 234076, 2680597, 3770981, -5457293, -679679, -967978, +3139084, 1202591, -3332895, 10461467, -1103807, -633508, 4664335, 3830037, 1263794, 2661806, +8543764, -4207458, 284542, -2138357, 870805, -2611877, 230318, 279710, 976568, -4721243, +425202, -1123671, -1762547, -190052, 2994666, -1627256, 2785823, 4041027, -6929930, 949725, +-2805688, -755377, -4258997, 2147484, -2519535, -423054, -1414118, -4334696, 1681480, -2904472, +2003065, 1102733, -2130304, -3152506, 121870, 2951180, 2232309, 5353140, 2490007, -2297271, +-6537477, -428960, 1178432, 8282845, -2543158, -1245004, -69256, -1601486, -4289062, -2046015, +-3991635, -530428, 3352759, -743029, 3987340, 2564096, 2071785, 2888903, 542240, -5163625, +-1185948, -3319473, -2093260, -5735392, -171262, -1627793, 798327, 1567663, 704375, -846109, +-1146219, 206158, 1541893, -1286343, -332323, 45097, -443992, -111669, -506269, 618475, +-1951526, -669478, -442382, 67646, -168041, -358093, 30065, -2901251, 10624138, 5491653, +-1836635, -4421669, 6037651, -7270843, -1297080, 3882651, -3061775, -2238752, -3189013, 6978248, +-2599529, 2083059, 489089, 2056216, 9569724, -9826348, 2786897, 4762045, -3346853, -9103183, +-4799089, -722628, 455267, -1384053, -1735704, 3661997, 5372467, -559956, -3994320, 185220, +-5032091, 1358820, -3200825, 1630477, 5745593, 2038499, -5992553, -263067, 250719, 8659191, +1531156, 4281009, -1369558, 1839857, 1428614, -10703595, 64425, 4916664, 2220498, 5510980, +-5077725, -3159485, -5055714, 1240709, 3073586, -1115618, 979789, 171799, -2586644, 841277, +-1967632, 1585380, 1495186, -466004, 2496450, 431644, -482647, 1044214, 6206765, 1056562, +3194382, 4002910, 2173790, -3758, -192200, -6015639, -106300, 6198712, 2132988, 2692408, +-213138, -538482, 3869766, -3063386, 236760, -374199, 1923072, 967978, -70867, -2673080, +337155, -1402307, -468688, 333397, -912144, -710280, 537408, -179315, 1955821, 753230, +1781338, 792958, 487479, 907849, -835371, -1119913, 39728, 13959, 2250026, 1324997, +265751, 703301, 2136209, -476741, 144955, 585189, 897648, -23622, 22066468, -5772436, +-2124398, -3416647, 4468914, 2960306, 7472170, 2927020, -1167694, 3546032, -216359, 3972845, +1505386, 5545877, 61203, 4643397, 6068789, -6859600, 1161789, 1690607, 1076963, 1003949, +1461900, -4107063, -66035, -4719632, -727997, -236760, -7937100, -5425081, 1918777, -103616, +-331249, 3067681, 3022583, -1674500, -6848326, 1966558, 6073084, 3962644, 5661304, -1611687, +3036542, 5596880, -9494562, 2922188, 4102231, -4740570, 5792301, -4143033, -905164, 502511, +1102196, -3219078, 2714956, -905164, -1112933, -3347390, -2718178, 3196530, 3243237, 1404991, +3192771, 4958003, 2716567, 6922951, -1517197, -7962870, 7585986, 1165010, 3702799, 1503775, +-1340030, 1909650, 1415729, 249645, 5197448, -1684164, 5128728, -7495255, -1739462, 876173, +2265059, 419296, -4085051, -1955284, 642098, 146566, -459562, 162672, 1536525, -2076080, +-1162862, -1210107, -1474248, 759136, -464393, -638340, -1204738, -947040, 2224793, -628139, +-767189, -120796, -813896, -744103, 1120987, -544924, 1199907, -351114, 79457, 857920, +-290984, 20938, 9922448, -11135776, 7601555, 1697586, 7781944, 1891396, -4197794, 1532230, +6024766, -6939057, -1371705, 922344, -7831873, -1459215, -5990406, -3628711, -4330401, -4773320, +2199023, -7485055, -4592931, -5941551, -1418413, 5957120, 2234457, -7171522, -2710124, -7506529, +-1756642, 1771137, 11062225, -8698383, 3738769, -2133525, -3100967, -6456410, 434329, 1226750, +7138236, 3791383, 1010391, -5845988, -10205379, -46708, 3157338, 8221105, 2958159, 2707977, +-5873368, 2292439, 5215164, 497142, 920197, -3107946, -3055332, -971200, 3089692, 633508, +-1932735, 165356, -6468758, -841277, -5430450, 3608846, -1036161, 3607773, -5316633, -4510790, +-7369090, -767725, -4691715, -1975148, 2054605, -7180112, -3008625, 941672, 4147865, -8646306, +5240397, -4016331, -4280472, -4548907, -3746285, 2728378, -2471754, 1317481, 1649804, -2222109, +474057, 1918777, 1555315, 191663, -1934346, -213675, -855235, -2251100, -269509, 1832340, +1175747, -1066226, 1735704, -1265942, -886911, -163746, 690416, -1655173, 271657, -120259, +1338419, 1024887, 2110977, -1486059, 618475, -265751, -517544, 701153, -1661616, -548145, +1082869, 586263, -692564, -27327266, 4422743, 3134789, -7876433, -1744294, -16106, 285615, +-1493575, -2612414, -2001992, -8115878, 6274411, -3927211, 883690, -6760279, -2385318, 9797894, +8893804, -5621576, -3374771, 287763, -134755, -4614943, -5363878, -3816615, 663572, 420907, +186831, -555661, 2307471, -6672769, 2108292, 226560, -11745662, -1417339, -3496640, 5377299, +7888781, 1222992, -1358283, 369367, -6871411, -8647380, 4659503, 8537858, 9545028, -2577517, +1764158, 5541045, 5758478, -2980171, 5315022, 8598525, -330712, 7235410, 6176700, -7240241, +2397666, 401579, 7803419, -4781909, -5044439, 4459250, 5924371, -1831804, 561567, -8534637, +6028524, -4784594, 6362457, -10610717, 1187022, 2493766, 5091147, 321049, -4393752, -9058623, +-5499706, 7569880, -7464653, -381178, 892279, 4069482, -2228014, -1634235, 3241090, -6069326, +-5214627, 2124398, 1483911, -473520, 4365298, -2037425, 1072668, 1079111, 1204202, 1597728, +401579, -1721208, 1098975, 2189360, -874563, 270046, -400506, -1163936, 960462, -2836826, +-343061, -3056943, -523986, -613643, -930934, -1592359, 679679, -941135, 13422, -2391223, +992674, -474594, 871342, 902480, 414464, 342524, -10536092, 3815542, -9303973, 11908871, +11454141, 410169, -15377594, 6453189, 934155, -2817499, 10710575, 107911, -9140227, -915902, +11638288, -14463302, 517007, -3571265, -11407433, -3125126, 265751, -2193118, -5814849, 3445101, +-4807142, 4019553, -4086662, -7702487, 4197257, -515396, 6005975, -11500312, 4776004, 9167608, +-3604015, 814433, 9205726, 13447006, -3503620, -2665564, -11221139, 726923, -9248138, -691490, +-6421513, 389768, 960999, 5474473, 2644626, 5009543, -3512210, 978179, 3114925, -516470, +12402255, -8127152, -3996467, 16318728, 16371878, -3149822, -978179, -10169946, -5184026, 593242, +-2790655, -6706055, 9907953, 3111704, -2517388, 14537927, 2854006, -6866042, -141734, -13207561, +-6612639, -7454990, -6404870, -1688996, -10321343, -7408819, 4321811, 4027606, -714038, 2408403, +-3029563, 3550864, -2263985, -3315715, 634045, -4807142, -2185602, 6353867, 548682, 3206730, +-1631014, 722628, 526670, 1553704, 1406065, -192737, -79994, -3023657, 9127, 745714, +546535, -791885, -836445, 2181307, 668404, -363998, 118112, -449361, 113817, 1248762, +774705, -333934, -1130650, 408559, -736050, 13082470, -3531000, -188979, 9000104, -2201171, +5306969, -2971581, -11501922, -784905, -17717, -2399276, -6825240, -7625715, 3920768, -6050535, +10590852, -3308736, -7728257, 6524592, 13302051, -3358665, 3712462, -3631395, 7677791, 120796, +-16217797, 5718212, 8977019, 846645, -2716030, -9470940, 7880191, 5232881, 5069135, 982474, +3190087, 10516764, -7477538, 1264868, 2054068, -5937793, -11400991, 10790568, 6020471, 20129974, +-1042066, 8847633, -2980171, -6402186, 1065152, -1052267, -299037, -1866700, -6589554, 14434848, +324270, 1069984, 2041183, -2085207, 11916387, 1451699, 9975598, 4105452, 1669669, 10611790, +-5047661, -12033961, -2374580, 2145873, 1536525, -5017059, 5837935, -3611531, -16759499, 1447941, +3316789, -9320616, 4300336, -1029718, 1796370, -47245, -3813931, -4275103, -29528, 1514513, +5099737, -533650, 1422171, -2046015, -1476395, 2237141, 1504849, -364535, 1551557, -1779727, +-205622, 41876, -2306934, -3383361, 2051384, -3758633, -964220, -1683627, -3229816, -972810, +-440234, -1273995, 1391569, -629213, -1365800, -481573, 6146635, 2333778, 2339147, -1325534, +870268, -2010045, -2513630, -905701, -873489, 986232, -1666447, 2894808, -3871376, -1302986, +818728, 10547903, -17708688, 2812130, 7810398, 11670500, -12429098, -1858647, 8282845, 5753109, +7055021, 1182727, 14987288, 2717104, 6162205, -1950989, 802622, 6143951, 3321084, 7104950, +478352, -10043781, -14637785, 7640210, 3641059, -2842732, 1617055, 4265977, -13704167, 55298, +-8683887, 3947075, -564251, 8849780, -2957085, 3914863, -2159295, 2240899, 1120987, -447750, +4922570, 6636262, 2301029, 3815005, -10764799, 4345433, -1982127, -18661632, -12457553, 3099893, +-13683229, -1001801, 11116986, -8254927, 22187264, 7993471, -4597763, 12033425, 457951, -4027606, +-9108015, -8977555, -12490839, -1989644, 7124277, -8921721, -1214402, 7969312, 3553012, 4473209, +16219944, 1953673, 10562935, 18790, 1977833, -17597554, 4736812, 1258425, -16082505, -15171435, +8595840, -5824513, 890132, 4529043, -2729452, -4169340, 794569, -973347, -1222455, 862752, +-2986076, 2509872, -2185602, 514859, -5173288, 2680597, 710817, 1057099, -410169, 6164352, +-5178657, 380105, -1552631, -1308891, 1114544, 1219234, 1593970, 2940442, 4850092, 3035468, +-3360275, 727997, -555125, 4500052, -1650878, 2886218, -4815195, -3592203, -2842732, -2309082, +-467615, -302258, 2153926, 2658048, -9218610, -298500, 5756867, -102005, 4033511, -9443022, +7299834, -599148, 2107755, 6801081, -12738873, -8763881, 2285996, -193274, 6954089, 14372571, +-1359894, 3568581, 15435576, -5762773, -10500658, -622770, 11302743, -2474975, -13066901, 1025960, +4795331, -2585034, -4102768, -980863, 16743930, -3214246, 14410689, 10879689, 13146895, 703838, +1057099, 7669738, 2564632, -2692945, 2696703, -10446434, 7843147, 13164075, 8260833, 1109712, +7344394, -5807333, 5637145, -5650567, 8251169, -7475928, 129386, -617938, -594316, 23432268, +-3523484, -1335198, -2056216, 3235721, 6454799, 12326556, 14088566, -7730405, 3366718, 14012331, +-7883413, -9797357, 5867462, -4279398, 6049999, 26770532, -12672301, 1789928, 2494839, -7000797, +3009162, 8724152, 6120329, 704375, -5500780, -13220983, 6242198, -5778879, 7223598, -4982699, +1006096, -6556805, -1445257, -10952167, 922881, -3492345, -3876208, -1382443, 1315334, 2738579, +5410585, 2272038, -3119220, -799938, 5516349, -3284039, -2874407, 368293, 381178, -4998805, +-75162, -2532957, -1245004, -960462, -903017, 1888712, 1186485, 3893388, -2513630, -2534031, +292595, -3030636, 1401770, 6128382, -3085934, -3306588, -6125160, 3110630, -1553168, -4185446, +-1504312, -9036074, -14268955, -10978473, -14848776, -5697274, 1725503, 11969537, 8891119, 3240016, +12618614, 3814468, 7731478, 7099044, -3347927, 10929081, 11870216, 8371965, -15877420, -8903467, +-9167608, 3505767, -6300180, 469762, 4607963, -4607426, -11178189, 7300908, -5260798, 2605435, +2494839, 11497091, -11889543, 18626736, -18299782, 19026168, 39728, 9552544, -9139690, 3369939, +-20459076, -11429445, -9908490, 9067213, 4261682, 13139916, -1213865, -40265, -6570763, -16465294, +10850698, -8990440, -4576288, 7838316, 18783502, 18078592, 8581882, -1205275, -12126840, 7195144, +-18677202, -1464047, -10556493, 6049999, 20384452, -19459960, 7211250, 9026411, -11979201, -1205275, +-1944547, 6777459, -7897908, -11559904, 2424509, -4683125, -16840566, 8602283, -1547799, -15952045, +11968463, 15640123, -5028333, 511101, 2348810, -6756521, 10308458, 4694400, -2735894, -2549600, +-6528887, -3832722, 8304320, 4650376, 4804995, -377420, -7199976, -2239289, -2340220, -8193724, +-1581085, 2428804, -329639, -2420214, -577673, -5852430, 931471, -2010582, 4136054, 2174327, +1002338, -6781217, 5750961, 485331, -2735357, -1739462, -923418, -372052, 3495567, -2524367, +-843424, 2496450, 7050189, 3406446, 2226404, -4184909, 5673652, -13493177, -15786152, -4325569, +10481868, -12045236, 8275328, -16616155, -2813741, -6276558, -5732708, -13135621, -1001264, -4786204, +-7816304, 6594923, -8730058, 9788767, 2218888, 7686381, -11595338, -21860310, -1640678, 4733591, +-9039832, -6573985, 3798362, 3061775, -10604811, -4939213, 15554224, 7643431, -1830193, 8588861, +22254374, 969589, 2992519, 2445447, -1479616, -177704, 3447785, 3139084, -16756278, -5980742, +-20518132, -6365142, -19121732, -8925479, 1249299, 22753662, 10733123, -10990821, -12921409, 8595303, +18024904, 11449309, -7778186, 13842143, -5004711, -854699, -23734526, -6943889, -2885681, -2780991, +-16170552, -26058640, 8607651, 106837, -18990198, 5055177, 30221538, 4079682, 3598646, -18801220, +-1506997, -114354, 4401268, -21134460, 19863150, 3263638, 5633387, 11027329, 4401805, 11947525, +-701153, 5688684, -4427038, -9071508, -7476465, 4202626, -5985037, -1815697, -8064338, 2914672, +6953552, 265751, 5888937, 773094, -2084670, 31675, -4551055, 3430068, 3607236, 735513, +822486, -3112778, -1123134, 1927904, 5143224, 3709241, -4151623, -1431835, -1596654, -9844602, +-13611288, -10057203, -3134253, -1173600, 1801202, -2275259, -3716221, -4140885, 188979, -2748242, +-3486440, -6098854, -3165928, 10053982, -5978595, -5325223, -1372779, 12293270, -18218178, -3615826, +4514548, -8704825, 21276194, -17325362, -17822504, -14488535, 20585242, 9248138, -11709155, -10574209, +-6985228, -2122788, -6279242, -6506876, 1151588, 7732552, 20347944, -2142115, 8755291, 7587060, +7432978, -13399761, -16684874, -12011950, 14275398, -2366527, 17314086, 5777805, -1746441, -23394686, +-18983756, -1905355, 1712618, -13540421, -8360154, -6324340, -6376953, -30719754, -6533182, -7452305, +-10937134, -5368172, -7096897, -14066018, 10098005, 19275814, 10844792, 594853, 11513197, 14490146, +-4971425, 4635881, 3843459, 1489280, -423591, -3612068, 10298795, 4139275, 17153026, -3885335, +1860258, 6111739, 33609192, -336081, 17956184, 22534082, -1767916, -19539416, 1883880, 19576998, +3066607, -16634408, -14754823, -19077170, 12683575, -15575699, -4032438, 22437982, -9418326, -14949171, +4845797, -4061429, 650151, 6163278, -9180493, -4172561, 2086280, -2763812, -4039954, -805306, +1942936, 11224897, -820339, -5768141, -4767951, -12885, -4068408, -3497714, -2900177, -5607617, +-2433636, 2149094, -2445984, -515933, -7418483, 1988570, -479963, 1561221, 7916162, 4803921, +-4263829, 2094870, 1926830, -6760816, -10036802, 3842922, 4387309, 576063, -10256382, -11399380, +-1522029, -7976291, -2312840, -1199907, -10116259, 18689014, 13568339, -31836982, 9867150, 12446278, +-5721434, 8987756, 29911226, 2287607, 6528351, -10696079, 6806987, -11295227, -7259032, -6109054, +2048699, 7546258, 10663867, -1748052, 4305168, -3471944, -1996623, -6007049, 7813083, 28192166, +-9423158, -9358197, 10034117, 6974490, 881542, -20857972, 13243532, -16672526, 9305584, 11639898, +1178969, 2798708, -3546032, 19320374, 14650670, -41339, 9813463, -8032126, 12410845, 1883880, +14034343, 20468740, -586800, 5028333, -2823941, -7845832, -650151, 8795019, 10046465, -19985020, +-12125230, 4407710, 21351356, -10629507, 14135274, 9316858, 2657511, -23255638, 2688113, 3354370, +-27569932, 15954730, -15475841, -18512920, -34862788, 8227010, 20994338, -9790378, -19492172, 3782793, +23284092, 14669998, 2515240, -3292629, 244276, 8000451, -7232188, 10755135, 17876728, 16859894, +-1338956, 6999186, 17692580, -3053185, -303869, -2226404, 15231565, -2520609, 3702262, -7425462, +3833258, -4676683, 542240, -63888, -1245004, -3746285, 3309272, 8725763, 3002182, 2273648, +-8170102, 1780801, -8428873, 2258079, 13215077, -5116380, 189515, 1445793, -6290517, -8489003, +-9427453, -2444910, 5980742, -3077344, 1612223, -6012418, -566936, -95563, -17421998, -4793184, +-711354, 3351685, 4487167, -3944391, 6234682, 2954401, 3359738, -5499706, -5004711, -3466576, +1622424, 8037495, 22104586, 16107201, -5177583, -42331196, 5294084, 21626770, 10465762, 4931696, +-18414136, 183073, -12628278, 3299072, -968515, 3832722, 6692633, 9236327, 4086125, -22871238, +13692356, -2923262, 4333622, 17901960, 7044820, 3595425, -6036577, 22135724, -510027, 22004728, +-26101590, -7444252, 8665633, -15054934, -13020193, 1239098, -3217468, -11714523, 1656247, 19485730, +-394063, 1585380, -9836012, -20645908, -13122199, -5674189, 8920647, -1992865, 2253784, -9992241, +-10982231, -5181878, 16899086, -11150809, 9826348, 6773164, 5626407, 2178622, -17030620, -24274618, +-1784559, 16783658, -20216948, 10193568, -17378512, 11343545, -18294414, -608275, -18035104, 26204132, +-23405962, -13776108, 6314139, 4583267, 12064026, 10203232, -5912560, -2923799, -5951214, 3553012, +-50466, 15766288, -18951006, -7243999, -24410446, 13071196, -8544301, 1309965, -825171, 7067906, +-5245229, 2869038, -9868761, -14967424, 10051297, -7564511, 455803, 2885681, 13285408, 5580237, +-9185324, 2366527, -2970507, -11735461, -2025614, 3196530, 4027606, -10572599, -5121212, 12432857, +-1009317, -9800578, -4236449, 14530948, -16399796, -5277441, 3627100, -3496640, 6161668, -877784, +-7068980, -9472550, -2906619, -4037806, -2808909, -2861522, 2955474, -390842, 6437082, -6136972, +3696356, 1570347, -2677375, 6579890, -36390720, -5186173, 10853382, 2627983, -8694088, -13014825, +1171452, -12375948, -1178432, -19092204, 17810156, -7175817, 11138998, -24817932, -14079440, -562641, +30334280, -24902758, -2183991, -19507204, -15501074, -4789426, 18997178, -4488241, 8417599, 8832600, +-10125385, -21645562, 30370788, 13156022, -17418240, 3289945, 2209224, 8302172, -16947404, 15087683, +-1367947, -31877248, 3337190, 6269042, 8175470, -26433914, -6328635, 3221226, 23180476, 4312684, +12907987, -34082712, -20673288, 10314901, -16106, 22063784, -5957120, -3857954, 1685238, 11155104, +10314364, 3821984, -43211664, 12048994, -5038534, 9761387, 23019950, -7413114, -2052994, -26446798, +8536248, 11764452, -13839995, -8356933, 23829552, 37484864, 9844065, 5987185, -10653130, -4566087, +-20548198, 1415729, 258235, -25531970, 9259413, -925029, -7421167, -2100776, 11950210, -9888088, +-6539625, -1306207, -2705830, -1091995, 10558103, -4731444, 227096, 5886253, 2435783, 8163659, +7055021, 5156108, 3794067, 9800578, 11728482, -15867757, 5005248, -9986336, 7776575, 948114, +-9887015, -6942815, -3828963, -3507915, -6471979, 5787469, -3281892, -6662568, 10812580, -1942399, +-3379603, 5899675, 11139535, -287226, -3946538, 2809982, 10400800, 10989748, 7124814, -3947075, +1939178, 1818919, 9370545, 5445482, -30714384, -19923816, -6546604, 157840, -17288854, 14591615, +-36384280, 2274722, -22150756, 12224014, -7910256, -24674588, -1745367, -6298033, -8382703, -28172838, +-20431696, 6463389, 23068270, -14691473, 28363428, -23289998, -15151571, 5567352, -1852205, 13131863, +-7432978, -7822209, -11065983, -2758443, -38685844, -10805601, 1593970, -1242319, -6067178, -14954002, +12750684, -13182328, 21364778, -6026913, -2152852, -14375792, -13200045, -25484188, -10836739, 10024991, +4398584, -1116155, 2160369, -8877697, -6585796, -11576011, -9634149, 5730560, 8154533, 4060355, +-22073448, 26203058, 3936338, -10755672, 21061982, 15163382, 25014964, -4258997, 14775224, -33272038, +-17776870, -31419296, 32803350, -10059350, -22160958, -21348672, -45699524, -18920942, 32339494, -1730872, +-15770046, 12037183, -31058520, -20692078, 8315057, -1504312, -25853556, -25310780, 99858, -14406931, +4346507, 5817533, -19131394, 19366544, -11227581, -16751446, 1882269, -9807021, 27599996, -10174778, +12618077, 2255932, 16928614, -8118562, -4450123, 1890323, -7156490, 15569, -15479599, -11719892, +-2683818, 6894497, 690416, 11277510, 4806069, 8435316, -6757594, 227633, -13440563, -3118146, +-4621922, 4389994, 13526463, 6336688, 5635534, 6532646, 5796595, 1707786, -17646410, -5095442, +-12084427, -2852395, 2406792, 8553964, 40581000, 51857436, -4583804, -22624814, -5130339, -8384850, +-22818088, 10234370, 980863, -16512002, 49631032, 17353816, -11323681, -33927556, -2702071, 8479876, +9359807, 10242960, 23951958, -6559489, -11273752, 11291469, -42378444, -28370406, -10774462, -2866891, +4993437, -22643604, -20449950, 22184580, 17913234, -13273060, -25460566, 16601122, 916439, 29146722, +-23152022, -5260798, -7598871, -1318555, -18196166, -27644558, 23804856, -17095580, -10418517, -21107080, +-4277251, 14150843, 13661217, -8446053, 2342905, 2579128, 18109192, 27078158, 20365662, -34467648, +-16100759, -20415054, -4616553, 11880416, 4837744, -23550916, -33442226, 28876138, 2363843, -28159954, +-46304580, 23687282, -5550172, 12767327, 12302934, 12479027, 2218888, 9218074, -17845052, -6940131, +13214541, 2334852, -8039642, 5257040, -1607928, -24817394, 13123273, -31520228, -1461900, -1527398, +-4886599, -11316165, -3793530, 13881871, -329639, -3167002, 7742216, -10196252, 31351650, -2427194, +3386045, -2286533, 943819, 7649337, 169651, 7364795, -15023796, 3375844, -2212982, -10966662, +1789928, 5201743, 10910291, -5200669, 3544422, -26215406, -7869454, -1487669, -13007845, 11604465, +-862215, -3223373, -6655052, -10851772, -15180562, -22392886, 7490423, -2319819, 17090748, 19314468, +13103408, -13309030, -17619566, -23412940, -7976828, 21305186, 18254148, 2884608, 8953933, -7611756, +-12651900, -10366440, 814433, 2962991, -9757092, 4614406, 18109730, 22435298, -27785218, -23295366, +66279936, -5314485, -6478422, -9914395, -20917028, -2248952, 23911694, 38454988, -17696340, -10654740, +-3901978, -17446694, -4356708, -9819906, 15265924, -15760382, 17473538, 8375186, -6011344, -21994528, +-1627793, -9035001, 33062122, -18128520, -459562, 99321, -3313567, 15008226, -9548786, -1203128, +6858526, -4481262, -32321240, 16525424, -14760729, -17013440, -3954591, -18147848, -10601053, -33013266, +31609886, 1512902, -21113522, -38689064, 22524420, -22793928, -22360674, 368830, -17428978, 7912404, +14261976, 44146896, -12585328, 17333414, -3768834, -21234318, -18170932, -5209259, 66242356, -58402964, +-4349192, 60978872, -55790016, -21049098, 31304942, -4540854, -25259240, 58982248, -29237452, -12015171, +26944478, 6804839, 11442330, -17352742, 19422916, 27567784, 12764643, -6913824, -1916629, 27846958, +-4155918, 15982647, -495532, 11192685, -16003585, -1948841, 7187628, 4585952, 2929705, 862215, +994822, 11668889, -5438503, 3112241, 4135517, 4038880, -25070260, -10124312, 7834557, -20970714, +6200859, 12193949, -9082245, -9264244, -7429220, 5200132, -10385231, 12236362, 10074383, -1177358, +5761162, -7344931, -15200963, -14472966, 28927142, 5418101, 17971216, 3912715, 3396246, 11696807, +-10124312, -2157684, 18261128, -10781442, -25393994, 19082540, -2749853, 11245835, -3125126, -7248831, +-7377143, 30946850, -40259412, 35478040, -6465000, -22613002, 18916646, 6415608, -3923453, 3686693, +2272575, -4658966, 6680285, -8061117, -10328859, -4901095, -14176076, -11882564, -26322244, -10304700, +22008486, 20710870, -32642826, 10444287, 16807280, 14003204, -5893232, -32259500, -3226057, -16154983, +-37682968, 23185844, 59471876, -34701188, -4060355, 42130944, -12411919, -15529528, 34176664, 25256018, +12305081, -14301167, -28155122, 8904004, -11673184, -17956184, 62213140, 45656576, -38080252, -28167470, +33443836, -62001076, -22024056, -17833778, -10975252, 42698956, 28302760, 18456548, 20345796, -72784128, +-25606058, 68602440, 39628052, 7792145, -18756660, 23379654, -24637544, -49582176, -33136746, 23603530, +-18291728, -4254165, 27514634, 51201380, -6561637, -29462938, 3385508, 20002200, -35525820, -13430900, +36294084, 32564442, 32683628, 22536230, -6933688, -21336860, -10739566, 27611272, 7744900, 11382737, +-5738077, 2751464, 12404939, 724776, -5434744, -6365142, -8362302, 5834176, 4160750, 26458072, +7176891, -5716602, -11064373, 2246268, 983011, -4354023, -9761387, 2259690, 20423644, -22497576, +-6979322, 19568944, -4931160, -932008, 12906377, -5494337, 9452149, 3733937, 11164231, -22752590, +-3575024, 4276177, 25067040, 5732171, 11827803, 10197326, 5498095, -5313949, 8021925, 11610907, +-13967234, 6276021, -61499636, 26322780, 105764, -6488622, 31217970, -5553393, -23900420, 11709691, +10685879, 30495342, 17223892, -16831976, 716723, 4523675, 20870856, 4650913, -24391656, -1165010, +-1551557, 4705137, -22694608, -24813100, 35451196, -13075491, -37393060, 18909668, 32902670, -18847390, +-6476274, 1916629, 22514756, -27296128, -35650912, 9483288, 29848412, -6767258, -12921409, -7684234, +-7443179, 12771622, 5429376, 7515119, 75459888, 3891240, -9783399, 741419, 2254321, 40529996, +1175210, -14810658, 9084930, -32218160, -18852758, 7966628, 56371, 34770980, 27752468, -18347564, +-5375689, -17368310, 716186, 12250320, 3103114, 3568581, 12499965, -9378061, -37241124, 9113921, +25006374, -12210592, 22063784, -34765076, 16130823, 10011032, -30222074, 4791573, 540629, -13533442, +1327682, -6012418, 14949171, 14239427, -25313464, -15983721, 33683280, -26145076, 12370043, -2825552, +-9917079, 6976638, -1024350, -15575162, 8609799, 4788352, 6165426, -921271, -2574296, 1221381, +4677757, -6235756, -5466420, 4111358, 3304977, -3673808, -252329, 6969122, 12585865, -7933879, +-5038534, 1094680, -2201171, 3877282, -3059627, -2216203, 2967823, -689879, 7610682, -2936147, +3798362, -10331007, 6020471, -7390565, 6367289, 10451803, -881005, -393526, 1643899, -13316546, +10450729, 21100100, -39589936, -130214280, -154093232, -13858249, -106873816, 41982232, 260532176, 140152832, +211603376, 223013488, -24254218, -64273648, 19048716, -162438880, -198572448, -61350924, -218593968, -175475184, +44484588, -126225328, -34413424, 251605088, 91071560, 177882512, 307292576, 182902800, 81787448, 62261456, +21759914, -136901008, -170455440, -56240448, -232802800, -232939696, 30671436, -174201184, -142995568, 85938536, +-146616768, -150730272, 113749528, 46227268, -20840256, 268606176, 251486448, 160610832, 340967264, 321362336, +109740176, 127911640, 99643240, -161809136, -162257424, -205122800, -406199232, -479413376, -344867072, -343273120, +-253272608, 8677445, 23332946, 167186432, 289026080, 356322304, 324591072, 376766880, 322743168, 190393760, +127935264, 42631308, -63723356, -143001472, -203539568, -174811616, -253581856, -283915584, -235557488, -275279488, +-206656112, 32745904, 66126392, 160399312, 321615200, 256187280, 197332816, 149243664, 58674084, -48759152, +-39924944, -80635864, -101040720, -77058696, -87799872, -84696752, -36244156, -34275988, 1788317, 52346524, +37096168, 73486888, 88126288, 15408732, 63887640, 61531848, -17208860, 20471962, 14237817, -46772732, +1871532, 15173583, -54303420, -59117004, -82729664, -169825696, -190070560, -147715744, -141366160, -46255188, +69153808, 124996968, 203141216, 306776640, 330991104, 307147616, 214999088, 65689376, -69609072, -148442128, +-221878544, -273578688, -269337952, -210184432, -144614768, -68605664, -21357798, 8660265, 24625194, 62510564, +102779640, 106274672, 98368712, 101282848, 71738304, 64864208, 55816320, 22701050, 4789426, 14002130, +11826192, 7431367, 4471061, -12984760, -34911104, -52956948, -76360760, -96848832, -97089344, -78134584, +-60030220, -31525060, 5239860, 32794760, 47868484, 55713780, 49017388, 43458088, 47481400, 46005004, +36797132, 31502512, 26009786, 17885318, 9236864, 511101, -17603998, -32460290, -35913980, -33692944, +-30681636, -28620052, -26534844, -19709068, -7157026, 732292, -2668249, -8731132, -4916127, 675921, +3926674, 7726110, 8959302, 12268574, 19513648, 26594974, 26102664, 26889716, 23726474, 15349139, +9273908, 5373541, -2098629, -8809515, -13642964, -24398098, -33830920, -37126236, -38620884, -33381022, +-21327734, -5653251, 11912629, 27623082, 35036196, 34208876, 26719528, 17685602, 8708583, 462246, +-4380867, -6918656, -7317551, -6398965, -6178848, -6049462, -5478768, -4278325, -3321084, -1988570, +-689342, 200790, 984084, 1385127, 1319092, 1007170, 503585, 139050, -35433, -62814, +-51540, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -8851391, --10554345, 5538361, 401043, 8317741, 3059627, 3714610, 2408940, 3423089, -24696, -33286, --1786706, -5329518, -3050501, 1511829, -200790, -922881, -573915, 2948495, 2304250, 105764, -2659659, -2349884, -6079526, 2031520, -1364189, 761820, -3068754, 2532420, -2500745, -1211718, --950262, 4478577, -975494, 21475, -1776506, -435939, -4912906, 1746441, -780073, 2756832, --2304250, 386010, -1056562, -3927211, 1328219, -330712, -1019518, 1844152, 3344706, -615254, --1953673, -5776731, 592169, -3408594, 1672353, 121870, -2190970, -27380, -906238, -753230, --4154307, 2789045, -3677029, 2127083, -1410360, -2433099, -2063732, -4427575, 2534568, 290447, -1293322, 2761127, -2818036, -4543539, 3011846, -4352413, 205622, -2881386, 1001801, -2217277, -2066416, -1093069, 1122060, -1906429, 419833, -854699, 1244467, -885300, -970663, -947577, --883690, -1706713, 321049, 487479, -241055, -1334124, 1027034, -995359, 213675, -648540, --1133871, -391916, -362388, -142808, -197032, -126165, -923418, -486942, 219580, -545461, --248034, -270583, -630286, -165356, -452582, -601832, -505732, -15754477, -202937, -2121177, -4103305, 43487, 1560684, -1335198, 2027225, 365072, 1771137, -1854889, 10121627, -2243584, --1453846, -4394289, 1435056, -5298379, -1712618, 356482, -2580202, -73014, 3702262, 2094870, -1394791, 2470143, 3597572, -4442607, -1699733, -125091, 2281702, -4195110, 4035122, -3517578, --1769527, 3204046, -629750, 708670, -2594697, 2956011, 3124589, 3323768, -5180805, -1620276, -5576478, -117038, -851477, -1295470, 6082211, 3928285, 4704063, 41339, -1109175, -1452773, --340913, -171262, 686658, 1777580, -5892159, -577136, -2746095, -3525631, -459025, 956704, --3057480, 769336, -2336999, -903017, -945430, -119722, 2037962, 1838783, -1066763, -746787, --1334661, -4827543, -1131187, -3012383, 79457, -3958349, 1060320, 12885, 3950296, -1414118, -543313, -3475166, 299037, 430034, -1596117, -1693828, 1678259, 3758, 447213, -210990, -1178432, -360240, 490163, -250719, -270583, 1376537, 656593, 545461, 221728, -209917, -850940, 5290326, 6274947, -4456566, 513249, -3809099, 5745056, 1009854, -2451353, -3454228, --3061238, -685584, 680752, 1481227, 7661148, -4646081, -784905, -1880122, 2968359, -8675297, --1064615, 5436355, -207769, 4558571, 1985886, 3644280, 3797825, 1616518, -810138, -4105989, -1278290, -1192390, 456877, 6365679, 1562831, 5452998, -2954938, -1568737, 363462, -7479686, -811212, 5480915, -1686848, 454730, -4694400, 3439195, -135291, 1492501, -5545340, 3166465, --3743601, -2119566, -3907883, -4587562, 2549600, 820876, -1523640, -2380486, -2247879, -1676111, --1152662, 2495913, -2595234, -4661114, -7136625, 6484864, 4970351, 205622, -7139310, 2085744, --3453154, 2723546, -2350958, 440771, -4395899, -2800319, -5709086, -2623688, -845035, 5453535, -3235721, -6229313, 2618856, 69793, -588947, 2627983, -418222, 2072322, 4333085, 161598, -872952, 2839510, 549756, 512712, 2823941, -574452, -126702, 151398, 324270, 541703, -664646, -710817, 784368, -671089, 162672, 72478, 688805, 99321, 1771137, 1518271, -66035, -159988, 1736777, 838592, -1388348, 181999, 596464, 26716844, -9944460, 11959873, --9532143, 799401, 2826089, 2793339, -7872138, -2685428, -2655364, -13170517, -89121, 677531, --4757213, -785442, -74625, 9385577, 1720671, -6578280, 4772246, 5210332, 1149441, 9514963, --7107097, -2612951, -3806952, 1994476, 7618735, -572841, 463320, 2822331, -1384053, 3394098, -1523103, 8706972, -1335198, 3401614, -5734318, 5196911, -4021163, 5804649, -122943, -6107444, --933082, 8778376, -407485, 5933498, 3554086, 5705864, 491237, -4548371, -3703873, 76773, --2757906, 4681515, 3097745, -4668630, 623844, -3651259, 6185827, -1704565, 4959077, 5925445, -1023276, 6109054, -299574, -2986613, -1027034, -3801046, 156766, 8033737, -5063767, -5183489, --1970316, 2269890, -3553012, -2206003, 1544041, 3852586, -1620813, 1406602, -7820599, 1908039, -492848, -571768, 2720325, 160524, 722628, 1844689, -250719, -1022739, 828392, -1810329, -551903, -761283, 214212, 329102, -289373, -637803, -1572495, -134755, -1254131, -786516, --535797, -2610266, -22202296, 2502355, -6493991, -4623533, -7129109, -8650601, 3498788, 7860864, --1115618, 3097745, 1293322, 4070019, 965831, 361314, 2472828, -4702989, 11118597, -506269, --6385006, 7329899, -2165737, 3151969, -7206419, -4446902, -5091684, 2298344, 1402844, 5752572, -222265, -3457986, 642635, -3079492, -3417720, -3771518, -1289564, -5278515, -2667175, 5060545, --4598300, -255014, -3588982, -5605469, -2488934, 785442, 1860795, 3679176, -2820183, -2547989, -3601867, 696858, 1378685, 1020592, 2242510, 3418257, -5400922, -1745904, -518617, -7545721, -2051921, -462783, 4493073, -4393752, -3382824, -4102231, 747861, 4799626, 3684545, 8410620, -5620502, -5080410, 2117419, -2262911, 3968013, 2542084, -5550709, 4088809, 1101122, -6111202, -816044, -1054951, 548145, -1088774, -4207458, 845035, -3015604, -3115462, 1182190, -1682017, -745714, 2338073, -1508607, -1955284, -2097018, -3078955, -578747, 2499134, -637803, 2596845, -25770, 1777043, 1163399, 958315, -1126355, -373125, 433255, -1028645, -1228361, 358630, --1188095, -387084, 317828, -2144263, 1236951, -1064078, -392990, 324807, -88047, 246424, -704375, -916976, 622770, 1555852, -28246926, 7887171, -8353175, -6940131, -4966056, 1060857, --1374390, 16805670, 1744831, 4102768, -1762010, 171799, -6761353, 6921340, 2087891, -883690, -1466195, 9004399, -4358318, -1429150, 2149631, 726386, 4561256, -3776887, -1653026, 5018133, -1896765, 4631586, 634581, -4687420, -3049427, 2816425, -375273, -1518808, -2905009, -1619203, --106837, 8541616, 2218888, -1414118, 266288, 734439, -2469606, 6185290, 4737349, -1336272, --6293738, 1708860, -3292093, 5891085, 4575214, -4392678, 1843078, -5720360, -5113159, -4459787, --5652177, -1872606, 1348620, -3340411, 367220, -3700651, -3147137, 6765111, 4314295, -5531918, --7536057, 963683, 6566468, -4899484, -3636227, 5588826, 4391067, 6359773, -3954591, -69793, -1843615, 2685428, 7101729, 2005750, -844498, -163746, -5045513, -663036, -18790, -4287451, -394600, -1187559, -1932735, 193274, -521302, 2274722, -448287, -737661, 1100585, -550293, --1759863, -1095754, 454730, 1859184, -768262, -545998, 122407, -324270, 3360812, 703301, -4336843, -2910377, 839129, 330176, -1712618, 67109, -81068, -2176475, 645856, -327491, --2464774, -2238752, -1163399, -2135136, -1652489, 705448, -1057099, -14930917, -1480690, 2512556, -7260106, -1416266, -3805341, 1700270, 10669236, -13439490, 3114925, -2729452, -2495376, -6051609, -3635153, -10771241, -7010461, 3699578, -5630702, 3402688, 15341623, -2718178, 6200859, -7218230, -7408819, -1928977, 2209761, -6475200, 3021510, 1833414, -3468186, 1520955, -699543, -3333432, --221728, 4209068, 6605123, -5177046, -8248485, -6541772, -6054830, 779000, 4844186, 12824235, --146029, 8633958, 9025337, -8402030, 6456947, -12355010, -4513474, 774705, -5491116, -5126581, -3426847, -11966316, -2361158, 8311836, -3587372, -3138011, 1101122, -3663070, 3403762, -3635153, -5837935, 7526930, -2085744, 2331094, 316217, -7646116, 659814, -4953708, -3402688, -6045167, -3433826, 2609193, -5789616, 453656, 4320737, 3995930, 5117991, 5253282, -802085, -5031554, -4159139, 2153926, 2493229, 1336272, 3009698, -363462, -92879, 416612, 1241782, 1431298, --2046552, -657667, -1649804, -1128503, 2418604, 2042794, 2334852, -4256850, 871878, -559956, --1735167, -2075543, 2188286, -1381906, -2302103, 549756, 555125, -798864, 5150740, 1667521, --1001264, -1178969, -2381023, -703838, 2110440, 3157338, 812823, -38655, 3230889, 35344896, --1748052, -14031121, -1790465, -651761, 1304060, 4420058, 1782411, -1658931, -1488206, -7084012, --3372623, 3913252, 8611409, -7121056, -4489852, 5735929, 437013, -2113124, 2281165, -599685, --8231842, -8386461, 11337103, -1093606, -751619, -1932735, 5811091, -485868, 590021, 3684008, --6251862, 6573985, 2724083, 1045288, 2499671, 6571837, -15902116, -7139310, -3884261, 14603963, -1868848, 1066226, -4526359, -4994510, 4361540, -688269, 5060545, -1836099, -10166724, 1060857, -1223529, -1564442, 4915590, 2187749, 1308891, 8086350, 19760070, -1591285, -1686312, 7505456, -2274185, -2361695, 5159867, 15363635, -1741609, 2920041, 5558762, 4454418, 3990562, 4065724, -4560182, 3500935, -4080756, 6117107, 10963978, -2561411, 4196183, 37044, -1395328, -7619272, -4724464, 1770600, -631360, 2277943, 2621541, 606127, 292595, -2582349, -2957085, -1182190, --5878200, -2628520, -3987340, 5076115, 2486249, 1916629, -838592, -788663, 288837, -3393561, --3758, 1219234, -4669703, 4064650, -2041183, 706522, -1435593, 202937, 1537061, 1837709, --3640522, -3611531, -3001645, 385473, -629213, -1015760, -286152, 2499671, -674847, 244276, --1501091, -3212099, -1750199, -105764, 7136625, 7946763, -10135049, -2946885, -8603356, 8507793, -15950972, -7649874, -1795833, -8776229, -3812320, -10618233, 7560753, -6487548, -2633889, -700080, -75699, -4236449, -5195300, 9507984, -8641474, -3210488, 991601, 6481106, 6943352, -9982041, --2923799, 3812320, -8563628, 4848481, -6791417, -2790655, 2513093, 179315, -3710852, -1056562, -2058363, 11110007, 1387274, 2491081, 14496, -9542344, 10412611, -5126581, -7785702, 6215892, --5545340, -6316287, 8213051, -3735011, 1065689, -1840930, 1118839, 10746008, -1825361, 2385854, --9402220, -770410, 10988137, 2421825, 10887742, 9271224, -3040837, -2414845, -12617540, 1907502, --2101313, 8345659, 10293426, -5939403, 2582886, -18605798, -5052492, 6114423, -6389301, 9584220, -674310, 2039036, -3379603, -760746, -4424890, 746251, -3040300, 6751689, 6713034, -347892, -2308008, -148176, 3809099, 1584306, 2769180, 5694590, -1694902, -6508486, 3000572, 1421097, -4130148, -1117228, 4380330, -939524, -1471563, 1042066, -2575370, -1790465, 483184, -4596152, -1308354, -1636383, 4066797, 1683090, -255014, -914828, -2613488, -4086125, -279173, 485868, -1679332, -1540283, 946503, -3850438, -5369, 163746, -1953673, 2475512, 303869, -6442, -1129040, -1306744, 248034, -44560, 6364605, -8176007, 2750927, -7647726, -865973, -10317585, -16855062, -5007932, 1114007, -5368709, -15441481, 8846559, 3076270, -11533061, 7084549, -5214627, --3847754, 3987340, 15953656, -8014409, 15410880, -338229, -10888816, 422517, 3575560, -9584756, -10510859, -5564130, 7774428, 16938278, 1627793, -7959648, -2250563, -935766, 3859028, -6773701, --3713536, -940598, 8333847, -3016141, -3390340, -11138998, -407485, -13163538, -2451353, 14855755, --3368865, 8448201, 775778, 2234457, -19534586, 242666, -12509092, 10030896, 17453136, 5369783, -4366908, 1063541, 2595234, -10215580, 3569655, 5426691, -4563940, -1290101, -4047470, -2582349, -7858180, 162672, 9536438, 29268592, 10677826, 2908230, -10075993, -9362492, -6076305, 5741835, --9976135, -877784, -923418, 2026688, 5619965, -5475010, -1044751, 5434744, 5965710, 1221381, -1007170, 4057134, 5136781, 4290136, -60130, -961536, -977105, 446140, -2137283, -2662880, -2323577, -1349694, 3617973, -4444755, -1412507, 3063386, 2602213, -269509, 2351495, -2290291, -1069984, 1610613, 2184528, -2513093, -2470680, 3470334, 2480344, 1946694, -898722, -1753420, -841814, -4946729, -1297617, 790274, -2632815, 1200980, -1825898, -1287953, 563714, 399432, --412317, -981937, -3278671, 30987116, -16178068, -63888, -7841537, -15140297, -20332912, 6126234, --6255620, 6463389, -19224810, 4228932, 7377680, 6669011, -7854422, -17626546, -13795435, -11531450, -527744, -6556268, -12763569, -8677981, -4226248, -10367514, -7116224, 2136746, 13914620, -20401, -2291902, -156766, -11567958, 7662759, -731218, 2469069, -2309619, -7576859, 7063074, -9528922, --13405130, 12619688, -13069585, 2945811, 221728, -18513456, -10889353, 7634305, 4832, 9320616, --5667210, -19690814, 258772, 963683, 7789460, 8224863, 18997178, -10550050, -38102804, -13186623, --12773770, 8858907, -24707874, -8221105, -3839701, -22707492, -7313793, -147640, -4033511, -4065724, -5350456, -5952288, -206695, -5570573, 5735929, -13262859, 5208722, 11083700, -13323525, -6637335, -7073811, 5525476, 4886062, -13758928, 3670050, 399432, -1632088, 7654706, -1522029, 6335614, -5740224, -978716, 2025077, 1407676, -1340030, -4425964, 7993471, -2276333, -5026723, 398358, -136902, 4323422, 1802276, 244813, 1627793, -3802657, -3770981, 695785, 1800128, 2684892, -4735202, -278636, 2358474, -200790, 2127620, -4464082, -1682554, -3024194, -2639794, -257698, --279710, 1966021, -4967130, -2179696, -3624416, -2587718, -5216775, -6614250, -5729487, -409633, --182536, 992674, -3376918, -4562866, -17725330, 7021198, 8766028, -2913062, -3416110, -8823473, --9756555, 22551800, 8203925, -21007222, 7272990, -11430519, -1100585, -10378788, -21616034, 6382322, --11272679, -4671851, 878858, 678068, -5518496, -18226230, -11352135, 9020505, -11228118, -250719, --9938017, -15146739, -5950677, 16956530, 2676302, 3079492, -14760192, -4860829, -3052648, -1838246, -5945846, 7489349, 9500468, 11902965, -5811628, 6752763, 2280628, -6723235, 4139275, -11361799, --10042707, -8526584, 3668976, -9862319, 423054, -14882599, -13217762, -6655589, 15489800, 12276627, -11752641, 13172665, -12070469, 16476568, 474594, 7670275, 22391812, -4468377, -4206921, 3811784, --10888279, 4617627, -5155035, -13805099, 1747515, 11579232, -13571023, -9450539, -1730335, 12438225, --10334765, 1348083, 3699578, 7554311, 1767379, -2871186, -7078643, 2061584, 5140539, -2687576, -578210, -3428995, 1068910, -3248069, 1284732, 414464, 1838246, -1113470, 1239098, 2674691, -6236830, -616328, -239981, 710280, 2846490, -4512400, -2066416, -4985920, -1560684, -969052, --6047851, 1313723, 5261872, -289910, -7188702, -1007170, -766115, -5951751, -7047505, -9907416, --4320200, 4067871, 495532, 2936684, -1669132, -1616518, -3772592, -329102, -9029095, -1414118, -5171141, 8666707, -588947, 2752000, -5199595, 851477, -3163780, 4544613, 1742683, -8490613, --19796042, 22637162, -17690970, 23441394, 13120588, 8924942, 5017596, 9206799, 10005126, 9244917, -25197500, -8828842, 1775969, -1692217, -4349192, -774168, 3123515, -2350421, 4847408, -1644973, -7881265, 6601365, -1419487, -4376035, -25116432, -8959839, -18218178, -853625, 9605157, 9677098, -3082713, 4923643, 7241852, 5969468, 7019587, 17974438, 26831198, 17985712, 3631395, -3428458, --5182415, -7719667, 9388799, 9543954, 10721849, -7990787, -6281927, -9907416, -1632625, 13056164, -128312, 15648713, -9498857, 8373039, 5057861, 14041322, -29389924, -21069498, -8617852, -11834246, --12081743, 3606699, -4930086, 18479634, 5494874, -20646982, -1697049, 33356326, -11248519, 10388452, --5039608, 13696114, -6385543, -4194036, 497142, -5689221, -7441568, -557809, 5616744, 8235600, -5763846, -2190433, 6499896, -1750736, 3011846, -8527121, -5779416, 5425618, 3474629, -8574365, --3716221, -3654480, -1135482, 2100239, -2238752, -4218195, 1944010, 353261, 1414118, -700617, --2402497, 3767760, 1254667, -2181844, 5040144, -733366, 1494649, -967978, 5943161, -5066988, -5295695, 2283849, -4940286, 3244311, 195958, 841814, -5150203, -15129022, 5679021, 94489, -1114007, -1767379, 5774047, -1433445, -2670396, 1802276, 4516695, 3689377, -2206003, 4583267, --14397804, -7163469, 12100533, 5334887, 8950175, 23195508, 2066953, 15526844, 22664542, 15760919, --10125385, -22877680, -682363, -10460930, 24850144, 7205345, 19435264, -2689187, -10276246, -3748433, --11221139, 4535486, -8612483, 1117765, -9603010, 5112622, -6990596, -2918967, -15476915, -15371688, --1435593, -22049288, 12202539, 8396661, -6518687, 11373610, -5291400, 4452808, 12699681, -13929653, --18221936, 3302293, -3903589, 30798674, 13167296, -33716568, -9012989, -9547175, -17313550, -18403398, --37602440, 6674379, -13408351, -3513820, 5508296, 1392106, 7866770, -1479079, -4357245, -28563144, -3504693, -12981002, 3618510, 16764868, 3636227, 11242077, -16916266, -22598508, 4679904, 14013941, -9547712, 5262409, 9078487, 14565308, 18341120, 18737332, -16543140, -10035728, -11883101, -8592619, --13890461, 19761144, 11712376, 11135776, 3175055, 8511551, 7429757, -711354, 10463614, -15946140, --5472325, -1920924, 1443109, -3469260, -11157788, 621160, -2145336, 1444183, 3812320, 11521250, -789200, 5373541, 5567352, 832687, 5904507, 155156, -3324305, 667331, -8503498, -3562675, -4794794, 6617471, 2220498, 1173063, -10422812, -1077500, 554588, -5151277, -3346317, 1515587, -3590593, -9793062, -10572599, -4975183, 3853660, 3058017, 5704791, 1243930, -3221762, 2338073, --10923176, -9995463, 40831180, 26975616, 37464464, 2448668, -7403987, -25419764, -7485591, 4275640, -5922760, -6045167, -19641960, -7086696, 32370094, 13397077, -4457639, 9928354, -713501, -11866995, --3455838, -7736847, 22074522, -1675574, 1309965, 9540733, 641024, 10824391, -97711, 15314243, --14059039, 17642652, 3582540, -8186208, -4952098, -9069897, 15922518, -22022444, -23791434, 15075872, -24908126, 1189706, 17197586, 23656680, -26601416, 8879845, 5449240, -1439351, -231928, 3973919, --9979357, 18579492, -11252277, -8928700, 7505992, 967978, -2003602, -4293357, -5539971, 2699924, --17570712, -5241471, 14164265, -17317846, -3988414, -11689827, 445603, 35116728, -11018739, 2280091, -9395241, 197569, -8075076, -21896280, 21422224, 10016401, -44146896, 10966125, 11115912, 8240969, --9896678, -4586488, 22557168, 1037772, 1665374, 5808407, -15684147, 625992, 9985262, -4052302, -5771363, -1228898, -5095979, -13053479, 1996086, -1694365, 12125230, -1104344, -513785, -8684961, -9606231, -3206730, -3337190, -13778255, -6937446, 4878009, -8886287, 760209, -4379793, 5546951, --5203353, -11078868, 5609764, -11936251, -3280281, -5411122, 558346, 754304, -4491999, 11949136, --1476932, 16103443, 9805410, -1590212, 1686312, 10313827, -7134478, 1870458, 1219234, 9900973, --8942122, -5270462, 454193, -18234284, -43700756, 38878044, 23174570, 12326556, 8668318, 19206556, --44100188, 18107582, 20364588, 8722542, -28232430, 15710453, 28540594, 13230110, 31470836, 11481521, -537945, -1247151, -987306, -5358509, 13334800, 22362284, 21296058, 7446937, -6544457, -11105175, -2654827, -10110353, -11840688, 12458090, 8564165, 2374043, -11866995, -11543261, -2538326, -10035191, -5118528, 25701084, -4570919, -8307004, 8672076, 4659503, 7612293, 8977019, -1968169, -5184563, -20645908, 13663365, 6748468, 9113921, -1666447, -20517596, 4757750, 13662828, 1768453, -15270756, -20434380, 5331128, 28425704, 1057099, 25553444, 2734284, -8378408, -2719251, 6127845, 36381056, --4597763, 13078175, 8963060, 17190606, 9003325, 81068, -1105954, 11215770, 51760800, 2423435, -20765630, -17547088, -13107703, 6577743, 8137890, 10091563, 4148402, 1658394, -25440702, -10061498, --26676042, 1458141, -4582730, -8808441, -7460895, -2962991, -11255499, 1416802, -1169305, -11829951, -8459475, -13778255, -6696391, -12439836, -8509941, -814970, 1367410, -9949829, -11552925, 2781528, -7340636, 8579197, -1747515, -3278671, -14862734, -19422916, 1940252, 2381559, -8857296, 17685064, -17107392, 25323128, 8878771, -5564667, 3457986, 7827578, 9582072, 11511586, 1696512, -11989938, -3025268, 15389405, 7876970, 803159, 6154152, -28472948, 31227096, -463856, 27638652, 695248, -1881196, -25073482, -7707856, -11271605, 19173808, 4896263, 8500277, 5087926, -19262928, 1930588, -1547262, -16893180, -24217710, -24720222, 8383240, -9171366, 22544284, 1327682, -7152731, -5819681, -4860293, -8694624, 1451699, 6645388, -9490267, 5365488, 7592429, 2630668, 2163053, 17093970, -28659244, -5572720, -242666, 14450954, 11777337, 17301738, -12822088, -4968204, 5173825, -17104170, -1645509, 1546188, -22816476, 29427506, -1477469, 14884209, 12753905, 9040369, -17379048, 1711545, -14761803, -11978664, 26307748, 7319161, -9698573, 21882322, 16371878, 11553999, -36772436, -7386807, -7231651, -12438225, 1893544, -20371030, -5212480, -30919470, -8969502, -4636417, -8667781, -34267396, --3556770, -9270687, 51552492, -7318088, 10405632, -5181878, 8144869, -4206921, -8559333, 5718749, --7202660, -950798, -3940096, 14025216, 4845260, 6253473, -22457310, -19800336, -15059229, -6045704, -3796751, -27885076, -4674535, -2085744, 1939178, 10446971, 7606924, -656056, 10713259, -9630927, -48855, 787053, -16335371, -22109954, 4217658, -6318971, -20890720, -5463199, -9945534, 1633698, --22334366, -2297271, -9870909, 13301514, 2684, -9205189, -3663070, 4319664, 4941360, -1860795, -9756018, -9842454, -6520297, 13214541, 12097312, 21910238, -7486128, -1610076, -3106872, 5869610, -15591268, 13636521, 10031433, -8127689, 6086506, 17149804, 16530255, 7013682, -21041582, -24319716, -10110890, -3746285, 7178501, -4850092, 19757924, -15559593, -3604551, -5663988, 17169668, -13717052, -30464204, 37598680, 38320772, 1945620, -7682086, 5858873, -5528160, 9055939, -2142115, -651761, --11860015, -31580894, -10865730, -30261266, 16608102, 15666430, -18877456, -14186277, -18925774, -9038222, --3161633, 40247600, -24696, -21168284, -22797686, -1762547, 27930172, 13174275, -57512832, -12042551, --10590852, 7088307, 20910586, -25163676, -8359080, -15147813, 5956583, -34185256, 16281147, -6035503, --1286343, 8977555, 868657, -16940962, 32821066, -3735548, 15339476, 35310536, 72653664, 43499428, --1599339, 24269250, 36791764, 47617764, 51496120, 14506252, 31336618, 8739722, -123480, 19191524, --15934329, 31728534, 13222594, -14324253, -48399988, -35185444, 3999152, -13972065, -10360535, -9190693, --5850819, -6228240, -20263118, -13251048, 184147, -3389266, -1632625, -6540162, -2301029, -10602127, -12202002, -21602074, -9263708, 5848135, 3362960, 1606855, -6054294, -6962142, -4320200, 3988414, --3955665, 10673531, -13452911, -16465294, -16769700, -10277857, 11770358, 13553843, -5756867, -2692945, -4467303, -2918967, 22377854, 4707284, 1442572, 18121540, 10945187, 10257456, 25479894, 16876000, -19022410, 5864778, 8859444, 21271900, 7709467, 16466905, -15955804, 8644695, -7516730, -16585553, -18587008, -23964306, 39470212, -4922570, -7555921, 506806, 31369368, -21355652, -4009352, -1140314, -146029, 11268384, -8477729, 16349867, 5455682, -3319473, 3546032, 1701344, 12703976, -40009232, --12865575, -1409286, 3897146, -4125316, -29337310, 23627688, -1649804, 3076807, 8286066, -19106698, --8973260, -44097504, 11285563, -10462540, 8058433, 31906776, -9168145, 6561637, -4510790, 15132244, --26613764, -35249332, 30348776, -3043521, 2244121, 5053566, 30515206, 22383222, 26424250, -610959, --36342404, 21170430, 9583146, -8630200, -13141526, 20238422, -4168803, 25630218, 42174432, 33003066, -5191005, 2764348, 30982820, -6324340, 9190693, 25756918, -18090402, 29804926, 17832168, 10561325, --21634288, -10546292, -28712930, -914291, 9183714, 41925860, 17190606, -39087960, -4115653, 25159382, --4223027, 12219182, 16372415, -27721866, -7379828, 13463649, 2708514, 7513509, -12641699, 8947491, -14660871, 1956358, -354335, 22276384, 3668439, -4813048, -6382859, 7399692, -2573222, 11986180, -1274532, 9081708, 9684078, -1540283, -11327439, 21976274, -3799972, -6694244, -2071785, -14852534, --15652471, -9783936, -11057930, 7196755, 12304008, -12986907, -11892228, 2687039, 18811420, -28098750, --7566122, 10990821, -4082903, 184147, -4590247, -2922725, -21026012, -146566, -6175089, 5763846, -776315, 3535832, -564788, 1934346, -5052492, 8796093, 4145180, -2320893, -4952098, 3730716, -435939, -1570884, -55158656, 12639552, -9129490, -2161979, 43073692, 18519362, -13506062, -10454487, --163746, -27857694, -34135328, 2892124, 295279, -19200652, 20379620, 2477659, -19704236, 12459700, -37047316, -4955856, -21351894, 13415330, -12576738, -13691282, 6908455, 30103426, -9805410, 4417911, -8243116, -9269613, -22413286, -14687714, 29705604, 10468446, -29310468, 25075630, 9816685, -20065014, --10509785, 41286984, -13441100, -31661426, -16293495, 54871964, -54175644, -25087440, 32115618, -14530411, --17437568, -51592220, 40235792, -33029910, 11806865, 1729798, -6222871, -58262840, -17252346, 49894636, -31425738, -39412768, -10826539, -17059610, -8109435, 8099235, 10801843, 13001940, -68880536, 37674916, -28840168, 30320858, 434865, 15881178, -33725156, -29931090, 58885612, 24196236, 6488085, 23746874, --31758598, 6405944, -14076218, 15180025, -8610873, 41369124, -16902844, -14350559, 5687611, 5016522, --15691126, 9443022, 4494147, 3548180, -3003256, 2123325, 3271691, 3395709, -3931506, -2207613, -8600135, 529355, -4655745, 18124226, 5267241, -16052977, 1704028, 15552077, 3975529, -15266998, -20450486, 36885716, -18192944, -21095806, -5812702, -4731980, 12418898, 27033598, 8091719, -24953760, --8416525, -3600793, 3626026, 7633231, -4306779, 11079405, -8083666, -921271, 6349573, -10664404, --45574972, 7809325, 56734372, 17680232, 6018860, 1475858, 4187593, 24285356, 33273648, -7709467, -6147709, 8546985, -5828808, 20039780, -10695005, -2929705, -8116415, 15377057, 11388643, -6395743, -10462540, -15236933, -12443594, 15355045, -10019085, 16881906, -11404749, -5104032, -428960, 9191230, --678605, 6818261, 2694555, 17195438, -12462921, -2554432, 201863, -6956237, 16579648, 14390288, --12060268, -4325032, -7452305, 3753802, -15530065, 8240969, 4653060, 7558606, -6270116, -4758287, -18884434, -22901302, -4054986, 9550397, -6300180, -4229469, 9825811, -28125594, 6662568, -10230075, -1568200, -10018548, 24144696, -7973070, -10586021, 9882183, -5618354, -15974594, 30736934, -928250, -3051038, -6969122, -11987791, -14073534, 15454366, -17556752, -8536784, 17718350, -24391120, -10650982, -3027415, -2349884, 2876554, -453119, 3362423, 10743861, -3988951, 4169340, -5053566, 11279658, -6118181, -549756, 864362, 6847252, -6170258, 4959614, 723702, 5462662, -2592550, 8527121, --4470524, 2248952, -7567196, -6513855, -10302553, 1846836, 511638, 3360275, -5090610, 11368778, --3856881, -2018098, 9716290, 8587787, 4551055, -4069482, -6655589, 5847598, 7738994, 4851166, -3301756, -151934, 6992744, 7616588, 3318399, 6464463, 789737, -5091684, -300648, 14928233, --42287176, -119658328, -98298920, 52078088, 14983530, 119087096, 212701280, 31659278, 67102960, 24467354, --169536848, -53552336, -114994528, -138956688, 3964792, 22286048, -57943404, 84127672, 110051560, 61826056, -175484848, 101261904, -22524956, -41554344, -81365472, -158361888, -125089848, -36792300, -111544056, -15458124, -96311960, 16170552, 22443888, 145644496, 74282000, 46027552, 151780384, 23479512, -41867880, 59427852, --79454208, -157319824, -65857416, -132712344, -166206112, -2324651, -34698504, -43645996, 110716200, 122110216, -77644952, 184184848, 148529632, 70176544, 63369020, 36800892, -123001424, -113037096, -143292992, -189079488, --151702544, -63895156, -43982076, 3999152, 108756088, 132379480, 138436464, 132839584, 122972432, 26353920, -2264522, -20769388, -93776856, -102605160, -59391880, -107593224, -45352172, 9517648, -23533200, 54172960, -97235376, 29862370, 41058276, 18399104, -26593364, -16446504, -40691056, -52773336, -6400575, 14998563, -367757, 43750684, 40218072, 4694936, 38710004, 134218, -49121004, 43423192, 12976707, -43511240, -30601642, -32198296, -65643744, 30071750, -46743740, -115453552, 1731946, -50758996, -33752000, 114666496, -51730196, 54581520, 163784816, 108777024, 60182692, 71656160, -17970144, -103492072, -131838856, -178711440, --197983504, -125429152, -80383000, -13737990, 75077640, 167717392, 184826944, 171645680, 178404352, 95595768, -4105989, -45518600, -117962352, -150462368, -97784592, -108713672, -87010672, -17450988, 2742874, 11485279, -42071888, 36158792, 31053150, 56232396, 55504936, 47275240, 55187644, 38605312, 12290049, -4423280, --24950538, -54898808, -61031484, -51034948, -54644332, -40052716, -21967684, -3133179, 16164109, 40825812, -44159780, 40898288, 37124088, 26186416, 9602473, 817654, -3697967, -15650324, -16220481, -9794136, --12292733, -14273250, -10107132, -15697569, -14224932, 247497, 1376000, 110595, 5337571, 2545842, -2959233, 12268574, 12438762, 13592498, 15623480, 8404177, 2361158, 529355, -4701916, -9816685, --12713640, -14305999, -14755897, -10423349, -4828617, -312996, 3998615, 8468602, 8866960, 9455371, -9275519, 5036386, 177704, -948651, -3879429, -4543539, -3332895, -1042603, 864362, 2592013, -2745558, 2111513, 460098, -2187212, -4085588, -4489852, -4865124, -4706211, -3590056, -1403381, -1792612, 3970697, 4594542, 5500780, 5881421, 4587562, 3154117, 1469416, -689879, -2100239, --2970507, -3582540, -3296388, -2416993, -1619740, -624918, 387084, 992674, 1302449, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-10554345, 5538361, 401043, 8317741, 3059627, 3714610, 2408940, 3423089, -24696, -33286, +-1786706, -5329518, -3050501, 1511829, -200790, -922881, -573915, 2948495, 2304250, 105764, +2659659, -2349884, -6079526, 2031520, -1364189, 761820, -3068754, 2532420, -2500745, -1211718, +-950262, 4478577, -975494, 21475, -1776506, -435939, -4912906, 1746441, -780073, 2756832, +-2304250, 386010, -1056562, -3927211, 1328219, -330712, -1019518, 1844152, 3344706, -615254, +-1953673, -5776731, 592169, -3408594, 1672353, 121870, -2190970, -27380, -906238, -753230, +-4154307, 2789045, -3677029, 2127083, -1410360, -2433099, -2063732, -4427575, 2534568, 290447, +1293322, 2761127, -2818036, -4543539, 3011846, -4352413, 205622, -2881386, 1001801, -2217277, +2066416, -1093069, 1122060, -1906429, 419833, -854699, 1244467, -885300, -970663, -947577, +-883690, -1706713, 321049, 487479, -241055, -1334124, 1027034, -995359, 213675, -648540, +-1133871, -391916, -362388, -142808, -197032, -126165, -923418, -486942, 219580, -545461, +-248034, -270583, -630286, -165356, -452582, -601832, -505732, -15754477, -202937, -2121177, +4103305, 43487, 1560684, -1335198, 2027225, 365072, 1771137, -1854889, 10121627, -2243584, +-1453846, -4394289, 1435056, -5298379, -1712618, 356482, -2580202, -73014, 3702262, 2094870, +1394791, 2470143, 3597572, -4442607, -1699733, -125091, 2281702, -4195110, 4035122, -3517578, +-1769527, 3204046, -629750, 708670, -2594697, 2956011, 3124589, 3323768, -5180805, -1620276, +5576478, -117038, -851477, -1295470, 6082211, 3928285, 4704063, 41339, -1109175, -1452773, +-340913, -171262, 686658, 1777580, -5892159, -577136, -2746095, -3525631, -459025, 956704, +-3057480, 769336, -2336999, -903017, -945430, -119722, 2037962, 1838783, -1066763, -746787, +-1334661, -4827543, -1131187, -3012383, 79457, -3958349, 1060320, 12885, 3950296, -1414118, +543313, -3475166, 299037, 430034, -1596117, -1693828, 1678259, 3758, 447213, -210990, +1178432, -360240, 490163, -250719, -270583, 1376537, 656593, 545461, 221728, -209917, +850940, 5290326, 6274947, -4456566, 513249, -3809099, 5745056, 1009854, -2451353, -3454228, +-3061238, -685584, 680752, 1481227, 7661148, -4646081, -784905, -1880122, 2968359, -8675297, +-1064615, 5436355, -207769, 4558571, 1985886, 3644280, 3797825, 1616518, -810138, -4105989, +1278290, -1192390, 456877, 6365679, 1562831, 5452998, -2954938, -1568737, 363462, -7479686, +811212, 5480915, -1686848, 454730, -4694400, 3439195, -135291, 1492501, -5545340, 3166465, +-3743601, -2119566, -3907883, -4587562, 2549600, 820876, -1523640, -2380486, -2247879, -1676111, +-1152662, 2495913, -2595234, -4661114, -7136625, 6484864, 4970351, 205622, -7139310, 2085744, +-3453154, 2723546, -2350958, 440771, -4395899, -2800319, -5709086, -2623688, -845035, 5453535, +3235721, -6229313, 2618856, 69793, -588947, 2627983, -418222, 2072322, 4333085, 161598, +872952, 2839510, 549756, 512712, 2823941, -574452, -126702, 151398, 324270, 541703, +664646, -710817, 784368, -671089, 162672, 72478, 688805, 99321, 1771137, 1518271, +66035, -159988, 1736777, 838592, -1388348, 181999, 596464, 26716844, -9944460, 11959873, +-9532143, 799401, 2826089, 2793339, -7872138, -2685428, -2655364, -13170517, -89121, 677531, +-4757213, -785442, -74625, 9385577, 1720671, -6578280, 4772246, 5210332, 1149441, 9514963, +-7107097, -2612951, -3806952, 1994476, 7618735, -572841, 463320, 2822331, -1384053, 3394098, +1523103, 8706972, -1335198, 3401614, -5734318, 5196911, -4021163, 5804649, -122943, -6107444, +-933082, 8778376, -407485, 5933498, 3554086, 5705864, 491237, -4548371, -3703873, 76773, +-2757906, 4681515, 3097745, -4668630, 623844, -3651259, 6185827, -1704565, 4959077, 5925445, +1023276, 6109054, -299574, -2986613, -1027034, -3801046, 156766, 8033737, -5063767, -5183489, +-1970316, 2269890, -3553012, -2206003, 1544041, 3852586, -1620813, 1406602, -7820599, 1908039, +492848, -571768, 2720325, 160524, 722628, 1844689, -250719, -1022739, 828392, -1810329, +551903, -761283, 214212, 329102, -289373, -637803, -1572495, -134755, -1254131, -786516, +-535797, -2610266, -22202296, 2502355, -6493991, -4623533, -7129109, -8650601, 3498788, 7860864, +-1115618, 3097745, 1293322, 4070019, 965831, 361314, 2472828, -4702989, 11118597, -506269, +-6385006, 7329899, -2165737, 3151969, -7206419, -4446902, -5091684, 2298344, 1402844, 5752572, +222265, -3457986, 642635, -3079492, -3417720, -3771518, -1289564, -5278515, -2667175, 5060545, +-4598300, -255014, -3588982, -5605469, -2488934, 785442, 1860795, 3679176, -2820183, -2547989, +3601867, 696858, 1378685, 1020592, 2242510, 3418257, -5400922, -1745904, -518617, -7545721, +2051921, -462783, 4493073, -4393752, -3382824, -4102231, 747861, 4799626, 3684545, 8410620, +5620502, -5080410, 2117419, -2262911, 3968013, 2542084, -5550709, 4088809, 1101122, -6111202, +816044, -1054951, 548145, -1088774, -4207458, 845035, -3015604, -3115462, 1182190, -1682017, +745714, 2338073, -1508607, -1955284, -2097018, -3078955, -578747, 2499134, -637803, 2596845, +25770, 1777043, 1163399, 958315, -1126355, -373125, 433255, -1028645, -1228361, 358630, +-1188095, -387084, 317828, -2144263, 1236951, -1064078, -392990, 324807, -88047, 246424, +704375, -916976, 622770, 1555852, -28246926, 7887171, -8353175, -6940131, -4966056, 1060857, +-1374390, 16805670, 1744831, 4102768, -1762010, 171799, -6761353, 6921340, 2087891, -883690, +1466195, 9004399, -4358318, -1429150, 2149631, 726386, 4561256, -3776887, -1653026, 5018133, +1896765, 4631586, 634581, -4687420, -3049427, 2816425, -375273, -1518808, -2905009, -1619203, +-106837, 8541616, 2218888, -1414118, 266288, 734439, -2469606, 6185290, 4737349, -1336272, +-6293738, 1708860, -3292093, 5891085, 4575214, -4392678, 1843078, -5720360, -5113159, -4459787, +-5652177, -1872606, 1348620, -3340411, 367220, -3700651, -3147137, 6765111, 4314295, -5531918, +-7536057, 963683, 6566468, -4899484, -3636227, 5588826, 4391067, 6359773, -3954591, -69793, +1843615, 2685428, 7101729, 2005750, -844498, -163746, -5045513, -663036, -18790, -4287451, +394600, -1187559, -1932735, 193274, -521302, 2274722, -448287, -737661, 1100585, -550293, +-1759863, -1095754, 454730, 1859184, -768262, -545998, 122407, -324270, 3360812, 703301, +4336843, -2910377, 839129, 330176, -1712618, 67109, -81068, -2176475, 645856, -327491, +-2464774, -2238752, -1163399, -2135136, -1652489, 705448, -1057099, -14930917, -1480690, 2512556, +7260106, -1416266, -3805341, 1700270, 10669236, -13439490, 3114925, -2729452, -2495376, -6051609, +3635153, -10771241, -7010461, 3699578, -5630702, 3402688, 15341623, -2718178, 6200859, -7218230, +7408819, -1928977, 2209761, -6475200, 3021510, 1833414, -3468186, 1520955, -699543, -3333432, +-221728, 4209068, 6605123, -5177046, -8248485, -6541772, -6054830, 779000, 4844186, 12824235, +-146029, 8633958, 9025337, -8402030, 6456947, -12355010, -4513474, 774705, -5491116, -5126581, +3426847, -11966316, -2361158, 8311836, -3587372, -3138011, 1101122, -3663070, 3403762, -3635153, +5837935, 7526930, -2085744, 2331094, 316217, -7646116, 659814, -4953708, -3402688, -6045167, +3433826, 2609193, -5789616, 453656, 4320737, 3995930, 5117991, 5253282, -802085, -5031554, +4159139, 2153926, 2493229, 1336272, 3009698, -363462, -92879, 416612, 1241782, 1431298, +-2046552, -657667, -1649804, -1128503, 2418604, 2042794, 2334852, -4256850, 871878, -559956, +-1735167, -2075543, 2188286, -1381906, -2302103, 549756, 555125, -798864, 5150740, 1667521, +-1001264, -1178969, -2381023, -703838, 2110440, 3157338, 812823, -38655, 3230889, 35344896, +-1748052, -14031121, -1790465, -651761, 1304060, 4420058, 1782411, -1658931, -1488206, -7084012, +-3372623, 3913252, 8611409, -7121056, -4489852, 5735929, 437013, -2113124, 2281165, -599685, +-8231842, -8386461, 11337103, -1093606, -751619, -1932735, 5811091, -485868, 590021, 3684008, +-6251862, 6573985, 2724083, 1045288, 2499671, 6571837, -15902116, -7139310, -3884261, 14603963, +1868848, 1066226, -4526359, -4994510, 4361540, -688269, 5060545, -1836099, -10166724, 1060857, +1223529, -1564442, 4915590, 2187749, 1308891, 8086350, 19760070, -1591285, -1686312, 7505456, +2274185, -2361695, 5159867, 15363635, -1741609, 2920041, 5558762, 4454418, 3990562, 4065724, +4560182, 3500935, -4080756, 6117107, 10963978, -2561411, 4196183, 37044, -1395328, -7619272, +4724464, 1770600, -631360, 2277943, 2621541, 606127, 292595, -2582349, -2957085, -1182190, +-5878200, -2628520, -3987340, 5076115, 2486249, 1916629, -838592, -788663, 288837, -3393561, +-3758, 1219234, -4669703, 4064650, -2041183, 706522, -1435593, 202937, 1537061, 1837709, +-3640522, -3611531, -3001645, 385473, -629213, -1015760, -286152, 2499671, -674847, 244276, +-1501091, -3212099, -1750199, -105764, 7136625, 7946763, -10135049, -2946885, -8603356, 8507793, +15950972, -7649874, -1795833, -8776229, -3812320, -10618233, 7560753, -6487548, -2633889, -700080, +75699, -4236449, -5195300, 9507984, -8641474, -3210488, 991601, 6481106, 6943352, -9982041, +-2923799, 3812320, -8563628, 4848481, -6791417, -2790655, 2513093, 179315, -3710852, -1056562, +2058363, 11110007, 1387274, 2491081, 14496, -9542344, 10412611, -5126581, -7785702, 6215892, +-5545340, -6316287, 8213051, -3735011, 1065689, -1840930, 1118839, 10746008, -1825361, 2385854, +-9402220, -770410, 10988137, 2421825, 10887742, 9271224, -3040837, -2414845, -12617540, 1907502, +-2101313, 8345659, 10293426, -5939403, 2582886, -18605798, -5052492, 6114423, -6389301, 9584220, +674310, 2039036, -3379603, -760746, -4424890, 746251, -3040300, 6751689, 6713034, -347892, +2308008, -148176, 3809099, 1584306, 2769180, 5694590, -1694902, -6508486, 3000572, 1421097, +4130148, -1117228, 4380330, -939524, -1471563, 1042066, -2575370, -1790465, 483184, -4596152, +1308354, -1636383, 4066797, 1683090, -255014, -914828, -2613488, -4086125, -279173, 485868, +1679332, -1540283, 946503, -3850438, -5369, 163746, -1953673, 2475512, 303869, -6442, +1129040, -1306744, 248034, -44560, 6364605, -8176007, 2750927, -7647726, -865973, -10317585, +16855062, -5007932, 1114007, -5368709, -15441481, 8846559, 3076270, -11533061, 7084549, -5214627, +-3847754, 3987340, 15953656, -8014409, 15410880, -338229, -10888816, 422517, 3575560, -9584756, +10510859, -5564130, 7774428, 16938278, 1627793, -7959648, -2250563, -935766, 3859028, -6773701, +-3713536, -940598, 8333847, -3016141, -3390340, -11138998, -407485, -13163538, -2451353, 14855755, +-3368865, 8448201, 775778, 2234457, -19534586, 242666, -12509092, 10030896, 17453136, 5369783, +4366908, 1063541, 2595234, -10215580, 3569655, 5426691, -4563940, -1290101, -4047470, -2582349, +7858180, 162672, 9536438, 29268592, 10677826, 2908230, -10075993, -9362492, -6076305, 5741835, +-9976135, -877784, -923418, 2026688, 5619965, -5475010, -1044751, 5434744, 5965710, 1221381, +1007170, 4057134, 5136781, 4290136, -60130, -961536, -977105, 446140, -2137283, -2662880, +2323577, -1349694, 3617973, -4444755, -1412507, 3063386, 2602213, -269509, 2351495, -2290291, +1069984, 1610613, 2184528, -2513093, -2470680, 3470334, 2480344, 1946694, -898722, -1753420, +841814, -4946729, -1297617, 790274, -2632815, 1200980, -1825898, -1287953, 563714, 399432, +-412317, -981937, -3278671, 30987116, -16178068, -63888, -7841537, -15140297, -20332912, 6126234, +-6255620, 6463389, -19224810, 4228932, 7377680, 6669011, -7854422, -17626546, -13795435, -11531450, +527744, -6556268, -12763569, -8677981, -4226248, -10367514, -7116224, 2136746, 13914620, -20401, +2291902, -156766, -11567958, 7662759, -731218, 2469069, -2309619, -7576859, 7063074, -9528922, +-13405130, 12619688, -13069585, 2945811, 221728, -18513456, -10889353, 7634305, 4832, 9320616, +-5667210, -19690814, 258772, 963683, 7789460, 8224863, 18997178, -10550050, -38102804, -13186623, +-12773770, 8858907, -24707874, -8221105, -3839701, -22707492, -7313793, -147640, -4033511, -4065724, +5350456, -5952288, -206695, -5570573, 5735929, -13262859, 5208722, 11083700, -13323525, -6637335, +7073811, 5525476, 4886062, -13758928, 3670050, 399432, -1632088, 7654706, -1522029, 6335614, +5740224, -978716, 2025077, 1407676, -1340030, -4425964, 7993471, -2276333, -5026723, 398358, +136902, 4323422, 1802276, 244813, 1627793, -3802657, -3770981, 695785, 1800128, 2684892, +4735202, -278636, 2358474, -200790, 2127620, -4464082, -1682554, -3024194, -2639794, -257698, +-279710, 1966021, -4967130, -2179696, -3624416, -2587718, -5216775, -6614250, -5729487, -409633, +-182536, 992674, -3376918, -4562866, -17725330, 7021198, 8766028, -2913062, -3416110, -8823473, +-9756555, 22551800, 8203925, -21007222, 7272990, -11430519, -1100585, -10378788, -21616034, 6382322, +-11272679, -4671851, 878858, 678068, -5518496, -18226230, -11352135, 9020505, -11228118, -250719, +-9938017, -15146739, -5950677, 16956530, 2676302, 3079492, -14760192, -4860829, -3052648, -1838246, +5945846, 7489349, 9500468, 11902965, -5811628, 6752763, 2280628, -6723235, 4139275, -11361799, +-10042707, -8526584, 3668976, -9862319, 423054, -14882599, -13217762, -6655589, 15489800, 12276627, +11752641, 13172665, -12070469, 16476568, 474594, 7670275, 22391812, -4468377, -4206921, 3811784, +-10888279, 4617627, -5155035, -13805099, 1747515, 11579232, -13571023, -9450539, -1730335, 12438225, +-10334765, 1348083, 3699578, 7554311, 1767379, -2871186, -7078643, 2061584, 5140539, -2687576, +578210, -3428995, 1068910, -3248069, 1284732, 414464, 1838246, -1113470, 1239098, 2674691, +6236830, -616328, -239981, 710280, 2846490, -4512400, -2066416, -4985920, -1560684, -969052, +-6047851, 1313723, 5261872, -289910, -7188702, -1007170, -766115, -5951751, -7047505, -9907416, +-4320200, 4067871, 495532, 2936684, -1669132, -1616518, -3772592, -329102, -9029095, -1414118, +5171141, 8666707, -588947, 2752000, -5199595, 851477, -3163780, 4544613, 1742683, -8490613, +-19796042, 22637162, -17690970, 23441394, 13120588, 8924942, 5017596, 9206799, 10005126, 9244917, +25197500, -8828842, 1775969, -1692217, -4349192, -774168, 3123515, -2350421, 4847408, -1644973, +7881265, 6601365, -1419487, -4376035, -25116432, -8959839, -18218178, -853625, 9605157, 9677098, +3082713, 4923643, 7241852, 5969468, 7019587, 17974438, 26831198, 17985712, 3631395, -3428458, +-5182415, -7719667, 9388799, 9543954, 10721849, -7990787, -6281927, -9907416, -1632625, 13056164, +128312, 15648713, -9498857, 8373039, 5057861, 14041322, -29389924, -21069498, -8617852, -11834246, +-12081743, 3606699, -4930086, 18479634, 5494874, -20646982, -1697049, 33356326, -11248519, 10388452, +-5039608, 13696114, -6385543, -4194036, 497142, -5689221, -7441568, -557809, 5616744, 8235600, +5763846, -2190433, 6499896, -1750736, 3011846, -8527121, -5779416, 5425618, 3474629, -8574365, +-3716221, -3654480, -1135482, 2100239, -2238752, -4218195, 1944010, 353261, 1414118, -700617, +-2402497, 3767760, 1254667, -2181844, 5040144, -733366, 1494649, -967978, 5943161, -5066988, +5295695, 2283849, -4940286, 3244311, 195958, 841814, -5150203, -15129022, 5679021, 94489, +1114007, -1767379, 5774047, -1433445, -2670396, 1802276, 4516695, 3689377, -2206003, 4583267, +-14397804, -7163469, 12100533, 5334887, 8950175, 23195508, 2066953, 15526844, 22664542, 15760919, +-10125385, -22877680, -682363, -10460930, 24850144, 7205345, 19435264, -2689187, -10276246, -3748433, +-11221139, 4535486, -8612483, 1117765, -9603010, 5112622, -6990596, -2918967, -15476915, -15371688, +-1435593, -22049288, 12202539, 8396661, -6518687, 11373610, -5291400, 4452808, 12699681, -13929653, +-18221936, 3302293, -3903589, 30798674, 13167296, -33716568, -9012989, -9547175, -17313550, -18403398, +-37602440, 6674379, -13408351, -3513820, 5508296, 1392106, 7866770, -1479079, -4357245, -28563144, +3504693, -12981002, 3618510, 16764868, 3636227, 11242077, -16916266, -22598508, 4679904, 14013941, +9547712, 5262409, 9078487, 14565308, 18341120, 18737332, -16543140, -10035728, -11883101, -8592619, +-13890461, 19761144, 11712376, 11135776, 3175055, 8511551, 7429757, -711354, 10463614, -15946140, +-5472325, -1920924, 1443109, -3469260, -11157788, 621160, -2145336, 1444183, 3812320, 11521250, +789200, 5373541, 5567352, 832687, 5904507, 155156, -3324305, 667331, -8503498, -3562675, +4794794, 6617471, 2220498, 1173063, -10422812, -1077500, 554588, -5151277, -3346317, 1515587, +3590593, -9793062, -10572599, -4975183, 3853660, 3058017, 5704791, 1243930, -3221762, 2338073, +-10923176, -9995463, 40831180, 26975616, 37464464, 2448668, -7403987, -25419764, -7485591, 4275640, +5922760, -6045167, -19641960, -7086696, 32370094, 13397077, -4457639, 9928354, -713501, -11866995, +-3455838, -7736847, 22074522, -1675574, 1309965, 9540733, 641024, 10824391, -97711, 15314243, +-14059039, 17642652, 3582540, -8186208, -4952098, -9069897, 15922518, -22022444, -23791434, 15075872, +24908126, 1189706, 17197586, 23656680, -26601416, 8879845, 5449240, -1439351, -231928, 3973919, +-9979357, 18579492, -11252277, -8928700, 7505992, 967978, -2003602, -4293357, -5539971, 2699924, +-17570712, -5241471, 14164265, -17317846, -3988414, -11689827, 445603, 35116728, -11018739, 2280091, +9395241, 197569, -8075076, -21896280, 21422224, 10016401, -44146896, 10966125, 11115912, 8240969, +-9896678, -4586488, 22557168, 1037772, 1665374, 5808407, -15684147, 625992, 9985262, -4052302, +5771363, -1228898, -5095979, -13053479, 1996086, -1694365, 12125230, -1104344, -513785, -8684961, +9606231, -3206730, -3337190, -13778255, -6937446, 4878009, -8886287, 760209, -4379793, 5546951, +-5203353, -11078868, 5609764, -11936251, -3280281, -5411122, 558346, 754304, -4491999, 11949136, +-1476932, 16103443, 9805410, -1590212, 1686312, 10313827, -7134478, 1870458, 1219234, 9900973, +-8942122, -5270462, 454193, -18234284, -43700756, 38878044, 23174570, 12326556, 8668318, 19206556, +-44100188, 18107582, 20364588, 8722542, -28232430, 15710453, 28540594, 13230110, 31470836, 11481521, +537945, -1247151, -987306, -5358509, 13334800, 22362284, 21296058, 7446937, -6544457, -11105175, +2654827, -10110353, -11840688, 12458090, 8564165, 2374043, -11866995, -11543261, -2538326, -10035191, +5118528, 25701084, -4570919, -8307004, 8672076, 4659503, 7612293, 8977019, -1968169, -5184563, +20645908, 13663365, 6748468, 9113921, -1666447, -20517596, 4757750, 13662828, 1768453, -15270756, +20434380, 5331128, 28425704, 1057099, 25553444, 2734284, -8378408, -2719251, 6127845, 36381056, +-4597763, 13078175, 8963060, 17190606, 9003325, 81068, -1105954, 11215770, 51760800, 2423435, +20765630, -17547088, -13107703, 6577743, 8137890, 10091563, 4148402, 1658394, -25440702, -10061498, +-26676042, 1458141, -4582730, -8808441, -7460895, -2962991, -11255499, 1416802, -1169305, -11829951, +8459475, -13778255, -6696391, -12439836, -8509941, -814970, 1367410, -9949829, -11552925, 2781528, +7340636, 8579197, -1747515, -3278671, -14862734, -19422916, 1940252, 2381559, -8857296, 17685064, +17107392, 25323128, 8878771, -5564667, 3457986, 7827578, 9582072, 11511586, 1696512, -11989938, +3025268, 15389405, 7876970, 803159, 6154152, -28472948, 31227096, -463856, 27638652, 695248, +1881196, -25073482, -7707856, -11271605, 19173808, 4896263, 8500277, 5087926, -19262928, 1930588, +1547262, -16893180, -24217710, -24720222, 8383240, -9171366, 22544284, 1327682, -7152731, -5819681, +4860293, -8694624, 1451699, 6645388, -9490267, 5365488, 7592429, 2630668, 2163053, 17093970, +28659244, -5572720, -242666, 14450954, 11777337, 17301738, -12822088, -4968204, 5173825, -17104170, +1645509, 1546188, -22816476, 29427506, -1477469, 14884209, 12753905, 9040369, -17379048, 1711545, +14761803, -11978664, 26307748, 7319161, -9698573, 21882322, 16371878, 11553999, -36772436, -7386807, +7231651, -12438225, 1893544, -20371030, -5212480, -30919470, -8969502, -4636417, -8667781, -34267396, +-3556770, -9270687, 51552492, -7318088, 10405632, -5181878, 8144869, -4206921, -8559333, 5718749, +-7202660, -950798, -3940096, 14025216, 4845260, 6253473, -22457310, -19800336, -15059229, -6045704, +3796751, -27885076, -4674535, -2085744, 1939178, 10446971, 7606924, -656056, 10713259, -9630927, +48855, 787053, -16335371, -22109954, 4217658, -6318971, -20890720, -5463199, -9945534, 1633698, +-22334366, -2297271, -9870909, 13301514, 2684, -9205189, -3663070, 4319664, 4941360, -1860795, +9756018, -9842454, -6520297, 13214541, 12097312, 21910238, -7486128, -1610076, -3106872, 5869610, +15591268, 13636521, 10031433, -8127689, 6086506, 17149804, 16530255, 7013682, -21041582, -24319716, +10110890, -3746285, 7178501, -4850092, 19757924, -15559593, -3604551, -5663988, 17169668, -13717052, +30464204, 37598680, 38320772, 1945620, -7682086, 5858873, -5528160, 9055939, -2142115, -651761, +-11860015, -31580894, -10865730, -30261266, 16608102, 15666430, -18877456, -14186277, -18925774, -9038222, +-3161633, 40247600, -24696, -21168284, -22797686, -1762547, 27930172, 13174275, -57512832, -12042551, +-10590852, 7088307, 20910586, -25163676, -8359080, -15147813, 5956583, -34185256, 16281147, -6035503, +-1286343, 8977555, 868657, -16940962, 32821066, -3735548, 15339476, 35310536, 72653664, 43499428, +-1599339, 24269250, 36791764, 47617764, 51496120, 14506252, 31336618, 8739722, -123480, 19191524, +-15934329, 31728534, 13222594, -14324253, -48399988, -35185444, 3999152, -13972065, -10360535, -9190693, +-5850819, -6228240, -20263118, -13251048, 184147, -3389266, -1632625, -6540162, -2301029, -10602127, +12202002, -21602074, -9263708, 5848135, 3362960, 1606855, -6054294, -6962142, -4320200, 3988414, +-3955665, 10673531, -13452911, -16465294, -16769700, -10277857, 11770358, 13553843, -5756867, -2692945, +4467303, -2918967, 22377854, 4707284, 1442572, 18121540, 10945187, 10257456, 25479894, 16876000, +19022410, 5864778, 8859444, 21271900, 7709467, 16466905, -15955804, 8644695, -7516730, -16585553, +18587008, -23964306, 39470212, -4922570, -7555921, 506806, 31369368, -21355652, -4009352, -1140314, +146029, 11268384, -8477729, 16349867, 5455682, -3319473, 3546032, 1701344, 12703976, -40009232, +-12865575, -1409286, 3897146, -4125316, -29337310, 23627688, -1649804, 3076807, 8286066, -19106698, +-8973260, -44097504, 11285563, -10462540, 8058433, 31906776, -9168145, 6561637, -4510790, 15132244, +-26613764, -35249332, 30348776, -3043521, 2244121, 5053566, 30515206, 22383222, 26424250, -610959, +-36342404, 21170430, 9583146, -8630200, -13141526, 20238422, -4168803, 25630218, 42174432, 33003066, +5191005, 2764348, 30982820, -6324340, 9190693, 25756918, -18090402, 29804926, 17832168, 10561325, +-21634288, -10546292, -28712930, -914291, 9183714, 41925860, 17190606, -39087960, -4115653, 25159382, +-4223027, 12219182, 16372415, -27721866, -7379828, 13463649, 2708514, 7513509, -12641699, 8947491, +14660871, 1956358, -354335, 22276384, 3668439, -4813048, -6382859, 7399692, -2573222, 11986180, +1274532, 9081708, 9684078, -1540283, -11327439, 21976274, -3799972, -6694244, -2071785, -14852534, +-15652471, -9783936, -11057930, 7196755, 12304008, -12986907, -11892228, 2687039, 18811420, -28098750, +-7566122, 10990821, -4082903, 184147, -4590247, -2922725, -21026012, -146566, -6175089, 5763846, +776315, 3535832, -564788, 1934346, -5052492, 8796093, 4145180, -2320893, -4952098, 3730716, +435939, -1570884, -55158656, 12639552, -9129490, -2161979, 43073692, 18519362, -13506062, -10454487, +-163746, -27857694, -34135328, 2892124, 295279, -19200652, 20379620, 2477659, -19704236, 12459700, +37047316, -4955856, -21351894, 13415330, -12576738, -13691282, 6908455, 30103426, -9805410, 4417911, +8243116, -9269613, -22413286, -14687714, 29705604, 10468446, -29310468, 25075630, 9816685, -20065014, +-10509785, 41286984, -13441100, -31661426, -16293495, 54871964, -54175644, -25087440, 32115618, -14530411, +-17437568, -51592220, 40235792, -33029910, 11806865, 1729798, -6222871, -58262840, -17252346, 49894636, +31425738, -39412768, -10826539, -17059610, -8109435, 8099235, 10801843, 13001940, -68880536, 37674916, +28840168, 30320858, 434865, 15881178, -33725156, -29931090, 58885612, 24196236, 6488085, 23746874, +-31758598, 6405944, -14076218, 15180025, -8610873, 41369124, -16902844, -14350559, 5687611, 5016522, +-15691126, 9443022, 4494147, 3548180, -3003256, 2123325, 3271691, 3395709, -3931506, -2207613, +8600135, 529355, -4655745, 18124226, 5267241, -16052977, 1704028, 15552077, 3975529, -15266998, +20450486, 36885716, -18192944, -21095806, -5812702, -4731980, 12418898, 27033598, 8091719, -24953760, +-8416525, -3600793, 3626026, 7633231, -4306779, 11079405, -8083666, -921271, 6349573, -10664404, +-45574972, 7809325, 56734372, 17680232, 6018860, 1475858, 4187593, 24285356, 33273648, -7709467, +6147709, 8546985, -5828808, 20039780, -10695005, -2929705, -8116415, 15377057, 11388643, -6395743, +10462540, -15236933, -12443594, 15355045, -10019085, 16881906, -11404749, -5104032, -428960, 9191230, +-678605, 6818261, 2694555, 17195438, -12462921, -2554432, 201863, -6956237, 16579648, 14390288, +-12060268, -4325032, -7452305, 3753802, -15530065, 8240969, 4653060, 7558606, -6270116, -4758287, +18884434, -22901302, -4054986, 9550397, -6300180, -4229469, 9825811, -28125594, 6662568, -10230075, +1568200, -10018548, 24144696, -7973070, -10586021, 9882183, -5618354, -15974594, 30736934, -928250, +3051038, -6969122, -11987791, -14073534, 15454366, -17556752, -8536784, 17718350, -24391120, -10650982, +3027415, -2349884, 2876554, -453119, 3362423, 10743861, -3988951, 4169340, -5053566, 11279658, +6118181, -549756, 864362, 6847252, -6170258, 4959614, 723702, 5462662, -2592550, 8527121, +-4470524, 2248952, -7567196, -6513855, -10302553, 1846836, 511638, 3360275, -5090610, 11368778, +-3856881, -2018098, 9716290, 8587787, 4551055, -4069482, -6655589, 5847598, 7738994, 4851166, +3301756, -151934, 6992744, 7616588, 3318399, 6464463, 789737, -5091684, -300648, 14928233, +-42287176, -119658328, -98298920, 52078088, 14983530, 119087096, 212701280, 31659278, 67102960, 24467354, +-169536848, -53552336, -114994528, -138956688, 3964792, 22286048, -57943404, 84127672, 110051560, 61826056, +175484848, 101261904, -22524956, -41554344, -81365472, -158361888, -125089848, -36792300, -111544056, -15458124, +96311960, 16170552, 22443888, 145644496, 74282000, 46027552, 151780384, 23479512, -41867880, 59427852, +-79454208, -157319824, -65857416, -132712344, -166206112, -2324651, -34698504, -43645996, 110716200, 122110216, +77644952, 184184848, 148529632, 70176544, 63369020, 36800892, -123001424, -113037096, -143292992, -189079488, +-151702544, -63895156, -43982076, 3999152, 108756088, 132379480, 138436464, 132839584, 122972432, 26353920, +2264522, -20769388, -93776856, -102605160, -59391880, -107593224, -45352172, 9517648, -23533200, 54172960, +97235376, 29862370, 41058276, 18399104, -26593364, -16446504, -40691056, -52773336, -6400575, 14998563, +367757, 43750684, 40218072, 4694936, 38710004, 134218, -49121004, 43423192, 12976707, -43511240, +30601642, -32198296, -65643744, 30071750, -46743740, -115453552, 1731946, -50758996, -33752000, 114666496, +51730196, 54581520, 163784816, 108777024, 60182692, 71656160, -17970144, -103492072, -131838856, -178711440, +-197983504, -125429152, -80383000, -13737990, 75077640, 167717392, 184826944, 171645680, 178404352, 95595768, +4105989, -45518600, -117962352, -150462368, -97784592, -108713672, -87010672, -17450988, 2742874, 11485279, +42071888, 36158792, 31053150, 56232396, 55504936, 47275240, 55187644, 38605312, 12290049, -4423280, +-24950538, -54898808, -61031484, -51034948, -54644332, -40052716, -21967684, -3133179, 16164109, 40825812, +44159780, 40898288, 37124088, 26186416, 9602473, 817654, -3697967, -15650324, -16220481, -9794136, +-12292733, -14273250, -10107132, -15697569, -14224932, 247497, 1376000, 110595, 5337571, 2545842, +2959233, 12268574, 12438762, 13592498, 15623480, 8404177, 2361158, 529355, -4701916, -9816685, +-12713640, -14305999, -14755897, -10423349, -4828617, -312996, 3998615, 8468602, 8866960, 9455371, +9275519, 5036386, 177704, -948651, -3879429, -4543539, -3332895, -1042603, 864362, 2592013, +2745558, 2111513, 460098, -2187212, -4085588, -4489852, -4865124, -4706211, -3590056, -1403381, +1792612, 3970697, 4594542, 5500780, 5881421, 4587562, 3154117, 1469416, -689879, -2100239, +-2970507, -3582540, -3296388, -2416993, -1619740, -624918, 387084, 992674, 1302449, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -10530723, --12826383, 6532109, -2314451, 5718212, -2777770, -2840584, -5715528, 1399623, 1261647, -214748, -134218, -602369, -4362613, -468688, -2477659, -2852932, -2704219, -62277, 370978, -176631, --455803, 2226941, -566936, -6618545, 4184372, 2103460, -2230699, 708670, -25770, 114354, -974421, 4326106, -2348273, 296353, -7511898, 3805878, 780610, 1742146, 2647311, 4283156, --2333778, -1759863, -820876, -3753802, 340913, -528281, 3317862, -1721745, -188979, -1794223, --2069637, 4039954, -2976949, -1413044, 410169, -2690260, 2317672, -57982, -1249836, 2515777, -4568235, 328565, -142271, -592169, 3909494, -3808026, 67109, -557272, 2061047, -903554, --1733019, 4261682, -42950, 935229, -1139777, 920734, 2298344, -1771674, -2511482, 175020, -2244657, 3764539, -1644436, -1087701, 944893, 248034, 597537, -1658931, -521302, 1064615, --201327, 762357, -1320703, -372052, -804770, -1115618, -815507, -734439, 617938, 153008, --563714, 642098, 433792, -484794, -140660, -82678, -706522, -1264331, -345208, 49929, -294742, 761820, -75162, 510564, 289373, -569083, 545998, -15329275, 2623151, 1826972, -5393405, -2094870, 1645509, 6265821, -2405719, 1721745, -3777424, -5555540, 2054068, -3778498, --4308389, -4329327, 1324461, 1665911, -7386270, 4362613, 2903935, -1250372, -2692408, 1741072, --654446, -1677722, 555661, 2462627, 1835562, 3927748, 777389, -1186485, 4056597, -2023467, -8824010, 1988570, 5445482, 2096481, 4780836, 2124398, 3302830, 1780264, 416075, 187368, -6685654, 1134408, -1043677, 445066, 3543348, 2608656, 409633, -294742, -1342177, 745177, -8153996, 2333241, 3784403, -3924526, -1991791, -4139275, -2588792, -4018479, 3049427, 1908039, --2538326, -1829119, 1840930, -1915019, 2051384, -901406, -577136, -2780455, -4655745, 2018098, --7581691, -1076426, -1592896, -1927904, 447213, -1778653, 390842, 2866891, 1423245, -1955284, -389768, -1551557, -3280818, -539018, 1626719, -165356, -2523830, 928787, 506806, 969589, -1791538, 65498, 284542, -1207960, -690416, -180926, 19327, 627602, -1345399, -1188632, -129386, 8551280, 11814381, -3731253, 3114388, -5996848, -398358, 267899, 15119359, -1640141, --4101157, -6637872, 69793, 4277788, 6910066, -1661616, -9260486, -2725157, -3582003, -2591476, -3037079, -758062, 5757404, 566399, -3384971, -7508140, 2145336, -780610, 1643362, -980326, -756988, 3553012, 1253057, -9424769, 1043140, 5923834, 2874407, 653909, 1357210, -1585917, -4082367, -5607617, -620086, 4470524, -3223910, -84826, 7320235, -3504693, -431107, -2594160, -4472135, -4874788, -3635690, 2130304, -5048197, -2534568, 6380711, 3713536, -5857262, -2216203, --949725, -1519882, -2714956, 1988570, -2342368, 2293513, -153545, 267899, 959388, 4791573, --637803, 6638409, 3393024, -5250598, -2462627, -2607045, 3956202, 1117228, -355409, -2161442, -5325760, 1997160, -184147, -203474, -1435593, -1328219, 1522029, 536334, 1697049, 4133369, -1449552, -314606, 192737, 253940, 1285269, -367220, 437550, 1930588, 354872, 2410014, --537, 797253, 1194001, 1443646, 465467, 882616, 1026497, 827318, 1351304, -526134, -358093, 897111, 1385127, -213138, -1202054, -1402307, 239444, 28406376, -10473815, 5777805, --7996156, -813896, 296890, -563714, -4233227, 2346126, 3279745, 816044, -3076807, -6554657, --235149, 4042101, 2865817, -2867965, -4942434, -374199, 4443144, 8123931, -4361540, -561567, --3291556, -7062000, 799401, -3539053, 2157147, -2612414, 5519033, -9651328, 6539625, -400506, --5759551, 1432909, 2428804, -652835, -3049964, 219043, 7572564, -255014, 1247151, -1039382, -2898029, 1367410, -1788854, -2811593, -6226629, 4068945, -1305670, -1799054, 2390686, 75699, --10467372, 8074539, -11266773, -6465537, -7981660, 1753957, -941672, 4816269, -2619393, 2578591, --4809827, 2345589, -1264868, -1927367, -5306969, 3281355, 3719442, 6413460, -1561221, -572841, -1716913, -1899986, -1156420, 1265942, 3673808, -4840428, 2399276, 3543885, 3881040, -6142877, --5067525, 2158758, -3174518, 1653026, -69793, -329639, 526134, 819265, -281320, 1501628, --1819992, 918586, -579284, 3658239, 194347, 929324, 792421, 275415, -1446330, -78920, -330712, -390305, -22395034, 2284923, 238371, -1900523, -3453154, 3920232, -3036542, 2609193, --802622, -37044, 3622805, 4715874, -2896956, 3474092, -1009854, -1912334, -6279779, -305480, --8485782, -6229850, 7475928, 2669322, -2889439, -1054415, -871878, 5189394, 2741800, -2663417, -4733591, 3149822, 1860258, 1640141, 2019172, 3605625, 3106872, 3063922, 8362302, 7523709, -3256659, 838592, -5182952, 5786395, -7704635, 1531156, -2138357, 6267968, -4708358, -6133750, -10566693, -2451353, -5641440, -5035849, 7868917, 4830228, 303332, 4046396, 5717139, 2623688, -9236864, -542240, -1439351, 5240397, 3215857, 315143, 224412, -4789963, 2894808, 3000035, -7461969, 3037616, 4653597, -2852932, -3806415, -8118562, -1848447, -4387846, -3476239, -3693672, -4124779, -137976, 336081, -2372433, -2733210, -756988, -2401961, 759136, -1611687, -2685965, -1125281, -257161, 121333, -2513093, -346819, 112743, -3153580, -426812, -734976, 220654, --1404991, -1640141, -1000727, -602369, 78920, -520228, 525060, -732829, 909996, 223875, -807454, 1752884, -376883, 1851131, 401043, 1220308, -819265, 388695, -1565516, -579284, --242666, -1902134, -566936, -927713, -29732984, 8126615, -6255620, -9305584, -9199820, 5897527, --6798397, 5223217, -8570070, 4900021, 4202089, 2627983, -9028021, 6380711, 5369, 3908420, --7459822, 4335770, 9079561, 6966974, 364535, -3095061, 1377074, -1821066, -9546639, -1842541, --4527433, 2326262, -5961415, 5334887, 5236102, -1908039, -108448, 7297150, -1458678, 4987531, --3804804, -6146635, 3379066, 5369, 3492345, 8949638, 5493800, -215822, -15288473, -7271917, --2022930, 2252174, -2253784, 8597988, -13267154, 4350265, 1932735, -21475, 4312147, -1620276, -6616397, -13916768, -6432788, 5549635, -13984950, -2500745, 6696391, 2470143, -2999498, -9292162, -3608310, 6182606, 4569309, -1566589, -9752797, -738198, 190052, -1007170, -411780, -4719632, -2305324, -7617662, 4868883, 781147, -4471061, 1018981, -5401458, 530965, -6483253, -1735704, -2428267, 2544231, 330176, -523986, -2159295, -1604707, 576063, -3767223, 3237332, 350040, --1761474, 122407, -3232500, -2530273, 861141, -1267552, 1929514, -1653562, -869194, -1046361, --1154809, -2156074, -267899, -1155346, -388695, 741419, -413927, -913217, 946503, -303869, --760209, -787590, -1893007, -1300301, 381715, 1167694, -190589, -14039711, 1512365, 2335389, -10994043, -10390600, 12006044, 3397319, -968515, -2828236, -1294396, 1105417, -8778376, -1690607, -2815351, -2894808, -5150740, -1403381, 8307541, -8591008, -1863479, 8581882, 42413, -3420942, -3035468, -4194573, 6329708, 2765422, -75699, 3147674, -3665755, -5796059, -407485, 424665, -4738423, -10152766, -5458904, -4491462, -3124589, -3022046, -3064996, 1501091, 504122, 823023, --7555921, -7787850, -6159520, 203474, -9708237, -5388037, 5826660, -3957276, 1293322, 597537, --175557, 2405719, 3459596, 3265249, 3915400, 5709086, -1006096, 6177774, -389768, 3111704, --511101, -4007741, -228707, -6448894, 3976603, -7544110, 7026567, -8415988, -120796, -8680666, -828392, -8723079, -8355322, 3928821, 11522324, 3445638, -7418483, 5266704, 7516, -3313567, --1952063, -3471407, 4588099, 3914863, 5640903, 981400, 4400194, -3743601, -390305, 4269198, -515396, 1294396, 857920, -2128693, 2588792, -270046, 970126, 3777424, 1127966, -987843, --2269890, -1086627, 1583232, 1518808, 1253594, 401579, -1766842, 97174, -368830, -4037269, -3890704, 406948, 1428614, 140123, -940598, -1934883, 1374390, -1972464, -914828, 38830264, -267899, -11457362, 1574642, -6314139, 15363098, -2752000, 4181688, 932545, 557809, -13882408, --7204271, 7375533, 6470368, -10984916, -2086817, -537945, 9397388, 4504347, 3457449, 9190693, -1287953, 403190, 7971996, -3069291, -12621298, 1622961, 9316321, 5410585, -3788698, -28454, -6440304, 3823058, 1624571, -574452, -7162395, 3172907, -7773354, 532576, -14469208, 3521336, -4212826, -1380832, -6758131, 8842264, 4583804, -2106145, 6868190, 3024194, -6129455, 10657961, -991064, -4089346, 2345589, 10932302, 1556926, -519691, -9494562, -5665599, 1126355, 3550864, -12543989, -4429722, -5221070, 867583, 6767258, -4723391, -5692979, -734439, 9071508, 6381785, --2480344, -7339562, -546535, 7836168, -3388729, 16532940, 3482682, 2263985, -8758512, 7043747, -270046, -2100239, -4533338, 183610, -2606508, 201863, 10206990, 4482335, 3613141, 1731946, -1035624, -78383, -837519, 709207, 1925219, 3490198, 418222, 419833, 1216550, -3097208, --97174, 974421, -797790, 2999498, -2466922, -325881, -1287953, 1020055, 5355288, 1621350, --1876364, -676457, 1159641, 200790, 1687385, -624918, -2528125, 1927367, 1819456, -2133525, --653909, 4585952, 1511829, 2222109, 8858370, 4729833, -13822279, -1390496, -6962679, 13990856, --5179731, 6542309, 1298691, 8773008, 3500935, 1331977, -660351, 3583077, -3929895, -5891622, --16353625, -12115029, 4076461, 10836739, 14566918, -5310190, -7021735, -6208912, 3301756, -3393561, --673236, -564788, 2021856, 2229088, 9754408, -5141076, 981400, 2403034, 4803384, -4668093, --3402151, -7714835, -5161477, -5376762, -9121974, -23337242, -191663, -3119757, -9951976, 2258616, --1048509, -12658342, 4339528, -10735271, 2841658, -1303523, -790274, 5447093, 7149510, -205622, --10377715, 3078955, -6476811, -7260106, 10180146, 9096741, 10255845, -3323231, 1749125, 1336272, --5075041, 790274, -2381023, 15888695, -2516314, -1655173, -1462973, -133681, -9594957, -12045236, -2976949, -902480, -773631, 2691334, 17427904, -2165201, -7983808, -3449933, 9211631, -1355599, --2818572, -2647847, -54224, -7406671, 1917166, -1453310, 1514513, -3762928, 302258, -4725538, --256087, -340913, 2038499, -2011118, -818728, -2910377, 4015258, 196495, -2691334, 581431, -1430761, -3091303, 928250, 1142461, 4884452, -1040993, 1248762, 3291019, 2225867, -1792612, -2164127, -3663607, -5719286, 650151, 720481, -2289755, -5317170, -1192927, -1189169, 4784057, -1963337, 3184182, -395674, 3990025, 4538707, -15261629, 5652177, 1875290, 16141024, -10842645, --6138582, -3592740, 8622684, -8209830, -7892003, 7149510, 4812511, -8303783, -8380555, -8199630, --18372260, 12081206, 11336566, 12028593, -5164698, 3815005, 11929272, -17259326, 32212, 11359115, -10523207, 4789963, -18790, -5511517, 1163936, -2643552, -14939507, 1916629, 4103305, 2216740, -9921374, -8715026, 948651, -16307454, -2065879, 3252364, -8966281, 3495030, 2762201, 7330973, -8935143, 12449500, -2536178, -4850629, -14992120, -10676752, 4630512, 22060562, -6833293, -887985, --10152229, -5351530, -8054675, 4776004, 4882841, -1664837, 723165, -16094853, -2126009, 10943577, --8711804, -7521562, 6475200, -2879776, 9473624, 2374043, -6961605, 1153199, -10517838, -3000035, --2778844, 20318416, -2032593, -5910412, 4440996, 4171487, -1785633, -3421478, -1040456, -2744484, --3776350, -3482682, -2692408, 1454920, 1570347, 3300682, -851477, -21475, -1963874, 2011655, -504659, -5177046, 1383516, -17717, -574989, 1911261, -128312, -2814277, -2825552, -6699075, -2229625, -2088965, 1971927, 2597918, -3179350, 1473711, 901406, -646393, 2535105, 38118, -7274064, 1050656, -1341640, 201327, -2138894, -354335, 1249836, 233539, -656593, 620086, --2871723, 2306934, -9378598, 22081500, -10710038, -5456219, -323733, -608812, -15476915, 1122060, --11366094, 8418136, -21464100, -3025268, -6781754, 7488276, -7305203, -7347079, -18140868, 12428025, --7387344, 5181341, -5753109, 3805878, 9845139, -6935836, -11850889, -3894462, 8318278, 17132624, -5588826, 7250442, 967441, -16990354, -9044127, -9096204, -4621385, 3130494, 15650324, 6828461, -9167608, 8617852, -2248416, -3476239, -5096516, -14172318, 903017, -9846213, 15622407, -6942278, -10798622, 2433099, -5461588, 3726958, -3594888, -4703526, -8317741, 12884365, 3457986, 21664888, -4832375, -22996328, -5651640, 7581154, 6144488, 3547106, -1188632, 2215666, 24348170, 12282533, --3977677, 2773475, -6406481, 17726404, -555661, -519691, 6950868, -15295989, -6560563, -5087389, --16429324, -19423990, 4002910, 7167764, -1719061, -9482214, -2414309, -2898566, -7472170, 294742, --1436667, -5827197, 6082748, 9341017, -1902134, -1171452, -1274532, -3419868, 2735894, 794569, --937377, -1671279, -1489280, -902480, 3124589, -1586454, -4211753, -871878, -106837, 1566053, -962610, -2452426, 6575595, -1940788, 4032974, -578210, 3383361, 1921461, -949725, -4214437, --4132832, 1647657, -1055488, -6461779, -2353105, -1437740, 2542084, 823023, -405874, 2069101, -3146064, 1245541, -1732482, -2525978, -13390097, 8005282, 17891224, -1761474, -782758, -415001, -16625818, 5152350, 3977140, 2842195, 1954210, 2829847, -6568079, 1220845, -20626044, 2957622, --9949292, 8609799, 21060372, -2740189, 1515587, -16632261, 22200150, 10776610, 9418863, -2768643, --12242804, 1469953, -4194036, 11274826, 8061117, -10102837, 512175, 5949067, 4176856, -7819525, --6972880, 32556926, -7581691, -5674726, 6830609, -8288213, -6078453, 10354092, 10106595, 402653, -3866008, 3688840, -12639015, -6266358, -577136, 4296041, 10991358, 2729989, 2563022, -14230300, --1388348, 4203699, -19472844, 4263829, -5450851, -1957431, -3631395, 5719286, -5828808, -10540923, --11325829, -17838072, 2202781, -7225746, -3539590, 11436424, -3929895, 3716221, -20187956, -29528, -18482854, 4345433, -9423695, -5561983, 11200738, 5784247, -12416214, 6943889, -9011378, -6882685, --3013457, -1716913, 4134980, -1181653, 653372, -1896228, -2539936, 1508607, 2165201, -3124589, -2590939, 8205535, 1183800, -1098975, 3415573, 5194763, -2294050, 3542811, -2401961, -3155190, -793495, 2365990, 6697465, 1821066, -773094, 2503429, -1148367, 3540127, -2099165, 3257733, --2578591, 1104344, 2716030, 860067, -4834523, -2646237, 8500277, -3624953, -7044283, 3441880, -1662152, 2576444, -1968706, 11096585, 3071975, -2527588, -1442035, 2806224, -1246614, -10273562, --10315975, 24589224, -14688251, 3854196, -9383430, 28986198, 6171331, 5376762, -9244380, -10935524, -1070521, 8296803, -8866960, -14139032, -8403104, -20569672, -8011188, -12067784, -9664, -27652610, -1949915, 15015743, 9242233, 12277164, -8543227, 3219615, 13313862, -1517734, 9656160, 3612068, -15043123, -7518341, 12546673, 9997073, 7136625, 16319802, -9119289, 9731859, -4981089, -5768678, --3841312, 3628174, -31591632, -10078141, -19636054, 22759032, -14324253, -16146930, -3459596, 12853763, -358630, -5755256, 17879948, -6366216, -5671505, -12953084, -31960462, 1575716, 2966212, 13343927, --13405667, 63888, -8177081, -10755672, 17082696, -3427384, 8551817, -18562848, -18106508, -11264089, -14232985, -1446330, -9040906, -9556839, -400506, -15743739, -10784126, 1551020, -6635188, -11739219, -17313014, -23781234, -22705882, 5945846, 64961, 10031970, 1116155, -1081795, -7351911, -6448894, -1024350, -11243151, -4577362, 9594957, 1228898, 1649268, -5611375, 5680631, 2055142, -6143951, -2823941, -4555887, -992674, -4673998, 4001836, -6220724, -1627793, 4228396, 8173860, 913754, -260382, -8990440, -2800856, -628676, 1216550, -1342714, 7547868, -339839, -3026878, 4865661, --5804649, -5258114, 3105798, 6953015, -2087891, -4988068, -6861747, 5337571, 4185446, 8616778, --11810086, -9664, 15998753, 2165737, -4750771, 8294656, -12877386, 25841208, 16236050, -77309, --11723113, -13249974, 5618891, -3278671, -1149441, -623844, 23557358, -11457899, 488016, -7945153, -8701604, -14518063, -13338558, -26261040, 6154688, -10619844, -14767171, -1717450, -25010668, -12217034, -7115687, 5436355, -3396246, 13141526, 1256815, 15910706, -6942815, -21689048, -3274913, -15860777, --3009162, -4689568, -20861730, 2841121, 17055852, -47822852, 6102612, 232465, 11919071, -2263448, --14891188, -28325846, 11367705, -3370476, 10624675, 6470368, -3440269, 16726750, -20623360, 29078002, --7237557, 16281684, 33800856, 13651554, 24056112, 9587978, 6328098, -3139621, 12572443, -4525285, --13117904, -17558364, -11413339, -446677, 9981504, -1480153, -7715909, -10834592, -9818295, 13532905, --5944772, -4661114, 12006581, 2347737, 9045201, -766652, -1297617, -3474092, 2136209, 4714264, --6123013, -817654, -14997489, -10659572, 7386807, -3471944, -370441, -1999844, -275415, -5536213, --8974871, 6708739, -5399311, 8661875, -8633958, -3772592, -952946, -5851893, -3040837, 4472135, -1775432, 10473815, -2573222, -5906117, 3877819, -12029130, 208843, 1719061, -1899449, 1025960, --1359894, 6262063, 8693014, 1714229, -305480, -3957812, -7262253, -3280818, 423591, 14471892, -7134478, -6930467, 40353904, 32874216, 29614336, -6815576, 14496, -25249038, 18767396, 23305566, -7881802, 22512608, 8943196, 7620883, 7852811, -4034585, 3051574, 6196564, -5825050, -24319716, --14811195, -942208, -16202227, -18838800, -44218836, 9657234, 7549479, 11466489, -8533563, -3058017, --5956583, 273267, -13890461, -432718, -10605885, 12184822, 10082973, -6339909, -8650064, -23311472, -39113192, -12276627, 7646653, -48855, 2428267, 6226092, -16305843, 19520090, -9961103, 6653441, -4279935, -14638859, -15160698, -2815888, -1423782, 9055939, 41273024, -3482682, 6044093, 1348620, -12368969, 8861054, 9184251, -7331509, -2296734, 3559991, -20117626, 4048544, -17235166, -27347668, -9401683, 853625, 2042257, -20023138, -48220672, 20786568, 21594022, 14959908, -27407260, 25959320, -27461484, 10201084, 7870528, 237834, -8086887, -18170932, 13458280, -12804371, 686658, 222265, --7354595, 5485210, -13193066, -1364726, -2699387, 6455336, -3768297, -6009196, -8260296, 12426414, --6969122, -2960843, 3082713, -11166915, 6049999, 5083094, -4027606, -3907883, 920734, -10371272, -9429064, -3478387, -2762201, -864899, 641024, 7077569, -5748814, -13111461, 3726421, -7306813, --2448668, -7488276, -6828461, 1030792, -5561983, -2455648, -5199058, 16851304, -7667054, -13681618, -1955284, -4906464, -543313, -23617488, -47219944, 39336532, 6395743, 7049652, -15673946, -11263552, --50240916, 13994077, 36075576, 11116986, -31787052, -15866146, 5264020, -12327093, -7788387, 14830522, --16504486, 9347459, 8357470, 6919729, -18382996, 6678674, 5807333, -8591008, -17198122, -9931038, --6565395, -4398047, -16401406, -14148696, -7733626, -16930762, 13500693, -6275484, -21856552, -7507603, -13554380, -2713883, -15128485, -8308078, -7676717, 15032, -11973295, -7209103, -19899658, -18927384, -8178692, -6692633, 25029458, 16455093, 1693291, 14945949, -21713208, 14158360, -20606716, 17452062, --2892124, 8954470, -9142912, 30960808, -7619272, 17361868, -4342212, 25473452, 10323491, 6236293, --26152056, 28508382, 22865870, 9967008, 10669773, -20420958, -3823058, 8418673, 14067092, -3587372, -3458523, -22568442, 14586783, 24831354, -464393, -17721036, -955093, -11710228, -9972914, 4883378, -20938, -4879620, 5808407, -12936441, -2971044, 517007, 3764539, -8919573, -12191265, 4731444, --5902359, -11570105, -20700132, -1520955, 6516539, -1728724, -10392210, -12613245, -3806952, 8021925, --8610873, 3322157, 4711579, 1299765, 3478387, -1084479, -5522791, -4728759, -1510218, 5774584, -1998770, -2273648, -7743826, 10652056, -6853157, -6069326, -4991826, 2108292, 12468827, -8445516, -12276627, 10278394, -4077535, 3711389, 6551973, -33640332, 27238146, -4041564, 12670154, -18884972, --6622303, -5251135, -4954245, -4965519, 15609522, -248034, -14330695, 10227391, 1157494, 7182796, -13123809, 13258027, 9664, -12783970, 48810156, -14293651, 37372120, -401043, 1564442, -22256520, --10145786, 2902324, 17734994, 8451959, -6698539, 14440217, 2385854, -21499532, 2796024, 2405182, -20768314, -1431298, 12162811, -16449188, -668941, 13887240, 6551436, 11521787, 31553514, 25191594, --4688494, 12772159, -2674154, 24733642, -20985210, 16330539, 6228240, -1503239, 14555644, -8589935, -38821136, -7384660, 18428094, -14919106, -13401372, 89121, 41407244, 13131326, -39649528, 34039764, --1315871, 11572253, -30032022, 9447854, 2787434, -59479392, 24137180, 44461500, 16700443, -19376208, --12438225, 8565239, 43861280, 24698210, 33303714, -12868259, -16993574, -15563888, 6589017, 8653285, --2045478, -17502528, -8051990, 20483236, 3269007, 4241817, -7735236, 9116605, -2945811, 3842922, --4983236, -6253473, -7221988, 12148315, 20891794, 20089710, 4241280, 10407243, 19177566, 12411919, -13401372, 18224620, 10258529, 17377974, 13290239, 4370129, -27592480, -5893232, -13085692, 7036230, -15519864, -18748070, -6803228, 20813948, 11416023, 1841467, -5309117, 17523466, -14499273, 2681133, -18453326, 14114873, 7932268, 9272298, 11170673, 6017786, 2130841, -1839857, 2641942, 965294, -9556302, 11321534, 7347079, -9314710, -4706748, -16291885, 20001126, 2797098, 13253732, -11181947, -26809186, -9779641, 12399571, 3868155, 5439576, 3632469, 2201171, -28597502, -16524350, -167504, -2412698, 18964964, 15815680, -23416698, 2223183, -13072807, -11659226, 5305895, 1304596, -8289824, -9426916, 36907192, -24831890, -2379412, 57046292, -35196184, 4001836, 19975892, -10554345, -8847096, -11762305, 18403398, -20603494, 9669582, -37309308, -4466229, 55506548, 1977833, 15694347, -6339372, -30327300, 30055108, -8461086, -995359, -14442364, 3047279, -10676752, -27574226, -17432198, -32814624, --23864448, 35482872, 14464913, 10145250, 47858284, -34423628, -20067160, 5597416, 17944374, -13836237, -8740795, -14791330, 26521424, 15386183, 9200894, 18958522, 69446936, -16942572, -5394479, -19888920, --22306450, -1926293, 29235842, -23360864, -2913062, 20302848, 22370874, 25934624, 15479062, -18345416, -4666482, -10366977, -2037425, 14911053, 5091684, -1805497, 11648488, -21519396, 1537598, -111132, -5840619, -5210332, -5254356, 12309376, -4555887, -3662533, 14330695, 17677548, 14717242, 5885179, -6373732, 11480448, 3799972, 408022, 8554501, 307627, -4485020, 3110630, 165356, -1818919, --23365158, 5184563, 15578383, 24362666, -5474473, -7644505, -7874823, 12099997, 14696304, -32723892, -4212826, -14919643, -1663226, 1162862, 2480344, 8756365, 6957847, 5688148, -7963943, -16777216, -13727252, -4046396, 31344672, -28466506, 7196755, -2046015, -9131100, -8274792, -4114042, 9622874, -5916855, 6546604, -1509144, 17554606, 3070365, -22907744, -18064096, -2460480, -10616085, -13157632, -3006477, 14534706, -2040110, -3252901, -21027624, 10399190, -3375844, 21562884, -7322919, -41333692, -5061082, -12217034, -6241125, 118648, -33571612, -17598628, -28840168, 580357, -2103997, -8029978, --38182260, -15464030, -3344706, 20024212, 22057342, 1838783, 1677185, 10816875, 2433636, -26164404, -22990424, 31387084, -13604846, 4806606, -13633837, 5727876, -124017, 23933706, -26801670, -19362786, --61283816, -21659520, 15424301, 24765318, 17543868, 16016470, -15117748, -4933307, 12198781, 11807402, -26563836, 12686260, 11331734, 20546050, 5143760, -22470196, -24183350, -32678258, 13645111, -20859046, -1800665, -18280992, -28337120, -42800960, 6039798, -12343736, -13456133, 3898220, 3998078, -1551557, --6231461, 966368, 14074071, 9883257, 3562139, -5386426, 10155987, 23131620, -5156108, -12527346, --10407780, 11386495, -6087043, -5103495, -20651276, -19825570, -15391552, -33934536, -1967095, 170725, --13706314, 6105833, 9101573, 6785512, 16852914, 4764193, 19904490, 1389422, 5404680, 22131966, --10853919, -524523, 3183108, -102542, -15430207, -486405, -3078955, 26656178, -1833951, -10951630, -8185671, 3395709, 7633768, 17107928, -3082713, -185757, 9628780, 4460324, 415001, -1198296, --5352603, 5732708, -49129596, 20526722, -14724759, 1762547, 34804268, 29117730, -11643119, -4967667, -17886928, -11270531, -11862163, -9891310, 2333778, -3457449, -1399086, 4083440, -3926674, 17102560, -40889700, -17394080, -32195074, 31964220, -24965034, -6813966, 136902, 39908300, 2989834, -12212203, -11668889, 11045045, -41972568, -12418898, 6790344, -1743220, -19999516, -1619740, 7741679, -61612916, --28578712, 30327300, -30464204, -33901788, -20984674, 24737402, -32436130, -50710140, 50782620, -15137612, --31997506, -2006824, 19752554, -19654308, -34336116, -1013612, 15436112, -1933809, -44131864, 10180146, --775778, -19875498, 46134928, 43404404, -3430605, -17910014, -34456912, 52948356, 7274601, 9216463, -18228914, -13233331, -51645908, 23043036, 39284992, 31358094, -19624780, 11207717, 42872900, 24786794, --29832842, -6735046, -23420994, 10307385, 6355478, 26870926, 26613228, -32285806, -1194538, -3540127, -4737349, -12662100, 12815646, -8358543, 7394323, 6566468, 5393942, -9229885, 6966974, -13706314, -22304838, -11518565, -5767068, 14052596, 12358768, -13084618, 2014340, -6196027, -15105937, -8216273, -6018860, 11725798, 7232188, -12340515, 6813966, -7985418, -18769008, 782758, 3332895, -3142842, --1553168, 12626130, 795643, 1279363, 5997385, -1857037, 3226594, -20229296, 15092515, 5400922, --51140176, 5202279, 47486768, 25675852, 6323803, -1005022, -9033390, 12044162, -17245904, 39351564, --3402688, 10194642, 14316200, -14085345, 167504, -2134599, -15511811, -469762, 5382668, 21889300, --441308, -14252312, 6518687, 17530446, -3329137, 28026272, -22448184, 4197794, 6054294, 7004018, -24304146, -13927505, 1819456, -1353452, -32529546, 4145717, -10872173, -18008798, 7172596, -7120519, -24939802, 17788680, -13612899, -29291140, 13362180, 2353642, 5434208, 15679852, 34754876, -6429029, -6929930, -14702210, 19801946, 13967234, 14718853, -17183090, 22732726, -8374650, -10411538, -20643224, --2144263, -8429410, 29540248, -22718766, 1279900, 6940667, -7141457, -14039711, 41385768, -2266132, -9577240, -4269735, 4707284, -3906273, 11378442, -1891396, -5397700, -3789772, -4786741, 13515725, -9384504, 12700218, 6999186, 3787088, -9294846, 9288941, 467615, 4988605, 4320737, 11392401, --1952600, 56908, 1606855, 3408594, 3605088, 8405251, -7532836, 5175436, 4537633, 3964255, -3338263, 2645700, 8293582, 2976949, -11521250, 6489696, 7534447, 7842074, 3288871, 8452496, -2152316, -865973, 4705137, 2545305, 6058052, -819265, -5858336, 1085553, 8495982, -4733054, -3387119, 166967, 9279277, 8284992, 3076270, 5745056, 8620536, 3875134, 6958384, 16689706, --44396540, -124570160, -118455200, 51470352, 5023501, 113868712, 241192480, 52823804, 97189208, 51869784, --178961088, -80073224, -120373976, -176707840, -11886322, 20905216, -83530672, 74221864, 126175936, 77317464, -217321056, 133438728, 1173063, -20079508, -76971184, -191963024, -155593248, -66986456, -147392544, -43436616, -84170624, 25076166, 21255794, 199150656, 76747848, 48541720, 184213296, 8769249, -9389872, 85004384, --42388644, -151886144, -73640976, -151770720, -221850096, -24515674, -100831336, -82188496, 70899712, 137723488, -63592896, 243323856, 193715376, 112453520, 147090288, 49947248, -72261752, -111118856, -148339040, -237334528, --190449056, -127634616, -108925200, -33776160, 82558400, 125672888, 139852720, 188247872, 158296928, 74334072, -26876832, 40891308, -63684164, -97307856, -69318624, -145430816, -109667696, -18749680, -65541736, 26057030, -106378824, 38182260, 54191748, 77508056, 8049843, 4753455, -19057844, -72790568, -38388416, 738734, --29322816, 22639310, 30674120, -12412455, 38947300, 33801928, -53022980, 40510668, 46875272, -33086280, -76542760, 11850889, -75806176, 53009024, -41699836, -147508512, -24664386, -89593552, -109226384, 67418104, -8250096, 17264158, 141813376, 90447176, 100240240, 161683504, 118549688, 39527120, 16706349, -112363320, --204874240, -203387632, -204411984, -192866576, -118081536, 6199786, 110640504, 163078304, 222916320, 207487184, -195545024, 154524864, 25860534, -70851392, -78206520, -163796624, -203262016, -121908888, -109767552, -60799556, -10871636, 29502130, 34922380, 69923680, 60793652, 57636312, 80866720, 67270464, 42054172, 37154688, -7705172, -23409182, -41954316, -50718196, -68838664, -57800596, -46001248, -35788352, -11805791, 12075837, -20795694, 30060476, 35089884, 33999496, 25931402, 20927228, 9119289, -715649, -4572530, -4766877, --9295920, -7206419, -4793184, -5450851, -5377299, -1381369, -7475928, -8608188, -8471286, -13127031, --14709726, -8643622, -7382512, 4129074, 17818746, 23784992, 24197308, 22899692, 14922864, 10889353, -4014721, -6808597, -17940078, -21398600, -23333484, -20936892, -15610059, -7123204, 973347, 10068477, -15825344, 16633335, 13915157, 10421738, 3864934, -1120987, -5113159, -7458748, -8167417, -5198521, --2738579, 943819, 3526705, 5567888, 5354214, 3582003, -625455, -3535295, -5954436, -6616934, --5913633, -3850438, -1870995, 1142461, 3083787, 4349728, 4837207, 4627828, 3320547, 2259153, -1078574, 20401, -941135, -1369558, -1687922, -1490354, -1090922, -672699, -493384, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-12826383, 6532109, -2314451, 5718212, -2777770, -2840584, -5715528, 1399623, 1261647, -214748, +134218, -602369, -4362613, -468688, -2477659, -2852932, -2704219, -62277, 370978, -176631, +-455803, 2226941, -566936, -6618545, 4184372, 2103460, -2230699, 708670, -25770, 114354, +974421, 4326106, -2348273, 296353, -7511898, 3805878, 780610, 1742146, 2647311, 4283156, +-2333778, -1759863, -820876, -3753802, 340913, -528281, 3317862, -1721745, -188979, -1794223, +-2069637, 4039954, -2976949, -1413044, 410169, -2690260, 2317672, -57982, -1249836, 2515777, +4568235, 328565, -142271, -592169, 3909494, -3808026, 67109, -557272, 2061047, -903554, +-1733019, 4261682, -42950, 935229, -1139777, 920734, 2298344, -1771674, -2511482, 175020, +2244657, 3764539, -1644436, -1087701, 944893, 248034, 597537, -1658931, -521302, 1064615, +-201327, 762357, -1320703, -372052, -804770, -1115618, -815507, -734439, 617938, 153008, +-563714, 642098, 433792, -484794, -140660, -82678, -706522, -1264331, -345208, 49929, +294742, 761820, -75162, 510564, 289373, -569083, 545998, -15329275, 2623151, 1826972, +5393405, -2094870, 1645509, 6265821, -2405719, 1721745, -3777424, -5555540, 2054068, -3778498, +-4308389, -4329327, 1324461, 1665911, -7386270, 4362613, 2903935, -1250372, -2692408, 1741072, +-654446, -1677722, 555661, 2462627, 1835562, 3927748, 777389, -1186485, 4056597, -2023467, +8824010, 1988570, 5445482, 2096481, 4780836, 2124398, 3302830, 1780264, 416075, 187368, +6685654, 1134408, -1043677, 445066, 3543348, 2608656, 409633, -294742, -1342177, 745177, +8153996, 2333241, 3784403, -3924526, -1991791, -4139275, -2588792, -4018479, 3049427, 1908039, +-2538326, -1829119, 1840930, -1915019, 2051384, -901406, -577136, -2780455, -4655745, 2018098, +-7581691, -1076426, -1592896, -1927904, 447213, -1778653, 390842, 2866891, 1423245, -1955284, +389768, -1551557, -3280818, -539018, 1626719, -165356, -2523830, 928787, 506806, 969589, +1791538, 65498, 284542, -1207960, -690416, -180926, 19327, 627602, -1345399, -1188632, +129386, 8551280, 11814381, -3731253, 3114388, -5996848, -398358, 267899, 15119359, -1640141, +-4101157, -6637872, 69793, 4277788, 6910066, -1661616, -9260486, -2725157, -3582003, -2591476, +3037079, -758062, 5757404, 566399, -3384971, -7508140, 2145336, -780610, 1643362, -980326, +756988, 3553012, 1253057, -9424769, 1043140, 5923834, 2874407, 653909, 1357210, -1585917, +4082367, -5607617, -620086, 4470524, -3223910, -84826, 7320235, -3504693, -431107, -2594160, +4472135, -4874788, -3635690, 2130304, -5048197, -2534568, 6380711, 3713536, -5857262, -2216203, +-949725, -1519882, -2714956, 1988570, -2342368, 2293513, -153545, 267899, 959388, 4791573, +-637803, 6638409, 3393024, -5250598, -2462627, -2607045, 3956202, 1117228, -355409, -2161442, +5325760, 1997160, -184147, -203474, -1435593, -1328219, 1522029, 536334, 1697049, 4133369, +1449552, -314606, 192737, 253940, 1285269, -367220, 437550, 1930588, 354872, 2410014, +-537, 797253, 1194001, 1443646, 465467, 882616, 1026497, 827318, 1351304, -526134, +358093, 897111, 1385127, -213138, -1202054, -1402307, 239444, 28406376, -10473815, 5777805, +-7996156, -813896, 296890, -563714, -4233227, 2346126, 3279745, 816044, -3076807, -6554657, +-235149, 4042101, 2865817, -2867965, -4942434, -374199, 4443144, 8123931, -4361540, -561567, +-3291556, -7062000, 799401, -3539053, 2157147, -2612414, 5519033, -9651328, 6539625, -400506, +-5759551, 1432909, 2428804, -652835, -3049964, 219043, 7572564, -255014, 1247151, -1039382, +2898029, 1367410, -1788854, -2811593, -6226629, 4068945, -1305670, -1799054, 2390686, 75699, +-10467372, 8074539, -11266773, -6465537, -7981660, 1753957, -941672, 4816269, -2619393, 2578591, +-4809827, 2345589, -1264868, -1927367, -5306969, 3281355, 3719442, 6413460, -1561221, -572841, +1716913, -1899986, -1156420, 1265942, 3673808, -4840428, 2399276, 3543885, 3881040, -6142877, +-5067525, 2158758, -3174518, 1653026, -69793, -329639, 526134, 819265, -281320, 1501628, +-1819992, 918586, -579284, 3658239, 194347, 929324, 792421, 275415, -1446330, -78920, +330712, -390305, -22395034, 2284923, 238371, -1900523, -3453154, 3920232, -3036542, 2609193, +-802622, -37044, 3622805, 4715874, -2896956, 3474092, -1009854, -1912334, -6279779, -305480, +-8485782, -6229850, 7475928, 2669322, -2889439, -1054415, -871878, 5189394, 2741800, -2663417, +4733591, 3149822, 1860258, 1640141, 2019172, 3605625, 3106872, 3063922, 8362302, 7523709, +3256659, 838592, -5182952, 5786395, -7704635, 1531156, -2138357, 6267968, -4708358, -6133750, +10566693, -2451353, -5641440, -5035849, 7868917, 4830228, 303332, 4046396, 5717139, 2623688, +9236864, -542240, -1439351, 5240397, 3215857, 315143, 224412, -4789963, 2894808, 3000035, +7461969, 3037616, 4653597, -2852932, -3806415, -8118562, -1848447, -4387846, -3476239, -3693672, +4124779, -137976, 336081, -2372433, -2733210, -756988, -2401961, 759136, -1611687, -2685965, +1125281, -257161, 121333, -2513093, -346819, 112743, -3153580, -426812, -734976, 220654, +-1404991, -1640141, -1000727, -602369, 78920, -520228, 525060, -732829, 909996, 223875, +807454, 1752884, -376883, 1851131, 401043, 1220308, -819265, 388695, -1565516, -579284, +-242666, -1902134, -566936, -927713, -29732984, 8126615, -6255620, -9305584, -9199820, 5897527, +-6798397, 5223217, -8570070, 4900021, 4202089, 2627983, -9028021, 6380711, 5369, 3908420, +-7459822, 4335770, 9079561, 6966974, 364535, -3095061, 1377074, -1821066, -9546639, -1842541, +-4527433, 2326262, -5961415, 5334887, 5236102, -1908039, -108448, 7297150, -1458678, 4987531, +-3804804, -6146635, 3379066, 5369, 3492345, 8949638, 5493800, -215822, -15288473, -7271917, +-2022930, 2252174, -2253784, 8597988, -13267154, 4350265, 1932735, -21475, 4312147, -1620276, +6616397, -13916768, -6432788, 5549635, -13984950, -2500745, 6696391, 2470143, -2999498, -9292162, +3608310, 6182606, 4569309, -1566589, -9752797, -738198, 190052, -1007170, -411780, -4719632, +2305324, -7617662, 4868883, 781147, -4471061, 1018981, -5401458, 530965, -6483253, -1735704, +2428267, 2544231, 330176, -523986, -2159295, -1604707, 576063, -3767223, 3237332, 350040, +-1761474, 122407, -3232500, -2530273, 861141, -1267552, 1929514, -1653562, -869194, -1046361, +-1154809, -2156074, -267899, -1155346, -388695, 741419, -413927, -913217, 946503, -303869, +-760209, -787590, -1893007, -1300301, 381715, 1167694, -190589, -14039711, 1512365, 2335389, +10994043, -10390600, 12006044, 3397319, -968515, -2828236, -1294396, 1105417, -8778376, -1690607, +2815351, -2894808, -5150740, -1403381, 8307541, -8591008, -1863479, 8581882, 42413, -3420942, +3035468, -4194573, 6329708, 2765422, -75699, 3147674, -3665755, -5796059, -407485, 424665, +4738423, -10152766, -5458904, -4491462, -3124589, -3022046, -3064996, 1501091, 504122, 823023, +-7555921, -7787850, -6159520, 203474, -9708237, -5388037, 5826660, -3957276, 1293322, 597537, +-175557, 2405719, 3459596, 3265249, 3915400, 5709086, -1006096, 6177774, -389768, 3111704, +-511101, -4007741, -228707, -6448894, 3976603, -7544110, 7026567, -8415988, -120796, -8680666, +828392, -8723079, -8355322, 3928821, 11522324, 3445638, -7418483, 5266704, 7516, -3313567, +-1952063, -3471407, 4588099, 3914863, 5640903, 981400, 4400194, -3743601, -390305, 4269198, +515396, 1294396, 857920, -2128693, 2588792, -270046, 970126, 3777424, 1127966, -987843, +-2269890, -1086627, 1583232, 1518808, 1253594, 401579, -1766842, 97174, -368830, -4037269, +3890704, 406948, 1428614, 140123, -940598, -1934883, 1374390, -1972464, -914828, 38830264, +267899, -11457362, 1574642, -6314139, 15363098, -2752000, 4181688, 932545, 557809, -13882408, +-7204271, 7375533, 6470368, -10984916, -2086817, -537945, 9397388, 4504347, 3457449, 9190693, +1287953, 403190, 7971996, -3069291, -12621298, 1622961, 9316321, 5410585, -3788698, -28454, +6440304, 3823058, 1624571, -574452, -7162395, 3172907, -7773354, 532576, -14469208, 3521336, +4212826, -1380832, -6758131, 8842264, 4583804, -2106145, 6868190, 3024194, -6129455, 10657961, +991064, -4089346, 2345589, 10932302, 1556926, -519691, -9494562, -5665599, 1126355, 3550864, +12543989, -4429722, -5221070, 867583, 6767258, -4723391, -5692979, -734439, 9071508, 6381785, +-2480344, -7339562, -546535, 7836168, -3388729, 16532940, 3482682, 2263985, -8758512, 7043747, +270046, -2100239, -4533338, 183610, -2606508, 201863, 10206990, 4482335, 3613141, 1731946, +1035624, -78383, -837519, 709207, 1925219, 3490198, 418222, 419833, 1216550, -3097208, +-97174, 974421, -797790, 2999498, -2466922, -325881, -1287953, 1020055, 5355288, 1621350, +-1876364, -676457, 1159641, 200790, 1687385, -624918, -2528125, 1927367, 1819456, -2133525, +-653909, 4585952, 1511829, 2222109, 8858370, 4729833, -13822279, -1390496, -6962679, 13990856, +-5179731, 6542309, 1298691, 8773008, 3500935, 1331977, -660351, 3583077, -3929895, -5891622, +-16353625, -12115029, 4076461, 10836739, 14566918, -5310190, -7021735, -6208912, 3301756, -3393561, +-673236, -564788, 2021856, 2229088, 9754408, -5141076, 981400, 2403034, 4803384, -4668093, +-3402151, -7714835, -5161477, -5376762, -9121974, -23337242, -191663, -3119757, -9951976, 2258616, +-1048509, -12658342, 4339528, -10735271, 2841658, -1303523, -790274, 5447093, 7149510, -205622, +-10377715, 3078955, -6476811, -7260106, 10180146, 9096741, 10255845, -3323231, 1749125, 1336272, +-5075041, 790274, -2381023, 15888695, -2516314, -1655173, -1462973, -133681, -9594957, -12045236, +2976949, -902480, -773631, 2691334, 17427904, -2165201, -7983808, -3449933, 9211631, -1355599, +-2818572, -2647847, -54224, -7406671, 1917166, -1453310, 1514513, -3762928, 302258, -4725538, +-256087, -340913, 2038499, -2011118, -818728, -2910377, 4015258, 196495, -2691334, 581431, +1430761, -3091303, 928250, 1142461, 4884452, -1040993, 1248762, 3291019, 2225867, -1792612, +2164127, -3663607, -5719286, 650151, 720481, -2289755, -5317170, -1192927, -1189169, 4784057, +1963337, 3184182, -395674, 3990025, 4538707, -15261629, 5652177, 1875290, 16141024, -10842645, +-6138582, -3592740, 8622684, -8209830, -7892003, 7149510, 4812511, -8303783, -8380555, -8199630, +-18372260, 12081206, 11336566, 12028593, -5164698, 3815005, 11929272, -17259326, 32212, 11359115, +10523207, 4789963, -18790, -5511517, 1163936, -2643552, -14939507, 1916629, 4103305, 2216740, +9921374, -8715026, 948651, -16307454, -2065879, 3252364, -8966281, 3495030, 2762201, 7330973, +8935143, 12449500, -2536178, -4850629, -14992120, -10676752, 4630512, 22060562, -6833293, -887985, +-10152229, -5351530, -8054675, 4776004, 4882841, -1664837, 723165, -16094853, -2126009, 10943577, +-8711804, -7521562, 6475200, -2879776, 9473624, 2374043, -6961605, 1153199, -10517838, -3000035, +-2778844, 20318416, -2032593, -5910412, 4440996, 4171487, -1785633, -3421478, -1040456, -2744484, +-3776350, -3482682, -2692408, 1454920, 1570347, 3300682, -851477, -21475, -1963874, 2011655, +504659, -5177046, 1383516, -17717, -574989, 1911261, -128312, -2814277, -2825552, -6699075, +2229625, -2088965, 1971927, 2597918, -3179350, 1473711, 901406, -646393, 2535105, 38118, +7274064, 1050656, -1341640, 201327, -2138894, -354335, 1249836, 233539, -656593, 620086, +-2871723, 2306934, -9378598, 22081500, -10710038, -5456219, -323733, -608812, -15476915, 1122060, +-11366094, 8418136, -21464100, -3025268, -6781754, 7488276, -7305203, -7347079, -18140868, 12428025, +-7387344, 5181341, -5753109, 3805878, 9845139, -6935836, -11850889, -3894462, 8318278, 17132624, +5588826, 7250442, 967441, -16990354, -9044127, -9096204, -4621385, 3130494, 15650324, 6828461, +9167608, 8617852, -2248416, -3476239, -5096516, -14172318, 903017, -9846213, 15622407, -6942278, +10798622, 2433099, -5461588, 3726958, -3594888, -4703526, -8317741, 12884365, 3457986, 21664888, +4832375, -22996328, -5651640, 7581154, 6144488, 3547106, -1188632, 2215666, 24348170, 12282533, +-3977677, 2773475, -6406481, 17726404, -555661, -519691, 6950868, -15295989, -6560563, -5087389, +-16429324, -19423990, 4002910, 7167764, -1719061, -9482214, -2414309, -2898566, -7472170, 294742, +-1436667, -5827197, 6082748, 9341017, -1902134, -1171452, -1274532, -3419868, 2735894, 794569, +-937377, -1671279, -1489280, -902480, 3124589, -1586454, -4211753, -871878, -106837, 1566053, +962610, -2452426, 6575595, -1940788, 4032974, -578210, 3383361, 1921461, -949725, -4214437, +-4132832, 1647657, -1055488, -6461779, -2353105, -1437740, 2542084, 823023, -405874, 2069101, +3146064, 1245541, -1732482, -2525978, -13390097, 8005282, 17891224, -1761474, -782758, -415001, +16625818, 5152350, 3977140, 2842195, 1954210, 2829847, -6568079, 1220845, -20626044, 2957622, +-9949292, 8609799, 21060372, -2740189, 1515587, -16632261, 22200150, 10776610, 9418863, -2768643, +-12242804, 1469953, -4194036, 11274826, 8061117, -10102837, 512175, 5949067, 4176856, -7819525, +-6972880, 32556926, -7581691, -5674726, 6830609, -8288213, -6078453, 10354092, 10106595, 402653, +3866008, 3688840, -12639015, -6266358, -577136, 4296041, 10991358, 2729989, 2563022, -14230300, +-1388348, 4203699, -19472844, 4263829, -5450851, -1957431, -3631395, 5719286, -5828808, -10540923, +-11325829, -17838072, 2202781, -7225746, -3539590, 11436424, -3929895, 3716221, -20187956, -29528, +18482854, 4345433, -9423695, -5561983, 11200738, 5784247, -12416214, 6943889, -9011378, -6882685, +-3013457, -1716913, 4134980, -1181653, 653372, -1896228, -2539936, 1508607, 2165201, -3124589, +2590939, 8205535, 1183800, -1098975, 3415573, 5194763, -2294050, 3542811, -2401961, -3155190, +793495, 2365990, 6697465, 1821066, -773094, 2503429, -1148367, 3540127, -2099165, 3257733, +-2578591, 1104344, 2716030, 860067, -4834523, -2646237, 8500277, -3624953, -7044283, 3441880, +1662152, 2576444, -1968706, 11096585, 3071975, -2527588, -1442035, 2806224, -1246614, -10273562, +-10315975, 24589224, -14688251, 3854196, -9383430, 28986198, 6171331, 5376762, -9244380, -10935524, +1070521, 8296803, -8866960, -14139032, -8403104, -20569672, -8011188, -12067784, -9664, -27652610, +1949915, 15015743, 9242233, 12277164, -8543227, 3219615, 13313862, -1517734, 9656160, 3612068, +15043123, -7518341, 12546673, 9997073, 7136625, 16319802, -9119289, 9731859, -4981089, -5768678, +-3841312, 3628174, -31591632, -10078141, -19636054, 22759032, -14324253, -16146930, -3459596, 12853763, +358630, -5755256, 17879948, -6366216, -5671505, -12953084, -31960462, 1575716, 2966212, 13343927, +-13405667, 63888, -8177081, -10755672, 17082696, -3427384, 8551817, -18562848, -18106508, -11264089, +14232985, -1446330, -9040906, -9556839, -400506, -15743739, -10784126, 1551020, -6635188, -11739219, +17313014, -23781234, -22705882, 5945846, 64961, 10031970, 1116155, -1081795, -7351911, -6448894, +1024350, -11243151, -4577362, 9594957, 1228898, 1649268, -5611375, 5680631, 2055142, -6143951, +2823941, -4555887, -992674, -4673998, 4001836, -6220724, -1627793, 4228396, 8173860, 913754, +260382, -8990440, -2800856, -628676, 1216550, -1342714, 7547868, -339839, -3026878, 4865661, +-5804649, -5258114, 3105798, 6953015, -2087891, -4988068, -6861747, 5337571, 4185446, 8616778, +-11810086, -9664, 15998753, 2165737, -4750771, 8294656, -12877386, 25841208, 16236050, -77309, +-11723113, -13249974, 5618891, -3278671, -1149441, -623844, 23557358, -11457899, 488016, -7945153, +8701604, -14518063, -13338558, -26261040, 6154688, -10619844, -14767171, -1717450, -25010668, -12217034, +7115687, 5436355, -3396246, 13141526, 1256815, 15910706, -6942815, -21689048, -3274913, -15860777, +-3009162, -4689568, -20861730, 2841121, 17055852, -47822852, 6102612, 232465, 11919071, -2263448, +-14891188, -28325846, 11367705, -3370476, 10624675, 6470368, -3440269, 16726750, -20623360, 29078002, +-7237557, 16281684, 33800856, 13651554, 24056112, 9587978, 6328098, -3139621, 12572443, -4525285, +-13117904, -17558364, -11413339, -446677, 9981504, -1480153, -7715909, -10834592, -9818295, 13532905, +-5944772, -4661114, 12006581, 2347737, 9045201, -766652, -1297617, -3474092, 2136209, 4714264, +-6123013, -817654, -14997489, -10659572, 7386807, -3471944, -370441, -1999844, -275415, -5536213, +-8974871, 6708739, -5399311, 8661875, -8633958, -3772592, -952946, -5851893, -3040837, 4472135, +1775432, 10473815, -2573222, -5906117, 3877819, -12029130, 208843, 1719061, -1899449, 1025960, +-1359894, 6262063, 8693014, 1714229, -305480, -3957812, -7262253, -3280818, 423591, 14471892, +7134478, -6930467, 40353904, 32874216, 29614336, -6815576, 14496, -25249038, 18767396, 23305566, +7881802, 22512608, 8943196, 7620883, 7852811, -4034585, 3051574, 6196564, -5825050, -24319716, +-14811195, -942208, -16202227, -18838800, -44218836, 9657234, 7549479, 11466489, -8533563, -3058017, +-5956583, 273267, -13890461, -432718, -10605885, 12184822, 10082973, -6339909, -8650064, -23311472, +39113192, -12276627, 7646653, -48855, 2428267, 6226092, -16305843, 19520090, -9961103, 6653441, +4279935, -14638859, -15160698, -2815888, -1423782, 9055939, 41273024, -3482682, 6044093, 1348620, +12368969, 8861054, 9184251, -7331509, -2296734, 3559991, -20117626, 4048544, -17235166, -27347668, +9401683, 853625, 2042257, -20023138, -48220672, 20786568, 21594022, 14959908, -27407260, 25959320, +27461484, 10201084, 7870528, 237834, -8086887, -18170932, 13458280, -12804371, 686658, 222265, +-7354595, 5485210, -13193066, -1364726, -2699387, 6455336, -3768297, -6009196, -8260296, 12426414, +-6969122, -2960843, 3082713, -11166915, 6049999, 5083094, -4027606, -3907883, 920734, -10371272, +9429064, -3478387, -2762201, -864899, 641024, 7077569, -5748814, -13111461, 3726421, -7306813, +-2448668, -7488276, -6828461, 1030792, -5561983, -2455648, -5199058, 16851304, -7667054, -13681618, +1955284, -4906464, -543313, -23617488, -47219944, 39336532, 6395743, 7049652, -15673946, -11263552, +-50240916, 13994077, 36075576, 11116986, -31787052, -15866146, 5264020, -12327093, -7788387, 14830522, +-16504486, 9347459, 8357470, 6919729, -18382996, 6678674, 5807333, -8591008, -17198122, -9931038, +-6565395, -4398047, -16401406, -14148696, -7733626, -16930762, 13500693, -6275484, -21856552, -7507603, +13554380, -2713883, -15128485, -8308078, -7676717, 15032, -11973295, -7209103, -19899658, -18927384, +8178692, -6692633, 25029458, 16455093, 1693291, 14945949, -21713208, 14158360, -20606716, 17452062, +-2892124, 8954470, -9142912, 30960808, -7619272, 17361868, -4342212, 25473452, 10323491, 6236293, +-26152056, 28508382, 22865870, 9967008, 10669773, -20420958, -3823058, 8418673, 14067092, -3587372, +3458523, -22568442, 14586783, 24831354, -464393, -17721036, -955093, -11710228, -9972914, 4883378, +20938, -4879620, 5808407, -12936441, -2971044, 517007, 3764539, -8919573, -12191265, 4731444, +-5902359, -11570105, -20700132, -1520955, 6516539, -1728724, -10392210, -12613245, -3806952, 8021925, +-8610873, 3322157, 4711579, 1299765, 3478387, -1084479, -5522791, -4728759, -1510218, 5774584, +1998770, -2273648, -7743826, 10652056, -6853157, -6069326, -4991826, 2108292, 12468827, -8445516, +12276627, 10278394, -4077535, 3711389, 6551973, -33640332, 27238146, -4041564, 12670154, -18884972, +-6622303, -5251135, -4954245, -4965519, 15609522, -248034, -14330695, 10227391, 1157494, 7182796, +13123809, 13258027, 9664, -12783970, 48810156, -14293651, 37372120, -401043, 1564442, -22256520, +-10145786, 2902324, 17734994, 8451959, -6698539, 14440217, 2385854, -21499532, 2796024, 2405182, +20768314, -1431298, 12162811, -16449188, -668941, 13887240, 6551436, 11521787, 31553514, 25191594, +-4688494, 12772159, -2674154, 24733642, -20985210, 16330539, 6228240, -1503239, 14555644, -8589935, +38821136, -7384660, 18428094, -14919106, -13401372, 89121, 41407244, 13131326, -39649528, 34039764, +-1315871, 11572253, -30032022, 9447854, 2787434, -59479392, 24137180, 44461500, 16700443, -19376208, +-12438225, 8565239, 43861280, 24698210, 33303714, -12868259, -16993574, -15563888, 6589017, 8653285, +-2045478, -17502528, -8051990, 20483236, 3269007, 4241817, -7735236, 9116605, -2945811, 3842922, +-4983236, -6253473, -7221988, 12148315, 20891794, 20089710, 4241280, 10407243, 19177566, 12411919, +13401372, 18224620, 10258529, 17377974, 13290239, 4370129, -27592480, -5893232, -13085692, 7036230, +15519864, -18748070, -6803228, 20813948, 11416023, 1841467, -5309117, 17523466, -14499273, 2681133, +18453326, 14114873, 7932268, 9272298, 11170673, 6017786, 2130841, -1839857, 2641942, 965294, +9556302, 11321534, 7347079, -9314710, -4706748, -16291885, 20001126, 2797098, 13253732, -11181947, +26809186, -9779641, 12399571, 3868155, 5439576, 3632469, 2201171, -28597502, -16524350, -167504, +2412698, 18964964, 15815680, -23416698, 2223183, -13072807, -11659226, 5305895, 1304596, -8289824, +9426916, 36907192, -24831890, -2379412, 57046292, -35196184, 4001836, 19975892, -10554345, -8847096, +11762305, 18403398, -20603494, 9669582, -37309308, -4466229, 55506548, 1977833, 15694347, -6339372, +30327300, 30055108, -8461086, -995359, -14442364, 3047279, -10676752, -27574226, -17432198, -32814624, +-23864448, 35482872, 14464913, 10145250, 47858284, -34423628, -20067160, 5597416, 17944374, -13836237, +8740795, -14791330, 26521424, 15386183, 9200894, 18958522, 69446936, -16942572, -5394479, -19888920, +-22306450, -1926293, 29235842, -23360864, -2913062, 20302848, 22370874, 25934624, 15479062, -18345416, +4666482, -10366977, -2037425, 14911053, 5091684, -1805497, 11648488, -21519396, 1537598, -111132, +5840619, -5210332, -5254356, 12309376, -4555887, -3662533, 14330695, 17677548, 14717242, 5885179, +6373732, 11480448, 3799972, 408022, 8554501, 307627, -4485020, 3110630, 165356, -1818919, +-23365158, 5184563, 15578383, 24362666, -5474473, -7644505, -7874823, 12099997, 14696304, -32723892, +4212826, -14919643, -1663226, 1162862, 2480344, 8756365, 6957847, 5688148, -7963943, -16777216, +13727252, -4046396, 31344672, -28466506, 7196755, -2046015, -9131100, -8274792, -4114042, 9622874, +5916855, 6546604, -1509144, 17554606, 3070365, -22907744, -18064096, -2460480, -10616085, -13157632, +3006477, 14534706, -2040110, -3252901, -21027624, 10399190, -3375844, 21562884, -7322919, -41333692, +5061082, -12217034, -6241125, 118648, -33571612, -17598628, -28840168, 580357, -2103997, -8029978, +-38182260, -15464030, -3344706, 20024212, 22057342, 1838783, 1677185, 10816875, 2433636, -26164404, +22990424, 31387084, -13604846, 4806606, -13633837, 5727876, -124017, 23933706, -26801670, -19362786, +-61283816, -21659520, 15424301, 24765318, 17543868, 16016470, -15117748, -4933307, 12198781, 11807402, +26563836, 12686260, 11331734, 20546050, 5143760, -22470196, -24183350, -32678258, 13645111, -20859046, +1800665, -18280992, -28337120, -42800960, 6039798, -12343736, -13456133, 3898220, 3998078, -1551557, +-6231461, 966368, 14074071, 9883257, 3562139, -5386426, 10155987, 23131620, -5156108, -12527346, +-10407780, 11386495, -6087043, -5103495, -20651276, -19825570, -15391552, -33934536, -1967095, 170725, +-13706314, 6105833, 9101573, 6785512, 16852914, 4764193, 19904490, 1389422, 5404680, 22131966, +-10853919, -524523, 3183108, -102542, -15430207, -486405, -3078955, 26656178, -1833951, -10951630, +8185671, 3395709, 7633768, 17107928, -3082713, -185757, 9628780, 4460324, 415001, -1198296, +-5352603, 5732708, -49129596, 20526722, -14724759, 1762547, 34804268, 29117730, -11643119, -4967667, +17886928, -11270531, -11862163, -9891310, 2333778, -3457449, -1399086, 4083440, -3926674, 17102560, +40889700, -17394080, -32195074, 31964220, -24965034, -6813966, 136902, 39908300, 2989834, -12212203, +11668889, 11045045, -41972568, -12418898, 6790344, -1743220, -19999516, -1619740, 7741679, -61612916, +-28578712, 30327300, -30464204, -33901788, -20984674, 24737402, -32436130, -50710140, 50782620, -15137612, +-31997506, -2006824, 19752554, -19654308, -34336116, -1013612, 15436112, -1933809, -44131864, 10180146, +-775778, -19875498, 46134928, 43404404, -3430605, -17910014, -34456912, 52948356, 7274601, 9216463, +18228914, -13233331, -51645908, 23043036, 39284992, 31358094, -19624780, 11207717, 42872900, 24786794, +-29832842, -6735046, -23420994, 10307385, 6355478, 26870926, 26613228, -32285806, -1194538, -3540127, +4737349, -12662100, 12815646, -8358543, 7394323, 6566468, 5393942, -9229885, 6966974, -13706314, +22304838, -11518565, -5767068, 14052596, 12358768, -13084618, 2014340, -6196027, -15105937, -8216273, +6018860, 11725798, 7232188, -12340515, 6813966, -7985418, -18769008, 782758, 3332895, -3142842, +-1553168, 12626130, 795643, 1279363, 5997385, -1857037, 3226594, -20229296, 15092515, 5400922, +-51140176, 5202279, 47486768, 25675852, 6323803, -1005022, -9033390, 12044162, -17245904, 39351564, +-3402688, 10194642, 14316200, -14085345, 167504, -2134599, -15511811, -469762, 5382668, 21889300, +-441308, -14252312, 6518687, 17530446, -3329137, 28026272, -22448184, 4197794, 6054294, 7004018, +24304146, -13927505, 1819456, -1353452, -32529546, 4145717, -10872173, -18008798, 7172596, -7120519, +24939802, 17788680, -13612899, -29291140, 13362180, 2353642, 5434208, 15679852, 34754876, -6429029, +6929930, -14702210, 19801946, 13967234, 14718853, -17183090, 22732726, -8374650, -10411538, -20643224, +-2144263, -8429410, 29540248, -22718766, 1279900, 6940667, -7141457, -14039711, 41385768, -2266132, +9577240, -4269735, 4707284, -3906273, 11378442, -1891396, -5397700, -3789772, -4786741, 13515725, +9384504, 12700218, 6999186, 3787088, -9294846, 9288941, 467615, 4988605, 4320737, 11392401, +-1952600, 56908, 1606855, 3408594, 3605088, 8405251, -7532836, 5175436, 4537633, 3964255, +3338263, 2645700, 8293582, 2976949, -11521250, 6489696, 7534447, 7842074, 3288871, 8452496, +2152316, -865973, 4705137, 2545305, 6058052, -819265, -5858336, 1085553, 8495982, -4733054, +3387119, 166967, 9279277, 8284992, 3076270, 5745056, 8620536, 3875134, 6958384, 16689706, +-44396540, -124570160, -118455200, 51470352, 5023501, 113868712, 241192480, 52823804, 97189208, 51869784, +-178961088, -80073224, -120373976, -176707840, -11886322, 20905216, -83530672, 74221864, 126175936, 77317464, +217321056, 133438728, 1173063, -20079508, -76971184, -191963024, -155593248, -66986456, -147392544, -43436616, +84170624, 25076166, 21255794, 199150656, 76747848, 48541720, 184213296, 8769249, -9389872, 85004384, +-42388644, -151886144, -73640976, -151770720, -221850096, -24515674, -100831336, -82188496, 70899712, 137723488, +63592896, 243323856, 193715376, 112453520, 147090288, 49947248, -72261752, -111118856, -148339040, -237334528, +-190449056, -127634616, -108925200, -33776160, 82558400, 125672888, 139852720, 188247872, 158296928, 74334072, +26876832, 40891308, -63684164, -97307856, -69318624, -145430816, -109667696, -18749680, -65541736, 26057030, +106378824, 38182260, 54191748, 77508056, 8049843, 4753455, -19057844, -72790568, -38388416, 738734, +-29322816, 22639310, 30674120, -12412455, 38947300, 33801928, -53022980, 40510668, 46875272, -33086280, +76542760, 11850889, -75806176, 53009024, -41699836, -147508512, -24664386, -89593552, -109226384, 67418104, +8250096, 17264158, 141813376, 90447176, 100240240, 161683504, 118549688, 39527120, 16706349, -112363320, +-204874240, -203387632, -204411984, -192866576, -118081536, 6199786, 110640504, 163078304, 222916320, 207487184, +195545024, 154524864, 25860534, -70851392, -78206520, -163796624, -203262016, -121908888, -109767552, -60799556, +10871636, 29502130, 34922380, 69923680, 60793652, 57636312, 80866720, 67270464, 42054172, 37154688, +7705172, -23409182, -41954316, -50718196, -68838664, -57800596, -46001248, -35788352, -11805791, 12075837, +20795694, 30060476, 35089884, 33999496, 25931402, 20927228, 9119289, -715649, -4572530, -4766877, +-9295920, -7206419, -4793184, -5450851, -5377299, -1381369, -7475928, -8608188, -8471286, -13127031, +-14709726, -8643622, -7382512, 4129074, 17818746, 23784992, 24197308, 22899692, 14922864, 10889353, +4014721, -6808597, -17940078, -21398600, -23333484, -20936892, -15610059, -7123204, 973347, 10068477, +15825344, 16633335, 13915157, 10421738, 3864934, -1120987, -5113159, -7458748, -8167417, -5198521, +-2738579, 943819, 3526705, 5567888, 5354214, 3582003, -625455, -3535295, -5954436, -6616934, +-5913633, -3850438, -1870995, 1142461, 3083787, 4349728, 4837207, 4627828, 3320547, 2259153, +1078574, 20401, -941135, -1369558, -1687922, -1490354, -1090922, -672699, -493384, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -5042829, --1938641, 1176284, -935766, -2905009, -210453, 6729677, -3454228, 785442, -1456531, -75699, --2573222, 4843113, -2512019, -2677375, -3024194, 5770826, -3430605, -898185, -1620813, 1622961, -2665027, 3376918, -4763656, -11811, 4562329, 2017561, 782221, -252329, -568546, 2059437, -4651987, 1121523, -5970005, -3080029, -3211025, 5212480, -531502, 3976603, -2498060, 1842004, -5219459, -2544231, -3926137, 1394254, -1466731, -265751, -3512210, -1422171, -2623688, 996432, --4763119, -1575716, -1215476, -155693, 6456947, -2108829, -964757, -233002, -1685238, -671626, --602906, 3902515, 2027761, 2391760, -3348464, 2458869, 2594160, -2289755, 1078037, 1530082, --1719061, -2348810, 2752537, -4116189, 2914672, 1752347, 779000, -3815005, -1310502, 1417876, --325881, -795106, -1016834, -92879, -2032593, -2378338, -352724, -394600, 298500, -897111, -33823, 1403381, -39192, 520228, 215822, 273804, 30602, -280784, -1013075, -625455, -721018, -326954, 57445, -102005, -3131031, 3389266, 430034, -1408749, -2124935, -553514, --1062468, 40802, -2641942, -2020782, 1552631, -387084, -993748, -4642860, -665183, 4387846, --2900177, -697932, 3311420, -1855426, -3477850, -2643552, 2268817, 54224, -310311, -640487, --3333968, 1167694, -1467268, -756451, 3837553, -2059974, -5127117, -1503775, 316754, 1578401, -1385664, 475668, -3888019, -871878, -4743255, -4305168, -1139240, 4576288, -757525, -8950712, --375273, 3056943, 2655901, -1823214, 1795833, 1962800, 208843, 2702071, -4810900, -3395172, --427349, 1434519, 249108, 1030255, -493921, 1294933, 1175747, 1897839, -255014, 1180579, -1123134, -875636, 1882269, -432718, -4692789, -3839701, -2479807, -1968169, -2093797, 670552, --1049583, 3681324, 3047279, -534723, -1433982, -1247151, -652298, 1121523, 1750736, 239981, --984621, 206695, 266288, -978716, 1323387, 27917, -274878, -480499, -84826, -724776, -544924, -129386, 123480, -843424, 538482, -526134, 30602, 20938, 380641, -129386, --384936, -153008, -784368, -303332, 107374, -387621, 93952, -251256, -712428, 4068408, -2253784, 6116034, 363462, -1257352, -807454, 4314295, -1237488, 2294050, -4042101, -469225, --157840, 2244657, 1540820, 3866544, 2699924, -2055679, -3993246, -3262565, 2144799, -1416802, -2949569, 1845225, 344671, -239981, 2441689, 1714766, -1875827, 2014340, -4299263, -635118, --3990562, -3411278, -4790499, 1334661, 2636036, -546535, 3690451, -2962454, 3413425, -7085086, -2644089, 1154809, 5143760, 1481764, 1806571, 2765422, -190589, -1839320, 1880122, 4501663, -1480153, 2159295, -800475, -121870, -6512244, -469762, 958315, 1200443, -1013612, 3398393, -6391448, -2200097, -4718022, 3057480, 615791, -3331821, -123480, -1564442, -3388192, 370978, -4576288, 1126892, 1618666, 747861, -569083, 1731946, 1018444, -126165, 1455457, 62277, --496606, -376883, -952409, 868120, -1364726, -192737, 2082522, -500364, -126702, 794569, --586263, 1442035, -2135136, -955093, -46171, -850404, -976568, 190589, -583579, 679679, -1501091, -621697, 812286, 213675, 12348, -2684, 138513, -1799591, -540629, -424665, -265751, 1440962, 779537, 2273112, 3338800, 3209414, -3204046, 4923643, -1817845, -3355980, --4932770, 1081795, -6507949, -456340, 624381, 1734093, -4167192, 2609193, -112743, 539018, -1679332, 1005559, 1414655, -5616207, -418222, -1314260, -3672734, 2064806, 1023813, 776852, -3069291, 10898480, -850940, 505196, 1518808, 2648921, 1029718, -9051644, 1825898, -1553704, --1074279, 4865661, 103616, 2390686, 3512210, -4497368, -2516851, -1341640, -4345433, -9292162, -395674, -3542274, -596464, -868120, -229781, -2204392, -4556424, 1217623, -4361540, -1438277, -935229, -4884989, 4949950, 1654636, 1380295, -2092723, -407485, -857383, 954557, -1622961, -2523830, -4022774, 1276142, 5939403, 4941897, -1811939, 2495376, -2439542, 1037235, -4555350, --184147, 2714956, 3182034, 2804077, -532039, 5284958, 454193, 2602750, 2357400, -171262, -1079647, 505732, 165356, -985158, 503585, 755377, -358093, 13959, -639413, -1554778, --264677, 924492, -823023, 2078227, -632971, -1207423, -992137, 673236, -574989, 859530, --215822, -996969, 507343, -340913, 1081795, 590021, 621160, 357556, -1971390, -549219, -228707, 736587, -4832, 66572, -553514, 7349763, -9269076, 417149, -5699422, 2951180, -4246649, 5173825, -777389, -4869419, 146029, 5097590, 1103270, 994285, -3794604, -487479, --6660421, 8904004, -450972, -6812892, 7423314, 1878511, 2214593, -457951, -2650532, -848256, --3506841, -3454228, 2755759, 3907347, -771484, 3688303, -2999498, -1860795, 19864, 5138392, -4859756, -1331977, -2708514, 4006668, 2559801, 399969, 3389803, 829466, -3940096, 4194036, -2619930, -285078, -1356136, 1178432, -4248797, 11400454, -569083, -377957, 8493835, -741419, --5164162, -2783139, -592169, 2094870, -5367636, 3717294, 1133871, 158377, -4871567, -4091493, --8625368, -732292, 4054449, 2039036, 4912369, -2678986, -1898376, 10275709, -2823404, 1745904, --1401233, -4210679, 349503, 1908576, -4407710, -7821136, 350577, -4809290, -4865124, -2353642, -2574296, 264677, -715112, -2967286, -1005559, 382252, -1100049, -797790, 827855, 2837363, -418222, 744103, -1956358, -970663, -181462, 22012, -2770254, -2006287, -1749662, -62814, -700617, 316754, -885837, 112206, -154082, -237834, -1441498, -492311, -187368, -513785, --743029, -970126, -9827422, -161061, -4164508, -4702453, 1354525, -5637682, 101469, 3767223, -2024540, 7950522, -13407277, 8519068, -1479616, 3695283, -2616709, -1966021, -7075422, 6194954, -5451924, 1332514, -6296959, -397284, -3668976, -484258, 6431177, 4467840, 932545, 6134824, --151934, 265214, 542777, -268435, -4395362, 9198746, -993211, 34360, 10683194, -6987912, -2504503, -3360275, -765578, 3345780, -1534914, -5522791, 10280004, 8014946, -358093, 2568391, -4269735, 11126113, -1515050, -2064806, -6132140, 1013075, 2056216, -6467147, -6911676, -6069863, -7153268, 117575, -3027952, 4912906, 3462818, 18790, -1779190, 1569811, -3961034, -1039382, --4304631, -996432, 3950296, -7881265, 1800128, -1686312, -5485747, 3289945, 5174362, 2196876, -5390721, 4685810, -4046396, -6424734, -3240016, 2787434, -2567317, -4943508, 3146064, 5348845, --3945464, 646393, 1107565, 581968, -3687766, 2110440, -1662689, -1303523, -2379412, -1240172, --1870995, -194884, -240518, 696858, 1094143, -935229, -836445, -366146, -1493038, -856846, --428423, -586800, 1120987, 1445793, 337692, 2130841, -1942399, 1472637, -1681480, -745714, -1508070, 7385733, 7834557, 1328219, -6685654, -888521, -6347962, 2698313, 16829830, 4181688, -11673184, 4312684, 184684, -10817949, -2629057, 1825361, 10547903, -4610648, -2276333, -4009889, -1047435, 8486855, -6144488, 4175245, 7351374, 1664300, 2731062, -4744865, 9075266, -1896228, -11807939, -71404, -3556770, -11002096, 1394791, 81068, 13212393, -3933653, -1030792, 8393440, -104690, 1147830, -2671470, -8593156, 969589, 5015448, -6156836, -4846334, 1336272, -10312216, -5728413, 5792837, -1701344, -629213, 2967286, 5907728, -450435, -3562675, -90194, 8655970, --1052267, -1277216, -3208341, 11194295, 11334956, 812286, -1998770, 1808181, -433255, 2992519, -5266167, -380105, 7584912, -2883534, -4135517, -6046777, 2112587, -447213, -9226663, -6638409, --3800509, 7350300, -2083059, -3360275, -889595, 59056, -3094524, -4694936, -1616518, -1334661, --2783676, 524523, -1725503, -1501628, 1551557, -2957622, -3058017, 1043140, 2552821, -1439888, --1948305, -1451162, -2557116, -1186485, 872952, -834297, 507880, 1449552, -399432, -701690, --2244657, 1377611, 156766, -7449084, 7464653, 5669894, 398895, -4955856, -5561446, -2443837, --11005854, 12688944, 9532143, -2094333, 3504693, 1107565, -2136746, 9612137, -819265, -4530117, -14243722, -15524159, 3953518, 6629819, -99321, -6372658, 6764037, 1012002, 9801115, -3850438, --1105417, 2585034, 3887482, 624918, -1393180, 14286672, 6133214, -6590091, -9939628, 6841346, --9943386, -2912525, -11441256, -1517197, 17008608, 6937983, 8197482, 19327, -9098351, -1546725, --4471061, -2006287, 12707734, -2027761, -14108431, -1174674, 2709588, -8983998, -1534377, 5728950, -4488778, -6051072, -3191698, 6122476, 8102993, -2407866, 8443369, 113817, 2084670, 3141769, -668941, 3300146, 5043902, 4894652, 4747013, -2561411, -10252087, -11304354, 2757906, -2299955, -8005282, -1478006, 9509594, 3200825, 4395899, -5128191, -4598300, 3374234, -230318, 664109, -839129, 390842, -4626217, -2128156, -761820, -3831111, -166430, -3295314, 533113, -1874753, -1353989, -491237, 2385854, -31139, 1280974, 400506, -1283122, -1098975, -1526324, 2994666, -291521, -921807, 904628, 1536525, 1250909, 268972, -2292976, -6277632, -3600793, 1074, --3082176, -97174, -558346, -624918, 3704409, -635118, 6110128, -957241, 5689221, -11860015, -4032438, 3162707, 1557463, -7823283, -6569690, -8323110, 6200322, 3146601, -5992553, -5983963, -7836705, 2436857, -802622, -5063230, -8256001, -3468186, 3127810, -5348308, 453656, -9884330, --2885681, 966905, 3162170, 6178848, -1192390, 3879966, 5363878, -5816460, -13674639, 9118752, -256087, -2326262, 8677445, -1551557, 180389, -6150930, 7604777, -5159330, -6487548, -2659122, -6203544, 9484362, 7956427, 2332704, 1464584, -17278116, 7588671, -1236951, 3090766, -6103149, --1290638, -6807523, -2469069, -1824824, -8950712, -4627291, -3771518, -5012764, 8921184, -3136400, -11655467, -1623498, -840740, 7211787, 8290898, 14055817, 9608916, -409633, -4801237, -755377, --153545, -7057705, 1553704, -4633733, -7681549, 14367739, -9436580, -10055055, -1600412, 5264020, -632971, 1540820, 556198, 5953362, -252329, 1520955, 2025077, -2535641, 208306, 3601330, --2244657, 1391033, 2565169, 2051921, 4568772, 896574, -60666, 2429878, 329102, -1032403, -1614908, 2520072, 931471, -154082, 696322, 281320, 5320391, 293132, 4307852, 2801393, -545998, 4503810, 4984847, 367757, -261456, 545998, 592169, 478889, -553514, -751619, -1177358, 147103, -3008088, -4388920, -17980880, 4206384, -12315819, -7298223, 12013560, 9383430, --20555714, -18833968, 828929, 8300561, -4638028, 5192079, -6660421, -586800, -11855183, -2965138, --10684268, -599148, -2790118, 527207, 4362076, 3601330, 6953015, -663036, -5586679, 5192079, --6698002, -2583960, 2394444, 609885, 3694209, 7355669, -974958, 1078037, 1838246, -2744484, --576063, -10352482, -12276627, -11897059, 198642, -11970611, 4253628, 1762010, -4609574, -5482526, --2241973, -1859184, -856846, -7066295, -11227045, -490700, 18305150, 10139881, -2370285, -10673531, --10995653, 12655658, -11557757, -3726958, -1906429, -7692824, -5763846, -7845295, -9167071, -12866111, --17415556, -2390686, -2655901, -2367064, 6076305, 5714991, 1640678, 5022965, -3816079, -4755603, -16448651, 7015292, -4166118, -11871290, 3896072, -6976638, -8249559, 88047, 13820668, -2597918, -53150, 9501541, -892279, -6149320, 430570, 2344515, -30065, -2457795, -2309619, 32749, -2467996, 1226213, 1700807, 1045288, 4825396, -1273995, 2667175, -6642704, 3272765, 1725503, --1054415, 1522029, -1260573, 2569464, -1065152, -1873143, -976568, 2339684, 2100776, 344134, -2760053, -3738232, 3982509, -1822677, -2158221, 395137, 1018981, -15089831, 1525250, 7344394, -7983808, 7401840, 3011309, 14768782, -6092948, -11049340, -3042984, 1745904, -2404108, 4585415, -9739912, 19909320, 12419972, 7196755, 9141838, -7914014, -15037217, -5251135, -11321534, 12428562, -2629594, -2825015, -9232032, 14129906, 12048994, -4715337, -1147293, -227096, -7650411, -6344741, --11390253, 3147137, 3591130, 6183143, -10788958, 803696, 2747705, -4953171, -10496900, 146566, -5687074, 7710540, 1061931, -20187420, -7431367, -10036265, 3827890, 11795591, -287226, -11389716, -2396055, -10997264, 5727876, -2779381, 673236, -7838852, 15868830, 12622372, -4297115, -3876208, --9626632, -764504, 12617003, 2839510, 15571941, 15181636, 12451110, 7379828, 2305861, -10337986, --6010807, -13713294, 15382962, 15670188, -1578401, -12118787, 7420630, 18228914, -541166, 2249489, --4740570, -500901, -12341052, 1848983, -9801652, 6447820, 1969779, 9098888, 8792872, 4900021, -439160, 772020, 5312875, 2028835, -1639604, -3736085, -1538135, -5680631, 662499, 4373888, --4052302, -2112587, -4592931, 3092377, -1292785, 6618008, -6617471, 1696512, -550293, 6311992, --3388729, 2103460, 3484292, 718333, -547608, 261456, 774168, -2859375, -1508607, 3813394, -4322348, -10351945, -2937758, 6800544, 12182138, -13701483, -16549046, -14354318, 14834280, -6800544, -9762461, -613107, -296353, 24154360, -3432216, 1351841, -11359652, -17442936, 3777424, -2991982, -4118874, 2529736, -1824287, -10173167, 2288144, 3176128, 1241782, -9628243, 5612449, 3969087, -17490718, -8731132, 763967, 9364639, 9570261, -57445, 9666898, -3004867, -66035, 8612483, -7178501, 1608465, -4430259, -14891725, -11439109, 8040179, -720481, -3745748, -3357591, 1714766, -18919330, -1632088, -7274064, 9450539, -5263483, 8910447, 1744831, 27571006, -6005975, -1331440, --593242, 3733937, 9032853, -2294586, -3796214, 5801964, -13680545, 10293426, 19161996, 5414343, --4682588, 10575283, -4744865, -1003949, 21735756, -13298829, 4374424, 8337069, -4307852, 18148922, -3879966, 3568044, -7704635, -11111080, 1324997, 4440996, -12057047, 11256572, -599685, 2536178, --527744, 2988760, 10171019, -2863133, 10262824, 4740570, 2974265, 5643050, 4789426, -3574487, -6234145, 5964636, -6214818, 1698660, 4087735, 8283382, 1424319, 2092186, 3700651, 4678293, -7083475, 375273, -392990, -878321, 4631586, 4074313, -5543192, -492848, 2823941, 4531728, -3198140, -3321084, 6674916, -620086, 1852742, 489626, 5374615, 2687039, 2119030, 2500208, -3482682, 2576981, -1338419, -841277, 825707, 5517423, 1078574, 568546, -828929, 752693, -1746441, 2200097, 409633, 2586644, 3024194, 5087926, -13772350, -3765076, 9818832, -4396436, --7083475, -6264747, -6470368, 1470489, 9862319, -952946, -21185464, 294205, -16048145, 6612639, -7211250, 425739, 3520263, -6859063, -705448, 8948564, -20298016, 5522791, -4269198, 11756936, -8132521, 5463736, 1102733, -7855495, -18311594, -659814, -15981573, 10335839, 337692, -4553739, -17245368, 9181029, -6599218, -5050345, -3351148, -2250563, -4566087, -8827768, 1851668, 2992519, -24841554, -468688, -17434882, 355409, 12229919, 1258425, -8888435, 6102612, -13507135, 9524090, --5603859, 6442988, -7794292, 4072166, -13828721, 37261524, 1565516, 25869124, -2298344, -6584722, -6777996, -7816304, -7914551, 14602889, 13963476, -11684459, -31928786, 30955976, -10566693, -7954280, --3868692, -3864934, 4182761, -2382633, 2499671, 13591424, 3280818, -10211285, -8485782, -6011881, -4048007, -6298033, -871878, 6570763, -16550120, -980863, 1144072, -2151779, -4809290, 2332167, --3393024, 9543954, -3537443, 4512400, -4011500, -2476049, 258772, -3736622, 2478196, 2646774, --1721745, 2780455, -3863323, 2400350, -1016297, 212601, -1740536, 566936, -6959995, -4570919, --998580, -2306934, -5711233, -7009387, -4267587, -1294933, -3046743, -85362, -5090610, 559956, --4532801, -720481, -5899138, 3723737, -3309809, -1939715, -1714766, -15661598, -5507759, -4703526, --13457743, -23756000, -5804649, 464930, -12585328, 6282464, -5341329, 10690174, -9061844, -3732327, --12945568, 31122944, 26322780, -5800354, 5925445, 18122614, -18890876, 19317690, -7930120, -7919920, -6995428, 2632278, 3350075, -2733210, -4117263, 637803, 6284611, 5474473, -8370892, 9757629, --9026411, -15013595, 11022497, 9754408, -12533788, -15534360, -18026514, -2544231, -2945274, 5165772, --11758010, -14685567, -7509214, 24867324, 8710194, 8533563, -10562398, 9661529, 13072270, -10058277, -24365350, 4628364, -8664560, -11293617, 6548752, -9466645, -20765630, 5180268, -202400, 581431, -11404212, 10704669, -9110699, 1853278, -26630408, -3195993, -10486700, 22180822, 1342714, 3229279, --12835510, 10555419, -22626424, -2634426, 8880382, 2674154, -2444373, -2464238, 2761127, -924492, -2568391, -3265249, 648540, 2003065, 5398237, 1462973, 1725503, -1104880, 3204583, -3195456, -1032403, 10182831, -1975148, 583042, -3218004, 4611721, 2083059, -403190, 5259725, -5405217, --5266704, 5850283, -4807679, -1643899, -4407710, 2559801, -6442988, -2761664, -2110440, 5304822, -5160940, -8126078, 1283122, 4374424, -2864743, -9178882, -4527433, 7055021, -2143726, -1024887, --4493073, -11515344, 14629732, 15419469, 13950054, 9421548, -106300, 12786118, 11586211, 1959579, --2181307, 5168993, 43487, -12986907, -1540820, 4969277, -10167798, 14562623, -15146739, 12165495, -13218836, -3768834, -2978023, 5636608, 17635136, 13246216, -15935402, -3441343, -4265440, -1232119, -3981972, -7393250, -7786776, 17341468, 430570, 24886652, -16227997, -15341086, 12501576, -8238821, -4504884, -9700721, 8342974, 9580998, 6282464, -3840238, -14263050, 1466195, 4734128, -11799886, --21787832, -693637, 1978369, -12795781, 23524072, -2622615, -6677601, 31328028, 29438780, 3007551, --4099546, -1029182, -6291590, 7159711, -15448997, 14546517, 1906429, -8323110, 17477832, 2883534, -3536369, -4908611, -9504226, -23397908, 5144834, -7912941, -3881577, 10917807, 4379793, -5064304, --15357729, -4151623, -17487496, 7561827, 15707232, -2123325, -11887396, -8202314, -11855720, 236223, -6366216, 7748658, -1632625, -8276402, -4384625, -4463008, 1084479, -2425583, -4043175, 3493419, --656056, -2355253, 4112431, -9353902, 2682744, 2579128, 14624364, 1461363, -3280818, -7363722, -6429566, -7694971, -1060320, 5628555, -10447508, 9853192, 2036888, -263604, 1948305, 6720550, --3352222, -10122701, 200253, -2888903, -1344862, 10060961, 9376450, -1028108, 2878702, -25773562, --59732796, 20059108, 19007378, -6653978, 4264903, -14360760, 25814900, 16521129, -14593225, 4195110, -3535295, 399969, -6552510, -4713190, -30793842, 13066364, 15243376, -3486440, 17717, -1698123, -10267119, -7698192, 19568944, 5821828, -23201414, -13133473, 29525216, 19395536, -19196894, -4492536, --6806450, -11742441, 1866163, -4671851, 4234838, 38352448, 10475425, 40182640, 22966800, 25907242, -23613194, 46278272, -3003793, -4262218, 11093901, -3236795, -38762616, 31482110, -13595182, 18067316, --25611964, -20361366, -38269232, 7638063, -3495030, -12827457, 9377524, -17972290, 100932, -25688200, --25655450, 7238094, 15036681, -20841866, -5504001, -14440754, -20063402, -22534620, -16179679, 12374875, --9759776, -28143310, 40499396, 25390772, 40832792, -5295158, -8752606, -8090645, -14368276, -23111220, --1450625, -5055177, -17482664, -5814849, 5182952, -12374875, -11159399, 1323924, -1805497, -5498095, --4510253, 10099079, 10754598, 369367, 2734821, 7660074, 9587978, 1976222, -774705, -1441498, -4523675, -1884954, 1151588, -1731946, -6701760, -152471, 6376416, -6581501, 8700530, 10988137, -4654671, 384400, 1814087, 1183800, -7286412, 628139, 4184372, -3735548, 76236, -1694365, -1217086, -2583960, 992137, 4100083, -5582384, -4744865, 8836358, 3619584, -1101659, 1365800, --4890357, -21755084, -57050052, 24711632, 29519310, -13357348, -5815386, -1476932, 33427730, 1083406, -7153268, 7058242, -7853348, 6649683, 15576236, -3113851, -14966350, 3739843, 28434294, -15058155, --9417790, 6235756, -3960497, 21287468, -5319317, 9599789, -10958609, -13166759, -13146895, 13955422, --4190814, 12388833, 14447733, -3724274, 1912871, 93416, -11783243, 3914863, -10686952, 12635794, -30949534, 50818052, -620623, -1446330, -21505438, 11629698, 16640314, -497679, 18686866, 26708792, -11242614, 15188078, -23417772, -14066018, 19474456, 50774028, -9291088, -29802778, 7604777, -9906342, --528818, 13766444, 267362, -13593571, -6492917, -7015829, -34524020, -14433238, 234076, 5729487, -12051678, -1983201, -13271449, -7648800, 3265249, -5383742, -13328357, 13741748, 33229088, 14373108, -17902498, 1832340, -4529043, -27021250, -5968931, 7674033, 5983427, -6052683, 15334644, -4336307, -8584029, -18915036, 1102196, -6524592, -5438503, 178778, 5255966, 5143224, -5331128, -10292889, -9963250, -3905736, 8186745, 731218, -2062121, 671089, 1759863, 7567733, 254477, -1205812, --3913789, -4340602, 6521371, 2156611, 6010270, -12874164, 8960376, 5174362, 2439005, -4669167, --1705102, 9343164, -1125281, 363462, -7204271, 668404, -11053635, -2341831, 3198677, 9362492, -4648765, 8269423, 1904281, -1410897, -8090108, 18234820, 6133214, 9613211, 3829500, 27430882, --8506183, -3311957, -10631118, 6452115, -6565395, 6123013, 31095564, 6237367, -32742146, -7900056, --9484362, -27981176, 17947594, 8543764, -3161096, 4081830, 1841467, -12504260, -26844, -785979, --12439299, -3649112, 27138288, 39873940, 18845242, -13760538, -21842056, 10449119, 18252000, 2131378, -14615774, -10021769, -6935299, 15032922, 4793721, 307627, -33302640, -43418900, -1335735, -25352656, --14705431, 9197672, 36479840, 7988103, 1876364, -10457708, -12530030, -18153754, -15983721, 3082713, -11045582, -3802120, -18023830, -29027536, 11632382, 857383, -16154983, -27052388, -18325014, -29787208, --53864260, -32449552, -4810900, -6366216, 64874408, -7837779, -2390149, 37436544, 4418985, 2193118, -22502944, -13319767, -32749662, -38021196, -5885179, -18162880, -20177220, -21393768, -23480586, 4687957, -21260624, 33820184, 20067698, 4233764, 2214056, -8576513, 17428440, 3685082, -5264020, -21654152, -4501663, 15927886, -753230, 37044, -7795366, 4469451, 8796093, 14577656, 4095788, 6259378, -5564130, 7348689, 8996883, 9481140, -2627983, 7243999, 1466195, -4873178, -11375221, -13462038, -1385664, 3385508, -13553843, -6495065, -13037373, 4420058, 6723235, 10525891, 15201500, 25825638, -19092740, 19742354, 11642046, 7822746, -4680441, 2270427, 102005, -11754252, -18406620, -13622563, --17818746, -11115912, -15484968, 20488604, -29073170, 7343321, 4614406, -12658879, -40772660, 27740120, -8229694, -2618856, -41285912, 10988674, 6400038, -21794274, 3637837, 19126026, 11743514, 5572720, --18696530, -3804804, -6984691, 3298535, -7046431, 1735167, -14486925, -20817170, 22826678, -15767899, -34694208, -21406654, -19407346, -13131326, -24394340, 2150705, -486942, 36465884, -27034672, -28483686, -14668924, 9394704, -23608898, -31361314, -3503620, -17668958, 20302310, 4335233, -25997438, 16864726, --4464619, -39917964, 26182658, -17802102, 17077326, -29699162, -7305203, -821949, -12528420, -5116380, -3382824, 37499896, -10161893, -3505230, -10821707, 10712722, -17792976, 13886166, 29255170, -1797981, -29414620, 23142358, -3568044, 47227460, -2817499, 5462662, -1440425, 13334263, 47554952, -3911642, --13220983, -50888920, 39368208, 14066018, 33603288, 11459510, -26491896, 11774116, 7506529, 4854924, --23526758, 13420162, 2699387, 3877819, -12670690, -3675955, 16026670, 13772886, 561030, -1651952, --1689533, -1841467, 3888556, 10096394, -20672752, -6082748, -2903935, 3301219, -4264903, 4590247, -4399657, 6513855, -4863514, -10953777, 16982300, 26666378, 9290014, -13664975, -11787001, -5043902, --4045859, 7228430, 3587908, -2655901, -16874926, -12048457, -13677323, -1323924, 13042205, 5758478, -10994043, 4225174, -18387292, -3280281, 8008504, 17870286, 11158325, -7488813, -5634460, -4292820, -2563559, 3117610, -389231, -1067836, -3511136, 28094992, -53687628, 2218888, -60441464, -20150376, --10134512, 18600430, 56120728, 47718696, 17679696, 28236726, -18087182, -15220827, 2868501, -3974455, -13114683, 4257923, -12491912, 18925236, 27804544, 23124104, 17332878, 14667850, -314606, 2737505, --9249212, 26309896, 12369506, -4863514, -15977815, 5541045, 10890426, -2711198, 34393560, 35906464, --20533702, -15155866, 913754, 27924804, 17471926, 4591857, 3554622, -6500433, -12381854, 7058242, -42863772, -17165374, -21002390, -22879290, 22463752, 9252433, -12667469, -19771882, -31762894, -37644316, -4282083, 8410620, 6953552, -8201777, -2660195, -10263898, 7588134, -30002494, -49376016, -22189412, --3321084, -8292508, -19206020, 24899536, 41525356, -9189619, 21482890, 45832668, 29943438, 10713259, --31403190, 5217312, 5792837, -27772870, -15300821, -4338991, -22085796, 24358370, 34662532, -1971390, --7852274, -4168803, -9960029, -5522254, -13993540, -13738527, -4973572, -6777996, 5084168, -3007551, --3715684, 6890202, -20848308, -2457795, 1832877, 21366926, -21677774, -3467649, -4855461, 4116189, --13763760, -4799626, 4345433, -7519951, -12714714, -2037425, -872952, -12504797, 14912126, -20219096, --2175938, -7421167, 4614943, -2092186, -5859946, -11788075, 499290, 6003291, -4110821, 2827699, --34241088, 27611272, -3508452, 23722714, 14389751, 546535, 15731928, -6903086, -1768453, 13547401, -16604880, 2558190, 83752, -545998, -15119895, -9822590, 4040491, -21075404, 565862, -7924215, -510027, -17869748, 3043521, 994822, -16260746, 13574244, 5770289, 9186935, -20421496, -5513665, -3845606, -1072131, 1473711, 11710228, 2587181, 3278134, -2349347, -4529043, -3202972, -1678795, -7554848, -3424163, -13042205, 10557030, -17932562, -5632850, -6156299, 2146947, -8781598, -10401874, -13644037, -1743220, -13698798, 8366060, -19102404, 15295452, 4752382, 718333, 15749108, 17533668, -2428267, 4995047, -13174275, 17008070, -8332237, -11639361, -1012539, 2514167, 32148368, -14453102, --23757074, 20344724, -7751342, 20328618, -3452080, 1333051, -8899709, 12312061, -20648056, -17121350, --6788733, 8087424, 4820564, -1250909, 9880035, -12275017, -12431783, -8250096, 2925410, 3592203, -723702, -533650, -3768834, 2130841, -17149268, 3471407, 3483219, -4132296, -1599875, 5168993, --2762738, -7323456, 8848706, -4423817, 1080721, -375810, -2261300, 5983963, 2571612, -6213207, --729608, -1475858, -5577015, -1196148, -2078764, -11410654, 3461744, 6973417, 5549635, -5179194, -5178657, -8324721, -2625299, 209380, -5418638, 17029008, -7153268, -88985816, -169941648, -60316372, --133006008, -151604832, 37460704, -4872641, 51227148, 197127184, 213702544, 150970240, 215222960, 176933328, -58897424, 62124556, 46027552, -118398824, -121929288, -67728416, -118351584, -127957816, -42705932, -37557880, --107821392, -81184008, -12982612, -48010220, -58766428, -14440217, -44924820, -79646408, -45259292, 15089831, --31822486, -39283380, 47145856, -7773354, -44203268, 40669584, 75154952, -17148194, 18944028, 116335632, -16208670, -37056976, 77280424, 67519568, -66566624, 38422240, 85146656, -26311506, 9481677, 147371072, -112496464, 56756384, 206929376, 230348224, 117882896, 212154736, 273915840, 171976928, 162282656, 225223792, -144879440, 92214560, 102109088, 53202832, -61710092, -119579944, -162224672, -277040960, -337111968, -382238656, --432253024, -426240608, -461988160, -412734016, -306328352, -306341216, -241457152, -21568788, -12390444, 6324340, -173333072, 136924624, 45683420, 90886880, 135238864, 50106700, 60397976, 137297760, 100008312, 20435454, -82429552, 116239528, 50026168, 62649076, 142983760, 53582940, -22580254, 65940096, 46171972, -31615254, -62284004, 138097152, 65064460, 101812200, 220379072, 183271616, 173681504, 258810976, 239046608, 164758704, -143289776, 128441000, 48124572, -1900523, 6903623, -27049704, -86038392, -85689432, -98371392, -168444864, --188407328, -180655456, -202628496, -243159040, -212962192, -205905568, -219639792, -170103792, -114982720, -90008016, --56703768, 2044404, 22759032, 19047106, 31616328, 34708168, 17814450, 16254304, 31880468, 27560268, -18758270, 22564684, 26389890, 19977504, 25969520, 39737036, 43741556, 42039676, 49045304, 52041580, -43067784, 49382460, 45434848, 28339268, 14612552, 6326487, -397284, -5661841, -4162897, -4232691, --8332774, -8964670, -3345243, 4051765, 14475114, 20694764, 24975772, 25930328, 23259396, 23247584, -28804736, 27916214, 27014270, 31185220, 29529510, 21956410, 22815404, 21766358, 13243532, 10821707, -13297756, 6174553, -708133, -2150168, -9614821, -20323248, -21838298, -24748138, -34369404, -38190848, --35816808, -40867152, -43764644, -38876972, -38421704, -40087616, -35231616, -28348394, -26904748, -23046258, --16352014, -16281147, -15825881, -11970074, -8026757, -6051609, -550830, 4383014, 6077379, 8376797, -13872207, 18928458, 21829708, 25740812, 25997974, 23320062, 20241644, 18300318, 16487306, 14206141, -11686069, 9198746, 7044820, 5297306, 4930086, 4467303, 3384971, 2837363, 2339147, 1272921, -561567, 102542, -360240, -734439, -869194, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-1938641, 1176284, -935766, -2905009, -210453, 6729677, -3454228, 785442, -1456531, -75699, +-2573222, 4843113, -2512019, -2677375, -3024194, 5770826, -3430605, -898185, -1620813, 1622961, +2665027, 3376918, -4763656, -11811, 4562329, 2017561, 782221, -252329, -568546, 2059437, +4651987, 1121523, -5970005, -3080029, -3211025, 5212480, -531502, 3976603, -2498060, 1842004, +5219459, -2544231, -3926137, 1394254, -1466731, -265751, -3512210, -1422171, -2623688, 996432, +-4763119, -1575716, -1215476, -155693, 6456947, -2108829, -964757, -233002, -1685238, -671626, +-602906, 3902515, 2027761, 2391760, -3348464, 2458869, 2594160, -2289755, 1078037, 1530082, +-1719061, -2348810, 2752537, -4116189, 2914672, 1752347, 779000, -3815005, -1310502, 1417876, +-325881, -795106, -1016834, -92879, -2032593, -2378338, -352724, -394600, 298500, -897111, +33823, 1403381, -39192, 520228, 215822, 273804, 30602, -280784, -1013075, -625455, +721018, -326954, 57445, -102005, -3131031, 3389266, 430034, -1408749, -2124935, -553514, +-1062468, 40802, -2641942, -2020782, 1552631, -387084, -993748, -4642860, -665183, 4387846, +-2900177, -697932, 3311420, -1855426, -3477850, -2643552, 2268817, 54224, -310311, -640487, +-3333968, 1167694, -1467268, -756451, 3837553, -2059974, -5127117, -1503775, 316754, 1578401, +1385664, 475668, -3888019, -871878, -4743255, -4305168, -1139240, 4576288, -757525, -8950712, +-375273, 3056943, 2655901, -1823214, 1795833, 1962800, 208843, 2702071, -4810900, -3395172, +-427349, 1434519, 249108, 1030255, -493921, 1294933, 1175747, 1897839, -255014, 1180579, +1123134, -875636, 1882269, -432718, -4692789, -3839701, -2479807, -1968169, -2093797, 670552, +-1049583, 3681324, 3047279, -534723, -1433982, -1247151, -652298, 1121523, 1750736, 239981, +-984621, 206695, 266288, -978716, 1323387, 27917, -274878, -480499, -84826, -724776, +544924, -129386, 123480, -843424, 538482, -526134, 30602, 20938, 380641, -129386, +-384936, -153008, -784368, -303332, 107374, -387621, 93952, -251256, -712428, 4068408, +2253784, 6116034, 363462, -1257352, -807454, 4314295, -1237488, 2294050, -4042101, -469225, +-157840, 2244657, 1540820, 3866544, 2699924, -2055679, -3993246, -3262565, 2144799, -1416802, +2949569, 1845225, 344671, -239981, 2441689, 1714766, -1875827, 2014340, -4299263, -635118, +-3990562, -3411278, -4790499, 1334661, 2636036, -546535, 3690451, -2962454, 3413425, -7085086, +2644089, 1154809, 5143760, 1481764, 1806571, 2765422, -190589, -1839320, 1880122, 4501663, +1480153, 2159295, -800475, -121870, -6512244, -469762, 958315, 1200443, -1013612, 3398393, +6391448, -2200097, -4718022, 3057480, 615791, -3331821, -123480, -1564442, -3388192, 370978, +4576288, 1126892, 1618666, 747861, -569083, 1731946, 1018444, -126165, 1455457, 62277, +-496606, -376883, -952409, 868120, -1364726, -192737, 2082522, -500364, -126702, 794569, +-586263, 1442035, -2135136, -955093, -46171, -850404, -976568, 190589, -583579, 679679, +1501091, -621697, 812286, 213675, 12348, -2684, 138513, -1799591, -540629, -424665, +265751, 1440962, 779537, 2273112, 3338800, 3209414, -3204046, 4923643, -1817845, -3355980, +-4932770, 1081795, -6507949, -456340, 624381, 1734093, -4167192, 2609193, -112743, 539018, +1679332, 1005559, 1414655, -5616207, -418222, -1314260, -3672734, 2064806, 1023813, 776852, +3069291, 10898480, -850940, 505196, 1518808, 2648921, 1029718, -9051644, 1825898, -1553704, +-1074279, 4865661, 103616, 2390686, 3512210, -4497368, -2516851, -1341640, -4345433, -9292162, +395674, -3542274, -596464, -868120, -229781, -2204392, -4556424, 1217623, -4361540, -1438277, +935229, -4884989, 4949950, 1654636, 1380295, -2092723, -407485, -857383, 954557, -1622961, +2523830, -4022774, 1276142, 5939403, 4941897, -1811939, 2495376, -2439542, 1037235, -4555350, +-184147, 2714956, 3182034, 2804077, -532039, 5284958, 454193, 2602750, 2357400, -171262, +1079647, 505732, 165356, -985158, 503585, 755377, -358093, 13959, -639413, -1554778, +-264677, 924492, -823023, 2078227, -632971, -1207423, -992137, 673236, -574989, 859530, +-215822, -996969, 507343, -340913, 1081795, 590021, 621160, 357556, -1971390, -549219, +228707, 736587, -4832, 66572, -553514, 7349763, -9269076, 417149, -5699422, 2951180, +4246649, 5173825, -777389, -4869419, 146029, 5097590, 1103270, 994285, -3794604, -487479, +-6660421, 8904004, -450972, -6812892, 7423314, 1878511, 2214593, -457951, -2650532, -848256, +-3506841, -3454228, 2755759, 3907347, -771484, 3688303, -2999498, -1860795, 19864, 5138392, +4859756, -1331977, -2708514, 4006668, 2559801, 399969, 3389803, 829466, -3940096, 4194036, +2619930, -285078, -1356136, 1178432, -4248797, 11400454, -569083, -377957, 8493835, -741419, +-5164162, -2783139, -592169, 2094870, -5367636, 3717294, 1133871, 158377, -4871567, -4091493, +-8625368, -732292, 4054449, 2039036, 4912369, -2678986, -1898376, 10275709, -2823404, 1745904, +-1401233, -4210679, 349503, 1908576, -4407710, -7821136, 350577, -4809290, -4865124, -2353642, +2574296, 264677, -715112, -2967286, -1005559, 382252, -1100049, -797790, 827855, 2837363, +418222, 744103, -1956358, -970663, -181462, 22012, -2770254, -2006287, -1749662, -62814, +700617, 316754, -885837, 112206, -154082, -237834, -1441498, -492311, -187368, -513785, +-743029, -970126, -9827422, -161061, -4164508, -4702453, 1354525, -5637682, 101469, 3767223, +2024540, 7950522, -13407277, 8519068, -1479616, 3695283, -2616709, -1966021, -7075422, 6194954, +5451924, 1332514, -6296959, -397284, -3668976, -484258, 6431177, 4467840, 932545, 6134824, +-151934, 265214, 542777, -268435, -4395362, 9198746, -993211, 34360, 10683194, -6987912, +2504503, -3360275, -765578, 3345780, -1534914, -5522791, 10280004, 8014946, -358093, 2568391, +4269735, 11126113, -1515050, -2064806, -6132140, 1013075, 2056216, -6467147, -6911676, -6069863, +7153268, 117575, -3027952, 4912906, 3462818, 18790, -1779190, 1569811, -3961034, -1039382, +-4304631, -996432, 3950296, -7881265, 1800128, -1686312, -5485747, 3289945, 5174362, 2196876, +5390721, 4685810, -4046396, -6424734, -3240016, 2787434, -2567317, -4943508, 3146064, 5348845, +-3945464, 646393, 1107565, 581968, -3687766, 2110440, -1662689, -1303523, -2379412, -1240172, +-1870995, -194884, -240518, 696858, 1094143, -935229, -836445, -366146, -1493038, -856846, +-428423, -586800, 1120987, 1445793, 337692, 2130841, -1942399, 1472637, -1681480, -745714, +1508070, 7385733, 7834557, 1328219, -6685654, -888521, -6347962, 2698313, 16829830, 4181688, +11673184, 4312684, 184684, -10817949, -2629057, 1825361, 10547903, -4610648, -2276333, -4009889, +1047435, 8486855, -6144488, 4175245, 7351374, 1664300, 2731062, -4744865, 9075266, -1896228, +11807939, -71404, -3556770, -11002096, 1394791, 81068, 13212393, -3933653, -1030792, 8393440, +104690, 1147830, -2671470, -8593156, 969589, 5015448, -6156836, -4846334, 1336272, -10312216, +5728413, 5792837, -1701344, -629213, 2967286, 5907728, -450435, -3562675, -90194, 8655970, +-1052267, -1277216, -3208341, 11194295, 11334956, 812286, -1998770, 1808181, -433255, 2992519, +5266167, -380105, 7584912, -2883534, -4135517, -6046777, 2112587, -447213, -9226663, -6638409, +-3800509, 7350300, -2083059, -3360275, -889595, 59056, -3094524, -4694936, -1616518, -1334661, +-2783676, 524523, -1725503, -1501628, 1551557, -2957622, -3058017, 1043140, 2552821, -1439888, +-1948305, -1451162, -2557116, -1186485, 872952, -834297, 507880, 1449552, -399432, -701690, +-2244657, 1377611, 156766, -7449084, 7464653, 5669894, 398895, -4955856, -5561446, -2443837, +-11005854, 12688944, 9532143, -2094333, 3504693, 1107565, -2136746, 9612137, -819265, -4530117, +14243722, -15524159, 3953518, 6629819, -99321, -6372658, 6764037, 1012002, 9801115, -3850438, +-1105417, 2585034, 3887482, 624918, -1393180, 14286672, 6133214, -6590091, -9939628, 6841346, +-9943386, -2912525, -11441256, -1517197, 17008608, 6937983, 8197482, 19327, -9098351, -1546725, +-4471061, -2006287, 12707734, -2027761, -14108431, -1174674, 2709588, -8983998, -1534377, 5728950, +4488778, -6051072, -3191698, 6122476, 8102993, -2407866, 8443369, 113817, 2084670, 3141769, +668941, 3300146, 5043902, 4894652, 4747013, -2561411, -10252087, -11304354, 2757906, -2299955, +8005282, -1478006, 9509594, 3200825, 4395899, -5128191, -4598300, 3374234, -230318, 664109, +839129, 390842, -4626217, -2128156, -761820, -3831111, -166430, -3295314, 533113, -1874753, +1353989, -491237, 2385854, -31139, 1280974, 400506, -1283122, -1098975, -1526324, 2994666, +291521, -921807, 904628, 1536525, 1250909, 268972, -2292976, -6277632, -3600793, 1074, +-3082176, -97174, -558346, -624918, 3704409, -635118, 6110128, -957241, 5689221, -11860015, +4032438, 3162707, 1557463, -7823283, -6569690, -8323110, 6200322, 3146601, -5992553, -5983963, +7836705, 2436857, -802622, -5063230, -8256001, -3468186, 3127810, -5348308, 453656, -9884330, +-2885681, 966905, 3162170, 6178848, -1192390, 3879966, 5363878, -5816460, -13674639, 9118752, +256087, -2326262, 8677445, -1551557, 180389, -6150930, 7604777, -5159330, -6487548, -2659122, +6203544, 9484362, 7956427, 2332704, 1464584, -17278116, 7588671, -1236951, 3090766, -6103149, +-1290638, -6807523, -2469069, -1824824, -8950712, -4627291, -3771518, -5012764, 8921184, -3136400, +11655467, -1623498, -840740, 7211787, 8290898, 14055817, 9608916, -409633, -4801237, -755377, +-153545, -7057705, 1553704, -4633733, -7681549, 14367739, -9436580, -10055055, -1600412, 5264020, +632971, 1540820, 556198, 5953362, -252329, 1520955, 2025077, -2535641, 208306, 3601330, +-2244657, 1391033, 2565169, 2051921, 4568772, 896574, -60666, 2429878, 329102, -1032403, +1614908, 2520072, 931471, -154082, 696322, 281320, 5320391, 293132, 4307852, 2801393, +545998, 4503810, 4984847, 367757, -261456, 545998, 592169, 478889, -553514, -751619, +1177358, 147103, -3008088, -4388920, -17980880, 4206384, -12315819, -7298223, 12013560, 9383430, +-20555714, -18833968, 828929, 8300561, -4638028, 5192079, -6660421, -586800, -11855183, -2965138, +-10684268, -599148, -2790118, 527207, 4362076, 3601330, 6953015, -663036, -5586679, 5192079, +-6698002, -2583960, 2394444, 609885, 3694209, 7355669, -974958, 1078037, 1838246, -2744484, +-576063, -10352482, -12276627, -11897059, 198642, -11970611, 4253628, 1762010, -4609574, -5482526, +-2241973, -1859184, -856846, -7066295, -11227045, -490700, 18305150, 10139881, -2370285, -10673531, +-10995653, 12655658, -11557757, -3726958, -1906429, -7692824, -5763846, -7845295, -9167071, -12866111, +-17415556, -2390686, -2655901, -2367064, 6076305, 5714991, 1640678, 5022965, -3816079, -4755603, +16448651, 7015292, -4166118, -11871290, 3896072, -6976638, -8249559, 88047, 13820668, -2597918, +53150, 9501541, -892279, -6149320, 430570, 2344515, -30065, -2457795, -2309619, 32749, +2467996, 1226213, 1700807, 1045288, 4825396, -1273995, 2667175, -6642704, 3272765, 1725503, +-1054415, 1522029, -1260573, 2569464, -1065152, -1873143, -976568, 2339684, 2100776, 344134, +2760053, -3738232, 3982509, -1822677, -2158221, 395137, 1018981, -15089831, 1525250, 7344394, +7983808, 7401840, 3011309, 14768782, -6092948, -11049340, -3042984, 1745904, -2404108, 4585415, +9739912, 19909320, 12419972, 7196755, 9141838, -7914014, -15037217, -5251135, -11321534, 12428562, +2629594, -2825015, -9232032, 14129906, 12048994, -4715337, -1147293, -227096, -7650411, -6344741, +-11390253, 3147137, 3591130, 6183143, -10788958, 803696, 2747705, -4953171, -10496900, 146566, +5687074, 7710540, 1061931, -20187420, -7431367, -10036265, 3827890, 11795591, -287226, -11389716, +2396055, -10997264, 5727876, -2779381, 673236, -7838852, 15868830, 12622372, -4297115, -3876208, +-9626632, -764504, 12617003, 2839510, 15571941, 15181636, 12451110, 7379828, 2305861, -10337986, +-6010807, -13713294, 15382962, 15670188, -1578401, -12118787, 7420630, 18228914, -541166, 2249489, +-4740570, -500901, -12341052, 1848983, -9801652, 6447820, 1969779, 9098888, 8792872, 4900021, +439160, 772020, 5312875, 2028835, -1639604, -3736085, -1538135, -5680631, 662499, 4373888, +-4052302, -2112587, -4592931, 3092377, -1292785, 6618008, -6617471, 1696512, -550293, 6311992, +-3388729, 2103460, 3484292, 718333, -547608, 261456, 774168, -2859375, -1508607, 3813394, +4322348, -10351945, -2937758, 6800544, 12182138, -13701483, -16549046, -14354318, 14834280, -6800544, +9762461, -613107, -296353, 24154360, -3432216, 1351841, -11359652, -17442936, 3777424, -2991982, +4118874, 2529736, -1824287, -10173167, 2288144, 3176128, 1241782, -9628243, 5612449, 3969087, +17490718, -8731132, 763967, 9364639, 9570261, -57445, 9666898, -3004867, -66035, 8612483, +7178501, 1608465, -4430259, -14891725, -11439109, 8040179, -720481, -3745748, -3357591, 1714766, +18919330, -1632088, -7274064, 9450539, -5263483, 8910447, 1744831, 27571006, -6005975, -1331440, +-593242, 3733937, 9032853, -2294586, -3796214, 5801964, -13680545, 10293426, 19161996, 5414343, +-4682588, 10575283, -4744865, -1003949, 21735756, -13298829, 4374424, 8337069, -4307852, 18148922, +3879966, 3568044, -7704635, -11111080, 1324997, 4440996, -12057047, 11256572, -599685, 2536178, +-527744, 2988760, 10171019, -2863133, 10262824, 4740570, 2974265, 5643050, 4789426, -3574487, +6234145, 5964636, -6214818, 1698660, 4087735, 8283382, 1424319, 2092186, 3700651, 4678293, +7083475, 375273, -392990, -878321, 4631586, 4074313, -5543192, -492848, 2823941, 4531728, +3198140, -3321084, 6674916, -620086, 1852742, 489626, 5374615, 2687039, 2119030, 2500208, +3482682, 2576981, -1338419, -841277, 825707, 5517423, 1078574, 568546, -828929, 752693, +1746441, 2200097, 409633, 2586644, 3024194, 5087926, -13772350, -3765076, 9818832, -4396436, +-7083475, -6264747, -6470368, 1470489, 9862319, -952946, -21185464, 294205, -16048145, 6612639, +7211250, 425739, 3520263, -6859063, -705448, 8948564, -20298016, 5522791, -4269198, 11756936, +8132521, 5463736, 1102733, -7855495, -18311594, -659814, -15981573, 10335839, 337692, -4553739, +17245368, 9181029, -6599218, -5050345, -3351148, -2250563, -4566087, -8827768, 1851668, 2992519, +24841554, -468688, -17434882, 355409, 12229919, 1258425, -8888435, 6102612, -13507135, 9524090, +-5603859, 6442988, -7794292, 4072166, -13828721, 37261524, 1565516, 25869124, -2298344, -6584722, +6777996, -7816304, -7914551, 14602889, 13963476, -11684459, -31928786, 30955976, -10566693, -7954280, +-3868692, -3864934, 4182761, -2382633, 2499671, 13591424, 3280818, -10211285, -8485782, -6011881, +4048007, -6298033, -871878, 6570763, -16550120, -980863, 1144072, -2151779, -4809290, 2332167, +-3393024, 9543954, -3537443, 4512400, -4011500, -2476049, 258772, -3736622, 2478196, 2646774, +-1721745, 2780455, -3863323, 2400350, -1016297, 212601, -1740536, 566936, -6959995, -4570919, +-998580, -2306934, -5711233, -7009387, -4267587, -1294933, -3046743, -85362, -5090610, 559956, +-4532801, -720481, -5899138, 3723737, -3309809, -1939715, -1714766, -15661598, -5507759, -4703526, +-13457743, -23756000, -5804649, 464930, -12585328, 6282464, -5341329, 10690174, -9061844, -3732327, +-12945568, 31122944, 26322780, -5800354, 5925445, 18122614, -18890876, 19317690, -7930120, -7919920, +6995428, 2632278, 3350075, -2733210, -4117263, 637803, 6284611, 5474473, -8370892, 9757629, +-9026411, -15013595, 11022497, 9754408, -12533788, -15534360, -18026514, -2544231, -2945274, 5165772, +-11758010, -14685567, -7509214, 24867324, 8710194, 8533563, -10562398, 9661529, 13072270, -10058277, +24365350, 4628364, -8664560, -11293617, 6548752, -9466645, -20765630, 5180268, -202400, 581431, +11404212, 10704669, -9110699, 1853278, -26630408, -3195993, -10486700, 22180822, 1342714, 3229279, +-12835510, 10555419, -22626424, -2634426, 8880382, 2674154, -2444373, -2464238, 2761127, -924492, +2568391, -3265249, 648540, 2003065, 5398237, 1462973, 1725503, -1104880, 3204583, -3195456, +1032403, 10182831, -1975148, 583042, -3218004, 4611721, 2083059, -403190, 5259725, -5405217, +-5266704, 5850283, -4807679, -1643899, -4407710, 2559801, -6442988, -2761664, -2110440, 5304822, +5160940, -8126078, 1283122, 4374424, -2864743, -9178882, -4527433, 7055021, -2143726, -1024887, +-4493073, -11515344, 14629732, 15419469, 13950054, 9421548, -106300, 12786118, 11586211, 1959579, +-2181307, 5168993, 43487, -12986907, -1540820, 4969277, -10167798, 14562623, -15146739, 12165495, +13218836, -3768834, -2978023, 5636608, 17635136, 13246216, -15935402, -3441343, -4265440, -1232119, +3981972, -7393250, -7786776, 17341468, 430570, 24886652, -16227997, -15341086, 12501576, -8238821, +4504884, -9700721, 8342974, 9580998, 6282464, -3840238, -14263050, 1466195, 4734128, -11799886, +-21787832, -693637, 1978369, -12795781, 23524072, -2622615, -6677601, 31328028, 29438780, 3007551, +-4099546, -1029182, -6291590, 7159711, -15448997, 14546517, 1906429, -8323110, 17477832, 2883534, +3536369, -4908611, -9504226, -23397908, 5144834, -7912941, -3881577, 10917807, 4379793, -5064304, +-15357729, -4151623, -17487496, 7561827, 15707232, -2123325, -11887396, -8202314, -11855720, 236223, +6366216, 7748658, -1632625, -8276402, -4384625, -4463008, 1084479, -2425583, -4043175, 3493419, +-656056, -2355253, 4112431, -9353902, 2682744, 2579128, 14624364, 1461363, -3280818, -7363722, +6429566, -7694971, -1060320, 5628555, -10447508, 9853192, 2036888, -263604, 1948305, 6720550, +-3352222, -10122701, 200253, -2888903, -1344862, 10060961, 9376450, -1028108, 2878702, -25773562, +-59732796, 20059108, 19007378, -6653978, 4264903, -14360760, 25814900, 16521129, -14593225, 4195110, +3535295, 399969, -6552510, -4713190, -30793842, 13066364, 15243376, -3486440, 17717, -1698123, +10267119, -7698192, 19568944, 5821828, -23201414, -13133473, 29525216, 19395536, -19196894, -4492536, +-6806450, -11742441, 1866163, -4671851, 4234838, 38352448, 10475425, 40182640, 22966800, 25907242, +23613194, 46278272, -3003793, -4262218, 11093901, -3236795, -38762616, 31482110, -13595182, 18067316, +-25611964, -20361366, -38269232, 7638063, -3495030, -12827457, 9377524, -17972290, 100932, -25688200, +-25655450, 7238094, 15036681, -20841866, -5504001, -14440754, -20063402, -22534620, -16179679, 12374875, +-9759776, -28143310, 40499396, 25390772, 40832792, -5295158, -8752606, -8090645, -14368276, -23111220, +-1450625, -5055177, -17482664, -5814849, 5182952, -12374875, -11159399, 1323924, -1805497, -5498095, +-4510253, 10099079, 10754598, 369367, 2734821, 7660074, 9587978, 1976222, -774705, -1441498, +4523675, -1884954, 1151588, -1731946, -6701760, -152471, 6376416, -6581501, 8700530, 10988137, +4654671, 384400, 1814087, 1183800, -7286412, 628139, 4184372, -3735548, 76236, -1694365, +1217086, -2583960, 992137, 4100083, -5582384, -4744865, 8836358, 3619584, -1101659, 1365800, +-4890357, -21755084, -57050052, 24711632, 29519310, -13357348, -5815386, -1476932, 33427730, 1083406, +7153268, 7058242, -7853348, 6649683, 15576236, -3113851, -14966350, 3739843, 28434294, -15058155, +-9417790, 6235756, -3960497, 21287468, -5319317, 9599789, -10958609, -13166759, -13146895, 13955422, +-4190814, 12388833, 14447733, -3724274, 1912871, 93416, -11783243, 3914863, -10686952, 12635794, +30949534, 50818052, -620623, -1446330, -21505438, 11629698, 16640314, -497679, 18686866, 26708792, +11242614, 15188078, -23417772, -14066018, 19474456, 50774028, -9291088, -29802778, 7604777, -9906342, +-528818, 13766444, 267362, -13593571, -6492917, -7015829, -34524020, -14433238, 234076, 5729487, +12051678, -1983201, -13271449, -7648800, 3265249, -5383742, -13328357, 13741748, 33229088, 14373108, +17902498, 1832340, -4529043, -27021250, -5968931, 7674033, 5983427, -6052683, 15334644, -4336307, +8584029, -18915036, 1102196, -6524592, -5438503, 178778, 5255966, 5143224, -5331128, -10292889, +9963250, -3905736, 8186745, 731218, -2062121, 671089, 1759863, 7567733, 254477, -1205812, +-3913789, -4340602, 6521371, 2156611, 6010270, -12874164, 8960376, 5174362, 2439005, -4669167, +-1705102, 9343164, -1125281, 363462, -7204271, 668404, -11053635, -2341831, 3198677, 9362492, +4648765, 8269423, 1904281, -1410897, -8090108, 18234820, 6133214, 9613211, 3829500, 27430882, +-8506183, -3311957, -10631118, 6452115, -6565395, 6123013, 31095564, 6237367, -32742146, -7900056, +-9484362, -27981176, 17947594, 8543764, -3161096, 4081830, 1841467, -12504260, -26844, -785979, +-12439299, -3649112, 27138288, 39873940, 18845242, -13760538, -21842056, 10449119, 18252000, 2131378, +14615774, -10021769, -6935299, 15032922, 4793721, 307627, -33302640, -43418900, -1335735, -25352656, +-14705431, 9197672, 36479840, 7988103, 1876364, -10457708, -12530030, -18153754, -15983721, 3082713, +11045582, -3802120, -18023830, -29027536, 11632382, 857383, -16154983, -27052388, -18325014, -29787208, +-53864260, -32449552, -4810900, -6366216, 64874408, -7837779, -2390149, 37436544, 4418985, 2193118, +22502944, -13319767, -32749662, -38021196, -5885179, -18162880, -20177220, -21393768, -23480586, 4687957, +21260624, 33820184, 20067698, 4233764, 2214056, -8576513, 17428440, 3685082, -5264020, -21654152, +4501663, 15927886, -753230, 37044, -7795366, 4469451, 8796093, 14577656, 4095788, 6259378, +5564130, 7348689, 8996883, 9481140, -2627983, 7243999, 1466195, -4873178, -11375221, -13462038, +1385664, 3385508, -13553843, -6495065, -13037373, 4420058, 6723235, 10525891, 15201500, 25825638, +19092740, 19742354, 11642046, 7822746, -4680441, 2270427, 102005, -11754252, -18406620, -13622563, +-17818746, -11115912, -15484968, 20488604, -29073170, 7343321, 4614406, -12658879, -40772660, 27740120, +8229694, -2618856, -41285912, 10988674, 6400038, -21794274, 3637837, 19126026, 11743514, 5572720, +-18696530, -3804804, -6984691, 3298535, -7046431, 1735167, -14486925, -20817170, 22826678, -15767899, +34694208, -21406654, -19407346, -13131326, -24394340, 2150705, -486942, 36465884, -27034672, -28483686, +14668924, 9394704, -23608898, -31361314, -3503620, -17668958, 20302310, 4335233, -25997438, 16864726, +-4464619, -39917964, 26182658, -17802102, 17077326, -29699162, -7305203, -821949, -12528420, -5116380, +3382824, 37499896, -10161893, -3505230, -10821707, 10712722, -17792976, 13886166, 29255170, -1797981, +29414620, 23142358, -3568044, 47227460, -2817499, 5462662, -1440425, 13334263, 47554952, -3911642, +-13220983, -50888920, 39368208, 14066018, 33603288, 11459510, -26491896, 11774116, 7506529, 4854924, +-23526758, 13420162, 2699387, 3877819, -12670690, -3675955, 16026670, 13772886, 561030, -1651952, +-1689533, -1841467, 3888556, 10096394, -20672752, -6082748, -2903935, 3301219, -4264903, 4590247, +4399657, 6513855, -4863514, -10953777, 16982300, 26666378, 9290014, -13664975, -11787001, -5043902, +-4045859, 7228430, 3587908, -2655901, -16874926, -12048457, -13677323, -1323924, 13042205, 5758478, +10994043, 4225174, -18387292, -3280281, 8008504, 17870286, 11158325, -7488813, -5634460, -4292820, +2563559, 3117610, -389231, -1067836, -3511136, 28094992, -53687628, 2218888, -60441464, -20150376, +-10134512, 18600430, 56120728, 47718696, 17679696, 28236726, -18087182, -15220827, 2868501, -3974455, +13114683, 4257923, -12491912, 18925236, 27804544, 23124104, 17332878, 14667850, -314606, 2737505, +-9249212, 26309896, 12369506, -4863514, -15977815, 5541045, 10890426, -2711198, 34393560, 35906464, +-20533702, -15155866, 913754, 27924804, 17471926, 4591857, 3554622, -6500433, -12381854, 7058242, +42863772, -17165374, -21002390, -22879290, 22463752, 9252433, -12667469, -19771882, -31762894, -37644316, +4282083, 8410620, 6953552, -8201777, -2660195, -10263898, 7588134, -30002494, -49376016, -22189412, +-3321084, -8292508, -19206020, 24899536, 41525356, -9189619, 21482890, 45832668, 29943438, 10713259, +-31403190, 5217312, 5792837, -27772870, -15300821, -4338991, -22085796, 24358370, 34662532, -1971390, +-7852274, -4168803, -9960029, -5522254, -13993540, -13738527, -4973572, -6777996, 5084168, -3007551, +-3715684, 6890202, -20848308, -2457795, 1832877, 21366926, -21677774, -3467649, -4855461, 4116189, +-13763760, -4799626, 4345433, -7519951, -12714714, -2037425, -872952, -12504797, 14912126, -20219096, +-2175938, -7421167, 4614943, -2092186, -5859946, -11788075, 499290, 6003291, -4110821, 2827699, +-34241088, 27611272, -3508452, 23722714, 14389751, 546535, 15731928, -6903086, -1768453, 13547401, +16604880, 2558190, 83752, -545998, -15119895, -9822590, 4040491, -21075404, 565862, -7924215, +510027, -17869748, 3043521, 994822, -16260746, 13574244, 5770289, 9186935, -20421496, -5513665, +3845606, -1072131, 1473711, 11710228, 2587181, 3278134, -2349347, -4529043, -3202972, -1678795, +7554848, -3424163, -13042205, 10557030, -17932562, -5632850, -6156299, 2146947, -8781598, -10401874, +13644037, -1743220, -13698798, 8366060, -19102404, 15295452, 4752382, 718333, 15749108, 17533668, +2428267, 4995047, -13174275, 17008070, -8332237, -11639361, -1012539, 2514167, 32148368, -14453102, +-23757074, 20344724, -7751342, 20328618, -3452080, 1333051, -8899709, 12312061, -20648056, -17121350, +-6788733, 8087424, 4820564, -1250909, 9880035, -12275017, -12431783, -8250096, 2925410, 3592203, +723702, -533650, -3768834, 2130841, -17149268, 3471407, 3483219, -4132296, -1599875, 5168993, +-2762738, -7323456, 8848706, -4423817, 1080721, -375810, -2261300, 5983963, 2571612, -6213207, +-729608, -1475858, -5577015, -1196148, -2078764, -11410654, 3461744, 6973417, 5549635, -5179194, +5178657, -8324721, -2625299, 209380, -5418638, 17029008, -7153268, -88985816, -169941648, -60316372, +-133006008, -151604832, 37460704, -4872641, 51227148, 197127184, 213702544, 150970240, 215222960, 176933328, +58897424, 62124556, 46027552, -118398824, -121929288, -67728416, -118351584, -127957816, -42705932, -37557880, +-107821392, -81184008, -12982612, -48010220, -58766428, -14440217, -44924820, -79646408, -45259292, 15089831, +-31822486, -39283380, 47145856, -7773354, -44203268, 40669584, 75154952, -17148194, 18944028, 116335632, +16208670, -37056976, 77280424, 67519568, -66566624, 38422240, 85146656, -26311506, 9481677, 147371072, +112496464, 56756384, 206929376, 230348224, 117882896, 212154736, 273915840, 171976928, 162282656, 225223792, +144879440, 92214560, 102109088, 53202832, -61710092, -119579944, -162224672, -277040960, -337111968, -382238656, +-432253024, -426240608, -461988160, -412734016, -306328352, -306341216, -241457152, -21568788, -12390444, 6324340, +173333072, 136924624, 45683420, 90886880, 135238864, 50106700, 60397976, 137297760, 100008312, 20435454, +82429552, 116239528, 50026168, 62649076, 142983760, 53582940, -22580254, 65940096, 46171972, -31615254, +62284004, 138097152, 65064460, 101812200, 220379072, 183271616, 173681504, 258810976, 239046608, 164758704, +143289776, 128441000, 48124572, -1900523, 6903623, -27049704, -86038392, -85689432, -98371392, -168444864, +-188407328, -180655456, -202628496, -243159040, -212962192, -205905568, -219639792, -170103792, -114982720, -90008016, +-56703768, 2044404, 22759032, 19047106, 31616328, 34708168, 17814450, 16254304, 31880468, 27560268, +18758270, 22564684, 26389890, 19977504, 25969520, 39737036, 43741556, 42039676, 49045304, 52041580, +43067784, 49382460, 45434848, 28339268, 14612552, 6326487, -397284, -5661841, -4162897, -4232691, +-8332774, -8964670, -3345243, 4051765, 14475114, 20694764, 24975772, 25930328, 23259396, 23247584, +28804736, 27916214, 27014270, 31185220, 29529510, 21956410, 22815404, 21766358, 13243532, 10821707, +13297756, 6174553, -708133, -2150168, -9614821, -20323248, -21838298, -24748138, -34369404, -38190848, +-35816808, -40867152, -43764644, -38876972, -38421704, -40087616, -35231616, -28348394, -26904748, -23046258, +-16352014, -16281147, -15825881, -11970074, -8026757, -6051609, -550830, 4383014, 6077379, 8376797, +13872207, 18928458, 21829708, 25740812, 25997974, 23320062, 20241644, 18300318, 16487306, 14206141, +11686069, 9198746, 7044820, 5297306, 4930086, 4467303, 3384971, 2837363, 2339147, 1272921, +561567, 102542, -360240, -734439, -869194, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -4409858, -3595961, 3853123, -1881733, 3867081, -2391223, -550293, 5157719, -2161979, 2434173, 1473174, --5794985, -2631204, 4287988, -1717450, -861141, 2688113, 1765232, 1906429, 483721, 6626061, -1101122, -1742146, 1456531, -2331630, 4088809, -1217623, -2304787, -1015223, -5427765, -1854889, --4008278, 1274532, -105227, 1430761, -1628866, 2233383, 1030255, -274341, 653909, 336618, -483721, 703301, -2889439, 7094212, 1012002, -2619930, 5236102, -1293859, -4591857, -5017059, -4830228, -994285, -428423, 3197066, 323196, -863288, 2480344, -295279, 1420560, 396211, -1815697, -991064, 1980517, -934692, 2360622, 3462281, 1857037, -2085207, -2156611, -1064615, -898722, -2225867, 1514513, -1104344, 1889786, 2490007, -3156801, -1781875, 2680597, 787590, --898722, 4172561, 2391760, 1981054, -248034, 1085016, -123480, 540092, -523986, 619012, -208843, 284542, -992137, 1535988, 470299, 93416, -308701, 614180, 976031, -549756, -1053878, -78383, 4519916, 853088, 993211, 3787624, 1074, 2722473, 1269163, -354872, -246961, -3033858, 1351841, 200253, 4646081, 1622424, 1491964, 172336, 1340030, 5112085, --4908611, 2714419, 679142, -3244848, -1484985, -2024003, -698469, -1879585, 1255741, 5912560, -3694209, 4408247, 3479461, 6029597, 4367445, -5529771, -10024454, -1292785, 419296, -2461553, -5208722, -250719, 7825431, -3703336, -3736622, 3368328, 137439, 256624, 3068754, -5776194, -1428614, -4142496, 5401458, 3187403, -68183, 8256001, 320512, -813896, -1073742, -1475321, --2101850, 3899294, 2046552, -2036351, -708670, -5783174, -2582349, -780073, 5994701, 4107599, -692027, 3024194, 66572, 3222299, -41339, 1323924, -3507378, -2248952, 796180, 436476, --227096, -1767379, 1578401, 1896228, -530965, -1814087, -373662, 1912871, -347892, 1014149, --965831, -544387, -770947, 604517, -680752, 102005, -89657, 965831, -852014, 933082, -1411971, -694711, 300111, 114354, -75699, 1746978, -608275, 441308, -700080, 693637, -467615, 296890, -251256, 1537061, -122407, 76773, 607201, 1730335, 3673271, 8293045, -2466922, 408559, 304943, 2369211, 2216740, 537408, 1352378, 1912334, -76773, -129923, -2409477, 9375914, 3173444, 7324530, -4074313, -3323768, -1313723, -4330401, -5066988, -2001992, -3842922, -6273337, -828392, -700080, -9879499, 2041720, -9980430, -3292629, -1279363, 2429341, -91268, 2138357, -1899986, -54224, -6713571, 2536178, -2184528, -3738769, 777389, 1950989, --251792, 543313, 2963528, 5184026, -8584566, 2412698, 654446, -2510945, -2687576, -513785, -1264331, -1112933, -5134097, -1181116, 1488206, 2756832, -284542, 6500970, 644782, 329639, -2716030, -4095251, 6192806, 1990717, 3712462, 1661079, 3120294, -600222, -500901, 1845225, -1143535, -817654, -1764695, -1464047, -2969433, -52076, -4012573, 306016, 2472828, -181999, --1658394, -3180960, 2939905, -1680406, 1245541, 462783, -416612, -3027415, 345745, -264141, -842350, -912144, -792958, 281320, -891206, -1657857, -807454, -682900, -69256, -1087164, --91805, -612033, 1536525, -252329, -676457, -246424, 868120, -295279, -1196685, -1378685, -1590212, 35970, 237297, -869194, 4882841, 5339718, -209380, 5895380, 335007, -807991, -690416, 462246, -1136556, -90194, -4176856, -2393908, 3659312, 4318053, -5127654, -1243930, -2079301, -3422552, -9776956, 2396592, 3565897, 4207458, -2274185, -2608119, -3509525, 5287642, -6021008, 1014149, 2354179, -4780836, -3888019, 4477504, 1665374, -3588445, 6216965, -6291054, -1005559, 577673, 5827197, 2134599, -1334661, 936840, -2069637, 3199214, -7686918, -2285460, --11058467, -4829154, 5542656, -483721, 8519605, -1183264, -7182259, 4507568, 957778, -2936684, --376883, 332323, -2930242, 1883880, 5087926, 5760088, 121333, 2746095, -302258, 6556805, --3382287, 2828236, -654446, -127775, 177167, 2261837, -709207, 8208756, 789737, 733366, --1305670, 4832375, 1624571, -1644436, -3492345, 64961, 3279208, 1135482, 941135, -2156074, --141197, 656593, -359167, -578747, -619012, -1154273, 868120, 69256, 365072, 694174, -1709397, -685584, -1821066, 1975685, -557272, 193810, 13959, -237834, -257161, 783295, -695248, 957241, -369367, 893353, -46171, 517007, 867047, -205622, 90194, 759136, -1129576, 629750, 704912, 231928, 68183, 5929739, -8257612, -1213865, -5624797, -5835787, -1974611, 1032403, 11812234, 538482, 4293894, -10012106, -2460480, 2113661, -5244692, 3331284, -909996, 763430, 2818036, 3282429, 7721278, 3400004, -1319092, 2394981, -3973919, 1060320, -3066070, -289373, 570157, 3388729, 4392141, 10726144, 2029909, -1678795, -7471633, -383326, -5529234, -8817568, 886911, -713501, 2669322, -4454418, -5246840, 9283035, -6054830, 1861332, --454193, -5924908, 13437879, 3423089, 7009924, 3753265, 7672959, -1487669, -2990908, 4877472, --4627291, 3736085, -3702262, 2006287, 5268315, 2891587, -2467459, -465467, 2656974, -4782983, --3570192, 219580, -630823, 7942469, -4466766, -7538742, -1190780, 4099546, 6667937, -4232691, --7148436, -1611687, 9777493, 1245541, -77309, -3573950, 412317, -260919, 2972117, 3070902, --267362, 1440962, 1606318, -4854924, -1174674, 1600949, -303332, 2752000, 1050120, 229781, --2101850, -265214, -345208, 1025423, -393526, 2876018, -636729, -353798, -1520418, 273804, --1904281, 33823, -270046, 681289, 1637993, 10201, 1360431, -140123, -1791001, -391916, -98784, 936840, -3098819, 3641596, -12882754, 7384660, 2209761, -2842195, 3990025, -10522133, --8767639, 1195612, -4299799, 10058277, 8948027, 9500468, -6250251, 3723200, 199179, 9469329, -726386, 6708202, 2728378, -2771865, -8419210, -7641821, 2514703, -10198937, -91805, -2375654, --4915053, -6798933, -3956739, 102542, 8305393, 71941, 3277597, -11678553, -6481643, -1206349, --7282654, 550293, 7420093, -7918309, 3351685, -61203, -2653753, -704375, -1639067, 8132521, -4413616, 4069482, -1876364, -2434173, 11220065, -3342022, -2974802, -9165460, 6782290, -13025562, -1854352, -4265440, 2106145, 4664335, -3077344, -6941204, -4240744, 499827, 9530532, -4733054, --979789, -6120329, -4880694, 3082713, 3354370, 7497939, -8670465, -52076, -4561256, -3033858, -1899449, -3436511, -6796786, -3903052, -541166, 6299644, 6466074, 2229088, 407485, 945430, -2984466, 259846, 516470, 1336809, -1749125, 194884, 2712809, -784368, 374736, 3242164, --734439, -115964, 580357, 2360085, 46171, 370978, 919123, 404264, 2039573, -2332704, --2523293, -172336, -881542, 26844, 1502702, -630823, 2723546, 1773285, -11988864, 3309272, -1187022, 2097018, -16535624, 14922327, 379031, -249108, -219580, -5315022, 1818382, 269509, -5388574, -4575214, 6032819, 1780801, -3640522, -6315750, -7926362, 4092567, 782221, -612570, -621160, -4534412, 5054640, 3801046, 9266392, 5544266, 3707094, 5152350, -1128503, -4997732, --3732327, 382252, -2602750, 4053912, -4419522, -6717866, -7380365, 511638, -10122164, 4727149, -5400922, -6019397, 6283537, -7285339, 3762928, -10783052, 1529008, -1924145, 860067, -2816425, --97711, -10027138, -1626182, -3406983, -6342056, -1650341, -4940823, 1659468, -4446902, -2531346, --6411850, 2928631, -6128919, -388158, 9987946, -1625108, 357556, 3289408, -2146410, -10014790, --11440719, -1851668, -7981660, 463856, -2134599, 7566122, 605590, 2888366, -7518341, 735513, --1651952, -1311576, 5532455, 1423245, -597000, -2916820, 1543504, 2192044, 824097, 2953864, --68183, 1678259, -813359, -231928, 478889, 571231, 1080184, -209917, 3230889, -836982, --2668249, 1183264, 9127, 887985, 1096290, 746251, -351114, -1327682, 852014, -2384244, -991064, 4900021, 3397856, -10203232, -221191, 1941862, -9490804, -10819559, 6082211, -10619844, -2190970, 7256884, -5090073, -12221866, -5169530, 398895, 8250096, -3194919, 14467060, -881005, --1014149, -8176544, -5767604, -871342, 3017752, 914828, -2843268, -2384244, -551366, -2986076, --6030134, 5167920, -4976257, -3020973, 5504001, 1695975, -8559870, -9135395, -8377334, 7444789, --7783555, -8434242, 14039711, -8643085, 6260452, -1124208, 3872450, -12466679, 5859946, 813896, --1932735, -526134, -2344515, 4150012, 3081639, 11923903, -2879776, -2160369, 5719823, 11523934, -3247532, 2389613, -5315559, -3495030, -9329206, -1923072, -140123, -21475, 6932614, -2074469, -3753265, 12053289, -1743757, -365609, -1298691, -163209, -12079596, -13846975, 807454, 9255118, -212601, -18406620, 4928475, -6400575, 3202972, -11471321, -7082938, -1736241, 432718, -4166118, -1956358, 4323422, -423054, -515396, -308701, -1921998, 1997697, -2200634, 1988570, 331249, -711891, -1917166, -1255741, -2697776, 1373316, 241592, -763430, -2589865, -496069, -752156, --1602023, -1909650, 1273995, -2177549, -766115, 1918240, 649614, -1042066, -81068, 82141, --2738579, 322659, -1707250, -2245194, -162672, -576599, 5097590, -863825, 6038724, -930397, --2567854, -3707094, 5122286, 3160022, -2865817, 2324114, 5212480, -2744484, -17769354, -7734163, --3494493, -1983738, 7922604, -13931263, -10229538, 8537321, 5291937, 21496312, 6054294, 4949950, -5905043, 2719251, -3861713, 422517, -4067334, 6842957, 299037, 6907918, 201327, -205085, --9447854, 4887136, -6412386, 4963372, -992674, 5206037, 2056753, 6991133, -10931766, 1269163, --7586523, 9104257, 547608, -9154723, 12078522, 8930311, 5732708, -5487895, -18417894, 5293011, --2007360, -2291365, 9012989, -878321, 4167729, 8713415, -1933272, -11064373, -98247, 4955856, -3221226, -2973728, -1236951, -8109972, 3008088, 1106491, 1709934, -1219234, 1143535, 6975027, --4350802, 3182571, -1152662, -265751, 12562779, -3377455, 5767604, 4145717, -3969087, -4420058, -1560147, 948114, -2123325, 1059246, -2210835, 2025614, -1976222, 4785668, 425202, 4575751, -868120, -115964, 5748814, 2044941, -1717987, 1619203, -1362578, -1794760, 822486, 2294586, --2192044, 1464047, -1138703, -2235531, -116501, 2289755, -1068373, -2488934, 751082, -1162862, --3871913, 1670742, -5906, -1968169, -1180579, -645856, -2201171, -179852, 2836289, 4100620, --3893388, 530965, 4539244, -5114769, -20094542, 4049617, 4835597, 20276004, -4303557, -3308199, -9574019, 12583180, -20623360, -11783243, 11207717, -5883032, 339302, 4572530, -13148506, -28760712, --11312407, 16285979, 12945031, 10945187, -3371013, 6119792, -3386045, 5632850, -6017786, 1959042, --14522358, 3513283, -5144834, 7391102, 7191386, 215822, -6869800, 6726456, 4235912, 11640972, --1235340, -7285875, -3635153, -18435610, -9431748, 4474819, -1255741, -12361453, 8341900, 11429445, --16274168, 15678241, -1523103, -1767379, 9860708, 1994476, 9322763, -1267552, 3320547, -3595961, --1920387, 4690105, 18756122, -6832219, 11934640, -1046898, 1097901, 4455492, 10390600, -9667435, -1098438, 15211700, 4531191, -7038915, 4045859, 5979668, 1387811, 11943230, 8643622, 15024869, --1384053, 4274566, -157840, 475668, -8402567, -5869610, -6684580, -3281355, -33823, -1453310, --2716567, -2440615, 4482872, 6465000, 2969433, -3413425, 5229660, -1584306, -856846, -3204046, --2544231, 3253975, 1083406, -1258962, 197569, -3550864, -2975339, -3495567, 67646, -1979980, -3049964, 1817308, -1303523, 1292248, 3575024, -2252174, 1643362, 2026151, -1912871, -1793149, --2035278, -399432, -581431, 2157684, -752156, 304406, -934155, -13071733, -3333432, 13481902, -8565775, 10162966, -6597607, -3332358, -1059783, -1428077, 14446659, 1860258, -14860587, -6632503, --4543002, 9525701, 1862942, 2043331, 8099772, 17718350, -26203596, 17369384, -3449933, -3112778, --6772090, 5158793, 5349382, 10201084, 1591285, 9720585, -1006633, -2614561, 3023657, -1644436, -4976794, 8934606, 1063004, -692027, 11774116, -8771934, -1624571, 2854006, -1023276, 10356777, --12247099, 1096290, -10479720, 1683627, -11110544, -1591285, 345208, 6071473, 15053324, -8804683, --4836133, -9127879, -528281, -13331042, -8644159, -8775155, 5907728, 10842645, 140660, 21508122, --13653164, 19216220, -13566191, -3204583, 5942624, 4344897, 19082002, 10963441, -14284524, 7431904, --5987722, -19788524, -493921, -12559021, 15785615, 23941222, 15262166, -3017752, -8492224, -3170223, -13418552, -2037425, 6995428, 769873, 3102577, 4694936, 1503775, 1842541, 1586454, -5898064, -4068945, 25233, 1719061, -2306398, -1926293, -5603322, -3106335, -1962263, 3417183, -1751810, -2291902, 2837363, -1090922, -761283, 79994, 3237332, 2091649, 1167157, 6135898, -145492, -6410776, -5751498, -2512019, 4068945, 3976066, -2440078, 1362578, -2056753, -4159676, 435939, --1474784, -13663902, -8779987, -344671, 16441135, -3273839, 7224672, 15262703, -13073344, 5506148, --20855288, 12444131, -12837120, -6340446, 20004348, 6707665, 21573620, -9386114, 38655, -9943386, -6160594, 27683748, 7034620, 9298604, -14161044, -2826625, 583042, 10570451, 9344775, 17666274, --14589467, -5168457, -15867220, -13503914, 881542, 953483, 9219147, -9262097, 6421513, -21532282, -13302051, 10042707, 4720706, -3769908, -2647847, 1246077, 6248641, 1960116, 1676111, -255551, -14432164, 12320651, 5270462, 970126, -11133629, -10995116, 29908542, 964757, 3629247, 16590385, -7289633, -4886599, -3656091, 10500658, 21501680, -15816754, -6648073, -17805324, -16532403, 21007222, -9343164, 73551, -4276714, 6869264, 15963857, 10124849, 16474958, 4495220, -7534983, 11887396, --8717710, -22146998, 6386080, 649077, 246961, -85362, 9096204, 15791521, -3372086, 8294656, -9252970, 8393440, 882616, 1757179, 8092792, -30602, -2675765, -1934346, -3583077, 7894687, --4801237, -1472100, 1881733, 4397510, 516470, -879931, 8433705, 1658394, -1963874, 6323803, -8058433, 3644817, -3571265, -168041, -1685238, 2391223, -73551, -104690, -380105, -2024540, -2703682, 969589, 569083, 2653753, 3499862, -776852, -4135517, -1670205, -668941, 4711043, -1544578, -3517041, 1048509, 1822677, 5025649, 2179159, -437013, 4702989, 76236, 2425046, --1969779, -64961, -185220, 813359, -685047, 6516539, -14008036, -10451266, -4101157, -13019656, -14673756, -1640141, -3744138, -12393128, -2069101, -11535745, -28617368, 4987531, -3531000, -9008157, -6460168, -15155329, -930934, -8272644, -22950158, -5233418, -9965398, -10844256, 18315888, -4883915, --6637335, -3310883, -443992, -4628364, -6499896, -1016297, 4810364, 15538118, 11662984, -420370, --934155, -26011932, 1557463, 3578782, 10637560, -5988258, -5448703, 39522288, -6827388, -19288162, --18808198, 16405701, -11019275, 4752918, -22289270, 5559299, -6292664, -11873437, -10345502, -25267292, -4003447, 7292855, 17923972, 5323612, -9808632, 14208289, 1606318, 13368623, 14747844, 42739756, -11376295, 3002719, -16688632, -18570902, -5089000, 2025077, -2464238, -16801912, 7472170, 19580220, -4417374, 13940927, 21428666, 19338628, -8295730, -15397995, -10667088, 1408749, 3308199, -1843078, --16510391, 3212099, -13453985, 4128537, -6045704, 923418, -7494181, 4886599, -1360968, 3128347, -255551, -3086471, -7669738, -1672353, -340376, 4460324, 5945309, 4877472, 6871948, 463856, -5850819, 10579041, 74625, 2054605, 5735929, 2105071, -5518496, -2983392, -9272298, -2622078, -5251135, 3144990, 462783, -1138166, 3239479, 2001992, -2143189, -4180077, -8163659, 1103270, -1009317, -1068373, -2845953, -537408, -3060164, 1596117, -5761162, -17280800, -7495255, -2703682, -5287105, -6337761, 10224707, -5359046, -7093139, 19887310, 10326175, 22620520, 259309, -6611566, --8969502, 23985782, -20657182, -7727183, 27999428, -16940962, 5575405, 5805185, 7245073, 1618666, -15723338, -4942434, 14148159, -5405217, 3074123, 3359201, -7317014, 10502269, -15982647, -11138461, --10380936, -4789426, -14209899, -26171384, -4786741, -7858180, 4131759, -6767258, -34764540, 9626632, -21794274, -1290638, -4669703, 34121904, -42335492, -9186398, 23572928, -5814849, 18287434, -13483513, --8376260, 6326487, -40404904, 13032541, -13776644, 20163260, 14810658, -21497386, 42349988, 6225555, -2222109, -2199560, 16672526, -30687542, 12526809, -1468879, -4893042, 8191040, -19842748, 28026272, -25438554, -47084652, 6737193, -9392020, -44196824, -7630010, -19746112, 10847477, 2761664, 7633768, --17860622, 27698780, -2741263, -7463580, 12779138, -553514, 9069897, -1959042, 14334990, 325881, -7132330, 2210298, -660888, -1547262, 7999914, -5830418, -6556268, 126165, -7697119, 11462731, --2539936, -5968931, 584116, 5265630, 2503429, 5431523, 2078227, 13303661, 3119220, -7259569, -13774497, -7508140, 7819525, 11876121, -3358128, 2658048, 8303783, -5761162, 435402, -7509214, -8118025, 1165010, 25794500, -11758010, -33597380, -33707976, 2518462, 4023311, -14899778, 8623221, --18816252, 5856725, -8607114, 17134772, 21986474, 585726, 21267604, 19339700, -10965588, -409096, --13988172, -3610994, -3390340, 7385733, -1497870, -2269890, -2459406, -22560926, -34053720, -13768591, -17564806, 13553843, -14688788, -16874390, 9641665, 9774809, -22193706, 10997801, -14810658, -2864743, -16935592, 23570780, 37581, -14173929, 8943733, 1681480, 14642080, 2435783, 12197707, 12599287, --3718368, -48724256, 5383742, 1153736, 19543174, -7280507, 19934016, 19759534, -13418552, -65978212, --8951786, 2579665, -8031052, 39494372, 41441064, 28875066, 41178000, -10798622, 19301584, -16407312, -27484032, 19230716, -32639604, 40980968, -42603928, -36303212, -34227668, 10732586, 25551834, 21257404, -7056095, -26759794, 24490440, 3317325, -8945880, -11521787, 1341104, 23117662, -18083422, -7301445, -35374424, 6451041, 16115791, 3003256, 1611687, 8633421, -13521631, 7115150, -5595269, 164283, -3519189, -3533148, -7067369, -4689031, -6203007, -13587129, 2898566, 12389907, -2615098, 12670154, -9772124, -8296266, -6608344, -6181532, 7768522, 4842039, -16576426, -9645423, 718870, 687195, --2593087, 2063732, 10637023, -384936, 8424041, 766115, -6505265, 4085588, 14106820, -26162256, --49355616, 10287520, 18090402, -2727304, 24896314, 9489730, -31164820, -7918846, 6529961, 7573638, -8476655, -6358699, 14327474, 1151051, -9356586, -4330401, 5049271, 20422032, 26665304, 20138564, -31994822, -30923764, -8646843, -8083129, -31637802, -7646653, 5343476, 1526324, 3425773, -12657269, --14315126, 15959562, 35963372, -17148730, 18521510, -12265890, 4751308, -11320460, -2014877, -28193240, --10325101, -1699196, -39023000, -22859964, -38194072, -32266478, 21225728, 50140520, 39994736, 1073205, --2619930, 29528, -9134322, -17384954, -61022896, -20473036, -8842264, 4860829, 2502892, -21609592, --15130096, 7787313, 26702886, 15877420, 8533026, 17415018, 29959008, 11655467, -30211336, 22908818, --17942226, -9460739, 17721036, 40022116, 8522289, 51348480, -12399034, -53645752, -6317897, -17404818, --32945620, 49359376, 13907104, 15967615, -238908, -4540854, 14175540, 11681774, 538482, -2145336, --8741332, -1875827, -2705830, 13379360, 16175384, 19366008, -2379949, -871878, -952409, -863288, -12621298, -5647882, -4460861, -7675107, -6071473, 7102802, -1671279, -401579, 1979980, 4462471, -7331509, 9126269, -1491427, -5708549, -9866077, 4649839, 1613297, 4369056, 11875048, 10394895, --5574331, 2471217, 5231270, -9597641, -3101503, -2371896, -9245991, -4376035, -620086, 7954817, --13295071, -20837570, -34230352, 21442624, -3180960, -20610474, 10181220, 22728966, 19699942, -40018356, --34553548, 8820252, -15973520, 4264903, 19795504, -10531797, -7730405, 32627256, 8960912, -4376035, --10186589, -9072045, 12333535, -7161321, -1290638, -812823, -13079786, -4967130, -21860846, -29147796, -10597295, 16129750, -18362058, 13660680, 9383967, -6252936, -12699681, 2113124, 23284628, 13466870, -4301947, -23033910, -25784300, -12493523, 7133404, 29148332, -21614960, -11380053, -9757092, 17459578, -46875808, 12505334, -45589468, -10028212, -5251135, 23609972, 657667, 12291660, -5843840, -10714870, --10001905, -25759066, 24254218, 25691958, 10426570, 27155468, -8338142, 17607756, -7975755, -19379966, --21468930, -22956064, 4202626, -43091408, 45439680, -2005750, -17088602, -24861956, -20327544, -1258425, --13269301, -3922379, -23667418, -14567455, -42147588, -11638288, -27728846, 10389526, -9771051, 8351564, -9594957, 10279467, -6867653, 23480586, -5187247, 17042430, 744103, 4193499, -1202591, 7481296, --3494493, -9243306, 2037425, 2805151, 8815420, -13860933, -4770098, 3730716, -13673028, 160524, -5170067, -17110612, -7430294, 4228932, -2280628, -13085692, -20287278, -12146168, 7562364, -3775276, -9475235, 2359548, 474594, 13939853, 1072131, 12001212, 4721243, 7512972, 27880780, 16729971, --7697655, 4320200, -9594957, 470836, -4495220, 35093104, 26348550, 10092099, 5232344, 16529719, -14982993, -23772108, -34270616, 11697343, 26826366, 38359428, 244276, -8560407, -23914914, -14054744, -16135655, -447213, -20411296, -41206988, -41181220, 8695698, -12362526, 23124104, -47449724, -15676631, -9261560, 6840809, 9066676, -15022185, 6925635, -1272384, -8887361, -1767379, -22248468, 20557860, -25393458, 18847928, -29963302, -16036871, -678605, 10173167, 15130096, 16151225, 12999255, -3395172, --2087354, -4067871, 21517250, 59540056, 37665788, -31010200, -30431990, -19396610, -39217884, 46275052, -24761560, -14352170, -40678172, -39060580, 44493712, 27307938, 6037651, 34160024, -35403952, -3940633, -2299418, -9161165, 3565360, -13244605, -35804996, 8900246, -27338004, 36685464, 34827352, -13277355, --6046777, 370978, 4109210, 39037496, 40109624, -63418952, -35214972, -20404852, 8138426, 17770428, -17388176, -24598888, -26175142, -31156230, -3681861, 32219234, 894427, 6375879, -7181186, -34462816, -8118025, -14479945, -17818746, 7814156, 60477436, 20329690, -11082626, -15495705, -14236206, -11976516, -16041166, 18769544, 21984864, -3970161, 14267881, -21384642, 5383205, 7721815, 9944997, -7736310, -4385699, 17765058, -4385699, -5110474, -2741800, 17532056, 11678016, 27328876, 7149510, -9809168, --7109782, 10080825, 34120292, 27504970, 6009196, -20379082, -24721294, -8115341, -5741298, 5845988, -2683281, -10107669, -12418898, 23341536, -38104948, 33253784, 49027052, 53202832, -59936804, 11034308, --1861868, -5133023, 25401510, -10813117, -17797270, 17588428, 8965207, 36461588, -3714073, -28852516, -873489, -13163001, 21538188, -33155536, -11742441, -15579994, -22094922, 30280056, -22143778, -3144990, -20852604, 12106976, -7350300, -11582990, -31032750, 4011500, 40881648, 24897388, -1756642, 12156905, --9220758, 33390686, -22506702, 15422691, -12422119, 20740398, 34473020, -7662759, -22389664, 11050414, --30534534, 50571092, 5932961, -26847304, -9189083, -41884520, 5342403, 59974924, -10921565, -35302484, --24649892, 36764384, 10985453, -19320374, -978716, 9465034, 20638392, 50527604, -41229540, 18353468, -41436232, -6295349, -48959944, -47436304, -27755690, 83027624, -60772176, 20567524, -64005212, -30798674, -133728640, 12826920, -58290224, -56055764, -64561948, 81420768, 10511932, -15443092, -64689188, -15585363, -20245402, 65876744, -23607288, 7126962, -28483686, 9749039, 40065604, 24366960, -35791036, 16853452, -6603512, 15461882, 13814762, -36435280, 1279900, -8696235, -13726715, 7145215, -13307956, -26882738, -10330470, -7979513, 34929360, 5116380, -32044214, -36728412, -11617887, 936303, 28182502, 21070572, -5007932, -17192754, 7307350, -799401, -13540421, 881542, 17980880, 15646029, 3974455, -27116276, -6837588, 10430865, 17226576, 15097347, 11129871, -5366562, -17428978, -6731288, -4053912, -5556614, -8462696, -14344117, -3867618, -5180268, -6699612, 21807696, -56304872, 9904731, -50585588, 22379464, -23964306, 47298328, 20949776, 10868952, 12394739, -14703821, -36109400, -25110526, -23703924, 10161893, -5915781, -6132140, 21636972, 33363306, -14892262, -20917028, 23177254, 4140349, -30816928, -7071664, -13991393, -25420838, -4473209, 5642514, 12974559, 6925098, 18340584, 31426276, 5566278, -20007032, --2294586, 6070400, -15889232, -7092065, 14701136, -11135776, -20124070, 28033252, -6742562, -6921340, --11132555, -10992969, 18175764, 4645007, 4166118, 24195698, -11540577, -18660560, -1068910, 1816771, --7907035, 6200859, -1300838, -6634651, -1188632, -23536958, 5267778, 4630512, -3992709, 12709882, -8585103, 4453881, 5689758, -24310588, 28819768, -10770704, -10408853, 8842264, -26331908, 8594766, --19716584, 2313914, -15595563, 5087926, 6896644, 10682657, 965831, 9477382, 14283451, -5492190, --3207804, 7931731, -470836, -5003100, 4361540, 1024887, -3275986, -5034239, -4574677, -3016678, -10314901, -9833864, 10005663, 703301, 2720862, 5015985, 2988760, 7298223, -394063, -181999, --4440460, -966368, -6124624, 12402792, 919660, -5538897, -9051644, -2946348, 4810364, -8841190, -11753178, -5687611, -14908368, 864362, 6334003, -848793, -430034, 1547262, -7047505, -4254702, --26296474, 42213088, -2301029, 23848342, -21853868, 2581275, -4047470, 7456063, 6730214, 12729209, --6668474, 9337259, -5986648, 5093295, -1056025, 4005057, 10096931, -1380295, 15720117, -6478422, -11849815, 510564, -619549, -4595078, 7547332, -6219113, 6806987, -4193499, 371515, -3499325, -3675955, -2879239, 8891656, -2930242, -6422050, 14314052, -10095858, 7427072, 5963025, 2100776, -6883759, -8967892, -6255620, 6505265, 6084358, -4013647, -942208, 6944962, -744640, -9967008, -4221953, -5123896, 4954782, 6739878, 3121904, 2229088, 2110977, -10719165, 5069672, 2866354, --3312494, 3758633, -5102958, 2298881, -2596308, -602906, -1449552, 3579318, 7020661, -10007274, -8710194, -1866163, -3598109, 4952634, -6995965, 3142306, 4734665, -1316944, -2611877, 3266323, --1466195, 1868848, -1043677, -3641059, -661425, 3662533, -1122060, 1341104, -898185, -2703682, -1552094, 1405528, 2547453, -3866008, 2884608, -380641, -1669669, 3425237, -4087198, 6073621, -3031710, -2446521, 6199249, -609885, -2621004, 126702, -2618856, 3655017, -4262218, 4210679, -1627793, 2208687, 969052, -2618320, 1970316, 851477, 370441, 270583, 51540, -1138703, -1015760, -2731599, 3048890, 1146219, -3105261, 10505490, -35705136, -111235896, -16381005, 53992572, -27906550, 131262256, 24379844, 28213104, 17726940, -35378184, -49851148, -35498980, -63896764, -54886996, --31175556, -12775917, 36496484, 99694248, 79027400, 68106904, 38662220, -30687004, -49984292, -36739688, --68867120, -65174520, -20052128, -9148280, -15282031, 25267830, 39439076, 26139170, 48110612, 37243808, -11314018, 34258808, 6896644, -5091684, 3068217, -20649666, -54427972, -46187540, -39347268, -55077048, --23168128, 16093779, 10959146, 35275640, 39829916, 34910568, 35717484, 36592048, 23077396, 22679038, -2370822, -20318954, -38086696, -25915296, -35862440, -47240884, -23390928, -21665962, -17772574, 6702834, -17804250, 17169132, 33282776, 41767484, 20075750, 29451128, 24999930, -6954089, 2790655, 11319386, --13993540, -12533788, -22375706, -39969504, -40281960, -31855772, -33148020, -6450504, 13770202, 9309878, -26182120, 39493836, 30984430, 28775208, 29407642, 19753628, 6371047, 1910724, -9266929, -17143898, --18609556, -27480812, -34964256, -37014028, -32044214, -28596430, -16495359, 3760244, 17976586, 41459320, -54621784, 48119204, 39703216, 33872796, 19422378, 4161823, -17011292, -34704408, -47583404, -49632104, --54958940, -40343700, -17002164, -4183298, 11357504, 32729798, 41998336, 45558328, 46680924, 39243116, -16462610, -1105954, -12227772, -26508538, -34762928, -32407138, -29035052, -20714090, -8677981, 1166621, -11362336, 15033459, 11312407, 12700218, 9842454, 6940667, 5160940, 5612449, 1630477, 1927904, --704912, -2715493, -3616363, -2928631, -4643397, -5155572, -5890011, -4970351, -4926865, -3838090, --2816962, 416612, 1785096, 3362423, 4625143, 6303938, 5869073, 5486821, 4158602, 3415036, -1660005, -222801, -2260764, -3211025, -4683125, -5371394, -5515812, -4553202, -4558571, -2728378, --954020, 1069447, 2522220, 4196720, 4169876, 4653060, 4553202, 4736275, 4203699, 2286533, --846645, -2369211, -4050154, -4757213, -4413079, -3476239, -3455301, -2323577, -1741609, -461709, -772557, 2214056, 3180960, 4277251, 4177393, 3694209, 2515240, 1178432, -209917, -959925, --2129767, -2925410, -3491809, -3375844, -2894808, -1573032, -515396, 761820, 1632088, 2141578, -2193118, 1863479, 1089311, 905701, 479426, 188442, -266288, -522375, -768262, -783832, --811749, -644245, -504659, -276489, -158377, -15569, 23622, 133144, 138513, 161061, -100395, 93416, 76236, 71404, 74088, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +3595961, 3853123, -1881733, 3867081, -2391223, -550293, 5157719, -2161979, 2434173, 1473174, +-5794985, -2631204, 4287988, -1717450, -861141, 2688113, 1765232, 1906429, 483721, 6626061, +1101122, -1742146, 1456531, -2331630, 4088809, -1217623, -2304787, -1015223, -5427765, -1854889, +-4008278, 1274532, -105227, 1430761, -1628866, 2233383, 1030255, -274341, 653909, 336618, +483721, 703301, -2889439, 7094212, 1012002, -2619930, 5236102, -1293859, -4591857, -5017059, +4830228, -994285, -428423, 3197066, 323196, -863288, 2480344, -295279, 1420560, 396211, +1815697, -991064, 1980517, -934692, 2360622, 3462281, 1857037, -2085207, -2156611, -1064615, +898722, -2225867, 1514513, -1104344, 1889786, 2490007, -3156801, -1781875, 2680597, 787590, +-898722, 4172561, 2391760, 1981054, -248034, 1085016, -123480, 540092, -523986, 619012, +208843, 284542, -992137, 1535988, 470299, 93416, -308701, 614180, 976031, -549756, +1053878, -78383, 4519916, 853088, 993211, 3787624, 1074, 2722473, 1269163, -354872, +246961, -3033858, 1351841, 200253, 4646081, 1622424, 1491964, 172336, 1340030, 5112085, +-4908611, 2714419, 679142, -3244848, -1484985, -2024003, -698469, -1879585, 1255741, 5912560, +3694209, 4408247, 3479461, 6029597, 4367445, -5529771, -10024454, -1292785, 419296, -2461553, +5208722, -250719, 7825431, -3703336, -3736622, 3368328, 137439, 256624, 3068754, -5776194, +1428614, -4142496, 5401458, 3187403, -68183, 8256001, 320512, -813896, -1073742, -1475321, +-2101850, 3899294, 2046552, -2036351, -708670, -5783174, -2582349, -780073, 5994701, 4107599, +692027, 3024194, 66572, 3222299, -41339, 1323924, -3507378, -2248952, 796180, 436476, +-227096, -1767379, 1578401, 1896228, -530965, -1814087, -373662, 1912871, -347892, 1014149, +-965831, -544387, -770947, 604517, -680752, 102005, -89657, 965831, -852014, 933082, +1411971, -694711, 300111, 114354, -75699, 1746978, -608275, 441308, -700080, 693637, +467615, 296890, -251256, 1537061, -122407, 76773, 607201, 1730335, 3673271, 8293045, +2466922, 408559, 304943, 2369211, 2216740, 537408, 1352378, 1912334, -76773, -129923, +2409477, 9375914, 3173444, 7324530, -4074313, -3323768, -1313723, -4330401, -5066988, -2001992, +3842922, -6273337, -828392, -700080, -9879499, 2041720, -9980430, -3292629, -1279363, 2429341, +91268, 2138357, -1899986, -54224, -6713571, 2536178, -2184528, -3738769, 777389, 1950989, +-251792, 543313, 2963528, 5184026, -8584566, 2412698, 654446, -2510945, -2687576, -513785, +1264331, -1112933, -5134097, -1181116, 1488206, 2756832, -284542, 6500970, 644782, 329639, +2716030, -4095251, 6192806, 1990717, 3712462, 1661079, 3120294, -600222, -500901, 1845225, +1143535, -817654, -1764695, -1464047, -2969433, -52076, -4012573, 306016, 2472828, -181999, +-1658394, -3180960, 2939905, -1680406, 1245541, 462783, -416612, -3027415, 345745, -264141, +842350, -912144, -792958, 281320, -891206, -1657857, -807454, -682900, -69256, -1087164, +-91805, -612033, 1536525, -252329, -676457, -246424, 868120, -295279, -1196685, -1378685, +1590212, 35970, 237297, -869194, 4882841, 5339718, -209380, 5895380, 335007, -807991, +690416, 462246, -1136556, -90194, -4176856, -2393908, 3659312, 4318053, -5127654, -1243930, +2079301, -3422552, -9776956, 2396592, 3565897, 4207458, -2274185, -2608119, -3509525, 5287642, +6021008, 1014149, 2354179, -4780836, -3888019, 4477504, 1665374, -3588445, 6216965, -6291054, +1005559, 577673, 5827197, 2134599, -1334661, 936840, -2069637, 3199214, -7686918, -2285460, +-11058467, -4829154, 5542656, -483721, 8519605, -1183264, -7182259, 4507568, 957778, -2936684, +-376883, 332323, -2930242, 1883880, 5087926, 5760088, 121333, 2746095, -302258, 6556805, +-3382287, 2828236, -654446, -127775, 177167, 2261837, -709207, 8208756, 789737, 733366, +-1305670, 4832375, 1624571, -1644436, -3492345, 64961, 3279208, 1135482, 941135, -2156074, +-141197, 656593, -359167, -578747, -619012, -1154273, 868120, 69256, 365072, 694174, +1709397, -685584, -1821066, 1975685, -557272, 193810, 13959, -237834, -257161, 783295, +695248, 957241, -369367, 893353, -46171, 517007, 867047, -205622, 90194, 759136, +1129576, 629750, 704912, 231928, 68183, 5929739, -8257612, -1213865, -5624797, -5835787, +1974611, 1032403, 11812234, 538482, 4293894, -10012106, -2460480, 2113661, -5244692, 3331284, +909996, 763430, 2818036, 3282429, 7721278, 3400004, -1319092, 2394981, -3973919, 1060320, +3066070, -289373, 570157, 3388729, 4392141, 10726144, 2029909, -1678795, -7471633, -383326, +5529234, -8817568, 886911, -713501, 2669322, -4454418, -5246840, 9283035, -6054830, 1861332, +-454193, -5924908, 13437879, 3423089, 7009924, 3753265, 7672959, -1487669, -2990908, 4877472, +-4627291, 3736085, -3702262, 2006287, 5268315, 2891587, -2467459, -465467, 2656974, -4782983, +-3570192, 219580, -630823, 7942469, -4466766, -7538742, -1190780, 4099546, 6667937, -4232691, +-7148436, -1611687, 9777493, 1245541, -77309, -3573950, 412317, -260919, 2972117, 3070902, +-267362, 1440962, 1606318, -4854924, -1174674, 1600949, -303332, 2752000, 1050120, 229781, +-2101850, -265214, -345208, 1025423, -393526, 2876018, -636729, -353798, -1520418, 273804, +-1904281, 33823, -270046, 681289, 1637993, 10201, 1360431, -140123, -1791001, -391916, +98784, 936840, -3098819, 3641596, -12882754, 7384660, 2209761, -2842195, 3990025, -10522133, +-8767639, 1195612, -4299799, 10058277, 8948027, 9500468, -6250251, 3723200, 199179, 9469329, +726386, 6708202, 2728378, -2771865, -8419210, -7641821, 2514703, -10198937, -91805, -2375654, +-4915053, -6798933, -3956739, 102542, 8305393, 71941, 3277597, -11678553, -6481643, -1206349, +-7282654, 550293, 7420093, -7918309, 3351685, -61203, -2653753, -704375, -1639067, 8132521, +4413616, 4069482, -1876364, -2434173, 11220065, -3342022, -2974802, -9165460, 6782290, -13025562, +1854352, -4265440, 2106145, 4664335, -3077344, -6941204, -4240744, 499827, 9530532, -4733054, +-979789, -6120329, -4880694, 3082713, 3354370, 7497939, -8670465, -52076, -4561256, -3033858, +1899449, -3436511, -6796786, -3903052, -541166, 6299644, 6466074, 2229088, 407485, 945430, +2984466, 259846, 516470, 1336809, -1749125, 194884, 2712809, -784368, 374736, 3242164, +-734439, -115964, 580357, 2360085, 46171, 370978, 919123, 404264, 2039573, -2332704, +-2523293, -172336, -881542, 26844, 1502702, -630823, 2723546, 1773285, -11988864, 3309272, +1187022, 2097018, -16535624, 14922327, 379031, -249108, -219580, -5315022, 1818382, 269509, +5388574, -4575214, 6032819, 1780801, -3640522, -6315750, -7926362, 4092567, 782221, -612570, +621160, -4534412, 5054640, 3801046, 9266392, 5544266, 3707094, 5152350, -1128503, -4997732, +-3732327, 382252, -2602750, 4053912, -4419522, -6717866, -7380365, 511638, -10122164, 4727149, +5400922, -6019397, 6283537, -7285339, 3762928, -10783052, 1529008, -1924145, 860067, -2816425, +-97711, -10027138, -1626182, -3406983, -6342056, -1650341, -4940823, 1659468, -4446902, -2531346, +-6411850, 2928631, -6128919, -388158, 9987946, -1625108, 357556, 3289408, -2146410, -10014790, +-11440719, -1851668, -7981660, 463856, -2134599, 7566122, 605590, 2888366, -7518341, 735513, +-1651952, -1311576, 5532455, 1423245, -597000, -2916820, 1543504, 2192044, 824097, 2953864, +-68183, 1678259, -813359, -231928, 478889, 571231, 1080184, -209917, 3230889, -836982, +-2668249, 1183264, 9127, 887985, 1096290, 746251, -351114, -1327682, 852014, -2384244, +991064, 4900021, 3397856, -10203232, -221191, 1941862, -9490804, -10819559, 6082211, -10619844, +2190970, 7256884, -5090073, -12221866, -5169530, 398895, 8250096, -3194919, 14467060, -881005, +-1014149, -8176544, -5767604, -871342, 3017752, 914828, -2843268, -2384244, -551366, -2986076, +-6030134, 5167920, -4976257, -3020973, 5504001, 1695975, -8559870, -9135395, -8377334, 7444789, +-7783555, -8434242, 14039711, -8643085, 6260452, -1124208, 3872450, -12466679, 5859946, 813896, +-1932735, -526134, -2344515, 4150012, 3081639, 11923903, -2879776, -2160369, 5719823, 11523934, +3247532, 2389613, -5315559, -3495030, -9329206, -1923072, -140123, -21475, 6932614, -2074469, +3753265, 12053289, -1743757, -365609, -1298691, -163209, -12079596, -13846975, 807454, 9255118, +212601, -18406620, 4928475, -6400575, 3202972, -11471321, -7082938, -1736241, 432718, -4166118, +1956358, 4323422, -423054, -515396, -308701, -1921998, 1997697, -2200634, 1988570, 331249, +711891, -1917166, -1255741, -2697776, 1373316, 241592, -763430, -2589865, -496069, -752156, +-1602023, -1909650, 1273995, -2177549, -766115, 1918240, 649614, -1042066, -81068, 82141, +-2738579, 322659, -1707250, -2245194, -162672, -576599, 5097590, -863825, 6038724, -930397, +-2567854, -3707094, 5122286, 3160022, -2865817, 2324114, 5212480, -2744484, -17769354, -7734163, +-3494493, -1983738, 7922604, -13931263, -10229538, 8537321, 5291937, 21496312, 6054294, 4949950, +5905043, 2719251, -3861713, 422517, -4067334, 6842957, 299037, 6907918, 201327, -205085, +-9447854, 4887136, -6412386, 4963372, -992674, 5206037, 2056753, 6991133, -10931766, 1269163, +-7586523, 9104257, 547608, -9154723, 12078522, 8930311, 5732708, -5487895, -18417894, 5293011, +-2007360, -2291365, 9012989, -878321, 4167729, 8713415, -1933272, -11064373, -98247, 4955856, +3221226, -2973728, -1236951, -8109972, 3008088, 1106491, 1709934, -1219234, 1143535, 6975027, +-4350802, 3182571, -1152662, -265751, 12562779, -3377455, 5767604, 4145717, -3969087, -4420058, +1560147, 948114, -2123325, 1059246, -2210835, 2025614, -1976222, 4785668, 425202, 4575751, +868120, -115964, 5748814, 2044941, -1717987, 1619203, -1362578, -1794760, 822486, 2294586, +-2192044, 1464047, -1138703, -2235531, -116501, 2289755, -1068373, -2488934, 751082, -1162862, +-3871913, 1670742, -5906, -1968169, -1180579, -645856, -2201171, -179852, 2836289, 4100620, +-3893388, 530965, 4539244, -5114769, -20094542, 4049617, 4835597, 20276004, -4303557, -3308199, +9574019, 12583180, -20623360, -11783243, 11207717, -5883032, 339302, 4572530, -13148506, -28760712, +-11312407, 16285979, 12945031, 10945187, -3371013, 6119792, -3386045, 5632850, -6017786, 1959042, +-14522358, 3513283, -5144834, 7391102, 7191386, 215822, -6869800, 6726456, 4235912, 11640972, +-1235340, -7285875, -3635153, -18435610, -9431748, 4474819, -1255741, -12361453, 8341900, 11429445, +-16274168, 15678241, -1523103, -1767379, 9860708, 1994476, 9322763, -1267552, 3320547, -3595961, +-1920387, 4690105, 18756122, -6832219, 11934640, -1046898, 1097901, 4455492, 10390600, -9667435, +1098438, 15211700, 4531191, -7038915, 4045859, 5979668, 1387811, 11943230, 8643622, 15024869, +-1384053, 4274566, -157840, 475668, -8402567, -5869610, -6684580, -3281355, -33823, -1453310, +-2716567, -2440615, 4482872, 6465000, 2969433, -3413425, 5229660, -1584306, -856846, -3204046, +-2544231, 3253975, 1083406, -1258962, 197569, -3550864, -2975339, -3495567, 67646, -1979980, +3049964, 1817308, -1303523, 1292248, 3575024, -2252174, 1643362, 2026151, -1912871, -1793149, +-2035278, -399432, -581431, 2157684, -752156, 304406, -934155, -13071733, -3333432, 13481902, +8565775, 10162966, -6597607, -3332358, -1059783, -1428077, 14446659, 1860258, -14860587, -6632503, +-4543002, 9525701, 1862942, 2043331, 8099772, 17718350, -26203596, 17369384, -3449933, -3112778, +-6772090, 5158793, 5349382, 10201084, 1591285, 9720585, -1006633, -2614561, 3023657, -1644436, +4976794, 8934606, 1063004, -692027, 11774116, -8771934, -1624571, 2854006, -1023276, 10356777, +-12247099, 1096290, -10479720, 1683627, -11110544, -1591285, 345208, 6071473, 15053324, -8804683, +-4836133, -9127879, -528281, -13331042, -8644159, -8775155, 5907728, 10842645, 140660, 21508122, +-13653164, 19216220, -13566191, -3204583, 5942624, 4344897, 19082002, 10963441, -14284524, 7431904, +-5987722, -19788524, -493921, -12559021, 15785615, 23941222, 15262166, -3017752, -8492224, -3170223, +13418552, -2037425, 6995428, 769873, 3102577, 4694936, 1503775, 1842541, 1586454, -5898064, +4068945, 25233, 1719061, -2306398, -1926293, -5603322, -3106335, -1962263, 3417183, -1751810, +2291902, 2837363, -1090922, -761283, 79994, 3237332, 2091649, 1167157, 6135898, -145492, +6410776, -5751498, -2512019, 4068945, 3976066, -2440078, 1362578, -2056753, -4159676, 435939, +-1474784, -13663902, -8779987, -344671, 16441135, -3273839, 7224672, 15262703, -13073344, 5506148, +-20855288, 12444131, -12837120, -6340446, 20004348, 6707665, 21573620, -9386114, 38655, -9943386, +6160594, 27683748, 7034620, 9298604, -14161044, -2826625, 583042, 10570451, 9344775, 17666274, +-14589467, -5168457, -15867220, -13503914, 881542, 953483, 9219147, -9262097, 6421513, -21532282, +13302051, 10042707, 4720706, -3769908, -2647847, 1246077, 6248641, 1960116, 1676111, -255551, +14432164, 12320651, 5270462, 970126, -11133629, -10995116, 29908542, 964757, 3629247, 16590385, +7289633, -4886599, -3656091, 10500658, 21501680, -15816754, -6648073, -17805324, -16532403, 21007222, +9343164, 73551, -4276714, 6869264, 15963857, 10124849, 16474958, 4495220, -7534983, 11887396, +-8717710, -22146998, 6386080, 649077, 246961, -85362, 9096204, 15791521, -3372086, 8294656, +9252970, 8393440, 882616, 1757179, 8092792, -30602, -2675765, -1934346, -3583077, 7894687, +-4801237, -1472100, 1881733, 4397510, 516470, -879931, 8433705, 1658394, -1963874, 6323803, +8058433, 3644817, -3571265, -168041, -1685238, 2391223, -73551, -104690, -380105, -2024540, +2703682, 969589, 569083, 2653753, 3499862, -776852, -4135517, -1670205, -668941, 4711043, +1544578, -3517041, 1048509, 1822677, 5025649, 2179159, -437013, 4702989, 76236, 2425046, +-1969779, -64961, -185220, 813359, -685047, 6516539, -14008036, -10451266, -4101157, -13019656, +14673756, -1640141, -3744138, -12393128, -2069101, -11535745, -28617368, 4987531, -3531000, -9008157, +6460168, -15155329, -930934, -8272644, -22950158, -5233418, -9965398, -10844256, 18315888, -4883915, +-6637335, -3310883, -443992, -4628364, -6499896, -1016297, 4810364, 15538118, 11662984, -420370, +-934155, -26011932, 1557463, 3578782, 10637560, -5988258, -5448703, 39522288, -6827388, -19288162, +-18808198, 16405701, -11019275, 4752918, -22289270, 5559299, -6292664, -11873437, -10345502, -25267292, +4003447, 7292855, 17923972, 5323612, -9808632, 14208289, 1606318, 13368623, 14747844, 42739756, +11376295, 3002719, -16688632, -18570902, -5089000, 2025077, -2464238, -16801912, 7472170, 19580220, +4417374, 13940927, 21428666, 19338628, -8295730, -15397995, -10667088, 1408749, 3308199, -1843078, +-16510391, 3212099, -13453985, 4128537, -6045704, 923418, -7494181, 4886599, -1360968, 3128347, +255551, -3086471, -7669738, -1672353, -340376, 4460324, 5945309, 4877472, 6871948, 463856, +5850819, 10579041, 74625, 2054605, 5735929, 2105071, -5518496, -2983392, -9272298, -2622078, +5251135, 3144990, 462783, -1138166, 3239479, 2001992, -2143189, -4180077, -8163659, 1103270, +1009317, -1068373, -2845953, -537408, -3060164, 1596117, -5761162, -17280800, -7495255, -2703682, +5287105, -6337761, 10224707, -5359046, -7093139, 19887310, 10326175, 22620520, 259309, -6611566, +-8969502, 23985782, -20657182, -7727183, 27999428, -16940962, 5575405, 5805185, 7245073, 1618666, +15723338, -4942434, 14148159, -5405217, 3074123, 3359201, -7317014, 10502269, -15982647, -11138461, +-10380936, -4789426, -14209899, -26171384, -4786741, -7858180, 4131759, -6767258, -34764540, 9626632, +21794274, -1290638, -4669703, 34121904, -42335492, -9186398, 23572928, -5814849, 18287434, -13483513, +-8376260, 6326487, -40404904, 13032541, -13776644, 20163260, 14810658, -21497386, 42349988, 6225555, +2222109, -2199560, 16672526, -30687542, 12526809, -1468879, -4893042, 8191040, -19842748, 28026272, +25438554, -47084652, 6737193, -9392020, -44196824, -7630010, -19746112, 10847477, 2761664, 7633768, +-17860622, 27698780, -2741263, -7463580, 12779138, -553514, 9069897, -1959042, 14334990, 325881, +7132330, 2210298, -660888, -1547262, 7999914, -5830418, -6556268, 126165, -7697119, 11462731, +-2539936, -5968931, 584116, 5265630, 2503429, 5431523, 2078227, 13303661, 3119220, -7259569, +13774497, -7508140, 7819525, 11876121, -3358128, 2658048, 8303783, -5761162, 435402, -7509214, +8118025, 1165010, 25794500, -11758010, -33597380, -33707976, 2518462, 4023311, -14899778, 8623221, +-18816252, 5856725, -8607114, 17134772, 21986474, 585726, 21267604, 19339700, -10965588, -409096, +-13988172, -3610994, -3390340, 7385733, -1497870, -2269890, -2459406, -22560926, -34053720, -13768591, +17564806, 13553843, -14688788, -16874390, 9641665, 9774809, -22193706, 10997801, -14810658, -2864743, +16935592, 23570780, 37581, -14173929, 8943733, 1681480, 14642080, 2435783, 12197707, 12599287, +-3718368, -48724256, 5383742, 1153736, 19543174, -7280507, 19934016, 19759534, -13418552, -65978212, +-8951786, 2579665, -8031052, 39494372, 41441064, 28875066, 41178000, -10798622, 19301584, -16407312, +27484032, 19230716, -32639604, 40980968, -42603928, -36303212, -34227668, 10732586, 25551834, 21257404, +7056095, -26759794, 24490440, 3317325, -8945880, -11521787, 1341104, 23117662, -18083422, -7301445, +35374424, 6451041, 16115791, 3003256, 1611687, 8633421, -13521631, 7115150, -5595269, 164283, +3519189, -3533148, -7067369, -4689031, -6203007, -13587129, 2898566, 12389907, -2615098, 12670154, +9772124, -8296266, -6608344, -6181532, 7768522, 4842039, -16576426, -9645423, 718870, 687195, +-2593087, 2063732, 10637023, -384936, 8424041, 766115, -6505265, 4085588, 14106820, -26162256, +-49355616, 10287520, 18090402, -2727304, 24896314, 9489730, -31164820, -7918846, 6529961, 7573638, +8476655, -6358699, 14327474, 1151051, -9356586, -4330401, 5049271, 20422032, 26665304, 20138564, +31994822, -30923764, -8646843, -8083129, -31637802, -7646653, 5343476, 1526324, 3425773, -12657269, +-14315126, 15959562, 35963372, -17148730, 18521510, -12265890, 4751308, -11320460, -2014877, -28193240, +-10325101, -1699196, -39023000, -22859964, -38194072, -32266478, 21225728, 50140520, 39994736, 1073205, +-2619930, 29528, -9134322, -17384954, -61022896, -20473036, -8842264, 4860829, 2502892, -21609592, +-15130096, 7787313, 26702886, 15877420, 8533026, 17415018, 29959008, 11655467, -30211336, 22908818, +-17942226, -9460739, 17721036, 40022116, 8522289, 51348480, -12399034, -53645752, -6317897, -17404818, +-32945620, 49359376, 13907104, 15967615, -238908, -4540854, 14175540, 11681774, 538482, -2145336, +-8741332, -1875827, -2705830, 13379360, 16175384, 19366008, -2379949, -871878, -952409, -863288, +12621298, -5647882, -4460861, -7675107, -6071473, 7102802, -1671279, -401579, 1979980, 4462471, +7331509, 9126269, -1491427, -5708549, -9866077, 4649839, 1613297, 4369056, 11875048, 10394895, +-5574331, 2471217, 5231270, -9597641, -3101503, -2371896, -9245991, -4376035, -620086, 7954817, +-13295071, -20837570, -34230352, 21442624, -3180960, -20610474, 10181220, 22728966, 19699942, -40018356, +-34553548, 8820252, -15973520, 4264903, 19795504, -10531797, -7730405, 32627256, 8960912, -4376035, +-10186589, -9072045, 12333535, -7161321, -1290638, -812823, -13079786, -4967130, -21860846, -29147796, +10597295, 16129750, -18362058, 13660680, 9383967, -6252936, -12699681, 2113124, 23284628, 13466870, +4301947, -23033910, -25784300, -12493523, 7133404, 29148332, -21614960, -11380053, -9757092, 17459578, +46875808, 12505334, -45589468, -10028212, -5251135, 23609972, 657667, 12291660, -5843840, -10714870, +-10001905, -25759066, 24254218, 25691958, 10426570, 27155468, -8338142, 17607756, -7975755, -19379966, +-21468930, -22956064, 4202626, -43091408, 45439680, -2005750, -17088602, -24861956, -20327544, -1258425, +-13269301, -3922379, -23667418, -14567455, -42147588, -11638288, -27728846, 10389526, -9771051, 8351564, +9594957, 10279467, -6867653, 23480586, -5187247, 17042430, 744103, 4193499, -1202591, 7481296, +-3494493, -9243306, 2037425, 2805151, 8815420, -13860933, -4770098, 3730716, -13673028, 160524, +5170067, -17110612, -7430294, 4228932, -2280628, -13085692, -20287278, -12146168, 7562364, -3775276, +9475235, 2359548, 474594, 13939853, 1072131, 12001212, 4721243, 7512972, 27880780, 16729971, +-7697655, 4320200, -9594957, 470836, -4495220, 35093104, 26348550, 10092099, 5232344, 16529719, +14982993, -23772108, -34270616, 11697343, 26826366, 38359428, 244276, -8560407, -23914914, -14054744, +16135655, -447213, -20411296, -41206988, -41181220, 8695698, -12362526, 23124104, -47449724, -15676631, +9261560, 6840809, 9066676, -15022185, 6925635, -1272384, -8887361, -1767379, -22248468, 20557860, +25393458, 18847928, -29963302, -16036871, -678605, 10173167, 15130096, 16151225, 12999255, -3395172, +-2087354, -4067871, 21517250, 59540056, 37665788, -31010200, -30431990, -19396610, -39217884, 46275052, +24761560, -14352170, -40678172, -39060580, 44493712, 27307938, 6037651, 34160024, -35403952, -3940633, +2299418, -9161165, 3565360, -13244605, -35804996, 8900246, -27338004, 36685464, 34827352, -13277355, +-6046777, 370978, 4109210, 39037496, 40109624, -63418952, -35214972, -20404852, 8138426, 17770428, +17388176, -24598888, -26175142, -31156230, -3681861, 32219234, 894427, 6375879, -7181186, -34462816, +8118025, -14479945, -17818746, 7814156, 60477436, 20329690, -11082626, -15495705, -14236206, -11976516, +16041166, 18769544, 21984864, -3970161, 14267881, -21384642, 5383205, 7721815, 9944997, -7736310, +4385699, 17765058, -4385699, -5110474, -2741800, 17532056, 11678016, 27328876, 7149510, -9809168, +-7109782, 10080825, 34120292, 27504970, 6009196, -20379082, -24721294, -8115341, -5741298, 5845988, +2683281, -10107669, -12418898, 23341536, -38104948, 33253784, 49027052, 53202832, -59936804, 11034308, +-1861868, -5133023, 25401510, -10813117, -17797270, 17588428, 8965207, 36461588, -3714073, -28852516, +873489, -13163001, 21538188, -33155536, -11742441, -15579994, -22094922, 30280056, -22143778, -3144990, +20852604, 12106976, -7350300, -11582990, -31032750, 4011500, 40881648, 24897388, -1756642, 12156905, +-9220758, 33390686, -22506702, 15422691, -12422119, 20740398, 34473020, -7662759, -22389664, 11050414, +-30534534, 50571092, 5932961, -26847304, -9189083, -41884520, 5342403, 59974924, -10921565, -35302484, +-24649892, 36764384, 10985453, -19320374, -978716, 9465034, 20638392, 50527604, -41229540, 18353468, +41436232, -6295349, -48959944, -47436304, -27755690, 83027624, -60772176, 20567524, -64005212, -30798674, +133728640, 12826920, -58290224, -56055764, -64561948, 81420768, 10511932, -15443092, -64689188, -15585363, +20245402, 65876744, -23607288, 7126962, -28483686, 9749039, 40065604, 24366960, -35791036, 16853452, +6603512, 15461882, 13814762, -36435280, 1279900, -8696235, -13726715, 7145215, -13307956, -26882738, +10330470, -7979513, 34929360, 5116380, -32044214, -36728412, -11617887, 936303, 28182502, 21070572, +5007932, -17192754, 7307350, -799401, -13540421, 881542, 17980880, 15646029, 3974455, -27116276, +6837588, 10430865, 17226576, 15097347, 11129871, -5366562, -17428978, -6731288, -4053912, -5556614, +8462696, -14344117, -3867618, -5180268, -6699612, 21807696, -56304872, 9904731, -50585588, 22379464, +23964306, 47298328, 20949776, 10868952, 12394739, -14703821, -36109400, -25110526, -23703924, 10161893, +5915781, -6132140, 21636972, 33363306, -14892262, -20917028, 23177254, 4140349, -30816928, -7071664, +13991393, -25420838, -4473209, 5642514, 12974559, 6925098, 18340584, 31426276, 5566278, -20007032, +-2294586, 6070400, -15889232, -7092065, 14701136, -11135776, -20124070, 28033252, -6742562, -6921340, +-11132555, -10992969, 18175764, 4645007, 4166118, 24195698, -11540577, -18660560, -1068910, 1816771, +-7907035, 6200859, -1300838, -6634651, -1188632, -23536958, 5267778, 4630512, -3992709, 12709882, +8585103, 4453881, 5689758, -24310588, 28819768, -10770704, -10408853, 8842264, -26331908, 8594766, +-19716584, 2313914, -15595563, 5087926, 6896644, 10682657, 965831, 9477382, 14283451, -5492190, +-3207804, 7931731, -470836, -5003100, 4361540, 1024887, -3275986, -5034239, -4574677, -3016678, +10314901, -9833864, 10005663, 703301, 2720862, 5015985, 2988760, 7298223, -394063, -181999, +-4440460, -966368, -6124624, 12402792, 919660, -5538897, -9051644, -2946348, 4810364, -8841190, +11753178, -5687611, -14908368, 864362, 6334003, -848793, -430034, 1547262, -7047505, -4254702, +-26296474, 42213088, -2301029, 23848342, -21853868, 2581275, -4047470, 7456063, 6730214, 12729209, +-6668474, 9337259, -5986648, 5093295, -1056025, 4005057, 10096931, -1380295, 15720117, -6478422, +11849815, 510564, -619549, -4595078, 7547332, -6219113, 6806987, -4193499, 371515, -3499325, +3675955, -2879239, 8891656, -2930242, -6422050, 14314052, -10095858, 7427072, 5963025, 2100776, +6883759, -8967892, -6255620, 6505265, 6084358, -4013647, -942208, 6944962, -744640, -9967008, +4221953, -5123896, 4954782, 6739878, 3121904, 2229088, 2110977, -10719165, 5069672, 2866354, +-3312494, 3758633, -5102958, 2298881, -2596308, -602906, -1449552, 3579318, 7020661, -10007274, +8710194, -1866163, -3598109, 4952634, -6995965, 3142306, 4734665, -1316944, -2611877, 3266323, +-1466195, 1868848, -1043677, -3641059, -661425, 3662533, -1122060, 1341104, -898185, -2703682, +1552094, 1405528, 2547453, -3866008, 2884608, -380641, -1669669, 3425237, -4087198, 6073621, +3031710, -2446521, 6199249, -609885, -2621004, 126702, -2618856, 3655017, -4262218, 4210679, +1627793, 2208687, 969052, -2618320, 1970316, 851477, 370441, 270583, 51540, -1138703, +1015760, -2731599, 3048890, 1146219, -3105261, 10505490, -35705136, -111235896, -16381005, 53992572, +27906550, 131262256, 24379844, 28213104, 17726940, -35378184, -49851148, -35498980, -63896764, -54886996, +-31175556, -12775917, 36496484, 99694248, 79027400, 68106904, 38662220, -30687004, -49984292, -36739688, +-68867120, -65174520, -20052128, -9148280, -15282031, 25267830, 39439076, 26139170, 48110612, 37243808, +11314018, 34258808, 6896644, -5091684, 3068217, -20649666, -54427972, -46187540, -39347268, -55077048, +-23168128, 16093779, 10959146, 35275640, 39829916, 34910568, 35717484, 36592048, 23077396, 22679038, +2370822, -20318954, -38086696, -25915296, -35862440, -47240884, -23390928, -21665962, -17772574, 6702834, +17804250, 17169132, 33282776, 41767484, 20075750, 29451128, 24999930, -6954089, 2790655, 11319386, +-13993540, -12533788, -22375706, -39969504, -40281960, -31855772, -33148020, -6450504, 13770202, 9309878, +26182120, 39493836, 30984430, 28775208, 29407642, 19753628, 6371047, 1910724, -9266929, -17143898, +-18609556, -27480812, -34964256, -37014028, -32044214, -28596430, -16495359, 3760244, 17976586, 41459320, +54621784, 48119204, 39703216, 33872796, 19422378, 4161823, -17011292, -34704408, -47583404, -49632104, +-54958940, -40343700, -17002164, -4183298, 11357504, 32729798, 41998336, 45558328, 46680924, 39243116, +16462610, -1105954, -12227772, -26508538, -34762928, -32407138, -29035052, -20714090, -8677981, 1166621, +11362336, 15033459, 11312407, 12700218, 9842454, 6940667, 5160940, 5612449, 1630477, 1927904, +-704912, -2715493, -3616363, -2928631, -4643397, -5155572, -5890011, -4970351, -4926865, -3838090, +-2816962, 416612, 1785096, 3362423, 4625143, 6303938, 5869073, 5486821, 4158602, 3415036, +1660005, -222801, -2260764, -3211025, -4683125, -5371394, -5515812, -4553202, -4558571, -2728378, +-954020, 1069447, 2522220, 4196720, 4169876, 4653060, 4553202, 4736275, 4203699, 2286533, +-846645, -2369211, -4050154, -4757213, -4413079, -3476239, -3455301, -2323577, -1741609, -461709, +772557, 2214056, 3180960, 4277251, 4177393, 3694209, 2515240, 1178432, -209917, -959925, +-2129767, -2925410, -3491809, -3375844, -2894808, -1573032, -515396, 761820, 1632088, 2141578, +2193118, 1863479, 1089311, 905701, 479426, 188442, -266288, -522375, -768262, -783832, +-811749, -644245, -504659, -276489, -158377, -15569, 23622, 133144, 138513, 161061, +100395, 93416, 76236, 71404, 74088, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -3562139, -2681133, 1685775, -3515968, -622233, 4472135, 1325534, 1097364, 2467996, -594316, 673773, --1175747, -4686883, -1853278, -233002, -1045825, 1347009, -1463510, -453656, -3983045, -3758, -669478, -2800319, -625455, -3535295, -1275068, -1124208, -4299799, -1963337, 1344862, 1869921, -4780299, 2845416, 6111202, -661962, -1021129, 901943, -2137820, 5334887, 290984, 2522757, -4202626, 745714, -1737314, 1734093, -2285460, -2998961, -783295, -1294396, -1692754, -5543192, --1826435, 30602, 833224, 1659468, 428960, 2825015, -3183645, 2493229, -57982, 624381, -1721745, -2185065, -4944044, -2108292, 2047626, 3071439, 2283312, 202400, 2327336, 1804423, -3179887, 1627256, 1347009, -2121177, 120796, -336618, -474594, -1803886, -2288681, -958851, --566936, -193810, -1777580, 25770, 197032, 686658, 109522, 1254667, -723702, 578210, --1134945, -1621350, 755914, -224949, -95563, 1149978, 738734, 1009854, 13959, 110059, --1004486, 577673, 116501, 349503, -200253, 1555852, -392453, 99321, -725850, -522375, --809601, 671089, -570157, -1389959, -891206, -2522757, 2493766, -3905736, -2381559, 6417755, --983011, 5679558, -2831457, 597000, 2833605, 1289027, 234613, -3730179, -5312875, -5543729, -651224, 193810, -1534914, 809601, -4902705, 9912248, 1163399, -5434744, 1508070, -2822867, --3081102, 2992519, 4229469, -11274, 988916, 2048163, -255014, 72478, 3330747, -1749125, --754841, 247497, 6025839, -67646, -652298, -2208150, -3485366, 1893007, -824634, -3575024, --1591285, -4314295, 632434, -3908420, 135828, -2947421, -944356, -2586107, -5442261, -2199023, --299037, 5231807, 807991, -1448478, 2870112, 4794794, 761283, -6410776, 3020973, 33286, -1252520, 2173254, -1458141, 4146254, -1998770, -3606699, -3768297, -6702297, 675384, -2255395, --2353105, -2993055, -3143916, -135291, -3433826, 1150514, -500901, -1926293, -689879, -2182380, -89121, -49929, -2515240, -1015223, 1078037, -324807, 206158, 621697, 280247, 485331, -364535, -648003, -2250563, -366146, -820339, 690953, -254477, 316217, -400506, 64425, -2147, -451508, -1400696, -1136556, -158914, -476741, -518617, -419296, -1042603, -354872, --4859756, 8383240, -1984812, -7423851, 673236, 2673080, 335544, 2472828, 2030446, -5852967, -2225867, -1279900, -144418, 352724, -992674, 4661650, -1308891, -2842195, -162672, 3750580, -2384781, 1465658, 2233383, 8931921, 2421288, -2907156, 4075387, -3573413, 1315871, -2859375, -8380018, 1413044, -2607045, -1503239, -2614561, -815507, 5587753, -4266513, -3612604, -1003949, -4641249, 2735357, -4127464, 1315871, 1034013, -2340757, 204548, -8900783, 3085397, -1953136, --1643899, -5596343, 8754217, 612033, -4447439, -3428995, -4364224, 467078, -884763, 610959, -45097, -5078799, 6941204, -3754875, -3490198, 2847027, 803159, 2829847, -1861332, -276489, --4162360, 513249, 988916, -5241471, -3944928, 525060, -3679176, 1483911, -3285113, -813896, --882616, 2524904, -4262755, -4358318, -858993, -577673, -1013612, -153008, -1879048, -353261, --1352915, -1023813, -857920, -1260573, -1639067, -11274, -2220498, 747324, -1456531, 139050, -197569, -401043, -805306, 30065, -552440, 1323924, -128849, -840740, -9664, -1600412, --295816, -920197, 133681, 392453, -1156957, -1351841, -337155, 7232188, 261456, 1592896, --5911486, 1866163, 3460133, 2530810, -208306, -2950643, 7779260, 1378148, -1497870, 3743601, -3076270, -3585224, 4786204, -3156801, 7864622, 1138166, 7024956, -732829, 1279363, -2708514, --7851737, 882079, 212064, 297427, -1314797, 1651415, 4223564, -1022739, -4005057, -2662880, --5717675, -1573569, -2787434, -3030636, 586800, 2009508, 3191161, -3690988, 2647311, -2464774, --3027952, -398895, 2709051, 514322, 717796, -5754183, -5505611, -1039919, -1588601, -4204773, -9259949, 4282083, -516470, 1785633, 3761855, -9264781, -4626217, 6233608, -3400004, 5847061, -1394254, -1205812, -6154688, -4585952, 7475391, 3930432, 7073275, -7345468, -435402, -5093295, --331249, 1818382, -2641405, 869731, 622770, -4574140, 4191888, 462783, 703301, -745177, --8070781, 885837, -1879585, -2566243, -2467459, -494995, 1503775, -1315871, 719407, -2871723, --518617, -1318555, 1923072, -358630, -129386, -937377, 158914, -980326, 721018, -1627793, --679679, 525597, -363462, -111669, -2684, -24159, 854699, 457414, -32212, -1149441, --1076426, -1246614, 1168768, 468688, 1657321, 796716, -574989, 673773, -12133283, 627602, --1573569, 3263102, -7349226, 2326799, -2490544, 12228846, -3266860, -6365679, -2340757, -5342940, -1641751, 4526896, -1468342, 8541079, 858993, -2546916, 2045478, 1023276, 2211908, -3054796, --552440, 3165391, 5007395, 1968169, -1021129, 2390686, -4505958, -1421634, 6301791, 4496831, -7402913, 5244155, -142808, -3798362, -7933342, 5440650, -883690, -5795522, 2978560, -1548336, --8883603, 208306, -7408819, -610422, 6664716, -1158567, -4988068, -2313377, 6364605, -5556077, --9069360, 9164386, -1748052, -2258616, 2137820, 1141388, 1073205, 2184528, 2199560, 1197222, --6686191, -2560338, 5140539, -722091, -1992328, 1533303, 8835285, -4512937, -4924180, -2268280, -3611531, 1815161, -7987029, -3571265, -2754148, -3504693, 2611340, -498753, -612570, -2990908, --2358474, -6336688, -3639985, 1496259, 201863, 977642, -260919, 3712999, 3864397, 651224, -1408749, -1969779, 441308, 159988, 1578401, -2420214, -1097901, 272194, 55298, 1091995, --46708, -1386201, 1391569, 491237, -2654290, -545461, 771484, 450435, 456877, -692564, -357556, -1320166, -1270237, -1131187, 680215, -595390, -644782, -221191, -10695005, -296890, -2770254, 10158135, 10498511, -3476239, 5191542, -6869800, 2164127, 4425427, 6717329, -2049236, -10110890, -1985886, 8564702, -4791573, 7163469, -3708168, -12112882, -2804077, 2930778, -4225174, -4571993, -2676838, -2968359, 1232119, -13271986, -4336843, -350577, -2364916, -872415, -6448357, --2282775, -2346663, 2018098, 13380434, 7672422, -7893613, 4195646, 10686416, 2585570, -3844533, -2598455, -2909304, -3286724, 7674033, 5304822, -5455146, -808528, 5451924, 11454678, -3782256, -6192269, 17063368, 7286412, -7961796, 3105261, 1925219, -9629854, 1364726, -7973070, 3460133, --8681203, -2088965, 271120, 4002910, -5695664, -1613297, -2866891, -5159867, 6505802, 5603322, --395674, -3796751, 935229, 949188, 847719, 1535451, 4810900, 908386, -6597607, -164819, -7827041, 202937, 1691680, 1551020, 2313377, -2509872, -1235877, -4006668, -1772748, -3688840, --388695, 2138894, -561030, -2101313, 1073742, -449898, 370441, -1149978, -860067, 1446330, --198105, 3499325, 774705, -772557, 1771674, -62277, -918586, -1345399, -1885491, 770410, --1041530, -494458, 828392, -99858, 1556389, 90194, -2253247, 4655208, -2326799, -10760504, -2470143, -8645769, 1383516, -2870649, 11156178, -5678484, 1563905, 2929168, 1095217, 4045322, --1654099, 12215424, 945430, -7935489, -1488206, -5853504, -950798, -1910187, -5486821, -6879464, --1778653, -4433480, -2106145, 7813083, 2892661, -6619619, 2564096, -7904351, -1512902, 5737003, --10794327, -9522479, 5397164, 5077725, 2618320, -333397, -6564321, 2583423, -3247532, -6193343, --2877628, 322659, 1935957, 10222559, -4057670, -1171452, 519154, 4758824, 2490544, -3560528, --4599910, -8222178, -2529199, -1834488, -4539781, -5280663, 3329137, 6822019, -59593, -4388383, -7545721, 1438814, -3765076, 913217, -1136019, -1001264, -2637110, -1494112, 4887136, -3927748, --5891085, -3397856, 3037616, -4552129, 7973070, 3565897, -1354525, -3304977, -3757023, 2255395, -4939750, 10167798, -2977486, 5193689, 140123, -39192, 523986, 1615445, -1911261, 26307, -1224066, 2123325, -1380295, 1479616, -1191317, 4916664, 1848983, 3691525, 7516, 2501819, --171799, 2217814, -482647, -226023, 2572686, 966368, 278099, 1361505, 267362, 2558190, --1954747, 581431, 1722819, 2348810, 2003602, -813359, -2666638, -67109, 1605244, 332860, -255014, 2105071, 5546414, 10596758, -7931194, -293132, 7211250, -3474629, -5203353, 6629819, --10501732, -657130, 1922535, -1380295, -3927748, -4632122, -2236067, 1799054, -578747, 5004711, -2513093, -1694902, -4010963, -2932389, 8247411, 307627, -10117332, 4694400, -6405944, -6279242, -3823595, 7260642, 7402376, 5614596, -194347, 3789235, 2573759, 3576634, -3326452, -183073, --3000572, -7288560, 3043521, -1893007, -412854, -1619740, 693637, -1217623, 8020315, 14931991, -2448668, -2607582, -57445, -10692858, 10349261, -7296076, -4737349, -7021735, -8596377, 14514305, -782758, -8091719, -2936684, 10010495, 5158793, -7614977, -5690295, 11476689, 918586, 1171452, -14849849, -7113003, 4073240, -5346161, -14755360, 6914898, 7092602, 1170916, -8521215, -1210107, --1855963, 1747515, -3701725, 5384815, 3318936, -11675869, 4945655, 5573794, 7117298, 1218697, --6240588, 10415296, 1764158, -937914, -805843, -3507915, -3682398, -1331977, 655519, 3137474, --11811, 246424, -339302, -2813741, 1176284, 1253594, 553514, -1296006, -775778, 2097555, -751082, 2390686, -1569274, 556735, -3656628, 405874, 3448859, -4632659, 640487, -3631395, -4217658, -1765232, -97711, -2829310, -17180, 2433099, -290984, 3321084, 11274, -952946, -2408940, 5088463, 6485938, 11972221, 10969346, -375273, 9361955, 4240207, 9545565, 9224516, --15173583, 5579163, -4867809, -6529961, -4745939, -1379221, -9652939, -1975685, 2439005, -8246337, --16988206, 3959960, -1136019, -15300821, -11210938, -10002442, -5557688, 608812, -2820720, 3709778, --1962800, 6168647, 11978127, -6758668, 4117800, -2619393, -5391795, -3909494, 792958, -1105954, --426812, 8938364, -300648, 9009768, 11659226, 3527779, 5057324, 7738994, -938987, 1619203, --11380590, 10766946, -9269613, -3219078, -2908767, 1015223, -2515240, -8840653, -7784628, -17142826, -15659988, -17512730, -16976932, 2950643, 16419660, 5872294, -2048163, -4043712, 7587060, -8184060, -9473624, -2676838, 1262184, 1040456, -6178848, 6626061, -7311645, -5955509, -643171, 2433099, --6982006, -1040456, 3847754, -496606, -1869921, 5109938, -3274913, -6264210, -1398549, 3257196, --4137127, -2389613, -2814814, -578747, 1963874, -1297617, 628139, -989990, -2245731, 716186, --1425392, 1525787, -1493038, 2182380, -588411, 4021163, -518080, 1591285, 2210835, -1315871, --2631204, -224412, -609349, -99858, -781147, 1898912, 141197, 2438468, -2087891, 897111, --4531191, 259846, 241592, -1625108, 1303523, 7084012, 9243306, 9242233, 10062035, 23796266, -10657961, 13580687, -6788196, 22025130, -12656195, 561030, 4813048, -144955, -8355859, 2712809, --2348273, -18858664, 7076496, -4780836, 1966021, -1803349, -6289443, -27380, 5540508, -7636989, --4000762, -1221918, 4368519, -11514270, 7215545, 2710124, -10579041, -856309, 4231617, -9565966, -3512747, -11464878, 5217312, -1011465, -3759707, -474057, -7530689, 9576166, 11288785, -10849624, --6247567, 4882304, -3918621, 2994666, 2674154, 702764, 299037, 13073880, -3369939, -8777839, -8043937, -355945, -6959995, -5810017, -10951630, 2078227, 2898566, 5421860, 5154498, -5048197, --8527121, 4713727, 2292439, 16354162, 1651415, -2046015, 338229, 1078574, -4908074, -2176475, --6134287, 6692096, 3797288, 4354023, -1364189, -10478110, -9621800, -3139084, -930934, -3770445, --6695854, 1850594, -2980707, 4310537, 673773, -709207, 2598992, 2777233, 4345970, 4148402, -3258270, -33823, -1090922, 1176821, 2887292, 2297808, -1426466, -1264868, -936840, 756451, --107911, -827318, -48318, -5155035, 530965, 3361886, 2476586, -4015795, -2992519, 5752572, -2974802, 5705327, 2148021, -4171487, 3854733, -1019518, -3264175, 614717, -4612795, -2472828, --1260036, 1725503, -1017907, -12868796, -14463839, 24157580, 16847010, 21597244, 1386201, -13846438, -4889821, 11275900, 8028368, -3525631, -8759586, -2570538, -3216394, -4244502, -7541426, -3018288, --6333466, 16109349, 2579128, 2668785, 127238, 948651, 1714766, -5941551, 10660646, 6027450, --631360, 3885872, -1513976, 10979547, 2025614, -959925, -17941152, -1316408, 1131187, 1721745, --3357591, 2257005, -8497056, 14579266, 11802570, 11400991, 9942849, -7802345, -10818486, 8317741, -2562485, 4074313, -708670, -12583717, -9109089, 743029, -7100655, 99321, -5963025, -2580202, -7561827, 2421825, -5391258, 1948305, -13923747, 443992, -23608898, -11981885, -22305376, 19282792, -17367774, 18551574, 22465364, 10896332, -3710852, -9942849, -3016678, -531502, 3230889, 17813914, --5870147, -13498008, 10319733, -8582418, 4498978, -1948305, -1938104, 4195646, -4000225, -7289097, --2061047, -8979703, -1902134, -8071854, -1852742, 1159104, -705985, -951335, -2190433, -2799782, --5581847, -59056, 2944200, 484258, -2805688, 1010928, 4895726, -631897, 3277597, 1817845, -1945083, 1399623, -6451041, 5688148, -2485712, -2024003, 3813394, 1338419, 4214974, 457951, --5363878, -970663, 134755, 966368, -3274376, 184684, -213675, -8565239, -11525545, 10165114, -13189308, -6476811, 12245489, 1728188, -5199058, 4925254, -17747342, -5505611, 5006858, -5653788, --10883447, -20512764, 10079215, -8814347, 2373506, 13289166, 3190087, 15495705, 11854110, 6739341, -2544768, -9149354, -2684355, -4789426, 839129, 8629663, 4498978, 1782411, 7368017, 21066814, --1099512, -17916456, -7866770, 2895882, 4302484, -1025423, 445066, 1697049, -7642358, 471373, --16863652, 3793530, -17641578, -6432788, -13661217, 6726456, -6815040, -11209328, 17105780, 4797479, -1394791, -7698729, -10261751, 2562485, 4067334, 1506997, 5573794, -8746701, 19230716, -23350664, -6074158, -9733470, -14173392, -7941932, 12239046, 3687230, -13287018, 9385577, -10581189, 25934624, --2418067, -2848637, -12617003, 1508070, -16831440, -9031779, 22453552, -9041980, -10197863, -6662031, -6713571, 840203, 9517111, 4740570, 4975183, 6933151, 3769908, -641024, 715649, 3304441, -1416802, -1839320, 5573794, -1756105, -1943473, -4207458, -3774203, -1701344, 2056753, -3314641, -243203, 1610613, -1365800, 1403381, 260382, 5493263, 2882460, -15569, -1123134, 537, --401043, 3278134, -2923799, 2972117, -825707, 1309428, 4609037, -1471026, 241592, -648540, --2319282, 5632313, -794032, 4390531, 24475408, 25183540, 23757074, 5132486, -6271189, -3880503, --15176804, 12467216, 442382, 7348689, -4487167, 2416993, -5500780, -4210679, -8744017, 4846871, --9108015, 15163919, -39289288, -11380590, 358093, -11829414, 8536248, -12161737, 2593624, -4649302, -12455405, 2285460, 11992086, 946503, -2739652, -108985, 4435628, -13708999, -9836012, -10645076, --1446867, 13506062, -26407070, 9270150, 23097260, 2913599, -16871706, -584652, -14199699, -13596256, -9540733, -1709934, -11589432, 6562173, 1035624, -4264366, -6520834, 3849901, 9637907, 5896453, --13475997, -9804873, 7807714, 11753715, -9470403, -12517682, 6270116, 13158169, -15845745, -471910, --14141180, -19412178, 23242216, -3782256, 3638374, -4273493, 14425721, -3313567, 3572876, -7648800, -12553116, 7008313, 11552388, 13367549, -13197361, -14552960, -5908265, -2731062, -8732205, -21934934, -2473901, 1268089, 35433, -1551557, -3526168, -2892124, 6367289, -488016, -2684892, 5905043, --6395743, -3359738, 2432025, 11529303, -3440806, -3476776, 599685, -1387274, 3998078, -1327145, --603980, -1960116, -3189550, -7995619, -11525008, 2100239, -789200, -8750459, -4376035, 2368675, --3043521, -9924596, -5530308, -622770, -1716913, 841277, 2851858, 1233193, -7516, 8216810, -2835215, 12907987, -4124779, 23085, -18434000, -8367670, -3927211, -15562814, -22544284, -3870303, --7266548, 22038550, 6895570, 32567126, 6206765, -8811125, 4645007, 6525129, -25877714, 1932735, -23463944, 15083388, -14912663, 2532957, 11926587, -20669530, -2988760, -10126459, 9366250, -7827041, -6309307, 1876901, -3769908, 1592359, 348966, -6338298, 7595113, -13889387, -5198521, -5705864, --17601312, -3327526, -1969779, 740882, 1697586, -4453344, -5268851, 33293512, 10281078, -12296491, --22840100, -7969849, 2760053, 24194624, -5352603, -2630131, -12868259, -3078955, -8937290, 19922742, --15428059, 17824114, 22405770, -21784610, 15083388, 6010270, -9050033, -7946227, 5776194, 10760504, --48153564, -5975374, 296353, -6213744, 13172665, -6117107, -35900020, -13675176, -10196789, -15957414, --15610059, 3253438, 3500398, -8859444, -7880191, -14687714, 1927904, -5181341, 1659468, -6145025, --7305203, -8273718, 2372970, -1342714, 5650030, -7106024, 4041564, -511638, -7328825, -15626702, --3654480, -529355, 5555004, -1847373, -20975546, 4785131, 10708427, 4549981, -112743, -7069516, -7965017, -652835, -2089502, -12475806, -1828582, -4032974, 11050414, -1211181, 2094333, 483184, -2682207, 7199976, -4555350, 830002, 744103, -1932198, 969052, 3350075, -14879914, -12688407, --4611721, -10173704, -7010997, -2503429, -6332393, -8022462, -7760469, -1890859, -1880122, -3196530, --5609228, -2151242, -3857954, -677531, -1861332, -6859600, 5530844, 32288490, -934692, -37592240, --21012590, -23256712, -4326643, -12854837, -504659, -19080930, 31369904, 18647138, -3313567, 24663850, -771484, 26590142, 6418292, -15315317, -20860120, -13160317, -16820166, -7519951, 4173098, 11477226, --3686693, 3767760, -13884556, 2397666, -20052666, -1805497, -1101122, 6916508, -7501161, 32217086, -4208531, -833224, 21422224, -8296266, -15107547, -8891656, 13150653, -1002875, -8556112, 3585761, --68183, 27395986, 6815040, 75162, -10582799, -16550656, -41731512, 2694555, -33142652, 16802448, -56989920, -40707164, -8654896, 9206799, -6962142, -7184944, -11353746, 9505299, -11656004, -39384852, --10413685, -39274256, -8162586, -1176284, -24557550, -3514894, -35362076, 15332496, -3499325, -22491670, -55253680, 4247723, 22567368, 18831284, 30515206, -18747532, -1188632, -11325829, -4010963, -7684770, -14535243, 9130564, 13068512, -26889716, -5322538, -14662481, -18785650, -15869367, -9611063, -2192581, -10574746, 8597451, 6098854, 7580618, -2049236, 2384244, 15106474, -2878702, 14951855, 4271882, --12790949, -3646964, 4719632, -5701569, -2080375, 17337710, 397821, -5439039, 19683298, -9194988, --1240709, -16243029, -3788698, -11384885, 8592619, -8747238, -3687766, -3433826, 3381750, -3988414, -7787313, 3221, 8051453, 2014877, -2801929, -5648956, -7410966, -5829881, -11323144, -65821448, --6505265, -16522202, -18129056, 24529632, 19534586, -22802518, -17948132, 45893336, -4756140, 15167140, -2743410, -1966021, -4849555, -4533338, -14376329, 249108, 5646809, 8559333, 5893232, 16674674, --12382391, 104153, -12058121, -7002944, 5430986, 23486492, 15220827, 20787642, 18664318, -3687230, -7001334, 11378442, 414464, -18286360, -3018288, 26321170, -4250944, -36592584, -15920907, 4468914, --30976914, -13154411, -31755378, -21677774, -19704236, 30100742, 20689932, -6052683, 20707112, 8216273, -29053844, 19662898, 9597641, -50067508, -10893111, 2656974, -43976708, -32054952, -12090333, -8244190, --51574504, 11574937, 29087130, 38887172, 46501076, -15145665, -29714732, 42413, -29984240, -22195318, --41779296, -46483356, -32743756, -27518930, 31389232, 1717450, 6578816, -27999428, -29393682, -26304528, --2335925, 41049148, 51970180, 1706713, -18642842, -14245333, -20527796, -53919020, -23935852, -23854786, --6390375, -1794760, -12030740, 14464913, 198105, -3981972, -19080930, -24967182, -12947716, -13989245, --22028350, -4734665, -5459441, -1984812, -5778879, -10006737, 13653164, 8483097, -1227824, -12110734, -9053254, 14852534, 1271847, -12436615, -6458020, 10438918, 2958159, -2652679, -11934104, 10426570, --2299418, -3797825, 1322850, 8126615, 2185065, -2159832, 1376537, 6339372, 1163399, -21005612, --50077172, 18849000, 1924145, -34216932, 31049392, 15170898, 9258876, -7835094, -30604326, -8049843, -466004, 28925530, 38632692, 1844152, 10146323, 2090575, 814433, -2274722, 4879620, -16775605, -54586888, 12775917, -18345952, -18389976, -8384313, 1997160, 26486526, -13436268, -4465156, -419296, -13217225, -13482439, 6783901, 497142, -3415573, -45828912, -14607721, 14148159, 23157390, 7948374, --5442261, -13508209, -30353608, -3680787, 4529580, -7530689, 153008, -8225399, -19693498, 19067508, --4857608, 6565932, -21028160, -4727686, 52505440, 3580929, -6222334, 5784784, 6544457, 4595615, -26268556, -10147934, -12390981, 19466940, -2595771, 11386495, 7009387, 16915728, -7022809, -20040318, -9611600, -9458592, 1237488, 74327632, 71615896, 31935766, -6723772, -4076998, 8792335, 33474438, -15356119, -10458782, -1416802, -4852776, -19387482, -20683488, 10852309, 5201206, 2612414, 16524350, --2523830, -9834401, 9791989, 3857954, 14583561, -21976810, -17828946, -22325240, 3022583, -10253698, -998043, -4800163, 7706782, 8447664, 18188112, 10269804, -19751480, -14819785, 6813966, -12435004, --7055021, 1083942, 6166500, -8506720, -19420232, -2577517, 483184, -2093260, 8356396, 1839857, --15698642, 4351876, 24938190, 28423020, 21343840, 24191940, 17468168, 21774410, -6153078, -1810866, -8445516, -2864206, 8318815, 7372848, 11233487, 20685636, 37041408, 5350456, -38277824, -9739912, -8956081, 6206765, -8902393, 29645474, 14874009, 11817603, -9309878, 34627636, -1713155, 1326071, --8854612, 18706194, 12394739, -25654914, -37876780, -10170483, 6715182, 2735357, -7002408, -34561064, --3213709, 13083007, 3129958, -11256036, -4571993, -9988483, -13209709, 8826695, 10278930, -21930104, --24940338, -8179765, -31009128, 9092446, 27727236, -23475218, 26664230, -11804718, -14276471, -26412438, --37343132, -41752452, -39775156, -20025822, 261993, 15796890, 7296076, 15737297, -20854750, -46612744, --18339510, -44772348, -79296368, -29702920, 64397128, 110442936, 64655900, -26297012, -21351356, -96963720, --87351584, 61601644, 10943040, 80726056, 83250960, 86900608, 29351270, -33718176, -42375220, -46963856, --54166516, -7223598, 54649700, 92560304, 29736742, 10272488, -3818226, -45057964, -66756140, -44533444, -9162776, 64173792, 30021284, 41842644, 33851860, 13041131, -23641110, -25941602, 1598265, -14016626, -5617281, 31841276, 33404108, 25069188, 5313949, 13177497, 1007170, -20070920, 4960151, 9397388, --2773475, 4464082, -5438503, 45871860, 26668526, 29421600, 17790828, -14629195, -39026756, -55195160, -9059160, 20496658, 38507604, 39103528, 49707804, 24854438, -35660576, -44328356, -54477904, -8723079, -616328, 30920006, 17915920, 10460930, 16879222, -26473104, -80688480, -53451404, -49435072, -10372883, -7256884, 19934554, -4209605, -9821516, -17898740, -21132312, -3553012, 7644505, -24987582, 34979824, -16791712, 31067646, -68302328, 15490873, 9204115, -20984674, 15274514, -15690052, -7792682, -4664872, --9807558, 29436632, 54138064, -15710453, 10833518, -7511898, 12919798, 27597312, -8500277, -4983773, --15080167, 7967165, -9602473, -29840896, 21736292, 36910412, -4945655, -19242528, -17781164, -38767984, --10790568, 29493004, 19891604, 10315975, -42862700, -24755654, -18751828, 37896644, 32730336, 28858422, --83591336, -55498492, -6870337, 41342280, 88025352, 423591, -106110392, -38858716, 3423089, 35824860, --3040300, 19704236, 14709726, -46208480, -20402168, -12715251, -27893128, 2018098, -52262236, 8253854, -20512764, -62909460, -40467180, -19550154, -8197482, 69835096, -547071, -106938240, 10154913, 15187004, -16211354, 42273752, 19535658, -45624364, 2170032, -1650341, 91450592, 64717104, -53832048, 49052284, --28759638, 19583978, 50443316, 18299782, -27886686, 25522306, -11233487, 6641630, 17407502, -1756642, --18924162, 34761856, -22406844, 25512642, -12021077, 13785771, -4292283, 28000502, -9881109, 22032646, --38301980, -6462852, -566936, -4887673, 12163884, 23871966, -24387898, 49081276, -19276350, -16724066, --33494840, 24570972, 51354388, 10296110, -67914704, 5607617, -15362561, 33090576, 16105054, 14991046, --27365920, -1750736, -17463338, 16549046, -7181722, -10755135, -4101157, 22396644, -5481989, -13582297, --16898012, 12759274, 1847910, 12165495, -7617662, 439160, -13035226, -827318, -2851322, 6250788, -1789391, 13773960, -3000035, -4007741, -14442901, 9823664, 3364033, 8747238, -48855, -8228621, --10762114, 3240553, 2488934, 7453916, 23659364, -56435332, 8038568, -41430864, 7578470, 35223564, -31142808, 10218264, -20151986, 4067871, -11965779, -2939368, -14853608, -10964515, 7663296, 2086280, --21633750, -2465311, 11287174, -2377801, 1291711, 4109747, -13793824, -13653164, -338766, 9082782, -1221381, -21990770, 1855426, 11323144, 3565360, 2654827, 23054310, -2508798, -6124624, 8288213, -8837432, -15551003, -17260936, 12841952, 2495913, -13236552, 8924942, 3889093, 4332012, -9250823, -3754875, 10472741, 1275068, -13029857, 17733920, -2120640, -19850266, 631360, 15558519, 4879083, --12986370, 11861626, 3933653, -18090940, 7465727, 966368, 18518288, -16738024, 1523640, 12783970, --29355028, 972810, 12693239, -452582, 8801462, -4847408, -18788334, 2532420, -19881940, 18711562, -9655086, 5302137, -7380365, -7758322, 15440407, -13259101, 13779329, 15160698, -21613886, -6980396, -937914, 16784196, 274341, -9666898, 6213744, -11716134, -693637, 1744294, 9897752, 718333, -1636919, -6032819, 10300405, -3401077, -11997454, 10964515, -4839892, 4754529, -2711735, 7919920, -9954660, -11376295, 2006287, -6142877, 2698850, -6242198, 22124988, -6203544, -12402792, 10028749, --5583995, -1828046, -6308770, 6576132, 6026376, -8892730, 5009006, 8765491, -4506495, 636729, --12344810, -28123982, 45632416, 6292664, 20543902, -17999134, 7747048, -4031901, 5373004, 4839892, --7807177, 2913062, 8238284, -4992363, 18112950, 664646, 452582, 6055367, 5832029, -833224, --4789963, 7644505, -1342714, -5535139, -1236414, 7683697, -8582955, 1662689, 3701725, -10902774, -13322989, -2814814, -6595459, 20503638, -8614094, -12288975, 9368934, 5113696, -5811091, 8826158, -7055021, -2611340, -3013457, -1724966, 2583960, 5033165, 2909304, -145492, -3668439, 10521596, --11425687, 10085657, 1491427, -1345935, 2743410, 3128884, 3207267, 362925, -10178536, 2733210, -8588861, -6277095, -127775, -84826, 6519761, -756451, -2668785, 9908490, -5176510, 5281736, --10454487, -3918084, 9938554, -9628780, 9552007, -2583960, 6257231, 7672422, -8893267, -3067144, -10793790, -9170292, -574452, 1066763, 3198140, 738198, -1336272, 329102, 716723, 4954782, --4387846, 1036161, 3106872, -392990, -2317672, 489089, 1784022, -504122, 549219, -1967632, -2166811, 3065533, -5578626, -941135, 9383430, -4659503, 2608656, -767189, 5305359, 1464047, --3088618, 539555, -689879, -3223910, -2291902, 11116449, -2003602, -2632815, 1501091, 1180042, --972273, 2310156, 4507032, 79994, 1097364, 361314, -1083942, 623844, 1251446, -2197413, -1383516, -204548, 10712722, -37781216, -120830312, -6137509, 65150360, 29242822, 138766640, 11844983, -29326574, 1230508, -40429600, -50955492, -34489660, -62100396, -43421044, -27322434, 1022202, 47426104, -93452584, 68751688, 59871308, 19489488, -32482300, -47766480, -42903504, -50617800, -56092808, -22756348, --10721312, -4909685, 27436788, 36352068, 27464168, 50821812, 32866164, 12167105, 34153044, 788127, --14770929, -9808632, -30570504, -62799940, -38118908, -36770824, -37430640, 1947768, 17513266, 12055973, -46198280, 37827388, 26135412, 37204616, 39633960, 11201275, 11922829, -4231080, -34029024, -47392816, --36145908, -47502340, -33709052, -11810086, -8295730, 2909840, 25917444, 20222316, 18330384, 36489504, -30241402, 22165252, 37768868, 10313290, -7672422, -1582696, -15066208, -32786706, -18986440, -41472740, --52320756, -30908196, -26004954, -11354283, 30480846, 41019084, 38348152, 44130252, 36408436, 20629264, -19986630, 9625559, -4202089, -11263015, -21001854, -31178242, -31107912, -35283156, -36934572, -31688268, --10715943, -3779034, 12526809, 31780074, 35502200, 35008816, 41030360, 32531692, 24472186, 20244328, -6736656, -15875273, -28122908, -45986216, -58580668, -54976656, -43457016, -21962316, 5632850, 29387776, -40496708, 46462420, 48568564, 41781440, 29655138, 15029701, -9559523, -23853174, -31381716, -36566276, --31868120, -24114630, -16514686, -6933151, 7757248, 10098005, 13931800, 15859167, 14251238, 11206643, -9087614, 5993090, 5408975, 2290828, -1725503, -3134253, -3041374, -5001490, -5328444, -7093676, --8138426, -9179419, -7223598, -5677947, -2936684, -325881, 4667556, 7592429, 9059160, 8913131, -10022306, 8800925, 6479495, 2731599, -1291175, -5437966, -6752763, -7977365, -7904351, -8789651, --7717520, -5583995, -1465121, 1134408, 3344169, 5185100, 6529424, 6298033, 6855842, 6331319, -5337571, 3164854, 974958, -2584497, -4889284, -6817187, -6794102, -6506339, -5331665, -3772592, --938450, 598611, 1988570, 3254512, 4522064, 4980015, 4960151, 3805878, 2895882, 1393180, -163209, -1280437, -2283849, -3639985, -3945464, -4173635, -3545496, -2755759, -1115081, 220654, -1824824, 2705830, 2957622, 2472828, 2287070, 1906429, 1676111, 916976, 188979, -734439, --1352915, -2070711, -2260764, -2221572, -1614908, -959388, -178241, 202400, 667867, 842887, -1013075, 921807, 784905, 541703, 404264, 157303, 9127, -141197, -185757, -218506, --226023, -214212, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +2681133, 1685775, -3515968, -622233, 4472135, 1325534, 1097364, 2467996, -594316, 673773, +-1175747, -4686883, -1853278, -233002, -1045825, 1347009, -1463510, -453656, -3983045, -3758, +669478, -2800319, -625455, -3535295, -1275068, -1124208, -4299799, -1963337, 1344862, 1869921, +4780299, 2845416, 6111202, -661962, -1021129, 901943, -2137820, 5334887, 290984, 2522757, +4202626, 745714, -1737314, 1734093, -2285460, -2998961, -783295, -1294396, -1692754, -5543192, +-1826435, 30602, 833224, 1659468, 428960, 2825015, -3183645, 2493229, -57982, 624381, +1721745, -2185065, -4944044, -2108292, 2047626, 3071439, 2283312, 202400, 2327336, 1804423, +3179887, 1627256, 1347009, -2121177, 120796, -336618, -474594, -1803886, -2288681, -958851, +-566936, -193810, -1777580, 25770, 197032, 686658, 109522, 1254667, -723702, 578210, +-1134945, -1621350, 755914, -224949, -95563, 1149978, 738734, 1009854, 13959, 110059, +-1004486, 577673, 116501, 349503, -200253, 1555852, -392453, 99321, -725850, -522375, +-809601, 671089, -570157, -1389959, -891206, -2522757, 2493766, -3905736, -2381559, 6417755, +-983011, 5679558, -2831457, 597000, 2833605, 1289027, 234613, -3730179, -5312875, -5543729, +651224, 193810, -1534914, 809601, -4902705, 9912248, 1163399, -5434744, 1508070, -2822867, +-3081102, 2992519, 4229469, -11274, 988916, 2048163, -255014, 72478, 3330747, -1749125, +-754841, 247497, 6025839, -67646, -652298, -2208150, -3485366, 1893007, -824634, -3575024, +-1591285, -4314295, 632434, -3908420, 135828, -2947421, -944356, -2586107, -5442261, -2199023, +-299037, 5231807, 807991, -1448478, 2870112, 4794794, 761283, -6410776, 3020973, 33286, +1252520, 2173254, -1458141, 4146254, -1998770, -3606699, -3768297, -6702297, 675384, -2255395, +-2353105, -2993055, -3143916, -135291, -3433826, 1150514, -500901, -1926293, -689879, -2182380, +89121, -49929, -2515240, -1015223, 1078037, -324807, 206158, 621697, 280247, 485331, +364535, -648003, -2250563, -366146, -820339, 690953, -254477, 316217, -400506, 64425, +2147, -451508, -1400696, -1136556, -158914, -476741, -518617, -419296, -1042603, -354872, +-4859756, 8383240, -1984812, -7423851, 673236, 2673080, 335544, 2472828, 2030446, -5852967, +2225867, -1279900, -144418, 352724, -992674, 4661650, -1308891, -2842195, -162672, 3750580, +2384781, 1465658, 2233383, 8931921, 2421288, -2907156, 4075387, -3573413, 1315871, -2859375, +8380018, 1413044, -2607045, -1503239, -2614561, -815507, 5587753, -4266513, -3612604, -1003949, +4641249, 2735357, -4127464, 1315871, 1034013, -2340757, 204548, -8900783, 3085397, -1953136, +-1643899, -5596343, 8754217, 612033, -4447439, -3428995, -4364224, 467078, -884763, 610959, +45097, -5078799, 6941204, -3754875, -3490198, 2847027, 803159, 2829847, -1861332, -276489, +-4162360, 513249, 988916, -5241471, -3944928, 525060, -3679176, 1483911, -3285113, -813896, +-882616, 2524904, -4262755, -4358318, -858993, -577673, -1013612, -153008, -1879048, -353261, +-1352915, -1023813, -857920, -1260573, -1639067, -11274, -2220498, 747324, -1456531, 139050, +197569, -401043, -805306, 30065, -552440, 1323924, -128849, -840740, -9664, -1600412, +-295816, -920197, 133681, 392453, -1156957, -1351841, -337155, 7232188, 261456, 1592896, +-5911486, 1866163, 3460133, 2530810, -208306, -2950643, 7779260, 1378148, -1497870, 3743601, +3076270, -3585224, 4786204, -3156801, 7864622, 1138166, 7024956, -732829, 1279363, -2708514, +-7851737, 882079, 212064, 297427, -1314797, 1651415, 4223564, -1022739, -4005057, -2662880, +-5717675, -1573569, -2787434, -3030636, 586800, 2009508, 3191161, -3690988, 2647311, -2464774, +-3027952, -398895, 2709051, 514322, 717796, -5754183, -5505611, -1039919, -1588601, -4204773, +9259949, 4282083, -516470, 1785633, 3761855, -9264781, -4626217, 6233608, -3400004, 5847061, +1394254, -1205812, -6154688, -4585952, 7475391, 3930432, 7073275, -7345468, -435402, -5093295, +-331249, 1818382, -2641405, 869731, 622770, -4574140, 4191888, 462783, 703301, -745177, +-8070781, 885837, -1879585, -2566243, -2467459, -494995, 1503775, -1315871, 719407, -2871723, +-518617, -1318555, 1923072, -358630, -129386, -937377, 158914, -980326, 721018, -1627793, +-679679, 525597, -363462, -111669, -2684, -24159, 854699, 457414, -32212, -1149441, +-1076426, -1246614, 1168768, 468688, 1657321, 796716, -574989, 673773, -12133283, 627602, +-1573569, 3263102, -7349226, 2326799, -2490544, 12228846, -3266860, -6365679, -2340757, -5342940, +1641751, 4526896, -1468342, 8541079, 858993, -2546916, 2045478, 1023276, 2211908, -3054796, +-552440, 3165391, 5007395, 1968169, -1021129, 2390686, -4505958, -1421634, 6301791, 4496831, +7402913, 5244155, -142808, -3798362, -7933342, 5440650, -883690, -5795522, 2978560, -1548336, +-8883603, 208306, -7408819, -610422, 6664716, -1158567, -4988068, -2313377, 6364605, -5556077, +-9069360, 9164386, -1748052, -2258616, 2137820, 1141388, 1073205, 2184528, 2199560, 1197222, +-6686191, -2560338, 5140539, -722091, -1992328, 1533303, 8835285, -4512937, -4924180, -2268280, +3611531, 1815161, -7987029, -3571265, -2754148, -3504693, 2611340, -498753, -612570, -2990908, +-2358474, -6336688, -3639985, 1496259, 201863, 977642, -260919, 3712999, 3864397, 651224, +1408749, -1969779, 441308, 159988, 1578401, -2420214, -1097901, 272194, 55298, 1091995, +-46708, -1386201, 1391569, 491237, -2654290, -545461, 771484, 450435, 456877, -692564, +357556, -1320166, -1270237, -1131187, 680215, -595390, -644782, -221191, -10695005, -296890, +2770254, 10158135, 10498511, -3476239, 5191542, -6869800, 2164127, 4425427, 6717329, -2049236, +10110890, -1985886, 8564702, -4791573, 7163469, -3708168, -12112882, -2804077, 2930778, -4225174, +4571993, -2676838, -2968359, 1232119, -13271986, -4336843, -350577, -2364916, -872415, -6448357, +-2282775, -2346663, 2018098, 13380434, 7672422, -7893613, 4195646, 10686416, 2585570, -3844533, +2598455, -2909304, -3286724, 7674033, 5304822, -5455146, -808528, 5451924, 11454678, -3782256, +6192269, 17063368, 7286412, -7961796, 3105261, 1925219, -9629854, 1364726, -7973070, 3460133, +-8681203, -2088965, 271120, 4002910, -5695664, -1613297, -2866891, -5159867, 6505802, 5603322, +-395674, -3796751, 935229, 949188, 847719, 1535451, 4810900, 908386, -6597607, -164819, +7827041, 202937, 1691680, 1551020, 2313377, -2509872, -1235877, -4006668, -1772748, -3688840, +-388695, 2138894, -561030, -2101313, 1073742, -449898, 370441, -1149978, -860067, 1446330, +-198105, 3499325, 774705, -772557, 1771674, -62277, -918586, -1345399, -1885491, 770410, +-1041530, -494458, 828392, -99858, 1556389, 90194, -2253247, 4655208, -2326799, -10760504, +2470143, -8645769, 1383516, -2870649, 11156178, -5678484, 1563905, 2929168, 1095217, 4045322, +-1654099, 12215424, 945430, -7935489, -1488206, -5853504, -950798, -1910187, -5486821, -6879464, +-1778653, -4433480, -2106145, 7813083, 2892661, -6619619, 2564096, -7904351, -1512902, 5737003, +-10794327, -9522479, 5397164, 5077725, 2618320, -333397, -6564321, 2583423, -3247532, -6193343, +-2877628, 322659, 1935957, 10222559, -4057670, -1171452, 519154, 4758824, 2490544, -3560528, +-4599910, -8222178, -2529199, -1834488, -4539781, -5280663, 3329137, 6822019, -59593, -4388383, +7545721, 1438814, -3765076, 913217, -1136019, -1001264, -2637110, -1494112, 4887136, -3927748, +-5891085, -3397856, 3037616, -4552129, 7973070, 3565897, -1354525, -3304977, -3757023, 2255395, +4939750, 10167798, -2977486, 5193689, 140123, -39192, 523986, 1615445, -1911261, 26307, +1224066, 2123325, -1380295, 1479616, -1191317, 4916664, 1848983, 3691525, 7516, 2501819, +-171799, 2217814, -482647, -226023, 2572686, 966368, 278099, 1361505, 267362, 2558190, +-1954747, 581431, 1722819, 2348810, 2003602, -813359, -2666638, -67109, 1605244, 332860, +255014, 2105071, 5546414, 10596758, -7931194, -293132, 7211250, -3474629, -5203353, 6629819, +-10501732, -657130, 1922535, -1380295, -3927748, -4632122, -2236067, 1799054, -578747, 5004711, +2513093, -1694902, -4010963, -2932389, 8247411, 307627, -10117332, 4694400, -6405944, -6279242, +3823595, 7260642, 7402376, 5614596, -194347, 3789235, 2573759, 3576634, -3326452, -183073, +-3000572, -7288560, 3043521, -1893007, -412854, -1619740, 693637, -1217623, 8020315, 14931991, +2448668, -2607582, -57445, -10692858, 10349261, -7296076, -4737349, -7021735, -8596377, 14514305, +782758, -8091719, -2936684, 10010495, 5158793, -7614977, -5690295, 11476689, 918586, 1171452, +14849849, -7113003, 4073240, -5346161, -14755360, 6914898, 7092602, 1170916, -8521215, -1210107, +-1855963, 1747515, -3701725, 5384815, 3318936, -11675869, 4945655, 5573794, 7117298, 1218697, +-6240588, 10415296, 1764158, -937914, -805843, -3507915, -3682398, -1331977, 655519, 3137474, +-11811, 246424, -339302, -2813741, 1176284, 1253594, 553514, -1296006, -775778, 2097555, +751082, 2390686, -1569274, 556735, -3656628, 405874, 3448859, -4632659, 640487, -3631395, +4217658, -1765232, -97711, -2829310, -17180, 2433099, -290984, 3321084, 11274, -952946, +2408940, 5088463, 6485938, 11972221, 10969346, -375273, 9361955, 4240207, 9545565, 9224516, +-15173583, 5579163, -4867809, -6529961, -4745939, -1379221, -9652939, -1975685, 2439005, -8246337, +-16988206, 3959960, -1136019, -15300821, -11210938, -10002442, -5557688, 608812, -2820720, 3709778, +-1962800, 6168647, 11978127, -6758668, 4117800, -2619393, -5391795, -3909494, 792958, -1105954, +-426812, 8938364, -300648, 9009768, 11659226, 3527779, 5057324, 7738994, -938987, 1619203, +-11380590, 10766946, -9269613, -3219078, -2908767, 1015223, -2515240, -8840653, -7784628, -17142826, +15659988, -17512730, -16976932, 2950643, 16419660, 5872294, -2048163, -4043712, 7587060, -8184060, +9473624, -2676838, 1262184, 1040456, -6178848, 6626061, -7311645, -5955509, -643171, 2433099, +-6982006, -1040456, 3847754, -496606, -1869921, 5109938, -3274913, -6264210, -1398549, 3257196, +-4137127, -2389613, -2814814, -578747, 1963874, -1297617, 628139, -989990, -2245731, 716186, +-1425392, 1525787, -1493038, 2182380, -588411, 4021163, -518080, 1591285, 2210835, -1315871, +-2631204, -224412, -609349, -99858, -781147, 1898912, 141197, 2438468, -2087891, 897111, +-4531191, 259846, 241592, -1625108, 1303523, 7084012, 9243306, 9242233, 10062035, 23796266, +10657961, 13580687, -6788196, 22025130, -12656195, 561030, 4813048, -144955, -8355859, 2712809, +-2348273, -18858664, 7076496, -4780836, 1966021, -1803349, -6289443, -27380, 5540508, -7636989, +-4000762, -1221918, 4368519, -11514270, 7215545, 2710124, -10579041, -856309, 4231617, -9565966, +3512747, -11464878, 5217312, -1011465, -3759707, -474057, -7530689, 9576166, 11288785, -10849624, +-6247567, 4882304, -3918621, 2994666, 2674154, 702764, 299037, 13073880, -3369939, -8777839, +8043937, -355945, -6959995, -5810017, -10951630, 2078227, 2898566, 5421860, 5154498, -5048197, +-8527121, 4713727, 2292439, 16354162, 1651415, -2046015, 338229, 1078574, -4908074, -2176475, +-6134287, 6692096, 3797288, 4354023, -1364189, -10478110, -9621800, -3139084, -930934, -3770445, +-6695854, 1850594, -2980707, 4310537, 673773, -709207, 2598992, 2777233, 4345970, 4148402, +3258270, -33823, -1090922, 1176821, 2887292, 2297808, -1426466, -1264868, -936840, 756451, +-107911, -827318, -48318, -5155035, 530965, 3361886, 2476586, -4015795, -2992519, 5752572, +2974802, 5705327, 2148021, -4171487, 3854733, -1019518, -3264175, 614717, -4612795, -2472828, +-1260036, 1725503, -1017907, -12868796, -14463839, 24157580, 16847010, 21597244, 1386201, -13846438, +4889821, 11275900, 8028368, -3525631, -8759586, -2570538, -3216394, -4244502, -7541426, -3018288, +-6333466, 16109349, 2579128, 2668785, 127238, 948651, 1714766, -5941551, 10660646, 6027450, +-631360, 3885872, -1513976, 10979547, 2025614, -959925, -17941152, -1316408, 1131187, 1721745, +-3357591, 2257005, -8497056, 14579266, 11802570, 11400991, 9942849, -7802345, -10818486, 8317741, +2562485, 4074313, -708670, -12583717, -9109089, 743029, -7100655, 99321, -5963025, -2580202, +7561827, 2421825, -5391258, 1948305, -13923747, 443992, -23608898, -11981885, -22305376, 19282792, +17367774, 18551574, 22465364, 10896332, -3710852, -9942849, -3016678, -531502, 3230889, 17813914, +-5870147, -13498008, 10319733, -8582418, 4498978, -1948305, -1938104, 4195646, -4000225, -7289097, +-2061047, -8979703, -1902134, -8071854, -1852742, 1159104, -705985, -951335, -2190433, -2799782, +-5581847, -59056, 2944200, 484258, -2805688, 1010928, 4895726, -631897, 3277597, 1817845, +1945083, 1399623, -6451041, 5688148, -2485712, -2024003, 3813394, 1338419, 4214974, 457951, +-5363878, -970663, 134755, 966368, -3274376, 184684, -213675, -8565239, -11525545, 10165114, +13189308, -6476811, 12245489, 1728188, -5199058, 4925254, -17747342, -5505611, 5006858, -5653788, +-10883447, -20512764, 10079215, -8814347, 2373506, 13289166, 3190087, 15495705, 11854110, 6739341, +2544768, -9149354, -2684355, -4789426, 839129, 8629663, 4498978, 1782411, 7368017, 21066814, +-1099512, -17916456, -7866770, 2895882, 4302484, -1025423, 445066, 1697049, -7642358, 471373, +-16863652, 3793530, -17641578, -6432788, -13661217, 6726456, -6815040, -11209328, 17105780, 4797479, +1394791, -7698729, -10261751, 2562485, 4067334, 1506997, 5573794, -8746701, 19230716, -23350664, +6074158, -9733470, -14173392, -7941932, 12239046, 3687230, -13287018, 9385577, -10581189, 25934624, +-2418067, -2848637, -12617003, 1508070, -16831440, -9031779, 22453552, -9041980, -10197863, -6662031, +6713571, 840203, 9517111, 4740570, 4975183, 6933151, 3769908, -641024, 715649, 3304441, +1416802, -1839320, 5573794, -1756105, -1943473, -4207458, -3774203, -1701344, 2056753, -3314641, +243203, 1610613, -1365800, 1403381, 260382, 5493263, 2882460, -15569, -1123134, 537, +-401043, 3278134, -2923799, 2972117, -825707, 1309428, 4609037, -1471026, 241592, -648540, +-2319282, 5632313, -794032, 4390531, 24475408, 25183540, 23757074, 5132486, -6271189, -3880503, +-15176804, 12467216, 442382, 7348689, -4487167, 2416993, -5500780, -4210679, -8744017, 4846871, +-9108015, 15163919, -39289288, -11380590, 358093, -11829414, 8536248, -12161737, 2593624, -4649302, +12455405, 2285460, 11992086, 946503, -2739652, -108985, 4435628, -13708999, -9836012, -10645076, +-1446867, 13506062, -26407070, 9270150, 23097260, 2913599, -16871706, -584652, -14199699, -13596256, +9540733, -1709934, -11589432, 6562173, 1035624, -4264366, -6520834, 3849901, 9637907, 5896453, +-13475997, -9804873, 7807714, 11753715, -9470403, -12517682, 6270116, 13158169, -15845745, -471910, +-14141180, -19412178, 23242216, -3782256, 3638374, -4273493, 14425721, -3313567, 3572876, -7648800, +12553116, 7008313, 11552388, 13367549, -13197361, -14552960, -5908265, -2731062, -8732205, -21934934, +2473901, 1268089, 35433, -1551557, -3526168, -2892124, 6367289, -488016, -2684892, 5905043, +-6395743, -3359738, 2432025, 11529303, -3440806, -3476776, 599685, -1387274, 3998078, -1327145, +-603980, -1960116, -3189550, -7995619, -11525008, 2100239, -789200, -8750459, -4376035, 2368675, +-3043521, -9924596, -5530308, -622770, -1716913, 841277, 2851858, 1233193, -7516, 8216810, +2835215, 12907987, -4124779, 23085, -18434000, -8367670, -3927211, -15562814, -22544284, -3870303, +-7266548, 22038550, 6895570, 32567126, 6206765, -8811125, 4645007, 6525129, -25877714, 1932735, +23463944, 15083388, -14912663, 2532957, 11926587, -20669530, -2988760, -10126459, 9366250, -7827041, +6309307, 1876901, -3769908, 1592359, 348966, -6338298, 7595113, -13889387, -5198521, -5705864, +-17601312, -3327526, -1969779, 740882, 1697586, -4453344, -5268851, 33293512, 10281078, -12296491, +-22840100, -7969849, 2760053, 24194624, -5352603, -2630131, -12868259, -3078955, -8937290, 19922742, +-15428059, 17824114, 22405770, -21784610, 15083388, 6010270, -9050033, -7946227, 5776194, 10760504, +-48153564, -5975374, 296353, -6213744, 13172665, -6117107, -35900020, -13675176, -10196789, -15957414, +-15610059, 3253438, 3500398, -8859444, -7880191, -14687714, 1927904, -5181341, 1659468, -6145025, +-7305203, -8273718, 2372970, -1342714, 5650030, -7106024, 4041564, -511638, -7328825, -15626702, +-3654480, -529355, 5555004, -1847373, -20975546, 4785131, 10708427, 4549981, -112743, -7069516, +7965017, -652835, -2089502, -12475806, -1828582, -4032974, 11050414, -1211181, 2094333, 483184, +2682207, 7199976, -4555350, 830002, 744103, -1932198, 969052, 3350075, -14879914, -12688407, +-4611721, -10173704, -7010997, -2503429, -6332393, -8022462, -7760469, -1890859, -1880122, -3196530, +-5609228, -2151242, -3857954, -677531, -1861332, -6859600, 5530844, 32288490, -934692, -37592240, +-21012590, -23256712, -4326643, -12854837, -504659, -19080930, 31369904, 18647138, -3313567, 24663850, +771484, 26590142, 6418292, -15315317, -20860120, -13160317, -16820166, -7519951, 4173098, 11477226, +-3686693, 3767760, -13884556, 2397666, -20052666, -1805497, -1101122, 6916508, -7501161, 32217086, +4208531, -833224, 21422224, -8296266, -15107547, -8891656, 13150653, -1002875, -8556112, 3585761, +-68183, 27395986, 6815040, 75162, -10582799, -16550656, -41731512, 2694555, -33142652, 16802448, +56989920, -40707164, -8654896, 9206799, -6962142, -7184944, -11353746, 9505299, -11656004, -39384852, +-10413685, -39274256, -8162586, -1176284, -24557550, -3514894, -35362076, 15332496, -3499325, -22491670, +55253680, 4247723, 22567368, 18831284, 30515206, -18747532, -1188632, -11325829, -4010963, -7684770, +14535243, 9130564, 13068512, -26889716, -5322538, -14662481, -18785650, -15869367, -9611063, -2192581, +10574746, 8597451, 6098854, 7580618, -2049236, 2384244, 15106474, -2878702, 14951855, 4271882, +-12790949, -3646964, 4719632, -5701569, -2080375, 17337710, 397821, -5439039, 19683298, -9194988, +-1240709, -16243029, -3788698, -11384885, 8592619, -8747238, -3687766, -3433826, 3381750, -3988414, +7787313, 3221, 8051453, 2014877, -2801929, -5648956, -7410966, -5829881, -11323144, -65821448, +-6505265, -16522202, -18129056, 24529632, 19534586, -22802518, -17948132, 45893336, -4756140, 15167140, +2743410, -1966021, -4849555, -4533338, -14376329, 249108, 5646809, 8559333, 5893232, 16674674, +-12382391, 104153, -12058121, -7002944, 5430986, 23486492, 15220827, 20787642, 18664318, -3687230, +7001334, 11378442, 414464, -18286360, -3018288, 26321170, -4250944, -36592584, -15920907, 4468914, +-30976914, -13154411, -31755378, -21677774, -19704236, 30100742, 20689932, -6052683, 20707112, 8216273, +29053844, 19662898, 9597641, -50067508, -10893111, 2656974, -43976708, -32054952, -12090333, -8244190, +-51574504, 11574937, 29087130, 38887172, 46501076, -15145665, -29714732, 42413, -29984240, -22195318, +-41779296, -46483356, -32743756, -27518930, 31389232, 1717450, 6578816, -27999428, -29393682, -26304528, +-2335925, 41049148, 51970180, 1706713, -18642842, -14245333, -20527796, -53919020, -23935852, -23854786, +-6390375, -1794760, -12030740, 14464913, 198105, -3981972, -19080930, -24967182, -12947716, -13989245, +-22028350, -4734665, -5459441, -1984812, -5778879, -10006737, 13653164, 8483097, -1227824, -12110734, +9053254, 14852534, 1271847, -12436615, -6458020, 10438918, 2958159, -2652679, -11934104, 10426570, +-2299418, -3797825, 1322850, 8126615, 2185065, -2159832, 1376537, 6339372, 1163399, -21005612, +-50077172, 18849000, 1924145, -34216932, 31049392, 15170898, 9258876, -7835094, -30604326, -8049843, +466004, 28925530, 38632692, 1844152, 10146323, 2090575, 814433, -2274722, 4879620, -16775605, +54586888, 12775917, -18345952, -18389976, -8384313, 1997160, 26486526, -13436268, -4465156, -419296, +13217225, -13482439, 6783901, 497142, -3415573, -45828912, -14607721, 14148159, 23157390, 7948374, +-5442261, -13508209, -30353608, -3680787, 4529580, -7530689, 153008, -8225399, -19693498, 19067508, +-4857608, 6565932, -21028160, -4727686, 52505440, 3580929, -6222334, 5784784, 6544457, 4595615, +26268556, -10147934, -12390981, 19466940, -2595771, 11386495, 7009387, 16915728, -7022809, -20040318, +9611600, -9458592, 1237488, 74327632, 71615896, 31935766, -6723772, -4076998, 8792335, 33474438, +15356119, -10458782, -1416802, -4852776, -19387482, -20683488, 10852309, 5201206, 2612414, 16524350, +-2523830, -9834401, 9791989, 3857954, 14583561, -21976810, -17828946, -22325240, 3022583, -10253698, +998043, -4800163, 7706782, 8447664, 18188112, 10269804, -19751480, -14819785, 6813966, -12435004, +-7055021, 1083942, 6166500, -8506720, -19420232, -2577517, 483184, -2093260, 8356396, 1839857, +-15698642, 4351876, 24938190, 28423020, 21343840, 24191940, 17468168, 21774410, -6153078, -1810866, +8445516, -2864206, 8318815, 7372848, 11233487, 20685636, 37041408, 5350456, -38277824, -9739912, +8956081, 6206765, -8902393, 29645474, 14874009, 11817603, -9309878, 34627636, -1713155, 1326071, +-8854612, 18706194, 12394739, -25654914, -37876780, -10170483, 6715182, 2735357, -7002408, -34561064, +-3213709, 13083007, 3129958, -11256036, -4571993, -9988483, -13209709, 8826695, 10278930, -21930104, +-24940338, -8179765, -31009128, 9092446, 27727236, -23475218, 26664230, -11804718, -14276471, -26412438, +-37343132, -41752452, -39775156, -20025822, 261993, 15796890, 7296076, 15737297, -20854750, -46612744, +-18339510, -44772348, -79296368, -29702920, 64397128, 110442936, 64655900, -26297012, -21351356, -96963720, +-87351584, 61601644, 10943040, 80726056, 83250960, 86900608, 29351270, -33718176, -42375220, -46963856, +-54166516, -7223598, 54649700, 92560304, 29736742, 10272488, -3818226, -45057964, -66756140, -44533444, +9162776, 64173792, 30021284, 41842644, 33851860, 13041131, -23641110, -25941602, 1598265, -14016626, +5617281, 31841276, 33404108, 25069188, 5313949, 13177497, 1007170, -20070920, 4960151, 9397388, +-2773475, 4464082, -5438503, 45871860, 26668526, 29421600, 17790828, -14629195, -39026756, -55195160, +9059160, 20496658, 38507604, 39103528, 49707804, 24854438, -35660576, -44328356, -54477904, -8723079, +616328, 30920006, 17915920, 10460930, 16879222, -26473104, -80688480, -53451404, -49435072, -10372883, +7256884, 19934554, -4209605, -9821516, -17898740, -21132312, -3553012, 7644505, -24987582, 34979824, +16791712, 31067646, -68302328, 15490873, 9204115, -20984674, 15274514, -15690052, -7792682, -4664872, +-9807558, 29436632, 54138064, -15710453, 10833518, -7511898, 12919798, 27597312, -8500277, -4983773, +-15080167, 7967165, -9602473, -29840896, 21736292, 36910412, -4945655, -19242528, -17781164, -38767984, +-10790568, 29493004, 19891604, 10315975, -42862700, -24755654, -18751828, 37896644, 32730336, 28858422, +-83591336, -55498492, -6870337, 41342280, 88025352, 423591, -106110392, -38858716, 3423089, 35824860, +-3040300, 19704236, 14709726, -46208480, -20402168, -12715251, -27893128, 2018098, -52262236, 8253854, +20512764, -62909460, -40467180, -19550154, -8197482, 69835096, -547071, -106938240, 10154913, 15187004, +16211354, 42273752, 19535658, -45624364, 2170032, -1650341, 91450592, 64717104, -53832048, 49052284, +-28759638, 19583978, 50443316, 18299782, -27886686, 25522306, -11233487, 6641630, 17407502, -1756642, +-18924162, 34761856, -22406844, 25512642, -12021077, 13785771, -4292283, 28000502, -9881109, 22032646, +-38301980, -6462852, -566936, -4887673, 12163884, 23871966, -24387898, 49081276, -19276350, -16724066, +-33494840, 24570972, 51354388, 10296110, -67914704, 5607617, -15362561, 33090576, 16105054, 14991046, +-27365920, -1750736, -17463338, 16549046, -7181722, -10755135, -4101157, 22396644, -5481989, -13582297, +-16898012, 12759274, 1847910, 12165495, -7617662, 439160, -13035226, -827318, -2851322, 6250788, +1789391, 13773960, -3000035, -4007741, -14442901, 9823664, 3364033, 8747238, -48855, -8228621, +-10762114, 3240553, 2488934, 7453916, 23659364, -56435332, 8038568, -41430864, 7578470, 35223564, +31142808, 10218264, -20151986, 4067871, -11965779, -2939368, -14853608, -10964515, 7663296, 2086280, +-21633750, -2465311, 11287174, -2377801, 1291711, 4109747, -13793824, -13653164, -338766, 9082782, +1221381, -21990770, 1855426, 11323144, 3565360, 2654827, 23054310, -2508798, -6124624, 8288213, +8837432, -15551003, -17260936, 12841952, 2495913, -13236552, 8924942, 3889093, 4332012, -9250823, +3754875, 10472741, 1275068, -13029857, 17733920, -2120640, -19850266, 631360, 15558519, 4879083, +-12986370, 11861626, 3933653, -18090940, 7465727, 966368, 18518288, -16738024, 1523640, 12783970, +-29355028, 972810, 12693239, -452582, 8801462, -4847408, -18788334, 2532420, -19881940, 18711562, +9655086, 5302137, -7380365, -7758322, 15440407, -13259101, 13779329, 15160698, -21613886, -6980396, +937914, 16784196, 274341, -9666898, 6213744, -11716134, -693637, 1744294, 9897752, 718333, +1636919, -6032819, 10300405, -3401077, -11997454, 10964515, -4839892, 4754529, -2711735, 7919920, +9954660, -11376295, 2006287, -6142877, 2698850, -6242198, 22124988, -6203544, -12402792, 10028749, +-5583995, -1828046, -6308770, 6576132, 6026376, -8892730, 5009006, 8765491, -4506495, 636729, +-12344810, -28123982, 45632416, 6292664, 20543902, -17999134, 7747048, -4031901, 5373004, 4839892, +-7807177, 2913062, 8238284, -4992363, 18112950, 664646, 452582, 6055367, 5832029, -833224, +-4789963, 7644505, -1342714, -5535139, -1236414, 7683697, -8582955, 1662689, 3701725, -10902774, +13322989, -2814814, -6595459, 20503638, -8614094, -12288975, 9368934, 5113696, -5811091, 8826158, +7055021, -2611340, -3013457, -1724966, 2583960, 5033165, 2909304, -145492, -3668439, 10521596, +-11425687, 10085657, 1491427, -1345935, 2743410, 3128884, 3207267, 362925, -10178536, 2733210, +8588861, -6277095, -127775, -84826, 6519761, -756451, -2668785, 9908490, -5176510, 5281736, +-10454487, -3918084, 9938554, -9628780, 9552007, -2583960, 6257231, 7672422, -8893267, -3067144, +10793790, -9170292, -574452, 1066763, 3198140, 738198, -1336272, 329102, 716723, 4954782, +-4387846, 1036161, 3106872, -392990, -2317672, 489089, 1784022, -504122, 549219, -1967632, +2166811, 3065533, -5578626, -941135, 9383430, -4659503, 2608656, -767189, 5305359, 1464047, +-3088618, 539555, -689879, -3223910, -2291902, 11116449, -2003602, -2632815, 1501091, 1180042, +-972273, 2310156, 4507032, 79994, 1097364, 361314, -1083942, 623844, 1251446, -2197413, +1383516, -204548, 10712722, -37781216, -120830312, -6137509, 65150360, 29242822, 138766640, 11844983, +29326574, 1230508, -40429600, -50955492, -34489660, -62100396, -43421044, -27322434, 1022202, 47426104, +93452584, 68751688, 59871308, 19489488, -32482300, -47766480, -42903504, -50617800, -56092808, -22756348, +-10721312, -4909685, 27436788, 36352068, 27464168, 50821812, 32866164, 12167105, 34153044, 788127, +-14770929, -9808632, -30570504, -62799940, -38118908, -36770824, -37430640, 1947768, 17513266, 12055973, +46198280, 37827388, 26135412, 37204616, 39633960, 11201275, 11922829, -4231080, -34029024, -47392816, +-36145908, -47502340, -33709052, -11810086, -8295730, 2909840, 25917444, 20222316, 18330384, 36489504, +30241402, 22165252, 37768868, 10313290, -7672422, -1582696, -15066208, -32786706, -18986440, -41472740, +-52320756, -30908196, -26004954, -11354283, 30480846, 41019084, 38348152, 44130252, 36408436, 20629264, +19986630, 9625559, -4202089, -11263015, -21001854, -31178242, -31107912, -35283156, -36934572, -31688268, +-10715943, -3779034, 12526809, 31780074, 35502200, 35008816, 41030360, 32531692, 24472186, 20244328, +6736656, -15875273, -28122908, -45986216, -58580668, -54976656, -43457016, -21962316, 5632850, 29387776, +40496708, 46462420, 48568564, 41781440, 29655138, 15029701, -9559523, -23853174, -31381716, -36566276, +-31868120, -24114630, -16514686, -6933151, 7757248, 10098005, 13931800, 15859167, 14251238, 11206643, +9087614, 5993090, 5408975, 2290828, -1725503, -3134253, -3041374, -5001490, -5328444, -7093676, +-8138426, -9179419, -7223598, -5677947, -2936684, -325881, 4667556, 7592429, 9059160, 8913131, +10022306, 8800925, 6479495, 2731599, -1291175, -5437966, -6752763, -7977365, -7904351, -8789651, +-7717520, -5583995, -1465121, 1134408, 3344169, 5185100, 6529424, 6298033, 6855842, 6331319, +5337571, 3164854, 974958, -2584497, -4889284, -6817187, -6794102, -6506339, -5331665, -3772592, +-938450, 598611, 1988570, 3254512, 4522064, 4980015, 4960151, 3805878, 2895882, 1393180, +163209, -1280437, -2283849, -3639985, -3945464, -4173635, -3545496, -2755759, -1115081, 220654, +1824824, 2705830, 2957622, 2472828, 2287070, 1906429, 1676111, 916976, 188979, -734439, +-1352915, -2070711, -2260764, -2221572, -1614908, -959388, -178241, 202400, 667867, 842887, +1013075, 921807, 784905, 541703, 404264, 157303, 9127, -141197, -185757, -218506, +-226023, -214212, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -2823404, -606664, 3182034, -341450, 234076, -4857608, -2471217, 653372, 6309844, -4161287, 1273995, --6667400, 6730751, 391916, 2432025, -835371, 1020592, -1329292, -2384244, -5803038, 2379412, --5817533, -2747169, -3305514, 3218541, 2547453, 1200443, 2657511, 5061082, 282394, -4692789, -3001645, 447213, -268972, 2451353, -972810, -1733556, -6835441, 1051730, -1993402, 1435593, -2801393, -3730716, -1514513, 3303904, 1005022, 350040, -3503083, 8666170, 5204964, 806380, -4169876, 3418794, 3316789, -8010651, 452582, -819265, -2152852, 1908039, 1278290, -1322850, --1530082, -472446, -2425583, 2306398, -941135, 4591320, -212064, -1227824, -2240362, -4099010, --781684, 3079492, -175020, 671626, 3635690, 960999, 4211753, -127238, 605590, -481036, -4531191, 4014721, 4060355, 849867, -42950, 1780801, -129386, 521302, 48855, 164819, --379031, -1311039, -1114007, -277025, -1270774, 543313, 586263, -567473, 1302449, -570157, --427349, -316754, 512175, 112206, 1160178, 62277, -20938, 55298, 1516124, 723165, --156229, -459025, 33823, -259846, 836982, 395137, 1617055, 363998, 2059437, 7208566, --3514357, 2400350, -2006287, -3139621, -1298691, -2176475, 3928285, -3266323, -6060199, -1553168, -1575716, -5046587, -3061238, 5681705, 9813463, -1664837, 3740380, -3378529, -3566970, -164283, -1018444, -439160, -119722, 3642669, -6251862, 2028298, -478889, -1311039, -5274220, 453119, -103079, 2957085, 865973, -4115116, 5402532, -4319664, 5039608, -571231, 896574, 2055679, --616865, -2534031, 3934727, 971200, 5264556, 803696, -4685273, 8453569, 6698002, -2343979, --713501, -1628866, -5900212, -3177739, -992137, -1011465, 2348273, -3234110, 235686, 2318209, --14496, -88047, -399969, -554588, -3233574, 5113159, 140123, -109522, -1636383, -568546, --4714801, -4169340, 1356136, 3413962, -453656, -883153, -27380, -33286, -2426657, 4583267, -603443, 1518271, -1214402, 1252520, 762357, -187368, -105227, -198105, 40802, 1088774, --624381, 690953, 713501, -138513, -206695, 572304, 1203665, 1097901, -804233, 307627, -355945, -600759, -362388, 1724429, -263067, -79994, -1370632, -1235340, -2093797, -762894, --7494718, 9299141, -1989107, -1057099, 6652368, -2556579, 3445101, 14747307, -1735704, 470836, --5600101, -4514548, -6984154, 4097399, -2867965, 2018098, 3892851, -4384625, -3744675, -2734284, -344134, 1482301, -5425618, -2105071, 2410014, 2076617, -2135673, -855235, 3358128, -3406446, -563178, -1676111, -594853, -2361158, 2069101, -2163590, 933619, 1986959, -874026, 6219650, -287763, -805843, -4546223, 579284, 6641630, 947577, 2260227, -6019934, -8616241, -3106872, --7408819, -6533719, -145492, -2800319, -230854, -7932805, 6842420, -7341710, 1111860, 5090073, --4537633, -7672422, -5454609, -1583232, 5146982, 4578435, 6878927, -3996467, -3511673, -2799782, --2400350, 4992900, 1305670, -2012192, -1067299, 2396592, 2715493, 854162, 1269163, 1758252, --340913, -2811056, -430570, -1846836, 747861, 287763, 660888, 609885, 185757, 1240172, -196495, 1439888, 176094, -1006633, 1462973, -1603097, -1034550, 379568, -392990, 1475858, --826781, -604517, -243203, 238908, -518080, -939524, 957778, -260919, 718333, -784368, --756988, -937377, -1100585, -667331, -996969, 1552094, -1285806, 8017094, 829466, -3230352, -451508, -2675228, -597537, 5607617, 9413495, -3226057, -3296924, -8551280, 1079647, 2137283, -4859756, -3230889, 5240934, 820876, 8071854, -6487548, 1037235, -12242804, -1348083, 1450625, --2990371, -2763275, -1081258, 4495757, -3693135, -6443525, 1823751, -9448391, -2057826, -4546223, -2080375, -1018981, 3191161, 404801, -7193534, -7784628, 212601, 4122095, 7691213, -1544041, --3130494, 6425271, -7104950, -3881577, 3428458, 3045132, 5090610, -4876936, 180926, 1950452, --3065533, -1051193, 3006477, -4429185, 5745593, -2518462, -1068910, -6150393, -5096516, 2443300, --12885, 96637, -867047, -3782793, 3558381, -2385318, 4425427, -96637, -5855114, -6163278, -2246805, -3110093, 1096827, -8765491, -8351027, -1353989, 7859254, 33823, -1621350, 369367, -1132261, 817118, -361314, 1232119, -4099010, 741956, 690416, 1219771, 1576790, 1728188, -921807, -2321967, 165893, 2001992, 933082, 521302, -1147293, -1429150, 323196, -29528, --474057, 1876364, -41339, -159988, -1324461, 2347200, 1954210, -144955, 166967, -1198296, -679142, 711354, 324270, 76773, 775778, -1087701, -565325, 4747013, -13127031, 2973728, --5735392, 4745402, 5432060, -6237367, -11515881, 1551557, -1588601, 7200513, -4419522, 10453950, --4486094, 6896644, -8662949, -3249143, 3536369, 5112085, 1391033, -97711, -5336497, -754841, --4211216, -5253819, 2821257, -4493073, 1676111, 955093, 2078764, -2581812, 4835060, -981400, -4153770, -1013612, -8119099, -1408749, -2636036, 751082, 7993471, 443455, -749472, -483184, --3319473, 2721399, -3132642, 4186519, 4543539, 1606318, 1713692, 8046621, -2063732, -1530082, --6544457, 4556961, 4022237, 793495, 995896, 789200, 286152, 2309619, 4888747, 3237869, -1831804, 1736241, -1311039, 6380711, 2146947, -1393180, -5004174, 2451353, -1522029, 9346386, -5291937, 1124745, -4388920, -1683627, 7122130, -2849711, 892279, 4093641, -2359548, -2951716, --5740224, 658741, 2036888, -514859, 2694555, -2293513, -879395, -1802276, 1966021, -238371, --674847, -2797098, 615254, 634045, 1600412, 1867774, -692564, 252866, 2098629, -232465, -2130841, -220117, 620086, 3120831, 626528, 3208878, -281857, -787590, -237834, -358093, -78920, 159988, -2504503, 844498, 1951526, 133144, 769873, -671089, -16847010, -9156333, -3373697, -3299609, 6764037, 6745246, 10189810, 4206921, 4117800, 2502355, -12279311, -2761127, --1705102, 1085016, -1236951, 3802120, 2705293, -4734665, -3774740, 3133716, 5967857, 7518877, -6491843, 8542690, -4700305, -4705137, -6230924, 6580964, -3825742, 5433134, -1388348, -307090, --5835250, -3515968, -3340948, 4931160, 6101001, 1052804, 6099391, 8713952, -3479461, 2183454, -10250476, -5185636, 3323231, 3451006, 378494, 7683697, 9877888, 7486128, 17136382, 3154654, --2439005, -3204583, -2943663, -217433, 3012383, 5165772, -952946, -1712081, -1817845, -4627291, -1925219, 2448668, 4438849, -10735808, -1472100, 2670933, 7096360, 4914517, -9142912, -6808597, -1724966, 1672353, 7405598, -6561100, 410169, -697932, 783295, -9320616, -2512556, -3236795, --2253784, -3854733, -1603097, 251792, 3563749, -48318, 201327, 1348083, 1705639, -3587372, --558883, 222801, 16643, 1224066, -1220845, -2360085, -1568737, -1812476, 2526515, -2469606, --1165010, -2836289, 704912, -642635, 1799054, -2600603, 1078574, -910533, 1060320, 912144, -187368, 2170569, -2097018, 1046898, 1225676, 324270, 2589329, 4055523, 8126078, -1059783, -1654099, 6947647, 10201621, 5743445, -11275900, 31675, -11996381, -8507256, -5157719, -1000727, --7344394, 8753680, 3230889, 5180268, -14922327, -1073205, 9745818, 4958540, -4385699, -6272263, --3838627, 3801583, -11419244, -667331, -7342247, 11225971, -1489280, -3284039, 1186485, -402116, --1935420, 1981054, -2977486, 5213017, 3697430, 7493644, -566399, 382252, 11556146, -3660386, -7731478, -1257889, -1372242, 20376398, 2415919, -2185065, -4613332, -15762530, 1649804, -16154983, --2731062, 17009682, -4812511, -3307125, -11833172, -3467112, 408022, -6354941, 3404299, -618475, --8676371, 9204115, 3280818, 2996277, 2520072, -6411313, 7018514, -10988137, 3164317, 4218732, -449898, -1456531, -4460861, -3495567, -4543539, -1454920, 3635153, 4693863, -1198833, -3843459, --2288681, 5232344, 2134062, 10017474, -190052, 753767, 4064650, -418222, -1860258, -1389959, --1280974, -1108102, -1667521, 1174674, -1902134, -75162, 2027761, 747324, 2067490, 2008434, -1599875, 177167, 3008088, 2183454, 1288490, 924492, 899796, -3164854, -2699387, 2288144, -310311, -1954747, 330176, -2222646, 624381, 2524904, 906775, -434865, 913217, 2163053, -469225, -1768990, 854699, 6581501, -13445395, 5712307, -4782446, -6828461, -6511708, 5026723, -6440841, 3729642, 11212012, 8255464, 1622424, 3332895, -8894340, 1732482, 3919695, 8681740, -1633161, -4253092, 3135326, 4024384, -7977902, 1097364, -8181376, 6280316, 5719823, 7378217, --7286949, 4359929, 7907572, -3658775, 1997697, 10514080, -382789, -6601365, -5267778, 2300492, --1807108, -6707665, -2793876, 70330, 1494112, 3557844, -4641786, 7323456, 4428112, -1740536, -8848170, -1152125, 3320547, 11619497, -12461311, 22841710, -10593000, 3095598, 6847789, -2440615, --1331977, 2847563, 15451682, -896038, -2201171, -512712, -3736085, 7484518, 8398272, -2755222, -3562675, 2955474, 2703145, 5125507, 6603512, 500901, 7145752, 1504312, -6233072, -9562208, -2223719, 890669, 4314295, 1816771, 14303852, -1494112, 7968238, 6419903, -4496294, -8223252, --1006096, 883690, 2075543, -2263985, 3647501, 1695438, -3569118, -1007170, -3408594, -1279900, -2052458, -1122597, 3051038, -824097, 1067836, 753230, -1478543, 1599875, 1837172, -2894808, -1877975, 1238024, 560493, 638876, -136365, 515933, 3398930, 1032940, -1251983, 585189, -911607, 1664837, 2083596, -683974, -2405719, -720481, -2104534, -1590212, 2512556, 2302639, -2961917, 7598334, 10007274, 6150393, -10654203, 20393578, -6428493, 3860102, -14981383, 5942088, --13251048, 10246181, 1049583, -2855617, -7504382, 9686762, 1283658, 6177774, 6373732, 3269544, --11165841, 5694590, -6765111, -1243930, 5015448, 5465883, 1257352, -2079301, -11190000, 1552631, -10275172, 1146219, 6645388, 7448547, -11685532, 6424198, -5951214, -5859409, 8590471, 9535901, -4935455, 5366025, 1466731, 5144297, -12046310, -5364951, -3862249, 346282, 12779675, 6146098, -5048734, -944893, 5603322, -285078, 14075682, 5207648, 5321465, 2159295, -816044, -20859582, -7706245, 4936528, -1961190, -1473711, -15610596, 148176, -5987185, 3728032, 13536126, -2274722, --7798587, 15825881, -742493, 8939438, -5307506, 57982, -9905268, -910533, 155693, -17095044, --5120138, -2946885, -7724499, -3564286, -1547799, 1080184, 8531416, 635655, -238908, -1652489, --4452808, -708670, 758062, -1622961, 575526, 212601, 2261837, -4008815, -1612223, -534723, --3725884, 202937, -2426657, -1508607, -1240172, -2982855, -1566589, 3500935, -1199907, 625455, --985695, 3795141, -199716, 1720671, -2492155, -5549635, -1712618, -240518, 2371896, 1002875, -3390340, -226560, -1109712, 2905009, -3567507, 4238596, -115427, 13352516, -11515881, 1670742, -4852776, 6036577, -19982336, 13251048, 3699041, -14209362, -9088151, 7742216, 17794050, -6276021, --3240553, -12303471, 25478282, 9891310, 1581085, 4237522, -13386876, -8672613, -567473, 1104344, -13214004, 2859911, 10186052, 11449309, -504122, 703838, 7975755, -2109903, -8515310, -8145943, --2074469, 11335492, -6131066, 14341970, -6658810, 21064130, 9367861, 16988206, -4605279, 2743410, -13635984, -10622528, 6355478, 6149320, 5783174, -6085432, 7261179, 1753420, 2314987, 6195491, -12968117, 10900627, -11066520, -2592550, 5697811, -10797548, -6857989, -2854006, -22090628, 5908802, --10919954, -6849399, 2130304, -2740726, 7561827, 14078366, 9025337, 5691369, -7603703, -1798518, --461709, -14947023, 2732673, 1269163, 18476950, 3976066, 4157528, -4003983, 14276471, -127775, --406948, 44023, -4641786, -2122251, 601832, -850404, -5029407, 467078, -1290638, 913217, --5997922, -6508486, -2132451, 5196374, -854699, 2027225, 1975685, 1610613, -416612, -1370095, --1785633, -3600256, -6008659, 2079301, 331249, -1461900, -7098507, 5258114, 3593277, 2045478, --566399, 462783, -2399276, 1807644, -1252520, -2318746, 864899, 3063386, 1872069, -1850594, --421981, -730681, 2279554, -15912317, -23484882, 12710956, -9561134, 10422812, 3410741, 5047661, -6172405, -15775415, -28704340, 2546379, 4154844, 16180216, -15946677, -17482664, 15093589, -6023692, -6866579, -3294240, 3595425, 2397129, 3980898, -7960722, 3848291, -1144609, -2493229, 9975598, -3724811, -1430761, -12950400, -1764695, -370441, -2382633, -617938, -7005629, -17178258, -7632157, -12610024, -5368172, 6218039, -9735617, 7215008, 3720516, -129386, -4901095, -21307332, 11781632, -11433740, 14703821, -10281615, -4355097, 19981798, 17663590, 8159901, 3799972, 11293080, 4158065, -10147397, -5443334, 8814347, -16843788, -1070521, 4704600, -4386236, 20053740, 781684, 10967736, --6537477, -10771778, 23172960, -386010, 9198746, -3061775, 328028, -27249956, -2294050, 5802501, --10517301, 12845173, 9738301, 2404108, -5576478, -20755966, -442919, -4216584, 5174362, 6313602, -1053878, -2522220, 4884452, 222801, 2399813, -1312649, -6279242, -2290291, -5733782, 10051297, -3082713, -198105, -208843, 1263257, 9279814, -1598802, -2223183, 1439351, -727997, 123480, -4162897, 2277407, 3741990, -2673617, -350577, -4286378, 834834, 75699, 3918621, 3923990, --4342749, 7012608, 7122130, -5553393, 433792, 921271, -805843, -11775190, -15426449, -4479114, --3613678, -26416196, -24779814, -6492380, 120259, 18651432, 15171972, 15015743, -5807333, -2414309, --3759170, 16033113, 6889128, -6727530, -1190243, -5356361, 11595875, 9000104, -6694244, -9374303, --8603893, -17573396, 7339026, 489626, 497679, 3835406, -2628520, 6663642, 24712704, -14068165, -7450695, 1474248, -9526237, -5455682, -11310260, 4287451, -5027259, -5683316, 12795781, 1570884, --4269198, 12919798, -1758252, -5705864, 4495757, 9425843, -5190468, 10129680, 18196166, 17549236, --11997454, -168577, 4383551, 9888625, -15193447, -3167539, -4196720, 18927920, 8065949, -2043331, --11514807, -12779675, -11361262, 17093432, 14156212, -27087284, -22599044, -17140678, -12072079, 4083440, --10888279, 6607271, 1802813, 2683818, -21791054, -6988449, 19696184, 15189689, -6602439, -13987098, -13605383, 7126425, -1640678, 221191, -1739462, -3320547, 7730941, -6943352, 1689533, 1182727, --292595, -5019743, -9154186, 1760937, 7431367, -736587, 812823, -3204583, 7057168, 7721815, -754841, -1033477, 2600066, -286152, 3118683, 3360275, 4860829, -6545530, -636729, 2382633, --8053, -4067334, 1080184, 8182450, 7617662, -2918967, 5835250, -8961986, 2232846, -2901787, --2493229, -3599183, -5601711, 2080912, 21873194, 17247514, 10717017, 1695975, -14231911, -7374459, --2170569, 5906117, 9100499, -12587475, 3317325, 823560, -10752987, -5064304, 8721468, -6372121, -6937446, 3011846, 8152922, -10031970, -13959, -22449258, 3396246, -28404766, 11726334, 11602854, --11025181, 13095892, 15592342, 495532, 4453881, -18301392, 10836202, 1116692, -7594039, 9978283, --2330020, 179315, -161598, 1254667, 19178640, -2128156, -17180, 23549306, -224949, -10824928, --31052614, -25511032, 28399934, 17710834, 7005092, 7176891, -11868605, -23907936, -11751031, 3820910, --9185324, 18748606, -994285, 2516851, 20205136, -4116726, -6265284, -4512400, -12713640, -21579526, --17149268, 48868676, -23711440, -10711648, 14021458, -24707336, -17805860, 17744658, 24852828, 8212515, --4511327, 29261612, 14130442, -23488102, -8149164, -13103945, -12800076, 26607322, 1933272, -17674328, --12222403, -13749264, 3889630, -2811056, 8115341, -165893, -4076461, -6430640, 608275, 7390565, --3948149, 3434363, -3845606, 3699578, 3346317, 10280541, -3978750, -1457605, 8803072, 737124, -4505958, 4615479, 6287296, 1214939, -3655017, -2022930, -926102, -1432909, 3861713, -1153199, --4094715, 8298951, 8553964, -4669703, 2196339, -5322002, 1962263, 2046552, 5288179, -1294933, --500901, -2607045, 2531883, 5944772, -20065550, -14812268, -10340134, -18363670, -1665374, 17376364, --1271847, 3565360, 8546985, 5670431, -14784888, -7162395, -12220793, -6547141, 15646566, -4793721, --1719598, -2157147, 9482751, 9458592, 28247464, 4492536, 20790326, -1225139, 7008313, -11340324, --8544837, 7445326, -14430016, -16039018, 513785, 5041755, -8238821, 6572911, -9643812, 2930778, --25355876, 14139569, 7905424, 11563663, 1430224, -10313290, -21246666, -7581691, -1905355, 17498770, --13347148, -7901129, 4878546, 40029096, -11078331, 40693204, -24980604, 9852118, -9218610, 17853106, --7095823, 30873298, -29057602, 44217764, -4195110, 9088151, 19128710, -32804960, 29229936, -35038880, -23630910, -57089780, 30933428, -29351806, 25990458, -38290172, 33642480, 1125281, 21802864, 9434433, --17863306, 15518254, -12794708, 38670276, -17630840, 6358699, -23091354, 6240588, -1558536, 4230006, --8266739, 10726681, -10612327, 7595650, -3768297, 2440615, 3243237, 3406446, 4467840, -2644089, --6110665, -4960687, -5855651, -13434658, 7741679, 1974611, -9237401, -4304631, -2800856, 5963025, --10281078, 9750650, -7878044, 1932198, -4230006, 4734665, 1573569, -107911, 14814953, -13153874, -8011188, -12709882, 19110456, -3655017, 18670222, -7377680, 5822902, 8425652, 2814277, 2894271, --28454, 8929237, -13362180, 14619532, -10191957, 9615358, -2174327, 57445, -3871376, 134755, -790811, -3788161, 1775432, 3494493, 1713155, -17594334, -15943455, 18514530, 31947040, -26500486, -40503688, -2368138, -27917, -1571958, 7014219, -12072616, -8883603, -18079128, -4063576, 566936, -16643, -106837, 15905875, 2715493, 17440252, 17083770, -10897943, 6279779, 36400384, 11890080, -7777112, 5453535, -31619550, 1599875, -5146445, -3969624, -29001230, -6138582, 16627429, 4694936, -5512054, 8366060, 21072720, 5495948, -6535330, -2170569, -1844152, 7905424, -14384919, -8843875, -21758842, 13512504, 10117869, 16832514, 12412455, -7336878, -3703873, -25127706, -11064373, 10215580, -8033737, 18966576, -13700946, -6812355, -4825396, 13943074, 8132521, 12517682, 5138392, -9912785, --9231495, 31367220, -9624485, -30476552, 7015829, 22050898, 15079093, -397821, -2667712, 2727304, -5019743, 3122441, 27986006, -33738580, -28847684, 3357591, 11348914, -14515916, -7526930, 2464774, --11462194, 5424544, -5617817, -1429687, 2981244, -2179696, -7711077, 296890, 6351720, -4094178, -35970, -11158862, -1981591, -9816148, 7201050, -3112241, 6602439, -3989488, 4116726, 1735704, -5568962, 8762270, -8895951, -3966402, -2673080, 6912213, -4327717, -8002598, -14717779, -36507, --5895380, -2179696, 2209761, 1484985, 394600, 2900177, 4789426, -930397, 14799384, 1847373, --1210644, -11454678, 1963874, -2094333, -668941, 2820720, -12044162, -6117107, -12439836, -64132988, -17700098, -7830799, -4088809, 15709380, -10886131, 16858284, -2290291, -27804008, -5084705, 2681133, -9736691, 12388296, 2870112, -19710678, 19470160, -7665443, -1789928, -12121471, -5458904, 10428181, --2105608, 9300215, 15697032, -3659312, -20308216, 4480725, 22253300, -20755966, 7612830, 17265768, --3159485, -13736379, -25604984, -17288318, 18038326, 46244448, -14259828, -18477486, 52114060, -3427384, --7518341, 37495600, 21831318, 18620830, 15052250, 6162205, -11040750, 19039590, 17741974, 12212203, -5653788, -34514896, 21537114, 19051938, -36427764, -21079700, -13093745, -10217190, -10041097, 39726300, -19835770, -22739168, 21235928, -8427263, -21254182, 9239548, 10805601, -9402757, -9010305, -33350422, -3745212, 5681168, 24380918, 11668889, 3016141, 20376398, -16203301, 42165304, -44836236, -52312164, -36922760, -22582938, -1400159, 25888990, -16319265, -11241003, -3228742, -3091840, 3221762, 15881715, -7803419, -13018046, -796180, 6181532, -1553704, 8822937, -347355, 4876399, 956704, -6910066, -3709778, 14097156, 9714679, -617938, 1891933, 9427453, -1511829, -1122597, 2396592, 21837762, -11213623, -3505767, 4780836, -19362786, -840740, 5115306, -8910983, -12001212, 11337103, -5184026, --325881, 11656541, -10100689, 4491462, -1716376, -2881923, 14467060, -8159364, -1939178, -16961362, --69671888, 21549462, 39443368, -24302536, -4992900, -18877992, 40577240, 27322434, 17179870, -3136400, --14079440, 3002719, 16400869, 7693360, -6966437, -1454383, 22404160, -1373853, -8151311, -29822106, --14111652, 25334938, 14744086, -15823196, 12822625, -11430519, -3585761, 7669201, 7171522, -6846715, -4653597, -26128970, 7573101, 35555888, -4443144, -6810208, -34783868, -20844550, 16962436, -27385248, --14874545, 6388227, 7047505, -8400419, 22892176, 21654152, -22140556, 8388071, 12425340, 35831300, -32785096, -5073967, 10761577, -770947, 37474664, 16367047, 15229417, 35561792, -15780247, -23062900, --11814381, -29552060, 25062208, 11901891, 12270722, 6600291, 42492796, -27993524, -6509023, 18232136, --9970767, 20222316, -920734, 2463164, 9412958, -24426552, -37155224, 4799089, 7217693, 41036264, -31191664, 865436, -30138860, -4659503, -32923072, -76236, -987843, -9146133, -8393440, 4593468, --2793339, -2365453, -8305930, -5319854, -7370164, -4311611, 1201517, -8713415, -8005282, -1222455, -8294656, 4326106, -10657961, 9868224, -5367636, 18210662, -5595806, -15954193, -5829345, 8134668, --4919348, -12069395, 14010183, -2870649, -12643310, -19553376, 3121368, -3031710, 2397666, 4486094, --7479149, -6331319, -17144436, -3688840, -4460861, 1351304, 3287798, 6488622, 5608154, -12985834, -155693, -16462073, -5974300, 1804423, 1871532, 16173236, 27514098, 24012088, 24739548, 31856310, --18404472, 25082072, -49142480, -21498996, 18538152, 4370129, 35813048, 16326244, 30533996, -13353053, -4000225, -26593364, 17969070, 29698088, 27006754, 2680060, 19126026, -47201152, -30757872, 29222958, -8472897, -29438780, -15236396, 3546032, 43193948, 13305272, -17655000, -22260816, 4347581, -6535330, -26543972, 28666222, -2896419, -4723927, 5645198, -8206072, 34345244, 9828496, -8222178, 6869264, --16437914, -9783399, -77154792, -26273388, 13678397, -12130598, -11602854, -450972, -13973139, -14002667, -35268660, 23564338, -17862232, 32142462, 66728760, 13649406, 47511464, 6490233, 9604084, 34812856, -22990960, -18892488, -21387864, -37625524, -23393614, -2564632, -37090264, 13623099, -4522601, -35953172, --25775710, -25757456, -32297618, -19670950, -13019120, -17254494, 5005785, 30474404, 37281388, 19574850, --3950833, -27354110, -3541201, 949725, 2253247, -13385266, -2441689, -9078487, 7227893, 10402948, -1096290, 7585449, -317291, -5413270, 8857833, -9761387, 1145683, 8368207, 18219788, 2388539, --244276, 12209518, 5147519, 32960652, -8369281, -27060978, -1466195, 18036178, 3162170, -7468948, --8287140, -22037478, -20784958, -11877732, -8323110, -3965329, -12511777, -18112950, -19178640, -10628970, --1626719, 2464774, 25210384, 18130130, -6870337, 29255706, 52244520, 36021352, 25398826, 15727633, -9918690, -13072807, -8424578, -13052942, -11729019, -3267933, -941135, 30181272, -3629247, 25592100, --17056388, 6598144, -57732412, 15876883, -9024263, 29219736, -7641284, -34653408, 34242700, -13281113, -4992363, 19360102, 14408542, 31321586, -5119064, 4519916, -6309307, 35752380, -7949985, 6553047, -24813100, -29217588, 24464134, -7525320, 14855218, 23728620, -6749004, 5115306, 3735011, 2209224, --8025684, 10432476, 10101226, -4487704, -14386530, -2855080, -16722992, -5630702, -3402688, 13213467, --7179038, -26423712, -17500382, 27329414, 27628450, -26602490, -22326314, 32775432, 38587060, -15256798, --4089883, 27726162, 894427, 14143327, 20127290, -47261284, -14130442, -3441880, 45324252, 3929895, --3465502, -45048840, 8669928, 17350058, 11312944, 1343788, 11835319, 4383551, 6002217, 56865904, --1971927, 2744484, 33413772, -20403242, 22130356, 3923990, 16647830, 10738492, -26125750, -8806830, -30611306, 20147154, 11599096, -7573101, 10567230, 5119601, -216896, 3833795, 7646653, -4009889, -13231720, -9100499, -2574833, 13604846, 7997229, 2549600, -29268054, 2352568, 14164265, -11176579, -4921496, -26076894, -16561931, 17875118, 8621073, 14653892, 12814572, -10539313, -28471338, -8135742, -9506910, 24390046, 14795089, -3908957, -5615670, -8889509, 20096688, -617938, -4246112, -8507793, -10571525, 4299799, -4588636, -20786032, -13181792, 12797392, 12812424, 9045201, -14327474, -20063402, -9780714, 26007638, 12029667, 1598265, -13335873, -3355980, 5909338, -498753, 285615, 1308891, --3463354, -6214281, 1961190, 6644315, 1867237, 988379, 3077344, 816581, 714038, 1209570, -3242164, 362388, -286689, 2496987, 33086818, -55910812, -3810173, -47302624, -43822088, 11062225, -9314710, 8067023, 1168231, 41771240, 23858544, 53768160, 58893664, -6450504, -28849832, 6162205, --7774428, -5360119, 12829067, 5708012, -4628901, -27067420, -29523606, 32097902, 14921790, -3645354, -5011153, 5221607, 3043521, 5912023, -2935610, -7684770, -43681428, 956704, 25221658, -7373385, --33648384, -11078331, 27795954, -51409148, -17586280, 32489280, 19760070, 38800196, -1032940, 2819109, --35701380, -36151276, -45436996, 38318624, 54368916, -71502616, -35535484, -3754875, 36395552, -28375776, --4532801, 65544960, 26758720, 16615081, 43486008, 31690416, 47730508, -17223892, 47458852, -7234336, --37059664, -54662048, -12716861, 20907364, -43190192, -8500814, 9415105, -9162776, -15144592, 9206799, -8458938, -29800630, 22287122, 10824391, 32342714, -7792145, -31485332, 39361228, 8069170, -35945120, -307627, -8389145, 15075872, -15934329, -16203838, -8407935, -1557999, -557272, -12254079, -15016279, -11750494, -15666430, -10737, -15484431, 8617852, 14634564, 2441689, 21898428, 15193447, -22138946, --8093329, -32212, -19741818, 3287798, -3220689, 7858180, -5091147, 6922951, 19359028, 13959, -3866008, -13509283, 20819854, 13104482, -14447733, -4329864, 14904610, 13817447, -1868848, -21288006, --2580739, -41360000, 32074278, -2589865, 9890236, 12487617, 12095165, 511638, -13862007, 22782654, -5800890, 21994528, -4589173, -46287400, -4097399, 13516262, -15140297, -16871168, -10283762, -15542413, -19022948, -4741107, -16377784, -820876, 17706002, -23523000, 16678432, -8085813, 8931921, -23170812, --5680094, 9555228, -1873680, -2029909, 3002182, 13189308, -2186675, -1996623, -16143708, 8231842, --4335770, 2740189, 5168457, 1836099, 12199318, -17534204, -13353053, 18623516, 16087874, -22048752, -10714870, -17794050, 20811800, -17187922, 7938174, 5466420, -14521284, 32621888, 3300682, -36022428, -16805670, 4506495, -27816892, 15818901, -10120554, 16839494, -24095840, 12571906, -25531970, 11920145, -18421114, -16409996, 9638443, -17444546, 766115, 729071, 1833414, -11416560, 380641, 8935679, --335544, -15733539, 12133819, -9806484, -21201570, 9341554, -9323300, 4791573, 10109816, -7419556, --4404489, 1928440, -1237488, 6597607, -3222299, -2217814, 5929739, 7465727, 2630668, -7226283, --4227859, 7215008, 4406637, -16530792, 15393700, -2043868, -5521181, 2263448, -1017907, 3739843, -8340827, -1875827, 15641197, -4424353, -6545530, -7396471, -2844879, 1628330, -7129109, 2089502, --2298881, -2838437, 2052994, 2641405, -2851858, 70330, -667867, -3092913, 3356517, 2266132, --3375844, 9809168, 20000588, -10193568, -111706192, -201515040, -67036924, -156194000, -154528624, 83120504, -17218524, 115629112, 261337488, 235485536, 193056096, 235827520, 144277616, 32201518, 45320496, -33617784, --175205680, -173144096, -129608688, -168237632, -115404160, -23932632, -77922520, -107443976, -46699180, -13472776, --55904904, -26603028, -1181653, -27955942, -49770080, 10402411, 42821896, -14577119, 59461676, 88911192, -2092723, 17135308, 120197880, 59584620, 636192, 112688128, 92080880, -21654688, 43554728, 105212200, --2103460, 8578123, 148440512, 79753784, 33079838, 179580096, 197829952, 97299800, 187543504, 233316576, -61098056, 31294206, 94934344, -38032472, -113018840, -65927748, -147030688, -260668544, -260181072, -295284896, --393307872, -396089408, -380151840, -388895872, -348046976, -298370304, -239091696, -156690608, -79844512, 38310036, -171604352, 226413488, 276238336, 374259168, 329042272, 294158016, 328540288, 242524448, 113074680, 133015672, -150251376, 55391656, 72312216, 150549872, 73711304, 13664975, 64360620, 57960584, -33617244, -429497, -40072044, -60286308, -76906224, 16911434, -15777025, -25393994, 83626768, 71807560, 6933688, 65237868, -94745368, 16280610, -7783555, 4870493, -98256504, -177180288, -185147456, -236020272, -297016864, -281414848, --251886416, -229454336, -204745392, -150393648, -142765792, -155847184, -104554000, -34390876, 8930311, 38075420, -101494912, 121813328, 137777184, 247362192, 288292160, 266512928, 245753728, 195856416, 123822296, 106148504, -90205584, 55292336, 39353712, 36453536, 14416595, -3268470, -4954245, -10351945, -21728240, -26823682, --22114250, -30316026, -41684268, -39770324, -38636452, -43732968, -44300976, -37630892, -39605504, -37008124, --28435368, -27448062, -29050086, -24123220, -19923816, -19261318, -13589813, -7288560, -5177046, -5042292, --6925098, -7172596, -7733089, -7992934, -6492917, -5804649, -11095511, -17236778, -22021372, -25350508, --27209692, -22492206, -17958332, -17541720, -14499810, -8620536, -6453725, 1058173, 12206297, 18081276, -19878720, 26056492, 29393146, 28156732, 31595390, 36076652, 32991792, 33191508, 37349036, 36407900, -34822520, 35712652, 30326228, 21599928, 15795279, 10532334, 2860985, -3503083, -7540889, -13227962, --18807662, -20139638, -20585242, -21851720, -20174536, -19476066, -21349746, -20744156, -19586124, -18283138, --16120086, -13944685, -11451457, -9069897, -7029788, -4107599, -2130304, -979789, 294742, 1420560, -1697049, 2155000, 2633889, 2876018, 2913062, 3060701, 3073586, 2917894, 2745558, 2698313, -2647311, 2597918, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +606664, 3182034, -341450, 234076, -4857608, -2471217, 653372, 6309844, -4161287, 1273995, +-6667400, 6730751, 391916, 2432025, -835371, 1020592, -1329292, -2384244, -5803038, 2379412, +-5817533, -2747169, -3305514, 3218541, 2547453, 1200443, 2657511, 5061082, 282394, -4692789, +3001645, 447213, -268972, 2451353, -972810, -1733556, -6835441, 1051730, -1993402, 1435593, +2801393, -3730716, -1514513, 3303904, 1005022, 350040, -3503083, 8666170, 5204964, 806380, +4169876, 3418794, 3316789, -8010651, 452582, -819265, -2152852, 1908039, 1278290, -1322850, +-1530082, -472446, -2425583, 2306398, -941135, 4591320, -212064, -1227824, -2240362, -4099010, +-781684, 3079492, -175020, 671626, 3635690, 960999, 4211753, -127238, 605590, -481036, +4531191, 4014721, 4060355, 849867, -42950, 1780801, -129386, 521302, 48855, 164819, +-379031, -1311039, -1114007, -277025, -1270774, 543313, 586263, -567473, 1302449, -570157, +-427349, -316754, 512175, 112206, 1160178, 62277, -20938, 55298, 1516124, 723165, +-156229, -459025, 33823, -259846, 836982, 395137, 1617055, 363998, 2059437, 7208566, +-3514357, 2400350, -2006287, -3139621, -1298691, -2176475, 3928285, -3266323, -6060199, -1553168, +1575716, -5046587, -3061238, 5681705, 9813463, -1664837, 3740380, -3378529, -3566970, -164283, +1018444, -439160, -119722, 3642669, -6251862, 2028298, -478889, -1311039, -5274220, 453119, +103079, 2957085, 865973, -4115116, 5402532, -4319664, 5039608, -571231, 896574, 2055679, +-616865, -2534031, 3934727, 971200, 5264556, 803696, -4685273, 8453569, 6698002, -2343979, +-713501, -1628866, -5900212, -3177739, -992137, -1011465, 2348273, -3234110, 235686, 2318209, +-14496, -88047, -399969, -554588, -3233574, 5113159, 140123, -109522, -1636383, -568546, +-4714801, -4169340, 1356136, 3413962, -453656, -883153, -27380, -33286, -2426657, 4583267, +603443, 1518271, -1214402, 1252520, 762357, -187368, -105227, -198105, 40802, 1088774, +-624381, 690953, 713501, -138513, -206695, 572304, 1203665, 1097901, -804233, 307627, +355945, -600759, -362388, 1724429, -263067, -79994, -1370632, -1235340, -2093797, -762894, +-7494718, 9299141, -1989107, -1057099, 6652368, -2556579, 3445101, 14747307, -1735704, 470836, +-5600101, -4514548, -6984154, 4097399, -2867965, 2018098, 3892851, -4384625, -3744675, -2734284, +344134, 1482301, -5425618, -2105071, 2410014, 2076617, -2135673, -855235, 3358128, -3406446, +563178, -1676111, -594853, -2361158, 2069101, -2163590, 933619, 1986959, -874026, 6219650, +287763, -805843, -4546223, 579284, 6641630, 947577, 2260227, -6019934, -8616241, -3106872, +-7408819, -6533719, -145492, -2800319, -230854, -7932805, 6842420, -7341710, 1111860, 5090073, +-4537633, -7672422, -5454609, -1583232, 5146982, 4578435, 6878927, -3996467, -3511673, -2799782, +-2400350, 4992900, 1305670, -2012192, -1067299, 2396592, 2715493, 854162, 1269163, 1758252, +-340913, -2811056, -430570, -1846836, 747861, 287763, 660888, 609885, 185757, 1240172, +196495, 1439888, 176094, -1006633, 1462973, -1603097, -1034550, 379568, -392990, 1475858, +-826781, -604517, -243203, 238908, -518080, -939524, 957778, -260919, 718333, -784368, +-756988, -937377, -1100585, -667331, -996969, 1552094, -1285806, 8017094, 829466, -3230352, +451508, -2675228, -597537, 5607617, 9413495, -3226057, -3296924, -8551280, 1079647, 2137283, +4859756, -3230889, 5240934, 820876, 8071854, -6487548, 1037235, -12242804, -1348083, 1450625, +-2990371, -2763275, -1081258, 4495757, -3693135, -6443525, 1823751, -9448391, -2057826, -4546223, +2080375, -1018981, 3191161, 404801, -7193534, -7784628, 212601, 4122095, 7691213, -1544041, +-3130494, 6425271, -7104950, -3881577, 3428458, 3045132, 5090610, -4876936, 180926, 1950452, +-3065533, -1051193, 3006477, -4429185, 5745593, -2518462, -1068910, -6150393, -5096516, 2443300, +-12885, 96637, -867047, -3782793, 3558381, -2385318, 4425427, -96637, -5855114, -6163278, +2246805, -3110093, 1096827, -8765491, -8351027, -1353989, 7859254, 33823, -1621350, 369367, +1132261, 817118, -361314, 1232119, -4099010, 741956, 690416, 1219771, 1576790, 1728188, +921807, -2321967, 165893, 2001992, 933082, 521302, -1147293, -1429150, 323196, -29528, +-474057, 1876364, -41339, -159988, -1324461, 2347200, 1954210, -144955, 166967, -1198296, +679142, 711354, 324270, 76773, 775778, -1087701, -565325, 4747013, -13127031, 2973728, +-5735392, 4745402, 5432060, -6237367, -11515881, 1551557, -1588601, 7200513, -4419522, 10453950, +-4486094, 6896644, -8662949, -3249143, 3536369, 5112085, 1391033, -97711, -5336497, -754841, +-4211216, -5253819, 2821257, -4493073, 1676111, 955093, 2078764, -2581812, 4835060, -981400, +4153770, -1013612, -8119099, -1408749, -2636036, 751082, 7993471, 443455, -749472, -483184, +-3319473, 2721399, -3132642, 4186519, 4543539, 1606318, 1713692, 8046621, -2063732, -1530082, +-6544457, 4556961, 4022237, 793495, 995896, 789200, 286152, 2309619, 4888747, 3237869, +1831804, 1736241, -1311039, 6380711, 2146947, -1393180, -5004174, 2451353, -1522029, 9346386, +5291937, 1124745, -4388920, -1683627, 7122130, -2849711, 892279, 4093641, -2359548, -2951716, +-5740224, 658741, 2036888, -514859, 2694555, -2293513, -879395, -1802276, 1966021, -238371, +-674847, -2797098, 615254, 634045, 1600412, 1867774, -692564, 252866, 2098629, -232465, +2130841, -220117, 620086, 3120831, 626528, 3208878, -281857, -787590, -237834, -358093, +78920, 159988, -2504503, 844498, 1951526, 133144, 769873, -671089, -16847010, -9156333, +3373697, -3299609, 6764037, 6745246, 10189810, 4206921, 4117800, 2502355, -12279311, -2761127, +-1705102, 1085016, -1236951, 3802120, 2705293, -4734665, -3774740, 3133716, 5967857, 7518877, +6491843, 8542690, -4700305, -4705137, -6230924, 6580964, -3825742, 5433134, -1388348, -307090, +-5835250, -3515968, -3340948, 4931160, 6101001, 1052804, 6099391, 8713952, -3479461, 2183454, +10250476, -5185636, 3323231, 3451006, 378494, 7683697, 9877888, 7486128, 17136382, 3154654, +-2439005, -3204583, -2943663, -217433, 3012383, 5165772, -952946, -1712081, -1817845, -4627291, +1925219, 2448668, 4438849, -10735808, -1472100, 2670933, 7096360, 4914517, -9142912, -6808597, +1724966, 1672353, 7405598, -6561100, 410169, -697932, 783295, -9320616, -2512556, -3236795, +-2253784, -3854733, -1603097, 251792, 3563749, -48318, 201327, 1348083, 1705639, -3587372, +-558883, 222801, 16643, 1224066, -1220845, -2360085, -1568737, -1812476, 2526515, -2469606, +-1165010, -2836289, 704912, -642635, 1799054, -2600603, 1078574, -910533, 1060320, 912144, +187368, 2170569, -2097018, 1046898, 1225676, 324270, 2589329, 4055523, 8126078, -1059783, +1654099, 6947647, 10201621, 5743445, -11275900, 31675, -11996381, -8507256, -5157719, -1000727, +-7344394, 8753680, 3230889, 5180268, -14922327, -1073205, 9745818, 4958540, -4385699, -6272263, +-3838627, 3801583, -11419244, -667331, -7342247, 11225971, -1489280, -3284039, 1186485, -402116, +-1935420, 1981054, -2977486, 5213017, 3697430, 7493644, -566399, 382252, 11556146, -3660386, +7731478, -1257889, -1372242, 20376398, 2415919, -2185065, -4613332, -15762530, 1649804, -16154983, +-2731062, 17009682, -4812511, -3307125, -11833172, -3467112, 408022, -6354941, 3404299, -618475, +-8676371, 9204115, 3280818, 2996277, 2520072, -6411313, 7018514, -10988137, 3164317, 4218732, +449898, -1456531, -4460861, -3495567, -4543539, -1454920, 3635153, 4693863, -1198833, -3843459, +-2288681, 5232344, 2134062, 10017474, -190052, 753767, 4064650, -418222, -1860258, -1389959, +-1280974, -1108102, -1667521, 1174674, -1902134, -75162, 2027761, 747324, 2067490, 2008434, +1599875, 177167, 3008088, 2183454, 1288490, 924492, 899796, -3164854, -2699387, 2288144, +310311, -1954747, 330176, -2222646, 624381, 2524904, 906775, -434865, 913217, 2163053, +469225, -1768990, 854699, 6581501, -13445395, 5712307, -4782446, -6828461, -6511708, 5026723, +6440841, 3729642, 11212012, 8255464, 1622424, 3332895, -8894340, 1732482, 3919695, 8681740, +1633161, -4253092, 3135326, 4024384, -7977902, 1097364, -8181376, 6280316, 5719823, 7378217, +-7286949, 4359929, 7907572, -3658775, 1997697, 10514080, -382789, -6601365, -5267778, 2300492, +-1807108, -6707665, -2793876, 70330, 1494112, 3557844, -4641786, 7323456, 4428112, -1740536, +8848170, -1152125, 3320547, 11619497, -12461311, 22841710, -10593000, 3095598, 6847789, -2440615, +-1331977, 2847563, 15451682, -896038, -2201171, -512712, -3736085, 7484518, 8398272, -2755222, +3562675, 2955474, 2703145, 5125507, 6603512, 500901, 7145752, 1504312, -6233072, -9562208, +2223719, 890669, 4314295, 1816771, 14303852, -1494112, 7968238, 6419903, -4496294, -8223252, +-1006096, 883690, 2075543, -2263985, 3647501, 1695438, -3569118, -1007170, -3408594, -1279900, +2052458, -1122597, 3051038, -824097, 1067836, 753230, -1478543, 1599875, 1837172, -2894808, +1877975, 1238024, 560493, 638876, -136365, 515933, 3398930, 1032940, -1251983, 585189, +911607, 1664837, 2083596, -683974, -2405719, -720481, -2104534, -1590212, 2512556, 2302639, +2961917, 7598334, 10007274, 6150393, -10654203, 20393578, -6428493, 3860102, -14981383, 5942088, +-13251048, 10246181, 1049583, -2855617, -7504382, 9686762, 1283658, 6177774, 6373732, 3269544, +-11165841, 5694590, -6765111, -1243930, 5015448, 5465883, 1257352, -2079301, -11190000, 1552631, +10275172, 1146219, 6645388, 7448547, -11685532, 6424198, -5951214, -5859409, 8590471, 9535901, +4935455, 5366025, 1466731, 5144297, -12046310, -5364951, -3862249, 346282, 12779675, 6146098, +5048734, -944893, 5603322, -285078, 14075682, 5207648, 5321465, 2159295, -816044, -20859582, +7706245, 4936528, -1961190, -1473711, -15610596, 148176, -5987185, 3728032, 13536126, -2274722, +-7798587, 15825881, -742493, 8939438, -5307506, 57982, -9905268, -910533, 155693, -17095044, +-5120138, -2946885, -7724499, -3564286, -1547799, 1080184, 8531416, 635655, -238908, -1652489, +-4452808, -708670, 758062, -1622961, 575526, 212601, 2261837, -4008815, -1612223, -534723, +-3725884, 202937, -2426657, -1508607, -1240172, -2982855, -1566589, 3500935, -1199907, 625455, +-985695, 3795141, -199716, 1720671, -2492155, -5549635, -1712618, -240518, 2371896, 1002875, +3390340, -226560, -1109712, 2905009, -3567507, 4238596, -115427, 13352516, -11515881, 1670742, +4852776, 6036577, -19982336, 13251048, 3699041, -14209362, -9088151, 7742216, 17794050, -6276021, +-3240553, -12303471, 25478282, 9891310, 1581085, 4237522, -13386876, -8672613, -567473, 1104344, +13214004, 2859911, 10186052, 11449309, -504122, 703838, 7975755, -2109903, -8515310, -8145943, +-2074469, 11335492, -6131066, 14341970, -6658810, 21064130, 9367861, 16988206, -4605279, 2743410, +13635984, -10622528, 6355478, 6149320, 5783174, -6085432, 7261179, 1753420, 2314987, 6195491, +12968117, 10900627, -11066520, -2592550, 5697811, -10797548, -6857989, -2854006, -22090628, 5908802, +-10919954, -6849399, 2130304, -2740726, 7561827, 14078366, 9025337, 5691369, -7603703, -1798518, +-461709, -14947023, 2732673, 1269163, 18476950, 3976066, 4157528, -4003983, 14276471, -127775, +-406948, 44023, -4641786, -2122251, 601832, -850404, -5029407, 467078, -1290638, 913217, +-5997922, -6508486, -2132451, 5196374, -854699, 2027225, 1975685, 1610613, -416612, -1370095, +-1785633, -3600256, -6008659, 2079301, 331249, -1461900, -7098507, 5258114, 3593277, 2045478, +-566399, 462783, -2399276, 1807644, -1252520, -2318746, 864899, 3063386, 1872069, -1850594, +-421981, -730681, 2279554, -15912317, -23484882, 12710956, -9561134, 10422812, 3410741, 5047661, +6172405, -15775415, -28704340, 2546379, 4154844, 16180216, -15946677, -17482664, 15093589, -6023692, +6866579, -3294240, 3595425, 2397129, 3980898, -7960722, 3848291, -1144609, -2493229, 9975598, +3724811, -1430761, -12950400, -1764695, -370441, -2382633, -617938, -7005629, -17178258, -7632157, +12610024, -5368172, 6218039, -9735617, 7215008, 3720516, -129386, -4901095, -21307332, 11781632, +11433740, 14703821, -10281615, -4355097, 19981798, 17663590, 8159901, 3799972, 11293080, 4158065, +10147397, -5443334, 8814347, -16843788, -1070521, 4704600, -4386236, 20053740, 781684, 10967736, +-6537477, -10771778, 23172960, -386010, 9198746, -3061775, 328028, -27249956, -2294050, 5802501, +-10517301, 12845173, 9738301, 2404108, -5576478, -20755966, -442919, -4216584, 5174362, 6313602, +1053878, -2522220, 4884452, 222801, 2399813, -1312649, -6279242, -2290291, -5733782, 10051297, +3082713, -198105, -208843, 1263257, 9279814, -1598802, -2223183, 1439351, -727997, 123480, +4162897, 2277407, 3741990, -2673617, -350577, -4286378, 834834, 75699, 3918621, 3923990, +-4342749, 7012608, 7122130, -5553393, 433792, 921271, -805843, -11775190, -15426449, -4479114, +-3613678, -26416196, -24779814, -6492380, 120259, 18651432, 15171972, 15015743, -5807333, -2414309, +-3759170, 16033113, 6889128, -6727530, -1190243, -5356361, 11595875, 9000104, -6694244, -9374303, +-8603893, -17573396, 7339026, 489626, 497679, 3835406, -2628520, 6663642, 24712704, -14068165, +7450695, 1474248, -9526237, -5455682, -11310260, 4287451, -5027259, -5683316, 12795781, 1570884, +-4269198, 12919798, -1758252, -5705864, 4495757, 9425843, -5190468, 10129680, 18196166, 17549236, +-11997454, -168577, 4383551, 9888625, -15193447, -3167539, -4196720, 18927920, 8065949, -2043331, +-11514807, -12779675, -11361262, 17093432, 14156212, -27087284, -22599044, -17140678, -12072079, 4083440, +-10888279, 6607271, 1802813, 2683818, -21791054, -6988449, 19696184, 15189689, -6602439, -13987098, +13605383, 7126425, -1640678, 221191, -1739462, -3320547, 7730941, -6943352, 1689533, 1182727, +-292595, -5019743, -9154186, 1760937, 7431367, -736587, 812823, -3204583, 7057168, 7721815, +754841, -1033477, 2600066, -286152, 3118683, 3360275, 4860829, -6545530, -636729, 2382633, +-8053, -4067334, 1080184, 8182450, 7617662, -2918967, 5835250, -8961986, 2232846, -2901787, +-2493229, -3599183, -5601711, 2080912, 21873194, 17247514, 10717017, 1695975, -14231911, -7374459, +-2170569, 5906117, 9100499, -12587475, 3317325, 823560, -10752987, -5064304, 8721468, -6372121, +6937446, 3011846, 8152922, -10031970, -13959, -22449258, 3396246, -28404766, 11726334, 11602854, +-11025181, 13095892, 15592342, 495532, 4453881, -18301392, 10836202, 1116692, -7594039, 9978283, +-2330020, 179315, -161598, 1254667, 19178640, -2128156, -17180, 23549306, -224949, -10824928, +-31052614, -25511032, 28399934, 17710834, 7005092, 7176891, -11868605, -23907936, -11751031, 3820910, +-9185324, 18748606, -994285, 2516851, 20205136, -4116726, -6265284, -4512400, -12713640, -21579526, +-17149268, 48868676, -23711440, -10711648, 14021458, -24707336, -17805860, 17744658, 24852828, 8212515, +-4511327, 29261612, 14130442, -23488102, -8149164, -13103945, -12800076, 26607322, 1933272, -17674328, +-12222403, -13749264, 3889630, -2811056, 8115341, -165893, -4076461, -6430640, 608275, 7390565, +-3948149, 3434363, -3845606, 3699578, 3346317, 10280541, -3978750, -1457605, 8803072, 737124, +4505958, 4615479, 6287296, 1214939, -3655017, -2022930, -926102, -1432909, 3861713, -1153199, +-4094715, 8298951, 8553964, -4669703, 2196339, -5322002, 1962263, 2046552, 5288179, -1294933, +-500901, -2607045, 2531883, 5944772, -20065550, -14812268, -10340134, -18363670, -1665374, 17376364, +-1271847, 3565360, 8546985, 5670431, -14784888, -7162395, -12220793, -6547141, 15646566, -4793721, +-1719598, -2157147, 9482751, 9458592, 28247464, 4492536, 20790326, -1225139, 7008313, -11340324, +-8544837, 7445326, -14430016, -16039018, 513785, 5041755, -8238821, 6572911, -9643812, 2930778, +-25355876, 14139569, 7905424, 11563663, 1430224, -10313290, -21246666, -7581691, -1905355, 17498770, +-13347148, -7901129, 4878546, 40029096, -11078331, 40693204, -24980604, 9852118, -9218610, 17853106, +-7095823, 30873298, -29057602, 44217764, -4195110, 9088151, 19128710, -32804960, 29229936, -35038880, +23630910, -57089780, 30933428, -29351806, 25990458, -38290172, 33642480, 1125281, 21802864, 9434433, +-17863306, 15518254, -12794708, 38670276, -17630840, 6358699, -23091354, 6240588, -1558536, 4230006, +-8266739, 10726681, -10612327, 7595650, -3768297, 2440615, 3243237, 3406446, 4467840, -2644089, +-6110665, -4960687, -5855651, -13434658, 7741679, 1974611, -9237401, -4304631, -2800856, 5963025, +-10281078, 9750650, -7878044, 1932198, -4230006, 4734665, 1573569, -107911, 14814953, -13153874, +8011188, -12709882, 19110456, -3655017, 18670222, -7377680, 5822902, 8425652, 2814277, 2894271, +-28454, 8929237, -13362180, 14619532, -10191957, 9615358, -2174327, 57445, -3871376, 134755, +790811, -3788161, 1775432, 3494493, 1713155, -17594334, -15943455, 18514530, 31947040, -26500486, +40503688, -2368138, -27917, -1571958, 7014219, -12072616, -8883603, -18079128, -4063576, 566936, +16643, -106837, 15905875, 2715493, 17440252, 17083770, -10897943, 6279779, 36400384, 11890080, +7777112, 5453535, -31619550, 1599875, -5146445, -3969624, -29001230, -6138582, 16627429, 4694936, +5512054, 8366060, 21072720, 5495948, -6535330, -2170569, -1844152, 7905424, -14384919, -8843875, +21758842, 13512504, 10117869, 16832514, 12412455, -7336878, -3703873, -25127706, -11064373, 10215580, +8033737, 18966576, -13700946, -6812355, -4825396, 13943074, 8132521, 12517682, 5138392, -9912785, +-9231495, 31367220, -9624485, -30476552, 7015829, 22050898, 15079093, -397821, -2667712, 2727304, +5019743, 3122441, 27986006, -33738580, -28847684, 3357591, 11348914, -14515916, -7526930, 2464774, +-11462194, 5424544, -5617817, -1429687, 2981244, -2179696, -7711077, 296890, 6351720, -4094178, +35970, -11158862, -1981591, -9816148, 7201050, -3112241, 6602439, -3989488, 4116726, 1735704, +5568962, 8762270, -8895951, -3966402, -2673080, 6912213, -4327717, -8002598, -14717779, -36507, +-5895380, -2179696, 2209761, 1484985, 394600, 2900177, 4789426, -930397, 14799384, 1847373, +-1210644, -11454678, 1963874, -2094333, -668941, 2820720, -12044162, -6117107, -12439836, -64132988, +17700098, -7830799, -4088809, 15709380, -10886131, 16858284, -2290291, -27804008, -5084705, 2681133, +9736691, 12388296, 2870112, -19710678, 19470160, -7665443, -1789928, -12121471, -5458904, 10428181, +-2105608, 9300215, 15697032, -3659312, -20308216, 4480725, 22253300, -20755966, 7612830, 17265768, +-3159485, -13736379, -25604984, -17288318, 18038326, 46244448, -14259828, -18477486, 52114060, -3427384, +-7518341, 37495600, 21831318, 18620830, 15052250, 6162205, -11040750, 19039590, 17741974, 12212203, +5653788, -34514896, 21537114, 19051938, -36427764, -21079700, -13093745, -10217190, -10041097, 39726300, +19835770, -22739168, 21235928, -8427263, -21254182, 9239548, 10805601, -9402757, -9010305, -33350422, +3745212, 5681168, 24380918, 11668889, 3016141, 20376398, -16203301, 42165304, -44836236, -52312164, +36922760, -22582938, -1400159, 25888990, -16319265, -11241003, -3228742, -3091840, 3221762, 15881715, +7803419, -13018046, -796180, 6181532, -1553704, 8822937, -347355, 4876399, 956704, -6910066, +3709778, 14097156, 9714679, -617938, 1891933, 9427453, -1511829, -1122597, 2396592, 21837762, +11213623, -3505767, 4780836, -19362786, -840740, 5115306, -8910983, -12001212, 11337103, -5184026, +-325881, 11656541, -10100689, 4491462, -1716376, -2881923, 14467060, -8159364, -1939178, -16961362, +-69671888, 21549462, 39443368, -24302536, -4992900, -18877992, 40577240, 27322434, 17179870, -3136400, +-14079440, 3002719, 16400869, 7693360, -6966437, -1454383, 22404160, -1373853, -8151311, -29822106, +-14111652, 25334938, 14744086, -15823196, 12822625, -11430519, -3585761, 7669201, 7171522, -6846715, +4653597, -26128970, 7573101, 35555888, -4443144, -6810208, -34783868, -20844550, 16962436, -27385248, +-14874545, 6388227, 7047505, -8400419, 22892176, 21654152, -22140556, 8388071, 12425340, 35831300, +32785096, -5073967, 10761577, -770947, 37474664, 16367047, 15229417, 35561792, -15780247, -23062900, +-11814381, -29552060, 25062208, 11901891, 12270722, 6600291, 42492796, -27993524, -6509023, 18232136, +-9970767, 20222316, -920734, 2463164, 9412958, -24426552, -37155224, 4799089, 7217693, 41036264, +31191664, 865436, -30138860, -4659503, -32923072, -76236, -987843, -9146133, -8393440, 4593468, +-2793339, -2365453, -8305930, -5319854, -7370164, -4311611, 1201517, -8713415, -8005282, -1222455, +8294656, 4326106, -10657961, 9868224, -5367636, 18210662, -5595806, -15954193, -5829345, 8134668, +-4919348, -12069395, 14010183, -2870649, -12643310, -19553376, 3121368, -3031710, 2397666, 4486094, +-7479149, -6331319, -17144436, -3688840, -4460861, 1351304, 3287798, 6488622, 5608154, -12985834, +155693, -16462073, -5974300, 1804423, 1871532, 16173236, 27514098, 24012088, 24739548, 31856310, +-18404472, 25082072, -49142480, -21498996, 18538152, 4370129, 35813048, 16326244, 30533996, -13353053, +4000225, -26593364, 17969070, 29698088, 27006754, 2680060, 19126026, -47201152, -30757872, 29222958, +8472897, -29438780, -15236396, 3546032, 43193948, 13305272, -17655000, -22260816, 4347581, -6535330, +26543972, 28666222, -2896419, -4723927, 5645198, -8206072, 34345244, 9828496, -8222178, 6869264, +-16437914, -9783399, -77154792, -26273388, 13678397, -12130598, -11602854, -450972, -13973139, -14002667, +35268660, 23564338, -17862232, 32142462, 66728760, 13649406, 47511464, 6490233, 9604084, 34812856, +22990960, -18892488, -21387864, -37625524, -23393614, -2564632, -37090264, 13623099, -4522601, -35953172, +-25775710, -25757456, -32297618, -19670950, -13019120, -17254494, 5005785, 30474404, 37281388, 19574850, +-3950833, -27354110, -3541201, 949725, 2253247, -13385266, -2441689, -9078487, 7227893, 10402948, +1096290, 7585449, -317291, -5413270, 8857833, -9761387, 1145683, 8368207, 18219788, 2388539, +-244276, 12209518, 5147519, 32960652, -8369281, -27060978, -1466195, 18036178, 3162170, -7468948, +-8287140, -22037478, -20784958, -11877732, -8323110, -3965329, -12511777, -18112950, -19178640, -10628970, +-1626719, 2464774, 25210384, 18130130, -6870337, 29255706, 52244520, 36021352, 25398826, 15727633, +9918690, -13072807, -8424578, -13052942, -11729019, -3267933, -941135, 30181272, -3629247, 25592100, +-17056388, 6598144, -57732412, 15876883, -9024263, 29219736, -7641284, -34653408, 34242700, -13281113, +4992363, 19360102, 14408542, 31321586, -5119064, 4519916, -6309307, 35752380, -7949985, 6553047, +24813100, -29217588, 24464134, -7525320, 14855218, 23728620, -6749004, 5115306, 3735011, 2209224, +-8025684, 10432476, 10101226, -4487704, -14386530, -2855080, -16722992, -5630702, -3402688, 13213467, +-7179038, -26423712, -17500382, 27329414, 27628450, -26602490, -22326314, 32775432, 38587060, -15256798, +-4089883, 27726162, 894427, 14143327, 20127290, -47261284, -14130442, -3441880, 45324252, 3929895, +-3465502, -45048840, 8669928, 17350058, 11312944, 1343788, 11835319, 4383551, 6002217, 56865904, +-1971927, 2744484, 33413772, -20403242, 22130356, 3923990, 16647830, 10738492, -26125750, -8806830, +30611306, 20147154, 11599096, -7573101, 10567230, 5119601, -216896, 3833795, 7646653, -4009889, +13231720, -9100499, -2574833, 13604846, 7997229, 2549600, -29268054, 2352568, 14164265, -11176579, +4921496, -26076894, -16561931, 17875118, 8621073, 14653892, 12814572, -10539313, -28471338, -8135742, +9506910, 24390046, 14795089, -3908957, -5615670, -8889509, 20096688, -617938, -4246112, -8507793, +10571525, 4299799, -4588636, -20786032, -13181792, 12797392, 12812424, 9045201, -14327474, -20063402, +9780714, 26007638, 12029667, 1598265, -13335873, -3355980, 5909338, -498753, 285615, 1308891, +-3463354, -6214281, 1961190, 6644315, 1867237, 988379, 3077344, 816581, 714038, 1209570, +3242164, 362388, -286689, 2496987, 33086818, -55910812, -3810173, -47302624, -43822088, 11062225, +9314710, 8067023, 1168231, 41771240, 23858544, 53768160, 58893664, -6450504, -28849832, 6162205, +-7774428, -5360119, 12829067, 5708012, -4628901, -27067420, -29523606, 32097902, 14921790, -3645354, +5011153, 5221607, 3043521, 5912023, -2935610, -7684770, -43681428, 956704, 25221658, -7373385, +-33648384, -11078331, 27795954, -51409148, -17586280, 32489280, 19760070, 38800196, -1032940, 2819109, +-35701380, -36151276, -45436996, 38318624, 54368916, -71502616, -35535484, -3754875, 36395552, -28375776, +-4532801, 65544960, 26758720, 16615081, 43486008, 31690416, 47730508, -17223892, 47458852, -7234336, +-37059664, -54662048, -12716861, 20907364, -43190192, -8500814, 9415105, -9162776, -15144592, 9206799, +8458938, -29800630, 22287122, 10824391, 32342714, -7792145, -31485332, 39361228, 8069170, -35945120, +307627, -8389145, 15075872, -15934329, -16203838, -8407935, -1557999, -557272, -12254079, -15016279, +11750494, -15666430, -10737, -15484431, 8617852, 14634564, 2441689, 21898428, 15193447, -22138946, +-8093329, -32212, -19741818, 3287798, -3220689, 7858180, -5091147, 6922951, 19359028, 13959, +3866008, -13509283, 20819854, 13104482, -14447733, -4329864, 14904610, 13817447, -1868848, -21288006, +-2580739, -41360000, 32074278, -2589865, 9890236, 12487617, 12095165, 511638, -13862007, 22782654, +5800890, 21994528, -4589173, -46287400, -4097399, 13516262, -15140297, -16871168, -10283762, -15542413, +19022948, -4741107, -16377784, -820876, 17706002, -23523000, 16678432, -8085813, 8931921, -23170812, +-5680094, 9555228, -1873680, -2029909, 3002182, 13189308, -2186675, -1996623, -16143708, 8231842, +-4335770, 2740189, 5168457, 1836099, 12199318, -17534204, -13353053, 18623516, 16087874, -22048752, +10714870, -17794050, 20811800, -17187922, 7938174, 5466420, -14521284, 32621888, 3300682, -36022428, +16805670, 4506495, -27816892, 15818901, -10120554, 16839494, -24095840, 12571906, -25531970, 11920145, +18421114, -16409996, 9638443, -17444546, 766115, 729071, 1833414, -11416560, 380641, 8935679, +-335544, -15733539, 12133819, -9806484, -21201570, 9341554, -9323300, 4791573, 10109816, -7419556, +-4404489, 1928440, -1237488, 6597607, -3222299, -2217814, 5929739, 7465727, 2630668, -7226283, +-4227859, 7215008, 4406637, -16530792, 15393700, -2043868, -5521181, 2263448, -1017907, 3739843, +8340827, -1875827, 15641197, -4424353, -6545530, -7396471, -2844879, 1628330, -7129109, 2089502, +-2298881, -2838437, 2052994, 2641405, -2851858, 70330, -667867, -3092913, 3356517, 2266132, +-3375844, 9809168, 20000588, -10193568, -111706192, -201515040, -67036924, -156194000, -154528624, 83120504, +17218524, 115629112, 261337488, 235485536, 193056096, 235827520, 144277616, 32201518, 45320496, -33617784, +-175205680, -173144096, -129608688, -168237632, -115404160, -23932632, -77922520, -107443976, -46699180, -13472776, +-55904904, -26603028, -1181653, -27955942, -49770080, 10402411, 42821896, -14577119, 59461676, 88911192, +2092723, 17135308, 120197880, 59584620, 636192, 112688128, 92080880, -21654688, 43554728, 105212200, +-2103460, 8578123, 148440512, 79753784, 33079838, 179580096, 197829952, 97299800, 187543504, 233316576, +61098056, 31294206, 94934344, -38032472, -113018840, -65927748, -147030688, -260668544, -260181072, -295284896, +-393307872, -396089408, -380151840, -388895872, -348046976, -298370304, -239091696, -156690608, -79844512, 38310036, +171604352, 226413488, 276238336, 374259168, 329042272, 294158016, 328540288, 242524448, 113074680, 133015672, +150251376, 55391656, 72312216, 150549872, 73711304, 13664975, 64360620, 57960584, -33617244, -429497, +40072044, -60286308, -76906224, 16911434, -15777025, -25393994, 83626768, 71807560, 6933688, 65237868, +94745368, 16280610, -7783555, 4870493, -98256504, -177180288, -185147456, -236020272, -297016864, -281414848, +-251886416, -229454336, -204745392, -150393648, -142765792, -155847184, -104554000, -34390876, 8930311, 38075420, +101494912, 121813328, 137777184, 247362192, 288292160, 266512928, 245753728, 195856416, 123822296, 106148504, +90205584, 55292336, 39353712, 36453536, 14416595, -3268470, -4954245, -10351945, -21728240, -26823682, +-22114250, -30316026, -41684268, -39770324, -38636452, -43732968, -44300976, -37630892, -39605504, -37008124, +-28435368, -27448062, -29050086, -24123220, -19923816, -19261318, -13589813, -7288560, -5177046, -5042292, +-6925098, -7172596, -7733089, -7992934, -6492917, -5804649, -11095511, -17236778, -22021372, -25350508, +-27209692, -22492206, -17958332, -17541720, -14499810, -8620536, -6453725, 1058173, 12206297, 18081276, +19878720, 26056492, 29393146, 28156732, 31595390, 36076652, 32991792, 33191508, 37349036, 36407900, +34822520, 35712652, 30326228, 21599928, 15795279, 10532334, 2860985, -3503083, -7540889, -13227962, +-18807662, -20139638, -20585242, -21851720, -20174536, -19476066, -21349746, -20744156, -19586124, -18283138, +-16120086, -13944685, -11451457, -9069897, -7029788, -4107599, -2130304, -979789, 294742, 1420560, +1697049, 2155000, 2633889, 2876018, 2913062, 3060701, 3073586, 2917894, 2745558, 2698313, +2647311, 2597918, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -8483634, -933082, 5575942, 1903744, 3631932, -5309117, -2911988, 236223, -944893, 1418413, 4414690, --10631655, -79994, 3491272, 2092723, 3217468, -3083250, -4298189, 4639102, -80531, 1288490, -2893734, 3837017, 1415729, 795106, 3455838, -518080, -1108638, -2995203, 1607928, -848793, --487479, -1559610, 1986422, 5048197, 20401, -1059246, 2379412, -3243774, -4839892, -2684355, --980863, -3148748, 282931, -735513, 2033130, -1968706, 565325, -3937948, -376883, -3240553, --153008, -1489817, -1273995, 1633698, -1861868, -200790, 2660732, -1409286, 3172907, 3830574, -281857, 5181341, -2653216, -189515, 2486786, -911070, 1679332, 2347737, 1279363, -2745021, -1080184, 1236951, 883690, 153008, -2279017, 3016678, -812286, 1433982, -492848, -642635, -197032, -3169149, -253940, -2465848, -1136019, -123480, -420370, -99858, -236760, -1333587, -1575716, 166430, 447213, 92879, 883690, -551903, 1115081, -99321, 480499, -199179, --471910, 605054, 70867, -204011, -3221, 861141, 199716, -173409, 554588, 264677, --101469, 14155675, -3929895, 1413044, -3022583, -197569, -1232656, 1678259, 1146756, 4889284, -1537061, 899796, 1923072, -1116155, -9695352, -9273371, -2864743, 1300301, 2904472, -2312840, -580894, -2978560, -1032940, 206158, 1700807, -4083977, -4457103, -1278827, -239981, 2483028, -846645, -959388, -3204583, 626528, -1744294, 143881, 2323577, -3246995, 1631551, 2983392, --2243047, -6004365, -1534377, 2253247, -314069, 1839320, -249645, 1599339, -235149, 1752347, -377420, -5600638, 1159104, 2363843, -846645, 1618666, 311922, -275952, -1073205, 108448, --3282966, -245350, -867047, -4152160, -661962, -80531, 3780645, -3641596, 6188511, 7195144, -5668820, -2384781, -1093606, -1245541, 2772402, -982474, -1494649, 1756642, -3998078, -3624953, -497142, 3314641, -54224, -1598265, -3570192, -2081985, -2710661, -1400159, -2497524, 1006096, --1476395, -352187, -1551557, -783832, 136902, 905701, 120796, 930397, -539555, 122943, -741419, 420907, 595390, 612033, 374199, -611496, 743566, -13307956, -85899, -2052458, -919660, -460635, -6888591, -1319629, -1452773, 2151242, 3350611, -4615479, 3686693, -1177895, -2541010, 2545305, -1384053, 5536213, 339839, 240518, -959925, 956704, -1373316, 1016297, --1542967, 199716, -3616899, 381715, 3994857, -8053, 1685238, 4195110, -4129074, -4365298, -1823214, -1988570, 3368328, -3412352, -1021665, -7123740, -5478231, -4765266, 2080912, 600222, -2535105, -2597382, -1833414, -551366, 4470524, -4953171, 2046552, 846109, 374736, 2487860, --1715839, -2279554, -2964064, 1797981, 974421, -4387309, -4806606, -5618891, -154082, -1222992, -1833951, -275415, -1047972, 503048, 763430, 2483028, -6682432, 805306, 3821984, 5631239, -5818070, 4774393, -834297, -3563749, 5216775, 1563905, 1022202, -2625299, 1516124, 1047972, -171799, -672162, -1526324, -256087, 1793686, -1404991, -2261837, -960462, -965294, 352724, --176094, -585726, 1566589, 91268, 1996623, -217433, 585726, 1292248, 1261110, 936303, -719944, -825707, -859530, -320512, 802085, -190052, 783832, -577136, 1359357, 1087164, --1151051, 30602, 110595, -1949915, 1461363, -7878044, 4720169, -4225174, 5645198, 7381975, -4563403, -186831, 2117956, 405338, 6027987, -3449396, -3462281, 1653562, -1036698, 2407866, -4616016, -6847252, 2042257, 5949604, 2753074, -542777, -151934, 628676, -2916283, -149787, --2760590, -3814468, -1069984, 5630166, -2254321, 2558727, -2090039, -3610994, 6768332, -6096169, -4510790, 4936528, 897111, 3089692, -4537633, -1322850, -1858110, -1510218, 3102040, 858457, --4872104, 666794, -562641, 794032, -1130650, 1607392, 1548873, 5610838, -6088653, 2771328, -2175938, -717260, 2160906, 518080, 3420405, 3180423, 1987496, -2050310, 2704756, 4838281, --226023, 2786897, -2198487, 5756867, 5961415, 6536940, -2014877, -4779225, 1402844, -768799, -2272575, 1593970, -127238, -472983, -6768869, -1865090, -1648194, -649077, -1468879, -2122788, -2188286, 755377, 621697, 2561411, -260919, 2590939, 1612760, 754304, -481573, 342524, --695785, -1264331, 702227, 76773, 1214402, -523449, 215285, -215822, -988379, 1350230, --157840, -1399623, 416612, 1067836, 38118, -1784022, 309775, -896038, 2170569, 1532230, -1554778, -319438, 409633, 1163399, 30602, 533113, 1062468, 531502, 10890426, -1012002, --3415036, 10357314, -4105452, 4646081, -2501282, -9918690, 1760400, -2860985, 307627, 11866458, --4604205, -5633387, 452045, 6233608, -10048613, -3737695, 7534447, -2658585, 2433636, 3554622, --2689723, 3234110, -2102387, -3488587, 700617, -988916, -1220308, -1296543, 4202089, -3374771, -8181913, 2030983, 179315, -4699231, -1387811, 4992900, -5734855, 1213328, 1993402, -904091, --7997229, 5466420, 1462436, 1338419, 717260, -1111323, 4138738, -2460480, 5656472, 3206730, --2186138, -9762461, 4350265, 2608656, -231391, -2770791, 2367601, 6288906, 6407555, -708670, -3796214, -5758478, 4192962, -1025960, -1970316, 2480881, 4962298, -3482145, 4912906, 869731, --2054068, -1737314, 4012036, -3352759, 9504226, -4889821, 3945464, -3288334, 871878, -2939368, -3815542, -3412352, 190052, 2153926, -636192, 405338, -2908767, -1008780, -380105, 6442, -824097, -1284195, 1671816, -173946, -1122597, 1667521, -3337727, -3404299, -1911261, 47782, --304943, -688805, 125628, -2324651, 2863670, 173946, -156766, 1977833, -1599339, -338229, -2270427, 954020, 817654, 3512210, 3137474, 10137733, 1253057, -2680060, -13184476, 3950296, -7326678, 4347581, 2805151, -1198296, 3679713, 14147085, -1829656, 6488622, 545461, 3590056, -1304060, 170725, 2756295, -1280974, -6183679, -1789391, -4622996, -1264868, -6480032, 2214056, -86973, 7384660, 1364189, -3562139, 2369211, -1145683, -1927367, 4702989, 1618666, 3493956, -1989644, -2152852, -8436390, 431644, 4748087, -414464, -1698660, 2092723, -4504347, -1955821, --7865696, -9701794, 4886599, 5468567, 4236985, -1440962, -1677185, -7516, -259309, 2759517, --586800, 3030100, 2690260, -170725, 2776160, -2749853, 678605, -1487132, 1609002, 2013803, -8942659, -49929, 7300908, -2851322, -7699266, -762894, -1120450, -2963528, 5969468, -555125, -2415382, 494995, -4416300, -5268851, -1924145, -1166084, 495532, 5283884, 1672890, 508954, -2179159, 3524558, -1596654, 2644626, -400506, 2243584, 1364726, 526670, 3112778, -396748, -1785633, 1016834, 883690, -631897, -925029, -1911797, -927713, 1829656, 2807298, -759672, -169651, -1669132, -317291, 71941, -1696512, 1110786, -3119757, 79457, -235149, -45634, -1862405, 1999844, -308701, 4710506, -11614128, -382789, 11820287, 16256988, -6761889, 1825898, -2573222, -5647882, -3304977, 639950, -4722317, -4908611, 11368242, 1593433, -7563438, -1200980, --4942971, -2804077, 7385197, -2323577, -3301219, 6722698, 4129611, 6793028, -2906082, 1403381, -6600828, 299037, -4003447, 1822140, -602906, 834834, -8417599, -5710159, 2478196, -587874, -1966558, -7715909, 3594888, 2834679, 1773285, -13607530, -8007430, -3441880, -1737851, 1945620, --5991480, -3973382, 1296543, 10446971, 6838125, 3707094, -1889249, -1134945, -3987877, 3025268, --1185948, -7711077, -5942624, -703301, -162135, 10945724, 6014565, -5405217, -6094559, 7571491, -1467805, -4548371, 2147, 6796249, 2529736, 213138, -8875550, 9738301, -3467649, 6496675, -8460549, 8962523, 748398, -3291556, -2730526, 4611185, 5225902, -4597226, 3660923, 5011153, -3486440, -1512902, -1231045, 721018, 2989834, 2499671, -2686502, -4077535, -3897146, 1915555, --1895691, -1201517, -2721399, -519154, -1965484, 1001264, -1631551, 1191853, 881542, -297963, --49392, 2206003, -1652489, -3246459, -643171, 3010772, -1861332, -1600949, -1765232, -1206349, --271657, -51003, -2076080, -45634, -1528472, -699543, 494995, 2019172, -1380295, -43487, --491774, -875636, 1792612, 2185065, -3198140, 4770098, -6204081, 6983080, -693100, -1948841, -3690451, -7144141, 2374580, 3820374, 727997, 2655901, 3300146, -1964948, 7784628, -3731253, --13418552, -7998303, -1808181, 480499, -2881923, -5755256, -6296959, -4282620, 13082470, -3687230, --1086090, 1853815, -2779381, 1526324, 10723460, -5224828, 5063767, -3401077, -6976101, 6164889, -4431870, 2822867, 9605157, 177704, 4497368, -460635, 1102733, -416075, -3221762, 2090039, --784905, 6956774, 1348083, -4855998, -1289564, -1427003, -380105, -7891466, 3107946, -7780334, -1833414, 10384694, -6844568, -13062069, 2974802, 1771137, 5925445, -2675228, -169651, 6062347, --3809099, 2954401, 4446902, 1228361, -2780991, 5986111, 1250909, 7697119, 1593970, -4831302, --4595078, 4991289, 8399882, 2939905, -125091, -6977711, -1450625, -2263985, 4964982, 1240172, --9537512, 1466731, 2474438, 670015, 917512, 3664144, -1712081, 1532230, -2633352, 1600949, -1441498, 1168231, 1902671, 827318, 1245004, 1155883, -2234994, 695785, -708670, -364535, -2112587, 884763, 1160715, 2407866, -774168, -7633768, 703838, -525060, 529892, -705448, --497679, 2113661, 1370095, -1238561, -1468879, -10373420, 23951422, -5589363, 10761577, 1015760, -4493073, 3253438, -62277, -13418552, 11422466, -16729434, 5414343, 4018479, 15081241, -7066295, -6794102, -10641855, 6949257, -3440269, -11469173, -5490042, 2694555, 2940442, 4182761, 2135136, -6017249, 3948686, 9124121, -2827699, -7486128, -6736120, 2617246, -78383, -3703336, 6113886, -2658048, -1250909, 3634079, 7567733, -708133, 1960116, -1141924, 3743064, 2189360, -9683541, --4225711, -12688407, -2935073, -2152852, -307627, 6094559, 5407901, 809601, -3519726, -67109, --1924682, -3011309, 1678259, 17858474, 1589138, -388158, 5658083, -424665, 6485401, -2788508, -63888, -4236449, 17892834, 4227859, -7386270, -8422968, -5654325, 706522, -401043, -11450920, -621160, 2368138, 767189, 12506408, -3261491, 1844152, -7767985, -2535641, -21078626, -3637301, -1078574, 810138, -8107288, 2122788, -3906273, 2647847, 1212255, -3823595, -484794, 2775086, -4264366, 7960185, 2082522, -2887292, -2734821, -6391448, -2498597, 608812, 1056562, -3671660, --1418950, 3477850, 1220308, -945967, -893890, -2716567, -2558727, -1224603, 718870, -5316096, --3780108, 1010928, 2122251, 36507, -1384053, 1337346, 4358855, 747861, 341450, -350577, --1923072, 150861, -6245420, 2656437, 1444183, 12532178, 1087701, 10433549, 6334540, 10231686, -3433826, -10344966, 10155450, -6618545, 17566416, -11345156, -3352222, -15694347, -3309809, -1661079, -6986301, -7298223, 10248866, 8265128, -4969277, 586263, 11717745, 16490527, -5248450, 419833, --2150168, 5171141, 80531, -1925219, 2392834, 4521527, -7856569, 5928129, 1127966, 6796249, -2594160, 1039382, -13418552, -2166274, 15571404, -1861868, 5211406, 11938398, 3445101, -926102, --4166655, -5497558, -3293166, 547608, -5118528, -3069828, 9025874, 8346195, 2618856, 13859859, -9207336, -2900714, -1382443, 1899449, 3212099, -4233764, -11047193, 14413373, 6344741, -2955474, -13188771, 13793824, 15369540, 6668474, 2318209, -5571110, 388158, -7796977, -6256694, -3979287, --15417322, 6193880, -1954747, 13151727, -3119757, -10330470, -1946157, 992674, -1533303, -13780403, -2203855, 3678103, 6276021, 6644852, -4655745, 2138894, -3177739, -8961449, 1764695, 3471407, --685584, -2649458, -6760279, 7094212, 4010963, -6322729, -7172059, -4019016, 4124242, -730144, --2033130, 1919314, -3183108, 1990181, -811749, 1227824, 3111167, -4572530, -2122788, 2051921, --963683, 85362, 9201967, 3012920, 626528, -619549, 2197413, -3052111, -1722282, -292058, -3024194, -1898912, 13769665, 851477, 2552284, -2020782, 1179505, -1721208, -20752746, 2449742, --154082, -3700651, -1503239, -10184978, 11777874, 12066711, 13499619, -21789980, 7097434, 4549444, -598611, 21561810, 8890582, -10673531, -1194538, 21286932, 2564632, 3825742, 4394289, -6211597, -3607773, 4414153, 13256953, 6730751, -10030896, -16568910, 6343130, 3967476, -8303246, -1542430, -873489, -10175851, 1229971, 12490302, 5375152, 7014219, 10190884, 16422881, 1620813, 14468134, -2924873, -5704254, -761820, -8516920, -4399121, 3605088, 4964446, 3769371, 7334731, -10247792, --4566624, 18429168, -1283122, -3929358, -10204305, 8752606, 7988639, 2763275, 3386582, -119722, -5157182, -7979513, 13226352, -6600291, -7757248, -6369437, -4306242, 17838610, 4889821, 3731253, --19302656, -10641318, -15852724, 1178969, -1620813, -1561221, -15033996, -20987894, -521839, 9451612, --5104569, 2702608, -1299765, -1427003, 5353677, -7304129, -3052111, -3325379, 6449967, 1066763, --4603131, -66035, -675384, -111132, -2142115, -4397510, 1176821, 7029788, -3338800, -2302103, --4421132, -2044404, -3071439, -1543504, 3159485, -1032403, 4947266, -1600949, -964757, -2784213, --1975148, 7388418, -671089, -494995, -3401614, -559420, 4460324, 1196685, -5274757, 1214939, -511101, 1561758, 19444928, 22871238, -5832566, 6438156, -1647120, -6665253, 1343251, -15292768, --9436043, -657667, -3059091, 30666066, -13768591, 3940096, -19450296, -2844879, 11912092, -4979478, --10814191, -11357504, -4132832, 4705137, 6083821, -746251, -946503, -12768401, 3044595, 8964134, -4549444, 5501853, 1668058, 2016487, -7431367, -2428267, 5036923, 1851668, 20401, 580894, --8970039, 4027069, -9441412, -1520418, -216896, 2771865, -10487236, -1067836, 5189394, 7565585, --11954505, -6271726, 21316460, -8163122, -16748225, 14117021, -13620952, -4289062, -6009733, -2436857, --10450729, -7255811, -2172180, -10544682, -15042586, 24317032, 13438416, 10845329, 7440494, -9426916, --3661460, -6354404, 6857989, -11425687, 8134131, -6091338, 3514357, 8156680, 5339181, 1664837, --15493021, 15224585, -18513994, -4852240, -17948132, -7285875, 11863773, -675921, 6743099, 13615583, -4352950, -1369558, 2677375, -4740034, 290984, -1437203, -5117991, 6156836, -2112050, -2833605, -7051800, 3738232, -1840930, 493384, 346282, 1131724, -3145527, 3075197, 985158, 1664300, --3769371, 2602213, -1739999, 6678138, -2964601, 4724464, -1407676, -2311229, 7079717, -4709969, --2038499, -4212289, 2862596, 7001334, 3236795, -1978369, 3317325, -2803540, 3388192, 4878009, --5263483, -12696460, -812286, 32272922, -14238353, 14120242, -28556700, 8054138, -18099530, -3262028, -10325101, -748398, 6669548, 10821170, 8649527, -12360379, 9479530, 2090039, 7042136, -2527052, -9715753, 9047349, -1824287, 2032056, 5890548, 6666326, -9091909, -2993592, -13319767, -1490891, -11975979, 493921, -5512591, 1398549, 4502737, 1007707, -4776541, -9405978, 2553358, -6301254, -6311992, -5942088, 22959284, -1961726, -12315282, -13837848, 3270081, -7515119, 7301445, -15539729, --12199318, -15789374, 3782793, -13306346, -3110630, -19175956, 13945222, 3022583, 9417253, 5927055, --20777978, 1784559, -1762010, -7639673, -11566347, -3011309, -9834401, -12354473, -6812355, 5992553, -8364449, 12202539, -6828461, 1863479, 5309654, -17361332, 8155606, -11836393, -993748, 10081899, -4312684, 4184372, 1939715, 20517596, -11548630, -4092030, -4333622, 5520107, -17249126, 1563368, --1310502, 16106, 11360188, 6727530, 5667746, 2201171, -4130685, 874026, -2000381, 8378408, --3063386, -869731, -4519916, 9476845, 3819300, -3071975, 2645700, -8040179, 5760625, 3076807, -4552666, 908386, -1548336, 5401458, 9564355, 3416110, -4504884, -6091338, -2470680, 2593624, --6307697, -1265405, -9642738, -6906308, -3736622, 194347, -5258114, 4116189, -4121558, 9760850, --7431367, 49929, 60666, -26827440, -7793755, 30001420, 26545046, 14891188, -12911209, 13119514, -19846508, -13215077, 17529372, -14221174, 16183974, 3770981, -1122597, 5290863, -382789, 8480950, --12848395, -3700114, -5813775, 6444599, -12181601, -10976326, 17057462, -1707250, -3591130, 1553168, --16542603, -429497, 26538066, 14423574, 2994666, -316217, 5634997, 25069724, 10702522, 318364, -4212289, -7021735, -3008625, -6054294, 10776610, -5666673, 7191386, 1292248, 12877923, -15353434, --340913, -989990, 374736, -4380330, 7180112, 11512660, -2748242, -3368865, 11674258, 1268089, -1432909, 26418880, 4151086, 286152, -12155294, 5284958, -9045201, 12193412, -14203457, -12646531, -1910724, -12459700, -13253195, -20292110, 5401995, -6824703, 10416906, -3504693, 5872294, -29604672, -6003828, -10065793, -17923436, 9250823, 12352863, 6396280, 3814468, 2166811, 5175436, 7815767, --3833258, -4651450, -5447629, -428960, -5973226, 3652870, 772557, -8608188, -5905043, 4815195, -2903398, 310311, 8715562, -3127273, -920734, -7023882, -1480690, -27917, 3608310, 2214056, --5845988, -3646427, -1621350, -7114614, -1336272, -6686191, 2655364, 1719598, 7850127, 5283347, --559956, -3252364, -6442, -20938, -2244121, -559420, -8209293, -1534914, 3359738, 3570192, -1038308, -1459215, 7907572, 1242319, 22466438, -34221224, 14556718, 15164456, -24284818, -2356327, --20787642, -6772627, -18646600, -8365523, 21636434, -7227356, -1429687, -14984604, -2787971, 3599183, --22258132, -746787, 14457397, -27538256, 1161789, -18764712, -10050760, 501437, 2183991, -12388296, --9900973, -10362145, -2873870, -8893267, -431644, 4917738, -2570538, 7133404, -13345000, -8490077, -18178450, -8321499, 9914395, -10616085, 10309532, 9406515, 1739462, 2590402, 9614821, 557272, -13637058, 17170742, -3061775, 2633889, 25506738, 1612223, 13183939, -810138, -9932112, -19883014, -3515968, 13984950, -21894670, 393526, -12808129, -6711424, -28436978, 12459700, 19032610, -4832375, -9255118, -4532264, 20685636, 22811646, -1661616, -22393960, -21689048, 31265214, -24110336, 9188546, -3765076, 3332895, 23487028, -9836549, 38160784, -541703, -8447664, -9810242, -6684580, 6167036, --2211908, -2808909, -60130, 9902584, -2265595, -6082748, 8398809, -2877091, 4323422, -7467875, --4381941, 7270306, 731755, 10821170, -3364033, 4654671, -7719667, -2173254, -10629507, 2320356, -4588636, 5446019, 1225139, 5591511, 711354, -1606855, 6045167, -9077950, 6248641, -7688529, --2582886, 4793184, -9352828, -2333778, -5285494, -15939161, -4099546, 1126355, 5979668, -7749195, --3883187, -6808060, -2047626, 1748589, 12221866, 6307697, 37322728, 42058468, -2474438, -31711354, -31336618, -34671124, 4898410, 14705968, 3657165, -3711389, -15984258, 18014166, -8049843, -6458020, --16275242, -9480067, -5062156, -20341502, -11170673, -9096204, -5066451, -3349538, 14143864, -215822, -12229919, 80531, -5252745, -17825188, -19490024, -4941897, -686121, -276489, -2935610, -7311645, --8402567, 9320616, 22507776, -12231530, 7773354, -7645579, -7827041, 8908836, -8673150, -14127221, -31591632, -3508988, 2938295, 1523640, -17593796, -3904125, -3659312, 8910983, -22737020, -10117332, -24137180, 3843459, -10200547, 13062606, 24533390, -13963476, -17201344, 8925479, -14573361, 200253, --27315456, 8796630, 23317914, -2420214, 12186970, 7045894, 4122095, 26650272, 8431021, -161598, -15445239, -2278480, -2078764, 9374303, 10150618, -38756712, 3596498, -16882980, 13748190, -680752, -586263, 9578314, -2851858, -3748970, -5029407, 5133560, 2041183, -3839701, 5236639, -5593658, -629750, -2995740, -7401840, 3379603, -3670050, 8309688, 4674535, -193274, 113280, 2241436, --2143726, 4895726, 2507187, 1491964, 2103460, -1460289, 1915019, -3405372, -6405407, -3621194, --1599875, 832687, -8354249, 6808060, 4704063, 279173, 2598455, -5733782, 8003135, 899259, --4607963, 2806761, 3508452, -10183367, -1998770, 944893, -716723, 73014, 1941862, -1726577, -1583769, -50870128, -35539780, 15261093, -14882599, -14006962, -43226700, -12256226, 9593346, 3906273, --8265665, -23899882, -1611, 12584791, -587337, 1979980, 13026636, 22894324, -19275276, 51721608, --12920335, -16755741, -4884989, -2574296, 544387, -20031190, 776315, -3266323, 11171210, -6555731, -15681999, -6048388, -12768938, 5679021, 6648073, -11366094, 13061532, -38842612, 622233, -2818572, -15939161, 19210852, -13378823, 17935784, -6455336, 5354214, -8116415, -2510945, -4873178, 14413910, --1580011, 18877992, 29307784, -24927990, -6751152, 13924821, -16702054, 10605885, -19015968, -10350871, --9314710, -11008001, -19419694, -9807558, 9491341, 7810935, 15426986, 19934016, 14561013, -23480050, -3269544, 4701379, 5955509, 5104569, 15495168, -7143068, -15788300, 9503152, -3894999, -12273406, -2741800, -21239150, -8624831, -18464064, 2000918, 11350525, -6550899, 10919954, 5984500, -348429, --3795141, -24159, -16440061, -5983427, 5813238, 3073049, 3923990, 1444183, 2147484, 1780264, -5464272, 1693828, -10959146, -1291175, 1954210, -853088, 3162707, -4867272, -4444218, -10699300, -3077881, 9980430, -10768557, -7481296, 5915781, -2525441, -10997264, 7672422, -5233955, -4244502, -6965900, -250719, -1868848, -3187940, -4760971, -6416145, -6824166, -1581085, -5777268, -3347390, --2870649, 5069672, -118648, 52613, 7655243, -10128070, -34349000, 26819924, -44115220, 31874026, --4000225, -19435800, -16535624, -18483392, -12383464, -9494025, 1442035, 23518704, -1382980, -18738942, -20948166, 29549374, -44055092, -11352672, 3572339, -3143379, -6483790, -1686312, -5719286, -7367480, --12489228, 17068736, -5342940, -11810086, -20740398, -20503638, 21189758, 5960341, -3360275, -1735704, -452045, -4083440, -5221070, 5136781, -18213346, 10721849, 21630530, 16404628, 10292889, 20825222, -23976118, -12973486, 5427765, -18924162, 21485038, -11490111, -3073586, 457414, -30365418, 10559714, -25707526, 4890357, -10030359, -7882876, 33480880, -12749610, -13927505, 9872519, -33406256, -3363496, --16392816, 1311039, -32666984, 14388677, 6086506, 14116484, -53234508, -45356464, 7848516, -15461345, --10440529, -6055904, -35555888, 12479027, -20892868, -22535694, 17771500, -14966350, -8883066, 8055748, --3455301, -6396280, -993211, -1328756, 7806103, -17076790, -8062728, -16451872, 322659, -6878390, -3710315, -1820529, -13219909, -4905390, 5025649, -246961, 1239635, 4239670, -14520748, 2522220, --18474264, 9265318, 3087545, -12952548, 4569845, -15524696, -3251827, -5273683, 1442572, 9217000, --6160594, 9517648, -4516158, 15750182, -6700686, 10142565, -5093831, -1020055, -291521, -1176284, -3252364, -898185, 171799, -572841, -3259343, 697395, 5581310, -846645, -2182917, -1217086, -1875827, -1247688, -1905355, -772557, -846109, 1142461, -854162, 19327, -763430, -1169305, --718333, 1716376, 36507, -1829119, -5906, 554588, -2441689, 2180233, 38620884, -55790016, -55032488, 15551003, -2736431, 3743064, -41195716, 7463580, 18114024, -7969849, 46769508, -14440217, -19760070, -17637284, 51616380, -2761127, -7890929, -20927228, -8160438, 6783364, -6106907, 20395726, -15697569, -6453725, 605590, -21508660, 7058779, 20180440, 20526186, -24129664, 8924942, -5493263, -21979496, -7078106, 14011794, -14668924, -11592654, -31910534, 1290101, -20560546, -29819958, 40257804, --19071802, -4565550, -8658117, -10821170, 4763119, 2468533, 13753022, -7827578, 21563420, 1151588, -39793408, 14639396, 44136696, 37234684, -4619774, 24573118, 18700288, -7695508, 22145388, 30236570, --14212584, -32146756, 16938814, 10521059, 24705726, 12108050, -3321084, -1307818, -34138548, -4163971, --10632192, -13104482, 43521976, -6090264, -1306207, 54050016, 36010616, 18814642, 23789286, 11637214, -766115, 5275831, 31143344, -632434, -9181566, 8453569, 26048440, 11603391, 14508400, 6538551, -17786534, -2025077, 4560182, 5889474, 12227235, 3405372, 2524367, 1289564, 700617, 9483825, -15046344, 5680094, 20139102, 465467, 12144557, 11752104, 22815404, -1411971, 15388868, 13264470, -2324114, 11021423, -55298, 1632088, -4708895, 3932580, 5842230, 2193118, 2691334, -192737, --3511673, -377420, 4831838, -3968550, 2320893, 9666361, -3028489, 18865644, 1493038, 4214974, --2047626, -8981313, 4846871, -3552475, 5571110, 16944720, -38510824, 73568496, -10142028, -8298414, --4857608, 53516904, -33087892, 26810260, -36222144, 34083788, 6721087, -6715718, 671626, 19958176, --8807367, 18615998, -8889509, -188979, 37422052, 11535745, -9888088, -150861, 9145059, 7390565, --36792300, 9750113, -13580687, -3306588, -19534586, 18629420, 17402134, 2776696, 8086887, 31463320, --10743861, -50015432, 11647414, 32804424, -13029320, -32869384, 8407935, 23508504, 7601555, 57445, --39764956, -18869402, -23694798, 21946746, 8526584, 22611392, -47822852, 3080029, -9124121, -52397528, --13968844, 7760469, 23374286, 33078764, -17960480, 61746596, 11622718, 1122597, -13113072, -24846922, --17623324, 11687680, -28993714, 58226872, -19029390, 2452963, 34005940, -22606024, 20586316, -22075058, --13107166, 48331804, -24866250, 31720480, 28739236, 10680510, 12848395, -41722924, -5455146, -2113124, --15080167, 19768660, 17296370, 7295539, 4941360, 19252728, -5034239, 7576323, -2789045, 5828808, --8725226, 6904697, -1917703, 5855114, 3946538, 1387811, -14764487, -2317135, 1437203, -4991826, --2212982, 10294500, 5102958, 16894790, -8153459, 3665755, -27998354, -22923852, -3891777, -1261647, -15781320, 12444131, -8368207, -5582921, -22487376, 106837, 6955163, -3347927, -638876, 5436355, --7516193, 5137855, -16780974, 1144072, -6065568, -6079526, 9997610, -43248172, 24785720, 15886547, -24789478, -9801652, -6967511, 10084583, 126702, 2922188, 978179, 4961761, 1219234, -6739341, -32040456, -7391102, -22010634, 9403294, -534723, -19346680, 6806450, 4566087, 13245142, -8883603, --14656576, 15880642, -12668006, -1658394, -3748433, 13049721, -22337588, 7714835, -13845901, 11417634, --19676318, 7083475, -6577743, 3470871, 43231532, -29633664, 5660230, 9583683, -26751740, 9793599, -12369506, -19767050, -4109747, -7523709, 35954780, 3102577, -41536092, 24958592, -33572684, 6186364, -17412334, -16047608, 19913078, -23995446, -19830400, 27400818, -4628901, 11690364, -40929428, 7747584, -8868034, -2095944, -6300717, -263067, 16632798, 705448, -54439784, 33066954, -3416647, 12749074, --14292041, -16569984, 51939576, -1302986, -33201708, 2957622, 16779900, 3913252, -50483044, 1877975, -46845208, -8492761, -21658446, 5212480, 22664542, -2943126, 83752, -3905199, -2335925, 3324305, --8189966, -4706211, 15390478, -6597070, -415001, -8967892, 9029632, 13813152, -2457258, -1978369, -14544370, 4846871, -9984725, -2292439, 6271189, 4280472, -8480413, 4638028, 10010495, -8258149, -2156611, 2595771, 6455336, -15448460, 998580, 9837086, 3688840, -10734734, 623307, 7759932, -1279363, -7940321, -5406290, 8698383, 21048024, -6551436, -106514112, -227261216, -90339808, -170964928, --208346176, 74546672, -296890, 76447200, 289189824, 252627296, 143950128, 276778432, 154566208, 17940078, -95986616, 59269476, -103961296, -73320464, -21233782, -115290880, -139544032, -46102180, -70414376, -110349520, --27364848, -4532801, -140662864, -96759704, -14258218, -85299664, -110590040, -31887984, -54039280, -120263376, --22720914, 12764106, -67253280, -51162724, 51511152, -17904644, -72162968, 15705085, 48518636, -35364760, -29916594, 106194144, -15094126, -27753542, 105079056, 56315076, -25705916, 174244144, 236658608, 147485952, -249518816, 373060320, 287053056, 273210912, 399023936, 345994528, 254754912, 312487872, 284094912, 180900800, -160053568, 86361056, -29238526, -124050464, -222340800, -316038176, -376195104, -471784992, -504119104, -531599904, --602326720, -601882752, -454811808, -465380640, -423807520, -190611184, -147416160, -143347216, 64187212, 122146184, -3046206, 127283504, 176451216, 60701848, 84324704, 165521600, 123800288, 72280008, 116941760, 144709792, -61733176, 90252296, 179455552, 106909256, 70509408, 165423344, 124139584, 50385872, 107630272, 122924648, -16128676, 63675576, 147852640, 84950160, 101817568, 208285520, 195940704, 206478944, 267224272, 269111904, -215923040, 204262736, 174369760, 106613976, 76947024, 41098544, -6082748, -41659572, -113491288, -155152480, --209835456, -279681824, -311481760, -351964512, -409767808, -390216576, -350481152, -309506624, -226271232, -148282128, --78575352, -28872918, 12364674, 26057030, 31842888, 41044320, 43493524, 36816460, 39323648, 43449500, -42179264, 47282760, 61100740, 68599216, 73390792, 81787992, 84344568, 85528368, 89899568, 83154328, -71506376, 53586696, 33440078, 21274584, 5987722, -3935801, -6850473, -10212358, -14584635, -14309757, --12278238, -6786585, 812286, 8786966, 17835388, 20947092, 22754736, 26548804, 28432684, 28261422, -29658360, 32751810, 31223876, 28227062, 31469762, 28022514, 20662014, 25450366, 26267484, 17830556, -17988934, 15598784, 4242354, 1209033, -210453, -12014097, -19874962, -22814866, -28948616, -35170952, --36511516, -39032124, -44935020, -45916960, -45435924, -48728552, -51187956, -48898204, -47878684, -48764520, --44014288, -37648072, -34082176, -27918362, -17423072, -9823127, -3357591, 5983963, 14271103, 18410914, -22398792, 27732604, 29164976, 28369870, 29122562, 28196998, 25244744, 23264764, 21437792, 18597746, -15851651, 13785234, 11205033, 8602283, 6847789, 5546951, 4046396, 3058017, 2118493, 1206349, -641561, 303869, 10201, -122943, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +933082, 5575942, 1903744, 3631932, -5309117, -2911988, 236223, -944893, 1418413, 4414690, +-10631655, -79994, 3491272, 2092723, 3217468, -3083250, -4298189, 4639102, -80531, 1288490, +2893734, 3837017, 1415729, 795106, 3455838, -518080, -1108638, -2995203, 1607928, -848793, +-487479, -1559610, 1986422, 5048197, 20401, -1059246, 2379412, -3243774, -4839892, -2684355, +-980863, -3148748, 282931, -735513, 2033130, -1968706, 565325, -3937948, -376883, -3240553, +-153008, -1489817, -1273995, 1633698, -1861868, -200790, 2660732, -1409286, 3172907, 3830574, +281857, 5181341, -2653216, -189515, 2486786, -911070, 1679332, 2347737, 1279363, -2745021, +1080184, 1236951, 883690, 153008, -2279017, 3016678, -812286, 1433982, -492848, -642635, +197032, -3169149, -253940, -2465848, -1136019, -123480, -420370, -99858, -236760, -1333587, +1575716, 166430, 447213, 92879, 883690, -551903, 1115081, -99321, 480499, -199179, +-471910, 605054, 70867, -204011, -3221, 861141, 199716, -173409, 554588, 264677, +-101469, 14155675, -3929895, 1413044, -3022583, -197569, -1232656, 1678259, 1146756, 4889284, +1537061, 899796, 1923072, -1116155, -9695352, -9273371, -2864743, 1300301, 2904472, -2312840, +580894, -2978560, -1032940, 206158, 1700807, -4083977, -4457103, -1278827, -239981, 2483028, +846645, -959388, -3204583, 626528, -1744294, 143881, 2323577, -3246995, 1631551, 2983392, +-2243047, -6004365, -1534377, 2253247, -314069, 1839320, -249645, 1599339, -235149, 1752347, +377420, -5600638, 1159104, 2363843, -846645, 1618666, 311922, -275952, -1073205, 108448, +-3282966, -245350, -867047, -4152160, -661962, -80531, 3780645, -3641596, 6188511, 7195144, +5668820, -2384781, -1093606, -1245541, 2772402, -982474, -1494649, 1756642, -3998078, -3624953, +497142, 3314641, -54224, -1598265, -3570192, -2081985, -2710661, -1400159, -2497524, 1006096, +-1476395, -352187, -1551557, -783832, 136902, 905701, 120796, 930397, -539555, 122943, +741419, 420907, 595390, 612033, 374199, -611496, 743566, -13307956, -85899, -2052458, +919660, -460635, -6888591, -1319629, -1452773, 2151242, 3350611, -4615479, 3686693, -1177895, +2541010, 2545305, -1384053, 5536213, 339839, 240518, -959925, 956704, -1373316, 1016297, +-1542967, 199716, -3616899, 381715, 3994857, -8053, 1685238, 4195110, -4129074, -4365298, +1823214, -1988570, 3368328, -3412352, -1021665, -7123740, -5478231, -4765266, 2080912, 600222, +2535105, -2597382, -1833414, -551366, 4470524, -4953171, 2046552, 846109, 374736, 2487860, +-1715839, -2279554, -2964064, 1797981, 974421, -4387309, -4806606, -5618891, -154082, -1222992, +1833951, -275415, -1047972, 503048, 763430, 2483028, -6682432, 805306, 3821984, 5631239, +5818070, 4774393, -834297, -3563749, 5216775, 1563905, 1022202, -2625299, 1516124, 1047972, +171799, -672162, -1526324, -256087, 1793686, -1404991, -2261837, -960462, -965294, 352724, +-176094, -585726, 1566589, 91268, 1996623, -217433, 585726, 1292248, 1261110, 936303, +719944, -825707, -859530, -320512, 802085, -190052, 783832, -577136, 1359357, 1087164, +-1151051, 30602, 110595, -1949915, 1461363, -7878044, 4720169, -4225174, 5645198, 7381975, +4563403, -186831, 2117956, 405338, 6027987, -3449396, -3462281, 1653562, -1036698, 2407866, +4616016, -6847252, 2042257, 5949604, 2753074, -542777, -151934, 628676, -2916283, -149787, +-2760590, -3814468, -1069984, 5630166, -2254321, 2558727, -2090039, -3610994, 6768332, -6096169, +4510790, 4936528, 897111, 3089692, -4537633, -1322850, -1858110, -1510218, 3102040, 858457, +-4872104, 666794, -562641, 794032, -1130650, 1607392, 1548873, 5610838, -6088653, 2771328, +2175938, -717260, 2160906, 518080, 3420405, 3180423, 1987496, -2050310, 2704756, 4838281, +-226023, 2786897, -2198487, 5756867, 5961415, 6536940, -2014877, -4779225, 1402844, -768799, +2272575, 1593970, -127238, -472983, -6768869, -1865090, -1648194, -649077, -1468879, -2122788, +2188286, 755377, 621697, 2561411, -260919, 2590939, 1612760, 754304, -481573, 342524, +-695785, -1264331, 702227, 76773, 1214402, -523449, 215285, -215822, -988379, 1350230, +-157840, -1399623, 416612, 1067836, 38118, -1784022, 309775, -896038, 2170569, 1532230, +1554778, -319438, 409633, 1163399, 30602, 533113, 1062468, 531502, 10890426, -1012002, +-3415036, 10357314, -4105452, 4646081, -2501282, -9918690, 1760400, -2860985, 307627, 11866458, +-4604205, -5633387, 452045, 6233608, -10048613, -3737695, 7534447, -2658585, 2433636, 3554622, +-2689723, 3234110, -2102387, -3488587, 700617, -988916, -1220308, -1296543, 4202089, -3374771, +8181913, 2030983, 179315, -4699231, -1387811, 4992900, -5734855, 1213328, 1993402, -904091, +-7997229, 5466420, 1462436, 1338419, 717260, -1111323, 4138738, -2460480, 5656472, 3206730, +-2186138, -9762461, 4350265, 2608656, -231391, -2770791, 2367601, 6288906, 6407555, -708670, +3796214, -5758478, 4192962, -1025960, -1970316, 2480881, 4962298, -3482145, 4912906, 869731, +-2054068, -1737314, 4012036, -3352759, 9504226, -4889821, 3945464, -3288334, 871878, -2939368, +3815542, -3412352, 190052, 2153926, -636192, 405338, -2908767, -1008780, -380105, 6442, +824097, -1284195, 1671816, -173946, -1122597, 1667521, -3337727, -3404299, -1911261, 47782, +-304943, -688805, 125628, -2324651, 2863670, 173946, -156766, 1977833, -1599339, -338229, +2270427, 954020, 817654, 3512210, 3137474, 10137733, 1253057, -2680060, -13184476, 3950296, +7326678, 4347581, 2805151, -1198296, 3679713, 14147085, -1829656, 6488622, 545461, 3590056, +1304060, 170725, 2756295, -1280974, -6183679, -1789391, -4622996, -1264868, -6480032, 2214056, +86973, 7384660, 1364189, -3562139, 2369211, -1145683, -1927367, 4702989, 1618666, 3493956, +1989644, -2152852, -8436390, 431644, 4748087, -414464, -1698660, 2092723, -4504347, -1955821, +-7865696, -9701794, 4886599, 5468567, 4236985, -1440962, -1677185, -7516, -259309, 2759517, +-586800, 3030100, 2690260, -170725, 2776160, -2749853, 678605, -1487132, 1609002, 2013803, +8942659, -49929, 7300908, -2851322, -7699266, -762894, -1120450, -2963528, 5969468, -555125, +2415382, 494995, -4416300, -5268851, -1924145, -1166084, 495532, 5283884, 1672890, 508954, +2179159, 3524558, -1596654, 2644626, -400506, 2243584, 1364726, 526670, 3112778, -396748, +1785633, 1016834, 883690, -631897, -925029, -1911797, -927713, 1829656, 2807298, -759672, +169651, -1669132, -317291, 71941, -1696512, 1110786, -3119757, 79457, -235149, -45634, +1862405, 1999844, -308701, 4710506, -11614128, -382789, 11820287, 16256988, -6761889, 1825898, +2573222, -5647882, -3304977, 639950, -4722317, -4908611, 11368242, 1593433, -7563438, -1200980, +-4942971, -2804077, 7385197, -2323577, -3301219, 6722698, 4129611, 6793028, -2906082, 1403381, +6600828, 299037, -4003447, 1822140, -602906, 834834, -8417599, -5710159, 2478196, -587874, +1966558, -7715909, 3594888, 2834679, 1773285, -13607530, -8007430, -3441880, -1737851, 1945620, +-5991480, -3973382, 1296543, 10446971, 6838125, 3707094, -1889249, -1134945, -3987877, 3025268, +-1185948, -7711077, -5942624, -703301, -162135, 10945724, 6014565, -5405217, -6094559, 7571491, +1467805, -4548371, 2147, 6796249, 2529736, 213138, -8875550, 9738301, -3467649, 6496675, +8460549, 8962523, 748398, -3291556, -2730526, 4611185, 5225902, -4597226, 3660923, 5011153, +3486440, -1512902, -1231045, 721018, 2989834, 2499671, -2686502, -4077535, -3897146, 1915555, +-1895691, -1201517, -2721399, -519154, -1965484, 1001264, -1631551, 1191853, 881542, -297963, +-49392, 2206003, -1652489, -3246459, -643171, 3010772, -1861332, -1600949, -1765232, -1206349, +-271657, -51003, -2076080, -45634, -1528472, -699543, 494995, 2019172, -1380295, -43487, +-491774, -875636, 1792612, 2185065, -3198140, 4770098, -6204081, 6983080, -693100, -1948841, +3690451, -7144141, 2374580, 3820374, 727997, 2655901, 3300146, -1964948, 7784628, -3731253, +-13418552, -7998303, -1808181, 480499, -2881923, -5755256, -6296959, -4282620, 13082470, -3687230, +-1086090, 1853815, -2779381, 1526324, 10723460, -5224828, 5063767, -3401077, -6976101, 6164889, +4431870, 2822867, 9605157, 177704, 4497368, -460635, 1102733, -416075, -3221762, 2090039, +-784905, 6956774, 1348083, -4855998, -1289564, -1427003, -380105, -7891466, 3107946, -7780334, +1833414, 10384694, -6844568, -13062069, 2974802, 1771137, 5925445, -2675228, -169651, 6062347, +-3809099, 2954401, 4446902, 1228361, -2780991, 5986111, 1250909, 7697119, 1593970, -4831302, +-4595078, 4991289, 8399882, 2939905, -125091, -6977711, -1450625, -2263985, 4964982, 1240172, +-9537512, 1466731, 2474438, 670015, 917512, 3664144, -1712081, 1532230, -2633352, 1600949, +1441498, 1168231, 1902671, 827318, 1245004, 1155883, -2234994, 695785, -708670, -364535, +2112587, 884763, 1160715, 2407866, -774168, -7633768, 703838, -525060, 529892, -705448, +-497679, 2113661, 1370095, -1238561, -1468879, -10373420, 23951422, -5589363, 10761577, 1015760, +4493073, 3253438, -62277, -13418552, 11422466, -16729434, 5414343, 4018479, 15081241, -7066295, +6794102, -10641855, 6949257, -3440269, -11469173, -5490042, 2694555, 2940442, 4182761, 2135136, +6017249, 3948686, 9124121, -2827699, -7486128, -6736120, 2617246, -78383, -3703336, 6113886, +2658048, -1250909, 3634079, 7567733, -708133, 1960116, -1141924, 3743064, 2189360, -9683541, +-4225711, -12688407, -2935073, -2152852, -307627, 6094559, 5407901, 809601, -3519726, -67109, +-1924682, -3011309, 1678259, 17858474, 1589138, -388158, 5658083, -424665, 6485401, -2788508, +63888, -4236449, 17892834, 4227859, -7386270, -8422968, -5654325, 706522, -401043, -11450920, +621160, 2368138, 767189, 12506408, -3261491, 1844152, -7767985, -2535641, -21078626, -3637301, +1078574, 810138, -8107288, 2122788, -3906273, 2647847, 1212255, -3823595, -484794, 2775086, +4264366, 7960185, 2082522, -2887292, -2734821, -6391448, -2498597, 608812, 1056562, -3671660, +-1418950, 3477850, 1220308, -945967, -893890, -2716567, -2558727, -1224603, 718870, -5316096, +-3780108, 1010928, 2122251, 36507, -1384053, 1337346, 4358855, 747861, 341450, -350577, +-1923072, 150861, -6245420, 2656437, 1444183, 12532178, 1087701, 10433549, 6334540, 10231686, +3433826, -10344966, 10155450, -6618545, 17566416, -11345156, -3352222, -15694347, -3309809, -1661079, +6986301, -7298223, 10248866, 8265128, -4969277, 586263, 11717745, 16490527, -5248450, 419833, +-2150168, 5171141, 80531, -1925219, 2392834, 4521527, -7856569, 5928129, 1127966, 6796249, +2594160, 1039382, -13418552, -2166274, 15571404, -1861868, 5211406, 11938398, 3445101, -926102, +-4166655, -5497558, -3293166, 547608, -5118528, -3069828, 9025874, 8346195, 2618856, 13859859, +9207336, -2900714, -1382443, 1899449, 3212099, -4233764, -11047193, 14413373, 6344741, -2955474, +13188771, 13793824, 15369540, 6668474, 2318209, -5571110, 388158, -7796977, -6256694, -3979287, +-15417322, 6193880, -1954747, 13151727, -3119757, -10330470, -1946157, 992674, -1533303, -13780403, +2203855, 3678103, 6276021, 6644852, -4655745, 2138894, -3177739, -8961449, 1764695, 3471407, +-685584, -2649458, -6760279, 7094212, 4010963, -6322729, -7172059, -4019016, 4124242, -730144, +-2033130, 1919314, -3183108, 1990181, -811749, 1227824, 3111167, -4572530, -2122788, 2051921, +-963683, 85362, 9201967, 3012920, 626528, -619549, 2197413, -3052111, -1722282, -292058, +3024194, -1898912, 13769665, 851477, 2552284, -2020782, 1179505, -1721208, -20752746, 2449742, +-154082, -3700651, -1503239, -10184978, 11777874, 12066711, 13499619, -21789980, 7097434, 4549444, +598611, 21561810, 8890582, -10673531, -1194538, 21286932, 2564632, 3825742, 4394289, -6211597, +3607773, 4414153, 13256953, 6730751, -10030896, -16568910, 6343130, 3967476, -8303246, -1542430, +873489, -10175851, 1229971, 12490302, 5375152, 7014219, 10190884, 16422881, 1620813, 14468134, +2924873, -5704254, -761820, -8516920, -4399121, 3605088, 4964446, 3769371, 7334731, -10247792, +-4566624, 18429168, -1283122, -3929358, -10204305, 8752606, 7988639, 2763275, 3386582, -119722, +5157182, -7979513, 13226352, -6600291, -7757248, -6369437, -4306242, 17838610, 4889821, 3731253, +-19302656, -10641318, -15852724, 1178969, -1620813, -1561221, -15033996, -20987894, -521839, 9451612, +-5104569, 2702608, -1299765, -1427003, 5353677, -7304129, -3052111, -3325379, 6449967, 1066763, +-4603131, -66035, -675384, -111132, -2142115, -4397510, 1176821, 7029788, -3338800, -2302103, +-4421132, -2044404, -3071439, -1543504, 3159485, -1032403, 4947266, -1600949, -964757, -2784213, +-1975148, 7388418, -671089, -494995, -3401614, -559420, 4460324, 1196685, -5274757, 1214939, +511101, 1561758, 19444928, 22871238, -5832566, 6438156, -1647120, -6665253, 1343251, -15292768, +-9436043, -657667, -3059091, 30666066, -13768591, 3940096, -19450296, -2844879, 11912092, -4979478, +-10814191, -11357504, -4132832, 4705137, 6083821, -746251, -946503, -12768401, 3044595, 8964134, +4549444, 5501853, 1668058, 2016487, -7431367, -2428267, 5036923, 1851668, 20401, 580894, +-8970039, 4027069, -9441412, -1520418, -216896, 2771865, -10487236, -1067836, 5189394, 7565585, +-11954505, -6271726, 21316460, -8163122, -16748225, 14117021, -13620952, -4289062, -6009733, -2436857, +-10450729, -7255811, -2172180, -10544682, -15042586, 24317032, 13438416, 10845329, 7440494, -9426916, +-3661460, -6354404, 6857989, -11425687, 8134131, -6091338, 3514357, 8156680, 5339181, 1664837, +-15493021, 15224585, -18513994, -4852240, -17948132, -7285875, 11863773, -675921, 6743099, 13615583, +4352950, -1369558, 2677375, -4740034, 290984, -1437203, -5117991, 6156836, -2112050, -2833605, +7051800, 3738232, -1840930, 493384, 346282, 1131724, -3145527, 3075197, 985158, 1664300, +-3769371, 2602213, -1739999, 6678138, -2964601, 4724464, -1407676, -2311229, 7079717, -4709969, +-2038499, -4212289, 2862596, 7001334, 3236795, -1978369, 3317325, -2803540, 3388192, 4878009, +-5263483, -12696460, -812286, 32272922, -14238353, 14120242, -28556700, 8054138, -18099530, -3262028, +10325101, -748398, 6669548, 10821170, 8649527, -12360379, 9479530, 2090039, 7042136, -2527052, +9715753, 9047349, -1824287, 2032056, 5890548, 6666326, -9091909, -2993592, -13319767, -1490891, +11975979, 493921, -5512591, 1398549, 4502737, 1007707, -4776541, -9405978, 2553358, -6301254, +6311992, -5942088, 22959284, -1961726, -12315282, -13837848, 3270081, -7515119, 7301445, -15539729, +-12199318, -15789374, 3782793, -13306346, -3110630, -19175956, 13945222, 3022583, 9417253, 5927055, +-20777978, 1784559, -1762010, -7639673, -11566347, -3011309, -9834401, -12354473, -6812355, 5992553, +8364449, 12202539, -6828461, 1863479, 5309654, -17361332, 8155606, -11836393, -993748, 10081899, +4312684, 4184372, 1939715, 20517596, -11548630, -4092030, -4333622, 5520107, -17249126, 1563368, +-1310502, 16106, 11360188, 6727530, 5667746, 2201171, -4130685, 874026, -2000381, 8378408, +-3063386, -869731, -4519916, 9476845, 3819300, -3071975, 2645700, -8040179, 5760625, 3076807, +4552666, 908386, -1548336, 5401458, 9564355, 3416110, -4504884, -6091338, -2470680, 2593624, +-6307697, -1265405, -9642738, -6906308, -3736622, 194347, -5258114, 4116189, -4121558, 9760850, +-7431367, 49929, 60666, -26827440, -7793755, 30001420, 26545046, 14891188, -12911209, 13119514, +19846508, -13215077, 17529372, -14221174, 16183974, 3770981, -1122597, 5290863, -382789, 8480950, +-12848395, -3700114, -5813775, 6444599, -12181601, -10976326, 17057462, -1707250, -3591130, 1553168, +-16542603, -429497, 26538066, 14423574, 2994666, -316217, 5634997, 25069724, 10702522, 318364, +4212289, -7021735, -3008625, -6054294, 10776610, -5666673, 7191386, 1292248, 12877923, -15353434, +-340913, -989990, 374736, -4380330, 7180112, 11512660, -2748242, -3368865, 11674258, 1268089, +1432909, 26418880, 4151086, 286152, -12155294, 5284958, -9045201, 12193412, -14203457, -12646531, +1910724, -12459700, -13253195, -20292110, 5401995, -6824703, 10416906, -3504693, 5872294, -29604672, +6003828, -10065793, -17923436, 9250823, 12352863, 6396280, 3814468, 2166811, 5175436, 7815767, +-3833258, -4651450, -5447629, -428960, -5973226, 3652870, 772557, -8608188, -5905043, 4815195, +2903398, 310311, 8715562, -3127273, -920734, -7023882, -1480690, -27917, 3608310, 2214056, +-5845988, -3646427, -1621350, -7114614, -1336272, -6686191, 2655364, 1719598, 7850127, 5283347, +-559956, -3252364, -6442, -20938, -2244121, -559420, -8209293, -1534914, 3359738, 3570192, +1038308, -1459215, 7907572, 1242319, 22466438, -34221224, 14556718, 15164456, -24284818, -2356327, +-20787642, -6772627, -18646600, -8365523, 21636434, -7227356, -1429687, -14984604, -2787971, 3599183, +-22258132, -746787, 14457397, -27538256, 1161789, -18764712, -10050760, 501437, 2183991, -12388296, +-9900973, -10362145, -2873870, -8893267, -431644, 4917738, -2570538, 7133404, -13345000, -8490077, +18178450, -8321499, 9914395, -10616085, 10309532, 9406515, 1739462, 2590402, 9614821, 557272, +13637058, 17170742, -3061775, 2633889, 25506738, 1612223, 13183939, -810138, -9932112, -19883014, +3515968, 13984950, -21894670, 393526, -12808129, -6711424, -28436978, 12459700, 19032610, -4832375, +9255118, -4532264, 20685636, 22811646, -1661616, -22393960, -21689048, 31265214, -24110336, 9188546, +3765076, 3332895, 23487028, -9836549, 38160784, -541703, -8447664, -9810242, -6684580, 6167036, +-2211908, -2808909, -60130, 9902584, -2265595, -6082748, 8398809, -2877091, 4323422, -7467875, +-4381941, 7270306, 731755, 10821170, -3364033, 4654671, -7719667, -2173254, -10629507, 2320356, +4588636, 5446019, 1225139, 5591511, 711354, -1606855, 6045167, -9077950, 6248641, -7688529, +-2582886, 4793184, -9352828, -2333778, -5285494, -15939161, -4099546, 1126355, 5979668, -7749195, +-3883187, -6808060, -2047626, 1748589, 12221866, 6307697, 37322728, 42058468, -2474438, -31711354, +31336618, -34671124, 4898410, 14705968, 3657165, -3711389, -15984258, 18014166, -8049843, -6458020, +-16275242, -9480067, -5062156, -20341502, -11170673, -9096204, -5066451, -3349538, 14143864, -215822, +12229919, 80531, -5252745, -17825188, -19490024, -4941897, -686121, -276489, -2935610, -7311645, +-8402567, 9320616, 22507776, -12231530, 7773354, -7645579, -7827041, 8908836, -8673150, -14127221, +31591632, -3508988, 2938295, 1523640, -17593796, -3904125, -3659312, 8910983, -22737020, -10117332, +24137180, 3843459, -10200547, 13062606, 24533390, -13963476, -17201344, 8925479, -14573361, 200253, +-27315456, 8796630, 23317914, -2420214, 12186970, 7045894, 4122095, 26650272, 8431021, -161598, +15445239, -2278480, -2078764, 9374303, 10150618, -38756712, 3596498, -16882980, 13748190, -680752, +586263, 9578314, -2851858, -3748970, -5029407, 5133560, 2041183, -3839701, 5236639, -5593658, +629750, -2995740, -7401840, 3379603, -3670050, 8309688, 4674535, -193274, 113280, 2241436, +-2143726, 4895726, 2507187, 1491964, 2103460, -1460289, 1915019, -3405372, -6405407, -3621194, +-1599875, 832687, -8354249, 6808060, 4704063, 279173, 2598455, -5733782, 8003135, 899259, +-4607963, 2806761, 3508452, -10183367, -1998770, 944893, -716723, 73014, 1941862, -1726577, +1583769, -50870128, -35539780, 15261093, -14882599, -14006962, -43226700, -12256226, 9593346, 3906273, +-8265665, -23899882, -1611, 12584791, -587337, 1979980, 13026636, 22894324, -19275276, 51721608, +-12920335, -16755741, -4884989, -2574296, 544387, -20031190, 776315, -3266323, 11171210, -6555731, +15681999, -6048388, -12768938, 5679021, 6648073, -11366094, 13061532, -38842612, 622233, -2818572, +15939161, 19210852, -13378823, 17935784, -6455336, 5354214, -8116415, -2510945, -4873178, 14413910, +-1580011, 18877992, 29307784, -24927990, -6751152, 13924821, -16702054, 10605885, -19015968, -10350871, +-9314710, -11008001, -19419694, -9807558, 9491341, 7810935, 15426986, 19934016, 14561013, -23480050, +3269544, 4701379, 5955509, 5104569, 15495168, -7143068, -15788300, 9503152, -3894999, -12273406, +2741800, -21239150, -8624831, -18464064, 2000918, 11350525, -6550899, 10919954, 5984500, -348429, +-3795141, -24159, -16440061, -5983427, 5813238, 3073049, 3923990, 1444183, 2147484, 1780264, +5464272, 1693828, -10959146, -1291175, 1954210, -853088, 3162707, -4867272, -4444218, -10699300, +3077881, 9980430, -10768557, -7481296, 5915781, -2525441, -10997264, 7672422, -5233955, -4244502, +6965900, -250719, -1868848, -3187940, -4760971, -6416145, -6824166, -1581085, -5777268, -3347390, +-2870649, 5069672, -118648, 52613, 7655243, -10128070, -34349000, 26819924, -44115220, 31874026, +-4000225, -19435800, -16535624, -18483392, -12383464, -9494025, 1442035, 23518704, -1382980, -18738942, +20948166, 29549374, -44055092, -11352672, 3572339, -3143379, -6483790, -1686312, -5719286, -7367480, +-12489228, 17068736, -5342940, -11810086, -20740398, -20503638, 21189758, 5960341, -3360275, -1735704, +452045, -4083440, -5221070, 5136781, -18213346, 10721849, 21630530, 16404628, 10292889, 20825222, +23976118, -12973486, 5427765, -18924162, 21485038, -11490111, -3073586, 457414, -30365418, 10559714, +25707526, 4890357, -10030359, -7882876, 33480880, -12749610, -13927505, 9872519, -33406256, -3363496, +-16392816, 1311039, -32666984, 14388677, 6086506, 14116484, -53234508, -45356464, 7848516, -15461345, +-10440529, -6055904, -35555888, 12479027, -20892868, -22535694, 17771500, -14966350, -8883066, 8055748, +-3455301, -6396280, -993211, -1328756, 7806103, -17076790, -8062728, -16451872, 322659, -6878390, +3710315, -1820529, -13219909, -4905390, 5025649, -246961, 1239635, 4239670, -14520748, 2522220, +-18474264, 9265318, 3087545, -12952548, 4569845, -15524696, -3251827, -5273683, 1442572, 9217000, +-6160594, 9517648, -4516158, 15750182, -6700686, 10142565, -5093831, -1020055, -291521, -1176284, +3252364, -898185, 171799, -572841, -3259343, 697395, 5581310, -846645, -2182917, -1217086, +1875827, -1247688, -1905355, -772557, -846109, 1142461, -854162, 19327, -763430, -1169305, +-718333, 1716376, 36507, -1829119, -5906, 554588, -2441689, 2180233, 38620884, -55790016, +55032488, 15551003, -2736431, 3743064, -41195716, 7463580, 18114024, -7969849, 46769508, -14440217, +19760070, -17637284, 51616380, -2761127, -7890929, -20927228, -8160438, 6783364, -6106907, 20395726, +15697569, -6453725, 605590, -21508660, 7058779, 20180440, 20526186, -24129664, 8924942, -5493263, +21979496, -7078106, 14011794, -14668924, -11592654, -31910534, 1290101, -20560546, -29819958, 40257804, +-19071802, -4565550, -8658117, -10821170, 4763119, 2468533, 13753022, -7827578, 21563420, 1151588, +39793408, 14639396, 44136696, 37234684, -4619774, 24573118, 18700288, -7695508, 22145388, 30236570, +-14212584, -32146756, 16938814, 10521059, 24705726, 12108050, -3321084, -1307818, -34138548, -4163971, +-10632192, -13104482, 43521976, -6090264, -1306207, 54050016, 36010616, 18814642, 23789286, 11637214, +766115, 5275831, 31143344, -632434, -9181566, 8453569, 26048440, 11603391, 14508400, 6538551, +17786534, -2025077, 4560182, 5889474, 12227235, 3405372, 2524367, 1289564, 700617, 9483825, +15046344, 5680094, 20139102, 465467, 12144557, 11752104, 22815404, -1411971, 15388868, 13264470, +2324114, 11021423, -55298, 1632088, -4708895, 3932580, 5842230, 2193118, 2691334, -192737, +-3511673, -377420, 4831838, -3968550, 2320893, 9666361, -3028489, 18865644, 1493038, 4214974, +-2047626, -8981313, 4846871, -3552475, 5571110, 16944720, -38510824, 73568496, -10142028, -8298414, +-4857608, 53516904, -33087892, 26810260, -36222144, 34083788, 6721087, -6715718, 671626, 19958176, +-8807367, 18615998, -8889509, -188979, 37422052, 11535745, -9888088, -150861, 9145059, 7390565, +-36792300, 9750113, -13580687, -3306588, -19534586, 18629420, 17402134, 2776696, 8086887, 31463320, +-10743861, -50015432, 11647414, 32804424, -13029320, -32869384, 8407935, 23508504, 7601555, 57445, +-39764956, -18869402, -23694798, 21946746, 8526584, 22611392, -47822852, 3080029, -9124121, -52397528, +-13968844, 7760469, 23374286, 33078764, -17960480, 61746596, 11622718, 1122597, -13113072, -24846922, +-17623324, 11687680, -28993714, 58226872, -19029390, 2452963, 34005940, -22606024, 20586316, -22075058, +-13107166, 48331804, -24866250, 31720480, 28739236, 10680510, 12848395, -41722924, -5455146, -2113124, +-15080167, 19768660, 17296370, 7295539, 4941360, 19252728, -5034239, 7576323, -2789045, 5828808, +-8725226, 6904697, -1917703, 5855114, 3946538, 1387811, -14764487, -2317135, 1437203, -4991826, +-2212982, 10294500, 5102958, 16894790, -8153459, 3665755, -27998354, -22923852, -3891777, -1261647, +15781320, 12444131, -8368207, -5582921, -22487376, 106837, 6955163, -3347927, -638876, 5436355, +-7516193, 5137855, -16780974, 1144072, -6065568, -6079526, 9997610, -43248172, 24785720, 15886547, +24789478, -9801652, -6967511, 10084583, 126702, 2922188, 978179, 4961761, 1219234, -6739341, +32040456, -7391102, -22010634, 9403294, -534723, -19346680, 6806450, 4566087, 13245142, -8883603, +-14656576, 15880642, -12668006, -1658394, -3748433, 13049721, -22337588, 7714835, -13845901, 11417634, +-19676318, 7083475, -6577743, 3470871, 43231532, -29633664, 5660230, 9583683, -26751740, 9793599, +12369506, -19767050, -4109747, -7523709, 35954780, 3102577, -41536092, 24958592, -33572684, 6186364, +17412334, -16047608, 19913078, -23995446, -19830400, 27400818, -4628901, 11690364, -40929428, 7747584, +8868034, -2095944, -6300717, -263067, 16632798, 705448, -54439784, 33066954, -3416647, 12749074, +-14292041, -16569984, 51939576, -1302986, -33201708, 2957622, 16779900, 3913252, -50483044, 1877975, +46845208, -8492761, -21658446, 5212480, 22664542, -2943126, 83752, -3905199, -2335925, 3324305, +-8189966, -4706211, 15390478, -6597070, -415001, -8967892, 9029632, 13813152, -2457258, -1978369, +14544370, 4846871, -9984725, -2292439, 6271189, 4280472, -8480413, 4638028, 10010495, -8258149, +2156611, 2595771, 6455336, -15448460, 998580, 9837086, 3688840, -10734734, 623307, 7759932, +1279363, -7940321, -5406290, 8698383, 21048024, -6551436, -106514112, -227261216, -90339808, -170964928, +-208346176, 74546672, -296890, 76447200, 289189824, 252627296, 143950128, 276778432, 154566208, 17940078, +95986616, 59269476, -103961296, -73320464, -21233782, -115290880, -139544032, -46102180, -70414376, -110349520, +-27364848, -4532801, -140662864, -96759704, -14258218, -85299664, -110590040, -31887984, -54039280, -120263376, +-22720914, 12764106, -67253280, -51162724, 51511152, -17904644, -72162968, 15705085, 48518636, -35364760, +29916594, 106194144, -15094126, -27753542, 105079056, 56315076, -25705916, 174244144, 236658608, 147485952, +249518816, 373060320, 287053056, 273210912, 399023936, 345994528, 254754912, 312487872, 284094912, 180900800, +160053568, 86361056, -29238526, -124050464, -222340800, -316038176, -376195104, -471784992, -504119104, -531599904, +-602326720, -601882752, -454811808, -465380640, -423807520, -190611184, -147416160, -143347216, 64187212, 122146184, +3046206, 127283504, 176451216, 60701848, 84324704, 165521600, 123800288, 72280008, 116941760, 144709792, +61733176, 90252296, 179455552, 106909256, 70509408, 165423344, 124139584, 50385872, 107630272, 122924648, +16128676, 63675576, 147852640, 84950160, 101817568, 208285520, 195940704, 206478944, 267224272, 269111904, +215923040, 204262736, 174369760, 106613976, 76947024, 41098544, -6082748, -41659572, -113491288, -155152480, +-209835456, -279681824, -311481760, -351964512, -409767808, -390216576, -350481152, -309506624, -226271232, -148282128, +-78575352, -28872918, 12364674, 26057030, 31842888, 41044320, 43493524, 36816460, 39323648, 43449500, +42179264, 47282760, 61100740, 68599216, 73390792, 81787992, 84344568, 85528368, 89899568, 83154328, +71506376, 53586696, 33440078, 21274584, 5987722, -3935801, -6850473, -10212358, -14584635, -14309757, +-12278238, -6786585, 812286, 8786966, 17835388, 20947092, 22754736, 26548804, 28432684, 28261422, +29658360, 32751810, 31223876, 28227062, 31469762, 28022514, 20662014, 25450366, 26267484, 17830556, +17988934, 15598784, 4242354, 1209033, -210453, -12014097, -19874962, -22814866, -28948616, -35170952, +-36511516, -39032124, -44935020, -45916960, -45435924, -48728552, -51187956, -48898204, -47878684, -48764520, +-44014288, -37648072, -34082176, -27918362, -17423072, -9823127, -3357591, 5983963, 14271103, 18410914, +22398792, 27732604, 29164976, 28369870, 29122562, 28196998, 25244744, 23264764, 21437792, 18597746, +15851651, 13785234, 11205033, 8602283, 6847789, 5546951, 4046396, 3058017, 2118493, 1206349, +641561, 303869, 10201, -122943, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -7136625, -232465, 5719286, 3935801, 3961034, 2498597, 1589138, -2220498, 112206, -2531346, 6118181, -3750580, 1489817, 903554, 906775, -54224, -1899449, 3012383, 4218732, 4048544, 2495913, --3048353, -4396436, -4825396, -4569845, -466004, 2430415, -4718022, 3980361, -936840, 6936372, --1136019, 4417911, 72478, -5698348, 1653026, -706522, 4647155, 351114, -528818, -2306398, --3910568, 384936, 2227478, -4998268, -6865505, 4835597, -3972308, -3639448, -3454228, 2739652, --2723009, 1184337, -1211718, -306553, -4040491, -1190243, -2746095, -3994320, 1336272, 3158949, --1151588, -4396973, -855772, -870268, -2214593, -3796214, -286689, -3081639, -3660386, -629750, -261993, 897648, -1235340, 573378, -671626, -5143760, -1134945, 672699, -1423245, -1294396, --1617592, 1691680, -1977296, 1740536, -135291, 330176, 660888, -1231582, 1250909, 46708, --687732, 344134, -335544, -1040456, 179315, 842350, -550830, -434329, -47782, 1338956, -591095, 219580, 202937, 739271, 476741, 852551, 231928, 1087164, -876173, -349503, --396748, 13454522, -4745939, -3119757, -4234301, -2921115, 282931, -9060234, 1492501, -4512937, --8866960, -1923609, 7543573, -5482526, 1447404, -679679, 2512019, 3789235, 4064650, 6578280, --1445257, -3828963, 1659468, 1559073, -3066607, -478352, -2080375, -1376000, 787053, -3512747, --2197413, -545461, -4398047, -5173288, 2596845, 3925600, -2377801, -5939940, -1058710, -1425929, -810675, 4721243, 291521, -2018098, -340376, 6334540, 772557, -3948686, -3786014, 1605781, -1185948, 5044976, 2869575, -381178, -4882304, 224412, -307090, 4130685, -4494684, -1551557, -2438468, 4807142, -1388885, 381178, -3697967, -2116882, 2236067, 88584, 457414, 1266479, --1448478, 1715303, 506806, 2109903, 1314260, 782221, 8427800, 2531346, -361851, -1194538, --2504503, 3564286, 2231773, 3856344, 2773475, 923955, 1024350, -876710, 761820, -1641214, --1701881, -1357210, 431107, -659814, -425739, -318364, 1350767, 162135, 1769527, 103616, --574989, -288300, -180926, -312996, 570694, 350577, 710817, -9887015, -2312840, -4658429, -4546760, 1162326, 124017, 3239479, -1898912, -7638063, -4020626, 5102958, -262530, 5257040, --373662, -2947421, 5823439, 2200634, 12746389, -2376728, 5543192, 826781, -5981816, 1531156, --5078799, 3320010, 1184337, 1319092, -5428302, 2746095, -933082, -1901597, 2250026, 8689256, -3237869, -26307, -6939057, 6054830, -1255741, 51003, 4282083, -6302328, -1168231, 4388383, --2573222, -2232309, -7126425, -7773354, -579284, 4749160, 2794950, -3102577, -73014, 3103651, -3868155, 1561758, -779000, -1475858, -6830072, 3245385, 8524973, 3898757, -2443837, -1173600, -2705293, 4089346, -309238, -1240709, 1023276, -5603859, -1034550, -3918621, -1835562, -337155, --2415919, 6516003, 5663452, -1661079, 2845416, 2128693, -1076426, -3804267, 908386, -2938295, --1118839, 905164, -3821447, -787590, 385473, -1081795, 1090385, 1666447, -2445447, -848256, --161598, 194884, -1919850, 536334, -889058, 1475321, -1703491, 1627256, -1166621, 414464, -258772, -801011, 640487, 315143, -624381, 590558, 622233, 677531, -1268626, -563178, -19864, -1759326, 227633, 1090385, -362925, -7386807, 8371428, -7109245, 7649874, -14496, --5997385, -14223321, -5565741, -4042101, 2197950, 7542500, 5918465, -1745904, -1087701, -1683090, --4035659, -1122597, -4542465, 1636383, 1756105, 2894808, 4770098, 2849174, 9068287, 86973, -1882806, -3113315, -677531, -2088965, 3374234, 1060857, -4123169, -5998996, 316217, -4289599, -613107, 4179003, -6788196, 4893579, -11467026, -3111704, -8487929, 1530082, -456340, 213138, --3282429, -4453881, 1672353, 4160213, 3004330, 1153199, -6802692, 2171643, -4674535, -1734630, --1287417, -9297530, -3580929, 2884071, 3704946, -244276, -6374805, 1190780, 2534031, -1168768, --1199370, 855772, 5707475, 2100776, -1174137, -1721208, 1079647, -13276818, 1051730, 3470871, -3271155, 9498320, 1395864, -5194763, 6007586, -1985886, 983548, 2164664, 2053531, -1277753, --4306242, 332860, 2679523, 2552821, 4096325, -1170916, -1217623, 783295, -669478, -422517, -730681, -1057099, 469762, 1000191, -456877, -2068564, -1556389, -2684, 345745, 645319, --937914, 2116345, -970126, -508954, 1406065, 1611687, -355409, -2302639, -1160715, 1026497, --1117765, -572841, -643171, 587874, 1946694, -269509, 471910, 2009508, 9548786, -2421288, -137976, 6301791, -3248069, -3030636, 9418326, -7169374, -16976396, -11135776, -6564321, 10206990, -4340065, 1420560, -9834938, 10416369, -4491462, 2927020, -2697240, 4097936, 5006322, -402116, -124017, -81604, -1697049, -5369783, -4346507, -1309965, 559420, 4737886, 2670933, 7394860, -3517041, -3207267, -1727651, 6584722, -4740034, 8077223, -6459094, 1750199, 3529390, 2302639, --5241471, 7123740, -705448, 7653632, 10050223, 1561758, -4034585, -3878356, 4239670, -4818954, --10241350, -2614561, 2130841, -6539625, 3727495, 3062312, -2197413, -4055523, -1760937, -1534377, -1947768, -760746, -5778879, -2163053, 9920838, 8024610, 4279935, -11813844, -11659762, -6323803, -11139535, 5695127, -903017, 1594507, -5535139, 7095286, -345745, -5446019, -1936493, 773631, --572304, -2706903, -432718, -2133525, -1185411, 2135673, 3047279, -1755568, -64425, 324807, -484794, 493384, -3092913, 3569655, -278099, -3441880, -2101850, -430570, -1122060, 116501, --289910, -380105, -400506, 893353, 139050, -1552094, -140123, 681289, -428423, -2441689, --1738388, -2272575, -853625, 1757715, 4894115, 7155953, -287226, 2822867, -10989211, -3641059, -1920387, 3899294, -13653701, -1420560, 6027987, -4042638, -8846559, 5679558, -10306848, -7537668, --4023311, 1011465, -3675955, -2470143, -234076, 7837779, -6470368, 1815697, -1981054, -2635499, --5430450, -1431298, -7975218, -2310693, -136365, 1637993, -5545877, -1097364, -3461207, 607738, --1715839, -2412698, 1585917, 6460168, 1720671, -3226057, 3267396, -4770635, -1105954, 1954747, --1748589, 3263102, -933619, -268435, -22308598, 1576790, -7665443, 3881577, 3344706, 5038534, --12232067, -12497281, 1801739, 525597, 3042984, 167504, 6810745, -2635499, 3750043, 4598300, --2047089, 10612327, -3189550, -6775848, -1356136, -5595806, -91268, -11150809, 272194, 5633387, -2709588, 8458938, -2216203, -2218351, 3809099, -4358318, 1157494, 2801393, 5519570, -2827162, -3213173, -4328790, 980326, 243203, 692027, -2100776, -922881, -1550483, 1837172, -1946694, --3087008, -2684, -1398549, -1937030, -606664, -1505923, -571768, -926639, 1027034, -1510218, -1020055, -3107946, -224949, -1839857, -690416, 304943, 325881, -398895, -1398549, 186831, --1002338, 520765, 170188, 8673150, -17505750, 4679367, 744103, 4849555, 7044283, 1266479, --6788733, -14921253, 1064078, -6041409, 11326903, -4626217, 2341294, 806380, 2425583, 8524973, --3765613, -281320, -3954591, -2254321, 2242510, -2177549, 8028368, 5947456, 1726577, -1725503, -126165, 5340255, -535260, 2563559, -104690, -4452271, 3930969, -1167157, -3291019, 4708358, -8051990, -10201, 3164317, 528818, -5300527, -3357054, 9776956, -4745402, 4693326, 7063611, --9389335, 6681359, 3627637, 3371549, -4147328, 6850473, 2021856, -1234803, 8853538, 281320, --68719, -4177393, -2312303, -51540, -3815542, -9477919, -2439005, 9580998, 7307350, 7872138, --839666, -8409546, 3514357, 10049150, -1838246, -7210713, -316217, -5112622, -1246077, -898185, -7921531, -813896, 4094715, -1096290, 423054, -5609228, 1525250, -1018981, 2236604, 2088965, --3757560, 2527052, -5981279, 526670, 2244657, 88584, -1490891, -175557, 1271310, -4263292, --699543, -4017942, 1304060, -2569464, -1490354, -2493766, -3963718, -2747705, -952409, 504659, --1152125, -180926, 1370632, 344671, -965831, -836445, -1117228, 2233383, 176631, 750009, -1605781, 845035, 1162862, -632971, 2088965, -392453, 158914, 731218, -660888, -1184337, -638876, 1992865, -8324721, -2466385, -13412109, -3933116, -7786239, -9179419, -8703751, -3093987, -11673721, 12702903, 17509508, 3901978, -6702297, -4131759, 14490146, -71941, -3398930, 11095511, --1180579, 466541, -17380658, 7834021, 4350802, -11605539, 16038482, -2255932, 7195681, -1968706, -3753802, 7117835, -2147, 12598213, 4820564, 3560528, -1479079, -4494684, 1192927, 7624104, --2068564, 2250026, 3563212, 10103911, -491237, -3085397, 6509560, -7688529, -4834523, 3446175, -11158325, -4975720, -6006512, -1912334, 9193377, 62277, 1286880, -3462281, -1588601, 3282429, -4842576, 408559, -3987877, -12758737, 1496796, 3731253, 12112345, 3502546, -991601, 9292162, -16630113, -3448859, 5818070, 3906810, 6883222, -1363115, -5864241, 3409130, -13809930, -3772592, --2103460, -4496831, -2800856, 7164543, 2469606, -8952859, -5281736, 235149, -2927020, -338766, --6845104, -227096, -2350958, -1741609, -948651, 667867, -1912871, -493921, -936303, 1446330, --543850, 1325534, -1875290, -73014, 282931, 605590, 2768107, 67646, -1068910, 2573759, -3779571, -317828, -2325725, -1480690, -3274376, -2873870, 3926137, -680752, 1057636, 1427540, -1389422, 1289027, -3014530, 1461363, -1095754, -15311022, 21101174, -10850698, 4680978, -927176, --7468948, 16051903, 3670050, 1869385, -17257716, 4302484, -6969658, -7929584, 1757715, -7742753, -8514773, 5101348, -1600412, 1597191, -4338454, -2032056, -6365679, -4137127, -7616588, -11673184, --2988760, -8209293, -2313914, 4253628, -3409667, -4482335, 8986145, 5602785, 9019431, -7654169, --997506, -1647657, -8407935, -55835, -4541391, -20694226, 1648731, 234076, -3330747, 6995428, --897648, 7732015, 6513318, 2323041, 12214350, 10866804, -11020886, -3115999, -64425, -539018, -3711926, 1342177, 10358924, -2383707, 16638166, -160524, -10063645, -8176544, 1126355, 2893197, -3275450, 12069932, 3046206, 2917357, 11314554, 15143518, 462783, -9515500, -9044127, -980326, --3144453, -2306398, 19578608, 1275068, -9135395, 6273874, -8020315, 7364795, 1069984, -1700270, --2518462, -6174553, 1507534, 1853278, -1066763, 1621350, 3156801, 1709397, 2094333, -1032403, --1015760, 71941, -1281511, -1077500, 2058900, 736050, 1407139, 1847373, 3357054, 50466, --1845762, 3143379, 1688996, 483721, 566936, -836445, 311922, -280247, 3335579, 5345087, --3161633, 2466922, -843961, 2128156, 103079, 325881, 4496831, -408022, 256624, 237297, -3655554, 2391760, 2619393, 1690070, 273267, 12633109, 865436, 8479339, -9513353, 4095788, -638340, -805843, 5556614, 13369159, -3835406, -1330366, 12288438, -16514686, -9266929, -7270843, --18919330, 3588982, -6085969, -2752000, 2130841, -12931610, 13929116, 10499584, 14802605, 6597607, --9427453, 776852, 463320, 11070815, -2200634, -462246, -571231, -7039452, 419296, -4181688, -6106907, -7461432, -2925410, -2583960, -3324842, -8720931, 3911105, -12742631, -2075543, -991601, -7794829, 4600984, 909459, 36507, -2364916, 825707, -30602, 6493454, 1373316, 1813550, --1208496, -19888382, -9359271, 2199023, 8045548, 9739912, -15665356, 10281615, 2917894, -6199249, -1329292, 3265249, -3839701, 14930380, -26844, 2791192, -3711389, -21015812, -7349226, -9617506, --2654827, 300111, -5982353, 2928631, 4279398, -4379256, -1077500, 13378823, 197569, 6779069, --8438537, 966368, -322123, 7670275, 6651831, 4856535, -2056753, 1528472, 5422396, 3342558, --446677, 5854041, 5547487, 6221260, 612033, 2332704, 1948305, 959388, -1026497, -867047, -5217849, 963683, -3084324, 427349, -638876, 2934537, -2310693, 895501, 2604361, -2260764, -4172024, 1473711, -840203, 317828, -4045859, 2751464, 2578054, -500901, -1094680, -2375654, --3405909, 868657, 19536196, 3223910, 7976828, -11555073, -10446434, 6215892, 10205916, 1308891, --3427384, 18749680, 5995238, 200253, -5020817, 4178466, -1306207, -1937030, -555661, -3080029, -1007707, -6075231, -14630806, 4986994, 1658394, 4622459, 1607392, 8327942, 2641405, -8718784, --17839146, 586263, 1488206, -1328219, -15592342, -7562901, -2223719, 4523675, -3291556, 1877975, --13618804, 785442, -2929705, 202937, 1525787, 3934727, -1338419, -12838194, -11766063, -7310571, -5150740, 3810710, -3027415, -2577517, -20618528, -11640435, -271657, -20141250, 18788334, -19011136, --5104032, -12272332, 20140712, 6517613, -13935021, 7188702, -1485522, 7663296, -11849815, -3869766, -673236, 8235600, -11241003, -4452808, -3721589, -11481521, 974421, 7794829, -1298691, -2027761, -14011794, -21862458, 17447230, -2771328, 3807489, -9807558, 7106561, -1017370, 5694053, -4931696, -439160, 4483946, 4932233, -1283122, -2247342, 116501, 649077, 665183, -1455994, 5500780, -5843303, 4097399, 1206886, 4151086, -224949, 5082557, -1680943, 1001801, -54224, -1799591, --1763084, 426812, -3961034, -4911295, -1284195, -230854, 5221607, -227096, -660351, -1306207, --3318936, 2531346, -950798, -1748589, -1082869, 2679523, -379568, -5588826, -585189, 2081449, -652298, -471373, 17247514, 37541236, -4869956, -11497091, -10769630, -9480603, -13683766, 2449205, --23404350, -43487, -18062484, -8253854, 5755256, 11593727, 6695854, -8029442, -986232, 11039140, --608812, 12716324, -7342784, -7381975, -6527814, 6088116, -4257387, -5557688, 2142115, -6695854, --6867116, 8680666, 20217484, 7754027, 8719320, 3978750, -11704323, -2630668, -9475235, -8899709, --1318555, -1469416, -7421704, -11904039, -24143084, -2092723, -8689256, 3318936, -4363150, 9266929, -8547522, 4961761, 8939974, 6385543, -816044, 17172890, 24363202, 5978058, -28277528, 5962489, --4971962, -16444356, 2431488, 8311299, 4151623, 908386, 7916162, -281857, -13414793, 1013075, -6527814, -13371844, -7008313, -12516072, -23437636, 18725520, 2677912, -1183800, 13054553, 10295037, -836982, 943819, 12903155, -17185238, -7448547, 2152852, 9549860, 8167417, 12243341, 8942122, --7045357, -3946001, -1463510, -2545842, -911070, -1522029, -3353833, -4338454, -6941204, -6902013, --4967130, -2498597, -631360, 3738232, -1789391, -1214939, -7968238, -5310190, 975494, 4489852, -3068217, 1991791, 1850057, 1455994, -1000191, -3896072, -1872069, -2336462, -2157147, 1053341, --4317516, 1177358, -3036542, 3640522, -235686, -909459, -2899640, 3061775, -2653753, -622770, -5776731, -2051384, -24159, 27737972, -20232518, 24002962, -1823751, -2677375, -11956115, -4295504, --11878269, -10050760, 12894029, -11129871, 6745783, 28760712, 10788421, -4037806, -12728672, -10625749, -12907987, -10217190, -17468706, -7059853, 1970853, 1890323, -19969450, 1637456, -5947456, 10712185, --6200859, -79994, 2491618, 30255360, -7107097, -9374303, 14727443, -11375221, 17659294, -10009421, -12971338, 2378338, -9106404, -8240969, 16422344, -20781200, 16158204, -8822937, 1789928, -4794257, -8893267, -7029251, -3565360, -45634, -6329171, 30878668, -8666170, 21150030, 8252243, 9832791, --8590, 8157754, 13550622, 15276662, -3990025, -14329085, 211527, 12661027, 5130876, -1963337, --18206366, 24766928, -5005248, -15969225, -4371203, -9695352, 7793755, 10839424, 551903, 18002892, --4676683, 9359807, -20049444, -3305514, -21402896, -6440841, -7758322, -226023, 1308891, -3884261, -7795366, 2790655, -5697811, -9635222, -7242926, -1858647, -812823, -4690105, -963146, -1480153, -6181532, -1519882, 360240, -2021319, -9218610, -2530810, -3648038, 1433982, -1456531, -4939750, --8046085, 3522410, -5411659, 2842195, 3702262, -5391795, -13864691, -3025805, -2103460, -3410741, --4898410, 884226, -2250563, 1819456, 1711008, -6016176, -750546, -6054294, 5987185, 3963181, --3282429, 1934883, -5521718, -31294742, -13383655, 19131932, -3827890, -7894150, 22250614, 2094333, --11609297, 8411693, 12102144, 10248329, 1581622, -19270982, -7966628, 2896419, 2820183, 10010495, -6634651, 11296838, -9837623, -7798050, 3795677, -2709051, 9285182, -18122614, -3067144, -19600084, --6328098, 3499325, -2698313, -2498060, 20924544, 4317516, -15507516, -2394444, 1247151, -15888158, --2145336, 735513, 9528385, 24019604, -8534637, 8001524, -13424457, 1979980, -7895761, -10216117, -9814000, 20998632, -16671452, 1566053, 18753974, -8513699, -1723356, -7085623, 12279311, 2910377, --15232638, -238908, -5316096, -5000416, -1506460, -7543573, 11368242, -27006754, 5720897, 2200634, --11320997, 15038828, 23167054, 16285442, 44119516, 13314399, -11294690, -15727633, -12931073, -7136088, -16210817, -5907191, 22505092, 1995012, 27401354, -32610076, -20845086, 9729712, -5319854, -3441880, -13160854, -8940511, -979789, 13888850, 6257231, 10280541, 15335181, 11870216, -2554432, 4795868, --9319005, 248571, -320512, -6658810, -7144141, 4697084, -9858024, -939524, 15024332, 1269163, --8891656, -11777874, 2224793, -14775224, -5346698, 15686831, 8264591, -2689187, -3554086, 2932389, --2861522, -5093295, 1132261, -3751117, -5539971, -1080721, -7631083, 5334887, 4818954, 5101348, --2779918, -2181307, 3434363, 7946763, 21740050, -51583632, -2232309, 29113972, -39231840, -1967095, -7495792, -40524628, 17874580, 4730370, 32141924, -3418257, 11240466, 9343701, -35674000, -29577830, --11625403, -3036542, -17945984, -22035330, -11737072, 19996830, 13974750, 12040404, 1125281, 2084670, -6199786, 1060857, -25945898, -9838159, -33256468, -10761041, 18320184, 5311264, 12320651, 41408316, -10645613, 15528454, -828392, 8131984, 36468032, 27359478, 7512972, 17884244, 16426102, 36363340, -29867740, -40028020, 24780350, -2420751, 23709294, 24107114, 9961103, 43695924, 38613368, -21555368, -19031000, -459562, 18131204, -32247688, 2972654, 3286724, 1048509, -7433515, 20174536, 21828098, --21461414, -7388418, -12664248, 7563438, -17812304, -22112102, 20485384, 35009352, 12770548, 36441724, --10688026, 49579492, 48577152, 13451301, 25412784, -7622493, -12921409, 11287174, 11169062, 5302137, -3742527, 2818036, 6439767, -7107097, -12690555, -9169755, -23723252, -24917252, -10108206, 11363410, --433255, 9999758, 1674500, 6023155, 14916421, 18261664, -6082748, 8283382, -1001264, -7795366, --6431714, -5592585, -15651935, -7326141, 142808, -13616657, -4868346, -12274480, -6795712, 2441152, -16807818, -8149164, 5986111, 4598836, -2957622, 9163313, 5356898, 6953015, 106300, 12224551, -7866770, 5226439, -5053566, -7693360, -3312494, -16594143, 23670638, 42750492, -6043556, -58822800, --18911278, 5793374, -4759361, -9910100, -13050258, 18254, -33720860, -20289962, -28028956, -4667556, --8314520, 9120900, -20058572, -5878200, 5186710, 9159018, -404801, 10210748, 20093468, 4038343, -29066728, -18983218, 6874632, 1031329, 27721330, 7175280, -5640903, -28236726, 18502182, -4974109, -25273736, -21501680, -17140140, -16316044, -8802535, -26015690, -3734474, -4596152, -24546274, 13315472, -27581744, -13530758, 3943854, -36135708, 34476776, -11020886, -19036368, 15737297, 13668733, -20684026, -1630477, -12911745, 4367982, -9466645, 43202004, -1646583, -3887482, -10726144, 76389216, 1932735, --10560251, 32787244, 26161182, -27827630, 21546778, -34085396, -19116900, -35612796, 27041650, -24500104, -12960064, 18727132, 14722611, -31552978, 39679056, -7161858, -52382496, -59499792, -23643794, -7285875, --17481054, 13926431, 13480829, 23608898, 3666292, 2117956, -17901424, 17864380, 27713276, 41012644, -10572062, -11649025, 3767760, 34923988, 5580773, -19132468, -4984310, 37277096, 8293582, -21876952, --5938866, 18463528, 10361072, 16829830, 10997801, 23670102, -58519, 13066364, 4336843, 16801376, -7623030, 26637924, 8533563, 16889422, -3558381, 5408975, 964220, -1810866, 6770479, -2183454, -8865886, 16691854, 2200634, 9775882, 908922, 12661027, -28516436, -6349573, 21442088, 1961190, --16522202, -78857208, 5629092, 50667728, -30623116, -20429548, 40692668, -29619706, -1924145, -8421357, -39058968, -67092220, 37499896, 22244710, -18928994, 6990596, 36637680, 26148298, -12825846, 14957760, -6724845, -10232760, 17234094, -383863, 10451803, 15843597, -6757058, 3817689, -1703491, 7549479, --9698573, -7829726, -611496, 13594645, -39766564, -19705846, 19796578, -4483409, -26360362, -31166430, -5409512, 38743288, -16798690, -24778740, 19077170, 28894930, -6303938, 7252589, -5087389, 26912266, --14601278, 40360880, -5435281, 57445, 22154516, 449361, 5124433, -28702192, 45106284, -23322210, --28193240, 21381420, -29853780, -9904195, 5090073, 14880451, 41685880, -14804752, 26010322, -5319854, -13640279, -70565240, -53900764, -9942312, -20978230, 10736344, 9802189, 26743150, -4168803, -5652177, -32003948, -35020088, -709743, 22332220, 22165790, -8181376, 24692304, 3059627, -5169530, -169651, --5385352, 23533200, -13018046, -1388885, 23070416, 5231807, -5121212, 9010841, -11319923, 2892661, --770947, 341450, 9391483, 4292820, -12951474, -3044058, 4155918, -10217727, -14795089, -263067, -11026255, 19115288, -16067473, 18673980, 6540162, -18797462, 15663746, 17709224, -8819715, -21288006, -19649476, -9767829, 3744675, 10662256, -10537165, -28176596, 9343701, 7467875, -15385647, -14788109, -1260573, 10525354, -12160663, 4465692, -5252208, -25849260, -11890617, 19741818, -32350230, 32572496, --27478664, -34584688, 20266340, -16494285, -11000485, 20691542, -14766634, 17352204, -11517492, 8298951, -39908300, -34892316, -2122788, -4973572, 33683280, 4910222, 3558381, -31197032, -29256244, -10137733, --8253317, -4206384, -9154723, 6273337, 2145336, -2831994, 5335423, 7531762, 3830574, 5935645, --5692979, 15945066, -9681393, 15273977, -27705224, 1394254, -22365506, -29133836, -17003238, 39661340, --16513076, -16879222, -12429098, 9419400, -7414724, 17869748, 25870198, -26317412, 24329380, 4674535, --36509368, -18103288, 76741400, 39979704, -57437672, -10503879, 37172404, -18251464, -20699594, 15182173, --17832704, -39594228, 29127394, 13480292, -53949084, 22772990, 27973658, -31584652, -20682952, 32844688, --7520488, -24033026, 6001680, 16491064, -38977364, 7845832, 7384660, 11713986, -29653528, -8576513, --2197950, -9269076, -1661079, 2323577, 3753802, -18040474, 3306588, 27535036, 9818295, 2073396, -9354439, -115964, -4110821, -14574972, -4236449, -7727183, -10579578, -25217364, 7210177, -14238890, --3668439, 31750008, -27381490, -17787608, 23516020, -16363825, -5697274, -6876780, 10802916, -17754858, --6206765, 29306710, 15701864, -13761075, 16642461, 9494562, -11679627, -7271380, 39763344, -31082142, --24082418, 42306500, 144955, -33065880, 4965519, 21026550, -19434728, -41378252, 28256590, 3843459, --45949172, 8370355, 13303661, -33428268, -352187, 23130010, -5953899, -14636712, 12332999, 9922985, --22917408, -1946694, 17573396, -12840342, -16414291, 11803107, 1065689, 47661788, 67630704, -27452358, -75749800, -6299644, -21081846, -16404628, -26006564, -2481954, 12510703, 44523240, 1290101, 13481365, --11636677, -39021388, 488553, 1071594, 25258166, 4490389, -29472066, 54006528, -23452132, 9788767, -24206436, -27467926, -22218940, -39045548, -17157858, 23500450, 29549912, 36381056, -14099841, -90383288, -19737522, 46577308, 60018948, 51359220, -1014149, -26181046, -32134946, 10459319, 30505542, -20030116, --10581189, -80161808, -49060336, 42406360, 71888088, 14339822, -2197413, -17960480, -31764504, -7857106, -19786378, -28388124, 10724533, -4443144, 45371496, -2433099, 17567490, -89640800, -11539503, 602906, -54550916, 41939280, -1358283, -27210228, -7574175, 64639256, 29239600, -76978160, -94932200, -37516004, -18836652, 146545360, 15694347, -26080116, 20058034, -39910448, 104294152, 31352724, -83384640, -52591336, --10557030, 73229728, 10901164, -31287764, -28654948, -26902064, 20842402, 39155608, 19754702, -43373800, --3711926, -15298674, 35173096, -4421669, 21220896, -8106214, -9138080, -28991030, 10932839, -9308805, --3148211, 21456582, -34799436, 19651622, -5347235, -5925445, 51003, 15376520, 34307660, 16739635, -2246268, -7451232, 7201587, -964757, 13888314, 3922379, 15339476, 3149285, 3831648, -18130668, -8039642, 8494372, 6217502, -585189, 5113159, 2524904, 15222438, 17691508, 14202920, 1298154, --10040023, -15431817, 4350802, 6841346, -8898635, 7502234, -12367895, 31361314, -36153960, 1126355, --14556718, 8357470, -22401476, 21018496, 5786395, -11906723, -22601728, -11073499, -4313758, 6595459, --30842160, 7133941, -15126875, -5842766, -24164560, -11325829, 19512036, -20537996, -7321846, -2785823, -9509594, 6515466, -8068096, 11129334, -17712982, -1347009, 158914, 9542344, -11627550, 16844324, -12463995, -12692702, -14840186, -5573257, 23795730, -17102560, 7467338, 17812304, 3882651, -17192754, --6691022, 7530689, -10923712, 8150774, 708670, 3998615, -16040629, 3461744, -13062069, -452045, -11981885, 15354508, 11774653, -8693551, 11228118, 1559073, -14281303, -1974611, -128849, 17088602, --4748623, 3714610, 14642617, -3034395, -19292994, 26964878, -10992432, 16015396, 11537356, 2889439, -3652870, -11172284, -14000520, 18636400, 2755759, 16418586, 4843113, 9022653, 4446902, -345745, --915902, -14040785, 1546188, 3970161, 4952098, 5786932, -1816234, 6714108, 1063541, -683974, -1736241, 1003412, 6699612, -1680406, 5208722, -6356552, -1733556, 166430, 448824, -3499862, --2158758, 12724914, 7831873, -1961190, -9066676, -9990094, -3856344, -3925600, 11394011, 1333587, --3560528, -7405598, -4006668, 1260573, -6411850, 13424457, 1113470, -5184026, 2138357, -56371, --2527588, 3935801, -4012036, 11694122, -10950556, 8098161, -10666014, -29316374, 54380192, 4793184, -2824478, -22190486, 12495670, -2015413, 14158897, 10750303, 16597364, 1690070, 4114042, -9583683, -2560874, 15194521, -1659468, 8243116, -1489280, 2517388, 3243237, 6070937, -6659884, 11465415, --8068633, 913754, -1429150, 3788161, -1191853, 2184528, 8683887, 9542880, -4837207, 4126927, -1736777, -2319282, -4318590, 12761422, -4123169, 2583423, -3826816, 6604049, -194884, -6333466, -12823699, -8213588, -2945811, 3295851, -6258304, -3839164, -2049236, 395674, -2490007, 79457, --1397475, -3493419, 4258460, -8491150, 5116917, 3437585, -3009162, 5405217, -4357781, 6428493, --3527779, 1132798, 1137630, -4073240, 6316287, -115427, 756451, -2160906, 8557185, -10448045, -10871636, -7918309, 1182727, 1782948, -443455, 1926293, -1893007, 6264210, -6122476, 319438, -5345624, -6707129, 4011500, 3635153, -1103807, 714575, 3607773, 1677722, -1864553, 2392297, -548145, -943819, 384936, 2090039, 128849, -2872260, 627602, 1045825, -1552094, 3106335, --831613, 2537252, -1820529, 343597, 1945083, -1442572, 208306, 1340030, -2188823, 3418794, --464930, 1647657, -580357, 3605088, -1436667, 357556, 3329137, -3116536, 3871376, -2391760, -1606855, -2456185, 3797288, -673773, 10441602, -49767932, -123915712, 19270444, 94399624, 87701088, -152145456, -38821672, -40707164, -103574744, -141405360, -29154774, 51162724, 54731304, 103092104, 55992952, -4440460, -26766236, -71937480, -51158428, -8811662, -8011188, 25665650, 23781770, 13775571, 8771397, -6939057, -3802120, -17655536, -1380832, 20453708, 145492, 4326643, -1182190, -15287936, -11740830, --26020522, -25537338, 11604465, 10664404, 23705536, 35984848, 27007292, 13160317, 4800700, -38884488, --27454504, -21288542, -21274046, -23790898, 4998805, 15133317, 26389352, 33639256, 27888834, 6044093, --3251290, -22356916, -22755810, -13575855, -6558952, 2158221, 3799972, 7518877, 710817, -7324530, -2521146, -11673184, 6123550, 9859634, 1185948, 19770808, 23997592, 7370701, -4495757, -26379152, --34640520, -14010183, -6344741, -4088272, 17709224, 13634911, -3538516, 15467788, 16899086, 9376987, -11696270, -6487548, -12441447, -10103911, -14322642, -11471321, -2054605, -11016054, -4267050, 543850, -8865886, 12368432, 17988934, 15412490, 14331769, 11264089, -5810017, -13492103, -22464290, -27848568, --16089484, -12125230, 1646046, 13182328, 19610820, 22568442, 17982492, 16413218, 10714870, -14107357, --24949466, -22682260, -10966662, -3314104, -928787, 1613834, 9666898, 8343511, 4134443, 1832877, -7934952, 4354023, 6920803, 1810329, -10374494, -11609833, -7459822, -3148211, 3732864, 2458869, --3670587, -2245731, 3725884, 1773822, 1695438, 4695473, 7846369, 3408594, 345208, -3952444, --4258460, -3828427, -4348655, -6011881, -4258997, -450972, 3551938, 4544613, 6331856, 6458557, -3845606, -332860, -2737505, -3791383, -3174518, -3306051, -2165737, -1748589, -288837, 1487669, -2672007, 1889249, 1401770, 854699, 1426466, 652298, -390842, -2512019, -2100776, -912144, -949188, 1065152, 516470, -1080184, -647466, -289910, 143345, 0, 756451, 957778, -641024, -492311, -200790, 83752, 599685, 225486, -157840, -796180, -796716, -895501, --185757, 229781, 344671, -29528, 395137, 705985, 1163936, 606664, 3758, -780610, --862752, -899259, -387084, -205085, 3221, 118648, 578210, 399969, 267362, -62277, --8590, -107911, -31675, -82678, 110059, 4832, -104153, -298500, -116501, -40265, -102542, 5369, 39728, -20401, 34360, 12885, 81604, 35433, 49929, 9664, -9664, -28454, -39192, -47245, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +232465, 5719286, 3935801, 3961034, 2498597, 1589138, -2220498, 112206, -2531346, 6118181, +3750580, 1489817, 903554, 906775, -54224, -1899449, 3012383, 4218732, 4048544, 2495913, +-3048353, -4396436, -4825396, -4569845, -466004, 2430415, -4718022, 3980361, -936840, 6936372, +-1136019, 4417911, 72478, -5698348, 1653026, -706522, 4647155, 351114, -528818, -2306398, +-3910568, 384936, 2227478, -4998268, -6865505, 4835597, -3972308, -3639448, -3454228, 2739652, +-2723009, 1184337, -1211718, -306553, -4040491, -1190243, -2746095, -3994320, 1336272, 3158949, +-1151588, -4396973, -855772, -870268, -2214593, -3796214, -286689, -3081639, -3660386, -629750, +261993, 897648, -1235340, 573378, -671626, -5143760, -1134945, 672699, -1423245, -1294396, +-1617592, 1691680, -1977296, 1740536, -135291, 330176, 660888, -1231582, 1250909, 46708, +-687732, 344134, -335544, -1040456, 179315, 842350, -550830, -434329, -47782, 1338956, +591095, 219580, 202937, 739271, 476741, 852551, 231928, 1087164, -876173, -349503, +-396748, 13454522, -4745939, -3119757, -4234301, -2921115, 282931, -9060234, 1492501, -4512937, +-8866960, -1923609, 7543573, -5482526, 1447404, -679679, 2512019, 3789235, 4064650, 6578280, +-1445257, -3828963, 1659468, 1559073, -3066607, -478352, -2080375, -1376000, 787053, -3512747, +-2197413, -545461, -4398047, -5173288, 2596845, 3925600, -2377801, -5939940, -1058710, -1425929, +810675, 4721243, 291521, -2018098, -340376, 6334540, 772557, -3948686, -3786014, 1605781, +1185948, 5044976, 2869575, -381178, -4882304, 224412, -307090, 4130685, -4494684, -1551557, +2438468, 4807142, -1388885, 381178, -3697967, -2116882, 2236067, 88584, 457414, 1266479, +-1448478, 1715303, 506806, 2109903, 1314260, 782221, 8427800, 2531346, -361851, -1194538, +-2504503, 3564286, 2231773, 3856344, 2773475, 923955, 1024350, -876710, 761820, -1641214, +-1701881, -1357210, 431107, -659814, -425739, -318364, 1350767, 162135, 1769527, 103616, +-574989, -288300, -180926, -312996, 570694, 350577, 710817, -9887015, -2312840, -4658429, +4546760, 1162326, 124017, 3239479, -1898912, -7638063, -4020626, 5102958, -262530, 5257040, +-373662, -2947421, 5823439, 2200634, 12746389, -2376728, 5543192, 826781, -5981816, 1531156, +-5078799, 3320010, 1184337, 1319092, -5428302, 2746095, -933082, -1901597, 2250026, 8689256, +3237869, -26307, -6939057, 6054830, -1255741, 51003, 4282083, -6302328, -1168231, 4388383, +-2573222, -2232309, -7126425, -7773354, -579284, 4749160, 2794950, -3102577, -73014, 3103651, +3868155, 1561758, -779000, -1475858, -6830072, 3245385, 8524973, 3898757, -2443837, -1173600, +2705293, 4089346, -309238, -1240709, 1023276, -5603859, -1034550, -3918621, -1835562, -337155, +-2415919, 6516003, 5663452, -1661079, 2845416, 2128693, -1076426, -3804267, 908386, -2938295, +-1118839, 905164, -3821447, -787590, 385473, -1081795, 1090385, 1666447, -2445447, -848256, +-161598, 194884, -1919850, 536334, -889058, 1475321, -1703491, 1627256, -1166621, 414464, +258772, -801011, 640487, 315143, -624381, 590558, 622233, 677531, -1268626, -563178, +19864, -1759326, 227633, 1090385, -362925, -7386807, 8371428, -7109245, 7649874, -14496, +-5997385, -14223321, -5565741, -4042101, 2197950, 7542500, 5918465, -1745904, -1087701, -1683090, +-4035659, -1122597, -4542465, 1636383, 1756105, 2894808, 4770098, 2849174, 9068287, 86973, +1882806, -3113315, -677531, -2088965, 3374234, 1060857, -4123169, -5998996, 316217, -4289599, +613107, 4179003, -6788196, 4893579, -11467026, -3111704, -8487929, 1530082, -456340, 213138, +-3282429, -4453881, 1672353, 4160213, 3004330, 1153199, -6802692, 2171643, -4674535, -1734630, +-1287417, -9297530, -3580929, 2884071, 3704946, -244276, -6374805, 1190780, 2534031, -1168768, +-1199370, 855772, 5707475, 2100776, -1174137, -1721208, 1079647, -13276818, 1051730, 3470871, +3271155, 9498320, 1395864, -5194763, 6007586, -1985886, 983548, 2164664, 2053531, -1277753, +-4306242, 332860, 2679523, 2552821, 4096325, -1170916, -1217623, 783295, -669478, -422517, +730681, -1057099, 469762, 1000191, -456877, -2068564, -1556389, -2684, 345745, 645319, +-937914, 2116345, -970126, -508954, 1406065, 1611687, -355409, -2302639, -1160715, 1026497, +-1117765, -572841, -643171, 587874, 1946694, -269509, 471910, 2009508, 9548786, -2421288, +137976, 6301791, -3248069, -3030636, 9418326, -7169374, -16976396, -11135776, -6564321, 10206990, +4340065, 1420560, -9834938, 10416369, -4491462, 2927020, -2697240, 4097936, 5006322, -402116, +124017, -81604, -1697049, -5369783, -4346507, -1309965, 559420, 4737886, 2670933, 7394860, +3517041, -3207267, -1727651, 6584722, -4740034, 8077223, -6459094, 1750199, 3529390, 2302639, +-5241471, 7123740, -705448, 7653632, 10050223, 1561758, -4034585, -3878356, 4239670, -4818954, +-10241350, -2614561, 2130841, -6539625, 3727495, 3062312, -2197413, -4055523, -1760937, -1534377, +1947768, -760746, -5778879, -2163053, 9920838, 8024610, 4279935, -11813844, -11659762, -6323803, +11139535, 5695127, -903017, 1594507, -5535139, 7095286, -345745, -5446019, -1936493, 773631, +-572304, -2706903, -432718, -2133525, -1185411, 2135673, 3047279, -1755568, -64425, 324807, +484794, 493384, -3092913, 3569655, -278099, -3441880, -2101850, -430570, -1122060, 116501, +-289910, -380105, -400506, 893353, 139050, -1552094, -140123, 681289, -428423, -2441689, +-1738388, -2272575, -853625, 1757715, 4894115, 7155953, -287226, 2822867, -10989211, -3641059, +1920387, 3899294, -13653701, -1420560, 6027987, -4042638, -8846559, 5679558, -10306848, -7537668, +-4023311, 1011465, -3675955, -2470143, -234076, 7837779, -6470368, 1815697, -1981054, -2635499, +-5430450, -1431298, -7975218, -2310693, -136365, 1637993, -5545877, -1097364, -3461207, 607738, +-1715839, -2412698, 1585917, 6460168, 1720671, -3226057, 3267396, -4770635, -1105954, 1954747, +-1748589, 3263102, -933619, -268435, -22308598, 1576790, -7665443, 3881577, 3344706, 5038534, +-12232067, -12497281, 1801739, 525597, 3042984, 167504, 6810745, -2635499, 3750043, 4598300, +-2047089, 10612327, -3189550, -6775848, -1356136, -5595806, -91268, -11150809, 272194, 5633387, +2709588, 8458938, -2216203, -2218351, 3809099, -4358318, 1157494, 2801393, 5519570, -2827162, +3213173, -4328790, 980326, 243203, 692027, -2100776, -922881, -1550483, 1837172, -1946694, +-3087008, -2684, -1398549, -1937030, -606664, -1505923, -571768, -926639, 1027034, -1510218, +1020055, -3107946, -224949, -1839857, -690416, 304943, 325881, -398895, -1398549, 186831, +-1002338, 520765, 170188, 8673150, -17505750, 4679367, 744103, 4849555, 7044283, 1266479, +-6788733, -14921253, 1064078, -6041409, 11326903, -4626217, 2341294, 806380, 2425583, 8524973, +-3765613, -281320, -3954591, -2254321, 2242510, -2177549, 8028368, 5947456, 1726577, -1725503, +126165, 5340255, -535260, 2563559, -104690, -4452271, 3930969, -1167157, -3291019, 4708358, +8051990, -10201, 3164317, 528818, -5300527, -3357054, 9776956, -4745402, 4693326, 7063611, +-9389335, 6681359, 3627637, 3371549, -4147328, 6850473, 2021856, -1234803, 8853538, 281320, +-68719, -4177393, -2312303, -51540, -3815542, -9477919, -2439005, 9580998, 7307350, 7872138, +-839666, -8409546, 3514357, 10049150, -1838246, -7210713, -316217, -5112622, -1246077, -898185, +7921531, -813896, 4094715, -1096290, 423054, -5609228, 1525250, -1018981, 2236604, 2088965, +-3757560, 2527052, -5981279, 526670, 2244657, 88584, -1490891, -175557, 1271310, -4263292, +-699543, -4017942, 1304060, -2569464, -1490354, -2493766, -3963718, -2747705, -952409, 504659, +-1152125, -180926, 1370632, 344671, -965831, -836445, -1117228, 2233383, 176631, 750009, +1605781, 845035, 1162862, -632971, 2088965, -392453, 158914, 731218, -660888, -1184337, +638876, 1992865, -8324721, -2466385, -13412109, -3933116, -7786239, -9179419, -8703751, -3093987, +11673721, 12702903, 17509508, 3901978, -6702297, -4131759, 14490146, -71941, -3398930, 11095511, +-1180579, 466541, -17380658, 7834021, 4350802, -11605539, 16038482, -2255932, 7195681, -1968706, +3753802, 7117835, -2147, 12598213, 4820564, 3560528, -1479079, -4494684, 1192927, 7624104, +-2068564, 2250026, 3563212, 10103911, -491237, -3085397, 6509560, -7688529, -4834523, 3446175, +11158325, -4975720, -6006512, -1912334, 9193377, 62277, 1286880, -3462281, -1588601, 3282429, +4842576, 408559, -3987877, -12758737, 1496796, 3731253, 12112345, 3502546, -991601, 9292162, +16630113, -3448859, 5818070, 3906810, 6883222, -1363115, -5864241, 3409130, -13809930, -3772592, +-2103460, -4496831, -2800856, 7164543, 2469606, -8952859, -5281736, 235149, -2927020, -338766, +-6845104, -227096, -2350958, -1741609, -948651, 667867, -1912871, -493921, -936303, 1446330, +-543850, 1325534, -1875290, -73014, 282931, 605590, 2768107, 67646, -1068910, 2573759, +3779571, -317828, -2325725, -1480690, -3274376, -2873870, 3926137, -680752, 1057636, 1427540, +1389422, 1289027, -3014530, 1461363, -1095754, -15311022, 21101174, -10850698, 4680978, -927176, +-7468948, 16051903, 3670050, 1869385, -17257716, 4302484, -6969658, -7929584, 1757715, -7742753, +8514773, 5101348, -1600412, 1597191, -4338454, -2032056, -6365679, -4137127, -7616588, -11673184, +-2988760, -8209293, -2313914, 4253628, -3409667, -4482335, 8986145, 5602785, 9019431, -7654169, +-997506, -1647657, -8407935, -55835, -4541391, -20694226, 1648731, 234076, -3330747, 6995428, +-897648, 7732015, 6513318, 2323041, 12214350, 10866804, -11020886, -3115999, -64425, -539018, +3711926, 1342177, 10358924, -2383707, 16638166, -160524, -10063645, -8176544, 1126355, 2893197, +3275450, 12069932, 3046206, 2917357, 11314554, 15143518, 462783, -9515500, -9044127, -980326, +-3144453, -2306398, 19578608, 1275068, -9135395, 6273874, -8020315, 7364795, 1069984, -1700270, +-2518462, -6174553, 1507534, 1853278, -1066763, 1621350, 3156801, 1709397, 2094333, -1032403, +-1015760, 71941, -1281511, -1077500, 2058900, 736050, 1407139, 1847373, 3357054, 50466, +-1845762, 3143379, 1688996, 483721, 566936, -836445, 311922, -280247, 3335579, 5345087, +-3161633, 2466922, -843961, 2128156, 103079, 325881, 4496831, -408022, 256624, 237297, +3655554, 2391760, 2619393, 1690070, 273267, 12633109, 865436, 8479339, -9513353, 4095788, +638340, -805843, 5556614, 13369159, -3835406, -1330366, 12288438, -16514686, -9266929, -7270843, +-18919330, 3588982, -6085969, -2752000, 2130841, -12931610, 13929116, 10499584, 14802605, 6597607, +-9427453, 776852, 463320, 11070815, -2200634, -462246, -571231, -7039452, 419296, -4181688, +6106907, -7461432, -2925410, -2583960, -3324842, -8720931, 3911105, -12742631, -2075543, -991601, +7794829, 4600984, 909459, 36507, -2364916, 825707, -30602, 6493454, 1373316, 1813550, +-1208496, -19888382, -9359271, 2199023, 8045548, 9739912, -15665356, 10281615, 2917894, -6199249, +1329292, 3265249, -3839701, 14930380, -26844, 2791192, -3711389, -21015812, -7349226, -9617506, +-2654827, 300111, -5982353, 2928631, 4279398, -4379256, -1077500, 13378823, 197569, 6779069, +-8438537, 966368, -322123, 7670275, 6651831, 4856535, -2056753, 1528472, 5422396, 3342558, +-446677, 5854041, 5547487, 6221260, 612033, 2332704, 1948305, 959388, -1026497, -867047, +5217849, 963683, -3084324, 427349, -638876, 2934537, -2310693, 895501, 2604361, -2260764, +4172024, 1473711, -840203, 317828, -4045859, 2751464, 2578054, -500901, -1094680, -2375654, +-3405909, 868657, 19536196, 3223910, 7976828, -11555073, -10446434, 6215892, 10205916, 1308891, +-3427384, 18749680, 5995238, 200253, -5020817, 4178466, -1306207, -1937030, -555661, -3080029, +1007707, -6075231, -14630806, 4986994, 1658394, 4622459, 1607392, 8327942, 2641405, -8718784, +-17839146, 586263, 1488206, -1328219, -15592342, -7562901, -2223719, 4523675, -3291556, 1877975, +-13618804, 785442, -2929705, 202937, 1525787, 3934727, -1338419, -12838194, -11766063, -7310571, +5150740, 3810710, -3027415, -2577517, -20618528, -11640435, -271657, -20141250, 18788334, -19011136, +-5104032, -12272332, 20140712, 6517613, -13935021, 7188702, -1485522, 7663296, -11849815, -3869766, +673236, 8235600, -11241003, -4452808, -3721589, -11481521, 974421, 7794829, -1298691, -2027761, +14011794, -21862458, 17447230, -2771328, 3807489, -9807558, 7106561, -1017370, 5694053, -4931696, +439160, 4483946, 4932233, -1283122, -2247342, 116501, 649077, 665183, -1455994, 5500780, +5843303, 4097399, 1206886, 4151086, -224949, 5082557, -1680943, 1001801, -54224, -1799591, +-1763084, 426812, -3961034, -4911295, -1284195, -230854, 5221607, -227096, -660351, -1306207, +-3318936, 2531346, -950798, -1748589, -1082869, 2679523, -379568, -5588826, -585189, 2081449, +652298, -471373, 17247514, 37541236, -4869956, -11497091, -10769630, -9480603, -13683766, 2449205, +-23404350, -43487, -18062484, -8253854, 5755256, 11593727, 6695854, -8029442, -986232, 11039140, +-608812, 12716324, -7342784, -7381975, -6527814, 6088116, -4257387, -5557688, 2142115, -6695854, +-6867116, 8680666, 20217484, 7754027, 8719320, 3978750, -11704323, -2630668, -9475235, -8899709, +-1318555, -1469416, -7421704, -11904039, -24143084, -2092723, -8689256, 3318936, -4363150, 9266929, +8547522, 4961761, 8939974, 6385543, -816044, 17172890, 24363202, 5978058, -28277528, 5962489, +-4971962, -16444356, 2431488, 8311299, 4151623, 908386, 7916162, -281857, -13414793, 1013075, +6527814, -13371844, -7008313, -12516072, -23437636, 18725520, 2677912, -1183800, 13054553, 10295037, +836982, 943819, 12903155, -17185238, -7448547, 2152852, 9549860, 8167417, 12243341, 8942122, +-7045357, -3946001, -1463510, -2545842, -911070, -1522029, -3353833, -4338454, -6941204, -6902013, +-4967130, -2498597, -631360, 3738232, -1789391, -1214939, -7968238, -5310190, 975494, 4489852, +3068217, 1991791, 1850057, 1455994, -1000191, -3896072, -1872069, -2336462, -2157147, 1053341, +-4317516, 1177358, -3036542, 3640522, -235686, -909459, -2899640, 3061775, -2653753, -622770, +5776731, -2051384, -24159, 27737972, -20232518, 24002962, -1823751, -2677375, -11956115, -4295504, +-11878269, -10050760, 12894029, -11129871, 6745783, 28760712, 10788421, -4037806, -12728672, -10625749, +12907987, -10217190, -17468706, -7059853, 1970853, 1890323, -19969450, 1637456, -5947456, 10712185, +-6200859, -79994, 2491618, 30255360, -7107097, -9374303, 14727443, -11375221, 17659294, -10009421, +12971338, 2378338, -9106404, -8240969, 16422344, -20781200, 16158204, -8822937, 1789928, -4794257, +8893267, -7029251, -3565360, -45634, -6329171, 30878668, -8666170, 21150030, 8252243, 9832791, +-8590, 8157754, 13550622, 15276662, -3990025, -14329085, 211527, 12661027, 5130876, -1963337, +-18206366, 24766928, -5005248, -15969225, -4371203, -9695352, 7793755, 10839424, 551903, 18002892, +-4676683, 9359807, -20049444, -3305514, -21402896, -6440841, -7758322, -226023, 1308891, -3884261, +7795366, 2790655, -5697811, -9635222, -7242926, -1858647, -812823, -4690105, -963146, -1480153, +6181532, -1519882, 360240, -2021319, -9218610, -2530810, -3648038, 1433982, -1456531, -4939750, +-8046085, 3522410, -5411659, 2842195, 3702262, -5391795, -13864691, -3025805, -2103460, -3410741, +-4898410, 884226, -2250563, 1819456, 1711008, -6016176, -750546, -6054294, 5987185, 3963181, +-3282429, 1934883, -5521718, -31294742, -13383655, 19131932, -3827890, -7894150, 22250614, 2094333, +-11609297, 8411693, 12102144, 10248329, 1581622, -19270982, -7966628, 2896419, 2820183, 10010495, +6634651, 11296838, -9837623, -7798050, 3795677, -2709051, 9285182, -18122614, -3067144, -19600084, +-6328098, 3499325, -2698313, -2498060, 20924544, 4317516, -15507516, -2394444, 1247151, -15888158, +-2145336, 735513, 9528385, 24019604, -8534637, 8001524, -13424457, 1979980, -7895761, -10216117, +9814000, 20998632, -16671452, 1566053, 18753974, -8513699, -1723356, -7085623, 12279311, 2910377, +-15232638, -238908, -5316096, -5000416, -1506460, -7543573, 11368242, -27006754, 5720897, 2200634, +-11320997, 15038828, 23167054, 16285442, 44119516, 13314399, -11294690, -15727633, -12931073, -7136088, +16210817, -5907191, 22505092, 1995012, 27401354, -32610076, -20845086, 9729712, -5319854, -3441880, +13160854, -8940511, -979789, 13888850, 6257231, 10280541, 15335181, 11870216, -2554432, 4795868, +-9319005, 248571, -320512, -6658810, -7144141, 4697084, -9858024, -939524, 15024332, 1269163, +-8891656, -11777874, 2224793, -14775224, -5346698, 15686831, 8264591, -2689187, -3554086, 2932389, +-2861522, -5093295, 1132261, -3751117, -5539971, -1080721, -7631083, 5334887, 4818954, 5101348, +-2779918, -2181307, 3434363, 7946763, 21740050, -51583632, -2232309, 29113972, -39231840, -1967095, +7495792, -40524628, 17874580, 4730370, 32141924, -3418257, 11240466, 9343701, -35674000, -29577830, +-11625403, -3036542, -17945984, -22035330, -11737072, 19996830, 13974750, 12040404, 1125281, 2084670, +6199786, 1060857, -25945898, -9838159, -33256468, -10761041, 18320184, 5311264, 12320651, 41408316, +10645613, 15528454, -828392, 8131984, 36468032, 27359478, 7512972, 17884244, 16426102, 36363340, +29867740, -40028020, 24780350, -2420751, 23709294, 24107114, 9961103, 43695924, 38613368, -21555368, +19031000, -459562, 18131204, -32247688, 2972654, 3286724, 1048509, -7433515, 20174536, 21828098, +-21461414, -7388418, -12664248, 7563438, -17812304, -22112102, 20485384, 35009352, 12770548, 36441724, +-10688026, 49579492, 48577152, 13451301, 25412784, -7622493, -12921409, 11287174, 11169062, 5302137, +3742527, 2818036, 6439767, -7107097, -12690555, -9169755, -23723252, -24917252, -10108206, 11363410, +-433255, 9999758, 1674500, 6023155, 14916421, 18261664, -6082748, 8283382, -1001264, -7795366, +-6431714, -5592585, -15651935, -7326141, 142808, -13616657, -4868346, -12274480, -6795712, 2441152, +16807818, -8149164, 5986111, 4598836, -2957622, 9163313, 5356898, 6953015, 106300, 12224551, +7866770, 5226439, -5053566, -7693360, -3312494, -16594143, 23670638, 42750492, -6043556, -58822800, +-18911278, 5793374, -4759361, -9910100, -13050258, 18254, -33720860, -20289962, -28028956, -4667556, +-8314520, 9120900, -20058572, -5878200, 5186710, 9159018, -404801, 10210748, 20093468, 4038343, +29066728, -18983218, 6874632, 1031329, 27721330, 7175280, -5640903, -28236726, 18502182, -4974109, +25273736, -21501680, -17140140, -16316044, -8802535, -26015690, -3734474, -4596152, -24546274, 13315472, +27581744, -13530758, 3943854, -36135708, 34476776, -11020886, -19036368, 15737297, 13668733, -20684026, +1630477, -12911745, 4367982, -9466645, 43202004, -1646583, -3887482, -10726144, 76389216, 1932735, +-10560251, 32787244, 26161182, -27827630, 21546778, -34085396, -19116900, -35612796, 27041650, -24500104, +12960064, 18727132, 14722611, -31552978, 39679056, -7161858, -52382496, -59499792, -23643794, -7285875, +-17481054, 13926431, 13480829, 23608898, 3666292, 2117956, -17901424, 17864380, 27713276, 41012644, +10572062, -11649025, 3767760, 34923988, 5580773, -19132468, -4984310, 37277096, 8293582, -21876952, +-5938866, 18463528, 10361072, 16829830, 10997801, 23670102, -58519, 13066364, 4336843, 16801376, +7623030, 26637924, 8533563, 16889422, -3558381, 5408975, 964220, -1810866, 6770479, -2183454, +8865886, 16691854, 2200634, 9775882, 908922, 12661027, -28516436, -6349573, 21442088, 1961190, +-16522202, -78857208, 5629092, 50667728, -30623116, -20429548, 40692668, -29619706, -1924145, -8421357, +39058968, -67092220, 37499896, 22244710, -18928994, 6990596, 36637680, 26148298, -12825846, 14957760, +6724845, -10232760, 17234094, -383863, 10451803, 15843597, -6757058, 3817689, -1703491, 7549479, +-9698573, -7829726, -611496, 13594645, -39766564, -19705846, 19796578, -4483409, -26360362, -31166430, +5409512, 38743288, -16798690, -24778740, 19077170, 28894930, -6303938, 7252589, -5087389, 26912266, +-14601278, 40360880, -5435281, 57445, 22154516, 449361, 5124433, -28702192, 45106284, -23322210, +-28193240, 21381420, -29853780, -9904195, 5090073, 14880451, 41685880, -14804752, 26010322, -5319854, +13640279, -70565240, -53900764, -9942312, -20978230, 10736344, 9802189, 26743150, -4168803, -5652177, +32003948, -35020088, -709743, 22332220, 22165790, -8181376, 24692304, 3059627, -5169530, -169651, +-5385352, 23533200, -13018046, -1388885, 23070416, 5231807, -5121212, 9010841, -11319923, 2892661, +-770947, 341450, 9391483, 4292820, -12951474, -3044058, 4155918, -10217727, -14795089, -263067, +11026255, 19115288, -16067473, 18673980, 6540162, -18797462, 15663746, 17709224, -8819715, -21288006, +19649476, -9767829, 3744675, 10662256, -10537165, -28176596, 9343701, 7467875, -15385647, -14788109, +1260573, 10525354, -12160663, 4465692, -5252208, -25849260, -11890617, 19741818, -32350230, 32572496, +-27478664, -34584688, 20266340, -16494285, -11000485, 20691542, -14766634, 17352204, -11517492, 8298951, +39908300, -34892316, -2122788, -4973572, 33683280, 4910222, 3558381, -31197032, -29256244, -10137733, +-8253317, -4206384, -9154723, 6273337, 2145336, -2831994, 5335423, 7531762, 3830574, 5935645, +-5692979, 15945066, -9681393, 15273977, -27705224, 1394254, -22365506, -29133836, -17003238, 39661340, +-16513076, -16879222, -12429098, 9419400, -7414724, 17869748, 25870198, -26317412, 24329380, 4674535, +-36509368, -18103288, 76741400, 39979704, -57437672, -10503879, 37172404, -18251464, -20699594, 15182173, +-17832704, -39594228, 29127394, 13480292, -53949084, 22772990, 27973658, -31584652, -20682952, 32844688, +-7520488, -24033026, 6001680, 16491064, -38977364, 7845832, 7384660, 11713986, -29653528, -8576513, +-2197950, -9269076, -1661079, 2323577, 3753802, -18040474, 3306588, 27535036, 9818295, 2073396, +9354439, -115964, -4110821, -14574972, -4236449, -7727183, -10579578, -25217364, 7210177, -14238890, +-3668439, 31750008, -27381490, -17787608, 23516020, -16363825, -5697274, -6876780, 10802916, -17754858, +-6206765, 29306710, 15701864, -13761075, 16642461, 9494562, -11679627, -7271380, 39763344, -31082142, +-24082418, 42306500, 144955, -33065880, 4965519, 21026550, -19434728, -41378252, 28256590, 3843459, +-45949172, 8370355, 13303661, -33428268, -352187, 23130010, -5953899, -14636712, 12332999, 9922985, +-22917408, -1946694, 17573396, -12840342, -16414291, 11803107, 1065689, 47661788, 67630704, -27452358, +75749800, -6299644, -21081846, -16404628, -26006564, -2481954, 12510703, 44523240, 1290101, 13481365, +-11636677, -39021388, 488553, 1071594, 25258166, 4490389, -29472066, 54006528, -23452132, 9788767, +24206436, -27467926, -22218940, -39045548, -17157858, 23500450, 29549912, 36381056, -14099841, -90383288, +19737522, 46577308, 60018948, 51359220, -1014149, -26181046, -32134946, 10459319, 30505542, -20030116, +-10581189, -80161808, -49060336, 42406360, 71888088, 14339822, -2197413, -17960480, -31764504, -7857106, +19786378, -28388124, 10724533, -4443144, 45371496, -2433099, 17567490, -89640800, -11539503, 602906, +54550916, 41939280, -1358283, -27210228, -7574175, 64639256, 29239600, -76978160, -94932200, -37516004, +18836652, 146545360, 15694347, -26080116, 20058034, -39910448, 104294152, 31352724, -83384640, -52591336, +-10557030, 73229728, 10901164, -31287764, -28654948, -26902064, 20842402, 39155608, 19754702, -43373800, +-3711926, -15298674, 35173096, -4421669, 21220896, -8106214, -9138080, -28991030, 10932839, -9308805, +-3148211, 21456582, -34799436, 19651622, -5347235, -5925445, 51003, 15376520, 34307660, 16739635, +2246268, -7451232, 7201587, -964757, 13888314, 3922379, 15339476, 3149285, 3831648, -18130668, +8039642, 8494372, 6217502, -585189, 5113159, 2524904, 15222438, 17691508, 14202920, 1298154, +-10040023, -15431817, 4350802, 6841346, -8898635, 7502234, -12367895, 31361314, -36153960, 1126355, +-14556718, 8357470, -22401476, 21018496, 5786395, -11906723, -22601728, -11073499, -4313758, 6595459, +-30842160, 7133941, -15126875, -5842766, -24164560, -11325829, 19512036, -20537996, -7321846, -2785823, +9509594, 6515466, -8068096, 11129334, -17712982, -1347009, 158914, 9542344, -11627550, 16844324, +12463995, -12692702, -14840186, -5573257, 23795730, -17102560, 7467338, 17812304, 3882651, -17192754, +-6691022, 7530689, -10923712, 8150774, 708670, 3998615, -16040629, 3461744, -13062069, -452045, +11981885, 15354508, 11774653, -8693551, 11228118, 1559073, -14281303, -1974611, -128849, 17088602, +-4748623, 3714610, 14642617, -3034395, -19292994, 26964878, -10992432, 16015396, 11537356, 2889439, +3652870, -11172284, -14000520, 18636400, 2755759, 16418586, 4843113, 9022653, 4446902, -345745, +-915902, -14040785, 1546188, 3970161, 4952098, 5786932, -1816234, 6714108, 1063541, -683974, +1736241, 1003412, 6699612, -1680406, 5208722, -6356552, -1733556, 166430, 448824, -3499862, +-2158758, 12724914, 7831873, -1961190, -9066676, -9990094, -3856344, -3925600, 11394011, 1333587, +-3560528, -7405598, -4006668, 1260573, -6411850, 13424457, 1113470, -5184026, 2138357, -56371, +-2527588, 3935801, -4012036, 11694122, -10950556, 8098161, -10666014, -29316374, 54380192, 4793184, +2824478, -22190486, 12495670, -2015413, 14158897, 10750303, 16597364, 1690070, 4114042, -9583683, +2560874, 15194521, -1659468, 8243116, -1489280, 2517388, 3243237, 6070937, -6659884, 11465415, +-8068633, 913754, -1429150, 3788161, -1191853, 2184528, 8683887, 9542880, -4837207, 4126927, +1736777, -2319282, -4318590, 12761422, -4123169, 2583423, -3826816, 6604049, -194884, -6333466, +12823699, -8213588, -2945811, 3295851, -6258304, -3839164, -2049236, 395674, -2490007, 79457, +-1397475, -3493419, 4258460, -8491150, 5116917, 3437585, -3009162, 5405217, -4357781, 6428493, +-3527779, 1132798, 1137630, -4073240, 6316287, -115427, 756451, -2160906, 8557185, -10448045, +10871636, -7918309, 1182727, 1782948, -443455, 1926293, -1893007, 6264210, -6122476, 319438, +5345624, -6707129, 4011500, 3635153, -1103807, 714575, 3607773, 1677722, -1864553, 2392297, +548145, -943819, 384936, 2090039, 128849, -2872260, 627602, 1045825, -1552094, 3106335, +-831613, 2537252, -1820529, 343597, 1945083, -1442572, 208306, 1340030, -2188823, 3418794, +-464930, 1647657, -580357, 3605088, -1436667, 357556, 3329137, -3116536, 3871376, -2391760, +1606855, -2456185, 3797288, -673773, 10441602, -49767932, -123915712, 19270444, 94399624, 87701088, +152145456, -38821672, -40707164, -103574744, -141405360, -29154774, 51162724, 54731304, 103092104, 55992952, +4440460, -26766236, -71937480, -51158428, -8811662, -8011188, 25665650, 23781770, 13775571, 8771397, +6939057, -3802120, -17655536, -1380832, 20453708, 145492, 4326643, -1182190, -15287936, -11740830, +-26020522, -25537338, 11604465, 10664404, 23705536, 35984848, 27007292, 13160317, 4800700, -38884488, +-27454504, -21288542, -21274046, -23790898, 4998805, 15133317, 26389352, 33639256, 27888834, 6044093, +-3251290, -22356916, -22755810, -13575855, -6558952, 2158221, 3799972, 7518877, 710817, -7324530, +2521146, -11673184, 6123550, 9859634, 1185948, 19770808, 23997592, 7370701, -4495757, -26379152, +-34640520, -14010183, -6344741, -4088272, 17709224, 13634911, -3538516, 15467788, 16899086, 9376987, +11696270, -6487548, -12441447, -10103911, -14322642, -11471321, -2054605, -11016054, -4267050, 543850, +8865886, 12368432, 17988934, 15412490, 14331769, 11264089, -5810017, -13492103, -22464290, -27848568, +-16089484, -12125230, 1646046, 13182328, 19610820, 22568442, 17982492, 16413218, 10714870, -14107357, +-24949466, -22682260, -10966662, -3314104, -928787, 1613834, 9666898, 8343511, 4134443, 1832877, +7934952, 4354023, 6920803, 1810329, -10374494, -11609833, -7459822, -3148211, 3732864, 2458869, +-3670587, -2245731, 3725884, 1773822, 1695438, 4695473, 7846369, 3408594, 345208, -3952444, +-4258460, -3828427, -4348655, -6011881, -4258997, -450972, 3551938, 4544613, 6331856, 6458557, +3845606, -332860, -2737505, -3791383, -3174518, -3306051, -2165737, -1748589, -288837, 1487669, +2672007, 1889249, 1401770, 854699, 1426466, 652298, -390842, -2512019, -2100776, -912144, +949188, 1065152, 516470, -1080184, -647466, -289910, 143345, 0, 756451, 957778, +641024, -492311, -200790, 83752, 599685, 225486, -157840, -796180, -796716, -895501, +-185757, 229781, 344671, -29528, 395137, 705985, 1163936, 606664, 3758, -780610, +-862752, -899259, -387084, -205085, 3221, 118648, 578210, 399969, 267362, -62277, +-8590, -107911, -31675, -82678, 110059, 4832, -104153, -298500, -116501, -40265, +102542, 5369, 39728, -20401, 34360, 12885, 81604, 35433, 49929, 9664, +9664, -28454, -39192, -47245, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -5833103, --75162, 1282048, 973347, 4169340, 551366, -506806, -2681670, 6125160, 3785477, 202937, --750546, 6084358, 2068564, -1939178, -5328981, 3406983, -1532230, 2646237, -5071820, 330712, --1210107, -3767760, -1018981, -1894618, -699006, 292058, 27917, -2746632, -1685238, -434329, --526670, -1707250, 1833951, -173409, -1826972, 3263638, -5421860, -2570538, 2592550, -3255048, -451508, -2019708, -2975339, 2027225, 1840930, -1596117, 2039036, 3926674, 2211908, -2034204, --2379949, 430034, 773631, -2398739, 2602213, 4329864, -3689914, -1178969, 2132451, 1595044, --877784, -1129040, -1801202, 2386391, 727997, -2858301, 3253438, 1583769, -2668785, -2002529, -3420942, -2579665, -3294777, -6212134, -5399311, 2939905, 3402688, 272194, 1494649, -590558, -1224066, -2301566, 3490198, -291521, 1615982, -1600949, 901943, -1458678, -1136556, 52613, -2236604, -496069, -568546, -1003949, 333934, -759136, 155156, 258772, -461172, -547071, -71941, -33823, -180926, -600222, 302795, -224412, 7785165, -754841, -1580548, -3195993, -4980552, -2660732, -290984, -4058207, -4331475, -5443871, -2566243, 4258997, -4421669, -1655710, --1561221, 1473174, -1107565, -6063420, 3148748, 1512902, 11769284, -1207423, 5501316, -1103807, --300648, -537945, 599148, -2487860, 4551592, -1202054, -929324, -2756832, -514859, -988379, -7057705, 1308891, -726386, -6628209, -688805, -1277753, 1987496, -4213363, -1177358, 1136556, -937914, -1167694, -723165, -2618856, -997506, -3147137, -1428614, 6101001, -1809792, 1930051, -3393561, -826781, -3331284, -4355097, 1116155, 1020055, 1300301, 2704219, 3192235, 2639794, -1511829, -1210644, -1188632, -1400696, -6144488, -1466731, -639413, 2967823, 2514703, -1515050, --165356, 3259880, -3417183, 1340030, 79994, -849330, -1984812, -2996814, -54761, 1784022, -1785096, 1900523, -812823, 781684, -729071, 159988, 2652679, 1084479, 187368, 24696, --427886, -62277, 150324, 533650, -360240, -371515, 1138166, 595927, 1159104, 1212791, -226560, 675384, -195958, 197569, 64961, -539018, -1395328, -246424, -10292889, -2487323, --173946, -2175401, -1500017, 3646427, -7222525, -6047851, -3530463, -2342905, 1060320, 8180839, --1742683, 11274, 1007170, -5815386, -1503239, -4852240, -730144, 8662412, -642098, -4172561, --2707440, 136365, 1785633, 1757715, -2398739, -10909217, -5211943, -1436130, -4198868, 416075, -221191, 4456566, -2836289, 3961571, 983011, -1997697, -5835787, -4879083, 6804839, -5578626, -3748433, 1117228, -3572339, -1320166, -3187940, -2276870, 3215857, -5994164, 3135863, 1085553, --74088, 1036698, 444529, -572841, 156766, -3023657, -4162360, 328028, -1253057, -3062312, --1226750, -4750234, 5577015, 3831648, 982474, 4575751, 561567, -1905892, 5666136, -2951180, --1846836, -1889786, 4317516, -4166655, 1887638, 3048353, 191126, 1899449, 4699768, 1743220, --119722, 326418, 1018444, 807991, -900333, -530428, 80531, -210453, 1523640, 760209, -1609539, 1211181, 474594, -1402844, -1660005, 1045288, -38655, -66035, 1556926, -1041530, --834297, 4832, 388695, 534723, -132607, -1697049, 1455994, 415538, -1267552, -7022809, -8428873, 9573482, 2566780, 2516851, -2840584, 4423280, 2180233, -5721434, 1691143, 3555696, --6818261, -5965173, 5847598, -5236102, -821413, -3402151, 5895380, 1227287, -753767, -2271501, --114354, -3943317, 3523484, -2006287, 2107218, -1006633, -98247, 3806952, 1460289, 470836, --1568737, 3728032, 2352032, 1056562, -390305, 3858491, -369367, 642635, -2544231, 4719096, -1017370, 1835025, 3451006, -9713069, -3188476, -1978906, -3507378, -3433826, 921271, 5295158, --2376191, -1515587, -2998424, -1399086, 1108102, 2282775, -6683506, -481573, 2265595, 186831, --576063, 2798171, 1827509, -6300180, -1788317, -1437203, 3798899, -4174171, 5386963, 5793374, -3031173, 1126892, -2787971, -231928, 423591, 3842922, -1100585, 384400, 426812, 505732, -5763846, 544924, 6145562, 2194728, 44023, -3058017, -1741609, 2443837, -565862, -97711, -201327, 56908, 520228, 2486786, 692564, 911607, 54761, 875636, -2107755, -275415, -608275, 720481, -572841, -434865, -30602, 716186, -658204, -560493, 819265, 722628, -1519345, 615254, 1402844, -970126, 71404, 57982, -613643, 1253057, 1928440, 10733123, --1941325, -107374, 3946001, 2573222, 1933809, 3651796, 9534291, -2601140, -830539, -9098888, -221191, -7810935, -9931575, 405338, 4287451, -12827457, 4409858, 4264366, 2347200, -3858491, --3054259, -4211753, -1581622, 301721, 307627, 4150012, 5445482, -685584, -5290326, -3175055, -4038880, -5665599, -2814277, -4778688, 1076963, -7758322, 3928285, 678605, -497142, 1318555, --220654, -1726577, 37581, 5096516, -5779416, 7100655, -5313949, -557809, 1326071, -3478387, --2868501, 2820720, 1383516, -1053878, -2690260, 5319854, 2216740, -3590593, -7307887, 921271, -1721745, 4363150, -154082, -1825361, 393526, 2346663, -1723893, 10273562, -3391951, -1582696, --7254737, -4744865, 11527155, 4748623, -2537252, -580894, -3983045, -4400731, -340376, 1680406, -322659, -2093797, 2500208, 1449015, 3458523, -282394, -2477123, 1087701, 115427, -1053341, -1019518, 1056025, -250182, 534187, 1371705, 536334, -313533, -945967, 578747, 446140, --955093, 1982127, 1602560, 609349, -934692, -2331094, 178778, -96100, -89657, 1167694, --1195612, 878858, 1275068, 404264, -728534, 2997887, 6936372, -9137543, -5376762, 6484327, --4763656, -5074504, -5579163, -6677064, 4891968, -1646046, -148176, -1493575, 304943, -7435126, --1444183, 3483219, 3798362, 907312, -3905199, -5693516, -4721243, -6010807, 1279363, 7291781, -1023276, 2396592, 2528662, 2469069, -4205847, 4514548, 2821794, -3130494, -2516314, -9766756, -1557463, 2246805, -7668127, -558346, 2418067, -1394791, 998580, -643171, -8231842, 7091528, --7665980, 6115497, 370441, 3107409, -8635032, -4803384, -7728257, -6075768, 1174137, -2134062, --2719251, -3403225, 16643, 3917010, -7149510, -73551, 2127083, -2273112, -7977365, -4971425, --1639604, 1559073, 3928285, 1738388, -6565395, 7094749, -2234994, -1491964, 7039989, -9141301, --2989297, -1785096, -1609002, 11045045, -3978750, -141197, -4130685, -3403762, 2028298, 1560684, --223338, 1223529, -852014, -1505386, 2079838, 74088, 863825, 925029, 2681133, -995896, -796716, 636192, 205085, 742493, -3003793, 3985193, 3597035, -1175210, -598074, 606127, --499827, 721018, 132070, -231391, -1437203, 937377, -735513, 390842, 3497177, 2267206, -1884954, -1389422, 2497524, 1035087, -992137, 1174137, 390305, 879931, 295279, 14107357, --12709882, -6732898, -8490077, 6011344, 2221035, -4371203, 2786897, -139050, 8365523, 458488, -15032, -8210904, 5675800, 9242233, 9700721, 8051990, -4600984, -767725, 1184337, -5268851, --3624953, 1290638, 519691, -7559680, -3738769, -3228742, 3588445, -639950, -5725192, -2675228, -1789928, 4424890, 486942, -1641214, 3221, -4048007, -179852, -319975, 544924, -8635032, -4933307, 5821828, 1149978, 2966749, 3446175, -7004018, 9858024, 8865349, 1593433, -6242735, -3489124, -2253784, -9220758, -2399813, -2943126, -206695, 515933, -238371, -5586679, -5011690, --11438035, -9561134, 92879, 5696201, -5258651, 2365453, 707596, -3585224, -9321690, -980326, -5395553, -3660923, 4839892, 9527848, 2882997, -4015258, 5501316, -75699, -607738, 2566780, -4278325, -428960, -772557, 1140851, 2755222, -1586454, -6265821, 310311, -196495, 612570, -755377, 2042794, 4551592, -1687385, -822486, 3404835, 3118146, 625992, 437013, -2269890, -4387846, 449361, -314606, 2594160, 809064, 916439, 429497, 2335389, 2101850, 2323041, -3875134, 264141, 2305324, 284542, 2568927, 1186485, 1449552, 963146, 2430952, 2117956, -1740536, -13553843, 1387274, -5086852, -18141404, -13965086, 3439732, 88047, -3163244, 3185255, -8663486, -1424319, 5174362, 4583267, 2644089, -1426466, -4754529, 3809636, -4056060, 448287, --3489661, 5405753, 9911711, -8989903, -2623688, 521302, 3573950, 933082, -2834142, -1660542, --3381750, -290447, -4175245, 5231807, 1111323, -6327024, 6959458, -7053410, -2294586, 8571144, -7531225, 6365142, -7352447, -4822175, -6593312, 7556458, 10228465, -180389, -2184528, 8129300, --12068858, 1451699, 3162707, -1185948, -10152766, 9057549, 3122978, 4591857, 8464307, 430034, --12241731, 3175055, 4936528, -3140158, -972273, 8374113, -8769249, -8188892, -7117298, 832687, -10751377, 5830955, -1633698, 12370580, -16557099, -6099928, 120259, 7912404, 3617436, -2400887, --13178570, -2062658, -5334887, 1442035, 4902169, 12749610, 2094333, -3621194, 1588601, -2189360, --934692, -4237522, -67109, -3493956, 1104880, 3468186, 1885491, 3191698, 3529926, 1136556, -685047, 15569, 549756, -1762547, -1925219, 153008, 3722663, 1432372, -565325, 667867, -1437740, 3059627, 308701, -1034013, 420907, -1009317, 2361695, -4571456, -2873870, -2024540, -2752537, 2468533, -4107063, 887985, -14602889, 14660334, 5929203, -408559, -1544578, 1187559, -2477659, 7919920, -1561221, 831076, -2598455, -1889249, 4446902, 2268817, 5171141, 2248952, -2965675, -9989557, -4168803, 16632261, 1641214, 4909685, 6960532, 2583423, -5701569, -10535018, -3217468, -4423280, 346282, 3641059, -5268315, -6186901, 7431367, 8731132, -4621922, -3297461, -6751689, -8403640, 3610994, -6478958, 2846490, -6271726, 8985608, 1211181, -1246077, 3131031, -15473157, 4234301, 5963562, -1800665, 739271, 2597918, 11412802, -1042066, 16378858, 440234, -7754564, -332323, 14779519, 5201743, 11016054, 8351564, -1920387, -5011690, -1393180, -5718212, --6311455, 8646843, -1813013, -3447248, 1291711, 77846, -4505958, -2215666, 1295470, 3843459, -1017370, -7488813, -7432978, -3878892, -7588134, -245887, -221191, -2260227, 2022393, -196495, -2996814, -496069, -3132642, 587337, -1359894, -5716602, -3640522, 766115, 7521562, -3241627, -2744484, -900333, -146566, 3474629, -2703145, 1153736, 1657857, -1967632, -1380295, -987306, --2237141, 1030792, -2780991, -3578782, -1416802, -3873524, 4743792, -1386738, 226023, -447750, --353798, 476205, -1661616, 679142, 1148904, 595390, 1891933, 2574833, 391379, 1913408, --1520418, -4176319, 756988, -1173063, 1668058, -1719598, 17145510, -4397510, -66035, -20947092, --664109, 11317239, -5799817, 9842991, -13291313, 2018635, 1428077, -312459, -17652316, -726386, --29469382, 1466195, -3174518, -12307766, -2073932, 1727651, -6400575, 1192390, 7556458, 1214939, --6680285, 1321776, -2009508, 6617471, -7188702, 485331, 9563282, 2196339, 871342, -1354525, -7349763, -4617627, 848793, 27917, 5661841, 1134408, -9887015, -5257577, -6947647, 8301098, --18594524, 9096204, 7524783, 6439767, 3656628, 1444183, -8088497, 5878200, -12021077, -2818572, --2455111, -2463164, -444529, 815507, 3981435, -9267466, -3566434, 15760919, 6678138, -5683316, --6567542, 1755568, -2673080, 4835597, -3099893, -924492, -4990215, 14292577, 7354595, -4846871, -989453, -7213935, 1781338, -5436355, -1794760, 5698885, 5378373, -1606318, 10499048, -4045859, -5260261, -6774774, 7362648, 1097901, -4121558, -5701032, -8435316, 2200097, -835371, 3925063, --989453, -2491618, 1671816, 1626719, 2689187, 2113661, 4872641, -153545, 1639604, -3653944, -3081639, -2616709, -1221918, -1957968, -284005, -4662724, -697932, 1853815, 4342212, -4006668, --1836099, -2891050, 3014530, 2255395, -1751273, -348966, -3020436, 2425046, 399969, 10776073, -10889890, 6299644, 5622112, -5371394, 6260452, 10463614, -7860327, -333397, -20323248, 11562589, -7881265, -2944200, 4651450, -1360968, 1576253, 7176354, -4584341, 11257109, -10245644, 926639, -12698608, 5521718, 743029, 9774809, -3518652, 4458176, 2553358, 5209259, 8667244, -5203890, --1079647, 15995532, 7991324, -412317, 2181307, -10939819, 14741938, -12502650, -817118, 12876312, -3984119, 13867376, -8774081, 2170569, -595927, -3473018, 1839320, -13521094, -9468255, 12618614, --6345278, -2782602, -4316442, -14376329, 10137197, -3440269, -2394981, -6407555, 6228240, 14472966, --11486353, -2401961, 9782862, -10837276, -4718559, 8690866, 12202539, -20272782, -5407364, -1803349, -8603893, -376347, 10051834, -2516851, -7392176, 418759, 5345087, 12974022, 6566468, -8840653, --468688, 6346351, -13016435, -8035347, -2500208, -6733972, -6781217, -869731, 6164352, -5910412, -1438277, 6359236, 1782411, 1080184, 4494147, -1185411, 2893197, 2723546, 2739652, 1503775, --513785, -3988951, -1334661, -1161789, -3568044, -1684701, 556198, 389231, -532039, 488553, -3941169, -3316252, -1046898, -2480344, 1893007, 1780801, -766652, -2757369, -5944235, 2934000, -2274722, 3803194, 1066226, 879931, -412854, -3761318, 1500017, -1548873, -1683627, -1137630, -1032403, -727460, 10566156, 22397718, 4325569, -13252658, -4725001, 4389994, -29392072, 917512, -176631, -4612258, -1444183, 13564044, -22180822, 4865661, 10368588, -8170639, 9190156, 17127792, -4252018, -15855946, 4291209, -4005057, -284005, -15544560, -4685810, 14146012, -1585917, 12968117, --3412352, -4571993, 2131915, -11011222, -6171868, -7933342, -5859409, -4346507, 10606959, -11732777, -1913408, 20431160, 13821205, 4587025, -20783884, 3429532, 13656385, 5681705, 824634, -7446400, --9016210, -22231288, -15322833, 3139621, -7574712, -7622493, -421444, 9451076, 6734509, -6710350, -308701, 13459354, -5178120, -2321967, 631897, 17703856, 694174, -932545, 9043591, 2784750, --20172388, 5621576, 5870147, -142271, -16700980, 7013145, 9817758, -7396471, -5220533, -13760001, -3674345, -5082020, 5215164, 2559801, -3206193, -5862094, 3809636, 1686848, 5870147, -2958696, -9141838, 3173444, -6230387, 701153, -299037, -8642011, 186831, 643708, -3758, -228707, --4502200, -3972308, -1797981, -163746, 5742372, 1840930, 3015067, 4571993, -2088428, -2804077, -2223183, -4531728, -3981972, -228170, -197032, 1333587, -1299765, 949725, 2838437, 2931315, -398358, -1840930, -402653, -301721, -479963, -35433, -719944, 286152, -77846, 3819837, --2214593, -2872260, 7117298, 5000953, -663572, 1889786, -3189550, 1360968, 99858, -1345399, --6765647, 22994182, 1116155, -4823785, -473520, 10078678, -5087389, 2668785, -2643016, 2266132, -8622147, -16147466, 16747688, 18991272, 5236639, 7953743, -6635188, 10708427, 25054692, 676457, --3033858, -4782446, 10582799, -3939559, -6243272, -2262374, 3660923, -12685723, 5442798, -11188390, -12506408, 2746095, 12595528, -8120173, 11468636, 3331821, 15055471, 2393908, 3060701, -5560909, -9324911, 2250563, -3138547, 13531294, -5455146, -9844065, 19174882, 15285252, 5557151, 14442364, -20994874, 25490630, -8096014, -8141648, -9167608, 3089692, -11891154, 13763223, -1846299, -1377611, --19817516, 4465156, 22213570, 22645752, -1006633, -3088082, -15741592, 140123, 14705968, -7677254, --9375377, 8286603, 1195612, -8190503, 2750390, -1414655, -5058935, -1215476, -4355097, -269509, -8486855, 6302328, -1868311, 1443109, -2195802, -8690329, -11317239, -2181844, 5469104, 2168422, -7788387, -1682554, -7556995, -2126546, 8082055, -3938485, 4552666, 7458211, -7699803, -2106145, --846645, 1845762, -517007, 4954782, 3585224, 1739999, -7670812, 1837172, 4038880, 1179505, -1599875, 2657511, -6815576, -3212636, -96100, -419833, -3662533, -8790187, -2925410, 696322, -4418985, 924492, -3670050, -4232154, 1566589, -30114164, -20984674, 11334419, 4515085, -15690052, -1830193, 7226283, -14301167, -8913131, -6063957, 17476758, 7923678, 5727876, -5313412, -4012036, --4188667, -10550050, -14178761, -25070260, 13344463, 11494406, -5190468, 28767154, 13889924, 27632746, -18985902, 1978906, -8606578, 7493108, 3540127, 12699145, 14494978, 16063178, -2105071, -2545842, -6915971, -6914898, -1488743, -6063957, -11669426, -19209242, -5505611, 20059644, -4744328, -7660074, --11051488, 8135205, 12157442, 8239895, 948651, 11933567, 22917946, -13314935, -6036040, -10186589, --7425999, -21663816, -5209796, 5813775, -9826885, -7536594, -25104620, -35691180, 4092030, -23420456, --37141804, -26702886, -11205033, 24420110, 8489003, 15015206, 11187853, -24571508, -10355703, 2437394, -12600897, -12059194, -14512694, -13864691, -4275640, 7692824, -8291971, -30681636, -19374598, -4158065, --6155225, -1927904, -4476430, 17799418, 16085726, 16856672, 16994112, 5926518, -28991, 6658273, -1882269, -213138, 5098126, -13638132, -5287642, 6386617, 8278550, -47782, -4445291, -4714801, -2151779, -7264937, -10953240, 10495289, -8139500, -3828963, 1005559, -9263708, -8978629, -16045461, --6315750, -3497714, 1248762, 14055280, -3442953, -1667521, -4267050, 7352984, -3614215, 750009, -6740415, 917512, -4648229, 3449396, 6715718, -3698504, -943282, 181462, -2265059, 4105989, --57084948, -8475581, 19116362, -19057844, 8643085, -7079180, -30697206, -9179956, 34087544, 42752640, --21809844, 1343788, -7125351, -33865816, -26820460, -25352118, -27051852, -14232448, -17458506, -945967, -6504191, -4272419, 7647190, 7035157, -10719165, -2567854, -14931454, 7046968, -23851564, -21507586, -5883569, 4314295, -6063957, -7566659, 19779398, -5145908, 27235462, 6386617, 25290914, -16222628, -11353746, 7464117, 30509838, 16462073, 11089069, 3331821, 5130876, -3077881, 9392557, 12780749, --9067750, -13042742, 21539798, -2448131, -25663504, -49961208, -60017336, -43275016, 7850664, 352724, --55848532, 18759344, 10203769, 14545980, -18657338, 2850248, 7231115, 2915209, 29549374, 29908004, -59574956, 19983946, -30867394, -40006008, -24235964, -21937082, -25232932, -22607098, -217970, 12943958, -17514876, -10550050, 22873922, -18774376, -26103200, -20423644, -13211856, -10049150, -20272246, 13389024, --870268, 12815109, 10172093, 1751273, 22475564, -11192148, -4444218, -21511344, 7907572, 11892228, --1256815, -1701344, 7155953, -20665236, 1330366, -7206955, 4558034, -9849434, -13806709, 8926016, -140123, -5762236, -1724429, 10443750, -7501698, 5493263, -6945499, 6222871, 5790153, -2772938, --6892349, 4870493, 5682242, -15242839, 6964290, -3766150, -4002373, -4584878, 3849365, -10273025, --4702453, 32338956, -8652212, -61108796, -17459042, 50303192, -6958384, 11214696, 7183870, 9385577, -17638894, 14417131, 5058398, -9982578, -3674882, 2483028, -10845866, -2550674, 18516678, -16564615, --9809705, -16608639, -3927748, 2826625, 2177549, 4363150, 8698383, -12646531, 11304891, 27509266, --427886, -16115791, 1544578, -10561325, -3543885, 16292958, -17146584, 1901060, 5544803, 19927038, -29042568, -18459770, -10390063, 11149198, 1664300, 3098819, 3485366, -12276627, -31047782, -5647345, --14372571, 28292024, -53727892, -35509180, -14426795, -5964099, 15729781, 3162707, -18849538, -3310346, --21736292, -23780698, -8290361, -17233020, 3311957, 13921063, 64969432, 11870216, -9425306, -41816340, --34053720, 10013716, -836982, -39276404, 21336324, 20838108, -39567388, -919123, 10581726, 11310260, -43146704, 18659486, 9205726, -42606612, -21622476, -29468308, 26886496, -2895882, -8473434, -4959077, -8572218, 27867358, 24114630, -12797392, -24894168, -37015100, 9196599, 21503290, -7395397, -4026532, -19443316, 10687489, 16987670, 3954591, 6242735, -14445049, -3936338, -6985228, 7521025, 7239168, --1685775, -3588982, -1810329, 9846749, 11713986, -17002164, 9977746, 6998113, 14101988, -9178345, --5820755, 8303246, 3382287, -12410845, -932008, 13791677, 3015604, -10851235, -3557844, 1433982, --20789252, -71877888, 10918344, 11826729, -1828582, -586263, -5012764, -20276004, 8753680, -4013647, -37523520, -37562712, -7225209, 39516920, -1240172, -25755308, -2685428, 23547158, 28492276, 17730162, --4474819, 20562156, -14578730, 14071387, -5602248, -4620311, -12545599, 22469122, 15446850, -13757317, --6054830, -1544578, 22757958, -1557463, 2885144, -13740137, 15502148, 10264435, -15950435, 30406220, -1849520, -26334592, 24240258, -28656022, -14889578, 27108222, -56219512, -35625144, 31346818, -19063212, -23368380, -35435628, 8522289, 13721884, -19272056, 1285269, -1058173, -36588828, -8114804, 38863548, -40960568, -45502496, -14783277, 14583025, -36410584, 48192216, 48227652, 7372312, -67815920, -35321276, -73147048, -37837588, -7154879, 59464360, -34069292, -69990248, -15323370, 64256468, -13205951, -45951856, --10916733, -84339736, -3360812, 69333656, -24545202, -68061272, -6453189, -18706194, -8722005, 21000242, --1914482, -230318, -24476482, -15781857, -7435126, 28083180, -34372088, 2304787, 6149320, -10345502, -1780801, 33321966, -20389284, -25722560, -2926483, 9819906, 21096342, -7568269, 10901164, 16252156, -2367064, -23157926, -12101607, 1146219, -18358838, -8595303, 36826124, -13065291, -34768836, -8868034, -21218212, 9146133, -2075006, 5200132, -31369904, -17821966, 24967718, 36698348, 5000953, -26138098, --12434467, 1769527, 10190347, 18702972, 2509335, -10253161, -39760660, -37519760, -836445, -47367584, --13868986, -20135344, -18868328, -14310831, 30993020, -3370476, -9681930, -13002477, 6220724, -16640851, --39335456, 30629022, 9853729, 26456998, 8511551, 27359478, -10654203, -16908212, 6304475, -28616294, -22472342, -25920128, -5234492, 17077326, -19412178, -4155918, -11683922, -31386010, 4993437, -23700704, --16829830, -20682416, -15046344, -9459665, -20763482, 3704409, 23614804, -15791521, -5331665, 2873870, -21794274, -9804337, 7915625, -22055194, 36110476, 11192685, 15663209, 9800042, 34656092, -2027225, --40044128, 8893804, 14980309, -11229729, 195958, 21235392, -27744952, -27858768, -32248226, 28123446, -8679592, -40097816, 15962246, -26473104, -4821101, -37424196, 16904454, 26547192, 5856725, -41459320, -23625542, 19199578, -4928475, -36449240, 10193568, -22005802, -7159711, -1614908, -10755135, 18009334, --15913391, -29578902, 15041512, -6635725, 12782360, -208843, -729608, -243203, -7644505, -9254044, -6623377, 26313654, -2830384, -37318432, -9923522, 15433965, -18025978, -7924215, 18274012, -6824703, --2176475, -14987288, 29614874, 17067664, -8216273, 13037373, -1932198, 5796595, 24113020, -4412005, --20348482, 8556649, 13950591, -10838350, 17506286, -2895345, 10969883, 1080184, -7289633, 14118094, -21196738, -12034498, -21407190, 8404177, 13895830, -10937134, -1717450, 12311524, 4791573, -8567386, --8574902, 10903311, 35111356, 66104916, -16107738, 32705640, 6230387, -15805480, -29783450, -17409650, -38371776, -12775917, 6985228, 14817637, -4070555, 35391068, -5406290, 27748174, 28959354, -35898412, -18249316, -9492415, 681826, 12998182, 10697153, -1336809, 5619965, 10506564, 35481260, 36575404, -28105730, -20820928, -7264401, -48864916, -1670742, 11421392, 21807696, 4984847, -40550396, 17588428, --24422794, 31221192, -28480466, -19854024, 1833951, -23736674, -4269198, -13732084, 47976932, -26403312, --13107703, -50567336, -16645146, -26572962, 71096208, 43301324, -15247134, -48091824, -51731808, -30656402, -35254164, 46252504, 23248658, 6791417, -62035972, -28731720, 20091320, 17322676, 2462627, 22339736, --13052942, -40708236, 19031536, -69045360, 74855912, -7029251, -48767208, 112939384, 15968688, 39305932, -67460512, -112114216, -81013824, 22391276, -6891812, 17160542, 24319716, -70070240, -5426155, 14178224, -1174137, 58756228, 3930969, -30707942, -3448322, 31609886, -18556406, 13842143, 15984258, 702227, --13079786, 15501074, -41049688, 31221728, -8201777, -12924093, 17346300, 4763119, 1014686, 18540300, --4597226, 11144903, -2497524, 7190849, -5564130, -21336324, 12776454, 9169755, 12071006, -12348, -134755, 8549132, 4462471, 3396246, 24730422, 27850716, 1370632, 18301392, -17300128, 2721399, --11431592, 21155398, 18960134, 3118146, -5743445, -12458626, -29805462, -12890271, 2354716, -29436632, -19801410, -41559176, 25612500, -17151952, 42075112, -19087908, -2014340, 23916526, 4217121, 2017024, --10909754, -9495636, 1052267, -16230145, 17738214, -2167885, 18842558, -14900852, -14627585, 4867272, -715649, -15111842, 9434433, -1997697, 8234526, -4715874, -4074313, 7778723, -7542500, -725850, -5873368, -3175055, -3598646, 29778082, -2055142, -10131828, -5351530, 14072997, -1289564, -16410533, -8656507, 17365626, 3551938, 287226, -10334228, 3542274, -8361765, 7882876, 21285322, -7686918, -9752797, -8157754, -2351495, -8925479, -4110284, 5456756, 6921340, -12575664, 7537131, 2065342, --1524177, -12581033, 2190970, 4351339, -9141301, 13180718, 11267310, -22610856, 5805722, -20772072, --23332410, 15919833, -8251706, 19261854, 10679973, 401043, 10056666, -3301219, -11978127, -3085397, -830539, 13348221, -5999533, 3943854, 5701032, -8001524, -1293322, 4487167, -2222109, -1728724, -7980049, -321049, 3151432, -6700686, 2850248, -907312, -6507949, 12374338, 1276142, 10048613, --4862440, 8199630, -4057670, 324270, -6455873, 5379984, -3030100, 12214350, -3688303, 11527155, --11939472, 2389613, 1024350, -2865280, 655519, 1165547, 9647033, -744103, -10801306, 6971806, --5965710, 829466, 6982543, -7211250, 12010339, -24503862, 51458540, 9631464, 12569759, -6653441, -4619238, -1599339, 9671729, 2981244, 21876952, 1411434, -12016245, 7136088, -7873749, 3288334, -4405563, -10183367, 440234, 2335925, -10994043, 9841381, 2456721, -4570382, 13271986, -4873714, -5188321, -4183298, 2395518, 2455111, 1127429, -1773285, -4046933, -1916629, 1776506, 239981, --2322504, -6591164, 4758287, -4454955, 2326799, 4181151, -4542465, 857920, -4249334, 1105954, --6685117, -10768557, 10937671, -6009733, -2954401, 4598836, 2057826, -1966021, 1158567, 9403831, --10553272, 4445828, -4038343, 8137890, -8886287, 4923643, 2364916, -1625645, 1823751, 133144, -18790, 3947612, -5658620, 3058554, 2653216, -1577864, -646929, 7110319, -1208496, 2377265, --8436926, 11171210, -8820252, -200253, 5516886, -5138392, 3731790, 1190780, 1248762, -5368172, -4174171, 4391067, -2906619, 1700807, 2103460, -3841312, 1219234, 1797981, -930397, 3850975, -60666, -147103, -534723, 3452080, 2591476, -2285460, 2935073, -1626719, 1249836, 1489280, --501974, 4311074, -2088428, -21475, 2664490, -3503620, 153008, -402116, -2565706, 294742, -2368138, -788127, -2179159, 4298726, -2907693, 607738, 9752260, -45808512, -113716240, 24562918, -94565520, 63920388, 133380744, -43626668, -37286220, -76741400, -122638496, -12127914, 38233260, 50383188, -65773128, 33148020, 3645890, -10761041, -28424630, -40565968, -6133214, -10844792, 4006131, 9296994, --468688, 2325725, 4918812, 2160906, 16077136, 19055696, 11869679, -2203318, 2222109, -14130442, --29593398, -31575526, -15454366, -20717312, 17067664, 31399432, 33369212, 36590436, 20088098, -5943161, --14434311, -26931592, -28403156, -19776714, -11089606, -1302449, 7204271, 13779866, 14846628, 12440910, -10768557, -1869921, 2915209, -3203509, 1453310, -2414845, -1439351, -882079, -10048613, -10591926, --7620346, -15950972, 54224, -3027415, 2040110, 27055610, 35716412, 12016782, 12128451, -9816148, --19572702, -13584982, -23575076, -18994492, 6724845, -1657857, -11406359, 8770860, 9468792, 11212012, -26750666, 11085311, 11760694, 2887292, -14333916, -14200772, -11553999, -12688407, -15981573, -13714904, --8104604, 2495913, 17887466, 26856430, 25225416, 10181220, 5139465, -6580964, -12132746, -10984916, --12022687, -13974213, -6322729, -5831492, -418222, 4684736, 3676492, 10821707, 14454176, 10388989, -7161321, 2479270, -843961, -6837051, -6983617, -11012833, -12304544, -9743133, -8606578, -2209761, -9312026, 13800804, 14954539, 13212930, 5462662, 2441152, -6564858, -10540923, -5542119, -7788923, --10510859, -8010114, 1541893, 7206419, 6845641, 3811247, 4391604, 3900904, 3070902, 907849, --648003, -1088237, -2707440, -3576097, -3234110, -3854733, -4467840, -2411624, 2134062, 3740917, -4836133, 4030827, 2955474, 1007707, 134755, -1179505, -1682017, -2179696, -2368138, -2689723, --1528472, -598611, 963146, 1566053, 1571958, 1340567, 1220845, 251792, 40265, -292058, -193810, 183610, 629213, -887448, -1576253, -1376537, -751619, -707059, 336081, 965294, -1271847, 751082, -404264, -536871, 740882, 1180042, 1013612, -317291, -1243930, -1464584, --526670, -38118, 273804, -170188, -271657, -355409, 91805, 351650, 860067, 669478, -655519, 456340, 129386, -431107, -631897, -853625, -719407, -745177, -435402, 155156, -786516, 755377, 723702, 434329, 302795, 181999, -110059, -589484, -540629, -440771, --238371, -86973, 122943, 4295, 20401, 77309, 208843, 239444, 201863, 39728, --55835, -110059, -84826, -52613, -22549, -25770, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-75162, 1282048, 973347, 4169340, 551366, -506806, -2681670, 6125160, 3785477, 202937, +-750546, 6084358, 2068564, -1939178, -5328981, 3406983, -1532230, 2646237, -5071820, 330712, +-1210107, -3767760, -1018981, -1894618, -699006, 292058, 27917, -2746632, -1685238, -434329, +-526670, -1707250, 1833951, -173409, -1826972, 3263638, -5421860, -2570538, 2592550, -3255048, +451508, -2019708, -2975339, 2027225, 1840930, -1596117, 2039036, 3926674, 2211908, -2034204, +-2379949, 430034, 773631, -2398739, 2602213, 4329864, -3689914, -1178969, 2132451, 1595044, +-877784, -1129040, -1801202, 2386391, 727997, -2858301, 3253438, 1583769, -2668785, -2002529, +3420942, -2579665, -3294777, -6212134, -5399311, 2939905, 3402688, 272194, 1494649, -590558, +1224066, -2301566, 3490198, -291521, 1615982, -1600949, 901943, -1458678, -1136556, 52613, +2236604, -496069, -568546, -1003949, 333934, -759136, 155156, 258772, -461172, -547071, +71941, -33823, -180926, -600222, 302795, -224412, 7785165, -754841, -1580548, -3195993, +4980552, -2660732, -290984, -4058207, -4331475, -5443871, -2566243, 4258997, -4421669, -1655710, +-1561221, 1473174, -1107565, -6063420, 3148748, 1512902, 11769284, -1207423, 5501316, -1103807, +-300648, -537945, 599148, -2487860, 4551592, -1202054, -929324, -2756832, -514859, -988379, +7057705, 1308891, -726386, -6628209, -688805, -1277753, 1987496, -4213363, -1177358, 1136556, +937914, -1167694, -723165, -2618856, -997506, -3147137, -1428614, 6101001, -1809792, 1930051, +3393561, -826781, -3331284, -4355097, 1116155, 1020055, 1300301, 2704219, 3192235, 2639794, +1511829, -1210644, -1188632, -1400696, -6144488, -1466731, -639413, 2967823, 2514703, -1515050, +-165356, 3259880, -3417183, 1340030, 79994, -849330, -1984812, -2996814, -54761, 1784022, +1785096, 1900523, -812823, 781684, -729071, 159988, 2652679, 1084479, 187368, 24696, +-427886, -62277, 150324, 533650, -360240, -371515, 1138166, 595927, 1159104, 1212791, +226560, 675384, -195958, 197569, 64961, -539018, -1395328, -246424, -10292889, -2487323, +-173946, -2175401, -1500017, 3646427, -7222525, -6047851, -3530463, -2342905, 1060320, 8180839, +-1742683, 11274, 1007170, -5815386, -1503239, -4852240, -730144, 8662412, -642098, -4172561, +-2707440, 136365, 1785633, 1757715, -2398739, -10909217, -5211943, -1436130, -4198868, 416075, +221191, 4456566, -2836289, 3961571, 983011, -1997697, -5835787, -4879083, 6804839, -5578626, +3748433, 1117228, -3572339, -1320166, -3187940, -2276870, 3215857, -5994164, 3135863, 1085553, +-74088, 1036698, 444529, -572841, 156766, -3023657, -4162360, 328028, -1253057, -3062312, +-1226750, -4750234, 5577015, 3831648, 982474, 4575751, 561567, -1905892, 5666136, -2951180, +-1846836, -1889786, 4317516, -4166655, 1887638, 3048353, 191126, 1899449, 4699768, 1743220, +-119722, 326418, 1018444, 807991, -900333, -530428, 80531, -210453, 1523640, 760209, +1609539, 1211181, 474594, -1402844, -1660005, 1045288, -38655, -66035, 1556926, -1041530, +-834297, 4832, 388695, 534723, -132607, -1697049, 1455994, 415538, -1267552, -7022809, +8428873, 9573482, 2566780, 2516851, -2840584, 4423280, 2180233, -5721434, 1691143, 3555696, +-6818261, -5965173, 5847598, -5236102, -821413, -3402151, 5895380, 1227287, -753767, -2271501, +-114354, -3943317, 3523484, -2006287, 2107218, -1006633, -98247, 3806952, 1460289, 470836, +-1568737, 3728032, 2352032, 1056562, -390305, 3858491, -369367, 642635, -2544231, 4719096, +1017370, 1835025, 3451006, -9713069, -3188476, -1978906, -3507378, -3433826, 921271, 5295158, +-2376191, -1515587, -2998424, -1399086, 1108102, 2282775, -6683506, -481573, 2265595, 186831, +-576063, 2798171, 1827509, -6300180, -1788317, -1437203, 3798899, -4174171, 5386963, 5793374, +3031173, 1126892, -2787971, -231928, 423591, 3842922, -1100585, 384400, 426812, 505732, +5763846, 544924, 6145562, 2194728, 44023, -3058017, -1741609, 2443837, -565862, -97711, +201327, 56908, 520228, 2486786, 692564, 911607, 54761, 875636, -2107755, -275415, +608275, 720481, -572841, -434865, -30602, 716186, -658204, -560493, 819265, 722628, +1519345, 615254, 1402844, -970126, 71404, 57982, -613643, 1253057, 1928440, 10733123, +-1941325, -107374, 3946001, 2573222, 1933809, 3651796, 9534291, -2601140, -830539, -9098888, +221191, -7810935, -9931575, 405338, 4287451, -12827457, 4409858, 4264366, 2347200, -3858491, +-3054259, -4211753, -1581622, 301721, 307627, 4150012, 5445482, -685584, -5290326, -3175055, +4038880, -5665599, -2814277, -4778688, 1076963, -7758322, 3928285, 678605, -497142, 1318555, +-220654, -1726577, 37581, 5096516, -5779416, 7100655, -5313949, -557809, 1326071, -3478387, +-2868501, 2820720, 1383516, -1053878, -2690260, 5319854, 2216740, -3590593, -7307887, 921271, +1721745, 4363150, -154082, -1825361, 393526, 2346663, -1723893, 10273562, -3391951, -1582696, +-7254737, -4744865, 11527155, 4748623, -2537252, -580894, -3983045, -4400731, -340376, 1680406, +322659, -2093797, 2500208, 1449015, 3458523, -282394, -2477123, 1087701, 115427, -1053341, +1019518, 1056025, -250182, 534187, 1371705, 536334, -313533, -945967, 578747, 446140, +-955093, 1982127, 1602560, 609349, -934692, -2331094, 178778, -96100, -89657, 1167694, +-1195612, 878858, 1275068, 404264, -728534, 2997887, 6936372, -9137543, -5376762, 6484327, +-4763656, -5074504, -5579163, -6677064, 4891968, -1646046, -148176, -1493575, 304943, -7435126, +-1444183, 3483219, 3798362, 907312, -3905199, -5693516, -4721243, -6010807, 1279363, 7291781, +1023276, 2396592, 2528662, 2469069, -4205847, 4514548, 2821794, -3130494, -2516314, -9766756, +1557463, 2246805, -7668127, -558346, 2418067, -1394791, 998580, -643171, -8231842, 7091528, +-7665980, 6115497, 370441, 3107409, -8635032, -4803384, -7728257, -6075768, 1174137, -2134062, +-2719251, -3403225, 16643, 3917010, -7149510, -73551, 2127083, -2273112, -7977365, -4971425, +-1639604, 1559073, 3928285, 1738388, -6565395, 7094749, -2234994, -1491964, 7039989, -9141301, +-2989297, -1785096, -1609002, 11045045, -3978750, -141197, -4130685, -3403762, 2028298, 1560684, +-223338, 1223529, -852014, -1505386, 2079838, 74088, 863825, 925029, 2681133, -995896, +796716, 636192, 205085, 742493, -3003793, 3985193, 3597035, -1175210, -598074, 606127, +-499827, 721018, 132070, -231391, -1437203, 937377, -735513, 390842, 3497177, 2267206, +1884954, -1389422, 2497524, 1035087, -992137, 1174137, 390305, 879931, 295279, 14107357, +-12709882, -6732898, -8490077, 6011344, 2221035, -4371203, 2786897, -139050, 8365523, 458488, +15032, -8210904, 5675800, 9242233, 9700721, 8051990, -4600984, -767725, 1184337, -5268851, +-3624953, 1290638, 519691, -7559680, -3738769, -3228742, 3588445, -639950, -5725192, -2675228, +1789928, 4424890, 486942, -1641214, 3221, -4048007, -179852, -319975, 544924, -8635032, +4933307, 5821828, 1149978, 2966749, 3446175, -7004018, 9858024, 8865349, 1593433, -6242735, +3489124, -2253784, -9220758, -2399813, -2943126, -206695, 515933, -238371, -5586679, -5011690, +-11438035, -9561134, 92879, 5696201, -5258651, 2365453, 707596, -3585224, -9321690, -980326, +5395553, -3660923, 4839892, 9527848, 2882997, -4015258, 5501316, -75699, -607738, 2566780, +4278325, -428960, -772557, 1140851, 2755222, -1586454, -6265821, 310311, -196495, 612570, +755377, 2042794, 4551592, -1687385, -822486, 3404835, 3118146, 625992, 437013, -2269890, +4387846, 449361, -314606, 2594160, 809064, 916439, 429497, 2335389, 2101850, 2323041, +3875134, 264141, 2305324, 284542, 2568927, 1186485, 1449552, 963146, 2430952, 2117956, +1740536, -13553843, 1387274, -5086852, -18141404, -13965086, 3439732, 88047, -3163244, 3185255, +8663486, -1424319, 5174362, 4583267, 2644089, -1426466, -4754529, 3809636, -4056060, 448287, +-3489661, 5405753, 9911711, -8989903, -2623688, 521302, 3573950, 933082, -2834142, -1660542, +-3381750, -290447, -4175245, 5231807, 1111323, -6327024, 6959458, -7053410, -2294586, 8571144, +7531225, 6365142, -7352447, -4822175, -6593312, 7556458, 10228465, -180389, -2184528, 8129300, +-12068858, 1451699, 3162707, -1185948, -10152766, 9057549, 3122978, 4591857, 8464307, 430034, +-12241731, 3175055, 4936528, -3140158, -972273, 8374113, -8769249, -8188892, -7117298, 832687, +10751377, 5830955, -1633698, 12370580, -16557099, -6099928, 120259, 7912404, 3617436, -2400887, +-13178570, -2062658, -5334887, 1442035, 4902169, 12749610, 2094333, -3621194, 1588601, -2189360, +-934692, -4237522, -67109, -3493956, 1104880, 3468186, 1885491, 3191698, 3529926, 1136556, +685047, 15569, 549756, -1762547, -1925219, 153008, 3722663, 1432372, -565325, 667867, +1437740, 3059627, 308701, -1034013, 420907, -1009317, 2361695, -4571456, -2873870, -2024540, +2752537, 2468533, -4107063, 887985, -14602889, 14660334, 5929203, -408559, -1544578, 1187559, +2477659, 7919920, -1561221, 831076, -2598455, -1889249, 4446902, 2268817, 5171141, 2248952, +2965675, -9989557, -4168803, 16632261, 1641214, 4909685, 6960532, 2583423, -5701569, -10535018, +3217468, -4423280, 346282, 3641059, -5268315, -6186901, 7431367, 8731132, -4621922, -3297461, +6751689, -8403640, 3610994, -6478958, 2846490, -6271726, 8985608, 1211181, -1246077, 3131031, +15473157, 4234301, 5963562, -1800665, 739271, 2597918, 11412802, -1042066, 16378858, 440234, +7754564, -332323, 14779519, 5201743, 11016054, 8351564, -1920387, -5011690, -1393180, -5718212, +-6311455, 8646843, -1813013, -3447248, 1291711, 77846, -4505958, -2215666, 1295470, 3843459, +1017370, -7488813, -7432978, -3878892, -7588134, -245887, -221191, -2260227, 2022393, -196495, +2996814, -496069, -3132642, 587337, -1359894, -5716602, -3640522, 766115, 7521562, -3241627, +2744484, -900333, -146566, 3474629, -2703145, 1153736, 1657857, -1967632, -1380295, -987306, +-2237141, 1030792, -2780991, -3578782, -1416802, -3873524, 4743792, -1386738, 226023, -447750, +-353798, 476205, -1661616, 679142, 1148904, 595390, 1891933, 2574833, 391379, 1913408, +-1520418, -4176319, 756988, -1173063, 1668058, -1719598, 17145510, -4397510, -66035, -20947092, +-664109, 11317239, -5799817, 9842991, -13291313, 2018635, 1428077, -312459, -17652316, -726386, +-29469382, 1466195, -3174518, -12307766, -2073932, 1727651, -6400575, 1192390, 7556458, 1214939, +-6680285, 1321776, -2009508, 6617471, -7188702, 485331, 9563282, 2196339, 871342, -1354525, +7349763, -4617627, 848793, 27917, 5661841, 1134408, -9887015, -5257577, -6947647, 8301098, +-18594524, 9096204, 7524783, 6439767, 3656628, 1444183, -8088497, 5878200, -12021077, -2818572, +-2455111, -2463164, -444529, 815507, 3981435, -9267466, -3566434, 15760919, 6678138, -5683316, +-6567542, 1755568, -2673080, 4835597, -3099893, -924492, -4990215, 14292577, 7354595, -4846871, +989453, -7213935, 1781338, -5436355, -1794760, 5698885, 5378373, -1606318, 10499048, -4045859, +5260261, -6774774, 7362648, 1097901, -4121558, -5701032, -8435316, 2200097, -835371, 3925063, +-989453, -2491618, 1671816, 1626719, 2689187, 2113661, 4872641, -153545, 1639604, -3653944, +3081639, -2616709, -1221918, -1957968, -284005, -4662724, -697932, 1853815, 4342212, -4006668, +-1836099, -2891050, 3014530, 2255395, -1751273, -348966, -3020436, 2425046, 399969, 10776073, +10889890, 6299644, 5622112, -5371394, 6260452, 10463614, -7860327, -333397, -20323248, 11562589, +7881265, -2944200, 4651450, -1360968, 1576253, 7176354, -4584341, 11257109, -10245644, 926639, +12698608, 5521718, 743029, 9774809, -3518652, 4458176, 2553358, 5209259, 8667244, -5203890, +-1079647, 15995532, 7991324, -412317, 2181307, -10939819, 14741938, -12502650, -817118, 12876312, +3984119, 13867376, -8774081, 2170569, -595927, -3473018, 1839320, -13521094, -9468255, 12618614, +-6345278, -2782602, -4316442, -14376329, 10137197, -3440269, -2394981, -6407555, 6228240, 14472966, +-11486353, -2401961, 9782862, -10837276, -4718559, 8690866, 12202539, -20272782, -5407364, -1803349, +8603893, -376347, 10051834, -2516851, -7392176, 418759, 5345087, 12974022, 6566468, -8840653, +-468688, 6346351, -13016435, -8035347, -2500208, -6733972, -6781217, -869731, 6164352, -5910412, +1438277, 6359236, 1782411, 1080184, 4494147, -1185411, 2893197, 2723546, 2739652, 1503775, +-513785, -3988951, -1334661, -1161789, -3568044, -1684701, 556198, 389231, -532039, 488553, +3941169, -3316252, -1046898, -2480344, 1893007, 1780801, -766652, -2757369, -5944235, 2934000, +2274722, 3803194, 1066226, 879931, -412854, -3761318, 1500017, -1548873, -1683627, -1137630, +1032403, -727460, 10566156, 22397718, 4325569, -13252658, -4725001, 4389994, -29392072, 917512, +176631, -4612258, -1444183, 13564044, -22180822, 4865661, 10368588, -8170639, 9190156, 17127792, +4252018, -15855946, 4291209, -4005057, -284005, -15544560, -4685810, 14146012, -1585917, 12968117, +-3412352, -4571993, 2131915, -11011222, -6171868, -7933342, -5859409, -4346507, 10606959, -11732777, +1913408, 20431160, 13821205, 4587025, -20783884, 3429532, 13656385, 5681705, 824634, -7446400, +-9016210, -22231288, -15322833, 3139621, -7574712, -7622493, -421444, 9451076, 6734509, -6710350, +308701, 13459354, -5178120, -2321967, 631897, 17703856, 694174, -932545, 9043591, 2784750, +-20172388, 5621576, 5870147, -142271, -16700980, 7013145, 9817758, -7396471, -5220533, -13760001, +3674345, -5082020, 5215164, 2559801, -3206193, -5862094, 3809636, 1686848, 5870147, -2958696, +9141838, 3173444, -6230387, 701153, -299037, -8642011, 186831, 643708, -3758, -228707, +-4502200, -3972308, -1797981, -163746, 5742372, 1840930, 3015067, 4571993, -2088428, -2804077, +2223183, -4531728, -3981972, -228170, -197032, 1333587, -1299765, 949725, 2838437, 2931315, +398358, -1840930, -402653, -301721, -479963, -35433, -719944, 286152, -77846, 3819837, +-2214593, -2872260, 7117298, 5000953, -663572, 1889786, -3189550, 1360968, 99858, -1345399, +-6765647, 22994182, 1116155, -4823785, -473520, 10078678, -5087389, 2668785, -2643016, 2266132, +8622147, -16147466, 16747688, 18991272, 5236639, 7953743, -6635188, 10708427, 25054692, 676457, +-3033858, -4782446, 10582799, -3939559, -6243272, -2262374, 3660923, -12685723, 5442798, -11188390, +12506408, 2746095, 12595528, -8120173, 11468636, 3331821, 15055471, 2393908, 3060701, -5560909, +9324911, 2250563, -3138547, 13531294, -5455146, -9844065, 19174882, 15285252, 5557151, 14442364, +20994874, 25490630, -8096014, -8141648, -9167608, 3089692, -11891154, 13763223, -1846299, -1377611, +-19817516, 4465156, 22213570, 22645752, -1006633, -3088082, -15741592, 140123, 14705968, -7677254, +-9375377, 8286603, 1195612, -8190503, 2750390, -1414655, -5058935, -1215476, -4355097, -269509, +8486855, 6302328, -1868311, 1443109, -2195802, -8690329, -11317239, -2181844, 5469104, 2168422, +7788387, -1682554, -7556995, -2126546, 8082055, -3938485, 4552666, 7458211, -7699803, -2106145, +-846645, 1845762, -517007, 4954782, 3585224, 1739999, -7670812, 1837172, 4038880, 1179505, +1599875, 2657511, -6815576, -3212636, -96100, -419833, -3662533, -8790187, -2925410, 696322, +4418985, 924492, -3670050, -4232154, 1566589, -30114164, -20984674, 11334419, 4515085, -15690052, +1830193, 7226283, -14301167, -8913131, -6063957, 17476758, 7923678, 5727876, -5313412, -4012036, +-4188667, -10550050, -14178761, -25070260, 13344463, 11494406, -5190468, 28767154, 13889924, 27632746, +18985902, 1978906, -8606578, 7493108, 3540127, 12699145, 14494978, 16063178, -2105071, -2545842, +6915971, -6914898, -1488743, -6063957, -11669426, -19209242, -5505611, 20059644, -4744328, -7660074, +-11051488, 8135205, 12157442, 8239895, 948651, 11933567, 22917946, -13314935, -6036040, -10186589, +-7425999, -21663816, -5209796, 5813775, -9826885, -7536594, -25104620, -35691180, 4092030, -23420456, +-37141804, -26702886, -11205033, 24420110, 8489003, 15015206, 11187853, -24571508, -10355703, 2437394, +12600897, -12059194, -14512694, -13864691, -4275640, 7692824, -8291971, -30681636, -19374598, -4158065, +-6155225, -1927904, -4476430, 17799418, 16085726, 16856672, 16994112, 5926518, -28991, 6658273, +1882269, -213138, 5098126, -13638132, -5287642, 6386617, 8278550, -47782, -4445291, -4714801, +2151779, -7264937, -10953240, 10495289, -8139500, -3828963, 1005559, -9263708, -8978629, -16045461, +-6315750, -3497714, 1248762, 14055280, -3442953, -1667521, -4267050, 7352984, -3614215, 750009, +6740415, 917512, -4648229, 3449396, 6715718, -3698504, -943282, 181462, -2265059, 4105989, +-57084948, -8475581, 19116362, -19057844, 8643085, -7079180, -30697206, -9179956, 34087544, 42752640, +-21809844, 1343788, -7125351, -33865816, -26820460, -25352118, -27051852, -14232448, -17458506, -945967, +6504191, -4272419, 7647190, 7035157, -10719165, -2567854, -14931454, 7046968, -23851564, -21507586, +5883569, 4314295, -6063957, -7566659, 19779398, -5145908, 27235462, 6386617, 25290914, -16222628, +11353746, 7464117, 30509838, 16462073, 11089069, 3331821, 5130876, -3077881, 9392557, 12780749, +-9067750, -13042742, 21539798, -2448131, -25663504, -49961208, -60017336, -43275016, 7850664, 352724, +-55848532, 18759344, 10203769, 14545980, -18657338, 2850248, 7231115, 2915209, 29549374, 29908004, +59574956, 19983946, -30867394, -40006008, -24235964, -21937082, -25232932, -22607098, -217970, 12943958, +17514876, -10550050, 22873922, -18774376, -26103200, -20423644, -13211856, -10049150, -20272246, 13389024, +-870268, 12815109, 10172093, 1751273, 22475564, -11192148, -4444218, -21511344, 7907572, 11892228, +-1256815, -1701344, 7155953, -20665236, 1330366, -7206955, 4558034, -9849434, -13806709, 8926016, +140123, -5762236, -1724429, 10443750, -7501698, 5493263, -6945499, 6222871, 5790153, -2772938, +-6892349, 4870493, 5682242, -15242839, 6964290, -3766150, -4002373, -4584878, 3849365, -10273025, +-4702453, 32338956, -8652212, -61108796, -17459042, 50303192, -6958384, 11214696, 7183870, 9385577, +17638894, 14417131, 5058398, -9982578, -3674882, 2483028, -10845866, -2550674, 18516678, -16564615, +-9809705, -16608639, -3927748, 2826625, 2177549, 4363150, 8698383, -12646531, 11304891, 27509266, +-427886, -16115791, 1544578, -10561325, -3543885, 16292958, -17146584, 1901060, 5544803, 19927038, +29042568, -18459770, -10390063, 11149198, 1664300, 3098819, 3485366, -12276627, -31047782, -5647345, +-14372571, 28292024, -53727892, -35509180, -14426795, -5964099, 15729781, 3162707, -18849538, -3310346, +-21736292, -23780698, -8290361, -17233020, 3311957, 13921063, 64969432, 11870216, -9425306, -41816340, +-34053720, 10013716, -836982, -39276404, 21336324, 20838108, -39567388, -919123, 10581726, 11310260, +43146704, 18659486, 9205726, -42606612, -21622476, -29468308, 26886496, -2895882, -8473434, -4959077, +8572218, 27867358, 24114630, -12797392, -24894168, -37015100, 9196599, 21503290, -7395397, -4026532, +19443316, 10687489, 16987670, 3954591, 6242735, -14445049, -3936338, -6985228, 7521025, 7239168, +-1685775, -3588982, -1810329, 9846749, 11713986, -17002164, 9977746, 6998113, 14101988, -9178345, +-5820755, 8303246, 3382287, -12410845, -932008, 13791677, 3015604, -10851235, -3557844, 1433982, +-20789252, -71877888, 10918344, 11826729, -1828582, -586263, -5012764, -20276004, 8753680, -4013647, +37523520, -37562712, -7225209, 39516920, -1240172, -25755308, -2685428, 23547158, 28492276, 17730162, +-4474819, 20562156, -14578730, 14071387, -5602248, -4620311, -12545599, 22469122, 15446850, -13757317, +-6054830, -1544578, 22757958, -1557463, 2885144, -13740137, 15502148, 10264435, -15950435, 30406220, +1849520, -26334592, 24240258, -28656022, -14889578, 27108222, -56219512, -35625144, 31346818, -19063212, +23368380, -35435628, 8522289, 13721884, -19272056, 1285269, -1058173, -36588828, -8114804, 38863548, +40960568, -45502496, -14783277, 14583025, -36410584, 48192216, 48227652, 7372312, -67815920, -35321276, +73147048, -37837588, -7154879, 59464360, -34069292, -69990248, -15323370, 64256468, -13205951, -45951856, +-10916733, -84339736, -3360812, 69333656, -24545202, -68061272, -6453189, -18706194, -8722005, 21000242, +-1914482, -230318, -24476482, -15781857, -7435126, 28083180, -34372088, 2304787, 6149320, -10345502, +1780801, 33321966, -20389284, -25722560, -2926483, 9819906, 21096342, -7568269, 10901164, 16252156, +2367064, -23157926, -12101607, 1146219, -18358838, -8595303, 36826124, -13065291, -34768836, -8868034, +21218212, 9146133, -2075006, 5200132, -31369904, -17821966, 24967718, 36698348, 5000953, -26138098, +-12434467, 1769527, 10190347, 18702972, 2509335, -10253161, -39760660, -37519760, -836445, -47367584, +-13868986, -20135344, -18868328, -14310831, 30993020, -3370476, -9681930, -13002477, 6220724, -16640851, +-39335456, 30629022, 9853729, 26456998, 8511551, 27359478, -10654203, -16908212, 6304475, -28616294, +22472342, -25920128, -5234492, 17077326, -19412178, -4155918, -11683922, -31386010, 4993437, -23700704, +-16829830, -20682416, -15046344, -9459665, -20763482, 3704409, 23614804, -15791521, -5331665, 2873870, +21794274, -9804337, 7915625, -22055194, 36110476, 11192685, 15663209, 9800042, 34656092, -2027225, +-40044128, 8893804, 14980309, -11229729, 195958, 21235392, -27744952, -27858768, -32248226, 28123446, +8679592, -40097816, 15962246, -26473104, -4821101, -37424196, 16904454, 26547192, 5856725, -41459320, +23625542, 19199578, -4928475, -36449240, 10193568, -22005802, -7159711, -1614908, -10755135, 18009334, +-15913391, -29578902, 15041512, -6635725, 12782360, -208843, -729608, -243203, -7644505, -9254044, +6623377, 26313654, -2830384, -37318432, -9923522, 15433965, -18025978, -7924215, 18274012, -6824703, +-2176475, -14987288, 29614874, 17067664, -8216273, 13037373, -1932198, 5796595, 24113020, -4412005, +-20348482, 8556649, 13950591, -10838350, 17506286, -2895345, 10969883, 1080184, -7289633, 14118094, +21196738, -12034498, -21407190, 8404177, 13895830, -10937134, -1717450, 12311524, 4791573, -8567386, +-8574902, 10903311, 35111356, 66104916, -16107738, 32705640, 6230387, -15805480, -29783450, -17409650, +38371776, -12775917, 6985228, 14817637, -4070555, 35391068, -5406290, 27748174, 28959354, -35898412, +18249316, -9492415, 681826, 12998182, 10697153, -1336809, 5619965, 10506564, 35481260, 36575404, +28105730, -20820928, -7264401, -48864916, -1670742, 11421392, 21807696, 4984847, -40550396, 17588428, +-24422794, 31221192, -28480466, -19854024, 1833951, -23736674, -4269198, -13732084, 47976932, -26403312, +-13107703, -50567336, -16645146, -26572962, 71096208, 43301324, -15247134, -48091824, -51731808, -30656402, +35254164, 46252504, 23248658, 6791417, -62035972, -28731720, 20091320, 17322676, 2462627, 22339736, +-13052942, -40708236, 19031536, -69045360, 74855912, -7029251, -48767208, 112939384, 15968688, 39305932, +67460512, -112114216, -81013824, 22391276, -6891812, 17160542, 24319716, -70070240, -5426155, 14178224, +1174137, 58756228, 3930969, -30707942, -3448322, 31609886, -18556406, 13842143, 15984258, 702227, +-13079786, 15501074, -41049688, 31221728, -8201777, -12924093, 17346300, 4763119, 1014686, 18540300, +-4597226, 11144903, -2497524, 7190849, -5564130, -21336324, 12776454, 9169755, 12071006, -12348, +134755, 8549132, 4462471, 3396246, 24730422, 27850716, 1370632, 18301392, -17300128, 2721399, +-11431592, 21155398, 18960134, 3118146, -5743445, -12458626, -29805462, -12890271, 2354716, -29436632, +19801410, -41559176, 25612500, -17151952, 42075112, -19087908, -2014340, 23916526, 4217121, 2017024, +-10909754, -9495636, 1052267, -16230145, 17738214, -2167885, 18842558, -14900852, -14627585, 4867272, +715649, -15111842, 9434433, -1997697, 8234526, -4715874, -4074313, 7778723, -7542500, -725850, +5873368, -3175055, -3598646, 29778082, -2055142, -10131828, -5351530, 14072997, -1289564, -16410533, +8656507, 17365626, 3551938, 287226, -10334228, 3542274, -8361765, 7882876, 21285322, -7686918, +9752797, -8157754, -2351495, -8925479, -4110284, 5456756, 6921340, -12575664, 7537131, 2065342, +-1524177, -12581033, 2190970, 4351339, -9141301, 13180718, 11267310, -22610856, 5805722, -20772072, +-23332410, 15919833, -8251706, 19261854, 10679973, 401043, 10056666, -3301219, -11978127, -3085397, +830539, 13348221, -5999533, 3943854, 5701032, -8001524, -1293322, 4487167, -2222109, -1728724, +7980049, -321049, 3151432, -6700686, 2850248, -907312, -6507949, 12374338, 1276142, 10048613, +-4862440, 8199630, -4057670, 324270, -6455873, 5379984, -3030100, 12214350, -3688303, 11527155, +-11939472, 2389613, 1024350, -2865280, 655519, 1165547, 9647033, -744103, -10801306, 6971806, +-5965710, 829466, 6982543, -7211250, 12010339, -24503862, 51458540, 9631464, 12569759, -6653441, +4619238, -1599339, 9671729, 2981244, 21876952, 1411434, -12016245, 7136088, -7873749, 3288334, +4405563, -10183367, 440234, 2335925, -10994043, 9841381, 2456721, -4570382, 13271986, -4873714, +5188321, -4183298, 2395518, 2455111, 1127429, -1773285, -4046933, -1916629, 1776506, 239981, +-2322504, -6591164, 4758287, -4454955, 2326799, 4181151, -4542465, 857920, -4249334, 1105954, +-6685117, -10768557, 10937671, -6009733, -2954401, 4598836, 2057826, -1966021, 1158567, 9403831, +-10553272, 4445828, -4038343, 8137890, -8886287, 4923643, 2364916, -1625645, 1823751, 133144, +18790, 3947612, -5658620, 3058554, 2653216, -1577864, -646929, 7110319, -1208496, 2377265, +-8436926, 11171210, -8820252, -200253, 5516886, -5138392, 3731790, 1190780, 1248762, -5368172, +4174171, 4391067, -2906619, 1700807, 2103460, -3841312, 1219234, 1797981, -930397, 3850975, +60666, -147103, -534723, 3452080, 2591476, -2285460, 2935073, -1626719, 1249836, 1489280, +-501974, 4311074, -2088428, -21475, 2664490, -3503620, 153008, -402116, -2565706, 294742, +2368138, -788127, -2179159, 4298726, -2907693, 607738, 9752260, -45808512, -113716240, 24562918, +94565520, 63920388, 133380744, -43626668, -37286220, -76741400, -122638496, -12127914, 38233260, 50383188, +65773128, 33148020, 3645890, -10761041, -28424630, -40565968, -6133214, -10844792, 4006131, 9296994, +-468688, 2325725, 4918812, 2160906, 16077136, 19055696, 11869679, -2203318, 2222109, -14130442, +-29593398, -31575526, -15454366, -20717312, 17067664, 31399432, 33369212, 36590436, 20088098, -5943161, +-14434311, -26931592, -28403156, -19776714, -11089606, -1302449, 7204271, 13779866, 14846628, 12440910, +10768557, -1869921, 2915209, -3203509, 1453310, -2414845, -1439351, -882079, -10048613, -10591926, +-7620346, -15950972, 54224, -3027415, 2040110, 27055610, 35716412, 12016782, 12128451, -9816148, +-19572702, -13584982, -23575076, -18994492, 6724845, -1657857, -11406359, 8770860, 9468792, 11212012, +26750666, 11085311, 11760694, 2887292, -14333916, -14200772, -11553999, -12688407, -15981573, -13714904, +-8104604, 2495913, 17887466, 26856430, 25225416, 10181220, 5139465, -6580964, -12132746, -10984916, +-12022687, -13974213, -6322729, -5831492, -418222, 4684736, 3676492, 10821707, 14454176, 10388989, +7161321, 2479270, -843961, -6837051, -6983617, -11012833, -12304544, -9743133, -8606578, -2209761, +9312026, 13800804, 14954539, 13212930, 5462662, 2441152, -6564858, -10540923, -5542119, -7788923, +-10510859, -8010114, 1541893, 7206419, 6845641, 3811247, 4391604, 3900904, 3070902, 907849, +-648003, -1088237, -2707440, -3576097, -3234110, -3854733, -4467840, -2411624, 2134062, 3740917, +4836133, 4030827, 2955474, 1007707, 134755, -1179505, -1682017, -2179696, -2368138, -2689723, +-1528472, -598611, 963146, 1566053, 1571958, 1340567, 1220845, 251792, 40265, -292058, +193810, 183610, 629213, -887448, -1576253, -1376537, -751619, -707059, 336081, 965294, +1271847, 751082, -404264, -536871, 740882, 1180042, 1013612, -317291, -1243930, -1464584, +-526670, -38118, 273804, -170188, -271657, -355409, 91805, 351650, 860067, 669478, +655519, 456340, 129386, -431107, -631897, -853625, -719407, -745177, -435402, 155156, +786516, 755377, 723702, 434329, 302795, 181999, -110059, -589484, -540629, -440771, +-238371, -86973, 122943, 4295, 20401, 77309, 208843, 239444, 201863, 39728, +-55835, -110059, -84826, -52613, -22549, -25770, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -6444599, -798327, 2026688, 1962800, 10102837, 2733210, 2121714, -3013457, 372052, -5147519, 1188632, -4697084, -2405719, 208843, -1010391, -2541547, -4082367, 3124052, -6818261, -3449933, -3429532, -3672734, 4026532, 2113124, 951872, 2910377, 2401424, 4817880, -1694902, 1676111, 2991982, -621697, 975494, -3542274, -1534377, -1490891, -1342177, 3251827, -6272263, 1030255, -2182917, -6541235, 141734, -1197222, -1660005, -2719788, -915365, -2837900, -8267812, -2628520, -1631014, --1349694, -1866163, 836982, -1561758, -405338, -546535, 2873333, 1277753, -390305, 1831267, --1633698, 3528316, -2338610, -3856881, 3694746, 3876208, -1698660, -3704946, 337155, 2006287, -1508607, 1741609, -1764695, 6442, 1409286, 1909650, 823023, -544387, 217970, 2376728, -4591857, 2216740, -587874, -71404, -1111323, -1171452, 944356, -1537598, 916976, 1122060, --466004, -166430, 483721, 426276, -483721, 367757, 243203, -2133525, 315143, 148713, -636192, 360240, -831076, 748935, 583579, -71404, 9132174, -1735167, -898722, 960462, -2503966, -6768332, 4179003, -8029978, -383326, -3898757, -592169, -2584497, -626528, -646393, -4002373, -3415036, 4336843, -4567161, -4985920, 2081449, 6640557, -7876433, -2202781, -3821447, -33823, -1998770, 2101850, 2794413, 1403381, 2847027, -4584878, 143881, 6385006, 2493766, -795106, -4672925, -6663642, -4020626, 998580, -3421478, -1939178, 1275068, 4293894, -3911105, --3850438, 1529545, -2820720, 4931160, 1639604, -533113, 3473555, 3294240, -24159, 5544803, -2734821, 1720134, 1455457, 3626563, 5727876, -3809099, 1079111, 1555315, -4061429, 335007, -3263102, -1301912, 8281234, -2588255, -2222646, -1753420, 3040837, 4198868, -5403606, -2218351, -1445793, -1002875, 1301912, 494458, -2379412, 1026497, 483721, -1764695, -2873870, 1148904, -779537, 2590402, 199716, 780073, 1181116, -144955, -877247, 1890323, 93952, -36507, -1632625, -926102, 780073, 2175938, -206695, -506806, 396748, -359704, 660351, -1381906, --444529, -660351, 68183, -236760, 842350, 59593, -866510, 5369, -11746736, -1891396, --2608656, -2083059, -1039919, -1426466, 6268505, 7490960, -1695438, 6114423, 2340757, -3361349, -1603097, -5100274, 914291, 1093606, -6860137, -1005559, 1080184, 1212791, 4765803, -903554, -4141422, -2755759, -5259725, -5555004, -1580548, -2805151, -4210142, 4381404, -1701344, -834297, --753230, 923418, 2391223, -6732361, 38118, 951335, -3184182, 8046085, 641024, -1971927, --1729798, 8590471, -601295, 1100049, 5087389, 160524, 3114388, 1217623, 299574, 4744865, --14496, -3303367, 4263292, 2289755, 2743410, 3862249, 1286880, -3118683, 2240899, 3170760, -3083250, 4752382, 42413, -4383014, -3497714, 5571647, 7755101, -7056095, 1433445, -1860795, --1231045, 1631014, 2970507, 2846490, -2245194, -899796, -2168959, -3635153, -3171297, -1161252, --2010582, -3123515, 729071, -846109, 1204202, 1020055, -957778, 570694, 207232, -2536715, -874563, -1712618, -3075197, 214748, -896038, -1291711, -1372779, -387621, 574989, -463320, -906775, -587337, -1027571, -1427003, -1308354, -563178, 253403, 1028108, -1989644, -8659191, -9226127, 8546985, 6443525, -4497368, 5036923, 9095130, -2289218, 7107097, 2674691, 1066226, --1108102, 7836705, 3704409, -1836635, -5622112, 3258807, -2330020, -3007551, 3175055, 3748970, -1644973, -5582384, 905701, 5010080, -2444910, 1698123, -10977936, 1580548, -883153, 5288179, -1293859, -2278480, -3309809, 6768332, -5826660, 471373, -4705674, 549756, -1440962, 3780645, --787590, -1233193, -5765994, -1384053, -1016297, 7160784, 358093, -6550899, -241055, -361851, -2240899, 3424163, -2913062, 12885, -3717294, 3969624, -868657, 4798016, -2586644, 7143068, -3550327, -7883413, 8356396, -1204202, -5768678, 983011, 7636989, 1551020, 1178432, -6174016, --399432, -2391760, -3332895, -3234110, 297963, 2911451, 3763465, 2043331, 2059437, -2409477, -1818919, -2088428, -231928, -111669, -958315, -401043, 2179696, -3432216, 942745, -335007, -309775, 1153736, 947577, -92342, 1502702, 163746, -2249489, -2446521, 1449552, 662499, --85899, -1615445, -306553, 390305, -204548, -705985, -1560147, 993748, -11274, -981400, -1109175, -653372, -413927, -1257889, -754841, -474594, -1573032, 1119376, 912144, 10045392, --3352759, -7137162, -298500, -10743324, 64425, -9220221, -3156801, 6471979, -6557878, -7241315, -2268280, 687195, 731755, -1635846, -2323577, -5218922, 3661460, -10288594, -3114388, 1132261, -6503118, 459562, 6596533, 2400350, 14404247, 5571110, -75699, 712965, 6899865, -1547799, --1967632, -1199370, 1206886, -4433480, -2168422, -7531225, -456877, -3414499, -2021319, 9464497, -228707, 5953362, -2274722, 2478196, -515396, 3586835, -1094680, 3345243, -3145527, -3904662, --565325, 1214939, -3950833, -3941169, 433255, 2159832, 4437238, -540092, -1960116, -799401, -4214437, 7140383, 466541, -4713190, -6791954, 188979, 1965484, 810675, 9454834, -5785858, --240518, 4290136, -1473174, -4830765, 6687264, 3119757, 1252520, -3177739, -3450469, -5779416, --2222109, -534723, -2966749, -1430224, -2558727, 598611, 762894, 1566053, 268972, 533113, --3194919, -1597191, -3430605, -1121523, -932545, -2576444, -1618666, 1022202, -228707, -1029718, --220654, 973347, -2115272, 1205812, -1501628, -76773, -576063, -1096290, -336618, 77309, -1078037, -1443109, -2217814, 1949915, 1191317, 635118, 8924942, -6823630, -1378148, 584652, --518080, -236760, -5617817, -4317516, -595927, 3755412, 1370632, 1519345, 1584843, 3946538, --795643, 3611531, 2922188, -9246528, -3549791, -10854993, 2830920, -3810173, 5481989, -3503620, --4793721, -3500935, 2852395, -7226820, -6018860, 8443906, -4593468, 9153649, -2153926, 2769180, --3211562, -6128919, 6780680, -5194763, -5854578, -564788, -3183645, -6860137, -5298379, -8655970, -359704, 5601174, 3212099, -3350075, 9639517, 3557307, -3543885, -4456029, -6976638, 327491, --2616709, -4855998, -2464238, -2046015, -3441343, 1860258, 7706782, -442382, 499827, -5199595, -2446521, 2636573, -4553739, -3583077, 1834488, 9401683, 3725347, -2300492, -1254131, -1944010, --9668508, -7574175, -6424734, 6736120, 7114077, -1008780, -3350611, 3146601, -2146410, 2766496, --1442572, 1326071, 198642, 171262, -3155727, 2127620, -1858110, -1283658, -521302, 1908576, -1376537, -153008, -2646237, 1694902, -415001, 1254667, -921807, -545461, -2345589, -971200, --126165, -245350, 403727, 486405, -339839, 433792, -1961726, 902480, 139050, 320512, --744103, 2421288, 1458678, -56371, -995359, 279710, -1515587, 2735357, 558883, 12694850, --2521683, -124017, -2199023, 8227547, 7798050, 2625836, -13258564, -2289755, -16081431, 9363566, -3903052, 164819, 16414291, 7709467, -1542430, -7496329, 6714108, -3264175, 1599875, 2211908, -985695, 5310727, -4893579, 9149354, 3433826, 802085, -2884608, -4802847, 6189048, 5189394, --1100585, 3340411, -7953743, 1378685, -10592463, 4189204, 513785, 5265093, -8710731, 1693291, --2896419, 1809792, 9745818, 8223789, 317828, 2309082, -6178311, 7924215, 154619, 16975322, -17977122, -2495376, -4886062, -5017059, -3977677, -10565083, -2995740, -13766981, 759672, -1243393, --827318, -2887829, 4735202, 7978439, 12596065, 11666742, 9000104, -15005005, -10693395, -568009, -686658, 15532749, -11070278, 8298414, -646393, -3259880, -1671279, -485331, -3153580, -8762270, --5719823, -1734093, 2479270, 710280, -271120, -2464774, 1313723, -3172907, -348429, -1735167, -3267933, 3598109, -942745, -807991, 3404835, 2528125, 397821, -616865, 1221918, 116501, -476205, -781147, 1449552, -223338, -911070, -1500554, 397821, 1372779, 2173790, 4663261, -3678103, -1918240, 412854, -3502546, -674310, 1406065, -310311, -783832, 61203, 580357, -742493, -4709969, 9103720, 1893007, -6867653, -3828963, 17166448, 16886738, 18927384, -1942936, --886911, -3311420, 3113851, 9228274, 10616622, 3036005, -4682588, -9222369, -18701362, 5452461, --11099269, -2482491, -1209033, -2448668, 1171452, -619549, -3501472, -472983, -10876468, -4336843, -564251, -2056753, -12145094, -5145908, 949188, 8706972, -2560338, 197032, -9686225, -3294240, -33286, 6306086, -3979287, 3857418, -10816338, -3040300, 2414309, 4022237, -3024194, 14364518, --3045132, -1875827, -7589207, -2523293, 5720360, 1928977, -742493, 7473780, 10331007, 12104828, --2225867, -6126771, -6981470, 54224, 1353989, 2807298, -4980552, 3877282, 5086852, 4311611, -4159676, 12110197, 8111583, 5389110, -740345, 2694555, -12186433, -2305861, 1184874, 6156299, -9707163, -1894618, -5622649, 1690070, 3281355, -2865280, 4928475, 3995393, 5334887, 808528, -2279554, -292058, -526134, -3960497, 2976949, -1258962, 1921998, 1764695, 472446, 2849174, -155693, 4605279, 3173444, 2069101, 1207960, 1277753, -89657, -623844, 273804, -1958505, --240518, -2441689, -3995930, -1571958, 700617, 658741, 1585917, -818191, 1006096, -1621350, -622770, 2035815, -195958, 350577, -17642652, 21931714, -627065, 3214783, 11991012, 202400, --4217658, 619012, -21415244, -13037373, -6129992, 3410741, -4224637, 2435783, -10018011, 6920803, --3504157, -103079, 13202193, -12890271, -8575439, 12349105, -3880503, -18121540, 1278290, -11178189, -2302103, -940061, 6778532, 2908767, 3415036, 1366873, -2191507, 8036421, -901406, 10328859, -6318971, -3692598, -6208912, -5833640, 2813204, -2875481, 2831457, 1984812, 6087580, 1760400, --11431055, 657667, 3884261, -3969087, 486405, -7901666, -1749662, 676457, 517007, 18080202, --3158949, 12840878, 15394773, -4255239, 8243653, -2556043, -447750, -8585640, 5444408, 13067975, -9156870, 2009508, 3604015, 8089571, -521302, 6699612, -2727304, -3783866, -6521908, 3535832, -16738561, 3713536, -2150168, 1298691, -11747809, -4008278, 295816, 11041287, 8096014, 3459059, -7191923, -2091649, 7065758, -109522, 4453881, 522912, -319975, -885300, 4936528, -562104, --3069291, -1944010, -1203128, -791348, -1218697, -2513093, 3577171, -2338610, -3039226, -932008, --4000225, -2815351, -3408594, -2017561, -2368675, -3129421, 1083406, 679142, 1355599, 1057636, --1787780, -994822, -3135326, -4192425, -333934, -2352568, 1396938, -1150514, 398358, 1983738, -2172180, 1422708, 3699578, -1023813, -274878, 2734821, 21058224, 3080565, 5266167, -4956393, --2501282, 14307073, -9410273, -2160369, -18539226, 17405892, 9105868, 1270237, -6282464, -17502528, -1797444, -4644471, 2171643, -19628538, 7033546, 10393284, -11389180, -2714419, 1736241, 1225139, -3828427, 11278584, 13889387, 60666, 1611, 2613488, 561567, -8384850, -9575093, -6350109, --12628278, -6213744, 10825465, 5040144, -3998615, -5329518, -3499325, -22239340, 4874788, 5361730, --10378788, 17068736, 652835, 12735115, -4538707, 8266202, -2680060, -10991358, 1037772, 10147934, --5543192, 5578089, 6552510, 18127984, 5064840, 5706938, 17412334, 9925133, 6626061, -24006182, -5025112, 3692061, 4713190, 505196, -9747965, 17426830, -12878996, 9946607, 10464688, -15654619, --3367254, 21455510, -19040664, 3255048, -4416300, -2053531, -6819335, 8360691, -3515968, -7116761, --6024766, 3744675, 8179765, -7562901, 9490267, -7806103, -3350075, 10727755, 4020626, -876710, --4641786, -5010616, -59056, -1984812, -8076686, -932545, -1655173, -2280091, -657667, 6444599, --459562, -5936719, 641024, 2517388, 6240588, 3848828, 4981089, -1960116, 2678449, -3543885, -278099, -1204738, 2677912, 5116380, -3671123, 2353642, 2534031, -275415, -3156264, 1756105, -1498407, -10980084, -16589311, -7285875, -6890202, -22287660, 15271830, 2438468, 16299401, 984621, -2405719, -7675644, -3949223, 7968238, -518617, 8237748, -8036958, -2531346, 1548336, -3612068, --6560563, 9812927, -9846213, 11678553, -3970161, 3843996, -2410014, -7821136, -6988986, 3455838, --2467459, -21475, 6087043, 23314156, 1772211, -2907693, -7740068, 3410741, 18872624, -3381750, --2956548, -10852845, -3660923, 1644436, -10220412, -3700114, -14628659, 9567040, -17933100, -32564442, --3294777, 1132261, 15699179, -16028281, 15080704, 9829033, -7519951, -15124190, -2294586, 2598992, -4592394, 649614, 9595494, -6213744, -2216203, -32118840, -4158602, 33378876, 3406983, -5482526, --4265977, -17137994, 13131326, -5428302, -4744865, -4138738, -2324651, -7346542, -10945724, 3459059, -6573448, -198642, 5057324, -9241159, -16978542, -477815, -8858907, -2448131, 501974, -8798777, -2271501, -6372658, -11314018, -8359080, -3949223, 3874061, 5469104, -836982, -13414793, -3238405, -1066763, -6536404, -2780455, -396748, -6032819, -3486440, 1880122, -95026, -4695473, -1772748, -2464774, 1020055, -6307697, -2400887, 359704, 6206228, 6884833, 1989644, -1796907, -2228014, --566936, 4689568, -745714, -227633, 578747, 1908039, -5243082, 5314485, -890669, 3661460, -605054, -3637837, 15421617, 13775034, -4468377, -5697811, -1419487, -22228604, 14570677, -14069239, --11621108, -9009768, 5444408, 2199560, 13498545, 1612223, -7482370, -8728447, -9052180, 6944425, --3529390, -4863514, 12321187, 13800804, 4631049, -9360881, 11343009, 18377092, -7124277, -4070555, -15855409, 4063039, 3095598, -10431402, -118112, 15124190, -22466974, 15365246, -3457986, 2055679, -9121974, 11111080, -206695, 5537287, -10650982, -8629126, 5669894, 21160766, 5555540, 5143760, -7896834, -10714333, 2117419, 9383430, 5309117, -1782411, 7435126, 4687957, -12846784, 10306311, --12527883, 2769717, 8908836, -9856413, 7340636, -12023224, -4938139, 2186138, 278099, 7663833, --5083094, 6572911, -5197984, 916439, 2284386, -2248952, -5105106, -9719511, 25772488, 2763275, -7595113, -11322608, -26674432, 18679886, -18203146, -7818451, -314069, -4170413, -2920041, -1578937, --7665443, 4628364, 3510599, 1993402, -7111929, 8494908, 6293738, -2852395, -3170223, 2502355, --2656437, 2357400, -2683281, 9019431, 3041374, 843424, 6111739, 6752763, -4206921, 42950, -2933463, 4697621, 1612223, 2253247, -4560182, -5553930, 4162897, 5833103, 8093866, -1149441, --7992934, -1067836, 394063, 3805878, -12133819, 4472672, -4270271, -1705102, 2409477, 2791729, --3258807, 4126927, -5906, 3287261, -2243584, 7810935, 2325725, 3264175, -1458141, 4451197, --14687178, 15363635, -5776194, -15374909, -19902342, -5637145, -2099165, 11547556, -17526688, -2903935, --2130841, 9074192, 17250736, 14258755, 8857833, 1267552, -4519916, -2776160, -1858110, 12096239, -9943923, -2459943, 1511829, -2758980, 7776575, -19053548, 11235634, 6129992, 8780524, 2902861, -1970316, 16231218, -6507949, -14006962, 8053, -4680978, 884226, -19390166, -10741713, -1239635, -16054051, -10998874, -3507915, 2545305, -715649, 361314, 15779173, 6272263, -2521683, 1289564, -7688529, 5011153, 18395882, -5537824, 8369281, 9283035, 4959077, -3100430, 2959233, -20202990, -8528194, -3868155, 851477, -4722854, -11119670, -14977088, 2962454, -7203197, -20249160, 4732517, --17214228, -12738336, -3028489, -25982404, -15733002, 3752728, 10972031, -13038447, 2725694, 906775, -29651380, 28061706, 26535918, -933082, 1431298, -14121316, -8502962, 10969346, -6067178, -4073240, -1771137, -3697967, 6172942, -7793218, -3872450, -425739, 2303176, -4745402, 5654325, 5598490, -193274, -2610803, 1517197, 5462662, -4624606, -6176700, -1605244, 4893042, -6914898, 11421929, -6595996, -703301, 5190468, -2024540, -4874788, -7814693, -4212826, -6953552, -3737695, 3784403, -630286, 11510512, -2792266, -3925063, -1844689, -26360898, -29148870, 17122960, 15370614, 5066988, -16666084, 28007482, 7866770, -10867878, 8944806, -4410395, -8082055, 12734041, 787590, -11661373, -6935299, 9128416, 1999307, 3124052, 565862, 1294933, 25630218, -689879, 5376226, 2267743, -15850577, 808528, 25421912, -253940, -11394548, 20315732, 4037269, -9175124, -3338263, 10695542, --2388002, -321049, 8329552, -15676631, 15369004, -3407520, -22868016, -6492380, 2084133, -22843858, --2693481, -2499671, 9842454, 9529996, 16941498, -12109660, 2461553, 2595771, 3408594, 7181186, --11028939, -12386149, 6285148, -421981, 12916577, 10503879, 3136937, 27170500, -4695473, -4307852, --18797998, 27729382, 4776004, 19209242, 11684459, -31175556, 4311611, 2721936, 18901614, -10203769, -7975755, 75699, -8408472, -1124208, -6823093, 15250892, -29542396, -3665218, -2253247, 28454, -1186485, 4636954, 7051263, -188979, 13428752, -612570, -2087891, -4436165, -2965138, 802085, --4865661, 1526861, -1433982, 4028143, 2727841, -1465121, 988379, -1652489, -8346732, -503585, -263067, 2024003, -8522289, 4432406, -1870995, 4662187, 3572876, 6612102, -6932614, 7738458, --4373888, 2478733, 5464809, 5044439, -1888712, 158914, -3207804, 4377109, -409096, 2132988, --251256, -909459, 11171210, 6352794, 13422, 5264556, 1425392, 5478768, 1060857, 17191144, --36191540, 21551072, 21920440, -9299141, 5235029, 3085397, 5953362, 194884, 17453674, -12659953, --2716030, -13583371, -87510, -7656853, 1252520, 3708704, -19850266, 8987219, 21615496, -14811732, --14216342, -14489609, 28769838, -12513387, -7037841, 2723009, -9832254, -29743186, 5255430, 21678310, --29680372, -13404593, 10276246, 15985331, 4338454, -4463008, 6889128, -10482405, -4926865, -495532, -14715632, -20151450, -16061567, 11463805, 18477486, 7331509, -23073638, -7412040, 577673, -1010391, --4008278, 12111808, -3578245, 18252000, -14804215, -3165928, -25233, -16885664, 10744398, -19666118, --13571560, 6364605, -8826158, 19251654, 27738510, 16440061, -18353468, 9794136, -5401995, -5425081, --12958453, -3955665, -21116206, 16219407, 11873974, 5823439, 626528, -9903121, -5614059, 6609418, --22046604, 17871896, -4215511, -2942053, 9294846, 1749125, 8462696, -2308545, -1345935, -7430294, --2190433, 817118, 1487132, -5802501, -2092723, -2709588, -2144799, 10102837, 1040456, -50466, --4806069, 4176319, 3952444, -3430068, 2171643, 4699768, 994285, 7832410, -2791192, -5299453, -1079111, -8718247, 4533338, 3430068, 1100585, -140660, 3478387, -615254, 5707475, 1984812, -4047470, -6859063, -2166274, 6669548, 304943, 2803540, 3279208, -6380174, 885300, 6725919, -21095268, 35125316, -193810, -26490284, 5682779, -31620086, 5484673, 14443438, 6822019, 1966558, -19104552, 14139032, -791885, -2848100, -26127360, -14058502, 449361, -12202002, 35535484, -6416681, --7981123, -15261093, 1972464, 13397077, 9398999, -430570, 6922414, 10448582, -15670725, 5440650, -30502320, 10833518, -20823076, -14671071, 9950902, -10274099, -1343788, 7471096, -4561256, -17183628, --4048007, 2149631, 29072096, -6219650, 6514392, -7658464, -23361400, 4160213, 29495152, -7853348, --17563196, 5202279, -10725607, 7266011, -6095096, -7114614, 20298552, -5104569, -2226404, 9961103, --17343078, 6362457, 21481278, -8779450, 1925219, -12463995, 37711960, -6763500, 4574677, 12297028, --8650064, -2004676, -9955734, 5368709, -11260867, -9483825, -8862665, 14512158, -19466940, 2974802, --2800319, -5727876, 15303505, 453119, -5094905, -6342593, 894964, 5827734, 4540854, -8587250, --1482838, 519691, -2327336, -10648298, -6378027, -1825898, 2673617, 1007707, 976031, 1654099, -8888972, -8715026, 9341017, 1977296, 2777770, 779537, 7431904, -3985730, 12133283, -2473901, --71404, 9388262, 12192338, -6139119, 8012799, -3760781, 2766496, -6811818, 6226092, 5329518, --10295037, -313533, -4043712, -1212255, -5082557, 3992709, -6281927, 6004901, -1140851, -2063195, --10433549, -58262304, -20553030, -1269700, 18335216, -9952513, -29265370, -11164231, -4468377, 14010720, -3492882, -4100083, -14578193, 14952392, 26734024, -12454331, 20160040, 4886599, -38779796, 14165339, -17898740, -6578816, -15890305, -3164854, 23566486, 25143276, -2305324, -19463182, 1140851, -2423435, --2690260, -16259672, 3762391, 7086696, -25636122, 17329120, 14725295, -18168248, 3127810, -20355998, -6932614, 48959944, -44144212, 45248016, 20382304, 1825361, 27624156, 13595182, -28639916, 16874390, --21580600, -5027259, 23190140, 866510, 6514929, -12177306, -21016886, 63149440, -15070503, 688805, -24793772, -12290586, 4697621, 1680406, 15254113, 35474820, 33753076, 31883152, 1831267, -855772, --5333813, 1401770, -8843875, 2181307, 27081380, -7447474, -9616432, 2493229, 3607236, 15586973, -18266496, 5021891, 5008469, 12860206, 5405753, -10233296, 3107409, -5392869, -14957760, -6883222, -7628399, -11392401, -16221018, -12440373, -710280, 1234803, -9360344, 4490389, 10280004, 1382443, --3516505, -861678, -11884711, 13675713, -2185602, -3275450, 9499931, -8209293, 6417755, -6207302, --4904316, 16134582, -186831, -12404939, 15399605, -9780714, 9237401, 4137664, -6210523, 4427575, --2257005, 11057930, -5294621, 3695283, 448287, 692564, -1306744, 11781095, -6285148, -1668595, --970663, 1883343, -1844152, 4988068, 9135932, 14837501, -3950833, -42844448, 19428822, -31130460, -43725988, 5146982, -38075420, 8566312, 308164, 17850420, 8396124, -9223979, 32341104, 7890392, -1609002, 21607980, -17321604, -24044838, 745714, 12576738, 43589624, -6144488, 68719, -4574140, -31399432, 3422552, -25025164, -14763413, 4678293, -2763812, 13868986, -24268712, 11606075, 3965866, -7132330, -2163590, -9543954, 5531918, 9694815, 108448, 29151554, -47097000, 4052302, -16603807, --10394895, -6066105, -34515432, -50039592, -51883740, -37650756, 3921842, 205622, -30129732, -228170, --5556614, 3256659, -18731962, -48205640, 47435228, -833761, -7107097, 9700721, -47234976, -3219078, --11832635, 8869107, 13749264, 64755760, 48143900, -5387500, -698469, -1503775, 12606803, 19596862, -11764452, 8954470, -1928977, -7792682, -45984068, 8689256, -1069447, -17861158, -8148090, 29989072, --4343286, -5438503, 14166413, -1184337, 15549392, -6075231, 7736310, -848256, -3425237, 11110007, -13387413, -6149857, 1748052, 6028524, -2690797, 2857764, 537408, -137439, 9078487, -3895535, --4871567, 7681549, -9113384, 11874511, -242129, 6437619, 9687836, -4923643, 2263985, 8625905, --2250563, -5618354, -2279554, 998043, -1756105, 2384781, -11854647, -707596, -9434433, 9749576, -1241782, 6576132, 4428112, -1357210, 77309, -602906, 4219806, 6087043, 4743792, -729071, --5887327, -836982, -12341589, 58750856, -56296284, 9513889, -10931766, 2066416, 23664732, -17459042, -5834713, 789200, -60898880, 1392643, -6926709, 2836289, 6921877, -27276264, -10231686, -45079440, --11694122, -2314451, 2353642, -17140678, -12897787, -19708532, -8269960, 19305878, 4129611, 39119100, -9503689, -13402445, -14030584, 23984708, -26934276, 46032384, -36181880, 10370199, -29213294, 462246, -27661736, -50591492, 47418048, 8252780, 5380521, -34788700, -7041599, -6716792, -114354, 16479790, -16476568, 20779588, -40120364, -1160178, -15850577, -13780403, -15522549, -21718040, -15042049, 599148, -22783728, -24626806, 6459631, -45212048, -15207942, 11232413, 13281649, 2273112, -51394116, -27902256, --18405008, -26280904, -21770652, 1647120, -17185238, 27101780, 8038032, 13493177, -9611600, -14310831, -45556720, -15507516, 12130061, -9368397, 3398393, 34153044, 4435628, 6016713, -19394462, 19324668, -11164231, -8254927, 17947058, -13792751, 4822712, -5241471, 12088185, 2260764, -4276714, 6455336, -15436649, -5545877, 4810364, 5349919, 4483946, -2065342, 4009889, -2446521, 10517838, -3772592, -1576253, 9921374, -2319282, -4181151, 2907156, 4157528, -7212861, -1785096, -19638202, 11918534, -8057359, -177167, -11013907, -4661114, 703838, 3798362, 14533096, -2697776, -4327717, 4876399, -3514894, -2515777, 14671608, 2532420, -18569292, 4457639, 17725866, -2360085, 25269976, -47755740, -72659032, -54796268, -5830955, -33084134, 6443525, 656593, -20035486, -28305446, 32976758, 22152904, -10305774, -14474577, 14505715, 4473209, 31126702, -24748138, -16401943, 19342386, 32357210, -41443752, -16623671, -1540283, 19578072, -14981383, 5650567, -18406082, 3662533, -34430068, 11156714, 36796596, --1355062, -2893197, 45674292, 7917772, -21253108, -44801876, 38128572, -20284056, 17119202, -16482474, -45601280, 20124606, -5175973, 4645544, -26626112, 3480534, 11237245, -12845173, 12623983, -55409908, -21565030, 50153944, 39099236, -21780852, -22706956, -22711250, 25249038, 2006824, -8215736, 2010045, -64677912, -31680216, -14931454, 25066502, -21759914, -58583352, 24705188, 13053479, -42004780, 23443006, -40360344, 35721780, -11091216, -16018617, -28706488, 15274514, -17781164, -11308112, 25832618, 17674864, -7871602, 22789634, 12707198, -8858370, -8394514, -29473140, 6706055, -12397423, 10035728, -10939819, -20837034, 14480482, 3039226, -3970161, 19801410, -10946261, -1720134, 2552821, 7494718, 4603668, -9052180, 8441221, 514322, -4848481, -3045669, 7082938, 3571265, 2831994, 798864, 11165841, -35999344, -1119376, -3042448, 5381057, -12757663, 4430259, 12836584, -18676666, 8017094, 9616969, --7332583, -5258114, 8311299, 4756677, -10959683, -46898360, 25070798, -2731062, 6548752, -17177722, -15026480, 332860, 8246337, 2514167, 2739652, -9758166, 7482370, 25409026, -32405528, 27880244, --4751845, -17097192, 5735392, -11624866, 7548405, -11909944, -9797894, 8259222, -25849798, -2639258, -34438660, -49707268, 14027900, 2384244, -8318815, -15270219, -18077518, -11744588, 36133024, -29743722, --4262218, 11691975, -30232812, 7684770, 16594143, 11112154, 5682242, 5243082, -17055316, 13442174, --44475996, 637803, 38938712, -16267726, -4376035, -8722005, -10985453, -295279, -31481036, 16701517, -12650826, -26013006, 24422258, 6820408, -29673930, 12224551, -5762773, 21544092, 18762028, -27579058, -9638443, 30680562, -28879896, 16183437, -20565914, 16218870, 18753438, -29297582, 16513076, -2090039, --15543487, 22402550, 1174674, -35239132, 10836739, 15723338, 4732517, -9773198, 1705639, 26776974, --12370043, -24957518, 26601954, -1078037, 2010582, -1106491, -3363496, 16426102, -12227772, -5795522, -11569568, 4500589, -2866891, -11911555, 17648020, -6638946, -11600707, 1040993, 9272834, -5463199, --4316442, -2676302, 13774497, -10678362, -5604933, 1090922, 7461432, -6538551, 5339718, -154619, -13649406, -8552890, 2129230, 1264868, 1305133, 12124693, 22726282, -9742060, -107778984, -235927392, --93603440, -156848992, -213573696, 80554256, 28566902, 69540352, 317378208, 264364896, 174210848, 272515136, -185121680, 21909166, 45882060, 33170032, -145693888, -94066224, -64885144, -166638288, -170088224, -47278464, --47776144, -105819944, -31785980, -23027468, -127413424, -109594144, -35851704, -60446832, -120363776, -29632590, --20510080, -94363112, -11270531, 65066608, -28760712, -23274428, 96199216, 58896348, -39800388, 85205168, -140754672, 15393700, 79008608, 172852032, 84334904, 43409236, 186479424, 136257840, 101245264, 226518192, -306565632, 242429968, 281605440, 365037856, 238260624, 155841808, 204504336, 131644504, -37111200, -9382893, --91223496, -225601216, -318817024, -342947232, -458939264, -522025888, -554204864, -536141312, -515258112, -512292960, --427953760, -327641568, -307483680, -200805296, 15673946, 84666688, 109923784, 333779104, 327557280, 225815952, -332813248, 305007648, 165339056, 160667216, 212138640, 128190280, 60155312, 148279984, 151293984, 67783176, -122181616, 184613264, 122301880, 72661720, 157024544, 129997920, 25854092, 79507360, 115389664, 12598213, -21614422, 126342904, 77158016, 41384156, 133992776, 132815424, 48302276, 105766792, 91292216, -24161338, --66640176, -69076496, -158614752, -214687168, -211965232, -244640800, -269623008, -279608288, -273707520, -280787232, --312185600, -322973472, -308976192, -344664160, -295132448, -201167136, -153895664, -52661668, 88653496, 185942016, -272508160, 351890976, 357875456, 306459872, 278437888, 228783776, 173322864, 139827488, 117795920, 95318744, -74786656, 67928664, 63155884, 47057272, 40037684, 35871568, 19665582, 944356, -9678172, -26363046, --44558140, -56114284, -59055264, -64900712, -62697396, -51506320, -38879116, -28726352, -16068546, -8058970, --1786170, 5812165, 10996190, 10759430, 11323144, 7328825, 823560, -2627446, -5781026, -12096239, --14780593, -16276315, -20671140, -21386790, -18957448, -22625888, -25163140, -22430466, -24363738, -27937152, --26048976, -31117038, -37219648, -35335232, -35476968, -37627672, -32907502, -28376312, -25067040, -17754322, --8554501, -3359738, 2591476, 11011759, 18143016, 24471114, 31445604, 37023156, 39361228, 42083164, -45114872, 46407660, 47404092, 48569636, 46903728, 43354472, 38542500, 32251446, 24950002, 15705622, -6451578, -2192044, -11038066, -16878684, -19400368, -20314658, -19907710, -17541720, -15591805, -14633490, --13009993, -11562052, -10954314, -10108206, -8999567, -8184060, -7532299, -6605660, -5648419, -4878546, --4104378, -3309272, -2682744, -2281165, -1988570, -1767916, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +798327, 2026688, 1962800, 10102837, 2733210, 2121714, -3013457, 372052, -5147519, 1188632, +4697084, -2405719, 208843, -1010391, -2541547, -4082367, 3124052, -6818261, -3449933, -3429532, +3672734, 4026532, 2113124, 951872, 2910377, 2401424, 4817880, -1694902, 1676111, 2991982, +621697, 975494, -3542274, -1534377, -1490891, -1342177, 3251827, -6272263, 1030255, -2182917, +6541235, 141734, -1197222, -1660005, -2719788, -915365, -2837900, -8267812, -2628520, -1631014, +-1349694, -1866163, 836982, -1561758, -405338, -546535, 2873333, 1277753, -390305, 1831267, +-1633698, 3528316, -2338610, -3856881, 3694746, 3876208, -1698660, -3704946, 337155, 2006287, +1508607, 1741609, -1764695, 6442, 1409286, 1909650, 823023, -544387, 217970, 2376728, +4591857, 2216740, -587874, -71404, -1111323, -1171452, 944356, -1537598, 916976, 1122060, +-466004, -166430, 483721, 426276, -483721, 367757, 243203, -2133525, 315143, 148713, +636192, 360240, -831076, 748935, 583579, -71404, 9132174, -1735167, -898722, 960462, +2503966, -6768332, 4179003, -8029978, -383326, -3898757, -592169, -2584497, -626528, -646393, +4002373, -3415036, 4336843, -4567161, -4985920, 2081449, 6640557, -7876433, -2202781, -3821447, +33823, -1998770, 2101850, 2794413, 1403381, 2847027, -4584878, 143881, 6385006, 2493766, +795106, -4672925, -6663642, -4020626, 998580, -3421478, -1939178, 1275068, 4293894, -3911105, +-3850438, 1529545, -2820720, 4931160, 1639604, -533113, 3473555, 3294240, -24159, 5544803, +2734821, 1720134, 1455457, 3626563, 5727876, -3809099, 1079111, 1555315, -4061429, 335007, +3263102, -1301912, 8281234, -2588255, -2222646, -1753420, 3040837, 4198868, -5403606, -2218351, +1445793, -1002875, 1301912, 494458, -2379412, 1026497, 483721, -1764695, -2873870, 1148904, +779537, 2590402, 199716, 780073, 1181116, -144955, -877247, 1890323, 93952, -36507, +1632625, -926102, 780073, 2175938, -206695, -506806, 396748, -359704, 660351, -1381906, +-444529, -660351, 68183, -236760, 842350, 59593, -866510, 5369, -11746736, -1891396, +-2608656, -2083059, -1039919, -1426466, 6268505, 7490960, -1695438, 6114423, 2340757, -3361349, +1603097, -5100274, 914291, 1093606, -6860137, -1005559, 1080184, 1212791, 4765803, -903554, +4141422, -2755759, -5259725, -5555004, -1580548, -2805151, -4210142, 4381404, -1701344, -834297, +-753230, 923418, 2391223, -6732361, 38118, 951335, -3184182, 8046085, 641024, -1971927, +-1729798, 8590471, -601295, 1100049, 5087389, 160524, 3114388, 1217623, 299574, 4744865, +-14496, -3303367, 4263292, 2289755, 2743410, 3862249, 1286880, -3118683, 2240899, 3170760, +3083250, 4752382, 42413, -4383014, -3497714, 5571647, 7755101, -7056095, 1433445, -1860795, +-1231045, 1631014, 2970507, 2846490, -2245194, -899796, -2168959, -3635153, -3171297, -1161252, +-2010582, -3123515, 729071, -846109, 1204202, 1020055, -957778, 570694, 207232, -2536715, +874563, -1712618, -3075197, 214748, -896038, -1291711, -1372779, -387621, 574989, -463320, +906775, -587337, -1027571, -1427003, -1308354, -563178, 253403, 1028108, -1989644, -8659191, +9226127, 8546985, 6443525, -4497368, 5036923, 9095130, -2289218, 7107097, 2674691, 1066226, +-1108102, 7836705, 3704409, -1836635, -5622112, 3258807, -2330020, -3007551, 3175055, 3748970, +1644973, -5582384, 905701, 5010080, -2444910, 1698123, -10977936, 1580548, -883153, 5288179, +1293859, -2278480, -3309809, 6768332, -5826660, 471373, -4705674, 549756, -1440962, 3780645, +-787590, -1233193, -5765994, -1384053, -1016297, 7160784, 358093, -6550899, -241055, -361851, +2240899, 3424163, -2913062, 12885, -3717294, 3969624, -868657, 4798016, -2586644, 7143068, +3550327, -7883413, 8356396, -1204202, -5768678, 983011, 7636989, 1551020, 1178432, -6174016, +-399432, -2391760, -3332895, -3234110, 297963, 2911451, 3763465, 2043331, 2059437, -2409477, +1818919, -2088428, -231928, -111669, -958315, -401043, 2179696, -3432216, 942745, -335007, +309775, 1153736, 947577, -92342, 1502702, 163746, -2249489, -2446521, 1449552, 662499, +-85899, -1615445, -306553, 390305, -204548, -705985, -1560147, 993748, -11274, -981400, +1109175, -653372, -413927, -1257889, -754841, -474594, -1573032, 1119376, 912144, 10045392, +-3352759, -7137162, -298500, -10743324, 64425, -9220221, -3156801, 6471979, -6557878, -7241315, +2268280, 687195, 731755, -1635846, -2323577, -5218922, 3661460, -10288594, -3114388, 1132261, +6503118, 459562, 6596533, 2400350, 14404247, 5571110, -75699, 712965, 6899865, -1547799, +-1967632, -1199370, 1206886, -4433480, -2168422, -7531225, -456877, -3414499, -2021319, 9464497, +228707, 5953362, -2274722, 2478196, -515396, 3586835, -1094680, 3345243, -3145527, -3904662, +-565325, 1214939, -3950833, -3941169, 433255, 2159832, 4437238, -540092, -1960116, -799401, +4214437, 7140383, 466541, -4713190, -6791954, 188979, 1965484, 810675, 9454834, -5785858, +-240518, 4290136, -1473174, -4830765, 6687264, 3119757, 1252520, -3177739, -3450469, -5779416, +-2222109, -534723, -2966749, -1430224, -2558727, 598611, 762894, 1566053, 268972, 533113, +-3194919, -1597191, -3430605, -1121523, -932545, -2576444, -1618666, 1022202, -228707, -1029718, +-220654, 973347, -2115272, 1205812, -1501628, -76773, -576063, -1096290, -336618, 77309, +1078037, -1443109, -2217814, 1949915, 1191317, 635118, 8924942, -6823630, -1378148, 584652, +-518080, -236760, -5617817, -4317516, -595927, 3755412, 1370632, 1519345, 1584843, 3946538, +-795643, 3611531, 2922188, -9246528, -3549791, -10854993, 2830920, -3810173, 5481989, -3503620, +-4793721, -3500935, 2852395, -7226820, -6018860, 8443906, -4593468, 9153649, -2153926, 2769180, +-3211562, -6128919, 6780680, -5194763, -5854578, -564788, -3183645, -6860137, -5298379, -8655970, +359704, 5601174, 3212099, -3350075, 9639517, 3557307, -3543885, -4456029, -6976638, 327491, +-2616709, -4855998, -2464238, -2046015, -3441343, 1860258, 7706782, -442382, 499827, -5199595, +2446521, 2636573, -4553739, -3583077, 1834488, 9401683, 3725347, -2300492, -1254131, -1944010, +-9668508, -7574175, -6424734, 6736120, 7114077, -1008780, -3350611, 3146601, -2146410, 2766496, +-1442572, 1326071, 198642, 171262, -3155727, 2127620, -1858110, -1283658, -521302, 1908576, +1376537, -153008, -2646237, 1694902, -415001, 1254667, -921807, -545461, -2345589, -971200, +-126165, -245350, 403727, 486405, -339839, 433792, -1961726, 902480, 139050, 320512, +-744103, 2421288, 1458678, -56371, -995359, 279710, -1515587, 2735357, 558883, 12694850, +-2521683, -124017, -2199023, 8227547, 7798050, 2625836, -13258564, -2289755, -16081431, 9363566, +3903052, 164819, 16414291, 7709467, -1542430, -7496329, 6714108, -3264175, 1599875, 2211908, +985695, 5310727, -4893579, 9149354, 3433826, 802085, -2884608, -4802847, 6189048, 5189394, +-1100585, 3340411, -7953743, 1378685, -10592463, 4189204, 513785, 5265093, -8710731, 1693291, +-2896419, 1809792, 9745818, 8223789, 317828, 2309082, -6178311, 7924215, 154619, 16975322, +17977122, -2495376, -4886062, -5017059, -3977677, -10565083, -2995740, -13766981, 759672, -1243393, +-827318, -2887829, 4735202, 7978439, 12596065, 11666742, 9000104, -15005005, -10693395, -568009, +686658, 15532749, -11070278, 8298414, -646393, -3259880, -1671279, -485331, -3153580, -8762270, +-5719823, -1734093, 2479270, 710280, -271120, -2464774, 1313723, -3172907, -348429, -1735167, +3267933, 3598109, -942745, -807991, 3404835, 2528125, 397821, -616865, 1221918, 116501, +476205, -781147, 1449552, -223338, -911070, -1500554, 397821, 1372779, 2173790, 4663261, +3678103, -1918240, 412854, -3502546, -674310, 1406065, -310311, -783832, 61203, 580357, +742493, -4709969, 9103720, 1893007, -6867653, -3828963, 17166448, 16886738, 18927384, -1942936, +-886911, -3311420, 3113851, 9228274, 10616622, 3036005, -4682588, -9222369, -18701362, 5452461, +-11099269, -2482491, -1209033, -2448668, 1171452, -619549, -3501472, -472983, -10876468, -4336843, +564251, -2056753, -12145094, -5145908, 949188, 8706972, -2560338, 197032, -9686225, -3294240, +33286, 6306086, -3979287, 3857418, -10816338, -3040300, 2414309, 4022237, -3024194, 14364518, +-3045132, -1875827, -7589207, -2523293, 5720360, 1928977, -742493, 7473780, 10331007, 12104828, +-2225867, -6126771, -6981470, 54224, 1353989, 2807298, -4980552, 3877282, 5086852, 4311611, +4159676, 12110197, 8111583, 5389110, -740345, 2694555, -12186433, -2305861, 1184874, 6156299, +9707163, -1894618, -5622649, 1690070, 3281355, -2865280, 4928475, 3995393, 5334887, 808528, +2279554, -292058, -526134, -3960497, 2976949, -1258962, 1921998, 1764695, 472446, 2849174, +155693, 4605279, 3173444, 2069101, 1207960, 1277753, -89657, -623844, 273804, -1958505, +-240518, -2441689, -3995930, -1571958, 700617, 658741, 1585917, -818191, 1006096, -1621350, +622770, 2035815, -195958, 350577, -17642652, 21931714, -627065, 3214783, 11991012, 202400, +-4217658, 619012, -21415244, -13037373, -6129992, 3410741, -4224637, 2435783, -10018011, 6920803, +-3504157, -103079, 13202193, -12890271, -8575439, 12349105, -3880503, -18121540, 1278290, -11178189, +2302103, -940061, 6778532, 2908767, 3415036, 1366873, -2191507, 8036421, -901406, 10328859, +6318971, -3692598, -6208912, -5833640, 2813204, -2875481, 2831457, 1984812, 6087580, 1760400, +-11431055, 657667, 3884261, -3969087, 486405, -7901666, -1749662, 676457, 517007, 18080202, +-3158949, 12840878, 15394773, -4255239, 8243653, -2556043, -447750, -8585640, 5444408, 13067975, +9156870, 2009508, 3604015, 8089571, -521302, 6699612, -2727304, -3783866, -6521908, 3535832, +16738561, 3713536, -2150168, 1298691, -11747809, -4008278, 295816, 11041287, 8096014, 3459059, +7191923, -2091649, 7065758, -109522, 4453881, 522912, -319975, -885300, 4936528, -562104, +-3069291, -1944010, -1203128, -791348, -1218697, -2513093, 3577171, -2338610, -3039226, -932008, +-4000225, -2815351, -3408594, -2017561, -2368675, -3129421, 1083406, 679142, 1355599, 1057636, +-1787780, -994822, -3135326, -4192425, -333934, -2352568, 1396938, -1150514, 398358, 1983738, +2172180, 1422708, 3699578, -1023813, -274878, 2734821, 21058224, 3080565, 5266167, -4956393, +-2501282, 14307073, -9410273, -2160369, -18539226, 17405892, 9105868, 1270237, -6282464, -17502528, +1797444, -4644471, 2171643, -19628538, 7033546, 10393284, -11389180, -2714419, 1736241, 1225139, +3828427, 11278584, 13889387, 60666, 1611, 2613488, 561567, -8384850, -9575093, -6350109, +-12628278, -6213744, 10825465, 5040144, -3998615, -5329518, -3499325, -22239340, 4874788, 5361730, +-10378788, 17068736, 652835, 12735115, -4538707, 8266202, -2680060, -10991358, 1037772, 10147934, +-5543192, 5578089, 6552510, 18127984, 5064840, 5706938, 17412334, 9925133, 6626061, -24006182, +5025112, 3692061, 4713190, 505196, -9747965, 17426830, -12878996, 9946607, 10464688, -15654619, +-3367254, 21455510, -19040664, 3255048, -4416300, -2053531, -6819335, 8360691, -3515968, -7116761, +-6024766, 3744675, 8179765, -7562901, 9490267, -7806103, -3350075, 10727755, 4020626, -876710, +-4641786, -5010616, -59056, -1984812, -8076686, -932545, -1655173, -2280091, -657667, 6444599, +-459562, -5936719, 641024, 2517388, 6240588, 3848828, 4981089, -1960116, 2678449, -3543885, +278099, -1204738, 2677912, 5116380, -3671123, 2353642, 2534031, -275415, -3156264, 1756105, +1498407, -10980084, -16589311, -7285875, -6890202, -22287660, 15271830, 2438468, 16299401, 984621, +2405719, -7675644, -3949223, 7968238, -518617, 8237748, -8036958, -2531346, 1548336, -3612068, +-6560563, 9812927, -9846213, 11678553, -3970161, 3843996, -2410014, -7821136, -6988986, 3455838, +-2467459, -21475, 6087043, 23314156, 1772211, -2907693, -7740068, 3410741, 18872624, -3381750, +-2956548, -10852845, -3660923, 1644436, -10220412, -3700114, -14628659, 9567040, -17933100, -32564442, +-3294777, 1132261, 15699179, -16028281, 15080704, 9829033, -7519951, -15124190, -2294586, 2598992, +4592394, 649614, 9595494, -6213744, -2216203, -32118840, -4158602, 33378876, 3406983, -5482526, +-4265977, -17137994, 13131326, -5428302, -4744865, -4138738, -2324651, -7346542, -10945724, 3459059, +6573448, -198642, 5057324, -9241159, -16978542, -477815, -8858907, -2448131, 501974, -8798777, +2271501, -6372658, -11314018, -8359080, -3949223, 3874061, 5469104, -836982, -13414793, -3238405, +1066763, -6536404, -2780455, -396748, -6032819, -3486440, 1880122, -95026, -4695473, -1772748, +2464774, 1020055, -6307697, -2400887, 359704, 6206228, 6884833, 1989644, -1796907, -2228014, +-566936, 4689568, -745714, -227633, 578747, 1908039, -5243082, 5314485, -890669, 3661460, +605054, -3637837, 15421617, 13775034, -4468377, -5697811, -1419487, -22228604, 14570677, -14069239, +-11621108, -9009768, 5444408, 2199560, 13498545, 1612223, -7482370, -8728447, -9052180, 6944425, +-3529390, -4863514, 12321187, 13800804, 4631049, -9360881, 11343009, 18377092, -7124277, -4070555, +15855409, 4063039, 3095598, -10431402, -118112, 15124190, -22466974, 15365246, -3457986, 2055679, +9121974, 11111080, -206695, 5537287, -10650982, -8629126, 5669894, 21160766, 5555540, 5143760, +7896834, -10714333, 2117419, 9383430, 5309117, -1782411, 7435126, 4687957, -12846784, 10306311, +-12527883, 2769717, 8908836, -9856413, 7340636, -12023224, -4938139, 2186138, 278099, 7663833, +-5083094, 6572911, -5197984, 916439, 2284386, -2248952, -5105106, -9719511, 25772488, 2763275, +7595113, -11322608, -26674432, 18679886, -18203146, -7818451, -314069, -4170413, -2920041, -1578937, +-7665443, 4628364, 3510599, 1993402, -7111929, 8494908, 6293738, -2852395, -3170223, 2502355, +-2656437, 2357400, -2683281, 9019431, 3041374, 843424, 6111739, 6752763, -4206921, 42950, +2933463, 4697621, 1612223, 2253247, -4560182, -5553930, 4162897, 5833103, 8093866, -1149441, +-7992934, -1067836, 394063, 3805878, -12133819, 4472672, -4270271, -1705102, 2409477, 2791729, +-3258807, 4126927, -5906, 3287261, -2243584, 7810935, 2325725, 3264175, -1458141, 4451197, +-14687178, 15363635, -5776194, -15374909, -19902342, -5637145, -2099165, 11547556, -17526688, -2903935, +-2130841, 9074192, 17250736, 14258755, 8857833, 1267552, -4519916, -2776160, -1858110, 12096239, +9943923, -2459943, 1511829, -2758980, 7776575, -19053548, 11235634, 6129992, 8780524, 2902861, +1970316, 16231218, -6507949, -14006962, 8053, -4680978, 884226, -19390166, -10741713, -1239635, +16054051, -10998874, -3507915, 2545305, -715649, 361314, 15779173, 6272263, -2521683, 1289564, +7688529, 5011153, 18395882, -5537824, 8369281, 9283035, 4959077, -3100430, 2959233, -20202990, +8528194, -3868155, 851477, -4722854, -11119670, -14977088, 2962454, -7203197, -20249160, 4732517, +-17214228, -12738336, -3028489, -25982404, -15733002, 3752728, 10972031, -13038447, 2725694, 906775, +29651380, 28061706, 26535918, -933082, 1431298, -14121316, -8502962, 10969346, -6067178, -4073240, +1771137, -3697967, 6172942, -7793218, -3872450, -425739, 2303176, -4745402, 5654325, 5598490, +193274, -2610803, 1517197, 5462662, -4624606, -6176700, -1605244, 4893042, -6914898, 11421929, +6595996, -703301, 5190468, -2024540, -4874788, -7814693, -4212826, -6953552, -3737695, 3784403, +630286, 11510512, -2792266, -3925063, -1844689, -26360898, -29148870, 17122960, 15370614, 5066988, +16666084, 28007482, 7866770, -10867878, 8944806, -4410395, -8082055, 12734041, 787590, -11661373, +6935299, 9128416, 1999307, 3124052, 565862, 1294933, 25630218, -689879, 5376226, 2267743, +15850577, 808528, 25421912, -253940, -11394548, 20315732, 4037269, -9175124, -3338263, 10695542, +-2388002, -321049, 8329552, -15676631, 15369004, -3407520, -22868016, -6492380, 2084133, -22843858, +-2693481, -2499671, 9842454, 9529996, 16941498, -12109660, 2461553, 2595771, 3408594, 7181186, +-11028939, -12386149, 6285148, -421981, 12916577, 10503879, 3136937, 27170500, -4695473, -4307852, +-18797998, 27729382, 4776004, 19209242, 11684459, -31175556, 4311611, 2721936, 18901614, -10203769, +7975755, 75699, -8408472, -1124208, -6823093, 15250892, -29542396, -3665218, -2253247, 28454, +1186485, 4636954, 7051263, -188979, 13428752, -612570, -2087891, -4436165, -2965138, 802085, +-4865661, 1526861, -1433982, 4028143, 2727841, -1465121, 988379, -1652489, -8346732, -503585, +263067, 2024003, -8522289, 4432406, -1870995, 4662187, 3572876, 6612102, -6932614, 7738458, +-4373888, 2478733, 5464809, 5044439, -1888712, 158914, -3207804, 4377109, -409096, 2132988, +-251256, -909459, 11171210, 6352794, 13422, 5264556, 1425392, 5478768, 1060857, 17191144, +-36191540, 21551072, 21920440, -9299141, 5235029, 3085397, 5953362, 194884, 17453674, -12659953, +-2716030, -13583371, -87510, -7656853, 1252520, 3708704, -19850266, 8987219, 21615496, -14811732, +-14216342, -14489609, 28769838, -12513387, -7037841, 2723009, -9832254, -29743186, 5255430, 21678310, +-29680372, -13404593, 10276246, 15985331, 4338454, -4463008, 6889128, -10482405, -4926865, -495532, +14715632, -20151450, -16061567, 11463805, 18477486, 7331509, -23073638, -7412040, 577673, -1010391, +-4008278, 12111808, -3578245, 18252000, -14804215, -3165928, -25233, -16885664, 10744398, -19666118, +-13571560, 6364605, -8826158, 19251654, 27738510, 16440061, -18353468, 9794136, -5401995, -5425081, +-12958453, -3955665, -21116206, 16219407, 11873974, 5823439, 626528, -9903121, -5614059, 6609418, +-22046604, 17871896, -4215511, -2942053, 9294846, 1749125, 8462696, -2308545, -1345935, -7430294, +-2190433, 817118, 1487132, -5802501, -2092723, -2709588, -2144799, 10102837, 1040456, -50466, +-4806069, 4176319, 3952444, -3430068, 2171643, 4699768, 994285, 7832410, -2791192, -5299453, +1079111, -8718247, 4533338, 3430068, 1100585, -140660, 3478387, -615254, 5707475, 1984812, +4047470, -6859063, -2166274, 6669548, 304943, 2803540, 3279208, -6380174, 885300, 6725919, +21095268, 35125316, -193810, -26490284, 5682779, -31620086, 5484673, 14443438, 6822019, 1966558, +19104552, 14139032, -791885, -2848100, -26127360, -14058502, 449361, -12202002, 35535484, -6416681, +-7981123, -15261093, 1972464, 13397077, 9398999, -430570, 6922414, 10448582, -15670725, 5440650, +30502320, 10833518, -20823076, -14671071, 9950902, -10274099, -1343788, 7471096, -4561256, -17183628, +-4048007, 2149631, 29072096, -6219650, 6514392, -7658464, -23361400, 4160213, 29495152, -7853348, +-17563196, 5202279, -10725607, 7266011, -6095096, -7114614, 20298552, -5104569, -2226404, 9961103, +-17343078, 6362457, 21481278, -8779450, 1925219, -12463995, 37711960, -6763500, 4574677, 12297028, +-8650064, -2004676, -9955734, 5368709, -11260867, -9483825, -8862665, 14512158, -19466940, 2974802, +-2800319, -5727876, 15303505, 453119, -5094905, -6342593, 894964, 5827734, 4540854, -8587250, +-1482838, 519691, -2327336, -10648298, -6378027, -1825898, 2673617, 1007707, 976031, 1654099, +8888972, -8715026, 9341017, 1977296, 2777770, 779537, 7431904, -3985730, 12133283, -2473901, +-71404, 9388262, 12192338, -6139119, 8012799, -3760781, 2766496, -6811818, 6226092, 5329518, +-10295037, -313533, -4043712, -1212255, -5082557, 3992709, -6281927, 6004901, -1140851, -2063195, +-10433549, -58262304, -20553030, -1269700, 18335216, -9952513, -29265370, -11164231, -4468377, 14010720, +3492882, -4100083, -14578193, 14952392, 26734024, -12454331, 20160040, 4886599, -38779796, 14165339, +17898740, -6578816, -15890305, -3164854, 23566486, 25143276, -2305324, -19463182, 1140851, -2423435, +-2690260, -16259672, 3762391, 7086696, -25636122, 17329120, 14725295, -18168248, 3127810, -20355998, +6932614, 48959944, -44144212, 45248016, 20382304, 1825361, 27624156, 13595182, -28639916, 16874390, +-21580600, -5027259, 23190140, 866510, 6514929, -12177306, -21016886, 63149440, -15070503, 688805, +24793772, -12290586, 4697621, 1680406, 15254113, 35474820, 33753076, 31883152, 1831267, -855772, +-5333813, 1401770, -8843875, 2181307, 27081380, -7447474, -9616432, 2493229, 3607236, 15586973, +18266496, 5021891, 5008469, 12860206, 5405753, -10233296, 3107409, -5392869, -14957760, -6883222, +7628399, -11392401, -16221018, -12440373, -710280, 1234803, -9360344, 4490389, 10280004, 1382443, +-3516505, -861678, -11884711, 13675713, -2185602, -3275450, 9499931, -8209293, 6417755, -6207302, +-4904316, 16134582, -186831, -12404939, 15399605, -9780714, 9237401, 4137664, -6210523, 4427575, +-2257005, 11057930, -5294621, 3695283, 448287, 692564, -1306744, 11781095, -6285148, -1668595, +-970663, 1883343, -1844152, 4988068, 9135932, 14837501, -3950833, -42844448, 19428822, -31130460, +43725988, 5146982, -38075420, 8566312, 308164, 17850420, 8396124, -9223979, 32341104, 7890392, +1609002, 21607980, -17321604, -24044838, 745714, 12576738, 43589624, -6144488, 68719, -4574140, +31399432, 3422552, -25025164, -14763413, 4678293, -2763812, 13868986, -24268712, 11606075, 3965866, +7132330, -2163590, -9543954, 5531918, 9694815, 108448, 29151554, -47097000, 4052302, -16603807, +-10394895, -6066105, -34515432, -50039592, -51883740, -37650756, 3921842, 205622, -30129732, -228170, +-5556614, 3256659, -18731962, -48205640, 47435228, -833761, -7107097, 9700721, -47234976, -3219078, +-11832635, 8869107, 13749264, 64755760, 48143900, -5387500, -698469, -1503775, 12606803, 19596862, +11764452, 8954470, -1928977, -7792682, -45984068, 8689256, -1069447, -17861158, -8148090, 29989072, +-4343286, -5438503, 14166413, -1184337, 15549392, -6075231, 7736310, -848256, -3425237, 11110007, +13387413, -6149857, 1748052, 6028524, -2690797, 2857764, 537408, -137439, 9078487, -3895535, +-4871567, 7681549, -9113384, 11874511, -242129, 6437619, 9687836, -4923643, 2263985, 8625905, +-2250563, -5618354, -2279554, 998043, -1756105, 2384781, -11854647, -707596, -9434433, 9749576, +1241782, 6576132, 4428112, -1357210, 77309, -602906, 4219806, 6087043, 4743792, -729071, +-5887327, -836982, -12341589, 58750856, -56296284, 9513889, -10931766, 2066416, 23664732, -17459042, +5834713, 789200, -60898880, 1392643, -6926709, 2836289, 6921877, -27276264, -10231686, -45079440, +-11694122, -2314451, 2353642, -17140678, -12897787, -19708532, -8269960, 19305878, 4129611, 39119100, +9503689, -13402445, -14030584, 23984708, -26934276, 46032384, -36181880, 10370199, -29213294, 462246, +27661736, -50591492, 47418048, 8252780, 5380521, -34788700, -7041599, -6716792, -114354, 16479790, +16476568, 20779588, -40120364, -1160178, -15850577, -13780403, -15522549, -21718040, -15042049, 599148, +22783728, -24626806, 6459631, -45212048, -15207942, 11232413, 13281649, 2273112, -51394116, -27902256, +-18405008, -26280904, -21770652, 1647120, -17185238, 27101780, 8038032, 13493177, -9611600, -14310831, +45556720, -15507516, 12130061, -9368397, 3398393, 34153044, 4435628, 6016713, -19394462, 19324668, +11164231, -8254927, 17947058, -13792751, 4822712, -5241471, 12088185, 2260764, -4276714, 6455336, +15436649, -5545877, 4810364, 5349919, 4483946, -2065342, 4009889, -2446521, 10517838, -3772592, +1576253, 9921374, -2319282, -4181151, 2907156, 4157528, -7212861, -1785096, -19638202, 11918534, +8057359, -177167, -11013907, -4661114, 703838, 3798362, 14533096, -2697776, -4327717, 4876399, +3514894, -2515777, 14671608, 2532420, -18569292, 4457639, 17725866, -2360085, 25269976, -47755740, +72659032, -54796268, -5830955, -33084134, 6443525, 656593, -20035486, -28305446, 32976758, 22152904, +10305774, -14474577, 14505715, 4473209, 31126702, -24748138, -16401943, 19342386, 32357210, -41443752, +16623671, -1540283, 19578072, -14981383, 5650567, -18406082, 3662533, -34430068, 11156714, 36796596, +-1355062, -2893197, 45674292, 7917772, -21253108, -44801876, 38128572, -20284056, 17119202, -16482474, +45601280, 20124606, -5175973, 4645544, -26626112, 3480534, 11237245, -12845173, 12623983, -55409908, +21565030, 50153944, 39099236, -21780852, -22706956, -22711250, 25249038, 2006824, -8215736, 2010045, +64677912, -31680216, -14931454, 25066502, -21759914, -58583352, 24705188, 13053479, -42004780, 23443006, +40360344, 35721780, -11091216, -16018617, -28706488, 15274514, -17781164, -11308112, 25832618, 17674864, +7871602, 22789634, 12707198, -8858370, -8394514, -29473140, 6706055, -12397423, 10035728, -10939819, +20837034, 14480482, 3039226, -3970161, 19801410, -10946261, -1720134, 2552821, 7494718, 4603668, +9052180, 8441221, 514322, -4848481, -3045669, 7082938, 3571265, 2831994, 798864, 11165841, +35999344, -1119376, -3042448, 5381057, -12757663, 4430259, 12836584, -18676666, 8017094, 9616969, +-7332583, -5258114, 8311299, 4756677, -10959683, -46898360, 25070798, -2731062, 6548752, -17177722, +15026480, 332860, 8246337, 2514167, 2739652, -9758166, 7482370, 25409026, -32405528, 27880244, +-4751845, -17097192, 5735392, -11624866, 7548405, -11909944, -9797894, 8259222, -25849798, -2639258, +34438660, -49707268, 14027900, 2384244, -8318815, -15270219, -18077518, -11744588, 36133024, -29743722, +-4262218, 11691975, -30232812, 7684770, 16594143, 11112154, 5682242, 5243082, -17055316, 13442174, +-44475996, 637803, 38938712, -16267726, -4376035, -8722005, -10985453, -295279, -31481036, 16701517, +12650826, -26013006, 24422258, 6820408, -29673930, 12224551, -5762773, 21544092, 18762028, -27579058, +9638443, 30680562, -28879896, 16183437, -20565914, 16218870, 18753438, -29297582, 16513076, -2090039, +-15543487, 22402550, 1174674, -35239132, 10836739, 15723338, 4732517, -9773198, 1705639, 26776974, +-12370043, -24957518, 26601954, -1078037, 2010582, -1106491, -3363496, 16426102, -12227772, -5795522, +11569568, 4500589, -2866891, -11911555, 17648020, -6638946, -11600707, 1040993, 9272834, -5463199, +-4316442, -2676302, 13774497, -10678362, -5604933, 1090922, 7461432, -6538551, 5339718, -154619, +13649406, -8552890, 2129230, 1264868, 1305133, 12124693, 22726282, -9742060, -107778984, -235927392, +-93603440, -156848992, -213573696, 80554256, 28566902, 69540352, 317378208, 264364896, 174210848, 272515136, +185121680, 21909166, 45882060, 33170032, -145693888, -94066224, -64885144, -166638288, -170088224, -47278464, +-47776144, -105819944, -31785980, -23027468, -127413424, -109594144, -35851704, -60446832, -120363776, -29632590, +-20510080, -94363112, -11270531, 65066608, -28760712, -23274428, 96199216, 58896348, -39800388, 85205168, +140754672, 15393700, 79008608, 172852032, 84334904, 43409236, 186479424, 136257840, 101245264, 226518192, +306565632, 242429968, 281605440, 365037856, 238260624, 155841808, 204504336, 131644504, -37111200, -9382893, +-91223496, -225601216, -318817024, -342947232, -458939264, -522025888, -554204864, -536141312, -515258112, -512292960, +-427953760, -327641568, -307483680, -200805296, 15673946, 84666688, 109923784, 333779104, 327557280, 225815952, +332813248, 305007648, 165339056, 160667216, 212138640, 128190280, 60155312, 148279984, 151293984, 67783176, +122181616, 184613264, 122301880, 72661720, 157024544, 129997920, 25854092, 79507360, 115389664, 12598213, +21614422, 126342904, 77158016, 41384156, 133992776, 132815424, 48302276, 105766792, 91292216, -24161338, +-66640176, -69076496, -158614752, -214687168, -211965232, -244640800, -269623008, -279608288, -273707520, -280787232, +-312185600, -322973472, -308976192, -344664160, -295132448, -201167136, -153895664, -52661668, 88653496, 185942016, +272508160, 351890976, 357875456, 306459872, 278437888, 228783776, 173322864, 139827488, 117795920, 95318744, +74786656, 67928664, 63155884, 47057272, 40037684, 35871568, 19665582, 944356, -9678172, -26363046, +-44558140, -56114284, -59055264, -64900712, -62697396, -51506320, -38879116, -28726352, -16068546, -8058970, +-1786170, 5812165, 10996190, 10759430, 11323144, 7328825, 823560, -2627446, -5781026, -12096239, +-14780593, -16276315, -20671140, -21386790, -18957448, -22625888, -25163140, -22430466, -24363738, -27937152, +-26048976, -31117038, -37219648, -35335232, -35476968, -37627672, -32907502, -28376312, -25067040, -17754322, +-8554501, -3359738, 2591476, 11011759, 18143016, 24471114, 31445604, 37023156, 39361228, 42083164, +45114872, 46407660, 47404092, 48569636, 46903728, 43354472, 38542500, 32251446, 24950002, 15705622, +6451578, -2192044, -11038066, -16878684, -19400368, -20314658, -19907710, -17541720, -15591805, -14633490, +-13009993, -11562052, -10954314, -10108206, -8999567, -8184060, -7532299, -6605660, -5648419, -4878546, +-4104378, -3309272, -2682744, -2281165, -1988570, -1767916, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -3986804, -2424509, 3884798, -1372779, 3452080, -563714, 3643743, 1831804, -803696, -1430224, 3690988, -309775, 734439, -4200478, -674847, -304406, -189515, 5737540, 2802466, -211527, -4308389, --3133716, -1854352, 523449, -100395, 1241246, 2637110, 801548, 971736, -4348118, -670552, --4232154, 168577, -2341294, 2768643, 2763812, -1104344, -2284386, 2894808, 618475, -1087701, --3912715, -532039, -2509872, 701153, 2390149, -3968550, -1938104, -664109, -1553704, 10126996, -2411624, 5845988, 424665, 1917703, -45097, -2927020, -2716030, -3455301, 1631551, -2850785, -2049773, 63888, 2502892, 2560874, 6218039, 1876364, -516470, -315143, -3694209, 6023155, -5541045, 969589, 1708323, 1569811, 1714766, -350577, -3092377, 921271, 1788317, -1161252, -517544, -951335, -2825552, 1345399, -2356863, -1600412, -733903, 188442, -1054415, -1144072, --1342714, -28991, -73551, -210990, 272194, -471373, 900333, -500364, -839129, -81068, -1129576, 425202, -461172, -1515587, -445603, 1403917, 96100, 634045, 557272, 394600, -14017700, -3288871, -2905546, -1114544, -2749316, 664109, -6631430, 540629, 1347546, 359704, -4544613, 539018, -911070, -3974455, 2581812, -5611375, -4832912, 1774358, -2344515, -1111860, --816044, 959925, 3820374, 5216238, 415001, -785442, 6200322, 2247342, -334471, 245350, --2499671, 98247, 6804302, 23085, -3125663, -2528125, -706522, 2320356, -3111704, -3847217, --3923990, -3212099, 3120294, -3020436, 1183800, -3674345, 1327145, 4492536, 319438, 3198140, --1323924, -2502355, -1220308, 2224793, -106300, 3432216, 5019206, 751082, -1481764, -2562485, --100932, -362388, 257698, 178241, -4371203, -445603, -2027225, -2219424, 2162516, 471373, -1398549, 1639604, -5205501, -2899640, 2201171, -960462, 3900904, 722628, 3291556, -646929, --799401, -881005, -1864016, -424665, -2055679, -819802, 92879, 3071975, -702764, -48318, --494458, 987306, 7516, 1197222, 270046, -236760, -734439, 968515, -1462436, 27917, -114890, -830539, 739808, 919123, -1227824, 445603, -586263, 566936, 568546, 18254, -938987, 118648, -426812, -9847823, -4792647, -2021319, -6691022, -2237678, -6417755, 2050847, --450435, -3951370, -4575751, -576063, -3715684, 30065, 3315715, -117575, -5717139, -2046015, -209917, -2163053, -1769527, 1811939, 5627481, 7175280, -1013075, -1762547, 4086125, 4626217, --1280437, -923955, -773631, -3060701, 1093069, 1589675, -2742874, -2026688, -543313, 2841658, -6146098, 514859, -1904818, 124017, -2912525, -998580, -4703526, -2151242, -2018098, -7514582, --687732, -3345243, -2281702, -8261907, 5327907, -3528853, -3111704, 1611150, -397284, -483721, -1222455, -6844568, -1684701, -2376191, -426812, -3901441, -424128, -1774358, 1971927, 2538326, --2141578, -1090385, -3202972, 1300301, -370978, -560493, 137439, -5036923, 5906, -4540854, -843961, -195958, -1339493, 1495722, 5796059, 2821257, -1203128, 428423, -860604, -2083059, -349503, 998580, -976568, -37581, -1240709, 158377, -433255, -1586454, 820339, 780610, --1666984, -720481, 622770, -634045, 379568, -1052267, -781684, -832150, -1547799, -1699733, --5906, 586800, -795106, -977642, 133681, -397284, -96637, -471373, 123480, -214212, --478352, -1381369, 942208, -407485, -588411, -607738, -1139777, -77309, 269509, -932545, -177167, 193274, 183610, -735513, 344134, -18544596, -1514513, -9170292, 8131447, -4803384, -14680735, -9485435, 9237401, -8414915, -549756, -184684, -6484864, 4947803, 139586, -2461553, -1466195, -2163590, -884763, -6336688, -97711, -4798016, 3711389, 1244467, 4553202, -2758443, -6811818, 6093485, -6014028, 1614371, -5116917, 5343476, 20938, -3854196, 289373, -605054, --221728, 3899294, 558346, -5979132, 2413772, 4174171, -302258, 4941360, -2353642, 4013647, --6140730, -3194919, 3999688, -3602404, 1001264, 5320928, -4931160, 7900056, 3146064, -7970923, -1906966, -7683697, 2724083, 4146791, 2856153, 3987877, 5861020, 1887638, -725313, -566936, -386547, 1762547, 4216048, -1553704, 7968238, 1446867, 5462125, 2864743, 1590749, 289910, -5484137, 885300, 1367947, -3243237, -4263829, 2075006, 2967823, 215822, 4723391, -665183, --22012, -979789, 5609228, 1580548, -1979443, 1156957, 975494, 693100, 1928977, 178241, -3505230, -661425, 1225676, 540629, 1359894, -1000191, 694711, 207769, 111132, 186294, --1151051, -1193464, 477815, -1442035, -545998, -1554778, 951335, -151934, -424665, -594316, -12274480, 128849, -3262565, -1054951, -4492536, -5379984, 8981850, -1672890, -1234803, 8243116, --569620, -1523640, 3685082, 6426345, 1883343, 3220152, -96637, -6895570, -1775432, 5281199, --7856569, -7792145, -2874944, 1774895, -5519570, -3302830, 179315, -728534, 5558225, -2062658, --1135482, 5842766, 8121247, -6924561, 1893544, -1610613, 3007551, 855772, -3026878, -622233, -3419331, 5186710, -1308354, -7195681, -1560147, -588411, -1841467, -3566434, 597537, -410706, -1392643, -949725, 1080184, 6820408, -4935455, 695785, -3741454, -3045669, -5169530, -1535451, --2955474, -7203197, -185220, 540629, -2746632, -513249, -2911451, 2838437, 3598109, -513249, -1124745, -2570538, -648003, 8790724, -1081258, -3591667, -11805254, -5374615, -79457, -4025458, -2819646, -1118839, 1100049, 18254, -2310693, -420370, 3538516, -2894271, 758062, -796716, -415001, 33286, -2409477, -1817845, -968515, -1897302, -304406, -3019362, -554051, -1704565, -417149, -1184874, -312459, -1622961, -1684701, -1722282, -363998, -172872, 705448, 457951, --155156, 504122, 488016, -87510, 1782411, 1477469, 62277, 875636, -615254, -922344, -295816, 15694884, 17655000, 3248606, -6606734, 3915400, 6881075, 6898255, 3838090, 5176510, -2248952, 8563091, -1011465, -1203665, -3676492, 5323075, -3328600, -7798587, -10681047, 1077500, --5186710, -4494684, 3610994, -1247151, -2929705, 8748848, -758062, 10902238, -2147, -4498442, --3101503, 3738232, 2455648, -2309619, -8855149, 12470438, 7173669, -61203, 6720550, 3947075, -4332012, -4267050, 4906464, 2427194, 900333, -1655710, -2357400, -5691369, -7948911, 2086280, -3693135, -6242735, 2351495, 5149666, 7774428, 1955821, 7014756, 3174518, 5963025, -9035001, -2551211, 694174, 1695438, 99321, -701690, 3658239, 3346853, 3217468, 4769025, -1728724, -2272038, 1272384, 6902013, 8436926, -4413616, -5194226, 683974, -2190970, -4631049, 1785096, -4658966, -3049964, 1929514, -8684961, -6365679, 1327145, -4415764, -2165737, -1476932, -4014184, --57982, -176094, 424128, -216896, 1632625, 1893007, -201327, 895501, 286152, 1402307, -1559073, -102542, 60130, -227633, 1713155, 773094, 921807, 2066416, -434865, -1242856, -1597191, -599685, -57445, 2390149, 1502165, 2255395, 3210488, 381715, 1415729, 751082, -2114198, 447213, 871342, 1056025, 14501420, 4559108, 6386080, -5355824, 2076080, -13198971, -679142, -9546639, 7175280, 4807679, -4032438, 6024229, 3421478, -6478958, -1621350, 9271761, --325881, 6371584, -1776506, 1248762, 7407745, -9276592, -729608, 1472100, 2698313, 577136, -2971581, 347892, 8993125, -4217121, -2601677, -2763812, 6798933, 822486, -3209951, 4092030, -11475616, -8063801, 1410897, 1501091, -704912, 4590783, -2328946, 8727910, 2944200, 2174327, --7198902, -760209, -1911261, 4021163, 3056406, 4346507, -4944044, -3274376, 4178466, -8665633, --4827543, 1906966, 9266929, 5568962, 8195872, -8986682, -2829847, -9132711, -2352568, 2705293, --774168, -8621073, 1125818, -5303211, -73551, -9430674, -11364483, -4693863, -8202314, 417686, -2903398, 1581085, -3506304, 4481262, 7289097, 1990717, 2154463, 4136591, -1313186, -7041062, --421444, -4861366, 2519535, 744103, -466004, 1245541, 658204, -5175436, -2611340, -1512902, -2573759, 313533, -1789391, -673236, -149787, -806917, 430570, -1101122, -468688, 301185, -2346126, 534187, 767189, 469225, -447750, 630286, 1570884, 745714, 2041720, 547071, -1061931, 59593, 1619740, -2568391, 1601486, -16980690, -15298137, -10963441, 3534221, 3577708, -12969727, -5523865, 12324409, -4834523, -19958176, -1649268, -1729798, -7636989, -12865038, -4610111, --147103, -7878581, 67646, -12196097, 1037772, -12865038, 7580618, -3137474, 5558762, -2415919, --97711, -3907347, -4560719, 8163122, 1706176, -2207076, 9239012, 1151051, 1595580, 3258270, -8511551, 7492571, 5742372, 270046, -9795747, -908386, 4893579, 1571958, 6207839, -2791192, -2835215, -14446659, 4730907, 8910447, -10912438, 6616934, 2392834, 10516227, 8072928, 93952, --2626909, -145492, 7174206, 3587908, -9183714, -7460358, -12744779, -6121939, -8519068, -1855963, --10568304, -2175938, -3473555, 10980084, -4970888, 5475010, -2716030, -1495186, -3442953, -7428683, --3919695, -2323577, -2403571, 6946036, -20488604, -4296041, 9729712, 533113, 1946694, 5245229, -9850507, -6030671, 1262184, 2678449, -358093, -5906, -1333587, 2756295, 4129074, -1677722, -421981, -308701, 4601521, -1586990, -42413, 4624606, 1020592, 1683090, 2192581, 2216203, --656056, 465467, -1124208, -1679869, -909459, -3041911, 994822, 2134062, 1507534, 906238, --3976066, 100932, -448287, -105764, -1814087, 1216013, 1914482, -897648, -103616, 2240899, -2383707, -2399276, -22849226, 17104708, -5131412, 10014790, 5719823, -657667, -15202037, 11541114, -1351841, -1276142, 7186554, 5036923, -6433324, -345745, 12429098, 3969624, -5995775, 8764955, --5196911, -4205310, -2989834, 2649458, -212064, -1885491, 946503, 3622268, 3175592, 3311957, --9624485, 5534602, -8046085, 10324028, -6856379, 10274636, 3094524, 763967, -10604811, -10719701, --3769371, -3731253, 11936788, 3220152, 9484898, 3865471, -9044664, 95563, -2296197, 3957812, --69793, 3456912, -1404991, -6119792, -3759170, 5972689, 15185931, 10941966, 934155, 3604551, --1451699, -2411087, 7624104, 6436546, -3185792, 9583683, 13516799, 19131394, 73551, -11337640, --13718662, 4430259, 2080912, -793495, 3017215, -163746, -4634807, -728534, 11352135, -2360085, --5465883, 20614770, 4911295, -3751654, 5775658, -80531, -571768, -878858, -3659312, -688269, -5983963, 2927557, -2389613, -3267396, 4089346, 3386045, -648540, 8252243, 2093797, 1386738, -566936, 3592203, 1110786, 3353833, 2105071, 1042066, 362388, 4281546, 2140504, 2190970, -317291, 4250944, -910533, 1548873, 2312303, 1652489, -687732, 4775467, 5354751, 1571421, --1238561, 5749888, 150324, -2905546, -778463, 4161287, -64425, -512712, -1205812, -927713, --68183, 986769, 2520072, 3858491, 1116155, 4081830, -1226750, 10491531, -15344308, 12918188, -5310190, -10470057, 24532316, 3701188, -12527346, 2918967, 6830609, 674310, 4932770, 17629768, --16842714, 11017665, -6813429, 9778567, -3718905, 2114735, -15603079, 2688650, -1697049, 6310381, --5983963, 915365, 1193464, 208843, -9162776, 8836358, 920734, -901943, 4136591, -1701344, -4074850, -2125472, 12383464, 9833328, 12257300, 12259984, -1979443, 4324495, 5280663, 605054, --6416145, 8694624, -10237055, 3227668, 10139881, -5963562, 5369783, -11263552, 3616363, -914291, --2703145, -903554, 863825, 3580929, 3367254, 12021613, -7838852, -300111, 7898982, 17098802, --15089294, 3951370, -3711926, 5259188, -2779918, 24939264, -15302968, 5549098, -8530879, -4635344, -2214056, 2694555, 1369558, -21635898, -11462731, 18054432, 9836549, -1874753, -9714679, -11136850, --4458176, 4116189, -12090333, -6493454, 5947993, 3435974, -247497, -237297, -8461622, 1691143, --2462090, -3078418, 3872987, -1968169, -2609730, -882616, -7402376, 2625299, -1917166, -2399813, --2691871, 3483219, -3570192, 4220342, -642098, -942745, 1408749, 1564979, 5316096, -5365488, --1165010, -4057134, -886911, 2765422, 2018098, 7079717, -2282238, 3951370, 865973, -2452426, --1670205, -593242, 2639258, -318364, 1353452, 11513734, -15075872, -3175055, 21392158, -6382859, --398358, 11476153, 2716567, 7094212, -15914464, 15327665, 1024350, 1174674, -4019553, -9559523, --1293322, -1452236, -10246181, -6166500, 11418707, -3588982, 2214056, -5559835, -25022480, 8514236, -1164473, -7704098, 4809290, 9736154, -884226, 1106491, -1934883, 2474438, 6599754, 2127620, -10589242, 7270306, 1677185, 9271761, -7419556, -7295539, -10416369, 3978214, 6055367, 1789928, --16536698, 4729833, -14127221, 20533164, -4840428, 7319698, 17508434, -6859063, 11131481, 2807835, -12117176, 4905927, -5819681, -17919140, -12868259, -10010495, -1365800, -10509785, -2087891, -9183714, --5965710, 18089328, 3931506, -7667054, -6817724, 3674345, 6724845, -1538135, 2636573, -32801738, -13232794, 2267206, -10516227, -12916040, -3360812, -21655226, 2357400, 10807748, 1207423, -9289477, -5772973, 4880157, -7641821, 3860639, 2295123, -1883880, 270046, -4878009, 1305133, 1729798, -1284732, -6366216, -3484829, 2651069, -3991098, 947577, -2405719, -1521492, 1553168, 5410585, --6819335, 2404108, 5322002, -6338835, -5980742, 812286, -5488968, 1286880, -3642669, 3815542, -2061584, -6351720, 3578782, -4166118, -2705830, 4415764, 1023813, 9913321, 3068217, 0, --617938, 790274, -2592550, 1111323, 7341710, -20116016, -24706800, 15188615, -12053289, -14048301, --3903589, 9599252, 19579682, -12613245, 1194538, 9419400, -2631204, -3854733, 5148592, 3424700, -14751065, 5062693, -13900125, -357019, -6981470, -306016, -8204462, -10823318, 1833951, 11188927, --668941, 5091684, -8993662, 2860448, 11023034, 8620536, 1413044, 1043140, 6937446, 6638946, -4247186, 10143639, -12470438, 13997298, 10069014, 3584150, -10287520, 949188, 8156143, -8053064, -9453760, -6356552, 10690174, -2634963, 13917842, -21495774, 23134842, 5577015, 21822728, 1581085, --4474282, -1335735, 7956427, 694711, -18003430, 888521, -1171452, -18621904, 6053757, 13536126, --17729088, 15042586, -15595563, 5069672, 6169184, 3433826, -19545860, -9313100, -9543417, 2066953, -1565516, -11308649, -16727287, 3458523, -14701136, 10265509, -7046968, -3711926, 5186710, -9070971, --7026030, -9311489, -3801583, -5120138, 391379, -7415798, -5551245, -6752763, -10128070, -4824322, --2040110, -2158758, -2490007, -2831994, -1888712, -4722317, -5236639, 3684008, -6287296, -3327526, --1540283, 5083094, -2309619, 308164, -8058433, -5735392, -2563559, -6442, -1756642, -6824166, --868120, -451508, 5763309, 3794067, -4490925, -4159139, 1025960, -2152852, 4279398, -2193118, -2341294, -4165045, -11730629, 17230336, 3302293, 11268384, 10906533, 2914135, -8813273, 1686848, -29219736, -20458002, 4645544, -3767760, -11288248, 454193, 3722663, 4550518, -374199, -127238, --6037651, -8702677, -13476534, -6886443, 9761387, -8581882, -13543106, 7458748, -5010616, 2746095, --2005750, 5758478, -5910412, 12345347, -4769025, 1175747, -535260, 1146756, 11291469, 3752728, --5614596, 5982890, -5161477, 9289477, -5948530, 3712462, -13798656, -10060424, -7514582, 2202781, --7029251, -11969537, 4706748, 8596914, 2299955, -6436009, 3774740, 6031745, 6757058, 18777060, -25844966, 35340600, -3868155, 5514201, 8320426, 4876399, 4545149, 5566815, -7496329, 13946833, --2220498, 18252000, 22455162, 16514149, 6524056, 9242770, 2916283, 31610960, 8914741, -5930276, --5237713, -4628364, -2021856, -2156611, 1490891, -2644626, -6119255, 5199595, -9576166, 2687576, --2301029, 2844879, -4840965, -3832185, -3090229, 7100655, -7161858, -6832219, -650151, 2878165, --3679176, -8738648, -3023120, 416612, -4257387, 4541928, 8629663, -5071820, -693637, 1793149, --999117, 2881386, 4971962, -2433099, -6154688, -1052267, 2837900, -2996277, 7844221, 9419937, -5693516, -2740189, -6476811, -860067, 9185324, 1046898, -323733, 4132832, 1240172, -82678, --1610613, 2318209, 2300492, -6255083, -4630512, -241055, 35455492, 28388660, -12352863, -5672578, --14739791, 8517457, 4153770, 17372606, -3047816, -7504382, -3395172, -11234561, 2539936, 446677, -16374563, -6114960, 6105296, -22020834, 12141336, -1710471, 8543764, -88047, 7740605, 1342177, --12548284, -6451578, -10766946, -8147553, 9057012, 21876416, 9510131, -2571075, -6785512, -266825, --1848447, 5480915, 7370701, -13940390, -290447, -4837207, -4691178, -15137075, -11734388, -24551644, -434329, -1195612, 8842801, -7329899, 15741592, -11931419, -5294621, 31596464, 31222264, -21561272, -4802311, 18169322, -10541460, -4967667, 9293235, -3430068, -13236015, 35148400, -8766565, -53255984, -17708150, -626528, -27515172, 21088826, 22414898, -7898982, 15682536, 20043002, -9477382, 770410, -12634183, -13660680, 5711233, 11083700, -19694572, -2632278, -6520834, 1145146, -7233799, 186294, -2716567, -8232379, 6660421, -9555765, -4478041, 4774930, 9459129, -5393405, 502511, 1995012, --1469416, 3319473, -6981470, 10304700, -5231807, 10880226, 10408316, -156229, 500364, 7187091, --5226975, 1637456, -318364, 8984535, -6690486, 5490042, 1602023, -20691542, 3984656, -2483028, --3946538, 1242319, -622770, 2345052, -11778948, 1726040, -3093987, -10243497, 1744831, 17923436, --16766479, 5638219, 9733470, -14149770, -95563, 8048232, -12870406, -6191196, 2864743, 6593312, -12154221, 6095633, -9163313, -1409823, 9085466, -9659918, 10390600, -4643934, -12461311, 11875585, -6309307, 6077379, -2858838, -2900714, -4193499, -308164, 10049150, -19741280, 10311680, -109522, -17074106, -10251013, 375273, -12822088, 6056978, -21061982, 2700998, 1257352, -8160975, -6135898, -3765613, -14083735, -24519968, 15364709, -1059783, 4831838, -14367739, 9316321, -2048163, 9988483, -10711648, 5454609, -10037875, 8875013, -4643397, -1970853, -18882286, 3068754, -13345000, -14695231, --21556978, -8682813, 3832722, 6368900, -22262426, -10866267, 1545115, -7791071, -30010010, -23762444, --24406152, -4833449, -14460618, 13396540, 18781892, 5352066, -17960480, -20917028, -24405078, -2027225, --1508607, 13776644, -11615202, -20336670, -9815611, -13452911, 4990752, 529892, 5200132, 2735357, --6490770, 1735167, 5345087, -5065914, -1944010, -4253092, -2542084, -3003256, -6300180, -48318, -8460549, 535260, 2677375, 2638721, -1127966, 6389838, -3700651, 9739375, 8797704, -3111167, --7358353, -132070, -2650532, -4026532, -4523675, -4022774, 7128035, 543313, 6730751, -6483253, --7013682, -1097364, 3838090, -11450920, 2294586, 1404454, -8270497, 2100776, -6757058, -15043123, -9698036, -3424700, 1457068, -2318209, 1889786, -7595650, -1746441, -562641, -15952045, 26459682, -29443612, -7537668, 19724100, -6065031, -8259222, -8170639, 19186692, -17398376, -4297115, -8447127, -30651034, 863288, 10969346, 3778498, -3288334, 15191836, 8287140, 12393128, 3616363, -2243047, --5811628, 11861089, -2401961, -12146168, 14458471, -651761, 12611098, -14770929, 9744207, 3366181, --15173046, -11635066, 26584236, 17296908, -2053531, 9458055, 7684234, -17364016, -11651709, 5470715, -3913789, 11796128, 1090385, 2439542, 4276714, 14450417, 5616744, 3574487, -15002858, 40170292, -26671746, 2940979, -18571976, 8862128, -6534793, 4866735, -4586488, 8490613, -6376953, 1217086, -21821656, -15564961, -7889318, -20866024, 5340792, -5772973, -4097936, 18827526, 5506148, 2283849, -1167694, -7937637, -15934866, 11069741, -500901, 107374, 11530377, 11814918, -1447404, -8884140, --10681584, 19498078, -2553895, -1254131, -4330938, 14638859, -1712618, -10411001, 6225555, 5375689, -8698919, 4105989, 2718714, 13532905, -3336116, -5076115, 4200478, -437013, -6979, 1104344, -5692443, -3611531, -605590, -4576288, 898722, 6473053, -3637301, 1471563, 7633768, -2986076, -1160715, 5903970, -195421, -1699196, -13317620, 8182987, -7734163, 5344013, -9123047, -1921461, -2780455, -5411659, -2782602, 12038256, 8127152, 987843, -2551211, 11258183, 1565516, 5359046, -4317516, 2508261, -2739652, 4835597, 1855963, 4788352, -9891847, -21233782, 54554676, -61572116, --7256884, -32489816, 39528732, 10519986, 6854768, -15600395, 3576097, -12764643, 35408248, -6440304, --2413235, 3483219, -1889249, -14062260, 5191005, 7916162, 10631655, -24158654, -12713103, -12523051, -4813585, -7431904, -6567005, -939524, -325881, 15575699, -8223789, 608812, 11800960, -1656247, --15920370, 1815697, 12432320, -1676648, -25035902, 18469970, 2160906, 159988, -115964, -10717017, -8154533, -46359876, -32307280, -4689031, -11610907, 1905892, 3469260, -21818434, 33940444, -13663365, -46781856, -6808597, -16451872, 15842524, 2633352, 14117021, 21643950, 6678674, -22320946, -6376416, -25003152, 57920320, 1897302, -15064061, 24194624, 1894618, 28544352, 4420595, 38654704, -10185515, --1569811, -1246614, 9017284, 1131187, 14847702, 26977764, 1602023, -5954436, -4858145, 8452496, --7386807, -3381213, 17738752, 12758737, 1947231, -3525095, -6693170, -7726110, -4597763, -6324876, -12793634, -8129300, -5509370, 6118718, 2282238, -2649458, 5733245, 6300180, -3621194, 5371394, -9092983, -4925791, 605054, -13100187, 16269336, -304943, 13086228, 642098, -13634374, -142808, -1420560, 3353296, 1465658, -237834, -11712376, -11093364, -649077, -6555731, 8652748, 2924873, --3998078, -645319, 6810208, 1146219, -3921842, 137976, 4938676, -195958, -2368675, -751082, -2681670, 80351856, 25131464, 9139690, -2240362, -8318815, -11217918, 26422102, 24250996, -27343910, -16669842, 12723841, 3097208, -8061117, -14415521, -37394668, -13876502, 12329240, 4161287, -11836930, -22991496, -7109782, 9448391, 9389872, -5262409, -5049271, 23982024, 903017, -8805220, 15106474, --12701829, 29418916, -14054744, -8403104, -1357747, 11639361, 6260989, 29748554, -8840116, -17360794, --6041945, 8062191, 2249489, 16061567, 4561256, 1652489, -6198712, 12992276, 55558624, 23785528, --20343112, 18014704, -10565620, -16540993, 13873281, -355409, 4202089, -863825, 10056129, -14417668, --22081500, -58877024, -15343234, 21326660, -7594576, -20062866, 9087077, -4504347, 9051644, -23460722, --20538534, -9565966, 9123584, 9635759, 28421410, 5172751, -1772211, -21871048, -31028454, -3684545, --13834090, 2924336, 11478837, -14694157, -15095736, -3098282, -18832894, -31596464, -10357851, -8251706, --16782584, -3768297, 9658845, -8676371, -4465156, -10004589, -2159295, -22454090, -14210973, -14228690, -631360, 2297271, 8414378, -12471511, 7355132, -16887812, 940061, -9861782, -1078037, 5493800, --5050345, 8233989, -22235582, -4257387, 7881265, 3402151, 7264401, -2654827, -5902896, 11204496, --1951526, -2088965, 7911867, -11027865, -8689793, -1452773, 2347200, -14694157, -6856379, -7910793, --4308389, -1058710, 34897, 1480690, -6493991, 891206, -1840394, -12930536, 17361868, -14618458, -48495548, 40635224, 18845780, -11605539, -17566954, 28929826, 24776592, -33342904, -7031399, -20583094, -27977954, -5190468, -40513352, -17898740, 13996225, 24742232, -46773804, 18258442, -32475322, 11531987, --19296752, -5299453, 22060026, -7915625, 3113315, 13899051, 29504278, -19881940, -32994476, 6941741, --2855080, 3177739, 30263414, 7309498, 22519050, -29265908, -5601174, 8879845, -26033944, 41718628, --5176510, 24842628, -3781719, -6306086, 20442970, 20300700, -12151536, 45982456, -11106785, -20576652, -22134650, 39451960, 2026151, 6824166, 1702418, 17178796, -18972482, 13701483, 60260000, 27423366, --2105608, 26020522, 32339494, -24509768, -74196632, 5208722, 44423920, 50040664, 13606993, -5257040, --21989696, 25791278, 55530704, 25616796, 13409425, -54976656, 10133975, -31309238, -19425600, -48513804, -40754944, 8527121, -14257681, -19523848, 14241575, -14211510, 7653632, 5124433, 7129109, -18200460, --3920768, -2573759, 9410273, -6497749, 7945153, 6688338, -8231842, -5599027, 11092290, 150861, -11921219, -5437966, 4380330, -8204462, 4187056, 22347788, 4204773, 3937411, -2941516, -24680492, --12390981, -15350213, 8000451, 40784472, 38674568, 34717832, -2775086, -25749402, -24136106, -11750494, -16237124, 17886928, -1370632, -8728447, -13050795, -19236622, 5005785, 10362145, 8833137, 8056285, -6501507, -91805, 662499, -3671660, 3773129, -5313949, 3642132, -1408212, -781147, -191126, -4734665, 1115081, 2039573, 311922, 2244121, -4032438, 440234, -1891933, -607738, 34152508, --67017596, 51501488, 10842645, -30612380, 617402, 28893318, -18913426, 1014149, 16102906, -19805704, -1886028, -17777406, -11236708, 19202262, -16137266, -9074192, -34091304, 15038291, 33469606, 9564355, --14811195, -25224342, -3901441, 19298898, 10493679, -21518324, -421981, 26353920, -3310883, 1974611, --8774618, -6212670, 61610768, -29314226, -7388418, -6670621, 10465762, 28731184, -30217780, -16860430, -40571336, -4608500, -2472828, -48237852, -39896488, 16906602, 27313308, 15017353, -49457624, 34127272, --805306, -7444789, 7201050, -35306780, -9728101, -4467303, -17476758, 32009318, -24808804, -13706851, --26686242, -15346455, -35217660, 10759430, -55111408, -15364172, 6534256, -27370216, 6847789, 15384573, -6765647, -300111, -9842991, -19753628, 29250874, -6251862, -2777770, -10419591, 17719962, 35504348, -5350993, -47785808, 4251481, -21246130, 3215857, 4501663, -8717173, 3408594, -14322105, -4777614, --1206886, -10799158, 204548, -3052648, 8409546, 7552700, -2631741, 3830037, 15648713, -7024419, --5649493, 16062641, -11660299, 10677826, -5677410, -5355824, 1145146, -6770479, -3335579, 9790378, --19051938, 5764383, 4418985, 7085086, 13549011, -9540733, 1569274, 10203769, 3635690, -3437585, --9048422, -1753957, -2246268, 266288, -9287867, 2789045, -1697049, -3736085, 2181844, 1238024, --4356171, 9782862, -4249870, -2964601, 155156, 2586107, -443992, -38739532, 23372138, -799401, -30278982, -6342056, 31326954, 3840775, -4070019, 13940390, 36368708, 17342004, 9286256, 7170985, -4609037, 14215268, -18373870, -1606318, -13785234, -14563697, 22369800, 13811541, 8544837, -6579890, --5655398, -2793876, 23409182, 3445101, -10389526, -17089138, -786516, -4159676, 17611514, 2523293, -14730664, 27520002, -7718593, -70289824, 4604205, 56820808, 5946382, -41978472, -5412733, 15924128, -12646531, 22207128, 20358144, -1849520, -13223131, -13747653, 17822504, -11030550, 1996623, 6038724, --72815800, -12827457, -13999446, 11356430, 57235272, -1258962, 4600447, -13498545, 3893925, 11582453, -24015310, 12315819, -14185740, -7693897, -35348656, -2377265, 24312736, -10962367, -5039608, 8708583, -24701430, 19765440, -5314485, -25381646, 166430, 8919573, 2815351, -16957604, 2083059, 1763621, --1242856, -14683956, -18665390, 15960635, 13358959, -949725, -2891050, -14379551, 11221676, 4344360, -2590939, 4063576, 3613678, 6192269, 471910, -15915538, 8796630, 139050, -913217, 600759, -4227322, 1683627, -2042257, -328028, 688805, -5432060, -2944200, -21919902, 3489124, 14962592, --10640781, 5141076, -17397302, 9546102, 4666482, -2915746, -4731980, -2079838, -1606855, 1752884, --3728032, 19725174, -2285460, -114974128, -216266096, -86909736, -146375712, -168225808, 104614128, 36575404, -96118680, 289042720, 189186864, 152665680, 228787008, 114221432, 7376607, 90491736, 22529788, -91556352, --64340756, -72960760, -167657808, -136184288, -58856620, -121946472, -134399728, -55560772, -82726976, -138758576, --71731856, 10737418, -87282864, -79863840, 17602386, -17298518, -79598096, 89179624, 58194124, -66844188, -66133908, 100366944, 15184857, 57383448, 201639056, 95770792, 60429116, 237221248, 166195904, 96238944, -233818560, 313495040, 194053072, 281115264, 364082240, 260193952, 172519168, 227442672, 119684632, -115854592, --76347336, -153031296, -356576768, -357509312, -362166144, -546620480, -539802752, -542292224, -564992768, -533350656, --518883040, -408425088, -326990368, -247233344, -101946416, 29992294, 79237312, 201849504, 350595488, 297107584, -398215424, 566326848, 475965600, 444584416, 541227072, 401013568, 205641968, 222919536, 209086528, 78510392, -55818468, 112277424, 41457708, -9803263, 37524056, 13407277, -78087336, -69707856, -42112692, -139520400, --160383200, -69931728, -122039888, -167891344, -69459288, -44569412, -91621856, -1279900, 29465624, -30203284, --4640176, -22274774, -128250408, -184597696, -207071648, -258466832, -304471840, -273139520, -249846832, -232501072, --174679008, -111100600, -79272752, -14313515, 61551176, 95938832, 138836432, 228888464, 278005728, 324459552, -347487552, 329436352, 293428960, 224679408, 153418912, 85848344, 11886322, -14376866, -24871082, -40209484, --45617920, -46239080, -53912040, -56945896, -51776368, -46379740, -51896628, -55413132, -53262428, -55683176, --61290792, -58942520, -56664576, -44727252, -30185030, -23958938, -15392089, 850404, 6777996, 14328011, -30232274, 39797704, 41323492, 40657772, 31958314, 21353504, 12538083, -404801, -11883638, -17962090, --29010356, -37242200, -40296456, -47302624, -49655192, -45314052, -42583528, -39825620, -33300492, -29113972, --23296976, -16974784, -12474733, -6114960, -579821, 6496675, 10862509, 15374372, 20226612, 25370908, -28627568, 33884608, 39545376, 43643848, 45848776, 47496968, 48521320, 47852380, 46573016, 46170900, -41958072, 36586144, 29709900, 21926344, 14084808, 5937793, -3006477, -10468983, -18383534, -24939802, --31581968, -37468220, -43444132, -45805828, -47371340, -46968688, -43336756, -39413840, -34636764, -27095874, --19742890, -12797392, -4628364, 2423435, 7080254, 11267310, 14266271, 14582488, 13673028, 12974022, -11217918, 8858907, 7205345, 6215892, 4965519, 4001836, 3454764, 3042448, 2530273, 2335389, -2358474, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +2424509, 3884798, -1372779, 3452080, -563714, 3643743, 1831804, -803696, -1430224, 3690988, +309775, 734439, -4200478, -674847, -304406, -189515, 5737540, 2802466, -211527, -4308389, +-3133716, -1854352, 523449, -100395, 1241246, 2637110, 801548, 971736, -4348118, -670552, +-4232154, 168577, -2341294, 2768643, 2763812, -1104344, -2284386, 2894808, 618475, -1087701, +-3912715, -532039, -2509872, 701153, 2390149, -3968550, -1938104, -664109, -1553704, 10126996, +2411624, 5845988, 424665, 1917703, -45097, -2927020, -2716030, -3455301, 1631551, -2850785, +2049773, 63888, 2502892, 2560874, 6218039, 1876364, -516470, -315143, -3694209, 6023155, +5541045, 969589, 1708323, 1569811, 1714766, -350577, -3092377, 921271, 1788317, -1161252, +517544, -951335, -2825552, 1345399, -2356863, -1600412, -733903, 188442, -1054415, -1144072, +-1342714, -28991, -73551, -210990, 272194, -471373, 900333, -500364, -839129, -81068, +1129576, 425202, -461172, -1515587, -445603, 1403917, 96100, 634045, 557272, 394600, +14017700, -3288871, -2905546, -1114544, -2749316, 664109, -6631430, 540629, 1347546, 359704, +4544613, 539018, -911070, -3974455, 2581812, -5611375, -4832912, 1774358, -2344515, -1111860, +-816044, 959925, 3820374, 5216238, 415001, -785442, 6200322, 2247342, -334471, 245350, +-2499671, 98247, 6804302, 23085, -3125663, -2528125, -706522, 2320356, -3111704, -3847217, +-3923990, -3212099, 3120294, -3020436, 1183800, -3674345, 1327145, 4492536, 319438, 3198140, +-1323924, -2502355, -1220308, 2224793, -106300, 3432216, 5019206, 751082, -1481764, -2562485, +-100932, -362388, 257698, 178241, -4371203, -445603, -2027225, -2219424, 2162516, 471373, +1398549, 1639604, -5205501, -2899640, 2201171, -960462, 3900904, 722628, 3291556, -646929, +-799401, -881005, -1864016, -424665, -2055679, -819802, 92879, 3071975, -702764, -48318, +-494458, 987306, 7516, 1197222, 270046, -236760, -734439, 968515, -1462436, 27917, +114890, -830539, 739808, 919123, -1227824, 445603, -586263, 566936, 568546, 18254, +938987, 118648, -426812, -9847823, -4792647, -2021319, -6691022, -2237678, -6417755, 2050847, +-450435, -3951370, -4575751, -576063, -3715684, 30065, 3315715, -117575, -5717139, -2046015, +209917, -2163053, -1769527, 1811939, 5627481, 7175280, -1013075, -1762547, 4086125, 4626217, +-1280437, -923955, -773631, -3060701, 1093069, 1589675, -2742874, -2026688, -543313, 2841658, +6146098, 514859, -1904818, 124017, -2912525, -998580, -4703526, -2151242, -2018098, -7514582, +-687732, -3345243, -2281702, -8261907, 5327907, -3528853, -3111704, 1611150, -397284, -483721, +1222455, -6844568, -1684701, -2376191, -426812, -3901441, -424128, -1774358, 1971927, 2538326, +-2141578, -1090385, -3202972, 1300301, -370978, -560493, 137439, -5036923, 5906, -4540854, +843961, -195958, -1339493, 1495722, 5796059, 2821257, -1203128, 428423, -860604, -2083059, +349503, 998580, -976568, -37581, -1240709, 158377, -433255, -1586454, 820339, 780610, +-1666984, -720481, 622770, -634045, 379568, -1052267, -781684, -832150, -1547799, -1699733, +-5906, 586800, -795106, -977642, 133681, -397284, -96637, -471373, 123480, -214212, +-478352, -1381369, 942208, -407485, -588411, -607738, -1139777, -77309, 269509, -932545, +177167, 193274, 183610, -735513, 344134, -18544596, -1514513, -9170292, 8131447, -4803384, +14680735, -9485435, 9237401, -8414915, -549756, -184684, -6484864, 4947803, 139586, -2461553, +1466195, -2163590, -884763, -6336688, -97711, -4798016, 3711389, 1244467, 4553202, -2758443, +6811818, 6093485, -6014028, 1614371, -5116917, 5343476, 20938, -3854196, 289373, -605054, +-221728, 3899294, 558346, -5979132, 2413772, 4174171, -302258, 4941360, -2353642, 4013647, +-6140730, -3194919, 3999688, -3602404, 1001264, 5320928, -4931160, 7900056, 3146064, -7970923, +1906966, -7683697, 2724083, 4146791, 2856153, 3987877, 5861020, 1887638, -725313, -566936, +386547, 1762547, 4216048, -1553704, 7968238, 1446867, 5462125, 2864743, 1590749, 289910, +5484137, 885300, 1367947, -3243237, -4263829, 2075006, 2967823, 215822, 4723391, -665183, +-22012, -979789, 5609228, 1580548, -1979443, 1156957, 975494, 693100, 1928977, 178241, +3505230, -661425, 1225676, 540629, 1359894, -1000191, 694711, 207769, 111132, 186294, +-1151051, -1193464, 477815, -1442035, -545998, -1554778, 951335, -151934, -424665, -594316, +12274480, 128849, -3262565, -1054951, -4492536, -5379984, 8981850, -1672890, -1234803, 8243116, +-569620, -1523640, 3685082, 6426345, 1883343, 3220152, -96637, -6895570, -1775432, 5281199, +-7856569, -7792145, -2874944, 1774895, -5519570, -3302830, 179315, -728534, 5558225, -2062658, +-1135482, 5842766, 8121247, -6924561, 1893544, -1610613, 3007551, 855772, -3026878, -622233, +3419331, 5186710, -1308354, -7195681, -1560147, -588411, -1841467, -3566434, 597537, -410706, +1392643, -949725, 1080184, 6820408, -4935455, 695785, -3741454, -3045669, -5169530, -1535451, +-2955474, -7203197, -185220, 540629, -2746632, -513249, -2911451, 2838437, 3598109, -513249, +1124745, -2570538, -648003, 8790724, -1081258, -3591667, -11805254, -5374615, -79457, -4025458, +2819646, -1118839, 1100049, 18254, -2310693, -420370, 3538516, -2894271, 758062, -796716, +415001, 33286, -2409477, -1817845, -968515, -1897302, -304406, -3019362, -554051, -1704565, +417149, -1184874, -312459, -1622961, -1684701, -1722282, -363998, -172872, 705448, 457951, +-155156, 504122, 488016, -87510, 1782411, 1477469, 62277, 875636, -615254, -922344, +295816, 15694884, 17655000, 3248606, -6606734, 3915400, 6881075, 6898255, 3838090, 5176510, +2248952, 8563091, -1011465, -1203665, -3676492, 5323075, -3328600, -7798587, -10681047, 1077500, +-5186710, -4494684, 3610994, -1247151, -2929705, 8748848, -758062, 10902238, -2147, -4498442, +-3101503, 3738232, 2455648, -2309619, -8855149, 12470438, 7173669, -61203, 6720550, 3947075, +4332012, -4267050, 4906464, 2427194, 900333, -1655710, -2357400, -5691369, -7948911, 2086280, +3693135, -6242735, 2351495, 5149666, 7774428, 1955821, 7014756, 3174518, 5963025, -9035001, +2551211, 694174, 1695438, 99321, -701690, 3658239, 3346853, 3217468, 4769025, -1728724, +2272038, 1272384, 6902013, 8436926, -4413616, -5194226, 683974, -2190970, -4631049, 1785096, +4658966, -3049964, 1929514, -8684961, -6365679, 1327145, -4415764, -2165737, -1476932, -4014184, +-57982, -176094, 424128, -216896, 1632625, 1893007, -201327, 895501, 286152, 1402307, +1559073, -102542, 60130, -227633, 1713155, 773094, 921807, 2066416, -434865, -1242856, +1597191, -599685, -57445, 2390149, 1502165, 2255395, 3210488, 381715, 1415729, 751082, +2114198, 447213, 871342, 1056025, 14501420, 4559108, 6386080, -5355824, 2076080, -13198971, +679142, -9546639, 7175280, 4807679, -4032438, 6024229, 3421478, -6478958, -1621350, 9271761, +-325881, 6371584, -1776506, 1248762, 7407745, -9276592, -729608, 1472100, 2698313, 577136, +2971581, 347892, 8993125, -4217121, -2601677, -2763812, 6798933, 822486, -3209951, 4092030, +11475616, -8063801, 1410897, 1501091, -704912, 4590783, -2328946, 8727910, 2944200, 2174327, +-7198902, -760209, -1911261, 4021163, 3056406, 4346507, -4944044, -3274376, 4178466, -8665633, +-4827543, 1906966, 9266929, 5568962, 8195872, -8986682, -2829847, -9132711, -2352568, 2705293, +-774168, -8621073, 1125818, -5303211, -73551, -9430674, -11364483, -4693863, -8202314, 417686, +2903398, 1581085, -3506304, 4481262, 7289097, 1990717, 2154463, 4136591, -1313186, -7041062, +-421444, -4861366, 2519535, 744103, -466004, 1245541, 658204, -5175436, -2611340, -1512902, +2573759, 313533, -1789391, -673236, -149787, -806917, 430570, -1101122, -468688, 301185, +2346126, 534187, 767189, 469225, -447750, 630286, 1570884, 745714, 2041720, 547071, +1061931, 59593, 1619740, -2568391, 1601486, -16980690, -15298137, -10963441, 3534221, 3577708, +12969727, -5523865, 12324409, -4834523, -19958176, -1649268, -1729798, -7636989, -12865038, -4610111, +-147103, -7878581, 67646, -12196097, 1037772, -12865038, 7580618, -3137474, 5558762, -2415919, +-97711, -3907347, -4560719, 8163122, 1706176, -2207076, 9239012, 1151051, 1595580, 3258270, +8511551, 7492571, 5742372, 270046, -9795747, -908386, 4893579, 1571958, 6207839, -2791192, +2835215, -14446659, 4730907, 8910447, -10912438, 6616934, 2392834, 10516227, 8072928, 93952, +-2626909, -145492, 7174206, 3587908, -9183714, -7460358, -12744779, -6121939, -8519068, -1855963, +-10568304, -2175938, -3473555, 10980084, -4970888, 5475010, -2716030, -1495186, -3442953, -7428683, +-3919695, -2323577, -2403571, 6946036, -20488604, -4296041, 9729712, 533113, 1946694, 5245229, +9850507, -6030671, 1262184, 2678449, -358093, -5906, -1333587, 2756295, 4129074, -1677722, +421981, -308701, 4601521, -1586990, -42413, 4624606, 1020592, 1683090, 2192581, 2216203, +-656056, 465467, -1124208, -1679869, -909459, -3041911, 994822, 2134062, 1507534, 906238, +-3976066, 100932, -448287, -105764, -1814087, 1216013, 1914482, -897648, -103616, 2240899, +2383707, -2399276, -22849226, 17104708, -5131412, 10014790, 5719823, -657667, -15202037, 11541114, +1351841, -1276142, 7186554, 5036923, -6433324, -345745, 12429098, 3969624, -5995775, 8764955, +-5196911, -4205310, -2989834, 2649458, -212064, -1885491, 946503, 3622268, 3175592, 3311957, +-9624485, 5534602, -8046085, 10324028, -6856379, 10274636, 3094524, 763967, -10604811, -10719701, +-3769371, -3731253, 11936788, 3220152, 9484898, 3865471, -9044664, 95563, -2296197, 3957812, +-69793, 3456912, -1404991, -6119792, -3759170, 5972689, 15185931, 10941966, 934155, 3604551, +-1451699, -2411087, 7624104, 6436546, -3185792, 9583683, 13516799, 19131394, 73551, -11337640, +-13718662, 4430259, 2080912, -793495, 3017215, -163746, -4634807, -728534, 11352135, -2360085, +-5465883, 20614770, 4911295, -3751654, 5775658, -80531, -571768, -878858, -3659312, -688269, +5983963, 2927557, -2389613, -3267396, 4089346, 3386045, -648540, 8252243, 2093797, 1386738, +566936, 3592203, 1110786, 3353833, 2105071, 1042066, 362388, 4281546, 2140504, 2190970, +317291, 4250944, -910533, 1548873, 2312303, 1652489, -687732, 4775467, 5354751, 1571421, +-1238561, 5749888, 150324, -2905546, -778463, 4161287, -64425, -512712, -1205812, -927713, +-68183, 986769, 2520072, 3858491, 1116155, 4081830, -1226750, 10491531, -15344308, 12918188, +5310190, -10470057, 24532316, 3701188, -12527346, 2918967, 6830609, 674310, 4932770, 17629768, +-16842714, 11017665, -6813429, 9778567, -3718905, 2114735, -15603079, 2688650, -1697049, 6310381, +-5983963, 915365, 1193464, 208843, -9162776, 8836358, 920734, -901943, 4136591, -1701344, +4074850, -2125472, 12383464, 9833328, 12257300, 12259984, -1979443, 4324495, 5280663, 605054, +-6416145, 8694624, -10237055, 3227668, 10139881, -5963562, 5369783, -11263552, 3616363, -914291, +-2703145, -903554, 863825, 3580929, 3367254, 12021613, -7838852, -300111, 7898982, 17098802, +-15089294, 3951370, -3711926, 5259188, -2779918, 24939264, -15302968, 5549098, -8530879, -4635344, +2214056, 2694555, 1369558, -21635898, -11462731, 18054432, 9836549, -1874753, -9714679, -11136850, +-4458176, 4116189, -12090333, -6493454, 5947993, 3435974, -247497, -237297, -8461622, 1691143, +-2462090, -3078418, 3872987, -1968169, -2609730, -882616, -7402376, 2625299, -1917166, -2399813, +-2691871, 3483219, -3570192, 4220342, -642098, -942745, 1408749, 1564979, 5316096, -5365488, +-1165010, -4057134, -886911, 2765422, 2018098, 7079717, -2282238, 3951370, 865973, -2452426, +-1670205, -593242, 2639258, -318364, 1353452, 11513734, -15075872, -3175055, 21392158, -6382859, +-398358, 11476153, 2716567, 7094212, -15914464, 15327665, 1024350, 1174674, -4019553, -9559523, +-1293322, -1452236, -10246181, -6166500, 11418707, -3588982, 2214056, -5559835, -25022480, 8514236, +1164473, -7704098, 4809290, 9736154, -884226, 1106491, -1934883, 2474438, 6599754, 2127620, +10589242, 7270306, 1677185, 9271761, -7419556, -7295539, -10416369, 3978214, 6055367, 1789928, +-16536698, 4729833, -14127221, 20533164, -4840428, 7319698, 17508434, -6859063, 11131481, 2807835, +12117176, 4905927, -5819681, -17919140, -12868259, -10010495, -1365800, -10509785, -2087891, -9183714, +-5965710, 18089328, 3931506, -7667054, -6817724, 3674345, 6724845, -1538135, 2636573, -32801738, +13232794, 2267206, -10516227, -12916040, -3360812, -21655226, 2357400, 10807748, 1207423, -9289477, +5772973, 4880157, -7641821, 3860639, 2295123, -1883880, 270046, -4878009, 1305133, 1729798, +1284732, -6366216, -3484829, 2651069, -3991098, 947577, -2405719, -1521492, 1553168, 5410585, +-6819335, 2404108, 5322002, -6338835, -5980742, 812286, -5488968, 1286880, -3642669, 3815542, +2061584, -6351720, 3578782, -4166118, -2705830, 4415764, 1023813, 9913321, 3068217, 0, +-617938, 790274, -2592550, 1111323, 7341710, -20116016, -24706800, 15188615, -12053289, -14048301, +-3903589, 9599252, 19579682, -12613245, 1194538, 9419400, -2631204, -3854733, 5148592, 3424700, +14751065, 5062693, -13900125, -357019, -6981470, -306016, -8204462, -10823318, 1833951, 11188927, +-668941, 5091684, -8993662, 2860448, 11023034, 8620536, 1413044, 1043140, 6937446, 6638946, +4247186, 10143639, -12470438, 13997298, 10069014, 3584150, -10287520, 949188, 8156143, -8053064, +9453760, -6356552, 10690174, -2634963, 13917842, -21495774, 23134842, 5577015, 21822728, 1581085, +-4474282, -1335735, 7956427, 694711, -18003430, 888521, -1171452, -18621904, 6053757, 13536126, +-17729088, 15042586, -15595563, 5069672, 6169184, 3433826, -19545860, -9313100, -9543417, 2066953, +1565516, -11308649, -16727287, 3458523, -14701136, 10265509, -7046968, -3711926, 5186710, -9070971, +-7026030, -9311489, -3801583, -5120138, 391379, -7415798, -5551245, -6752763, -10128070, -4824322, +-2040110, -2158758, -2490007, -2831994, -1888712, -4722317, -5236639, 3684008, -6287296, -3327526, +-1540283, 5083094, -2309619, 308164, -8058433, -5735392, -2563559, -6442, -1756642, -6824166, +-868120, -451508, 5763309, 3794067, -4490925, -4159139, 1025960, -2152852, 4279398, -2193118, +2341294, -4165045, -11730629, 17230336, 3302293, 11268384, 10906533, 2914135, -8813273, 1686848, +29219736, -20458002, 4645544, -3767760, -11288248, 454193, 3722663, 4550518, -374199, -127238, +-6037651, -8702677, -13476534, -6886443, 9761387, -8581882, -13543106, 7458748, -5010616, 2746095, +-2005750, 5758478, -5910412, 12345347, -4769025, 1175747, -535260, 1146756, 11291469, 3752728, +-5614596, 5982890, -5161477, 9289477, -5948530, 3712462, -13798656, -10060424, -7514582, 2202781, +-7029251, -11969537, 4706748, 8596914, 2299955, -6436009, 3774740, 6031745, 6757058, 18777060, +25844966, 35340600, -3868155, 5514201, 8320426, 4876399, 4545149, 5566815, -7496329, 13946833, +-2220498, 18252000, 22455162, 16514149, 6524056, 9242770, 2916283, 31610960, 8914741, -5930276, +-5237713, -4628364, -2021856, -2156611, 1490891, -2644626, -6119255, 5199595, -9576166, 2687576, +-2301029, 2844879, -4840965, -3832185, -3090229, 7100655, -7161858, -6832219, -650151, 2878165, +-3679176, -8738648, -3023120, 416612, -4257387, 4541928, 8629663, -5071820, -693637, 1793149, +-999117, 2881386, 4971962, -2433099, -6154688, -1052267, 2837900, -2996277, 7844221, 9419937, +5693516, -2740189, -6476811, -860067, 9185324, 1046898, -323733, 4132832, 1240172, -82678, +-1610613, 2318209, 2300492, -6255083, -4630512, -241055, 35455492, 28388660, -12352863, -5672578, +-14739791, 8517457, 4153770, 17372606, -3047816, -7504382, -3395172, -11234561, 2539936, 446677, +16374563, -6114960, 6105296, -22020834, 12141336, -1710471, 8543764, -88047, 7740605, 1342177, +-12548284, -6451578, -10766946, -8147553, 9057012, 21876416, 9510131, -2571075, -6785512, -266825, +-1848447, 5480915, 7370701, -13940390, -290447, -4837207, -4691178, -15137075, -11734388, -24551644, +434329, -1195612, 8842801, -7329899, 15741592, -11931419, -5294621, 31596464, 31222264, -21561272, +4802311, 18169322, -10541460, -4967667, 9293235, -3430068, -13236015, 35148400, -8766565, -53255984, +17708150, -626528, -27515172, 21088826, 22414898, -7898982, 15682536, 20043002, -9477382, 770410, +12634183, -13660680, 5711233, 11083700, -19694572, -2632278, -6520834, 1145146, -7233799, 186294, +2716567, -8232379, 6660421, -9555765, -4478041, 4774930, 9459129, -5393405, 502511, 1995012, +-1469416, 3319473, -6981470, 10304700, -5231807, 10880226, 10408316, -156229, 500364, 7187091, +-5226975, 1637456, -318364, 8984535, -6690486, 5490042, 1602023, -20691542, 3984656, -2483028, +-3946538, 1242319, -622770, 2345052, -11778948, 1726040, -3093987, -10243497, 1744831, 17923436, +-16766479, 5638219, 9733470, -14149770, -95563, 8048232, -12870406, -6191196, 2864743, 6593312, +12154221, 6095633, -9163313, -1409823, 9085466, -9659918, 10390600, -4643934, -12461311, 11875585, +6309307, 6077379, -2858838, -2900714, -4193499, -308164, 10049150, -19741280, 10311680, -109522, +17074106, -10251013, 375273, -12822088, 6056978, -21061982, 2700998, 1257352, -8160975, -6135898, +3765613, -14083735, -24519968, 15364709, -1059783, 4831838, -14367739, 9316321, -2048163, 9988483, +10711648, 5454609, -10037875, 8875013, -4643397, -1970853, -18882286, 3068754, -13345000, -14695231, +-21556978, -8682813, 3832722, 6368900, -22262426, -10866267, 1545115, -7791071, -30010010, -23762444, +-24406152, -4833449, -14460618, 13396540, 18781892, 5352066, -17960480, -20917028, -24405078, -2027225, +-1508607, 13776644, -11615202, -20336670, -9815611, -13452911, 4990752, 529892, 5200132, 2735357, +-6490770, 1735167, 5345087, -5065914, -1944010, -4253092, -2542084, -3003256, -6300180, -48318, +8460549, 535260, 2677375, 2638721, -1127966, 6389838, -3700651, 9739375, 8797704, -3111167, +-7358353, -132070, -2650532, -4026532, -4523675, -4022774, 7128035, 543313, 6730751, -6483253, +-7013682, -1097364, 3838090, -11450920, 2294586, 1404454, -8270497, 2100776, -6757058, -15043123, +9698036, -3424700, 1457068, -2318209, 1889786, -7595650, -1746441, -562641, -15952045, 26459682, +29443612, -7537668, 19724100, -6065031, -8259222, -8170639, 19186692, -17398376, -4297115, -8447127, +30651034, 863288, 10969346, 3778498, -3288334, 15191836, 8287140, 12393128, 3616363, -2243047, +-5811628, 11861089, -2401961, -12146168, 14458471, -651761, 12611098, -14770929, 9744207, 3366181, +-15173046, -11635066, 26584236, 17296908, -2053531, 9458055, 7684234, -17364016, -11651709, 5470715, +3913789, 11796128, 1090385, 2439542, 4276714, 14450417, 5616744, 3574487, -15002858, 40170292, +26671746, 2940979, -18571976, 8862128, -6534793, 4866735, -4586488, 8490613, -6376953, 1217086, +21821656, -15564961, -7889318, -20866024, 5340792, -5772973, -4097936, 18827526, 5506148, 2283849, +1167694, -7937637, -15934866, 11069741, -500901, 107374, 11530377, 11814918, -1447404, -8884140, +-10681584, 19498078, -2553895, -1254131, -4330938, 14638859, -1712618, -10411001, 6225555, 5375689, +8698919, 4105989, 2718714, 13532905, -3336116, -5076115, 4200478, -437013, -6979, 1104344, +5692443, -3611531, -605590, -4576288, 898722, 6473053, -3637301, 1471563, 7633768, -2986076, +1160715, 5903970, -195421, -1699196, -13317620, 8182987, -7734163, 5344013, -9123047, -1921461, +2780455, -5411659, -2782602, 12038256, 8127152, 987843, -2551211, 11258183, 1565516, 5359046, +4317516, 2508261, -2739652, 4835597, 1855963, 4788352, -9891847, -21233782, 54554676, -61572116, +-7256884, -32489816, 39528732, 10519986, 6854768, -15600395, 3576097, -12764643, 35408248, -6440304, +-2413235, 3483219, -1889249, -14062260, 5191005, 7916162, 10631655, -24158654, -12713103, -12523051, +4813585, -7431904, -6567005, -939524, -325881, 15575699, -8223789, 608812, 11800960, -1656247, +-15920370, 1815697, 12432320, -1676648, -25035902, 18469970, 2160906, 159988, -115964, -10717017, +8154533, -46359876, -32307280, -4689031, -11610907, 1905892, 3469260, -21818434, 33940444, -13663365, +46781856, -6808597, -16451872, 15842524, 2633352, 14117021, 21643950, 6678674, -22320946, -6376416, +25003152, 57920320, 1897302, -15064061, 24194624, 1894618, 28544352, 4420595, 38654704, -10185515, +-1569811, -1246614, 9017284, 1131187, 14847702, 26977764, 1602023, -5954436, -4858145, 8452496, +-7386807, -3381213, 17738752, 12758737, 1947231, -3525095, -6693170, -7726110, -4597763, -6324876, +12793634, -8129300, -5509370, 6118718, 2282238, -2649458, 5733245, 6300180, -3621194, 5371394, +9092983, -4925791, 605054, -13100187, 16269336, -304943, 13086228, 642098, -13634374, -142808, +1420560, 3353296, 1465658, -237834, -11712376, -11093364, -649077, -6555731, 8652748, 2924873, +-3998078, -645319, 6810208, 1146219, -3921842, 137976, 4938676, -195958, -2368675, -751082, +2681670, 80351856, 25131464, 9139690, -2240362, -8318815, -11217918, 26422102, 24250996, -27343910, +16669842, 12723841, 3097208, -8061117, -14415521, -37394668, -13876502, 12329240, 4161287, -11836930, +22991496, -7109782, 9448391, 9389872, -5262409, -5049271, 23982024, 903017, -8805220, 15106474, +-12701829, 29418916, -14054744, -8403104, -1357747, 11639361, 6260989, 29748554, -8840116, -17360794, +-6041945, 8062191, 2249489, 16061567, 4561256, 1652489, -6198712, 12992276, 55558624, 23785528, +-20343112, 18014704, -10565620, -16540993, 13873281, -355409, 4202089, -863825, 10056129, -14417668, +-22081500, -58877024, -15343234, 21326660, -7594576, -20062866, 9087077, -4504347, 9051644, -23460722, +-20538534, -9565966, 9123584, 9635759, 28421410, 5172751, -1772211, -21871048, -31028454, -3684545, +-13834090, 2924336, 11478837, -14694157, -15095736, -3098282, -18832894, -31596464, -10357851, -8251706, +-16782584, -3768297, 9658845, -8676371, -4465156, -10004589, -2159295, -22454090, -14210973, -14228690, +631360, 2297271, 8414378, -12471511, 7355132, -16887812, 940061, -9861782, -1078037, 5493800, +-5050345, 8233989, -22235582, -4257387, 7881265, 3402151, 7264401, -2654827, -5902896, 11204496, +-1951526, -2088965, 7911867, -11027865, -8689793, -1452773, 2347200, -14694157, -6856379, -7910793, +-4308389, -1058710, 34897, 1480690, -6493991, 891206, -1840394, -12930536, 17361868, -14618458, +48495548, 40635224, 18845780, -11605539, -17566954, 28929826, 24776592, -33342904, -7031399, -20583094, +27977954, -5190468, -40513352, -17898740, 13996225, 24742232, -46773804, 18258442, -32475322, 11531987, +-19296752, -5299453, 22060026, -7915625, 3113315, 13899051, 29504278, -19881940, -32994476, 6941741, +-2855080, 3177739, 30263414, 7309498, 22519050, -29265908, -5601174, 8879845, -26033944, 41718628, +-5176510, 24842628, -3781719, -6306086, 20442970, 20300700, -12151536, 45982456, -11106785, -20576652, +22134650, 39451960, 2026151, 6824166, 1702418, 17178796, -18972482, 13701483, 60260000, 27423366, +-2105608, 26020522, 32339494, -24509768, -74196632, 5208722, 44423920, 50040664, 13606993, -5257040, +-21989696, 25791278, 55530704, 25616796, 13409425, -54976656, 10133975, -31309238, -19425600, -48513804, +40754944, 8527121, -14257681, -19523848, 14241575, -14211510, 7653632, 5124433, 7129109, -18200460, +-3920768, -2573759, 9410273, -6497749, 7945153, 6688338, -8231842, -5599027, 11092290, 150861, +11921219, -5437966, 4380330, -8204462, 4187056, 22347788, 4204773, 3937411, -2941516, -24680492, +-12390981, -15350213, 8000451, 40784472, 38674568, 34717832, -2775086, -25749402, -24136106, -11750494, +16237124, 17886928, -1370632, -8728447, -13050795, -19236622, 5005785, 10362145, 8833137, 8056285, +6501507, -91805, 662499, -3671660, 3773129, -5313949, 3642132, -1408212, -781147, -191126, +4734665, 1115081, 2039573, 311922, 2244121, -4032438, 440234, -1891933, -607738, 34152508, +-67017596, 51501488, 10842645, -30612380, 617402, 28893318, -18913426, 1014149, 16102906, -19805704, +1886028, -17777406, -11236708, 19202262, -16137266, -9074192, -34091304, 15038291, 33469606, 9564355, +-14811195, -25224342, -3901441, 19298898, 10493679, -21518324, -421981, 26353920, -3310883, 1974611, +-8774618, -6212670, 61610768, -29314226, -7388418, -6670621, 10465762, 28731184, -30217780, -16860430, +40571336, -4608500, -2472828, -48237852, -39896488, 16906602, 27313308, 15017353, -49457624, 34127272, +-805306, -7444789, 7201050, -35306780, -9728101, -4467303, -17476758, 32009318, -24808804, -13706851, +-26686242, -15346455, -35217660, 10759430, -55111408, -15364172, 6534256, -27370216, 6847789, 15384573, +6765647, -300111, -9842991, -19753628, 29250874, -6251862, -2777770, -10419591, 17719962, 35504348, +5350993, -47785808, 4251481, -21246130, 3215857, 4501663, -8717173, 3408594, -14322105, -4777614, +-1206886, -10799158, 204548, -3052648, 8409546, 7552700, -2631741, 3830037, 15648713, -7024419, +-5649493, 16062641, -11660299, 10677826, -5677410, -5355824, 1145146, -6770479, -3335579, 9790378, +-19051938, 5764383, 4418985, 7085086, 13549011, -9540733, 1569274, 10203769, 3635690, -3437585, +-9048422, -1753957, -2246268, 266288, -9287867, 2789045, -1697049, -3736085, 2181844, 1238024, +-4356171, 9782862, -4249870, -2964601, 155156, 2586107, -443992, -38739532, 23372138, -799401, +30278982, -6342056, 31326954, 3840775, -4070019, 13940390, 36368708, 17342004, 9286256, 7170985, +4609037, 14215268, -18373870, -1606318, -13785234, -14563697, 22369800, 13811541, 8544837, -6579890, +-5655398, -2793876, 23409182, 3445101, -10389526, -17089138, -786516, -4159676, 17611514, 2523293, +14730664, 27520002, -7718593, -70289824, 4604205, 56820808, 5946382, -41978472, -5412733, 15924128, +12646531, 22207128, 20358144, -1849520, -13223131, -13747653, 17822504, -11030550, 1996623, 6038724, +-72815800, -12827457, -13999446, 11356430, 57235272, -1258962, 4600447, -13498545, 3893925, 11582453, +24015310, 12315819, -14185740, -7693897, -35348656, -2377265, 24312736, -10962367, -5039608, 8708583, +24701430, 19765440, -5314485, -25381646, 166430, 8919573, 2815351, -16957604, 2083059, 1763621, +-1242856, -14683956, -18665390, 15960635, 13358959, -949725, -2891050, -14379551, 11221676, 4344360, +2590939, 4063576, 3613678, 6192269, 471910, -15915538, 8796630, 139050, -913217, 600759, +4227322, 1683627, -2042257, -328028, 688805, -5432060, -2944200, -21919902, 3489124, 14962592, +-10640781, 5141076, -17397302, 9546102, 4666482, -2915746, -4731980, -2079838, -1606855, 1752884, +-3728032, 19725174, -2285460, -114974128, -216266096, -86909736, -146375712, -168225808, 104614128, 36575404, +96118680, 289042720, 189186864, 152665680, 228787008, 114221432, 7376607, 90491736, 22529788, -91556352, +-64340756, -72960760, -167657808, -136184288, -58856620, -121946472, -134399728, -55560772, -82726976, -138758576, +-71731856, 10737418, -87282864, -79863840, 17602386, -17298518, -79598096, 89179624, 58194124, -66844188, +66133908, 100366944, 15184857, 57383448, 201639056, 95770792, 60429116, 237221248, 166195904, 96238944, +233818560, 313495040, 194053072, 281115264, 364082240, 260193952, 172519168, 227442672, 119684632, -115854592, +-76347336, -153031296, -356576768, -357509312, -362166144, -546620480, -539802752, -542292224, -564992768, -533350656, +-518883040, -408425088, -326990368, -247233344, -101946416, 29992294, 79237312, 201849504, 350595488, 297107584, +398215424, 566326848, 475965600, 444584416, 541227072, 401013568, 205641968, 222919536, 209086528, 78510392, +55818468, 112277424, 41457708, -9803263, 37524056, 13407277, -78087336, -69707856, -42112692, -139520400, +-160383200, -69931728, -122039888, -167891344, -69459288, -44569412, -91621856, -1279900, 29465624, -30203284, +-4640176, -22274774, -128250408, -184597696, -207071648, -258466832, -304471840, -273139520, -249846832, -232501072, +-174679008, -111100600, -79272752, -14313515, 61551176, 95938832, 138836432, 228888464, 278005728, 324459552, +347487552, 329436352, 293428960, 224679408, 153418912, 85848344, 11886322, -14376866, -24871082, -40209484, +-45617920, -46239080, -53912040, -56945896, -51776368, -46379740, -51896628, -55413132, -53262428, -55683176, +-61290792, -58942520, -56664576, -44727252, -30185030, -23958938, -15392089, 850404, 6777996, 14328011, +30232274, 39797704, 41323492, 40657772, 31958314, 21353504, 12538083, -404801, -11883638, -17962090, +-29010356, -37242200, -40296456, -47302624, -49655192, -45314052, -42583528, -39825620, -33300492, -29113972, +-23296976, -16974784, -12474733, -6114960, -579821, 6496675, 10862509, 15374372, 20226612, 25370908, +28627568, 33884608, 39545376, 43643848, 45848776, 47496968, 48521320, 47852380, 46573016, 46170900, +41958072, 36586144, 29709900, 21926344, 14084808, 5937793, -3006477, -10468983, -18383534, -24939802, +-31581968, -37468220, -43444132, -45805828, -47371340, -46968688, -43336756, -39413840, -34636764, -27095874, +-19742890, -12797392, -4628364, 2423435, 7080254, 11267310, 14266271, 14582488, 13673028, 12974022, +11217918, 8858907, 7205345, 6215892, 4965519, 4001836, 3454764, 3042448, 2530273, 2335389, +2358474, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -6914898, --610959, 6533719, -5777805, 2272038, -9754408, 127775, -3511136, 3959960, -3275450, 920734, --2211371, -4068408, -1021665, -366683, 3001109, 3742527, -3497714, -6128382, 3254512, 1122060, -2284923, 1380295, 2579128, -3542811, -2644089, 659278, -647466, 3227668, 2342905, -2705830, --554588, 2463701, 4567161, 2809982, 67646, -3541201, 1946157, -593779, -1861868, 2518998, -1116155, -3252901, -2701535, -2203855, 1860795, -3187403, -1687922, 2703682, 1071594, -84826, --3316789, 1245004, -2847027, -7419556, 768799, -2519535, -4759361, 2211908, -1329292, -1360968, --1609002, 111669, 3689377, 2209761, 1267552, 1673964, 2794413, -5589900, 2951716, -2219961, --2112587, -1231582, 1894618, 361851, 3964792, 5720897, 2269353, 446677, 686658, -81604, -3693135, -1541356, -94489, 1789928, 166967, -1511292, -1511292, 521302, -2147, -1707250, --817118, 537408, -47782, -226023, -639413, -845572, 610422, 366146, 658204, -252329, -258235, -175557, -1540820, -613107, 766652, 1264868, -668404, -842350, 332323, 800475, -14845554, -1257352, 2717641, 3264712, -1525787, 1536525, 5910412, -4616553, -821949, 1688459, --2300492, -454730, 4339528, -1406602, -986232, -303869, 1677722, -832687, 2085744, -1470489, --1451162, -666794, -3379066, -5759015, -1092532, -1848447, -780073, 3389803, -6106907, 7496329, -37044, 129923, 249108, 1415192, -189515, -2881923, 444529, 2310693, 5648419, 282394, --50466, -861678, -1917166, 3761855, 1776506, -1373316, 2065342, -3745748, 629213, 1196685, --2845416, -9739375, -3059627, -242666, -583579, -462783, -868120, -1239635, -717260, -1850594, -2375654, 7178501, 4056060, 315680, -24159, -190589, 2497524, -1466195, -6556268, -224949, --3420405, 2146947, -3879429, 2189360, -9456981, -56908, -1357210, 3209951, 5135171, -786516, --1238024, 775242, -34360, 2769717, 1002875, 465467, 3734474, -2759517, -377420, 478352, -1327682, 8590, 1353989, 78383, 862215, 402116, -194347, 282394, -350040, -37581, -774168, 1194001, 129386, -323733, -478352, 159988, -219580, 678068, 469762, 332323, --235686, 128312, 440771, -13082470, -12614856, -4750771, -1873143, -1804423, 5369, 3184718, -755377, 2586107, -5927055, 2924336, 3684008, 3561602, 4175245, -3238942, 892816, 9836012, --6092411, -218506, -4342212, -6291054, -759136, -449898, 5444945, -2647311, 566399, -4699768, -3003793, 1877975, 2356327, -10531260, 1615982, -1927904, -3700651, -996432, -59593, -7813620, --5066451, -4364224, -359704, 6524592, 2255395, 2159832, 3127273, -2921652, 1837172, -2621541, -5571110, 8584029, -813359, -790811, 2432025, 599685, 2210835, 4823249, -2273112, 4990215, --790811, -154619, 2943663, 4041564, -1540283, -5841156, -5383205, 2074469, -744640, -1003949, --2378338, 2650532, -4484483, 1662152, 3343095, 5665599, -3305514, 5432597, 3536906, 1766305, -2703682, 655519, -931471, -3659849, 2592013, -1722282, -3429532, -4317516, 1778653, -1423245, -2590939, 457414, -1675574, -2014877, -1040993, 858993, -1078574, -379568, -1382980, -605054, --96100, 1328219, 683974, -42413, 756988, 2617783, -266825, 8053, 1514513, -825707, -415538, -575526, -462783, 753767, 1085016, 1108638, 693100, -15032, -359704, 818191, -372588, 1793149, 2129767, -1707786, -193810, 943819, 278099, -972273, 307090, 1227287, -1050120, -556735, 129923, 690953, -624918, -14268418, 6223408, -6368363, 11526082, -10666014, -8441221, 4320737, -4410932, -5521718, -3059627, 2227478, 2010045, -2965138, 6811282, -2401961, --6442988, -1284732, 7043210, 4842039, -7056632, 1171989, -854699, -7388418, -3042984, -4738423, --1083406, -5646809, -1478543, -2332167, -7801271, -2753074, 4010963, 5748814, -1068373, -6672769, --1324997, 4802311, -1429687, 209380, 357556, 151398, -6643778, -153545, -766115, -1648731, --280247, 1224603, -4748623, 2777233, -5086315, -66035, -1611, 152471, 3832185, 125091, --1732482, 1595044, 2667175, 6324876, 2900177, 1473711, -1785096, -3847754, -3636227, -1481227, --3974455, -2833068, 2396055, 4155918, -2990908, -5019206, -3430605, 1652489, 920197, -4705137, --1595044, 637803, -3956739, -1790465, 587874, 1269163, 1657321, -1798518, -2171106, -2987687, -150324, -326418, -1127429, 981937, -962610, -299574, -2275259, -473520, -740345, 2073396, -1038308, -784905, 1032940, -81068, 352187, -949188, 153008, -547608, -11274, -783832, --1502702, 1147830, -69256, -1431298, -882616, -104153, -1306744, -1525250, 1478006, -881005, -17473000, 6942278, -1186485, 3949223, -2825552, 9788767, 4129611, 17643726, 319975, -17097192, -4367445, 10349797, -6174553, 1804423, 7120519, -5494337, 5017596, -4456029, -977642, -5491653, --5233955, -1662152, 1438814, -577136, 2354179, -2359011, 7560216, -4536559, 2128693, 1388348, -4915053, -9037148, -4718022, -3568044, -1078574, -3204583, 840740, 5502927, 3922916, 8744553, --1291711, -657130, -4997732, -1646583, 5513128, -5397164, 4551592, -5049271, -2130304, 8027294, -11590506, 8309151, 1449015, -6126234, 4282620, 3184718, -3269544, 6749541, -4467303, 1328219, -1056025, -12343736, -119185, -11701102, -4720169, 1861868, -3106872, -5586679, -4780836, 972810, -8023536, 2001992, -3295851, -4082903, -3603478, 806380, 1290638, 3841848, -6099928, -5484137, -361851, -1059246, 351650, -1577327, -918049, -980326, -540092, 1822140, 457414, 836445, --806917, -1267015, -1251446, 359704, 3190624, 1069447, 2314451, 742493, -3690988, 2771865, -1230508, 506806, 524523, 1603633, -382789, 1382980, 255551, -31675, -1162326, -843424, --1600412, 470299, 1511829, -292058, -769873, -858457, -5232881, -583042, -656593, 180926, --839129, 10790032, 21914534, -9630390, -7174206, -1986959, -2647311, 7599945, -7382512, -13390097, --4689031, 872415, -3334505, 3768297, 1739462, 6583111, 2712809, -2719788, 9483825, 8898635, --4202626, 591632, -6239514, -1106491, 263604, -3855270, -813359, 6627135, 9516037, 326418, -1500554, 3888556, 2445447, 1485522, 576599, -3688303, -6972880, 737124, -9995463, 301185, -2195802, -3215857, 3811784, -2567854, -5564667, -483721, 5252208, 2305861, -2476586, 16137803, --133144, 5168993, -9725953, -2203318, 6526203, -3153043, -7225209, 4145180, -8452496, -7554311, -1619203, 9132711, -7607461, -4281009, -2311766, 328028, -3495567, -3444564, 12301860, 7195681, --1214939, 637803, -5927055, -4232154, -2466385, 3673808, 4806069, 377420, 3833795, 2488397, --891743, 3597035, -3449396, 12323872, 6915434, 1313723, 299037, 1091459, -2189897, -848793, --2180770, -2245731, -165893, -128312, -2104534, 1021129, -3125126, -957778, 2255932, -892816, -2313914, 1333587, 2182917, 51540, 1474248, 1758789, 1530619, 266825, 2608119, 849867, -272730, -2005750, 91805, -769336, -134218, 93416, 870268, -172336, 782758, -1911797, --187368, 739808, 931471, 1421097, 8759586, -15546708, -2042257, -11663521, -6615860, -10561325, --2643552, -1576790, -1535451, -4028143, 4805532, -14906221, 7755101, -5049808, 4639102, 2051384, -6308233, 401579, 2656974, -5979668, -2489471, 2844342, -5936182, -4309463, 7423851, 2077690, -3402688, 3003256, -678068, 2026688, 11019275, -3874597, 1130650, -4885526, 8878771, -5266704, --19470698, 6101538, 3157875, 8276939, 4531191, 11388106, -7575249, -2988224, 6931004, -2797634, --6462852, -3047279, 3649649, -9453760, 9477919, -282394, 6348499, -7974681, -3429532, -2865280, --8603893, -1722819, -6820408, -3103651, 830539, 10062035, 8159364, -862215, -12183748, -6953015, --2163053, 9773735, 8144332, 5907191, 5520644, -3400004, -14114873, -3590056, -315143, 3375844, --4387846, -1351841, 7375533, -1344325, 8699993, 154082, 6059662, 2324651, 390842, -2150168, --123480, 3285650, 971200, -1465121, 402653, -3884261, -566399, -183610, -5146445, -3105261, --3249680, -1597728, 1147830, -2072322, 962073, -2792803, -256624, -789737, -1423782, 2340757, -1227824, -447750, -3461744, -1349694, 1544041, 2382096, 157840, -3442953, -1724429, 825171, -1913945, 530965, 988379, 299574, -1717450, -20419348, -24676198, -13923747, 10191957, 864362, --4564477, -5191542, -7848516, -789200, 2730526, -13745506, -1265942, 8759586, -5269925, -3739843, -9787694, 2608119, -6359236, 2500745, -6150930, 14484777, -4602595, -3386582, 4733054, -7463043, --4643934, -4358318, 2508798, -5168993, -1886028, 2463164, 1812476, -16908212, 7650948, 7432441, --4811974, 13172128, 5119064, 1297617, 12664785, 7231651, 2325188, 1809255, 13689671, -1311039, --2240899, -871878, 8446053, 4725001, -12250320, 4826470, 3950833, -46171, -6481643, -19859928, -8873939, -1265942, -4809290, -12439299, -6949794, 7712151, -1529545, -3593277, -8211978, -16146930, -1742683, -2199560, -8485782, -3576097, -15196131, -2404645, -3329137, -2852932, -541703, 5531918, -11868605, 5080410, -3814468, -8363912, 3379603, 630286, 5023501, 3126199, -1774895, 3623879, -1430761, -347355, -4431333, 459025, -7290170, -404264, -1503775, 1270774, -2738042, 3542274, -2195802, -780610, -478889, -669478, 636729, -1644973, -299037, 2051921, -663572, -702227, -3968550, -1474784, -846109, 3111704, -2229625, 1892470, -6067178, -4002910, -2141578, -3267933, --192737, -3248069, -4226248, -3230889, -780610, -650151, 1619203, -131533, -2525441, 1571421, -726386, -1401233, -21228950, 16979080, 898185, 8653822, -1613834, -758599, 1542430, 9356586, -870805, -1214939, -12851616, 4510253, -1465658, -9922985, 2521146, -6495601, -5028333, 18306762, -5150203, 5614059, -4023848, 6538014, 7864622, 7636989, -4516695, 6666326, 3405909, -7747048, -4962298, -7532836, -2664490, 4777614, 2202781, -795106, -4239670, -3932043, 12125766, -3562675, --5430986, -3440806, 2417530, 2641942, -5904507, -9847286, -793495, -10563472, -1323924, -9523016, --3671123, -2262374, 1793686, -4852240, -8320963, 10411538, -4383014, -11463805, 7253663, 12240657, --6003828, -3915937, 6114423, 4503273, 12052215, 7854959, 1149978, -106300, -12548821, 3024731, -11872363, 9626632, -8567923, 9180493, 9841381, -6618008, -18600966, -5954436, -16669842, 2811056, -9436043, 4823249, 1069447, -4955319, -6794102, -721555, 791885, 2908767, -1599339, 5457293, --2517925, -1881196, 2043868, 5779952, -8544837, -1091459, -1156957, -2545305, -25233, 2347737, --559956, -229244, -1421097, -128849, -1435593, 512175, -194884, -141734, 719944, 3045132, --2692408, -1454383, 1631014, 1975685, 6231998, -568009, 2554969, 2543695, -2806761, 2306398, -928787, -2319819, 532039, 988379, 657667, 2624762, 5426155, 1236414, -1939178, 3754875, --1239635, -1997160, 226560, -3512210, -1607928, -186831, 106837, 3991635, -33833068, 16094316, -4501663, -1666447, 22688702, -1423245, 11446625, -10254771, -2460480, 1718524, 68183, 12937515, -8200703, -17751100, 10960757, 755914, 6551436, -15996606, -697395, 9122511, -15702937, 19476602, -5222144, -286689, -7061463, 1091459, 8393440, -14097693, 1217086, 3504157, 2403571, -8722542, --3278134, 8102456, 4552129, -957241, 1140314, -5763846, -9802726, 3946001, -16519518, -759672, -23477902, 22917946, -7439420, 2772402, -1090922, 6504191, 16469589, 1314797, 7834021, 2550137, --8779450, -732829, -1746978, -25058450, -11370389, 15381352, 622770, 4687420, -6125697, -1612760, -5404680, 7405598, -776315, 19162534, 181462, 14929306, 1772211, 3084860, 1862405, -9905268, --12442520, 15120432, 3421478, -8009041, 10930692, -9118752, 717260, 9254044, 1410360, -2471217, -4243428, -4090956, -3955128, 4592394, 6301791, 376347, -8703751, -4218195, -9369471, -3389266, -2180233, 2901787, 1382980, -3664681, -1794223, -6743636, 4696547, -159988, -2807298, -1299228, -1906429, 1040993, 5848672, 5265630, 3340948, 3397319, 1057099, 4168266, -2970507, 1878511, -2153389, 2099702, -2612951, 4213900, 2132988, -709207, -904628, -1185948, -1194001, -2026151, --4821101, -1427540, -204548, -1952600, -3566970, 11307038, -24597814, 9886478, 15495705, -2140504, -4605816, 6979859, -3767223, -2374580, 9557376, -3593814, 14504641, -13804025, 7539815, 17954038, --19239306, 791885, -9157944, 11348377, 4768488, 9416179, -9745818, -7582228, -129386, 24267102, -260382, 12288975, -5462662, 765578, -1691143, -2130304, -10786810, -390305, -3045132, 4966593, --4832375, -6953552, -5892695, -415001, -2072859, 10985989, 1853815, -6024229, -5524939, -5542119, --2073932, -2621004, 17847736, 816044, 8945880, 653372, -4332012, -3873524, 14834280, 11137387, --4321274, -13968307, 7872675, 5487895, -30929134, 1840394, 17385490, 17045114, 3920232, 13565654, --18680424, 30586610, 2633352, 5896990, 5994164, 14621142, -1190780, -13001940, -4019016, -15370077, -17507360, -7702487, -5254356, 15382962, -511638, -5963562, -4716948, -11457899, 10863583, -18741090, --2816962, 1880122, -517007, 2748779, -3959423, -8000451, -5199058, 2585034, 2009508, -3738769, -919123, -3560528, -3987877, -2816425, 3394635, 1890859, -4520990, 4238596, 779537, -5337571, -2394981, -904091, -1973001, -4048007, -4763656, 984084, 2218351, 9831180, -4333622, 5863167, -640487, -1845225, -767725, -1049583, -2635499, 1589675, -345208, -2798708, -1041530, -1905355, -711891, 2081449, 1520955, -4003447, 9460739, -18210662, -14552960, 13073880, 11008538, 26833882, --9422621, -7057705, -4738423, 5083631, -11339787, -1340567, 4486630, -770410, 14440217, 9308268, --11501386, 1071058, 3408594, 8351027, -13103945, 13823352, -200253, 6138045, -2298344, -6270653, --13748190, 4888747, -2357400, -5791227, 2801929, -8436390, -8193724, -1825898, 4350265, 16737488, --24860344, -15040975, -13397077, -15065672, -4252018, 17353278, -10228465, -461172, 17093432, -2493766, --7675644, -14788646, -3973382, -6366752, -30588220, -23749558, -6685654, 5375152, -2905546, 5358509, --6781754, -4895189, 14553497, 8782671, -15289547, -7901666, -17114908, -6807523, 1418950, 6856379, --3055869, 1836099, -14603426, -11694659, -10662793, -300648, 2506650, 921271, -13822279, 451508, -18615462, 8027294, 21248276, -16732119, 25966298, 2296734, -16131897, -2685428, 750546, 4553739, --2703682, 7066832, -9865003, 4683125, -8738111, 4122095, 5975910, -1886028, 13293998, -1114007, -3138011, -3587908, -4801774, -2711735, 384936, 3002182, -5082020, -907312, 1706176, -1133335, -5107253, -1531693, -2557116, -8586176, 3794604, 548682, 4491999, 1909650, -2880849, -8078834, -2603287, -10327249, 2619393, -2683818, -430570, 1102196, -2224793, 818191, 1621887, 7178501, -2803003, -3099356, -13096966, 2528662, -1422708, 30231202, 3311957, 14570677, -12584791, -8538395, --3084324, -14206678, -9025337, -13719736, -6382859, -8880919, 16401943, 4147865, 4145180, 16924318, --442919, -932008, 7638600, 15236396, 23772644, 17416092, -3565360, -6410776, -27364848, 7586523, -8582955, 3386045, -17064442, 19781008, 7872138, 11644730, -3234647, 1151051, 11214696, 24704116, -24004036, 13900125, 2904472, 25688200, 664646, -7587060, 8319352, 15606301, 12625593, 23118736, -12178380, 585726, 2774549, -13838385, 6031208, -34692060, -5961952, -3416110, 7707319, 27407260, -15374372, 4111358, 19853486, -14337675, -13078175, 2895345, -33749852, -7977902, 1388885, 6562710, -7813620, 9016747, -2033130, 14905684, 1849520, 7755637, 27345520, -16743393, -8761196, -4555350, -5207111, -3107946, -25820806, -4776004, 17596482, -1175747, 22318260, -11878806, 605590, 9345312, --2172717, 2701535, -9329743, -4452808, -7247221, -4712116, -8040716, -6472516, 1729798, 1495186, --16121697, -7364795, -9092983, -2304787, 2944737, 4987531, -7206419, -176631, 2126009, -11206643, -1656247, -4432943, -7456063, -3763465, 542777, 2898029, -5129802, -1158031, -7829726, -485331, --2132988, -2400887, -5727876, -8209830, 2060511, 2901787, -4601521, -3033321, -3395709, -2396592, -1453310, 5651103, 1492501, 1888712, -1818382, -23300734, -7351911, 4222490, 17595944, 32337346, --13018046, 560493, 5331665, -5941551, 29965450, 5306969, -14786499, 26261578, -5434744, -8822400, -18785114, -17069810, -9997610, 1141388, 1628330, 2335925, 12295954, 6583111, 9974525, -3064459, -5280663, 15056008, 897111, 10264435, 1861332, 391379, 16617228, -21737904, -7924215, -7374459, -14458471, -11083163, -2908230, -6531035, 14316737, -6091338, 31884764, 23337242, -21777632, 10652056, --26162256, 3748433, 9404905, 5083631, 5610838, -33301028, -6500433, -32116692, 4219806, 2649458, -3874597, -5072357, -5865315, 15362024, -27780922, 9539122, -12055973, -52245056, -19610820, -17099338, -8549669, -7610145, 7898982, 26150446, 27827094, 15793132, 14615774, 13616120, 3906810, -20774220, -21758842, 37581, -24186572, -19201726, -30383672, -40170828, -20776368, -4066797, 32071058, 11582453, -1895691, 12309376, -9877351, -230854, 6117644, 5134097, -2651606, 4706748, 1455457, 3263638, -1279363, -9936944, 7945690, 5317170, 3866544, 1589675, -5262946, 2812667, -7791608, -2764348, --12065100, 9977746, 7466264, -1660005, 1013075, 7978439, 12612171, -5723044, -12460237, -3770445, -10001368, -2255395, -7473243, 10754061, -1015760, -6279779, 7349226, 2959233, 399969, -1876901, --363462, -5344013, 3543348, -3423626, -1617592, 8269423, -41307920, -19126564, -14265197, 7780334, --31483184, 11448772, -18772766, 27026618, -31308700, -39730060, -8513699, -5612449, 31379032, 15400679, -14041859, -7887171, 3761318, -19186156, -15416785, 3752728, 6672769, -24766928, -23051090, -16102906, --1952063, 12706124, 9161165, -17343614, -21948356, -12645994, -12910672, -29764660, -17157320, 13395466, --8213051, -35433, -4000225, 9876277, 15551540, -3898220, -44693428, 19079318, 37609416, 14146549, --694174, -44800804, -10598369, 19793356, -5462125, 50438484, -5228586, -40345848, 6830609, -6653978, -3501472, 1293322, -7956964, 11058467, 13623099, -42571716, -11261404, 2527052, 15302432, -7764227, --21618718, 19585588, 2110440, -14317810, -42436960, -49234284, -25267292, -2974802, 3824132, 39770324, -56098180, 28998008, 22124988, 9772661, -32233192, 12034498, 60666, -16757889, -4657892, -53228604, --11024644, -143881, 645319, 2096481, 23553600, 8963597, 7202660, -9374840, -2816962, 20468204, --13543106, -8053, -580894, 4146791, -9977746, -16631187, -18587544, 8596377, -8523363, -2840047, -11320997, 639413, 2073396, -14135811, 5158256, 4898947, 2790118, -11582990, -5694053, -7538205, --12132209, 1939178, -6910066, 13662828, 5561446, -8862128, 2058363, -3100967, 9567040, -12282533, --1331977, -251792, 6900939, 6222334, 3368865, 7463580, 233002, 4238059, 3481608, 75240848, -69099048, -29091960, 35857072, 31799938, -8902393, -5312875, -16469052, -8854075, -19366544, -13554380, -57309896, -3044058, 33389076, 481573, 1631014, 524523, -22610856, 5477694, 4683662, -49612240, -7399692, 12128451, -26157962, -5370857, -8072391, -3466576, 7343321, -1379758, 1501091, 21998286, -8859444, -10542534, 6728067, 35012036, 555661, 16201690, -885300, 13248363, -19267224, -23102092, --13036836, -42518028, 11378442, 4921496, -18997178, -51681880, -33903400, -48300664, 35256312, -24996172, -5461588, 8914741, 7969312, 6914361, 37616936, -36055712, 155693, -20118700, 39816496, -89248344, -18292802, 7126425, 28550258, 26262652, 66035, -8023536, -13758928, -3715147, -26066156, 19335406, -52617644, -3752191, 10799158, 33535642, -23308250, 13495324, 16130287, -28971166, -20378546, -53961432, -44858784, -8415452, -39687108, 26895086, -6752763, 17695802, -1317481, 15396384, 2449742, -11265162, -18500572, 18221936, 2774012, 10617159, 16808354, 10481868, -11517492, -4461934, -11254962, -4473746, -14136885, 27779312, -1343788, -4579509, -1273458, 18029736, -27825482, 16367583, -7669738, 37486476, -7158637, -21471616, -4646081, 16960288, -8765491, -10976863, -8806830, -6078990, -8660802, 9615358, -6226629, 24271398, -19931870, 1885491, -2436320, 13610214, 689879, -955093, 7534447, 10077604, -7059316, 16152298, 1800128, 18536542, 9991168, -249645, -26069914, -24720758, 30581778, -62266824, -42949136, -25680146, -17935246, -11290932, 3926137, -18034030, -14020921, 19519552, -5977521, -42599632, -14712410, -2621541, 7556995, -9605157, 37884832, -30912490, 1335198, 15698105, -10705743, 11883638, --25191594, 2052458, -21672942, -11014981, 23616414, 3001645, 9477382, -13434121, 22830972, -6599218, --10620917, 8716099, -13944148, -11660299, -7440494, -7720741, -23526758, -31578748, -8756365, 17470316, -300111, -9916006, -31471372, 1171452, -24870544, -1703491, 10047539, -24678882, -6041945, 18080738, -18429168, 13310104, -30550640, -14534169, 21090436, 6792491, -572304, 16999480, -100317016, -23293756, --11173894, -45668924, 4498978, 12429635, -2665027, 8309688, 21519934, -12511777, -21322366, 5318244, --19360638, -5992553, 20884278, 32989106, -12567611, -40137008, -24138790, 2434173, -21347062, 3168612, --16566763, -15809238, 4151086, -32231582, 361851, -20199232, -6167036, -11173894, 4460861, 7870528, --3210488, -20089710, 4356171, -1571421, -12566537, 15256261, -698469, -14906221, -5086315, -4130685, --5574868, -10450192, 5437429, -9587441, 7522635, 10164040, -4205310, 849867, -6238440, -14239427, --19675782, 3110630, 2530273, 8676908, -22775674, 4338454, -177167, -15096273, 11198590, -6528887, -7987566, 17965312, -41304700, 7818451, 5698885, 11417634, -6949794, -4749697, 13501767, -1441498, -999654, 67515816, -8414378, -18512920, 2677912, -7360500, 33494302, 6432251, -2726231, 31854698, -32259500, 10717554, 12534862, 17797270, -39561480, -21769042, 32964410, -4337917, -32472638, -16313360, --14704357, 22587770, 12075837, -11783243, -46945068, 14778982, 7421704, 6403260, 7757785, -5500780, -4805532, -35079684, 31550830, 22060026, 11651709, -17486960, -14979772, 108985, 15795816, -3273302, -16420734, 7332046, -37170796, -16356309, 5878200, -37244344, 2218351, 7337952, -32932198, -46206868, --6504728, 14190572, -26980448, -56141128, -24686936, -14554034, 36550172, -22014928, 41244572, -8301635, -1918777, 17845052, 2391760, -62909996, -4233764, 2859375, 29459718, -55954832, -77683072, 5861557, --5104569, -49247704, 27888834, 13408351, -1906429, 96637, 45638860, -65133180, 53613004, 11624329, -7116761, 22050898, -23616952, -21037286, -4164508, 10450729, -13475997, -666794, 27469538, -23029614, --18815178, 24709484, -13887240, -6521908, 10116795, 7074885, -27434104, 14287746, -9264781, -2106145, -9550934, 9885404, -29234232, -4334159, -22764938, 13082470, 17495012, 1593970, -37595996, 26966490, --6634651, -147103, 15880105, -3566434, -13810467, -1989644, 21016886, -31448824, 21638046, 1693291, --2609193, 8537321, 4005594, -19449760, 8997956, 454193, 682363, -25480968, 17649094, -16473347, -19493246, 3552475, -24140400, 2580202, 2683281, -6205154, 11002096, 2648384, 30775052, 11538967, -73584600, -31986768, -33311766, -14300094, -2018098, 69823824, -10501195, 57686780, -41697688, -16901234, -24049670, -45417132, -15395847, -42787000, 6266894, 41865732, -59332824, -22318798, -5665062, 16976932, --1111323, 5702106, 15650324, -4975183, -37813964, -35203700, 1136019, 23432268, 64639256, -15332496, -17110612, -19621022, 31625992, 231928, 3200288, -9887015, -39060580, 402653, 34947076, -6975564, --2629594, -14128832, -34130496, 43350180, 16300475, 28624346, 38987564, -2834142, 1792612, 23646480, --63666984, 20924544, -32399086, 73843912, -7568806, 6453725, 10714870, -22714472, -22517976, 6600828, --32287954, 46512884, -28224378, -35869420, -35850092, 48668420, 16332150, 27807228, -6874095, 27773406, -28631326, -30646202, -9054865, -28497644, -15008763, 50731080, 36125508, 3892851, 9548249, -79189536, -53160420, 69468952, 7621420, -6622303, -13851806, -42946452, 60323888, -4488241, 3637301, -12913356, -1287953, -27477054, 56438016, -14547591, 27268210, 3467112, -10346039, -4279935, 54352812, -31264678, -26549340, 8038032, -23727546, 2246805, -7939247, 14141180, 3902515, 21219286, -9699647, 1342714, -3736622, -1243393, 21551072, 36678484, -12057584, -2914672, 3867618, 19692962, 5480915, -29970282, --19866372, 39767104, 7514582, 18981608, -40438728, -49093088, 43976708, 28455768, 13431436, -4446902, --37666864, -1839857, 33430952, 9824201, 1459752, -3656091, -6631967, 5748814, 4498442, 6989523, --5551782, 3664681, 7174743, 4686346, -3106872, 1026497, 1371168, 6929393, 17611514, 6583648, --55529632, 37969660, -39504036, 4795331, -18224084, 14663555, -1572495, 20898238, -3406983, -18044768, -31062814, -10899553, -4413079, 4820564, -13128641, -11310796, 35850092, -8429410, -5013301, -4152697, --1930588, 16543140, -12660490, 3949759, -9295383, 8302172, -8134668, -6040335, -19380504, 28268402, --17524004, 9438728, 4397510, 19624242, -22065932, 5013838, -9106404, 22260278, 2767033, 1877975, -17379048, 5345087, -29203094, -4167192, -5140002, 8205535, 12553653, 10772852, -26581552, 11455215, --20128902, 14260902, -11557757, 3156801, -6717329, 14092861, -5648956, 4205310, -29748554, 7157026, -14142254, -13360570, 13215077, 2021319, 4718022, 8561480, -12139188, 20618528, 7828115, -944356, --6665253, 10133438, -6467147, 18741626, -15760919, -4404489, -15019501, 19412178, -19246822, 17660906, --16095390, 21432960, -18301392, 11362873, -18053896, 15845208, -1508070, 1886028, -5436892, 1116155, --3395172, -2457795, -5771363, 9554155, 3318399, -975494, 2721936, -2516851, -5320391, 9618042, -1102196, 3856344, -6350646, 709207, 8949638, -10371272, -2965675, 6582038, -219580, -2837363, --7269232, 17219060, -5706938, -8114804, 4001299, 1906429, -3069291, 2194192, -1372779, 2047626, --3283503, 2833605, -5391795, 8690329, -7283728, 9965935, 3722663, -6702297, 2074469, -1003949, -604517, -407485, 4083977, 464930, -3260954, 2867965, -3521873, -23032836, 46790984, 3981972, -5957120, -18597208, -13677860, -29577292, 19966230, -8242042, -5976447, -12811351, -428423, -11414412, --1353989, -1443109, 5288716, 5903433, -840740, -1307281, -8359080, 7930657, 7417946, -6922414, -3367254, -15806553, 6397354, 3154654, -2711198, -2398739, -5230734, 5122286, 1181116, -11239393, --2970507, -3250753, -9316321, 15455440, 1680943, -9767829, 1570347, -3790309, 13476534, -4589710, --6205154, 2663417, -7935489, 15715285, 517007, -8592619, 2544231, -3465502, 7721278, -9810242, --1892470, 3318399, -3522410, 6939057, -3850438, 2053531, 3185255, -8843338, 1312113, 8912594, --13464186, -826781, 4170950, -12495670, 22943178, -20868172, 10513006, 3847217, -11890617, 23715198, --16027744, 3859565, 3084324, -9941239, 7863012, -4024921, -7653095, 7607461, -9130564, 6044630, --4160213, -3053722, 6863358, -5593658, 2251100, -2230699, -3221, 1389959, -3027952, 1516660, --105764, -2954401, 6491843, -5406827, 4854387, 243203, -4432406, 4462471, -7868917, -699543, -2152852, -1240172, -1031866, 1185948, -4062502, 5120138, -2502355, -1730335, 597537, 592169, --3157875, -419296, -1800665, 1815161, 2594697, -3561065, 3224984, -3396246, -617402, 3419331, --2448668, 10912438, -50017580, -115480400, 30313342, 106902808, 90390272, 121278600, -59773060, -77473696, --116496696, -119083336, 8209293, 88786104, 98046584, 107383848, 35735740, -23368380, -85169736, -141049408, --77248208, 35879084, 55619828, 94067840, 71339944, 19478750, -12603045, -29717952, -70616240, -45784888, --43523052, -7991324, 37272800, 57067232, 30090004, 38094748, 19321448, -21476448, -3297998, -45917496, --63851132, -10945724, -14848776, 11258720, 60349660, 34729104, 29989072, 8827232, -22520124, -23269060, --19972672, -33112050, -8603356, 1449015, 14264660, 17296908, 28907278, 8201240, -943282, -14581414, --26775900, -2319819, 9740449, 9897752, 16986058, -4338454, -13405667, -6497749, -13421773, -10620917, -2956011, 7577933, 21742198, 18338436, 17631378, 986232, -9338333, -35228396, -32640140, -13368623, -2181307, 27158688, 29251948, 11998528, 12454331, -1420024, -23435490, -14434848, -1609539, -5552856, -1353452, 2436320, 5747740, 4683662, -2949032, -7722351, 4635344, 7045357, 5909875, 6000070, --455803, -4470524, -2658048, -11990475, -4819490, -6641093, -11135240, 6594386, 16412144, 18976776, -6403260, 6808060, -3605625, -4509716, -16949014, -25388626, -9667435, 2836826, 8017630, 9776419, -20874614, 19251654, 9467719, -7726646, -16153909, -18402324, -17064442, -12763569, -759672, 15333570, -23947128, 18835042, 5586679, -9067213, -10700374, -10858214, -6147172, -4194036, -4590247, 4595078, -11019812, 7967701, 1839857, -1497870, -746251, -2891050, -3097208, -4609574, -1896228, 2537789, -2284923, 1255741, 1578401, 1206349, 1132798, -2383170, -2913599, -942745, 1337346, 981937, -406948, 405874, 486942, -950262, -707059, -392990, 235686, 255014, 717796, 611496, -458488, -226560, -814433, -1455457, -126702, 246424, 128312, 375810, 1008244, 306016, -312996, 819265, 107911, -2259153, -1759326, -574989, 489626, 965831, 1487132, 491774, -172872, -100395, -37581, -596464, -501974, -308164, -151398, -493921, -73014, 44023, -466004, 667331, 784905, 386547, 340376, -267899, -661962, -1149441, -758062, -419296, -221728, 833761, 1273458, 831076, 170725, -435402, -548682, -841814, -622770, -64425, -352724, 328565, 312459, 92342, 56908, -45097, 2147, -67646, -55835, -78383, -6979, -20401, -32749, -75699, 4832, 40802, 45634, 24159, 37044, -6442, --17180, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-610959, 6533719, -5777805, 2272038, -9754408, 127775, -3511136, 3959960, -3275450, 920734, +-2211371, -4068408, -1021665, -366683, 3001109, 3742527, -3497714, -6128382, 3254512, 1122060, +2284923, 1380295, 2579128, -3542811, -2644089, 659278, -647466, 3227668, 2342905, -2705830, +-554588, 2463701, 4567161, 2809982, 67646, -3541201, 1946157, -593779, -1861868, 2518998, +1116155, -3252901, -2701535, -2203855, 1860795, -3187403, -1687922, 2703682, 1071594, -84826, +-3316789, 1245004, -2847027, -7419556, 768799, -2519535, -4759361, 2211908, -1329292, -1360968, +-1609002, 111669, 3689377, 2209761, 1267552, 1673964, 2794413, -5589900, 2951716, -2219961, +-2112587, -1231582, 1894618, 361851, 3964792, 5720897, 2269353, 446677, 686658, -81604, +3693135, -1541356, -94489, 1789928, 166967, -1511292, -1511292, 521302, -2147, -1707250, +-817118, 537408, -47782, -226023, -639413, -845572, 610422, 366146, 658204, -252329, +258235, -175557, -1540820, -613107, 766652, 1264868, -668404, -842350, 332323, 800475, +14845554, -1257352, 2717641, 3264712, -1525787, 1536525, 5910412, -4616553, -821949, 1688459, +-2300492, -454730, 4339528, -1406602, -986232, -303869, 1677722, -832687, 2085744, -1470489, +-1451162, -666794, -3379066, -5759015, -1092532, -1848447, -780073, 3389803, -6106907, 7496329, +37044, 129923, 249108, 1415192, -189515, -2881923, 444529, 2310693, 5648419, 282394, +-50466, -861678, -1917166, 3761855, 1776506, -1373316, 2065342, -3745748, 629213, 1196685, +-2845416, -9739375, -3059627, -242666, -583579, -462783, -868120, -1239635, -717260, -1850594, +2375654, 7178501, 4056060, 315680, -24159, -190589, 2497524, -1466195, -6556268, -224949, +-3420405, 2146947, -3879429, 2189360, -9456981, -56908, -1357210, 3209951, 5135171, -786516, +-1238024, 775242, -34360, 2769717, 1002875, 465467, 3734474, -2759517, -377420, 478352, +1327682, 8590, 1353989, 78383, 862215, 402116, -194347, 282394, -350040, -37581, +774168, 1194001, 129386, -323733, -478352, 159988, -219580, 678068, 469762, 332323, +-235686, 128312, 440771, -13082470, -12614856, -4750771, -1873143, -1804423, 5369, 3184718, +755377, 2586107, -5927055, 2924336, 3684008, 3561602, 4175245, -3238942, 892816, 9836012, +-6092411, -218506, -4342212, -6291054, -759136, -449898, 5444945, -2647311, 566399, -4699768, +3003793, 1877975, 2356327, -10531260, 1615982, -1927904, -3700651, -996432, -59593, -7813620, +-5066451, -4364224, -359704, 6524592, 2255395, 2159832, 3127273, -2921652, 1837172, -2621541, +5571110, 8584029, -813359, -790811, 2432025, 599685, 2210835, 4823249, -2273112, 4990215, +-790811, -154619, 2943663, 4041564, -1540283, -5841156, -5383205, 2074469, -744640, -1003949, +-2378338, 2650532, -4484483, 1662152, 3343095, 5665599, -3305514, 5432597, 3536906, 1766305, +2703682, 655519, -931471, -3659849, 2592013, -1722282, -3429532, -4317516, 1778653, -1423245, +2590939, 457414, -1675574, -2014877, -1040993, 858993, -1078574, -379568, -1382980, -605054, +-96100, 1328219, 683974, -42413, 756988, 2617783, -266825, 8053, 1514513, -825707, +415538, -575526, -462783, 753767, 1085016, 1108638, 693100, -15032, -359704, 818191, +372588, 1793149, 2129767, -1707786, -193810, 943819, 278099, -972273, 307090, 1227287, +1050120, -556735, 129923, 690953, -624918, -14268418, 6223408, -6368363, 11526082, -10666014, +8441221, 4320737, -4410932, -5521718, -3059627, 2227478, 2010045, -2965138, 6811282, -2401961, +-6442988, -1284732, 7043210, 4842039, -7056632, 1171989, -854699, -7388418, -3042984, -4738423, +-1083406, -5646809, -1478543, -2332167, -7801271, -2753074, 4010963, 5748814, -1068373, -6672769, +-1324997, 4802311, -1429687, 209380, 357556, 151398, -6643778, -153545, -766115, -1648731, +-280247, 1224603, -4748623, 2777233, -5086315, -66035, -1611, 152471, 3832185, 125091, +-1732482, 1595044, 2667175, 6324876, 2900177, 1473711, -1785096, -3847754, -3636227, -1481227, +-3974455, -2833068, 2396055, 4155918, -2990908, -5019206, -3430605, 1652489, 920197, -4705137, +-1595044, 637803, -3956739, -1790465, 587874, 1269163, 1657321, -1798518, -2171106, -2987687, +150324, -326418, -1127429, 981937, -962610, -299574, -2275259, -473520, -740345, 2073396, +1038308, -784905, 1032940, -81068, 352187, -949188, 153008, -547608, -11274, -783832, +-1502702, 1147830, -69256, -1431298, -882616, -104153, -1306744, -1525250, 1478006, -881005, +17473000, 6942278, -1186485, 3949223, -2825552, 9788767, 4129611, 17643726, 319975, -17097192, +4367445, 10349797, -6174553, 1804423, 7120519, -5494337, 5017596, -4456029, -977642, -5491653, +-5233955, -1662152, 1438814, -577136, 2354179, -2359011, 7560216, -4536559, 2128693, 1388348, +4915053, -9037148, -4718022, -3568044, -1078574, -3204583, 840740, 5502927, 3922916, 8744553, +-1291711, -657130, -4997732, -1646583, 5513128, -5397164, 4551592, -5049271, -2130304, 8027294, +11590506, 8309151, 1449015, -6126234, 4282620, 3184718, -3269544, 6749541, -4467303, 1328219, +1056025, -12343736, -119185, -11701102, -4720169, 1861868, -3106872, -5586679, -4780836, 972810, +8023536, 2001992, -3295851, -4082903, -3603478, 806380, 1290638, 3841848, -6099928, -5484137, +361851, -1059246, 351650, -1577327, -918049, -980326, -540092, 1822140, 457414, 836445, +-806917, -1267015, -1251446, 359704, 3190624, 1069447, 2314451, 742493, -3690988, 2771865, +1230508, 506806, 524523, 1603633, -382789, 1382980, 255551, -31675, -1162326, -843424, +-1600412, 470299, 1511829, -292058, -769873, -858457, -5232881, -583042, -656593, 180926, +-839129, 10790032, 21914534, -9630390, -7174206, -1986959, -2647311, 7599945, -7382512, -13390097, +-4689031, 872415, -3334505, 3768297, 1739462, 6583111, 2712809, -2719788, 9483825, 8898635, +-4202626, 591632, -6239514, -1106491, 263604, -3855270, -813359, 6627135, 9516037, 326418, +1500554, 3888556, 2445447, 1485522, 576599, -3688303, -6972880, 737124, -9995463, 301185, +2195802, -3215857, 3811784, -2567854, -5564667, -483721, 5252208, 2305861, -2476586, 16137803, +-133144, 5168993, -9725953, -2203318, 6526203, -3153043, -7225209, 4145180, -8452496, -7554311, +1619203, 9132711, -7607461, -4281009, -2311766, 328028, -3495567, -3444564, 12301860, 7195681, +-1214939, 637803, -5927055, -4232154, -2466385, 3673808, 4806069, 377420, 3833795, 2488397, +-891743, 3597035, -3449396, 12323872, 6915434, 1313723, 299037, 1091459, -2189897, -848793, +-2180770, -2245731, -165893, -128312, -2104534, 1021129, -3125126, -957778, 2255932, -892816, +2313914, 1333587, 2182917, 51540, 1474248, 1758789, 1530619, 266825, 2608119, 849867, +272730, -2005750, 91805, -769336, -134218, 93416, 870268, -172336, 782758, -1911797, +-187368, 739808, 931471, 1421097, 8759586, -15546708, -2042257, -11663521, -6615860, -10561325, +-2643552, -1576790, -1535451, -4028143, 4805532, -14906221, 7755101, -5049808, 4639102, 2051384, +6308233, 401579, 2656974, -5979668, -2489471, 2844342, -5936182, -4309463, 7423851, 2077690, +3402688, 3003256, -678068, 2026688, 11019275, -3874597, 1130650, -4885526, 8878771, -5266704, +-19470698, 6101538, 3157875, 8276939, 4531191, 11388106, -7575249, -2988224, 6931004, -2797634, +-6462852, -3047279, 3649649, -9453760, 9477919, -282394, 6348499, -7974681, -3429532, -2865280, +-8603893, -1722819, -6820408, -3103651, 830539, 10062035, 8159364, -862215, -12183748, -6953015, +-2163053, 9773735, 8144332, 5907191, 5520644, -3400004, -14114873, -3590056, -315143, 3375844, +-4387846, -1351841, 7375533, -1344325, 8699993, 154082, 6059662, 2324651, 390842, -2150168, +-123480, 3285650, 971200, -1465121, 402653, -3884261, -566399, -183610, -5146445, -3105261, +-3249680, -1597728, 1147830, -2072322, 962073, -2792803, -256624, -789737, -1423782, 2340757, +1227824, -447750, -3461744, -1349694, 1544041, 2382096, 157840, -3442953, -1724429, 825171, +1913945, 530965, 988379, 299574, -1717450, -20419348, -24676198, -13923747, 10191957, 864362, +-4564477, -5191542, -7848516, -789200, 2730526, -13745506, -1265942, 8759586, -5269925, -3739843, +9787694, 2608119, -6359236, 2500745, -6150930, 14484777, -4602595, -3386582, 4733054, -7463043, +-4643934, -4358318, 2508798, -5168993, -1886028, 2463164, 1812476, -16908212, 7650948, 7432441, +-4811974, 13172128, 5119064, 1297617, 12664785, 7231651, 2325188, 1809255, 13689671, -1311039, +-2240899, -871878, 8446053, 4725001, -12250320, 4826470, 3950833, -46171, -6481643, -19859928, +8873939, -1265942, -4809290, -12439299, -6949794, 7712151, -1529545, -3593277, -8211978, -16146930, +1742683, -2199560, -8485782, -3576097, -15196131, -2404645, -3329137, -2852932, -541703, 5531918, +11868605, 5080410, -3814468, -8363912, 3379603, 630286, 5023501, 3126199, -1774895, 3623879, +1430761, -347355, -4431333, 459025, -7290170, -404264, -1503775, 1270774, -2738042, 3542274, +2195802, -780610, -478889, -669478, 636729, -1644973, -299037, 2051921, -663572, -702227, +3968550, -1474784, -846109, 3111704, -2229625, 1892470, -6067178, -4002910, -2141578, -3267933, +-192737, -3248069, -4226248, -3230889, -780610, -650151, 1619203, -131533, -2525441, 1571421, +726386, -1401233, -21228950, 16979080, 898185, 8653822, -1613834, -758599, 1542430, 9356586, +870805, -1214939, -12851616, 4510253, -1465658, -9922985, 2521146, -6495601, -5028333, 18306762, +5150203, 5614059, -4023848, 6538014, 7864622, 7636989, -4516695, 6666326, 3405909, -7747048, +4962298, -7532836, -2664490, 4777614, 2202781, -795106, -4239670, -3932043, 12125766, -3562675, +-5430986, -3440806, 2417530, 2641942, -5904507, -9847286, -793495, -10563472, -1323924, -9523016, +-3671123, -2262374, 1793686, -4852240, -8320963, 10411538, -4383014, -11463805, 7253663, 12240657, +-6003828, -3915937, 6114423, 4503273, 12052215, 7854959, 1149978, -106300, -12548821, 3024731, +11872363, 9626632, -8567923, 9180493, 9841381, -6618008, -18600966, -5954436, -16669842, 2811056, +9436043, 4823249, 1069447, -4955319, -6794102, -721555, 791885, 2908767, -1599339, 5457293, +-2517925, -1881196, 2043868, 5779952, -8544837, -1091459, -1156957, -2545305, -25233, 2347737, +-559956, -229244, -1421097, -128849, -1435593, 512175, -194884, -141734, 719944, 3045132, +-2692408, -1454383, 1631014, 1975685, 6231998, -568009, 2554969, 2543695, -2806761, 2306398, +928787, -2319819, 532039, 988379, 657667, 2624762, 5426155, 1236414, -1939178, 3754875, +-1239635, -1997160, 226560, -3512210, -1607928, -186831, 106837, 3991635, -33833068, 16094316, +4501663, -1666447, 22688702, -1423245, 11446625, -10254771, -2460480, 1718524, 68183, 12937515, +8200703, -17751100, 10960757, 755914, 6551436, -15996606, -697395, 9122511, -15702937, 19476602, +5222144, -286689, -7061463, 1091459, 8393440, -14097693, 1217086, 3504157, 2403571, -8722542, +-3278134, 8102456, 4552129, -957241, 1140314, -5763846, -9802726, 3946001, -16519518, -759672, +23477902, 22917946, -7439420, 2772402, -1090922, 6504191, 16469589, 1314797, 7834021, 2550137, +-8779450, -732829, -1746978, -25058450, -11370389, 15381352, 622770, 4687420, -6125697, -1612760, +5404680, 7405598, -776315, 19162534, 181462, 14929306, 1772211, 3084860, 1862405, -9905268, +-12442520, 15120432, 3421478, -8009041, 10930692, -9118752, 717260, 9254044, 1410360, -2471217, +4243428, -4090956, -3955128, 4592394, 6301791, 376347, -8703751, -4218195, -9369471, -3389266, +2180233, 2901787, 1382980, -3664681, -1794223, -6743636, 4696547, -159988, -2807298, -1299228, +1906429, 1040993, 5848672, 5265630, 3340948, 3397319, 1057099, 4168266, -2970507, 1878511, +2153389, 2099702, -2612951, 4213900, 2132988, -709207, -904628, -1185948, -1194001, -2026151, +-4821101, -1427540, -204548, -1952600, -3566970, 11307038, -24597814, 9886478, 15495705, -2140504, +4605816, 6979859, -3767223, -2374580, 9557376, -3593814, 14504641, -13804025, 7539815, 17954038, +-19239306, 791885, -9157944, 11348377, 4768488, 9416179, -9745818, -7582228, -129386, 24267102, +260382, 12288975, -5462662, 765578, -1691143, -2130304, -10786810, -390305, -3045132, 4966593, +-4832375, -6953552, -5892695, -415001, -2072859, 10985989, 1853815, -6024229, -5524939, -5542119, +-2073932, -2621004, 17847736, 816044, 8945880, 653372, -4332012, -3873524, 14834280, 11137387, +-4321274, -13968307, 7872675, 5487895, -30929134, 1840394, 17385490, 17045114, 3920232, 13565654, +-18680424, 30586610, 2633352, 5896990, 5994164, 14621142, -1190780, -13001940, -4019016, -15370077, +17507360, -7702487, -5254356, 15382962, -511638, -5963562, -4716948, -11457899, 10863583, -18741090, +-2816962, 1880122, -517007, 2748779, -3959423, -8000451, -5199058, 2585034, 2009508, -3738769, +919123, -3560528, -3987877, -2816425, 3394635, 1890859, -4520990, 4238596, 779537, -5337571, +2394981, -904091, -1973001, -4048007, -4763656, 984084, 2218351, 9831180, -4333622, 5863167, +640487, -1845225, -767725, -1049583, -2635499, 1589675, -345208, -2798708, -1041530, -1905355, +711891, 2081449, 1520955, -4003447, 9460739, -18210662, -14552960, 13073880, 11008538, 26833882, +-9422621, -7057705, -4738423, 5083631, -11339787, -1340567, 4486630, -770410, 14440217, 9308268, +-11501386, 1071058, 3408594, 8351027, -13103945, 13823352, -200253, 6138045, -2298344, -6270653, +-13748190, 4888747, -2357400, -5791227, 2801929, -8436390, -8193724, -1825898, 4350265, 16737488, +-24860344, -15040975, -13397077, -15065672, -4252018, 17353278, -10228465, -461172, 17093432, -2493766, +-7675644, -14788646, -3973382, -6366752, -30588220, -23749558, -6685654, 5375152, -2905546, 5358509, +-6781754, -4895189, 14553497, 8782671, -15289547, -7901666, -17114908, -6807523, 1418950, 6856379, +-3055869, 1836099, -14603426, -11694659, -10662793, -300648, 2506650, 921271, -13822279, 451508, +18615462, 8027294, 21248276, -16732119, 25966298, 2296734, -16131897, -2685428, 750546, 4553739, +-2703682, 7066832, -9865003, 4683125, -8738111, 4122095, 5975910, -1886028, 13293998, -1114007, +3138011, -3587908, -4801774, -2711735, 384936, 3002182, -5082020, -907312, 1706176, -1133335, +5107253, -1531693, -2557116, -8586176, 3794604, 548682, 4491999, 1909650, -2880849, -8078834, +2603287, -10327249, 2619393, -2683818, -430570, 1102196, -2224793, 818191, 1621887, 7178501, +2803003, -3099356, -13096966, 2528662, -1422708, 30231202, 3311957, 14570677, -12584791, -8538395, +-3084324, -14206678, -9025337, -13719736, -6382859, -8880919, 16401943, 4147865, 4145180, 16924318, +-442919, -932008, 7638600, 15236396, 23772644, 17416092, -3565360, -6410776, -27364848, 7586523, +8582955, 3386045, -17064442, 19781008, 7872138, 11644730, -3234647, 1151051, 11214696, 24704116, +24004036, 13900125, 2904472, 25688200, 664646, -7587060, 8319352, 15606301, 12625593, 23118736, +12178380, 585726, 2774549, -13838385, 6031208, -34692060, -5961952, -3416110, 7707319, 27407260, +15374372, 4111358, 19853486, -14337675, -13078175, 2895345, -33749852, -7977902, 1388885, 6562710, +7813620, 9016747, -2033130, 14905684, 1849520, 7755637, 27345520, -16743393, -8761196, -4555350, +5207111, -3107946, -25820806, -4776004, 17596482, -1175747, 22318260, -11878806, 605590, 9345312, +-2172717, 2701535, -9329743, -4452808, -7247221, -4712116, -8040716, -6472516, 1729798, 1495186, +-16121697, -7364795, -9092983, -2304787, 2944737, 4987531, -7206419, -176631, 2126009, -11206643, +1656247, -4432943, -7456063, -3763465, 542777, 2898029, -5129802, -1158031, -7829726, -485331, +-2132988, -2400887, -5727876, -8209830, 2060511, 2901787, -4601521, -3033321, -3395709, -2396592, +1453310, 5651103, 1492501, 1888712, -1818382, -23300734, -7351911, 4222490, 17595944, 32337346, +-13018046, 560493, 5331665, -5941551, 29965450, 5306969, -14786499, 26261578, -5434744, -8822400, +18785114, -17069810, -9997610, 1141388, 1628330, 2335925, 12295954, 6583111, 9974525, -3064459, +5280663, 15056008, 897111, 10264435, 1861332, 391379, 16617228, -21737904, -7924215, -7374459, +14458471, -11083163, -2908230, -6531035, 14316737, -6091338, 31884764, 23337242, -21777632, 10652056, +-26162256, 3748433, 9404905, 5083631, 5610838, -33301028, -6500433, -32116692, 4219806, 2649458, +3874597, -5072357, -5865315, 15362024, -27780922, 9539122, -12055973, -52245056, -19610820, -17099338, +8549669, -7610145, 7898982, 26150446, 27827094, 15793132, 14615774, 13616120, 3906810, -20774220, +21758842, 37581, -24186572, -19201726, -30383672, -40170828, -20776368, -4066797, 32071058, 11582453, +1895691, 12309376, -9877351, -230854, 6117644, 5134097, -2651606, 4706748, 1455457, 3263638, +1279363, -9936944, 7945690, 5317170, 3866544, 1589675, -5262946, 2812667, -7791608, -2764348, +-12065100, 9977746, 7466264, -1660005, 1013075, 7978439, 12612171, -5723044, -12460237, -3770445, +10001368, -2255395, -7473243, 10754061, -1015760, -6279779, 7349226, 2959233, 399969, -1876901, +-363462, -5344013, 3543348, -3423626, -1617592, 8269423, -41307920, -19126564, -14265197, 7780334, +-31483184, 11448772, -18772766, 27026618, -31308700, -39730060, -8513699, -5612449, 31379032, 15400679, +14041859, -7887171, 3761318, -19186156, -15416785, 3752728, 6672769, -24766928, -23051090, -16102906, +-1952063, 12706124, 9161165, -17343614, -21948356, -12645994, -12910672, -29764660, -17157320, 13395466, +-8213051, -35433, -4000225, 9876277, 15551540, -3898220, -44693428, 19079318, 37609416, 14146549, +-694174, -44800804, -10598369, 19793356, -5462125, 50438484, -5228586, -40345848, 6830609, -6653978, +3501472, 1293322, -7956964, 11058467, 13623099, -42571716, -11261404, 2527052, 15302432, -7764227, +-21618718, 19585588, 2110440, -14317810, -42436960, -49234284, -25267292, -2974802, 3824132, 39770324, +56098180, 28998008, 22124988, 9772661, -32233192, 12034498, 60666, -16757889, -4657892, -53228604, +-11024644, -143881, 645319, 2096481, 23553600, 8963597, 7202660, -9374840, -2816962, 20468204, +-13543106, -8053, -580894, 4146791, -9977746, -16631187, -18587544, 8596377, -8523363, -2840047, +11320997, 639413, 2073396, -14135811, 5158256, 4898947, 2790118, -11582990, -5694053, -7538205, +-12132209, 1939178, -6910066, 13662828, 5561446, -8862128, 2058363, -3100967, 9567040, -12282533, +-1331977, -251792, 6900939, 6222334, 3368865, 7463580, 233002, 4238059, 3481608, 75240848, +69099048, -29091960, 35857072, 31799938, -8902393, -5312875, -16469052, -8854075, -19366544, -13554380, +57309896, -3044058, 33389076, 481573, 1631014, 524523, -22610856, 5477694, 4683662, -49612240, +7399692, 12128451, -26157962, -5370857, -8072391, -3466576, 7343321, -1379758, 1501091, 21998286, +8859444, -10542534, 6728067, 35012036, 555661, 16201690, -885300, 13248363, -19267224, -23102092, +-13036836, -42518028, 11378442, 4921496, -18997178, -51681880, -33903400, -48300664, 35256312, -24996172, +5461588, 8914741, 7969312, 6914361, 37616936, -36055712, 155693, -20118700, 39816496, -89248344, +18292802, 7126425, 28550258, 26262652, 66035, -8023536, -13758928, -3715147, -26066156, 19335406, +52617644, -3752191, 10799158, 33535642, -23308250, 13495324, 16130287, -28971166, -20378546, -53961432, +44858784, -8415452, -39687108, 26895086, -6752763, 17695802, -1317481, 15396384, 2449742, -11265162, +18500572, 18221936, 2774012, 10617159, 16808354, 10481868, -11517492, -4461934, -11254962, -4473746, +14136885, 27779312, -1343788, -4579509, -1273458, 18029736, -27825482, 16367583, -7669738, 37486476, +7158637, -21471616, -4646081, 16960288, -8765491, -10976863, -8806830, -6078990, -8660802, 9615358, +6226629, 24271398, -19931870, 1885491, -2436320, 13610214, 689879, -955093, 7534447, 10077604, +7059316, 16152298, 1800128, 18536542, 9991168, -249645, -26069914, -24720758, 30581778, -62266824, +42949136, -25680146, -17935246, -11290932, 3926137, -18034030, -14020921, 19519552, -5977521, -42599632, +14712410, -2621541, 7556995, -9605157, 37884832, -30912490, 1335198, 15698105, -10705743, 11883638, +-25191594, 2052458, -21672942, -11014981, 23616414, 3001645, 9477382, -13434121, 22830972, -6599218, +-10620917, 8716099, -13944148, -11660299, -7440494, -7720741, -23526758, -31578748, -8756365, 17470316, +300111, -9916006, -31471372, 1171452, -24870544, -1703491, 10047539, -24678882, -6041945, 18080738, +18429168, 13310104, -30550640, -14534169, 21090436, 6792491, -572304, 16999480, -100317016, -23293756, +-11173894, -45668924, 4498978, 12429635, -2665027, 8309688, 21519934, -12511777, -21322366, 5318244, +-19360638, -5992553, 20884278, 32989106, -12567611, -40137008, -24138790, 2434173, -21347062, 3168612, +-16566763, -15809238, 4151086, -32231582, 361851, -20199232, -6167036, -11173894, 4460861, 7870528, +-3210488, -20089710, 4356171, -1571421, -12566537, 15256261, -698469, -14906221, -5086315, -4130685, +-5574868, -10450192, 5437429, -9587441, 7522635, 10164040, -4205310, 849867, -6238440, -14239427, +-19675782, 3110630, 2530273, 8676908, -22775674, 4338454, -177167, -15096273, 11198590, -6528887, +7987566, 17965312, -41304700, 7818451, 5698885, 11417634, -6949794, -4749697, 13501767, -1441498, +999654, 67515816, -8414378, -18512920, 2677912, -7360500, 33494302, 6432251, -2726231, 31854698, +32259500, 10717554, 12534862, 17797270, -39561480, -21769042, 32964410, -4337917, -32472638, -16313360, +-14704357, 22587770, 12075837, -11783243, -46945068, 14778982, 7421704, 6403260, 7757785, -5500780, +4805532, -35079684, 31550830, 22060026, 11651709, -17486960, -14979772, 108985, 15795816, -3273302, +16420734, 7332046, -37170796, -16356309, 5878200, -37244344, 2218351, 7337952, -32932198, -46206868, +-6504728, 14190572, -26980448, -56141128, -24686936, -14554034, 36550172, -22014928, 41244572, -8301635, +1918777, 17845052, 2391760, -62909996, -4233764, 2859375, 29459718, -55954832, -77683072, 5861557, +-5104569, -49247704, 27888834, 13408351, -1906429, 96637, 45638860, -65133180, 53613004, 11624329, +7116761, 22050898, -23616952, -21037286, -4164508, 10450729, -13475997, -666794, 27469538, -23029614, +-18815178, 24709484, -13887240, -6521908, 10116795, 7074885, -27434104, 14287746, -9264781, -2106145, +9550934, 9885404, -29234232, -4334159, -22764938, 13082470, 17495012, 1593970, -37595996, 26966490, +-6634651, -147103, 15880105, -3566434, -13810467, -1989644, 21016886, -31448824, 21638046, 1693291, +-2609193, 8537321, 4005594, -19449760, 8997956, 454193, 682363, -25480968, 17649094, -16473347, +19493246, 3552475, -24140400, 2580202, 2683281, -6205154, 11002096, 2648384, 30775052, 11538967, +73584600, -31986768, -33311766, -14300094, -2018098, 69823824, -10501195, 57686780, -41697688, -16901234, +24049670, -45417132, -15395847, -42787000, 6266894, 41865732, -59332824, -22318798, -5665062, 16976932, +-1111323, 5702106, 15650324, -4975183, -37813964, -35203700, 1136019, 23432268, 64639256, -15332496, +17110612, -19621022, 31625992, 231928, 3200288, -9887015, -39060580, 402653, 34947076, -6975564, +-2629594, -14128832, -34130496, 43350180, 16300475, 28624346, 38987564, -2834142, 1792612, 23646480, +-63666984, 20924544, -32399086, 73843912, -7568806, 6453725, 10714870, -22714472, -22517976, 6600828, +-32287954, 46512884, -28224378, -35869420, -35850092, 48668420, 16332150, 27807228, -6874095, 27773406, +28631326, -30646202, -9054865, -28497644, -15008763, 50731080, 36125508, 3892851, 9548249, -79189536, +53160420, 69468952, 7621420, -6622303, -13851806, -42946452, 60323888, -4488241, 3637301, -12913356, +1287953, -27477054, 56438016, -14547591, 27268210, 3467112, -10346039, -4279935, 54352812, -31264678, +26549340, 8038032, -23727546, 2246805, -7939247, 14141180, 3902515, 21219286, -9699647, 1342714, +3736622, -1243393, 21551072, 36678484, -12057584, -2914672, 3867618, 19692962, 5480915, -29970282, +-19866372, 39767104, 7514582, 18981608, -40438728, -49093088, 43976708, 28455768, 13431436, -4446902, +-37666864, -1839857, 33430952, 9824201, 1459752, -3656091, -6631967, 5748814, 4498442, 6989523, +-5551782, 3664681, 7174743, 4686346, -3106872, 1026497, 1371168, 6929393, 17611514, 6583648, +-55529632, 37969660, -39504036, 4795331, -18224084, 14663555, -1572495, 20898238, -3406983, -18044768, +31062814, -10899553, -4413079, 4820564, -13128641, -11310796, 35850092, -8429410, -5013301, -4152697, +-1930588, 16543140, -12660490, 3949759, -9295383, 8302172, -8134668, -6040335, -19380504, 28268402, +-17524004, 9438728, 4397510, 19624242, -22065932, 5013838, -9106404, 22260278, 2767033, 1877975, +17379048, 5345087, -29203094, -4167192, -5140002, 8205535, 12553653, 10772852, -26581552, 11455215, +-20128902, 14260902, -11557757, 3156801, -6717329, 14092861, -5648956, 4205310, -29748554, 7157026, +14142254, -13360570, 13215077, 2021319, 4718022, 8561480, -12139188, 20618528, 7828115, -944356, +-6665253, 10133438, -6467147, 18741626, -15760919, -4404489, -15019501, 19412178, -19246822, 17660906, +-16095390, 21432960, -18301392, 11362873, -18053896, 15845208, -1508070, 1886028, -5436892, 1116155, +-3395172, -2457795, -5771363, 9554155, 3318399, -975494, 2721936, -2516851, -5320391, 9618042, +1102196, 3856344, -6350646, 709207, 8949638, -10371272, -2965675, 6582038, -219580, -2837363, +-7269232, 17219060, -5706938, -8114804, 4001299, 1906429, -3069291, 2194192, -1372779, 2047626, +-3283503, 2833605, -5391795, 8690329, -7283728, 9965935, 3722663, -6702297, 2074469, -1003949, +604517, -407485, 4083977, 464930, -3260954, 2867965, -3521873, -23032836, 46790984, 3981972, +5957120, -18597208, -13677860, -29577292, 19966230, -8242042, -5976447, -12811351, -428423, -11414412, +-1353989, -1443109, 5288716, 5903433, -840740, -1307281, -8359080, 7930657, 7417946, -6922414, +3367254, -15806553, 6397354, 3154654, -2711198, -2398739, -5230734, 5122286, 1181116, -11239393, +-2970507, -3250753, -9316321, 15455440, 1680943, -9767829, 1570347, -3790309, 13476534, -4589710, +-6205154, 2663417, -7935489, 15715285, 517007, -8592619, 2544231, -3465502, 7721278, -9810242, +-1892470, 3318399, -3522410, 6939057, -3850438, 2053531, 3185255, -8843338, 1312113, 8912594, +-13464186, -826781, 4170950, -12495670, 22943178, -20868172, 10513006, 3847217, -11890617, 23715198, +-16027744, 3859565, 3084324, -9941239, 7863012, -4024921, -7653095, 7607461, -9130564, 6044630, +-4160213, -3053722, 6863358, -5593658, 2251100, -2230699, -3221, 1389959, -3027952, 1516660, +-105764, -2954401, 6491843, -5406827, 4854387, 243203, -4432406, 4462471, -7868917, -699543, +2152852, -1240172, -1031866, 1185948, -4062502, 5120138, -2502355, -1730335, 597537, 592169, +-3157875, -419296, -1800665, 1815161, 2594697, -3561065, 3224984, -3396246, -617402, 3419331, +-2448668, 10912438, -50017580, -115480400, 30313342, 106902808, 90390272, 121278600, -59773060, -77473696, +-116496696, -119083336, 8209293, 88786104, 98046584, 107383848, 35735740, -23368380, -85169736, -141049408, +-77248208, 35879084, 55619828, 94067840, 71339944, 19478750, -12603045, -29717952, -70616240, -45784888, +-43523052, -7991324, 37272800, 57067232, 30090004, 38094748, 19321448, -21476448, -3297998, -45917496, +-63851132, -10945724, -14848776, 11258720, 60349660, 34729104, 29989072, 8827232, -22520124, -23269060, +-19972672, -33112050, -8603356, 1449015, 14264660, 17296908, 28907278, 8201240, -943282, -14581414, +-26775900, -2319819, 9740449, 9897752, 16986058, -4338454, -13405667, -6497749, -13421773, -10620917, +2956011, 7577933, 21742198, 18338436, 17631378, 986232, -9338333, -35228396, -32640140, -13368623, +2181307, 27158688, 29251948, 11998528, 12454331, -1420024, -23435490, -14434848, -1609539, -5552856, +1353452, 2436320, 5747740, 4683662, -2949032, -7722351, 4635344, 7045357, 5909875, 6000070, +-455803, -4470524, -2658048, -11990475, -4819490, -6641093, -11135240, 6594386, 16412144, 18976776, +6403260, 6808060, -3605625, -4509716, -16949014, -25388626, -9667435, 2836826, 8017630, 9776419, +20874614, 19251654, 9467719, -7726646, -16153909, -18402324, -17064442, -12763569, -759672, 15333570, +23947128, 18835042, 5586679, -9067213, -10700374, -10858214, -6147172, -4194036, -4590247, 4595078, +11019812, 7967701, 1839857, -1497870, -746251, -2891050, -3097208, -4609574, -1896228, 2537789, +2284923, 1255741, 1578401, 1206349, 1132798, -2383170, -2913599, -942745, 1337346, 981937, +406948, 405874, 486942, -950262, -707059, -392990, 235686, 255014, 717796, 611496, +458488, -226560, -814433, -1455457, -126702, 246424, 128312, 375810, 1008244, 306016, +312996, 819265, 107911, -2259153, -1759326, -574989, 489626, 965831, 1487132, 491774, +172872, -100395, -37581, -596464, -501974, -308164, -151398, -493921, -73014, 44023, +466004, 667331, 784905, 386547, 340376, -267899, -661962, -1149441, -758062, -419296, +221728, 833761, 1273458, 831076, 170725, -435402, -548682, -841814, -622770, -64425, +352724, 328565, 312459, 92342, 56908, -45097, 2147, -67646, -55835, -78383, +6979, -20401, -32749, -75699, 4832, 40802, 45634, 24159, 37044, -6442, +-17180, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -5501316, --4846334, 6116571, -1204202, 4890894, 1455457, 7255274, -1642825, -3696893, -2532420, 4446365, -163209, -1569274, -387084, 5022428, -1286880, 940598, 1791001, -3316252, -2508798, -1058173, -961536, -3444027, 926102, 738734, -3986804, -1278827, -2368675, 370441, -1719061, 673773, -6613176, 3397319, -1879585, 339839, -3078418, 2421288, -797253, 3908957, -8016020, -860067, -1288490, -2844342, 558346, 3928821, 3023657, -3605625, -2640331, -2894808, -499290, -2290828, --1130650, -3520800, 1394254, -295816, -4051765, -2105608, -1610076, -192737, 887448, -881542, --381715, 1772748, 740345, -1921998, 1056562, 4371740, -2195265, -569620, -4646081, -1780264, --321049, 1948305, -1939178, 570694, 834834, 657130, 1557463, -3618510, -77846, -2038499, -1762010, -1304060, -3451006, -991064, -66035, -57982, -1500017, -1623498, 1744831, -766115, --270046, 630823, 1037772, 47782, -185220, 193274, 635118, 38655, -343597, 775242, -184147, -678605, -575526, 723165, -213138, 260382, -419296, 651761, -559420, -395674, --54761, -135828, 276489, 7499550, -2850248, 2417530, 6265821, -5143224, -5794985, -880468, --1471563, -102542, 3176128, 1754494, -8043400, 1219234, -4628364, -6356552, -439697, 2286533, -2476586, -2095944, -299574, -709207, 3410741, -746787, 2799782, -1356673, 298500, 587337, -831076, -4038880, 1654636, 3063386, -1482301, 3913789, -2216203, -464930, -4962835, 3472481, -856309, -1338419, -3854196, -3826816, -1749125, -1330903, 1888712, -454193, 1627256, 1599875, --3419868, 2078227, -4584878, 1594507, 2630668, 4996121, 4823249, -4215511, 2047626, -306016, --1127429, 2907693, -2270964, -2723546, -2041183, 2362769, 1176284, 3091303, -3134789, 4675072, --1549410, -280247, 1401770, 739808, 2748242, -2136746, 3923990, 4933844, 8690329, 3999688, -2753074, -5187247, -956704, -3401077, -2443837, 3119220, -430034, 3863860, 1583769, -357019, --795106, -725313, 2244657, -1757715, 1787780, 2082522, -1692754, 971200, 768262, 177704, -1277216, -845572, -246961, -1735704, -99858, 93952, 870805, -9277666, -9980430, 1080721, --867047, 2310156, 2151242, 6506876, 2913599, 3082176, 1534377, -3256659, 1184337, 8235600, --5587753, -668404, 204011, 6602976, 3948149, 881005, 2897492, -571231, 2226404, 3020436, -6762963, 3732864, 3775276, 2013803, 1589138, 3279745, 1153199, -4791036, 2865817, 3883187, --1446330, 2813204, 3715147, -1351841, 1135482, 4665945, 1688996, -1169842, 1641214, 4764193, --294205, -86973, -994285, 1283658, 4449049, -1361505, -2583960, 1268089, -1605781, 2346126, -2775086, -3377992, 671626, -2192044, 126165, 1342714, 3736622, 3087008, -8010651, -43487, -3851512, -2052994, -3367254, 422517, 561567, 3897683, -376347, -8518531, -3762928, 2729452, --2411087, 3981435, -1161789, 1611, 966905, 5000416, 3098819, 2110440, -2633352, 4105452, --543850, 2508798, 1190780, 483721, 813359, 845035, -114890, -673236, 501437, -369367, --2111513, -885837, -898722, -272730, -526670, -17717, -674310, -1499481, 688805, 306016, --810138, 161598, 1349694, 1018981, 432181, -204548, -289373, -153545, -128849, 1323924, --16643, -16726213, 2426657, 1808181, 7906498, -228707, 6188511, 3215320, 1627793, -9767829, -81604, -73014, -7570954, 1301912, 5776194, 1165010, -45097, -640487, -2982855, -3412889, -1622424, 2335389, -207769, 1586454, 1817308, 6944425, 847182, 3122978, 3263102, -3513820, -836982, -762894, -934155, -373662, 2585034, -304406, -1662689, -2662880, -1590212, 968515, --4829154, -3382287, 2113124, -3797288, 1324461, -6293738, -7590818, -1860258, 9505836, -2408940, --506806, 5670968, 1920387, 503585, 6018323, -753230, 715649, -664109, 1797981, 3929895, --1454383, -5873905, 3859565, -3384434, -6578816, -2543695, -1808718, 89121, 2479270, 7270306, -91268, 26307, -2765422, -166967, 4273493, -1901597, -2148558, 5217312, -4283156, -229781, -2379412, -5128728, -987843, -1709397, -1733556, 689879, -2767570, -3840238, 277025, 2557653, --1105417, -1594507, -2204929, -2149631, -285078, 1744294, 765041, -108985, -633508, -1644436, -110595, -472446, -2122251, -3041374, -2671470, 82678, -322659, 1398012, -2075543, 22012, --285078, 1140851, -144955, 562641, -610959, 127775, 343597, -945430, 14867029, 397284, --1002338, -5767068, -3359738, 7803419, -3292093, 6072547, 5207648, -6112812, -1078574, 4532801, --3469797, -1715839, -1674500, -2271501, 892816, 1572495, 184147, 2801393, -1413581, 368830, -988379, -1293322, -2932926, -3034931, -3438121, 184684, 3791919, 1615982, -3396782, 229244, -1433982, 7353521, -2303713, 6576132, -6159520, 2668249, 4693326, -3237869, -2034204, -6251325, -2814277, -132070, -4440996, 4228932, -5481989, 5963025, -434329, 8469139, 1857573, 865436, -1959042, 3490198, 1789928, -2821794, 4103841, -845572, -4603131, -7093676, -2024003, 2924336, --3635153, -2345589, 2633889, -3991098, 7602092, -7477001, -149250, 4906464, -4351339, -1736777, --7899519, -636192, -3166465, -1759863, -2455111, 6682969, 2529736, 635118, 156229, 5760088, -452582, -548682, 4532801, 3783329, 3366718, 7169374, -1666447, 656593, -2160906, 1992328, -2250563, 438624, 566399, -1264868, -180389, -1771137, -993748, 122407, 519154, 1102733, --704375, -296353, 2180770, 1034013, -1006633, 4430259, -386010, -1156957, -1980517, -1246614, -1494112, -1580548, 5906, -230318, -1720134, 648540, 326418, -470299, 978716, 1137093, --1349157, 1181653, 1974611, 7182796, 12743168, -3771518, -5601711, 1430224, -2309082, 3491272, -11596412, 39728, -2715493, 3660923, 1964411, 3414499, 2051384, -6361384, 199179, -5679558, -3112778, 2705830, 1627256, 10610717, -546535, 7904888, -246424, -219580, 2375654, -89657, -8308078, 1081795, 5216775, -1962800, 7080254, -3230352, 3757023, 14084808, -2346663, -3579318, -9903121, 2075006, 6437082, -175020, -6224482, 1911797, -3608846, 4247723, -7492034, -1009854, --3914863, 4189741, -675384, 855235, 7638600, -3744138, -7767985, 2154463, -711354, -372052, -6202470, 1201517, 843961, -2823404, -5127117, -5389647, -1847910, -4449586, -3406983, 4602595, --2366527, -439160, -1731946, 542240, -25233, 4112431, 2522220, -4704600, -6845104, -1584843, -167504, 1879048, -1903207, -1660542, 5533529, 3193845, 2699924, 821949, -4600447, -2090039, -2409477, 120796, -1554241, 2005213, -679679, 1230508, -1531693, 138513, -900869, -2560874, --3116536, -790274, -2763812, 741956, -456340, 293132, 1803349, -466004, -1507534, 2313914, -438087, 1488743, 799401, 177704, -904091, 1164473, -338229, -222265, -139586, -209380, -43487, -427886, 580894, 1491964, -1829656, 527207, -2147484, 371515, -1068910, 2673617, -17445620, -9300752, 6061810, 145492, 2941516, -4332012, -3410741, -2026151, 3723200, 4814659, -953483, -2790118, -5188858, 2567317, 4760435, -1047972, 1433982, -2695092, 5198521, 1858110, --10021769, -3365107, 3111167, -682363, -4309463, -302795, 4434017, -3421478, 1448478, -6564321, -3684545, 8064338, -3467112, 8535711, 208843, -1681480, 5672578, -357019, 360240, 5097590, --11329050, 1578401, 3325915, 4672925, 3150896, 3624953, -5128728, -4026532, -258235, 1678259, --5546951, 1690070, 5231270, 4651450, 1686312, 14442901, -4667019, -1946157, -6671695, -2946885, --4400731, -6184216, 7425462, 3006477, 7250979, -1271310, -11805254, 6701223, -4217121, 3624416, -3286724, 1508607, 1947231, -9393630, 10900627, 2263985, -5162551, -9021579, -5644661, -5703717, -704375, 4402342, -4212289, 207769, 2717641, 2244121, -68719, -2070711, 383326, -337692, -1660542, 1701881, 1912871, 1235877, 1240709, 535797, -3302293, -3049427, 70330, -1217623, -987306, 1165010, -1571958, 1949378, -579821, 610959, 1671279, 592169, 1282048, 240518, --3505767, -401579, -113817, 1047435, 825171, 249645, -845035, -1095754, 1792075, -715649, -4460861, 607201, 1891396, -20812338, -17487496, -16105590, 3848828, 3562675, 1574106, 944356, --957778, -1057636, 643171, -2570001, -5714991, -3901441, -10159208, -4363687, -4826470, 6409702, --7762617, -3310346, -4306779, 1554241, 292595, -1848983, 2524904, -472983, -8070244, 51540, -7789460, 1200980, -7178501, -6300717, 3049427, -2415382, 6568079, 4701916, -6773164, 7105487, -11060078, -8882529, -9131100, -4763119, 3622805, 8861591, -5956583, -6134287, 3462818, -3445101, -867047, -588947, -598074, -9676561, 2086280, 6229313, -2886218, 3666292, -4733591, -5624797, --5623186, -2644089, -9826348, 17393006, -3446711, -921271, 3187403, 2104534, 3845606, 2575907, -5543192, 2684355, 4837207, 10860899, -13517336, 9833328, -3081102, -2362232, -282394, -15052787, --512175, 4927401, 612033, 850404, 4461398, 1813013, -192200, 2793339, -4985384, 6239514, --1978906, -3233037, 3435974, -1866163, -1727651, 868657, 2838437, -1789928, -3062312, 1363652, -2759517, 361851, -919123, -2568391, -1372242, 654446, -3818763, -2408403, -1213328, 2176475, --722628, 412854, 2292976, 307090, -3804267, -635118, -3212636, -2745021, -2665564, -1481764, --2964064, 2943663, -758599, 456340, 5898064, -856846, -1560684, -1261110, 3273839, 1063004, --881542, -852551, -20667382, 15853261, 4202089, 3463891, -3825742, 15520938, -2441689, 7320772, --24159, 6589554, -9235253, 3670587, 3615289, 1431298, -4549444, 13826573, -3752728, 4230543, -3164854, 14352707, -9681930, -602906, 3970697, -2463701, -7111392, 4311074, -6692096, 1757715, -1806034, -7802345, 3010235, 677531, 368830, 15797427, 9826885, -1280437, -6477885, -4998805, -3486440, -795643, -9483825, 2727304, -865973, 2830920, 7080254, 10531797, -7237557, 7179575, -3528316, -4672925, 3364033, 2797098, -7490423, -3971771, -4714801, 7563438, -8163122, -6831683, --18648212, -13565117, 3723737, -2495913, -2731062, -7097971, -14487462, 5602785, 1051193, -356482, -7006166, 6091874, 8436926, 5121749, 1990181, -167504, 1291175, 9687299, -7169374, 13239237, --4911295, -3645890, -12095165, 2004139, -2284923, -6037651, -1165547, 1556926, -3105798, 3597572, --1537598, 251256, -1565516, -376347, -1359357, -186294, 2080375, 3554086, 182536, 2956011, --3302830, -2165737, -1724429, 1302449, 2372433, -3148211, -1334124, -1400696, 372588, -1697586, -1362578, -200253, 1168768, 2308008, -80531, -3347927, 4810364, 4874251, 1851668, 175557, --2252174, 12885, -1235877, -363998, -276489, 5388037, -25176562, 22930294, 16418586, -6961605, --5907191, 6054830, -132607, 380641, 10844256, 7621420, 132070, -1811939, 4254165, -2751464, --1785633, 2927557, -5134634, 6025302, 4068408, -5347771, 6507413, -904628, 1617055, -671089, --11201812, -797253, 7828115, 8126615, 3072512, 3377455, 4267050, -5312338, -6678674, 2621541, -4804995, -389231, -2694018, -5839008, 2163590, -1839857, 6891275, 8155069, -1118839, 9429064, --5186173, 10528575, 5614596, 12727062, 744640, 1706713, -3902515, -5450851, -1186485, 9727564, -15988016, 803696, 12141873, -5491653, -12013024, 1407139, 4279935, -10514080, 10590316, -3737159, -3623879, -22950694, -9981504, -319975, -5658083, 4239133, 7348152, 15649787, 3112778, -51003, --7932268, -13916768, 3365644, 424665, -11720429, 4563403, 2315524, -8493835, -2547989, 1825898, -8936753, 42950, 2574833, 2627983, 4570919, 3739843, -7898982, 2586644, -318901, -1695438, --12885, -540629, -1420024, 3122978, 2923262, -3376381, -1507534, -203474, 2035278, -1390496, -2980707, 315143, 2121714, 1899449, -2696166, 1739462, 2127620, 5795522, 359167, 3245385, -3541738, 766115, 4189204, 1434519, 2072322, 853625, 368830, 1432909, 4952634, -2345052, --4916664, 1006096, 5745056, -10121090, 16269336, -7567196, 1600949, 12050068, 12498355, -1369558, --7811472, -4394289, -4328254, 535260, -9976672, -8024610, 7632694, 1591285, 4768488, 5860483, -7043210, -3753802, 4434554, -2254858, 5388037, 23613730, 5281199, -12030203, 10878078, 12490302, -184147, -2575370, 306553, -6841346, -9192304, -5062156, 12812424, 8405788, 6930467, 10762114, -1903744, -2387465, -5523328, -14702210, 6235756, 7052337, 3807489, -2721399, -2125472, -5380521, -1621350, 11126113, 7632694, -13760001, 8420820, -11678016, 11456288, 2041720, 4068945, 4798016, --2327336, -6817724, -2275796, 4265977, 20087026, -3745748, 9861782, -5034776, -9584756, 10351408, -9425306, 1976222, 1894081, 9333501, 3103114, 69793, -1458678, -6769406, -2264522, -9695352, -2614561, -7646653, -3898757, 13957033, -1096290, -135828, -40802, 6146635, -2509335, 1455457, -4096325, 6185290, 6949257, 5517959, 2054605, 2635499, 3005403, 5538361, -1261110, -5426155, -6571300, 2171106, 3483219, 3612604, -136365, -1061931, 119722, -3619047, 1582696, 5945309, -426276, 245350, -1680943, -3025805, 5152350, 5264556, 836982, 9793062, -1592359, 3871913, -7664906, -115964, 1914482, -1785096, -3344169, 180926, 1437203, 2236067, 5444408, 1846299, -4007741, 933082, 743029, 5299453, -1248225, 469762, 4264903, 708670, 1113470, 229244, -1831267, 5906, 2610803, -595390, 1875827, 231928, 8437463, -4363687, 8580808, 10967199, --12723841, 8449811, 4881231, -3145527, 739271, 5780489, -5346161, -11280195, 16764331, 3536369, -3180423, 3040300, 9942312, 2802466, -10069014, 10616622, -14422500, -16932908, 1474248, 1905892, --9304510, -3166465, -27521614, -19604378, -14676440, -5086852, -15094663, -7566122, 5724655, -13705778, -9525701, 8613557, -11040750, 14119705, 7625715, -2943663, -1417339, -7540352, 343061, -13346074, -28962038, 8295193, 4540854, -14612016, 3554086, -4633733, 19228568, -4038880, -454730, -17695802, -17187386, 957778, 6766721, 5368709, 10054518, 5466957, -3816079, 5527086, -8464844, 8454643, --3058017, 4893042, -13581760, 30722974, 4804458, -14566918, 7874823, 8809515, 7157563, 10298258, -9086540, -14169097, 11214696, -518080, 9069360, -7296613, 2778844, -18180596, 7663296, 7557532, -2396055, -4565550, -13427678, -1145683, 9422085, -12309913, -1498407, -1699733, 93416, 3398930, -2951180, -3001109, 5380521, -597537, -2386928, 3823595, 3347927, -4073240, -2855617, -8175470, --302258, -7633768, 4591857, 903017, 939524, 5423470, 9084393, 5287642, 4394826, 2476586, --2927557, -1584843, 328028, -6068789, -4473746, -1675574, -1657321, 2717641, 7467875, 1896228, -4830228, -1422171, 193810, 1889249, 71941, 1541356, 5760088, -22425634, 6215355, -3121904, --2236067, 13221520, -2502355, -2319819, 1228361, 11832635, -3156801, 6878927, -5866926, -6897718, --8809515, -11143293, 19202798, 9992778, 6927246, -6102612, -17707076, -21701396, 10361072, 7133404, --7746511, 5111548, -5284958, 468688, 19108310, 8328479, -5498095, 10296110, -3554086, 5322002, --6449967, 6446209, -14222247, -20855288, -8150774, -9325985, -1641751, 24314884, -19889994, 11424613, -6524592, 4938676, -4444755, 9548786, 4217658, -19073412, -24276766, -8653822, -11106785, 27382028, -19812684, -6675453, -12290586, -1052804, -12611098, -2683818, 19894826, 18452254, 10423349, -16335908, -3459059, -12766790, 19945828, 9473087, -2178085, 40802, 6673843, -11848204, 2595234, 17625472, -9526774, -15994995, 17287244, -8879845, 10306311, 27521076, 10454487, -6509023, -8218420, 23551990, -2538863, -1457068, -10769630, 4134443, -5108864, 1498944, -3212636, -572304, -759136, -11756399, -1421634, -1475321, -3407520, 5151814, -971200, -4163971, 688805, -2477659, 593242, -3071439, --4633733, 4064650, -5130339, -3246459, 2342368, 6128919, -365609, 4330401, 3510062, -811749, --78383, -5897527, 750009, 2007897, -5060545, 6718403, 3250753, -4076998, -2804614, -2838974, --1331440, -6570763, 3841312, 6275484, 229781, -4879083, -2907156, 3280818, -1480153, 3160559, -4352413, 364535, 1571421, 61740, -15569, -18072686, -7261179, 29464550, 13480829, 16852914, -3885872, -25027312, 7343321, -20361366, 12896713, 36901824, 12926778, 23042500, -10806138, 6442988, -10544145, -1415729, 2499671, -9839233, 2134599, 14332306, 475131, -4195646, -13504451, 6975564, -5158793, -13752485, 6724308, -5405753, 10002979, 14409078, 15336254, 18539226, 1596654, -14900852, -3657702, 8604430, -457951, 25348360, 1963874, -29770028, -18787798, 8092256, -7792682, -35081292, -970126, 14532559, 5180268, 1260036, -3457449, 18028126, -14689325, -18146236, -3740380, -6687801, --17668422, -1261647, 978716, -10418517, -15254113, -9461813, 444529, 1866700, -21905406, 6154152, --9303973, 4954245, 24656870, -3709241, -8966281, 17083770, -3316252, 14172318, -14002667, 9043591, -319975, -16173236, -18009334, 31670016, 2820720, 4011500, 1224066, -275415, 31768262, 25885232, -7987566, -2723009, 12279848, -6470905, 3999688, 7180649, -1676648, 9534827, 3945464, 2553895, --14896020, 8374113, 4373888, -1138703, 1037772, -5265630, 3917547, 10991895, -2161442, -3997004, --6568079, -7178501, 6517076, 7700340, 147103, -294205, -6475200, -6973417, 900333, -9872519, -1068910, -3508988, 9714679, 3226057, 145492, -6645388, -11317776, -2851858, -5639292, -7773891, -4000762, 4100083, 8291435, 3042984, 978716, 9425843, -1443109, 25322054, 3419868, -34316788, --15446313, 21547314, -30687004, 17681844, -29036126, 2535641, -4520990, -42033772, -5424544, 19164680, -38973072, 12542378, -5512054, 9603547, -14769319, -4818417, -33757908, -1706176, -22891638, -3133179, --4920422, -15721728, -16761110, -5419175, 9812390, -15097884, 10644003, 19588808, -19885162, 7442105, -6559489, 3628711, -21175800, -3050501, -123480, -22086870, 5905580, 28591598, -2065342, -41008884, -14683956, -24685862, -63466196, 18132278, -26201984, -32469952, 1817845, -14751065, 4610111, 11452530, --6192806, 16954920, -13921600, 14840186, -11479374, -28216324, 225486, 20577726, 19565724, -36727340, -5488432, -4188130, -27464706, -7124277, -6773701, 48110076, 23940148, 28322088, 12829604, 12455405, -29657822, 42805792, -9689983, -19918448, -21982716, 4112431, -27321360, -8160438, 14165876, 23245974, -3238942, 2344515, 19966766, -4363150, -11331197, -15149960, 12021077, 13907104, 13390634, 3396246, -15357729, 6645925, -9453760, -1823214, -9163313, 14297946, 2230162, -1363652, -15770046, 5050882, -12557411, 1665374, 184684, 12600360, -9890773, -6288906, 6750078, 984621, -5034239, -9176198, --3104188, 14788109, -788127, -31790274, -3075197, -492848, -7453916, -5952825, -8585640, -4888210, -6876780, 6568079, 3598646, 2534568, -5408438, -628139, -6645925, 55730420, 60240136, -35342748, --14003741, 26911192, -12198781, 10869488, -16782584, 5043902, -17246442, -32266478, 43992276, 6445136, -13805636, 11348377, 4104378, 5814312, 1302449, 8953396, 10909754, -31209380, -25789668, -22528714, --21340082, -15919833, -10095858, -8293582, -16793322, -9444633, -14242648, 16194711, 12227772, 6258841, --7877507, 3332895, -33121178, -16558710, 8931384, -29992830, -2845416, 14682883, 25868588, 3860639, -4949413, -11038603, -19487340, -22826140, 18297634, -2426120, 18108656, -64107756, 3908420, -7397008, -7282117, 39302708, 4707284, 6614787, 4308926, -11426760, -13341779, 427886, -2740189, -35959076, -7592966, -13145284, 32172526, 2224256, -35558036, -48127792, -30106110, -6016176, -34013992, -33076080, --20740398, 23444616, -6238977, -22758494, -30971546, 25789668, -3510062, 15287399, -17527224, 9405442, -25141128, -16777752, -24651502, -10194642, -12850005, 26586384, 5340255, -11571716, 10190884, 7839926, -22810572, 14381698, 6436009, -20444582, -20726438, -4440996, 2087891, -5316096, 3376381, 14262513, --3441880, -1152125, -10721849, -7563438, -6019397, -10758356, -2410551, 4465692, 6134824, 33549600, -1835025, -8382166, -3085934, 4503273, 10042170, -594853, 16136192, 6962679, 37832220, 5933498, --786516, 1391033, 6489696, 1879585, -1802813, -10962367, -16832514, 62400508, -36721972, 23473070, -44129716, -21665962, 5994701, 35179540, -45254460, 1464584, 4764730, 21551072, -50709068, 2473901, -3134253, 16253767, -22271552, -54224, 8781598, -30004104, 4164508, -2592550, -5792837, 15993921, --5152350, -4821101, 6662031, -4236449, -5286568, 15673409, -15208479, 4065724, -6403260, 3739306, --9823664, -5673652, -11927661, -192200, 2050847, 30991410, 10201621, 14872398, -3390877, -10201, -23021024, -1351841, -9007083, 12662100, 9392557, -10848014, -30633318, 27504434, -30529702, 4583804, -14351633, 18733574, -30043296, 31495532, 51034948, -28397786, -52266532, 69302520, 24443196, -34812320, -15729244, -33530810, -41322416, -20912196, -7703024, -43380244, 34613680, -60317448, 17818746, 28182502, --23953570, -80507552, 75587128, -13598403, -19697794, 50057844, -50485728, 25574382, 42925512, -13356275, --11979738, 12938589, 14642617, -8533563, 5181341, 3966402, 13506598, -7198365, -5118528, 14823543, --186294, 2954938, -1767916, 2393371, 12082280, 8562554, -1805497, -11410654, 17777944, 18882824, --3810173, -17168594, -1910187, 7701413, 1639067, 11420318, -79457, 9919764, 4293357, 14787572, -11197517, 12328704, -19254338, 4363150, -501974, 216359, -56371, -12241194, -20783346, 29647622, --5007932, -28541132, 10035728, 6178311, 2797634, -5219459, -19429358, -15075872, 34979824, -22874996, --18271864, -36584532, -16787954, 21935472, 17039210, -9671193, -12106976, 11741904, 29027000, -12305618, -21922050, 26248692, -18438832, -2538326, 16057272, -4008278, -537, -5151814, 1470489, -26561152, -7385197, -5792301, 972273, 6556805, -5302137, 5635534, -11011222, -22222698, -10516227, -38788388, -4929012, 48318, -5748814, 7354058, 3765613, -2400887, -8816494, 15782931, 24774446, -25840134, -38036768, -4142496, 5121749, 5646809, 33625836, 15552077, 24617142, -30688078, -7600482, -5636608, -43814036, -40697500, -13911399, 20118164, -1430761, -47016472, 3235184, -9577777, -8028368, 21689048, -23638426, 1813550, -17678622, 38270844, -16022912, 63719060, 871878, -29329794, -9127, -4959077, --33339684, 64020784, 12860743, -9359807, -75572632, -37613176, 21323438, -27660664, -25024090, 29773250, --110795120, 2964601, 21859236, 16205448, -8944806, 31338228, -19050864, -2299955, 163746, 16407312, --4595078, 3492345, 22100828, -1365263, -5555004, -6812892, -7932268, -173409, 2488934, -1293859, --3333432, 14448270, -19973208, -4304094, 2384781, 3512747, -11964168, -20069846, -5148055, -6037114, --2894808, -1508607, 3922379, -22284438, 1726577, 17216376, -10616622, 13205951, 9984725, -9613211, -606664, -6991133, 2830920, 4967130, -10479183, 29603062, -14297946, -13012140, -17047262, -15463493, --7722888, 13899051, 18979998, 11448235, 47673600, -9571335, 10555956, -4927401, -25082072, 12076374, --16097537, -9233643, 9587978, 21185464, -23011898, 24459302, 2546379, -1598802, 50272592, -10623065, --5919002, 37553584, -24533926, 33130840, 14156749, -8296803, 13064217, 13743895, 30954366, 32119376, -9150965, -26744224, 54912232, -55746528, 1583232, 50013820, -27403502, 10781442, -6259915, -6911140, --58653148, 39257612, 10212895, 17210470, 18321256, -12519293, -29327648, -22245246, -17973902, 2367064, -55206436, -26844, 43247636, -14880451, -33742336, 1431298, 12257300, -27917288, 44395468, 17742510, -21691732, 43670152, 28307056, -47604880, 17755932, -68102072, -83837224, 1314797, 70164736, 43707196, -5465346, -50248432, -178121424, -33159296, 54786064, 62402652, 88866096, -4987531, -113190640, -64191508, --59064392, 89855544, 68834904, -12940736, -45348948, -26896158, -55100136, -7493108, 70536248, -7354058, -16355772, 11316702, -11784317, -26124138, 38368016, -16149614, 21330418, 15255187, -1633161, -36316096, -48924508, -19881940, -9429064, 13684303, 12583180, -27105538, 294742, -8869107, -10166724, 2836826, --1090922, 19102940, -35236448, 18044232, -42374684, -7246147, -7159174, 49661096, 1389959, 13050795, --30758408, 15442555, -11616813, 21604222, 26476862, -13448079, -30566208, 10376641, 7842074, 25085294, -21161840, -5706401, -8346195, -4319664, 17398912, 2731062, 17534204, 7287486, -43545600, 36702108, --27358942, -4665945, -17697412, 17106318, -19891068, -762894, -2046552, -5321465, 4139812, 18850074, --19769734, 8815420, 1593970, -4486094, 311385, 13332115, -16717086, -4472672, -2427730, 27584428, --27796492, 7494718, -12173548, 18324478, -20295868, -5653251, 6975027, -3805341, 3862249, -13007308, --2321430, 12017855, -3610457, 4729833, 3764539, 2629594, 14854681, -13622563, 9313637, 10869488, -13253195, -1708860, -30802432, 4101694, 3638911, 12700218, 11431055, -2078227, 3046206, -5020280, --14024679, -2214056, 6386080, -2466385, 18664854, -15047955, -5076652, -30197378, 9030169, 3464965, --4835597, 6972343, 5878737, -249645, -15742129, 5080947, 15273977, -2790655, -2295660, 6223408, --6251325, 11650099, -7131257, 2148558, -14477261, 7024419, 2646774, -2079301, -4023311, 8557185, --4076998, -5832029, -8776229, 9298067, -459562, -4330938, -2040110, 9262634, -3673808, 4226248, --5111548, -2780991, -579821, 564788, -206695, -4725001, 427349, 403190, -4307316, 4531728, --4098473, 12063489, 1743220, 1845762, -16481937, 4883915, -468688, -6246493, 7259569, 14136348, --10194642, -1973001, -540092, -6930467, 10819023, -1523640, 1399623, -6933151, 3613141, -1231582, -1166621, -4300336, 4214437, -4287988, -24865176, 60288456, 16434692, 14898168, -7972533, -19297824, --18568218, 5274220, 11705396, 1850057, -687732, -61203, -8807367, -1598802, 4233227, -2330557, -1822677, -938450, -8823473, -454730, 4369593, 6891275, -6141803, 1696512, 4410932, -8787503, -14430553, -8756365, -7647190, -7589207, 1970853, 4227322, 6694244, -7300371, 9339943, -13451838, -8916889, 7963406, -5929739, -602906, -432181, -1537598, 6948184, -7475391, 2178622, -2382096, --9689446, 13734232, -7672422, -247497, -5686000, -1763621, 9560597, -12475269, 5077188, 3476239, --5462125, 4602595, -10662793, 3106335, 4424890, -7900593, 181999, 4268661, -7330436, 7366943, --10116259, 2821794, 10347650, -15143518, 4352413, -5775658, 1035624, 5973226, -4538170, -2301566, -1060320, 1315871, -917512, 4275640, -3249680, -2775086, 2065879, -2479270, 1350230, -943819, -1778653, 1698660, -2460480, 1245541, -476741, 2221035, -2033130, -550830, 1473174, 65498, --1181116, -3506841, 2218351, 2354179, -540092, -2419677, 2311229, -103616, -1107565, 2409477, --5032628, -1004486, 2825015, -3604551, 5251135, -3213173, 233002, 8750459, -2554969, 6307697, --3592203, -335007, 6932077, -4855461, -1849520, 9045201, -46580532, -109298864, 30946314, 107009648, -73595872, 116361936, -64772400, -68946576, -94017904, -108833936, 2345052, 83985400, 86769080, 90589984, -17790828, -29925184, -59389196, -85243288, -72248864, 5636608, 56138980, 66588636, 59915332, 14341970, --16546362, -10331544, -46770048, -52313776, -22064858, -1418413, 20133732, 44126492, 21559126, 16010027, -22106196, -11028402, -26233660, -4290673, -41945188, -19674708, 469225, 6664716, 31980864, 37235220, -3310883, -5636071, -3490735, -27469538, -7437273, -381178, -5710159, 9514963, 18402862, -3919695, --1453310, -7217693, -11481521, 2359011, 1140314, -1251446, 20763482, 14055280, 5196911, -526670, --19572166, -28302760, -22379464, 1618129, 21070036, 18087182, 23737748, 3230352, 620623, 5399848, --29453276, -16764331, -13848585, -2516851, 22604950, 5113159, 7585449, 21088290, -12167642, -17702782, --4119411, -3020973, 6539088, 7603703, 2379412, 4246112, 1860258, -10866267, -11260331, -2744484, --2147, 8100845, 11720966, 3848291, -1654636, -2542084, -3333968, 2939368, -3287798, -13817447, --2168422, 3262028, 6405944, 13765370, 3352759, -2849711, -6612102, -11311870, -2474438, 1145146, -3689914, 6477885, 8087961, 6374805, -3264175, -9800578, -10334228, -9014063, -1032940, 4493610, -4971425, 13299366, 13650480, 6658810, -2946348, -16777216, -17749490, -8223252, -6220724, 6276021, -16569984, 12283070, 5309654, 72478, -1319092, -2157684, -5069135, -8332237, -8016020, -3419331, -1175747, 3473555, 5557151, 8075613, 7699803, 2952790, -2989834, -6476811, -7013145, -5205501, --1972464, 1068373, 2479270, 2449742, 2974802, 3425237, 2632815, 74088, -2011655, -3477313, --2837900, -1035624, 598074, 1379758, 238371, -153545, 243739, 357556, 1023813, 1087701, --36507, -1146756, -477815, 893353, 228707, -1025960, -842350, -139050, -695248, -1144072, --183073, 2070711, 2803540, 870805, -689342, -1047972, -746251, -474057, -807454, -1125818, --443455, 791348, 1271847, 716723, 583042, 700080, 132070, -448824, -947577, -966905, --679679, -226560, 466004, 782758, 572841, 466004, 233539, -126165, -473520, -655519, --499290, 16106, 340376, 379568, 280784, 84289, -178241, -394063, -279173, 42413, -195421, 209380, 202400, 88584, -103079, -182536, -114354, -53687, -13959, 30065, -41339, 28991, 13422, -5369, -20938, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-4846334, 6116571, -1204202, 4890894, 1455457, 7255274, -1642825, -3696893, -2532420, 4446365, +163209, -1569274, -387084, 5022428, -1286880, 940598, 1791001, -3316252, -2508798, -1058173, +961536, -3444027, 926102, 738734, -3986804, -1278827, -2368675, 370441, -1719061, 673773, +6613176, 3397319, -1879585, 339839, -3078418, 2421288, -797253, 3908957, -8016020, -860067, +1288490, -2844342, 558346, 3928821, 3023657, -3605625, -2640331, -2894808, -499290, -2290828, +-1130650, -3520800, 1394254, -295816, -4051765, -2105608, -1610076, -192737, 887448, -881542, +-381715, 1772748, 740345, -1921998, 1056562, 4371740, -2195265, -569620, -4646081, -1780264, +-321049, 1948305, -1939178, 570694, 834834, 657130, 1557463, -3618510, -77846, -2038499, +1762010, -1304060, -3451006, -991064, -66035, -57982, -1500017, -1623498, 1744831, -766115, +-270046, 630823, 1037772, 47782, -185220, 193274, 635118, 38655, -343597, 775242, +184147, -678605, -575526, 723165, -213138, 260382, -419296, 651761, -559420, -395674, +-54761, -135828, 276489, 7499550, -2850248, 2417530, 6265821, -5143224, -5794985, -880468, +-1471563, -102542, 3176128, 1754494, -8043400, 1219234, -4628364, -6356552, -439697, 2286533, +2476586, -2095944, -299574, -709207, 3410741, -746787, 2799782, -1356673, 298500, 587337, +831076, -4038880, 1654636, 3063386, -1482301, 3913789, -2216203, -464930, -4962835, 3472481, +856309, -1338419, -3854196, -3826816, -1749125, -1330903, 1888712, -454193, 1627256, 1599875, +-3419868, 2078227, -4584878, 1594507, 2630668, 4996121, 4823249, -4215511, 2047626, -306016, +-1127429, 2907693, -2270964, -2723546, -2041183, 2362769, 1176284, 3091303, -3134789, 4675072, +-1549410, -280247, 1401770, 739808, 2748242, -2136746, 3923990, 4933844, 8690329, 3999688, +2753074, -5187247, -956704, -3401077, -2443837, 3119220, -430034, 3863860, 1583769, -357019, +-795106, -725313, 2244657, -1757715, 1787780, 2082522, -1692754, 971200, 768262, 177704, +1277216, -845572, -246961, -1735704, -99858, 93952, 870805, -9277666, -9980430, 1080721, +-867047, 2310156, 2151242, 6506876, 2913599, 3082176, 1534377, -3256659, 1184337, 8235600, +-5587753, -668404, 204011, 6602976, 3948149, 881005, 2897492, -571231, 2226404, 3020436, +6762963, 3732864, 3775276, 2013803, 1589138, 3279745, 1153199, -4791036, 2865817, 3883187, +-1446330, 2813204, 3715147, -1351841, 1135482, 4665945, 1688996, -1169842, 1641214, 4764193, +-294205, -86973, -994285, 1283658, 4449049, -1361505, -2583960, 1268089, -1605781, 2346126, +2775086, -3377992, 671626, -2192044, 126165, 1342714, 3736622, 3087008, -8010651, -43487, +3851512, -2052994, -3367254, 422517, 561567, 3897683, -376347, -8518531, -3762928, 2729452, +-2411087, 3981435, -1161789, 1611, 966905, 5000416, 3098819, 2110440, -2633352, 4105452, +-543850, 2508798, 1190780, 483721, 813359, 845035, -114890, -673236, 501437, -369367, +-2111513, -885837, -898722, -272730, -526670, -17717, -674310, -1499481, 688805, 306016, +-810138, 161598, 1349694, 1018981, 432181, -204548, -289373, -153545, -128849, 1323924, +-16643, -16726213, 2426657, 1808181, 7906498, -228707, 6188511, 3215320, 1627793, -9767829, +81604, -73014, -7570954, 1301912, 5776194, 1165010, -45097, -640487, -2982855, -3412889, +1622424, 2335389, -207769, 1586454, 1817308, 6944425, 847182, 3122978, 3263102, -3513820, +836982, -762894, -934155, -373662, 2585034, -304406, -1662689, -2662880, -1590212, 968515, +-4829154, -3382287, 2113124, -3797288, 1324461, -6293738, -7590818, -1860258, 9505836, -2408940, +-506806, 5670968, 1920387, 503585, 6018323, -753230, 715649, -664109, 1797981, 3929895, +-1454383, -5873905, 3859565, -3384434, -6578816, -2543695, -1808718, 89121, 2479270, 7270306, +91268, 26307, -2765422, -166967, 4273493, -1901597, -2148558, 5217312, -4283156, -229781, +2379412, -5128728, -987843, -1709397, -1733556, 689879, -2767570, -3840238, 277025, 2557653, +-1105417, -1594507, -2204929, -2149631, -285078, 1744294, 765041, -108985, -633508, -1644436, +110595, -472446, -2122251, -3041374, -2671470, 82678, -322659, 1398012, -2075543, 22012, +-285078, 1140851, -144955, 562641, -610959, 127775, 343597, -945430, 14867029, 397284, +-1002338, -5767068, -3359738, 7803419, -3292093, 6072547, 5207648, -6112812, -1078574, 4532801, +-3469797, -1715839, -1674500, -2271501, 892816, 1572495, 184147, 2801393, -1413581, 368830, +988379, -1293322, -2932926, -3034931, -3438121, 184684, 3791919, 1615982, -3396782, 229244, +1433982, 7353521, -2303713, 6576132, -6159520, 2668249, 4693326, -3237869, -2034204, -6251325, +2814277, -132070, -4440996, 4228932, -5481989, 5963025, -434329, 8469139, 1857573, 865436, +1959042, 3490198, 1789928, -2821794, 4103841, -845572, -4603131, -7093676, -2024003, 2924336, +-3635153, -2345589, 2633889, -3991098, 7602092, -7477001, -149250, 4906464, -4351339, -1736777, +-7899519, -636192, -3166465, -1759863, -2455111, 6682969, 2529736, 635118, 156229, 5760088, +452582, -548682, 4532801, 3783329, 3366718, 7169374, -1666447, 656593, -2160906, 1992328, +2250563, 438624, 566399, -1264868, -180389, -1771137, -993748, 122407, 519154, 1102733, +-704375, -296353, 2180770, 1034013, -1006633, 4430259, -386010, -1156957, -1980517, -1246614, +1494112, -1580548, 5906, -230318, -1720134, 648540, 326418, -470299, 978716, 1137093, +-1349157, 1181653, 1974611, 7182796, 12743168, -3771518, -5601711, 1430224, -2309082, 3491272, +11596412, 39728, -2715493, 3660923, 1964411, 3414499, 2051384, -6361384, 199179, -5679558, +3112778, 2705830, 1627256, 10610717, -546535, 7904888, -246424, -219580, 2375654, -89657, +8308078, 1081795, 5216775, -1962800, 7080254, -3230352, 3757023, 14084808, -2346663, -3579318, +9903121, 2075006, 6437082, -175020, -6224482, 1911797, -3608846, 4247723, -7492034, -1009854, +-3914863, 4189741, -675384, 855235, 7638600, -3744138, -7767985, 2154463, -711354, -372052, +6202470, 1201517, 843961, -2823404, -5127117, -5389647, -1847910, -4449586, -3406983, 4602595, +-2366527, -439160, -1731946, 542240, -25233, 4112431, 2522220, -4704600, -6845104, -1584843, +167504, 1879048, -1903207, -1660542, 5533529, 3193845, 2699924, 821949, -4600447, -2090039, +2409477, 120796, -1554241, 2005213, -679679, 1230508, -1531693, 138513, -900869, -2560874, +-3116536, -790274, -2763812, 741956, -456340, 293132, 1803349, -466004, -1507534, 2313914, +438087, 1488743, 799401, 177704, -904091, 1164473, -338229, -222265, -139586, -209380, +43487, -427886, 580894, 1491964, -1829656, 527207, -2147484, 371515, -1068910, 2673617, +17445620, -9300752, 6061810, 145492, 2941516, -4332012, -3410741, -2026151, 3723200, 4814659, +953483, -2790118, -5188858, 2567317, 4760435, -1047972, 1433982, -2695092, 5198521, 1858110, +-10021769, -3365107, 3111167, -682363, -4309463, -302795, 4434017, -3421478, 1448478, -6564321, +3684545, 8064338, -3467112, 8535711, 208843, -1681480, 5672578, -357019, 360240, 5097590, +-11329050, 1578401, 3325915, 4672925, 3150896, 3624953, -5128728, -4026532, -258235, 1678259, +-5546951, 1690070, 5231270, 4651450, 1686312, 14442901, -4667019, -1946157, -6671695, -2946885, +-4400731, -6184216, 7425462, 3006477, 7250979, -1271310, -11805254, 6701223, -4217121, 3624416, +3286724, 1508607, 1947231, -9393630, 10900627, 2263985, -5162551, -9021579, -5644661, -5703717, +704375, 4402342, -4212289, 207769, 2717641, 2244121, -68719, -2070711, 383326, -337692, +1660542, 1701881, 1912871, 1235877, 1240709, 535797, -3302293, -3049427, 70330, -1217623, +987306, 1165010, -1571958, 1949378, -579821, 610959, 1671279, 592169, 1282048, 240518, +-3505767, -401579, -113817, 1047435, 825171, 249645, -845035, -1095754, 1792075, -715649, +4460861, 607201, 1891396, -20812338, -17487496, -16105590, 3848828, 3562675, 1574106, 944356, +-957778, -1057636, 643171, -2570001, -5714991, -3901441, -10159208, -4363687, -4826470, 6409702, +-7762617, -3310346, -4306779, 1554241, 292595, -1848983, 2524904, -472983, -8070244, 51540, +7789460, 1200980, -7178501, -6300717, 3049427, -2415382, 6568079, 4701916, -6773164, 7105487, +11060078, -8882529, -9131100, -4763119, 3622805, 8861591, -5956583, -6134287, 3462818, -3445101, +867047, -588947, -598074, -9676561, 2086280, 6229313, -2886218, 3666292, -4733591, -5624797, +-5623186, -2644089, -9826348, 17393006, -3446711, -921271, 3187403, 2104534, 3845606, 2575907, +5543192, 2684355, 4837207, 10860899, -13517336, 9833328, -3081102, -2362232, -282394, -15052787, +-512175, 4927401, 612033, 850404, 4461398, 1813013, -192200, 2793339, -4985384, 6239514, +-1978906, -3233037, 3435974, -1866163, -1727651, 868657, 2838437, -1789928, -3062312, 1363652, +2759517, 361851, -919123, -2568391, -1372242, 654446, -3818763, -2408403, -1213328, 2176475, +-722628, 412854, 2292976, 307090, -3804267, -635118, -3212636, -2745021, -2665564, -1481764, +-2964064, 2943663, -758599, 456340, 5898064, -856846, -1560684, -1261110, 3273839, 1063004, +-881542, -852551, -20667382, 15853261, 4202089, 3463891, -3825742, 15520938, -2441689, 7320772, +-24159, 6589554, -9235253, 3670587, 3615289, 1431298, -4549444, 13826573, -3752728, 4230543, +3164854, 14352707, -9681930, -602906, 3970697, -2463701, -7111392, 4311074, -6692096, 1757715, +1806034, -7802345, 3010235, 677531, 368830, 15797427, 9826885, -1280437, -6477885, -4998805, +3486440, -795643, -9483825, 2727304, -865973, 2830920, 7080254, 10531797, -7237557, 7179575, +3528316, -4672925, 3364033, 2797098, -7490423, -3971771, -4714801, 7563438, -8163122, -6831683, +-18648212, -13565117, 3723737, -2495913, -2731062, -7097971, -14487462, 5602785, 1051193, -356482, +7006166, 6091874, 8436926, 5121749, 1990181, -167504, 1291175, 9687299, -7169374, 13239237, +-4911295, -3645890, -12095165, 2004139, -2284923, -6037651, -1165547, 1556926, -3105798, 3597572, +-1537598, 251256, -1565516, -376347, -1359357, -186294, 2080375, 3554086, 182536, 2956011, +-3302830, -2165737, -1724429, 1302449, 2372433, -3148211, -1334124, -1400696, 372588, -1697586, +1362578, -200253, 1168768, 2308008, -80531, -3347927, 4810364, 4874251, 1851668, 175557, +-2252174, 12885, -1235877, -363998, -276489, 5388037, -25176562, 22930294, 16418586, -6961605, +-5907191, 6054830, -132607, 380641, 10844256, 7621420, 132070, -1811939, 4254165, -2751464, +-1785633, 2927557, -5134634, 6025302, 4068408, -5347771, 6507413, -904628, 1617055, -671089, +-11201812, -797253, 7828115, 8126615, 3072512, 3377455, 4267050, -5312338, -6678674, 2621541, +4804995, -389231, -2694018, -5839008, 2163590, -1839857, 6891275, 8155069, -1118839, 9429064, +-5186173, 10528575, 5614596, 12727062, 744640, 1706713, -3902515, -5450851, -1186485, 9727564, +15988016, 803696, 12141873, -5491653, -12013024, 1407139, 4279935, -10514080, 10590316, -3737159, +3623879, -22950694, -9981504, -319975, -5658083, 4239133, 7348152, 15649787, 3112778, -51003, +-7932268, -13916768, 3365644, 424665, -11720429, 4563403, 2315524, -8493835, -2547989, 1825898, +8936753, 42950, 2574833, 2627983, 4570919, 3739843, -7898982, 2586644, -318901, -1695438, +-12885, -540629, -1420024, 3122978, 2923262, -3376381, -1507534, -203474, 2035278, -1390496, +2980707, 315143, 2121714, 1899449, -2696166, 1739462, 2127620, 5795522, 359167, 3245385, +3541738, 766115, 4189204, 1434519, 2072322, 853625, 368830, 1432909, 4952634, -2345052, +-4916664, 1006096, 5745056, -10121090, 16269336, -7567196, 1600949, 12050068, 12498355, -1369558, +-7811472, -4394289, -4328254, 535260, -9976672, -8024610, 7632694, 1591285, 4768488, 5860483, +7043210, -3753802, 4434554, -2254858, 5388037, 23613730, 5281199, -12030203, 10878078, 12490302, +184147, -2575370, 306553, -6841346, -9192304, -5062156, 12812424, 8405788, 6930467, 10762114, +1903744, -2387465, -5523328, -14702210, 6235756, 7052337, 3807489, -2721399, -2125472, -5380521, +1621350, 11126113, 7632694, -13760001, 8420820, -11678016, 11456288, 2041720, 4068945, 4798016, +-2327336, -6817724, -2275796, 4265977, 20087026, -3745748, 9861782, -5034776, -9584756, 10351408, +9425306, 1976222, 1894081, 9333501, 3103114, 69793, -1458678, -6769406, -2264522, -9695352, +2614561, -7646653, -3898757, 13957033, -1096290, -135828, -40802, 6146635, -2509335, 1455457, +4096325, 6185290, 6949257, 5517959, 2054605, 2635499, 3005403, 5538361, -1261110, -5426155, +6571300, 2171106, 3483219, 3612604, -136365, -1061931, 119722, -3619047, 1582696, 5945309, +426276, 245350, -1680943, -3025805, 5152350, 5264556, 836982, 9793062, -1592359, 3871913, +7664906, -115964, 1914482, -1785096, -3344169, 180926, 1437203, 2236067, 5444408, 1846299, +4007741, 933082, 743029, 5299453, -1248225, 469762, 4264903, 708670, 1113470, 229244, +1831267, 5906, 2610803, -595390, 1875827, 231928, 8437463, -4363687, 8580808, 10967199, +-12723841, 8449811, 4881231, -3145527, 739271, 5780489, -5346161, -11280195, 16764331, 3536369, +3180423, 3040300, 9942312, 2802466, -10069014, 10616622, -14422500, -16932908, 1474248, 1905892, +-9304510, -3166465, -27521614, -19604378, -14676440, -5086852, -15094663, -7566122, 5724655, -13705778, +9525701, 8613557, -11040750, 14119705, 7625715, -2943663, -1417339, -7540352, 343061, -13346074, +28962038, 8295193, 4540854, -14612016, 3554086, -4633733, 19228568, -4038880, -454730, -17695802, +17187386, 957778, 6766721, 5368709, 10054518, 5466957, -3816079, 5527086, -8464844, 8454643, +-3058017, 4893042, -13581760, 30722974, 4804458, -14566918, 7874823, 8809515, 7157563, 10298258, +9086540, -14169097, 11214696, -518080, 9069360, -7296613, 2778844, -18180596, 7663296, 7557532, +2396055, -4565550, -13427678, -1145683, 9422085, -12309913, -1498407, -1699733, 93416, 3398930, +2951180, -3001109, 5380521, -597537, -2386928, 3823595, 3347927, -4073240, -2855617, -8175470, +-302258, -7633768, 4591857, 903017, 939524, 5423470, 9084393, 5287642, 4394826, 2476586, +-2927557, -1584843, 328028, -6068789, -4473746, -1675574, -1657321, 2717641, 7467875, 1896228, +4830228, -1422171, 193810, 1889249, 71941, 1541356, 5760088, -22425634, 6215355, -3121904, +-2236067, 13221520, -2502355, -2319819, 1228361, 11832635, -3156801, 6878927, -5866926, -6897718, +-8809515, -11143293, 19202798, 9992778, 6927246, -6102612, -17707076, -21701396, 10361072, 7133404, +-7746511, 5111548, -5284958, 468688, 19108310, 8328479, -5498095, 10296110, -3554086, 5322002, +-6449967, 6446209, -14222247, -20855288, -8150774, -9325985, -1641751, 24314884, -19889994, 11424613, +6524592, 4938676, -4444755, 9548786, 4217658, -19073412, -24276766, -8653822, -11106785, 27382028, +19812684, -6675453, -12290586, -1052804, -12611098, -2683818, 19894826, 18452254, 10423349, -16335908, +3459059, -12766790, 19945828, 9473087, -2178085, 40802, 6673843, -11848204, 2595234, 17625472, +9526774, -15994995, 17287244, -8879845, 10306311, 27521076, 10454487, -6509023, -8218420, 23551990, +2538863, -1457068, -10769630, 4134443, -5108864, 1498944, -3212636, -572304, -759136, -11756399, +1421634, -1475321, -3407520, 5151814, -971200, -4163971, 688805, -2477659, 593242, -3071439, +-4633733, 4064650, -5130339, -3246459, 2342368, 6128919, -365609, 4330401, 3510062, -811749, +-78383, -5897527, 750009, 2007897, -5060545, 6718403, 3250753, -4076998, -2804614, -2838974, +-1331440, -6570763, 3841312, 6275484, 229781, -4879083, -2907156, 3280818, -1480153, 3160559, +4352413, 364535, 1571421, 61740, -15569, -18072686, -7261179, 29464550, 13480829, 16852914, +3885872, -25027312, 7343321, -20361366, 12896713, 36901824, 12926778, 23042500, -10806138, 6442988, +10544145, -1415729, 2499671, -9839233, 2134599, 14332306, 475131, -4195646, -13504451, 6975564, +5158793, -13752485, 6724308, -5405753, 10002979, 14409078, 15336254, 18539226, 1596654, -14900852, +3657702, 8604430, -457951, 25348360, 1963874, -29770028, -18787798, 8092256, -7792682, -35081292, +970126, 14532559, 5180268, 1260036, -3457449, 18028126, -14689325, -18146236, -3740380, -6687801, +-17668422, -1261647, 978716, -10418517, -15254113, -9461813, 444529, 1866700, -21905406, 6154152, +-9303973, 4954245, 24656870, -3709241, -8966281, 17083770, -3316252, 14172318, -14002667, 9043591, +319975, -16173236, -18009334, 31670016, 2820720, 4011500, 1224066, -275415, 31768262, 25885232, +7987566, -2723009, 12279848, -6470905, 3999688, 7180649, -1676648, 9534827, 3945464, 2553895, +-14896020, 8374113, 4373888, -1138703, 1037772, -5265630, 3917547, 10991895, -2161442, -3997004, +-6568079, -7178501, 6517076, 7700340, 147103, -294205, -6475200, -6973417, 900333, -9872519, +1068910, -3508988, 9714679, 3226057, 145492, -6645388, -11317776, -2851858, -5639292, -7773891, +4000762, 4100083, 8291435, 3042984, 978716, 9425843, -1443109, 25322054, 3419868, -34316788, +-15446313, 21547314, -30687004, 17681844, -29036126, 2535641, -4520990, -42033772, -5424544, 19164680, +38973072, 12542378, -5512054, 9603547, -14769319, -4818417, -33757908, -1706176, -22891638, -3133179, +-4920422, -15721728, -16761110, -5419175, 9812390, -15097884, 10644003, 19588808, -19885162, 7442105, +6559489, 3628711, -21175800, -3050501, -123480, -22086870, 5905580, 28591598, -2065342, -41008884, +14683956, -24685862, -63466196, 18132278, -26201984, -32469952, 1817845, -14751065, 4610111, 11452530, +-6192806, 16954920, -13921600, 14840186, -11479374, -28216324, 225486, 20577726, 19565724, -36727340, +5488432, -4188130, -27464706, -7124277, -6773701, 48110076, 23940148, 28322088, 12829604, 12455405, +29657822, 42805792, -9689983, -19918448, -21982716, 4112431, -27321360, -8160438, 14165876, 23245974, +3238942, 2344515, 19966766, -4363150, -11331197, -15149960, 12021077, 13907104, 13390634, 3396246, +15357729, 6645925, -9453760, -1823214, -9163313, 14297946, 2230162, -1363652, -15770046, 5050882, +12557411, 1665374, 184684, 12600360, -9890773, -6288906, 6750078, 984621, -5034239, -9176198, +-3104188, 14788109, -788127, -31790274, -3075197, -492848, -7453916, -5952825, -8585640, -4888210, +6876780, 6568079, 3598646, 2534568, -5408438, -628139, -6645925, 55730420, 60240136, -35342748, +-14003741, 26911192, -12198781, 10869488, -16782584, 5043902, -17246442, -32266478, 43992276, 6445136, +13805636, 11348377, 4104378, 5814312, 1302449, 8953396, 10909754, -31209380, -25789668, -22528714, +-21340082, -15919833, -10095858, -8293582, -16793322, -9444633, -14242648, 16194711, 12227772, 6258841, +-7877507, 3332895, -33121178, -16558710, 8931384, -29992830, -2845416, 14682883, 25868588, 3860639, +4949413, -11038603, -19487340, -22826140, 18297634, -2426120, 18108656, -64107756, 3908420, -7397008, +7282117, 39302708, 4707284, 6614787, 4308926, -11426760, -13341779, 427886, -2740189, -35959076, +7592966, -13145284, 32172526, 2224256, -35558036, -48127792, -30106110, -6016176, -34013992, -33076080, +-20740398, 23444616, -6238977, -22758494, -30971546, 25789668, -3510062, 15287399, -17527224, 9405442, +25141128, -16777752, -24651502, -10194642, -12850005, 26586384, 5340255, -11571716, 10190884, 7839926, +22810572, 14381698, 6436009, -20444582, -20726438, -4440996, 2087891, -5316096, 3376381, 14262513, +-3441880, -1152125, -10721849, -7563438, -6019397, -10758356, -2410551, 4465692, 6134824, 33549600, +1835025, -8382166, -3085934, 4503273, 10042170, -594853, 16136192, 6962679, 37832220, 5933498, +-786516, 1391033, 6489696, 1879585, -1802813, -10962367, -16832514, 62400508, -36721972, 23473070, +44129716, -21665962, 5994701, 35179540, -45254460, 1464584, 4764730, 21551072, -50709068, 2473901, +3134253, 16253767, -22271552, -54224, 8781598, -30004104, 4164508, -2592550, -5792837, 15993921, +-5152350, -4821101, 6662031, -4236449, -5286568, 15673409, -15208479, 4065724, -6403260, 3739306, +-9823664, -5673652, -11927661, -192200, 2050847, 30991410, 10201621, 14872398, -3390877, -10201, +23021024, -1351841, -9007083, 12662100, 9392557, -10848014, -30633318, 27504434, -30529702, 4583804, +14351633, 18733574, -30043296, 31495532, 51034948, -28397786, -52266532, 69302520, 24443196, -34812320, +15729244, -33530810, -41322416, -20912196, -7703024, -43380244, 34613680, -60317448, 17818746, 28182502, +-23953570, -80507552, 75587128, -13598403, -19697794, 50057844, -50485728, 25574382, 42925512, -13356275, +-11979738, 12938589, 14642617, -8533563, 5181341, 3966402, 13506598, -7198365, -5118528, 14823543, +-186294, 2954938, -1767916, 2393371, 12082280, 8562554, -1805497, -11410654, 17777944, 18882824, +-3810173, -17168594, -1910187, 7701413, 1639067, 11420318, -79457, 9919764, 4293357, 14787572, +11197517, 12328704, -19254338, 4363150, -501974, 216359, -56371, -12241194, -20783346, 29647622, +-5007932, -28541132, 10035728, 6178311, 2797634, -5219459, -19429358, -15075872, 34979824, -22874996, +-18271864, -36584532, -16787954, 21935472, 17039210, -9671193, -12106976, 11741904, 29027000, -12305618, +21922050, 26248692, -18438832, -2538326, 16057272, -4008278, -537, -5151814, 1470489, -26561152, +7385197, -5792301, 972273, 6556805, -5302137, 5635534, -11011222, -22222698, -10516227, -38788388, +4929012, 48318, -5748814, 7354058, 3765613, -2400887, -8816494, 15782931, 24774446, -25840134, +38036768, -4142496, 5121749, 5646809, 33625836, 15552077, 24617142, -30688078, -7600482, -5636608, +43814036, -40697500, -13911399, 20118164, -1430761, -47016472, 3235184, -9577777, -8028368, 21689048, +23638426, 1813550, -17678622, 38270844, -16022912, 63719060, 871878, -29329794, -9127, -4959077, +-33339684, 64020784, 12860743, -9359807, -75572632, -37613176, 21323438, -27660664, -25024090, 29773250, +-110795120, 2964601, 21859236, 16205448, -8944806, 31338228, -19050864, -2299955, 163746, 16407312, +-4595078, 3492345, 22100828, -1365263, -5555004, -6812892, -7932268, -173409, 2488934, -1293859, +-3333432, 14448270, -19973208, -4304094, 2384781, 3512747, -11964168, -20069846, -5148055, -6037114, +-2894808, -1508607, 3922379, -22284438, 1726577, 17216376, -10616622, 13205951, 9984725, -9613211, +606664, -6991133, 2830920, 4967130, -10479183, 29603062, -14297946, -13012140, -17047262, -15463493, +-7722888, 13899051, 18979998, 11448235, 47673600, -9571335, 10555956, -4927401, -25082072, 12076374, +-16097537, -9233643, 9587978, 21185464, -23011898, 24459302, 2546379, -1598802, 50272592, -10623065, +-5919002, 37553584, -24533926, 33130840, 14156749, -8296803, 13064217, 13743895, 30954366, 32119376, +9150965, -26744224, 54912232, -55746528, 1583232, 50013820, -27403502, 10781442, -6259915, -6911140, +-58653148, 39257612, 10212895, 17210470, 18321256, -12519293, -29327648, -22245246, -17973902, 2367064, +55206436, -26844, 43247636, -14880451, -33742336, 1431298, 12257300, -27917288, 44395468, 17742510, +21691732, 43670152, 28307056, -47604880, 17755932, -68102072, -83837224, 1314797, 70164736, 43707196, +5465346, -50248432, -178121424, -33159296, 54786064, 62402652, 88866096, -4987531, -113190640, -64191508, +-59064392, 89855544, 68834904, -12940736, -45348948, -26896158, -55100136, -7493108, 70536248, -7354058, +16355772, 11316702, -11784317, -26124138, 38368016, -16149614, 21330418, 15255187, -1633161, -36316096, +48924508, -19881940, -9429064, 13684303, 12583180, -27105538, 294742, -8869107, -10166724, 2836826, +-1090922, 19102940, -35236448, 18044232, -42374684, -7246147, -7159174, 49661096, 1389959, 13050795, +-30758408, 15442555, -11616813, 21604222, 26476862, -13448079, -30566208, 10376641, 7842074, 25085294, +21161840, -5706401, -8346195, -4319664, 17398912, 2731062, 17534204, 7287486, -43545600, 36702108, +-27358942, -4665945, -17697412, 17106318, -19891068, -762894, -2046552, -5321465, 4139812, 18850074, +-19769734, 8815420, 1593970, -4486094, 311385, 13332115, -16717086, -4472672, -2427730, 27584428, +-27796492, 7494718, -12173548, 18324478, -20295868, -5653251, 6975027, -3805341, 3862249, -13007308, +-2321430, 12017855, -3610457, 4729833, 3764539, 2629594, 14854681, -13622563, 9313637, 10869488, +13253195, -1708860, -30802432, 4101694, 3638911, 12700218, 11431055, -2078227, 3046206, -5020280, +-14024679, -2214056, 6386080, -2466385, 18664854, -15047955, -5076652, -30197378, 9030169, 3464965, +-4835597, 6972343, 5878737, -249645, -15742129, 5080947, 15273977, -2790655, -2295660, 6223408, +-6251325, 11650099, -7131257, 2148558, -14477261, 7024419, 2646774, -2079301, -4023311, 8557185, +-4076998, -5832029, -8776229, 9298067, -459562, -4330938, -2040110, 9262634, -3673808, 4226248, +-5111548, -2780991, -579821, 564788, -206695, -4725001, 427349, 403190, -4307316, 4531728, +-4098473, 12063489, 1743220, 1845762, -16481937, 4883915, -468688, -6246493, 7259569, 14136348, +-10194642, -1973001, -540092, -6930467, 10819023, -1523640, 1399623, -6933151, 3613141, -1231582, +1166621, -4300336, 4214437, -4287988, -24865176, 60288456, 16434692, 14898168, -7972533, -19297824, +-18568218, 5274220, 11705396, 1850057, -687732, -61203, -8807367, -1598802, 4233227, -2330557, +1822677, -938450, -8823473, -454730, 4369593, 6891275, -6141803, 1696512, 4410932, -8787503, +14430553, -8756365, -7647190, -7589207, 1970853, 4227322, 6694244, -7300371, 9339943, -13451838, +8916889, 7963406, -5929739, -602906, -432181, -1537598, 6948184, -7475391, 2178622, -2382096, +-9689446, 13734232, -7672422, -247497, -5686000, -1763621, 9560597, -12475269, 5077188, 3476239, +-5462125, 4602595, -10662793, 3106335, 4424890, -7900593, 181999, 4268661, -7330436, 7366943, +-10116259, 2821794, 10347650, -15143518, 4352413, -5775658, 1035624, 5973226, -4538170, -2301566, +1060320, 1315871, -917512, 4275640, -3249680, -2775086, 2065879, -2479270, 1350230, -943819, +1778653, 1698660, -2460480, 1245541, -476741, 2221035, -2033130, -550830, 1473174, 65498, +-1181116, -3506841, 2218351, 2354179, -540092, -2419677, 2311229, -103616, -1107565, 2409477, +-5032628, -1004486, 2825015, -3604551, 5251135, -3213173, 233002, 8750459, -2554969, 6307697, +-3592203, -335007, 6932077, -4855461, -1849520, 9045201, -46580532, -109298864, 30946314, 107009648, +73595872, 116361936, -64772400, -68946576, -94017904, -108833936, 2345052, 83985400, 86769080, 90589984, +17790828, -29925184, -59389196, -85243288, -72248864, 5636608, 56138980, 66588636, 59915332, 14341970, +-16546362, -10331544, -46770048, -52313776, -22064858, -1418413, 20133732, 44126492, 21559126, 16010027, +22106196, -11028402, -26233660, -4290673, -41945188, -19674708, 469225, 6664716, 31980864, 37235220, +3310883, -5636071, -3490735, -27469538, -7437273, -381178, -5710159, 9514963, 18402862, -3919695, +-1453310, -7217693, -11481521, 2359011, 1140314, -1251446, 20763482, 14055280, 5196911, -526670, +-19572166, -28302760, -22379464, 1618129, 21070036, 18087182, 23737748, 3230352, 620623, 5399848, +-29453276, -16764331, -13848585, -2516851, 22604950, 5113159, 7585449, 21088290, -12167642, -17702782, +-4119411, -3020973, 6539088, 7603703, 2379412, 4246112, 1860258, -10866267, -11260331, -2744484, +-2147, 8100845, 11720966, 3848291, -1654636, -2542084, -3333968, 2939368, -3287798, -13817447, +-2168422, 3262028, 6405944, 13765370, 3352759, -2849711, -6612102, -11311870, -2474438, 1145146, +3689914, 6477885, 8087961, 6374805, -3264175, -9800578, -10334228, -9014063, -1032940, 4493610, +4971425, 13299366, 13650480, 6658810, -2946348, -16777216, -17749490, -8223252, -6220724, 6276021, +16569984, 12283070, 5309654, 72478, -1319092, -2157684, -5069135, -8332237, -8016020, -3419331, +1175747, 3473555, 5557151, 8075613, 7699803, 2952790, -2989834, -6476811, -7013145, -5205501, +-1972464, 1068373, 2479270, 2449742, 2974802, 3425237, 2632815, 74088, -2011655, -3477313, +-2837900, -1035624, 598074, 1379758, 238371, -153545, 243739, 357556, 1023813, 1087701, +-36507, -1146756, -477815, 893353, 228707, -1025960, -842350, -139050, -695248, -1144072, +-183073, 2070711, 2803540, 870805, -689342, -1047972, -746251, -474057, -807454, -1125818, +-443455, 791348, 1271847, 716723, 583042, 700080, 132070, -448824, -947577, -966905, +-679679, -226560, 466004, 782758, 572841, 466004, 233539, -126165, -473520, -655519, +-499290, 16106, 340376, 379568, 280784, 84289, -178241, -394063, -279173, 42413, +195421, 209380, 202400, 88584, -103079, -182536, -114354, -53687, -13959, 30065, +41339, 28991, 13422, -5369, -20938, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -4407710, --2930242, 1226213, -1134408, -1394791, -2151242, 518080, 4252555, -1371705, 9127, 431644, -7286949, -147103, 1388348, -3003256, -2093797, -747861, -1973001, -2112050, -1990181, -1347546, --1891933, -2486786, 2080375, 3466039, -1915555, 527207, 130460, -3935264, 100395, -87510, --2804077, 5268851, -2704219, 2996277, 1130113, -807454, -3036005, -2792266, 2697240, -1408749, --1034550, -4160750, -1074816, -384400, -1978369, 5558762, -1228898, -346819, 2306934, -402653, --4646618, -2376191, -4099010, -2738579, 6317897, -1776506, 7027640, -25233, -310311, -1273458, -801548, 300648, -4209068, -4460861, 3231963, 375810, 2190433, -293668, 2553895, 1586454, --4081830, -20401, 1329292, 2196339, -29528, 1855426, 3342022, -4479114, 1159641, 1161789, --2270964, 8053, 994822, 3229279, 2094333, -2234994, -706522, -112206, 725850, 1034550, -750546, 853625, -619549, 449898, -1251983, -770410, -49929, 1652489, 688805, -35433, --151398, -1097901, 617938, -70867, -415538, -79994, 544924, 261456, 380105, 1073205, --390305, 481573, 1231582, 9575630, -804770, -1217086, -2520072, -5318780, -6548752, -5996848, -609349, 5242545, 1801202, 7016903, 2377265, -3263638, 802085, -8471823, -7182259, 3257733, --2557653, 4611721, -490163, -3795677, -1916629, 9212168, 2015950, 3862786, -231928, 2944737, --1436130, -1194538, 1781338, -1333051, -4101694, -354335, 1428077, -527744, -296890, 5839008, -3593277, -6393596, 91268, -4076461, 6624987, 3892851, 225486, -2428804, -2493229, 3017215, -1660542, 4927401, -4682051, 7854959, 9652939, -2730526, 9403294, -69793, 4902705, 3024194, --1802813, 1582696, 7526394, -943282, -5169530, 4323959, 1359894, -113280, -642098, -957241, -270583, 4366908, -2896419, 1549946, 1132261, 2284923, -3721589, 4112968, 911607, -425739, -1264868, 549219, 350577, -235149, 887985, 2392834, -1784022, 929860, 595390, 972273, --1633698, 52613, -2588255, 380641, 1133871, -1524177, -992137, 275952, 642635, 762894, -172336, 689342, -59056, -48855, 1484448, -208306, 329102, -8319889, -6500433, 2073932, --3670587, 2658585, -4592931, -6533182, -6037651, 868657, -4504347, 4168266, 3060701, -5793374, --1174674, 2393371, 578747, 2938295, -1692217, 3039763, 3735548, -5137855, 1675574, 1727651, --4125316, 2465848, 449361, -4865124, 3655554, 3533148, -1717987, 3858491, 571768, 3155190, -2851322, 1213328, -1818919, -426276, -5846524, -1737314, -2895882, 3121904, 3274376, 1316408, --9380745, 1829119, 3981435, -2091112, 6629819, -5370320, -7151121, 581431, -2108829, 2328946, --5101348, 9372156, -473520, -3087545, 931471, 153545, 5332202, -265751, -3085397, -168577, --2090575, -2830920, -3618510, 1746978, -6553047, 712965, 252866, 1967632, 4399657, 1483374, -3133716, 4876399, -3297461, -543850, 1090385, -4097936, 2836289, -1370095, 2418067, 1962800, --1275068, -937377, 3553549, -1109712, -3228742, 499827, -339302, -79457, -1742146, 2624762, --1990181, 1024350, 968515, 1359357, -514322, -494995, 156229, -949725, 386547, -636729, -59593, -378494, -978716, 1309428, -501437, 321586, -180389, 124554, 10201, 273267, --1670205, -19943144, -286152, -2399276, 14120779, 348429, 891206, 3042984, -1921998, 7130720, -1790465, -7545721, -4037806, -8859981, 1620276, -588411, -3014530, -2540473, -3219615, -2044404, -10995116, -5007932, -2449742, -2822867, -8308078, -326418, -2010582, 2879239, 4182225, -1327145, --16643, 2467459, -2520072, -671089, -1050120, -2996814, 3386582, 6775848, -769336, -1091459, -5375689, -7036767, 4625680, -5613523, -11333882, -7183333, -11287711, -1700270, -6418829, -4314295, -1233193, 4545686, 2334852, 3256659, -1628866, 3944928, -4769561, -1058710, 4150549, 11811, -5747203, -2350958, 1803886, -3968013, -2972654, 2994666, -6874095, 1886564, 5248987, -6716255, -757525, -1755031, -3069291, -4394289, -3927211, -1291175, -1686848, 1102196, 4922033, -2308545, -1597728, -4027069, -4264903, -3373697, 1736777, 2352032, 700080, -1032403, -1175747, -1783485, -1098975, -1506460, -1270237, -585726, -1170916, -121333, 341450, -2164664, -413391, -224412, --1568200, -393526, -642635, 47245, -179852, -2972654, 479963, 1307281, -460098, -1146756, --8590, 1908576, 1081795, -692027, -2003602, 1187559, -144418, -657667, 12809203, 95026, --7132867, -6852084, -2345589, -4993973, -1923609, -3751654, 984084, 632971, -5642514, -3308199, --6198712, 11773042, 4989679, 1101122, -664109, 6393059, -9514426, -132070, -200790, -5994701, --8007430, 7187091, 144955, 5134097, -8033737, -3493419, -2800319, 2812667, -288300, 3453691, --5543729, 1697049, 2265595, -5974300, -5773510, -5195300, 1245004, -1695438, -1618666, 5091147, --1489280, 585726, 89121, -975494, -5731634, -3466039, -663572, -8580271, -5628018, -4507568, -2391223, 1675037, 3436511, -822486, 1501091, -68719, -885300, 4033511, -3113851, 7005629, -973884, 2141578, -924492, -2274185, 2771328, 2188286, 5505075, -1633161, 856846, 3395709, --1995012, 99321, -7286412, 3461207, -5611375, 3583077, -4150012, -3997541, -7858180, -1498407, -1981591, 894427, -1331977, 1864016, 784905, 3622805, 576063, -1054415, 3131568, 1752884, --2806224, 721555, -2284386, 2506114, -1009317, 455803, -635655, -245887, -2018635, -35433, -98784, 418759, -1191317, 977105, -1701344, 703838, -324807, -800475, -1512365, 429497, --1023276, 2158221, 575526, -522912, -952409, -813359, 1620813, 1140314, 1547262, 201863, -146566, 862215, -1800128, 15177878, 14371497, 10742787, -3550864, 3974455, 5467494, 3233574, -3112778, -5251135, -4575214, -6892886, 6250788, -6464463, -743029, -4687957, 8273181, -9056475, --6745246, -3340411, -1413581, -4964446, -7487739, 2204929, 452045, 492848, -9091372, -4990215, -2443300, 1966021, 2650532, -2432025, -3580929, 335007, 2803540, 3560528, -2522757, 3387656, --4803921, -1245004, -11834246, 4399657, 1481227, -2005213, -2203318, -8725226, -3956739, 1142998, --2078227, -12272332, 6690486, 2777770, 31139, -3289945, -2539400, -5175436, 1635309, -1817308, -3589519, -745177, -1728188, -6972343, -1314797, -675921, -3819300, 7712688, -5538897, 127238, -4600447, -1896228, -5994164, -3369939, 5221070, 7533910, 3748970, -557272, -190052, 3992709, --8071318, 3316252, -826781, -380641, 406948, 1758789, -435939, -326418, 435939, -1575179, --4864051, -1312649, -1467805, 1499481, 1071058, 572841, -1868311, -989453, -2162516, -2692945, --646393, -98784, 3255585, 309238, 465467, 401579, -1101122, -653372, 1511292, -1696512, --239981, 581968, 954557, -2027761, 48855, -181999, 1215476, -1459215, -324270, -862215, --1391569, -3118683, -1408212, -156766, -1333051, -3758, 182536, -157840, -1698123, -688269, -18285286, 6129992, -2680060, -2138357, 6415071, -12362526, -2334852, 10004589, 5009543, -6979322, --163746, -4736275, 1923609, 7694971, 18894634, 6238977, 14714021, -5217849, -1104344, -14327474, -4852240, -4180077, 4022774, -6274947, -340913, 606127, -2244657, 5144297, -2315524, 2457795, -6318971, -4847945, 2844879, 8087424, -2215666, 2707440, -2684, 3253438, 4415764, 4554813, --24318642, 8892193, -2822331, -11377905, -2002529, 6956237, 2113124, -8787503, 4730370, 6937446, --14329085, 1156420, -4055523, 8429947, 1908576, 6965900, -1715839, -5000416, -10068477, 625992, --6096706, 18988050, 3490198, -3106872, 6308233, 809064, 6103149, -14919643, -1984275, 2318746, -4609574, 1114007, -7005092, -1085553, 2532957, 6661495, 5587753, -4617090, 104153, 6556268, --306016, 3098282, -2301029, -1103807, 4561792, 468151, -381178, -602369, 206158, 2272575, --2189897, -932008, -302258, 1774895, 1666984, -192737, -631360, 4552129, -1468342, -741956, --2414309, 350040, 1195612, -1149978, 51540, 1430224, 1812476, -1571421, -769873, -2634963, -164283, 2164127, -1051730, 441845, 942208, 1148904, 3606162, 520228, 1745904, -56371, --1622961, 2436857, 542240, -21708376, -23809152, -8151848, -1858647, 437550, 5057861, -10167261, -3207267, 11988327, -6878927, 6382322, 8297340, -5780489, 176631, -2814277, 10147397, 14159970, --6784438, -7989176, 7116761, 688805, -6800007, 3223373, 110595, 1780264, 2021319, -3628174, --2651069, -15121506, -781684, -4319127, -352187, -439697, 10281078, 3062849, -18467822, 319975, -8898098, -10086731, 2653753, 10872710, -2394981, 3835943, 213675, -2835215, -7023346, 13976897, -11742441, -8919573, 4670777, -3306588, -471910, 4363150, -3109556, 3663607, -5538361, -610422, -11785390, -3330210, 2485176, 5592585, -4039417, -9672266, -426812, 3353296, 1710471, -4634270, -602906, 2639258, 4181688, 8652748, 5324149, 9519795, 5002027, 1864016, 4399121, -1527935, -8544837, -248571, -6781217, -9074729, 1101122, 2990908, -1613297, 6844568, -3539053, -3641596, -2685965, -820876, 707596, 384400, -4234301, -549219, -2561411, 3136937, 1363652, 2531346, -4833449, 649077, -1748589, -7005629, -571768, 1681480, -1831804, -681826, 680215, -1521492, -1473174, 1615982, 166430, -1611687, -1219234, 3502546, -523986, 1672890, 820339, 1171452, --2511482, -2565169, -1585380, 658741, 1148367, 2124398, 1491964, 1071594, 921807, 2658048, --722628, -2492692, -23599772, 25866440, -1731409, 16564615, 1064078, -9953050, -3133179, -5854578, --7050189, -1104880, 251792, 11924440, -2134599, 8127689, -8603356, -654446, 1860795, 1716376, -746251, 10339060, 10310606, 3639448, 1472100, -1532767, -2251100, -805843, -1951526, -17770964, --6187438, 7897371, 5036386, -2157147, 700617, -8514236, 4019553, -10394895, 2042794, 16007343, -1575716, 3322694, -13660143, 7002944, 6096706, 1536525, -9222905, -4148402, -4394826, 548682, --8295193, 8104067, 9958419, 5927592, -1071594, 15000173, 5214627, 22042846, 8519068, -6133214, -18354542, 232465, -6919729, 13223667, -2347200, 4242891, 8289824, -6284611, -5382668, 12219719, -13174812, 7694434, -10972568, 3927748, -259846, -5178120, -9038222, 6411850, 11646341, 6951405, -16980690, 2184528, -3926137, -3995930, -10707353, -4179540, 6394670, 846645, -2080912, 246961, --6732361, -4784594, 779000, 1518808, -363998, 6920266, 5458904, 2319282, 86436, 1910724, -3221226, 1568200, -3423626, -1493038, 826781, -916976, -1266479, 2823941, 133681, -1002338, -2266669, 757525, 635118, 784368, -2303176, 395137, 6070400, -2966749, 3779034, 1668058, -33286, -2946348, -3231963, -1741072, 1185411, 5758478, -12549358, 16703665, -4818417, -10961293, -3675418, 7270306, -7277285, -3679713, -15371688, 6449431, -5637145, -1843615, -14093398, -6182606, --4782446, -2398202, -6358699, 3338800, -2857764, -3457449, 3308199, 4672388, 8198019, 8059506, --3489661, -2889976, -11368778, 4494147, 203474, 7495792, 2036888, 2024003, -2592550, 3013457, --7119982, -5990943, 3318399, 1726577, 3367254, -13829795, 4609574, 9086003, -60130, -12176769, --12772159, -9904195, -29412472, 4177930, -3420942, 14244259, -6998649, 11839077, 3751117, 830002, -15189152, 2345589, -1803886, 10972031, 4006668, -14903000, -7468948, 1809255, -4811974, -8448201, --5206037, 19270444, 8797704, -9032853, -1157494, -5062156, -2547453, 2840047, 13530221, 274341, --3712999, 18009872, -6511171, -16307454, -15655156, -18458158, -3355980, 1444183, -558346, -3222836, --2339147, -7874286, -1634772, 2345052, -2535641, -2308008, 1475321, 1546188, -11713450, -4745402, --9195525, 469225, -3180423, -2914135, -4971962, -1489280, 1201517, 7096360, -32212, 8695161, -4151623, 6397354, 562641, 3034395, -3085397, 5838471, -156229, -4130148, -6352794, 3631932, -440234, 2030446, -1762547, 1186485, -2100776, 2051384, -849330, 2423435, -646929, -971200, -1380832, -277025, 7275138, -12087112, -3051038, -3249143, -1599339, -853088, 32056026, 5239323, -11708081, -5702643, 10222022, 20656108, -17733920, 26838714, 15896748, -7194070, 220117, 1617592, --9676024, -16204375, 1092532, -9399536, -14471892, -6487548, 1261110, 13422, -1799591, -6505802, --1110786, -6334540, -465467, -7321309, -558883, 5000953, -11381663, 6229850, 9536438, -7453379, --6947110, 4927938, 3702262, -656056, 28770912, 2534031, 19168976, -13808320, -1369021, -16740709, --12316356, 2953864, -12353937, -16922172, -11314018, -12853763, -2836826, -3425773, -14304925, -15511274, -20201378, 3175055, 1235340, -2745021, 10445360, 5818607, 12606266, -1255204, 11912092, -6684043, -2681670, -22363358, 18227842, 8834748, 1391033, -12281459, -972273, 5547487, 1116692, 2138894, -8977019, 12592307, -9803263, -12534862, -8305393, -1959579, -263067, 1374926, -7421167, 843961, -2052458, 5191542, 6684580, -849330, -4230006, 7032472, 3408057, -5242545, -427349, 2543695, --3204046, -5539971, 931471, -1876364, -1899449, -164819, -2506650, 6448357, -6875706, 3744675, --273804, 7132330, -7526930, -1802276, 1166084, -1884954, -2924873, -1192390, -5992553, -6483790, --1321239, 685047, 1818382, 2357937, -4503810, 4469451, 3274376, -2651606, 3885335, -783295, -2183991, 198642, 2157684, -1801202, -1527398, 614180, 1067836, 2618856, -442919, 3592740, --1770063, -1241246, 537, -1301375, 2267206, 2306398, 15679315, -6322729, -5145908, 17498770, --14630269, -11142219, -2691334, -8851391, -1371168, -17428440, 3972308, -10710038, 8311836, 1219771, -2866891, 10049687, 2922188, 7109245, 9740986, 9256191, 7646653, 12948253, 1578401, 8819715, -7903277, -9352291, 16326781, 4043712, 7572028, -8726837, 12750684, 5783711, 8966818, 2316598, -3227131, -1591822, -11675869, 3040300, 6670084, 7871602, 8578123, 1893544, -14208826, -8953933, -10293963, 5636608, 2374580, -5357972, 7138773, -5122286, -14241575, 21032454, 12849468, 9424232, --8028905, -3910568, -10598369, -33097018, -961536, -4566624, 4323959, -7682623, -8282845, -14558865, -2629057, 4755066, 18602040, -14570140, 5981279, 340376, 8589935, -12817793, -15770046, -9563282, -10267119, 3190624, 3246995, 5507222, -4290136, 1889249, 12030203, 4341675, 6120329, 7728257, --2997350, -2699924, -4963372, 212064, 5294084, 6577743, 304406, 2782602, 1372779, 1148904, -4984310, -2943126, -2546916, -4189204, -2343442, -4336307, -66035, -6638409, -2648921, -7020661, --323733, -4175782, -1155346, -860604, -2393371, 2178622, -1700807, -9034464, -1286880, 3805341, -4095788, 7693897, -1039382, -4343823, 2234457, -1620813, -6582038, 6309844, 5300527, 5164162, -11772505, 7816304, -543850, 583579, -2516314, 3272228, 1048509, -27091580, 15087146, 16077673, --8443906, 13667660, 4504347, -22891638, -4293894, 29402272, -4524211, -20046222, -3387119, -2189360, --17462800, 11729019, 2198487, -8943196, 12654584, 8309151, 30327838, 17666274, 179852, 1971390, -28595356, -7690676, 7016903, -12082280, -17282948, -5343476, -11835856, 2324651, -1137093, 5549098, --1176821, -2345052, -5181341, 22502408, 811212, -18216030, -14530948, -3511136, -3985193, -908386, -7144678, 20518670, 12993887, 4127464, -12903692, 15904264, 29258390, -6511708, 13133473, 12299713, -35315904, 6513318, 6503118, 10509785, 14890115, 8158827, -12505871, -12006581, 7910793, -22082574, --13430363, -15896211, 14555644, 12732431, 8790724, -3795141, 10657424, 22601192, -13312251, 17954574, -17843442, -2680597, 17535814, -16988744, -7670812, -6080600, 37044092, -18456548, 18067316, 11238319, -6484327, 4984310, -16790638, -1865626, -13261248, 13721884, 12984760, -433792, 713501, -6889128, -9642738, -4099546, 729608, 3517578, 3801583, -243739, 5785858, -4381404, -2500208, -1870458, --4407174, 1678259, 3392487, -3284576, 1413581, 4090956, 7314330, 963146, -7227356, 2761127, --7813083, 1161252, 6567005, 4256850, 6961068, -1436667, 11378979, -4792110, 8334384, -2432562, --3039226, -1707250, 228170, 9205726, -7074885, 4333085, -457951, 4395899, -5811091, 1297080, -2000918, -2697240, 12066174, -6914361, 5221070, 5700496, 20216948, 36251136, 3677566, -3995393, -3623342, -2172717, -6247567, 875100, 3565897, -9111236, -12115566, 3830037, -6411850, -3556770, -9043054, -651761, 18004502, -9790915, 17644262, 8616241, 1505386, -10565083, 3122978, 17683990, -4910222, -9233106, 3269007, -2316598, 242666, 10332081, -14790257, -7833484, 15948824, 200253, --4271882, 13939316, -963683, 4847945, 2930242, -13604309, -24834038, -5325760, 8247411, 15623480, -3128884, -12195560, 15444702, -5260261, 31614180, -16252693, 21179558, -12639015, 7397545, 18313204, --27481348, -28198608, -475668, -8039642, 6977175, 8886287, 1004486, -4211753, -16919486, 11142756, --2700461, 19893752, 8728447, 18524194, 4777078, 10762114, -4829691, 14217415, 4857071, -8585103, -1436130, -288837, -41419592, -1258962, 6931541, 9910637, 17083232, 14711874, -5114769, 1210107, --3368328, 2731062, -327491, -4595615, -11221676, 4716948, -6685654, 14244796, 1352915, 2771865, -6674916, 4141959, -4821101, 4113505, 9996536, 9065065, -3427921, -1633161, 1137630, -2177549, --1843615, -6427419, -1522029, -13483513, -2239289, 4666482, -11635066, 7857643, -8876624, -6860137, -1647657, -6971806, 6769406, 2831457, -3073586, 4728759, -932008, -703838, 2597918, 9997073, --7300908, 1627256, 1076426, 4471061, 2778844, 2094870, -4131759, 23893976, 30876520, -6633577, --1109175, 10950019, 40814000, 1231045, -24016384, -9549323, 4977330, 4728222, -7543037, 7882339, --5428839, 12720083, -20362440, 1173063, 12799003, -8432095, -9149354, 1879585, -20131586, -6120329, --6514392, -32052804, -27091044, -15628312, 11915850, 14059039, -2385318, -22774600, 2636036, 926102, --751619, 4702453, -11435350, 27592480, -7788923, 3619584, 30493730, -26525182, 12899397, 4630512, --9246528, 11198053, -7153805, -21476984, 492848, 18824842, -8321499, -13439490, 7826504, 2658048, -17861158, 276489, -27435714, 2343442, -16207596, 27214524, -9787157, 4243428, 6684580, 3400004, --3860639, -17414482, 7362111, 18592376, 5377299, 19180788, -27834072, -15167140, -4573067, -79457, -3015067, -21322366, 19262928, -2468533, -20478404, -6655589, 12968117, 12243341, -11340324, -15569256, -15567109, -12351789, -7856032, -93416, -1926830, -1513976, -1017370, -4381404, -871878, 8020852, --1777580, 7392176, -8228621, 5924371, 7490423, -1788317, 4042101, 1453310, -1526324, 337155, -1013075, 13612362, 694711, -2306398, 1134945, 3229816, -6681359, 2659122, -8543227, -405874, -9873056, -3267396, -7784092, -2587718, 4423280, 444529, 319975, 6137509, 459025, -7479686, --4058744, 14519674, 10362682, -3089155, -615791, -146029, -21130702, 31061204, 885300, -53202296, -21311090, -7313256, 4146254, 5427765, 7143068, 13059385, 4760971, -9633075, -2326799, 13151727, -8892730, -10564546, -565325, -8382166, -4345970, -26132728, -3335042, 12576201, 15618649, 3510062, --6199249, 17301202, -17823578, 19713364, -11359115, -6381785, 2349347, -6118718, 5255966, -15728707, --21233244, -23763518, -7606387, 12303471, -4752382, 118648, 14471355, 4017405, 2528662, -455803, -491237, -5006322, 194347, 15595026, 9601399, 16457778, 13960254, 16510391, 11236708, -9819906, --6261526, 4054449, -1052267, -18977312, 12759274, -3436511, -17927730, 22502408, -254477, 3655554, --626528, -8188355, -2702071, 9448391, 13690745, 11385421, 348966, 6972343, -22963042, -3264712, --8183524, 12492449, 4313758, -6403796, -7304666, 28913182, -8815420, -9910100, -3133179, 4659503, --7159711, -19059454, -1075352, -3269007, -10296647, 17854180, 3644280, 6717866, -5488432, -961536, -4159676, 1067299, 5253282, 5659157, -1855426, 3467649, -3438121, 3930432, 1500554, -3165391, --2390686, 2908230, 4110821, 1109175, -3629247, -3021510, -3262028, -2419140, 88584, 2033130, --2953327, -3593814, 858457, -294205, -635118, 3089692, -1442572, 4900558, 1502165, 14375792, --1203665, -1818382, -3156801, 1750736, 89657, -6059662, -7962333, 72469520, -71069360, -3511673, --77274512, -11915313, -29359860, -3527242, 18913426, -9533754, -21363168, 33789580, -9092446, -5825050, -1149441, 10451266, -1175210, 28092308, 18592914, 11178726, -16525960, 1155346, -11267310, -11438035, --7656853, 468688, -3511673, -3049427, -9327595, -2033667, 15519327, 1955821, 10276246, 10288057, --807991, 13717589, 19937238, 1112933, -4070019, -10354629, -12409771, 5006858, 5450314, -10263898, -16893180, -22274774, -22566832, 2525441, -7894687, 12108050, -20924006, 8966818, -40242232, -21417392, --32216550, -2765959, -15901580, -1415729, -9706626, -12080669, -10530723, -940598, 2728378, -31457952, -3587908, -6874632, 3611531, 161598, -14553497, -25591026, 17707076, -15394237, -2751464, 15859167, --1606318, -4954782, 10482405, 13146895, -2710124, 13095892, 8567386, 15822123, 8720931, 16010027, -7577933, -9472014, -2639794, -8342974, 381715, -6906845, 1479616, 5806796, 8195872, 8987756, --3984656, 4182225, 2996277, 5897527, -1396938, -2237141, 3075734, 7066832, 930397, 1651415, -7783555, 4002373, 8012262, -1133871, 369904, -818728, 3908420, 5555540, -1008780, -9212705, -5055714, -1531156, 1963874, -2886755, 1281511, -2612951, -1364189, 491774, -7684770, 133144, -10522670, -6570763, -6940131, 914828, 3591667, 3673271, 1241782, -7271917, 58631672, 29427506, -14221174, -14234595, -7376070, -30670362, 6722698, 24515674, -4820027, -5890548, 40206800, -7261716, --8966818, 19858318, 29431800, 5036923, 30019138, -7577933, 4356171, 17673790, 20013474, 31561568, -25556666, -1420560, -11434277, 9433896, 11502996, 10817412, 13526999, 23580444, 11549167, 30007862, --11697880, -882079, 8767102, 8081518, 25447144, 14725832, 27275190, -19775640, -6226092, 10808285, --21246666, 17044040, 17370458, 16577500, 7068980, -21477520, -7843684, 40459664, 10409390, 27245126, -22651658, 24773908, -5137318, 32866700, 51583096, 17675402, 4519380, 36107792, 24982214, -14044006, --8619462, -17635672, -14056891, 15134928, 17677548, 1429150, -14963666, 198105, -13383118, -735513, --5998459, 8618926, -31428960, -3702262, 3136937, -16025060, 11964705, 1999844, -9841918, 8267275, --19792284, -12974559, -21923660, -7444789, -10590852, 7618198, 2382096, -10305774, 2281165, 14183056, -4198331, -4809290, -8713952, -13637058, -5242545, 4356708, -19148574, -9045201, -1650878, 15249818, -5142687, -6657736, 3204046, -10437844, -2835752, -3295851, -8551280, -5639292, 14368813, -3444564, --1017370, -3634616, 3394635, 9061844, 6539625, 7746511, 19828790, -103079, 15988016, 618475, -1650341, 9886478, 8588324, -13291313, -7611756, -1160715, 3101503, 1269163, 138513, -1452236, -6278706, -18450106, 9327058, -22260816, 39296268, 55759948, 32500554, -14155138, -30470108, -11139535, -27617714, -8026757, -22693534, 41603200, -28653874, 24900072, 14070313, -32446868, -13418552, -3286187, --53692996, 2275796, 6261526, -25792890, 53061100, -18057654, 49284748, -36715528, 5546951, 2518462, -36053028, 53149148, -4287451, 18157512, 25099252, -29134910, 19740206, -39491688, -10860899, 75533440, --4167729, -20614770, -3996467, -41995652, 1899449, -13095355, 47230144, 18119394, 22027276, -7036767, --12383464, -23279796, -21642878, 5669357, 3085397, 325881, 31471910, -7414188, 6066105, -32363652, --16814796, 21985938, -48455284, -18903224, -14523432, -16356846, 45387604, 3539053, 49031884, 35349192, -15680926, 19030464, -10907606, -25618406, 21996138, -34956200, -21451752, 43719544, 13265006, -25899726, --43102144, -25845502, -30656940, 24954296, -26457536, 14041859, -19093278, -1379221, -16391206, 17805324, -10268193, 1831267, -14215805, -2347200, -9802189, 3195993, -19353122, -13151190, -7263327, 4574140, -10875931, -86436, -7864622, -10747082, -17987324, -12592307, 11487427, 15963320, -4894652, 11111080, -21977348, 10805064, -20350628, -5682242, -7464653, 13198971, -12411382, -7868380, -2909304, 5069672, --16324097, -21756156, -15682536, -4917738, 9084930, 34360, 2061047, -2790655, 12432857, 4223027, --761283, -11124502, -3783329, -6764037, 8746701, -2146410, 2098092, 35140884, -58771260, 62159988, --1738925, 4619774, -20148766, 50156628, 11641509, 32234266, 12073690, -21434034, 7068980, 17819820, --30988726, 21369072, 203474, 14114336, -41306312, -3398393, 9904195, 37673304, -15975131, -31427350, --1551020, 37465000, 19693498, -14583025, -32647658, -1797444, 27012124, 3361886, 1716376, 7341173, -19592030, 49715320, -70536248, -11802570, 6626598, 38938712, 8590471, -21517786, -5450314, 14713484, -35651988, -3812857, 1578401, -67676336, 19376208, 10353556, 18249316, -49156976, 43146704, 37093484, -13886166, -22344030, -2401424, -24702504, 18175228, 31739808, 13256953, 14750528, -2924873, 24012626, --35414152, 33250564, -10034117, -12125230, 39187280, 32203128, 1969779, -12440373, -32441498, 23476828, -25793962, -69422776, -5599027, 39617852, 9810779, -631360, -24863566, -10847477, 67572720, -5375152, --23243290, -3121368, -12574591, -15248745, 22414898, -19216758, 6781217, 10084583, 13651017, -9692667, -1268626, -9838159, -11662984, -7910793, 10298258, 10205379, -10674604, -2301566, 5121749, -8603356, -20415054, -19841676, 5069135, -3716221, -6422050, 7100118, 33864744, 2051384, 24159, -5616744, --11971684, -116501, 18433462, 4231080, -878321, -3745748, -8705362, 15554224, -4064650, -1080721, --9227737, 8855686, -1446867, -4320200, -52583820, 25236690, 4634807, 15960635, 19322520, 28213640, -9839770, 8872329, -13859323, 14404247, 2446521, 33532420, -4146791, -10390600, 26332982, 20113868, --4715337, 1470489, -11606612, 62277, 8185134, -2913062, -7021735, 14871324, -12305081, 1270237, -20307142, -4726612, 11630235, -21220360, -4482335, 2502355, -8830453, -3630321, 2187212, 14669461, --4014184, -25324200, 780610, 49613316, 10144713, -27336394, 7887708, -27865748, -19073950, -14524506, --4052839, 31568546, -3646427, -25652766, 51322712, -55997784, 9286793, 56615724, 5847061, 39721468, --30724048, -57285736, 18242336, 1688459, 45283988, 2139431, -25773562, 20834886, -5886253, -4986994, --11040213, -2082522, -16083042, 7701950, 2086280, 11885248, -19600084, -17010754, -6784975, 19889994, -25796648, -8912594, 13682692, -2348273, 21585432, 15088757, -27385248, 21529060, -5682242, 2962991, --4708895, -8747775, -165893, -396211, 2891587, -2361158, 2236067, 1677722, 1498407, 2850248, --9044127, 171799, 4976794, -7816841, -1009854, 4502200, -4844723, 5993090, 6929930, -10586021, -12380780, 4735739, 12829067, -3174518, 5944772, 10023380, -19584514, -569083, 5989869, 11091216, --6999723, -5535676, -6729677, -5217312, 11402064, 22564148, -9731859, -106081400, -243754432, -96599184, --146715008, -214809568, 115480400, 31938450, 66448512, 305956288, 235827520, 137586064, 251857424, 187937568, -32114544, 62139048, 51692616, -119334592, -102132176, -50017580, -182538800, -174536192, -66845796, -89669792, --126631744, -52927420, -45485852, -128869960, -107575512, -8918500, -61281132, -104482056, -35891968, 33348810, --75902808, 22875532, 112980192, -8585103, -16192564, 153461328, 122539712, -5336497, 179270320, 207756688, -84367656, 195198752, 273861088, 163419744, 141948128, 328678272, 262294192, 197233488, 233786880, 310098240, -110869752, 44022876, 129827736, -102349608, -293803136, -212952528, -324941664, -526171072, -471316832, -500182752, --581717376, -592851008, -511226752, -445141696, -446453792, -313833248, -139023792, -94118304, -14260902, 152336048, -279900864, 282594880, 350785536, 504700544, 441149504, 403304960, 557276864, 442954464, 250352576, 365381472, -255838848, 99365680, 89894200, 118074560, 12171937, -37207840, 22928682, 3420405, -82732344, -44043280, -7373922, -65840776, -122082832, -58566176, -83759912, -177770304, -112099184, -43255152, -132912056, -89288072, -17914846, -42174432, -62072476, 30514668, -36720896, -146380544, -112213536, -179693920, -303886112, -286110336, --274438208, -285029056, -250571616, -168308496, -131546256, -79125112, -15362024, 67011692, 118789672, 182319216, -229953088, 285655584, 297182208, 315216224, 351171008, 333135904, 305451616, 288976128, 191427760, 67463736, -6396280, -28631326, -81791208, -96422016, -84175456, -95040112, -106743360, -94031864, -94978904, -93069792, --78594680, -76689328, -80470504, -77655696, -67998456, -56378424, -48183092, -31522912, -19556596, -3972308, -2241973, 14318884, 21761526, 27354646, 28386512, 30036316, 29775934, 23423142, 13696114, 10580115, -5338108, -1497333, -7163469, -9122511, -20160040, -26324928, -32513976, -43333000, -51040856, -47828220, --46061912, -41101228, -30829276, -21849036, -16048145, -4029753, 8537858, 16728898, 25423522, 39543764, -42771968, 42411728, 45886356, 50422916, 46664284, 48507360, 50929724, 48279728, 46437188, 46646028, -41264436, 35532800, 31338228, 24085102, 13677860, 6203544, -2624225, -14336064, -26169236, -34802120, --45135812, -51350092, -54061292, -53309136, -52699248, -48287244, -41787348, -35224100, -28522878, -19915764, --14063334, -7572028, -2129767, 3038153, 7327751, 10848551, 13807246, 15938087, 15619185, 15316927, -13914620, 12097849, 10292889, 9065602, 7478075, 6085969, 4820027, 4054449, 3210488, 2785823, -2450279, 2230162, 1970853, 1804423, 1735167, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-2930242, 1226213, -1134408, -1394791, -2151242, 518080, 4252555, -1371705, 9127, 431644, +7286949, -147103, 1388348, -3003256, -2093797, -747861, -1973001, -2112050, -1990181, -1347546, +-1891933, -2486786, 2080375, 3466039, -1915555, 527207, 130460, -3935264, 100395, -87510, +-2804077, 5268851, -2704219, 2996277, 1130113, -807454, -3036005, -2792266, 2697240, -1408749, +-1034550, -4160750, -1074816, -384400, -1978369, 5558762, -1228898, -346819, 2306934, -402653, +-4646618, -2376191, -4099010, -2738579, 6317897, -1776506, 7027640, -25233, -310311, -1273458, +801548, 300648, -4209068, -4460861, 3231963, 375810, 2190433, -293668, 2553895, 1586454, +-4081830, -20401, 1329292, 2196339, -29528, 1855426, 3342022, -4479114, 1159641, 1161789, +-2270964, 8053, 994822, 3229279, 2094333, -2234994, -706522, -112206, 725850, 1034550, +750546, 853625, -619549, 449898, -1251983, -770410, -49929, 1652489, 688805, -35433, +-151398, -1097901, 617938, -70867, -415538, -79994, 544924, 261456, 380105, 1073205, +-390305, 481573, 1231582, 9575630, -804770, -1217086, -2520072, -5318780, -6548752, -5996848, +609349, 5242545, 1801202, 7016903, 2377265, -3263638, 802085, -8471823, -7182259, 3257733, +-2557653, 4611721, -490163, -3795677, -1916629, 9212168, 2015950, 3862786, -231928, 2944737, +-1436130, -1194538, 1781338, -1333051, -4101694, -354335, 1428077, -527744, -296890, 5839008, +3593277, -6393596, 91268, -4076461, 6624987, 3892851, 225486, -2428804, -2493229, 3017215, +1660542, 4927401, -4682051, 7854959, 9652939, -2730526, 9403294, -69793, 4902705, 3024194, +-1802813, 1582696, 7526394, -943282, -5169530, 4323959, 1359894, -113280, -642098, -957241, +270583, 4366908, -2896419, 1549946, 1132261, 2284923, -3721589, 4112968, 911607, -425739, +1264868, 549219, 350577, -235149, 887985, 2392834, -1784022, 929860, 595390, 972273, +-1633698, 52613, -2588255, 380641, 1133871, -1524177, -992137, 275952, 642635, 762894, +172336, 689342, -59056, -48855, 1484448, -208306, 329102, -8319889, -6500433, 2073932, +-3670587, 2658585, -4592931, -6533182, -6037651, 868657, -4504347, 4168266, 3060701, -5793374, +-1174674, 2393371, 578747, 2938295, -1692217, 3039763, 3735548, -5137855, 1675574, 1727651, +-4125316, 2465848, 449361, -4865124, 3655554, 3533148, -1717987, 3858491, 571768, 3155190, +2851322, 1213328, -1818919, -426276, -5846524, -1737314, -2895882, 3121904, 3274376, 1316408, +-9380745, 1829119, 3981435, -2091112, 6629819, -5370320, -7151121, 581431, -2108829, 2328946, +-5101348, 9372156, -473520, -3087545, 931471, 153545, 5332202, -265751, -3085397, -168577, +-2090575, -2830920, -3618510, 1746978, -6553047, 712965, 252866, 1967632, 4399657, 1483374, +3133716, 4876399, -3297461, -543850, 1090385, -4097936, 2836289, -1370095, 2418067, 1962800, +-1275068, -937377, 3553549, -1109712, -3228742, 499827, -339302, -79457, -1742146, 2624762, +-1990181, 1024350, 968515, 1359357, -514322, -494995, 156229, -949725, 386547, -636729, +59593, -378494, -978716, 1309428, -501437, 321586, -180389, 124554, 10201, 273267, +-1670205, -19943144, -286152, -2399276, 14120779, 348429, 891206, 3042984, -1921998, 7130720, +1790465, -7545721, -4037806, -8859981, 1620276, -588411, -3014530, -2540473, -3219615, -2044404, +10995116, -5007932, -2449742, -2822867, -8308078, -326418, -2010582, 2879239, 4182225, -1327145, +-16643, 2467459, -2520072, -671089, -1050120, -2996814, 3386582, 6775848, -769336, -1091459, +5375689, -7036767, 4625680, -5613523, -11333882, -7183333, -11287711, -1700270, -6418829, -4314295, +1233193, 4545686, 2334852, 3256659, -1628866, 3944928, -4769561, -1058710, 4150549, 11811, +5747203, -2350958, 1803886, -3968013, -2972654, 2994666, -6874095, 1886564, 5248987, -6716255, +757525, -1755031, -3069291, -4394289, -3927211, -1291175, -1686848, 1102196, 4922033, -2308545, +1597728, -4027069, -4264903, -3373697, 1736777, 2352032, 700080, -1032403, -1175747, -1783485, +1098975, -1506460, -1270237, -585726, -1170916, -121333, 341450, -2164664, -413391, -224412, +-1568200, -393526, -642635, 47245, -179852, -2972654, 479963, 1307281, -460098, -1146756, +-8590, 1908576, 1081795, -692027, -2003602, 1187559, -144418, -657667, 12809203, 95026, +-7132867, -6852084, -2345589, -4993973, -1923609, -3751654, 984084, 632971, -5642514, -3308199, +-6198712, 11773042, 4989679, 1101122, -664109, 6393059, -9514426, -132070, -200790, -5994701, +-8007430, 7187091, 144955, 5134097, -8033737, -3493419, -2800319, 2812667, -288300, 3453691, +-5543729, 1697049, 2265595, -5974300, -5773510, -5195300, 1245004, -1695438, -1618666, 5091147, +-1489280, 585726, 89121, -975494, -5731634, -3466039, -663572, -8580271, -5628018, -4507568, +2391223, 1675037, 3436511, -822486, 1501091, -68719, -885300, 4033511, -3113851, 7005629, +973884, 2141578, -924492, -2274185, 2771328, 2188286, 5505075, -1633161, 856846, 3395709, +-1995012, 99321, -7286412, 3461207, -5611375, 3583077, -4150012, -3997541, -7858180, -1498407, +1981591, 894427, -1331977, 1864016, 784905, 3622805, 576063, -1054415, 3131568, 1752884, +-2806224, 721555, -2284386, 2506114, -1009317, 455803, -635655, -245887, -2018635, -35433, +98784, 418759, -1191317, 977105, -1701344, 703838, -324807, -800475, -1512365, 429497, +-1023276, 2158221, 575526, -522912, -952409, -813359, 1620813, 1140314, 1547262, 201863, +146566, 862215, -1800128, 15177878, 14371497, 10742787, -3550864, 3974455, 5467494, 3233574, +3112778, -5251135, -4575214, -6892886, 6250788, -6464463, -743029, -4687957, 8273181, -9056475, +-6745246, -3340411, -1413581, -4964446, -7487739, 2204929, 452045, 492848, -9091372, -4990215, +2443300, 1966021, 2650532, -2432025, -3580929, 335007, 2803540, 3560528, -2522757, 3387656, +-4803921, -1245004, -11834246, 4399657, 1481227, -2005213, -2203318, -8725226, -3956739, 1142998, +-2078227, -12272332, 6690486, 2777770, 31139, -3289945, -2539400, -5175436, 1635309, -1817308, +3589519, -745177, -1728188, -6972343, -1314797, -675921, -3819300, 7712688, -5538897, 127238, +4600447, -1896228, -5994164, -3369939, 5221070, 7533910, 3748970, -557272, -190052, 3992709, +-8071318, 3316252, -826781, -380641, 406948, 1758789, -435939, -326418, 435939, -1575179, +-4864051, -1312649, -1467805, 1499481, 1071058, 572841, -1868311, -989453, -2162516, -2692945, +-646393, -98784, 3255585, 309238, 465467, 401579, -1101122, -653372, 1511292, -1696512, +-239981, 581968, 954557, -2027761, 48855, -181999, 1215476, -1459215, -324270, -862215, +-1391569, -3118683, -1408212, -156766, -1333051, -3758, 182536, -157840, -1698123, -688269, +18285286, 6129992, -2680060, -2138357, 6415071, -12362526, -2334852, 10004589, 5009543, -6979322, +-163746, -4736275, 1923609, 7694971, 18894634, 6238977, 14714021, -5217849, -1104344, -14327474, +4852240, -4180077, 4022774, -6274947, -340913, 606127, -2244657, 5144297, -2315524, 2457795, +6318971, -4847945, 2844879, 8087424, -2215666, 2707440, -2684, 3253438, 4415764, 4554813, +-24318642, 8892193, -2822331, -11377905, -2002529, 6956237, 2113124, -8787503, 4730370, 6937446, +-14329085, 1156420, -4055523, 8429947, 1908576, 6965900, -1715839, -5000416, -10068477, 625992, +-6096706, 18988050, 3490198, -3106872, 6308233, 809064, 6103149, -14919643, -1984275, 2318746, +4609574, 1114007, -7005092, -1085553, 2532957, 6661495, 5587753, -4617090, 104153, 6556268, +-306016, 3098282, -2301029, -1103807, 4561792, 468151, -381178, -602369, 206158, 2272575, +-2189897, -932008, -302258, 1774895, 1666984, -192737, -631360, 4552129, -1468342, -741956, +-2414309, 350040, 1195612, -1149978, 51540, 1430224, 1812476, -1571421, -769873, -2634963, +164283, 2164127, -1051730, 441845, 942208, 1148904, 3606162, 520228, 1745904, -56371, +-1622961, 2436857, 542240, -21708376, -23809152, -8151848, -1858647, 437550, 5057861, -10167261, +3207267, 11988327, -6878927, 6382322, 8297340, -5780489, 176631, -2814277, 10147397, 14159970, +-6784438, -7989176, 7116761, 688805, -6800007, 3223373, 110595, 1780264, 2021319, -3628174, +-2651069, -15121506, -781684, -4319127, -352187, -439697, 10281078, 3062849, -18467822, 319975, +8898098, -10086731, 2653753, 10872710, -2394981, 3835943, 213675, -2835215, -7023346, 13976897, +11742441, -8919573, 4670777, -3306588, -471910, 4363150, -3109556, 3663607, -5538361, -610422, +11785390, -3330210, 2485176, 5592585, -4039417, -9672266, -426812, 3353296, 1710471, -4634270, +602906, 2639258, 4181688, 8652748, 5324149, 9519795, 5002027, 1864016, 4399121, -1527935, +8544837, -248571, -6781217, -9074729, 1101122, 2990908, -1613297, 6844568, -3539053, -3641596, +2685965, -820876, 707596, 384400, -4234301, -549219, -2561411, 3136937, 1363652, 2531346, +4833449, 649077, -1748589, -7005629, -571768, 1681480, -1831804, -681826, 680215, -1521492, +1473174, 1615982, 166430, -1611687, -1219234, 3502546, -523986, 1672890, 820339, 1171452, +-2511482, -2565169, -1585380, 658741, 1148367, 2124398, 1491964, 1071594, 921807, 2658048, +-722628, -2492692, -23599772, 25866440, -1731409, 16564615, 1064078, -9953050, -3133179, -5854578, +-7050189, -1104880, 251792, 11924440, -2134599, 8127689, -8603356, -654446, 1860795, 1716376, +746251, 10339060, 10310606, 3639448, 1472100, -1532767, -2251100, -805843, -1951526, -17770964, +-6187438, 7897371, 5036386, -2157147, 700617, -8514236, 4019553, -10394895, 2042794, 16007343, +1575716, 3322694, -13660143, 7002944, 6096706, 1536525, -9222905, -4148402, -4394826, 548682, +-8295193, 8104067, 9958419, 5927592, -1071594, 15000173, 5214627, 22042846, 8519068, -6133214, +18354542, 232465, -6919729, 13223667, -2347200, 4242891, 8289824, -6284611, -5382668, 12219719, +13174812, 7694434, -10972568, 3927748, -259846, -5178120, -9038222, 6411850, 11646341, 6951405, +16980690, 2184528, -3926137, -3995930, -10707353, -4179540, 6394670, 846645, -2080912, 246961, +-6732361, -4784594, 779000, 1518808, -363998, 6920266, 5458904, 2319282, 86436, 1910724, +3221226, 1568200, -3423626, -1493038, 826781, -916976, -1266479, 2823941, 133681, -1002338, +2266669, 757525, 635118, 784368, -2303176, 395137, 6070400, -2966749, 3779034, 1668058, +33286, -2946348, -3231963, -1741072, 1185411, 5758478, -12549358, 16703665, -4818417, -10961293, +3675418, 7270306, -7277285, -3679713, -15371688, 6449431, -5637145, -1843615, -14093398, -6182606, +-4782446, -2398202, -6358699, 3338800, -2857764, -3457449, 3308199, 4672388, 8198019, 8059506, +-3489661, -2889976, -11368778, 4494147, 203474, 7495792, 2036888, 2024003, -2592550, 3013457, +-7119982, -5990943, 3318399, 1726577, 3367254, -13829795, 4609574, 9086003, -60130, -12176769, +-12772159, -9904195, -29412472, 4177930, -3420942, 14244259, -6998649, 11839077, 3751117, 830002, +15189152, 2345589, -1803886, 10972031, 4006668, -14903000, -7468948, 1809255, -4811974, -8448201, +-5206037, 19270444, 8797704, -9032853, -1157494, -5062156, -2547453, 2840047, 13530221, 274341, +-3712999, 18009872, -6511171, -16307454, -15655156, -18458158, -3355980, 1444183, -558346, -3222836, +-2339147, -7874286, -1634772, 2345052, -2535641, -2308008, 1475321, 1546188, -11713450, -4745402, +-9195525, 469225, -3180423, -2914135, -4971962, -1489280, 1201517, 7096360, -32212, 8695161, +4151623, 6397354, 562641, 3034395, -3085397, 5838471, -156229, -4130148, -6352794, 3631932, +440234, 2030446, -1762547, 1186485, -2100776, 2051384, -849330, 2423435, -646929, -971200, +1380832, -277025, 7275138, -12087112, -3051038, -3249143, -1599339, -853088, 32056026, 5239323, +11708081, -5702643, 10222022, 20656108, -17733920, 26838714, 15896748, -7194070, 220117, 1617592, +-9676024, -16204375, 1092532, -9399536, -14471892, -6487548, 1261110, 13422, -1799591, -6505802, +-1110786, -6334540, -465467, -7321309, -558883, 5000953, -11381663, 6229850, 9536438, -7453379, +-6947110, 4927938, 3702262, -656056, 28770912, 2534031, 19168976, -13808320, -1369021, -16740709, +-12316356, 2953864, -12353937, -16922172, -11314018, -12853763, -2836826, -3425773, -14304925, -15511274, +20201378, 3175055, 1235340, -2745021, 10445360, 5818607, 12606266, -1255204, 11912092, -6684043, +2681670, -22363358, 18227842, 8834748, 1391033, -12281459, -972273, 5547487, 1116692, 2138894, +8977019, 12592307, -9803263, -12534862, -8305393, -1959579, -263067, 1374926, -7421167, 843961, +2052458, 5191542, 6684580, -849330, -4230006, 7032472, 3408057, -5242545, -427349, 2543695, +-3204046, -5539971, 931471, -1876364, -1899449, -164819, -2506650, 6448357, -6875706, 3744675, +-273804, 7132330, -7526930, -1802276, 1166084, -1884954, -2924873, -1192390, -5992553, -6483790, +-1321239, 685047, 1818382, 2357937, -4503810, 4469451, 3274376, -2651606, 3885335, -783295, +2183991, 198642, 2157684, -1801202, -1527398, 614180, 1067836, 2618856, -442919, 3592740, +-1770063, -1241246, 537, -1301375, 2267206, 2306398, 15679315, -6322729, -5145908, 17498770, +-14630269, -11142219, -2691334, -8851391, -1371168, -17428440, 3972308, -10710038, 8311836, 1219771, +2866891, 10049687, 2922188, 7109245, 9740986, 9256191, 7646653, 12948253, 1578401, 8819715, +7903277, -9352291, 16326781, 4043712, 7572028, -8726837, 12750684, 5783711, 8966818, 2316598, +3227131, -1591822, -11675869, 3040300, 6670084, 7871602, 8578123, 1893544, -14208826, -8953933, +10293963, 5636608, 2374580, -5357972, 7138773, -5122286, -14241575, 21032454, 12849468, 9424232, +-8028905, -3910568, -10598369, -33097018, -961536, -4566624, 4323959, -7682623, -8282845, -14558865, +2629057, 4755066, 18602040, -14570140, 5981279, 340376, 8589935, -12817793, -15770046, -9563282, +10267119, 3190624, 3246995, 5507222, -4290136, 1889249, 12030203, 4341675, 6120329, 7728257, +-2997350, -2699924, -4963372, 212064, 5294084, 6577743, 304406, 2782602, 1372779, 1148904, +4984310, -2943126, -2546916, -4189204, -2343442, -4336307, -66035, -6638409, -2648921, -7020661, +-323733, -4175782, -1155346, -860604, -2393371, 2178622, -1700807, -9034464, -1286880, 3805341, +4095788, 7693897, -1039382, -4343823, 2234457, -1620813, -6582038, 6309844, 5300527, 5164162, +11772505, 7816304, -543850, 583579, -2516314, 3272228, 1048509, -27091580, 15087146, 16077673, +-8443906, 13667660, 4504347, -22891638, -4293894, 29402272, -4524211, -20046222, -3387119, -2189360, +-17462800, 11729019, 2198487, -8943196, 12654584, 8309151, 30327838, 17666274, 179852, 1971390, +28595356, -7690676, 7016903, -12082280, -17282948, -5343476, -11835856, 2324651, -1137093, 5549098, +-1176821, -2345052, -5181341, 22502408, 811212, -18216030, -14530948, -3511136, -3985193, -908386, +7144678, 20518670, 12993887, 4127464, -12903692, 15904264, 29258390, -6511708, 13133473, 12299713, +35315904, 6513318, 6503118, 10509785, 14890115, 8158827, -12505871, -12006581, 7910793, -22082574, +-13430363, -15896211, 14555644, 12732431, 8790724, -3795141, 10657424, 22601192, -13312251, 17954574, +17843442, -2680597, 17535814, -16988744, -7670812, -6080600, 37044092, -18456548, 18067316, 11238319, +6484327, 4984310, -16790638, -1865626, -13261248, 13721884, 12984760, -433792, 713501, -6889128, +9642738, -4099546, 729608, 3517578, 3801583, -243739, 5785858, -4381404, -2500208, -1870458, +-4407174, 1678259, 3392487, -3284576, 1413581, 4090956, 7314330, 963146, -7227356, 2761127, +-7813083, 1161252, 6567005, 4256850, 6961068, -1436667, 11378979, -4792110, 8334384, -2432562, +-3039226, -1707250, 228170, 9205726, -7074885, 4333085, -457951, 4395899, -5811091, 1297080, +2000918, -2697240, 12066174, -6914361, 5221070, 5700496, 20216948, 36251136, 3677566, -3995393, +3623342, -2172717, -6247567, 875100, 3565897, -9111236, -12115566, 3830037, -6411850, -3556770, +9043054, -651761, 18004502, -9790915, 17644262, 8616241, 1505386, -10565083, 3122978, 17683990, +4910222, -9233106, 3269007, -2316598, 242666, 10332081, -14790257, -7833484, 15948824, 200253, +-4271882, 13939316, -963683, 4847945, 2930242, -13604309, -24834038, -5325760, 8247411, 15623480, +3128884, -12195560, 15444702, -5260261, 31614180, -16252693, 21179558, -12639015, 7397545, 18313204, +-27481348, -28198608, -475668, -8039642, 6977175, 8886287, 1004486, -4211753, -16919486, 11142756, +-2700461, 19893752, 8728447, 18524194, 4777078, 10762114, -4829691, 14217415, 4857071, -8585103, +1436130, -288837, -41419592, -1258962, 6931541, 9910637, 17083232, 14711874, -5114769, 1210107, +-3368328, 2731062, -327491, -4595615, -11221676, 4716948, -6685654, 14244796, 1352915, 2771865, +6674916, 4141959, -4821101, 4113505, 9996536, 9065065, -3427921, -1633161, 1137630, -2177549, +-1843615, -6427419, -1522029, -13483513, -2239289, 4666482, -11635066, 7857643, -8876624, -6860137, +1647657, -6971806, 6769406, 2831457, -3073586, 4728759, -932008, -703838, 2597918, 9997073, +-7300908, 1627256, 1076426, 4471061, 2778844, 2094870, -4131759, 23893976, 30876520, -6633577, +-1109175, 10950019, 40814000, 1231045, -24016384, -9549323, 4977330, 4728222, -7543037, 7882339, +-5428839, 12720083, -20362440, 1173063, 12799003, -8432095, -9149354, 1879585, -20131586, -6120329, +-6514392, -32052804, -27091044, -15628312, 11915850, 14059039, -2385318, -22774600, 2636036, 926102, +-751619, 4702453, -11435350, 27592480, -7788923, 3619584, 30493730, -26525182, 12899397, 4630512, +-9246528, 11198053, -7153805, -21476984, 492848, 18824842, -8321499, -13439490, 7826504, 2658048, +17861158, 276489, -27435714, 2343442, -16207596, 27214524, -9787157, 4243428, 6684580, 3400004, +-3860639, -17414482, 7362111, 18592376, 5377299, 19180788, -27834072, -15167140, -4573067, -79457, +3015067, -21322366, 19262928, -2468533, -20478404, -6655589, 12968117, 12243341, -11340324, -15569256, +15567109, -12351789, -7856032, -93416, -1926830, -1513976, -1017370, -4381404, -871878, 8020852, +-1777580, 7392176, -8228621, 5924371, 7490423, -1788317, 4042101, 1453310, -1526324, 337155, +1013075, 13612362, 694711, -2306398, 1134945, 3229816, -6681359, 2659122, -8543227, -405874, +9873056, -3267396, -7784092, -2587718, 4423280, 444529, 319975, 6137509, 459025, -7479686, +-4058744, 14519674, 10362682, -3089155, -615791, -146029, -21130702, 31061204, 885300, -53202296, +21311090, -7313256, 4146254, 5427765, 7143068, 13059385, 4760971, -9633075, -2326799, 13151727, +8892730, -10564546, -565325, -8382166, -4345970, -26132728, -3335042, 12576201, 15618649, 3510062, +-6199249, 17301202, -17823578, 19713364, -11359115, -6381785, 2349347, -6118718, 5255966, -15728707, +-21233244, -23763518, -7606387, 12303471, -4752382, 118648, 14471355, 4017405, 2528662, -455803, +491237, -5006322, 194347, 15595026, 9601399, 16457778, 13960254, 16510391, 11236708, -9819906, +-6261526, 4054449, -1052267, -18977312, 12759274, -3436511, -17927730, 22502408, -254477, 3655554, +-626528, -8188355, -2702071, 9448391, 13690745, 11385421, 348966, 6972343, -22963042, -3264712, +-8183524, 12492449, 4313758, -6403796, -7304666, 28913182, -8815420, -9910100, -3133179, 4659503, +-7159711, -19059454, -1075352, -3269007, -10296647, 17854180, 3644280, 6717866, -5488432, -961536, +4159676, 1067299, 5253282, 5659157, -1855426, 3467649, -3438121, 3930432, 1500554, -3165391, +-2390686, 2908230, 4110821, 1109175, -3629247, -3021510, -3262028, -2419140, 88584, 2033130, +-2953327, -3593814, 858457, -294205, -635118, 3089692, -1442572, 4900558, 1502165, 14375792, +-1203665, -1818382, -3156801, 1750736, 89657, -6059662, -7962333, 72469520, -71069360, -3511673, +-77274512, -11915313, -29359860, -3527242, 18913426, -9533754, -21363168, 33789580, -9092446, -5825050, +1149441, 10451266, -1175210, 28092308, 18592914, 11178726, -16525960, 1155346, -11267310, -11438035, +-7656853, 468688, -3511673, -3049427, -9327595, -2033667, 15519327, 1955821, 10276246, 10288057, +-807991, 13717589, 19937238, 1112933, -4070019, -10354629, -12409771, 5006858, 5450314, -10263898, +16893180, -22274774, -22566832, 2525441, -7894687, 12108050, -20924006, 8966818, -40242232, -21417392, +-32216550, -2765959, -15901580, -1415729, -9706626, -12080669, -10530723, -940598, 2728378, -31457952, +3587908, -6874632, 3611531, 161598, -14553497, -25591026, 17707076, -15394237, -2751464, 15859167, +-1606318, -4954782, 10482405, 13146895, -2710124, 13095892, 8567386, 15822123, 8720931, 16010027, +7577933, -9472014, -2639794, -8342974, 381715, -6906845, 1479616, 5806796, 8195872, 8987756, +-3984656, 4182225, 2996277, 5897527, -1396938, -2237141, 3075734, 7066832, 930397, 1651415, +7783555, 4002373, 8012262, -1133871, 369904, -818728, 3908420, 5555540, -1008780, -9212705, +5055714, -1531156, 1963874, -2886755, 1281511, -2612951, -1364189, 491774, -7684770, 133144, +10522670, -6570763, -6940131, 914828, 3591667, 3673271, 1241782, -7271917, 58631672, 29427506, +14221174, -14234595, -7376070, -30670362, 6722698, 24515674, -4820027, -5890548, 40206800, -7261716, +-8966818, 19858318, 29431800, 5036923, 30019138, -7577933, 4356171, 17673790, 20013474, 31561568, +25556666, -1420560, -11434277, 9433896, 11502996, 10817412, 13526999, 23580444, 11549167, 30007862, +-11697880, -882079, 8767102, 8081518, 25447144, 14725832, 27275190, -19775640, -6226092, 10808285, +-21246666, 17044040, 17370458, 16577500, 7068980, -21477520, -7843684, 40459664, 10409390, 27245126, +22651658, 24773908, -5137318, 32866700, 51583096, 17675402, 4519380, 36107792, 24982214, -14044006, +-8619462, -17635672, -14056891, 15134928, 17677548, 1429150, -14963666, 198105, -13383118, -735513, +-5998459, 8618926, -31428960, -3702262, 3136937, -16025060, 11964705, 1999844, -9841918, 8267275, +-19792284, -12974559, -21923660, -7444789, -10590852, 7618198, 2382096, -10305774, 2281165, 14183056, +4198331, -4809290, -8713952, -13637058, -5242545, 4356708, -19148574, -9045201, -1650878, 15249818, +5142687, -6657736, 3204046, -10437844, -2835752, -3295851, -8551280, -5639292, 14368813, -3444564, +-1017370, -3634616, 3394635, 9061844, 6539625, 7746511, 19828790, -103079, 15988016, 618475, +1650341, 9886478, 8588324, -13291313, -7611756, -1160715, 3101503, 1269163, 138513, -1452236, +6278706, -18450106, 9327058, -22260816, 39296268, 55759948, 32500554, -14155138, -30470108, -11139535, +27617714, -8026757, -22693534, 41603200, -28653874, 24900072, 14070313, -32446868, -13418552, -3286187, +-53692996, 2275796, 6261526, -25792890, 53061100, -18057654, 49284748, -36715528, 5546951, 2518462, +36053028, 53149148, -4287451, 18157512, 25099252, -29134910, 19740206, -39491688, -10860899, 75533440, +-4167729, -20614770, -3996467, -41995652, 1899449, -13095355, 47230144, 18119394, 22027276, -7036767, +-12383464, -23279796, -21642878, 5669357, 3085397, 325881, 31471910, -7414188, 6066105, -32363652, +-16814796, 21985938, -48455284, -18903224, -14523432, -16356846, 45387604, 3539053, 49031884, 35349192, +15680926, 19030464, -10907606, -25618406, 21996138, -34956200, -21451752, 43719544, 13265006, -25899726, +-43102144, -25845502, -30656940, 24954296, -26457536, 14041859, -19093278, -1379221, -16391206, 17805324, +10268193, 1831267, -14215805, -2347200, -9802189, 3195993, -19353122, -13151190, -7263327, 4574140, +10875931, -86436, -7864622, -10747082, -17987324, -12592307, 11487427, 15963320, -4894652, 11111080, +21977348, 10805064, -20350628, -5682242, -7464653, 13198971, -12411382, -7868380, -2909304, 5069672, +-16324097, -21756156, -15682536, -4917738, 9084930, 34360, 2061047, -2790655, 12432857, 4223027, +-761283, -11124502, -3783329, -6764037, 8746701, -2146410, 2098092, 35140884, -58771260, 62159988, +-1738925, 4619774, -20148766, 50156628, 11641509, 32234266, 12073690, -21434034, 7068980, 17819820, +-30988726, 21369072, 203474, 14114336, -41306312, -3398393, 9904195, 37673304, -15975131, -31427350, +-1551020, 37465000, 19693498, -14583025, -32647658, -1797444, 27012124, 3361886, 1716376, 7341173, +19592030, 49715320, -70536248, -11802570, 6626598, 38938712, 8590471, -21517786, -5450314, 14713484, +35651988, -3812857, 1578401, -67676336, 19376208, 10353556, 18249316, -49156976, 43146704, 37093484, +13886166, -22344030, -2401424, -24702504, 18175228, 31739808, 13256953, 14750528, -2924873, 24012626, +-35414152, 33250564, -10034117, -12125230, 39187280, 32203128, 1969779, -12440373, -32441498, 23476828, +25793962, -69422776, -5599027, 39617852, 9810779, -631360, -24863566, -10847477, 67572720, -5375152, +-23243290, -3121368, -12574591, -15248745, 22414898, -19216758, 6781217, 10084583, 13651017, -9692667, +1268626, -9838159, -11662984, -7910793, 10298258, 10205379, -10674604, -2301566, 5121749, -8603356, +20415054, -19841676, 5069135, -3716221, -6422050, 7100118, 33864744, 2051384, 24159, -5616744, +-11971684, -116501, 18433462, 4231080, -878321, -3745748, -8705362, 15554224, -4064650, -1080721, +-9227737, 8855686, -1446867, -4320200, -52583820, 25236690, 4634807, 15960635, 19322520, 28213640, +9839770, 8872329, -13859323, 14404247, 2446521, 33532420, -4146791, -10390600, 26332982, 20113868, +-4715337, 1470489, -11606612, 62277, 8185134, -2913062, -7021735, 14871324, -12305081, 1270237, +20307142, -4726612, 11630235, -21220360, -4482335, 2502355, -8830453, -3630321, 2187212, 14669461, +-4014184, -25324200, 780610, 49613316, 10144713, -27336394, 7887708, -27865748, -19073950, -14524506, +-4052839, 31568546, -3646427, -25652766, 51322712, -55997784, 9286793, 56615724, 5847061, 39721468, +-30724048, -57285736, 18242336, 1688459, 45283988, 2139431, -25773562, 20834886, -5886253, -4986994, +-11040213, -2082522, -16083042, 7701950, 2086280, 11885248, -19600084, -17010754, -6784975, 19889994, +25796648, -8912594, 13682692, -2348273, 21585432, 15088757, -27385248, 21529060, -5682242, 2962991, +-4708895, -8747775, -165893, -396211, 2891587, -2361158, 2236067, 1677722, 1498407, 2850248, +-9044127, 171799, 4976794, -7816841, -1009854, 4502200, -4844723, 5993090, 6929930, -10586021, +12380780, 4735739, 12829067, -3174518, 5944772, 10023380, -19584514, -569083, 5989869, 11091216, +-6999723, -5535676, -6729677, -5217312, 11402064, 22564148, -9731859, -106081400, -243754432, -96599184, +-146715008, -214809568, 115480400, 31938450, 66448512, 305956288, 235827520, 137586064, 251857424, 187937568, +32114544, 62139048, 51692616, -119334592, -102132176, -50017580, -182538800, -174536192, -66845796, -89669792, +-126631744, -52927420, -45485852, -128869960, -107575512, -8918500, -61281132, -104482056, -35891968, 33348810, +-75902808, 22875532, 112980192, -8585103, -16192564, 153461328, 122539712, -5336497, 179270320, 207756688, +84367656, 195198752, 273861088, 163419744, 141948128, 328678272, 262294192, 197233488, 233786880, 310098240, +110869752, 44022876, 129827736, -102349608, -293803136, -212952528, -324941664, -526171072, -471316832, -500182752, +-581717376, -592851008, -511226752, -445141696, -446453792, -313833248, -139023792, -94118304, -14260902, 152336048, +279900864, 282594880, 350785536, 504700544, 441149504, 403304960, 557276864, 442954464, 250352576, 365381472, +255838848, 99365680, 89894200, 118074560, 12171937, -37207840, 22928682, 3420405, -82732344, -44043280, +7373922, -65840776, -122082832, -58566176, -83759912, -177770304, -112099184, -43255152, -132912056, -89288072, +17914846, -42174432, -62072476, 30514668, -36720896, -146380544, -112213536, -179693920, -303886112, -286110336, +-274438208, -285029056, -250571616, -168308496, -131546256, -79125112, -15362024, 67011692, 118789672, 182319216, +229953088, 285655584, 297182208, 315216224, 351171008, 333135904, 305451616, 288976128, 191427760, 67463736, +6396280, -28631326, -81791208, -96422016, -84175456, -95040112, -106743360, -94031864, -94978904, -93069792, +-78594680, -76689328, -80470504, -77655696, -67998456, -56378424, -48183092, -31522912, -19556596, -3972308, +2241973, 14318884, 21761526, 27354646, 28386512, 30036316, 29775934, 23423142, 13696114, 10580115, +5338108, -1497333, -7163469, -9122511, -20160040, -26324928, -32513976, -43333000, -51040856, -47828220, +-46061912, -41101228, -30829276, -21849036, -16048145, -4029753, 8537858, 16728898, 25423522, 39543764, +42771968, 42411728, 45886356, 50422916, 46664284, 48507360, 50929724, 48279728, 46437188, 46646028, +41264436, 35532800, 31338228, 24085102, 13677860, 6203544, -2624225, -14336064, -26169236, -34802120, +-45135812, -51350092, -54061292, -53309136, -52699248, -48287244, -41787348, -35224100, -28522878, -19915764, +-14063334, -7572028, -2129767, 3038153, 7327751, 10848551, 13807246, 15938087, 15619185, 15316927, +13914620, 12097849, 10292889, 9065602, 7478075, 6085969, 4820027, 4054449, 3210488, 2785823, +2450279, 2230162, 1970853, 1804423, 1735167, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -8537321, -5090610, -6489159, 817118, -2736968, -835908, 2556043, -4011500, -7315940, -1848983, 641024, --4179540, -2405719, 3586298, -2092186, 1675037, -9168681, -760209, 6233072, 3339874, -10261214, --3510599, -2680597, -2700998, 3486977, -1469953, -5339181, -3332895, -3813394, -3865471, 6786585, -2148558, 4374961, -2795487, 5741835, 5240934, 3723200, -2028835, -4852776, -3787088, 413927, -1003949, 7804493, 2798171, 1491964, -3637301, 855235, 372588, 899259, 3126199, 1836635, --5255966, -4494684, -2288144, 2853469, 701690, -993748, -5619965, -1726577, 2259153, 2565169, --2243584, -861678, 166967, 2714419, -544924, -2994666, 44560, 431107, -3819300, 8218957, -558883, -5580773, 33823, -862215, 5319854, 420907, 3614752, 4927401, 1892470, -340913, -281320, -1796907, -1124745, -1197222, 3176128, -1016834, -362388, -1421634, 1123671, 370441, --564251, -137976, -775778, 155693, -76236, 625992, 680752, 1036698, 1330366, -5672578, --5135707, 5773510, 5294084, -4325032, 3179350, 296890, 1628330, -14149233, 5442261, -2124398, --9665824, -12602508, 319975, 9068287, 531502, 5870684, 202400, -11401528, -3942780, 1285269, -3962644, -2029372, -988916, -4815732, 619549, -896038, 8025684, 4060355, 1694902, 1416266, -2171106, 2765422, 7317551, 4416300, -6489159, -576599, 1493575, 1540283, -7714835, 2479270, --2302103, -4899484, -1390496, -233539, 5258651, 1327682, -2956011, 5309654, 8308078, -1789928, --3166465, 1984275, -606127, 4520453, 4627291, 3602941, -5572183, -4262218, 3979824, -1712081, --1406065, -4294431, 453119, -6364605, 3764539, 3371549, 4457103, 1119376, 5181341, -5644661, --3536906, 7262790, 373662, 2675765, 8601209, 3299072, 839666, -3495567, 5042829, 579284, --2569464, 1416266, -6094559, 145492, -648540, 879395, 1627793, -722091, -2719788, -1514513, --448287, 1298691, 1236414, 392453, -755914, 715649, 1713155, 275952, -574989, -555661, -7516, 7188702, 636192, 2783676, -6051609, -5139465, 2942590, -1424319, -2213519, -2810519, --2630131, 2185065, -7003481, -4013110, -8648990, -10387915, -1924145, 8650601, 5574868, -3490735, --974958, -1198833, -2015413, -7480223, 5388037, -1875290, -1924682, 476205, 3520800, -1682554, -309775, -255014, 5099737, -4713190, 5115306, 2798171, 6133214, -2088965, 4744328, 2115272, --2940442, 4284767, -2907693, 2469069, 4545149, -3427921, 4773320, -2847563, -2308008, -716723, --1419487, 2411624, -1397475, -3628174, 1454383, -3148748, 685584, 435402, 484794, 7211250, -1393180, -1650341, 33286, -2947958, -4130148, 2137283, -1001264, 6884833, 7005092, 2851322, --1955821, -1075889, -59593, -2756832, -3208341, 3545496, 5549098, 186831, -615254, 3427384, -3678640, -473520, 1292248, 1193464, -2692408, 2551748, -498753, 3659312, -1822140, -690416, --150861, -1510755, -179315, 2668249, -595390, 814433, 766115, -1871532, 574989, -336618, --394063, 768799, 681289, -1194538, 1356673, -455803, -605590, 109522, -170725, -216896, --1114544, -805306, 353798, 13716515, -5801427, 5624260, -6991133, -5879274, 29528, -1630477, --1486596, 1912871, -2940979, 5932961, 5788006, 4959614, -1487132, -644782, -2581812, -6328635, -990527, -3801046, -702227, 696322, -2119030, 3608846, 1365800, -431107, -10448045, -4359929, --6584185, 249108, -4307316, -6621766, -2901787, -3658239, -4047470, 6595459, -5267778, 4649839, -404801, -1868848, 2604898, 2238752, -4721780, -1292248, 99321, 5093831, -483184, -6960532, --8831527, -9193377, 2393908, -3357591, 203474, -727460, 1331440, 3109556, 5112085, -3529390, --1868848, 1683627, 1758789, 656056, 6410239, -3585224, 3964255, -7362111, 14432164, 1775432, --1535988, 2806761, 1381906, 2760053, -4012036, -706522, 1095754, -444529, -863825, -7282654, --2421825, -4949413, -1473711, -578747, -3569655, -3488587, 2592013, 3028489, 922344, 595927, --333934, 2558727, 1503239, 2937758, -1472100, 259309, 89657, 2699387, -1083942, -158377, --165893, 301185, -2138357, 526134, -1548336, 780610, 1075889, -511638, -1801202, 359704, -551903, -555125, -622233, -1934346, 507343, -226560, -991064, 1221381, 1401233, -179315, --413927, -6754373, 930934, 1198833, 401579, -1105954, -4059818, 2343442, 1870458, -6107981, -7076496, -8924942, 10910291, -1123134, 3614752, 1564979, -264141, -1229971, 2213519, 10213432, -11474542, -2259153, 2034741, -1440962, -1672353, 1472100, 2407866, 7839926, -1037772, 2336999, --4030827, 4272419, 926639, 6168647, 2981781, 5774047, -8439074, 3488050, 3033321, -2704219, --117575, 6272263, -1611, 438087, 1897839, 3792993, -1333587, -606127, 12183748, 5752035, -1056562, 1052804, -2576444, 5484673, -7402376, -10872710, -13113072, -865973, 6860137, -272730, -3409667, 9244380, 3656628, -1709934, -3293703, 4898947, -983011, 11902965, 5359046, 1711008, -1654099, -6595459, 1370632, 4866198, -2527588, -7419019, 1275605, 2579665, -335544, -2621004, --952946, 1184337, -2403034, 1315871, 1349157, 1181653, -486942, 1373853, -2355790, -2253247, --730681, -1455994, 740345, -2262374, 1258962, 2081449, 1406065, 1552631, 1618129, 441308, -1036161, -3095061, -2558727, -1023813, -1345399, -1651952, -332323, 940598, 557272, -182536, -1891933, 954557, -147103, 2315524, 1483911, -80531, -16011101, 1646046, -1265942, 10876468, --8249022, 4736812, -16945256, 6581501, -1649804, -8674760, -9511205, -6684043, 4990215, 3870839, -12767864, 1631551, 4220342, 12199855, -2180770, -8998493, 1293859, -6951405, 1636919, 9931575, -1817308, -2878702, -1233193, -1989107, 2901251, 3799436, -863825, 2514167, 5116917, -3294777, -1596117, -6127845, -504659, -7650411, -1221381, 953483, -3623879, 5506685, 3783866, 4679904, -9461813, 524523, 11457899, 8711804, 4224637, -6059125, 13146895, 5583995, 2287607, 11460046, --1292785, 170188, 936840, 3742527, -2432562, -3463354, -7936026, -7749732, -6271726, -24696, --4953171, 10036265, -6129455, 4095251, 6302865, -3649112, 303332, -3002719, -1720134, -10053445, --11413876, 5109938, -2006824, -3924526, -3398930, 870805, 1313723, 666794, 2211908, -4086662, -9299141, 549756, 2784213, -2017561, 500901, 2666101, -4559108, 1422171, 158377, 1459752, -2096481, -124017, 1634772, 3070365, -7516, 803159, 2279554, 2415382, 3284039, -256087, -552977, -1806571, -481573, 48855, -798864, -2509335, 160524, -811212, -1040993, 137976, --972810, -1393180, 13328894, 486405, 140123, -1257352, -2630668, 2375654, 534187, -6835441, --8750996, -11855183, -6221260, -12403329, -7892540, -4241280, -9181566, -5818070, -4028143, -4786741, --12404939, 8468602, 5298916, 288300, 4454418, 2029909, -3462818, 15348066, 921271, -5340255, --2815351, -10449655, -4508642, 11421929, 530428, -9635222, -9630927, 1371705, -9748502, 3087545, -3381213, -7601019, 271120, 2338073, 508417, 11240466, 3346317, -5174899, 1108638, -6198712, -5658620, 780610, 2488934, -13809394, 9473087, -4765266, 3928821, 289910, 1811939, 2232846, -323733, -4043175, -348966, -5411122, -20938, -10894721, -92879, -11751031, 15418933, -2658585, -9797357, -7260642, -3414499, -1584306, -7494718, -4198331, 6002217, -249108, -266288, 4442070, -5767604, 897111, 9440875, 8169565, 11360725, 6036040, 2385854, 1356673, 5137855, 2729452, -1684701, 2070711, 1134408, 2505577, -754304, 4115116, 687195, -302258, -911070, 3197066, -1276142, 2265059, 1115081, -1555315, 1064615, 1239635, 1030792, -2540473, 4733054, 2536178, --505732, -3684545, -442382, -587874, -2665564, 915365, 430570, 2676838, -2281165, -5076115, --6799470, 20938, 5088463, -13105019, 45634, -5637145, -4502200, 9364639, -15122580, -14282377, -3786014, 19159312, 540629, 1866700, 1520418, -2863133, 10515691, 10210211, 5921150, 2932389, --2704219, -15484431, 9259413, 128312, -12394202, -3965866, 2937221, -579284, 155156, 1321776, --2945811, -12205223, -639413, 550830, -2189360, -5070746, 3728569, 10678899, -13662828, 8581345, --5090610, -2532957, 865436, 6819335, 22333830, -14361297, -3581466, 1464047, -1378685, -2588255, -787053, -5475547, 1973001, -4940286, 15370614, 5317707, 2920578, 4277251, -3187403, -834834, -8159901, -1224603, 3575024, -6693170, 11811697, 572841, -8274792, 16498580, -10430865, 7623567, -2209224, 3785477, 12013560, -4718022, 5144834, -532039, 74625, 1492501, -749472, -8024610, --4226248, -468688, -3517578, -1216550, -1893544, -4902169, -5009543, -3750580, 2412698, -4286378, -2552284, -1108102, -124017, -3754338, -2549600, -2756295, 2292976, -5202816, 583042, 561030, -3245922, 5044976, -1901597, -897111, -4437775, -3785477, 326418, -3324305, 1008244, -572841, --2931315, 110059, -847182, 1414118, 1857573, -1200443, 16273094, 1248762, 4224637, 4810900, --2753611, -9407052, -7383049, 1103270, 16278463, 9218610, 1981591, -14602889, 2075543, -8041790, -22549, 16290274, 15662672, 7902740, 10579041, -9589588, -19841138, -10397042, -14307610, 7897371, --168041, -2435247, -81604, -10828686, -3235721, 3322694, -2058363, -4127464, -4022774, 11537893, --774705, 3124589, -3313567, 7558069, 1578401, -4392678, -9220221, -7081328, 20895552, -920734, --4759361, 6665789, -11985106, 3730179, -6871948, -20910586, -4715874, -2737505, 6293738, 2403034, -5525476, 1744831, 8237211, 290447, 544387, 4557497, -20448340, -3244848, -5515275, -1477469, -1952063, 11705933, 12923020, 4649839, -3420942, -8950712, -11764989, -3958349, -6935299, 1460289, --3466039, -3677029, -8113730, 12072079, 8681203, 3523484, 11085847, -2666101, 4407174, 6801081, --4376572, 4043712, -2831994, 870805, 4021163, -1252520, -2724083, -1136019, -1520418, -1074279, --129923, 256087, 3981972, 143881, 442382, 1217086, -2270427, -6198175, 210990, -1458678, --841277, -1136019, -3676492, -430034, 1171989, 5479842, 4476967, -2567317, 593242, 3600256, --807991, 816044, -1343251, 813359, 3426310, 420370, 3762928, -23602992, -15431281, -3570192, --5617281, 12064026, 8288213, -1974074, 20772610, -20986284, -4890357, -7917772, 22187264, 10647224, --7285875, 8182987, 3115999, -8629126, 15324980, -16891570, 8370355, -7776039, 1326608, 1847910, --5634460, 14799384, -10391673, 9090298, -4324495, -21759914, -3605088, 15210627, -9199283, -14854681, -209380, -1846836, -22230214, -4151623, 8928700, 3790309, 11865384, 8727374, -2506114, 21395380, --5112622, -6580427, -10513543, -9788767, -9468255, 5877126, 7992934, -6880001, -7761543, 2567854, --6731825, 8973797, -2465311, 4873178, -3637837, -5556077, -4264903, -118112, -12583180, 3412889, -9080098, -2118493, 3928821, 5458367, 6447820, 11623255, -8313983, 3740917, 9062918, -1165010, --19299972, -20543366, 2263448, -1950989, 1527398, -7517804, -3122978, 1516124, -7442105, -13500693, --4125853, 10190884, 8266739, -4060892, -1647120, 3136400, 2793339, -1607928, -3282429, 244276, --435402, -5309117, -1970316, 5641440, -1626182, 4532264, 814970, -1411971, -2782065, 3639985, -3586298, 4212826, 500901, -2368138, 2442226, -6326487, -3799436, 3115462, 1450625, 2672544, -4919348, -2518998, 1014686, 1930051, 2394981, 456877, -2895345, -4154844, 1848983, -2264522, --1392106, 16779364, -10826002, -27066884, -24696, 19059454, 24366424, 4444218, -9178345, -6915971, -2377265, -4509716, -4013110, 10636487, 10784126, -5487895, 10400800, -13496398, -1775969, 9511742, --4845797, 11545946, 5355824, -1750199, -16204375, 6016176, -3899294, -3947612, 684510, -1328756, --1851131, 21912386, -10976326, 11121818, 18748070, 12972949, 6753836, 118112, -12625056, 12361453, --7131793, 11771968, -6854768, 2622615, -13266617, -2653753, -12547210, -8272107, 1733019, -11669963, --3343095, -4148939, -624918, 10155450, -12261058, -10540923, -3952981, -6106370, -2609730, -10450192, --13494787, -16822314, 1532230, 12829067, -1052804, -8353175, 1232119, 2638721, 10137733, -11447698, --6637335, -3737695, -442919, 7597261, -17180, 2041720, -7963406, -3376381, 3923453, 15522012, -6862284, 10692321, 12419972, 16222091, 6217502, -2314987, -5879274, 3884261, 4911832, 7115687, -2988224, 607201, -74625, 9820443, 3468186, -3747896, 714575, 5476620, 2172717, 1271310, --3704409, -3629247, -2602213, -5019206, 271657, 4605816, 4431333, 919660, -2723009, 6455336, -3712462, 8196408, 4263292, 178778, 5484137, 4295, -4349728, 6271726, -99858, -925565, --2466922, 1189706, -1566589, -192200, 5496485, 3192235, -45167488, -21471616, 15071577, -36884104, --25564182, -1650341, -15044197, -10320806, 11260867, 12869333, 3950296, -2369211, 4669703, 36830420, --4506495, 5888937, 14190035, 16156593, -16787416, -8721468, -7943542, 13595719, 14858439, 7453916, -2747169, 13898514, -4070019, -6971269, 9780714, 18811420, 1358283, 6076305, 19157164, 14113799, -11532524, -8593693, 3648038, 5794448, -12885, -318364, 12308839, -4030290, -167504, -1245541, -8231305, 304943, -13407277, -8994735, 2724083, -18245558, 13852343, -4054449, 30569430, 1215476, -16781510, 3320547, -697932, -9848897, -439160, 3913789, -12879533, -6648610, -15050639, -1907502, -7754027, 10512469, -4549444, -24551644, 8930848, -3902515, 8413304, -8804146, -10479183, 7707319, --15865609, -12170327, 23738284, 354872, 10952703, -2233383, -10224707, 2850248, 13997298, 3401614, -11140071, -17984638, -854699, -1217623, -2942053, -15460809, 15136538, -9001178, 1146756, -1760400, -1861868, -5731097, -521839, 3176128, 4667556, -3823058, 9932112, -2433099, -3119757, -5788006, --4901632, -4993437, 4798552, -1916629, -3451006, -1459215, 1304060, -3796214, 6962679, -2058900, -7875360, -4895189, 3373160, 1221918, 3178276, 5082020, 1084479, 18233210, -8434779, -21275120, -9006546, -11151346, 4552666, -365072, -10632728, 19417548, -26162794, -1159641, -31565326, 685584, -25360708, 35512936, 16758962, -6195491, 16375637, -1331440, -2362769, 1687922, -2870112, 8671539, --1161252, -16740709, 897648, -23232552, 8074002, -7246147, -5240397, 15444702, -392453, -17883170, --19979650, 4533875, 2672007, -9998684, -8339753, 14825690, -21652540, -197032, -4430259, 7533910, --5867999, -4760971, -17337172, -7417946, -7697119, -3302293, 12365211, -14840723, 5235029, -1880659, --2637110, 1856500, 5286031, -25065966, -2736431, 3307125, -2284923, 9163850, -7949985, -11121818, --5114233, -28038620, -12412455, -12269648, 504659, 11855183, 17892296, -8583492, 13518946, -23393614, -37286220, 2482491, -6794639, 19469086, -23270670, 19541028, 8684424, -5328444, 320512, 6466610, -431644, 3054259, 17783312, -7724499, 7536057, -4220342, 5426691, 8832600, 8685498, 10646687, --3791383, 8964134, 2037962, 1275605, -1598802, -12120935, 359167, -8624831, 3837017, 5462662, --1952600, -1420560, 1505386, 1136019, 5919002, 2698313, -4466766, 6450504, -186831, 687195, -7966628, 5435818, 3125126, 14571213, -12145631, 8053, 5255966, -66035, -9564892, 2214593, --6120329, -5758478, 22950158, 1328219, -16338592, -337692, -2447058, 10660109, 7039452, -9957882, -11565810, 239444, -25729538, -28026272, -2650532, -8422431, 7037841, -1176821, -9868761, -25258702, --22018686, 12059194, -18727668, -4184372, 1231045, 5967857, 1448478, 18056580, 1557999, -9088688, -12127914, -1578937, 1816234, 11180337, -14646375, -938450, 3238942, -14972793, 9148817, 12487617, -5487895, 11114838, 5847598, 17200270, 4744865, 12528956, -17510582, -5459977, -2745021, -23556286, --67646, -2524904, 9931038, -1553704, 11375758, -1860795, -13626857, -9293772, -645319, -21786222, -9625022, 627602, -4175782, 12779138, 8142185, 10619844, 11057393, 3389803, -1256815, 9276592, --29510720, 8995272, 3787624, 13266080, -5165235, -20855288, 13212930, -3130494, 22662394, -33308546, --11803107, -23319524, 16037408, -6783901, -21391622, -23895588, -15692200, -7055021, 7687455, 6023692, --6499360, -6776385, -3506841, -409633, -7184407, -2726767, 12265353, 1914482, -1103807, 3604551, -2731599, 2258616, 6687801, -5116917, -6743099, -153008, -11761231, 17180, -4089346, -1669669, --7570954, -2041720, -10354629, -9308805, 11864847, -6582038, -366146, 3985730, 5745056, -986769, -9965398, -8230231, -2607045, 4110284, -9656160, -2650532, 11423539, 4095251, 2601677, -3878892, --5818607, 4402342, 15609522, 14469745, 53059488, 40082784, 5384815, 11589969, 3317862, 30787936, -795643, 14964740, -14058502, 36475008, -14519137, 33075544, -1544041, 21114596, -2517925, 14890652, --14905147, 3540127, 7401840, -8177081, -2718714, -4409858, -3484292, 9842991, 180389, -8559333, --11797738, -17757006, -22594212, -10871636, -3850975, 104153, 7037841, -19020800, 7994545, -10481331, --16175921, -3382824, -11833709, 5352066, -2925410, -24736328, -5932961, -12589623, -14944339, -15660525, -14147085, 18948858, -39731132, 8979166, 3473018, 11123965, 3879966, -5021891, 23953032, 13487808, -12509629, -33221036, -14912126, -449898, 8136279, 27480812, 979253, -3728032, 1280974, 23281408, -20871394, -19833622, 22338662, 1654099, 4976794, -3792993, 13087302, -28261422, -9951439, 29123636, --4523675, -1894081, -11271068, 19421842, 12637941, -10040560, -17048872, -2928094, -784368, 1729261, -199716, -3630321, -15897821, -5413807, 12299176, 16203838, 9987410, -8936216, -2420214, -2607582, --7718056, 2499671, 2507187, 7501161, -1701344, -5274220, 4629975, 1829119, 2769180, 14680735, -1936493, -4060355, -5628555, 2543695, 5208722, 11441256, 2239289, -11078331, -5989332, -8311299, -3254512, 4282620, -9239012, -19532974, 6273337, -1570884, -3344706, -6806450, -12103218, 14621679, --5729487, 12746926, 19800872, -22284438, 6972880, -12713103, 37272264, -22003118, 21073794, 19435800, --7346005, -34740916, -20212652, -2248952, -9224516, -988916, -15918759, -25294136, -33687040, -19276350, --22422414, 9737765, -19174882, 8046085, 2308545, -2157684, -1962263, -15761456, -4865661, -16193100, -4790499, 14566382, 19033148, 397284, -5317170, -16622597, -3954054, 1712618, -9894531, 2884071, --13656385, -8862128, -1937030, -13527536, 10768020, -11941083, -35391604, 1368484, -1074816, -11642046, -15114527, 11877732, 17219598, 6652905, 13553843, 27431956, 4627291, -27183384, -6194417, 12869870, --5968394, -22586696, 12674448, 18000208, 6070937, -72478, -30600032, 27413166, -1281511, 22384832, --18507550, 22668300, 55438900, -4849555, -1563368, -27012124, 14604499, -21962852, 18606872, 9496173, --12090870, -2654827, -29895120, 6952479, -16288127, 314606, 11549704, 11596949, -375810, -7677254, --6645925, 8286603, 20290500, -9773735, -1540820, 3173981, -8786429, -2509872, -2743410, 4313221, --934155, 8570070, -3844533, -9652402, -5345624, 3008088, 7714835, -9553081, -2942053, -81604, -1379221, 7219840, 1604170, -2349347, 2611877, -16255914, -9291088, -915365, -1432909, 3485366, -1037772, 1423245, -226560, -2719251, 8420283, -339839, 6302328, -292595, -1705639, -5915781, --4044786, -43641700, 14730664, -57222388, 37679212, 13447006, -9831180, 40156332, -3929358, -20559472, -35617628, -13809930, -2004139, 7472706, 12420509, 32911260, 1285806, -2754685, 23229868, 9815074, -19500226, 23869818, 17703318, 1572495, 12359842, 1895691, -1297617, -13174275, 8341900, 12496207, -2989834, -817654, -14195404, 6730751, -13299903, 15896211, 15706695, 2679523, 18566606, -11516955, -12247099, 19237696, 12274480, -26089778, -28015534, 32831804, -3216394, 20517596, 31906776, 707059, -8590, -3373160, 6259378, 18402862, 17510582, 1784559, 14545980, -35970, -16625282, -20780662, --30726732, 497679, -12480638, 398358, 17405892, 16262357, -28737626, 2424509, 11145977, -25245818, -4187056, 35022772, -15204184, -17534204, 18825916, -20270636, 4665945, -5726802, 36781564, -10732586, -22724672, -11310796, 19102404, -1835025, 7107634, 15215459, -24008868, -7358353, 9167608, -15954730, -11684995, -14324253, -3935264, -8107825, -7330973, 988379, -3926137, -6590628, 3875671, 10889890, --5474473, 2945274, 4023848, -9528922, 1713692, 1253594, -2400350, -6751152, -2725157, -5224291, --15386183, -6171331, 3362960, -20309826, 7393250, -10429791, 7881802, -4762045, -1899449, -14256070, --7359964, 130460, 4000762, -6318971, -13785771, 2267743, 1024887, 7398081, 3280281, -24696, -9104257, 7191386, 858457, 6171868, 4281009, -19846508, 4566624, -23011898, 47649976, 11774653, --25269440, 9771587, -5779416, -22487912, -26513370, -26914412, 8115878, -1219771, 23961622, 35475892, -17111686, 8678518, -4169876, 11853573, 1236414, -44398152, 19632832, 46335180, -30154966, -31705986, --27368606, -38779260, 28230820, -38185480, 17340394, 340913, -4683125, -159988, -12330851, -14721537, -19102940, -39296268, 40587976, 23311472, 5476620, -25832080, -19478214, -17085916, 3729105, 6833830, --16662862, -2253784, -12277701, 27941446, 12736189, -4974109, -744640, 11520713, 2674154, 13139379, --22698366, -8978629, -2086280, -3992172, -21107616, -14879377, 12694850, -40288940, -23697482, 3107946, -47246788, 22786412, -14272176, -932545, -35750772, 17470316, 54786064, 1961190, -11669963, -8196408, --25740812, 33711736, -10744398, -12994424, -1046361, 19989314, 12630425, -17301202, -15531675, -5563057, -17678086, -4676146, 5237176, -1357210, -13882408, -4514548, 22374096, 12776991, 1908576, -10332081, --1569811, -1557999, 17464410, 14166413, 7163469, 6404333, -20536922, 7895224, 7503845, -3077881, -4758287, -3218004, -2868501, -18046916, -1838783, -918586, -2477659, -5755793, 4919885, 6626061, -3554622, -21229486, -18193482, -9000104, 16106, 1295470, -21343304, 7641821, 27001922, 5428839, --7392713, 506806, 4250944, 85362, -11605002, -8902393, -2975339, 3651796, 192200, -21986474, --15107547, -44088912, 9799505, -32446330, -48593260, 11592654, 27072790, 6776385, 7363185, -20477868, --25669408, -6556268, -38094748, -18635864, 10107132, -31839130, 50512572, 9960566, -12262132, 10985453, --24031952, -47579648, -15895674, -36354212, 5906654, 10817949, -13282723, -25811680, -13062069, -15865609, -14106820, -18893562, -6851010, -2317672, 21661668, -15442555, -2756832, -7139310, 5601174, 9168145, -1729261, -6292664, 22333830, 29251412, 18687940, -14740865, -12127914, -42636676, -23739358, -9625559, -11408507, 72058280, -12214887, 1003412, 32079110, -2748242, 13698798, -16197395, -16963510, -13609678, -15247671, -40434968, 362388, -5224828, -465467, 35283692, -15396384, 53331684, 4752918, 40453760, --51315732, -15247134, 14900852, -862752, -22246856, -18618684, 41720240, -42811160, -35415228, 51302848, -9043054, 44564580, -17609902, -2797634, -3058017, 14449881, 6136972, -3914326, 15144592, 15306727, --797253, 7283728, 4793184, 1760400, -5238250, -9405978, -2163590, -6169721, -8463233, 8055211, -4599910, -7019051, 5158256, -15522549, -1538135, 11244761, 19357954, -1387274, -12191802, -758599, --13880797, 8108362, 13298292, -9108015, -7631620, 7639136, 8864276, -19654308, 7086696, 1046361, -12923557, -8258685, -8704825, 76773, 4085588, 6199249, -22328462, 3799972, -9474698, 17872432, --6196564, -3979824, -2586644, -44065828, 21050708, 32422708, -23440858, -19246822, -6563247, -21143588, --25508348, 6878927, 7583302, 19905026, 899796, 17403208, 30877594, 32261646, 21386252, 7461969, --23589572, 2390686, 12291123, 16357383, 25044492, 338766, -12946105, -18772228, -7112466, 25463788, --10410464, 10064719, 22058416, 2253784, 43338368, 5078799, -27662274, 23990614, 23605678, 6896107, -10175314, 21995064, 3494493, 1947231, -25395604, 54934780, -58472760, -42884712, -49882824, -16415365, -10305237, -29219200, 15044197, 32807108, -9717900, 3303904, 28823526, 9315784, -31272730, -10747082, --24209656, -3365107, 1776506, 1695975, 27860916, 27524298, -6331319, -6815576, 17488034, 42329052, -7295539, 34845608, -29327648, 30987652, -13581223, 10347650, -6213744, -19585050, -13748727, -3007014, -13934485, 8679055, 34406448, -44464724, 22641994, -17524540, -11064373, -8571144, 16457241, -7738994, --1609539, 3709778, -17941690, 11317776, -8816494, -486942, -13642964, 4314295, -2822867, 716186, --15362024, 2387465, -1486059, 3172370, -1582696, -16539382, 6562710, -9368397, -8734890, -3809636, -12320651, 14505715, 15789910, -13511967, 27215598, -20467130, -6322729, 1684701, -2343442, -15093052, --8299488, -755914, -11534135, 3386582, -1067836, -369904, -1488743, -11151346, 1319092, -1755031, --651761, -24976846, -50236620, -50563040, -36600100, 7493108, 93889592, 23718956, -12969727, -28406914, --67874976, -95463704, 21531744, 39517456, 47437912, -10000831, 4094178, -28003186, -48711908, 14024679, -8820789, 15829102, 2268817, -40850508, -12498355, 9961640, -8232379, -1627256, -7748658, 53191024, -46698644, 31488552, -2908230, -22855132, -38813620, -25693032, -23237384, 36327372, -6049999, 26577258, -11999602, 12436615, -16379395, -88428544, -60899416, 30038464, -47927004, -16365436, 101971648, 70115880, -52668112, -39968964, 28832652, -27690192, 1990717, 2004139, 14769856, 43245488, 76219024, -29218126, --2755222, -50303732, -40660992, -66566624, 7184407, -2771865, -71687296, -17188996, 46111304, 17221746, -32171452, 43636332, 78636560, -57342108, -34443492, 4522064, -46828564, -6058588, 26114474, 61256972, -31111132, 9538585, -37447820, -35890356, 24157044, -10244034, 36069136, 31721018, -8625368, 14512694, -5791764, -6148246, -12071542, -7036230, -4588636, 10745471, 3071975, -319438, 3697430, -1166084, -5153961, 94489, 22796076, 18743238, 29731912, 5315559, -16437377, -34528316, -28229210, 11402601, -26704496, 30609696, -3914326, -19665044, -79362408, -40818296, -37608344, 827318, 3945464, 8025684, --355945, 5823976, -9054865, -128849, -13365938, -11973832, 16689706, 14697915, 8519605, 8581882, -4282620, 1866163, 3726421, 23226646, -37755984, -124970128, -116288920, -66763656, -72597296, -18122078, -120341224, 61127584, 123814240, 109859896, 172228720, 122986392, 105804368, 17047798, -45941656, -103872712, --166413872, -141344160, -142329312, -74412456, -35712116, -8413304, 1186485, 4064113, 29382946, 39241504, -99039264, 60117732, 116878408, 76107896, 100190312, 36218384, 96810712, 33601676, 23689428, 22880902, --5750961, -27207008, -65523484, -75654240, -140379392, -96204048, -177887888, -140784736, -215903168, -128044784, --101562552, -24544128, 59351080, 31523450, 5348845, 59198072, 126626376, 169092864, 221765808, 264282224, -226193376, 165184976, 206066096, 169965808, 95326800, 42820824, -10539850, -70924944, -163972192, -194827776, --260823696, -336830656, -389721024, -351761056, -309951680, -220660384, -150590688, 46105936, 145321824, 177027808, -272721824, 227629504, 284420256, 298820192, 293228160, 337933408, 221921504, 57591752, -55796992, -108360952, --134006736, -86852832, -125495184, -107690400, -125592360, -170099488, -171936672, -200292576, -118501368, -92356832, --78626352, -44029320, -2595771, 11770895, 48714592, 131985952, 139207936, 197487968, 172036528, 225870720, -166221136, 110969072, 114644488, 43630424, -29942364, -49080200, -217787056, -280961728, -261463120, -230867376, --135031088, -106107704, -57873612, 5050345, 59042380, 89746560, 122198264, 145674560, 173430240, 164499392, -155720480, 136929456, 76744624, -300111, -38511360, -90315648, -94247152, -80909664, -65776888, -68793032, --69345472, -54661512, -38881804, -23109072, -9186935, -8630737, -5681168, 2371359, -5889474, -7402376, -10667625, 23259396, 26505854, 17559436, 13641890, 20933134, 26779658, 21045340, 25551834, 33587180, -41008348, 34887484, 8455180, -4130148, -1467268, -1749662, -11314554, -9800042, -6849399, -15786152, --25914758, -32639604, -30975304, -27277338, -21926344, -18196166, -10467909, -4167192, -2336462, -1035087, -4993437, 10080825, 13377749, 14493904, 15471009, 12569759, 10346576, 10069551, 6594386, 1457605, -3268470, 4005594, 1468879, -1540820, -2433636, -119722, 4810900, 6691022, 5814849, 5041755, -7487739, 5913633, 1737314, -2017561, -4309463, -6175626, -7748121, -12868259, -15598247, -14781130, --15588584, -18523658, -14382235, -5492727, 603443, 1969779, 5387500, 9977209, 12601434, 11283416, -11292543, 12510703, 11515344, 8492761, 6075768, 3447785, 1685775, -354335, -1882806, -2112050, --1903744, -2341294, -3115999, -3331284, -2873333, -2536178, -2312303, -1957431, -1450088, -1095754, --820339, -676994, -520765, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +5090610, -6489159, 817118, -2736968, -835908, 2556043, -4011500, -7315940, -1848983, 641024, +-4179540, -2405719, 3586298, -2092186, 1675037, -9168681, -760209, 6233072, 3339874, -10261214, +-3510599, -2680597, -2700998, 3486977, -1469953, -5339181, -3332895, -3813394, -3865471, 6786585, +2148558, 4374961, -2795487, 5741835, 5240934, 3723200, -2028835, -4852776, -3787088, 413927, +1003949, 7804493, 2798171, 1491964, -3637301, 855235, 372588, 899259, 3126199, 1836635, +-5255966, -4494684, -2288144, 2853469, 701690, -993748, -5619965, -1726577, 2259153, 2565169, +-2243584, -861678, 166967, 2714419, -544924, -2994666, 44560, 431107, -3819300, 8218957, +558883, -5580773, 33823, -862215, 5319854, 420907, 3614752, 4927401, 1892470, -340913, +281320, -1796907, -1124745, -1197222, 3176128, -1016834, -362388, -1421634, 1123671, 370441, +-564251, -137976, -775778, 155693, -76236, 625992, 680752, 1036698, 1330366, -5672578, +-5135707, 5773510, 5294084, -4325032, 3179350, 296890, 1628330, -14149233, 5442261, -2124398, +-9665824, -12602508, 319975, 9068287, 531502, 5870684, 202400, -11401528, -3942780, 1285269, +3962644, -2029372, -988916, -4815732, 619549, -896038, 8025684, 4060355, 1694902, 1416266, +2171106, 2765422, 7317551, 4416300, -6489159, -576599, 1493575, 1540283, -7714835, 2479270, +-2302103, -4899484, -1390496, -233539, 5258651, 1327682, -2956011, 5309654, 8308078, -1789928, +-3166465, 1984275, -606127, 4520453, 4627291, 3602941, -5572183, -4262218, 3979824, -1712081, +-1406065, -4294431, 453119, -6364605, 3764539, 3371549, 4457103, 1119376, 5181341, -5644661, +-3536906, 7262790, 373662, 2675765, 8601209, 3299072, 839666, -3495567, 5042829, 579284, +-2569464, 1416266, -6094559, 145492, -648540, 879395, 1627793, -722091, -2719788, -1514513, +-448287, 1298691, 1236414, 392453, -755914, 715649, 1713155, 275952, -574989, -555661, +7516, 7188702, 636192, 2783676, -6051609, -5139465, 2942590, -1424319, -2213519, -2810519, +-2630131, 2185065, -7003481, -4013110, -8648990, -10387915, -1924145, 8650601, 5574868, -3490735, +-974958, -1198833, -2015413, -7480223, 5388037, -1875290, -1924682, 476205, 3520800, -1682554, +309775, -255014, 5099737, -4713190, 5115306, 2798171, 6133214, -2088965, 4744328, 2115272, +-2940442, 4284767, -2907693, 2469069, 4545149, -3427921, 4773320, -2847563, -2308008, -716723, +-1419487, 2411624, -1397475, -3628174, 1454383, -3148748, 685584, 435402, 484794, 7211250, +1393180, -1650341, 33286, -2947958, -4130148, 2137283, -1001264, 6884833, 7005092, 2851322, +-1955821, -1075889, -59593, -2756832, -3208341, 3545496, 5549098, 186831, -615254, 3427384, +3678640, -473520, 1292248, 1193464, -2692408, 2551748, -498753, 3659312, -1822140, -690416, +-150861, -1510755, -179315, 2668249, -595390, 814433, 766115, -1871532, 574989, -336618, +-394063, 768799, 681289, -1194538, 1356673, -455803, -605590, 109522, -170725, -216896, +-1114544, -805306, 353798, 13716515, -5801427, 5624260, -6991133, -5879274, 29528, -1630477, +-1486596, 1912871, -2940979, 5932961, 5788006, 4959614, -1487132, -644782, -2581812, -6328635, +990527, -3801046, -702227, 696322, -2119030, 3608846, 1365800, -431107, -10448045, -4359929, +-6584185, 249108, -4307316, -6621766, -2901787, -3658239, -4047470, 6595459, -5267778, 4649839, +404801, -1868848, 2604898, 2238752, -4721780, -1292248, 99321, 5093831, -483184, -6960532, +-8831527, -9193377, 2393908, -3357591, 203474, -727460, 1331440, 3109556, 5112085, -3529390, +-1868848, 1683627, 1758789, 656056, 6410239, -3585224, 3964255, -7362111, 14432164, 1775432, +-1535988, 2806761, 1381906, 2760053, -4012036, -706522, 1095754, -444529, -863825, -7282654, +-2421825, -4949413, -1473711, -578747, -3569655, -3488587, 2592013, 3028489, 922344, 595927, +-333934, 2558727, 1503239, 2937758, -1472100, 259309, 89657, 2699387, -1083942, -158377, +-165893, 301185, -2138357, 526134, -1548336, 780610, 1075889, -511638, -1801202, 359704, +551903, -555125, -622233, -1934346, 507343, -226560, -991064, 1221381, 1401233, -179315, +-413927, -6754373, 930934, 1198833, 401579, -1105954, -4059818, 2343442, 1870458, -6107981, +7076496, -8924942, 10910291, -1123134, 3614752, 1564979, -264141, -1229971, 2213519, 10213432, +11474542, -2259153, 2034741, -1440962, -1672353, 1472100, 2407866, 7839926, -1037772, 2336999, +-4030827, 4272419, 926639, 6168647, 2981781, 5774047, -8439074, 3488050, 3033321, -2704219, +-117575, 6272263, -1611, 438087, 1897839, 3792993, -1333587, -606127, 12183748, 5752035, +1056562, 1052804, -2576444, 5484673, -7402376, -10872710, -13113072, -865973, 6860137, -272730, +3409667, 9244380, 3656628, -1709934, -3293703, 4898947, -983011, 11902965, 5359046, 1711008, +1654099, -6595459, 1370632, 4866198, -2527588, -7419019, 1275605, 2579665, -335544, -2621004, +-952946, 1184337, -2403034, 1315871, 1349157, 1181653, -486942, 1373853, -2355790, -2253247, +-730681, -1455994, 740345, -2262374, 1258962, 2081449, 1406065, 1552631, 1618129, 441308, +1036161, -3095061, -2558727, -1023813, -1345399, -1651952, -332323, 940598, 557272, -182536, +1891933, 954557, -147103, 2315524, 1483911, -80531, -16011101, 1646046, -1265942, 10876468, +-8249022, 4736812, -16945256, 6581501, -1649804, -8674760, -9511205, -6684043, 4990215, 3870839, +12767864, 1631551, 4220342, 12199855, -2180770, -8998493, 1293859, -6951405, 1636919, 9931575, +1817308, -2878702, -1233193, -1989107, 2901251, 3799436, -863825, 2514167, 5116917, -3294777, +1596117, -6127845, -504659, -7650411, -1221381, 953483, -3623879, 5506685, 3783866, 4679904, +9461813, 524523, 11457899, 8711804, 4224637, -6059125, 13146895, 5583995, 2287607, 11460046, +-1292785, 170188, 936840, 3742527, -2432562, -3463354, -7936026, -7749732, -6271726, -24696, +-4953171, 10036265, -6129455, 4095251, 6302865, -3649112, 303332, -3002719, -1720134, -10053445, +-11413876, 5109938, -2006824, -3924526, -3398930, 870805, 1313723, 666794, 2211908, -4086662, +9299141, 549756, 2784213, -2017561, 500901, 2666101, -4559108, 1422171, 158377, 1459752, +2096481, -124017, 1634772, 3070365, -7516, 803159, 2279554, 2415382, 3284039, -256087, +552977, -1806571, -481573, 48855, -798864, -2509335, 160524, -811212, -1040993, 137976, +-972810, -1393180, 13328894, 486405, 140123, -1257352, -2630668, 2375654, 534187, -6835441, +-8750996, -11855183, -6221260, -12403329, -7892540, -4241280, -9181566, -5818070, -4028143, -4786741, +-12404939, 8468602, 5298916, 288300, 4454418, 2029909, -3462818, 15348066, 921271, -5340255, +-2815351, -10449655, -4508642, 11421929, 530428, -9635222, -9630927, 1371705, -9748502, 3087545, +3381213, -7601019, 271120, 2338073, 508417, 11240466, 3346317, -5174899, 1108638, -6198712, +5658620, 780610, 2488934, -13809394, 9473087, -4765266, 3928821, 289910, 1811939, 2232846, +323733, -4043175, -348966, -5411122, -20938, -10894721, -92879, -11751031, 15418933, -2658585, +9797357, -7260642, -3414499, -1584306, -7494718, -4198331, 6002217, -249108, -266288, 4442070, +5767604, 897111, 9440875, 8169565, 11360725, 6036040, 2385854, 1356673, 5137855, 2729452, +1684701, 2070711, 1134408, 2505577, -754304, 4115116, 687195, -302258, -911070, 3197066, +1276142, 2265059, 1115081, -1555315, 1064615, 1239635, 1030792, -2540473, 4733054, 2536178, +-505732, -3684545, -442382, -587874, -2665564, 915365, 430570, 2676838, -2281165, -5076115, +-6799470, 20938, 5088463, -13105019, 45634, -5637145, -4502200, 9364639, -15122580, -14282377, +3786014, 19159312, 540629, 1866700, 1520418, -2863133, 10515691, 10210211, 5921150, 2932389, +-2704219, -15484431, 9259413, 128312, -12394202, -3965866, 2937221, -579284, 155156, 1321776, +-2945811, -12205223, -639413, 550830, -2189360, -5070746, 3728569, 10678899, -13662828, 8581345, +-5090610, -2532957, 865436, 6819335, 22333830, -14361297, -3581466, 1464047, -1378685, -2588255, +787053, -5475547, 1973001, -4940286, 15370614, 5317707, 2920578, 4277251, -3187403, -834834, +8159901, -1224603, 3575024, -6693170, 11811697, 572841, -8274792, 16498580, -10430865, 7623567, +2209224, 3785477, 12013560, -4718022, 5144834, -532039, 74625, 1492501, -749472, -8024610, +-4226248, -468688, -3517578, -1216550, -1893544, -4902169, -5009543, -3750580, 2412698, -4286378, +2552284, -1108102, -124017, -3754338, -2549600, -2756295, 2292976, -5202816, 583042, 561030, +3245922, 5044976, -1901597, -897111, -4437775, -3785477, 326418, -3324305, 1008244, -572841, +-2931315, 110059, -847182, 1414118, 1857573, -1200443, 16273094, 1248762, 4224637, 4810900, +-2753611, -9407052, -7383049, 1103270, 16278463, 9218610, 1981591, -14602889, 2075543, -8041790, +22549, 16290274, 15662672, 7902740, 10579041, -9589588, -19841138, -10397042, -14307610, 7897371, +-168041, -2435247, -81604, -10828686, -3235721, 3322694, -2058363, -4127464, -4022774, 11537893, +-774705, 3124589, -3313567, 7558069, 1578401, -4392678, -9220221, -7081328, 20895552, -920734, +-4759361, 6665789, -11985106, 3730179, -6871948, -20910586, -4715874, -2737505, 6293738, 2403034, +5525476, 1744831, 8237211, 290447, 544387, 4557497, -20448340, -3244848, -5515275, -1477469, +1952063, 11705933, 12923020, 4649839, -3420942, -8950712, -11764989, -3958349, -6935299, 1460289, +-3466039, -3677029, -8113730, 12072079, 8681203, 3523484, 11085847, -2666101, 4407174, 6801081, +-4376572, 4043712, -2831994, 870805, 4021163, -1252520, -2724083, -1136019, -1520418, -1074279, +-129923, 256087, 3981972, 143881, 442382, 1217086, -2270427, -6198175, 210990, -1458678, +-841277, -1136019, -3676492, -430034, 1171989, 5479842, 4476967, -2567317, 593242, 3600256, +-807991, 816044, -1343251, 813359, 3426310, 420370, 3762928, -23602992, -15431281, -3570192, +-5617281, 12064026, 8288213, -1974074, 20772610, -20986284, -4890357, -7917772, 22187264, 10647224, +-7285875, 8182987, 3115999, -8629126, 15324980, -16891570, 8370355, -7776039, 1326608, 1847910, +-5634460, 14799384, -10391673, 9090298, -4324495, -21759914, -3605088, 15210627, -9199283, -14854681, +209380, -1846836, -22230214, -4151623, 8928700, 3790309, 11865384, 8727374, -2506114, 21395380, +-5112622, -6580427, -10513543, -9788767, -9468255, 5877126, 7992934, -6880001, -7761543, 2567854, +-6731825, 8973797, -2465311, 4873178, -3637837, -5556077, -4264903, -118112, -12583180, 3412889, +9080098, -2118493, 3928821, 5458367, 6447820, 11623255, -8313983, 3740917, 9062918, -1165010, +-19299972, -20543366, 2263448, -1950989, 1527398, -7517804, -3122978, 1516124, -7442105, -13500693, +-4125853, 10190884, 8266739, -4060892, -1647120, 3136400, 2793339, -1607928, -3282429, 244276, +-435402, -5309117, -1970316, 5641440, -1626182, 4532264, 814970, -1411971, -2782065, 3639985, +3586298, 4212826, 500901, -2368138, 2442226, -6326487, -3799436, 3115462, 1450625, 2672544, +4919348, -2518998, 1014686, 1930051, 2394981, 456877, -2895345, -4154844, 1848983, -2264522, +-1392106, 16779364, -10826002, -27066884, -24696, 19059454, 24366424, 4444218, -9178345, -6915971, +2377265, -4509716, -4013110, 10636487, 10784126, -5487895, 10400800, -13496398, -1775969, 9511742, +-4845797, 11545946, 5355824, -1750199, -16204375, 6016176, -3899294, -3947612, 684510, -1328756, +-1851131, 21912386, -10976326, 11121818, 18748070, 12972949, 6753836, 118112, -12625056, 12361453, +-7131793, 11771968, -6854768, 2622615, -13266617, -2653753, -12547210, -8272107, 1733019, -11669963, +-3343095, -4148939, -624918, 10155450, -12261058, -10540923, -3952981, -6106370, -2609730, -10450192, +-13494787, -16822314, 1532230, 12829067, -1052804, -8353175, 1232119, 2638721, 10137733, -11447698, +-6637335, -3737695, -442919, 7597261, -17180, 2041720, -7963406, -3376381, 3923453, 15522012, +6862284, 10692321, 12419972, 16222091, 6217502, -2314987, -5879274, 3884261, 4911832, 7115687, +2988224, 607201, -74625, 9820443, 3468186, -3747896, 714575, 5476620, 2172717, 1271310, +-3704409, -3629247, -2602213, -5019206, 271657, 4605816, 4431333, 919660, -2723009, 6455336, +3712462, 8196408, 4263292, 178778, 5484137, 4295, -4349728, 6271726, -99858, -925565, +-2466922, 1189706, -1566589, -192200, 5496485, 3192235, -45167488, -21471616, 15071577, -36884104, +-25564182, -1650341, -15044197, -10320806, 11260867, 12869333, 3950296, -2369211, 4669703, 36830420, +-4506495, 5888937, 14190035, 16156593, -16787416, -8721468, -7943542, 13595719, 14858439, 7453916, +2747169, 13898514, -4070019, -6971269, 9780714, 18811420, 1358283, 6076305, 19157164, 14113799, +11532524, -8593693, 3648038, 5794448, -12885, -318364, 12308839, -4030290, -167504, -1245541, +8231305, 304943, -13407277, -8994735, 2724083, -18245558, 13852343, -4054449, 30569430, 1215476, +16781510, 3320547, -697932, -9848897, -439160, 3913789, -12879533, -6648610, -15050639, -1907502, +7754027, 10512469, -4549444, -24551644, 8930848, -3902515, 8413304, -8804146, -10479183, 7707319, +-15865609, -12170327, 23738284, 354872, 10952703, -2233383, -10224707, 2850248, 13997298, 3401614, +11140071, -17984638, -854699, -1217623, -2942053, -15460809, 15136538, -9001178, 1146756, -1760400, +1861868, -5731097, -521839, 3176128, 4667556, -3823058, 9932112, -2433099, -3119757, -5788006, +-4901632, -4993437, 4798552, -1916629, -3451006, -1459215, 1304060, -3796214, 6962679, -2058900, +7875360, -4895189, 3373160, 1221918, 3178276, 5082020, 1084479, 18233210, -8434779, -21275120, +9006546, -11151346, 4552666, -365072, -10632728, 19417548, -26162794, -1159641, -31565326, 685584, +25360708, 35512936, 16758962, -6195491, 16375637, -1331440, -2362769, 1687922, -2870112, 8671539, +-1161252, -16740709, 897648, -23232552, 8074002, -7246147, -5240397, 15444702, -392453, -17883170, +-19979650, 4533875, 2672007, -9998684, -8339753, 14825690, -21652540, -197032, -4430259, 7533910, +-5867999, -4760971, -17337172, -7417946, -7697119, -3302293, 12365211, -14840723, 5235029, -1880659, +-2637110, 1856500, 5286031, -25065966, -2736431, 3307125, -2284923, 9163850, -7949985, -11121818, +-5114233, -28038620, -12412455, -12269648, 504659, 11855183, 17892296, -8583492, 13518946, -23393614, +37286220, 2482491, -6794639, 19469086, -23270670, 19541028, 8684424, -5328444, 320512, 6466610, +431644, 3054259, 17783312, -7724499, 7536057, -4220342, 5426691, 8832600, 8685498, 10646687, +-3791383, 8964134, 2037962, 1275605, -1598802, -12120935, 359167, -8624831, 3837017, 5462662, +-1952600, -1420560, 1505386, 1136019, 5919002, 2698313, -4466766, 6450504, -186831, 687195, +7966628, 5435818, 3125126, 14571213, -12145631, 8053, 5255966, -66035, -9564892, 2214593, +-6120329, -5758478, 22950158, 1328219, -16338592, -337692, -2447058, 10660109, 7039452, -9957882, +11565810, 239444, -25729538, -28026272, -2650532, -8422431, 7037841, -1176821, -9868761, -25258702, +-22018686, 12059194, -18727668, -4184372, 1231045, 5967857, 1448478, 18056580, 1557999, -9088688, +12127914, -1578937, 1816234, 11180337, -14646375, -938450, 3238942, -14972793, 9148817, 12487617, +5487895, 11114838, 5847598, 17200270, 4744865, 12528956, -17510582, -5459977, -2745021, -23556286, +-67646, -2524904, 9931038, -1553704, 11375758, -1860795, -13626857, -9293772, -645319, -21786222, +9625022, 627602, -4175782, 12779138, 8142185, 10619844, 11057393, 3389803, -1256815, 9276592, +-29510720, 8995272, 3787624, 13266080, -5165235, -20855288, 13212930, -3130494, 22662394, -33308546, +-11803107, -23319524, 16037408, -6783901, -21391622, -23895588, -15692200, -7055021, 7687455, 6023692, +-6499360, -6776385, -3506841, -409633, -7184407, -2726767, 12265353, 1914482, -1103807, 3604551, +2731599, 2258616, 6687801, -5116917, -6743099, -153008, -11761231, 17180, -4089346, -1669669, +-7570954, -2041720, -10354629, -9308805, 11864847, -6582038, -366146, 3985730, 5745056, -986769, +9965398, -8230231, -2607045, 4110284, -9656160, -2650532, 11423539, 4095251, 2601677, -3878892, +-5818607, 4402342, 15609522, 14469745, 53059488, 40082784, 5384815, 11589969, 3317862, 30787936, +795643, 14964740, -14058502, 36475008, -14519137, 33075544, -1544041, 21114596, -2517925, 14890652, +-14905147, 3540127, 7401840, -8177081, -2718714, -4409858, -3484292, 9842991, 180389, -8559333, +-11797738, -17757006, -22594212, -10871636, -3850975, 104153, 7037841, -19020800, 7994545, -10481331, +-16175921, -3382824, -11833709, 5352066, -2925410, -24736328, -5932961, -12589623, -14944339, -15660525, +14147085, 18948858, -39731132, 8979166, 3473018, 11123965, 3879966, -5021891, 23953032, 13487808, +12509629, -33221036, -14912126, -449898, 8136279, 27480812, 979253, -3728032, 1280974, 23281408, +20871394, -19833622, 22338662, 1654099, 4976794, -3792993, 13087302, -28261422, -9951439, 29123636, +-4523675, -1894081, -11271068, 19421842, 12637941, -10040560, -17048872, -2928094, -784368, 1729261, +199716, -3630321, -15897821, -5413807, 12299176, 16203838, 9987410, -8936216, -2420214, -2607582, +-7718056, 2499671, 2507187, 7501161, -1701344, -5274220, 4629975, 1829119, 2769180, 14680735, +1936493, -4060355, -5628555, 2543695, 5208722, 11441256, 2239289, -11078331, -5989332, -8311299, +3254512, 4282620, -9239012, -19532974, 6273337, -1570884, -3344706, -6806450, -12103218, 14621679, +-5729487, 12746926, 19800872, -22284438, 6972880, -12713103, 37272264, -22003118, 21073794, 19435800, +-7346005, -34740916, -20212652, -2248952, -9224516, -988916, -15918759, -25294136, -33687040, -19276350, +-22422414, 9737765, -19174882, 8046085, 2308545, -2157684, -1962263, -15761456, -4865661, -16193100, +4790499, 14566382, 19033148, 397284, -5317170, -16622597, -3954054, 1712618, -9894531, 2884071, +-13656385, -8862128, -1937030, -13527536, 10768020, -11941083, -35391604, 1368484, -1074816, -11642046, +15114527, 11877732, 17219598, 6652905, 13553843, 27431956, 4627291, -27183384, -6194417, 12869870, +-5968394, -22586696, 12674448, 18000208, 6070937, -72478, -30600032, 27413166, -1281511, 22384832, +-18507550, 22668300, 55438900, -4849555, -1563368, -27012124, 14604499, -21962852, 18606872, 9496173, +-12090870, -2654827, -29895120, 6952479, -16288127, 314606, 11549704, 11596949, -375810, -7677254, +-6645925, 8286603, 20290500, -9773735, -1540820, 3173981, -8786429, -2509872, -2743410, 4313221, +-934155, 8570070, -3844533, -9652402, -5345624, 3008088, 7714835, -9553081, -2942053, -81604, +1379221, 7219840, 1604170, -2349347, 2611877, -16255914, -9291088, -915365, -1432909, 3485366, +1037772, 1423245, -226560, -2719251, 8420283, -339839, 6302328, -292595, -1705639, -5915781, +-4044786, -43641700, 14730664, -57222388, 37679212, 13447006, -9831180, 40156332, -3929358, -20559472, +35617628, -13809930, -2004139, 7472706, 12420509, 32911260, 1285806, -2754685, 23229868, 9815074, +19500226, 23869818, 17703318, 1572495, 12359842, 1895691, -1297617, -13174275, 8341900, 12496207, +2989834, -817654, -14195404, 6730751, -13299903, 15896211, 15706695, 2679523, 18566606, -11516955, +12247099, 19237696, 12274480, -26089778, -28015534, 32831804, -3216394, 20517596, 31906776, 707059, +8590, -3373160, 6259378, 18402862, 17510582, 1784559, 14545980, -35970, -16625282, -20780662, +-30726732, 497679, -12480638, 398358, 17405892, 16262357, -28737626, 2424509, 11145977, -25245818, +4187056, 35022772, -15204184, -17534204, 18825916, -20270636, 4665945, -5726802, 36781564, -10732586, +22724672, -11310796, 19102404, -1835025, 7107634, 15215459, -24008868, -7358353, 9167608, -15954730, +11684995, -14324253, -3935264, -8107825, -7330973, 988379, -3926137, -6590628, 3875671, 10889890, +-5474473, 2945274, 4023848, -9528922, 1713692, 1253594, -2400350, -6751152, -2725157, -5224291, +-15386183, -6171331, 3362960, -20309826, 7393250, -10429791, 7881802, -4762045, -1899449, -14256070, +-7359964, 130460, 4000762, -6318971, -13785771, 2267743, 1024887, 7398081, 3280281, -24696, +9104257, 7191386, 858457, 6171868, 4281009, -19846508, 4566624, -23011898, 47649976, 11774653, +-25269440, 9771587, -5779416, -22487912, -26513370, -26914412, 8115878, -1219771, 23961622, 35475892, +17111686, 8678518, -4169876, 11853573, 1236414, -44398152, 19632832, 46335180, -30154966, -31705986, +-27368606, -38779260, 28230820, -38185480, 17340394, 340913, -4683125, -159988, -12330851, -14721537, +19102940, -39296268, 40587976, 23311472, 5476620, -25832080, -19478214, -17085916, 3729105, 6833830, +-16662862, -2253784, -12277701, 27941446, 12736189, -4974109, -744640, 11520713, 2674154, 13139379, +-22698366, -8978629, -2086280, -3992172, -21107616, -14879377, 12694850, -40288940, -23697482, 3107946, +47246788, 22786412, -14272176, -932545, -35750772, 17470316, 54786064, 1961190, -11669963, -8196408, +-25740812, 33711736, -10744398, -12994424, -1046361, 19989314, 12630425, -17301202, -15531675, -5563057, +17678086, -4676146, 5237176, -1357210, -13882408, -4514548, 22374096, 12776991, 1908576, -10332081, +-1569811, -1557999, 17464410, 14166413, 7163469, 6404333, -20536922, 7895224, 7503845, -3077881, +4758287, -3218004, -2868501, -18046916, -1838783, -918586, -2477659, -5755793, 4919885, 6626061, +3554622, -21229486, -18193482, -9000104, 16106, 1295470, -21343304, 7641821, 27001922, 5428839, +-7392713, 506806, 4250944, 85362, -11605002, -8902393, -2975339, 3651796, 192200, -21986474, +-15107547, -44088912, 9799505, -32446330, -48593260, 11592654, 27072790, 6776385, 7363185, -20477868, +-25669408, -6556268, -38094748, -18635864, 10107132, -31839130, 50512572, 9960566, -12262132, 10985453, +-24031952, -47579648, -15895674, -36354212, 5906654, 10817949, -13282723, -25811680, -13062069, -15865609, +14106820, -18893562, -6851010, -2317672, 21661668, -15442555, -2756832, -7139310, 5601174, 9168145, +1729261, -6292664, 22333830, 29251412, 18687940, -14740865, -12127914, -42636676, -23739358, -9625559, +11408507, 72058280, -12214887, 1003412, 32079110, -2748242, 13698798, -16197395, -16963510, -13609678, +15247671, -40434968, 362388, -5224828, -465467, 35283692, -15396384, 53331684, 4752918, 40453760, +-51315732, -15247134, 14900852, -862752, -22246856, -18618684, 41720240, -42811160, -35415228, 51302848, +9043054, 44564580, -17609902, -2797634, -3058017, 14449881, 6136972, -3914326, 15144592, 15306727, +-797253, 7283728, 4793184, 1760400, -5238250, -9405978, -2163590, -6169721, -8463233, 8055211, +4599910, -7019051, 5158256, -15522549, -1538135, 11244761, 19357954, -1387274, -12191802, -758599, +-13880797, 8108362, 13298292, -9108015, -7631620, 7639136, 8864276, -19654308, 7086696, 1046361, +12923557, -8258685, -8704825, 76773, 4085588, 6199249, -22328462, 3799972, -9474698, 17872432, +-6196564, -3979824, -2586644, -44065828, 21050708, 32422708, -23440858, -19246822, -6563247, -21143588, +-25508348, 6878927, 7583302, 19905026, 899796, 17403208, 30877594, 32261646, 21386252, 7461969, +-23589572, 2390686, 12291123, 16357383, 25044492, 338766, -12946105, -18772228, -7112466, 25463788, +-10410464, 10064719, 22058416, 2253784, 43338368, 5078799, -27662274, 23990614, 23605678, 6896107, +10175314, 21995064, 3494493, 1947231, -25395604, 54934780, -58472760, -42884712, -49882824, -16415365, +10305237, -29219200, 15044197, 32807108, -9717900, 3303904, 28823526, 9315784, -31272730, -10747082, +-24209656, -3365107, 1776506, 1695975, 27860916, 27524298, -6331319, -6815576, 17488034, 42329052, +7295539, 34845608, -29327648, 30987652, -13581223, 10347650, -6213744, -19585050, -13748727, -3007014, +13934485, 8679055, 34406448, -44464724, 22641994, -17524540, -11064373, -8571144, 16457241, -7738994, +-1609539, 3709778, -17941690, 11317776, -8816494, -486942, -13642964, 4314295, -2822867, 716186, +-15362024, 2387465, -1486059, 3172370, -1582696, -16539382, 6562710, -9368397, -8734890, -3809636, +12320651, 14505715, 15789910, -13511967, 27215598, -20467130, -6322729, 1684701, -2343442, -15093052, +-8299488, -755914, -11534135, 3386582, -1067836, -369904, -1488743, -11151346, 1319092, -1755031, +-651761, -24976846, -50236620, -50563040, -36600100, 7493108, 93889592, 23718956, -12969727, -28406914, +-67874976, -95463704, 21531744, 39517456, 47437912, -10000831, 4094178, -28003186, -48711908, 14024679, +8820789, 15829102, 2268817, -40850508, -12498355, 9961640, -8232379, -1627256, -7748658, 53191024, +46698644, 31488552, -2908230, -22855132, -38813620, -25693032, -23237384, 36327372, -6049999, 26577258, +11999602, 12436615, -16379395, -88428544, -60899416, 30038464, -47927004, -16365436, 101971648, 70115880, +52668112, -39968964, 28832652, -27690192, 1990717, 2004139, 14769856, 43245488, 76219024, -29218126, +-2755222, -50303732, -40660992, -66566624, 7184407, -2771865, -71687296, -17188996, 46111304, 17221746, +32171452, 43636332, 78636560, -57342108, -34443492, 4522064, -46828564, -6058588, 26114474, 61256972, +31111132, 9538585, -37447820, -35890356, 24157044, -10244034, 36069136, 31721018, -8625368, 14512694, +5791764, -6148246, -12071542, -7036230, -4588636, 10745471, 3071975, -319438, 3697430, -1166084, +5153961, 94489, 22796076, 18743238, 29731912, 5315559, -16437377, -34528316, -28229210, 11402601, +26704496, 30609696, -3914326, -19665044, -79362408, -40818296, -37608344, 827318, 3945464, 8025684, +-355945, 5823976, -9054865, -128849, -13365938, -11973832, 16689706, 14697915, 8519605, 8581882, +4282620, 1866163, 3726421, 23226646, -37755984, -124970128, -116288920, -66763656, -72597296, -18122078, +120341224, 61127584, 123814240, 109859896, 172228720, 122986392, 105804368, 17047798, -45941656, -103872712, +-166413872, -141344160, -142329312, -74412456, -35712116, -8413304, 1186485, 4064113, 29382946, 39241504, +99039264, 60117732, 116878408, 76107896, 100190312, 36218384, 96810712, 33601676, 23689428, 22880902, +-5750961, -27207008, -65523484, -75654240, -140379392, -96204048, -177887888, -140784736, -215903168, -128044784, +-101562552, -24544128, 59351080, 31523450, 5348845, 59198072, 126626376, 169092864, 221765808, 264282224, +226193376, 165184976, 206066096, 169965808, 95326800, 42820824, -10539850, -70924944, -163972192, -194827776, +-260823696, -336830656, -389721024, -351761056, -309951680, -220660384, -150590688, 46105936, 145321824, 177027808, +272721824, 227629504, 284420256, 298820192, 293228160, 337933408, 221921504, 57591752, -55796992, -108360952, +-134006736, -86852832, -125495184, -107690400, -125592360, -170099488, -171936672, -200292576, -118501368, -92356832, +-78626352, -44029320, -2595771, 11770895, 48714592, 131985952, 139207936, 197487968, 172036528, 225870720, +166221136, 110969072, 114644488, 43630424, -29942364, -49080200, -217787056, -280961728, -261463120, -230867376, +-135031088, -106107704, -57873612, 5050345, 59042380, 89746560, 122198264, 145674560, 173430240, 164499392, +155720480, 136929456, 76744624, -300111, -38511360, -90315648, -94247152, -80909664, -65776888, -68793032, +-69345472, -54661512, -38881804, -23109072, -9186935, -8630737, -5681168, 2371359, -5889474, -7402376, +10667625, 23259396, 26505854, 17559436, 13641890, 20933134, 26779658, 21045340, 25551834, 33587180, +41008348, 34887484, 8455180, -4130148, -1467268, -1749662, -11314554, -9800042, -6849399, -15786152, +-25914758, -32639604, -30975304, -27277338, -21926344, -18196166, -10467909, -4167192, -2336462, -1035087, +4993437, 10080825, 13377749, 14493904, 15471009, 12569759, 10346576, 10069551, 6594386, 1457605, +3268470, 4005594, 1468879, -1540820, -2433636, -119722, 4810900, 6691022, 5814849, 5041755, +7487739, 5913633, 1737314, -2017561, -4309463, -6175626, -7748121, -12868259, -15598247, -14781130, +-15588584, -18523658, -14382235, -5492727, 603443, 1969779, 5387500, 9977209, 12601434, 11283416, +11292543, 12510703, 11515344, 8492761, 6075768, 3447785, 1685775, -354335, -1882806, -2112050, +-1903744, -2341294, -3115999, -3331284, -2873333, -2536178, -2312303, -1957431, -1450088, -1095754, +-820339, -676994, -520765, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -11935714, -4490389, -6781217, 3733400, -3810173, -7852811, -13598940, 2443837, 442919, 3472481, 3055869, --909459, -964220, 1072131, 8282308, -5812165, -10409927, 3504693, -4285304, -6958384, 159988, --1002875, 4361003, 1584306, 3120831, -3104188, -746251, -2021319, 7058242, -1874216, -2805688, --2459943, -1205275, -1656247, -2787434, -2450816, -1696512, 1430761, 627065, 958851, 270583, -1868311, 3011846, 1553168, -2624762, -7891466, -49929, -5475547, 830002, -336081, -2484639, -3586835, 268435, 63351, -7875897, -3190087, 1083942, -581431, 2785823, 239981, 2480881, --2255932, 1042603, -956704, 4898410, -1690070, 2589865, -4323959, -4321274, -5452998, 293668, --1264868, -1581085, 74625, -1898912, 4295, -2218888, 513785, 117575, -904091, -3440806, -384400, 376347, 2028835, 1767916, 56371, 1881733, -157840, -1433445, -437550, -670552, -768262, -1611, 142808, 1064615, 805306, -122407, 1000191, -630823, 237834, -8562017, --1758789, -1114007, -2418067, -1086090, -2916283, 2851858, -1145683, -987306, -230854, 73551, --159451, -2054068, 7613367, 4900021, 7956964, -3707094, 7920457, -4671851, -3271691, 3085934, -8769786, -181999, -5294621, -7826504, -5616744, -1073742, 6256157, 2462090, 2126546, 2778844, --2729989, 4256850, 554588, 3182571, -1535988, -7133941, 1956895, -4934381, -3371549, -3460670, --811749, -9060770, -406948, 433255, -3775813, 8475044, -1593970, -2733747, -3391951, -81068, -946503, -3626026, 136902, -4448513, -1662152, 125091, -1822140, 6091874, 201863, -1639067, -3425773, 2189360, 5655398, 2268280, 6796249, 1671279, 5559835, -6324876, 1657321, 5056250, --1714766, -4518843, -6205691, -122407, -471910, -1244467, 1546188, 1829119, -1304596, 4846334, --4154307, 1608465, 1709397, -3108483, 2285460, 508417, -2255395, 1215476, -555661, 477815, --2112050, 659814, 285078, 394063, -219580, -151934, 1073742, 271120, 1970316, -398358, -193274, 9673877, -4444218, -3427921, 937377, -2198487, -1644973, 4835597, -3824132, 4655208, -2116345, 70330, 2359011, -3174518, -3027952, -5543192, -5972152, 7789997, 3663607, 2720325, -4148939, -2767570, -1860795, -2043868, 9844602, -3852049, 10778757, -392990, -2786897, -2631741, --5761162, -6186364, -7507603, -488016, -1917166, 1326608, 7186554, -640487, -3419331, -10094784, -316217, 7976828, 11709155, -5534602, 2996814, 2141041, -3023657, -2679523, 3027952, 11106249, --2691334, 1731409, -991064, -1643899, -1079647, 5318780, 7666517, -5851893, -3202972, 2371896, -10063108, 1669132, 7116761, -5861557, -5458367, -312996, -934155, 2032056, 1496259, -145492, -595927, 1033477, -2669322, 1213328, 3231426, 2496987, -2015950, 6442988, -1684164, 4044786, --2158221, -2238752, 2387465, 2027761, 2154463, 480499, 2248416, 425739, -3394098, -2291902, -615791, -173946, 1199907, -643171, 1811403, -93952, 994822, -1013075, -223338, -100932, --529892, -1176821, -143345, -722091, -215822, -865973, -768262, 1813550, -63351, -889058, -1944010, 27380, -1050120, 15985331, -10943040, -2396055, -4531728, 1276142, 4276177, 7693360, --7635378, 5282810, -1975685, -8078297, -13088376, -2658048, -5545340, 960999, -1225676, -5515812, --2806224, 3088618, 3265249, 10283762, 5717675, 5248450, 566936, 1656784, -5283884, -3563212, -8269423, 6343130, 4313758, 2020782, 3984119, 882616, 67646, -6842957, -9700721, 6551973, --2562485, -6512244, -3090229, -4078072, 3517041, -3585761, 8308078, 1952600, -4732517, -2280091, --3616363, -3120831, 4076998, 6123013, -485868, 4143033, -2968359, -3303904, 59593, 870268, --3166465, -1195612, 4813048, 108448, -1935957, -2297271, 2638721, 2954938, -332323, 3561065, -523449, -2426657, 8289287, -1118302, 945430, 456340, -9905805, 3940096, 3154654, 5221607, -3398393, -3577708, -796716, -8905078, -4088272, -8165807, -2986076, -3624416, 66035, 850940, --5392332, 304406, -1278290, 84289, 2344515, -752693, -969589, -110595, -1471026, 339302, --735513, 693100, -893890, -1949915, -991064, -438624, -3365107, -233539, -129386, 779537, --184147, 494995, -159451, 161061, -1788854, -2267743, 260382, -260382, -1024350, 523449, --2614025, -10934987, 2757369, 63351, -3273839, -6012954, 2443837, -5749351, -1093606, 9795747, -14874009, 7293392, 8155069, -668404, -4189741, 6111202, 5473399, 2274185, 2901251, 7296613, --1131187, 5289789, 5141613, 7571491, 7268696, -6051072, 4857071, -447750, 1673964, -5643587, -1653562, -811212, 4952634, -2001455, -1463510, -4007205, 3590593, -6177237, -5013838, 425202, -5204427, 2799782, -3215320, -1713155, -1024887, -2166811, 3124589, -7424388, 6714108, -107374, -8364449, -12020540, 793495, -10835129, -3445638, -3507378, 2885144, -1205275, -2500745, 2280628, -840203, 2817499, 4597763, 7544110, -995359, -6212670, 1268626, 10192494, 2049773, -3063386, --801011, 6249715, -3391414, 3767760, -3277597, -11073499, 6301791, 6640020, 6197638, -5520644, --8191577, -5968394, 6860674, -835371, -1099512, 4791573, 1764158, 1109712, 799401, -442382, -1860258, 2448668, -889595, -1490891, 1396938, 50466, -520228, 762357, -1415192, 295279, -2181844, -1024350, 2294586, -1085553, -1764158, 712965, -85899, -98247, 1146219, 792421, -1165010, 826781, 828392, -180389, 1124745, -838056, -16366510, 290447, -3617973, 1519345, --9159555, 1131187, 1529545, 12173011, -9716290, 133681, -13038984, 2985002, -7872675, -1912871, -496069, -4265440, 3790846, 1680406, -6818261, 135828, -86973, 6329171, -4114042, 10189810, --106300, -8816494, -4486630, 10842645, -1024350, 4345433, 2902324, -1781338, 6497749, -7163469, --6766184, -5272609, 761283, -6861211, 7320235, -4015795, 4704063, -6644315, -55835, -8074539, -5330592, 715112, 6381248, 5684926, -5358509, 10685342, 9134322, 8603893, 1727114, 9033390, -7448010, -7661148, 6605660, 3143916, 634581, -7113003, 3308199, -6053757, 6033356, -2602750, --4745939, -581431, 8988293, 3187403, -10280541, 9830643, -779000, -3479461, -5860483, 10012106, -8696772, -7468412, 7422777, -538482, -8864812, 105764, -5022965, -2780455, 4929549, -4293894, -3530463, -363998, 1583769, -2060511, 2698850, -373662, -237297, -600759, -948651, 937914, -554588, -2497524, 926639, 1233729, 35970, 917512, 1126355, -2346126, 543850, -288837, -88584, -1980517, 740882, -817118, -1152125, -2633352, 3061775, 621160, -1387811, -416075, -846109, -320512, 23376434, 3971234, -935229, -8063264, -15147276, 3864934, -2233383, -22231824, -19500226, -9450539, -14110041, 2979634, -903017, 2626373, -913217, 3779034, 5622112, 73551, --360777, -11361799, -945967, -1079111, 13393856, -2448131, 346282, 4929549, -2352568, -1650341, --5452998, 11438035, -8584566, 8264591, -2041720, -6854768, 1280974, -7663296, -3897683, -12445741, -2189897, 5712844, -3367254, -6209986, -4916664, 7521562, -11667816, -2759517, -5755256, -163746, --1675037, 1517734, -10123238, 9858024, -13820131, -9449465, 3744675, 1667521, -527744, 3689377, --7170448, -10313290, 1274532, -2805688, -476741, 5061082, -6169184, 4588099, 3190087, 11374147, --3156801, 1630477, -882079, 162672, 15767362, 1320166, 15611132, -3772592, -5871221, 1778117, --8039105, -718333, 7974681, 639950, -9352828, -8182987, 2287070, -871878, 28454, 8013872, -616328, -1510755, 3322157, -460635, -331786, -3748970, 1378685, 1749662, -1891396, -55835, --934692, 3091303, -1409823, -631360, 1580011, 406948, 955630, -299037, 1762547, -588411, --1611, 940061, -1973001, 2431488, -1556926, 896574, 2036888, 1109175, 1923072, 525060, --17115982, -2209761, -3451543, -13877039, -23921894, 7427072, 12480638, -8741869, -4184372, 7077569, --2545305, 14967424, -1622961, -7934415, -4712116, -22289270, 7590818, 2563559, -1992865, -15643345, -3751654, -8680666, -2255395, -7614440, -3876208, 11193759, -10653666, 4659503, -15796353, 10190347, -2066953, 249108, -4524211, 1245541, -2022930, -8807367, -16633871, 3287261, 76236, 3622268, -7041599, -4002373, -1288490, -10678899, -5470178, -2822331, 4593468, 3125126, 7959648, 12683575, -9927280, 5134097, 7586523, 2343979, 7905424, 7121056, -6836514, 8149701, 9197672, -1826435, -12301323, -1222992, 14424111, -6305012, -15391015, -2469069, 9903658, 10896869, 12511777, -2349884, --21494700, -2109366, -1091459, 872952, -673773, -5242545, 3146601, -15665893, 12297028, 7778186, -7479149, -8174934, -7720741, -1657857, 4609574, -498216, -8643085, 135828, -4192962, -7014756, --2784750, -1111323, -3329137, 377420, -2805151, 1493038, -1728724, -917512, 2327872, 488553, -1092532, -1066763, -3052111, -3386582, 2466922, -2688113, -40265, -942208, 1539209, -1059246, --647466, -1047435, 3673808, 1979980, 1162862, -1060857, 22939958, -5050345, -5513665, 7649337, -12348031, -888521, 5743445, 14304389, 10328323, -23488640, -21589190, 176094, -2083059, 3165928, --9655623, -17134236, 4058744, 13738527, 9064528, -9944997, 16148540, 13059922, 12244415, -20583094, -5816997, 10800769, 541166, 1647657, 9177271, 21214990, -4114042, -9688372, 6418829, 4815195, --2905009, 11472395, 17098802, 3205656, 17714056, 7761006, -13326747, 1511292, 14685567, -1575716, --6056978, 7629473, 1210107, 2910914, 15412490, 9924596, 5229660, 1846836, -17939542, -18236432, --1548336, 2910914, 4745402, -5613523, -817654, -4698694, 1578937, 2298881, -6861211, 2612414, --4221953, -1040993, -5834713, 680752, 11378979, -6718403, -16501801, -2546379, -14039711, 3115462, --5027259, -335544, -1906429, 6647536, -2501282, 4822712, -86973, 4141959, 1917166, -1874216, --2259690, -2822867, -8153459, 2993592, 1035624, 2071785, 248571, -6251325, 3137474, -4881767, --4158602, -1396401, -5333276, -1082332, -1757715, -1944547, -1691143, 3491272, -1545115, 2341831, --233002, 1893007, 311385, 4500589, -1939715, 1249836, -3610994, -869194, -3098282, -2774012, --598611, -2032593, 6841883, 2936684, 249645, -907312, -972273, -38156488, -23741506, -7078106, -7122130, -2193118, -9407589, 1868311, -9165997, 26980448, -10713259, 17362942, 26623966, 14504641, -13189308, -10210211, 9522479, -4994510, -12141873, 10835666, 12620761, 8415988, 17969070, 244813, --801548, -7747584, -7948374, -6769406, -10993506, -10700374, -7311645, 4282083, 1610613, 27917, --6878927, -3686156, -10669236, 4617090, -9204115, -8337069, -3683471, 4638565, 39728, -5585605, --15585899, 2004676, -4552666, 5806259, -18402862, -14191109, 16295643, -2353105, -3058017, -7379291, --4525822, 12277164, 4011500, -2395518, 6732898, -1698123, 7001871, 5625871, 7978976, -5553393, --9266392, -23389318, 1697049, -22680648, -1488206, -19180788, -2726767, 18372796, -2247879, 3353296, --12965969, -5520644, -6665789, 1577327, -8310225, -4747013, 8273181, 10327786, -1010391, -924492, -1209033, -4548371, 1778117, -416612, -4530117, -1762547, -3871913, -1429150, -2183991, -10467372, -1886028, -1663226, -1334661, 764504, -2855617, -3316252, -7241852, -1593433, -4174708, -4918275, --904628, -6222871, -2913062, 1160178, -3937948, -4505421, 611496, -3748433, 1324997, 1618129, -4592931, -2640868, 3221762, 1627793, -4120484, -1452236, -963146, -1808181, 868657, -801548, --1170916, 26387742, 520228, -19105626, -16199543, 16553878, 12982612, -12230993, -11812234, 22193706, -14108431, 813896, -13166759, 1589675, -5532992, 10523207, -8167417, 1248225, -3455301, -2427194, -22956600, -3250217, -6238977, 4250407, 3916473, 6854231, 7101729, 771484, -9043054, 6846715, -3484292, 7845832, 17766132, 8114267, -25538412, -7329362, -4147865, -19580220, 7595113, -3415573, -421444, -10925323, 9239548, -4260608, 1786706, -14205067, 9643275, -11578158, 976031, 11355357, --1799591, 11978664, -9347996, 14945412, -19171660, 9556839, 249108, -6956237, 25153476, 6659884, --5189394, -15022722, 6554120, -3124052, 2105071, -2324651, 9230422, 13655849, 18509698, -11740830, -8345659, -4689568, 16564078, 5996311, 2409477, -1583232, 9953587, 1701881, -6510634, 7976291, --5662915, -9739375, -4133906, -13222594, 228707, -14807437, -1191853, -10007811, 11416023, -3685082, -7363185, -8035347, 364535, -4540854, 6956774, -2281165, -591095, -4504884, 2398202, -3406983, --5254893, -3172370, 2378875, -5246840, 3197603, -4183298, 1993402, -2752000, -2479270, -2753611, --5591511, -3426310, 224412, -4265440, -3676492, 5107790, 4631586, 2335389, -2543695, -6802692, --617402, 2756832, -147640, -5317170, -2988224, -521302, -38352984, -24823838, 20703890, -15126338, --14192183, 7992934, 18130668, -29774860, -4910758, 7146289, 1964948, -15524159, -23287312, 43855376, --18845242, 5995775, -21432424, 11883101, -7436736, 20531018, 18247168, 1886028, 3272228, -24286966, -13959, 11554536, -9814537, -14460618, 11580842, 3315178, 12483322, 9935333, -2017561, 4201552, --2689723, -1497333, 18387828, -15537581, -9113921, 14765024, -550293, -11715060, 15624017, -415001, --3369402, -10464151, -4591320, 5806259, -8164196, -877784, 5537824, -10380399, -10642929, -6899865, -7953206, -22601192, 10887205, -973347, 21619254, -20191716, 6803765, -15340013, 5755256, -9182640, --11729556, 19508278, -10674604, -4664872, -10389526, 8473434, -11893838, 7145752, -3999688, 14288282, -14649597, -1758252, -22660248, 9154723, 9527311, -1016297, -654446, -12902619, -8903467, -2079838, --11116449, -8917426, -3097745, -190589, -5498095, -7315940, 8526047, 2915209, -5210869, -4337380, --5326297, -5625871, 6219650, 2352568, 1551557, -8494908, -3207804, 7461432, -4221953, -5179731, -3528316, -3683471, 95563, 2775086, 4368519, -1668595, -7029788, 1509681, 4304094, -9390409, -288300, 2554432, 295279, -4902169, -2784750, 342524, -2185065, 19370840, 9450002, -21666500, -7482370, 23446226, -1988033, 115427, 10865730, -6933688, 16471736, 14894410, -19536732, -11973295, --3536369, 10413685, 18804978, 3376918, 10032507, 21181704, 15901580, -22180284, -2301029, 35364224, -8809515, -2308008, -4080756, -6602976, -10282689, 3156264, 8749385, 9685151, 9073118, -6277095, --14982993, 4093641, -7741142, 8320426, 24484534, -6445672, -24372866, 29336774, -8723615, -16109885, -23848880, -4248260, -6963753, -25378424, -4457639, 10534481, 5129265, -5492190, -10606422, 9844065, -1167157, -11746199, 10217727, -2336462, 23291608, -17024176, 2546916, -3307662, 26672284, 9065602, --37567544, 11841225, -15617575, -6595459, -13337484, 16328392, 54111756, 19732154, 3281892, 12503724, -15861314, -19887846, -8289287, -5586679, -11206107, -6861747, -12416214, 11890080, -27550604, -7335804, -2672007, 3325379, -8913668, 1736241, 5061082, -2702608, -3341485, 9439801, 1913945, 6305549, -5418101, -5674189, 1797981, 4671851, 1971927, 3908957, -2647847, 2403034, -5182415, 729608, --1424855, -5142150, -2506114, -1157494, 8665633, 480499, 2415382, 358093, -1528472, -1722819, -944356, -741956, -7591892, -934692, 1515587, -1847373, -5783711, -14068702, -4853850, -4255776, -8562017, -1425392, 1565516, -8256001, -28592134, -12182675, 1928977, -11627013, -35980552, 31149788, --6016176, 14023068, 2626909, -16516297, -28393492, -27364310, 30625264, 18635864, 7005629, -10842645, --20532628, -15395310, -24376624, -6292127, 9050570, -3824132, 1959579, 3848828, -4026532, -12651363, --12158516, -20736102, -7457674, -4015258, 10146860, 7064685, 11158325, -5589363, -9296994, -3922379, -14593762, 2041720, 12917114, -43314744, -10227928, -97711, 9463960, -13846975, -641024, -16021839, -12489228, 10984916, 2073396, 53414896, 811749, 16664473, 21959630, 913217, 7066832, 292595, --3886946, -6471442, 11046119, 16231218, 21242908, -520765, -4061429, 1418950, 13940927, 12663174, -409633, 10256919, 8853538, 6888054, -2893734, 20876226, -6083285, 26801670, -26589068, -13320841, --32692754, -10220412, 5787469, 731218, -8512088, 1688459, -166430, 14555644, -3020436, 17449378, --8072391, -6573448, -8864812, 4451734, 9784472, -1677185, -4842039, -5395016, 6017249, 2684, -20364050, -3328600, -1460826, 3568581, 5675263, 8319352, -7119445, -732829, 2680060, 4048544, --9805410, 3279208, 3661997, 12408161, -12449500, 6927246, 4670240, -5404143, 10574209, -6124087, --7337952, -88584, -2524367, 5310190, 2674691, -4513474, -183073, 4329864, 989453, 10760504, --561567, 6980396, 19997368, -4032974, 603443, 5050345, -28056336, 870805, 3695283, 17184164, -26374320, -22986128, 4738960, -14600741, 18718542, 16934520, 1896228, 32782948, 10034654, 12877386, --12340515, -2235531, -21395916, 32752346, -19487878, 4867272, 19942606, -5109938, -13283260, 9914932, --3250217, 4868346, 21434034, 264141, -7156490, -2298881, 3798899, -985158, -13150116, 9240085, --1500554, -3955128, 36795520, -28783260, 26548804, 17011292, 33198486, 13333189, -23921358, 18008798, -108985, 16712791, 43805984, -32087164, -13429289, -4392141, 598611, 29658896, -18030810, 1257352, --19342922, 1196685, 33527052, -4108136, 34803732, 9579388, 5744519, 15636365, -21664888, -3846143, -15165530, 21515102, -35694936, -1567663, -30617748, 13302587, -16038482, -827855, 6942815, 9588514, -511638, -11110544, -8847633, -33515778, -4016868, -23900420, 18897856, 1348620, -1729798, 14591615, -599685, -386010, 14078903, 10373957, 6964827, -135291, -5055714, 6439767, -11446625, -1151588, --7923141, 7379828, 7781944, -7094212, -1528472, -14727443, 6169184, -1212791, -234076, -712965, --14206678, -17181480, -5795522, 5132486, 12574054, 6179921, 5559299, -2362232, 10502806, 7124814, --678068, -5782100, 9116068, -13608604, -3933653, 2434173, 14827301, 12087112, 2495913, -5904507, --21328808, 6174553, -37430104, -32960652, 610959, 597000, -20898774, 17206712, 5057324, -5594732, --19390704, 26674968, -6074695, 39637180, -5663452, 8635032, 14355928, -19107772, -6323266, 6142877, --22828288, -12789876, -19956028, 17329656, -15973520, -4255239, -5193153, 15016816, -13460964, -22762252, --31823024, -837519, 26593364, 1678795, -14559402, -6141267, -18454400, -6120866, 213675, 11142219, --20798380, -2254858, -4494684, -14791330, -20446728, 1054415, 3468723, 13327820, 4583267, 22848690, -6353867, 28813862, -11955578, 23804320, -6019397, -18450106, -4806069, 38667592, -16641925, 17665200, --12195560, 28394028, -14957760, 9635222, 17984638, -990527, -7394860, 3511673, -10233296, 25833692, --23587424, -8808978, 25712896, -3078418, -21437256, 1101122, 19654308, 11011222, 19653234, -19747722, --16858820, -10620917, -2170569, 19468014, 23429046, -41373420, 2196339, 12103755, -22759032, 3857954, -14374182, 11293617, 10543608, 10404021, 6882148, -3066607, 754304, 8002598, 8821326, 7306813, -17709760, -5262946, 9305047, 4056597, 19167902, 11540040, -14821395, -18596134, 5944772, 20277614, --5755793, -5451387, -12858595, -21748104, 2498597, -18538152, -5891622, 4412005, -12456479, 11736535, -3292629, -3740917, -10295037, -1830193, -10672994, -719407, 5877126, 2945274, 1637993, -1705639, --2644089, -36128728, 38774964, -13493177, 32952600, -7407208, 26386132, 1818382, -8820252, -18771692, --13394929, -2856153, -23622, 19272592, -7927973, -1947231, 5230197, -18360986, 28537374, 10391673, -663036, -24259050, 15936476, 8186745, -19427748, 18182208, 1213865, -3336653, 4285841, -986232, -24036784, -6005438, -31130996, 32798518, -17526688, -3102577, 24282672, -11302743, -5799280, -15159624, -38562364, -17869212, -5218922, -24780350, -5138929, 2565706, 34430068, -16722992, 6152004, 10684268, -20308752, -5858873, -22499186, 23665270, 14207215, 19134080, -9942849, -5097053, 2066416, 21241834, --12410308, -25817586, -28747290, 14680735, -20252918, 4664872, 20788716, 19247360, -14246407, -5162014, -28120762, -45898168, -1476932, 5858336, 15331423, -2527588, -16998944, -3735548, 25613574, -5475547, -53013856, 20474646, -15672336, -2489471, 1181116, -6862821, -19733228, -24125906, -17739288, 14422500, --11622718, -5037460, -840740, 22858352, 9710384, -8509404, 9897752, 7079180, -701690, 2986613, -3944928, -726923, 2854006, 23409720, 19272592, 18539226, 12565464, 1374926, -12116640, 5885179, --9547175, 10983842, -14482630, 14886357, 22045530, 6994891, 28025198, 30152282, 12063489, -748398, -15714748, 5065377, -3282429, -10215043, 16356309, -4817880, -13706851, -649077, 7754564, -4294431, -6710350, 12661564, 4657892, -16997870, 13267154, -7965017, -9024800, -50678468, 16782584, 9417790, -44518948, 38933340, -6155225, -14898168, -46563888, 971200, 15152108, -20182588, 14797773, 26678726, -26025354, -12602508, 31398896, 27939836, 1066226, -17507360, -18607946, 28529320, 24475944, -35576824, --48210472, 63318556, 3061238, -4929549, 8132521, 4301947, 23420456, 23081692, -9667435, -8470749, -33001992, 15363098, -6138582, -22510998, 13205414, 2222646, 1617055, 11391864, 1496796, -1478543, --13407277, 6995965, -4111358, -16688095, 29690036, -47916264, 32982128, 27014270, -45065480, -3586298, -22814866, 5323612, 26052734, -6594386, 3588445, 23482196, -3237332, 11756936, -22239878, -35590784, -98782640, -40916544, -56910464, -12920872, 110034376, 47040092, -46969224, -11117523, 19403588, 12944495, --1034550, -28845538, 41366440, 22652194, 17346300, 3575024, -55889872, -9689983, 9090298, 16117939, --22948548, -38489348, 3359201, 11476689, 5264020, -18450642, -18947786, 8593156, 5132486, 13222594, --2516851, -5158256, -1339493, 14156212, 18734110, 12357695, -28078348, -11430519, 19913078, 14082124, --14105746, -497679, 16263431, 28195386, 11316702, -15729781, -20444044, -27409944, 12767864, -9162239, -11889543, -23266374, 12866648, 6029597, 14490683, -10974715, -5353140, -18803904, -7603166, 17390322, -3444027, -15527917, 8415452, 26571352, 1834488, -2347737, 8236674, -4297115, 7337415, -19539416, --12279311, 24871618, 43006580, 3105261, 71341016, -31465468, -11997454, 41420128, 2188823, -2230162, --21094732, -42324756, 35420596, -22000434, -23912230, 18416282, -26557394, 13378823, -25169046, -27953258, --4558571, 6265284, 4154307, -6493454, 33915748, 8573292, 20755966, 9996000, 764504, 640487, --15047418, -32280438, 10558103, 32415192, -26185878, 22668300, -26693222, -2697240, -1269700, -41507100, -29828010, -14325327, 11747809, 906775, -12027519, 797253, -29871498, 30993020, -21563420, 10408316, --34805340, -21215528, -45721536, 17432198, -21250424, -24095304, -19297288, -9982041, 261456, 48963700, -17731772, 24237038, -6453189, -22823994, -28701118, 7691213, 2015950, -49812492, -22962506, -87629144, --41020696, -33876016, -4846871, -40376452, -33024004, -7312182, 32327146, 36575940, -29508572, -37627672, --43013560, 21775484, 51991116, 2624762, 41865732, 1043677, 25389700, 10060424, 3303904, 12087112, -4727149, -1038308, -14748918, 21441014, 18029736, 9496710, -17667348, -7169911, -2120103, 9136469, -9953587, -3641596, 10783589, -4715874, -11775190, -21134998, 2903398, 29175712, 10832444, -3580392, -8545374, -9569724, 15982110, -5877126, 20804822, 19729470, 2640331, -21547850, 3849365, 4603131, -23554674, 5487358, 26734560, -17888002, -10583873, 24174224, 25593174, 6531572, -6282464, -4851166, --24688546, 17993228, -11470247, -49838800, 12098386, 18000208, -43118788, 24362666, 5085778, -12295418, -2886218, -11973832, -926639, 9646497, 12958990, 22520662, -25864294, 2851858, 30434138, -3043521, --14092861, 27425514, -11638288, 2209761, -15779710, -6205691, -31787052, 8671539, 1047972, 18429168, --12380243, 1659468, 22796076, -10344966, 631360, 23560044, -45356464, 3287798, -51962660, -16295643, --34726420, 28258200, 10141492, -1726040, 11981885, -9925133, 13046500, 35829692, 9808632, 55450176, --30459908, -34912716, 32728188, 9170292, -23577760, -22041236, -8883603, 20687246, -19315542, -421444, --16673600, -21514564, 13066901, 16378858, -32333588, -18604188, 28241020, -159451, 10121090, -5732171, -15579457, 7150584, 28499256, -16127602, -11993696, 7507603, 6742562, -7835631, -29323890, -21265994, --23156854, 31617402, -14322642, -23871966, 7233262, -5995775, -7767449, -15621333, 6227703, 7497403, --2451353, -4408784, -8482560, -14369350, -2376728, -2996814, -10532334, 732292, -5061619, -9753871, -6311992, -5617817, 5820755, -5538897, -4807142, 15108084, -5676336, 7318625, 5349382, -13732084, -6454799, 2198487, -5515275, -16726213, 23370528, 15579457, -6409702, 3930969, -11242614, -8344048, -7235410, 124554, -14492830, 5455146, -5711233, 13629542, -3408057, -2152852, 2713883, 6519761, -8381092, -33928096, -68576672, -34293168, -13076028, 29952566, 39062192, -74859672, 12891344, -29748554, --40581000, -8353175, 46842524, 29925722, 25537338, -16174310, -18064632, -21615496, 23625004, 16641388, -36460516, 4725538, -47383152, -18593988, 35606888, -5507759, 10442676, 31857384, -15253576, -22127672, --34655556, -34747360, 215822, 22571126, 48830020, 36111012, 23973970, 9766756, -49953156, -53273164, -18612778, -36773508, 8677981, 46838764, 18660022, 3122978, -23653996, -42508364, -7263864, -18355080, -14259828, 11025718, 7975218, 29329258, -4568772, -5757404, 7742216, 21263846, 34607772, 35764728, -12168179, 31839666, 10747619, 11387569, -7007776, -35820564, -14020384, -15582678, -29295436, 21986474, -20639466, 15253039, 15274514, -6892886, -35170952, 5742372, 10529112, -643171, 23439248, 14978162, -12297028, -2877628, 1631014, 3353833, 24140938, 24198920, 18474264, 5256503, -4424353, -17930952, --3274376, 10296110, 3058017, -5377836, -61740, -14273787, -6562173, -8306467, -9278740, 7235410, -26382374, 12830141, -4784057, -2774012, -19658602, -2153389, 6944425, 13178033, 14820322, -4787278, --6254546, -30813706, -17675938, -4577899, 272194, 12191265, 10321343, -6188511, -7329899, 4824322, -2022930, 3027415, 7627862, -8720931, -2981781, -1874753, 5102958, 8010114, 874026, -3031173, --2198487, -13007845, -5825587, 21246130, -60298656, -121356984, -62639952, 11775727, 47407848, 115528712, -113026360, 47100220, 48099876, 34542276, 1888175, -57513908, -97473744, -146879296, -43836048, -61434676, --10685342, 59969556, 106871136, 89865208, 79356504, 43751760, -963683, -27954332, -37512780, -8003135, --64978024, -51590072, -49019536, -32106492, -26359824, -12210055, -2287607, 22411676, 52709988, 54291072, -53351548, 39080444, 50827716, 26985280, 29081224, -9468255, -2100776, -23938538, -62933620, -91154776, --110159472, -53336516, -21460878, 17191680, -2813741, 11686606, 25649008, 33550138, 71507984, 82467128, -109258600, 69724496, 7063074, 31891742, -16476031, -60276108, -52747568, -104989936, -122523608, -91559040, --56610892, -24296630, -19173808, 44158168, 49837728, 138264128, 113198160, 82869248, 81096496, 38896836, --4933844, -54839216, -79366160, -57891328, -69492032, -95386928, -45322644, 2703145, -9317932, 2779918, -41749228, 58230628, 42998528, 22492744, 21738976, 37132676, 15833397, -2680597, -4431870, -18102214, --3052648, -16143171, -42760156, -22537840, -31886910, -51730196, -9114457, -8914741, 41417444, 37811280, -22722524, 40674952, 70277480, 50368156, -12336757, -8404714, -33891052, -30090004, -70749920, -73300600, --35496296, -14901926, 6094559, 24972550, 29474750, 44007844, 50051400, 48461728, 50813220, 13042205, --5191542, -26972394, -33055678, -43559020, -48322140, -48409652, -20918638, 10942503, 14495515, 21116744, -21966610, 15342697, 16250009, 17115982, 5413270, 4038880, -5794448, -6003291, 10212895, -6893960, --16899086, 960999, 3591667, -2177549, -5310190, -7254737, 11274, -2099702, -11901354, -5335423, -3399467, 752693, 692564, 6895033, 8669391, 6432788, 5888937, 5429376, 2017561, -860604, --650151, -1150514, -3672734, -3991635, -4283156, -3984656, -3019362, -1461363, -1915555, -720481, -561567, 1687922, 3562139, 2763275, 512175, 661425, 1385664, -231391, -2813204, -3082176, --1744294, 266288, 1528472, 2936147, 4476967, 4264366, 3550864, 2758443, 570694, -1788317, --3802120, -5407364, -6338298, -7009924, -6852084, -4414153, -1014686, 2203855, 5254893, 7446400, -8196945, 8385387, 6798397, 3476239, 151398, -3175055, -5397164, -6725382, -6990060, -5210869, --3149285, -1306744, 863825, 2181307, 2552284, 2306398, 1945620, 1531693, 1122060, 799938, -294205, 93416, 91805, 32212, -193810, -270046, -304406, -267362, -273267, -213675, --190589, -200253, -191663, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +4490389, -6781217, 3733400, -3810173, -7852811, -13598940, 2443837, 442919, 3472481, 3055869, +-909459, -964220, 1072131, 8282308, -5812165, -10409927, 3504693, -4285304, -6958384, 159988, +-1002875, 4361003, 1584306, 3120831, -3104188, -746251, -2021319, 7058242, -1874216, -2805688, +-2459943, -1205275, -1656247, -2787434, -2450816, -1696512, 1430761, 627065, 958851, 270583, +1868311, 3011846, 1553168, -2624762, -7891466, -49929, -5475547, 830002, -336081, -2484639, +3586835, 268435, 63351, -7875897, -3190087, 1083942, -581431, 2785823, 239981, 2480881, +-2255932, 1042603, -956704, 4898410, -1690070, 2589865, -4323959, -4321274, -5452998, 293668, +-1264868, -1581085, 74625, -1898912, 4295, -2218888, 513785, 117575, -904091, -3440806, +384400, 376347, 2028835, 1767916, 56371, 1881733, -157840, -1433445, -437550, -670552, +768262, -1611, 142808, 1064615, 805306, -122407, 1000191, -630823, 237834, -8562017, +-1758789, -1114007, -2418067, -1086090, -2916283, 2851858, -1145683, -987306, -230854, 73551, +-159451, -2054068, 7613367, 4900021, 7956964, -3707094, 7920457, -4671851, -3271691, 3085934, +8769786, -181999, -5294621, -7826504, -5616744, -1073742, 6256157, 2462090, 2126546, 2778844, +-2729989, 4256850, 554588, 3182571, -1535988, -7133941, 1956895, -4934381, -3371549, -3460670, +-811749, -9060770, -406948, 433255, -3775813, 8475044, -1593970, -2733747, -3391951, -81068, +946503, -3626026, 136902, -4448513, -1662152, 125091, -1822140, 6091874, 201863, -1639067, +3425773, 2189360, 5655398, 2268280, 6796249, 1671279, 5559835, -6324876, 1657321, 5056250, +-1714766, -4518843, -6205691, -122407, -471910, -1244467, 1546188, 1829119, -1304596, 4846334, +-4154307, 1608465, 1709397, -3108483, 2285460, 508417, -2255395, 1215476, -555661, 477815, +-2112050, 659814, 285078, 394063, -219580, -151934, 1073742, 271120, 1970316, -398358, +193274, 9673877, -4444218, -3427921, 937377, -2198487, -1644973, 4835597, -3824132, 4655208, +2116345, 70330, 2359011, -3174518, -3027952, -5543192, -5972152, 7789997, 3663607, 2720325, +4148939, -2767570, -1860795, -2043868, 9844602, -3852049, 10778757, -392990, -2786897, -2631741, +-5761162, -6186364, -7507603, -488016, -1917166, 1326608, 7186554, -640487, -3419331, -10094784, +316217, 7976828, 11709155, -5534602, 2996814, 2141041, -3023657, -2679523, 3027952, 11106249, +-2691334, 1731409, -991064, -1643899, -1079647, 5318780, 7666517, -5851893, -3202972, 2371896, +10063108, 1669132, 7116761, -5861557, -5458367, -312996, -934155, 2032056, 1496259, -145492, +595927, 1033477, -2669322, 1213328, 3231426, 2496987, -2015950, 6442988, -1684164, 4044786, +-2158221, -2238752, 2387465, 2027761, 2154463, 480499, 2248416, 425739, -3394098, -2291902, +615791, -173946, 1199907, -643171, 1811403, -93952, 994822, -1013075, -223338, -100932, +-529892, -1176821, -143345, -722091, -215822, -865973, -768262, 1813550, -63351, -889058, +1944010, 27380, -1050120, 15985331, -10943040, -2396055, -4531728, 1276142, 4276177, 7693360, +-7635378, 5282810, -1975685, -8078297, -13088376, -2658048, -5545340, 960999, -1225676, -5515812, +-2806224, 3088618, 3265249, 10283762, 5717675, 5248450, 566936, 1656784, -5283884, -3563212, +8269423, 6343130, 4313758, 2020782, 3984119, 882616, 67646, -6842957, -9700721, 6551973, +-2562485, -6512244, -3090229, -4078072, 3517041, -3585761, 8308078, 1952600, -4732517, -2280091, +-3616363, -3120831, 4076998, 6123013, -485868, 4143033, -2968359, -3303904, 59593, 870268, +-3166465, -1195612, 4813048, 108448, -1935957, -2297271, 2638721, 2954938, -332323, 3561065, +523449, -2426657, 8289287, -1118302, 945430, 456340, -9905805, 3940096, 3154654, 5221607, +3398393, -3577708, -796716, -8905078, -4088272, -8165807, -2986076, -3624416, 66035, 850940, +-5392332, 304406, -1278290, 84289, 2344515, -752693, -969589, -110595, -1471026, 339302, +-735513, 693100, -893890, -1949915, -991064, -438624, -3365107, -233539, -129386, 779537, +-184147, 494995, -159451, 161061, -1788854, -2267743, 260382, -260382, -1024350, 523449, +-2614025, -10934987, 2757369, 63351, -3273839, -6012954, 2443837, -5749351, -1093606, 9795747, +14874009, 7293392, 8155069, -668404, -4189741, 6111202, 5473399, 2274185, 2901251, 7296613, +-1131187, 5289789, 5141613, 7571491, 7268696, -6051072, 4857071, -447750, 1673964, -5643587, +1653562, -811212, 4952634, -2001455, -1463510, -4007205, 3590593, -6177237, -5013838, 425202, +5204427, 2799782, -3215320, -1713155, -1024887, -2166811, 3124589, -7424388, 6714108, -107374, +8364449, -12020540, 793495, -10835129, -3445638, -3507378, 2885144, -1205275, -2500745, 2280628, +840203, 2817499, 4597763, 7544110, -995359, -6212670, 1268626, 10192494, 2049773, -3063386, +-801011, 6249715, -3391414, 3767760, -3277597, -11073499, 6301791, 6640020, 6197638, -5520644, +-8191577, -5968394, 6860674, -835371, -1099512, 4791573, 1764158, 1109712, 799401, -442382, +1860258, 2448668, -889595, -1490891, 1396938, 50466, -520228, 762357, -1415192, 295279, +2181844, -1024350, 2294586, -1085553, -1764158, 712965, -85899, -98247, 1146219, 792421, +1165010, 826781, 828392, -180389, 1124745, -838056, -16366510, 290447, -3617973, 1519345, +-9159555, 1131187, 1529545, 12173011, -9716290, 133681, -13038984, 2985002, -7872675, -1912871, +496069, -4265440, 3790846, 1680406, -6818261, 135828, -86973, 6329171, -4114042, 10189810, +-106300, -8816494, -4486630, 10842645, -1024350, 4345433, 2902324, -1781338, 6497749, -7163469, +-6766184, -5272609, 761283, -6861211, 7320235, -4015795, 4704063, -6644315, -55835, -8074539, +5330592, 715112, 6381248, 5684926, -5358509, 10685342, 9134322, 8603893, 1727114, 9033390, +7448010, -7661148, 6605660, 3143916, 634581, -7113003, 3308199, -6053757, 6033356, -2602750, +-4745939, -581431, 8988293, 3187403, -10280541, 9830643, -779000, -3479461, -5860483, 10012106, +8696772, -7468412, 7422777, -538482, -8864812, 105764, -5022965, -2780455, 4929549, -4293894, +3530463, -363998, 1583769, -2060511, 2698850, -373662, -237297, -600759, -948651, 937914, +554588, -2497524, 926639, 1233729, 35970, 917512, 1126355, -2346126, 543850, -288837, +88584, -1980517, 740882, -817118, -1152125, -2633352, 3061775, 621160, -1387811, -416075, +846109, -320512, 23376434, 3971234, -935229, -8063264, -15147276, 3864934, -2233383, -22231824, +19500226, -9450539, -14110041, 2979634, -903017, 2626373, -913217, 3779034, 5622112, 73551, +-360777, -11361799, -945967, -1079111, 13393856, -2448131, 346282, 4929549, -2352568, -1650341, +-5452998, 11438035, -8584566, 8264591, -2041720, -6854768, 1280974, -7663296, -3897683, -12445741, +2189897, 5712844, -3367254, -6209986, -4916664, 7521562, -11667816, -2759517, -5755256, -163746, +-1675037, 1517734, -10123238, 9858024, -13820131, -9449465, 3744675, 1667521, -527744, 3689377, +-7170448, -10313290, 1274532, -2805688, -476741, 5061082, -6169184, 4588099, 3190087, 11374147, +-3156801, 1630477, -882079, 162672, 15767362, 1320166, 15611132, -3772592, -5871221, 1778117, +-8039105, -718333, 7974681, 639950, -9352828, -8182987, 2287070, -871878, 28454, 8013872, +616328, -1510755, 3322157, -460635, -331786, -3748970, 1378685, 1749662, -1891396, -55835, +-934692, 3091303, -1409823, -631360, 1580011, 406948, 955630, -299037, 1762547, -588411, +-1611, 940061, -1973001, 2431488, -1556926, 896574, 2036888, 1109175, 1923072, 525060, +-17115982, -2209761, -3451543, -13877039, -23921894, 7427072, 12480638, -8741869, -4184372, 7077569, +-2545305, 14967424, -1622961, -7934415, -4712116, -22289270, 7590818, 2563559, -1992865, -15643345, +3751654, -8680666, -2255395, -7614440, -3876208, 11193759, -10653666, 4659503, -15796353, 10190347, +2066953, 249108, -4524211, 1245541, -2022930, -8807367, -16633871, 3287261, 76236, 3622268, +7041599, -4002373, -1288490, -10678899, -5470178, -2822331, 4593468, 3125126, 7959648, 12683575, +9927280, 5134097, 7586523, 2343979, 7905424, 7121056, -6836514, 8149701, 9197672, -1826435, +12301323, -1222992, 14424111, -6305012, -15391015, -2469069, 9903658, 10896869, 12511777, -2349884, +-21494700, -2109366, -1091459, 872952, -673773, -5242545, 3146601, -15665893, 12297028, 7778186, +7479149, -8174934, -7720741, -1657857, 4609574, -498216, -8643085, 135828, -4192962, -7014756, +-2784750, -1111323, -3329137, 377420, -2805151, 1493038, -1728724, -917512, 2327872, 488553, +1092532, -1066763, -3052111, -3386582, 2466922, -2688113, -40265, -942208, 1539209, -1059246, +-647466, -1047435, 3673808, 1979980, 1162862, -1060857, 22939958, -5050345, -5513665, 7649337, +12348031, -888521, 5743445, 14304389, 10328323, -23488640, -21589190, 176094, -2083059, 3165928, +-9655623, -17134236, 4058744, 13738527, 9064528, -9944997, 16148540, 13059922, 12244415, -20583094, +5816997, 10800769, 541166, 1647657, 9177271, 21214990, -4114042, -9688372, 6418829, 4815195, +-2905009, 11472395, 17098802, 3205656, 17714056, 7761006, -13326747, 1511292, 14685567, -1575716, +-6056978, 7629473, 1210107, 2910914, 15412490, 9924596, 5229660, 1846836, -17939542, -18236432, +-1548336, 2910914, 4745402, -5613523, -817654, -4698694, 1578937, 2298881, -6861211, 2612414, +-4221953, -1040993, -5834713, 680752, 11378979, -6718403, -16501801, -2546379, -14039711, 3115462, +-5027259, -335544, -1906429, 6647536, -2501282, 4822712, -86973, 4141959, 1917166, -1874216, +-2259690, -2822867, -8153459, 2993592, 1035624, 2071785, 248571, -6251325, 3137474, -4881767, +-4158602, -1396401, -5333276, -1082332, -1757715, -1944547, -1691143, 3491272, -1545115, 2341831, +-233002, 1893007, 311385, 4500589, -1939715, 1249836, -3610994, -869194, -3098282, -2774012, +-598611, -2032593, 6841883, 2936684, 249645, -907312, -972273, -38156488, -23741506, -7078106, +7122130, -2193118, -9407589, 1868311, -9165997, 26980448, -10713259, 17362942, 26623966, 14504641, +13189308, -10210211, 9522479, -4994510, -12141873, 10835666, 12620761, 8415988, 17969070, 244813, +-801548, -7747584, -7948374, -6769406, -10993506, -10700374, -7311645, 4282083, 1610613, 27917, +-6878927, -3686156, -10669236, 4617090, -9204115, -8337069, -3683471, 4638565, 39728, -5585605, +-15585899, 2004676, -4552666, 5806259, -18402862, -14191109, 16295643, -2353105, -3058017, -7379291, +-4525822, 12277164, 4011500, -2395518, 6732898, -1698123, 7001871, 5625871, 7978976, -5553393, +-9266392, -23389318, 1697049, -22680648, -1488206, -19180788, -2726767, 18372796, -2247879, 3353296, +-12965969, -5520644, -6665789, 1577327, -8310225, -4747013, 8273181, 10327786, -1010391, -924492, +1209033, -4548371, 1778117, -416612, -4530117, -1762547, -3871913, -1429150, -2183991, -10467372, +1886028, -1663226, -1334661, 764504, -2855617, -3316252, -7241852, -1593433, -4174708, -4918275, +-904628, -6222871, -2913062, 1160178, -3937948, -4505421, 611496, -3748433, 1324997, 1618129, +4592931, -2640868, 3221762, 1627793, -4120484, -1452236, -963146, -1808181, 868657, -801548, +-1170916, 26387742, 520228, -19105626, -16199543, 16553878, 12982612, -12230993, -11812234, 22193706, +14108431, 813896, -13166759, 1589675, -5532992, 10523207, -8167417, 1248225, -3455301, -2427194, +22956600, -3250217, -6238977, 4250407, 3916473, 6854231, 7101729, 771484, -9043054, 6846715, +3484292, 7845832, 17766132, 8114267, -25538412, -7329362, -4147865, -19580220, 7595113, -3415573, +421444, -10925323, 9239548, -4260608, 1786706, -14205067, 9643275, -11578158, 976031, 11355357, +-1799591, 11978664, -9347996, 14945412, -19171660, 9556839, 249108, -6956237, 25153476, 6659884, +-5189394, -15022722, 6554120, -3124052, 2105071, -2324651, 9230422, 13655849, 18509698, -11740830, +8345659, -4689568, 16564078, 5996311, 2409477, -1583232, 9953587, 1701881, -6510634, 7976291, +-5662915, -9739375, -4133906, -13222594, 228707, -14807437, -1191853, -10007811, 11416023, -3685082, +7363185, -8035347, 364535, -4540854, 6956774, -2281165, -591095, -4504884, 2398202, -3406983, +-5254893, -3172370, 2378875, -5246840, 3197603, -4183298, 1993402, -2752000, -2479270, -2753611, +-5591511, -3426310, 224412, -4265440, -3676492, 5107790, 4631586, 2335389, -2543695, -6802692, +-617402, 2756832, -147640, -5317170, -2988224, -521302, -38352984, -24823838, 20703890, -15126338, +-14192183, 7992934, 18130668, -29774860, -4910758, 7146289, 1964948, -15524159, -23287312, 43855376, +-18845242, 5995775, -21432424, 11883101, -7436736, 20531018, 18247168, 1886028, 3272228, -24286966, +13959, 11554536, -9814537, -14460618, 11580842, 3315178, 12483322, 9935333, -2017561, 4201552, +-2689723, -1497333, 18387828, -15537581, -9113921, 14765024, -550293, -11715060, 15624017, -415001, +-3369402, -10464151, -4591320, 5806259, -8164196, -877784, 5537824, -10380399, -10642929, -6899865, +7953206, -22601192, 10887205, -973347, 21619254, -20191716, 6803765, -15340013, 5755256, -9182640, +-11729556, 19508278, -10674604, -4664872, -10389526, 8473434, -11893838, 7145752, -3999688, 14288282, +14649597, -1758252, -22660248, 9154723, 9527311, -1016297, -654446, -12902619, -8903467, -2079838, +-11116449, -8917426, -3097745, -190589, -5498095, -7315940, 8526047, 2915209, -5210869, -4337380, +-5326297, -5625871, 6219650, 2352568, 1551557, -8494908, -3207804, 7461432, -4221953, -5179731, +3528316, -3683471, 95563, 2775086, 4368519, -1668595, -7029788, 1509681, 4304094, -9390409, +288300, 2554432, 295279, -4902169, -2784750, 342524, -2185065, 19370840, 9450002, -21666500, +7482370, 23446226, -1988033, 115427, 10865730, -6933688, 16471736, 14894410, -19536732, -11973295, +-3536369, 10413685, 18804978, 3376918, 10032507, 21181704, 15901580, -22180284, -2301029, 35364224, +8809515, -2308008, -4080756, -6602976, -10282689, 3156264, 8749385, 9685151, 9073118, -6277095, +-14982993, 4093641, -7741142, 8320426, 24484534, -6445672, -24372866, 29336774, -8723615, -16109885, +23848880, -4248260, -6963753, -25378424, -4457639, 10534481, 5129265, -5492190, -10606422, 9844065, +1167157, -11746199, 10217727, -2336462, 23291608, -17024176, 2546916, -3307662, 26672284, 9065602, +-37567544, 11841225, -15617575, -6595459, -13337484, 16328392, 54111756, 19732154, 3281892, 12503724, +15861314, -19887846, -8289287, -5586679, -11206107, -6861747, -12416214, 11890080, -27550604, -7335804, +2672007, 3325379, -8913668, 1736241, 5061082, -2702608, -3341485, 9439801, 1913945, 6305549, +5418101, -5674189, 1797981, 4671851, 1971927, 3908957, -2647847, 2403034, -5182415, 729608, +-1424855, -5142150, -2506114, -1157494, 8665633, 480499, 2415382, 358093, -1528472, -1722819, +944356, -741956, -7591892, -934692, 1515587, -1847373, -5783711, -14068702, -4853850, -4255776, +8562017, -1425392, 1565516, -8256001, -28592134, -12182675, 1928977, -11627013, -35980552, 31149788, +-6016176, 14023068, 2626909, -16516297, -28393492, -27364310, 30625264, 18635864, 7005629, -10842645, +-20532628, -15395310, -24376624, -6292127, 9050570, -3824132, 1959579, 3848828, -4026532, -12651363, +-12158516, -20736102, -7457674, -4015258, 10146860, 7064685, 11158325, -5589363, -9296994, -3922379, +14593762, 2041720, 12917114, -43314744, -10227928, -97711, 9463960, -13846975, -641024, -16021839, +12489228, 10984916, 2073396, 53414896, 811749, 16664473, 21959630, 913217, 7066832, 292595, +-3886946, -6471442, 11046119, 16231218, 21242908, -520765, -4061429, 1418950, 13940927, 12663174, +409633, 10256919, 8853538, 6888054, -2893734, 20876226, -6083285, 26801670, -26589068, -13320841, +-32692754, -10220412, 5787469, 731218, -8512088, 1688459, -166430, 14555644, -3020436, 17449378, +-8072391, -6573448, -8864812, 4451734, 9784472, -1677185, -4842039, -5395016, 6017249, 2684, +20364050, -3328600, -1460826, 3568581, 5675263, 8319352, -7119445, -732829, 2680060, 4048544, +-9805410, 3279208, 3661997, 12408161, -12449500, 6927246, 4670240, -5404143, 10574209, -6124087, +-7337952, -88584, -2524367, 5310190, 2674691, -4513474, -183073, 4329864, 989453, 10760504, +-561567, 6980396, 19997368, -4032974, 603443, 5050345, -28056336, 870805, 3695283, 17184164, +26374320, -22986128, 4738960, -14600741, 18718542, 16934520, 1896228, 32782948, 10034654, 12877386, +-12340515, -2235531, -21395916, 32752346, -19487878, 4867272, 19942606, -5109938, -13283260, 9914932, +-3250217, 4868346, 21434034, 264141, -7156490, -2298881, 3798899, -985158, -13150116, 9240085, +-1500554, -3955128, 36795520, -28783260, 26548804, 17011292, 33198486, 13333189, -23921358, 18008798, +108985, 16712791, 43805984, -32087164, -13429289, -4392141, 598611, 29658896, -18030810, 1257352, +-19342922, 1196685, 33527052, -4108136, 34803732, 9579388, 5744519, 15636365, -21664888, -3846143, +15165530, 21515102, -35694936, -1567663, -30617748, 13302587, -16038482, -827855, 6942815, 9588514, +511638, -11110544, -8847633, -33515778, -4016868, -23900420, 18897856, 1348620, -1729798, 14591615, +599685, -386010, 14078903, 10373957, 6964827, -135291, -5055714, 6439767, -11446625, -1151588, +-7923141, 7379828, 7781944, -7094212, -1528472, -14727443, 6169184, -1212791, -234076, -712965, +-14206678, -17181480, -5795522, 5132486, 12574054, 6179921, 5559299, -2362232, 10502806, 7124814, +-678068, -5782100, 9116068, -13608604, -3933653, 2434173, 14827301, 12087112, 2495913, -5904507, +-21328808, 6174553, -37430104, -32960652, 610959, 597000, -20898774, 17206712, 5057324, -5594732, +-19390704, 26674968, -6074695, 39637180, -5663452, 8635032, 14355928, -19107772, -6323266, 6142877, +-22828288, -12789876, -19956028, 17329656, -15973520, -4255239, -5193153, 15016816, -13460964, -22762252, +-31823024, -837519, 26593364, 1678795, -14559402, -6141267, -18454400, -6120866, 213675, 11142219, +-20798380, -2254858, -4494684, -14791330, -20446728, 1054415, 3468723, 13327820, 4583267, 22848690, +6353867, 28813862, -11955578, 23804320, -6019397, -18450106, -4806069, 38667592, -16641925, 17665200, +-12195560, 28394028, -14957760, 9635222, 17984638, -990527, -7394860, 3511673, -10233296, 25833692, +-23587424, -8808978, 25712896, -3078418, -21437256, 1101122, 19654308, 11011222, 19653234, -19747722, +-16858820, -10620917, -2170569, 19468014, 23429046, -41373420, 2196339, 12103755, -22759032, 3857954, +14374182, 11293617, 10543608, 10404021, 6882148, -3066607, 754304, 8002598, 8821326, 7306813, +17709760, -5262946, 9305047, 4056597, 19167902, 11540040, -14821395, -18596134, 5944772, 20277614, +-5755793, -5451387, -12858595, -21748104, 2498597, -18538152, -5891622, 4412005, -12456479, 11736535, +3292629, -3740917, -10295037, -1830193, -10672994, -719407, 5877126, 2945274, 1637993, -1705639, +-2644089, -36128728, 38774964, -13493177, 32952600, -7407208, 26386132, 1818382, -8820252, -18771692, +-13394929, -2856153, -23622, 19272592, -7927973, -1947231, 5230197, -18360986, 28537374, 10391673, +663036, -24259050, 15936476, 8186745, -19427748, 18182208, 1213865, -3336653, 4285841, -986232, +24036784, -6005438, -31130996, 32798518, -17526688, -3102577, 24282672, -11302743, -5799280, -15159624, +38562364, -17869212, -5218922, -24780350, -5138929, 2565706, 34430068, -16722992, 6152004, 10684268, +20308752, -5858873, -22499186, 23665270, 14207215, 19134080, -9942849, -5097053, 2066416, 21241834, +-12410308, -25817586, -28747290, 14680735, -20252918, 4664872, 20788716, 19247360, -14246407, -5162014, +28120762, -45898168, -1476932, 5858336, 15331423, -2527588, -16998944, -3735548, 25613574, -5475547, +53013856, 20474646, -15672336, -2489471, 1181116, -6862821, -19733228, -24125906, -17739288, 14422500, +-11622718, -5037460, -840740, 22858352, 9710384, -8509404, 9897752, 7079180, -701690, 2986613, +3944928, -726923, 2854006, 23409720, 19272592, 18539226, 12565464, 1374926, -12116640, 5885179, +-9547175, 10983842, -14482630, 14886357, 22045530, 6994891, 28025198, 30152282, 12063489, -748398, +15714748, 5065377, -3282429, -10215043, 16356309, -4817880, -13706851, -649077, 7754564, -4294431, +6710350, 12661564, 4657892, -16997870, 13267154, -7965017, -9024800, -50678468, 16782584, 9417790, +44518948, 38933340, -6155225, -14898168, -46563888, 971200, 15152108, -20182588, 14797773, 26678726, +26025354, -12602508, 31398896, 27939836, 1066226, -17507360, -18607946, 28529320, 24475944, -35576824, +-48210472, 63318556, 3061238, -4929549, 8132521, 4301947, 23420456, 23081692, -9667435, -8470749, +33001992, 15363098, -6138582, -22510998, 13205414, 2222646, 1617055, 11391864, 1496796, -1478543, +-13407277, 6995965, -4111358, -16688095, 29690036, -47916264, 32982128, 27014270, -45065480, -3586298, +22814866, 5323612, 26052734, -6594386, 3588445, 23482196, -3237332, 11756936, -22239878, -35590784, +98782640, -40916544, -56910464, -12920872, 110034376, 47040092, -46969224, -11117523, 19403588, 12944495, +-1034550, -28845538, 41366440, 22652194, 17346300, 3575024, -55889872, -9689983, 9090298, 16117939, +-22948548, -38489348, 3359201, 11476689, 5264020, -18450642, -18947786, 8593156, 5132486, 13222594, +-2516851, -5158256, -1339493, 14156212, 18734110, 12357695, -28078348, -11430519, 19913078, 14082124, +-14105746, -497679, 16263431, 28195386, 11316702, -15729781, -20444044, -27409944, 12767864, -9162239, +11889543, -23266374, 12866648, 6029597, 14490683, -10974715, -5353140, -18803904, -7603166, 17390322, +3444027, -15527917, 8415452, 26571352, 1834488, -2347737, 8236674, -4297115, 7337415, -19539416, +-12279311, 24871618, 43006580, 3105261, 71341016, -31465468, -11997454, 41420128, 2188823, -2230162, +-21094732, -42324756, 35420596, -22000434, -23912230, 18416282, -26557394, 13378823, -25169046, -27953258, +-4558571, 6265284, 4154307, -6493454, 33915748, 8573292, 20755966, 9996000, 764504, 640487, +-15047418, -32280438, 10558103, 32415192, -26185878, 22668300, -26693222, -2697240, -1269700, -41507100, +29828010, -14325327, 11747809, 906775, -12027519, 797253, -29871498, 30993020, -21563420, 10408316, +-34805340, -21215528, -45721536, 17432198, -21250424, -24095304, -19297288, -9982041, 261456, 48963700, +17731772, 24237038, -6453189, -22823994, -28701118, 7691213, 2015950, -49812492, -22962506, -87629144, +-41020696, -33876016, -4846871, -40376452, -33024004, -7312182, 32327146, 36575940, -29508572, -37627672, +-43013560, 21775484, 51991116, 2624762, 41865732, 1043677, 25389700, 10060424, 3303904, 12087112, +4727149, -1038308, -14748918, 21441014, 18029736, 9496710, -17667348, -7169911, -2120103, 9136469, +9953587, -3641596, 10783589, -4715874, -11775190, -21134998, 2903398, 29175712, 10832444, -3580392, +8545374, -9569724, 15982110, -5877126, 20804822, 19729470, 2640331, -21547850, 3849365, 4603131, +23554674, 5487358, 26734560, -17888002, -10583873, 24174224, 25593174, 6531572, -6282464, -4851166, +-24688546, 17993228, -11470247, -49838800, 12098386, 18000208, -43118788, 24362666, 5085778, -12295418, +2886218, -11973832, -926639, 9646497, 12958990, 22520662, -25864294, 2851858, 30434138, -3043521, +-14092861, 27425514, -11638288, 2209761, -15779710, -6205691, -31787052, 8671539, 1047972, 18429168, +-12380243, 1659468, 22796076, -10344966, 631360, 23560044, -45356464, 3287798, -51962660, -16295643, +-34726420, 28258200, 10141492, -1726040, 11981885, -9925133, 13046500, 35829692, 9808632, 55450176, +-30459908, -34912716, 32728188, 9170292, -23577760, -22041236, -8883603, 20687246, -19315542, -421444, +-16673600, -21514564, 13066901, 16378858, -32333588, -18604188, 28241020, -159451, 10121090, -5732171, +15579457, 7150584, 28499256, -16127602, -11993696, 7507603, 6742562, -7835631, -29323890, -21265994, +-23156854, 31617402, -14322642, -23871966, 7233262, -5995775, -7767449, -15621333, 6227703, 7497403, +-2451353, -4408784, -8482560, -14369350, -2376728, -2996814, -10532334, 732292, -5061619, -9753871, +6311992, -5617817, 5820755, -5538897, -4807142, 15108084, -5676336, 7318625, 5349382, -13732084, +6454799, 2198487, -5515275, -16726213, 23370528, 15579457, -6409702, 3930969, -11242614, -8344048, +7235410, 124554, -14492830, 5455146, -5711233, 13629542, -3408057, -2152852, 2713883, 6519761, +8381092, -33928096, -68576672, -34293168, -13076028, 29952566, 39062192, -74859672, 12891344, -29748554, +-40581000, -8353175, 46842524, 29925722, 25537338, -16174310, -18064632, -21615496, 23625004, 16641388, +36460516, 4725538, -47383152, -18593988, 35606888, -5507759, 10442676, 31857384, -15253576, -22127672, +-34655556, -34747360, 215822, 22571126, 48830020, 36111012, 23973970, 9766756, -49953156, -53273164, +18612778, -36773508, 8677981, 46838764, 18660022, 3122978, -23653996, -42508364, -7263864, -18355080, +14259828, 11025718, 7975218, 29329258, -4568772, -5757404, 7742216, 21263846, 34607772, 35764728, +12168179, 31839666, 10747619, 11387569, -7007776, -35820564, -14020384, -15582678, -29295436, 21986474, +20639466, 15253039, 15274514, -6892886, -35170952, 5742372, 10529112, -643171, 23439248, 14978162, +12297028, -2877628, 1631014, 3353833, 24140938, 24198920, 18474264, 5256503, -4424353, -17930952, +-3274376, 10296110, 3058017, -5377836, -61740, -14273787, -6562173, -8306467, -9278740, 7235410, +26382374, 12830141, -4784057, -2774012, -19658602, -2153389, 6944425, 13178033, 14820322, -4787278, +-6254546, -30813706, -17675938, -4577899, 272194, 12191265, 10321343, -6188511, -7329899, 4824322, +2022930, 3027415, 7627862, -8720931, -2981781, -1874753, 5102958, 8010114, 874026, -3031173, +-2198487, -13007845, -5825587, 21246130, -60298656, -121356984, -62639952, 11775727, 47407848, 115528712, +113026360, 47100220, 48099876, 34542276, 1888175, -57513908, -97473744, -146879296, -43836048, -61434676, +-10685342, 59969556, 106871136, 89865208, 79356504, 43751760, -963683, -27954332, -37512780, -8003135, +-64978024, -51590072, -49019536, -32106492, -26359824, -12210055, -2287607, 22411676, 52709988, 54291072, +53351548, 39080444, 50827716, 26985280, 29081224, -9468255, -2100776, -23938538, -62933620, -91154776, +-110159472, -53336516, -21460878, 17191680, -2813741, 11686606, 25649008, 33550138, 71507984, 82467128, +109258600, 69724496, 7063074, 31891742, -16476031, -60276108, -52747568, -104989936, -122523608, -91559040, +-56610892, -24296630, -19173808, 44158168, 49837728, 138264128, 113198160, 82869248, 81096496, 38896836, +-4933844, -54839216, -79366160, -57891328, -69492032, -95386928, -45322644, 2703145, -9317932, 2779918, +41749228, 58230628, 42998528, 22492744, 21738976, 37132676, 15833397, -2680597, -4431870, -18102214, +-3052648, -16143171, -42760156, -22537840, -31886910, -51730196, -9114457, -8914741, 41417444, 37811280, +22722524, 40674952, 70277480, 50368156, -12336757, -8404714, -33891052, -30090004, -70749920, -73300600, +-35496296, -14901926, 6094559, 24972550, 29474750, 44007844, 50051400, 48461728, 50813220, 13042205, +-5191542, -26972394, -33055678, -43559020, -48322140, -48409652, -20918638, 10942503, 14495515, 21116744, +21966610, 15342697, 16250009, 17115982, 5413270, 4038880, -5794448, -6003291, 10212895, -6893960, +-16899086, 960999, 3591667, -2177549, -5310190, -7254737, 11274, -2099702, -11901354, -5335423, +3399467, 752693, 692564, 6895033, 8669391, 6432788, 5888937, 5429376, 2017561, -860604, +-650151, -1150514, -3672734, -3991635, -4283156, -3984656, -3019362, -1461363, -1915555, -720481, +561567, 1687922, 3562139, 2763275, 512175, 661425, 1385664, -231391, -2813204, -3082176, +-1744294, 266288, 1528472, 2936147, 4476967, 4264366, 3550864, 2758443, 570694, -1788317, +-3802120, -5407364, -6338298, -7009924, -6852084, -4414153, -1014686, 2203855, 5254893, 7446400, +8196945, 8385387, 6798397, 3476239, 151398, -3175055, -5397164, -6725382, -6990060, -5210869, +-3149285, -1306744, 863825, 2181307, 2552284, 2306398, 1945620, 1531693, 1122060, 799938, +294205, 93416, 91805, 32212, -193810, -270046, -304406, -267362, -273267, -213675, +-190589, -200253, -191663, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -4538707, --7080791, -5145908, 2013266, -771484, -12128451, -6881612, -520765, 1748589, -3726958, 1291711, --4499515, 894427, -3251290, 8531416, -6935299, -3031710, -3047816, 5442798, 3751654, 8687645, -2291365, 1818919, -3963718, 4108673, 522912, 1126355, -483184, 3301219, 4501663, 353798, -4486094, 4277788, -2073396, 2400887, -2535105, -2803540, 314069, -2287607, 1440425, -3599183, --6558952, 1788854, 2335925, -1606318, 1818919, -3109020, 2945811, 4042101, -6930467, 1373853, --389768, 2627446, 2218351, 386547, -6842420, -2026151, -3012920, 2290291, -91268, 711354, --2204929, 1290638, -3517578, 193810, 3790309, 2453500, 243739, -1918240, 1243930, -5563057, --3154117, -4079145, 727460, 734439, -366683, 5935645, 10201, 5178120, 55298, 576599, -460635, 13959, -2810519, 2124935, -191126, 1069447, -620623, 702227, 952946, -343061, --998580, -342524, -319438, -257698, -189515, -1458141, 229781, 1588601, 863825, 59593, -143345, -377957, -710817, 699006, -464393, -14031121, -466004, 717796, 178241, 2277943, --4967130, 3607773, 2017024, -2619393, -8371428, 5466957, 5609764, -1351304, 4663798, 3358128, --4650913, 9170292, 1892470, -4188667, 4919348, 329102, 4595078, 651761, -8034273, 3017215, --1542967, -2992519, -3134789, -2459943, 5220533, 4037806, 304943, 4225711, 1515587, -4049081, --5002027, -482647, -1187559, 2113124, 1431835, -3943854, 911070, 2009508, 1902671, -3471407, --2909840, -4590783, -1624035, -1167694, 892279, -1147293, 6099928, 2590402, -970663, -3133179, -1125818, 2517388, 1298691, 6560563, -1120450, 3288871, -412854, -2199560, -4025995, 2791729, --928250, -1889786, 3845070, -1226213, 1266479, -897111, -821413, -4482872, 956167, -1295470, -5210332, 6439230, -3916473, -3997004, -2804077, 1054415, -2518462, -1311576, -1632088, -1646583, --1760400, 999117, 2393371, -194347, 604517, 681289, -272194, 38118, -1161252, -2619393, --4123706, -9509594, -5674189, -2056216, 6857452, 892816, 1293859, 4199405, 1147293, 1814087, --9963250, -9154723, -5822365, -1526324, -19327, 4230543, -2978560, 3310883, -1694902, -6156299, -1940788, -900333, -4201015, -66572, 5930813, 8600672, 3916473, -3937411, 2326262, 275415, -6216965, -27917, -4916127, -168577, -2861522, 6096169, 2685428, 2859375, 6189585, -1066226, -471910, 8281771, 7257958, -271120, -12348, 570157, -436476, 2204929, 628676, -6031745, --7989176, -2824478, -994822, 28991, -2632815, -8923868, -926639, 2477659, -4840965, -2368138, --3145527, -2701535, 968515, 1148904, 2967823, -6218576, -4957466, 4803384, -2008434, -1082869, -1012539, -366683, 3151432, -5988795, 2397129, 2225867, -2358474, -2280091, 2415382, -2614561, -3837553, -1495186, 58519, 3221, -1480690, 760209, 2842732, 1571958, 341987, 1717450, -507880, -777389, -1515587, -840740, -864362, 353798, 454193, -253940, -202937, 424665, --115427, 12823162, -4811437, -3796214, -540629, 295816, -4685810, 120259, -3253975, 6206765, --1418950, -7504382, -10476499, -2635499, -6912213, 9820980, 874026, 6990596, 5909338, -9166534, --436476, 3952981, 2889439, 4986457, 998580, -521302, -753767, 2377265, -2977486, 3601330, -2035278, -3224447, 2126009, 221728, 2468533, 5370320, -2774012, 2175938, -250182, 3098282, -2694555, -1014686, 3680787, -948114, 3214246, -2318209, 2939368, -7416872, -3090766, -2665564, -2197413, 6541235, -4662187, -3075197, -1661616, 461172, -2079301, -2801929, -1424855, 2687039, -2219424, 3809636, -1146219, 2198487, -2108292, -2259690, -120259, -1332514, 2689187, 28991, --3811784, 2262911, -2183454, -3786551, -1329292, -2332167, 1794223, -2747169, -7521562, -1018981, --3192771, -3187403, 1757179, -2042794, -4484483, -874026, 1075889, -269509, 382789, 13959, --2775086, 150861, 1629403, -1031329, -1095754, 363998, 51540, 607738, 599685, 1552631, -546535, -1241782, 974958, -174483, -346819, -446677, -1175210, -1154809, -1200443, 2279017, -3459059, -1179505, 5185636, -7807714, 3675955, -4616553, -5103495, 7796977, 2985539, -8926553, -1074816, 182536, 2862596, -6389301, -4035122, -443992, -5142150, -9497783, -9180493, -6023692, --9161165, 4119948, -831076, 1535988, 5176510, -8041790, 5522254, -2183991, 2660732, 1783485, --688269, 966905, -1037235, -1052267, -5178657, -3067144, 7100118, -2443837, -5638755, -5201743, --371515, -2270427, 2314451, -4968204, -7730405, 1324997, 7470559, -995896, 4587025, -2415919, -2568391, -3817689, 3134253, 1338419, -5235565, 8031589, 1559073, -1552094, 1997697, 7392713, -6864432, 3643206, -571231, -8009577, -1222992, -6658810, 2097018, -1378148, 1276679, 1278827, -2035815, -6046240, 97711, -354335, 3119757, 6387153, -7718056, 1146756, -2154463, -7270306, --682900, 2246805, -601832, -84826, -555661, 2516314, 628676, -2048699, -1312649, -1459215, --787590, -2459406, 243739, -128312, 1583232, -2985002, -1996623, -154619, -251256, -302795, -301185, -158914, 653909, -1037772, -988379, -222801, -30602, -737124, -41339, -146566, -1531156, 1341104, 144418, 100932, -1250372, -2234994, -649614, 181999, -1923609, -1172526, --819802, -686121, -692564, -8863202, -8484171, -5458904, -9358734, -11124502, -10591926, 4708895, -5137318, -6764574, -1669669, -6110665, -10057203, 5621039, -2518462, -8715562, 3206730, -456340, -612033, 1046898, 3171297, 1132798, -159451, 2427730, 3227668, -4954245, -4738960, -1177358, --5813775, -282394, -6206765, -10878078, -716186, 6810745, -7819525, -5977521, 4481262, -4072166, -656593, 1832877, -3954591, -3179887, -3329674, -11737609, -4991289, 2683281, -3244311, -3803194, --7333120, 3471407, 6828461, -2287070, 10449119, -5575942, -2540473, 77846, -2338073, -8582955, --466541, 2115272, -140660, -1713692, -7453379, -1135482, 7629473, 3888019, 2354716, 3994857, -2922725, -1857573, 14457934, -4387309, -5407364, -5182952, -6197638, 2631741, 8281234, 5657009, -774705, -1217623, -3953518, -1367410, 30065, -1825898, 499827, -2485176, 1152125, 6058052, -4011500, -2834142, -467078, -967978, 2308008, -1144609, 2499134, -2388539, -1093069, 459562, -633508, -530428, 956167, -1347546, 1706176, 142808, 1378685, 1083406, 887448, -619549, --985158, -221191, -995896, -1271310, 15904264, 10783052, -620623, 9838696, -962610, 1341104, -1779190, -5559835, 8952322, -15569, 7881802, 7566122, -6340983, 9862319, 19327, -7715372, --12682502, 11347304, 5414880, 11273752, -9679783, 6431177, 3402688, -10611790, -10521596, -6250251, --3093450, 10864657, -10594074, 9147207, -1047435, -1141388, 6512244, 6180458, 8410083, 3045132, --4840965, 4079145, 7892540, -4986457, 7888781, 12135967, 5042292, 7323456, 2920578, 1993402, -1919314, 209917, -6835978, 2359548, 506269, 386547, 5445482, -4071092, 3178813, 3651796, --1801202, 10587094, -6442988, -3905199, -2590402, 9134322, -1856500, 7529078, 3676492, 5060545, -4445828, 804770, -13223667, -2112050, -10637560, -5764920, 13404056, 7004018, -6245956, -447750, --7657927, -6772627, -3672734, 11220602, 825707, 3813931, 2024003, -1842004, 2137283, 3976066, -6901476, -2074469, 3962107, 2916820, 2384781, -2499671, -1729261, 1060857, -1439351, -116501, -1753420, 2559264, 909996, 1078037, 2972654, 3031710, 973884, 44560, 1336272, -705448, -2495376, 4038343, 1763084, 76236, 4301947, 469762, -2141578, 1840930, -14089640, 8873939, -8522826, 25238302, 981937, 2165737, -1275605, -3488587, -1657321, 8516920, 7778723, 6754910, -9813463, 3950833, 15501611, 4503273, -6147709, 1444720, 13512504, 5296232, 1370095, 2055679, --6950868, -10046465, 6410239, -5018133, -9791989, -20797306, -326954, 8192650, -629750, 4803921, --7177964, -3868692, -2677912, 1480153, -2267206, -6291590, -3026341, -16779900, -4350265, -14257681, -1208496, -7556995, 5710159, -8222178, 3111167, -7910793, -2699924, -588947, 253403, 1107565, -1603633, -10458245, 5027796, -1668058, 2318209, -5522254, 168577, 8152922, 3354370, 11308112, -6426882, -3608846, -648003, -2479807, -1137093, -2808372, -3605625, -308701, 4724464, 2904472, -3522947, 2107218, -16305843, 10653666, 10631118, -4102768, 6108517, 4605279, -8593693, 4024921, -2638721, 410706, -1784559, 1369021, 5635534, -5048734, 3309809, -1524177, 341450, -521302, -1291711, 2845953, -2433099, -1259499, 4210679, -3077881, 277025, -9664, 1644436, -2061047, --3396246, 1981591, 212601, -1228361, -958315, 383326, -42413, 1835025, 2379949, 2426120, -123480, -2894271, 622233, 27145804, 9736154, -4624069, 13368086, -8908299, 9299678, 6161668, --12891344, 2657511, -16197395, 253940, -5555004, -11425150, 5995775, 131533, 4571456, 6582575, -8180839, 13179644, 5457293, -1014686, -3497177, -9096741, -16327855, 5696201, 6295349, 1695438, --5746130, 8713952, 1075352, 9211094, 5449777, -17023640, -6506339, 2214593, -12545599, 574452, --964220, -2437931, 3604015, 2687576, -3008625, 12433393, -7290707, 428423, 6941204, -6228240, -4746476, -2756295, -7648263, 5017596, -127775, -1045288, 7135552, 4701379, 202937, -3803194, -14842333, 602906, 8322036, 781684, -4705137, -5230197, -12556337, -4889284, 5158793, -391379, -4394289, -1474248, -9795210, 3831648, 3160559, -14332306, 4096325, 7306813, -3864934, 7798050, -1797444, -8157217, -8300025, 9309342, -238371, -18798534, 2300492, 1969779, 753767, -1955284, -1069447, -2623688, 435402, 5551245, -1749662, 850940, 1377074, 1607928, -4754529, 1381369, --1720134, 1258425, 3454228, 3645354, 2627446, 1239098, -3131031, 1367410, -302258, -321049, -1221918, -3496104, -73014, 2330557, 3216931, -2196339, -1344325, -4086125, 688269, 4213900, --4207458, 1668595, 1467268, -28348394, -9454297, 29496762, 8142721, 4657355, -4514011, -857383, --4609037, 5967320, -9622874, 12861816, 7327751, 5998459, 6160057, -4637491, -514859, -592169, -4089346, 8639327, -13156022, -7827041, -4249334, 9888088, 3523484, 5490579, 5901822, -1422171, --9453223, 3019899, 664109, 18001282, 14141180, 3680250, 10722386, 534187, -5273146, 2182380, --1563368, -2532420, 6885370, 8498130, 6969122, 17418776, 8369281, 6801618, 7603703, -7976828, --13053479, -6140193, 5846524, -11120744, -5548561, 10710038, 11401528, 6243809, -5262409, 10103911, --4071092, 1059246, 2357400, 5784247, -3059627, -6380174, 3555696, -5757404, -17980344, 733903, -5715528, -9804873, 1199907, -1802813, -2606508, -1829119, -5871221, 14527727, -1598265, 8287677, --20965346, -19907174, -16905528, -7712688, 1634235, 2006824, -628139, 1114544, -435939, -4473209, -2097018, -4913443, -1520418, -2172180, 5010616, 776315, 1758789, -3950296, -809601, -3519189, --1352378, 2739652, 4313221, 4697621, 4451197, -91268, -3129958, 2443300, 3908420, 2449742, -3889630, 1367410, -474594, 1657857, 475668, 798864, -1295470, -2753611, 3116536, 3569655, --1286880, -1051193, -899259, -620623, 14702747, 23036058, -33592548, -4643934, 2147484, -128312, --3906810, -8283382, 9373229, -10670309, -17022030, -1620813, 16893180, -2275796, -9658845, 3234110, --13567265, -7322383, 682900, 8919573, -14226542, 1716913, 15816217, 16205985, 557809, 5816460, -14192183, -7916699, -12412992, -17430052, 1842541, -17374754, -3595425, 7482370, 7068443, -15362561, --14463302, -8763344, 6433324, -3998078, -2585034, -3950833, 14099304, -20620674, -5920076, 3338800, --11035382, -3745212, 184147, -12970801, 753767, 5490042, -565325, 17257716, -1013612, -6838125, -1603633, -761283, -5483600, 3396246, 8588861, -7704098, 12185359, -5841693, -22255984, 1155346, --8594230, -4697084, -471373, -2296734, -29407642, -4862977, 13703093, 11800960, 8338679, 17743046, -18127984, -24224690, -2578054, 1665374, 5210332, -6971269, -11958263, -130997, 5646809, 6578816, -5696737, 4415227, 2215130, 3579318, -6342056, 130460, 4034585, -1952600, -1353452, 816044, -1410897, 3595425, -3727495, 805843, -1422171, 1732482, 2426657, -5101885, 891743, -442382, --3425237, 1609002, -679142, 770947, 300648, 0, -4369593, 2389613, 451508, 1287953, --2867965, -2166274, -1857573, -1904818, -32270236, 8995272, -6011344, 10983305, -10332618, -125628, -16866874, -5662915, 23968602, 5493263, 4616016, -10329396, 4533338, 11861626, -7322919, -1512902, -15506443, 9966472, 11674258, 1623498, -17919678, 11370926, -11565810, -1110786, -6966974, 1744831, --8896488, 5153424, -2308008, 5020280, 4829154, 8542153, 8717173, 9615895, -11418707, 2698313, -18298708, 3866008, -3253438, -3700651, -9146670, -7436736, -6442, 638876, 3323768, 15337865, -1363115, 8444443, 8260833, -616865, -3876208, -3779034, 13997835, -16335371, -3498788, -14461692, --11832635, -3379603, 150861, -24239184, 6343667, -7650411, 14875082, -3114388, 704375, 10238128, -2164127, 24798604, 20584704, 29546690, 11258183, 1207960, -3371549, -3051574, -4922033, -1503239, --5864778, -16345035, 11112154, 13456133, 6514929, -2258079, 1586454, -11528766, -15532212, 7199976, -2011118, 2106145, -4950487, -2204929, -5376226, -3005940, 4875325, 1536525, 6365679, -463320, -1473174, -3650722, 4464082, -12984760, -3341485, -506269, -446677, -2484102, 2345052, 540092, -905701, -945430, -3081102, -685047, -1241782, -916976, 4103841, 427886, 573378, -2709588, -938987, 597000, -131533, -5820218, -4121021, -4535486, -9561671, 12636331, -3831111, -2887292, -29624536, -6236293, -6636798, 32947230, -569083, 18701898, 13780403, 999117, 7690139, -4548371, -6010270, 5626944, 3545496, 4544613, 15179488, -10644540, 18312666, -10252624, -406411, 3656091, --2580739, -13466333, -12016782, -473520, -19449222, -6305549, -21237540, -1580548, -12652974, -9521942, --6969122, -6164352, 3064996, -17133162, 19652696, 2973191, -12910135, -9699647, -696858, -2609193, --3227668, 4980015, 2624762, 19284404, 2142115, -348966, -10003516, 1506460, 3936875, -857383, --10664404, -4713727, 12097849, 13153337, -871342, -11415486, 4532264, -2353642, 17243756, 19165754, --7619272, -5125507, -3647501, 2058900, -7494181, 7668664, -24099062, -2387465, 28307056, -25747256, --12705587, -6069326, 1759326, 2134062, 3307125, -2451890, 7521025, -4674535, -1360431, 13688061, --2258079, 9883257, -6861211, 9956808, -8915278, 6777459, 5552319, 13584445, -367220, -2455648, -5711233, 8895414, 720481, -2297808, -1502702, 783295, -4989142, -1631551, 4539244, 5959267, -1835562, -2112050, 5836324, -4760435, 4780836, 3927211, 4355634, 2308545, 78920, -7345468, -7167227, 4149475, 3273839, 1457068, 3338263, 6207839, 1378148, -5111011, 2401961, -4189204, --3205656, 5116917, -1357747, 4413079, 4846334, -2053531, -3617436, -3609383, 1999307, -17324288, --9508521, -2730526, 13357348, 16112570, 11028939, -10291279, -26385058, 45602888, 11445014, -28652800, --28760712, -4323422, 6921877, 19413790, -25028386, -4428648, 4631049, -376883, -3631395, 26131118, -5572183, -15362561, 8157217, 1067299, -773094, 13754633, -2551748, 7513509, -17081622, -5781563, -29903172, 11054709, 23571854, 7445863, 21306796, 3728032, -7884486, 15007689, 13637058, 21441014, -10515691, -24218246, -9227737, 5238250, 12472048, -9726490, 3646427, -9370545, -15705622, 1586990, --1857037, -9364102, 7237557, 10153303, 8761196, 6443525, 5990943, -4607963, 16158741, -117575, --16151225, -11679627, 14527190, 7916699, -25338696, 11013907, 4440460, 8148627, -22147536, -15085536, -14159433, 21971978, 12359305, -4910758, -23680840, 5372467, -1095217, 20178830, -6777996, -27064736, -11306501, 15836618, -6040335, 16483011, 13488882, 5617281, -10871099, 1457068, -191663, 3203509, -1137630, -692027, -5806259, -2375117, -7274601, -702227, -1475858, 3826279, -4461398, -2596308, --1529545, -3252901, -2064269, -1700807, -2062121, 8457864, 2481417, 163746, 8127152, -1963337, --7748658, -5106716, -4170950, -3259343, 316217, -5544266, 2323577, 3497714, 2852932, 2234457, --7435662, -2790118, 6181532, 5215701, -794032, 4033511, -884226, 10644003, 21030308, 7952669, -22215182, 3515431, 10053445, 7428683, 37172940, 50676320, 3726421, 9943923, -32666984, -10545755, -19346680, -16762184, 38293392, -7917236, 5817533, 10139881, 22317724, 12278775, -5640366, -16601659, --19435264, -6570226, -3417720, -24285356, -11660299, -9809168, 15160161, -9188546, 4326643, -15660525, -1785096, -6303938, -22767622, 23140746, 15946140, 18582712, 8018704, -11719892, -11389716, -26425860, -208843, -23842974, -7446400, -2252710, 2835215, 11836930, 9247601, -7907035, -5714454, 9762998, -21831318, 5692443, 8172786, 15891379, -20847234, 14323716, -11964705, -11046119, -21048024, -9347996, -9210020, 7778186, 1037235, 24025510, -5602785, -9256191, 3430068, 6099391, 33058900, -11223823, -13077639, 12917651, -32349694, -217433, 3712462, -7318625, -5018670, 10829223, -6657200, 689342, -13287555, 6766721, -20026896, -23933706, -23166516, -10958072, -8811662, 18817326, 16322486, -4811437, --7570417, 723165, 1807644, 12328167, -1723893, -4187056, 7495792, -1685238, -1608465, -3547643, -5342940, 7501161, -4417911, 7169911, 6674379, 6927782, 950798, -3264712, 6007049, -4602595, -3472481, 7829189, 278636, 4578435, 6128919, -11171210, -795106, 5105106, 5639829, 7801808, -624918, 6960532, 57982, 238371, -2790655, 3899830, 5719286, -21352430, 5792837, 32262184, --7211250, 5024575, -13913547, -3723200, -18668076, 15478525, -27014270, 1626719, -21687974, 4732517, -9777493, 3798899, -12847858, 45575508, -2837900, -5698885, 4439923, -25339234, 1809792, -16994648, -928250, 5274757, -4882304, -198642, 10970957, -9048422, 730144, 14078903, 1439351, 3863860, --21815212, 3224984, -1554778, -970126, -5292474, -27046482, -14971182, 7203197, 2554969, 12613245, --31512176, 3893925, -29309394, 15444702, -19894826, -31876710, 16661789, 30225832, 5434208, 15092515, --22017076, 22540526, -5184563, 3747359, -13393856, 18857054, 7704098, 19567872, 6288906, 23649164, --20719996, 4478577, 1443646, -3130494, -16373489, -13107703, -15375446, 18249316, -4456029, 24634322, --14731201, -11027865, 2976949, 3712462, -13151727, 7472706, -7627325, -30947386, 14090714, 21350282, -34866008, 12618077, 24805584, -13660143, 303869, -15461345, 26551488, 9400073, -4785131, -9936944, -12736189, -8442295, -2281165, 1887101, -7686381, -12830141, -8680129, -5780489, -5078799, -17258252, --7520488, -14282377, 11694659, -2247342, 7042673, 13946296, 3753802, -9509058, -747324, -9507984, --4124242, -14503031, -8138426, -15378130, -2586644, 26863410, 5563057, -1359894, 6100464, 8521752, --14957224, -6306086, -673236, -1354525, -6083285, 7350837, -2778844, -22499724, -1787780, -4619238, --16712255, -52698712, 6593312, -16765405, 48978196, -9096204, -24561844, 9909563, -1298691, -24491514, --4090420, 4184372, -14683956, 36981280, 5359583, 3625489, 16864726, -20664162, -31808528, -19602230, -45151380, -3516505, -9450539, 29828010, 16905528, -14121316, -13986024, -7882339, 35824860, 5070209, --8590471, -13901199, -6621229, -27829240, 18937048, -3192771, 7749195, 17994840, -6219650, -28831578, --3411278, 37297496, -1470489, -9244917, 18081812, -8114267, 22410066, 14665166, -1755031, -27486180, --13885092, -3739306, -25333328, -14916958, -14527727, 2026688, -3340411, 21535502, -14799920, -5164162, -82141, 55319716, 19405200, -9499931, 11383811, 6538014, -3054259, 28097676, 13859859, -10616085, -4614943, 22714472, 25872882, -15649250, -10945724, -37547676, -29917668, 17164836, -11020886, 18527416, --256087, -22081500, 5659693, -1753420, 7274064, -14698452, -10936060, 20779052, 5538897, 2743947, --1773822, -2445447, 14103599, -6644852, 7416872, -3555159, 8927626, 17441862, 4966056, -12652974, -2412698, -4882841, 9858024, 7824894, 2954938, 11333882, 18041010, -6985228, 14632417, -1424855, --18552112, -4942434, 995359, -10635413, 4663798, 13739064, 152471, -7034083, 1278827, -2636036, -18421652, 15361487, 2021856, 7238631, 9731322, 4781373, 12492986, -15475841, -10975789, 5451387, -3610994, -3342022, -839129, -2523293, -5751498, -5671505, -59665684, 20492900, -12767864, 31759672, -32293860, -18711026, 15251429, -31954556, -47979616, 1174137, -33742872, 4438312, -4220879, 26109106, --19382114, 18627810, 15987479, 26184804, -39866960, 4347044, -24399172, -22367116, 2421825, -28874528, --18619756, 26197154, -7647726, 9942312, 30600032, -6078453, 10077067, -25223270, 2901787, -27810986, -25773562, -23057532, -15301358, -17025250, 28747826, 23024246, -16502338, 31487478, 20863340, -6682969, -31263604, -1762547, -33080374, -9163313, -3900904, -25800406, 5804112, -54563264, 5469641, -13903883, --26179974, -21169894, 24373940, -14595373, 50538880, 37524592, -56516936, -16106, -1485522, 2669322, -26112864, -44410500, -30953830, 30469572, -25446608, -31831076, -36612984, 2421288, 75145824, 37306084, --34999688, -22077206, 3025268, 27300960, 10436234, -36634996, 5411659, -24497420, -14388140, -1362042, --4436701, 1343251, 24091008, 5633924, 14267881, 9411884, -28178206, 7481296, 12586402, -4059818, --10187662, 1398012, -24061480, 21279416, 7706245, 5742908, -31903018, 5207648, 16364899, 4520990, --7588671, -6077916, 14052059, -23363548, -1570347, -17464410, -9659381, 22618908, -24142012, -1140314, -14258218, -12239046, 11157251, 13484587, 3465502, 1860795, 9933186, 3079492, -12901008, 18486612, --14527190, -11521250, -6650220, -19979650, -6320581, -17973364, -17215840, 6936372, 28186260, -31224412, -15722265, -52467856, -7862475, -20404852, -17782238, 27810450, -35842040, -55927452, 32715302, 49251464, -11962558, -9517111, -44678396, 3056406, 17539572, 17523466, -7461432, -17907866, 2278480, -4409858, --5819144, 5711233, -6555194, -14999636, -29249264, 3723200, -17586818, 4376572, -15762530, -33386928, -20784958, 15277199, 25548612, 904091, 27628450, 15466714, 4189741, -8943733, -14064407, -22987202, --16363825, -9241696, 6570763, 15865609, -10587631, -5178657, -38012072, 35737884, 42378980, 23569170, --21518860, 22617298, -29403882, -441308, 6848862, -64404108, 5340255, 6442988, 30535606, -38409892, -49718540, 19549618, -35465692, -20085952, 15052250, -6129455, -25956098, -31865436, -34314640, -46848428, -34652868, -14681809, 5547487, -71670120, -28448252, 4539244, 897111, 16594680, -11325829, 3046206, -12363063, 13018583, -34179348, -7727183, 5688148, 19157164, 13906567, -2807298, -13063680, -5470178, --2743947, 17903572, 3129958, -10949482, -1216550, -8471286, -3234647, 16576963, 7633768, -7954280, -17629230, -17282948, -10117332, -12849468, 17044578, -6559489, 2147484, -7610682, 7517804, -24097988, -3720516, 10353019, 3958349, -4052839, -10492068, -8917963, -12298639, 12526809, 2765422, -3882114, --14103599, 14939507, 927176, 1306744, 2188823, -24512452, -12061879, -15955804, 2180770, -7946763, -185757, -305480, -5672041, -13698261, -4964446, -48968532, -6461779, 17964238, -22956600, -21367462, -20340428, 20637318, 4254165, -19288162, -66320200, -9660455, 13062069, 8020852, 28865938, -525597, -16806744, -4223027, -358093, -8247948, 1300301, 17693118, 2083596, 835371, 17126718, -4440460, --4077535, -22327388, -2033130, -3488050, -2481417, 3986267, 13652090, 18741090, -3633006, 134218, -14622216, -3173981, -28127204, -1800128, -24974162, 3774740, 3404299, -32613298, 23746874, -44986024, -10093173, 12565464, -19809462, -1245004, 58496916, -16416976, 19724638, -12202002, 10418517, -43676060, -4681515, 25816512, -739271, 22301618, -5212480, 2472291, -1493575, 28464896, -18279380, -21698712, -25027848, -23018340, -28726352, -190589, -45835356, 30701500, 25271050, -8977019, 9685151, 4409321, --392453, -38765300, -6542309, -2784750, 17029546, 6638946, -16574816, 15669651, -1271847, -19637664, --13624173, -12128988, 2462090, 2908767, -2892661, -227096, 12251394, -12068321, -3743601, 8808978, --13330505, -6842957, 9867150, -13207561, 647466, 12184822, 499827, -3078418, 4922033, -181462, -910533, 10698764, -4084514, -2860985, -8252780, 3790309, -5334350, -4467303, 4236449, 6054830, --11534135, 2179159, -10808285, 10498511, -12272332, 7036767, -476741, -1708860, 779000, -2166274, --1817845, -19864, 7777112, -23987930, -73078328, -34213708, -11205570, 24230594, 54320600, -49236432, -11104638, -14062260, -49634252, -6721624, 45150844, 12339441, 37249176, -30925376, 9575630, -10531797, -2485176, 22080964, 3997541, 12121471, -6751152, -63351840, 19178640, 3396782, -26688926, 28000502, -21489868, -18956376, 19893214, 2624225, -20390358, 6627135, -12470438, 40068824, 5220533, 16392816, -1110786, -40548788, -32353988, -10740639, -23882702, 26847840, 38522636, 39523364, 31940598, -10652593, -4764193, -31805844, -4480188, -2950643, -13143674, -16631187, 3091840, 3376381, -43731892, -12639552, --16874926, -937377, 20117090, -21425444, -4640712, 7899519, 414464, 22970558, -24782498, -756451, --28121836, -14709189, -20691542, 11868605, 7949985, 22938884, -2694555, -2100239, -26480084, -7798050, --12378633, -3128347, 11713986, 15781857, 32285806, -20228760, 6183679, -17497160, 6742562, 12199318, -3706557, -9525164, -3624953, -3194382, -3624416, -1213865, 8793946, 9095130, -2153389, -814970, --3900367, -6059125, 4465692, 9046812, 3358128, 1204738, 2756295, -7220914, -8301098, -7890392, -13771813, -163746, 9642202, 7866770, -909996, -10231686, -10834055, 1880659, 3506841, -8456791, --2400350, -7334731, 5953362, -5258651, 2281702, 1792612, 6211597, -2743410, -3054259, 1633698, -2497524, -4263829, 7110319, -2177549, 19105626, -30830348, -121703264, -64164664, 13172665, 51219632, -114591872, 87570624, 49325016, 16630650, 25727928, -8135205, -48189532, -93174480, -123993024, -31337156, --35940824, 1897839, 60385092, 86178520, 57752816, 77220288, 17756468, 16400333, -9041980, -39003136, --44241384, -35714264, -38022272, -46937552, -37701760, -16054588, -2447058, -521839, 30089468, 39140572, -74691088, 35370668, 11591043, 30744986, 47650516, 15270219, 9059160, -38408280, -52714280, -86009944, --39831528, -45074072, -32727650, -19371914, -15324443, 6454799, 10546292, 36277440, 74050072, 59708100, -65000036, 48262548, 58961848, 44014824, -35582192, -32464048, -82111720, -63447404, -46581604, -104387032, --80897320, -49344880, 3835406, 63433444, 60270740, 71427992, 89089968, 76366128, 40976672, 49604724, -1864016, -19270982, -52425980, -75872744, -76413912, -62860068, -37953016, -8052527, 10757819, 18524730, -21046950, 35385160, 25367150, 41372884, 25989920, 10437844, 6619082, -1466731, -4181688, -868120, --28667296, -19815906, -4160213, -13150653, -34224984, -9456444, -12373801, -12564390, -2500208, 25604984, -48035452, 40076876, 4064113, 39395588, 27524298, -5022965, -32482838, -51059644, -47750908, -21428128, --23732916, -14615237, -8351027, 13702556, 29678224, 41531796, 46878496, 34027416, 13070122, 14641544, --9213779, -25589952, -43557948, -38709468, -17411798, -1605244, -12922483, -4015258, 12237972, 15978889, -16116865, 15695421, 3747896, 6608344, 9700184, -1612223, -9331890, 394600, 2905009, -6543383, --7796440, -976031, 2539936, 2194728, -5126044, -2423972, 1670205, 823023, -4494684, -7101192, --5733245, 2141578, 367220, -326418, 4235375, 7963406, 5893769, 6070937, 4129611, 3320010, --449898, -2192581, -3786014, -5168993, -4513474, -1536525, -3647501, -3114925, -2700998, 2882460, -3309809, -974421, -1578937, 3125663, 1773285, -330176, -514322, -775778, -2226404, 1753957, -2387465, 1235340, 2127620, 4174708, 4228396, 3777961, 288300, -1224603, -2450816, -3696893, --7072201, -8356933, -7110319, -4737349, -3775276, -171799, 3756486, 6982543, 8635569, 9871445, -8543227, 6291054, 2726767, -198105, -3752728, -6447820, -7882339, -7201050, -7425462, -5027259, --2384244, -386547, 1818382, 4675072, 4961224, 4671851, 4155381, 3485903, 1632088, 64425, --1084479, -1148904, -1413044, -1456531, -1502702, -1081258, -809601, -424665, -227096, -66035, --11811, 140660, 194884, 243739, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-7080791, -5145908, 2013266, -771484, -12128451, -6881612, -520765, 1748589, -3726958, 1291711, +-4499515, 894427, -3251290, 8531416, -6935299, -3031710, -3047816, 5442798, 3751654, 8687645, +2291365, 1818919, -3963718, 4108673, 522912, 1126355, -483184, 3301219, 4501663, 353798, +4486094, 4277788, -2073396, 2400887, -2535105, -2803540, 314069, -2287607, 1440425, -3599183, +-6558952, 1788854, 2335925, -1606318, 1818919, -3109020, 2945811, 4042101, -6930467, 1373853, +-389768, 2627446, 2218351, 386547, -6842420, -2026151, -3012920, 2290291, -91268, 711354, +-2204929, 1290638, -3517578, 193810, 3790309, 2453500, 243739, -1918240, 1243930, -5563057, +-3154117, -4079145, 727460, 734439, -366683, 5935645, 10201, 5178120, 55298, 576599, +460635, 13959, -2810519, 2124935, -191126, 1069447, -620623, 702227, 952946, -343061, +-998580, -342524, -319438, -257698, -189515, -1458141, 229781, 1588601, 863825, 59593, +143345, -377957, -710817, 699006, -464393, -14031121, -466004, 717796, 178241, 2277943, +-4967130, 3607773, 2017024, -2619393, -8371428, 5466957, 5609764, -1351304, 4663798, 3358128, +-4650913, 9170292, 1892470, -4188667, 4919348, 329102, 4595078, 651761, -8034273, 3017215, +-1542967, -2992519, -3134789, -2459943, 5220533, 4037806, 304943, 4225711, 1515587, -4049081, +-5002027, -482647, -1187559, 2113124, 1431835, -3943854, 911070, 2009508, 1902671, -3471407, +-2909840, -4590783, -1624035, -1167694, 892279, -1147293, 6099928, 2590402, -970663, -3133179, +1125818, 2517388, 1298691, 6560563, -1120450, 3288871, -412854, -2199560, -4025995, 2791729, +-928250, -1889786, 3845070, -1226213, 1266479, -897111, -821413, -4482872, 956167, -1295470, +5210332, 6439230, -3916473, -3997004, -2804077, 1054415, -2518462, -1311576, -1632088, -1646583, +-1760400, 999117, 2393371, -194347, 604517, 681289, -272194, 38118, -1161252, -2619393, +-4123706, -9509594, -5674189, -2056216, 6857452, 892816, 1293859, 4199405, 1147293, 1814087, +-9963250, -9154723, -5822365, -1526324, -19327, 4230543, -2978560, 3310883, -1694902, -6156299, +1940788, -900333, -4201015, -66572, 5930813, 8600672, 3916473, -3937411, 2326262, 275415, +6216965, -27917, -4916127, -168577, -2861522, 6096169, 2685428, 2859375, 6189585, -1066226, +471910, 8281771, 7257958, -271120, -12348, 570157, -436476, 2204929, 628676, -6031745, +-7989176, -2824478, -994822, 28991, -2632815, -8923868, -926639, 2477659, -4840965, -2368138, +-3145527, -2701535, 968515, 1148904, 2967823, -6218576, -4957466, 4803384, -2008434, -1082869, +1012539, -366683, 3151432, -5988795, 2397129, 2225867, -2358474, -2280091, 2415382, -2614561, +3837553, -1495186, 58519, 3221, -1480690, 760209, 2842732, 1571958, 341987, 1717450, +507880, -777389, -1515587, -840740, -864362, 353798, 454193, -253940, -202937, 424665, +-115427, 12823162, -4811437, -3796214, -540629, 295816, -4685810, 120259, -3253975, 6206765, +-1418950, -7504382, -10476499, -2635499, -6912213, 9820980, 874026, 6990596, 5909338, -9166534, +-436476, 3952981, 2889439, 4986457, 998580, -521302, -753767, 2377265, -2977486, 3601330, +2035278, -3224447, 2126009, 221728, 2468533, 5370320, -2774012, 2175938, -250182, 3098282, +2694555, -1014686, 3680787, -948114, 3214246, -2318209, 2939368, -7416872, -3090766, -2665564, +2197413, 6541235, -4662187, -3075197, -1661616, 461172, -2079301, -2801929, -1424855, 2687039, +2219424, 3809636, -1146219, 2198487, -2108292, -2259690, -120259, -1332514, 2689187, 28991, +-3811784, 2262911, -2183454, -3786551, -1329292, -2332167, 1794223, -2747169, -7521562, -1018981, +-3192771, -3187403, 1757179, -2042794, -4484483, -874026, 1075889, -269509, 382789, 13959, +-2775086, 150861, 1629403, -1031329, -1095754, 363998, 51540, 607738, 599685, 1552631, +546535, -1241782, 974958, -174483, -346819, -446677, -1175210, -1154809, -1200443, 2279017, +3459059, -1179505, 5185636, -7807714, 3675955, -4616553, -5103495, 7796977, 2985539, -8926553, +1074816, 182536, 2862596, -6389301, -4035122, -443992, -5142150, -9497783, -9180493, -6023692, +-9161165, 4119948, -831076, 1535988, 5176510, -8041790, 5522254, -2183991, 2660732, 1783485, +-688269, 966905, -1037235, -1052267, -5178657, -3067144, 7100118, -2443837, -5638755, -5201743, +-371515, -2270427, 2314451, -4968204, -7730405, 1324997, 7470559, -995896, 4587025, -2415919, +2568391, -3817689, 3134253, 1338419, -5235565, 8031589, 1559073, -1552094, 1997697, 7392713, +6864432, 3643206, -571231, -8009577, -1222992, -6658810, 2097018, -1378148, 1276679, 1278827, +2035815, -6046240, 97711, -354335, 3119757, 6387153, -7718056, 1146756, -2154463, -7270306, +-682900, 2246805, -601832, -84826, -555661, 2516314, 628676, -2048699, -1312649, -1459215, +-787590, -2459406, 243739, -128312, 1583232, -2985002, -1996623, -154619, -251256, -302795, +301185, -158914, 653909, -1037772, -988379, -222801, -30602, -737124, -41339, -146566, +1531156, 1341104, 144418, 100932, -1250372, -2234994, -649614, 181999, -1923609, -1172526, +-819802, -686121, -692564, -8863202, -8484171, -5458904, -9358734, -11124502, -10591926, 4708895, +5137318, -6764574, -1669669, -6110665, -10057203, 5621039, -2518462, -8715562, 3206730, -456340, +612033, 1046898, 3171297, 1132798, -159451, 2427730, 3227668, -4954245, -4738960, -1177358, +-5813775, -282394, -6206765, -10878078, -716186, 6810745, -7819525, -5977521, 4481262, -4072166, +656593, 1832877, -3954591, -3179887, -3329674, -11737609, -4991289, 2683281, -3244311, -3803194, +-7333120, 3471407, 6828461, -2287070, 10449119, -5575942, -2540473, 77846, -2338073, -8582955, +-466541, 2115272, -140660, -1713692, -7453379, -1135482, 7629473, 3888019, 2354716, 3994857, +2922725, -1857573, 14457934, -4387309, -5407364, -5182952, -6197638, 2631741, 8281234, 5657009, +774705, -1217623, -3953518, -1367410, 30065, -1825898, 499827, -2485176, 1152125, 6058052, +4011500, -2834142, -467078, -967978, 2308008, -1144609, 2499134, -2388539, -1093069, 459562, +633508, -530428, 956167, -1347546, 1706176, 142808, 1378685, 1083406, 887448, -619549, +-985158, -221191, -995896, -1271310, 15904264, 10783052, -620623, 9838696, -962610, 1341104, +1779190, -5559835, 8952322, -15569, 7881802, 7566122, -6340983, 9862319, 19327, -7715372, +-12682502, 11347304, 5414880, 11273752, -9679783, 6431177, 3402688, -10611790, -10521596, -6250251, +-3093450, 10864657, -10594074, 9147207, -1047435, -1141388, 6512244, 6180458, 8410083, 3045132, +-4840965, 4079145, 7892540, -4986457, 7888781, 12135967, 5042292, 7323456, 2920578, 1993402, +1919314, 209917, -6835978, 2359548, 506269, 386547, 5445482, -4071092, 3178813, 3651796, +-1801202, 10587094, -6442988, -3905199, -2590402, 9134322, -1856500, 7529078, 3676492, 5060545, +4445828, 804770, -13223667, -2112050, -10637560, -5764920, 13404056, 7004018, -6245956, -447750, +-7657927, -6772627, -3672734, 11220602, 825707, 3813931, 2024003, -1842004, 2137283, 3976066, +6901476, -2074469, 3962107, 2916820, 2384781, -2499671, -1729261, 1060857, -1439351, -116501, +1753420, 2559264, 909996, 1078037, 2972654, 3031710, 973884, 44560, 1336272, -705448, +2495376, 4038343, 1763084, 76236, 4301947, 469762, -2141578, 1840930, -14089640, 8873939, +8522826, 25238302, 981937, 2165737, -1275605, -3488587, -1657321, 8516920, 7778723, 6754910, +9813463, 3950833, 15501611, 4503273, -6147709, 1444720, 13512504, 5296232, 1370095, 2055679, +-6950868, -10046465, 6410239, -5018133, -9791989, -20797306, -326954, 8192650, -629750, 4803921, +-7177964, -3868692, -2677912, 1480153, -2267206, -6291590, -3026341, -16779900, -4350265, -14257681, +1208496, -7556995, 5710159, -8222178, 3111167, -7910793, -2699924, -588947, 253403, 1107565, +1603633, -10458245, 5027796, -1668058, 2318209, -5522254, 168577, 8152922, 3354370, 11308112, +6426882, -3608846, -648003, -2479807, -1137093, -2808372, -3605625, -308701, 4724464, 2904472, +3522947, 2107218, -16305843, 10653666, 10631118, -4102768, 6108517, 4605279, -8593693, 4024921, +2638721, 410706, -1784559, 1369021, 5635534, -5048734, 3309809, -1524177, 341450, -521302, +1291711, 2845953, -2433099, -1259499, 4210679, -3077881, 277025, -9664, 1644436, -2061047, +-3396246, 1981591, 212601, -1228361, -958315, 383326, -42413, 1835025, 2379949, 2426120, +123480, -2894271, 622233, 27145804, 9736154, -4624069, 13368086, -8908299, 9299678, 6161668, +-12891344, 2657511, -16197395, 253940, -5555004, -11425150, 5995775, 131533, 4571456, 6582575, +8180839, 13179644, 5457293, -1014686, -3497177, -9096741, -16327855, 5696201, 6295349, 1695438, +-5746130, 8713952, 1075352, 9211094, 5449777, -17023640, -6506339, 2214593, -12545599, 574452, +-964220, -2437931, 3604015, 2687576, -3008625, 12433393, -7290707, 428423, 6941204, -6228240, +4746476, -2756295, -7648263, 5017596, -127775, -1045288, 7135552, 4701379, 202937, -3803194, +14842333, 602906, 8322036, 781684, -4705137, -5230197, -12556337, -4889284, 5158793, -391379, +4394289, -1474248, -9795210, 3831648, 3160559, -14332306, 4096325, 7306813, -3864934, 7798050, +1797444, -8157217, -8300025, 9309342, -238371, -18798534, 2300492, 1969779, 753767, -1955284, +1069447, -2623688, 435402, 5551245, -1749662, 850940, 1377074, 1607928, -4754529, 1381369, +-1720134, 1258425, 3454228, 3645354, 2627446, 1239098, -3131031, 1367410, -302258, -321049, +1221918, -3496104, -73014, 2330557, 3216931, -2196339, -1344325, -4086125, 688269, 4213900, +-4207458, 1668595, 1467268, -28348394, -9454297, 29496762, 8142721, 4657355, -4514011, -857383, +-4609037, 5967320, -9622874, 12861816, 7327751, 5998459, 6160057, -4637491, -514859, -592169, +4089346, 8639327, -13156022, -7827041, -4249334, 9888088, 3523484, 5490579, 5901822, -1422171, +-9453223, 3019899, 664109, 18001282, 14141180, 3680250, 10722386, 534187, -5273146, 2182380, +-1563368, -2532420, 6885370, 8498130, 6969122, 17418776, 8369281, 6801618, 7603703, -7976828, +-13053479, -6140193, 5846524, -11120744, -5548561, 10710038, 11401528, 6243809, -5262409, 10103911, +-4071092, 1059246, 2357400, 5784247, -3059627, -6380174, 3555696, -5757404, -17980344, 733903, +5715528, -9804873, 1199907, -1802813, -2606508, -1829119, -5871221, 14527727, -1598265, 8287677, +-20965346, -19907174, -16905528, -7712688, 1634235, 2006824, -628139, 1114544, -435939, -4473209, +2097018, -4913443, -1520418, -2172180, 5010616, 776315, 1758789, -3950296, -809601, -3519189, +-1352378, 2739652, 4313221, 4697621, 4451197, -91268, -3129958, 2443300, 3908420, 2449742, +3889630, 1367410, -474594, 1657857, 475668, 798864, -1295470, -2753611, 3116536, 3569655, +-1286880, -1051193, -899259, -620623, 14702747, 23036058, -33592548, -4643934, 2147484, -128312, +-3906810, -8283382, 9373229, -10670309, -17022030, -1620813, 16893180, -2275796, -9658845, 3234110, +-13567265, -7322383, 682900, 8919573, -14226542, 1716913, 15816217, 16205985, 557809, 5816460, +14192183, -7916699, -12412992, -17430052, 1842541, -17374754, -3595425, 7482370, 7068443, -15362561, +-14463302, -8763344, 6433324, -3998078, -2585034, -3950833, 14099304, -20620674, -5920076, 3338800, +-11035382, -3745212, 184147, -12970801, 753767, 5490042, -565325, 17257716, -1013612, -6838125, +1603633, -761283, -5483600, 3396246, 8588861, -7704098, 12185359, -5841693, -22255984, 1155346, +-8594230, -4697084, -471373, -2296734, -29407642, -4862977, 13703093, 11800960, 8338679, 17743046, +18127984, -24224690, -2578054, 1665374, 5210332, -6971269, -11958263, -130997, 5646809, 6578816, +5696737, 4415227, 2215130, 3579318, -6342056, 130460, 4034585, -1952600, -1353452, 816044, +1410897, 3595425, -3727495, 805843, -1422171, 1732482, 2426657, -5101885, 891743, -442382, +-3425237, 1609002, -679142, 770947, 300648, 0, -4369593, 2389613, 451508, 1287953, +-2867965, -2166274, -1857573, -1904818, -32270236, 8995272, -6011344, 10983305, -10332618, -125628, +16866874, -5662915, 23968602, 5493263, 4616016, -10329396, 4533338, 11861626, -7322919, -1512902, +15506443, 9966472, 11674258, 1623498, -17919678, 11370926, -11565810, -1110786, -6966974, 1744831, +-8896488, 5153424, -2308008, 5020280, 4829154, 8542153, 8717173, 9615895, -11418707, 2698313, +18298708, 3866008, -3253438, -3700651, -9146670, -7436736, -6442, 638876, 3323768, 15337865, +1363115, 8444443, 8260833, -616865, -3876208, -3779034, 13997835, -16335371, -3498788, -14461692, +-11832635, -3379603, 150861, -24239184, 6343667, -7650411, 14875082, -3114388, 704375, 10238128, +2164127, 24798604, 20584704, 29546690, 11258183, 1207960, -3371549, -3051574, -4922033, -1503239, +-5864778, -16345035, 11112154, 13456133, 6514929, -2258079, 1586454, -11528766, -15532212, 7199976, +2011118, 2106145, -4950487, -2204929, -5376226, -3005940, 4875325, 1536525, 6365679, -463320, +1473174, -3650722, 4464082, -12984760, -3341485, -506269, -446677, -2484102, 2345052, 540092, +905701, -945430, -3081102, -685047, -1241782, -916976, 4103841, 427886, 573378, -2709588, +938987, 597000, -131533, -5820218, -4121021, -4535486, -9561671, 12636331, -3831111, -2887292, +29624536, -6236293, -6636798, 32947230, -569083, 18701898, 13780403, 999117, 7690139, -4548371, +6010270, 5626944, 3545496, 4544613, 15179488, -10644540, 18312666, -10252624, -406411, 3656091, +-2580739, -13466333, -12016782, -473520, -19449222, -6305549, -21237540, -1580548, -12652974, -9521942, +-6969122, -6164352, 3064996, -17133162, 19652696, 2973191, -12910135, -9699647, -696858, -2609193, +-3227668, 4980015, 2624762, 19284404, 2142115, -348966, -10003516, 1506460, 3936875, -857383, +-10664404, -4713727, 12097849, 13153337, -871342, -11415486, 4532264, -2353642, 17243756, 19165754, +-7619272, -5125507, -3647501, 2058900, -7494181, 7668664, -24099062, -2387465, 28307056, -25747256, +-12705587, -6069326, 1759326, 2134062, 3307125, -2451890, 7521025, -4674535, -1360431, 13688061, +-2258079, 9883257, -6861211, 9956808, -8915278, 6777459, 5552319, 13584445, -367220, -2455648, +5711233, 8895414, 720481, -2297808, -1502702, 783295, -4989142, -1631551, 4539244, 5959267, +1835562, -2112050, 5836324, -4760435, 4780836, 3927211, 4355634, 2308545, 78920, -7345468, +7167227, 4149475, 3273839, 1457068, 3338263, 6207839, 1378148, -5111011, 2401961, -4189204, +-3205656, 5116917, -1357747, 4413079, 4846334, -2053531, -3617436, -3609383, 1999307, -17324288, +-9508521, -2730526, 13357348, 16112570, 11028939, -10291279, -26385058, 45602888, 11445014, -28652800, +-28760712, -4323422, 6921877, 19413790, -25028386, -4428648, 4631049, -376883, -3631395, 26131118, +5572183, -15362561, 8157217, 1067299, -773094, 13754633, -2551748, 7513509, -17081622, -5781563, +29903172, 11054709, 23571854, 7445863, 21306796, 3728032, -7884486, 15007689, 13637058, 21441014, +10515691, -24218246, -9227737, 5238250, 12472048, -9726490, 3646427, -9370545, -15705622, 1586990, +-1857037, -9364102, 7237557, 10153303, 8761196, 6443525, 5990943, -4607963, 16158741, -117575, +-16151225, -11679627, 14527190, 7916699, -25338696, 11013907, 4440460, 8148627, -22147536, -15085536, +14159433, 21971978, 12359305, -4910758, -23680840, 5372467, -1095217, 20178830, -6777996, -27064736, +11306501, 15836618, -6040335, 16483011, 13488882, 5617281, -10871099, 1457068, -191663, 3203509, +1137630, -692027, -5806259, -2375117, -7274601, -702227, -1475858, 3826279, -4461398, -2596308, +-1529545, -3252901, -2064269, -1700807, -2062121, 8457864, 2481417, 163746, 8127152, -1963337, +-7748658, -5106716, -4170950, -3259343, 316217, -5544266, 2323577, 3497714, 2852932, 2234457, +-7435662, -2790118, 6181532, 5215701, -794032, 4033511, -884226, 10644003, 21030308, 7952669, +22215182, 3515431, 10053445, 7428683, 37172940, 50676320, 3726421, 9943923, -32666984, -10545755, +19346680, -16762184, 38293392, -7917236, 5817533, 10139881, 22317724, 12278775, -5640366, -16601659, +-19435264, -6570226, -3417720, -24285356, -11660299, -9809168, 15160161, -9188546, 4326643, -15660525, +1785096, -6303938, -22767622, 23140746, 15946140, 18582712, 8018704, -11719892, -11389716, -26425860, +208843, -23842974, -7446400, -2252710, 2835215, 11836930, 9247601, -7907035, -5714454, 9762998, +21831318, 5692443, 8172786, 15891379, -20847234, 14323716, -11964705, -11046119, -21048024, -9347996, +9210020, 7778186, 1037235, 24025510, -5602785, -9256191, 3430068, 6099391, 33058900, -11223823, +13077639, 12917651, -32349694, -217433, 3712462, -7318625, -5018670, 10829223, -6657200, 689342, +13287555, 6766721, -20026896, -23933706, -23166516, -10958072, -8811662, 18817326, 16322486, -4811437, +-7570417, 723165, 1807644, 12328167, -1723893, -4187056, 7495792, -1685238, -1608465, -3547643, +5342940, 7501161, -4417911, 7169911, 6674379, 6927782, 950798, -3264712, 6007049, -4602595, +3472481, 7829189, 278636, 4578435, 6128919, -11171210, -795106, 5105106, 5639829, 7801808, +624918, 6960532, 57982, 238371, -2790655, 3899830, 5719286, -21352430, 5792837, 32262184, +-7211250, 5024575, -13913547, -3723200, -18668076, 15478525, -27014270, 1626719, -21687974, 4732517, +9777493, 3798899, -12847858, 45575508, -2837900, -5698885, 4439923, -25339234, 1809792, -16994648, +928250, 5274757, -4882304, -198642, 10970957, -9048422, 730144, 14078903, 1439351, 3863860, +-21815212, 3224984, -1554778, -970126, -5292474, -27046482, -14971182, 7203197, 2554969, 12613245, +-31512176, 3893925, -29309394, 15444702, -19894826, -31876710, 16661789, 30225832, 5434208, 15092515, +-22017076, 22540526, -5184563, 3747359, -13393856, 18857054, 7704098, 19567872, 6288906, 23649164, +-20719996, 4478577, 1443646, -3130494, -16373489, -13107703, -15375446, 18249316, -4456029, 24634322, +-14731201, -11027865, 2976949, 3712462, -13151727, 7472706, -7627325, -30947386, 14090714, 21350282, +34866008, 12618077, 24805584, -13660143, 303869, -15461345, 26551488, 9400073, -4785131, -9936944, +12736189, -8442295, -2281165, 1887101, -7686381, -12830141, -8680129, -5780489, -5078799, -17258252, +-7520488, -14282377, 11694659, -2247342, 7042673, 13946296, 3753802, -9509058, -747324, -9507984, +-4124242, -14503031, -8138426, -15378130, -2586644, 26863410, 5563057, -1359894, 6100464, 8521752, +-14957224, -6306086, -673236, -1354525, -6083285, 7350837, -2778844, -22499724, -1787780, -4619238, +-16712255, -52698712, 6593312, -16765405, 48978196, -9096204, -24561844, 9909563, -1298691, -24491514, +-4090420, 4184372, -14683956, 36981280, 5359583, 3625489, 16864726, -20664162, -31808528, -19602230, +45151380, -3516505, -9450539, 29828010, 16905528, -14121316, -13986024, -7882339, 35824860, 5070209, +-8590471, -13901199, -6621229, -27829240, 18937048, -3192771, 7749195, 17994840, -6219650, -28831578, +-3411278, 37297496, -1470489, -9244917, 18081812, -8114267, 22410066, 14665166, -1755031, -27486180, +-13885092, -3739306, -25333328, -14916958, -14527727, 2026688, -3340411, 21535502, -14799920, -5164162, +82141, 55319716, 19405200, -9499931, 11383811, 6538014, -3054259, 28097676, 13859859, -10616085, +4614943, 22714472, 25872882, -15649250, -10945724, -37547676, -29917668, 17164836, -11020886, 18527416, +-256087, -22081500, 5659693, -1753420, 7274064, -14698452, -10936060, 20779052, 5538897, 2743947, +-1773822, -2445447, 14103599, -6644852, 7416872, -3555159, 8927626, 17441862, 4966056, -12652974, +2412698, -4882841, 9858024, 7824894, 2954938, 11333882, 18041010, -6985228, 14632417, -1424855, +-18552112, -4942434, 995359, -10635413, 4663798, 13739064, 152471, -7034083, 1278827, -2636036, +18421652, 15361487, 2021856, 7238631, 9731322, 4781373, 12492986, -15475841, -10975789, 5451387, +3610994, -3342022, -839129, -2523293, -5751498, -5671505, -59665684, 20492900, -12767864, 31759672, +32293860, -18711026, 15251429, -31954556, -47979616, 1174137, -33742872, 4438312, -4220879, 26109106, +-19382114, 18627810, 15987479, 26184804, -39866960, 4347044, -24399172, -22367116, 2421825, -28874528, +-18619756, 26197154, -7647726, 9942312, 30600032, -6078453, 10077067, -25223270, 2901787, -27810986, +25773562, -23057532, -15301358, -17025250, 28747826, 23024246, -16502338, 31487478, 20863340, -6682969, +31263604, -1762547, -33080374, -9163313, -3900904, -25800406, 5804112, -54563264, 5469641, -13903883, +-26179974, -21169894, 24373940, -14595373, 50538880, 37524592, -56516936, -16106, -1485522, 2669322, +26112864, -44410500, -30953830, 30469572, -25446608, -31831076, -36612984, 2421288, 75145824, 37306084, +-34999688, -22077206, 3025268, 27300960, 10436234, -36634996, 5411659, -24497420, -14388140, -1362042, +-4436701, 1343251, 24091008, 5633924, 14267881, 9411884, -28178206, 7481296, 12586402, -4059818, +-10187662, 1398012, -24061480, 21279416, 7706245, 5742908, -31903018, 5207648, 16364899, 4520990, +-7588671, -6077916, 14052059, -23363548, -1570347, -17464410, -9659381, 22618908, -24142012, -1140314, +14258218, -12239046, 11157251, 13484587, 3465502, 1860795, 9933186, 3079492, -12901008, 18486612, +-14527190, -11521250, -6650220, -19979650, -6320581, -17973364, -17215840, 6936372, 28186260, -31224412, +15722265, -52467856, -7862475, -20404852, -17782238, 27810450, -35842040, -55927452, 32715302, 49251464, +11962558, -9517111, -44678396, 3056406, 17539572, 17523466, -7461432, -17907866, 2278480, -4409858, +-5819144, 5711233, -6555194, -14999636, -29249264, 3723200, -17586818, 4376572, -15762530, -33386928, +20784958, 15277199, 25548612, 904091, 27628450, 15466714, 4189741, -8943733, -14064407, -22987202, +-16363825, -9241696, 6570763, 15865609, -10587631, -5178657, -38012072, 35737884, 42378980, 23569170, +-21518860, 22617298, -29403882, -441308, 6848862, -64404108, 5340255, 6442988, 30535606, -38409892, +49718540, 19549618, -35465692, -20085952, 15052250, -6129455, -25956098, -31865436, -34314640, -46848428, +34652868, -14681809, 5547487, -71670120, -28448252, 4539244, 897111, 16594680, -11325829, 3046206, +12363063, 13018583, -34179348, -7727183, 5688148, 19157164, 13906567, -2807298, -13063680, -5470178, +-2743947, 17903572, 3129958, -10949482, -1216550, -8471286, -3234647, 16576963, 7633768, -7954280, +17629230, -17282948, -10117332, -12849468, 17044578, -6559489, 2147484, -7610682, 7517804, -24097988, +3720516, 10353019, 3958349, -4052839, -10492068, -8917963, -12298639, 12526809, 2765422, -3882114, +-14103599, 14939507, 927176, 1306744, 2188823, -24512452, -12061879, -15955804, 2180770, -7946763, +185757, -305480, -5672041, -13698261, -4964446, -48968532, -6461779, 17964238, -22956600, -21367462, +20340428, 20637318, 4254165, -19288162, -66320200, -9660455, 13062069, 8020852, 28865938, -525597, +16806744, -4223027, -358093, -8247948, 1300301, 17693118, 2083596, 835371, 17126718, -4440460, +-4077535, -22327388, -2033130, -3488050, -2481417, 3986267, 13652090, 18741090, -3633006, 134218, +14622216, -3173981, -28127204, -1800128, -24974162, 3774740, 3404299, -32613298, 23746874, -44986024, +10093173, 12565464, -19809462, -1245004, 58496916, -16416976, 19724638, -12202002, 10418517, -43676060, +4681515, 25816512, -739271, 22301618, -5212480, 2472291, -1493575, 28464896, -18279380, -21698712, +25027848, -23018340, -28726352, -190589, -45835356, 30701500, 25271050, -8977019, 9685151, 4409321, +-392453, -38765300, -6542309, -2784750, 17029546, 6638946, -16574816, 15669651, -1271847, -19637664, +-13624173, -12128988, 2462090, 2908767, -2892661, -227096, 12251394, -12068321, -3743601, 8808978, +-13330505, -6842957, 9867150, -13207561, 647466, 12184822, 499827, -3078418, 4922033, -181462, +910533, 10698764, -4084514, -2860985, -8252780, 3790309, -5334350, -4467303, 4236449, 6054830, +-11534135, 2179159, -10808285, 10498511, -12272332, 7036767, -476741, -1708860, 779000, -2166274, +-1817845, -19864, 7777112, -23987930, -73078328, -34213708, -11205570, 24230594, 54320600, -49236432, +11104638, -14062260, -49634252, -6721624, 45150844, 12339441, 37249176, -30925376, 9575630, -10531797, +2485176, 22080964, 3997541, 12121471, -6751152, -63351840, 19178640, 3396782, -26688926, 28000502, +21489868, -18956376, 19893214, 2624225, -20390358, 6627135, -12470438, 40068824, 5220533, 16392816, +1110786, -40548788, -32353988, -10740639, -23882702, 26847840, 38522636, 39523364, 31940598, -10652593, +4764193, -31805844, -4480188, -2950643, -13143674, -16631187, 3091840, 3376381, -43731892, -12639552, +-16874926, -937377, 20117090, -21425444, -4640712, 7899519, 414464, 22970558, -24782498, -756451, +-28121836, -14709189, -20691542, 11868605, 7949985, 22938884, -2694555, -2100239, -26480084, -7798050, +-12378633, -3128347, 11713986, 15781857, 32285806, -20228760, 6183679, -17497160, 6742562, 12199318, +3706557, -9525164, -3624953, -3194382, -3624416, -1213865, 8793946, 9095130, -2153389, -814970, +-3900367, -6059125, 4465692, 9046812, 3358128, 1204738, 2756295, -7220914, -8301098, -7890392, +13771813, -163746, 9642202, 7866770, -909996, -10231686, -10834055, 1880659, 3506841, -8456791, +-2400350, -7334731, 5953362, -5258651, 2281702, 1792612, 6211597, -2743410, -3054259, 1633698, +2497524, -4263829, 7110319, -2177549, 19105626, -30830348, -121703264, -64164664, 13172665, 51219632, +114591872, 87570624, 49325016, 16630650, 25727928, -8135205, -48189532, -93174480, -123993024, -31337156, +-35940824, 1897839, 60385092, 86178520, 57752816, 77220288, 17756468, 16400333, -9041980, -39003136, +-44241384, -35714264, -38022272, -46937552, -37701760, -16054588, -2447058, -521839, 30089468, 39140572, +74691088, 35370668, 11591043, 30744986, 47650516, 15270219, 9059160, -38408280, -52714280, -86009944, +-39831528, -45074072, -32727650, -19371914, -15324443, 6454799, 10546292, 36277440, 74050072, 59708100, +65000036, 48262548, 58961848, 44014824, -35582192, -32464048, -82111720, -63447404, -46581604, -104387032, +-80897320, -49344880, 3835406, 63433444, 60270740, 71427992, 89089968, 76366128, 40976672, 49604724, +1864016, -19270982, -52425980, -75872744, -76413912, -62860068, -37953016, -8052527, 10757819, 18524730, +21046950, 35385160, 25367150, 41372884, 25989920, 10437844, 6619082, -1466731, -4181688, -868120, +-28667296, -19815906, -4160213, -13150653, -34224984, -9456444, -12373801, -12564390, -2500208, 25604984, +48035452, 40076876, 4064113, 39395588, 27524298, -5022965, -32482838, -51059644, -47750908, -21428128, +-23732916, -14615237, -8351027, 13702556, 29678224, 41531796, 46878496, 34027416, 13070122, 14641544, +-9213779, -25589952, -43557948, -38709468, -17411798, -1605244, -12922483, -4015258, 12237972, 15978889, +16116865, 15695421, 3747896, 6608344, 9700184, -1612223, -9331890, 394600, 2905009, -6543383, +-7796440, -976031, 2539936, 2194728, -5126044, -2423972, 1670205, 823023, -4494684, -7101192, +-5733245, 2141578, 367220, -326418, 4235375, 7963406, 5893769, 6070937, 4129611, 3320010, +-449898, -2192581, -3786014, -5168993, -4513474, -1536525, -3647501, -3114925, -2700998, 2882460, +3309809, -974421, -1578937, 3125663, 1773285, -330176, -514322, -775778, -2226404, 1753957, +2387465, 1235340, 2127620, 4174708, 4228396, 3777961, 288300, -1224603, -2450816, -3696893, +-7072201, -8356933, -7110319, -4737349, -3775276, -171799, 3756486, 6982543, 8635569, 9871445, +8543227, 6291054, 2726767, -198105, -3752728, -6447820, -7882339, -7201050, -7425462, -5027259, +-2384244, -386547, 1818382, 4675072, 4961224, 4671851, 4155381, 3485903, 1632088, 64425, +-1084479, -1148904, -1413044, -1456531, -1502702, -1081258, -809601, -424665, -227096, -66035, +-11811, 140660, 194884, 243739, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -1551020, --2209224, -4245575, 2480881, 3969624, 7040525, 1901597, -4946192, -8794482, 1906966, -4108136, -347355, 2762201, 1071594, 7117835, -5888937, -1448478, -804233, -464930, -5056250, 3114925, -1314797, 651761, 132070, -2465311, -1902671, -1784559, -581431, 250182, 1185411, -1858110, -2705830, 6375342, -208843, 2834679, -4523675, -2618856, -5413270, -2604898, 5737003, 279173, --1178432, 1025960, 6085969, 661962, 3057480, -763967, -2866354, -890669, 3470871, -2982855, -5450851, 3367791, 6146635, 3045132, 383326, -1876901, -4088809, -2254858, -3555696, -540092, --2597382, 1031329, 219043, -1386738, 893353, -1190243, 2193118, -542777, -615791, 3118146, --318364, -214748, 406411, -3003256, 1362578, -2196339, -3561602, -2038499, -1571421, 1553704, --302258, -238908, -4039417, -661962, 1041530, 801548, -1610613, 159988, -1592359, 718333, -1122060, 853088, 308701, -269509, -654446, 196495, -1256278, -663572, 264141, 196495, -542777, 549756, 488016, 121870, 1145683, -12268574, -2776160, 5037997, 885837, 6866579, -3664144, -5645198, 1493038, -118648, 2251100, -2019172, -9420474, 5443871, 3335579, 6237367, -7793218, 6711960, 2353642, 94489, -9598715, -986769, 4410395, -4374424, -3796751, -10022306, --671626, -1674500, -1158567, -2549063, 1189169, -5981816, 2731062, -1046898, 2534031, 747861, --4022237, 3107409, 2592550, 6955700, -808528, -5567888, -2876018, 3016141, 1213328, -1392106, -289910, 2221035, 289910, -4068408, -37044, 858993, -432181, 259309, -2567854, -1125281, --3419868, -703301, 4212826, 1506460, -1438277, 1800128, -546535, -216359, 639950, -4886599, --448824, -242129, 2734284, 5291937, -1564442, -533650, -3413425, -2643552, 1351841, 6021544, --5328444, -834297, 1368484, -289373, -1446867, -92879, -1410897, 1960653, 2058363, 1087701, -3346317, -1591285, -1029182, -343061, 787053, -765578, 139050, 541703, 452582, -404264, --1431835, 1040993, -1426466, 6778532, 2537789, 2284923, -2285996, 170188, 628676, 641561, --11665131, -6311455, -538482, -2907693, -3617436, -187368, -3047279, -11868605, 7058779, 1618666, -3189550, -1255204, 2423972, -3142306, 139050, 419833, 6099928, -2179696, -1298691, -1028108, --1044751, -983548, -443992, 6616397, -1293859, -105227, -3783866, -217970, -1832877, 2145873, -1077500, -6423124, 4963909, -6501507, -136365, 5688684, -828392, 205622, 421444, -139050, --3992709, -2836289, 6526740, 3773666, -8117488, -4338991, 1268626, -4766877, -3466576, 3460670, --5846524, 1125281, 1398549, 3326989, 6950868, 5331128, 3251827, 2487323, -4760971, -4956393, --4252018, 1368484, 6045704, 2334315, -1054951, -2715493, 1971390, -2297271, -1014149, 1402844, --2263448, -3414499, -475131, 2721399, -512175, -2333778, 292058, 13422, 2642479, 1098975, -2440078, 550293, -1144609, -1165010, -942745, -492311, -328028, 780073, 1526324, 1826972, -1912871, 8913131, -2177012, -2272575, -2666101, 2516851, -2983392, 4360466, -8446053, -1078574, -6272800, 3285650, -6351183, 4706211, 7723425, 7289097, 4649839, 894964, -285615, -4760971, --6140193, 2609730, -586800, 6161668, -479426, 3686156, -3834332, -2550674, -2055679, 613107, -1966021, -346282, -7499550, 1585380, 2602750, 1890323, 3238405, 1987496, -4068408, -10023917, --3224984, 1470489, 1937030, 474057, -426812, 1904281, -4110284, -65498, -7467338, 3492882, --7704635, -2030983, -3265249, -5070746, 3703873, 1637456, 1571958, -4427575, -2151242, -1302449, --4439386, 420907, -374736, 2374580, -1901597, -3739306, -2852395, -8871792, 2820720, 1028645, -3813394, 5620502, 7179575, 2801929, -2826089, -4226785, -1993402, 3900367, 3892314, -4405026, -4806606, 204548, -3122978, 6928319, -1342177, 1562831, 1176821, 2032593, -122407, -1547799, -450435, 2153389, 774168, -340376, 2333241, -1221381, -955630, -1692217, 800475, 210453, --864899, 1275068, -1236414, -2229625, -935229, 1690070, -406948, -388695, 608812, 4382478, -4043712, -784368, 2841121, -8684961, 946503, -4186519, 385473, 1208496, -5479842, 1901597, -15779173, 1657321, -1464584, -8994735, 12690555, -103616, 5293547, 558883, -329102, -7007776, -6670084, 1652489, -3782793, 804233, 448287, -2843805, 2661269, 7019051, -2125472, 7468412, --2294050, 3150359, -179852, 4897874, 4361540, 4876936, -4832, -2778844, 3823058, -2924336, -3360812, -1057636, 3388729, 3272765, 3153580, -497679, -1046361, 1207423, -2847027, -4112431, --10363219, 6653441, -6721087, 4578435, 537408, 1880659, -1259499, -12372727, -2719251, -3400540, --6045167, 731755, 3668439, -7977902, -2554969, 3480534, 600759, 5501853, 9692131, -349503, --2695629, -2414845, -10190347, 3025268, 1904281, -2348810, 476205, 3940633, 4072166, 1111860, -997506, 2829310, 280784, -530965, 4292283, 2477123, -2443837, 4363687, 3198140, 4282083, -1287953, -827855, 261456, -368830, -345745, -1697586, 519691, -1064078, 962073, -1322850, -1985886, 647466, 146566, 1603097, 100932, -595927, 427886, -448287, -193810, -663572, -1979980, 1158031, 369367, 1362578, -502511, 2218351, 257161, 654446, -275952, 549756, --376883, -1408749, 541166, -4469451, -5405217, -499827, 2949032, -1711545, -2596308, -3929895, -1180579, 7228430, 3253438, 1162326, -16343961, -7483444, -2257542, 3378529, -1930588, 5567888, -18703508, 5841156, -6836514, 1097901, -8092792, -2597918, 5709622, -6429029, -1619203, 8366597, -2032593, -2051921, 1205812, 4748087, -2814277, 2321430, 2496987, 2484102, -4617090, 2157147, --2152316, -2610803, -6832219, -2626909, -3987877, -7589207, 3352759, 305480, -505196, 7746511, -5638755, 2019172, 6197101, 82678, -7824357, 6643778, -738198, -5319317, -4224101, -7743826, -361314, 9432285, 646929, -4081830, 3992709, -6937446, -4371203, 3668976, -5652177, -7473243, --3951370, -2318209, 4242891, -6594923, -2055142, -3039226, 8548059, 1290638, -2970507, 4253628, --2572686, -3058554, 477278, 6833293, -1282048, 511638, 3738232, 2209761, -8657580, -264677, -5260261, 2574296, 3058017, -636729, -1695438, 3947075, -2332704, 738734, -1917703, 1176821, -1433982, 2077154, -4407174, 99321, 428423, 1177895, 237834, 122943, 2018635, -307627, --425202, -1855426, 1471026, 2113661, 5730560, 4150012, -10581189, 10111964, -3759170, 966905, --4605816, 8666170, -1188632, -5775121, -18924162, -2491081, 9874130, 2475512, -14746770, 6777459, -23622, -2987687, -4706748, -3801583, -1427003, -8752070, -1450625, 7147900, 9287330, 11054172, -6718403, 10084046, -3258807, 7952132, 3843996, -15571941, -337155, 4105452, 5575942, 2746632, --5353140, 348966, -1094143, 5552856, -9329743, -3322694, 6986301, -2254321, 3940633, 2097018, --6206228, -6881612, -3548180, -10333154, -2926483, -3143916, 4287451, 1588601, -5976447, -1336272, --12793097, -3188476, 5259725, -3703873, -12642236, -147103, 7219303, -15326591, 4481799, 2599529, -4908611, -7245610, -3365107, -6884296, 558883, -2039036, -7825431, -2024003, -1298154, 4760435, -2683818, 11532524, 750009, 161598, 1852205, -832150, -5804649, 7304129, 2551211, -2952790, -6383932, 1192390, -3147137, 1086627, -182536, 3908420, 903554, 796180, 2426657, -2028298, -102005, -2181307, 8590, -1731409, 1784022, -688269, 779537, 2204392, 320512, -1347009, -2028835, 534723, 2157684, 608812, -612033, 812823, 209917, 2910914, -11826729, 2573222, -9378598, 12101607, 9004399, 9200357, 3519726, -6466610, 6425271, 11181410, -16678432, 8288750, -8281234, -17857400, -4728222, 4328254, 19149112, -1545115, -1278827, -4622996, -5439039, 23715198, -11723113, 3258807, 2913062, 12278775, -284542, -1920924, -4667556, 1796907, -10748693, -9694278, --2264522, 2942590, 7088844, 3200288, 1560684, -3686156, 628676, -7891466, 3201898, -11674258, -11330661, -1319629, -5741298, -6730214, -7694434, -11776800, 1963337, -11400991, -3884798, 7751879, --1876901, -3933653, -3805341, -1861332, -9780714, -6792491, -4445828, -4182761, -2286533, 3528853, -1924145, 549219, 448287, -8625368, 14706505, 8451959, 134755, -1128503, 19363860, -2384244, --3431679, -4811437, -9924596, -2738042, 6422587, 6209986, -1037772, 7565585, -15194521, 4432943, --5844914, 1410897, 5738077, -2063732, -215822, 910533, 412317, 1831267, -2462090, 2781528, -3535832, -3437585, 1315871, 1873143, 2273648, 6144488, -4736275, -457951, 562641, -148713, -1352915, 652835, 1415192, 1914482, -1784559, 1219234, -625455, 118112, -3411815, -747324, --882079, 2786360, -2900714, 21989696, 7572564, 4727686, 10721312, -11898133, -7123740, 6956774, -7391102, 16348256, 2444373, 4629975, -10849087, -527744, 5491653, -14244796, -4536559, 5866389, --4705674, 297427, 4014721, 10730976, -3515968, 4265440, 2255932, 2452426, 9143985, 8011188, -9738838, -7488276, -5009543, 10582263, -13202729, -4294431, -4330401, -775242, -3524558, -8371428, -8326868, -181999, -9091372, 547071, -3544959, -9428527, -11825656, -6499896, -7066295, 14161581, --4416300, -3463354, -8266739, -578747, -4180614, 2284923, 16624745, -2993592, -5363878, 2931315, --927713, 9669045, -11038603, 18884972, 3818763, -17955648, -13079249, 4873714, -12106439, 308701, --12966506, 169651, 2837363, -1556389, 14117558, 17738214, -8330089, 2247342, -3404835, -12934831, --4821101, -6994891, -8460012, -1848447, 6457484, -4318053, -9980430, 6751152, 484794, -5324149, --4542465, 2299955, 3770981, -1506997, -1003949, -5005785, 324270, -4613332, -902480, -2253247, -3341485, 3835406, 936303, -4578435, 544387, 417149, 3073586, 47782, -1119913, 368830, --5848672, -532039, -3280818, -2242510, 498216, 1444720, -3055869, 2522757, -1762547, -1569274, -4039417, -1480153, -3863860, -19381576, 7057168, 39479876, -7059316, -652298, -17563196, -7504382, -11592654, -1912871, 22565222, 13470091, 12440910, -112206, 9558450, -18823768, 16758962, 8580808, -619012, 2013266, -10980084, 4489315, -342524, 17069810, 9454834, 11305428, -4367445, 916439, -2823941, -11810086, -9542344, -4472135, 5121212, 19939922, -5765994, -7011534, -7039452, -4049081, -2440615, -13023415, -3898220, -1059783, -7035157, -13775571, -3043521, -17418776, -6432788, 9909563, --12140262, -5442798, -2533494, 749472, -19563040, -11904576, -2703145, -2240362, -3875134, 12014634, -5204964, 599685, 7204808, 12381854, -7923678, -3423626, -10743861, 4603131, -8485245, 6874095, -7968238, 9565429, 17602924, 4828080, -13542032, -2386928, 29615410, 9492951, 16579648, 7865696, -4922570, -1360431, 1874216, -7257958, -9168681, 3854733, 2809446, -9156870, 2221035, 6039798, -5494874, -8803072, 6566468, 2078764, 4688494, 5411659, -198105, 2502355, 4527970, 1714229, -5343476, -770410, 1031329, -1949915, -3875671, 583579, 4645544, 496606, -2249489, 7523709, -4786741, 3994320, 15569, -1159641, -1427540, -426812, 108985, -1488206, 2564632, 1894081, -1986959, 2124398, 1037235, -4359392, 20432770, 22394496, -22674742, 5512054, 16582869, 9996536, --6342593, -12089259, -10448045, 23333484, 1894081, 8750996, 12240120, -7028714, 3441343, 5084168, --14323716, -15254650, 12343736, 4149475, -22149146, -5163625, 28765544, 13741748, -65498, -16474421, -5379447, 4256850, 17494476, 5721434, -8534637, 11388106, 2026688, -4887136, -1661616, -3532611, --13647259, -6524592, 2097555, 2283312, -16287053, -17663054, -10399726, -5123359, -19339164, 11423539, --1195075, -13824426, 2638184, 246961, -5943698, -1746441, 4176319, -193274, 4398047, 4991289, -7824894, -7737384, -9050033, 11909944, 24358370, 10925323, 6678674, 17652852, -3291556, 9576703, -23684598, 14364518, 2270427, 2544768, -7347079, -14569603, 14115947, -13885092, 6246493, -5623186, -4357245, -18149994, 8714489, -341450, -5839008, -3512210, 10323491, -9840844, -4828080, -2633889, -1633698, -353798, 3112778, -3979824, -406948, -7070590, -1676111, -533113, 1366873, -2211908, -2498597, -2738042, 2183454, -2467996, 7970923, 2323041, -1914482, -3797288, 3091840, 186831, -2850248, 2326262, -1755031, 2078227, 3027952, -2091112, 897648, 3424163, -937914, 1110786, -4086662, 3981435, 7350300, -4584878, -21204254, 5995238, -10207527, -4686346, -7884486, -1298154, -18207440, 18042620, -36399848, 11308112, 11586211, -11278047, -18508088, -24123220, 4284767, -7059853, -4494147, -8393977, -6614787, -3883187, 22566296, 5750961, -1946694, -347355, -3576634, -6698539, -5717139, 3792993, -93416, 9088151, 1977296, -1865090, 3231963, 8254391, 23279260, 2385318, -2871723, -11453604, -4917738, -5397700, -5786395, -657667, -1936493, 7756174, 11133092, 576599, -12859669, -2938831, -2178085, -2586107, -1438277, -22506702, 25433722, 707596, 1794223, -1819456, --6623377, 6805913, -1755568, 10383083, 572304, -9820980, 2659122, 11007464, -7805566, 10228465, -2455648, -15496242, -2675765, -3265786, -28316182, -9598715, 7212324, 7374996, -11586211, -6580964, -6728603, 1009317, 18884434, -14996952, 6834904, 8516383, -1254667, 7459285, 6824703, 8446590, -3188476, 3804804, 3347927, 2855080, -1297617, -1460289, -4924717, 2032593, 7024956, 1344862, --5230197, -1929514, -2976412, 1765232, -2320893, -1830730, -3505230, 4670240, 2542084, 3216394, -278099, -8137890, 3230352, -8270497, 580357, 1438814, 2888903, -3867618, -1982664, -1136556, -2640331, 5118528, 2193655, 2221572, 628139, 2327872, -5692979, 18739480, 5530308, 5904507, --13409962, 10324028, -5258651, 9846213, -7410966, 12643847, -11165304, -9066676, 17302276, 2316598, -4554276, -10019622, -22647900, -2005213, 6841346, 1951526, 9963787, -7974144, 1437203, 63888, --16869020, -12108587, 5811628, -19071802, -12439836, 6311455, 251792, -19950124, -2707440, -9854802, -12996034, 7865159, 2484639, -4520990, -12435541, -26617522, 9617506, -11829951, 14832133, -4254702, --4731444, -2312840, -6940131, 4247723, 4007205, -21242908, -9284646, 21250424, 18601504, -18868866, -24904904, 1451162, 18381924, -4193499, -4209068, -2123861, -7027640, 9641128, -6924024, -19801410, --10449119, 23913842, -5157182, -4595078, -1169842, 7532836, 4866198, 12173011, -27117350, 8230768, -18721226, 14817637, -5826123, -1342714, -5733782, -12158516, 1538672, 11523934, 17736604, -10613938, --10805601, -12196097, -1123134, -1828046, 1287953, -5746130, 3211025, 3297998, -1967632, -667867, --2529199, -5208185, 5406290, 321049, 924492, -8008504, -6798933, -1631551, -8854075, -3278671, --4383014, 1220845, -3070902, 231928, 7025493, -2578054, 2994666, 128849, -6338298, 1490354, --3143916, -610422, 2883534, 6293738, 963683, 2776160, 5769752, 5867999, 7573638, -2131378, --1929514, -1114544, 7761006, -941672, -12277164, -450972, -9428527, 12812961, 9947681, -9658308, --16456704, -13810467, -8101382, -16007343, -875636, 7579544, 17592722, -3042448, -820876, -29420526, -17640504, 21940304, -3459059, -11936251, -12102144, -7519414, 33051920, -20122996, -47782, -2384781, -8939438, -1492501, 38075960, 913754, -20683488, -5467494, -19654308, 25670482, 22363358, -18045842, -21039434, 5243618, 16943110, 6305549, -31735514, 9940702, 17024714, -22026202, -6075231, -24990804, --12446278, 838592, -22968948, -19652160, -529892, -15928960, -192737, 5560372, -5661304, -15802795, -12981002, 11707007, -25934624, -19881940, 10887742, 4544076, 7010461, 13128641, 17234630, -6367289, --9302362, -573915, -6017249, -369367, -1894618, -8753680, 3493956, -36092220, 12319577, 17489644, --18558016, -15367930, 11665131, -11780022, -10595684, -5119601, 6545530, 869194, 22411140, 122943, -13111461, -1335198, -9070434, 4802847, 6791417, 6949257, -5835787, 98784, 769873, -877247, --3728569, -8982387, 5942624, 9339943, -4763119, -15769509, 4054986, 1290101, 16703128, -1662152, --6453189, 5077188, 1911797, 8253854, 51003, -5149666, 184684, 6715182, 5122822, 1617055, --1726040, 1204738, -3033321, -2687039, -7753490, 3836480, 3807489, -5433134, 2650532, 2270427, -1500554, -996969, -2564632, 588411, -7430831, -5622649, 158914, 7973607, 19931332, 37561636, -59353764, 1653562, -24172612, -31091806, -7395934, 1087701, -7523172, 28744606, 21522618, 14840723, -24967182, 18128520, 14630806, 850404, 11760694, -15610596, 21607444, 25007448, 1564442, 26023206, --10919417, 2002529, 5927592, -24555938, -16553878, -5931350, -14661408, -17253958, -2675765, 26752278, --503048, -5328981, 3213173, 5609764, -3781719, -36601176, -5131949, 9403294, -5515812, -11306501, -4366371, 13970992, 24903830, 6045704, 12631499, 17591650, 21698712, -30274150, -21038360, 11732777, --8891119, 38230576, -4106526, 32855962, -26715234, 15612743, 26762478, 903017, 4260071, 16011101, --29186988, -13626857, 657667, 16497506, 372052, 19007914, 7660611, 7080791, 19391778, 6930467, --2670933, -8308078, -23105850, -5428302, 1256278, 6011881, 386010, 410706, 439697, -12644921, -6459631, 4292820, 10808822, -3833795, 8116415, 13290239, 7885560, 3300146, -104153, -1683090, -2764348, -4712116, 2685428, -4506495, 83215, 2674154, 2676838, -3993246, 5961952, 5743445, -7267622, 741419, 541166, 2982318, -2659659, 4908611, -3752728, 4959614, 11518565, -1476932, --2245731, 813359, 10018011, -6248104, 2342905, -1271310, -1510218, -1976759, 1362578, 2702608, -4507568, 3368328, 3439195, 9243306, -6562173, 10981695, -5387500, -12763032, 3711926, 42625404, -14179298, 14972256, 31066036, -2276333, 6567542, 13543642, 19942606, -22196928, -17850420, -7551090, --19581830, -3397856, -26301306, 13538274, 20915954, 15353971, 20766704, -13981192, -7845295, 16142098, -12436615, -8734353, 21047488, 12753369, -4927401, -25759604, 14277008, 15785615, -13214541, -1887101, -7454453, 3794067, -20914880, 24075976, 6323803, 25843356, 13970992, 10177999, -14094472, 12104828, --7534447, 39359080, -31040802, 3480534, 11754252, -5782637, -20079508, 12848395, 12404402, -2355253, -12200391, -11871826, 31915902, -14737107, 8330626, 7073275, -20447266, -8710731, -28193240, 12053289, -8101382, -20770462, 19375134, 16795470, -14579803, 12081743, -1686312, 32614372, 10484015, -16128139, --12051141, -11507828, 10093710, -6649683, 8581882, -4021700, 1777043, 11011222, 6727530, 5560909, --10845329, 28065464, 2942590, -10704132, -16038482, 13627931, 6558415, 12872017, -7442642, 3861713, -9951439, 21209622, 5193689, -3346317, 17380122, -4612795, -5263483, -2361158, 1540283, 4864051, --10674604, -9077413, 3803194, -7829726, -5042292, 1119913, -4022237, -981937, -1559610, -7679402, -5233955, 3256659, -15313706, 3751117, -11507291, -6907918, -3819837, 5657546, 2725157, 10512469, -4315369, -196495, 2705830, 3938485, 4185983, 517007, 993748, 2505577, 8582955, -2763812, --1557463, -38234872, 16403017, -32672890, 32918240, 39659192, -2594697, 6596533, -33058900, -702227, --7750269, 2931315, 18468896, 19010062, -6226629, 9679246, 15267535, 2126546, 6126234, 4182761, -6038724, -4482335, 22473416, -3557307, 4725538, -13154411, 25350508, 5261872, -2913599, -1177895, -22767622, 8589398, 10493679, 25400974, -6214281, -16189342, 31088048, -33844344, -14968498, -6102075, -6967511, 21938156, 4698694, -9392020, -9846213, -16461536, -796180, -3204046, 5998459, 35372812, -34161096, 21764210, 30779884, -3063386, 46573016, -15915001, 12680891, -11349988, 694174, 14617921, --7655779, 1583232, -14524506, -18349174, -96637, -11570642, 9206799, -15662135, 22817550, -17566954, --28535226, -11729019, -7627325, -2623688, 33441690, -20509006, -5126581, -2948495, -21667036, -5413807, -11956652, 26572426, -2769717, -1187022, 601295, -8745627, -18697066, 732292, -1233729, -2782065, --2340757, 12348, -11000485, 8515846, -9488120, 10525354, -4626754, -8011188, -9298604, 2222646, -7877507, -5821292, -8044474, -2603287, 6437619, 7745437, -6033892, 3690988, 4121021, 2835215, -4100083, -4271882, -4471598, 2270427, -64961, 4964446, -6481106, 4392141, 7141994, -176631, --3070365, -3782256, 6168110, -13471165, -7017440, 13700946, -8749385, -733903, -2748242, 2847563, --9000104, 6330782, -3299609, 12369506, 10722923, 167504, -13350369, 58546308, 81283864, 24924232, -63361504, -13878650, -44084080, -30889404, -21603148, 10691247, 11642583, -14693620, -23684060, 20514374, -27575838, 16120623, 27511950, 21232708, 5229660, 8450348, 4146254, -1373853, -18122078, 7998303, --21472688, 15131170, 125091, -20076824, 23271744, 14095009, 11125039, 40230420, 24704116, -11519102, --7779797, -14462765, -17176112, -20997558, -8309151, 848256, -16638166, -5138929, 34727496, 52724480, -38807176, 5339718, 26480620, 28291486, 43193412, 19819664, -22915262, -37562172, -23464480, -23952496, -14181982, 11966853, -51412368, -35205848, -9089225, 21720724, 46760920, -34976604, -1396401, -30346628, --3958349, 38296076, -21052320, 14473503, -30534534, -4909148, -9126806, 25859462, -28618440, -16229071, -464393, 11469173, -23230942, 53437448, -12562779, -743029, 30337502, -13231184, 22810034, -7170985, --18832894, -14536854, 8868034, 983548, 7563975, 4845797, -16807818, 582505, -7090454, 20557324, -11971684, 3735548, 11176579, 12865575, 721555, -24696, -4030827, -12599287, 26066156, -7909183, -5480379, 362388, -15075335, 766115, 1677722, -4603668, -9897752, -1988570, -5797132, 1615445, -3910031, -4244502, 919123, 17945448, 12713640, -2090575, -2809982, 17027934, -6996502, -1919850, --14156212, -20248624, -7619809, -5183489, -2153926, -5493263, -22952306, -44629544, 5543192, 24983824, --20621212, 38662220, -15307800, 15425912, -5060545, -44480828, -22752052, -2069637, -26147760, -60079076, --16802986, 21801254, 33458332, -16203301, -25689810, -53601728, -15891379, 15940771, -10604811, -15470472, --26610006, 6425271, -5956046, -4431870, -4939750, 10940355, 21640730, -16691317, 16747151, 14305462, --16884054, -48914308, 4083440, 4060892, 12731357, 6004901, 32145146, 3332358, -48633524, 417686, --53565760, -151398, 18712098, 22558778, -4073240, 3072512, 25020868, -12943958, -9411347, -16707423, -16229071, 11841225, -7635915, 19335406, -5909875, 8195335, 9050033, 31585190, 4291746, -11090142, --33620468, -11526618, 17588428, 15270219, 26866094, 39090108, 67614600, 33693480, 16339666, -17510044, --67699424, -18512382, -9690520, 51909512, -8613557, 3292629, -125628, -16296717, 2323041, 15258408, -7353521, -304943, 839129, 332323, 190052, 25189446, -8981313, -7442642, -8246337, 17484274, -6774237, 8865886, -6762426, -21398600, 7166690, 9106941, -9663140, -1404454, 5556614, -1198833, -1766842, -3775276, -30728880, -10082973, -2368675, 14174466, 22291954, 2664490, -18336826, -17974976, -8350490, 3016678, -1575179, -3030636, 1141924, -1891933, -780073, 16494822, -17983564, 2320893, --15430207, 16496969, -8908299, 369904, -22265648, -3500935, 15278272, -4699768, 8325257, -12875775, -6524592, -6766721, 10585484, -10336376, 3622268, -43694312, -13301514, 30392800, -14965814, -12551505, --3236795, -9801115, -35033512, -38947836, -56984016, -17984638, 108985, -4405026, 37298032, 10270341, -48715668, 30066382, 15082315, -6795712, -18009872, -3345780, 68314136, 4254702, 19681688, 11113228, --8591008, 34056944, -14219563, 27494234, -30023968, -2964601, -21644488, 25879326, -36455684, -7652558, -11106785, 11496017, 11663521, -31814970, 22625888, -36415952, 7368554, -17825188, -12265890, 36298916, -2103997, 2418067, 12439836, -13729937, -857383, 9517111, -44278964, 1234266, 10148471, -6391985, -28436442, -12706124, -5633387, 47974784, -18219252, -39830452, 35970, -15012521, 3156801, -2968359, --2172717, -31955094, 17033304, -5158256, -43739948, 26334592, -54157392, 10557030, -12487081, -21351356, --34275988, -4347044, 9147207, 15784542, 1290101, 12794708, 15657840, -18597746, 32824824, -7556458, -8681740, -373125, 15592879, -649077, -1914482, -5285494, 9153649, -19615652, -2693481, 6514392, -4100083, -7580081, -294205, -8492224, -11576547, 5945309, 4483409, 8745627, 5360119, -2408940, -6491843, 19669340, -9903121, -10111427, 3195456, -873489, 3603478, 14613626, -2320356, 8004209, -7148436, 7594576, -10130754, -11739219, -3202972, -861678, -12684649, -615791, -2757369, 5337034, --13855028, 4152160, -6316287, -18211736, -66019552, -67869072, -57827976, -28811714, 121719912, 38592964, --14414984, -15098421, -59186796, -126135136, -13606456, 34724812, 43202004, 18913426, -18838264, -13971529, --36706400, -40537512, 31615254, -29038810, 76972792, 57817240, -88354456, 29372744, 12336757, -18079128, -7558069, 64468532, 9785009, 44642428, 88111792, -18503256, -71200896, 3904125, -11621645, -66418984, --17630840, 32865090, -2321967, 40329208, 64939368, 6256157, -55132348, -108657304, -93103616, -83282104, --8181913, 81680080, 23767812, 22153978, 12833362, -21584358, -108793136, -67981280, -34421480, -12866648, -7345468, 25201794, 24659018, 31329638, 32268090, 39784820, -46500536, -16515223, -37956236, -2822331, --41571524, 26718454, 26898306, 54240068, 60403884, 28984050, 1585380, -15480136, -10340671, -73189464, --57916024, 51911124, 81225344, 55280524, 65054796, -15043660, -28013924, -57836568, -32435594, 17637820, -884226, 4405563, 18850612, 6493454, 5335960, -13707388, -17958332, -8858907, -13367549, 931471, -14988362, 4436701, 6304475, -2834679, 9091909, -15002858, 11142219, -4197794, -13493177, -13643500, --3416110, -22959822, -6352794, -13879187, 15664283, 17131550, 8950175, 6880001, -14359149, -30822832, --30037390, 8628052, -2017561, 14460618, 13261785, 6999723, -21617108, -11052561, -20527796, -32662152, -10863046, 20321638, 8810052, 1084479, 23236846, -8564702, -121478856, -136009808, -92463128, -95071784, --25318832, 106888848, 71987944, 115320944, 128342216, 194982928, 129461592, 134080288, 86467352, -6446209, --96225520, -166293088, -196590320, -170504832, -134602672, -97228936, -23539106, -4771172, -14062797, 5133023, -42340860, 69911328, 96726960, 84296784, 114632144, 110943304, 143096496, 131110320, 36754184, 88077968, --19095962, 24250996, 17674864, 5193153, -12201465, -127351152, -153203632, -195563280, -229735120, -208578640, --116133768, -102908488, -84935664, -106050792, -123098056, -26108032, 30003030, 77491408, 113074144, 164089232, -195616976, 251539056, 331466240, 322256224, 244416928, 198680352, 164984192, 87617872, 138521824, -55948392, --113233592, -270337600, -310058528, -384979936, -370304576, -338228128, -320975776, -309581248, -191002560, -117922088, --64536180, 173354544, 176082928, 269805024, 345939744, 300434560, 270885728, 274561696, 215232080, 164620720, -90018216, 12222403, -1600412, -50475528, -62078920, -89314920, -116449984, -159233760, -172790288, -156720672, --181334064, -139595568, -128784056, -120947352, -106844824, -54617488, -11215233, 57024816, 116462872, 109955992, -170410336, 189064992, 207725552, 245982448, 198327632, 116371600, 57514444, -34862248, -90875064, -90157272, --175452640, -161788736, -222478768, -176447456, -184501056, -117841016, -124088584, -71914392, -9755481, 62812288, -93288304, 165746544, 191935648, 187154816, 180894896, 177157200, 135281264, 48853104, -31757526, -44409424, --59139552, -64231236, -74052752, -86395952, -81425600, -59232968, -65551940, -58145804, -51692080, -36058396, --17180942, -10616622, -9047885, 3011309, 10104984, 7806103, 9222369, 26364656, 32622960, 35412004, -31867584, 24916716, 25358560, 39643084, 27535036, 23075786, 21747030, 20582020, 8086350, -1201517, --11122892, -7786239, -10921028, -13195750, -19601156, -15087146, -13738527, -15794205, -21553220, -15860240, --14785425, -16709033, -17986786, -9490267, -7452842, -3631395, -2892661, 1125281, 7455527, 13902272, -11474542, 10853919, 10727755, 13270912, 10580115, 7481833, 4056597, 6192269, 4230006, 3400540, -1859721, 1094143, -2631741, -915365, 2554432, 3977677, 1229434, 790811, -453656, 1171989, --922881, -4952098, -7539278, -6331856, -7327751, -7242389, -7329362, -5734855, -5889474, -4484483, --2426120, 54761, 214748, 1267552, 653909, 1577864, 1887638, 2950106, 3305514, 4301410, -4082903, 4379793, 3459596, 3042984, 1957968, 1447941, 607738, 249645, -272730, -357019, --622233, -659278, -707596, -646393, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-2209224, -4245575, 2480881, 3969624, 7040525, 1901597, -4946192, -8794482, 1906966, -4108136, +347355, 2762201, 1071594, 7117835, -5888937, -1448478, -804233, -464930, -5056250, 3114925, +1314797, 651761, 132070, -2465311, -1902671, -1784559, -581431, 250182, 1185411, -1858110, +2705830, 6375342, -208843, 2834679, -4523675, -2618856, -5413270, -2604898, 5737003, 279173, +-1178432, 1025960, 6085969, 661962, 3057480, -763967, -2866354, -890669, 3470871, -2982855, +5450851, 3367791, 6146635, 3045132, 383326, -1876901, -4088809, -2254858, -3555696, -540092, +-2597382, 1031329, 219043, -1386738, 893353, -1190243, 2193118, -542777, -615791, 3118146, +-318364, -214748, 406411, -3003256, 1362578, -2196339, -3561602, -2038499, -1571421, 1553704, +-302258, -238908, -4039417, -661962, 1041530, 801548, -1610613, 159988, -1592359, 718333, +1122060, 853088, 308701, -269509, -654446, 196495, -1256278, -663572, 264141, 196495, +542777, 549756, 488016, 121870, 1145683, -12268574, -2776160, 5037997, 885837, 6866579, +3664144, -5645198, 1493038, -118648, 2251100, -2019172, -9420474, 5443871, 3335579, 6237367, +7793218, 6711960, 2353642, 94489, -9598715, -986769, 4410395, -4374424, -3796751, -10022306, +-671626, -1674500, -1158567, -2549063, 1189169, -5981816, 2731062, -1046898, 2534031, 747861, +-4022237, 3107409, 2592550, 6955700, -808528, -5567888, -2876018, 3016141, 1213328, -1392106, +289910, 2221035, 289910, -4068408, -37044, 858993, -432181, 259309, -2567854, -1125281, +-3419868, -703301, 4212826, 1506460, -1438277, 1800128, -546535, -216359, 639950, -4886599, +-448824, -242129, 2734284, 5291937, -1564442, -533650, -3413425, -2643552, 1351841, 6021544, +-5328444, -834297, 1368484, -289373, -1446867, -92879, -1410897, 1960653, 2058363, 1087701, +3346317, -1591285, -1029182, -343061, 787053, -765578, 139050, 541703, 452582, -404264, +-1431835, 1040993, -1426466, 6778532, 2537789, 2284923, -2285996, 170188, 628676, 641561, +-11665131, -6311455, -538482, -2907693, -3617436, -187368, -3047279, -11868605, 7058779, 1618666, +3189550, -1255204, 2423972, -3142306, 139050, 419833, 6099928, -2179696, -1298691, -1028108, +-1044751, -983548, -443992, 6616397, -1293859, -105227, -3783866, -217970, -1832877, 2145873, +1077500, -6423124, 4963909, -6501507, -136365, 5688684, -828392, 205622, 421444, -139050, +-3992709, -2836289, 6526740, 3773666, -8117488, -4338991, 1268626, -4766877, -3466576, 3460670, +-5846524, 1125281, 1398549, 3326989, 6950868, 5331128, 3251827, 2487323, -4760971, -4956393, +-4252018, 1368484, 6045704, 2334315, -1054951, -2715493, 1971390, -2297271, -1014149, 1402844, +-2263448, -3414499, -475131, 2721399, -512175, -2333778, 292058, 13422, 2642479, 1098975, +2440078, 550293, -1144609, -1165010, -942745, -492311, -328028, 780073, 1526324, 1826972, +1912871, 8913131, -2177012, -2272575, -2666101, 2516851, -2983392, 4360466, -8446053, -1078574, +6272800, 3285650, -6351183, 4706211, 7723425, 7289097, 4649839, 894964, -285615, -4760971, +-6140193, 2609730, -586800, 6161668, -479426, 3686156, -3834332, -2550674, -2055679, 613107, +1966021, -346282, -7499550, 1585380, 2602750, 1890323, 3238405, 1987496, -4068408, -10023917, +-3224984, 1470489, 1937030, 474057, -426812, 1904281, -4110284, -65498, -7467338, 3492882, +-7704635, -2030983, -3265249, -5070746, 3703873, 1637456, 1571958, -4427575, -2151242, -1302449, +-4439386, 420907, -374736, 2374580, -1901597, -3739306, -2852395, -8871792, 2820720, 1028645, +3813394, 5620502, 7179575, 2801929, -2826089, -4226785, -1993402, 3900367, 3892314, -4405026, +4806606, 204548, -3122978, 6928319, -1342177, 1562831, 1176821, 2032593, -122407, -1547799, +450435, 2153389, 774168, -340376, 2333241, -1221381, -955630, -1692217, 800475, 210453, +-864899, 1275068, -1236414, -2229625, -935229, 1690070, -406948, -388695, 608812, 4382478, +4043712, -784368, 2841121, -8684961, 946503, -4186519, 385473, 1208496, -5479842, 1901597, +15779173, 1657321, -1464584, -8994735, 12690555, -103616, 5293547, 558883, -329102, -7007776, +6670084, 1652489, -3782793, 804233, 448287, -2843805, 2661269, 7019051, -2125472, 7468412, +-2294050, 3150359, -179852, 4897874, 4361540, 4876936, -4832, -2778844, 3823058, -2924336, +3360812, -1057636, 3388729, 3272765, 3153580, -497679, -1046361, 1207423, -2847027, -4112431, +-10363219, 6653441, -6721087, 4578435, 537408, 1880659, -1259499, -12372727, -2719251, -3400540, +-6045167, 731755, 3668439, -7977902, -2554969, 3480534, 600759, 5501853, 9692131, -349503, +-2695629, -2414845, -10190347, 3025268, 1904281, -2348810, 476205, 3940633, 4072166, 1111860, +997506, 2829310, 280784, -530965, 4292283, 2477123, -2443837, 4363687, 3198140, 4282083, +1287953, -827855, 261456, -368830, -345745, -1697586, 519691, -1064078, 962073, -1322850, +1985886, 647466, 146566, 1603097, 100932, -595927, 427886, -448287, -193810, -663572, +1979980, 1158031, 369367, 1362578, -502511, 2218351, 257161, 654446, -275952, 549756, +-376883, -1408749, 541166, -4469451, -5405217, -499827, 2949032, -1711545, -2596308, -3929895, +1180579, 7228430, 3253438, 1162326, -16343961, -7483444, -2257542, 3378529, -1930588, 5567888, +18703508, 5841156, -6836514, 1097901, -8092792, -2597918, 5709622, -6429029, -1619203, 8366597, +2032593, -2051921, 1205812, 4748087, -2814277, 2321430, 2496987, 2484102, -4617090, 2157147, +-2152316, -2610803, -6832219, -2626909, -3987877, -7589207, 3352759, 305480, -505196, 7746511, +5638755, 2019172, 6197101, 82678, -7824357, 6643778, -738198, -5319317, -4224101, -7743826, +361314, 9432285, 646929, -4081830, 3992709, -6937446, -4371203, 3668976, -5652177, -7473243, +-3951370, -2318209, 4242891, -6594923, -2055142, -3039226, 8548059, 1290638, -2970507, 4253628, +-2572686, -3058554, 477278, 6833293, -1282048, 511638, 3738232, 2209761, -8657580, -264677, +5260261, 2574296, 3058017, -636729, -1695438, 3947075, -2332704, 738734, -1917703, 1176821, +1433982, 2077154, -4407174, 99321, 428423, 1177895, 237834, 122943, 2018635, -307627, +-425202, -1855426, 1471026, 2113661, 5730560, 4150012, -10581189, 10111964, -3759170, 966905, +-4605816, 8666170, -1188632, -5775121, -18924162, -2491081, 9874130, 2475512, -14746770, 6777459, +23622, -2987687, -4706748, -3801583, -1427003, -8752070, -1450625, 7147900, 9287330, 11054172, +6718403, 10084046, -3258807, 7952132, 3843996, -15571941, -337155, 4105452, 5575942, 2746632, +-5353140, 348966, -1094143, 5552856, -9329743, -3322694, 6986301, -2254321, 3940633, 2097018, +-6206228, -6881612, -3548180, -10333154, -2926483, -3143916, 4287451, 1588601, -5976447, -1336272, +-12793097, -3188476, 5259725, -3703873, -12642236, -147103, 7219303, -15326591, 4481799, 2599529, +4908611, -7245610, -3365107, -6884296, 558883, -2039036, -7825431, -2024003, -1298154, 4760435, +2683818, 11532524, 750009, 161598, 1852205, -832150, -5804649, 7304129, 2551211, -2952790, +6383932, 1192390, -3147137, 1086627, -182536, 3908420, 903554, 796180, 2426657, -2028298, +102005, -2181307, 8590, -1731409, 1784022, -688269, 779537, 2204392, 320512, -1347009, +2028835, 534723, 2157684, 608812, -612033, 812823, 209917, 2910914, -11826729, 2573222, +9378598, 12101607, 9004399, 9200357, 3519726, -6466610, 6425271, 11181410, -16678432, 8288750, +8281234, -17857400, -4728222, 4328254, 19149112, -1545115, -1278827, -4622996, -5439039, 23715198, +11723113, 3258807, 2913062, 12278775, -284542, -1920924, -4667556, 1796907, -10748693, -9694278, +-2264522, 2942590, 7088844, 3200288, 1560684, -3686156, 628676, -7891466, 3201898, -11674258, +11330661, -1319629, -5741298, -6730214, -7694434, -11776800, 1963337, -11400991, -3884798, 7751879, +-1876901, -3933653, -3805341, -1861332, -9780714, -6792491, -4445828, -4182761, -2286533, 3528853, +1924145, 549219, 448287, -8625368, 14706505, 8451959, 134755, -1128503, 19363860, -2384244, +-3431679, -4811437, -9924596, -2738042, 6422587, 6209986, -1037772, 7565585, -15194521, 4432943, +-5844914, 1410897, 5738077, -2063732, -215822, 910533, 412317, 1831267, -2462090, 2781528, +3535832, -3437585, 1315871, 1873143, 2273648, 6144488, -4736275, -457951, 562641, -148713, +1352915, 652835, 1415192, 1914482, -1784559, 1219234, -625455, 118112, -3411815, -747324, +-882079, 2786360, -2900714, 21989696, 7572564, 4727686, 10721312, -11898133, -7123740, 6956774, +7391102, 16348256, 2444373, 4629975, -10849087, -527744, 5491653, -14244796, -4536559, 5866389, +-4705674, 297427, 4014721, 10730976, -3515968, 4265440, 2255932, 2452426, 9143985, 8011188, +9738838, -7488276, -5009543, 10582263, -13202729, -4294431, -4330401, -775242, -3524558, -8371428, +8326868, -181999, -9091372, 547071, -3544959, -9428527, -11825656, -6499896, -7066295, 14161581, +-4416300, -3463354, -8266739, -578747, -4180614, 2284923, 16624745, -2993592, -5363878, 2931315, +-927713, 9669045, -11038603, 18884972, 3818763, -17955648, -13079249, 4873714, -12106439, 308701, +-12966506, 169651, 2837363, -1556389, 14117558, 17738214, -8330089, 2247342, -3404835, -12934831, +-4821101, -6994891, -8460012, -1848447, 6457484, -4318053, -9980430, 6751152, 484794, -5324149, +-4542465, 2299955, 3770981, -1506997, -1003949, -5005785, 324270, -4613332, -902480, -2253247, +3341485, 3835406, 936303, -4578435, 544387, 417149, 3073586, 47782, -1119913, 368830, +-5848672, -532039, -3280818, -2242510, 498216, 1444720, -3055869, 2522757, -1762547, -1569274, +4039417, -1480153, -3863860, -19381576, 7057168, 39479876, -7059316, -652298, -17563196, -7504382, +11592654, -1912871, 22565222, 13470091, 12440910, -112206, 9558450, -18823768, 16758962, 8580808, +619012, 2013266, -10980084, 4489315, -342524, 17069810, 9454834, 11305428, -4367445, 916439, +2823941, -11810086, -9542344, -4472135, 5121212, 19939922, -5765994, -7011534, -7039452, -4049081, +2440615, -13023415, -3898220, -1059783, -7035157, -13775571, -3043521, -17418776, -6432788, 9909563, +-12140262, -5442798, -2533494, 749472, -19563040, -11904576, -2703145, -2240362, -3875134, 12014634, +5204964, 599685, 7204808, 12381854, -7923678, -3423626, -10743861, 4603131, -8485245, 6874095, +7968238, 9565429, 17602924, 4828080, -13542032, -2386928, 29615410, 9492951, 16579648, 7865696, +4922570, -1360431, 1874216, -7257958, -9168681, 3854733, 2809446, -9156870, 2221035, 6039798, +5494874, -8803072, 6566468, 2078764, 4688494, 5411659, -198105, 2502355, 4527970, 1714229, +5343476, -770410, 1031329, -1949915, -3875671, 583579, 4645544, 496606, -2249489, 7523709, +4786741, 3994320, 15569, -1159641, -1427540, -426812, 108985, -1488206, 2564632, 1894081, +1986959, 2124398, 1037235, -4359392, 20432770, 22394496, -22674742, 5512054, 16582869, 9996536, +-6342593, -12089259, -10448045, 23333484, 1894081, 8750996, 12240120, -7028714, 3441343, 5084168, +-14323716, -15254650, 12343736, 4149475, -22149146, -5163625, 28765544, 13741748, -65498, -16474421, +5379447, 4256850, 17494476, 5721434, -8534637, 11388106, 2026688, -4887136, -1661616, -3532611, +-13647259, -6524592, 2097555, 2283312, -16287053, -17663054, -10399726, -5123359, -19339164, 11423539, +-1195075, -13824426, 2638184, 246961, -5943698, -1746441, 4176319, -193274, 4398047, 4991289, +7824894, -7737384, -9050033, 11909944, 24358370, 10925323, 6678674, 17652852, -3291556, 9576703, +23684598, 14364518, 2270427, 2544768, -7347079, -14569603, 14115947, -13885092, 6246493, -5623186, +4357245, -18149994, 8714489, -341450, -5839008, -3512210, 10323491, -9840844, -4828080, -2633889, +1633698, -353798, 3112778, -3979824, -406948, -7070590, -1676111, -533113, 1366873, -2211908, +2498597, -2738042, 2183454, -2467996, 7970923, 2323041, -1914482, -3797288, 3091840, 186831, +2850248, 2326262, -1755031, 2078227, 3027952, -2091112, 897648, 3424163, -937914, 1110786, +4086662, 3981435, 7350300, -4584878, -21204254, 5995238, -10207527, -4686346, -7884486, -1298154, +18207440, 18042620, -36399848, 11308112, 11586211, -11278047, -18508088, -24123220, 4284767, -7059853, +4494147, -8393977, -6614787, -3883187, 22566296, 5750961, -1946694, -347355, -3576634, -6698539, +5717139, 3792993, -93416, 9088151, 1977296, -1865090, 3231963, 8254391, 23279260, 2385318, +2871723, -11453604, -4917738, -5397700, -5786395, -657667, -1936493, 7756174, 11133092, 576599, +12859669, -2938831, -2178085, -2586107, -1438277, -22506702, 25433722, 707596, 1794223, -1819456, +-6623377, 6805913, -1755568, 10383083, 572304, -9820980, 2659122, 11007464, -7805566, 10228465, +2455648, -15496242, -2675765, -3265786, -28316182, -9598715, 7212324, 7374996, -11586211, -6580964, +6728603, 1009317, 18884434, -14996952, 6834904, 8516383, -1254667, 7459285, 6824703, 8446590, +3188476, 3804804, 3347927, 2855080, -1297617, -1460289, -4924717, 2032593, 7024956, 1344862, +-5230197, -1929514, -2976412, 1765232, -2320893, -1830730, -3505230, 4670240, 2542084, 3216394, +278099, -8137890, 3230352, -8270497, 580357, 1438814, 2888903, -3867618, -1982664, -1136556, +2640331, 5118528, 2193655, 2221572, 628139, 2327872, -5692979, 18739480, 5530308, 5904507, +-13409962, 10324028, -5258651, 9846213, -7410966, 12643847, -11165304, -9066676, 17302276, 2316598, +4554276, -10019622, -22647900, -2005213, 6841346, 1951526, 9963787, -7974144, 1437203, 63888, +-16869020, -12108587, 5811628, -19071802, -12439836, 6311455, 251792, -19950124, -2707440, -9854802, +12996034, 7865159, 2484639, -4520990, -12435541, -26617522, 9617506, -11829951, 14832133, -4254702, +-4731444, -2312840, -6940131, 4247723, 4007205, -21242908, -9284646, 21250424, 18601504, -18868866, +24904904, 1451162, 18381924, -4193499, -4209068, -2123861, -7027640, 9641128, -6924024, -19801410, +-10449119, 23913842, -5157182, -4595078, -1169842, 7532836, 4866198, 12173011, -27117350, 8230768, +18721226, 14817637, -5826123, -1342714, -5733782, -12158516, 1538672, 11523934, 17736604, -10613938, +-10805601, -12196097, -1123134, -1828046, 1287953, -5746130, 3211025, 3297998, -1967632, -667867, +-2529199, -5208185, 5406290, 321049, 924492, -8008504, -6798933, -1631551, -8854075, -3278671, +-4383014, 1220845, -3070902, 231928, 7025493, -2578054, 2994666, 128849, -6338298, 1490354, +-3143916, -610422, 2883534, 6293738, 963683, 2776160, 5769752, 5867999, 7573638, -2131378, +-1929514, -1114544, 7761006, -941672, -12277164, -450972, -9428527, 12812961, 9947681, -9658308, +-16456704, -13810467, -8101382, -16007343, -875636, 7579544, 17592722, -3042448, -820876, -29420526, +17640504, 21940304, -3459059, -11936251, -12102144, -7519414, 33051920, -20122996, -47782, -2384781, +8939438, -1492501, 38075960, 913754, -20683488, -5467494, -19654308, 25670482, 22363358, -18045842, +21039434, 5243618, 16943110, 6305549, -31735514, 9940702, 17024714, -22026202, -6075231, -24990804, +-12446278, 838592, -22968948, -19652160, -529892, -15928960, -192737, 5560372, -5661304, -15802795, +12981002, 11707007, -25934624, -19881940, 10887742, 4544076, 7010461, 13128641, 17234630, -6367289, +-9302362, -573915, -6017249, -369367, -1894618, -8753680, 3493956, -36092220, 12319577, 17489644, +-18558016, -15367930, 11665131, -11780022, -10595684, -5119601, 6545530, 869194, 22411140, 122943, +13111461, -1335198, -9070434, 4802847, 6791417, 6949257, -5835787, 98784, 769873, -877247, +-3728569, -8982387, 5942624, 9339943, -4763119, -15769509, 4054986, 1290101, 16703128, -1662152, +-6453189, 5077188, 1911797, 8253854, 51003, -5149666, 184684, 6715182, 5122822, 1617055, +-1726040, 1204738, -3033321, -2687039, -7753490, 3836480, 3807489, -5433134, 2650532, 2270427, +1500554, -996969, -2564632, 588411, -7430831, -5622649, 158914, 7973607, 19931332, 37561636, +59353764, 1653562, -24172612, -31091806, -7395934, 1087701, -7523172, 28744606, 21522618, 14840723, +24967182, 18128520, 14630806, 850404, 11760694, -15610596, 21607444, 25007448, 1564442, 26023206, +-10919417, 2002529, 5927592, -24555938, -16553878, -5931350, -14661408, -17253958, -2675765, 26752278, +-503048, -5328981, 3213173, 5609764, -3781719, -36601176, -5131949, 9403294, -5515812, -11306501, +4366371, 13970992, 24903830, 6045704, 12631499, 17591650, 21698712, -30274150, -21038360, 11732777, +-8891119, 38230576, -4106526, 32855962, -26715234, 15612743, 26762478, 903017, 4260071, 16011101, +-29186988, -13626857, 657667, 16497506, 372052, 19007914, 7660611, 7080791, 19391778, 6930467, +-2670933, -8308078, -23105850, -5428302, 1256278, 6011881, 386010, 410706, 439697, -12644921, +6459631, 4292820, 10808822, -3833795, 8116415, 13290239, 7885560, 3300146, -104153, -1683090, +2764348, -4712116, 2685428, -4506495, 83215, 2674154, 2676838, -3993246, 5961952, 5743445, +7267622, 741419, 541166, 2982318, -2659659, 4908611, -3752728, 4959614, 11518565, -1476932, +-2245731, 813359, 10018011, -6248104, 2342905, -1271310, -1510218, -1976759, 1362578, 2702608, +4507568, 3368328, 3439195, 9243306, -6562173, 10981695, -5387500, -12763032, 3711926, 42625404, +14179298, 14972256, 31066036, -2276333, 6567542, 13543642, 19942606, -22196928, -17850420, -7551090, +-19581830, -3397856, -26301306, 13538274, 20915954, 15353971, 20766704, -13981192, -7845295, 16142098, +12436615, -8734353, 21047488, 12753369, -4927401, -25759604, 14277008, 15785615, -13214541, -1887101, +7454453, 3794067, -20914880, 24075976, 6323803, 25843356, 13970992, 10177999, -14094472, 12104828, +-7534447, 39359080, -31040802, 3480534, 11754252, -5782637, -20079508, 12848395, 12404402, -2355253, +12200391, -11871826, 31915902, -14737107, 8330626, 7073275, -20447266, -8710731, -28193240, 12053289, +8101382, -20770462, 19375134, 16795470, -14579803, 12081743, -1686312, 32614372, 10484015, -16128139, +-12051141, -11507828, 10093710, -6649683, 8581882, -4021700, 1777043, 11011222, 6727530, 5560909, +-10845329, 28065464, 2942590, -10704132, -16038482, 13627931, 6558415, 12872017, -7442642, 3861713, +9951439, 21209622, 5193689, -3346317, 17380122, -4612795, -5263483, -2361158, 1540283, 4864051, +-10674604, -9077413, 3803194, -7829726, -5042292, 1119913, -4022237, -981937, -1559610, -7679402, +5233955, 3256659, -15313706, 3751117, -11507291, -6907918, -3819837, 5657546, 2725157, 10512469, +4315369, -196495, 2705830, 3938485, 4185983, 517007, 993748, 2505577, 8582955, -2763812, +-1557463, -38234872, 16403017, -32672890, 32918240, 39659192, -2594697, 6596533, -33058900, -702227, +-7750269, 2931315, 18468896, 19010062, -6226629, 9679246, 15267535, 2126546, 6126234, 4182761, +6038724, -4482335, 22473416, -3557307, 4725538, -13154411, 25350508, 5261872, -2913599, -1177895, +22767622, 8589398, 10493679, 25400974, -6214281, -16189342, 31088048, -33844344, -14968498, -6102075, +6967511, 21938156, 4698694, -9392020, -9846213, -16461536, -796180, -3204046, 5998459, 35372812, +34161096, 21764210, 30779884, -3063386, 46573016, -15915001, 12680891, -11349988, 694174, 14617921, +-7655779, 1583232, -14524506, -18349174, -96637, -11570642, 9206799, -15662135, 22817550, -17566954, +-28535226, -11729019, -7627325, -2623688, 33441690, -20509006, -5126581, -2948495, -21667036, -5413807, +11956652, 26572426, -2769717, -1187022, 601295, -8745627, -18697066, 732292, -1233729, -2782065, +-2340757, 12348, -11000485, 8515846, -9488120, 10525354, -4626754, -8011188, -9298604, 2222646, +7877507, -5821292, -8044474, -2603287, 6437619, 7745437, -6033892, 3690988, 4121021, 2835215, +4100083, -4271882, -4471598, 2270427, -64961, 4964446, -6481106, 4392141, 7141994, -176631, +-3070365, -3782256, 6168110, -13471165, -7017440, 13700946, -8749385, -733903, -2748242, 2847563, +-9000104, 6330782, -3299609, 12369506, 10722923, 167504, -13350369, 58546308, 81283864, 24924232, +63361504, -13878650, -44084080, -30889404, -21603148, 10691247, 11642583, -14693620, -23684060, 20514374, +27575838, 16120623, 27511950, 21232708, 5229660, 8450348, 4146254, -1373853, -18122078, 7998303, +-21472688, 15131170, 125091, -20076824, 23271744, 14095009, 11125039, 40230420, 24704116, -11519102, +-7779797, -14462765, -17176112, -20997558, -8309151, 848256, -16638166, -5138929, 34727496, 52724480, +38807176, 5339718, 26480620, 28291486, 43193412, 19819664, -22915262, -37562172, -23464480, -23952496, +14181982, 11966853, -51412368, -35205848, -9089225, 21720724, 46760920, -34976604, -1396401, -30346628, +-3958349, 38296076, -21052320, 14473503, -30534534, -4909148, -9126806, 25859462, -28618440, -16229071, +464393, 11469173, -23230942, 53437448, -12562779, -743029, 30337502, -13231184, 22810034, -7170985, +-18832894, -14536854, 8868034, 983548, 7563975, 4845797, -16807818, 582505, -7090454, 20557324, +11971684, 3735548, 11176579, 12865575, 721555, -24696, -4030827, -12599287, 26066156, -7909183, +5480379, 362388, -15075335, 766115, 1677722, -4603668, -9897752, -1988570, -5797132, 1615445, +3910031, -4244502, 919123, 17945448, 12713640, -2090575, -2809982, 17027934, -6996502, -1919850, +-14156212, -20248624, -7619809, -5183489, -2153926, -5493263, -22952306, -44629544, 5543192, 24983824, +-20621212, 38662220, -15307800, 15425912, -5060545, -44480828, -22752052, -2069637, -26147760, -60079076, +-16802986, 21801254, 33458332, -16203301, -25689810, -53601728, -15891379, 15940771, -10604811, -15470472, +-26610006, 6425271, -5956046, -4431870, -4939750, 10940355, 21640730, -16691317, 16747151, 14305462, +-16884054, -48914308, 4083440, 4060892, 12731357, 6004901, 32145146, 3332358, -48633524, 417686, +-53565760, -151398, 18712098, 22558778, -4073240, 3072512, 25020868, -12943958, -9411347, -16707423, +16229071, 11841225, -7635915, 19335406, -5909875, 8195335, 9050033, 31585190, 4291746, -11090142, +-33620468, -11526618, 17588428, 15270219, 26866094, 39090108, 67614600, 33693480, 16339666, -17510044, +-67699424, -18512382, -9690520, 51909512, -8613557, 3292629, -125628, -16296717, 2323041, 15258408, +7353521, -304943, 839129, 332323, 190052, 25189446, -8981313, -7442642, -8246337, 17484274, +6774237, 8865886, -6762426, -21398600, 7166690, 9106941, -9663140, -1404454, 5556614, -1198833, +1766842, -3775276, -30728880, -10082973, -2368675, 14174466, 22291954, 2664490, -18336826, -17974976, +8350490, 3016678, -1575179, -3030636, 1141924, -1891933, -780073, 16494822, -17983564, 2320893, +-15430207, 16496969, -8908299, 369904, -22265648, -3500935, 15278272, -4699768, 8325257, -12875775, +6524592, -6766721, 10585484, -10336376, 3622268, -43694312, -13301514, 30392800, -14965814, -12551505, +-3236795, -9801115, -35033512, -38947836, -56984016, -17984638, 108985, -4405026, 37298032, 10270341, +48715668, 30066382, 15082315, -6795712, -18009872, -3345780, 68314136, 4254702, 19681688, 11113228, +-8591008, 34056944, -14219563, 27494234, -30023968, -2964601, -21644488, 25879326, -36455684, -7652558, +11106785, 11496017, 11663521, -31814970, 22625888, -36415952, 7368554, -17825188, -12265890, 36298916, +2103997, 2418067, 12439836, -13729937, -857383, 9517111, -44278964, 1234266, 10148471, -6391985, +28436442, -12706124, -5633387, 47974784, -18219252, -39830452, 35970, -15012521, 3156801, -2968359, +-2172717, -31955094, 17033304, -5158256, -43739948, 26334592, -54157392, 10557030, -12487081, -21351356, +-34275988, -4347044, 9147207, 15784542, 1290101, 12794708, 15657840, -18597746, 32824824, -7556458, +8681740, -373125, 15592879, -649077, -1914482, -5285494, 9153649, -19615652, -2693481, 6514392, +4100083, -7580081, -294205, -8492224, -11576547, 5945309, 4483409, 8745627, 5360119, -2408940, +6491843, 19669340, -9903121, -10111427, 3195456, -873489, 3603478, 14613626, -2320356, 8004209, +7148436, 7594576, -10130754, -11739219, -3202972, -861678, -12684649, -615791, -2757369, 5337034, +-13855028, 4152160, -6316287, -18211736, -66019552, -67869072, -57827976, -28811714, 121719912, 38592964, +-14414984, -15098421, -59186796, -126135136, -13606456, 34724812, 43202004, 18913426, -18838264, -13971529, +-36706400, -40537512, 31615254, -29038810, 76972792, 57817240, -88354456, 29372744, 12336757, -18079128, +7558069, 64468532, 9785009, 44642428, 88111792, -18503256, -71200896, 3904125, -11621645, -66418984, +-17630840, 32865090, -2321967, 40329208, 64939368, 6256157, -55132348, -108657304, -93103616, -83282104, +-8181913, 81680080, 23767812, 22153978, 12833362, -21584358, -108793136, -67981280, -34421480, -12866648, +7345468, 25201794, 24659018, 31329638, 32268090, 39784820, -46500536, -16515223, -37956236, -2822331, +-41571524, 26718454, 26898306, 54240068, 60403884, 28984050, 1585380, -15480136, -10340671, -73189464, +-57916024, 51911124, 81225344, 55280524, 65054796, -15043660, -28013924, -57836568, -32435594, 17637820, +884226, 4405563, 18850612, 6493454, 5335960, -13707388, -17958332, -8858907, -13367549, 931471, +14988362, 4436701, 6304475, -2834679, 9091909, -15002858, 11142219, -4197794, -13493177, -13643500, +-3416110, -22959822, -6352794, -13879187, 15664283, 17131550, 8950175, 6880001, -14359149, -30822832, +-30037390, 8628052, -2017561, 14460618, 13261785, 6999723, -21617108, -11052561, -20527796, -32662152, +10863046, 20321638, 8810052, 1084479, 23236846, -8564702, -121478856, -136009808, -92463128, -95071784, +-25318832, 106888848, 71987944, 115320944, 128342216, 194982928, 129461592, 134080288, 86467352, -6446209, +-96225520, -166293088, -196590320, -170504832, -134602672, -97228936, -23539106, -4771172, -14062797, 5133023, +42340860, 69911328, 96726960, 84296784, 114632144, 110943304, 143096496, 131110320, 36754184, 88077968, +-19095962, 24250996, 17674864, 5193153, -12201465, -127351152, -153203632, -195563280, -229735120, -208578640, +-116133768, -102908488, -84935664, -106050792, -123098056, -26108032, 30003030, 77491408, 113074144, 164089232, +195616976, 251539056, 331466240, 322256224, 244416928, 198680352, 164984192, 87617872, 138521824, -55948392, +-113233592, -270337600, -310058528, -384979936, -370304576, -338228128, -320975776, -309581248, -191002560, -117922088, +-64536180, 173354544, 176082928, 269805024, 345939744, 300434560, 270885728, 274561696, 215232080, 164620720, +90018216, 12222403, -1600412, -50475528, -62078920, -89314920, -116449984, -159233760, -172790288, -156720672, +-181334064, -139595568, -128784056, -120947352, -106844824, -54617488, -11215233, 57024816, 116462872, 109955992, +170410336, 189064992, 207725552, 245982448, 198327632, 116371600, 57514444, -34862248, -90875064, -90157272, +-175452640, -161788736, -222478768, -176447456, -184501056, -117841016, -124088584, -71914392, -9755481, 62812288, +93288304, 165746544, 191935648, 187154816, 180894896, 177157200, 135281264, 48853104, -31757526, -44409424, +-59139552, -64231236, -74052752, -86395952, -81425600, -59232968, -65551940, -58145804, -51692080, -36058396, +-17180942, -10616622, -9047885, 3011309, 10104984, 7806103, 9222369, 26364656, 32622960, 35412004, +31867584, 24916716, 25358560, 39643084, 27535036, 23075786, 21747030, 20582020, 8086350, -1201517, +-11122892, -7786239, -10921028, -13195750, -19601156, -15087146, -13738527, -15794205, -21553220, -15860240, +-14785425, -16709033, -17986786, -9490267, -7452842, -3631395, -2892661, 1125281, 7455527, 13902272, +11474542, 10853919, 10727755, 13270912, 10580115, 7481833, 4056597, 6192269, 4230006, 3400540, +1859721, 1094143, -2631741, -915365, 2554432, 3977677, 1229434, 790811, -453656, 1171989, +-922881, -4952098, -7539278, -6331856, -7327751, -7242389, -7329362, -5734855, -5889474, -4484483, +-2426120, 54761, 214748, 1267552, 653909, 1577864, 1887638, 2950106, 3305514, 4301410, +4082903, 4379793, 3459596, 3042984, 1957968, 1447941, 607738, 249645, -272730, -357019, +-622233, -659278, -707596, -646393, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 13325673, -1492501, -5924371, 1986422, -3758633, 944893, -2459943, -1562831, -3277597, 2268280, 3934190, -1120450, 1202054, -7319698, 1398549, 99858, 2235531, 2755222, 1493575, 4161823, -917512, --2368675, 408559, 4980552, -2147, -3859028, -419296, 4237522, 2282238, 436476, 8053, -1177358, -141734, 304406, 791885, -155693, -1554778, -199716, 4832, 1654636, -2528125, --5887864, 4299799, 4308926, 3749507, 3525095, -214748, 1916092, 3351148, -3576097, -832687, --108985, -4767414, 1054951, 317291, 4272956, 415001, 2389613, 43487, 5377836, 2709051, --802622, 3759707, 2278480, -1257352, -4415764, 1074279, 1137093, -1190780, 318364, -2528662, --665720, 2225330, 1559073, 1844689, 4436165, -764504, -1411434, 580894, 2634963, 6077916, --3598109, 1602023, 1641751, 1753420, -192200, -435402, 1877975, -1077500, 43487, 869731, --1156957, -223338, 165893, 295279, -756988, -1156957, 706522, -301185, 134218, -438624, -1110249, -165356, 1322313, -340913, 1176284, -52076, 1112397, 11312944, -7581154, 2542621, -6362457, 1480153, 4480188, 5431523, -4958003, 1029182, -464930, 2108292, -6283537, -4985920, --942208, 4867272, 6593312, -2541010, -2203318, 3160559, -5381057, -7182796, -1341104, -8445516, -2872796, 2793339, 746787, -5249524, -5352603, 1890323, -3124052, 715112, -177704, 5555004, -5849746, 5296232, -883690, 3710315, -5831492, 2523293, -3448859, -319438, 283468, 4533875, --4924180, -4355097, 6442, 5965710, 2433099, 2328946, -3643743, 2019708, 1450088, -1762010, --7490423, -1211718, -2561948, -3279745, -2983929, 3419868, -3172907, -1015760, 743029, 2123861, -5322002, -2053531, -162672, -4041564, -1995012, 838056, -5636608, -346282, 1490891, 3831648, --1255204, -2901787, -1506460, -5828271, 2720325, 1712618, 297963, -472446, -5079873, 2077690, -375810, -1792075, 1790465, -712965, 403727, 1675574, 121870, 351650, 1899986, 872952, -356482, 57982, 1512902, 581968, -340376, 651224, 866510, 1803886, -3874061, -7121056, --1682554, 1371168, -2110977, -3543348, -1909113, -7098507, -3943854, 7757785, -183610, -3260954, -4170413, -5992553, -1278290, -7504919, -1463510, -5888400, -3020973, 7183870, 492848, -1315871, --7845832, -4848481, -1675574, -3293166, 1470489, -4121021, 537945, 2760590, 8570070, 4265440, -3291019, 3779571, 6961068, -5623723, 55835, -1599339, -4306242, 1950989, -782221, -1602023, --4512937, 2541547, 4998805, 635118, -3416110, -2144263, 12601971, 177704, -3460133, -4868883, --7356205, -9844602, -1118302, -5043902, 1323924, -886374, 2912525, 644782, 1474248, -4454418, -812286, 876173, 6164889, 2167885, -4387846, 381178, -1276679, -1213865, -948114, 2285996, -3366181, 3298535, -2828236, -2752537, 1946694, 991064, 1318555, 1434519, -1020055, -4293894, --5062156, -485331, 1068910, -1110249, 672699, 165356, -572841, -965294, -1495186, -502511, --179852, -848256, -1675574, 283468, 723165, -848793, 477815, -730681, 305480, -947577, --405338, 343061, 418759, -1168231, 328565, -363462, -2198487, 373662, -684510, 1442572, --880468, -571768, -221728, -17494476, 6842957, -3179350, 2860448, -7277285, -2960306, -5712307, --5219996, 286689, -1678795, -3606162, 8831527, 2234994, -872415, -5456219, -1751273, 2428267, --6216429, -3338800, -5921150, -3343632, 8445516, 753230, 5618354, -616865, -98247, -1502702, -1564442, 1490891, -4543002, -23085, 1311039, 2458869, 9175661, -4897874, -5619428, -1187559, -10154913, 3122441, 10810970, 874026, 965294, -2003602, 5324686, -1018444, 7866770, -892279, --950262, -1510218, -3316252, 3265786, 990527, -2910914, 2268817, 2881386, 5457830, -3264712, --302795, -1079647, 4860293, -2092723, -846645, -1937030, -1271847, 1076426, -1620276, 467078, -805843, -1294933, 1190780, -8193724, 758599, 5153424, 1829119, 6936909, 557809, 641024, -1683090, 4379256, 7173669, -4862440, 679142, -484258, 1687922, -336618, -186831, 2040646, -4652524, 1678259, 2281165, 135828, -812823, -1330366, 629750, 2244121, -827855, 954557, -1080184, 997506, -41876, 362388, 1985349, -469225, 527207, -199179, 2293513, 1207423, --732292, -260382, 2469606, 1131724, -725850, 1678795, 1018981, -2318209, -3625489, -1736241, -26844, -8514236, -1333051, 185220, -4182225, -15150497, -3590593, -3186866, -6538551, -1195075, --1599875, 9654013, -3204046, 7325067, 3494493, 5311264, -9697499, -4307316, -9799505, -9109626, -104153, 1831267, 5879274, -2683281, -4219806, -2567317, -6589554, 1530619, 3164317, 3604551, -2275259, -1937030, 2612414, -4378183, 597000, -7974144, 3028489, -1988033, 1219771, 1869921, -3129958, 3307662, -2966749, 212064, 7930120, -4098473, 3904125, 4063576, -142808, 2468533, -3961034, -1499481, 1631014, 3874061, 324807, 6764574, -3380676, -4539244, -2120103, 2267206, -98784, -8796630, -4387309, -9756018, -10590316, -1744294, 3015604, -8647917, 4009889, -1339493, --35433, -2911451, 3042984, -5116917, -711354, -1739999, -7208029, -6387153, -2020245, 3908420, -244276, 3360275, -1263794, 2199023, 1824824, -3987340, 143881, -737124, 2415382, -2668785, --4452808, -1431835, 745714, 58519, -1638530, 839129, -969589, -356482, 853088, -186294, -175557, -38655, -914828, -172872, -883690, -623307, -526670, 27380, 597537, 104690, -1427540, 547608, -502511, 5014911, -14106283, -595927, 4504347, 2871186, -7441031, -832150, --4699231, 1317481, 1537598, 1112933, -8131447, -10937134, -7409893, 1369558, -5901822, 6649683, -2183991, -10532334, 7771207, 6797323, 5425081, 4838281, -5163625, 8713952, 2391760, 7516, --3251290, 2990908, 5290863, -4675072, -6853157, 2647311, -2512019, -8567386, -1035087, -8266739, --2917894, 15158013, -3904662, -6718403, -8288213, 533650, 1500554, 6067715, 2518998, -5464809, -5157182, -581968, -4211753, -5687611, -5971615, 9356049, 4294968, 5916318, -4294431, -6009196, -2875481, 1557463, -6102612, -264677, -3686693, 6061273, -1016834, 583579, -7231651, 4756140, -4089346, -4152160, -2552821, -2561948, 8499740, 140660, 1377611, -2373506, 5874979, -5807870, --9782862, -4400731, 1018981, -1871532, 5573794, -1082869, -465467, -5765457, -2898566, 2535105, -492848, -4099546, -2530810, 3541201, 2062658, -1099512, 318901, 69256, 166430, -1120450, -1695975, 690416, 2544768, 387621, 584116, 91805, 1201517, -480499, 1660542, -1946157, -2212445, -223338, -1101122, -7836705, -548145, 1662689, -2126546, -6310381, -9254581, -7463043, -7077569, 626528, 8725226, 10449655, 10150081, 1347009, 14012868, 3190087, -1791001, 6354404, -4812511, 12920872, 1686848, 7333120, -10581726, 16850768, 12357158, 5847061, -5388574, -4336843, -5965710, 1198296, 4223027, -2765422, 7162395, -2426120, -2112050, 6397354, 5181878, -6971269, -4343286, -2031520, 6975027, 7564511, -15479599, -3045669, 9229348, 2614561, 4939213, 3812857, -9139154, -4734665, 3554086, -52613, -8041790, -4057670, -401579, 1410897, -11718281, -1203665, -7112466, -5989869, 12064563, 8952322, -3878892, -333397, 2170569, 4368519, 6973417, -2994129, --2484639, 11360725, -2911451, -463320, 4871030, 12885, 6607807, 5172215, 2061047, 3505230, -3739843, 3500398, 1559610, 1358283, -1778653, -2931315, -1300301, -2690797, -453656, -1948305, -1122597, 931471, -2616172, -2168959, -451508, 1641214, 3631395, 2935610, 1637993, 131533, -1728188, -3490735, -1626719, -1981054, 571231, -1500017, 1538135, -4022774, 263604, -296890, -3124052, 1077500, 15032, 336081, 3245922, 808528, -3071439, 738198, -413391, 560493, -2719251, -314069, 754841, -275415, 29577830, -15651398, 2049236, 12123082, -1290638, 318364, -16097001, 17642652, 2001992, -1480153, 3633542, -980863, 3913252, 4976794, -6594386, -2120103, -10393284, 9133248, -4424353, -8577050, -9125195, -9504763, -5153424, 7656316, -6088116, 3280818, -328565, -11091216, -826244, -7419556, -962610, 2999498, 4720169, -14348949, -6760816, -11455752, --3597035, 16991964, 2387465, -1693291, 1441498, -1704028, 766652, 4910222, 2892124, 8403640, --535260, 6238977, 3734474, -6123013, 3712462, -9238475, 186831, -9280887, -9577240, 3431679, --10528575, 4236449, -185757, 5162014, 4177930, 3673808, -5645735, 6339372, -9546102, -372588, --4427038, -1656247, 11859478, 246424, 5912023, 5725729, -1260573, -2448131, 4560719, -10035728, -3900904, 9182640, -14001057, -10450192, -2887292, 6892886, -692564, -8776229, 3205656, -1450625, -3648575, -3361349, 1101122, -1999844, 6133214, -1356136, 5640366, 2923799, 5268851, 1620813, -1449015, -2996277, 3566434, 1378685, -134755, 1885491, 1804423, -1250372, 2665027, 1873680, --1305670, -1628866, -4566087, -1180042, -2605435, -323196, -110059, -1780264, 2355253, -1042066, -1387274, 259309, 4778688, -4011500, 1793149, 561567, 216359, -601295, -17520246, 3508452, -4491999, -11767674, 5619965, 127775, 12763569, -3105261, -6175089, 5521181, -15307800, -5129802, -13296682, 5949604, -7758322, -18956912, 8739722, -2458869, 4892505, -12020003, -16000364, -10790032, -14227079, 1357210, 7939784, -1139240, -7221988, -10810970, 5401458, -2730526, -9386651, -11004243, -1015223, -9800578, -7493644, -3992172, -1777043, -10635950, 6278706, 7458211, 10009421, -4483409, -8920110, -6813429, 13998372, -2359011, -533113, 10718091, 5612449, -2396592, -6862821, -3334505, -10353556, 2552821, -7336341, 3810173, 10986526, 10397579, 4588636, -12252468, -13549011, -1026497, -2881923, 1059783, -9693741, 3172370, 11140608, 3368865, -4447976, -17415018, 4921496, -7461969, --16973174, 739808, 1131724, -9509058, 14183056, -807991, -5530308, -18847928, 98784, -5405217, --667331, 7352447, -4046933, -7084549, -269509, 1839857, 1946694, -5575942, -5633924, -5615133, -2369748, -4820564, 540629, -708133, 1045825, -1198296, 1634235, 2756832, 2503966, 3122978, -1678259, 5457293, 6920266, 573378, 2199560, 1423782, -2375654, -532039, -1892470, 1014686, -967441, 589484, -6263136, 963683, -316217, -2174327, -73551, -1934883, 2196876, -2408403, --2494302, -1831267, -21760988, 13952201, 10799695, 11878806, 1843615, 12546136, 1438814, -7718056, --8976482, 1590749, 10091563, -6627135, 2490007, -14579266, 10333154, 10983305, -5233955, -2829847, -2675228, 12013024, 8784819, -5854578, -5252745, 8295730, -9481677, 3591130, -13033078, 234613, --3706020, -17471390, -18092550, 3814468, 10761041, 5164162, -15416785, -8151311, 12154757, -12962748, --5283884, 10895795, -2648921, 13554380, -4452271, -8973797, 3704409, -13178570, 15729244, -1349694, -2962991, -6961605, -3475166, -323733, -14344654, -8579734, 1379758, -2048699, 1661079, -4393752, --15242839, 3234110, -12586402, 6043019, -3021510, 9573482, -15216532, 7282654, 2836289, -4041027, -11687143, -1098975, -7705172, -14794015, -1851668, 3690451, -12036109, 9394167, -8075076, 6225555, --15912854, -16091632, 8005282, 6608881, -6407555, -4813048, 5398774, 3935264, -3333968, -2563559, --4270808, -5341329, -367220, -8809515, -819802, -961536, 836982, 2909304, -1555315, 2940442, --1628330, -204011, -4824322, -2093797, -1214402, -276489, 7455527, -1804960, -900869, 4602058, --4453881, 3541201, 1947231, -1403917, -993748, -4233764, -4150012, 184147, -2383707, 1025423, -396748, -1677722, -2929168, 7162395, -6970195, 2381559, 8523899, 12586402, -3326452, 1396401, --4467840, -16807280, -3590056, -3597572, 7302518, -14762876, -43487, -8516920, 9162239, -10327249, --14083198, 9367861, 4300873, 6094559, 19396072, -3197066, -5562520, 5474473, -12424267, -14489072, -1193464, 18564460, 5645735, 10423886, -7406671, -9109089, -14759655, 2953327, 18846316, -8442832, -9850507, 2268280, 14653892, -22416508, -7129109, -371515, 2632815, 12774843, 6158983, -17082158, --4629438, -7925289, -679679, -19668802, -3095598, -7076496, 1357210, -10348724, -690416, 2409477, --28724742, 3297998, -9008694, 1770063, -11372000, -612570, 7060390, 3615826, -3870303, -3632469, --15151034, 15235323, 14627048, 4833449, 3643743, -13133473, 20059108, 6997039, 10337986, -3940633, --31590558, 12321724, -1088237, 23707146, 22252762, 7033546, -2865817, 9819369, 512712, 8601746, -455803, 998043, -5596343, 2688650, -5113159, -2713346, -1431298, 10346576, -155156, 639950, -2645700, -638876, -5586142, -2852395, 942745, 4206921, -1981591, 2103997, -3283503, 4378183, --3435437, -5248987, -2690260, -742493, 2451890, 972810, -1140851, -897648, -1167157, 6836514, --1500017, 411780, 1117228, 3419331, 27197344, 9589588, 18613314, -18063558, 4197794, 18979460, --5704254, -6840273, 2682744, -11737072, 8961986, 2270964, -13707388, -17948668, -1348620, 15223512, --394063, -1226750, 9960566, -14872935, -3789235, -12243341, 6876780, -20864414, 344134, -4460861, -7588134, -21791590, -15055471, -9522479, 6386617, 7012608, 4853850, -7069516, 5295158, -5259725, -6460168, -4314832, -1909113, -1501091, -6119792, 4145180, 9643275, 5740761, 9708237, -800475, --9418326, 1341104, -9378061, 24981140, -6314676, -24575802, -7656853, 6715718, 21344376, -21365852, --8809515, -1393717, 13724568, 877247, -30235496, -3714073, 13952738, 28815472, 1066763, 20060182, -28903520, -2152852, 9303973, 13654775, -3780645, 24630026, -3310883, 29743722, 4736812, -8175470, --25797722, -16162499, 191663, 7756174, 3706020, -3929895, -5013838, -8019241, -10941966, -9727027, -11832635, 3457449, -144418, -16965658, -1916629, 620086, -3096672, -9650792, 2517388, 5101885, --1461363, -5004174, -3648038, -9455907, -5707475, -2784750, 5953362, -1173063, -5145908, 5150740, --7392713, 5308580, 5365488, -4638565, -8959839, 8181376, 12164421, 1855963, 373125, 733366, -7088307, -2121177, -8473434, 992674, 8216273, 6799470, -8412767, -7150047, 1312649, 1342714, -122407, 2427194, -1313723, 11399380, 13807246, -23792508, -23147190, 6088116, -5429376, 698469, --9234717, 21537114, -9724880, -6226092, 7458748, 5371931, 171262, -9892383, -7255274, -12031277, -4800700, -724776, -5840082, -987306, 14305999, 21508122, -23328652, -1517197, -22757958, -2450816, --5908802, 22494354, -9546639, -9120900, -4411469, 13677860, 4517769, 3751654, 5713380, 5454072, --4103305, 238371, -2982855, 3628711, -2722473, 21054466, -5525476, 5565204, 14816027, -7764764, --17071958, 3759707, 5776731, -6026913, -6565395, -1457068, 3475166, 10663867, -14625974, 19531364, -28742994, 19297288, -8104067, -11674795, -26667988, -34410204, -12676059, -164283, -6247567, -1775969, --3942780, 8185671, -741419, -13312251, 6944425, -5914707, -1293859, 12581033, 21013664, -5187247, -5884642, -3737695, 1123671, 19122806, 9648644, 16349330, 16650514, -13365938, -4130685, -3090229, -443992, -341987, 5907191, 373125, 3609920, 16763794, 670015, 7813083, -3590593, -3724274, --6911676, -2149094, 948651, 7616051, -2154463, -6404870, -3025268, 3648038, -2675228, -1463510, --2003065, 2291365, 576599, -2507187, -1364189, 1683090, 820876, 844498, 9659918, -4001836, -209917, 1223529, 110059, -5379984, 2414845, 2984466, 6156836, -12347494, 23041962, 10311143, -13066901, 19665582, 30434676, -11826729, 15701327, -31532040, -3968550, -14196478, -30990874, 12410845, -7218230, 9316321, 4032974, 12154757, 3638374, -22325240, 18624052, 32986960, -5049808, -5412196, -7999914, 3195993, -7010997, -29579976, 2314451, 13959, -2784213, 308164, 9929964, -21172042, -4460324, 5898064, -4440996, -12249784, -6033892, -13641890, 13696114, -30361124, -4496294, -19559282, -10706817, 4289062, 10858751, -3940633, 2877628, -7827578, 18417894, 5492190, 15099494, -13922673, -14839649, -423591, -14748918, 30151744, -5123359, 3619584, 20307680, -19704236, 22775674, 13597866, --18053896, 7488813, -6972880, 9979357, -24968256, 18088254, 2460480, 6306086, -2448131, 5806796, --20299626, 12775917, 22803592, -45610944, 4537096, 43848396, -28486908, -9178882, 2983929, 21338472, -15065672, 5211406, 13147969, -6056978, 7880728, -3398393, -9834938, 4741644, -2293513, -1697049, -8138963, 11922292, -1149441, -4719632, -4119948, 3488587, 7521562, -10198937, -3925063, -6994891, --4443144, -9121437, 8946417, 11932493, -2653216, 5469641, -3536369, 2196876, 7499550, 8567923, --10041634, 806380, 3542811, -5238250, 7752953, 376347, -287226, 7114077, 3519726, -8607114, --7314330, 2423972, 1013075, -2605435, 1329829, 18446348, -11157788, -13433584, -424128, -12860206, --5848135, -33989836, -29018946, -4002373, -16648904, -19978040, -14416058, 8876087, -5135171, -10113574, --16248935, 15007153, 1004486, -24539296, -3875134, -137439, -11684995, -3672734, 9956271, 7162932, --1732482, 93416, 459025, -6156299, 5228586, 11462731, -4305168, -2729452, 17582522, -33043868, --5395016, 9308805, 35229468, -14585709, -9155797, -13139916, -17898202, 7808788, 37381248, 6954626, -23148264, 4793721, -3822521, -1944010, -2787434, -18033494, 3934190, 4095788, -14712947, 3268470, -29185376, -4724464, -9034464, 4913443, -10515691, -2390686, 25738128, 38109244, 10251013, 22885734, -26400628, -9361955, -11070815, 3031173, -8767102, 1522566, -26181046, -213138, -20411296, 6216965, -4212826, 12435541, -21251498, -7904888, -7278896, -8288213, -6687801, -7414724, 11764989, 2569464, -15175730, -3842385, 5752572, 15246597, -2850248, 564251, -2264522, -6017786, -4919348, -801011, --3733937, -5528160, -159451, 2333241, -2942053, 1056025, 7041062, -7100118, -6561637, 521839, -5256503, 2800319, -3503620, -10531797, -10359998, -1223529, 2330557, -6230924, -3579318, 2257005, --2216740, 1150514, 661425, 7271380, 2334315, 1883880, -8013872, 8814884, -3785477, -8501888, -26737246, 30245696, -12577812, 68828464, -9819906, 1272921, -13112535, 7831873, -5732171, 7726646, -17435420, 4725538, -16884590, -9300752, -17628694, -592169, -12074227, -21740588, 2551211, 13606993, --2677375, 3746285, 6276021, 7856569, -452045, -6483790, -8406862, 3808562, -380105, -10984379, -3867618, 29426432, 20679730, 11647414, -25535192, 17805860, 13821205, -6940667, -8021389, -8005282, --10413148, -4632659, 7839926, -18540836, 1415192, 1982664, 10621454, 28045062, 5142150, 5583458, -1211181, -3680787, -6065031, 12000139, -7781944, 28326384, 8873939, -3054259, 12202002, 2095407, --19617800, -14159433, 15935402, 18470506, 6638409, -4976257, 12140799, 13134010, 18784040, 37072012, -3679176, -11020349, -19534048, -13109851, 9377524, 1831804, 2816962, -2055142, 12813498, 1118302, --1921461, -17710298, -8915278, 17883706, 20045150, -7531762, -14159433, -16798154, -5108864, 8599061, -5264556, 1365263, -5908802, 1171989, -319975, -7582228, -243739, -16425029, -4513474, -877247, -11292006, -2347200, -3817689, -168577, 9103183, -5887864, 6439230, -3753802, -7891466, 6324340, -8996346, 5739687, 6277632, -1087701, 6743636, 13111461, 5531381, 5465346, 3532074, -5162014, --2521683, 138513, -1480690, 3783866, -4051765, 6325950, 8170639, 4778688, 332860, -6649146, -2250026, 2123325, 6577743, 10770167, -11177652, 48993764, -7785165, 1646583, 5051956, -4188130, --1111860, 11940546, -9613747, -11333345, -6120866, 15535970, 13879724, -38677256, 6968048, 6083285, -15235860, -10230075, -15476378, -14821932, 10545755, 9440875, -15795816, -8871792, -6707129, 25275346, -12568148, 6785512, -5357435, -27084600, 7185481, 6267968, 13376676, -3739306, 6945499, -7828652, -2246805, -23584202, 9266392, 9031779, -2684, -6174553, -14856292, -29223494, 18335216, -12561169, -9269076, 9416179, 16167868, 1869385, -17864916, 28766618, 5400922, -28971702, -13555454, 16653199, -3753265, 21934398, 9151502, 3263102, -20646444, -10477573, 11056320, -35807144, 37807524, -27637040, -1248225, 22441740, -6434935, 44905492, 6508486, 7797513, -16702591, 52381960, 5228049, 33933464, --23597088, -10855530, -7609072, 12990129, -1687385, -5765994, 23698556, -20206748, 22852448, -27833536, -5669894, 2403034, 4774930, -5698885, 20132660, -2829847, 10158671, 8766565, 13308493, 7306276, -3765076, 9086540, 10358924, -8053, 3692598, 791885, -7312719, 8667244, 106837, 5838471, -12604118, 6018860, 659814, -1036698, 9623948, 10119480, 5114233, -6383932, 21254720, -1372242, --4418448, -4581657, 13601625, -10849087, 4642860, -2731062, 7258495, 29528, 2943126, 3612604, --3048890, -2795487, 1978906, 3643206, 3438121, 3825205, 5404143, -5700496, 17769890, 41198936, -13955422, 26038240, 33046016, -956167, 37830072, -28387586, -9922448, -10406169, -9133785, 4456566, -6509023, -2017024, -12343199, -24342800, 24184424, 22916334, 9916006, 20744692, -32855962, -28322088, -10086194, 14206141, -14988362, -21119964, 14166413, -6347425, -30610768, -10931229, -5532455, 15786152, --28120762, 16225850, 11067594, 12953621, -12966506, -334471, -12824772, -5324686, -37592240, -8781061, -18743774, -59665148, -18709952, -1832340, -1006096, 2556579, -35840428, -8523899, -54151484, -4058744, -11095511, -15028627, -16723529, -6563247, 16710644, -5044976, -19329500, -21905944, -56537876, -19771346, -26916024, -24657408, -37961068, 32544040, -9763534, -42507828, 13303661, 39371428, -20490216, -8903467, -4984847, -27689118, 35281544, 16059420, 22680112, -11198590, -2216203, 12043625, 33600604, 16068010, -5513128, -10141492, -2077154, 38371776, 3927748, 6437619, -2539400, -21755620, -9667971, 18315352, --162672, 1669669, -3388729, -19365470, -1291175, 9174050, -12139725, 15221364, -18843096, -11663521, -4129074, -6121939, 10103911, 4586488, -17143362, 7698729, 8904541, 5267778, 3498788, -6453189, -4337917, 418222, -4056060, -11703786, 6295885, 5601174, -1259499, 9886478, -13477607, 2146947, --12902619, 966905, 3620658, -4006131, -2112587, -33286, 5304822, 1380295, -3763465, 839666, -46835008, 64849712, -10444287, -2272575, -25769266, -25910464, -44499084, 18507014, -7785702, 64788508, --14010183, -28383828, -39448200, 2017024, 11893301, -14731201, 11982422, 42276972, -17161078, -7836705, --30015378, -13770739, 28451474, 32921998, -33745020, -9729175, 16775069, -7475928, 7223598, -10239739, -41421200, 33230162, 70853536, 22953378, 31132070, -14270029, 22217328, 47900160, 15252503, -3320547, -10853382, -1867237, 31006442, 16179142, 45388140, 12664248, -46557984, 15989626, 17440252, 37810744, --21677236, -18336290, 21648246, 23683524, -11775190, 38026568, -13762149, 15476378, -42409044, 26403312, --10234370, 14397267, 14588930, 33339684, 28675886, -23283018, -24487220, -7926899, 34781720, 35372812, --13761612, -19881404, -38217692, -4458713, 26309896, 30093762, 19787988, -8977555, -25399362, -23825794, --4399657, 16337519, -16694538, 22835268, 5383742, 15915538, 2573759, -8296803, 17929340, 11381663, --2991445, -7843147, 5457830, 15358803, -22635552, 8925479, 10983842, 14978162, 8038568, 21221434, --7247758, 7429220, -10190347, -14696841, 8257075, 17874044, 15590731, 24028194, -419833, -386547, -7068980, 6338298, 42849280, 8184597, -1976759, -18867792, -46171, 27441620, 13845364, 21189222, -12249247, -668404, 260919, -4828617, -290984, 26409218, 21859236, 2240899, 8118025, -2738579, --4440996, 907312, 11099269, 8420820, 7353521, -5776731, -5647882, 6358162, -16513076, -53391276, -3159485, 80406080, 47834124, -11876658, -119198768, -17558364, -12576201, 8683887, -14024142, 1639604, -11864847, -5152350, 4839355, -26446798, 15992848, 19201188, 36190468, -27167816, -33984464, 34008088, -54432268, 13172128, -24862492, -33183992, -7436736, 7478075, 2632278, 7978439, -224412, 11368778, -4446902, 35115652, -11858942, -49969796, -21731998, 15076946, 5407364, -17792976, -21922586, 2085744, -22853520, 40438192, 37483792, -1618666, 293132, 14699526, -14958297, -43319040, 12592844, -27349278, -50707456, 55093156, -1430761, 14933601, 7715909, 10280004, -25013352, -4450123, 52930640, -20941724, -237834, -73186240, -9845139, 7255811, 16489453, 14805826, 14746233, -18837190, -11457362, 31765578, -47707424, -9422621, -2253784, 3672734, 19116362, 22385370, -11026255, 6859600, -26218628, -31802086, -3019899, 7410966, 11279658, -4809290, -4925254, -6897181, -6719477, 19946364, -205085, -5043902, --11135776, -1999844, 12939663, 10642929, -6346351, 14955076, 3663070, 23338852, 2007897, 3134253, -809064, -9842454, -7338489, -5563057, -5689758, -2945811, -7354058, -6462315, 1929514, 19061064, -23140210, 5494874, 12066711, 3123515, 4285304, 18516140, -14285598, 13682692, 5575405, 23336704, --6523519, 4956393, 4720706, -11654394, 8035347, -6405944, 8215736, -4458713, 13911399, -6526740, --8333847, 5064840, 3215857, 1539209, 5658083, 1589138, 9998684, -9664, 3915937, -173409, -3714073, 1387811, 3233037, 4275640, 4912369, -1441498, 1176284, -804770, 6467147, 2259690, -4908074, -1056562, 1348620, 826244, 3666828, 151934, 4112431, -1610613, 5600101, -6168647, --53310744, -22055730, 42681776, 47029892, 44675712, 60555816, 10432476, -26050588, -79852032, -60630980, --11390253, 16936666, 50661824, 55089936, 26081726, 1238561, -26783416, -23202488, -10268730, 17208324, -47295644, 26858578, -6196027, 1731409, -3818226, -25942676, -35476968, -29058674, 5488968, 43528956, -32728724, 65451008, 42599632, 42150808, 59340880, -17268990, -40935872, -46612208, -61869004, -76235672, --28739236, -8992051, 22681722, 41977936, 60658360, 56651692, 46071040, 29126320, 58273044, -11395085, --36785320, -1733019, -9344775, 15404974, 17656074, 69517264, 60742648, -22585086, 10924249, -15822660, --46452220, -13728326, 12379169, -27996744, 43246024, -17317846, 14401025, 3665755, -4891968, 37368364, -51979840, 41401876, 29185376, -21603686, -52487184, -59805808, 17111150, -25232396, 4650913, -2909840, -33795488, 5238250, 19152870, -16166257, -36753108, -34202972, -53565220, -46677168, 19877646, 11101954, -27087284, 40603012, 31722628, 1155346, -23861228, -38671348, -52279416, -28724204, -13282186, -19350976, -8746701, -7086159, -5971615, -6295349, -15790984, 53150, -6943352, -10669236, -12500502, -8146479, --1556926, 8252243, -15132244, -9682467, 3118683, 9179956, -3872450, 22256520, 2180233, -119514448, --125791000, -130835976, -134110888, -177188336, -19280108, -50153944, -12178917, 16506096, 80646064, 91672856, -94774896, 132698384, 183441280, 175785488, 172740896, 138797232, 100224136, 72837816, 21857088, -83758840, --40227200, -49497888, -30683246, -100583304, -16734803, -41647224, -45894948, -83232168, -63997160, -65076808, --58986544, -61582316, -108239080, -95819112, -56584584, -51129976, -64265060, -88972928, -13573170, -77911240, --147706608, -126525440, -111132816, -58563488, -75517336, -13486734, -152885264, -67681704, -67752032, -31289374, --22870164, -78702592, 3431142, -78851304, -9579925, 12279311, 36891084, 3305514, 37915436, 56691956, -89081920, 95020248, 130666328, 85416696, 205079856, 129629632, 238718048, 162337408, 237816096, 275922656, -327574464, 269124800, 270882528, 305371648, 273936768, 278276288, 270760096, 234825184, 135795056, 108569256, -76540616, 55870544, 65320548, 97582728, 53716620, -19820738, -34046204, -39198020, -67407368, -87371448, --106606992, -98105640, -161306624, -156182192, -160951216, -194863744, -171694544, -216455616, -191758480, -224902208, --231070320, -217597536, -240194432, -217130464, -242545392, -192454256, -188666640, -156304592, -166918000, -171956528, --121000504, -108269680, -82844552, -42172284, 14019310, 46000172, 40226664, 51495048, 45999636, 52050708, -59733332, 85480584, 102659384, 92863096, 83463560, 102145056, 94983736, 117499568, 106909256, 78176992, -71108016, 61879740, 54460184, 34305516, 25991532, 24237038, 15188078, 16736414, 6582575, 10861435, -9470403, 6522445, 9510131, 6947110, 4096325, 1489280, -3804804, -588947, -148713, -10206453, --16306380, -9359807, -8235600, -10747082, -10559177, -6575595, -7858180, -11259794, -15076946, -11584601, --7606387, -6247030, -4045322, -4896263, -3707094, -650151, 3100967, 5426691, 4970351, 2710661, -2294586, 5697811, 8583492, 6097243, 5935108, 2856690, 1320703, 3639985, 3057480, 3113315, -2414845, 2506650, 1003412, -1867237, 2601677, 6408628, 6189585, 7444789, 8042327, 11662984, -13684840, 13884556, 14847165, 15737834, 17164300, 18609556, 18673444, 17501992, 16856672, 18556406, -15053324, 13044353, 11529303, 9912248, 6659347, 5365488, 2188823, 1528472, -294205, -3491272, --6594386, -9566503, -10395431, -13165149, -13584982, -13288629, -13372381, -14816563, -15610059, -14462765, --14071387, -12804908, -11777337, -10839961, -9656160, -7499013, -5458367, -4122095, -3292629, -2326262, --1780801, -1297617, -1126355, -866510, -812286, -743029, -675384, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +1492501, -5924371, 1986422, -3758633, 944893, -2459943, -1562831, -3277597, 2268280, 3934190, +1120450, 1202054, -7319698, 1398549, 99858, 2235531, 2755222, 1493575, 4161823, -917512, +-2368675, 408559, 4980552, -2147, -3859028, -419296, 4237522, 2282238, 436476, 8053, +1177358, -141734, 304406, 791885, -155693, -1554778, -199716, 4832, 1654636, -2528125, +-5887864, 4299799, 4308926, 3749507, 3525095, -214748, 1916092, 3351148, -3576097, -832687, +-108985, -4767414, 1054951, 317291, 4272956, 415001, 2389613, 43487, 5377836, 2709051, +-802622, 3759707, 2278480, -1257352, -4415764, 1074279, 1137093, -1190780, 318364, -2528662, +-665720, 2225330, 1559073, 1844689, 4436165, -764504, -1411434, 580894, 2634963, 6077916, +-3598109, 1602023, 1641751, 1753420, -192200, -435402, 1877975, -1077500, 43487, 869731, +-1156957, -223338, 165893, 295279, -756988, -1156957, 706522, -301185, 134218, -438624, +1110249, -165356, 1322313, -340913, 1176284, -52076, 1112397, 11312944, -7581154, 2542621, +6362457, 1480153, 4480188, 5431523, -4958003, 1029182, -464930, 2108292, -6283537, -4985920, +-942208, 4867272, 6593312, -2541010, -2203318, 3160559, -5381057, -7182796, -1341104, -8445516, +2872796, 2793339, 746787, -5249524, -5352603, 1890323, -3124052, 715112, -177704, 5555004, +5849746, 5296232, -883690, 3710315, -5831492, 2523293, -3448859, -319438, 283468, 4533875, +-4924180, -4355097, 6442, 5965710, 2433099, 2328946, -3643743, 2019708, 1450088, -1762010, +-7490423, -1211718, -2561948, -3279745, -2983929, 3419868, -3172907, -1015760, 743029, 2123861, +5322002, -2053531, -162672, -4041564, -1995012, 838056, -5636608, -346282, 1490891, 3831648, +-1255204, -2901787, -1506460, -5828271, 2720325, 1712618, 297963, -472446, -5079873, 2077690, +375810, -1792075, 1790465, -712965, 403727, 1675574, 121870, 351650, 1899986, 872952, +356482, 57982, 1512902, 581968, -340376, 651224, 866510, 1803886, -3874061, -7121056, +-1682554, 1371168, -2110977, -3543348, -1909113, -7098507, -3943854, 7757785, -183610, -3260954, +4170413, -5992553, -1278290, -7504919, -1463510, -5888400, -3020973, 7183870, 492848, -1315871, +-7845832, -4848481, -1675574, -3293166, 1470489, -4121021, 537945, 2760590, 8570070, 4265440, +3291019, 3779571, 6961068, -5623723, 55835, -1599339, -4306242, 1950989, -782221, -1602023, +-4512937, 2541547, 4998805, 635118, -3416110, -2144263, 12601971, 177704, -3460133, -4868883, +-7356205, -9844602, -1118302, -5043902, 1323924, -886374, 2912525, 644782, 1474248, -4454418, +812286, 876173, 6164889, 2167885, -4387846, 381178, -1276679, -1213865, -948114, 2285996, +3366181, 3298535, -2828236, -2752537, 1946694, 991064, 1318555, 1434519, -1020055, -4293894, +-5062156, -485331, 1068910, -1110249, 672699, 165356, -572841, -965294, -1495186, -502511, +-179852, -848256, -1675574, 283468, 723165, -848793, 477815, -730681, 305480, -947577, +-405338, 343061, 418759, -1168231, 328565, -363462, -2198487, 373662, -684510, 1442572, +-880468, -571768, -221728, -17494476, 6842957, -3179350, 2860448, -7277285, -2960306, -5712307, +-5219996, 286689, -1678795, -3606162, 8831527, 2234994, -872415, -5456219, -1751273, 2428267, +-6216429, -3338800, -5921150, -3343632, 8445516, 753230, 5618354, -616865, -98247, -1502702, +1564442, 1490891, -4543002, -23085, 1311039, 2458869, 9175661, -4897874, -5619428, -1187559, +10154913, 3122441, 10810970, 874026, 965294, -2003602, 5324686, -1018444, 7866770, -892279, +-950262, -1510218, -3316252, 3265786, 990527, -2910914, 2268817, 2881386, 5457830, -3264712, +-302795, -1079647, 4860293, -2092723, -846645, -1937030, -1271847, 1076426, -1620276, 467078, +805843, -1294933, 1190780, -8193724, 758599, 5153424, 1829119, 6936909, 557809, 641024, +1683090, 4379256, 7173669, -4862440, 679142, -484258, 1687922, -336618, -186831, 2040646, +4652524, 1678259, 2281165, 135828, -812823, -1330366, 629750, 2244121, -827855, 954557, +1080184, 997506, -41876, 362388, 1985349, -469225, 527207, -199179, 2293513, 1207423, +-732292, -260382, 2469606, 1131724, -725850, 1678795, 1018981, -2318209, -3625489, -1736241, +26844, -8514236, -1333051, 185220, -4182225, -15150497, -3590593, -3186866, -6538551, -1195075, +-1599875, 9654013, -3204046, 7325067, 3494493, 5311264, -9697499, -4307316, -9799505, -9109626, +104153, 1831267, 5879274, -2683281, -4219806, -2567317, -6589554, 1530619, 3164317, 3604551, +2275259, -1937030, 2612414, -4378183, 597000, -7974144, 3028489, -1988033, 1219771, 1869921, +3129958, 3307662, -2966749, 212064, 7930120, -4098473, 3904125, 4063576, -142808, 2468533, +3961034, -1499481, 1631014, 3874061, 324807, 6764574, -3380676, -4539244, -2120103, 2267206, +98784, -8796630, -4387309, -9756018, -10590316, -1744294, 3015604, -8647917, 4009889, -1339493, +-35433, -2911451, 3042984, -5116917, -711354, -1739999, -7208029, -6387153, -2020245, 3908420, +244276, 3360275, -1263794, 2199023, 1824824, -3987340, 143881, -737124, 2415382, -2668785, +-4452808, -1431835, 745714, 58519, -1638530, 839129, -969589, -356482, 853088, -186294, +175557, -38655, -914828, -172872, -883690, -623307, -526670, 27380, 597537, 104690, +1427540, 547608, -502511, 5014911, -14106283, -595927, 4504347, 2871186, -7441031, -832150, +-4699231, 1317481, 1537598, 1112933, -8131447, -10937134, -7409893, 1369558, -5901822, 6649683, +2183991, -10532334, 7771207, 6797323, 5425081, 4838281, -5163625, 8713952, 2391760, 7516, +-3251290, 2990908, 5290863, -4675072, -6853157, 2647311, -2512019, -8567386, -1035087, -8266739, +-2917894, 15158013, -3904662, -6718403, -8288213, 533650, 1500554, 6067715, 2518998, -5464809, +5157182, -581968, -4211753, -5687611, -5971615, 9356049, 4294968, 5916318, -4294431, -6009196, +2875481, 1557463, -6102612, -264677, -3686693, 6061273, -1016834, 583579, -7231651, 4756140, +4089346, -4152160, -2552821, -2561948, 8499740, 140660, 1377611, -2373506, 5874979, -5807870, +-9782862, -4400731, 1018981, -1871532, 5573794, -1082869, -465467, -5765457, -2898566, 2535105, +492848, -4099546, -2530810, 3541201, 2062658, -1099512, 318901, 69256, 166430, -1120450, +1695975, 690416, 2544768, 387621, 584116, 91805, 1201517, -480499, 1660542, -1946157, +2212445, -223338, -1101122, -7836705, -548145, 1662689, -2126546, -6310381, -9254581, -7463043, +7077569, 626528, 8725226, 10449655, 10150081, 1347009, 14012868, 3190087, -1791001, 6354404, +4812511, 12920872, 1686848, 7333120, -10581726, 16850768, 12357158, 5847061, -5388574, -4336843, +5965710, 1198296, 4223027, -2765422, 7162395, -2426120, -2112050, 6397354, 5181878, -6971269, +4343286, -2031520, 6975027, 7564511, -15479599, -3045669, 9229348, 2614561, 4939213, 3812857, +9139154, -4734665, 3554086, -52613, -8041790, -4057670, -401579, 1410897, -11718281, -1203665, +7112466, -5989869, 12064563, 8952322, -3878892, -333397, 2170569, 4368519, 6973417, -2994129, +-2484639, 11360725, -2911451, -463320, 4871030, 12885, 6607807, 5172215, 2061047, 3505230, +3739843, 3500398, 1559610, 1358283, -1778653, -2931315, -1300301, -2690797, -453656, -1948305, +1122597, 931471, -2616172, -2168959, -451508, 1641214, 3631395, 2935610, 1637993, 131533, +1728188, -3490735, -1626719, -1981054, 571231, -1500017, 1538135, -4022774, 263604, -296890, +3124052, 1077500, 15032, 336081, 3245922, 808528, -3071439, 738198, -413391, 560493, +2719251, -314069, 754841, -275415, 29577830, -15651398, 2049236, 12123082, -1290638, 318364, +16097001, 17642652, 2001992, -1480153, 3633542, -980863, 3913252, 4976794, -6594386, -2120103, +10393284, 9133248, -4424353, -8577050, -9125195, -9504763, -5153424, 7656316, -6088116, 3280818, +328565, -11091216, -826244, -7419556, -962610, 2999498, 4720169, -14348949, -6760816, -11455752, +-3597035, 16991964, 2387465, -1693291, 1441498, -1704028, 766652, 4910222, 2892124, 8403640, +-535260, 6238977, 3734474, -6123013, 3712462, -9238475, 186831, -9280887, -9577240, 3431679, +-10528575, 4236449, -185757, 5162014, 4177930, 3673808, -5645735, 6339372, -9546102, -372588, +-4427038, -1656247, 11859478, 246424, 5912023, 5725729, -1260573, -2448131, 4560719, -10035728, +3900904, 9182640, -14001057, -10450192, -2887292, 6892886, -692564, -8776229, 3205656, -1450625, +3648575, -3361349, 1101122, -1999844, 6133214, -1356136, 5640366, 2923799, 5268851, 1620813, +1449015, -2996277, 3566434, 1378685, -134755, 1885491, 1804423, -1250372, 2665027, 1873680, +-1305670, -1628866, -4566087, -1180042, -2605435, -323196, -110059, -1780264, 2355253, -1042066, +1387274, 259309, 4778688, -4011500, 1793149, 561567, 216359, -601295, -17520246, 3508452, +4491999, -11767674, 5619965, 127775, 12763569, -3105261, -6175089, 5521181, -15307800, -5129802, +13296682, 5949604, -7758322, -18956912, 8739722, -2458869, 4892505, -12020003, -16000364, -10790032, +14227079, 1357210, 7939784, -1139240, -7221988, -10810970, 5401458, -2730526, -9386651, -11004243, +1015223, -9800578, -7493644, -3992172, -1777043, -10635950, 6278706, 7458211, 10009421, -4483409, +8920110, -6813429, 13998372, -2359011, -533113, 10718091, 5612449, -2396592, -6862821, -3334505, +10353556, 2552821, -7336341, 3810173, 10986526, 10397579, 4588636, -12252468, -13549011, -1026497, +2881923, 1059783, -9693741, 3172370, 11140608, 3368865, -4447976, -17415018, 4921496, -7461969, +-16973174, 739808, 1131724, -9509058, 14183056, -807991, -5530308, -18847928, 98784, -5405217, +-667331, 7352447, -4046933, -7084549, -269509, 1839857, 1946694, -5575942, -5633924, -5615133, +2369748, -4820564, 540629, -708133, 1045825, -1198296, 1634235, 2756832, 2503966, 3122978, +1678259, 5457293, 6920266, 573378, 2199560, 1423782, -2375654, -532039, -1892470, 1014686, +967441, 589484, -6263136, 963683, -316217, -2174327, -73551, -1934883, 2196876, -2408403, +-2494302, -1831267, -21760988, 13952201, 10799695, 11878806, 1843615, 12546136, 1438814, -7718056, +-8976482, 1590749, 10091563, -6627135, 2490007, -14579266, 10333154, 10983305, -5233955, -2829847, +2675228, 12013024, 8784819, -5854578, -5252745, 8295730, -9481677, 3591130, -13033078, 234613, +-3706020, -17471390, -18092550, 3814468, 10761041, 5164162, -15416785, -8151311, 12154757, -12962748, +-5283884, 10895795, -2648921, 13554380, -4452271, -8973797, 3704409, -13178570, 15729244, -1349694, +2962991, -6961605, -3475166, -323733, -14344654, -8579734, 1379758, -2048699, 1661079, -4393752, +-15242839, 3234110, -12586402, 6043019, -3021510, 9573482, -15216532, 7282654, 2836289, -4041027, +11687143, -1098975, -7705172, -14794015, -1851668, 3690451, -12036109, 9394167, -8075076, 6225555, +-15912854, -16091632, 8005282, 6608881, -6407555, -4813048, 5398774, 3935264, -3333968, -2563559, +-4270808, -5341329, -367220, -8809515, -819802, -961536, 836982, 2909304, -1555315, 2940442, +-1628330, -204011, -4824322, -2093797, -1214402, -276489, 7455527, -1804960, -900869, 4602058, +-4453881, 3541201, 1947231, -1403917, -993748, -4233764, -4150012, 184147, -2383707, 1025423, +396748, -1677722, -2929168, 7162395, -6970195, 2381559, 8523899, 12586402, -3326452, 1396401, +-4467840, -16807280, -3590056, -3597572, 7302518, -14762876, -43487, -8516920, 9162239, -10327249, +-14083198, 9367861, 4300873, 6094559, 19396072, -3197066, -5562520, 5474473, -12424267, -14489072, +1193464, 18564460, 5645735, 10423886, -7406671, -9109089, -14759655, 2953327, 18846316, -8442832, +9850507, 2268280, 14653892, -22416508, -7129109, -371515, 2632815, 12774843, 6158983, -17082158, +-4629438, -7925289, -679679, -19668802, -3095598, -7076496, 1357210, -10348724, -690416, 2409477, +-28724742, 3297998, -9008694, 1770063, -11372000, -612570, 7060390, 3615826, -3870303, -3632469, +-15151034, 15235323, 14627048, 4833449, 3643743, -13133473, 20059108, 6997039, 10337986, -3940633, +-31590558, 12321724, -1088237, 23707146, 22252762, 7033546, -2865817, 9819369, 512712, 8601746, +455803, 998043, -5596343, 2688650, -5113159, -2713346, -1431298, 10346576, -155156, 639950, +2645700, -638876, -5586142, -2852395, 942745, 4206921, -1981591, 2103997, -3283503, 4378183, +-3435437, -5248987, -2690260, -742493, 2451890, 972810, -1140851, -897648, -1167157, 6836514, +-1500017, 411780, 1117228, 3419331, 27197344, 9589588, 18613314, -18063558, 4197794, 18979460, +-5704254, -6840273, 2682744, -11737072, 8961986, 2270964, -13707388, -17948668, -1348620, 15223512, +-394063, -1226750, 9960566, -14872935, -3789235, -12243341, 6876780, -20864414, 344134, -4460861, +7588134, -21791590, -15055471, -9522479, 6386617, 7012608, 4853850, -7069516, 5295158, -5259725, +6460168, -4314832, -1909113, -1501091, -6119792, 4145180, 9643275, 5740761, 9708237, -800475, +-9418326, 1341104, -9378061, 24981140, -6314676, -24575802, -7656853, 6715718, 21344376, -21365852, +-8809515, -1393717, 13724568, 877247, -30235496, -3714073, 13952738, 28815472, 1066763, 20060182, +28903520, -2152852, 9303973, 13654775, -3780645, 24630026, -3310883, 29743722, 4736812, -8175470, +-25797722, -16162499, 191663, 7756174, 3706020, -3929895, -5013838, -8019241, -10941966, -9727027, +11832635, 3457449, -144418, -16965658, -1916629, 620086, -3096672, -9650792, 2517388, 5101885, +-1461363, -5004174, -3648038, -9455907, -5707475, -2784750, 5953362, -1173063, -5145908, 5150740, +-7392713, 5308580, 5365488, -4638565, -8959839, 8181376, 12164421, 1855963, 373125, 733366, +7088307, -2121177, -8473434, 992674, 8216273, 6799470, -8412767, -7150047, 1312649, 1342714, +122407, 2427194, -1313723, 11399380, 13807246, -23792508, -23147190, 6088116, -5429376, 698469, +-9234717, 21537114, -9724880, -6226092, 7458748, 5371931, 171262, -9892383, -7255274, -12031277, +4800700, -724776, -5840082, -987306, 14305999, 21508122, -23328652, -1517197, -22757958, -2450816, +-5908802, 22494354, -9546639, -9120900, -4411469, 13677860, 4517769, 3751654, 5713380, 5454072, +-4103305, 238371, -2982855, 3628711, -2722473, 21054466, -5525476, 5565204, 14816027, -7764764, +-17071958, 3759707, 5776731, -6026913, -6565395, -1457068, 3475166, 10663867, -14625974, 19531364, +28742994, 19297288, -8104067, -11674795, -26667988, -34410204, -12676059, -164283, -6247567, -1775969, +-3942780, 8185671, -741419, -13312251, 6944425, -5914707, -1293859, 12581033, 21013664, -5187247, +5884642, -3737695, 1123671, 19122806, 9648644, 16349330, 16650514, -13365938, -4130685, -3090229, +443992, -341987, 5907191, 373125, 3609920, 16763794, 670015, 7813083, -3590593, -3724274, +-6911676, -2149094, 948651, 7616051, -2154463, -6404870, -3025268, 3648038, -2675228, -1463510, +-2003065, 2291365, 576599, -2507187, -1364189, 1683090, 820876, 844498, 9659918, -4001836, +209917, 1223529, 110059, -5379984, 2414845, 2984466, 6156836, -12347494, 23041962, 10311143, +13066901, 19665582, 30434676, -11826729, 15701327, -31532040, -3968550, -14196478, -30990874, 12410845, +7218230, 9316321, 4032974, 12154757, 3638374, -22325240, 18624052, 32986960, -5049808, -5412196, +7999914, 3195993, -7010997, -29579976, 2314451, 13959, -2784213, 308164, 9929964, -21172042, +4460324, 5898064, -4440996, -12249784, -6033892, -13641890, 13696114, -30361124, -4496294, -19559282, +10706817, 4289062, 10858751, -3940633, 2877628, -7827578, 18417894, 5492190, 15099494, -13922673, +14839649, -423591, -14748918, 30151744, -5123359, 3619584, 20307680, -19704236, 22775674, 13597866, +-18053896, 7488813, -6972880, 9979357, -24968256, 18088254, 2460480, 6306086, -2448131, 5806796, +-20299626, 12775917, 22803592, -45610944, 4537096, 43848396, -28486908, -9178882, 2983929, 21338472, +15065672, 5211406, 13147969, -6056978, 7880728, -3398393, -9834938, 4741644, -2293513, -1697049, +8138963, 11922292, -1149441, -4719632, -4119948, 3488587, 7521562, -10198937, -3925063, -6994891, +-4443144, -9121437, 8946417, 11932493, -2653216, 5469641, -3536369, 2196876, 7499550, 8567923, +-10041634, 806380, 3542811, -5238250, 7752953, 376347, -287226, 7114077, 3519726, -8607114, +-7314330, 2423972, 1013075, -2605435, 1329829, 18446348, -11157788, -13433584, -424128, -12860206, +-5848135, -33989836, -29018946, -4002373, -16648904, -19978040, -14416058, 8876087, -5135171, -10113574, +-16248935, 15007153, 1004486, -24539296, -3875134, -137439, -11684995, -3672734, 9956271, 7162932, +-1732482, 93416, 459025, -6156299, 5228586, 11462731, -4305168, -2729452, 17582522, -33043868, +-5395016, 9308805, 35229468, -14585709, -9155797, -13139916, -17898202, 7808788, 37381248, 6954626, +23148264, 4793721, -3822521, -1944010, -2787434, -18033494, 3934190, 4095788, -14712947, 3268470, +29185376, -4724464, -9034464, 4913443, -10515691, -2390686, 25738128, 38109244, 10251013, 22885734, +26400628, -9361955, -11070815, 3031173, -8767102, 1522566, -26181046, -213138, -20411296, 6216965, +4212826, 12435541, -21251498, -7904888, -7278896, -8288213, -6687801, -7414724, 11764989, 2569464, +15175730, -3842385, 5752572, 15246597, -2850248, 564251, -2264522, -6017786, -4919348, -801011, +-3733937, -5528160, -159451, 2333241, -2942053, 1056025, 7041062, -7100118, -6561637, 521839, +5256503, 2800319, -3503620, -10531797, -10359998, -1223529, 2330557, -6230924, -3579318, 2257005, +-2216740, 1150514, 661425, 7271380, 2334315, 1883880, -8013872, 8814884, -3785477, -8501888, +26737246, 30245696, -12577812, 68828464, -9819906, 1272921, -13112535, 7831873, -5732171, 7726646, +17435420, 4725538, -16884590, -9300752, -17628694, -592169, -12074227, -21740588, 2551211, 13606993, +-2677375, 3746285, 6276021, 7856569, -452045, -6483790, -8406862, 3808562, -380105, -10984379, +3867618, 29426432, 20679730, 11647414, -25535192, 17805860, 13821205, -6940667, -8021389, -8005282, +-10413148, -4632659, 7839926, -18540836, 1415192, 1982664, 10621454, 28045062, 5142150, 5583458, +1211181, -3680787, -6065031, 12000139, -7781944, 28326384, 8873939, -3054259, 12202002, 2095407, +-19617800, -14159433, 15935402, 18470506, 6638409, -4976257, 12140799, 13134010, 18784040, 37072012, +3679176, -11020349, -19534048, -13109851, 9377524, 1831804, 2816962, -2055142, 12813498, 1118302, +-1921461, -17710298, -8915278, 17883706, 20045150, -7531762, -14159433, -16798154, -5108864, 8599061, +5264556, 1365263, -5908802, 1171989, -319975, -7582228, -243739, -16425029, -4513474, -877247, +11292006, -2347200, -3817689, -168577, 9103183, -5887864, 6439230, -3753802, -7891466, 6324340, +8996346, 5739687, 6277632, -1087701, 6743636, 13111461, 5531381, 5465346, 3532074, -5162014, +-2521683, 138513, -1480690, 3783866, -4051765, 6325950, 8170639, 4778688, 332860, -6649146, +2250026, 2123325, 6577743, 10770167, -11177652, 48993764, -7785165, 1646583, 5051956, -4188130, +-1111860, 11940546, -9613747, -11333345, -6120866, 15535970, 13879724, -38677256, 6968048, 6083285, +15235860, -10230075, -15476378, -14821932, 10545755, 9440875, -15795816, -8871792, -6707129, 25275346, +12568148, 6785512, -5357435, -27084600, 7185481, 6267968, 13376676, -3739306, 6945499, -7828652, +2246805, -23584202, 9266392, 9031779, -2684, -6174553, -14856292, -29223494, 18335216, -12561169, +9269076, 9416179, 16167868, 1869385, -17864916, 28766618, 5400922, -28971702, -13555454, 16653199, +3753265, 21934398, 9151502, 3263102, -20646444, -10477573, 11056320, -35807144, 37807524, -27637040, +1248225, 22441740, -6434935, 44905492, 6508486, 7797513, -16702591, 52381960, 5228049, 33933464, +-23597088, -10855530, -7609072, 12990129, -1687385, -5765994, 23698556, -20206748, 22852448, -27833536, +5669894, 2403034, 4774930, -5698885, 20132660, -2829847, 10158671, 8766565, 13308493, 7306276, +3765076, 9086540, 10358924, -8053, 3692598, 791885, -7312719, 8667244, 106837, 5838471, +12604118, 6018860, 659814, -1036698, 9623948, 10119480, 5114233, -6383932, 21254720, -1372242, +-4418448, -4581657, 13601625, -10849087, 4642860, -2731062, 7258495, 29528, 2943126, 3612604, +-3048890, -2795487, 1978906, 3643206, 3438121, 3825205, 5404143, -5700496, 17769890, 41198936, +13955422, 26038240, 33046016, -956167, 37830072, -28387586, -9922448, -10406169, -9133785, 4456566, +6509023, -2017024, -12343199, -24342800, 24184424, 22916334, 9916006, 20744692, -32855962, -28322088, +10086194, 14206141, -14988362, -21119964, 14166413, -6347425, -30610768, -10931229, -5532455, 15786152, +-28120762, 16225850, 11067594, 12953621, -12966506, -334471, -12824772, -5324686, -37592240, -8781061, +18743774, -59665148, -18709952, -1832340, -1006096, 2556579, -35840428, -8523899, -54151484, -4058744, +11095511, -15028627, -16723529, -6563247, 16710644, -5044976, -19329500, -21905944, -56537876, -19771346, +26916024, -24657408, -37961068, 32544040, -9763534, -42507828, 13303661, 39371428, -20490216, -8903467, +4984847, -27689118, 35281544, 16059420, 22680112, -11198590, -2216203, 12043625, 33600604, 16068010, +5513128, -10141492, -2077154, 38371776, 3927748, 6437619, -2539400, -21755620, -9667971, 18315352, +-162672, 1669669, -3388729, -19365470, -1291175, 9174050, -12139725, 15221364, -18843096, -11663521, +4129074, -6121939, 10103911, 4586488, -17143362, 7698729, 8904541, 5267778, 3498788, -6453189, +4337917, 418222, -4056060, -11703786, 6295885, 5601174, -1259499, 9886478, -13477607, 2146947, +-12902619, 966905, 3620658, -4006131, -2112587, -33286, 5304822, 1380295, -3763465, 839666, +46835008, 64849712, -10444287, -2272575, -25769266, -25910464, -44499084, 18507014, -7785702, 64788508, +-14010183, -28383828, -39448200, 2017024, 11893301, -14731201, 11982422, 42276972, -17161078, -7836705, +-30015378, -13770739, 28451474, 32921998, -33745020, -9729175, 16775069, -7475928, 7223598, -10239739, +41421200, 33230162, 70853536, 22953378, 31132070, -14270029, 22217328, 47900160, 15252503, -3320547, +10853382, -1867237, 31006442, 16179142, 45388140, 12664248, -46557984, 15989626, 17440252, 37810744, +-21677236, -18336290, 21648246, 23683524, -11775190, 38026568, -13762149, 15476378, -42409044, 26403312, +-10234370, 14397267, 14588930, 33339684, 28675886, -23283018, -24487220, -7926899, 34781720, 35372812, +-13761612, -19881404, -38217692, -4458713, 26309896, 30093762, 19787988, -8977555, -25399362, -23825794, +-4399657, 16337519, -16694538, 22835268, 5383742, 15915538, 2573759, -8296803, 17929340, 11381663, +-2991445, -7843147, 5457830, 15358803, -22635552, 8925479, 10983842, 14978162, 8038568, 21221434, +-7247758, 7429220, -10190347, -14696841, 8257075, 17874044, 15590731, 24028194, -419833, -386547, +7068980, 6338298, 42849280, 8184597, -1976759, -18867792, -46171, 27441620, 13845364, 21189222, +12249247, -668404, 260919, -4828617, -290984, 26409218, 21859236, 2240899, 8118025, -2738579, +-4440996, 907312, 11099269, 8420820, 7353521, -5776731, -5647882, 6358162, -16513076, -53391276, +3159485, 80406080, 47834124, -11876658, -119198768, -17558364, -12576201, 8683887, -14024142, 1639604, +11864847, -5152350, 4839355, -26446798, 15992848, 19201188, 36190468, -27167816, -33984464, 34008088, +54432268, 13172128, -24862492, -33183992, -7436736, 7478075, 2632278, 7978439, -224412, 11368778, +4446902, 35115652, -11858942, -49969796, -21731998, 15076946, 5407364, -17792976, -21922586, 2085744, +22853520, 40438192, 37483792, -1618666, 293132, 14699526, -14958297, -43319040, 12592844, -27349278, +50707456, 55093156, -1430761, 14933601, 7715909, 10280004, -25013352, -4450123, 52930640, -20941724, +237834, -73186240, -9845139, 7255811, 16489453, 14805826, 14746233, -18837190, -11457362, 31765578, +47707424, -9422621, -2253784, 3672734, 19116362, 22385370, -11026255, 6859600, -26218628, -31802086, +3019899, 7410966, 11279658, -4809290, -4925254, -6897181, -6719477, 19946364, -205085, -5043902, +-11135776, -1999844, 12939663, 10642929, -6346351, 14955076, 3663070, 23338852, 2007897, 3134253, +809064, -9842454, -7338489, -5563057, -5689758, -2945811, -7354058, -6462315, 1929514, 19061064, +23140210, 5494874, 12066711, 3123515, 4285304, 18516140, -14285598, 13682692, 5575405, 23336704, +-6523519, 4956393, 4720706, -11654394, 8035347, -6405944, 8215736, -4458713, 13911399, -6526740, +-8333847, 5064840, 3215857, 1539209, 5658083, 1589138, 9998684, -9664, 3915937, -173409, +3714073, 1387811, 3233037, 4275640, 4912369, -1441498, 1176284, -804770, 6467147, 2259690, +4908074, -1056562, 1348620, 826244, 3666828, 151934, 4112431, -1610613, 5600101, -6168647, +-53310744, -22055730, 42681776, 47029892, 44675712, 60555816, 10432476, -26050588, -79852032, -60630980, +-11390253, 16936666, 50661824, 55089936, 26081726, 1238561, -26783416, -23202488, -10268730, 17208324, +47295644, 26858578, -6196027, 1731409, -3818226, -25942676, -35476968, -29058674, 5488968, 43528956, +32728724, 65451008, 42599632, 42150808, 59340880, -17268990, -40935872, -46612208, -61869004, -76235672, +-28739236, -8992051, 22681722, 41977936, 60658360, 56651692, 46071040, 29126320, 58273044, -11395085, +-36785320, -1733019, -9344775, 15404974, 17656074, 69517264, 60742648, -22585086, 10924249, -15822660, +-46452220, -13728326, 12379169, -27996744, 43246024, -17317846, 14401025, 3665755, -4891968, 37368364, +51979840, 41401876, 29185376, -21603686, -52487184, -59805808, 17111150, -25232396, 4650913, -2909840, +33795488, 5238250, 19152870, -16166257, -36753108, -34202972, -53565220, -46677168, 19877646, 11101954, +27087284, 40603012, 31722628, 1155346, -23861228, -38671348, -52279416, -28724204, -13282186, -19350976, +8746701, -7086159, -5971615, -6295349, -15790984, 53150, -6943352, -10669236, -12500502, -8146479, +-1556926, 8252243, -15132244, -9682467, 3118683, 9179956, -3872450, 22256520, 2180233, -119514448, +-125791000, -130835976, -134110888, -177188336, -19280108, -50153944, -12178917, 16506096, 80646064, 91672856, +94774896, 132698384, 183441280, 175785488, 172740896, 138797232, 100224136, 72837816, 21857088, -83758840, +-40227200, -49497888, -30683246, -100583304, -16734803, -41647224, -45894948, -83232168, -63997160, -65076808, +-58986544, -61582316, -108239080, -95819112, -56584584, -51129976, -64265060, -88972928, -13573170, -77911240, +-147706608, -126525440, -111132816, -58563488, -75517336, -13486734, -152885264, -67681704, -67752032, -31289374, +-22870164, -78702592, 3431142, -78851304, -9579925, 12279311, 36891084, 3305514, 37915436, 56691956, +89081920, 95020248, 130666328, 85416696, 205079856, 129629632, 238718048, 162337408, 237816096, 275922656, +327574464, 269124800, 270882528, 305371648, 273936768, 278276288, 270760096, 234825184, 135795056, 108569256, +76540616, 55870544, 65320548, 97582728, 53716620, -19820738, -34046204, -39198020, -67407368, -87371448, +-106606992, -98105640, -161306624, -156182192, -160951216, -194863744, -171694544, -216455616, -191758480, -224902208, +-231070320, -217597536, -240194432, -217130464, -242545392, -192454256, -188666640, -156304592, -166918000, -171956528, +-121000504, -108269680, -82844552, -42172284, 14019310, 46000172, 40226664, 51495048, 45999636, 52050708, +59733332, 85480584, 102659384, 92863096, 83463560, 102145056, 94983736, 117499568, 106909256, 78176992, +71108016, 61879740, 54460184, 34305516, 25991532, 24237038, 15188078, 16736414, 6582575, 10861435, +9470403, 6522445, 9510131, 6947110, 4096325, 1489280, -3804804, -588947, -148713, -10206453, +-16306380, -9359807, -8235600, -10747082, -10559177, -6575595, -7858180, -11259794, -15076946, -11584601, +-7606387, -6247030, -4045322, -4896263, -3707094, -650151, 3100967, 5426691, 4970351, 2710661, +2294586, 5697811, 8583492, 6097243, 5935108, 2856690, 1320703, 3639985, 3057480, 3113315, +2414845, 2506650, 1003412, -1867237, 2601677, 6408628, 6189585, 7444789, 8042327, 11662984, +13684840, 13884556, 14847165, 15737834, 17164300, 18609556, 18673444, 17501992, 16856672, 18556406, +15053324, 13044353, 11529303, 9912248, 6659347, 5365488, 2188823, 1528472, -294205, -3491272, +-6594386, -9566503, -10395431, -13165149, -13584982, -13288629, -13372381, -14816563, -15610059, -14462765, +-14071387, -12804908, -11777337, -10839961, -9656160, -7499013, -5458367, -4122095, -3292629, -2326262, +-1780801, -1297617, -1126355, -866510, -812286, -743029, -675384, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 17017198, -2232309, -5614059, 2633889, 2989834, 1023813, -7104413, 3218541, 5006858, -5430450, -1642825, --6649683, -1478543, -2834142, -2451890, -970663, 346282, -245350, 653372, 2370822, -2976949, -1307281, -6817724, 2325188, 4154844, 874563, -1809255, -5523865, 3578782, -2434710, 5802501, -4955856, -237297, -2326262, 4725538, 5523328, 4429722, 4489852, 1095217, -3467112, 1058173, -4246649, -1812476, -3621731, 3216394, 5122822, -2281702, 2668785, -5871757, -496069, -5153961, -3485366, -6852084, -1857573, -1299765, 2323041, 3374234, 2397129, -223875, -3631932, 413391, --5019206, -3333968, 902480, -650151, -3031710, 1618666, 1682017, 399969, 3145527, -2843805, -1346472, -3830574, -1520955, -1648194, 2079838, -2001992, -4034585, -1835025, -1511829, 5500243, -4743792, 1174137, -2538863, 295279, -307627, 933619, 1897302, 317828, 94489, 302795, --91268, 46708, -724239, 518080, -2131378, 64961, -174483, 837519, 443992, -689342, --939524, 156766, 369904, 367220, -179852, 19327, -428423, 9742060, -9768903, 396211, -197569, -2454574, -2915209, -3105261, 1038308, -5493800, -5420786, 795643, 2668785, -176094, -3157875, 2469069, -2969970, 1260573, -10718628, -2601140, -2377265, -2472291, -3362960, -3707094, --9444096, -7327214, 1033477, 2245194, -484794, 5155035, 4123169, 1754494, -1800128, -991601, -4825933, -1823751, 619549, -668404, -5019206, 1719598, -1663763, -3403762, -1303523, 4156992, -9988483, -3766150, 1137630, 2459406, -1817845, 3171297, 1427540, -3447248, 2055142, -8199093, --3787088, 128312, 3393024, 5266704, -3180960, -1451162, -333397, -11897059, 2063732, 6207302, -357556, 933619, 3400540, -1903744, 5294084, 7144141, -875100, 2057826, 4294968, 4093641, -830002, 260919, -1957968, -2811593, -1757715, 1298154, -2690260, 5974300, 4010963, -92879, --2877628, -1445793, 3441343, 4060355, -1990181, 3160022, -1877975, 889058, -1915019, -1132798, --1306207, 415538, 111132, 271657, 287226, -180389, -623844, -462783, -2564096, -8380555, -1950452, 314606, -8106751, 1250372, 4553739, 6700149, 1725503, -4804995, 11347840, -1513439, --2228014, 5340792, -3289408, -3199751, 551903, -4131759, 5060545, 5063230, -2039036, -7619809, --3765613, 3808026, -4908074, 10800769, 9315784, -7431367, -9102646, 338229, 1707786, -8654359, --563178, 3593814, 2434173, -4230006, -2464774, 9960566, -1052804, 6860674, -676457, -2209761, --2310156, -5108327, 894427, -712965, 5369246, -4565550, 1243930, -1184874, 999117, -2681670, --352724, 4545149, 3599720, -5652714, 8834748, 747861, -39728, -121870, -808528, 2415919, --1217623, -7888245, -1122597, -4155381, 6888591, 2907156, 179315, 8483634, -4682051, 5682779, -5565741, 534723, -4118874, -818191, -877784, -65498, -1173063, -1682017, 2338610, 2505577, --3741454, 1819992, -222801, 2651069, 2315524, -738198, 360240, -1131724, -1759863, 1282585, --1620276, -1335198, 690416, 1804960, -1636383, -1186485, -2128693, -880468, 1274532, -778463, --313533, 59056, 644782, -1143535, -673773, 1672353, 539555, -312459, -520228, -1806571, --78383, 965294, 552977, -20148228, 4707821, 1150514, 14471892, -712428, 5855651, -7682086, -1735167, -5740224, -1322850, -2779381, -848256, 2712272, -1490354, 2537252, 4923107, 3774203, -13743895, 9504763, -6140730, 3201898, -264677, 2590402, 1682017, -1679332, -13519483, 3507378, --625455, -66035, 5226439, -743029, -3721589, -2569464, -572841, -4153770, -2199023, -10792179, --2478196, 352724, -3766150, -614717, 4570382, 6508486, -2013803, 8026757, -5885179, 1377074, -2789045, 1109712, -1777580, -4123169, 3033858, -986232, 1895691, -3046206, -4360466, 893890, -2649458, -4405026, 4336307, -2988224, 10229538, 10847477, -3206730, 4003983, 4209605, -490163, --1327682, -1377611, -13097503, 5573257, 5422396, 232465, -2145336, -5429913, 649077, -1544041, --6638946, -14960445, 1058173, -3655017, 3927748, 70867, 10737, -2439005, -1627793, -2757369, --209380, 1614371, -1889786, 2363306, -2343442, -1325534, -947577, -526134, 1301375, 1096827, --741956, 548145, 410706, 901406, 1413581, 1114007, -631360, -1516124, 1203665, -594316, --1117228, 517007, 461172, -622233, 910533, 1442035, 537945, -103616, -4363150, -6641630, -6558415, 3723200, -610959, 7588671, -4124242, 6804839, -7738458, -7425999, 3562675, -11830487, --4217121, 2944737, 7145215, 9357123, -1677185, 6977175, -282931, 6644315, 2427730, 1055488, --1138166, 336618, 6619082, -3202972, -741956, 1184337, 536334, -6589554, -858993, -3586835, -13526463, -6512244, -6616934, -1621887, 6352257, 6411313, 5482526, 7369627, -1324461, 1334661, --1685238, -3692598, 2753611, -353261, -745177, -4218732, 10596758, 6541772, -3335579, 2007360, -3098819, -5633387, 1145146, 4117263, -1094680, 7964480, -3271691, -1053878, -8726300, -3291019, --7427072, 313533, 10128607, -4021163, 2824478, 1728724, 301721, -2791729, -993211, 77309, --2538863, 4874251, -5073430, -2380486, -498216, 10719701, 1647657, -74625, 3336653, -2931852, --8104604, 1987496, 757525, -1290638, 529892, 1970316, -586800, 399969, 3859028, 734976, --369904, 925565, 1611, -528818, -991064, 3629784, -234613, 302258, -3379603, 2013803, -456340, 2005750, -550293, -1366337, -467615, 1020055, 1585917, 1066763, -2767033, 135828, -1858110, -590558, -3475702, -2298881, -19144280, 13739600, 1370632, -7095286, -16918950, -1759326, -341450, -10041634, -985695, 4555887, 3864934, 282931, -2967286, 3590593, 11943230, 12124693, --5318780, -5818607, -13326210, 2565169, -2476586, 12778065, -5331128, -364535, -3109020, 4760435, --1534914, -13259638, 4235912, -697395, -7904888, -70867, 1139777, -1148367, -1425392, -5495411, --7638063, 4508105, 1039382, 5920076, -5308580, 10016937, 4694400, -2161442, -9039832, -1851668, -3135326, 9795747, 2964064, -5658620, -2644089, 4511863, 2863133, -2942590, -1498944, 4760971, -3860639, 5029944, 9681393, 10843182, 5234492, 5738613, 6610492, -4005057, 872415, -7300371, -7124814, 1065689, 3549254, -5236102, -8130373, 1761474, -10365904, -3771518, -4580046, 7460895, -7791608, 8193724, 2066416, -2415919, -2726231, 7649874, 1462973, -1152662, 1836099, -2505040, -4822712, 184147, -184684, 1549410, 1913408, -839129, 3929895, -73551, 570157, -2011655, --1283122, 1043140, 3038689, -264141, 1025960, 1756105, 933082, 538482, -1071594, 1439351, --1384590, -2007360, 1589675, -6840809, -392990, 12840342, 7898982, 10858751, 2076617, -11848204, --3898757, 12610024, -3620658, -7961796, -8301098, -8167954, -8648454, 4779762, 4849018, 3124589, -2855080, 2957085, 12126303, -1478543, 5267778, -10387378, -11702175, 7862475, -409633, -6370510, -464930, -16291885, -5320928, -5474473, 2008971, -551903, -1501091, -11454678, -7508677, 1296006, -7929047, 12902082, -5105643, -5029944, 6864969, -8820789, -632971, -427886, 2961380, 5659693, -4597763, 8952322, -4792647, 12968117, 6104759, -13960254, 6986838, -7747584, -9278740, -7690139, --11224360, 10184441, 2383707, -11933567, 1364189, 2552284, 1104880, 1923609, -2198487, 8453033, --4893579, 6505802, -10413685, 7923678, -5288179, -4779225, 1020592, 3535295, -414464, 5735929, -16328929, -1337882, -8772471, 5211406, 10696616, 890669, -1175210, -8452496, -3716221, 7924215, --1353452, -492848, 255014, 1632625, -2226404, -1228361, -210990, 2369748, -1364189, -236223, --1566053, 4493073, -3278134, 732829, -3082713, -3782256, 988916, 1283122, -1218160, 647466, --1133335, -788127, -265214, -379568, -117575, -1567663, -982474, 4620311, -261993, 90194, --464930, 1762547, 968515, 1586454, 26386132, -24171002, 10882910, 11365020, -10976326, -2146410, -15703474, 5565204, 9899363, 2819109, -3703336, 23728084, -1164473, -4678830, -229244, -120259, -11282342, 17799418, 6611029, -324807, 157303, 2501819, 5980205, -286689, 3076807, -12781823, -5751498, 9606768, -2262374, 3800509, -204548, 1621887, -8316131, -6528351, 250719, -477815, -10901164, 5287642, 4387846, -4877472, -5959804, -5946382, 6186364, 9093520, -129386, -3187403, -17942226, 9202504, 11920682, -6736120, -13750875, -2777233, -14390288, -9529459, -4482335, -6112276, --1024350, 10417443, -3569118, 210990, -8894340, -9470940, 10366977, -732829, 4723391, 5083094, --5728950, 9963787, 2434710, 711891, -3743064, -7004555, 7764764, -2643552, -14337675, 7965554, -6687264, 8338679, 3637837, -10151692, -2300492, 726386, -10603201, 5735929, 5743982, -1174137, -4284230, 3559454, 3806415, -1177895, 6140730, 741956, -467615, -3427921, 1361505, -269509, -4845797, 885837, -360240, 828929, -268435, 3517578, -1805497, -668404, -2689187, 1056025, --879395, -2144263, 198642, 309775, -957778, 364535, 3878892, 2884608, -1998234, -1370632, --2871723, 474057, -795643, -570694, 227633, 286689, 1162862, -1991791, -18442590, 2422899, -6278169, -8990977, 7757785, -15636902, 3749507, 4943508, -1926830, -6114423, -7864085, -9216463, --15670725, 2148558, 18151606, -5793911, 8837432, 4950487, 13543106, 7233262, -4895726, -11369315, -6085432, -2779918, -3919695, -11789685, -1611687, -1480690, -4581120, -4982699, -2566243, -8252780, --10820096, 12940736, -1082869, -7328288, 10242960, 3666292, -8597988, 1434519, -461709, 5839008, --11479911, 3400540, 4197257, -17115444, 5944772, 5738613, -8679055, 2662880, 865973, -2675765, -6562710, 701153, -1002338, 872952, 4513474, 11733314, 9453760, 11970074, 8397735, 4335233, --2862596, 17761300, -4277788, -8939438, 19794430, 1406602, 12050068, 2644626, -3577171, -18080202, --16580184, -4081293, 1286343, -6548752, -2990908, -5124433, 11781632, -10029822, -2715493, -1633698, -3054796, -9791989, 7364795, -702764, 2493766, -772020, -3587908, -6350109, -4065724, -4987531, --3850438, -1148367, 906238, -3043521, -1954210, -1670205, 4482872, -4850092, -4063039, -3472481, --3899830, -116501, 3657702, -1446330, -1389959, 2479270, 869194, -1177895, 1935420, -3025268, --3095598, 2634963, -3653407, -6300717, 2519535, 5727339, -2729989, 654983, 4113505, -1267552, --2841121, -3171833, -30862024, 15214922, 26735098, 1933809, -15051713, 6977711, -2719788, -974958, -4443681, 2661269, 6934225, -7986492, 1002875, 23971824, 18423262, 16136192, -17452600, -658204, -4372277, 9253507, -8340827, -9329206, -2334852, 3111704, 8366597, 4217121, -22470196, -25482040, -8018167, -751619, 14472429, 14868640, -9473087, 12324409, 9899900, 13159780, -833224, -7681549, --8047158, 6346888, -8526047, -3182571, 49392, -258235, 7864622, 16715476, 9387725, -4429185, --3868155, -8102456, -2047089, 853088, 4540854, -1646583, -2878702, 8287677, 5185100, -12409771, --123480, 651761, 15116137, -7450695, -8610873, -16299401, -5537287, 2955474, 1141924, 8633421, --1791001, 2270427, -7312719, -10773925, -9867687, -9856950, -5720897, 4930623, -20589000, 2620467, --2854543, -3077344, -4327717, 4242354, 11330124, 8395050, 1339493, -1680943, -10446434, -3171297, --936303, -1956358, 6950868, 3710852, 2141041, 1705102, 3625489, 4384625, -1578937, -1568200, -131533, -1710471, 390842, 658741, 1406065, 2507724, -6678138, 1238024, -844498, 5291937, -1401770, -6529424, -355945, -4052302, -3250753, -1462436, -1486596, -1565516, -833224, -640487, -1789391, -133681, 3681324, 3361349, 2813741, 4912906, 15463493, 1144072, 13401909, -1982127, -17434346, 8631274, 13566191, 8287677, 3861176, -6913287, -814433, -4376035, 9258339, 2633889, -8115341, -8002598, -1504312, 14432701, -18080202, -10166724, 13866302, -23812910, -10567767, 1633698, --4647155, -11857331, 23722714, -4394826, 16347719, 6476811, -14478872, -2328946, -5524402, -17486422, --22667226, 17870822, -289910, -6693170, 4327717, 193810, -3118146, 6422587, 2448131, -2458869, --8417599, 1457068, 16884054, 14285598, -12020003, 4584341, 809601, 13318157, -6249178, 8982387, --19463718, -4817880, 13080860, 4299263, -4550518, 15620796, -5136244, 10910291, -21593484, -24894704, --9048422, 346282, -17661442, 18813568, 13252658, 19113678, -8949101, -6637872, -6797860, 861141, --9885404, -242129, -15044734, -13688598, 499827, 3677566, 13707388, 6395743, -1575716, -5239860, -4232691, 7841537, 5115306, 3049964, -5033702, 5629092, 5039071, 6361384, 4702453, 3378529, -5099737, -7306813, 5922760, -4479114, -2311766, 9317395, 8254927, 5477694, -1108638, 186831, --2639258, 4702453, 1411971, -2145336, 2526515, 4770098, 635655, 3671660, 3614752, -5090073, -1531693, -3888019, -1195075, 1006633, 21640730, 15575699, 24380918, -21556978, -16186121, -36965172, -16002511, -4074850, -31572304, -6089190, 3058017, 4702453, -11759620, 12918188, 10937671, 1263257, --82141, 2050847, -5178120, -10973641, 2491618, -6225018, -10241350, -97711, 24044838, 780610, --3571265, -19139448, 8158291, 15175730, -7763154, -23102630, -4124779, 7830263, 2840047, -4879620, -5116917, 1678259, 8399345, -2310156, 13804562, 21005074, 8016020, -13920526, 15890842, 7144678, --17781702, -18985366, 20750598, 10019622, -7960722, -9252970, -369904, -16827682, 12425877, 16273094, --294742, 937914, 4186519, -2059974, 17881022, 6000070, 4721780, -7355669, 2974265, 6024229, -22064858, -5254356, 8519605, -16998406, -19276350, 17300128, -2499134, -1600412, 1896228, 16489453, -473520, -760746, 10510859, -4961761, 2189360, 9554155, 11763915, -5557151, -7133941, -15618649, --7588671, 5117454, -6781754, 5451924, -46708, 5784247, -2997887, 4268124, 1014686, -2398202, -2011118, 8749385, 2290828, 8709120, 2762738, -5498632, 494458, 3637837, 3154117, -5396627, --4807679, -5257040, -2111513, -4129074, -3896609, -6422587, -2615635, 3586298, 2430415, -649614, --889058, 1962800, -4110821, -99321, 5661841, -1545115, -726923, -2642479, -2063732, -1150514, --7979513, -1140851, -2988760, -3249680, -4851166, -7015292, -24796456, -1812476, -16137266, -32996086, --34013456, -14559939, -25910464, -11610907, -3973919, 4951024, 14884746, 16575889, 1924145, -8581345, -17835388, -8688182, 8918500, -32575180, -2976949, -22268332, -14861661, 15503758, 10961293, 10669773, -3717294, 22215182, -1968706, -1124745, -15569256, -5235029, -2934537, -10518912, -10624138, -26725434, --10356240, -2729452, -4098473, -16440598, 15009837, 6125697, 9057549, -7099581, -2578054, -40687300, --11548093, -11035918, 9730248, 21226802, -12674985, -1735704, -23598698, -1475858, 12524662, -3663070, --7804493, 5610838, 17854180, 30284352, 6564321, 1197222, -1410897, -7815230, -11774653, 8275865, --7673496, 27491012, 5608691, 11973832, 55818468, -10817412, -9207873, -13797582, -19227494, -2402497, -19233400, 8784819, 2964601, 6555731, -7778186, -5986648, -16703128, -3822521, 9782325, -1320703, --3498251, -1356673, -3702262, 2232309, -374736, 3929358, 3995930, 4052839, 5265093, 5721434, -14405320, 8871255, -4995047, 8467528, 31675, 753230, 6172405, -6622303, 380641, -7676181, --4527433, -10591389, -7781407, -11058467, -9110163, -6052683, 12620225, -7480223, -4092567, -8864276, -819802, 2910377, -1711545, 3937948, 1753420, -22012, -7418483, -27755152, 15832860, 26058104, --15337865, 822486, 5890011, -8959839, -2110440, -19419158, -345745, -10886668, 28308130, 8053, --5269388, 22687628, -5701032, 6597070, -25957708, 13498008, 4090420, 17584132, -8143258, 13088913, -23191212, 24829206, 14014478, 22377854, 11549167, -3585761, 21844204, -10561861, -14249628, -4621922, -8823473, 14725295, -35337380, -2456721, -22810572, 18131204, 8324184, -496069, 6353867, 25401510, -1194538, 22662394, 9809705, 34343096, 3207804, -3973919, 15182709, 4920422, -17416092, 3710315, --1918777, -23591182, 16641925, -14256070, -22828288, -47029356, 3787624, -5858873, 27768038, -15455977, -37115496, 12127914, -462783, -5726802, 14578730, 15129022, -26873610, -11625940, -19810536, 6888591, --8839580, 20226074, 6644315, 6750078, 10004589, -4754529, 1939178, -7188165, -2266669, 492311, --2465848, -20970714, 8470212, -115964, 6414534, 125091, -5921150, 592706, 8780524, -13980119, -12232067, -5172751, 219043, 1284195, -11409044, -1074816, 7328288, 3493419, -8104067, -3543885, --1736777, -9913321, 3604551, -2878702, 14644765, -11569568, 5428302, 9918690, 3914863, -4311611, --2801929, 4789426, 2738042, 2947958, -2175401, 4970888, -14954002, 4041027, 4071629, 6528887, --4248260, -7226283, 966368, 6394133, 1330366, 17534204, -12265890, -13685376, -13470628, 16850230, -8584566, 22040162, 5881958, 68863896, -20874614, 49929, 193810, 31883690, 13008382, 14590541, --21453898, 8957154, -8657580, 277562, -10100152, 1830193, 22948548, -6444599, 7054484, 44659068, -13791140, -20691004, -24182276, 2456185, 29004452, 14979772, 5245229, -11667816, 24641838, 3922379, --4034585, -27757836, 8059506, -4676683, 11496017, -25226490, -15534897, 983011, -6667400, 2962991, --23559506, -1116155, -14499810, 6267431, 20264730, 16149077, 5057324, -32185948, -62277, 2837363, --29052232, -25965224, -17331266, -14337675, -14333380, 22420266, 4861903, -963146, 14491220, 23325430, -5975910, 20159502, 223338, 13241384, 90058488, -20936354, 14563160, 10064719, -16213502, 3053185, --60559576, 901943, 29577830, 7517804, -16900160, 22716618, 5221070, 8449811, -15357192, -3722126, --13167296, 4201552, 791348, 834297, 4831302, -18972482, 6583648, -10547366, -7771744, -25862146, -6019397, 5560909, 4771709, 6272263, 31662498, 4522064, 3102577, 3364570, 2184528, 18809810, -1929514, 7765301, 6372121, 14276471, 5549635, -1184337, -3543348, -2961917, 2110440, 8939974, -10734197, 2957085, -17096118, -8024073, -4024921, -4032974, -5851893, -17848274, -4561792, 5880884, -13155485, 36283884, -17322140, -1185948, -24855512, -18153216, 5515275, 15715822, -20608326, 23929410, -9881646, -32161252, 19298898, -13220446, -16049219, -1651415, -19346680, 4150012, -8810052, 24270324, --14449344, -1465658, 13284334, -47862580, 6546604, 14396730, -14595373, 11346767, -28963648, 28341952, -2888903, 4581120, -54575076, 48668960, 20786032, 15731928, 840740, -31355946, 28164784, -2194192, --14305462, 49760416, -10216117, -22410066, -11827803, 5661841, 14287746, 13340168, 3437585, -8858907, --59261960, -7079180, 14554570, 446677, 21465710, -31412854, 31777390, 2822867, 10608032, -31933618, --9310952, 4634270, 40568652, -17399986, 9327058, -29635274, 25617332, 14014478, 24166170, -9856413, -10601590, 3743064, -32091996, -30939334, 16564615, 13211319, 25799868, 5082020, 33165738, -50752016, --65947076, 10001905, -14059575, 36653252, -24426016, -5764920, 4102768, -28524488, 1205812, -17246442, -14385456, 20117626, 1887101, 16214038, 18264348, 4926328, -16830904, -8971113, 29492466, 14871324, -3678103, 4613332, -9069360, 127238, 17891760, 9534291, -14792941, -8866423, 16637093, -2986613, -10303627, 9910100, -6632503, -9210557, -8841190, -562104, 8800925, 3417183, 11305428, 15796353, -1183800, -1183264, 13253732, 158377, 2531346, 3562139, -5782637, 3903052, -9987410, 4884989, -1844152, -490700, 4165045, -4853850, -45926084, 41895260, -9034464, -10115185, -16340203, -4774930, --36211944, -67626408, 23363548, 19417548, -2970507, -13943611, -27540940, -4553202, -8535174, -14653892, -26658862, -60483340, -25834228, -31933618, -9511742, -46055472, -4234838, -6944425, -1642288, -7722351, --9330816, 7410429, -448824, -20391968, -6377490, -473520, -27886686, -14913200, -8225399, 2020782, -21472688, -11033234, 43035572, -22501870, -3224984, 18078592, -19197430, 11650636, 2441689, -29521458, --44141528, -10843182, 11259794, 40223980, 17443472, -30862562, -13063143, -88550952, -29646012, -6421513, -18597208, 48029544, -2579128, -51536388, 2826625, 27919434, -10331544, -2487860, 29606284, 31149250, -71547176, -79177720, -15399068, 11144903, 19955492, -25046638, -29721710, -42385960, -42083164, -23584740, --19617800, -5595806, -3104725, -48978196, -20365124, -18022756, 17976586, -9342628, -4945118, 43898324, -33204930, 2542084, -6437619, -2160369, -27355184, -1360968, 9513889, -19807852, -10712722, 3554086, -12221329, -8508867, -9844065, -6706055, 13631689, -9375914, 14279693, 825171, 14738717, 10434623, -10532334, -8502425, 5173825, -20846160, 10308995, -2973728, 5926518, -18488224, -14462765, -2335925, -4321274, -10561325, -140123, -23405424, -4480725, -3111167, 9421011, 11864847, -15181636, 29759828, -106300, 10787884, 6152541, 21418466, 21298206, -1498944, 13295071, -25519622, 6718940, -10059887, --62293668, 14647449, -10263898, 18991272, -16876000, -17424146, 1804960, -25824564, 4948876, -26047366, --57982, -4191888, -9900436, 13153337, -19279572, -25356414, -23046794, -29853244, -4582193, -2906082, -34029024, 7820599, -23992224, -35992364, 5264556, -381178, 9152038, -6704444, 20820928, -23548232, --9015673, -33229088, -21013128, -9293772, 1611150, -13824426, 35506496, -11878269, -29420526, 9646497, -36841156, 26714160, 11274826, -25355876, -16223702, -2285996, 33510408, 63504312, -54761, 12758737, --11587822, -61495880, -13045963, 5934034, 23854786, 53064856, -28672128, -35470524, 21540872, 10261214, --11865921, 1964948, -19096498, 12433393, -51688856, -5731097, 3567507, 12970801, -30928596, 36621040, --50523848, -57897232, -53111564, 27376122, -10424959, 51448340, -70762272, -30838402, 6340446, 73117520, --5233955, -12728136, -39464844, -14439680, -4050154, 35377108, -2338610, 75162, 2749316, 6330782, -1352915, -302258, -14512694, -12715788, 17435956, 7610682, 2709051, -37958384, 10248329, -9616969, --3827353, -19564112, 1582696, -1586454, -2913599, -44727788, 4854924, -9763534, -4436701, -3723737, -8323647, 7516, 3491272, -154082, 984621, -537, 923955, -16245177, -2454037, -10413685, --8324721, 7936026, 8860518, -13030931, 1221918, -9261023, 12949863, -4433480, -20117626, 3221762, -36753644, 10874857, -67126040, -12328704, -46494096, 19996294, 3267933, -92053496, 5662915, -28657632, --59905668, -46626700, -68291056, 41427644, -21265994, -53739704, -24575266, 16864190, -32395864, -27855010, --22036940, -13134547, -24240796, -23848880, -43906912, -31700080, -59998544, -33870112, -30866856, -10361072, --28639916, -6109054, -13778792, -1169305, 1558536, 7542500, 15915538, -16716013, 13105556, 1343251, -29730300, 12941273, 18282066, 18879602, -56392384, -14949171, 43914428, -7984881, -28452548, -31519692, --23904714, 17580912, 71293776, -5097590, -1902671, -48678624, -50183472, -10730439, 9330816, 42789148, --3839164, 38970384, 13657459, -47837344, 84849760, 1315334, 65802120, -164819, -17995912, 35498980, --49028124, -62414464, -40786620, -137842144, -84461608, -27719182, 61938796, 38279968, -56251724, -36674188, --85418848, 41411536, 54633056, -43482248, -44268764, 9478993, 35647156, 52038360, 13466333, 29637958, --29263222, -15882252, -22403086, -32563368, -14468671, -3441880, 1737314, 743566, -18888192, 2141578, -10527502, 3282966, -4211216, -13356275, -10078678, -15161235, -6913824, -22111028, -6151467, 12411382, --22416508, -34600256, -6620155, -23023710, -16834124, -3502546, -30329986, -22987738, -7592966, 12671227, -12261595, 14719390, -2282238, -13287555, -4053376, 3940633, -9367861, 19947976, -1129576, 14305999, --1293859, -1436130, 13304735, 10633802, 15129559, 36419176, 21452824, 26664768, -23364622, -56738128, -65994856, 63124744, -39915816, -51758652, -255014, 56654912, -6158446, -3252364, -17667884, 49557480, --5521181, -13168907, -1242856, 13728326, 25380036, 740345, -19138374, -21662742, 30499100, 2339684, --13190381, -32599876, 18514530, 10334228, -3786014, -25667262, 8022462, 11175505, 9116605, -16190953, --9863929, 2982318, 25114284, -7304666, 8955007, -36968396, -10424959, 180389, 24311662, -51495048, --9339406, 5154498, 37034428, -17721572, 5633387, -26234198, 3461207, 11068668, -18284212, -13677860, --2297808, 6194954, 11178726, -11602854, 637266, -45838040, 24732570, -7518341, 42928736, -26546656, -19050864, -18006114, 19808390, 3924526, 13217762, 11559368, -33680596, 38067904, 7283191, 22050362, --37165424, 10477573, -9616432, 6085432, -10757282, 1682017, -2787971, 5258114, 12319577, -1748589, --15014669, -8559333, 3528853, -1760400, 674310, -5519570, -14651744, 5062693, 3557844, -4224101, --4347044, -24696, -4791573, 923955, -8113730, 0, -4115653, 6720550, 3478924, -2426657, --6113886, 2270427, -149787, -4847408, 3419868, -15526844, -462783, -1586990, 6708739, 537, -17865454, -11809013, -12611098, -3914863, 9269613, -12809203, 19178640, -16135655, 7939784, -7779260, -17451526, -15664283, 19235548, -10870562, 14966350, -13581760, 23455354, -22157200, 16898548, -4927401, -12643310, -11843909, 12430172, -13454522, 14077292, -13554380, 11254425, -9014599, 12492986, -9713605, -10415296, -9676561, 2931315, -3140158, 6311455, -4794794, 5186173, -4241817, 4224637, -3034931, -5826123, -3564823, 2267206, -2790118, 3100430, -2425583, 1115081, 488553, -19240916, -42899744, --57077968, 41793788, 27759984, -32510218, -46368468, -22673670, 21611738, 11380053, 28716688, 30903900, -6133750, -15440407, -4431333, 10873247, -10497974, -772557, 6470905, 1842541, 17344152, 12152073, -5326297, -15427523, -477815, -9517648, 10104984, -16167868, -13992467, 11905112, -3656628, -6525129, --6404870, -11210938, -15403363, 1281511, 12758200, 11649025, 9782862, -3583613, -12685186, -11005854, --7668664, 13904420, 18874770, -8654359, -13030931, -5579163, 15677704, 8149164, 20941724, -14636175, --5512054, 8338142, -3837017, 789737, -2142115, 7503845, 4528506, 6082211, 1345399, -13996762, -5927592, 2731062, -433255, 11032160, -5586142, -2680060, 1973001, -1901060, 1486596, -3970161, -18591302, 4769025, -1412507, 17750562, 17745732, -17830556, -27095338, -9838159, -18532784, 681826, -12393665, 3645354, -11053635, -13303124, -3503083, -2461553, 10778757, 5239860, 6747394, 10157061, -6195491, -5456756, 6271726, 4530654, -13006772, -17394618, 5326297, -4483409, 8797704, 6546067, --9542880, -2427194, -3193845, -3379066, -11101954, -5983427, -623844, 3680787, 5406827, 15012521, --7329899, -5383205, 3876745, -3296388, -4307316, 8843875, 368293, 19603304, -47634944, -125403920, --46101644, 22486302, 65233036, 137773424, 92197912, 23722714, 34942244, -18420578, -56082608, -93145496, --81036904, -64435784, -18580028, 2469606, 44824428, 49407156, 105197704, 51060180, 33675764, -2652679, --22422950, -50646256, -26291642, -40956808, -47215648, -29086056, -24336896, -1829656, 13157632, 39343512, -24333674, 28236188, 25683904, 25941602, 39046084, 3353833, 27056146, -5033702, -12139188, -32964948, --19625316, -49154292, -72321880, -63218160, 753767, -10768557, 19844360, 33960308, 18643916, 52395916, -45781132, 66227320, 37723236, 44907640, 2237141, 2187212, -35413616, -57905824, -67627480, -81226960, --53359600, -66387308, -5566278, -288837, 31961000, 33481954, 80232136, 62986768, 89620936, 36341864, -41909756, 17443472, -358093, -53494892, -87195888, -58430884, -69655776, -43438764, -47158740, -4438849, -7319161, 27814208, 36553928, 49466212, 50548008, 48551384, 31836446, 34757560, 9083856, -6337224, --11926050, -39210368, -35694936, -46939160, -33120104, -46922516, -35701380, -3764002, 8404177, 24684250, -37347960, 33252174, 34338800, 56484724, 20500416, 34473556, 26528402, -35676684, -64471756, -28008556, --56842280, -35904316, -19477140, -4107599, 5111011, 18074296, 32869384, 22803592, 35358856, 22369264, -19273666, 7709467, -2115272, -20561082, -6688875, -9667971, -35938140, -33678448, -9214315, -3845070, -1974611, 11789685, 13902272, 17510044, 14091788, 13838921, 5286568, 4650376, -111132, -7901129, --3817689, -2899103, -7912941, -12837120, -4249334, -6426345, -7367480, -877784, 3577708, 3899830, -6002754, 7105487, 8892730, 5690832, 4224637, 1312113, -700617, -2229625, -3507378, -4809827, --5105643, -3714610, -2746632, -2067490, -1822677, 41876, 975494, 1110786, 1637456, 1739462, -2630131, 3909494, 3933116, 1130113, 780610, 1054951, -507880, -2042257, -2685428, -3712462, --3187403, -2237141, -657130, -887985, -36507, 1539746, 1659468, 1575179, 2268817, 1816771, -1059246, 74088, 63888, 117038, -257698, -1005022, -863288, -1021665, -999117, -1023813, --650688, -391379, 114890, 441308, 841814, 932545, 733903, -30602, 353798, 511638, -343061, -132607, -598611, -794032, -656593, -408559, -60666, 222265, 530965, 369904, -141734, 164819, 227633, -165893, -328028, -277025, -264677, -208843, 12348, -11274, -26307, 100932, 104690, 48318, 19327, 10201, -9664, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +2232309, -5614059, 2633889, 2989834, 1023813, -7104413, 3218541, 5006858, -5430450, -1642825, +-6649683, -1478543, -2834142, -2451890, -970663, 346282, -245350, 653372, 2370822, -2976949, +1307281, -6817724, 2325188, 4154844, 874563, -1809255, -5523865, 3578782, -2434710, 5802501, +4955856, -237297, -2326262, 4725538, 5523328, 4429722, 4489852, 1095217, -3467112, 1058173, +4246649, -1812476, -3621731, 3216394, 5122822, -2281702, 2668785, -5871757, -496069, -5153961, +3485366, -6852084, -1857573, -1299765, 2323041, 3374234, 2397129, -223875, -3631932, 413391, +-5019206, -3333968, 902480, -650151, -3031710, 1618666, 1682017, 399969, 3145527, -2843805, +1346472, -3830574, -1520955, -1648194, 2079838, -2001992, -4034585, -1835025, -1511829, 5500243, +4743792, 1174137, -2538863, 295279, -307627, 933619, 1897302, 317828, 94489, 302795, +-91268, 46708, -724239, 518080, -2131378, 64961, -174483, 837519, 443992, -689342, +-939524, 156766, 369904, 367220, -179852, 19327, -428423, 9742060, -9768903, 396211, +197569, -2454574, -2915209, -3105261, 1038308, -5493800, -5420786, 795643, 2668785, -176094, +3157875, 2469069, -2969970, 1260573, -10718628, -2601140, -2377265, -2472291, -3362960, -3707094, +-9444096, -7327214, 1033477, 2245194, -484794, 5155035, 4123169, 1754494, -1800128, -991601, +4825933, -1823751, 619549, -668404, -5019206, 1719598, -1663763, -3403762, -1303523, 4156992, +9988483, -3766150, 1137630, 2459406, -1817845, 3171297, 1427540, -3447248, 2055142, -8199093, +-3787088, 128312, 3393024, 5266704, -3180960, -1451162, -333397, -11897059, 2063732, 6207302, +357556, 933619, 3400540, -1903744, 5294084, 7144141, -875100, 2057826, 4294968, 4093641, +830002, 260919, -1957968, -2811593, -1757715, 1298154, -2690260, 5974300, 4010963, -92879, +-2877628, -1445793, 3441343, 4060355, -1990181, 3160022, -1877975, 889058, -1915019, -1132798, +-1306207, 415538, 111132, 271657, 287226, -180389, -623844, -462783, -2564096, -8380555, +1950452, 314606, -8106751, 1250372, 4553739, 6700149, 1725503, -4804995, 11347840, -1513439, +-2228014, 5340792, -3289408, -3199751, 551903, -4131759, 5060545, 5063230, -2039036, -7619809, +-3765613, 3808026, -4908074, 10800769, 9315784, -7431367, -9102646, 338229, 1707786, -8654359, +-563178, 3593814, 2434173, -4230006, -2464774, 9960566, -1052804, 6860674, -676457, -2209761, +-2310156, -5108327, 894427, -712965, 5369246, -4565550, 1243930, -1184874, 999117, -2681670, +-352724, 4545149, 3599720, -5652714, 8834748, 747861, -39728, -121870, -808528, 2415919, +-1217623, -7888245, -1122597, -4155381, 6888591, 2907156, 179315, 8483634, -4682051, 5682779, +5565741, 534723, -4118874, -818191, -877784, -65498, -1173063, -1682017, 2338610, 2505577, +-3741454, 1819992, -222801, 2651069, 2315524, -738198, 360240, -1131724, -1759863, 1282585, +-1620276, -1335198, 690416, 1804960, -1636383, -1186485, -2128693, -880468, 1274532, -778463, +-313533, 59056, 644782, -1143535, -673773, 1672353, 539555, -312459, -520228, -1806571, +-78383, 965294, 552977, -20148228, 4707821, 1150514, 14471892, -712428, 5855651, -7682086, +1735167, -5740224, -1322850, -2779381, -848256, 2712272, -1490354, 2537252, 4923107, 3774203, +13743895, 9504763, -6140730, 3201898, -264677, 2590402, 1682017, -1679332, -13519483, 3507378, +-625455, -66035, 5226439, -743029, -3721589, -2569464, -572841, -4153770, -2199023, -10792179, +-2478196, 352724, -3766150, -614717, 4570382, 6508486, -2013803, 8026757, -5885179, 1377074, +2789045, 1109712, -1777580, -4123169, 3033858, -986232, 1895691, -3046206, -4360466, 893890, +2649458, -4405026, 4336307, -2988224, 10229538, 10847477, -3206730, 4003983, 4209605, -490163, +-1327682, -1377611, -13097503, 5573257, 5422396, 232465, -2145336, -5429913, 649077, -1544041, +-6638946, -14960445, 1058173, -3655017, 3927748, 70867, 10737, -2439005, -1627793, -2757369, +-209380, 1614371, -1889786, 2363306, -2343442, -1325534, -947577, -526134, 1301375, 1096827, +-741956, 548145, 410706, 901406, 1413581, 1114007, -631360, -1516124, 1203665, -594316, +-1117228, 517007, 461172, -622233, 910533, 1442035, 537945, -103616, -4363150, -6641630, +6558415, 3723200, -610959, 7588671, -4124242, 6804839, -7738458, -7425999, 3562675, -11830487, +-4217121, 2944737, 7145215, 9357123, -1677185, 6977175, -282931, 6644315, 2427730, 1055488, +-1138166, 336618, 6619082, -3202972, -741956, 1184337, 536334, -6589554, -858993, -3586835, +13526463, -6512244, -6616934, -1621887, 6352257, 6411313, 5482526, 7369627, -1324461, 1334661, +-1685238, -3692598, 2753611, -353261, -745177, -4218732, 10596758, 6541772, -3335579, 2007360, +3098819, -5633387, 1145146, 4117263, -1094680, 7964480, -3271691, -1053878, -8726300, -3291019, +-7427072, 313533, 10128607, -4021163, 2824478, 1728724, 301721, -2791729, -993211, 77309, +-2538863, 4874251, -5073430, -2380486, -498216, 10719701, 1647657, -74625, 3336653, -2931852, +-8104604, 1987496, 757525, -1290638, 529892, 1970316, -586800, 399969, 3859028, 734976, +-369904, 925565, 1611, -528818, -991064, 3629784, -234613, 302258, -3379603, 2013803, +456340, 2005750, -550293, -1366337, -467615, 1020055, 1585917, 1066763, -2767033, 135828, +1858110, -590558, -3475702, -2298881, -19144280, 13739600, 1370632, -7095286, -16918950, -1759326, +341450, -10041634, -985695, 4555887, 3864934, 282931, -2967286, 3590593, 11943230, 12124693, +-5318780, -5818607, -13326210, 2565169, -2476586, 12778065, -5331128, -364535, -3109020, 4760435, +-1534914, -13259638, 4235912, -697395, -7904888, -70867, 1139777, -1148367, -1425392, -5495411, +-7638063, 4508105, 1039382, 5920076, -5308580, 10016937, 4694400, -2161442, -9039832, -1851668, +3135326, 9795747, 2964064, -5658620, -2644089, 4511863, 2863133, -2942590, -1498944, 4760971, +3860639, 5029944, 9681393, 10843182, 5234492, 5738613, 6610492, -4005057, 872415, -7300371, +7124814, 1065689, 3549254, -5236102, -8130373, 1761474, -10365904, -3771518, -4580046, 7460895, +7791608, 8193724, 2066416, -2415919, -2726231, 7649874, 1462973, -1152662, 1836099, -2505040, +4822712, 184147, -184684, 1549410, 1913408, -839129, 3929895, -73551, 570157, -2011655, +-1283122, 1043140, 3038689, -264141, 1025960, 1756105, 933082, 538482, -1071594, 1439351, +-1384590, -2007360, 1589675, -6840809, -392990, 12840342, 7898982, 10858751, 2076617, -11848204, +-3898757, 12610024, -3620658, -7961796, -8301098, -8167954, -8648454, 4779762, 4849018, 3124589, +2855080, 2957085, 12126303, -1478543, 5267778, -10387378, -11702175, 7862475, -409633, -6370510, +464930, -16291885, -5320928, -5474473, 2008971, -551903, -1501091, -11454678, -7508677, 1296006, +7929047, 12902082, -5105643, -5029944, 6864969, -8820789, -632971, -427886, 2961380, 5659693, +4597763, 8952322, -4792647, 12968117, 6104759, -13960254, 6986838, -7747584, -9278740, -7690139, +-11224360, 10184441, 2383707, -11933567, 1364189, 2552284, 1104880, 1923609, -2198487, 8453033, +-4893579, 6505802, -10413685, 7923678, -5288179, -4779225, 1020592, 3535295, -414464, 5735929, +16328929, -1337882, -8772471, 5211406, 10696616, 890669, -1175210, -8452496, -3716221, 7924215, +-1353452, -492848, 255014, 1632625, -2226404, -1228361, -210990, 2369748, -1364189, -236223, +-1566053, 4493073, -3278134, 732829, -3082713, -3782256, 988916, 1283122, -1218160, 647466, +-1133335, -788127, -265214, -379568, -117575, -1567663, -982474, 4620311, -261993, 90194, +-464930, 1762547, 968515, 1586454, 26386132, -24171002, 10882910, 11365020, -10976326, -2146410, +15703474, 5565204, 9899363, 2819109, -3703336, 23728084, -1164473, -4678830, -229244, -120259, +11282342, 17799418, 6611029, -324807, 157303, 2501819, 5980205, -286689, 3076807, -12781823, +5751498, 9606768, -2262374, 3800509, -204548, 1621887, -8316131, -6528351, 250719, -477815, +10901164, 5287642, 4387846, -4877472, -5959804, -5946382, 6186364, 9093520, -129386, -3187403, +17942226, 9202504, 11920682, -6736120, -13750875, -2777233, -14390288, -9529459, -4482335, -6112276, +-1024350, 10417443, -3569118, 210990, -8894340, -9470940, 10366977, -732829, 4723391, 5083094, +-5728950, 9963787, 2434710, 711891, -3743064, -7004555, 7764764, -2643552, -14337675, 7965554, +6687264, 8338679, 3637837, -10151692, -2300492, 726386, -10603201, 5735929, 5743982, -1174137, +4284230, 3559454, 3806415, -1177895, 6140730, 741956, -467615, -3427921, 1361505, -269509, +4845797, 885837, -360240, 828929, -268435, 3517578, -1805497, -668404, -2689187, 1056025, +-879395, -2144263, 198642, 309775, -957778, 364535, 3878892, 2884608, -1998234, -1370632, +-2871723, 474057, -795643, -570694, 227633, 286689, 1162862, -1991791, -18442590, 2422899, +6278169, -8990977, 7757785, -15636902, 3749507, 4943508, -1926830, -6114423, -7864085, -9216463, +-15670725, 2148558, 18151606, -5793911, 8837432, 4950487, 13543106, 7233262, -4895726, -11369315, +6085432, -2779918, -3919695, -11789685, -1611687, -1480690, -4581120, -4982699, -2566243, -8252780, +-10820096, 12940736, -1082869, -7328288, 10242960, 3666292, -8597988, 1434519, -461709, 5839008, +-11479911, 3400540, 4197257, -17115444, 5944772, 5738613, -8679055, 2662880, 865973, -2675765, +6562710, 701153, -1002338, 872952, 4513474, 11733314, 9453760, 11970074, 8397735, 4335233, +-2862596, 17761300, -4277788, -8939438, 19794430, 1406602, 12050068, 2644626, -3577171, -18080202, +-16580184, -4081293, 1286343, -6548752, -2990908, -5124433, 11781632, -10029822, -2715493, -1633698, +3054796, -9791989, 7364795, -702764, 2493766, -772020, -3587908, -6350109, -4065724, -4987531, +-3850438, -1148367, 906238, -3043521, -1954210, -1670205, 4482872, -4850092, -4063039, -3472481, +-3899830, -116501, 3657702, -1446330, -1389959, 2479270, 869194, -1177895, 1935420, -3025268, +-3095598, 2634963, -3653407, -6300717, 2519535, 5727339, -2729989, 654983, 4113505, -1267552, +-2841121, -3171833, -30862024, 15214922, 26735098, 1933809, -15051713, 6977711, -2719788, -974958, +4443681, 2661269, 6934225, -7986492, 1002875, 23971824, 18423262, 16136192, -17452600, -658204, +4372277, 9253507, -8340827, -9329206, -2334852, 3111704, 8366597, 4217121, -22470196, -25482040, +8018167, -751619, 14472429, 14868640, -9473087, 12324409, 9899900, 13159780, -833224, -7681549, +-8047158, 6346888, -8526047, -3182571, 49392, -258235, 7864622, 16715476, 9387725, -4429185, +-3868155, -8102456, -2047089, 853088, 4540854, -1646583, -2878702, 8287677, 5185100, -12409771, +-123480, 651761, 15116137, -7450695, -8610873, -16299401, -5537287, 2955474, 1141924, 8633421, +-1791001, 2270427, -7312719, -10773925, -9867687, -9856950, -5720897, 4930623, -20589000, 2620467, +-2854543, -3077344, -4327717, 4242354, 11330124, 8395050, 1339493, -1680943, -10446434, -3171297, +-936303, -1956358, 6950868, 3710852, 2141041, 1705102, 3625489, 4384625, -1578937, -1568200, +131533, -1710471, 390842, 658741, 1406065, 2507724, -6678138, 1238024, -844498, 5291937, +1401770, -6529424, -355945, -4052302, -3250753, -1462436, -1486596, -1565516, -833224, -640487, +1789391, -133681, 3681324, 3361349, 2813741, 4912906, 15463493, 1144072, 13401909, -1982127, +17434346, 8631274, 13566191, 8287677, 3861176, -6913287, -814433, -4376035, 9258339, 2633889, +8115341, -8002598, -1504312, 14432701, -18080202, -10166724, 13866302, -23812910, -10567767, 1633698, +-4647155, -11857331, 23722714, -4394826, 16347719, 6476811, -14478872, -2328946, -5524402, -17486422, +-22667226, 17870822, -289910, -6693170, 4327717, 193810, -3118146, 6422587, 2448131, -2458869, +-8417599, 1457068, 16884054, 14285598, -12020003, 4584341, 809601, 13318157, -6249178, 8982387, +-19463718, -4817880, 13080860, 4299263, -4550518, 15620796, -5136244, 10910291, -21593484, -24894704, +-9048422, 346282, -17661442, 18813568, 13252658, 19113678, -8949101, -6637872, -6797860, 861141, +-9885404, -242129, -15044734, -13688598, 499827, 3677566, 13707388, 6395743, -1575716, -5239860, +4232691, 7841537, 5115306, 3049964, -5033702, 5629092, 5039071, 6361384, 4702453, 3378529, +5099737, -7306813, 5922760, -4479114, -2311766, 9317395, 8254927, 5477694, -1108638, 186831, +-2639258, 4702453, 1411971, -2145336, 2526515, 4770098, 635655, 3671660, 3614752, -5090073, +1531693, -3888019, -1195075, 1006633, 21640730, 15575699, 24380918, -21556978, -16186121, -36965172, +16002511, -4074850, -31572304, -6089190, 3058017, 4702453, -11759620, 12918188, 10937671, 1263257, +-82141, 2050847, -5178120, -10973641, 2491618, -6225018, -10241350, -97711, 24044838, 780610, +-3571265, -19139448, 8158291, 15175730, -7763154, -23102630, -4124779, 7830263, 2840047, -4879620, +5116917, 1678259, 8399345, -2310156, 13804562, 21005074, 8016020, -13920526, 15890842, 7144678, +-17781702, -18985366, 20750598, 10019622, -7960722, -9252970, -369904, -16827682, 12425877, 16273094, +-294742, 937914, 4186519, -2059974, 17881022, 6000070, 4721780, -7355669, 2974265, 6024229, +22064858, -5254356, 8519605, -16998406, -19276350, 17300128, -2499134, -1600412, 1896228, 16489453, +473520, -760746, 10510859, -4961761, 2189360, 9554155, 11763915, -5557151, -7133941, -15618649, +-7588671, 5117454, -6781754, 5451924, -46708, 5784247, -2997887, 4268124, 1014686, -2398202, +2011118, 8749385, 2290828, 8709120, 2762738, -5498632, 494458, 3637837, 3154117, -5396627, +-4807679, -5257040, -2111513, -4129074, -3896609, -6422587, -2615635, 3586298, 2430415, -649614, +-889058, 1962800, -4110821, -99321, 5661841, -1545115, -726923, -2642479, -2063732, -1150514, +-7979513, -1140851, -2988760, -3249680, -4851166, -7015292, -24796456, -1812476, -16137266, -32996086, +-34013456, -14559939, -25910464, -11610907, -3973919, 4951024, 14884746, 16575889, 1924145, -8581345, +17835388, -8688182, 8918500, -32575180, -2976949, -22268332, -14861661, 15503758, 10961293, 10669773, +3717294, 22215182, -1968706, -1124745, -15569256, -5235029, -2934537, -10518912, -10624138, -26725434, +-10356240, -2729452, -4098473, -16440598, 15009837, 6125697, 9057549, -7099581, -2578054, -40687300, +-11548093, -11035918, 9730248, 21226802, -12674985, -1735704, -23598698, -1475858, 12524662, -3663070, +-7804493, 5610838, 17854180, 30284352, 6564321, 1197222, -1410897, -7815230, -11774653, 8275865, +-7673496, 27491012, 5608691, 11973832, 55818468, -10817412, -9207873, -13797582, -19227494, -2402497, +19233400, 8784819, 2964601, 6555731, -7778186, -5986648, -16703128, -3822521, 9782325, -1320703, +-3498251, -1356673, -3702262, 2232309, -374736, 3929358, 3995930, 4052839, 5265093, 5721434, +14405320, 8871255, -4995047, 8467528, 31675, 753230, 6172405, -6622303, 380641, -7676181, +-4527433, -10591389, -7781407, -11058467, -9110163, -6052683, 12620225, -7480223, -4092567, -8864276, +819802, 2910377, -1711545, 3937948, 1753420, -22012, -7418483, -27755152, 15832860, 26058104, +-15337865, 822486, 5890011, -8959839, -2110440, -19419158, -345745, -10886668, 28308130, 8053, +-5269388, 22687628, -5701032, 6597070, -25957708, 13498008, 4090420, 17584132, -8143258, 13088913, +23191212, 24829206, 14014478, 22377854, 11549167, -3585761, 21844204, -10561861, -14249628, -4621922, +8823473, 14725295, -35337380, -2456721, -22810572, 18131204, 8324184, -496069, 6353867, 25401510, +1194538, 22662394, 9809705, 34343096, 3207804, -3973919, 15182709, 4920422, -17416092, 3710315, +-1918777, -23591182, 16641925, -14256070, -22828288, -47029356, 3787624, -5858873, 27768038, -15455977, +37115496, 12127914, -462783, -5726802, 14578730, 15129022, -26873610, -11625940, -19810536, 6888591, +-8839580, 20226074, 6644315, 6750078, 10004589, -4754529, 1939178, -7188165, -2266669, 492311, +-2465848, -20970714, 8470212, -115964, 6414534, 125091, -5921150, 592706, 8780524, -13980119, +12232067, -5172751, 219043, 1284195, -11409044, -1074816, 7328288, 3493419, -8104067, -3543885, +-1736777, -9913321, 3604551, -2878702, 14644765, -11569568, 5428302, 9918690, 3914863, -4311611, +-2801929, 4789426, 2738042, 2947958, -2175401, 4970888, -14954002, 4041027, 4071629, 6528887, +-4248260, -7226283, 966368, 6394133, 1330366, 17534204, -12265890, -13685376, -13470628, 16850230, +8584566, 22040162, 5881958, 68863896, -20874614, 49929, 193810, 31883690, 13008382, 14590541, +-21453898, 8957154, -8657580, 277562, -10100152, 1830193, 22948548, -6444599, 7054484, 44659068, +13791140, -20691004, -24182276, 2456185, 29004452, 14979772, 5245229, -11667816, 24641838, 3922379, +-4034585, -27757836, 8059506, -4676683, 11496017, -25226490, -15534897, 983011, -6667400, 2962991, +-23559506, -1116155, -14499810, 6267431, 20264730, 16149077, 5057324, -32185948, -62277, 2837363, +-29052232, -25965224, -17331266, -14337675, -14333380, 22420266, 4861903, -963146, 14491220, 23325430, +5975910, 20159502, 223338, 13241384, 90058488, -20936354, 14563160, 10064719, -16213502, 3053185, +-60559576, 901943, 29577830, 7517804, -16900160, 22716618, 5221070, 8449811, -15357192, -3722126, +-13167296, 4201552, 791348, 834297, 4831302, -18972482, 6583648, -10547366, -7771744, -25862146, +6019397, 5560909, 4771709, 6272263, 31662498, 4522064, 3102577, 3364570, 2184528, 18809810, +1929514, 7765301, 6372121, 14276471, 5549635, -1184337, -3543348, -2961917, 2110440, 8939974, +10734197, 2957085, -17096118, -8024073, -4024921, -4032974, -5851893, -17848274, -4561792, 5880884, +13155485, 36283884, -17322140, -1185948, -24855512, -18153216, 5515275, 15715822, -20608326, 23929410, +9881646, -32161252, 19298898, -13220446, -16049219, -1651415, -19346680, 4150012, -8810052, 24270324, +-14449344, -1465658, 13284334, -47862580, 6546604, 14396730, -14595373, 11346767, -28963648, 28341952, +2888903, 4581120, -54575076, 48668960, 20786032, 15731928, 840740, -31355946, 28164784, -2194192, +-14305462, 49760416, -10216117, -22410066, -11827803, 5661841, 14287746, 13340168, 3437585, -8858907, +-59261960, -7079180, 14554570, 446677, 21465710, -31412854, 31777390, 2822867, 10608032, -31933618, +-9310952, 4634270, 40568652, -17399986, 9327058, -29635274, 25617332, 14014478, 24166170, -9856413, +10601590, 3743064, -32091996, -30939334, 16564615, 13211319, 25799868, 5082020, 33165738, -50752016, +-65947076, 10001905, -14059575, 36653252, -24426016, -5764920, 4102768, -28524488, 1205812, -17246442, +14385456, 20117626, 1887101, 16214038, 18264348, 4926328, -16830904, -8971113, 29492466, 14871324, +3678103, 4613332, -9069360, 127238, 17891760, 9534291, -14792941, -8866423, 16637093, -2986613, +10303627, 9910100, -6632503, -9210557, -8841190, -562104, 8800925, 3417183, 11305428, 15796353, +1183800, -1183264, 13253732, 158377, 2531346, 3562139, -5782637, 3903052, -9987410, 4884989, +1844152, -490700, 4165045, -4853850, -45926084, 41895260, -9034464, -10115185, -16340203, -4774930, +-36211944, -67626408, 23363548, 19417548, -2970507, -13943611, -27540940, -4553202, -8535174, -14653892, +26658862, -60483340, -25834228, -31933618, -9511742, -46055472, -4234838, -6944425, -1642288, -7722351, +-9330816, 7410429, -448824, -20391968, -6377490, -473520, -27886686, -14913200, -8225399, 2020782, +21472688, -11033234, 43035572, -22501870, -3224984, 18078592, -19197430, 11650636, 2441689, -29521458, +-44141528, -10843182, 11259794, 40223980, 17443472, -30862562, -13063143, -88550952, -29646012, -6421513, +18597208, 48029544, -2579128, -51536388, 2826625, 27919434, -10331544, -2487860, 29606284, 31149250, +71547176, -79177720, -15399068, 11144903, 19955492, -25046638, -29721710, -42385960, -42083164, -23584740, +-19617800, -5595806, -3104725, -48978196, -20365124, -18022756, 17976586, -9342628, -4945118, 43898324, +33204930, 2542084, -6437619, -2160369, -27355184, -1360968, 9513889, -19807852, -10712722, 3554086, +12221329, -8508867, -9844065, -6706055, 13631689, -9375914, 14279693, 825171, 14738717, 10434623, +10532334, -8502425, 5173825, -20846160, 10308995, -2973728, 5926518, -18488224, -14462765, -2335925, +4321274, -10561325, -140123, -23405424, -4480725, -3111167, 9421011, 11864847, -15181636, 29759828, +106300, 10787884, 6152541, 21418466, 21298206, -1498944, 13295071, -25519622, 6718940, -10059887, +-62293668, 14647449, -10263898, 18991272, -16876000, -17424146, 1804960, -25824564, 4948876, -26047366, +-57982, -4191888, -9900436, 13153337, -19279572, -25356414, -23046794, -29853244, -4582193, -2906082, +34029024, 7820599, -23992224, -35992364, 5264556, -381178, 9152038, -6704444, 20820928, -23548232, +-9015673, -33229088, -21013128, -9293772, 1611150, -13824426, 35506496, -11878269, -29420526, 9646497, +36841156, 26714160, 11274826, -25355876, -16223702, -2285996, 33510408, 63504312, -54761, 12758737, +-11587822, -61495880, -13045963, 5934034, 23854786, 53064856, -28672128, -35470524, 21540872, 10261214, +-11865921, 1964948, -19096498, 12433393, -51688856, -5731097, 3567507, 12970801, -30928596, 36621040, +-50523848, -57897232, -53111564, 27376122, -10424959, 51448340, -70762272, -30838402, 6340446, 73117520, +-5233955, -12728136, -39464844, -14439680, -4050154, 35377108, -2338610, 75162, 2749316, 6330782, +1352915, -302258, -14512694, -12715788, 17435956, 7610682, 2709051, -37958384, 10248329, -9616969, +-3827353, -19564112, 1582696, -1586454, -2913599, -44727788, 4854924, -9763534, -4436701, -3723737, +8323647, 7516, 3491272, -154082, 984621, -537, 923955, -16245177, -2454037, -10413685, +-8324721, 7936026, 8860518, -13030931, 1221918, -9261023, 12949863, -4433480, -20117626, 3221762, +36753644, 10874857, -67126040, -12328704, -46494096, 19996294, 3267933, -92053496, 5662915, -28657632, +-59905668, -46626700, -68291056, 41427644, -21265994, -53739704, -24575266, 16864190, -32395864, -27855010, +-22036940, -13134547, -24240796, -23848880, -43906912, -31700080, -59998544, -33870112, -30866856, -10361072, +-28639916, -6109054, -13778792, -1169305, 1558536, 7542500, 15915538, -16716013, 13105556, 1343251, +29730300, 12941273, 18282066, 18879602, -56392384, -14949171, 43914428, -7984881, -28452548, -31519692, +-23904714, 17580912, 71293776, -5097590, -1902671, -48678624, -50183472, -10730439, 9330816, 42789148, +-3839164, 38970384, 13657459, -47837344, 84849760, 1315334, 65802120, -164819, -17995912, 35498980, +-49028124, -62414464, -40786620, -137842144, -84461608, -27719182, 61938796, 38279968, -56251724, -36674188, +-85418848, 41411536, 54633056, -43482248, -44268764, 9478993, 35647156, 52038360, 13466333, 29637958, +-29263222, -15882252, -22403086, -32563368, -14468671, -3441880, 1737314, 743566, -18888192, 2141578, +10527502, 3282966, -4211216, -13356275, -10078678, -15161235, -6913824, -22111028, -6151467, 12411382, +-22416508, -34600256, -6620155, -23023710, -16834124, -3502546, -30329986, -22987738, -7592966, 12671227, +12261595, 14719390, -2282238, -13287555, -4053376, 3940633, -9367861, 19947976, -1129576, 14305999, +-1293859, -1436130, 13304735, 10633802, 15129559, 36419176, 21452824, 26664768, -23364622, -56738128, +65994856, 63124744, -39915816, -51758652, -255014, 56654912, -6158446, -3252364, -17667884, 49557480, +-5521181, -13168907, -1242856, 13728326, 25380036, 740345, -19138374, -21662742, 30499100, 2339684, +-13190381, -32599876, 18514530, 10334228, -3786014, -25667262, 8022462, 11175505, 9116605, -16190953, +-9863929, 2982318, 25114284, -7304666, 8955007, -36968396, -10424959, 180389, 24311662, -51495048, +-9339406, 5154498, 37034428, -17721572, 5633387, -26234198, 3461207, 11068668, -18284212, -13677860, +-2297808, 6194954, 11178726, -11602854, 637266, -45838040, 24732570, -7518341, 42928736, -26546656, +19050864, -18006114, 19808390, 3924526, 13217762, 11559368, -33680596, 38067904, 7283191, 22050362, +-37165424, 10477573, -9616432, 6085432, -10757282, 1682017, -2787971, 5258114, 12319577, -1748589, +-15014669, -8559333, 3528853, -1760400, 674310, -5519570, -14651744, 5062693, 3557844, -4224101, +-4347044, -24696, -4791573, 923955, -8113730, 0, -4115653, 6720550, 3478924, -2426657, +-6113886, 2270427, -149787, -4847408, 3419868, -15526844, -462783, -1586990, 6708739, 537, +17865454, -11809013, -12611098, -3914863, 9269613, -12809203, 19178640, -16135655, 7939784, -7779260, +17451526, -15664283, 19235548, -10870562, 14966350, -13581760, 23455354, -22157200, 16898548, -4927401, +12643310, -11843909, 12430172, -13454522, 14077292, -13554380, 11254425, -9014599, 12492986, -9713605, +10415296, -9676561, 2931315, -3140158, 6311455, -4794794, 5186173, -4241817, 4224637, -3034931, +5826123, -3564823, 2267206, -2790118, 3100430, -2425583, 1115081, 488553, -19240916, -42899744, +-57077968, 41793788, 27759984, -32510218, -46368468, -22673670, 21611738, 11380053, 28716688, 30903900, +6133750, -15440407, -4431333, 10873247, -10497974, -772557, 6470905, 1842541, 17344152, 12152073, +5326297, -15427523, -477815, -9517648, 10104984, -16167868, -13992467, 11905112, -3656628, -6525129, +-6404870, -11210938, -15403363, 1281511, 12758200, 11649025, 9782862, -3583613, -12685186, -11005854, +-7668664, 13904420, 18874770, -8654359, -13030931, -5579163, 15677704, 8149164, 20941724, -14636175, +-5512054, 8338142, -3837017, 789737, -2142115, 7503845, 4528506, 6082211, 1345399, -13996762, +5927592, 2731062, -433255, 11032160, -5586142, -2680060, 1973001, -1901060, 1486596, -3970161, +18591302, 4769025, -1412507, 17750562, 17745732, -17830556, -27095338, -9838159, -18532784, 681826, +12393665, 3645354, -11053635, -13303124, -3503083, -2461553, 10778757, 5239860, 6747394, 10157061, +6195491, -5456756, 6271726, 4530654, -13006772, -17394618, 5326297, -4483409, 8797704, 6546067, +-9542880, -2427194, -3193845, -3379066, -11101954, -5983427, -623844, 3680787, 5406827, 15012521, +-7329899, -5383205, 3876745, -3296388, -4307316, 8843875, 368293, 19603304, -47634944, -125403920, +-46101644, 22486302, 65233036, 137773424, 92197912, 23722714, 34942244, -18420578, -56082608, -93145496, +-81036904, -64435784, -18580028, 2469606, 44824428, 49407156, 105197704, 51060180, 33675764, -2652679, +-22422950, -50646256, -26291642, -40956808, -47215648, -29086056, -24336896, -1829656, 13157632, 39343512, +24333674, 28236188, 25683904, 25941602, 39046084, 3353833, 27056146, -5033702, -12139188, -32964948, +-19625316, -49154292, -72321880, -63218160, 753767, -10768557, 19844360, 33960308, 18643916, 52395916, +45781132, 66227320, 37723236, 44907640, 2237141, 2187212, -35413616, -57905824, -67627480, -81226960, +-53359600, -66387308, -5566278, -288837, 31961000, 33481954, 80232136, 62986768, 89620936, 36341864, +41909756, 17443472, -358093, -53494892, -87195888, -58430884, -69655776, -43438764, -47158740, -4438849, +7319161, 27814208, 36553928, 49466212, 50548008, 48551384, 31836446, 34757560, 9083856, -6337224, +-11926050, -39210368, -35694936, -46939160, -33120104, -46922516, -35701380, -3764002, 8404177, 24684250, +37347960, 33252174, 34338800, 56484724, 20500416, 34473556, 26528402, -35676684, -64471756, -28008556, +-56842280, -35904316, -19477140, -4107599, 5111011, 18074296, 32869384, 22803592, 35358856, 22369264, +19273666, 7709467, -2115272, -20561082, -6688875, -9667971, -35938140, -33678448, -9214315, -3845070, +1974611, 11789685, 13902272, 17510044, 14091788, 13838921, 5286568, 4650376, -111132, -7901129, +-3817689, -2899103, -7912941, -12837120, -4249334, -6426345, -7367480, -877784, 3577708, 3899830, +6002754, 7105487, 8892730, 5690832, 4224637, 1312113, -700617, -2229625, -3507378, -4809827, +-5105643, -3714610, -2746632, -2067490, -1822677, 41876, 975494, 1110786, 1637456, 1739462, +2630131, 3909494, 3933116, 1130113, 780610, 1054951, -507880, -2042257, -2685428, -3712462, +-3187403, -2237141, -657130, -887985, -36507, 1539746, 1659468, 1575179, 2268817, 1816771, +1059246, 74088, 63888, 117038, -257698, -1005022, -863288, -1021665, -999117, -1023813, +-650688, -391379, 114890, 441308, 841814, 932545, 733903, -30602, 353798, 511638, +343061, -132607, -598611, -794032, -656593, -408559, -60666, 222265, 530965, 369904, +141734, 164819, 227633, -165893, -328028, -277025, -264677, -208843, 12348, -11274, +26307, 100932, 104690, 48318, 19327, 10201, -9664, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 7642895, -806917, -2076080, -2172180, 1324997, -3704409, -62277, -7210177, 5160403, 6544994, 4571456, -6441377, -7742216, 619549, 1764695, -2765422, -2129230, -1893007, -9066676, -1531156, 5382668, --9283572, -7543573, 4381404, 3972308, -5967320, -2084133, 3939559, 501437, 4790499, 2051384, -4990215, -3142306, 949188, 688805, -1334661, 2323041, 1822140, 3388192, 1416802, -1501628, -318364, 3786014, -1031866, -1727114, -649077, -4586488, -10122701, 6010807, 2911451, -3168075, -4429722, -1780264, 483184, -158377, 2053531, -2672544, -702227, 5973763, -5637145, -2259690, -1946157, 972810, -879931, -280247, 2610803, 296890, 2310156, -4014721, 4072703, 2097555, --5239323, 4163434, 359704, 1506460, -634581, -1557463, -6114423, -1891396, -467615, 3134789, --816581, 2563022, -1545115, 302258, 753767, 304406, 1809255, -327491, 114354, -224949, --1248225, -566399, 231391, -666257, 75162, -33286, -293668, 1666447, 1666447, 871342, -687732, 606127, 204011, 3758, 211527, 89121, -267362, -747324, -851477, -191663, --88584, 11988327, -6839199, 2134062, -7562901, 949725, 1812476, -7624641, -9651328, 2455111, --10474351, 2351495, -2705830, -689879, -6410776, -898722, -7203197, -3685082, 63888, -7622493, -8172786, 2901251, -12666395, 1242319, -665183, -2264522, -5403069, 2767570, 6623377, 166967, --452045, 6221260, -3600793, 114354, -2280628, 4134443, -4769025, 1443646, 5814312, -4997732, -5088463, 1813013, 5500780, -434865, 1271847, -793495, -2279017, 7199439, -8863739, 2085744, --3907347, -1676111, -1131724, -3204583, -2366527, -7056095, -4428648, -1074816, 4642860, -360777, -1759326, 6492380, -126165, -5569499, -696322, 234613, 1776506, -2703145, 31139, -5478231, -138513, -2212445, 1842541, 2894271, 4233764, 1531693, -2357937, -3064996, 4154844, -1354525, --1874753, 801548, 2318746, 4793184, 598611, 1395864, -293132, 2821794, -525597, -2184528, --1115081, -1067299, -83752, 1921998, 386010, -97711, -991064, 1862942, 10737, -660351, --498753, -442919, -520228, 899259, -353261, -64961, -1046898, -2835215, -9854266, -76236, --5921686, -1842004, -928787, -6916508, -909459, -1581622, 3495567, 8149701, 8203388, 1007170, --3442416, 3298535, -7857643, -1094680, -2978560, 2790118, -11731166, 4192425, 2041720, -396748, --3341485, -5044439, -2273112, -4156455, -3554622, 2234457, -739271, -4484483, -1267015, 943819, -7740068, -268435, -7718593, 636192, 3396782, -69793, -2393371, 671089, 2978560, -8417062, --603443, -3646427, 5985574, 3635690, 1060857, -7781944, 938450, 3028489, 4842576, 4499515, --5072893, -2391760, 290984, -1583769, -1549410, 4190814, -2528662, 2571612, 760746, -3263102, --678605, -4490389, 5491116, 2054068, -5300527, -3685082, 970126, 2859375, -4190278, -5354751, --847719, 278099, -3502546, 778463, -1397475, 1820529, -3333432, 5066988, 2779381, 3820910, -1160715, 509491, 3502546, 4647155, 614180, 1323387, -369904, 663572, 153545, -191126, -593779, 391916, 614717, -733366, 104153, 355409, -180926, 79457, 1626182, -903554, -433255, -1082869, -782758, -729071, 241592, 578747, 478352, 44560, -918586, -674847, -1672353, -16796006, 5485210, 4909685, 8195335, -2076080, 5162014, -14483167, -3929895, 4588099, -580357, -7146289, -1830730, -2354716, -12679817, -5120675, 1330903, -549756, -9028558, 5698885, -8092256, -8235063, 6316823, -10795400, -3642132, -940061, 3768297, -27917, -4349728, 3000572, -1522029, -694174, 4879083, -2313377, -3076270, -945430, -1738388, -3177202, 4800700, -3630858, -1389422, 3589519, -683974, -2807298, -5275831, -621697, -3752191, -1135482, -4372277, -1171989, -9862319, 222265, 6013491, -5459977, 5053029, -1546188, -7981123, -4714801, 4486094, -2898566, --4037269, 2947958, -4754529, 4012573, 1118839, -1459752, 5268851, 4733054, 2126546, -5167383, --5821828, -391379, 7856569, 1567126, 1230508, -4414690, 1200443, 2819646, -5912023, -2168422, -1984812, 4173098, 2112050, 3534221, -150861, 45097, 1345935, 177167, -621160, 223338, --460098, -742493, -2586644, -2098092, 692027, -1258962, -704912, 897111, 450972, 658741, --114354, 1087701, -647466, 60666, -876173, 18254, -1073742, 571231, 245887, 779537, --1415729, -8842801, -8396661, -5494874, 1229434, -1279900, 3675955, -2939905, 173946, 784368, --2387465, -807991, 2327872, -2371896, 10190347, -6412386, 4810364, -1564979, -515933, -4507032, --1113470, -488016, 7477001, -4834523, 824634, 1570884, -6996502, -4228396, -4725001, -4008815, --8137353, -2711198, 3160022, 5785321, 3741990, -6483790, -9184788, -1906429, 459562, -4616553, -1046898, -3089692, -4707821, -11436424, -5648419, -7973070, 4853313, -1955284, 3977140, -4519380, --11117523, -5844914, 734976, -2157684, -3528853, -1543504, -4269735, 6173479, 718870, 3652870, -4877472, 1330366, -15569, -3776887, 353261, 5245229, -701690, -3642669, -5060545, 8542690, --6811282, -9626095, -6714108, -3834869, -5240934, 6249715, 9940165, -7641284, -5180268, 1333587, -4918275, 7408282, 5938866, 4625143, 4617090, -1436130, -1749125, -2080375, -2103997, 1933272, --1215476, 621697, -1523640, -2627983, -933619, -1855963, 1650878, -1110249, -2266132, -1305670, --1226213, -2341294, -2537252, -1580011, -493384, 676994, 690953, 1416266, 363998, -4115653, -704912, -523986, -1505386, 628676, -539018, -1153736, -2578591, -2165201, 283468, 135828, --728534, -945967, 209380, -1174674, 935229, -1007170, -470299, -374736, -1768990, 2319819, --18468360, 5707475, -1298691, 3273302, 10144176, 3978750, -2495376, 3428458, -7611219, 4712116, -5548561, -10071161, -2132988, -5104569, 5697274, 4930086, 7726110, 8924942, -11587822, -5995775, -1940252, 9959492, -3757023, 4619774, -11071352, -3374234, -3861176, -2377801, -6686727, 1641214, --10954314, 7589744, -2119030, -1978906, 5606543, -362388, 1314797, 5881958, 207232, 4807142, -3292093, -1406065, -1856500, -691490, -7663833, -5697274, -6995428, -486942, 14720464, 3361886, -2896956, -389768, -1984275, -170188, 8827768, -1923609, 2810519, -16957068, 15627239, -3823595, --2704756, 837519, 9603547, 3409130, -1516124, -5857799, 16749299, -3277060, -119185, 5274757, --4136591, -94489, 2478733, -3825205, 3383897, 3196530, 13859859, -6925635, -8525510, -1662152, -4219806, -5260261, 1257352, 3477850, 1243930, -3111704, 1472100, 3563212, -2191507, 237834, --3824669, -1328756, -1040993, -3310346, 4345970, -3155727, -2471217, 1831804, 4832, -3729105, --197569, 773631, 1693828, 72478, 1973001, -1423782, -983548, -1182727, 1377611, -1454920, -2340220, 124017, -774168, 885300, 2443837, -4173098, -163746, -1162862, 7885560, 4374424, -8788040, -3671123, -2227478, 5017596, -8319889, 7280507, 8323647, -4335233, -820339, -13362180, -519154, 4453881, 3582540, -2914672, -9126806, -18401250, 185220, -3216931, -8791798, 1918240, -5727339, -8049843, -3494493, -8769786, 4273493, 390842, -1399623, -2986613, -3866008, 9233643, -10788421, 4132296, 5083094, -2534031, -5581847, 15090904, 3669513, -2697240, -9035001, 6472516, -164283, 8633421, -881005, 10693395, 5293011, 7451769, 6283001, 3153043, 8298414, 10387378, --410169, 1835025, -3460133, -213138, 5617281, 2292439, 3004867, -9382893, -3515968, -2061047, --8188892, -7829189, -5198521, 4225174, 8810052, 11558294, 15149423, 3295314, 1225676, 12193412, --5009006, -9367324, -3336116, -4792110, 7849590, 6404870, 2384244, -8875013, -2499134, 1470489, -1166621, -1802276, -4153234, 1145683, 925565, 4985920, -1324997, -2899103, 481573, 897648, -1138166, 7516, -32749, 921271, 2221035, -1729261, -1706713, 69793, -305480, -2390686, --634581, -3025805, 3113851, 955093, -2317135, -173409, 2078764, -1222455, -297427, -1828046, -863288, 1071058, -875100, 2712272, 2017024, -384936, 14025753, -13481365, -6387153, -1893544, -5318244, -12620761, 7829726, -12436615, 5983963, -136365, 6356015, 10102837, -4262755, 9217537, -10106058, 9586904, -5700496, 8070244, -8883066, -7121056, -1171989, -5528160, -166430, -4769561, -7927973, -6034429, 1683627, -5959804, -10350871, -4897874, -2239826, 12306692, -10486163, 9669582, -4231617, -14532559, 16467978, 3962644, 1773822, 11504070, 1992865, 409096, -6648610, -147103, --3741990, 13130789, 5527623, 9168681, -3681861, -2307471, 6328635, 10915123, -11595338, 11314554, -2027761, -1977296, -2209761, -10983842, 5179194, -5247913, 2155537, 361314, -9903121, 3203509, -8285529, -7698192, 5237713, 3339874, 11621645, 1115618, -836982, 6957847, 10160282, 702764, --5902359, 6725382, -7947300, -4246649, 2064806, -3331284, 2092186, -2697776, 975494, 4279935, -3186866, -3359738, 2781528, -1795833, 2237141, -2401424, 7074885, 578747, 6755447, -954020, -1671279, -1574642, -616328, -2308008, 4275640, 1664300, -3569118, 3563212, 4288525, -622233, --613107, 2485712, -205622, -370441, 3572876, -258235, 867047, 2167885, 1503775, -707596, -2731062, -2419677, -425202, 376347, 736587, 456877, -157840, -478352, -2730526, 1142998, -4062502, 1005022, -11422466, -8178155, 12395276, -15913928, 3994857, -8480413, 9436580, -10118943, -15422691, 5330592, 1486596, -13409425, 6818798, 11314554, 2991445, -6904697, -4478041, -3962644, -10521596, 5701032, -14687178, 2054068, -10389526, -597537, 1191317, -8905615, 11645804, 11659762, --5301064, 2535105, 7933879, -9709847, -1466195, -3010235, -8009041, 17019344, -6187438, -3845070, --8575976, -14374719, -2263448, 231928, -4942434, 2096481, -11855183, 1010928, 854699, -2415919, -9400610, -1993402, -7279433, 3761318, 15032, -5502390, 4708358, 20171850, -4019553, 4770635, -1127966, -13771276, -2204929, 12206834, 5552319, 12117176, -1214402, 6986301, -9654013, 4303557, -4318053, 1385664, -8196408, 7567196, 2732136, -21410412, 1708860, -3907347, 14332843, -5534602, -11141682, 10225243, 8309688, -1073742, 3221762, 433792, 886911, -1444183, -2297271, 5528697, -2312303, -129923, -3641596, -5230197, -1141388, 2162516, 3692061, 2541547, 4720706, 106837, --1186485, -1976759, -1423782, 1624571, 2859375, -315143, 2275259, 1380295, 489089, 1953136, --300111, 2043868, -3402151, -4381404, -5594195, -331786, 2683281, 1112933, -2572149, -1033477, --1768453, -2133525, 3581466, 997506, 1657321, 1402307, -25104620, 28077812, 3183645, 10995116, --20620674, 11034308, 14405320, -16913044, 6245956, 8156680, 6280853, -10980621, 1279900, 1766305, --3798899, 6179921, 12890271, -10608569, -8846559, -3331284, 10906533, 9407052, 13370233, -798864, -5566815, -10215043, -2776696, -2763275, 2070174, 6203007, 17130478, 10134512, 6140193, 3135326, --710817, 8100845, -3191161, -14967961, -3014530, 4207458, 4596689, -8822400, -6703907, -10890426, -1939178, -1003412, 3636764, -7191923, 12474196, 12175159, -10806675, 25227564, 1031329, -2483565, --276489, -5435281, -1273458, -1777043, -10392747, 18254, -98247, 6584722, -21485038, 5079336, --7697655, 15360414, 18607946, 7956427, 7657927, 3346853, 1125281, 16760036, -3296924, -12661564, -10580115, -5787469, 2747169, 8201240, 15117211, 1986959, 1382443, -12354473, -650688, 3413962, -9554155, -4358855, 5136781, 2378338, -3819300, 9667971, 1542430, 4248260, -2976412, -1061931, --2949569, 323733, 1018444, -1653562, -195958, 2803003, -1743220, 2842732, 1911797, -2248416, --329102, 1237488, -989990, 83215, -2116345, -6781754, -2006287, -1163936, 6827388, 8420283, -743566, 1107565, -2560338, -3022583, 627602, 782221, -3678640, -2937758, -1954210, -1775969, -2214593, -4123169, -278099, -3069828, 10419054, 2117956, -6991133, 6806450, 10147397, 8825084, -5636071, 10497437, -12432857, -7890929, 1562294, -11251741, -2681133, -1803886, 2669322, -2821794, --7232725, -9165460, -5426155, 4669167, 7965017, -13595719, 3043521, -1344325, -221728, -16405701, --14670535, -2497524, -11345693, 5506148, -12957379, 923418, 7159174, 10162966, -8786966, 12059731, -3207267, -1111323, -2493229, 17844516, -4801774, -810675, -14127758, -7955890, 11794517, -815507, -4561792, -13673028, -14890652, -4045859, -8333847, -1413044, 815507, -5486821, -6957847, 4297652, --6446209, 644782, -9574556, -5202279, -85362, -15986405, 1642288, 10622528, 2179696, 5607617, -11669963, 19772956, -18854370, 3525095, -11567958, -11355894, -6211060, -8616778, -5397700, -5063767, -19466402, 10669236, 10856067, 2271501, 3316789, -13894756, 863825, -4860829, 2415919, -6005975, -8723615, 11319386, 1291175, -5055714, -3274913, -9577240, 1066763, 5964099, 3472481, -2284386, -6301254, 2986613, 6660958, -1345935, -986232, 1101122, 4406637, -2642479, 1998770, -3906810, --5275294, 3998615, 1633698, 851477, 1091459, -7435126, -4231617, -6442, 5953899, -4804995, -3088618, -6451041, -1950989, -1009317, 2513630, 1582159, -1710471, -1557999, -8391829, 3684008, -20176146, 21372832, 23446226, -16902306, 1559610, 12788802, 10126996, -9744744, -18935974, -1930588, --2570001, -14818711, -8452496, 29025388, 2554432, 2275796, 11039140, -929324, 4887136, -3642132, --11099269, 7822209, 6563784, -15098958, -21626770, -16660178, -13208635, -12530567, 1522029, 4065187, -6805913, -8221105, 8661338, 2338610, -3912715, -8716099, -23085, 838592, -13688061, -10598906, -1881733, -2185602, 2182917, -8123394, 7116761, 2472291, -7696045, -16747688, -6487011, -5423470, --22464290, -6817724, 2390149, 11585674, -826244, 13656922, -2090039, -765041, -19113678, -3760781, -7868380, 3992172, -32160178, 9652939, 3059091, -8672613, -5247913, -9059697, -10394358, -54761, -735513, -9907416, -3070902, 6938520, 9693204, 15266461, -11142756, 927713, 8639864, 8053, --24551644, -19368156, 4295, -4835597, 6437082, 214748, -5868536, -8473970, 4322348, -2151242, -3945464, 10541460, -52076, -4597763, -8224326, -15075335, -5068599, 1367410, -2348810, -2186138, -1230508, 1446867, 7100655, -3093987, 931471, 3031173, 1574642, -5151814, 853088, -969589, --13276818, 1835562, -4786204, -5622649, 2388539, 2128693, -3886409, -805843, 5053029, 1897302, -1484985, -4490389, -5454609, -1486596, -237297, 801548, 3643743, -5913633, -520228, -3706557, --2312840, -4874788, 8249559, -6431714, 22857280, -18993420, -11588896, -3609383, -36208720, -18747532, -188442, -22945326, 18351858, -7857106, -7260642, 2397666, 41649372, 20299090, 1551557, 8831527, --1655710, -10764799, -841814, -16837346, -12174622, 6260989, 6259915, 7773354, -11688753, 15649787, -9608379, 17663054, -17343078, 3187403, 25884694, 2762201, 1285806, 5429376, -24363738, 6649683, --5989869, 4420595, -9681393, -22840636, -1205275, 9766219, 11649025, 3347390, -3419331, 2076080, --861141, 8087961, -17336636, -25121264, 4758824, -8913668, 15422154, -5691369, -6157910, 20306606, -4658429, 8970039, 1763621, -16405164, -6729677, -1591285, 9244380, 26671746, 20360830, -5598490, --23046794, -46171, -2518462, 9031242, -14159433, -17484274, -10037875, 8935679, -18030272, -2386391, --15111306, 550830, 12410308, 84826, -22724136, -4559108, 3149285, 6481106, 2961917, -13768055, --9493488, -14762876, 2467996, -2712272, -6524056, -4595078, -6524592, 1789928, -2669859, -5822365, --1707250, 4977867, 58519, 310848, -7673496, 337155, -653909, -4406100, 477278, 10063645, -3249680, 2275259, -9753871, 4362076, -1032403, -578210, 1583769, 327491, -155156, -1450088, --5807333, -5937256, -5319317, 7193534, 5791764, -2094870, -14555644, -4799089, -5400922, -589484, --7751342, -41739028, 15823196, 12939663, -6300717, -27665494, -6257768, -10795937, -11325829, 11880953, -14763950, -1759326, 3899830, -31416612, 10800769, -39266200, -10057203, -3621731, 7599945, 19407346, -31022548, 12710956, -18225694, 3959960, 21629992, 2659122, 6469295, 11582453, -18512920, -7329899, --3052111, 5319317, -13083544, -7208029, -4070555, -9969156, -7556458, 12991739, 12860743, 3078418, -941672, 22165790, -4357781, 10207527, -25495462, 16546898, 4678830, -23267448, 2221035, 7090991, --21740050, -3070365, -21262236, 6788196, 8785356, 9209484, -14349486, -1513439, 14096620, -12137578, -56371, -2207613, 23347980, -14188961, 17176112, 8449274, -21955336, 18877456, -16189879, 12032888, -16175384, -16755204, 9181029, -14347875, -17535278, -26627186, -22025666, -24383066, -5827197, 3948686, --7320772, 20680268, 21757768, -9585830, 19168440, -3310883, -4130148, 24109798, -5516349, -16771847, -11344082, -2838974, -12874701, -10239202, 9613211, 1328756, 4955856, 7263864, 1298154, 5899138, -9680319, -3008088, 10863583, 7089918, 5396090, 5783174, 866510, 3382287, 9233106, 7036767, -9364102, 964757, 7771744, -1906966, 508954, 6354404, -3403762, -12702366, 5766531, 1484448, --9664, -224412, 5510980, -11323681, 5546414, 7129646, 6176700, -7689065, 6323803, -33299956, --15965467, -16601659, 28340342, 443992, 10331544, -5106716, 40367324, 6009196, -27659052, 1563905, -29551522, -11533061, 6261526, -5384279, 2185602, -17951890, -24041080, 37048924, 26269630, -10706280, -20068772, 7607998, 26230440, 29845728, -9261560, -7597261, 26526254, 19296752, 1782411, -8966818, --13793824, -14499810, 12063489, 23298050, 10759967, -4793721, 15560130, -8860518, 14748381, -7243999, -21692270, 38679940, 29402272, -32351304, 14162655, -5906117, -13396540, -897648, 10698227, 10253698, -71093520, -7701950, -1160178, -12123619, -13106093, 13443248, 25419228, -6813966, 19223736, 16281147, --2665564, 106300, -14333380, 13686450, 11499238, 37549288, 38270308, 46488728, 19100794, -12494060, --10143102, -22093312, 20662550, -32440962, 22684406, -30483530, 17199734, -11081552, -18454938, 12527883, --48966384, -38911328, 6571300, 7028714, -14317810, -13986561, 22214644, 10766409, -21254182, 2573759, --5172215, -11928198, 3304441, 5311264, 1352915, 5386963, 6525666, 11698954, -6091874, 1851131, --7276749, -12673375, -7842074, 2368138, 629213, 16232829, 3155727, -4601521, -14018236, 1610613, --5813775, -4922033, -6470368, 4140885, 9692667, 3029026, 8357470, 6801081, 11186779, -5443334, -8424041, 605590, 2159832, -1364189, 341450, -7396471, 7740068, 18891414, 10034654, -2639258, --2581812, 16175921, 13660680, -11278047, 4492536, 8491687, -5342940, 23117662, 5710696, -51896088, -12696997, 7584912, -38488276, 3005403, -6087043, 2328409, 14945949, -1187559, -35544612, -5705864, --10922639, -1306207, 26192322, 31453120, -16901770, -3678103, -14099304, 8301635, -27125940, -52989160, --18685256, -15482283, 3379603, 1631014, 24984362, -35976256, 18045842, -7784628, -3524558, 15848429, -7615514, 26311506, 6344741, 10604811, 27843200, -30455076, 39475044, 31717260, 16631724, 29801168, --10779294, 11804718, -26700202, -4622459, -13206488, 24835648, -20839718, 5939403, -45296336, -55945172, -38339564, -950798, 24892020, -16428787, 16622597, -10450192, 3945464, -5646809, -36751500, -10941429, --24434068, -10984916, 13873281, 55938728, 20082730, -47818556, -10610180, 13696114, -10882373, -6466610, --31753766, -15802258, 25200720, -8477192, 6379637, 5705327, -19667192, 13497472, -2570001, 1804960, --40760852, -11142756, -533650, -17957258, -10324565, 2392297, -27494770, 3737695, 6545530, -21674552, --17402134, -30943628, -23399518, -1366873, -12833899, -5450314, 1080184, -8261907, -8705362, -2889439, --13771276, -5887327, 2061047, 10398116, -12133819, -3579318, -20961588, 8341364, 5435281, 13324062, --8561480, 13824426, -27222040, -769336, 189515, -1071058, 4371203, -3601330, 3073049, -11870216, --13200582, 968515, 5485210, 489089, -10383620, 3747359, 3213173, -32349156, 17044578, 16993574, -30245696, -14798847, 11097659, -17011292, -19687594, 8731669, 40186936, 65001644, -4016331, -4385162, -1415192, -1523103, -28939490, 45441828, 21932250, 24123758, 18740016, -13285944, 15887621, -25774636, --36856724, -6500433, 27763742, 17863842, -13113609, -8672076, -1719598, 22237194, 1068910, 16161425, -16115791, 26341034, 8976482, -16850768, -15687368, 14972793, -17669496, -13486734, 8016557, 28913720, -27017492, -30879742, -23540178, 15600932, 19066434, 57007100, -13082470, -31402116, -32087700, 27143656, --20448340, 25586730, 29451664, 58629524, 125220848, -28218472, -15677168, -47116864, -74298104, -24069534, --37274948, 4002373, 52123188, -7930120, 27749246, 38837780, 25971668, -14803142, -45863808, -75967768, -42547020, -3322694, 48361332, -25037512, -65227132, 22519588, -38500088, -52144124, -26193394, -16866874, -16884590, 15849503, 29901562, -2608656, -13931263, -2707440, -769873, -27220428, -25503516, 12761422, --8725226, 26002806, 24590298, -11999602, 24501178, -19402514, 1036161, 23164906, 3068217, -37358164, -10371272, -19084688, -2671470, -6511171, -4364761, -27721866, -21641266, 3748970, 32841468, 33950644, --31709744, -4433480, 40008156, 37050000, 734976, 7307350, -34916472, -19571092, 6017249, 20143396, --30034706, 7180649, 24789478, 11335492, 9904195, 1985886, 15991237, 22781580, 12150999, -3463891, -4209068, -24753508, 5171141, -22518514, -62959924, 16456704, -26035018, 26817238, 4336307, 15193447, -13346074, -57531088, -40653476, -19862076, -12330851, -12984223, -23265300, -6868727, -38953204, -24584392, -19397146, -25140054, 49272940, -35811976, 4175782, 10588168, -3427921, 4823249, -1664300, 12200391, --10896869, -11669963, -1688459, 9283572, -1116692, 21487722, -19349364, 5008469, 31016106, 10358387, -4999879, 16138876, 2339147, -11904039, -7537131, 25398290, 5970005, -38679400, -17005924, -31272194, --14105209, 42787000, 39747236, -40070436, -4110821, -45635100, -10757819, -3247532, 11041824, 23779086, --37491308, 25869124, -31864900, -4841502, -21471078, 49216032, -9458055, 34901440, 32422172, 71979896, --32508608, 30062624, 5145908, 28601260, 10115185, 21978958, -35405564, -32185948, 48010220, 2987687, --1455457, -33085206, 38821672, -12351789, 20077362, -34843996, 75006232, -39321500, 41868952, -49400176, -20114942, -37055368, 21178484, -34076272, 26107496, -21314312, 15460809, -11572253, 8649527, -18011482, --11293080, -8134668, -2043331, 7382512, 1447404, 6107444, 723165, 6024229, -2551748, -8794482, --14889041, 7664369, 7811472, 2979097, 7173133, -4862977, 2953864, -3676492, 3087008, 26501558, --6230924, -17594870, 2837900, -9599252, -19441170, 7099044, -10524280, 8709657, -8797704, 7395397, --16978006, 7854422, -22016540, 14797236, 32257888, 5945846, -56051472, -24031952, -34308736, 3098282, --7174206, -76059040, -33950104, -19098646, -40024800, -24470040, -76687176, -64516852, -10896332, 29090350, --41765872, -24464670, -5238787, -35352948, -7376070, -1854352, -34250752, -8333847, 8187282, 2809446, --45778984, -25529822, -25697864, -13743358, -15586973, -3696893, -31488552, 28142774, 18603650, 39716636, -57140780, 49953692, 13443785, 52759916, 21669720, 10316511, -21991844, 19209242, 19781546, 16005732, --5021891, -16565689, -7233262, 14075145, 23949812, 119257824, 16995186, 25492778, 18344880, 49469432, -19685982, 43604120, 78221016, -36071284, -74626664, 10613401, 49328236, 87534120, 39274792, -73326904, -11101954, -17354890, 109931832, 81397144, 98470712, 90629712, -76586248, -49923628, 64742872, 77786688, --21246666, -43140264, -52604224, 121950768, 81408424, -3844533, -102709312, 26230976, -2865817, -21717502, -29727080, 9084930, -7928510, -20881594, 738734, 17762910, 45991048, 33282238, -25531970, -9330280, --5955509, -4284230, 26549340, 19869592, 20897164, 1758252, 11818676, 42812772, 29296508, 7332046, -17835388, -9767293, 21947282, 28271622, 36383204, 46302432, 36264020, 28407988, 1777580, -4354023, --7570954, -1293322, -18269180, -9139154, -7845832, -22765474, -30268246, -34422552, -60958472, -33574832, --21412022, -35668092, -67876056, -46369004, -39075076, -45615772, -54954108, -57827976, -18354006, -20566450, --30636002, -15802258, -17985712, -10758356, -16540993, -15659451, -15633681, -11038603, -14913737, -8804146, --11905649, -8205535, -9474161, -4892505, -10787347, -661962, -10654203, -14405320, -19047644, -55984900, -89550072, 72307384, -62753768, 13925358, -1546725, 10008884, -2543158, -6264747, 22971632, -23256174, -22428856, -9247065, -38118, 8860518, 7140920, 7996156, -199179, -13190918, -8543764, 14376866, --11996917, -1560147, 13755707, -7628936, -8087424, -11083163, -20382842, -20350628, 14702747, -7445326, -5375689, -12809203, 2393371, -27133456, -5058398, 7393786, 17279190, -11119670, 3637301, 11929809, -18932216, -4608500, 15640660, -12875775, 50216220, -18745922, 17194364, 2291902, 9654550, -9469329, -13170517, -5383205, 35715336, -5887327, 10922639, -25099788, 32743756, -17348446, -1553168, -4888747, -4581120, -9846213, 19566798, -22836878, 18367428, -20927766, 26931056, -28410672, 34207268, -22895396, --12613782, -14349486, -7482907, 1384590, -22939420, 14784888, -13721347, 12975096, 746787, 17931488, -6430103, 12414603, 21478594, 9452686, -7908646, 5922223, 4978404, -3047816, 3550864, -6754373, -7500087, -3754875, -358093, -6590628, 14937359, -15068356, 1003412, -1265405, 12009802, -2247342, -2114735, -2768643, 4540854, -7035157, 5053566, -5982353, -3716221, 11911018, 10077067, -3005940, --11156714, 7070053, 8821326, 10283225, -9771051, 8068633, -6952479, 6138045, 825707, 2535105, --10517301, 10877005, -4558034, -12102681, 9652402, 10157061, -9035001, -1322313, -2520072, 3102040, --8841727, 11764452, -11287711, 4388920, -12305618, 10839961, -9156870, 9398462, -7572028, 11461120, --12918725, 13728326, -12785044, 7002408, -10838350, 10714870, -12283070, 9883257, -8145406, 12229919, --13602698, 13637058, -12063489, 11424613, -9146670, 10601590, -9862319, 9051644, -7923141, 7361037, --8099235, 7096897, -7517267, 7987029, -8238821, 7865159, -6879464, 6964290, -7106561, 6679211, --6463389, 7480223, -6381785, 7296613, -5342403, 6330245, -5215164, 5325760, -5482526, 6524056, --4828617, 4996121, -3924526, 5651640, -4201015, 4116189, -3739843, 2783139, -2858838, 3567507, --2429878, 3813394, -2928631, 3885335, -2945274, -21910238, -45354856, -49906448, 42559904, 10810970, --13088376, -67655400, -27162984, 37809132, 7754564, 27328876, 30455076, -10899016, -19043884, 975494, -7259032, 5662915, 5093295, -11908871, -8752606, -6583111, 82678, 18394272, 9949829, -820876, -4166655, -5215164, -8819178, -5595806, -4598836, 392990, 5452461, -4105989, 7022809, 7395397, --24838332, -10992969, -10972568, 13338558, 9273908, -781147, -11548093, -15604153, 13670344, 3064459, -9175124, 12779675, -23041426, -15304042, 4233227, 18629420, 9403294, -26199300, -16156593, -21276194, --10155450, 5537824, 4832375, -8736500, 9660455, -3918621, -9192841, 4158065, 8800388, -6527277, -2096481, -217970, -8220568, -716186, -2906619, -18599356, -18821084, -1126355, -20080046, -15022722, -625455, 6118181, -4388383, 22174916, 16340740, 9344238, 683437, -2095407, -9873593, 12294344, -5990943, 7183333, 6892886, -6178848, -2633352, -443992, 3496104, -11581379, -14153528, -1923072, -6191732, 942745, 7841000, 5509906, -7399692, 2448131, 4297115, 3075197, -2406256, 7894687, --9844602, -5825587, 18009334, 10392210, -11149735, -8324184, -5698885, -9886478, 10912438, -350040, -1522566, 5050882, 3205656, -98784, -472446, -7366406, 4648765, 2833068, 6404870, -3626563, --1137093, 4216584, -467078, -4865124, 17603460, -43889732, -119597656, -45456860, 27228482, 57605176, -135826192, 79844512, 21707302, 28443420, -23544474, -43951476, -96218544, -64855080, -49749144, -16258599, -19710678, 52969832, 41136660, 51425256, 49648212, 33692944, -11370389, -39173324, -33960844, -34847216, --28055264, -40397924, 12395812, -25528212, 1855963, 18830210, 34720516, 19644644, 32497334, 42927660, -779537, 12829067, 925565, -629750, -23997592, -3140695, -21357798, -41599980, -65758096, -36571648, --20083268, 5340255, 4970351, 39119100, 54206244, 52197812, 62039192, 9082782, 40701256, 16194711, --3710852, -38144680, -37465536, -50746112, -66733592, -45414448, -51722680, -32668058, 150324, 16078747, -37087580, 60052232, 88310968, 70868032, 64095944, 34803192, -13290776, -13013751, -34743064, -73721504, --56751552, -93176096, -61374008, -27088358, -20738786, 29219736, 55914568, 76793480, 54081156, 41544680, -25140054, 28824062, 25190520, -3951907, -29118804, -27618250, -43774308, -48277044, -38566120, -26242788, --24559160, -23181012, 10590316, 22772990, 40052716, 47722992, 38987564, 34430604, 19511500, 789737, -912681, 4541928, -29020558, -48980880, -20198158, -42761232, -48688288, -1525787, 12060805, 27204860, -27924266, 18027588, 29516088, 17330730, 23592792, -4872104, -601295, -20654498, -12605192, -10909217, --13858786, -15613280, -12814572, 2238215, -5405217, 174483, 14308684, 20166482, 12486544, 11132018, --2901787, -3350075, -312459, -137439, -6236830, -7050726, -1332514, -4100620, -4500589, -2435247, --46171, -4284767, -1619740, 9019968, 3000035, 4254702, 5668820, 4853850, 1740536, 1660005, --1074816, -3818763, -5586142, -4014721, -6545530, -5371394, -1459215, 1023276, 2261300, 4454418, -3533148, 3265249, 4241817, 2949032, -1825898, 780073, 1706713, -1261647, -3488587, -3667365, --2982855, -232465, -1333587, -2130841, -1321776, 1217086, -141197, 1245541, 3205656, 3160022, -2630668, 1465658, 234076, 48855, -992674, -945430, -1580011, -1459215, -1132261, -970126, --1589138, -840203, -823023, -603980, 463320, 1924682, 1089311, 1620276, 1845225, 1533840, -927176, 237297, -589484, -1021665, -1619203, -1198296, -1356136, -1244467, -443455, -28991, --504659, 249108, 1144072, 1394791, 908386, 567473, 618475, 690953, -158377, -599685, --666794, -564251, -517544, -256087, -206158, -27380, 44560, 108985, 33823, 61740, -52076, 56371, 16106, 21475, }, +806917, -2076080, -2172180, 1324997, -3704409, -62277, -7210177, 5160403, 6544994, 4571456, +6441377, -7742216, 619549, 1764695, -2765422, -2129230, -1893007, -9066676, -1531156, 5382668, +-9283572, -7543573, 4381404, 3972308, -5967320, -2084133, 3939559, 501437, 4790499, 2051384, +4990215, -3142306, 949188, 688805, -1334661, 2323041, 1822140, 3388192, 1416802, -1501628, +318364, 3786014, -1031866, -1727114, -649077, -4586488, -10122701, 6010807, 2911451, -3168075, +4429722, -1780264, 483184, -158377, 2053531, -2672544, -702227, 5973763, -5637145, -2259690, +1946157, 972810, -879931, -280247, 2610803, 296890, 2310156, -4014721, 4072703, 2097555, +-5239323, 4163434, 359704, 1506460, -634581, -1557463, -6114423, -1891396, -467615, 3134789, +-816581, 2563022, -1545115, 302258, 753767, 304406, 1809255, -327491, 114354, -224949, +-1248225, -566399, 231391, -666257, 75162, -33286, -293668, 1666447, 1666447, 871342, +687732, 606127, 204011, 3758, 211527, 89121, -267362, -747324, -851477, -191663, +-88584, 11988327, -6839199, 2134062, -7562901, 949725, 1812476, -7624641, -9651328, 2455111, +-10474351, 2351495, -2705830, -689879, -6410776, -898722, -7203197, -3685082, 63888, -7622493, +8172786, 2901251, -12666395, 1242319, -665183, -2264522, -5403069, 2767570, 6623377, 166967, +-452045, 6221260, -3600793, 114354, -2280628, 4134443, -4769025, 1443646, 5814312, -4997732, +5088463, 1813013, 5500780, -434865, 1271847, -793495, -2279017, 7199439, -8863739, 2085744, +-3907347, -1676111, -1131724, -3204583, -2366527, -7056095, -4428648, -1074816, 4642860, -360777, +1759326, 6492380, -126165, -5569499, -696322, 234613, 1776506, -2703145, 31139, -5478231, +138513, -2212445, 1842541, 2894271, 4233764, 1531693, -2357937, -3064996, 4154844, -1354525, +-1874753, 801548, 2318746, 4793184, 598611, 1395864, -293132, 2821794, -525597, -2184528, +-1115081, -1067299, -83752, 1921998, 386010, -97711, -991064, 1862942, 10737, -660351, +-498753, -442919, -520228, 899259, -353261, -64961, -1046898, -2835215, -9854266, -76236, +-5921686, -1842004, -928787, -6916508, -909459, -1581622, 3495567, 8149701, 8203388, 1007170, +-3442416, 3298535, -7857643, -1094680, -2978560, 2790118, -11731166, 4192425, 2041720, -396748, +-3341485, -5044439, -2273112, -4156455, -3554622, 2234457, -739271, -4484483, -1267015, 943819, +7740068, -268435, -7718593, 636192, 3396782, -69793, -2393371, 671089, 2978560, -8417062, +-603443, -3646427, 5985574, 3635690, 1060857, -7781944, 938450, 3028489, 4842576, 4499515, +-5072893, -2391760, 290984, -1583769, -1549410, 4190814, -2528662, 2571612, 760746, -3263102, +-678605, -4490389, 5491116, 2054068, -5300527, -3685082, 970126, 2859375, -4190278, -5354751, +-847719, 278099, -3502546, 778463, -1397475, 1820529, -3333432, 5066988, 2779381, 3820910, +1160715, 509491, 3502546, 4647155, 614180, 1323387, -369904, 663572, 153545, -191126, +593779, 391916, 614717, -733366, 104153, 355409, -180926, 79457, 1626182, -903554, +433255, -1082869, -782758, -729071, 241592, 578747, 478352, 44560, -918586, -674847, +1672353, -16796006, 5485210, 4909685, 8195335, -2076080, 5162014, -14483167, -3929895, 4588099, +580357, -7146289, -1830730, -2354716, -12679817, -5120675, 1330903, -549756, -9028558, 5698885, +8092256, -8235063, 6316823, -10795400, -3642132, -940061, 3768297, -27917, -4349728, 3000572, +1522029, -694174, 4879083, -2313377, -3076270, -945430, -1738388, -3177202, 4800700, -3630858, +1389422, 3589519, -683974, -2807298, -5275831, -621697, -3752191, -1135482, -4372277, -1171989, +9862319, 222265, 6013491, -5459977, 5053029, -1546188, -7981123, -4714801, 4486094, -2898566, +-4037269, 2947958, -4754529, 4012573, 1118839, -1459752, 5268851, 4733054, 2126546, -5167383, +-5821828, -391379, 7856569, 1567126, 1230508, -4414690, 1200443, 2819646, -5912023, -2168422, +1984812, 4173098, 2112050, 3534221, -150861, 45097, 1345935, 177167, -621160, 223338, +-460098, -742493, -2586644, -2098092, 692027, -1258962, -704912, 897111, 450972, 658741, +-114354, 1087701, -647466, 60666, -876173, 18254, -1073742, 571231, 245887, 779537, +-1415729, -8842801, -8396661, -5494874, 1229434, -1279900, 3675955, -2939905, 173946, 784368, +-2387465, -807991, 2327872, -2371896, 10190347, -6412386, 4810364, -1564979, -515933, -4507032, +-1113470, -488016, 7477001, -4834523, 824634, 1570884, -6996502, -4228396, -4725001, -4008815, +-8137353, -2711198, 3160022, 5785321, 3741990, -6483790, -9184788, -1906429, 459562, -4616553, +1046898, -3089692, -4707821, -11436424, -5648419, -7973070, 4853313, -1955284, 3977140, -4519380, +-11117523, -5844914, 734976, -2157684, -3528853, -1543504, -4269735, 6173479, 718870, 3652870, +4877472, 1330366, -15569, -3776887, 353261, 5245229, -701690, -3642669, -5060545, 8542690, +-6811282, -9626095, -6714108, -3834869, -5240934, 6249715, 9940165, -7641284, -5180268, 1333587, +4918275, 7408282, 5938866, 4625143, 4617090, -1436130, -1749125, -2080375, -2103997, 1933272, +-1215476, 621697, -1523640, -2627983, -933619, -1855963, 1650878, -1110249, -2266132, -1305670, +-1226213, -2341294, -2537252, -1580011, -493384, 676994, 690953, 1416266, 363998, -4115653, +704912, -523986, -1505386, 628676, -539018, -1153736, -2578591, -2165201, 283468, 135828, +-728534, -945967, 209380, -1174674, 935229, -1007170, -470299, -374736, -1768990, 2319819, +-18468360, 5707475, -1298691, 3273302, 10144176, 3978750, -2495376, 3428458, -7611219, 4712116, +5548561, -10071161, -2132988, -5104569, 5697274, 4930086, 7726110, 8924942, -11587822, -5995775, +1940252, 9959492, -3757023, 4619774, -11071352, -3374234, -3861176, -2377801, -6686727, 1641214, +-10954314, 7589744, -2119030, -1978906, 5606543, -362388, 1314797, 5881958, 207232, 4807142, +3292093, -1406065, -1856500, -691490, -7663833, -5697274, -6995428, -486942, 14720464, 3361886, +2896956, -389768, -1984275, -170188, 8827768, -1923609, 2810519, -16957068, 15627239, -3823595, +-2704756, 837519, 9603547, 3409130, -1516124, -5857799, 16749299, -3277060, -119185, 5274757, +-4136591, -94489, 2478733, -3825205, 3383897, 3196530, 13859859, -6925635, -8525510, -1662152, +4219806, -5260261, 1257352, 3477850, 1243930, -3111704, 1472100, 3563212, -2191507, 237834, +-3824669, -1328756, -1040993, -3310346, 4345970, -3155727, -2471217, 1831804, 4832, -3729105, +-197569, 773631, 1693828, 72478, 1973001, -1423782, -983548, -1182727, 1377611, -1454920, +2340220, 124017, -774168, 885300, 2443837, -4173098, -163746, -1162862, 7885560, 4374424, +8788040, -3671123, -2227478, 5017596, -8319889, 7280507, 8323647, -4335233, -820339, -13362180, +519154, 4453881, 3582540, -2914672, -9126806, -18401250, 185220, -3216931, -8791798, 1918240, +5727339, -8049843, -3494493, -8769786, 4273493, 390842, -1399623, -2986613, -3866008, 9233643, +10788421, 4132296, 5083094, -2534031, -5581847, 15090904, 3669513, -2697240, -9035001, 6472516, +164283, 8633421, -881005, 10693395, 5293011, 7451769, 6283001, 3153043, 8298414, 10387378, +-410169, 1835025, -3460133, -213138, 5617281, 2292439, 3004867, -9382893, -3515968, -2061047, +-8188892, -7829189, -5198521, 4225174, 8810052, 11558294, 15149423, 3295314, 1225676, 12193412, +-5009006, -9367324, -3336116, -4792110, 7849590, 6404870, 2384244, -8875013, -2499134, 1470489, +1166621, -1802276, -4153234, 1145683, 925565, 4985920, -1324997, -2899103, 481573, 897648, +1138166, 7516, -32749, 921271, 2221035, -1729261, -1706713, 69793, -305480, -2390686, +-634581, -3025805, 3113851, 955093, -2317135, -173409, 2078764, -1222455, -297427, -1828046, +863288, 1071058, -875100, 2712272, 2017024, -384936, 14025753, -13481365, -6387153, -1893544, +5318244, -12620761, 7829726, -12436615, 5983963, -136365, 6356015, 10102837, -4262755, 9217537, +10106058, 9586904, -5700496, 8070244, -8883066, -7121056, -1171989, -5528160, -166430, -4769561, +7927973, -6034429, 1683627, -5959804, -10350871, -4897874, -2239826, 12306692, -10486163, 9669582, +4231617, -14532559, 16467978, 3962644, 1773822, 11504070, 1992865, 409096, -6648610, -147103, +-3741990, 13130789, 5527623, 9168681, -3681861, -2307471, 6328635, 10915123, -11595338, 11314554, +2027761, -1977296, -2209761, -10983842, 5179194, -5247913, 2155537, 361314, -9903121, 3203509, +8285529, -7698192, 5237713, 3339874, 11621645, 1115618, -836982, 6957847, 10160282, 702764, +-5902359, 6725382, -7947300, -4246649, 2064806, -3331284, 2092186, -2697776, 975494, 4279935, +3186866, -3359738, 2781528, -1795833, 2237141, -2401424, 7074885, 578747, 6755447, -954020, +1671279, -1574642, -616328, -2308008, 4275640, 1664300, -3569118, 3563212, 4288525, -622233, +-613107, 2485712, -205622, -370441, 3572876, -258235, 867047, 2167885, 1503775, -707596, +2731062, -2419677, -425202, 376347, 736587, 456877, -157840, -478352, -2730526, 1142998, +4062502, 1005022, -11422466, -8178155, 12395276, -15913928, 3994857, -8480413, 9436580, -10118943, +15422691, 5330592, 1486596, -13409425, 6818798, 11314554, 2991445, -6904697, -4478041, -3962644, +10521596, 5701032, -14687178, 2054068, -10389526, -597537, 1191317, -8905615, 11645804, 11659762, +-5301064, 2535105, 7933879, -9709847, -1466195, -3010235, -8009041, 17019344, -6187438, -3845070, +-8575976, -14374719, -2263448, 231928, -4942434, 2096481, -11855183, 1010928, 854699, -2415919, +9400610, -1993402, -7279433, 3761318, 15032, -5502390, 4708358, 20171850, -4019553, 4770635, +1127966, -13771276, -2204929, 12206834, 5552319, 12117176, -1214402, 6986301, -9654013, 4303557, +4318053, 1385664, -8196408, 7567196, 2732136, -21410412, 1708860, -3907347, 14332843, -5534602, +11141682, 10225243, 8309688, -1073742, 3221762, 433792, 886911, -1444183, -2297271, 5528697, +2312303, -129923, -3641596, -5230197, -1141388, 2162516, 3692061, 2541547, 4720706, 106837, +-1186485, -1976759, -1423782, 1624571, 2859375, -315143, 2275259, 1380295, 489089, 1953136, +-300111, 2043868, -3402151, -4381404, -5594195, -331786, 2683281, 1112933, -2572149, -1033477, +-1768453, -2133525, 3581466, 997506, 1657321, 1402307, -25104620, 28077812, 3183645, 10995116, +-20620674, 11034308, 14405320, -16913044, 6245956, 8156680, 6280853, -10980621, 1279900, 1766305, +-3798899, 6179921, 12890271, -10608569, -8846559, -3331284, 10906533, 9407052, 13370233, -798864, +5566815, -10215043, -2776696, -2763275, 2070174, 6203007, 17130478, 10134512, 6140193, 3135326, +-710817, 8100845, -3191161, -14967961, -3014530, 4207458, 4596689, -8822400, -6703907, -10890426, +1939178, -1003412, 3636764, -7191923, 12474196, 12175159, -10806675, 25227564, 1031329, -2483565, +-276489, -5435281, -1273458, -1777043, -10392747, 18254, -98247, 6584722, -21485038, 5079336, +-7697655, 15360414, 18607946, 7956427, 7657927, 3346853, 1125281, 16760036, -3296924, -12661564, +10580115, -5787469, 2747169, 8201240, 15117211, 1986959, 1382443, -12354473, -650688, 3413962, +9554155, -4358855, 5136781, 2378338, -3819300, 9667971, 1542430, 4248260, -2976412, -1061931, +-2949569, 323733, 1018444, -1653562, -195958, 2803003, -1743220, 2842732, 1911797, -2248416, +-329102, 1237488, -989990, 83215, -2116345, -6781754, -2006287, -1163936, 6827388, 8420283, +743566, 1107565, -2560338, -3022583, 627602, 782221, -3678640, -2937758, -1954210, -1775969, +2214593, -4123169, -278099, -3069828, 10419054, 2117956, -6991133, 6806450, 10147397, 8825084, +5636071, 10497437, -12432857, -7890929, 1562294, -11251741, -2681133, -1803886, 2669322, -2821794, +-7232725, -9165460, -5426155, 4669167, 7965017, -13595719, 3043521, -1344325, -221728, -16405701, +-14670535, -2497524, -11345693, 5506148, -12957379, 923418, 7159174, 10162966, -8786966, 12059731, +3207267, -1111323, -2493229, 17844516, -4801774, -810675, -14127758, -7955890, 11794517, -815507, +4561792, -13673028, -14890652, -4045859, -8333847, -1413044, 815507, -5486821, -6957847, 4297652, +-6446209, 644782, -9574556, -5202279, -85362, -15986405, 1642288, 10622528, 2179696, 5607617, +11669963, 19772956, -18854370, 3525095, -11567958, -11355894, -6211060, -8616778, -5397700, -5063767, +19466402, 10669236, 10856067, 2271501, 3316789, -13894756, 863825, -4860829, 2415919, -6005975, +8723615, 11319386, 1291175, -5055714, -3274913, -9577240, 1066763, 5964099, 3472481, -2284386, +6301254, 2986613, 6660958, -1345935, -986232, 1101122, 4406637, -2642479, 1998770, -3906810, +-5275294, 3998615, 1633698, 851477, 1091459, -7435126, -4231617, -6442, 5953899, -4804995, +3088618, -6451041, -1950989, -1009317, 2513630, 1582159, -1710471, -1557999, -8391829, 3684008, +20176146, 21372832, 23446226, -16902306, 1559610, 12788802, 10126996, -9744744, -18935974, -1930588, +-2570001, -14818711, -8452496, 29025388, 2554432, 2275796, 11039140, -929324, 4887136, -3642132, +-11099269, 7822209, 6563784, -15098958, -21626770, -16660178, -13208635, -12530567, 1522029, 4065187, +6805913, -8221105, 8661338, 2338610, -3912715, -8716099, -23085, 838592, -13688061, -10598906, +1881733, -2185602, 2182917, -8123394, 7116761, 2472291, -7696045, -16747688, -6487011, -5423470, +-22464290, -6817724, 2390149, 11585674, -826244, 13656922, -2090039, -765041, -19113678, -3760781, +7868380, 3992172, -32160178, 9652939, 3059091, -8672613, -5247913, -9059697, -10394358, -54761, +735513, -9907416, -3070902, 6938520, 9693204, 15266461, -11142756, 927713, 8639864, 8053, +-24551644, -19368156, 4295, -4835597, 6437082, 214748, -5868536, -8473970, 4322348, -2151242, +3945464, 10541460, -52076, -4597763, -8224326, -15075335, -5068599, 1367410, -2348810, -2186138, +1230508, 1446867, 7100655, -3093987, 931471, 3031173, 1574642, -5151814, 853088, -969589, +-13276818, 1835562, -4786204, -5622649, 2388539, 2128693, -3886409, -805843, 5053029, 1897302, +1484985, -4490389, -5454609, -1486596, -237297, 801548, 3643743, -5913633, -520228, -3706557, +-2312840, -4874788, 8249559, -6431714, 22857280, -18993420, -11588896, -3609383, -36208720, -18747532, +188442, -22945326, 18351858, -7857106, -7260642, 2397666, 41649372, 20299090, 1551557, 8831527, +-1655710, -10764799, -841814, -16837346, -12174622, 6260989, 6259915, 7773354, -11688753, 15649787, +9608379, 17663054, -17343078, 3187403, 25884694, 2762201, 1285806, 5429376, -24363738, 6649683, +-5989869, 4420595, -9681393, -22840636, -1205275, 9766219, 11649025, 3347390, -3419331, 2076080, +-861141, 8087961, -17336636, -25121264, 4758824, -8913668, 15422154, -5691369, -6157910, 20306606, +4658429, 8970039, 1763621, -16405164, -6729677, -1591285, 9244380, 26671746, 20360830, -5598490, +-23046794, -46171, -2518462, 9031242, -14159433, -17484274, -10037875, 8935679, -18030272, -2386391, +-15111306, 550830, 12410308, 84826, -22724136, -4559108, 3149285, 6481106, 2961917, -13768055, +-9493488, -14762876, 2467996, -2712272, -6524056, -4595078, -6524592, 1789928, -2669859, -5822365, +-1707250, 4977867, 58519, 310848, -7673496, 337155, -653909, -4406100, 477278, 10063645, +3249680, 2275259, -9753871, 4362076, -1032403, -578210, 1583769, 327491, -155156, -1450088, +-5807333, -5937256, -5319317, 7193534, 5791764, -2094870, -14555644, -4799089, -5400922, -589484, +-7751342, -41739028, 15823196, 12939663, -6300717, -27665494, -6257768, -10795937, -11325829, 11880953, +14763950, -1759326, 3899830, -31416612, 10800769, -39266200, -10057203, -3621731, 7599945, 19407346, +31022548, 12710956, -18225694, 3959960, 21629992, 2659122, 6469295, 11582453, -18512920, -7329899, +-3052111, 5319317, -13083544, -7208029, -4070555, -9969156, -7556458, 12991739, 12860743, 3078418, +941672, 22165790, -4357781, 10207527, -25495462, 16546898, 4678830, -23267448, 2221035, 7090991, +-21740050, -3070365, -21262236, 6788196, 8785356, 9209484, -14349486, -1513439, 14096620, -12137578, +56371, -2207613, 23347980, -14188961, 17176112, 8449274, -21955336, 18877456, -16189879, 12032888, +16175384, -16755204, 9181029, -14347875, -17535278, -26627186, -22025666, -24383066, -5827197, 3948686, +-7320772, 20680268, 21757768, -9585830, 19168440, -3310883, -4130148, 24109798, -5516349, -16771847, +11344082, -2838974, -12874701, -10239202, 9613211, 1328756, 4955856, 7263864, 1298154, 5899138, +9680319, -3008088, 10863583, 7089918, 5396090, 5783174, 866510, 3382287, 9233106, 7036767, +9364102, 964757, 7771744, -1906966, 508954, 6354404, -3403762, -12702366, 5766531, 1484448, +-9664, -224412, 5510980, -11323681, 5546414, 7129646, 6176700, -7689065, 6323803, -33299956, +-15965467, -16601659, 28340342, 443992, 10331544, -5106716, 40367324, 6009196, -27659052, 1563905, +29551522, -11533061, 6261526, -5384279, 2185602, -17951890, -24041080, 37048924, 26269630, -10706280, +20068772, 7607998, 26230440, 29845728, -9261560, -7597261, 26526254, 19296752, 1782411, -8966818, +-13793824, -14499810, 12063489, 23298050, 10759967, -4793721, 15560130, -8860518, 14748381, -7243999, +21692270, 38679940, 29402272, -32351304, 14162655, -5906117, -13396540, -897648, 10698227, 10253698, +71093520, -7701950, -1160178, -12123619, -13106093, 13443248, 25419228, -6813966, 19223736, 16281147, +-2665564, 106300, -14333380, 13686450, 11499238, 37549288, 38270308, 46488728, 19100794, -12494060, +-10143102, -22093312, 20662550, -32440962, 22684406, -30483530, 17199734, -11081552, -18454938, 12527883, +-48966384, -38911328, 6571300, 7028714, -14317810, -13986561, 22214644, 10766409, -21254182, 2573759, +-5172215, -11928198, 3304441, 5311264, 1352915, 5386963, 6525666, 11698954, -6091874, 1851131, +-7276749, -12673375, -7842074, 2368138, 629213, 16232829, 3155727, -4601521, -14018236, 1610613, +-5813775, -4922033, -6470368, 4140885, 9692667, 3029026, 8357470, 6801081, 11186779, -5443334, +8424041, 605590, 2159832, -1364189, 341450, -7396471, 7740068, 18891414, 10034654, -2639258, +-2581812, 16175921, 13660680, -11278047, 4492536, 8491687, -5342940, 23117662, 5710696, -51896088, +12696997, 7584912, -38488276, 3005403, -6087043, 2328409, 14945949, -1187559, -35544612, -5705864, +-10922639, -1306207, 26192322, 31453120, -16901770, -3678103, -14099304, 8301635, -27125940, -52989160, +-18685256, -15482283, 3379603, 1631014, 24984362, -35976256, 18045842, -7784628, -3524558, 15848429, +7615514, 26311506, 6344741, 10604811, 27843200, -30455076, 39475044, 31717260, 16631724, 29801168, +-10779294, 11804718, -26700202, -4622459, -13206488, 24835648, -20839718, 5939403, -45296336, -55945172, +38339564, -950798, 24892020, -16428787, 16622597, -10450192, 3945464, -5646809, -36751500, -10941429, +-24434068, -10984916, 13873281, 55938728, 20082730, -47818556, -10610180, 13696114, -10882373, -6466610, +-31753766, -15802258, 25200720, -8477192, 6379637, 5705327, -19667192, 13497472, -2570001, 1804960, +-40760852, -11142756, -533650, -17957258, -10324565, 2392297, -27494770, 3737695, 6545530, -21674552, +-17402134, -30943628, -23399518, -1366873, -12833899, -5450314, 1080184, -8261907, -8705362, -2889439, +-13771276, -5887327, 2061047, 10398116, -12133819, -3579318, -20961588, 8341364, 5435281, 13324062, +-8561480, 13824426, -27222040, -769336, 189515, -1071058, 4371203, -3601330, 3073049, -11870216, +-13200582, 968515, 5485210, 489089, -10383620, 3747359, 3213173, -32349156, 17044578, 16993574, +30245696, -14798847, 11097659, -17011292, -19687594, 8731669, 40186936, 65001644, -4016331, -4385162, +1415192, -1523103, -28939490, 45441828, 21932250, 24123758, 18740016, -13285944, 15887621, -25774636, +-36856724, -6500433, 27763742, 17863842, -13113609, -8672076, -1719598, 22237194, 1068910, 16161425, +16115791, 26341034, 8976482, -16850768, -15687368, 14972793, -17669496, -13486734, 8016557, 28913720, +27017492, -30879742, -23540178, 15600932, 19066434, 57007100, -13082470, -31402116, -32087700, 27143656, +-20448340, 25586730, 29451664, 58629524, 125220848, -28218472, -15677168, -47116864, -74298104, -24069534, +-37274948, 4002373, 52123188, -7930120, 27749246, 38837780, 25971668, -14803142, -45863808, -75967768, +42547020, -3322694, 48361332, -25037512, -65227132, 22519588, -38500088, -52144124, -26193394, -16866874, +16884590, 15849503, 29901562, -2608656, -13931263, -2707440, -769873, -27220428, -25503516, 12761422, +-8725226, 26002806, 24590298, -11999602, 24501178, -19402514, 1036161, 23164906, 3068217, -37358164, +10371272, -19084688, -2671470, -6511171, -4364761, -27721866, -21641266, 3748970, 32841468, 33950644, +-31709744, -4433480, 40008156, 37050000, 734976, 7307350, -34916472, -19571092, 6017249, 20143396, +-30034706, 7180649, 24789478, 11335492, 9904195, 1985886, 15991237, 22781580, 12150999, -3463891, +4209068, -24753508, 5171141, -22518514, -62959924, 16456704, -26035018, 26817238, 4336307, 15193447, +13346074, -57531088, -40653476, -19862076, -12330851, -12984223, -23265300, -6868727, -38953204, -24584392, +19397146, -25140054, 49272940, -35811976, 4175782, 10588168, -3427921, 4823249, -1664300, 12200391, +-10896869, -11669963, -1688459, 9283572, -1116692, 21487722, -19349364, 5008469, 31016106, 10358387, +4999879, 16138876, 2339147, -11904039, -7537131, 25398290, 5970005, -38679400, -17005924, -31272194, +-14105209, 42787000, 39747236, -40070436, -4110821, -45635100, -10757819, -3247532, 11041824, 23779086, +-37491308, 25869124, -31864900, -4841502, -21471078, 49216032, -9458055, 34901440, 32422172, 71979896, +-32508608, 30062624, 5145908, 28601260, 10115185, 21978958, -35405564, -32185948, 48010220, 2987687, +-1455457, -33085206, 38821672, -12351789, 20077362, -34843996, 75006232, -39321500, 41868952, -49400176, +20114942, -37055368, 21178484, -34076272, 26107496, -21314312, 15460809, -11572253, 8649527, -18011482, +-11293080, -8134668, -2043331, 7382512, 1447404, 6107444, 723165, 6024229, -2551748, -8794482, +-14889041, 7664369, 7811472, 2979097, 7173133, -4862977, 2953864, -3676492, 3087008, 26501558, +-6230924, -17594870, 2837900, -9599252, -19441170, 7099044, -10524280, 8709657, -8797704, 7395397, +-16978006, 7854422, -22016540, 14797236, 32257888, 5945846, -56051472, -24031952, -34308736, 3098282, +-7174206, -76059040, -33950104, -19098646, -40024800, -24470040, -76687176, -64516852, -10896332, 29090350, +-41765872, -24464670, -5238787, -35352948, -7376070, -1854352, -34250752, -8333847, 8187282, 2809446, +-45778984, -25529822, -25697864, -13743358, -15586973, -3696893, -31488552, 28142774, 18603650, 39716636, +57140780, 49953692, 13443785, 52759916, 21669720, 10316511, -21991844, 19209242, 19781546, 16005732, +-5021891, -16565689, -7233262, 14075145, 23949812, 119257824, 16995186, 25492778, 18344880, 49469432, +19685982, 43604120, 78221016, -36071284, -74626664, 10613401, 49328236, 87534120, 39274792, -73326904, +11101954, -17354890, 109931832, 81397144, 98470712, 90629712, -76586248, -49923628, 64742872, 77786688, +-21246666, -43140264, -52604224, 121950768, 81408424, -3844533, -102709312, 26230976, -2865817, -21717502, +29727080, 9084930, -7928510, -20881594, 738734, 17762910, 45991048, 33282238, -25531970, -9330280, +-5955509, -4284230, 26549340, 19869592, 20897164, 1758252, 11818676, 42812772, 29296508, 7332046, +17835388, -9767293, 21947282, 28271622, 36383204, 46302432, 36264020, 28407988, 1777580, -4354023, +-7570954, -1293322, -18269180, -9139154, -7845832, -22765474, -30268246, -34422552, -60958472, -33574832, +-21412022, -35668092, -67876056, -46369004, -39075076, -45615772, -54954108, -57827976, -18354006, -20566450, +-30636002, -15802258, -17985712, -10758356, -16540993, -15659451, -15633681, -11038603, -14913737, -8804146, +-11905649, -8205535, -9474161, -4892505, -10787347, -661962, -10654203, -14405320, -19047644, -55984900, +89550072, 72307384, -62753768, 13925358, -1546725, 10008884, -2543158, -6264747, 22971632, -23256174, +22428856, -9247065, -38118, 8860518, 7140920, 7996156, -199179, -13190918, -8543764, 14376866, +-11996917, -1560147, 13755707, -7628936, -8087424, -11083163, -20382842, -20350628, 14702747, -7445326, +5375689, -12809203, 2393371, -27133456, -5058398, 7393786, 17279190, -11119670, 3637301, 11929809, +18932216, -4608500, 15640660, -12875775, 50216220, -18745922, 17194364, 2291902, 9654550, -9469329, +13170517, -5383205, 35715336, -5887327, 10922639, -25099788, 32743756, -17348446, -1553168, -4888747, +4581120, -9846213, 19566798, -22836878, 18367428, -20927766, 26931056, -28410672, 34207268, -22895396, +-12613782, -14349486, -7482907, 1384590, -22939420, 14784888, -13721347, 12975096, 746787, 17931488, +6430103, 12414603, 21478594, 9452686, -7908646, 5922223, 4978404, -3047816, 3550864, -6754373, +7500087, -3754875, -358093, -6590628, 14937359, -15068356, 1003412, -1265405, 12009802, -2247342, +2114735, -2768643, 4540854, -7035157, 5053566, -5982353, -3716221, 11911018, 10077067, -3005940, +-11156714, 7070053, 8821326, 10283225, -9771051, 8068633, -6952479, 6138045, 825707, 2535105, +-10517301, 10877005, -4558034, -12102681, 9652402, 10157061, -9035001, -1322313, -2520072, 3102040, +-8841727, 11764452, -11287711, 4388920, -12305618, 10839961, -9156870, 9398462, -7572028, 11461120, +-12918725, 13728326, -12785044, 7002408, -10838350, 10714870, -12283070, 9883257, -8145406, 12229919, +-13602698, 13637058, -12063489, 11424613, -9146670, 10601590, -9862319, 9051644, -7923141, 7361037, +-8099235, 7096897, -7517267, 7987029, -8238821, 7865159, -6879464, 6964290, -7106561, 6679211, +-6463389, 7480223, -6381785, 7296613, -5342403, 6330245, -5215164, 5325760, -5482526, 6524056, +-4828617, 4996121, -3924526, 5651640, -4201015, 4116189, -3739843, 2783139, -2858838, 3567507, +-2429878, 3813394, -2928631, 3885335, -2945274, -21910238, -45354856, -49906448, 42559904, 10810970, +-13088376, -67655400, -27162984, 37809132, 7754564, 27328876, 30455076, -10899016, -19043884, 975494, +7259032, 5662915, 5093295, -11908871, -8752606, -6583111, 82678, 18394272, 9949829, -820876, +4166655, -5215164, -8819178, -5595806, -4598836, 392990, 5452461, -4105989, 7022809, 7395397, +-24838332, -10992969, -10972568, 13338558, 9273908, -781147, -11548093, -15604153, 13670344, 3064459, +9175124, 12779675, -23041426, -15304042, 4233227, 18629420, 9403294, -26199300, -16156593, -21276194, +-10155450, 5537824, 4832375, -8736500, 9660455, -3918621, -9192841, 4158065, 8800388, -6527277, +2096481, -217970, -8220568, -716186, -2906619, -18599356, -18821084, -1126355, -20080046, -15022722, +625455, 6118181, -4388383, 22174916, 16340740, 9344238, 683437, -2095407, -9873593, 12294344, +5990943, 7183333, 6892886, -6178848, -2633352, -443992, 3496104, -11581379, -14153528, -1923072, +6191732, 942745, 7841000, 5509906, -7399692, 2448131, 4297115, 3075197, -2406256, 7894687, +-9844602, -5825587, 18009334, 10392210, -11149735, -8324184, -5698885, -9886478, 10912438, -350040, +1522566, 5050882, 3205656, -98784, -472446, -7366406, 4648765, 2833068, 6404870, -3626563, +-1137093, 4216584, -467078, -4865124, 17603460, -43889732, -119597656, -45456860, 27228482, 57605176, +135826192, 79844512, 21707302, 28443420, -23544474, -43951476, -96218544, -64855080, -49749144, -16258599, +19710678, 52969832, 41136660, 51425256, 49648212, 33692944, -11370389, -39173324, -33960844, -34847216, +-28055264, -40397924, 12395812, -25528212, 1855963, 18830210, 34720516, 19644644, 32497334, 42927660, +779537, 12829067, 925565, -629750, -23997592, -3140695, -21357798, -41599980, -65758096, -36571648, +-20083268, 5340255, 4970351, 39119100, 54206244, 52197812, 62039192, 9082782, 40701256, 16194711, +-3710852, -38144680, -37465536, -50746112, -66733592, -45414448, -51722680, -32668058, 150324, 16078747, +37087580, 60052232, 88310968, 70868032, 64095944, 34803192, -13290776, -13013751, -34743064, -73721504, +-56751552, -93176096, -61374008, -27088358, -20738786, 29219736, 55914568, 76793480, 54081156, 41544680, +25140054, 28824062, 25190520, -3951907, -29118804, -27618250, -43774308, -48277044, -38566120, -26242788, +-24559160, -23181012, 10590316, 22772990, 40052716, 47722992, 38987564, 34430604, 19511500, 789737, +912681, 4541928, -29020558, -48980880, -20198158, -42761232, -48688288, -1525787, 12060805, 27204860, +27924266, 18027588, 29516088, 17330730, 23592792, -4872104, -601295, -20654498, -12605192, -10909217, +-13858786, -15613280, -12814572, 2238215, -5405217, 174483, 14308684, 20166482, 12486544, 11132018, +-2901787, -3350075, -312459, -137439, -6236830, -7050726, -1332514, -4100620, -4500589, -2435247, +-46171, -4284767, -1619740, 9019968, 3000035, 4254702, 5668820, 4853850, 1740536, 1660005, +-1074816, -3818763, -5586142, -4014721, -6545530, -5371394, -1459215, 1023276, 2261300, 4454418, +3533148, 3265249, 4241817, 2949032, -1825898, 780073, 1706713, -1261647, -3488587, -3667365, +-2982855, -232465, -1333587, -2130841, -1321776, 1217086, -141197, 1245541, 3205656, 3160022, +2630668, 1465658, 234076, 48855, -992674, -945430, -1580011, -1459215, -1132261, -970126, +-1589138, -840203, -823023, -603980, 463320, 1924682, 1089311, 1620276, 1845225, 1533840, +927176, 237297, -589484, -1021665, -1619203, -1198296, -1356136, -1244467, -443455, -28991, +-504659, 249108, 1144072, 1394791, 908386, 567473, 618475, 690953, -158377, -599685, +-666794, -564251, -517544, -256087, -206158, -27380, 44560, 108985, 33823, 61740, +52076, 56371, 16106, 21475, }, { 8093329, -5188321, 158377, 290984, 6376416, 1604707, -3152506, 2183991, 4246649, -2122251, -3498788, --12596602, 684510, -4220342, 8437463, -4155918, 4235375, 3432216, -430034, 2780455, 4671314, -1301375, 1097901, -2270964, -2764348, -2117419, -3485903, 3074660, 1821066, -1617055, 2748779, --1864553, -2786897, -3300682, -1604707, -2600066, 228707, 76773, -486942, 5808944, -3336653, -4758824, -1703491, -1164473, 3172907, -1926830, 993211, -1926293, 3477850, -987843, -9861782, -2971581, 346819, 1249299, 4962835, 2603287, 359167, -1086090, -3260954, 8484171, -4465156, -3324305, 1719598, -3452617, 3555696, 1623498, -4126927, 3314104, -4256850, 285078, -440234, -3766150, 613107, 3935264, -1501091, -8671539, -1864553, -2060511, -4140349, -3666292, -3674345, -3051038, 1324461, 1097364, 1826972, 1868311, 363462, 909459, -1021129, 654983, -753767, --300648, -2127620, 17180, -707059, 1657857, -157840, -463856, -325881, 217970, -1103270, -425739, -479426, 645319, -352724, 159451, -1271847, -108448, -1589138, -926639, -907312, -1342177, 15291157, -7649337, 782221, -528818, -517544, 3424163, -2832531, -11099269, -10234370, -4713190, -3285650, -1014149, 2525441, 490700, 2491618, 2786360, -4913443, 2541010, 1733019, --3505767, 3942780, 5973226, -4023311, -1376000, 225486, -6606734, -3027415, 577673, 7722888, --1339493, -517544, -6583648, 3767223, -79994, -5911486, -2576444, 1946157, -970126, 1050656, --5129265, -204548, 257161, -2139431, 5301064, 1279363, 1121523, 5119601, -630286, 6673843, --2361158, -8679055, 3381750, 3277060, -3115462, -1406065, -1144609, 979789, 293132, 2308008, --2060511, 1497870, -4779225, -297427, 2987687, -4570382, -618475, 2550674, 746251, -2431488, -1451699, -1862405, 394600, 4313221, 1492501, -6133750, 7256884, 2672007, 2616709, -712428, -4141422, 4611185, -2122251, -374199, 957778, 1124745, 1392643, 1899449, -279710, 82141, -1399623, -292058, 136365, 845572, 2214593, -447213, 2257005, -167504, 488553, 1114007, -239444, -754841, -264141, 737124, 720481, -214748, -1112933, -3708704, -8958228, -1068910, -965294, 9891310, -3767223, 8477729, 2126009, -287226, 526134, 7584912, -1762547, -2072859, --2194192, 5346698, 10856604, 2845416, -7485055, -10155987, -14450954, 1896228, -3774740, -6073621, --3334505, -9418326, -44560, -4369593, 710817, 4526359, 4765266, -5368709, -4810364, -3413962, -604517, -7990250, -871878, 2488934, -3619584, -1314260, 840203, 3227131, -4490925, 1176821, -10566156, -433255, -512712, -3889630, 4400731, -1955284, 389231, 3363496, 4376035, 6505265, --1037772, 964757, -1957968, -82141, -1110786, 865436, 10151692, -11273215, 252329, 2198487, -5998459, -2488934, -2985002, -657130, -2818036, 8116952, -4468377, -10625749, -736050, -3166465, --4451197, 2645700, -10523744, 3894999, -1125818, -2916283, 212601, 7438347, -2202245, -2789581, --2866891, 3568581, -3341485, -901406, 627602, -299574, 1282585, 123480, 501437, 2211371, -179852, 581968, -551366, 1778653, 390842, -348429, -2000381, -1070521, -150324, -1046361, -2057289, 1257352, -1172526, 1539209, 155693, 231391, -1089848, 576599, -478352, 52076, -531502, -16510928, 6165426, -5166309, 6919729, -6222334, -563714, 4786741, -9547712, -1644436, -2912525, -2604361, 13914083, -5843303, -1760937, -5574868, -4654134, 7141457, 7952132, 3069828, --9362492, -11311333, 10456098, 1745367, -10590852, 3949223, 392453, 5004174, -3139084, 4773856, --6335614, 3080565, 10235444, 4218195, 4386236, 2313377, 182536, -2615635, 2141041, 787590, --6978785, 106300, -2210835, -5140539, -5115843, -1955284, 4046933, -7373385, 1008244, -5337571, --543313, -825707, 2433099, 4355097, 9248675, 3252901, -50466, 3961571, -4938676, -7283728, --126702, 1682017, 759136, 8773544, -1995549, -1086090, -2805688, -1254667, 1253057, 4254702, --1153736, 1771674, -4354560, 7097434, -1861332, -2496450, -1636383, 2291365, -3854196, 108448, -4402342, -325881, -1256278, 637266, 3499325, 2739116, -537945, 2205466, -1883343, 1391033, --1136019, 532576, 2508798, -895501, 1077500, 1050120, -1697586, 1698660, 1059246, 367220, --722091, -1567126, -360777, 1901060, 1286343, -685047, 782758, -388695, 3156264, -301721, --863825, -8252780, -1925756, -5356898, -547071, 10960220, 7005629, 4894652, -833224, -9647033, -1345935, -6347962, -10225243, -3394635, 7358890, -5775658, -9066676, 2368138, 777926, -4517232, -968515, 5159330, 1421097, -12085501, -3425237, 7594039, 8945880, 4460861, -10015864, -3634079, -4563940, -1707250, -2156611, 649077, 3352759, 539018, 1239098, 10277320, 19327, 6216429, -4818417, -79457, -4628364, -113817, -2731062, 6127308, -3504693, -5846524, 13422, 9614284, -539018, 9550934, 5147519, 926102, 6170795, -1040993, 13260175, 1069984, 6560026, 7473780, -691490, -6179921, -948651, -7393786, 3773666, -5298379, -2972117, -4885526, -3222299, -2344515, -2426657, 820876, 3653407, -151398, -4224637, -3677029, 1373316, 6831146, -2024540, 1690070, --7332046, 2323577, 6334540, 9727027, -3351148, -723702, 1610076, -3344169, -253940, 3211562, --984621, 5899675, 388158, 1343251, 147103, 281320, 2175401, -1436667, -934692, -765578, --443992, 597000, 730144, -1109712, 964757, -337155, -1177358, -1432372, 485868, -1359357, --896574, -1705102, 831076, 1183800, -246961, 3328600, -2157147, 588411, -234613, -1883880, -3167002, -911607, -448824, -1653562, 1797981, 1185948, -289373, 482647, 1586454, 10007811, --14944339, -2750390, 12524125, -6211597, 2292976, -9658308, 4259534, 17617418, -2379412, 934155, --741956, -12441447, 1007707, -789737, 18693308, -5895380, -912144, 8173323, -5149129, 11587285, --7808788, -1163936, -11807402, 13354664, 185220, -5251135, 170725, 4894652, -6207302, 9285719, --986769, 8230231, -58519, 4313221, -12906914, -8303246, -6022081, -1931125, 7780870, -11693048, -6252936, 4835597, 1631551, -4838818, -7053410, 16087874, 3194919, -1819456, 6238977, -5678484, -3381750, -7561290, -7431367, -3092377, -4990215, 17374754, 5186710, -3446711, -5163625, -6621766, -5459441, 4515621, 1641214, -6106907, -748398, -2471217, 7420093, 675921, 6001680, -14021458, -7627325, -1224603, 374736, -1555315, 2465311, -6185827, -2881386, -9721658, -3186866, 3544959, -5932424, 6279779, 2317672, 2292976, 1462436, -3474092, 2072322, 1435593, -261456, -2326799, --3887482, 2083059, 1934883, -2959233, 1527398, 220654, -2454574, 1619203, 441308, -1036161, --586263, 168577, 469762, -1790465, 1247688, 709743, -2828236, -641561, -1456531, 249645, -1977833, 1384590, -308701, 106837, -1320703, 3173981, 258235, -1082332, 6433324, 3219615, -5320391, 1645509, 161061, -1884954, -7908109, -2392297, -5066451, 3248606, -204011, 12134893, --10022306, -12938589, -3205119, 4145717, -3979824, -3068754, 10330470, 2138357, -5581310, -6444599, --6685117, 11283953, -5573794, 7650948, -3580929, 8362838, -8196945, 1893544, 12793634, 4428112, --17270064, 4062502, 455267, -2151779, -1480153, 1847910, -2008971, 1750736, -2768107, 1454920, --643708, -7683160, 7821136, 8026220, -2313914, 8883603, -7465190, -1240172, -2108292, -3520263, -9767293, -6924024, -12322261, -6876243, 2388539, -10035728, -9349070, -4641249, -3117610, -6405944, --479426, 8346195, 8785892, 1398549, 9467182, 3004330, 1323387, 7192460, -7565585, -1277216, -63888, -6203007, -537, -6007049, 7407208, -2047089, -1278827, 6172942, -1058173, -1858647, --1200980, 7357816, -829466, 2611340, -7037841, -2452963, 4034048, -4540854, 401043, 194347, -852014, -3444564, -2362769, -1781338, 178778, -1857037, -2224256, 798864, -285615, -1992328, --838592, 336081, -153545, -573915, -634045, -1117765, 442919, -3745212, -2588255, -2500208, --2477659, 100932, -77846, -836445, 994285, -1886564, 19265612, -9606231, -9250823, 6163278, -15644418, 2994666, 14082661, 8016020, 12782896, 5634997, -2469606, -5891085, 4534412, -9659918, --7373922, 10667625, 8899709, 22352620, -647466, 3064996, -8370355, 8602819, 3849365, -10037339, --2440078, 12640626, -114354, -14030048, -5721434, -7938174, -2752537, 7752953, 7088844, -5347771, --2646774, 9684614, -9502078, 4286914, 8121247, 9755481, -5305359, 8392903, -3638911, -12773770, -4423280, 11653320, -3201361, 3339874, 2781528, -3997004, 1355599, 3470334, -3706557, 1272921, -9395241, -5604396, -3017752, 8709120, -1946694, -1792612, -14561013, -5153961, -8820252, -14402636, --9754408, 7195144, -4783520, -6168110, 12387759, 12436615, -3214246, 13378823, 5304285, 8784819, --2537789, -6943352, 5726265, -7198902, -14416595, -8658117, -3752728, 7070053, 3204046, 11860552, -2035278, -2567854, -1983738, -12885, 2000381, -3696893, 179852, -2149094, -369367, 2080912, --418222, 332860, 3783866, -1394791, -751619, 3818763, -2862059, -1433982, -1913945, 1132798, --2127620, 1398549, 801011, 602906, 1957968, 2576444, 1116692, 4644471, 518617, 3179350, -1031866, 2393908, 2690260, -2387465, 2133525, 2354179, -1729798, -506269, -280247, -3338263, -930934, -1723893, -9765145, -10446971, 14132590, -2364916, 32294932, -13312788, -6259915, -752693, -7878044, -4515085, -4402342, -13318694, -15398531, 6942278, 1336272, 21243446, 6886980, -2182380, --2425046, 14106820, 14416595, -11923366, 8654896, -11390790, 2995740, -4913980, -5860483, -3506304, -2426657, -1865626, 7493108, 3737695, 8384313, -1059246, -3991098, -7881802, -1515587, 9140764, -828392, -12181601, -1521492, 2944200, -5185636, 9621264, 8153996, 1677722, 2845416, -26582090, --10162966, 9267466, -607738, 14894410, 4177393, 16790638, -1871532, -9109089, 8992588, -5100811, -6140730, 1075352, 24506010, 20234128, 2411087, 5715528, -3315715, 8038568, 8564702, 9222369, -10008348, 16226386, -273267, 2902861, -6200322, -5436892, 5113696, -7606387, -18807124, -13978508, --299037, 11688217, -5875516, -10663330, -6089727, -5755256, -607201, -12728672, -479963, 2352568, --53687, -1722819, -1218160, 1310502, 2780991, -354872, 2105608, -9506910, -5789616, -3041374, --6699075, 588411, -2396055, -3932043, -2602213, -1607928, 3884261, 1564979, -3570192, 1174137, -8546985, 4371203, -1757179, -3039763, -3832722, -2260227, -3080565, -6659884, 2487323, -2573222, --491237, 4824859, 1624571, -962073, 976568, 1850057, -28014998, 22151294, -610959, 2541547, --7742216, 12429635, -26597122, -17041356, -5355824, -6812892, -620086, -23845658, 4697084, 513249, --616865, -10877542, -11069741, 4537633, 15235323, 2379412, -20275466, -4377109, -16597364, 13153337, -8499203, 682363, -7335268, -3459059, -3732864, 10842645, -1518271, -197032, -2318746, -14685567, -7668127, 10331544, -6140730, -3271691, 8045011, -15988016, -11641509, -17641578, -5959804, 4463008, --11240466, -5360656, -454193, -18271328, 5615133, 11301670, 19998978, 2893734, -1957968, 1243930, --13111461, -10285910, 15316390, -1075352, -5789079, -3598646, -23387170, -12548284, 4605816, -4933844, --2706903, -1814087, 15341623, -2646237, -14534706, 1177358, 11365020, -284005, -7118909, -133681, -804770, -6009733, -10188199, 8025684, -18750216, -9286256, -120796, 9075803, -11454678, 7258495, -4824859, 6612639, 7060926, -7208029, -1807108, 8642548, 1668058, -5287642, 4972499, 7150047, --6676527, 2480344, 6426882, 6053220, 9528922, 633508, -2902861, -1636919, 1567126, 118112, -4189204, 3513820, 325881, -881005, -3040300, -1051193, 2093797, 4233227, -7041062, 891206, --1342177, 2895882, 6783364, 317291, 4747013, -2557653, 3148211, 3863860, 5712844, 4440460, -5572183, -438624, 3191161, -1056025, 2428804, 14551349, 13335337, 4656819, 22800370, -10614475, --5114769, 3457986, -6347425, -2064806, 7244536, 24464670, -4292283, 4748623, -455267, -1797981, --710817, 27015882, -13526999, 13889924, -449898, -18164490, 5626407, -18018998, -11155104, 9994926, --9659381, 6997576, 83215, 724776, 11920145, 9541270, -15013595, -16919486, -12835510, -4446902, -4454955, 4565550, 1485522, 3055869, -20339892, 2825015, -11067594, -25463250, 16860430, -5204427, -15834471, 17026860, 678068, 6213744, -9540196, -11466489, -20185810, 4328254, 17885318, 2978560, --8319352, 843961, -4350802, 2558190, -11026255, -8986682, -11011759, 1613297, -1625645, -3718368, -11403138, 10321880, 6021544, 16861504, 1592896, -18206904, 22900228, -17197586, -5557151, -4482335, --4823785, 19240916, -3444564, -28104656, 23383412, -9488656, -6009733, 6277632, 5682242, 18055506, -11336029, 7430294, 8596377, 7857106, 5770289, 130460, 7336341, 9012452, 2111513, -93952, -9548249, -1974611, 806917, -9305047, -2527052, -3113315, -5067525, 540629, -1079647, 5744519, -3993783, 1554241, -1090922, 2653753, 889058, 1874216, 3672734, -1463510, -1893544, 621160, --1872069, 2771865, 1044751, 1174137, 2021319, 1143535, 8774618, 6447820, 1546725, 1625108, -20946018, 23699630, 5369246, -45204532, 1411434, 12499429, -15059229, 8834211, 17796196, 674847, -4692252, 11153493, 8543227, 3182034, 15983184, 3463891, -2429341, 30180198, 11124502, 3773129, -12957379, -10237591, 15938624, -11485279, -1156420, -1466195, -3893388, -16852378, 5419712, -11977590, -21484500, -2115272, -4418985, 31636730, 4089883, 4471061, 10430865, 1018981, 5946919, -7319698, --14024142, -1757715, 9205726, -16602196, 18907520, 17026860, 12548284, 3150359, 7412577, -11528229, --11937862, -18882824, -8407935, -10272488, -9761387, 4271345, -1957431, -18496814, -8264054, 15930034, --411780, -15292231, 8432631, -1018981, -10426570, -24718610, 1580548, -37370512, 21490942, -12845710, -19538344, 766115, 5362267, 454730, -7426536, 9701794, 33135672, 2861522, 9363566, -6009196, --26030186, 2101850, -2907156, 18767934, 10931229, -4662724, -1020592, -4126390, -2150705, 6247030, --7516730, 5851356, -969589, -6723772, -6659347, 6796786, -8132521, -8126615, -11236171, -2461553, --8100845, 2309619, 6931004, 265214, -2107755, -5412733, 10164040, -9818295, 2452963, 1031866, -793495, -5851893, 4010426, 9864466, -508954, -5223217, -1284195, 8980777, 9487583, -7861938, -9084393, -874026, -2437394, 1244467, -634581, 9906879, 2581812, -5603322, -4772246, -263604, -1086627, 5719823, 12628278, 9450539, 24738474, -33488934, 13514651, -19526532, 17049410, -8167417, --13940927, -3854196, -16088947, -6653978, -3424163, 6091338, 7726646, -4560719, 23771570, -913217, --3842385, -2971044, -21124260, -2173790, 302795, -17770428, 5973226, -15130633, -19087908, -6070400, -11839077, -31793496, -21484500, -14334990, 1861332, -22248468, -18820010, -15261629, -7531225, -6099391, --2726231, -14996415, 16407849, 2920578, -1360431, -11163157, -11408507, 22031572, -18835580, -12898861, -5969468, 5963562, 8085276, -10944650, -15175193, -6381785, -2640331, 7282117, -10836739, -4326106, --4306242, -13093745, -22290880, -28348394, 27139362, -29381872, -1418950, 2191507, -4924717, -5352603, --26144540, 10308458, -6101538, -27562952, -410706, -5982353, 26253524, 6534793, 18748606, 17714592, --5028870, 6985765, -2674691, -4952098, 13257490, -3215857, 7714298, -9916543, 1005559, -9991705, -8815957, 6784438, 1452773, 6211597, -2400350, -896038, 6745783, 3172370, -6140193, 4767414, -10856604, -1590749, 2683818, -5738613, -13371844, -1392643, -964220, -420370, -9211094, -2021319, -1744831, -1342714, -4800700, 6469832, -948651, -3627637, -10775536, -11129334, 398895, 6124624, -3839701, 2369211, -510564, 8024073, 9345312, -4093104, 2201708, 2198487, -368830, 2703682, -6856379, -29885994, 34816616, 5600638, 3618510, -5915781, 17742510, 314069, 29138668, -7818451, -20032802, 10817949, -28481002, 12488154, 4828617, 13666049, -2202245, -7544110, -11256572, -4121558, -14117558, 30826054, 3398393, -4428648, -19311784, 7409356, -20896090, -3270618, 21396454, -19135690, -188979, 1402307, -3151432, -7194607, -7998303, 34133180, -7194070, -8330089, -3958886, 7770133, -11611981, 4321274, 746787, -6914898, 85362, 5129802, 20899848, -4730370, 29822642, 17338246, -9028021, -7106561, 26029650, 29361470, -2206540, -7764764, -1322313, -9533217, 3142306, -9443022, -15030775, 5047124, 21560736, 16481400, -25882010, -29431264, 35539780, 26225070, 4414690, -4998268, --13747117, -19392314, -7319161, 19866372, -18437758, -20247012, -2579128, -5471789, -32095216, -7221988, -7472170, -12552042, 2025614, -91805, 2013803, 2622615, 5688148, -9554692, -5572720, -9820443, --3235721, -52076, 1776506, -5363341, -2217277, -955630, -15639587, -5327907, -7265474, -3526705, --77309, 1404991, 1017370, 2667712, -667331, 584116, -8039105, 4829691, -6863358, -8366060, -6331856, 2549063, -14595373, -1634235, -4292283, 7391102, 14685030, 304406, -11764989, 9769977, --2360622, 2552821, 3848291, -3956202, -2414845, 891743, -6063420, -8587250, 15626165, -12324409, --3815005, -2384781, 3300146, 748935, -18656802, -54557896, 27734752, -26096222, 11011759, 39393440, -6242198, -16124918, 11559368, 13908178, -5424544, -12130061, -2307471, -26734024, 9186398, -27795954, --16779900, 11547020, 1431835, 5137318, -25096568, -4886062, -18041010, -15268609, -22323630, -7606924, -8008504, -13176423, -13388487, 13555454, 2103997, -833224, 4491462, -25706454, -1330366, -19929186, -17575006, 5056787, -49199924, 12743168, 26780194, -5381594, 16083579, 13594108, 9250286, 7487739, -25587804, 20138028, 998043, -17832704, -3565897, 20352776, 13286481, -16505559, 1474248, -19327890, --6057515, 1614908, 14495515, 19346144, -34727496, -27378270, -15224585, 3240016, -10139344, -3552475, -32817308, 5652177, 7970386, 25651156, -10027138, 5530844, -6206765, 26242788, -12945031, 1363115, -2848100, 19522774, -5092758, -1733556, 7295539, 8196408, -740345, 4161823, 12813498, 813896, --133144, -199179, 12483322, -5876589, -3698504, 3259880, 5549098, 3911105, 1872069, 6086506, --2421288, 347892, -5336497, 167504, -3905199, -290447, -5475010, 9701794, -6813966, -10058277, -10057203, 6765647, 7002944, -6997576, -9182103, 332323, -16670916, -4301947, -8472360, -8524436, -3689914, 245350, -8783745, 3380676, 3919695, -651224, -5100811, -4808753, 4168803, 2797098, -8304320, 18163954, 17556752, -30617212, 6405944, -6596533, -8051990, -7117298, 20540144, 10905996, --14979772, -8551280, 15676094, -28164784, 1601486, 10241886, 15707232, -3349001, 3481071, -32869384, --117038, -14564771, 11000485, 4034585, 18248780, -28910498, -14570677, -4212826, 3576634, -2496987, -5657546, 2057289, 15779710, 29704530, -18799072, -24315958, 6419366, -25340308, -7450158, 10593000, --18393198, -17901424, 1512902, 11005317, 15488726, 10960220, -6889128, -1571958, -32225676, -21760988, -28654412, -19888382, 38671884, -16406775, 7893613, 5639829, -278636, -28423556, 35612796, -16595217, --3345780, -6419903, 13921063, 26782342, -27086212, -15440407, 31850940, -23576150, -23622, -8913131, -6525129, 36813776, 228707, -2732136, -22771380, 28154584, -9161702, 7305203, 9337796, -17842368, --21467858, 2079301, 12416214, -6455336, 6374269, -51006496, -23756538, -7321309, -25978110, -12841415, -4366371, 16872780, -3537979, -4663261, -13271449, 327491, -1245541, -9741523, -3329674, 5941551, -521839, 7970386, 3773129, 7552163, -10001905, -1453846, -2079838, 10515154, 8364986, -6347425, -19362786, 7106561, -7768522, 11704323, 3235184, -1185411, -6108517, 4413616, -4414690, -4185446, -8661875, 709207, -3787088, -3431679, 7262253, -2036888, 6567005, -1520955, 11932493, 2452426, -1748052, -4836670, -3517578, -4327717, -1576253, 1433982, 17452600, -20203526, 5455682, 16485158, -16296180, 37155224, -23849954, 34119220, -6178311, -22578644, -22099754, 5499706, 14170171, -10062035, --4722854, -15586973, -6498823, 28887414, -20621748, -2041183, 23199266, -7684234, 13790603, -9457518, --4584341, 24610700, -1014149, 1123671, 23742580, 16413754, 5707475, -3080565, 20030654, 27392764, --28198070, 25734908, -24925306, 12973486, -18033494, 3601867, 21188684, 7155953, -48588964, 21366926, -13608604, -299037, 24413668, -38595112, -7575249, 26013544, 22111566, 3584687, 34833796, -18746996, -257161, -4611185, -5555540, 14869177, 6051072, 26074746, 21690658, -16518444, 14339822, -30549566, --9576166, 2297271, -1703491, -2497524, -5101885, -47737488, -26424786, -36901284, -25121800, 27202176, --17162152, -4257387, 2961917, 44624172, -10871636, -15902116, 35765268, 21865142, -1213328, 28949690, -4243428, 5373541, -13771813, -79994, -11549167, -12156368, -6369437, 9295920, -11674795, -6146098, -5390184, 2010582, 8824547, -3739306, -1698660, 11495480, 6585796, 563178, -9392557, -7561290, --1331440, -2989297, 6736120, 11470247, -1051193, 1937567, 2496450, -4823785, 28707024, 8805757, -1865626, 1041530, -9637370, 7565585, -17074642, -1371705, 14360760, -1132798, -4040491, 10435160, -5850819, 3118683, -444529, -9532143, 6075768, 6723235, 2069637, 3628174, 4841502, -3396246, -3700114, -11531450, 11919071, 29963840, -15919296, 11816529, 14984067, -20887500, 3122441, -25780004, -10350334, -2380486, -13580150, 21173116, 988916, 32794760, -1610076, -23800024, 41344964, -6933688, -4458176, 6090801, -38088844, 12016782, 33464774, 12248173, -14030584, -24732570, 2979634, 6593849, -28663002, 18713710, -8875013, -5044439, -21703006, 678605, 32378684, -43060804, 13560822, 30913564, --27035208, 10532870, 3188476, 11041287, 32381370, 11194832, 12706661, -5432060, -31120796, 33081448, --5710159, -16139413, 68638408, 34127812, 17760226, 3517041, 1882269, -31608274, -26024818, -11413339, -20409684, -133144, -18320720, -12610561, 25656524, -14909442, 17772574, 10469520, -12184285, 19214610, -8859444, -26473642, -13192529, -15282031, 4777614, 17535814, -33524904, 11735461, -34359740, -43203076, --27235998, 42651708, -14214194, 9320616, -9511742, -13956496, -1782948, -16749836, -11739756, -8606578, -2457795, -16011101, 2276333, 10445897, 299037, -13996762, -10591926, 5827734, 1972464, 19368156, -2815888, -20768852, -8034273, -11589969, 17952426, -2857764, -6822556, -16258599, 95563, 10959146, -4972499, 12394202, -5577552, -1136556, 3757023, 12634183, 7866770, 471910, -6400038, 9636833, --7906498, -28454, 5109401, -6819335, 122407, 14112726, -100395, 3340948, -14238890, -9352291, --10752451, 7515656, -11457899, -2715493, 41467372, 69389488, -12017318, -2712809, -57597660, -19587736, --42449308, -28430536, 38613368, 2381023, 10222022, -32771138, 10129680, -28819768, -64383708, 8956081, -30392262, -2911451, 3619047, 32741072, -44250512, 49737868, 24620364, 15277736, -25183004, 33328410, -64608120, -13269301, 19735912, 48978732, 41313292, 73156712, 15637439, 26048976, 19671488, 17562658, -62809600, -16751446, -7814693, 22951768, 13517336, -7168838, 34421480, 1791538, 7023882, -20893942, --56661892, 1904818, 37350648, 5452998, 22529788, -40961104, 2285996, -54369456, -129386, -58402428, -3783866, 40553080, -5382131, -17566416, -55649892, 72410464, 13012140, 4665945, 75044888, -1100585, --17357036, -12881144, 3731790, 14875619, -4297115, 107911, -6097243, -39922256, 23456428, 9022653, --25039122, -15403900, 19594714, -24139864, -41683196, -20394652, 8964670, 39687108, -41710576, 33041184, --1723893, 17608292, -7363185, 14375792, -10065256, -1491427, 3520263, 4035122, 13267154, 12101070, -2431488, 25438554, -1391569, 10475962, 13331042, 7859254, 5808407, 6136972, 21915608, 16437377, -7869991, -8475044, -3629247, 19198504, -25393994, 9952513, -15151034, 3838627, -5637145, 17431662, -19866372, 40568112, 22573812, 38325604, 21862458, 8337606, 40043592, 41837276, 39577048, 23044110, --6623377, 24152212, 26394184, 16724066, 31776316, 24426016, 288837, 7927436, 5723044, 6016176, -9651865, 7635915, -7613904, -7096897, 938987, 7793218, -1304596, 72478, -1750199, -3510062, --7530152, -6583648, -2582886, -1536525, -2612414, 256624, -4154307, -1818919, -23005992, -73950208, -2588255, 97692792, 13424457, -21066278, -19979114, -45880988, -30280594, 397284, 60686816, 9905805, --42030012, -3903589, 15891379, 3099356, 351650, -4996658, 9839770, -30334818, -11893301, 14081050, -33267742, 33486786, -33342368, -13422847, 1636383, 3661460, 7836705, -38296612, 2776696, 5170067, --10661719, 25949656, -1094680, 30086246, 45892800, 21424908, 8879308, 19410030, -27286464, 23159000, --22178138, 35101692, 62894428, 20028506, -35133368, -30596274, 28119150, 9601936, 53538916, 39857832, -11763915, -11104638, -12853763, 746787, 2155537, -19804094, 20439212, 17547088, 2872796, 48103096, -32937568, -5424544, 23317914, 25750476, 11841225, 25752088, 550830, -47531868, -6350646, -12145094, --11349988, 52108692, 23870354, 7689602, 41628972, 24056112, 26349624, 32082332, 10881837, -34615288, --17233556, -1728188, -1101122, -12824772, -10372883, -21378736, 12236899, 7262253, 19349902, -10245644, -21658984, 5252745, 22457848, 14362908, -5485210, -12653511, 3036542, 5205501, -163209, 1646583, -16401406, 635655, 25883084, 34127272, 9740986, -3965866, 2274722, 24222004, 5530844, -9031242, --6971269, 18902152, -1284195, -7267622, -4096325, 5506685, 13954349, 27139898, -15050102, 1161252, --9795210, 1204202, 1003412, 21900038, -12458626, 10216653, 13895293, 7144141, -10516227, 2028835, -16244103, 831613, 503585, 14470819, 2211371, 8209830, 6039798, 282931, -2898566, 1518808, --2018635, 2243584, 1360431, 2449205, 1202054, 6250251, 2486249, 1668595, 2013803, 4089346, -1886564, 4476967, 1817845, 2188286, 2381559, 1879585, 2505577, 1246614, 2321430, 3185255, -3619584, 3489661, 3929895, 3124052, 4154307, 3079492, 3386045, 1430224, 3447785, 1434519, -3176665, 1060857, 3202972, 2174327, 2936147, 703301, 2934000, 1887101, 3121904, 2040646, -3516505, 1085553, 3760781, 1134945, 3362423, 1868848, 3333968, 1303523, 3750580, 1237488, -3053722, 1740536, 3280281, 1610076, 3871376, -38655, -14081587, -68940128, -14582488, 39197484, -21342766, 85219664, 5021891, -11812771, -37606732, -73895984, -81333792, -13109314, 35575752, 40088152, -25715580, -40754944, -54193896, 135828, -6355478, 22294638, 57204132, 29500520, -5035849, -33568392, --45985676, -28538448, 2183991, -27938762, 11383811, -23284092, -11507291, 38487740, 31632972, 28477780, -11165304, -38400228, -10616622, -36703716, -28427314, -14418205, 22240414, -3572876, 23598698, 58106076, -60240676, -24459838, 7126425, -43731892, -30084636, -20582020, -3637837, 8844411, 35003984, 37702832, -51382840, 36966248, 13254269, -24768540, -23172960, -5017596, 16626892, -41225244, 3211025, 49463528, -39138428, -9630927, 52977884, 47743932, 26752814, 49873696, -93256624, 22799834, -26418880, -28207734, -16152835, -14857902, -1223529, 94795832, 79817136, 28852516, -24511378, -1591285, -37365680, -6765111, --50287624, -17289390, -8380018, 20045150, 61794916, 32938104, 13019656, 11607149, -9867687, -30354682, --39806292, 730144, -26260504, 21706764, -2233920, 478352, 23727010, 19984482, 7357816, 20679730, -7136625, 31955094, -21799644, 208306, -24043764, 10672994, -20910048, -18547280, 3401077, -5131949, -16693464, 30273076, 1851131, -26746372, -46154256, -13225278, -26739930, 3776887, 12043625, 22594212, --17824114, -5616207, 836982, -303332, 23430658, 1884417, -120120568, -136177312, -146416512, -147928336, --200539008, -12016782, -71917080, -23322210, 26450020, 66853312, 93842352, 96807488, 197941088, 212262112, -172776864, 128502736, 136121472, 129802504, 49961744, -19432580, -89388472, -89544696, -137370768, -44703092, --74490304, -55554328, -5288179, -116609432, -33606508, -104162624, -28414430, -119672288, -112831472, -52136608, --93168576, -9587978, -47098076, -43528956, -69690136, -46149424, -105185896, -74370040, -39560944, -36257576, --55682104, -34133180, -4170413, -45059040, 15071577, 67177584, -52459804, 79484272, 47600584, 106120592, -106574248, 93070328, 114757768, 96970160, 160101888, 159068944, 126811056, 169737648, 145504368, 222319312, -218885488, 258002976, 200749456, 216142624, 235490368, 212766768, 254358704, 188517920, 275440544, 220178816, -83845280, 107652280, 28298466, 42632384, -149148112, -125123136, -139748576, -148664928, -156815696, -202507712, --190747008, -209578304, -230199504, -270528192, -226192848, -207038368, -230220992, -250978032, -299321632, -240025856, --265865984, -267515792, -203067664, -228821360, -132118024, -163864816, -112246288, -104118064, -55229520, -40295384, --57180512, -9807558, 26863946, 130009200, 123085176, 89468464, 101032664, 108820512, 147383952, 151100176, -163283376, 172350064, 148109264, 150632016, 110566952, 156735168, 160133568, 122129008, 85784992, 66388920, -96192768, 95333240, 74068856, 44545792, 24536612, 37553048, -9813463, 5218386, -17602386, -13796509, --71155264, -64961380, -47498044, -32694902, -43337292, -33020782, -15898895, -12899397, -17221746, -31849866, --29491392, -14448807, -18996640, -12357158, -10623065, 2296734, 4966056, 1094143, -5065914, -1152125, -2566243, -1563368, -1621350, 1913408, 3468723, 7017977, 1906966, -1779727, -331786, 2392834, -1999844, -1588064, -683437, 3801583, 2393908, 2012729, 2217814, 4051765, 3341485, 928787, --318901, 2863133, 2729989, 3012383, -668404, -3170760, -1611150, 1130113, 3907883, 4661650, -2579665, 967441, -2382633, -3772055, -2808909, -2777770, -5510443, -9002251, -11369315, -11647951, --12056510, -13174812, -14428943, -16759499, -18712098, -20225538, -20037096, -18172544, -16728898, -16773995, --16254841, -15315853, -9931038, -6803765, -4958540, -1067299, 2647847, 5661841, 8704288, 11909407, -13696651, 15919833, 15829102, 15282567, 15201500, 13640816, 11307038, 8756365, 7007239, 5683316, -4191888, 2874407, 1736777, 1038308, 485868, 367757, 228707, 165893, 110059, 60666, -56908, 104690, 176094, 213675, }, +5188321, 158377, 290984, 6376416, 1604707, -3152506, 2183991, 4246649, -2122251, -3498788, +-12596602, 684510, -4220342, 8437463, -4155918, 4235375, 3432216, -430034, 2780455, 4671314, +1301375, 1097901, -2270964, -2764348, -2117419, -3485903, 3074660, 1821066, -1617055, 2748779, +-1864553, -2786897, -3300682, -1604707, -2600066, 228707, 76773, -486942, 5808944, -3336653, +4758824, -1703491, -1164473, 3172907, -1926830, 993211, -1926293, 3477850, -987843, -9861782, +2971581, 346819, 1249299, 4962835, 2603287, 359167, -1086090, -3260954, 8484171, -4465156, +3324305, 1719598, -3452617, 3555696, 1623498, -4126927, 3314104, -4256850, 285078, -440234, +3766150, 613107, 3935264, -1501091, -8671539, -1864553, -2060511, -4140349, -3666292, -3674345, +3051038, 1324461, 1097364, 1826972, 1868311, 363462, 909459, -1021129, 654983, -753767, +-300648, -2127620, 17180, -707059, 1657857, -157840, -463856, -325881, 217970, -1103270, +425739, -479426, 645319, -352724, 159451, -1271847, -108448, -1589138, -926639, -907312, +1342177, 15291157, -7649337, 782221, -528818, -517544, 3424163, -2832531, -11099269, -10234370, +4713190, -3285650, -1014149, 2525441, 490700, 2491618, 2786360, -4913443, 2541010, 1733019, +-3505767, 3942780, 5973226, -4023311, -1376000, 225486, -6606734, -3027415, 577673, 7722888, +-1339493, -517544, -6583648, 3767223, -79994, -5911486, -2576444, 1946157, -970126, 1050656, +-5129265, -204548, 257161, -2139431, 5301064, 1279363, 1121523, 5119601, -630286, 6673843, +-2361158, -8679055, 3381750, 3277060, -3115462, -1406065, -1144609, 979789, 293132, 2308008, +-2060511, 1497870, -4779225, -297427, 2987687, -4570382, -618475, 2550674, 746251, -2431488, +1451699, -1862405, 394600, 4313221, 1492501, -6133750, 7256884, 2672007, 2616709, -712428, +4141422, 4611185, -2122251, -374199, 957778, 1124745, 1392643, 1899449, -279710, 82141, +1399623, -292058, 136365, 845572, 2214593, -447213, 2257005, -167504, 488553, 1114007, +239444, -754841, -264141, 737124, 720481, -214748, -1112933, -3708704, -8958228, -1068910, +965294, 9891310, -3767223, 8477729, 2126009, -287226, 526134, 7584912, -1762547, -2072859, +-2194192, 5346698, 10856604, 2845416, -7485055, -10155987, -14450954, 1896228, -3774740, -6073621, +-3334505, -9418326, -44560, -4369593, 710817, 4526359, 4765266, -5368709, -4810364, -3413962, +604517, -7990250, -871878, 2488934, -3619584, -1314260, 840203, 3227131, -4490925, 1176821, +10566156, -433255, -512712, -3889630, 4400731, -1955284, 389231, 3363496, 4376035, 6505265, +-1037772, 964757, -1957968, -82141, -1110786, 865436, 10151692, -11273215, 252329, 2198487, +5998459, -2488934, -2985002, -657130, -2818036, 8116952, -4468377, -10625749, -736050, -3166465, +-4451197, 2645700, -10523744, 3894999, -1125818, -2916283, 212601, 7438347, -2202245, -2789581, +-2866891, 3568581, -3341485, -901406, 627602, -299574, 1282585, 123480, 501437, 2211371, +179852, 581968, -551366, 1778653, 390842, -348429, -2000381, -1070521, -150324, -1046361, +2057289, 1257352, -1172526, 1539209, 155693, 231391, -1089848, 576599, -478352, 52076, +531502, -16510928, 6165426, -5166309, 6919729, -6222334, -563714, 4786741, -9547712, -1644436, +2912525, -2604361, 13914083, -5843303, -1760937, -5574868, -4654134, 7141457, 7952132, 3069828, +-9362492, -11311333, 10456098, 1745367, -10590852, 3949223, 392453, 5004174, -3139084, 4773856, +-6335614, 3080565, 10235444, 4218195, 4386236, 2313377, 182536, -2615635, 2141041, 787590, +-6978785, 106300, -2210835, -5140539, -5115843, -1955284, 4046933, -7373385, 1008244, -5337571, +-543313, -825707, 2433099, 4355097, 9248675, 3252901, -50466, 3961571, -4938676, -7283728, +-126702, 1682017, 759136, 8773544, -1995549, -1086090, -2805688, -1254667, 1253057, 4254702, +-1153736, 1771674, -4354560, 7097434, -1861332, -2496450, -1636383, 2291365, -3854196, 108448, +4402342, -325881, -1256278, 637266, 3499325, 2739116, -537945, 2205466, -1883343, 1391033, +-1136019, 532576, 2508798, -895501, 1077500, 1050120, -1697586, 1698660, 1059246, 367220, +-722091, -1567126, -360777, 1901060, 1286343, -685047, 782758, -388695, 3156264, -301721, +-863825, -8252780, -1925756, -5356898, -547071, 10960220, 7005629, 4894652, -833224, -9647033, +1345935, -6347962, -10225243, -3394635, 7358890, -5775658, -9066676, 2368138, 777926, -4517232, +968515, 5159330, 1421097, -12085501, -3425237, 7594039, 8945880, 4460861, -10015864, -3634079, +4563940, -1707250, -2156611, 649077, 3352759, 539018, 1239098, 10277320, 19327, 6216429, +4818417, -79457, -4628364, -113817, -2731062, 6127308, -3504693, -5846524, 13422, 9614284, +539018, 9550934, 5147519, 926102, 6170795, -1040993, 13260175, 1069984, 6560026, 7473780, +691490, -6179921, -948651, -7393786, 3773666, -5298379, -2972117, -4885526, -3222299, -2344515, +2426657, 820876, 3653407, -151398, -4224637, -3677029, 1373316, 6831146, -2024540, 1690070, +-7332046, 2323577, 6334540, 9727027, -3351148, -723702, 1610076, -3344169, -253940, 3211562, +-984621, 5899675, 388158, 1343251, 147103, 281320, 2175401, -1436667, -934692, -765578, +-443992, 597000, 730144, -1109712, 964757, -337155, -1177358, -1432372, 485868, -1359357, +-896574, -1705102, 831076, 1183800, -246961, 3328600, -2157147, 588411, -234613, -1883880, +3167002, -911607, -448824, -1653562, 1797981, 1185948, -289373, 482647, 1586454, 10007811, +-14944339, -2750390, 12524125, -6211597, 2292976, -9658308, 4259534, 17617418, -2379412, 934155, +-741956, -12441447, 1007707, -789737, 18693308, -5895380, -912144, 8173323, -5149129, 11587285, +-7808788, -1163936, -11807402, 13354664, 185220, -5251135, 170725, 4894652, -6207302, 9285719, +-986769, 8230231, -58519, 4313221, -12906914, -8303246, -6022081, -1931125, 7780870, -11693048, +6252936, 4835597, 1631551, -4838818, -7053410, 16087874, 3194919, -1819456, 6238977, -5678484, +3381750, -7561290, -7431367, -3092377, -4990215, 17374754, 5186710, -3446711, -5163625, -6621766, +5459441, 4515621, 1641214, -6106907, -748398, -2471217, 7420093, 675921, 6001680, -14021458, +7627325, -1224603, 374736, -1555315, 2465311, -6185827, -2881386, -9721658, -3186866, 3544959, +5932424, 6279779, 2317672, 2292976, 1462436, -3474092, 2072322, 1435593, -261456, -2326799, +-3887482, 2083059, 1934883, -2959233, 1527398, 220654, -2454574, 1619203, 441308, -1036161, +-586263, 168577, 469762, -1790465, 1247688, 709743, -2828236, -641561, -1456531, 249645, +1977833, 1384590, -308701, 106837, -1320703, 3173981, 258235, -1082332, 6433324, 3219615, +5320391, 1645509, 161061, -1884954, -7908109, -2392297, -5066451, 3248606, -204011, 12134893, +-10022306, -12938589, -3205119, 4145717, -3979824, -3068754, 10330470, 2138357, -5581310, -6444599, +-6685117, 11283953, -5573794, 7650948, -3580929, 8362838, -8196945, 1893544, 12793634, 4428112, +-17270064, 4062502, 455267, -2151779, -1480153, 1847910, -2008971, 1750736, -2768107, 1454920, +-643708, -7683160, 7821136, 8026220, -2313914, 8883603, -7465190, -1240172, -2108292, -3520263, +9767293, -6924024, -12322261, -6876243, 2388539, -10035728, -9349070, -4641249, -3117610, -6405944, +-479426, 8346195, 8785892, 1398549, 9467182, 3004330, 1323387, 7192460, -7565585, -1277216, +63888, -6203007, -537, -6007049, 7407208, -2047089, -1278827, 6172942, -1058173, -1858647, +-1200980, 7357816, -829466, 2611340, -7037841, -2452963, 4034048, -4540854, 401043, 194347, +852014, -3444564, -2362769, -1781338, 178778, -1857037, -2224256, 798864, -285615, -1992328, +-838592, 336081, -153545, -573915, -634045, -1117765, 442919, -3745212, -2588255, -2500208, +-2477659, 100932, -77846, -836445, 994285, -1886564, 19265612, -9606231, -9250823, 6163278, +15644418, 2994666, 14082661, 8016020, 12782896, 5634997, -2469606, -5891085, 4534412, -9659918, +-7373922, 10667625, 8899709, 22352620, -647466, 3064996, -8370355, 8602819, 3849365, -10037339, +-2440078, 12640626, -114354, -14030048, -5721434, -7938174, -2752537, 7752953, 7088844, -5347771, +-2646774, 9684614, -9502078, 4286914, 8121247, 9755481, -5305359, 8392903, -3638911, -12773770, +4423280, 11653320, -3201361, 3339874, 2781528, -3997004, 1355599, 3470334, -3706557, 1272921, +9395241, -5604396, -3017752, 8709120, -1946694, -1792612, -14561013, -5153961, -8820252, -14402636, +-9754408, 7195144, -4783520, -6168110, 12387759, 12436615, -3214246, 13378823, 5304285, 8784819, +-2537789, -6943352, 5726265, -7198902, -14416595, -8658117, -3752728, 7070053, 3204046, 11860552, +2035278, -2567854, -1983738, -12885, 2000381, -3696893, 179852, -2149094, -369367, 2080912, +-418222, 332860, 3783866, -1394791, -751619, 3818763, -2862059, -1433982, -1913945, 1132798, +-2127620, 1398549, 801011, 602906, 1957968, 2576444, 1116692, 4644471, 518617, 3179350, +1031866, 2393908, 2690260, -2387465, 2133525, 2354179, -1729798, -506269, -280247, -3338263, +930934, -1723893, -9765145, -10446971, 14132590, -2364916, 32294932, -13312788, -6259915, -752693, +7878044, -4515085, -4402342, -13318694, -15398531, 6942278, 1336272, 21243446, 6886980, -2182380, +-2425046, 14106820, 14416595, -11923366, 8654896, -11390790, 2995740, -4913980, -5860483, -3506304, +2426657, -1865626, 7493108, 3737695, 8384313, -1059246, -3991098, -7881802, -1515587, 9140764, +828392, -12181601, -1521492, 2944200, -5185636, 9621264, 8153996, 1677722, 2845416, -26582090, +-10162966, 9267466, -607738, 14894410, 4177393, 16790638, -1871532, -9109089, 8992588, -5100811, +6140730, 1075352, 24506010, 20234128, 2411087, 5715528, -3315715, 8038568, 8564702, 9222369, +10008348, 16226386, -273267, 2902861, -6200322, -5436892, 5113696, -7606387, -18807124, -13978508, +-299037, 11688217, -5875516, -10663330, -6089727, -5755256, -607201, -12728672, -479963, 2352568, +-53687, -1722819, -1218160, 1310502, 2780991, -354872, 2105608, -9506910, -5789616, -3041374, +-6699075, 588411, -2396055, -3932043, -2602213, -1607928, 3884261, 1564979, -3570192, 1174137, +8546985, 4371203, -1757179, -3039763, -3832722, -2260227, -3080565, -6659884, 2487323, -2573222, +-491237, 4824859, 1624571, -962073, 976568, 1850057, -28014998, 22151294, -610959, 2541547, +-7742216, 12429635, -26597122, -17041356, -5355824, -6812892, -620086, -23845658, 4697084, 513249, +-616865, -10877542, -11069741, 4537633, 15235323, 2379412, -20275466, -4377109, -16597364, 13153337, +8499203, 682363, -7335268, -3459059, -3732864, 10842645, -1518271, -197032, -2318746, -14685567, +7668127, 10331544, -6140730, -3271691, 8045011, -15988016, -11641509, -17641578, -5959804, 4463008, +-11240466, -5360656, -454193, -18271328, 5615133, 11301670, 19998978, 2893734, -1957968, 1243930, +-13111461, -10285910, 15316390, -1075352, -5789079, -3598646, -23387170, -12548284, 4605816, -4933844, +-2706903, -1814087, 15341623, -2646237, -14534706, 1177358, 11365020, -284005, -7118909, -133681, +804770, -6009733, -10188199, 8025684, -18750216, -9286256, -120796, 9075803, -11454678, 7258495, +4824859, 6612639, 7060926, -7208029, -1807108, 8642548, 1668058, -5287642, 4972499, 7150047, +-6676527, 2480344, 6426882, 6053220, 9528922, 633508, -2902861, -1636919, 1567126, 118112, +4189204, 3513820, 325881, -881005, -3040300, -1051193, 2093797, 4233227, -7041062, 891206, +-1342177, 2895882, 6783364, 317291, 4747013, -2557653, 3148211, 3863860, 5712844, 4440460, +5572183, -438624, 3191161, -1056025, 2428804, 14551349, 13335337, 4656819, 22800370, -10614475, +-5114769, 3457986, -6347425, -2064806, 7244536, 24464670, -4292283, 4748623, -455267, -1797981, +-710817, 27015882, -13526999, 13889924, -449898, -18164490, 5626407, -18018998, -11155104, 9994926, +-9659381, 6997576, 83215, 724776, 11920145, 9541270, -15013595, -16919486, -12835510, -4446902, +4454955, 4565550, 1485522, 3055869, -20339892, 2825015, -11067594, -25463250, 16860430, -5204427, +15834471, 17026860, 678068, 6213744, -9540196, -11466489, -20185810, 4328254, 17885318, 2978560, +-8319352, 843961, -4350802, 2558190, -11026255, -8986682, -11011759, 1613297, -1625645, -3718368, +11403138, 10321880, 6021544, 16861504, 1592896, -18206904, 22900228, -17197586, -5557151, -4482335, +-4823785, 19240916, -3444564, -28104656, 23383412, -9488656, -6009733, 6277632, 5682242, 18055506, +11336029, 7430294, 8596377, 7857106, 5770289, 130460, 7336341, 9012452, 2111513, -93952, +9548249, -1974611, 806917, -9305047, -2527052, -3113315, -5067525, 540629, -1079647, 5744519, +3993783, 1554241, -1090922, 2653753, 889058, 1874216, 3672734, -1463510, -1893544, 621160, +-1872069, 2771865, 1044751, 1174137, 2021319, 1143535, 8774618, 6447820, 1546725, 1625108, +20946018, 23699630, 5369246, -45204532, 1411434, 12499429, -15059229, 8834211, 17796196, 674847, +4692252, 11153493, 8543227, 3182034, 15983184, 3463891, -2429341, 30180198, 11124502, 3773129, +12957379, -10237591, 15938624, -11485279, -1156420, -1466195, -3893388, -16852378, 5419712, -11977590, +21484500, -2115272, -4418985, 31636730, 4089883, 4471061, 10430865, 1018981, 5946919, -7319698, +-14024142, -1757715, 9205726, -16602196, 18907520, 17026860, 12548284, 3150359, 7412577, -11528229, +-11937862, -18882824, -8407935, -10272488, -9761387, 4271345, -1957431, -18496814, -8264054, 15930034, +-411780, -15292231, 8432631, -1018981, -10426570, -24718610, 1580548, -37370512, 21490942, -12845710, +19538344, 766115, 5362267, 454730, -7426536, 9701794, 33135672, 2861522, 9363566, -6009196, +-26030186, 2101850, -2907156, 18767934, 10931229, -4662724, -1020592, -4126390, -2150705, 6247030, +-7516730, 5851356, -969589, -6723772, -6659347, 6796786, -8132521, -8126615, -11236171, -2461553, +-8100845, 2309619, 6931004, 265214, -2107755, -5412733, 10164040, -9818295, 2452963, 1031866, +793495, -5851893, 4010426, 9864466, -508954, -5223217, -1284195, 8980777, 9487583, -7861938, +9084393, -874026, -2437394, 1244467, -634581, 9906879, 2581812, -5603322, -4772246, -263604, +1086627, 5719823, 12628278, 9450539, 24738474, -33488934, 13514651, -19526532, 17049410, -8167417, +-13940927, -3854196, -16088947, -6653978, -3424163, 6091338, 7726646, -4560719, 23771570, -913217, +-3842385, -2971044, -21124260, -2173790, 302795, -17770428, 5973226, -15130633, -19087908, -6070400, +11839077, -31793496, -21484500, -14334990, 1861332, -22248468, -18820010, -15261629, -7531225, -6099391, +-2726231, -14996415, 16407849, 2920578, -1360431, -11163157, -11408507, 22031572, -18835580, -12898861, +5969468, 5963562, 8085276, -10944650, -15175193, -6381785, -2640331, 7282117, -10836739, -4326106, +-4306242, -13093745, -22290880, -28348394, 27139362, -29381872, -1418950, 2191507, -4924717, -5352603, +-26144540, 10308458, -6101538, -27562952, -410706, -5982353, 26253524, 6534793, 18748606, 17714592, +-5028870, 6985765, -2674691, -4952098, 13257490, -3215857, 7714298, -9916543, 1005559, -9991705, +8815957, 6784438, 1452773, 6211597, -2400350, -896038, 6745783, 3172370, -6140193, 4767414, +10856604, -1590749, 2683818, -5738613, -13371844, -1392643, -964220, -420370, -9211094, -2021319, +1744831, -1342714, -4800700, 6469832, -948651, -3627637, -10775536, -11129334, 398895, 6124624, +3839701, 2369211, -510564, 8024073, 9345312, -4093104, 2201708, 2198487, -368830, 2703682, +6856379, -29885994, 34816616, 5600638, 3618510, -5915781, 17742510, 314069, 29138668, -7818451, +20032802, 10817949, -28481002, 12488154, 4828617, 13666049, -2202245, -7544110, -11256572, -4121558, +14117558, 30826054, 3398393, -4428648, -19311784, 7409356, -20896090, -3270618, 21396454, -19135690, +188979, 1402307, -3151432, -7194607, -7998303, 34133180, -7194070, -8330089, -3958886, 7770133, +11611981, 4321274, 746787, -6914898, 85362, 5129802, 20899848, -4730370, 29822642, 17338246, +9028021, -7106561, 26029650, 29361470, -2206540, -7764764, -1322313, -9533217, 3142306, -9443022, +15030775, 5047124, 21560736, 16481400, -25882010, -29431264, 35539780, 26225070, 4414690, -4998268, +-13747117, -19392314, -7319161, 19866372, -18437758, -20247012, -2579128, -5471789, -32095216, -7221988, +7472170, -12552042, 2025614, -91805, 2013803, 2622615, 5688148, -9554692, -5572720, -9820443, +-3235721, -52076, 1776506, -5363341, -2217277, -955630, -15639587, -5327907, -7265474, -3526705, +-77309, 1404991, 1017370, 2667712, -667331, 584116, -8039105, 4829691, -6863358, -8366060, +6331856, 2549063, -14595373, -1634235, -4292283, 7391102, 14685030, 304406, -11764989, 9769977, +-2360622, 2552821, 3848291, -3956202, -2414845, 891743, -6063420, -8587250, 15626165, -12324409, +-3815005, -2384781, 3300146, 748935, -18656802, -54557896, 27734752, -26096222, 11011759, 39393440, +6242198, -16124918, 11559368, 13908178, -5424544, -12130061, -2307471, -26734024, 9186398, -27795954, +-16779900, 11547020, 1431835, 5137318, -25096568, -4886062, -18041010, -15268609, -22323630, -7606924, +8008504, -13176423, -13388487, 13555454, 2103997, -833224, 4491462, -25706454, -1330366, -19929186, +17575006, 5056787, -49199924, 12743168, 26780194, -5381594, 16083579, 13594108, 9250286, 7487739, +25587804, 20138028, 998043, -17832704, -3565897, 20352776, 13286481, -16505559, 1474248, -19327890, +-6057515, 1614908, 14495515, 19346144, -34727496, -27378270, -15224585, 3240016, -10139344, -3552475, +32817308, 5652177, 7970386, 25651156, -10027138, 5530844, -6206765, 26242788, -12945031, 1363115, +2848100, 19522774, -5092758, -1733556, 7295539, 8196408, -740345, 4161823, 12813498, 813896, +-133144, -199179, 12483322, -5876589, -3698504, 3259880, 5549098, 3911105, 1872069, 6086506, +-2421288, 347892, -5336497, 167504, -3905199, -290447, -5475010, 9701794, -6813966, -10058277, +10057203, 6765647, 7002944, -6997576, -9182103, 332323, -16670916, -4301947, -8472360, -8524436, +3689914, 245350, -8783745, 3380676, 3919695, -651224, -5100811, -4808753, 4168803, 2797098, +8304320, 18163954, 17556752, -30617212, 6405944, -6596533, -8051990, -7117298, 20540144, 10905996, +-14979772, -8551280, 15676094, -28164784, 1601486, 10241886, 15707232, -3349001, 3481071, -32869384, +-117038, -14564771, 11000485, 4034585, 18248780, -28910498, -14570677, -4212826, 3576634, -2496987, +5657546, 2057289, 15779710, 29704530, -18799072, -24315958, 6419366, -25340308, -7450158, 10593000, +-18393198, -17901424, 1512902, 11005317, 15488726, 10960220, -6889128, -1571958, -32225676, -21760988, +28654412, -19888382, 38671884, -16406775, 7893613, 5639829, -278636, -28423556, 35612796, -16595217, +-3345780, -6419903, 13921063, 26782342, -27086212, -15440407, 31850940, -23576150, -23622, -8913131, +6525129, 36813776, 228707, -2732136, -22771380, 28154584, -9161702, 7305203, 9337796, -17842368, +-21467858, 2079301, 12416214, -6455336, 6374269, -51006496, -23756538, -7321309, -25978110, -12841415, +4366371, 16872780, -3537979, -4663261, -13271449, 327491, -1245541, -9741523, -3329674, 5941551, +521839, 7970386, 3773129, 7552163, -10001905, -1453846, -2079838, 10515154, 8364986, -6347425, +19362786, 7106561, -7768522, 11704323, 3235184, -1185411, -6108517, 4413616, -4414690, -4185446, +8661875, 709207, -3787088, -3431679, 7262253, -2036888, 6567005, -1520955, 11932493, 2452426, +1748052, -4836670, -3517578, -4327717, -1576253, 1433982, 17452600, -20203526, 5455682, 16485158, +16296180, 37155224, -23849954, 34119220, -6178311, -22578644, -22099754, 5499706, 14170171, -10062035, +-4722854, -15586973, -6498823, 28887414, -20621748, -2041183, 23199266, -7684234, 13790603, -9457518, +-4584341, 24610700, -1014149, 1123671, 23742580, 16413754, 5707475, -3080565, 20030654, 27392764, +-28198070, 25734908, -24925306, 12973486, -18033494, 3601867, 21188684, 7155953, -48588964, 21366926, +13608604, -299037, 24413668, -38595112, -7575249, 26013544, 22111566, 3584687, 34833796, -18746996, +257161, -4611185, -5555540, 14869177, 6051072, 26074746, 21690658, -16518444, 14339822, -30549566, +-9576166, 2297271, -1703491, -2497524, -5101885, -47737488, -26424786, -36901284, -25121800, 27202176, +-17162152, -4257387, 2961917, 44624172, -10871636, -15902116, 35765268, 21865142, -1213328, 28949690, +4243428, 5373541, -13771813, -79994, -11549167, -12156368, -6369437, 9295920, -11674795, -6146098, +5390184, 2010582, 8824547, -3739306, -1698660, 11495480, 6585796, 563178, -9392557, -7561290, +-1331440, -2989297, 6736120, 11470247, -1051193, 1937567, 2496450, -4823785, 28707024, 8805757, +1865626, 1041530, -9637370, 7565585, -17074642, -1371705, 14360760, -1132798, -4040491, 10435160, +5850819, 3118683, -444529, -9532143, 6075768, 6723235, 2069637, 3628174, 4841502, -3396246, +3700114, -11531450, 11919071, 29963840, -15919296, 11816529, 14984067, -20887500, 3122441, -25780004, +10350334, -2380486, -13580150, 21173116, 988916, 32794760, -1610076, -23800024, 41344964, -6933688, +4458176, 6090801, -38088844, 12016782, 33464774, 12248173, -14030584, -24732570, 2979634, 6593849, +28663002, 18713710, -8875013, -5044439, -21703006, 678605, 32378684, -43060804, 13560822, 30913564, +-27035208, 10532870, 3188476, 11041287, 32381370, 11194832, 12706661, -5432060, -31120796, 33081448, +-5710159, -16139413, 68638408, 34127812, 17760226, 3517041, 1882269, -31608274, -26024818, -11413339, +20409684, -133144, -18320720, -12610561, 25656524, -14909442, 17772574, 10469520, -12184285, 19214610, +8859444, -26473642, -13192529, -15282031, 4777614, 17535814, -33524904, 11735461, -34359740, -43203076, +-27235998, 42651708, -14214194, 9320616, -9511742, -13956496, -1782948, -16749836, -11739756, -8606578, +2457795, -16011101, 2276333, 10445897, 299037, -13996762, -10591926, 5827734, 1972464, 19368156, +2815888, -20768852, -8034273, -11589969, 17952426, -2857764, -6822556, -16258599, 95563, 10959146, +4972499, 12394202, -5577552, -1136556, 3757023, 12634183, 7866770, 471910, -6400038, 9636833, +-7906498, -28454, 5109401, -6819335, 122407, 14112726, -100395, 3340948, -14238890, -9352291, +-10752451, 7515656, -11457899, -2715493, 41467372, 69389488, -12017318, -2712809, -57597660, -19587736, +-42449308, -28430536, 38613368, 2381023, 10222022, -32771138, 10129680, -28819768, -64383708, 8956081, +30392262, -2911451, 3619047, 32741072, -44250512, 49737868, 24620364, 15277736, -25183004, 33328410, +64608120, -13269301, 19735912, 48978732, 41313292, 73156712, 15637439, 26048976, 19671488, 17562658, +62809600, -16751446, -7814693, 22951768, 13517336, -7168838, 34421480, 1791538, 7023882, -20893942, +-56661892, 1904818, 37350648, 5452998, 22529788, -40961104, 2285996, -54369456, -129386, -58402428, +3783866, 40553080, -5382131, -17566416, -55649892, 72410464, 13012140, 4665945, 75044888, -1100585, +-17357036, -12881144, 3731790, 14875619, -4297115, 107911, -6097243, -39922256, 23456428, 9022653, +-25039122, -15403900, 19594714, -24139864, -41683196, -20394652, 8964670, 39687108, -41710576, 33041184, +-1723893, 17608292, -7363185, 14375792, -10065256, -1491427, 3520263, 4035122, 13267154, 12101070, +2431488, 25438554, -1391569, 10475962, 13331042, 7859254, 5808407, 6136972, 21915608, 16437377, +7869991, -8475044, -3629247, 19198504, -25393994, 9952513, -15151034, 3838627, -5637145, 17431662, +19866372, 40568112, 22573812, 38325604, 21862458, 8337606, 40043592, 41837276, 39577048, 23044110, +-6623377, 24152212, 26394184, 16724066, 31776316, 24426016, 288837, 7927436, 5723044, 6016176, +9651865, 7635915, -7613904, -7096897, 938987, 7793218, -1304596, 72478, -1750199, -3510062, +-7530152, -6583648, -2582886, -1536525, -2612414, 256624, -4154307, -1818919, -23005992, -73950208, +2588255, 97692792, 13424457, -21066278, -19979114, -45880988, -30280594, 397284, 60686816, 9905805, +-42030012, -3903589, 15891379, 3099356, 351650, -4996658, 9839770, -30334818, -11893301, 14081050, +33267742, 33486786, -33342368, -13422847, 1636383, 3661460, 7836705, -38296612, 2776696, 5170067, +-10661719, 25949656, -1094680, 30086246, 45892800, 21424908, 8879308, 19410030, -27286464, 23159000, +-22178138, 35101692, 62894428, 20028506, -35133368, -30596274, 28119150, 9601936, 53538916, 39857832, +11763915, -11104638, -12853763, 746787, 2155537, -19804094, 20439212, 17547088, 2872796, 48103096, +32937568, -5424544, 23317914, 25750476, 11841225, 25752088, 550830, -47531868, -6350646, -12145094, +-11349988, 52108692, 23870354, 7689602, 41628972, 24056112, 26349624, 32082332, 10881837, -34615288, +-17233556, -1728188, -1101122, -12824772, -10372883, -21378736, 12236899, 7262253, 19349902, -10245644, +21658984, 5252745, 22457848, 14362908, -5485210, -12653511, 3036542, 5205501, -163209, 1646583, +16401406, 635655, 25883084, 34127272, 9740986, -3965866, 2274722, 24222004, 5530844, -9031242, +-6971269, 18902152, -1284195, -7267622, -4096325, 5506685, 13954349, 27139898, -15050102, 1161252, +-9795210, 1204202, 1003412, 21900038, -12458626, 10216653, 13895293, 7144141, -10516227, 2028835, +16244103, 831613, 503585, 14470819, 2211371, 8209830, 6039798, 282931, -2898566, 1518808, +-2018635, 2243584, 1360431, 2449205, 1202054, 6250251, 2486249, 1668595, 2013803, 4089346, +1886564, 4476967, 1817845, 2188286, 2381559, 1879585, 2505577, 1246614, 2321430, 3185255, +3619584, 3489661, 3929895, 3124052, 4154307, 3079492, 3386045, 1430224, 3447785, 1434519, +3176665, 1060857, 3202972, 2174327, 2936147, 703301, 2934000, 1887101, 3121904, 2040646, +3516505, 1085553, 3760781, 1134945, 3362423, 1868848, 3333968, 1303523, 3750580, 1237488, +3053722, 1740536, 3280281, 1610076, 3871376, -38655, -14081587, -68940128, -14582488, 39197484, +21342766, 85219664, 5021891, -11812771, -37606732, -73895984, -81333792, -13109314, 35575752, 40088152, +25715580, -40754944, -54193896, 135828, -6355478, 22294638, 57204132, 29500520, -5035849, -33568392, +-45985676, -28538448, 2183991, -27938762, 11383811, -23284092, -11507291, 38487740, 31632972, 28477780, +11165304, -38400228, -10616622, -36703716, -28427314, -14418205, 22240414, -3572876, 23598698, 58106076, +60240676, -24459838, 7126425, -43731892, -30084636, -20582020, -3637837, 8844411, 35003984, 37702832, +51382840, 36966248, 13254269, -24768540, -23172960, -5017596, 16626892, -41225244, 3211025, 49463528, +39138428, -9630927, 52977884, 47743932, 26752814, 49873696, -93256624, 22799834, -26418880, -28207734, +16152835, -14857902, -1223529, 94795832, 79817136, 28852516, -24511378, -1591285, -37365680, -6765111, +-50287624, -17289390, -8380018, 20045150, 61794916, 32938104, 13019656, 11607149, -9867687, -30354682, +-39806292, 730144, -26260504, 21706764, -2233920, 478352, 23727010, 19984482, 7357816, 20679730, +7136625, 31955094, -21799644, 208306, -24043764, 10672994, -20910048, -18547280, 3401077, -5131949, +16693464, 30273076, 1851131, -26746372, -46154256, -13225278, -26739930, 3776887, 12043625, 22594212, +-17824114, -5616207, 836982, -303332, 23430658, 1884417, -120120568, -136177312, -146416512, -147928336, +-200539008, -12016782, -71917080, -23322210, 26450020, 66853312, 93842352, 96807488, 197941088, 212262112, +172776864, 128502736, 136121472, 129802504, 49961744, -19432580, -89388472, -89544696, -137370768, -44703092, +-74490304, -55554328, -5288179, -116609432, -33606508, -104162624, -28414430, -119672288, -112831472, -52136608, +-93168576, -9587978, -47098076, -43528956, -69690136, -46149424, -105185896, -74370040, -39560944, -36257576, +-55682104, -34133180, -4170413, -45059040, 15071577, 67177584, -52459804, 79484272, 47600584, 106120592, +106574248, 93070328, 114757768, 96970160, 160101888, 159068944, 126811056, 169737648, 145504368, 222319312, +218885488, 258002976, 200749456, 216142624, 235490368, 212766768, 254358704, 188517920, 275440544, 220178816, +83845280, 107652280, 28298466, 42632384, -149148112, -125123136, -139748576, -148664928, -156815696, -202507712, +-190747008, -209578304, -230199504, -270528192, -226192848, -207038368, -230220992, -250978032, -299321632, -240025856, +-265865984, -267515792, -203067664, -228821360, -132118024, -163864816, -112246288, -104118064, -55229520, -40295384, +-57180512, -9807558, 26863946, 130009200, 123085176, 89468464, 101032664, 108820512, 147383952, 151100176, +163283376, 172350064, 148109264, 150632016, 110566952, 156735168, 160133568, 122129008, 85784992, 66388920, +96192768, 95333240, 74068856, 44545792, 24536612, 37553048, -9813463, 5218386, -17602386, -13796509, +-71155264, -64961380, -47498044, -32694902, -43337292, -33020782, -15898895, -12899397, -17221746, -31849866, +-29491392, -14448807, -18996640, -12357158, -10623065, 2296734, 4966056, 1094143, -5065914, -1152125, +2566243, -1563368, -1621350, 1913408, 3468723, 7017977, 1906966, -1779727, -331786, 2392834, +1999844, -1588064, -683437, 3801583, 2393908, 2012729, 2217814, 4051765, 3341485, 928787, +-318901, 2863133, 2729989, 3012383, -668404, -3170760, -1611150, 1130113, 3907883, 4661650, +2579665, 967441, -2382633, -3772055, -2808909, -2777770, -5510443, -9002251, -11369315, -11647951, +-12056510, -13174812, -14428943, -16759499, -18712098, -20225538, -20037096, -18172544, -16728898, -16773995, +-16254841, -15315853, -9931038, -6803765, -4958540, -1067299, 2647847, 5661841, 8704288, 11909407, +13696651, 15919833, 15829102, 15282567, 15201500, 13640816, 11307038, 8756365, 7007239, 5683316, +4191888, 2874407, 1736777, 1038308, 485868, 367757, 228707, 165893, 110059, 60666, +56908, 104690, 176094, 213675, }, }, { { -2786897, -5300527, -159988, 2206003, 885837, -4539781, -3401077, 1249299, -3059091, -4565014, 2684892, --495532, 739271, -2598455, 1998770, 239444, -4037806, -134755, 4772246, 3886409, -2884608, --5123896, -4663798, 744640, -1035087, -874026, -3961571, 4417374, -1109712, 1280974, -1778653, --1060857, -348966, 1706176, -1136019, -2248952, -8756901, 3045669, -617402, 2896419, 1741072, -1246077, -177167, 5922223, 1154273, 1222992, 870268, -2955474, -1870995, -229781, 482110, --2959233, -661425, 1219771, -362925, -2793876, -1445793, 153008, 2830384, -4304094, -5851893, --7267622, 2640868, 4239133, 475131, 3514357, 2594160, 534723, -6655052, -127238, -1704028, --2305861, 167504, 421444, 2829847, -551903, 4005594, 2846490, -1199907, -3969624, -1902671, --671089, 1076963, 353261, 1347546, 1550483, 2812667, -12885, -213138, -1254667, -1075352, --1031329, -428423, -2195802, -1007170, -1222455, 748398, -103616, -230854, -644245, 1101659, --1533303, 3186866, 4162360, -942745, -40265, -5920613, 5307506, -6783901, 2641405, 11454678, --2435783, -4251481, 666257, 5979132, 651761, -1692217, -810138, -1705639, -1064615, -5373541, --2076080, 2655364, -4251481, -2439005, 262530, -234613, 4741107, -2880313, 903554, -1114544, -1054415, -599685, -2733210, 5226439, 8913668, 2251100, -481036, -1667521, 9646497, 446677, --3996467, 267362, -7146826, 24159, 3773129, -5509370, -670015, 1178432, -4367445, -1326608, -5098126, 717796, -511638, 4885526, -3219078, -5145908, 2944737, 1925756, -3555159, -1784559, --3808026, -4510790, -4810364, -2687039, -2733747, 3924526, 2834142, 763967, -70867, -2733210, -2568391, -597537, -1818919, 3322694, 3722663, -2633352, -480499, -1249836, -1629940, 507880, -4261682, -2137820, 991601, 4008815, 2705830, -932008, 1068910, -713501, -60130, 1692217, --190052, 15032, 1787780, -1867774, 806380, 368830, -539018, -1723356, 1365263, 135828, --706522, 387621, 246424, -628676, 255014, -330712, -508417, -1016834, 5873368, -8497593, --5601711, -2003065, -1214402, 314606, 1121523, -8101382, 5669357, -2540473, 1869385, 1190243, -1903207, 3577171, -1074, -1149441, -2680597, 5878200, -438624, 3830574, 7249368, -1540820, -6167036, 5268315, -4520453, 3064459, 3095598, 3324305, -7994545, -769336, 501437, -2492155, --5020280, 106300, 5905043, -1353452, -2498597, -1950989, 1820529, 5483600, 2714956, -2758443, --26307, -2269890, 251792, -702764, -2699387, 5123896, -6565395, -5411122, -4978941, 1574642, --683974, -149787, -6125160, -6456947, 1598265, -106837, 384936, -609885, -327491, -4811974, --2849174, -5264020, 1054415, 4568235, -1398012, 4057134, 769873, 3610994, -7716983, 64425, -1132261, -2547989, -1152125, 1064615, -2740726, -307090, 2039573, 2220498, -1701881, -5140002, -4566624, 746787, 124554, -1109712, -648540, -4108136, 194884, 319438, -717260, 781684, -144955, -1427003, 635118, 705448, -407485, -560493, -196495, -211527, -270583, 264141, -2188823, 72478, -646393, 1840930, 812823, -105227, -594316, -141734, -296353, -3000035, -641561, -665720, 4940286, 7902740, 428423, -3115999, -6866042, 3025268, 1939178, 1802813, -8379481, -5609764, 119185, 948114, -1608465, -2847563, 1175747, 450972, 5022965, 11164231, --1064078, 1864016, 4628901, -2122251, 4122095, 7226820, -5173288, -273267, -1972464, -188979, -3190087, -5777268, 6081674, 1288490, 2147, 3159485, -602369, 4407174, -2502355, -1118302, --1331440, 6970732, 3221762, 4408784, -917512, 3617973, -6912213, 7830799, -3128347, 3028489, --7271380, 2824478, 5170067, 9562208, 3479997, 1717450, -6408628, -2515240, 1693291, -4889284, --5775121, -1439888, 11339251, 13114683, 2474438, 3020973, -3821984, -1757179, 7325604, 1355062, -3177739, -531502, 2193655, 1893544, -1027571, 1603097, -1130650, 1187559, 839666, 4577899, -3745212, -5939403, 5169530, -1797444, 2636036, -1928977, 1926830, -1641214, -2220498, -126165, --3517578, 460635, 2501819, 493921, 1271310, -1319092, -1574642, -876173, 598611, 24159, -544387, -309238, 368293, -1066226, 333397, 290447, 1820529, 25770, 1231582, -677531, -1101659, -1386738, 128849, 131533, 1312649, 5473399, 60666, 602369, 7714298, -6667937, --7840463, 11981348, -3223910, -2019172, 7793755, 4638565, 484258, -13930726, 14859513, -2821794, --1991254, -1651415, -916976, 515933, 821949, 4600447, 6874632, 4522064, -1105954, 7755637, -4861903, 2443300, 2000918, -2951716, 3467649, -5697811, 4387309, -926639, 1773285, -4831302, --7034083, 824634, -986232, 2477659, 4066260, -2118493, -6740415, -3927211, 1519345, -8012262, -5029944, 1542967, -12799003, 5678484, 762357, 3226594, 707059, 1923072, 2037962, -565325, --3694209, -3151969, -8775155, -6404870, -3651796, -4463008, -1093606, 476741, -6456947, -9006546, --1457068, 5797669, 9931038, -545998, -6813429, 1080184, -10646150, 692564, -840740, -4167729, -8756365, 8322573, 2686502, -347892, -2271501, -656593, -4791036, 2171106, 8385924, 4531728, -6906845, 1400696, -3341485, 3253975, 1569274, -255014, 539555, 366683, 71404, 1504849, -1429687, 1493575, -615791, 2634426, 574989, 5216775, 1898376, 1388885, 100395, 437550, -1232119, -387621, 2303176, 893353, 797253, -1408212, 2895882, 753767, -1246077, -464393, -2230699, -13598940, 7016903, -2600603, -4843113, -3840238, -4634270, -6466610, 12447889, -15867757, -3733400, 3830037, 5181878, 7749195, 1264331, 2151779, 2909304, 2098629, 1604707, 2625299, -6811282, 1231045, -3767223, -7516, -671626, -4883915, -4431333, 2261837, 4556961, 4919885, -652298, 3508452, -8280160, -958851, -133681, -453119, -7848516, -4689031, -2837363, 5122286, -4575751, -77846, -8591008, 50466, -4662724, -3320010, -1706176, -2303176, 5362267, 7329362, -2201708, 7625178, -12218108, -8515310, 4032438, 2494839, 389231, 1618129, 771484, -3948149, --7697655, -5294084, 4038343, -3427921, 6189048, 6129992, -2261300, 5809480, -9262097, -4556424, --2629057, -3105798, 642098, 16821240, -2450816, 4764730, -2717641, -2423435, -1748589, 3578782, -3788161, -434329, 3049964, 2122251, -5283347, 1458141, 361851, 2263985, 448287, 289373, --2685965, 1708323, -153008, 1731409, 505196, 904091, -534723, -987843, 455267, -1515587, --2254858, 766652, -1257889, -1880122, -611496, 585726, 697932, 768262, 770410, -91805, -536871, 1209570, 937377, 353798, 233002, -373662, -695785, 1131187, 563714, -89121, -772020, 13896367, -2681670, 372588, 5847598, -13243532, 9090298, 4606353, -7467875, 8273718, -9257265, 3102577, -14297946, 8827232, 376347, -1355599, 7226820, 7807714, -451508, -2315524, -220654, -5553930, 5182415, -3040300, -5292474, -11125039, 2588792, -12091407, 3236795, -2969433, --1359357, 3476776, -9853729, -4053376, 8178692, -722628, -3829500, 5002027, 324807, -4305168, -3700114, 1336272, 356482, -1850594, 2820183, -6002217, -636192, -8761733, 8274792, 8272107, --10316511, 6881075, -7362111, -2784750, 7110319, 9945534, -730144, -4967130, 3001645, -634045, -1427540, -12175695, -9627706, 1912334, 1718524, -2639794, -2508798, 3147137, -383326, -4321274, -5135171, -4980015, 1734093, 3712999, -861141, 5828271, -5858873, 5893232, -49929, 9382356, --3230889, 2841658, 5291937, 591095, -3376918, -967978, -359167, 2745021, -930397, -4429185, -3714610, 799401, -1864016, 1636383, -1257889, -65498, -1750736, -508417, 1261110, -1490354, -941672, 2564632, -1347546, 616328, 165893, -863825, 1615982, 425739, 1373316, -2085744, -829466, -2135136, -2444373, 893890, -402116, 977105, 1009317, 295816, 2963528, 3869766, -1698123, -5041755, 9782862, -3321084, 4770635, -9836549, -678068, -2581275, -8928163, 332323, -6341519, 11255499, 14719390, -8351564, -214212, -10414759, -760209, -6625524, 5953899, -6201933, --12285754, 817118, -7867307, -718333, 10223633, -6029061, -6016176, 10970957, 358093, 1902134, --1125818, -6419366, 2754148, 2356327, 13215614, -9085466, 6491306, -7702487, 1944547, 2581812, --7601555, -4671851, 12690555, 3485366, -9407052, -2414309, -3430605, -7548405, -300648, 12441447, -6672232, 8663486, 1993939, 3475702, -11318849, -1620813, 14435385, 1161252, -8942659, 4813585, -4784594, -6556805, -5709086, -3150896, -14794015, -2265595, 4415764, 7336878, 13021804, -3241090, --7097434, -2039573, -4411469, 10576894, -3911105, -9199283, -6264747, -2704756, -1241782, -2837900, --5311801, 11512660, -6571837, -782221, 1077500, 568009, 3769371, 2357937, -3369939, -4529043, -3432216, 4119411, 4354023, -975494, 1978369, -1184874, -700617, 1956358, -410169, -1999844, -2059974, 974421, -42950, -1304060, -425739, -3343632, 330176, -817654, -2872260, -1459215, -1330903, 1159641, 70867, 1358820, 6372658, -21907018, -15086073, -9651328, 1205275, -18346490, -2796561, 13724568, 4571456, 14130442, -7509214, -3433826, -1483374, -7267085, -2693481, -10934450, -19572166, 11200738, 7829726, -16444893, -3144453, -5257040, -10689637, 3765613, -1085553, 3535295, --13288629, -862752, -1151051, -9520332, 5612986, 1640678, 9827422, 3991635, -8140037, 12947716, --6053220, 5288716, 2757369, -51540, 10243497, 9539122, 2433636, -12243341, 15047955, -7537668, -10801306, 4964982, -5527086, -6132677, 12106439, 1831804, -1365263, 3202435, -10151692, -3591130, -5917928, -790274, 10710038, -6105296, -9606768, 4018479, 2769717, 392453, 10650982, 4638565, -2197413, -6703907, 7762080, 3095598, -5879274, -746787, -595390, -3334505, -2435783, -2800319, -4684199, 11725261, 19680078, 9199283, -3273839, 1068910, -4469451, 4592394, 6082748, -21475, --4978941, -2876018, -6511171, 4116726, -3539590, 1037235, -3055332, -769336, 4398047, -438087, -512175, -3906273, 4301947, -2167885, -1872606, 2423972, -3879966, 4379793, -2963528, 2385318, --2083059, -313533, 1002338, -2836826, -2040646, -1192927, -4728222, -4697621, -2062121, -158377, --1649268, 3887482, 3541201, 2142652, -14136885, 18362058, 7453916, 21036750, -9826885, -11717208, -20034948, 415538, -2364916, 4180614, 1290101, 11616276, 15571404, 1796370, -14976551, -23830626, -3044058, -6772627, 1177358, 398358, -10458782, -920734, 12575664, 10226854, 7994545, 16258062, --3990025, 13734769, -10093173, 12132746, 3825742, 9340480, -6695854, 16658568, 9491341, 12091944, --19870130, -362388, 17595408, 9893457, 2990908, -4501663, 26596584, 11064373, -10773389, -6755984, -6300717, -10508174, -1241246, -5183489, 1141388, 22275312, 23368380, 16879758, 6056441, -69256, -8648454, -8102993, -2218351, 9407052, -10260140, 23604066, 14646375, 11449846, 4383014, -1184337, --11505681, 13907104, 282394, 12097849, -5754720, 4539244, -8184060, -4824322, -432181, 5971615, --9583683, 21959094, 9352828, -2706366, -11112691, -21203180, 10084046, 1574106, -7029788, -901406, -2378338, -5152887, 2828773, 7824894, -1611687, -3038689, 42950, -1970316, -2292976, 1570347, --2735894, -2109903, -3670050, 3367254, 1863479, -5516349, 2757369, 3119757, 3073586, -365072, --1753957, -849330, -235686, 1491427, -642635, 1035624, -3306051, 4873178, -6629819, -150324, -2034741, 5495411, 558883, 23314694, -1057636, -11086384, -4847945, -8625905, -62814, -14014478, -3987877, -12032351, 7253663, 1889786, -3060164, -9400610, -11329050, -17272748, -17969070, -5103495, -16073378, -871342, -10062035, 4571993, -9586904, 7865159, -8158291, 15134391, -14978162, 3881040, --10558103, -10725070, -1796907, 2208687, -2996277, 7325604, -21679922, 9155260, 2328409, -4940823, --1302986, -1114007, -10631655, -17038136, -18424872, 13749264, 6825777, -6936372, 11795591, 722091, --4650913, -13354127, -28621126, -23363012, 13614509, -3788161, 477815, -2490544, -1185411, -1012539, --19346144, 7782481, -22888954, -11928735, 1211181, -355945, -4780836, -2728378, -2928631, 24146306, --7219840, -7377143, -6319508, 25251724, -4363150, -9611600, 15880105, -11987254, -7756174, -9809168, --8484171, -31694174, 6524056, 5524939, -10660109, -1171989, 7581691, -3796214, -2811056, -5588826, --5414343, -382252, -2806761, -2447595, 11252277, -529355, -1155346, 7886634, 8949638, -4003983, --3193308, -329102, -1542967, 2676838, -5413270, 1022202, 647466, 1422708, -3221226, -3578782, --1632088, 4064113, -1488206, -2550137, -415001, 2731062, -7024956, -688269, 3954591, 682363, --2819646, 4192962, -2470680, 3768297, -51003, 3625489, 3356517, 3919158, -6183143, -182536, -35433, -33804612, -25476136, -14501957, 29873108, -1335735, -4746476, -3454764, -2135673, -9613747, -10712722, 8281234, 26775900, -24355148, -4559645, 7701413, -17707076, -7028714, -6114960, 30738008, --214748, 7190849, 15812459, 1541893, 15232638, -16056735, -20095078, -13491029, -3491272, -3342558, -2686502, 9673877, -207232, -17027934, -11556146, -774168, -8875550, -19126564, 17436494, -2775623, --9306657, -33823, 5797132, 5533529, 3498251, -8609799, 2048163, -17804250, -7523709, -26444114, -12766253, 8071854, -2822867, -8267275, 10117332, -13158169, -3052111, 28647432, -2683281, 24279986, -11176579, 6534793, -6008659, -30413200, -12317429, -5831492, -16040629, -12236362, -7458211, 13640279, --5869610, 318901, -11868605, 25960930, -8911520, 10704132, 7640210, -17721036, -6745246, 3890704, -16800838, 29945586, 25324200, 10774462, -1302449, 10255308, 481036, 854699, -5466420, 2981781, --5658620, -4277251, 310848, 1705102, -3238942, -4934381, -8342437, -7064685, 4170950, 2801393, -3488050, -3320547, -904628, -17534204, 119185, -8143795, -3322694, 3051038, 2881923, 892816, -7677254, 55298, -544924, 587337, -2429341, -12793634, -712965, -7340099, 4096325, -6538551, --6450504, 648003, 8578660, 3508452, -1787780, -4908074, -3855807, -2268280, 4867272, 939524, --1416266, -3340411, 17053704, -1409286, -10591389, 10312216, 5663452, 36283884, 712428, -125628, -12427488, -17137994, -12017318, -3817689, 2472291, 5448166, -5021891, 15075335, -10123775, 1670742, -14091788, 6106907, 4870493, 4947803, -11382737, 1571421, -887985, -5762236, 1681480, -8315594, --14530948, -7750806, 540092, -14206141, 17221746, -1741609, 1216013, -2878702, 11675332, 13374528, --3172370, -10617696, -1500017, -3672197, 15722802, 20487530, -15425375, -10620917, -8078297, 4827007, -14963129, -14281303, 4077535, -999117, 2696166, -7606387, -10232760, 2652679, 9675488, 1530619, --13217762, 11089606, 33087892, -11257109, 5703717, -2896956, 2042257, 12635257, 3115462, 14963129, -12246562, -3723200, 19066970, 35333624, 884763, -13541495, 34376920, -1046361, 32843614, -11907797, --16914654, 15061913, 5377299, 22980760, -4355097, 32506996, 9809168, 7273527, -10401337, 15218143, -1246614, 1218697, 3088082, 12369506, 2105608, 14177150, 1198296, 3269544, -70867, 1852742, -1753957, 4309463, -2044941, 4873714, 11642046, 4798552, 5015448, 1418413, 2700461, -7107634, -5390721, 1997697, 2150168, 4093104, 1744294, -723702, -674310, 3139084, -4017942, 905701, --431107, 2773475, 8120710, 2867965, -886374, -4675609, 3990562, 540629, 499290, -1071058, -3871913, 2379412, -7354595, 6473053, -23526758, -7851737, 35677220, 5652177, -17086454, 4591857, --13051869, 4307316, 6490770, -3291556, -19525996, -7534447, -28981366, 11499238, 9343164, -11310260, -10166188, 16245177, 2947958, -4773856, -17137994, 3487514, 26195542, -13067438, 15524696, 14986215, -1927367, 11206643, 10164040, 213675, 12792023, 8590471, -25909928, -3867618, -10752451, 25696790, -16695075, -18360986, 10612327, -2330020, 13168370, 43045236, -4632659, -7554848, 3781182, 38730404, -15444166, -2616172, 4424353, 6844568, 21923660, 19640348, -14148159, 23626078, 10350871, 21893058, --16227460, 2186138, 3839701, 4520453, 13056701, 20095078, -13798656, -10654203, 15441481, 7863012, --6078990, -5894306, -576063, 24182276, -46522548, 10659035, -16960826, -12184285, 1557463, -15855409, --15269146, -2230162, -25761214, 17991082, -6012954, 19022948, -1377074, 16633335, -11747809, 6634114, --297427, 5447629, -1227824, -6540699, 4351339, 3493419, 3322157, 8098161, -4725001, 4071092, -4888210, -4750234, -317828, 7758859, 2134062, -4243965, 7938710, -5765994, 389768, 4515621, --6389301, -4240744, 979253, 1730872, 8904004, 8040179, 4944044, 2928094, -1755568, 6288369, -575526, 2787434, 1923072, 5239323, 5478768, -5214627, -5262946, -8449811, 5815386, 2706903, --348429, 2182380, -777926, -9096204, -8728447, 5849209, 7644505, 8098161, -10313827, -12261595, --31546534, 1356136, -17670032, 28520194, 3343632, -7484518, -4398047, 17100412, 4788352, 27810450, -11086921, -7276212, 996969, 5846524, 12520367, 20926154, -23614268, -20323248, -4430796, 35226248, --11033771, 4484483, 9875740, 15435039, 18551574, 26786638, 22956064, 2037962, -5705327, 25027312, -1753420, -15930034, 8288213, -14773077, 10488847, 2688650, -13383655, 12091407, 46852724, 26247082, --16825534, -12545599, -1921461, -13011067, -13150653, -11135240, 7865696, -6317360, -11228118, 2508261, -12725988, 7802882, 4067871, 18559628, 4731444, -4402342, 19296214, 16527571, -14348412, 9667435, --16170552, -12358768, -14368813, 58519, -34367256, -10000294, 23494544, 17631378, -8376797, 11880416, --3125126, 964220, -21234318, 4840428, 12315819, 20115480, 10963441, 13373991, 6979859, 6480032, --9231495, -7736847, -9804873, 5497022, -2353105, 908922, 3745748, 4347581, -744103, 10506564, --3567507, -4383551, -5258114, 7431367, -9820443, -3673271, -12042015, -452045, 1962800, -4872104, -109522, -2609193, 6954089, -1211181, -15794742, 434329, -1425392, 4808216, 5668283, 2170569, -6486475, -213138, 10777684, 2512019, -1270237, -61740, 826244, 717796, 171262, 4553202, --2916820, -13058848, 10343892, 8306467, -16524350, -7197292, -35637492, -3055869, 29253560, 132607, --21879638, 3266323, 753767, -14742475, 19407884, 11160473, -8170639, 5390721, 8647380, 11938398, -6479495, 1900523, -9007083, 4559108, 6724308, 18601504, 27819576, -7915088, -19197966, -10159208, -5075041, 5653788, 22836342, -9036611, -18405546, -14304925, -14788109, 27788438, 50987168, 18436684, -2270964, 56071872, 3077881, 23138600, 13001403, -4920959, -12108587, 9816148, -16286516, -10829760, -11085311, 585726, -34220688, -35291748, -9108552, 14487998, -18646064, -23154706, -12982076, -17187386, --14339285, 11690364, -10091563, -26225608, 11371463, 858457, -7943005, 5926518, -6222334, 12969727, -52432424, -32502702, 26252450, -36930812, -21211232, -12351252, -8687645, 20279224, 7887171, 9642738, --4348655, 11199127, 23308788, 5769215, 168577, 153008, -7263864, 3104725, 6099928, 18829136, --1541356, -9556302, -1809255, 14351096, 8910983, -4245575, 5085242, 6435472, -5654325, -325344, --2663954, 18053896, 6162741, 8486855, 5968394, 5067525, -7934415, -5448703, -1626182, 4534949, --9622337, 1214402, -9502078, -6371047, 1008244, 838056, -10865194, 10068477, 13453985, -1491427, --2260764, 8350490, -369367, -3763465, 11833709, -5181878, 8051453, 658741, 28432684, 18239116, -16426639, 24199456, -28543816, 10787347, -29891362, -1326071, 38728256, 34442952, 14589467, 406948, -6576132, 4264366, -11301670, 8883603, 11039677, -49111340, 2847563, 7078106, 14739254, -18072686, --27741194, 20112794, 9411884, 5029944, -11951820, 23881092, -3535832, 18540300, 15336254, -1962263, -2200097, -5531918, 18723910, -11319923, 5597953, 11259257, -1161789, 24036784, 13806709, -1455994, -12212740, 13972602, -901943, -10998874, -36922760, -6875169, 3746822, -21857626, 1925219, 17268990, --33573760, -14909442, 4941360, -14446123, -2507724, 17535278, 838056, -12554189, -16456167, 7160248, -6874632, -33843268, -11446088, -2884071, -49929, 21126408, 10197863, 2294586, 36852968, -4743255, --1396401, 1389422, -21328808, 19944754, -28454, 32778116, -12934294, -5560909, 9680319, 4896263, --28203440, 847719, -4071629, -11264625, -9256728, 3440269, 952409, -7962333, -912144, -4967667, --3673808, 962610, -12191802, 3400540, 1430761, -1728724, 4367445, 1207423, -8126078, 1561758, -2043868, 2052458, -7872675, 11128797, 1973538, 14495515, -10951093, 1308891, -9265318, -3235184, --1892470, -16145856, 3192771, 1451162, -907849, -2223719, -3144990, 5920613, -7494181, -5644661, -6769942, 9327595, -7330973, -9433896, -34801048, -30345018, 5407364, -15677168, -4999342, -23408108, --29140816, -30641908, -20190642, 21656836, 29590714, 682900, -24603184, 1830193, 1012002, 222265, -11166915, 18863496, 18835580, 370441, -12428025, -30560302, -17599702, -26761942, -5857262, 19864, -2114735, 2659122, 3615289, 7253663, 9385040, 17855790, -28314572, 12278238, 4784594, 6131066, -14973330, 26641682, 29868276, -17375828, 13229036, -23983634, -7612293, -21769578, -2263985, -8537858, -49743776, 17616882, 35791036, 1428077, -19437412, -8370355, 22862110, 24830280, -14800994, 45943804, --19443854, 2786360, 1860795, 7910256, 16742319, 51122460, -3751117, 12456479, 28344100, 6430103, --22765474, 14277008, 52220360, -9643275, -12854837, -30981210, -2753074, 19251118, 11750494, 1545115, --29849486, -22551262, 3591130, -23527830, 6877317, 965294, -29723322, -3419868, 2850785, -4714801, -21139292, 19965156, 250182, -5918465, -12920335, 13801877, -6081674, 24037858, -5696737, 248034, -16309601, 16509317, 23380192, 18155364, -13518410, -5280663, 2968359, -4467303, 1400696, -10208600, --9967545, -9942312, 4952098, -12161737, -14313515, 8307004, 10711648, 930397, -12329777, 7654169, -4080756, -3038689, -3300682, -8296803, -380641, 4654671, -2300492, -7421704, -9814537, -1879048, --6522982, 7833484, 4205847, 666257, -8991514, -3904662, -5105106, 10270877, 46714748, -2253784, --106837, 19912542, 3987877, -64086280, -20041392, 45782204, 15329275, -13230647, -25444460, -3435974, --16761647, 23685134, 12366821, 4576825, -13416404, -30251602, 6665789, -52223580, -6261526, 25777320, -35103840, -3877282, -29555818, -20063402, -61172684, 18158048, -10513006, 24172612, 18277770, -17260936, --12552579, -54239532, -40736692, 21438866, 58096948, 23313082, 27658516, -19145354, -34338800, -32903744, --13744969, 49437756, 66489852, 34781720, -77027552, -28115930, -59001040, -31444530, 73402064, 18033494, -16364899, -9564355, -70466992, -57622892, -57881664, -10613938, 5731097, 36719824, -13463649, 27974732, --55866788, 34969088, 14025753, 4415227, 70473432, 4692789, -6403796, -3192771, -95377264, -28996398, --6391985, 30246770, 15774341, 13923210, 42227044, -44870596, 2991445, -29632054, 32593434, 23658290, -2334852, 6670084, 7004555, -5141076, 19411642, 10541997, 5214091, 16641925, -11152419, -20802138, -5172215, 15239081, 22935126, 19027242, 12502113, -15573015, -25477746, -35610112, -3140158, 2742337, -29017872, 36072356, -5350456, -27150098, -46930032, -22374096, 3395172, 36087388, 57683020, 15197742, --56352120, -57702348, -59046136, -474057, 48216912, 42601244, 44790068, -14867566, -21791590, -41854992, --42407432, 15713138, 28675886, 37548216, 18976776, -29475824, -28012314, -15680926, -4445828, 34849364, -18371722, 5884642, -1602560, -21129628, -15385110, -3030636, -4180614, 9211094, 11464878, 5239323, -4615479, -27239756, 53290880, 23077934, 24608016, -65233036, 13487808, -91008208, -19867444, 90194, -13226352, 5600101, -58241904, 32060858, -15947214, -10200010, -10742787, -12110734, -14082661, -17761838, -38596724, -10621454, -32687386, 10864657, -9078487, 4382478, 18730890, -36845988, -13076565, -1938104, -15834471, 1959579, 42407972, -3224447, -23906324, 56048248, -46903728, 27908698, -43485472, -14085345, -21537114, -35128000, 2808372, 26113938, -13223131, -2684355, -2438468, 33524368, 50768660, 29641716, --16814260, -6615324, -7707856, 3598646, 16436840, -6307160, -9868761, 10233296, 5398237, -91276648, --3508988, -2989297, 13523778, 11799349, 773631, 556198, 26252450, -28447180, -7249368, -2400350, -20038706, -73185168, -10160819, 66932772, -16894254, -26414586, -93416, 50757924, -9122511, -11628624, -13852343, -19397682, -20609938, 31518618, 48287244, -17023640, -24343874, 8721468, 14564234, -7212324, --25679610, -127238, 3860639, -4828617, -3643206, -7650411, -11126113, 5702106, 470836, -9902047, --1761474, 24159, -280784, -9088688, 5572183, -12309913, -13413183, -7478075, -8167954, 12928388, --1743220, -2208687, -219580, -6699612, 10394358, -13081934, 3959960, 818728, 1026497, 9808632, --395137, -15795279, 1903207, -3847217, 3080565, 2665027, -14588930, 23462332, -6046240, -1725503, --2204929, 2570538, 5830418, -73551, -5392332, -2516314, -11572253, -21657910, -66476432, -54484880, -48830556, 41736880, 4399121, 44547936, -47473884, -2257005, -92125976, -32373316, -15919833, 45387604, -41322416, 25562572, -36812164, -12296491, -1170916, -17245904, 9258339, 16762720, 21530672, 28676960, --21004000, 16313896, -39622684, -24810416, -5898064, -7974681, 1509144, 27077084, -31198642, 27879706, --11789148, -17018808, -6559489, 3138547, -39291436, -304943, -35536024, -12849468, -13545253, -33601676, -47419660, 22169548, 11090679, 12080669, -8680129, -47343960, -70626976, -40920836, -41371808, 28955596, -7183333, 31165894, 43028056, 35733056, -11104638, 9038222, -24138254, -18235894, -22020834, 18198850, --23366770, -517544, -22287660, -22832046, -14368276, 28296318, -21906480, -5653251, 2620467, -2552284, --31772020, -33970508, -20613158, -11770895, -46262704, -27113054, 7408282, 28709708, 29656750, 38010460, --2097555, -29827474, -39128764, -29717952, 15811385, 5600638, -4571993, 18835042, 46377056, 12879533, -12597139, -11003169, -8440684, -14511621, -8960912, -4234301, -14388677, -2740726, 17751636, -3100430, --7465190, -13542569, -15513422, -17118666, -5046587, 9334038, -4535486, 4385162, 2367064, -31362388, -3672734, -14596983, 13604846, 26434450, -12789876, 18473192, -2093797, 5024575, 760209, -24661702, --3889630, -7570954, -6455336, 4281009, -369367, -2128693, -5326297, -10835666, -14931991, 22695144, --15149423, -100402912, -135906720, -128478576, -122177328, -146450336, -24801288, -40819908, 25547540, 40857488, -130397888, 83534968, 110505752, 152294704, 167635792, 114194056, 145602080, 82574504, 38400228, -6334003, --27712202, -37737732, -61915176, -60994440, -83861920, -35861904, -31026306, -79158928, -58980640, -56760140, --64197412, -104579232, -71108552, -55106040, -44048648, -80627808, -11391864, -24554328, -33509334, -78111496, --71816688, -59626496, -50673636, -37251324, -15095199, -49894100, 14090714, 24966644, -38748660, 42645804, -59950764, 57115548, 104666744, 84530328, 65482144, 71559520, 72537704, 71439264, 110112224, 123354680, -121789704, 82737712, 131375000, 129120672, 135171216, 136827456, 156103808, 137915696, 146334912, 193519408, -99061808, 99345280, 101407400, 93784904, -4450123, 42459508, 54347980, -31834298, -16733729, -54354960, --98310728, -89765888, -93943816, -170107008, -124235152, -76359688, -132355856, -140955456, -115643608, -124078384, --121998008, -147392544, -134264976, -136454864, -126863672, -119285200, -107925552, -100832944, -100014752, -84030496, --69956968, -111758808, -16709033, -50682760, -57084948, -13713831, -6819871, -56958244, -6801618, -22485228, --7712688, 19907710, 25228102, 64398204, 39109972, 53710176, 60916060, 64998424, 60213296, 82573432, -81871744, 85804320, 81385336, 96174520, 100190848, 96978216, 79714592, 101453568, 108108624, 82597592, -56949656, 53679040, 33806760, 27865210, 8673150, -4153234, -2279017, -18347564, -14887967, -12766790, --5909875, -16281684, -15689516, -16205985, -5979668, -16128139, -18576270, -12018392, -2333778, -13930190, --17022030, -15061377, -10547366, -20949776, -23746338, -25207164, -16034724, -15262166, -17452062, -15959025, --1612760, -4128001, -9527311, -6589017, 717796, -3256122, -5669357, -5511517, 849867, -3455301, --6259378, -7389491, -2920041, -4607963, -1489817, -2822867, -3737159, -5906654, 1062468, 3002719, -2395518, -584116, 1726040, 691490, 2755222, 1588064, 4084514, 3581466, 4337380, -1472100, --1341640, -2199560, -1031329, -5332202, -5424544, -5737003, -5866926, -9413495, -6891812, -6757058, --4715337, -8159364, -7850127, -7976828, -4916664, -6114960, -6930467, -5021354, -624381, -1067299, --1709934, 722628, 4239670, 3132642, 3107409, 3051574, 5226975, 5849209, 6051609, 4989142, -6340983, 6592238, 6068252, 5852967, 6135361, 5804112, 4858682, 3695819, 3623342, 2841121, -2245194, 1187559, 1009854, 587337, 433255, 83752, 54761, -17180, -79457, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +5300527, -159988, 2206003, 885837, -4539781, -3401077, 1249299, -3059091, -4565014, 2684892, +-495532, 739271, -2598455, 1998770, 239444, -4037806, -134755, 4772246, 3886409, -2884608, +-5123896, -4663798, 744640, -1035087, -874026, -3961571, 4417374, -1109712, 1280974, -1778653, +-1060857, -348966, 1706176, -1136019, -2248952, -8756901, 3045669, -617402, 2896419, 1741072, +1246077, -177167, 5922223, 1154273, 1222992, 870268, -2955474, -1870995, -229781, 482110, +-2959233, -661425, 1219771, -362925, -2793876, -1445793, 153008, 2830384, -4304094, -5851893, +-7267622, 2640868, 4239133, 475131, 3514357, 2594160, 534723, -6655052, -127238, -1704028, +-2305861, 167504, 421444, 2829847, -551903, 4005594, 2846490, -1199907, -3969624, -1902671, +-671089, 1076963, 353261, 1347546, 1550483, 2812667, -12885, -213138, -1254667, -1075352, +-1031329, -428423, -2195802, -1007170, -1222455, 748398, -103616, -230854, -644245, 1101659, +-1533303, 3186866, 4162360, -942745, -40265, -5920613, 5307506, -6783901, 2641405, 11454678, +-2435783, -4251481, 666257, 5979132, 651761, -1692217, -810138, -1705639, -1064615, -5373541, +-2076080, 2655364, -4251481, -2439005, 262530, -234613, 4741107, -2880313, 903554, -1114544, +1054415, -599685, -2733210, 5226439, 8913668, 2251100, -481036, -1667521, 9646497, 446677, +-3996467, 267362, -7146826, 24159, 3773129, -5509370, -670015, 1178432, -4367445, -1326608, +5098126, 717796, -511638, 4885526, -3219078, -5145908, 2944737, 1925756, -3555159, -1784559, +-3808026, -4510790, -4810364, -2687039, -2733747, 3924526, 2834142, 763967, -70867, -2733210, +2568391, -597537, -1818919, 3322694, 3722663, -2633352, -480499, -1249836, -1629940, 507880, +4261682, -2137820, 991601, 4008815, 2705830, -932008, 1068910, -713501, -60130, 1692217, +-190052, 15032, 1787780, -1867774, 806380, 368830, -539018, -1723356, 1365263, 135828, +-706522, 387621, 246424, -628676, 255014, -330712, -508417, -1016834, 5873368, -8497593, +-5601711, -2003065, -1214402, 314606, 1121523, -8101382, 5669357, -2540473, 1869385, 1190243, +1903207, 3577171, -1074, -1149441, -2680597, 5878200, -438624, 3830574, 7249368, -1540820, +6167036, 5268315, -4520453, 3064459, 3095598, 3324305, -7994545, -769336, 501437, -2492155, +-5020280, 106300, 5905043, -1353452, -2498597, -1950989, 1820529, 5483600, 2714956, -2758443, +-26307, -2269890, 251792, -702764, -2699387, 5123896, -6565395, -5411122, -4978941, 1574642, +-683974, -149787, -6125160, -6456947, 1598265, -106837, 384936, -609885, -327491, -4811974, +-2849174, -5264020, 1054415, 4568235, -1398012, 4057134, 769873, 3610994, -7716983, 64425, +1132261, -2547989, -1152125, 1064615, -2740726, -307090, 2039573, 2220498, -1701881, -5140002, +4566624, 746787, 124554, -1109712, -648540, -4108136, 194884, 319438, -717260, 781684, +144955, -1427003, 635118, 705448, -407485, -560493, -196495, -211527, -270583, 264141, +2188823, 72478, -646393, 1840930, 812823, -105227, -594316, -141734, -296353, -3000035, +641561, -665720, 4940286, 7902740, 428423, -3115999, -6866042, 3025268, 1939178, 1802813, +8379481, -5609764, 119185, 948114, -1608465, -2847563, 1175747, 450972, 5022965, 11164231, +-1064078, 1864016, 4628901, -2122251, 4122095, 7226820, -5173288, -273267, -1972464, -188979, +3190087, -5777268, 6081674, 1288490, 2147, 3159485, -602369, 4407174, -2502355, -1118302, +-1331440, 6970732, 3221762, 4408784, -917512, 3617973, -6912213, 7830799, -3128347, 3028489, +-7271380, 2824478, 5170067, 9562208, 3479997, 1717450, -6408628, -2515240, 1693291, -4889284, +-5775121, -1439888, 11339251, 13114683, 2474438, 3020973, -3821984, -1757179, 7325604, 1355062, +3177739, -531502, 2193655, 1893544, -1027571, 1603097, -1130650, 1187559, 839666, 4577899, +3745212, -5939403, 5169530, -1797444, 2636036, -1928977, 1926830, -1641214, -2220498, -126165, +-3517578, 460635, 2501819, 493921, 1271310, -1319092, -1574642, -876173, 598611, 24159, +544387, -309238, 368293, -1066226, 333397, 290447, 1820529, 25770, 1231582, -677531, +1101659, -1386738, 128849, 131533, 1312649, 5473399, 60666, 602369, 7714298, -6667937, +-7840463, 11981348, -3223910, -2019172, 7793755, 4638565, 484258, -13930726, 14859513, -2821794, +-1991254, -1651415, -916976, 515933, 821949, 4600447, 6874632, 4522064, -1105954, 7755637, +4861903, 2443300, 2000918, -2951716, 3467649, -5697811, 4387309, -926639, 1773285, -4831302, +-7034083, 824634, -986232, 2477659, 4066260, -2118493, -6740415, -3927211, 1519345, -8012262, +5029944, 1542967, -12799003, 5678484, 762357, 3226594, 707059, 1923072, 2037962, -565325, +-3694209, -3151969, -8775155, -6404870, -3651796, -4463008, -1093606, 476741, -6456947, -9006546, +-1457068, 5797669, 9931038, -545998, -6813429, 1080184, -10646150, 692564, -840740, -4167729, +8756365, 8322573, 2686502, -347892, -2271501, -656593, -4791036, 2171106, 8385924, 4531728, +6906845, 1400696, -3341485, 3253975, 1569274, -255014, 539555, 366683, 71404, 1504849, +1429687, 1493575, -615791, 2634426, 574989, 5216775, 1898376, 1388885, 100395, 437550, +1232119, -387621, 2303176, 893353, 797253, -1408212, 2895882, 753767, -1246077, -464393, +2230699, -13598940, 7016903, -2600603, -4843113, -3840238, -4634270, -6466610, 12447889, -15867757, +3733400, 3830037, 5181878, 7749195, 1264331, 2151779, 2909304, 2098629, 1604707, 2625299, +6811282, 1231045, -3767223, -7516, -671626, -4883915, -4431333, 2261837, 4556961, 4919885, +652298, 3508452, -8280160, -958851, -133681, -453119, -7848516, -4689031, -2837363, 5122286, +4575751, -77846, -8591008, 50466, -4662724, -3320010, -1706176, -2303176, 5362267, 7329362, +2201708, 7625178, -12218108, -8515310, 4032438, 2494839, 389231, 1618129, 771484, -3948149, +-7697655, -5294084, 4038343, -3427921, 6189048, 6129992, -2261300, 5809480, -9262097, -4556424, +-2629057, -3105798, 642098, 16821240, -2450816, 4764730, -2717641, -2423435, -1748589, 3578782, +3788161, -434329, 3049964, 2122251, -5283347, 1458141, 361851, 2263985, 448287, 289373, +-2685965, 1708323, -153008, 1731409, 505196, 904091, -534723, -987843, 455267, -1515587, +-2254858, 766652, -1257889, -1880122, -611496, 585726, 697932, 768262, 770410, -91805, +536871, 1209570, 937377, 353798, 233002, -373662, -695785, 1131187, 563714, -89121, +772020, 13896367, -2681670, 372588, 5847598, -13243532, 9090298, 4606353, -7467875, 8273718, +9257265, 3102577, -14297946, 8827232, 376347, -1355599, 7226820, 7807714, -451508, -2315524, +220654, -5553930, 5182415, -3040300, -5292474, -11125039, 2588792, -12091407, 3236795, -2969433, +-1359357, 3476776, -9853729, -4053376, 8178692, -722628, -3829500, 5002027, 324807, -4305168, +3700114, 1336272, 356482, -1850594, 2820183, -6002217, -636192, -8761733, 8274792, 8272107, +-10316511, 6881075, -7362111, -2784750, 7110319, 9945534, -730144, -4967130, 3001645, -634045, +1427540, -12175695, -9627706, 1912334, 1718524, -2639794, -2508798, 3147137, -383326, -4321274, +5135171, -4980015, 1734093, 3712999, -861141, 5828271, -5858873, 5893232, -49929, 9382356, +-3230889, 2841658, 5291937, 591095, -3376918, -967978, -359167, 2745021, -930397, -4429185, +3714610, 799401, -1864016, 1636383, -1257889, -65498, -1750736, -508417, 1261110, -1490354, +941672, 2564632, -1347546, 616328, 165893, -863825, 1615982, 425739, 1373316, -2085744, +829466, -2135136, -2444373, 893890, -402116, 977105, 1009317, 295816, 2963528, 3869766, +1698123, -5041755, 9782862, -3321084, 4770635, -9836549, -678068, -2581275, -8928163, 332323, +6341519, 11255499, 14719390, -8351564, -214212, -10414759, -760209, -6625524, 5953899, -6201933, +-12285754, 817118, -7867307, -718333, 10223633, -6029061, -6016176, 10970957, 358093, 1902134, +-1125818, -6419366, 2754148, 2356327, 13215614, -9085466, 6491306, -7702487, 1944547, 2581812, +-7601555, -4671851, 12690555, 3485366, -9407052, -2414309, -3430605, -7548405, -300648, 12441447, +6672232, 8663486, 1993939, 3475702, -11318849, -1620813, 14435385, 1161252, -8942659, 4813585, +4784594, -6556805, -5709086, -3150896, -14794015, -2265595, 4415764, 7336878, 13021804, -3241090, +-7097434, -2039573, -4411469, 10576894, -3911105, -9199283, -6264747, -2704756, -1241782, -2837900, +-5311801, 11512660, -6571837, -782221, 1077500, 568009, 3769371, 2357937, -3369939, -4529043, +3432216, 4119411, 4354023, -975494, 1978369, -1184874, -700617, 1956358, -410169, -1999844, +2059974, 974421, -42950, -1304060, -425739, -3343632, 330176, -817654, -2872260, -1459215, +1330903, 1159641, 70867, 1358820, 6372658, -21907018, -15086073, -9651328, 1205275, -18346490, +2796561, 13724568, 4571456, 14130442, -7509214, -3433826, -1483374, -7267085, -2693481, -10934450, +19572166, 11200738, 7829726, -16444893, -3144453, -5257040, -10689637, 3765613, -1085553, 3535295, +-13288629, -862752, -1151051, -9520332, 5612986, 1640678, 9827422, 3991635, -8140037, 12947716, +-6053220, 5288716, 2757369, -51540, 10243497, 9539122, 2433636, -12243341, 15047955, -7537668, +10801306, 4964982, -5527086, -6132677, 12106439, 1831804, -1365263, 3202435, -10151692, -3591130, +5917928, -790274, 10710038, -6105296, -9606768, 4018479, 2769717, 392453, 10650982, 4638565, +2197413, -6703907, 7762080, 3095598, -5879274, -746787, -595390, -3334505, -2435783, -2800319, +4684199, 11725261, 19680078, 9199283, -3273839, 1068910, -4469451, 4592394, 6082748, -21475, +-4978941, -2876018, -6511171, 4116726, -3539590, 1037235, -3055332, -769336, 4398047, -438087, +512175, -3906273, 4301947, -2167885, -1872606, 2423972, -3879966, 4379793, -2963528, 2385318, +-2083059, -313533, 1002338, -2836826, -2040646, -1192927, -4728222, -4697621, -2062121, -158377, +-1649268, 3887482, 3541201, 2142652, -14136885, 18362058, 7453916, 21036750, -9826885, -11717208, +20034948, 415538, -2364916, 4180614, 1290101, 11616276, 15571404, 1796370, -14976551, -23830626, +3044058, -6772627, 1177358, 398358, -10458782, -920734, 12575664, 10226854, 7994545, 16258062, +-3990025, 13734769, -10093173, 12132746, 3825742, 9340480, -6695854, 16658568, 9491341, 12091944, +-19870130, -362388, 17595408, 9893457, 2990908, -4501663, 26596584, 11064373, -10773389, -6755984, +6300717, -10508174, -1241246, -5183489, 1141388, 22275312, 23368380, 16879758, 6056441, -69256, +8648454, -8102993, -2218351, 9407052, -10260140, 23604066, 14646375, 11449846, 4383014, -1184337, +-11505681, 13907104, 282394, 12097849, -5754720, 4539244, -8184060, -4824322, -432181, 5971615, +-9583683, 21959094, 9352828, -2706366, -11112691, -21203180, 10084046, 1574106, -7029788, -901406, +2378338, -5152887, 2828773, 7824894, -1611687, -3038689, 42950, -1970316, -2292976, 1570347, +-2735894, -2109903, -3670050, 3367254, 1863479, -5516349, 2757369, 3119757, 3073586, -365072, +-1753957, -849330, -235686, 1491427, -642635, 1035624, -3306051, 4873178, -6629819, -150324, +2034741, 5495411, 558883, 23314694, -1057636, -11086384, -4847945, -8625905, -62814, -14014478, +3987877, -12032351, 7253663, 1889786, -3060164, -9400610, -11329050, -17272748, -17969070, -5103495, +16073378, -871342, -10062035, 4571993, -9586904, 7865159, -8158291, 15134391, -14978162, 3881040, +-10558103, -10725070, -1796907, 2208687, -2996277, 7325604, -21679922, 9155260, 2328409, -4940823, +-1302986, -1114007, -10631655, -17038136, -18424872, 13749264, 6825777, -6936372, 11795591, 722091, +-4650913, -13354127, -28621126, -23363012, 13614509, -3788161, 477815, -2490544, -1185411, -1012539, +-19346144, 7782481, -22888954, -11928735, 1211181, -355945, -4780836, -2728378, -2928631, 24146306, +-7219840, -7377143, -6319508, 25251724, -4363150, -9611600, 15880105, -11987254, -7756174, -9809168, +-8484171, -31694174, 6524056, 5524939, -10660109, -1171989, 7581691, -3796214, -2811056, -5588826, +-5414343, -382252, -2806761, -2447595, 11252277, -529355, -1155346, 7886634, 8949638, -4003983, +-3193308, -329102, -1542967, 2676838, -5413270, 1022202, 647466, 1422708, -3221226, -3578782, +-1632088, 4064113, -1488206, -2550137, -415001, 2731062, -7024956, -688269, 3954591, 682363, +-2819646, 4192962, -2470680, 3768297, -51003, 3625489, 3356517, 3919158, -6183143, -182536, +35433, -33804612, -25476136, -14501957, 29873108, -1335735, -4746476, -3454764, -2135673, -9613747, +10712722, 8281234, 26775900, -24355148, -4559645, 7701413, -17707076, -7028714, -6114960, 30738008, +-214748, 7190849, 15812459, 1541893, 15232638, -16056735, -20095078, -13491029, -3491272, -3342558, +2686502, 9673877, -207232, -17027934, -11556146, -774168, -8875550, -19126564, 17436494, -2775623, +-9306657, -33823, 5797132, 5533529, 3498251, -8609799, 2048163, -17804250, -7523709, -26444114, +12766253, 8071854, -2822867, -8267275, 10117332, -13158169, -3052111, 28647432, -2683281, 24279986, +11176579, 6534793, -6008659, -30413200, -12317429, -5831492, -16040629, -12236362, -7458211, 13640279, +-5869610, 318901, -11868605, 25960930, -8911520, 10704132, 7640210, -17721036, -6745246, 3890704, +16800838, 29945586, 25324200, 10774462, -1302449, 10255308, 481036, 854699, -5466420, 2981781, +-5658620, -4277251, 310848, 1705102, -3238942, -4934381, -8342437, -7064685, 4170950, 2801393, +3488050, -3320547, -904628, -17534204, 119185, -8143795, -3322694, 3051038, 2881923, 892816, +7677254, 55298, -544924, 587337, -2429341, -12793634, -712965, -7340099, 4096325, -6538551, +-6450504, 648003, 8578660, 3508452, -1787780, -4908074, -3855807, -2268280, 4867272, 939524, +-1416266, -3340411, 17053704, -1409286, -10591389, 10312216, 5663452, 36283884, 712428, -125628, +12427488, -17137994, -12017318, -3817689, 2472291, 5448166, -5021891, 15075335, -10123775, 1670742, +14091788, 6106907, 4870493, 4947803, -11382737, 1571421, -887985, -5762236, 1681480, -8315594, +-14530948, -7750806, 540092, -14206141, 17221746, -1741609, 1216013, -2878702, 11675332, 13374528, +-3172370, -10617696, -1500017, -3672197, 15722802, 20487530, -15425375, -10620917, -8078297, 4827007, +14963129, -14281303, 4077535, -999117, 2696166, -7606387, -10232760, 2652679, 9675488, 1530619, +-13217762, 11089606, 33087892, -11257109, 5703717, -2896956, 2042257, 12635257, 3115462, 14963129, +12246562, -3723200, 19066970, 35333624, 884763, -13541495, 34376920, -1046361, 32843614, -11907797, +-16914654, 15061913, 5377299, 22980760, -4355097, 32506996, 9809168, 7273527, -10401337, 15218143, +1246614, 1218697, 3088082, 12369506, 2105608, 14177150, 1198296, 3269544, -70867, 1852742, +1753957, 4309463, -2044941, 4873714, 11642046, 4798552, 5015448, 1418413, 2700461, -7107634, +5390721, 1997697, 2150168, 4093104, 1744294, -723702, -674310, 3139084, -4017942, 905701, +-431107, 2773475, 8120710, 2867965, -886374, -4675609, 3990562, 540629, 499290, -1071058, +3871913, 2379412, -7354595, 6473053, -23526758, -7851737, 35677220, 5652177, -17086454, 4591857, +-13051869, 4307316, 6490770, -3291556, -19525996, -7534447, -28981366, 11499238, 9343164, -11310260, +10166188, 16245177, 2947958, -4773856, -17137994, 3487514, 26195542, -13067438, 15524696, 14986215, +1927367, 11206643, 10164040, 213675, 12792023, 8590471, -25909928, -3867618, -10752451, 25696790, +16695075, -18360986, 10612327, -2330020, 13168370, 43045236, -4632659, -7554848, 3781182, 38730404, +15444166, -2616172, 4424353, 6844568, 21923660, 19640348, -14148159, 23626078, 10350871, 21893058, +-16227460, 2186138, 3839701, 4520453, 13056701, 20095078, -13798656, -10654203, 15441481, 7863012, +-6078990, -5894306, -576063, 24182276, -46522548, 10659035, -16960826, -12184285, 1557463, -15855409, +-15269146, -2230162, -25761214, 17991082, -6012954, 19022948, -1377074, 16633335, -11747809, 6634114, +-297427, 5447629, -1227824, -6540699, 4351339, 3493419, 3322157, 8098161, -4725001, 4071092, +4888210, -4750234, -317828, 7758859, 2134062, -4243965, 7938710, -5765994, 389768, 4515621, +-6389301, -4240744, 979253, 1730872, 8904004, 8040179, 4944044, 2928094, -1755568, 6288369, +575526, 2787434, 1923072, 5239323, 5478768, -5214627, -5262946, -8449811, 5815386, 2706903, +-348429, 2182380, -777926, -9096204, -8728447, 5849209, 7644505, 8098161, -10313827, -12261595, +-31546534, 1356136, -17670032, 28520194, 3343632, -7484518, -4398047, 17100412, 4788352, 27810450, +11086921, -7276212, 996969, 5846524, 12520367, 20926154, -23614268, -20323248, -4430796, 35226248, +-11033771, 4484483, 9875740, 15435039, 18551574, 26786638, 22956064, 2037962, -5705327, 25027312, +1753420, -15930034, 8288213, -14773077, 10488847, 2688650, -13383655, 12091407, 46852724, 26247082, +-16825534, -12545599, -1921461, -13011067, -13150653, -11135240, 7865696, -6317360, -11228118, 2508261, +12725988, 7802882, 4067871, 18559628, 4731444, -4402342, 19296214, 16527571, -14348412, 9667435, +-16170552, -12358768, -14368813, 58519, -34367256, -10000294, 23494544, 17631378, -8376797, 11880416, +-3125126, 964220, -21234318, 4840428, 12315819, 20115480, 10963441, 13373991, 6979859, 6480032, +-9231495, -7736847, -9804873, 5497022, -2353105, 908922, 3745748, 4347581, -744103, 10506564, +-3567507, -4383551, -5258114, 7431367, -9820443, -3673271, -12042015, -452045, 1962800, -4872104, +109522, -2609193, 6954089, -1211181, -15794742, 434329, -1425392, 4808216, 5668283, 2170569, +6486475, -213138, 10777684, 2512019, -1270237, -61740, 826244, 717796, 171262, 4553202, +-2916820, -13058848, 10343892, 8306467, -16524350, -7197292, -35637492, -3055869, 29253560, 132607, +-21879638, 3266323, 753767, -14742475, 19407884, 11160473, -8170639, 5390721, 8647380, 11938398, +6479495, 1900523, -9007083, 4559108, 6724308, 18601504, 27819576, -7915088, -19197966, -10159208, +5075041, 5653788, 22836342, -9036611, -18405546, -14304925, -14788109, 27788438, 50987168, 18436684, +2270964, 56071872, 3077881, 23138600, 13001403, -4920959, -12108587, 9816148, -16286516, -10829760, +11085311, 585726, -34220688, -35291748, -9108552, 14487998, -18646064, -23154706, -12982076, -17187386, +-14339285, 11690364, -10091563, -26225608, 11371463, 858457, -7943005, 5926518, -6222334, 12969727, +52432424, -32502702, 26252450, -36930812, -21211232, -12351252, -8687645, 20279224, 7887171, 9642738, +-4348655, 11199127, 23308788, 5769215, 168577, 153008, -7263864, 3104725, 6099928, 18829136, +-1541356, -9556302, -1809255, 14351096, 8910983, -4245575, 5085242, 6435472, -5654325, -325344, +-2663954, 18053896, 6162741, 8486855, 5968394, 5067525, -7934415, -5448703, -1626182, 4534949, +-9622337, 1214402, -9502078, -6371047, 1008244, 838056, -10865194, 10068477, 13453985, -1491427, +-2260764, 8350490, -369367, -3763465, 11833709, -5181878, 8051453, 658741, 28432684, 18239116, +16426639, 24199456, -28543816, 10787347, -29891362, -1326071, 38728256, 34442952, 14589467, 406948, +6576132, 4264366, -11301670, 8883603, 11039677, -49111340, 2847563, 7078106, 14739254, -18072686, +-27741194, 20112794, 9411884, 5029944, -11951820, 23881092, -3535832, 18540300, 15336254, -1962263, +2200097, -5531918, 18723910, -11319923, 5597953, 11259257, -1161789, 24036784, 13806709, -1455994, +12212740, 13972602, -901943, -10998874, -36922760, -6875169, 3746822, -21857626, 1925219, 17268990, +-33573760, -14909442, 4941360, -14446123, -2507724, 17535278, 838056, -12554189, -16456167, 7160248, +6874632, -33843268, -11446088, -2884071, -49929, 21126408, 10197863, 2294586, 36852968, -4743255, +-1396401, 1389422, -21328808, 19944754, -28454, 32778116, -12934294, -5560909, 9680319, 4896263, +-28203440, 847719, -4071629, -11264625, -9256728, 3440269, 952409, -7962333, -912144, -4967667, +-3673808, 962610, -12191802, 3400540, 1430761, -1728724, 4367445, 1207423, -8126078, 1561758, +2043868, 2052458, -7872675, 11128797, 1973538, 14495515, -10951093, 1308891, -9265318, -3235184, +-1892470, -16145856, 3192771, 1451162, -907849, -2223719, -3144990, 5920613, -7494181, -5644661, +6769942, 9327595, -7330973, -9433896, -34801048, -30345018, 5407364, -15677168, -4999342, -23408108, +-29140816, -30641908, -20190642, 21656836, 29590714, 682900, -24603184, 1830193, 1012002, 222265, +11166915, 18863496, 18835580, 370441, -12428025, -30560302, -17599702, -26761942, -5857262, 19864, +2114735, 2659122, 3615289, 7253663, 9385040, 17855790, -28314572, 12278238, 4784594, 6131066, +14973330, 26641682, 29868276, -17375828, 13229036, -23983634, -7612293, -21769578, -2263985, -8537858, +49743776, 17616882, 35791036, 1428077, -19437412, -8370355, 22862110, 24830280, -14800994, 45943804, +-19443854, 2786360, 1860795, 7910256, 16742319, 51122460, -3751117, 12456479, 28344100, 6430103, +-22765474, 14277008, 52220360, -9643275, -12854837, -30981210, -2753074, 19251118, 11750494, 1545115, +-29849486, -22551262, 3591130, -23527830, 6877317, 965294, -29723322, -3419868, 2850785, -4714801, +21139292, 19965156, 250182, -5918465, -12920335, 13801877, -6081674, 24037858, -5696737, 248034, +16309601, 16509317, 23380192, 18155364, -13518410, -5280663, 2968359, -4467303, 1400696, -10208600, +-9967545, -9942312, 4952098, -12161737, -14313515, 8307004, 10711648, 930397, -12329777, 7654169, +4080756, -3038689, -3300682, -8296803, -380641, 4654671, -2300492, -7421704, -9814537, -1879048, +-6522982, 7833484, 4205847, 666257, -8991514, -3904662, -5105106, 10270877, 46714748, -2253784, +-106837, 19912542, 3987877, -64086280, -20041392, 45782204, 15329275, -13230647, -25444460, -3435974, +-16761647, 23685134, 12366821, 4576825, -13416404, -30251602, 6665789, -52223580, -6261526, 25777320, +35103840, -3877282, -29555818, -20063402, -61172684, 18158048, -10513006, 24172612, 18277770, -17260936, +-12552579, -54239532, -40736692, 21438866, 58096948, 23313082, 27658516, -19145354, -34338800, -32903744, +-13744969, 49437756, 66489852, 34781720, -77027552, -28115930, -59001040, -31444530, 73402064, 18033494, +16364899, -9564355, -70466992, -57622892, -57881664, -10613938, 5731097, 36719824, -13463649, 27974732, +-55866788, 34969088, 14025753, 4415227, 70473432, 4692789, -6403796, -3192771, -95377264, -28996398, +-6391985, 30246770, 15774341, 13923210, 42227044, -44870596, 2991445, -29632054, 32593434, 23658290, +2334852, 6670084, 7004555, -5141076, 19411642, 10541997, 5214091, 16641925, -11152419, -20802138, +5172215, 15239081, 22935126, 19027242, 12502113, -15573015, -25477746, -35610112, -3140158, 2742337, +29017872, 36072356, -5350456, -27150098, -46930032, -22374096, 3395172, 36087388, 57683020, 15197742, +-56352120, -57702348, -59046136, -474057, 48216912, 42601244, 44790068, -14867566, -21791590, -41854992, +-42407432, 15713138, 28675886, 37548216, 18976776, -29475824, -28012314, -15680926, -4445828, 34849364, +18371722, 5884642, -1602560, -21129628, -15385110, -3030636, -4180614, 9211094, 11464878, 5239323, +4615479, -27239756, 53290880, 23077934, 24608016, -65233036, 13487808, -91008208, -19867444, 90194, +13226352, 5600101, -58241904, 32060858, -15947214, -10200010, -10742787, -12110734, -14082661, -17761838, +38596724, -10621454, -32687386, 10864657, -9078487, 4382478, 18730890, -36845988, -13076565, -1938104, +15834471, 1959579, 42407972, -3224447, -23906324, 56048248, -46903728, 27908698, -43485472, -14085345, +21537114, -35128000, 2808372, 26113938, -13223131, -2684355, -2438468, 33524368, 50768660, 29641716, +-16814260, -6615324, -7707856, 3598646, 16436840, -6307160, -9868761, 10233296, 5398237, -91276648, +-3508988, -2989297, 13523778, 11799349, 773631, 556198, 26252450, -28447180, -7249368, -2400350, +20038706, -73185168, -10160819, 66932772, -16894254, -26414586, -93416, 50757924, -9122511, -11628624, +13852343, -19397682, -20609938, 31518618, 48287244, -17023640, -24343874, 8721468, 14564234, -7212324, +-25679610, -127238, 3860639, -4828617, -3643206, -7650411, -11126113, 5702106, 470836, -9902047, +-1761474, 24159, -280784, -9088688, 5572183, -12309913, -13413183, -7478075, -8167954, 12928388, +-1743220, -2208687, -219580, -6699612, 10394358, -13081934, 3959960, 818728, 1026497, 9808632, +-395137, -15795279, 1903207, -3847217, 3080565, 2665027, -14588930, 23462332, -6046240, -1725503, +-2204929, 2570538, 5830418, -73551, -5392332, -2516314, -11572253, -21657910, -66476432, -54484880, +48830556, 41736880, 4399121, 44547936, -47473884, -2257005, -92125976, -32373316, -15919833, 45387604, +41322416, 25562572, -36812164, -12296491, -1170916, -17245904, 9258339, 16762720, 21530672, 28676960, +-21004000, 16313896, -39622684, -24810416, -5898064, -7974681, 1509144, 27077084, -31198642, 27879706, +-11789148, -17018808, -6559489, 3138547, -39291436, -304943, -35536024, -12849468, -13545253, -33601676, +47419660, 22169548, 11090679, 12080669, -8680129, -47343960, -70626976, -40920836, -41371808, 28955596, +7183333, 31165894, 43028056, 35733056, -11104638, 9038222, -24138254, -18235894, -22020834, 18198850, +-23366770, -517544, -22287660, -22832046, -14368276, 28296318, -21906480, -5653251, 2620467, -2552284, +-31772020, -33970508, -20613158, -11770895, -46262704, -27113054, 7408282, 28709708, 29656750, 38010460, +-2097555, -29827474, -39128764, -29717952, 15811385, 5600638, -4571993, 18835042, 46377056, 12879533, +12597139, -11003169, -8440684, -14511621, -8960912, -4234301, -14388677, -2740726, 17751636, -3100430, +-7465190, -13542569, -15513422, -17118666, -5046587, 9334038, -4535486, 4385162, 2367064, -31362388, +3672734, -14596983, 13604846, 26434450, -12789876, 18473192, -2093797, 5024575, 760209, -24661702, +-3889630, -7570954, -6455336, 4281009, -369367, -2128693, -5326297, -10835666, -14931991, 22695144, +-15149423, -100402912, -135906720, -128478576, -122177328, -146450336, -24801288, -40819908, 25547540, 40857488, +130397888, 83534968, 110505752, 152294704, 167635792, 114194056, 145602080, 82574504, 38400228, -6334003, +-27712202, -37737732, -61915176, -60994440, -83861920, -35861904, -31026306, -79158928, -58980640, -56760140, +-64197412, -104579232, -71108552, -55106040, -44048648, -80627808, -11391864, -24554328, -33509334, -78111496, +-71816688, -59626496, -50673636, -37251324, -15095199, -49894100, 14090714, 24966644, -38748660, 42645804, +59950764, 57115548, 104666744, 84530328, 65482144, 71559520, 72537704, 71439264, 110112224, 123354680, +121789704, 82737712, 131375000, 129120672, 135171216, 136827456, 156103808, 137915696, 146334912, 193519408, +99061808, 99345280, 101407400, 93784904, -4450123, 42459508, 54347980, -31834298, -16733729, -54354960, +-98310728, -89765888, -93943816, -170107008, -124235152, -76359688, -132355856, -140955456, -115643608, -124078384, +-121998008, -147392544, -134264976, -136454864, -126863672, -119285200, -107925552, -100832944, -100014752, -84030496, +-69956968, -111758808, -16709033, -50682760, -57084948, -13713831, -6819871, -56958244, -6801618, -22485228, +-7712688, 19907710, 25228102, 64398204, 39109972, 53710176, 60916060, 64998424, 60213296, 82573432, +81871744, 85804320, 81385336, 96174520, 100190848, 96978216, 79714592, 101453568, 108108624, 82597592, +56949656, 53679040, 33806760, 27865210, 8673150, -4153234, -2279017, -18347564, -14887967, -12766790, +-5909875, -16281684, -15689516, -16205985, -5979668, -16128139, -18576270, -12018392, -2333778, -13930190, +-17022030, -15061377, -10547366, -20949776, -23746338, -25207164, -16034724, -15262166, -17452062, -15959025, +-1612760, -4128001, -9527311, -6589017, 717796, -3256122, -5669357, -5511517, 849867, -3455301, +-6259378, -7389491, -2920041, -4607963, -1489817, -2822867, -3737159, -5906654, 1062468, 3002719, +2395518, -584116, 1726040, 691490, 2755222, 1588064, 4084514, 3581466, 4337380, -1472100, +-1341640, -2199560, -1031329, -5332202, -5424544, -5737003, -5866926, -9413495, -6891812, -6757058, +-4715337, -8159364, -7850127, -7976828, -4916664, -6114960, -6930467, -5021354, -624381, -1067299, +-1709934, 722628, 4239670, 3132642, 3107409, 3051574, 5226975, 5849209, 6051609, 4989142, +6340983, 6592238, 6068252, 5852967, 6135361, 5804112, 4858682, 3695819, 3623342, 2841121, +2245194, 1187559, 1009854, 587337, 433255, 83752, 54761, -17180, -79457, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -6262063, -8022462, -569620, 3258807, 1661616, 3830037, -6724845, -3609920, 4388383, 2147484, 88584, --3718368, 812286, -10456635, -6720550, -320512, -3990025, -4514011, 1911797, 8252243, 1416802, -6294812, -1408212, 6221797, -3649112, -3246459, -372588, -5529234, 1145146, 2816962, -1977296, --89657, 1484985, 308164, 2552821, -253403, -5929739, 2180233, -3661997, -2742874, 1710471, --3629784, -5531918, 5584531, -5806796, 5316633, 4955856, 3285650, -233002, -6809671, -3957812, -814970, -1264868, 8863739, -5371931, 2188823, -670015, 1209033, -6649683, -11104638, -1941862, --3304441, -3695819, -835908, 4733591, -980863, -5003637, 4450660, 1895154, -2194192, 3704409, --678605, 1125281, -5090073, -403190, -1240709, -64961, 2005213, -2332167, 1632088, -4677220, -3208341, -721018, 375810, -1701881, -1513439, 29528, 1963874, 713501, -27917, 747861, -4295, -2819109, 855772, 234613, 1815697, -282394, 100395, -4832, 80531, -178241, --973884, 4328254, 4318053, 651224, 7749195, -41876, 3374234, 4183298, -1074, -3714610, -442919, -5296769, -6789807, -2553358, -7743826, -8002598, -2569464, 5330055, -1839320, -1791538, --4137664, -1020055, -7272990, 3619584, -1999844, 1847373, 4449586, 1529545, -1489280, 3060164, -2920578, -3538516, 2538326, 366146, 718870, 2715493, -6334003, -2722473, 4582730, -2867428, --154619, -1811939, 5080947, -6404333, -477278, -5359583, 3554622, -288837, -336618, 4902169, --2045478, -2310156, -1622961, -4523138, 387084, -2033130, -299574, 329639, 3161096, 3176128, -1123671, -1371705, -5310190, -8765491, -2661269, -585726, -2107218, 4749697, -1840394, -2686502, -3839164, -2406792, -3703873, 8366060, -1745367, -4645544, -350577, 786516, -1329292, 4134980, --463320, -3659849, 125091, 179852, -721555, -1090922, 3345780, 755377, 535260, -1937030, -481573, -580357, 296890, 1290101, -210453, 736587, 1595580, 203474, -230318, -316217, -722091, -1845225, -614180, -362388, -775778, 779537, 720481, -297427, 8885750, -5735392, --2732673, -4163434, 3266860, 592706, -452582, 6397891, 1497870, 1841467, -9397388, 1676648, --4410395, -5117454, -6642167, -153008, 187368, 7781407, -6446209, 2916820, -2733210, 9633612, --3540664, -3248606, 6833830, -2674691, 2324651, 998043, -508954, 1097364, -4669167, 710817, -164819, 1913408, 9041980, 3131568, 795643, -3921842, 3128347, -7105487, -2015950, -1389959, -3816079, 3273302, 5439576, 3569118, -4176319, -6095096, -2700998, 4596689, -625455, 2370822, --1031866, -701153, 9188009, 2149631, -760209, -11067594, -4982162, 257161, 3779571, 5876589, -8249559, 4626217, -2067490, 1462436, -2097555, -2850248, 5900212, -3782793, 6075768, 255014, --5606006, 1974074, -2920578, 4767951, -4178466, -493384, 4099546, 4758287, -4859756, -1859721, --970126, -1984275, 2811593, -664109, -2118493, 1308891, 624918, 712428, 737661, 1140851, -556198, 675921, 235686, -360777, -490700, -1789391, 2686502, -120796, 90731, 303332, --33823, 427349, 1396938, 1422708, -143881, -386547, 1758252, 1390496, -191126, 1161252, -4728222, -1080184, -744640, -1686848, -5445482, 256624, 3979824, 3969087, 7381975, 3410204, --9603547, -8009041, -6951405, 335007, -1146756, 557809, -3770445, -2319282, -556198, 2974265, --3758, -6129992, 6710350, -905701, -6167573, 1318555, 1498944, -77846, -562104, 2733210, -3567507, -2161979, 5434744, 318901, 3196530, -7316477, 5272609, 1916092, 3052648, -5018670, --527207, 3760244, 3201898, 8099772, -272194, -11057930, -3011309, -5268315, 2631204, 1854889, --433792, -2911451, 874563, -4501126, -1589675, -8241506, -4859756, -222801, 4644471, 5214091, --3700114, -3129421, -3240553, 5358509, -1788317, -593779, -7948374, 4861903, -7845295, -2671470, --323196, -1602560, -2119030, 8427800, -695785, -1883343, -2223719, 1722282, -5028333, 643708, --8731669, -6966437, 2575370, -2389613, -1293859, 3190087, -1571958, 4235375, 832687, 1981591, -2946348, -717796, 1427540, 1025423, 550293, -548145, 1080721, 502511, 271120, -580894, --682900, 241592, -2557653, 23085, 1611687, 456877, -96637, 377420, -1570884, -435402, -960999, 595390, 2575370, 751619, -321049, -331786, 2371359, -2760590, 4246649, -3163244, -144955, 5805185, 10460393, 7275675, 1675037, -7943005, -5919002, 2304250, -1243393, -5046050, --1556389, -6539625, -2725157, 13545253, 1695975, -1294933, -2351495, 141197, -2973728, -2025614, -9215389, -9277666, -961536, 1060857, -1863479, 2492692, 5634460, -2390149, -2947421, 1517197, --3702262, -3630858, -8596914, -3111704, 2509872, -7704098, -1159104, 4014721, 6055367, 2226941, --12130598, -3580392, 2625299, 6319508, -4663261, 10813654, -1087701, -5298916, -2867428, -2188823, --4063576, 5934034, -4184909, -1035087, -5576478, -4378719, -1944010, -4454955, 6306623, -2138894, --12152610, 4826470, 8429410, 231928, 3152506, -14847702, 11848741, 332323, -9647033, 1110786, --6460705, -1286880, 1206886, -7004018, -8186745, 5669894, 2767033, -7118909, -323733, 297963, --4306779, -448824, -1482838, 1230508, -3801046, -1935957, -613107, -1864553, -832687, -2808909, -1133871, -82141, 1678259, -3064996, 923955, 1903744, 133144, -1695975, 1341640, -1643362, -1846836, 1466731, -1163936, 1432909, -66572, -820876, -250182, 568546, 824097, 489626, -472446, -10926934, 2651069, -8005282, 8872329, 2372970, -3158949, -6433861, -11377905, -4863514, --8192113, 3037079, 16302085, 2906619, -4020626, -91268, -2037425, -2330557, -7093139, -4627828, --7306813, 2182380, -382789, 1797981, -2437931, 1396401, -7727183, -389231, 1995012, -5226439, --1795833, 831076, -2746095, 927713, -2511482, 12066174, -14372034, -2444373, 1372242, 4065724, --1311039, -5835250, -8738111, -6189585, 4985384, -1130113, 5510443, -4390531, 14002667, 1952600, --2479807, 6979, -8002598, -10344966, -5096516, 4117800, -8750459, -402116, 10715943, -153545, --4776004, -9841381, -16669305, 838592, 8861591, -2260227, 10139881, -763430, -2907156, -6098317, --5305895, 1101122, 4153770, -3049427, 14617921, 4484483, -4417911, 2347737, -5710696, 2305324, -2936684, -1854352, 3336653, 5965173, 2697240, 393526, -3652333, -10469520, 930397, -2287070, --848256, -1499481, 983011, 342524, 84826, -4569309, 963683, -2575370, 1105954, -2537789, --650688, -585189, -12885, -136902, -279710, -1800128, -1467805, -1983738, -2825015, -3162170, --1124745, 258235, 1097901, -1620276, 191126, 185220, 562104, -1217086, 1405528, -2199560, --89657, 9384504, -4245575, -11045582, -3080565, -8274255, -4341138, -3648575, 11524471, -3012383, --3963718, -4996658, 7384123, 6602439, 5848672, 16266115, 17079474, 7835631, 10592463, -4123169, --4999342, 6981470, 10454487, -4679904, 4562866, 3133179, -9193914, -8764955, 5049808, -1386738, --166967, -8750459, -11013907, -2732136, -8935679, 9932649, 18751828, 3755949, 7373385, 2033667, --2255395, 6587406, -12883828, -3563749, 2631204, 7023882, -4267050, -10506027, 15108621, -165356, --4685810, -3838627, 6182069, -1996086, 5509370, -3927748, 8666170, -870268, -254477, 10598369, -3313567, 4810900, 1906429, -1782948, 8000987, -12367895, -4922033, 4423817, 13807783, -8561480, --996969, -1867237, -1965484, -5917391, -1285806, -3145527, -3978214, -722628, 917512, 3749507, --1635846, 10940355, 4036196, -6533719, -1544578, 666794, 4232691, 1335735, -1930051, -4011500, --841277, 2284386, -2473901, -2336462, -1891396, 2103460, 1422171, 2072859, 1177895, -2221572, --803159, -112743, -2054068, -537945, 1625108, 816581, -242666, -2478733, 3046206, -602369, -1903207, -1468879, 944356, -2857227, -237834, -585726, 150861, -1973538, -565325, 6774774, --6793028, -2677375, 6107444, -4885526, 2600066, 4589710, -9245454, -9851044, 2717641, 7439420, --2626909, 6786585, -5057861, -2259153, 12965433, -14845018, 8836358, -4265440, 25233, 345745, -16025060, -3633006, 3099356, 5071283, 8790724, 5142150, 7689602, -1340567, -1335198, 2491618, -1164473, 1247688, -7863012, 12039867, -16206522, -3593277, -4332549, 8960376, -1905355, 10930155, --595927, 993211, -19271518, -5303748, 11599633, 19838454, -275415, -9904731, -8405788, 8127152, -6471442, 4902169, 4589173, -8492761, -3968013, -4930086, 2485176, 327491, -5295158, 3030100, -2571612, -2455648, -2761127, -11602854, -3152506, -4274030, 16442209, 1489817, 3016678, 6247567, -394600, -12975633, 542777, -7820062, 6363531, 15426986, -8294656, 4757750, -2462090, -8035347, -3770981, -6737193, -1269700, 2790118, 1970316, 3523484, 1384053, -571231, -3047816, 3336116, -7131257, 1209033, 3476776, 5950141, 2539400, 6730214, -2148558, 6367289, 204548, 148176, -1272384, 712428, 1713692, -193274, -3249680, -1738925, 15569, 1711545, 1675574, -1217086, -2966212, 2935073, -2586107, 4148402, 7115687, -11887933, -4494684, -4392678, 2418067, -565325, -18011482, -2120640, 755914, 11475079, -9990094, -7228430, -9357123, -9814537, -2278480, -243739, -4597763, 19245748, -1619203, -10889353, 19937776, 443992, 5673115, 13654238, 9467719, 12750147, --3173444, 10095858, -6313065, 13340168, 11696270, -3022046, 6158446, -5210869, -4809827, 5107253, -15269682, 6927246, 6117107, 2253247, -4697621, -8255464, -8380555, 1489280, 10540923, -5950677, --7158637, -8850854, -3269007, -17649094, -4032974, 3508452, -12914967, 6412386, 1059246, -5849209, --15192373, -10142565, 148176, -20224464, 6502581, 4600447, -321586, 5763846, 3811247, -1883880, --10460930, -6316287, -1066226, -6611566, 6386080, -6933688, 16959752, -11237245, 725850, 7487739, -777926, -4972499, -19298362, 3479997, 9647033, 2399813, 682900, 10630044, 5938866, -5945309, -133144, -609349, 914828, -337155, -3231963, -6750615, -1917703, -7301445, 541166, 1941325, -1030792, -1823214, -3694209, -1679869, -2423435, 3302830, 1097364, 4292820, 3124052, 2504503, -1056025, -256624, -1326608, -1210107, -3219078, 1633161, 348966, 1626719, -1488206, -133681, --2672007, 267899, -2061047, 955093, -24850144, 8686571, 11303817, 19910394, -88584, -14839649, -4150012, 7107097, -15364709, -15974594, -9996536, -421444, 8484708, -467078, -6276021, -352724, --5495411, -3704946, -9916006, 16483548, 12865038, 4830765, -20273320, -6089190, 3227131, -1174674, --4536559, 25604984, 9361418, 8032126, 7515119, 12144020, 9099425, 2204392, 9528385, -669478, --15935939, 8592619, -16392280, 4984847, -16229071, 13670881, -4311074, 16511465, -9044664, 4002910, --7320772, 5944772, 9640054, 25212532, 5305895, -32085016, -1725503, -4473209, 6861211, 14006962, --2863670, -6237367, 10274099, -1827509, -5083631, 13799730, 849330, -617938, 674847, 5908265, -11018202, 8741869, -9517111, -7059316, -6013491, -9631464, 2232309, -892816, 10893111, 7846369, --14757508, -3554086, -8359080, 7148973, -4082367, -3935264, 2554969, 480499, -5699959, 4870493, -1164473, 811749, -861141, 2771865, 2844879, 460635, -8362302, 2333241, 1435056, -1067299, --1492501, -2768107, 85899, -3704409, 1700270, 4191351, -1293322, -1236951, 4087198, 648540, --3848291, -2928631, -709207, 2007897, -1687385, -390842, -2374043, 640487, -1593433, 28991, -3928821, -2633889, 620623, 27079768, -10191421, -17959406, -5683853, 7089918, -4404489, 13042742, -18842022, -7504382, 17284022, 11147051, 8711804, -2791729, -2030983, -3416647, 16765405, 3114925, -2059974, -9674951, 4282620, -5027259, -381715, -16015396, 10938745, -14690399, 111669, -10343355, -17484274, -8850317, 433255, 17295834, 13142600, 8920647, -1010928, -6773701, 8052527, -183610, --1505923, -21936546, -6492917, -13221520, -10756746, -8358007, -3932043, 11514270, 7232188, 6745783, -69793, 16914118, -8877697, 17894982, 15708843, 16885128, 29445758, -11290395, -8829379, 13006235, -2476049, -11330124, 17783848, -5757404, -8524436, 5837398, -2152852, -6072010, -5037460, 7701413, --10248866, 4748087, -6334540, 16377247, -6891812, 337155, 4796942, 11964705, 16190416, 1376000, --14064944, -15242302, 5048734, -10127533, -32846300, -17227650, 5286568, -289373, 9550397, 1297617, --5353677, -542777, -3092377, 1479079, -5666673, -2428267, -3877819, -1565516, 487479, -627602, --10233833, -2616172, -6689412, -5961415, -4707821, 2170569, -438087, 499827, -7440494, -5132486, --242666, -204548, 1497870, 3937411, 3206730, 2434173, -5341866, 343061, 1267552, -6878927, -2492155, 491237, 3068754, 1457605, 3904125, 2258079, -1536525, 3348464, -2454574, -1780264, --726386, -24799678, -20899848, -621160, 4884989, -14141180, 1053878, 1695438, 23841900, -14877230, --17080012, 6075768, -6962679, 379568, -12371116, 12580496, -12575664, -16985522, -10117332, 20509542, --13306346, -10794863, -2176475, 8569533, -5607080, -14010720, 4877472, -5431523, 488553, 6969658, --18615462, -1025423, 10937134, 17336098, -2168959, 26283590, 11747809, -2540473, 1553168, 12176232, --4443144, -10112500, 2399276, 14426258, 1964948, 7138773, 717796, -11068131, 4370666, -24787866, -2696703, 1779727, -2806761, -14431090, -13070122, 2047089, -5742372, -9779104, -6422050, -7792145, -10049150, -16184511, -9068823, -4373351, 7626252, -9352291, 20755966, -2651069, -16699370, -1068910, --9777493, -26721676, -7710540, 2209224, -419833, -17214766, -9006546, -3610457, 4424890, -10062572, --4793184, 17806934, -5779952, -23322746, -7943542, 3488050, 2226404, 8216810, 7008850, 5338645, --5104569, -6480569, -1232119, -4401805, 3877282, 1461363, -2630668, 5498632, 2531883, 3405372, --1636919, 2866354, 2250563, 405338, -594316, -1337346, -1786170, 464393, 1795833, -8016557, -2228551, -4432943, 5844914, 2431488, -5820218, -5103495, -59593, -3950296, -216896, 2207613, --1157494, -2527052, -4204236, -3091303, 2867428, 1332514, -4815732, 2389076, 974958, -3058017, --2539400, -5567352, 18974092, 16934520, 4880157, 34952444, -6824166, -12560632, -11308649, -5417028, --19262392, 25382182, -15650324, -5850283, -12737262, -6657736, -6150930, 2789045, -18351858, 51003, --105227, -2714419, 4810900, -19294604, -5166846, 12867185, -13313862, 501974, -17137456, 15925739, --236223, -28861106, -15206869, -5387500, -955093, 7776575, -17750026, -9948218, 11603928, -2227478, -7903277, 7415798, 7138773, -10618770, 805843, 12508019, 4323422, -23822572, 14885820, 10853919, --13157095, 36181340, -1016297, -26229366, 6859600, 8096014, -940598, 19252728, -6307697, -32533840, -8773544, 4517232, 9342628, 11376295, -15178951, 23323820, 8454106, 7176891, -5944235, 35392680, --3097745, 508954, 23851564, -4237522, 10672457, 19085224, 6191196, 2773475, -4990215, 9135395, -8053, 16138340, -7517267, 15712601, 14083198, 817118, 13925895, 8516383, 11010149, -5871757, --442382, 13050795, 9032853, 6993818, 3803194, 4445291, -9069897, -1045825, -3758, -4064650, -117038, -1486059, -4138738, 7577396, -8234526, -1486059, -8092792, 6614787, -3704946, 7934415, --7209640, 1116155, -5165772, -6657200, 4176319, -2521683, -639950, -6482717, -10152766, -7140383, -7003481, 765041, -3572876, 846109, 8820789, 6826314, -3324842, 3352759, -386547, -2533494, -9113921, 434329, 5782100, 7078643, -25146496, -24675660, 50556596, 16301548, -31624918, -15902653, --14525043, -28945932, -2185602, -15280420, 21030844, -11919608, 62814, 26272314, 521302, 4361003, --19399294, 24226836, 18008798, -317291, -5896990, -1889786, -15100031, 1144609, 1854352, 3077344, --20735028, -3004330, -1258962, -6215355, -4669167, -14241575, 13434658, 26760868, 32060858, -2601677, --13088376, -5412196, -6731288, -4482872, -19798726, 6732361, 7625715, 7099044, -20634096, -27404038, -29566554, 11229192, 16518981, 21572010, 20107426, -8719857, -13901735, 19528680, -19929186, 10103911, --14942191, -11344619, -6722161, 23236846, -7791071, 4762045, 7867307, -4175782, -18861886, 38832408, --23555748, 2464774, 27979028, -25368224, -11618423, 3053185, 10162429, 28943784, 5061619, -16681116, -365072, 3591667, -4039417, -6958921, 4041027, -11653320, 8872329, -9630390, -13755170, 7439420, -4015258, 10481331, 4556424, -289910, -4854387, 1267015, 2786360, 3304441, 10994043, -541166, -1412507, 7012608, -16588237, 2476049, -7546795, 1920387, 1703491, -2542084, -6365679, -7601019, --2025077, -7624104, 2901251, 4338454, 9368934, -703301, -6510634, 6205154, 7223598, 4630512, -4356171, -11694659, 261456, 3142842, -3093450, 10355166, -3983045, 936303, 922881, 9588514, --4656282, 3000035, 13113609, 13173202, -8402030, 8269423, 33724084, 20332912, -3025805, -21566642, -2278480, 34583612, 27539330, 5816997, -27341224, -10517301, -23602456, -1741072, 18504866, 22857816, --1656784, 8702677, 27160836, 28908888, 44841068, 45142792, -22509924, 9841918, -24308442, -4375498, --19702088, -7060390, 15570330, -3455301, 6828461, 6140193, -13993003, -10238128, 11464878, 12787191, -16575889, 11795591, -536871, 12160663, 18294950, -9642202, 9277666, 10808822, 3234110, 10557566, -34984120, -26237956, -22592064, -5057861, 21628382, 20735566, -12270722, -120259, 33214592, 26877906, --18775450, -12503187, 11435350, -22925998, 6420439, -11010149, -20799990, 6775311, -24443732, 25475062, -9378061, 28215788, -11793980, -16430934, -31786516, -6841346, 10435697, -27837830, -23816130, -13013751, -12503187, 7428683, 5907191, -12232067, 5375689, -8738648, 3428995, 25959856, -10979010, 3095598, --14645838, 11179263, -6008659, -12285754, 8763881, 12150462, -6674916, -3419868, -3929895, 8745090, -19377818, -6127845, -12932683, 345745, -179315, -4748087, -2004139, -17942226, 2557653, -9501541, --4225711, 6592238, -5814849, -3133179, -467615, -4920422, 8004209, -7837242, -12410845, -11231876, --9460739, 10208600, 5404680, -2238215, 4556961, 3101503, -8007430, -8738648, 3365644, -9320079, --996432, -16200080, 12858058, 33444910, -2618856, -10919417, 21319144, 4041027, -1684164, -32685774, -27900644, -14415521, -31077846, -10842645, 1644973, 34898756, 2955474, 24887724, 9835475, -30410516, --6947647, -26990112, 3835406, -26903676, -19467476, -11794517, 903554, 5140539, -20950314, 19713364, --6928856, 11812771, 12727062, 12596602, 24002962, 44144212, 25723096, -8929774, -22354768, -1190780, -46498388, 28813324, -16410533, 22939958, -9432822, 28115392, -14608794, 2348810, -11045045, -5688148, --2029909, -8440684, 70099768, -13838385, -19899658, -22924924, -32079648, -12596602, -24823838, -1507534, -26825828, -11275900, 7618735, -9495099, -14343043, 24377698, -7330436, 41355168, 7307350, 32996624, --41250476, 16396575, 71271760, 25678536, -40425304, 23396298, 21372294, 902480, 4196183, -12668543, -13230110, 62536336, 33044942, 13718126, 18663780, -20097762, 36005248, -4218195, 5174362, 5375152, -8570607, 3820374, 23540716, -20203526, -5363878, 1321776, 30130270, -5558225, 7074348, 34983044, --3200825, -20090246, -4966593, 12611635, 1735167, -8726837, -20369420, 11212012, 7918309, -14141717, --8480950, 9126269, -17291002, -14445049, 4162897, 6629282, -459562, 4483409, 2919504, 5308580, --6585259, 5569499, -4163434, -5442261, 5116917, 1959579, 7233262, 1270237, 49086644, 22958210, -5514201, -1468342, -53490060, 25012278, 33659660, -24167244, -17597554, 41599980, 27117886, -33199024, --35286376, 1295470, -20618528, 9035001, 3438121, 8628589, -33172716, 8730595, -6437619, -16474958, -29504814, -1993939, -4900021, 9976135, 24739012, 22286048, 15211700, -28338194, 624381, -13793824, --30271466, 11098732, 8571144, 18717468, -6397354, -14049375, 38737384, -27742804, 12277164, 13527536, -10941429, 8389145, -4818954, 22969486, -21242908, -36604396, -6169184, -41938744, 36870148, 22737020, -36178120, -2849711, 7109782, -29143500, 30376694, 38402376, 13732084, -16221555, -42973296, -9803263, --56688200, 911607, -10579578, -38356204, -32639604, 15006079, 2353105, 23721104, -18323404, 27182312, -22767084, -32075890, 6772627, -19127636, -5478768, -28967406, 3647501, 84664544, 21050172, 24902758, -30935576, 13914083, -24062554, -3207804, -402653, 20162724, -4671851, 20718922, -9413495, -12613245, -428423, -1336272, -23790360, 20496658, -3852049, -5706938, -7442105, -16502875, 2297271, -7728257, --10705743, -15320148, -12251394, 7660611, -8880919, 7510287, 8304856, -5780489, -10000831, -13190381, -5989869, -2254858, 5564667, 20565914, 12589623, -59593, -1822140, 6717866, 12619151, -12421582, -11109470, -12517682, -9677635, -6501507, -34489124, 14126684, 10612864, -16615081, 4898947, -8913131, --51514912, -14174466, 11923903, -6641630, 4959614, -29046864, 36325760, -49384608, 3209951, -36374616, -24137716, 26567594, 8295730, 22110492, 1924682, -24241332, 39485780, -19462644, 3626026, -131533, --23657754, 37287296, 2057826, 9114457, 7752953, 11120744, 5755256, 27750858, 33030446, 10596758, -38691748, -34850440, -3179887, -719407, 49633180, -10327249, 39464308, 21613886, 54438712, 10096931, --13014825, -18253074, 21309480, -41828148, 38262252, -24119462, -14373645, -7216619, 7292318, 28703266, --7417409, -54010824, -15349676, 85661512, 5865315, -55067924, 12903692, -36701032, 10173704, 84393424, --23939074, -23976654, 58525908, -64404644, 31655520, 13942538, 18722836, 54732380, 34507916, -49932752, -60109676, 39291436, 1305670, 64012728, -27099634, -9491878, 46292232, 30275224, 5084168, 12001212, --568009, -1190243, 5151277, 15524696, -15023796, 16444893, 16928614, -15033459, 7057705, 11306501, --21284784, -2423972, 7280507, -2430952, 3460670, 25904022, -54224, 17108466, -9767293, -209917, -12269648, -8435316, -7130183, -17749490, 2492692, 15392089, 10087268, 14481556, -28314036, 15183783, -17725330, 7885023, 2720862, 7182259, -1742146, 16224239, 29122562, 6929930, 13814762, 13231720, --7295002, -8043937, 13629542, -17837536, 6533182, 21031382, 28759638, 55328304, 27262842, -27252104, -35153232, 10227928, 31649614, -9737765, -60189672, 60170344, 52056076, 31911070, 98784248, -9691057, --83984328, -43519292, -39964672, 87743496, 64167348, 15281494, -6236830, -16480863, -58941448, -28051506, --19541564, -33848100, 89034672, 72438920, 100494184, 1557999, -116409184, -180537344, -88581016, 100124280, -134815808, 138098768, 55082420, -114971976, -211450896, -129483600, -65932580, 96991632, 164600320, 93664648, -50338628, 13450764, -75295072, -100406136, -75722960, -5835250, 57402236, 117700896, 140162496, 24905978, -26817238, -111965504, -186105760, -98952824, 91629368, 154969392, 146244704, 91710440, -54681376, -180370912, --117513528, -151249424, -196495, 102584224, 110147656, 55569896, -44787384, -94945080, -84919560, -66521528, -18937048, 63230508, 43695924, 127927208, 45457932, -28587302, -76354856, -28027346, 84505632, 124579824, -41313828, -4802847, -76911592, -15412490, -17837000, 49240188, 17942762, -12469901, -53335440, -15726023, -2281165, -8392366, -16450262, -3366181, 11846057, 26725970, 44409424, 21805012, -44923212, -39390220, --37584184, 8978629, 46812996, 52789444, 23822572, 5743982, -34235720, -14410689, -66530656, -58237608, --5582384, 17456894, 72030896, 109260208, 40970768, -37848324, -90406912, -111916112, -47491064, 88172456, -144818240, 99920800, 29904246, -72689640, -119256208, -57994408, -702227, 21912924, 21101712, 50888920, -25439628, 11517492, -30572114, -63838248, -48721036, 7090454, 32094680, 64072860, 29829084, 11056856, --12150999, -31938450, 37855840, 5827734, -53692460, 7426536, -13616120, -21278342, 16786342, -16189879, --6130529, -28504624, 2188286, -10580652, -21129092, 9181029, -1918777, 7778723, 4045859, 18529562, --17121350, -5411122, 6003291, 2517388, 8926553, -6978785, 18712636, -12224014, 13084081, 6497749, --5253282, -12865575, -5164162, -24596740, 28038620, -1894618, 1584843, -4172561, -5863704, 2108292, --115427, 1313186, 11278584, 6924561, 386010, 15977815, -12577812, 5355824, -11904039, 14426258, -9150965, -9822053, 8051453, -12125230, -13627931, -11005854, -21403432, -1803349, 17364016, -14576045, --29368450, -20046760, 2523293, 18916110, 1098438, 14237817, -27907086, -6989523, -2609193, -2087891, --27269284, -6515466, 1651415, 4568235, -9313100, 29637958, 12458090, -9006010, 27602682, -2261300, --47400868, -1620276, -6295349, -3956739, 9984725, 6454262, 13495324, -14696304, 21387326, -35038344, -10917807, 6569690, -781684, 301721, -1591822, -2139431, 12566537, -1938641, 2807835, -5047661, -187905, -10106058, 3364033, 326954, 21368536, 66035, 9873593, -9291625, 1882806, -4565014, --11463268, 3988951, 433255, -5847061, 15475304, -2610266, -3069291, -5787469, 11564199, -3934190, --19683836, 4363687, -3278671, 6480032, -7937100, 1064615, -1750199, -12363063, 12310450, -10934450, -8729521, -10452340, 6394133, -869194, -3150359, -6048925, -28829968, -47554952, -74947176, 3175055, -62592704, -23360864, -37768868, -40370008, -38153268, 8489540, 8391829, 72116792, -9980430, -9842454, --31503048, 4024921, 10085120, 23025320, -23592256, 12603045, -17058536, 28530394, 9323300, 9658308, -3749507, -16996796, -9134322, -10910291, -3395709, 10637560, -10170483, -8799851, 20153598, -17597018, --10926397, 16844324, -15226196, -5239323, -13024488, -21328270, 8052527, 14805826, 2968359, 13981729, --20184736, -4730370, -278636, 12395276, 15060303, 18757196, 1598802, -1411971, -30537754, -31205622, --11414949, -9778030, -6629819, 15065672, 20251308, 28673202, 3409130, -12346420, 28532542, -19661286, --8725763, 13080860, -8551280, 37593848, 2174864, -5658620, 6565395, -13025025, 11034308, 26209502, -21325586, -7075959, 8238284, -24429774, -16023449, -8732205, -5896453, 19041738, -2136209, 18606336, -5063767, -5427228, 2428267, 3768834, -21383568, 13401909, -15765751, 10484552, -7104950, -3987340, --884226, 12331388, -11001559, 1928977, 2220498, 10837276, 18317498, -8680666, -2469069, -13859323, --5554467, 5487895, -5433671, 4468377, -4202089, -5373541, -9772124, -15185931, -8433168, 14825690, --5407901, 7559680, -10084046, -1882269, -615254, -2758980, -9024800, -3653944, 1245004, -573915, -326954, 517007, -13766444, -1792612, -2968359, -2401961, -18254, -331786, -458488, 19676856, --48499844, -113441360, -86673512, -9976672, 37591164, 97933304, 82705504, 78947408, 80641768, 53213572, -22452478, -29025388, -51478940, -98328984, -72421736, -71191768, -70950176, -44144748, 42890616, 57752816, -84897544, 65158412, 54626080, 18022220, 36456756, -8178155, -9375377, -11425150, -19862614, -37238976, --30461518, -62727996, -22797150, -49818400, -23684598, -11780022, 16371878, 3266323, 23402740, 5402532, -32754494, 24040542, 39611948, 52576844, 65375844, 41773924, 28128814, 46410344, 3648038, -15801722, --57268556, -67242544, -92423936, -82455320, -77014136, -29546154, -50523312, -26491358, 3172907, 13933411, -32726578, 62279172, 66469452, 74185896, 112173272, 63084480, 85959472, 59528248, 13653701, -9144522, --35116728, -89731528, -98018672, -93437552, -103546296, -76134200, -52995064, -42642584, -11571716, 21776022, -36666136, 46416784, 69224672, 73356968, 77413024, 72982232, 45637784, 31731218, 15218680, 1593433, --84289, -22115860, -35942972, -52172580, -61844308, -65848292, -62116500, -43814572, -19519552, -17706002, --6530498, 11581916, 31139050, 38534984, 73295224, 51481088, 40880036, 40605696, 14847165, -1808718, --10393284, -13100187, -13606993, -35614944, -31688806, -23176718, -23957864, -17803176, 2532420, 5350456, -7217156, -4462471, 11850352, 140660, 13989245, 14011794, 4878009, -5135171, -357556, 2819646, -2206003, 1956895, 6767795, 1156957, -3025268, -10609643, -2102923, 1983738, 8053, 6002754, -5268315, -1473711, -657130, -4804995, -3190087, -2823941, -1261110, -2446521, 1765232, -1743757, --617402, -950798, -2094333, -4354023, 29528, -464393, 2777233, 5421323, 4323959, 2544231, -3782793, 185220, 380105, 331249, 1015223, -1130650, -767725, -1467268, 365072, -576063, --2053531, -2494302, 231391, 163209, -239444, -2229625, -2304787, -2415919, -2183991, -1312649, -1249836, 1064078, 2116345, 2105608, 2078764, 129923, 1161789, 821949, 1349694, 1102733, -2400887, 1823214, 1890859, 54224, -1342714, -2214056, -1748052, -2559801, -2193118, -2351495, --1880122, -2445984, -1537598, -900869, 12348, 423054, 1247151, 1659468, 2736431, 2810519, -3400004, 2326799, 1705639, 797790, 542777, -890669, -1589675, -2235531, -2376191, -2357937, --1411971, -1159104, -619549, -324270, 166430, 182536, 581431, 563178, 661962, 550293, -535797, 281857, 249108, 101469, 90731, -9127, -37581, -84289, -87510, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +8022462, -569620, 3258807, 1661616, 3830037, -6724845, -3609920, 4388383, 2147484, 88584, +-3718368, 812286, -10456635, -6720550, -320512, -3990025, -4514011, 1911797, 8252243, 1416802, +6294812, -1408212, 6221797, -3649112, -3246459, -372588, -5529234, 1145146, 2816962, -1977296, +-89657, 1484985, 308164, 2552821, -253403, -5929739, 2180233, -3661997, -2742874, 1710471, +-3629784, -5531918, 5584531, -5806796, 5316633, 4955856, 3285650, -233002, -6809671, -3957812, +814970, -1264868, 8863739, -5371931, 2188823, -670015, 1209033, -6649683, -11104638, -1941862, +-3304441, -3695819, -835908, 4733591, -980863, -5003637, 4450660, 1895154, -2194192, 3704409, +-678605, 1125281, -5090073, -403190, -1240709, -64961, 2005213, -2332167, 1632088, -4677220, +3208341, -721018, 375810, -1701881, -1513439, 29528, 1963874, 713501, -27917, 747861, +4295, -2819109, 855772, 234613, 1815697, -282394, 100395, -4832, 80531, -178241, +-973884, 4328254, 4318053, 651224, 7749195, -41876, 3374234, 4183298, -1074, -3714610, +442919, -5296769, -6789807, -2553358, -7743826, -8002598, -2569464, 5330055, -1839320, -1791538, +-4137664, -1020055, -7272990, 3619584, -1999844, 1847373, 4449586, 1529545, -1489280, 3060164, +2920578, -3538516, 2538326, 366146, 718870, 2715493, -6334003, -2722473, 4582730, -2867428, +-154619, -1811939, 5080947, -6404333, -477278, -5359583, 3554622, -288837, -336618, 4902169, +-2045478, -2310156, -1622961, -4523138, 387084, -2033130, -299574, 329639, 3161096, 3176128, +1123671, -1371705, -5310190, -8765491, -2661269, -585726, -2107218, 4749697, -1840394, -2686502, +3839164, -2406792, -3703873, 8366060, -1745367, -4645544, -350577, 786516, -1329292, 4134980, +-463320, -3659849, 125091, 179852, -721555, -1090922, 3345780, 755377, 535260, -1937030, +481573, -580357, 296890, 1290101, -210453, 736587, 1595580, 203474, -230318, -316217, +722091, -1845225, -614180, -362388, -775778, 779537, 720481, -297427, 8885750, -5735392, +-2732673, -4163434, 3266860, 592706, -452582, 6397891, 1497870, 1841467, -9397388, 1676648, +-4410395, -5117454, -6642167, -153008, 187368, 7781407, -6446209, 2916820, -2733210, 9633612, +-3540664, -3248606, 6833830, -2674691, 2324651, 998043, -508954, 1097364, -4669167, 710817, +164819, 1913408, 9041980, 3131568, 795643, -3921842, 3128347, -7105487, -2015950, -1389959, +3816079, 3273302, 5439576, 3569118, -4176319, -6095096, -2700998, 4596689, -625455, 2370822, +-1031866, -701153, 9188009, 2149631, -760209, -11067594, -4982162, 257161, 3779571, 5876589, +8249559, 4626217, -2067490, 1462436, -2097555, -2850248, 5900212, -3782793, 6075768, 255014, +-5606006, 1974074, -2920578, 4767951, -4178466, -493384, 4099546, 4758287, -4859756, -1859721, +-970126, -1984275, 2811593, -664109, -2118493, 1308891, 624918, 712428, 737661, 1140851, +556198, 675921, 235686, -360777, -490700, -1789391, 2686502, -120796, 90731, 303332, +-33823, 427349, 1396938, 1422708, -143881, -386547, 1758252, 1390496, -191126, 1161252, +4728222, -1080184, -744640, -1686848, -5445482, 256624, 3979824, 3969087, 7381975, 3410204, +-9603547, -8009041, -6951405, 335007, -1146756, 557809, -3770445, -2319282, -556198, 2974265, +-3758, -6129992, 6710350, -905701, -6167573, 1318555, 1498944, -77846, -562104, 2733210, +3567507, -2161979, 5434744, 318901, 3196530, -7316477, 5272609, 1916092, 3052648, -5018670, +-527207, 3760244, 3201898, 8099772, -272194, -11057930, -3011309, -5268315, 2631204, 1854889, +-433792, -2911451, 874563, -4501126, -1589675, -8241506, -4859756, -222801, 4644471, 5214091, +-3700114, -3129421, -3240553, 5358509, -1788317, -593779, -7948374, 4861903, -7845295, -2671470, +-323196, -1602560, -2119030, 8427800, -695785, -1883343, -2223719, 1722282, -5028333, 643708, +-8731669, -6966437, 2575370, -2389613, -1293859, 3190087, -1571958, 4235375, 832687, 1981591, +2946348, -717796, 1427540, 1025423, 550293, -548145, 1080721, 502511, 271120, -580894, +-682900, 241592, -2557653, 23085, 1611687, 456877, -96637, 377420, -1570884, -435402, +960999, 595390, 2575370, 751619, -321049, -331786, 2371359, -2760590, 4246649, -3163244, +144955, 5805185, 10460393, 7275675, 1675037, -7943005, -5919002, 2304250, -1243393, -5046050, +-1556389, -6539625, -2725157, 13545253, 1695975, -1294933, -2351495, 141197, -2973728, -2025614, +9215389, -9277666, -961536, 1060857, -1863479, 2492692, 5634460, -2390149, -2947421, 1517197, +-3702262, -3630858, -8596914, -3111704, 2509872, -7704098, -1159104, 4014721, 6055367, 2226941, +-12130598, -3580392, 2625299, 6319508, -4663261, 10813654, -1087701, -5298916, -2867428, -2188823, +-4063576, 5934034, -4184909, -1035087, -5576478, -4378719, -1944010, -4454955, 6306623, -2138894, +-12152610, 4826470, 8429410, 231928, 3152506, -14847702, 11848741, 332323, -9647033, 1110786, +-6460705, -1286880, 1206886, -7004018, -8186745, 5669894, 2767033, -7118909, -323733, 297963, +-4306779, -448824, -1482838, 1230508, -3801046, -1935957, -613107, -1864553, -832687, -2808909, +1133871, -82141, 1678259, -3064996, 923955, 1903744, 133144, -1695975, 1341640, -1643362, +1846836, 1466731, -1163936, 1432909, -66572, -820876, -250182, 568546, 824097, 489626, +472446, -10926934, 2651069, -8005282, 8872329, 2372970, -3158949, -6433861, -11377905, -4863514, +-8192113, 3037079, 16302085, 2906619, -4020626, -91268, -2037425, -2330557, -7093139, -4627828, +-7306813, 2182380, -382789, 1797981, -2437931, 1396401, -7727183, -389231, 1995012, -5226439, +-1795833, 831076, -2746095, 927713, -2511482, 12066174, -14372034, -2444373, 1372242, 4065724, +-1311039, -5835250, -8738111, -6189585, 4985384, -1130113, 5510443, -4390531, 14002667, 1952600, +-2479807, 6979, -8002598, -10344966, -5096516, 4117800, -8750459, -402116, 10715943, -153545, +-4776004, -9841381, -16669305, 838592, 8861591, -2260227, 10139881, -763430, -2907156, -6098317, +-5305895, 1101122, 4153770, -3049427, 14617921, 4484483, -4417911, 2347737, -5710696, 2305324, +2936684, -1854352, 3336653, 5965173, 2697240, 393526, -3652333, -10469520, 930397, -2287070, +-848256, -1499481, 983011, 342524, 84826, -4569309, 963683, -2575370, 1105954, -2537789, +-650688, -585189, -12885, -136902, -279710, -1800128, -1467805, -1983738, -2825015, -3162170, +-1124745, 258235, 1097901, -1620276, 191126, 185220, 562104, -1217086, 1405528, -2199560, +-89657, 9384504, -4245575, -11045582, -3080565, -8274255, -4341138, -3648575, 11524471, -3012383, +-3963718, -4996658, 7384123, 6602439, 5848672, 16266115, 17079474, 7835631, 10592463, -4123169, +-4999342, 6981470, 10454487, -4679904, 4562866, 3133179, -9193914, -8764955, 5049808, -1386738, +-166967, -8750459, -11013907, -2732136, -8935679, 9932649, 18751828, 3755949, 7373385, 2033667, +-2255395, 6587406, -12883828, -3563749, 2631204, 7023882, -4267050, -10506027, 15108621, -165356, +-4685810, -3838627, 6182069, -1996086, 5509370, -3927748, 8666170, -870268, -254477, 10598369, +3313567, 4810900, 1906429, -1782948, 8000987, -12367895, -4922033, 4423817, 13807783, -8561480, +-996969, -1867237, -1965484, -5917391, -1285806, -3145527, -3978214, -722628, 917512, 3749507, +-1635846, 10940355, 4036196, -6533719, -1544578, 666794, 4232691, 1335735, -1930051, -4011500, +-841277, 2284386, -2473901, -2336462, -1891396, 2103460, 1422171, 2072859, 1177895, -2221572, +-803159, -112743, -2054068, -537945, 1625108, 816581, -242666, -2478733, 3046206, -602369, +1903207, -1468879, 944356, -2857227, -237834, -585726, 150861, -1973538, -565325, 6774774, +-6793028, -2677375, 6107444, -4885526, 2600066, 4589710, -9245454, -9851044, 2717641, 7439420, +-2626909, 6786585, -5057861, -2259153, 12965433, -14845018, 8836358, -4265440, 25233, 345745, +16025060, -3633006, 3099356, 5071283, 8790724, 5142150, 7689602, -1340567, -1335198, 2491618, +1164473, 1247688, -7863012, 12039867, -16206522, -3593277, -4332549, 8960376, -1905355, 10930155, +-595927, 993211, -19271518, -5303748, 11599633, 19838454, -275415, -9904731, -8405788, 8127152, +6471442, 4902169, 4589173, -8492761, -3968013, -4930086, 2485176, 327491, -5295158, 3030100, +2571612, -2455648, -2761127, -11602854, -3152506, -4274030, 16442209, 1489817, 3016678, 6247567, +394600, -12975633, 542777, -7820062, 6363531, 15426986, -8294656, 4757750, -2462090, -8035347, +3770981, -6737193, -1269700, 2790118, 1970316, 3523484, 1384053, -571231, -3047816, 3336116, +7131257, 1209033, 3476776, 5950141, 2539400, 6730214, -2148558, 6367289, 204548, 148176, +1272384, 712428, 1713692, -193274, -3249680, -1738925, 15569, 1711545, 1675574, -1217086, +2966212, 2935073, -2586107, 4148402, 7115687, -11887933, -4494684, -4392678, 2418067, -565325, +18011482, -2120640, 755914, 11475079, -9990094, -7228430, -9357123, -9814537, -2278480, -243739, +4597763, 19245748, -1619203, -10889353, 19937776, 443992, 5673115, 13654238, 9467719, 12750147, +-3173444, 10095858, -6313065, 13340168, 11696270, -3022046, 6158446, -5210869, -4809827, 5107253, +15269682, 6927246, 6117107, 2253247, -4697621, -8255464, -8380555, 1489280, 10540923, -5950677, +-7158637, -8850854, -3269007, -17649094, -4032974, 3508452, -12914967, 6412386, 1059246, -5849209, +-15192373, -10142565, 148176, -20224464, 6502581, 4600447, -321586, 5763846, 3811247, -1883880, +-10460930, -6316287, -1066226, -6611566, 6386080, -6933688, 16959752, -11237245, 725850, 7487739, +777926, -4972499, -19298362, 3479997, 9647033, 2399813, 682900, 10630044, 5938866, -5945309, +133144, -609349, 914828, -337155, -3231963, -6750615, -1917703, -7301445, 541166, 1941325, +1030792, -1823214, -3694209, -1679869, -2423435, 3302830, 1097364, 4292820, 3124052, 2504503, +1056025, -256624, -1326608, -1210107, -3219078, 1633161, 348966, 1626719, -1488206, -133681, +-2672007, 267899, -2061047, 955093, -24850144, 8686571, 11303817, 19910394, -88584, -14839649, +4150012, 7107097, -15364709, -15974594, -9996536, -421444, 8484708, -467078, -6276021, -352724, +-5495411, -3704946, -9916006, 16483548, 12865038, 4830765, -20273320, -6089190, 3227131, -1174674, +-4536559, 25604984, 9361418, 8032126, 7515119, 12144020, 9099425, 2204392, 9528385, -669478, +-15935939, 8592619, -16392280, 4984847, -16229071, 13670881, -4311074, 16511465, -9044664, 4002910, +-7320772, 5944772, 9640054, 25212532, 5305895, -32085016, -1725503, -4473209, 6861211, 14006962, +-2863670, -6237367, 10274099, -1827509, -5083631, 13799730, 849330, -617938, 674847, 5908265, +11018202, 8741869, -9517111, -7059316, -6013491, -9631464, 2232309, -892816, 10893111, 7846369, +-14757508, -3554086, -8359080, 7148973, -4082367, -3935264, 2554969, 480499, -5699959, 4870493, +1164473, 811749, -861141, 2771865, 2844879, 460635, -8362302, 2333241, 1435056, -1067299, +-1492501, -2768107, 85899, -3704409, 1700270, 4191351, -1293322, -1236951, 4087198, 648540, +-3848291, -2928631, -709207, 2007897, -1687385, -390842, -2374043, 640487, -1593433, 28991, +3928821, -2633889, 620623, 27079768, -10191421, -17959406, -5683853, 7089918, -4404489, 13042742, +18842022, -7504382, 17284022, 11147051, 8711804, -2791729, -2030983, -3416647, 16765405, 3114925, +2059974, -9674951, 4282620, -5027259, -381715, -16015396, 10938745, -14690399, 111669, -10343355, +17484274, -8850317, 433255, 17295834, 13142600, 8920647, -1010928, -6773701, 8052527, -183610, +-1505923, -21936546, -6492917, -13221520, -10756746, -8358007, -3932043, 11514270, 7232188, 6745783, +69793, 16914118, -8877697, 17894982, 15708843, 16885128, 29445758, -11290395, -8829379, 13006235, +2476049, -11330124, 17783848, -5757404, -8524436, 5837398, -2152852, -6072010, -5037460, 7701413, +-10248866, 4748087, -6334540, 16377247, -6891812, 337155, 4796942, 11964705, 16190416, 1376000, +-14064944, -15242302, 5048734, -10127533, -32846300, -17227650, 5286568, -289373, 9550397, 1297617, +-5353677, -542777, -3092377, 1479079, -5666673, -2428267, -3877819, -1565516, 487479, -627602, +-10233833, -2616172, -6689412, -5961415, -4707821, 2170569, -438087, 499827, -7440494, -5132486, +-242666, -204548, 1497870, 3937411, 3206730, 2434173, -5341866, 343061, 1267552, -6878927, +2492155, 491237, 3068754, 1457605, 3904125, 2258079, -1536525, 3348464, -2454574, -1780264, +-726386, -24799678, -20899848, -621160, 4884989, -14141180, 1053878, 1695438, 23841900, -14877230, +-17080012, 6075768, -6962679, 379568, -12371116, 12580496, -12575664, -16985522, -10117332, 20509542, +-13306346, -10794863, -2176475, 8569533, -5607080, -14010720, 4877472, -5431523, 488553, 6969658, +-18615462, -1025423, 10937134, 17336098, -2168959, 26283590, 11747809, -2540473, 1553168, 12176232, +-4443144, -10112500, 2399276, 14426258, 1964948, 7138773, 717796, -11068131, 4370666, -24787866, +2696703, 1779727, -2806761, -14431090, -13070122, 2047089, -5742372, -9779104, -6422050, -7792145, +10049150, -16184511, -9068823, -4373351, 7626252, -9352291, 20755966, -2651069, -16699370, -1068910, +-9777493, -26721676, -7710540, 2209224, -419833, -17214766, -9006546, -3610457, 4424890, -10062572, +-4793184, 17806934, -5779952, -23322746, -7943542, 3488050, 2226404, 8216810, 7008850, 5338645, +-5104569, -6480569, -1232119, -4401805, 3877282, 1461363, -2630668, 5498632, 2531883, 3405372, +-1636919, 2866354, 2250563, 405338, -594316, -1337346, -1786170, 464393, 1795833, -8016557, +2228551, -4432943, 5844914, 2431488, -5820218, -5103495, -59593, -3950296, -216896, 2207613, +-1157494, -2527052, -4204236, -3091303, 2867428, 1332514, -4815732, 2389076, 974958, -3058017, +-2539400, -5567352, 18974092, 16934520, 4880157, 34952444, -6824166, -12560632, -11308649, -5417028, +-19262392, 25382182, -15650324, -5850283, -12737262, -6657736, -6150930, 2789045, -18351858, 51003, +-105227, -2714419, 4810900, -19294604, -5166846, 12867185, -13313862, 501974, -17137456, 15925739, +-236223, -28861106, -15206869, -5387500, -955093, 7776575, -17750026, -9948218, 11603928, -2227478, +7903277, 7415798, 7138773, -10618770, 805843, 12508019, 4323422, -23822572, 14885820, 10853919, +-13157095, 36181340, -1016297, -26229366, 6859600, 8096014, -940598, 19252728, -6307697, -32533840, +8773544, 4517232, 9342628, 11376295, -15178951, 23323820, 8454106, 7176891, -5944235, 35392680, +-3097745, 508954, 23851564, -4237522, 10672457, 19085224, 6191196, 2773475, -4990215, 9135395, +8053, 16138340, -7517267, 15712601, 14083198, 817118, 13925895, 8516383, 11010149, -5871757, +-442382, 13050795, 9032853, 6993818, 3803194, 4445291, -9069897, -1045825, -3758, -4064650, +117038, -1486059, -4138738, 7577396, -8234526, -1486059, -8092792, 6614787, -3704946, 7934415, +-7209640, 1116155, -5165772, -6657200, 4176319, -2521683, -639950, -6482717, -10152766, -7140383, +7003481, 765041, -3572876, 846109, 8820789, 6826314, -3324842, 3352759, -386547, -2533494, +9113921, 434329, 5782100, 7078643, -25146496, -24675660, 50556596, 16301548, -31624918, -15902653, +-14525043, -28945932, -2185602, -15280420, 21030844, -11919608, 62814, 26272314, 521302, 4361003, +-19399294, 24226836, 18008798, -317291, -5896990, -1889786, -15100031, 1144609, 1854352, 3077344, +-20735028, -3004330, -1258962, -6215355, -4669167, -14241575, 13434658, 26760868, 32060858, -2601677, +-13088376, -5412196, -6731288, -4482872, -19798726, 6732361, 7625715, 7099044, -20634096, -27404038, +29566554, 11229192, 16518981, 21572010, 20107426, -8719857, -13901735, 19528680, -19929186, 10103911, +-14942191, -11344619, -6722161, 23236846, -7791071, 4762045, 7867307, -4175782, -18861886, 38832408, +-23555748, 2464774, 27979028, -25368224, -11618423, 3053185, 10162429, 28943784, 5061619, -16681116, +365072, 3591667, -4039417, -6958921, 4041027, -11653320, 8872329, -9630390, -13755170, 7439420, +4015258, 10481331, 4556424, -289910, -4854387, 1267015, 2786360, 3304441, 10994043, -541166, +1412507, 7012608, -16588237, 2476049, -7546795, 1920387, 1703491, -2542084, -6365679, -7601019, +-2025077, -7624104, 2901251, 4338454, 9368934, -703301, -6510634, 6205154, 7223598, 4630512, +4356171, -11694659, 261456, 3142842, -3093450, 10355166, -3983045, 936303, 922881, 9588514, +-4656282, 3000035, 13113609, 13173202, -8402030, 8269423, 33724084, 20332912, -3025805, -21566642, +2278480, 34583612, 27539330, 5816997, -27341224, -10517301, -23602456, -1741072, 18504866, 22857816, +-1656784, 8702677, 27160836, 28908888, 44841068, 45142792, -22509924, 9841918, -24308442, -4375498, +-19702088, -7060390, 15570330, -3455301, 6828461, 6140193, -13993003, -10238128, 11464878, 12787191, +16575889, 11795591, -536871, 12160663, 18294950, -9642202, 9277666, 10808822, 3234110, 10557566, +34984120, -26237956, -22592064, -5057861, 21628382, 20735566, -12270722, -120259, 33214592, 26877906, +-18775450, -12503187, 11435350, -22925998, 6420439, -11010149, -20799990, 6775311, -24443732, 25475062, +9378061, 28215788, -11793980, -16430934, -31786516, -6841346, 10435697, -27837830, -23816130, -13013751, +12503187, 7428683, 5907191, -12232067, 5375689, -8738648, 3428995, 25959856, -10979010, 3095598, +-14645838, 11179263, -6008659, -12285754, 8763881, 12150462, -6674916, -3419868, -3929895, 8745090, +19377818, -6127845, -12932683, 345745, -179315, -4748087, -2004139, -17942226, 2557653, -9501541, +-4225711, 6592238, -5814849, -3133179, -467615, -4920422, 8004209, -7837242, -12410845, -11231876, +-9460739, 10208600, 5404680, -2238215, 4556961, 3101503, -8007430, -8738648, 3365644, -9320079, +-996432, -16200080, 12858058, 33444910, -2618856, -10919417, 21319144, 4041027, -1684164, -32685774, +27900644, -14415521, -31077846, -10842645, 1644973, 34898756, 2955474, 24887724, 9835475, -30410516, +-6947647, -26990112, 3835406, -26903676, -19467476, -11794517, 903554, 5140539, -20950314, 19713364, +-6928856, 11812771, 12727062, 12596602, 24002962, 44144212, 25723096, -8929774, -22354768, -1190780, +46498388, 28813324, -16410533, 22939958, -9432822, 28115392, -14608794, 2348810, -11045045, -5688148, +-2029909, -8440684, 70099768, -13838385, -19899658, -22924924, -32079648, -12596602, -24823838, -1507534, +26825828, -11275900, 7618735, -9495099, -14343043, 24377698, -7330436, 41355168, 7307350, 32996624, +-41250476, 16396575, 71271760, 25678536, -40425304, 23396298, 21372294, 902480, 4196183, -12668543, +13230110, 62536336, 33044942, 13718126, 18663780, -20097762, 36005248, -4218195, 5174362, 5375152, +8570607, 3820374, 23540716, -20203526, -5363878, 1321776, 30130270, -5558225, 7074348, 34983044, +-3200825, -20090246, -4966593, 12611635, 1735167, -8726837, -20369420, 11212012, 7918309, -14141717, +-8480950, 9126269, -17291002, -14445049, 4162897, 6629282, -459562, 4483409, 2919504, 5308580, +-6585259, 5569499, -4163434, -5442261, 5116917, 1959579, 7233262, 1270237, 49086644, 22958210, +5514201, -1468342, -53490060, 25012278, 33659660, -24167244, -17597554, 41599980, 27117886, -33199024, +-35286376, 1295470, -20618528, 9035001, 3438121, 8628589, -33172716, 8730595, -6437619, -16474958, +29504814, -1993939, -4900021, 9976135, 24739012, 22286048, 15211700, -28338194, 624381, -13793824, +-30271466, 11098732, 8571144, 18717468, -6397354, -14049375, 38737384, -27742804, 12277164, 13527536, +10941429, 8389145, -4818954, 22969486, -21242908, -36604396, -6169184, -41938744, 36870148, 22737020, +36178120, -2849711, 7109782, -29143500, 30376694, 38402376, 13732084, -16221555, -42973296, -9803263, +-56688200, 911607, -10579578, -38356204, -32639604, 15006079, 2353105, 23721104, -18323404, 27182312, +22767084, -32075890, 6772627, -19127636, -5478768, -28967406, 3647501, 84664544, 21050172, 24902758, +30935576, 13914083, -24062554, -3207804, -402653, 20162724, -4671851, 20718922, -9413495, -12613245, +428423, -1336272, -23790360, 20496658, -3852049, -5706938, -7442105, -16502875, 2297271, -7728257, +-10705743, -15320148, -12251394, 7660611, -8880919, 7510287, 8304856, -5780489, -10000831, -13190381, +5989869, -2254858, 5564667, 20565914, 12589623, -59593, -1822140, 6717866, 12619151, -12421582, +11109470, -12517682, -9677635, -6501507, -34489124, 14126684, 10612864, -16615081, 4898947, -8913131, +-51514912, -14174466, 11923903, -6641630, 4959614, -29046864, 36325760, -49384608, 3209951, -36374616, +24137716, 26567594, 8295730, 22110492, 1924682, -24241332, 39485780, -19462644, 3626026, -131533, +-23657754, 37287296, 2057826, 9114457, 7752953, 11120744, 5755256, 27750858, 33030446, 10596758, +38691748, -34850440, -3179887, -719407, 49633180, -10327249, 39464308, 21613886, 54438712, 10096931, +-13014825, -18253074, 21309480, -41828148, 38262252, -24119462, -14373645, -7216619, 7292318, 28703266, +-7417409, -54010824, -15349676, 85661512, 5865315, -55067924, 12903692, -36701032, 10173704, 84393424, +-23939074, -23976654, 58525908, -64404644, 31655520, 13942538, 18722836, 54732380, 34507916, -49932752, +60109676, 39291436, 1305670, 64012728, -27099634, -9491878, 46292232, 30275224, 5084168, 12001212, +-568009, -1190243, 5151277, 15524696, -15023796, 16444893, 16928614, -15033459, 7057705, 11306501, +-21284784, -2423972, 7280507, -2430952, 3460670, 25904022, -54224, 17108466, -9767293, -209917, +12269648, -8435316, -7130183, -17749490, 2492692, 15392089, 10087268, 14481556, -28314036, 15183783, +17725330, 7885023, 2720862, 7182259, -1742146, 16224239, 29122562, 6929930, 13814762, 13231720, +-7295002, -8043937, 13629542, -17837536, 6533182, 21031382, 28759638, 55328304, 27262842, -27252104, +35153232, 10227928, 31649614, -9737765, -60189672, 60170344, 52056076, 31911070, 98784248, -9691057, +-83984328, -43519292, -39964672, 87743496, 64167348, 15281494, -6236830, -16480863, -58941448, -28051506, +-19541564, -33848100, 89034672, 72438920, 100494184, 1557999, -116409184, -180537344, -88581016, 100124280, +134815808, 138098768, 55082420, -114971976, -211450896, -129483600, -65932580, 96991632, 164600320, 93664648, +50338628, 13450764, -75295072, -100406136, -75722960, -5835250, 57402236, 117700896, 140162496, 24905978, +26817238, -111965504, -186105760, -98952824, 91629368, 154969392, 146244704, 91710440, -54681376, -180370912, +-117513528, -151249424, -196495, 102584224, 110147656, 55569896, -44787384, -94945080, -84919560, -66521528, +18937048, 63230508, 43695924, 127927208, 45457932, -28587302, -76354856, -28027346, 84505632, 124579824, +41313828, -4802847, -76911592, -15412490, -17837000, 49240188, 17942762, -12469901, -53335440, -15726023, +2281165, -8392366, -16450262, -3366181, 11846057, 26725970, 44409424, 21805012, -44923212, -39390220, +-37584184, 8978629, 46812996, 52789444, 23822572, 5743982, -34235720, -14410689, -66530656, -58237608, +-5582384, 17456894, 72030896, 109260208, 40970768, -37848324, -90406912, -111916112, -47491064, 88172456, +144818240, 99920800, 29904246, -72689640, -119256208, -57994408, -702227, 21912924, 21101712, 50888920, +25439628, 11517492, -30572114, -63838248, -48721036, 7090454, 32094680, 64072860, 29829084, 11056856, +-12150999, -31938450, 37855840, 5827734, -53692460, 7426536, -13616120, -21278342, 16786342, -16189879, +-6130529, -28504624, 2188286, -10580652, -21129092, 9181029, -1918777, 7778723, 4045859, 18529562, +-17121350, -5411122, 6003291, 2517388, 8926553, -6978785, 18712636, -12224014, 13084081, 6497749, +-5253282, -12865575, -5164162, -24596740, 28038620, -1894618, 1584843, -4172561, -5863704, 2108292, +-115427, 1313186, 11278584, 6924561, 386010, 15977815, -12577812, 5355824, -11904039, 14426258, +9150965, -9822053, 8051453, -12125230, -13627931, -11005854, -21403432, -1803349, 17364016, -14576045, +-29368450, -20046760, 2523293, 18916110, 1098438, 14237817, -27907086, -6989523, -2609193, -2087891, +-27269284, -6515466, 1651415, 4568235, -9313100, 29637958, 12458090, -9006010, 27602682, -2261300, +-47400868, -1620276, -6295349, -3956739, 9984725, 6454262, 13495324, -14696304, 21387326, -35038344, +10917807, 6569690, -781684, 301721, -1591822, -2139431, 12566537, -1938641, 2807835, -5047661, +187905, -10106058, 3364033, 326954, 21368536, 66035, 9873593, -9291625, 1882806, -4565014, +-11463268, 3988951, 433255, -5847061, 15475304, -2610266, -3069291, -5787469, 11564199, -3934190, +-19683836, 4363687, -3278671, 6480032, -7937100, 1064615, -1750199, -12363063, 12310450, -10934450, +8729521, -10452340, 6394133, -869194, -3150359, -6048925, -28829968, -47554952, -74947176, 3175055, +62592704, -23360864, -37768868, -40370008, -38153268, 8489540, 8391829, 72116792, -9980430, -9842454, +-31503048, 4024921, 10085120, 23025320, -23592256, 12603045, -17058536, 28530394, 9323300, 9658308, +3749507, -16996796, -9134322, -10910291, -3395709, 10637560, -10170483, -8799851, 20153598, -17597018, +-10926397, 16844324, -15226196, -5239323, -13024488, -21328270, 8052527, 14805826, 2968359, 13981729, +-20184736, -4730370, -278636, 12395276, 15060303, 18757196, 1598802, -1411971, -30537754, -31205622, +-11414949, -9778030, -6629819, 15065672, 20251308, 28673202, 3409130, -12346420, 28532542, -19661286, +-8725763, 13080860, -8551280, 37593848, 2174864, -5658620, 6565395, -13025025, 11034308, 26209502, +21325586, -7075959, 8238284, -24429774, -16023449, -8732205, -5896453, 19041738, -2136209, 18606336, +5063767, -5427228, 2428267, 3768834, -21383568, 13401909, -15765751, 10484552, -7104950, -3987340, +-884226, 12331388, -11001559, 1928977, 2220498, 10837276, 18317498, -8680666, -2469069, -13859323, +-5554467, 5487895, -5433671, 4468377, -4202089, -5373541, -9772124, -15185931, -8433168, 14825690, +-5407901, 7559680, -10084046, -1882269, -615254, -2758980, -9024800, -3653944, 1245004, -573915, +326954, 517007, -13766444, -1792612, -2968359, -2401961, -18254, -331786, -458488, 19676856, +-48499844, -113441360, -86673512, -9976672, 37591164, 97933304, 82705504, 78947408, 80641768, 53213572, +22452478, -29025388, -51478940, -98328984, -72421736, -71191768, -70950176, -44144748, 42890616, 57752816, +84897544, 65158412, 54626080, 18022220, 36456756, -8178155, -9375377, -11425150, -19862614, -37238976, +-30461518, -62727996, -22797150, -49818400, -23684598, -11780022, 16371878, 3266323, 23402740, 5402532, +32754494, 24040542, 39611948, 52576844, 65375844, 41773924, 28128814, 46410344, 3648038, -15801722, +-57268556, -67242544, -92423936, -82455320, -77014136, -29546154, -50523312, -26491358, 3172907, 13933411, +32726578, 62279172, 66469452, 74185896, 112173272, 63084480, 85959472, 59528248, 13653701, -9144522, +-35116728, -89731528, -98018672, -93437552, -103546296, -76134200, -52995064, -42642584, -11571716, 21776022, +36666136, 46416784, 69224672, 73356968, 77413024, 72982232, 45637784, 31731218, 15218680, 1593433, +-84289, -22115860, -35942972, -52172580, -61844308, -65848292, -62116500, -43814572, -19519552, -17706002, +-6530498, 11581916, 31139050, 38534984, 73295224, 51481088, 40880036, 40605696, 14847165, -1808718, +-10393284, -13100187, -13606993, -35614944, -31688806, -23176718, -23957864, -17803176, 2532420, 5350456, +7217156, -4462471, 11850352, 140660, 13989245, 14011794, 4878009, -5135171, -357556, 2819646, +2206003, 1956895, 6767795, 1156957, -3025268, -10609643, -2102923, 1983738, 8053, 6002754, +5268315, -1473711, -657130, -4804995, -3190087, -2823941, -1261110, -2446521, 1765232, -1743757, +-617402, -950798, -2094333, -4354023, 29528, -464393, 2777233, 5421323, 4323959, 2544231, +3782793, 185220, 380105, 331249, 1015223, -1130650, -767725, -1467268, 365072, -576063, +-2053531, -2494302, 231391, 163209, -239444, -2229625, -2304787, -2415919, -2183991, -1312649, +1249836, 1064078, 2116345, 2105608, 2078764, 129923, 1161789, 821949, 1349694, 1102733, +2400887, 1823214, 1890859, 54224, -1342714, -2214056, -1748052, -2559801, -2193118, -2351495, +-1880122, -2445984, -1537598, -900869, 12348, 423054, 1247151, 1659468, 2736431, 2810519, +3400004, 2326799, 1705639, 797790, 542777, -890669, -1589675, -2235531, -2376191, -2357937, +-1411971, -1159104, -619549, -324270, 166430, 182536, 581431, 563178, 661962, 550293, +535797, 281857, 249108, 101469, 90731, -9127, -37581, -84289, -87510, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -9311489, -7208566, 353261, 3310883, 3283503, 9331353, 4386772, -3447248, -4356708, -6072010, 4347044, --5311801, -3867618, 869194, 1332514, 577136, 5469641, -1786170, 5111548, -1307818, 4587562, --4346507, 2007897, -1918240, -4655208, -323733, -8873939, 1334661, 2167348, 3969624, -3246995, --47245, 3449933, -2540473, 3876208, 3664681, -2207076, 2633889, -2954401, -1363115, -2188286, --3172907, -4052302, 3625489, 5332202, -3991635, 2359011, 4305705, 3464428, 5269925, 647466, --781147, 3049427, 2334852, -5576478, -202400, 628676, 364535, 1750736, 3616363, 792958, -1318555, -1946694, -1210644, 2535105, 3594351, 1980517, -1886028, -3339874, 3706557, -3017215, --961536, 2049236, -609885, -154082, 1588064, 353261, 114354, 3328600, -3263102, 2473901, -1372779, 1614908, 3107946, -1266479, -343061, -1067836, -417686, 104690, 1530619, -1225676, --202400, -854699, -461709, 26307, -100395, -508954, -324807, 315143, 467078, -35433, --177167, -361851, 68719, -134218, 72478, -508417, -86973, 453119, -1046361, -518617, -3697430, -1941862, 2712809, 270046, -215822, -7494718, 1218160, 6404870, -3911642, 2652142, --7956964, -8054675, -2643552, -6548215, -5709622, -852551, 1197759, 4515085, 732829, -2161979, -1036161, 3075197, -3948149, 5501853, -3705483, -4017405, 4671314, -2308545, 5379447, 6822019, -962073, -4908611, 3457986, 2254858, 1397475, -2494839, -1794223, 2868501, 2409477, 492311, --5536213, -1597728, -5112085, 4641249, -4611721, -3016141, 3433826, 166430, 2983392, 852551, -1158567, 5049271, 875636, 5662378, -7272454, -3741454, -1663763, 3619047, 5135171, 5845988, -7973607, 866510, -2241436, -757525, -1043140, -240518, -5143224, -2260227, -2223719, -627065, -822486, -4189741, -2456721, -944893, -1759326, -3275986, 3963181, -3938485, -1317481, 2623151, --6722698, 2040110, 3706020, 4081293, 2174864, 1182727, 2473364, -1199370, -2590402, -661425, -732829, -282931, 733366, 127238, -699543, 49929, -1020592, -1235877, 1531693, 673773, --110059, -13959, 17717, 1137630, 559956, -448824, -436476, -469225, 115427, 839129, --970663, -173409, -25233, -190589, 587874, -32749, -374199, 8527658, -6336688, -2383170, --1255204, 5239860, 4730370, -4791036, -442382, -8886287, -1945083, 10754061, 4049617, -4339528, -7722888, 2512019, 2967823, 779000, -2595771, -8482024, 1134408, -3825742, -2418067, -1558536, --5166309, -1837709, -3999688, 2778844, -1811939, -2349347, 4831838, -9128953, 8387535, -2967823, -1190780, -2866354, 2616709, -351114, -840203, -236760, 3569118, 165356, 2255932, -3270618, -6283001, -4899484, 7316477, 1546725, -726386, -4109747, -4809290, 9935333, 1713155, -9337796, -9534827, 8975945, -4883378, -1801739, 2820720, -3694209, -688269, -2281702, 2254858, 5720360, --3490198, 1297617, -2614561, -2401424, 937377, 7704635, -7080254, 4280472, -7297687, -5623723, --5271536, -944356, 141197, -18790, 4411469, 6818261, 1779727, 1642825, 3333432, 2690797, -1490891, 1680943, 1996623, -756451, 2150168, -1001801, -2121714, 3620658, -188442, 484258, --666257, -1096827, -638876, 6979, 1531693, -406411, 338766, 136902, -1374926, -4832, -751082, 950262, -118112, 662499, 2240362, -3468186, 197569, -6659347, 6029061, -9280351, -188442, 9354439, -17450988, 11879343, 4650376, -4753455, 3629247, -506806, 10331007, -1250909, --8837432, -6215892, 3369402, 3915400, 1012539, 137976, 4303021, 1187022, 579821, 5902359, -2324114, 1585917, 4208531, 2993592, 14799384, -4249334, 3830037, -352724, -2602213, 3743601, -2263448, 1383516, 1750736, -2583423, -4285841, 141197, -153008, 81604, 2017024, 4430796, --4800700, -5073430, 1988033, -1314260, -2038499, -3089155, 5936182, -4495220, 8644695, 4003447, -240518, 1936493, 594316, 2276870, 11023034, 9258876, 565325, 404801, 1998234, -2371896, -4032438, -1045288, 3621731, 1038308, 96637, -117038, -4914517, 4441533, 3342022, -1140314, --2888366, 259309, 4242891, 311922, -1382443, 133681, -3475166, 2291902, 759136, 2953327, --962610, 795643, 1139777, 1167694, 929860, 1729798, 727997, 709743, -4203699, -345745, -1432909, 2166811, -1538135, 1369021, 1211181, 1107028, 1217086, 477278, 907849, 1220845, -1334124, 131533, 418759, 325344, 527744, 113280, 228170, 823560, 204011, -278099, --1053878, 461709, 1211181, -1126355, 2188286, -1037772, 4825933, 97174, 5572720, -2154463, -4939213, -3765076, 10352482, -7946227, -2984466, -3797825, 10672994, 6044630, 3907347, 6781754, --6163815, -1249299, 9843528, 5594732, 4603668, 4786741, 2527588, 3287798, -1162326, 9463424, --1016834, -4361540, -3274376, 3317862, -3606699, 2169495, -8990440, 3317862, -1755031, 178778, --9659918, 4152697, -2105608, 9037148, -1516660, 2866354, 2433099, -3796751, -992137, 4125316, -518617, 2833605, -2085744, 5022428, 7050189, 913754, -5006858, 1918777, 4939213, 3588982, -605590, -3374771, -7038915, 5872831, -7832410, -3266323, 4299263, -10284836, -2422362, 6419903, --4825396, 1372242, 24696, -550830, -1444183, 2631741, -5207648, 317828, -8652212, -4409321, --11802033, 923418, -3362960, 296890, -2346126, -324270, -3058554, 2731062, 2494302, 1082869, --1932198, 2528662, -360777, 1017907, -3462818, 913217, 609885, 1137093, 656593, 2377801, --385473, 2677912, -1236951, -115427, 1730335, 2521146, 291521, 1424855, -1676111, -533113, --543313, -546535, -1234803, 834834, 1818382, 595390, 1921998, -1846299, -1257352, -1000191, --2771865, 357556, -498753, 1336272, -477815, -446140, -2903935, 2960843, -18807124, 3463354, --5826660, -3331284, 4493610, 3433826, 2462627, 964757, -13776644, -1342177, 4487167, -7358353, --1810329, -10113574, -5060545, 2399813, -1066763, -9307731, 9963250, 6032819, -2851322, 1165547, -7871065, -4887136, 2225330, -3315715, -5235565, -3580392, -9591199, -3546569, 7498476, 3548717, -9539659, -4670777, -15213311, -6562710, 3904125, -4857071, -9866077, -1624035, -1738388, 9206799, -4804458, -10597832, 7259032, -7486665, -325881, -5395016, -5120675, -4939750, -11667279, -6932077, -986232, 7632694, 11559904, 7379291, 2247879, 4604205, -5115306, -8710731, -5299453, 5585605, --2575907, 6019934, -1703491, -5524402, -175020, 551366, -2586107, -6231998, 489626, 4760971, --15236396, -10098005, 14413910, -4610111, 389231, -7856032, 3878356, 2157684, -830539, -579821, -5335423, 3904662, 1276142, -1606318, -1855963, -326418, -2084670, 1260036, 1636919, -2998961, --1430224, 1148904, 437550, 28454, 993748, 3002182, -3083250, -1439351, -5717675, -2345052, --781684, -1067836, 383326, 843961, 1741072, 134218, 2207076, -2499671, -1715303, 460098, -601295, 858457, -2028298, -1159104, -2830384, -124554, 1053878, 7065221, -380641, 3485366, --5144297, 3461207, -6963753, -663036, 11621108, -5742908, 10970420, 11110007, 13757854, 3296388, -5407364, 11821897, 9239012, 6730751, -9473087, 1021665, 2785823, 7861938, -1742146, -7102266, -8789114, 8872866, -2724083, 5845451, -3159485, -3357591, 5539971, 4711579, -833761, 5626407, -371515, -9730785, -7756711, 8035347, 11816529, -1145683, -4275103, 2318209, 235149, -5907191, --10815265, 5367636, -10231686, -5131412, 7599945, 1421634, 6711424, 75162, 10822781, 1301375, -11899207, -14200236, 12565464, -2685965, -592706, 3595425, 6593849, -5604396, -11675869, -3512747, -10506564, -2296734, -12481712, -7549479, -7682623, 1816234, 4389457, -11021960, 5364951, 6000070, -11118060, 3207267, 3447248, -204548, 3074660, 334471, 2391223, 1449015, -8241506, -1156957, -3823058, 2480881, 6546604, -4588099, -1396938, -327491, 475668, 2898566, 347892, 2347200, -1001801, -1527398, -615791, 2220498, 2230162, 613107, 2438468, 426812, 1047435, 3009698, --12348, -2036351, -965294, 444529, 1551557, -500901, -809601, 2370822, 1321239, 306553, --2759517, -1160715, -1595044, -1643899, -166430, 2539936, 120796, 2399276, 1904281, 1509144, --226023, 115427, 3729642, 12017855, 1519882, 5000953, 14299020, 15403900, 4580583, 3850975, --11428371, -5792301, 12590160, -9393630, 12869333, 3606699, -67646, -2598455, -4519916, -7478612, -1353452, 5678484, -13872744, -6309307, -5905043, 3044595, 2777770, 3006477, 423054, 2323041, --510027, 4146254, 3394098, -3710852, -6502044, -12020540, 2114198, -6511171, 10824391, 398358, --6003291, -7577933, -2299418, 4988605, -9403831, 5852967, -3139084, 1904281, -97174, -6742562, -6670621, 8387535, -5763309, 7050726, 2040646, -585189, 20230370, -5124433, -13090523, 2444373, -4951561, -3318936, 1117228, -5746666, 13748727, 7941395, -1336272, -2976949, 9774272, 9271224, --1920387, -7982734, -5737003, 19049790, -1725503, -2671470, -7664369, -5040144, -1500554, 1814624, --1959042, -5123896, 8265128, -2648384, 9802726, 2786360, -3032247, -1122597, 1793686, -100395, --1622424, -1751273, 3490198, -4388920, -1012002, -1212791, 5696737, 468151, -1169842, -192737, --2813741, -2734821, -292595, 517544, 5981279, -1443646, 3576097, 1287953, -1850594, 1158567, -317828, -2922188, 2287607, -1484448, 3132105, -356482, -3033858, -2354179, -1692217, -2369211, -55835, -791885, -889595, 998043, 1187559, 1591285, 716723, 5102421, -10403485, -2849711, --3186329, 1008780, 4613332, 10517301, 9204652, -14371497, 461709, 1839320, -1340030, -4195110, --9863392, -888521, 3498788, 6073084, 4956929, -9039296, -1472100, -11494406, 11025181, 613107, --956167, 5374078, -5056250, -813359, -12262669, 2213519, -7271917, 5239860, -846109, -1941325, --4067871, -8089571, -7875360, -816581, -9743133, -15947214, -2871723, -7197829, -15336791, -1127966, --1213865, -8329552, 5652177, 8614094, -942208, 4170950, -959388, -1219771, 2412161, 2630131, --12406013, -3567507, 6972343, -5908802, 15077483, 2826089, 4100620, -9539122, 12348, -4241280, --9752797, -930397, 14000520, 6565395, 10662256, 5985037, -4498978, -11084774, -17411260, 11877195, -12152073, -1315871, 6328635, -13535053, 6638946, 5713917, 9912248, 1599875, -11588359, -1381906, --10795937, -3657702, 1004486, -3415036, 2408940, -2302103, -3518115, -817654, 1151051, -419833, --1086090, 3332895, -904628, 1367410, -7814693, 265214, -556198, -1130113, -3495030, -1403381, -2466922, -3210488, -3786014, -1273458, -1305670, -1477469, 69793, -824634, -4203163, -3337727, --2055142, 1333587, 1516124, 2635499, 1275605, 2429341, 868657, -2977486, 703838, -387621, --1833414, 1272921, -3524021, 1653026, -1878511, -204548, 2496987, -26996016, -6667937, 21667574, -7321309, 8902930, -5499169, 8989367, 15148887, 1213328, -2411624, -24930138, -5721434, -1070521, -14475650, 4144107, 5877663, -18654654, -4926865, -6873559, -4341138, 11761768, -6455336, -2184528, -2150705, 3437048, -5794448, -2493229, 3143379, -5145908, 11598022, -12759274, 1527398, 8563091, --10879689, 9131637, 15506443, 17986786, 8732742, 8847633, 11887396, -7967165, -14631343, 5983427, -6564321, 9854802, 7915625, -16611860, -4605279, 8857833, 5217312, 3273839, 10627897, 2435247, -12356084, -4460324, -2479270, 7063074, 6609418, 2025077, -10598369, -5672041, -11395085, -13153337, --611496, -14394046, 927713, -8351027, 762894, -7590281, -4361540, -18514530, 12986907, 3449396, --2598455, -3266860, -1924682, 2549600, -6707129, -902480, -16000901, -8801999, 5798743, 7376070, -3184182, 2513093, 803696, -8426189, 4055523, 3927211, 3186329, -8051453, 2027761, 365072, --6274411, -2129230, 1300838, 1063004, -3144453, -4799626, 1777043, -2337536, -2786360, -693637, -884226, -563178, -180926, 1682554, -1321239, 2325725, -203474, 3300682, -1255741, 2952253, -4763656, -3210488, 2741800, 256624, 1969243, -1967632, 3221, 2670933, 2323041, -3964792, -2328946, 2127083, 17065516, -8222178, -7027640, -6220187, 11768210, 14925011, -9272298, 23913842, -5065377, -10137197, 12264816, 3540127, -9884330, -11620034, -9375377, -704912, -5012227, -3414499, --15512348, 6295885, 6528887, 21571474, 2959769, -3617973, -9667435, -10120554, 2618856, -1151588, --13568875, 2464774, -5007932, 704912, 10547366, -8079371, 13935558, -12149389, -10218264, -641561, --15928423, -19046032, 3131568, -2137283, -22009560, 1576790, 282931, -10437307, 5534602, -5043902, -2808909, -14843944, -24295020, 16020228, -14856829, 24790552, 13526999, -17629230, -2246268, -17864380, --4813048, -2219961, 7452842, -6402723, 11364483, 14360760, 13600551, -9756555, -7980586, 1321776, --12015171, -1072131, -3911105, -15822123, 9498320, 7078643, -8445516, 12542378, -18553722, -1734093, -1120987, -4813048, -3122441, 16173773, 11918534, 7977365, -967978, -8372502, -6817187, -6300717, -2794950, 2644626, -512175, 1870995, -490700, -701153, 340376, -633508, 648003, 3259880, --3835943, 1571421, -277562, 3583077, -2071785, -327491, 2038499, 4772783, 1867774, 3859565, --4562329, -4927401, 2348810, -3268470, 784368, 19327, -5322002, -2921115, -3185255, 95563, -1716376, 1613297, 1040993, 1282585, -765041, -14761266, -11299522, 6895033, 8423505, 9339406, -16013249, -6328098, 29722248, -1238024, -15840376, 6482180, 14503568, 3753802, 7483981, -6880001, --16939888, 24739012, 13613973, 9963250, 4575214, -8965744, 7779797, 20554640, -7947300, 4176856, --488553, 4095251, 3313567, 14561013, -4554813, 4757750, -5518496, 4224101, -1686312, -1091995, -8955007, 1667521, -18685792, -12651900, -17525614, -12121471, -9418326, -4846871, -13474923, -7776575, --6747931, -11758010, -8218420, 4758287, -12215961, -4425964, -9538585, 21910238, 11048803, 19035296, --17764522, -1947768, -16251083, -3686156, 17693118, 9563818, 20890184, 9772661, 12838731, -14199699, -6038724, 5857799, 19332184, 19561966, 5716065, 17669496, -15716896, -7707856, 11298985, -40936408, -499827, 6364605, 618475, 9772124, 6284074, 22593138, -2000918, -3484292, 24592446, 7180649, --2428267, -11434277, -448287, -128849, 20117090, 2378875, 328565, 1320703, 3893925, 6017786, --1352378, -1481227, 6347962, 2826625, 1921461, 3140158, 4552666, 3354906, -455267, 476741, -440771, 6458557, -1409823, 3250753, 6348499, 4500589, 7108171, -3532611, -2630668, 1402844, -2169495, -2800856, 9127, 3879966, 6592238, -754304, 1832340, 697932, 17507898, 11383274, --11445014, 22373558, 13288092, -1123671, -5568425, -2806224, 13444858, 33039036, 17666274, 4751308, -1395864, 10853382, -2635499, 26665842, 15094126, 16653199, 697395, -8496519, 5672041, 1999307, --14161581, -3506841, -874026, -3365107, -4020090, 5397700, 2974802, -11653857, -5551782, -20580946, --2080912, -6416681, -26422102, -11908334, 837519, 9868224, -13577465, 16990354, -4676146, -4104915, --2276870, -4198868, 12428562, -8379481, 8703214, -27171036, 8443369, 11780558, 9181029, 18017924, --17792976, 15418396, -15963857, -12027519, 13452374, -7911867, -2319282, 11172284, -18103288, 16041703, -25898652, -601295, -3681861, 32876364, -7022272, 6263673, 18655728, -39695700, -20198158, 1258425, -1289027, 5283347, 9614284, 19175956, 11677479, -15245523, -12046310, -3695283, -4235912, -20565914, --1901597, -4184909, 5146445, -21490942, 344671, -6555731, 8798777, -3344169, 11178189, 2853469, -205622, -6455873, -4538170, -6080600, -6192269, -4962298, 4476430, -13131326, 9439801, -1686312, -5313949, 177704, -701690, -9016210, 5005785, -6448357, 1748052, -6845641, -3512210, -198642, --2816962, -7839926, 718333, -2568391, 1002875, -5394479, -5611375, -6317897, 1273995, 1148367, -7955890, 8143258, 106300, 10737, -9960566, -5936719, -31372588, -18854906, 23170812, 23038204, -2513093, -5401458, 19544786, -31470836, -16874926, -34055332, 14954539, 4176856, 1556389, 6649146, --15470472, 7894687, 10833518, 14186814, 24017994, 24679418, 20742008, -797253, 4723927, 309238, --8965744, -1823751, -7479149, -3846680, 28615220, -6634651, -26226680, -6601902, -5361193, 2386928, -41210212, -14846628, -14714021, 13967771, -22250078, 7744900, -24693914, 32352378, 9176198, -871342, -8334921, -12437152, -15735686, 22174380, -26884884, -21482890, -19307488, 5395016, 8135205, 10103911, --17909476, 18447958, -5644661, 1414118, 28427852, -1913408, -4779762, 8381092, 22952306, -14803142, -38034084, 1433982, -43725988, -5301601, -1635846, -14593225, -4168266, 15032, -4046933, -11915313, --9993852, 21559126, 14482630, -5280663, 14016626, -25121800, 7108171, 11290932, 7064148, 835908, -13503377, -2195265, -542240, 5057861, 13204340, -5424007, -5680094, -4463008, 662499, 4991826, --2474438, -10349797, -11089606, 569620, -5172215, 3891777, -70867, 2753074, 5984500, -7232725, --4727149, 12559558, -2826089, 2289755, -893353, 353798, -4204773, -4746476, -2336462, -1578401, --6582575, 3244311, 6177237, 3434363, -30065, 589484, 2838974, -5094368, 1266479, 5856725, --488553, 5027259, -2736431, -9073655, -12213276, 314069, 5277441, -9043591, -4212289, 41611792, -24591908, -33838972, -27376658, 33463700, 31887448, 19898046, 22870164, -40256728, -8965744, -11210402, -10414759, 3738232, -16353088, -29773788, -45028976, 12970264, 11674258, 3325915, 12173011, -6280853, --2419677, -10799695, 8740258, 15377594, 13770202, 3491809, 18350248, 5790690, -2267743, -7699803, --27441620, -1615445, -11645267, -9657771, 9313637, -29404956, 2448668, 1033477, -13825500, 11803107, -10778220, 5268315, -19862614, -18459770, -48438104, -12428025, 165356, -15604690, 2546379, 10052908, -9975062, 26846766, 13063143, -12064563, -8541616, -18073222, 22515830, -9681930, 39105140, 32694364, -8913668, -21115670, 43190728, 19822884, -17762910, 2557653, 21604222, 50334868, -21047488, -38707856, --20096688, 399432, -14108968, 5960878, 13721347, 11493869, -10324565, -15902116, -8919036, -13254806, --14621679, 3880503, 15479062, 12407087, 6843494, 6123013, 2080375, 10420128, 1224603, 1578937, -15122580, 11906186, -911070, -5147519, 3255048, -8097624, 8317204, -3150896, 8516920, -4580046, -3280281, 2176475, 5554467, 7330436, 4162360, 3357054, -7454990, -14355391, 1471026, -7334731, --3887482, 4205310, 1066763, -2201171, -2989834, 10210748, 3170223, 13849122, -4694936, 7373385, --7218230, 7154342, -9867687, 9516037, 128849, -8303783, 16362215, 5645735, -6147172, -16498580, -13246753, -27743878, -25694104, -9438728, 19360638, -11578695, -14742475, -435402, 22354232, 2105071, -23110146, -8121783, 27962384, 2981244, 14840723, -10188199, -6930467, 8671002, -29458644, -8397735, -10700911, -5457293, -4215511, -23720030, -22455162, 10046465, -13808320, -9949292, 17897666, 24694988, --3946001, 16165720, -29767344, 1575179, -8281234, 38078644, -16065862, 12538620, 23205172, 22134114, -6278169, -15787226, 9683541, 6937446, 6546604, 12179990, -37963216, 69450696, 22033182, -6286759, -3446175, 7646653, 19123342, -5529234, 14675366, 40447856, -2518462, -50347756, 20783346, 17328582, --18025440, 23449984, -5388574, -10650982, -27106076, 51892868, -26978838, 57794692, -38331508, 14203457, --918586, 62804768, 27736362, -27005144, 25626996, 1016834, -16889422, 12538083, 1787780, 5586679, -13909252, 5889474, -16340203, -4305168, 19026706, 5048734, 10699837, -8928700, 11844446, -20391968, -7390028, -1234266, -6710350, 12539157, -7164006, -4035122, 8942122, -1632625, 1213328, -1685775, -15137612, -10087804, 14770393, -8886287, 13655312, 19216220, 7034620, 5153961, 10537165, -2854543, --7721278, -7463043, 9077950, 3118683, -1654636, -201863, -2523293, -13932874, -10774999, -2219961, -319975, -3225521, -8215199, 47862580, 5806796, 26023206, 13331042, -26200912, 1743757, 15671799, --4588099, -22813792, -4276714, -49846852, -13864691, -18528488, -10653666, 10961830, -1348083, 17928804, --8643622, 1994476, 17521320, -15455977, 1795296, 9978283, -859530, -16969416, 91268, -11644193, -34564288, -5993627, 20084340, 3276523, -213138, 35358856, 25565792, -15511274, -18130130, 8992051, -16112570, 19419158, 23662048, -403190, 8429947, 22351010, -1086090, -8954470, 7117298, 804770, --19656454, -430034, 13165149, -19449760, -26097832, -2465311, -1456531, -2797634, -8671002, -9461813, --31117038, -4295, 30814242, 9463960, 17202418, 10098542, -3983582, -40372692, -29484414, 7975218, -26275000, 8548596, 13348221, 53069688, 55234352, 46629924, -3563212, 23182622, -14635638, -39127152, --65112240, 11361799, 8188355, -2894808, 9208410, -20623896, 4573067, -5012227, 24068460, -1781338, -19358492, -23625542, 11797201, -29016800, -5476620, 12276627, 2238752, -14766098, 3625489, -12159589, --13018583, -5604396, 3651796, 11110007, 14496588, 18853832, -4369056, -1004486, 5046050, -5151814, -6238977, -19510426, -16470663, -11573326, -15395847, -15022722, -15720654, 10365367, 7740605, -2641405, --10230612, -15908559, 9905268, 183610, 15527917, -3724811, 13798656, 10008348, 870268, 4323959, -16514149, -19417548, -17979806, 11209328, -1350230, -3846680, -8477729, -15013595, -31344672, 8661338, --18883898, 8934069, -8324184, -22174380, -7012071, -317291, 10695542, -9466645, 5345087, -32454920, -30012158, -67833104, -6964827, -17070884, -14056891, 8912057, 38540352, 6072010, 13865765, -33478196, -7285339, 12144020, 26436060, -13992467, -21729850, -15095736, -7489886, -1153199, -753230, 15968152, -11543261, -9622874, -49052820, -23337778, -39921184, 4491999, 69927976, -49710488, -19812148, -7740068, -40345848, -13660143, 16965120, -13057237, 19364396, -7837779, -11988327, -25268904, 12826920, -29266980, -26834956, 48631376, 6113886, -9084393, -9259413, 40321688, 10579041, -459025, 21223044, 6919729, -7582228, -7873212, 46588048, -73550776, 53046068, -44850732, 21104396, 52428664, -42284488, 85072024, -57886496, -21922586, -7431904, 58480276, 21240224, -5647882, 38427608, 34481608, -45117020, 60339996, --36705328, 10664941, 11431592, -16288127, 11508902, 19660212, -12360916, -22203370, 7031399, -12006581, -4977330, 4984847, -6227703, -17426830, 6761353, 6104223, -7243999, 7202660, 5719823, -14043469, -34078956, 3628711, 563178, 625992, -7082938, 5133560, 4463545, 1707250, -11301133, 5691369, -1422708, -4985920, -9928354, 21020644, -8149164, 17073568, 19471234, -2110440, -7416872, 5057861, -4677757, 7484518, 23499376, 20217484, -18413598, 8354249, -7568806, -1220308, 26863410, -5374078, -7395934, 10456635, -1822140, 49576272, 47245712, -40379672, 39336532, 36202816, -34082712, -51423644, --75990320, 17662516, 113978768, 46814068, 150324, 23501524, -109073376, -45059040, -3927748, 16583942, -81948512, 80216032, 13782550, -30966714, -60473676, -35437776, 4018479, 25885232, 39133056, 63073744, -38016368, -50876572, -120268744, -97982160, -9711458, 108990704, 118508888, 74907984, 22803592, -25206626, --48505752, -73189464, -41815264, -44527000, 87150792, 72575280, 45768244, 40587976, -61814244, -86485072, --100442104, -89874872, 34507916, 121685552, 149747792, 50645180, -45512696, -106705776, -128080216, -34835404, -20484310, 13207561, 79959408, 31400506, -30369176, -17949742, -61758408, -13471165, -70592080, 30496416, -83406120, 156241776, -9626095, -83560200, -181633088, -7111392, -61508228, -6534793, 86851752, 17223356, --8134668, -38827580, -81912544, -53602804, 39107824, 63381368, 20696374, -11084774, -28018220, -33360084, -32327146, 37343668, 22903450, 19995220, 8762270, 18644990, -1986959, 1766842, -18341658, -8407398, -1874753, 47131896, 41020696, -2130841, -17879412, -4583267, -42286636, -28260348, -1284732, 16073378, -43290048, 33538862, 23566486, 2179159, -58849104, -52795348, -35974648, 13852880, 56315076, 109620448, -66880156, -50539416, -91258392, -80380848, -32638530, 2295660, 74815648, 94476936, 70224864, 12411382, --56346748, -127380680, -80533856, 25942140, 78785272, 90319944, 26107496, -13225815, -35366908, -41518912, --24072754, -7653632, 8575439, 19859928, 24829742, 19891604, 4555887, -1738388, -17478906, 871878, --10297184, 51507932, 30177514, -4413616, 11043972, 5681705, -36484672, -3705483, -2859375, 4110821, -1257889, 3047279, -13268765, -5235029, -4822175, -3251290, -5973226, 22024592, -7754027, 9530532, --16372952, -1541356, 6923488, -660351, -4894115, 37953552, 5352603, -21298742, -24774446, 5354751, -5348845, -14506789, 4174708, 19125490, 9986336, 18008798, -18191334, 5663988, -532039, 4420595, --12771085, 2574833, 14413910, 20368882, 5240934, -5148592, 6051609, 2412161, -4600984, 13927505, --20278688, 4728222, -33102924, -10278394, 13832479, -11151346, -13238700, 18183280, -11409581, -30884036, --23891830, 21380884, -2544768, -4093104, 4993437, 10893111, 27042724, -17440788, -22771916, 1095217, --3037079, 18361522, 237834, 10786810, 4982162, -1682017, 28082644, -36326832, -5242545, -5023501, --21310554, 5607080, 12079059, 656056, -12657805, 5787469, -2785823, 3767760, -10934987, 8227010, --484258, 1453310, -892279, -2564096, 14275398, -14126147, 1189169, -2296197, -5052492, -4417911, -1733556, -6028524, 6583111, 8505109, -8617852, -2049773, -3256122, 7811472, 8545374, -4113505, -10515691, 1190243, -1445257, -6877854, 7595113, 2778844, -2931852, -11474005, 5551245, -10389526, -6856916, -5526013, -5083631, 9842454, 9669045, -12957379, 1610613, -2879239, -12864501, 4384088, --7513509, 8663486, -7409893, -29948270, -33041184, -78792784, 22955526, 22704270, -1470489, -66405028, --42877196, -6198712, -10778220, 44588740, 30128658, 14552423, -29318520, -12032888, -7669738, 27964532, -3194382, -7810398, -17151416, 11538430, 5207111, 13970992, -622770, -5538361, -6939057, -15808701, --7815767, -9521406, 26732950, 14331769, 3269007, 4101694, -17376364, -826244, 2266669, 24391656, --1617055, 11426760, -8885750, -6180458, 5086315, -9901510, 6752226, 3010235, 7252589, 23788750, --1933809, 20886962, -134755, 13448079, -10184978, 975494, -15042586, -19559818, -20539070, -17606144, -5973763, 3163780, 1665911, -25976500, 13023951, -22599044, -2416993, 1269163, -14068165, -15307263, --7983808, 365609, -26951456, -18251464, 16982838, -8100845, 15822123, 2571612, -4198868, -14575508, --16769163, -1023813, 24155970, 29824252, -7262790, -2976412, -11040750, -14843407, -10144176, 9552007, -5191542, 3714073, 9458592, -1778653, -6017249, 6508486, 3705483, 5424544, 8294656, -4510253, -2896419, -850940, 339839, -6155225, 10910828, 3456375, 2605435, -3183645, 1709934, -188979, -16924318, 2179159, 5182415, -9370545, 785979, -6056978, 11129334, 790274, 322659, -3835943, -2703145, -1238024, 294742, 5276368, 654446, 6905234, -4527970, 2251100, 881005, -8817568, --322659, 5054103, 2094870, -1815161, 3047816, 17723720, -38173668, -94637456, -90706488, -13784161, -27418534, 91231544, 78849696, 74319040, 79846664, 44433048, 10749766, -40340480, -40510668, -84208736, --65376380, -57342644, -36359044, -45762340, 62986232, 51788716, 68209448, 39307004, 55752432, -2051384, -14689325, -8987219, -21741124, -12471511, -25994216, -30281666, -30121680, -29758218, -35175244, -25796110, --20907900, -2409477, 5558762, 49413060, 41520524, 21835076, 23523536, 32582158, 30298310, 14542222, -70420280, 9116605, 946503, 13167296, -26269094, -80809808, -23079006, -64787436, -69409352, -73409048, --51866560, -46264312, 2342905, 38280508, 39135204, 47711180, 86914032, 62480500, 76279160, 74880608, -47847008, 51355996, 17595408, -18140332, -58650464, -77061912, -87944824, -57293788, -78923248, -66415764, --75776112, -44302052, -5233418, 20716238, 61411052, 58494772, 59500868, 98931888, 69027640, 81767584, -51027968, 8414378, -9553081, -24856050, -40918152, -45957224, -48565344, -47449188, -54562728, -46885472, --34193844, -21117280, -10838350, -8318278, 23771570, 22441740, 31803160, 51208360, 57856432, 36569500, -44219908, 27145268, -1612223, -12094091, -26584236, -33415920, -28511066, -24772834, -29803852, -11020349, --7330973, 563714, 8502425, 9269076, 2427194, 1168768, 8331163, -1321239, -7137699, 6499896, -3978214, 4599910, 7376070, 2050847, 2012192, 4327717, 10233833, 8596377, 4054986, 726386, --2181844, -8805220, -6536940, -8018704, -6817724, -2864206, -5253819, -4750234, -2521683, -2150168, --2786360, -880468, 3349001, 3157338, 4093104, 6346888, 4387846, 3020436, 4216584, 1497870, -1838783, 1742146, 1230508, 1025960, 469225, -1191317, -2535105, -4860293, -3694209, -3993783, --3145527, -1690070, -645856, -1548336, -908922, -1285806, 239981, 1104344, 1921461, 3629784, -3621194, 1396401, 1500017, 648003, -507343, 899259, 720481, 197032, 1230508, 347355, --456340, -1083406, -893890, -1092532, -867583, -961536, -305480, -587337, -673773, -2194728, --2478196, -2471217, -1744831, -421444, 755914, 2049236, 2652679, 2731062, 2934000, 2322504, -2564096, 1744831, 843961, 139050, -344671, -1328756, -2025614, -2451353, -2190970, -2312303, --1879585, -1832877, -1534377, -729071, 135291, 536334, 1236951, 1797981, 2083596, 2003065, -1743757, 1179505, 708670, 124017, -86436, -444529, -532576, -588411, -524523, -495532, --375810, -284542, -155693, -93952, -46171, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +7208566, 353261, 3310883, 3283503, 9331353, 4386772, -3447248, -4356708, -6072010, 4347044, +-5311801, -3867618, 869194, 1332514, 577136, 5469641, -1786170, 5111548, -1307818, 4587562, +-4346507, 2007897, -1918240, -4655208, -323733, -8873939, 1334661, 2167348, 3969624, -3246995, +-47245, 3449933, -2540473, 3876208, 3664681, -2207076, 2633889, -2954401, -1363115, -2188286, +-3172907, -4052302, 3625489, 5332202, -3991635, 2359011, 4305705, 3464428, 5269925, 647466, +-781147, 3049427, 2334852, -5576478, -202400, 628676, 364535, 1750736, 3616363, 792958, +1318555, -1946694, -1210644, 2535105, 3594351, 1980517, -1886028, -3339874, 3706557, -3017215, +-961536, 2049236, -609885, -154082, 1588064, 353261, 114354, 3328600, -3263102, 2473901, +1372779, 1614908, 3107946, -1266479, -343061, -1067836, -417686, 104690, 1530619, -1225676, +-202400, -854699, -461709, 26307, -100395, -508954, -324807, 315143, 467078, -35433, +-177167, -361851, 68719, -134218, 72478, -508417, -86973, 453119, -1046361, -518617, +3697430, -1941862, 2712809, 270046, -215822, -7494718, 1218160, 6404870, -3911642, 2652142, +-7956964, -8054675, -2643552, -6548215, -5709622, -852551, 1197759, 4515085, 732829, -2161979, +1036161, 3075197, -3948149, 5501853, -3705483, -4017405, 4671314, -2308545, 5379447, 6822019, +962073, -4908611, 3457986, 2254858, 1397475, -2494839, -1794223, 2868501, 2409477, 492311, +-5536213, -1597728, -5112085, 4641249, -4611721, -3016141, 3433826, 166430, 2983392, 852551, +1158567, 5049271, 875636, 5662378, -7272454, -3741454, -1663763, 3619047, 5135171, 5845988, +7973607, 866510, -2241436, -757525, -1043140, -240518, -5143224, -2260227, -2223719, -627065, +822486, -4189741, -2456721, -944893, -1759326, -3275986, 3963181, -3938485, -1317481, 2623151, +-6722698, 2040110, 3706020, 4081293, 2174864, 1182727, 2473364, -1199370, -2590402, -661425, +732829, -282931, 733366, 127238, -699543, 49929, -1020592, -1235877, 1531693, 673773, +-110059, -13959, 17717, 1137630, 559956, -448824, -436476, -469225, 115427, 839129, +-970663, -173409, -25233, -190589, 587874, -32749, -374199, 8527658, -6336688, -2383170, +-1255204, 5239860, 4730370, -4791036, -442382, -8886287, -1945083, 10754061, 4049617, -4339528, +7722888, 2512019, 2967823, 779000, -2595771, -8482024, 1134408, -3825742, -2418067, -1558536, +-5166309, -1837709, -3999688, 2778844, -1811939, -2349347, 4831838, -9128953, 8387535, -2967823, +1190780, -2866354, 2616709, -351114, -840203, -236760, 3569118, 165356, 2255932, -3270618, +6283001, -4899484, 7316477, 1546725, -726386, -4109747, -4809290, 9935333, 1713155, -9337796, +9534827, 8975945, -4883378, -1801739, 2820720, -3694209, -688269, -2281702, 2254858, 5720360, +-3490198, 1297617, -2614561, -2401424, 937377, 7704635, -7080254, 4280472, -7297687, -5623723, +-5271536, -944356, 141197, -18790, 4411469, 6818261, 1779727, 1642825, 3333432, 2690797, +1490891, 1680943, 1996623, -756451, 2150168, -1001801, -2121714, 3620658, -188442, 484258, +-666257, -1096827, -638876, 6979, 1531693, -406411, 338766, 136902, -1374926, -4832, +751082, 950262, -118112, 662499, 2240362, -3468186, 197569, -6659347, 6029061, -9280351, +188442, 9354439, -17450988, 11879343, 4650376, -4753455, 3629247, -506806, 10331007, -1250909, +-8837432, -6215892, 3369402, 3915400, 1012539, 137976, 4303021, 1187022, 579821, 5902359, +2324114, 1585917, 4208531, 2993592, 14799384, -4249334, 3830037, -352724, -2602213, 3743601, +2263448, 1383516, 1750736, -2583423, -4285841, 141197, -153008, 81604, 2017024, 4430796, +-4800700, -5073430, 1988033, -1314260, -2038499, -3089155, 5936182, -4495220, 8644695, 4003447, +240518, 1936493, 594316, 2276870, 11023034, 9258876, 565325, 404801, 1998234, -2371896, +4032438, -1045288, 3621731, 1038308, 96637, -117038, -4914517, 4441533, 3342022, -1140314, +-2888366, 259309, 4242891, 311922, -1382443, 133681, -3475166, 2291902, 759136, 2953327, +-962610, 795643, 1139777, 1167694, 929860, 1729798, 727997, 709743, -4203699, -345745, +1432909, 2166811, -1538135, 1369021, 1211181, 1107028, 1217086, 477278, 907849, 1220845, +1334124, 131533, 418759, 325344, 527744, 113280, 228170, 823560, 204011, -278099, +-1053878, 461709, 1211181, -1126355, 2188286, -1037772, 4825933, 97174, 5572720, -2154463, +4939213, -3765076, 10352482, -7946227, -2984466, -3797825, 10672994, 6044630, 3907347, 6781754, +-6163815, -1249299, 9843528, 5594732, 4603668, 4786741, 2527588, 3287798, -1162326, 9463424, +-1016834, -4361540, -3274376, 3317862, -3606699, 2169495, -8990440, 3317862, -1755031, 178778, +-9659918, 4152697, -2105608, 9037148, -1516660, 2866354, 2433099, -3796751, -992137, 4125316, +518617, 2833605, -2085744, 5022428, 7050189, 913754, -5006858, 1918777, 4939213, 3588982, +605590, -3374771, -7038915, 5872831, -7832410, -3266323, 4299263, -10284836, -2422362, 6419903, +-4825396, 1372242, 24696, -550830, -1444183, 2631741, -5207648, 317828, -8652212, -4409321, +-11802033, 923418, -3362960, 296890, -2346126, -324270, -3058554, 2731062, 2494302, 1082869, +-1932198, 2528662, -360777, 1017907, -3462818, 913217, 609885, 1137093, 656593, 2377801, +-385473, 2677912, -1236951, -115427, 1730335, 2521146, 291521, 1424855, -1676111, -533113, +-543313, -546535, -1234803, 834834, 1818382, 595390, 1921998, -1846299, -1257352, -1000191, +-2771865, 357556, -498753, 1336272, -477815, -446140, -2903935, 2960843, -18807124, 3463354, +-5826660, -3331284, 4493610, 3433826, 2462627, 964757, -13776644, -1342177, 4487167, -7358353, +-1810329, -10113574, -5060545, 2399813, -1066763, -9307731, 9963250, 6032819, -2851322, 1165547, +7871065, -4887136, 2225330, -3315715, -5235565, -3580392, -9591199, -3546569, 7498476, 3548717, +9539659, -4670777, -15213311, -6562710, 3904125, -4857071, -9866077, -1624035, -1738388, 9206799, +4804458, -10597832, 7259032, -7486665, -325881, -5395016, -5120675, -4939750, -11667279, -6932077, +986232, 7632694, 11559904, 7379291, 2247879, 4604205, -5115306, -8710731, -5299453, 5585605, +-2575907, 6019934, -1703491, -5524402, -175020, 551366, -2586107, -6231998, 489626, 4760971, +-15236396, -10098005, 14413910, -4610111, 389231, -7856032, 3878356, 2157684, -830539, -579821, +5335423, 3904662, 1276142, -1606318, -1855963, -326418, -2084670, 1260036, 1636919, -2998961, +-1430224, 1148904, 437550, 28454, 993748, 3002182, -3083250, -1439351, -5717675, -2345052, +-781684, -1067836, 383326, 843961, 1741072, 134218, 2207076, -2499671, -1715303, 460098, +601295, 858457, -2028298, -1159104, -2830384, -124554, 1053878, 7065221, -380641, 3485366, +-5144297, 3461207, -6963753, -663036, 11621108, -5742908, 10970420, 11110007, 13757854, 3296388, +5407364, 11821897, 9239012, 6730751, -9473087, 1021665, 2785823, 7861938, -1742146, -7102266, +8789114, 8872866, -2724083, 5845451, -3159485, -3357591, 5539971, 4711579, -833761, 5626407, +371515, -9730785, -7756711, 8035347, 11816529, -1145683, -4275103, 2318209, 235149, -5907191, +-10815265, 5367636, -10231686, -5131412, 7599945, 1421634, 6711424, 75162, 10822781, 1301375, +11899207, -14200236, 12565464, -2685965, -592706, 3595425, 6593849, -5604396, -11675869, -3512747, +10506564, -2296734, -12481712, -7549479, -7682623, 1816234, 4389457, -11021960, 5364951, 6000070, +11118060, 3207267, 3447248, -204548, 3074660, 334471, 2391223, 1449015, -8241506, -1156957, +3823058, 2480881, 6546604, -4588099, -1396938, -327491, 475668, 2898566, 347892, 2347200, +1001801, -1527398, -615791, 2220498, 2230162, 613107, 2438468, 426812, 1047435, 3009698, +-12348, -2036351, -965294, 444529, 1551557, -500901, -809601, 2370822, 1321239, 306553, +-2759517, -1160715, -1595044, -1643899, -166430, 2539936, 120796, 2399276, 1904281, 1509144, +-226023, 115427, 3729642, 12017855, 1519882, 5000953, 14299020, 15403900, 4580583, 3850975, +-11428371, -5792301, 12590160, -9393630, 12869333, 3606699, -67646, -2598455, -4519916, -7478612, +1353452, 5678484, -13872744, -6309307, -5905043, 3044595, 2777770, 3006477, 423054, 2323041, +-510027, 4146254, 3394098, -3710852, -6502044, -12020540, 2114198, -6511171, 10824391, 398358, +-6003291, -7577933, -2299418, 4988605, -9403831, 5852967, -3139084, 1904281, -97174, -6742562, +6670621, 8387535, -5763309, 7050726, 2040646, -585189, 20230370, -5124433, -13090523, 2444373, +4951561, -3318936, 1117228, -5746666, 13748727, 7941395, -1336272, -2976949, 9774272, 9271224, +-1920387, -7982734, -5737003, 19049790, -1725503, -2671470, -7664369, -5040144, -1500554, 1814624, +-1959042, -5123896, 8265128, -2648384, 9802726, 2786360, -3032247, -1122597, 1793686, -100395, +-1622424, -1751273, 3490198, -4388920, -1012002, -1212791, 5696737, 468151, -1169842, -192737, +-2813741, -2734821, -292595, 517544, 5981279, -1443646, 3576097, 1287953, -1850594, 1158567, +317828, -2922188, 2287607, -1484448, 3132105, -356482, -3033858, -2354179, -1692217, -2369211, +55835, -791885, -889595, 998043, 1187559, 1591285, 716723, 5102421, -10403485, -2849711, +-3186329, 1008780, 4613332, 10517301, 9204652, -14371497, 461709, 1839320, -1340030, -4195110, +-9863392, -888521, 3498788, 6073084, 4956929, -9039296, -1472100, -11494406, 11025181, 613107, +-956167, 5374078, -5056250, -813359, -12262669, 2213519, -7271917, 5239860, -846109, -1941325, +-4067871, -8089571, -7875360, -816581, -9743133, -15947214, -2871723, -7197829, -15336791, -1127966, +-1213865, -8329552, 5652177, 8614094, -942208, 4170950, -959388, -1219771, 2412161, 2630131, +-12406013, -3567507, 6972343, -5908802, 15077483, 2826089, 4100620, -9539122, 12348, -4241280, +-9752797, -930397, 14000520, 6565395, 10662256, 5985037, -4498978, -11084774, -17411260, 11877195, +12152073, -1315871, 6328635, -13535053, 6638946, 5713917, 9912248, 1599875, -11588359, -1381906, +-10795937, -3657702, 1004486, -3415036, 2408940, -2302103, -3518115, -817654, 1151051, -419833, +-1086090, 3332895, -904628, 1367410, -7814693, 265214, -556198, -1130113, -3495030, -1403381, +2466922, -3210488, -3786014, -1273458, -1305670, -1477469, 69793, -824634, -4203163, -3337727, +-2055142, 1333587, 1516124, 2635499, 1275605, 2429341, 868657, -2977486, 703838, -387621, +-1833414, 1272921, -3524021, 1653026, -1878511, -204548, 2496987, -26996016, -6667937, 21667574, +7321309, 8902930, -5499169, 8989367, 15148887, 1213328, -2411624, -24930138, -5721434, -1070521, +14475650, 4144107, 5877663, -18654654, -4926865, -6873559, -4341138, 11761768, -6455336, -2184528, +2150705, 3437048, -5794448, -2493229, 3143379, -5145908, 11598022, -12759274, 1527398, 8563091, +-10879689, 9131637, 15506443, 17986786, 8732742, 8847633, 11887396, -7967165, -14631343, 5983427, +6564321, 9854802, 7915625, -16611860, -4605279, 8857833, 5217312, 3273839, 10627897, 2435247, +12356084, -4460324, -2479270, 7063074, 6609418, 2025077, -10598369, -5672041, -11395085, -13153337, +-611496, -14394046, 927713, -8351027, 762894, -7590281, -4361540, -18514530, 12986907, 3449396, +-2598455, -3266860, -1924682, 2549600, -6707129, -902480, -16000901, -8801999, 5798743, 7376070, +3184182, 2513093, 803696, -8426189, 4055523, 3927211, 3186329, -8051453, 2027761, 365072, +-6274411, -2129230, 1300838, 1063004, -3144453, -4799626, 1777043, -2337536, -2786360, -693637, +884226, -563178, -180926, 1682554, -1321239, 2325725, -203474, 3300682, -1255741, 2952253, +4763656, -3210488, 2741800, 256624, 1969243, -1967632, 3221, 2670933, 2323041, -3964792, +2328946, 2127083, 17065516, -8222178, -7027640, -6220187, 11768210, 14925011, -9272298, 23913842, +5065377, -10137197, 12264816, 3540127, -9884330, -11620034, -9375377, -704912, -5012227, -3414499, +-15512348, 6295885, 6528887, 21571474, 2959769, -3617973, -9667435, -10120554, 2618856, -1151588, +-13568875, 2464774, -5007932, 704912, 10547366, -8079371, 13935558, -12149389, -10218264, -641561, +-15928423, -19046032, 3131568, -2137283, -22009560, 1576790, 282931, -10437307, 5534602, -5043902, +2808909, -14843944, -24295020, 16020228, -14856829, 24790552, 13526999, -17629230, -2246268, -17864380, +-4813048, -2219961, 7452842, -6402723, 11364483, 14360760, 13600551, -9756555, -7980586, 1321776, +-12015171, -1072131, -3911105, -15822123, 9498320, 7078643, -8445516, 12542378, -18553722, -1734093, +1120987, -4813048, -3122441, 16173773, 11918534, 7977365, -967978, -8372502, -6817187, -6300717, +2794950, 2644626, -512175, 1870995, -490700, -701153, 340376, -633508, 648003, 3259880, +-3835943, 1571421, -277562, 3583077, -2071785, -327491, 2038499, 4772783, 1867774, 3859565, +-4562329, -4927401, 2348810, -3268470, 784368, 19327, -5322002, -2921115, -3185255, 95563, +1716376, 1613297, 1040993, 1282585, -765041, -14761266, -11299522, 6895033, 8423505, 9339406, +16013249, -6328098, 29722248, -1238024, -15840376, 6482180, 14503568, 3753802, 7483981, -6880001, +-16939888, 24739012, 13613973, 9963250, 4575214, -8965744, 7779797, 20554640, -7947300, 4176856, +-488553, 4095251, 3313567, 14561013, -4554813, 4757750, -5518496, 4224101, -1686312, -1091995, +8955007, 1667521, -18685792, -12651900, -17525614, -12121471, -9418326, -4846871, -13474923, -7776575, +-6747931, -11758010, -8218420, 4758287, -12215961, -4425964, -9538585, 21910238, 11048803, 19035296, +-17764522, -1947768, -16251083, -3686156, 17693118, 9563818, 20890184, 9772661, 12838731, -14199699, +6038724, 5857799, 19332184, 19561966, 5716065, 17669496, -15716896, -7707856, 11298985, -40936408, +499827, 6364605, 618475, 9772124, 6284074, 22593138, -2000918, -3484292, 24592446, 7180649, +-2428267, -11434277, -448287, -128849, 20117090, 2378875, 328565, 1320703, 3893925, 6017786, +-1352378, -1481227, 6347962, 2826625, 1921461, 3140158, 4552666, 3354906, -455267, 476741, +440771, 6458557, -1409823, 3250753, 6348499, 4500589, 7108171, -3532611, -2630668, 1402844, +2169495, -2800856, 9127, 3879966, 6592238, -754304, 1832340, 697932, 17507898, 11383274, +-11445014, 22373558, 13288092, -1123671, -5568425, -2806224, 13444858, 33039036, 17666274, 4751308, +1395864, 10853382, -2635499, 26665842, 15094126, 16653199, 697395, -8496519, 5672041, 1999307, +-14161581, -3506841, -874026, -3365107, -4020090, 5397700, 2974802, -11653857, -5551782, -20580946, +-2080912, -6416681, -26422102, -11908334, 837519, 9868224, -13577465, 16990354, -4676146, -4104915, +-2276870, -4198868, 12428562, -8379481, 8703214, -27171036, 8443369, 11780558, 9181029, 18017924, +-17792976, 15418396, -15963857, -12027519, 13452374, -7911867, -2319282, 11172284, -18103288, 16041703, +25898652, -601295, -3681861, 32876364, -7022272, 6263673, 18655728, -39695700, -20198158, 1258425, +1289027, 5283347, 9614284, 19175956, 11677479, -15245523, -12046310, -3695283, -4235912, -20565914, +-1901597, -4184909, 5146445, -21490942, 344671, -6555731, 8798777, -3344169, 11178189, 2853469, +205622, -6455873, -4538170, -6080600, -6192269, -4962298, 4476430, -13131326, 9439801, -1686312, +5313949, 177704, -701690, -9016210, 5005785, -6448357, 1748052, -6845641, -3512210, -198642, +-2816962, -7839926, 718333, -2568391, 1002875, -5394479, -5611375, -6317897, 1273995, 1148367, +7955890, 8143258, 106300, 10737, -9960566, -5936719, -31372588, -18854906, 23170812, 23038204, +2513093, -5401458, 19544786, -31470836, -16874926, -34055332, 14954539, 4176856, 1556389, 6649146, +-15470472, 7894687, 10833518, 14186814, 24017994, 24679418, 20742008, -797253, 4723927, 309238, +-8965744, -1823751, -7479149, -3846680, 28615220, -6634651, -26226680, -6601902, -5361193, 2386928, +41210212, -14846628, -14714021, 13967771, -22250078, 7744900, -24693914, 32352378, 9176198, -871342, +8334921, -12437152, -15735686, 22174380, -26884884, -21482890, -19307488, 5395016, 8135205, 10103911, +-17909476, 18447958, -5644661, 1414118, 28427852, -1913408, -4779762, 8381092, 22952306, -14803142, +38034084, 1433982, -43725988, -5301601, -1635846, -14593225, -4168266, 15032, -4046933, -11915313, +-9993852, 21559126, 14482630, -5280663, 14016626, -25121800, 7108171, 11290932, 7064148, 835908, +13503377, -2195265, -542240, 5057861, 13204340, -5424007, -5680094, -4463008, 662499, 4991826, +-2474438, -10349797, -11089606, 569620, -5172215, 3891777, -70867, 2753074, 5984500, -7232725, +-4727149, 12559558, -2826089, 2289755, -893353, 353798, -4204773, -4746476, -2336462, -1578401, +-6582575, 3244311, 6177237, 3434363, -30065, 589484, 2838974, -5094368, 1266479, 5856725, +-488553, 5027259, -2736431, -9073655, -12213276, 314069, 5277441, -9043591, -4212289, 41611792, +24591908, -33838972, -27376658, 33463700, 31887448, 19898046, 22870164, -40256728, -8965744, -11210402, +10414759, 3738232, -16353088, -29773788, -45028976, 12970264, 11674258, 3325915, 12173011, -6280853, +-2419677, -10799695, 8740258, 15377594, 13770202, 3491809, 18350248, 5790690, -2267743, -7699803, +-27441620, -1615445, -11645267, -9657771, 9313637, -29404956, 2448668, 1033477, -13825500, 11803107, +10778220, 5268315, -19862614, -18459770, -48438104, -12428025, 165356, -15604690, 2546379, 10052908, +9975062, 26846766, 13063143, -12064563, -8541616, -18073222, 22515830, -9681930, 39105140, 32694364, +8913668, -21115670, 43190728, 19822884, -17762910, 2557653, 21604222, 50334868, -21047488, -38707856, +-20096688, 399432, -14108968, 5960878, 13721347, 11493869, -10324565, -15902116, -8919036, -13254806, +-14621679, 3880503, 15479062, 12407087, 6843494, 6123013, 2080375, 10420128, 1224603, 1578937, +15122580, 11906186, -911070, -5147519, 3255048, -8097624, 8317204, -3150896, 8516920, -4580046, +3280281, 2176475, 5554467, 7330436, 4162360, 3357054, -7454990, -14355391, 1471026, -7334731, +-3887482, 4205310, 1066763, -2201171, -2989834, 10210748, 3170223, 13849122, -4694936, 7373385, +-7218230, 7154342, -9867687, 9516037, 128849, -8303783, 16362215, 5645735, -6147172, -16498580, +13246753, -27743878, -25694104, -9438728, 19360638, -11578695, -14742475, -435402, 22354232, 2105071, +23110146, -8121783, 27962384, 2981244, 14840723, -10188199, -6930467, 8671002, -29458644, -8397735, +10700911, -5457293, -4215511, -23720030, -22455162, 10046465, -13808320, -9949292, 17897666, 24694988, +-3946001, 16165720, -29767344, 1575179, -8281234, 38078644, -16065862, 12538620, 23205172, 22134114, +6278169, -15787226, 9683541, 6937446, 6546604, 12179990, -37963216, 69450696, 22033182, -6286759, +3446175, 7646653, 19123342, -5529234, 14675366, 40447856, -2518462, -50347756, 20783346, 17328582, +-18025440, 23449984, -5388574, -10650982, -27106076, 51892868, -26978838, 57794692, -38331508, 14203457, +-918586, 62804768, 27736362, -27005144, 25626996, 1016834, -16889422, 12538083, 1787780, 5586679, +13909252, 5889474, -16340203, -4305168, 19026706, 5048734, 10699837, -8928700, 11844446, -20391968, +7390028, -1234266, -6710350, 12539157, -7164006, -4035122, 8942122, -1632625, 1213328, -1685775, +15137612, -10087804, 14770393, -8886287, 13655312, 19216220, 7034620, 5153961, 10537165, -2854543, +-7721278, -7463043, 9077950, 3118683, -1654636, -201863, -2523293, -13932874, -10774999, -2219961, +319975, -3225521, -8215199, 47862580, 5806796, 26023206, 13331042, -26200912, 1743757, 15671799, +-4588099, -22813792, -4276714, -49846852, -13864691, -18528488, -10653666, 10961830, -1348083, 17928804, +-8643622, 1994476, 17521320, -15455977, 1795296, 9978283, -859530, -16969416, 91268, -11644193, +34564288, -5993627, 20084340, 3276523, -213138, 35358856, 25565792, -15511274, -18130130, 8992051, +16112570, 19419158, 23662048, -403190, 8429947, 22351010, -1086090, -8954470, 7117298, 804770, +-19656454, -430034, 13165149, -19449760, -26097832, -2465311, -1456531, -2797634, -8671002, -9461813, +-31117038, -4295, 30814242, 9463960, 17202418, 10098542, -3983582, -40372692, -29484414, 7975218, +26275000, 8548596, 13348221, 53069688, 55234352, 46629924, -3563212, 23182622, -14635638, -39127152, +-65112240, 11361799, 8188355, -2894808, 9208410, -20623896, 4573067, -5012227, 24068460, -1781338, +19358492, -23625542, 11797201, -29016800, -5476620, 12276627, 2238752, -14766098, 3625489, -12159589, +-13018583, -5604396, 3651796, 11110007, 14496588, 18853832, -4369056, -1004486, 5046050, -5151814, +6238977, -19510426, -16470663, -11573326, -15395847, -15022722, -15720654, 10365367, 7740605, -2641405, +-10230612, -15908559, 9905268, 183610, 15527917, -3724811, 13798656, 10008348, 870268, 4323959, +16514149, -19417548, -17979806, 11209328, -1350230, -3846680, -8477729, -15013595, -31344672, 8661338, +-18883898, 8934069, -8324184, -22174380, -7012071, -317291, 10695542, -9466645, 5345087, -32454920, +30012158, -67833104, -6964827, -17070884, -14056891, 8912057, 38540352, 6072010, 13865765, -33478196, +7285339, 12144020, 26436060, -13992467, -21729850, -15095736, -7489886, -1153199, -753230, 15968152, +11543261, -9622874, -49052820, -23337778, -39921184, 4491999, 69927976, -49710488, -19812148, -7740068, +40345848, -13660143, 16965120, -13057237, 19364396, -7837779, -11988327, -25268904, 12826920, -29266980, +26834956, 48631376, 6113886, -9084393, -9259413, 40321688, 10579041, -459025, 21223044, 6919729, +7582228, -7873212, 46588048, -73550776, 53046068, -44850732, 21104396, 52428664, -42284488, 85072024, +57886496, -21922586, -7431904, 58480276, 21240224, -5647882, 38427608, 34481608, -45117020, 60339996, +-36705328, 10664941, 11431592, -16288127, 11508902, 19660212, -12360916, -22203370, 7031399, -12006581, +4977330, 4984847, -6227703, -17426830, 6761353, 6104223, -7243999, 7202660, 5719823, -14043469, +34078956, 3628711, 563178, 625992, -7082938, 5133560, 4463545, 1707250, -11301133, 5691369, +1422708, -4985920, -9928354, 21020644, -8149164, 17073568, 19471234, -2110440, -7416872, 5057861, +4677757, 7484518, 23499376, 20217484, -18413598, 8354249, -7568806, -1220308, 26863410, -5374078, +7395934, 10456635, -1822140, 49576272, 47245712, -40379672, 39336532, 36202816, -34082712, -51423644, +-75990320, 17662516, 113978768, 46814068, 150324, 23501524, -109073376, -45059040, -3927748, 16583942, +81948512, 80216032, 13782550, -30966714, -60473676, -35437776, 4018479, 25885232, 39133056, 63073744, +38016368, -50876572, -120268744, -97982160, -9711458, 108990704, 118508888, 74907984, 22803592, -25206626, +-48505752, -73189464, -41815264, -44527000, 87150792, 72575280, 45768244, 40587976, -61814244, -86485072, +-100442104, -89874872, 34507916, 121685552, 149747792, 50645180, -45512696, -106705776, -128080216, -34835404, +20484310, 13207561, 79959408, 31400506, -30369176, -17949742, -61758408, -13471165, -70592080, 30496416, +83406120, 156241776, -9626095, -83560200, -181633088, -7111392, -61508228, -6534793, 86851752, 17223356, +-8134668, -38827580, -81912544, -53602804, 39107824, 63381368, 20696374, -11084774, -28018220, -33360084, +32327146, 37343668, 22903450, 19995220, 8762270, 18644990, -1986959, 1766842, -18341658, -8407398, +1874753, 47131896, 41020696, -2130841, -17879412, -4583267, -42286636, -28260348, -1284732, 16073378, +43290048, 33538862, 23566486, 2179159, -58849104, -52795348, -35974648, 13852880, 56315076, 109620448, +66880156, -50539416, -91258392, -80380848, -32638530, 2295660, 74815648, 94476936, 70224864, 12411382, +-56346748, -127380680, -80533856, 25942140, 78785272, 90319944, 26107496, -13225815, -35366908, -41518912, +-24072754, -7653632, 8575439, 19859928, 24829742, 19891604, 4555887, -1738388, -17478906, 871878, +-10297184, 51507932, 30177514, -4413616, 11043972, 5681705, -36484672, -3705483, -2859375, 4110821, +1257889, 3047279, -13268765, -5235029, -4822175, -3251290, -5973226, 22024592, -7754027, 9530532, +-16372952, -1541356, 6923488, -660351, -4894115, 37953552, 5352603, -21298742, -24774446, 5354751, +5348845, -14506789, 4174708, 19125490, 9986336, 18008798, -18191334, 5663988, -532039, 4420595, +-12771085, 2574833, 14413910, 20368882, 5240934, -5148592, 6051609, 2412161, -4600984, 13927505, +-20278688, 4728222, -33102924, -10278394, 13832479, -11151346, -13238700, 18183280, -11409581, -30884036, +-23891830, 21380884, -2544768, -4093104, 4993437, 10893111, 27042724, -17440788, -22771916, 1095217, +-3037079, 18361522, 237834, 10786810, 4982162, -1682017, 28082644, -36326832, -5242545, -5023501, +-21310554, 5607080, 12079059, 656056, -12657805, 5787469, -2785823, 3767760, -10934987, 8227010, +-484258, 1453310, -892279, -2564096, 14275398, -14126147, 1189169, -2296197, -5052492, -4417911, +1733556, -6028524, 6583111, 8505109, -8617852, -2049773, -3256122, 7811472, 8545374, -4113505, +10515691, 1190243, -1445257, -6877854, 7595113, 2778844, -2931852, -11474005, 5551245, -10389526, +6856916, -5526013, -5083631, 9842454, 9669045, -12957379, 1610613, -2879239, -12864501, 4384088, +-7513509, 8663486, -7409893, -29948270, -33041184, -78792784, 22955526, 22704270, -1470489, -66405028, +-42877196, -6198712, -10778220, 44588740, 30128658, 14552423, -29318520, -12032888, -7669738, 27964532, +3194382, -7810398, -17151416, 11538430, 5207111, 13970992, -622770, -5538361, -6939057, -15808701, +-7815767, -9521406, 26732950, 14331769, 3269007, 4101694, -17376364, -826244, 2266669, 24391656, +-1617055, 11426760, -8885750, -6180458, 5086315, -9901510, 6752226, 3010235, 7252589, 23788750, +-1933809, 20886962, -134755, 13448079, -10184978, 975494, -15042586, -19559818, -20539070, -17606144, +5973763, 3163780, 1665911, -25976500, 13023951, -22599044, -2416993, 1269163, -14068165, -15307263, +-7983808, 365609, -26951456, -18251464, 16982838, -8100845, 15822123, 2571612, -4198868, -14575508, +-16769163, -1023813, 24155970, 29824252, -7262790, -2976412, -11040750, -14843407, -10144176, 9552007, +5191542, 3714073, 9458592, -1778653, -6017249, 6508486, 3705483, 5424544, 8294656, -4510253, +2896419, -850940, 339839, -6155225, 10910828, 3456375, 2605435, -3183645, 1709934, -188979, +16924318, 2179159, 5182415, -9370545, 785979, -6056978, 11129334, 790274, 322659, -3835943, +2703145, -1238024, 294742, 5276368, 654446, 6905234, -4527970, 2251100, 881005, -8817568, +-322659, 5054103, 2094870, -1815161, 3047816, 17723720, -38173668, -94637456, -90706488, -13784161, +27418534, 91231544, 78849696, 74319040, 79846664, 44433048, 10749766, -40340480, -40510668, -84208736, +-65376380, -57342644, -36359044, -45762340, 62986232, 51788716, 68209448, 39307004, 55752432, -2051384, +14689325, -8987219, -21741124, -12471511, -25994216, -30281666, -30121680, -29758218, -35175244, -25796110, +-20907900, -2409477, 5558762, 49413060, 41520524, 21835076, 23523536, 32582158, 30298310, 14542222, +70420280, 9116605, 946503, 13167296, -26269094, -80809808, -23079006, -64787436, -69409352, -73409048, +-51866560, -46264312, 2342905, 38280508, 39135204, 47711180, 86914032, 62480500, 76279160, 74880608, +47847008, 51355996, 17595408, -18140332, -58650464, -77061912, -87944824, -57293788, -78923248, -66415764, +-75776112, -44302052, -5233418, 20716238, 61411052, 58494772, 59500868, 98931888, 69027640, 81767584, +51027968, 8414378, -9553081, -24856050, -40918152, -45957224, -48565344, -47449188, -54562728, -46885472, +-34193844, -21117280, -10838350, -8318278, 23771570, 22441740, 31803160, 51208360, 57856432, 36569500, +44219908, 27145268, -1612223, -12094091, -26584236, -33415920, -28511066, -24772834, -29803852, -11020349, +-7330973, 563714, 8502425, 9269076, 2427194, 1168768, 8331163, -1321239, -7137699, 6499896, +3978214, 4599910, 7376070, 2050847, 2012192, 4327717, 10233833, 8596377, 4054986, 726386, +-2181844, -8805220, -6536940, -8018704, -6817724, -2864206, -5253819, -4750234, -2521683, -2150168, +-2786360, -880468, 3349001, 3157338, 4093104, 6346888, 4387846, 3020436, 4216584, 1497870, +1838783, 1742146, 1230508, 1025960, 469225, -1191317, -2535105, -4860293, -3694209, -3993783, +-3145527, -1690070, -645856, -1548336, -908922, -1285806, 239981, 1104344, 1921461, 3629784, +3621194, 1396401, 1500017, 648003, -507343, 899259, 720481, 197032, 1230508, 347355, +-456340, -1083406, -893890, -1092532, -867583, -961536, -305480, -587337, -673773, -2194728, +-2478196, -2471217, -1744831, -421444, 755914, 2049236, 2652679, 2731062, 2934000, 2322504, +2564096, 1744831, 843961, 139050, -344671, -1328756, -2025614, -2451353, -2190970, -2312303, +-1879585, -1832877, -1534377, -729071, 135291, 536334, 1236951, 1797981, 2083596, 2003065, +1743757, 1179505, 708670, 124017, -86436, -444529, -532576, -588411, -524523, -495532, +-375810, -284542, -155693, -93952, -46171, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -4386236, -7451232, 2618320, -1320703, 1911261, 2416456, 4479651, 7463580, -3540127, 2500745, -3012383, --2331094, 1519345, 49929, 646393, -5214091, -2524367, 1883880, 3725884, -459562, 3142842, --5591511, -4968204, 3177739, 2032593, 899796, 2309082, -1884954, 4053376, 4549444, 4401805, -6320581, -3464428, -2841658, 244813, 836982, -6004901, -341450, -503585, 1694902, 611496, --3728569, -910533, 5172751, -2724083, 1047972, -3127810, 1549946, 1601486, 1069984, -4668630, -3825205, 360777, 897111, -630823, -1495186, -1928977, -3149822, 6810208, -1151588, -1240172, --1476932, 3031173, 752156, -6415608, 1682017, -2924336, -4361003, 2614025, -2676838, -6948184, -2827162, 1031329, 356482, -6402723, -7723425, -3167539, -3779034, 3613678, -991064, -2147, --1703491, -2095944, -1693828, 59593, 3242164, 585189, -1363115, -110595, -1426466, -654983, -1472637, 433792, -1284732, -1817308, -568546, -743566, 762894, -454193, 327491, 259309, -827855, 200253, 1159641, -455803, 324807, -250182, 838592, -45097, 776315, 898185, -4294431, 464930, 321586, 3815005, -5825050, 915365, -4869956, -6148246, 1705639, 5669357, --3590056, 2665564, -2715493, -1335198, 1098975, 238371, -2885144, -8456791, -8404177, 102005, --2168422, -123480, 4313221, 652835, 5293011, 7179038, -3863860, 6193880, 724239, 6287832, -345208, 7470559, 901406, -4250944, -1212791, 378494, 3367254, -970663, -1186485, 702227, -2541547, -3167539, -246961, -1007170, 2240899, 2757906, 96100, -2888366, -260382, -557272, -1585380, 2900177, 5210332, -1879585, 3359738, -1581622, -4646081, -4133906, -2829310, 2555506, -2754685, -1587527, 4497368, 112206, 1593970, 200253, 5480915, 3638911, 4022237, 1623498, -2342905, 1449552, 2169495, 4494147, -1024350, -268435, 6334003, 1250372, 120796, 1297617, --2443300, 323196, 1822677, -176094, -6044093, 1842541, 569620, -990527, -2141578, 1351304, -341450, 3226057, -1269700, -622233, -1314797, -1042066, 754304, 207769, 1235877, 588947, -231391, -1204202, -1004486, -577136, -650688, 486405, -1626719, 1343788, -631897, 379568, --450972, -579284, -938450, 504122, -772020, -548145, -1768990, 6516003, -6558952, -4404489, --3609920, -5301064, 1738925, 2354716, -4255776, 1046898, 8883066, -6387690, 4526896, 7670275, -7581691, -4598300, -1226750, 3785477, 762357, 1209570, -3336653, 1907502, -11421392, 9057012, -14154602, 2551211, 4799089, -2239289, -144418, 7546795, -3890704, -8994198, -1457605, 191126, -21475, -7254200, 590558, 1876364, -8640400, -4024921, 4081293, 1427003, -3041911, -745177, -3060701, -4177393, 9046812, 2868501, 466004, -5713380, -520228, 3166465, -1910724, 254477, --2012192, -52613, -810138, -4562866, 339302, -4409858, 6802692, -6458020, -4292283, -1395864, --7762080, 5303211, -4153234, -10806675, -1949915, -4621922, 1377611, 5068062, -5032091, 701690, --3401614, 3620658, 539018, -3521336, 3130494, -3820910, -5100274, 5806796, -3656628, 1711545, -185757, 597000, 2049236, -1054951, -1705102, -1877438, -3090229, 1130113, -4386236, 332860, --853088, 1474248, -1274532, -26844, 49392, 202400, -2309619, 2191507, 143881, 482647, --1225676, -804233, -909459, -135291, 1372242, -5099737, 3213709, -175557, -1017370, 3814468, --3660923, -12812424, -2517925, -816581, 5566278, 7881265, 6990596, 3339874, -2770254, -894427, --7900056, -6715718, 2291365, 8956081, -2588792, 9175124, 5844914, -5718212, 3041911, -910533, -3182571, -6388764, -4296041, 1009854, 4577362, -619012, 2725694, 3782256, -7190312, -1481227, --3321084, -9820980, 6075768, 928250, 2203318, 4198331, 7751879, 2662880, 361314, 6041945, --1423782, -3155190, 6256157, -3338800, 10574746, 4829691, 4206384, 176631, -3039763, -3744138, -5187247, 6999723, -5231807, 1227824, 6731825, -1240709, 2193118, 14814953, -4487704, -1837172, -2896419, -7497939, -292595, 1285269, -3312494, 3570729, -2395518, 2182380, 7388955, 208306, --1685775, -5073430, -398895, -6289443, 2653753, -2367601, -3049427, -1331977, 1202591, -1848983, --1779190, -1567663, 359704, 2241973, 1722819, 411243, -508417, -753767, -504122, -404264, --1009317, -1896228, -328565, -629750, 999654, -56371, 518617, -1919850, 819265, 917512, --661425, -1691680, -569620, -1771674, -864899, -826244, 1299765, 70867, -229244, -197569, -338229, 135291, 707596, -2681133, -639950, 787590, -3327526, -18369576, -1552631, -454193, --3729642, -5743982, -1927367, 9753871, -7029251, -10482405, 3843996, -4298189, 1422171, 1786706, -6522982, -4564477, -1423245, 1228898, 6060199, -2935610, -4090420, -1272921, -3528316, 4447976, -8205535, 4095251, 7516, -751619, -4806606, -351650, 12947179, 2223183, -1683627, 14971182, --966905, 11117523, -3446175, 23085, 7523709, 2238215, 1821066, 2643016, 1264868, 4110284, -2365990, -7207492, 13211319, 8004209, 10836739, 7246147, 4747550, -7331509, 3147137, 3635690, -493921, -4519916, 12261058, 7398618, 11070815, 1920387, -2285460, -2807298, 8135742, -4060355, --8532489, 9899900, 3052648, -5533529, -3237869, 434329, -2624762, 915365, -1223529, 1347546, --3521873, -1005559, -8078834, 3018825, -1052267, -264677, 2880849, -1042066, -1564979, 4658966, --376883, 3608310, 4842576, 3969624, 2527052, 2524367, 971200, 1454383, -40802, -1069447, --1000191, 2102387, -670015, -1368484, -1438814, 974958, -1614908, -449361, -371515, 2636573, -1055488, 1877438, -1865090, 526134, -1508607, -550293, 1789928, -292058, -818191, -635655, --551366, -1103807, -783832, 744640, -111132, -507880, -4725538, -749472, -12080132, -4822175, --13499082, -9278740, 909459, -8800388, -6934762, 725850, -1605781, 8899172, -6052146, 9870909, -12145094, 1169842, -10455561, -7382512, 10903848, -5657546, -3073586, 6069863, -8106751, -14358613, -5651103, 12227772, -6403260, 3057480, -295279, 5281736, -14951318, 2877628, -6044093, 3506304, -238908, -6337761, 10320270, 4651450, 4325569, 13728326, 6386617, 2761127, 7777112, 1472100, -2482491, 3848291, 1265942, 530428, 2087354, 1786706, 15693274, 8749385, -84289, 13102871, -8226473, 9643275, 15199352, -7902203, -6553583, 13242995, -4699768, -627065, -7973607, -3471407, -4707821, 6968585, -6083285, -830539, 1972464, -1830193, 3639985, -6518687, -1240172, -7522635, -14339822, -4773320, 7814156, -2360085, -3878356, 10443750, 1817308, -3228205, 3402688, -1440425, -266288, -3126199, 3965866, -889058, 1407139, 4145717, 2424509, 1141388, 2383170, 47782, --414464, 1576790, 407485, -3072512, 602906, -758599, -1395328, 2507187, -28454, 1149441, -1061394, -745714, 482647, -1870995, 335007, -1723893, 111132, -796180, 1898376, 355945, -1629403, 287763, 1977296, 382789, 897111, 1034550, 181462, 4510253, -4903242, 1527398, -659278, 1515050, -7026567, 9043591, 5226975, 12301860, 2345052, -1703491, -13968844, -7474317, --5265093, 3525631, -7279970, -12083890, -3405372, 3063386, 1293859, -13487808, 10878615, 817654, --868120, -11489574, -6647536, 2684892, 1362578, -12759811, -4014184, 4639639, 463320, 1270237, -6477348, 7616051, 4403415, -1984275, 3791383, 1179505, -4626217, -9438728, 16192564, -4086125, --7970386, 149787, 3973919, 5247913, 12090870, 1995549, -279173, -4566624, -195421, 6738804, --911607, 8421357, 16072304, 1360431, -3559991, 495532, 13827110, 17380122, -8720931, 2434710, -2361695, 9404368, 4899484, 1670205, 2823404, -6900939, 4243965, 4497368, 4406100, -2969970, -187368, 3432753, 5104032, -705985, 1706713, 1221381, -5946919, 2862059, 205622, -5268315, --3923990, 5651103, -2597382, 3921842, -5713380, -4270808, -1999307, 1318555, -164819, 5111011, -2237678, 951872, 169114, 2580739, 2259690, 783832, -4362076, 237297, -1881196, 738198, --1438277, -988916, -137976, -373125, -695785, -1397475, -4283156, -1103270, 367220, -2762201, --1891933, -1723893, -16106, -1723356, -3051038, -617938, 1308354, 2359548, -879395, 736587, --1214939, 877784, -4599910, 6318434, -5774047, -10417980, 7093139, -915365, -2588255, 2649458, -6029597, -17430052, 1000191, 13227962, -1611150, 23856932, 11372537, -7383586, -5428839, -2319282, --6977175, -3147137, 10621991, -4187593, -3566434, 10631118, 8630200, 2792803, 4923107, 9931038, -6563247, 7412040, -5548561, -3831111, 9443022, -1944547, 8543227, -22012, -10332081, -6682432, -2723009, 8042327, -11231339, 620086, -6023155, 3051574, -6874632, 9418326, 9414568, -9323837, --1039382, 2623688, -354335, -12581033, -5659693, 2066953, 8237748, 13565654, 4585952, -10185515, --2282238, -2537252, -1237488, 8503498, 1313186, 6798397, -10388452, 4563403, 656056, -8275865, -9659918, 4047470, -1359894, -2254858, 1628866, -444529, -8409546, 6220187, -1982127, 3676492, --6544994, -11571179, -6418292, 2638184, 5082020, 42950, 2786897, 10234907, 61740, -2718714, -6442988, -2090039, 6062883, 278636, 1940252, -5322538, 493921, 56371, 2760053, 2998424, -4286914, 2667712, -1105417, -1349157, -2052458, 5048734, -2441152, 2589865, 521839, 1529008, -2068027, 2790118, 1231045, -1069447, 2553358, 933082, 833224, -1079647, 3449396, 1562831, -698469, -3545496, 1228361, -1448478, -66035, 2283312, 667331, 10992432, -13732621, -2251100, --4443681, 13919452, -6337761, 11456288, -3682935, 10691247, 14513231, -6546604, 4519380, -3787624, -8229694, -3233037, 6837051, 5677410, 5329518, -1310502, 5609228, -2944200, -7332046, -3546569, -7996692, -9527848, 1405528, -98247, 7111929, 14523969, -13441637, 408022, 12979928, -380105, -11857868, 1573032, 5156645, -1707786, -1110786, 3169149, -18537078, 1760400, -541166, -7391102, -4779225, 2965675, 13281649, 6605660, -1431298, 25362318, 6229850, -13446469, 3439195, 1233729, -8770860, -5823439, 1597728, 7448010, 483721, 4517232, -1444183, -14679124, -15093589, -20401, --5177046, 11988327, -20475720, 26131118, -268972, 14526653, 16556025, 3959960, -4534412, -3379603, --7950522, -10424422, -1008780, 3297998, -2753611, 5192616, -3626563, -8402030, -5401995, -4270808, -1377611, -1354525, 792958, 5557688, 2689723, 2610266, 1923609, -2389613, -3011846, 117575, --744103, 1558536, 248034, 600759, 1629940, 3206730, 1803349, -6534256, 1044751, -1272384, -4581657, 4715874, 2613488, -484794, -1525250, 1824287, 1343788, -2337536, -2565169, -641561, --1801739, 414464, -1916092, -3180960, 1102196, 5209259, -1504312, 2079301, -4176856, 488016, -2164664, 2376191, -274341, 1516660, 3224984, -2515240, 1094143, -24186572, -1684701, 8273718, -1385127, -9063992, -22463752, 22549, 2593087, -3911105, -918586, -6588480, 3506841, -5478231, -11602854, 4124242, -6884833, -8593156, -14767171, 11108396, -4700842, 797790, 14424111, 19859928, -12094628, -1796370, 1049583, -13544179, -5800354, -5417565, 3660923, -19232326, 5048734, 5319317, -1112933, -9860171, 9527311, 14860587, -2378875, -201863, 1733556, -8533026, -9077950, 5288716, -3584150, 11260867, -12307766, 13426068, -7034083, 7430831, -11396159, -8930848, -4506495, -223875, --1349694, 4947803, -2458869, -19857782, -14947560, -4133906, 528281, -19908248, 275415, 9959492, --5293011, -2232309, 3023657, 8483097, -17588428, 9064528, -3099893, -2564096, -94489, 7265474, -8964134, -10479720, -5402532, -7018514, -3460670, -2481417, 5204964, 1816771, -6387153, -2774549, --4902705, 3477313, 11670500, 7789460, -80531, -250719, -6546067, 336081, -4008815, 5590437, --1022739, 9685688, 3179350, 3439195, -3471944, 293132, 85362, -7582765, 8164196, 706522, --1478006, 4366371, -1547262, -1202054, -425202, 725850, -6694244, 3024731, 4014721, 4395899, --736050, -1474784, 1414118, 2530273, -2430415, -1312649, 2310156, -4962298, 505196, -22549, -4698694, -260919, 21725018, 508417, -4434554, 16894790, -3718368, -6895570, -1843078, -1570884, -20951924, 23975044, -3147137, 5092221, 6089190, -3073586, -11415486, 5599564, 22279606, 17006460, -14522358, -5287105, 6279242, 11973832, -15572478, -11580842, 13552769, -6930467, -7634841, -522375, -16949552, -2553895, 15600395, 1030792, 13996225, -8390219, 19241454, 5869610, -6004365, -9820980, -3491809, -13895830, 1643899, -16489453, -5655398, -5905043, 9421011, -9432285, 15538655, -19036368, --32992866, 20620138, 9193914, -4029216, 147640, 22746146, 10644003, 1830730, -5989869, 4936528, --2671470, 302258, -14791867, -14948634, 8791261, -4995584, 4846334, 28246926, -7406134, 6106370, --18443664, 21838834, -7321309, -9695352, -4690105, -3002719, 9079024, -18428630, 15423764, -18059800, -13035763, -9272298, -12650289, 12654047, -568546, 4184909, -5141613, 7511361, -4111894, -5638219, --2570538, -8575439, 5928666, -216896, -5646809, -2323041, 2079838, 9285719, 1725503, 1388348, -2440078, -156229, -1591822, 4756677, -2650532, 2195802, 1934346, -2310156, -694174, -448824, -6600828, 5873368, -2144263, -3109556, -6935836, -35433, -1427003, -897648, -1141388, 306553, -6331856, 2010045, -775242, 8113730, 3900367, -24705726, -18361522, -17799956, 24890410, 853625, -10689637, 6382859, -21904334, -19138912, 12891881, -34163244, 9996536, 10177462, -2191507, -13577465, --12506945, 21325050, -11452530, -1477469, -3582003, -11011222, 16197395, 5188321, 14652818, 8554501, -10106058, -3174518, 16448651, -1482301, -10772315, -12640089, -2929168, 7176354, -9621264, 12814572, -8188892, -9596568, -34629248, -2869575, -2864206, -818191, 25126096, 609885, -19724638, -11647414, --12073690, 10369125, -7623030, -16362215, -18341120, -11346767, -8937290, -40766756, 941135, 5136244, -13368086, -21272436, 6937446, -17568026, -14456323, -4886599, 17013976, 4412005, 15785615, 29953638, -8946417, 6912213, 19447612, -15154792, -1999844, -7171522, -8403640, 15676631, 14386530, 23005992, -11214160, -20968568, -14072997, 16559783, -24905978, -27302570, -8679055, 19983946, 3079492, -4821101, -13507135, 11143830, -205085, 3217468, 11432129, -7489886, 6720550, -5506148, -1165010, -5739687, --1184337, 1572495, 7961796, -5071820, -6599754, 37581, 4434017, 1511292, 4015258, -592169, --6613713, -1497333, -4432406, 390842, -3732327, -651761, -659278, -7239168, 5756330, 957778, -5855114, 7621420, 10287520, -3873524, -5746130, -389768, 821949, 601832, 11457362, -11159936, --23000624, 5937256, -629213, -739271, 529892, 2863670, 4508105, 9655086, 2925947, 8078834, -4301410, 9628243, 25414932, 544387, -33864208, -12600897, 8166881, 13422, -7312182, -21874806, --14539538, 4217658, 17129404, 6451041, -17056926, 8617315, 6734509, -19216758, -3929358, -23688892, -17974976, -10063108, -12560095, 16608102, -16784732, 4252018, 34917012, -4476967, 5357972, 10083509, --458488, 4803921, -21091510, 4693863, 3248606, 3008088, 45970644, 31060666, -3877819, -16523813, --11128260, 14229764, 16485695, -18936510, -10791642, -25295746, 39153996, 10562935, 4144644, -6730751, --4763119, -9185861, -5340255, 28113782, -8074539, 7341710, 27977416, 4412542, -8489003, -21479668, -74625, 8069707, -42915852, 8851928, 4162897, 28635620, 19339700, 15081241, 25419764, 14254460, --5625871, 2155537, 8538932, -3335042, 765578, -2246805, 3610994, 1869921, 23698018, -1122060, -9430674, -4694400, 9088151, -1240172, 12300786, 2279017, 3052648, 11229192, -1476395, 4393215, -7338489, -249645, 5827734, 8520678, 3418257, 6695854, 9914395, 5541045, -4452271, -1231582, -1755568, 2089502, -464393, -4675609, 1519882, 2254858, 672162, 5072893, -1351841, 8231842, -4155918, -4068408, 8487392, -1738388, 725850, -5950677, -27174258, -3922379, 18653042, 10456098, --30447024, -40096740, 4557497, 27181238, 10944114, 16608639, -9509058, 12829067, 2088965, 337692, --14612552, -5203353, -22721988, 33647312, 11200201, -27302034, -18818400, 12243341, 1216550, 6760816, --8260833, 16807818, 9714679, 11583527, 21929030, 19542638, 3925063, 19112604, -10135586, 10994579, --153008, 13358959, 6011344, -3141769, -8127152, 9245454, -12020540, 31448824, -8541616, -5866926, -6325950, 15587510, 15228880, -10315438, 26920318, 26872000, 15465640, 6566468, 2130304, -8531416, --20479478, -34745748, -5779952, 12483322, -871342, 15259482, 16403554, 17816598, 6048388, 9975598, -57727580, -28337658, -12548821, 5840082, 11053098, -1354525, -45290968, 10709501, -7149510, 6883222, -7883413, 20130512, 3889093, 456877, -18283676, 18955838, -6868727, 2838974, 16377247, 7618735, --17727478, -3681861, -10014790, -3249143, -7716983, 1366873, 576599, 7225209, -1816234, 8788577, -8378945, 11363410, -228170, 37581, -6937983, -2933463, -9248675, -6025839, -2838437, 12084964, -3708704, -1742683, 693637, -4541391, 1612223, 10627897, 11652246, -2199560, -10978473, -52613, -550293, 5235029, -3113315, 3670050, -5272073, 8125542, -15315853, 1701344, -4776541, -5206574, --110059, 3181497, -9907416, 4902705, -1969243, 4859756, -5122286, -8972187, 3365644, 15103789, -14874009, -8262444, -11212549, 3281355, -10773925, -34467648, 35560720, -10430328, 9980967, 3251290, -29826938, 23751706, 14938433, -14283987, -2370822, 20367808, 10818486, 23980414, 64035280, -4016331, --25259240, -6633040, 19137300, -2912525, -29829084, 45507864, 23601920, -16121160, -24972550, -3136400, -5593121, -7993471, 18093624, 15316927, 17755394, 33952252, 5695127, 9545565, 6081674, -13241384, --31660352, 18548354, -21541408, -16254304, 24998320, 13029857, 14105209, 7326141, 5158793, -1505386, --31253940, -27829778, 531502, 16524350, -20654498, 19502910, -9152038, -23263154, 7331509, 20262582, --3738769, 3834332, 20226612, 19827180, 20695836, 1438814, -12588549, 11696270, 49145164, 5835250, -20004884, 27969364, 1404454, -8987756, -24648818, -10074920, -38863548, -13435195, -9698036, -4896800, -8883066, 1412507, -1725503, -11282342, -7321846, -6597607, 9656697, -10109816, -1950989, -8934069, -2925947, -5716065, -9532143, 268435, -13740674, -4978404, 292058, -12577812, -2298881, -10976326, --6210523, 1076426, -19859928, -2055142, 996969, -352724, 9475772, -12813498, -4112431, 13459354, -330712, -5497022, -523449, -4720706, 2684892, -5990943, -4351876, 6615324, -400506, 302258, --10672457, 17734456, 14541686, 98247, -12157442, -17811766, -31265214, 5257577, 18748606, 25761750, --22424024, -23875186, 28662464, 12732431, -1429687, -3205656, -12303471, 5245229, -5894843, -12805982, -12977244, 15916612, 10899016, 807991, -2662880, -9324911, 1639067, 6530498, 3805341, -10498511, --36461052, 7796977, -8536784, -11117523, 1691680, -4943508, 2710124, -36293012, 16472810, 12901008, --26263726, 17886928, 23779086, 19906100, -5741298, 3117610, -3555696, 12889734, -3306051, -337155, -64063732, -19600620, 5019743, -17526688, -10359461, 36106716, 12967580, 12160663, 22924388, -29873108, --24858734, 36309116, -23491860, 18406620, 22742388, 1951526, 5813238, 8530342, 41132900, -14354854, --16194174, -38325068, -8508330, -16651051, 12540768, -24079198, 39960376, 21684754, 24269250, 11874511, -21165598, 11033771, 38124276, 9217000, 18156438, 13880261, -19276886, -9312563, -7679402, 3106872, -1828046, 18596134, 7856569, -272194, -1251446, 4044786, 1387811, -7589744, -14785962, -7953206, --11195906, 13355738, -5166846, -8021389, 4018479, -3267933, 16427176, 7505456, -3369939, 9171366, --11196980, 4930623, 8076149, -3321084, 15887621, 16358457, 10719701, -8060580, 13349832, 7641284, --13948980, -2873870, 1009854, -8463233, 519691, 11605539, -14044006, -16027207, 6539625, 2858301, --1929514, 14907295, -10647224, 26356604, -15699716, 13799730, 45004816, 22192632, 16873316, -25592100, -6884296, 24917790, -21778706, 35394824, 12563316, 18794776, 16869020, -11283953, 17489644, 14942191, -6211597, 35070556, 26617522, -2352568, -60740500, -7421167, 27943058, 26814018, 27715424, 6358162, -15400142, 1045825, 7677791, -2340757, -18903224, 38436736, -1155346, 36603860, 16505559, 26318486, --37420440, 24959666, 12491912, 11042898, -9885941, 8445516, -7049652, 8043400, 37034968, 14457934, -48359720, 2050847, 10638097, 27965606, -5784247, 44152800, 21872658, 3558381, -29518236, -18764176, -16184511, 1527398, -4947803, 638340, -5055714, 3158949, -21490942, 14020384, -22874996, -34382824, --12749074, -2238752, -11372537, -9109089, 28860570, -3779034, 26294326, -25354266, 28900298, 3540664, --31923418, 31303332, 26467736, -10238665, -4409858, 7214472, 13940390, 8571144, -1264868, -14853071, -9230422, -6609418, -834834, 17907330, -3629247, -3343632, -14650133, -4294431, 4212289, 2506114, --849330, 13373991, 12314208, -9947144, 3461744, -580357, 698469, 12270185, 4066797, -14114336, -9489730, -12125766, 6212670, -9877888, -3557844, -3377992, -1877438, 1253594, 2942590, 1317481, -1040993, -3093450, 2648384, -6979322, 4932233, 4884989, -748935, -5791227, 4428648, -1598265, -7259032, -4215511, -2838974, -9907416, 49392, -9802189, 2735894, -8174934, -26835492, -25633976, --10226317, -10992432, 21060372, -33607584, -41972568, -45594836, -55173148, 24924768, 27270894, -1363115, --4332012, 51540, -13046500, 3435437, 6977175, -11425687, 37751152, 35714264, 23265300, 25624312, --23286776, 15784542, 1351304, 18755048, -7226283, -9255655, -34489660, 31182536, -31168578, -37525668, --9898289, -7650948, 40605696, -21998286, 5475547, -20741470, -5873368, 39434780, 7262253, 12697534, -19368692, 36256504, 2202245, -3689377, -43910672, -7759932, -3542811, -898722, 24019068, 13285408, -81702088, 4457103, -2572149, -26740466, -2232309, 32873142, 29746944, -2299418, -14433774, -39992052, -10016937, 25968446, -13176423, -29043642, -12564927, 25614648, -7786776, 18920942, -58613956, -32313724, --46881180, -12221329, 18682034, 10422275, -20490752, -19002010, -23019414, 9652402, 48085916, 15061377, --339302, -16627429, -1524713, -12839268, -3788161, 6194954, 5543729, -14840723, -7096897, -864899, -10288594, -25558814, -17921288, -5567888, 12630962, -1253594, 16669305, 5935645, 1788317, -5345087, --3121368, -11183021, -2705830, -17124572, -4163971, 20001126, 6745783, 9426916, -13807783, -23871428, -11860552, 12084964, -7348152, 594853, -10361072, -1270237, 2780455, -703838, 8869644, 6316823, -5692979, 12275017, 6149857, 9838159, 9606231, -1319092, 7639673, 4940823, 7391102, 1028108, -974958, -7493108, -17147656, -9284109, 38961260, 502511, -564251, 69577936, 6173479, -52925272, --40817760, 48548164, 43017856, 1982127, -35507568, -43927852, -25520696, 7810398, 41829760, 37194952, -24671366, -16269336, 4257923, -16338592, 13166222, 31553514, 49100604, 53692460, -7544110, -29788282, --46672872, -69393784, -1434519, 35943508, 148089936, -20109036, -8658117, -72577432, -30464740, 5410048, -16464757, 87914224, 63194000, 38834556, -45712948, -26132192, -44678936, -3295314, 73482592, 67915784, -82915952, -23762980, -83034600, -60622388, -83832392, 20118164, 75577464, 66357244, 122959008, -59761248, --72546296, -63690608, -11209328, 53978612, 72197328, 101204464, 45437532, -22145388, -40375912, 8663486, --3747359, 28272696, 80843632, -18671834, 49967112, -18829136, -47652664, -50466, 6602976, 43435004, -1371705, -4844186, 3477850, -12302397, -41315436, 16198469, -6327024, 13099650, -12213813, -34143916, --8835285, -8619462, 3029026, 21449604, 2355790, -7152195, 7786776, -8850317, -11152419, -2697240, -31594316, 7471096, 28950228, -2911451, 2639258, -9236864, 3115462, 2676302, 5245229, 22195854, -38927436, -1913945, -11475079, -37085968, -48740364, 1157494, 2135673, 57339960, 36692980, 5558225, --20871394, -82568064, -46816756, -7783018, 36295696, 71694816, 36848136, -22648974, -27771258, -85564336, --32265404, 39723616, 73784320, 59448788, 3158949, -39122320, -44204876, -5039071, -2310156, 34473556, -20503100, 18569828, 464393, -18114562, -10634876, -867583, -8346732, 10545218, 11232950, -6197101, --36202816, 47808892, -10914586, 56429428, -51686172, 770947, -22523346, -53636088, 39473972, -28079422, -36541580, -28712394, -11057393, -2415919, 18844706, 4367982, -20554102, -10821707, -829466, 29341070, --27041650, 33636036, 24040542, -18030810, 4228396, -22683870, -22994182, 39157216, -38394324, -19151260, -25879862, 59716152, -415538, 8278550, -5453535, -25819732, -7289633, 24519432, -8428336, -39065412, -5542656, -8351027, -6679748, 12105902, -35869420, 18307298, -148713, 12628278, 27576912, -62209380, --46295988, -15062450, -1462973, 64590940, -34189012, 23587424, 50485192, -27471148, -16501801, -1458141, -27329950, 40269076, -21956410, 11866995, -8160438, 16146930, 62124016, -22781580, -70293584, 15269146, -31993212, 8708583, -37646464, 23756538, 9662066, 23857470, -7510824, -676457, -26368952, -20416128, -15237470, 4319664, -28111634, 8611409, 19088446, -8935679, -352187, -30540976, 4321274, -7259569, --34280820, -725313, 14994805, 13683229, 5245766, -438087, 8179765, -22784264, -6015639, 8736500, --11561515, 18376554, -11173894, -4041027, -10591926, 547608, -11275900, 17633526, 2800856, -12986907, --11915313, -6979, -821949, 28776818, -10196252, 10567230, -5473936, 29528, 5796059, -11615739, --11166915, 2447058, -24264418, -6029597, 6606734, -19722490, 555661, -3163780, -7449621, 4993973, -12863964, 621697, 1518271, -7373385, -4748087, -72331008, -22880902, 31184684, 42675868, 35436164, --36015448, 11604465, -100738456, -65499324, -55613920, -8797704, 47310676, 30447560, -2026688, -22102976, --27278948, 13429289, -16653199, -1650341, 36195836, 9893457, 1788317, -35692252, -17112224, -3587372, --16822314, 10974178, -2883534, 19428822, -4977867, -150324, -6244346, -1110249, -4509716, -20368882, --15338939, -34217468, -24073828, 17532056, 33645164, 36564668, 20448340, 31868658, -4714801, 27120570, --6193880, -12361990, -42633456, -1606855, -23483808, 18353468, 7155953, 54140748, -43528956, 15556372, -30484604, -16671989, -23054848, -13419088, -10661183, -11057930, 4088809, 38460896, 24863028, -10206453, --1266479, 27614492, -31745714, -35240744, 14747844, -40910636, -31341450, -27452894, 3615826, 13326747, -16086800, 47546360, 32479616, -5116380, 24230594, -13798119, 1169842, 5971615, 18016314, 28865402, -31363462, 21961778, 18408230, 14666240, 1474784, -39897024, -11070278, -20594368, -4927938, 23329188, --769336, 3548717, -8450348, -17762910, 2230162, -8774618, -7001334, -19353122, 8807904, 14532022, --6194417, 5601711, 13143674, 7081328, 8673150, 1464047, 8549132, -5731097, 5976984, -2715493, --9874130, 7745437, 10056666, -8037495, -11391327, 989453, -7586523, -13699872, 10872710, 11288248, -4770635, 14552423, -966368, -13556527, -16328392, 23159000, -9245454, -86307368, -127586832, -156639072, --123756264, -184650304, -32617056, -67411656, 20483772, 38822208, 133734544, 78127064, 138536320, 140867952, -192839200, 140769696, 143104016, 105419976, 4572530, -30490510, -55767464, -34280280, -115110496, -78654808, --62636192, -64014340, -63341104, -63219236, -61358976, -66215512, -72668696, -54158464, -84501872, -69092064, --60207388, -27007828, -70999032, -21901112, 26184804, -52735220, -25451976, 14255533, 11640972, -44635984, -37302864, 47924856, 60673392, 82284056, 83635896, -6500433, 49751828, 80886048, 114770656, 90471336, -180754240, 169766640, 149949664, 121518584, 153840896, 76409616, 122494080, 149097104, 114839376, 73462728, -124544928, 40452148, 41875396, 76536856, 76781128, 54542328, 15852187, 44595720, -14775224, 2711735, -39039104, -44336948, -111518824, -166684464, -65842384, -228228656, -199635984, -175569136, -203042976, -225897568, --189345776, -163884144, -158103120, -108952584, -143297824, -73540040, -90969016, -96690992, -146673136, -118504592, --85458040, -69969312, -59240484, -55510840, -34786012, 13907104, -102542, -3287798, 41375032, 86380920, -72036800, 72976328, 116295904, 99461776, 103333688, 131209640, 123719216, 105299176, 100138240, 120137216, -102278200, 99191192, 105231528, 109214040, 92870080, 81237696, 74721696, 69875360, 91282552, 71633616, -53712860, 56191056, 41994580, 24545202, -14550812, -30216168, -39633960, -70972184, -60789356, -62906240, --74956840, -79199736, -72963976, -47556024, -53443352, -48326972, -49255220, -25448754, -28331752, -33957624, --23489176, -7790534, -8927626, -16285979, -10781442, 183610, -6806450, -9193377, -8538932, -3248606, --5095979, -7385733, -5835250, 3609383, 5513128, 1544578, -3471944, 149250, 4469987, 1070521, --3996467, -734439, 1762010, 949188, -1082332, 1695438, 1512365, 2489471, 2152852, 118112, -74088, 2058363, 2199560, 4771172, 2962454, -974958, -3105798, 1211181, 2410551, -1263794, --2437931, -1414118, -3338800, -2516851, -2779918, -4188130, -3579855, -3551938, -4393752, -2779918, -184147, 2433099, 1624035, 3780645, 5678484, 5562520, 4446365, 6312528, 8870181, 8296803, -7861938, 9255655, 9115531, 10865730, 9685688, 8902930, 10469520, 10480257, 7837779, 4392141, -4481799, 3311420, 125091, -1080184, -2151779, -3193845, -4639102, -5245229, -5329518, -5064840, --5197984, -4807142, -4381941, -4062502, -3435974, -3059091, -2345052, -1722819, -1393717, -1169842, --885837, -612570, -547071, -446140, -383863, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +7451232, 2618320, -1320703, 1911261, 2416456, 4479651, 7463580, -3540127, 2500745, -3012383, +-2331094, 1519345, 49929, 646393, -5214091, -2524367, 1883880, 3725884, -459562, 3142842, +-5591511, -4968204, 3177739, 2032593, 899796, 2309082, -1884954, 4053376, 4549444, 4401805, +6320581, -3464428, -2841658, 244813, 836982, -6004901, -341450, -503585, 1694902, 611496, +-3728569, -910533, 5172751, -2724083, 1047972, -3127810, 1549946, 1601486, 1069984, -4668630, +3825205, 360777, 897111, -630823, -1495186, -1928977, -3149822, 6810208, -1151588, -1240172, +-1476932, 3031173, 752156, -6415608, 1682017, -2924336, -4361003, 2614025, -2676838, -6948184, +2827162, 1031329, 356482, -6402723, -7723425, -3167539, -3779034, 3613678, -991064, -2147, +-1703491, -2095944, -1693828, 59593, 3242164, 585189, -1363115, -110595, -1426466, -654983, +1472637, 433792, -1284732, -1817308, -568546, -743566, 762894, -454193, 327491, 259309, +827855, 200253, 1159641, -455803, 324807, -250182, 838592, -45097, 776315, 898185, +4294431, 464930, 321586, 3815005, -5825050, 915365, -4869956, -6148246, 1705639, 5669357, +-3590056, 2665564, -2715493, -1335198, 1098975, 238371, -2885144, -8456791, -8404177, 102005, +-2168422, -123480, 4313221, 652835, 5293011, 7179038, -3863860, 6193880, 724239, 6287832, +345208, 7470559, 901406, -4250944, -1212791, 378494, 3367254, -970663, -1186485, 702227, +2541547, -3167539, -246961, -1007170, 2240899, 2757906, 96100, -2888366, -260382, -557272, +1585380, 2900177, 5210332, -1879585, 3359738, -1581622, -4646081, -4133906, -2829310, 2555506, +2754685, -1587527, 4497368, 112206, 1593970, 200253, 5480915, 3638911, 4022237, 1623498, +2342905, 1449552, 2169495, 4494147, -1024350, -268435, 6334003, 1250372, 120796, 1297617, +-2443300, 323196, 1822677, -176094, -6044093, 1842541, 569620, -990527, -2141578, 1351304, +341450, 3226057, -1269700, -622233, -1314797, -1042066, 754304, 207769, 1235877, 588947, +231391, -1204202, -1004486, -577136, -650688, 486405, -1626719, 1343788, -631897, 379568, +-450972, -579284, -938450, 504122, -772020, -548145, -1768990, 6516003, -6558952, -4404489, +-3609920, -5301064, 1738925, 2354716, -4255776, 1046898, 8883066, -6387690, 4526896, 7670275, +7581691, -4598300, -1226750, 3785477, 762357, 1209570, -3336653, 1907502, -11421392, 9057012, +14154602, 2551211, 4799089, -2239289, -144418, 7546795, -3890704, -8994198, -1457605, 191126, +21475, -7254200, 590558, 1876364, -8640400, -4024921, 4081293, 1427003, -3041911, -745177, +3060701, -4177393, 9046812, 2868501, 466004, -5713380, -520228, 3166465, -1910724, 254477, +-2012192, -52613, -810138, -4562866, 339302, -4409858, 6802692, -6458020, -4292283, -1395864, +-7762080, 5303211, -4153234, -10806675, -1949915, -4621922, 1377611, 5068062, -5032091, 701690, +-3401614, 3620658, 539018, -3521336, 3130494, -3820910, -5100274, 5806796, -3656628, 1711545, +185757, 597000, 2049236, -1054951, -1705102, -1877438, -3090229, 1130113, -4386236, 332860, +-853088, 1474248, -1274532, -26844, 49392, 202400, -2309619, 2191507, 143881, 482647, +-1225676, -804233, -909459, -135291, 1372242, -5099737, 3213709, -175557, -1017370, 3814468, +-3660923, -12812424, -2517925, -816581, 5566278, 7881265, 6990596, 3339874, -2770254, -894427, +-7900056, -6715718, 2291365, 8956081, -2588792, 9175124, 5844914, -5718212, 3041911, -910533, +3182571, -6388764, -4296041, 1009854, 4577362, -619012, 2725694, 3782256, -7190312, -1481227, +-3321084, -9820980, 6075768, 928250, 2203318, 4198331, 7751879, 2662880, 361314, 6041945, +-1423782, -3155190, 6256157, -3338800, 10574746, 4829691, 4206384, 176631, -3039763, -3744138, +5187247, 6999723, -5231807, 1227824, 6731825, -1240709, 2193118, 14814953, -4487704, -1837172, +2896419, -7497939, -292595, 1285269, -3312494, 3570729, -2395518, 2182380, 7388955, 208306, +-1685775, -5073430, -398895, -6289443, 2653753, -2367601, -3049427, -1331977, 1202591, -1848983, +-1779190, -1567663, 359704, 2241973, 1722819, 411243, -508417, -753767, -504122, -404264, +-1009317, -1896228, -328565, -629750, 999654, -56371, 518617, -1919850, 819265, 917512, +-661425, -1691680, -569620, -1771674, -864899, -826244, 1299765, 70867, -229244, -197569, +338229, 135291, 707596, -2681133, -639950, 787590, -3327526, -18369576, -1552631, -454193, +-3729642, -5743982, -1927367, 9753871, -7029251, -10482405, 3843996, -4298189, 1422171, 1786706, +6522982, -4564477, -1423245, 1228898, 6060199, -2935610, -4090420, -1272921, -3528316, 4447976, +8205535, 4095251, 7516, -751619, -4806606, -351650, 12947179, 2223183, -1683627, 14971182, +-966905, 11117523, -3446175, 23085, 7523709, 2238215, 1821066, 2643016, 1264868, 4110284, +2365990, -7207492, 13211319, 8004209, 10836739, 7246147, 4747550, -7331509, 3147137, 3635690, +493921, -4519916, 12261058, 7398618, 11070815, 1920387, -2285460, -2807298, 8135742, -4060355, +-8532489, 9899900, 3052648, -5533529, -3237869, 434329, -2624762, 915365, -1223529, 1347546, +-3521873, -1005559, -8078834, 3018825, -1052267, -264677, 2880849, -1042066, -1564979, 4658966, +-376883, 3608310, 4842576, 3969624, 2527052, 2524367, 971200, 1454383, -40802, -1069447, +-1000191, 2102387, -670015, -1368484, -1438814, 974958, -1614908, -449361, -371515, 2636573, +1055488, 1877438, -1865090, 526134, -1508607, -550293, 1789928, -292058, -818191, -635655, +-551366, -1103807, -783832, 744640, -111132, -507880, -4725538, -749472, -12080132, -4822175, +-13499082, -9278740, 909459, -8800388, -6934762, 725850, -1605781, 8899172, -6052146, 9870909, +12145094, 1169842, -10455561, -7382512, 10903848, -5657546, -3073586, 6069863, -8106751, -14358613, +5651103, 12227772, -6403260, 3057480, -295279, 5281736, -14951318, 2877628, -6044093, 3506304, +238908, -6337761, 10320270, 4651450, 4325569, 13728326, 6386617, 2761127, 7777112, 1472100, +2482491, 3848291, 1265942, 530428, 2087354, 1786706, 15693274, 8749385, -84289, 13102871, +8226473, 9643275, 15199352, -7902203, -6553583, 13242995, -4699768, -627065, -7973607, -3471407, +4707821, 6968585, -6083285, -830539, 1972464, -1830193, 3639985, -6518687, -1240172, -7522635, +14339822, -4773320, 7814156, -2360085, -3878356, 10443750, 1817308, -3228205, 3402688, -1440425, +266288, -3126199, 3965866, -889058, 1407139, 4145717, 2424509, 1141388, 2383170, 47782, +-414464, 1576790, 407485, -3072512, 602906, -758599, -1395328, 2507187, -28454, 1149441, +1061394, -745714, 482647, -1870995, 335007, -1723893, 111132, -796180, 1898376, 355945, +1629403, 287763, 1977296, 382789, 897111, 1034550, 181462, 4510253, -4903242, 1527398, +659278, 1515050, -7026567, 9043591, 5226975, 12301860, 2345052, -1703491, -13968844, -7474317, +-5265093, 3525631, -7279970, -12083890, -3405372, 3063386, 1293859, -13487808, 10878615, 817654, +-868120, -11489574, -6647536, 2684892, 1362578, -12759811, -4014184, 4639639, 463320, 1270237, +6477348, 7616051, 4403415, -1984275, 3791383, 1179505, -4626217, -9438728, 16192564, -4086125, +-7970386, 149787, 3973919, 5247913, 12090870, 1995549, -279173, -4566624, -195421, 6738804, +-911607, 8421357, 16072304, 1360431, -3559991, 495532, 13827110, 17380122, -8720931, 2434710, +2361695, 9404368, 4899484, 1670205, 2823404, -6900939, 4243965, 4497368, 4406100, -2969970, +187368, 3432753, 5104032, -705985, 1706713, 1221381, -5946919, 2862059, 205622, -5268315, +-3923990, 5651103, -2597382, 3921842, -5713380, -4270808, -1999307, 1318555, -164819, 5111011, +2237678, 951872, 169114, 2580739, 2259690, 783832, -4362076, 237297, -1881196, 738198, +-1438277, -988916, -137976, -373125, -695785, -1397475, -4283156, -1103270, 367220, -2762201, +-1891933, -1723893, -16106, -1723356, -3051038, -617938, 1308354, 2359548, -879395, 736587, +-1214939, 877784, -4599910, 6318434, -5774047, -10417980, 7093139, -915365, -2588255, 2649458, +6029597, -17430052, 1000191, 13227962, -1611150, 23856932, 11372537, -7383586, -5428839, -2319282, +-6977175, -3147137, 10621991, -4187593, -3566434, 10631118, 8630200, 2792803, 4923107, 9931038, +6563247, 7412040, -5548561, -3831111, 9443022, -1944547, 8543227, -22012, -10332081, -6682432, +2723009, 8042327, -11231339, 620086, -6023155, 3051574, -6874632, 9418326, 9414568, -9323837, +-1039382, 2623688, -354335, -12581033, -5659693, 2066953, 8237748, 13565654, 4585952, -10185515, +-2282238, -2537252, -1237488, 8503498, 1313186, 6798397, -10388452, 4563403, 656056, -8275865, +9659918, 4047470, -1359894, -2254858, 1628866, -444529, -8409546, 6220187, -1982127, 3676492, +-6544994, -11571179, -6418292, 2638184, 5082020, 42950, 2786897, 10234907, 61740, -2718714, +6442988, -2090039, 6062883, 278636, 1940252, -5322538, 493921, 56371, 2760053, 2998424, +4286914, 2667712, -1105417, -1349157, -2052458, 5048734, -2441152, 2589865, 521839, 1529008, +2068027, 2790118, 1231045, -1069447, 2553358, 933082, 833224, -1079647, 3449396, 1562831, +698469, -3545496, 1228361, -1448478, -66035, 2283312, 667331, 10992432, -13732621, -2251100, +-4443681, 13919452, -6337761, 11456288, -3682935, 10691247, 14513231, -6546604, 4519380, -3787624, +8229694, -3233037, 6837051, 5677410, 5329518, -1310502, 5609228, -2944200, -7332046, -3546569, +7996692, -9527848, 1405528, -98247, 7111929, 14523969, -13441637, 408022, 12979928, -380105, +11857868, 1573032, 5156645, -1707786, -1110786, 3169149, -18537078, 1760400, -541166, -7391102, +4779225, 2965675, 13281649, 6605660, -1431298, 25362318, 6229850, -13446469, 3439195, 1233729, +8770860, -5823439, 1597728, 7448010, 483721, 4517232, -1444183, -14679124, -15093589, -20401, +-5177046, 11988327, -20475720, 26131118, -268972, 14526653, 16556025, 3959960, -4534412, -3379603, +-7950522, -10424422, -1008780, 3297998, -2753611, 5192616, -3626563, -8402030, -5401995, -4270808, +1377611, -1354525, 792958, 5557688, 2689723, 2610266, 1923609, -2389613, -3011846, 117575, +-744103, 1558536, 248034, 600759, 1629940, 3206730, 1803349, -6534256, 1044751, -1272384, +4581657, 4715874, 2613488, -484794, -1525250, 1824287, 1343788, -2337536, -2565169, -641561, +-1801739, 414464, -1916092, -3180960, 1102196, 5209259, -1504312, 2079301, -4176856, 488016, +2164664, 2376191, -274341, 1516660, 3224984, -2515240, 1094143, -24186572, -1684701, 8273718, +1385127, -9063992, -22463752, 22549, 2593087, -3911105, -918586, -6588480, 3506841, -5478231, +11602854, 4124242, -6884833, -8593156, -14767171, 11108396, -4700842, 797790, 14424111, 19859928, +12094628, -1796370, 1049583, -13544179, -5800354, -5417565, 3660923, -19232326, 5048734, 5319317, +1112933, -9860171, 9527311, 14860587, -2378875, -201863, 1733556, -8533026, -9077950, 5288716, +3584150, 11260867, -12307766, 13426068, -7034083, 7430831, -11396159, -8930848, -4506495, -223875, +-1349694, 4947803, -2458869, -19857782, -14947560, -4133906, 528281, -19908248, 275415, 9959492, +-5293011, -2232309, 3023657, 8483097, -17588428, 9064528, -3099893, -2564096, -94489, 7265474, +8964134, -10479720, -5402532, -7018514, -3460670, -2481417, 5204964, 1816771, -6387153, -2774549, +-4902705, 3477313, 11670500, 7789460, -80531, -250719, -6546067, 336081, -4008815, 5590437, +-1022739, 9685688, 3179350, 3439195, -3471944, 293132, 85362, -7582765, 8164196, 706522, +-1478006, 4366371, -1547262, -1202054, -425202, 725850, -6694244, 3024731, 4014721, 4395899, +-736050, -1474784, 1414118, 2530273, -2430415, -1312649, 2310156, -4962298, 505196, -22549, +4698694, -260919, 21725018, 508417, -4434554, 16894790, -3718368, -6895570, -1843078, -1570884, +20951924, 23975044, -3147137, 5092221, 6089190, -3073586, -11415486, 5599564, 22279606, 17006460, +14522358, -5287105, 6279242, 11973832, -15572478, -11580842, 13552769, -6930467, -7634841, -522375, +16949552, -2553895, 15600395, 1030792, 13996225, -8390219, 19241454, 5869610, -6004365, -9820980, +3491809, -13895830, 1643899, -16489453, -5655398, -5905043, 9421011, -9432285, 15538655, -19036368, +-32992866, 20620138, 9193914, -4029216, 147640, 22746146, 10644003, 1830730, -5989869, 4936528, +-2671470, 302258, -14791867, -14948634, 8791261, -4995584, 4846334, 28246926, -7406134, 6106370, +-18443664, 21838834, -7321309, -9695352, -4690105, -3002719, 9079024, -18428630, 15423764, -18059800, +13035763, -9272298, -12650289, 12654047, -568546, 4184909, -5141613, 7511361, -4111894, -5638219, +-2570538, -8575439, 5928666, -216896, -5646809, -2323041, 2079838, 9285719, 1725503, 1388348, +2440078, -156229, -1591822, 4756677, -2650532, 2195802, 1934346, -2310156, -694174, -448824, +6600828, 5873368, -2144263, -3109556, -6935836, -35433, -1427003, -897648, -1141388, 306553, +6331856, 2010045, -775242, 8113730, 3900367, -24705726, -18361522, -17799956, 24890410, 853625, +10689637, 6382859, -21904334, -19138912, 12891881, -34163244, 9996536, 10177462, -2191507, -13577465, +-12506945, 21325050, -11452530, -1477469, -3582003, -11011222, 16197395, 5188321, 14652818, 8554501, +10106058, -3174518, 16448651, -1482301, -10772315, -12640089, -2929168, 7176354, -9621264, 12814572, +8188892, -9596568, -34629248, -2869575, -2864206, -818191, 25126096, 609885, -19724638, -11647414, +-12073690, 10369125, -7623030, -16362215, -18341120, -11346767, -8937290, -40766756, 941135, 5136244, +13368086, -21272436, 6937446, -17568026, -14456323, -4886599, 17013976, 4412005, 15785615, 29953638, +8946417, 6912213, 19447612, -15154792, -1999844, -7171522, -8403640, 15676631, 14386530, 23005992, +11214160, -20968568, -14072997, 16559783, -24905978, -27302570, -8679055, 19983946, 3079492, -4821101, +13507135, 11143830, -205085, 3217468, 11432129, -7489886, 6720550, -5506148, -1165010, -5739687, +-1184337, 1572495, 7961796, -5071820, -6599754, 37581, 4434017, 1511292, 4015258, -592169, +-6613713, -1497333, -4432406, 390842, -3732327, -651761, -659278, -7239168, 5756330, 957778, +5855114, 7621420, 10287520, -3873524, -5746130, -389768, 821949, 601832, 11457362, -11159936, +-23000624, 5937256, -629213, -739271, 529892, 2863670, 4508105, 9655086, 2925947, 8078834, +4301410, 9628243, 25414932, 544387, -33864208, -12600897, 8166881, 13422, -7312182, -21874806, +-14539538, 4217658, 17129404, 6451041, -17056926, 8617315, 6734509, -19216758, -3929358, -23688892, +17974976, -10063108, -12560095, 16608102, -16784732, 4252018, 34917012, -4476967, 5357972, 10083509, +-458488, 4803921, -21091510, 4693863, 3248606, 3008088, 45970644, 31060666, -3877819, -16523813, +-11128260, 14229764, 16485695, -18936510, -10791642, -25295746, 39153996, 10562935, 4144644, -6730751, +-4763119, -9185861, -5340255, 28113782, -8074539, 7341710, 27977416, 4412542, -8489003, -21479668, +74625, 8069707, -42915852, 8851928, 4162897, 28635620, 19339700, 15081241, 25419764, 14254460, +-5625871, 2155537, 8538932, -3335042, 765578, -2246805, 3610994, 1869921, 23698018, -1122060, +9430674, -4694400, 9088151, -1240172, 12300786, 2279017, 3052648, 11229192, -1476395, 4393215, +7338489, -249645, 5827734, 8520678, 3418257, 6695854, 9914395, 5541045, -4452271, -1231582, +1755568, 2089502, -464393, -4675609, 1519882, 2254858, 672162, 5072893, -1351841, 8231842, +4155918, -4068408, 8487392, -1738388, 725850, -5950677, -27174258, -3922379, 18653042, 10456098, +-30447024, -40096740, 4557497, 27181238, 10944114, 16608639, -9509058, 12829067, 2088965, 337692, +-14612552, -5203353, -22721988, 33647312, 11200201, -27302034, -18818400, 12243341, 1216550, 6760816, +-8260833, 16807818, 9714679, 11583527, 21929030, 19542638, 3925063, 19112604, -10135586, 10994579, +-153008, 13358959, 6011344, -3141769, -8127152, 9245454, -12020540, 31448824, -8541616, -5866926, +6325950, 15587510, 15228880, -10315438, 26920318, 26872000, 15465640, 6566468, 2130304, -8531416, +-20479478, -34745748, -5779952, 12483322, -871342, 15259482, 16403554, 17816598, 6048388, 9975598, +57727580, -28337658, -12548821, 5840082, 11053098, -1354525, -45290968, 10709501, -7149510, 6883222, +7883413, 20130512, 3889093, 456877, -18283676, 18955838, -6868727, 2838974, 16377247, 7618735, +-17727478, -3681861, -10014790, -3249143, -7716983, 1366873, 576599, 7225209, -1816234, 8788577, +8378945, 11363410, -228170, 37581, -6937983, -2933463, -9248675, -6025839, -2838437, 12084964, +3708704, -1742683, 693637, -4541391, 1612223, 10627897, 11652246, -2199560, -10978473, -52613, +550293, 5235029, -3113315, 3670050, -5272073, 8125542, -15315853, 1701344, -4776541, -5206574, +-110059, 3181497, -9907416, 4902705, -1969243, 4859756, -5122286, -8972187, 3365644, 15103789, +14874009, -8262444, -11212549, 3281355, -10773925, -34467648, 35560720, -10430328, 9980967, 3251290, +29826938, 23751706, 14938433, -14283987, -2370822, 20367808, 10818486, 23980414, 64035280, -4016331, +-25259240, -6633040, 19137300, -2912525, -29829084, 45507864, 23601920, -16121160, -24972550, -3136400, +5593121, -7993471, 18093624, 15316927, 17755394, 33952252, 5695127, 9545565, 6081674, -13241384, +-31660352, 18548354, -21541408, -16254304, 24998320, 13029857, 14105209, 7326141, 5158793, -1505386, +-31253940, -27829778, 531502, 16524350, -20654498, 19502910, -9152038, -23263154, 7331509, 20262582, +-3738769, 3834332, 20226612, 19827180, 20695836, 1438814, -12588549, 11696270, 49145164, 5835250, +20004884, 27969364, 1404454, -8987756, -24648818, -10074920, -38863548, -13435195, -9698036, -4896800, +8883066, 1412507, -1725503, -11282342, -7321846, -6597607, 9656697, -10109816, -1950989, -8934069, +2925947, -5716065, -9532143, 268435, -13740674, -4978404, 292058, -12577812, -2298881, -10976326, +-6210523, 1076426, -19859928, -2055142, 996969, -352724, 9475772, -12813498, -4112431, 13459354, +330712, -5497022, -523449, -4720706, 2684892, -5990943, -4351876, 6615324, -400506, 302258, +-10672457, 17734456, 14541686, 98247, -12157442, -17811766, -31265214, 5257577, 18748606, 25761750, +-22424024, -23875186, 28662464, 12732431, -1429687, -3205656, -12303471, 5245229, -5894843, -12805982, +12977244, 15916612, 10899016, 807991, -2662880, -9324911, 1639067, 6530498, 3805341, -10498511, +-36461052, 7796977, -8536784, -11117523, 1691680, -4943508, 2710124, -36293012, 16472810, 12901008, +-26263726, 17886928, 23779086, 19906100, -5741298, 3117610, -3555696, 12889734, -3306051, -337155, +64063732, -19600620, 5019743, -17526688, -10359461, 36106716, 12967580, 12160663, 22924388, -29873108, +-24858734, 36309116, -23491860, 18406620, 22742388, 1951526, 5813238, 8530342, 41132900, -14354854, +-16194174, -38325068, -8508330, -16651051, 12540768, -24079198, 39960376, 21684754, 24269250, 11874511, +21165598, 11033771, 38124276, 9217000, 18156438, 13880261, -19276886, -9312563, -7679402, 3106872, +1828046, 18596134, 7856569, -272194, -1251446, 4044786, 1387811, -7589744, -14785962, -7953206, +-11195906, 13355738, -5166846, -8021389, 4018479, -3267933, 16427176, 7505456, -3369939, 9171366, +-11196980, 4930623, 8076149, -3321084, 15887621, 16358457, 10719701, -8060580, 13349832, 7641284, +-13948980, -2873870, 1009854, -8463233, 519691, 11605539, -14044006, -16027207, 6539625, 2858301, +-1929514, 14907295, -10647224, 26356604, -15699716, 13799730, 45004816, 22192632, 16873316, -25592100, +6884296, 24917790, -21778706, 35394824, 12563316, 18794776, 16869020, -11283953, 17489644, 14942191, +6211597, 35070556, 26617522, -2352568, -60740500, -7421167, 27943058, 26814018, 27715424, 6358162, +15400142, 1045825, 7677791, -2340757, -18903224, 38436736, -1155346, 36603860, 16505559, 26318486, +-37420440, 24959666, 12491912, 11042898, -9885941, 8445516, -7049652, 8043400, 37034968, 14457934, +48359720, 2050847, 10638097, 27965606, -5784247, 44152800, 21872658, 3558381, -29518236, -18764176, +16184511, 1527398, -4947803, 638340, -5055714, 3158949, -21490942, 14020384, -22874996, -34382824, +-12749074, -2238752, -11372537, -9109089, 28860570, -3779034, 26294326, -25354266, 28900298, 3540664, +-31923418, 31303332, 26467736, -10238665, -4409858, 7214472, 13940390, 8571144, -1264868, -14853071, +9230422, -6609418, -834834, 17907330, -3629247, -3343632, -14650133, -4294431, 4212289, 2506114, +-849330, 13373991, 12314208, -9947144, 3461744, -580357, 698469, 12270185, 4066797, -14114336, +9489730, -12125766, 6212670, -9877888, -3557844, -3377992, -1877438, 1253594, 2942590, 1317481, +1040993, -3093450, 2648384, -6979322, 4932233, 4884989, -748935, -5791227, 4428648, -1598265, +7259032, -4215511, -2838974, -9907416, 49392, -9802189, 2735894, -8174934, -26835492, -25633976, +-10226317, -10992432, 21060372, -33607584, -41972568, -45594836, -55173148, 24924768, 27270894, -1363115, +-4332012, 51540, -13046500, 3435437, 6977175, -11425687, 37751152, 35714264, 23265300, 25624312, +-23286776, 15784542, 1351304, 18755048, -7226283, -9255655, -34489660, 31182536, -31168578, -37525668, +-9898289, -7650948, 40605696, -21998286, 5475547, -20741470, -5873368, 39434780, 7262253, 12697534, +19368692, 36256504, 2202245, -3689377, -43910672, -7759932, -3542811, -898722, 24019068, 13285408, +81702088, 4457103, -2572149, -26740466, -2232309, 32873142, 29746944, -2299418, -14433774, -39992052, +10016937, 25968446, -13176423, -29043642, -12564927, 25614648, -7786776, 18920942, -58613956, -32313724, +-46881180, -12221329, 18682034, 10422275, -20490752, -19002010, -23019414, 9652402, 48085916, 15061377, +-339302, -16627429, -1524713, -12839268, -3788161, 6194954, 5543729, -14840723, -7096897, -864899, +10288594, -25558814, -17921288, -5567888, 12630962, -1253594, 16669305, 5935645, 1788317, -5345087, +-3121368, -11183021, -2705830, -17124572, -4163971, 20001126, 6745783, 9426916, -13807783, -23871428, +11860552, 12084964, -7348152, 594853, -10361072, -1270237, 2780455, -703838, 8869644, 6316823, +5692979, 12275017, 6149857, 9838159, 9606231, -1319092, 7639673, 4940823, 7391102, 1028108, +974958, -7493108, -17147656, -9284109, 38961260, 502511, -564251, 69577936, 6173479, -52925272, +-40817760, 48548164, 43017856, 1982127, -35507568, -43927852, -25520696, 7810398, 41829760, 37194952, +24671366, -16269336, 4257923, -16338592, 13166222, 31553514, 49100604, 53692460, -7544110, -29788282, +-46672872, -69393784, -1434519, 35943508, 148089936, -20109036, -8658117, -72577432, -30464740, 5410048, +16464757, 87914224, 63194000, 38834556, -45712948, -26132192, -44678936, -3295314, 73482592, 67915784, +82915952, -23762980, -83034600, -60622388, -83832392, 20118164, 75577464, 66357244, 122959008, -59761248, +-72546296, -63690608, -11209328, 53978612, 72197328, 101204464, 45437532, -22145388, -40375912, 8663486, +-3747359, 28272696, 80843632, -18671834, 49967112, -18829136, -47652664, -50466, 6602976, 43435004, +1371705, -4844186, 3477850, -12302397, -41315436, 16198469, -6327024, 13099650, -12213813, -34143916, +-8835285, -8619462, 3029026, 21449604, 2355790, -7152195, 7786776, -8850317, -11152419, -2697240, +31594316, 7471096, 28950228, -2911451, 2639258, -9236864, 3115462, 2676302, 5245229, 22195854, +38927436, -1913945, -11475079, -37085968, -48740364, 1157494, 2135673, 57339960, 36692980, 5558225, +-20871394, -82568064, -46816756, -7783018, 36295696, 71694816, 36848136, -22648974, -27771258, -85564336, +-32265404, 39723616, 73784320, 59448788, 3158949, -39122320, -44204876, -5039071, -2310156, 34473556, +20503100, 18569828, 464393, -18114562, -10634876, -867583, -8346732, 10545218, 11232950, -6197101, +-36202816, 47808892, -10914586, 56429428, -51686172, 770947, -22523346, -53636088, 39473972, -28079422, +36541580, -28712394, -11057393, -2415919, 18844706, 4367982, -20554102, -10821707, -829466, 29341070, +-27041650, 33636036, 24040542, -18030810, 4228396, -22683870, -22994182, 39157216, -38394324, -19151260, +25879862, 59716152, -415538, 8278550, -5453535, -25819732, -7289633, 24519432, -8428336, -39065412, +5542656, -8351027, -6679748, 12105902, -35869420, 18307298, -148713, 12628278, 27576912, -62209380, +-46295988, -15062450, -1462973, 64590940, -34189012, 23587424, 50485192, -27471148, -16501801, -1458141, +27329950, 40269076, -21956410, 11866995, -8160438, 16146930, 62124016, -22781580, -70293584, 15269146, +31993212, 8708583, -37646464, 23756538, 9662066, 23857470, -7510824, -676457, -26368952, -20416128, +15237470, 4319664, -28111634, 8611409, 19088446, -8935679, -352187, -30540976, 4321274, -7259569, +-34280820, -725313, 14994805, 13683229, 5245766, -438087, 8179765, -22784264, -6015639, 8736500, +-11561515, 18376554, -11173894, -4041027, -10591926, 547608, -11275900, 17633526, 2800856, -12986907, +-11915313, -6979, -821949, 28776818, -10196252, 10567230, -5473936, 29528, 5796059, -11615739, +-11166915, 2447058, -24264418, -6029597, 6606734, -19722490, 555661, -3163780, -7449621, 4993973, +12863964, 621697, 1518271, -7373385, -4748087, -72331008, -22880902, 31184684, 42675868, 35436164, +-36015448, 11604465, -100738456, -65499324, -55613920, -8797704, 47310676, 30447560, -2026688, -22102976, +-27278948, 13429289, -16653199, -1650341, 36195836, 9893457, 1788317, -35692252, -17112224, -3587372, +-16822314, 10974178, -2883534, 19428822, -4977867, -150324, -6244346, -1110249, -4509716, -20368882, +-15338939, -34217468, -24073828, 17532056, 33645164, 36564668, 20448340, 31868658, -4714801, 27120570, +-6193880, -12361990, -42633456, -1606855, -23483808, 18353468, 7155953, 54140748, -43528956, 15556372, +30484604, -16671989, -23054848, -13419088, -10661183, -11057930, 4088809, 38460896, 24863028, -10206453, +-1266479, 27614492, -31745714, -35240744, 14747844, -40910636, -31341450, -27452894, 3615826, 13326747, +16086800, 47546360, 32479616, -5116380, 24230594, -13798119, 1169842, 5971615, 18016314, 28865402, +31363462, 21961778, 18408230, 14666240, 1474784, -39897024, -11070278, -20594368, -4927938, 23329188, +-769336, 3548717, -8450348, -17762910, 2230162, -8774618, -7001334, -19353122, 8807904, 14532022, +-6194417, 5601711, 13143674, 7081328, 8673150, 1464047, 8549132, -5731097, 5976984, -2715493, +-9874130, 7745437, 10056666, -8037495, -11391327, 989453, -7586523, -13699872, 10872710, 11288248, +4770635, 14552423, -966368, -13556527, -16328392, 23159000, -9245454, -86307368, -127586832, -156639072, +-123756264, -184650304, -32617056, -67411656, 20483772, 38822208, 133734544, 78127064, 138536320, 140867952, +192839200, 140769696, 143104016, 105419976, 4572530, -30490510, -55767464, -34280280, -115110496, -78654808, +-62636192, -64014340, -63341104, -63219236, -61358976, -66215512, -72668696, -54158464, -84501872, -69092064, +-60207388, -27007828, -70999032, -21901112, 26184804, -52735220, -25451976, 14255533, 11640972, -44635984, +37302864, 47924856, 60673392, 82284056, 83635896, -6500433, 49751828, 80886048, 114770656, 90471336, +180754240, 169766640, 149949664, 121518584, 153840896, 76409616, 122494080, 149097104, 114839376, 73462728, +124544928, 40452148, 41875396, 76536856, 76781128, 54542328, 15852187, 44595720, -14775224, 2711735, +39039104, -44336948, -111518824, -166684464, -65842384, -228228656, -199635984, -175569136, -203042976, -225897568, +-189345776, -163884144, -158103120, -108952584, -143297824, -73540040, -90969016, -96690992, -146673136, -118504592, +-85458040, -69969312, -59240484, -55510840, -34786012, 13907104, -102542, -3287798, 41375032, 86380920, +72036800, 72976328, 116295904, 99461776, 103333688, 131209640, 123719216, 105299176, 100138240, 120137216, +102278200, 99191192, 105231528, 109214040, 92870080, 81237696, 74721696, 69875360, 91282552, 71633616, +53712860, 56191056, 41994580, 24545202, -14550812, -30216168, -39633960, -70972184, -60789356, -62906240, +-74956840, -79199736, -72963976, -47556024, -53443352, -48326972, -49255220, -25448754, -28331752, -33957624, +-23489176, -7790534, -8927626, -16285979, -10781442, 183610, -6806450, -9193377, -8538932, -3248606, +-5095979, -7385733, -5835250, 3609383, 5513128, 1544578, -3471944, 149250, 4469987, 1070521, +-3996467, -734439, 1762010, 949188, -1082332, 1695438, 1512365, 2489471, 2152852, 118112, +74088, 2058363, 2199560, 4771172, 2962454, -974958, -3105798, 1211181, 2410551, -1263794, +-2437931, -1414118, -3338800, -2516851, -2779918, -4188130, -3579855, -3551938, -4393752, -2779918, +184147, 2433099, 1624035, 3780645, 5678484, 5562520, 4446365, 6312528, 8870181, 8296803, +7861938, 9255655, 9115531, 10865730, 9685688, 8902930, 10469520, 10480257, 7837779, 4392141, +4481799, 3311420, 125091, -1080184, -2151779, -3193845, -4639102, -5245229, -5329518, -5064840, +-5197984, -4807142, -4381941, -4062502, -3435974, -3059091, -2345052, -1722819, -1393717, -1169842, +-885837, -612570, -547071, -446140, -383863, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, }; const Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955] ={ { { 5294084, -2538326, -3474629, 5252208, -3056406, -1127966, 133681, -1877975, -1990717, -4176856, 1038845, -6187438, 693100, 1060320, 2706903, 584116, -2163590, -748935, -1264868, -1388885, 3839701, -979253, 550293, -1351304, 752156, -217433, -1385664, -2418067, 3723200, 2762738, 577136, --842350, 4309463, -5984500, -2153926, 2461553, -2401424, 5037997, 574452, 3537979, 515933, -354872, 2382633, -2103460, -798327, -131533, -4832, -1655710, -1222455, 2188286, -60130, --5524939, 5177583, -782221, 924492, -4676683, 2245194, -2105071, 1868848, 77309, -106837, --1795833, -126165, -2731062, 2806761, -5251135, -534723, 3732864, -2956011, 1352915, 5713380, -1661616, 619549, -2879776, 350040, 1449015, -1017370, 1831267, -1140314, -881542, -1546725, -1650878, -1812476, -3036005, 995359, 437550, -697395, 3586298, -876710, -848256, -841814, -1151588, 1376000, -154082, 193810, 600222, -682363, 593779, -1360431, -639950, -185757, --353798, -713501, -85899, 1074, -216359, -401579, -93952, -716723, 343061, -339839, -817654, -532039, 593242, 935229, 555661, 10934450, 2017561, -1526861, 3339874, -1648194, --1367947, -1745904, -711891, -4099546, 5811091, 3362423, 2509335, 2706903, 2570538, -2687039, --3627100, 4898410, -1048509, -3787624, -7222525, 1190780, -2135673, 2276333, 49392, -604517, --1612760, 2283312, -2672007, -1342714, 3576634, 6794639, 1773285, 3097745, 594853, 3423089, --700080, 3642132, 2297808, 422517, 2038499, 193274, 605054, 200790, 4967667, 1064615, -1314260, -1105417, 744640, -336081, -682900, 4039417, 4617090, -1639604, -1683627, 945430, -4250944, -6881612, -348966, -1855963, -5093295, -2059437, 724239, -2158221, 2284386, 1859184, -166967, -3093450, 1464584, -642635, -2962454, 3842385, -5257040, -2471217, -5607617, -2761664, --781147, 860067, 5692443, -2429341, -1460289, 1778653, -876710, -1324997, 2706903, -419833, --91268, -1201517, -1882269, -2333241, -608812, 2032056, 819802, 1002338, 951872, 739808, -93952, -306553, -122943, 190052, 1438814, 719407, 769336, -453656, 141197, 518080, -426812, 32749, 117038, 37581, -81604, -161061, -962610, -725850, -486405, 582505, -486942, -185757, 922881, 3372623, 1386738, -6590091, -694174, 1054415, 4669167, -1360431, --8325257, 6721087, -7870528, 480499, -3472481, -2638721, -8342437, -5436892, -3291556, -2022930, -3346853, 1219234, -5513665, 836445, -2976949, 106300, -252866, 2309619, 398358, -2317135, -328565, 645319, 1278290, -1620813, -1224603, -442919, -2758980, -4035659, 5486284, 2633352, -690953, -704912, 4664335, 4145180, -4723927, 1363652, 383326, -832150, -2779381, 672162, --4879620, 1138166, -979789, -3880503, 4795868, 135828, -441845, 6135361, -5349919, 4836670, -1701881, -660351, -3982509, 1188095, -632971, -4089883, -3517041, 79457, -1578937, -1811403, --5789616, 311385, 1151051, 2726767, -1731946, 2538863, 686658, -968515, -870805, -3337727, -2847563, 639950, 353261, -5575405, 2870112, -453119, 323196, -2863133, 12885, -5120675, -548682, 1139777, 616328, -411780, 427886, -68719, -41876, -867047, 201327, -238371, -1053878, 678068, 389768, 1076426, -66035, 384936, 970663, 658741, -812823, -271657, -1588064, -567473, 246424, -551903, 539018, -1896765, -564788, -565325, 699543, -325881, --12291123, -11610370, 4491462, 7709467, 4645007, -10456098, 7444789, -2517388, -965831, 675921, --4862440, -3665755, 8787503, -105764, -25233, 686121, -219043, 2890513, -4385699, 2676302, --2326799, 2401424, 4019553, -2649995, -731755, 2353642, -678605, 4220342, -1315334, 1846299, -358093, -405874, 345745, -3557307, -4983773, 4723391, 608812, -882079, 35433, -4642860, --5813775, -137439, 106837, 3049964, -5404143, -4577899, -986232, -9569187, 3721589, -730144, -1954210, -710817, -2312840, 1494649, 12291123, 6851010, 3566434, -3656628, 4843650, -27380, --6314139, 46708, -6589554, 5629092, 772557, 690953, -3753265, 64961, 3833795, 1432909, -768799, 510027, 431644, 4146254, 2873870, 558883, 2800856, 1692754, 2238215, 6055904, -2507187, 2995203, -2786897, 2295123, 1695438, -690416, 4757213, 1472100, -4832, -396211, -1427540, 2556579, 319438, -537, -926639, 638340, 2096481, 1181653, -462246, 236223, --1698660, 522375, 445603, -732829, 181999, -75162, -16643, 1197759, -208306, 1249299, -1691680, 635118, -963683, -1859184, 331249, -1160178, 933082, 854699, -1177895, 525060, --2746095, -17623324, -1351841, -4232154, -627065, -2937758, -10013179, -417149, -2700998, -4115116, --9388262, -1148367, 6646999, -4645007, 4368519, -768262, 6163278, -2085207, 5005248, -1646583, --4980015, -1326608, 521839, -2173254, -4479114, -3583613, -4403415, 147640, -4019553, 1465658, -460635, 405338, 1882806, -3009698, -4049617, 5828271, -544387, 1730872, 47245, -4569845, --2914135, -3225521, 143345, -2315524, 4047470, 4129611, 667867, -5600101, -1849520, 10304700, -2550137, -4358318, -3481071, -2207076, -3833795, -2019172, 8036421, 4897874, -5858336, 3574487, -4734665, 7008313, -1822677, 2847027, -444529, 59056, -2851858, -5840619, -1069984, 4302484, -429497, 8336532, 5905043, 390842, 1923609, 7029251, -5616207, -2573759, -1665911, -3457986, -2467459, 1083406, 1125281, -3032784, 2042794, -2206003, 2265595, -4310000, -212601, -406411, --1699196, -114354, -380105, 2102923, 567473, 463320, -1854352, -1258962, -604517, -1749662, --83215, -2518998, -1467805, 88047, -203474, 1547262, -1073742, 411780, -523449, 833224, -607201, 2143189, -1792612, 22574348, 15197205, -4696547, -823560, 33823, -586800, -2606508, -3185792, 7715909, 6561637, 3371549, -11825656, -5288716, 1555852, 670015, 5070209, -8943196, -1836635, 12083890, 8178155, -1406065, 2936147, -1079111, -4051228, -5594732, 346819, -4768488, --2738042, 1378148, 3794067, -3498251, -6452115, -3097208, 1153736, 5947456, 8360691, -1596117, --8761733, -1873680, -3107409, -8841727, -491774, -277025, -4197794, 1451162, 2420214, 5152350, --7365332, 3017752, 3862249, 825171, -7120519, -5328981, 2483565, 306553, 1903207, -787590, --656593, -254477, -3925600, 1951526, 2119030, -2778307, 5018133, 5876589, 8089034, 1926293, -649614, 7572564, 12399571, 1969243, 1738925, 2102387, 7312719, 820339, 4348118, 12192338, -3669513, 2244657, 388695, -2305324, -10370199, 1392643, -226560, -1694365, -1942399, 1280974, --1393180, 2575370, 1198833, -1379758, -705985, -353261, 2156611, 1337882, -526134, -405874, -1486059, 3098282, 78920, -776315, 1138703, 119185, -1390496, -2880849, 2149094, -2712272, -1713155, 1147830, 2071785, -134218, -276489, 43487, 716723, -3783329, 169114, 553514, --298500, 439697, 11954505, 202400, 2539936, 2832531, 5797669, -2296197, 3714610, -3150359, --1909650, -9857487, 3972845, 6637335, -6000070, 5024038, -2445984, -8643085, 9006010, 5253282, --1529545, 5312875, 10536629, 7291244, -5338645, -3061775, 5343476, 1626182, -1128503, 4023311, -3795141, 5398774, 409096, -2422899, -4605279, -8334384, -207232, -6924561, 912681, -2281702, -3911642, -5513665, -12526809, 2732136, -3058017, 5775121, 1531156, 419833, -3419331, -7454453, --6158446, -622770, -570694, -5629092, 7944616, 10159208, 10648298, 4245039, -7510287, -699006, -10093173, 933619, -1661616, 4637491, -1244467, -2557116, -9450002, 5213554, 2825552, 13764833, -6444062, -9401147, 3214783, 3493956, -924492, -201327, 3416647, -2309082, 835908, -4044786, --9802189, 8893804, 1700807, 5290863, 2645700, -4679367, 7621420, -1702418, 1869385, 382789, --1600949, 264141, 300648, 577136, 4021163, 1285806, 824097, 318364, -1280437, -1610613, --1994476, -1241246, 1432372, -674310, -33286, -807454, 1318555, -1175210, -534187, 102005, --81068, 513785, -2106682, 2514167, -994822, 2211371, 805306, -1177895, -1366337, 3128884, --2801929, 2510409, -627065, -3639448, -6136972, -1626182, -1588064, -10528575, 499827, 1314797, -5251135, -1976759, -4576825, 1910187, 544387, 2512019, 49929, 5745593, 2267743, 3971234, -640487, -431644, 3370476, 2002529, -10425496, -3202972, -14889041, 678605, -2808372, 1720134, -2592013, 201327, 7056632, 1807644, 10091563, 1245004, -12091944, 243739, -4893042, -1997160, --618475, -1813013, -666794, -9558987, 2030446, -4607426, 11457362, -11955578, 6577743, -2607582, --10257456, -1922535, -7230041, -1559610, -2240899, -10873783, 3059091, 3307662, -2047626, -1816771, --753230, 3820910, -8686571, 196495, 8024073, 1469953, 11186242, 18347026, 7524783, -16668231, --22276384, 10742787, 4755603, 16554951, -3507915, 7926362, 1627793, 7869991, 10994043, 14217415, --7654706, 4072703, 10528575, -8725763, 1536525, -1158567, -1173600, 753767, 7489886, -1200980, -2501819, -4954782, 1687922, -3833795, -4081293, -1815161, -3426310, 494458, -2059974, -5660230, --304406, 3657702, 2214056, -1104344, -1139240, -897648, -22549, 1663226, 1712081, -1517197, --2294050, -1039382, 3109556, -862752, 3006477, 417149, 342524, -872415, 637266, 841277, -141734, 777389, 27380, -2739652, -2709051, -1769527, 697932, 2581812, -3905736, -2607582, --1327145, 1462436, -1913945, -1530082, -20474646, 15324443, 2649995, -2547989, -442382, -9075266, --7693897, 8050380, -2280091, -2463164, 8064338, -5996311, -6735583, 476741, 8012262, 3585224, --2798171, 345208, -4840428, -532039, 478352, 4475893, 25770, -10300942, -10500658, 2408403, --1557999, 2570538, -1211181, 4227859, 7846369, 15040439, -419833, 9351754, -2473901, 2682744, -6209986, -6174553, 12026982, -1708323, -7795366, -10689100, -2253784, -8866423, -11435350, -3076807, -4964982, -3446175, -8936753, 4376572, 6000070, 9731859, 12331388, -10229001, 3678103, -2849174, --9644886, 3531537, -10757819, -1940788, -17423072, 6857452, -5367099, 2535105, -3338263, 2695629, --18726594, -18440442, -11431055, -4346507, 9970767, -9937481, 19150722, -6872485, 1672353, -1837172, -3357591, -1804423, -13995151, 1952600, 1336272, 3708704, 2917894, 1566053, 5046050, -3100430, --4989679, -34360, -66035, -4644471, 1799054, -5965710, 3052648, 1912871, 2415919, -941672, --287763, -1882806, -4860829, -3400540, -2176475, -2149631, 2723546, -2139431, -5826123, 1805497, -2039036, -1123134, 3416647, -427886, -1430761, -141197, 551903, -1731946, -1908039, 1857037, -2370822, 1892470, 571768, -4156455, -3219078, -1020055, -3537979, 1023813, -60666, -201863, --4974646, -2498060, -1000727, 1029718, -43487, -3867081, -805306, -96637, -3048890, 17433810, -731218, 6748468, 4251481, 2077690, 9735617, 1649268, -14278619, 7017977, 1740536, 6712497, --906238, -10107132, 14573898, 8292508, 5826660, -1140314, -4773320, 2173254, -1353989, -7968238, -5059472, 3980361, -4849555, 6223408, 9174587, 506806, 3285113, 9657234, -10509248, 2707977, --3720516, 4468914, -19528680, 6128919, 8995809, -2990371, 2195802, 9529996, 4693863, 389231, -2797098, -9402757, 2210298, -5438503, 161061, 3027952, 1255741, -4170413, 18175764, -3089692, --3768297, -4089346, -16363825, -6315213, -10131291, -11215233, -2471217, 16068010, 17135846, -1510218, -5107253, 7164543, -14810121, -4505958, 11545409, 9948755, -6044630, -3890704, -14590004, -4472672, --5687074, -6724845, -8346732, 2330557, -14878840, 2580202, 13449690, 19340238, 5633924, -5470178, --660351, 10335839, -3823595, -6751152, 407485, -722628, -3306588, -4480188, 421444, -315680, -2007897, 3196530, 1499481, -1496259, 623844, 1777580, 1005022, -113817, -3061238, -5975374, -1488206, -227633, -2762201, 4801237, 1198296, 2758443, -2866354, 4098473, -3052111, -1995012, --3402688, 3277597, 367220, 2457258, 4358855, -256087, -2633889, -1140314, 2060511, 1178969, --454193, 261456, 386547, 802085, -518617, -793495, 2098629, 3286187, 8127152, 3955665, --1531156, -5450314, 3411815, 862215, -7165616, -10698764, -11438035, -4617090, -11185705, -4699768, --4527433, 137976, -10646687, 2344515, 4501663, 454193, -12161200, 3742527, -15091978, 4622459, -8436926, 194884, 13107166, 351114, -3894999, -2439542, 8838506, -3228205, 12162274, 4280472, --4209605, -4218195, 2139431, -6251325, -3353296, 408559, 11496017, -435402, 6072010, 3408057, -1034550, 8020852, -3629784, -7450695, 3268470, -5352066, -2473364, -14510547, 8126615, -5135707, --4291746, -2988760, -15957951, 19004694, 4922570, -2335389, 8278550, 2651069, 4015258, -8509404, --12719546, -14509473, -7002408, 679679, -14621679, 5366562, 10537702, -16441672, -6012418, 5921150, --7573638, 3866544, 18140868, 494458, -2991982, -4924717, 4057134, -9981504, 6415608, 3394635, --8979166, 2825552, 6280316, -3706020, -10628433, -9141838, -4795331, -448824, 2821794, 2352032, -1903744, -1957968, -2720862, -1434519, 2251100, 537, -1579474, -6102075, -7210177, -2081985, -395137, -5225902, -6198712, -4357781, -2667175, -2476586, -5458367, -4766340, -2596308, -3484292, --6947110, 1027571, 6291054, -814970, -728534, -2743410, -2071785, 1960116, -2544231, 306553, --5525476, 12348, -1707786, -3086471, -162135, -2911988, 1523103, 2309619, -2424509, 3590056, --2820183, -1250372, -2914672, -426276, 256087, 5172215, 11348377, 29120416, 30107184, 9424769, -18599356, -12650826, -13251048, -2786897, -2142115, 1343251, 4060892, 9928891, 17203492, 5958731, -15908559, 2029372, 4672388, 2643016, -4655208, 7597261, -390842, 3171297, 1050656, -7974681, --1212255, -4171487, -9089761, -5312875, -48855, 1116155, -11989401, -4635344, 14681809, 10937671, -7543573, 12814572, -7987566, 303869, -21799644, 1224603, 18376018, -3404835, -3874597, 2445984, --2169495, 14738717, -1329829, -2210298, 11024107, -13151727, -21825414, -8519068, 1764695, -11436424, -8441221, 12256226, -17219598, -6253473, -22012, -115964, -24634322, -15384036, 7684234, 3583613, --1988033, 8075613, -10835129, -6357089, -15265924, 3789235, 4707284, 1448478, 901943, -9849971, --16807818, 13975824, -22800908, 6809134, -8440148, 21824876, 2118493, 9206799, -6298570, -8362838, -6156299, 3105261, 9580998, -9055402, -1785096, 6754373, -546535, -4938676, -4882841, -4852776, -376883, 5230197, 5459977, -6051609, -2691871, -840740, -8382166, -2773475, 1416266, -738198, -637803, -4172024, -7361037, -865973, 105227, 5869610, 1689533, -3360812, 4328790, 920734, -2169495, -7854422, 1572495, -4624069, 3740380, 874026, 3966402, 6613713, 1934883, -4359392, --9090835, 2997887, 2978023, -28127204, -20318954, 14090714, -2976412, 25578140, -6272800, 21067352, --16956530, 561567, 7504919, -1621887, 860604, 2520609, -1363652, -12635257, 4404489, 4826470, -5506148, 6375879, -3950833, 10481868, -9525701, -6944962, -5466957, 14722611, -8147553, -2675765, -1264331, -252866, -7668127, 6595459, -8550743, -10062035, -19122806, 1794223, 3441343, -12896176, --6097780, 6293738, -2677375, 3389266, 978716, 15116137, 990527, 11391327, 4996658, 544924, -9023726, 2121177, 3085934, -17024176, 17531520, 6289980, 13721884, -8317741, 3596498, -9108552, -14235669, 10910291, 17380658, 2843268, -4635344, -12619151, -855772, 2298881, -10861972, 15396921, -2404108, 2449205, 16441672, 3760244, -5018670, -6526740, -608812, 9882720, 11775190, -3784403, -14701673, -17609366, -18596134, -8035347, 4231080, -5575405, 8001524, -1941325, 4259534, 14228153, --708670, 7100655, -5973226, -5312338, 6107981, -467078, 9844602, -2988760, -148176, -2967286, --6217502, 1324997, -3695819, -1351304, 4000762, 1475858, -5665062, -5021354, 2887829, 7603166, -7703024, -699006, 6290517, 7024419, -9822053, 4628364, 9091372, 7324530, 3973382, -7164543, --8904541, -9075803, -9357123, -9079024, 654983, -3100967, -1404454, 1145146, -6883759, 4909685, -4228396, -3368328, 5050345, 1956358, 2314451, -6316823, 5252745, 12986370, -30633318, -1399623, -15949361, -10207527, -3418794, 11747809, -12771085, -25919054, 5129802, 4382478, 3990025, -3401614, --15348603, 3841312, 4322348, 1126355, 8471286, -27485644, 12559558, -6413997, 6514392, -15684147, -12682502, -19839528, -12692165, 7637526, -5239860, -2355790, -15105937, 11768747, 15502684, -100395, -1670742, -7222525, 23277112, 5724655, 6294812, -4308389, -20273856, -4414153, 11080479, -2105608, -16617765, 64961, -6134824, 3951370, -1253057, 10392210, -20075214, -2498060, -15420543, 16490527, --6267968, 5468567, -562104, -682900, -18215494, -6456410, 15809775, 4986994, 1316944, -4894652, -360240, 1930588, -23329188, -24143084, 25479894, -11469710, -27916214, 11201812, 13012677, -22490596, --29405494, -20547660, -19754166, 3368865, 7650411, -2571075, -19001472, -734976, -10242423, -4878009, --13824963, -892816, 1218160, 1242856, -2891050, 12811351, -7196755, 4953708, -6139656, -437013, -3373697, -3441343, -685584, -7803419, 9926743, -2510945, 3359738, -5765994, -8378408, -1852205, -3765613, 4382478, 1220845, -8134668, 4518843, -1305133, -6620155, 6097780, -9917079, -2100239, --6222871, 9562208, -4507032, -10963441, 4466766, -4451734, -4890894, -14515379, -996969, 3032784, -11775727, 4734128, -7350300, -3826279, 930934, -2118493, -4045322, 2019708, -825171, -2945811, --2974265, -1147293, 11783780, -16585553, -9580998, -17351132, -1839857, 3799436, -23800562, 3972845, --11749957, 32993402, 1510218, -29324962, -6999723, 14496051, 8536784, 7161858, 14654428, 15123117, --21512418, -5259725, -8451422, 20146080, -7231115, 23490786, -238908, -13303661, -10936060, -20684026, --24107652, 1577864, 2580202, -3755412, -12517682, -5097053, 1413581, 3933116, 8011725, -11551851, -5748277, -13612362, -16357383, 3292093, -3634079, -4177393, -17045114, -15867220, -7875897, -4815195, -22736484, 2240899, 7529078, 12992276, -561030, 28921772, 11513734, -9487583, 1329829, 14940581, --5948530, 18884434, -5085778, 2457795, 1153199, -25391846, -26229902, 3949759, 18100066, 481036, --5822365, -28424630, 1701344, 9827422, 5990406, -9701794, -8096014, -5588826, 3358665, -12237436, -30158186, 17156784, 18446884, 3762928, -21500070, 7851200, 9635222, 30230128, 6837051, 3155190, -11995307, 5244692, -5034239, 346282, 9168145, -791348, 1154273, 3071439, -7761543, -5299453, -8918500, 322659, -7392713, 9562208, -5990943, -2119566, -4611721, -4315906, 8346195, -5388574, --2536178, 4536023, -9190156, 3885335, -920197, -5140002, 11041824, -3956739, -86973, -14144938, -8589935, -4282083, -3784403, -9102646, -13088376, 2113661, -5324149, 9208947, -373662, 5485210, -3425237, 257698, -5489505, 200253, 8207146, -41876, -14249091, -12852690, 27230630, -8389145, --10176388, -1370095, -7587597, -18519362, 338766, 12933757, -31958314, -476741, 8223789, 10253698, --10930692, 7301982, -18314814, 1474784, -4761508, 5784784, -16404628, 10253698, -27899034, 4635881, -723702, 15850577, 14804752, 7458211, -10441602, 11668352, -3428458, 13026636, -14139032, 2302103, -16485695, 13165685, -7784628, 2764885, 387621, -3586298, 7987029, -3040300, -9640591, -10641855, -7618735, -19285476, 12770548, 3064996, -20781736, 19640348, 18708878, 17696876, 6342593, -9077950, -22650046, 2801929, 9726490, -13838921, -12087112, -13262322, 4133369, 5249524, 8114267, -18634790, -1811403, 13841069, -35929548, 1424319, -11800960, 22592602, 14520211, 11382737, -3179350, 15001247, --14088030, -667867, -9808095, -21531744, -903554, -19822348, -16639240, 9812927, 26552562, -24879134, --5913096, -4488778, 26658862, -6519224, 11667279, -7571491, -4665945, -952409, 9440338, -5504538, --2311766, 838056, 6438156, 4799626, 3393561, -3483219, 991601, 2851322, 13218836, -10377715, -11034845, -2328946, 8078834, 84289, 2162516, 2876554, 5094905, -6841346, -1542967, -1270237, --8564702, -7606387, -7596187, 5355824, 4274566, -1496796, -3395709, -4355097, -5983427, -3654480, -527744, -2602750, -36507, 8020852, -158377, -14479408, 6859600, -8443369, -1267015, 6205691, --2373506, 24075976, 4817880, 12357695, -34540128, 16193637, -19452980, 26235808, -2880313, 10408853, -19347218, -20878910, 37514928, 27428734, 20173998, -8981313, 5251135, 26218090, -6755984, -8032126, --6293738, -1071058, -19822884, 5476084, -10658498, -23460186, 22758494, 7894150, 6087043, 3165391, -5100811, 9185324, 23973970, 5366025, -15316927, -1011465, -15884400, 3376918, 2044941, -27268210, --1388348, 15272904, 878858, -1696512, -8619462, 29554206, 5823439, 12744242, 6238440, -15533823, --11502459, -8364986, 17988396, 11016591, -3849901, 11316165, -1829119, -19667728, 19145354, 2630131, -21976810, 2729452, 2079838, 716186, -29642254, 4290136, 580357, 3535832, 18104360, -6959995, -28606630, -43498892, -7975218, 32927904, -13422310, 11080479, -15106474, -23023710, -18971944, 13804025, --13030931, 12890271, -20368882, -4035659, 3197603, -4684199, -8128226, -2268280, -2572149, 9083856, -20082730, 2427194, 11837467, -3649112, -2219424, 15078556, -2348810, -3937411, 3898757, -7107634, -6381248, 13169980, -8801462, -1028108, -3549791, 2649995, 2224793, 6405407, 22713398, -3866008, -7876433, 708670, 5312338, 8623221, 3986804, 1586454, 12559021, 14090714, -4041564, -1636383, -5505611, 3296388, 4739497, -17439714, -1662152, 17162690, -3968550, 3809099, 6423124, -630823, -17476222, 6051072, -35367980, -42494408, -3671123, -19964082, 2765422, 11987254, -16901234, 4865124, --25855166, 11187853, -14212047, -70972720, -4499515, 43148852, -18577882, -8108899, 43509092, -10291279, -2400350, 51958904, -12401181, 11413876, 4920959, -7700340, 41970420, -33853468, -4310000, -1021665, --5893232, -6893960, -6867116, -940598, 13693966, -7785702, -22835268, 156766, 492848, 6657200, -8372502, 1410897, 18855444, -823560, 8690329, -5242008, -22670448, 15716359, -2764885, -23469848, -915365, 13373454, 41306848, 20783346, 34724812, 625455, 8557185, 16464220, 3922379, -2131378, -32453310, -1816771, -12641162, 37880536, 6635725, 6606197, 269509, -5468030, 21697102, -117038, --12634183, -14362371, -2963528, -2932926, 32846300, -22405234, 2859375, 4116189, -5865852, 38477000, -296353, -24805046, 4114579, 12492986, -18168248, -988916, 18441516, 15128485, -9366787, 1345399, --10584947, 8783208, -2889439, 1100585, -10426570, 9524627, 67646, -1177358, -15138686, 6118718, -5086852, -9951439, 705448, 3447248, -5152887, -3473555, 11573326, 1697586, 6416145, -4402879, -3332358, 20061792, -18413062, -8477729, -6103149, 21701396, 8039642, 11429445, -13285944, -12172474, --5004174, -1574642, -16103443, -18087718, 21430276, 8580271, -12753369, -11904576, -7322383, -250719, --12659953, -11115912, 47245, 3205119, 8053064, -2232846, -4130148, 6560026, -1720671, 2057826, -24157044, 19389092, -39687644, -19478750, 30592516, -5669894, -29731374, -319438, 663036, 10741713, -32350230, 28685012, -17646410, 5274757, -3971771, 212064, -258235, -18644454, 28067612, -8361228, --18335752, 6500970, -13152264, 15887084, 1431835, 22609782, -6941204, -21518324, -19381040, 17125108, --8223252, 22306450, -5961952, 14439680, -14654965, -11449309, -6950868, 1573032, -18402862, 4496294, -1012002, 278636, 18061412, -230854, 6059662, -12542378, 8973797, -19779936, 21194590, -19027242, -12615393, 6376953, 17825188, -29766270, 1059246, 2494839, -8949101, -21506512, -36374616, -6100464, --31031138, -11954505, -24822764, -11587285, -45403708, -14124537, 20674362, 26122528, 14269492, 15213311, --2403034, 16530792, -32328756, -7388955, 5082020, 20936892, 5829881, -44518408, -1697049, -19553912, --12973486, 52110300, 35067336, -24656870, -9983651, -17299054, 5873905, -45858976, 2892124, 9629317, --13048111, -13565117, 8426189, 2742337, 522375, -8748312, -7655779, -7477001, -7566659, 14405857, -13234942, -854162, -3590593, -14038637, -16121160, -3347927, -3963181, 5565741, 14116484, -27251568, --1968706, 13811004, 52613, 17648020, -6003291, -16648367, 9182103, 19083076, 9693741, -11227045, -1518808, 17689896, -22189948, -15728170, 29731912, 1808181, -879395, -2820720, 4833986, 7023882, -9139154, -3510062, -7055558, -8283382, -52170432, 15090904, 8403640, -27776090, 11055783, 10031433, --19832012, -15577310, 23704462, 2708514, 12703976, -6543920, 15721191, -5170067, -2294050, 12030203, -6086506, 3794604, 498753, -8501888, -14063870, -8895414, 22404160, -8075613, -19146964, 32571958, -20418274, 2361695, 15113990, 4206921, -16806744, -50337552, 20657182, -1910724, -26940182, 22490596, --2274185, -36760624, -30590904, -16209207, 24097988, 9380745, 24970402, 31071404, 9474698, -25551834, -8126615, 8857833, -32113470, -5448703, 18276696, -10307922, -35006668, -26890254, -42700028, -27542552, --6078990, 26805964, 39276404, 18624052, -2483028, 26721676, -6624450, -66376036, -52327196, 11267310, --26310432, -31592706, 45035952, 5690295, -60327112, -46961708, 16069620, 2549600, 10459319, 22232898, -54244364, 30802968, -4424890, 60029148, 19348828, -63471564, 700617, -13719199, 32830730, 9578851, --20612622, 9920838, -15436112, -9489730, -13408351, 20318954, -3652870, 14792404, 12763569, 16039018, --3487514, -16565689, -5143224, 10997801, -6878927, 9208947, 6247030, 6570763, -14015552, 1466731, -5891085, 59056, 25636122, -1098438, 11476153, 2274722, -4063039, 13390097, 3439195, -2257005, -15298674, -7468412, -2158221, 9043054, 3959423, -1665911, -5993090, -8815957, 1124208, -10092636, --7181722, 5061619, 7434589, -7795903, 49400712, 48193828, -15229417, 16869558, -19812684, 12176232, -564251, 7101729, -23592792, 2005750, -20167018, -17775796, 99858, -41248328, 951872, -17477832, -4544613, 12302397, -384936, 14229227, -20403242, 30963492, -15302968, -426276, 21268678, -19963008, -7792145, 15508590, 18865644, 2837900, 6781754, 4793184, -29773250, -16440598, -4840428, 4487167, -4556424, -4327180, 19679540, -6267431, -300111, -3674882, -8562017, 7056095, 3898757, -23428510, -6896644, -18814642, 5150740, -45315664, -2224256, -1058173, -126702, 18610094, -7507066, -16478716, --7424925, 17099338, -87510, -43803836, 61351996, -5299453, -11776263, 13443785, -2717104, -8968429, --11547556, -12159589, -13201119, 42168524, -16326781, -24327768, 20822002, 2101313, -33279018, -7778723, -13837848, 11113228, -11010149, 22771380, -4061429, -6168110, 20946556, -15405511, -14270566, 26626650, --11822971, -4138201, -1515587, 11319923, 5370857, -212064, -1940252, 724239, 4950487, -5392332, --493921, 5270462, 5438503, 6669011, -16387448, 4274030, 8133058, -15782931, 1245541, 3391951, --2914135, -6343667, 6300180, 1893544, -5834176, 995359, -650151, -2594160, -20084878, 11429445, --11933567, 3663607, 3265786, -17988934, -1127429, 970663, -232465, -166967, -6231998, -799938, -4992900, -641024, -39080980, -57623428, -55455008, 122781304, 101855688, 116037672, 262088032, 68655592, --65648040, 20816096, -210177984, -222760096, -55123756, -139942384, -108257872, 66411468, -34378528, 13975287, -167072080, 83068424, 123875448, 237941728, 158567504, 41640244, 34587372, -69844760, -216312272, -165144176, --126436856, -255467344, -103314904, 6411313, -45091252, -20077898, 129559296, 34613140, 17584132, 160551776, -20074140, 38659536, 227867872, 167700224, 106213464, 215572992, 107469744, -37389300, -2970507, -67716064, --334947328, -292135616, -236071808, -366940000, -279588960, -98735392, -132268352, 30363808, 255468416, 228307040, -315713920, 398616992, 296617408, 231549744, 225137360, 124840744, -41691784, -79621176, -182415312, -260505872, --255969856, -221628896, -254082752, -259896528, -208974848, -116569168, -84466976, 32179506, 200041328, 288338880, -411251712, 462615744, 276290944, 67536752, -39064876, -277811360, -264469056, -201281488, -156429696, -57802744, -29885994, 22371948, 28801514, 36064304, 17029008, 42369316, 59176060, 44150652, 71372152, 40873056, --17703318, -21584896, -62223876, -113985208, -31006980, -35326108, -40931040, 36417564, 31215286, -38414188, --49750216, -92739616, -151871648, -63468344, 87251184, 148390576, 287313440, 346670432, 235777600, 146572736, -39529268, -129344016, -189536912, -214430000, -250881920, -235670224, -180812752, -146375168, -121126664, -73237248, --18156438, 63735704, 219578048, 306405120, 272004032, 195751728, 121012848, 26828514, -46658376, -71418864, --90714544, -64438468, -16832514, -2421288, -18158584, -30495342, -49466748, -79549776, -103589240, -99981472, --100369088, -58452356, 10364830, 38043208, 69184408, 90896544, 91934848, 71729712, 48964776, 28124520, -15826418, 22891102, 31132070, 31839666, 28161026, 16952236, -6439230, -37280852, -62181464, -76198088, --77845744, -62555124, -49427556, -39984536, -20632486, 5682779, 22249004, 28858422, 33149094, 35403416, -42133628, 46341088, 41539848, 23870892, 10438918, 3092913, -6102612, -8810589, -5403069, -8459475, --4842576, 1653026, -2673617, -11917461, -14500883, -23751170, -33704220, -32192928, -28791314, -21981642, --3300146, 12139725, 19881404, 28233504, 32287416, 23257248, 17863842, 9987410, 2796561, 2595234, -9167608, 8540542, 7665443, 4325032, -5967320, -13225815, -20402168, -27709518, -27945742, -21998822, --11977053, -1756642, 9164386, 16327318, 19455664, 15980500, 10468983, 4713190, 1666447, 667331, -505196, -666794, -1643362, -2986076, -3389266, -3277597, -2282775, -1489280, -335544, 37044, -511638, 29528, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +2538326, -3474629, 5252208, -3056406, -1127966, 133681, -1877975, -1990717, -4176856, 1038845, +6187438, 693100, 1060320, 2706903, 584116, -2163590, -748935, -1264868, -1388885, 3839701, +979253, 550293, -1351304, 752156, -217433, -1385664, -2418067, 3723200, 2762738, 577136, +-842350, 4309463, -5984500, -2153926, 2461553, -2401424, 5037997, 574452, 3537979, 515933, +354872, 2382633, -2103460, -798327, -131533, -4832, -1655710, -1222455, 2188286, -60130, +-5524939, 5177583, -782221, 924492, -4676683, 2245194, -2105071, 1868848, 77309, -106837, +-1795833, -126165, -2731062, 2806761, -5251135, -534723, 3732864, -2956011, 1352915, 5713380, +1661616, 619549, -2879776, 350040, 1449015, -1017370, 1831267, -1140314, -881542, -1546725, +1650878, -1812476, -3036005, 995359, 437550, -697395, 3586298, -876710, -848256, -841814, +1151588, 1376000, -154082, 193810, 600222, -682363, 593779, -1360431, -639950, -185757, +-353798, -713501, -85899, 1074, -216359, -401579, -93952, -716723, 343061, -339839, +817654, -532039, 593242, 935229, 555661, 10934450, 2017561, -1526861, 3339874, -1648194, +-1367947, -1745904, -711891, -4099546, 5811091, 3362423, 2509335, 2706903, 2570538, -2687039, +-3627100, 4898410, -1048509, -3787624, -7222525, 1190780, -2135673, 2276333, 49392, -604517, +-1612760, 2283312, -2672007, -1342714, 3576634, 6794639, 1773285, 3097745, 594853, 3423089, +-700080, 3642132, 2297808, 422517, 2038499, 193274, 605054, 200790, 4967667, 1064615, +1314260, -1105417, 744640, -336081, -682900, 4039417, 4617090, -1639604, -1683627, 945430, +4250944, -6881612, -348966, -1855963, -5093295, -2059437, 724239, -2158221, 2284386, 1859184, +166967, -3093450, 1464584, -642635, -2962454, 3842385, -5257040, -2471217, -5607617, -2761664, +-781147, 860067, 5692443, -2429341, -1460289, 1778653, -876710, -1324997, 2706903, -419833, +-91268, -1201517, -1882269, -2333241, -608812, 2032056, 819802, 1002338, 951872, 739808, +93952, -306553, -122943, 190052, 1438814, 719407, 769336, -453656, 141197, 518080, +426812, 32749, 117038, 37581, -81604, -161061, -962610, -725850, -486405, 582505, +486942, -185757, 922881, 3372623, 1386738, -6590091, -694174, 1054415, 4669167, -1360431, +-8325257, 6721087, -7870528, 480499, -3472481, -2638721, -8342437, -5436892, -3291556, -2022930, +3346853, 1219234, -5513665, 836445, -2976949, 106300, -252866, 2309619, 398358, -2317135, +328565, 645319, 1278290, -1620813, -1224603, -442919, -2758980, -4035659, 5486284, 2633352, +690953, -704912, 4664335, 4145180, -4723927, 1363652, 383326, -832150, -2779381, 672162, +-4879620, 1138166, -979789, -3880503, 4795868, 135828, -441845, 6135361, -5349919, 4836670, +1701881, -660351, -3982509, 1188095, -632971, -4089883, -3517041, 79457, -1578937, -1811403, +-5789616, 311385, 1151051, 2726767, -1731946, 2538863, 686658, -968515, -870805, -3337727, +2847563, 639950, 353261, -5575405, 2870112, -453119, 323196, -2863133, 12885, -5120675, +548682, 1139777, 616328, -411780, 427886, -68719, -41876, -867047, 201327, -238371, +1053878, 678068, 389768, 1076426, -66035, 384936, 970663, 658741, -812823, -271657, +1588064, -567473, 246424, -551903, 539018, -1896765, -564788, -565325, 699543, -325881, +-12291123, -11610370, 4491462, 7709467, 4645007, -10456098, 7444789, -2517388, -965831, 675921, +-4862440, -3665755, 8787503, -105764, -25233, 686121, -219043, 2890513, -4385699, 2676302, +-2326799, 2401424, 4019553, -2649995, -731755, 2353642, -678605, 4220342, -1315334, 1846299, +358093, -405874, 345745, -3557307, -4983773, 4723391, 608812, -882079, 35433, -4642860, +-5813775, -137439, 106837, 3049964, -5404143, -4577899, -986232, -9569187, 3721589, -730144, +1954210, -710817, -2312840, 1494649, 12291123, 6851010, 3566434, -3656628, 4843650, -27380, +-6314139, 46708, -6589554, 5629092, 772557, 690953, -3753265, 64961, 3833795, 1432909, +768799, 510027, 431644, 4146254, 2873870, 558883, 2800856, 1692754, 2238215, 6055904, +2507187, 2995203, -2786897, 2295123, 1695438, -690416, 4757213, 1472100, -4832, -396211, +1427540, 2556579, 319438, -537, -926639, 638340, 2096481, 1181653, -462246, 236223, +-1698660, 522375, 445603, -732829, 181999, -75162, -16643, 1197759, -208306, 1249299, +1691680, 635118, -963683, -1859184, 331249, -1160178, 933082, 854699, -1177895, 525060, +-2746095, -17623324, -1351841, -4232154, -627065, -2937758, -10013179, -417149, -2700998, -4115116, +-9388262, -1148367, 6646999, -4645007, 4368519, -768262, 6163278, -2085207, 5005248, -1646583, +-4980015, -1326608, 521839, -2173254, -4479114, -3583613, -4403415, 147640, -4019553, 1465658, +460635, 405338, 1882806, -3009698, -4049617, 5828271, -544387, 1730872, 47245, -4569845, +-2914135, -3225521, 143345, -2315524, 4047470, 4129611, 667867, -5600101, -1849520, 10304700, +2550137, -4358318, -3481071, -2207076, -3833795, -2019172, 8036421, 4897874, -5858336, 3574487, +4734665, 7008313, -1822677, 2847027, -444529, 59056, -2851858, -5840619, -1069984, 4302484, +429497, 8336532, 5905043, 390842, 1923609, 7029251, -5616207, -2573759, -1665911, -3457986, +2467459, 1083406, 1125281, -3032784, 2042794, -2206003, 2265595, -4310000, -212601, -406411, +-1699196, -114354, -380105, 2102923, 567473, 463320, -1854352, -1258962, -604517, -1749662, +-83215, -2518998, -1467805, 88047, -203474, 1547262, -1073742, 411780, -523449, 833224, +607201, 2143189, -1792612, 22574348, 15197205, -4696547, -823560, 33823, -586800, -2606508, +3185792, 7715909, 6561637, 3371549, -11825656, -5288716, 1555852, 670015, 5070209, -8943196, +1836635, 12083890, 8178155, -1406065, 2936147, -1079111, -4051228, -5594732, 346819, -4768488, +-2738042, 1378148, 3794067, -3498251, -6452115, -3097208, 1153736, 5947456, 8360691, -1596117, +-8761733, -1873680, -3107409, -8841727, -491774, -277025, -4197794, 1451162, 2420214, 5152350, +-7365332, 3017752, 3862249, 825171, -7120519, -5328981, 2483565, 306553, 1903207, -787590, +-656593, -254477, -3925600, 1951526, 2119030, -2778307, 5018133, 5876589, 8089034, 1926293, +649614, 7572564, 12399571, 1969243, 1738925, 2102387, 7312719, 820339, 4348118, 12192338, +3669513, 2244657, 388695, -2305324, -10370199, 1392643, -226560, -1694365, -1942399, 1280974, +-1393180, 2575370, 1198833, -1379758, -705985, -353261, 2156611, 1337882, -526134, -405874, +1486059, 3098282, 78920, -776315, 1138703, 119185, -1390496, -2880849, 2149094, -2712272, +1713155, 1147830, 2071785, -134218, -276489, 43487, 716723, -3783329, 169114, 553514, +-298500, 439697, 11954505, 202400, 2539936, 2832531, 5797669, -2296197, 3714610, -3150359, +-1909650, -9857487, 3972845, 6637335, -6000070, 5024038, -2445984, -8643085, 9006010, 5253282, +-1529545, 5312875, 10536629, 7291244, -5338645, -3061775, 5343476, 1626182, -1128503, 4023311, +3795141, 5398774, 409096, -2422899, -4605279, -8334384, -207232, -6924561, 912681, -2281702, +3911642, -5513665, -12526809, 2732136, -3058017, 5775121, 1531156, 419833, -3419331, -7454453, +-6158446, -622770, -570694, -5629092, 7944616, 10159208, 10648298, 4245039, -7510287, -699006, +10093173, 933619, -1661616, 4637491, -1244467, -2557116, -9450002, 5213554, 2825552, 13764833, +6444062, -9401147, 3214783, 3493956, -924492, -201327, 3416647, -2309082, 835908, -4044786, +-9802189, 8893804, 1700807, 5290863, 2645700, -4679367, 7621420, -1702418, 1869385, 382789, +-1600949, 264141, 300648, 577136, 4021163, 1285806, 824097, 318364, -1280437, -1610613, +-1994476, -1241246, 1432372, -674310, -33286, -807454, 1318555, -1175210, -534187, 102005, +-81068, 513785, -2106682, 2514167, -994822, 2211371, 805306, -1177895, -1366337, 3128884, +-2801929, 2510409, -627065, -3639448, -6136972, -1626182, -1588064, -10528575, 499827, 1314797, +5251135, -1976759, -4576825, 1910187, 544387, 2512019, 49929, 5745593, 2267743, 3971234, +640487, -431644, 3370476, 2002529, -10425496, -3202972, -14889041, 678605, -2808372, 1720134, +2592013, 201327, 7056632, 1807644, 10091563, 1245004, -12091944, 243739, -4893042, -1997160, +-618475, -1813013, -666794, -9558987, 2030446, -4607426, 11457362, -11955578, 6577743, -2607582, +-10257456, -1922535, -7230041, -1559610, -2240899, -10873783, 3059091, 3307662, -2047626, -1816771, +-753230, 3820910, -8686571, 196495, 8024073, 1469953, 11186242, 18347026, 7524783, -16668231, +-22276384, 10742787, 4755603, 16554951, -3507915, 7926362, 1627793, 7869991, 10994043, 14217415, +-7654706, 4072703, 10528575, -8725763, 1536525, -1158567, -1173600, 753767, 7489886, -1200980, +2501819, -4954782, 1687922, -3833795, -4081293, -1815161, -3426310, 494458, -2059974, -5660230, +-304406, 3657702, 2214056, -1104344, -1139240, -897648, -22549, 1663226, 1712081, -1517197, +-2294050, -1039382, 3109556, -862752, 3006477, 417149, 342524, -872415, 637266, 841277, +141734, 777389, 27380, -2739652, -2709051, -1769527, 697932, 2581812, -3905736, -2607582, +-1327145, 1462436, -1913945, -1530082, -20474646, 15324443, 2649995, -2547989, -442382, -9075266, +-7693897, 8050380, -2280091, -2463164, 8064338, -5996311, -6735583, 476741, 8012262, 3585224, +-2798171, 345208, -4840428, -532039, 478352, 4475893, 25770, -10300942, -10500658, 2408403, +-1557999, 2570538, -1211181, 4227859, 7846369, 15040439, -419833, 9351754, -2473901, 2682744, +6209986, -6174553, 12026982, -1708323, -7795366, -10689100, -2253784, -8866423, -11435350, -3076807, +4964982, -3446175, -8936753, 4376572, 6000070, 9731859, 12331388, -10229001, 3678103, -2849174, +-9644886, 3531537, -10757819, -1940788, -17423072, 6857452, -5367099, 2535105, -3338263, 2695629, +-18726594, -18440442, -11431055, -4346507, 9970767, -9937481, 19150722, -6872485, 1672353, -1837172, +3357591, -1804423, -13995151, 1952600, 1336272, 3708704, 2917894, 1566053, 5046050, -3100430, +-4989679, -34360, -66035, -4644471, 1799054, -5965710, 3052648, 1912871, 2415919, -941672, +-287763, -1882806, -4860829, -3400540, -2176475, -2149631, 2723546, -2139431, -5826123, 1805497, +2039036, -1123134, 3416647, -427886, -1430761, -141197, 551903, -1731946, -1908039, 1857037, +2370822, 1892470, 571768, -4156455, -3219078, -1020055, -3537979, 1023813, -60666, -201863, +-4974646, -2498060, -1000727, 1029718, -43487, -3867081, -805306, -96637, -3048890, 17433810, +731218, 6748468, 4251481, 2077690, 9735617, 1649268, -14278619, 7017977, 1740536, 6712497, +-906238, -10107132, 14573898, 8292508, 5826660, -1140314, -4773320, 2173254, -1353989, -7968238, +5059472, 3980361, -4849555, 6223408, 9174587, 506806, 3285113, 9657234, -10509248, 2707977, +-3720516, 4468914, -19528680, 6128919, 8995809, -2990371, 2195802, 9529996, 4693863, 389231, +2797098, -9402757, 2210298, -5438503, 161061, 3027952, 1255741, -4170413, 18175764, -3089692, +-3768297, -4089346, -16363825, -6315213, -10131291, -11215233, -2471217, 16068010, 17135846, -1510218, +5107253, 7164543, -14810121, -4505958, 11545409, 9948755, -6044630, -3890704, -14590004, -4472672, +-5687074, -6724845, -8346732, 2330557, -14878840, 2580202, 13449690, 19340238, 5633924, -5470178, +-660351, 10335839, -3823595, -6751152, 407485, -722628, -3306588, -4480188, 421444, -315680, +2007897, 3196530, 1499481, -1496259, 623844, 1777580, 1005022, -113817, -3061238, -5975374, +1488206, -227633, -2762201, 4801237, 1198296, 2758443, -2866354, 4098473, -3052111, -1995012, +-3402688, 3277597, 367220, 2457258, 4358855, -256087, -2633889, -1140314, 2060511, 1178969, +-454193, 261456, 386547, 802085, -518617, -793495, 2098629, 3286187, 8127152, 3955665, +-1531156, -5450314, 3411815, 862215, -7165616, -10698764, -11438035, -4617090, -11185705, -4699768, +-4527433, 137976, -10646687, 2344515, 4501663, 454193, -12161200, 3742527, -15091978, 4622459, +8436926, 194884, 13107166, 351114, -3894999, -2439542, 8838506, -3228205, 12162274, 4280472, +-4209605, -4218195, 2139431, -6251325, -3353296, 408559, 11496017, -435402, 6072010, 3408057, +1034550, 8020852, -3629784, -7450695, 3268470, -5352066, -2473364, -14510547, 8126615, -5135707, +-4291746, -2988760, -15957951, 19004694, 4922570, -2335389, 8278550, 2651069, 4015258, -8509404, +-12719546, -14509473, -7002408, 679679, -14621679, 5366562, 10537702, -16441672, -6012418, 5921150, +-7573638, 3866544, 18140868, 494458, -2991982, -4924717, 4057134, -9981504, 6415608, 3394635, +-8979166, 2825552, 6280316, -3706020, -10628433, -9141838, -4795331, -448824, 2821794, 2352032, +1903744, -1957968, -2720862, -1434519, 2251100, 537, -1579474, -6102075, -7210177, -2081985, +395137, -5225902, -6198712, -4357781, -2667175, -2476586, -5458367, -4766340, -2596308, -3484292, +-6947110, 1027571, 6291054, -814970, -728534, -2743410, -2071785, 1960116, -2544231, 306553, +-5525476, 12348, -1707786, -3086471, -162135, -2911988, 1523103, 2309619, -2424509, 3590056, +-2820183, -1250372, -2914672, -426276, 256087, 5172215, 11348377, 29120416, 30107184, 9424769, +18599356, -12650826, -13251048, -2786897, -2142115, 1343251, 4060892, 9928891, 17203492, 5958731, +15908559, 2029372, 4672388, 2643016, -4655208, 7597261, -390842, 3171297, 1050656, -7974681, +-1212255, -4171487, -9089761, -5312875, -48855, 1116155, -11989401, -4635344, 14681809, 10937671, +7543573, 12814572, -7987566, 303869, -21799644, 1224603, 18376018, -3404835, -3874597, 2445984, +-2169495, 14738717, -1329829, -2210298, 11024107, -13151727, -21825414, -8519068, 1764695, -11436424, +8441221, 12256226, -17219598, -6253473, -22012, -115964, -24634322, -15384036, 7684234, 3583613, +-1988033, 8075613, -10835129, -6357089, -15265924, 3789235, 4707284, 1448478, 901943, -9849971, +-16807818, 13975824, -22800908, 6809134, -8440148, 21824876, 2118493, 9206799, -6298570, -8362838, +6156299, 3105261, 9580998, -9055402, -1785096, 6754373, -546535, -4938676, -4882841, -4852776, +376883, 5230197, 5459977, -6051609, -2691871, -840740, -8382166, -2773475, 1416266, -738198, +637803, -4172024, -7361037, -865973, 105227, 5869610, 1689533, -3360812, 4328790, 920734, +2169495, -7854422, 1572495, -4624069, 3740380, 874026, 3966402, 6613713, 1934883, -4359392, +-9090835, 2997887, 2978023, -28127204, -20318954, 14090714, -2976412, 25578140, -6272800, 21067352, +-16956530, 561567, 7504919, -1621887, 860604, 2520609, -1363652, -12635257, 4404489, 4826470, +5506148, 6375879, -3950833, 10481868, -9525701, -6944962, -5466957, 14722611, -8147553, -2675765, +1264331, -252866, -7668127, 6595459, -8550743, -10062035, -19122806, 1794223, 3441343, -12896176, +-6097780, 6293738, -2677375, 3389266, 978716, 15116137, 990527, 11391327, 4996658, 544924, +9023726, 2121177, 3085934, -17024176, 17531520, 6289980, 13721884, -8317741, 3596498, -9108552, +14235669, 10910291, 17380658, 2843268, -4635344, -12619151, -855772, 2298881, -10861972, 15396921, +2404108, 2449205, 16441672, 3760244, -5018670, -6526740, -608812, 9882720, 11775190, -3784403, +14701673, -17609366, -18596134, -8035347, 4231080, -5575405, 8001524, -1941325, 4259534, 14228153, +-708670, 7100655, -5973226, -5312338, 6107981, -467078, 9844602, -2988760, -148176, -2967286, +-6217502, 1324997, -3695819, -1351304, 4000762, 1475858, -5665062, -5021354, 2887829, 7603166, +7703024, -699006, 6290517, 7024419, -9822053, 4628364, 9091372, 7324530, 3973382, -7164543, +-8904541, -9075803, -9357123, -9079024, 654983, -3100967, -1404454, 1145146, -6883759, 4909685, +4228396, -3368328, 5050345, 1956358, 2314451, -6316823, 5252745, 12986370, -30633318, -1399623, +15949361, -10207527, -3418794, 11747809, -12771085, -25919054, 5129802, 4382478, 3990025, -3401614, +-15348603, 3841312, 4322348, 1126355, 8471286, -27485644, 12559558, -6413997, 6514392, -15684147, +12682502, -19839528, -12692165, 7637526, -5239860, -2355790, -15105937, 11768747, 15502684, -100395, +1670742, -7222525, 23277112, 5724655, 6294812, -4308389, -20273856, -4414153, 11080479, -2105608, +16617765, 64961, -6134824, 3951370, -1253057, 10392210, -20075214, -2498060, -15420543, 16490527, +-6267968, 5468567, -562104, -682900, -18215494, -6456410, 15809775, 4986994, 1316944, -4894652, +360240, 1930588, -23329188, -24143084, 25479894, -11469710, -27916214, 11201812, 13012677, -22490596, +-29405494, -20547660, -19754166, 3368865, 7650411, -2571075, -19001472, -734976, -10242423, -4878009, +-13824963, -892816, 1218160, 1242856, -2891050, 12811351, -7196755, 4953708, -6139656, -437013, +3373697, -3441343, -685584, -7803419, 9926743, -2510945, 3359738, -5765994, -8378408, -1852205, +3765613, 4382478, 1220845, -8134668, 4518843, -1305133, -6620155, 6097780, -9917079, -2100239, +-6222871, 9562208, -4507032, -10963441, 4466766, -4451734, -4890894, -14515379, -996969, 3032784, +11775727, 4734128, -7350300, -3826279, 930934, -2118493, -4045322, 2019708, -825171, -2945811, +-2974265, -1147293, 11783780, -16585553, -9580998, -17351132, -1839857, 3799436, -23800562, 3972845, +-11749957, 32993402, 1510218, -29324962, -6999723, 14496051, 8536784, 7161858, 14654428, 15123117, +-21512418, -5259725, -8451422, 20146080, -7231115, 23490786, -238908, -13303661, -10936060, -20684026, +-24107652, 1577864, 2580202, -3755412, -12517682, -5097053, 1413581, 3933116, 8011725, -11551851, +5748277, -13612362, -16357383, 3292093, -3634079, -4177393, -17045114, -15867220, -7875897, -4815195, +22736484, 2240899, 7529078, 12992276, -561030, 28921772, 11513734, -9487583, 1329829, 14940581, +-5948530, 18884434, -5085778, 2457795, 1153199, -25391846, -26229902, 3949759, 18100066, 481036, +-5822365, -28424630, 1701344, 9827422, 5990406, -9701794, -8096014, -5588826, 3358665, -12237436, +30158186, 17156784, 18446884, 3762928, -21500070, 7851200, 9635222, 30230128, 6837051, 3155190, +11995307, 5244692, -5034239, 346282, 9168145, -791348, 1154273, 3071439, -7761543, -5299453, +8918500, 322659, -7392713, 9562208, -5990943, -2119566, -4611721, -4315906, 8346195, -5388574, +-2536178, 4536023, -9190156, 3885335, -920197, -5140002, 11041824, -3956739, -86973, -14144938, +8589935, -4282083, -3784403, -9102646, -13088376, 2113661, -5324149, 9208947, -373662, 5485210, +3425237, 257698, -5489505, 200253, 8207146, -41876, -14249091, -12852690, 27230630, -8389145, +-10176388, -1370095, -7587597, -18519362, 338766, 12933757, -31958314, -476741, 8223789, 10253698, +-10930692, 7301982, -18314814, 1474784, -4761508, 5784784, -16404628, 10253698, -27899034, 4635881, +723702, 15850577, 14804752, 7458211, -10441602, 11668352, -3428458, 13026636, -14139032, 2302103, +16485695, 13165685, -7784628, 2764885, 387621, -3586298, 7987029, -3040300, -9640591, -10641855, +7618735, -19285476, 12770548, 3064996, -20781736, 19640348, 18708878, 17696876, 6342593, -9077950, +22650046, 2801929, 9726490, -13838921, -12087112, -13262322, 4133369, 5249524, 8114267, -18634790, +1811403, 13841069, -35929548, 1424319, -11800960, 22592602, 14520211, 11382737, -3179350, 15001247, +-14088030, -667867, -9808095, -21531744, -903554, -19822348, -16639240, 9812927, 26552562, -24879134, +-5913096, -4488778, 26658862, -6519224, 11667279, -7571491, -4665945, -952409, 9440338, -5504538, +-2311766, 838056, 6438156, 4799626, 3393561, -3483219, 991601, 2851322, 13218836, -10377715, +11034845, -2328946, 8078834, 84289, 2162516, 2876554, 5094905, -6841346, -1542967, -1270237, +-8564702, -7606387, -7596187, 5355824, 4274566, -1496796, -3395709, -4355097, -5983427, -3654480, +527744, -2602750, -36507, 8020852, -158377, -14479408, 6859600, -8443369, -1267015, 6205691, +-2373506, 24075976, 4817880, 12357695, -34540128, 16193637, -19452980, 26235808, -2880313, 10408853, +19347218, -20878910, 37514928, 27428734, 20173998, -8981313, 5251135, 26218090, -6755984, -8032126, +-6293738, -1071058, -19822884, 5476084, -10658498, -23460186, 22758494, 7894150, 6087043, 3165391, +5100811, 9185324, 23973970, 5366025, -15316927, -1011465, -15884400, 3376918, 2044941, -27268210, +-1388348, 15272904, 878858, -1696512, -8619462, 29554206, 5823439, 12744242, 6238440, -15533823, +-11502459, -8364986, 17988396, 11016591, -3849901, 11316165, -1829119, -19667728, 19145354, 2630131, +21976810, 2729452, 2079838, 716186, -29642254, 4290136, 580357, 3535832, 18104360, -6959995, +28606630, -43498892, -7975218, 32927904, -13422310, 11080479, -15106474, -23023710, -18971944, 13804025, +-13030931, 12890271, -20368882, -4035659, 3197603, -4684199, -8128226, -2268280, -2572149, 9083856, +20082730, 2427194, 11837467, -3649112, -2219424, 15078556, -2348810, -3937411, 3898757, -7107634, +6381248, 13169980, -8801462, -1028108, -3549791, 2649995, 2224793, 6405407, 22713398, -3866008, +7876433, 708670, 5312338, 8623221, 3986804, 1586454, 12559021, 14090714, -4041564, -1636383, +5505611, 3296388, 4739497, -17439714, -1662152, 17162690, -3968550, 3809099, 6423124, -630823, +17476222, 6051072, -35367980, -42494408, -3671123, -19964082, 2765422, 11987254, -16901234, 4865124, +-25855166, 11187853, -14212047, -70972720, -4499515, 43148852, -18577882, -8108899, 43509092, -10291279, +2400350, 51958904, -12401181, 11413876, 4920959, -7700340, 41970420, -33853468, -4310000, -1021665, +-5893232, -6893960, -6867116, -940598, 13693966, -7785702, -22835268, 156766, 492848, 6657200, +8372502, 1410897, 18855444, -823560, 8690329, -5242008, -22670448, 15716359, -2764885, -23469848, +915365, 13373454, 41306848, 20783346, 34724812, 625455, 8557185, 16464220, 3922379, -2131378, +32453310, -1816771, -12641162, 37880536, 6635725, 6606197, 269509, -5468030, 21697102, -117038, +-12634183, -14362371, -2963528, -2932926, 32846300, -22405234, 2859375, 4116189, -5865852, 38477000, +296353, -24805046, 4114579, 12492986, -18168248, -988916, 18441516, 15128485, -9366787, 1345399, +-10584947, 8783208, -2889439, 1100585, -10426570, 9524627, 67646, -1177358, -15138686, 6118718, +5086852, -9951439, 705448, 3447248, -5152887, -3473555, 11573326, 1697586, 6416145, -4402879, +3332358, 20061792, -18413062, -8477729, -6103149, 21701396, 8039642, 11429445, -13285944, -12172474, +-5004174, -1574642, -16103443, -18087718, 21430276, 8580271, -12753369, -11904576, -7322383, -250719, +-12659953, -11115912, 47245, 3205119, 8053064, -2232846, -4130148, 6560026, -1720671, 2057826, +24157044, 19389092, -39687644, -19478750, 30592516, -5669894, -29731374, -319438, 663036, 10741713, +32350230, 28685012, -17646410, 5274757, -3971771, 212064, -258235, -18644454, 28067612, -8361228, +-18335752, 6500970, -13152264, 15887084, 1431835, 22609782, -6941204, -21518324, -19381040, 17125108, +-8223252, 22306450, -5961952, 14439680, -14654965, -11449309, -6950868, 1573032, -18402862, 4496294, +1012002, 278636, 18061412, -230854, 6059662, -12542378, 8973797, -19779936, 21194590, -19027242, +12615393, 6376953, 17825188, -29766270, 1059246, 2494839, -8949101, -21506512, -36374616, -6100464, +-31031138, -11954505, -24822764, -11587285, -45403708, -14124537, 20674362, 26122528, 14269492, 15213311, +-2403034, 16530792, -32328756, -7388955, 5082020, 20936892, 5829881, -44518408, -1697049, -19553912, +-12973486, 52110300, 35067336, -24656870, -9983651, -17299054, 5873905, -45858976, 2892124, 9629317, +-13048111, -13565117, 8426189, 2742337, 522375, -8748312, -7655779, -7477001, -7566659, 14405857, +13234942, -854162, -3590593, -14038637, -16121160, -3347927, -3963181, 5565741, 14116484, -27251568, +-1968706, 13811004, 52613, 17648020, -6003291, -16648367, 9182103, 19083076, 9693741, -11227045, +1518808, 17689896, -22189948, -15728170, 29731912, 1808181, -879395, -2820720, 4833986, 7023882, +9139154, -3510062, -7055558, -8283382, -52170432, 15090904, 8403640, -27776090, 11055783, 10031433, +-19832012, -15577310, 23704462, 2708514, 12703976, -6543920, 15721191, -5170067, -2294050, 12030203, +6086506, 3794604, 498753, -8501888, -14063870, -8895414, 22404160, -8075613, -19146964, 32571958, +20418274, 2361695, 15113990, 4206921, -16806744, -50337552, 20657182, -1910724, -26940182, 22490596, +-2274185, -36760624, -30590904, -16209207, 24097988, 9380745, 24970402, 31071404, 9474698, -25551834, +8126615, 8857833, -32113470, -5448703, 18276696, -10307922, -35006668, -26890254, -42700028, -27542552, +-6078990, 26805964, 39276404, 18624052, -2483028, 26721676, -6624450, -66376036, -52327196, 11267310, +-26310432, -31592706, 45035952, 5690295, -60327112, -46961708, 16069620, 2549600, 10459319, 22232898, +54244364, 30802968, -4424890, 60029148, 19348828, -63471564, 700617, -13719199, 32830730, 9578851, +-20612622, 9920838, -15436112, -9489730, -13408351, 20318954, -3652870, 14792404, 12763569, 16039018, +-3487514, -16565689, -5143224, 10997801, -6878927, 9208947, 6247030, 6570763, -14015552, 1466731, +5891085, 59056, 25636122, -1098438, 11476153, 2274722, -4063039, 13390097, 3439195, -2257005, +15298674, -7468412, -2158221, 9043054, 3959423, -1665911, -5993090, -8815957, 1124208, -10092636, +-7181722, 5061619, 7434589, -7795903, 49400712, 48193828, -15229417, 16869558, -19812684, 12176232, +564251, 7101729, -23592792, 2005750, -20167018, -17775796, 99858, -41248328, 951872, -17477832, +4544613, 12302397, -384936, 14229227, -20403242, 30963492, -15302968, -426276, 21268678, -19963008, +7792145, 15508590, 18865644, 2837900, 6781754, 4793184, -29773250, -16440598, -4840428, 4487167, +4556424, -4327180, 19679540, -6267431, -300111, -3674882, -8562017, 7056095, 3898757, -23428510, +6896644, -18814642, 5150740, -45315664, -2224256, -1058173, -126702, 18610094, -7507066, -16478716, +-7424925, 17099338, -87510, -43803836, 61351996, -5299453, -11776263, 13443785, -2717104, -8968429, +-11547556, -12159589, -13201119, 42168524, -16326781, -24327768, 20822002, 2101313, -33279018, -7778723, +13837848, 11113228, -11010149, 22771380, -4061429, -6168110, 20946556, -15405511, -14270566, 26626650, +-11822971, -4138201, -1515587, 11319923, 5370857, -212064, -1940252, 724239, 4950487, -5392332, +-493921, 5270462, 5438503, 6669011, -16387448, 4274030, 8133058, -15782931, 1245541, 3391951, +-2914135, -6343667, 6300180, 1893544, -5834176, 995359, -650151, -2594160, -20084878, 11429445, +-11933567, 3663607, 3265786, -17988934, -1127429, 970663, -232465, -166967, -6231998, -799938, +4992900, -641024, -39080980, -57623428, -55455008, 122781304, 101855688, 116037672, 262088032, 68655592, +-65648040, 20816096, -210177984, -222760096, -55123756, -139942384, -108257872, 66411468, -34378528, 13975287, +167072080, 83068424, 123875448, 237941728, 158567504, 41640244, 34587372, -69844760, -216312272, -165144176, +-126436856, -255467344, -103314904, 6411313, -45091252, -20077898, 129559296, 34613140, 17584132, 160551776, +20074140, 38659536, 227867872, 167700224, 106213464, 215572992, 107469744, -37389300, -2970507, -67716064, +-334947328, -292135616, -236071808, -366940000, -279588960, -98735392, -132268352, 30363808, 255468416, 228307040, +315713920, 398616992, 296617408, 231549744, 225137360, 124840744, -41691784, -79621176, -182415312, -260505872, +-255969856, -221628896, -254082752, -259896528, -208974848, -116569168, -84466976, 32179506, 200041328, 288338880, +411251712, 462615744, 276290944, 67536752, -39064876, -277811360, -264469056, -201281488, -156429696, -57802744, +29885994, 22371948, 28801514, 36064304, 17029008, 42369316, 59176060, 44150652, 71372152, 40873056, +-17703318, -21584896, -62223876, -113985208, -31006980, -35326108, -40931040, 36417564, 31215286, -38414188, +-49750216, -92739616, -151871648, -63468344, 87251184, 148390576, 287313440, 346670432, 235777600, 146572736, +39529268, -129344016, -189536912, -214430000, -250881920, -235670224, -180812752, -146375168, -121126664, -73237248, +-18156438, 63735704, 219578048, 306405120, 272004032, 195751728, 121012848, 26828514, -46658376, -71418864, +-90714544, -64438468, -16832514, -2421288, -18158584, -30495342, -49466748, -79549776, -103589240, -99981472, +-100369088, -58452356, 10364830, 38043208, 69184408, 90896544, 91934848, 71729712, 48964776, 28124520, +15826418, 22891102, 31132070, 31839666, 28161026, 16952236, -6439230, -37280852, -62181464, -76198088, +-77845744, -62555124, -49427556, -39984536, -20632486, 5682779, 22249004, 28858422, 33149094, 35403416, +42133628, 46341088, 41539848, 23870892, 10438918, 3092913, -6102612, -8810589, -5403069, -8459475, +-4842576, 1653026, -2673617, -11917461, -14500883, -23751170, -33704220, -32192928, -28791314, -21981642, +-3300146, 12139725, 19881404, 28233504, 32287416, 23257248, 17863842, 9987410, 2796561, 2595234, +9167608, 8540542, 7665443, 4325032, -5967320, -13225815, -20402168, -27709518, -27945742, -21998822, +-11977053, -1756642, 9164386, 16327318, 19455664, 15980500, 10468983, 4713190, 1666447, 667331, +505196, -666794, -1643362, -2986076, -3389266, -3277597, -2282775, -1489280, -335544, 37044, +511638, 29528, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 8932458, --1172526, 709207, 7030862, -908922, -324807, -2050847, 7669738, 445603, 3730179, 2262374, -2258616, -3167539, 1592359, -4903779, -531502, 3795677, 772020, 2221035, 3579318, -6054830, --4224637, 1436130, -299574, 4486630, 2735357, -237297, -2491618, -1571958, -3082713, -494995, --410706, -466541, 854699, 1170379, -2682744, 4497368, -1033477, -705985, 1538672, -5740761, --1323387, 2479807, 878321, 5658620, -21475, -417149, 1105954, 383326, 2357400, 3917547, -4984847, -290447, -514322, 87510, -2867428, -3641596, 2009508, 3248606, -2281702, -2190433, --1479079, 4144107, 2441689, -572304, 646393, -4889821, -1408212, 2539936, 2107218, 3613678, --5255430, 1192390, 1988033, -1096290, 3707094, -239444, 3231426, 1537061, 1039382, 4098473, -2034741, 1034013, 33286, 483184, -977642, 344134, 569620, -323196, -1456531, 719944, -708670, -1078037, -150861, -727460, 761283, 1178969, 47782, -150324, -66572, -1093069, -536334, -386010, 907849, 428960, 279173, 194884, -488553, 296353, 134218, 466541, --868657, -413391, -192200, 119185, -1183264, 11647951, 3206193, -2667712, 5936719, -2886218, -6178848, -2055142, -2819109, 3143379, 5777268, -177704, -2859375, 1542967, 1211718, -237297, --8229694, 1927904, 2408403, 660351, 5137318, 6918656, 3711389, 6812892, 4629975, 4151086, --1109712, 4610111, 2218888, -3495567, 1307281, 2129767, -4503810, -5716602, -880468, 2253247, -87510, -2063195, -2767033, -2692408, -1337882, 3084324, 6179921, 5236639, 1975148, 4022237, --6493991, 409633, -1658394, 63351, -7453379, 2763275, -718333, -1757179, -292058, -2022930, --3685619, -2588792, 2611340, 625455, 2002529, -2716567, 5081483, 1306744, -5888937, 2432025, -745177, 1636383, 3223373, 978716, 5917391, -1888175, 646929, -6912750, 1312649, 666257, -195958, 163746, -1303523, 4917201, -1505923, -2285996, 3728569, -3864934, -1888175, -1596654, --721018, -1802813, 1244467, 329102, 648540, -51003, -172872, 63351, -708133, 423054, -644782, -250719, -304943, -34360, -1281511, -2087891, 766652, 253940, -1649804, -220117, --185220, -360777, -1998234, 509491, -12885, -66035, 133144, 345745, 212601, -758599, --32749, -1377611, -160524, 572304, -2352032, -2378875, -762357, 2155537, -3982509, 1155346, --7871065, 1467268, 1493575, -928250, 5634997, 345745, -620086, 494458, 2987687, -4840965, -696322, 1466731, 3090766, -6882148, -3472481, -2604898, 2526515, 1017370, -2149094, -6955163, -1690607, -6918656, -415538, 2727304, -1271310, 2073932, -1185411, 4639102, 6907918, 3631932, --3563212, 655519, 5237176, 3215857, -3225521, 2701535, 817654, -5396627, 1900523, 7383049, -3477313, 2465848, 8259222, 725313, -3122978, -6329171, -267362, -3559454, -4242891, -2029372, -4545149, -4322348, 1511292, -2586107, -2396592, 5272073, -684510, 861141, 4223564, 5727876, --2542084, -5288716, 6717866, 5133023, 3294240, 296353, -4024384, 628139, 5310190, -5392869, -1646046, -3519726, -108448, 3266323, -3071975, -188979, -5919539, -1580011, -513249, 884226, --307627, -2259153, -259846, 1117228, -1742683, -469762, 819802, 661962, 515933, 471910, --83752, -449361, -2331094, 1240172, -121333, 1278290, -898722, -1556926, 551903, 1211181, --800475, 1067836, -179315, -89121, -91805, -259846, 1306207, -775778, 510564, -783295, --15601469, -5712307, -2401961, 8535711, -3239479, -1284732, -5043366, -4269735, -728534, -11254962, -6307697, 2081985, -319438, -4159676, 6209986, -1750736, 3154117, -2517925, 1992328, 3956739, --4947266, 519691, 5459977, 3083250, 2199023, 5836324, 5223217, -3280281, -4179003, -5216775, --86436, -6857452, 1636383, -9057012, -1733019, 6664716, 3506841, -2299955, -704912, -6815040, -3093987, -2916283, 6004365, -3462818, -6162741, -1270237, -2539936, -5068062, 1961726, -1165010, --3223373, -3289408, -10916733, 1487132, -3274376, -8094940, -2152852, 4983773, 2558727, -4189741, -3456375, 4439386, 4292820, 1589138, -5581310, -936303, -1239635, 3860102, -3922916, -1513976, -2035815, 2062121, -6109054, -7283191, -13066901, -2242510, -7589207, 2491081, -293668, -1819992, -3842385, -819265, -1749125, 1668058, 2620467, 2509872, 1958505, 4540318, -1941862, -1609002, --1228898, 659814, 228707, -1043140, 1253594, 1796370, -401579, 415001, -797253, -1043140, --193274, -681289, 187905, 386547, 53150, -1156420, 177167, -783295, -296890, 642098, -1465658, -662499, 1755568, 2129230, 336618, -630823, -1859184, -386547, 1249836, 820876, --809064, -13579076, -5430986, -2433099, -4020626, 4620311, 6041945, 5694590, -11335492, -8465381, -3263638, 13814225, 8170102, -5369, 1969779, 3936338, -4961224, 3278134, -4598836, 3325379, -4911832, 759136, 3942243, 1230508, -270583, 2045478, 1217623, -3701188, -4684199, 6483253, -2633889, -4729833, 4647692, -2578591, -471910, 11144366, -5310727, 6310918, 12463995, 5086852, --702764, 483721, -4483946, 5828271, -5939940, -3248606, -9990094, 1888712, 7721815, -188979, --7068443, -2517925, -10024991, -5091147, -1852205, -14268955, -7756174, -1405528, 1524713, -6244346, -3178813, -1650341, -4921496, 5349382, 15792058, 1473711, 8056822, 5463199, 4743255, -4988605, -2114735, -8504572, 923418, 2454574, 1923072, -3299072, 92342, -8634495, -2994666, -3024731, --598074, 4207994, 4518306, -193810, 1770063, 2456721, -1218697, -935766, -777389, 817654, -119722, 614180, 492311, 1389959, -711354, -37044, -2051921, -245887, -300648, 1491427, -869194, -899259, -1229434, -1196685, -1152662, -384400, -1420560, 529892, 2685965, -2093797, --248571, 923955, 1539209, 21209622, 13402982, -7292318, 2720862, 6827388, -2817499, 3908957, --1327145, 6369437, 3190087, 2040110, 5776194, 3269007, 2857764, -1799054, -14192719, 6797323, --2417530, -3227668, 11103027, 6875169, 3836480, 5123896, 3802120, 2828236, -2172717, 1648194, -450972, -3629784, 2935073, 4806606, -8006356, 1537061, -5181878, 3834332, 4431870, -12511240, --206158, -14889578, 255551, 1865626, 1263257, 4070555, 10160282, -1237488, -5267241, -2575907, --2828236, -3911105, 2923799, 3155727, 982474, -1647120, -1828046, 9881109, -3277597, -1969779, --5392869, 8777839, -1334124, 7377680, -3471944, 7884486, -7589744, -15947750, -4744865, 1005022, -3226594, 5398774, -5374078, -3995930, 2183991, 1445257, -2492692, -4155381, 9970767, -3897683, -9484898, 2513093, 6701223, 2646237, 4881231, 4123706, -1720134, -639950, 1915019, -277025, -5171141, 138513, -1719598, 477278, -5806796, -1145146, -1348620, 407485, -1945620, -738734, --659814, -133681, -675921, -3038689, -2476586, 744103, 202937, -3411815, -213675, 507880, -494458, 1398012, 583579, 3364570, 140660, -1130113, -146029, -452582, -1567663, -1833414, --737661, 508954, 9931575, -3797288, -6589017, -308701, 1055488, -9432285, -7364259, -2354716, -2572686, -1410897, 12249247, 7340099, 332323, 11682311, 4224101, 3415036, -10008884, 9393093, --1749662, -2364380, -8440148, -3822521, 7509751, 7401840, -2102923, 4907537, -10151692, -1433445, -6833830, 5134634, -3789772, -7218767, -4043175, -4462471, -5557688, -4635881, 1119913, -7586523, --723702, 10478646, -5037997, 1209033, -388158, -2413235, 4095251, -1671816, 6857452, 8590, -9668508, -2479807, -6077916, 3495030, -4800163, -4764193, -4800163, -13712757, 1601486, 5680094, -8176007, 5889474, 10741713, -1097364, -4116726, 6206228, -7614977, 1777580, 1189706, -1140851, -6965363, 6493454, -1658931, -8278550, 1668595, -4272956, -7876970, -7304129, 4044249, 7091528, -4453344, -15315317, 3469260, 1641751, -747324, 7239168, 3919158, 5926518, 2255395, -562641, -7780334, 1056025, 3546032, 2833605, 633508, -3470871, 589484, -1928440, -4246649, 828929, -1319629, 2043331, -486942, 569083, 503585, 395674, 1545651, 1009317, 1075889, -140660, --2667712, 1928977, -1060857, -1188632, -984084, -1896228, 3550864, 4003447, 3410741, 1387811, -406411, 605590, -775778, 2745558, -12242804, -6895570, 1102733, -6724308, -18039400, 13711146, --469225, -717796, 1542430, 1241782, -11990475, 8436926, -12493523, 1270774, 5463736, -1448478, -1881733, 2160369, -13428752, -4290673, -6077379, -1053878, 2551211, -4183298, -2933463, -364535, --947040, 1388885, 5381057, 3144990, 11763915, -4155381, 16209743, -972810, 280784, -10533407, --1752347, 8132521, -1743220, -16295106, 6488085, 7830263, -5062156, 4224637, -6313602, 11586211, -6154688, -151398, -832150, -7152195, -4832375, -7843147, 7348152, 7580081, 3099356, 1016834, -3223910, -6290517, -17152488, -6043556, 5802501, 2782065, -12759811, 490163, 1338956, 1897302, --6196564, 4507568, 8807904, 4794794, 40802, 3796214, 6017786, -3308736, 9032316, 312996, --382252, -8922795, -11747272, 7627325, -3674345, 3866008, 3638911, -468688, -2619393, -2382633, --2071785, 1342714, -2985002, 3922379, 747324, -891206, 836982, -1189706, 31675, -4598300, -1072668, 514859, -941135, -2501819, 775778, -2199560, -238371, 890132, -591632, -1398012, --133681, -1404454, 5634460, 4493073, 1529545, -543850, -589484, -1535988, -62814, -534723, -3572339, -1116692, -582505, 3614215, 730144, 1574642, 2474438, -1686848, -1057099, 2725157, -1492501, -629750, -491774, 3854196, -18882824, 10179072, -2623151, 3777961, -5628018, -2997887, -7866233, -9117142, 8852464, -5496485, -10740103, 4884989, -5813775, 22822382, 3326452, -7922067, --11127187, -1947768, -13786308, -6269579, -14844481, -833761, 9822053, -6973417, 6034966, 10011032, --9311489, 63888, -10858214, 6086506, 2064806, -367220, 6294812, -6702834, -9747428, -8149164, -492311, 1851131, 8062191, -11684995, 8266202, 1656784, -17365626, -9491878, -14031121, -5710696, -5231270, -4684736, -4731980, -26548804, -628676, -5814849, -2508798, -17024176, -6009733, -2236604, -1243393, 13914083, 12588549, 10733660, 6088116, 13412109, -14500883, 11255499, 1482301, 5257040, -3697967, -10285910, 15939697, 9947681, 6236293, -7026030, -9540196, -6791417, 9216463, 1086090, --44023, 5053566, 2345589, 5312875, -4751845, 14093935, 7308424, -1493575, -2386391, 3174518, -2752000, 1735167, -933619, -842350, 1216550, -205085, -340376, -5816997, 250182, -3353833, -116501, 1873680, 550293, -335544, -67646, 1174137, 919123, -5532455, -1570884, 1984275, --1708323, -2150168, -234076, 763967, 812286, 1096290, -910533, -1131187, 858993, -2403034, --4223564, -1022202, -1127966, -1326071, 655519, -302258, 3568581, 1742683, -1588064, 1638530, -1107565, 951335, -1639067, -2870649, -164819, 459562, 3029026, -1060320, -826244, 7132330, -13219909, 14334453, 5860483, 10033044, 8120710, 4861366, -2618856, 1087164, -3905736, 350040, --1342714, -8640400, 11034845, 17511118, 6982543, -4763656, 7853348, 7477001, -290984, 4655208, --8235600, -15877420, -10565620, -7210177, 4620848, -1894081, -8291435, 6247030, -2835752, -7399692, --70867, 12926241, 6519224, 9589588, 3369939, 7072738, 7835631, -1742146, 7180112, -2732673, --8145406, 3501472, -9436043, 3587908, 3802120, -13869523, -9011915, 5769215, 14467060, -7418483, -10095321, 14098767, -11561515, 545998, 12840878, 1452773, -4632659, -1006633, -6518687, -11399380, -186294, -3406983, -5971079, 7961259, 445066, -13052942, 16879758, -6875169, 13701483, -16068010, --10988137, 7969849, -9875204, 5567352, -6621766, -4790499, -9269613, -5630702, -7534447, -18975702, -3201361, 11724724, -5315022, -785979, 8137353, 8692477, 6179384, -1126892, -636192, -4865124, --1486596, -2096481, -2522757, 2120640, -461709, -1741609, 2855080, 2594160, -1132261, -184684, --3354370, 1560147, -2943126, -5400385, -324807, 5166309, 102005, -2793339, -700080, 8493298, -4278861, 355409, -2469606, -2991982, -2173790, 580357, 643171, -2499134, -897111, 167504, -1061394, 3428458, 872415, 5370857, 3253438, 3868692, 1521492, 1773822, 2123861, -642098, -142271, -11761768, 7498476, -4958540, -13073344, 18779208, 9423695, -12867722, 9157407, 8608188, -2337536, 15865609, -32198832, 2532420, 13101798, 4751308, 1100585, 14225469, 466541, 7887708, --18647674, -2285996, 4980552, 455267, -9368934, 3844533, 7400766, 3835406, 3469797, 10118943, -8166881, 13375602, 10271951, -3835406, -4291746, 10402411, -6323803, 7364259, -11588359, -6038724, --14806900, -6495065, 8078297, 3067144, -3459059, 12353400, -14440217, -19204946, -31515396, 9994926, -10815801, 8745090, 6601902, -7194607, 4952634, -4079682, 11834782, 31970126, -4994510, -6467147, --13861470, -4156992, 11838004, -7875897, 6762963, 11931956, 1860795, -34360, -9271761, -2442763, -4321811, -21767968, -20367272, 2268280, 2698850, -7580618, 11101417, 8746701, 16001974, 26216480, -10302016, -5814849, -3217468, 5709086, -196495, -14115410, 6763500, 6237903, 5068599, 1919850, -6627135, -54761, 3646427, 3294240, 2010582, -3047279, 216359, -125091, -500364, 5526549, -1526324, 120259, 2727304, -5494337, 1578937, 1220308, -768799, 5807333, 1064078, -1446867, --1001801, -3277060, 9910637, 853625, 1663226, 4369593, -1512365, -1298691, 5562520, -5888937, -5532992, -4257387, 4580046, -127238, -433792, -890132, 1843615, -747861, 4737349, -3742527, --1651415, 1648731, -912681, -1166621, -3035468, -4446365, 3326452, 47582332, 26924614, 17141752, --4380330, -4859219, -579284, -4064113, -4883915, -7391639, -8882529, -15279346, 688805, -1087701, -3743601, 6651294, 12700755, 19182934, -2550674, -24974162, -9746355, 21420612, -3325915, 8022999, --2761127, -367757, 14289893, 4936528, 10854456, 6369974, -433255, -651224, -187368, 7201050, -9222905, -3580929, -14049912, 18409840, 13211319, 9370008, 3463891, 4770635, -7464653, -13943074, -19210852, 10707890, 4954782, -8913131, -9897215, -13911399, -8551817, -2477659, -8687645, 4814659, --17778480, 2456721, 13138305, -8544301, 4640176, 791348, 1932735, -20308216, 7203197, -8722005, -14821395, -32612760, 5602785, -8524973, -11006391, 2698313, -6639483, 6706592, 6363531, -21246666, -235149, 14852534, 2225330, 4355634, 9346386, 3813394, 15499463, 6322729, 3280818, 1039382, --2245194, 9982578, -19716584, -373662, -1149978, -1808181, 777389, -564788, -149787, -1713692, --2901251, -3789772, 6135898, 5140539, -2697776, -437013, -9443022, 930397, -590558, -9315784, --44560, -13819057, -10504953, 4662724, 1758252, 7281580, -8215736, 3536906, 7153268, 1585917, --309775, 1863479, 3833795, 331786, -2062121, 7586523, 52613, 2474975, -4450660, -3329674, -3150359, 4554276, 801548, -29248190, -15021111, 2158221, -25696790, 5891085, 18658412, -8981313, -22680648, 26597122, 3389266, 13286481, 16411070, 7353521, -15735686, 10268193, 12524125, -619549, -3169686, 8828842, 7815767, 18770618, 3208878, -7240241, 11992086, 4294968, -1858647, 270046, -8041253, -10976326, -4957466, -4646618, 6709813, 3473555, -15472083, 4568235, 12934294, 342524, -15587510, -14741402, -27836756, 2222646, 12497818, 18887118, 17526688, 9040906, 8319352, 6658273, --18913426, -5539434, -787590, 14191646, 22445500, -7758859, 4837744, -8261907, 5311801, 3566970, -13664975, 21153788, -8152385, -9273371, -1839320, 11589432, 14892799, 20848844, 515933, -22537840, --21251498, -3471944, 2753611, 64961, -9740986, 217970, -25624312, -16544214, -15140833, -17241610, -7351911, 2643016, 20651814, 16498580, 6226092, -9874667, -9850507, -9179419, -8329552, -14323716, -6760279, 4483409, 2654827, 9627706, 10713259, 57982, 9140764, 1874216, 9760850, -3397319, -8096550, -2589865, -729071, 2399276, -2969970, 13533442, 6102075, 8033737, 3638374, 9635222, -2162516, 4618164, 13829258, 11984032, 6424734, -775778, -5297842, -4549981, -9775346, -5496485, --6415608, -3837553, -5916318, -7182259, -4146791, 4173635, 9218610, 2552284, -2155537, 332860, --1360431, 5751498, 6811282, 5643050, -594853, 2536178, -10414759, 12358768, -27339078, 2462627, --5461051, 14973330, -8023536, -1259499, 4639102, 11340324, -15260019, -25704842, -4459787, -10079215, -724239, -11605539, 6832219, 6731825, 678068, -13872207, 8660802, 856846, 23163832, -3708168, -12688407, -10711648, 23924042, 6888591, 14933064, 10016937, 16291885, 23941222, -5830955, 9286793, --16748762, 17663590, 17183628, -402116, 5590437, 17298518, -11066520, -10701448, -1756105, 34830576, -5674189, -9742060, 17308718, 2262374, 13278428, 19071266, 5574868, -1291175, 1810329, 2975876, -12600897, -4403952, 13513041, -9316858, 13192529, -7292855, 29753922, -4320737, 25589416, -23192286, --25449292, 35442608, -29653528, -15880105, 1216013, -9557913, -18399104, 16193100, -2139968, -22834730, --10785200, -11728482, -33570000, -12458090, 4165582, 7550016, -25894358, -6619619, 15746961, -3140695, -9055402, 15512348, -11057930, -2529199, 2552284, 10127533, 7297150, 7641821, -2486249, -1462973, -6294812, -543850, -4143033, 3445638, 7256347, 1374390, 5053566, -146029, -4628901, -9664, -6698002, 2520609, -3365644, -8381629, -5032628, 9833864, -4480188, -13207024, 3185255, -7577396, --14344117, 16643, 5463199, 515933, -3679713, -1058173, 4005594, -3005940, 246961, 5182952, --223338, -2396592, -3032784, 9336185, 17965312, 989453, -6230387, -5216775, -2838974, -8434779, --1731409, -3527242, 3536369, -22944790, -15306727, 4464619, -30002494, -17502528, -20847772, -21212306, -25851946, -638340, 891206, 7698729, -7537131, -32988570, -24677808, -24171540, -49287972, 3561065, -5596880, 21298206, 12449500, 7380365, 10628433, 7371238, 2305324, -15557982, -22859964, -13167296, -17767206, -2248416, -13371844, -5399848, 17403208, -21047488, -13581223, -21619792, -10748693, -1848983, --20739860, 7713762, -17222282, 18632106, 13068512, -2895345, 12891881, -12681428, -26067768, 11387032, -15202574, -13458817, -29913910, 22533546, -1945083, 16319802, 13707925, -42788076, -30398704, 284005, --6942278, 27853400, -15981036, -18475876, -4964446, 10270341, 1569274, -2581275, -9707163, 36984500, --18153754, -30131880, -40740988, 29203630, -6984691, -33550674, 15621333, 15902116, 9427990, 33706368, -36063768, 37026376, 15841987, -8418136, -3412889, -5757941, 12287365, -23721642, 15229417, 2893197, -2967823, 11542188, 11164767, -9801652, 14301167, -11253351, 4764730, -15972447, -9111236, -6219113, --8290361, -3318936, -8929774, -2241436, 6101001, 16711718, 19448148, 784905, 15249818, -9169755, -2183991, 8996346, 1180042, -16986596, 2043331, 4119948, -4737886, -12630425, -8107825, -7784628, -20161650, 12549358, 6491306, 9483288, 16997870, -2725157, -20375862, -12802761, -11742441, -14624364, --18944028, 3291019, -15903190, -27742268, -599148, -4926865, -6595459, -5277441, 4193499, -27051852, --10775536, 12608413, 20512226, 41771240, 6848326, 21850646, 10589779, 10550050, -9528922, -3053185, --8123931, -22912576, -26921928, -37798396, -13760001, -34051576, -13387413, -17824652, -6658273, 18300856, -4498978, 12454868, 21521544, 33823, 14540075, 4233227, 741956, -490163, -2840584, -28724204, -10459319, -3581466, -32460826, -20092930, 9483288, -20823612, -7991861, 7591892, 23567560, 28603946, -9950902, -5936182, 3938485, 19152870, 10247255, 4046933, -563178, -56612500, -11417634, 12539694, -14375256, 5747740, -2163053, -19079856, 13244605, -17019344, -12834973, -3338800, 3481071, -9458055, --30238718, 16179679, -3868155, 37638408, 14315126, 12871480, 14464376, 27673012, 62048320, 962610, -1063541, -2592013, -18471580, 11040213, -12814035, 45129368, -4009352, -16170015, -14554034, 19080392, --24467892, -16513076, -3216394, 38604776, 1297617, 18426484, 28516436, 5771899, 23087596, 17511656, --3183645, 16057809, 17401596, 591632, -11876658, -12794171, 3593814, 4419522, 14601815, 9385577, --617402, -2172180, 2602750, 5948530, -10812043, -2249489, -2643016, -1410360, -16963510, 10707353, --12307766, 4322348, -2484639, -7356205, 2068027, 20688858, 18098456, 50466, -1199907, -13140452, --5357972, -13060459, -1933272, -15201500, -21674016, 6379637, 15054934, 1051193, 879395, -7479149, --11350525, 31688806, -4294968, 5756867, -34678640, -11731703, 40614284, -27066348, -7399692, -23437100, --69262256, -9828496, 21223044, 17540110, 3343095, 5050345, -3766686, 38821136, -41842108, -21475, --12064563, -27939300, -23699092, -3506304, 7916162, 6986301, 9330280, 25072946, 16227997, -17723182, --18075906, 49854908, 40691056, -3255585, 4741644, -5448166, 13247290, -177704, 29036126, 10599442, -15424301, 4369056, 2226941, -51511152, 21339546, -2196876, -29708826, -15094663, 2919504, -7977902, --29566018, 28467580, -5041755, -21010444, -4421132, 3129958, 25189984, 28261958, 21449066, 8315057, -25123412, 26897770, -20198694, -22022444, -14120779, -3569118, 26035018, 34873524, 5956046, 12598213, -33385854, 20112258, -31328566, 23190676, 8410620, -6846715, 1227824, 64297808, -42545948, 32794222, -37486476, -37685116, -2213519, -24474334, -7918846, -54159536, 15598247, 24036248, -32646046, 19754702, --28247464, -20349556, 24699820, -15326591, -2277943, -9192841, 1199907, -13516262, 4181688, 6315213, --10285373, -14486388, -1138166, -15738908, 20696374, 3773129, -19433654, 4304631, -3264175, -10506564, --10201084, 6736656, 13197361, 16611860, 6793565, -14847165, 38121056, -6997039, 3799436, -2417530, --20171314, 7759396, 11009612, -10180146, 16265041, 4205310, 12153147, -2779381, -19509888, 6643778, -29405494, -19008988, -27253714, -44530220, 8914741, -8654896, -14027900, -18108656, 9941776, -11056320, --5035313, 29023778, -9028021, -1806571, -22821308, 1699196, 14682346, -32249836, -20189030, -19366544, --9386114, 11491185, -43206836, -24242406, -62382788, 10679436, -591095, -16042777, -6921877, -9405442, -13374528, 19857244, -22145926, 643708, -7716446, -7700877, -38979512, 8383776, 29956860, 7721278, -22663468, 28232968, 25484188, -34398928, -10453414, -10532870, -16012175, 28563144, -29403346, -17162152, -1028108, 41566692, 9433359, -14881525, 42089604, -23888072, -22246856, 49998252, 48077328, 4418985, -12237436, -13890998, -45577656, -14243722, 45886892, -22474490, 41586556, -15232638, -65504692, -17491792, --30641908, 34699576, 303332, 7603703, 31286152, -5219996, 25792890, -33903936, -39712880, 30317100, --7975218, -67115840, 41303088, -21519934, 11260867, 13340705, -23408646, 44161928, -30317638, 15880105, --476741, 11600170, 44941464, -11637214, -14214194, 1539209, -9371082, -12409771, -10169409, 4922033, -10095858, 2317135, -6460168, 5513665, -21422760, 19134080, 13481902, 10713259, 4275103, -2147, --10028749, -11017128, -10433549, 8959839, 17541720, -17318382, 15209553, 35362612, 11895449, -30495878, -2923799, 10985989, -11304891, -20182052, 18871550, -17113834, -403190, -1611687, -18178450, -23511188, --257161, 13186623, -7773891, 30407294, -10256382, -20320028, 14097156, -9087614, 1040456, 11794517, -23278722, 1546188, -41477572, 24374476, 28457380, -34591128, 18947786, -383326, -12322261, -14918569, --49515604, -22099754, 17547088, 2934537, 45647448, -36786932, -20591684, 8350490, -4945655, 28989956, --40511204, -169114, 4241280, -34520800, 34375308, 18591302, 10534481, -16308528, 23552526, -28030568, -15424838, 11725798, 7279433, -2204392, -15487652, 6214818, 31242128, -16640851, -5939940, 5867999, --24403468, 24685862, 1002338, 6289443, -33458332, 17816598, 4452808, 5888937, -78553880, 10522670, --22319334, 36463200, 30423938, 32012002, 16513076, -64174328, -11205033, 13422847, 1376537, 3964792, -45018772, -6994354, -27090506, -32789928, 1316944, -36442260, -31723166, -28398860, 13529684, -53036940, -37473588, 71392024, -18808736, -8905078, -55977384, -12510166, 21430814, 12925704, -18629420, -4131759, --67732704, -24094230, 67977520, 28648506, -21118892, 19597936, -38431368, -28678570, 7476465, 1220845, -4573604, -26318486, -9058086, -5742372, -49929, -38022808, 8094940, -5126581, -11862700, 4745939, -15560667, -20886426, -10358924, -3504693, 7392176, -16108275, -4271882, -2997350, -15016279, -46171, --27772870, 35944580, 11634530, -9756018, -3717831, -10912975, -1559610, 22975390, 6892886, -4551592, -12074764, -7794829, -34581468, 1332514, 1504849, 7031935, 15229417, -9293772, -6581501, 14795625, -18089328, 7510824, -16724066, -37165424, -51835424, 14500346, -23047332, -14730664, 15010374, -11988864, --18591840, 14840186, -24266566, -886374, -27581206, 39594228, 128849, -27958626, -8979166, 1224066, --3421478, 9642738, -19608136, -12635794, 3730179, 8425652, 4032974, 4387309, 14265734, -16603807, --7129646, -38916700, 14110578, 4238059, -12592307, 29050622, 15062987, -11161546, 43116640, 10191421, --27957552, 21219286, 3063386, 13977971, 28302224, -2199560, -7569343, 4974646, 23247584, 13878650, -42413, -1974611, 24914032, -1815697, -29982092, -4673998, 4975183, 23726474, -10796474, 40537512, -43865036, -27735826, 22692996, 50219980, -13892072, 76042936, 42273216, -18558016, -17646410, -28126668, --32674500, -17862232, 9672266, -5275294, -6134824, -634581, -5310190, -52510272, -20875152, -51841864, -11842299, 47150152, -17890150, -2483565, -25829934, 13028783, 2795487, 9368934, 12694850, 39613556, --2297271, 18188650, 17893908, -29139742, 909996, 284542, 6093485, 13252658, -2011655, -6629819, -11928198, -1466195, -7117835, 1899986, -12539694, -2589329, 8675834, 2030983, -5558225, -27880244, -1142998, -12666932, -1362042, -10624138, 23304492, -7585449, 11223823, 14533096, -11527692, 17467096, -10718091, 497679, -6352794, -10463077, 2405182, -910533, -6420439, -776852, 11491722, -8750996, -4866198, -2972654, 8232916, -21994528, 66778688, 17631914, -23911156, 2666101, -31402116, -4121558, -11013370, -13045963, -16690243, -18615462, -7055021, 7150584, -4110821, -5988795, 8481487, 4882841, -11496554, -11882027, -7456600, 8546985, -3082713, 1514513, -17359720, 11759084, -20322174, 9735080, -6700686, -4395362, -919123, 726386, -11803107, 1959579, 2391760, -9422085, 16974248, -9161165, -4096325, 70867, 572841, 8563091, -8401493, -13056701, -3936875, 19605988, -14591615, 9589051, --26737782, -15917686, 5043902, -5808944, -452045, -1799054, -16110959, 17024176, 13596256, 1205812, --11806328, -621160, -7193534, 3471407, -8970039, -324807, -8612483, 6383932, -2405182, 1631014, -21572546, -18327700, -1598802, 3198140, 1283122, -4015258, 477278, -8724152, 458488, -7322383, -4410395, 8475044, -13129715, -10927471, 6230924, 754304, -3142842, -10420128, 4432406, 1321239, --482110, -2423972, 52076, -2450279, 7174743, -4879083, -1378148, 3280281, -2465848, -469762, -5737540, -3953518, -2589865, -1571421, 1183800, 5884642, -2085744, -6815040, 355945, -4423817, -15503758, -6379100, 1860795, 3455301, -4005594, 12306692, -1837172, -10864120, 3802657, -6253473, -7594576, 3652870, -1764695, -770410, -2918430, -3049427, 7495792, -5120138, -2347200, -938450, --6673306, 8371965, -32304596, -47041168, 32691680, 151848576, 66105988, 69747048, -741419, -140010560, --101835824, -52546240, -110857400, 53950696, 65667904, 34561064, 142689008, 64560336, -6498823, 47680044, --92813704, -117711632, -67628552, -82389824, -18107046, 64149096, 65147136, 27655832, 109642464, 54808076, --7933342, 53119620, -48947596, -83262240, -48168060, -62583580, -98865312, 36531920, -1126355, -35172560, -105900472, 64144264, 35721780, 108895672, 26029112, -54998668, 53286584, -78509320, -89974200, -18178450, --94619200, -95583960, 37650220, -15666430, 22939958, 120918360, 82505248, 86261200, 81024024, 10018548, --45732276, -52470540, -88294864, -115444960, -60819960, -32796908, -24109798, 44282188, 68644848, 64775624, -91349656, 82804824, -12934294, -14492830, -15042049, -84778360, -25633976, -41703060, -63255740, 14209362, -25702158, 4279935, 58628452, 26322780, 374199, 36899136, -28492814, -31132070, 703301, -20214800, --6543383, 15431281, -3323768, 17119740, 22646826, -12503724, 17783848, 7350837, -27704150, 2658048, --13289166, -52288544, -887985, -13265543, -22468048, 50538880, 14995341, 18995566, 66194036, 26320634, -19333258, 14615237, -33026688, -48110612, -44724032, -74898864, -61368104, -27285390, 2449742, 33668784, -76915352, 81548008, 74795248, 66334160, 40880036, -16388521, -47108812, -93791888, -118867512, -91750168, --55139864, -19489488, 49873696, 92463664, 106277888, 108948824, 52465708, -13139916, -36048196, -44297756, --57130580, -41292352, -42426224, -34329136, -5100811, 10273025, 16789564, 28822452, 30978526, 28351616, -25851946, 14023605, 3661997, -4414153, -14708116, -22870700, -22622666, -19403588, -13933948, -8004746, -2718178, 8898098, 12319577, 12787191, 12302934, 7923141, 4788889, -47245, -448824, -2206003, --3201898, -4710506, -2464774, -3774203, -4188130, -4038880, -2665027, -5740761, -2375117, 66035, -2941516, 6598144, 9072045, 6065031, 8182987, 5013301, 1560147, -2833605, -6347425, -10062572, --8756901, -8764418, -4068408, -513785, 4300873, 5161477, 7738994, 6389838, 5264020, 1903207, -897111, -2472291, -2388539, -3947612, -3363496, -3054259, -768799, -1487669, 806380, -236760, -1251446, 922881, 920197, -337692, 2000381, 937914, 2284923, 625992, 963146, 33286, -119722, -2251100, -1434519, -2835215, -1533840, -1693828, 87510, -198105, 1779190, 962073, -2161442, 957241, 1504312, -88047, 602906, -891206, -107911, -1233729, -44023, -1045288, -266288, -641024, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-1172526, 709207, 7030862, -908922, -324807, -2050847, 7669738, 445603, 3730179, 2262374, +2258616, -3167539, 1592359, -4903779, -531502, 3795677, 772020, 2221035, 3579318, -6054830, +-4224637, 1436130, -299574, 4486630, 2735357, -237297, -2491618, -1571958, -3082713, -494995, +-410706, -466541, 854699, 1170379, -2682744, 4497368, -1033477, -705985, 1538672, -5740761, +-1323387, 2479807, 878321, 5658620, -21475, -417149, 1105954, 383326, 2357400, 3917547, +4984847, -290447, -514322, 87510, -2867428, -3641596, 2009508, 3248606, -2281702, -2190433, +-1479079, 4144107, 2441689, -572304, 646393, -4889821, -1408212, 2539936, 2107218, 3613678, +-5255430, 1192390, 1988033, -1096290, 3707094, -239444, 3231426, 1537061, 1039382, 4098473, +2034741, 1034013, 33286, 483184, -977642, 344134, 569620, -323196, -1456531, 719944, +708670, -1078037, -150861, -727460, 761283, 1178969, 47782, -150324, -66572, -1093069, +536334, -386010, 907849, 428960, 279173, 194884, -488553, 296353, 134218, 466541, +-868657, -413391, -192200, 119185, -1183264, 11647951, 3206193, -2667712, 5936719, -2886218, +6178848, -2055142, -2819109, 3143379, 5777268, -177704, -2859375, 1542967, 1211718, -237297, +-8229694, 1927904, 2408403, 660351, 5137318, 6918656, 3711389, 6812892, 4629975, 4151086, +-1109712, 4610111, 2218888, -3495567, 1307281, 2129767, -4503810, -5716602, -880468, 2253247, +87510, -2063195, -2767033, -2692408, -1337882, 3084324, 6179921, 5236639, 1975148, 4022237, +-6493991, 409633, -1658394, 63351, -7453379, 2763275, -718333, -1757179, -292058, -2022930, +-3685619, -2588792, 2611340, 625455, 2002529, -2716567, 5081483, 1306744, -5888937, 2432025, +745177, 1636383, 3223373, 978716, 5917391, -1888175, 646929, -6912750, 1312649, 666257, +195958, 163746, -1303523, 4917201, -1505923, -2285996, 3728569, -3864934, -1888175, -1596654, +-721018, -1802813, 1244467, 329102, 648540, -51003, -172872, 63351, -708133, 423054, +644782, -250719, -304943, -34360, -1281511, -2087891, 766652, 253940, -1649804, -220117, +-185220, -360777, -1998234, 509491, -12885, -66035, 133144, 345745, 212601, -758599, +-32749, -1377611, -160524, 572304, -2352032, -2378875, -762357, 2155537, -3982509, 1155346, +-7871065, 1467268, 1493575, -928250, 5634997, 345745, -620086, 494458, 2987687, -4840965, +696322, 1466731, 3090766, -6882148, -3472481, -2604898, 2526515, 1017370, -2149094, -6955163, +1690607, -6918656, -415538, 2727304, -1271310, 2073932, -1185411, 4639102, 6907918, 3631932, +-3563212, 655519, 5237176, 3215857, -3225521, 2701535, 817654, -5396627, 1900523, 7383049, +3477313, 2465848, 8259222, 725313, -3122978, -6329171, -267362, -3559454, -4242891, -2029372, +4545149, -4322348, 1511292, -2586107, -2396592, 5272073, -684510, 861141, 4223564, 5727876, +-2542084, -5288716, 6717866, 5133023, 3294240, 296353, -4024384, 628139, 5310190, -5392869, +1646046, -3519726, -108448, 3266323, -3071975, -188979, -5919539, -1580011, -513249, 884226, +-307627, -2259153, -259846, 1117228, -1742683, -469762, 819802, 661962, 515933, 471910, +-83752, -449361, -2331094, 1240172, -121333, 1278290, -898722, -1556926, 551903, 1211181, +-800475, 1067836, -179315, -89121, -91805, -259846, 1306207, -775778, 510564, -783295, +-15601469, -5712307, -2401961, 8535711, -3239479, -1284732, -5043366, -4269735, -728534, -11254962, +6307697, 2081985, -319438, -4159676, 6209986, -1750736, 3154117, -2517925, 1992328, 3956739, +-4947266, 519691, 5459977, 3083250, 2199023, 5836324, 5223217, -3280281, -4179003, -5216775, +-86436, -6857452, 1636383, -9057012, -1733019, 6664716, 3506841, -2299955, -704912, -6815040, +3093987, -2916283, 6004365, -3462818, -6162741, -1270237, -2539936, -5068062, 1961726, -1165010, +-3223373, -3289408, -10916733, 1487132, -3274376, -8094940, -2152852, 4983773, 2558727, -4189741, +3456375, 4439386, 4292820, 1589138, -5581310, -936303, -1239635, 3860102, -3922916, -1513976, +2035815, 2062121, -6109054, -7283191, -13066901, -2242510, -7589207, 2491081, -293668, -1819992, +3842385, -819265, -1749125, 1668058, 2620467, 2509872, 1958505, 4540318, -1941862, -1609002, +-1228898, 659814, 228707, -1043140, 1253594, 1796370, -401579, 415001, -797253, -1043140, +-193274, -681289, 187905, 386547, 53150, -1156420, 177167, -783295, -296890, 642098, +1465658, -662499, 1755568, 2129230, 336618, -630823, -1859184, -386547, 1249836, 820876, +-809064, -13579076, -5430986, -2433099, -4020626, 4620311, 6041945, 5694590, -11335492, -8465381, +3263638, 13814225, 8170102, -5369, 1969779, 3936338, -4961224, 3278134, -4598836, 3325379, +4911832, 759136, 3942243, 1230508, -270583, 2045478, 1217623, -3701188, -4684199, 6483253, +2633889, -4729833, 4647692, -2578591, -471910, 11144366, -5310727, 6310918, 12463995, 5086852, +-702764, 483721, -4483946, 5828271, -5939940, -3248606, -9990094, 1888712, 7721815, -188979, +-7068443, -2517925, -10024991, -5091147, -1852205, -14268955, -7756174, -1405528, 1524713, -6244346, +3178813, -1650341, -4921496, 5349382, 15792058, 1473711, 8056822, 5463199, 4743255, -4988605, +2114735, -8504572, 923418, 2454574, 1923072, -3299072, 92342, -8634495, -2994666, -3024731, +-598074, 4207994, 4518306, -193810, 1770063, 2456721, -1218697, -935766, -777389, 817654, +119722, 614180, 492311, 1389959, -711354, -37044, -2051921, -245887, -300648, 1491427, +869194, -899259, -1229434, -1196685, -1152662, -384400, -1420560, 529892, 2685965, -2093797, +-248571, 923955, 1539209, 21209622, 13402982, -7292318, 2720862, 6827388, -2817499, 3908957, +-1327145, 6369437, 3190087, 2040110, 5776194, 3269007, 2857764, -1799054, -14192719, 6797323, +-2417530, -3227668, 11103027, 6875169, 3836480, 5123896, 3802120, 2828236, -2172717, 1648194, +450972, -3629784, 2935073, 4806606, -8006356, 1537061, -5181878, 3834332, 4431870, -12511240, +-206158, -14889578, 255551, 1865626, 1263257, 4070555, 10160282, -1237488, -5267241, -2575907, +-2828236, -3911105, 2923799, 3155727, 982474, -1647120, -1828046, 9881109, -3277597, -1969779, +-5392869, 8777839, -1334124, 7377680, -3471944, 7884486, -7589744, -15947750, -4744865, 1005022, +3226594, 5398774, -5374078, -3995930, 2183991, 1445257, -2492692, -4155381, 9970767, -3897683, +9484898, 2513093, 6701223, 2646237, 4881231, 4123706, -1720134, -639950, 1915019, -277025, +5171141, 138513, -1719598, 477278, -5806796, -1145146, -1348620, 407485, -1945620, -738734, +-659814, -133681, -675921, -3038689, -2476586, 744103, 202937, -3411815, -213675, 507880, +494458, 1398012, 583579, 3364570, 140660, -1130113, -146029, -452582, -1567663, -1833414, +-737661, 508954, 9931575, -3797288, -6589017, -308701, 1055488, -9432285, -7364259, -2354716, +2572686, -1410897, 12249247, 7340099, 332323, 11682311, 4224101, 3415036, -10008884, 9393093, +-1749662, -2364380, -8440148, -3822521, 7509751, 7401840, -2102923, 4907537, -10151692, -1433445, +6833830, 5134634, -3789772, -7218767, -4043175, -4462471, -5557688, -4635881, 1119913, -7586523, +-723702, 10478646, -5037997, 1209033, -388158, -2413235, 4095251, -1671816, 6857452, 8590, +9668508, -2479807, -6077916, 3495030, -4800163, -4764193, -4800163, -13712757, 1601486, 5680094, +8176007, 5889474, 10741713, -1097364, -4116726, 6206228, -7614977, 1777580, 1189706, -1140851, +6965363, 6493454, -1658931, -8278550, 1668595, -4272956, -7876970, -7304129, 4044249, 7091528, +4453344, -15315317, 3469260, 1641751, -747324, 7239168, 3919158, 5926518, 2255395, -562641, +7780334, 1056025, 3546032, 2833605, 633508, -3470871, 589484, -1928440, -4246649, 828929, +1319629, 2043331, -486942, 569083, 503585, 395674, 1545651, 1009317, 1075889, -140660, +-2667712, 1928977, -1060857, -1188632, -984084, -1896228, 3550864, 4003447, 3410741, 1387811, +406411, 605590, -775778, 2745558, -12242804, -6895570, 1102733, -6724308, -18039400, 13711146, +-469225, -717796, 1542430, 1241782, -11990475, 8436926, -12493523, 1270774, 5463736, -1448478, +1881733, 2160369, -13428752, -4290673, -6077379, -1053878, 2551211, -4183298, -2933463, -364535, +-947040, 1388885, 5381057, 3144990, 11763915, -4155381, 16209743, -972810, 280784, -10533407, +-1752347, 8132521, -1743220, -16295106, 6488085, 7830263, -5062156, 4224637, -6313602, 11586211, +6154688, -151398, -832150, -7152195, -4832375, -7843147, 7348152, 7580081, 3099356, 1016834, +3223910, -6290517, -17152488, -6043556, 5802501, 2782065, -12759811, 490163, 1338956, 1897302, +-6196564, 4507568, 8807904, 4794794, 40802, 3796214, 6017786, -3308736, 9032316, 312996, +-382252, -8922795, -11747272, 7627325, -3674345, 3866008, 3638911, -468688, -2619393, -2382633, +-2071785, 1342714, -2985002, 3922379, 747324, -891206, 836982, -1189706, 31675, -4598300, +1072668, 514859, -941135, -2501819, 775778, -2199560, -238371, 890132, -591632, -1398012, +-133681, -1404454, 5634460, 4493073, 1529545, -543850, -589484, -1535988, -62814, -534723, +3572339, -1116692, -582505, 3614215, 730144, 1574642, 2474438, -1686848, -1057099, 2725157, +1492501, -629750, -491774, 3854196, -18882824, 10179072, -2623151, 3777961, -5628018, -2997887, +7866233, -9117142, 8852464, -5496485, -10740103, 4884989, -5813775, 22822382, 3326452, -7922067, +-11127187, -1947768, -13786308, -6269579, -14844481, -833761, 9822053, -6973417, 6034966, 10011032, +-9311489, 63888, -10858214, 6086506, 2064806, -367220, 6294812, -6702834, -9747428, -8149164, +492311, 1851131, 8062191, -11684995, 8266202, 1656784, -17365626, -9491878, -14031121, -5710696, +5231270, -4684736, -4731980, -26548804, -628676, -5814849, -2508798, -17024176, -6009733, -2236604, +1243393, 13914083, 12588549, 10733660, 6088116, 13412109, -14500883, 11255499, 1482301, 5257040, +3697967, -10285910, 15939697, 9947681, 6236293, -7026030, -9540196, -6791417, 9216463, 1086090, +-44023, 5053566, 2345589, 5312875, -4751845, 14093935, 7308424, -1493575, -2386391, 3174518, +2752000, 1735167, -933619, -842350, 1216550, -205085, -340376, -5816997, 250182, -3353833, +116501, 1873680, 550293, -335544, -67646, 1174137, 919123, -5532455, -1570884, 1984275, +-1708323, -2150168, -234076, 763967, 812286, 1096290, -910533, -1131187, 858993, -2403034, +-4223564, -1022202, -1127966, -1326071, 655519, -302258, 3568581, 1742683, -1588064, 1638530, +1107565, 951335, -1639067, -2870649, -164819, 459562, 3029026, -1060320, -826244, 7132330, +13219909, 14334453, 5860483, 10033044, 8120710, 4861366, -2618856, 1087164, -3905736, 350040, +-1342714, -8640400, 11034845, 17511118, 6982543, -4763656, 7853348, 7477001, -290984, 4655208, +-8235600, -15877420, -10565620, -7210177, 4620848, -1894081, -8291435, 6247030, -2835752, -7399692, +-70867, 12926241, 6519224, 9589588, 3369939, 7072738, 7835631, -1742146, 7180112, -2732673, +-8145406, 3501472, -9436043, 3587908, 3802120, -13869523, -9011915, 5769215, 14467060, -7418483, +10095321, 14098767, -11561515, 545998, 12840878, 1452773, -4632659, -1006633, -6518687, -11399380, +186294, -3406983, -5971079, 7961259, 445066, -13052942, 16879758, -6875169, 13701483, -16068010, +-10988137, 7969849, -9875204, 5567352, -6621766, -4790499, -9269613, -5630702, -7534447, -18975702, +3201361, 11724724, -5315022, -785979, 8137353, 8692477, 6179384, -1126892, -636192, -4865124, +-1486596, -2096481, -2522757, 2120640, -461709, -1741609, 2855080, 2594160, -1132261, -184684, +-3354370, 1560147, -2943126, -5400385, -324807, 5166309, 102005, -2793339, -700080, 8493298, +4278861, 355409, -2469606, -2991982, -2173790, 580357, 643171, -2499134, -897111, 167504, +1061394, 3428458, 872415, 5370857, 3253438, 3868692, 1521492, 1773822, 2123861, -642098, +142271, -11761768, 7498476, -4958540, -13073344, 18779208, 9423695, -12867722, 9157407, 8608188, +2337536, 15865609, -32198832, 2532420, 13101798, 4751308, 1100585, 14225469, 466541, 7887708, +-18647674, -2285996, 4980552, 455267, -9368934, 3844533, 7400766, 3835406, 3469797, 10118943, +8166881, 13375602, 10271951, -3835406, -4291746, 10402411, -6323803, 7364259, -11588359, -6038724, +-14806900, -6495065, 8078297, 3067144, -3459059, 12353400, -14440217, -19204946, -31515396, 9994926, +10815801, 8745090, 6601902, -7194607, 4952634, -4079682, 11834782, 31970126, -4994510, -6467147, +-13861470, -4156992, 11838004, -7875897, 6762963, 11931956, 1860795, -34360, -9271761, -2442763, +4321811, -21767968, -20367272, 2268280, 2698850, -7580618, 11101417, 8746701, 16001974, 26216480, +10302016, -5814849, -3217468, 5709086, -196495, -14115410, 6763500, 6237903, 5068599, 1919850, +6627135, -54761, 3646427, 3294240, 2010582, -3047279, 216359, -125091, -500364, 5526549, +1526324, 120259, 2727304, -5494337, 1578937, 1220308, -768799, 5807333, 1064078, -1446867, +-1001801, -3277060, 9910637, 853625, 1663226, 4369593, -1512365, -1298691, 5562520, -5888937, +5532992, -4257387, 4580046, -127238, -433792, -890132, 1843615, -747861, 4737349, -3742527, +-1651415, 1648731, -912681, -1166621, -3035468, -4446365, 3326452, 47582332, 26924614, 17141752, +-4380330, -4859219, -579284, -4064113, -4883915, -7391639, -8882529, -15279346, 688805, -1087701, +3743601, 6651294, 12700755, 19182934, -2550674, -24974162, -9746355, 21420612, -3325915, 8022999, +-2761127, -367757, 14289893, 4936528, 10854456, 6369974, -433255, -651224, -187368, 7201050, +9222905, -3580929, -14049912, 18409840, 13211319, 9370008, 3463891, 4770635, -7464653, -13943074, +19210852, 10707890, 4954782, -8913131, -9897215, -13911399, -8551817, -2477659, -8687645, 4814659, +-17778480, 2456721, 13138305, -8544301, 4640176, 791348, 1932735, -20308216, 7203197, -8722005, +14821395, -32612760, 5602785, -8524973, -11006391, 2698313, -6639483, 6706592, 6363531, -21246666, +235149, 14852534, 2225330, 4355634, 9346386, 3813394, 15499463, 6322729, 3280818, 1039382, +-2245194, 9982578, -19716584, -373662, -1149978, -1808181, 777389, -564788, -149787, -1713692, +-2901251, -3789772, 6135898, 5140539, -2697776, -437013, -9443022, 930397, -590558, -9315784, +-44560, -13819057, -10504953, 4662724, 1758252, 7281580, -8215736, 3536906, 7153268, 1585917, +-309775, 1863479, 3833795, 331786, -2062121, 7586523, 52613, 2474975, -4450660, -3329674, +3150359, 4554276, 801548, -29248190, -15021111, 2158221, -25696790, 5891085, 18658412, -8981313, +22680648, 26597122, 3389266, 13286481, 16411070, 7353521, -15735686, 10268193, 12524125, -619549, +3169686, 8828842, 7815767, 18770618, 3208878, -7240241, 11992086, 4294968, -1858647, 270046, +8041253, -10976326, -4957466, -4646618, 6709813, 3473555, -15472083, 4568235, 12934294, 342524, +15587510, -14741402, -27836756, 2222646, 12497818, 18887118, 17526688, 9040906, 8319352, 6658273, +-18913426, -5539434, -787590, 14191646, 22445500, -7758859, 4837744, -8261907, 5311801, 3566970, +13664975, 21153788, -8152385, -9273371, -1839320, 11589432, 14892799, 20848844, 515933, -22537840, +-21251498, -3471944, 2753611, 64961, -9740986, 217970, -25624312, -16544214, -15140833, -17241610, +7351911, 2643016, 20651814, 16498580, 6226092, -9874667, -9850507, -9179419, -8329552, -14323716, +6760279, 4483409, 2654827, 9627706, 10713259, 57982, 9140764, 1874216, 9760850, -3397319, +8096550, -2589865, -729071, 2399276, -2969970, 13533442, 6102075, 8033737, 3638374, 9635222, +2162516, 4618164, 13829258, 11984032, 6424734, -775778, -5297842, -4549981, -9775346, -5496485, +-6415608, -3837553, -5916318, -7182259, -4146791, 4173635, 9218610, 2552284, -2155537, 332860, +-1360431, 5751498, 6811282, 5643050, -594853, 2536178, -10414759, 12358768, -27339078, 2462627, +-5461051, 14973330, -8023536, -1259499, 4639102, 11340324, -15260019, -25704842, -4459787, -10079215, +724239, -11605539, 6832219, 6731825, 678068, -13872207, 8660802, 856846, 23163832, -3708168, +12688407, -10711648, 23924042, 6888591, 14933064, 10016937, 16291885, 23941222, -5830955, 9286793, +-16748762, 17663590, 17183628, -402116, 5590437, 17298518, -11066520, -10701448, -1756105, 34830576, +5674189, -9742060, 17308718, 2262374, 13278428, 19071266, 5574868, -1291175, 1810329, 2975876, +12600897, -4403952, 13513041, -9316858, 13192529, -7292855, 29753922, -4320737, 25589416, -23192286, +-25449292, 35442608, -29653528, -15880105, 1216013, -9557913, -18399104, 16193100, -2139968, -22834730, +-10785200, -11728482, -33570000, -12458090, 4165582, 7550016, -25894358, -6619619, 15746961, -3140695, +9055402, 15512348, -11057930, -2529199, 2552284, 10127533, 7297150, 7641821, -2486249, -1462973, +6294812, -543850, -4143033, 3445638, 7256347, 1374390, 5053566, -146029, -4628901, -9664, +6698002, 2520609, -3365644, -8381629, -5032628, 9833864, -4480188, -13207024, 3185255, -7577396, +-14344117, 16643, 5463199, 515933, -3679713, -1058173, 4005594, -3005940, 246961, 5182952, +-223338, -2396592, -3032784, 9336185, 17965312, 989453, -6230387, -5216775, -2838974, -8434779, +-1731409, -3527242, 3536369, -22944790, -15306727, 4464619, -30002494, -17502528, -20847772, -21212306, +25851946, -638340, 891206, 7698729, -7537131, -32988570, -24677808, -24171540, -49287972, 3561065, +5596880, 21298206, 12449500, 7380365, 10628433, 7371238, 2305324, -15557982, -22859964, -13167296, +17767206, -2248416, -13371844, -5399848, 17403208, -21047488, -13581223, -21619792, -10748693, -1848983, +-20739860, 7713762, -17222282, 18632106, 13068512, -2895345, 12891881, -12681428, -26067768, 11387032, +15202574, -13458817, -29913910, 22533546, -1945083, 16319802, 13707925, -42788076, -30398704, 284005, +-6942278, 27853400, -15981036, -18475876, -4964446, 10270341, 1569274, -2581275, -9707163, 36984500, +-18153754, -30131880, -40740988, 29203630, -6984691, -33550674, 15621333, 15902116, 9427990, 33706368, +36063768, 37026376, 15841987, -8418136, -3412889, -5757941, 12287365, -23721642, 15229417, 2893197, +2967823, 11542188, 11164767, -9801652, 14301167, -11253351, 4764730, -15972447, -9111236, -6219113, +-8290361, -3318936, -8929774, -2241436, 6101001, 16711718, 19448148, 784905, 15249818, -9169755, +2183991, 8996346, 1180042, -16986596, 2043331, 4119948, -4737886, -12630425, -8107825, -7784628, +20161650, 12549358, 6491306, 9483288, 16997870, -2725157, -20375862, -12802761, -11742441, -14624364, +-18944028, 3291019, -15903190, -27742268, -599148, -4926865, -6595459, -5277441, 4193499, -27051852, +-10775536, 12608413, 20512226, 41771240, 6848326, 21850646, 10589779, 10550050, -9528922, -3053185, +-8123931, -22912576, -26921928, -37798396, -13760001, -34051576, -13387413, -17824652, -6658273, 18300856, +4498978, 12454868, 21521544, 33823, 14540075, 4233227, 741956, -490163, -2840584, -28724204, +10459319, -3581466, -32460826, -20092930, 9483288, -20823612, -7991861, 7591892, 23567560, 28603946, +9950902, -5936182, 3938485, 19152870, 10247255, 4046933, -563178, -56612500, -11417634, 12539694, +14375256, 5747740, -2163053, -19079856, 13244605, -17019344, -12834973, -3338800, 3481071, -9458055, +-30238718, 16179679, -3868155, 37638408, 14315126, 12871480, 14464376, 27673012, 62048320, 962610, +1063541, -2592013, -18471580, 11040213, -12814035, 45129368, -4009352, -16170015, -14554034, 19080392, +-24467892, -16513076, -3216394, 38604776, 1297617, 18426484, 28516436, 5771899, 23087596, 17511656, +-3183645, 16057809, 17401596, 591632, -11876658, -12794171, 3593814, 4419522, 14601815, 9385577, +-617402, -2172180, 2602750, 5948530, -10812043, -2249489, -2643016, -1410360, -16963510, 10707353, +-12307766, 4322348, -2484639, -7356205, 2068027, 20688858, 18098456, 50466, -1199907, -13140452, +-5357972, -13060459, -1933272, -15201500, -21674016, 6379637, 15054934, 1051193, 879395, -7479149, +-11350525, 31688806, -4294968, 5756867, -34678640, -11731703, 40614284, -27066348, -7399692, -23437100, +-69262256, -9828496, 21223044, 17540110, 3343095, 5050345, -3766686, 38821136, -41842108, -21475, +-12064563, -27939300, -23699092, -3506304, 7916162, 6986301, 9330280, 25072946, 16227997, -17723182, +-18075906, 49854908, 40691056, -3255585, 4741644, -5448166, 13247290, -177704, 29036126, 10599442, +15424301, 4369056, 2226941, -51511152, 21339546, -2196876, -29708826, -15094663, 2919504, -7977902, +-29566018, 28467580, -5041755, -21010444, -4421132, 3129958, 25189984, 28261958, 21449066, 8315057, +25123412, 26897770, -20198694, -22022444, -14120779, -3569118, 26035018, 34873524, 5956046, 12598213, +33385854, 20112258, -31328566, 23190676, 8410620, -6846715, 1227824, 64297808, -42545948, 32794222, +37486476, -37685116, -2213519, -24474334, -7918846, -54159536, 15598247, 24036248, -32646046, 19754702, +-28247464, -20349556, 24699820, -15326591, -2277943, -9192841, 1199907, -13516262, 4181688, 6315213, +-10285373, -14486388, -1138166, -15738908, 20696374, 3773129, -19433654, 4304631, -3264175, -10506564, +-10201084, 6736656, 13197361, 16611860, 6793565, -14847165, 38121056, -6997039, 3799436, -2417530, +-20171314, 7759396, 11009612, -10180146, 16265041, 4205310, 12153147, -2779381, -19509888, 6643778, +29405494, -19008988, -27253714, -44530220, 8914741, -8654896, -14027900, -18108656, 9941776, -11056320, +-5035313, 29023778, -9028021, -1806571, -22821308, 1699196, 14682346, -32249836, -20189030, -19366544, +-9386114, 11491185, -43206836, -24242406, -62382788, 10679436, -591095, -16042777, -6921877, -9405442, +13374528, 19857244, -22145926, 643708, -7716446, -7700877, -38979512, 8383776, 29956860, 7721278, +22663468, 28232968, 25484188, -34398928, -10453414, -10532870, -16012175, 28563144, -29403346, -17162152, +1028108, 41566692, 9433359, -14881525, 42089604, -23888072, -22246856, 49998252, 48077328, 4418985, +12237436, -13890998, -45577656, -14243722, 45886892, -22474490, 41586556, -15232638, -65504692, -17491792, +-30641908, 34699576, 303332, 7603703, 31286152, -5219996, 25792890, -33903936, -39712880, 30317100, +-7975218, -67115840, 41303088, -21519934, 11260867, 13340705, -23408646, 44161928, -30317638, 15880105, +-476741, 11600170, 44941464, -11637214, -14214194, 1539209, -9371082, -12409771, -10169409, 4922033, +10095858, 2317135, -6460168, 5513665, -21422760, 19134080, 13481902, 10713259, 4275103, -2147, +-10028749, -11017128, -10433549, 8959839, 17541720, -17318382, 15209553, 35362612, 11895449, -30495878, +2923799, 10985989, -11304891, -20182052, 18871550, -17113834, -403190, -1611687, -18178450, -23511188, +-257161, 13186623, -7773891, 30407294, -10256382, -20320028, 14097156, -9087614, 1040456, 11794517, +23278722, 1546188, -41477572, 24374476, 28457380, -34591128, 18947786, -383326, -12322261, -14918569, +-49515604, -22099754, 17547088, 2934537, 45647448, -36786932, -20591684, 8350490, -4945655, 28989956, +-40511204, -169114, 4241280, -34520800, 34375308, 18591302, 10534481, -16308528, 23552526, -28030568, +15424838, 11725798, 7279433, -2204392, -15487652, 6214818, 31242128, -16640851, -5939940, 5867999, +-24403468, 24685862, 1002338, 6289443, -33458332, 17816598, 4452808, 5888937, -78553880, 10522670, +-22319334, 36463200, 30423938, 32012002, 16513076, -64174328, -11205033, 13422847, 1376537, 3964792, +45018772, -6994354, -27090506, -32789928, 1316944, -36442260, -31723166, -28398860, 13529684, -53036940, +37473588, 71392024, -18808736, -8905078, -55977384, -12510166, 21430814, 12925704, -18629420, -4131759, +-67732704, -24094230, 67977520, 28648506, -21118892, 19597936, -38431368, -28678570, 7476465, 1220845, +4573604, -26318486, -9058086, -5742372, -49929, -38022808, 8094940, -5126581, -11862700, 4745939, +15560667, -20886426, -10358924, -3504693, 7392176, -16108275, -4271882, -2997350, -15016279, -46171, +-27772870, 35944580, 11634530, -9756018, -3717831, -10912975, -1559610, 22975390, 6892886, -4551592, +12074764, -7794829, -34581468, 1332514, 1504849, 7031935, 15229417, -9293772, -6581501, 14795625, +18089328, 7510824, -16724066, -37165424, -51835424, 14500346, -23047332, -14730664, 15010374, -11988864, +-18591840, 14840186, -24266566, -886374, -27581206, 39594228, 128849, -27958626, -8979166, 1224066, +-3421478, 9642738, -19608136, -12635794, 3730179, 8425652, 4032974, 4387309, 14265734, -16603807, +-7129646, -38916700, 14110578, 4238059, -12592307, 29050622, 15062987, -11161546, 43116640, 10191421, +-27957552, 21219286, 3063386, 13977971, 28302224, -2199560, -7569343, 4974646, 23247584, 13878650, +42413, -1974611, 24914032, -1815697, -29982092, -4673998, 4975183, 23726474, -10796474, 40537512, +43865036, -27735826, 22692996, 50219980, -13892072, 76042936, 42273216, -18558016, -17646410, -28126668, +-32674500, -17862232, 9672266, -5275294, -6134824, -634581, -5310190, -52510272, -20875152, -51841864, +11842299, 47150152, -17890150, -2483565, -25829934, 13028783, 2795487, 9368934, 12694850, 39613556, +-2297271, 18188650, 17893908, -29139742, 909996, 284542, 6093485, 13252658, -2011655, -6629819, +11928198, -1466195, -7117835, 1899986, -12539694, -2589329, 8675834, 2030983, -5558225, -27880244, +1142998, -12666932, -1362042, -10624138, 23304492, -7585449, 11223823, 14533096, -11527692, 17467096, +10718091, 497679, -6352794, -10463077, 2405182, -910533, -6420439, -776852, 11491722, -8750996, +4866198, -2972654, 8232916, -21994528, 66778688, 17631914, -23911156, 2666101, -31402116, -4121558, +11013370, -13045963, -16690243, -18615462, -7055021, 7150584, -4110821, -5988795, 8481487, 4882841, +11496554, -11882027, -7456600, 8546985, -3082713, 1514513, -17359720, 11759084, -20322174, 9735080, +6700686, -4395362, -919123, 726386, -11803107, 1959579, 2391760, -9422085, 16974248, -9161165, +4096325, 70867, 572841, 8563091, -8401493, -13056701, -3936875, 19605988, -14591615, 9589051, +-26737782, -15917686, 5043902, -5808944, -452045, -1799054, -16110959, 17024176, 13596256, 1205812, +-11806328, -621160, -7193534, 3471407, -8970039, -324807, -8612483, 6383932, -2405182, 1631014, +21572546, -18327700, -1598802, 3198140, 1283122, -4015258, 477278, -8724152, 458488, -7322383, +4410395, 8475044, -13129715, -10927471, 6230924, 754304, -3142842, -10420128, 4432406, 1321239, +-482110, -2423972, 52076, -2450279, 7174743, -4879083, -1378148, 3280281, -2465848, -469762, +5737540, -3953518, -2589865, -1571421, 1183800, 5884642, -2085744, -6815040, 355945, -4423817, +15503758, -6379100, 1860795, 3455301, -4005594, 12306692, -1837172, -10864120, 3802657, -6253473, +7594576, 3652870, -1764695, -770410, -2918430, -3049427, 7495792, -5120138, -2347200, -938450, +-6673306, 8371965, -32304596, -47041168, 32691680, 151848576, 66105988, 69747048, -741419, -140010560, +-101835824, -52546240, -110857400, 53950696, 65667904, 34561064, 142689008, 64560336, -6498823, 47680044, +-92813704, -117711632, -67628552, -82389824, -18107046, 64149096, 65147136, 27655832, 109642464, 54808076, +-7933342, 53119620, -48947596, -83262240, -48168060, -62583580, -98865312, 36531920, -1126355, -35172560, +105900472, 64144264, 35721780, 108895672, 26029112, -54998668, 53286584, -78509320, -89974200, -18178450, +-94619200, -95583960, 37650220, -15666430, 22939958, 120918360, 82505248, 86261200, 81024024, 10018548, +-45732276, -52470540, -88294864, -115444960, -60819960, -32796908, -24109798, 44282188, 68644848, 64775624, +91349656, 82804824, -12934294, -14492830, -15042049, -84778360, -25633976, -41703060, -63255740, 14209362, +25702158, 4279935, 58628452, 26322780, 374199, 36899136, -28492814, -31132070, 703301, -20214800, +-6543383, 15431281, -3323768, 17119740, 22646826, -12503724, 17783848, 7350837, -27704150, 2658048, +-13289166, -52288544, -887985, -13265543, -22468048, 50538880, 14995341, 18995566, 66194036, 26320634, +19333258, 14615237, -33026688, -48110612, -44724032, -74898864, -61368104, -27285390, 2449742, 33668784, +76915352, 81548008, 74795248, 66334160, 40880036, -16388521, -47108812, -93791888, -118867512, -91750168, +-55139864, -19489488, 49873696, 92463664, 106277888, 108948824, 52465708, -13139916, -36048196, -44297756, +-57130580, -41292352, -42426224, -34329136, -5100811, 10273025, 16789564, 28822452, 30978526, 28351616, +25851946, 14023605, 3661997, -4414153, -14708116, -22870700, -22622666, -19403588, -13933948, -8004746, +2718178, 8898098, 12319577, 12787191, 12302934, 7923141, 4788889, -47245, -448824, -2206003, +-3201898, -4710506, -2464774, -3774203, -4188130, -4038880, -2665027, -5740761, -2375117, 66035, +2941516, 6598144, 9072045, 6065031, 8182987, 5013301, 1560147, -2833605, -6347425, -10062572, +-8756901, -8764418, -4068408, -513785, 4300873, 5161477, 7738994, 6389838, 5264020, 1903207, +897111, -2472291, -2388539, -3947612, -3363496, -3054259, -768799, -1487669, 806380, -236760, +1251446, 922881, 920197, -337692, 2000381, 937914, 2284923, 625992, 963146, 33286, +119722, -2251100, -1434519, -2835215, -1533840, -1693828, 87510, -198105, 1779190, 962073, +2161442, 957241, 1504312, -88047, 602906, -891206, -107911, -1233729, -44023, -1045288, +266288, -641024, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 4847408, -2728378, -4322348, -1034013, -1574642, -177704, 6568079, 336618, -2756832, 3404299, 738734, -314069, 1185948, 685584, 95563, 4875325, 2806761, -3362423, -1244467, -419296, -1131187, -1340567, 2134062, 1371705, -1387274, -2160906, 853625, -4315906, -1908576, 3176128, 319438, -2550137, 1360968, -2124398, 1618666, -9127, -1805497, 4474819, -2981781, -1456531, 613107, -1515050, -2027225, -579821, -2927020, -5905043, 5526549, -1138166, -3023120, 286152, 5083631, --32212, 1989644, -2545842, -1429687, -1072131, 1588601, -2021319, 4073240, 600222, 3679176, --5324149, 2274185, -1411434, 921807, 2208150, -874026, -626528, -3868692, -10201, 2149631, -441845, -1050656, -221728, 1917703, -1032403, -1002875, 2924873, -1313723, 903017, -525597, --215285, -3608846, -1536525, -956704, 1292785, -235149, -1663763, -242666, -369367, -987843, -932008, -1189169, 42413, 311922, 585189, 1026497, -471910, -846645, 889595, 223338, --707596, 157840, 1542967, -177167, -192200, 668941, 15569, 247497, 217433, -448824, --896574, -456340, 637266, -126165, 36507, 366683, -499290, 474594, -30065, -246424, -1692754, 13801877, 4707284, -1073205, 3714073, 208843, 6782827, 4291746, -972273, 3514357, -6088653, 8005819, -4733054, -4596152, 1944547, -1843615, -1561221, 5730023, 4597763, 4415227, -3120831, 609349, -198642, -1976222, 2161442, 1540283, 7258495, 754304, -176094, -3200288, -1496796, 2149094, -432718, -973884, -1156420, 1991254, -307090, -1154809, -2683281, 2844342, --966905, -938450, 3999688, 5719286, -1488743, -680752, 3277597, 2967823, 5204427, 3253975, -1416802, 555661, 4428112, 2534568, -6150393, 24696, 1862405, -3514894, 72478, 595927, --4393215, 2245194, -2143189, 3297461, -726923, -548145, 1744831, 585726, -3037616, -251256, -1655173, -574452, -767189, -857383, 304943, 3508452, 595390, -3496640, -856846, 844498, --1069984, -428960, 5141613, -1027571, 605590, -587337, -1342714, 1185948, 1898376, -479963, -850404, 958851, -979789, 474594, 836445, 219580, -659814, -1794760, -587874, -1072668, --532039, -113280, 551366, -317828, 667867, 398358, -182536, 4761508, -364535, -9010305, --4183298, -1753957, -1941325, -4908074, -4494147, -2833605, 4886062, -5368709, -2496450, -2553895, -988379, 8131984, -1215476, -653372, 1997160, 4650913, -7116761, -1169305, 1460289, -3151969, -2521683, 3974992, -4385699, -278636, 572841, -2561411, -6458557, 1117765, -2716030, 869194, --2500208, 3693135, -4457103, -4174171, -10254234, -2772938, 3535295, -579821, -3930432, -1947231, --489089, -4134443, 214748, -702764, 2842195, 2234994, -1056025, 121333, -1043677, -4364224, -5327370, 919660, 3602941, -1327682, 19327, 928250, 1562831, 4114042, -1314260, -1002875, -1225139, -123480, 4505958, 2397129, -3883187, -1551557, -963683, -6166500, -685047, -589484, -3670587, -2368138, 3345780, 565862, -110059, -350577, -580894, -672699, 719407, -2493766, -1161789, -1441498, 1262184, 1061931, 490700, 299037, 3594351, 2623151, -651224, 3256122, --435939, -1109175, -1029182, 629750, -225486, 2225330, -569620, 1385664, 1141924, -208843, -958851, -11274, 1003949, 973884, 297427, 327491, 1086627, 707596, -1464047, -822486, --145492, 1803349, 2031520, -5906, -204011, 1085016, 19864, -686658, -19837380, -6172942, --1780801, -1571958, -1686848, 7673496, -7086159, 3421478, -1677722, 1578401, -2047089, -1614371, --5711770, 954020, -2102387, 450435, -8277476, 185220, -874026, -1458678, -164283, 1567126, -1219771, -765041, -594853, -3291556, 991064, -2640868, 1716376, 9664, 1461363, 5162551, --1378148, -5890548, -2553895, -6900402, 927176, 1255204, -656056, 1205812, -2443837, 2323577, -1160715, -3053722, 234613, -8300561, -1800665, -5550172, 3011309, 5499169, -4869419, -374199, -1546188, 847182, -7954280, 1326071, 4044786, -3801583, -1840930, -9040906, 3040300, -1305670, -3709241, 6700686, 3790309, -5383742, 1112933, 1273995, 267899, -5987185, 1518808, -2552821, -3959423, -1612223, -220117, 1870458, 1599339, 4711043, 5334350, 3665218, -297427, 1354525, -3168075, 1613297, -3183645, -652298, -2131378, -2119566, 941135, -92879, 493384, 50466, --650688, -178778, 1907502, -636192, -654983, 54224, -568546, -1420560, 1728724, 66572, -808528, 2120103, -284005, 235149, -1688996, 1075352, 721555, 170725, -1697586, 554051, -4832, 1122060, -12294344, 1388348, 2157147, -4355097, -580357, 12023761, 9273908, 5092221, --1376000, -2136209, 5927055, 3780108, 1873143, 2298881, -4847408, 1686312, 427349, 5676336, --5417565, -2418604, -1065689, 750009, -1140314, -6166500, -4248797, -4327717, -5203353, 2900177, -3421478, 2267743, 1494649, 154082, 1458678, -738198, -712965, 435939, -1920924, -494458, -2675765, 2164127, -4263829, -4663261, -484794, -4677220, 2779381, -1389422, -8028905, 1008780, -4009889, 5796059, 3929895, 269509, 3709778, -5648956, -1881733, -2496987, -451508, 448824, -2500745, -1914482, -5271536, 6400575, -5820755, -2712809, 3870839, 9233106, 2112050, 1866163, --9027484, 9750650, 1098438, 6811282, 10349261, -2247342, 1046898, 1265405, -4327717, 8676371, -1952600, -2775623, 2312303, -1154273, 4187056, -7041599, -3851512, -7196218, -1479079, -3162707, -2833605, -1786170, 1162862, -3345780, -945430, -610959, -2258079, -95026, -898185, 943282, --237297, -896574, -583042, -376883, 1633698, 515396, -1388885, -2898566, 1567126, 1690070, -215285, 49929, -135291, -1171989, 433792, -767189, 1700807, 387621, 917512, -974958, --1279363, -2290291, 1267015, 18491982, 13105019, -4699768, -6756521, 10250476, 6760279, 10792716, -15961709, -8057896, 5572183, 2628520, 4679904, 2050847, 2838437, 6559489, 1702955, 6700149, -288837, -4310537, 1873143, -1401233, 2335389, -812823, 12414603, 2072322, 2791192, 1661079, -559420, 4308926, 1907502, 242666, -721555, 3082713, -2314987, 5897527, -4532264, 7103339, --3286724, 4293894, 2324651, 2622615, 2160906, 10435160, 8056285, 496606, -2172180, -5664525, -6262599, -6903086, 1809255, -3019899, 3121904, 6534256, 865436, -10942503, -8800388, 916976, --5444408, -5991480, -3374771, -6907918, 2545842, 11975443, 6091874, -4409858, 360777, 1382443, --3053722, -3528853, -498753, 5881958, 6626061, -6937983, 3375308, 7677791, 1615982, 2527052, -3794067, 5983427, -941672, -4083440, 1680406, -1757715, -258235, -3917547, 3714073, 5657546, -957778, 1014686, 875636, -3964792, -481573, -65498, -347355, 403190, -529355, 654446, -582505, 1940788, 300648, -31675, 277562, 1248762, 2237141, 1118839, 2364380, 1241246, -515933, 670015, -381715, -3689377, -3729105, 783295, 2921115, 727997, -738198, 693100, --390842, 1786706, -1316944, -1303523, -2293513, 1053341, 8210904, 1506460, 11864310, -1090385, --95563, -3973382, -3121368, 3914326, 8987219, -2659659, 2414845, 590021, 9731859, 3958886, --4468377, -4216048, 676994, 1982664, 8846022, 8582955, 13183402, 2340220, 3698504, -2354179, -5398774, 6044630, -2324651, -3063386, 4762045, -3670050, -4994510, 4684736, 1466195, -5873905, --7109782, 10826002, 5488968, -408022, 6972343, 1314260, -4831302, 10281078, -2382096, 276489, --214748, 2641405, -3723737, 2641405, -3730179, 2570538, -3462818, 3125126, -2826089, 4265440, --3572876, -3699041, 9645960, -12071006, 710280, 1395328, -4101694, 772557, -13493714, -6680822, -6497749, -5426155, 4004520, -1470489, 2712272, 1144609, 2329483, 1393180, -6102075, 3268470, --3534221, -440234, -7761543, -4253092, -1920387, -1893007, 2250026, 7314330, 4280472, -5946919, -2312840, 1127429, 80531, -2873333, 431644, -567473, 1469416, 657130, -1476395, -2030983, --759136, -580357, -1115618, 4225711, 812286, -1647657, -890132, 996969, -1720671, 164283, -877247, 39728, 255551, -4502737, -1795296, -1133871, 700080, -1262720, -158914, 2826625, --227633, -767189, -811749, 290447, 898722, -9637907, -8232916, -68183, 3626563, 6692633, --7795366, 2220498, -7001334, 5782100, 4495220, -9711458, -1966558, 1006633, -11308649, -6488085, -6948720, -927713, -452582, 1603097, -676457, -11914776, 10903311, 667867, -7657927, -3777961, -1483374, -1028108, -7359964, -2247879, -4214437, 1198296, -333934, -2388002, 2408403, -10332081, --4543002, 2632815, 13507672, -2281702, -7881802, -5628018, -4373888, 9141838, -9734543, -1981591, --644245, -10467372, -12975633, 3173444, -8983998, -1460826, 1380832, 6832219, 3869229, 535797, -1520418, 8163659, -3503620, -2582886, 12174622, -8135205, 6357626, -2807835, -3000572, -1260036, --1432372, 12934294, 335007, 5015448, -13303124, -9700184, 357556, -1955821, 14936823, 460098, -10195179, 4258460, 12741020, 7689065, -1893007, -8866423, -3293166, 5925981, 2624225, 3995393, --4878009, -5554467, -1501628, -1883880, 2662343, -1386738, -3548180, -668941, -843424, -56371, --413927, 458488, -1435056, -1999844, 2449742, -199716, 176631, -703838, -1054951, -867583, -680752, 2041183, -2150705, 463320, -1313186, -1999307, 1414655, -614717, -1822140, -2177549, --403727, 1990717, 223875, 229781, 775778, 3616899, -3073049, -2595771, -1560684, 264677, -1481227, -16028818, 1590212, -1646046, 10969883, 1185948, -11524471, 13729937, 4494147, -8193187, --17735530, -7493644, 17609902, 785442, -2189360, -3029563, 1848983, 489089, 5455682, 2777233, -5841156, -1353989, 10402411, -5448703, -12185359, 420907, 600222, -3008088, -411780, 4479114, --3106335, -1970853, -1033477, 9667971, 7616588, 3822521, -690953, -13412646, -226560, -802622, --525597, -2320893, -186294, -5933498, -10824391, -1812476, 7493108, 7148973, -2705830, 7688529, --2491618, 3255048, 8601746, 8086887, -18089866, 6095096, 6559489, 2592013, -4393215, -16005732, -9658845, 5568425, 3101503, -5788542, -3148211, -6540162, 3579318, -7243463, -1303523, 2684, -6500970, -4148402, 3317862, 1668058, -11601244, -1727114, -7750806, 12602508, 5917928, -15084999, --3160559, 11724187, 5917391, -6289443, -3067144, -6934762, -2290828, 3411815, -2071785, -949725, --2593087, -3398393, -5685463, 973347, 449898, -1956895, -579821, 2785823, 1963874, -3722126, --1276679, 2508261, -704375, 1887101, -2375117, -1777580, -471373, 399969, 3039763, -3374234, --2314987, 1500554, -3693135, -424665, -2611340, 1437740, -2078764, 3392487, -1267015, -769873, --1838783, 2110440, 1493575, 3880503, 1133871, 9986336, 12135430, 12493523, 9516037, 12251931, --15390478, -10020696, -5324149, -4956929, -7379291, -5608154, -12352863, -4151086, 812286, 7386807, --24696, -7025493, -347355, 7383586, 343061, -6056441, -2873333, 16752520, 1609002, 6322192, -1914482, 6947110, 1395328, 2281702, -10294500, 5775658, 373125, 2414845, -10788421, 3768834, --16563005, 32212, -5246303, 4143033, -1525787, -12052752, -302795, -11995844, 2196339, -9960566, -9123047, -5141076, 14347875, 490163, -272730, 7277285, 1547799, -2231236, -2118493, 2972654, --4912369, 3435974, 8854075, 4578972, -6593849, -3401077, 18983218, 1504312, 15142444, -13986561, --2952253, -1433445, 11017665, -12194486, 1733019, 5927055, -12182138, 8571144, -7649337, 2290828, -11850352, 1343788, 6678674, 3223910, 15485505, 6768869, -6414534, -4987531, -6178848, 1006096, -599148, 6582038, -3862786, -663572, 4258460, 374199, 3287261, 4536023, 630286, -3510599, -4297652, 3365644, -405338, 1413044, 1451699, -1500017, -1271847, -4999342, 3409667, -2350421, --2265595, -912144, -2627983, 2576444, -1785096, -523986, -2815351, -607201, -623844, 3668439, -2570001, -28454, -559420, -121870, 2047089, 2545305, 2171643, 4690105, -511638, -1702418, --4510253, -15489800, 2456721, 14837501, 11341935, 12103755, -3919158, -3267396, 3210488, -2243047, -15291157, 4951561, 7366406, 12644921, -767189, 4667019, -8506183, 12599287, 6510634, -3300146, --7630547, -7347079, 8689793, -14841796, 5924908, 8396124, -5996311, -8322573, -4535486, 7830263, -3127273, -3073586, -5237713, 25770, -8925479, -13743358, 2650532, -13191992, -19387482, -2530810, -916439, 19738596, -8385924, -6820408, 8979166, 14529337, 14766098, 7718593, -732292, 3328063, --6143951, 1070521, -6447283, 16261283, 14548665, 9280351, -511638, -16732656, 47245, -14296336, -15868830, 12168179, 7734699, -11870753, 9904195, 5516349, 6899865, -2249489, -9885941, -7325067, --7881802, 2691334, -11136313, -20672752, 4183835, 13971529, 7531762, 13719199, -4066260, -3808562, -14005351, 4606353, 1991791, 9212168, 3168612, 252329, 8064875, 4989679, -626528, 3621194, -3559991, 2081985, -2523830, -4563940, -5916318, 1610613, 3992709, 2257005, 8129300, 209917, -5823976, -1799054, 2450816, 4536559, 728534, -2064806, -1133335, -6645388, -5611375, 2026688, -1554778, 2675765, 7071664, 1054951, 5401995, -1974074, -1054415, 947040, -4998268, -3983582, --1373853, -4273493, 2155537, -1386738, 1767916, 3933116, 5571110, 7875897, 12444131, 26910654, -11894375, 9415642, 8695698, -16604344, -2662343, -6053220, 21210696, -21572010, -20540144, 5902359, -13826037, -361851, 16920024, 15422691, -789737, 5950677, -10239202, -7323993, 16080894, -6339909, -11031623, 3945464, -7235946, -3729642, -3240016, -3537443, -7547332, 6286759, 6636798, 5615670, -464393, -8362302, -10834055, 13965623, -13780403, 10817949, 935766, -16893716, 8461622, 16136729, --389768, -4360466, -2107755, 1327145, 864899, 11014981, -642635, -8249559, -3512747, 9374840, --17116518, 4133906, -2924336, 13881871, 14562087, 9783399, 11383811, 15090904, 10766409, 3956739, --9865540, -11028402, 5271536, 7370701, -598074, 6387153, 8621073, 22991496, -13033615, 14554570, --8686034, -5490579, 15738908, 2426657, -9507984, -8210367, -8777839, -14155138, -4908074, -6910066, -11276974, 297427, -9134859, 4988068, 3084324, -1915019, 5258114, -10788421, 6996502, 483184, --1075352, -1139777, 5936719, 1059246, 1517197, 6285148, -2666638, 1046898, 4513474, -6897718, -4819490, 304943, 1757715, -3070365, 3831111, -1358283, 397284, 5367099, -39728, -1264331, -1303523, 3628174, 4485557, 7611756, 6124624, 2280628, -3572339, -2896956, -10849624, 2410014, --9045738, -2636573, -3972308, -3676492, 4199941, 1643899, -4349728, -17884244, -3197603, 10413685, --12848932, 411780, -8085813, -14127758, 20549272, 17574470, 14686641, 6967511, 3824669, 5784784, -15084999, 8338142, 15465103, -5726802, 12952548, -9760850, 15687905, 21079162, 13211319, 10537165, -5360119, 10883447, 10958609, -3257733, 21811454, 5238250, -13164075, 6241661, -13327820, -9163313, --2736431, -20721070, 349503, -4419522, -5624797, -10075456, -5245229, -2896419, -653372, -2046552, -892816, 863288, -11899744, -7858180, 2457795, -6284611, 4932770, 20401094, -10294500, -835908, --1945620, 748398, -9760850, 5250598, -4692252, 15789374, 3355980, 9427990, 14766098, 2514167, --986769, -9751186, -21696028, 2855080, 16140487, 11710765, -3060164, -14464913, 12175159, 1272921, -7332583, -18517214, -13290776, -12197707, -18356690, -11374684, -13430900, 6242198, 1982127, 4685273, -6123013, 8460012, -4146791, 8610873, 9804337, 295816, 5270462, -3161633, -6513318, -6717866, --7051263, -2836289, -5141076, -328028, 1549410, -693637, 464930, 1292785, -5965173, -5530308, --9444096, -3250753, -2190433, -5268315, 2077154, 769336, -2789581, -8556649, -3929358, -3167002, --2202781, 7113540, 2180233, -3126199, -3937948, -1449552, -10248866, 2784750, -2085207, 5284958, -609885, -3240016, -6039798, 6295885, -4139812, 9009768, -30701500, -19654844, -9352291, 21930640, -15969225, -11892764, 13681618, 12348031, 10527502, 10308995, -10309532, 1038308, 5938329, -10254771, --30947924, -5662378, -8601746, -18981072, 1693828, -6489159, -4876399, 5778342, 3424700, -4242354, -883153, 14472966, 15475841, -28539520, 6747394, 1423782, 13156559, 4461398, 682363, -17789218, -5381057, -4587025, -4975720, -12247636, -9129490, 22808424, -10421201, -449898, 2668785, -6080063, -25210384, 11955578, -11310796, -6848862, -19837380, -2898566, 18830748, 5501316, 5645735, -6253473, -11470784, -2769180, -5060545, 10580652, -6376953, 17574470, -4225174, 13079249, -26850524, -9117679, -15244986, 3716757, -2554969, 4259534, -29707752, -14057428, 4401268, -11871826, 4421669, 1147830, -3182571, 18107582, -6907918, 7273527, -1552631, -14816027, -2683281, 11119670, 16057272, -575526, --6910066, -12570832, 212064, -17528298, -5823439, 1453846, 20411832, 18281528, 2357937, 7645579, -2156074, -3133716, 10030359, 7631083, -4199405, 8381092, 6217502, 3318936, -7244536, -562104, --3840238, 6095096, 4132296, 5413270, -634581, -8449274, 7708393, 286152, -4088272, -8232379, --583042, -736587, -7896298, 5322538, -5797669, -8979166, 9846749, -4100620, -3608846, -4579509, -2030983, 1349694, 7841000, 1689533, -1591822, 3256122, 4763656, -9100499, 2259153, 2474975, --3701188, 5568425, -13370770, -38436736, -3257196, -4641249, -4161823, 5878737, -15334644, 30113626, --5499169, 1320703, 33229088, -39130372, -4067871, -7676717, -3728569, -44818520, 2499134, -6965900, --8659728, 15152645, -15379204, 2319282, 2937221, 7199976, -1408212, -16369194, 11169599, -10769094, -23280334, -4058744, -26388280, -1999844, -886911, -13375602, -26585848, 11883101, 13543106, -22324704, -18185966, -20197620, -15653545, -9700721, 1763621, 1549946, 3006477, 12786118, -2430952, -12331925, --28983514, 5836861, -39183524, -20908974, -13464186, -31493922, -18590766, -9140227, -1913945, -14833206, -22468584, 23010824, 5151277, -7052337, 25527138, 11411191, -2889439, -5846524, 18389440, 13449153, --6240051, 24193014, -20359756, -10549513, 26591754, 12395812, 37288908, -20441360, -22858352, 5832566, --17370996, 18662170, 2062658, 6436546, 35458176, -19607062, -20866024, -7788387, 7416335, 7998303, -8980240, 8986682, 10324565, -10970957, 4385162, 1602023, -699543, -1323924, -7224672, -5881958, -10413148, -11235634, -476205, 2209761, -5314485, 1346472, -5449777, -447750, -502511, 2278480, --8852464, 4525822, 11281268, 3266323, 2799245, 12308303, 9186935, -905164, -11800423, 10880763, -2885144, -4164508, -8764955, 11297375, 1812476, 317291, 7020124, 8749385, -11190537, 5836861, -3802657, -8138426, -3234110, -12627741, 8066486, -1536525, -14253923, -7118909, 3527779, 29916594, -16939888, -2763812, 40373228, -4658966, 16525960, -19099720, 23525146, 22255984, -2118493, -17865454, -1790465, 6454262, -10075993, 10555419, -14660334, -242666, -4578972, -4786204, -16650514, -12108587, --7636452, -1021129, -5469104, -13008382, 19192598, 13236552, 3467649, -5407364, 3175055, 18575734, -8634495, 13647795, 8476118, -10179072, -15855946, 31769336, -4285841, -17381196, -7368017, -7471096, --4280472, 22989886, 860604, -17735530, -6900939, -44074956, -10983305, -5173825, 27018028, 18740552, --53691388, -23076322, -13164075, -279710, 2552821, -21389474, 15606837, 8412230, 13563507, 26854284, --35273492, 34366716, 24542516, -11177116, -23737748, 1495186, -6030134, 9143449, 31148714, -16221555, --18292266, 25511032, -30205968, -33647312, -13702019, 3437048, -9794136, -36872296, -15070503, -11926050, -401043, 2015413, -10722386, -748935, 1414655, 438624, 2962454, -23309862, -8370892, -7725573, -1313723, 6507413, -1919850, -7457674, -4532264, 2472291, 11695733, 12703976, -1969779, -11044508, --3075734, 16164109, 752693, -4217121, 3161096, -21951040, -6675453, -10360535, 1232656, 3784403, --21505438, -21700860, 5184026, 18857590, -8332237, 12338367, 3580929, -6088653, -2005213, 5002027, -3552475, -1794760, 3526168, -632971, 28068148, 3775276, 10559177, -21904870, -34579320, 49984828, -25046638, 2274722, 3297998, -11239393, -29407104, 10333154, -2265595, 25245280, 5671505, 9377524, -27699854, 15315853, -279173, -2936684, 4713190, -16852914, -13835163, -17918604, -9968619, 16623134, --4502200, 1068910, 20812874, -3547643, 9160628, -28822452, -25859998, -17561048, 15039902, 6118181, --898722, 6885907, -9108015, -25912612, 32813014, -31081068, 14404247, 14813879, 11719355, 5223754, -19903952, -12765180, -31738734, 23548768, 66781908, -11733851, 32350768, -38788388, -20854214, 24015846, -14133664, -36010616, -10060961, -3018288, 31381178, -7759396, -3293703, -48974440, -31392990, -11236171, --35878548, 30100742, 32163936, 50610284, -44697724, 19278498, 5721970, -24899000, -1321239, -1167694, --51644296, 36929740, -15251966, 17441862, -5189394, 2883534, 70182448, -18914500, 24434606, 16068010, --16836808, 30540976, 92342, -5873905, 2002529, 7885560, 19870130, 12083354, 7992934, -687732, -18822694, -17503602, -8477192, 1480153, 4823785, 8674223, -4643934, 15089831, 2187749, 6706055, --2782602, 11432666, -803159, -16752520, 9793062, -20580410, -11992086, -4787278, 8987756, -2201708, -10700374, 24064702, 37354940, 26823682, 7563975, 17251274, -9786083, 8768176, -447750, -768799, --1395328, 3582003, -7514582, 10538776, -10030896, -44479220, -25451976, -774705, -6907918, -14810121, -5273146, 14535780, 1343251, -15662135, -943282, -15008226, 40893996, -12462384, 794569, 31255550, --1894081, -31774168, -22350472, -21674016, -9809168, -11474542, 34046744, 3684008, 5495948, 17182016, --9513889, -9403831, -5887327, -9590125, -20993800, -4762582, 39050916, 12783970, 9175661, -25910464, -9470403, 2175938, -18690088, -2031520, -9433359, 42661372, -33772940, -28905130, -10368051, 5435818, --10154913, 1426466, 11349988, -22011170, -6077916, 36153960, -29159606, 5225902, -7402376, -17522930, --30917322, -23404350, 1017370, -42753716, -51969640, 12426951, 10499584, 8444443, -46448996, 35894116, -43343736, -14642080, -12703440, 2824478, -1926293, -9686762, -24185498, 17548700, 65471944, 17133162, --16317118, 423054, 10303627, 21982716, 5816997, -38712688, -34720516, 37596532, -7285875, -15250892, --22715008, 7877507, 42765528, 13217225, -13653701, 7988639, -1761474, -7551090, -3844533, -2214056, -18876382, 10563472, -6537477, -10419591, 8499740, 5049808, -1676648, -4275640, 6862284, -10084583, -6229313, 16497506, -1583232, -9038222, -2799245, -5803038, -10011569, -18358838, 2628520, 14092325, --9449465, -11570105, 5689758, -14454712, 46708, -23540716, 11285027, 14723148, 37531036, -11932493, --5134634, -15531139, -15964393, 4523138, 8271570, 15637439, -1877438, -3370476, -15736760, 6341519, -3897683, 4731980, -4646618, -982474, 9900973, 11458973, -14221710, -37426344, 10340134, 14659797, --55488292, 30403536, 1290638, -15786152, 5302137, 20260434, -28684476, 17723720, -26636850, 7205345, --1557999, -13402445, -7469485, -3618510, -19615116, 14056354, 12276627, -558883, 6765111, 865436, -10858214, 14191646, 13704704, 20348482, 17464410, -10805064, 2710661, -22185654, 23516556, -18188650, -5749888, -3502009, 4785668, 1156420, -16820166, 15290084, -8531953, -16244640, 34068756, -27269284, -8178155, -7863012, -13565117, 13755170, -3561602, 4081830, 21223044, -25671020, 1026497, -31454192, --61982820, -1581622, 19732690, -7444252, 79639432, 16215649, -31143344, 8749385, -43444132, 15079093, -31051002, 36697276, -12637941, -7243999, -48299056, -55346024, -4677757, -34506840, 8151848, -2183454, --30138860, -7057705, -14936823, -32971390, 26984206, 53130892, -14940044, 3741990, 11436424, -14103599, -16412681, 20941724, -14585172, 2424509, 20938, -26468272, 13182865, 2221035, 8000451, 9668508, --18728742, 7306276, -9953587, -15015743, -17027934, 14433238, -10581189, 5925981, -16463147, -5941014, --1157494, -20051054, 19586662, -12716324, 3887482, 5974300, -18708878, -3058554, 14354854, -1719598, -2012192, 3188476, -5492727, 8827232, 18541910, -2240362, 10754598, 12703976, -15914464, -30154428, -10158671, 4199941, 17368310, 20832738, -27278948, -26776974, 4653597, -7870528, 4741644, 9076340, -4943508, -39546448, 8159364, -2888366, -23034984, 10358387, -14954539, -10118943, -18592376, 9470940, --20248624, 25924422, -2752537, 9588514, -5976447, 34825744, -9465034, 19117974, -311922, 22795538, --6367826, -11540040, 7449084, -13058311, -13779329, 1852205, 25956634, 16672526, -17676474, 18856518, --13260175, -20321638, 5719286, 27742804, -10687489, -11338714, 14843944, 6640557, -13841069, 1525787, -18882824, -7901129, -18187576, 9878425, 7563438, 11585137, 21260624, 4436701, -12855374, -4248797, -46719044, 49070000, -13590350, -40687836, 31162672, -13623636, 8775155, 4394826, 52605832, 7207492, --27340152, -10009958, -6644852, 1454920, 8119636, 12677133, 17078400, -20345260, 6501507, 4596689, -30485140, -7635915, 21470004, 23105850, 12776454, 11008001, 6637872, 18395882, -17683990, 19797652, -25190520, 18174154, 3047279, -35755604, -5367636, -23066658, 1042603, 15457587, 5173825, -7895224, --12584254, -7367480, -2032593, -927176, 6521371, -7420630, 1977833, -787053, -5639292, 10869488, -4206921, -9774272, -4642860, -2521683, 13258027, -22012, 2684892, -12816719, -9204652, -16997334, --8036958, -1051730, -1660005, 215822, -3009698, -15235323, 3875134, -5215164, -2545305, 2247342, --4301410, -227633, -13244069, -3153580, 500901, 194884, 227633, -3376381, -3379603, -1166084, --5284421, -7432978, 55439436, 23372138, -25103546, 6090801, -26223996, -14164265, -1843078, 9511205, --4227859, 20367808, -24256902, -715649, 9503152, -777926, 9884867, -1408212, 3437585, 2359011, --17396766, -5414343, 4512937, -16155519, -16352551, 1405528, 4151086, -11479911, 8196945, 7994008, --4897874, -8105677, -1343788, 1796907, -2893197, 6872485, 1714766, 5419712, -7189776, -3000035, -12649216, 40265, 613643, 6161131, -4137127, 6813429, -6514929, -11993159, -7846905, 12444668, --9904195, -7223598, 733903, -9751186, -10598906, 15133317, -15064061, 23905252, 5204427, -10557566, -10426033, 1687385, -17727478, 1575179, -3196530, -3075734, 8376797, -244276, -10412611, 20339354, --12210592, -4702989, 10492605, 3406446, -4450123, 548682, 3230889, -311922, -876710, -2075006, -4650913, 8464844, -345745, -14053670, 10059350, -7236483, -1108638, 12071006, -814433, -3662533, --513249, -10386305, 5016522, 3626563, -1178969, 253403, 4227322, -10113574, 718333, -3451006, -1001264, 4215511, 1054951, -4286914, 9917616, -15090904, 1957431, 1807644, -1097364, 1892470, --2248416, -8512088, 9386651, -4347581, 6698002, 133144, -1125281, 8888435, 3285650, -7402913, -2776160, -3722663, -3259880, 1722819, 5586679, 5735392, -2270427, -7308424, 3721052, -4150549, -5055714, -33692408, -40260488, 33934536, 138030048, 53842784, 63384592, 744103, -129016520, -95211368, --49600968, -75897440, 34105260, 65138012, 27015882, 115242024, 65383896, -4460324, 27218282, -58446452, --117563992, -47079284, -81627464, -13187697, 56721484, 47576428, 43279848, 71779104, 44463112, 12072616, -19850802, -5484137, -83632680, -37132140, -30062086, -115817552, 21548924, 15032922, -51282984, 83194056, -82553032, -2950643, 104424616, 51164336, -48380124, 32235340, -48099340, -100430296, -7873749, -60723860, --87679608, 15362024, 9467719, -5390184, 81905560, 78754128, 47201152, 70086888, 42762840, -27472222, --30714384, -54899884, -93744640, -69385736, -32965484, -31121870, 16892644, 52811456, 36272608, 58036284, -87954488, 34027416, -11503533, -11170136, -60749628, -49274548, 4553202, -56537876, -25542170, 30397094, -7582765, 38094212, 30831422, -15880642, 10304163, -3355443, -20959440, 4452808, -9340480, -9687836, -19468550, 6544457, 8259222, 25673704, -14840723, -5976447, 14081587, -19501300, -15810848, 7119982, --46176804, -7902740, 15870978, -37455872, 18251464, 23038204, 2499134, 58191440, 55586540, 12547210, -22572738, -16465831, -49649284, -25152940, -66085052, -75278432, -42556684, -18362596, 14221710, 71278200, -82874616, 86561304, 77101640, 43761960, -9618579, -48790292, -76794016, -107399952, -91669096, -50736448, --13107703, 42878268, 77457048, 77020040, 69096896, 44627396, -8495445, -14242112, -22263500, -33864208, --23936390, -21363168, -24946244, -13806172, -7085086, -6381248, 4862977, 14090714, 19130322, 24723442, -23032298, 17706540, 7861938, 628139, -9373766, -14001057, -18262200, -19474456, -19316616, -8223789, -614717, 6662568, 6604586, 9985262, 10718091, 11385421, 8237748, 2327336, -1110249, -702227, --4121558, -3486440, -3197603, -6143951, -7156490, -1592359, -2497524, -1760937, -1137630, -843424, -2638721, 7115150, 5375152, 5545340, 5408438, 3035468, 875636, -1122597, -5516349, -6068252, --6627672, -4920959, -2943663, -189515, 726923, 3082176, 4450123, 4684199, 2326799, 1520955, -382789, 314606, -493384, -860604, -1682017, -575526, -962610, -799938, -1381906, -1335735, --1725503, -949188, -1247151, 622233, 1688996, 3003793, 2822331, 2683818, 1402844, 962073, --914828, -1541356, -2136209, -2368138, -2803540, -1040993, -769336, 215822, 470836, 1174137, -947040, 1707786, 819265, 982474, 197032, 193810, -653909, -222801, -752693, -134755, --380641, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +2728378, -4322348, -1034013, -1574642, -177704, 6568079, 336618, -2756832, 3404299, 738734, +314069, 1185948, 685584, 95563, 4875325, 2806761, -3362423, -1244467, -419296, -1131187, +1340567, 2134062, 1371705, -1387274, -2160906, 853625, -4315906, -1908576, 3176128, 319438, +2550137, 1360968, -2124398, 1618666, -9127, -1805497, 4474819, -2981781, -1456531, 613107, +1515050, -2027225, -579821, -2927020, -5905043, 5526549, -1138166, -3023120, 286152, 5083631, +-32212, 1989644, -2545842, -1429687, -1072131, 1588601, -2021319, 4073240, 600222, 3679176, +-5324149, 2274185, -1411434, 921807, 2208150, -874026, -626528, -3868692, -10201, 2149631, +441845, -1050656, -221728, 1917703, -1032403, -1002875, 2924873, -1313723, 903017, -525597, +-215285, -3608846, -1536525, -956704, 1292785, -235149, -1663763, -242666, -369367, -987843, +932008, -1189169, 42413, 311922, 585189, 1026497, -471910, -846645, 889595, 223338, +-707596, 157840, 1542967, -177167, -192200, 668941, 15569, 247497, 217433, -448824, +-896574, -456340, 637266, -126165, 36507, 366683, -499290, 474594, -30065, -246424, +1692754, 13801877, 4707284, -1073205, 3714073, 208843, 6782827, 4291746, -972273, 3514357, +6088653, 8005819, -4733054, -4596152, 1944547, -1843615, -1561221, 5730023, 4597763, 4415227, +3120831, 609349, -198642, -1976222, 2161442, 1540283, 7258495, 754304, -176094, -3200288, +1496796, 2149094, -432718, -973884, -1156420, 1991254, -307090, -1154809, -2683281, 2844342, +-966905, -938450, 3999688, 5719286, -1488743, -680752, 3277597, 2967823, 5204427, 3253975, +1416802, 555661, 4428112, 2534568, -6150393, 24696, 1862405, -3514894, 72478, 595927, +-4393215, 2245194, -2143189, 3297461, -726923, -548145, 1744831, 585726, -3037616, -251256, +1655173, -574452, -767189, -857383, 304943, 3508452, 595390, -3496640, -856846, 844498, +-1069984, -428960, 5141613, -1027571, 605590, -587337, -1342714, 1185948, 1898376, -479963, +850404, 958851, -979789, 474594, 836445, 219580, -659814, -1794760, -587874, -1072668, +-532039, -113280, 551366, -317828, 667867, 398358, -182536, 4761508, -364535, -9010305, +-4183298, -1753957, -1941325, -4908074, -4494147, -2833605, 4886062, -5368709, -2496450, -2553895, +988379, 8131984, -1215476, -653372, 1997160, 4650913, -7116761, -1169305, 1460289, -3151969, +2521683, 3974992, -4385699, -278636, 572841, -2561411, -6458557, 1117765, -2716030, 869194, +-2500208, 3693135, -4457103, -4174171, -10254234, -2772938, 3535295, -579821, -3930432, -1947231, +-489089, -4134443, 214748, -702764, 2842195, 2234994, -1056025, 121333, -1043677, -4364224, +5327370, 919660, 3602941, -1327682, 19327, 928250, 1562831, 4114042, -1314260, -1002875, +1225139, -123480, 4505958, 2397129, -3883187, -1551557, -963683, -6166500, -685047, -589484, +3670587, -2368138, 3345780, 565862, -110059, -350577, -580894, -672699, 719407, -2493766, +1161789, -1441498, 1262184, 1061931, 490700, 299037, 3594351, 2623151, -651224, 3256122, +-435939, -1109175, -1029182, 629750, -225486, 2225330, -569620, 1385664, 1141924, -208843, +958851, -11274, 1003949, 973884, 297427, 327491, 1086627, 707596, -1464047, -822486, +-145492, 1803349, 2031520, -5906, -204011, 1085016, 19864, -686658, -19837380, -6172942, +-1780801, -1571958, -1686848, 7673496, -7086159, 3421478, -1677722, 1578401, -2047089, -1614371, +-5711770, 954020, -2102387, 450435, -8277476, 185220, -874026, -1458678, -164283, 1567126, +1219771, -765041, -594853, -3291556, 991064, -2640868, 1716376, 9664, 1461363, 5162551, +-1378148, -5890548, -2553895, -6900402, 927176, 1255204, -656056, 1205812, -2443837, 2323577, +1160715, -3053722, 234613, -8300561, -1800665, -5550172, 3011309, 5499169, -4869419, -374199, +1546188, 847182, -7954280, 1326071, 4044786, -3801583, -1840930, -9040906, 3040300, -1305670, +3709241, 6700686, 3790309, -5383742, 1112933, 1273995, 267899, -5987185, 1518808, -2552821, +3959423, -1612223, -220117, 1870458, 1599339, 4711043, 5334350, 3665218, -297427, 1354525, +3168075, 1613297, -3183645, -652298, -2131378, -2119566, 941135, -92879, 493384, 50466, +-650688, -178778, 1907502, -636192, -654983, 54224, -568546, -1420560, 1728724, 66572, +808528, 2120103, -284005, 235149, -1688996, 1075352, 721555, 170725, -1697586, 554051, +4832, 1122060, -12294344, 1388348, 2157147, -4355097, -580357, 12023761, 9273908, 5092221, +-1376000, -2136209, 5927055, 3780108, 1873143, 2298881, -4847408, 1686312, 427349, 5676336, +-5417565, -2418604, -1065689, 750009, -1140314, -6166500, -4248797, -4327717, -5203353, 2900177, +3421478, 2267743, 1494649, 154082, 1458678, -738198, -712965, 435939, -1920924, -494458, +2675765, 2164127, -4263829, -4663261, -484794, -4677220, 2779381, -1389422, -8028905, 1008780, +4009889, 5796059, 3929895, 269509, 3709778, -5648956, -1881733, -2496987, -451508, 448824, +2500745, -1914482, -5271536, 6400575, -5820755, -2712809, 3870839, 9233106, 2112050, 1866163, +-9027484, 9750650, 1098438, 6811282, 10349261, -2247342, 1046898, 1265405, -4327717, 8676371, +1952600, -2775623, 2312303, -1154273, 4187056, -7041599, -3851512, -7196218, -1479079, -3162707, +2833605, -1786170, 1162862, -3345780, -945430, -610959, -2258079, -95026, -898185, 943282, +-237297, -896574, -583042, -376883, 1633698, 515396, -1388885, -2898566, 1567126, 1690070, +215285, 49929, -135291, -1171989, 433792, -767189, 1700807, 387621, 917512, -974958, +-1279363, -2290291, 1267015, 18491982, 13105019, -4699768, -6756521, 10250476, 6760279, 10792716, +15961709, -8057896, 5572183, 2628520, 4679904, 2050847, 2838437, 6559489, 1702955, 6700149, +288837, -4310537, 1873143, -1401233, 2335389, -812823, 12414603, 2072322, 2791192, 1661079, +559420, 4308926, 1907502, 242666, -721555, 3082713, -2314987, 5897527, -4532264, 7103339, +-3286724, 4293894, 2324651, 2622615, 2160906, 10435160, 8056285, 496606, -2172180, -5664525, +6262599, -6903086, 1809255, -3019899, 3121904, 6534256, 865436, -10942503, -8800388, 916976, +-5444408, -5991480, -3374771, -6907918, 2545842, 11975443, 6091874, -4409858, 360777, 1382443, +-3053722, -3528853, -498753, 5881958, 6626061, -6937983, 3375308, 7677791, 1615982, 2527052, +3794067, 5983427, -941672, -4083440, 1680406, -1757715, -258235, -3917547, 3714073, 5657546, +957778, 1014686, 875636, -3964792, -481573, -65498, -347355, 403190, -529355, 654446, +582505, 1940788, 300648, -31675, 277562, 1248762, 2237141, 1118839, 2364380, 1241246, +515933, 670015, -381715, -3689377, -3729105, 783295, 2921115, 727997, -738198, 693100, +-390842, 1786706, -1316944, -1303523, -2293513, 1053341, 8210904, 1506460, 11864310, -1090385, +-95563, -3973382, -3121368, 3914326, 8987219, -2659659, 2414845, 590021, 9731859, 3958886, +-4468377, -4216048, 676994, 1982664, 8846022, 8582955, 13183402, 2340220, 3698504, -2354179, +5398774, 6044630, -2324651, -3063386, 4762045, -3670050, -4994510, 4684736, 1466195, -5873905, +-7109782, 10826002, 5488968, -408022, 6972343, 1314260, -4831302, 10281078, -2382096, 276489, +-214748, 2641405, -3723737, 2641405, -3730179, 2570538, -3462818, 3125126, -2826089, 4265440, +-3572876, -3699041, 9645960, -12071006, 710280, 1395328, -4101694, 772557, -13493714, -6680822, +6497749, -5426155, 4004520, -1470489, 2712272, 1144609, 2329483, 1393180, -6102075, 3268470, +-3534221, -440234, -7761543, -4253092, -1920387, -1893007, 2250026, 7314330, 4280472, -5946919, +2312840, 1127429, 80531, -2873333, 431644, -567473, 1469416, 657130, -1476395, -2030983, +-759136, -580357, -1115618, 4225711, 812286, -1647657, -890132, 996969, -1720671, 164283, +877247, 39728, 255551, -4502737, -1795296, -1133871, 700080, -1262720, -158914, 2826625, +-227633, -767189, -811749, 290447, 898722, -9637907, -8232916, -68183, 3626563, 6692633, +-7795366, 2220498, -7001334, 5782100, 4495220, -9711458, -1966558, 1006633, -11308649, -6488085, +6948720, -927713, -452582, 1603097, -676457, -11914776, 10903311, 667867, -7657927, -3777961, +1483374, -1028108, -7359964, -2247879, -4214437, 1198296, -333934, -2388002, 2408403, -10332081, +-4543002, 2632815, 13507672, -2281702, -7881802, -5628018, -4373888, 9141838, -9734543, -1981591, +-644245, -10467372, -12975633, 3173444, -8983998, -1460826, 1380832, 6832219, 3869229, 535797, +1520418, 8163659, -3503620, -2582886, 12174622, -8135205, 6357626, -2807835, -3000572, -1260036, +-1432372, 12934294, 335007, 5015448, -13303124, -9700184, 357556, -1955821, 14936823, 460098, +10195179, 4258460, 12741020, 7689065, -1893007, -8866423, -3293166, 5925981, 2624225, 3995393, +-4878009, -5554467, -1501628, -1883880, 2662343, -1386738, -3548180, -668941, -843424, -56371, +-413927, 458488, -1435056, -1999844, 2449742, -199716, 176631, -703838, -1054951, -867583, +680752, 2041183, -2150705, 463320, -1313186, -1999307, 1414655, -614717, -1822140, -2177549, +-403727, 1990717, 223875, 229781, 775778, 3616899, -3073049, -2595771, -1560684, 264677, +1481227, -16028818, 1590212, -1646046, 10969883, 1185948, -11524471, 13729937, 4494147, -8193187, +-17735530, -7493644, 17609902, 785442, -2189360, -3029563, 1848983, 489089, 5455682, 2777233, +5841156, -1353989, 10402411, -5448703, -12185359, 420907, 600222, -3008088, -411780, 4479114, +-3106335, -1970853, -1033477, 9667971, 7616588, 3822521, -690953, -13412646, -226560, -802622, +-525597, -2320893, -186294, -5933498, -10824391, -1812476, 7493108, 7148973, -2705830, 7688529, +-2491618, 3255048, 8601746, 8086887, -18089866, 6095096, 6559489, 2592013, -4393215, -16005732, +9658845, 5568425, 3101503, -5788542, -3148211, -6540162, 3579318, -7243463, -1303523, 2684, +6500970, -4148402, 3317862, 1668058, -11601244, -1727114, -7750806, 12602508, 5917928, -15084999, +-3160559, 11724187, 5917391, -6289443, -3067144, -6934762, -2290828, 3411815, -2071785, -949725, +-2593087, -3398393, -5685463, 973347, 449898, -1956895, -579821, 2785823, 1963874, -3722126, +-1276679, 2508261, -704375, 1887101, -2375117, -1777580, -471373, 399969, 3039763, -3374234, +-2314987, 1500554, -3693135, -424665, -2611340, 1437740, -2078764, 3392487, -1267015, -769873, +-1838783, 2110440, 1493575, 3880503, 1133871, 9986336, 12135430, 12493523, 9516037, 12251931, +-15390478, -10020696, -5324149, -4956929, -7379291, -5608154, -12352863, -4151086, 812286, 7386807, +-24696, -7025493, -347355, 7383586, 343061, -6056441, -2873333, 16752520, 1609002, 6322192, +1914482, 6947110, 1395328, 2281702, -10294500, 5775658, 373125, 2414845, -10788421, 3768834, +-16563005, 32212, -5246303, 4143033, -1525787, -12052752, -302795, -11995844, 2196339, -9960566, +9123047, -5141076, 14347875, 490163, -272730, 7277285, 1547799, -2231236, -2118493, 2972654, +-4912369, 3435974, 8854075, 4578972, -6593849, -3401077, 18983218, 1504312, 15142444, -13986561, +-2952253, -1433445, 11017665, -12194486, 1733019, 5927055, -12182138, 8571144, -7649337, 2290828, +11850352, 1343788, 6678674, 3223910, 15485505, 6768869, -6414534, -4987531, -6178848, 1006096, +599148, 6582038, -3862786, -663572, 4258460, 374199, 3287261, 4536023, 630286, -3510599, +4297652, 3365644, -405338, 1413044, 1451699, -1500017, -1271847, -4999342, 3409667, -2350421, +-2265595, -912144, -2627983, 2576444, -1785096, -523986, -2815351, -607201, -623844, 3668439, +2570001, -28454, -559420, -121870, 2047089, 2545305, 2171643, 4690105, -511638, -1702418, +-4510253, -15489800, 2456721, 14837501, 11341935, 12103755, -3919158, -3267396, 3210488, -2243047, +15291157, 4951561, 7366406, 12644921, -767189, 4667019, -8506183, 12599287, 6510634, -3300146, +-7630547, -7347079, 8689793, -14841796, 5924908, 8396124, -5996311, -8322573, -4535486, 7830263, +3127273, -3073586, -5237713, 25770, -8925479, -13743358, 2650532, -13191992, -19387482, -2530810, +916439, 19738596, -8385924, -6820408, 8979166, 14529337, 14766098, 7718593, -732292, 3328063, +-6143951, 1070521, -6447283, 16261283, 14548665, 9280351, -511638, -16732656, 47245, -14296336, +15868830, 12168179, 7734699, -11870753, 9904195, 5516349, 6899865, -2249489, -9885941, -7325067, +-7881802, 2691334, -11136313, -20672752, 4183835, 13971529, 7531762, 13719199, -4066260, -3808562, +14005351, 4606353, 1991791, 9212168, 3168612, 252329, 8064875, 4989679, -626528, 3621194, +3559991, 2081985, -2523830, -4563940, -5916318, 1610613, 3992709, 2257005, 8129300, 209917, +5823976, -1799054, 2450816, 4536559, 728534, -2064806, -1133335, -6645388, -5611375, 2026688, +1554778, 2675765, 7071664, 1054951, 5401995, -1974074, -1054415, 947040, -4998268, -3983582, +-1373853, -4273493, 2155537, -1386738, 1767916, 3933116, 5571110, 7875897, 12444131, 26910654, +11894375, 9415642, 8695698, -16604344, -2662343, -6053220, 21210696, -21572010, -20540144, 5902359, +13826037, -361851, 16920024, 15422691, -789737, 5950677, -10239202, -7323993, 16080894, -6339909, +11031623, 3945464, -7235946, -3729642, -3240016, -3537443, -7547332, 6286759, 6636798, 5615670, +464393, -8362302, -10834055, 13965623, -13780403, 10817949, 935766, -16893716, 8461622, 16136729, +-389768, -4360466, -2107755, 1327145, 864899, 11014981, -642635, -8249559, -3512747, 9374840, +-17116518, 4133906, -2924336, 13881871, 14562087, 9783399, 11383811, 15090904, 10766409, 3956739, +-9865540, -11028402, 5271536, 7370701, -598074, 6387153, 8621073, 22991496, -13033615, 14554570, +-8686034, -5490579, 15738908, 2426657, -9507984, -8210367, -8777839, -14155138, -4908074, -6910066, +11276974, 297427, -9134859, 4988068, 3084324, -1915019, 5258114, -10788421, 6996502, 483184, +-1075352, -1139777, 5936719, 1059246, 1517197, 6285148, -2666638, 1046898, 4513474, -6897718, +4819490, 304943, 1757715, -3070365, 3831111, -1358283, 397284, 5367099, -39728, -1264331, +1303523, 3628174, 4485557, 7611756, 6124624, 2280628, -3572339, -2896956, -10849624, 2410014, +-9045738, -2636573, -3972308, -3676492, 4199941, 1643899, -4349728, -17884244, -3197603, 10413685, +-12848932, 411780, -8085813, -14127758, 20549272, 17574470, 14686641, 6967511, 3824669, 5784784, +15084999, 8338142, 15465103, -5726802, 12952548, -9760850, 15687905, 21079162, 13211319, 10537165, +5360119, 10883447, 10958609, -3257733, 21811454, 5238250, -13164075, 6241661, -13327820, -9163313, +-2736431, -20721070, 349503, -4419522, -5624797, -10075456, -5245229, -2896419, -653372, -2046552, +892816, 863288, -11899744, -7858180, 2457795, -6284611, 4932770, 20401094, -10294500, -835908, +-1945620, 748398, -9760850, 5250598, -4692252, 15789374, 3355980, 9427990, 14766098, 2514167, +-986769, -9751186, -21696028, 2855080, 16140487, 11710765, -3060164, -14464913, 12175159, 1272921, +7332583, -18517214, -13290776, -12197707, -18356690, -11374684, -13430900, 6242198, 1982127, 4685273, +6123013, 8460012, -4146791, 8610873, 9804337, 295816, 5270462, -3161633, -6513318, -6717866, +-7051263, -2836289, -5141076, -328028, 1549410, -693637, 464930, 1292785, -5965173, -5530308, +-9444096, -3250753, -2190433, -5268315, 2077154, 769336, -2789581, -8556649, -3929358, -3167002, +-2202781, 7113540, 2180233, -3126199, -3937948, -1449552, -10248866, 2784750, -2085207, 5284958, +609885, -3240016, -6039798, 6295885, -4139812, 9009768, -30701500, -19654844, -9352291, 21930640, +15969225, -11892764, 13681618, 12348031, 10527502, 10308995, -10309532, 1038308, 5938329, -10254771, +-30947924, -5662378, -8601746, -18981072, 1693828, -6489159, -4876399, 5778342, 3424700, -4242354, +883153, 14472966, 15475841, -28539520, 6747394, 1423782, 13156559, 4461398, 682363, -17789218, +5381057, -4587025, -4975720, -12247636, -9129490, 22808424, -10421201, -449898, 2668785, -6080063, +25210384, 11955578, -11310796, -6848862, -19837380, -2898566, 18830748, 5501316, 5645735, -6253473, +11470784, -2769180, -5060545, 10580652, -6376953, 17574470, -4225174, 13079249, -26850524, -9117679, +15244986, 3716757, -2554969, 4259534, -29707752, -14057428, 4401268, -11871826, 4421669, 1147830, +3182571, 18107582, -6907918, 7273527, -1552631, -14816027, -2683281, 11119670, 16057272, -575526, +-6910066, -12570832, 212064, -17528298, -5823439, 1453846, 20411832, 18281528, 2357937, 7645579, +2156074, -3133716, 10030359, 7631083, -4199405, 8381092, 6217502, 3318936, -7244536, -562104, +-3840238, 6095096, 4132296, 5413270, -634581, -8449274, 7708393, 286152, -4088272, -8232379, +-583042, -736587, -7896298, 5322538, -5797669, -8979166, 9846749, -4100620, -3608846, -4579509, +2030983, 1349694, 7841000, 1689533, -1591822, 3256122, 4763656, -9100499, 2259153, 2474975, +-3701188, 5568425, -13370770, -38436736, -3257196, -4641249, -4161823, 5878737, -15334644, 30113626, +-5499169, 1320703, 33229088, -39130372, -4067871, -7676717, -3728569, -44818520, 2499134, -6965900, +-8659728, 15152645, -15379204, 2319282, 2937221, 7199976, -1408212, -16369194, 11169599, -10769094, +23280334, -4058744, -26388280, -1999844, -886911, -13375602, -26585848, 11883101, 13543106, -22324704, +18185966, -20197620, -15653545, -9700721, 1763621, 1549946, 3006477, 12786118, -2430952, -12331925, +-28983514, 5836861, -39183524, -20908974, -13464186, -31493922, -18590766, -9140227, -1913945, -14833206, +22468584, 23010824, 5151277, -7052337, 25527138, 11411191, -2889439, -5846524, 18389440, 13449153, +-6240051, 24193014, -20359756, -10549513, 26591754, 12395812, 37288908, -20441360, -22858352, 5832566, +-17370996, 18662170, 2062658, 6436546, 35458176, -19607062, -20866024, -7788387, 7416335, 7998303, +8980240, 8986682, 10324565, -10970957, 4385162, 1602023, -699543, -1323924, -7224672, -5881958, +10413148, -11235634, -476205, 2209761, -5314485, 1346472, -5449777, -447750, -502511, 2278480, +-8852464, 4525822, 11281268, 3266323, 2799245, 12308303, 9186935, -905164, -11800423, 10880763, +2885144, -4164508, -8764955, 11297375, 1812476, 317291, 7020124, 8749385, -11190537, 5836861, +3802657, -8138426, -3234110, -12627741, 8066486, -1536525, -14253923, -7118909, 3527779, 29916594, +16939888, -2763812, 40373228, -4658966, 16525960, -19099720, 23525146, 22255984, -2118493, -17865454, +1790465, 6454262, -10075993, 10555419, -14660334, -242666, -4578972, -4786204, -16650514, -12108587, +-7636452, -1021129, -5469104, -13008382, 19192598, 13236552, 3467649, -5407364, 3175055, 18575734, +8634495, 13647795, 8476118, -10179072, -15855946, 31769336, -4285841, -17381196, -7368017, -7471096, +-4280472, 22989886, 860604, -17735530, -6900939, -44074956, -10983305, -5173825, 27018028, 18740552, +-53691388, -23076322, -13164075, -279710, 2552821, -21389474, 15606837, 8412230, 13563507, 26854284, +-35273492, 34366716, 24542516, -11177116, -23737748, 1495186, -6030134, 9143449, 31148714, -16221555, +-18292266, 25511032, -30205968, -33647312, -13702019, 3437048, -9794136, -36872296, -15070503, -11926050, +401043, 2015413, -10722386, -748935, 1414655, 438624, 2962454, -23309862, -8370892, -7725573, +1313723, 6507413, -1919850, -7457674, -4532264, 2472291, 11695733, 12703976, -1969779, -11044508, +-3075734, 16164109, 752693, -4217121, 3161096, -21951040, -6675453, -10360535, 1232656, 3784403, +-21505438, -21700860, 5184026, 18857590, -8332237, 12338367, 3580929, -6088653, -2005213, 5002027, +3552475, -1794760, 3526168, -632971, 28068148, 3775276, 10559177, -21904870, -34579320, 49984828, +25046638, 2274722, 3297998, -11239393, -29407104, 10333154, -2265595, 25245280, 5671505, 9377524, +27699854, 15315853, -279173, -2936684, 4713190, -16852914, -13835163, -17918604, -9968619, 16623134, +-4502200, 1068910, 20812874, -3547643, 9160628, -28822452, -25859998, -17561048, 15039902, 6118181, +-898722, 6885907, -9108015, -25912612, 32813014, -31081068, 14404247, 14813879, 11719355, 5223754, +19903952, -12765180, -31738734, 23548768, 66781908, -11733851, 32350768, -38788388, -20854214, 24015846, +14133664, -36010616, -10060961, -3018288, 31381178, -7759396, -3293703, -48974440, -31392990, -11236171, +-35878548, 30100742, 32163936, 50610284, -44697724, 19278498, 5721970, -24899000, -1321239, -1167694, +-51644296, 36929740, -15251966, 17441862, -5189394, 2883534, 70182448, -18914500, 24434606, 16068010, +-16836808, 30540976, 92342, -5873905, 2002529, 7885560, 19870130, 12083354, 7992934, -687732, +18822694, -17503602, -8477192, 1480153, 4823785, 8674223, -4643934, 15089831, 2187749, 6706055, +-2782602, 11432666, -803159, -16752520, 9793062, -20580410, -11992086, -4787278, 8987756, -2201708, +10700374, 24064702, 37354940, 26823682, 7563975, 17251274, -9786083, 8768176, -447750, -768799, +-1395328, 3582003, -7514582, 10538776, -10030896, -44479220, -25451976, -774705, -6907918, -14810121, +5273146, 14535780, 1343251, -15662135, -943282, -15008226, 40893996, -12462384, 794569, 31255550, +-1894081, -31774168, -22350472, -21674016, -9809168, -11474542, 34046744, 3684008, 5495948, 17182016, +-9513889, -9403831, -5887327, -9590125, -20993800, -4762582, 39050916, 12783970, 9175661, -25910464, +9470403, 2175938, -18690088, -2031520, -9433359, 42661372, -33772940, -28905130, -10368051, 5435818, +-10154913, 1426466, 11349988, -22011170, -6077916, 36153960, -29159606, 5225902, -7402376, -17522930, +-30917322, -23404350, 1017370, -42753716, -51969640, 12426951, 10499584, 8444443, -46448996, 35894116, +43343736, -14642080, -12703440, 2824478, -1926293, -9686762, -24185498, 17548700, 65471944, 17133162, +-16317118, 423054, 10303627, 21982716, 5816997, -38712688, -34720516, 37596532, -7285875, -15250892, +-22715008, 7877507, 42765528, 13217225, -13653701, 7988639, -1761474, -7551090, -3844533, -2214056, +18876382, 10563472, -6537477, -10419591, 8499740, 5049808, -1676648, -4275640, 6862284, -10084583, +6229313, 16497506, -1583232, -9038222, -2799245, -5803038, -10011569, -18358838, 2628520, 14092325, +-9449465, -11570105, 5689758, -14454712, 46708, -23540716, 11285027, 14723148, 37531036, -11932493, +-5134634, -15531139, -15964393, 4523138, 8271570, 15637439, -1877438, -3370476, -15736760, 6341519, +3897683, 4731980, -4646618, -982474, 9900973, 11458973, -14221710, -37426344, 10340134, 14659797, +-55488292, 30403536, 1290638, -15786152, 5302137, 20260434, -28684476, 17723720, -26636850, 7205345, +-1557999, -13402445, -7469485, -3618510, -19615116, 14056354, 12276627, -558883, 6765111, 865436, +10858214, 14191646, 13704704, 20348482, 17464410, -10805064, 2710661, -22185654, 23516556, -18188650, +5749888, -3502009, 4785668, 1156420, -16820166, 15290084, -8531953, -16244640, 34068756, -27269284, +8178155, -7863012, -13565117, 13755170, -3561602, 4081830, 21223044, -25671020, 1026497, -31454192, +-61982820, -1581622, 19732690, -7444252, 79639432, 16215649, -31143344, 8749385, -43444132, 15079093, +31051002, 36697276, -12637941, -7243999, -48299056, -55346024, -4677757, -34506840, 8151848, -2183454, +-30138860, -7057705, -14936823, -32971390, 26984206, 53130892, -14940044, 3741990, 11436424, -14103599, +16412681, 20941724, -14585172, 2424509, 20938, -26468272, 13182865, 2221035, 8000451, 9668508, +-18728742, 7306276, -9953587, -15015743, -17027934, 14433238, -10581189, 5925981, -16463147, -5941014, +-1157494, -20051054, 19586662, -12716324, 3887482, 5974300, -18708878, -3058554, 14354854, -1719598, +2012192, 3188476, -5492727, 8827232, 18541910, -2240362, 10754598, 12703976, -15914464, -30154428, +10158671, 4199941, 17368310, 20832738, -27278948, -26776974, 4653597, -7870528, 4741644, 9076340, +4943508, -39546448, 8159364, -2888366, -23034984, 10358387, -14954539, -10118943, -18592376, 9470940, +-20248624, 25924422, -2752537, 9588514, -5976447, 34825744, -9465034, 19117974, -311922, 22795538, +-6367826, -11540040, 7449084, -13058311, -13779329, 1852205, 25956634, 16672526, -17676474, 18856518, +-13260175, -20321638, 5719286, 27742804, -10687489, -11338714, 14843944, 6640557, -13841069, 1525787, +18882824, -7901129, -18187576, 9878425, 7563438, 11585137, 21260624, 4436701, -12855374, -4248797, +46719044, 49070000, -13590350, -40687836, 31162672, -13623636, 8775155, 4394826, 52605832, 7207492, +-27340152, -10009958, -6644852, 1454920, 8119636, 12677133, 17078400, -20345260, 6501507, 4596689, +30485140, -7635915, 21470004, 23105850, 12776454, 11008001, 6637872, 18395882, -17683990, 19797652, +25190520, 18174154, 3047279, -35755604, -5367636, -23066658, 1042603, 15457587, 5173825, -7895224, +-12584254, -7367480, -2032593, -927176, 6521371, -7420630, 1977833, -787053, -5639292, 10869488, +4206921, -9774272, -4642860, -2521683, 13258027, -22012, 2684892, -12816719, -9204652, -16997334, +-8036958, -1051730, -1660005, 215822, -3009698, -15235323, 3875134, -5215164, -2545305, 2247342, +-4301410, -227633, -13244069, -3153580, 500901, 194884, 227633, -3376381, -3379603, -1166084, +-5284421, -7432978, 55439436, 23372138, -25103546, 6090801, -26223996, -14164265, -1843078, 9511205, +-4227859, 20367808, -24256902, -715649, 9503152, -777926, 9884867, -1408212, 3437585, 2359011, +-17396766, -5414343, 4512937, -16155519, -16352551, 1405528, 4151086, -11479911, 8196945, 7994008, +-4897874, -8105677, -1343788, 1796907, -2893197, 6872485, 1714766, 5419712, -7189776, -3000035, +12649216, 40265, 613643, 6161131, -4137127, 6813429, -6514929, -11993159, -7846905, 12444668, +-9904195, -7223598, 733903, -9751186, -10598906, 15133317, -15064061, 23905252, 5204427, -10557566, +10426033, 1687385, -17727478, 1575179, -3196530, -3075734, 8376797, -244276, -10412611, 20339354, +-12210592, -4702989, 10492605, 3406446, -4450123, 548682, 3230889, -311922, -876710, -2075006, +4650913, 8464844, -345745, -14053670, 10059350, -7236483, -1108638, 12071006, -814433, -3662533, +-513249, -10386305, 5016522, 3626563, -1178969, 253403, 4227322, -10113574, 718333, -3451006, +1001264, 4215511, 1054951, -4286914, 9917616, -15090904, 1957431, 1807644, -1097364, 1892470, +-2248416, -8512088, 9386651, -4347581, 6698002, 133144, -1125281, 8888435, 3285650, -7402913, +2776160, -3722663, -3259880, 1722819, 5586679, 5735392, -2270427, -7308424, 3721052, -4150549, +5055714, -33692408, -40260488, 33934536, 138030048, 53842784, 63384592, 744103, -129016520, -95211368, +-49600968, -75897440, 34105260, 65138012, 27015882, 115242024, 65383896, -4460324, 27218282, -58446452, +-117563992, -47079284, -81627464, -13187697, 56721484, 47576428, 43279848, 71779104, 44463112, 12072616, +19850802, -5484137, -83632680, -37132140, -30062086, -115817552, 21548924, 15032922, -51282984, 83194056, +82553032, -2950643, 104424616, 51164336, -48380124, 32235340, -48099340, -100430296, -7873749, -60723860, +-87679608, 15362024, 9467719, -5390184, 81905560, 78754128, 47201152, 70086888, 42762840, -27472222, +-30714384, -54899884, -93744640, -69385736, -32965484, -31121870, 16892644, 52811456, 36272608, 58036284, +87954488, 34027416, -11503533, -11170136, -60749628, -49274548, 4553202, -56537876, -25542170, 30397094, +7582765, 38094212, 30831422, -15880642, 10304163, -3355443, -20959440, 4452808, -9340480, -9687836, +19468550, 6544457, 8259222, 25673704, -14840723, -5976447, 14081587, -19501300, -15810848, 7119982, +-46176804, -7902740, 15870978, -37455872, 18251464, 23038204, 2499134, 58191440, 55586540, 12547210, +22572738, -16465831, -49649284, -25152940, -66085052, -75278432, -42556684, -18362596, 14221710, 71278200, +82874616, 86561304, 77101640, 43761960, -9618579, -48790292, -76794016, -107399952, -91669096, -50736448, +-13107703, 42878268, 77457048, 77020040, 69096896, 44627396, -8495445, -14242112, -22263500, -33864208, +-23936390, -21363168, -24946244, -13806172, -7085086, -6381248, 4862977, 14090714, 19130322, 24723442, +23032298, 17706540, 7861938, 628139, -9373766, -14001057, -18262200, -19474456, -19316616, -8223789, +614717, 6662568, 6604586, 9985262, 10718091, 11385421, 8237748, 2327336, -1110249, -702227, +-4121558, -3486440, -3197603, -6143951, -7156490, -1592359, -2497524, -1760937, -1137630, -843424, +2638721, 7115150, 5375152, 5545340, 5408438, 3035468, 875636, -1122597, -5516349, -6068252, +-6627672, -4920959, -2943663, -189515, 726923, 3082176, 4450123, 4684199, 2326799, 1520955, +382789, 314606, -493384, -860604, -1682017, -575526, -962610, -799938, -1381906, -1335735, +-1725503, -949188, -1247151, 622233, 1688996, 3003793, 2822331, 2683818, 1402844, 962073, +-914828, -1541356, -2136209, -2368138, -2803540, -1040993, -769336, 215822, 470836, 1174137, +947040, 1707786, 819265, 982474, 197032, 193810, -653909, -222801, -752693, -134755, +-380641, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 547608, -3428458, -4665408, -3816615, -642635, 3676492, 5444408, -2568927, 3183645, -1767379, -4513474, --1250909, -2518462, 1476932, -612033, -2196876, 2015950, 3032784, 693100, 3668439, -6729677, --7293928, -4668630, 667867, -6979, -1255204, 362925, 2213519, -717260, 2992519, 2491618, --3192235, 1222455, -248034, 3899830, 3576097, 1364189, -3820374, 2509335, -2279554, 1281511, -2490007, -6076305, 6642167, 9780714, 1269163, 4438312, -3607236, -715649, -3386582, -1743757, -3016678, -1000191, -3502009, -914828, -2208687, 1694902, -2153926, -1938104, 186294, 1797444, --1787780, -1996086, -879931, 3482682, 3115999, -2629594, -981400, -3109556, 708670, 4134980, -1136556, -1498407, -1979980, 1562831, -563714, -2797634, -1035624, -1884954, -282931, -1005022, -1620276, 1538672, 810138, -890669, -1255741, 2792266, -387084, 769336, 1431835, -401579, --49392, -563178, 837519, 125628, 202400, -799938, 104153, -244276, -819265, 53687, --136365, 614180, 1452236, -799401, 329102, -143345, 700617, 887448, -223875, -344671, --195958, -29528, -794032, -312459, 337155, -283468, 134755, -1074, 637803, 157840, -72478, 15035070, 6910603, -514859, 3140158, 2863670, -3610994, -1760937, 4161823, 1902134, -4530117, -3291019, 6590091, 2484639, -6516539, 5173288, 268435, -110595, -3442953, 3787088, --7044820, -6032282, -1301375, -2140504, -1176821, -2150168, 806917, -1302449, -2934537, -2108292, -2439542, -2665027, 1700807, 1087701, 675921, -2942590, 4130148, -8657043, -1534914, -40265, --1530082, -1081795, 734439, 1624571, -2792266, 2217277, -3380676, 3229816, 1006633, 711891, -3309809, -2338610, -579284, 1353452, 5186173, 1293859, 2166811, -1192927, -4529580, -6298570, -1143535, 3428458, 4452271, -1826435, -7065758, 1053878, -2899103, -1961190, -1648194, 1959579, -189515, 6897718, -222265, 2325188, 1334661, -1038845, -1811939, -1917703, -7218767, -2110977, --1195075, -974958, -1395864, 1344325, 3590593, 1012002, 3405372, -33823, -340913, -1089848, -923955, 1251983, -361314, -1391033, 1196685, -714038, 460635, -605054, 614180, -1029718, --655519, 981937, 300648, 556198, -390305, 344134, -676994, 8123931, 1855963, -6810208, --7783018, 2151242, -2389076, -6400038, 7269232, -3557307, -1216550, -972273, 5695127, 1226750, --3338263, 4035659, -3134789, 6087580, -8407935, -5510980, 6653978, -6947647, -7059853, -2804614, -5682779, 2520072, 2706903, -652298, 5088463, 3114388, -559420, -6738804, 1797444, -1863479, -2400350, 2157147, 1809255, 5875516, 1539746, -5764920, 498753, 4031901, 5873368, 2000918, --3268470, -755914, -4805532, 2048163, -8498130, -323196, 9105868, 497142, 944893, -4682051, --5839545, 896574, 1231045, 6728603, -1500017, 583579, 671089, -989990, 653909, 2238752, -362925, 4733054, -1320703, 3144453, 427886, 851477, 530965, 5550709, 193810, -772020, -987306, -1182190, -3790846, -1997160, -3907347, -88047, 6946573, 1466195, -2326262, -784368, --4027606, 2268280, -3162707, -2192581, 717796, 116501, 193274, -1800665, -2589865, -527207, -589484, -857383, 1420024, -163746, -45634, 1430224, 852014, 1440425, 1147830, -17180, -429497, -1171452, 20938, -1039919, -1160178, 781147, 891743, 1650878, 1154273, -803696, --251792, 871878, -689342, -1266479, 667331, 177704, 9664, 161061, -18677202, -12108587, --2736968, 2077154, 2938831, 365609, -83215, -7059853, -498216, -1500017, -1248762, 204011, --1868848, -772557, -5318244, 2775086, -11124502, -4000225, 932545, -2177549, -3441880, -1894081, --6356015, -3150359, -2676302, -2946885, 1332514, -4833986, -2741800, 6080600, 3876745, 448824, -2840047, 2171643, -2039573, -4007741, 2340757, 9058086, 961536, 1170379, -3616899, -3138547, -2589865, -7684770, -4173098, 8600135, -7889318, 2404108, -1928977, -3907347, 1745904, 616328, --2240899, 547071, 1249836, -2669859, -39192, -496606, 5216238, 4725001, 626528, 1302449, -2224256, -114890, -1096827, -1782411, -10932302, 5301601, 3213173, -2918967, -187368, -4507032, --1307281, 687195, -3395709, 1549410, -4105452, -2203855, -4768488, -6926172, 4510253, -1284732, -132607, -5847598, -1544041, 802622, 902480, -1510755, -346282, -283468, -1700270, -3006477, -411243, -1523640, 1235877, -201327, -845572, -586263, -396748, 1531693, 180926, -2216740, -348966, -639413, -266825, 765041, 258235, -548682, 452582, -1733019, 869731, -1572495, --583042, -2055142, -16143708, 2534568, 3719442, -957778, -1463510, -8850854, -3696893, 2500208, --8004746, -7565048, 1508070, -7192997, -3781719, -126702, -4424890, 2529736, -3496640, 5499706, --2915746, -1825361, 1673964, 3864934, 6995965, 4459787, -7885560, -365072, -622233, 3928821, -5761162, 9916543, -4417911, -3812320, 5071283, -5322002, 1214402, 1607928, 8293045, 3114925, -4614943, -6133750, -2770791, -8397198, 6663642, 7072201, 8027831, -63888, -1759863, -5334887, --1158031, 5480379, -2536715, -3413425, -3227131, -4174171, 894427, 1061394, 1251446, -5735392, --96100, -5617817, -324270, -785442, 2299955, 2066416, -1758252, -2513630, -7215008, -355945, --588411, 4503810, -2791729, 7441568, -4213363, 985158, 3412889, 6767795, -5188858, 1617055, -3508988, -5956583, 3015067, 66572, 7416872, 2541547, 1661616, 4627828, -459562, 1316944, -3511136, 1487132, 43487, -1227824, 64961, 1547799, -470299, 1947768, 2882997, 2420751, --1075889, 1374390, 195958, -709207, 1164473, 1583769, 15569, 763967, 1857037, 1423245, -1502702, 782758, -701153, -1124208, 1440425, -1211718, 1436130, -668941, 130460, 1844152, -1376537, -348966, 1018981, 20033874, 16944182, -488553, 383326, 9005473, 1087164, 4474282, --2786897, 4999879, -3879429, 9090298, 2945274, 139586, 1706713, 751619, 11224897, 7788923, --7562901, -6069863, 2289755, 1325534, -2507187, -1489817, 1316408, 5567352, 3918084, 2609730, -461172, 2998424, -2017024, -24159, 6130529, -6743636, 2636036, 8475044, 6141803, 11476689, --1238561, -1601486, -1110786, 841277, -3744675, 12461311, 11187316, 8204998, -3881577, -1000727, -4688494, 4042638, -3572339, 894964, 6352257, -2295123, -3149822, 4241817, -12111808, -1270237, -543850, 1887638, -4178466, -7716983, 3082176, 5485747, -6496675, -2252174, -7054484, 2707440, -368830, -1337346, -1609539, -5929203, 10019622, -2547989, 1245541, -10191421, -2566243, -4804458, -11937862, -2009508, -1773285, 5486821, 2364916, 83215, -3964792, 3684545, -2648384, -3477850, -5472862, 5320928, -194884, 3365644, 1611, -1371168, 2849711, -349503, 1041530, -850404, --1424855, -221728, 2192044, -1603097, -1422708, 32212, -1864553, 731755, -1692217, -805306, -35433, -182536, 2178622, 175557, 558883, 1566053, 1357210, 490700, 647466, 1310502, -2942590, 680215, 2767570, 585726, 1314260, 2194192, 13122736, -518080, 8298414, 11312944, --5966784, -13950054, 599685, 10597832, -8193187, 7439957, -2200097, -10096394, -4640712, 10156524, --9910637, -8769786, 6402186, -10139881, 3395709, 4828617, 3995393, -2880313, 6158983, 1725503, -1174674, 3944391, -6451578, 8818105, 4365298, 3826816, -1797981, -988379, 16469589, -5762236, -1045825, 4276714, 8301098, -11250667, -9233106, -8628052, 359167, 634581, -550293, 5231270, -1656247, 9340480, 3788161, 5473399, -851477, 731218, -4589173, 8348880, -3751117, 8236137, --4461934, -7103339, 12283606, 9953050, -14059039, -12435004, -8143795, -6391985, 4468914, 704912, --2820720, 6486475, 7183870, -8578123, 5086315, -690953, -17143898, -5671505, -8626979, -7853348, -3011309, -2669859, 5679021, -1293859, 885300, 10282689, 10504953, -964757, 2791729, -904091, -1668058, 1487669, -3500935, 2955474, 900333, -125091, 8872866, 2664490, -22012, 274878, --1535451, 2621004, -246424, 1730335, -1868311, -91805, -1972464, 551903, 2342905, 740345, -37581, -259846, 2055679, 1312649, -1225676, 192737, -10201, 322659, 1067299, 470836, --794569, -963683, 330176, 597537, -71941, -7409893, -10473815, 6300717, -6036040, -4371740, --3761318, -12099997, -1306744, 5452998, -3313567, -696858, -4463008, 10037875, 1516124, 6407018, -4836133, -8022999, 8251169, 12431246, -3824669, -5026723, 1307818, -2116345, 5327370, -15292231, -5848672, 13313325, -1788317, -4308389, -3806952, 5811091, 11869679, -2784213, 2981244, -5268851, -8125542, -9780177, -3782793, 1946694, -1555315, -7580618, 14006962, 9927280, 7388955, -3085934, --10587094, -1263794, -15031849, 2631204, -1109712, -442382, -330712, -2226941, 8120710, 6928319, --10447508, 5868536, -6262063, 8665097, -807991, -1712618, -732292, -9102109, -1761474, -8301098, --18473728, -802622, 2145336, 1493038, -7101192, -205085, -2041720, -13753022, 265751, 12009265, --7580081, 3169686, 3894999, -1483911, 836982, -3509525, -2109903, 2845953, 3395709, 3789772, --966368, -2370822, -930397, -2550674, 2101313, 1070521, -2189360, -596464, -2014340, -2148021, --301721, -1927904, -2988224, 1863479, -632434, -2249489, 1794223, -1566589, 1477469, 2306934, -948651, 2217814, 1536525, 4295, 1451699, 4971425, 2370285, -2429878, -1701344, -2794413, --2147, -3624416, 1919850, -186831, 2813741, -723165, 2190970, -351650, -1566053, 4692789, -2236067, -19389092, 1363115, 11301670, 6173479, -8837432, -7182259, 14168023, 3275450, 3180960, --2792803, 3662533, -144955, -9483288, -2471217, -9960029, 4708358, -5936182, -906775, -9705552, --10737418, -14440217, 9030169, 6089727, -4632122, -5153424, 4053912, -13262322, -1212255, 991064, -3199214, 5818070, 2842195, 364535, -4590247, 1920387, -4215511, 3489124, -4044249, 2301566, -1222992, -4207994, -5457830, -10397579, -6858526, 2617783, -17732846, -4843650, 9721122, 5164698, --2144263, 23131620, -3357054, 10708964, 10598369, -16881368, 1093069, -2254858, -14253923, -7467338, --7847979, 233539, 1661616, 15978352, -2580739, 1521492, 10834055, 8024610, -1898376, 10779831, --5127117, -3980898, -7221988, -9587978, -13942001, -5312875, 7943542, -15195057, -7748121, 11710228, -8545374, -5132486, 10714870, -4792647, -746787, -496069, 5152350, -3373160, 5134634, -3231963, -4392141, -1290101, 1812476, -2082522, 3553549, 3394635, 1475321, -617938, 4011500, -2612414, --2945811, 3120831, -881542, 3407520, 2492692, 1683627, 2305861, 1392643, 653909, -5864778, --1084479, -68183, 1630477, -1569274, -2474975, -2076617, -5603322, 2114198, -117038, 3525631, -1994476, 3431679, 2618320, 723165, 1057636, 13383655, -2374043, 4353486, -6565395, 3896609, -5534602, -3355980, 4725538, -7326141, -8162049, 12418898, 6686727, 8040716, 9808095, 15032, --8165270, 10733123, -9398999, -12497818, 128312, 11840688, -1743757, -10145250, 1343788, 13923210, --2050310, 3865471, 1290638, 19506668, 1177358, 4219269, 9544491, -1165010, -5019206, -9262634, -1264868, -1239098, -9006546, 344134, -5327907, 3622805, 13134010, 181999, -8004746, -2309082, --7426536, -3876745, -1200443, -3065533, 1732482, -9786620, 10506027, -5532455, 17784386, -4453881, --13012140, 785442, 577136, 6372121, 2649458, 3467112, -13346611, -10735271, 7734699, -11181947, --15682536, 4525285, 3049964, -3512747, 16842714, -13711146, -19108846, 7167227, -13065827, 1286880, -1742146, 409096, -12567611, -7581154, -16329466, 5615670, -1692754, -862752, -2568391, -7212324, --3315178, -5463736, -2771865, -2100776, 6156299, -4720169, 4714801, 1769527, 4869419, 856309, -581431, -6611566, -2479270, 1832877, -2194192, -7220377, 1373316, -1148367, -2885144, -2525441, -2251100, -2887829, 3058554, -1644973, 3725347, -704912, 1869385, -3760781, -3770445, -103079, -221728, -1329292, 5652177, -4977330, -4816806, -3115462, 2708514, 3019899, -3917010, 2921115, -807991, -10356777, 5744519, 595390, 14147085, 14857366, 21424908, 9796820, 4553202, 2993055, -7072201, -7259032, 8176007, -12885439, 6300180, -1241782, -1078574, -24719684, -9557376, -4036733, -8443369, -1031866, 2062121, 2709051, 2262911, -12619151, 13103945, -466541, 5346161, 464393, -12232604, -13092671, 9141838, -6420439, -293132, 9926206, -11214696, -4989142, -12222403, -4840965, --13612362, 12451110, 9149354, 16716013, -797253, 3980898, -15173583, 3494493, -15730855, 15342160, -4354023, -2454037, 14521821, 14828375, 7584912, -8781598, -13137231, -18922016, -816581, -6677064, --9529996, 10322417, -2806761, 23988466, -17719962, -6436009, 13720273, -14250165, -5654325, 3327526, -277025, -2048163, -13687524, 6296422, 2357937, -7425462, 6813966, 14474040, -12382928, 13972065, -17381196, -5160940, -9161165, 7183870, -7023882, 6640557, 4253628, -7228967, -5626407, -1404991, --2229088, 10213969, 3465502, -1690607, -4908074, -8042327, -4536023, 2596308, -5134634, 2514167, -4937065, 3183645, -3440269, 2700461, -2808372, 3924526, 2562485, 4374424, 2662880, 245350, --4522064, 3030100, 4591320, -4554813, 227633, 1637456, 1736777, 3977677, 401043, -458488, -4374961, 5370857, 1085016, -2376191, -4107063, -48855, 3733937, 4537633, 3105798, 22315040, --5108864, 3167539, -1207423, -7323456, 9985799, -3636764, 3693135, 1224603, 14313515, -4481799, -16694538, 307090, 8309151, 7412040, -1321239, -5384279, -16268799, 7755637, 16933982, 922344, --112743, 11786464, 9972377, -686658, 1845762, 20195474, 12636331, -3614752, 4398584, 13292924, --3331284, -14641007, 361851, -10619307, -1668058, -6716255, 636729, -20263118, -6048925, -7355669, -359704, 4293357, 4292283, 19796578, 21845814, 11558831, -15082851, -8860518, 12288438, 17263084, -3661460, -15669651, -2561948, -3671660, -16372415, -10299868, -12389907, 15228880, -5645735, 2137820, --15406048, 22512608, 16600049, -1802813, 6881612, 37332928, -1853278, -7577396, -14294725, -803696, -9940165, 7909183, -5731097, 11302743, 22340272, -9488120, 14264660, -6411850, 4698158, -8884140, --4818417, -7654706, -10076530, -5131412, 6670621, 46708, -2179159, 1689533, 2796561, 12104828, --1286880, 1274532, -94489, -5484673, -554588, -1911797, 1163399, 4944044, -3102577, -1416266, --3855270, -1775432, 1418413, 1560147, -1360431, -7866233, -7365332, -2463701, -9081708, -7900593, --1396938, 7165616, 6327024, 5496485, 1272921, -1169842, 381715, 3102040, 2583960, -898185, -1799591, 1331977, 11480448, 1174674, -6896107, 6821482, 2638721, -9543417, -16157130, 20975546, --13175886, 15832323, -11581379, -17215302, 788663, 21728776, 13895830, -15985331, -10769630, 3750043, -3142842, 7380902, -1318018, 14507326, 7652021, 19102404, -7001334, -3144990, -726386, -3643206, --18414136, -13489419, -4292820, 19207630, 3935264, 1552631, 595390, -17806934, -20381768, -15665356, -8066486, 9326521, -7004555, -4538170, 1724429, 2253784, -10892574, 3174518, 20156282, 3595425, -12607876, 12494597, 8892730, 21741124, 31085362, 10277320, 491774, 4535486, 12246562, -6446209, --3505230, 8323647, -2851858, 4476430, -2922725, 13499082, 4723927, 9577240, -2688113, -3525631, -6790880, 18020072, -1347546, -14677514, 9390946, -22999550, -26776436, -9104257, 13798656, -8879308, --26477400, -16117402, -6759742, 9706626, 6564858, -14251238, 25636660, -8200167, -18017924, 4747013, -6999186, -5869073, 8896488, -9235790, -3674345, 3372623, 2392834, -4835060, 4518306, 896038, -8083129, -4445291, -9696962, -5602785, 1605781, -2110440, -1967632, -741956, 62277, -754841, -6566468, -1106491, 1088774, -2641942, 3029563, 5447093, 1061394, 5221607, 1621887, -8075613, --3569118, 46171, -6983617, -8251169, 3990562, 5818607, -4516695, -8805220, -9672803, 3970697, -1636919, -420907, 6283001, -3624953, 2302639, 8591545, -37467148, 2164664, 18742164, -3341485, --4600447, 23095650, -12475269, -12576738, -16376710, -5242545, -5648956, -10672994, 3027415, 5384279, -8669928, 6371047, -5363341, -3973919, -2010045, -4470524, 1354525, 4433480, 18501646, -7903814, --24395414, 13045963, -88047, -615254, -20326470, 9071508, 3714073, -1993939, 22738094, -6478422, -2295123, -2041183, 9913321, 12281996, -13623099, -1242856, -7734699, -801011, 6652905, -5005248, -10296110, -16313896, -13889924, -8587250, -14827838, -2477659, 1112397, 2327872, -20657182, -13375065, -9509058, 16542603, -8050380, -9164923, 8442295, -18651432, -17183090, -16362215, 17807472, -30393872, -9652402, -1600949, -18195628, -5692979, 14921253, 38732016, -5429913, -10658498, 12508555, 29700772, -10410464, -6674916, -7450695, -1342714, 7868380, -543313, 3531000, 17679160, 897111, -6598144, --12747463, 10358387, -14993731, -10040560, -7605850, 5204964, -6351183, -10668162, -7035694, -6492917, --379568, -7873212, 2410551, -6104223, -840740, -2004676, 7192997, -5674726, -4757750, -11623255, --3772055, -2075543, -4227322, 11020886, -8454643, -10453414, -991064, -9176734, -8705362, -3846680, -912144, 8253854, -1416802, -3554086, -1931125, -5493263, 3526705, -11065983, -1296543, 11403138, -5089536, 7455527, -3230352, 2816962, 3312494, -2763275, -4690105, -6252399, 1868848, 2938295, -4656819, 5179194, -2184528, -21028696, -33427194, -1998770, 38429756, -6198712, -2700998, -25429428, --1868848, -1751273, 2690797, 8338679, 1204738, 6923488, 551366, -473520, -18028126, 2517925, -16505559, -11166915, 20459614, -8658654, -1206349, -18148384, 11647414, -9070434, -5794985, -20933134, --28236188, 14397267, -13748727, -13658533, 5032628, 2845416, -6024229, 1331977, 16098074, -4814122, --15215995, -9556839, -19502910, -2460480, 5681705, 13495861, 2866354, -4053376, -3266860, -8173323, -4791573, 14022531, 2428267, -8876624, 16121160, -15404974, 1749125, -26502096, -7680476, -5242008, -32704028, -20662550, 6774237, -6752763, 4400194, -3856344, -3518115, 571768, 13380971, 3962107, --23924042, 26390426, 8212515, 9390409, 3551938, -10593000, -7917236, -3069828, 3482682, -634581, -5424007, -14347338, -14756434, -2473901, 7405598, 16031502, -9808632, 13594645, -3207267, 5279589, --10624675, 6109591, -17408576, 19617264, 1008780, 2164127, 6597070, 8838506, 1009854, -12279311, --5767604, 3288871, -11480984, 3141232, 5616207, 4901632, -6766721, -4306779, 11924440, 2143726, --11801496, -1730872, 10362682, -3853123, -14551886, 16647293, -4372277, 6433324, -2658048, -4781373, --7683160, 5120138, 1569274, 5328981, 962073, 8947491, 1218160, 6437082, -2962991, 445603, -4185983, -2266669, -3377992, -16360604, -9920301, 35788888, -4542465, 3236258, -18604188, 16852378, --9686762, 12483859, -9773198, 21734682, 2054068, 2473364, -10510859, -8245264, 12426414, 28088550, --11644730, -16649978, 7927436, -6376416, 18278308, 23459648, 11375758, -3179887, 14289356, -9218074, --8890045, 19761144, 26759794, -29674466, 2436320, 4780836, 5061082, -9836549, -719407, 12416750, --30313342, 9419400, 17701170, 6978248, -13487271, -3412889, 21740588, 18127984, 5920076, -9918690, --13368086, -25907780, 37416680, 7095286, 19240916, -2476586, -7961259, 4514548, 11205033, 678068, --594316, -30154966, 4732517, 29080150, -5124970, 27881318, -16516834, -7094212, -11511586, 6757058, -25936234, -7833484, -730681, 23778550, 28651726, -9006010, -20900384, -18329846, -16247324, -7241315, --6846715, 16809966, -20138564, 11325292, 12452721, -4243428, 1459752, 13250511, -2462090, -7097434, -7805030, 5829881, 4182225, 12213276, 2654290, -1789928, 10801843, 4171487, 4596689, 5782637, --1801739, 972273, -2400350, 4980552, -19723564, -5177046, 888521, -3544422, 7760469, -14542222, --1625108, 484794, 5327370, -56371, 8434242, 6128382, -3937948, 12173011, 6120329, -3836480, -8635569, 9580461, 155693, -5703717, 4588099, 9334038, 5556077, -1053341, -8651138, -3945464, -2354179, 1671816, 1472637, -8082055, 14144401, 10433549, 24978992, -7530152, 18096844, -9542344, --3810173, 16859358, -550293, 22972706, -27645094, 17391396, 3191161, 7762080, -11092827, 8461086, -20685100, 40215388, -9190693, 10275709, -507880, -26552024, 24481314, 2561411, 9612137, -4774930, --12399034, -4536023, -947040, -10233833, -6419366, 34188476, 2465848, 13217762, -9667435, 24273008, -223875, 11839077, 5046050, -14008573, -2916283, -8589398, 361851, 4498442, 28666222, 14672145, -1313723, 3528853, -900869, -2229625, 4796942, 2995203, 18006114, 14712410, 7452842, -8358543, -12545063, 26276074, -24547886, 23052164, 3799436, 7042673, -24664924, -11615202, -31022548, -24977382, --4835597, 16925392, 14111652, -43020540, -191663, -19313394, 10358387, 43272332, 21760988, -27563490, -15283641, -11241540, -14179835, 23920284, 12125230, -12041478, -6681896, 21074330, 17242146, 9531606, -26718454, -6999723, 16437377, 14533096, -16834662, 23920820, 6642704, 27737972, 8523363, -2382096, -16356309, -1509681, 4359392, -19185618, 14696841, -9262634, 7714298, -6842420, 3481071, 9163313, -22091164, 5936719, 13482976, 3556770, 4401805, -7031399, -1489817, -2397666, 1936493, 11200201, -9556839, 16750372, 6272263, -1814087, 2797098, -3704409, -2032593, -16464757, -2646237, 4325032, -5423470, 14474040, 12906377, 11731166, 13532368, -35762044, -56166360, -14093935, -6754910, -13314935, -2611877, 19226958, -20106352, 28782186, 9895605, -40417788, -31819802, -5850819, 21879638, 1239098, -1410360, -3841848, -13406204, -39110508, 1175210, -32789390, -27972586, 13929116, 10268730, 10199474, --5091147, -12451647, 29531122, 18396956, -13146895, -25478820, 19360638, 10435697, 4241280, -11756399, --30758408, 11973295, -14654428, 4988068, -26250840, 31854162, 383863, -12152073, 2675765, 8340827, -25530896, 16632798, -7016903, -865973, 8703214, 9409200, 9619653, -5471252, -40896140, -31450972, -6094022, -3960497, 23379118, -4124242, -10521596, -28174986, 32889786, 13174812, -23480050, -23464480, -33760052, 32370094, -649614, 23860154, -3438658, 1231582, -9986873, -5463736, -18600966, 23012972, --4464082, -4702453, -10063645, 9739912, -29078540, 14016626, -8699456, -4993437, 20205136, -24159, -2986076, 5563594, 18541910, 10029286, -7897371, 14367202, -4384625, 17258790, 6432788, -18479096, -4487167, -9172976, 8770860, -7359964, 537, -12125230, -6640020, 7342784, -12612708, 5732171, -4085051, 5880347, -11275900, -7499550, -14455249, -12071542, 16535087, -5552856, 10632728, 7246684, --10348187, -967441, -9055939, 843961, -5778342, 21584896, 17689896, 12546673, 16529182, -3581466, --18530100, -20622286, -3092913, 6910066, 30692910, 19304268, -7136625, -5214091, -8308614, -14775761, --955093, 7501698, 10664941, 7296613, 3417720, 19219442, 2226404, -14074608, -35051764, 55455008, -1720134, -43441984, -2949032, -16364362, 7611219, 21095268, 19757386, -24302536, -38190312, 6273874, --18111340, 5570573, -3434363, 16676821, -5252208, 2127620, 10410464, -16032576, -18967112, 1738925, -5389110, 16512539, -59056, -27194660, 18019536, -15298674, 14232985, -13334800, -8546448, -1763621, --3937411, -29211146, 5764920, 7785165, -27624156, 11533061, -10653130, 5308580, -8993125, 26720066, -21369610, -27526982, -14118094, 18313204, 23650238, -28159416, 37135360, 2099165, 29969208, 21238614, -35305168, -11100880, -14492293, 7565048, -28663538, 4146254, 4014721, 50655920, -15443629, -48166984, -81187768, -38475928, -29027000, 46323908, 21405580, -27473296, 45641544, 4759898, -36528160, 45593224, -5896990, 3828427, -7657927, 6461242, 30800822, -7724499, -10253161, -16125455, 23027468, -8534100, --5450314, -3464428, -8790724, -10052371, -13857175, 13326747, -1677722, -1552631, -4800163, -3788698, -2066416, -6420976, -10329933, 1075352, -8295730, -16297790, -16321949, 20421496, -8666170, 1638530, -19447612, -9485972, -8435853, 1059783, 9807021, 3792993, 4359392, 18098992, -11035382, 2371359, --8053064, -5510980, -3373160, 30123826, 15403900, -5231270, 4631586, -16406775, 5470178, -15039365, --8859981, 6846178, -3606162, -30733712, 19065360, 7385733, -5363878, -386547, -15346992, -2378875, -513785, -50184544, 6932614, 15055471, -37681896, 17246442, 9946607, -13197898, -3782793, -654446, --9256191, -3024731, -5435818, -16786880, 442382, -8373039, -1879585, -4122632, 8145943, 29993904, -25074020, -23145042, -2594697, 31559956, -5570573, -5929739, -32329292, 3728032, 10552735, -5285494, -27463094, 65950296, -22240414, -27804544, 46902652, -3144990, -25379498, 29291140, 19229642, -15213848, --22811108, -28128814, 8504035, 15063524, -12594992, 44227424, 28794534, -55212340, -53039088, 30852360, --25007984, -32309428, 41790568, 6709276, 55968256, 26870926, -6890738, -7577396, -40542344, -31581968, -91973504, 25376814, -19856708, -44604308, 1134945, -18206904, -39904540, -6259915, 46504832, 19768660, -475668, 38308424, 33425046, -10704132, -42849816, 6549825, 25485800, -10687489, -10123775, 53393960, -30613454, 5225365, -5757404, -27593018, -27100170, -7059316, 25317222, 10160282, -10493679, -5013301, --12125230, 9901510, -7854959, -10426033, -6806987, -1403381, 7486128, 10160282, 8967355, 3686156, --24635932, -8696772, -4964982, 9076340, -9687299, 1529545, -2707977, 22329534, -14695767, -10267656, -23051090, 6310381, -11938935, 18124762, -6571300, 5162014, 1258962, 3976603, -14217415, -3991098, -18920942, 18522584, 7580081, -7640210, 4807142, -8747238, -7072201, -5471789, 9824201, -15921981, --3515431, 12217034, 49428632, 42068668, -11613055, 30040612, 2559801, -22433688, 14198088, 25730612, -7941932, 11409581, -33535642, -6231998, 3384434, 7181186, -5354751, -28244242, -10841571, 10853919, --7488813, -2565706, -24805584, 37810208, 4182225, -30315490, 16953310, 44301512, -23107998, -12705587, -5920076, 14924474, -14628122, -27131308, 23177792, 40321152, -3688303, -15217069, 4682051, 11739219, -17661442, 25987774, 1183800, 46933792, -1539209, -51327544, -96637, -5388037, 16384763, -4980015, --42777876, -732292, -18765248, -17395154, 24866786, 13776644, 13961865, 18663244, -38401840, -19383188, --7170985, -74088, 14778446, 966905, -8268349, 1498407, -13497472, -25390772, 1975148, 40592808, --21180094, 4257923, -16581258, -11055246, 26925686, -33349884, -920197, 15275051, -12496207, 5974300, -3662533, 8837969, 9180493, -17413944, -21935472, 36384816, -8041253, -11238319, 17952964, -18030272, -10986526, 2736968, -8167954, 6086506, 14975477, -2536715, 1509681, -7250442, 3143916, 1389959, --1639067, -6430640, 7890929, 4670240, -1473711, -313533, 6506339, 6341519, -7272454, -11550241, -5900212, -313533, 2681133, 1101659, -3760781, 6574521, -494458, 5523328, -2658048, -567473, --4162360, 1374926, 5082557, -891206, 13702556, -5449777, -5087926, 1059246, -7004555, 4403415, -8941048, -43456480, -61774516, -55067924, 110521320, 105046312, 105297568, 296404288, 105611096, -12462384, -19736986, -205365472, -249640672, -84194240, -139990704, -194542160, 25186226, -11039140, -32314798, 213711664, -130798936, 54295904, 334333664, 157492160, 29353954, 152088544, -35952096, -182061520, -173921472, -166131488, --229686800, -225322032, -52682604, -81506128, -132346200, 154469040, 71421008, -55996172, 223621760, 71910640, --26088706, 252391072, 230351440, 52754548, 239036400, 242117504, -9156333, 59913184, 27577448, -233574288, --270684416, -201976736, -381123040, -361348480, -216721904, -289900096, -217735520, 24393804, 179225760, 202946864, -436866880, 396795936, 350273920, 376967136, 278385824, 140979616, 43250856, -30924302, -212477936, -256613024, --274256736, -309524864, -293268416, -250400896, -161514928, -117741696, -114722336, 21585968, 69672424, 136331392, -325111296, 337201632, 230875968, 288127872, 122037200, -40197136, -95472288, -148344944, -202755744, -147261008, --98185640, -98156112, -33674692, -9592273, 839666, 51626580, 66114044, 62568008, 96487512, 60329260, -39298412, 48235704, -28786482, -27060978, 8172249, -78685952, -55397560, -20859582, -75618264, -47160352, --5304285, -76572288, -80418968, -53872312, -78929152, -52296060, 59260348, 110400520, 176386256, 259783776, -242857312, 207364240, 195342096, 105098920, -32502702, -163337600, -288167616, -342635296, -308623456, -250413232, --188777232, -89234392, 27912992, 110945448, 156483376, 168397616, 149017648, 132417600, 123573192, 124018256, -86437824, 40044128, 18291192, -12176769, -36501316, -33727304, -59032176, -64124936, -45552424, -35300336, --45694692, -44913548, -56786448, -65630320, -64938832, -56726316, -46354508, -15621333, 23014046, 52843132, -70893800, 90907280, 89882928, 74788264, 53563076, 32307280, 12123619, 9306120, 1151588, -12102144, --22018686, -24888798, -32581622, -36738076, -40644348, -44139916, -46322296, -31825170, -17904108, -5712307, --137439, 6755447, 12523051, 22112640, 22662932, 15803869, 7158637, 11808476, 17511656, 18367964, -17174500, 16449725, 14377403, 16482474, 14841796, 7766912, -1653562, -6953552, -18049600, -22174380, --23832774, -24934970, -28201292, -24932822, -25971668, -23615878, -14461692, -2006287, 9957345, 26101590, -36421860, 42974368, 40807560, 31504658, 14549739, -217433, -12787191, -17411260, -20653960, -17745194, --14516453, -9337259, -6227166, -3047816, -2709588, -244813, 470836, 2520609, 2251637, 3777961, -2629057, 3165928, 1622961, 1675574, -47245, 306553, -886911, 117038, -667867, 397284, --485331, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +3428458, -4665408, -3816615, -642635, 3676492, 5444408, -2568927, 3183645, -1767379, -4513474, +-1250909, -2518462, 1476932, -612033, -2196876, 2015950, 3032784, 693100, 3668439, -6729677, +-7293928, -4668630, 667867, -6979, -1255204, 362925, 2213519, -717260, 2992519, 2491618, +-3192235, 1222455, -248034, 3899830, 3576097, 1364189, -3820374, 2509335, -2279554, 1281511, +2490007, -6076305, 6642167, 9780714, 1269163, 4438312, -3607236, -715649, -3386582, -1743757, +3016678, -1000191, -3502009, -914828, -2208687, 1694902, -2153926, -1938104, 186294, 1797444, +-1787780, -1996086, -879931, 3482682, 3115999, -2629594, -981400, -3109556, 708670, 4134980, +1136556, -1498407, -1979980, 1562831, -563714, -2797634, -1035624, -1884954, -282931, -1005022, +1620276, 1538672, 810138, -890669, -1255741, 2792266, -387084, 769336, 1431835, -401579, +-49392, -563178, 837519, 125628, 202400, -799938, 104153, -244276, -819265, 53687, +-136365, 614180, 1452236, -799401, 329102, -143345, 700617, 887448, -223875, -344671, +-195958, -29528, -794032, -312459, 337155, -283468, 134755, -1074, 637803, 157840, +72478, 15035070, 6910603, -514859, 3140158, 2863670, -3610994, -1760937, 4161823, 1902134, +4530117, -3291019, 6590091, 2484639, -6516539, 5173288, 268435, -110595, -3442953, 3787088, +-7044820, -6032282, -1301375, -2140504, -1176821, -2150168, 806917, -1302449, -2934537, -2108292, +2439542, -2665027, 1700807, 1087701, 675921, -2942590, 4130148, -8657043, -1534914, -40265, +-1530082, -1081795, 734439, 1624571, -2792266, 2217277, -3380676, 3229816, 1006633, 711891, +3309809, -2338610, -579284, 1353452, 5186173, 1293859, 2166811, -1192927, -4529580, -6298570, +1143535, 3428458, 4452271, -1826435, -7065758, 1053878, -2899103, -1961190, -1648194, 1959579, +189515, 6897718, -222265, 2325188, 1334661, -1038845, -1811939, -1917703, -7218767, -2110977, +-1195075, -974958, -1395864, 1344325, 3590593, 1012002, 3405372, -33823, -340913, -1089848, +923955, 1251983, -361314, -1391033, 1196685, -714038, 460635, -605054, 614180, -1029718, +-655519, 981937, 300648, 556198, -390305, 344134, -676994, 8123931, 1855963, -6810208, +-7783018, 2151242, -2389076, -6400038, 7269232, -3557307, -1216550, -972273, 5695127, 1226750, +-3338263, 4035659, -3134789, 6087580, -8407935, -5510980, 6653978, -6947647, -7059853, -2804614, +5682779, 2520072, 2706903, -652298, 5088463, 3114388, -559420, -6738804, 1797444, -1863479, +2400350, 2157147, 1809255, 5875516, 1539746, -5764920, 498753, 4031901, 5873368, 2000918, +-3268470, -755914, -4805532, 2048163, -8498130, -323196, 9105868, 497142, 944893, -4682051, +-5839545, 896574, 1231045, 6728603, -1500017, 583579, 671089, -989990, 653909, 2238752, +362925, 4733054, -1320703, 3144453, 427886, 851477, 530965, 5550709, 193810, -772020, +987306, -1182190, -3790846, -1997160, -3907347, -88047, 6946573, 1466195, -2326262, -784368, +-4027606, 2268280, -3162707, -2192581, 717796, 116501, 193274, -1800665, -2589865, -527207, +589484, -857383, 1420024, -163746, -45634, 1430224, 852014, 1440425, 1147830, -17180, +429497, -1171452, 20938, -1039919, -1160178, 781147, 891743, 1650878, 1154273, -803696, +-251792, 871878, -689342, -1266479, 667331, 177704, 9664, 161061, -18677202, -12108587, +-2736968, 2077154, 2938831, 365609, -83215, -7059853, -498216, -1500017, -1248762, 204011, +-1868848, -772557, -5318244, 2775086, -11124502, -4000225, 932545, -2177549, -3441880, -1894081, +-6356015, -3150359, -2676302, -2946885, 1332514, -4833986, -2741800, 6080600, 3876745, 448824, +2840047, 2171643, -2039573, -4007741, 2340757, 9058086, 961536, 1170379, -3616899, -3138547, +2589865, -7684770, -4173098, 8600135, -7889318, 2404108, -1928977, -3907347, 1745904, 616328, +-2240899, 547071, 1249836, -2669859, -39192, -496606, 5216238, 4725001, 626528, 1302449, +2224256, -114890, -1096827, -1782411, -10932302, 5301601, 3213173, -2918967, -187368, -4507032, +-1307281, 687195, -3395709, 1549410, -4105452, -2203855, -4768488, -6926172, 4510253, -1284732, +132607, -5847598, -1544041, 802622, 902480, -1510755, -346282, -283468, -1700270, -3006477, +411243, -1523640, 1235877, -201327, -845572, -586263, -396748, 1531693, 180926, -2216740, +348966, -639413, -266825, 765041, 258235, -548682, 452582, -1733019, 869731, -1572495, +-583042, -2055142, -16143708, 2534568, 3719442, -957778, -1463510, -8850854, -3696893, 2500208, +-8004746, -7565048, 1508070, -7192997, -3781719, -126702, -4424890, 2529736, -3496640, 5499706, +-2915746, -1825361, 1673964, 3864934, 6995965, 4459787, -7885560, -365072, -622233, 3928821, +5761162, 9916543, -4417911, -3812320, 5071283, -5322002, 1214402, 1607928, 8293045, 3114925, +4614943, -6133750, -2770791, -8397198, 6663642, 7072201, 8027831, -63888, -1759863, -5334887, +-1158031, 5480379, -2536715, -3413425, -3227131, -4174171, 894427, 1061394, 1251446, -5735392, +-96100, -5617817, -324270, -785442, 2299955, 2066416, -1758252, -2513630, -7215008, -355945, +-588411, 4503810, -2791729, 7441568, -4213363, 985158, 3412889, 6767795, -5188858, 1617055, +3508988, -5956583, 3015067, 66572, 7416872, 2541547, 1661616, 4627828, -459562, 1316944, +3511136, 1487132, 43487, -1227824, 64961, 1547799, -470299, 1947768, 2882997, 2420751, +-1075889, 1374390, 195958, -709207, 1164473, 1583769, 15569, 763967, 1857037, 1423245, +1502702, 782758, -701153, -1124208, 1440425, -1211718, 1436130, -668941, 130460, 1844152, +1376537, -348966, 1018981, 20033874, 16944182, -488553, 383326, 9005473, 1087164, 4474282, +-2786897, 4999879, -3879429, 9090298, 2945274, 139586, 1706713, 751619, 11224897, 7788923, +-7562901, -6069863, 2289755, 1325534, -2507187, -1489817, 1316408, 5567352, 3918084, 2609730, +461172, 2998424, -2017024, -24159, 6130529, -6743636, 2636036, 8475044, 6141803, 11476689, +-1238561, -1601486, -1110786, 841277, -3744675, 12461311, 11187316, 8204998, -3881577, -1000727, +4688494, 4042638, -3572339, 894964, 6352257, -2295123, -3149822, 4241817, -12111808, -1270237, +543850, 1887638, -4178466, -7716983, 3082176, 5485747, -6496675, -2252174, -7054484, 2707440, +368830, -1337346, -1609539, -5929203, 10019622, -2547989, 1245541, -10191421, -2566243, -4804458, +11937862, -2009508, -1773285, 5486821, 2364916, 83215, -3964792, 3684545, -2648384, -3477850, +5472862, 5320928, -194884, 3365644, 1611, -1371168, 2849711, -349503, 1041530, -850404, +-1424855, -221728, 2192044, -1603097, -1422708, 32212, -1864553, 731755, -1692217, -805306, +35433, -182536, 2178622, 175557, 558883, 1566053, 1357210, 490700, 647466, 1310502, +2942590, 680215, 2767570, 585726, 1314260, 2194192, 13122736, -518080, 8298414, 11312944, +-5966784, -13950054, 599685, 10597832, -8193187, 7439957, -2200097, -10096394, -4640712, 10156524, +-9910637, -8769786, 6402186, -10139881, 3395709, 4828617, 3995393, -2880313, 6158983, 1725503, +1174674, 3944391, -6451578, 8818105, 4365298, 3826816, -1797981, -988379, 16469589, -5762236, +1045825, 4276714, 8301098, -11250667, -9233106, -8628052, 359167, 634581, -550293, 5231270, +1656247, 9340480, 3788161, 5473399, -851477, 731218, -4589173, 8348880, -3751117, 8236137, +-4461934, -7103339, 12283606, 9953050, -14059039, -12435004, -8143795, -6391985, 4468914, 704912, +-2820720, 6486475, 7183870, -8578123, 5086315, -690953, -17143898, -5671505, -8626979, -7853348, +3011309, -2669859, 5679021, -1293859, 885300, 10282689, 10504953, -964757, 2791729, -904091, +1668058, 1487669, -3500935, 2955474, 900333, -125091, 8872866, 2664490, -22012, 274878, +-1535451, 2621004, -246424, 1730335, -1868311, -91805, -1972464, 551903, 2342905, 740345, +37581, -259846, 2055679, 1312649, -1225676, 192737, -10201, 322659, 1067299, 470836, +-794569, -963683, 330176, 597537, -71941, -7409893, -10473815, 6300717, -6036040, -4371740, +-3761318, -12099997, -1306744, 5452998, -3313567, -696858, -4463008, 10037875, 1516124, 6407018, +4836133, -8022999, 8251169, 12431246, -3824669, -5026723, 1307818, -2116345, 5327370, -15292231, +5848672, 13313325, -1788317, -4308389, -3806952, 5811091, 11869679, -2784213, 2981244, -5268851, +8125542, -9780177, -3782793, 1946694, -1555315, -7580618, 14006962, 9927280, 7388955, -3085934, +-10587094, -1263794, -15031849, 2631204, -1109712, -442382, -330712, -2226941, 8120710, 6928319, +-10447508, 5868536, -6262063, 8665097, -807991, -1712618, -732292, -9102109, -1761474, -8301098, +-18473728, -802622, 2145336, 1493038, -7101192, -205085, -2041720, -13753022, 265751, 12009265, +-7580081, 3169686, 3894999, -1483911, 836982, -3509525, -2109903, 2845953, 3395709, 3789772, +-966368, -2370822, -930397, -2550674, 2101313, 1070521, -2189360, -596464, -2014340, -2148021, +-301721, -1927904, -2988224, 1863479, -632434, -2249489, 1794223, -1566589, 1477469, 2306934, +948651, 2217814, 1536525, 4295, 1451699, 4971425, 2370285, -2429878, -1701344, -2794413, +-2147, -3624416, 1919850, -186831, 2813741, -723165, 2190970, -351650, -1566053, 4692789, +2236067, -19389092, 1363115, 11301670, 6173479, -8837432, -7182259, 14168023, 3275450, 3180960, +-2792803, 3662533, -144955, -9483288, -2471217, -9960029, 4708358, -5936182, -906775, -9705552, +-10737418, -14440217, 9030169, 6089727, -4632122, -5153424, 4053912, -13262322, -1212255, 991064, +3199214, 5818070, 2842195, 364535, -4590247, 1920387, -4215511, 3489124, -4044249, 2301566, +1222992, -4207994, -5457830, -10397579, -6858526, 2617783, -17732846, -4843650, 9721122, 5164698, +-2144263, 23131620, -3357054, 10708964, 10598369, -16881368, 1093069, -2254858, -14253923, -7467338, +-7847979, 233539, 1661616, 15978352, -2580739, 1521492, 10834055, 8024610, -1898376, 10779831, +-5127117, -3980898, -7221988, -9587978, -13942001, -5312875, 7943542, -15195057, -7748121, 11710228, +8545374, -5132486, 10714870, -4792647, -746787, -496069, 5152350, -3373160, 5134634, -3231963, +4392141, -1290101, 1812476, -2082522, 3553549, 3394635, 1475321, -617938, 4011500, -2612414, +-2945811, 3120831, -881542, 3407520, 2492692, 1683627, 2305861, 1392643, 653909, -5864778, +-1084479, -68183, 1630477, -1569274, -2474975, -2076617, -5603322, 2114198, -117038, 3525631, +1994476, 3431679, 2618320, 723165, 1057636, 13383655, -2374043, 4353486, -6565395, 3896609, +5534602, -3355980, 4725538, -7326141, -8162049, 12418898, 6686727, 8040716, 9808095, 15032, +-8165270, 10733123, -9398999, -12497818, 128312, 11840688, -1743757, -10145250, 1343788, 13923210, +-2050310, 3865471, 1290638, 19506668, 1177358, 4219269, 9544491, -1165010, -5019206, -9262634, +1264868, -1239098, -9006546, 344134, -5327907, 3622805, 13134010, 181999, -8004746, -2309082, +-7426536, -3876745, -1200443, -3065533, 1732482, -9786620, 10506027, -5532455, 17784386, -4453881, +-13012140, 785442, 577136, 6372121, 2649458, 3467112, -13346611, -10735271, 7734699, -11181947, +-15682536, 4525285, 3049964, -3512747, 16842714, -13711146, -19108846, 7167227, -13065827, 1286880, +1742146, 409096, -12567611, -7581154, -16329466, 5615670, -1692754, -862752, -2568391, -7212324, +-3315178, -5463736, -2771865, -2100776, 6156299, -4720169, 4714801, 1769527, 4869419, 856309, +581431, -6611566, -2479270, 1832877, -2194192, -7220377, 1373316, -1148367, -2885144, -2525441, +2251100, -2887829, 3058554, -1644973, 3725347, -704912, 1869385, -3760781, -3770445, -103079, +221728, -1329292, 5652177, -4977330, -4816806, -3115462, 2708514, 3019899, -3917010, 2921115, +807991, -10356777, 5744519, 595390, 14147085, 14857366, 21424908, 9796820, 4553202, 2993055, +7072201, -7259032, 8176007, -12885439, 6300180, -1241782, -1078574, -24719684, -9557376, -4036733, +8443369, -1031866, 2062121, 2709051, 2262911, -12619151, 13103945, -466541, 5346161, 464393, +12232604, -13092671, 9141838, -6420439, -293132, 9926206, -11214696, -4989142, -12222403, -4840965, +-13612362, 12451110, 9149354, 16716013, -797253, 3980898, -15173583, 3494493, -15730855, 15342160, +4354023, -2454037, 14521821, 14828375, 7584912, -8781598, -13137231, -18922016, -816581, -6677064, +-9529996, 10322417, -2806761, 23988466, -17719962, -6436009, 13720273, -14250165, -5654325, 3327526, +277025, -2048163, -13687524, 6296422, 2357937, -7425462, 6813966, 14474040, -12382928, 13972065, +17381196, -5160940, -9161165, 7183870, -7023882, 6640557, 4253628, -7228967, -5626407, -1404991, +-2229088, 10213969, 3465502, -1690607, -4908074, -8042327, -4536023, 2596308, -5134634, 2514167, +4937065, 3183645, -3440269, 2700461, -2808372, 3924526, 2562485, 4374424, 2662880, 245350, +-4522064, 3030100, 4591320, -4554813, 227633, 1637456, 1736777, 3977677, 401043, -458488, +4374961, 5370857, 1085016, -2376191, -4107063, -48855, 3733937, 4537633, 3105798, 22315040, +-5108864, 3167539, -1207423, -7323456, 9985799, -3636764, 3693135, 1224603, 14313515, -4481799, +16694538, 307090, 8309151, 7412040, -1321239, -5384279, -16268799, 7755637, 16933982, 922344, +-112743, 11786464, 9972377, -686658, 1845762, 20195474, 12636331, -3614752, 4398584, 13292924, +-3331284, -14641007, 361851, -10619307, -1668058, -6716255, 636729, -20263118, -6048925, -7355669, +359704, 4293357, 4292283, 19796578, 21845814, 11558831, -15082851, -8860518, 12288438, 17263084, +3661460, -15669651, -2561948, -3671660, -16372415, -10299868, -12389907, 15228880, -5645735, 2137820, +-15406048, 22512608, 16600049, -1802813, 6881612, 37332928, -1853278, -7577396, -14294725, -803696, +9940165, 7909183, -5731097, 11302743, 22340272, -9488120, 14264660, -6411850, 4698158, -8884140, +-4818417, -7654706, -10076530, -5131412, 6670621, 46708, -2179159, 1689533, 2796561, 12104828, +-1286880, 1274532, -94489, -5484673, -554588, -1911797, 1163399, 4944044, -3102577, -1416266, +-3855270, -1775432, 1418413, 1560147, -1360431, -7866233, -7365332, -2463701, -9081708, -7900593, +-1396938, 7165616, 6327024, 5496485, 1272921, -1169842, 381715, 3102040, 2583960, -898185, +1799591, 1331977, 11480448, 1174674, -6896107, 6821482, 2638721, -9543417, -16157130, 20975546, +-13175886, 15832323, -11581379, -17215302, 788663, 21728776, 13895830, -15985331, -10769630, 3750043, +3142842, 7380902, -1318018, 14507326, 7652021, 19102404, -7001334, -3144990, -726386, -3643206, +-18414136, -13489419, -4292820, 19207630, 3935264, 1552631, 595390, -17806934, -20381768, -15665356, +8066486, 9326521, -7004555, -4538170, 1724429, 2253784, -10892574, 3174518, 20156282, 3595425, +12607876, 12494597, 8892730, 21741124, 31085362, 10277320, 491774, 4535486, 12246562, -6446209, +-3505230, 8323647, -2851858, 4476430, -2922725, 13499082, 4723927, 9577240, -2688113, -3525631, +6790880, 18020072, -1347546, -14677514, 9390946, -22999550, -26776436, -9104257, 13798656, -8879308, +-26477400, -16117402, -6759742, 9706626, 6564858, -14251238, 25636660, -8200167, -18017924, 4747013, +6999186, -5869073, 8896488, -9235790, -3674345, 3372623, 2392834, -4835060, 4518306, 896038, +8083129, -4445291, -9696962, -5602785, 1605781, -2110440, -1967632, -741956, 62277, -754841, +6566468, -1106491, 1088774, -2641942, 3029563, 5447093, 1061394, 5221607, 1621887, -8075613, +-3569118, 46171, -6983617, -8251169, 3990562, 5818607, -4516695, -8805220, -9672803, 3970697, +1636919, -420907, 6283001, -3624953, 2302639, 8591545, -37467148, 2164664, 18742164, -3341485, +-4600447, 23095650, -12475269, -12576738, -16376710, -5242545, -5648956, -10672994, 3027415, 5384279, +8669928, 6371047, -5363341, -3973919, -2010045, -4470524, 1354525, 4433480, 18501646, -7903814, +-24395414, 13045963, -88047, -615254, -20326470, 9071508, 3714073, -1993939, 22738094, -6478422, +2295123, -2041183, 9913321, 12281996, -13623099, -1242856, -7734699, -801011, 6652905, -5005248, +10296110, -16313896, -13889924, -8587250, -14827838, -2477659, 1112397, 2327872, -20657182, -13375065, +9509058, 16542603, -8050380, -9164923, 8442295, -18651432, -17183090, -16362215, 17807472, -30393872, +9652402, -1600949, -18195628, -5692979, 14921253, 38732016, -5429913, -10658498, 12508555, 29700772, +10410464, -6674916, -7450695, -1342714, 7868380, -543313, 3531000, 17679160, 897111, -6598144, +-12747463, 10358387, -14993731, -10040560, -7605850, 5204964, -6351183, -10668162, -7035694, -6492917, +-379568, -7873212, 2410551, -6104223, -840740, -2004676, 7192997, -5674726, -4757750, -11623255, +-3772055, -2075543, -4227322, 11020886, -8454643, -10453414, -991064, -9176734, -8705362, -3846680, +912144, 8253854, -1416802, -3554086, -1931125, -5493263, 3526705, -11065983, -1296543, 11403138, +5089536, 7455527, -3230352, 2816962, 3312494, -2763275, -4690105, -6252399, 1868848, 2938295, +4656819, 5179194, -2184528, -21028696, -33427194, -1998770, 38429756, -6198712, -2700998, -25429428, +-1868848, -1751273, 2690797, 8338679, 1204738, 6923488, 551366, -473520, -18028126, 2517925, +16505559, -11166915, 20459614, -8658654, -1206349, -18148384, 11647414, -9070434, -5794985, -20933134, +-28236188, 14397267, -13748727, -13658533, 5032628, 2845416, -6024229, 1331977, 16098074, -4814122, +-15215995, -9556839, -19502910, -2460480, 5681705, 13495861, 2866354, -4053376, -3266860, -8173323, +4791573, 14022531, 2428267, -8876624, 16121160, -15404974, 1749125, -26502096, -7680476, -5242008, +32704028, -20662550, 6774237, -6752763, 4400194, -3856344, -3518115, 571768, 13380971, 3962107, +-23924042, 26390426, 8212515, 9390409, 3551938, -10593000, -7917236, -3069828, 3482682, -634581, +5424007, -14347338, -14756434, -2473901, 7405598, 16031502, -9808632, 13594645, -3207267, 5279589, +-10624675, 6109591, -17408576, 19617264, 1008780, 2164127, 6597070, 8838506, 1009854, -12279311, +-5767604, 3288871, -11480984, 3141232, 5616207, 4901632, -6766721, -4306779, 11924440, 2143726, +-11801496, -1730872, 10362682, -3853123, -14551886, 16647293, -4372277, 6433324, -2658048, -4781373, +-7683160, 5120138, 1569274, 5328981, 962073, 8947491, 1218160, 6437082, -2962991, 445603, +4185983, -2266669, -3377992, -16360604, -9920301, 35788888, -4542465, 3236258, -18604188, 16852378, +-9686762, 12483859, -9773198, 21734682, 2054068, 2473364, -10510859, -8245264, 12426414, 28088550, +-11644730, -16649978, 7927436, -6376416, 18278308, 23459648, 11375758, -3179887, 14289356, -9218074, +-8890045, 19761144, 26759794, -29674466, 2436320, 4780836, 5061082, -9836549, -719407, 12416750, +-30313342, 9419400, 17701170, 6978248, -13487271, -3412889, 21740588, 18127984, 5920076, -9918690, +-13368086, -25907780, 37416680, 7095286, 19240916, -2476586, -7961259, 4514548, 11205033, 678068, +-594316, -30154966, 4732517, 29080150, -5124970, 27881318, -16516834, -7094212, -11511586, 6757058, +25936234, -7833484, -730681, 23778550, 28651726, -9006010, -20900384, -18329846, -16247324, -7241315, +-6846715, 16809966, -20138564, 11325292, 12452721, -4243428, 1459752, 13250511, -2462090, -7097434, +7805030, 5829881, 4182225, 12213276, 2654290, -1789928, 10801843, 4171487, 4596689, 5782637, +-1801739, 972273, -2400350, 4980552, -19723564, -5177046, 888521, -3544422, 7760469, -14542222, +-1625108, 484794, 5327370, -56371, 8434242, 6128382, -3937948, 12173011, 6120329, -3836480, +8635569, 9580461, 155693, -5703717, 4588099, 9334038, 5556077, -1053341, -8651138, -3945464, +2354179, 1671816, 1472637, -8082055, 14144401, 10433549, 24978992, -7530152, 18096844, -9542344, +-3810173, 16859358, -550293, 22972706, -27645094, 17391396, 3191161, 7762080, -11092827, 8461086, +20685100, 40215388, -9190693, 10275709, -507880, -26552024, 24481314, 2561411, 9612137, -4774930, +-12399034, -4536023, -947040, -10233833, -6419366, 34188476, 2465848, 13217762, -9667435, 24273008, +223875, 11839077, 5046050, -14008573, -2916283, -8589398, 361851, 4498442, 28666222, 14672145, +1313723, 3528853, -900869, -2229625, 4796942, 2995203, 18006114, 14712410, 7452842, -8358543, +12545063, 26276074, -24547886, 23052164, 3799436, 7042673, -24664924, -11615202, -31022548, -24977382, +-4835597, 16925392, 14111652, -43020540, -191663, -19313394, 10358387, 43272332, 21760988, -27563490, +15283641, -11241540, -14179835, 23920284, 12125230, -12041478, -6681896, 21074330, 17242146, 9531606, +26718454, -6999723, 16437377, 14533096, -16834662, 23920820, 6642704, 27737972, 8523363, -2382096, +16356309, -1509681, 4359392, -19185618, 14696841, -9262634, 7714298, -6842420, 3481071, 9163313, +22091164, 5936719, 13482976, 3556770, 4401805, -7031399, -1489817, -2397666, 1936493, 11200201, +9556839, 16750372, 6272263, -1814087, 2797098, -3704409, -2032593, -16464757, -2646237, 4325032, +5423470, 14474040, 12906377, 11731166, 13532368, -35762044, -56166360, -14093935, -6754910, -13314935, +2611877, 19226958, -20106352, 28782186, 9895605, -40417788, -31819802, -5850819, 21879638, 1239098, +1410360, -3841848, -13406204, -39110508, 1175210, -32789390, -27972586, 13929116, 10268730, 10199474, +-5091147, -12451647, 29531122, 18396956, -13146895, -25478820, 19360638, 10435697, 4241280, -11756399, +-30758408, 11973295, -14654428, 4988068, -26250840, 31854162, 383863, -12152073, 2675765, 8340827, +25530896, 16632798, -7016903, -865973, 8703214, 9409200, 9619653, -5471252, -40896140, -31450972, +6094022, -3960497, 23379118, -4124242, -10521596, -28174986, 32889786, 13174812, -23480050, -23464480, +33760052, 32370094, -649614, 23860154, -3438658, 1231582, -9986873, -5463736, -18600966, 23012972, +-4464082, -4702453, -10063645, 9739912, -29078540, 14016626, -8699456, -4993437, 20205136, -24159, +2986076, 5563594, 18541910, 10029286, -7897371, 14367202, -4384625, 17258790, 6432788, -18479096, +4487167, -9172976, 8770860, -7359964, 537, -12125230, -6640020, 7342784, -12612708, 5732171, +4085051, 5880347, -11275900, -7499550, -14455249, -12071542, 16535087, -5552856, 10632728, 7246684, +-10348187, -967441, -9055939, 843961, -5778342, 21584896, 17689896, 12546673, 16529182, -3581466, +-18530100, -20622286, -3092913, 6910066, 30692910, 19304268, -7136625, -5214091, -8308614, -14775761, +-955093, 7501698, 10664941, 7296613, 3417720, 19219442, 2226404, -14074608, -35051764, 55455008, +1720134, -43441984, -2949032, -16364362, 7611219, 21095268, 19757386, -24302536, -38190312, 6273874, +-18111340, 5570573, -3434363, 16676821, -5252208, 2127620, 10410464, -16032576, -18967112, 1738925, +5389110, 16512539, -59056, -27194660, 18019536, -15298674, 14232985, -13334800, -8546448, -1763621, +-3937411, -29211146, 5764920, 7785165, -27624156, 11533061, -10653130, 5308580, -8993125, 26720066, +21369610, -27526982, -14118094, 18313204, 23650238, -28159416, 37135360, 2099165, 29969208, 21238614, +35305168, -11100880, -14492293, 7565048, -28663538, 4146254, 4014721, 50655920, -15443629, -48166984, +81187768, -38475928, -29027000, 46323908, 21405580, -27473296, 45641544, 4759898, -36528160, 45593224, +5896990, 3828427, -7657927, 6461242, 30800822, -7724499, -10253161, -16125455, 23027468, -8534100, +-5450314, -3464428, -8790724, -10052371, -13857175, 13326747, -1677722, -1552631, -4800163, -3788698, +2066416, -6420976, -10329933, 1075352, -8295730, -16297790, -16321949, 20421496, -8666170, 1638530, +19447612, -9485972, -8435853, 1059783, 9807021, 3792993, 4359392, 18098992, -11035382, 2371359, +-8053064, -5510980, -3373160, 30123826, 15403900, -5231270, 4631586, -16406775, 5470178, -15039365, +-8859981, 6846178, -3606162, -30733712, 19065360, 7385733, -5363878, -386547, -15346992, -2378875, +513785, -50184544, 6932614, 15055471, -37681896, 17246442, 9946607, -13197898, -3782793, -654446, +-9256191, -3024731, -5435818, -16786880, 442382, -8373039, -1879585, -4122632, 8145943, 29993904, +25074020, -23145042, -2594697, 31559956, -5570573, -5929739, -32329292, 3728032, 10552735, -5285494, +27463094, 65950296, -22240414, -27804544, 46902652, -3144990, -25379498, 29291140, 19229642, -15213848, +-22811108, -28128814, 8504035, 15063524, -12594992, 44227424, 28794534, -55212340, -53039088, 30852360, +-25007984, -32309428, 41790568, 6709276, 55968256, 26870926, -6890738, -7577396, -40542344, -31581968, +91973504, 25376814, -19856708, -44604308, 1134945, -18206904, -39904540, -6259915, 46504832, 19768660, +475668, 38308424, 33425046, -10704132, -42849816, 6549825, 25485800, -10687489, -10123775, 53393960, +30613454, 5225365, -5757404, -27593018, -27100170, -7059316, 25317222, 10160282, -10493679, -5013301, +-12125230, 9901510, -7854959, -10426033, -6806987, -1403381, 7486128, 10160282, 8967355, 3686156, +-24635932, -8696772, -4964982, 9076340, -9687299, 1529545, -2707977, 22329534, -14695767, -10267656, +23051090, 6310381, -11938935, 18124762, -6571300, 5162014, 1258962, 3976603, -14217415, -3991098, +18920942, 18522584, 7580081, -7640210, 4807142, -8747238, -7072201, -5471789, 9824201, -15921981, +-3515431, 12217034, 49428632, 42068668, -11613055, 30040612, 2559801, -22433688, 14198088, 25730612, +7941932, 11409581, -33535642, -6231998, 3384434, 7181186, -5354751, -28244242, -10841571, 10853919, +-7488813, -2565706, -24805584, 37810208, 4182225, -30315490, 16953310, 44301512, -23107998, -12705587, +5920076, 14924474, -14628122, -27131308, 23177792, 40321152, -3688303, -15217069, 4682051, 11739219, +17661442, 25987774, 1183800, 46933792, -1539209, -51327544, -96637, -5388037, 16384763, -4980015, +-42777876, -732292, -18765248, -17395154, 24866786, 13776644, 13961865, 18663244, -38401840, -19383188, +-7170985, -74088, 14778446, 966905, -8268349, 1498407, -13497472, -25390772, 1975148, 40592808, +-21180094, 4257923, -16581258, -11055246, 26925686, -33349884, -920197, 15275051, -12496207, 5974300, +3662533, 8837969, 9180493, -17413944, -21935472, 36384816, -8041253, -11238319, 17952964, -18030272, +10986526, 2736968, -8167954, 6086506, 14975477, -2536715, 1509681, -7250442, 3143916, 1389959, +-1639067, -6430640, 7890929, 4670240, -1473711, -313533, 6506339, 6341519, -7272454, -11550241, +5900212, -313533, 2681133, 1101659, -3760781, 6574521, -494458, 5523328, -2658048, -567473, +-4162360, 1374926, 5082557, -891206, 13702556, -5449777, -5087926, 1059246, -7004555, 4403415, +8941048, -43456480, -61774516, -55067924, 110521320, 105046312, 105297568, 296404288, 105611096, -12462384, +19736986, -205365472, -249640672, -84194240, -139990704, -194542160, 25186226, -11039140, -32314798, 213711664, +130798936, 54295904, 334333664, 157492160, 29353954, 152088544, -35952096, -182061520, -173921472, -166131488, +-229686800, -225322032, -52682604, -81506128, -132346200, 154469040, 71421008, -55996172, 223621760, 71910640, +-26088706, 252391072, 230351440, 52754548, 239036400, 242117504, -9156333, 59913184, 27577448, -233574288, +-270684416, -201976736, -381123040, -361348480, -216721904, -289900096, -217735520, 24393804, 179225760, 202946864, +436866880, 396795936, 350273920, 376967136, 278385824, 140979616, 43250856, -30924302, -212477936, -256613024, +-274256736, -309524864, -293268416, -250400896, -161514928, -117741696, -114722336, 21585968, 69672424, 136331392, +325111296, 337201632, 230875968, 288127872, 122037200, -40197136, -95472288, -148344944, -202755744, -147261008, +-98185640, -98156112, -33674692, -9592273, 839666, 51626580, 66114044, 62568008, 96487512, 60329260, +39298412, 48235704, -28786482, -27060978, 8172249, -78685952, -55397560, -20859582, -75618264, -47160352, +-5304285, -76572288, -80418968, -53872312, -78929152, -52296060, 59260348, 110400520, 176386256, 259783776, +242857312, 207364240, 195342096, 105098920, -32502702, -163337600, -288167616, -342635296, -308623456, -250413232, +-188777232, -89234392, 27912992, 110945448, 156483376, 168397616, 149017648, 132417600, 123573192, 124018256, +86437824, 40044128, 18291192, -12176769, -36501316, -33727304, -59032176, -64124936, -45552424, -35300336, +-45694692, -44913548, -56786448, -65630320, -64938832, -56726316, -46354508, -15621333, 23014046, 52843132, +70893800, 90907280, 89882928, 74788264, 53563076, 32307280, 12123619, 9306120, 1151588, -12102144, +-22018686, -24888798, -32581622, -36738076, -40644348, -44139916, -46322296, -31825170, -17904108, -5712307, +-137439, 6755447, 12523051, 22112640, 22662932, 15803869, 7158637, 11808476, 17511656, 18367964, +17174500, 16449725, 14377403, 16482474, 14841796, 7766912, -1653562, -6953552, -18049600, -22174380, +-23832774, -24934970, -28201292, -24932822, -25971668, -23615878, -14461692, -2006287, 9957345, 26101590, +36421860, 42974368, 40807560, 31504658, 14549739, -217433, -12787191, -17411260, -20653960, -17745194, +-14516453, -9337259, -6227166, -3047816, -2709588, -244813, 470836, 2520609, 2251637, 3777961, +2629057, 3165928, 1622961, 1675574, -47245, 306553, -886911, 117038, -667867, 397284, +-485331, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -3626026, -13776108, 7361037, 6051609, 3442416, -1507534, -387084, -1458141, -2828773, -4032438, -2775086, --4118874, -1673964, 3842922, 1374926, -241592, 47782, 2507187, 1237488, -1647657, -1679332, --1341640, -7150584, 2951180, 811212, 35433, -1429687, 901943, 185220, -2024540, 1098438, -2605435, 49392, -3321084, -776852, -1452236, -1469416, 376347, 3233037, -849330, 812823, --3794604, 2483028, -4680441, 3031710, 631360, 242129, 11274, 3017752, -3597035, -2584497, --4892505, 1360968, 853088, 309238, 2757906, -2933463, 628139, -340376, 60130, -2119030, -1910187, 952946, -1632625, 3074123, -4804995, 2266669, -2629594, 4952098, 2206003, 932545, -333397, -900869, -5987722, 4624606, -1447404, -74088, 767725, 1345935, 1072668, 1278827, -1427540, -358630, 407485, -588947, 1394791, -27380, 789737, -1735167, 607201, -207232, -385473, 801548, 1937030, -32749, -340376, 736050, 762357, -709743, 999117, -1110786, -976568, 288837, 869194, 147103, 560493, -229781, 219043, 844498, 374736, -46708, -578747, -45634, 388158, 420370, -50466, 548682, -155693, 13286481, 6214281, 8701604, -2284386, 3011846, -578747, 3453691, 277025, 3078418, -2288144, 5927055, -1560684, -6602439, --1908576, 216359, 290984, -2042794, 5048197, 362388, 1926293, 5030481, 2348273, 135828, --81604, 1258962, -4591857, -2909304, 1721208, 2233920, -1717987, 550293, 2135136, -4401805, -6245420, -569620, 857920, -923955, 2273648, 3338263, 90731, -3347390, -3568044, 6933688, -80531, -1925219, -362925, 4027069, 2846490, -1961726, -2824478, -5968394, -1950452, -2401961, -178778, -2161979, 467078, -5796595, -2473901, 759672, -2467459, 1370632, 2296734, -1112933, --230854, 1190780, -1565516, 2391760, -242666, 2988760, -36507, -922881, -3452080, 461172, --4264903, 1397475, 4832, 2452963, -28454, 2516851, 3069828, 2755759, 31139, -1658931, --203474, -556198, 3396782, -855235, 374199, 2297271, 2249489, -81604, 1238024, 548682, -1125281, -408559, 1377611, -467078, 2064269, 569620, 339302, -94489, 122407, 298500, -1003949, 2779381, -8902393, -2887829, -2025614, 1540283, 1760400, -6102075, -2729989, -1217623, -1462436, 3228742, 1019518, 4430259, -3665218, -5308043, 1534377, 169651, -951872, -3639448, -11770895, -623844, 3131031, 693100, 366146, -274878, -1814624, -4485557, -3514357, -1110249, -3007014, -2510409, 6162741, -2097555, -576063, -5062156, -6013491, -528818, -3835943, -2143189, -8197482, -4492536, -1243393, -4362076, 1593433, 196495, -1579474, -4583267, -872415, 26844, --5191005, 600759, -2794950, 4140885, 2728915, -2401424, -1273458, -1332514, 1271310, -237834, -3296924, -1716913, -2167885, -2236604, 7475391, 6740951, -2318209, -6514392, 881005, 2000918, --209380, 1900523, -2702071, 520765, -3133716, 2225330, 170188, 7168838, 4426501, 6815040, --6215892, 2680597, 4159139, 149250, 3156264, 2263448, 469762, 4685273, -864362, -509491, -1202054, 642098, -1929514, 1862942, -1478543, -1276142, -133681, 467615, -211527, 701690, --1104880, 540092, -141734, 136365, 607738, 854162, 411780, 991601, 938450, -725850, --946503, 734439, 274341, -1698660, -690416, 1348620, -828392, -29341606, -4699231, -8488466, --9533217, 2529736, -3198140, -8375186, -6860137, 1109712, -6758668, 919660, 10182294, -2566780, -4393752, 3252901, 8591545, 2176475, -5915781, 1320166, 9333501, -4384088, 4665945, -6903086, --6211060, 2004676, 2704756, 7259569, 467078, -4524748, 4278861, -3049964, 3292093, -420907, -4646618, -3951370, -2498597, -4402342, 92879, 750546, -1672353, 3307662, -7658464, 949188, -7794292, 1640141, -2166274, 2947958, -3933653, -2051921, -9680856, -2918430, -289910, 1480153, -197032, 5179194, -7767449, 717796, -1039382, 3889093, 2131915, -1548336, 5587753, -4913980, --625992, -3951370, -7465190, -3197066, -1695438, -2158758, 5665062, -5086852, -8069170, 279710, -2680597, -850940, -2308545, 2745558, 3122978, -2304787, -1800128, -3187403, -1272921, 6478422, --3000572, 3554622, -1050656, -152471, -574452, -257698, -3352222, 788663, -1997160, -135828, --214748, -525597, 104153, -816581, -1034013, -1076426, -261456, 290984, -629750, 1043677, -504122, -14596446, 8338142, 9349607, -484258, 5240397, 2416993, 11050414, 14737107, 1875827, -1953673, 4208531, 1857573, 2434710, -2060511, 2901251, -2393371, 3856881, 4533875, -12610024, -6564858, -1389959, -2301566, -3906273, -5068599, 2052994, 3617436, 5731097, 1156957, 970126, --7321846, 315680, -2109903, -2464238, -1051193, 978179, 464393, -569083, 7274601, -382252, --2360085, 2384781, -2770254, 3702799, 4930086, 5463199, 2883534, 595390, -3001109, 6103686, -1983201, 818728, 682900, 801011, 484794, -3536369, -4933844, 4517769, -4595615, 4328254, -3997004, 2901251, -596464, -3279745, 3003256, 3846680, 8578123, 3939559, 3265249, 1999844, --8303783, -2567317, 1069447, -1363652, 3636227, -7230041, 406948, 2390149, -6722161, -635655, -2312840, -1638530, 910533, -3964255, 1539746, 510564, -1649268, 3120831, 1878511, 125628, -3464428, -1548336, -1464584, -342524, 754841, 1400159, 5230734, 848793, 1815697, 1225139, --1074, 1134945, -808528, -982474, -1347009, 916976, -718870, -661425, 631897, 553514, --586800, 1762010, -981400, 1233193, 1181653, -513785, 1752884, 493921, 775242, 853625, -163746, 186294, 2029909, -139586, 27090506, 8092256, 2059437, 5229123, 13574244, 5388037, -16355772, 3934190, -3532074, -1225676, -1304060, -1611687, 4484483, 6928319, -3182034, 1445257, -4932233, -1864016, -6708202, 5327907, -572841, 2505577, -2241973, -3451006, 5602785, 1240172, --442919, -1626182, -6103686, -3100967, 3408057, 789737, -2055679, -1130113, 1002338, 2276333, -6274947, 1916092, -5652714, -1357747, 438624, -1840930, 2127083, 2900714, -5695664, -7001871, --334471, 1705102, -668404, 5339718, -9852118, -2144263, -4430259, -5620502, -542240, -467078, -1537061, 5280663, 18790, 767189, 1788854, -890669, 7158637, 4491999, -5746130, -5133560, -3956739, 8556649, -670552, -4044786, 8540006, 4450660, 2034741, -3749507, -3966939, 4160213, -288300, 3141769, -1845225, -6172942, -3318399, -4207994, -2581275, 2407866, -3358665, 452045, -1537598, -1253057, 1493575, 1015223, 1282585, 695248, -2147484, 1215476, -630286, -1184337, --468688, 1641214, 1366337, 206695, -1835562, 1682554, -684510, 2915746, -390305, 392990, --2721936, -3597572, 1262720, -3386045, -589484, -528281, -1843615, -923418, 477278, -3036542, --1199907, -312459, 400506, -636192, 2199023, 300111, -745714, 13365938, 6340983, 12045773, --4131222, 198642, -3139621, 12135430, -12481712, -1656784, 3069291, -2270427, -2552821, 4130685, --1492501, -3714610, 10457172, 6069326, 1115081, 17941690, -4975720, -1085016, -3877282, 238371, -2845416, -4502200, -693100, -2287070, 6707665, -5653251, 1431835, 504122, -1909650, 725313, -3901441, 2833068, -5516886, -9342628, 122407, 2049773, 7722351, 9285719, 9037685, 939524, --5368709, 6681359, -16047608, -2516851, -6364068, -9174050, 6393059, -2026688, -3106335, 5171678, --1938104, -2609193, 13816373, 276489, -4206921, 4958003, 273267, 3800509, 2617246, 1927904, -8331163, -4941897, -3201898, 609349, -7339026, 56908, 1269163, -1721208, 2382633, 4284230, -8764418, -3227668, 2856153, 7774965, 4549444, 2388002, 1345399, -2518462, -5697811, 2984466, -4170413, -810675, 327491, -763967, -815507, -3064996, 524523, -853625, 446677, -2852932, --1600412, 134755, -622770, 2883534, 1098975, 137976, -3935264, -1611150, 1802276, -2109366, --142271, 1606318, 1401770, -2459406, 2306398, 2010045, 515396, 2614561, 2133525, -4307316, --895501, -1575716, 1101122, 2537789, 2825552, -477815, -1739462, 517544, -994285, -20691004, --31077846, -5250061, 1542967, -550293, 861141, -1467268, -6233072, -3526168, -4969814, -1352378, -5051419, 6012954, -5476620, -8090645, 6899865, 1411434, -4437238, 340376, -741419, -4944581, --4135517, 11442867, 5829345, -6189048, 3125663, 1271847, 4897874, -6007586, 6649146, -6680285, -4566087, 2960843, -1418413, -3134253, 2944200, -12435004, -6168110, 7563975, 12222940, 6755984, --8578660, 164283, -6088116, 8098161, 1666447, 2070711, 561030, -6746857, 3237869, 9912248, -1105417, 7481833, 5309117, 3401614, 5735929, 12164421, -3410204, -12342662, 5938329, -15032, --2935073, 574989, 10544145, -4370666, -7370701, 3548717, -1971390, -1307281, -2807835, -1708860, --3333968, -5806259, -2918430, 7026030, -9688909, -6121939, -3593814, -7000260, -6781754, -467078, -4159676, -6426882, -149250, -2419140, -2721399, -5799280, -3659849, -6650757, -388695, -5129802, --429497, -192737, 4590783, 3224984, -2385854, -2576981, -3403762, -1083942, -2420214, -2340220, -2765422, -4552129, 1654636, 325344, -2897492, 248571, -1911261, 1021129, -1009854, -3732864, --4534412, -102542, 1136556, 1802813, -896038, 729608, 1374926, -61740, -2390686, -380105, --3049964, 251792, 1348620, 1030255, 1279363, -11861089, -7886634, 2116345, 1819456, 16039555, --14032732, -9439264, -5478231, -2538326, -1823751, 5253282, 4887136, -7282654, 7488276, -1660542, -3343632, -5217849, 11209865, -2101313, -4354023, 7404524, 5175973, 4348118, -7783018, -7136625, -9474698, -4915053, 2729989, 2435247, -3560528, 8229158, 2382633, 86973, 1716376, 6065568, -7572028, 2456185, -6903086, 1679869, -9812390, 5895917, 2447058, -10792179, 7631083, 1889249, --5747740, 10063108, 3085397, -2608656, 5730560, -811212, 10926934, -2426120, -2840047, -2243047, --1524177, 14415521, 2944200, 335544, 3818226, -11949136, -7598871, -8092256, 818728, 7710003, -937914, 9540733, -12295418, -4939213, -7829189, -7101192, 17755394, -1730335, 6298033, 4654671, --3896072, -811749, -2552821, 1432372, 871342, 4948876, 2901251, 9830106, -5323612, 889058, --1733019, 2197413, -133681, -113817, -95026, -2002529, -9270150, 3502546, 2083596, 1438814, --2509872, -794032, -1246614, -5065914, -391916, -1769527, -3403762, 1938641, -2881923, 1269163, -1581085, 1358820, 2047089, -3510599, -2008971, -2359548, -2263448, 1345399, 2494839, 1560684, --906775, -426276, -696858, -1057099, 3654480, -1223529, 2583960, 1706176, -1069447, 1168231, --794032, 49929, 868120, 1042066, -16153372, 5048734, -6943352, 3936875, -4860293, 13048648, -2188286, -9134859, 1427540, -9313100, 7548942, 14420890, -12305081, 8123394, 2995203, -358630, -5933498, 15370077, -5888400, -14496, 4688494, -16779364, 972273, 7634305, -4676683, 5471789, -5946382, -3061238, 15046881, -7505992, -13633837, -5859409, 1628866, 363998, -2799782, -5873905, -4093641, 3802120, -5906, -9591736, -2263448, -2430415, 6396817, -4201015, 25241522, -3176128, -3602941, -1161789, -1086090, -12253542, 1245004, 9088151, 7339562, 24630564, -2661806, -2384244, --5114769, -971736, -6948184, -525597, 9862856, -5259188, -1036161, 1788317, 2314987, 9709847, -7885560, 2233920, 19050864, -3607773, -17677012, -17680770, -12486007, -2569464, 5560372, -1745904, --4660040, 8409546, -530965, 7466801, -4623533, -878321, 6046240, 5143760, -1891396, -1809792, -598074, 1572495, -1983738, -4132832, -5956583, -2006287, -2544768, -753767, -4254702, 3157338, --1296543, 944356, -2167348, -3049427, 4051228, 1820529, -2108829, -571231, -1734093, -1823751, -1750736, -1139240, -2047089, -4025995, 3144453, 1248762, -1755568, -3052111, -4075924, -767189, --2813204, -2820720, 3383361, -2031520, 646929, 129386, -1505386, 1458141, 634045, -563714, --788127, -905164, 28686086, -20657718, -15741592, -4974109, -9954660, -11293080, 13909252, 5714991, -2774012, -4312684, -2794413, 16980154, -4916127, -7027640, -20225538, -2835215, -486942, 9640054, -3541738, -4011500, 1270774, 8474507, 3815005, 5345087, 12984223, 16372415, 4547834, -5935108, -4231080, -9636833, 6741488, 5614596, -3440269, 465467, -7507603, 3195456, 264141, -14519674, -14355928, -1136556, -6583648, 8975945, -13494787, -2979634, 15003931, 8676908, -108448, 725850, --18707804, 6768869, 10591389, 6167573, 3585224, -847182, -13770202, -40575092, -3146064, 8501888, -11566884, -848793, -11838540, 20340966, -9205189, 9400073, 15375446, 12777528, 2471217, 15417859, -1869921, 5643050, 3362960, 9454297, 1966558, 3164317, 19516332, -6249178, -4063576, 16615618, -8704288, 4691715, -6585796, 1902134, 13496935, -1183264, 10857677, 2719251, 2517925, 6990596, --3415573, -51003, 917512, -419833, -2803003, 5523865, 2646237, -6991133, 4220342, 3018288, -4078072, 2202781, -1862942, 300111, -2086817, -2356327, 3464428, 4417374, 1952600, 2806224, --1920924, -1791001, -1188095, -2272575, -3164317, -4796405, 1017907, -2952253, 2720325, -864362, -1701881, -4389994, -2840047, -646393, -1265942, -1047972, -1870995, 974421, 4855998, 5126044, -2088428, 751082, -2355790, 4140349, 14743549, 13261248, -3218541, -7385733, -966368, -4516158, -16099685, 9822590, -27028766, -3392487, 2595234, -13246753, 5461588, -19145354, 14611479, 3068217, --1857037, 7407745, 4221416, -4326106, -5954972, -4979478, 20483772, 431644, 185757, 4079145, --2385854, 7696045, 24068996, 9297530, -3129421, -4560719, -3151969, 13379360, 5218922, 13553306, -9959492, 6582575, 4338991, -6420439, -6341519, 5850283, -13764296, 2052994, -7160784, -6611566, -799938, 9379135, 1684701, 434329, 3806415, -3408057, 16595754, 20769924, 24477556, -456877, -11343009, -14683419, 5853504, 7972533, -6264747, 11958263, -9525701, -19979114, 2920041, -10626286, --1231045, 598611, -10130217, 2301566, 14587320, -8994735, -8156680, 6874632, 13536126, -903554, --4559108, 11853573, 1389422, 2418067, -8049306, -2029372, -266825, 9739912, -4785668, 522912, --2052458, 1911797, 111132, 1662152, 2849711, 1506460, 317828, 715649, 2489471, 2554432, --1990717, -4816806, -523449, -942208, -3930969, -5412196, -104690, -2624225, 3976603, -3735011, -3088082, 4628901, -62814, -8291971, -594853, 1351841, -2602750, -4023848, 775778, 2022930, -12766790, 3978214, 4076998, -587337, 495532, -1277753, 3864934, -1084479, 4100620, 10338523, -9780714, -1414655, -372052, -1971390, 664109, 3083250, 3913252, 5421323, 1213865, -17067126, -31088048, 1981054, 8065949, 23797876, -8814884, 2441689, -4564477, 6280316, -6886980, 6870874, --16770774, -19845970, -639413, -11753715, -933619, -1095754, -1369021, -3354906, 1232119, -5506148, -4920959, -15784542, -6349573, -21295522, -1119913, 4878009, 10166724, 22986128, 12703440, 3966939, -2888903, 6593312, 5048734, 3868692, 9237401, 9721122, -3140695, -19467476, -19337016, -13242995, --7955890, 1912334, 6448894, -7147900, -11359115, -19758998, 515933, -7566122, 17955648, -8062191, -4470524, -13727252, -6664179, -2435783, -5688148, -26501022, -27628988, 7521025, 2761664, 672699, -14076218, 8022462, 11286637, 9098351, -17238924, -3788161, 32156958, -6021544, -12254615, 4680441, --7157026, 3233574, -19954954, 7996692, -9191230, 1294933, -1376537, 13007845, 705985, 5174362, --11384885, 2074469, -6451041, -2948495, -7833484, -5952825, 3986267, 4469451, -10417443, -3555696, -677531, 1870458, 2501282, 1279900, -4084514, 4436165, 1793686, 1463510, -612033, -382789, -1349157, 4487167, -4996121, 4531191, -1305670, -258235, -1828046, 2838974, -2971044, -1795833, -3994857, -7777649, -233539, 1387811, -4750771, -1720671, -10834592, 7619809, 9050033, -740882, -2074469, 2306398, 3032247, -4923107, 5006858, 3119757, 3890704, -3631395, 2087891, 2921115, -4613869, 18566070, 13973139, 1933272, 14853071, -2698850, -6172405, 8281234, -11466489, -22173842, --33356326, 2891050, 647466, 12973486, 9350144, -12307229, -6405944, -32421098, -2238215, -15044197, -3482145, -7518877, -3690988, -6153615, -2463164, -2429341, -11348914, -4976257, -13217225, 10610717, --2695092, 9096741, 23251342, -12198781, 6653978, -1802813, -5836861, 6113886, -12518756, -21093122, -10127533, 5092758, 10073309, 6445672, -44467408, -20049982, 5867462, -14671608, -1306207, -12518219, -18536006, 22504018, -1150514, 24864102, 3438658, 11358041, -3321084, -703838, -13895830, 8884140, -17840758, 3993783, 29742112, 820876, 4050691, -8631274, -13146358, 17752174, 27911382, 9877351, -5382131, 2873333, 10528039, 1031329, 1976222, -26048976, -19236622, -1869385, 1353452, 3586835, -19634980, 21278878, -3936338, 1508607, -7301445, 4524748, -13588740, 464930, -14376866, -12032888, -6241661, -236223, 1549410, -7949985, 5151277, 6452115, 4235375, 6532109, 7552163, 773631, --4320737, 3440269, -5892695, -1318018, -3641059, -8494908, -2486249, -4647692, -3844533, 7259032, -3938485, -2433099, -5666673, -8414915, -5586679, 5864778, -5666136, -450435, 459562, 4046933, --8039642, -6318971, 2860448, 10097468, 6381248, 2675228, 1074, -5907728, -715112, -3554086, --6944425, 11997991, -17316234, -8686571, -32442572, -40658308, -29970282, -13834627, 9296457, -366683, --7033546, -14920716, 130460, 26661010, 13204877, -23513872, -3754875, -4942971, -16446504, -3054259, -1319629, 11163157, 8395587, -17570174, 12648142, -9971840, 5424544, -9296994, 2879776, -13486197, --4906464, 6524056, -24082418, -4725538, -9021579, 7836705, -5924371, -22442814, 26373246, 25239912, -435939, -10341744, 14407468, -34336652, -10635413, 10096394, -11431055, -7374996, -795643, -11165841, -2281165, -2949569, -22863722, 9750113, -2839510, -7153805, -7766912, -6161131, -1352378, -6383395, --9648107, 18945100, -8984535, -9099962, 9139690, -339839, 31330712, -6351183, -19292994, 10981158, --10037875, -8692477, -15036144, 10385231, 19351512, -37701224, 3027952, 31647466, -5088463, -2063195, --12483859, 21544630, -1456531, -11858942, -1492501, -11139535, -8793946, 15581604, -9345849, -887448, --5156645, -6649146, -10934450, 4558034, 3747896, 5638755, -1244467, -8967355, -6019397, 225486, -1622424, -13607530, -3807489, -8789114, 13507672, -4592394, 1023813, 1814087, 1726577, 1327682, --10868415, 7277285, 430570, -4275640, 9867687, 1417339, 12892418, -2375117, 14886357, 3336653, -6044093, 7159174, -9538585, -6431714, 4746476, -7997766, -6104223, 2242510, 93416, -5652177, --12916040, 6238440, -1804423, -25639344, 51239496, 36588288, -730144, -9760313, 8099235, -30726732, -471373, 38268160, -6787122, -13293461, 580894, 43364136, -6257231, 9520869, -9274445, -19610820, --15913928, -4014721, -7304666, 7984881, 11024644, 594853, -16382616, -22856742, -21086678, -3405372, --4691178, -11348377, 10544682, 8579197, -9264244, -11225971, -12312597, 6867116, 2316598, 8442832, -21591874, -147640, -18580566, 12549358, 4875862, 4224101, 1238561, -368293, -9001178, 16015933, -8130910, -6446209, -7744363, -5108864, -21111374, 5773510, 15322833, 4650913, -14813342, 17202418, -12542915, 7098507, 1828582, -9082782, 4646081, -30010010, 4590783, -1899986, 26644904, -9645423, --13340705, 5636608, -7012071, -601832, -19431506, -3545496, -5291400, 25923886, -16995722, -31537944, --20646444, -40970228, 7909183, -8381629, -2840047, -21896818, -14069776, -36223756, -16156056, -12707734, --2010045, 8806830, -11822434, -2107755, -2358474, -1907502, -3374234, 7686381, -13728326, 5823439, --5497558, -10629507, 1466195, -3119220, 9543417, 4951024, 20938, -5373541, 12363063, 11632382, -6882685, -4614943, -6448357, -6283537, -5919539, 13079249, 21321292, 2439542, 19570556, 21658984, -7036230, 297963, -19663434, -2172180, 3403225, 2758443, -2057826, -5433671, -16702054, -465467, -10810970, 1684164, -12614319, -3231426, -9555765, 48660904, 1969779, 8034273, -8090108, -16030965, --21452824, -7159711, 6118181, 14218489, 11858405, -10372883, -15032, -21548924, -7814693, 7655243, --18065170, -9762461, -6817724, 26239028, 13769128, 14421963, 13722957, -15284715, 2852395, 5481989, -6263136, -1516124, 17790828, -3951907, 7864085, 13713831, 5327907, 3777961, 11683385, 15924665, --9354439, -18816252, 12604655, -2080912, 112206, -19883552, -18414136, 4203699, -9185861, -7230578, -16275779, -16760036, 21508122, 13807783, -9472550, 11254962, -12523588, -12718472, -15295989, 22119082, --15482820, 6941204, 6818798, -25438018, 2462090, 2896956, -19993610, -34592740, -30835718, 22454090, --23164906, -476741, -20824148, -4874251, -14875619, -1311576, 9707163, 5850819, -15140297, 15686294, -18337900, 38159172, 10060961, -25773562, 9125195, -15890842, 8629126, -22679574, 12198244, -9754944, -1770063, -4716948, 9326521, -2872260, -9118216, -21773336, -21553756, 2329483, 2164664, 13618268, --9681930, -1007707, 21450678, 5980205, 14895483, 4424353, -3790846, -1700807, -4999879, -14370424, -5213554, -17321066, -10110353, 3648038, 14384382, -18898930, 10580652, 1910187, 13606456, -4641786, -7654706, 13602698, 15112379, 15069966, -6800007, 7329899, 11865921, 12677670, 2571612, 7553237, -4052839, -5842230, 23527294, 10828149, 11904576, -10129143, -11198053, 2925410, 3961571, 4523138, --9756018, 804233, -21365852, -421981, 3660923, 4101694, -18845780, -19755776, -31079458, 21531208, -2255395, 7348689, -5089536, 11368778, -8499203, -8471823, 6454262, 16367583, 3869766, 10730976, -33520072, -4942434, -20231444, -43077448, -6127308, -16704738, -8184597, -10334765, -19985020, -14163728, --29850022, -3565897, -490700, 10339597, 30896920, -25853018, -9953050, -4343286, 10089415, 10846403, -30597348, 4058207, -35047472, -8149701, 7127498, 27261768, 7128572, -42506756, -17058000, 38252052, -3429532, 38156488, -22588306, 1119913, 2924336, 23047868, -2231773, 20960514, 31685048, 4373351, -26866094, 18779744, 4485557, 37196564, 31801548, 10219875, 49638012, 38070052, 23858544, -40424232, --2712809, 15657303, 9070971, -603443, -29313152, -35058208, -18170932, -50125488, -8003672, -37313064, --14287746, -9699647, -53630184, -50922208, -35444756, 17313014, 433792, -11880416, -745177, -4000762, --1197222, -10027138, -5354751, 12302934, 4844723, 2008434, -1807108, 1829119, -2553358, 7561827, --1416802, -13515725, 23111220, 3599183, 5475010, -7057168, 1008244, -974421, 12054899, -789200, -6978785, -4350265, -12829067, 4931696, 9715216, 25542708, 22720376, 1351841, -350577, 16246251, -8046621, 19003082, 15811385, -5252745, 18252538, 10122164, 3591667, 11383274, 7355132, -6713571, --3091303, -14862197, 8882529, -13284334, -5952825, -23219130, -14104673, 6804839, -27217208, 29079612, --12339978, 18874770, 9918153, -25286620, 4086125, 14969572, -9364102, -26396870, 17564268, -7487739, -15074261, -9163313, 4124242, 5539434, -15606837, -2347200, -6678138, -798864, -25778930, -21007222, -25777320, 708133, 10633802, -20519744, 21134460, 18116708, -13638669, 11376295, -19957102, -4819490, --11034308, 14279693, 36479840, -1089848, 44188772, -11549704, -1778117, 1654099, 4800163, -3436511, --24437290, 42608224, 28365038, -3781182, 23868744, 18020072, 24761560, -9702331, -281320, -44136156, -20046760, 20189568, -5420249, -7874823, 27633282, 14069239, 14690936, 33666640, 5948530, -17884244, --20851530, 6005975, -6383932, -25534654, 21052320, -29518774, 1473711, 6088653, -20496658, -32748052, --21800180, -8623757, 2517388, 25753698, 17722646, 7965017, -49431316, -14326937, 30090540, -2749316, --10616622, 8452496, -26709328, -17146584, 22805202, -488016, 503048, -9940165, 319438, 13380971, --4097399, -10529649, 7984881, -3894462, -18966576, -10786810, 2046015, -1824287, -1010928, -88047, --8235063, -380641, -12982612, -18071074, 2538326, -2046015, -28912646, -3677566, -17451526, -10576894, --3077881, 3979824, 5458904, 15518791, -14551886, -10437307, 3368328, 15100568, -16124918, -17855252, -24656870, -4270808, -1233193, -5134634, -9127, -10733660, 4516158, 11017665, 6458020, 9523553, -860604, 3273839, 399432, 947577, 3810173, 7858180, -6274947, -2044941, 3435437, 5571647, -3225521, -37112276, 21213380, 32320166, -384400, 37285684, 11595338, -32851132, -19841676, -2818036, --11106249, -20078436, 21206938, 24283208, -2128693, 16827682, 23235774, -18405546, 16458852, 27332636, --1440962, -37476276, 14862197, -1295470, -7152195, 10041097, 28357522, -9213242, -13928042, 6670621, --12093017, -16374563, -891206, 24489366, 21336860, -35319664, 11397769, 14807437, -23333484, -15272904, -28689308, -7950522, -41137196, -5483600, 35034048, -11545946, -59541668, 62517008, -17594334, -7412040, --30665530, 40338332, 13449153, -14125074, 29724932, -17490180, -12700218, -7716983, 75688600, 25034290, --31323196, -28082106, 29192356, -6836514, 42378444, 650688, 31873490, -43638480, 35034584, 59826212, -5925981, -6561637, -10297184, -10570451, -23658290, 56450364, 38283728, -33935072, 9762461, -35661112, --5823976, 3745212, 7679402, 4909685, 10760504, 907312, -38716444, 18162342, 2643552, -4119948, --577673, 17854716, -7509214, 3905736, -5429913, 9232569, -3430068, 2342368, -5968931, 11650636, -730681, -2406256, 6923488, 9354976, -21080236, 2536178, 13703093, 5076652, -15119895, 8176007, -24430310, -23716810, -36514200, 7192997, 4823785, 14368276, 14370424, -1965484, -32960116, -11262478, -9342628, 4575751, 9602473, -5029407, 1648194, -1351841, -10834055, 9663676, -8422968, -4042101, -27074400, 61814244, 11985643, -23951958, -5672578, -5903970, 10870025, 9266929, -19291920, -27580132, -7364259, -23348516, 4649839, -14553497, -16672526, -3676492, 2834679, 7853885, -18589156, -7565585, --7369627, -23199802, 19412178, -7338489, 1249836, -3494493, -15443092, 6062883, 4338454, 472983, --3343632, 105764, -576063, -9197136, -19655380, 8329552, -9766219, 8447664, 5972689, -19708532, --15915001, -1882806, -2306398, -2316598, -4243428, 15924128, -11100343, 1555315, -20881058, 17719424, --20461224, -10900090, 10125922, 199179, -16408923, 12928925, -22053046, 1586990, 6590628, -673773, -2368675, 10458782, 4966056, -22780506, 11438035, 1517197, -13735305, 19366008, 7618735, -21627844, --2406256, -17265232, -2312840, 6895570, 5701569, -22021372, 27869506, -14862197, -8169028, 15446313, -10257993, 2449205, 10320806, -958851, 14464376, -6558415, 2913062, -1893007, 6966974, 5398774, --4234301, -5131949, 5523328, -7063074, 674847, 1118302, 857383, -4185983, 620623, -3911105, --6370510, -3507378, -6927246, -445066, 5070746, 8888435, 3259343, 985158, 4667019, 5794448, --8247948, 12504797, 3217468, -471910, -8373039, -4784057, 3852586, 9878962, -2032593, -274878, --4989142, 1568737, 1327145, -4170413, -5679558, -5013838, -13074417, -4795868, -5172215, -37270652, --46196668, -17137994, 140181296, 111932216, 74486544, 135393472, -53650048, -128351336, -40929428, -207361552, --80572512, 5742372, -48380660, 94933272, 130046776, 21129628, 82752208, 141669504, 3310346, 38977364, --9000104, -166731712, -137624176, -104264088, -103234904, -51078972, 79307648, 42402064, 61435748, 173954768, -74080672, 10727755, 104480984, 48369920, -59404768, 20262046, -49780820, -168939312, -40350144, -88296472, --173680960, -28976534, 4323422, -42566884, 118004760, 135805248, 53891104, 159705136, 161977168, 30131344, -62635120, 28004260, -101885752, -114612280, -106918912, -192938528, -170141376, -64991980, -78841640, 16670379, -103666016, 141468176, 117253680, 180717728, 134419056, 71949832, 10296110, -22557168, -103901704, -126967824, --93415000, -111559088, -92699352, -4059281, -4912906, 21184926, 100746512, 48422536, 61683248, 96221224, --1659468, -29931090, -15545097, -60267516, -34130496, -20172388, -21897354, 24756728, 51219096, 19784230, -28519656, 32111322, -22996328, -8253854, -9575093, -61426084, 8858370, 25792352, -66283692, -704912, --5792301, -67152352, 25383794, 11486353, -75803488, 48258252, 72078680, 17015050, 144827904, 90020368, --1432909, 77054936, 14229227, -97466232, -80732504, -126968360, -180053088, -135258720, -87785912, -47177532, -61988728, 133791456, 156934352, 195139152, 191397168, 135486352, 30331060, -13999446, -96536904, -176648784, --171616160, -152574960, -127942240, -27273042, 14398878, 22842784, 89078696, 94531160, 65950296, 67800888, -52951580, 23376434, 32805498, 23974508, -4731980, -10854456, -26884884, -55110872, -59734944, -59287192, --60063508, -45511620, -9881109, 2686502, 19469624, 40834940, 49560164, 52799108, 52614960, 38297148, -12673912, 86436, -14816563, -26673358, -30714922, -23895050, -24931212, -19400368, -6634114, -4094715, --6136435, 509491, 1262720, 1978369, 15060840, 16094853, 7620346, 10130217, 8276939, 4808753, -10649371, 8918500, 1738925, 609349, -7515119, -13951128, -12724377, -12803834, -13896904, -10638097, --6460705, -1726040, 4377646, 10545218, 12138651, 12225088, 11315628, 7940321, 3300146, 998043, --3935801, -7623567, -6795712, -5242008, -4534949, -571231, 1367947, 2940442, 2141041, 1300301, --1304060, -2422899, -4431870, -4017405, -2769180, -553514, 440234, 2940979, 4458176, 6529961, -6132140, 4676683, 2588792, 1676111, -1213328, -2881386, -4314832, -4791036, -5034239, -3559454, --2879239, -1054951, 143345, 1454383, 1560147, 2246268, 1554778, 1308891, 200253, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +13776108, 7361037, 6051609, 3442416, -1507534, -387084, -1458141, -2828773, -4032438, -2775086, +-4118874, -1673964, 3842922, 1374926, -241592, 47782, 2507187, 1237488, -1647657, -1679332, +-1341640, -7150584, 2951180, 811212, 35433, -1429687, 901943, 185220, -2024540, 1098438, +2605435, 49392, -3321084, -776852, -1452236, -1469416, 376347, 3233037, -849330, 812823, +-3794604, 2483028, -4680441, 3031710, 631360, 242129, 11274, 3017752, -3597035, -2584497, +-4892505, 1360968, 853088, 309238, 2757906, -2933463, 628139, -340376, 60130, -2119030, +1910187, 952946, -1632625, 3074123, -4804995, 2266669, -2629594, 4952098, 2206003, 932545, +333397, -900869, -5987722, 4624606, -1447404, -74088, 767725, 1345935, 1072668, 1278827, +1427540, -358630, 407485, -588947, 1394791, -27380, 789737, -1735167, 607201, -207232, +385473, 801548, 1937030, -32749, -340376, 736050, 762357, -709743, 999117, -1110786, +976568, 288837, 869194, 147103, 560493, -229781, 219043, 844498, 374736, -46708, +578747, -45634, 388158, 420370, -50466, 548682, -155693, 13286481, 6214281, 8701604, +2284386, 3011846, -578747, 3453691, 277025, 3078418, -2288144, 5927055, -1560684, -6602439, +-1908576, 216359, 290984, -2042794, 5048197, 362388, 1926293, 5030481, 2348273, 135828, +-81604, 1258962, -4591857, -2909304, 1721208, 2233920, -1717987, 550293, 2135136, -4401805, +6245420, -569620, 857920, -923955, 2273648, 3338263, 90731, -3347390, -3568044, 6933688, +80531, -1925219, -362925, 4027069, 2846490, -1961726, -2824478, -5968394, -1950452, -2401961, +178778, -2161979, 467078, -5796595, -2473901, 759672, -2467459, 1370632, 2296734, -1112933, +-230854, 1190780, -1565516, 2391760, -242666, 2988760, -36507, -922881, -3452080, 461172, +-4264903, 1397475, 4832, 2452963, -28454, 2516851, 3069828, 2755759, 31139, -1658931, +-203474, -556198, 3396782, -855235, 374199, 2297271, 2249489, -81604, 1238024, 548682, +1125281, -408559, 1377611, -467078, 2064269, 569620, 339302, -94489, 122407, 298500, +1003949, 2779381, -8902393, -2887829, -2025614, 1540283, 1760400, -6102075, -2729989, -1217623, +1462436, 3228742, 1019518, 4430259, -3665218, -5308043, 1534377, 169651, -951872, -3639448, +11770895, -623844, 3131031, 693100, 366146, -274878, -1814624, -4485557, -3514357, -1110249, +3007014, -2510409, 6162741, -2097555, -576063, -5062156, -6013491, -528818, -3835943, -2143189, +8197482, -4492536, -1243393, -4362076, 1593433, 196495, -1579474, -4583267, -872415, 26844, +-5191005, 600759, -2794950, 4140885, 2728915, -2401424, -1273458, -1332514, 1271310, -237834, +3296924, -1716913, -2167885, -2236604, 7475391, 6740951, -2318209, -6514392, 881005, 2000918, +-209380, 1900523, -2702071, 520765, -3133716, 2225330, 170188, 7168838, 4426501, 6815040, +-6215892, 2680597, 4159139, 149250, 3156264, 2263448, 469762, 4685273, -864362, -509491, +1202054, 642098, -1929514, 1862942, -1478543, -1276142, -133681, 467615, -211527, 701690, +-1104880, 540092, -141734, 136365, 607738, 854162, 411780, 991601, 938450, -725850, +-946503, 734439, 274341, -1698660, -690416, 1348620, -828392, -29341606, -4699231, -8488466, +-9533217, 2529736, -3198140, -8375186, -6860137, 1109712, -6758668, 919660, 10182294, -2566780, +4393752, 3252901, 8591545, 2176475, -5915781, 1320166, 9333501, -4384088, 4665945, -6903086, +-6211060, 2004676, 2704756, 7259569, 467078, -4524748, 4278861, -3049964, 3292093, -420907, +4646618, -3951370, -2498597, -4402342, 92879, 750546, -1672353, 3307662, -7658464, 949188, +7794292, 1640141, -2166274, 2947958, -3933653, -2051921, -9680856, -2918430, -289910, 1480153, +197032, 5179194, -7767449, 717796, -1039382, 3889093, 2131915, -1548336, 5587753, -4913980, +-625992, -3951370, -7465190, -3197066, -1695438, -2158758, 5665062, -5086852, -8069170, 279710, +2680597, -850940, -2308545, 2745558, 3122978, -2304787, -1800128, -3187403, -1272921, 6478422, +-3000572, 3554622, -1050656, -152471, -574452, -257698, -3352222, 788663, -1997160, -135828, +-214748, -525597, 104153, -816581, -1034013, -1076426, -261456, 290984, -629750, 1043677, +504122, -14596446, 8338142, 9349607, -484258, 5240397, 2416993, 11050414, 14737107, 1875827, +1953673, 4208531, 1857573, 2434710, -2060511, 2901251, -2393371, 3856881, 4533875, -12610024, +6564858, -1389959, -2301566, -3906273, -5068599, 2052994, 3617436, 5731097, 1156957, 970126, +-7321846, 315680, -2109903, -2464238, -1051193, 978179, 464393, -569083, 7274601, -382252, +-2360085, 2384781, -2770254, 3702799, 4930086, 5463199, 2883534, 595390, -3001109, 6103686, +1983201, 818728, 682900, 801011, 484794, -3536369, -4933844, 4517769, -4595615, 4328254, +3997004, 2901251, -596464, -3279745, 3003256, 3846680, 8578123, 3939559, 3265249, 1999844, +-8303783, -2567317, 1069447, -1363652, 3636227, -7230041, 406948, 2390149, -6722161, -635655, +2312840, -1638530, 910533, -3964255, 1539746, 510564, -1649268, 3120831, 1878511, 125628, +3464428, -1548336, -1464584, -342524, 754841, 1400159, 5230734, 848793, 1815697, 1225139, +-1074, 1134945, -808528, -982474, -1347009, 916976, -718870, -661425, 631897, 553514, +-586800, 1762010, -981400, 1233193, 1181653, -513785, 1752884, 493921, 775242, 853625, +163746, 186294, 2029909, -139586, 27090506, 8092256, 2059437, 5229123, 13574244, 5388037, +16355772, 3934190, -3532074, -1225676, -1304060, -1611687, 4484483, 6928319, -3182034, 1445257, +4932233, -1864016, -6708202, 5327907, -572841, 2505577, -2241973, -3451006, 5602785, 1240172, +-442919, -1626182, -6103686, -3100967, 3408057, 789737, -2055679, -1130113, 1002338, 2276333, +6274947, 1916092, -5652714, -1357747, 438624, -1840930, 2127083, 2900714, -5695664, -7001871, +-334471, 1705102, -668404, 5339718, -9852118, -2144263, -4430259, -5620502, -542240, -467078, +1537061, 5280663, 18790, 767189, 1788854, -890669, 7158637, 4491999, -5746130, -5133560, +3956739, 8556649, -670552, -4044786, 8540006, 4450660, 2034741, -3749507, -3966939, 4160213, +288300, 3141769, -1845225, -6172942, -3318399, -4207994, -2581275, 2407866, -3358665, 452045, +1537598, -1253057, 1493575, 1015223, 1282585, 695248, -2147484, 1215476, -630286, -1184337, +-468688, 1641214, 1366337, 206695, -1835562, 1682554, -684510, 2915746, -390305, 392990, +-2721936, -3597572, 1262720, -3386045, -589484, -528281, -1843615, -923418, 477278, -3036542, +-1199907, -312459, 400506, -636192, 2199023, 300111, -745714, 13365938, 6340983, 12045773, +-4131222, 198642, -3139621, 12135430, -12481712, -1656784, 3069291, -2270427, -2552821, 4130685, +-1492501, -3714610, 10457172, 6069326, 1115081, 17941690, -4975720, -1085016, -3877282, 238371, +2845416, -4502200, -693100, -2287070, 6707665, -5653251, 1431835, 504122, -1909650, 725313, +3901441, 2833068, -5516886, -9342628, 122407, 2049773, 7722351, 9285719, 9037685, 939524, +-5368709, 6681359, -16047608, -2516851, -6364068, -9174050, 6393059, -2026688, -3106335, 5171678, +-1938104, -2609193, 13816373, 276489, -4206921, 4958003, 273267, 3800509, 2617246, 1927904, +8331163, -4941897, -3201898, 609349, -7339026, 56908, 1269163, -1721208, 2382633, 4284230, +8764418, -3227668, 2856153, 7774965, 4549444, 2388002, 1345399, -2518462, -5697811, 2984466, +4170413, -810675, 327491, -763967, -815507, -3064996, 524523, -853625, 446677, -2852932, +-1600412, 134755, -622770, 2883534, 1098975, 137976, -3935264, -1611150, 1802276, -2109366, +-142271, 1606318, 1401770, -2459406, 2306398, 2010045, 515396, 2614561, 2133525, -4307316, +-895501, -1575716, 1101122, 2537789, 2825552, -477815, -1739462, 517544, -994285, -20691004, +-31077846, -5250061, 1542967, -550293, 861141, -1467268, -6233072, -3526168, -4969814, -1352378, +5051419, 6012954, -5476620, -8090645, 6899865, 1411434, -4437238, 340376, -741419, -4944581, +-4135517, 11442867, 5829345, -6189048, 3125663, 1271847, 4897874, -6007586, 6649146, -6680285, +4566087, 2960843, -1418413, -3134253, 2944200, -12435004, -6168110, 7563975, 12222940, 6755984, +-8578660, 164283, -6088116, 8098161, 1666447, 2070711, 561030, -6746857, 3237869, 9912248, +1105417, 7481833, 5309117, 3401614, 5735929, 12164421, -3410204, -12342662, 5938329, -15032, +-2935073, 574989, 10544145, -4370666, -7370701, 3548717, -1971390, -1307281, -2807835, -1708860, +-3333968, -5806259, -2918430, 7026030, -9688909, -6121939, -3593814, -7000260, -6781754, -467078, +4159676, -6426882, -149250, -2419140, -2721399, -5799280, -3659849, -6650757, -388695, -5129802, +-429497, -192737, 4590783, 3224984, -2385854, -2576981, -3403762, -1083942, -2420214, -2340220, +2765422, -4552129, 1654636, 325344, -2897492, 248571, -1911261, 1021129, -1009854, -3732864, +-4534412, -102542, 1136556, 1802813, -896038, 729608, 1374926, -61740, -2390686, -380105, +-3049964, 251792, 1348620, 1030255, 1279363, -11861089, -7886634, 2116345, 1819456, 16039555, +-14032732, -9439264, -5478231, -2538326, -1823751, 5253282, 4887136, -7282654, 7488276, -1660542, +3343632, -5217849, 11209865, -2101313, -4354023, 7404524, 5175973, 4348118, -7783018, -7136625, +9474698, -4915053, 2729989, 2435247, -3560528, 8229158, 2382633, 86973, 1716376, 6065568, +7572028, 2456185, -6903086, 1679869, -9812390, 5895917, 2447058, -10792179, 7631083, 1889249, +-5747740, 10063108, 3085397, -2608656, 5730560, -811212, 10926934, -2426120, -2840047, -2243047, +-1524177, 14415521, 2944200, 335544, 3818226, -11949136, -7598871, -8092256, 818728, 7710003, +937914, 9540733, -12295418, -4939213, -7829189, -7101192, 17755394, -1730335, 6298033, 4654671, +-3896072, -811749, -2552821, 1432372, 871342, 4948876, 2901251, 9830106, -5323612, 889058, +-1733019, 2197413, -133681, -113817, -95026, -2002529, -9270150, 3502546, 2083596, 1438814, +-2509872, -794032, -1246614, -5065914, -391916, -1769527, -3403762, 1938641, -2881923, 1269163, +1581085, 1358820, 2047089, -3510599, -2008971, -2359548, -2263448, 1345399, 2494839, 1560684, +-906775, -426276, -696858, -1057099, 3654480, -1223529, 2583960, 1706176, -1069447, 1168231, +-794032, 49929, 868120, 1042066, -16153372, 5048734, -6943352, 3936875, -4860293, 13048648, +2188286, -9134859, 1427540, -9313100, 7548942, 14420890, -12305081, 8123394, 2995203, -358630, +5933498, 15370077, -5888400, -14496, 4688494, -16779364, 972273, 7634305, -4676683, 5471789, +5946382, -3061238, 15046881, -7505992, -13633837, -5859409, 1628866, 363998, -2799782, -5873905, +4093641, 3802120, -5906, -9591736, -2263448, -2430415, 6396817, -4201015, 25241522, -3176128, +3602941, -1161789, -1086090, -12253542, 1245004, 9088151, 7339562, 24630564, -2661806, -2384244, +-5114769, -971736, -6948184, -525597, 9862856, -5259188, -1036161, 1788317, 2314987, 9709847, +7885560, 2233920, 19050864, -3607773, -17677012, -17680770, -12486007, -2569464, 5560372, -1745904, +-4660040, 8409546, -530965, 7466801, -4623533, -878321, 6046240, 5143760, -1891396, -1809792, +598074, 1572495, -1983738, -4132832, -5956583, -2006287, -2544768, -753767, -4254702, 3157338, +-1296543, 944356, -2167348, -3049427, 4051228, 1820529, -2108829, -571231, -1734093, -1823751, +1750736, -1139240, -2047089, -4025995, 3144453, 1248762, -1755568, -3052111, -4075924, -767189, +-2813204, -2820720, 3383361, -2031520, 646929, 129386, -1505386, 1458141, 634045, -563714, +-788127, -905164, 28686086, -20657718, -15741592, -4974109, -9954660, -11293080, 13909252, 5714991, +2774012, -4312684, -2794413, 16980154, -4916127, -7027640, -20225538, -2835215, -486942, 9640054, +3541738, -4011500, 1270774, 8474507, 3815005, 5345087, 12984223, 16372415, 4547834, -5935108, +4231080, -9636833, 6741488, 5614596, -3440269, 465467, -7507603, 3195456, 264141, -14519674, +14355928, -1136556, -6583648, 8975945, -13494787, -2979634, 15003931, 8676908, -108448, 725850, +-18707804, 6768869, 10591389, 6167573, 3585224, -847182, -13770202, -40575092, -3146064, 8501888, +11566884, -848793, -11838540, 20340966, -9205189, 9400073, 15375446, 12777528, 2471217, 15417859, +1869921, 5643050, 3362960, 9454297, 1966558, 3164317, 19516332, -6249178, -4063576, 16615618, +8704288, 4691715, -6585796, 1902134, 13496935, -1183264, 10857677, 2719251, 2517925, 6990596, +-3415573, -51003, 917512, -419833, -2803003, 5523865, 2646237, -6991133, 4220342, 3018288, +4078072, 2202781, -1862942, 300111, -2086817, -2356327, 3464428, 4417374, 1952600, 2806224, +-1920924, -1791001, -1188095, -2272575, -3164317, -4796405, 1017907, -2952253, 2720325, -864362, +1701881, -4389994, -2840047, -646393, -1265942, -1047972, -1870995, 974421, 4855998, 5126044, +2088428, 751082, -2355790, 4140349, 14743549, 13261248, -3218541, -7385733, -966368, -4516158, +16099685, 9822590, -27028766, -3392487, 2595234, -13246753, 5461588, -19145354, 14611479, 3068217, +-1857037, 7407745, 4221416, -4326106, -5954972, -4979478, 20483772, 431644, 185757, 4079145, +-2385854, 7696045, 24068996, 9297530, -3129421, -4560719, -3151969, 13379360, 5218922, 13553306, +9959492, 6582575, 4338991, -6420439, -6341519, 5850283, -13764296, 2052994, -7160784, -6611566, +799938, 9379135, 1684701, 434329, 3806415, -3408057, 16595754, 20769924, 24477556, -456877, +11343009, -14683419, 5853504, 7972533, -6264747, 11958263, -9525701, -19979114, 2920041, -10626286, +-1231045, 598611, -10130217, 2301566, 14587320, -8994735, -8156680, 6874632, 13536126, -903554, +-4559108, 11853573, 1389422, 2418067, -8049306, -2029372, -266825, 9739912, -4785668, 522912, +-2052458, 1911797, 111132, 1662152, 2849711, 1506460, 317828, 715649, 2489471, 2554432, +-1990717, -4816806, -523449, -942208, -3930969, -5412196, -104690, -2624225, 3976603, -3735011, +3088082, 4628901, -62814, -8291971, -594853, 1351841, -2602750, -4023848, 775778, 2022930, +12766790, 3978214, 4076998, -587337, 495532, -1277753, 3864934, -1084479, 4100620, 10338523, +9780714, -1414655, -372052, -1971390, 664109, 3083250, 3913252, 5421323, 1213865, -17067126, +31088048, 1981054, 8065949, 23797876, -8814884, 2441689, -4564477, 6280316, -6886980, 6870874, +-16770774, -19845970, -639413, -11753715, -933619, -1095754, -1369021, -3354906, 1232119, -5506148, +4920959, -15784542, -6349573, -21295522, -1119913, 4878009, 10166724, 22986128, 12703440, 3966939, +2888903, 6593312, 5048734, 3868692, 9237401, 9721122, -3140695, -19467476, -19337016, -13242995, +-7955890, 1912334, 6448894, -7147900, -11359115, -19758998, 515933, -7566122, 17955648, -8062191, +4470524, -13727252, -6664179, -2435783, -5688148, -26501022, -27628988, 7521025, 2761664, 672699, +14076218, 8022462, 11286637, 9098351, -17238924, -3788161, 32156958, -6021544, -12254615, 4680441, +-7157026, 3233574, -19954954, 7996692, -9191230, 1294933, -1376537, 13007845, 705985, 5174362, +-11384885, 2074469, -6451041, -2948495, -7833484, -5952825, 3986267, 4469451, -10417443, -3555696, +677531, 1870458, 2501282, 1279900, -4084514, 4436165, 1793686, 1463510, -612033, -382789, +1349157, 4487167, -4996121, 4531191, -1305670, -258235, -1828046, 2838974, -2971044, -1795833, +3994857, -7777649, -233539, 1387811, -4750771, -1720671, -10834592, 7619809, 9050033, -740882, +2074469, 2306398, 3032247, -4923107, 5006858, 3119757, 3890704, -3631395, 2087891, 2921115, +4613869, 18566070, 13973139, 1933272, 14853071, -2698850, -6172405, 8281234, -11466489, -22173842, +-33356326, 2891050, 647466, 12973486, 9350144, -12307229, -6405944, -32421098, -2238215, -15044197, +3482145, -7518877, -3690988, -6153615, -2463164, -2429341, -11348914, -4976257, -13217225, 10610717, +-2695092, 9096741, 23251342, -12198781, 6653978, -1802813, -5836861, 6113886, -12518756, -21093122, +10127533, 5092758, 10073309, 6445672, -44467408, -20049982, 5867462, -14671608, -1306207, -12518219, +18536006, 22504018, -1150514, 24864102, 3438658, 11358041, -3321084, -703838, -13895830, 8884140, +17840758, 3993783, 29742112, 820876, 4050691, -8631274, -13146358, 17752174, 27911382, 9877351, +5382131, 2873333, 10528039, 1031329, 1976222, -26048976, -19236622, -1869385, 1353452, 3586835, +19634980, 21278878, -3936338, 1508607, -7301445, 4524748, -13588740, 464930, -14376866, -12032888, +6241661, -236223, 1549410, -7949985, 5151277, 6452115, 4235375, 6532109, 7552163, 773631, +-4320737, 3440269, -5892695, -1318018, -3641059, -8494908, -2486249, -4647692, -3844533, 7259032, +3938485, -2433099, -5666673, -8414915, -5586679, 5864778, -5666136, -450435, 459562, 4046933, +-8039642, -6318971, 2860448, 10097468, 6381248, 2675228, 1074, -5907728, -715112, -3554086, +-6944425, 11997991, -17316234, -8686571, -32442572, -40658308, -29970282, -13834627, 9296457, -366683, +-7033546, -14920716, 130460, 26661010, 13204877, -23513872, -3754875, -4942971, -16446504, -3054259, +1319629, 11163157, 8395587, -17570174, 12648142, -9971840, 5424544, -9296994, 2879776, -13486197, +-4906464, 6524056, -24082418, -4725538, -9021579, 7836705, -5924371, -22442814, 26373246, 25239912, +435939, -10341744, 14407468, -34336652, -10635413, 10096394, -11431055, -7374996, -795643, -11165841, +2281165, -2949569, -22863722, 9750113, -2839510, -7153805, -7766912, -6161131, -1352378, -6383395, +-9648107, 18945100, -8984535, -9099962, 9139690, -339839, 31330712, -6351183, -19292994, 10981158, +-10037875, -8692477, -15036144, 10385231, 19351512, -37701224, 3027952, 31647466, -5088463, -2063195, +-12483859, 21544630, -1456531, -11858942, -1492501, -11139535, -8793946, 15581604, -9345849, -887448, +-5156645, -6649146, -10934450, 4558034, 3747896, 5638755, -1244467, -8967355, -6019397, 225486, +1622424, -13607530, -3807489, -8789114, 13507672, -4592394, 1023813, 1814087, 1726577, 1327682, +-10868415, 7277285, 430570, -4275640, 9867687, 1417339, 12892418, -2375117, 14886357, 3336653, +6044093, 7159174, -9538585, -6431714, 4746476, -7997766, -6104223, 2242510, 93416, -5652177, +-12916040, 6238440, -1804423, -25639344, 51239496, 36588288, -730144, -9760313, 8099235, -30726732, +471373, 38268160, -6787122, -13293461, 580894, 43364136, -6257231, 9520869, -9274445, -19610820, +-15913928, -4014721, -7304666, 7984881, 11024644, 594853, -16382616, -22856742, -21086678, -3405372, +-4691178, -11348377, 10544682, 8579197, -9264244, -11225971, -12312597, 6867116, 2316598, 8442832, +21591874, -147640, -18580566, 12549358, 4875862, 4224101, 1238561, -368293, -9001178, 16015933, +8130910, -6446209, -7744363, -5108864, -21111374, 5773510, 15322833, 4650913, -14813342, 17202418, +12542915, 7098507, 1828582, -9082782, 4646081, -30010010, 4590783, -1899986, 26644904, -9645423, +-13340705, 5636608, -7012071, -601832, -19431506, -3545496, -5291400, 25923886, -16995722, -31537944, +-20646444, -40970228, 7909183, -8381629, -2840047, -21896818, -14069776, -36223756, -16156056, -12707734, +-2010045, 8806830, -11822434, -2107755, -2358474, -1907502, -3374234, 7686381, -13728326, 5823439, +-5497558, -10629507, 1466195, -3119220, 9543417, 4951024, 20938, -5373541, 12363063, 11632382, +6882685, -4614943, -6448357, -6283537, -5919539, 13079249, 21321292, 2439542, 19570556, 21658984, +7036230, 297963, -19663434, -2172180, 3403225, 2758443, -2057826, -5433671, -16702054, -465467, +10810970, 1684164, -12614319, -3231426, -9555765, 48660904, 1969779, 8034273, -8090108, -16030965, +-21452824, -7159711, 6118181, 14218489, 11858405, -10372883, -15032, -21548924, -7814693, 7655243, +-18065170, -9762461, -6817724, 26239028, 13769128, 14421963, 13722957, -15284715, 2852395, 5481989, +6263136, -1516124, 17790828, -3951907, 7864085, 13713831, 5327907, 3777961, 11683385, 15924665, +-9354439, -18816252, 12604655, -2080912, 112206, -19883552, -18414136, 4203699, -9185861, -7230578, +16275779, -16760036, 21508122, 13807783, -9472550, 11254962, -12523588, -12718472, -15295989, 22119082, +-15482820, 6941204, 6818798, -25438018, 2462090, 2896956, -19993610, -34592740, -30835718, 22454090, +-23164906, -476741, -20824148, -4874251, -14875619, -1311576, 9707163, 5850819, -15140297, 15686294, +18337900, 38159172, 10060961, -25773562, 9125195, -15890842, 8629126, -22679574, 12198244, -9754944, +1770063, -4716948, 9326521, -2872260, -9118216, -21773336, -21553756, 2329483, 2164664, 13618268, +-9681930, -1007707, 21450678, 5980205, 14895483, 4424353, -3790846, -1700807, -4999879, -14370424, +5213554, -17321066, -10110353, 3648038, 14384382, -18898930, 10580652, 1910187, 13606456, -4641786, +7654706, 13602698, 15112379, 15069966, -6800007, 7329899, 11865921, 12677670, 2571612, 7553237, +4052839, -5842230, 23527294, 10828149, 11904576, -10129143, -11198053, 2925410, 3961571, 4523138, +-9756018, 804233, -21365852, -421981, 3660923, 4101694, -18845780, -19755776, -31079458, 21531208, +2255395, 7348689, -5089536, 11368778, -8499203, -8471823, 6454262, 16367583, 3869766, 10730976, +33520072, -4942434, -20231444, -43077448, -6127308, -16704738, -8184597, -10334765, -19985020, -14163728, +-29850022, -3565897, -490700, 10339597, 30896920, -25853018, -9953050, -4343286, 10089415, 10846403, +30597348, 4058207, -35047472, -8149701, 7127498, 27261768, 7128572, -42506756, -17058000, 38252052, +3429532, 38156488, -22588306, 1119913, 2924336, 23047868, -2231773, 20960514, 31685048, 4373351, +26866094, 18779744, 4485557, 37196564, 31801548, 10219875, 49638012, 38070052, 23858544, -40424232, +-2712809, 15657303, 9070971, -603443, -29313152, -35058208, -18170932, -50125488, -8003672, -37313064, +-14287746, -9699647, -53630184, -50922208, -35444756, 17313014, 433792, -11880416, -745177, -4000762, +-1197222, -10027138, -5354751, 12302934, 4844723, 2008434, -1807108, 1829119, -2553358, 7561827, +-1416802, -13515725, 23111220, 3599183, 5475010, -7057168, 1008244, -974421, 12054899, -789200, +6978785, -4350265, -12829067, 4931696, 9715216, 25542708, 22720376, 1351841, -350577, 16246251, +8046621, 19003082, 15811385, -5252745, 18252538, 10122164, 3591667, 11383274, 7355132, -6713571, +-3091303, -14862197, 8882529, -13284334, -5952825, -23219130, -14104673, 6804839, -27217208, 29079612, +-12339978, 18874770, 9918153, -25286620, 4086125, 14969572, -9364102, -26396870, 17564268, -7487739, +15074261, -9163313, 4124242, 5539434, -15606837, -2347200, -6678138, -798864, -25778930, -21007222, +25777320, 708133, 10633802, -20519744, 21134460, 18116708, -13638669, 11376295, -19957102, -4819490, +-11034308, 14279693, 36479840, -1089848, 44188772, -11549704, -1778117, 1654099, 4800163, -3436511, +-24437290, 42608224, 28365038, -3781182, 23868744, 18020072, 24761560, -9702331, -281320, -44136156, +20046760, 20189568, -5420249, -7874823, 27633282, 14069239, 14690936, 33666640, 5948530, -17884244, +-20851530, 6005975, -6383932, -25534654, 21052320, -29518774, 1473711, 6088653, -20496658, -32748052, +-21800180, -8623757, 2517388, 25753698, 17722646, 7965017, -49431316, -14326937, 30090540, -2749316, +-10616622, 8452496, -26709328, -17146584, 22805202, -488016, 503048, -9940165, 319438, 13380971, +-4097399, -10529649, 7984881, -3894462, -18966576, -10786810, 2046015, -1824287, -1010928, -88047, +-8235063, -380641, -12982612, -18071074, 2538326, -2046015, -28912646, -3677566, -17451526, -10576894, +-3077881, 3979824, 5458904, 15518791, -14551886, -10437307, 3368328, 15100568, -16124918, -17855252, +24656870, -4270808, -1233193, -5134634, -9127, -10733660, 4516158, 11017665, 6458020, 9523553, +860604, 3273839, 399432, 947577, 3810173, 7858180, -6274947, -2044941, 3435437, 5571647, +3225521, -37112276, 21213380, 32320166, -384400, 37285684, 11595338, -32851132, -19841676, -2818036, +-11106249, -20078436, 21206938, 24283208, -2128693, 16827682, 23235774, -18405546, 16458852, 27332636, +-1440962, -37476276, 14862197, -1295470, -7152195, 10041097, 28357522, -9213242, -13928042, 6670621, +-12093017, -16374563, -891206, 24489366, 21336860, -35319664, 11397769, 14807437, -23333484, -15272904, +28689308, -7950522, -41137196, -5483600, 35034048, -11545946, -59541668, 62517008, -17594334, -7412040, +-30665530, 40338332, 13449153, -14125074, 29724932, -17490180, -12700218, -7716983, 75688600, 25034290, +-31323196, -28082106, 29192356, -6836514, 42378444, 650688, 31873490, -43638480, 35034584, 59826212, +5925981, -6561637, -10297184, -10570451, -23658290, 56450364, 38283728, -33935072, 9762461, -35661112, +-5823976, 3745212, 7679402, 4909685, 10760504, 907312, -38716444, 18162342, 2643552, -4119948, +-577673, 17854716, -7509214, 3905736, -5429913, 9232569, -3430068, 2342368, -5968931, 11650636, +730681, -2406256, 6923488, 9354976, -21080236, 2536178, 13703093, 5076652, -15119895, 8176007, +24430310, -23716810, -36514200, 7192997, 4823785, 14368276, 14370424, -1965484, -32960116, -11262478, +9342628, 4575751, 9602473, -5029407, 1648194, -1351841, -10834055, 9663676, -8422968, -4042101, +27074400, 61814244, 11985643, -23951958, -5672578, -5903970, 10870025, 9266929, -19291920, -27580132, +7364259, -23348516, 4649839, -14553497, -16672526, -3676492, 2834679, 7853885, -18589156, -7565585, +-7369627, -23199802, 19412178, -7338489, 1249836, -3494493, -15443092, 6062883, 4338454, 472983, +-3343632, 105764, -576063, -9197136, -19655380, 8329552, -9766219, 8447664, 5972689, -19708532, +-15915001, -1882806, -2306398, -2316598, -4243428, 15924128, -11100343, 1555315, -20881058, 17719424, +-20461224, -10900090, 10125922, 199179, -16408923, 12928925, -22053046, 1586990, 6590628, -673773, +2368675, 10458782, 4966056, -22780506, 11438035, 1517197, -13735305, 19366008, 7618735, -21627844, +-2406256, -17265232, -2312840, 6895570, 5701569, -22021372, 27869506, -14862197, -8169028, 15446313, +10257993, 2449205, 10320806, -958851, 14464376, -6558415, 2913062, -1893007, 6966974, 5398774, +-4234301, -5131949, 5523328, -7063074, 674847, 1118302, 857383, -4185983, 620623, -3911105, +-6370510, -3507378, -6927246, -445066, 5070746, 8888435, 3259343, 985158, 4667019, 5794448, +-8247948, 12504797, 3217468, -471910, -8373039, -4784057, 3852586, 9878962, -2032593, -274878, +-4989142, 1568737, 1327145, -4170413, -5679558, -5013838, -13074417, -4795868, -5172215, -37270652, +-46196668, -17137994, 140181296, 111932216, 74486544, 135393472, -53650048, -128351336, -40929428, -207361552, +-80572512, 5742372, -48380660, 94933272, 130046776, 21129628, 82752208, 141669504, 3310346, 38977364, +-9000104, -166731712, -137624176, -104264088, -103234904, -51078972, 79307648, 42402064, 61435748, 173954768, +74080672, 10727755, 104480984, 48369920, -59404768, 20262046, -49780820, -168939312, -40350144, -88296472, +-173680960, -28976534, 4323422, -42566884, 118004760, 135805248, 53891104, 159705136, 161977168, 30131344, +62635120, 28004260, -101885752, -114612280, -106918912, -192938528, -170141376, -64991980, -78841640, 16670379, +103666016, 141468176, 117253680, 180717728, 134419056, 71949832, 10296110, -22557168, -103901704, -126967824, +-93415000, -111559088, -92699352, -4059281, -4912906, 21184926, 100746512, 48422536, 61683248, 96221224, +-1659468, -29931090, -15545097, -60267516, -34130496, -20172388, -21897354, 24756728, 51219096, 19784230, +28519656, 32111322, -22996328, -8253854, -9575093, -61426084, 8858370, 25792352, -66283692, -704912, +-5792301, -67152352, 25383794, 11486353, -75803488, 48258252, 72078680, 17015050, 144827904, 90020368, +-1432909, 77054936, 14229227, -97466232, -80732504, -126968360, -180053088, -135258720, -87785912, -47177532, +61988728, 133791456, 156934352, 195139152, 191397168, 135486352, 30331060, -13999446, -96536904, -176648784, +-171616160, -152574960, -127942240, -27273042, 14398878, 22842784, 89078696, 94531160, 65950296, 67800888, +52951580, 23376434, 32805498, 23974508, -4731980, -10854456, -26884884, -55110872, -59734944, -59287192, +-60063508, -45511620, -9881109, 2686502, 19469624, 40834940, 49560164, 52799108, 52614960, 38297148, +12673912, 86436, -14816563, -26673358, -30714922, -23895050, -24931212, -19400368, -6634114, -4094715, +-6136435, 509491, 1262720, 1978369, 15060840, 16094853, 7620346, 10130217, 8276939, 4808753, +10649371, 8918500, 1738925, 609349, -7515119, -13951128, -12724377, -12803834, -13896904, -10638097, +-6460705, -1726040, 4377646, 10545218, 12138651, 12225088, 11315628, 7940321, 3300146, 998043, +-3935801, -7623567, -6795712, -5242008, -4534949, -571231, 1367947, 2940442, 2141041, 1300301, +-1304060, -2422899, -4431870, -4017405, -2769180, -553514, 440234, 2940979, 4458176, 6529961, +6132140, 4676683, 2588792, 1676111, -1213328, -2881386, -4314832, -4791036, -5034239, -3559454, +-2879239, -1054951, 143345, 1454383, 1560147, 2246268, 1554778, 1308891, 200253, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -5080947, -15756088, 6017786, 3842385, 1228898, -3318936, 29528, 3036005, 5667210, 95563, 539555, -350040, -2090575, 571768, 1917166, -369904, 1873143, 2923262, 3861713, 1644973, 1580548, -2058363, 1801739, -3539053, 3601330, 6796249, -3220152, 1944547, 1058710, 1910187, 344671, -4031364, -2618320, -914291, -2356327, 2333778, 6717329, -1115081, 3258807, -73551, -1520955, --5522254, 2071248, -2853469, 2552284, 1310502, 2851858, -301721, -1715303, 917512, -1181116, -3865471, 498216, -3033321, 3908420, -839666, 3051574, 2367601, -120259, 2273648, 4407174, --1224603, -1539209, -1235340, 2196339, -1786706, -2369748, 2755222, 38118, 1853815, -2927020, -4347044, 263604, -1206886, -500364, -466004, 1733556, -1609002, -2590939, 1550483, 2335925, -2216740, -2051921, -3065533, 1249299, -94489, -357019, -1173063, -1114544, 1555852, -390842, --213138, -942745, -1118839, 237297, -801011, 365072, 251256, 1156420, 806917, -324807, -423591, 665720, -675384, -270046, 56908, -296890, -514322, 415001, 1119376, 651761, -839666, 35433, -64961, 305480, -689879, 16643, 266825, 12268037, 9552007, 4851166, -664646, -1774895, 5521181, -3218541, -3528316, -770410, -6137509, 3718905, 212601, -2499671, -1410360, 3575024, 6055367, -2794950, 3478924, 7940858, -2290828, 83215, 1780264, 4139812, --1067836, 4507568, 3140695, 4559645, 1013612, 3487514, -3553549, 6068252, -751082, 5855651, -2863133, -619012, 697395, -942745, -161598, -2085744, -1022202, -2582349, -1945620, 2053531, --572304, -5627481, -1293322, 617402, -183073, -3132642, -3280281, -1634772, -1432909, 4434017, --1793149, -4835060, -6504191, -7118372, -2485712, -3127273, -281320, 1113470, 3420405, -4652524, --2144263, 558346, -497679, -2078764, 493921, -4898947, -489089, -5776194, 3066607, -3140695, --1561221, 4022774, -609885, 2763812, 768799, 1012002, 3081639, 782758, -2528125, -1139240, -221728, -2433636, 1271847, 2490544, 1179505, -1906429, 1408749, 2083059, 378494, 1131187, --638340, -1118839, -813359, -1118839, 771484, -112206, 705448, -934692, -725313, 801011, -1125818, 6493454, -14061723, -3764002, -7129646, -1315334, -15569, 7743826, -3774740, -12590160, --4449049, -316754, 4784057, 1499481, -4685273, -10931766, -2826625, 3000035, -1239098, 6161668, -228707, 2700461, -623307, -4852240, -5295158, 3183645, 3869229, 455803, 1246077, -192737, -2359548, 551366, -6511708, 345745, 9134859, 1231045, -2288144, -845035, -2445447, 559956, --2112050, -3976603, 6110128, -1905892, -2566243, 5558762, -2924336, -4937602, 209917, 31139, -144418, -7121593, 5771363, -2208687, -154619, 5337034, 4838818, -7636452, -1953673, 1474784, -1835562, -678605, 4162897, 1148904, 2057826, 2894808, 413927, 2312303, 3483219, 759136, -537, 3263638, -8728447, -1933272, 198105, 4432406, 2439542, -1077500, -903554, 3221762, -2982318, -3478387, -520228, -1243393, 81604, 1902671, 2406256, 478352, 2979097, -311385, --2181844, -1026497, 213675, 215285, 256624, -818728, 2063195, -439160, 721555, -328565, --985158, 607201, -62277, -426276, -815507, 162672, -770410, -132070, -1355599, -1029182, -233539, -212064, -1071058, -2044941, -785979, 432718, 1677185, -27995670, -10999948, -5665062, --7897908, 2476049, -2705293, -2696703, -292058, 3513820, -3163780, -3840238, -5513665, 1097364, -5032091, 1095754, -3766150, -4748087, 1455457, 4146254, 3897146, -5394479, -7880728, 582505, --7364259, 3934190, -4832, 2741263, -163746, 2644626, -2870649, -1239098, 7794829, -9390409, -4359929, 2174327, 1095217, -3338800, 2119030, 4605816, 1278290, -5725192, 1199907, -3636227, -2841658, -7809861, -248034, -7075422, 5486821, -587874, -1352378, -2015950, 3043521, -11865921, -5517959, -3428995, -7126962, 2860448, 5826660, 6521908, 3901441, 1386201, -410706, 768799, --539018, 4207458, -2350421, 1187559, 3371013, 8157217, 1358820, 156766, -5805185, 3733937, --2856153, 664109, 223875, 4342212, -3794067, 224949, 4052839, -357019, -4672925, -6522982, -5454072, 452045, 1074816, 2718178, -495532, 1322313, 1228361, -39728, 1040456, -454730, -230318, 1449015, 1410360, 1428614, -2297271, 933082, -1707250, -768799, -1427003, 1403381, --1627793, -15898358, 7781407, 12417824, 2408940, 983011, 6897181, 2332167, 2107218, 3775813, -514859, 3950833, 3966939, -3202972, -592169, 539555, -3905736, -2417530, -54761, 1919850, --2305861, 12911745, 6854768, -1883343, 918586, 4100083, 5157719, 5893232, -2471754, 4150012, -4828080, 272194, 1404991, 1393180, 2747169, 1994476, 1209033, 2728378, 2600603, -5586679, --4323422, -8600672, 925029, -3047279, -4305168, 4423817, -1263794, 2784750, -10661719, 11733314, --857920, -5580773, -1042066, 9300752, 6725382, -1483911, 234613, 4503273, -2148558, 1935957, --3436511, -7323993, 855772, 683974, -5892159, -2329483, -5807870, 1035087, 2137283, 1311039, --2827699, -5127654, -7820599, -9310415, -6701760, -2609193, 528281, -2265059, 899259, 3091840, -2736968, -3870303, -423054, -4220879, 1532767, -1471563, 1204202, -56371, -1731946, 1233193, -1401770, -1242856, -594316, -1617592, 2173790, -2587181, 555661, 828929, 759672, -261993, --609349, 552977, 1152662, 1159104, 942208, 728534, 970663, 321586, 1853815, -427886, -2054605, -1285269, 645856, -381715, -534723, -1479616, -1149978, -984084, -1345399, 529892, --1080721, -143345, 978179, 328565, 29336774, 7753490, 2197413, -1105417, 17694192, 2056753, -8421357, 1717450, 5611375, 9189619, 3276523, -5120675, 5461051, 6315213, 1029718, -471373, -1382443, 11572789, 835908, -3964792, -7007239, -2073396, -178241, -8048232, 1385664, 2384781, -4653597, 1966021, 3296924, 8869644, -2730526, -1409286, 5490042, -850404, -2362232, -456877, --7890392, 5134634, 3403762, 186831, 5149129, -2545842, -6901476, -15010911, -5451924, 5553930, -6179921, 201327, 4353486, -4233764, -4555350, 12228846, -7018514, 5547487, -6172405, 1311576, --9022116, -9519795, 10401874, -3940096, -3660923, 14283451, 1134945, -1591285, -6643241, 5244692, -8306467, 415538, -4378183, -8392903, -1254131, 6124087, -1889249, 2085207, -3646427, 3023120, --1344325, 988379, 6581501, -7010461, 2268817, -1974074, 508417, 823560, -734976, 7538205, -2429878, 1121523, -2160369, 91268, -1694902, 3184718, -1458678, 2528662, 2599529, -2628520, -92879, -409096, -1636383, 3590056, 680752, 1686848, 213138, -1248225, 804233, 29528, -146029, 1037235, 1666447, 603980, 2161442, 667867, -76773, 1181116, 876173, -796716, -336618, -337155, 540092, 1867774, 2146410, 345208, -102542, 15027554, 4868346, 12473122, --7672959, 2595234, 6829535, -9307731, -3307125, -3562139, 899796, -4642323, -2985002, 7445863, --2305861, -1255204, -595390, 9288404, -3422552, -4122632, 9713069, 1710471, -6993281, 3045132, --1589138, 1692754, 3629247, -5486284, -1364726, -4090956, -7636989, 1047435, 124017, 1564979, --7514046, -7631083, 2937221, -547071, 2857227, -188442, 4186519, 1374926, -257698, -4830228, --4860829, 1452773, 4719632, 2445984, -1458678, 14168023, 3274913, 2524367, 6324876, 2484102, -4689031, 4953708, 3104188, 2061584, 2366527, -1920924, -1166084, 1187022, -6017786, 1695438, --9663676, 2742337, -6415608, 5097053, -3632469, 2852932, -1297617, -4540318, 1512365, -1112933, -4959077, -4248797, 13358959, 11423539, 5163088, -9546639, 2984466, 4416300, -4179540, 1905355, -1144072, 6698002, 6200322, 2742337, -192200, -777926, -1394791, -3702799, 5777268, -322659, --752693, 134755, -1723356, 752693, 1896765, -1484985, 2988760, -1038308, -2545305, -2498060, --137976, 1903744, 1689533, -362925, -668941, -1947231, -934155, 1207423, -2521146, 2882460, -2818572, -1700270, 473520, -2183454, -797253, 506806, 894964, -1635846, 2995203, -18505940, --35602596, -1523640, -7136088, 6169184, -1838246, -9866077, -960462, -7992934, -8810589, -7559143, -11635603, 6031745, -7787313, -4486630, 8849780, 5114769, 7895224, -5459977, 5099737, -4846871, --4892505, -1524713, -2149094, -15081778, 4093641, 8576513, 3681324, -8977555, -2081449, 1561758, -2268817, -8014409, -1806571, -11492259, 2501819, -5464809, -537408, -4025458, 2163053, 12234214, --1353989, -2312840, 6113349, 8932458, -5458367, 2410014, 3353833, -7599945, 4014184, 3736622, --8919573, 1357210, 5708549, -1398549, -9393093, -5935645, -6074158, 8450348, 3250217, 8273181, --4964446, -9657771, 2236067, 4748087, -2088428, -6928856, 4527970, 6674379, 6327561, -7940321, --4147865, -1690070, 12700218, -2761127, 7561290, 2185065, -9020505, -7363185, -1446330, 4948339, --8552354, -559420, -1633698, 4618701, -1075352, 10482941, 1268089, -2473364, -3202972, -2732136, --3092377, -2031520, -1085553, 905701, -82141, -1302986, -3921305, -439697, -3815005, -1711545, -1486059, -1382980, 553514, -1161789, -2901251, 1643899, -520228, 4441533, -941672, -3740917, --2641942, 1365263, -753230, 85899, -1088774, -2435783, 737124, 2451890, -2316061, -789200, -3381213, 1516124, -2196876, 103079, 2654827, -18009872, -220117, 709743, 10302016, 2750390, --4389994, 6419366, -3185792, 2925410, -10065256, -2696703, -6448357, -3262028, -12672301, -4529043, --7644505, 17415018, 9697499, 10695542, -12431246, -10272488, -5203890, 6073084, -747861, 69793, -171799, 3730179, -1018444, 5207648, -7305740, -5910949, -296353, -1531156, -8968965, -8640400, --7250442, -4921496, -3990562, -3317325, -11311870, 5317170, 13483513, -2755759, 6232535, 8982387, --6594386, 7801808, 4647155, 2013266, 12304008, -389231, 10280004, 4081830, 1192390, -9594957, -3778498, 5048734, -2724620, 14567992, 11310796, 2438468, -4402342, -6951942, 4017942, -6830072, -2723546, 66572, 8371428, 185757, -12773770, 1118302, -5102421, -1809255, -9596568, 11290395, -5640366, 4224101, 2529199, 12578349, -3666828, -12758200, -2134599, 8358007, 123480, -6471979, --1818382, 1133335, -2984466, 1786706, 3825205, 166967, 29528, -628676, 1180579, -10201, -4630512, 1646583, 1316408, -908386, 1737314, 2698850, 4197794, -3395709, 2284386, 2684892, --119722, 984621, 4230006, 2594697, 1030255, -2417530, 3582003, -872952, -2216740, -2273112, --250719, -6235219, 3985193, 2279017, 651761, -2841121, 3503620, 3808026, 6295349, 4199405, -999117, 1320703, 239981, 5511517, -16430397, 7373385, 5509370, 6992744, -7643968, -13730474, -4014184, 4044786, 738734, -11586748, 11074573, 3101503, -5829881, -10210748, 4633196, -4549981, -17699560, 20491288, 3086471, -3348464, -7617662, 11611444, -13229573, -4811974, 16441135, 4017942, --3136937, -8921184, -8118025, -4675072, 339839, -10896332, 2493229, 11494943, -1420560, 4284767, --8416525, -7785702, -2572149, -6445672, 16834124, -6213207, 7587597, 6148783, 6861211, 1746978, -3396246, -11689827, -11623792, -11241003, -2446521, 8351564, 19402514, -7845295, -13932337, -3277597, --6393596, 3536369, 3052111, 10732050, -6534256, -180926, -8674223, -1703491, 15549929, -2021856, --8391292, 11051488, 3685082, 1755568, 5874442, -12474196, 1950452, -4247186, 1254131, 5659157, -13678934, 3779571, -15785615, 5758478, 1437740, -2485176, -6549289, 282394, -1636383, -890132, --374736, 2212982, 3701725, 4367445, 1505923, 280247, -2505040, 811749, -741419, 3135863, --5324149, 1999307, 2143726, -126165, 525060, 893890, -4017405, -115427, -2648921, 4429185, -4167729, 1022202, 4994510, -1929514, 734439, 3775813, -745177, 2995740, 784905, 2776160, -981400, -6242735, -332860, -2221572, -305480, 867047, 418222, -2184528, 260382, -2573759, -50466, -1236414, 26800060, -11648488, -9126806, -2790655, 5648956, -15674483, 6277632, -4230006, -7917236, -7034083, -3205656, 9725953, 7211787, 2749316, -4891968, -1770600, 13312251, 13096966, --2718178, 11436961, -3316789, 16814796, -7857643, -4126927, 3019899, 17616346, 12866648, 4261682, --9437654, -657667, -19559818, -2952253, 3060164, 9002788, 10488847, 18567680, 4867809, -334471, --894427, -7120519, -12197707, -870805, -10579041, 7658464, 2403571, 11840151, 6590091, -4036196, -11734388, -13959717, 6318434, -3107409, 1015760, -2421288, 14936823, 8758512, 4280472, 2671470, --27096412, -4303021, 16081431, 8126078, 1005559, -492848, 824634, 12974022, 5509906, -20484310, --6674379, -7895224, 1931662, 454730, -20351702, 811212, -19021874, -12607340, -1636383, -8164733, --8849243, 11918534, 15044734, -1595044, -7280507, -779537, 4638565, -1816771, 3962644, 6180995, --469225, 6865505, 10040023, -3165391, -5543729, 965831, -2343979, 3073049, 2008971, -1532230, --1359894, 181462, 190589, 2881923, -262530, -3387656, 747861, 3469260, 1315871, 3092913, --2582349, 4661114, 52613, -1618129, 1185948, -2828236, 1224603, -5742372, -3668976, -4471598, -2417530, 312996, -4261145, -769336, 3777424, 2536715, 3290482, -2028298, 1848447, 142271, --638876, -5456219, -2777233, -5786395, 9901510, 18722300, -4597763, -7885560, 1248225, 7125351, -4355634, -11758010, -567473, -9562745, -362925, -12948253, -1257889, -11156714, 650688, 11163694, -1026497, 24877524, -10392210, -5224828, -8818105, 10045929, 16823924, -13548474, -4353486, -20913270, -4019553, -346282, 5785858, 4940286, -11497627, -7057705, 9186398, -3567507, -2453500, -11451457, -22864796, -3200288, -24242406, 6689949, -6307697, -7391639, 8871255, 6671695, -6930467, -7907572, --2247879, -14221710, -8351564, 4549981, 3253975, 4754529, -4188130, -10312216, -11704323, -11972221, -9876277, -17519172, 375273, 4076461, -5268315, 343597, -15032, -2469069, -13710609, -2662343, --5516886, 8681740, 11334956, -2189360, 17568026, -1099512, -86436, -5460514, -1024350, 25025700, -2526515, -11451993, -4442607, 9666898, 7368554, -14058502, 372052, 1879585, -9372156, 7773891, -1939715, 8712341, 1452236, 1224603, 1442035, 568009, 3937411, 5190468, 557272, 2535641, -8633421, 534187, -2969433, 1355062, 4185983, -3386582, -850404, 346282, -3937411, 3568581, -3505230, 4143033, 920197, -4812511, 1146219, -1753957, 841277, -1141388, -794569, 243203, --2549600, 3542811, -1858110, -2745021, -3053185, 7326678, 136365, -8332774, 6011344, 4464619, -2074469, -738198, 4610648, 3229279, -9005473, -2236067, 513249, 196495, -2720325, -12203076, -30816928, -7924752, -2703145, 2740726, 13140452, 9443559, -20007032, -8159364, -19006304, 4175782, -1096827, -5876589, -20918638, 874563, -9762461, 4354023, 4614943, 10572599, 543313, 7699266, -36214628, 7880728, 9045738, -5674189, -2003065, 15822660, -1371168, 1256815, 4202626, 1047435, --2310693, -8249022, 14599668, -15464567, 6459094, -22996328, -6990596, -10750840, -14191109, -12190191, --7516, -25124484, -8540542, 3470871, 14415521, 8302172, -24682640, 14032195, 9343164, 10232760, --15663746, 11555073, -7334194, -17962626, -6093485, -17870822, 8773544, 21420612, 5444945, -2025614, --13927505, 11340861, -14833206, 22372484, -4084514, -2381559, -13394929, -14687178, 2257005, 17480516, -5846524, -11981348, -4765803, 2953864, -2369211, -4777078, 11562052, 5935108, -5200669, 14808510, --1063541, -20938502, 26436598, 14031658, 10978473, 5002563, -3389266, -1253594, -2034204, 7897371, -1947231, 1199370, 17468706, 6803228, 480499, 876710, 2633352, 9086540, -7063074, 5148055, -680215, 1758789, 1842541, 5877126, 3036542, 421444, 9942849, 7521025, 848793, -3344706, --3262565, -1213328, 8185671, 4060892, 4689031, 4373351, 5521718, -6529424, 6818261, -1680943, --1539746, 6189048, 9815074, -1321239, -2438468, 12348, 9361418, 10587631, 4263829, 6551973, -5017059, 16853452, 3207804, -10853919, 4951024, -3165391, 5101885, 18496276, -26025892, -11846594, --20913270, 11899744, -4165045, 2049773, -6859600, 15101642, -14805826, -14999636, -6761889, -3495567, --10641855, -18558554, -8890582, 3486977, 12259447, -17072496, 11337640, -6417755, 1423782, 22146462, -17016124, -264677, 9005473, 4301410, -3444027, -2651069, -29967598, 4194036, -2967823, 2990371, -5935645, -2329483, 903017, 30394410, -27169964, 2601677, 32971928, 4329327, 9169218, -12856448, --3434363, 17235166, 30277908, 1573569, 26862336, -10392747, 24310052, -8462696, 18017924, 18233210, --4409858, 35487704, -5806796, -1445257, -10433012, -15956877, -16877610, -7726646, -10094247, -24592982, --11416560, -5167383, 9211094, 9087077, 1248762, -12593381, -2022930, -3503083, 15950435, 4996658, --8176007, 13664975, 3150359, -1598265, -1824824, -9803800, -1430224, -3842922, 4229469, -9918153, --4696010, -6884296, -6857452, 12740484, 4968741, -4086662, 3904125, -3114925, 2501819, -7486665, -11410654, 659814, 3260417, -166967, -7554848, 7129109, -849330, 2710124, 8123394, 5726265, -3503620, 784368, -11809013, 5836861, -4486630, -381178, 10287520, -50466, 3849365, 2628520, -4940823, 7059316, -2425583, -5349382, -3623879, -4236985, 2175401, 6383395, 10563472, 6305012, --12258910, -1326608, -13317620, -11544335, -38907572, -27769648, -19495394, -2006287, 26577258, -17432198, --2100239, -13427142, -19217832, -16048145, -19634980, -20636780, -8037495, -24346022, -26336202, -23048406, -6620692, -15933792, -8185671, -19847580, 18974628, 30826054, 2794413, -3630321, -10770704, 2464238, --1808718, -884226, -2362769, 9663140, 2171106, 21000242, -18248242, 1538672, -15504832, 31956168, -7981123, -18856518, 14884746, -13533979, 12117176, -18147310, 10726681, 1480153, -10686416, 9639517, --16981226, -5787469, 5566815, 17435420, 7792145, 31001610, -6826314, -20109036, 2028835, -5789616, -2515240, -13348758, -11351599, -21454972, 2860985, -22804666, -4411469, -3626563, -19771346, 13246216, -17026324, -9882720, -908386, -29382946, 33864208, 40806484, 6714108, -16195248, 5749351, 35903780, --16712255, -7729331, -19083614, -11281268, -20963198, 8617852, -840740, -11984032, 9403294, -12002823, -5146445, -7491497, -3236795, 4830228, 2747169, -149787, -7737384, -1636383, 7125888, 3992172, --13019656, 10378252, -9013526, 4756140, 6224482, -4208531, -7579007, 4127464, -6092411, 5098126, -3903589, -8255464, 3201361, -1156957, 3364570, -4934381, -13116830, 3591130, 2527588, -5508296, -3648575, -4937065, 9685151, -181999, 4080756, 1059246, 12531641, 1605781, -16320876, 9287867, -6350646, 2791729, 10566156, -31547608, 57684632, 21738976, -4657355, -17424682, -4771709, -18500034, -19904490, 49933288, 1164473, -33216204, -15098421, 17983564, 6790344, -6648610, 23910082, -4653597, -3080565, 13617194, -1345399, -13793824, -4386772, 11212549, -14314052, -13139916, -5220533, 4646081, -816581, -2530810, -5945309, 10572062, 1212255, 15664819, 12505871, -16201154, 8063801, 19265612, -10912975, -14970645, 5898064, 3184182, 13137231, 312996, 4664335, 3490735, 5497558, 27182848, -25877178, 15939161, 35028144, -17201880, 18126372, -20719996, 13363791, -238908, 12228309, 15143518, -5035313, 3935264, 18549964, 8548059, -4741107, 11676405, 230854, 15664283, -16446504, -9495636, -1616518, 37764572, -25877178, 2526515, -32580548, -3883724, 3986267, 12916577, -15751256, -3138547, --16234976, 4265977, 20455318, -12407624, -29091424, -6226629, -2674691, -7937637, 7323993, 5114769, --8074539, 2949032, -6871948, -6912213, 6795712, -1030792, -3723737, -13211319, 7419556, -541703, --8141648, -6689949, 6501507, 17853642, 1981591, -5089000, -2114735, 6521908, 16267189, 3223910, -1656247, 13370770, -118112, 3663070, -966368, -2590939, -330712, 4873178, 7867307, 4590783, --1850057, -2792803, 7054484, 4853313, -9735617, 9586904, 2898029, 18588618, -4293357, 4756140, -11495480, -7606924, -4356708, 6340446, -10189810, 48321604, 3855807, 3575560, -10726144, -6692633, -7858717, 7428683, 4271882, 18661632, 7619272, -7804493, 9683541, 19889456, -985695, 21792664, --2318746, 10586021, -22377316, 40164924, -6207839, -4712116, 6494528, -30413738, -8073465, -14660334, -21159694, 11734388, 11855183, -14246407, 4887673, 5070209, -19200652, 5178120, 15877957, 13684840, -4420058, -4767414, 1614371, -9203578, 30191472, 4508642, 13451838, 11130945, 16114180, -27303644, --2538863, -8327405, 4688494, -10236518, -12303471, 22347252, -21862994, 16324097, -14034343, 17181480, --4341675, -18387292, -2170032, -27543626, 16475495, 15464030, 18524730, -56768732, 15829639, 9965398, --17869212, -11894375, -16658568, 28858422, -42154032, 24721294, 58041116, 825171, -28491202, -11511586, -16450262, 34058552, 8943196, -12063489, -25757992, -42685532, -3981972, -593242, 16245177, -13037373, --6299644, -10088878, 28438590, 1478543, -1439888, -8716636, 5440113, 1257889, -636192, 723702, --932008, 5011690, 17883706, 22164716, 11302743, -3834332, -2463164, 8517994, 1631551, -6067178, -2024003, -9482214, -6084895, -11458973, -16591996, -33999496, -13911399, 4611185, 956167, 18276696, --14085882, -10099079, 23441932, 8382703, -6973417, -10557030, 7138236, -3053185, -9940702, 23247048, -2062121, -1782411, -8240432, 32212, -10275709, -8312909, -12672838, -3721589, -5532992, -4511863, --13456669, 8755828, -28032178, 4583804, -17058536, 25371446, 1421097, 7271917, -14486925, 11508902, --4307316, -9556302, 4334696, -9851044, -6436546, -8290361, -22517976, -12333535, 15898895, 13945222, -10035728, 11937325, -27172110, -7343857, 4887136, -7489349, 15306727, 11500312, 538482, 9878425, -26244398, -7604240, -27805082, 52455508, -23207856, -28736552, 31771484, -15229954, -9673877, 7575249, -16058346, -19020800, -6589554, 2360622, -13255343, 68165960, -1098438, -10707353, -4793721, 982474, -16359530, -32825898, -25765508, -13796509, -13800804, -775778, -29123100, 316754, -3049427, 10885595, -42423004, 43710956, -17296370, 33866892, -33372432, -28931436, 17218524, 27475980, -9769440, 7859790, -2985002, 18938122, 22575958, 384400, 1058173, 30650498, -27540404, -53417584, -6437619, -21082384, -11508902, 25661892, -2951716, -16650514, 34051036, 10567230, 6503654, -8990440, -28768764, -15559593, -2618856, -11951820, 15822123, -1148367, -10619307, -1150514, -11958263, -11536282, 15709380, -4893042, -6087580, -11552925, 16757352, -1207960, -1454920, 11307575, 16050830, -1536525, -3855270, -11021960, -1039382, -9446781, -9261023, -6584722, -3278671, -16692927, -413391, -7468948, -3292093, -16758962, -4534412, 19821810, 7062000, -11769821, -25214142, -1642825, -2609730, 13557601, -33829848, -6686727, -7484518, -6657200, 15214922, -96637, 9102109, -449898, -2965138, 2155537, -19232864, 20821464, -571231, 12622909, -13023951, -20717848, 19287088, -20509542, 6567542, -4924717, 18148922, -161598, -4220342, -11006391, 3708168, -7842611, -26098368, -21046950, 9123584, -1840394, -432718, 4121021, -19905026, -8997420, -5764920, -16691854, 7358890, 5896453, -1806571, -3408594, -44005700, 1889249, -12652437, -15943455, 11220065, -24626268, -4406100, 1513976, 15525233, 19285476, 2528662, -9338333, -6337224, 34828964, 30638150, 30225832, -1214939, -2848637, 6624450, 3573413, -13782550, 8955544, -38451232, -27369142, -8767102, -7966091, 193810, 1407139, 5079873, -20354386, -30873298, -11675332, --1760937, 62358632, 31797790, 21154862, -2845953, -5487895, -15831786, 27111444, 4004520, 17348446, --6355478, -8439074, -12533788, -11152956, -46061376, -20445118, -24282672, 19120658, -1742683, -9004936, --1406602, -18938658, -8810589, 20045150, 30217242, -4715337, 26651346, 14332306, 11196980, 1610076, -12658342, 15926812, 13457206, -3393561, -790811, 198642, 18190260, -14372571, -18457086, -8964670, -10002979, -1734093, -12966506, -8482560, -12987444, 7693897, -2895345, 16504486, 32969780, 6177237, -20356534, 26382910, 12913893, 16370268, 8311299, 5201206, 7355669, -12071006, 17447230, -14308147, --9535364, 3839701, 1554241, -10200547, 5323612, 9424769, 17519172, 7148973, -19928648, 11025718, -8506183, 2189897, 9369471, -5370857, -10468983, 5842766, -447213, -7681012, -4370666, -7175280, -2833605, -42541652, 23841364, 21033528, -1260573, 34512208, 15362024, -23399518, -23269596, 10135049, --9624485, -20871394, 1244467, 2141041, 9270150, -5152887, 12132209, -2985002, 11482058, 14855218, --13772350, -55166172, 29548302, -8286603, -17407502, 12632573, 19485192, 745714, -37196564, -4806606, --1602023, -38114612, -23925116, 20163260, -5907728, -15453292, -13218299, 8694088, -37247032, -26308822, -50103476, -4216048, -29207388, 11471321, 27187142, 11754252, -41332080, 59040232, 23776938, -36294620, -20138564, 26725434, 4191351, -24561308, 25498684, 28616830, 17301738, -22632330, 21385180, 40059696, -2098092, 40467720, 49927384, -26686780, -16003585, -18563922, 47175384, 30146376, -20565378, 11589432, --12454868, -29985314, 25818122, 58959700, 8451959, -17636746, -14842870, 35451196, -3356517, -39533028, --28399398, 7279970, -1516124, 32876900, -5893769, 25415468, -49270792, -7466264, 1929514, 8538395, --10286447, 10536092, -499827, 1100585, 5612986, 1489817, -12895639, 3999152, -6152004, 8038568, -3088082, -17824114, 15648176, 5209796, -14952392, -10555956, 2821794, -12837657, 2515777, 11941083, -12997645, 1955821, -12248710, -3869229, 4006668, -16661789, 9778030, 12520367, 4024921, 1139240, -12400107, 4648229, -5583995, 6156836, -4498978, 1140314, -8567923, 5508833, 19872814, -14003741, -34641060, 55766392, 22407918, -23067196, -8576513, -19346680, 11796665, -9395778, 15216532, 10124312, --25665650, 13046500, -26156350, -8754217, 119722, -9569187, 1374390, 13626321, 10548977, 768799, --20885890, 4702453, 16596291, -6309844, 2377801, -7517267, -24423868, 24612846, -14800994, 17044040, --25157770, -14758044, -3655017, -20560008, -6241125, 20896090, -20512764, 27546310, 1646583, 22461606, -8719320, -11193222, -30280594, 24707336, 15169824, 10281615, 6180995, 25465934, -19046570, -9614284, --11098732, 7944079, 9384504, -2521683, -23972896, -1104880, -3477313, -24055038, -9723269, 3765076, -6303938, 18924162, -2463701, -16917876, 22300008, -4378183, -4118874, 27033062, 12663174, -22257058, -6979859, -13660143, 8398272, -7186017, 10370199, -19237696, 10502806, -6706055, 21007758, 3590593, -7916162, -7267085, -296890, -15634218, 5986111, 945430, 443455, -476205, 4200478, -6349573, --6099391, -832687, 2252174, -1828046, 3809636, -8008504, -1807108, 5987722, -1760400, -383863, --1575716, 60130, 64961, -12603045, 2060511, 9919764, -111669, -1571958, -3016141, -1343788, --9613211, 549756, -2655901, -1277216, -5167383, -7793218, -2073396, 7387881, -4701916, -2438468, -3151969, 1455994, 5375689, -5868536, -2591476, -1009854, -4951561, -6837588, -7843147, -41640244, --48217988, -26410290, 144568592, 126372432, 77091440, 167812432, -35464080, -126732672, -44047036, -238599936, --124497680, -2845953, -61275760, 84818088, 156533312, 21539798, 92134568, 178530512, 30404074, 62055836, -6347425, -184122560, -153127936, -135909952, -148932288, -90863792, 74494600, 31044560, 74587472, 192991664, -116892904, 29837138, 143829872, 65157340, -87529288, 47414292, -63781340, -168611824, -20396262, -104369312, --190898416, -86628416, -19494320, -100617128, 112244136, 120065272, 57353920, 191414880, 216989808, 81883552, -107474576, 100755104, -112354200, -73753176, -143782080, -225494912, -206753280, -133095128, -132979168, -38582228, -86915640, 111749680, 150107504, 210751904, 189911648, 110514880, 81228568, 14274861, -87531968, -128021160, --93284008, -121904592, -149878784, -51133732, -56393996, -27842662, 94016296, 64648384, 69548944, 145502752, -37513320, -6682432, 24363202, -40537512, -62716188, -35311072, -63382980, -19347754, 41139880, 15328201, -22800370, 51437064, -11841762, 10591389, 28456306, -47748224, -4473209, 59612536, -56296820, 4752918, -9776419, -112960328, -5456756, -2314987, -134481328, 10644003, 47728360, -17399450, 139083920, 126039040, -23375896, 134887200, 66851704, -5939940, 22679038, -36436356, -145301424, -151742272, -187413584, -213618784, --107399952, -17459578, 43456480, 134022304, 223099392, 255558064, 203649088, 150502640, 69067368, -28129352, --84687632, -186703840, -233564624, -172125104, -137888848, -131442640, 8584566, 64535640, 79239464, 129522792, -115795000, 76182520, 75110392, 53983444, 17331266, 21529598, -229781, -40977748, -46860776, -59445568, --76106824, -68073088, -49179524, -36851356, -13717052, 18241262, 27545236, 44781476, 54664196, 47046536, -34440804, 26370562, 11695196, -2129230, -12050604, -17695266, -23966992, -19036368, -13921063, -11141145, --8855686, -2153926, -3183108, -2690260, -518617, -2390686, -5903433, -65498, -1461363, 1200980, -9239548, 14740328, 18321794, 26564910, 19847044, 9956271, -288300, -9264781, -16722455, -18027052, --24420110, -24440512, -19173808, -8459475, -1445793, 9253507, 15159624, 20631950, 19844360, 18417356, -9459129, 2334852, -5022965, -8725763, -12387223, -9847823, -8704288, -3854733, -242129, 4481799, -4603668, 6265284, 3293166, 1909650, -2919504, -4812511, -7317014, -4618701, -3829500, 725313, -2287070, 5556077, 5341329, 6820408, 3973919, 3745748, 464393, -156766, -2880313, -2028298, --3720516, -2219961, -3064996, -989990, -1648194, 496606, -511638, 932545, -616865, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +15756088, 6017786, 3842385, 1228898, -3318936, 29528, 3036005, 5667210, 95563, 539555, +350040, -2090575, 571768, 1917166, -369904, 1873143, 2923262, 3861713, 1644973, 1580548, +2058363, 1801739, -3539053, 3601330, 6796249, -3220152, 1944547, 1058710, 1910187, 344671, +4031364, -2618320, -914291, -2356327, 2333778, 6717329, -1115081, 3258807, -73551, -1520955, +-5522254, 2071248, -2853469, 2552284, 1310502, 2851858, -301721, -1715303, 917512, -1181116, +3865471, 498216, -3033321, 3908420, -839666, 3051574, 2367601, -120259, 2273648, 4407174, +-1224603, -1539209, -1235340, 2196339, -1786706, -2369748, 2755222, 38118, 1853815, -2927020, +4347044, 263604, -1206886, -500364, -466004, 1733556, -1609002, -2590939, 1550483, 2335925, +2216740, -2051921, -3065533, 1249299, -94489, -357019, -1173063, -1114544, 1555852, -390842, +-213138, -942745, -1118839, 237297, -801011, 365072, 251256, 1156420, 806917, -324807, +423591, 665720, -675384, -270046, 56908, -296890, -514322, 415001, 1119376, 651761, +839666, 35433, -64961, 305480, -689879, 16643, 266825, 12268037, 9552007, 4851166, +664646, -1774895, 5521181, -3218541, -3528316, -770410, -6137509, 3718905, 212601, -2499671, +1410360, 3575024, 6055367, -2794950, 3478924, 7940858, -2290828, 83215, 1780264, 4139812, +-1067836, 4507568, 3140695, 4559645, 1013612, 3487514, -3553549, 6068252, -751082, 5855651, +2863133, -619012, 697395, -942745, -161598, -2085744, -1022202, -2582349, -1945620, 2053531, +-572304, -5627481, -1293322, 617402, -183073, -3132642, -3280281, -1634772, -1432909, 4434017, +-1793149, -4835060, -6504191, -7118372, -2485712, -3127273, -281320, 1113470, 3420405, -4652524, +-2144263, 558346, -497679, -2078764, 493921, -4898947, -489089, -5776194, 3066607, -3140695, +-1561221, 4022774, -609885, 2763812, 768799, 1012002, 3081639, 782758, -2528125, -1139240, +221728, -2433636, 1271847, 2490544, 1179505, -1906429, 1408749, 2083059, 378494, 1131187, +-638340, -1118839, -813359, -1118839, 771484, -112206, 705448, -934692, -725313, 801011, +1125818, 6493454, -14061723, -3764002, -7129646, -1315334, -15569, 7743826, -3774740, -12590160, +-4449049, -316754, 4784057, 1499481, -4685273, -10931766, -2826625, 3000035, -1239098, 6161668, +228707, 2700461, -623307, -4852240, -5295158, 3183645, 3869229, 455803, 1246077, -192737, +2359548, 551366, -6511708, 345745, 9134859, 1231045, -2288144, -845035, -2445447, 559956, +-2112050, -3976603, 6110128, -1905892, -2566243, 5558762, -2924336, -4937602, 209917, 31139, +144418, -7121593, 5771363, -2208687, -154619, 5337034, 4838818, -7636452, -1953673, 1474784, +1835562, -678605, 4162897, 1148904, 2057826, 2894808, 413927, 2312303, 3483219, 759136, +537, 3263638, -8728447, -1933272, 198105, 4432406, 2439542, -1077500, -903554, 3221762, +2982318, -3478387, -520228, -1243393, 81604, 1902671, 2406256, 478352, 2979097, -311385, +-2181844, -1026497, 213675, 215285, 256624, -818728, 2063195, -439160, 721555, -328565, +-985158, 607201, -62277, -426276, -815507, 162672, -770410, -132070, -1355599, -1029182, +233539, -212064, -1071058, -2044941, -785979, 432718, 1677185, -27995670, -10999948, -5665062, +-7897908, 2476049, -2705293, -2696703, -292058, 3513820, -3163780, -3840238, -5513665, 1097364, +5032091, 1095754, -3766150, -4748087, 1455457, 4146254, 3897146, -5394479, -7880728, 582505, +-7364259, 3934190, -4832, 2741263, -163746, 2644626, -2870649, -1239098, 7794829, -9390409, +4359929, 2174327, 1095217, -3338800, 2119030, 4605816, 1278290, -5725192, 1199907, -3636227, +2841658, -7809861, -248034, -7075422, 5486821, -587874, -1352378, -2015950, 3043521, -11865921, +5517959, -3428995, -7126962, 2860448, 5826660, 6521908, 3901441, 1386201, -410706, 768799, +-539018, 4207458, -2350421, 1187559, 3371013, 8157217, 1358820, 156766, -5805185, 3733937, +-2856153, 664109, 223875, 4342212, -3794067, 224949, 4052839, -357019, -4672925, -6522982, +5454072, 452045, 1074816, 2718178, -495532, 1322313, 1228361, -39728, 1040456, -454730, +230318, 1449015, 1410360, 1428614, -2297271, 933082, -1707250, -768799, -1427003, 1403381, +-1627793, -15898358, 7781407, 12417824, 2408940, 983011, 6897181, 2332167, 2107218, 3775813, +514859, 3950833, 3966939, -3202972, -592169, 539555, -3905736, -2417530, -54761, 1919850, +-2305861, 12911745, 6854768, -1883343, 918586, 4100083, 5157719, 5893232, -2471754, 4150012, +4828080, 272194, 1404991, 1393180, 2747169, 1994476, 1209033, 2728378, 2600603, -5586679, +-4323422, -8600672, 925029, -3047279, -4305168, 4423817, -1263794, 2784750, -10661719, 11733314, +-857920, -5580773, -1042066, 9300752, 6725382, -1483911, 234613, 4503273, -2148558, 1935957, +-3436511, -7323993, 855772, 683974, -5892159, -2329483, -5807870, 1035087, 2137283, 1311039, +-2827699, -5127654, -7820599, -9310415, -6701760, -2609193, 528281, -2265059, 899259, 3091840, +2736968, -3870303, -423054, -4220879, 1532767, -1471563, 1204202, -56371, -1731946, 1233193, +1401770, -1242856, -594316, -1617592, 2173790, -2587181, 555661, 828929, 759672, -261993, +-609349, 552977, 1152662, 1159104, 942208, 728534, 970663, 321586, 1853815, -427886, +2054605, -1285269, 645856, -381715, -534723, -1479616, -1149978, -984084, -1345399, 529892, +-1080721, -143345, 978179, 328565, 29336774, 7753490, 2197413, -1105417, 17694192, 2056753, +8421357, 1717450, 5611375, 9189619, 3276523, -5120675, 5461051, 6315213, 1029718, -471373, +1382443, 11572789, 835908, -3964792, -7007239, -2073396, -178241, -8048232, 1385664, 2384781, +4653597, 1966021, 3296924, 8869644, -2730526, -1409286, 5490042, -850404, -2362232, -456877, +-7890392, 5134634, 3403762, 186831, 5149129, -2545842, -6901476, -15010911, -5451924, 5553930, +6179921, 201327, 4353486, -4233764, -4555350, 12228846, -7018514, 5547487, -6172405, 1311576, +-9022116, -9519795, 10401874, -3940096, -3660923, 14283451, 1134945, -1591285, -6643241, 5244692, +8306467, 415538, -4378183, -8392903, -1254131, 6124087, -1889249, 2085207, -3646427, 3023120, +-1344325, 988379, 6581501, -7010461, 2268817, -1974074, 508417, 823560, -734976, 7538205, +2429878, 1121523, -2160369, 91268, -1694902, 3184718, -1458678, 2528662, 2599529, -2628520, +92879, -409096, -1636383, 3590056, 680752, 1686848, 213138, -1248225, 804233, 29528, +146029, 1037235, 1666447, 603980, 2161442, 667867, -76773, 1181116, 876173, -796716, +336618, -337155, 540092, 1867774, 2146410, 345208, -102542, 15027554, 4868346, 12473122, +-7672959, 2595234, 6829535, -9307731, -3307125, -3562139, 899796, -4642323, -2985002, 7445863, +-2305861, -1255204, -595390, 9288404, -3422552, -4122632, 9713069, 1710471, -6993281, 3045132, +-1589138, 1692754, 3629247, -5486284, -1364726, -4090956, -7636989, 1047435, 124017, 1564979, +-7514046, -7631083, 2937221, -547071, 2857227, -188442, 4186519, 1374926, -257698, -4830228, +-4860829, 1452773, 4719632, 2445984, -1458678, 14168023, 3274913, 2524367, 6324876, 2484102, +4689031, 4953708, 3104188, 2061584, 2366527, -1920924, -1166084, 1187022, -6017786, 1695438, +-9663676, 2742337, -6415608, 5097053, -3632469, 2852932, -1297617, -4540318, 1512365, -1112933, +4959077, -4248797, 13358959, 11423539, 5163088, -9546639, 2984466, 4416300, -4179540, 1905355, +1144072, 6698002, 6200322, 2742337, -192200, -777926, -1394791, -3702799, 5777268, -322659, +-752693, 134755, -1723356, 752693, 1896765, -1484985, 2988760, -1038308, -2545305, -2498060, +-137976, 1903744, 1689533, -362925, -668941, -1947231, -934155, 1207423, -2521146, 2882460, +2818572, -1700270, 473520, -2183454, -797253, 506806, 894964, -1635846, 2995203, -18505940, +-35602596, -1523640, -7136088, 6169184, -1838246, -9866077, -960462, -7992934, -8810589, -7559143, +11635603, 6031745, -7787313, -4486630, 8849780, 5114769, 7895224, -5459977, 5099737, -4846871, +-4892505, -1524713, -2149094, -15081778, 4093641, 8576513, 3681324, -8977555, -2081449, 1561758, +2268817, -8014409, -1806571, -11492259, 2501819, -5464809, -537408, -4025458, 2163053, 12234214, +-1353989, -2312840, 6113349, 8932458, -5458367, 2410014, 3353833, -7599945, 4014184, 3736622, +-8919573, 1357210, 5708549, -1398549, -9393093, -5935645, -6074158, 8450348, 3250217, 8273181, +-4964446, -9657771, 2236067, 4748087, -2088428, -6928856, 4527970, 6674379, 6327561, -7940321, +-4147865, -1690070, 12700218, -2761127, 7561290, 2185065, -9020505, -7363185, -1446330, 4948339, +-8552354, -559420, -1633698, 4618701, -1075352, 10482941, 1268089, -2473364, -3202972, -2732136, +-3092377, -2031520, -1085553, 905701, -82141, -1302986, -3921305, -439697, -3815005, -1711545, +1486059, -1382980, 553514, -1161789, -2901251, 1643899, -520228, 4441533, -941672, -3740917, +-2641942, 1365263, -753230, 85899, -1088774, -2435783, 737124, 2451890, -2316061, -789200, +3381213, 1516124, -2196876, 103079, 2654827, -18009872, -220117, 709743, 10302016, 2750390, +-4389994, 6419366, -3185792, 2925410, -10065256, -2696703, -6448357, -3262028, -12672301, -4529043, +-7644505, 17415018, 9697499, 10695542, -12431246, -10272488, -5203890, 6073084, -747861, 69793, +171799, 3730179, -1018444, 5207648, -7305740, -5910949, -296353, -1531156, -8968965, -8640400, +-7250442, -4921496, -3990562, -3317325, -11311870, 5317170, 13483513, -2755759, 6232535, 8982387, +-6594386, 7801808, 4647155, 2013266, 12304008, -389231, 10280004, 4081830, 1192390, -9594957, +3778498, 5048734, -2724620, 14567992, 11310796, 2438468, -4402342, -6951942, 4017942, -6830072, +2723546, 66572, 8371428, 185757, -12773770, 1118302, -5102421, -1809255, -9596568, 11290395, +5640366, 4224101, 2529199, 12578349, -3666828, -12758200, -2134599, 8358007, 123480, -6471979, +-1818382, 1133335, -2984466, 1786706, 3825205, 166967, 29528, -628676, 1180579, -10201, +4630512, 1646583, 1316408, -908386, 1737314, 2698850, 4197794, -3395709, 2284386, 2684892, +-119722, 984621, 4230006, 2594697, 1030255, -2417530, 3582003, -872952, -2216740, -2273112, +-250719, -6235219, 3985193, 2279017, 651761, -2841121, 3503620, 3808026, 6295349, 4199405, +999117, 1320703, 239981, 5511517, -16430397, 7373385, 5509370, 6992744, -7643968, -13730474, +4014184, 4044786, 738734, -11586748, 11074573, 3101503, -5829881, -10210748, 4633196, -4549981, +17699560, 20491288, 3086471, -3348464, -7617662, 11611444, -13229573, -4811974, 16441135, 4017942, +-3136937, -8921184, -8118025, -4675072, 339839, -10896332, 2493229, 11494943, -1420560, 4284767, +-8416525, -7785702, -2572149, -6445672, 16834124, -6213207, 7587597, 6148783, 6861211, 1746978, +3396246, -11689827, -11623792, -11241003, -2446521, 8351564, 19402514, -7845295, -13932337, -3277597, +-6393596, 3536369, 3052111, 10732050, -6534256, -180926, -8674223, -1703491, 15549929, -2021856, +-8391292, 11051488, 3685082, 1755568, 5874442, -12474196, 1950452, -4247186, 1254131, 5659157, +13678934, 3779571, -15785615, 5758478, 1437740, -2485176, -6549289, 282394, -1636383, -890132, +-374736, 2212982, 3701725, 4367445, 1505923, 280247, -2505040, 811749, -741419, 3135863, +-5324149, 1999307, 2143726, -126165, 525060, 893890, -4017405, -115427, -2648921, 4429185, +4167729, 1022202, 4994510, -1929514, 734439, 3775813, -745177, 2995740, 784905, 2776160, +981400, -6242735, -332860, -2221572, -305480, 867047, 418222, -2184528, 260382, -2573759, +50466, -1236414, 26800060, -11648488, -9126806, -2790655, 5648956, -15674483, 6277632, -4230006, +7917236, -7034083, -3205656, 9725953, 7211787, 2749316, -4891968, -1770600, 13312251, 13096966, +-2718178, 11436961, -3316789, 16814796, -7857643, -4126927, 3019899, 17616346, 12866648, 4261682, +-9437654, -657667, -19559818, -2952253, 3060164, 9002788, 10488847, 18567680, 4867809, -334471, +-894427, -7120519, -12197707, -870805, -10579041, 7658464, 2403571, 11840151, 6590091, -4036196, +11734388, -13959717, 6318434, -3107409, 1015760, -2421288, 14936823, 8758512, 4280472, 2671470, +-27096412, -4303021, 16081431, 8126078, 1005559, -492848, 824634, 12974022, 5509906, -20484310, +-6674379, -7895224, 1931662, 454730, -20351702, 811212, -19021874, -12607340, -1636383, -8164733, +-8849243, 11918534, 15044734, -1595044, -7280507, -779537, 4638565, -1816771, 3962644, 6180995, +-469225, 6865505, 10040023, -3165391, -5543729, 965831, -2343979, 3073049, 2008971, -1532230, +-1359894, 181462, 190589, 2881923, -262530, -3387656, 747861, 3469260, 1315871, 3092913, +-2582349, 4661114, 52613, -1618129, 1185948, -2828236, 1224603, -5742372, -3668976, -4471598, +2417530, 312996, -4261145, -769336, 3777424, 2536715, 3290482, -2028298, 1848447, 142271, +-638876, -5456219, -2777233, -5786395, 9901510, 18722300, -4597763, -7885560, 1248225, 7125351, +4355634, -11758010, -567473, -9562745, -362925, -12948253, -1257889, -11156714, 650688, 11163694, +1026497, 24877524, -10392210, -5224828, -8818105, 10045929, 16823924, -13548474, -4353486, -20913270, +4019553, -346282, 5785858, 4940286, -11497627, -7057705, 9186398, -3567507, -2453500, -11451457, +22864796, -3200288, -24242406, 6689949, -6307697, -7391639, 8871255, 6671695, -6930467, -7907572, +-2247879, -14221710, -8351564, 4549981, 3253975, 4754529, -4188130, -10312216, -11704323, -11972221, +9876277, -17519172, 375273, 4076461, -5268315, 343597, -15032, -2469069, -13710609, -2662343, +-5516886, 8681740, 11334956, -2189360, 17568026, -1099512, -86436, -5460514, -1024350, 25025700, +2526515, -11451993, -4442607, 9666898, 7368554, -14058502, 372052, 1879585, -9372156, 7773891, +1939715, 8712341, 1452236, 1224603, 1442035, 568009, 3937411, 5190468, 557272, 2535641, +8633421, 534187, -2969433, 1355062, 4185983, -3386582, -850404, 346282, -3937411, 3568581, +3505230, 4143033, 920197, -4812511, 1146219, -1753957, 841277, -1141388, -794569, 243203, +-2549600, 3542811, -1858110, -2745021, -3053185, 7326678, 136365, -8332774, 6011344, 4464619, +2074469, -738198, 4610648, 3229279, -9005473, -2236067, 513249, 196495, -2720325, -12203076, +30816928, -7924752, -2703145, 2740726, 13140452, 9443559, -20007032, -8159364, -19006304, 4175782, +1096827, -5876589, -20918638, 874563, -9762461, 4354023, 4614943, 10572599, 543313, 7699266, +36214628, 7880728, 9045738, -5674189, -2003065, 15822660, -1371168, 1256815, 4202626, 1047435, +-2310693, -8249022, 14599668, -15464567, 6459094, -22996328, -6990596, -10750840, -14191109, -12190191, +-7516, -25124484, -8540542, 3470871, 14415521, 8302172, -24682640, 14032195, 9343164, 10232760, +-15663746, 11555073, -7334194, -17962626, -6093485, -17870822, 8773544, 21420612, 5444945, -2025614, +-13927505, 11340861, -14833206, 22372484, -4084514, -2381559, -13394929, -14687178, 2257005, 17480516, +5846524, -11981348, -4765803, 2953864, -2369211, -4777078, 11562052, 5935108, -5200669, 14808510, +-1063541, -20938502, 26436598, 14031658, 10978473, 5002563, -3389266, -1253594, -2034204, 7897371, +1947231, 1199370, 17468706, 6803228, 480499, 876710, 2633352, 9086540, -7063074, 5148055, +680215, 1758789, 1842541, 5877126, 3036542, 421444, 9942849, 7521025, 848793, -3344706, +-3262565, -1213328, 8185671, 4060892, 4689031, 4373351, 5521718, -6529424, 6818261, -1680943, +-1539746, 6189048, 9815074, -1321239, -2438468, 12348, 9361418, 10587631, 4263829, 6551973, +5017059, 16853452, 3207804, -10853919, 4951024, -3165391, 5101885, 18496276, -26025892, -11846594, +-20913270, 11899744, -4165045, 2049773, -6859600, 15101642, -14805826, -14999636, -6761889, -3495567, +-10641855, -18558554, -8890582, 3486977, 12259447, -17072496, 11337640, -6417755, 1423782, 22146462, +17016124, -264677, 9005473, 4301410, -3444027, -2651069, -29967598, 4194036, -2967823, 2990371, +5935645, -2329483, 903017, 30394410, -27169964, 2601677, 32971928, 4329327, 9169218, -12856448, +-3434363, 17235166, 30277908, 1573569, 26862336, -10392747, 24310052, -8462696, 18017924, 18233210, +-4409858, 35487704, -5806796, -1445257, -10433012, -15956877, -16877610, -7726646, -10094247, -24592982, +-11416560, -5167383, 9211094, 9087077, 1248762, -12593381, -2022930, -3503083, 15950435, 4996658, +-8176007, 13664975, 3150359, -1598265, -1824824, -9803800, -1430224, -3842922, 4229469, -9918153, +-4696010, -6884296, -6857452, 12740484, 4968741, -4086662, 3904125, -3114925, 2501819, -7486665, +11410654, 659814, 3260417, -166967, -7554848, 7129109, -849330, 2710124, 8123394, 5726265, +3503620, 784368, -11809013, 5836861, -4486630, -381178, 10287520, -50466, 3849365, 2628520, +4940823, 7059316, -2425583, -5349382, -3623879, -4236985, 2175401, 6383395, 10563472, 6305012, +-12258910, -1326608, -13317620, -11544335, -38907572, -27769648, -19495394, -2006287, 26577258, -17432198, +-2100239, -13427142, -19217832, -16048145, -19634980, -20636780, -8037495, -24346022, -26336202, -23048406, +6620692, -15933792, -8185671, -19847580, 18974628, 30826054, 2794413, -3630321, -10770704, 2464238, +-1808718, -884226, -2362769, 9663140, 2171106, 21000242, -18248242, 1538672, -15504832, 31956168, +7981123, -18856518, 14884746, -13533979, 12117176, -18147310, 10726681, 1480153, -10686416, 9639517, +-16981226, -5787469, 5566815, 17435420, 7792145, 31001610, -6826314, -20109036, 2028835, -5789616, +2515240, -13348758, -11351599, -21454972, 2860985, -22804666, -4411469, -3626563, -19771346, 13246216, +17026324, -9882720, -908386, -29382946, 33864208, 40806484, 6714108, -16195248, 5749351, 35903780, +-16712255, -7729331, -19083614, -11281268, -20963198, 8617852, -840740, -11984032, 9403294, -12002823, +5146445, -7491497, -3236795, 4830228, 2747169, -149787, -7737384, -1636383, 7125888, 3992172, +-13019656, 10378252, -9013526, 4756140, 6224482, -4208531, -7579007, 4127464, -6092411, 5098126, +3903589, -8255464, 3201361, -1156957, 3364570, -4934381, -13116830, 3591130, 2527588, -5508296, +3648575, -4937065, 9685151, -181999, 4080756, 1059246, 12531641, 1605781, -16320876, 9287867, +6350646, 2791729, 10566156, -31547608, 57684632, 21738976, -4657355, -17424682, -4771709, -18500034, +19904490, 49933288, 1164473, -33216204, -15098421, 17983564, 6790344, -6648610, 23910082, -4653597, +3080565, 13617194, -1345399, -13793824, -4386772, 11212549, -14314052, -13139916, -5220533, 4646081, +816581, -2530810, -5945309, 10572062, 1212255, 15664819, 12505871, -16201154, 8063801, 19265612, +10912975, -14970645, 5898064, 3184182, 13137231, 312996, 4664335, 3490735, 5497558, 27182848, +25877178, 15939161, 35028144, -17201880, 18126372, -20719996, 13363791, -238908, 12228309, 15143518, +5035313, 3935264, 18549964, 8548059, -4741107, 11676405, 230854, 15664283, -16446504, -9495636, +1616518, 37764572, -25877178, 2526515, -32580548, -3883724, 3986267, 12916577, -15751256, -3138547, +-16234976, 4265977, 20455318, -12407624, -29091424, -6226629, -2674691, -7937637, 7323993, 5114769, +-8074539, 2949032, -6871948, -6912213, 6795712, -1030792, -3723737, -13211319, 7419556, -541703, +-8141648, -6689949, 6501507, 17853642, 1981591, -5089000, -2114735, 6521908, 16267189, 3223910, +1656247, 13370770, -118112, 3663070, -966368, -2590939, -330712, 4873178, 7867307, 4590783, +-1850057, -2792803, 7054484, 4853313, -9735617, 9586904, 2898029, 18588618, -4293357, 4756140, +11495480, -7606924, -4356708, 6340446, -10189810, 48321604, 3855807, 3575560, -10726144, -6692633, +7858717, 7428683, 4271882, 18661632, 7619272, -7804493, 9683541, 19889456, -985695, 21792664, +-2318746, 10586021, -22377316, 40164924, -6207839, -4712116, 6494528, -30413738, -8073465, -14660334, +21159694, 11734388, 11855183, -14246407, 4887673, 5070209, -19200652, 5178120, 15877957, 13684840, +4420058, -4767414, 1614371, -9203578, 30191472, 4508642, 13451838, 11130945, 16114180, -27303644, +-2538863, -8327405, 4688494, -10236518, -12303471, 22347252, -21862994, 16324097, -14034343, 17181480, +-4341675, -18387292, -2170032, -27543626, 16475495, 15464030, 18524730, -56768732, 15829639, 9965398, +-17869212, -11894375, -16658568, 28858422, -42154032, 24721294, 58041116, 825171, -28491202, -11511586, +16450262, 34058552, 8943196, -12063489, -25757992, -42685532, -3981972, -593242, 16245177, -13037373, +-6299644, -10088878, 28438590, 1478543, -1439888, -8716636, 5440113, 1257889, -636192, 723702, +-932008, 5011690, 17883706, 22164716, 11302743, -3834332, -2463164, 8517994, 1631551, -6067178, +2024003, -9482214, -6084895, -11458973, -16591996, -33999496, -13911399, 4611185, 956167, 18276696, +-14085882, -10099079, 23441932, 8382703, -6973417, -10557030, 7138236, -3053185, -9940702, 23247048, +2062121, -1782411, -8240432, 32212, -10275709, -8312909, -12672838, -3721589, -5532992, -4511863, +-13456669, 8755828, -28032178, 4583804, -17058536, 25371446, 1421097, 7271917, -14486925, 11508902, +-4307316, -9556302, 4334696, -9851044, -6436546, -8290361, -22517976, -12333535, 15898895, 13945222, +10035728, 11937325, -27172110, -7343857, 4887136, -7489349, 15306727, 11500312, 538482, 9878425, +26244398, -7604240, -27805082, 52455508, -23207856, -28736552, 31771484, -15229954, -9673877, 7575249, +16058346, -19020800, -6589554, 2360622, -13255343, 68165960, -1098438, -10707353, -4793721, 982474, +16359530, -32825898, -25765508, -13796509, -13800804, -775778, -29123100, 316754, -3049427, 10885595, +42423004, 43710956, -17296370, 33866892, -33372432, -28931436, 17218524, 27475980, -9769440, 7859790, +2985002, 18938122, 22575958, 384400, 1058173, 30650498, -27540404, -53417584, -6437619, -21082384, +11508902, 25661892, -2951716, -16650514, 34051036, 10567230, 6503654, -8990440, -28768764, -15559593, +2618856, -11951820, 15822123, -1148367, -10619307, -1150514, -11958263, -11536282, 15709380, -4893042, +6087580, -11552925, 16757352, -1207960, -1454920, 11307575, 16050830, -1536525, -3855270, -11021960, +1039382, -9446781, -9261023, -6584722, -3278671, -16692927, -413391, -7468948, -3292093, -16758962, +4534412, 19821810, 7062000, -11769821, -25214142, -1642825, -2609730, 13557601, -33829848, -6686727, +7484518, -6657200, 15214922, -96637, 9102109, -449898, -2965138, 2155537, -19232864, 20821464, +571231, 12622909, -13023951, -20717848, 19287088, -20509542, 6567542, -4924717, 18148922, -161598, +4220342, -11006391, 3708168, -7842611, -26098368, -21046950, 9123584, -1840394, -432718, 4121021, +19905026, -8997420, -5764920, -16691854, 7358890, 5896453, -1806571, -3408594, -44005700, 1889249, +12652437, -15943455, 11220065, -24626268, -4406100, 1513976, 15525233, 19285476, 2528662, -9338333, +6337224, 34828964, 30638150, 30225832, -1214939, -2848637, 6624450, 3573413, -13782550, 8955544, +38451232, -27369142, -8767102, -7966091, 193810, 1407139, 5079873, -20354386, -30873298, -11675332, +-1760937, 62358632, 31797790, 21154862, -2845953, -5487895, -15831786, 27111444, 4004520, 17348446, +-6355478, -8439074, -12533788, -11152956, -46061376, -20445118, -24282672, 19120658, -1742683, -9004936, +-1406602, -18938658, -8810589, 20045150, 30217242, -4715337, 26651346, 14332306, 11196980, 1610076, +12658342, 15926812, 13457206, -3393561, -790811, 198642, 18190260, -14372571, -18457086, -8964670, +10002979, -1734093, -12966506, -8482560, -12987444, 7693897, -2895345, 16504486, 32969780, 6177237, +20356534, 26382910, 12913893, 16370268, 8311299, 5201206, 7355669, -12071006, 17447230, -14308147, +-9535364, 3839701, 1554241, -10200547, 5323612, 9424769, 17519172, 7148973, -19928648, 11025718, +8506183, 2189897, 9369471, -5370857, -10468983, 5842766, -447213, -7681012, -4370666, -7175280, +2833605, -42541652, 23841364, 21033528, -1260573, 34512208, 15362024, -23399518, -23269596, 10135049, +-9624485, -20871394, 1244467, 2141041, 9270150, -5152887, 12132209, -2985002, 11482058, 14855218, +-13772350, -55166172, 29548302, -8286603, -17407502, 12632573, 19485192, 745714, -37196564, -4806606, +-1602023, -38114612, -23925116, 20163260, -5907728, -15453292, -13218299, 8694088, -37247032, -26308822, +50103476, -4216048, -29207388, 11471321, 27187142, 11754252, -41332080, 59040232, 23776938, -36294620, +20138564, 26725434, 4191351, -24561308, 25498684, 28616830, 17301738, -22632330, 21385180, 40059696, +2098092, 40467720, 49927384, -26686780, -16003585, -18563922, 47175384, 30146376, -20565378, 11589432, +-12454868, -29985314, 25818122, 58959700, 8451959, -17636746, -14842870, 35451196, -3356517, -39533028, +-28399398, 7279970, -1516124, 32876900, -5893769, 25415468, -49270792, -7466264, 1929514, 8538395, +-10286447, 10536092, -499827, 1100585, 5612986, 1489817, -12895639, 3999152, -6152004, 8038568, +3088082, -17824114, 15648176, 5209796, -14952392, -10555956, 2821794, -12837657, 2515777, 11941083, +12997645, 1955821, -12248710, -3869229, 4006668, -16661789, 9778030, 12520367, 4024921, 1139240, +12400107, 4648229, -5583995, 6156836, -4498978, 1140314, -8567923, 5508833, 19872814, -14003741, +34641060, 55766392, 22407918, -23067196, -8576513, -19346680, 11796665, -9395778, 15216532, 10124312, +-25665650, 13046500, -26156350, -8754217, 119722, -9569187, 1374390, 13626321, 10548977, 768799, +-20885890, 4702453, 16596291, -6309844, 2377801, -7517267, -24423868, 24612846, -14800994, 17044040, +-25157770, -14758044, -3655017, -20560008, -6241125, 20896090, -20512764, 27546310, 1646583, 22461606, +8719320, -11193222, -30280594, 24707336, 15169824, 10281615, 6180995, 25465934, -19046570, -9614284, +-11098732, 7944079, 9384504, -2521683, -23972896, -1104880, -3477313, -24055038, -9723269, 3765076, +6303938, 18924162, -2463701, -16917876, 22300008, -4378183, -4118874, 27033062, 12663174, -22257058, +6979859, -13660143, 8398272, -7186017, 10370199, -19237696, 10502806, -6706055, 21007758, 3590593, +7916162, -7267085, -296890, -15634218, 5986111, 945430, 443455, -476205, 4200478, -6349573, +-6099391, -832687, 2252174, -1828046, 3809636, -8008504, -1807108, 5987722, -1760400, -383863, +-1575716, 60130, 64961, -12603045, 2060511, 9919764, -111669, -1571958, -3016141, -1343788, +-9613211, 549756, -2655901, -1277216, -5167383, -7793218, -2073396, 7387881, -4701916, -2438468, +3151969, 1455994, 5375689, -5868536, -2591476, -1009854, -4951561, -6837588, -7843147, -41640244, +-48217988, -26410290, 144568592, 126372432, 77091440, 167812432, -35464080, -126732672, -44047036, -238599936, +-124497680, -2845953, -61275760, 84818088, 156533312, 21539798, 92134568, 178530512, 30404074, 62055836, +6347425, -184122560, -153127936, -135909952, -148932288, -90863792, 74494600, 31044560, 74587472, 192991664, +116892904, 29837138, 143829872, 65157340, -87529288, 47414292, -63781340, -168611824, -20396262, -104369312, +-190898416, -86628416, -19494320, -100617128, 112244136, 120065272, 57353920, 191414880, 216989808, 81883552, +107474576, 100755104, -112354200, -73753176, -143782080, -225494912, -206753280, -133095128, -132979168, -38582228, +86915640, 111749680, 150107504, 210751904, 189911648, 110514880, 81228568, 14274861, -87531968, -128021160, +-93284008, -121904592, -149878784, -51133732, -56393996, -27842662, 94016296, 64648384, 69548944, 145502752, +37513320, -6682432, 24363202, -40537512, -62716188, -35311072, -63382980, -19347754, 41139880, 15328201, +22800370, 51437064, -11841762, 10591389, 28456306, -47748224, -4473209, 59612536, -56296820, 4752918, +9776419, -112960328, -5456756, -2314987, -134481328, 10644003, 47728360, -17399450, 139083920, 126039040, +23375896, 134887200, 66851704, -5939940, 22679038, -36436356, -145301424, -151742272, -187413584, -213618784, +-107399952, -17459578, 43456480, 134022304, 223099392, 255558064, 203649088, 150502640, 69067368, -28129352, +-84687632, -186703840, -233564624, -172125104, -137888848, -131442640, 8584566, 64535640, 79239464, 129522792, +115795000, 76182520, 75110392, 53983444, 17331266, 21529598, -229781, -40977748, -46860776, -59445568, +-76106824, -68073088, -49179524, -36851356, -13717052, 18241262, 27545236, 44781476, 54664196, 47046536, +34440804, 26370562, 11695196, -2129230, -12050604, -17695266, -23966992, -19036368, -13921063, -11141145, +-8855686, -2153926, -3183108, -2690260, -518617, -2390686, -5903433, -65498, -1461363, 1200980, +9239548, 14740328, 18321794, 26564910, 19847044, 9956271, -288300, -9264781, -16722455, -18027052, +-24420110, -24440512, -19173808, -8459475, -1445793, 9253507, 15159624, 20631950, 19844360, 18417356, +9459129, 2334852, -5022965, -8725763, -12387223, -9847823, -8704288, -3854733, -242129, 4481799, +4603668, 6265284, 3293166, 1909650, -2919504, -4812511, -7317014, -4618701, -3829500, 725313, +2287070, 5556077, 5341329, 6820408, 3973919, 3745748, 464393, -156766, -2880313, -2028298, +-3720516, -2219961, -3064996, -989990, -1648194, 496606, -511638, 932545, -616865, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -517007, -6449967, -663036, 1957431, -1178432, 8610873, -3382287, -837519, -304943, 1064615, -1521492, -3942780, -681826, -2662880, -471910, 5392332, 400506, -2732673, 2529736, 1861868, 3552475, -1452236, -2704756, -1791001, 6029597, 836982, -1543504, -1194538, -1228898, 1183264, 1283658, --779537, -7676717, -1924145, 370441, 5297842, 1894618, -659278, -22012, -3059627, 4220342, --4312684, -5733245, 740882, 55298, -1944010, -1320703, -1603633, 820339, 520765, 505732, --2008971, 5005785, 151398, 6709276, -1082332, -3196530, 1469416, -356482, 957241, 1557463, -3388729, 2306398, -868657, -1842541, -1571421, 4352950, -4433480, 172872, 123480, -778463, --3802657, 3352759, -1918240, 442919, 2909840, -2050310, -2748779, -2285460, 2950643, -272194, --920734, -820339, 96100, -553514, -1199370, 1465658, 1500554, 1096290, 682900, 375273, -2051384, 331249, -44023, 431644, -202400, 73014, -475668, -255014, -246961, 1386201, -333397, -933619, 1164473, -2544768, 2225330, 1342177, -2998424, -1645509, -230854, 284005, --153008, -437550, -1514513, 2723009, 529892, -1163399, -1582696, -73014, 5628555, -777926, --2630668, 3608310, -1389422, -3378529, -330712, 2889976, 2165737, -1844689, 523986, -2308008, -1368484, 1332514, -1089848, 2888903, -765578, -5179194, 986232, 2704756, 2535105, 367220, --360240, -3750043, -1243930, -481036, -1622961, 3413425, 4800700, 2238215, -6481643, 2219424, -7692824, 3186866, -343061, -33823, 3561602, -1727651, 1188632, -3213173, -2888366, 2985002, -3387656, 1636383, 934155, 612570, 711354, 1604170, 339839, -282931, -1116155, 825707, --2236604, -406948, -940598, -4626754, -2282775, 996969, 1771137, 1450625, 3189550, 2505577, -2656974, 3787088, -2355253, -1488743, -651224, 1221381, 1423245, 2246805, -431107, -717260, --374736, 1383516, -940061, 1255741, 352724, -482647, -366683, 435402, -180389, 777926, -354872, 150861, -261993, 445603, 423054, -131533, 652298, 184684, 200790, -458488, -157840, -104153, 64961, 824634, 142271, 371515, 344134, 147640, 4491462, -351114, -1873680, -2907693, -4248260, -2714419, 2361695, -1985349, -1955821, -2150705, -2795487, 2684355, -414464, 1958505, -853088, 547608, -5783711, -3776887, -2626373, 3685619, 737124, 787590, -2062658, -2100776, -1022739, -507343, 695785, -4449049, -828929, -3016141, -3218541, 141734, --2837900, 1875290, 1828582, 7634841, -1892470, 3859565, -2581812, 1567126, -1766842, 354335, -6733972, 1029182, 2925947, -3230889, 2062121, -2911988, -1345935, -493384, 4281009, -2157147, --1084479, -3848291, -2005750, -4535486, -591095, 4185446, 1023813, 262530, 744640, 3832185, --3821447, -6773164, 1565516, 2061047, -4378719, -377420, 596464, -1142998, 1777580, 5197448, -1104880, -1391033, 126702, -1927904, 353798, 261993, -1495186, -508954, -472983, -2182380, --495532, -1271310, 454193, -519691, -832687, 1679332, -326418, -1771137, 736050, -1279363, -56371, -1379221, -1918777, 1058173, -346282, -198642, 612570, 757525, 249108, 1720134, --846109, -209380, 298500, -701690, -274341, -262530, -887985, -526134, 1463510, 428960, -2085207, 194884, 933619, -890132, 2430952, -6821482, 1104880, -2362232, -5087389, -3615289, -2018098, -973347, -267362, 5046050, 1630477, -661425, 404801, 4297115, -2037425, 3182571, --1459752, 977642, -4539244, -757525, 3022583, -989990, 3762928, 4293894, 1369558, 2719788, -5543192, -1266479, -7883413, 1823214, -3525631, 282394, -9648107, 300111, 3055332, -1890859, -3558381, 546535, -3500398, 1284195, -7263327, -4590247, -1794760, -1740536, -6032819, 3078955, -3296924, 232465, 3066070, 274341, 810138, -1910187, 2777233, 2174864, -1152662, 6658810, --1276142, 5506685, 4657355, -235686, -791885, 47245, 1472100, 2268817, 683974, 2535105, -804233, 882616, 7300371, 2829847, -3230352, -1439888, -73551, -1734630, 1058173, -1246614, -7363722, 1265405, 3444027, -2625299, 2971581, -3221, -1486596, 664646, -2422362, -1529545, --440234, -1689533, -1086627, -1012539, 877247, -1584306, -406411, -1108102, -615254, -526134, -2001992, -839666, 1029718, -265751, -1758252, -262530, 1039919, 454730, 159988, 689879, --1074279, 918586, 557809, 547608, 973347, -552977, 209380, -1668595, -149250, 1319092, -1135482, 302795, 190589, 183073, 922881, -13136157, 91805, -79994, 3408057, 5705864, -2067490, -2936147, -4734128, -804770, 6273874, -1221381, -1135482, -4651450, -56371, -1958505, -4659503, 5439039, -9351754, 6097243, 3971234, -3603478, -710817, -4969277, 83215, -1525787, -169651, 3193845, 6307160, -2385318, 1499481, -1674500, -2085744, 2283849, 4369593, 2872260, --2656974, -4488778, 3157875, 2115808, -1547262, -847182, 599685, -5774584, 2142115, 1698660, --2239826, -3872987, 1540283, -2951716, 5160403, 2208687, -8902393, 4053912, -3779034, -9905268, --2802466, -774168, 2039573, -4083440, -127775, 2141578, -4298189, -4329327, -4424353, -1407676, -1184874, 9331353, 1534914, 1746441, -1953673, -4930086, 6444599, -1970316, -7429757, 336081, --7498476, 537408, -668404, -2790118, -8218957, 2492692, 178241, -1854352, 2091649, 4992900, -2372970, -986769, -790811, -56908, 2809446, 411243, 739271, 1510218, 2738579, -263604, --1183264, -1631014, -1585917, 609349, -60666, -1335198, -1260573, 1181653, 1239635, 2303176, -561030, -85362, -63351, 842350, -339839, -71404, -302258, 1444720, -98784, 756988, --146566, 1984275, 8191040, 2139968, 1808181, 3518115, 5169530, -1184874, 12572443, -1875290, -9006010, -10630044, 3679176, 6128919, -2203318, 809064, -2944200, -337155, 4865661, 8762807, --2463164, -4432406, -1257889, 4054986, 905164, 8910983, 4269735, -1020592, 1318018, -118648, --4162897, 781147, -906775, -1351841, 3946001, 5094368, -8094403, 9328132, -7113540, -3937411, -1622961, -2945274, 4752918, 69256, -2686502, 6573985, 9316858, -6972880, -1220845, -729071, -2905009, -6605123, -10765336, -5088463, -3272228, 3122441, -7457137, -4376035, -843424, 7700340, -4905390, -5459441, 3892314, 1998234, -2914672, -4497368, -674847, -2789045, -3140158, 266288, --2079301, 5742372, -4358855, -971736, 4940823, -3951370, 5338108, 6287296, 895501, -714575, -589484, -7897908, -6927246, -1797444, 4401268, 129386, -3016678, 2828773, 6473590, -4353486, --1966021, 1693828, -546535, -3111704, 18790, 765041, -2922725, 98784, -779000, 1265405, -428960, 2268280, 360777, 1767379, -1126355, -545998, 124017, 149787, -82678, 1575179, -740882, 1847910, 1864016, 117038, 585189, -339839, 1219234, 1884954, -958851, 4788352, -3872987, 5229660, -5054103, -6660958, -3618510, 4541391, 192200, 18772766, -1446867, -456877, --4552129, -8478802, -12486544, -2750390, 4082903, 6600291, -4150549, -7981123, 998580, 71404, -7962333, -2677912, -3318936, 9877351, -5424007, 642635, -7660074, 4879620, -1571958, 37581, --1738925, -11602854, -7326141, 615254, 6390375, 4303021, 475668, -12023224, 7934415, -4860293, --5008469, -5189394, -6924561, -1079111, 6484327, -5331128, -5919539, 4030827, -1970316, 2313377, -11978127, -5256503, 206695, 593779, 5055177, -3565897, -3315715, -1666984, 7590818, -1728724, --4089346, -716186, 5905580, 7740605, -7743289, -8747775, -3030636, -1300301, -2985539, 1853278, --6196564, -2175401, -5852430, -11557220, -4623533, -2675228, 1476395, -10629507, -3007014, 159451, -7454990, 220117, -6600291, -128849, -338229, -2005750, -3682398, 159988, 1482301, -695785, -1080184, 1053878, -1510755, 2158758, -962073, -2158758, 2276870, 2871723, -1315334, -2758980, --156229, -543850, 411780, 2298881, 788127, 39728, 1549946, -878321, -1459215, -1111860, --1594507, 2281702, -6159520, 5224828, 6305549, -4629438, -5682242, -4741107, 2550674, -449361, -9153649, 16037945, -9019431, 623844, -407485, -1086627, 1457605, 4660577, -13178570, 11833709, --9296994, -4555887, 11848204, -2722473, -5715528, 3964255, 4356708, 292058, -698469, -9144522, -5690295, -1282585, 1953673, -6044630, 7532299, -669478, -12685186, -13481365, 4478577, -2454037, --7012071, 3448322, -615791, 20946018, 3473018, -3803194, -6267431, -12313671, -4414153, 2419140, --3041911, 9658308, -2079301, -14345728, -1431298, 9903658, -4357245, 1318555, 8496519, 5789616, --4886062, -881542, 6871411, 9259949, -4255239, 1829119, 1276142, -4430796, 1958505, -2028298, --661962, 1400696, -2193118, -2577517, -8946954, -9713069, -8275328, 8233989, 4540318, 5372467, -2216203, 86973, 3229816, -7080254, -3973382, -9918690, 4889821, -1232119, -1420560, -1998234, --1530082, -5047661, -3059627, 1064078, -2110977, 330176, 333397, 381715, 1901597, 278636, -2291365, -230854, 1675574, -2284386, 1272384, -3438658, 239444, -1618666, 2835215, 168041, --1885491, -512712, 856846, -1461363, -1740536, -4020090, -4126927, -2221572, 4079145, 308701, -1400696, 2636036, 767725, 3193845, 1175747, -2578054, -10765336, 4109747, -11618960, 490163, -4169876, -1830730, -8706972, -4035659, -1811403, 7796977, 6117107, -4580046, -4827007, 8310762, -3405372, -4753455, -5216238, -3995930, -594316, 8035347, -1404991, 762357, -493921, -62277, -10226854, 5128191, 6838662, -447750, -543313, 3579318, -5353677, -8910983, 7268696, 11795054, --7993471, 10144176, -3002719, -992137, -4569309, 5242545, 285615, -5630166, 3414499, 9592809, -7448547, 3485903, -7213398, -2914672, -14570677, 2445447, 7543573, -4643934, -1197222, -5727339, -1477469, -3398393, 5615133, -3562139, 1854889, 6763500, 3814468, 12717398, 6612639, 4318590, -8091719, -6783901, 12158516, 3797288, 7383586, -2408940, -8419747, -12926241, -2482491, -2148021, --3401614, -3015604, 4803384, -8879845, 13447543, -2285996, -10909754, 6229313, 10048076, 4201015, -1281511, 2126546, 3762391, 1302986, -2246268, 2609730, -2058363, -10737, 4214974, 8053, --170725, 4648229, 652298, 2557653, -395137, -2150168, 697395, 475668, -1854352, 1464047, -1889786, 522912, -1321239, 1133871, 383863, 3600793, 790811, -635655, 2268817, -3054796, -901943, 716723, -3343632, -4875862, -1362042, -1898912, -1249836, -2410014, -1701344, -1006096, --408022, -4194573, 5928666, -12702366, 9327058, 3338800, -2005750, 13963476, 10668162, -17534740, --11868605, 11210402, 19021874, -1669132, 2756832, -1527935, -2465848, -1808181, -845572, 4932770, -2822331, 11640435, 2791729, 11145977, 3071975, 4914517, -1542967, -6125160, 2636573, 980863, --5129802, 8568997, 833761, 3511136, 1940788, -1622424, -7868380, 1149441, -8919573, -2869038, --10315975, -6749004, -4185446, 8784282, 1213865, 4400731, 10566693, -4435091, -901943, 1390496, -3787624, 1296006, 246961, -2820183, 7826504, 17426292, 8301098, -13590887, -9808095, -10014790, -11924440, -1646583, -11051488, 6618545, -6193880, -507343, -1806571, -597000, -847719, 552440, -10464688, 17468168, 6546067, 15072651, 9560060, 5013838, 1950989, 3939559, -4779762, 16041166, -5146445, -8121247, -11116449, 5115843, 3683471, -2849174, 7965017, 15193984, 3483219, -5579163, -9366250, -663036, -6838662, 1641214, 5268851, 1071058, -875100, 818191, 2912525, 5281199, -2282238, 2470143, 615791, 3532611, -1353989, -410169, -1899449, -316754, 6962679, -3426847, -2609730, -835371, 1702418, 421444, -1787780, 1287953, 2509335, 3271691, -1369021, 1498944, --2728378, 192737, 1454383, -4723927, 2190970, -1402307, -6971269, 1814087, 17370996, 3103114, -6213207, -5700496, 4579509, -8656507, -14811732, 159451, 8139500, 2203318, 6561100, 8839580, -10069551, 398895, -10712185, -9406515, -14235669, -22440668, -259309, -2876554, 9962177, 7113540, --8227547, -4853850, 5890548, 11435350, -14443438, -9599789, -2682744, -8182987, -5320928, -3188476, -4619238, 8827768, 517544, -5699959, -6635188, 8919573, -7187628, -3285650, -114354, 12637941, --801548, 836445, -20078436, -1743220, 5022965, 10146323, 13567802, 2680060, -12905840, 5908802, -348429, 5878200, 8568997, 1199370, 4345970, 9517111, 17111150, -11558294, -4399657, -1231582, -5289789, 17886392, 7699803, 5815923, 10231149, -3728569, -5924908, -11121818, -13645111, -8377871, --473520, 8549669, 20232518, -12832289, -9197136, -1541356, 19835232, -11329050, -6386080, -10147934, --1776506, -9123584, 2878702, 1435593, 4748087, 10251013, 1976222, 6471442, -4335770, -4596152, --5570573, 187905, -2799782, -6824166, -5857262, -3140158, -1527935, -1633698, 6698002, -5279052, --1498944, -2160906, 4787815, 924492, 3488587, -2537789, -2279017, 4496294, 1588601, 977642, --3997541, 5870147, -3117610, -456877, -2182917, 1663763, -2268280, 343061, 4035659, 4595078, -785442, 8810589, 5194763, 12465606, -14782741, -10794327, -1532230, 21734146, 8974334, 398358, -11963095, -7532836, 17886928, -4335233, -15487115, -3190624, -15393163, 12434467, 7636989, 4772783, -5009543, 115964, -4875325, 5922760, 9176198, 4392141, -3076807, 7951595, 10963978, 9554155, --1133335, -8648990, 14818174, 3274913, -829466, -2672544, 1840930, -9820980, 9630390, -2016487, --2592013, -12469901, -6616397, -7781944, 17249126, 5914707, 232465, 2049236, 8933532, 12545599, -6556805, -16738024, 15066745, -2002529, 8727374, 3472481, 13235479, -3265786, -17259862, 5182415, --767725, 6910603, -3051574, -7315403, 6445136, -3005403, 4374424, 21512954, -2636573, -10275709, -56371, 2604898, -10562398, 17278654, -7804493, -10843182, 15471546, -9276592, 7884486, 777389, --11226508, -8242579, -11232950, 3264175, 9381282, -5873905, 5426155, 10139344, -5810017, 7070053, --2419140, 12043088, -4401268, 3396246, 3988951, -3668976, 14496, 197032, -5625334, -1008244, -5065377, -8128763, -1554241, 5476620, 2910377, -110595, -4842576, 2107755, -1337882, 1651415, --5070746, -5158793, -2778307, 739808, 1188632, -6156836, -3718368, 5180805, 660888, 2092723, --6019934, 2423972, 461709, -3007014, 1122597, 534723, 1867237, -3486440, 168041, -1864553, --403190, -5010616, -2018098, -712428, 3131568, -1147293, -3257733, -2005750, -714038, 689342, -547608, -1221918, -41339, -6713571, 5143760, -14874009, -2648384, 7292855, 2028835, -14554034, -3954054, -5403069, 10606959, 2054068, 5551782, -23993298, 7436736, -14496, 9376987, 14725295, -1043677, -2370285, 1505923, -8106751, 15644955, -15094126, 5008469, 8813273, 6573985, 8080981, --3652870, -7507603, -7951595, -15602542, 6248641, 1857573, 9069360, 15639587, -5829881, 13347148, -7757785, -13760538, -7332583, -657130, 1695975, 258772, 122943, 6376416, 12089796, 10510859, -4878546, -28257664, 7122667, 7809325, 8475581, -18776524, 11332808, -9860708, 9866614, 694711, -5328444, -2949569, 7462506, -2681133, 23885386, 10893111, -10334765, 863825, -29477972, 4529580, --8521752, -9461813, 8586713, 5537287, -14695767, -30041148, 18942954, 11061688, -27533424, 10409927, --6043019, 10187126, -2091649, 2116345, 4586488, -137976, -18471044, -7418483, -2473364, 5509906, -61203, -5153424, 8106751, -10424422, -3706020, 9977746, -660351, -1319629, 3856881, 1753420, -4326106, 1453846, -5331665, 1902671, -8094403, 4776541, -3403762, 2558190, 2462090, -2615635, --1018981, -1898912, -2712809, 1136019, -4534412, -1156420, -3799972, -3393561, -6433861, 3052648, --1735167, -2161979, -3586835, 1393180, 3603478, 1832340, 2077690, 279173, 1258425, 2157147, -107911, 2373506, 2576444, 6027450, -3139084, 9024800, -3244311, -6220187, 11126113, -8541616, -300111, 1421634, 28242632, -4010426, 20457466, 4787815, 15460809, 772020, 4577362, 4755603, -27245662, 26883810, -13761612, -12972949, 15693274, -19806242, 243739, 5115843, -19326280, 10948409, -1807108, -1748589, -3318936, -6146635, 2597918, 1924682, 3908957, -12199855, 343061, -3114388, --15555298, 7882876, 11256036, -17834314, -12893492, -6633577, 9773198, 9069360, 9106404, -1129040, --3323768, 8127689, 28389734, 14990510, -5277441, -3838090, -3571265, 18818936, -14922327, 6845104, -4292283, -23856396, -9548249, -1234803, 3495030, -20243792, 14099841, 8838506, 4304094, 3656628, -9866077, -19176492, -2026151, -15933255, 979789, 9627706, 16748225, 9978283, -10136660, -5698885, --544387, 394600, -11684459, 26616450, -1841467, 3409130, -6025839, 9030706, -1749662, 5219996, --2135136, 3189013, 2811056, 5677410, -387621, -47245, -1888712, 1237488, -117575, -1649804, -8195335, -2497524, -5526013, -475668, -350577, 3901978, -5633387, 1219234, -4617627, -7860864, -5077725, -1566053, -4968741, 300111, 208843, 789737, -4332549, 6047314, 1917703, 7456600, --9050033, -768262, 4714801, -2480344, -7284265, -254477, 8522826, 3590056, -4947266, 5064304, --2439542, 12828530, 20110110, -1480690, 1387811, -12489228, 1126892, -632971, -8781598, -14897094, --2759517, -6944962, -11014981, -8200703, 12633646, -10726144, 9184788, -3294777, -2457795, 17489106, --12087112, -6877854, 2767033, 7002408, 1112933, -23343684, -14214194, 2571612, -3671123, 3684008, --3179887, -7388418, 14898168, 3086471, -1208496, -6178311, -33374044, 19994684, -5982890, -454193, --2780991, 1189169, 9652402, -5659693, -9061307, -15699179, -1409286, 6802155, -9574556, -12458090, -5160403, 19548006, -3273839, 18173618, 13506598, -13458817, 24646670, 16164109, -16157130, -25142738, --7148436, -11008538, 1399086, -8028368, -1890859, 11910481, -20893406, 10172093, -3350075, -11861089, --13092134, -13220446, -15858630, 3226057, 9604621, -8638253, 13701483, -1865090, -7913477, -16500727, -319975, -1928977, 6397354, 19497004, -7030862, -14929306, -5128728, 343597, 5086852, 13316009, -3575560, -1748589, -10935524, -170725, 459562, 4898947, 2122788, -60130, 3752191, 5404680, --4068945, 6769406, -3905199, 3053722, 8005282, 7089918, 482110, -11305965, -4566624, 1625108, -2811593, -7885023, 12706661, -7760469, 5830418, 6764574, -5156645, 601295, 1431298, -3047279, --10697690, 2203318, 4858682, 775778, 9057549, 6215355, -6099391, -5926518, -1561758, -21211770, -38613904, 54385024, -5261872, 6642704, 3474629, 13187160, 26347476, -25144350, 288300, 4379793, -485868, -9054865, 1347546, -11191074, 13221520, 32408212, -6848326, 717796, 1838246, 9833328, -890669, 3825742, 12447352, -24930674, -1867237, 24507620, 25149182, -29377040, -6245420, 4254165, -4134443, 8776229, 22136262, 6254546, 44656924, 7459822, 13779329, 6605660, -7019051, -9240085, --536334, -31314070, -45086420, -15237470, -14632954, -46942920, 7352447, -1090385, -26234198, -12774306, --43947180, -4779225, -6050535, 29981556, -29350196, 18337900, -20055350, -1605781, -13189308, -10380399, -11783780, 26948772, -20744692, -7753490, -1881196, -6109054, -2201171, 11387569, 21583822, 23077934, --16444893, 46385648, 31091268, 4086662, -17579302, -38101728, -8653285, -14157823, -10411538, 2556579, -12247636, -7963406, 4567698, 14432164, 2334315, -4522601, 14619532, 9781251, 5012764, 6461779, -15348066, 15531139, 119722, 1316408, 6207302, 5855651, -2528662, -4559645, -2652679, 2887292, --382252, -1894081, 966905, -3022046, 2138357, 10157061, -436476, 3626026, 12323872, -3157338, --4420058, -4649302, -525597, -6774237, -1380295, 5917391, -3207267, -1795296, 1178969, 119185, -1049046, -891206, 4846871, -3200825, -3400540, 8069707, 5644661, -6136972, -326954, -3239479, --1338956, -19384262, 35533340, 59230820, -13942001, -2991982, 10507637, 26533234, 8917426, -15357192, -9636296, -13113609, 3410204, 8415988, -3176128, -17702244, 5338645, 18909130, -4704600, -26976690, -21142514, -6163278, 17257716, -6347425, -4265977, -6624450, -10926934, -397821, 19166292, 10748156, -3170223, 15540265, -7364795, -6105296, 5905043, -8241506, 10725607, 6294275, 16408386, 28161026, -24640228, -17710834, -33050310, -12032351, -2084133, 25891674, -9910637, 4631049, 10417443, -10222559, --15241228, -24334210, -25034828, 19740206, 21006148, -16763257, -60244432, 5005785, -4258997, -8231305, -4657892, -5981816, -24184960, -11258720, -5691369, -16769163, -7210713, 25654914, 9681930, 14795089, --5822902, -8369281, -5473399, 14266808, 2363306, 2684355, 12221329, 35568236, -3138011, -5213554, --17995376, -16977468, -24837796, -2663417, 13990319, 9579388, -10166724, 7421167, -4723391, -5892695, --10394358, -9415642, 8512088, -7292855, 8300025, 3918621, 4660040, -5314485, -7797513, 8704825, -5333276, -2200634, 6519224, -9131100, 3757560, -1258962, 5349919, -3035468, -5290326, -2970507, --2670933, 6102612, 2946348, -314606, -6498823, -1546188, 12715251, -9218074, -341987, -8957154, -10885595, -5970005, -2587181, -8283918, 1058173, -3577171, 1051730, 9261023, 9250823, 1882269, -6442, -3643743, -7090454, -7795366, -988379, -12766790, -1695975, -10555419, 5692443, -14934675, --24370182, -5350993, -4024384, 4525822, -8276939, 18822158, -11135240, -38323992, -20713554, 13285408, --18001282, 21321292, 19088446, -8385387, -2826089, 2788508, -11620034, 90194, 6303402, -1632625, -3464965, 27009976, 22555558, -5953899, -35655744, -27057220, 2094870, 18977850, -14283451, -6123550, --16797080, -21575232, 2071785, -6052146, -25267292, -27555436, -40414568, 16338056, 5664525, 943819, -23439784, 31389768, -1148904, -23371602, -17701170, -18894634, -10625749, -6659347, 7212861, 12182138, --10741713, -17199734, -20960514, 11203422, 9904731, -20641612, -19621558, -7879118, -3349538, -12037720, -7556458, 50834160, 30593588, 59361280, 19929186, -31523986, 37056440, -1610613, -18835580, 1832877, --17727478, -38924752, -16008954, 8913668, 18655190, -4403952, 17193828, 9849971, 37875704, 41193032, -34015068, 11216307, -9435506, -6018323, -5499169, 7136625, 9680856, -14381161, -5208722, 2305861, -30904974, -4361003, 2753611, -3428458, 11237782, 11137924, 13264470, -752693, 349503, 129386, -2954401, -1300838, 1953136, -11329050, -3507378, -3947612, -10436234, -10982231, -4940823, 3840775, -13117367, -8535174, 2053531, 4458713, 14892799, 19931332, 13809394, 12696997, 14358076, 3031710, --5276368, -11153493, -15815143, -19906100, -15502148, -9334038, -18699750, -19221052, -7318088, -3510599, -1841467, 8356396, 35492536, -20204064, 2423435, 10290205, -4346507, -26334056, 26638998, 25226490, --14461155, -20158430, 2857227, 34974992, -18282602, 9899900, 22591528, 6784438, -8348343, -16852914, --10901701, 7693360, -2556579, 5844914, -9716290, 6465000, -21656298, 31768800, -2971044, 7077033, --1395328, -40217536, 12617540, -11184095, 20809116, 12399571, 22226456, -8704288, -38603168, 27733140, -12622909, -13224741, -23991688, 19866908, 10787884, 21132312, 21505438, -18723910, 8696772, 22307524, --32681480, 29990682, 14898705, -1010928, 9666898, -17061220, 37749004, -4299799, 24880746, 11065446, -43815644, -3120831, -7553237, 6099928, 17890686, 11747809, 12486544, 44095892, 2703682, 10738492, -25913686, -17113834, 17818208, 2042794, -29250874, 10880226, -9783399, 33158222, -24348170, -29445222, --30478162, 26079578, 43011948, -13744432, 11033234, -50634980, 4936528, 2389076, -1818919, -23738284, -4074313, 9978820, -7708930, -6558952, -6246493, 15980500, 7626788, -10152229, -10790568, -6335614, --2461016, -3208878, 4711043, -17479980, -10341744, 9230958, 3941169, 3262565, 674310, 7951058, --1247688, -956704, -10130754, 13709536, 17252346, -7354595, -26554710, -18046916, -78920, 9127, -5232344, 1330903, -8292508, -13127031, -7080254, 4931160, 7823820, 21364778, 7351374, 1110249, -481036, -15941845, -3146064, 16558710, 9915469, 3756486, -17255032, -10561325, -1842004, 2396592, -3142306, -2857227, -3169149, -3046743, -1017370, -64887292, 3540127, -7940858, 2005750, 50253264, -41349260, 59509456, 31411780, -15817291, -12132746, -24645596, -32875828, 11576011, 2872260, 8637716, -10438918, -9566503, 14949707, 25380572, 4654671, -6784975, -8606578, -17961554, -11959336, -10851772, -4950487, 8092256, -25818122, -15255724, -3569655, 17326434, -7825968, 11164231, 13845364, -36658620, --36141076, 6867653, 10464688, 8060043, -27282170, -12526272, -24504400, -11843909, -11222750, 23639500, --31056372, -43218108, -16258599, 8590471, 7347079, -33331094, -26781806, -21029770, -15944529, 18034030, -25396678, 1160178, -8630200, -10538776, -5892159, -5612986, -11478300, -36998996, 12175695, 27821724, -25271050, 7880191, 34517580, 46693272, -4066797, -5992016, 35743792, -8644695, -21752936, -49155900, --16746614, 6709276, -26980984, -18053896, 12642236, -4408784, 17529372, 30673046, -18663780, -28956670, --9588514, -12419972, -7188702, -7852274, -7793755, 3271691, 4451734, 3593814, 6244346, -10396505, -9086540, -14364518, -1719061, 8947491, 11985643, -12834436, -17912162, 10271951, -4075387, 672699, --12499429, 14795625, -8651138, -3105798, -3437585, 13695577, -11574400, 14857366, -6580427, -6920266, -9833864, 2600603, 7835631, -6186901, 705448, 2921115, 16018081, -1863479, 3813931, 2448668, -42769820, 14813879, 3596498, 15415174, -17520782, 1008244, -8879845, -13342316, 8027294, 2972117, --10880226, -18460306, -10392747, -17144436, -13696651, 5446019, -10536629, -5333276, 8138426, -5406827, -1950452, -6001143, 21330418, -16691854, 17512192, 6194417, 2095944, -16146393, -6771553, 12683038, -5322538, -399969, 10357851, -1920924, -4105452, -6672232, -5405217, -4505421, 2047626, -187368, -2279017, -18889804, 10004053, -7958038, -7237020, 6451578, 4621385, 2357937, -3422552, 13086228, -11469173, -16542067, 14839112, -2157147, 10103911, 19757924, -4051228, 10649908, 10351408, -9970767, --6922414, -13256953, 1291175, 2168959, -20989506, 8614094, 3314104, 16335371, -6360310, -37526204, -23579908, 1327682, 791348, 387621, -16413218, -5316633, -4243428, -5683853, -23972896, 13621489, -7009387, 14697915, -10621454, 6414534, -11927661, -11082626, 614717, 9292699, 7692824, 147103, --1272384, -3479997, 943819, -5626407, -1027571, 15858630, -6376416, 3068754, 1843078, 4429185, --9685151, 10519986, -282931, -2129230, 2601140, -1165010, 2543695, 3451006, -8799314, -1337882, -266288, -1784559, -1524713, 4756140, -5583458, 6991133, 10435160, 3777961, -6332393, -443455, --1237488, -6128382, 7640210, -2215666, 4224101, -21919366, -62270584, -92581776, 19445464, 72807752, -3032784, 199248368, 183653872, 126211376, 217002144, 166987792, 22740778, 3670050, -22470732, -159005056, --162226288, -123272000, -212496192, -198096784, -56603372, -66004520, -66791036, 16040092, 40320616, -33024004, --10969346, 63917704, 40711460, -2005750, 47518444, 33067490, 2600066, 39894876, 94101120, 62035972, -21686900, 96520800, 71417792, 5821828, 82902536, 112423992, 27103392, 12426951, 114599928, 31636730, --44354128, 57919244, 88340496, -44715980, 20807506, 123517888, 11934640, 20704964, 148954304, 117231672, -10130754, 93106304, 123263952, -42315628, -25018184, 35402340, -100315400, -167685728, -113138568, -184944512, --275041664, -252482880, -282558368, -359865632, -379836704, -335857312, -355050464, -334266560, -250948496, -200242656, --104154568, -25547002, 59547036, 206740400, 240424752, 261096432, 404728192, 395810752, 265839680, 342253600, -267487872, 106807248, 117899000, 166618432, 81725176, 53551800, 124588408, 89133992, 34897, 43069932, -96990560, 24721294, 7309498, 72571528, 17215302, -74132208, 24845848, 59620052, -16561931, 53494356, -141102560, 56387552, 32256278, 124423056, 68181536, -23490250, 15188615, -31150860, -147449456, -180670480, --179578496, -226562752, -256128768, -211626464, -203476224, -232034000, -209368912, -172856864, -199311712, -182270352, --122523608, -97215512, -93071408, -37611028, 23305030, 27693412, 84810568, 142653040, 149935168, 148343344, -167416752, 154850752, 111055504, 94422168, 84240952, 58566176, 48063368, 58958628, 52546240, 35993972, -37462316, 40967544, 34855808, 34154116, 43625592, 38706784, 27765352, 22590992, 20430622, 4173635, --489626, -4534949, -23651848, -31689342, -29700772, -24758876, -20713554, -12610561, -6129992, -4858682, --1035087, 8396661, 15714212, 20591146, 20397874, 15481746, 10465225, 3863860, 504659, 2094870, --646929, -7282117, -7663833, -11727408, -21264384, -23551454, -22730040, -30462056, -33054606, -29459180, --33467996, -40246528, -38121592, -39270496, -43537008, -39448736, -32984276, -34570192, -31143882, -21017960, --16655346, -15013058, -4287451, 1824824, 3566434, 10093710, 18613852, 20052666, 20989506, 25605522, -24881820, 22650046, 25964688, 28469728, 28781112, 29753922, 31833224, 28978144, 27445914, 27710592, -27968828, 23694798, 20343112, 14875082, 7696045, 2243584, -348429, -2251100, -4105452, -5951751, --6847252, -7295002, -6856379, -6018860, -4859756, -5222144, -4800700, -4476430, -4283693, -4244502, --3267396, -2863670, -1982127, -1400159, -297427, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +6449967, -663036, 1957431, -1178432, 8610873, -3382287, -837519, -304943, 1064615, -1521492, +3942780, -681826, -2662880, -471910, 5392332, 400506, -2732673, 2529736, 1861868, 3552475, +1452236, -2704756, -1791001, 6029597, 836982, -1543504, -1194538, -1228898, 1183264, 1283658, +-779537, -7676717, -1924145, 370441, 5297842, 1894618, -659278, -22012, -3059627, 4220342, +-4312684, -5733245, 740882, 55298, -1944010, -1320703, -1603633, 820339, 520765, 505732, +-2008971, 5005785, 151398, 6709276, -1082332, -3196530, 1469416, -356482, 957241, 1557463, +3388729, 2306398, -868657, -1842541, -1571421, 4352950, -4433480, 172872, 123480, -778463, +-3802657, 3352759, -1918240, 442919, 2909840, -2050310, -2748779, -2285460, 2950643, -272194, +-920734, -820339, 96100, -553514, -1199370, 1465658, 1500554, 1096290, 682900, 375273, +2051384, 331249, -44023, 431644, -202400, 73014, -475668, -255014, -246961, 1386201, +333397, -933619, 1164473, -2544768, 2225330, 1342177, -2998424, -1645509, -230854, 284005, +-153008, -437550, -1514513, 2723009, 529892, -1163399, -1582696, -73014, 5628555, -777926, +-2630668, 3608310, -1389422, -3378529, -330712, 2889976, 2165737, -1844689, 523986, -2308008, +1368484, 1332514, -1089848, 2888903, -765578, -5179194, 986232, 2704756, 2535105, 367220, +-360240, -3750043, -1243930, -481036, -1622961, 3413425, 4800700, 2238215, -6481643, 2219424, +7692824, 3186866, -343061, -33823, 3561602, -1727651, 1188632, -3213173, -2888366, 2985002, +3387656, 1636383, 934155, 612570, 711354, 1604170, 339839, -282931, -1116155, 825707, +-2236604, -406948, -940598, -4626754, -2282775, 996969, 1771137, 1450625, 3189550, 2505577, +2656974, 3787088, -2355253, -1488743, -651224, 1221381, 1423245, 2246805, -431107, -717260, +-374736, 1383516, -940061, 1255741, 352724, -482647, -366683, 435402, -180389, 777926, +354872, 150861, -261993, 445603, 423054, -131533, 652298, 184684, 200790, -458488, +157840, -104153, 64961, 824634, 142271, 371515, 344134, 147640, 4491462, -351114, +1873680, -2907693, -4248260, -2714419, 2361695, -1985349, -1955821, -2150705, -2795487, 2684355, +414464, 1958505, -853088, 547608, -5783711, -3776887, -2626373, 3685619, 737124, 787590, +2062658, -2100776, -1022739, -507343, 695785, -4449049, -828929, -3016141, -3218541, 141734, +-2837900, 1875290, 1828582, 7634841, -1892470, 3859565, -2581812, 1567126, -1766842, 354335, +6733972, 1029182, 2925947, -3230889, 2062121, -2911988, -1345935, -493384, 4281009, -2157147, +-1084479, -3848291, -2005750, -4535486, -591095, 4185446, 1023813, 262530, 744640, 3832185, +-3821447, -6773164, 1565516, 2061047, -4378719, -377420, 596464, -1142998, 1777580, 5197448, +1104880, -1391033, 126702, -1927904, 353798, 261993, -1495186, -508954, -472983, -2182380, +-495532, -1271310, 454193, -519691, -832687, 1679332, -326418, -1771137, 736050, -1279363, +56371, -1379221, -1918777, 1058173, -346282, -198642, 612570, 757525, 249108, 1720134, +-846109, -209380, 298500, -701690, -274341, -262530, -887985, -526134, 1463510, 428960, +2085207, 194884, 933619, -890132, 2430952, -6821482, 1104880, -2362232, -5087389, -3615289, +2018098, -973347, -267362, 5046050, 1630477, -661425, 404801, 4297115, -2037425, 3182571, +-1459752, 977642, -4539244, -757525, 3022583, -989990, 3762928, 4293894, 1369558, 2719788, +5543192, -1266479, -7883413, 1823214, -3525631, 282394, -9648107, 300111, 3055332, -1890859, +3558381, 546535, -3500398, 1284195, -7263327, -4590247, -1794760, -1740536, -6032819, 3078955, +3296924, 232465, 3066070, 274341, 810138, -1910187, 2777233, 2174864, -1152662, 6658810, +-1276142, 5506685, 4657355, -235686, -791885, 47245, 1472100, 2268817, 683974, 2535105, +804233, 882616, 7300371, 2829847, -3230352, -1439888, -73551, -1734630, 1058173, -1246614, +7363722, 1265405, 3444027, -2625299, 2971581, -3221, -1486596, 664646, -2422362, -1529545, +-440234, -1689533, -1086627, -1012539, 877247, -1584306, -406411, -1108102, -615254, -526134, +2001992, -839666, 1029718, -265751, -1758252, -262530, 1039919, 454730, 159988, 689879, +-1074279, 918586, 557809, 547608, 973347, -552977, 209380, -1668595, -149250, 1319092, +1135482, 302795, 190589, 183073, 922881, -13136157, 91805, -79994, 3408057, 5705864, +2067490, -2936147, -4734128, -804770, 6273874, -1221381, -1135482, -4651450, -56371, -1958505, +4659503, 5439039, -9351754, 6097243, 3971234, -3603478, -710817, -4969277, 83215, -1525787, +169651, 3193845, 6307160, -2385318, 1499481, -1674500, -2085744, 2283849, 4369593, 2872260, +-2656974, -4488778, 3157875, 2115808, -1547262, -847182, 599685, -5774584, 2142115, 1698660, +-2239826, -3872987, 1540283, -2951716, 5160403, 2208687, -8902393, 4053912, -3779034, -9905268, +-2802466, -774168, 2039573, -4083440, -127775, 2141578, -4298189, -4329327, -4424353, -1407676, +1184874, 9331353, 1534914, 1746441, -1953673, -4930086, 6444599, -1970316, -7429757, 336081, +-7498476, 537408, -668404, -2790118, -8218957, 2492692, 178241, -1854352, 2091649, 4992900, +2372970, -986769, -790811, -56908, 2809446, 411243, 739271, 1510218, 2738579, -263604, +-1183264, -1631014, -1585917, 609349, -60666, -1335198, -1260573, 1181653, 1239635, 2303176, +561030, -85362, -63351, 842350, -339839, -71404, -302258, 1444720, -98784, 756988, +-146566, 1984275, 8191040, 2139968, 1808181, 3518115, 5169530, -1184874, 12572443, -1875290, +9006010, -10630044, 3679176, 6128919, -2203318, 809064, -2944200, -337155, 4865661, 8762807, +-2463164, -4432406, -1257889, 4054986, 905164, 8910983, 4269735, -1020592, 1318018, -118648, +-4162897, 781147, -906775, -1351841, 3946001, 5094368, -8094403, 9328132, -7113540, -3937411, +1622961, -2945274, 4752918, 69256, -2686502, 6573985, 9316858, -6972880, -1220845, -729071, +2905009, -6605123, -10765336, -5088463, -3272228, 3122441, -7457137, -4376035, -843424, 7700340, +4905390, -5459441, 3892314, 1998234, -2914672, -4497368, -674847, -2789045, -3140158, 266288, +-2079301, 5742372, -4358855, -971736, 4940823, -3951370, 5338108, 6287296, 895501, -714575, +589484, -7897908, -6927246, -1797444, 4401268, 129386, -3016678, 2828773, 6473590, -4353486, +-1966021, 1693828, -546535, -3111704, 18790, 765041, -2922725, 98784, -779000, 1265405, +428960, 2268280, 360777, 1767379, -1126355, -545998, 124017, 149787, -82678, 1575179, +740882, 1847910, 1864016, 117038, 585189, -339839, 1219234, 1884954, -958851, 4788352, +3872987, 5229660, -5054103, -6660958, -3618510, 4541391, 192200, 18772766, -1446867, -456877, +-4552129, -8478802, -12486544, -2750390, 4082903, 6600291, -4150549, -7981123, 998580, 71404, +7962333, -2677912, -3318936, 9877351, -5424007, 642635, -7660074, 4879620, -1571958, 37581, +-1738925, -11602854, -7326141, 615254, 6390375, 4303021, 475668, -12023224, 7934415, -4860293, +-5008469, -5189394, -6924561, -1079111, 6484327, -5331128, -5919539, 4030827, -1970316, 2313377, +11978127, -5256503, 206695, 593779, 5055177, -3565897, -3315715, -1666984, 7590818, -1728724, +-4089346, -716186, 5905580, 7740605, -7743289, -8747775, -3030636, -1300301, -2985539, 1853278, +-6196564, -2175401, -5852430, -11557220, -4623533, -2675228, 1476395, -10629507, -3007014, 159451, +7454990, 220117, -6600291, -128849, -338229, -2005750, -3682398, 159988, 1482301, -695785, +1080184, 1053878, -1510755, 2158758, -962073, -2158758, 2276870, 2871723, -1315334, -2758980, +-156229, -543850, 411780, 2298881, 788127, 39728, 1549946, -878321, -1459215, -1111860, +-1594507, 2281702, -6159520, 5224828, 6305549, -4629438, -5682242, -4741107, 2550674, -449361, +9153649, 16037945, -9019431, 623844, -407485, -1086627, 1457605, 4660577, -13178570, 11833709, +-9296994, -4555887, 11848204, -2722473, -5715528, 3964255, 4356708, 292058, -698469, -9144522, +5690295, -1282585, 1953673, -6044630, 7532299, -669478, -12685186, -13481365, 4478577, -2454037, +-7012071, 3448322, -615791, 20946018, 3473018, -3803194, -6267431, -12313671, -4414153, 2419140, +-3041911, 9658308, -2079301, -14345728, -1431298, 9903658, -4357245, 1318555, 8496519, 5789616, +-4886062, -881542, 6871411, 9259949, -4255239, 1829119, 1276142, -4430796, 1958505, -2028298, +-661962, 1400696, -2193118, -2577517, -8946954, -9713069, -8275328, 8233989, 4540318, 5372467, +2216203, 86973, 3229816, -7080254, -3973382, -9918690, 4889821, -1232119, -1420560, -1998234, +-1530082, -5047661, -3059627, 1064078, -2110977, 330176, 333397, 381715, 1901597, 278636, +2291365, -230854, 1675574, -2284386, 1272384, -3438658, 239444, -1618666, 2835215, 168041, +-1885491, -512712, 856846, -1461363, -1740536, -4020090, -4126927, -2221572, 4079145, 308701, +1400696, 2636036, 767725, 3193845, 1175747, -2578054, -10765336, 4109747, -11618960, 490163, +4169876, -1830730, -8706972, -4035659, -1811403, 7796977, 6117107, -4580046, -4827007, 8310762, +3405372, -4753455, -5216238, -3995930, -594316, 8035347, -1404991, 762357, -493921, -62277, +10226854, 5128191, 6838662, -447750, -543313, 3579318, -5353677, -8910983, 7268696, 11795054, +-7993471, 10144176, -3002719, -992137, -4569309, 5242545, 285615, -5630166, 3414499, 9592809, +7448547, 3485903, -7213398, -2914672, -14570677, 2445447, 7543573, -4643934, -1197222, -5727339, +1477469, -3398393, 5615133, -3562139, 1854889, 6763500, 3814468, 12717398, 6612639, 4318590, +8091719, -6783901, 12158516, 3797288, 7383586, -2408940, -8419747, -12926241, -2482491, -2148021, +-3401614, -3015604, 4803384, -8879845, 13447543, -2285996, -10909754, 6229313, 10048076, 4201015, +1281511, 2126546, 3762391, 1302986, -2246268, 2609730, -2058363, -10737, 4214974, 8053, +-170725, 4648229, 652298, 2557653, -395137, -2150168, 697395, 475668, -1854352, 1464047, +1889786, 522912, -1321239, 1133871, 383863, 3600793, 790811, -635655, 2268817, -3054796, +901943, 716723, -3343632, -4875862, -1362042, -1898912, -1249836, -2410014, -1701344, -1006096, +-408022, -4194573, 5928666, -12702366, 9327058, 3338800, -2005750, 13963476, 10668162, -17534740, +-11868605, 11210402, 19021874, -1669132, 2756832, -1527935, -2465848, -1808181, -845572, 4932770, +2822331, 11640435, 2791729, 11145977, 3071975, 4914517, -1542967, -6125160, 2636573, 980863, +-5129802, 8568997, 833761, 3511136, 1940788, -1622424, -7868380, 1149441, -8919573, -2869038, +-10315975, -6749004, -4185446, 8784282, 1213865, 4400731, 10566693, -4435091, -901943, 1390496, +3787624, 1296006, 246961, -2820183, 7826504, 17426292, 8301098, -13590887, -9808095, -10014790, +11924440, -1646583, -11051488, 6618545, -6193880, -507343, -1806571, -597000, -847719, 552440, +10464688, 17468168, 6546067, 15072651, 9560060, 5013838, 1950989, 3939559, -4779762, 16041166, +5146445, -8121247, -11116449, 5115843, 3683471, -2849174, 7965017, 15193984, 3483219, -5579163, +9366250, -663036, -6838662, 1641214, 5268851, 1071058, -875100, 818191, 2912525, 5281199, +2282238, 2470143, 615791, 3532611, -1353989, -410169, -1899449, -316754, 6962679, -3426847, +2609730, -835371, 1702418, 421444, -1787780, 1287953, 2509335, 3271691, -1369021, 1498944, +-2728378, 192737, 1454383, -4723927, 2190970, -1402307, -6971269, 1814087, 17370996, 3103114, +6213207, -5700496, 4579509, -8656507, -14811732, 159451, 8139500, 2203318, 6561100, 8839580, +10069551, 398895, -10712185, -9406515, -14235669, -22440668, -259309, -2876554, 9962177, 7113540, +-8227547, -4853850, 5890548, 11435350, -14443438, -9599789, -2682744, -8182987, -5320928, -3188476, +4619238, 8827768, 517544, -5699959, -6635188, 8919573, -7187628, -3285650, -114354, 12637941, +-801548, 836445, -20078436, -1743220, 5022965, 10146323, 13567802, 2680060, -12905840, 5908802, +348429, 5878200, 8568997, 1199370, 4345970, 9517111, 17111150, -11558294, -4399657, -1231582, +5289789, 17886392, 7699803, 5815923, 10231149, -3728569, -5924908, -11121818, -13645111, -8377871, +-473520, 8549669, 20232518, -12832289, -9197136, -1541356, 19835232, -11329050, -6386080, -10147934, +-1776506, -9123584, 2878702, 1435593, 4748087, 10251013, 1976222, 6471442, -4335770, -4596152, +-5570573, 187905, -2799782, -6824166, -5857262, -3140158, -1527935, -1633698, 6698002, -5279052, +-1498944, -2160906, 4787815, 924492, 3488587, -2537789, -2279017, 4496294, 1588601, 977642, +-3997541, 5870147, -3117610, -456877, -2182917, 1663763, -2268280, 343061, 4035659, 4595078, +785442, 8810589, 5194763, 12465606, -14782741, -10794327, -1532230, 21734146, 8974334, 398358, +11963095, -7532836, 17886928, -4335233, -15487115, -3190624, -15393163, 12434467, 7636989, 4772783, +5009543, 115964, -4875325, 5922760, 9176198, 4392141, -3076807, 7951595, 10963978, 9554155, +-1133335, -8648990, 14818174, 3274913, -829466, -2672544, 1840930, -9820980, 9630390, -2016487, +-2592013, -12469901, -6616397, -7781944, 17249126, 5914707, 232465, 2049236, 8933532, 12545599, +6556805, -16738024, 15066745, -2002529, 8727374, 3472481, 13235479, -3265786, -17259862, 5182415, +-767725, 6910603, -3051574, -7315403, 6445136, -3005403, 4374424, 21512954, -2636573, -10275709, +56371, 2604898, -10562398, 17278654, -7804493, -10843182, 15471546, -9276592, 7884486, 777389, +-11226508, -8242579, -11232950, 3264175, 9381282, -5873905, 5426155, 10139344, -5810017, 7070053, +-2419140, 12043088, -4401268, 3396246, 3988951, -3668976, 14496, 197032, -5625334, -1008244, +5065377, -8128763, -1554241, 5476620, 2910377, -110595, -4842576, 2107755, -1337882, 1651415, +-5070746, -5158793, -2778307, 739808, 1188632, -6156836, -3718368, 5180805, 660888, 2092723, +-6019934, 2423972, 461709, -3007014, 1122597, 534723, 1867237, -3486440, 168041, -1864553, +-403190, -5010616, -2018098, -712428, 3131568, -1147293, -3257733, -2005750, -714038, 689342, +547608, -1221918, -41339, -6713571, 5143760, -14874009, -2648384, 7292855, 2028835, -14554034, +3954054, -5403069, 10606959, 2054068, 5551782, -23993298, 7436736, -14496, 9376987, 14725295, +1043677, -2370285, 1505923, -8106751, 15644955, -15094126, 5008469, 8813273, 6573985, 8080981, +-3652870, -7507603, -7951595, -15602542, 6248641, 1857573, 9069360, 15639587, -5829881, 13347148, +7757785, -13760538, -7332583, -657130, 1695975, 258772, 122943, 6376416, 12089796, 10510859, +4878546, -28257664, 7122667, 7809325, 8475581, -18776524, 11332808, -9860708, 9866614, 694711, +5328444, -2949569, 7462506, -2681133, 23885386, 10893111, -10334765, 863825, -29477972, 4529580, +-8521752, -9461813, 8586713, 5537287, -14695767, -30041148, 18942954, 11061688, -27533424, 10409927, +-6043019, 10187126, -2091649, 2116345, 4586488, -137976, -18471044, -7418483, -2473364, 5509906, +61203, -5153424, 8106751, -10424422, -3706020, 9977746, -660351, -1319629, 3856881, 1753420, +4326106, 1453846, -5331665, 1902671, -8094403, 4776541, -3403762, 2558190, 2462090, -2615635, +-1018981, -1898912, -2712809, 1136019, -4534412, -1156420, -3799972, -3393561, -6433861, 3052648, +-1735167, -2161979, -3586835, 1393180, 3603478, 1832340, 2077690, 279173, 1258425, 2157147, +107911, 2373506, 2576444, 6027450, -3139084, 9024800, -3244311, -6220187, 11126113, -8541616, +300111, 1421634, 28242632, -4010426, 20457466, 4787815, 15460809, 772020, 4577362, 4755603, +27245662, 26883810, -13761612, -12972949, 15693274, -19806242, 243739, 5115843, -19326280, 10948409, +1807108, -1748589, -3318936, -6146635, 2597918, 1924682, 3908957, -12199855, 343061, -3114388, +-15555298, 7882876, 11256036, -17834314, -12893492, -6633577, 9773198, 9069360, 9106404, -1129040, +-3323768, 8127689, 28389734, 14990510, -5277441, -3838090, -3571265, 18818936, -14922327, 6845104, +4292283, -23856396, -9548249, -1234803, 3495030, -20243792, 14099841, 8838506, 4304094, 3656628, +9866077, -19176492, -2026151, -15933255, 979789, 9627706, 16748225, 9978283, -10136660, -5698885, +-544387, 394600, -11684459, 26616450, -1841467, 3409130, -6025839, 9030706, -1749662, 5219996, +-2135136, 3189013, 2811056, 5677410, -387621, -47245, -1888712, 1237488, -117575, -1649804, +8195335, -2497524, -5526013, -475668, -350577, 3901978, -5633387, 1219234, -4617627, -7860864, +5077725, -1566053, -4968741, 300111, 208843, 789737, -4332549, 6047314, 1917703, 7456600, +-9050033, -768262, 4714801, -2480344, -7284265, -254477, 8522826, 3590056, -4947266, 5064304, +-2439542, 12828530, 20110110, -1480690, 1387811, -12489228, 1126892, -632971, -8781598, -14897094, +-2759517, -6944962, -11014981, -8200703, 12633646, -10726144, 9184788, -3294777, -2457795, 17489106, +-12087112, -6877854, 2767033, 7002408, 1112933, -23343684, -14214194, 2571612, -3671123, 3684008, +-3179887, -7388418, 14898168, 3086471, -1208496, -6178311, -33374044, 19994684, -5982890, -454193, +-2780991, 1189169, 9652402, -5659693, -9061307, -15699179, -1409286, 6802155, -9574556, -12458090, +5160403, 19548006, -3273839, 18173618, 13506598, -13458817, 24646670, 16164109, -16157130, -25142738, +-7148436, -11008538, 1399086, -8028368, -1890859, 11910481, -20893406, 10172093, -3350075, -11861089, +-13092134, -13220446, -15858630, 3226057, 9604621, -8638253, 13701483, -1865090, -7913477, -16500727, +319975, -1928977, 6397354, 19497004, -7030862, -14929306, -5128728, 343597, 5086852, 13316009, +3575560, -1748589, -10935524, -170725, 459562, 4898947, 2122788, -60130, 3752191, 5404680, +-4068945, 6769406, -3905199, 3053722, 8005282, 7089918, 482110, -11305965, -4566624, 1625108, +2811593, -7885023, 12706661, -7760469, 5830418, 6764574, -5156645, 601295, 1431298, -3047279, +-10697690, 2203318, 4858682, 775778, 9057549, 6215355, -6099391, -5926518, -1561758, -21211770, +38613904, 54385024, -5261872, 6642704, 3474629, 13187160, 26347476, -25144350, 288300, 4379793, +485868, -9054865, 1347546, -11191074, 13221520, 32408212, -6848326, 717796, 1838246, 9833328, +890669, 3825742, 12447352, -24930674, -1867237, 24507620, 25149182, -29377040, -6245420, 4254165, +4134443, 8776229, 22136262, 6254546, 44656924, 7459822, 13779329, 6605660, -7019051, -9240085, +-536334, -31314070, -45086420, -15237470, -14632954, -46942920, 7352447, -1090385, -26234198, -12774306, +-43947180, -4779225, -6050535, 29981556, -29350196, 18337900, -20055350, -1605781, -13189308, -10380399, +11783780, 26948772, -20744692, -7753490, -1881196, -6109054, -2201171, 11387569, 21583822, 23077934, +-16444893, 46385648, 31091268, 4086662, -17579302, -38101728, -8653285, -14157823, -10411538, 2556579, +12247636, -7963406, 4567698, 14432164, 2334315, -4522601, 14619532, 9781251, 5012764, 6461779, +15348066, 15531139, 119722, 1316408, 6207302, 5855651, -2528662, -4559645, -2652679, 2887292, +-382252, -1894081, 966905, -3022046, 2138357, 10157061, -436476, 3626026, 12323872, -3157338, +-4420058, -4649302, -525597, -6774237, -1380295, 5917391, -3207267, -1795296, 1178969, 119185, +1049046, -891206, 4846871, -3200825, -3400540, 8069707, 5644661, -6136972, -326954, -3239479, +-1338956, -19384262, 35533340, 59230820, -13942001, -2991982, 10507637, 26533234, 8917426, -15357192, +9636296, -13113609, 3410204, 8415988, -3176128, -17702244, 5338645, 18909130, -4704600, -26976690, +21142514, -6163278, 17257716, -6347425, -4265977, -6624450, -10926934, -397821, 19166292, 10748156, +3170223, 15540265, -7364795, -6105296, 5905043, -8241506, 10725607, 6294275, 16408386, 28161026, +24640228, -17710834, -33050310, -12032351, -2084133, 25891674, -9910637, 4631049, 10417443, -10222559, +-15241228, -24334210, -25034828, 19740206, 21006148, -16763257, -60244432, 5005785, -4258997, -8231305, +4657892, -5981816, -24184960, -11258720, -5691369, -16769163, -7210713, 25654914, 9681930, 14795089, +-5822902, -8369281, -5473399, 14266808, 2363306, 2684355, 12221329, 35568236, -3138011, -5213554, +-17995376, -16977468, -24837796, -2663417, 13990319, 9579388, -10166724, 7421167, -4723391, -5892695, +-10394358, -9415642, 8512088, -7292855, 8300025, 3918621, 4660040, -5314485, -7797513, 8704825, +5333276, -2200634, 6519224, -9131100, 3757560, -1258962, 5349919, -3035468, -5290326, -2970507, +-2670933, 6102612, 2946348, -314606, -6498823, -1546188, 12715251, -9218074, -341987, -8957154, +10885595, -5970005, -2587181, -8283918, 1058173, -3577171, 1051730, 9261023, 9250823, 1882269, +6442, -3643743, -7090454, -7795366, -988379, -12766790, -1695975, -10555419, 5692443, -14934675, +-24370182, -5350993, -4024384, 4525822, -8276939, 18822158, -11135240, -38323992, -20713554, 13285408, +-18001282, 21321292, 19088446, -8385387, -2826089, 2788508, -11620034, 90194, 6303402, -1632625, +3464965, 27009976, 22555558, -5953899, -35655744, -27057220, 2094870, 18977850, -14283451, -6123550, +-16797080, -21575232, 2071785, -6052146, -25267292, -27555436, -40414568, 16338056, 5664525, 943819, +23439784, 31389768, -1148904, -23371602, -17701170, -18894634, -10625749, -6659347, 7212861, 12182138, +-10741713, -17199734, -20960514, 11203422, 9904731, -20641612, -19621558, -7879118, -3349538, -12037720, +7556458, 50834160, 30593588, 59361280, 19929186, -31523986, 37056440, -1610613, -18835580, 1832877, +-17727478, -38924752, -16008954, 8913668, 18655190, -4403952, 17193828, 9849971, 37875704, 41193032, +34015068, 11216307, -9435506, -6018323, -5499169, 7136625, 9680856, -14381161, -5208722, 2305861, +30904974, -4361003, 2753611, -3428458, 11237782, 11137924, 13264470, -752693, 349503, 129386, +2954401, -1300838, 1953136, -11329050, -3507378, -3947612, -10436234, -10982231, -4940823, 3840775, +13117367, -8535174, 2053531, 4458713, 14892799, 19931332, 13809394, 12696997, 14358076, 3031710, +-5276368, -11153493, -15815143, -19906100, -15502148, -9334038, -18699750, -19221052, -7318088, -3510599, +1841467, 8356396, 35492536, -20204064, 2423435, 10290205, -4346507, -26334056, 26638998, 25226490, +-14461155, -20158430, 2857227, 34974992, -18282602, 9899900, 22591528, 6784438, -8348343, -16852914, +-10901701, 7693360, -2556579, 5844914, -9716290, 6465000, -21656298, 31768800, -2971044, 7077033, +-1395328, -40217536, 12617540, -11184095, 20809116, 12399571, 22226456, -8704288, -38603168, 27733140, +12622909, -13224741, -23991688, 19866908, 10787884, 21132312, 21505438, -18723910, 8696772, 22307524, +-32681480, 29990682, 14898705, -1010928, 9666898, -17061220, 37749004, -4299799, 24880746, 11065446, +43815644, -3120831, -7553237, 6099928, 17890686, 11747809, 12486544, 44095892, 2703682, 10738492, +25913686, -17113834, 17818208, 2042794, -29250874, 10880226, -9783399, 33158222, -24348170, -29445222, +-30478162, 26079578, 43011948, -13744432, 11033234, -50634980, 4936528, 2389076, -1818919, -23738284, +4074313, 9978820, -7708930, -6558952, -6246493, 15980500, 7626788, -10152229, -10790568, -6335614, +-2461016, -3208878, 4711043, -17479980, -10341744, 9230958, 3941169, 3262565, 674310, 7951058, +-1247688, -956704, -10130754, 13709536, 17252346, -7354595, -26554710, -18046916, -78920, 9127, +5232344, 1330903, -8292508, -13127031, -7080254, 4931160, 7823820, 21364778, 7351374, 1110249, +481036, -15941845, -3146064, 16558710, 9915469, 3756486, -17255032, -10561325, -1842004, 2396592, +3142306, -2857227, -3169149, -3046743, -1017370, -64887292, 3540127, -7940858, 2005750, 50253264, +41349260, 59509456, 31411780, -15817291, -12132746, -24645596, -32875828, 11576011, 2872260, 8637716, +10438918, -9566503, 14949707, 25380572, 4654671, -6784975, -8606578, -17961554, -11959336, -10851772, +4950487, 8092256, -25818122, -15255724, -3569655, 17326434, -7825968, 11164231, 13845364, -36658620, +-36141076, 6867653, 10464688, 8060043, -27282170, -12526272, -24504400, -11843909, -11222750, 23639500, +-31056372, -43218108, -16258599, 8590471, 7347079, -33331094, -26781806, -21029770, -15944529, 18034030, +25396678, 1160178, -8630200, -10538776, -5892159, -5612986, -11478300, -36998996, 12175695, 27821724, +25271050, 7880191, 34517580, 46693272, -4066797, -5992016, 35743792, -8644695, -21752936, -49155900, +-16746614, 6709276, -26980984, -18053896, 12642236, -4408784, 17529372, 30673046, -18663780, -28956670, +-9588514, -12419972, -7188702, -7852274, -7793755, 3271691, 4451734, 3593814, 6244346, -10396505, +9086540, -14364518, -1719061, 8947491, 11985643, -12834436, -17912162, 10271951, -4075387, 672699, +-12499429, 14795625, -8651138, -3105798, -3437585, 13695577, -11574400, 14857366, -6580427, -6920266, +9833864, 2600603, 7835631, -6186901, 705448, 2921115, 16018081, -1863479, 3813931, 2448668, +42769820, 14813879, 3596498, 15415174, -17520782, 1008244, -8879845, -13342316, 8027294, 2972117, +-10880226, -18460306, -10392747, -17144436, -13696651, 5446019, -10536629, -5333276, 8138426, -5406827, +1950452, -6001143, 21330418, -16691854, 17512192, 6194417, 2095944, -16146393, -6771553, 12683038, +5322538, -399969, 10357851, -1920924, -4105452, -6672232, -5405217, -4505421, 2047626, -187368, +2279017, -18889804, 10004053, -7958038, -7237020, 6451578, 4621385, 2357937, -3422552, 13086228, +11469173, -16542067, 14839112, -2157147, 10103911, 19757924, -4051228, 10649908, 10351408, -9970767, +-6922414, -13256953, 1291175, 2168959, -20989506, 8614094, 3314104, 16335371, -6360310, -37526204, +23579908, 1327682, 791348, 387621, -16413218, -5316633, -4243428, -5683853, -23972896, 13621489, +7009387, 14697915, -10621454, 6414534, -11927661, -11082626, 614717, 9292699, 7692824, 147103, +-1272384, -3479997, 943819, -5626407, -1027571, 15858630, -6376416, 3068754, 1843078, 4429185, +-9685151, 10519986, -282931, -2129230, 2601140, -1165010, 2543695, 3451006, -8799314, -1337882, +266288, -1784559, -1524713, 4756140, -5583458, 6991133, 10435160, 3777961, -6332393, -443455, +-1237488, -6128382, 7640210, -2215666, 4224101, -21919366, -62270584, -92581776, 19445464, 72807752, +3032784, 199248368, 183653872, 126211376, 217002144, 166987792, 22740778, 3670050, -22470732, -159005056, +-162226288, -123272000, -212496192, -198096784, -56603372, -66004520, -66791036, 16040092, 40320616, -33024004, +-10969346, 63917704, 40711460, -2005750, 47518444, 33067490, 2600066, 39894876, 94101120, 62035972, +21686900, 96520800, 71417792, 5821828, 82902536, 112423992, 27103392, 12426951, 114599928, 31636730, +-44354128, 57919244, 88340496, -44715980, 20807506, 123517888, 11934640, 20704964, 148954304, 117231672, +10130754, 93106304, 123263952, -42315628, -25018184, 35402340, -100315400, -167685728, -113138568, -184944512, +-275041664, -252482880, -282558368, -359865632, -379836704, -335857312, -355050464, -334266560, -250948496, -200242656, +-104154568, -25547002, 59547036, 206740400, 240424752, 261096432, 404728192, 395810752, 265839680, 342253600, +267487872, 106807248, 117899000, 166618432, 81725176, 53551800, 124588408, 89133992, 34897, 43069932, +96990560, 24721294, 7309498, 72571528, 17215302, -74132208, 24845848, 59620052, -16561931, 53494356, +141102560, 56387552, 32256278, 124423056, 68181536, -23490250, 15188615, -31150860, -147449456, -180670480, +-179578496, -226562752, -256128768, -211626464, -203476224, -232034000, -209368912, -172856864, -199311712, -182270352, +-122523608, -97215512, -93071408, -37611028, 23305030, 27693412, 84810568, 142653040, 149935168, 148343344, +167416752, 154850752, 111055504, 94422168, 84240952, 58566176, 48063368, 58958628, 52546240, 35993972, +37462316, 40967544, 34855808, 34154116, 43625592, 38706784, 27765352, 22590992, 20430622, 4173635, +-489626, -4534949, -23651848, -31689342, -29700772, -24758876, -20713554, -12610561, -6129992, -4858682, +-1035087, 8396661, 15714212, 20591146, 20397874, 15481746, 10465225, 3863860, 504659, 2094870, +-646929, -7282117, -7663833, -11727408, -21264384, -23551454, -22730040, -30462056, -33054606, -29459180, +-33467996, -40246528, -38121592, -39270496, -43537008, -39448736, -32984276, -34570192, -31143882, -21017960, +-16655346, -15013058, -4287451, 1824824, 3566434, 10093710, 18613852, 20052666, 20989506, 25605522, +24881820, 22650046, 25964688, 28469728, 28781112, 29753922, 31833224, 28978144, 27445914, 27710592, +27968828, 23694798, 20343112, 14875082, 7696045, 2243584, -348429, -2251100, -4105452, -5951751, +-6847252, -7295002, -6856379, -6018860, -4859756, -5222144, -4800700, -4476430, -4283693, -4244502, +-3267396, -2863670, -1982127, -1400159, -297427, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 3746822, -5185636, -3051574, 214212, 162135, -3712999, 4958003, -1981054, -1947768, 1418950, -5130339, --2297808, 5481989, 1245541, -2247342, 3900367, 1198833, 832687, -814433, 1899986, -43487, --6572374, -324807, -2441689, -307090, -148176, -6301254, 92342, -4056060, 214212, 621160, -2801393, 3343095, 1101122, 818728, 609349, 2885144, -1596117, 975494, 177167, 438624, -597537, -888521, 2583423, 3859028, -7456600, 3441880, -1957431, -4498442, -2874944, 5695127, -2855080, -1950452, 3234647, 923955, -2059437, 1992328, 32212, -24159, 287763, 368293, --788127, 20938, 410169, -352724, 2443300, -1551020, -3453691, -3357591, -34360, 1096290, --225486, 134218, 1864016, -766115, 3282429, -3511136, -1055488, 2655364, 2879776, -2019172, -3247532, 1119913, -862752, -2231773, -1039382, -970126, -896038, -902480, -453656, -155693, --499290, -950798, 259846, 627065, -1331977, -376347, -443455, 646929, -1162862, -294742, -139586, 2728378, 236760, -2245731, 1416266, -1228361, -1732482, 394063, -3686156, -486405, --2755759, 934155, 1767916, 1629403, 1357210, -2946348, -179315, -2450279, 2598992, -5007395, --2791729, 2456185, -5415417, -663036, -338229, 1337346, 1212791, 2621541, 5661304, 2551211, --686658, -71941, -2003602, -1628330, -9951976, -9232032, -601295, 6734509, -1675037, 5366562, -485868, 1491964, -1677722, -7774965, 3998078, 1159641, -2313914, 1838246, -4083440, -896038, -2321967, 956704, 7238631, -5028870, 4392678, -2341831, -5695664, -2713883, -1552094, -1633698, -2018635, 1633161, -4594005, -2119566, -2617246, -1047972, 4434017, 4662724, 5090073, -3805341, -634581, -2414845, -310311, -2043868, -2515240, -3126199, -3427921, 1814624, 535260, -604517, --1248225, 374736, 1923609, -2041183, -1728724, -959388, 2202245, -846109, -426276, -1044214, --1123671, -359704, 476205, -110595, -193810, 285078, 475668, -227096, -222801, 1328219, --1125818, -790811, 530428, -770947, 1078037, -773631, -772020, -240518, -154082, 594853, --375810, -435939, 390842, -2684, -1130650, 266825, 238371, -933082, 3661460, -3466576, --4581657, -3891240, 70867, -1512365, -1299765, -3069828, 631897, -3434363, -294205, -1388348, -5291937, -3389803, -3803731, -8351564, -10936060, -2594160, -4897337, -4424890, -1106491, 2298344, --2805688, -6495601, 4015795, -9439801, 2811593, -1550483, -1741072, 6174016, 4287988, 2310693, -813359, -1014149, -1010391, -2263448, 959388, 4203699, -3380676, 3988414, 3615289, 1102196, -511638, 1685238, 2764885, -6123550, -2699924, 5921686, -4582193, 427349, -114354, 3639448, --471373, -1326071, 661425, 6143414, 3360275, 2166811, 1952063, 3443490, -5400385, 4205310, --4409321, 3897146, 2526515, -1097364, -782221, -1787780, -2421825, -3876208, -206695, -1178432, --3132105, -3414499, -1953136, -1967095, -354872, -186831, -952946, 4678293, -1915555, -820339, --3149822, 3257733, 16643, -662499, 682900, -1301375, -2267743, 98247, 1282585, -104153, --217433, -1424319, 428960, -438087, -1320703, 135291, 301721, 779000, -159988, 528281, -412317, 1136556, 386547, -1137630, 61740, 663036, -160524, -991601, -638876, 1575179, -804233, -774168, -344671, -277562, 2230699, -5818607, -93416, -2754685, -5258651, -2512556, --943282, -3744138, -1206349, -3458523, -1289027, 2637647, 3655017, -6039261, -3367254, 1912334, --1153199, -6595459, 4392678, 7744900, 1672890, -1888712, -3606162, 810138, 3803194, 6999186, --3548717, -1547799, -4484483, -3679713, 3934190, 3857418, -5451924, 3167539, -1719061, -3557307, -5579163, -71941, 3058017, -7654169, 555661, -4929549, 1134408, -6111202, -3768297, -1049046, --1381906, 12560632, 4036733, 3211025, 2493229, -9460202, 5284421, 3592740, -2047089, -300111, -4125316, -646929, 4356708, 4945655, 5011153, -2958159, 391916, -1681480, 2678986, -2437394, --2480881, 1581085, -2329483, 1042603, 1584306, 15032, 2959233, 1091995, -5550172, -746787, --688805, 1677722, -6295349, -2105608, -1582696, 4378183, -1336809, -817118, -3395172, -980863, -241055, -399969, -1572495, -33823, -1015760, 1070521, 424128, -72478, 200790, 341450, --802085, -2434710, 1260036, 439697, -1338419, 565325, -726386, 192737, 302795, 753230, --177167, -373125, -578747, 447213, -961536, 824634, -1096827, -151934, -81604, 636192, --725850, -382252, -1059246, -715649, -977642, -7853885, -4316442, 3153580, -3380676, 9120900, -4070019, 8927626, -99858, -4430796, -4638028, -6342593, 9614284, -2393371, 4410395, 4844723, -1045288, 3396246, 3157875, 2997350, 1243930, -6375879, -331786, -2495376, -919123, 4285841, --366146, -440771, 3048890, 1855426, 3155727, -2804077, -9953587, -6008123, -3757560, 7290707, --6617471, -2066416, 4519916, -565325, 855772, -5628018, 9678172, 467078, -3746822, 7568269, --4671851, 11756936, 6121402, -2729989, 1381369, -3430605, -2289755, -10951630, 3870303, -5024575, --760209, -491237, -2374043, 4599910, -1811939, -4820027, -4625143, 1011465, -4225711, -4730370, -2669322, 344134, 3366181, -1889786, -9934259, 3364033, 4323959, 5486284, -5344550, -6088653, -786516, 9781788, 1588064, -5164162, -2332704, -934155, 2702071, 421444, 2876554, -2970507, --1100585, -641561, -3566434, -2990908, 4376572, -802085, 1714229, -453119, -1251983, -2859911, --273804, 37581, 1082332, -592706, 1005022, -794569, -2276333, -981937, -323196, -124017, --420907, 1634235, 84289, 1774895, -636192, -203474, -301185, -2081985, -21475, 970663, -1024350, 628139, 7793218, -7162932, 3532074, 9347996, -6763500, 1925219, -3839164, -7182259, -10679973, 4118337, 9920301, 9311489, 1272384, -7259569, -4581120, 3911642, -555125, 1687385, --8031052, 928250, -14210436, -5844377, -11099806, 6896107, -6336688, -129386, 1959579, -1726040, --2924336, 3443490, 3287261, 9875204, -1428614, -2070711, -7552163, -6295885, 6181532, 1443646, -2091112, 11794517, -3599183, 183073, 6164352, -2691334, 2819109, 2247342, 6170795, 5708549, --3937948, -503585, -7994008, 8364449, -5476084, -7058779, -6944425, 4469451, -2608119, -3668439, -8079907, -2423972, 8378408, -5077725, -3994857, -967441, 5472325, 7270843, -588947, -7618735, -2748779, -4828617, 10020696, 2200634, 5869610, -7982197, -3617436, 2285460, -2117419, 4996121, -681289, -2638721, 2881386, 6586333, 9084930, 7158637, 70330, -1529545, -144955, 1643899, -107911, -1458141, 1038308, -1207423, -255014, 2727841, 106300, -1152662, 2755222, -763967, --1513976, 857920, 945967, 79994, -1780801, 776852, -1234803, 384936, -2411087, -2805151, -707059, 1248762, -113280, 2422362, -853625, 1174674, 4718022, -12399571, 4350265, 3636227, -2503966, -9381819, 7175817, 11732240, -11435887, 4339528, -7015829, 4594542, 665720, 4125853, --3360275, -287763, 2754685, -7842611, -3831648, -3396246, 6229313, 6469832, -2087354, 3025268, --1542430, 4775467, 6175626, 2363843, 1899986, -6237903, -2282775, -7783555, -8545374, -6035503, -628676, -2901251, -350040, -3615826, -8506720, -2923262, 1796370, 754304, -467078, 12933220, --10432476, 3845606, -5168457, -1532230, -3200288, -3321084, 5561446, -3305514, 476741, -3999152, --2600066, -4853850, 6666326, -6096169, 5479842, -1429687, 5475010, -508954, 878858, -577673, -5295158, 3010772, -91805, 11223823, 507343, -5644661, 3021510, -5078262, -6158446, -7509214, -7353521, 2567317, 6558415, 6611566, 7828115, 4553739, -870268, -1401233, -1337346, 7461432, --1031866, 8368207, 1852742, -365609, -1211718, 2866891, 4333622, 1109712, 1821603, 583042, --498753, 830002, -1337882, 2248952, 172336, 1928977, -503048, 1831267, -126165, -2927557, -1522029, 2013803, 69256, 1639067, -444529, 93952, -1620813, 1417339, -332323, 695248, -3179350, 3192771, -13077639, -939524, 1593433, -2913599, -10316511, 11792906, -846645, 523986, -9853729, -2688113, -10320806, 3703336, 6620692, 12789876, -899796, 5460514, 1015760, -11077794, --3364033, -5712307, 5610838, 3340948, 2895345, -4082367, -839666, -370441, 949188, -3676492, -5227512, 1574106, -4567698, 6663105, 856309, -7232725, -6230924, 1823214, 7870528, 7232725, --10009421, 19568944, -1027034, 479963, 5293011, -658741, -2612951, -57445, 12450573, -6140193, -6131603, -1387811, 8605504, 2732673, 7710003, -2823941, -6150393, 4435091, 6589554, -3161633, --7462506, -7933342, -7145752, -3079492, -1472637, 7536594, 147640, 6571300, -805306, -1977833, -6350646, -5422396, -10789495, -2712272, -6896644, -6316823, -11989401, 9082782, 7766912, 3359738, --18576270, 4524748, 3893925, -1224603, -557272, -6306623, 8857296, 4711043, 3503620, 2341831, -8137890, -532576, -586263, 780073, -84289, 2073396, 925565, 220654, 2500745, -1317481, --330176, -1731946, 566936, 837519, 2762201, -1729798, -287226, -559420, 2136209, -782221, -807991, 1456531, 1719061, -1265942, 4094715, 197569, -96637, -1287417, 1620276, -2335389, -933082, 322123, -622233, 1110249, 2019172, -169114, -3582540, -1018981, -475668, -7545184, --358093, 430034, 5530844, -7934952, 535260, -1342177, -3111704, -16325708, -1822140, 7502234, -6043019, 7690676, 1042603, -8839043, 23117662, 9528922, 15764141, 1494112, -6710887, -2869575, --2088428, -9892383, -483721, -3965329, 5028333, -109522, 635655, -3262028, -4043712, -8386461, -2907693, 678068, 532576, 4122095, -226023, 1672890, -697932, -7304666, -5442261, 4202626, -149250, 10306311, -13073344, 10427644, 6600828, -4792647, -9420474, -15036681, 3272228, 11629161, --5900748, 11252277, -774705, -641561, 2734821, -3476239, -13110925, 1454383, 6370510, 2655901, --5630166, -1637456, -3489661, 2792803, 6529424, -469225, 1751273, -1003949, 6288906, -2899640, --1997697, 4080756, -3544422, 9586367, -2487860, -5058398, 3722663, -8935679, -4382478, -60130, -3588982, -3949223, 1741609, -1523103, 2042794, -69793, 2406256, 1864553, -684510, 1059783, --4072703, 2126009, -472983, -5769215, -1864553, -1732482, -3300146, -136902, 1072131, -2771328, --1799054, -260382, -3486977, 120259, 996432, -915365, -3699578, 199716, 20938, -2994129, -1251983, 1975148, -2250563, -287763, 750009, 90194, 1169842, 3200288, 2842732, -3000572, --2234457, 3721052, 2508798, -17737142, 12673912, 11525545, 13497472, -4332012, -12140799, 4262755, -4802847, -18053896, -16489990, 15939161, 1683090, -7770670, 5968394, -11281268, -12897787, 1835025, -33378338, 15531139, 6144488, -9084393, 86436, -3241090, 198642, -3816079, -1925219, -4239670, -1137093, 9514426, 1819992, 11730629, -4719096, -3898220, 2078764, 8192650, -1639604, -1194001, --17558364, -755914, -9921911, -539018, 13482976, 9658308, -3660923, 9438728, 18736794, -8975408, -5355824, 15568183, -11525545, 16454557, -1453846, 6758131, -3987877, 676457, -2309619, 2268280, -3733937, 16318728, -6347425, -2081985, 4162360, -7635378, 4716411, 2502355, -4472135, -7442105, -16004659, -1089311, -8929237, -2946348, 9888625, -4222490, 6681896, -69256, 392990, -10642392, --11654931, -5586142, -9956271, -8938364, -9757629, -614180, -2400887, 4675609, -706522, 824634, --981937, 5888937, 3663070, 399432, -7426536, 245887, -1475321, -5473399, -1662152, -2831457, -2755759, 1064078, -3831111, -1273995, -2964064, -2268280, -373662, 2014877, 1885491, 2059974, -3471407, -2235531, 340913, 2216203, -1674500, -2181844, 2516314, -3744675, -1577327, -1178432, -1541356, 668941, 2546379, 421444, 151398, 2150168, -1123671, -2604361, 21620328, 3959960, -2995740, -11220065, -6612102, 633508, 2428804, 4454418, 4962298, -21456582, 900333, 1418413, -15470472, 2545305, 3881577, -1420560, 14066018, -23051090, 636192, 11890617, -13839458, 3496640, -2623151, 11198053, 2115272, 1238024, -3861176, 408559, -11895986, 4052302, -3030100, 2141578, -3135326, -1977833, -9044664, 3326452, -7157026, -12268574, 6869800, -6919729, 4490389, -11535208, --7381438, -1185948, -3674345, 2801393, -5004174, 12724914, -232465, 12133819, -12859669, -10764799, --3551401, 208843, -300648, -3725347, 10800769, 8920647, 22622666, -3619584, 14437533, -8486855, --1548873, 4402879, -17330730, 19696184, -619549, 12270185, -577136, -17157320, -10448582, 7248831, --23084912, 11987254, 3207804, 17489106, 21927418, 2879239, -16427713, -12339978, -5192616, 12556337, --1634772, -3029026, 588411, -4591320, 559956, -3360275, -5058398, -1706713, -8072928, -388695, -243203, -3693135, -3439195, -4509179, -3333968, -1549946, 1876901, 3825205, 1297617, -643708, -3369939, -2411087, -1468879, 803696, 1716913, 2221572, -2373506, 2812667, -3053185, -1387274, --4395362, -7454990, 4454418, 771484, -4371740, -4283693, -966905, -5930813, 651761, 27380, --2119030, 4322348, 11087458, 16983912, 5907191, -7101192, 16158741, -17376900, -1824824, -5381057, -2119030, 13770739, -12542378, 31110596, 4100620, 7651484, -9223442, -12652974, 4306242, 25770, -26439282, -3884261, -9225053, -15228343, -10260140, 7289097, 4677757, 4221416, -1973001, -15002321, --23047868, 1620813, -13923747, 18327162, 2332704, 14860587, -9325448, 6147709, -6061810, 7642358, -21536040, -3707631, -2373506, -3386582, 5556077, 7064148, 3605625, 1457068, 2137820, 9252970, -8340290, -4995047, -7521562, -6814503, -7536057, 24578488, 9654013, -14644765, 11068131, -3446711, --11977590, -8666170, 4248260, 8893267, -17032230, -22228066, 2339147, -10018011, 28858960, 14894410, --5111548, -3465502, 6003291, 12901008, 3204583, -2394444, -4000225, -20190642, -1089311, -5083094, --21881248, 8042863, 13521631, -2410551, 6688338, 3599720, 13785234, -7865159, -2235531, 4812511, --2356863, -6502044, -7299297, -398358, -4486094, -10810433, -2379949, -5099200, 4414690, -2276333, --6059662, 3837017, 1409823, 359167, -3843996, 3818763, 892279, -6889128, 2086817, 2406792, --3339874, -9483825, -4789963, -1939178, -1242856, -367220, -3736622, -719407, -2843268, 1019518, -832687, -2080912, 154619, -411243, -3038689, -6002754, -1036698, 945430, 3041911, 1398012, --4617090, -116501, 3068217, 1240709, 1174674, -4787815, 1394791, -2016487, -2319282, -2550137, --2859375, 251256, -55835, -3093450, 1384590, -8476655, -13437879, 7614440, -4278861, 11682848, -5711233, -13160854, -5178120, -6776385, 3051038, -17642652, 12058658, 16238734, -6437082, 10042707, --2226941, -4765266, 8289287, -12424804, 7863012, 13151727, 3967476, 22850300, 11494406, -9891310, -10153840, 3966402, 8958765, 180389, 12706124, 10573136, 16924318, 6049462, -6228240, -8019241, --10018548, -1197759, 26097832, 336618, 11202885, -16464220, 34006476, -10217190, -26148298, -12707734, -21575232, 1474248, -2684355, -3128884, -1279900, 15657303, -11373610, 8980777, -2088428, 19771346, -30798674, 15503758, 14994805, -11052561, 17635672, 10286984, 10589242, 11597485, 17635672, -3813931, --30023432, -19641422, -21735218, 5513665, 8123931, 6087580, -4828080, 10054518, 27039504, 1681480, -2360085, 6329171, -1217623, -23666344, -24966644, -8829379, 5301601, 2502355, -790811, -14627048, -3959423, 528281, 1478006, 7397008, -1385127, 4636954, 1940252, 9176198, -2066416, 6068789, --4657892, 941672, 1272384, 10681584, 5277978, 10663330, 1513976, 5346161, -1647657, 1047435, -4939213, -3173444, -6762426, 1457068, -3912715, -8118025, -5974837, -1900523, -1426466, 10406706, -2507187, -191126, -2918967, 1490891, 351650, -3973382, -4029216, -3324842, 2690797, 6597607, --558883, 469225, 1149441, 2877628, 2430415, 7043747, -6949794, 4421132, 11141145, 13085692, -4728222, 6146635, 10188199, -8028905, 23695334, 9350144, 4577899, -6760816, -18182208, -7331509, -9912785, -985695, -25766582, 34693672, -12187507, -6795712, 10684805, 527744, -3468186, 2516851, --6741488, -8141648, -1785096, -18872624, 4660040, -20280836, 551903, -16077136, -18116708, -3628711, --3863860, -3968013, -13258027, 5815386, 14165876, 3806415, 10842645, -18821620, 18547816, 33830920, -3484292, -13578539, 21114596, -17328582, -27481348, 45726368, -4711043, 3251827, -3205119, -20438138, -15749645, -18526878, 7997766, 27944130, -585189, 38378216, -29971356, 28914256, 8394514, -18976776, --9980967, 3634079, -18278308, -9081171, 20293184, -19921132, 13201656, -13391171, 7308424, 21250962, --46662136, -20532092, 21430814, -39996884, 14099841, 12427488, 22846004, 20262046, 9067750, -1604707, -13387950, 20101520, -21850646, 21810918, -457414, 7565585, -1202054, 6865505, 1711008, -4111358, -1445793, -6292127, -2136209, 1671816, -1190243, -10929618, 6841883, -1893544, 8929237, 5431523, --7838316, 6182606, 7434052, 5507222, 2182380, 3959960, 2274722, 5034776, -15319075, 8608725, --2081985, -4086662, 10732050, -8617315, -7163469, 3722663, -9099425, -7247758, -2958696, -6587943, --8923868, 4964982, -13497472, -40039832, -10497974, 13196824, 30895310, -9804337, 15568720, 483184, -7320772, 16088947, 10321343, 27824408, -7243999, 1226750, 7569343, -24559696, -15884937, -7292855, --8019241, 5701032, 359167, 2124398, -12884365, -2084133, -17038136, -13768055, 6578816, 34343096, -19677392, -8983461, -11041824, 16386374, 19529216, -11632919, 5109938, 15109158, -6031745, 32848446, -11105175, 4854387, -25376278, 15653008, 3149285, 12341052, -2659659, 3209951, -4239670, -5422396, --39979168, 10613938, 27544162, 13670344, 3632469, -741956, 13859323, -22422414, -41531796, 3115462, -54919748, 13261785, 43555800, 41386304, 487479, 3639448, -26365194, -23529442, -2576981, -20180978, -27474368, -59989956, 11278047, -22457310, -47996796, 10678362, 22375706, 47951164, 4236449, 2422899, --30601642, 10004053, 14366666, -21322902, -2055142, 1537598, 22332756, -5977521, -14347875, 33927020, -7116761, -12090870, -493921, -19597936, 2532420, -18548354, -3804804, -613643, -9132711, 2850248, --7387344, -7761006, -4310000, -56908, -3758097, 6303402, 17521856, -966905, 157840, 6577206, --15949898, -9585830, -1956358, 4843113, 4988605, -13821742, -7878044, 11032160, 6448357, 3863323, -2617783, 11652783, -472983, 237297, 1166084, -7805566, 1394254, 11148124, -5698348, -10584947, -29414620, 51126216, 1430761, 13908715, 9332964, -26996554, -7531762, 26765162, 8563091, 11755325, --6633577, 7721815, 4678293, -9600326, 526670, 13849122, 14870787, 17920752, -7851737, -2299418, --39681204, -37410776, 5252208, -23163832, 903017, 19931332, 4949950, 2294586, -6807523, -4549444, -12947179, 31241056, -22654342, -13158706, -2868501, -22214644, -1510218, -21414706, -6526740, -22729504, -20102058, -27524298, -2131915, 4844186, 13391171, 47869556, 64063732, 16468515, -16716550, -34219616, --2910377, -23438174, -9060770, -36391256, 5532455, 34897684, 25919054, 20903606, 2629057, 4990752, -35961760, 34726420, 25693568, -2193655, 16256451, 5866389, 8086350, -41384696, 12557411, 4469987, --9416179, 24793772, 33907692, -4800163, -466541, -16702591, -70427264, -1468879, 20969640, -10352482, -48935248, 34578780, -16013249, 3120831, -17864380, 12036646, 3482682, -6654515, -10644003, -5023501, --884763, 7471096, 9554692, 14329085, 525060, -8816494, -18687402, 974421, -8748312, 7059316, --8246337, -11592117, -2728378, -3100430, 8647380, 3441343, -3093450, 4354023, 2605435, 3427921, -979253, -6650220, -10245644, -5395016, 4071629, 8572755, -601832, 6964827, 69256, -10550587, --10671920, 2879776, -13091597, -7606387, 202400, -5970005, -1443646, 3587372, 5621576, -5092758, --8760660, -12652437, 32117228, 22590454, -15025943, 15244450, 23911694, 2504503, -29519310, -35640176, -33332704, 11114838, 7868380, 25924960, 785979, -11516955, 28208272, 7225209, -21029770, -10929081, --7486128, 9304510, 807454, -12862890, 5138392, -14211510, -1191317, -6484327, -6621229, 18943490, -35785668, -12233141, 7607998, 16633335, -8094403, -7274601, 7111392, 20128902, 6719477, -15654619, --19427748, -23786602, 12955769, 13240847, 32530082, -15392626, -14235669, 11237245, 19491636, 29994440, --589484, -55823836, -11662447, 17884780, 18196166, 7984344, -10609643, -496069, -22009024, 3272765, --9349607, 23094576, 33498060, -10114111, 1023276, -19523310, -20777442, -8207146, -42379516, -8659191, --21392158, 18858128, -17054242, 19567334, 24675124, -49461380, -3797825, -20964272, 21492554, -8768713, -7800198, -15425912, 2852395, -13148506, 14926622, 16174310, 28385976, 26998702, 13769128, 25975426, -12452721, 1490891, 14148159, 8799851, -3501472, 11533598, -12483859, 6151467, -6185827, 5318780, --15823196, 9564892, 494458, 7563975, -11529840, -6850473, 8185671, -3180960, -3569655, 13915157, --10558640, -2588255, 11770358, 5531918, -7141994, -2463164, 5083094, 25732222, 14332306, 11184095, -15690589, 971200, 17025788, 5508296, 5563594, 8580808, 523986, 13808320, 4371203, -23925116, --10611790, -6439230, -7676181, 2974265, -4665945, -11514270, -16417512, -26583700, -6292127, -14698452, --27400280, -40860708, 19863150, 21465710, 12312061, -27240830, -37575060, -28481002, -16492674, 6924561, --1455457, -36183488, -21942988, -24739012, 35083440, 11179263, 15161235, -10923712, -20310364, 44937168, -10852309, 14141180, -8778913, 2830384, 13014288, -8976482, 10300942, -3122441, 21136608, 30328912, -1123134, -24166170, -19736986, 24055574, 16172162, 21090974, 5854578, 5412196, -10975252, -4568235, -3275986, 14780056, 31408558, -110595, -59106804, -54470924, 619549, -13196287, 35198332, 36126044, --40185324, -26892938, -16986058, 49964428, 44231720, -23902030, 6945499, -31348430, -30488900, 18635864, --14097693, 335544, -4790499, -21713744, 15485505, 16173773, 12632573, 50592032, -37096708, -9808095, --3540664, 13073344, 3995393, 20893942, -73938936, -42777876, 15350750, 23302346, 22782654, 6626061, --24464670, -24789478, 352724, 14857902, 42601780, 10497437, -14273787, 4490925, -27698244, 17256642, -14865419, 973347, 23839752, 51328616, 12240120, -37507948, -19775104, -2581812, 4267050, 24816858, -21452824, 10262287, -11377905, -4554276, -7853348, -8832063, 22231824, -2578054, 1998770, -8836895, -21556978, -9989557, -4210142, -537945, 18700288, 8238821, 6620155, -3956739, -23638426, -8438537, -7610682, 18815714, 3192235, -26186416, -36371392, -30287036, -787590, 4379793, 5537824, 3620658, --9974525, -7541963, 49510772, -32897302, 30923228, 30684320, 19726248, -71683008, -28685550, 23968602, --19394998, 13857175, -5036386, -29787746, 19139448, 5711233, 5763309, -13179107, -47350940, -4519380, --1360968, 158914, -6684580, -34581468, 25924422, -21377126, 44214004, -4678293, -3768297, 21474836, -16094853, -21116744, -1865626, -15989626, 23669564, 37119256, 28360742, -31344672, 7117835, -20981988, -18996104, -18227304, -7379291, 3080565, -1497870, 20167018, -18444738, -43514460, 11287174, -15575699, -16344498, 16945256, -54945516, -9359271, -10395968, 1992328, 61061552, -16452946, -44256416, -11805254, -38851200, 18584324, -23915988, -7902203, 24144158, -118648, 29783988, -44649408, -23460186, 26838714, --27901718, -68066640, -19958176, -9295920, 77772192, -21206938, -39999568, 21325050, -46161236, 122080688, -11686606, -113466056, -30079266, -20056424, 80652504, 43567612, -50491636, -26745836, -525060, 59485296, -47591460, -7427609, -37176700, 14595909, -12483859, 53643068, -5054103, -26989038, -22176526, 35128536, --27991912, 18186502, -53733800, -278636, -1911261, -3176128, -3008088, 11288248, -29672318, 28848222, -2558727, 21147346, 1020592, -34072512, -25972740, 19340238, 23105850, 35985920, 13623099, -3720516, --23346906, 3089692, 6033356, -6259378, 1724966, 23567560, 3862249, -1169842, -26721140, 5125507, -19306414, 7009924, 981400, -7924215, -19158238, -21267068, -9867150, 6493454, -6277632, 9400610, --8863202, -5409512, 3647501, 707596, 284542, -65521872, 18358838, -1025960, 22378390, 54216984, -17355962, 7482907, -30563524, -12655121, -30544196, -36544804, -12259447, 7208029, 20888036, 27675696, --3111167, 16105054, 19474456, -16950626, -34417184, 18247168, 6538014, -27941984, -9515500, 26582626, --9051107, -2954938, 24295556, 13644037, 10793790, 3403225, 13806709, -13208098, -31971736, -13880261, -9095130, -13077102, -7565585, 11726334, 773094, -22493280, 23454816, 5086852, -20861730, 2692945, --5044439, 20216948, 11230266, -8128226, 9474161, -12425877, -28029494, 3778498, 6806987, -2521683, -54224, 5953899, -12251931, 3897146, -10492605, 6320045, 19977504, -2090575, 8725226, 9274445, --7742216, 532039, -19090056, 6562173, 11240466, -34631932, 20113868, -21585432, 6805913, 1042066, --113280, 9592273, 3855807, 22668300, 4116189, 6439767, -3283503, 11619497, -12179454, -7966091, -2789581, 1983738, -10659572, 3879966, -964757, -3050501, -6163278, 2242510, -1227287, 12294344, --3153043, 1509681, 8754754, -6106907, 6078453, -3743064, 2123325, -6109054, -5386963, -6100464, --1632088, -2715493, 4616553, 3357054, -14369887, -3872987, -4209605, 10048613, -5939403, 3791919, -1701344, -15935402, 5304822, 10435697, 665720, -3839701, 1714766, -4642323, -2385318, 3501472, -53103512, -1974611, -1726577, -14778446, -14455249, 10877005, -608812, 9408126, 195958, -5235565, --6985228, 3544422, -9790915, 9900973, -9221832, 14448807, -11715597, 8394514, -9916543, -2271501, --1590749, -9306657, -7061463, 2027761, -4169340, -2984466, -68719, -7018514, 920197, -1449552, -2214593, -1705639, 4051228, -14010183, 12690018, -4846334, -4168266, 9546102, -7732552, 437013, --9656697, -8529268, 6137509, 5335960, -6791954, -4465692, 2716567, -525060, -11814381, 2930778, -2057826, -101469, 7729331, -2968896, -3349001, -3278671, -8078297, -2291365, 8430484, -9092983, -2292439, -4463545, -1131187, 469225, -2760053, 1873143, 22549, 5797132, -8618389, -856309, -5515812, -11206643, 6429566, -5114233, 40802, 4946729, -2493766, -5177046, 2250026, -1021665, --1488743, -502511, -3650185, -220654, 3703873, -378494, -1806034, 519691, -3174518, 2024540, -1530619, 781147, -2576981, -900333, 3193845, -4296578, 4086662, -2047089, 1744831, 4454418, --5604933, 1169305, 311922, -7153268, 1208496, -2390149, 2815351, -1156420, 142271, 4071629, --2866354, 643708, -4576825, 600222, 573378, -1300838, -1165547, -721018, -1704565, 134218, --904628, -3221, 3033858, -4752382, 1906966, -25081536, -41907068, 15437723, 134908688, 33542620, -74461312, -3099893, -72216656, -23687282, -71062920, -61036316, -21361020, -14854681, -4823249, 40169756, -54351200, 71464496, 90659784, 38878044, -23036594, -42120744, -88750128, -84697832, -34316788, -28434830, --18692234, 36309652, 49912352, 29553670, 46285252, 55148452, 18859738, 14976551, 10475962, -28886876, --13069049, -20744156, -44627932, -24908662, -33125472, -49488224, -26693758, 5906117, 5406827, 27330488, -66918812, 45488000, 38154880, 36848672, 11532524, 2540473, -3667902, -19423990, -27302034, -34915936, --49502720, -44076564, -24404542, -7891466, -16632798, 13653164, 25862146, 21672942, 37857452, 41861972, -27134530, 24269786, 24041616, -3911105, -11590506, -6076305, -34097208, -28540058, -7118909, -28249074, --29894046, -19194746, -26875220, -13300977, 7854422, 17096118, 31374200, 49896244, 31187906, 28610388, -31982474, 11615202, -3650722, -5971615, -16962436, -28450938, -29235306, -28164784, -30578020, -21518324, --19514720, -16485695, -6593312, 7524783, 19127100, 29263760, 44532368, 46589120, 45706504, 38570952, -12400644, -10231149, -20601884, -33546378, -44077100, -50093816, -49730352, -39632884, -22121766, -5448703, -13857175, 40861780, 45739792, 45540612, 47982300, 39427264, 20939576, 6495601, -11060615, -32013076, --44484052, -39504036, -36698884, -29142426, -13357348, 1131187, 11069741, 21948894, 25113748, 24494736, -19714974, 8796093, 4284230, 1563905, -3399467, -4204236, -3983045, -5583458, -6677064, -5368172, --7371775, -5134097, -3984119, -2903398, -3385508, -1179505, -172872, 2091112, 2563559, 4687957, -5692979, 6900939, 5105106, 5247377, 3579855, 2268817, -804233, -1753957, -3803194, -4087198, --5884105, -5468030, -5403606, -3854196, -3432753, -1069984, 374199, 2193655, 3015067, 5350456, -5149666, 5622112, 4379793, 3543885, 1340567, 1013612, -961536, -1573032, -4227322, -5602785, --6182606, -4447439, -3918621, -1227824, 38655, 1388885, 1663226, 3213709, 3008625, 4273493, -3606699, 3796214, 2310156, 1578937, -874563, -1637456, -3441880, -3321620, -3776350, -2857227, --3117073, -1535988, -957778, 1004486, 1697586, 3135863, 2666638, 3160559, 1772211, 1504849, --61203, -348966, -1237488, -654983, -1475321, -850404, -1444183, -568009, -930397, 16106, --350577, 532576, 37044, 731218, 77846, 665720, -14496, 563178, -163209, 400506, --289910, 349503, -307090, 331786, -312996, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +5185636, -3051574, 214212, 162135, -3712999, 4958003, -1981054, -1947768, 1418950, -5130339, +-2297808, 5481989, 1245541, -2247342, 3900367, 1198833, 832687, -814433, 1899986, -43487, +-6572374, -324807, -2441689, -307090, -148176, -6301254, 92342, -4056060, 214212, 621160, +2801393, 3343095, 1101122, 818728, 609349, 2885144, -1596117, 975494, 177167, 438624, +597537, -888521, 2583423, 3859028, -7456600, 3441880, -1957431, -4498442, -2874944, 5695127, +2855080, -1950452, 3234647, 923955, -2059437, 1992328, 32212, -24159, 287763, 368293, +-788127, 20938, 410169, -352724, 2443300, -1551020, -3453691, -3357591, -34360, 1096290, +-225486, 134218, 1864016, -766115, 3282429, -3511136, -1055488, 2655364, 2879776, -2019172, +3247532, 1119913, -862752, -2231773, -1039382, -970126, -896038, -902480, -453656, -155693, +-499290, -950798, 259846, 627065, -1331977, -376347, -443455, 646929, -1162862, -294742, +139586, 2728378, 236760, -2245731, 1416266, -1228361, -1732482, 394063, -3686156, -486405, +-2755759, 934155, 1767916, 1629403, 1357210, -2946348, -179315, -2450279, 2598992, -5007395, +-2791729, 2456185, -5415417, -663036, -338229, 1337346, 1212791, 2621541, 5661304, 2551211, +-686658, -71941, -2003602, -1628330, -9951976, -9232032, -601295, 6734509, -1675037, 5366562, +485868, 1491964, -1677722, -7774965, 3998078, 1159641, -2313914, 1838246, -4083440, -896038, +2321967, 956704, 7238631, -5028870, 4392678, -2341831, -5695664, -2713883, -1552094, -1633698, +2018635, 1633161, -4594005, -2119566, -2617246, -1047972, 4434017, 4662724, 5090073, -3805341, +634581, -2414845, -310311, -2043868, -2515240, -3126199, -3427921, 1814624, 535260, -604517, +-1248225, 374736, 1923609, -2041183, -1728724, -959388, 2202245, -846109, -426276, -1044214, +-1123671, -359704, 476205, -110595, -193810, 285078, 475668, -227096, -222801, 1328219, +-1125818, -790811, 530428, -770947, 1078037, -773631, -772020, -240518, -154082, 594853, +-375810, -435939, 390842, -2684, -1130650, 266825, 238371, -933082, 3661460, -3466576, +-4581657, -3891240, 70867, -1512365, -1299765, -3069828, 631897, -3434363, -294205, -1388348, +5291937, -3389803, -3803731, -8351564, -10936060, -2594160, -4897337, -4424890, -1106491, 2298344, +-2805688, -6495601, 4015795, -9439801, 2811593, -1550483, -1741072, 6174016, 4287988, 2310693, +813359, -1014149, -1010391, -2263448, 959388, 4203699, -3380676, 3988414, 3615289, 1102196, +511638, 1685238, 2764885, -6123550, -2699924, 5921686, -4582193, 427349, -114354, 3639448, +-471373, -1326071, 661425, 6143414, 3360275, 2166811, 1952063, 3443490, -5400385, 4205310, +-4409321, 3897146, 2526515, -1097364, -782221, -1787780, -2421825, -3876208, -206695, -1178432, +-3132105, -3414499, -1953136, -1967095, -354872, -186831, -952946, 4678293, -1915555, -820339, +-3149822, 3257733, 16643, -662499, 682900, -1301375, -2267743, 98247, 1282585, -104153, +-217433, -1424319, 428960, -438087, -1320703, 135291, 301721, 779000, -159988, 528281, +412317, 1136556, 386547, -1137630, 61740, 663036, -160524, -991601, -638876, 1575179, +804233, -774168, -344671, -277562, 2230699, -5818607, -93416, -2754685, -5258651, -2512556, +-943282, -3744138, -1206349, -3458523, -1289027, 2637647, 3655017, -6039261, -3367254, 1912334, +-1153199, -6595459, 4392678, 7744900, 1672890, -1888712, -3606162, 810138, 3803194, 6999186, +-3548717, -1547799, -4484483, -3679713, 3934190, 3857418, -5451924, 3167539, -1719061, -3557307, +5579163, -71941, 3058017, -7654169, 555661, -4929549, 1134408, -6111202, -3768297, -1049046, +-1381906, 12560632, 4036733, 3211025, 2493229, -9460202, 5284421, 3592740, -2047089, -300111, +4125316, -646929, 4356708, 4945655, 5011153, -2958159, 391916, -1681480, 2678986, -2437394, +-2480881, 1581085, -2329483, 1042603, 1584306, 15032, 2959233, 1091995, -5550172, -746787, +-688805, 1677722, -6295349, -2105608, -1582696, 4378183, -1336809, -817118, -3395172, -980863, +241055, -399969, -1572495, -33823, -1015760, 1070521, 424128, -72478, 200790, 341450, +-802085, -2434710, 1260036, 439697, -1338419, 565325, -726386, 192737, 302795, 753230, +-177167, -373125, -578747, 447213, -961536, 824634, -1096827, -151934, -81604, 636192, +-725850, -382252, -1059246, -715649, -977642, -7853885, -4316442, 3153580, -3380676, 9120900, +4070019, 8927626, -99858, -4430796, -4638028, -6342593, 9614284, -2393371, 4410395, 4844723, +1045288, 3396246, 3157875, 2997350, 1243930, -6375879, -331786, -2495376, -919123, 4285841, +-366146, -440771, 3048890, 1855426, 3155727, -2804077, -9953587, -6008123, -3757560, 7290707, +-6617471, -2066416, 4519916, -565325, 855772, -5628018, 9678172, 467078, -3746822, 7568269, +-4671851, 11756936, 6121402, -2729989, 1381369, -3430605, -2289755, -10951630, 3870303, -5024575, +-760209, -491237, -2374043, 4599910, -1811939, -4820027, -4625143, 1011465, -4225711, -4730370, +2669322, 344134, 3366181, -1889786, -9934259, 3364033, 4323959, 5486284, -5344550, -6088653, +786516, 9781788, 1588064, -5164162, -2332704, -934155, 2702071, 421444, 2876554, -2970507, +-1100585, -641561, -3566434, -2990908, 4376572, -802085, 1714229, -453119, -1251983, -2859911, +-273804, 37581, 1082332, -592706, 1005022, -794569, -2276333, -981937, -323196, -124017, +-420907, 1634235, 84289, 1774895, -636192, -203474, -301185, -2081985, -21475, 970663, +1024350, 628139, 7793218, -7162932, 3532074, 9347996, -6763500, 1925219, -3839164, -7182259, +10679973, 4118337, 9920301, 9311489, 1272384, -7259569, -4581120, 3911642, -555125, 1687385, +-8031052, 928250, -14210436, -5844377, -11099806, 6896107, -6336688, -129386, 1959579, -1726040, +-2924336, 3443490, 3287261, 9875204, -1428614, -2070711, -7552163, -6295885, 6181532, 1443646, +2091112, 11794517, -3599183, 183073, 6164352, -2691334, 2819109, 2247342, 6170795, 5708549, +-3937948, -503585, -7994008, 8364449, -5476084, -7058779, -6944425, 4469451, -2608119, -3668439, +8079907, -2423972, 8378408, -5077725, -3994857, -967441, 5472325, 7270843, -588947, -7618735, +2748779, -4828617, 10020696, 2200634, 5869610, -7982197, -3617436, 2285460, -2117419, 4996121, +681289, -2638721, 2881386, 6586333, 9084930, 7158637, 70330, -1529545, -144955, 1643899, +107911, -1458141, 1038308, -1207423, -255014, 2727841, 106300, -1152662, 2755222, -763967, +-1513976, 857920, 945967, 79994, -1780801, 776852, -1234803, 384936, -2411087, -2805151, +707059, 1248762, -113280, 2422362, -853625, 1174674, 4718022, -12399571, 4350265, 3636227, +2503966, -9381819, 7175817, 11732240, -11435887, 4339528, -7015829, 4594542, 665720, 4125853, +-3360275, -287763, 2754685, -7842611, -3831648, -3396246, 6229313, 6469832, -2087354, 3025268, +-1542430, 4775467, 6175626, 2363843, 1899986, -6237903, -2282775, -7783555, -8545374, -6035503, +628676, -2901251, -350040, -3615826, -8506720, -2923262, 1796370, 754304, -467078, 12933220, +-10432476, 3845606, -5168457, -1532230, -3200288, -3321084, 5561446, -3305514, 476741, -3999152, +-2600066, -4853850, 6666326, -6096169, 5479842, -1429687, 5475010, -508954, 878858, -577673, +5295158, 3010772, -91805, 11223823, 507343, -5644661, 3021510, -5078262, -6158446, -7509214, +7353521, 2567317, 6558415, 6611566, 7828115, 4553739, -870268, -1401233, -1337346, 7461432, +-1031866, 8368207, 1852742, -365609, -1211718, 2866891, 4333622, 1109712, 1821603, 583042, +-498753, 830002, -1337882, 2248952, 172336, 1928977, -503048, 1831267, -126165, -2927557, +1522029, 2013803, 69256, 1639067, -444529, 93952, -1620813, 1417339, -332323, 695248, +3179350, 3192771, -13077639, -939524, 1593433, -2913599, -10316511, 11792906, -846645, 523986, +9853729, -2688113, -10320806, 3703336, 6620692, 12789876, -899796, 5460514, 1015760, -11077794, +-3364033, -5712307, 5610838, 3340948, 2895345, -4082367, -839666, -370441, 949188, -3676492, +5227512, 1574106, -4567698, 6663105, 856309, -7232725, -6230924, 1823214, 7870528, 7232725, +-10009421, 19568944, -1027034, 479963, 5293011, -658741, -2612951, -57445, 12450573, -6140193, +6131603, -1387811, 8605504, 2732673, 7710003, -2823941, -6150393, 4435091, 6589554, -3161633, +-7462506, -7933342, -7145752, -3079492, -1472637, 7536594, 147640, 6571300, -805306, -1977833, +6350646, -5422396, -10789495, -2712272, -6896644, -6316823, -11989401, 9082782, 7766912, 3359738, +-18576270, 4524748, 3893925, -1224603, -557272, -6306623, 8857296, 4711043, 3503620, 2341831, +8137890, -532576, -586263, 780073, -84289, 2073396, 925565, 220654, 2500745, -1317481, +-330176, -1731946, 566936, 837519, 2762201, -1729798, -287226, -559420, 2136209, -782221, +807991, 1456531, 1719061, -1265942, 4094715, 197569, -96637, -1287417, 1620276, -2335389, +933082, 322123, -622233, 1110249, 2019172, -169114, -3582540, -1018981, -475668, -7545184, +-358093, 430034, 5530844, -7934952, 535260, -1342177, -3111704, -16325708, -1822140, 7502234, +6043019, 7690676, 1042603, -8839043, 23117662, 9528922, 15764141, 1494112, -6710887, -2869575, +-2088428, -9892383, -483721, -3965329, 5028333, -109522, 635655, -3262028, -4043712, -8386461, +2907693, 678068, 532576, 4122095, -226023, 1672890, -697932, -7304666, -5442261, 4202626, +149250, 10306311, -13073344, 10427644, 6600828, -4792647, -9420474, -15036681, 3272228, 11629161, +-5900748, 11252277, -774705, -641561, 2734821, -3476239, -13110925, 1454383, 6370510, 2655901, +-5630166, -1637456, -3489661, 2792803, 6529424, -469225, 1751273, -1003949, 6288906, -2899640, +-1997697, 4080756, -3544422, 9586367, -2487860, -5058398, 3722663, -8935679, -4382478, -60130, +3588982, -3949223, 1741609, -1523103, 2042794, -69793, 2406256, 1864553, -684510, 1059783, +-4072703, 2126009, -472983, -5769215, -1864553, -1732482, -3300146, -136902, 1072131, -2771328, +-1799054, -260382, -3486977, 120259, 996432, -915365, -3699578, 199716, 20938, -2994129, +1251983, 1975148, -2250563, -287763, 750009, 90194, 1169842, 3200288, 2842732, -3000572, +-2234457, 3721052, 2508798, -17737142, 12673912, 11525545, 13497472, -4332012, -12140799, 4262755, +4802847, -18053896, -16489990, 15939161, 1683090, -7770670, 5968394, -11281268, -12897787, 1835025, +33378338, 15531139, 6144488, -9084393, 86436, -3241090, 198642, -3816079, -1925219, -4239670, +1137093, 9514426, 1819992, 11730629, -4719096, -3898220, 2078764, 8192650, -1639604, -1194001, +-17558364, -755914, -9921911, -539018, 13482976, 9658308, -3660923, 9438728, 18736794, -8975408, +5355824, 15568183, -11525545, 16454557, -1453846, 6758131, -3987877, 676457, -2309619, 2268280, +3733937, 16318728, -6347425, -2081985, 4162360, -7635378, 4716411, 2502355, -4472135, -7442105, +16004659, -1089311, -8929237, -2946348, 9888625, -4222490, 6681896, -69256, 392990, -10642392, +-11654931, -5586142, -9956271, -8938364, -9757629, -614180, -2400887, 4675609, -706522, 824634, +-981937, 5888937, 3663070, 399432, -7426536, 245887, -1475321, -5473399, -1662152, -2831457, +2755759, 1064078, -3831111, -1273995, -2964064, -2268280, -373662, 2014877, 1885491, 2059974, +3471407, -2235531, 340913, 2216203, -1674500, -2181844, 2516314, -3744675, -1577327, -1178432, +1541356, 668941, 2546379, 421444, 151398, 2150168, -1123671, -2604361, 21620328, 3959960, +2995740, -11220065, -6612102, 633508, 2428804, 4454418, 4962298, -21456582, 900333, 1418413, +15470472, 2545305, 3881577, -1420560, 14066018, -23051090, 636192, 11890617, -13839458, 3496640, +2623151, 11198053, 2115272, 1238024, -3861176, 408559, -11895986, 4052302, -3030100, 2141578, +3135326, -1977833, -9044664, 3326452, -7157026, -12268574, 6869800, -6919729, 4490389, -11535208, +-7381438, -1185948, -3674345, 2801393, -5004174, 12724914, -232465, 12133819, -12859669, -10764799, +-3551401, 208843, -300648, -3725347, 10800769, 8920647, 22622666, -3619584, 14437533, -8486855, +-1548873, 4402879, -17330730, 19696184, -619549, 12270185, -577136, -17157320, -10448582, 7248831, +-23084912, 11987254, 3207804, 17489106, 21927418, 2879239, -16427713, -12339978, -5192616, 12556337, +-1634772, -3029026, 588411, -4591320, 559956, -3360275, -5058398, -1706713, -8072928, -388695, +243203, -3693135, -3439195, -4509179, -3333968, -1549946, 1876901, 3825205, 1297617, -643708, +3369939, -2411087, -1468879, 803696, 1716913, 2221572, -2373506, 2812667, -3053185, -1387274, +-4395362, -7454990, 4454418, 771484, -4371740, -4283693, -966905, -5930813, 651761, 27380, +-2119030, 4322348, 11087458, 16983912, 5907191, -7101192, 16158741, -17376900, -1824824, -5381057, +2119030, 13770739, -12542378, 31110596, 4100620, 7651484, -9223442, -12652974, 4306242, 25770, +26439282, -3884261, -9225053, -15228343, -10260140, 7289097, 4677757, 4221416, -1973001, -15002321, +-23047868, 1620813, -13923747, 18327162, 2332704, 14860587, -9325448, 6147709, -6061810, 7642358, +21536040, -3707631, -2373506, -3386582, 5556077, 7064148, 3605625, 1457068, 2137820, 9252970, +8340290, -4995047, -7521562, -6814503, -7536057, 24578488, 9654013, -14644765, 11068131, -3446711, +-11977590, -8666170, 4248260, 8893267, -17032230, -22228066, 2339147, -10018011, 28858960, 14894410, +-5111548, -3465502, 6003291, 12901008, 3204583, -2394444, -4000225, -20190642, -1089311, -5083094, +-21881248, 8042863, 13521631, -2410551, 6688338, 3599720, 13785234, -7865159, -2235531, 4812511, +-2356863, -6502044, -7299297, -398358, -4486094, -10810433, -2379949, -5099200, 4414690, -2276333, +-6059662, 3837017, 1409823, 359167, -3843996, 3818763, 892279, -6889128, 2086817, 2406792, +-3339874, -9483825, -4789963, -1939178, -1242856, -367220, -3736622, -719407, -2843268, 1019518, +832687, -2080912, 154619, -411243, -3038689, -6002754, -1036698, 945430, 3041911, 1398012, +-4617090, -116501, 3068217, 1240709, 1174674, -4787815, 1394791, -2016487, -2319282, -2550137, +-2859375, 251256, -55835, -3093450, 1384590, -8476655, -13437879, 7614440, -4278861, 11682848, +5711233, -13160854, -5178120, -6776385, 3051038, -17642652, 12058658, 16238734, -6437082, 10042707, +-2226941, -4765266, 8289287, -12424804, 7863012, 13151727, 3967476, 22850300, 11494406, -9891310, +10153840, 3966402, 8958765, 180389, 12706124, 10573136, 16924318, 6049462, -6228240, -8019241, +-10018548, -1197759, 26097832, 336618, 11202885, -16464220, 34006476, -10217190, -26148298, -12707734, +21575232, 1474248, -2684355, -3128884, -1279900, 15657303, -11373610, 8980777, -2088428, 19771346, +30798674, 15503758, 14994805, -11052561, 17635672, 10286984, 10589242, 11597485, 17635672, -3813931, +-30023432, -19641422, -21735218, 5513665, 8123931, 6087580, -4828080, 10054518, 27039504, 1681480, +2360085, 6329171, -1217623, -23666344, -24966644, -8829379, 5301601, 2502355, -790811, -14627048, +3959423, 528281, 1478006, 7397008, -1385127, 4636954, 1940252, 9176198, -2066416, 6068789, +-4657892, 941672, 1272384, 10681584, 5277978, 10663330, 1513976, 5346161, -1647657, 1047435, +4939213, -3173444, -6762426, 1457068, -3912715, -8118025, -5974837, -1900523, -1426466, 10406706, +2507187, -191126, -2918967, 1490891, 351650, -3973382, -4029216, -3324842, 2690797, 6597607, +-558883, 469225, 1149441, 2877628, 2430415, 7043747, -6949794, 4421132, 11141145, 13085692, +4728222, 6146635, 10188199, -8028905, 23695334, 9350144, 4577899, -6760816, -18182208, -7331509, +9912785, -985695, -25766582, 34693672, -12187507, -6795712, 10684805, 527744, -3468186, 2516851, +-6741488, -8141648, -1785096, -18872624, 4660040, -20280836, 551903, -16077136, -18116708, -3628711, +-3863860, -3968013, -13258027, 5815386, 14165876, 3806415, 10842645, -18821620, 18547816, 33830920, +3484292, -13578539, 21114596, -17328582, -27481348, 45726368, -4711043, 3251827, -3205119, -20438138, +15749645, -18526878, 7997766, 27944130, -585189, 38378216, -29971356, 28914256, 8394514, -18976776, +-9980967, 3634079, -18278308, -9081171, 20293184, -19921132, 13201656, -13391171, 7308424, 21250962, +-46662136, -20532092, 21430814, -39996884, 14099841, 12427488, 22846004, 20262046, 9067750, -1604707, +13387950, 20101520, -21850646, 21810918, -457414, 7565585, -1202054, 6865505, 1711008, -4111358, +1445793, -6292127, -2136209, 1671816, -1190243, -10929618, 6841883, -1893544, 8929237, 5431523, +-7838316, 6182606, 7434052, 5507222, 2182380, 3959960, 2274722, 5034776, -15319075, 8608725, +-2081985, -4086662, 10732050, -8617315, -7163469, 3722663, -9099425, -7247758, -2958696, -6587943, +-8923868, 4964982, -13497472, -40039832, -10497974, 13196824, 30895310, -9804337, 15568720, 483184, +7320772, 16088947, 10321343, 27824408, -7243999, 1226750, 7569343, -24559696, -15884937, -7292855, +-8019241, 5701032, 359167, 2124398, -12884365, -2084133, -17038136, -13768055, 6578816, 34343096, +19677392, -8983461, -11041824, 16386374, 19529216, -11632919, 5109938, 15109158, -6031745, 32848446, +11105175, 4854387, -25376278, 15653008, 3149285, 12341052, -2659659, 3209951, -4239670, -5422396, +-39979168, 10613938, 27544162, 13670344, 3632469, -741956, 13859323, -22422414, -41531796, 3115462, +54919748, 13261785, 43555800, 41386304, 487479, 3639448, -26365194, -23529442, -2576981, -20180978, +27474368, -59989956, 11278047, -22457310, -47996796, 10678362, 22375706, 47951164, 4236449, 2422899, +-30601642, 10004053, 14366666, -21322902, -2055142, 1537598, 22332756, -5977521, -14347875, 33927020, +7116761, -12090870, -493921, -19597936, 2532420, -18548354, -3804804, -613643, -9132711, 2850248, +-7387344, -7761006, -4310000, -56908, -3758097, 6303402, 17521856, -966905, 157840, 6577206, +-15949898, -9585830, -1956358, 4843113, 4988605, -13821742, -7878044, 11032160, 6448357, 3863323, +2617783, 11652783, -472983, 237297, 1166084, -7805566, 1394254, 11148124, -5698348, -10584947, +29414620, 51126216, 1430761, 13908715, 9332964, -26996554, -7531762, 26765162, 8563091, 11755325, +-6633577, 7721815, 4678293, -9600326, 526670, 13849122, 14870787, 17920752, -7851737, -2299418, +-39681204, -37410776, 5252208, -23163832, 903017, 19931332, 4949950, 2294586, -6807523, -4549444, +12947179, 31241056, -22654342, -13158706, -2868501, -22214644, -1510218, -21414706, -6526740, -22729504, +20102058, -27524298, -2131915, 4844186, 13391171, 47869556, 64063732, 16468515, -16716550, -34219616, +-2910377, -23438174, -9060770, -36391256, 5532455, 34897684, 25919054, 20903606, 2629057, 4990752, +35961760, 34726420, 25693568, -2193655, 16256451, 5866389, 8086350, -41384696, 12557411, 4469987, +-9416179, 24793772, 33907692, -4800163, -466541, -16702591, -70427264, -1468879, 20969640, -10352482, +48935248, 34578780, -16013249, 3120831, -17864380, 12036646, 3482682, -6654515, -10644003, -5023501, +-884763, 7471096, 9554692, 14329085, 525060, -8816494, -18687402, 974421, -8748312, 7059316, +-8246337, -11592117, -2728378, -3100430, 8647380, 3441343, -3093450, 4354023, 2605435, 3427921, +979253, -6650220, -10245644, -5395016, 4071629, 8572755, -601832, 6964827, 69256, -10550587, +-10671920, 2879776, -13091597, -7606387, 202400, -5970005, -1443646, 3587372, 5621576, -5092758, +-8760660, -12652437, 32117228, 22590454, -15025943, 15244450, 23911694, 2504503, -29519310, -35640176, +33332704, 11114838, 7868380, 25924960, 785979, -11516955, 28208272, 7225209, -21029770, -10929081, +-7486128, 9304510, 807454, -12862890, 5138392, -14211510, -1191317, -6484327, -6621229, 18943490, +35785668, -12233141, 7607998, 16633335, -8094403, -7274601, 7111392, 20128902, 6719477, -15654619, +-19427748, -23786602, 12955769, 13240847, 32530082, -15392626, -14235669, 11237245, 19491636, 29994440, +-589484, -55823836, -11662447, 17884780, 18196166, 7984344, -10609643, -496069, -22009024, 3272765, +-9349607, 23094576, 33498060, -10114111, 1023276, -19523310, -20777442, -8207146, -42379516, -8659191, +-21392158, 18858128, -17054242, 19567334, 24675124, -49461380, -3797825, -20964272, 21492554, -8768713, +7800198, -15425912, 2852395, -13148506, 14926622, 16174310, 28385976, 26998702, 13769128, 25975426, +12452721, 1490891, 14148159, 8799851, -3501472, 11533598, -12483859, 6151467, -6185827, 5318780, +-15823196, 9564892, 494458, 7563975, -11529840, -6850473, 8185671, -3180960, -3569655, 13915157, +-10558640, -2588255, 11770358, 5531918, -7141994, -2463164, 5083094, 25732222, 14332306, 11184095, +15690589, 971200, 17025788, 5508296, 5563594, 8580808, 523986, 13808320, 4371203, -23925116, +-10611790, -6439230, -7676181, 2974265, -4665945, -11514270, -16417512, -26583700, -6292127, -14698452, +-27400280, -40860708, 19863150, 21465710, 12312061, -27240830, -37575060, -28481002, -16492674, 6924561, +-1455457, -36183488, -21942988, -24739012, 35083440, 11179263, 15161235, -10923712, -20310364, 44937168, +10852309, 14141180, -8778913, 2830384, 13014288, -8976482, 10300942, -3122441, 21136608, 30328912, +1123134, -24166170, -19736986, 24055574, 16172162, 21090974, 5854578, 5412196, -10975252, -4568235, +3275986, 14780056, 31408558, -110595, -59106804, -54470924, 619549, -13196287, 35198332, 36126044, +-40185324, -26892938, -16986058, 49964428, 44231720, -23902030, 6945499, -31348430, -30488900, 18635864, +-14097693, 335544, -4790499, -21713744, 15485505, 16173773, 12632573, 50592032, -37096708, -9808095, +-3540664, 13073344, 3995393, 20893942, -73938936, -42777876, 15350750, 23302346, 22782654, 6626061, +-24464670, -24789478, 352724, 14857902, 42601780, 10497437, -14273787, 4490925, -27698244, 17256642, +14865419, 973347, 23839752, 51328616, 12240120, -37507948, -19775104, -2581812, 4267050, 24816858, +21452824, 10262287, -11377905, -4554276, -7853348, -8832063, 22231824, -2578054, 1998770, -8836895, +21556978, -9989557, -4210142, -537945, 18700288, 8238821, 6620155, -3956739, -23638426, -8438537, +7610682, 18815714, 3192235, -26186416, -36371392, -30287036, -787590, 4379793, 5537824, 3620658, +-9974525, -7541963, 49510772, -32897302, 30923228, 30684320, 19726248, -71683008, -28685550, 23968602, +-19394998, 13857175, -5036386, -29787746, 19139448, 5711233, 5763309, -13179107, -47350940, -4519380, +-1360968, 158914, -6684580, -34581468, 25924422, -21377126, 44214004, -4678293, -3768297, 21474836, +16094853, -21116744, -1865626, -15989626, 23669564, 37119256, 28360742, -31344672, 7117835, -20981988, +18996104, -18227304, -7379291, 3080565, -1497870, 20167018, -18444738, -43514460, 11287174, -15575699, +16344498, 16945256, -54945516, -9359271, -10395968, 1992328, 61061552, -16452946, -44256416, -11805254, +38851200, 18584324, -23915988, -7902203, 24144158, -118648, 29783988, -44649408, -23460186, 26838714, +-27901718, -68066640, -19958176, -9295920, 77772192, -21206938, -39999568, 21325050, -46161236, 122080688, +11686606, -113466056, -30079266, -20056424, 80652504, 43567612, -50491636, -26745836, -525060, 59485296, +47591460, -7427609, -37176700, 14595909, -12483859, 53643068, -5054103, -26989038, -22176526, 35128536, +-27991912, 18186502, -53733800, -278636, -1911261, -3176128, -3008088, 11288248, -29672318, 28848222, +2558727, 21147346, 1020592, -34072512, -25972740, 19340238, 23105850, 35985920, 13623099, -3720516, +-23346906, 3089692, 6033356, -6259378, 1724966, 23567560, 3862249, -1169842, -26721140, 5125507, +19306414, 7009924, 981400, -7924215, -19158238, -21267068, -9867150, 6493454, -6277632, 9400610, +-8863202, -5409512, 3647501, 707596, 284542, -65521872, 18358838, -1025960, 22378390, 54216984, +17355962, 7482907, -30563524, -12655121, -30544196, -36544804, -12259447, 7208029, 20888036, 27675696, +-3111167, 16105054, 19474456, -16950626, -34417184, 18247168, 6538014, -27941984, -9515500, 26582626, +-9051107, -2954938, 24295556, 13644037, 10793790, 3403225, 13806709, -13208098, -31971736, -13880261, +9095130, -13077102, -7565585, 11726334, 773094, -22493280, 23454816, 5086852, -20861730, 2692945, +-5044439, 20216948, 11230266, -8128226, 9474161, -12425877, -28029494, 3778498, 6806987, -2521683, +54224, 5953899, -12251931, 3897146, -10492605, 6320045, 19977504, -2090575, 8725226, 9274445, +-7742216, 532039, -19090056, 6562173, 11240466, -34631932, 20113868, -21585432, 6805913, 1042066, +-113280, 9592273, 3855807, 22668300, 4116189, 6439767, -3283503, 11619497, -12179454, -7966091, +2789581, 1983738, -10659572, 3879966, -964757, -3050501, -6163278, 2242510, -1227287, 12294344, +-3153043, 1509681, 8754754, -6106907, 6078453, -3743064, 2123325, -6109054, -5386963, -6100464, +-1632088, -2715493, 4616553, 3357054, -14369887, -3872987, -4209605, 10048613, -5939403, 3791919, +1701344, -15935402, 5304822, 10435697, 665720, -3839701, 1714766, -4642323, -2385318, 3501472, +53103512, -1974611, -1726577, -14778446, -14455249, 10877005, -608812, 9408126, 195958, -5235565, +-6985228, 3544422, -9790915, 9900973, -9221832, 14448807, -11715597, 8394514, -9916543, -2271501, +-1590749, -9306657, -7061463, 2027761, -4169340, -2984466, -68719, -7018514, 920197, -1449552, +2214593, -1705639, 4051228, -14010183, 12690018, -4846334, -4168266, 9546102, -7732552, 437013, +-9656697, -8529268, 6137509, 5335960, -6791954, -4465692, 2716567, -525060, -11814381, 2930778, +2057826, -101469, 7729331, -2968896, -3349001, -3278671, -8078297, -2291365, 8430484, -9092983, +2292439, -4463545, -1131187, 469225, -2760053, 1873143, 22549, 5797132, -8618389, -856309, +5515812, -11206643, 6429566, -5114233, 40802, 4946729, -2493766, -5177046, 2250026, -1021665, +-1488743, -502511, -3650185, -220654, 3703873, -378494, -1806034, 519691, -3174518, 2024540, +1530619, 781147, -2576981, -900333, 3193845, -4296578, 4086662, -2047089, 1744831, 4454418, +-5604933, 1169305, 311922, -7153268, 1208496, -2390149, 2815351, -1156420, 142271, 4071629, +-2866354, 643708, -4576825, 600222, 573378, -1300838, -1165547, -721018, -1704565, 134218, +-904628, -3221, 3033858, -4752382, 1906966, -25081536, -41907068, 15437723, 134908688, 33542620, +74461312, -3099893, -72216656, -23687282, -71062920, -61036316, -21361020, -14854681, -4823249, 40169756, +54351200, 71464496, 90659784, 38878044, -23036594, -42120744, -88750128, -84697832, -34316788, -28434830, +-18692234, 36309652, 49912352, 29553670, 46285252, 55148452, 18859738, 14976551, 10475962, -28886876, +-13069049, -20744156, -44627932, -24908662, -33125472, -49488224, -26693758, 5906117, 5406827, 27330488, +66918812, 45488000, 38154880, 36848672, 11532524, 2540473, -3667902, -19423990, -27302034, -34915936, +-49502720, -44076564, -24404542, -7891466, -16632798, 13653164, 25862146, 21672942, 37857452, 41861972, +27134530, 24269786, 24041616, -3911105, -11590506, -6076305, -34097208, -28540058, -7118909, -28249074, +-29894046, -19194746, -26875220, -13300977, 7854422, 17096118, 31374200, 49896244, 31187906, 28610388, +31982474, 11615202, -3650722, -5971615, -16962436, -28450938, -29235306, -28164784, -30578020, -21518324, +-19514720, -16485695, -6593312, 7524783, 19127100, 29263760, 44532368, 46589120, 45706504, 38570952, +12400644, -10231149, -20601884, -33546378, -44077100, -50093816, -49730352, -39632884, -22121766, -5448703, +13857175, 40861780, 45739792, 45540612, 47982300, 39427264, 20939576, 6495601, -11060615, -32013076, +-44484052, -39504036, -36698884, -29142426, -13357348, 1131187, 11069741, 21948894, 25113748, 24494736, +19714974, 8796093, 4284230, 1563905, -3399467, -4204236, -3983045, -5583458, -6677064, -5368172, +-7371775, -5134097, -3984119, -2903398, -3385508, -1179505, -172872, 2091112, 2563559, 4687957, +5692979, 6900939, 5105106, 5247377, 3579855, 2268817, -804233, -1753957, -3803194, -4087198, +-5884105, -5468030, -5403606, -3854196, -3432753, -1069984, 374199, 2193655, 3015067, 5350456, +5149666, 5622112, 4379793, 3543885, 1340567, 1013612, -961536, -1573032, -4227322, -5602785, +-6182606, -4447439, -3918621, -1227824, 38655, 1388885, 1663226, 3213709, 3008625, 4273493, +3606699, 3796214, 2310156, 1578937, -874563, -1637456, -3441880, -3321620, -3776350, -2857227, +-3117073, -1535988, -957778, 1004486, 1697586, 3135863, 2666638, 3160559, 1772211, 1504849, +-61203, -348966, -1237488, -654983, -1475321, -850404, -1444183, -568009, -930397, 16106, +-350577, 532576, 37044, 731218, 77846, 665720, -14496, 563178, -163209, 400506, +-289910, 349503, -307090, 331786, -312996, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 3051038, -3178813, -2868501, -430034, 4394826, 1531693, -2373506, 547071, -2615098, -2204392, -1890859, --3933116, -1454383, 2503966, -261993, 1416266, -739808, -1068373, -1173600, -419833, 3295851, --2057826, 144418, -85899, 82141, 2733210, -153008, 1901060, 5783711, 4626754, 4521527, -2442763, 976568, -674847, -5471789, 2285460, -2082522, 3533684, 1166084, -1770063, 1568200, --2348810, -4751308, -1379221, -1875827, -4373351, 125091, -479963, -698469, -2014340, 218506, -4698158, 1990181, 3213709, -112743, 2001455, -1874753, -65498, 2359011, -1936493, 1559073, --2416456, -2704756, 333934, 5390184, 3658239, 2029909, -996432, 847719, 650151, 251792, --919123, -2158221, -3137474, -2386391, 137439, -2052458, -929324, -2204929, 774168, 262530, -1172526, -695785, 976031, 1224066, 1124208, 74088, 729608, -556735, -469225, -81604, --1268626, 1340567, 1218160, -199716, 1521492, 364535, 357019, -723165, -351114, -906238, -343597, 405874, 48318, -331249, 566936, -388695, -1173600, -416075, -764504, -116501, -306016, 238908, -1232656, 164819, 887448, 1994476, 1034550, -3459596, 8165807, -180926, -499827, -868657, -4301947, 3180960, -2240362, -2157147, -5013301, -3872987, -1619203, 3114388, -4491462, -909996, 2660732, -1034013, 4873178, 5044976, -10065793, 1843615, 57982, -988379, -3419868, 5361730, -1643362, -782221, 120259, -329639, -2547989, 2108829, -2568391, -2038499, --195421, 2688650, -1505923, -5665599, -2504503, -3850438, 466541, 345208, -5014911, -594853, --2179159, 1046898, -132607, -756451, 1254667, -1673427, 1725503, -2692945, 2665027, 3876745, -5967320, 2474438, -2577517, 2136209, 2517388, -929324, -6709813, 445066, 3529390, -2698850, -2046552, -3897146, -18790, -2484102, -6813429, -2076617, -3549791, 1741072, 2570538, -2299955, -1118839, -1076426, 3258270, 261993, 1921998, 2713883, -1120987, 1125818, 581431, 1151588, -2362769, -535797, 823023, 2920578, 1691143, 401579, 1775432, 320512, 790274, -112743, -537, -1572495, 884226, 1008244, 1362578, 910533, 340376, 433792, 86973, 511101, --162135, -434329, -76773, 1080184, 950262, 286152, 857383, 200253, 985695, 811749, -6718403, 1789391, -9036611, 3184718, 4697621, 1662689, -746787, 2328946, -5661841, 767189, -2570001, -1315871, 2487323, -426812, 3022046, 681289, -3806415, 2381559, 3562675, 3439732, --966905, 1624571, 1946157, 1283122, -10230075, 1407139, -4327180, -1329829, -1407139, 2365453, -1159641, -8420283, -2972117, -1912871, -1543504, 3377455, -3073586, -5900748, 1497870, 2689187, -1745904, -5869610, -2694555, 1841467, -5459441, -474057, -6037651, 866510, 3040300, -3148748, --895501, 3459059, 4493073, -10377178, -710280, -2899640, 3191698, 1261110, 572841, 873489, --2857227, 2615635, 2338610, -8059506, 6234682, -847182, 1579474, -4119948, -1655710, -3486440, --372052, 887985, -3157875, -4482872, 4027606, -1453846, 1696512, -234076, -745177, 1138703, -1409823, -1640141, -4069482, 2292976, 2150168, 523986, 1032940, -135828, 377420, 685047, -33286, 683974, 546535, -95026, 1656247, 226023, 1285269, 1449015, 150324, 2043331, -12885, 403190, 619012, 920197, 804233, 1022739, -1457068, 701690, -622770, 318364, -748935, 507343, 1272921, -399969, -289373, 914291, 1717987, -4269735, -4184909, -3311420, --2248416, 6873559, -2459406, 1014686, -5600101, 5934034, 302258, -3870303, -1131187, 3476239, --7144141, 2486249, -2170032, 1682017, 1052267, -3138547, -2379412, -8301098, -2345589, -9359807, -1138703, 2224256, -1099512, -1191853, -948651, 1522029, -3784403, -6643241, -3215857, -2383707, --1124208, 2570001, -1635846, 4108673, 1698660, 3171833, -4258997, -138513, -289910, -3395172, -887448, 2850785, -354872, -1643362, -4175782, -3687766, 2469069, 3913789, -204548, 7653095, -5909338, -5309117, -1457605, 115427, -5789079, -6430103, 9792525, -58519, 191663, 3199214, --6352794, -1960116, -4143033, 9853192, 2556043, 611496, -7841000, -6058588, 751082, -2434173, -4960687, -2478196, -132607, 1489280, -3123515, 1214402, 2964601, -4457639, -25233, -7173133, -719944, 2853469, -2179159, 1176821, 801011, 3685082, -586263, 688805, -779000, -22012, -1473174, 1705639, 1411971, -981937, 402116, 47782, 594853, 170188, 581968, -941672, -2228551, 143881, 588947, 472983, 656593, 666257, 595390, -485331, -664109, -389768, -439160, 1673427, 1750736, 455267, 758062, -1364726, -610422, -11350525, 5664525, 3270081, -5777268, -3077881, 3151969, 3374234, 5939403, 1459215, -11402064, 2885681, 459562, 4566087, -8223252, 481036, 3555159, 3187940, -6838125, 2440615, 602906, 992137, -1877975, -896574, -4199405, 2850785, 146029, -4114579, -75699, -1935957, -2181307, 6864969, 3123515, -231928, --935766, -8177618, -7084549, -8031589, 2129230, 2241973, -8404177, 651761, 546535, -8249022, -501974, 1341104, -1130650, 9606768, -1196685, -4632659, -1199907, 5543729, -472446, -8443906, -9224516, 4850629, -5898064, 4561256, 878858, 928250, -169114, 583042, -2299418, -4205847, --4057134, 7454453, -505196, -2090575, -357019, 5381594, -4935455, -8625368, 299574, 2050310, -1619203, -7529078, -3947075, 2998424, -693637, 4321811, 1610076, -1275605, -1278827, -1086090, --611496, 224412, 6746320, 4012573, 2435783, 2239289, 2604898, 4011500, -1882806, -547071, --2132988, -566936, 746251, 277562, -1180042, -1817308, 1984812, 388695, 895501, 54761, --1212255, 522912, 1051193, -2312303, -404264, 2014340, 420370, 206695, -876710, -170188, --566936, -946503, 265751, 1073205, 787590, -603443, 804233, 170188, 3456375, 13121125, -3940096, 10517301, -11575474, 416075, -5703717, 155156, 3873524, 4409858, -5938329, 2572686, --3431142, -3087545, -4122095, -6769406, -968515, -15902116, -131533, 5206574, -680215, -1114544, -1764158, -8360691, 2949569, -7975218, -2487860, 8141111, 1675037, 2785823, 212064, 2369748, -6991133, 6271726, 12167642, 6273337, -9171366, -804770, 10252624, -1472637, -7474317, -1178969, -965831, -3463354, 6874095, 5042292, -5876589, -1762547, 6592775, 6959458, -2477659, -4491462, -11112691, -4615479, -14944876, -10151692, 3311957, -15090904, -285078, -4547834, 88584, -1439888, --4191888, 5593658, 1626182, -1516124, -4904853, 4260071, -2932926, 7934952, 5465883, -2225330, --5276904, 1090922, 2100239, 697395, 312459, 1840930, -1088774, -5912560, -1686848, 8121783, --933082, -3368865, -870805, -1763084, -4209605, -4148402, -2262374, -2018098, 496606, -85899, -4103841, -405338, -1464047, 525597, 1474784, -1031866, 865436, -1457068, 2792803, -139050, -1719061, 205085, -2665564, -322123, -280247, -2862596, -748398, -1762547, 1290101, 31675, --423591, 913217, 443455, -334471, 511101, -3197603, 692564, 872415, -12783970, 6045704, --1086627, 3218541, 4296578, 6913287, 1601486, -6115497, 8329552, -3102040, 3732327, -3722126, -3117073, -578210, -15025943, -3136937, -2534031, -1788317, 1076426, -3634079, -2444373, 2000381, -3351685, 1126892, 8185134, 3742527, -7825968, -593242, 61203, -4445291, 9410273, -5614059, --5370857, 9848897, 10430328, -1302986, -77846, -6476811, 2375117, 1394791, -3329137, 1713692, -6475737, 3962644, 7778723, -1935420, -6032819, 3768297, 945430, 1847373, -7199439, -3762928, --4213363, 1695438, 4185446, 1505923, 1149978, 7421704, 8949638, 1318018, -4194573, 5058935, -4193499, -6293201, 915902, 1076426, -679679, 719944, -105227, 5305359, -543850, -4169340, -2156074, 6997576, 3154117, 4101694, 8725763, -5941014, 1094680, -2033130, 8281234, 4705674, -8866423, -4269735, -1095217, 1450088, -3104725, 440234, 903017, -1022202, 41339, 2026151, -2396055, -907849, 1323924, 895501, 3097208, 2680597, -331249, -251792, -1346472, 367757, --1357210, 707059, -2413772, 2397129, -10201, -964757, -6979, -231928, 126702, -889595, --1874753, 2666638, -308701, 417686, -2983392, -2500745, -637803, 2558190, -248034, -308164, -279173, -331786, 5341866, -11116986, -6671695, 4438849, -2615635, -10383620, 5277978, -5427765, --4759898, 6718403, -2044404, -2208687, -1673964, 1741609, 4956929, 2590402, 2662343, 2759517, --4146791, -2462090, -872415, 6053757, 3102040, -10612327, 3373160, 3324305, -4465156, 10006200, -9160092, 4946192, 345208, -3618510, -2362232, 549219, -3126736, -3724811, -6164352, 906775, --7037304, 5113696, 1950989, 75162, 1102733, 2704756, 2319819, 5473399, 8512088, -3216931, --13509283, -2340757, -9203041, 3181497, 1264868, -12210055, 4427038, -5118528, 15341623, 5107253, --9675488, -318901, 9758703, 5104032, -8012262, -4755603, 10209674, 5879274, -7100118, 8739185, --7286949, -9590125, 1480153, -14526653, 8769249, 9452149, -2171106, -8739185, -1575179, 3452617, -1774358, 1479079, 876710, 6778532, -9511742, 3073586, 10584410, 191126, 361314, -9314710, -4638028, 2619930, -8616778, -2135136, -4352413, -2046015, 335544, 2708514, 2152316, 319975, --2596845, 278636, -2782602, 1166084, 1649268, -338766, -1349157, -912144, 1691680, 554588, --550293, -1437203, -2779381, -299574, -2713883, 5420786, -5071820, 3221, -543850, 2090039, -1390496, -2899640, 882079, -885300, 4588099, -558346, 1291175, 156229, -2651069, 1100585, -548682, -312459, 2965138, -46708, -8703751, -6455873, 224412, -10485626, 49929, -24634858, --7730405, -2842195, -13434121, -4722854, -2796561, -5909875, -4538707, 3202435, -6462852, -12321724, -3302293, 7720204, -12553116, -3483755, 3901441, 6308233, 10875394, 6921877, 6417218, 7007239, -2561948, 12423193, -7366406, -3166465, 2659122, -6149857, 2368675, 3521873, 6534793, 856309, -10667088, 2236604, 2653216, 7347079, -3213709, -6293738, 144955, -9650255, -6141267, -11138461, --433255, -506269, -14616847, 5290326, -6603512, 3006477, -13802951, 1665374, -10437307, 15635828, -820876, -13917305, 16749836, 20484846, 5784784, -6849936, -5048734, 5326297, -1746978, -661962, -6085432, -9762461, 6407018, -10081899, 5383742, -4009889, -5652714, 2423972, 5407901, -2901787, --273804, 6320581, 1688996, -3093987, 3584150, -1540820, -5741835, 776852, 5434744, -1019518, --2096481, 2163590, 1606855, 4416837, 917512, 170188, 1932735, -1454920, 3104188, 796180, -2578054, 900333, 2056216, 1654099, 1684701, 1347546, -1843078, 2142115, -2492692, -2324651, -268972, 1415729, 495532, 723165, 1561221, 1033477, 157840, -791885, -1864016, 52613, --1961726, 5373541, -2612951, 4846871, 7318088, 988379, 6759742, -3856881, 10522133, -8200703, --7488276, -19982872, -4348118, -10400800, -24208584, 6011881, -13929653, -8585103, -11217918, 3017752, --21803402, 5768678, 1850057, -4283693, -424665, -6374269, -2161979, 5160403, -7394323, -5398237, -345208, 3913252, -6462852, -591095, 7533373, -12087649, -2724083, 6918119, -6611029, -493384, -113280, -1984812, 10194642, -8957691, 6074158, -4122632, 8300561, 8618926, -8810052, -11916924, -11118597, -1282585, 2459943, 2807835, 1043140, -2625836, 6281927, -3464965, -13635447, 3484292, -2834142, -11940009, -1277753, -4328790, 7171522, 8587787, 4340602, 1377074, -3366181, -8507256, -8664560, 5244155, 7754564, -614717, -12093554, -2923262, -1785096, -5383205, -2946885, -1498944, -3553012, 5325760, -4643397, -4067334, -12016245, -5807870, 2374580, 4896800, 1391569, -1101659, -5572183, 5130339, 3163780, 6317897, -1917703, 4939213, 2321967, 3355980, 626528, -28991, --3278134, -2610803, -562104, 1547262, -743029, -2895882, -3498251, -179315, -535797, 685584, --2363306, 512712, -2827699, 848793, 4860293, 1037772, -2706903, -2880313, 6172942, 3440806, --706522, -412317, -7693897, -916439, -38655, -6595459, 220654, -2695092, -1979443, 1527398, -2095407, 463320, -697395, -6038724, 29615410, 17015586, 1191853, -9438191, -22330072, -2783676, -10462540, -4956393, -8989367, -16837882, -926639, -3677029, 596464, -5812702, 5436892, -149250, -14666240, 5738077, -6103686, -490163, -2602750, 1051730, -3009698, 2970507, 9096741, -10698764, -2073932, -6470368, 4243965, -4626217, -7742753, -15220290, -1210107, 8618926, 2924336, -1954210, -3216931, -1183800, 8293045, 13034689, -4553739, -3044058, -15154255, -16506096, 4562329, 2380486, --6940667, -6074158, -13645111, -9448928, 5426691, -1831267, 39728, 636192, -1043140, 6183143, -3585761, -11304354, 485331, -10307385, -877247, -5587753, -3168075, 10825465, 22452478, 36903968, -1407676, 11832098, -11137924, -14263050, -19945292, -1109175, -53150, 3990025, 4245575, -2786897, --25216290, 10417980, -4273493, -3539590, 1603633, -6672232, 777926, -3653407, -10262824, 74088, --4097399, 41876, 1043677, 338766, 7317551, 1005022, 850940, -447213, 321586, -360240, -3154654, 6827388, 2056216, -297963, 1493038, 6185827, 192737, 25233, 2371359, -2119566, -798864, -5756867, 1976222, 2934000, -5335960, 5433134, 357556, 426276, -1560147, -6016713, --1893544, 2624225, 57982, -653909, -1457605, 3609920, -996969, 228170, 10808285, 18023830, --8914741, 36507, 3462281, -14695231, 135291, -9486509, -9197136, 13849122, -4075924, -3473018, --7442642, 15904801, 13973139, -1074, 22957674, 2586107, 7169374, 5055714, -6401649, -7495255, --11951283, -6291054, 2798171, 113817, 10287520, 803159, -1123671, -1872069, 7269232, -10506564, --25680684, -9001715, 7572564, 2376191, -2111513, -7649874, 454730, -12353937, -1858110, -11254962, --780073, -1408749, -7933342, 7603166, 3774203, 14441291, -11929809, 22370338, 6003291, -4351339, --7919383, -4064650, 3521873, 12905303, -3973919, 7384123, -11404749, 9215389, -10357314, -11651709, -11487964, -16665010, 10920491, 9178882, 17725866, -18050136, 13715441, -1711008, 12227235, 4778151, --18975702, -3317862, -4462471, 5291937, -10071698, 29869350, -1475858, -10542534, 4230006, 13805636, -9369471, 6467684, 7121056, -940598, 3388729, -1219771, -3966402, -2517388, 1044751, -130460, --3935801, 1129576, -1162326, -6056441, -1268089, -2311766, 2538863, 3197066, 1730335, -834297, -5886790, -955630, 3253438, 1307818, 4161823, 1570884, -2119030, -2622615, 703838, -311385, -2864743, -1163936, 263604, 2444373, -1491427, 4185446, -1990717, -2306398, 1154273, -1728724, -4354023, 1584306, -1295470, 2629594, 1289027, -12488691, -16746077, -34305516, -10530723, -20143396, -5616207, -916976, -6861211, -9975062, -9495099, -8581882, -9299678, -9110163, 957778, -7426536, --1336272, -16145319, -24774982, 30357902, -9457518, 16451335, -3142306, 4249870, 5243082, 8870181, -5850819, -1545651, -495532, -13103408, -2961917, -3115462, -8811125, -13741211, 5371394, -1547799, -19433116, -13450227, 360240, 26882200, -6475200, -22330072, -7201050, 890132, -10118943, 15731391, -7232188, -8632884, 6385006, 8454106, -5203353, -168041, 4252555, 10519986, -386547, -10351945, --10189273, 12590697, 9004399, -6607271, -14337138, 9160092, 10599442, -9447854, -12899397, 9052717, --16360067, 31329102, 6745246, -2551211, 1284732, 7669738, 1736777, -5506148, 515933, 2260227, -11257109, -7370701, 2261300, -22246320, -20037096, -2230699, 1206886, -2176475, -9719511, 7095286, -16565689, -449898, 4254702, -1541356, 3550327, 5020280, 5985574, -6384469, 7194607, -3301219, --1894618, 4775467, 8855686, -2590939, -8856759, 2550137, -802085, 1502702, -790274, -4735202, --1304060, -4893579, -3029026, -6044630, 6270653, 6426345, -3816079, 20938, 7713762, 2470680, --3233037, 1643362, 9660992, 6370510, 6976101, 7038378, 6217502, 2337536, 8863739, 4701916, -3714610, 3322157, 8345659, -12987444, 115964, 4706748, 3766686, -8523899, 20491826, 14322642, -29458644, 16161962, 11044508, 4205847, -25549686, -2153926, 3628711, -15164993, -3892314, 29000692, -2373506, -16864190, -16451872, 15015206, -22719840, -5960341, 1170916, 6107444, 2800856, -4380330, -7607461, -10343355, 167504, -2099165, -6317360, -1438814, -4332549, -14941117, 8076149, -12945568, -7803956, 6775311, 9056475, 1612760, 6081674, -5400385, 24382530, 3256122, -25416006, -22535694, -2311766, 10143102, 19881940, -6450504, -15153181, -6802155, -1778653, 2245194, 11799349, 2542084, --8819178, 26603028, -32285270, -5381594, 6456947, -22613002, -11438572, -5912560, 3653407, -36658084, --17074106, 26350162, -9648107, 7741142, -8221641, -29574072, -10889890, 14349486, -4042638, 5641977, -9423158, 18833968, -8588861, 2158221, -5252745, 11837467, 5676873, 5159330, 1107028, -355945, -668941, 10344429, 5612449, 6174553, -1217086, -98247, 4159139, -6717866, -5904507, 2878702, -12222403, 5711770, 4988068, -11396696, 7198365, 21809308, 290447, -56371, -7903814, 6049462, -1370632, -4839892, -6330782, 1111860, 6828461, 7727720, 5857262, -6476811, 4929549, -4262755, -5544266, -8390219, -4317516, -1496259, -4104915, -5358509, -1265942, -13783087, -12893492, 2469069, --502511, -1920924, 5220533, 132070, -821413, 433255, 5661304, 4986994, 2007897, 75699, -2788508, 3191161, 2444373, 3829500, -973884, 5212480, 14566918, -6051072, -47710644, -11932493, -2303713, 13532905, 12593381, 12041478, 11480984, 21609592, 38002408, -21669184, 15709380, -5261872, --1058173, -5339181, -31868120, -23235236, -4849018, -1108638, 6392522, 12671227, 15789910, -4759898, --910533, -7992398, -307090, -1156420, -537408, 17009144, 8541616, 5905580, 12441447, 15526844, --26999776, 13551159, -15850040, -19277424, -6187974, 13038447, 3266323, -12895639, 3997541, 1979443, -9104257, -529355, -26252450, -18153754, -21837762, -20970178, 2407866, 18074832, -3705483, 64472828, --42294692, -31180926, 18894098, -5240397, -13260712, -3919695, -3920232, 1118839, -39659728, 4562866, --3306588, 5821828, 29571386, -1663226, 10053445, 12036646, 13864154, 49753976, -18761490, 62801012, -16886738, -1234803, 7747048, 4044786, -26075820, -22229676, -874563, -5091684, 2736431, 10117332, -7196218, -3951370, -22427782, -17613660, 6781217, -11719355, 7488276, 9185324, 18992346, 19379966, -16850768, 3867618, 5584531, 243739, -1300301, 13266080, -2552821, -608812, 3643743, -17947058, --4831838, 8319352, -446677, -1338419, 11335492, 4990752, -17626008, 12403329, -10046465, -12869333, --7917772, -3598646, 2907156, 6154688, 5425618, -6587943, 8032663, 4151086, 5018670, 2973728, -6743636, -2352568, 3913789, -10511932, -2739116, -5480379, 1969243, 4513474, -28000502, 10099616, -45172856, 1161252, 47141024, 24688546, -2729989, -18278844, 53160956, 7851737, -8812736, 6759205, --11965242, -3655554, -1700807, -3348464, 6812355, 14722074, 10428181, 1879048, 6923488, -10719165, --10182294, 3156264, -3024194, 17383880, 19030464, 11989938, -4742181, 1153199, -22871774, -14462765, --4148939, -15807627, -24745990, -14829448, 11971684, -14457397, -43736188, -20288888, 13524315, -17718888, --12378633, 639413, -3097745, 20656646, 30472792, 39903468, -20987358, 11375758, -169114, 1357747, --8445516, -26316338, -52490944, -34585760, 18408766, -35037808, -18270254, 9665824, 17991618, -12910672, -20276004, 57814556, 12311524, 11298448, -43454332, -58369144, -12494597, -18074832, -31030602, -8766028, --25887378, 18770618, 10792179, 52479132, 21772262, -5883569, -10368588, -17986786, 12591770, 23968602, -47620448, 33354716, -22574884, -47667156, -23141820, -15051176, -28086938, -5051956, 24408836, 11824045, -30136712, 1534914, 21509196, 8723615, -6634114, -8674760, -9980430, 6053757, 13269301, 3520263, -17181480, 21361020, 13033078, 15326054, 7222525, 23067732, 20309290, 1151051, -107374, 10311680, -22897544, -1873143, -5716602, -3031710, 19591494, 6282464, 1254131, -5352603, 12386686, 9632001, --2608656, 8072928, 9889699, 5139465, -1728724, 2525441, 7191923, 1284732, -374736, -10878615, -23513336, 48384416, -26116622, 36764384, 28444494, -4330401, -8177618, -15928423, 4215511, 32801202, -23302882, 38398620, -17343614, -7206955, -8571144, -2063195, -11056320, 10242423, -13400298, 28217936, -11028402, -45676440, -20688858, 627065, 6027450, 20052128, -10358924, -17156246, 4263829, 5625871, --8284455, -8377871, 4247186, -12860743, -20928302, -8890045, 42348376, 18106508, 6392522, -21783538, --8045548, -18464602, 9939628, 21154862, 6106370, 1550483, 11435887, -7206955, 26648124, 15829639, -665720, 9314173, -1993402, 54861764, 10322417, -23171348, 7916699, 9585830, 4458176, 12511777, --275952, -22127672, 25370908, 5922760, 3517041, 10451266, 3791383, 62277, -17366164, 18954764, -20463908, 11205033, 60641716, 43933220, -24701430, -47524888, -34357592, -3201361, 3105798, -4798552, --41525356, -20019380, -15404974, -16606491, -17653390, 15101105, 10739029, -4205847, 1461900, -3585761, --23737748, 6581501, -5236102, -1209570, -24308978, -22334904, -5082557, 9515500, 10043781, 1394254, -10772852, 5082020, 13863081, 2173254, 1912334, -25370908, -16154446, 10798622, 1868311, -7039989, -12224014, 5626407, 1287417, -12236899, 10722386, 16186121, 10321343, 11730093, 13780939, -3338800, -15381352, 32955820, 24932822, 5809480, 2500745, -4306242, -6874632, -17066590, -22584012, 5521718, --8447127, -537945, 1131187, -1773822, -6098854, -3007014, -8282308, -56507812, -6669548, 13226352, -16296180, -13495324, 20214800, 5330592, -7386270, -21660594, 5182952, -5886253, -30549028, -10743861, --10503879, 1432909, -42267312, -34360276, -5185100, 20155744, -2303176, -7384123, -25360708, -391916, -22701586, 138513, -14851997, -9791989, -2783139, -9623411, 6040872, 6439767, -21384106, -25368224, -4351339, -1767379, 5807333, 39404716, -24117316, -3478387, -1009854, -40218612, -11303280, -29669634, --3961571, -3323231, 28372018, 30452392, 38933880, 10108206, 7054484, -15454903, -33043868, 481573, -14206678, -12525198, 47704200, 109369728, 106433584, 14601815, -67194760, -63053880, -23835994, -39957692, -130440840, 79513264, 51035484, 64786896, -485868, -35603668, -91963304, -60108604, -22393960, -5757941, -37867652, 74628816, 67759552, -8768713, -54933168, -34412888, -49687404, -40308268, 7617662, 53860500, -80249320, 30114700, -3718368, 3715147, -29950418, -36881420, -35334696, 11844983, 6228777, 8681740, -32613298, 16402480, -2624225, -21176336, -17140678, -12378633, -27453430, -6238440, 13059385, -11085847, -1387274, -4451734, 20159502, 14089640, -25433186, -16814796, -52072720, -43009264, -37019932, 23604066, -43419436, 15726023, 11795054, -16002511, -26593364, -83255792, -60437708, -37234144, 7901129, 22505628, -15557445, 2966212, -29560112, -25854630, -47259672, -80293880, -30499100, 8877161, 24329916, 40490804, -19937776, -402116, -21438330, -8649527, -13824963, 580357, 30331060, -29701310, 34021508, 5187247, -4750771, -53274776, -15759846, 44768056, -29563334, 11606075, 1184337, -11398306, 15284715, 4235375, -25607668, 37629820, -21502216, -31319438, 9114994, -19464792, 25403658, -32678258, -15462956, -21034602, -3543885, -6428493, -17157320, 7310035, 38056096, -29918206, -30762166, -24652038, -6182606, -7956964, -50694036, 1975148, -202400, -49718004, -11264089, 3499862, 42815456, 16955458, -6055367, -71229888, --48875656, 46486040, 53251152, 49058192, -21610128, -118124488, -21605296, 51280836, 45289892, 5395016, --12019466, 6108517, -45676440, -29492466, 17540110, -15276125, 16041703, -10050760, 3574487, 48091824, --35149476, -20815560, 42736536, 30862562, 63643900, 24783572, -80986976, 24381992, 91071024, 17687212, -46989088, 9865003, -23313082, -2295123, 58636504, 37513856, 77306728, -100787312, 15403363, -2249489, --9389335, 37713572, 2371896, -53191560, 6266358, -3894999, -8895951, 5958731, 1482301, -33224794, -29317984, -14723148, 950262, -301185, -5753109, -342524, 5890011, -10501732, -9714679, -18964428, --23472534, 23034984, 537945, 7329362, 22932442, -25945360, 13296682, -2748242, -42030012, -1692754, -15444166, 45407468, -10680510, -67647344, -5948530, 29444148, 10231686, 25780004, -19894288, -20286204, --22069152, 9056475, -2352568, 14934675, -23378580, 10574209, 8338679, 5568962, -26137024, 841814, -7994545, 17801566, -5888937, 2112587, -14991583, 4180077, -8034273, 14867029, -864899, 11423002, --2007360, 3389266, -16766479, 521302, 81068, 17936320, -8945343, 5769215, -18122078, 978179, --449898, 14801531, -3222836, 5930276, -58283780, 6589017, 10420664, 5558762, 57459684, 9682467, --4315369, -36682240, -6273874, -3606699, -8597451, -363462, -6944962, 14704357, 6860137, -10812580, --1854352, 22820234, 70330, -1282048, 2423972, -5710696, -9794136, 12806519, 11321534, 8595303, --14266271, 7502234, 21348134, 8374113, -1225139, 13772350, -2505577, -16336982, 4322348, 4144107, --13159780, -14302241, 14252312, 13879724, -13697188, 8782671, 8478802, -117038, -4988068, 106300, -10836739, -594316, -12098923, 6302865, 7384123, -22471806, 5750425, 16626892, 5439576, -14607721, -2279017, 10322954, -18931142, 5151277, 8875013, 3754338, -4922570, -18043694, 21252036, -22992570, --2029372, 22145388, 361851, -3806952, 490163, -20792474, 9210020, -295279, 11885248, 22024592, --9959492, -1571958, -12721156, 16848620, -3526168, -1868311, 17262548, -22526566, -9910637, 12528956, -10212895, 4495757, -18326626, 6351720, -4027069, -1135482, 8790187, 6698002, 1259499, -4649302, --2346126, 868657, 4974109, -15981573, 11658152, 2397666, -2223183, 4536559, -2097018, 10142565, --15050639, -2706366, 311385, 907849, 1502702, 6988986, 4612795, -25538950, 13518946, -2706366, --2971044, -1038845, 5202816, 7016366, -6333466, -2530273, 11894912, -10147397, -1304596, -7755101, -5657009, 53880900, 4692789, -6545530, -18042084, -11944841, 6274411, -8003672, 6908455, -10691784, --891743, 8551817, -4868346, 4028143, 3886946, -14914811, 4077535, -4877472, -3299072, -12293807, -3421478, -3477313, -7812546, -3613141, 5890548, -5367636, -5375152, 7592429, -8492761, 4267587, -7157563, -14960982, 14680735, -3738769, -17662516, 9329743, 9219684, -8215736, 2782065, 5312875, --7506529, -6671695, -30602, 977105, 4715874, -2437394, -985695, -7422241, 6707665, -5820755, --1960653, 8497593, -10381473, 2943663, -1960116, 537, -4941897, -6669011, -2804077, 11552925, --8022999, -3050501, 1767916, 2426657, 226560, -7057705, 5236102, -3185792, -6171868, -214212, --11223823, 16199006, -7291781, 3245922, 3467649, -3388729, 5512591, -9710921, -8002598, 9837623, --4982699, -6755447, 6498286, -497679, 1719598, -4524748, 1048509, -1047435, 2896956, -3624953, --2923262, 3686693, -2313377, -2662343, -837519, 2300492, -1682017, -285078, -1394254, 560493, -2109903, -3238405, -3337190, 9229885, -2887829, -3404835, 2763812, -1144072, 2557116, -7543037, -348966, -1321776, -383863, -2059974, 8568460, 32212, -7832947, 2430952, 689879, -416075, --95026, 3307662, -2353642, -2296197, -1138703, -2080912, -1166084, 871878, -2570538, -149250, -550830, -426276, -26924614, -43533252, 19808390, 150964880, 22950158, 75496400, -17844516, -76489072, --28005334, -74539160, -49331456, -15467251, -8367133, 3696356, 44215076, 53475564, 73899208, 73679624, -23216446, -28929290, -47203840, -86189256, -66285304, -34646964, -13700946, -8682813, 26505316, 44884556, -34419868, 47284904, 45532560, 16986058, 14657650, 5738077, -33583960, -12269648, -28896540, -49605800, --30228516, -28915868, -43283068, -9030706, 20010252, 15474767, 43853764, 57821536, 29873646, 38567732, -28762322, -3905736, -1402844, -2551211, -31161062, -38048040, -34211024, -51158968, -43852688, -15299747, --2707977, 6361921, 35465692, 32928978, 31448824, 39946416, 29573534, 10370735, 18640158, 10455024, --11716134, -5360656, -21543020, -44891000, -27226872, -25402048, -35612796, -16935592, -11501386, -19787452, -16739098, 32068910, 36714456, 58931784, 55248312, 23538568, 13623099, -607201, -20195474, -23659902, --24696598, -35616552, -32888712, -29924648, -27705760, -17071422, -6964827, 114890, 13319230, 31664646, -39142184, 36679020, 43939664, 30680026, 14680735, 6418292, -5219459, -22428856, -25631828, -35418984, --46540804, -46643344, -37297496, -30897994, -4825933, 18759344, 41471668, 55892020, 60211684, 46755552, -30258044, 13627931, -3714610, -23162758, -34282964, -46044196, -45962056, -32665910, -21626770, -6379637, -8260833, 16751446, 21894670, 27651536, 23643258, 14987825, 12470974, 4644471, -334471, -4184372, --5699422, -7177427, -7224672, -10187662, -8482024, -6447283, -5515812, -5310727, -3599183, -3301756, --688269, 1966558, 5734318, 7007776, 9283572, 9989557, 10385768, 6591164, 3959960, 852014, --1174137, -5822902, -8022462, -10578504, -10247255, -8760660, -5264020, -3508452, -652835, 1043140, -5143760, 7254200, 9100499, 7361574, 7191386, 4971962, 3288334, 725313, -238371, -3233037, --4668093, -6922951, -7361574, -7902203, -5450314, -3702262, -180926, 1221918, 3981972, 5010616, -6284074, 4776541, 5083094, 3544422, 2928631, 493384, -738198, -2879239, -3099893, -4439386, --3847754, -4268661, -3074660, -2729989, -552440, 130997, 2287607, 2762201, 4207458, 3472481, -3717831, 1727651, 1124745, -486405, -272730, -1509144, -1328219, -2576444, -2024540, -2629594, --1525250, -1627256, 6442, 179852, 1654636, 1283658, 1989107, 1042603, 1538135, 414464, -799938, -340376, 139586, -752156, -92342, -883690, -73014, -737124, 133144, -539018, -293668, -394063, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +3178813, -2868501, -430034, 4394826, 1531693, -2373506, 547071, -2615098, -2204392, -1890859, +-3933116, -1454383, 2503966, -261993, 1416266, -739808, -1068373, -1173600, -419833, 3295851, +-2057826, 144418, -85899, 82141, 2733210, -153008, 1901060, 5783711, 4626754, 4521527, +2442763, 976568, -674847, -5471789, 2285460, -2082522, 3533684, 1166084, -1770063, 1568200, +-2348810, -4751308, -1379221, -1875827, -4373351, 125091, -479963, -698469, -2014340, 218506, +4698158, 1990181, 3213709, -112743, 2001455, -1874753, -65498, 2359011, -1936493, 1559073, +-2416456, -2704756, 333934, 5390184, 3658239, 2029909, -996432, 847719, 650151, 251792, +-919123, -2158221, -3137474, -2386391, 137439, -2052458, -929324, -2204929, 774168, 262530, +1172526, -695785, 976031, 1224066, 1124208, 74088, 729608, -556735, -469225, -81604, +-1268626, 1340567, 1218160, -199716, 1521492, 364535, 357019, -723165, -351114, -906238, +343597, 405874, 48318, -331249, 566936, -388695, -1173600, -416075, -764504, -116501, +306016, 238908, -1232656, 164819, 887448, 1994476, 1034550, -3459596, 8165807, -180926, +499827, -868657, -4301947, 3180960, -2240362, -2157147, -5013301, -3872987, -1619203, 3114388, +4491462, -909996, 2660732, -1034013, 4873178, 5044976, -10065793, 1843615, 57982, -988379, +3419868, 5361730, -1643362, -782221, 120259, -329639, -2547989, 2108829, -2568391, -2038499, +-195421, 2688650, -1505923, -5665599, -2504503, -3850438, 466541, 345208, -5014911, -594853, +-2179159, 1046898, -132607, -756451, 1254667, -1673427, 1725503, -2692945, 2665027, 3876745, +5967320, 2474438, -2577517, 2136209, 2517388, -929324, -6709813, 445066, 3529390, -2698850, +2046552, -3897146, -18790, -2484102, -6813429, -2076617, -3549791, 1741072, 2570538, -2299955, +1118839, -1076426, 3258270, 261993, 1921998, 2713883, -1120987, 1125818, 581431, 1151588, +2362769, -535797, 823023, 2920578, 1691143, 401579, 1775432, 320512, 790274, -112743, +537, -1572495, 884226, 1008244, 1362578, 910533, 340376, 433792, 86973, 511101, +-162135, -434329, -76773, 1080184, 950262, 286152, 857383, 200253, 985695, 811749, +6718403, 1789391, -9036611, 3184718, 4697621, 1662689, -746787, 2328946, -5661841, 767189, +2570001, -1315871, 2487323, -426812, 3022046, 681289, -3806415, 2381559, 3562675, 3439732, +-966905, 1624571, 1946157, 1283122, -10230075, 1407139, -4327180, -1329829, -1407139, 2365453, +1159641, -8420283, -2972117, -1912871, -1543504, 3377455, -3073586, -5900748, 1497870, 2689187, +1745904, -5869610, -2694555, 1841467, -5459441, -474057, -6037651, 866510, 3040300, -3148748, +-895501, 3459059, 4493073, -10377178, -710280, -2899640, 3191698, 1261110, 572841, 873489, +-2857227, 2615635, 2338610, -8059506, 6234682, -847182, 1579474, -4119948, -1655710, -3486440, +-372052, 887985, -3157875, -4482872, 4027606, -1453846, 1696512, -234076, -745177, 1138703, +1409823, -1640141, -4069482, 2292976, 2150168, 523986, 1032940, -135828, 377420, 685047, +33286, 683974, 546535, -95026, 1656247, 226023, 1285269, 1449015, 150324, 2043331, +12885, 403190, 619012, 920197, 804233, 1022739, -1457068, 701690, -622770, 318364, +748935, 507343, 1272921, -399969, -289373, 914291, 1717987, -4269735, -4184909, -3311420, +-2248416, 6873559, -2459406, 1014686, -5600101, 5934034, 302258, -3870303, -1131187, 3476239, +-7144141, 2486249, -2170032, 1682017, 1052267, -3138547, -2379412, -8301098, -2345589, -9359807, +1138703, 2224256, -1099512, -1191853, -948651, 1522029, -3784403, -6643241, -3215857, -2383707, +-1124208, 2570001, -1635846, 4108673, 1698660, 3171833, -4258997, -138513, -289910, -3395172, +887448, 2850785, -354872, -1643362, -4175782, -3687766, 2469069, 3913789, -204548, 7653095, +5909338, -5309117, -1457605, 115427, -5789079, -6430103, 9792525, -58519, 191663, 3199214, +-6352794, -1960116, -4143033, 9853192, 2556043, 611496, -7841000, -6058588, 751082, -2434173, +4960687, -2478196, -132607, 1489280, -3123515, 1214402, 2964601, -4457639, -25233, -7173133, +719944, 2853469, -2179159, 1176821, 801011, 3685082, -586263, 688805, -779000, -22012, +1473174, 1705639, 1411971, -981937, 402116, 47782, 594853, 170188, 581968, -941672, +2228551, 143881, 588947, 472983, 656593, 666257, 595390, -485331, -664109, -389768, +439160, 1673427, 1750736, 455267, 758062, -1364726, -610422, -11350525, 5664525, 3270081, +5777268, -3077881, 3151969, 3374234, 5939403, 1459215, -11402064, 2885681, 459562, 4566087, +8223252, 481036, 3555159, 3187940, -6838125, 2440615, 602906, 992137, -1877975, -896574, +4199405, 2850785, 146029, -4114579, -75699, -1935957, -2181307, 6864969, 3123515, -231928, +-935766, -8177618, -7084549, -8031589, 2129230, 2241973, -8404177, 651761, 546535, -8249022, +501974, 1341104, -1130650, 9606768, -1196685, -4632659, -1199907, 5543729, -472446, -8443906, +9224516, 4850629, -5898064, 4561256, 878858, 928250, -169114, 583042, -2299418, -4205847, +-4057134, 7454453, -505196, -2090575, -357019, 5381594, -4935455, -8625368, 299574, 2050310, +1619203, -7529078, -3947075, 2998424, -693637, 4321811, 1610076, -1275605, -1278827, -1086090, +-611496, 224412, 6746320, 4012573, 2435783, 2239289, 2604898, 4011500, -1882806, -547071, +-2132988, -566936, 746251, 277562, -1180042, -1817308, 1984812, 388695, 895501, 54761, +-1212255, 522912, 1051193, -2312303, -404264, 2014340, 420370, 206695, -876710, -170188, +-566936, -946503, 265751, 1073205, 787590, -603443, 804233, 170188, 3456375, 13121125, +3940096, 10517301, -11575474, 416075, -5703717, 155156, 3873524, 4409858, -5938329, 2572686, +-3431142, -3087545, -4122095, -6769406, -968515, -15902116, -131533, 5206574, -680215, -1114544, +1764158, -8360691, 2949569, -7975218, -2487860, 8141111, 1675037, 2785823, 212064, 2369748, +6991133, 6271726, 12167642, 6273337, -9171366, -804770, 10252624, -1472637, -7474317, -1178969, +965831, -3463354, 6874095, 5042292, -5876589, -1762547, 6592775, 6959458, -2477659, -4491462, +11112691, -4615479, -14944876, -10151692, 3311957, -15090904, -285078, -4547834, 88584, -1439888, +-4191888, 5593658, 1626182, -1516124, -4904853, 4260071, -2932926, 7934952, 5465883, -2225330, +-5276904, 1090922, 2100239, 697395, 312459, 1840930, -1088774, -5912560, -1686848, 8121783, +-933082, -3368865, -870805, -1763084, -4209605, -4148402, -2262374, -2018098, 496606, -85899, +4103841, -405338, -1464047, 525597, 1474784, -1031866, 865436, -1457068, 2792803, -139050, +1719061, 205085, -2665564, -322123, -280247, -2862596, -748398, -1762547, 1290101, 31675, +-423591, 913217, 443455, -334471, 511101, -3197603, 692564, 872415, -12783970, 6045704, +-1086627, 3218541, 4296578, 6913287, 1601486, -6115497, 8329552, -3102040, 3732327, -3722126, +3117073, -578210, -15025943, -3136937, -2534031, -1788317, 1076426, -3634079, -2444373, 2000381, +3351685, 1126892, 8185134, 3742527, -7825968, -593242, 61203, -4445291, 9410273, -5614059, +-5370857, 9848897, 10430328, -1302986, -77846, -6476811, 2375117, 1394791, -3329137, 1713692, +6475737, 3962644, 7778723, -1935420, -6032819, 3768297, 945430, 1847373, -7199439, -3762928, +-4213363, 1695438, 4185446, 1505923, 1149978, 7421704, 8949638, 1318018, -4194573, 5058935, +4193499, -6293201, 915902, 1076426, -679679, 719944, -105227, 5305359, -543850, -4169340, +2156074, 6997576, 3154117, 4101694, 8725763, -5941014, 1094680, -2033130, 8281234, 4705674, +8866423, -4269735, -1095217, 1450088, -3104725, 440234, 903017, -1022202, 41339, 2026151, +2396055, -907849, 1323924, 895501, 3097208, 2680597, -331249, -251792, -1346472, 367757, +-1357210, 707059, -2413772, 2397129, -10201, -964757, -6979, -231928, 126702, -889595, +-1874753, 2666638, -308701, 417686, -2983392, -2500745, -637803, 2558190, -248034, -308164, +279173, -331786, 5341866, -11116986, -6671695, 4438849, -2615635, -10383620, 5277978, -5427765, +-4759898, 6718403, -2044404, -2208687, -1673964, 1741609, 4956929, 2590402, 2662343, 2759517, +-4146791, -2462090, -872415, 6053757, 3102040, -10612327, 3373160, 3324305, -4465156, 10006200, +9160092, 4946192, 345208, -3618510, -2362232, 549219, -3126736, -3724811, -6164352, 906775, +-7037304, 5113696, 1950989, 75162, 1102733, 2704756, 2319819, 5473399, 8512088, -3216931, +-13509283, -2340757, -9203041, 3181497, 1264868, -12210055, 4427038, -5118528, 15341623, 5107253, +-9675488, -318901, 9758703, 5104032, -8012262, -4755603, 10209674, 5879274, -7100118, 8739185, +-7286949, -9590125, 1480153, -14526653, 8769249, 9452149, -2171106, -8739185, -1575179, 3452617, +1774358, 1479079, 876710, 6778532, -9511742, 3073586, 10584410, 191126, 361314, -9314710, +4638028, 2619930, -8616778, -2135136, -4352413, -2046015, 335544, 2708514, 2152316, 319975, +-2596845, 278636, -2782602, 1166084, 1649268, -338766, -1349157, -912144, 1691680, 554588, +-550293, -1437203, -2779381, -299574, -2713883, 5420786, -5071820, 3221, -543850, 2090039, +1390496, -2899640, 882079, -885300, 4588099, -558346, 1291175, 156229, -2651069, 1100585, +548682, -312459, 2965138, -46708, -8703751, -6455873, 224412, -10485626, 49929, -24634858, +-7730405, -2842195, -13434121, -4722854, -2796561, -5909875, -4538707, 3202435, -6462852, -12321724, +3302293, 7720204, -12553116, -3483755, 3901441, 6308233, 10875394, 6921877, 6417218, 7007239, +2561948, 12423193, -7366406, -3166465, 2659122, -6149857, 2368675, 3521873, 6534793, 856309, +10667088, 2236604, 2653216, 7347079, -3213709, -6293738, 144955, -9650255, -6141267, -11138461, +-433255, -506269, -14616847, 5290326, -6603512, 3006477, -13802951, 1665374, -10437307, 15635828, +820876, -13917305, 16749836, 20484846, 5784784, -6849936, -5048734, 5326297, -1746978, -661962, +6085432, -9762461, 6407018, -10081899, 5383742, -4009889, -5652714, 2423972, 5407901, -2901787, +-273804, 6320581, 1688996, -3093987, 3584150, -1540820, -5741835, 776852, 5434744, -1019518, +-2096481, 2163590, 1606855, 4416837, 917512, 170188, 1932735, -1454920, 3104188, 796180, +2578054, 900333, 2056216, 1654099, 1684701, 1347546, -1843078, 2142115, -2492692, -2324651, +268972, 1415729, 495532, 723165, 1561221, 1033477, 157840, -791885, -1864016, 52613, +-1961726, 5373541, -2612951, 4846871, 7318088, 988379, 6759742, -3856881, 10522133, -8200703, +-7488276, -19982872, -4348118, -10400800, -24208584, 6011881, -13929653, -8585103, -11217918, 3017752, +-21803402, 5768678, 1850057, -4283693, -424665, -6374269, -2161979, 5160403, -7394323, -5398237, +345208, 3913252, -6462852, -591095, 7533373, -12087649, -2724083, 6918119, -6611029, -493384, +113280, -1984812, 10194642, -8957691, 6074158, -4122632, 8300561, 8618926, -8810052, -11916924, +11118597, -1282585, 2459943, 2807835, 1043140, -2625836, 6281927, -3464965, -13635447, 3484292, +2834142, -11940009, -1277753, -4328790, 7171522, 8587787, 4340602, 1377074, -3366181, -8507256, +8664560, 5244155, 7754564, -614717, -12093554, -2923262, -1785096, -5383205, -2946885, -1498944, +3553012, 5325760, -4643397, -4067334, -12016245, -5807870, 2374580, 4896800, 1391569, -1101659, +5572183, 5130339, 3163780, 6317897, -1917703, 4939213, 2321967, 3355980, 626528, -28991, +-3278134, -2610803, -562104, 1547262, -743029, -2895882, -3498251, -179315, -535797, 685584, +-2363306, 512712, -2827699, 848793, 4860293, 1037772, -2706903, -2880313, 6172942, 3440806, +-706522, -412317, -7693897, -916439, -38655, -6595459, 220654, -2695092, -1979443, 1527398, +2095407, 463320, -697395, -6038724, 29615410, 17015586, 1191853, -9438191, -22330072, -2783676, +10462540, -4956393, -8989367, -16837882, -926639, -3677029, 596464, -5812702, 5436892, -149250, +14666240, 5738077, -6103686, -490163, -2602750, 1051730, -3009698, 2970507, 9096741, -10698764, +2073932, -6470368, 4243965, -4626217, -7742753, -15220290, -1210107, 8618926, 2924336, -1954210, +3216931, -1183800, 8293045, 13034689, -4553739, -3044058, -15154255, -16506096, 4562329, 2380486, +-6940667, -6074158, -13645111, -9448928, 5426691, -1831267, 39728, 636192, -1043140, 6183143, +3585761, -11304354, 485331, -10307385, -877247, -5587753, -3168075, 10825465, 22452478, 36903968, +1407676, 11832098, -11137924, -14263050, -19945292, -1109175, -53150, 3990025, 4245575, -2786897, +-25216290, 10417980, -4273493, -3539590, 1603633, -6672232, 777926, -3653407, -10262824, 74088, +-4097399, 41876, 1043677, 338766, 7317551, 1005022, 850940, -447213, 321586, -360240, +3154654, 6827388, 2056216, -297963, 1493038, 6185827, 192737, 25233, 2371359, -2119566, +798864, -5756867, 1976222, 2934000, -5335960, 5433134, 357556, 426276, -1560147, -6016713, +-1893544, 2624225, 57982, -653909, -1457605, 3609920, -996969, 228170, 10808285, 18023830, +-8914741, 36507, 3462281, -14695231, 135291, -9486509, -9197136, 13849122, -4075924, -3473018, +-7442642, 15904801, 13973139, -1074, 22957674, 2586107, 7169374, 5055714, -6401649, -7495255, +-11951283, -6291054, 2798171, 113817, 10287520, 803159, -1123671, -1872069, 7269232, -10506564, +-25680684, -9001715, 7572564, 2376191, -2111513, -7649874, 454730, -12353937, -1858110, -11254962, +-780073, -1408749, -7933342, 7603166, 3774203, 14441291, -11929809, 22370338, 6003291, -4351339, +-7919383, -4064650, 3521873, 12905303, -3973919, 7384123, -11404749, 9215389, -10357314, -11651709, +11487964, -16665010, 10920491, 9178882, 17725866, -18050136, 13715441, -1711008, 12227235, 4778151, +-18975702, -3317862, -4462471, 5291937, -10071698, 29869350, -1475858, -10542534, 4230006, 13805636, +9369471, 6467684, 7121056, -940598, 3388729, -1219771, -3966402, -2517388, 1044751, -130460, +-3935801, 1129576, -1162326, -6056441, -1268089, -2311766, 2538863, 3197066, 1730335, -834297, +5886790, -955630, 3253438, 1307818, 4161823, 1570884, -2119030, -2622615, 703838, -311385, +2864743, -1163936, 263604, 2444373, -1491427, 4185446, -1990717, -2306398, 1154273, -1728724, +4354023, 1584306, -1295470, 2629594, 1289027, -12488691, -16746077, -34305516, -10530723, -20143396, +5616207, -916976, -6861211, -9975062, -9495099, -8581882, -9299678, -9110163, 957778, -7426536, +-1336272, -16145319, -24774982, 30357902, -9457518, 16451335, -3142306, 4249870, 5243082, 8870181, +5850819, -1545651, -495532, -13103408, -2961917, -3115462, -8811125, -13741211, 5371394, -1547799, +19433116, -13450227, 360240, 26882200, -6475200, -22330072, -7201050, 890132, -10118943, 15731391, +7232188, -8632884, 6385006, 8454106, -5203353, -168041, 4252555, 10519986, -386547, -10351945, +-10189273, 12590697, 9004399, -6607271, -14337138, 9160092, 10599442, -9447854, -12899397, 9052717, +-16360067, 31329102, 6745246, -2551211, 1284732, 7669738, 1736777, -5506148, 515933, 2260227, +11257109, -7370701, 2261300, -22246320, -20037096, -2230699, 1206886, -2176475, -9719511, 7095286, +16565689, -449898, 4254702, -1541356, 3550327, 5020280, 5985574, -6384469, 7194607, -3301219, +-1894618, 4775467, 8855686, -2590939, -8856759, 2550137, -802085, 1502702, -790274, -4735202, +-1304060, -4893579, -3029026, -6044630, 6270653, 6426345, -3816079, 20938, 7713762, 2470680, +-3233037, 1643362, 9660992, 6370510, 6976101, 7038378, 6217502, 2337536, 8863739, 4701916, +3714610, 3322157, 8345659, -12987444, 115964, 4706748, 3766686, -8523899, 20491826, 14322642, +29458644, 16161962, 11044508, 4205847, -25549686, -2153926, 3628711, -15164993, -3892314, 29000692, +2373506, -16864190, -16451872, 15015206, -22719840, -5960341, 1170916, 6107444, 2800856, -4380330, +7607461, -10343355, 167504, -2099165, -6317360, -1438814, -4332549, -14941117, 8076149, -12945568, +7803956, 6775311, 9056475, 1612760, 6081674, -5400385, 24382530, 3256122, -25416006, -22535694, +2311766, 10143102, 19881940, -6450504, -15153181, -6802155, -1778653, 2245194, 11799349, 2542084, +-8819178, 26603028, -32285270, -5381594, 6456947, -22613002, -11438572, -5912560, 3653407, -36658084, +-17074106, 26350162, -9648107, 7741142, -8221641, -29574072, -10889890, 14349486, -4042638, 5641977, +9423158, 18833968, -8588861, 2158221, -5252745, 11837467, 5676873, 5159330, 1107028, -355945, +668941, 10344429, 5612449, 6174553, -1217086, -98247, 4159139, -6717866, -5904507, 2878702, +12222403, 5711770, 4988068, -11396696, 7198365, 21809308, 290447, -56371, -7903814, 6049462, +1370632, -4839892, -6330782, 1111860, 6828461, 7727720, 5857262, -6476811, 4929549, -4262755, +5544266, -8390219, -4317516, -1496259, -4104915, -5358509, -1265942, -13783087, -12893492, 2469069, +-502511, -1920924, 5220533, 132070, -821413, 433255, 5661304, 4986994, 2007897, 75699, +2788508, 3191161, 2444373, 3829500, -973884, 5212480, 14566918, -6051072, -47710644, -11932493, +2303713, 13532905, 12593381, 12041478, 11480984, 21609592, 38002408, -21669184, 15709380, -5261872, +-1058173, -5339181, -31868120, -23235236, -4849018, -1108638, 6392522, 12671227, 15789910, -4759898, +-910533, -7992398, -307090, -1156420, -537408, 17009144, 8541616, 5905580, 12441447, 15526844, +-26999776, 13551159, -15850040, -19277424, -6187974, 13038447, 3266323, -12895639, 3997541, 1979443, +9104257, -529355, -26252450, -18153754, -21837762, -20970178, 2407866, 18074832, -3705483, 64472828, +-42294692, -31180926, 18894098, -5240397, -13260712, -3919695, -3920232, 1118839, -39659728, 4562866, +-3306588, 5821828, 29571386, -1663226, 10053445, 12036646, 13864154, 49753976, -18761490, 62801012, +16886738, -1234803, 7747048, 4044786, -26075820, -22229676, -874563, -5091684, 2736431, 10117332, +7196218, -3951370, -22427782, -17613660, 6781217, -11719355, 7488276, 9185324, 18992346, 19379966, +16850768, 3867618, 5584531, 243739, -1300301, 13266080, -2552821, -608812, 3643743, -17947058, +-4831838, 8319352, -446677, -1338419, 11335492, 4990752, -17626008, 12403329, -10046465, -12869333, +-7917772, -3598646, 2907156, 6154688, 5425618, -6587943, 8032663, 4151086, 5018670, 2973728, +6743636, -2352568, 3913789, -10511932, -2739116, -5480379, 1969243, 4513474, -28000502, 10099616, +45172856, 1161252, 47141024, 24688546, -2729989, -18278844, 53160956, 7851737, -8812736, 6759205, +-11965242, -3655554, -1700807, -3348464, 6812355, 14722074, 10428181, 1879048, 6923488, -10719165, +-10182294, 3156264, -3024194, 17383880, 19030464, 11989938, -4742181, 1153199, -22871774, -14462765, +-4148939, -15807627, -24745990, -14829448, 11971684, -14457397, -43736188, -20288888, 13524315, -17718888, +-12378633, 639413, -3097745, 20656646, 30472792, 39903468, -20987358, 11375758, -169114, 1357747, +-8445516, -26316338, -52490944, -34585760, 18408766, -35037808, -18270254, 9665824, 17991618, -12910672, +20276004, 57814556, 12311524, 11298448, -43454332, -58369144, -12494597, -18074832, -31030602, -8766028, +-25887378, 18770618, 10792179, 52479132, 21772262, -5883569, -10368588, -17986786, 12591770, 23968602, +47620448, 33354716, -22574884, -47667156, -23141820, -15051176, -28086938, -5051956, 24408836, 11824045, +30136712, 1534914, 21509196, 8723615, -6634114, -8674760, -9980430, 6053757, 13269301, 3520263, +17181480, 21361020, 13033078, 15326054, 7222525, 23067732, 20309290, 1151051, -107374, 10311680, +22897544, -1873143, -5716602, -3031710, 19591494, 6282464, 1254131, -5352603, 12386686, 9632001, +-2608656, 8072928, 9889699, 5139465, -1728724, 2525441, 7191923, 1284732, -374736, -10878615, +23513336, 48384416, -26116622, 36764384, 28444494, -4330401, -8177618, -15928423, 4215511, 32801202, +23302882, 38398620, -17343614, -7206955, -8571144, -2063195, -11056320, 10242423, -13400298, 28217936, +11028402, -45676440, -20688858, 627065, 6027450, 20052128, -10358924, -17156246, 4263829, 5625871, +-8284455, -8377871, 4247186, -12860743, -20928302, -8890045, 42348376, 18106508, 6392522, -21783538, +-8045548, -18464602, 9939628, 21154862, 6106370, 1550483, 11435887, -7206955, 26648124, 15829639, +665720, 9314173, -1993402, 54861764, 10322417, -23171348, 7916699, 9585830, 4458176, 12511777, +-275952, -22127672, 25370908, 5922760, 3517041, 10451266, 3791383, 62277, -17366164, 18954764, +20463908, 11205033, 60641716, 43933220, -24701430, -47524888, -34357592, -3201361, 3105798, -4798552, +-41525356, -20019380, -15404974, -16606491, -17653390, 15101105, 10739029, -4205847, 1461900, -3585761, +-23737748, 6581501, -5236102, -1209570, -24308978, -22334904, -5082557, 9515500, 10043781, 1394254, +10772852, 5082020, 13863081, 2173254, 1912334, -25370908, -16154446, 10798622, 1868311, -7039989, +12224014, 5626407, 1287417, -12236899, 10722386, 16186121, 10321343, 11730093, 13780939, -3338800, +15381352, 32955820, 24932822, 5809480, 2500745, -4306242, -6874632, -17066590, -22584012, 5521718, +-8447127, -537945, 1131187, -1773822, -6098854, -3007014, -8282308, -56507812, -6669548, 13226352, +16296180, -13495324, 20214800, 5330592, -7386270, -21660594, 5182952, -5886253, -30549028, -10743861, +-10503879, 1432909, -42267312, -34360276, -5185100, 20155744, -2303176, -7384123, -25360708, -391916, +22701586, 138513, -14851997, -9791989, -2783139, -9623411, 6040872, 6439767, -21384106, -25368224, +4351339, -1767379, 5807333, 39404716, -24117316, -3478387, -1009854, -40218612, -11303280, -29669634, +-3961571, -3323231, 28372018, 30452392, 38933880, 10108206, 7054484, -15454903, -33043868, 481573, +14206678, -12525198, 47704200, 109369728, 106433584, 14601815, -67194760, -63053880, -23835994, -39957692, +130440840, 79513264, 51035484, 64786896, -485868, -35603668, -91963304, -60108604, -22393960, -5757941, +37867652, 74628816, 67759552, -8768713, -54933168, -34412888, -49687404, -40308268, 7617662, 53860500, +80249320, 30114700, -3718368, 3715147, -29950418, -36881420, -35334696, 11844983, 6228777, 8681740, +32613298, 16402480, -2624225, -21176336, -17140678, -12378633, -27453430, -6238440, 13059385, -11085847, +1387274, -4451734, 20159502, 14089640, -25433186, -16814796, -52072720, -43009264, -37019932, 23604066, +43419436, 15726023, 11795054, -16002511, -26593364, -83255792, -60437708, -37234144, 7901129, 22505628, +15557445, 2966212, -29560112, -25854630, -47259672, -80293880, -30499100, 8877161, 24329916, 40490804, +19937776, -402116, -21438330, -8649527, -13824963, 580357, 30331060, -29701310, 34021508, 5187247, +4750771, -53274776, -15759846, 44768056, -29563334, 11606075, 1184337, -11398306, 15284715, 4235375, +25607668, 37629820, -21502216, -31319438, 9114994, -19464792, 25403658, -32678258, -15462956, -21034602, +3543885, -6428493, -17157320, 7310035, 38056096, -29918206, -30762166, -24652038, -6182606, -7956964, +50694036, 1975148, -202400, -49718004, -11264089, 3499862, 42815456, 16955458, -6055367, -71229888, +-48875656, 46486040, 53251152, 49058192, -21610128, -118124488, -21605296, 51280836, 45289892, 5395016, +-12019466, 6108517, -45676440, -29492466, 17540110, -15276125, 16041703, -10050760, 3574487, 48091824, +-35149476, -20815560, 42736536, 30862562, 63643900, 24783572, -80986976, 24381992, 91071024, 17687212, +46989088, 9865003, -23313082, -2295123, 58636504, 37513856, 77306728, -100787312, 15403363, -2249489, +-9389335, 37713572, 2371896, -53191560, 6266358, -3894999, -8895951, 5958731, 1482301, -33224794, +29317984, -14723148, 950262, -301185, -5753109, -342524, 5890011, -10501732, -9714679, -18964428, +-23472534, 23034984, 537945, 7329362, 22932442, -25945360, 13296682, -2748242, -42030012, -1692754, +15444166, 45407468, -10680510, -67647344, -5948530, 29444148, 10231686, 25780004, -19894288, -20286204, +-22069152, 9056475, -2352568, 14934675, -23378580, 10574209, 8338679, 5568962, -26137024, 841814, +7994545, 17801566, -5888937, 2112587, -14991583, 4180077, -8034273, 14867029, -864899, 11423002, +-2007360, 3389266, -16766479, 521302, 81068, 17936320, -8945343, 5769215, -18122078, 978179, +-449898, 14801531, -3222836, 5930276, -58283780, 6589017, 10420664, 5558762, 57459684, 9682467, +-4315369, -36682240, -6273874, -3606699, -8597451, -363462, -6944962, 14704357, 6860137, -10812580, +-1854352, 22820234, 70330, -1282048, 2423972, -5710696, -9794136, 12806519, 11321534, 8595303, +-14266271, 7502234, 21348134, 8374113, -1225139, 13772350, -2505577, -16336982, 4322348, 4144107, +-13159780, -14302241, 14252312, 13879724, -13697188, 8782671, 8478802, -117038, -4988068, 106300, +10836739, -594316, -12098923, 6302865, 7384123, -22471806, 5750425, 16626892, 5439576, -14607721, +2279017, 10322954, -18931142, 5151277, 8875013, 3754338, -4922570, -18043694, 21252036, -22992570, +-2029372, 22145388, 361851, -3806952, 490163, -20792474, 9210020, -295279, 11885248, 22024592, +-9959492, -1571958, -12721156, 16848620, -3526168, -1868311, 17262548, -22526566, -9910637, 12528956, +10212895, 4495757, -18326626, 6351720, -4027069, -1135482, 8790187, 6698002, 1259499, -4649302, +-2346126, 868657, 4974109, -15981573, 11658152, 2397666, -2223183, 4536559, -2097018, 10142565, +-15050639, -2706366, 311385, 907849, 1502702, 6988986, 4612795, -25538950, 13518946, -2706366, +-2971044, -1038845, 5202816, 7016366, -6333466, -2530273, 11894912, -10147397, -1304596, -7755101, +5657009, 53880900, 4692789, -6545530, -18042084, -11944841, 6274411, -8003672, 6908455, -10691784, +-891743, 8551817, -4868346, 4028143, 3886946, -14914811, 4077535, -4877472, -3299072, -12293807, +3421478, -3477313, -7812546, -3613141, 5890548, -5367636, -5375152, 7592429, -8492761, 4267587, +7157563, -14960982, 14680735, -3738769, -17662516, 9329743, 9219684, -8215736, 2782065, 5312875, +-7506529, -6671695, -30602, 977105, 4715874, -2437394, -985695, -7422241, 6707665, -5820755, +-1960653, 8497593, -10381473, 2943663, -1960116, 537, -4941897, -6669011, -2804077, 11552925, +-8022999, -3050501, 1767916, 2426657, 226560, -7057705, 5236102, -3185792, -6171868, -214212, +-11223823, 16199006, -7291781, 3245922, 3467649, -3388729, 5512591, -9710921, -8002598, 9837623, +-4982699, -6755447, 6498286, -497679, 1719598, -4524748, 1048509, -1047435, 2896956, -3624953, +-2923262, 3686693, -2313377, -2662343, -837519, 2300492, -1682017, -285078, -1394254, 560493, +2109903, -3238405, -3337190, 9229885, -2887829, -3404835, 2763812, -1144072, 2557116, -7543037, +348966, -1321776, -383863, -2059974, 8568460, 32212, -7832947, 2430952, 689879, -416075, +-95026, 3307662, -2353642, -2296197, -1138703, -2080912, -1166084, 871878, -2570538, -149250, +550830, -426276, -26924614, -43533252, 19808390, 150964880, 22950158, 75496400, -17844516, -76489072, +-28005334, -74539160, -49331456, -15467251, -8367133, 3696356, 44215076, 53475564, 73899208, 73679624, +23216446, -28929290, -47203840, -86189256, -66285304, -34646964, -13700946, -8682813, 26505316, 44884556, +34419868, 47284904, 45532560, 16986058, 14657650, 5738077, -33583960, -12269648, -28896540, -49605800, +-30228516, -28915868, -43283068, -9030706, 20010252, 15474767, 43853764, 57821536, 29873646, 38567732, +28762322, -3905736, -1402844, -2551211, -31161062, -38048040, -34211024, -51158968, -43852688, -15299747, +-2707977, 6361921, 35465692, 32928978, 31448824, 39946416, 29573534, 10370735, 18640158, 10455024, +-11716134, -5360656, -21543020, -44891000, -27226872, -25402048, -35612796, -16935592, -11501386, -19787452, +16739098, 32068910, 36714456, 58931784, 55248312, 23538568, 13623099, -607201, -20195474, -23659902, +-24696598, -35616552, -32888712, -29924648, -27705760, -17071422, -6964827, 114890, 13319230, 31664646, +39142184, 36679020, 43939664, 30680026, 14680735, 6418292, -5219459, -22428856, -25631828, -35418984, +-46540804, -46643344, -37297496, -30897994, -4825933, 18759344, 41471668, 55892020, 60211684, 46755552, +30258044, 13627931, -3714610, -23162758, -34282964, -46044196, -45962056, -32665910, -21626770, -6379637, +8260833, 16751446, 21894670, 27651536, 23643258, 14987825, 12470974, 4644471, -334471, -4184372, +-5699422, -7177427, -7224672, -10187662, -8482024, -6447283, -5515812, -5310727, -3599183, -3301756, +-688269, 1966558, 5734318, 7007776, 9283572, 9989557, 10385768, 6591164, 3959960, 852014, +-1174137, -5822902, -8022462, -10578504, -10247255, -8760660, -5264020, -3508452, -652835, 1043140, +5143760, 7254200, 9100499, 7361574, 7191386, 4971962, 3288334, 725313, -238371, -3233037, +-4668093, -6922951, -7361574, -7902203, -5450314, -3702262, -180926, 1221918, 3981972, 5010616, +6284074, 4776541, 5083094, 3544422, 2928631, 493384, -738198, -2879239, -3099893, -4439386, +-3847754, -4268661, -3074660, -2729989, -552440, 130997, 2287607, 2762201, 4207458, 3472481, +3717831, 1727651, 1124745, -486405, -272730, -1509144, -1328219, -2576444, -2024540, -2629594, +-1525250, -1627256, 6442, 179852, 1654636, 1283658, 1989107, 1042603, 1538135, 414464, +799938, -340376, 139586, -752156, -92342, -883690, -73014, -737124, 133144, -539018, +293668, -394063, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -1142998, -6171331, -3469260, 1033477, -5156645, 1442572, 577136, 7864085, -4713727, 13959, -2481954, -3939559, 4020090, -2570001, -493921, -2209761, -1271310, -2583423, -3217468, 2364916, 768262, --2105608, 4383014, 3991635, 6824703, -208306, 2579665, 1351841, -122943, -6180458, 1596654, -2563022, -2446521, 1535988, -1806571, -2101850, -3398393, 1750199, 4350265, 441845, 5077188, --2086280, -445066, 5122286, 2673080, 405338, -75699, 4864051, 7308961, -5454072, 1206886, --1890323, -857383, -8485245, -3022046, 3415573, -2646774, 2363306, 1082332, -1255741, -2071248, -1188632, -719407, 2631741, 1417876, 1219771, 1337346, -4412542, 150324, -2128156, 2690260, -4475893, 3131568, -652835, 4845797, 18254, 2045478, -658741, -1098438, 245350, 2420751, -2796024, -937377, -1933809, -3979824, -527207, -1766842, -1890859, -1076426, -1611687, -1161789, --1895691, -1006096, -63888, -47245, 25770, 1539746, -1099512, 794032, -409096, -783832, -23622, 690953, 242666, 544924, -19864, -550293, -10737, 704375, 221191, -1103807, --857383, -69793, -11811, 407485, 394600, 30065, 875100, -1112397, 3733400, -4562866, --4649839, 118112, -6283537, 1104344, -1937030, 3022583, -1639604, -5091684, 632434, 4873178, --694174, 110059, 6927782, 8572755, -3665218, -4021163, -1065689, -6477348, 2801929, 526134, -1660005, -2316598, 3486440, -4531728, -754304, 3002182, -2456185, -977642, 529892, 5502390, -418222, 3964792, -5244155, 5151814, -507880, 693637, 3434900, -2971581, 2876018, -1381906, --1286343, 2364916, 3260417, -602369, 1890859, -7096360, 4315906, 4069482, -7397008, -6625524, --1793149, -5505075, -1464584, 2015950, 1416266, 1922535, 176094, -1875290, 4651450, -1597728, -230318, -1895154, 1143535, -2839510, 3967476, 897111, -2942590, -1740536, -1127429, -1802276, --1478543, 3894462, 5244692, -307090, -993211, 141197, 1722819, -1138166, 3684008, 1995549, --1415729, -338229, -860067, 1512902, -1452773, -103079, -335544, 179315, 638876, -149787, --380105, 921807, -694174, -312996, 270046, 594853, 118112, -1374390, -840203, 193274, --798864, -785979, 936303, -520765, -1538672, -1094680, -1224066, -403727, 273804, 1484985, -11079942, 2135673, -4117263, 5160940, 641024, -3474629, 10121627, -6782290, -9753871, -5690295, --5917928, -1968706, 2871723, 3575560, -3376918, 5137855, -6428493, -3478387, -784905, 2150705, -1593970, -1932198, -2529736, 5748277, 1096290, -365072, -3214783, 4299263, -3129958, -696322, --10737, -334471, -452045, 1692217, 886374, -852551, 3565897, -1652489, 2174327, -122407, --5820755, -2252174, -2324651, 6222334, -3430068, -4139275, -7556458, -8798241, -1611687, 484794, --3523484, 6738804, 909459, 3636764, -2702608, 5839545, 2480344, -3325379, 9361418, -4199405, --4522601, 764504, 5871757, 8637716, 6096169, 2057826, -2985002, -6722161, 2705293, -38655, -6678674, 2726231, -1893544, -184684, 3412889, 2778307, 63351, -588947, 294205, -1282585, --2793339, -215822, 899796, 747324, 2444373, -33823, 1489280, -461709, 1180042, -241592, -240518, -194884, -1623498, 210990, -279173, -2049773, 1714229, -330176, 1059246, -512712, --1109712, 217970, 225486, -19864, -716186, 844498, 339302, -491774, -143881, -1555852, -237834, -847719, 846109, -236223, 1782948, -30065, -872415, -711354, -10559177, 1709934, --3875134, 2504503, 643708, 7614440, -9768903, -5473936, -7183333, 3889630, 3120831, 4655208, --5137855, 1822677, -1559073, 719944, -7973607, -6687801, -5006858, -4840428, 7962333, -3151432, --1005559, -70330, 2686502, -1200443, -8465917, 3627637, -3391414, -1024887, 3859565, 3005403, -4436701, 366146, 2355790, -5825587, -2477123, 5372467, 8757438, 5238250, -416612, -6635725, -4754529, -2084133, -5833103, 8093866, 2347737, 2838437, -4961224, -2791729, 2720325, -1729261, --2774549, 4312147, -3359738, 1556389, 184147, -5498632, -1210644, -3608846, 5842230, 3075734, --838056, 1089848, -2721399, 3564823, 559956, -9664, 1010391, -6593849, -3504157, 3864934, -1800128, -998043, -882079, -4660040, 7775502, 9742060, 5309654, -4328254, 3937948, 777926, -3358665, -1374390, 2758443, -2023467, 1779727, 3623342, 1883343, 1789928, 1263794, 168577, --1203665, -295816, 3439732, 281857, 213138, -1196148, -264141, 827855, 2062658, -155693, -2426657, 505732, 47245, 15032, 1967095, 2543695, -1080184, -358630, -289373, 488016, -1727114, 9664, 455267, 241592, 402653, -762894, 2910377, -15850577, 5289789, 799938, -3943854, 4263292, -3092913, -11213086, 8637716, 3662533, 8498667, -1570347, 4504884, -96637, --3060164, -219043, -7924215, 9683004, 2210298, 907849, -4992900, -2877628, -3383361, 2883534, --4454418, 7410429, 320512, 2541547, 4130148, 2270964, -483184, 2381559, 2282775, -1751273, -1919850, -8271570, 2137820, 3744675, 3841848, 7393250, 2564632, -4970351, 2471217, -2515777, -5030481, 955630, 3656628, 5620502, 912681, -1258425, 4409858, -3067144, -4818954, -1801202, -3070902, 7794292, -1868848, 466541, 124554, 908386, 1519882, 3248606, 1096827, -2085207, --385473, -2803540, 1997160, 619012, -4974109, -4394289, 1722819, 2719788, 2740726, 4879620, --7587597, -4106526, -5536750, 6455873, -2882997, -4064650, 2083059, -3750580, -5415417, -1987496, -129386, 5737003, -2063732, 1828046, -2321967, -1389959, -358630, 1717987, 741419, -1088774, --900333, 1064615, 2844879, 927713, 1629940, -841814, -569620, 1899986, -102005, 85899, -705985, -1405528, 2537252, -850404, -204011, -1250909, -3294240, -560493, -746251, -296890, --62814, -1285269, 102542, 2870649, -757525, -341987, -585189, -1144609, 3825742, 16178068, -8454643, 7730405, 11063836, 3117610, 1950989, -6735583, -309238, -12669080, -2383707, 4941360, -3439732, 2349347, 2863133, 3593277, -2840584, -1782411, 7223062, 6675453, 5567352, -345745, -704375, -9025337, -7978976, -2904472, 5675263, 1948305, -1287417, 3214246, -5397164, 584652, --2829310, 6424734, 4889284, 11221139, -1198296, 4284230, 3408057, -1710471, -5935645, 10561325, --6187974, -1301375, 4650376, 308701, 2602213, 7635915, -2509335, 2898566, -7402913, -15537044, --8759586, -5101885, -2195265, 804233, -722091, -3947075, -8493835, -1669669, -6127308, 1931125, --239444, 823560, -9567577, -4230543, 6036040, 2199023, -470836, -10415833, -9599252, 5731097, -913217, 3519726, -7062000, -5474473, 269509, -2755222, -6040872, -4141959, 3229816, -1210107, -1430761, 517007, 4064113, 3133179, 1324997, -2043868, 1021129, -302258, -2634963, -2418604, -2291902, -950262, 602369, -1537061, -2548526, -350040, -303869, 2243047, -349503, -2035815, -462783, 886911, 2288144, 544924, 469225, -940061, 2891050, -1065152, 3306051, -1808718, -2423972, -2165737, 282394, 1401770, 8590, -89121, 439697, -533650, -865436, -8164196, -6182606, -3642669, -280247, -21214454, -4984847, -7856032, -5162551, 840740, 7015829, -1414118, -9270150, 4879083, -529355, -9134859, -3757023, 13543106, 2284923, -8138963, -5917928, -2700998, -6374805, -4977867, 91268, 4354023, 6933151, 7787313, -8545911, 5740224, 793495, 1609539, -2458332, 3143379, 2765422, 7807177, 227633, 2355253, -6848326, 9572945, -4809827, -2281165, -1622424, -7986492, 9861782, -1582159, -19248970, -6389301, -15454366, 922881, -218506, -4694936, -20974472, -3690451, -10377178, -3544959, -2549063, 9613211, -1316944, 4574140, 5652714, -3956739, -7197829, 9908490, -5044976, 3758633, -8827232, 4283156, -3165391, -2517388, 10196789, -3755412, --976031, -4555887, 270046, 151398, 3889093, 5735929, 6101001, -1648731, -1731946, 219043, -7901666, 3726958, 4107063, 136902, -6455336, 2571612, -3135863, -3532074, -1931125, -84826, --182536, 399969, 1432909, 1487669, -381178, 4275640, 693637, 1859184, 745177, 832150, --1203665, 1121523, 432181, -1285806, -1883343, -1236414, -3237332, -2543695, 2224793, 1781875, --2741800, 734976, -153008, 759672, 3088082, 648540, -1214402, 329639, 991601, 63351, --2506650, 1103807, 9598715, -13419088, 2649995, 2782602, -4299263, 1836635, 10096931, 10895258, -3987340, 3913252, 5137318, -8383240, -1510755, -8954470, -238908, 5756867, 3578245, -1870458, --7157026, -2282775, 4742718, -9290551, 257698, -649614, 4233764, 8877161, 775778, -4765803, --3706020, 9494562, -6163278, -2934000, 5389110, -3389266, -11283953, -4056060, 2477659, 1902134, --4559108, 1053341, 5762773, 4033511, 5553393, -660351, 4165582, 8061117, -3637301, 4015258, -3380676, -5514738, 11872363, -11498701, 6765111, 3013457, -16069083, 15287936, -9987410, 2166811, --1861332, 12196633, -5276904, -8659728, -1939715, 67109, 2113124, 9364639, -8071318, -403190, -464930, 535797, -1540283, 2761664, -6589554, -966368, -4732517, -8645769, -9673340, 5134634, -4060892, 3965866, -23085, 6032282, -2908767, -7017440, 1700270, -12411919, -10452340, -1969779, -2905009, -133681, -2036888, -1629403, 1358283, -6812892, -2390149, -1461363, -1230508, 3113851, --455803, 483184, 128312, -2266669, 986232, -2544768, 58519, 1149441, -2845953, -624381, -2166811, -1839857, -120259, -1307281, -238908, 797790, -54224, -3775813, -723702, -107911, --323196, -702764, -2415382, -3892851, -1060320, -305480, -673236, 3038689, 2160906, 352187, --856846, -10872173, 8650601, -24715390, 13598940, -9931575, -6567005, -12163884, 1469416, -1599875, -2229088, 8413841, -7089918, -2930778, 6943889, 6081137, -1949378, 2267206, -3211025, -11413339, --988379, 2671470, -5688684, 8916352, 1601486, -1220845, -5327907, -5469641, 1293859, 13826573, -635655, -2126546, 3874061, -12252468, -2051384, 4257387, -8160438, 11592654, 7495792, -581431, --3572876, -4097399, -4507032, -8198019, -9912785, 8194261, 639413, 14680198, 1366337, -926639, --6651294, 1078037, -2596845, 3177202, -191126, -9504763, -7297687, -9681930, -16037408, -2388539, -14165339, -13684303, -818728, -14321568, 2276333, 3841312, 3308736, 9963787, -1098975, -14716705, -10468983, -1160178, -7038378, -6025839, -12577812, -4457639, -9561134, 5103495, -14688788, -2595771, -5791764, -256624, 1132261, 6888591, 3594888, 8302709, 47245, -4711579, -1792075, -3272765, --143345, 2977486, -848793, 406948, 440771, 199716, -2441689, -3716757, 2269353, -2643552, -1104880, 317828, -500901, 986769, 386010, 338766, 5083631, 788663, -290984, 839129, -1612223, 999117, -2548526, -509491, -5371931, 1898376, 2786360, 4092567, 1516124, 1334124, --83752, -2836289, 1635309, -232465, 10553808, -3863860, 9383430, -9159018, -4854924, 6412923, -2057289, -12361990, 801011, 16071768, -18518288, 1088237, 8651138, 20808042, -8899172, -5300527, --2281165, 16109885, 15822660, -16734803, -787590, -12859132, -6155225, 8360154, 8415452, 11012833, -6256157, -2199560, 7745974, -9598178, -5173288, -976031, -1479079, -13889387, 1222992, -334471, -18347564, -2856690, 9039296, 2163590, 5355824, 12267500, -7445863, -3340948, -18134962, 12461848, --15984258, -2868501, 3661997, -2191507, -9236327, -2351495, 2612414, -6600291, 1789391, -1110786, --1408212, -20414516, -14442364, 965831, -10474888, -14350559, 2626909, -13273060, 4199941, 8557722, --7779797, 14731201, 3090766, 9433359, 10165651, 2556043, -7565048, -9012989, -11155641, 5664525, --11575474, 6890738, 8344048, 11461657, 2022393, -8281771, -5289789, 156766, 1101659, -15374372, --391379, -9985799, -1700807, -2884608, 601832, -7337952, 936303, -1747515, -122943, -4801237, --3454228, 1035087, 7614440, 711354, -751082, 938987, -1109712, -2929168, -2804614, -3164317, --1369021, -3739306, 3914326, 2770254, -297963, -3120294, 4653060, 6894497, -1588601, -1338419, --1688996, -841277, -268435, 1597728, -2696703, 2654827, 2551748, 1638530, -2571075, -523449, -1421634, 1896765, 4790499, -9854802, 25435334, 10605348, 4418448, 13080860, -4990215, 2753074, --13493177, -17392470, 10977400, 22362820, 6674379, -103616, -22079354, 26670136, 3875134, 3285113, -3846143, 989990, 4842039, 1523640, -3800509, -163209, 6755447, -4133369, 8483634, 1626719, --6642704, -9243843, -2503429, 8447127, -2292976, 2757906, -3798899, -3388729, 163746, 23929948, -3892851, 3462281, 3253975, 2020245, 14363444, -5343476, 4148402, -9266929, 17108466, 23803246, -6226092, -1371168, -8450885, 24872156, 11711302, 366146, -9603010, 3637301, -5752572, -892816, --11020886, -4149475, -7347616, -10126996, 16391206, -4912369, 12084964, 2530273, -9387725, -140123, --20113332, 19137838, -1367947, -9156333, -7132330, -11668889, -14361834, -7865159, 22288196, -6941741, -8039105, 10117869, -8985072, -8563091, -16054588, 2423972, 10846403, 3721589, 10370199, -2385854, --2035815, 469225, 2954401, -4415227, 1247151, -7997229, 2608119, -366146, 9091909, 6416145, --4909148, 502511, -266288, 5414880, -1836099, -7189239, 1596117, -213138, -587874, 2688650, -490700, -1114007, -3616899, -4021700, -787590, -944893, 4262755, -141197, 4272956, -5860483, -1403917, 4468377, -8371428, -6052683, 2172717, -4483409, -1199907, -2640331, 6253473, 7545184, --5621576, -5942624, 23659902, 23226646, 28656558, 17270064, 5679021, -7276212, -7584376, 4305168, -8315057, 10205916, -15249818, -435402, -1828046, 7659001, 6023692, -10558103, -13050795, -34897, --4952098, 12446278, 14615774, 10737, 7742753, 2570001, 3088618, 16909286, -10327249, -13656385, -10773389, -17889076, 1537061, -5500780, 9873593, 5062693, 171799, 11579232, 10602127, -9628780, -12013560, -6442, -5155035, 2865280, 13051869, -5028870, 5577552, 9706626, 4372814, -20851530, --12079596, 2078227, 1092532, -14169097, -9707700, 4736812, 6742025, 5762773, -19346680, -13482439, --13467407, -1043677, 8370355, 12247099, -30727806, -22550188, 3745212, 4745402, 17730162, 6281927, -6494528, 12944495, -1403381, -3288334, -4702453, 31741956, 10950556, -4976257, -16609712, 15190762, -9891310, -4930086, -4523138, 2369748, -4582730, 8128763, -2941516, -1704565, 4751845, -1150514, --1919850, -2469069, 4989679, 13032541, 71941, 957241, 434865, 5686537, 7239704, -1817845, --4592394, 1997160, -449898, 1495722, 826781, 1147293, -6191732, -3331821, 4342749, 477278, --2537252, 2166811, 6051609, 4769025, -8188892, -1797444, -5456219, -5187784, 3837553, -6200322, -2409477, -3326989, 6020471, 4733591, -7230041, -10070625, -19499688, -18974628, -15600932, 6022081, --2011655, 8806294, -17200808, -2833068, 801011, -6634114, -8050380, 13983877, -5358509, 2833068, --214748, 974958, -14025216, -5157719, -11993696, 1597728, 1580548, 3118683, 33149094, -12911209, -9153649, 13959181, -7085623, -6680285, -10033044, -2023467, 15483357, -15796890, 10816338, -1031866, --2636036, 1457068, 1584843, 8494908, 951335, -16757889, 12819404, -10436771, -24060406, -19468014, --9758703, 32571958, 27630062, -15014132, -4325569, -20613696, -17211008, -6788733, 20116554, 530428, -13874355, 7261179, -9466108, 10586021, -7207492, -21453898, -1821066, -13005161, -2655901, -6964827, -42362872, 396748, -35072704, 27543626, -11114838, -7808251, 27814746, 28284508, 89657, -12369506, -5511517, 6926709, -38087232, -16372415, 1005559, -5586142, 19932944, 8454106, -28896004, -4308926, --2325188, 13111998, 8325794, 5717675, 5171678, -5999533, 1022202, 2314987, 12079596, -1478543, -1653026, 2393371, 2054605, 7128035, 3357591, 184684, -8268886, 10473815, -960462, -23085, -470299, 40802, -4478041, -6929393, -4787278, 977105, -1741609, 3072512, -496069, -3050501, -3297998, 7743289, -10283762, -3299609, -3158412, -1433982, 2892661, -160524, -2965675, -5742372, --2204392, -1452236, 5313949, -16953846, -10395431, 5033165, 4089883, 9079024, 28953986, 4885526, --646929, 6662031, 1599339, -12095702, -7283191, 6373195, 1575716, 23472534, 5655398, -1563905, -8615168, 12556337, 12913356, 13707388, 833761, -9782862, -2600603, -22221088, -2920041, -25078314, -14017163, -15302968, -5800354, -30065, 20307680, -11829414, 11336566, -8340827, 6901476, -10434623, -12989055, 19398220, 1409286, -4235375, -10418517, -15247671, 8547522, 9587978, 24815248, -3467649, -1316944, 10784126, 39697844, -9365713, 6013491, -6534256, -21996138, 15372762, -3088618, 10894185, --1298691, 2605972, -13226889, 36556076, -54951424, 40371620, -63061932, 27084600, -32500554, 9986873, --25471840, 9061307, 16990354, -4182761, 12638478, -6610492, 46104328, -28071906, 30629560, -47521664, -23957328, -18728204, 23049478, -15605227, -16677358, -8342974, -4188130, 11450920, -3138011, -2215130, -1201517, 539555, -5873905, 8086350, -8883603, 8552354, -6410776, 2488934, -10225243, -5936182, --7546795, 1162326, -6937983, 8425115, 9234717, -8929774, -111132, 3276523, 8474507, -1495186, -3054259, 6696928, -6464463, 11214696, -3163244, 14901389, -9004399, 17890686, -12919262, 4414153, --1048509, 9856413, 8407935, -1874216, 4925791, -14250701, 15940234, -11229729, 3876745, -11414412, -8055748, -15137612, 5097053, -1559610, -5443334, 5290326, -10698764, 1620276, -5255430, 5214627, --5200132, 2987687, 1881733, 1400159, -4005594, 13980655, 11272142, 44399224, -30859340, 12913356, -8177081, -26672820, -691490, -5250061, -7529615, -13709536, -686658, 1566053, 17726404, 6584185, -9299678, 13278428, 10803453, 395674, 14787036, -17003776, -2401961, 20476794, 2328409, -28113246, --6416145, -36786932, -6831146, 6411313, -6772090, -8578660, -1557463, 32875290, 8354785, 2515240, -4058744, 8227547, -2437931, -18864034, -5733782, -2096481, 3544422, -4351876, -8770323, 23805930, -12858058, -4925254, -1092532, -5119601, -21489868, -17675938, -12872554, -10734734, 24067922, 5785858, -8907225, -14484240, -14026289, 4521527, 9818295, 9019431, -4033511, -2849174, -16294569, -10792179, -14294188, 643171, -39494372, 13903346, 21599390, 6900939, -17194364, -10597832, -8551817, 2831994, --12372727, 6123550, -29065654, -38890392, 16123844, 14026826, -7746511, -14299557, 10936597, -6403796, -2850248, 3376381, -5705327, 6222334, -3526168, -3660386, -2085207, 9346386, -6630893, -1967095, --7256884, -106300, 630286, 6248104, 6493991, -731755, 3833795, -4599373, 7583839, -5276368, -6197101, -14310831, -6497749, -1977296, 4147328, -4681515, -9319005, -7162932, 3423626, 7368017, --264141, 9521406, 2688113, 3764002, 596464, 6199249, -3499325, 5925445, -1421634, -11787538, --9059160, -3474092, 5374078, -6626598, 3905736, -9889699, -4350265, 4523138, -36686000, 32114008, -39024608, -3651259, 28363964, 1160178, 4306779, 12372190, -25116968, 9124121, 18529026, 18318036, -7648800, 5673652, -18174154, 13267154, 7766375, -11005854, 5817533, -2190433, 21590800, 5960341, -5489505, 12780212, -5174899, -14738717, 4211216, 27551678, -9921374, -5370857, 24841018, -9154723, --11187853, -9078487, 8520141, 32004486, 44471700, -2781528, -28937342, 43663176, 14986752, -28777354, -32518808, 12461311, -8133595, -8367133, -12271258, -20282984, -1207423, 10633265, -17444546, -11398306, --36788004, -5001490, 21328270, -44511432, -24158654, 7015829, 7119982, 8767639, 26941792, 23878408, --39602820, 314069, 1461363, -28002114, 7761543, 13306346, -14415521, -10263898, -12180527, 8097624, -31026306, 9711995, 16109349, -21268678, 10776073, -24081882, 2050310, -16202227, -65805340, 50267760, -12868259, -18373334, 33983392, -11766600, -15567109, 9132711, 6899328, 8732742, 13252658, 5356361, --13429826, -4274566, 12999255, -459025, 4964982, 2074469, -2203855, 3173444, -5925445, 4309463, -12139188, 4369056, -7261179, -5362804, 3662533, -3305514, -6595459, 2449742, 7547332, 4382478, --22805740, -6920266, -16813186, -8733279, 9695352, -7511898, -9427990, 8864276, 5689221, -9863392, -12400644, -9257265, -4100083, 4430796, -7299834, 8149164, -3718368, -13539884, 11138461, -20889110, -24067386, 79678088, -25418154, 678068, 6154688, 35963908, 31936304, -10464688, -13820668, -20120848, -889058, 15223512, -473520, -10294500, -10533944, 14367739, -7813083, -19350976, -17248052, -3506304, -29326574, 20529944, -23252416, 1553168, 464393, -10165651, 11587285, 4263292, -8269423, -2751464, --6494528, -3129421, 37431712, -13926968, -24785720, -17383344, -14067092, 33063196, 961536, -7667054, -30494804, 20930986, 8367670, 15497316, 29988536, -18204756, 4665945, 29135448, 17082158, 22260816, --25229174, -7118372, -893353, 10669773, 10094784, -23917600, 2335925, -31425202, -47231220, -2478733, --12455942, 21973590, 24472724, -6387153, -1884417, 4977330, -17137456, -45779520, 30880278, -22172232, -4822175, -8522289, -15431281, -8960912, -17903034, -36279052, 21499532, 19110994, 23211078, 4499515, --28795608, -50658064, -14993194, -13990856, -6142877, 16058346, -10311143, -2500208, 3119757, 2188286, --8004746, -3649112, -6418292, 825171, -2826089, 5401458, -3120294, -3890704, 5941551, 7694971, -6120866, -12218108, 4078608, 746787, -1045825, 198105, -26884348, 1358820, 3790846, 4020626, --17691508, 11616276, -2482491, -14724759, -12031277, 7243463, 9572408, -1713692, 5712307, -9050570, --6345814, -6146098, 790274, 11084237, 2858838, 10591926, -189515, 4948876, -15590194, -2356863, --3685619, -2876554, 12297565, 5901285, -366683, 3959960, 1898376, -12279848, -3957276, -38960724, --22618908, -18070002, -46261628, 53382684, -1402844, 28199682, -6578816, 1569811, -32300838, -17389248, --16756278, 3883724, 24978992, -982474, -26388816, -19425600, -37643776, -41528040, 35574676, 13363791, --32647120, -9906342, 15824270, 29950418, 3980898, -36793376, -22665616, 7452305, 10146860, 9342628, -21383032, -22814330, -22003654, -3183645, -7936026, 3209951, 6229313, -44248900, -8384313, -30813170, --20039244, -41150620, -15862388, 56761216, 9558450, 1953673, 13680545, 14198088, 4230543, 42223824, -33093260, -10842645, 11107322, 56994216, -15093589, -13108777, -13780403, -42169064, -1840930, -23012972, --52796960, -54985780, -29125784, -28303834, 12672301, -21154324, 1651952, 11355894, -37687264, -13561896, -21475, 11274, 9456444, 24678346, 16076063, 29724394, 39798240, 29210072, -3796214, -20953534, --30878130, -2424509, 12465069, 3925600, -4537096, -190052, 8467528, 7217156, 18623516, -1921461, -2779381, 539018, -6507949, 6371047, 747324, -2822867, 15880105, 7185481, 3428995, -14875082, -9932112, -5191542, 7435126, -14093935, -39982924, -1625645, 15472620, -2723009, -21327196, -13293461, --15667504, -11388643, 4815732, 7201050, 7665443, 2429341, -1627793, 6204617, 15347529, 26271242, -24325084, 30815316, 25914758, -2175401, 17366700, 40119828, 2638721, -17110612, -25095494, -24720758, --34323768, -27347130, -13429289, -14477261, -2214056, -4151086, 35050692, -22859964, 6781754, -26508002, --9223442, -28928216, 3548717, 35430260, -1003412, 21950504, -43813500, 38483444, 12647605, -7721815, -30185030, 4391604, 13613973, -12030203, -14565308, -153008, 9088688, 7252053, -30684320, 28070296, --33983928, 4240207, 9207336, -11357504, 19650012, -20883204, -12166569, -2225867, -7740605, -10534481, --2604361, 4581657, -15851114, -18294414, -6223408, -3144453, -4787278, 11227045, 5783174, 4608500, --22572738, 5985574, 26818312, 35990752, -26812944, -13313325, 30254824, 41834056, -25651156, -15637439, -17308182, 7427609, -20447802, 16733193, -47601660, -9290551, 18930068, 37804840, 4577899, -23433878, --21544630, 5739687, 44940392, 3947075, 6432251, 1352915, 14666776, -2913062, 33291366, -385473, --37615860, 23480586, -24679956, -7477538, 9919227, -14251238, 3007551, -30353070, -11696270, 28069222, -12543452, -12641699, -18416282, -9903121, 1937567, -14672682, -4831838, -3284576, -9383967, -5558762, --4756140, -19047106, 11582453, -7168838, -8863739, -27567248, -7379828, 20133196, -14442901, -7812009, --7750806, -15792058, 29765198, 12311524, 696322, -1096290, -17263084, -25268366, 1138703, 22395570, -17996986, 6083821, -19404662, -11176042, -8938364, 10859288, 1519345, -16952772, -4663261, 967978, -6137509, -15095736, -10578504, -8957691, 22959822, 11909407, 1003949, -14666776, -13122199, 13036299, -27690728, -404801, -12677133, -17481590, -6432788, 7741679, 68183, -4097399, 447750, -3543348, --3233574, 2617783, 8378945, 125091, -1859184, 48855, -76773, -2177549, 519154, 75162, -191663, -3031710, 1941862, 419833, -57321708, -15415711, 9221832, -18843096, 55827596, 41513008, -26599270, 14685030, 37533184, 27132920, 8519605, 18585398, -45026828, -59628104, -8739722, 894964, --15833934, 8340827, -3267933, -15341623, -20066088, -15717970, 30667678, 27357332, -22049826, -2464774, --3418794, -5121212, -8097087, -10966662, -16786342, -22630182, -4780836, 40842992, -13355738, -22192096, --11145440, 38356204, -18158048, -17158932, 58474368, 21268678, 9524090, -13990856, -32719598, -22251152, --33735896, 9353365, 27151710, 74674448, -65690452, -27365920, 37956772, 53410604, 8895414, -2776696, -67768680, 33017024, -21860846, 22087944, -8207146, 647466, -47544216, -23404350, -16848082, -76951320, --33165200, -12060805, 41294500, -22103512, -13389561, 31493384, -2421825, -3690988, 7082401, 22299470, --21486110, 15897821, 23305566, 1000727, -4853850, -43220256, 19803020, 16124381, -50836308, -3177202, -5117991, 3758097, -4643934, -21925272, 5622649, 4302484, 5957657, -3048353, -6825240, 16648367, -3101503, -2864743, 10788421, 5122822, 29329258, -3553012, 9390409, 2387465, -23907398, -20018306, -14072997, -10914586, 8422431, 11599096, 6535867, 7361574, -141734, 20131586, -6596533, -4389457, --8074002, 6151467, 14944339, -22482006, -8893267, 11575474, 4802847, -12507482, -23797876, -5470715, -6116571, 49370112, 18023294, -4037269, 12719546, -2421288, -4625680, -18086644, 8655970, 7608535, --14391899, -6896107, -52210160, -2034741, 21417392, -4948339, -21804476, 9610526, -4941897, 23556286, -4633733, -11270531, -235686, 25215216, -14352170, 4140349, 9021579, -7541963, -272730, -13486197, -27685896, -1561758, 4079145, 550293, 13356811, -5961952, -5266704, -8560407, 5499169, 10536092, --4612795, 12497818, -5404680, 7746511, -13052942, -10131828, 15756088, 20378546, -26212186, 1345399, --1611, 2577517, 8214125, -16341277, 25228638, -22499724, 20300162, 2976949, -35357244, -1793686, -27542552, -35822176, 17129940, 294205, 4621385, -8493298, -5410048, 7408819, -10453950, 36969468, --27264452, 4219806, -7330973, -3155190, 9063455, 667331, -4488241, -691490, 11119133, -190589, --12795244, 3760781, 6471979, -21231634, 16630113, 7678328, 771484, 15512348, -5628555, -4576825, -7214472, 3526168, 4573604, 2784750, -4242354, 8842264, 3722126, 824097, -9366787, -1360431, -4566087, 8492224, -14210973, 7625178, 8845485, -12359842, 5952288, 2040646, 2134599, 6827925, --3738232, 1685775, -2343979, -18001282, -276489, -4190278, 7953743, -4912369, 3036005, 2219961, --752156, 2655364, 4609037, -2786897, 4832, 1056025, -130460, 1557999, 5534602, -5399311, -5185100, -3871376, -26125212, -74351792, -105827456, 35454956, 94358288, 20614770, 261303120, 214914256, -145441008, 245756960, 128209072, -8976482, -30627948, -97371744, -224212320, -185459376, -180080992, -250747712, --185156576, -54676008, -40101572, -6868190, 87144888, 40252432, -10856067, 54944444, 91399592, 44422308, -42788076, 82849384, 49507552, 37850472, 75315472, 117999928, 49192944, 69087232, 111020608, 18638010, -7406134, 97752920, 57919244, -38123204, 47185584, 60537564, -63869384, -19506130, 70173864, -14703284, --42353748, 90369336, 47950088, -56962540, 48535276, 64142652, -86594056, -81399832, -34810708, -209069888, --276921248, -174123344, -244870048, -326615072, -227492608, -233121168, -300910240, -238358880, -165195712, -179405616, --107215808, 9454834, 66267588, 144245936, 236810000, 294972992, 363720928, 403843968, 441564512, 467922176, -420399456, 330134816, 305214336, 195104256, 58661736, 45617384, -31954020, -151459344, -118860000, -51153060, --112661824, -116146120, -25021942, -82155744, -156194000, -94966024, -68860672, -140171088, -119204136, -42999600, --106066368, -126192584, -10868952, -7496329, -57249228, 21065740, 12053826, -91968672, -68215352, -40386652, --130109056, -179216096, -146507248, -200056896, -247487824, -184275568, -148000272, -140817488, -62255552, 26839788, -72679976, 108129024, 150285744, 169405856, 152055264, 198335680, 255121600, 264124912, 246830160, 251007552, -242315616, 195974528, 221865120, 199703088, 84766008, 8872866, -51882668, -112039592, -118010672, -98192080, --115197464, -113159504, -98137856, -97368520, -103357312, -86001888, -77017352, -74287904, -70239896, -55718612, --52980032, -55573120, -45278084, -32722282, -30918932, -25280178, -14262513, -8874476, -7583839, 3173981, -4186519, 2573759, 5940477, 11767137, 10277320, 12956843, 15501611, 13358959, 8629663, 5589900, -3449396, 3947612, 2647847, 3586298, 2702071, -984084, -5224828, -3391951, -157303, 5545340, -13037910, 21184390, 21923124, 24856586, 30047054, 32565516, 34510600, 40690520, 38627864, 32845762, -29588030, 28043988, 19981798, 17135846, 15855409, 9361418, 2532957, 3197603, -2459406, -9362492, --13837311, -20078972, -30206504, -33157684, -34616900, -36128728, -37577204, -34288872, -32960652, -30710626, --26059714, -19342386, -16582332, -11716134, -8262444, -7092065, -5049271, -410706, 1660542, 5151277, -6913287, 9184788, 9975598, 11004780, 11106785, 11664057, 9825275, 9531069, 8243116, 7568806, -5897527, 5883569, 4462471, 4192425, 2918430, 2924873, 1637993, 1674500, 719407, 1017907, -98247, 421981, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +6171331, -3469260, 1033477, -5156645, 1442572, 577136, 7864085, -4713727, 13959, -2481954, +3939559, 4020090, -2570001, -493921, -2209761, -1271310, -2583423, -3217468, 2364916, 768262, +-2105608, 4383014, 3991635, 6824703, -208306, 2579665, 1351841, -122943, -6180458, 1596654, +2563022, -2446521, 1535988, -1806571, -2101850, -3398393, 1750199, 4350265, 441845, 5077188, +-2086280, -445066, 5122286, 2673080, 405338, -75699, 4864051, 7308961, -5454072, 1206886, +-1890323, -857383, -8485245, -3022046, 3415573, -2646774, 2363306, 1082332, -1255741, -2071248, +1188632, -719407, 2631741, 1417876, 1219771, 1337346, -4412542, 150324, -2128156, 2690260, +4475893, 3131568, -652835, 4845797, 18254, 2045478, -658741, -1098438, 245350, 2420751, +2796024, -937377, -1933809, -3979824, -527207, -1766842, -1890859, -1076426, -1611687, -1161789, +-1895691, -1006096, -63888, -47245, 25770, 1539746, -1099512, 794032, -409096, -783832, +23622, 690953, 242666, 544924, -19864, -550293, -10737, 704375, 221191, -1103807, +-857383, -69793, -11811, 407485, 394600, 30065, 875100, -1112397, 3733400, -4562866, +-4649839, 118112, -6283537, 1104344, -1937030, 3022583, -1639604, -5091684, 632434, 4873178, +-694174, 110059, 6927782, 8572755, -3665218, -4021163, -1065689, -6477348, 2801929, 526134, +1660005, -2316598, 3486440, -4531728, -754304, 3002182, -2456185, -977642, 529892, 5502390, +418222, 3964792, -5244155, 5151814, -507880, 693637, 3434900, -2971581, 2876018, -1381906, +-1286343, 2364916, 3260417, -602369, 1890859, -7096360, 4315906, 4069482, -7397008, -6625524, +-1793149, -5505075, -1464584, 2015950, 1416266, 1922535, 176094, -1875290, 4651450, -1597728, +230318, -1895154, 1143535, -2839510, 3967476, 897111, -2942590, -1740536, -1127429, -1802276, +-1478543, 3894462, 5244692, -307090, -993211, 141197, 1722819, -1138166, 3684008, 1995549, +-1415729, -338229, -860067, 1512902, -1452773, -103079, -335544, 179315, 638876, -149787, +-380105, 921807, -694174, -312996, 270046, 594853, 118112, -1374390, -840203, 193274, +-798864, -785979, 936303, -520765, -1538672, -1094680, -1224066, -403727, 273804, 1484985, +11079942, 2135673, -4117263, 5160940, 641024, -3474629, 10121627, -6782290, -9753871, -5690295, +-5917928, -1968706, 2871723, 3575560, -3376918, 5137855, -6428493, -3478387, -784905, 2150705, +1593970, -1932198, -2529736, 5748277, 1096290, -365072, -3214783, 4299263, -3129958, -696322, +-10737, -334471, -452045, 1692217, 886374, -852551, 3565897, -1652489, 2174327, -122407, +-5820755, -2252174, -2324651, 6222334, -3430068, -4139275, -7556458, -8798241, -1611687, 484794, +-3523484, 6738804, 909459, 3636764, -2702608, 5839545, 2480344, -3325379, 9361418, -4199405, +-4522601, 764504, 5871757, 8637716, 6096169, 2057826, -2985002, -6722161, 2705293, -38655, +6678674, 2726231, -1893544, -184684, 3412889, 2778307, 63351, -588947, 294205, -1282585, +-2793339, -215822, 899796, 747324, 2444373, -33823, 1489280, -461709, 1180042, -241592, +240518, -194884, -1623498, 210990, -279173, -2049773, 1714229, -330176, 1059246, -512712, +-1109712, 217970, 225486, -19864, -716186, 844498, 339302, -491774, -143881, -1555852, +237834, -847719, 846109, -236223, 1782948, -30065, -872415, -711354, -10559177, 1709934, +-3875134, 2504503, 643708, 7614440, -9768903, -5473936, -7183333, 3889630, 3120831, 4655208, +-5137855, 1822677, -1559073, 719944, -7973607, -6687801, -5006858, -4840428, 7962333, -3151432, +-1005559, -70330, 2686502, -1200443, -8465917, 3627637, -3391414, -1024887, 3859565, 3005403, +4436701, 366146, 2355790, -5825587, -2477123, 5372467, 8757438, 5238250, -416612, -6635725, +4754529, -2084133, -5833103, 8093866, 2347737, 2838437, -4961224, -2791729, 2720325, -1729261, +-2774549, 4312147, -3359738, 1556389, 184147, -5498632, -1210644, -3608846, 5842230, 3075734, +-838056, 1089848, -2721399, 3564823, 559956, -9664, 1010391, -6593849, -3504157, 3864934, +1800128, -998043, -882079, -4660040, 7775502, 9742060, 5309654, -4328254, 3937948, 777926, +3358665, -1374390, 2758443, -2023467, 1779727, 3623342, 1883343, 1789928, 1263794, 168577, +-1203665, -295816, 3439732, 281857, 213138, -1196148, -264141, 827855, 2062658, -155693, +2426657, 505732, 47245, 15032, 1967095, 2543695, -1080184, -358630, -289373, 488016, +1727114, 9664, 455267, 241592, 402653, -762894, 2910377, -15850577, 5289789, 799938, +3943854, 4263292, -3092913, -11213086, 8637716, 3662533, 8498667, -1570347, 4504884, -96637, +-3060164, -219043, -7924215, 9683004, 2210298, 907849, -4992900, -2877628, -3383361, 2883534, +-4454418, 7410429, 320512, 2541547, 4130148, 2270964, -483184, 2381559, 2282775, -1751273, +1919850, -8271570, 2137820, 3744675, 3841848, 7393250, 2564632, -4970351, 2471217, -2515777, +5030481, 955630, 3656628, 5620502, 912681, -1258425, 4409858, -3067144, -4818954, -1801202, +3070902, 7794292, -1868848, 466541, 124554, 908386, 1519882, 3248606, 1096827, -2085207, +-385473, -2803540, 1997160, 619012, -4974109, -4394289, 1722819, 2719788, 2740726, 4879620, +-7587597, -4106526, -5536750, 6455873, -2882997, -4064650, 2083059, -3750580, -5415417, -1987496, +129386, 5737003, -2063732, 1828046, -2321967, -1389959, -358630, 1717987, 741419, -1088774, +-900333, 1064615, 2844879, 927713, 1629940, -841814, -569620, 1899986, -102005, 85899, +705985, -1405528, 2537252, -850404, -204011, -1250909, -3294240, -560493, -746251, -296890, +-62814, -1285269, 102542, 2870649, -757525, -341987, -585189, -1144609, 3825742, 16178068, +8454643, 7730405, 11063836, 3117610, 1950989, -6735583, -309238, -12669080, -2383707, 4941360, +3439732, 2349347, 2863133, 3593277, -2840584, -1782411, 7223062, 6675453, 5567352, -345745, +704375, -9025337, -7978976, -2904472, 5675263, 1948305, -1287417, 3214246, -5397164, 584652, +-2829310, 6424734, 4889284, 11221139, -1198296, 4284230, 3408057, -1710471, -5935645, 10561325, +-6187974, -1301375, 4650376, 308701, 2602213, 7635915, -2509335, 2898566, -7402913, -15537044, +-8759586, -5101885, -2195265, 804233, -722091, -3947075, -8493835, -1669669, -6127308, 1931125, +-239444, 823560, -9567577, -4230543, 6036040, 2199023, -470836, -10415833, -9599252, 5731097, +913217, 3519726, -7062000, -5474473, 269509, -2755222, -6040872, -4141959, 3229816, -1210107, +1430761, 517007, 4064113, 3133179, 1324997, -2043868, 1021129, -302258, -2634963, -2418604, +2291902, -950262, 602369, -1537061, -2548526, -350040, -303869, 2243047, -349503, -2035815, +462783, 886911, 2288144, 544924, 469225, -940061, 2891050, -1065152, 3306051, -1808718, +2423972, -2165737, 282394, 1401770, 8590, -89121, 439697, -533650, -865436, -8164196, +6182606, -3642669, -280247, -21214454, -4984847, -7856032, -5162551, 840740, 7015829, -1414118, +9270150, 4879083, -529355, -9134859, -3757023, 13543106, 2284923, -8138963, -5917928, -2700998, +6374805, -4977867, 91268, 4354023, 6933151, 7787313, -8545911, 5740224, 793495, 1609539, +2458332, 3143379, 2765422, 7807177, 227633, 2355253, -6848326, 9572945, -4809827, -2281165, +1622424, -7986492, 9861782, -1582159, -19248970, -6389301, -15454366, 922881, -218506, -4694936, +20974472, -3690451, -10377178, -3544959, -2549063, 9613211, -1316944, 4574140, 5652714, -3956739, +7197829, 9908490, -5044976, 3758633, -8827232, 4283156, -3165391, -2517388, 10196789, -3755412, +-976031, -4555887, 270046, 151398, 3889093, 5735929, 6101001, -1648731, -1731946, 219043, +7901666, 3726958, 4107063, 136902, -6455336, 2571612, -3135863, -3532074, -1931125, -84826, +-182536, 399969, 1432909, 1487669, -381178, 4275640, 693637, 1859184, 745177, 832150, +-1203665, 1121523, 432181, -1285806, -1883343, -1236414, -3237332, -2543695, 2224793, 1781875, +-2741800, 734976, -153008, 759672, 3088082, 648540, -1214402, 329639, 991601, 63351, +-2506650, 1103807, 9598715, -13419088, 2649995, 2782602, -4299263, 1836635, 10096931, 10895258, +3987340, 3913252, 5137318, -8383240, -1510755, -8954470, -238908, 5756867, 3578245, -1870458, +-7157026, -2282775, 4742718, -9290551, 257698, -649614, 4233764, 8877161, 775778, -4765803, +-3706020, 9494562, -6163278, -2934000, 5389110, -3389266, -11283953, -4056060, 2477659, 1902134, +-4559108, 1053341, 5762773, 4033511, 5553393, -660351, 4165582, 8061117, -3637301, 4015258, +3380676, -5514738, 11872363, -11498701, 6765111, 3013457, -16069083, 15287936, -9987410, 2166811, +-1861332, 12196633, -5276904, -8659728, -1939715, 67109, 2113124, 9364639, -8071318, -403190, +464930, 535797, -1540283, 2761664, -6589554, -966368, -4732517, -8645769, -9673340, 5134634, +4060892, 3965866, -23085, 6032282, -2908767, -7017440, 1700270, -12411919, -10452340, -1969779, +2905009, -133681, -2036888, -1629403, 1358283, -6812892, -2390149, -1461363, -1230508, 3113851, +-455803, 483184, 128312, -2266669, 986232, -2544768, 58519, 1149441, -2845953, -624381, +2166811, -1839857, -120259, -1307281, -238908, 797790, -54224, -3775813, -723702, -107911, +-323196, -702764, -2415382, -3892851, -1060320, -305480, -673236, 3038689, 2160906, 352187, +-856846, -10872173, 8650601, -24715390, 13598940, -9931575, -6567005, -12163884, 1469416, -1599875, +2229088, 8413841, -7089918, -2930778, 6943889, 6081137, -1949378, 2267206, -3211025, -11413339, +-988379, 2671470, -5688684, 8916352, 1601486, -1220845, -5327907, -5469641, 1293859, 13826573, +635655, -2126546, 3874061, -12252468, -2051384, 4257387, -8160438, 11592654, 7495792, -581431, +-3572876, -4097399, -4507032, -8198019, -9912785, 8194261, 639413, 14680198, 1366337, -926639, +-6651294, 1078037, -2596845, 3177202, -191126, -9504763, -7297687, -9681930, -16037408, -2388539, +14165339, -13684303, -818728, -14321568, 2276333, 3841312, 3308736, 9963787, -1098975, -14716705, +10468983, -1160178, -7038378, -6025839, -12577812, -4457639, -9561134, 5103495, -14688788, -2595771, +5791764, -256624, 1132261, 6888591, 3594888, 8302709, 47245, -4711579, -1792075, -3272765, +-143345, 2977486, -848793, 406948, 440771, 199716, -2441689, -3716757, 2269353, -2643552, +1104880, 317828, -500901, 986769, 386010, 338766, 5083631, 788663, -290984, 839129, +1612223, 999117, -2548526, -509491, -5371931, 1898376, 2786360, 4092567, 1516124, 1334124, +-83752, -2836289, 1635309, -232465, 10553808, -3863860, 9383430, -9159018, -4854924, 6412923, +2057289, -12361990, 801011, 16071768, -18518288, 1088237, 8651138, 20808042, -8899172, -5300527, +-2281165, 16109885, 15822660, -16734803, -787590, -12859132, -6155225, 8360154, 8415452, 11012833, +6256157, -2199560, 7745974, -9598178, -5173288, -976031, -1479079, -13889387, 1222992, -334471, +18347564, -2856690, 9039296, 2163590, 5355824, 12267500, -7445863, -3340948, -18134962, 12461848, +-15984258, -2868501, 3661997, -2191507, -9236327, -2351495, 2612414, -6600291, 1789391, -1110786, +-1408212, -20414516, -14442364, 965831, -10474888, -14350559, 2626909, -13273060, 4199941, 8557722, +-7779797, 14731201, 3090766, 9433359, 10165651, 2556043, -7565048, -9012989, -11155641, 5664525, +-11575474, 6890738, 8344048, 11461657, 2022393, -8281771, -5289789, 156766, 1101659, -15374372, +-391379, -9985799, -1700807, -2884608, 601832, -7337952, 936303, -1747515, -122943, -4801237, +-3454228, 1035087, 7614440, 711354, -751082, 938987, -1109712, -2929168, -2804614, -3164317, +-1369021, -3739306, 3914326, 2770254, -297963, -3120294, 4653060, 6894497, -1588601, -1338419, +-1688996, -841277, -268435, 1597728, -2696703, 2654827, 2551748, 1638530, -2571075, -523449, +1421634, 1896765, 4790499, -9854802, 25435334, 10605348, 4418448, 13080860, -4990215, 2753074, +-13493177, -17392470, 10977400, 22362820, 6674379, -103616, -22079354, 26670136, 3875134, 3285113, +3846143, 989990, 4842039, 1523640, -3800509, -163209, 6755447, -4133369, 8483634, 1626719, +-6642704, -9243843, -2503429, 8447127, -2292976, 2757906, -3798899, -3388729, 163746, 23929948, +3892851, 3462281, 3253975, 2020245, 14363444, -5343476, 4148402, -9266929, 17108466, 23803246, +6226092, -1371168, -8450885, 24872156, 11711302, 366146, -9603010, 3637301, -5752572, -892816, +-11020886, -4149475, -7347616, -10126996, 16391206, -4912369, 12084964, 2530273, -9387725, -140123, +-20113332, 19137838, -1367947, -9156333, -7132330, -11668889, -14361834, -7865159, 22288196, -6941741, +8039105, 10117869, -8985072, -8563091, -16054588, 2423972, 10846403, 3721589, 10370199, -2385854, +-2035815, 469225, 2954401, -4415227, 1247151, -7997229, 2608119, -366146, 9091909, 6416145, +-4909148, 502511, -266288, 5414880, -1836099, -7189239, 1596117, -213138, -587874, 2688650, +490700, -1114007, -3616899, -4021700, -787590, -944893, 4262755, -141197, 4272956, -5860483, +1403917, 4468377, -8371428, -6052683, 2172717, -4483409, -1199907, -2640331, 6253473, 7545184, +-5621576, -5942624, 23659902, 23226646, 28656558, 17270064, 5679021, -7276212, -7584376, 4305168, +8315057, 10205916, -15249818, -435402, -1828046, 7659001, 6023692, -10558103, -13050795, -34897, +-4952098, 12446278, 14615774, 10737, 7742753, 2570001, 3088618, 16909286, -10327249, -13656385, +10773389, -17889076, 1537061, -5500780, 9873593, 5062693, 171799, 11579232, 10602127, -9628780, +12013560, -6442, -5155035, 2865280, 13051869, -5028870, 5577552, 9706626, 4372814, -20851530, +-12079596, 2078227, 1092532, -14169097, -9707700, 4736812, 6742025, 5762773, -19346680, -13482439, +-13467407, -1043677, 8370355, 12247099, -30727806, -22550188, 3745212, 4745402, 17730162, 6281927, +6494528, 12944495, -1403381, -3288334, -4702453, 31741956, 10950556, -4976257, -16609712, 15190762, +9891310, -4930086, -4523138, 2369748, -4582730, 8128763, -2941516, -1704565, 4751845, -1150514, +-1919850, -2469069, 4989679, 13032541, 71941, 957241, 434865, 5686537, 7239704, -1817845, +-4592394, 1997160, -449898, 1495722, 826781, 1147293, -6191732, -3331821, 4342749, 477278, +-2537252, 2166811, 6051609, 4769025, -8188892, -1797444, -5456219, -5187784, 3837553, -6200322, +2409477, -3326989, 6020471, 4733591, -7230041, -10070625, -19499688, -18974628, -15600932, 6022081, +-2011655, 8806294, -17200808, -2833068, 801011, -6634114, -8050380, 13983877, -5358509, 2833068, +-214748, 974958, -14025216, -5157719, -11993696, 1597728, 1580548, 3118683, 33149094, -12911209, +9153649, 13959181, -7085623, -6680285, -10033044, -2023467, 15483357, -15796890, 10816338, -1031866, +-2636036, 1457068, 1584843, 8494908, 951335, -16757889, 12819404, -10436771, -24060406, -19468014, +-9758703, 32571958, 27630062, -15014132, -4325569, -20613696, -17211008, -6788733, 20116554, 530428, +13874355, 7261179, -9466108, 10586021, -7207492, -21453898, -1821066, -13005161, -2655901, -6964827, +42362872, 396748, -35072704, 27543626, -11114838, -7808251, 27814746, 28284508, 89657, -12369506, +5511517, 6926709, -38087232, -16372415, 1005559, -5586142, 19932944, 8454106, -28896004, -4308926, +-2325188, 13111998, 8325794, 5717675, 5171678, -5999533, 1022202, 2314987, 12079596, -1478543, +1653026, 2393371, 2054605, 7128035, 3357591, 184684, -8268886, 10473815, -960462, -23085, +470299, 40802, -4478041, -6929393, -4787278, 977105, -1741609, 3072512, -496069, -3050501, +3297998, 7743289, -10283762, -3299609, -3158412, -1433982, 2892661, -160524, -2965675, -5742372, +-2204392, -1452236, 5313949, -16953846, -10395431, 5033165, 4089883, 9079024, 28953986, 4885526, +-646929, 6662031, 1599339, -12095702, -7283191, 6373195, 1575716, 23472534, 5655398, -1563905, +8615168, 12556337, 12913356, 13707388, 833761, -9782862, -2600603, -22221088, -2920041, -25078314, +14017163, -15302968, -5800354, -30065, 20307680, -11829414, 11336566, -8340827, 6901476, -10434623, +12989055, 19398220, 1409286, -4235375, -10418517, -15247671, 8547522, 9587978, 24815248, -3467649, +1316944, 10784126, 39697844, -9365713, 6013491, -6534256, -21996138, 15372762, -3088618, 10894185, +-1298691, 2605972, -13226889, 36556076, -54951424, 40371620, -63061932, 27084600, -32500554, 9986873, +-25471840, 9061307, 16990354, -4182761, 12638478, -6610492, 46104328, -28071906, 30629560, -47521664, +23957328, -18728204, 23049478, -15605227, -16677358, -8342974, -4188130, 11450920, -3138011, -2215130, +1201517, 539555, -5873905, 8086350, -8883603, 8552354, -6410776, 2488934, -10225243, -5936182, +-7546795, 1162326, -6937983, 8425115, 9234717, -8929774, -111132, 3276523, 8474507, -1495186, +3054259, 6696928, -6464463, 11214696, -3163244, 14901389, -9004399, 17890686, -12919262, 4414153, +-1048509, 9856413, 8407935, -1874216, 4925791, -14250701, 15940234, -11229729, 3876745, -11414412, +8055748, -15137612, 5097053, -1559610, -5443334, 5290326, -10698764, 1620276, -5255430, 5214627, +-5200132, 2987687, 1881733, 1400159, -4005594, 13980655, 11272142, 44399224, -30859340, 12913356, +8177081, -26672820, -691490, -5250061, -7529615, -13709536, -686658, 1566053, 17726404, 6584185, +9299678, 13278428, 10803453, 395674, 14787036, -17003776, -2401961, 20476794, 2328409, -28113246, +-6416145, -36786932, -6831146, 6411313, -6772090, -8578660, -1557463, 32875290, 8354785, 2515240, +4058744, 8227547, -2437931, -18864034, -5733782, -2096481, 3544422, -4351876, -8770323, 23805930, +12858058, -4925254, -1092532, -5119601, -21489868, -17675938, -12872554, -10734734, 24067922, 5785858, +8907225, -14484240, -14026289, 4521527, 9818295, 9019431, -4033511, -2849174, -16294569, -10792179, +14294188, 643171, -39494372, 13903346, 21599390, 6900939, -17194364, -10597832, -8551817, 2831994, +-12372727, 6123550, -29065654, -38890392, 16123844, 14026826, -7746511, -14299557, 10936597, -6403796, +2850248, 3376381, -5705327, 6222334, -3526168, -3660386, -2085207, 9346386, -6630893, -1967095, +-7256884, -106300, 630286, 6248104, 6493991, -731755, 3833795, -4599373, 7583839, -5276368, +6197101, -14310831, -6497749, -1977296, 4147328, -4681515, -9319005, -7162932, 3423626, 7368017, +-264141, 9521406, 2688113, 3764002, 596464, 6199249, -3499325, 5925445, -1421634, -11787538, +-9059160, -3474092, 5374078, -6626598, 3905736, -9889699, -4350265, 4523138, -36686000, 32114008, +39024608, -3651259, 28363964, 1160178, 4306779, 12372190, -25116968, 9124121, 18529026, 18318036, +7648800, 5673652, -18174154, 13267154, 7766375, -11005854, 5817533, -2190433, 21590800, 5960341, +5489505, 12780212, -5174899, -14738717, 4211216, 27551678, -9921374, -5370857, 24841018, -9154723, +-11187853, -9078487, 8520141, 32004486, 44471700, -2781528, -28937342, 43663176, 14986752, -28777354, +32518808, 12461311, -8133595, -8367133, -12271258, -20282984, -1207423, 10633265, -17444546, -11398306, +-36788004, -5001490, 21328270, -44511432, -24158654, 7015829, 7119982, 8767639, 26941792, 23878408, +-39602820, 314069, 1461363, -28002114, 7761543, 13306346, -14415521, -10263898, -12180527, 8097624, +31026306, 9711995, 16109349, -21268678, 10776073, -24081882, 2050310, -16202227, -65805340, 50267760, +12868259, -18373334, 33983392, -11766600, -15567109, 9132711, 6899328, 8732742, 13252658, 5356361, +-13429826, -4274566, 12999255, -459025, 4964982, 2074469, -2203855, 3173444, -5925445, 4309463, +12139188, 4369056, -7261179, -5362804, 3662533, -3305514, -6595459, 2449742, 7547332, 4382478, +-22805740, -6920266, -16813186, -8733279, 9695352, -7511898, -9427990, 8864276, 5689221, -9863392, +12400644, -9257265, -4100083, 4430796, -7299834, 8149164, -3718368, -13539884, 11138461, -20889110, +24067386, 79678088, -25418154, 678068, 6154688, 35963908, 31936304, -10464688, -13820668, -20120848, +889058, 15223512, -473520, -10294500, -10533944, 14367739, -7813083, -19350976, -17248052, -3506304, +29326574, 20529944, -23252416, 1553168, 464393, -10165651, 11587285, 4263292, -8269423, -2751464, +-6494528, -3129421, 37431712, -13926968, -24785720, -17383344, -14067092, 33063196, 961536, -7667054, +30494804, 20930986, 8367670, 15497316, 29988536, -18204756, 4665945, 29135448, 17082158, 22260816, +-25229174, -7118372, -893353, 10669773, 10094784, -23917600, 2335925, -31425202, -47231220, -2478733, +-12455942, 21973590, 24472724, -6387153, -1884417, 4977330, -17137456, -45779520, 30880278, -22172232, +4822175, -8522289, -15431281, -8960912, -17903034, -36279052, 21499532, 19110994, 23211078, 4499515, +-28795608, -50658064, -14993194, -13990856, -6142877, 16058346, -10311143, -2500208, 3119757, 2188286, +-8004746, -3649112, -6418292, 825171, -2826089, 5401458, -3120294, -3890704, 5941551, 7694971, +6120866, -12218108, 4078608, 746787, -1045825, 198105, -26884348, 1358820, 3790846, 4020626, +-17691508, 11616276, -2482491, -14724759, -12031277, 7243463, 9572408, -1713692, 5712307, -9050570, +-6345814, -6146098, 790274, 11084237, 2858838, 10591926, -189515, 4948876, -15590194, -2356863, +-3685619, -2876554, 12297565, 5901285, -366683, 3959960, 1898376, -12279848, -3957276, -38960724, +-22618908, -18070002, -46261628, 53382684, -1402844, 28199682, -6578816, 1569811, -32300838, -17389248, +-16756278, 3883724, 24978992, -982474, -26388816, -19425600, -37643776, -41528040, 35574676, 13363791, +-32647120, -9906342, 15824270, 29950418, 3980898, -36793376, -22665616, 7452305, 10146860, 9342628, +21383032, -22814330, -22003654, -3183645, -7936026, 3209951, 6229313, -44248900, -8384313, -30813170, +-20039244, -41150620, -15862388, 56761216, 9558450, 1953673, 13680545, 14198088, 4230543, 42223824, +33093260, -10842645, 11107322, 56994216, -15093589, -13108777, -13780403, -42169064, -1840930, -23012972, +-52796960, -54985780, -29125784, -28303834, 12672301, -21154324, 1651952, 11355894, -37687264, -13561896, +21475, 11274, 9456444, 24678346, 16076063, 29724394, 39798240, 29210072, -3796214, -20953534, +-30878130, -2424509, 12465069, 3925600, -4537096, -190052, 8467528, 7217156, 18623516, -1921461, +2779381, 539018, -6507949, 6371047, 747324, -2822867, 15880105, 7185481, 3428995, -14875082, +9932112, -5191542, 7435126, -14093935, -39982924, -1625645, 15472620, -2723009, -21327196, -13293461, +-15667504, -11388643, 4815732, 7201050, 7665443, 2429341, -1627793, 6204617, 15347529, 26271242, +24325084, 30815316, 25914758, -2175401, 17366700, 40119828, 2638721, -17110612, -25095494, -24720758, +-34323768, -27347130, -13429289, -14477261, -2214056, -4151086, 35050692, -22859964, 6781754, -26508002, +-9223442, -28928216, 3548717, 35430260, -1003412, 21950504, -43813500, 38483444, 12647605, -7721815, +30185030, 4391604, 13613973, -12030203, -14565308, -153008, 9088688, 7252053, -30684320, 28070296, +-33983928, 4240207, 9207336, -11357504, 19650012, -20883204, -12166569, -2225867, -7740605, -10534481, +-2604361, 4581657, -15851114, -18294414, -6223408, -3144453, -4787278, 11227045, 5783174, 4608500, +-22572738, 5985574, 26818312, 35990752, -26812944, -13313325, 30254824, 41834056, -25651156, -15637439, +17308182, 7427609, -20447802, 16733193, -47601660, -9290551, 18930068, 37804840, 4577899, -23433878, +-21544630, 5739687, 44940392, 3947075, 6432251, 1352915, 14666776, -2913062, 33291366, -385473, +-37615860, 23480586, -24679956, -7477538, 9919227, -14251238, 3007551, -30353070, -11696270, 28069222, +12543452, -12641699, -18416282, -9903121, 1937567, -14672682, -4831838, -3284576, -9383967, -5558762, +-4756140, -19047106, 11582453, -7168838, -8863739, -27567248, -7379828, 20133196, -14442901, -7812009, +-7750806, -15792058, 29765198, 12311524, 696322, -1096290, -17263084, -25268366, 1138703, 22395570, +17996986, 6083821, -19404662, -11176042, -8938364, 10859288, 1519345, -16952772, -4663261, 967978, +6137509, -15095736, -10578504, -8957691, 22959822, 11909407, 1003949, -14666776, -13122199, 13036299, +27690728, -404801, -12677133, -17481590, -6432788, 7741679, 68183, -4097399, 447750, -3543348, +-3233574, 2617783, 8378945, 125091, -1859184, 48855, -76773, -2177549, 519154, 75162, +191663, -3031710, 1941862, 419833, -57321708, -15415711, 9221832, -18843096, 55827596, 41513008, +26599270, 14685030, 37533184, 27132920, 8519605, 18585398, -45026828, -59628104, -8739722, 894964, +-15833934, 8340827, -3267933, -15341623, -20066088, -15717970, 30667678, 27357332, -22049826, -2464774, +-3418794, -5121212, -8097087, -10966662, -16786342, -22630182, -4780836, 40842992, -13355738, -22192096, +-11145440, 38356204, -18158048, -17158932, 58474368, 21268678, 9524090, -13990856, -32719598, -22251152, +-33735896, 9353365, 27151710, 74674448, -65690452, -27365920, 37956772, 53410604, 8895414, -2776696, +67768680, 33017024, -21860846, 22087944, -8207146, 647466, -47544216, -23404350, -16848082, -76951320, +-33165200, -12060805, 41294500, -22103512, -13389561, 31493384, -2421825, -3690988, 7082401, 22299470, +-21486110, 15897821, 23305566, 1000727, -4853850, -43220256, 19803020, 16124381, -50836308, -3177202, +5117991, 3758097, -4643934, -21925272, 5622649, 4302484, 5957657, -3048353, -6825240, 16648367, +3101503, -2864743, 10788421, 5122822, 29329258, -3553012, 9390409, 2387465, -23907398, -20018306, +14072997, -10914586, 8422431, 11599096, 6535867, 7361574, -141734, 20131586, -6596533, -4389457, +-8074002, 6151467, 14944339, -22482006, -8893267, 11575474, 4802847, -12507482, -23797876, -5470715, +6116571, 49370112, 18023294, -4037269, 12719546, -2421288, -4625680, -18086644, 8655970, 7608535, +-14391899, -6896107, -52210160, -2034741, 21417392, -4948339, -21804476, 9610526, -4941897, 23556286, +4633733, -11270531, -235686, 25215216, -14352170, 4140349, 9021579, -7541963, -272730, -13486197, +27685896, -1561758, 4079145, 550293, 13356811, -5961952, -5266704, -8560407, 5499169, 10536092, +-4612795, 12497818, -5404680, 7746511, -13052942, -10131828, 15756088, 20378546, -26212186, 1345399, +-1611, 2577517, 8214125, -16341277, 25228638, -22499724, 20300162, 2976949, -35357244, -1793686, +27542552, -35822176, 17129940, 294205, 4621385, -8493298, -5410048, 7408819, -10453950, 36969468, +-27264452, 4219806, -7330973, -3155190, 9063455, 667331, -4488241, -691490, 11119133, -190589, +-12795244, 3760781, 6471979, -21231634, 16630113, 7678328, 771484, 15512348, -5628555, -4576825, +7214472, 3526168, 4573604, 2784750, -4242354, 8842264, 3722126, 824097, -9366787, -1360431, +4566087, 8492224, -14210973, 7625178, 8845485, -12359842, 5952288, 2040646, 2134599, 6827925, +-3738232, 1685775, -2343979, -18001282, -276489, -4190278, 7953743, -4912369, 3036005, 2219961, +-752156, 2655364, 4609037, -2786897, 4832, 1056025, -130460, 1557999, 5534602, -5399311, +5185100, -3871376, -26125212, -74351792, -105827456, 35454956, 94358288, 20614770, 261303120, 214914256, +145441008, 245756960, 128209072, -8976482, -30627948, -97371744, -224212320, -185459376, -180080992, -250747712, +-185156576, -54676008, -40101572, -6868190, 87144888, 40252432, -10856067, 54944444, 91399592, 44422308, +42788076, 82849384, 49507552, 37850472, 75315472, 117999928, 49192944, 69087232, 111020608, 18638010, +7406134, 97752920, 57919244, -38123204, 47185584, 60537564, -63869384, -19506130, 70173864, -14703284, +-42353748, 90369336, 47950088, -56962540, 48535276, 64142652, -86594056, -81399832, -34810708, -209069888, +-276921248, -174123344, -244870048, -326615072, -227492608, -233121168, -300910240, -238358880, -165195712, -179405616, +-107215808, 9454834, 66267588, 144245936, 236810000, 294972992, 363720928, 403843968, 441564512, 467922176, +420399456, 330134816, 305214336, 195104256, 58661736, 45617384, -31954020, -151459344, -118860000, -51153060, +-112661824, -116146120, -25021942, -82155744, -156194000, -94966024, -68860672, -140171088, -119204136, -42999600, +-106066368, -126192584, -10868952, -7496329, -57249228, 21065740, 12053826, -91968672, -68215352, -40386652, +-130109056, -179216096, -146507248, -200056896, -247487824, -184275568, -148000272, -140817488, -62255552, 26839788, +72679976, 108129024, 150285744, 169405856, 152055264, 198335680, 255121600, 264124912, 246830160, 251007552, +242315616, 195974528, 221865120, 199703088, 84766008, 8872866, -51882668, -112039592, -118010672, -98192080, +-115197464, -113159504, -98137856, -97368520, -103357312, -86001888, -77017352, -74287904, -70239896, -55718612, +-52980032, -55573120, -45278084, -32722282, -30918932, -25280178, -14262513, -8874476, -7583839, 3173981, +4186519, 2573759, 5940477, 11767137, 10277320, 12956843, 15501611, 13358959, 8629663, 5589900, +3449396, 3947612, 2647847, 3586298, 2702071, -984084, -5224828, -3391951, -157303, 5545340, +13037910, 21184390, 21923124, 24856586, 30047054, 32565516, 34510600, 40690520, 38627864, 32845762, +29588030, 28043988, 19981798, 17135846, 15855409, 9361418, 2532957, 3197603, -2459406, -9362492, +-13837311, -20078972, -30206504, -33157684, -34616900, -36128728, -37577204, -34288872, -32960652, -30710626, +-26059714, -19342386, -16582332, -11716134, -8262444, -7092065, -5049271, -410706, 1660542, 5151277, +6913287, 9184788, 9975598, 11004780, 11106785, 11664057, 9825275, 9531069, 8243116, 7568806, +5897527, 5883569, 4462471, 4192425, 2918430, 2924873, 1637993, 1674500, 719407, 1017907, +98247, 421981, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 4089346, -9670656, 198642, 363462, -4604205, -3747896, 2832531, 1675037, 285078, 3923453, -5948530, --2070711, 9721658, 619549, 1917166, -2590939, -3243774, 4515085, 3839701, -1640141, 3779034, -116501, 638876, -3739843, 1357747, -3409667, -2600603, -3349538, 1151051, 89657, -1051193, --416075, 1158031, 2838437, -1352378, -5312875, 115964, -3800509, -4776541, -1304060, 2189897, --783295, 1956895, 1182727, 1795833, -801548, -651224, -948114, -752693, 1577327, -31675, -3289945, -424128, 4084514, 711354, 889595, 3953518, 1355599, 1030792, 5037997, -2042257, -1635846, -1742146, -3639448, 3323768, -1236951, 33823, 1173063, -578747, -3030100, -896038, -2102923, -1367410, -121333, -2873870, 1353989, 217433, -1979980, 257698, -3131568, 487479, --3005940, -242666, -86973, -374199, 1665374, 848793, 403190, 964757, -369367, 1751273, -1207960, -119722, 338766, 407485, -109522, 84289, 527207, -703301, 350577, -904628, -745177, 106837, -192737, -18790, 607738, 190052, -652835, 230854, -79994, -328565, --962610, -12741020, -6609418, -2979634, -2759517, -16106, 37581, 943282, 185757, -717796, --5212480, -2369748, -5341329, -8377334, -6990060, 3947612, 4878009, 4926328, -1933809, -584652, --547071, -1101122, 1822677, 758599, -1772748, -3795141, 2743947, 2335389, 3426310, 895501, --1138703, -2076080, 980863, 1634235, -376883, 3473555, -1675574, -93416, 3386045, -2576444, --4082367, 331249, 5680631, 1307281, 1269163, 798864, 65498, 732292, -859530, 1014686, --4458713, 737124, 4663798, -1056025, 87510, 469225, -1566053, -878321, -623844, -746251, --1221918, 2852395, -2645700, 2799782, 2398202, 5228586, -339302, 2944737, 6684043, -1216013, --5344013, -6003828, -264677, -772557, 350040, -5092221, 1507534, -3570192, -2640868, 1243393, -3754875, -1517197, -2816425, -3387119, -636192, -355409, 967978, 320512, 2172180, 1287417, --88047, 1102196, 343061, 2135673, 1631014, 1028108, 492311, 484794, -337155, 1438814, -102005, 449361, -138513, 55835, -1031329, 26307, -169651, 8912594, 6919729, 3031173, -3518115, -2247879, 1559610, 6182606, 2946348, 6653978, -2619393, 2720325, 3726958, -126702, -4793184, -2442763, 2978560, 615791, -3145527, -723165, -632434, -129386, -926102, 426276, --1601486, 551366, -1184337, 6093485, -1433445, -267362, -62277, -2654827, -7711614, 4427038, --1865090, 1750199, -3090766, -2814277, -3302830, -2092723, 1946157, 5850283, 4516158, 1988033, --375273, -1175210, 1788854, 4224637, -969589, -1297080, 5101885, -2212982, 2418604, -2497524, --2059437, -1161252, 1869385, 2108829, -3665218, -2420214, 51540, 3939559, 4964446, 2790655, -3859028, -467078, 3611531, 1510218, 3795677, -2092186, 1493038, 8865349, 4049081, 3804804, --951872, -2399276, -6045704, 3554622, 1449552, -2400350, -2534568, -740882, 1779727, -1746441, --891206, -1563905, 4832, 1334124, -585189, -2392297, 663572, 928787, 1366337, 1540283, -148713, 2149631, 969052, 940061, 588947, -599685, 1409823, 215285, -56908, -630286, --1133871, -1105417, 236760, 932545, 299574, 136365, 210453, 10737, 1260573, -1712618, --479963, 626528, -769873, 801548, 2697240, 10166724, 1447941, 3688303, 7362648, 137976, --4211753, -1808181, -1266479, 286689, -2655901, -7231651, 2896419, 237834, 151398, 3014530, --4800163, -2222646, 7542500, -1858647, -2858838, -4481799, 144955, -4236985, -715112, -1421634, --1281511, 529355, 6088116, -210453, -1925756, 1774358, -4861903, 6489696, -843424, -1479616, -8118562, -4704063, 371515, -5556077, -2547989, 451508, 241592, 2107218, 2549600, -4963372, -1453310, 2047089, 1665911, 449898, 2312840, 1668058, 3385508, -3154654, -1692217, 6390375, --2692408, 2423972, 588947, 1814087, 1634235, -577673, -2199560, -369367, 4508642, -2732673, --325881, -1469416, 1023813, 4010963, -2301566, -5086852, -9780714, 570157, -431107, -879931, -9127, -3791919, -2658048, -5482526, -2173790, 2663417, -122943, 1639604, -679679, 3342022, -2314451, -79457, 1725503, -185757, -244813, 1125281, -2151242, -1182190, -1753420, -64961, --2087354, 1168768, -111669, 527207, -799401, -715649, -124554, -796180, 433255, 713501, --1939178, 846645, 729608, 386010, -1851668, 898185, 601832, 1648731, 1763621, -228707, --666257, -1012539, 858457, -544924, -376883, 268972, -295816, -1200443, -4437775, -10857677, -5470178, -3547106, -6245956, 315680, -11696270, 2549063, 3526168, -1253057, 8476655, -3228742, --10295037, 2490007, 3851512, -3540664, -7296076, 12425877, -820876, -714038, 3107946, -2715493, --1631014, 1291711, -6113349, 3583077, -688805, 1777043, -1316408, 5822365, -1512902, 3274376, -2809982, -5704791, -2857227, -3205656, 5906654, -2942053, -1828582, 4546760, -1628866, -3344706, -2573222, 8320963, -4268124, 4066260, -4408784, 5478231, -3064459, 2897492, 496069, -2913062, --8551817, 4773320, 6061273, -549756, -2011655, 3540664, 4229469, 4187593, -5907728, -643171, --5219996, -450435, 1751273, -3576097, 1320703, 4072166, -4373888, -66572, 759672, -4094178, --3076270, 3888019, -2831994, 3080029, -1869921, -5265630, 1000727, -5104032, 1254131, -1911797, -1714766, -5623723, 5132486, -4230006, 448824, -3929895, -222801, -209380, 978716, -382252, --120796, -1202591, 1278290, -3794067, 1245004, -3100430, -2627446, 112743, 2204392, 1137093, -322659, 761283, 41339, 1418413, 2829310, -2423435, 2332704, -1549410, -442919, 1601486, -1125281, -1705102, -132607, -4410932, 5568425, -6135361, -6083285, -10435697, 4391067, 11014444, -1675037, -1986959, -956704, -1866163, 9593883, -5768678, -5251672, -1251983, -5790153, -1790465, --6291054, -2727304, -4418985, -8743480, -2459406, -1939715, -316217, -974421, 2254858, 5191542, -1848983, 2562485, -8031589, 977105, -142808, -2529199, 2769717, 1466195, -2353105, -1051730, --5724118, -6349573, -940061, 7001334, -2073396, -3628711, -789737, -2360622, -4948339, 64425, --5167383, 10513543, 8865886, 2279017, -2733210, -2486249, 909996, 1565516, 1799054, 1714766, --662499, 3899830, -3740917, 1713155, -3294777, 79457, -61740, 2179159, 1515050, 4920959, --2166811, -3059091, -2796024, -11462731, 329639, 2360085, -1184337, 4123706, 1764158, -3466039, -964757, -6029061, -2263985, 473520, 4566087, 1934883, 6258841, 1239098, -790274, 10737, -2295123, -2632278, -368830, 574452, -1120987, 1582696, -2298881, 1158031, -1762547, -1433445, --325344, -1956358, -1935420, -2388002, -1290101, -717796, 1720671, 1443109, -1799054, -2528125, --811749, -1940788, 1272921, -2161979, 993211, -1270237, -406948, 2097018, 91805, 1749125, -1155346, -1144609, -1114544, -10872173, 1846836, 10875931, 10450729, -11224897, -10047539, 2519535, --7974681, -4393752, 1258962, -671089, -3202972, 8227547, 3784940, -11851425, -862752, 593242, --20938, 7398618, 2877628, -5563594, 7988103, 2838974, 1123671, -4342212, -4428112, 3274376, --2812667, -8062191, -1370632, -1143535, -3476776, -4854387, -6340446, 6726993, 557809, 905701, --4369056, 6442, 4922570, -3924526, -7998303, -8288213, 8665633, 1826972, 8184597, -1394791, -2398739, 5869610, 12230456, 3820910, -1452236, -6307697, -2591476, -3195993, 1919850, 555125, --4767414, -2068564, 7140920, 4889821, 9676024, 4393215, -6570226, -6458020, 8017630, 4123169, --4106526, -54761, 8256001, 536871, -389768, -6460705, 7094749, 5161477, -1181653, 9676024, --1395328, -2921115, -10153303, -1452236, 577136, 5340255, -6987912, -538482, 3212636, -1825361, --5010080, -4864588, -578210, -576599, -864899, -6055367, -5200669, -3223373, 1964411, -213675, --2359011, -914291, -264677, 425202, 558346, 785442, -442919, 1906966, -1587527, -516470, -112206, -1283658, -3874061, 164283, 2350421, -812286, -3412889, 200790, -773094, 1141924, -268972, -536334, -244813, 1046898, -468688, 2019172, 1161789, -163209, -1855426, 1334124, --1447941, 1348620, 1791538, -4408247, 1742683, -1649268, -892279, 5393942, -8991514, 5403069, --5897527, 1061394, 4706748, -63888, -2401424, 1758789, -6177237, 242129, -4814122, -13953812, --4277788, 5894843, 3806415, 2141578, -3406446, 2836826, 1260036, 14880988, 2541010, -5057861, -5521718, 1074279, 1159104, 9884867, -2877628, -2808909, 3418257, -7006166, 8370355, 7730405, --215285, 4361540, -1666984, -4301947, -594853, -5400385, 411243, -5289252, 2013803, -104690, -1477469, 576063, -9067213, -1889786, -1207423, 469225, -4592394, 1936493, 1957431, -1767379, -11857868, -5233418, -10628433, 6281390, 10362145, 2327872, 2642479, -4632659, 8883066, -3084324, -1452773, 3975529, 1122060, -4086662, 4211216, 1806571, 461172, -66572, -8210367, -2921652, -3953518, 7207492, -2860448, -5401995, -7476465, -2461016, 2447058, 1328756, 3661460, -9199820, -1672890, 6126771, 760746, -396748, 2311766, -1952063, -1092532, -296353, -549219, 3194382, --962610, 987843, -1015760, -711891, -759672, -2383707, -1372242, 1068910, -1695975, 2185065, --408022, -443992, -1132261, -1359894, -7008313, 611496, 3662533, -230854, 1240709, -713501, -2247879, 731218, -1418950, -1649804, 1232119, 30340186, -8278013, 134755, -3016678, -1991791, --6721624, -200790, -17757006, 9200357, -6351183, -498753, 10353019, 5041218, -6790344, -7387344, --2699924, -6324340, 5713380, -14777372, 2766496, 6051072, 8474507, 1607392, 2558727, 289373, -1419487, -1998234, -4583804, -13511967, -1943473, 1653562, 6236830, -4903242, 6015639, 2274185, --2406256, -920734, 4668630, -4931696, -4566087, -2711198, -3479461, -583042, -11873437, -5634460, --2801929, -394063, 9482751, 2050847, 9048959, 3040300, -370978, -5719823, 731218, 498216, -1414118, 3054796, 12668543, 1413581, -11779485, 2989297, -4594005, -392990, -4417374, -5054103, --2297271, 4773320, 3172370, -21000242, -7815767, -6292664, 4008278, -964757, -4453881, -2948495, -11860552, -4918275, 9123047, -8619999, -6390375, -9328669, -5011690, -9912248, -1499481, 13092671, -3119757, -1651415, 1613834, 5528697, -73014, 6830072, -3841848, 2593087, 3895535, 4613332, -1887638, -890132, -9086003, -3449396, -4647692, 2684, 2996814, 2488934, -1806571, -722091, -3889630, 1536525, -2971581, -1327682, -2071785, -995896, 208306, 1922535, -1559610, -1629403, -4940286, 4071629, 1347546, -641024, 1817308, 3322157, 294742, -3058554, -250182, -3118683, -830539, -2805151, 1671816, 5027259, -1581085, -4653597, -5139465, 3844533, -9520332, 592169, --22202296, 5401995, -7279970, 2170032, -7567196, -16367583, -2536715, -3808562, 11603391, 4926865, -4168266, -391916, 15403900, -11589432, 2815351, 4378719, 11897059, -13727789, -7847979, -2721936, -1117228, -923955, -3913789, -1280437, 4099010, -7397008, 1493575, 4364761, -863825, 588411, --5982890, -6840273, -4247723, 18428094, 149250, -4492536, 7153268, -4438849, -9295920, -7610682, --5047661, -1343788, 3250217, 671089, 616865, 10225780, 9337259, -1701881, 3313031, 2245194, --11849815, -8131984, -537408, -960462, -3121368, -8082592, 9885941, 11955578, -9841381, 6447820, -6041945, -1935957, -9409200, -15160698, -14708652, -11339787, -6699612, -13087839, 1158567, -10719165, -6381248, 5751498, 919123, 105227, -18296560, 1170379, 302795, 1320166, -9398462, 3117610, -10336913, 1369021, 2591476, -8299488, -5168457, -1044751, -8761196, 1999307, 5378373, -2605435, --3285113, -4037806, 3337727, 5492190, -9728101, -5332739, -532039, 6418829, 2336462, -2853469, -2208150, -378494, -164819, 2863670, -1923072, 3700651, -4357781, -1555852, 3067681, 2684892, --1136019, 7205345, 393526, -4592931, -3935801, -699006, -3256659, -2925947, 310848, 1994476, --1431835, -1533303, -9078487, -7632157, -5282273, -5974837, -1884954, -13559212, 589484, 14780593, --5228049, 7776039, -3131568, 14734422, 12481175, 5137318, -15354508, -3969624, 20463372, -5334887, -15163382, 2335389, -14585172, -7426536, 17134236, 320512, -11568494, 220117, -9868224, -1405528, -3452617, 1356673, -1999844, -17161616, -15228880, 4142496, 10964515, -9826348, -893890, 4233764, --767189, 1626719, 18234284, 3310346, 2627983, 1529008, 6005975, -8140574, -5763846, -4203699, --19286014, -6585796, -7258495, -5036386, 5048734, 3345780, -1250909, -1966558, -7649337, -11589432, -15032386, -3293703, -13269838, -6249178, 2660195, 10044855, -8029442, -2550674, -8519605, -1640141, --10173167, -1998770, -2190970, -20428476, 1840930, -6910603, 14091788, -3682398, -11502996, -21665426, --14283987, -2739652, 1768990, 7551626, -5617817, -5155035, -11804181, 10750303, 18205830, 1895691, --2181307, 6172405, -4780836, 6829535, -5158793, -2514167, 2331094, 5216775, 3769371, -6395743, -209380, 1301912, -94489, -481036, -1608465, 1697586, 6465537, -2738042, -5694053, -272730, --1278290, 2940979, -46171, 6268505, 439697, 2277407, 228170, -3882114, 1019518, -1569811, -6766721, 367220, -4292283, -842350, -1029718, 4492536, 466541, -4979478, -739808, 3453154, --1586990, 817118, 7108708, -24982214, -12676059, -8630200, -13579076, -7350837, -5524939, -14191646, -14915885, -4357781, 22486302, -11377905, -16869020, -3350611, -11305965, 19247360, -6586333, -10237055, --4655745, 5119601, 9874667, 8371965, -1977833, -2322504, -4363687, 2071785, 15976205, -479963, -1581085, -5180268, -1946157, -8390219, -2659659, 3641059, 2806224, -6945499, 397284, -10251013, -2113124, -3100967, -2982855, 4110821, 2008971, -4801774, -1832877, 8661338, 3346317, -7269769, --9425306, 15800648, -682900, -25295210, 13204877, -2851322, -10652593, 5035313, -1485522, 1108102, --2388002, 8731132, 3466039, 850404, 24320790, 23890756, -8378945, 2565706, -17926656, -3872450, --3390340, 7596724, -2685965, 1195075, 7460358, -5492190, 13920526, -5901285, 1592896, -18807124, -7862475, -4929549, -13059922, 6548752, -2966212, 26368414, 6362457, 4989679, 9845676, 1047435, --9147207, -780610, -3728032, -2313377, 2723546, -3316252, 5458367, 3254512, -3958349, 6686727, -3895535, -4461398, -1077500, 358630, 763430, -1856500, 1522566, 2317135, -549219, -2023467, -548145, 2055679, 1332514, 1546188, -4155918, 4268661, -8412230, 7514582, -4903779, -2967286, --479426, 3897683, 5729487, 1464047, -6357626, 19864, -2503966, -1593970, 1656247, -6252936, --11169062, 3275450, 30045980, -22536230, -7105487, -14271639, -9365176, 11325829, -12837120, 27477590, --3127273, 8386998, 1628866, 6669548, -16990890, 3126736, 4595615, -1269700, -2462627, -1505923, -5163625, -10506564, -6257231, -1491427, -2859375, -12983686, -11415486, -3093987, -5215164, 15683073, --3965866, -7434589, -5251135, 5392869, -7932805, -3409130, -13818520, 6531035, -5201743, 5756330, --4808753, 7319698, -3606699, -24046448, -12123082, 3554622, -1746441, -1468342, -7371238, -14318884, --692027, 6313602, 4375498, -3252901, 4855998, 7371775, 22940494, -9778567, 10940892, -25661892, -1755568, 3773129, -2910377, -7369090, 5346161, 968515, 1331440, 5768141, 18272402, 12305618, -9434969, -4855998, -5704254, 8977019, -10779831, 2695092, 9322227, -6492917, 22830436, -342524, -7191386, -6180458, 13234405, -12441983, -12108587, 408559, 4746476, -5615670, -1217086, 14176613, -287763, 12909061, 4873178, -1983201, -1880122, -7348689, -432718, -377420, 3801583, -464930, --5752572, 1041530, 2825552, 7328288, -10509785, 1858110, -5250598, 2272038, 6267968, -2070174, -5906, -5556077, 2011655, 2100239, -3434900, -12836047, -7870528, -5059472, 2677375, -6770479, --3674882, -4531728, -3895535, 2612951, 5157719, -112743, 4314295, 1613834, 2391760, 785979, --9096741, 7920994, -6659347, 12236899, 35274568, 25327422, -6951942, -15535434, -10862509, 21734146, --25802552, 1564979, -6694781, -6085432, 10261214, -18573050, 2294050, -9408663, -446677, -12867185, --10283762, 1710471, 471373, 712428, -12822625, 20286204, 3857954, -8807904, 3428995, -2472291, -1548873, 30151744, 9250286, -8184597, -7582228, 1635846, 9077413, 2688650, -22629646, -5337571, --15713675, -4995047, -7475928, 7747048, -4403415, -1952063, -374736, -595927, -11214160, -12582644, -8081518, -4658429, 2019708, -425202, 10924249, -8886824, -6711424, 3011309, 4426501, -11822434, -13151727, -8218957, -19769734, -18041010, -6750078, -5057861, -8139500, -3912178, -28010702, 9971303, --13421773, -4012573, -11247446, 15561740, 4749697, 7532836, -258235, -2196339, -13683766, -3894999, -17871896, -14762876, 21709450, 16938814, 5636608, -3791919, 500901, -2937758, 2897492, -9543954, --8068096, -4680441, 1076426, -1165010, 1130113, 4265440, -7317551, -1590212, 6831683, 7562364, --3179350, 4762582, -4202089, -6176163, -3070902, -1831267, 4425964, 1417876, 1494112, -6107981, --4382478, 2313914, -2598992, 2161979, 2332704, 4600447, 8518531, 3650185, 4658966, -5772436, --3684008, -1885491, 2313377, -2736968, 911070, -2523293, 963683, 9074192, 3937411, 2563022, --1992865, 5759551, 1501628, -2201708, -35114040, -4214437, 23206246, -28475096, -11485279, -570694, --8849780, 10491531, -6037114, 32450626, -3329674, -6900939, -5426691, -1300301, 9401147, -6294275, --6300717, 26508538, -19383188, -2218888, 6091874, -4139812, 16460999, 9441412, -1189169, -1936493, -6971269, 9512816, 10176388, 8504035, 17431124, 5701032, 7488276, 4681515, -5685463, 29353954, -3661997, 5593121, 7371775, 4487167, 21081310, -1369558, 5197448, 7408282, 6091338, 3584150, -13910862, -8100309, -6648610, 13990856, -2549063, -13846438, -3593814, -24312200, -8317741, -4554813, -23147190, -21770652, -2834142, 1093069, -752156, -1118302, 13651017, 37536940, -6526203, 4835060, -4276714, 5817533, 17840758, -19186156, -19849728, -17893370, 31844498, 2508261, -11976516, 29390998, --11148124, 25645250, -13721347, 9936944, 1081795, -33741264, -4923643, -8315594, 9715753, -540092, --2916283, 382789, 6110128, -743566, -10275172, 5708549, 158914, -4627828, -88047, -8850854, -12140262, -1132261, 4364761, -5583995, -5192079, -4970888, -6878390, -469225, 207232, 11756399, --512712, 1467268, -4622996, 1480153, -10961830, 3685619, -10564546, -1764158, -2275796, -9249212, -5017596, -7279433, -7509214, 1858110, -10478110, 3431142, 8396661, 8038568, -3938485, -3479461, -2031520, 3391414, 7302518, 9520869, 545461, 20874614, 1749125, -20756504, -61588756, 12452184, --14897631, -23613730, 26482768, -15803869, -8343511, -23251880, 5937793, -4486630, -22993108, -7257421, --13706851, 6557342, -12703440, 785979, 4769025, 10454487, 5104569, 17587892, 2617783, 51003, --1932735, -14482630, -11378979, -10260677, 8322036, 13194676, 5930813, 4806606, -497142, 5207648, -10085657, 23977192, -11390253, -6085969, 4052302, -10630044, 11330124, 2671470, -10536629, 24401320, -8721468, -20201378, 7933342, -19425600, 2201708, 3931506, 10205379, -5388037, -6744710, 30976914, -11843909, -13054553, 7920457, 16475495, -12751221, -26660472, 14793478, -1970316, -420907, 2394444, -6425271, 41853384, -3986267, 5401995, 7873749, 59056, 9469329, 5789616, -22213034, 4886062, --11866458, -10087268, -6294275, 5234492, -35806604, -4151086, 11046119, 1962263, 17650704, -12850005, -12475269, -8326331, -3831111, -4602595, 5535139, 2667175, -4465692, 229781, -99858, -6131603, -4958003, -7791608, 8310225, 1320166, 5761699, 5177583, -3699041, -2774012, 1383516, -2030446, -1132798, 2143726, -3594888, -1073742, -4118337, -2633889, -2733747, -6966437, 44560, 1188632, -4075387, -2117419, 3921842, 9906879, -5184563, 1778117, -5202279, 2754148, 2993055, -7999914, --6979, 2811593, -7828652, -3664144, 6634651, 244276, 1242856, 1668595, 158377, 183610, --19000398, -21881784, 46933792, 10034654, -3016141, -5646809, 10602127, 42410656, 19473918, 5087389, --1202054, 14232985, 35439384, 8833137, 12241194, 11068668, 25282862, -16245714, 16391743, 7303592, --48431660, 14398341, -6809134, 14414984, -15045270, 11447698, 7623030, 15109158, -62814, 6442451, -2420751, -13697724, 6922414, 13702019, -11376831, 6921877, -11041287, -6613176, 34827888, 3626563, -30849140, -21818434, 9664213, -1038845, -4319664, -602906, -2586107, 4871567, 11370926, 7917772, --761283, 17679696, -27928024, -26318486, 19268834, -14932528, -3768297, -3412352, -18014704, 9247601, --4663798, 5271536, 2928094, 29902636, 14586246, 15817291, 6019934, 4336843, -26961120, -6109591, -13458817, -125091, 476205, 106837, -8551280, -23431730, 4655208, 2316061, -17493938, 2634426, --8324721, -6828461, 7562901, 5133560, 26894012, -3681861, 6962679, 6540699, -4978941, -6750615, --579284, -6405944, -2355790, 15911780, 6760279, 3015067, 970126, -124017, 563178, -28991, --747861, -10517838, -3074123, 6710350, -1671279, 840740, -3763465, -5213554, -1997697, 1926830, -12991202, -8322573, -8021389, 7719667, 3904662, -9363566, 6975027, 4283156, -6559489, 8755291, -938450, -4898410, -2149631, -3322157, -1367947, -1410897, 4486630, 2374580, 2370285, 5102958, -7320772, 5495948, -1112933, 3987340, 12480101, -42824584, 36589900, -15580531, 7480223, 23197656, --33683280, -1162862, -2409477, 8018167, 13283260, 14513768, 26002268, 4047470, -15828028, 8788040, -27671938, -38747048, -22075596, 25621628, 1915555, -431644, 1817845, 1988033, -93952, -885837, -13828721, 7893613, -17876190, 965831, -4579509, 31957778, 20080582, -6773164, 2581812, 3674345, -4644471, -399432, 12338904, 991064, 9636833, 32650878, 5194763, 3287798, -4294968, 8264591, --30544196, -13678934, -12442520, -1551020, 3988951, -27696634, 11502996, -24593520, 8915278, 25208774, --4912369, -22953916, -11615202, 9313637, -3852586, -46733540, 13348758, -32648194, -6500970, -4153770, -1655173, -13145284, 3887482, 16331076, -12919798, -31003222, -45891188, 36230196, 11610907, -5759551, -10925860, -11046119, 11644193, 20083268, -20358144, 36045512, 5540508, -3873524, 17335024, 9491341, --5237713, 9302899, 1266479, 10051297, -9194451, -5210332, 3315178, 7276749, 13128104, 3740380, -11901891, -7446400, 7029251, 11762305, 11038066, -1701881, 10113037, -10131291, 4679904, 1021665, -5014911, 19622094, -12401181, 7849590, 1736241, -657667, 15941308, 4263292, 20585242, -2517925, -10525891, 2715493, 8460012, 2341831, -3376381, 6087043, -9557376, 9016210, -3076270, 7500087, --1019518, 2132451, -81604, 1650878, 613643, 7875897, -987306, -1721208, -265214, 3483219, -405874, -643171, 1158031, 1830193, 1909113, 1568200, -148176, 1577864, -307627, 1513976, -1713155, 1671279, -1826435, 695248, 1162326, -867047, -756988, 52357260, -56314000, 23052700, -27836756, -34473020, -11329050, -18347564, -10924249, 51939576, -23744726, 36981816, -17730698, -4483409, --9882183, 12399034, 3861713, -44104484, -9131100, -11382737, 18454400, 1389959, 7284802, 15874736, --22543746, -3647501, -14715632, 8180302, 17289928, 11665131, -28959890, -4509179, 4706748, 4145717, --2695629, -12846247, -6423124, -24957518, -5611375, -3149285, 22341884, -20323248, 49937584, 11581379, --15893526, 22829362, -217970, 29534342, 14907295, 28037546, 5764920, 25633438, 19598472, 25075092, -25057912, 4280472, 24202140, -32051730, -6662031, 7088307, -22412750, -3416647, 12320651, -24831354, --37869800, 15036681, 22753126, 1011465, 4388383, -25493852, -8047158, -21299280, -1965484, 24805584, -905164, 46148348, 19698868, -11417634, 47347184, 25839060, -15440944, -5379447, -11370389, -15247671, --10941966, 12025908, -8081518, -23726474, 2738042, 16829830, -561030, -7726646, -7464117, -4884452, --9226127, -14384382, 1323924, -3286187, -3135863, -11111080, -2265595, -3895535, 3651796, 7985418, --3686156, 1599339, -4486630, -8716099, 4368519, -2346126, -8055748, -16503949, 6324340, -22748294, --4516158, -15796890, -10960220, -12873091, -4693863, -2099702, -6051072, -9062381, -5835787, -10342281, --3338263, -1315334, -2234994, -7013682, 8944269, -8454106, 3434900, -1864553, -15435039, -4323959, --15734613, 2036888, -1555852, -1671816, 1411971, -73543800, 67153424, -16085726, -20800526, -20407000, -46883864, -35847408, -4414153, -11083163, 788663, 23398444, -26119844, -3615826, 12037183, -9357660, --2412161, -489089, -14249628, 20794084, 2527052, -36979668, -7754564, -9844065, 3499862, -40424232, -954020, 3498251, -6505802, -845035, 12016245, 23040352, -8740258, -7307350, 6467147, -17411260, --49223008, 3180423, 41392748, -21653614, -29800630, 940598, 33644088, -16299401, -8362838, -43101072, --5514738, -348429, 31159988, 12653511, 5086852, -32804960, -16801912, 23665270, -28571196, 9330816, -50616188, 26717918, 39531416, -19672560, 23563264, 13015362, -41653668, -16960288, -21807160, -6848326, -26466126, -2371896, 28519656, 20993800, -41390064, 46308876, -27696634, -1300301, 3626563, -22995254, -48095044, -4354560, -9716290, 36486284, -29459718, -6478958, -42536284, -16093779, 21137144, -7420630, -19232326, 18213882, -3362423, -8862665, 4463545, -11922829, -11235098, -4690641, -7970923, -6701223, --6242198, 1914482, -8042327, 586263, -10445897, -12644921, -9004936, 7282654, -4849555, -2244121, -7046431, 209917, -959388, -13704167, -18338436, -13786308, -24252606, 17426830, 8860518, 14917495, -6928319, -15014132, -12912282, -8573292, -852551, 19267224, -3175055, -1352915, 3842922, -4519916, --2261300, -2984466, -6601902, 13044353, -7898982, 17081084, 956704, 43047920, 30766462, 4390531, --8134668, -22554484, 13266080, -1886564, -1873680, -1549410, -609349, -28991, -8442832, 10747619, --78383, -38651484, 9812390, 3330210, -13181792, 386547, 16792248, -5735392, 1262720, -27982248, -20435992, -10035191, -2855080, -2930242, 11698954, -15219217, -407485, 3314104, 610422, 3070902, --7009924, 20514912, -10660646, 36254356, -22226456, -23980950, 22645216, -25332254, 1484448, 18680960, --17248588, -7887708, 10183904, 11587822, 15664819, -55601572, 17836462, -642635, -12523588, 35070020, --17486422, 2044941, 353261, -29991756, 38467336, -1939715, -1496259, -20243792, -3456375, 31472984, --7188702, -1300301, 1433445, 8995809, 5429376, -39115340, 19412178, 34647500, -18079128, 13817984, --27025544, 45458472, 2230699, -42633992, 754841, 23616952, -2216203, -26524644, -5766531, 61977452, --9489193, -25675314, 4478577, 27284854, -6906308, -8661875, -3046743, -1315871, 1784559, 1136019, --6783901, 17980344, -2756295, -4345970, 1186485, 6077916, 15321222, -4619238, -7228430, 8250632, -2052458, -14105746, -4951024, 7426536, 1888712, -5945846, -2981781, 11986717, -10817412, -2300492, -2044404, 1648731, -10209137, -4276714, 13582297, -814433, -9501005, -4175782, 9885404, -2945274, --7098507, -6241661, 8653822, 312996, -24137180, -80315888, -121575488, 8157217, 105322800, 1617055, -275393824, 249498944, 149507808, 288050560, 189140704, -31216896, 11079405, -36935108, -226605696, -128738960, --99614784, -221445296, -181962736, -53674744, -106732088, -122728152, -9800578, 7394323, -51723756, 11486890, -47224240, -59903520, -50765440, 80549968, 16712255, -19353660, 56404196, 75478680, 185757, 77430744, -131104416, 47055124, 36187784, 133553080, 90469192, 11099806, 98249528, 144686176, 63817844, 74103752, -165003520, 62769872, 22846004, 157509872, 155164288, 48111688, 186821408, 265388720, 99241664, 109132432, -185290800, 56713432, -59399936, 10937134, -61011084, -222400928, -211984016, -226544496, -364027456, -393633760, --420839136, -497922528, -520774976, -508773760, -495030944, -435869376, -390986976, -319718432, -210956976, -150524640, --51541220, 144380688, 234030624, 231056896, 427587616, 455805536, 355032736, 432375968, 453050336, 243413520, -254064496, 311265408, 151546848, 122590176, 202374032, 146934592, 69485592, 95880848, 128271344, 54910620, -45063872, 128782448, 68520296, -10893111, 71021576, 55562920, -39104068, 6358699, 51419884, -32484448, --13596793, 95555504, 38420092, 4472135, 92121144, 60800632, -7881802, 5903970, -38792680, -133077952, --181334592, -200714016, -263445776, -282010240, -281600064, -305200928, -307943776, -322619680, -323467936, -295656416, --293510560, -246217056, -189722672, -150026960, -61830888, 56574920, 119971320, 199026096, 248752160, 263293840, -251236256, 229293264, 195175664, 158732320, 138620608, 121420872, 100011536, 90243704, 87873960, 80201000, -75511968, 78748760, 73841224, 62264676, 53991496, 43466144, 27806692, 17667884, 430034, -20055886, --35674000, -48369384, -49075908, -46751256, -43804372, -32229972, -24158118, -18305150, -10721849, -646393, -6825777, 15379741, 18723374, 21505438, 18105434, 13107703, 10822781, 8510478, 3307662, 555661, --1480690, -5490579, -12683038, -13191992, -16574279, -24925306, -23792508, -21573084, -32232118, -35022772, --34983584, -43440908, -46119360, -41661720, -47543676, -50061064, -44430364, -41337448, -40223980, -34121904, --28613608, -26669600, -21786758, -13529147, -10304700, -6244346, 1504312, 9378061, 13028246, 21094196, -30012694, 34809636, 38812008, 46237472, 49088792, 48464412, 49065708, 48834852, 43484932, 38159712, -34451008, 28992102, 20841328, 16304233, 11589432, 6009733, 1833414, -226023, -3367254, -5420786, --6754373, -7386807, -8560407, -8055748, -7638063, -6938520, -6677064, -5528160, -5246840, -4026532, --3346317, -2114198, -1563368, -288837, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +9670656, 198642, 363462, -4604205, -3747896, 2832531, 1675037, 285078, 3923453, -5948530, +-2070711, 9721658, 619549, 1917166, -2590939, -3243774, 4515085, 3839701, -1640141, 3779034, +116501, 638876, -3739843, 1357747, -3409667, -2600603, -3349538, 1151051, 89657, -1051193, +-416075, 1158031, 2838437, -1352378, -5312875, 115964, -3800509, -4776541, -1304060, 2189897, +-783295, 1956895, 1182727, 1795833, -801548, -651224, -948114, -752693, 1577327, -31675, +3289945, -424128, 4084514, 711354, 889595, 3953518, 1355599, 1030792, 5037997, -2042257, +1635846, -1742146, -3639448, 3323768, -1236951, 33823, 1173063, -578747, -3030100, -896038, +2102923, -1367410, -121333, -2873870, 1353989, 217433, -1979980, 257698, -3131568, 487479, +-3005940, -242666, -86973, -374199, 1665374, 848793, 403190, 964757, -369367, 1751273, +1207960, -119722, 338766, 407485, -109522, 84289, 527207, -703301, 350577, -904628, +745177, 106837, -192737, -18790, 607738, 190052, -652835, 230854, -79994, -328565, +-962610, -12741020, -6609418, -2979634, -2759517, -16106, 37581, 943282, 185757, -717796, +-5212480, -2369748, -5341329, -8377334, -6990060, 3947612, 4878009, 4926328, -1933809, -584652, +-547071, -1101122, 1822677, 758599, -1772748, -3795141, 2743947, 2335389, 3426310, 895501, +-1138703, -2076080, 980863, 1634235, -376883, 3473555, -1675574, -93416, 3386045, -2576444, +-4082367, 331249, 5680631, 1307281, 1269163, 798864, 65498, 732292, -859530, 1014686, +-4458713, 737124, 4663798, -1056025, 87510, 469225, -1566053, -878321, -623844, -746251, +-1221918, 2852395, -2645700, 2799782, 2398202, 5228586, -339302, 2944737, 6684043, -1216013, +-5344013, -6003828, -264677, -772557, 350040, -5092221, 1507534, -3570192, -2640868, 1243393, +3754875, -1517197, -2816425, -3387119, -636192, -355409, 967978, 320512, 2172180, 1287417, +-88047, 1102196, 343061, 2135673, 1631014, 1028108, 492311, 484794, -337155, 1438814, +102005, 449361, -138513, 55835, -1031329, 26307, -169651, 8912594, 6919729, 3031173, +3518115, -2247879, 1559610, 6182606, 2946348, 6653978, -2619393, 2720325, 3726958, -126702, +4793184, -2442763, 2978560, 615791, -3145527, -723165, -632434, -129386, -926102, 426276, +-1601486, 551366, -1184337, 6093485, -1433445, -267362, -62277, -2654827, -7711614, 4427038, +-1865090, 1750199, -3090766, -2814277, -3302830, -2092723, 1946157, 5850283, 4516158, 1988033, +-375273, -1175210, 1788854, 4224637, -969589, -1297080, 5101885, -2212982, 2418604, -2497524, +-2059437, -1161252, 1869385, 2108829, -3665218, -2420214, 51540, 3939559, 4964446, 2790655, +3859028, -467078, 3611531, 1510218, 3795677, -2092186, 1493038, 8865349, 4049081, 3804804, +-951872, -2399276, -6045704, 3554622, 1449552, -2400350, -2534568, -740882, 1779727, -1746441, +-891206, -1563905, 4832, 1334124, -585189, -2392297, 663572, 928787, 1366337, 1540283, +148713, 2149631, 969052, 940061, 588947, -599685, 1409823, 215285, -56908, -630286, +-1133871, -1105417, 236760, 932545, 299574, 136365, 210453, 10737, 1260573, -1712618, +-479963, 626528, -769873, 801548, 2697240, 10166724, 1447941, 3688303, 7362648, 137976, +-4211753, -1808181, -1266479, 286689, -2655901, -7231651, 2896419, 237834, 151398, 3014530, +-4800163, -2222646, 7542500, -1858647, -2858838, -4481799, 144955, -4236985, -715112, -1421634, +-1281511, 529355, 6088116, -210453, -1925756, 1774358, -4861903, 6489696, -843424, -1479616, +8118562, -4704063, 371515, -5556077, -2547989, 451508, 241592, 2107218, 2549600, -4963372, +1453310, 2047089, 1665911, 449898, 2312840, 1668058, 3385508, -3154654, -1692217, 6390375, +-2692408, 2423972, 588947, 1814087, 1634235, -577673, -2199560, -369367, 4508642, -2732673, +-325881, -1469416, 1023813, 4010963, -2301566, -5086852, -9780714, 570157, -431107, -879931, +9127, -3791919, -2658048, -5482526, -2173790, 2663417, -122943, 1639604, -679679, 3342022, +2314451, -79457, 1725503, -185757, -244813, 1125281, -2151242, -1182190, -1753420, -64961, +-2087354, 1168768, -111669, 527207, -799401, -715649, -124554, -796180, 433255, 713501, +-1939178, 846645, 729608, 386010, -1851668, 898185, 601832, 1648731, 1763621, -228707, +-666257, -1012539, 858457, -544924, -376883, 268972, -295816, -1200443, -4437775, -10857677, +5470178, -3547106, -6245956, 315680, -11696270, 2549063, 3526168, -1253057, 8476655, -3228742, +-10295037, 2490007, 3851512, -3540664, -7296076, 12425877, -820876, -714038, 3107946, -2715493, +-1631014, 1291711, -6113349, 3583077, -688805, 1777043, -1316408, 5822365, -1512902, 3274376, +2809982, -5704791, -2857227, -3205656, 5906654, -2942053, -1828582, 4546760, -1628866, -3344706, +2573222, 8320963, -4268124, 4066260, -4408784, 5478231, -3064459, 2897492, 496069, -2913062, +-8551817, 4773320, 6061273, -549756, -2011655, 3540664, 4229469, 4187593, -5907728, -643171, +-5219996, -450435, 1751273, -3576097, 1320703, 4072166, -4373888, -66572, 759672, -4094178, +-3076270, 3888019, -2831994, 3080029, -1869921, -5265630, 1000727, -5104032, 1254131, -1911797, +1714766, -5623723, 5132486, -4230006, 448824, -3929895, -222801, -209380, 978716, -382252, +-120796, -1202591, 1278290, -3794067, 1245004, -3100430, -2627446, 112743, 2204392, 1137093, +322659, 761283, 41339, 1418413, 2829310, -2423435, 2332704, -1549410, -442919, 1601486, +1125281, -1705102, -132607, -4410932, 5568425, -6135361, -6083285, -10435697, 4391067, 11014444, +1675037, -1986959, -956704, -1866163, 9593883, -5768678, -5251672, -1251983, -5790153, -1790465, +-6291054, -2727304, -4418985, -8743480, -2459406, -1939715, -316217, -974421, 2254858, 5191542, +1848983, 2562485, -8031589, 977105, -142808, -2529199, 2769717, 1466195, -2353105, -1051730, +-5724118, -6349573, -940061, 7001334, -2073396, -3628711, -789737, -2360622, -4948339, 64425, +-5167383, 10513543, 8865886, 2279017, -2733210, -2486249, 909996, 1565516, 1799054, 1714766, +-662499, 3899830, -3740917, 1713155, -3294777, 79457, -61740, 2179159, 1515050, 4920959, +-2166811, -3059091, -2796024, -11462731, 329639, 2360085, -1184337, 4123706, 1764158, -3466039, +964757, -6029061, -2263985, 473520, 4566087, 1934883, 6258841, 1239098, -790274, 10737, +2295123, -2632278, -368830, 574452, -1120987, 1582696, -2298881, 1158031, -1762547, -1433445, +-325344, -1956358, -1935420, -2388002, -1290101, -717796, 1720671, 1443109, -1799054, -2528125, +-811749, -1940788, 1272921, -2161979, 993211, -1270237, -406948, 2097018, 91805, 1749125, +1155346, -1144609, -1114544, -10872173, 1846836, 10875931, 10450729, -11224897, -10047539, 2519535, +-7974681, -4393752, 1258962, -671089, -3202972, 8227547, 3784940, -11851425, -862752, 593242, +-20938, 7398618, 2877628, -5563594, 7988103, 2838974, 1123671, -4342212, -4428112, 3274376, +-2812667, -8062191, -1370632, -1143535, -3476776, -4854387, -6340446, 6726993, 557809, 905701, +-4369056, 6442, 4922570, -3924526, -7998303, -8288213, 8665633, 1826972, 8184597, -1394791, +2398739, 5869610, 12230456, 3820910, -1452236, -6307697, -2591476, -3195993, 1919850, 555125, +-4767414, -2068564, 7140920, 4889821, 9676024, 4393215, -6570226, -6458020, 8017630, 4123169, +-4106526, -54761, 8256001, 536871, -389768, -6460705, 7094749, 5161477, -1181653, 9676024, +-1395328, -2921115, -10153303, -1452236, 577136, 5340255, -6987912, -538482, 3212636, -1825361, +-5010080, -4864588, -578210, -576599, -864899, -6055367, -5200669, -3223373, 1964411, -213675, +-2359011, -914291, -264677, 425202, 558346, 785442, -442919, 1906966, -1587527, -516470, +112206, -1283658, -3874061, 164283, 2350421, -812286, -3412889, 200790, -773094, 1141924, +268972, -536334, -244813, 1046898, -468688, 2019172, 1161789, -163209, -1855426, 1334124, +-1447941, 1348620, 1791538, -4408247, 1742683, -1649268, -892279, 5393942, -8991514, 5403069, +-5897527, 1061394, 4706748, -63888, -2401424, 1758789, -6177237, 242129, -4814122, -13953812, +-4277788, 5894843, 3806415, 2141578, -3406446, 2836826, 1260036, 14880988, 2541010, -5057861, +5521718, 1074279, 1159104, 9884867, -2877628, -2808909, 3418257, -7006166, 8370355, 7730405, +-215285, 4361540, -1666984, -4301947, -594853, -5400385, 411243, -5289252, 2013803, -104690, +1477469, 576063, -9067213, -1889786, -1207423, 469225, -4592394, 1936493, 1957431, -1767379, +11857868, -5233418, -10628433, 6281390, 10362145, 2327872, 2642479, -4632659, 8883066, -3084324, +1452773, 3975529, 1122060, -4086662, 4211216, 1806571, 461172, -66572, -8210367, -2921652, +3953518, 7207492, -2860448, -5401995, -7476465, -2461016, 2447058, 1328756, 3661460, -9199820, +1672890, 6126771, 760746, -396748, 2311766, -1952063, -1092532, -296353, -549219, 3194382, +-962610, 987843, -1015760, -711891, -759672, -2383707, -1372242, 1068910, -1695975, 2185065, +-408022, -443992, -1132261, -1359894, -7008313, 611496, 3662533, -230854, 1240709, -713501, +2247879, 731218, -1418950, -1649804, 1232119, 30340186, -8278013, 134755, -3016678, -1991791, +-6721624, -200790, -17757006, 9200357, -6351183, -498753, 10353019, 5041218, -6790344, -7387344, +-2699924, -6324340, 5713380, -14777372, 2766496, 6051072, 8474507, 1607392, 2558727, 289373, +1419487, -1998234, -4583804, -13511967, -1943473, 1653562, 6236830, -4903242, 6015639, 2274185, +-2406256, -920734, 4668630, -4931696, -4566087, -2711198, -3479461, -583042, -11873437, -5634460, +-2801929, -394063, 9482751, 2050847, 9048959, 3040300, -370978, -5719823, 731218, 498216, +1414118, 3054796, 12668543, 1413581, -11779485, 2989297, -4594005, -392990, -4417374, -5054103, +-2297271, 4773320, 3172370, -21000242, -7815767, -6292664, 4008278, -964757, -4453881, -2948495, +11860552, -4918275, 9123047, -8619999, -6390375, -9328669, -5011690, -9912248, -1499481, 13092671, +3119757, -1651415, 1613834, 5528697, -73014, 6830072, -3841848, 2593087, 3895535, 4613332, +1887638, -890132, -9086003, -3449396, -4647692, 2684, 2996814, 2488934, -1806571, -722091, +3889630, 1536525, -2971581, -1327682, -2071785, -995896, 208306, 1922535, -1559610, -1629403, +4940286, 4071629, 1347546, -641024, 1817308, 3322157, 294742, -3058554, -250182, -3118683, +830539, -2805151, 1671816, 5027259, -1581085, -4653597, -5139465, 3844533, -9520332, 592169, +-22202296, 5401995, -7279970, 2170032, -7567196, -16367583, -2536715, -3808562, 11603391, 4926865, +4168266, -391916, 15403900, -11589432, 2815351, 4378719, 11897059, -13727789, -7847979, -2721936, +1117228, -923955, -3913789, -1280437, 4099010, -7397008, 1493575, 4364761, -863825, 588411, +-5982890, -6840273, -4247723, 18428094, 149250, -4492536, 7153268, -4438849, -9295920, -7610682, +-5047661, -1343788, 3250217, 671089, 616865, 10225780, 9337259, -1701881, 3313031, 2245194, +-11849815, -8131984, -537408, -960462, -3121368, -8082592, 9885941, 11955578, -9841381, 6447820, +6041945, -1935957, -9409200, -15160698, -14708652, -11339787, -6699612, -13087839, 1158567, -10719165, +6381248, 5751498, 919123, 105227, -18296560, 1170379, 302795, 1320166, -9398462, 3117610, +10336913, 1369021, 2591476, -8299488, -5168457, -1044751, -8761196, 1999307, 5378373, -2605435, +-3285113, -4037806, 3337727, 5492190, -9728101, -5332739, -532039, 6418829, 2336462, -2853469, +2208150, -378494, -164819, 2863670, -1923072, 3700651, -4357781, -1555852, 3067681, 2684892, +-1136019, 7205345, 393526, -4592931, -3935801, -699006, -3256659, -2925947, 310848, 1994476, +-1431835, -1533303, -9078487, -7632157, -5282273, -5974837, -1884954, -13559212, 589484, 14780593, +-5228049, 7776039, -3131568, 14734422, 12481175, 5137318, -15354508, -3969624, 20463372, -5334887, +15163382, 2335389, -14585172, -7426536, 17134236, 320512, -11568494, 220117, -9868224, -1405528, +3452617, 1356673, -1999844, -17161616, -15228880, 4142496, 10964515, -9826348, -893890, 4233764, +-767189, 1626719, 18234284, 3310346, 2627983, 1529008, 6005975, -8140574, -5763846, -4203699, +-19286014, -6585796, -7258495, -5036386, 5048734, 3345780, -1250909, -1966558, -7649337, -11589432, +15032386, -3293703, -13269838, -6249178, 2660195, 10044855, -8029442, -2550674, -8519605, -1640141, +-10173167, -1998770, -2190970, -20428476, 1840930, -6910603, 14091788, -3682398, -11502996, -21665426, +-14283987, -2739652, 1768990, 7551626, -5617817, -5155035, -11804181, 10750303, 18205830, 1895691, +-2181307, 6172405, -4780836, 6829535, -5158793, -2514167, 2331094, 5216775, 3769371, -6395743, +209380, 1301912, -94489, -481036, -1608465, 1697586, 6465537, -2738042, -5694053, -272730, +-1278290, 2940979, -46171, 6268505, 439697, 2277407, 228170, -3882114, 1019518, -1569811, +6766721, 367220, -4292283, -842350, -1029718, 4492536, 466541, -4979478, -739808, 3453154, +-1586990, 817118, 7108708, -24982214, -12676059, -8630200, -13579076, -7350837, -5524939, -14191646, +14915885, -4357781, 22486302, -11377905, -16869020, -3350611, -11305965, 19247360, -6586333, -10237055, +-4655745, 5119601, 9874667, 8371965, -1977833, -2322504, -4363687, 2071785, 15976205, -479963, +1581085, -5180268, -1946157, -8390219, -2659659, 3641059, 2806224, -6945499, 397284, -10251013, +2113124, -3100967, -2982855, 4110821, 2008971, -4801774, -1832877, 8661338, 3346317, -7269769, +-9425306, 15800648, -682900, -25295210, 13204877, -2851322, -10652593, 5035313, -1485522, 1108102, +-2388002, 8731132, 3466039, 850404, 24320790, 23890756, -8378945, 2565706, -17926656, -3872450, +-3390340, 7596724, -2685965, 1195075, 7460358, -5492190, 13920526, -5901285, 1592896, -18807124, +7862475, -4929549, -13059922, 6548752, -2966212, 26368414, 6362457, 4989679, 9845676, 1047435, +-9147207, -780610, -3728032, -2313377, 2723546, -3316252, 5458367, 3254512, -3958349, 6686727, +3895535, -4461398, -1077500, 358630, 763430, -1856500, 1522566, 2317135, -549219, -2023467, +548145, 2055679, 1332514, 1546188, -4155918, 4268661, -8412230, 7514582, -4903779, -2967286, +-479426, 3897683, 5729487, 1464047, -6357626, 19864, -2503966, -1593970, 1656247, -6252936, +-11169062, 3275450, 30045980, -22536230, -7105487, -14271639, -9365176, 11325829, -12837120, 27477590, +-3127273, 8386998, 1628866, 6669548, -16990890, 3126736, 4595615, -1269700, -2462627, -1505923, +5163625, -10506564, -6257231, -1491427, -2859375, -12983686, -11415486, -3093987, -5215164, 15683073, +-3965866, -7434589, -5251135, 5392869, -7932805, -3409130, -13818520, 6531035, -5201743, 5756330, +-4808753, 7319698, -3606699, -24046448, -12123082, 3554622, -1746441, -1468342, -7371238, -14318884, +-692027, 6313602, 4375498, -3252901, 4855998, 7371775, 22940494, -9778567, 10940892, -25661892, +1755568, 3773129, -2910377, -7369090, 5346161, 968515, 1331440, 5768141, 18272402, 12305618, +9434969, -4855998, -5704254, 8977019, -10779831, 2695092, 9322227, -6492917, 22830436, -342524, +7191386, -6180458, 13234405, -12441983, -12108587, 408559, 4746476, -5615670, -1217086, 14176613, +287763, 12909061, 4873178, -1983201, -1880122, -7348689, -432718, -377420, 3801583, -464930, +-5752572, 1041530, 2825552, 7328288, -10509785, 1858110, -5250598, 2272038, 6267968, -2070174, +5906, -5556077, 2011655, 2100239, -3434900, -12836047, -7870528, -5059472, 2677375, -6770479, +-3674882, -4531728, -3895535, 2612951, 5157719, -112743, 4314295, 1613834, 2391760, 785979, +-9096741, 7920994, -6659347, 12236899, 35274568, 25327422, -6951942, -15535434, -10862509, 21734146, +-25802552, 1564979, -6694781, -6085432, 10261214, -18573050, 2294050, -9408663, -446677, -12867185, +-10283762, 1710471, 471373, 712428, -12822625, 20286204, 3857954, -8807904, 3428995, -2472291, +1548873, 30151744, 9250286, -8184597, -7582228, 1635846, 9077413, 2688650, -22629646, -5337571, +-15713675, -4995047, -7475928, 7747048, -4403415, -1952063, -374736, -595927, -11214160, -12582644, +8081518, -4658429, 2019708, -425202, 10924249, -8886824, -6711424, 3011309, 4426501, -11822434, +13151727, -8218957, -19769734, -18041010, -6750078, -5057861, -8139500, -3912178, -28010702, 9971303, +-13421773, -4012573, -11247446, 15561740, 4749697, 7532836, -258235, -2196339, -13683766, -3894999, +17871896, -14762876, 21709450, 16938814, 5636608, -3791919, 500901, -2937758, 2897492, -9543954, +-8068096, -4680441, 1076426, -1165010, 1130113, 4265440, -7317551, -1590212, 6831683, 7562364, +-3179350, 4762582, -4202089, -6176163, -3070902, -1831267, 4425964, 1417876, 1494112, -6107981, +-4382478, 2313914, -2598992, 2161979, 2332704, 4600447, 8518531, 3650185, 4658966, -5772436, +-3684008, -1885491, 2313377, -2736968, 911070, -2523293, 963683, 9074192, 3937411, 2563022, +-1992865, 5759551, 1501628, -2201708, -35114040, -4214437, 23206246, -28475096, -11485279, -570694, +-8849780, 10491531, -6037114, 32450626, -3329674, -6900939, -5426691, -1300301, 9401147, -6294275, +-6300717, 26508538, -19383188, -2218888, 6091874, -4139812, 16460999, 9441412, -1189169, -1936493, +6971269, 9512816, 10176388, 8504035, 17431124, 5701032, 7488276, 4681515, -5685463, 29353954, +3661997, 5593121, 7371775, 4487167, 21081310, -1369558, 5197448, 7408282, 6091338, 3584150, +13910862, -8100309, -6648610, 13990856, -2549063, -13846438, -3593814, -24312200, -8317741, -4554813, +23147190, -21770652, -2834142, 1093069, -752156, -1118302, 13651017, 37536940, -6526203, 4835060, +4276714, 5817533, 17840758, -19186156, -19849728, -17893370, 31844498, 2508261, -11976516, 29390998, +-11148124, 25645250, -13721347, 9936944, 1081795, -33741264, -4923643, -8315594, 9715753, -540092, +-2916283, 382789, 6110128, -743566, -10275172, 5708549, 158914, -4627828, -88047, -8850854, +12140262, -1132261, 4364761, -5583995, -5192079, -4970888, -6878390, -469225, 207232, 11756399, +-512712, 1467268, -4622996, 1480153, -10961830, 3685619, -10564546, -1764158, -2275796, -9249212, +5017596, -7279433, -7509214, 1858110, -10478110, 3431142, 8396661, 8038568, -3938485, -3479461, +2031520, 3391414, 7302518, 9520869, 545461, 20874614, 1749125, -20756504, -61588756, 12452184, +-14897631, -23613730, 26482768, -15803869, -8343511, -23251880, 5937793, -4486630, -22993108, -7257421, +-13706851, 6557342, -12703440, 785979, 4769025, 10454487, 5104569, 17587892, 2617783, 51003, +-1932735, -14482630, -11378979, -10260677, 8322036, 13194676, 5930813, 4806606, -497142, 5207648, +10085657, 23977192, -11390253, -6085969, 4052302, -10630044, 11330124, 2671470, -10536629, 24401320, +8721468, -20201378, 7933342, -19425600, 2201708, 3931506, 10205379, -5388037, -6744710, 30976914, +11843909, -13054553, 7920457, 16475495, -12751221, -26660472, 14793478, -1970316, -420907, 2394444, +6425271, 41853384, -3986267, 5401995, 7873749, 59056, 9469329, 5789616, -22213034, 4886062, +-11866458, -10087268, -6294275, 5234492, -35806604, -4151086, 11046119, 1962263, 17650704, -12850005, +12475269, -8326331, -3831111, -4602595, 5535139, 2667175, -4465692, 229781, -99858, -6131603, +4958003, -7791608, 8310225, 1320166, 5761699, 5177583, -3699041, -2774012, 1383516, -2030446, +1132798, 2143726, -3594888, -1073742, -4118337, -2633889, -2733747, -6966437, 44560, 1188632, +4075387, -2117419, 3921842, 9906879, -5184563, 1778117, -5202279, 2754148, 2993055, -7999914, +-6979, 2811593, -7828652, -3664144, 6634651, 244276, 1242856, 1668595, 158377, 183610, +-19000398, -21881784, 46933792, 10034654, -3016141, -5646809, 10602127, 42410656, 19473918, 5087389, +-1202054, 14232985, 35439384, 8833137, 12241194, 11068668, 25282862, -16245714, 16391743, 7303592, +-48431660, 14398341, -6809134, 14414984, -15045270, 11447698, 7623030, 15109158, -62814, 6442451, +2420751, -13697724, 6922414, 13702019, -11376831, 6921877, -11041287, -6613176, 34827888, 3626563, +30849140, -21818434, 9664213, -1038845, -4319664, -602906, -2586107, 4871567, 11370926, 7917772, +-761283, 17679696, -27928024, -26318486, 19268834, -14932528, -3768297, -3412352, -18014704, 9247601, +-4663798, 5271536, 2928094, 29902636, 14586246, 15817291, 6019934, 4336843, -26961120, -6109591, +13458817, -125091, 476205, 106837, -8551280, -23431730, 4655208, 2316061, -17493938, 2634426, +-8324721, -6828461, 7562901, 5133560, 26894012, -3681861, 6962679, 6540699, -4978941, -6750615, +-579284, -6405944, -2355790, 15911780, 6760279, 3015067, 970126, -124017, 563178, -28991, +-747861, -10517838, -3074123, 6710350, -1671279, 840740, -3763465, -5213554, -1997697, 1926830, +12991202, -8322573, -8021389, 7719667, 3904662, -9363566, 6975027, 4283156, -6559489, 8755291, +938450, -4898410, -2149631, -3322157, -1367947, -1410897, 4486630, 2374580, 2370285, 5102958, +7320772, 5495948, -1112933, 3987340, 12480101, -42824584, 36589900, -15580531, 7480223, 23197656, +-33683280, -1162862, -2409477, 8018167, 13283260, 14513768, 26002268, 4047470, -15828028, 8788040, +27671938, -38747048, -22075596, 25621628, 1915555, -431644, 1817845, 1988033, -93952, -885837, +13828721, 7893613, -17876190, 965831, -4579509, 31957778, 20080582, -6773164, 2581812, 3674345, +4644471, -399432, 12338904, 991064, 9636833, 32650878, 5194763, 3287798, -4294968, 8264591, +-30544196, -13678934, -12442520, -1551020, 3988951, -27696634, 11502996, -24593520, 8915278, 25208774, +-4912369, -22953916, -11615202, 9313637, -3852586, -46733540, 13348758, -32648194, -6500970, -4153770, +1655173, -13145284, 3887482, 16331076, -12919798, -31003222, -45891188, 36230196, 11610907, -5759551, +10925860, -11046119, 11644193, 20083268, -20358144, 36045512, 5540508, -3873524, 17335024, 9491341, +-5237713, 9302899, 1266479, 10051297, -9194451, -5210332, 3315178, 7276749, 13128104, 3740380, +11901891, -7446400, 7029251, 11762305, 11038066, -1701881, 10113037, -10131291, 4679904, 1021665, +5014911, 19622094, -12401181, 7849590, 1736241, -657667, 15941308, 4263292, 20585242, -2517925, +10525891, 2715493, 8460012, 2341831, -3376381, 6087043, -9557376, 9016210, -3076270, 7500087, +-1019518, 2132451, -81604, 1650878, 613643, 7875897, -987306, -1721208, -265214, 3483219, +405874, -643171, 1158031, 1830193, 1909113, 1568200, -148176, 1577864, -307627, 1513976, +1713155, 1671279, -1826435, 695248, 1162326, -867047, -756988, 52357260, -56314000, 23052700, +27836756, -34473020, -11329050, -18347564, -10924249, 51939576, -23744726, 36981816, -17730698, -4483409, +-9882183, 12399034, 3861713, -44104484, -9131100, -11382737, 18454400, 1389959, 7284802, 15874736, +-22543746, -3647501, -14715632, 8180302, 17289928, 11665131, -28959890, -4509179, 4706748, 4145717, +-2695629, -12846247, -6423124, -24957518, -5611375, -3149285, 22341884, -20323248, 49937584, 11581379, +-15893526, 22829362, -217970, 29534342, 14907295, 28037546, 5764920, 25633438, 19598472, 25075092, +25057912, 4280472, 24202140, -32051730, -6662031, 7088307, -22412750, -3416647, 12320651, -24831354, +-37869800, 15036681, 22753126, 1011465, 4388383, -25493852, -8047158, -21299280, -1965484, 24805584, +905164, 46148348, 19698868, -11417634, 47347184, 25839060, -15440944, -5379447, -11370389, -15247671, +-10941966, 12025908, -8081518, -23726474, 2738042, 16829830, -561030, -7726646, -7464117, -4884452, +-9226127, -14384382, 1323924, -3286187, -3135863, -11111080, -2265595, -3895535, 3651796, 7985418, +-3686156, 1599339, -4486630, -8716099, 4368519, -2346126, -8055748, -16503949, 6324340, -22748294, +-4516158, -15796890, -10960220, -12873091, -4693863, -2099702, -6051072, -9062381, -5835787, -10342281, +-3338263, -1315334, -2234994, -7013682, 8944269, -8454106, 3434900, -1864553, -15435039, -4323959, +-15734613, 2036888, -1555852, -1671816, 1411971, -73543800, 67153424, -16085726, -20800526, -20407000, +46883864, -35847408, -4414153, -11083163, 788663, 23398444, -26119844, -3615826, 12037183, -9357660, +-2412161, -489089, -14249628, 20794084, 2527052, -36979668, -7754564, -9844065, 3499862, -40424232, +954020, 3498251, -6505802, -845035, 12016245, 23040352, -8740258, -7307350, 6467147, -17411260, +-49223008, 3180423, 41392748, -21653614, -29800630, 940598, 33644088, -16299401, -8362838, -43101072, +-5514738, -348429, 31159988, 12653511, 5086852, -32804960, -16801912, 23665270, -28571196, 9330816, +50616188, 26717918, 39531416, -19672560, 23563264, 13015362, -41653668, -16960288, -21807160, -6848326, +26466126, -2371896, 28519656, 20993800, -41390064, 46308876, -27696634, -1300301, 3626563, -22995254, +48095044, -4354560, -9716290, 36486284, -29459718, -6478958, -42536284, -16093779, 21137144, -7420630, +19232326, 18213882, -3362423, -8862665, 4463545, -11922829, -11235098, -4690641, -7970923, -6701223, +-6242198, 1914482, -8042327, 586263, -10445897, -12644921, -9004936, 7282654, -4849555, -2244121, +7046431, 209917, -959388, -13704167, -18338436, -13786308, -24252606, 17426830, 8860518, 14917495, +6928319, -15014132, -12912282, -8573292, -852551, 19267224, -3175055, -1352915, 3842922, -4519916, +-2261300, -2984466, -6601902, 13044353, -7898982, 17081084, 956704, 43047920, 30766462, 4390531, +-8134668, -22554484, 13266080, -1886564, -1873680, -1549410, -609349, -28991, -8442832, 10747619, +-78383, -38651484, 9812390, 3330210, -13181792, 386547, 16792248, -5735392, 1262720, -27982248, +20435992, -10035191, -2855080, -2930242, 11698954, -15219217, -407485, 3314104, 610422, 3070902, +-7009924, 20514912, -10660646, 36254356, -22226456, -23980950, 22645216, -25332254, 1484448, 18680960, +-17248588, -7887708, 10183904, 11587822, 15664819, -55601572, 17836462, -642635, -12523588, 35070020, +-17486422, 2044941, 353261, -29991756, 38467336, -1939715, -1496259, -20243792, -3456375, 31472984, +-7188702, -1300301, 1433445, 8995809, 5429376, -39115340, 19412178, 34647500, -18079128, 13817984, +-27025544, 45458472, 2230699, -42633992, 754841, 23616952, -2216203, -26524644, -5766531, 61977452, +-9489193, -25675314, 4478577, 27284854, -6906308, -8661875, -3046743, -1315871, 1784559, 1136019, +-6783901, 17980344, -2756295, -4345970, 1186485, 6077916, 15321222, -4619238, -7228430, 8250632, +2052458, -14105746, -4951024, 7426536, 1888712, -5945846, -2981781, 11986717, -10817412, -2300492, +2044404, 1648731, -10209137, -4276714, 13582297, -814433, -9501005, -4175782, 9885404, -2945274, +-7098507, -6241661, 8653822, 312996, -24137180, -80315888, -121575488, 8157217, 105322800, 1617055, +275393824, 249498944, 149507808, 288050560, 189140704, -31216896, 11079405, -36935108, -226605696, -128738960, +-99614784, -221445296, -181962736, -53674744, -106732088, -122728152, -9800578, 7394323, -51723756, 11486890, +47224240, -59903520, -50765440, 80549968, 16712255, -19353660, 56404196, 75478680, 185757, 77430744, +131104416, 47055124, 36187784, 133553080, 90469192, 11099806, 98249528, 144686176, 63817844, 74103752, +165003520, 62769872, 22846004, 157509872, 155164288, 48111688, 186821408, 265388720, 99241664, 109132432, +185290800, 56713432, -59399936, 10937134, -61011084, -222400928, -211984016, -226544496, -364027456, -393633760, +-420839136, -497922528, -520774976, -508773760, -495030944, -435869376, -390986976, -319718432, -210956976, -150524640, +-51541220, 144380688, 234030624, 231056896, 427587616, 455805536, 355032736, 432375968, 453050336, 243413520, +254064496, 311265408, 151546848, 122590176, 202374032, 146934592, 69485592, 95880848, 128271344, 54910620, +45063872, 128782448, 68520296, -10893111, 71021576, 55562920, -39104068, 6358699, 51419884, -32484448, +-13596793, 95555504, 38420092, 4472135, 92121144, 60800632, -7881802, 5903970, -38792680, -133077952, +-181334592, -200714016, -263445776, -282010240, -281600064, -305200928, -307943776, -322619680, -323467936, -295656416, +-293510560, -246217056, -189722672, -150026960, -61830888, 56574920, 119971320, 199026096, 248752160, 263293840, +251236256, 229293264, 195175664, 158732320, 138620608, 121420872, 100011536, 90243704, 87873960, 80201000, +75511968, 78748760, 73841224, 62264676, 53991496, 43466144, 27806692, 17667884, 430034, -20055886, +-35674000, -48369384, -49075908, -46751256, -43804372, -32229972, -24158118, -18305150, -10721849, -646393, +6825777, 15379741, 18723374, 21505438, 18105434, 13107703, 10822781, 8510478, 3307662, 555661, +-1480690, -5490579, -12683038, -13191992, -16574279, -24925306, -23792508, -21573084, -32232118, -35022772, +-34983584, -43440908, -46119360, -41661720, -47543676, -50061064, -44430364, -41337448, -40223980, -34121904, +-28613608, -26669600, -21786758, -13529147, -10304700, -6244346, 1504312, 9378061, 13028246, 21094196, +30012694, 34809636, 38812008, 46237472, 49088792, 48464412, 49065708, 48834852, 43484932, 38159712, +34451008, 28992102, 20841328, 16304233, 11589432, 6009733, 1833414, -226023, -3367254, -5420786, +-6754373, -7386807, -8560407, -8055748, -7638063, -6938520, -6677064, -5528160, -5246840, -4026532, +-3346317, -2114198, -1563368, -288837, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 2902861, -9578851, 2103460, 1420560, -2200634, -753230, -4744865, -165356, -1236414, 3570729, 3101503, --3121904, -2304787, -1870995, -1840930, -2211908, 215822, 2851322, -2265595, -2362769, -7897371, --5752572, -4285841, -158914, 394063, 5810017, -3208341, 2901251, 1740536, 1511829, 318901, --4267050, 1076963, -9144522, 1093606, 328028, 406948, -586263, -5692443, -2538326, -4910222, -345745, 289373, -2908230, -7609609, 5260798, -390842, -4392141, -45097, 3007014, 620623, --1482838, 1054951, -2479270, -1112397, -2336462, 1815161, -2489471, 3554622, 2942590, -594853, --5002563, 243739, 749472, -469762, -1799591, 1260036, 951872, -1171989, 2784750, 2956548, -2107218, 178778, 68183, 934155, -2689187, 363998, 4281546, 477815, 864899, 766652, -3179887, 1184874, 1039919, 2787434, -632434, 2192044, -802085, 1427003, 1072131, -397284, -659814, 801011, -186294, 1017907, 1640678, 365609, 98247, 1107565, 1551557, 1177895, --112743, 442382, 554051, 572304, 238371, 86436, -46708, -377957, -1104880, 759136, -156229, -10119480, -11412265, -783295, -4526359, 3502546, -5604396, 1426466, 2556579, -3780108, -3087008, 11418707, 616328, -1024350, 6222334, 870268, 6248104, 120259, 2839510, -4461398, --5966247, -298500, 2233383, -4110821, -1352378, -397284, -1188095, 1153736, -1236951, -2161442, -2043331, -1007707, -887985, 4497368, 6362457, -1970316, -3453154, 1291175, 5088463, 1959042, -6527814, 293668, -940598, -149250, 5822902, 394063, -4199405, -2277407, 4568235, 3345243, -3549791, 988379, -2295123, -4704600, 915902, 2238752, 2740726, -1001264, -2490007, 5119601, -3412889, -832150, -2871186, 185757, -2002529, 5334350, 1618666, 989453, 1687922, 607738, -1093606, 3281355, 569083, 3295851, -644245, 5245766, 634581, -5168457, -2054068, -1794223, -2568927, 3208878, -517544, 863825, -3626026, -1309428, -3376918, -1017907, -2201708, -1868311, --794569, 1105954, 48855, 36507, 143345, 1454383, 231391, 335007, -179315, -1549946, --438624, 85362, -150861, 631360, 240518, 271120, -588947, 5945846, 4226248, 6262599, -6587406, -1604170, 3318399, -1437203, -3678103, -379031, 9742596, 4217121, 2203855, 3421478, --4009352, 6887517, 3005940, 4604205, -1328756, -7714298, 3269007, -12018392, 2472828, -3093450, -2450816, 1857037, -183610, -4158065, 1037772, 2660195, -1561221, 2492692, 6120329, -467615, --4994510, -6899328, 1116692, 3037616, -6276558, 3483755, -5895917, -3907883, 4358855, -2538326, --4976257, -2479807, -3497177, 5516886, 7664906, 4283156, -2694018, 1611, 4115653, 2399276, --298500, -3145527, -1432372, -2764348, 2947421, 9390946, -28454, -5141613, -3988414, 2154463, -813896, -1946157, -5531918, -134218, -4731980, -1908039, 799401, -850404, 3839701, 677531, -4809290, 5510980, -4814122, -1820529, 319438, -3825205, -4506495, -759136, 69793, -2818036, -2719251, -2563559, -267362, 2078227, 472983, 120796, 2132988, -2592550, -836445, 576063, -1013075, -1190243, 881005, 424128, 988916, -172872, 30065, 930397, -1257889, 1644973, --1260036, 790274, 307627, -402116, -52076, 715649, -486942, -902480, -1427540, 896038, --1034013, 377420, 1465121, -223875, -848793, 13383655, -3600793, 1312649, 1903207, -8813810, --7523709, 205622, 8737037, 6680285, 10562935, 3496640, -2987150, -4535486, 775778, -2597918, -2080375, 1022739, 3568044, 6578280, 2089502, 4854387, -137439, 2884608, -2913062, -6099391, --3205119, -4664335, 64425, -1290101, 1428077, -7432441, -3717294, -979253, 2758980, -3664144, -7722351, -8679055, 1869921, -5457830, -4438849, 2549600, 2221572, 7468412, -821413, 1903744, --2120103, 5238250, 5519570, 1555852, -1181116, -5581310, -769873, 1958505, -4288525, 4332012, --4721243, 2054605, 7830799, 6580427, 107374, -2499134, 1235877, 7845832, -965294, 1950452, -1227824, 6417218, 76773, -1676648, -3954591, 2816425, -5965173, 2207076, 12452184, 3088618, -5871757, 612033, -8212515, 3007014, 1545115, -3214246, 3374771, -1009317, -877784, -4070019, -1734093, 4072703, 1822677, 812286, -1855426, -4003447, 954557, -767725, -608275, 297963, --182536, -725850, 1324461, -1338419, -1229434, -1147293, 1855963, 773094, 1466731, -772020, -1355599, 115964, -1284732, 1449015, 795106, -1120987, -2196339, -768262, 1859184, 158914, --452045, 964757, 862215, 2034741, -62277, -733366, 1304060, -973884, -4821101, -8396661, -4263829, -6002217, -6075768, 1210107, -2915209, -19677392, 1959042, 2979634, 18020610, 5768141, -1388348, -8206072, 7544110, 3195456, -3201361, 3875134, -622770, 6481106, -3882114, -2068027, --1268089, -1779190, -2646774, -1217086, 4697084, 4014184, 7077033, 2466922, 3502546, -111132, --4508105, -4979478, 6707665, -3678640, 1537598, -636192, -4633733, 6707665, -1065689, -2957085, -1235877, 4874788, -3205119, 7420630, -9386114, -7850127, -9519795, 2288681, -5335960, -8232379, --1826435, 7634305, -3187940, 2269353, 4609037, -3327526, -4264366, 318901, 767725, 2534568, -529892, -2421288, -214748, 9849434, 4251481, -4056597, -12372727, -9962714, 3694209, 11724187, -9943923, -7737384, 258772, -5057861, 2288144, 1924145, -8364449, -699006, 1731946, 955630, --2224793, 474594, 566936, 227633, 2920041, 2586644, -1620813, -2081985, 1464047, -1025960, -718870, -2966212, 1269700, 852551, -4628364, -1081795, 1071594, 687195, 450435, 897648, --225486, 318364, 411243, 443992, -1648731, -261993, 667331, -567473, -2015950, -1062468, -345745, 304943, 2330557, -3466576, 5776194, -9733470, -1663226, -12071006, -3544959, 1839857, -4235912, -10996727, -2737505, 7610145, -898185, -11003169, 5743445, -3488050, -6303938, 3513820, -5818070, 1364726, 1235340, 2052994, 7598871, -3540664, -3124052, 2037962, -3731253, -1855963, -126165, -366146, 279173, 6135361, 3143379, -642635, -503048, 3614215, 1518808, 4425964, --348966, 4989679, 5240934, 2146410, -5655935, 892816, -765041, -3972845, 5508833, -3030100, -2327872, -3682398, -1346472, -13456669, 1273995, 11066520, 1007170, 11761231, -2118493, -2542621, --11989401, 14198088, 6688338, 8127689, 1356136, 6679748, -34360, 38118, 5541582, -3124052, -2032593, 70867, -13442174, 3189013, -3119757, 3660386, -1986422, 3314641, 12563853, 3875671, -3346317, -49392, -7553237, 5809480, -3036542, 1250909, 2913599, 3870303, -4134443, -995896, --1680406, -2153926, 2497524, -1311039, -1037772, -1663763, 344671, 575526, 242129, -3381213, -1459752, 730144, -729071, 1134945, 546535, 1008244, 789200, 1793149, 75162, 486405, --151934, -670552, 2159832, -258235, 3019899, 598074, 1296543, -769336, 1693828, 689342, -1391569, 1453846, 1224603, -15435039, -619012, 11789148, -2667712, 7020661, -7563975, -5039071, --13532905, 7769596, 3871376, 9003862, 4052839, -4288525, 7395397, -1798518, 7071664, -4629438, --4480725, 641561, -1713155, 6315213, 1196148, 5340255, 5755793, -3419331, -3105261, -1981054, -3753802, -703301, -2600603, 887448, -5389110, 2818572, 1762010, -2690260, 3799436, 6951942, --2854543, -3027952, -935766, -5099200, -2626373, 7975218, 965294, -4801774, 9484362, -10462540, -1563368, 5732708, -2521683, -3389266, -882079, 4586488, -8152385, 4113505, -3371549, -6830609, --5282810, -4096862, 49929, -1895154, -4505421, 1977833, 11807402, 6647536, -1714766, -4017405, --11611444, 1292248, 6309307, -3683471, -12821014, 410706, -2084670, 707596, 1521492, 5908265, --424128, -2905009, -1210644, -4584341, -2823404, -2135136, 3428995, -2823941, 3177739, -6724845, -498753, -3055332, -2144799, 4189204, -2036888, -1890859, -2439542, 901943, -4401805, -1676111, --1060857, -113817, 866510, -3023120, 810675, -2388002, 1289564, 1666984, 3507378, 722091, -1232119, 1930051, 1381369, -970663, 524523, 274878, 2600066, 1586990, -322659, 1641214, --181999, 190589, -1138166, 214748, -38118, -1828582, 511638, -1247688, -1038845, 183610, -1365800, -346819, 5165772, -2273112, 1310502, 7646653, 491237, 8957691, 9700184, 21662204, -14763950, 9060770, -2308545, -11471321, -4009352, 10513006, 4537096, -11081016, 8260296, -1933272, --5508833, -6781754, 1001264, 18725520, -12703976, 13540958, 5272609, -2920041, 4434554, -3663607, -9677635, -3724274, 5104569, 1015223, -6740415, -4715874, -6568079, 245887, 5527086, -1607392, --3710852, 3564823, 444529, -1126355, -12685186, 3826279, -7114614, -5378910, 3476776, 8341364, --6185290, -8891119, 296890, 7528541, 602906, -5073967, -1906966, -3025268, 3417720, 2494839, --2933463, -4798016, -7210713, 4435628, 11515881, 7055558, 3624416, -6706592, 3451006, 7288560, --8214662, -10714870, 1853278, -8850317, -4245575, -17337172, 205622, -11911018, -6215355, 3184182, --1512365, -1160178, 5248987, 879931, -9723806, -6750078, 4359392, -1361505, 512712, -3039226, -269509, 2815351, -439160, 1859184, 1874753, 368830, 162672, 1373316, 1615445, 1061394, -112743, 313533, -993748, 2541010, 53150, 2335925, -435402, -1595044, 751082, 2171106, --2768107, -4075387, -2077690, -613107, -1279900, 4576825, 1722282, -1477469, 2036351, -1196148, -299037, -3741454, -341987, 237834, -1707250, 23685670, 542777, -9291625, 10457172, -11442867, -13233868, 1055488, -8047158, -13813689, -3336653, 6750078, -10963441, 9714679, -1550483, 6254546, -7477001, -6438156, -2669322, -3884798, -5112622, -2011655, -4778151, 771484, -5840619, 6046777, -3830037, 5070746, 10333691, 5295158, -1549946, 12305081, 6277095, 2249489, -6630893, -7249368, -3687230, -5557688, 1256815, 3865471, -8252243, 7017977, 18773302, 1398012, 13345537, 6291054, -6445672, 9504763, 534187, 5019743, 5317170, -12202002, -8274792, 8352638, 534723, 7880191, -1382443, 8273718, -1373316, 2948495, 2037962, -17468706, -1180579, 4433480, 11624866, 2558727, -10189810, 994285, -2448668, 3308199, 4548907, -9829033, -16581258, -8777839, 2232309, 4023311, -508954, 12091944, 4234301, -19079318, 4795868, -2811593, 51540, 5424007, -7689065, -312459, --4168803, 3450469, 4865124, 245887, 1005022, 3506304, 85362, -86973, -1711008, -1879585, -583042, 304406, 55298, 2916283, 2088428, 692027, 1719061, 1097364, 10737, -2973728, -2257005, 1850057, -1221918, -314069, -479963, 84289, 1625108, 1355599, 4430796, -3847217, --1158031, 1633161, -1008780, 2308008, -1966021, 3897683, -1025960, -1265942, 474057, 2206003, -1521492, -616328, -346282, -1624571, -381178, -11573326, -903554, -10314364, -4720706, 4226785, --5085242, 2222109, 3584150, -6212670, -15153718, 4818417, -15012521, -17440252, 3861176, -8609262, -7755637, 10865730, -2709588, 12690555, -3001109, 12537010, 17264158, -38655, 1100049, -17409114, --3194382, 1825361, 3054259, -2082522, -11345156, 743029, -9594957, 1180042, -2526515, 2582349, --3634079, -6466610, 1538672, -1197759, -3451543, 4014184, 488553, -2702608, 12491912, 4551055, -9398999, -5945846, 1800128, -5023501, 3631932, -1169842, 4963909, -1699196, -3598646, -4823249, --10897943, -6543920, 17795124, 7105487, 11829951, -13662828, 2944737, 9984188, -8483634, 7516, -6650220, -3630858, 6672769, 868120, -11790759, -3160559, -18194018, -2336999, 7452842, 3732327, -12349105, 1309428, 8230231, 8610873, 3099356, -627602, 15975131, 1262184, 493384, -2811056, --1492501, 8331700, 5008469, 7964480, -881005, -1744294, -1986422, 5792837, 1269163, -1313723, -1661079, 3946538, -896038, -2462627, -4610648, 77846, -3667902, -1742146, -3121904, 2593624, --326418, -5552856, -964757, 321049, 444529, -352724, -2545842, 3635153, -2979634, 864362, -1437203, -4213363, -740345, -2845416, 585726, 3213173, -2917894, -2487323, -1809792, -1889249, -1862942, 961536, -11258183, -10040560, -10662793, -15539729, 10599442, 6869800, 942208, -10457172, -9447317, -86436, -13205951, -10795937, -3776887, -2690260, -8460012, -3330747, -5021354, -4249334, --3136400, -12207371, 6099928, 7151658, -646929, -1135482, -2240362, -4509716, -14512694, -15815680, -471910, 6867116, -4189204, -9739912, -5484673, 7419556, 5442798, 362925, -3059627, -4183298, --4251481, 9383430, -4786741, 6597070, -4529043, 198105, -15779710, -3432216, -1252520, 11909407, -3263102, -2783139, -8876624, -6160594, -12419972, 20036560, -9220758, 19029390, 2415382, -8192113, -12540768, 12364674, 21346524, -20936892, 8661875, 3491809, 2814277, -4151086, -6029061, 9266929, -4782983, -1585917, -9839233, 10932302, -5749351, 11752641, 9687836, 9197672, -8332237, 18147848, --13405667, 7466801, 11683385, -6728603, 1451699, 341987, 10150081, -2695629, 4505421, -5294621, -10847477, -339302, 1895691, -6227703, 4947803, -338766, 5104569, -1479079, 6883759, 3375844, -2166274, -4065724, 1295470, -3403762, 190052, -2897492, -3921305, -782758, -3463891, -2301029, --375810, -1752884, -3451006, 2367601, 2862596, 4225711, 977642, -3941169, 367220, -2659659, -2666101, 1121523, -1941862, 525060, 1862942, 1126355, -4444218, 875100, 4452808, 1753957, --704375, 1287417, 17064978, -28491740, -30508226, -19234474, -3156264, -13420699, 8271034, -11043972, -1192927, 5446019, -758062, 20083268, 14567455, 5100274, -5833103, -4519380, 14152991, -2388539, -2252174, -5798743, -12499965, 9127, 5163625, 3345780, -6835978, 6068789, 948114, -841277, -12011950, 16411607, 1260036, -10524280, -4442607, -20170240, -7726646, -5226439, -5966247, 893353, -3612604, -7341173, -2843268, -10261214, 11132555, 13238700, 11134703, 12361990, 9819369, 16181826, -2077690, 5548561, 3937948, -2946885, 6336151, 9644886, -9587978, -33474976, -7696045, 11115375, --17245368, 8838506, 11033234, 3952444, -5177046, 838592, -4068408, -13440026, -3559991, 8749922, --10650982, -9094593, 3330747, -7382512, 21891986, 22167936, -8106751, 14277008, 3871376, -2090575, --9600863, 6830072, -12986370, -10816875, 12011950, 9004399, 6410776, -833224, -1042603, -15942382, --11361799, -2095407, -3520263, -2964601, -2276870, -4710506, -3797288, -4390531, -2090039, 586800, -3880503, 2983392, 5107253, -414464, -2257542, -2383707, -1508070, 7204271, 6808060, 3464428, --494458, -450972, -1410360, -2684892, -4057134, -1840930, 890132, -1231045, 3044595, -1535451, -1231582, 1395864, 1372779, 2758443, -3061238, -50466, 794569, 2339684, -3712462, 6647536, --2599529, -1671816, 27492622, -23165442, -261456, 3730179, -21843130, -6661495, -9127879, 3151969, --6556805, 18938658, 2616172, -396748, 23998666, -1508070, -20987358, -17104170, -10229001, 8011188, --1093606, -20644298, 5383742, 5551245, 10897406, -12342662, 6315750, 10215043, 9143985, 7097434, --2380486, 12239583, 13500693, 4377109, -29717952, 21661130, -10588168, 8259759, -2067490, -3235721, -5819681, -13353053, -7451232, 13887777, -6314139, -1961726, 12777528, -14317810, 12848932, -5059472, -11936251, -15756088, 20946556, -9400073, 32355600, -4348118, 2113661, 8180302, -7057705, -5418101, --3843996, 2514167, -1578401, -16354162, -20331302, -5745593, 11915850, -6219650, -7344931, -20890720, -9643275, 2047626, -28347858, -503048, 438624, 4109210, 14672145, -10008348, 4621922, -12829067, --11101417, -16988206, -16816944, -3070902, -9818295, 12133283, -1986959, 11851425, -5769752, 6721624, --915365, -7703024, -10578504, -1289027, 1304060, 5124433, -2490544, 2219961, 1079111, 4183835, --390305, -5702106, -785442, -8593693, -363462, 1322850, 1921461, 422517, -3204046, -4196720, -4723927, 2116345, -1381369, 5281199, -6682432, -8995809, -136365, 7890392, 212064, 2251100, -3168612, 5383742, 350040, 6031745, -4925791, 1909113, 1239635, 4899484, 8400956, -5251672, -1376000, -1264868, 1395864, 10546292, 31698470, 15849503, -9683541, 21887154, 7175280, -13930726, -5357972, 14156212, -2204392, -4776541, -19500762, -5247377, 12000139, 7888781, 5701032, 3573950, --3531000, -7780334, -18408766, 9829033, -6287296, 4918275, -14139032, -7603166, -369904, -2132988, -18066780, 5494337, 2864743, 13891535, 6629819, -20904680, -2467996, 7707856, -3946538, 482110, -17849348, 5928129, 20725364, -12029667, -7638063, -3356517, -7762080, 8188892, -8090645, 15674483, -15533286, -6792491, -15222975, 25509422, -13125420, -5240397, -3076807, 7633768, 3854196, -14150307, --4262755, 9139690, -6779606, 11579232, -5480379, 16384763, -8512625, 3739306, 24946780, -451508, -17566416, 30518964, 3826279, 15011984, -7758322, -36599564, -24865714, -4707821, -1595044, 20876226, --706522, 7014219, 1742146, -5131949, -17008608, -37775312, 28594282, 2025077, 817118, 9409200, -4431333, -9178345, 21126408, 1105954, 4434554, -217433, 1390496, -18609556, -6965363, -12253542, --7459285, -558346, -6973417, -6902013, 4292283, -1467805, -4815732, 13691282, -2586644, -13841069, --9968619, 3527242, 638340, -3986804, 21087752, 6419903, -7118372, -8133058, 2145873, -1862942, --4431870, 726386, 1891933, -4723927, 4961224, -127775, 7187091, 9433896, 1781875, -854699, --2899103, 6332930, 6044630, 5534066, -41399188, -9911711, 43236900, -16597364, -18539764, 38176352, --24495810, 21512954, 28750512, 11362336, 3950833, -21836688, 8356396, -38305204, -18872624, 8381629, -19913078, 2252174, 4592394, 14516989, 38744364, 26191248, 8184597, 1445257, -46171, 4310537, -3198677, -15036681, 318364, 9587978, 12119324, 51707648, 29142964, 19925428, 37335612, 15256261, --5352066, 11217381, -710280, 35773320, 12942347, -2923799, -5972689, 14946486, -2310693, 17162152, --53348324, 2300492, 18355080, -1105954, 22217328, -8319352, 5860483, 11838540, -49676664, -19197430, --3910031, -15910169, -20592758, -24256364, 22673132, -14842870, 4503810, -4549444, 22749368, -37323804, --10271951, -5272073, 11681237, -188442, -3471944, 27494770, 47937740, -257161, 14882599, -9108552, -3990025, 33539936, -35756140, -21246666, -29940754, -37740416, -3366181, -1549946, -14934675, -16040092, --15208479, -14434311, -18618146, -26958972, -11832635, -17515950, -10783589, 4607963, 23531052, 7468412, -3456912, 3454764, -2481417, 5158793, 2151779, -16926466, -15290084, -4490389, -21489332, -8621073, --9582609, -7486665, -8595840, 9582609, -7970923, 419833, 1224066, 4015795, 11500312, 17702244, --462783, -4741644, 12732967, -6841883, 7999914, 2922188, 1503239, -3772055, 2043868, 1358283, --7991861, -10423886, -11302206, -1845762, 3518652, 22456774, 19781546, -18626200, -65901440, -11943767, -27025544, 6101001, -7342784, -5346161, 2058363, -9251896, -12082817, 14387604, 10853382, 29822106, -10917270, 17867064, -6748468, 39727912, 7219303, 25129316, -3543348, 36633388, -13947906, 23811836, --23324894, 51540, 2605435, 16966732, -6720550, -12929462, -30861488, 17047262, 2288144, 3373160, --14910516, -27855548, -1678795, 3065533, -3394635, 8341900, 17858474, 2547453, 12773770, 45420888, --19161460, 4421132, -14998026, 23386634, 20437066, -23011362, 21606370, 24493662, -17592722, 6108517, -5817533, 16925392, 8453033, 34544960, 10948945, -12461848, 2098629, 44689136, 14227616, -51430084, -15146739, 9023726, -44113072, -12426951, -14119705, -31334470, 2265059, 19080930, 21109764, -12680891, -37950332, -9931038, -16460462, -8660802, 20073604, -74634720, -9079561, 907849, 60073172, 7781944, -50936700, 24283208, 35751844, -1189169, 12276090, -7035157, 30295626, 30535070, 27582280, -6867116, --18365280, -7707856, 30262876, -3757560, -19765440, -8792335, 35851164, 4796942, -22301080, -7832947, -32340566, 9039296, 13467407, -647466, 12216498, -9456981, -639950, -918049, 5290326, -1085553, -5718212, -4721243, -10500121, -12655658, -15195594, -2238752, -11096048, -245887, -1985886, -4575751, -10722386, -12473122, -5009006, -12375411, -4499515, -22502408, -16582869, 22199076, 392453, -25942140, --41120552, 33393908, 71165464, 5036923, -39891656, 61815316, -14074071, -642098, 8582955, 35170952, --20275466, 1753420, 69709464, -34401076, 16453483, 23812372, 22406308, -30739618, -3317862, 5815386, --15381352, 2910377, 7097971, -12340515, 12220793, -21107080, -6248641, -8293045, -1803886, -12566001, --11417097, -3878892, 6546604, -23041426, -21971442, 33021320, 5761162, -20249698, -5561446, 19750944, -47105592, -3853660, -23242216, 24943560, 36084168, -10266582, -2877091, 1214939, 12947716, 372588, --148176, 16765405, -40242768, 27758910, -23294292, 570694, -32942936, 18662706, -2748242, -48656612, -23967528, -3216394, -19121194, 33299418, 3694746, 32930052, -27806156, -10298795, -11346767, -25268366, --39832600, -52162376, 44318156, 18476412, 32573568, 30495878, 18504330, 7576323, -19053012, 28893856, --14416595, -11757473, 38534984, 13219909, -7489886, -3189013, 11608223, -27169426, 6875706, -10562398, -17979806, -6695317, -11938398, 17637284, 2748242, -20117626, 1447404, -9378598, -5883569, 4612258, --4652524, 4029753, -1313723, -14404783, -7629473, 6657200, -5089536, -8972187, 8992588, 14765561, -14010720, -11120744, -4873714, 16932372, -28404230, 8768176, 10139344, -11783243, -28227062, 14407468, -1566053, -12336220, 8572755, -13225278, -22016002, 6048388, 19385872, -15893526, -7186554, 7242926, -16896938, -4373351, -2320893, 15206332, 876710, -11671037, 38693896, -15724949, 11434277, 9001715, --40221832, 36177048, 12600897, -10282152, 30994094, 2641942, 2045478, 15216532, -13498545, 39639864, --31800474, -16958678, 14743549, 13689671, 6724845, -29496224, -18004502, -32872070, 18194018, 4436701, -16621523, 90194, 17854716, 7270306, 5978058, 783295, 15226196, -6800007, 8385387, -14986752, -11295227, -13846438, -115964, -18300318, -13048648, 840740, -16335908, 7727183, 38970924, 9385040, --29192356, 15307800, 11734924, 20734492, 597537, 34431680, -29511794, 4589173, 13727252, -28418724, --6627672, 57563300, 32387274, -76017160, -32284732, 40545028, -11028939, -36032628, 14260365, -3628711, --27831388, 20498806, 34629248, -46843060, 9302362, 41726144, -28204514, -25269976, 34089692, 4632122, --28010702, 5045513, 22169010, -24442122, -3383897, 26925686, -3926674, -11914776, -19222664, 24637544, --6477348, 13762686, 3207267, 13977971, -9527311, 9066139, 24820616, 9841381, -18259516, 1544041, --13059922, -8806294, -18394808, -1621887, -4896800, -1262720, -12358768, 12693239, 10912975, -4279935, -28369332, -7138773, -30123826, 36319856, -4287988, -6863895, 6705518, 12742094, 1720134, -3335042, -30640296, 16865262, -21497386, 1852205, 8727910, -15584289, -12885976, 22179212, -11398843, -41981156, -40494024, 5190468, -40929428, -1176284, 21581674, -15360414, -34417184, 19892678, 26538602, -42432128, -6263673, 31998580, -18727668, -3255585, 35013112, -2565706, -14283987, 8231842, 14798310, -19153944, --5233955, 20548198, -4677757, -17899814, 15079630, 9008694, -10432476, 33817500, -72796472, -4968741, --13060459, -80502184, -14667850, -24700894, 7685844, 14063870, 23643794, -10467909, -31723166, -11716134, --45676440, 6263136, 16009491, 9582072, 6958921, -36368172, 22161494, 3729105, -44180180, 32247152, --47493212, -19149112, -17987324, 12985297, 33897492, 39797168, -3528853, -8759586, -76707040, 32981054, -77098424, 28368796, 1487669, -42359652, -62595928, -25436944, -5561446, 32692754, -39325796, -23165442, --40396316, -12628278, 71970232, 78084120, -13906030, -35798016, -31295280, -16356846, -8570070, 39391828, --19005768, 11877195, 7833484, 26243324, -7537668, -17477296, -45886356, -19628000, 68978248, 29819422, -45777372, -42215232, -23855322, -19492172, 46774880, 1078574, -77120432, -73900280, 41049148, 71474696, -119288424, 21051782, -102062384, 17125108, -27262304, 34685084, 32915018, -124450976, -40134320, 24441586, -65226596, 16067473, -63809792, -14101451, -6751152, 36954436, 31049930, 8503498, -51196548, -7856032, -10740639, 22727894, 10869488, -13160317, 1779727, -28023588, -3954591, -405874, 26778584, -18537078, -35845796, -23067732, 9954124, 21086678, -9059160, 17496086, 15058692, 28490128, 1087164, -13766981, --16768089, 2600603, 1016834, 4839355, 2607045, -927176, -2278480, -10285373, -11227581, -2157684, -17609366, -4625680, 135291, -3760244, 5647882, 1342714, 9659381, -9139154, -12228846, -23537494, --12025372, -1400696, 12847858, -12597139, -1161252, -36853504, 31479426, -32895154, -6950868, 1021665, -8443369, -6367826, 7588134, 12518219, -20935818, -18314814, -253940, 4582193, 13682155, -15464567, -2295123, 11450383, -8908299, 7060390, -4559108, 35471600, -371515, -5610838, 20650202, 11009075, -18364744, -9450002, 11774116, -3936875, -358093, 14800994, 10821170, 2268817, 4618164, 20038706, --18780818, -5946382, 2155537, 27117350, -308701, -6396280, 25569014, -6703370, -10929081, -11244224, -21206402, -5235029, 9333501, 5405217, 3334505, -7634305, 3912178, 7988103, 3027415, 23578296, -11938935, 6542309, -10189810, -1767916, 9200357, -17196512, 6240588, 6260452, 17658758, 39192, --1967095, 9727564, 2305324, -19921668, 22314502, 6593312, -5070746, 18246632, -12407087, -1739999, --9233643, -8360691, 18253074, 13094282, -1154809, 6463389, -10741176, 2347200, -14518063, -1569274, --13290239, 2811593, 8731132, 2972654, 1697049, -3074123, -1770063, 2384244, -7919920, 2157684, --3394098, 3623879, -5201743, -2025614, -4812511, -6386080, 3069291, -1248225, -361851, -2461553, -8647917, 3158949, -10851235, -11541651, -7722351, 2232846, 3599183, 8143258, 4963909, -10646150, --1520418, -4108673, 9661529, -2571075, 10415296, 4147865, -8475581, -95026, 4639102, -5007395, -6655589, -4053376, 7519414, -5425081, -1663763, 2269353, -4206921, 57456460, 4631586, -21241834, --17581448, 2838437, 12993350, -812286, 11859478, -4535486, -3181497, -15960635, -3510599, -11186779, -17732846, -11127723, -913217, -7038915, -3316252, -4145180, 1932198, -11827803, 1797981, -5120138, --8320963, 2399276, -1335735, 625455, -2262374, 4109747, 1989644, -9907953, -6350109, -53687, --6702297, -5867462, 4876936, -1648194, -10095858, 617402, -5622112, 4243428, -14907295, 7385733, --6489696, -11359652, 3417720, -5240934, -5877663, 1465658, -116501, 636729, -2497524, 2431488, --4575214, 4966593, -3147137, 460635, 8280697, -6069863, 2763812, -1656784, -903554, 2185065, --6889128, 6163815, -7242389, 6152004, -1534377, -387084, -4648229, 5807333, -6962142, 368830, -2419140, -9203041, 9059697, -5640903, 3825742, -4295504, 3652333, -3332895, -4061965, 6662568, --4277788, -932545, 6605660, -4387846, -102005, 453119, 1009854, -4844723, 335007, -524523, --2117419, -1431835, 1094143, -1591822, -2604361, -1372242, 2847027, -2751464, 2120103, -855235, --355409, -956167, -2017024, 1741072, -1381369, -1654636, 1933809, -2192044, 1516660, 619549, --1312649, 195958, -383863, 434329, -4072703, 3728569, -4188667, 593242, -672162, -2284386, -489089, -1316408, 2746632, -7047505, -27831924, -44482976, 47165184, 164634688, 31381716, 49520972, --101457328, -140728368, -58997280, -73630768, 56807920, 132200168, 75782016, 51109572, 4956929, -72663864, --64581276, -64316600, -26499948, 36672580, 31037044, 33432026, 29799556, -886911, -4992900, -7531225, --10527502, -15168214, -2208687, 20304458, -1937567, -11630235, -4743255, -16850230, -9677098, -2850785, --4358318, 32511828, 29995514, 17922362, 18992346, 1075352, -23549306, -23776938, -43928388, -29080686, -3883187, 3661997, 8807367, 25928180, 36674724, 22175990, 18408766, -764504, -20969640, -28922310, --25163140, -20928302, 2884071, 7567196, 13360570, 9390409, 6072547, 1416802, -7711614, 3047816, -617402, 3242164, 18176838, -1648194, 7987566, 8383240, -13717589, -25666188, -26598196, -23826332, -6236830, 19640348, 14091251, 21483426, 18787260, -6287296, 4645007, 11732777, -7635378, -7014219, --16572668, -21185464, -8349417, -4975183, -2307471, 9026411, 4100083, 4889284, 14212047, 13642427, -13989245, 8070781, 3497714, -7027104, -8839580, -21785684, -24016920, -16933982, -12532715, 5419712, -15528991, 19682224, 26285736, 18868866, 11944841, 196495, -8269960, -12884902, -27352500, -28896004, --10289131, 5180805, 13753022, 11052025, 9550397, 11061151, 7910256, -528281, -2126009, 1175210, -233002, -4793721, -4367982, -14606647, -9654550, -404801, 5229660, 7198902, 5647882, -2178622, --299574, 5305359, 4131759, 314606, 2860985, 2558727, -1737851, -6886443, -6230387, -5964099, --1406602, -1578937, -137976, 1261110, 6087580, 6774237, 6088116, 2902861, 1948841, -2887292, --5279052, -6484327, -3827890, -2286533, -19864, 338229, 2238215, 1950989, 3643206, 2470143, -1488206, -625992, -281857, -881005, -558883, -2234994, -2036351, -1742146, 1205812, 1414118, -1750736, -423591, -638340, -1029718, 936840, 202400, 922344, 183073, 1057099, -472983, --454193, -1007707, 549219, -186294, 288837, -1067836, -392990, -907849, 355945, 93416, -1283122, 228170, 585189, -88584, 916976, -12885, 129923, -1384053, -779000, -1236414, -123480, -155156, 932545, 87510, 847719, 146029, 672699, -518617, 111669, -633508, -279710, -474594, 361851, -360240, 394063, -543313, 209917, -392453, 561030, -222265, -479426, -379031, 417686, -370978, 435939, -354335, 414464, -418222, 367220, -443455, -350040, -446140, 369904, -405874, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +9578851, 2103460, 1420560, -2200634, -753230, -4744865, -165356, -1236414, 3570729, 3101503, +-3121904, -2304787, -1870995, -1840930, -2211908, 215822, 2851322, -2265595, -2362769, -7897371, +-5752572, -4285841, -158914, 394063, 5810017, -3208341, 2901251, 1740536, 1511829, 318901, +-4267050, 1076963, -9144522, 1093606, 328028, 406948, -586263, -5692443, -2538326, -4910222, +345745, 289373, -2908230, -7609609, 5260798, -390842, -4392141, -45097, 3007014, 620623, +-1482838, 1054951, -2479270, -1112397, -2336462, 1815161, -2489471, 3554622, 2942590, -594853, +-5002563, 243739, 749472, -469762, -1799591, 1260036, 951872, -1171989, 2784750, 2956548, +2107218, 178778, 68183, 934155, -2689187, 363998, 4281546, 477815, 864899, 766652, +3179887, 1184874, 1039919, 2787434, -632434, 2192044, -802085, 1427003, 1072131, -397284, +659814, 801011, -186294, 1017907, 1640678, 365609, 98247, 1107565, 1551557, 1177895, +-112743, 442382, 554051, 572304, 238371, 86436, -46708, -377957, -1104880, 759136, +156229, -10119480, -11412265, -783295, -4526359, 3502546, -5604396, 1426466, 2556579, -3780108, +3087008, 11418707, 616328, -1024350, 6222334, 870268, 6248104, 120259, 2839510, -4461398, +-5966247, -298500, 2233383, -4110821, -1352378, -397284, -1188095, 1153736, -1236951, -2161442, +2043331, -1007707, -887985, 4497368, 6362457, -1970316, -3453154, 1291175, 5088463, 1959042, +6527814, 293668, -940598, -149250, 5822902, 394063, -4199405, -2277407, 4568235, 3345243, +3549791, 988379, -2295123, -4704600, 915902, 2238752, 2740726, -1001264, -2490007, 5119601, +3412889, -832150, -2871186, 185757, -2002529, 5334350, 1618666, 989453, 1687922, 607738, +1093606, 3281355, 569083, 3295851, -644245, 5245766, 634581, -5168457, -2054068, -1794223, +2568927, 3208878, -517544, 863825, -3626026, -1309428, -3376918, -1017907, -2201708, -1868311, +-794569, 1105954, 48855, 36507, 143345, 1454383, 231391, 335007, -179315, -1549946, +-438624, 85362, -150861, 631360, 240518, 271120, -588947, 5945846, 4226248, 6262599, +6587406, -1604170, 3318399, -1437203, -3678103, -379031, 9742596, 4217121, 2203855, 3421478, +-4009352, 6887517, 3005940, 4604205, -1328756, -7714298, 3269007, -12018392, 2472828, -3093450, +2450816, 1857037, -183610, -4158065, 1037772, 2660195, -1561221, 2492692, 6120329, -467615, +-4994510, -6899328, 1116692, 3037616, -6276558, 3483755, -5895917, -3907883, 4358855, -2538326, +-4976257, -2479807, -3497177, 5516886, 7664906, 4283156, -2694018, 1611, 4115653, 2399276, +-298500, -3145527, -1432372, -2764348, 2947421, 9390946, -28454, -5141613, -3988414, 2154463, +813896, -1946157, -5531918, -134218, -4731980, -1908039, 799401, -850404, 3839701, 677531, +4809290, 5510980, -4814122, -1820529, 319438, -3825205, -4506495, -759136, 69793, -2818036, +2719251, -2563559, -267362, 2078227, 472983, 120796, 2132988, -2592550, -836445, 576063, +1013075, -1190243, 881005, 424128, 988916, -172872, 30065, 930397, -1257889, 1644973, +-1260036, 790274, 307627, -402116, -52076, 715649, -486942, -902480, -1427540, 896038, +-1034013, 377420, 1465121, -223875, -848793, 13383655, -3600793, 1312649, 1903207, -8813810, +-7523709, 205622, 8737037, 6680285, 10562935, 3496640, -2987150, -4535486, 775778, -2597918, +2080375, 1022739, 3568044, 6578280, 2089502, 4854387, -137439, 2884608, -2913062, -6099391, +-3205119, -4664335, 64425, -1290101, 1428077, -7432441, -3717294, -979253, 2758980, -3664144, +7722351, -8679055, 1869921, -5457830, -4438849, 2549600, 2221572, 7468412, -821413, 1903744, +-2120103, 5238250, 5519570, 1555852, -1181116, -5581310, -769873, 1958505, -4288525, 4332012, +-4721243, 2054605, 7830799, 6580427, 107374, -2499134, 1235877, 7845832, -965294, 1950452, +1227824, 6417218, 76773, -1676648, -3954591, 2816425, -5965173, 2207076, 12452184, 3088618, +5871757, 612033, -8212515, 3007014, 1545115, -3214246, 3374771, -1009317, -877784, -4070019, +1734093, 4072703, 1822677, 812286, -1855426, -4003447, 954557, -767725, -608275, 297963, +-182536, -725850, 1324461, -1338419, -1229434, -1147293, 1855963, 773094, 1466731, -772020, +1355599, 115964, -1284732, 1449015, 795106, -1120987, -2196339, -768262, 1859184, 158914, +-452045, 964757, 862215, 2034741, -62277, -733366, 1304060, -973884, -4821101, -8396661, +4263829, -6002217, -6075768, 1210107, -2915209, -19677392, 1959042, 2979634, 18020610, 5768141, +1388348, -8206072, 7544110, 3195456, -3201361, 3875134, -622770, 6481106, -3882114, -2068027, +-1268089, -1779190, -2646774, -1217086, 4697084, 4014184, 7077033, 2466922, 3502546, -111132, +-4508105, -4979478, 6707665, -3678640, 1537598, -636192, -4633733, 6707665, -1065689, -2957085, +1235877, 4874788, -3205119, 7420630, -9386114, -7850127, -9519795, 2288681, -5335960, -8232379, +-1826435, 7634305, -3187940, 2269353, 4609037, -3327526, -4264366, 318901, 767725, 2534568, +529892, -2421288, -214748, 9849434, 4251481, -4056597, -12372727, -9962714, 3694209, 11724187, +9943923, -7737384, 258772, -5057861, 2288144, 1924145, -8364449, -699006, 1731946, 955630, +-2224793, 474594, 566936, 227633, 2920041, 2586644, -1620813, -2081985, 1464047, -1025960, +718870, -2966212, 1269700, 852551, -4628364, -1081795, 1071594, 687195, 450435, 897648, +-225486, 318364, 411243, 443992, -1648731, -261993, 667331, -567473, -2015950, -1062468, +345745, 304943, 2330557, -3466576, 5776194, -9733470, -1663226, -12071006, -3544959, 1839857, +4235912, -10996727, -2737505, 7610145, -898185, -11003169, 5743445, -3488050, -6303938, 3513820, +5818070, 1364726, 1235340, 2052994, 7598871, -3540664, -3124052, 2037962, -3731253, -1855963, +126165, -366146, 279173, 6135361, 3143379, -642635, -503048, 3614215, 1518808, 4425964, +-348966, 4989679, 5240934, 2146410, -5655935, 892816, -765041, -3972845, 5508833, -3030100, +2327872, -3682398, -1346472, -13456669, 1273995, 11066520, 1007170, 11761231, -2118493, -2542621, +-11989401, 14198088, 6688338, 8127689, 1356136, 6679748, -34360, 38118, 5541582, -3124052, +2032593, 70867, -13442174, 3189013, -3119757, 3660386, -1986422, 3314641, 12563853, 3875671, +3346317, -49392, -7553237, 5809480, -3036542, 1250909, 2913599, 3870303, -4134443, -995896, +-1680406, -2153926, 2497524, -1311039, -1037772, -1663763, 344671, 575526, 242129, -3381213, +1459752, 730144, -729071, 1134945, 546535, 1008244, 789200, 1793149, 75162, 486405, +-151934, -670552, 2159832, -258235, 3019899, 598074, 1296543, -769336, 1693828, 689342, +1391569, 1453846, 1224603, -15435039, -619012, 11789148, -2667712, 7020661, -7563975, -5039071, +-13532905, 7769596, 3871376, 9003862, 4052839, -4288525, 7395397, -1798518, 7071664, -4629438, +-4480725, 641561, -1713155, 6315213, 1196148, 5340255, 5755793, -3419331, -3105261, -1981054, +3753802, -703301, -2600603, 887448, -5389110, 2818572, 1762010, -2690260, 3799436, 6951942, +-2854543, -3027952, -935766, -5099200, -2626373, 7975218, 965294, -4801774, 9484362, -10462540, +1563368, 5732708, -2521683, -3389266, -882079, 4586488, -8152385, 4113505, -3371549, -6830609, +-5282810, -4096862, 49929, -1895154, -4505421, 1977833, 11807402, 6647536, -1714766, -4017405, +-11611444, 1292248, 6309307, -3683471, -12821014, 410706, -2084670, 707596, 1521492, 5908265, +-424128, -2905009, -1210644, -4584341, -2823404, -2135136, 3428995, -2823941, 3177739, -6724845, +498753, -3055332, -2144799, 4189204, -2036888, -1890859, -2439542, 901943, -4401805, -1676111, +-1060857, -113817, 866510, -3023120, 810675, -2388002, 1289564, 1666984, 3507378, 722091, +1232119, 1930051, 1381369, -970663, 524523, 274878, 2600066, 1586990, -322659, 1641214, +-181999, 190589, -1138166, 214748, -38118, -1828582, 511638, -1247688, -1038845, 183610, +1365800, -346819, 5165772, -2273112, 1310502, 7646653, 491237, 8957691, 9700184, 21662204, +14763950, 9060770, -2308545, -11471321, -4009352, 10513006, 4537096, -11081016, 8260296, -1933272, +-5508833, -6781754, 1001264, 18725520, -12703976, 13540958, 5272609, -2920041, 4434554, -3663607, +9677635, -3724274, 5104569, 1015223, -6740415, -4715874, -6568079, 245887, 5527086, -1607392, +-3710852, 3564823, 444529, -1126355, -12685186, 3826279, -7114614, -5378910, 3476776, 8341364, +-6185290, -8891119, 296890, 7528541, 602906, -5073967, -1906966, -3025268, 3417720, 2494839, +-2933463, -4798016, -7210713, 4435628, 11515881, 7055558, 3624416, -6706592, 3451006, 7288560, +-8214662, -10714870, 1853278, -8850317, -4245575, -17337172, 205622, -11911018, -6215355, 3184182, +-1512365, -1160178, 5248987, 879931, -9723806, -6750078, 4359392, -1361505, 512712, -3039226, +269509, 2815351, -439160, 1859184, 1874753, 368830, 162672, 1373316, 1615445, 1061394, +112743, 313533, -993748, 2541010, 53150, 2335925, -435402, -1595044, 751082, 2171106, +-2768107, -4075387, -2077690, -613107, -1279900, 4576825, 1722282, -1477469, 2036351, -1196148, +299037, -3741454, -341987, 237834, -1707250, 23685670, 542777, -9291625, 10457172, -11442867, +13233868, 1055488, -8047158, -13813689, -3336653, 6750078, -10963441, 9714679, -1550483, 6254546, +7477001, -6438156, -2669322, -3884798, -5112622, -2011655, -4778151, 771484, -5840619, 6046777, +3830037, 5070746, 10333691, 5295158, -1549946, 12305081, 6277095, 2249489, -6630893, -7249368, +3687230, -5557688, 1256815, 3865471, -8252243, 7017977, 18773302, 1398012, 13345537, 6291054, +6445672, 9504763, 534187, 5019743, 5317170, -12202002, -8274792, 8352638, 534723, 7880191, +1382443, 8273718, -1373316, 2948495, 2037962, -17468706, -1180579, 4433480, 11624866, 2558727, +10189810, 994285, -2448668, 3308199, 4548907, -9829033, -16581258, -8777839, 2232309, 4023311, +508954, 12091944, 4234301, -19079318, 4795868, -2811593, 51540, 5424007, -7689065, -312459, +-4168803, 3450469, 4865124, 245887, 1005022, 3506304, 85362, -86973, -1711008, -1879585, +583042, 304406, 55298, 2916283, 2088428, 692027, 1719061, 1097364, 10737, -2973728, +2257005, 1850057, -1221918, -314069, -479963, 84289, 1625108, 1355599, 4430796, -3847217, +-1158031, 1633161, -1008780, 2308008, -1966021, 3897683, -1025960, -1265942, 474057, 2206003, +1521492, -616328, -346282, -1624571, -381178, -11573326, -903554, -10314364, -4720706, 4226785, +-5085242, 2222109, 3584150, -6212670, -15153718, 4818417, -15012521, -17440252, 3861176, -8609262, +7755637, 10865730, -2709588, 12690555, -3001109, 12537010, 17264158, -38655, 1100049, -17409114, +-3194382, 1825361, 3054259, -2082522, -11345156, 743029, -9594957, 1180042, -2526515, 2582349, +-3634079, -6466610, 1538672, -1197759, -3451543, 4014184, 488553, -2702608, 12491912, 4551055, +9398999, -5945846, 1800128, -5023501, 3631932, -1169842, 4963909, -1699196, -3598646, -4823249, +-10897943, -6543920, 17795124, 7105487, 11829951, -13662828, 2944737, 9984188, -8483634, 7516, +6650220, -3630858, 6672769, 868120, -11790759, -3160559, -18194018, -2336999, 7452842, 3732327, +12349105, 1309428, 8230231, 8610873, 3099356, -627602, 15975131, 1262184, 493384, -2811056, +-1492501, 8331700, 5008469, 7964480, -881005, -1744294, -1986422, 5792837, 1269163, -1313723, +1661079, 3946538, -896038, -2462627, -4610648, 77846, -3667902, -1742146, -3121904, 2593624, +-326418, -5552856, -964757, 321049, 444529, -352724, -2545842, 3635153, -2979634, 864362, +1437203, -4213363, -740345, -2845416, 585726, 3213173, -2917894, -2487323, -1809792, -1889249, +1862942, 961536, -11258183, -10040560, -10662793, -15539729, 10599442, 6869800, 942208, -10457172, +9447317, -86436, -13205951, -10795937, -3776887, -2690260, -8460012, -3330747, -5021354, -4249334, +-3136400, -12207371, 6099928, 7151658, -646929, -1135482, -2240362, -4509716, -14512694, -15815680, +471910, 6867116, -4189204, -9739912, -5484673, 7419556, 5442798, 362925, -3059627, -4183298, +-4251481, 9383430, -4786741, 6597070, -4529043, 198105, -15779710, -3432216, -1252520, 11909407, +3263102, -2783139, -8876624, -6160594, -12419972, 20036560, -9220758, 19029390, 2415382, -8192113, +12540768, 12364674, 21346524, -20936892, 8661875, 3491809, 2814277, -4151086, -6029061, 9266929, +4782983, -1585917, -9839233, 10932302, -5749351, 11752641, 9687836, 9197672, -8332237, 18147848, +-13405667, 7466801, 11683385, -6728603, 1451699, 341987, 10150081, -2695629, 4505421, -5294621, +10847477, -339302, 1895691, -6227703, 4947803, -338766, 5104569, -1479079, 6883759, 3375844, +2166274, -4065724, 1295470, -3403762, 190052, -2897492, -3921305, -782758, -3463891, -2301029, +-375810, -1752884, -3451006, 2367601, 2862596, 4225711, 977642, -3941169, 367220, -2659659, +2666101, 1121523, -1941862, 525060, 1862942, 1126355, -4444218, 875100, 4452808, 1753957, +-704375, 1287417, 17064978, -28491740, -30508226, -19234474, -3156264, -13420699, 8271034, -11043972, +1192927, 5446019, -758062, 20083268, 14567455, 5100274, -5833103, -4519380, 14152991, -2388539, +2252174, -5798743, -12499965, 9127, 5163625, 3345780, -6835978, 6068789, 948114, -841277, +12011950, 16411607, 1260036, -10524280, -4442607, -20170240, -7726646, -5226439, -5966247, 893353, +3612604, -7341173, -2843268, -10261214, 11132555, 13238700, 11134703, 12361990, 9819369, 16181826, +2077690, 5548561, 3937948, -2946885, 6336151, 9644886, -9587978, -33474976, -7696045, 11115375, +-17245368, 8838506, 11033234, 3952444, -5177046, 838592, -4068408, -13440026, -3559991, 8749922, +-10650982, -9094593, 3330747, -7382512, 21891986, 22167936, -8106751, 14277008, 3871376, -2090575, +-9600863, 6830072, -12986370, -10816875, 12011950, 9004399, 6410776, -833224, -1042603, -15942382, +-11361799, -2095407, -3520263, -2964601, -2276870, -4710506, -3797288, -4390531, -2090039, 586800, +3880503, 2983392, 5107253, -414464, -2257542, -2383707, -1508070, 7204271, 6808060, 3464428, +-494458, -450972, -1410360, -2684892, -4057134, -1840930, 890132, -1231045, 3044595, -1535451, +1231582, 1395864, 1372779, 2758443, -3061238, -50466, 794569, 2339684, -3712462, 6647536, +-2599529, -1671816, 27492622, -23165442, -261456, 3730179, -21843130, -6661495, -9127879, 3151969, +-6556805, 18938658, 2616172, -396748, 23998666, -1508070, -20987358, -17104170, -10229001, 8011188, +-1093606, -20644298, 5383742, 5551245, 10897406, -12342662, 6315750, 10215043, 9143985, 7097434, +-2380486, 12239583, 13500693, 4377109, -29717952, 21661130, -10588168, 8259759, -2067490, -3235721, +5819681, -13353053, -7451232, 13887777, -6314139, -1961726, 12777528, -14317810, 12848932, -5059472, +11936251, -15756088, 20946556, -9400073, 32355600, -4348118, 2113661, 8180302, -7057705, -5418101, +-3843996, 2514167, -1578401, -16354162, -20331302, -5745593, 11915850, -6219650, -7344931, -20890720, +9643275, 2047626, -28347858, -503048, 438624, 4109210, 14672145, -10008348, 4621922, -12829067, +-11101417, -16988206, -16816944, -3070902, -9818295, 12133283, -1986959, 11851425, -5769752, 6721624, +-915365, -7703024, -10578504, -1289027, 1304060, 5124433, -2490544, 2219961, 1079111, 4183835, +-390305, -5702106, -785442, -8593693, -363462, 1322850, 1921461, 422517, -3204046, -4196720, +4723927, 2116345, -1381369, 5281199, -6682432, -8995809, -136365, 7890392, 212064, 2251100, +3168612, 5383742, 350040, 6031745, -4925791, 1909113, 1239635, 4899484, 8400956, -5251672, +1376000, -1264868, 1395864, 10546292, 31698470, 15849503, -9683541, 21887154, 7175280, -13930726, +5357972, 14156212, -2204392, -4776541, -19500762, -5247377, 12000139, 7888781, 5701032, 3573950, +-3531000, -7780334, -18408766, 9829033, -6287296, 4918275, -14139032, -7603166, -369904, -2132988, +18066780, 5494337, 2864743, 13891535, 6629819, -20904680, -2467996, 7707856, -3946538, 482110, +17849348, 5928129, 20725364, -12029667, -7638063, -3356517, -7762080, 8188892, -8090645, 15674483, +15533286, -6792491, -15222975, 25509422, -13125420, -5240397, -3076807, 7633768, 3854196, -14150307, +-4262755, 9139690, -6779606, 11579232, -5480379, 16384763, -8512625, 3739306, 24946780, -451508, +17566416, 30518964, 3826279, 15011984, -7758322, -36599564, -24865714, -4707821, -1595044, 20876226, +-706522, 7014219, 1742146, -5131949, -17008608, -37775312, 28594282, 2025077, 817118, 9409200, +4431333, -9178345, 21126408, 1105954, 4434554, -217433, 1390496, -18609556, -6965363, -12253542, +-7459285, -558346, -6973417, -6902013, 4292283, -1467805, -4815732, 13691282, -2586644, -13841069, +-9968619, 3527242, 638340, -3986804, 21087752, 6419903, -7118372, -8133058, 2145873, -1862942, +-4431870, 726386, 1891933, -4723927, 4961224, -127775, 7187091, 9433896, 1781875, -854699, +-2899103, 6332930, 6044630, 5534066, -41399188, -9911711, 43236900, -16597364, -18539764, 38176352, +-24495810, 21512954, 28750512, 11362336, 3950833, -21836688, 8356396, -38305204, -18872624, 8381629, +19913078, 2252174, 4592394, 14516989, 38744364, 26191248, 8184597, 1445257, -46171, 4310537, +3198677, -15036681, 318364, 9587978, 12119324, 51707648, 29142964, 19925428, 37335612, 15256261, +-5352066, 11217381, -710280, 35773320, 12942347, -2923799, -5972689, 14946486, -2310693, 17162152, +-53348324, 2300492, 18355080, -1105954, 22217328, -8319352, 5860483, 11838540, -49676664, -19197430, +-3910031, -15910169, -20592758, -24256364, 22673132, -14842870, 4503810, -4549444, 22749368, -37323804, +-10271951, -5272073, 11681237, -188442, -3471944, 27494770, 47937740, -257161, 14882599, -9108552, +3990025, 33539936, -35756140, -21246666, -29940754, -37740416, -3366181, -1549946, -14934675, -16040092, +-15208479, -14434311, -18618146, -26958972, -11832635, -17515950, -10783589, 4607963, 23531052, 7468412, +3456912, 3454764, -2481417, 5158793, 2151779, -16926466, -15290084, -4490389, -21489332, -8621073, +-9582609, -7486665, -8595840, 9582609, -7970923, 419833, 1224066, 4015795, 11500312, 17702244, +-462783, -4741644, 12732967, -6841883, 7999914, 2922188, 1503239, -3772055, 2043868, 1358283, +-7991861, -10423886, -11302206, -1845762, 3518652, 22456774, 19781546, -18626200, -65901440, -11943767, +27025544, 6101001, -7342784, -5346161, 2058363, -9251896, -12082817, 14387604, 10853382, 29822106, +10917270, 17867064, -6748468, 39727912, 7219303, 25129316, -3543348, 36633388, -13947906, 23811836, +-23324894, 51540, 2605435, 16966732, -6720550, -12929462, -30861488, 17047262, 2288144, 3373160, +-14910516, -27855548, -1678795, 3065533, -3394635, 8341900, 17858474, 2547453, 12773770, 45420888, +-19161460, 4421132, -14998026, 23386634, 20437066, -23011362, 21606370, 24493662, -17592722, 6108517, +5817533, 16925392, 8453033, 34544960, 10948945, -12461848, 2098629, 44689136, 14227616, -51430084, +15146739, 9023726, -44113072, -12426951, -14119705, -31334470, 2265059, 19080930, 21109764, -12680891, +37950332, -9931038, -16460462, -8660802, 20073604, -74634720, -9079561, 907849, 60073172, 7781944, +50936700, 24283208, 35751844, -1189169, 12276090, -7035157, 30295626, 30535070, 27582280, -6867116, +-18365280, -7707856, 30262876, -3757560, -19765440, -8792335, 35851164, 4796942, -22301080, -7832947, +32340566, 9039296, 13467407, -647466, 12216498, -9456981, -639950, -918049, 5290326, -1085553, +5718212, -4721243, -10500121, -12655658, -15195594, -2238752, -11096048, -245887, -1985886, -4575751, +10722386, -12473122, -5009006, -12375411, -4499515, -22502408, -16582869, 22199076, 392453, -25942140, +-41120552, 33393908, 71165464, 5036923, -39891656, 61815316, -14074071, -642098, 8582955, 35170952, +-20275466, 1753420, 69709464, -34401076, 16453483, 23812372, 22406308, -30739618, -3317862, 5815386, +-15381352, 2910377, 7097971, -12340515, 12220793, -21107080, -6248641, -8293045, -1803886, -12566001, +-11417097, -3878892, 6546604, -23041426, -21971442, 33021320, 5761162, -20249698, -5561446, 19750944, +47105592, -3853660, -23242216, 24943560, 36084168, -10266582, -2877091, 1214939, 12947716, 372588, +-148176, 16765405, -40242768, 27758910, -23294292, 570694, -32942936, 18662706, -2748242, -48656612, +23967528, -3216394, -19121194, 33299418, 3694746, 32930052, -27806156, -10298795, -11346767, -25268366, +-39832600, -52162376, 44318156, 18476412, 32573568, 30495878, 18504330, 7576323, -19053012, 28893856, +-14416595, -11757473, 38534984, 13219909, -7489886, -3189013, 11608223, -27169426, 6875706, -10562398, +17979806, -6695317, -11938398, 17637284, 2748242, -20117626, 1447404, -9378598, -5883569, 4612258, +-4652524, 4029753, -1313723, -14404783, -7629473, 6657200, -5089536, -8972187, 8992588, 14765561, +14010720, -11120744, -4873714, 16932372, -28404230, 8768176, 10139344, -11783243, -28227062, 14407468, +1566053, -12336220, 8572755, -13225278, -22016002, 6048388, 19385872, -15893526, -7186554, 7242926, +16896938, -4373351, -2320893, 15206332, 876710, -11671037, 38693896, -15724949, 11434277, 9001715, +-40221832, 36177048, 12600897, -10282152, 30994094, 2641942, 2045478, 15216532, -13498545, 39639864, +-31800474, -16958678, 14743549, 13689671, 6724845, -29496224, -18004502, -32872070, 18194018, 4436701, +16621523, 90194, 17854716, 7270306, 5978058, 783295, 15226196, -6800007, 8385387, -14986752, +11295227, -13846438, -115964, -18300318, -13048648, 840740, -16335908, 7727183, 38970924, 9385040, +-29192356, 15307800, 11734924, 20734492, 597537, 34431680, -29511794, 4589173, 13727252, -28418724, +-6627672, 57563300, 32387274, -76017160, -32284732, 40545028, -11028939, -36032628, 14260365, -3628711, +-27831388, 20498806, 34629248, -46843060, 9302362, 41726144, -28204514, -25269976, 34089692, 4632122, +-28010702, 5045513, 22169010, -24442122, -3383897, 26925686, -3926674, -11914776, -19222664, 24637544, +-6477348, 13762686, 3207267, 13977971, -9527311, 9066139, 24820616, 9841381, -18259516, 1544041, +-13059922, -8806294, -18394808, -1621887, -4896800, -1262720, -12358768, 12693239, 10912975, -4279935, +28369332, -7138773, -30123826, 36319856, -4287988, -6863895, 6705518, 12742094, 1720134, -3335042, +30640296, 16865262, -21497386, 1852205, 8727910, -15584289, -12885976, 22179212, -11398843, -41981156, +40494024, 5190468, -40929428, -1176284, 21581674, -15360414, -34417184, 19892678, 26538602, -42432128, +6263673, 31998580, -18727668, -3255585, 35013112, -2565706, -14283987, 8231842, 14798310, -19153944, +-5233955, 20548198, -4677757, -17899814, 15079630, 9008694, -10432476, 33817500, -72796472, -4968741, +-13060459, -80502184, -14667850, -24700894, 7685844, 14063870, 23643794, -10467909, -31723166, -11716134, +-45676440, 6263136, 16009491, 9582072, 6958921, -36368172, 22161494, 3729105, -44180180, 32247152, +-47493212, -19149112, -17987324, 12985297, 33897492, 39797168, -3528853, -8759586, -76707040, 32981054, +77098424, 28368796, 1487669, -42359652, -62595928, -25436944, -5561446, 32692754, -39325796, -23165442, +-40396316, -12628278, 71970232, 78084120, -13906030, -35798016, -31295280, -16356846, -8570070, 39391828, +-19005768, 11877195, 7833484, 26243324, -7537668, -17477296, -45886356, -19628000, 68978248, 29819422, +45777372, -42215232, -23855322, -19492172, 46774880, 1078574, -77120432, -73900280, 41049148, 71474696, +119288424, 21051782, -102062384, 17125108, -27262304, 34685084, 32915018, -124450976, -40134320, 24441586, +65226596, 16067473, -63809792, -14101451, -6751152, 36954436, 31049930, 8503498, -51196548, -7856032, +10740639, 22727894, 10869488, -13160317, 1779727, -28023588, -3954591, -405874, 26778584, -18537078, +35845796, -23067732, 9954124, 21086678, -9059160, 17496086, 15058692, 28490128, 1087164, -13766981, +-16768089, 2600603, 1016834, 4839355, 2607045, -927176, -2278480, -10285373, -11227581, -2157684, +17609366, -4625680, 135291, -3760244, 5647882, 1342714, 9659381, -9139154, -12228846, -23537494, +-12025372, -1400696, 12847858, -12597139, -1161252, -36853504, 31479426, -32895154, -6950868, 1021665, +8443369, -6367826, 7588134, 12518219, -20935818, -18314814, -253940, 4582193, 13682155, -15464567, +2295123, 11450383, -8908299, 7060390, -4559108, 35471600, -371515, -5610838, 20650202, 11009075, +18364744, -9450002, 11774116, -3936875, -358093, 14800994, 10821170, 2268817, 4618164, 20038706, +-18780818, -5946382, 2155537, 27117350, -308701, -6396280, 25569014, -6703370, -10929081, -11244224, +21206402, -5235029, 9333501, 5405217, 3334505, -7634305, 3912178, 7988103, 3027415, 23578296, +11938935, 6542309, -10189810, -1767916, 9200357, -17196512, 6240588, 6260452, 17658758, 39192, +-1967095, 9727564, 2305324, -19921668, 22314502, 6593312, -5070746, 18246632, -12407087, -1739999, +-9233643, -8360691, 18253074, 13094282, -1154809, 6463389, -10741176, 2347200, -14518063, -1569274, +-13290239, 2811593, 8731132, 2972654, 1697049, -3074123, -1770063, 2384244, -7919920, 2157684, +-3394098, 3623879, -5201743, -2025614, -4812511, -6386080, 3069291, -1248225, -361851, -2461553, +8647917, 3158949, -10851235, -11541651, -7722351, 2232846, 3599183, 8143258, 4963909, -10646150, +-1520418, -4108673, 9661529, -2571075, 10415296, 4147865, -8475581, -95026, 4639102, -5007395, +6655589, -4053376, 7519414, -5425081, -1663763, 2269353, -4206921, 57456460, 4631586, -21241834, +-17581448, 2838437, 12993350, -812286, 11859478, -4535486, -3181497, -15960635, -3510599, -11186779, +17732846, -11127723, -913217, -7038915, -3316252, -4145180, 1932198, -11827803, 1797981, -5120138, +-8320963, 2399276, -1335735, 625455, -2262374, 4109747, 1989644, -9907953, -6350109, -53687, +-6702297, -5867462, 4876936, -1648194, -10095858, 617402, -5622112, 4243428, -14907295, 7385733, +-6489696, -11359652, 3417720, -5240934, -5877663, 1465658, -116501, 636729, -2497524, 2431488, +-4575214, 4966593, -3147137, 460635, 8280697, -6069863, 2763812, -1656784, -903554, 2185065, +-6889128, 6163815, -7242389, 6152004, -1534377, -387084, -4648229, 5807333, -6962142, 368830, +2419140, -9203041, 9059697, -5640903, 3825742, -4295504, 3652333, -3332895, -4061965, 6662568, +-4277788, -932545, 6605660, -4387846, -102005, 453119, 1009854, -4844723, 335007, -524523, +-2117419, -1431835, 1094143, -1591822, -2604361, -1372242, 2847027, -2751464, 2120103, -855235, +-355409, -956167, -2017024, 1741072, -1381369, -1654636, 1933809, -2192044, 1516660, 619549, +-1312649, 195958, -383863, 434329, -4072703, 3728569, -4188667, 593242, -672162, -2284386, +489089, -1316408, 2746632, -7047505, -27831924, -44482976, 47165184, 164634688, 31381716, 49520972, +-101457328, -140728368, -58997280, -73630768, 56807920, 132200168, 75782016, 51109572, 4956929, -72663864, +-64581276, -64316600, -26499948, 36672580, 31037044, 33432026, 29799556, -886911, -4992900, -7531225, +-10527502, -15168214, -2208687, 20304458, -1937567, -11630235, -4743255, -16850230, -9677098, -2850785, +-4358318, 32511828, 29995514, 17922362, 18992346, 1075352, -23549306, -23776938, -43928388, -29080686, +3883187, 3661997, 8807367, 25928180, 36674724, 22175990, 18408766, -764504, -20969640, -28922310, +-25163140, -20928302, 2884071, 7567196, 13360570, 9390409, 6072547, 1416802, -7711614, 3047816, +617402, 3242164, 18176838, -1648194, 7987566, 8383240, -13717589, -25666188, -26598196, -23826332, +6236830, 19640348, 14091251, 21483426, 18787260, -6287296, 4645007, 11732777, -7635378, -7014219, +-16572668, -21185464, -8349417, -4975183, -2307471, 9026411, 4100083, 4889284, 14212047, 13642427, +13989245, 8070781, 3497714, -7027104, -8839580, -21785684, -24016920, -16933982, -12532715, 5419712, +15528991, 19682224, 26285736, 18868866, 11944841, 196495, -8269960, -12884902, -27352500, -28896004, +-10289131, 5180805, 13753022, 11052025, 9550397, 11061151, 7910256, -528281, -2126009, 1175210, +233002, -4793721, -4367982, -14606647, -9654550, -404801, 5229660, 7198902, 5647882, -2178622, +-299574, 5305359, 4131759, 314606, 2860985, 2558727, -1737851, -6886443, -6230387, -5964099, +-1406602, -1578937, -137976, 1261110, 6087580, 6774237, 6088116, 2902861, 1948841, -2887292, +-5279052, -6484327, -3827890, -2286533, -19864, 338229, 2238215, 1950989, 3643206, 2470143, +1488206, -625992, -281857, -881005, -558883, -2234994, -2036351, -1742146, 1205812, 1414118, +1750736, -423591, -638340, -1029718, 936840, 202400, 922344, 183073, 1057099, -472983, +-454193, -1007707, 549219, -186294, 288837, -1067836, -392990, -907849, 355945, 93416, +1283122, 228170, 585189, -88584, 916976, -12885, 129923, -1384053, -779000, -1236414, +123480, -155156, 932545, 87510, 847719, 146029, 672699, -518617, 111669, -633508, +279710, -474594, 361851, -360240, 394063, -543313, 209917, -392453, 561030, -222265, +479426, -379031, 417686, -370978, 435939, -354335, 414464, -418222, 367220, -443455, +350040, -446140, 369904, -405874, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 2206540, -6285148, 561030, 4196183, -944356, -649077, -2254858, 4476430, 2872796, -2681670, -3471407, -2238752, -867583, -5404680, -6200322, 1443646, 332323, -2133525, -2099702, -4221953, 2697240, --4960687, 1282585, -518617, 1138166, 372588, 1077500, -2247342, -301185, 841277, 1437740, --539018, 1755031, 1231582, -2165201, 1614908, -1301912, -4234838, 5987722, -1179505, 293132, -1387811, -726923, 3257196, 4228396, -936303, 1600412, 3128347, 287226, -3390877, -2547989, -807991, 2022393, -1052804, 1115618, 3846680, -3395172, -3113851, 3246995, 579821, -1257352, --2115808, -68719, 701690, 2469069, -3951370, 1947768, 962073, -3033321, -3339874, 2842195, --1833414, -4026532, -1765232, -358630, 6077916, 7081864, -644245, 1193464, -913754, 1107028, --1198833, 1897302, 1105954, -1143535, -425739, -1215476, 570157, -1627793, 1522566, 1410360, -282394, -1909650, 196495, -69256, 809064, -477278, 1273995, -655519, 200253, 106837, -778463, -157840, 249108, 260382, 805306, -17180, -7763154, -3356517, -5355824, 3508988, --2597918, -3639448, -2464238, -3263638, -648540, 1201517, 5872831, 1012002, -3138547, 4955319, -192737, 5108327, -4912369, 7912404, 3672197, 8583492, -1541893, -2925947, -591632, -4728222, --403190, -340376, -1713155, 1602023, 157303, -3755412, -911607, -17180, 1160178, 3721589, -857920, -5613523, -4674535, -1776506, 3149285, 205622, 152471, -2847563, 4668630, -131533, -339302, -2018635, 592706, -1221381, 2448668, -798864, 7784092, 61740, -1028645, 2946885, --1970853, -3508452, -1454383, 2633889, 4695473, 775242, 2873870, 703838, 481036, -2478196, --2421288, -3966939, -182536, -4112431, 1014686, 3340948, 3564823, 2505040, -1278290, -1825361, -3199214, -2280628, -957241, 1997697, -1838246, -326418, -959925, 2068027, 3679176, 1898376, -1073205, -936840, -422517, 661425, -376347, 2465848, 410706, -1208496, -723165, -556198, --175557, 343597, 297963, 37581, -392453, 1142998, 717796, 54761, 433792, -893890, --578210, -713501, -842350, -296353, -943282, -915902, -208843, 1173600, 5421323, 5880347, -3093987, 18254, 4782446, -2571612, -4079682, 3986267, 4121558, 5254356, 7703561, 762357, --4914517, 2887829, -4686346, -271120, 1564442, 1170916, 8582955, 729608, -6913287, -264141, -1233193, 2962454, -499290, -2286533, -7609609, -1431835, 6459631, 2298881, 4249334, 5042829, -4137127, 1221918, -717260, 4491462, -5649493, -102005, -3839701, 10385768, -554588, 360777, -4596152, -3752728, -595927, 1685775, -572304, 6225018, -943282, 1931662, 5894306, -1071594, -1853815, 562641, -277025, 15569, -765578, -1627793, 2553895, 3490735, -817118, 3475166, -1250372, 6804302, 7702487, -335544, 2068027, 1346472, -3872450, 3886409, -938450, -3164854, -1369558, 3829500, 1074816, -905701, 6830609, -894427, 1866163, 2120103, 1025423, -3387119, --184147, -631897, 566936, -1752884, -359704, 281857, 742493, 805306, 1273458, -366683, -632971, -1622961, -1132798, -2030446, 1624571, 606664, -292058, 714038, -267899, -1652489, -1109712, 242666, 810675, -452582, -580894, 379568, 2050847, -2025614, 1176821, 8617852, -8350490, -3259880, -4856535, -4156455, -2934537, 2204929, -9232032, -843424, 1220308, -4342749, --8185671, 7949448, -1760937, -1932198, 1209033, 3695819, 3185792, -3971771, -1660005, -104153, --497679, 1959579, 2720862, -1468342, 3359738, -2497524, 5182415, -562641, 153008, -2616709, -2709051, 1089311, -858457, -2605972, 1209570, -1450088, -2401424, -1896228, 408022, 1796907, --5018133, 496606, -9416179, -5338108, 3306051, -1337882, 1058710, 2161442, 6101538, -1912334, --3162707, -143881, 136902, 2663954, 2434710, -2812667, -1326608, 6876780, 201863, 1110249, -521302, 3099893, -5733245, 263604, 2816962, 5359583, 1050656, 2343979, 7982734, -1908039, --817118, -4283693, -2684, 1393180, 2755222, 60666, -1795296, 2524904, -272730, 4532264, --18254, -113280, 486942, -5586679, -2973728, -3282429, 3086471, -490163, -972273, -4295, -353798, -177704, 1591285, -478352, -1002875, -1198833, -673236, -1716913, -1202591, 1350230, -18790, -450435, -951872, 435939, 284542, 139050, -845035, 1476932, 559956, 935229, --279173, -75699, -1082332, -1103270, 673773, -526134, 933082, 1314797, -51003, -5516349, --8425115, 3569655, -2695092, 92879, -4296578, 3330747, -9736691, -8129300, -9176734, -3184718, --1876364, -6530498, 3390340, 8790724, -6428493, 1304596, 10487773, -2467459, -2743947, -4844723, -938450, -88584, 4701379, 1445793, 3406983, 2261300, -3287798, -6665789, -3047279, 3884798, --2142652, -4100083, 1118302, 1609002, 1397475, 779000, 9148280, -4332012, 5026186, -2417530, -2573222, -2694018, 7629473, -5664525, 3173981, -521302, -4373888, 4110821, -1559610, -1540820, -4591320, 2328946, -284542, -2042794, 4183298, 1952063, -4096325, -5091147, 3547106, 5504538, -3235721, 67109, -2319819, 220654, 3652870, -1592896, 4393752, -1072668, -8633421, 212064, --3733400, 12377022, 4447976, -7144141, -3883724, -1461900, -3101503, 3143916, 3215857, 2292976, --1420560, 2662343, 2301566, 705985, -418222, -3721589, 828929, 1190243, -938450, 774168, -1378685, -556735, -47782, 736050, -125091, -1154273, -799938, 18254, 1063541, -1059783, -1013075, 995896, -1259499, -1817308, -2092186, 537, 1420560, -670015, 1275068, -1017907, -22549, 812286, -512175, -2043868, 427886, 3212099, -7188165, -8878234, 7659538, -1634235, --7150584, 603980, -1799591, 7390565, 3732327, -1872069, 1433445, -356482, -1041530, -1304060, -8646306, 1699733, 526670, -5838471, -2611340, -1348083, 3077344, 3795677, 11623255, 315680, -451508, -326954, 858993, -5051956, 302795, 2128156, -6242198, -4431333, -4015795, -488553, -8520141, -6839199, 1246614, 3885872, 1748052, -3181497, 3593814, -8542690, 7088307, -1486596, -78920, 3837553, -4257387, -5049808, -7798587, 1700807, -2498597, 7493108, 2673080, 214748, -1501628, 2301029, 5934034, -2558190, -1208496, 6143951, -1176284, -3457449, -47782, 6148246, -6281390, 5684389, 3142842, -3737159, 3712999, 5144834, -5961415, 7763154, -4646618, -4394289, -7094749, 761820, 10200547, -105764, -5595806, 2520609, -2446521, 6725382, 3282966, 1867774, -536871, 2318746, -1097901, 4233764, 1553168, 1693291, 1357747, 2486249, -111669, -191663, -2015950, -57445, 1504312, -742493, 2423972, 4790499, -2692945, -1263794, 929860, 610959, -395137, 1226750, -151934, 394600, 1071594, 2352568, 260919, 4409858, 1138703, 521839, --1886028, 508417, 1546725, -1969779, 522912, 870805, -26307, 569620, -39728, -15794742, --10497437, 2861522, 5035313, 10889890, -6662031, 5867462, 1025960, 6175626, -370978, -2809446, --3782256, 3830574, 11167989, 995896, -1044214, -10666551, -9022116, 101469, -6648610, -3832722, -321586, 1391569, -6813966, -1980517, 1576253, 4003983, 2052994, -4329864, -75699, 5076115, -4041564, 887985, -4204236, 799938, -2596845, 1254131, 1350767, 2343442, -3252901, 4032974, -9715753, -964757, -792421, 1926293, -5515275, 2601140, 7811472, -7736310, -9220221, -4711579, -694174, -11832098, 231391, 362388, 1591822, 137439, -236760, -5608154, -3096672, -3636227, --561567, 8085276, 11846057, 355409, 721555, 5827197, -2497524, -980326, 2633352, 13413183, -1630477, 4829691, 9345849, 1731409, -6169721, 2544231, 2748779, -2809446, 2830384, 2428804, --693100, -2908230, 1308891, 861678, -696858, -4976794, 2130841, 4571993, 1644973, 3330747, -1793686, 4017942, -935229, -1511292, 3634079, 3069291, -1019518, -210990, -1172526, 2639258, -2804077, -2324114, 2784213, 757525, 284542, 705448, 1480153, 2128156, 209917, 1856500, --1336809, -693637, -79994, -353798, 694174, -1267552, 117038, -397284, 476205, -1705102, --1554241, 8089034, 5182952, -7596187, -259309, 16112570, 14360223, 2966212, 8689256, 10610717, -2762201, -204011, 7072738, -3214783, 150861, -6401649, 5268315, -483184, 332323, 2291902, -2840047, 8747775, -7342784, -6817724, 6800007, 1324997, 3145527, -5333813, 1027034, -1901060, -3533684, -3758, 4930086, 4716411, -4785131, 3985193, 3446711, -5643587, 14409078, 2450279, -2860985, -11180874, -3500398, -951872, 9362492, 8606041, -817654, -9606231, 6300717, -8360691, --2516851, 7214472, -149787, -5946919, 7162932, 8868034, -2212982, 2950643, -3532074, -12573517, -133144, 7964480, -3629784, -4340602, 5338645, -6062883, -9056475, 2205466, 6241125, 11203422, -5965173, -8500814, 3594888, -9976135, -11625940, 10722923, 5131949, 3884798, -7200513, -7900593, --1116692, 8067023, 2774012, 11551315, 5215164, 2867965, -12279311, 1931125, -3373697, 404801, --2815888, 2503429, 842887, 3043521, 5282810, 2655364, 533650, 2232309, -1984275, -1085553, --2022393, -100932, -1887638, -656593, 847182, 3818226, 756451, -1697586, -619549, 1167694, -252866, -425739, -3889630, 138513, -1948305, 672162, -2739652, -3191698, 2155537, 2368675, -3970161, -3899830, 139586, 1925219, 16725140, 10822244, -7333120, -1937567, -336081, 2988760, -2306398, -1009854, -6622840, 1638530, -4561256, 7028714, 153545, 2736431, -2348810, -994285, --6914361, -3601867, 14358613, 4810900, -8866960, 4204236, -8665097, -6031745, -13515188, 5881958, -150861, 244276, 3109556, -339302, -6172405, 10167261, 5720360, -2207613, -10293426, 10254771, --7093139, 2725157, -346819, 3375308, 1935420, 6522982, 7411503, -1728188, 4064650, 11900281, -1436667, -3708168, -3489124, -2084670, 1755031, 7947837, -2271501, 3240016, 530965, -7249905, -183610, -1773822, 3447785, -10913512, -281320, -18203682, -11143293, -10151692, -2673080, -10032507, -6651294, -2499671, -8417062, -2226404, -1039382, -6724308, -3031710, -230318, 567473, -4031364, --8845485, -8741869, 359167, -1893544, 2022930, 4912369, -898185, 2459943, 1104880, -34897, --264141, -4760971, -326418, -93952, -3950296, -310848, 3479997, 6935836, -1327145, -3311957, -2467459, -4289062, 3498251, -3580392, -1471026, 694174, -2745558, -3217468, -159451, -2007897, -360240, -747324, -3383361, 1597728, -277025, 4046396, 2575907, -2850248, 2291902, -1591285, -2118493, -1305670, 1388348, 1424855, 945430, 85899, 1459752, -1883880, -1174674, -2093797, --4394289, 563178, 1367947, -436476, 749472, -3314641, -11494406, -14307073, -6784975, -9501541, -24708410, -11928198, 5608691, -11260331, -3236258, 1256815, -1818919, -16809428, -339302, -7953206, -614180, 19937776, -6343130, 8404714, 10954314, 4019553, 4464619, 12018929, 3575560, -4584878, -3416647, 4755066, 5063767, 2210298, -2463701, 13979582, 551903, -1047972, -2309082, 3842385, --1166084, -4770635, 4729833, -1720671, 3399467, -13401909, 585726, -2531883, 12214887, -4737886, -3957812, 18351322, -1567663, 456877, -4436701, -7480223, -408559, -1164473, -7704635, 9785546, --2066416, 7121056, 773631, 6730214, -3835943, -641024, 14636175, 7226283, -11322608, -5862094, -3117610, 3591667, 1762010, 3193845, -3291556, 4214437, 5382131, 12217571, -15567646, 1018444, --6645925, 3259880, -264141, 1865090, 5756867, 8420283, -5550709, 5973763, -4014721, -2653216, --2236067, -1994476, 4713727, -10522670, -2071785, -4810900, 6096169, 5006322, 2109903, 2621541, --3544422, 4152697, 1873680, 3015067, -407485, 2410551, -3143916, -1678259, -3944928, -240518, --640487, -3456375, -56908, -273267, -952409, 47245, 4202089, 2676838, -2324114, -3701725, -1976222, 1537061, 4820027, -3626026, 286152, -1245004, 2160906, 2559264, -1269163, -1939715, --3917010, -8115878, -7351911, -7850127, 8508867, -16513076, -4915590, -10331007, 5126044, 17203492, --9376987, 547071, 454730, -3320010, 6585259, -5483063, 2627446, -1673427, -7100118, 15350750, -729608, -4951024, 185757, -2197413, -6808597, 5385352, -5225365, 5057861, -9729712, -4462471, -6499360, 4844186, -16233366, -2863670, -13830332, 4155381, -2352032, -13217762, 16125992, -4476430, --361851, -12224551, -13503914, 830539, -12181064, -1537061, -10531797, -8900783, 10536092, 1219234, --13686450, 4524748, -12256763, 10929081, 3877282, -5223217, 360240, 3548180, 11371463, -8792335, --12570296, 12708808, -8900246, -4991289, 6572911, 9605694, -17793512, -8673686, 10018011, 7544110, -3844533, -882616, 1181116, -12691091, 4306242, 4291746, 6956237, -2199560, -13548474, -9728638, -4696010, -11586211, -10256382, 4330401, -750546, 198105, 4167729, 9858024, -66035, -376347, -9064528, 884763, -1572495, 1600412, -1332514, -1828582, 1883880, -2374580, -1786170, -4587562, --4509179, -3124052, 720481, -2596845, -54761, 1893544, 1394254, -233539, -151934, 2021856, --2413235, -3642669, 1003412, -102542, 3400004, -3358128, -1065689, -3810710, 4337917, 4700842, -907312, -223875, -3000572, -1166621, -4177930, 354335, 549219, -2279017, 599148, 926639, -884763, -1012002, 8381629, -12964359, -21272436, -17088064, 7670812, -20440286, -1042603, 15564961, --1425929, 1154809, 11089069, -7355669, -6351720, 24713242, -9822590, 5811091, 9338870, -1705102, --22418656, -1824287, 2309619, -5588290, -3149822, -5170067, 20822002, 235149, 187368, -993211, --15083388, 2785823, -8705362, -4316979, 887448, 2546916, 4407174, 12152073, 2644089, -3092913, -23800024, 2540473, -5945309, -21777632, -3229816, 16025597, -3518652, -9978820, -13466870, -11793443, --10140418, -6324876, 16917340, 6621766, 929860, 9453223, 14127221, 7927973, -3132105, -2462627, -14604499, -2869038, -4536559, 4277788, 11158325, 1617592, -11555073, 2667712, -1204738, -17187386, --1342714, 13712220, -6824166, -7893076, -1967632, 18427020, -14693620, -2921115, -8216810, 8425115, -4838818, 3911642, 5847598, -2399276, -3197603, 6248104, 4936528, 3455838, -1044751, 781684, -3877282, -10805064, -2037962, 1428614, -5638755, 154619, 5876589, -588947, 1054415, -2316598, --711354, 3249680, 4140349, 6278169, 3485366, -1043677, 2193118, -3579318, -4608500, 1315871, --932008, -3713536, 4101694, 2205466, 3093987, 668941, 1480153, 3220152, 1744831, -927713, --2336999, -604517, 1268089, 6979, 1285806, 268972, 1603097, 992137, 2768107, 354335, --2732673, 5949604, 4836670, -4594005, -1590749, -2208150, -1572495, 2280091, -2792803, 1640141, -17357574, 1746441, -15511274, -575526, 4643934, -564788, -7078643, 6723235, -5242008, 13795435, --10634876, 9475235, 20720532, -5624797, -5542656, -4903779, -4335233, 18494666, -13743358, -15100031, --11530913, 4177393, -6030134, -9732396, -4495757, 6623377, -9337259, 5117991, 1185948, 7231651, -10748156, 1292785, -1416802, -2107218, 10588705, -2778307, 3712462, -13071196, -162672, -4684199, -10315438, -13893145, 11318849, -4832375, -7191386, 11397769, 19779398, -11203422, 5585068, -2517925, -3960497, -29841970, -23681912, -14385993, 1996086, -9150965, 3852586, 907312, -11141145, -8806294, -882616, 23673322, 5515275, -14865419, -22204980, -11744051, -8254927, 14475114, -10176925, -14485314, -3355980, 3084860, -13422847, -917512, -317828, -6691559, -1618666, -433792, -658204, 6437619, -1503239, -7747048, -6905234, -3824132, -9910637, -5426155, 1519345, 10947872, 1745367, 1978369, --3307662, -9149891, -1515050, 7326678, -467078, -4307852, 6704981, -10425496, -5195837, 1458141, -1516660, -267362, 1023276, 630823, -3618510, -7333120, -2732136, 5420249, -3344169, -2676302, --3030636, -6559489, -7286412, 2570538, -2711735, -1666447, -6881075, 1557999, 4265977, 5238250, --386010, -3321084, -3914326, 3743064, 1171452, 3374234, 29998736, 19393924, -4978404, 1845762, -19464254, -7742216, 812286, 8180839, 21060910, 12154757, -3492882, -4767414, -7078643, 1778117, --3831111, 225486, 680215, 21925272, 36575404, -2225330, 25277494, 15781857, 3401077, 3855807, --17759690, -17847736, -1870458, 4628364, -1130650, 4282083, -6534256, -13375602, -22293564, -2001455, --14290430, -12284143, -7938710, -12710956, -8931384, -560493, 20996484, -722628, -15666967, -1388885, -4656819, 15418933, -4704063, -3979287, -9292162, 6973417, -28214178, -25538412, -12110734, -12760348, --13472776, -8309688, 9200357, -11505681, -15740518, -13406204, -23620172, 12161737, 6685117, -21161304, -10994579, 21325050, 42012296, 23067732, -105764, 7623567, -23929948, -9870372, 13124346, 10946798, --6014565, -16305306, 2277943, 3413425, 14972256, -1887638, -15053860, -2660195, 24415816, 15498389, -17722108, 13975824, 24627880, 23050016, 7074348, 6278706, -5228049, -9661529, -2535105, -820876, --8119099, -1611, -9408126, -7107634, 11274289, 4969814, -2856153, -9608379, -3511136, -1111860, -15032, -10693395, 10877005, 186831, -8813273, 5433671, -5366562, -4596152, -1201517, 3411815, -14946486, 7294465, 17849884, 144418, -3305514, 2090039, 6922951, 4571993, -2093797, 9405442, -633508, -2929168, 1566589, 7805030, -3616363, -3175055, 3064459, -563178, 2764348, -30735322, --3057480, 49740016, -3751117, 1918240, 12272869, -17998060, 10052908, 35306780, 32371168, -32686312, --31549756, 107911, -34215320, -12798466, -155156, 4055523, 12341052, 18851686, 16429324, 29336774, -6803765, 11626476, 11545946, -4818417, -2176475, 3303904, 3767223, 8753680, -15757161, 35243964, -14985141, 16522739, -3136937, 35793184, 4348655, 21628918, 8837432, 6858526, -8468602, -5319854, -18119930, 7128035, 8391829, -19031536, -10312216, -15867757, -9401147, -11502459, -108448, -23062364, --25253870, -1330903, -9754944, -47398724, -35431868, -31897648, 9099425, 34802656, 44843216, -24641838, -30909270, 48266304, 8181913, 4218195, -3088618, 33266670, 2507187, 30113626, 12869333, 14187351, --19976966, -65906272, -52331492, -11652783, -1785096, 1568737, 2322504, 24588688, 23085450, 20265804, --12514998, 1778117, -6531035, -33894808, 3447248, 2880313, 17131014, 2822331, 25192668, 22925998, -5647345, 19965692, -8369818, 13576928, -11884175, -13212930, -4929549, 5486284, 21898964, -4756140, --6155762, 3398393, -10821707, -5132486, 11091216, -2979097, 7667591, -13623636, 18796388, 5859409, -200253, -1125818, 14459544, -3385508, 1017370, 2527588, -282394, 9990094, -7092602, -3459059, --96100, 9608916, -14055280, 2044404, 5017059, -6694244, 1053341, 2728378, 1746978, -3176128, -23669564, -4863514, -43943420, -3386582, 68867120, 13110925, -13361106, 18311056, -6111202, 12073690, --5927055, -7070053, -23191750, -8140574, -2858838, -3377455, -11296301, 16825534, -15173046, -15465103, --1459215, 2981244, 14150307, 6965900, 3632469, 6632503, -6280316, 569620, 21314312, -10627897, --26176216, -4728759, 1917703, -8279087, 17686676, -8986145, -6420976, 15639050, 3929358, 11918534, --27025544, -29609504, 9659381, -5355288, -10554882, -12426414, -16206522, -32648194, -233002, -2455648, -10729365, -20742544, -44506060, 33549064, 8797167, 31562640, 3156801, -9590125, -9671729, 8549669, --16941498, 26248692, 4833449, 31415538, 21311090, 46426448, -4844723, -43704512, -34622268, -19069118, -25105694, 25976500, -19705846, 20718386, 39908300, -23250268, -3954591, 43672300, 6419903, 33647312, --5236639, -16536698, -45283452, -17054778, 4764193, 29130616, 24717000, -14354854, 12256226, 12244415, -23420994, 8611409, -23991688, -27582816, -11370926, 19772956, 40770512, -623844, -4052839, 21801254, -10923712, 2357937, -3908957, -8592082, -11483132, -8560944, 6638409, 4707821, 12643310, -5055177, --1900523, 1643899, 7483981, 10555956, -13420699, 629750, 14327474, -1273995, -4705674, -15947750, -11449846, 367220, -7451232, -4628364, 16007343, -387621, -10980621, -5261335, 8462696, 643708, --36536748, 37886980, 51390356, 8968429, 2338610, 11438572, -7833484, 22450330, 12558484, 23466090, --4729833, -24713778, 55013164, 357019, -20640540, 2588792, 37217504, 17076254, 7330973, -23504208, -2598455, -12553116, -9162776, 3752728, -17474074, 1551557, 4773320, 21211232, -29949344, -5028333, --3532611, 17935784, -6719477, -10997264, -10477573, -48318, 11458436, -23240604, 1784022, 6251325, --47659640, 6687801, -12851616, -33543158, 22218940, -24758876, -43531104, 57724896, -352724, 3457449, --4446902, -15897285, 34862788, -24463596, -2209761, 5309117, -15766288, -1162862, 44038448, 22854594, --38643968, -41789496, 41472204, -19595252, 24211804, 39855684, -35520992, -61179660, -42343544, 70968968, --4089346, -55370180, 50883016, -36863168, -70312912, -955093, 60852172, -2467996, -72969880, -885837, --24482924, 831076, 90236192, -13587666, -66230544, 9798431, 35434016, 923418, 41419592, 2581812, -942745, -12884902, 1806571, 9634149, 33467458, -6779069, -8865349, 33203856, -4282620, 8074002, -23255638, -3753802, -33530272, 22181896, 16064251, 25949656, -7843147, -377420, 9292162, -7180649, --24636470, -10686416, 10372346, 1017370, -4728222, 32904818, -828929, -36074504, 8642548, 29953102, -17371532, -12370043, 1791001, -14208289, -7912941, 36298380, 30371324, -7572028, -34454764, -10790568, -14383845, 11898133, 9604621, -6208375, -23099408, -865973, -24871082, 37891276, -7846369, 11621108, -23794656, 17420388, 17964774, 44548476, 18911278, -10712722, 6730751, 11111617, 14197551, -15897285, -42395084, 40499932, 5330592, 14137422, -10142565, 150861, -43841952, 20200842, -23276038, 15704548, --2044941, -15827491, 23347980, -9208410, -17883170, 9648644, -25143276, 16718697, 455803, -4531191, -6628745, 10526965, 15209553, 16031502, 14818711, 45392436, -4669167, 5140002, 14055817, 30660160, --3213173, 8316668, -99858, 24036248, 28048284, -8975945, 6601365, -1019518, -4801774, -51383916, -3950833, 22255446, -12520367, -12380243, 11268920, -21254182, -32172526, 3117610, 18009334, 38408280, --49146236, 19025632, -2651606, -1094680, 83752, 19444390, 40939628, 1018444, -30094298, 10233833, -33207076, -17757006, -26481158, 2855080, 14508400, -13823352, 26284662, -4821638, 20182052, 2085744, --20331838, 25210384, 19912542, 3731790, 15692200, -8564702, 9768903, -4499515, 5128191, 8486855, -23964306, -4755066, -29228864, -3400004, 33697240, 2973191, -4365835, 30380452, 6200859, 233002, -7157563, 21205864, 30906584, -19491636, 7578470, 4633196, -1529008, 15614354, -4478041, -22141094, -7366943, 21922050, -9244380, 6040872, 7282117, -6551436, 8335995, -13902272, 10187662, 9636296, --12530030, -26551488, 11501922, 15827491, -7144141, -9378598, 14322105, -610959, -8735427, -9632001, -10185515, 5950141, 23521926, -44414256, -34582004, -641024, -53369264, -18355080, -19752554, 41069016, --1199907, -15250892, 18901078, -9744207, 10467909, 2632815, -20392504, 24274082, -55030880, -5287642, -3317325, -13827647, 10116259, 2377801, -10763725, -2041720, 1585380, 13771276, 799401, -16222091, --53414896, -39026756, -29697014, -14851997, 33047626, -6811282, 1202591, -53562000, 3960497, -3840238, --7286412, 1564979, -51726976, 27548994, -25139518, 12603582, -10321880, 35059820, -19270444, -34222300, --16450798, -436476, 25467546, 46392628, 48831632, -60488172, -44716516, -30959734, 20734492, 49416284, -59925532, -10624675, -15136002, -52979496, -19665044, 46845208, 28648506, -738734, -67109, -1298154, --44707924, 29676614, -9048422, 28633474, 69687992, -78142632, 94392640, 26504244, -51270100, 14124000, --102700720, -100463040, 73913704, 31380104, 7200513, 21873732, -38075420, -18445810, 68868728, -2833068, -46279884, -4763119, -37398964, -12380243, 40865004, -13849122, -1014686, 13079786, -3406983, -24108726, -13191455, -19618874, 8849780, 25898652, -27290222, 25501906, 8519605, -3684545, 9618042, -1813550, --6237903, 4041027, -9553081, 4601521, -19424526, 16872242, 17725866, 3393024, 474594, -6197101, -9024800, 3087545, 3531000, 8588861, 17034378, -21556440, -7330436, -20034412, -15219217, 1281511, -631897, 16689706, -22185116, -17183090, -21386790, -13724568, -5844914, 31291522, -44745508, 37023156, --22278532, 22789634, 11832098, 14405320, 8254391, -28432684, 31008054, -4572530, -11275900, -10168335, --12492449, 9597104, -6632503, 13629005, 7927436, -1733556, -3411278, -23803246, 13706851, 5689758, --6276021, 5348845, 12427488, -3548717, 6987375, -12085501, 14164265, -5304285, 1686848, 5847598, -5937793, -6349036, 21917218, -839129, -20886962, -1357747, 9420474, 4735739, -16012712, 7727720, -18328236, -3461744, -9120363, -8753143, -1360431, 5095442, -2385854, 21705690, -14743012, -5581847, --5332202, -10895795, -1071594, -3321620, 7806103, 5759015, -9117679, -1347009, 8194798, -8766565, --4658966, -2614025, 13269301, -8290898, 5607080, 9021579, -20939040, -8368207, 6513855, -21678848, -32749662, 8805757, 10322954, 15190762, -9772124, -241592, -2992519, -14925548, 2856690, 4949413, -11866995, -2363306, -5197448, 7343321, -7735236, -3102040, 7059316, 101469, -1912334, 6106907, -1715839, -3867081, -317291, -4272419, 9460202, -9062381, 14428943, 669478, 3069828, -6054830, --682900, -2189897, -4691715, -2375654, 3332895, 1776506, 4061965, -64961, -3561602, -2281165, --11410117, 11416560, -9184788, 5181341, -2273112, 6673843, -3842922, -10511932, 588947, 5484673, --8744017, 12977781, -10396505, 5687611, -4029216, 51434916, 6777459, -17522930, -13492640, -10230075, --926102, -1729261, 1183800, -1476395, -1939715, -29199336, 682900, -5874979, -6678674, 3620121, --11392401, -5267241, 5346161, -8052527, 2310693, 8959302, -12179454, 7621420, -4485020, -6564321, --999654, -6565932, 3067144, -6100464, -3174518, -7174206, -1351304, -186294, -133144, -4341675, --4395362, 1260573, 2353105, -5175973, 6924024, -8570070, -724239, -3467649, -1053878, -1675037, --6710350, 9154186, 5692443, -9343164, 11295764, -1225139, 2429878, -5170604, 10838350, -10885058, -837519, 849867, 2882997, -1864016, -2774012, 7991861, -5328981, 1122597, 452582, -1720134, -2604898, -3588982, -463856, 4430259, -2243047, -2135673, 5130876, -2066953, -2207076, -4820564, -2488934, 2246805, -10494753, 12514461, -7086159, 2771328, 886911, 95026, -4055523, 1662689, -5197984, -3920768, -1930588, 2695629, -3855270, -328028, 3187940, -1387811, 1278290, 609349, --2856153, 416612, 383863, 2494839, -4648765, 297427, -515396, -1925219, 1956895, -2382096, -1129576, -1576790, -4070555, 2189897, -3528853, -2128156, 1315871, -2310693, 822486, 1955284, -229781, -3185255, 3277597, -731218, -2018635, 2614561, -25311852, -40808096, 45587856, 153940752, -15510738, 35470524, -83812528, -127807488, -32293322, -66685808, 51938504, 107368816, 56363928, 35893580, --8152922, -41436772, -41041632, -30617212, -28708636, 10369125, 18151606, 10737955, 19548006, 2770254, -1436667, 7938174, 2092723, 8989903, 6896107, -5080410, -19727322, -14324790, -17403208, -23146116, --12449500, 13309567, 16827144, 31665720, 44355200, 16292422, 6305012, -14610942, -35401268, -33961916, --23968064, -16374026, 3258270, 13308493, 18749142, 20313584, 16850230, 11624329, 1200980, -1168768, --11339251, -7574175, -5077188, -5436355, -2315524, -6166500, -1953673, -7343857, -7470022, 2888366, --719944, 9913321, 15884937, 9688372, 23689428, 21388400, -10335302, -20747376, -21086678, -31029528, --8912594, -7337415, -1806571, 19376208, 16993574, -2848100, 14761266, 18743238, 6174016, 13148506, --1291175, -14810658, -10987063, -25549686, -16323023, -5927055, -1723356, -1733556, 4519380, 12313134, -19130322, 24458228, 20431696, 7028714, -11336566, -18204218, -17701170, -19444928, -8920110, -4823249, --2145336, 4500052, 9558450, 7844758, 13418015, 7553774, 8776229, 8237748, -40802, -6533182, --8851391, -10786810, -10867341, -9427453, -5194226, -5129265, 2955474, 5675263, 11014981, 16288663, -15468862, 6079526, 993211, -8732205, -10902238, -12576201, -12862353, -3593277, -667867, -2312840, -2954938, 10053982, 12829604, 6526740, 1337346, -562104, 106300, -2474975, -3004867, -4756677, --3081639, -3589519, -2698850, -1492501, 6979, 150861, 2847563, 5741298, 5909338, 3084860, -1373316, -1497870, -2365990, -3412889, -2589329, -2882460, -1435593, -1340030, -52076, 670552, -2371896, 2166811, 2591476, 874026, 609349, -394063, -562641, -1258962, -447213, -590558, -93416, -536871, -700617, -1874216, -93952, 217433, 1098438, 847182, 1804960, 550293, -418222, -1115081, -427349, 282931, 1009317, -414464, -926639, -1939715, -679679, -47245, -1105417, 333934, 458488, -354335, 437550, 180926, 964757, 359167, 608275, -461172, --30602, -949188, -596464, -1083942, -207769, -437013, 479426, 171262, 1191317, 792958, -948114, -140660, 126165, -692027, -127775, -828392, -420370, -726923, 266288, -111669, -583042, 45634, 489089, -213675, 448824, -116501, 422517, -300111, 140123, -502511, -136365, -368830, 285078, -274878, 301185, -293132, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +6285148, 561030, 4196183, -944356, -649077, -2254858, 4476430, 2872796, -2681670, -3471407, +2238752, -867583, -5404680, -6200322, 1443646, 332323, -2133525, -2099702, -4221953, 2697240, +-4960687, 1282585, -518617, 1138166, 372588, 1077500, -2247342, -301185, 841277, 1437740, +-539018, 1755031, 1231582, -2165201, 1614908, -1301912, -4234838, 5987722, -1179505, 293132, +1387811, -726923, 3257196, 4228396, -936303, 1600412, 3128347, 287226, -3390877, -2547989, +807991, 2022393, -1052804, 1115618, 3846680, -3395172, -3113851, 3246995, 579821, -1257352, +-2115808, -68719, 701690, 2469069, -3951370, 1947768, 962073, -3033321, -3339874, 2842195, +-1833414, -4026532, -1765232, -358630, 6077916, 7081864, -644245, 1193464, -913754, 1107028, +-1198833, 1897302, 1105954, -1143535, -425739, -1215476, 570157, -1627793, 1522566, 1410360, +282394, -1909650, 196495, -69256, 809064, -477278, 1273995, -655519, 200253, 106837, +778463, -157840, 249108, 260382, 805306, -17180, -7763154, -3356517, -5355824, 3508988, +-2597918, -3639448, -2464238, -3263638, -648540, 1201517, 5872831, 1012002, -3138547, 4955319, +192737, 5108327, -4912369, 7912404, 3672197, 8583492, -1541893, -2925947, -591632, -4728222, +-403190, -340376, -1713155, 1602023, 157303, -3755412, -911607, -17180, 1160178, 3721589, +857920, -5613523, -4674535, -1776506, 3149285, 205622, 152471, -2847563, 4668630, -131533, +339302, -2018635, 592706, -1221381, 2448668, -798864, 7784092, 61740, -1028645, 2946885, +-1970853, -3508452, -1454383, 2633889, 4695473, 775242, 2873870, 703838, 481036, -2478196, +-2421288, -3966939, -182536, -4112431, 1014686, 3340948, 3564823, 2505040, -1278290, -1825361, +3199214, -2280628, -957241, 1997697, -1838246, -326418, -959925, 2068027, 3679176, 1898376, +1073205, -936840, -422517, 661425, -376347, 2465848, 410706, -1208496, -723165, -556198, +-175557, 343597, 297963, 37581, -392453, 1142998, 717796, 54761, 433792, -893890, +-578210, -713501, -842350, -296353, -943282, -915902, -208843, 1173600, 5421323, 5880347, +3093987, 18254, 4782446, -2571612, -4079682, 3986267, 4121558, 5254356, 7703561, 762357, +-4914517, 2887829, -4686346, -271120, 1564442, 1170916, 8582955, 729608, -6913287, -264141, +1233193, 2962454, -499290, -2286533, -7609609, -1431835, 6459631, 2298881, 4249334, 5042829, +4137127, 1221918, -717260, 4491462, -5649493, -102005, -3839701, 10385768, -554588, 360777, +4596152, -3752728, -595927, 1685775, -572304, 6225018, -943282, 1931662, 5894306, -1071594, +1853815, 562641, -277025, 15569, -765578, -1627793, 2553895, 3490735, -817118, 3475166, +1250372, 6804302, 7702487, -335544, 2068027, 1346472, -3872450, 3886409, -938450, -3164854, +1369558, 3829500, 1074816, -905701, 6830609, -894427, 1866163, 2120103, 1025423, -3387119, +-184147, -631897, 566936, -1752884, -359704, 281857, 742493, 805306, 1273458, -366683, +632971, -1622961, -1132798, -2030446, 1624571, 606664, -292058, 714038, -267899, -1652489, +1109712, 242666, 810675, -452582, -580894, 379568, 2050847, -2025614, 1176821, 8617852, +8350490, -3259880, -4856535, -4156455, -2934537, 2204929, -9232032, -843424, 1220308, -4342749, +-8185671, 7949448, -1760937, -1932198, 1209033, 3695819, 3185792, -3971771, -1660005, -104153, +-497679, 1959579, 2720862, -1468342, 3359738, -2497524, 5182415, -562641, 153008, -2616709, +2709051, 1089311, -858457, -2605972, 1209570, -1450088, -2401424, -1896228, 408022, 1796907, +-5018133, 496606, -9416179, -5338108, 3306051, -1337882, 1058710, 2161442, 6101538, -1912334, +-3162707, -143881, 136902, 2663954, 2434710, -2812667, -1326608, 6876780, 201863, 1110249, +521302, 3099893, -5733245, 263604, 2816962, 5359583, 1050656, 2343979, 7982734, -1908039, +-817118, -4283693, -2684, 1393180, 2755222, 60666, -1795296, 2524904, -272730, 4532264, +-18254, -113280, 486942, -5586679, -2973728, -3282429, 3086471, -490163, -972273, -4295, +353798, -177704, 1591285, -478352, -1002875, -1198833, -673236, -1716913, -1202591, 1350230, +18790, -450435, -951872, 435939, 284542, 139050, -845035, 1476932, 559956, 935229, +-279173, -75699, -1082332, -1103270, 673773, -526134, 933082, 1314797, -51003, -5516349, +-8425115, 3569655, -2695092, 92879, -4296578, 3330747, -9736691, -8129300, -9176734, -3184718, +-1876364, -6530498, 3390340, 8790724, -6428493, 1304596, 10487773, -2467459, -2743947, -4844723, +938450, -88584, 4701379, 1445793, 3406983, 2261300, -3287798, -6665789, -3047279, 3884798, +-2142652, -4100083, 1118302, 1609002, 1397475, 779000, 9148280, -4332012, 5026186, -2417530, +2573222, -2694018, 7629473, -5664525, 3173981, -521302, -4373888, 4110821, -1559610, -1540820, +4591320, 2328946, -284542, -2042794, 4183298, 1952063, -4096325, -5091147, 3547106, 5504538, +3235721, 67109, -2319819, 220654, 3652870, -1592896, 4393752, -1072668, -8633421, 212064, +-3733400, 12377022, 4447976, -7144141, -3883724, -1461900, -3101503, 3143916, 3215857, 2292976, +-1420560, 2662343, 2301566, 705985, -418222, -3721589, 828929, 1190243, -938450, 774168, +1378685, -556735, -47782, 736050, -125091, -1154273, -799938, 18254, 1063541, -1059783, +1013075, 995896, -1259499, -1817308, -2092186, 537, 1420560, -670015, 1275068, -1017907, +22549, 812286, -512175, -2043868, 427886, 3212099, -7188165, -8878234, 7659538, -1634235, +-7150584, 603980, -1799591, 7390565, 3732327, -1872069, 1433445, -356482, -1041530, -1304060, +8646306, 1699733, 526670, -5838471, -2611340, -1348083, 3077344, 3795677, 11623255, 315680, +451508, -326954, 858993, -5051956, 302795, 2128156, -6242198, -4431333, -4015795, -488553, +8520141, -6839199, 1246614, 3885872, 1748052, -3181497, 3593814, -8542690, 7088307, -1486596, +78920, 3837553, -4257387, -5049808, -7798587, 1700807, -2498597, 7493108, 2673080, 214748, +1501628, 2301029, 5934034, -2558190, -1208496, 6143951, -1176284, -3457449, -47782, 6148246, +6281390, 5684389, 3142842, -3737159, 3712999, 5144834, -5961415, 7763154, -4646618, -4394289, +7094749, 761820, 10200547, -105764, -5595806, 2520609, -2446521, 6725382, 3282966, 1867774, +536871, 2318746, -1097901, 4233764, 1553168, 1693291, 1357747, 2486249, -111669, -191663, +2015950, -57445, 1504312, -742493, 2423972, 4790499, -2692945, -1263794, 929860, 610959, +395137, 1226750, -151934, 394600, 1071594, 2352568, 260919, 4409858, 1138703, 521839, +-1886028, 508417, 1546725, -1969779, 522912, 870805, -26307, 569620, -39728, -15794742, +-10497437, 2861522, 5035313, 10889890, -6662031, 5867462, 1025960, 6175626, -370978, -2809446, +-3782256, 3830574, 11167989, 995896, -1044214, -10666551, -9022116, 101469, -6648610, -3832722, +321586, 1391569, -6813966, -1980517, 1576253, 4003983, 2052994, -4329864, -75699, 5076115, +4041564, 887985, -4204236, 799938, -2596845, 1254131, 1350767, 2343442, -3252901, 4032974, +9715753, -964757, -792421, 1926293, -5515275, 2601140, 7811472, -7736310, -9220221, -4711579, +694174, -11832098, 231391, 362388, 1591822, 137439, -236760, -5608154, -3096672, -3636227, +-561567, 8085276, 11846057, 355409, 721555, 5827197, -2497524, -980326, 2633352, 13413183, +1630477, 4829691, 9345849, 1731409, -6169721, 2544231, 2748779, -2809446, 2830384, 2428804, +-693100, -2908230, 1308891, 861678, -696858, -4976794, 2130841, 4571993, 1644973, 3330747, +1793686, 4017942, -935229, -1511292, 3634079, 3069291, -1019518, -210990, -1172526, 2639258, +2804077, -2324114, 2784213, 757525, 284542, 705448, 1480153, 2128156, 209917, 1856500, +-1336809, -693637, -79994, -353798, 694174, -1267552, 117038, -397284, 476205, -1705102, +-1554241, 8089034, 5182952, -7596187, -259309, 16112570, 14360223, 2966212, 8689256, 10610717, +2762201, -204011, 7072738, -3214783, 150861, -6401649, 5268315, -483184, 332323, 2291902, +2840047, 8747775, -7342784, -6817724, 6800007, 1324997, 3145527, -5333813, 1027034, -1901060, +3533684, -3758, 4930086, 4716411, -4785131, 3985193, 3446711, -5643587, 14409078, 2450279, +2860985, -11180874, -3500398, -951872, 9362492, 8606041, -817654, -9606231, 6300717, -8360691, +-2516851, 7214472, -149787, -5946919, 7162932, 8868034, -2212982, 2950643, -3532074, -12573517, +133144, 7964480, -3629784, -4340602, 5338645, -6062883, -9056475, 2205466, 6241125, 11203422, +5965173, -8500814, 3594888, -9976135, -11625940, 10722923, 5131949, 3884798, -7200513, -7900593, +-1116692, 8067023, 2774012, 11551315, 5215164, 2867965, -12279311, 1931125, -3373697, 404801, +-2815888, 2503429, 842887, 3043521, 5282810, 2655364, 533650, 2232309, -1984275, -1085553, +-2022393, -100932, -1887638, -656593, 847182, 3818226, 756451, -1697586, -619549, 1167694, +252866, -425739, -3889630, 138513, -1948305, 672162, -2739652, -3191698, 2155537, 2368675, +3970161, -3899830, 139586, 1925219, 16725140, 10822244, -7333120, -1937567, -336081, 2988760, +2306398, -1009854, -6622840, 1638530, -4561256, 7028714, 153545, 2736431, -2348810, -994285, +-6914361, -3601867, 14358613, 4810900, -8866960, 4204236, -8665097, -6031745, -13515188, 5881958, +150861, 244276, 3109556, -339302, -6172405, 10167261, 5720360, -2207613, -10293426, 10254771, +-7093139, 2725157, -346819, 3375308, 1935420, 6522982, 7411503, -1728188, 4064650, 11900281, +1436667, -3708168, -3489124, -2084670, 1755031, 7947837, -2271501, 3240016, 530965, -7249905, +183610, -1773822, 3447785, -10913512, -281320, -18203682, -11143293, -10151692, -2673080, -10032507, +6651294, -2499671, -8417062, -2226404, -1039382, -6724308, -3031710, -230318, 567473, -4031364, +-8845485, -8741869, 359167, -1893544, 2022930, 4912369, -898185, 2459943, 1104880, -34897, +-264141, -4760971, -326418, -93952, -3950296, -310848, 3479997, 6935836, -1327145, -3311957, +2467459, -4289062, 3498251, -3580392, -1471026, 694174, -2745558, -3217468, -159451, -2007897, +360240, -747324, -3383361, 1597728, -277025, 4046396, 2575907, -2850248, 2291902, -1591285, +2118493, -1305670, 1388348, 1424855, 945430, 85899, 1459752, -1883880, -1174674, -2093797, +-4394289, 563178, 1367947, -436476, 749472, -3314641, -11494406, -14307073, -6784975, -9501541, +24708410, -11928198, 5608691, -11260331, -3236258, 1256815, -1818919, -16809428, -339302, -7953206, +614180, 19937776, -6343130, 8404714, 10954314, 4019553, 4464619, 12018929, 3575560, -4584878, +3416647, 4755066, 5063767, 2210298, -2463701, 13979582, 551903, -1047972, -2309082, 3842385, +-1166084, -4770635, 4729833, -1720671, 3399467, -13401909, 585726, -2531883, 12214887, -4737886, +3957812, 18351322, -1567663, 456877, -4436701, -7480223, -408559, -1164473, -7704635, 9785546, +-2066416, 7121056, 773631, 6730214, -3835943, -641024, 14636175, 7226283, -11322608, -5862094, +3117610, 3591667, 1762010, 3193845, -3291556, 4214437, 5382131, 12217571, -15567646, 1018444, +-6645925, 3259880, -264141, 1865090, 5756867, 8420283, -5550709, 5973763, -4014721, -2653216, +-2236067, -1994476, 4713727, -10522670, -2071785, -4810900, 6096169, 5006322, 2109903, 2621541, +-3544422, 4152697, 1873680, 3015067, -407485, 2410551, -3143916, -1678259, -3944928, -240518, +-640487, -3456375, -56908, -273267, -952409, 47245, 4202089, 2676838, -2324114, -3701725, +1976222, 1537061, 4820027, -3626026, 286152, -1245004, 2160906, 2559264, -1269163, -1939715, +-3917010, -8115878, -7351911, -7850127, 8508867, -16513076, -4915590, -10331007, 5126044, 17203492, +-9376987, 547071, 454730, -3320010, 6585259, -5483063, 2627446, -1673427, -7100118, 15350750, +729608, -4951024, 185757, -2197413, -6808597, 5385352, -5225365, 5057861, -9729712, -4462471, +6499360, 4844186, -16233366, -2863670, -13830332, 4155381, -2352032, -13217762, 16125992, -4476430, +-361851, -12224551, -13503914, 830539, -12181064, -1537061, -10531797, -8900783, 10536092, 1219234, +-13686450, 4524748, -12256763, 10929081, 3877282, -5223217, 360240, 3548180, 11371463, -8792335, +-12570296, 12708808, -8900246, -4991289, 6572911, 9605694, -17793512, -8673686, 10018011, 7544110, +3844533, -882616, 1181116, -12691091, 4306242, 4291746, 6956237, -2199560, -13548474, -9728638, +4696010, -11586211, -10256382, 4330401, -750546, 198105, 4167729, 9858024, -66035, -376347, +9064528, 884763, -1572495, 1600412, -1332514, -1828582, 1883880, -2374580, -1786170, -4587562, +-4509179, -3124052, 720481, -2596845, -54761, 1893544, 1394254, -233539, -151934, 2021856, +-2413235, -3642669, 1003412, -102542, 3400004, -3358128, -1065689, -3810710, 4337917, 4700842, +907312, -223875, -3000572, -1166621, -4177930, 354335, 549219, -2279017, 599148, 926639, +884763, -1012002, 8381629, -12964359, -21272436, -17088064, 7670812, -20440286, -1042603, 15564961, +-1425929, 1154809, 11089069, -7355669, -6351720, 24713242, -9822590, 5811091, 9338870, -1705102, +-22418656, -1824287, 2309619, -5588290, -3149822, -5170067, 20822002, 235149, 187368, -993211, +-15083388, 2785823, -8705362, -4316979, 887448, 2546916, 4407174, 12152073, 2644089, -3092913, +23800024, 2540473, -5945309, -21777632, -3229816, 16025597, -3518652, -9978820, -13466870, -11793443, +-10140418, -6324876, 16917340, 6621766, 929860, 9453223, 14127221, 7927973, -3132105, -2462627, +14604499, -2869038, -4536559, 4277788, 11158325, 1617592, -11555073, 2667712, -1204738, -17187386, +-1342714, 13712220, -6824166, -7893076, -1967632, 18427020, -14693620, -2921115, -8216810, 8425115, +4838818, 3911642, 5847598, -2399276, -3197603, 6248104, 4936528, 3455838, -1044751, 781684, +3877282, -10805064, -2037962, 1428614, -5638755, 154619, 5876589, -588947, 1054415, -2316598, +-711354, 3249680, 4140349, 6278169, 3485366, -1043677, 2193118, -3579318, -4608500, 1315871, +-932008, -3713536, 4101694, 2205466, 3093987, 668941, 1480153, 3220152, 1744831, -927713, +-2336999, -604517, 1268089, 6979, 1285806, 268972, 1603097, 992137, 2768107, 354335, +-2732673, 5949604, 4836670, -4594005, -1590749, -2208150, -1572495, 2280091, -2792803, 1640141, +17357574, 1746441, -15511274, -575526, 4643934, -564788, -7078643, 6723235, -5242008, 13795435, +-10634876, 9475235, 20720532, -5624797, -5542656, -4903779, -4335233, 18494666, -13743358, -15100031, +-11530913, 4177393, -6030134, -9732396, -4495757, 6623377, -9337259, 5117991, 1185948, 7231651, +10748156, 1292785, -1416802, -2107218, 10588705, -2778307, 3712462, -13071196, -162672, -4684199, +10315438, -13893145, 11318849, -4832375, -7191386, 11397769, 19779398, -11203422, 5585068, -2517925, +3960497, -29841970, -23681912, -14385993, 1996086, -9150965, 3852586, 907312, -11141145, -8806294, +882616, 23673322, 5515275, -14865419, -22204980, -11744051, -8254927, 14475114, -10176925, -14485314, +3355980, 3084860, -13422847, -917512, -317828, -6691559, -1618666, -433792, -658204, 6437619, +1503239, -7747048, -6905234, -3824132, -9910637, -5426155, 1519345, 10947872, 1745367, 1978369, +-3307662, -9149891, -1515050, 7326678, -467078, -4307852, 6704981, -10425496, -5195837, 1458141, +1516660, -267362, 1023276, 630823, -3618510, -7333120, -2732136, 5420249, -3344169, -2676302, +-3030636, -6559489, -7286412, 2570538, -2711735, -1666447, -6881075, 1557999, 4265977, 5238250, +-386010, -3321084, -3914326, 3743064, 1171452, 3374234, 29998736, 19393924, -4978404, 1845762, +19464254, -7742216, 812286, 8180839, 21060910, 12154757, -3492882, -4767414, -7078643, 1778117, +-3831111, 225486, 680215, 21925272, 36575404, -2225330, 25277494, 15781857, 3401077, 3855807, +-17759690, -17847736, -1870458, 4628364, -1130650, 4282083, -6534256, -13375602, -22293564, -2001455, +-14290430, -12284143, -7938710, -12710956, -8931384, -560493, 20996484, -722628, -15666967, -1388885, +4656819, 15418933, -4704063, -3979287, -9292162, 6973417, -28214178, -25538412, -12110734, -12760348, +-13472776, -8309688, 9200357, -11505681, -15740518, -13406204, -23620172, 12161737, 6685117, -21161304, +10994579, 21325050, 42012296, 23067732, -105764, 7623567, -23929948, -9870372, 13124346, 10946798, +-6014565, -16305306, 2277943, 3413425, 14972256, -1887638, -15053860, -2660195, 24415816, 15498389, +17722108, 13975824, 24627880, 23050016, 7074348, 6278706, -5228049, -9661529, -2535105, -820876, +-8119099, -1611, -9408126, -7107634, 11274289, 4969814, -2856153, -9608379, -3511136, -1111860, +15032, -10693395, 10877005, 186831, -8813273, 5433671, -5366562, -4596152, -1201517, 3411815, +14946486, 7294465, 17849884, 144418, -3305514, 2090039, 6922951, 4571993, -2093797, 9405442, +633508, -2929168, 1566589, 7805030, -3616363, -3175055, 3064459, -563178, 2764348, -30735322, +-3057480, 49740016, -3751117, 1918240, 12272869, -17998060, 10052908, 35306780, 32371168, -32686312, +-31549756, 107911, -34215320, -12798466, -155156, 4055523, 12341052, 18851686, 16429324, 29336774, +6803765, 11626476, 11545946, -4818417, -2176475, 3303904, 3767223, 8753680, -15757161, 35243964, +14985141, 16522739, -3136937, 35793184, 4348655, 21628918, 8837432, 6858526, -8468602, -5319854, +18119930, 7128035, 8391829, -19031536, -10312216, -15867757, -9401147, -11502459, -108448, -23062364, +-25253870, -1330903, -9754944, -47398724, -35431868, -31897648, 9099425, 34802656, 44843216, -24641838, +30909270, 48266304, 8181913, 4218195, -3088618, 33266670, 2507187, 30113626, 12869333, 14187351, +-19976966, -65906272, -52331492, -11652783, -1785096, 1568737, 2322504, 24588688, 23085450, 20265804, +-12514998, 1778117, -6531035, -33894808, 3447248, 2880313, 17131014, 2822331, 25192668, 22925998, +5647345, 19965692, -8369818, 13576928, -11884175, -13212930, -4929549, 5486284, 21898964, -4756140, +-6155762, 3398393, -10821707, -5132486, 11091216, -2979097, 7667591, -13623636, 18796388, 5859409, +200253, -1125818, 14459544, -3385508, 1017370, 2527588, -282394, 9990094, -7092602, -3459059, +-96100, 9608916, -14055280, 2044404, 5017059, -6694244, 1053341, 2728378, 1746978, -3176128, +23669564, -4863514, -43943420, -3386582, 68867120, 13110925, -13361106, 18311056, -6111202, 12073690, +-5927055, -7070053, -23191750, -8140574, -2858838, -3377455, -11296301, 16825534, -15173046, -15465103, +-1459215, 2981244, 14150307, 6965900, 3632469, 6632503, -6280316, 569620, 21314312, -10627897, +-26176216, -4728759, 1917703, -8279087, 17686676, -8986145, -6420976, 15639050, 3929358, 11918534, +-27025544, -29609504, 9659381, -5355288, -10554882, -12426414, -16206522, -32648194, -233002, -2455648, +10729365, -20742544, -44506060, 33549064, 8797167, 31562640, 3156801, -9590125, -9671729, 8549669, +-16941498, 26248692, 4833449, 31415538, 21311090, 46426448, -4844723, -43704512, -34622268, -19069118, +25105694, 25976500, -19705846, 20718386, 39908300, -23250268, -3954591, 43672300, 6419903, 33647312, +-5236639, -16536698, -45283452, -17054778, 4764193, 29130616, 24717000, -14354854, 12256226, 12244415, +23420994, 8611409, -23991688, -27582816, -11370926, 19772956, 40770512, -623844, -4052839, 21801254, +10923712, 2357937, -3908957, -8592082, -11483132, -8560944, 6638409, 4707821, 12643310, -5055177, +-1900523, 1643899, 7483981, 10555956, -13420699, 629750, 14327474, -1273995, -4705674, -15947750, +11449846, 367220, -7451232, -4628364, 16007343, -387621, -10980621, -5261335, 8462696, 643708, +-36536748, 37886980, 51390356, 8968429, 2338610, 11438572, -7833484, 22450330, 12558484, 23466090, +-4729833, -24713778, 55013164, 357019, -20640540, 2588792, 37217504, 17076254, 7330973, -23504208, +2598455, -12553116, -9162776, 3752728, -17474074, 1551557, 4773320, 21211232, -29949344, -5028333, +-3532611, 17935784, -6719477, -10997264, -10477573, -48318, 11458436, -23240604, 1784022, 6251325, +-47659640, 6687801, -12851616, -33543158, 22218940, -24758876, -43531104, 57724896, -352724, 3457449, +-4446902, -15897285, 34862788, -24463596, -2209761, 5309117, -15766288, -1162862, 44038448, 22854594, +-38643968, -41789496, 41472204, -19595252, 24211804, 39855684, -35520992, -61179660, -42343544, 70968968, +-4089346, -55370180, 50883016, -36863168, -70312912, -955093, 60852172, -2467996, -72969880, -885837, +-24482924, 831076, 90236192, -13587666, -66230544, 9798431, 35434016, 923418, 41419592, 2581812, +942745, -12884902, 1806571, 9634149, 33467458, -6779069, -8865349, 33203856, -4282620, 8074002, +23255638, -3753802, -33530272, 22181896, 16064251, 25949656, -7843147, -377420, 9292162, -7180649, +-24636470, -10686416, 10372346, 1017370, -4728222, 32904818, -828929, -36074504, 8642548, 29953102, +17371532, -12370043, 1791001, -14208289, -7912941, 36298380, 30371324, -7572028, -34454764, -10790568, +14383845, 11898133, 9604621, -6208375, -23099408, -865973, -24871082, 37891276, -7846369, 11621108, +23794656, 17420388, 17964774, 44548476, 18911278, -10712722, 6730751, 11111617, 14197551, -15897285, +42395084, 40499932, 5330592, 14137422, -10142565, 150861, -43841952, 20200842, -23276038, 15704548, +-2044941, -15827491, 23347980, -9208410, -17883170, 9648644, -25143276, 16718697, 455803, -4531191, +6628745, 10526965, 15209553, 16031502, 14818711, 45392436, -4669167, 5140002, 14055817, 30660160, +-3213173, 8316668, -99858, 24036248, 28048284, -8975945, 6601365, -1019518, -4801774, -51383916, +3950833, 22255446, -12520367, -12380243, 11268920, -21254182, -32172526, 3117610, 18009334, 38408280, +-49146236, 19025632, -2651606, -1094680, 83752, 19444390, 40939628, 1018444, -30094298, 10233833, +33207076, -17757006, -26481158, 2855080, 14508400, -13823352, 26284662, -4821638, 20182052, 2085744, +-20331838, 25210384, 19912542, 3731790, 15692200, -8564702, 9768903, -4499515, 5128191, 8486855, +23964306, -4755066, -29228864, -3400004, 33697240, 2973191, -4365835, 30380452, 6200859, 233002, +7157563, 21205864, 30906584, -19491636, 7578470, 4633196, -1529008, 15614354, -4478041, -22141094, +7366943, 21922050, -9244380, 6040872, 7282117, -6551436, 8335995, -13902272, 10187662, 9636296, +-12530030, -26551488, 11501922, 15827491, -7144141, -9378598, 14322105, -610959, -8735427, -9632001, +10185515, 5950141, 23521926, -44414256, -34582004, -641024, -53369264, -18355080, -19752554, 41069016, +-1199907, -15250892, 18901078, -9744207, 10467909, 2632815, -20392504, 24274082, -55030880, -5287642, +3317325, -13827647, 10116259, 2377801, -10763725, -2041720, 1585380, 13771276, 799401, -16222091, +-53414896, -39026756, -29697014, -14851997, 33047626, -6811282, 1202591, -53562000, 3960497, -3840238, +-7286412, 1564979, -51726976, 27548994, -25139518, 12603582, -10321880, 35059820, -19270444, -34222300, +-16450798, -436476, 25467546, 46392628, 48831632, -60488172, -44716516, -30959734, 20734492, 49416284, +59925532, -10624675, -15136002, -52979496, -19665044, 46845208, 28648506, -738734, -67109, -1298154, +-44707924, 29676614, -9048422, 28633474, 69687992, -78142632, 94392640, 26504244, -51270100, 14124000, +-102700720, -100463040, 73913704, 31380104, 7200513, 21873732, -38075420, -18445810, 68868728, -2833068, +46279884, -4763119, -37398964, -12380243, 40865004, -13849122, -1014686, 13079786, -3406983, -24108726, +13191455, -19618874, 8849780, 25898652, -27290222, 25501906, 8519605, -3684545, 9618042, -1813550, +-6237903, 4041027, -9553081, 4601521, -19424526, 16872242, 17725866, 3393024, 474594, -6197101, +9024800, 3087545, 3531000, 8588861, 17034378, -21556440, -7330436, -20034412, -15219217, 1281511, +631897, 16689706, -22185116, -17183090, -21386790, -13724568, -5844914, 31291522, -44745508, 37023156, +-22278532, 22789634, 11832098, 14405320, 8254391, -28432684, 31008054, -4572530, -11275900, -10168335, +-12492449, 9597104, -6632503, 13629005, 7927436, -1733556, -3411278, -23803246, 13706851, 5689758, +-6276021, 5348845, 12427488, -3548717, 6987375, -12085501, 14164265, -5304285, 1686848, 5847598, +5937793, -6349036, 21917218, -839129, -20886962, -1357747, 9420474, 4735739, -16012712, 7727720, +18328236, -3461744, -9120363, -8753143, -1360431, 5095442, -2385854, 21705690, -14743012, -5581847, +-5332202, -10895795, -1071594, -3321620, 7806103, 5759015, -9117679, -1347009, 8194798, -8766565, +-4658966, -2614025, 13269301, -8290898, 5607080, 9021579, -20939040, -8368207, 6513855, -21678848, +32749662, 8805757, 10322954, 15190762, -9772124, -241592, -2992519, -14925548, 2856690, 4949413, +11866995, -2363306, -5197448, 7343321, -7735236, -3102040, 7059316, 101469, -1912334, 6106907, +1715839, -3867081, -317291, -4272419, 9460202, -9062381, 14428943, 669478, 3069828, -6054830, +-682900, -2189897, -4691715, -2375654, 3332895, 1776506, 4061965, -64961, -3561602, -2281165, +-11410117, 11416560, -9184788, 5181341, -2273112, 6673843, -3842922, -10511932, 588947, 5484673, +-8744017, 12977781, -10396505, 5687611, -4029216, 51434916, 6777459, -17522930, -13492640, -10230075, +-926102, -1729261, 1183800, -1476395, -1939715, -29199336, 682900, -5874979, -6678674, 3620121, +-11392401, -5267241, 5346161, -8052527, 2310693, 8959302, -12179454, 7621420, -4485020, -6564321, +-999654, -6565932, 3067144, -6100464, -3174518, -7174206, -1351304, -186294, -133144, -4341675, +-4395362, 1260573, 2353105, -5175973, 6924024, -8570070, -724239, -3467649, -1053878, -1675037, +-6710350, 9154186, 5692443, -9343164, 11295764, -1225139, 2429878, -5170604, 10838350, -10885058, +837519, 849867, 2882997, -1864016, -2774012, 7991861, -5328981, 1122597, 452582, -1720134, +2604898, -3588982, -463856, 4430259, -2243047, -2135673, 5130876, -2066953, -2207076, -4820564, +2488934, 2246805, -10494753, 12514461, -7086159, 2771328, 886911, 95026, -4055523, 1662689, +5197984, -3920768, -1930588, 2695629, -3855270, -328028, 3187940, -1387811, 1278290, 609349, +-2856153, 416612, 383863, 2494839, -4648765, 297427, -515396, -1925219, 1956895, -2382096, +1129576, -1576790, -4070555, 2189897, -3528853, -2128156, 1315871, -2310693, 822486, 1955284, +229781, -3185255, 3277597, -731218, -2018635, 2614561, -25311852, -40808096, 45587856, 153940752, +15510738, 35470524, -83812528, -127807488, -32293322, -66685808, 51938504, 107368816, 56363928, 35893580, +-8152922, -41436772, -41041632, -30617212, -28708636, 10369125, 18151606, 10737955, 19548006, 2770254, +1436667, 7938174, 2092723, 8989903, 6896107, -5080410, -19727322, -14324790, -17403208, -23146116, +-12449500, 13309567, 16827144, 31665720, 44355200, 16292422, 6305012, -14610942, -35401268, -33961916, +-23968064, -16374026, 3258270, 13308493, 18749142, 20313584, 16850230, 11624329, 1200980, -1168768, +-11339251, -7574175, -5077188, -5436355, -2315524, -6166500, -1953673, -7343857, -7470022, 2888366, +-719944, 9913321, 15884937, 9688372, 23689428, 21388400, -10335302, -20747376, -21086678, -31029528, +-8912594, -7337415, -1806571, 19376208, 16993574, -2848100, 14761266, 18743238, 6174016, 13148506, +-1291175, -14810658, -10987063, -25549686, -16323023, -5927055, -1723356, -1733556, 4519380, 12313134, +19130322, 24458228, 20431696, 7028714, -11336566, -18204218, -17701170, -19444928, -8920110, -4823249, +-2145336, 4500052, 9558450, 7844758, 13418015, 7553774, 8776229, 8237748, -40802, -6533182, +-8851391, -10786810, -10867341, -9427453, -5194226, -5129265, 2955474, 5675263, 11014981, 16288663, +15468862, 6079526, 993211, -8732205, -10902238, -12576201, -12862353, -3593277, -667867, -2312840, +2954938, 10053982, 12829604, 6526740, 1337346, -562104, 106300, -2474975, -3004867, -4756677, +-3081639, -3589519, -2698850, -1492501, 6979, 150861, 2847563, 5741298, 5909338, 3084860, +1373316, -1497870, -2365990, -3412889, -2589329, -2882460, -1435593, -1340030, -52076, 670552, +2371896, 2166811, 2591476, 874026, 609349, -394063, -562641, -1258962, -447213, -590558, +93416, -536871, -700617, -1874216, -93952, 217433, 1098438, 847182, 1804960, 550293, +418222, -1115081, -427349, 282931, 1009317, -414464, -926639, -1939715, -679679, -47245, +1105417, 333934, 458488, -354335, 437550, 180926, 964757, 359167, 608275, -461172, +-30602, -949188, -596464, -1083942, -207769, -437013, 479426, 171262, 1191317, 792958, +948114, -140660, 126165, -692027, -127775, -828392, -420370, -726923, 266288, -111669, +583042, 45634, 489089, -213675, 448824, -116501, 422517, -300111, 140123, -502511, +136365, -368830, 285078, -274878, 301185, -293132, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 3990025, -6490770, 1706176, 5731097, 100395, -5911486, -4074850, -4305705, -668404, -2956548, 6933151, --5183489, -1315871, -2353642, -827318, -4157528, 3999152, -2451353, -1918240, 3362960, 5578089, -6310381, 973884, -451508, 1314797, 335544, 892816, -2854543, -3071439, 1504312, -2784750, --2790118, -3737695, -3931506, 1202054, -2603287, 3482682, -4339528, -587874, 1917166, 1824824, -1607928, -6729677, -1206886, -3731253, -647466, -1563905, -4104378, -80531, 4904853, 1496259, -2384244, 2259153, 2653216, 342524, 3328063, 2096481, 3714610, -2094870, 2480881, -1213328, -1715303, 202400, -3420942, 4012036, 4534949, -2421825, -3036005, 1343788, 4168266, 1000191, -1117228, -1387274, -268435, 2265059, 1416266, 370978, -819265, 282931, 1911797, 2327872, --275952, -3615289, -2211371, -1214402, -1537061, 846645, -340913, -324270, 1726040, -1263257, --419833, -2147, 308164, -854699, -241592, 133144, -1367947, -153008, 1691143, -245350, -896574, -1216550, 709743, 362925, -78920, -798327, -10161893, -2645700, -4594542, 3375308, --9528385, 2101850, -4211753, -2196339, 1327145, 205085, 1040993, 1437740, 1049583, 4141422, --1857573, 446677, -440234, -5005785, 3677029, 6197101, -5055714, -4709969, 3565360, 936840, -4406637, 1417876, 5928129, -813359, 1980517, -3139084, -985695, 6082748, 459025, -3947075, --4911295, -5264556, 196495, 4382478, 2191507, -16643, 4946192, 3976066, 128312, -4054449, -6332393, 1635846, 4876936, 4998268, -900869, 3189013, 3725884, -443455, 2189897, 2584497, --2502892, 522375, -796180, 2456721, -5617817, -3566434, 1774358, -3448322, -1363652, 4803384, --1969779, 2644089, -1153736, -7510287, 1238561, -25233, 3922379, -6183679, -3362423, 2811593, -677531, -584116, 1567126, -2908767, 817654, 755914, -925565, -1829656, 2501819, 2314451, -1561758, 300111, -985695, 623307, -738734, -1104344, 801548, 727997, -1544041, 1101122, --878321, -630823, 1326071, -966905, -2045478, -19327, -784905, -235149, -987843, -1036161, -385473, -67646, 576063, 5369, 564788, -1471563, 393526, -421444, 6355478, 6758668, -2939368, 5005248, 3867618, 6769406, 7664906, -2835752, -848256, 2611877, -7703561, -233002, --2554432, -1440962, 3494493, -4446902, -544924, 5708012, 1028645, 3667902, -1823751, -1291711, --1935420, -7197292, -1204738, 517007, 3798899, -1135482, 6553583, 2616709, -1155883, 2654827, -1342714, 3405372, -2462627, -482647, 7656316, -999654, 7232725, 3431142, -3201898, 789200, -6367289, 3353296, -4231617, 5850283, -1616518, 421981, 283468, -1146756, 1098438, 675384, --5283347, 3387119, 2436320, -425739, 172336, -1146219, -4773856, 33823, 2655364, -515933, --578747, -3173981, -7010997, -2375117, 2585570, 5898601, -8934069, -4726612, 1650878, -3863860, -2268280, -152471, -57445, -5338645, -4088272, -2356863, -3500398, -1692754, 182536, 630823, --1264331, 2049773, 1595044, 357556, 1469416, -1603633, -617402, 68183, -2415919, -498753, -225486, -3022046, 1267552, 763430, -596464, 115964, 624918, 1491964, 153545, 233002, -14496, -1458141, -198642, -423591, 1078037, 779537, 1479079, -1030255, -242129, 9422085, -10018011, -2003065, -4195110, -4587025, 9605694, -8333847, 230318, -1360968, -3882651, -5276904, -1878511, -1451162, -7183870, -8745090, 334471, -658741, -4566087, 1653026, 2426120, -3215857, --4842039, -4520453, 6388227, -6894497, -831613, -8056822, 95563, 4485020, 1530082, 767725, --4517232, -4345970, 3955128, -3052648, -4617090, 573915, -1679869, 2827162, 57445, 1142998, --4604742, -1701344, -1298691, 4422743, 3031173, 3076270, -9118216, 1444183, 2541010, 2084670, -2569464, -2597918, -1661616, 329639, 1846836, 3609920, -626528, 2386391, -2640331, 7043747, --12773770, 4490925, 361851, -6791954, -294205, 7516193, -2275796, -3518652, -6851010, -2306398, -529892, -1897839, -11274, 3085397, 3917010, 3280281, -974958, -536334, -4033511, -816581, --1037772, -2022930, 551366, -818191, -805306, 1643362, -2044941, -936303, 1957968, -974958, -1261110, -293668, -821413, -701153, -552977, -2942053, -1854352, 1291175, 1435056, -1392643, --1144072, -945430, 1073205, -688805, -436476, -1150514, 742493, 812823, -1395328, 559956, --212601, -1248762, -316754, -703838, 790811, -410169, 1185948, 1713155, -807454, -4472135, --14133664, 2576444, -6442451, 1410897, 1185411, -819265, 10035728, 554588, -6413460, 8570070, -4134980, 2943663, -1283122, 1777580, -2604361, 6721087, -1109712, 767725, 10126996, 9882183, -4234301, 4527970, 4358855, 4922033, 3291019, -9758703, -3041911, -131533, -2559264, -8304856, --907849, -1965484, -2187212, -4458713, -77846, -1305133, 7157563, -2288681, 12543452, -69793, -1066226, -2317135, -1805497, 101469, -351114, -997506, -2181844, -1462973, -6132140, 1502165, -1016834, -726386, -3164854, 4297115, 3188476, 3725884, -1292785, -2682744, 85899, 3248606, -3522410, -2815351, -8009577, -4089346, 881542, 6699075, -908922, 5478768, -4328254, -6299107, -4728759, -2196339, -5164698, 3022046, 3159485, -5797669, -4576288, -6380174, -2106682, -2189897, -3689377, -1986959, 1136556, -397821, 2466922, 1527935, 1375463, -1193464, -663036, -3313031, --1651415, -874026, -19327, 1490891, -263067, 116501, 2786897, 1095754, -113280, 44023, -1799591, -1152662, 503585, 528818, -914828, 1088774, -807991, 723165, 576063, 806917, --478352, -2049773, 2034741, 278099, -3428458, 5092758, -6049462, -6832219, 3344706, -2029372, --456877, -3634079, -1912334, 3350075, 5012227, 2456721, -993748, 651761, -442919, -1216550, --4510790, 1479079, -12396349, -3725884, -3847217, 3379603, 4453881, 279173, 2289218, -7889855, -2287607, 1126355, 2279554, -7119445, 13459354, -674847, 2631741, 1671816, -6126234, 919660, --8853001, 5719286, -1758252, -7616588, 1686848, 508417, -3619584, 343061, 992674, 5893769, -10896332, 4578435, -2003065, 3409130, 4576288, -10049687, -3499862, -4639102, 2949569, 2221035, --1488206, 1518271, 3649112, 2151779, 4651987, 8306467, 368830, -3177739, -684510, -419833, -6749004, -4790499, 201327, 2970507, 9041980, -30065, -5720360, -5818607, -332323, -7132330, --781684, 2614025, 11038066, 9285719, -909996, -5030481, 4181688, 230854, 1348083, 944893, --195421, 1302986, -200253, -1440962, 1364189, 1490354, -1355062, 2115272, 2204392, 1902134, --391379, -1675037, 1441498, 1684701, -109522, 447750, -1181116, 139586, -120259, 2477123, -1103807, 1517197, 1401770, 320512, 996432, -89657, 1171989, 2206003, 650151, 859530, -1803349, 2143189, -891743, -637803, 706522, 580894, 1851668, 2529736, -1135482, -12997108, --3577708, -4811974, 5539434, 189515, -2709051, -16712791, -2237678, -2246268, 6891275, 16533477, --4799089, 11101417, 1875827, -9798431, -10031433, 1721208, 2502355, -5704254, 6226629, -4514011, -5009006, -6244346, 2971044, 2126546, -5959267, -5000953, -3843459, 1944547, 6428493, -8462696, -268435, -8898098, -542777, -3400004, 2115272, 6452652, 631897, -2830384, -2530810, 6984154, --73014, 10660109, 3230352, -4059818, -3932043, -3126199, 1475321, 6675453, -194884, 11084774, --19854024, -14634027, -11872363, -2769180, -10136123, 617402, -3853123, 3546569, 8930311, 1575179, -3659312, 5725729, 9454834, 4851703, 1392106, -6608344, -16452409, -17314624, 9201967, 580357, -11698417, -8428873, -6100464, 5106179, -12198781, 190052, -4402342, -509491, -7893613, 255014, -2538326, 7013145, 1204738, 1087701, -2328946, 2490544, -591095, 783832, 1898912, 3140158, -4044249, -1179505, -1807644, 2937221, 1441498, -1206886, -2251637, 390842, -442382, -330176, --1001264, 395674, -49929, -1249299, -483721, 1160715, 2144799, 1715303, 1446330, 725313, --5109938, -2840584, -2007897, -1863479, 2611877, -497142, -920734, -57445, 680215, 117038, --177704, 7740605, 3535832, -6360847, -64961, 14834817, 12774843, -1282048, -10847477, -18590230, --2005213, -6600291, 6711424, -5651640, -5350456, -21040508, -8878771, -18858664, 7016366, -730144, --4469987, 4876399, -559956, -4832, 1453310, -6135898, 626528, -7031399, -1133335, 4078072, -3218004, -7171522, 2632278, 7074348, 11805254, -1895154, -1547799, -4020090, 756451, 5957657, -8724152, -1364189, 1365263, -1986959, -1408212, 10161356, 7573638, 175020, 7808788, 2109366, --9377524, 1658931, -867047, 12114492, 4870493, 1413044, 5993090, 7813620, 2270964, -7119445, --11885785, -2894808, 2579128, 6288369, 3361349, 267362, 2588255, 9360344, 2172180, 2952790, -4452808, 2418067, -6024229, -7036230, -5916855, -6953552, -6162205, 10415833, 1562294, 8010651, --7092602, -6468221, -1143535, 6669548, -4192962, 3484292, 2156074, 938987, -3553012, -2450279, --3278671, -2441152, -3747896, 1367947, 1296543, -1196685, 2570538, -1808718, 1243393, -824634, -336081, 985695, -3316789, -2258616, -3329674, -2356327, -4070555, -1350767, -3367254, -1804960, --1930051, -2772938, -118648, 2822331, 1027571, 1076426, -1023813, -464930, -327491, -887985, -2377265, -1280437, -587337, -896574, 26119306, 5835787, -8172786, 4774393, -4795868, -15447387, --3231963, -15152108, -8438000, 7981123, 10435160, 4156455, 2094333, 982474, 1880659, 10065793, --7138773, 14202920, -9173513, -9192841, 11220065, 5095979, -18210662, 8044474, 4613869, 5857262, -11961484, 6003291, 8897562, -512712, 4825396, -2754685, 7603166, 2089502, 1633698, 5167920, --10234907, -5446019, -3128884, 6655589, 2873333, 2445984, 5242008, 1611150, 1877975, -9168681, -122407, 10114111, -1767379, 1329292, 1300838, 1387811, 12024835, 4715337, 16165720, 3820374, --2256469, 15429670, -13147432, -1614908, -2041720, -5163088, -1156957, 3315178, 15244450, 1562294, --3175055, -5800890, 3193845, -6105296, -2602213, -3892314, -8265128, -1231045, 2282775, 13103945, --1022739, -12454331, -3418794, -7435662, -3722663, 9181029, 7383586, 8606041, -6708739, 1506460, --7471096, -1036161, -2493766, -4438849, -2480344, -6125160, -3565360, -1066763, -2600066, -8072391, --3169686, -2244657, -1602560, -1749662, -2807298, 462783, -1319092, -6332930, -272730, -2996814, --1798518, -439160, -21475, 1237488, -157840, 2989834, 2884071, 592169, 555661, -1964411, --1759863, -383326, -2136209, 3054259, 1801202, 2872796, 2668785, 1225139, 3721589, 2535641, -962073, 1806034, -468151, -1418950, 2639794, 3818763, -9434969, -14543833, -5251672, -14319958, -10283225, -12218108, -8992588, -7195681, 6499896, 16383690, -16624208, -5901822, -18735722, 5366025, -2614561, 1756642, -5382668, 1461363, 21092584, -11039677, -1853278, 7984881, 5455146, 4175245, -7419556, 4938139, -6939594, -11729019, -2191507, -6498823, -8850317, -10829760, 172336, -2531883, -2664490, 13932337, 8824547, -7836705, -4231080, -884226, -4045322, 3403762, 26508002, -9008157, -18490908, 5782100, 3106872, -1223529, -2998961, 3115462, -10155450, 4846334, 14391899, 595390, -2297808, 11504607, 7474317, 4442607, -9714679, 8107825, -5793911, -8670465, -23414552, -7385733, -15209553, -8666707, 3941169, -16496969, 11790759, -6222871, -6495065, 10284299, -16430934, -12164958, -18611168, -13283260, -12493523, 7450695, -8571144, 1716376, 28454, 5313412, -13477071, 4226248, -352187, 13427678, -10004589, 3326452, -1421097, -7613367, 9962714, 2010045, -8293582, -6021544, --5714454, 870268, -22012, -4181688, 111669, 5193689, -435939, 3679713, 4144644, 3285113, --7467338, 4147328, 3804267, 5992016, -151398, 440234, -5429913, -2171106, -2672007, -2817499, -1255741, -628139, 3475702, -4940823, -3114388, 1861332, -4777614, -4030827, -5089536, 1750199, --10600516, -7868380, -1085553, 12059731, -5711233, 21181704, 19697256, 3893388, 6306086, -11421392, -1414655, -9242770, 14790794, -2938831, 4358855, -7041599, -4569845, 2542621, 1998234, -6757594, -11340861, -3178813, 2409477, 4258997, -7421704, 2842732, -9470403, 74088, 5398237, 6492917, -159451, 8574365, 10782515, -768262, -20170778, -3356517, -5961415, 14489072, -12181601, -15103789, --10793790, -7184944, 2116882, -8534100, -6726993, -4267587, -1224603, 2714956, -29563334, 18738942, -14583561, 21358336, -6747394, 3484292, 14295799, -13574781, -12614319, 2573222, 9352828, 6200859, --1575179, 2952253, -7441568, -8826158, -11335492, -3258807, 39383240, 3247532, -21767968, -3816079, --11906723, 7592966, 5925445, -13429826, 2943663, -4057670, 1166084, -6577206, 8469676, 8678518, --1224603, -4256313, -5105643, -17032230, 5224291, 2868501, -627065, 7185481, -3353296, 1242319, -2816425, -8015483, 3187403, 4973572, 11303280, 6088116, 779537, -9538585, 151934, 8934606, -601295, 122407, 6681359, 262530, 2343442, 6626598, 5601711, -876173, 3112241, 5633387, -5183489, -2292439, 2327872, 6742025, 8204998, 6122476, -71404, -4111894, -861141, 331786, -5184026, 132607, -1341104, 491237, 1977296, -3027415, 1990717, 3304441, -2975876, 2172717, --7428683, -783295, -5305895, -11642583, -21354040, 1371705, -17777944, 8165270, 3303904, -15001247, -8617315, 9094056, 13593571, 3432216, 5596343, -15559056, 60666, -3419331, 14488535, 6176163, -984084, 12808666, 15075872, -2172717, -6692096, 1279363, 18503256, -12221866, -9010305, 8945343, -5457830, -12429635, -2323041, -11534135, 21103322, -18130668, 5258114, 10624675, -6347962, 9729175, -3985193, -5485210, -5058398, -5874442, -8133058, 11192685, 15976741, 2694018, -11700028, 811749, --12958453, -5494874, 8935679, -2084133, -6293201, -5287105, 2505040, -18097382, 816044, -2304787, --9898826, 13324599, -13300440, -1376537, -2863670, -10505490, 10898480, -1309428, 6409165, -5577015, --801548, -1076426, -6191196, 4477504, -5689221, -1578937, -5600638, 15455977, 7078643, -19412178, --3933653, -31675920, 18219252, -541703, -13848585, 12112345, 1567126, 1372242, 4811974, -273804, -7422777, 8332774, 2183991, -2794950, 5052492, 8992051, -5246840, -3856881, 4032438, 862752, -2513630, 2282775, 4988068, 5953899, -4058744, 2858301, 2210298, -5637682, -4519380, 3583077, -1015223, -1058173, -3264712, -3637837, -5431523, 4996658, 5862094, 423054, -3580929, -12309913, -403190, 513249, 3981435, -8111583, 980863, 5418101, -3126736, 6350646, 3273302, -1027034, -2068027, 3183645, 478352, 783295, 2234994, 4030827, -3915937, -839666, -2222109, 1087701, -18823768, 913754, -14681272, -6030134, 8354249, 14049912, 14648523, 727997, -3695819, 21070572, -8878771, 23396834, 2614561, 2158758, -11394011, -4412005, -6846715, 6379637, 3136937, 12738336, --14607721, 1159641, -8788040, 7884486, -12696460, 4921496, 13575855, -1895691, -653372, -7034083, -1717987, -7081864, -25035902, 3583613, -4056060, 1901060, -11322608, -2259153, 9432285, 18895172, --2193655, -6626598, 10644003, 5294084, 2403571, 13058311, 4234301, -6712497, -3544959, 8489003, --1400159, 7762080, -9319542, -7913477, 2549063, -7427072, -14797773, -6557342, -16819092, -3534221, -5330592, -12851079, -2120103, -14785425, -6789270, 55835, 5630166, -17652852, 7543573, 1484985, --10850161, 13437879, -4983773, 3678103, 23278722, 26803818, 1459752, 9529996, 19229642, 23461796, -22870700, -2119566, -15675557, -23475754, -8850317, -15510738, 14537927, -3028489, -7242389, 3944928, --645856, 1772211, -545461, -6849399, 7250442, 2278480, 2550137, 699543, 9892920, -5534602, --380105, -2971044, 6777459, -6394133, -3060701, -545461, 9758703, -2467996, 5784247, 8424578, --7875897, -1481227, -3489661, -8456791, -3757560, -1829119, 3431142, 438624, 11464878, 3329674, -7665443, -616328, -7856032, 2252710, 1815161, 78920, 31988916, 36668820, 1926293, 11732777, -11247982, -1569811, -26395796, -725850, -1065152, -10040560, 7435662, 6869264, -14376866, 7789997, -10045392, 1620813, -3839164, 5419712, -3685082, 18634790, -3226057, -8802535, 100932, 4182761, --1781875, -1300838, -359167, -29861296, 8575439, -757525, -20603494, -8617852, 3533148, -2024003, --14051522, 4778151, -16579648, -1594507, 1597191, -26665842, -4782983, 11293617, -8558259, 1128503, -16724066, 10156524, 12785044, 3873524, -7252589, -12527883, 12722230, -6709813, 7111392, -11916387, --6192806, 8334921, 14289893, 1965484, 17124034, -11641509, 14809047, -12705587, -15169288, -10952703, -14758044, 15341086, -14346801, 7256347, -39549132, -3762928, 11573863, 3517041, -6240588, -15906411, -7210713, -22419192, 3549791, -11641509, 10511396, -17358110, -11009612, 17063368, 346282, 8489003, -1916629, 7373922, -3920768, 2939368, -1996086, -13065291, -2374580, -6194954, 3965866, -4343823, -2245731, 320512, 2099165, 839129, -2881923, -4115116, 501437, -8358543, 2865280, 2108829, -4639102, -5436355, 4607426, 4112968, 2810519, 3503083, 2698313, -5837398, 551903, 2496450, --4185446, 7262790, -717260, -3147674, -4327717, -287226, 630823, 3315178, -2767033, 3124589, --2673080, 7617662, 3432216, -6923488, -1762547, -1938104, -3163244, -3093450, -6977711, -29153702, -2304787, 35713728, -24088860, -2441689, -1934883, 1745367, -9429064, 4420595, -15134928, -15830713, --5002563, -4440996, 3955665, -4103305, 8330626, -11907260, 554588, 22916334, -18748070, -16852378, --3883187, 20033874, 2985539, -25446070, 10928007, -9542344, -10654203, 2353105, 34917548, -19713364, --10741713, 24583320, 18485002, 1435056, -10075993, 520228, -3649649, -8017094, 7235410, 6304475, --4059281, -20208894, 25839060, 11906186, 5012764, -27453968, -4028679, 8323110, 9594420, -3552475, -14502494, -2473901, 5029407, -6415608, -16295106, 10558103, -11586211, 6881612, 3795141, -14565308, -27358942, 4029753, 19742354, 19494320, 3649112, -29719026, -5528697, 124554, -11598022, -6111739, -1262184, -1099512, 12984223, 23979876, -6831683, -2517388, -10508174, -4913980, 10171019, -6925635, -5969468, 17790292, -15549929, 17682380, -3365107, 5205501, -6644852, -3792993, -5558225, 615791, -3466039, 3782256, -2851858, -57445, 4202089, 2164664, 9558450, 4271345, -4634807, 250719, -981937, 8449811, -4648765, 2350958, 4088809, 1190243, -224949, 152471, -11112691, 5363341, --4027606, 5248987, 7137162, 797253, -1044751, 3433290, -281320, 2594697, 1013612, -1313723, --4068408, -4358855, 8433705, 1288490, -1896228, 2207613, -5153961, -1118839, 8573292, 11231339, -1503775, -10260140, -51596516, 3425773, -13478144, 1816234, 25801480, 2504503, -5000416, 4741644, -978716, -17479444, -18920404, -16994112, -16362752, 21306260, -4276714, 25422986, 2238752, -23954106, --857920, 2677375, 20534776, 4077535, -3335579, -4054986, 5855651, -12887586, -4962835, 22755274, --4647692, -29487098, -22557706, 13498545, -2944200, -6109054, 6771016, -2092723, -15218143, 4608500, -8918500, 20486994, -4135517, -16965658, 220654, -21404506, 8232379, 24275692, -3893925, -29750164, -9361418, -322659, 1664300, 7193534, -9387188, 18337900, 1365263, -12344810, 9601936, -6677601, --4146254, 26193394, -13420699, -4490389, -4412005, 16506633, 6619082, -28947542, 14681809, -23325968, --5578626, -12582107, 2998961, -7670812, -7087233, -2402497, 13288629, -4315906, -8207146, 15744813, --9188546, 16161962, -96637, -8531416, -5148592, 4023311, 4436165, 3205656, -9722732, -3211025, -2376191, -541703, -6364068, 143881, 5983427, 9225053, 3833795, 4745939, 743566, 9067213, --5142687, 2944737, 7161321, -2724620, 891206, 2922725, -1801202, 1429150, 2831994, -8886824, -7497403, 3195456, -8946417, -7330973, 512175, -10519449, 908922, -7754027, 10028749, -18149994, --45097, -3845070, 1905892, -4728222, 5658620, -3029563, 2634426, 2026151, -3741454, 816581, --25115896, 5081483, 41649372, 27008902, 12453795, -20714628, 15521475, 19465866, 28983514, 13884019, -3473018, 936840, 18173618, 31188978, -7010997, -3907347, 17761300, -35121560, 12788802, 31145492, --6438693, -10927471, 8149164, 24154896, 19575924, -13173202, -22348326, -1427003, 11289322, -3906273, -2740726, 244813, 26276074, -15107547, 16840566, 25274272, -10142028, -3192771, 17945984, -2810519, -62878320, -26487064, 11333345, 42899208, -24764782, 7991324, 2890513, -35014184, -1073742, 6380174, --15377057, 33986612, 2586107, -4821638, 2656974, -14329085, 46782396, 12765180, -37497748, 36042292, --15126338, 1202054, 11097122, 13296682, 24004036, 11564736, -6496138, -23584740, -31542776, -11984569, --12652974, -2316061, -9691594, 19672560, -12074227, -21056614, 2321967, 5617281, 4238596, 7452305, --11850889, -11694659, -7019587, -7794292, -24879134, -10676215, -8485782, -17345226, -8276939, 5967320, --7326678, -16283832, -796180, 6072547, 10788421, -2739116, 5061082, 11581379, -704912, -8196945, --524523, -5055714, 6526740, 9182640, -13203803, 11374147, -6856916, -75699, 1708323, -6339372, -12143483, 4469451, -17137456, 10294500, 1563905, -6318971, 12598750, -14621142, 5732708, -2942053, -6140730, -3686693, -4031901, 2135136, -2385318, -1728188, 4412542, -2876018, -9834938, 4268124, --943282, 2702608, -460098, 7910793, -4518843, 10077067, -48168060, 27967216, 1482838, 16822314, -28275918, -46601468, 10806675, 23665270, 5608691, 17605070, -17666812, 19401978, 5917928, -18395882, -467078, -11671037, -33773476, 18435610, 10778220, 30854508, -16989816, -22963042, -7763691, 7080254, --4540854, -38720740, -18820546, 11635603, -2689187, 5558762, -16074452, -5242545, 12994960, -11060615, --5242545, -16644609, -3673808, 5789616, -18044768, 1722282, -39620000, -32942400, 10291279, -34258268, -3132642, -35831300, -24816322, -17385490, 16927540, 33075006, 41113576, -9882183, 18356690, 22017076, -10904385, 9443022, -15743203, 45414448, 46631532, -31768262, 31827856, -25029996, 16086263, 32539746, -31214748, 37734508, 45349484, 31899258, -35837744, -25702694, -128849, 747861, 13743358, -8714489, --6777996, -21700322, -11811697, -32119912, 7164006, 26717380, -10709501, 6449967, 28170154, 13082470, --19063750, 21415244, -1190780, 7494718, -1971927, -3923453, 6353331, -6892349, 9669582, 7940321, --7016903, -8759049, 8362302, -6001143, 423054, 157303, -545998, 2252710, 945430, -11621645, -10861435, -4984310, 5259725, 6076842, -4152697, 6554120, -8106214, -6119792, 5581310, -6688338, --8378408, -3837553, 3502009, -3409667, 2222109, -7765838, 386010, 2756295, 7190849, 10536092, --2408403, 5907191, -6914361, -61740, -1199907, 3149822, 2548526, -696858, -5332739, -7654706, --1719061, 1583232, 59855736, -43806520, -22310744, 23627688, -14063334, 22574348, -17590038, -19587198, -6614787, -46321224, -2102387, 31189516, -7525857, 16045998, -26584774, -6502581, -10495826, 1090385, -33244658, 10089415, 7392713, -5893769, 18253612, 5912023, 45426796, 11216844, 26527328, 1934346, --20720532, -19558744, 26444114, -12800613, 12239046, -202400, -34088620, 24647744, -30368104, 59077276, --43972948, 26917634, 24068996, -25196962, -21205328, -15617575, 21824340, -1597191, 22840100, -217433, -3007014, -40284644, -21654688, 9465034, -19802484, 6644852, -12060805, 11933567, 6769942, 31076772, --18380850, -6260989, -7815230, -15108621, 42066520, 7867307, 4000225, -39049844, -12632036, 21144660, -12473122, 13503914, 36450852, 23395224, 32240708, 37250788, -1030792, 16556025, -15396384, 49520972, -3776350, -8047695, 18066244, -4109210, 37982544, 803696, -7573101, -7714298, 4608500, 26786100, --20157892, 13900662, -6368363, -2062658, 7983808, 5432060, 10452877, -6387153, 6832756, 12582644, --3192235, -4600984, 8508330, -1236951, -1241246, -811749, 2348273, 1517734, 4140349, -8909373, -11946988, -6848326, -3785477, -1771674, 7341173, -10095858, 1123671, -7181186, 10008348, 18115636, --5921150, -4817880, -2296197, 12491912, 6161668, 13043816, -940061, -7330973, 5992016, 6351183, --1744294, 6295349, 4891968, -17339856, 2822867, 20202452, -2569464, -9381819, -90555624, 63006096, --39123392, -27054536, 505732, 13085692, 16056735, 3117073, -14629732, 49086108, 24639154, 7021735, --24630026, 16230145, -987306, 18423800, -23528368, -15963320, 12351252, 36740760, -42074572, 1902134, -13424994, 4642323, -10477573, -6014565, -5443871, 1867237, -2296197, 9648107, 45913736, 3151432, --20999706, 31172872, -7412040, -29780766, -38834556, 36990944, 11855720, -4938139, 13523778, 8684961, -30436822, -41394896, -4600984, -20970714, -6207302, 23929948, -17724256, 9426379, -20410758, 9913858, -63308892, 4968741, -36581312, -40655088, -2747169, 19594178, 18846316, -16209743, 3712462, 31061740, --13225278, -59706488, 33872260, -20497732, -34300684, 15078020, 56489020, -39085276, 28323698, 39699992, -13361643, -34152508, -28898688, -17497696, 13977434, 12493523, -12140799, 35634808, 17035988, -2115272, --1323387, 2245731, -29962766, -11215233, -21301428, 10913512, 9265318, 7158637, 9358734, 7378217, -21533356, -10831908, -5659693, 4283693, -243203, -16786342, 14246943, -556735, 8806830, -4138201, -6551436, -10788958, -3663070, -6480032, 9940702, 2019708, 1780264, 355409, 5850283, 16098611, --6680285, -30559766, 2173790, -15065672, -3292093, 9192841, -13297219, -8385387, 17052094, -16238734, --3970697, 159988, 8000987, -17396766, 886911, 51881056, 17078400, 3438658, -3800509, 8222715, -14602352, -4653597, 6814503, -7860864, -69793, -6213744, 24371792, -27349814, -3067144, 16341814, --37976636, 12285754, -9263171, 2855080, -4440460, -10639708, 6797323, -2946348, -15461345, 41605884, --31753230, -8949101, 29557428, -18953154, -2886755, -5988795, 6513318, 29217052, 2288144, -28536836, -39106216, -21139292, 13945222, 24340116, 10870562, -9120900, 2176475, -21499532, 5268851, -13032005, --10209674, 52329344, -12145631, -20900922, 6842957, -9778030, 12456479, -8168491, 13675713, 33658048, --18502720, 11120207, 25760676, -30289720, 13885092, 16430397, 7556458, 20572894, -23463944, -6224482, -36018668, -24877524, -5452461, 10242423, -10050223, 34304976, -34092912, 5763309, 12319577, -15799574, -11983496, 13089450, -32468342, 11528229, 27710056, -336618, -8313446, -1344325, 17828946, -3718368, --30491046, 24762634, 11771968, -13440563, 5092221, -7423314, 11009075, -4327717, -13645648, 16037945, -900333, -3533148, -11864847, 11134166, 2124935, -15852724, 5657546, 10567767, -2188823, -5210869, -2317135, 9766756, -1450088, -10211822, 10406169, 6777996, 1270237, -548682, 8699456, 1642288, -3050501, -12132746, 15373299, -8501888, 16394964, -10829760, -29272350, -79017200, -124175024, 11244761, -118921200, 9714142, 269223584, 277875808, 138346272, 290901344, 194031056, -40325984, -4212289, -64085208, --233616688, -205110992, -126789584, -238713216, -186827312, -54391464, -117102824, -98085240, 34651260, 58589796, --28486370, 15241765, 52328808, -40500468, -23728620, 73723648, 65488052, 7392176, 73199128, 124958856, -41676752, 90340344, 171029360, 82029040, 43244416, 153177856, 128028680, 16895328, 91884384, 179509776, -35380328, 42089604, 144956224, 62307092, -15951509, 102373232, 96621728, -9345312, 85252416, 110114912, --2163590, -81248432, -38059316, -190421136, -314287456, -279601824, -298102944, -455097952, -408842784, -382656896, --465287232, -452123680, -371037920, -334665984, -301154528, -174696720, -67630704, 58051316, 124479424, 239014400, -356793664, 389540640, 434030592, 566548608, 559120448, 439674720, 481080352, 425180288, 175382848, 191153968, -162276752, -8012799, -27868970, 46160160, -7788923, -74445744, 8225936, 47942036, -48818208, -20209968, -42142756, -24434606, -94445256, -32204202, -26680336, -136161200, -96990024, -27353572, -107255536, -121290952, --10044318, -44222056, -122783992, -60032904, -56684980, -172022560, -163262448, -148197840, -265502000, -286903808, --239680656, -255543568, -275618784, -198210064, -169496048, -147489184, -107604504, -59253368, -28294170, -9793062, -19046570, 90465432, 124541168, 193751344, 317908640, 359896800, 398432832, 465948128, 455149504, 400463840, -340593056, 237868176, 100573640, 22897008, -27807228, -80320184, -93940064, -92386896, -93635656, -95720864, --89842128, -81698328, -87977576, -89980640, -85673320, -91633128, -100242392, -95832528, -92408368, -90067072, --79397304, -60669096, -45656040, -30153354, -9175661, 6481106, 13610214, 18625662, 19735912, 16254841, -14357002, 10757819, 2500208, -4358855, -10530186, -18099530, -20423644, -20269024, -22377854, -21937620, --18388902, -17877264, -15977278, -10517838, -10438918, -11436961, -6577743, -4523138, -6694244, -2720862, --1421634, -3080565, 4247723, 11662984, 14088030, 21960704, 30303142, 34162708, 39686036, 45851996, -46901580, 46369540, 48393008, 48171280, 45485852, 42730092, 38726648, 32052268, 25676926, 21016886, -14746233, 8097624, 1962800, -5575405, -14497125, -21969294, -29196650, -34973920, -40098352, -43163348, --43328168, -41832980, -37799472, -30536680, -23768886, -17652316, -12147241, -7795903, -6109054, -4038880, --2404108, -1554778, -1009317, 251792, 747861, 1286880, 1642288, 2337536, 2318746, 2529199, -2358474, 2331630, 1730335, 1425392, 785442, 409096, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +6490770, 1706176, 5731097, 100395, -5911486, -4074850, -4305705, -668404, -2956548, 6933151, +-5183489, -1315871, -2353642, -827318, -4157528, 3999152, -2451353, -1918240, 3362960, 5578089, +6310381, 973884, -451508, 1314797, 335544, 892816, -2854543, -3071439, 1504312, -2784750, +-2790118, -3737695, -3931506, 1202054, -2603287, 3482682, -4339528, -587874, 1917166, 1824824, +1607928, -6729677, -1206886, -3731253, -647466, -1563905, -4104378, -80531, 4904853, 1496259, +2384244, 2259153, 2653216, 342524, 3328063, 2096481, 3714610, -2094870, 2480881, -1213328, +1715303, 202400, -3420942, 4012036, 4534949, -2421825, -3036005, 1343788, 4168266, 1000191, +1117228, -1387274, -268435, 2265059, 1416266, 370978, -819265, 282931, 1911797, 2327872, +-275952, -3615289, -2211371, -1214402, -1537061, 846645, -340913, -324270, 1726040, -1263257, +-419833, -2147, 308164, -854699, -241592, 133144, -1367947, -153008, 1691143, -245350, +896574, -1216550, 709743, 362925, -78920, -798327, -10161893, -2645700, -4594542, 3375308, +-9528385, 2101850, -4211753, -2196339, 1327145, 205085, 1040993, 1437740, 1049583, 4141422, +-1857573, 446677, -440234, -5005785, 3677029, 6197101, -5055714, -4709969, 3565360, 936840, +4406637, 1417876, 5928129, -813359, 1980517, -3139084, -985695, 6082748, 459025, -3947075, +-4911295, -5264556, 196495, 4382478, 2191507, -16643, 4946192, 3976066, 128312, -4054449, +6332393, 1635846, 4876936, 4998268, -900869, 3189013, 3725884, -443455, 2189897, 2584497, +-2502892, 522375, -796180, 2456721, -5617817, -3566434, 1774358, -3448322, -1363652, 4803384, +-1969779, 2644089, -1153736, -7510287, 1238561, -25233, 3922379, -6183679, -3362423, 2811593, +677531, -584116, 1567126, -2908767, 817654, 755914, -925565, -1829656, 2501819, 2314451, +1561758, 300111, -985695, 623307, -738734, -1104344, 801548, 727997, -1544041, 1101122, +-878321, -630823, 1326071, -966905, -2045478, -19327, -784905, -235149, -987843, -1036161, +385473, -67646, 576063, 5369, 564788, -1471563, 393526, -421444, 6355478, 6758668, +2939368, 5005248, 3867618, 6769406, 7664906, -2835752, -848256, 2611877, -7703561, -233002, +-2554432, -1440962, 3494493, -4446902, -544924, 5708012, 1028645, 3667902, -1823751, -1291711, +-1935420, -7197292, -1204738, 517007, 3798899, -1135482, 6553583, 2616709, -1155883, 2654827, +1342714, 3405372, -2462627, -482647, 7656316, -999654, 7232725, 3431142, -3201898, 789200, +6367289, 3353296, -4231617, 5850283, -1616518, 421981, 283468, -1146756, 1098438, 675384, +-5283347, 3387119, 2436320, -425739, 172336, -1146219, -4773856, 33823, 2655364, -515933, +-578747, -3173981, -7010997, -2375117, 2585570, 5898601, -8934069, -4726612, 1650878, -3863860, +2268280, -152471, -57445, -5338645, -4088272, -2356863, -3500398, -1692754, 182536, 630823, +-1264331, 2049773, 1595044, 357556, 1469416, -1603633, -617402, 68183, -2415919, -498753, +225486, -3022046, 1267552, 763430, -596464, 115964, 624918, 1491964, 153545, 233002, +14496, -1458141, -198642, -423591, 1078037, 779537, 1479079, -1030255, -242129, 9422085, +10018011, -2003065, -4195110, -4587025, 9605694, -8333847, 230318, -1360968, -3882651, -5276904, +1878511, -1451162, -7183870, -8745090, 334471, -658741, -4566087, 1653026, 2426120, -3215857, +-4842039, -4520453, 6388227, -6894497, -831613, -8056822, 95563, 4485020, 1530082, 767725, +-4517232, -4345970, 3955128, -3052648, -4617090, 573915, -1679869, 2827162, 57445, 1142998, +-4604742, -1701344, -1298691, 4422743, 3031173, 3076270, -9118216, 1444183, 2541010, 2084670, +2569464, -2597918, -1661616, 329639, 1846836, 3609920, -626528, 2386391, -2640331, 7043747, +-12773770, 4490925, 361851, -6791954, -294205, 7516193, -2275796, -3518652, -6851010, -2306398, +529892, -1897839, -11274, 3085397, 3917010, 3280281, -974958, -536334, -4033511, -816581, +-1037772, -2022930, 551366, -818191, -805306, 1643362, -2044941, -936303, 1957968, -974958, +1261110, -293668, -821413, -701153, -552977, -2942053, -1854352, 1291175, 1435056, -1392643, +-1144072, -945430, 1073205, -688805, -436476, -1150514, 742493, 812823, -1395328, 559956, +-212601, -1248762, -316754, -703838, 790811, -410169, 1185948, 1713155, -807454, -4472135, +-14133664, 2576444, -6442451, 1410897, 1185411, -819265, 10035728, 554588, -6413460, 8570070, +4134980, 2943663, -1283122, 1777580, -2604361, 6721087, -1109712, 767725, 10126996, 9882183, +4234301, 4527970, 4358855, 4922033, 3291019, -9758703, -3041911, -131533, -2559264, -8304856, +-907849, -1965484, -2187212, -4458713, -77846, -1305133, 7157563, -2288681, 12543452, -69793, +1066226, -2317135, -1805497, 101469, -351114, -997506, -2181844, -1462973, -6132140, 1502165, +1016834, -726386, -3164854, 4297115, 3188476, 3725884, -1292785, -2682744, 85899, 3248606, +3522410, -2815351, -8009577, -4089346, 881542, 6699075, -908922, 5478768, -4328254, -6299107, +4728759, -2196339, -5164698, 3022046, 3159485, -5797669, -4576288, -6380174, -2106682, -2189897, +3689377, -1986959, 1136556, -397821, 2466922, 1527935, 1375463, -1193464, -663036, -3313031, +-1651415, -874026, -19327, 1490891, -263067, 116501, 2786897, 1095754, -113280, 44023, +1799591, -1152662, 503585, 528818, -914828, 1088774, -807991, 723165, 576063, 806917, +-478352, -2049773, 2034741, 278099, -3428458, 5092758, -6049462, -6832219, 3344706, -2029372, +-456877, -3634079, -1912334, 3350075, 5012227, 2456721, -993748, 651761, -442919, -1216550, +-4510790, 1479079, -12396349, -3725884, -3847217, 3379603, 4453881, 279173, 2289218, -7889855, +2287607, 1126355, 2279554, -7119445, 13459354, -674847, 2631741, 1671816, -6126234, 919660, +-8853001, 5719286, -1758252, -7616588, 1686848, 508417, -3619584, 343061, 992674, 5893769, +10896332, 4578435, -2003065, 3409130, 4576288, -10049687, -3499862, -4639102, 2949569, 2221035, +-1488206, 1518271, 3649112, 2151779, 4651987, 8306467, 368830, -3177739, -684510, -419833, +6749004, -4790499, 201327, 2970507, 9041980, -30065, -5720360, -5818607, -332323, -7132330, +-781684, 2614025, 11038066, 9285719, -909996, -5030481, 4181688, 230854, 1348083, 944893, +-195421, 1302986, -200253, -1440962, 1364189, 1490354, -1355062, 2115272, 2204392, 1902134, +-391379, -1675037, 1441498, 1684701, -109522, 447750, -1181116, 139586, -120259, 2477123, +1103807, 1517197, 1401770, 320512, 996432, -89657, 1171989, 2206003, 650151, 859530, +1803349, 2143189, -891743, -637803, 706522, 580894, 1851668, 2529736, -1135482, -12997108, +-3577708, -4811974, 5539434, 189515, -2709051, -16712791, -2237678, -2246268, 6891275, 16533477, +-4799089, 11101417, 1875827, -9798431, -10031433, 1721208, 2502355, -5704254, 6226629, -4514011, +5009006, -6244346, 2971044, 2126546, -5959267, -5000953, -3843459, 1944547, 6428493, -8462696, +268435, -8898098, -542777, -3400004, 2115272, 6452652, 631897, -2830384, -2530810, 6984154, +-73014, 10660109, 3230352, -4059818, -3932043, -3126199, 1475321, 6675453, -194884, 11084774, +-19854024, -14634027, -11872363, -2769180, -10136123, 617402, -3853123, 3546569, 8930311, 1575179, +3659312, 5725729, 9454834, 4851703, 1392106, -6608344, -16452409, -17314624, 9201967, 580357, +11698417, -8428873, -6100464, 5106179, -12198781, 190052, -4402342, -509491, -7893613, 255014, +2538326, 7013145, 1204738, 1087701, -2328946, 2490544, -591095, 783832, 1898912, 3140158, +4044249, -1179505, -1807644, 2937221, 1441498, -1206886, -2251637, 390842, -442382, -330176, +-1001264, 395674, -49929, -1249299, -483721, 1160715, 2144799, 1715303, 1446330, 725313, +-5109938, -2840584, -2007897, -1863479, 2611877, -497142, -920734, -57445, 680215, 117038, +-177704, 7740605, 3535832, -6360847, -64961, 14834817, 12774843, -1282048, -10847477, -18590230, +-2005213, -6600291, 6711424, -5651640, -5350456, -21040508, -8878771, -18858664, 7016366, -730144, +-4469987, 4876399, -559956, -4832, 1453310, -6135898, 626528, -7031399, -1133335, 4078072, +3218004, -7171522, 2632278, 7074348, 11805254, -1895154, -1547799, -4020090, 756451, 5957657, +8724152, -1364189, 1365263, -1986959, -1408212, 10161356, 7573638, 175020, 7808788, 2109366, +-9377524, 1658931, -867047, 12114492, 4870493, 1413044, 5993090, 7813620, 2270964, -7119445, +-11885785, -2894808, 2579128, 6288369, 3361349, 267362, 2588255, 9360344, 2172180, 2952790, +4452808, 2418067, -6024229, -7036230, -5916855, -6953552, -6162205, 10415833, 1562294, 8010651, +-7092602, -6468221, -1143535, 6669548, -4192962, 3484292, 2156074, 938987, -3553012, -2450279, +-3278671, -2441152, -3747896, 1367947, 1296543, -1196685, 2570538, -1808718, 1243393, -824634, +336081, 985695, -3316789, -2258616, -3329674, -2356327, -4070555, -1350767, -3367254, -1804960, +-1930051, -2772938, -118648, 2822331, 1027571, 1076426, -1023813, -464930, -327491, -887985, +2377265, -1280437, -587337, -896574, 26119306, 5835787, -8172786, 4774393, -4795868, -15447387, +-3231963, -15152108, -8438000, 7981123, 10435160, 4156455, 2094333, 982474, 1880659, 10065793, +-7138773, 14202920, -9173513, -9192841, 11220065, 5095979, -18210662, 8044474, 4613869, 5857262, +11961484, 6003291, 8897562, -512712, 4825396, -2754685, 7603166, 2089502, 1633698, 5167920, +-10234907, -5446019, -3128884, 6655589, 2873333, 2445984, 5242008, 1611150, 1877975, -9168681, +122407, 10114111, -1767379, 1329292, 1300838, 1387811, 12024835, 4715337, 16165720, 3820374, +-2256469, 15429670, -13147432, -1614908, -2041720, -5163088, -1156957, 3315178, 15244450, 1562294, +-3175055, -5800890, 3193845, -6105296, -2602213, -3892314, -8265128, -1231045, 2282775, 13103945, +-1022739, -12454331, -3418794, -7435662, -3722663, 9181029, 7383586, 8606041, -6708739, 1506460, +-7471096, -1036161, -2493766, -4438849, -2480344, -6125160, -3565360, -1066763, -2600066, -8072391, +-3169686, -2244657, -1602560, -1749662, -2807298, 462783, -1319092, -6332930, -272730, -2996814, +-1798518, -439160, -21475, 1237488, -157840, 2989834, 2884071, 592169, 555661, -1964411, +-1759863, -383326, -2136209, 3054259, 1801202, 2872796, 2668785, 1225139, 3721589, 2535641, +962073, 1806034, -468151, -1418950, 2639794, 3818763, -9434969, -14543833, -5251672, -14319958, +10283225, -12218108, -8992588, -7195681, 6499896, 16383690, -16624208, -5901822, -18735722, 5366025, +2614561, 1756642, -5382668, 1461363, 21092584, -11039677, -1853278, 7984881, 5455146, 4175245, +7419556, 4938139, -6939594, -11729019, -2191507, -6498823, -8850317, -10829760, 172336, -2531883, +2664490, 13932337, 8824547, -7836705, -4231080, -884226, -4045322, 3403762, 26508002, -9008157, +18490908, 5782100, 3106872, -1223529, -2998961, 3115462, -10155450, 4846334, 14391899, 595390, +2297808, 11504607, 7474317, 4442607, -9714679, 8107825, -5793911, -8670465, -23414552, -7385733, +15209553, -8666707, 3941169, -16496969, 11790759, -6222871, -6495065, 10284299, -16430934, -12164958, +18611168, -13283260, -12493523, 7450695, -8571144, 1716376, 28454, 5313412, -13477071, 4226248, +352187, 13427678, -10004589, 3326452, -1421097, -7613367, 9962714, 2010045, -8293582, -6021544, +-5714454, 870268, -22012, -4181688, 111669, 5193689, -435939, 3679713, 4144644, 3285113, +-7467338, 4147328, 3804267, 5992016, -151398, 440234, -5429913, -2171106, -2672007, -2817499, +1255741, -628139, 3475702, -4940823, -3114388, 1861332, -4777614, -4030827, -5089536, 1750199, +-10600516, -7868380, -1085553, 12059731, -5711233, 21181704, 19697256, 3893388, 6306086, -11421392, +1414655, -9242770, 14790794, -2938831, 4358855, -7041599, -4569845, 2542621, 1998234, -6757594, +11340861, -3178813, 2409477, 4258997, -7421704, 2842732, -9470403, 74088, 5398237, 6492917, +159451, 8574365, 10782515, -768262, -20170778, -3356517, -5961415, 14489072, -12181601, -15103789, +-10793790, -7184944, 2116882, -8534100, -6726993, -4267587, -1224603, 2714956, -29563334, 18738942, +14583561, 21358336, -6747394, 3484292, 14295799, -13574781, -12614319, 2573222, 9352828, 6200859, +-1575179, 2952253, -7441568, -8826158, -11335492, -3258807, 39383240, 3247532, -21767968, -3816079, +-11906723, 7592966, 5925445, -13429826, 2943663, -4057670, 1166084, -6577206, 8469676, 8678518, +-1224603, -4256313, -5105643, -17032230, 5224291, 2868501, -627065, 7185481, -3353296, 1242319, +2816425, -8015483, 3187403, 4973572, 11303280, 6088116, 779537, -9538585, 151934, 8934606, +601295, 122407, 6681359, 262530, 2343442, 6626598, 5601711, -876173, 3112241, 5633387, +5183489, -2292439, 2327872, 6742025, 8204998, 6122476, -71404, -4111894, -861141, 331786, +5184026, 132607, -1341104, 491237, 1977296, -3027415, 1990717, 3304441, -2975876, 2172717, +-7428683, -783295, -5305895, -11642583, -21354040, 1371705, -17777944, 8165270, 3303904, -15001247, +8617315, 9094056, 13593571, 3432216, 5596343, -15559056, 60666, -3419331, 14488535, 6176163, +984084, 12808666, 15075872, -2172717, -6692096, 1279363, 18503256, -12221866, -9010305, 8945343, +5457830, -12429635, -2323041, -11534135, 21103322, -18130668, 5258114, 10624675, -6347962, 9729175, +3985193, -5485210, -5058398, -5874442, -8133058, 11192685, 15976741, 2694018, -11700028, 811749, +-12958453, -5494874, 8935679, -2084133, -6293201, -5287105, 2505040, -18097382, 816044, -2304787, +-9898826, 13324599, -13300440, -1376537, -2863670, -10505490, 10898480, -1309428, 6409165, -5577015, +-801548, -1076426, -6191196, 4477504, -5689221, -1578937, -5600638, 15455977, 7078643, -19412178, +-3933653, -31675920, 18219252, -541703, -13848585, 12112345, 1567126, 1372242, 4811974, -273804, +7422777, 8332774, 2183991, -2794950, 5052492, 8992051, -5246840, -3856881, 4032438, 862752, +2513630, 2282775, 4988068, 5953899, -4058744, 2858301, 2210298, -5637682, -4519380, 3583077, +1015223, -1058173, -3264712, -3637837, -5431523, 4996658, 5862094, 423054, -3580929, -12309913, +403190, 513249, 3981435, -8111583, 980863, 5418101, -3126736, 6350646, 3273302, -1027034, +2068027, 3183645, 478352, 783295, 2234994, 4030827, -3915937, -839666, -2222109, 1087701, +18823768, 913754, -14681272, -6030134, 8354249, 14049912, 14648523, 727997, -3695819, 21070572, +8878771, 23396834, 2614561, 2158758, -11394011, -4412005, -6846715, 6379637, 3136937, 12738336, +-14607721, 1159641, -8788040, 7884486, -12696460, 4921496, 13575855, -1895691, -653372, -7034083, +1717987, -7081864, -25035902, 3583613, -4056060, 1901060, -11322608, -2259153, 9432285, 18895172, +-2193655, -6626598, 10644003, 5294084, 2403571, 13058311, 4234301, -6712497, -3544959, 8489003, +-1400159, 7762080, -9319542, -7913477, 2549063, -7427072, -14797773, -6557342, -16819092, -3534221, +5330592, -12851079, -2120103, -14785425, -6789270, 55835, 5630166, -17652852, 7543573, 1484985, +-10850161, 13437879, -4983773, 3678103, 23278722, 26803818, 1459752, 9529996, 19229642, 23461796, +22870700, -2119566, -15675557, -23475754, -8850317, -15510738, 14537927, -3028489, -7242389, 3944928, +-645856, 1772211, -545461, -6849399, 7250442, 2278480, 2550137, 699543, 9892920, -5534602, +-380105, -2971044, 6777459, -6394133, -3060701, -545461, 9758703, -2467996, 5784247, 8424578, +-7875897, -1481227, -3489661, -8456791, -3757560, -1829119, 3431142, 438624, 11464878, 3329674, +7665443, -616328, -7856032, 2252710, 1815161, 78920, 31988916, 36668820, 1926293, 11732777, +11247982, -1569811, -26395796, -725850, -1065152, -10040560, 7435662, 6869264, -14376866, 7789997, +10045392, 1620813, -3839164, 5419712, -3685082, 18634790, -3226057, -8802535, 100932, 4182761, +-1781875, -1300838, -359167, -29861296, 8575439, -757525, -20603494, -8617852, 3533148, -2024003, +-14051522, 4778151, -16579648, -1594507, 1597191, -26665842, -4782983, 11293617, -8558259, 1128503, +16724066, 10156524, 12785044, 3873524, -7252589, -12527883, 12722230, -6709813, 7111392, -11916387, +-6192806, 8334921, 14289893, 1965484, 17124034, -11641509, 14809047, -12705587, -15169288, -10952703, +14758044, 15341086, -14346801, 7256347, -39549132, -3762928, 11573863, 3517041, -6240588, -15906411, +7210713, -22419192, 3549791, -11641509, 10511396, -17358110, -11009612, 17063368, 346282, 8489003, +1916629, 7373922, -3920768, 2939368, -1996086, -13065291, -2374580, -6194954, 3965866, -4343823, +2245731, 320512, 2099165, 839129, -2881923, -4115116, 501437, -8358543, 2865280, 2108829, +4639102, -5436355, 4607426, 4112968, 2810519, 3503083, 2698313, -5837398, 551903, 2496450, +-4185446, 7262790, -717260, -3147674, -4327717, -287226, 630823, 3315178, -2767033, 3124589, +-2673080, 7617662, 3432216, -6923488, -1762547, -1938104, -3163244, -3093450, -6977711, -29153702, +2304787, 35713728, -24088860, -2441689, -1934883, 1745367, -9429064, 4420595, -15134928, -15830713, +-5002563, -4440996, 3955665, -4103305, 8330626, -11907260, 554588, 22916334, -18748070, -16852378, +-3883187, 20033874, 2985539, -25446070, 10928007, -9542344, -10654203, 2353105, 34917548, -19713364, +-10741713, 24583320, 18485002, 1435056, -10075993, 520228, -3649649, -8017094, 7235410, 6304475, +-4059281, -20208894, 25839060, 11906186, 5012764, -27453968, -4028679, 8323110, 9594420, -3552475, +14502494, -2473901, 5029407, -6415608, -16295106, 10558103, -11586211, 6881612, 3795141, -14565308, +27358942, 4029753, 19742354, 19494320, 3649112, -29719026, -5528697, 124554, -11598022, -6111739, +1262184, -1099512, 12984223, 23979876, -6831683, -2517388, -10508174, -4913980, 10171019, -6925635, +5969468, 17790292, -15549929, 17682380, -3365107, 5205501, -6644852, -3792993, -5558225, 615791, +3466039, 3782256, -2851858, -57445, 4202089, 2164664, 9558450, 4271345, -4634807, 250719, +981937, 8449811, -4648765, 2350958, 4088809, 1190243, -224949, 152471, -11112691, 5363341, +-4027606, 5248987, 7137162, 797253, -1044751, 3433290, -281320, 2594697, 1013612, -1313723, +-4068408, -4358855, 8433705, 1288490, -1896228, 2207613, -5153961, -1118839, 8573292, 11231339, +1503775, -10260140, -51596516, 3425773, -13478144, 1816234, 25801480, 2504503, -5000416, 4741644, +978716, -17479444, -18920404, -16994112, -16362752, 21306260, -4276714, 25422986, 2238752, -23954106, +-857920, 2677375, 20534776, 4077535, -3335579, -4054986, 5855651, -12887586, -4962835, 22755274, +-4647692, -29487098, -22557706, 13498545, -2944200, -6109054, 6771016, -2092723, -15218143, 4608500, +8918500, 20486994, -4135517, -16965658, 220654, -21404506, 8232379, 24275692, -3893925, -29750164, +9361418, -322659, 1664300, 7193534, -9387188, 18337900, 1365263, -12344810, 9601936, -6677601, +-4146254, 26193394, -13420699, -4490389, -4412005, 16506633, 6619082, -28947542, 14681809, -23325968, +-5578626, -12582107, 2998961, -7670812, -7087233, -2402497, 13288629, -4315906, -8207146, 15744813, +-9188546, 16161962, -96637, -8531416, -5148592, 4023311, 4436165, 3205656, -9722732, -3211025, +2376191, -541703, -6364068, 143881, 5983427, 9225053, 3833795, 4745939, 743566, 9067213, +-5142687, 2944737, 7161321, -2724620, 891206, 2922725, -1801202, 1429150, 2831994, -8886824, +7497403, 3195456, -8946417, -7330973, 512175, -10519449, 908922, -7754027, 10028749, -18149994, +-45097, -3845070, 1905892, -4728222, 5658620, -3029563, 2634426, 2026151, -3741454, 816581, +-25115896, 5081483, 41649372, 27008902, 12453795, -20714628, 15521475, 19465866, 28983514, 13884019, +3473018, 936840, 18173618, 31188978, -7010997, -3907347, 17761300, -35121560, 12788802, 31145492, +-6438693, -10927471, 8149164, 24154896, 19575924, -13173202, -22348326, -1427003, 11289322, -3906273, +2740726, 244813, 26276074, -15107547, 16840566, 25274272, -10142028, -3192771, 17945984, -2810519, +62878320, -26487064, 11333345, 42899208, -24764782, 7991324, 2890513, -35014184, -1073742, 6380174, +-15377057, 33986612, 2586107, -4821638, 2656974, -14329085, 46782396, 12765180, -37497748, 36042292, +-15126338, 1202054, 11097122, 13296682, 24004036, 11564736, -6496138, -23584740, -31542776, -11984569, +-12652974, -2316061, -9691594, 19672560, -12074227, -21056614, 2321967, 5617281, 4238596, 7452305, +-11850889, -11694659, -7019587, -7794292, -24879134, -10676215, -8485782, -17345226, -8276939, 5967320, +-7326678, -16283832, -796180, 6072547, 10788421, -2739116, 5061082, 11581379, -704912, -8196945, +-524523, -5055714, 6526740, 9182640, -13203803, 11374147, -6856916, -75699, 1708323, -6339372, +12143483, 4469451, -17137456, 10294500, 1563905, -6318971, 12598750, -14621142, 5732708, -2942053, +6140730, -3686693, -4031901, 2135136, -2385318, -1728188, 4412542, -2876018, -9834938, 4268124, +-943282, 2702608, -460098, 7910793, -4518843, 10077067, -48168060, 27967216, 1482838, 16822314, +28275918, -46601468, 10806675, 23665270, 5608691, 17605070, -17666812, 19401978, 5917928, -18395882, +467078, -11671037, -33773476, 18435610, 10778220, 30854508, -16989816, -22963042, -7763691, 7080254, +-4540854, -38720740, -18820546, 11635603, -2689187, 5558762, -16074452, -5242545, 12994960, -11060615, +-5242545, -16644609, -3673808, 5789616, -18044768, 1722282, -39620000, -32942400, 10291279, -34258268, +3132642, -35831300, -24816322, -17385490, 16927540, 33075006, 41113576, -9882183, 18356690, 22017076, +10904385, 9443022, -15743203, 45414448, 46631532, -31768262, 31827856, -25029996, 16086263, 32539746, +31214748, 37734508, 45349484, 31899258, -35837744, -25702694, -128849, 747861, 13743358, -8714489, +-6777996, -21700322, -11811697, -32119912, 7164006, 26717380, -10709501, 6449967, 28170154, 13082470, +-19063750, 21415244, -1190780, 7494718, -1971927, -3923453, 6353331, -6892349, 9669582, 7940321, +-7016903, -8759049, 8362302, -6001143, 423054, 157303, -545998, 2252710, 945430, -11621645, +10861435, -4984310, 5259725, 6076842, -4152697, 6554120, -8106214, -6119792, 5581310, -6688338, +-8378408, -3837553, 3502009, -3409667, 2222109, -7765838, 386010, 2756295, 7190849, 10536092, +-2408403, 5907191, -6914361, -61740, -1199907, 3149822, 2548526, -696858, -5332739, -7654706, +-1719061, 1583232, 59855736, -43806520, -22310744, 23627688, -14063334, 22574348, -17590038, -19587198, +6614787, -46321224, -2102387, 31189516, -7525857, 16045998, -26584774, -6502581, -10495826, 1090385, +33244658, 10089415, 7392713, -5893769, 18253612, 5912023, 45426796, 11216844, 26527328, 1934346, +-20720532, -19558744, 26444114, -12800613, 12239046, -202400, -34088620, 24647744, -30368104, 59077276, +-43972948, 26917634, 24068996, -25196962, -21205328, -15617575, 21824340, -1597191, 22840100, -217433, +3007014, -40284644, -21654688, 9465034, -19802484, 6644852, -12060805, 11933567, 6769942, 31076772, +-18380850, -6260989, -7815230, -15108621, 42066520, 7867307, 4000225, -39049844, -12632036, 21144660, +12473122, 13503914, 36450852, 23395224, 32240708, 37250788, -1030792, 16556025, -15396384, 49520972, +3776350, -8047695, 18066244, -4109210, 37982544, 803696, -7573101, -7714298, 4608500, 26786100, +-20157892, 13900662, -6368363, -2062658, 7983808, 5432060, 10452877, -6387153, 6832756, 12582644, +-3192235, -4600984, 8508330, -1236951, -1241246, -811749, 2348273, 1517734, 4140349, -8909373, +11946988, -6848326, -3785477, -1771674, 7341173, -10095858, 1123671, -7181186, 10008348, 18115636, +-5921150, -4817880, -2296197, 12491912, 6161668, 13043816, -940061, -7330973, 5992016, 6351183, +-1744294, 6295349, 4891968, -17339856, 2822867, 20202452, -2569464, -9381819, -90555624, 63006096, +-39123392, -27054536, 505732, 13085692, 16056735, 3117073, -14629732, 49086108, 24639154, 7021735, +-24630026, 16230145, -987306, 18423800, -23528368, -15963320, 12351252, 36740760, -42074572, 1902134, +13424994, 4642323, -10477573, -6014565, -5443871, 1867237, -2296197, 9648107, 45913736, 3151432, +-20999706, 31172872, -7412040, -29780766, -38834556, 36990944, 11855720, -4938139, 13523778, 8684961, +30436822, -41394896, -4600984, -20970714, -6207302, 23929948, -17724256, 9426379, -20410758, 9913858, +63308892, 4968741, -36581312, -40655088, -2747169, 19594178, 18846316, -16209743, 3712462, 31061740, +-13225278, -59706488, 33872260, -20497732, -34300684, 15078020, 56489020, -39085276, 28323698, 39699992, +13361643, -34152508, -28898688, -17497696, 13977434, 12493523, -12140799, 35634808, 17035988, -2115272, +-1323387, 2245731, -29962766, -11215233, -21301428, 10913512, 9265318, 7158637, 9358734, 7378217, +21533356, -10831908, -5659693, 4283693, -243203, -16786342, 14246943, -556735, 8806830, -4138201, +6551436, -10788958, -3663070, -6480032, 9940702, 2019708, 1780264, 355409, 5850283, 16098611, +-6680285, -30559766, 2173790, -15065672, -3292093, 9192841, -13297219, -8385387, 17052094, -16238734, +-3970697, 159988, 8000987, -17396766, 886911, 51881056, 17078400, 3438658, -3800509, 8222715, +14602352, -4653597, 6814503, -7860864, -69793, -6213744, 24371792, -27349814, -3067144, 16341814, +-37976636, 12285754, -9263171, 2855080, -4440460, -10639708, 6797323, -2946348, -15461345, 41605884, +-31753230, -8949101, 29557428, -18953154, -2886755, -5988795, 6513318, 29217052, 2288144, -28536836, +39106216, -21139292, 13945222, 24340116, 10870562, -9120900, 2176475, -21499532, 5268851, -13032005, +-10209674, 52329344, -12145631, -20900922, 6842957, -9778030, 12456479, -8168491, 13675713, 33658048, +-18502720, 11120207, 25760676, -30289720, 13885092, 16430397, 7556458, 20572894, -23463944, -6224482, +36018668, -24877524, -5452461, 10242423, -10050223, 34304976, -34092912, 5763309, 12319577, -15799574, +11983496, 13089450, -32468342, 11528229, 27710056, -336618, -8313446, -1344325, 17828946, -3718368, +-30491046, 24762634, 11771968, -13440563, 5092221, -7423314, 11009075, -4327717, -13645648, 16037945, +900333, -3533148, -11864847, 11134166, 2124935, -15852724, 5657546, 10567767, -2188823, -5210869, +2317135, 9766756, -1450088, -10211822, 10406169, 6777996, 1270237, -548682, 8699456, 1642288, +3050501, -12132746, 15373299, -8501888, 16394964, -10829760, -29272350, -79017200, -124175024, 11244761, +118921200, 9714142, 269223584, 277875808, 138346272, 290901344, 194031056, -40325984, -4212289, -64085208, +-233616688, -205110992, -126789584, -238713216, -186827312, -54391464, -117102824, -98085240, 34651260, 58589796, +-28486370, 15241765, 52328808, -40500468, -23728620, 73723648, 65488052, 7392176, 73199128, 124958856, +41676752, 90340344, 171029360, 82029040, 43244416, 153177856, 128028680, 16895328, 91884384, 179509776, +35380328, 42089604, 144956224, 62307092, -15951509, 102373232, 96621728, -9345312, 85252416, 110114912, +-2163590, -81248432, -38059316, -190421136, -314287456, -279601824, -298102944, -455097952, -408842784, -382656896, +-465287232, -452123680, -371037920, -334665984, -301154528, -174696720, -67630704, 58051316, 124479424, 239014400, +356793664, 389540640, 434030592, 566548608, 559120448, 439674720, 481080352, 425180288, 175382848, 191153968, +162276752, -8012799, -27868970, 46160160, -7788923, -74445744, 8225936, 47942036, -48818208, -20209968, +42142756, -24434606, -94445256, -32204202, -26680336, -136161200, -96990024, -27353572, -107255536, -121290952, +-10044318, -44222056, -122783992, -60032904, -56684980, -172022560, -163262448, -148197840, -265502000, -286903808, +-239680656, -255543568, -275618784, -198210064, -169496048, -147489184, -107604504, -59253368, -28294170, -9793062, +19046570, 90465432, 124541168, 193751344, 317908640, 359896800, 398432832, 465948128, 455149504, 400463840, +340593056, 237868176, 100573640, 22897008, -27807228, -80320184, -93940064, -92386896, -93635656, -95720864, +-89842128, -81698328, -87977576, -89980640, -85673320, -91633128, -100242392, -95832528, -92408368, -90067072, +-79397304, -60669096, -45656040, -30153354, -9175661, 6481106, 13610214, 18625662, 19735912, 16254841, +14357002, 10757819, 2500208, -4358855, -10530186, -18099530, -20423644, -20269024, -22377854, -21937620, +-18388902, -17877264, -15977278, -10517838, -10438918, -11436961, -6577743, -4523138, -6694244, -2720862, +-1421634, -3080565, 4247723, 11662984, 14088030, 21960704, 30303142, 34162708, 39686036, 45851996, +46901580, 46369540, 48393008, 48171280, 45485852, 42730092, 38726648, 32052268, 25676926, 21016886, +14746233, 8097624, 1962800, -5575405, -14497125, -21969294, -29196650, -34973920, -40098352, -43163348, +-43328168, -41832980, -37799472, -30536680, -23768886, -17652316, -12147241, -7795903, -6109054, -4038880, +-2404108, -1554778, -1009317, 251792, 747861, 1286880, 1642288, 2337536, 2318746, 2529199, +2358474, 2331630, 1730335, 1425392, 785442, 409096, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 1612223, -6466610, -3228742, 1795296, -682900, 381178, 286689, -2597382, -2976949, 1945083, -557809, --2367601, -3052648, -1862405, 2657511, -272194, 3572339, 760746, -4572530, -4698694, -3358128, -1378685, 1145146, 2444373, -382252, 2796561, -2152316, -389768, -4944581, -752693, -937377, -1021665, 1834488, 1864016, 3619584, -1807644, -2455111, 1972464, 1091995, -2371896, -2442226, -116501, 1673427, 813896, 4020626, -1534914, -1300301, 4581120, 1379758, 8586176, 3628711, --2408940, -103079, -5284421, 78383, -6023692, -418222, -2253784, 4140885, 438624, 2212982, -3047279, 1628330, 2921652, 1922535, 413391, -5075578, -563714, -2554969, 3482145, 5063230, --3569655, -2561948, -1536525, -2081985, -2694555, -4355634, -986232, 1275605, -2556579, -2135136, --902480, -3585761, 410706, -740882, -2407329, 743566, 125628, -39192, -1187022, 186831, -221191, 1298691, -370978, 828929, -442382, 592169, -175020, -826781, 215822, 1013612, -172872, -960462, -963146, -126165, 1770600, 383326, -346282, 257698, -524523, -600759, --10133975, -10829223, -862752, -3104188, 414464, -2347737, -640487, 6029597, -1079647, 3242700, --1491427, -2894808, -4006131, 737661, -830002, -4779762, 5510980, 1658394, 376883, 2940979, -2801929, 4547834, 3200288, -299574, -3384434, 3160022, 733903, -4558034, -2016487, -2054605, --1367947, 4078072, -1398012, -6951405, -2356863, -793495, 1450625, -2159832, -4525822, 149250, --442919, 5257577, 777389, -40802, 1918777, -119185, 7090991, -1222455, 651761, -1566589, --2814814, 3758, 3045132, 1377611, 830539, 2878702, -2641405, -4399657, -3148211, -633508, -578747, -1027034, 125628, -3302830, -731218, 1730335, -1053878, 3444564, 1797981, -195421, -639413, -3231426, -2750927, 5344550, 1214939, 2275796, 1551557, -952409, -313533, -4063039, -287226, -2322504, 998043, -794032, 1035087, 1098975, 3144990, -330176, -1097364, 181999, -674847, 417149, 114890, 106837, -945430, -750546, 383863, -347892, -813896, 1271847, --643708, 649614, 974958, -927176, -271120, 727997, -274878, 1309965, -789737, 645856, --628139, -468688, -1643899, 1539746, 6983080, -362925, 3574487, 2136746, 4774930, 5900748, --1351841, 507343, 3607773, 3600793, 2382096, 6752226, 1357210, -2172180, 287763, 5913633, -2068564, 2807835, 5101885, 6892349, 4528506, -1527935, -4701916, 3339874, 2258616, -2689723, --4538707, 276489, -2647847, 1240172, 1745367, -1627793, -2259690, 2313914, 1813013, 4084514, --2702608, -5495948, -2762201, -2361695, -3673271, -1248225, -4196720, 2551748, -5748277, 2505577, -506269, 1362042, -2545305, 5532992, 4214974, -3860639, 4854387, 1848447, -694711, 1623498, --3482145, -1088774, 3330210, 1207423, 1410897, 898722, 3975529, 1633698, 4910222, -2362769, --264677, -281857, 1926830, 2863670, -1093606, 1918240, -2528125, 1334661, 1751273, 1582159, -5395016, 239981, 4036733, 4522601, 2556043, -4036196, -740882, -590021, -1022739, 411780, -2316061, -892279, 119185, -118112, 309775, 877247, -614180, 1023813, 1618129, -1037772, --529355, 1547262, 108985, 75699, -16643, -784368, 432718, -346282, 184684, 1220308, -1947768, 152471, -189515, 1023813, 796716, 374736, 506806, 441845, 533650, 10201, --187368, 920734, 1097364, -859530, 615254, -251792, 892279, 1095754, 162135, 274341, -1155346, 66035, 23085, -146566, 545461, 19514184, 16643, 17294760, 1235877, 11005317, --2477123, -1729261, 2830384, -7968238, 8720931, -4900558, 5803575, 4524211, -3387119, 2726767, --380105, 466004, -1640678, 2602213, 3361886, 4479114, 7020124, 1880122, 2144799, -147103, -8281234, -9541807, 95563, -610959, 2181844, 4232691, -5227512, 2073396, 2158221, 1306207, -3229816, 1945620, -4066260, 1991791, 7397545, -1293859, 2167348, -1155346, -1311576, -245887, --5551245, 8457327, -268972, 921807, 6101538, -769873, 342524, 7846369, -11497091, 3219078, --352187, 3497177, 9052717, 2839510, 2083059, 3279745, -1135482, -2478733, -1878511, 2335389, -700617, 5021354, -1924145, 4140349, 1753957, -1303523, 695248, -3167539, -2243047, 505196, --1088774, -4405563, -2983929, -4510790, 2574833, 4112968, -1227287, 1311039, -1086627, -2982855, --264141, 1734630, 1552631, -5404143, -360240, 562641, -972810, 360240, -1257352, 161061, --1341640, -2580739, -183610, -1693291, -1533840, -2127620, -37044, -2080912, -790811, -2018635, --1700807, -24159, -877247, -1056562, -249108, 317291, 867583, -1066226, -112743, 385473, --7794292, -9462887, -3825742, -1376537, -3612604, 7668127, 3205119, -6025839, 6728603, -896038, --4990215, 1529545, 2904472, -2698313, -4563403, -4014721, -8633958, -4281009, 3663607, -5389647, --8765491, 2514167, 3485366, 756988, -3251827, 6591164, 765578, 6098317, -420370, -1335735, -3411278, 5781026, -8182450, -3824132, 2180233, -1771137, 1957431, -5270999, -425202, 1490354, -1893007, -4490925, -8305930, -2275259, 2378875, -1346472, -1076426, 555661, 2641405, -765041, -1452773, -2733747, 4766340, -6243272, -4737886, -1593433, -4641249, -1329829, -1274532, 1891396, --3410741, 2610266, 5182952, -397821, 1198833, 1457605, 2475512, 5140539, -1956358, -922881, --985695, -2056753, 5275294, -2099702, -9240622, -5834713, -3913789, 8914205, 137976, 5137318, -2317672, 824097, 1359894, -558883, -209917, 4320200, -1428077, -917512, 1372779, -692564, -679142, -1855963, -1165010, 1032403, -263067, 1130650, -279173, 690416, 1597728, 1203665, -1494649, 65498, 1041530, -175020, 1533840, 1738388, 2735357, 1767379, 2172717, 571768, -1452773, 1302449, 904091, 1353452, 1804960, -754841, 148713, -292058, -755914, 803696, -1073205, -2150705, -8431558, -19400368, -1874753, 1404991, 147640, -6252936, -2855080, -7105487, --1908039, -8392366, -9736691, -7508140, -1817308, -4958003, -10966662, -6773701, 2191507, 3419868, --3078955, 6604049, 3561602, -2383170, 8019778, 1774358, 598611, 1341104, -11142219, -368293, -1771674, 4206384, -3553549, -3047279, 6521908, 12868796, -9678172, 3487514, -2902324, -464930, --8541079, -716186, -176094, -4288525, -5556614, -3950833, -4740570, -2455648, 2685965, 9446781, --4487704, 3555696, 6280853, 5784247, -2034741, 671089, -2153389, -1813013, -8779450, -4285304, -4830765, -3119220, 974421, -2978560, 2386391, 1328756, -1056025, -319438, -4152697, -3335579, -661425, -1200980, 1682554, -10275709, -10978473, -1167157, -1694902, -4670240, -130997, 3449933, --5453535, -4116189, -4667556, -7915625, 5485747, -578210, -1296543, 2142652, -421444, 1920387, -3578245, 1272384, 1937030, 1162862, 2596308, -823560, 370441, 426276, 501437, 883153, --825707, -689342, 32212, 819802, 928787, -687732, 738734, -993748, -1983201, 990527, -608812, -758599, 2304787, 1076963, 35970, 912681, -1600949, -1619203, -547071, -872952, --794569, -2159295, -448824, -1709397, -12221329, -2243047, -14688251, -3126736, -10445360, -1095217, -1808181, 2760053, 11057393, -6847789, 2369211, 3156264, -6205691, -2606508, 8870718, 1089848, --2763275, 1265405, -7548405, 6862821, -9634685, -3004867, 4104378, 2770254, -1121523, 1756105, --2009508, 3245385, -4187593, -7004555, 354335, 3585761, 2694018, -5575942, 1450625, 6547678, --6729677, -8230231, 6533182, -5571110, 4219269, -3973382, 2295660, -38118, -6066642, -7591892, --4888210, 2233920, -441308, 3014530, -4166655, -3805341, -9990631, 5268315, -7198902, -3101503, -3704946, 8876624, -1268089, -1687385, -13036836, -10038949, -3521873, -3496640, 4719096, -1247688, --7693360, -1085016, 265214, -4078608, -1167694, -8904004, 5883032, 2464238, 7453916, 9392020, -4750234, 504122, 3902515, 8390755, -821949, -1782411, -699543, -2405182, -8351564, 580357, -473520, 1892470, 4269198, -1668595, 839666, 117038, -3366181, -1629403, 2872260, 3011846, -2602213, -1985886, 691490, 1258425, 910533, 1131187, 1070521, 515396, 2154463, 2391223, -1414118, -343061, 922344, -271120, 773094, 1757715, 450972, 778463, -91268, -449361, --643708, 83752, -1557463, -545998, 1469953, 7139310, 3801583, 20806970, 10125385, 13468481, --4136054, -548145, -181999, -20591146, 1123134, 8853001, -4029216, -1614908, 752156, 12947716, --2150168, 7495255, -1490891, 7179038, 4000762, 8870718, 12538083, 1594507, 8389145, -2593087, -7268696, -987306, 13418552, 7102802, -170188, 7597261, 6196027, -2258079, 5919002, 3522410, -5119601, -4006131, -3150359, -10806675, -601295, 7655243, 1534914, 972273, -2451890, -4042101, --3162170, -3563212, 18873696, -12097312, 4861366, 5715528, 3307125, 1627793, -7153268, -9600326, --2388539, -1427540, -376883, -16634945, -8184060, -8548596, 478889, -387621, 5018133, -540092, -4466766, 5904507, 10728828, 1964411, -2671470, 3592740, -6634651, 1843078, -4846334, 1801739, -4198331, 2340757, 6864432, -4575751, -5134634, 24427090, 3420942, 4440460, 3167002, 8296803, --5788542, -3024731, 5295158, -597000, -64961, 969052, 1795296, 4795331, -2297808, -356482, -981937, 2764348, 708133, -2516314, 4715337, 180389, -1015760, 114354, -457414, -2474438, --2245731, -1081258, -2506114, 1074, -933619, 1135482, 3402688, -300648, -245350, -3650185, --689342, 1814087, -323196, 224949, 418222, 2885144, -1410897, -426276, 1009317, 1090922, --3107946, -2690260, 32094144, 3280281, 4908074, 3449396, -1850594, -13100724, 8880382, 9079024, --5037460, 3891240, 4285841, -7915625, -958315, 7453379, 4494147, -13829258, 3604015, -3852049, --6885370, -266825, 4136591, 985695, -15569, -355945, 6023692, -1945083, 3444027, -10785737, -4394826, -1192390, 4314832, 2324114, -1842004, 7524783, -10285910, -4567161, -10159208, 8839043, -4328254, 14477261, 7303055, -135828, 3225521, -11904039, -9127, 3360275, 3856344, 3507378, -874026, 1991791, -3044595, 3275986, 10545218, 14001057, 6175626, -6506339, -3462818, -1540283, --2714419, 5155572, 7190312, -5030481, 4278325, 7784092, 2478196, -10951093, -21386790, -10675678, -4358318, 9298604, -3992172, 2732136, -765041, -2054068, -32212, 9709310, 1835562, -8158291, -13287555, 5920613, -15329812, 640487, -1817845, -5012764, -1695975, -2403034, 12885, 5260261, -2260764, -4207458, -2183454, 3089155, 5741835, -2609193, 4369593, 1066763, -3559991, -980863, -579284, 86973, -661962, 253940, -1766842, -1347009, 1275068, 308164, -1573032, -1744831, -102542, -1139777, -2616709, 1578937, -914828, -1413581, 738734, 2682207, -2935610, -4679367, --41339, -718870, -6808060, -1216013, 1686312, -42413, -4116726, -526670, -1529008, 1280437, -954557, 2109366, 1677722, -678605, -748398, -1305133, -3361886, -19872814, 6162741, 9026948, --10209674, 6508486, 11719892, -28165858, 6300717, 927176, 6397354, -10670309, 16034187, -22277996, -78920, -1837709, -1531156, -2517925, -6138582, -8581882, -1095754, 7632157, 1077500, -38118, --3932580, 5297306, -600759, -2973728, 4454418, 9483288, -6191196, 6770479, -1012002, 4013110, -2402497, 6346351, 10379862, -2584497, 2926483, -13345537, -6297496, -2947958, -4697084, -12174622, -1548873, -4584341, -7499013, 11223286, -10475962, -3815005, -4800700, -6039261, 8094403, -9120363, -5243618, -3336116, 8310225, -4468914, 9075266, -11853036, -3041374, 1285806, 10934987, -18999862, --6821482, 492848, 255014, -3541738, 7737921, -9944460, -18856518, 3954591, -16528645, 8318278, --5753109, -131533, -17293686, -7043747, 19133006, 10509785, -13996762, -12076911, -9851581, 412317, -5949604, -2658048, -6152004, 12115566, 4599910, -2338610, -2473901, -4793184, -761283, 4647155, --4314832, 5009543, -420907, -3764539, 841277, -2918430, 2080912, 4205847, -2432562, 1768453, -3382287, 2101850, -215822, 4917201, -4672388, 4633196, -1196148, 4055523, -5463736, -3085934, -994285, 202937, 5982353, 1796907, 3655554, -2134599, -3193308, 1764158, -6287832, -790811, --1208496, 2523830, -1194538, -1457605, -1956895, -14485851, -6203007, 18226768, 779000, -15046881, -14167486, -6634114, 950798, -15688442, 2420751, 6213207, -13826573, -3382824, -12355547, -90194, -795643, -4169876, -3425237, 12069932, 1865090, -8178155, 2058900, -17520246, 10537702, 16695075, --5390721, 6972880, 11851425, -882616, -2410014, 1459752, 1447941, 6941204, 1194001, 1607928, -3652333, -9789304, -694711, -11253351, -11493869, -4713190, 4847408, 6839199, -348429, -13537737, -2682207, 3561065, 6678674, 14492830, -14835891, 21745420, -18009334, 806380, -3616363, -3111704, --8700530, -16712255, -22548578, -8738648, -2567317, 5761699, -1695438, 950798, 3337727, -149787, -15909633, 7533910, -16286516, -2528125, -314606, 10421738, -11250130, 769873, -22692460, 4273493, -17762374, -15841450, -6208375, 2266669, -154082, 4459250, 24883430, 394063, -3261491, 1316944, -12678207, -8572218, 3409130, 4652524, -1860258, -894427, -148713, -308164, 5653251, -1816771, --1276142, -4851166, 8223789, -1750199, 2433099, 854699, 1461900, 2079301, 5983427, -4123706, --1051730, 6355478, -4574140, -6436009, 5350456, 291521, 2618320, 3631395, 2040646, 6576132, --5076115, 3080029, 3626563, -2229088, 9264244, 3213173, 5669894, 2112587, -5568425, -1998234, --940598, -932008, -985158, 2724083, -9254044, -18939732, 22632868, 9592809, -11002632, 14606647, -14726906, 20782274, -7618735, -7235946, 15269146, -2277943, -2940979, 5260798, 6829535, 2662880, -3304977, -20753282, -2127083, 32749, 249108, 1117765, -2265059, 8763344, 17120276, 1705102, -1246077, -308164, 898185, 15681462, 4254702, -1118302, -3341485, 4009352, 3560528, -2469606, -1891396, -8961986, -1778653, 13647259, -13452911, -6584185, -11587822, 15253576, -13880261, 7009924, --5625334, 4493610, -2938831, 3627100, -11128797, 2582349, 17052630, -11143293, 989990, -29573534, --1211181, -10438381, 906775, -27597850, -1114544, -1341640, -8410083, -5913633, 22652194, -24172612, -4146791, -6518150, -8915278, 6532109, -8074002, -18873160, -13142600, 1861332, 1112397, 3930432, --9248138, -12694313, 7363722, 643708, 1534377, 8509404, -13991393, 10610180, -10144176, -4781909, --4291746, 2551748, 487479, 3057480, -1701344, -3561602, 1003949, -2007360, 3096135, 6626598, -3960497, 2466385, 1985886, 1826435, 1869921, -665183, 7286412, 1400696, -1249836, 5388574, -5613523, 2098629, -2925947, -261456, -4323959, 7183870, 2655901, 5787469, -2688113, 5939940, -5373004, 7762080, 3913252, -2129767, -3907883, 6535330, 1437740, 5661841, 1393180, 1566053, -1596117, 1727114, 19176492, 6420976, -2261837, 3851512, -9249212, -10238128, -7961796, 18200998, --16253767, -20737712, 10049150, -19313394, 7305740, 498753, 5428839, -8768176, -1830730, -10621991, --4179540, -8256538, 4082903, 9239548, 6762426, -15651398, 18126910, 1924682, 6471442, 1386201, -8835285, -2106145, 8492761, 1779190, -3495030, 5032628, 2128693, 6750615, 5021891, -11955041, -4889821, -3693135, 3488587, -2650532, -4170950, -3888556, -8022462, 7374459, 8369818, 8284992, --1424855, 15384573, 18891950, 7205345, 2621004, 8208220, 19568408, 9285719, 21328270, 13302587, -15937013, -17258252, -16917876, 3168612, -3315715, -4904316, 1476932, -8857833, 7240241, 4992363, -3475166, 15797427, -3653407, -10755135, -8609262, -8042863, 2002529, -4014184, -34492344, -15400142, --13354127, -5242545, -6882148, -3986804, -5140539, -10183367, 467078, -6267968, -5556614, 1931125, --5579163, -2152316, -8633421, 142808, 543850, -1753420, -12350715, 4756677, 44023, 216896, --9278740, 2448668, 3393024, 3227668, 1086090, 10476499, -6958921, -3059627, 2270964, 805843, --743566, 4089346, -4925791, -4606353, -868120, 7310571, -759136, 5209796, 6406481, -1764695, --8003135, -7583839, -856846, 7631083, 625992, -6155762, 813359, -1673964, -3918621, -3335579, --1256815, 40265, -6014565, -5513665, 5204427, 15183246, 10672994, -33934000, -24689082, -7968775, --109522, 10900627, -4420058, -1003949, -26631482, 3589519, -13852343, 9830643, -1751273, 13093745, --11207717, -3046743, -13339095, 2143189, 11223823, -5486284, 3402688, -7949985, 756988, -18326088, --4856535, -1074279, 1467268, 13240847, 17647484, 410706, -15903727, -11494406, -5040144, 1453846, --4098473, 4918275, -18311594, -5920076, -2394981, -4981089, -10235444, -2619930, -4651987, 12378633, -18357228, 12118250, 4613869, 7333657, 7757248, -8971113, 30573724, 18295486, -23917600, -20952462, -22481470, -17770964, -10063645, 3282966, 2566780, -17251810, 16640314, 915365, -51509544, 13649943, -32451700, -22568442, 22378928, 29700236, -9886478, -3249143, 16003048, -18796924, -12301860, 6069863, --10111964, -11811160, 13569412, -22769232, -6847789, 2757369, 547608, 1137093, -2158221, 8141648, --5904507, 3396246, 1234266, -6156836, 11984032, 5968394, -383863, -7784628, 9243843, -5949067, -7133404, -6322729, 8675834, 751619, 1798518, 8638253, -6810208, -7794292, 2305324, -7202124, --4345433, -483721, 752156, -4845260, -8462159, 3860102, -19864224, -162672, 9142912, -7486665, -5382668, -2401424, 2700998, -8473434, 193810, 4405026, -3901441, 2834142, 17825724, -8088497, --7478075, 17395154, -12688944, -2272038, 14743549, -10485089, -6685117, 11100343, 6804839, 7299834, --1808181, -10803990, -8680666, 10267119, -8159364, -710817, 3040300, -15282567, 9983651, 8198556, --6197638, -4968741, -11953968, 377420, -7385197, 10405095, -16781510, 1343251, 6473053, -826781, --7960185, -17348446, -3879966, -7502771, -1649804, -13399761, 18434536, -17868674, 3198677, -6438693, -4683125, -25332254, 26272852, 5082020, 2690260, -10383083, 6049999, 4378183, 1226213, 2496987, --4595615, -19945828, -3388192, -8563091, -12773233, -17110612, -6123550, -4213900, -17022030, -6418829, --694711, 11978127, 5564667, -15358266, -13437879, 8502962, -3441880, -19525458, -8371965, 5000416, -16325171, 16270947, 16496433, 26306138, -4894115, -17540110, -16801912, -889595, 11615739, 20544440, -9290551, 4570919, -20612084, 11888469, 4500052, 20061256, 13943074, 9209484, 6957847, 222801, -1921998, 11909944, -2613488, 1046361, 2234994, 3609920, 4186519, 3997004, 5819144, 14272176, -4589710, 1264868, 5007395, -97711, 4686346, 1540820, 1015760, 8963060, -10391673, -7275138, --2606508, 4189741, -5160403, 3728569, -2138894, 11230803, 614717, 2087891, -5522791, -6864432, -834297, 6660958, -5820755, -414464, 7640747, -5847598, -128312, 3757560, -10388989, 13245142, -7205345, -2027761, 3352222, -200253, 113280, -2824478, 7601555, -1976222, 12601971, 32409824, --28541668, -1304060, -11122355, -15807627, -8764955, 14567455, -7818451, -9408126, 8109435, 18887656, -12588012, -15023796, 9783936, -15744813, 11602854, 136902, -1341640, -7874823, -11009612, -9669045, -2294050, 1594507, -17639430, 10924249, 2238752, -2123325, -6486475, -8138426, 13123273, -17972290, --491237, 18505404, 22681722, -20543366, -1018981, -4489852, -12663711, -17294760, 18671296, 3668976, -11975979, -4112968, 1723356, -2101313, 11912629, -5043902, 912681, -14912663, 20921322, 16695075, --24896852, -31287226, -6256694, -153008, -9868761, 510027, -7274601, 1832340, -15371151, 16030965, --19838454, -18110266, -6327561, 2379949, 14082661, -7762080, 20298016, 1596654, -6958921, -7384660, --5063767, -13160317, 12434467, 8617852, -3131568, 7207492, 6255620, -10415833, -9708774, -8906688, -15737297, 3596498, -10970957, 961536, 4549981, 4789426, -16456167, 8103530, 6783364, 2764885, --32749, -5024575, 2347737, -5461051, -14651207, 2726231, -1845762, -3018288, -1617055, 1126355, --4373888, -5974837, -208306, -2375654, 7476465, -4263829, -1966558, 3943854, -1897839, -7283728, -5902359, -7261716, -2200634, -12410308, 6522982, 977642, -1672890, 1837172, -5377836, 10452340, --644245, 1531156, 12181064, 8410620, -3339874, -4253092, 5868536, 2983929, -4150549, 2053531, --3813394, -3813931, -732829, 2443837, -2261300, -834834, -44958108, 66379256, -45756436, -11115912, -11451993, 36049272, 28450938, -10239202, -12060805, 2322504, 1173600, 18792092, 6289443, -23874650, -6811282, -4838818, -9018358, 2792803, 9458592, 264677, -18697066, -15662672, 8015483, 7335268, -10771241, -5773510, 13448079, 3631932, 15855946, -1318018, -6065031, 12471511, -1953673, -12558484, -1763084, 15391015, -1136019, -16779364, 8019778, 20331838, -18895708, 7624641, -20262046, 8182450, --25473988, -15961172, 27009438, 26002806, 11554536, 33753076, -6911676, 40223980, 14325863, 15724412, -20919712, -35763120, 29955250, 10746545, 11822971, 14401025, 2868501, -17287780, 2381023, 33985540, -37830608, -121870, -43876848, 21655762, 687195, 9400610, -1989107, 1352378, -9938017, -32384590, -6119255, -5119601, 6885370, -5783174, 15715285, -18076444, -20195474, -13566728, 2386391, -5680631, --9346386, 10848014, 3687230, -13827110, -15415174, -11531450, -9262634, -1301375, -2798171, 8070244, --659278, -11830487, 9128416, 2150168, -3413962, 780073, 4293357, -5786932, -3382287, 6241661, --11010686, -4276177, -7645579, 6447283, 7425462, -8680129, 2312840, -23663122, 165893, 1394791, -1021129, -4448513, -4752382, -10563472, -8354785, 5684389, 3288871, 5458367, 8143795, -7747048, -463856, 3445638, 1960653, -7590281, -107374, 2158221, -412854, -6195491, -1049583, -1458141, -43478492, -1488206, -51951924, -26083336, -30622580, -11529840, 176094, 17238924, -44283260, -9762998, -6870337, -20462834, -23801636, -21463026, -23757074, -3673808, 26074210, 13571023, -10429254, 12708271, -5089000, -11830487, 13431973, -14979772, -3404299, 6457484, 8876624, -29897268, 15049565, -14632417, -8562017, -5762236, -24175834, 6852084, 7461432, 3877819, 3933116, -9878425, -34291556, 1533303, -7043747, 7605850, 314069, 4415764, -14250165, -27917, -1240709, 31250718, -4815195, -51019916, --23142894, -5416491, -42530376, 9819906, -13013751, -10705743, -20513838, -9030169, -30625264, -29848948, --36822364, -3520263, 38703560, 5462662, -24538222, 11430519, 314069, -2577517, -13812615, -19236084, -8110509, 16089484, 12120398, 6737193, -7363185, -31237298, -22405234, -31448288, 4626217, 3589519, --1122597, 11360188, -16655346, -19997904, -2852932, -7352447, -20572356, 4575214, 11827803, 1717450, -4325032, 19841676, -3564823, -4037806, -3383897, 1353452, -7092065, -3886946, 8834211, 13552769, -14770929, 9987410, -4080219, 700617, 2314987, -6136972, 13686450, -5573794, 19969988, -6993281, -9386114, -9498857, -2633352, 20282446, 6743099, 2796561, -70330, -7915625, 8012262, 1753957, --9828496, 4480188, -8399882, -10835666, 3183108, 3261491, -6653441, -6504191, 6966974, 386547, -9776956, 2112050, 6685654, -3590056, 2992519, 2758980, 1052267, 28945396, -3593814, 23230404, -29528438, -24960202, -31704912, -33000382, 8519068, 11777337, -45669460, -26124138, 713501, 1443646, -13498008, -52762600, 5452461, 12355547, 36477156, -42252276, 4806606, 7064148, -5497558, 23477902, --13675176, 41055056, -2478196, 3707094, 12119324, 15998216, -15714748, -32990180, 19033148, 23435490, -5139465, 29625074, 5483063, -3685619, -11307575, -24930674, 38428684, -17249126, 36402532, 14542222, --2981244, 10904922, -15778099, 19877646, 19324668, -13632763, 14297409, 7490423, -38726108, 28065464, -28230284, -3553012, -19893214, 3759707, -1240172, 1294933, -7213398, 52978960, -1282048, -30678952, --17511118, 6046777, -44637596, -58034136, 7648263, 72688024, 15753403, -5093831, -46707232, -11740293, --8016020, 49543520, -34178812, -21665962, -81878720, -11784317, -15246597, -19189914, -15614890, 29994978, -31680752, -31862214, -12701292, 10537165, 4115116, -5814312, 12823162, -5594732, -10388452, -10019622, -11004780, 4529580, 3359201, -4054449, 10780905, -11458436, -4211216, 9788230, 4202089, -652835, --760209, -8557722, 3829500, -5683316, 20831128, -5798206, -11809013, -9440875, -18402862, -6157910, -13642964, 15742666, 42696808, 16344498, -5192616, -32828046, -45671072, -21268678, 370978, 18526342, -14706505, -12135430, -18372796, -9210557, -7712688, 11208791, 19205484, 4272956, 787053, -2496987, --7282654, -5946382, -5589900, -1055488, -2608656, -2786897, 2295660, -4957466, 1655710, 656056, -1206886, -3776350, -786516, -2832531, -2594697, -3693135, 2165737, -2356863, 3976066, -72847480, -21467320, 34605624, -46181100, -4420595, 26592290, -11473468, -20524574, 18532784, -19784230, -11276437, -2001455, -15416785, 25052008, -8472897, -10763188, -4467840, 13462038, 44313860, -6455336, -20653960, --22404696, 8089034, 21743808, 12562779, -19740744, -3332895, 24686936, 511101, -17842368, 5937793, --15870441, 40999220, -18116172, -44704168, 15876883, -7628399, 21758304, -29985314, -28885802, 29368450, --1887101, -38337416, -19827716, -36632312, 47774532, 22690312, 13242458, -49919868, 9345849, 20463372, --34442416, 1966558, -24604258, -19112068, 20002200, -16998944, 22881438, -14051522, -29857538, -6919729, --7027640, -4553739, 10925860, 3582540, -18469970, 58872728, -6772090, 26100516, 27261768, 16291348, --7556995, 6190122, -12910135, 33123324, 8623757, -8361228, 4417374, 14079440, 23446764, -5710159, --49555868, -3381750, 16030965, -4955319, 26846230, -11165304, 9546639, -3992172, 1118302, 10909754, -3062312, 6657736, 13898514, 8023536, 16066399, -3716221, 5502390, 8317204, 1503239, -16024523, -19671488, -7948374, 529355, 3026341, -9214852, 5005248, 1402844, -2511482, 13804025, -5997385, -1394791, 19404126, 205622, 10832981, -9054328, -6047314, 10851772, -2401424, -6793028, -10078141, -932008, 1428614, 2826625, -3336653, 2882460, 6082748, -1782411, 4168803, 5487895, -2671470, -6606197, 1219771, -6497212, 4431870, 2718178, 1354525, -351114, 52712672, 10596221, 22933514, --2121177, 5672041, 8130373, -18933826, 8221641, 18505404, -15569, -21816286, -11954505, -16144782, --6878390, -21869436, -21465710, 2815888, -17151416, 25031606, 7857643, -5648419, -18215494, -8495982, --6127308, 13546864, -4337917, -20687784, -17398912, 4495220, 4272956, 12074764, 4329327, -4466229, -5344013, -18032958, -55507084, 2434173, 66901632, -1849520, -48987324, -7813620, 31736050, 9007083, -5010616, -793495, -21393768, -26300770, -15995532, 6115497, -1823751, -24325084, 8820252, -49027052, --8988830, 45591616, 13193603, 58618252, -7893613, -23008140, -7167227, -5069135, 15479599, 3490198, --629750, -31842888, -16249472, -15190762, -2345052, 37121940, -5171141, -8990440, 12001212, 15074261, -2214593, -19654308, -30964030, -2165201, 12284680, -1312113, -15462419, -3859565, 8418136, -6426345, --5932424, -10030359, 18400176, 19659676, -10042170, -5128728, -9241696, 8013872, 11392401, -5333813, -1494112, -2028298, -1792075, -3641596, -14894947, 1641214, 8225399, -8904541, 2024003, -2132988, -485868, -7977365, -2867965, -3354370, -5417565, -6056978, -6404870, -1766842, 26103738, -13047574, --23085, -5141613, 1265942, 14535780, -9999221, -1386201, -2991445, 4575214, -860067, 4159139, --7723425, -23335632, -77349680, -119533232, 28228672, 106943072, 33788508, 261635984, 246497840, 109606488, -254168112, 107329088, -46032924, -778463, -76384920, -209089744, -114103856, -109488384, -214237264, -156017904, --89550608, -134979552, -90709176, 19754166, -7822746, -43185360, 51223928, 47837344, -150324, 51286740, -139244992, 58450748, 26275000, 133257264, 119276072, 40073120, 142080736, 173792096, -214212, 102969696, -175247008, 66381404, 70100848, 178624464, 106760536, -14097156, 139450064, 97872640, -37932616, 54760832, -110939544, -49594524, -87913152, -19827180, -185880272, -312124928, -302142912, -335987232, -537495296, -465254464, --383784864, -497411424, -426440864, -274030720, -324816576, -248250720, -68639480, -22129282, 105247640, 195800576, -322770016, 432374880, 471657728, 550104256, 597494912, 558134784, 528687936, 560846464, 426725408, 338336576, -401393696, 218952608, 35086124, 50626928, -80950472, -296396224, -248829472, -184104848, -265709760, -271743104, --169476192, -192939056, -243306672, -178327584, -162139840, -228902960, -205345072, -133903120, -170331424, -182976352, --59811716, -57549340, -107942192, -11280195, 41246720, -30848066, 5945846, 40933724, -58194660, -75332656, --71488656, -156803888, -173153216, -121218472, -91039888, -66340064, 22643068, 106434656, 144649136, 204889264, -262537392, 274130592, 290806336, 321578176, 305036096, 277293280, 288833856, 261546864, 194545920, 133432824, -35226248, -51449412, -132254928, -192621232, -215822640, -227415840, -202896944, -155451504, -136138656, -114747032, --93809064, -80983216, -71295384, -53454628, -41395968, -38137700, -37186900, -25935160, -19567872, -15622407, --5378910, 8182450, 20080582, 35090956, 36464808, 37493992, 43423192, 42872364, 35161288, 37822556, -31475130, 16682190, 1272384, -12828530, -27831924, -33510408, -40012452, -43001748, -40049496, -37157372, --36057324, -25798258, -20160040, -12216498, 435939, 10737418, 15800111, 24293408, 29350196, 33176474, -37527812, 39187820, 40920836, 42649024, 42935716, 42518564, 39662412, 39084204, 36958192, 34553548, -31209380, 29785598, 24390582, 18534394, 11311870, 5504538, -2037425, -8892193, -15265924, -22412750, --31423054, -37441916, -43879532, -47260748, -50237696, -51478940, -51516524, -49303004, -47184512, -42711304, --38785164, -32626182, -25567940, -15730855, -8205535, 2355253, 10057740, 17258252, 23497766, 29421600, -30994632, 33355252, 32648730, 30091078, 25649008, 22355304, 16324097, 11494406, 7216619, 4673462, -1080721, 195421, -782221, -639950, -1612760, -823023, -1232119, -561567, -988916, 27917, --376347, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +6466610, -3228742, 1795296, -682900, 381178, 286689, -2597382, -2976949, 1945083, -557809, +-2367601, -3052648, -1862405, 2657511, -272194, 3572339, 760746, -4572530, -4698694, -3358128, +1378685, 1145146, 2444373, -382252, 2796561, -2152316, -389768, -4944581, -752693, -937377, +1021665, 1834488, 1864016, 3619584, -1807644, -2455111, 1972464, 1091995, -2371896, -2442226, +116501, 1673427, 813896, 4020626, -1534914, -1300301, 4581120, 1379758, 8586176, 3628711, +-2408940, -103079, -5284421, 78383, -6023692, -418222, -2253784, 4140885, 438624, 2212982, +3047279, 1628330, 2921652, 1922535, 413391, -5075578, -563714, -2554969, 3482145, 5063230, +-3569655, -2561948, -1536525, -2081985, -2694555, -4355634, -986232, 1275605, -2556579, -2135136, +-902480, -3585761, 410706, -740882, -2407329, 743566, 125628, -39192, -1187022, 186831, +221191, 1298691, -370978, 828929, -442382, 592169, -175020, -826781, 215822, 1013612, +172872, -960462, -963146, -126165, 1770600, 383326, -346282, 257698, -524523, -600759, +-10133975, -10829223, -862752, -3104188, 414464, -2347737, -640487, 6029597, -1079647, 3242700, +-1491427, -2894808, -4006131, 737661, -830002, -4779762, 5510980, 1658394, 376883, 2940979, +2801929, 4547834, 3200288, -299574, -3384434, 3160022, 733903, -4558034, -2016487, -2054605, +-1367947, 4078072, -1398012, -6951405, -2356863, -793495, 1450625, -2159832, -4525822, 149250, +-442919, 5257577, 777389, -40802, 1918777, -119185, 7090991, -1222455, 651761, -1566589, +-2814814, 3758, 3045132, 1377611, 830539, 2878702, -2641405, -4399657, -3148211, -633508, +578747, -1027034, 125628, -3302830, -731218, 1730335, -1053878, 3444564, 1797981, -195421, +639413, -3231426, -2750927, 5344550, 1214939, 2275796, 1551557, -952409, -313533, -4063039, +287226, -2322504, 998043, -794032, 1035087, 1098975, 3144990, -330176, -1097364, 181999, +674847, 417149, 114890, 106837, -945430, -750546, 383863, -347892, -813896, 1271847, +-643708, 649614, 974958, -927176, -271120, 727997, -274878, 1309965, -789737, 645856, +-628139, -468688, -1643899, 1539746, 6983080, -362925, 3574487, 2136746, 4774930, 5900748, +-1351841, 507343, 3607773, 3600793, 2382096, 6752226, 1357210, -2172180, 287763, 5913633, +2068564, 2807835, 5101885, 6892349, 4528506, -1527935, -4701916, 3339874, 2258616, -2689723, +-4538707, 276489, -2647847, 1240172, 1745367, -1627793, -2259690, 2313914, 1813013, 4084514, +-2702608, -5495948, -2762201, -2361695, -3673271, -1248225, -4196720, 2551748, -5748277, 2505577, +506269, 1362042, -2545305, 5532992, 4214974, -3860639, 4854387, 1848447, -694711, 1623498, +-3482145, -1088774, 3330210, 1207423, 1410897, 898722, 3975529, 1633698, 4910222, -2362769, +-264677, -281857, 1926830, 2863670, -1093606, 1918240, -2528125, 1334661, 1751273, 1582159, +5395016, 239981, 4036733, 4522601, 2556043, -4036196, -740882, -590021, -1022739, 411780, +2316061, -892279, 119185, -118112, 309775, 877247, -614180, 1023813, 1618129, -1037772, +-529355, 1547262, 108985, 75699, -16643, -784368, 432718, -346282, 184684, 1220308, +1947768, 152471, -189515, 1023813, 796716, 374736, 506806, 441845, 533650, 10201, +-187368, 920734, 1097364, -859530, 615254, -251792, 892279, 1095754, 162135, 274341, +1155346, 66035, 23085, -146566, 545461, 19514184, 16643, 17294760, 1235877, 11005317, +-2477123, -1729261, 2830384, -7968238, 8720931, -4900558, 5803575, 4524211, -3387119, 2726767, +-380105, 466004, -1640678, 2602213, 3361886, 4479114, 7020124, 1880122, 2144799, -147103, +8281234, -9541807, 95563, -610959, 2181844, 4232691, -5227512, 2073396, 2158221, 1306207, +3229816, 1945620, -4066260, 1991791, 7397545, -1293859, 2167348, -1155346, -1311576, -245887, +-5551245, 8457327, -268972, 921807, 6101538, -769873, 342524, 7846369, -11497091, 3219078, +-352187, 3497177, 9052717, 2839510, 2083059, 3279745, -1135482, -2478733, -1878511, 2335389, +700617, 5021354, -1924145, 4140349, 1753957, -1303523, 695248, -3167539, -2243047, 505196, +-1088774, -4405563, -2983929, -4510790, 2574833, 4112968, -1227287, 1311039, -1086627, -2982855, +-264141, 1734630, 1552631, -5404143, -360240, 562641, -972810, 360240, -1257352, 161061, +-1341640, -2580739, -183610, -1693291, -1533840, -2127620, -37044, -2080912, -790811, -2018635, +-1700807, -24159, -877247, -1056562, -249108, 317291, 867583, -1066226, -112743, 385473, +-7794292, -9462887, -3825742, -1376537, -3612604, 7668127, 3205119, -6025839, 6728603, -896038, +-4990215, 1529545, 2904472, -2698313, -4563403, -4014721, -8633958, -4281009, 3663607, -5389647, +-8765491, 2514167, 3485366, 756988, -3251827, 6591164, 765578, 6098317, -420370, -1335735, +3411278, 5781026, -8182450, -3824132, 2180233, -1771137, 1957431, -5270999, -425202, 1490354, +1893007, -4490925, -8305930, -2275259, 2378875, -1346472, -1076426, 555661, 2641405, -765041, +1452773, -2733747, 4766340, -6243272, -4737886, -1593433, -4641249, -1329829, -1274532, 1891396, +-3410741, 2610266, 5182952, -397821, 1198833, 1457605, 2475512, 5140539, -1956358, -922881, +-985695, -2056753, 5275294, -2099702, -9240622, -5834713, -3913789, 8914205, 137976, 5137318, +2317672, 824097, 1359894, -558883, -209917, 4320200, -1428077, -917512, 1372779, -692564, +679142, -1855963, -1165010, 1032403, -263067, 1130650, -279173, 690416, 1597728, 1203665, +1494649, 65498, 1041530, -175020, 1533840, 1738388, 2735357, 1767379, 2172717, 571768, +1452773, 1302449, 904091, 1353452, 1804960, -754841, 148713, -292058, -755914, 803696, +1073205, -2150705, -8431558, -19400368, -1874753, 1404991, 147640, -6252936, -2855080, -7105487, +-1908039, -8392366, -9736691, -7508140, -1817308, -4958003, -10966662, -6773701, 2191507, 3419868, +-3078955, 6604049, 3561602, -2383170, 8019778, 1774358, 598611, 1341104, -11142219, -368293, +1771674, 4206384, -3553549, -3047279, 6521908, 12868796, -9678172, 3487514, -2902324, -464930, +-8541079, -716186, -176094, -4288525, -5556614, -3950833, -4740570, -2455648, 2685965, 9446781, +-4487704, 3555696, 6280853, 5784247, -2034741, 671089, -2153389, -1813013, -8779450, -4285304, +4830765, -3119220, 974421, -2978560, 2386391, 1328756, -1056025, -319438, -4152697, -3335579, +661425, -1200980, 1682554, -10275709, -10978473, -1167157, -1694902, -4670240, -130997, 3449933, +-5453535, -4116189, -4667556, -7915625, 5485747, -578210, -1296543, 2142652, -421444, 1920387, +3578245, 1272384, 1937030, 1162862, 2596308, -823560, 370441, 426276, 501437, 883153, +-825707, -689342, 32212, 819802, 928787, -687732, 738734, -993748, -1983201, 990527, +608812, -758599, 2304787, 1076963, 35970, 912681, -1600949, -1619203, -547071, -872952, +-794569, -2159295, -448824, -1709397, -12221329, -2243047, -14688251, -3126736, -10445360, -1095217, +1808181, 2760053, 11057393, -6847789, 2369211, 3156264, -6205691, -2606508, 8870718, 1089848, +-2763275, 1265405, -7548405, 6862821, -9634685, -3004867, 4104378, 2770254, -1121523, 1756105, +-2009508, 3245385, -4187593, -7004555, 354335, 3585761, 2694018, -5575942, 1450625, 6547678, +-6729677, -8230231, 6533182, -5571110, 4219269, -3973382, 2295660, -38118, -6066642, -7591892, +-4888210, 2233920, -441308, 3014530, -4166655, -3805341, -9990631, 5268315, -7198902, -3101503, +3704946, 8876624, -1268089, -1687385, -13036836, -10038949, -3521873, -3496640, 4719096, -1247688, +-7693360, -1085016, 265214, -4078608, -1167694, -8904004, 5883032, 2464238, 7453916, 9392020, +4750234, 504122, 3902515, 8390755, -821949, -1782411, -699543, -2405182, -8351564, 580357, +473520, 1892470, 4269198, -1668595, 839666, 117038, -3366181, -1629403, 2872260, 3011846, +2602213, -1985886, 691490, 1258425, 910533, 1131187, 1070521, 515396, 2154463, 2391223, +1414118, -343061, 922344, -271120, 773094, 1757715, 450972, 778463, -91268, -449361, +-643708, 83752, -1557463, -545998, 1469953, 7139310, 3801583, 20806970, 10125385, 13468481, +-4136054, -548145, -181999, -20591146, 1123134, 8853001, -4029216, -1614908, 752156, 12947716, +-2150168, 7495255, -1490891, 7179038, 4000762, 8870718, 12538083, 1594507, 8389145, -2593087, +7268696, -987306, 13418552, 7102802, -170188, 7597261, 6196027, -2258079, 5919002, 3522410, +5119601, -4006131, -3150359, -10806675, -601295, 7655243, 1534914, 972273, -2451890, -4042101, +-3162170, -3563212, 18873696, -12097312, 4861366, 5715528, 3307125, 1627793, -7153268, -9600326, +-2388539, -1427540, -376883, -16634945, -8184060, -8548596, 478889, -387621, 5018133, -540092, +4466766, 5904507, 10728828, 1964411, -2671470, 3592740, -6634651, 1843078, -4846334, 1801739, +4198331, 2340757, 6864432, -4575751, -5134634, 24427090, 3420942, 4440460, 3167002, 8296803, +-5788542, -3024731, 5295158, -597000, -64961, 969052, 1795296, 4795331, -2297808, -356482, +981937, 2764348, 708133, -2516314, 4715337, 180389, -1015760, 114354, -457414, -2474438, +-2245731, -1081258, -2506114, 1074, -933619, 1135482, 3402688, -300648, -245350, -3650185, +-689342, 1814087, -323196, 224949, 418222, 2885144, -1410897, -426276, 1009317, 1090922, +-3107946, -2690260, 32094144, 3280281, 4908074, 3449396, -1850594, -13100724, 8880382, 9079024, +-5037460, 3891240, 4285841, -7915625, -958315, 7453379, 4494147, -13829258, 3604015, -3852049, +-6885370, -266825, 4136591, 985695, -15569, -355945, 6023692, -1945083, 3444027, -10785737, +4394826, -1192390, 4314832, 2324114, -1842004, 7524783, -10285910, -4567161, -10159208, 8839043, +4328254, 14477261, 7303055, -135828, 3225521, -11904039, -9127, 3360275, 3856344, 3507378, +874026, 1991791, -3044595, 3275986, 10545218, 14001057, 6175626, -6506339, -3462818, -1540283, +-2714419, 5155572, 7190312, -5030481, 4278325, 7784092, 2478196, -10951093, -21386790, -10675678, +4358318, 9298604, -3992172, 2732136, -765041, -2054068, -32212, 9709310, 1835562, -8158291, +13287555, 5920613, -15329812, 640487, -1817845, -5012764, -1695975, -2403034, 12885, 5260261, +2260764, -4207458, -2183454, 3089155, 5741835, -2609193, 4369593, 1066763, -3559991, -980863, +579284, 86973, -661962, 253940, -1766842, -1347009, 1275068, 308164, -1573032, -1744831, +102542, -1139777, -2616709, 1578937, -914828, -1413581, 738734, 2682207, -2935610, -4679367, +-41339, -718870, -6808060, -1216013, 1686312, -42413, -4116726, -526670, -1529008, 1280437, +954557, 2109366, 1677722, -678605, -748398, -1305133, -3361886, -19872814, 6162741, 9026948, +-10209674, 6508486, 11719892, -28165858, 6300717, 927176, 6397354, -10670309, 16034187, -22277996, +78920, -1837709, -1531156, -2517925, -6138582, -8581882, -1095754, 7632157, 1077500, -38118, +-3932580, 5297306, -600759, -2973728, 4454418, 9483288, -6191196, 6770479, -1012002, 4013110, +2402497, 6346351, 10379862, -2584497, 2926483, -13345537, -6297496, -2947958, -4697084, -12174622, +1548873, -4584341, -7499013, 11223286, -10475962, -3815005, -4800700, -6039261, 8094403, -9120363, +5243618, -3336116, 8310225, -4468914, 9075266, -11853036, -3041374, 1285806, 10934987, -18999862, +-6821482, 492848, 255014, -3541738, 7737921, -9944460, -18856518, 3954591, -16528645, 8318278, +-5753109, -131533, -17293686, -7043747, 19133006, 10509785, -13996762, -12076911, -9851581, 412317, +5949604, -2658048, -6152004, 12115566, 4599910, -2338610, -2473901, -4793184, -761283, 4647155, +-4314832, 5009543, -420907, -3764539, 841277, -2918430, 2080912, 4205847, -2432562, 1768453, +3382287, 2101850, -215822, 4917201, -4672388, 4633196, -1196148, 4055523, -5463736, -3085934, +994285, 202937, 5982353, 1796907, 3655554, -2134599, -3193308, 1764158, -6287832, -790811, +-1208496, 2523830, -1194538, -1457605, -1956895, -14485851, -6203007, 18226768, 779000, -15046881, +14167486, -6634114, 950798, -15688442, 2420751, 6213207, -13826573, -3382824, -12355547, -90194, +795643, -4169876, -3425237, 12069932, 1865090, -8178155, 2058900, -17520246, 10537702, 16695075, +-5390721, 6972880, 11851425, -882616, -2410014, 1459752, 1447941, 6941204, 1194001, 1607928, +3652333, -9789304, -694711, -11253351, -11493869, -4713190, 4847408, 6839199, -348429, -13537737, +2682207, 3561065, 6678674, 14492830, -14835891, 21745420, -18009334, 806380, -3616363, -3111704, +-8700530, -16712255, -22548578, -8738648, -2567317, 5761699, -1695438, 950798, 3337727, -149787, +15909633, 7533910, -16286516, -2528125, -314606, 10421738, -11250130, 769873, -22692460, 4273493, +17762374, -15841450, -6208375, 2266669, -154082, 4459250, 24883430, 394063, -3261491, 1316944, +12678207, -8572218, 3409130, 4652524, -1860258, -894427, -148713, -308164, 5653251, -1816771, +-1276142, -4851166, 8223789, -1750199, 2433099, 854699, 1461900, 2079301, 5983427, -4123706, +-1051730, 6355478, -4574140, -6436009, 5350456, 291521, 2618320, 3631395, 2040646, 6576132, +-5076115, 3080029, 3626563, -2229088, 9264244, 3213173, 5669894, 2112587, -5568425, -1998234, +-940598, -932008, -985158, 2724083, -9254044, -18939732, 22632868, 9592809, -11002632, 14606647, +14726906, 20782274, -7618735, -7235946, 15269146, -2277943, -2940979, 5260798, 6829535, 2662880, +3304977, -20753282, -2127083, 32749, 249108, 1117765, -2265059, 8763344, 17120276, 1705102, +1246077, -308164, 898185, 15681462, 4254702, -1118302, -3341485, 4009352, 3560528, -2469606, +1891396, -8961986, -1778653, 13647259, -13452911, -6584185, -11587822, 15253576, -13880261, 7009924, +-5625334, 4493610, -2938831, 3627100, -11128797, 2582349, 17052630, -11143293, 989990, -29573534, +-1211181, -10438381, 906775, -27597850, -1114544, -1341640, -8410083, -5913633, 22652194, -24172612, +4146791, -6518150, -8915278, 6532109, -8074002, -18873160, -13142600, 1861332, 1112397, 3930432, +-9248138, -12694313, 7363722, 643708, 1534377, 8509404, -13991393, 10610180, -10144176, -4781909, +-4291746, 2551748, 487479, 3057480, -1701344, -3561602, 1003949, -2007360, 3096135, 6626598, +3960497, 2466385, 1985886, 1826435, 1869921, -665183, 7286412, 1400696, -1249836, 5388574, +5613523, 2098629, -2925947, -261456, -4323959, 7183870, 2655901, 5787469, -2688113, 5939940, +5373004, 7762080, 3913252, -2129767, -3907883, 6535330, 1437740, 5661841, 1393180, 1566053, +1596117, 1727114, 19176492, 6420976, -2261837, 3851512, -9249212, -10238128, -7961796, 18200998, +-16253767, -20737712, 10049150, -19313394, 7305740, 498753, 5428839, -8768176, -1830730, -10621991, +-4179540, -8256538, 4082903, 9239548, 6762426, -15651398, 18126910, 1924682, 6471442, 1386201, +8835285, -2106145, 8492761, 1779190, -3495030, 5032628, 2128693, 6750615, 5021891, -11955041, +4889821, -3693135, 3488587, -2650532, -4170950, -3888556, -8022462, 7374459, 8369818, 8284992, +-1424855, 15384573, 18891950, 7205345, 2621004, 8208220, 19568408, 9285719, 21328270, 13302587, +15937013, -17258252, -16917876, 3168612, -3315715, -4904316, 1476932, -8857833, 7240241, 4992363, +3475166, 15797427, -3653407, -10755135, -8609262, -8042863, 2002529, -4014184, -34492344, -15400142, +-13354127, -5242545, -6882148, -3986804, -5140539, -10183367, 467078, -6267968, -5556614, 1931125, +-5579163, -2152316, -8633421, 142808, 543850, -1753420, -12350715, 4756677, 44023, 216896, +-9278740, 2448668, 3393024, 3227668, 1086090, 10476499, -6958921, -3059627, 2270964, 805843, +-743566, 4089346, -4925791, -4606353, -868120, 7310571, -759136, 5209796, 6406481, -1764695, +-8003135, -7583839, -856846, 7631083, 625992, -6155762, 813359, -1673964, -3918621, -3335579, +-1256815, 40265, -6014565, -5513665, 5204427, 15183246, 10672994, -33934000, -24689082, -7968775, +-109522, 10900627, -4420058, -1003949, -26631482, 3589519, -13852343, 9830643, -1751273, 13093745, +-11207717, -3046743, -13339095, 2143189, 11223823, -5486284, 3402688, -7949985, 756988, -18326088, +-4856535, -1074279, 1467268, 13240847, 17647484, 410706, -15903727, -11494406, -5040144, 1453846, +-4098473, 4918275, -18311594, -5920076, -2394981, -4981089, -10235444, -2619930, -4651987, 12378633, +18357228, 12118250, 4613869, 7333657, 7757248, -8971113, 30573724, 18295486, -23917600, -20952462, +22481470, -17770964, -10063645, 3282966, 2566780, -17251810, 16640314, 915365, -51509544, 13649943, +32451700, -22568442, 22378928, 29700236, -9886478, -3249143, 16003048, -18796924, -12301860, 6069863, +-10111964, -11811160, 13569412, -22769232, -6847789, 2757369, 547608, 1137093, -2158221, 8141648, +-5904507, 3396246, 1234266, -6156836, 11984032, 5968394, -383863, -7784628, 9243843, -5949067, +7133404, -6322729, 8675834, 751619, 1798518, 8638253, -6810208, -7794292, 2305324, -7202124, +-4345433, -483721, 752156, -4845260, -8462159, 3860102, -19864224, -162672, 9142912, -7486665, +5382668, -2401424, 2700998, -8473434, 193810, 4405026, -3901441, 2834142, 17825724, -8088497, +-7478075, 17395154, -12688944, -2272038, 14743549, -10485089, -6685117, 11100343, 6804839, 7299834, +-1808181, -10803990, -8680666, 10267119, -8159364, -710817, 3040300, -15282567, 9983651, 8198556, +-6197638, -4968741, -11953968, 377420, -7385197, 10405095, -16781510, 1343251, 6473053, -826781, +-7960185, -17348446, -3879966, -7502771, -1649804, -13399761, 18434536, -17868674, 3198677, -6438693, +4683125, -25332254, 26272852, 5082020, 2690260, -10383083, 6049999, 4378183, 1226213, 2496987, +-4595615, -19945828, -3388192, -8563091, -12773233, -17110612, -6123550, -4213900, -17022030, -6418829, +-694711, 11978127, 5564667, -15358266, -13437879, 8502962, -3441880, -19525458, -8371965, 5000416, +16325171, 16270947, 16496433, 26306138, -4894115, -17540110, -16801912, -889595, 11615739, 20544440, +9290551, 4570919, -20612084, 11888469, 4500052, 20061256, 13943074, 9209484, 6957847, 222801, +1921998, 11909944, -2613488, 1046361, 2234994, 3609920, 4186519, 3997004, 5819144, 14272176, +4589710, 1264868, 5007395, -97711, 4686346, 1540820, 1015760, 8963060, -10391673, -7275138, +-2606508, 4189741, -5160403, 3728569, -2138894, 11230803, 614717, 2087891, -5522791, -6864432, +834297, 6660958, -5820755, -414464, 7640747, -5847598, -128312, 3757560, -10388989, 13245142, +7205345, -2027761, 3352222, -200253, 113280, -2824478, 7601555, -1976222, 12601971, 32409824, +-28541668, -1304060, -11122355, -15807627, -8764955, 14567455, -7818451, -9408126, 8109435, 18887656, +12588012, -15023796, 9783936, -15744813, 11602854, 136902, -1341640, -7874823, -11009612, -9669045, +2294050, 1594507, -17639430, 10924249, 2238752, -2123325, -6486475, -8138426, 13123273, -17972290, +-491237, 18505404, 22681722, -20543366, -1018981, -4489852, -12663711, -17294760, 18671296, 3668976, +11975979, -4112968, 1723356, -2101313, 11912629, -5043902, 912681, -14912663, 20921322, 16695075, +-24896852, -31287226, -6256694, -153008, -9868761, 510027, -7274601, 1832340, -15371151, 16030965, +-19838454, -18110266, -6327561, 2379949, 14082661, -7762080, 20298016, 1596654, -6958921, -7384660, +-5063767, -13160317, 12434467, 8617852, -3131568, 7207492, 6255620, -10415833, -9708774, -8906688, +15737297, 3596498, -10970957, 961536, 4549981, 4789426, -16456167, 8103530, 6783364, 2764885, +-32749, -5024575, 2347737, -5461051, -14651207, 2726231, -1845762, -3018288, -1617055, 1126355, +-4373888, -5974837, -208306, -2375654, 7476465, -4263829, -1966558, 3943854, -1897839, -7283728, +5902359, -7261716, -2200634, -12410308, 6522982, 977642, -1672890, 1837172, -5377836, 10452340, +-644245, 1531156, 12181064, 8410620, -3339874, -4253092, 5868536, 2983929, -4150549, 2053531, +-3813394, -3813931, -732829, 2443837, -2261300, -834834, -44958108, 66379256, -45756436, -11115912, +11451993, 36049272, 28450938, -10239202, -12060805, 2322504, 1173600, 18792092, 6289443, -23874650, +6811282, -4838818, -9018358, 2792803, 9458592, 264677, -18697066, -15662672, 8015483, 7335268, +10771241, -5773510, 13448079, 3631932, 15855946, -1318018, -6065031, 12471511, -1953673, -12558484, +1763084, 15391015, -1136019, -16779364, 8019778, 20331838, -18895708, 7624641, -20262046, 8182450, +-25473988, -15961172, 27009438, 26002806, 11554536, 33753076, -6911676, 40223980, 14325863, 15724412, +20919712, -35763120, 29955250, 10746545, 11822971, 14401025, 2868501, -17287780, 2381023, 33985540, +37830608, -121870, -43876848, 21655762, 687195, 9400610, -1989107, 1352378, -9938017, -32384590, +6119255, -5119601, 6885370, -5783174, 15715285, -18076444, -20195474, -13566728, 2386391, -5680631, +-9346386, 10848014, 3687230, -13827110, -15415174, -11531450, -9262634, -1301375, -2798171, 8070244, +-659278, -11830487, 9128416, 2150168, -3413962, 780073, 4293357, -5786932, -3382287, 6241661, +-11010686, -4276177, -7645579, 6447283, 7425462, -8680129, 2312840, -23663122, 165893, 1394791, +1021129, -4448513, -4752382, -10563472, -8354785, 5684389, 3288871, 5458367, 8143795, -7747048, +463856, 3445638, 1960653, -7590281, -107374, 2158221, -412854, -6195491, -1049583, -1458141, +43478492, -1488206, -51951924, -26083336, -30622580, -11529840, 176094, 17238924, -44283260, -9762998, +6870337, -20462834, -23801636, -21463026, -23757074, -3673808, 26074210, 13571023, -10429254, 12708271, +5089000, -11830487, 13431973, -14979772, -3404299, 6457484, 8876624, -29897268, 15049565, -14632417, +8562017, -5762236, -24175834, 6852084, 7461432, 3877819, 3933116, -9878425, -34291556, 1533303, +7043747, 7605850, 314069, 4415764, -14250165, -27917, -1240709, 31250718, -4815195, -51019916, +-23142894, -5416491, -42530376, 9819906, -13013751, -10705743, -20513838, -9030169, -30625264, -29848948, +-36822364, -3520263, 38703560, 5462662, -24538222, 11430519, 314069, -2577517, -13812615, -19236084, +8110509, 16089484, 12120398, 6737193, -7363185, -31237298, -22405234, -31448288, 4626217, 3589519, +-1122597, 11360188, -16655346, -19997904, -2852932, -7352447, -20572356, 4575214, 11827803, 1717450, +4325032, 19841676, -3564823, -4037806, -3383897, 1353452, -7092065, -3886946, 8834211, 13552769, +14770929, 9987410, -4080219, 700617, 2314987, -6136972, 13686450, -5573794, 19969988, -6993281, +9386114, -9498857, -2633352, 20282446, 6743099, 2796561, -70330, -7915625, 8012262, 1753957, +-9828496, 4480188, -8399882, -10835666, 3183108, 3261491, -6653441, -6504191, 6966974, 386547, +9776956, 2112050, 6685654, -3590056, 2992519, 2758980, 1052267, 28945396, -3593814, 23230404, +29528438, -24960202, -31704912, -33000382, 8519068, 11777337, -45669460, -26124138, 713501, 1443646, +13498008, -52762600, 5452461, 12355547, 36477156, -42252276, 4806606, 7064148, -5497558, 23477902, +-13675176, 41055056, -2478196, 3707094, 12119324, 15998216, -15714748, -32990180, 19033148, 23435490, +5139465, 29625074, 5483063, -3685619, -11307575, -24930674, 38428684, -17249126, 36402532, 14542222, +-2981244, 10904922, -15778099, 19877646, 19324668, -13632763, 14297409, 7490423, -38726108, 28065464, +28230284, -3553012, -19893214, 3759707, -1240172, 1294933, -7213398, 52978960, -1282048, -30678952, +-17511118, 6046777, -44637596, -58034136, 7648263, 72688024, 15753403, -5093831, -46707232, -11740293, +-8016020, 49543520, -34178812, -21665962, -81878720, -11784317, -15246597, -19189914, -15614890, 29994978, +31680752, -31862214, -12701292, 10537165, 4115116, -5814312, 12823162, -5594732, -10388452, -10019622, +11004780, 4529580, 3359201, -4054449, 10780905, -11458436, -4211216, 9788230, 4202089, -652835, +-760209, -8557722, 3829500, -5683316, 20831128, -5798206, -11809013, -9440875, -18402862, -6157910, +13642964, 15742666, 42696808, 16344498, -5192616, -32828046, -45671072, -21268678, 370978, 18526342, +14706505, -12135430, -18372796, -9210557, -7712688, 11208791, 19205484, 4272956, 787053, -2496987, +-7282654, -5946382, -5589900, -1055488, -2608656, -2786897, 2295660, -4957466, 1655710, 656056, +1206886, -3776350, -786516, -2832531, -2594697, -3693135, 2165737, -2356863, 3976066, -72847480, +21467320, 34605624, -46181100, -4420595, 26592290, -11473468, -20524574, 18532784, -19784230, -11276437, +2001455, -15416785, 25052008, -8472897, -10763188, -4467840, 13462038, 44313860, -6455336, -20653960, +-22404696, 8089034, 21743808, 12562779, -19740744, -3332895, 24686936, 511101, -17842368, 5937793, +-15870441, 40999220, -18116172, -44704168, 15876883, -7628399, 21758304, -29985314, -28885802, 29368450, +-1887101, -38337416, -19827716, -36632312, 47774532, 22690312, 13242458, -49919868, 9345849, 20463372, +-34442416, 1966558, -24604258, -19112068, 20002200, -16998944, 22881438, -14051522, -29857538, -6919729, +-7027640, -4553739, 10925860, 3582540, -18469970, 58872728, -6772090, 26100516, 27261768, 16291348, +-7556995, 6190122, -12910135, 33123324, 8623757, -8361228, 4417374, 14079440, 23446764, -5710159, +-49555868, -3381750, 16030965, -4955319, 26846230, -11165304, 9546639, -3992172, 1118302, 10909754, +3062312, 6657736, 13898514, 8023536, 16066399, -3716221, 5502390, 8317204, 1503239, -16024523, +19671488, -7948374, 529355, 3026341, -9214852, 5005248, 1402844, -2511482, 13804025, -5997385, +1394791, 19404126, 205622, 10832981, -9054328, -6047314, 10851772, -2401424, -6793028, -10078141, +932008, 1428614, 2826625, -3336653, 2882460, 6082748, -1782411, 4168803, 5487895, -2671470, +6606197, 1219771, -6497212, 4431870, 2718178, 1354525, -351114, 52712672, 10596221, 22933514, +-2121177, 5672041, 8130373, -18933826, 8221641, 18505404, -15569, -21816286, -11954505, -16144782, +-6878390, -21869436, -21465710, 2815888, -17151416, 25031606, 7857643, -5648419, -18215494, -8495982, +-6127308, 13546864, -4337917, -20687784, -17398912, 4495220, 4272956, 12074764, 4329327, -4466229, +5344013, -18032958, -55507084, 2434173, 66901632, -1849520, -48987324, -7813620, 31736050, 9007083, +5010616, -793495, -21393768, -26300770, -15995532, 6115497, -1823751, -24325084, 8820252, -49027052, +-8988830, 45591616, 13193603, 58618252, -7893613, -23008140, -7167227, -5069135, 15479599, 3490198, +-629750, -31842888, -16249472, -15190762, -2345052, 37121940, -5171141, -8990440, 12001212, 15074261, +2214593, -19654308, -30964030, -2165201, 12284680, -1312113, -15462419, -3859565, 8418136, -6426345, +-5932424, -10030359, 18400176, 19659676, -10042170, -5128728, -9241696, 8013872, 11392401, -5333813, +1494112, -2028298, -1792075, -3641596, -14894947, 1641214, 8225399, -8904541, 2024003, -2132988, +485868, -7977365, -2867965, -3354370, -5417565, -6056978, -6404870, -1766842, 26103738, -13047574, +-23085, -5141613, 1265942, 14535780, -9999221, -1386201, -2991445, 4575214, -860067, 4159139, +-7723425, -23335632, -77349680, -119533232, 28228672, 106943072, 33788508, 261635984, 246497840, 109606488, +254168112, 107329088, -46032924, -778463, -76384920, -209089744, -114103856, -109488384, -214237264, -156017904, +-89550608, -134979552, -90709176, 19754166, -7822746, -43185360, 51223928, 47837344, -150324, 51286740, +139244992, 58450748, 26275000, 133257264, 119276072, 40073120, 142080736, 173792096, -214212, 102969696, +175247008, 66381404, 70100848, 178624464, 106760536, -14097156, 139450064, 97872640, -37932616, 54760832, +110939544, -49594524, -87913152, -19827180, -185880272, -312124928, -302142912, -335987232, -537495296, -465254464, +-383784864, -497411424, -426440864, -274030720, -324816576, -248250720, -68639480, -22129282, 105247640, 195800576, +322770016, 432374880, 471657728, 550104256, 597494912, 558134784, 528687936, 560846464, 426725408, 338336576, +401393696, 218952608, 35086124, 50626928, -80950472, -296396224, -248829472, -184104848, -265709760, -271743104, +-169476192, -192939056, -243306672, -178327584, -162139840, -228902960, -205345072, -133903120, -170331424, -182976352, +-59811716, -57549340, -107942192, -11280195, 41246720, -30848066, 5945846, 40933724, -58194660, -75332656, +-71488656, -156803888, -173153216, -121218472, -91039888, -66340064, 22643068, 106434656, 144649136, 204889264, +262537392, 274130592, 290806336, 321578176, 305036096, 277293280, 288833856, 261546864, 194545920, 133432824, +35226248, -51449412, -132254928, -192621232, -215822640, -227415840, -202896944, -155451504, -136138656, -114747032, +-93809064, -80983216, -71295384, -53454628, -41395968, -38137700, -37186900, -25935160, -19567872, -15622407, +-5378910, 8182450, 20080582, 35090956, 36464808, 37493992, 43423192, 42872364, 35161288, 37822556, +31475130, 16682190, 1272384, -12828530, -27831924, -33510408, -40012452, -43001748, -40049496, -37157372, +-36057324, -25798258, -20160040, -12216498, 435939, 10737418, 15800111, 24293408, 29350196, 33176474, +37527812, 39187820, 40920836, 42649024, 42935716, 42518564, 39662412, 39084204, 36958192, 34553548, +31209380, 29785598, 24390582, 18534394, 11311870, 5504538, -2037425, -8892193, -15265924, -22412750, +-31423054, -37441916, -43879532, -47260748, -50237696, -51478940, -51516524, -49303004, -47184512, -42711304, +-38785164, -32626182, -25567940, -15730855, -8205535, 2355253, 10057740, 17258252, 23497766, 29421600, +30994632, 33355252, 32648730, 30091078, 25649008, 22355304, 16324097, 11494406, 7216619, 4673462, +1080721, 195421, -782221, -639950, -1612760, -823023, -1232119, -561567, -988916, 27917, +-376347, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -512175, -11112691, -5488432, 399969, -3257733, -293668, 4756677, 2197413, 3000035, -2619393, 3706557, --3826816, 4156455, 2018098, 5000953, 2055679, -899796, -5635534, 6063420, 4114042, 1569811, -672162, 602369, -2414845, -2681133, 3077881, 1950989, 1999307, 3032247, -3072512, -190589, -2771328, 3365107, -467078, -2437394, -4746476, 59056, 847719, -2807835, 1034013, 799938, --4280472, -2256469, -354872, 2199560, 17180, -2029909, 3936338, 780073, -1371705, -2896956, --682900, 387621, -5576478, 2600066, 3448322, -1890859, 4424353, 3683471, -604517, 3053185, -1756642, 5931887, 1831804, 1139777, -940598, 2256469, -4765266, 646393, 2252174, -2314451, -2582349, 3174518, 3428458, 2186138, 4512937, -938987, -2771328, -1395328, -1182727, 634581, --1066226, -3488050, 1653026, -1628330, -1869921, -2103460, 798327, 30602, -1097901, -820876, -1389959, 137439, -174483, -344671, -150861, 694174, 930934, -119722, -65498, -766115, -214748, -1404454, 129386, 994822, 1266479, -875100, -971200, 254477, 824634, -809064, --10548977, -7434589, -1020592, -4799089, -4045322, 1973538, -5994164, -5844377, 1704565, -2666101, --2330020, 2384781, -1870995, -4150549, -418222, -345208, -1133335, -1917166, -1082332, -4755603, --265214, -3439195, -2434710, -163746, 4249870, -972273, 6128382, -3205656, 3693135, 4176319, --4701379, 1614371, -1171452, 882079, -3321620, 1624571, 2190433, 3213709, -1643899, -4003447, --1357747, -2210835, 1293859, 1506997, -4790499, -639413, -3282966, -2689723, 925565, -3976603, --6293738, -1216013, 6220724, 1339493, 2189897, 306553, 1444720, 817118, 2301029, 2420751, -6972880, 491237, -3073049, -4020626, -840740, -1930051, -497679, -8100309, 1688996, -602369, -2592013, -1107028, 730681, -1953673, -931471, 7873212, 1598265, 7217156, -2445984, -1347546, -565862, 2034204, 714575, 2430415, -2398739, 2641405, -2798708, -1767379, 1450088, 1016297, --96100, 102005, 67646, -632971, 206158, -1096290, -91805, -392453, -169114, 446140, -554588, -616865, -1017370, -657667, 71941, 17717, 178241, 317291, -421444, -489089, --430034, 89121, -163746, 568546, 8607114, 9916006, 7635915, 5663452, 8026757, 3251827, -3489661, -734439, 2281702, 8442295, 903554, 2573222, -3136400, -2095407, 6474127, -4345433, --7916162, 2392834, -6613713, 5706401, 1348083, 6847789, -2180233, -434329, -1687922, 2247342, -2745021, -100932, -6738267, -1394791, 5775658, -3848291, 2604898, 1522566, -1300301, -1666447, -6417755, 4832375, 11194295, 4473746, 930934, 2674154, -944893, 673236, 3526705, 2094870, -9541270, -4093104, -2721399, 656593, 2457795, -1510218, 4422743, -4150549, 860067, -281320, --3179887, 979789, 958315, -4320200, -5832029, -3619584, 4618701, 2227478, 19864, -386010, -3485903, 252329, 1155883, 6033356, 2982855, -1453310, -962610, 5361730, -4660577, 604517, --4201552, -1903744, -5430450, 1466195, -1130650, -3233037, -2109366, 3136400, 1942399, 549219, -1850594, -3030100, -506806, -272194, 2335925, 53150, 166430, 417149, 697395, 1703491, -1927904, 1505923, 117575, 797790, 1744831, 83215, -1586990, 1453310, -805306, -329102, -357019, -282931, 1282048, 1150514, 584116, -18254, -445603, -477815, 550830, 718333, -267899, 1104344, -2266669, -1465121, 1135482, -96637, -893353, -126165, 1211718, 95026, --835908, -1069447, 714038, -1055488, 90194, 18685256, -325881, 9153112, -1654099, -1434519, -9827959, -9615358, -3322157, -750009, 4859756, 3370476, -2049773, 1872606, 918049, -8706436, -2212982, 4661114, 4148402, -9757092, -3420942, 1104344, -6987375, -1921461, 547608, 319438, -964757, -1072131, 4471598, -3148748, 3558917, 7322383, 7323993, -2119566, -4179540, -744640, -8249559, -466541, -428960, 66572, 824097, -4272956, 745714, 3471407, 533650, 828392, -3331821, -2191507, 2247879, 1304060, -891743, 5797669, 583579, 4611185, 923955, -1535451, -2024003, 3085397, 2669322, -126165, -4513474, -4114042, -5437966, -2420751, -177704, 13959, --623307, 4064650, 3501472, -2628520, -5332739, 180926, 2791192, 3350075, -3256659, -599685, -3173444, -273267, -422517, 4209068, 1981054, 2000381, -1551020, -1340030, -235686, 1821066, -2712809, 71941, 2057289, 746251, 183610, 405338, 693637, 2522220, 1899986, 2837900, --1419487, 1344325, 204548, 367757, -398358, 306016, 432181, 136365, 379568, -451508, -1363115, 1336809, -1219234, 337692, 765578, 844498, -392990, 2627446, 1023813, -379031, --4952098, -14006962, -3583613, -4789963, 946503, 2252174, -2333778, -2864206, -26261040, 453119, -8477729, -6213207, -9817221, 7290707, -11116449, -1765232, -4966593, -5937793, -3627100, -3760781, -403727, 4385162, -814433, 2406792, -2844342, 3284576, -2585034, -4072166, 1749662, -1581085, --6296422, -8119636, 3828963, 294742, 3778498, 1072668, 8467528, 1109712, 2926483, -4164508, --7078106, -2138357, -3524021, 6963216, -3313031, 92879, 1810866, -3593814, 9841918, 6444062, -116501, -7950522, -9996000, -3476239, 3291556, -9087614, -253403, -4468377, -8590471, 702764, --13435731, -3058017, -1458141, -5078799, 8981313, -649614, -1453310, -239981, 5611912, 7112466, -2130304, -7306276, -2369748, -1918777, 3848291, 1727651, 2192581, -4145180, -5206037, 3960497, -2721399, 926639, 1322313, -345208, 2273648, 552440, 3446175, 899259, 770410, -386010, --146029, 466004, 2204929, 3114925, 1923609, -874563, 1233193, -4099010, 2027225, 2296197, --717260, -425739, 689879, -994822, -298500, -311922, -1280974, -1386201, -754841, -471910, -706522, 1502165, -297427, -1938641, -60666, -2700998, 840740, 3492882, 1488206, 2026151, -1447941, 5503464, -14974403, -22257594, 2765959, -5159330, 4986994, -6305012, -10969346, 172336, -10168872, 1966558, 6255620, 4857071, 3886946, 2358474, -3506841, 2607045, 6772090, -10645613, --4890894, -3612604, -2317672, 3755949, -822486, 1222455, 7027104, 5974837, -2422362, -6052146, -1445793, -3436511, -2486249, -5870147, -3949759, -8883603, 2168422, -3387656, -12885, 7689065, --1498407, 1388348, 2122251, -5696737, 4761508, 4539781, 6560563, -5804112, 10323491, -1774358, --7444789, -6444062, -8149701, 7549479, -2829310, -8824547, 2711198, -1443646, -6088116, 6447283, -8854612, -3135863, -7285339, 5352603, 1787780, 4175245, -579821, 11732777, 7011534, -7000797, --3368328, -3354906, -2634426, 3853660, 5470715, 6924561, 42950, 834297, 2749316, -2881923, -2617783, -861678, 4590247, 6352257, -8691940, -3998078, -4356708, -2841121, -4452808, -439697, --3142306, 1384053, -146029, -370441, -345745, 1083942, -2125472, 5383742, -658204, 2246805, -848793, 1053341, -1045825, 132070, 169651, 244276, -1826972, 309775, -1183264, -1992328, --2868501, -926102, -158377, -550293, 120796, 273267, -574452, -456877, -1074279, -1071594, -1726040, -65498, 584116, -1258425, -20787104, 60666, -3834869, 1449015, -108985, 7893076, -5662378, 8173860, -1381906, 11122355, -5200132, 7590281, 9126269, 1777043, 9097278, 2063195, -2318209, -2483565, -998580, -3765076, 7202660, -360240, -886374, 10321880, 6122476, 188442, -2699924, -776852, -399432, 6749004, -3859028, -6485401, -60130, -814970, 3326452, -18514530, -11142756, 12175695, 4715874, 2451353, 270583, -5815386, -12461848, 8304856, -5049808, -5539971, --3826279, 7467338, -5228586, 4648765, 4566087, -4301410, -2962991, -10611790, 4894652, -6863895, -4097936, 802085, 3666828, 6628745, 10365904, 4576288, -4837744, -11331734, -2054605, 7118372, -11431055, 8723615, -1772748, -2158758, -7405598, -12138651, -1330903, 8597451, 3751654, 2793876, --2750927, 11373610, -413391, 3905736, 1060857, -2058900, 1036698, -5625334, -2824478, -2785823, -1888175, -1323387, -4129074, -2301029, -2859375, -2945811, 1205812, -4242354, -1838783, 964757, -732829, 3501472, 159988, 605054, 561567, -789200, 2739116, -740882, 3118683, 1262184, --913754, -2277943, -139586, 3155727, 2138357, -248571, -2958696, -643708, 2594697, 2470143, -322659, -397284, -364535, -1648731, -1334661, 2077690, 7845295, 27154394, 14717242, -1217086, -2554432, 2506650, 5954972, 10805064, -1500554, 2214593, 18107582, 1966021, -788127, 11042361, -7626788, -7416872, 4505958, 1220845, 7298760, 5143760, -12563853, 9704479, -5807333, -695785, -1096290, 7630010, 1363115, 2168959, 5721970, 6679748, -6214281, 6859600, 20031728, -3384434, -9133248, 9489730, -4948339, 7476465, 1968169, -4662724, -5180805, 3707094, -4626754, -12288975, --1578401, -428423, 1312113, -15770583, -3855807, 5051419, -10041634, -6628209, -16560320, 5644124, -7670812, -11191611, -4012573, -5317170, 12048457, 447213, -6837051, -4655208, -7617662, 4002910, -10089952, -6987375, 3911642, -2879776, 4884452, 11525545, 4811974, 9114457, 9140764, 11511586, -1774358, -6204081, -6315213, 4712653, 7230578, 1201517, 4870493, -4926865, 2072859, -460098, --1542967, -5178657, 771484, -2206003, 344671, 4512400, 1878511, 1999844, 1509144, 4968204, --2939905, 341987, -765041, 1598802, -524523, 336081, 2091112, 715112, -1651415, 2744484, --521839, -3515968, 2338073, -2460480, -2070174, -2556579, -5496485, 3172370, -1226213, 2712272, --248571, -344671, 788127, 4300873, 2822331, 3857954, 1760937, 132070, 1557463, 4421669, --1673427, 4008278, 27974196, 7341710, 1273995, -1705639, -3891240, 74625, 5348845, -3476776, --6295885, -9623411, 854699, 6706055, -8338679, 4073240, 5709086, -2483565, 18923090, 6548752, --4543002, -3301756, -1279900, 6655589, -2649995, -6358699, -6766184, 4227859, -14924474, 440771, --4122095, -5589363, 4938676, 976568, -5398237, -3495567, -5184563, 7423314, -2362769, -12006044, --1334661, 188442, 999654, -6998649, -9616969, 834834, -1712618, -1403917, 3406983, -2144263, -9210557, 1799591, 5533529, -5897527, 13359496, 3771518, -6529424, 8699456, 16872242, -4894115, --4037806, 8518531, 8021925, 3230352, 4913980, -10428717, -2677912, -11268384, 3374234, 10428181, -4829691, -13196287, -2592550, 4090956, -12896176, -20410758, -1690607, 604517, 5849746, 18413062, -1544041, -2165737, -5704254, -4433480, 2959233, 4624069, 3995393, -344134, 2143189, 121333, --4022237, 2472828, 3244311, -5258114, -4918812, 5552319, -1826972, 3241627, 2552284, 1607928, --1366337, 1152125, -96637, 1889249, 513249, 2899103, 116501, 2556579, 1858110, 536334, --2370822, 5379447, 1755568, 4908611, -1016834, -1700270, 1829656, -3361886, -546535, 2316598, --3105798, 765041, 1813550, 1065152, 1188095, 2617246, -1038845, -4866735, -62277, -539555, --5127654, 723702, -2156074, -637266, 2048163, 1656247, 1856500, -21657372, 10212358, 28646358, --11752104, 20084878, -4503273, -4406637, -6259378, -10474888, 7765838, 227096, 5313412, 5146982, --18817326, 178241, 8804683, -7718056, -4014721, -11950747, 21041044, -13184476, 10392747, 9706626, --12488691, -5233418, -4346507, 8736500, -9990094, -4165045, 10204305, -1858647, -2711735, -5047124, -12439299, 2103997, -1997160, -5196911, 340913, -9543417, 10254234, -1306744, 4722317, 25450902, -17154636, -14803142, -10396505, 3915937, -1318018, 10587631, -5866389, -8725226, -3057480, -16134582, --6180458, -2008971, -12304008, -7144141, 27313308, 6404870, 102542, -1453310, -296890, 7923141, -9624485, -2145336, 9505836, 645319, -5216775, 908922, -14566918, -1218697, -13499082, -7413651, -8136279, 11793980, -17901960, 7137162, -4589173, -5812165, 8671002, -1402307, -8243653, -603443, --3234110, -6591701, 3305514, 2259153, -4511327, -11248519, -5359583, -1250909, -885837, 8645232, -2597918, 2059437, -4792110, -54761, -1981054, 4573067, 5254893, -2950106, 2237141, 3839164, -4318053, 3270081, 4910758, -2085744, 326418, -3522410, 251256, -4081293, -2121714, 1374390, --1114544, -3320010, -778463, 1556926, -5294621, -2727304, -2886218, -1714766, -2042794, -2527588, --333934, 2835752, 189515, -369904, 3373160, -23025320, 4034585, 21110838, -5476084, -5546951, -4694400, -6721087, -5275294, 5864778, -700080, -1323387, -163209, -14542222, 24553792, -26131654, --2412698, -725850, 8997956, 5230197, 406411, -10001905, -7010997, 2980171, 19187766, -1684164, --8339753, -5890548, -13475997, -1055488, -7882876, -6467684, -2713346, 4119411, -374736, 504122, --9104794, 1714229, 2681670, 5738077, 4958540, 5778342, -12387223, -75162, -2470680, 8058433, -2146410, 16485695, 3663070, -3978750, 1539209, -9169218, 1611, 7126962, 9435506, -14394046, --10995116, -1166621, 14952392, -23412940, 6184753, 26756036, 14850386, -7312182, 2555506, -14570677, -6165426, 13159780, -22660248, 4966056, -11004243, -3244848, -30746060, 44560, -12911745, 11902428, -901406, -14430553, 9594420, -1024887, -18396956, -2572149, -11606075, 7514582, -6432251, -9753871, -13214004, -2641942, 2407329, -4479651, -5616744, -1658931, 5694590, 4097399, -3073586, -896574, -320512, -3351685, 2126009, 3092377, 4730370, -4794257, 1939715, 2392834, -5487358, 254477, -2542084, -4093641, 476741, -2683281, 6263673, 3212099, 7603703, -3651259, -2709588, 2422362, --7058242, -852551, -1956895, -1214402, -274341, 1429687, -3914326, 170188, -433792, 1317481, -1483911, 167504, -3946001, -2408403, -6229850, -17361868, 27473296, 8081518, 14374182, -16176994, --18252000, -3233574, 4815732, -4937065, -2457258, 9371619, 2517388, 3019899, 8137353, -20071992, --2226404, 431644, 5132486, -13905493, 1840930, 2563022, -9796820, -5233418, -13491566, -9965935, --75699, 4507032, -10916196, 993211, -4947803, -9525701, 3770981, 153008, 7750269, -21265994, --22388054, 4819490, -1920924, 8578123, 18781356, 2255932, -11812771, 16940424, -8363912, -15625091, --12147778, -5047124, 1350767, -16602733, -6466074, 16595217, 22348862, 9554692, 6264747, 4784057, --2572686, 14355391, 8057359, -16504486, -9055939, 202937, 1672353, 15700790, 10034117, 2607045, --2383707, -1823751, -7635915, 10457708, 8138963, 18105972, 4134443, 5348308, 2208687, 32430224, -3687230, 12626130, -13356811, 1254131, 12313671, -29195578, 2426657, 3974992, 8279087, -2938831, -4415764, -3728569, -965294, 5127117, -2403571, 15628849, -6205691, 9178882, -2368138, -5410585, --2924336, -5859946, 199716, 2532957, 3078418, -1138166, -2969970, 6576669, -1911261, 4435628, --2275259, -2377801, -4694936, 4967130, 5341866, 1232656, 537945, -3872987, -6830609, 3296924, --569620, 310311, 8181913, -2208150, 7171522, -1016297, 4202626, 2915209, 5529771, 1326071, --5063230, -883153, 18686328, 1072131, 23179938, -991064, -10548440, -11817603, -21633750, 3754338, --9109089, -834297, 1884954, 7561290, 11385421, 18956376, 19914152, -3316252, 17728552, -1557999, --1522566, 6455336, 14939507, 6254010, 4190278, -23995446, -12182138, -19558744, 9799505, 19105088, -3768297, -8602283, 13519483, 19164144, -2617246, 2769717, -4535486, 16073378, 13797582, 11460046, --6920266, -12551505, -1952600, -3438121, -27386858, 4535486, 3752191, 2197950, -6961068, -3879429, --30544196, -11054172, -27723478, -5097053, -20761872, -11005854, 20029044, 5071283, 21100638, 1160715, --17272748, -8644159, -17973902, -34580392, 4851166, -21459804, -6190122, 20022600, 8455180, 7738994, -1672890, -4075387, -1479616, 3764539, -14783814, 11644730, -25222732, -26214870, -1441498, -2421288, --3246995, -19304804, -4342749, 25081536, -1378148, 1397475, -6736656, -22023518, 11116449, -14856829, --5778342, -14788109, -9058623, -6985228, -4675072, -5413807, -3258270, 216359, 2595771, -13834627, --5907191, 2528125, 2455111, 7556995, 3587908, -4669167, -5780489, 4904316, -9269613, -1504312, -2867965, -7197292, 2250563, 2066953, 5163625, -4941897, -1690070, -2675765, -376883, 3349538, --2030983, -384400, -2725157, 5379984, 7540889, -2560338, -1216013, 1965484, 2532420, 4671851, -6682432, 1163399, -1137630, -1671816, -1585917, 10853919, 21787832, 19012746, 20429548, -11764989, --20550344, 15808164, -9356049, 16337519, 4874251, -26181046, 6579890, 4905390, -29532732, 15887084, --13463649, -13712757, 8042863, 9001715, 1403381, 10681047, 800475, 554588, -6928319, -3974992, -6475737, -4076998, -10125922, 701690, -19022948, 6896107, -24181202, -14676440, 898185, 9617506, --3301219, -9973988, 3750043, 7591355, 5630702, 468688, 19473918, -44736916, -10165114, -12233677, --14868640, 19446002, -15658914, -2114735, -36107792, -10073846, -4290673, 1910187, 24074902, -5781026, -3042984, -14510547, 12208981, -18060874, -11719892, 9431748, -41926396, 6132677, 22403624, 29135984, -22225918, 14107357, 32724430, 18108656, -396748, -8062728, -8408472, -12625593, -28227598, -3025268, -2631204, -39877696, -15800111, -12030740, -9016210, 12814035, 33429878, 39101920, 25865904, -13070122, -10666014, -8411157, -1840394, 8886287, 6003291, -3365107, 2103997, 2954401, -787590, 1389422, --6152541, 3560528, 10958072, -5114233, 1453846, -9627706, 2367601, -4485020, -670552, -428423, -8459475, 15068356, -5400922, 991064, 3640522, 6167573, -9102646, -14009646, 250182, 10999948, -3164317, -8915815, 8382703, 4475356, -9134859, 6444062, 4060355, -3450469, -2819646, -915365, --1726577, 1709934, 3388192, -3137474, 6109054, -38489888, 119185, 6360310, 27023398, -8819178, -12537010, 11294690, 6050535, 6155225, -41941968, 33122250, 18154826, 41051836, 15176267, -1802276, --15173046, -9707163, -9463960, -14892262, 10719701, 7801808, -15010374, -17186848, 9186398, 12321724, -21563958, 6011881, -13220983, -19906100, 4329864, 3374771, 1488743, 2393371, 38221452, 12902082, -7401840, 12553116, 13907641, 15519864, 481036, -24169392, 17143898, 53159884, -5303748, -14799920, --32219234, -6948184, 42991548, 5017059, 17869748, 5946382, -59122908, 12233677, 10774462, 1255204, -6229850, -4134980, 1050120, 12103218, -31758598, -13227426, 27217208, 10059887, 3858491, -24003498, -17314086, 6386080, -21495238, -23477364, -15617575, 21536576, 44900124, 41663332, 46028628, 46547780, -2018635, -20691542, -16874390, -40647032, -13166222, 12895639, -32833952, -257698, -26718992, 404801, -36338108, 14137422, 15082851, 18002356, 11399380, -10976863, -3469797, -13545790, 19855096, -11832098, --10287520, 3606699, -2072859, -7010461, -12786655, -3714073, 13606993, 12682502, -5668820, 19578072, --681289, 568546, -8614631, 2954938, 10309532, -2468533, -7428683, -7364259, 5270999, -4037806, -11252277, 7027640, 9163313, 13087302, -12999792, 3465502, 1414655, 6052146, -2487860, -5583995, -11969000, 2898029, 9824201, -5054640, 3769371, -7704635, -2285996, -11889006, 19034758, 38774428, --78578576, -27715960, 6136435, -45901388, -42101952, -18212808, -25567404, 2929168, -18826990, 49820548, --5297842, -17626008, -7151121, -38094748, -10564546, -30731564, -12809740, 5417565, -39675296, -6604049, -30729418, -25687126, -7409356, 8917963, -152471, 12885439, 2690260, 110059, 11461657, 4320737, --19713900, -3622805, 17548162, -8797704, -24554864, -7990787, -29777008, -14581951, -52161304, 5174899, --35532800, 17249126, 6345814, -12934831, -46012520, 4361003, -4903242, 56802552, 22531936, 1154809, -30766998, 13450764, 284005, 25130390, -29513942, -13921600, 2204929, 22240952, -24447490, -14734422, -82184736, -7753490, 42569032, -33089502, -81068, -23611582, 17865454, -8319352, 27870042, 43858596, -1162326, -30967788, 26590142, -32999308, -15007689, 11155104, -34294240, -22908282, -10935524, 24923696, -47547972, -56572772, 47668768, 9543954, 13936632, 5266704, 6692096, 5080410, -7039989, 8616778, -24693378, -12486544, 4334696, -2426120, 3226057, -26801132, -4811974, -8214662, 8082592, 8262980, -26381300, -16485158, -9550934, -12854300, 18306224, -23401666, 5632313, 8602283, 7942469, 8674223, --38513508, -9199283, 13893682, -6659347, -16456704, -2194728, 4549981, 939524, 16330539, 8227547, -12965433, -13020730, -11560978, 13093745, 3874061, 8783208, -8665633, 8834748, 6081137, 1622961, -3328600, -3706020, -3988414, 108985, -19028852, -18533858, -29606284, 61269856, -35167728, 22497576, -20187420, -31967442, 17576080, 9595494, 6972343, -5711233, 24314346, 12493523, -30752502, 21843130, -25536802, 4926328, 4403952, 15374909, -310311, -30677340, 39950176, -22765474, 9117679, -16930224, --3799436, 5006322, -7358353, 32476396, 7411503, -4291746, -7694434, -1695975, 6483253, -33049774, -10604274, -17128330, -11450920, -7923141, 56908, -16206522, -7576859, 3955128, 34461744, 386010, --7046431, -21846352, 9290551, 6060736, 1177358, 26659398, -6311455, -2746095, 31857920, 9997610, -2024540, -30537218, -15814070, 19770272, 11226508, -28596966, 1111860, -65038688, -32032402, 58401356, --13461501, 31618476, 41566692, 11822971, 7261179, 18781356, -7751879, -22788022, 12516608, 3920768, --1237488, 26405458, 17375290, -18835042, -45175004, -9322227, 18788872, 5988795, -818728, 14825153, --16876000, 25588342, -12188043, 9641665, 12212203, 5321465, 17816062, 13382581, 21541408, 2523293, --5161477, 7796440, 20921860, -5264556, 18379238, 10925860, -11249056, 3764002, 9982041, 6578280, -4379256, 13055627, 11265699, 4880157, 22042310, -6688875, 2983929, -2959233, -851477, -5328444, -19699942, 15977815, 13294534, -5825050, 3061238, 22707492, -5202816, 16690780, 15553150, 199179, -26611618, -23225036, 4100620, 35631048, 5399848, 10209137, -6466610, 25121800, 5789616, 9629854, -34842384, -10768557, -58167280, 9878425, -6992207, 20031728, 6152004, -19738596, 10251013, 12007118, --22466974, -24697136, -16506096, -41233832, -41475964, 28566364, -6589554, -42634528, -13049184, 4384625, -14139569, 13525389, -26096222, -28303298, 2813204, 39438536, -18822158, 15240691, -26489748, 9456981, --29887604, 19518478, 20595978, -14630269, -30758946, -21143588, -3400540, 12128451, -13183939, -8664560, --10970957, -39120172, -33819648, 17804786, -28387586, -5753646, 10162966, -23408646, -37869800, 14540612, -19926500, -2467459, -45597520, 20491826, 17945448, 57795764, 303869, 15243376, 11334956, -24551106, -9476845, -7554848, -49842560, -7525320, 30524870, 7379291, -25200184, -62459560, 39560944, 50662896, --14993731, 41015328, 47590920, 2610803, 2175401, 37760280, -24330990, 2069101, 62978716, -46225660, -27008364, -39557184, -10908143, -3017215, 27118960, -8971113, 3940096, 15458124, -479426, -34931504, -38763692, -6755984, -4560719, 6256694, 16173236, -26141856, 11563126, 7144678, -4020626, 8419747, -9391483, -24145770, -3365644, 6116571, 12834436, 27194122, -2320893, -23051626, 11873974, 27946816, --21949430, 27295590, -12792560, -2335389, -9533754, 30771830, -21023328, 7738458, 18751290, -12465606, -4590247, 3962644, -17594870, 4473746, 7329899, -2618320, -13440026, 9334038, 10749229, -5385889, -21580064, -32021128, 7811472, 10424422, 146029, 2864206, 4154844, 22796612, -5309654, 12883828, --26446262, -82738784, 22180822, -9375377, 61703112, -21123722, -13872207, -24698210, -71238472, 32631550, --41631120, -24023900, 987843, 61740, 54465016, -39031052, -27709518, 36183488, 21171504, 18918258, --7095823, 18072686, -12996571, -17952426, -16931834, 42378444, 34855808, 55059332, -17807472, -20495584, -652298, -3558381, 19858856, -33033130, 6766721, -34731252, 18250390, 34170760, 11373610, -28059022, -18804978, -24739012, 55433532, 28432684, 7538742, 7536057, -8982387, -43734580, 24354612, -59338732, -12021077, 11054172, 28614146, 23010824, -51654496, 15452755, -32688996, -19184008, 13560285, -5110474, -18724984, 12228846, -47286516, 19128174, 42640972, 56893820, -16945256, 16780974, -23678692, 39906688, --57200912, -3051038, -10785200, 17864380, 36893232, 53561464, -43386148, 10619307, -57908508, 36845988, -75211320, -19312858, -52052320, -4246649, -39381092, 49588620, 12124693, -25489558, -7672959, 2763812, --8999567, 35358320, 12858058, -20198158, 18585398, -28549722, 1328219, 26478474, -6089727, -32901596, -35751308, -52405044, 14595373, -8072928, 20325932, -1514513, 12410845, -12249784, -7008850, 5093831, -4015258, 5311264, 24193014, -25580826, -21875342, 929324, 5123359, -6117644, -27030376, -19605452, -38100120, 10151692, -17823040, -20142322, -44806708, 52586504, 40779640, -16448651, -14816027, -31188442, -523986, 39176544, 6932614, -16959216, -6606197, -9154186, 5728950, 3877819, 1476395, -5181878, --2567317, 7073275, -1131187, -4376572, -3366718, 4583804, 1416802, 9460202, -4684736, -66025460, -47392816, -6887517, -975494, 14627048, 13820131, 17579302, 5956583, 8176007, -22106734, 20938502, -6767258, -24191404, 16583942, -10105521, 426812, 20453708, 13108240, -34077880, 19489488, -16546898, -28512678, -20983062, 7806640, -11110544, 13691819, -10626823, 6720550, -15436112, 32673964, -3612068, -1657321, 8701067, 11476153, -16936666, -2579128, 6507413, 11420855, 8931921, -10427107, 3265786, -1250372, -33170570, -1910724, 7632157, 12701292, 4417374, 8422431, -29917668, 5424544, -2461016, -3723737, 5942624, -4986457, 5577552, 5646809, 1985349, -6263136, -7348152, -1462973, 32981054, --11077258, 5951214, 13331042, -7831336, 12725451, -14331769, 12294344, 5203353, -8289287, -14418742, -9376987, -9160092, 7528004, -13051869, -9797357, -5640903, 16310675, -4791036, 2298881, 2305324, --312996, 2892124, -11470784, 8485782, -7109782, 19600084, -18173080, 8049306, -10507101, 9322227, --8426189, 7282117, 1060857, 12947179, -11110007, 5584531, -5270462, -175020, 3288334, 7257421, --7727183, 1115081, -8400419, 12192338, -10120554, -3979824, 7504919, 1777043, -4483409, -2537252, -8376260, 3994857, -17219598, 9157407, 1796907, -870268, -1003949, 2674691, -1345399, 934155, --478889, 1340030, 1538135, 3704946, -4183298, 11914239, -15506443, 4250407, -2011655, 2531883, --2132988, 3706557, -1333587, -2991445, -562104, 1373316, -3438121, 51835424, -3731790, -16790100, --25591026, -11638825, -14362371, 18807124, 10884521, -13673565, 1147830, 1612760, 6152541, 845572, -13032541, 4497905, 10267656, -3514357, -358093, -3074123, 4820564, 11123965, -10310606, -60130, --5095442, 369367, 13571023, -7682623, 1337882, -3467112, 5358509, 2766496, -7418483, -2747169, -7999377, -2440615, 13031468, 9266392, -13553306, 4364761, 2902861, 7136625, 3036542, -12816719, -8711804, -2386928, 8474507, 6774237, -15289010, 4220342, 75699, 3467649, -1677722, -6708739, -10954851, -2663954, 4991826, 282931, -3244311, 5078799, -6483790, -891743, 9147207, -6233608, --7470022, 15209553, -9762461, 14191646, -1432909, -11445014, 23520852, -21525840, 18786724, -6614250, --11185705, 11904576, -10987063, 3304441, 3875134, -10765336, 9146670, -1909113, -643171, 5844914, --7455527, 9865003, -3128347, -716723, 2479807, -1636383, 3511673, -1604170, 616865, 2909304, --2704756, 4627291, -471910, -2565706, 5703180, -8694624, 4712116, -3840238, -1726040, 5498632, -526670, -1593433, 2901251, -2024540, 2882997, 1483911, -3974455, 2766496, 629213, -865973, --610422, 2506650, 609885, 4582730, -3483755, 1345399, 668404, -2498597, 5105643, -1392643, --704375, -25298432, -43661564, 55049668, 157315520, 24978456, 15157476, -114990768, -142377088, -45506788, --28068686, 96324304, 146695680, 75618808, 21789980, -49328772, -106307416, -96799976, -81243600, 6495601, -121512680, 101782136, 58229556, 19874424, -52140368, -67434208, -53709640, -51753284, -18371186, 24640764, -33679524, 69919920, 49918796, 12196097, -17032230, -9906342, -56323128, -27259620, -28508382, -38434052, -22825066, 43255152, 24890410, 62943284, 16614007, -14875619, -24247238, -41751376, -33130304, -5116917, --10304700, 12896176, 25936234, 23242216, 16481937, 11341398, -5804112, -22898082, -16314970, -19034222, -6067178, 22327924, 7266548, 5529234, -9746891, -19909858, -3813394, 10201, -367757, 16230681, -14410152, 16268799, 6324876, -5528160, -17451526, -25116968, -25837450, -16699907, 17784922, 26491896, -32720134, 22734872, -5778342, -12766253, -13680545, -26926224, -11989938, 9904731, 5115306, 4945118, -7796977, 3835943, 2946348, -4123169, -5485210, 4315906, 9302362, -140123, -880468, -6396817, --8946417, -4558034, -5461588, -3112241, 6880001, -1168231, 14466524, 18000744, 10307922, -6157373, --10259066, -11367705, -14500883, -10495289, -14350559, 7701950, 19622632, 18016314, 10569915, 11274826, -4184909, -10974178, -21633750, -22013854, -11273215, -2219424, 6925098, 15789374, 23040888, 19011136, -3513820, -12138651, -20381230, -14836965, -4997732, 207769, 5508833, 3605625, 8662949, 11211475, -3253438, -4759361, -6631967, -3634616, -2797098, -2614025, -810138, 856846, 5131412, 3191161, -310311, -6979, -373662, -967978, -2421825, -2735894, 886374, 2241436, 1613297, -320512, --107374, -259846, -778463, -897111, 475131, 438087, 727460, 233002, 355945, -464930, --589484, -1054415, -642098, 246424, 1287953, 281320, 518080, 476741, 131533, -660351, -18254, -678605, -1860795, -1241782, 1226750, 1447941, 1504849, 761283, 38118, -990527, --404264, -636729, -335007, -603443, 261993, 47245, 219580, 94489, 739271, 363998, -710817, 58519, -84289, -674847, -530428, -1053878, -476205, -245350, 821413, 700617, -1255204, 605054, 204548, -974421, -830539, -923955, -242666, -271657, 722628, 524523, -583579, -68719, 97174, -347892, 54761, -282394, 124017, -255551, 161598, -164819, -217970, -199179, 176094, -146566, 273267, -143345, 193274, -186831, 167504, -221728, -181999, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +11112691, -5488432, 399969, -3257733, -293668, 4756677, 2197413, 3000035, -2619393, 3706557, +-3826816, 4156455, 2018098, 5000953, 2055679, -899796, -5635534, 6063420, 4114042, 1569811, +672162, 602369, -2414845, -2681133, 3077881, 1950989, 1999307, 3032247, -3072512, -190589, +2771328, 3365107, -467078, -2437394, -4746476, 59056, 847719, -2807835, 1034013, 799938, +-4280472, -2256469, -354872, 2199560, 17180, -2029909, 3936338, 780073, -1371705, -2896956, +-682900, 387621, -5576478, 2600066, 3448322, -1890859, 4424353, 3683471, -604517, 3053185, +1756642, 5931887, 1831804, 1139777, -940598, 2256469, -4765266, 646393, 2252174, -2314451, +2582349, 3174518, 3428458, 2186138, 4512937, -938987, -2771328, -1395328, -1182727, 634581, +-1066226, -3488050, 1653026, -1628330, -1869921, -2103460, 798327, 30602, -1097901, -820876, +1389959, 137439, -174483, -344671, -150861, 694174, 930934, -119722, -65498, -766115, +214748, -1404454, 129386, 994822, 1266479, -875100, -971200, 254477, 824634, -809064, +-10548977, -7434589, -1020592, -4799089, -4045322, 1973538, -5994164, -5844377, 1704565, -2666101, +-2330020, 2384781, -1870995, -4150549, -418222, -345208, -1133335, -1917166, -1082332, -4755603, +-265214, -3439195, -2434710, -163746, 4249870, -972273, 6128382, -3205656, 3693135, 4176319, +-4701379, 1614371, -1171452, 882079, -3321620, 1624571, 2190433, 3213709, -1643899, -4003447, +-1357747, -2210835, 1293859, 1506997, -4790499, -639413, -3282966, -2689723, 925565, -3976603, +-6293738, -1216013, 6220724, 1339493, 2189897, 306553, 1444720, 817118, 2301029, 2420751, +6972880, 491237, -3073049, -4020626, -840740, -1930051, -497679, -8100309, 1688996, -602369, +2592013, -1107028, 730681, -1953673, -931471, 7873212, 1598265, 7217156, -2445984, -1347546, +565862, 2034204, 714575, 2430415, -2398739, 2641405, -2798708, -1767379, 1450088, 1016297, +-96100, 102005, 67646, -632971, 206158, -1096290, -91805, -392453, -169114, 446140, +554588, -616865, -1017370, -657667, 71941, 17717, 178241, 317291, -421444, -489089, +-430034, 89121, -163746, 568546, 8607114, 9916006, 7635915, 5663452, 8026757, 3251827, +3489661, -734439, 2281702, 8442295, 903554, 2573222, -3136400, -2095407, 6474127, -4345433, +-7916162, 2392834, -6613713, 5706401, 1348083, 6847789, -2180233, -434329, -1687922, 2247342, +2745021, -100932, -6738267, -1394791, 5775658, -3848291, 2604898, 1522566, -1300301, -1666447, +6417755, 4832375, 11194295, 4473746, 930934, 2674154, -944893, 673236, 3526705, 2094870, +9541270, -4093104, -2721399, 656593, 2457795, -1510218, 4422743, -4150549, 860067, -281320, +-3179887, 979789, 958315, -4320200, -5832029, -3619584, 4618701, 2227478, 19864, -386010, +3485903, 252329, 1155883, 6033356, 2982855, -1453310, -962610, 5361730, -4660577, 604517, +-4201552, -1903744, -5430450, 1466195, -1130650, -3233037, -2109366, 3136400, 1942399, 549219, +1850594, -3030100, -506806, -272194, 2335925, 53150, 166430, 417149, 697395, 1703491, +1927904, 1505923, 117575, 797790, 1744831, 83215, -1586990, 1453310, -805306, -329102, +357019, -282931, 1282048, 1150514, 584116, -18254, -445603, -477815, 550830, 718333, +267899, 1104344, -2266669, -1465121, 1135482, -96637, -893353, -126165, 1211718, 95026, +-835908, -1069447, 714038, -1055488, 90194, 18685256, -325881, 9153112, -1654099, -1434519, +9827959, -9615358, -3322157, -750009, 4859756, 3370476, -2049773, 1872606, 918049, -8706436, +2212982, 4661114, 4148402, -9757092, -3420942, 1104344, -6987375, -1921461, 547608, 319438, +964757, -1072131, 4471598, -3148748, 3558917, 7322383, 7323993, -2119566, -4179540, -744640, +8249559, -466541, -428960, 66572, 824097, -4272956, 745714, 3471407, 533650, 828392, +3331821, -2191507, 2247879, 1304060, -891743, 5797669, 583579, 4611185, 923955, -1535451, +2024003, 3085397, 2669322, -126165, -4513474, -4114042, -5437966, -2420751, -177704, 13959, +-623307, 4064650, 3501472, -2628520, -5332739, 180926, 2791192, 3350075, -3256659, -599685, +3173444, -273267, -422517, 4209068, 1981054, 2000381, -1551020, -1340030, -235686, 1821066, +2712809, 71941, 2057289, 746251, 183610, 405338, 693637, 2522220, 1899986, 2837900, +-1419487, 1344325, 204548, 367757, -398358, 306016, 432181, 136365, 379568, -451508, +1363115, 1336809, -1219234, 337692, 765578, 844498, -392990, 2627446, 1023813, -379031, +-4952098, -14006962, -3583613, -4789963, 946503, 2252174, -2333778, -2864206, -26261040, 453119, +8477729, -6213207, -9817221, 7290707, -11116449, -1765232, -4966593, -5937793, -3627100, -3760781, +403727, 4385162, -814433, 2406792, -2844342, 3284576, -2585034, -4072166, 1749662, -1581085, +-6296422, -8119636, 3828963, 294742, 3778498, 1072668, 8467528, 1109712, 2926483, -4164508, +-7078106, -2138357, -3524021, 6963216, -3313031, 92879, 1810866, -3593814, 9841918, 6444062, +116501, -7950522, -9996000, -3476239, 3291556, -9087614, -253403, -4468377, -8590471, 702764, +-13435731, -3058017, -1458141, -5078799, 8981313, -649614, -1453310, -239981, 5611912, 7112466, +2130304, -7306276, -2369748, -1918777, 3848291, 1727651, 2192581, -4145180, -5206037, 3960497, +2721399, 926639, 1322313, -345208, 2273648, 552440, 3446175, 899259, 770410, -386010, +-146029, 466004, 2204929, 3114925, 1923609, -874563, 1233193, -4099010, 2027225, 2296197, +-717260, -425739, 689879, -994822, -298500, -311922, -1280974, -1386201, -754841, -471910, +706522, 1502165, -297427, -1938641, -60666, -2700998, 840740, 3492882, 1488206, 2026151, +1447941, 5503464, -14974403, -22257594, 2765959, -5159330, 4986994, -6305012, -10969346, 172336, +10168872, 1966558, 6255620, 4857071, 3886946, 2358474, -3506841, 2607045, 6772090, -10645613, +-4890894, -3612604, -2317672, 3755949, -822486, 1222455, 7027104, 5974837, -2422362, -6052146, +1445793, -3436511, -2486249, -5870147, -3949759, -8883603, 2168422, -3387656, -12885, 7689065, +-1498407, 1388348, 2122251, -5696737, 4761508, 4539781, 6560563, -5804112, 10323491, -1774358, +-7444789, -6444062, -8149701, 7549479, -2829310, -8824547, 2711198, -1443646, -6088116, 6447283, +8854612, -3135863, -7285339, 5352603, 1787780, 4175245, -579821, 11732777, 7011534, -7000797, +-3368328, -3354906, -2634426, 3853660, 5470715, 6924561, 42950, 834297, 2749316, -2881923, +2617783, -861678, 4590247, 6352257, -8691940, -3998078, -4356708, -2841121, -4452808, -439697, +-3142306, 1384053, -146029, -370441, -345745, 1083942, -2125472, 5383742, -658204, 2246805, +848793, 1053341, -1045825, 132070, 169651, 244276, -1826972, 309775, -1183264, -1992328, +-2868501, -926102, -158377, -550293, 120796, 273267, -574452, -456877, -1074279, -1071594, +1726040, -65498, 584116, -1258425, -20787104, 60666, -3834869, 1449015, -108985, 7893076, +5662378, 8173860, -1381906, 11122355, -5200132, 7590281, 9126269, 1777043, 9097278, 2063195, +2318209, -2483565, -998580, -3765076, 7202660, -360240, -886374, 10321880, 6122476, 188442, +2699924, -776852, -399432, 6749004, -3859028, -6485401, -60130, -814970, 3326452, -18514530, +11142756, 12175695, 4715874, 2451353, 270583, -5815386, -12461848, 8304856, -5049808, -5539971, +-3826279, 7467338, -5228586, 4648765, 4566087, -4301410, -2962991, -10611790, 4894652, -6863895, +4097936, 802085, 3666828, 6628745, 10365904, 4576288, -4837744, -11331734, -2054605, 7118372, +11431055, 8723615, -1772748, -2158758, -7405598, -12138651, -1330903, 8597451, 3751654, 2793876, +-2750927, 11373610, -413391, 3905736, 1060857, -2058900, 1036698, -5625334, -2824478, -2785823, +1888175, -1323387, -4129074, -2301029, -2859375, -2945811, 1205812, -4242354, -1838783, 964757, +732829, 3501472, 159988, 605054, 561567, -789200, 2739116, -740882, 3118683, 1262184, +-913754, -2277943, -139586, 3155727, 2138357, -248571, -2958696, -643708, 2594697, 2470143, +322659, -397284, -364535, -1648731, -1334661, 2077690, 7845295, 27154394, 14717242, -1217086, +2554432, 2506650, 5954972, 10805064, -1500554, 2214593, 18107582, 1966021, -788127, 11042361, +7626788, -7416872, 4505958, 1220845, 7298760, 5143760, -12563853, 9704479, -5807333, -695785, +1096290, 7630010, 1363115, 2168959, 5721970, 6679748, -6214281, 6859600, 20031728, -3384434, +9133248, 9489730, -4948339, 7476465, 1968169, -4662724, -5180805, 3707094, -4626754, -12288975, +-1578401, -428423, 1312113, -15770583, -3855807, 5051419, -10041634, -6628209, -16560320, 5644124, +7670812, -11191611, -4012573, -5317170, 12048457, 447213, -6837051, -4655208, -7617662, 4002910, +10089952, -6987375, 3911642, -2879776, 4884452, 11525545, 4811974, 9114457, 9140764, 11511586, +1774358, -6204081, -6315213, 4712653, 7230578, 1201517, 4870493, -4926865, 2072859, -460098, +-1542967, -5178657, 771484, -2206003, 344671, 4512400, 1878511, 1999844, 1509144, 4968204, +-2939905, 341987, -765041, 1598802, -524523, 336081, 2091112, 715112, -1651415, 2744484, +-521839, -3515968, 2338073, -2460480, -2070174, -2556579, -5496485, 3172370, -1226213, 2712272, +-248571, -344671, 788127, 4300873, 2822331, 3857954, 1760937, 132070, 1557463, 4421669, +-1673427, 4008278, 27974196, 7341710, 1273995, -1705639, -3891240, 74625, 5348845, -3476776, +-6295885, -9623411, 854699, 6706055, -8338679, 4073240, 5709086, -2483565, 18923090, 6548752, +-4543002, -3301756, -1279900, 6655589, -2649995, -6358699, -6766184, 4227859, -14924474, 440771, +-4122095, -5589363, 4938676, 976568, -5398237, -3495567, -5184563, 7423314, -2362769, -12006044, +-1334661, 188442, 999654, -6998649, -9616969, 834834, -1712618, -1403917, 3406983, -2144263, +9210557, 1799591, 5533529, -5897527, 13359496, 3771518, -6529424, 8699456, 16872242, -4894115, +-4037806, 8518531, 8021925, 3230352, 4913980, -10428717, -2677912, -11268384, 3374234, 10428181, +4829691, -13196287, -2592550, 4090956, -12896176, -20410758, -1690607, 604517, 5849746, 18413062, +1544041, -2165737, -5704254, -4433480, 2959233, 4624069, 3995393, -344134, 2143189, 121333, +-4022237, 2472828, 3244311, -5258114, -4918812, 5552319, -1826972, 3241627, 2552284, 1607928, +-1366337, 1152125, -96637, 1889249, 513249, 2899103, 116501, 2556579, 1858110, 536334, +-2370822, 5379447, 1755568, 4908611, -1016834, -1700270, 1829656, -3361886, -546535, 2316598, +-3105798, 765041, 1813550, 1065152, 1188095, 2617246, -1038845, -4866735, -62277, -539555, +-5127654, 723702, -2156074, -637266, 2048163, 1656247, 1856500, -21657372, 10212358, 28646358, +-11752104, 20084878, -4503273, -4406637, -6259378, -10474888, 7765838, 227096, 5313412, 5146982, +-18817326, 178241, 8804683, -7718056, -4014721, -11950747, 21041044, -13184476, 10392747, 9706626, +-12488691, -5233418, -4346507, 8736500, -9990094, -4165045, 10204305, -1858647, -2711735, -5047124, +12439299, 2103997, -1997160, -5196911, 340913, -9543417, 10254234, -1306744, 4722317, 25450902, +17154636, -14803142, -10396505, 3915937, -1318018, 10587631, -5866389, -8725226, -3057480, -16134582, +-6180458, -2008971, -12304008, -7144141, 27313308, 6404870, 102542, -1453310, -296890, 7923141, +9624485, -2145336, 9505836, 645319, -5216775, 908922, -14566918, -1218697, -13499082, -7413651, +8136279, 11793980, -17901960, 7137162, -4589173, -5812165, 8671002, -1402307, -8243653, -603443, +-3234110, -6591701, 3305514, 2259153, -4511327, -11248519, -5359583, -1250909, -885837, 8645232, +2597918, 2059437, -4792110, -54761, -1981054, 4573067, 5254893, -2950106, 2237141, 3839164, +4318053, 3270081, 4910758, -2085744, 326418, -3522410, 251256, -4081293, -2121714, 1374390, +-1114544, -3320010, -778463, 1556926, -5294621, -2727304, -2886218, -1714766, -2042794, -2527588, +-333934, 2835752, 189515, -369904, 3373160, -23025320, 4034585, 21110838, -5476084, -5546951, +4694400, -6721087, -5275294, 5864778, -700080, -1323387, -163209, -14542222, 24553792, -26131654, +-2412698, -725850, 8997956, 5230197, 406411, -10001905, -7010997, 2980171, 19187766, -1684164, +-8339753, -5890548, -13475997, -1055488, -7882876, -6467684, -2713346, 4119411, -374736, 504122, +-9104794, 1714229, 2681670, 5738077, 4958540, 5778342, -12387223, -75162, -2470680, 8058433, +2146410, 16485695, 3663070, -3978750, 1539209, -9169218, 1611, 7126962, 9435506, -14394046, +-10995116, -1166621, 14952392, -23412940, 6184753, 26756036, 14850386, -7312182, 2555506, -14570677, +6165426, 13159780, -22660248, 4966056, -11004243, -3244848, -30746060, 44560, -12911745, 11902428, +901406, -14430553, 9594420, -1024887, -18396956, -2572149, -11606075, 7514582, -6432251, -9753871, +13214004, -2641942, 2407329, -4479651, -5616744, -1658931, 5694590, 4097399, -3073586, -896574, +320512, -3351685, 2126009, 3092377, 4730370, -4794257, 1939715, 2392834, -5487358, 254477, +2542084, -4093641, 476741, -2683281, 6263673, 3212099, 7603703, -3651259, -2709588, 2422362, +-7058242, -852551, -1956895, -1214402, -274341, 1429687, -3914326, 170188, -433792, 1317481, +1483911, 167504, -3946001, -2408403, -6229850, -17361868, 27473296, 8081518, 14374182, -16176994, +-18252000, -3233574, 4815732, -4937065, -2457258, 9371619, 2517388, 3019899, 8137353, -20071992, +-2226404, 431644, 5132486, -13905493, 1840930, 2563022, -9796820, -5233418, -13491566, -9965935, +-75699, 4507032, -10916196, 993211, -4947803, -9525701, 3770981, 153008, 7750269, -21265994, +-22388054, 4819490, -1920924, 8578123, 18781356, 2255932, -11812771, 16940424, -8363912, -15625091, +-12147778, -5047124, 1350767, -16602733, -6466074, 16595217, 22348862, 9554692, 6264747, 4784057, +-2572686, 14355391, 8057359, -16504486, -9055939, 202937, 1672353, 15700790, 10034117, 2607045, +-2383707, -1823751, -7635915, 10457708, 8138963, 18105972, 4134443, 5348308, 2208687, 32430224, +3687230, 12626130, -13356811, 1254131, 12313671, -29195578, 2426657, 3974992, 8279087, -2938831, +4415764, -3728569, -965294, 5127117, -2403571, 15628849, -6205691, 9178882, -2368138, -5410585, +-2924336, -5859946, 199716, 2532957, 3078418, -1138166, -2969970, 6576669, -1911261, 4435628, +-2275259, -2377801, -4694936, 4967130, 5341866, 1232656, 537945, -3872987, -6830609, 3296924, +-569620, 310311, 8181913, -2208150, 7171522, -1016297, 4202626, 2915209, 5529771, 1326071, +-5063230, -883153, 18686328, 1072131, 23179938, -991064, -10548440, -11817603, -21633750, 3754338, +-9109089, -834297, 1884954, 7561290, 11385421, 18956376, 19914152, -3316252, 17728552, -1557999, +-1522566, 6455336, 14939507, 6254010, 4190278, -23995446, -12182138, -19558744, 9799505, 19105088, +3768297, -8602283, 13519483, 19164144, -2617246, 2769717, -4535486, 16073378, 13797582, 11460046, +-6920266, -12551505, -1952600, -3438121, -27386858, 4535486, 3752191, 2197950, -6961068, -3879429, +-30544196, -11054172, -27723478, -5097053, -20761872, -11005854, 20029044, 5071283, 21100638, 1160715, +-17272748, -8644159, -17973902, -34580392, 4851166, -21459804, -6190122, 20022600, 8455180, 7738994, +1672890, -4075387, -1479616, 3764539, -14783814, 11644730, -25222732, -26214870, -1441498, -2421288, +-3246995, -19304804, -4342749, 25081536, -1378148, 1397475, -6736656, -22023518, 11116449, -14856829, +-5778342, -14788109, -9058623, -6985228, -4675072, -5413807, -3258270, 216359, 2595771, -13834627, +-5907191, 2528125, 2455111, 7556995, 3587908, -4669167, -5780489, 4904316, -9269613, -1504312, +2867965, -7197292, 2250563, 2066953, 5163625, -4941897, -1690070, -2675765, -376883, 3349538, +-2030983, -384400, -2725157, 5379984, 7540889, -2560338, -1216013, 1965484, 2532420, 4671851, +6682432, 1163399, -1137630, -1671816, -1585917, 10853919, 21787832, 19012746, 20429548, -11764989, +-20550344, 15808164, -9356049, 16337519, 4874251, -26181046, 6579890, 4905390, -29532732, 15887084, +-13463649, -13712757, 8042863, 9001715, 1403381, 10681047, 800475, 554588, -6928319, -3974992, +6475737, -4076998, -10125922, 701690, -19022948, 6896107, -24181202, -14676440, 898185, 9617506, +-3301219, -9973988, 3750043, 7591355, 5630702, 468688, 19473918, -44736916, -10165114, -12233677, +-14868640, 19446002, -15658914, -2114735, -36107792, -10073846, -4290673, 1910187, 24074902, -5781026, +3042984, -14510547, 12208981, -18060874, -11719892, 9431748, -41926396, 6132677, 22403624, 29135984, +22225918, 14107357, 32724430, 18108656, -396748, -8062728, -8408472, -12625593, -28227598, -3025268, +2631204, -39877696, -15800111, -12030740, -9016210, 12814035, 33429878, 39101920, 25865904, -13070122, +10666014, -8411157, -1840394, 8886287, 6003291, -3365107, 2103997, 2954401, -787590, 1389422, +-6152541, 3560528, 10958072, -5114233, 1453846, -9627706, 2367601, -4485020, -670552, -428423, +8459475, 15068356, -5400922, 991064, 3640522, 6167573, -9102646, -14009646, 250182, 10999948, +3164317, -8915815, 8382703, 4475356, -9134859, 6444062, 4060355, -3450469, -2819646, -915365, +-1726577, 1709934, 3388192, -3137474, 6109054, -38489888, 119185, 6360310, 27023398, -8819178, +12537010, 11294690, 6050535, 6155225, -41941968, 33122250, 18154826, 41051836, 15176267, -1802276, +-15173046, -9707163, -9463960, -14892262, 10719701, 7801808, -15010374, -17186848, 9186398, 12321724, +21563958, 6011881, -13220983, -19906100, 4329864, 3374771, 1488743, 2393371, 38221452, 12902082, +7401840, 12553116, 13907641, 15519864, 481036, -24169392, 17143898, 53159884, -5303748, -14799920, +-32219234, -6948184, 42991548, 5017059, 17869748, 5946382, -59122908, 12233677, 10774462, 1255204, +6229850, -4134980, 1050120, 12103218, -31758598, -13227426, 27217208, 10059887, 3858491, -24003498, +17314086, 6386080, -21495238, -23477364, -15617575, 21536576, 44900124, 41663332, 46028628, 46547780, +2018635, -20691542, -16874390, -40647032, -13166222, 12895639, -32833952, -257698, -26718992, 404801, +36338108, 14137422, 15082851, 18002356, 11399380, -10976863, -3469797, -13545790, 19855096, -11832098, +-10287520, 3606699, -2072859, -7010461, -12786655, -3714073, 13606993, 12682502, -5668820, 19578072, +-681289, 568546, -8614631, 2954938, 10309532, -2468533, -7428683, -7364259, 5270999, -4037806, +11252277, 7027640, 9163313, 13087302, -12999792, 3465502, 1414655, 6052146, -2487860, -5583995, +11969000, 2898029, 9824201, -5054640, 3769371, -7704635, -2285996, -11889006, 19034758, 38774428, +-78578576, -27715960, 6136435, -45901388, -42101952, -18212808, -25567404, 2929168, -18826990, 49820548, +-5297842, -17626008, -7151121, -38094748, -10564546, -30731564, -12809740, 5417565, -39675296, -6604049, +30729418, -25687126, -7409356, 8917963, -152471, 12885439, 2690260, 110059, 11461657, 4320737, +-19713900, -3622805, 17548162, -8797704, -24554864, -7990787, -29777008, -14581951, -52161304, 5174899, +-35532800, 17249126, 6345814, -12934831, -46012520, 4361003, -4903242, 56802552, 22531936, 1154809, +30766998, 13450764, 284005, 25130390, -29513942, -13921600, 2204929, 22240952, -24447490, -14734422, +82184736, -7753490, 42569032, -33089502, -81068, -23611582, 17865454, -8319352, 27870042, 43858596, +1162326, -30967788, 26590142, -32999308, -15007689, 11155104, -34294240, -22908282, -10935524, 24923696, +47547972, -56572772, 47668768, 9543954, 13936632, 5266704, 6692096, 5080410, -7039989, 8616778, +24693378, -12486544, 4334696, -2426120, 3226057, -26801132, -4811974, -8214662, 8082592, 8262980, +26381300, -16485158, -9550934, -12854300, 18306224, -23401666, 5632313, 8602283, 7942469, 8674223, +-38513508, -9199283, 13893682, -6659347, -16456704, -2194728, 4549981, 939524, 16330539, 8227547, +12965433, -13020730, -11560978, 13093745, 3874061, 8783208, -8665633, 8834748, 6081137, 1622961, +3328600, -3706020, -3988414, 108985, -19028852, -18533858, -29606284, 61269856, -35167728, 22497576, +20187420, -31967442, 17576080, 9595494, 6972343, -5711233, 24314346, 12493523, -30752502, 21843130, +25536802, 4926328, 4403952, 15374909, -310311, -30677340, 39950176, -22765474, 9117679, -16930224, +-3799436, 5006322, -7358353, 32476396, 7411503, -4291746, -7694434, -1695975, 6483253, -33049774, +10604274, -17128330, -11450920, -7923141, 56908, -16206522, -7576859, 3955128, 34461744, 386010, +-7046431, -21846352, 9290551, 6060736, 1177358, 26659398, -6311455, -2746095, 31857920, 9997610, +2024540, -30537218, -15814070, 19770272, 11226508, -28596966, 1111860, -65038688, -32032402, 58401356, +-13461501, 31618476, 41566692, 11822971, 7261179, 18781356, -7751879, -22788022, 12516608, 3920768, +-1237488, 26405458, 17375290, -18835042, -45175004, -9322227, 18788872, 5988795, -818728, 14825153, +-16876000, 25588342, -12188043, 9641665, 12212203, 5321465, 17816062, 13382581, 21541408, 2523293, +-5161477, 7796440, 20921860, -5264556, 18379238, 10925860, -11249056, 3764002, 9982041, 6578280, +4379256, 13055627, 11265699, 4880157, 22042310, -6688875, 2983929, -2959233, -851477, -5328444, +19699942, 15977815, 13294534, -5825050, 3061238, 22707492, -5202816, 16690780, 15553150, 199179, +26611618, -23225036, 4100620, 35631048, 5399848, 10209137, -6466610, 25121800, 5789616, 9629854, +34842384, -10768557, -58167280, 9878425, -6992207, 20031728, 6152004, -19738596, 10251013, 12007118, +-22466974, -24697136, -16506096, -41233832, -41475964, 28566364, -6589554, -42634528, -13049184, 4384625, +14139569, 13525389, -26096222, -28303298, 2813204, 39438536, -18822158, 15240691, -26489748, 9456981, +-29887604, 19518478, 20595978, -14630269, -30758946, -21143588, -3400540, 12128451, -13183939, -8664560, +-10970957, -39120172, -33819648, 17804786, -28387586, -5753646, 10162966, -23408646, -37869800, 14540612, +19926500, -2467459, -45597520, 20491826, 17945448, 57795764, 303869, 15243376, 11334956, -24551106, +9476845, -7554848, -49842560, -7525320, 30524870, 7379291, -25200184, -62459560, 39560944, 50662896, +-14993731, 41015328, 47590920, 2610803, 2175401, 37760280, -24330990, 2069101, 62978716, -46225660, +27008364, -39557184, -10908143, -3017215, 27118960, -8971113, 3940096, 15458124, -479426, -34931504, +38763692, -6755984, -4560719, 6256694, 16173236, -26141856, 11563126, 7144678, -4020626, 8419747, +9391483, -24145770, -3365644, 6116571, 12834436, 27194122, -2320893, -23051626, 11873974, 27946816, +-21949430, 27295590, -12792560, -2335389, -9533754, 30771830, -21023328, 7738458, 18751290, -12465606, +4590247, 3962644, -17594870, 4473746, 7329899, -2618320, -13440026, 9334038, 10749229, -5385889, +21580064, -32021128, 7811472, 10424422, 146029, 2864206, 4154844, 22796612, -5309654, 12883828, +-26446262, -82738784, 22180822, -9375377, 61703112, -21123722, -13872207, -24698210, -71238472, 32631550, +-41631120, -24023900, 987843, 61740, 54465016, -39031052, -27709518, 36183488, 21171504, 18918258, +-7095823, 18072686, -12996571, -17952426, -16931834, 42378444, 34855808, 55059332, -17807472, -20495584, +652298, -3558381, 19858856, -33033130, 6766721, -34731252, 18250390, 34170760, 11373610, -28059022, +18804978, -24739012, 55433532, 28432684, 7538742, 7536057, -8982387, -43734580, 24354612, -59338732, +12021077, 11054172, 28614146, 23010824, -51654496, 15452755, -32688996, -19184008, 13560285, -5110474, +18724984, 12228846, -47286516, 19128174, 42640972, 56893820, -16945256, 16780974, -23678692, 39906688, +-57200912, -3051038, -10785200, 17864380, 36893232, 53561464, -43386148, 10619307, -57908508, 36845988, +75211320, -19312858, -52052320, -4246649, -39381092, 49588620, 12124693, -25489558, -7672959, 2763812, +-8999567, 35358320, 12858058, -20198158, 18585398, -28549722, 1328219, 26478474, -6089727, -32901596, +35751308, -52405044, 14595373, -8072928, 20325932, -1514513, 12410845, -12249784, -7008850, 5093831, +4015258, 5311264, 24193014, -25580826, -21875342, 929324, 5123359, -6117644, -27030376, -19605452, +38100120, 10151692, -17823040, -20142322, -44806708, 52586504, 40779640, -16448651, -14816027, -31188442, +523986, 39176544, 6932614, -16959216, -6606197, -9154186, 5728950, 3877819, 1476395, -5181878, +-2567317, 7073275, -1131187, -4376572, -3366718, 4583804, 1416802, 9460202, -4684736, -66025460, +47392816, -6887517, -975494, 14627048, 13820131, 17579302, 5956583, 8176007, -22106734, 20938502, +6767258, -24191404, 16583942, -10105521, 426812, 20453708, 13108240, -34077880, 19489488, -16546898, +28512678, -20983062, 7806640, -11110544, 13691819, -10626823, 6720550, -15436112, 32673964, -3612068, +1657321, 8701067, 11476153, -16936666, -2579128, 6507413, 11420855, 8931921, -10427107, 3265786, +1250372, -33170570, -1910724, 7632157, 12701292, 4417374, 8422431, -29917668, 5424544, -2461016, +3723737, 5942624, -4986457, 5577552, 5646809, 1985349, -6263136, -7348152, -1462973, 32981054, +-11077258, 5951214, 13331042, -7831336, 12725451, -14331769, 12294344, 5203353, -8289287, -14418742, +9376987, -9160092, 7528004, -13051869, -9797357, -5640903, 16310675, -4791036, 2298881, 2305324, +-312996, 2892124, -11470784, 8485782, -7109782, 19600084, -18173080, 8049306, -10507101, 9322227, +-8426189, 7282117, 1060857, 12947179, -11110007, 5584531, -5270462, -175020, 3288334, 7257421, +-7727183, 1115081, -8400419, 12192338, -10120554, -3979824, 7504919, 1777043, -4483409, -2537252, +8376260, 3994857, -17219598, 9157407, 1796907, -870268, -1003949, 2674691, -1345399, 934155, +-478889, 1340030, 1538135, 3704946, -4183298, 11914239, -15506443, 4250407, -2011655, 2531883, +-2132988, 3706557, -1333587, -2991445, -562104, 1373316, -3438121, 51835424, -3731790, -16790100, +-25591026, -11638825, -14362371, 18807124, 10884521, -13673565, 1147830, 1612760, 6152541, 845572, +13032541, 4497905, 10267656, -3514357, -358093, -3074123, 4820564, 11123965, -10310606, -60130, +-5095442, 369367, 13571023, -7682623, 1337882, -3467112, 5358509, 2766496, -7418483, -2747169, +7999377, -2440615, 13031468, 9266392, -13553306, 4364761, 2902861, 7136625, 3036542, -12816719, +8711804, -2386928, 8474507, 6774237, -15289010, 4220342, 75699, 3467649, -1677722, -6708739, +10954851, -2663954, 4991826, 282931, -3244311, 5078799, -6483790, -891743, 9147207, -6233608, +-7470022, 15209553, -9762461, 14191646, -1432909, -11445014, 23520852, -21525840, 18786724, -6614250, +-11185705, 11904576, -10987063, 3304441, 3875134, -10765336, 9146670, -1909113, -643171, 5844914, +-7455527, 9865003, -3128347, -716723, 2479807, -1636383, 3511673, -1604170, 616865, 2909304, +-2704756, 4627291, -471910, -2565706, 5703180, -8694624, 4712116, -3840238, -1726040, 5498632, +526670, -1593433, 2901251, -2024540, 2882997, 1483911, -3974455, 2766496, 629213, -865973, +-610422, 2506650, 609885, 4582730, -3483755, 1345399, 668404, -2498597, 5105643, -1392643, +-704375, -25298432, -43661564, 55049668, 157315520, 24978456, 15157476, -114990768, -142377088, -45506788, +-28068686, 96324304, 146695680, 75618808, 21789980, -49328772, -106307416, -96799976, -81243600, 6495601, +121512680, 101782136, 58229556, 19874424, -52140368, -67434208, -53709640, -51753284, -18371186, 24640764, +33679524, 69919920, 49918796, 12196097, -17032230, -9906342, -56323128, -27259620, -28508382, -38434052, +22825066, 43255152, 24890410, 62943284, 16614007, -14875619, -24247238, -41751376, -33130304, -5116917, +-10304700, 12896176, 25936234, 23242216, 16481937, 11341398, -5804112, -22898082, -16314970, -19034222, +6067178, 22327924, 7266548, 5529234, -9746891, -19909858, -3813394, 10201, -367757, 16230681, +14410152, 16268799, 6324876, -5528160, -17451526, -25116968, -25837450, -16699907, 17784922, 26491896, +32720134, 22734872, -5778342, -12766253, -13680545, -26926224, -11989938, 9904731, 5115306, 4945118, +7796977, 3835943, 2946348, -4123169, -5485210, 4315906, 9302362, -140123, -880468, -6396817, +-8946417, -4558034, -5461588, -3112241, 6880001, -1168231, 14466524, 18000744, 10307922, -6157373, +-10259066, -11367705, -14500883, -10495289, -14350559, 7701950, 19622632, 18016314, 10569915, 11274826, +4184909, -10974178, -21633750, -22013854, -11273215, -2219424, 6925098, 15789374, 23040888, 19011136, +3513820, -12138651, -20381230, -14836965, -4997732, 207769, 5508833, 3605625, 8662949, 11211475, +3253438, -4759361, -6631967, -3634616, -2797098, -2614025, -810138, 856846, 5131412, 3191161, +310311, -6979, -373662, -967978, -2421825, -2735894, 886374, 2241436, 1613297, -320512, +-107374, -259846, -778463, -897111, 475131, 438087, 727460, 233002, 355945, -464930, +-589484, -1054415, -642098, 246424, 1287953, 281320, 518080, 476741, 131533, -660351, +18254, -678605, -1860795, -1241782, 1226750, 1447941, 1504849, 761283, 38118, -990527, +-404264, -636729, -335007, -603443, 261993, 47245, 219580, 94489, 739271, 363998, +710817, 58519, -84289, -674847, -530428, -1053878, -476205, -245350, 821413, 700617, +1255204, 605054, 204548, -974421, -830539, -923955, -242666, -271657, 722628, 524523, +583579, -68719, 97174, -347892, 54761, -282394, 124017, -255551, 161598, -164819, +217970, -199179, 176094, -146566, 273267, -143345, 193274, -186831, 167504, -221728, +181999, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -2850785, -10916733, 1292248, 2952253, 1063004, 1553168, -2618320, -6614787, -1257889, 3488587, 1264868, --3275450, -440771, 2668249, -670015, -3941706, 1207960, -4541928, -2793339, -142271, 1270237, --1291711, -1003949, 2814277, -3893388, -93416, 519691, 1894618, 1524713, 1442572, 4807679, -2161979, -5923297, -1514513, -2679523, 755377, -129923, -446677, -3719979, -4877472, 6490770, --2980707, 1606318, 1886564, 1646583, -6131066, -3461744, -1602023, 703301, -475131, -164819, --557272, 1061931, 2346663, -3180423, -537, 1748589, 2009508, 2418604, 887985, 74088, -2321967, 851477, -995359, -264141, 3765076, -2756295, -2939905, -1559610, -1173600, 3241090, -1906429, 797253, -1188095, 3125663, -1368484, 1636383, -3645354, -314069, 292595, 795106, -769873, -2916283, 810675, 2124935, 1063541, 390305, -252866, 2770791, 1315871, -237834, -1766305, 1079647, 470299, -361851, 603443, 510564, 397821, -481036, 683974, 228707, --530965, -395674, 966905, 250719, -71404, 54224, 59593, 202400, -860067, 676457, --223338, 541166, -668941, -6176700, -3781182, 2685965, -6119792, -8559333, 1632088, 776315, -1020592, 1293859, 1169842, -7354058, -1248225, 2182380, -4728222, 4960151, 4745939, 4143570, --1703491, 412317, 1069447, 3180960, 674847, -73014, 576063, -2105071, 1941862, -739271, --823023, -972810, 6028524, -3590593, 2057289, -2255395, -2014340, -2022393, 1566053, 3352222, --3590056, -1736777, -1966558, 2461016, 2241973, 3722663, 2462627, 522375, 3188476, -2727304, -1897302, 767725, 796716, 6804839, 1554241, 3377992, -5611375, -1475321, 2244657, -2756832, -2589329, -1177358, -2097018, 750009, 4016331, 2767033, 1824824, -971200, 781147, 3054259, --3719442, 4861366, -711891, 3987340, -1663763, 3293166, 3852586, 3310346, -1890859, -4859219, --7256884, -4845797, 415538, -2533494, 4702989, 807991, 689879, 1291175, -3452080, -1034013, --1583769, 1725503, -976031, -637266, 2038499, -2544231, -962073, 1028645, -1479079, 132607, --1644973, -1253594, -1064078, -271657, 933082, 284005, 117575, -1731409, 10483478, 7463043, -6187438, 5075041, 5805185, 2392834, -417686, -171262, -2105071, -683437, 7623030, -3357054, --3378529, 5189394, 3920232, 4986457, -3486440, 1475858, -1298691, 1088237, 2273648, 3092913, -490163, -2345052, -1675574, -3003793, -1026497, -1876901, -5354214, -705985, 4558034, -3581466, --587874, 1620813, -2748242, -2567317, 2587181, -1440962, -3571265, -1983738, 2070711, -3129421, --3933116, -1862405, -1153736, 1275068, -2739116, -5777805, 424665, -1002875, -782221, 1595044, --4675609, -2347200, 103079, -2020782, 2603287, -719407, 1132261, -8485245, -2538863, 4708358, --1864016, -4699231, 1396401, 762357, 1320166, -1787243, -6669548, -3093987, 7530152, 450972, -2782602, 1529545, -1069984, 2230699, 3142842, 1255741, -1547262, -3659312, 1074, 834834, --2717104, 1170916, -3525095, -424128, -2246268, -1163936, -2976949, -630286, -1700270, -2226941, --1667521, 266825, -741419, 321049, -814433, 233539, -1504312, 1012002, 576599, -477278, --278636, 1334661, -36507, -568009, -1341640, -751619, -612570, -166430, 120796, -32212, --1549410, 14756971, 9152038, 8559333, 212601, 813896, 747861, -3572339, -7780334, -3004330, -5980205, -4515621, 2741263, 7962870, 707059, -2573759, -939524, -1657321, -786516, 3201361, -4663261, 131533, 1418413, 1846299, 3061775, 150324, -4150012, 1269700, -6725919, -2072859, --796716, -1914482, -1171989, 820339, -1563368, -3586835, -2716030, -1305670, 353798, -1551020, --4056597, 4873178, -1777580, 337692, -1213865, -3226057, 4075387, 11166915, 2749853, -3904662, -6665253, 1499481, -1988570, 2002529, -1097364, -4318590, 64961, -1816234, 1714229, -3741454, --6417755, 245887, 1116155, -7844758, 2383170, 1613834, 4420058, 2480344, 5827734, -1966558, --3865471, -2299418, -1175210, 2813741, -991064, -5042292, 3475702, -2460480, -4543539, 3126199, --4538707, -2508798, 1487669, -1657857, 1626719, -1093606, -1849520, 1518808, 3926674, -898722, --1872069, -695248, 38655, 1363115, 2773475, 787053, -754841, -1016297, -957778, -329639, -690953, -1973538, -649614, -578747, 3038153, 1526324, 2163053, -351650, 209917, 1644973, -1147293, 797790, -46708, 283468, -299574, 854162, -511101, -406411, -7558069, -12109660, --3636764, -6091338, 8691940, -2035278, -996432, 3166465, -7908646, -5680631, 4840428, -3928285, --3527779, -266825, -268972, 780073, 3206193, -1395328, 1488206, -2148021, -1491427, -219580, --1314260, -3563749, -261993, -823560, 3697430, 3617436, 3288334, -4400194, 2057289, 1388348, -6096706, -3125126, -178241, -2151242, -4581120, 6512244, -6206765, -3148748, -2390149, 1475321, -5513128, -5142687, 5701032, -693637, 3092377, 4634270, 806917, 3553012, -6694781, 1402844, --2500208, 266288, -7094749, 51540, -2420751, -6470368, -4870493, 300111, 4750234, 163746, --3399467, 5281736, -1808181, 3020973, -388158, -6716792, 9313637, -5879274, -1115618, -3382824, -2351495, 3678103, 2526515, 3386045, 7544647, 5644661, -928250, 1107565, 3578245, 2143726, --2645163, 3723200, 3002182, -656056, 1718524, -3839701, -5136244, -649077, -1637456, 2803540, --3001645, -729071, -2885144, -773094, -1312649, -535260, 894964, 974958, 616328, -233002, --709743, 1637456, 906775, -1908576, 1322313, -24159, -4452808, -510027, -1591285, 2444910, --666257, -416075, 948651, -605590, 904091, 1888712, -120796, 1182190, 1400696, -389768, -528818, 2706366, 467615, 3145527, -8428336, -12265353, 1467805, 920734, 787590, 7741142, --2435783, -8636642, 1008244, 894427, -2148558, -590558, -7402913, -1582159, 1040456, 1016297, -8506720, -1569811, 7634305, -1919314, -1837709, 529892, -7366943, 3089155, -2711198, 4451197, --1154273, -2022930, -2670933, -1457605, 371515, -5688148, 9766219, -6797323, -10759430, 3146064, -603980, -7732015, -2150705, -14745160, 357019, -5318244, 32749, -5765994, -4489315, 689342, -623844, 2417530, -4527433, 3591667, -5122286, -10217190, 1308354, 2691871, -2960843, 3204583, --1630477, -5719823, -4838818, -6932077, -3135326, -838056, 1220845, -2153926, 6432788, -93416, --1874753, 435939, 484794, 1202054, 1087164, 627065, -5972152, -5797132, 1305133, 3905736, -2478733, 546535, -1239635, 4878009, 2849711, -2452426, -1620276, -5719823, -2212982, 2371896, -1275068, -3177202, 1326608, -978179, -806917, -1559610, -1672890, -741419, -2238215, -1899986, -1053341, 329639, 1487132, 2269353, 279710, 1972464, 193810, -1529008, 2085207, 1111860, --316754, 151398, -1056025, -1285269, 53687, -41876, -1194538, -88047, -306553, -207769, -70867, -428423, 1384590, -2243584, -250719, -777926, 188979, 566936, 1416802, -105764, --18823768, -4697621, 721018, -4778688, -3532611, -5983427, 1520418, 2124398, 4248260, -3215320, --4041027, -4523675, 2234457, 5068062, -2552284, -2152316, -1321776, -767189, 2362769, -10472741, --2625299, 5932424, 1893007, -3061775, 1083406, 5254356, -554588, -1330903, 1795296, -323196, -12826383, -5529771, 3106335, 1041530, -5461051, 1788854, 1167694, -6159520, 4309463, -8754754, --896038, 7756711, 1658931, -221191, -1677722, -5984500, -5217849, 1385127, 3286187, -2251100, -1575716, 6425808, 3134789, -2664490, 3910031, -5698348, -13460428, -1772748, -5940477, 3732327, --3824132, 9526237, 4717485, -437013, -1615982, -12349642, 3842385, 4721243, -3841848, 7547868, --5917928, 2303176, -9881109, 4560182, 3393561, -11192148, -7176891, -2296197, 2710661, 3716757, -8102456, -1133335, -447750, 5293547, 1173600, 26307, -2416993, 1210644, 1173063, 1588601, -1682554, 431107, -271120, -1021129, -1212791, -3022583, -2562485, 2005750, 1371705, 1030255, -2441152, -1016834, 1151051, 1264331, -688805, 2139431, -340913, -27917, -565862, -2438468, --585726, 2786360, 574989, 2065879, -826244, 751619, -1154809, 3311957, 262530, 2775086, -1177358, -1381369, 673773, 4627291, 8022999, 18249852, 19654308, 3840238, 5960341, -23622, -2896956, 98784, 2167348, -5307506, 2537252, -3327526, 4443681, 4030290, 10181757, 1481764, --1920924, 6241661, 4669703, 7523172, 494995, 4656819, 2867965, -2405719, 2486786, 11236171, -1923609, -4939750, -2502355, 8302172, 5300527, 3964792, 7907035, -6036577, 2467459, 9212168, --9096741, -11087995, 3785477, 5864778, 9762461, -4219806, -7039452, 5776731, 2255932, -919123, -3764539, -1503775, -730681, -97711, 13846438, -4994510, 2929705, -3344169, -1967632, -1651952, -7298760, -981937, 16099148, 7610145, -7492034, 8876087, 2106682, 4122095, 2081985, 1906429, -2341831, -2945274, 5549635, -12634720, -3157875, 5747740, -12666395, 4376572, -10199474, 2418604, -11636677, 2815351, 106837, 3132642, 1277753, -3097208, 962073, -3289408, 569083, 2630131, --7524783, 4416300, -1206886, -1842541, 718870, 2391223, -1823214, -3078955, 1242856, 2782602, --1263794, -2600603, -2353105, -1501091, 1283658, -1832877, -1431835, 1742146, 2640331, 1142461, --1059246, 1590749, -918049, -3963718, -1571421, -46171, -1793149, 1153199, 1058710, 1685238, -2946885, 3993246, -1638530, 5625871, -1717987, -3249680, -867583, 2013803, 680752, -3300146, --1905355, -2389076, 30449708, 5063230, 4958003, -9058086, 13241384, -4532801, -370978, -3629784, -924492, -8679592, -445066, 3811247, 1151051, -7107634, 8804146, -2269890, -4271345, 1051193, -2893734, -9092446, -12312061, 4999342, -4970888, -7576859, 1647120, -226023, -3602404, 6331856, --6373195, 1981054, 6534793, -1307818, 9433896, 2727841, -11515881, -12422656, -5040681, 610422, -2421288, -9854266, 3690451, 3338800, 2033667, 2932389, 4463545, -10234907, -4823249, 2736968, --11017665, -4234838, -73551, -11789685, -6025839, -4149475, 2546916, -6125697, -12426414, -6162741, --6548752, 14446123, 7260106, -1371168, 2197413, -4095788, 11824045, 13777718, 1765232, 9176198, -7017977, 2517925, 1880122, -5575405, -973884, -4945655, 6976638, -9099962, 502511, -2327872, --13488882, -4329864, -1771137, 7248831, -6572374, 3542811, 3402151, 1209033, 919660, 3037079, --3067144, 2385318, -1767379, 2668249, -517007, 4035659, 1444720, 171799, -2007360, -1014686, --5138929, 2673080, -531502, 4350265, -4153234, -204548, -238908, 2512556, -263067, 2222646, -1242856, 1117765, 1505923, 482647, -2709051, 3180423, 4522601, -2394444, -2884071, -3840775, --1287417, -444529, -1086090, 160524, -755377, -20623896, 13919989, 22358526, -16778826, -9985799, -4594005, 4010426, -3416110, 7342784, 1981591, -6255620, -7655779, -163209, -2474438, -5462125, -2769717, -2517388, 333934, 6171331, -8342974, 1737851, 1089311, -4954782, 680752, -7861401, -1503239, 11498164, 5843840, -1173600, -3733400, -965831, -6607807, -7022272, 3408057, 5799817, --1874216, -3249680, -2332704, 3456375, 5764383, 2756832, 10593000, -5754183, 4334159, -2790655, -1003949, 6600828, -2431488, -2134599, -12702903, -1976759, -9848360, 4888747, 3314641, 12563853, --10854993, -4024384, -10509785, -17253958, -2947421, 7134478, -11944841, 2588792, -1377074, -8723079, --10288594, -12942347, 17243220, 598611, 10212895, 7500087, 8664023, -4012573, -11584601, -8776766, --10848014, 3701188, 8369281, -8134131, 3730716, 8941048, -6178311, 962073, 7221451, 8322036, -1932735, -3082713, 3511673, -1582696, 1831267, -9029095, -912144, 3351148, -3131568, 1060320, -459025, 294742, 1902134, 3280281, -3643206, -1361505, 1949378, 2906082, 736050, 1357210, -2825015, -739808, 3058554, -2783139, 2055679, 3095598, 3457449, 278636, -1480153, 2673080, --2406792, 565862, -649077, -2070174, -1097364, -2048163, -660888, 758062, -2511482, -6682969, -2154463, 3420405, -16327855, 11842835, -1662152, -5870684, 9785009, 3703336, -9924596, -13749264, --5585605, 205085, 73014, 831076, -5178120, 15977815, 6336151, 4930623, 3427921, 5120675, --5043902, 1337346, 2910914, 2448131, 13975287, 1611150, -21422760, 2733210, 8568460, -7781407, --12159589, -2406792, -6721087, -3710315, 732292, 15081778, 8706436, -1417876, -611496, -4420595, --13388487, -4345433, -11110544, 7820599, 10300405, 216359, -6162741, -2065342, -2719251, 4923643, -6443525, 7215008, -16821240, 3250217, 268972, 1517734, 11183558, -6650220, 4394826, -6068789, --4723391, 1257352, 7199976, 13573170, -2469606, -8716636, 2506650, -15724412, 12253005, 6820408, --1895154, -6486475, 3060701, -3621731, -8124468, -6455873, -7402913, -3357054, -1836099, 483184, -6306086, -5092221, 17968532, 766652, -3154117, 1049583, 5096516, 239444, -586800, 5932961, -3709778, 3048890, -159451, -2907156, -2624225, -715112, -803696, -2695629, -7841000, 3898220, -3336653, -2856690, 625992, -4180614, -3496640, -1484448, -1220308, -170725, 6142877, -1420560, --2477659, -1139777, -808528, 3947612, 6871948, -2472828, 3658775, -1200980, -5007932, 5180268, --5392869, -4106526, -3093987, -4151086, 401043, 2988224, 1121523, 3059091, -425202, -1333051, --776315, -3413962, 1472100, -2027761, -4248797, 2659122, -1977296, -2020782, -1938641, -261993, --1565516, -128849, -1367410, -1098438, -215285, -514322, -7397545, -1302449, 7330973, -13463112, --4345970, 9386114, -11687143, -751082, -1532230, -1096827, -13545790, 13460964, 5247913, -8683887, --1976759, -3491809, -3744138, -19554450, -3214783, -8714489, -22944790, 5219996, 3070365, -9842991, --8891119, -11672110, -14166413, 12123082, 6194954, 12741020, 18254, 26292180, 797790, 13925895, -18188112, -1753957, 5267241, 19573776, -13337484, 6315213, -8206609, 13590350, -4568235, 26086020, -11243688, -7594576, -12504797, 2406256, 5524939, 11113765, 2448668, -8890582, -2575370, 8903467, -18651970, -7573101, 12364137, -4264903, 7373385, -14545980, 5459441, -7727183, 5467494, 1373853, -1524177, -2314987, 11351599, 16869020, -30378840, 9480603, 5783711, 4846334, -5913633, 4338454, --21928492, 2230699, -76236, -2948495, -8664023, -6729677, -7558606, -1667521, 14852534, -8424041, --5648956, -12013024, -17180, 11407433, -5987185, -5759015, 8051990, 85899, 5714991, 1770063, --1995549, 545998, 2248952, -5532992, 2516851, 1591285, -5587216, -3874597, -2986076, 1888712, -2957085, 3948686, 9881109, -704912, 7358890, 4261145, 2054605, -4791573, -2126009, -7437273, --4053376, -908922, -3146064, -3322157, 3827890, 2921652, 4670240, 7064148, 715649, -1107028, --1387811, -3863323, 2044941, -797790, -521302, 2615635, -3500935, 14851997, 15925202, -3527242, -16555488, -915365, -3370476, 1233729, 9338333, -3539590, -4131222, -1994476, -11651709, 1854889, --3291019, 18392660, 12219719, -8868571, -9255655, -17595944, -6350109, 12658879, 22997402, -10504416, -7150047, 1466731, 3084324, 12422119, 9006546, -18025978, 3633006, -6480032, -3583077, -7477001, --3982509, -7887171, -17242146, 2963528, 11639361, 4368519, 27174258, -6658810, -3673808, 18765786, --6802155, -1118839, -4138738, 4921496, -20621748, -13344463, 7252053, 15406048, 22613540, 26847304, --19717122, -10330470, -975494, 8936216, -825171, 30472256, 8562017, 4497905, -23633058, 1577864, -235686, 11391864, 15015206, -11209328, -3631932, 4607963, -4795331, -66572, 17051558, 6063420, --16732656, 4317516, 8922795, -8130373, 26483306, -9201431, -14063334, -19896436, 14724222, -3237332, --16581258, -13258027, -2957085, -677531, -6558415, 333397, -7145752, 1343251, -9973988, 644245, -4971962, -3520263, 3929895, 711891, -6004901, 624918, -28454, -1218160, 715649, -4174708, -5055714, 2147, -2477123, 5658083, 5860483, 217433, -1528472, 2508798, -5388037, -2308008, --4314295, -862215, 4576825, -3580929, 2044404, 4412005, -8135742, -2961917, -1618129, 1330366, --1476395, 3519189, 8025684, -2261300, -4674535, -2327336, 5212480, 1451699, 563178, 4115116, --2304787, -1703491, -1415729, -2309082, -1845762, 3610457, 31375272, 14790257, -8170639, -2705293, --28840706, 2190970, 7700877, 1955284, 43151536, -5511517, -3215320, -18996104, -16313896, 6650757, --13333726, -8236674, -8931384, -6102612, 10744934, -7062537, -12263742, -10678362, 992137, 10733660, --13878650, 3060164, 6315213, 1321239, 15575162, -1880659, 1241782, -15883326, -22229140, -9240622, -10210748, -12354473, 2991445, -10388452, -38830264, -20998632, 11651173, 745177, -22251152, 3342558, -31005368, -1523103, -804770, -12199855, 6780680, -13455059, -23950886, 505196, 3630858, -9393093, -4586488, 8909373, -2232846, -7936026, 6445136, 8273718, 15538118, -9061307, 11669963, 14870787, -6291590, 25944286, 2900714, -16320876, 18977312, 1028645, 3153580, -3584687, -3855807, 11620034, --11652246, -1791001, 28880434, 22553948, -14070850, 14390288, -4229469, 26707180, 11266236, -9431211, --21472688, -1060857, -7880728, -9432822, 5998459, -8513162, -302258, -2277407, -7541426, -12681965, --2510409, 10489384, -11485816, -71941, -7157563, 954557, 4414153, -4760971, -13437879, -2494302, --6398965, 8006893, 4859756, -3397856, -8925479, -3815005, -9601399, 5592048, -4759898, 2972117, -3654480, 5320391, 4271345, -7547332, -5341329, -8462159, 2360622, 5192616, 593779, 10480257, -11164767, 5973763, 4466229, -3062312, 5901822, -854162, -3010772, -22802518, -23571318, -28825674, -39631812, -22069690, 5479305, -1500554, -12195560, 19677930, -23171348, 9870372, 42135776, 25455734, -6284611, -34190088, -1591822, -22652194, -11033234, -20706574, -1622424, 5532455, -3357054, 15793668, --7399155, 2403034, 8268886, 22185654, 3453691, 2836826, 27507654, -18149994, -2200097, 11727945, --4903779, -14129369, -8879308, 13440563, -11592654, 5493263, 23609436, -6721087, -41589780, -2806761, -10850161, -51756504, 31440772, 23732378, -19185082, 31712428, 22014392, 14023605, 33504504, 483184, -17393544, 1736241, 2374043, 11715060, -20699058, 20798380, 28924458, 21755084, -22306450, -4654134, -31758598, -15447924, 25262460, 22605486, 53716084, 31967978, 2214056, 3485903, -6514392, 6489696, -9675488, -31117574, -43856984, -15606837, 4237522, 1458678, -5967320, 34433828, 16717623, 6336688, --14826764, 13546327, -10387915, -13856638, -6582038, 15497316, 18669150, 3348464, -2875481, -3687766, -962073, -21617644, -4660577, -5703717, 7362111, 3825742, -10703595, -8637179, -89657, 16756815, --4277788, -6667937, 888521, -6896644, -16691854, 8433705, -3246459, -6843494, -9594957, -75699, -6150393, 988379, -30000884, -1854889, 15482283, -2403034, 1077500, 2388002, 4835597, 12662637, -10656351, 336618, 355945, -5012227, -1077500, 2487860, 24160802, 29552060, -58117888, -53505628, -23430658, -15476915, -16644609, -7133941, -20145544, 7080791, -32732482, 41408316, 15786689, -17435956, --199179, -17054778, -12557948, -13767518, -15444702, -10241886, -39502960, -35770100, -6467147, -8207146, -2456185, 3282429, 7089918, -2605972, 5254893, 6548752, 17853106, 19462644, -7177964, -9969693, --11379516, -9906879, -22253300, 33341832, -11597485, 8076686, 25026238, 23387708, -8693014, -10118406, --18484466, -12341589, -15137075, 25626460, 2954401, 3113315, -31567472, -11327439, 46167676, -4505958, -42999600, -8687645, -15800648, -10151155, -17888538, -18593450, -3173444, 170188, -25279640, 2112587, -12430172, -1060320, 9823127, -58910844, -23557358, -16505022, 31515396, -7486665, 5393942, 10674067, -49342196, 13923747, -4272956, -5000416, 42529304, 25540024, 6493454, 8259222, -1903207, 33581276, --13727252, -19119046, 10615012, 15803332, 28287192, 26098906, -15002321, 17728552, 13508209, 14300094, -4520990, -10140955, -19847044, -17034914, 10933376, 14817637, 8171176, 5375152, 17715666, -1641214, --4524748, -913754, -1153736, 9164386, 5751498, 11939472, 21006686, 14718853, 23989002, 6506876, --20981452, 6881612, 6005975, 18639084, -27917, 14643691, 6514392, 14097693, 653909, -26616450, --3124052, -5712844, -1455994, -11895449, -6794639, -30775588, 63933808, -20638928, -12850542, 37904160, --24039468, -36267240, 33628520, -48824652, -14139569, 11512660, 8366060, -34060700, -13379360, 29234232, -167504, -5767068, -19037980, 22939958, -22787486, 1498944, 18041546, -6041409, 16563005, 103079, --8217346, 5538361, 3914863, -9912248, 15745887, -8702677, -3544422, 4683662, -338766, 950798, --2990371, 4649839, 9981504, 16145319, 23265838, 11385421, -9649718, -2728378, -14803679, 13610214, --4942434, -21399674, 4985920, 33823, -12189654, -29242284, 20522428, 1494112, -13531831, 32920924, -1872606, -10280541, -5975910, 48783848, -45727980, -49279916, 29979946, 46747496, -86427624, 333397, --32003948, -29131690, -12872554, 31343598, -24303610, 41507100, -5904507, -1136556, 55906516, -15904801, --43300788, 53631792, 63303524, -61614528, 68728064, -23294292, 1692754, 56680148, -19014358, -21891986, -15587510, 15118285, -7297687, -3032247, 10560251, 1932198, 1364726, -13699872, 18711562, -74088, --1193464, 166967, 2543695, 8244190, 5149129, -7024419, -7405598, 7644505, 18689550, -16358994, --14894947, -4253092, 19583440, -926102, 10502806, -3080029, 4434017, -181462, 4545686, -2495913, --3318936, -23337778, -9562745, 5485747, -8196945, -2626909, -8048769, -12774306, 19644644, 11850352, --33735356, 13194140, 17779554, -3806415, 76773, -12319577, 17642116, 37699612, -17431662, -24453396, --6270116, 5694590, 39033736, 28547038, -9734543, -3416647, 12443057, 31134754, -10113574, -2096481, -19674708, -25067576, -20893942, 16629576, -10914049, -8752606, -10018011, -1259499, -16749299, 1053878, -12137041, -7517804, 9465034, -8374650, -4671314, -5388574, -23300734, 3236258, -9197136, 14240501, -31432182, 1427540, 15870441, 12545063, 1594507, 5587216, 10124312, 32648194, -22874996, 15638513, -14412837, -17128866, 11708081, 10720238, 3934727, -15227807, -29488708, -30523796, 10420128, 10590852, --10982768, -50831476, 41575284, -14107894, -21700860, -13056701, 41829760, -19717658, 45705432, -253940, -15668578, -42838540, 40727564, -18694382, 18316424, -5702643, -57773216, -18615462, 11973832, -36244156, -37511708, 3722663, -52907556, -60317448, -30389042, 41502804, 10838887, -37536404, 45989972, -49138184, --1865090, 88028040, 13760538, 4771172, 9336722, 6446209, -22603876, 23884850, 2365990, 12086575, --14967424, 22951768, -12219719, -12456479, -9632001, -1540820, -24696, 6787122, -1705102, -3648038, -5187247, -8319889, -16075526, 14976551, -4960151, -2848637, -19174344, 8834748, 5086852, 8375186, -3050501, 9701257, -6658810, 2114735, 28169080, -3420942, 1023276, 14326400, -14851460, -3508452, -1570347, -1782411, 11458436, -11259257, 12785581, -4406637, -30219390, 1795296, -7277822, 13682155, -10668699, 9286256, -10496363, 12161737, -19442244, -36686536, -17180, -38984344, 10567230, -3352222, --7178501, 13211319, 21432960, -13737453, 2917894, 23875186, -18803904, 32335198, -4489315, -35330936, -30212410, -14518600, -6703370, 27182848, -34892852, 9247601, 383326, 12687333, -5658083, -12640089, --53157736, 12234751, -22067542, -53097608, 64071784, -43198780, -18251464, -8515310, -14861124, -32594506, -18104360, 44438952, -27692876, 12518219, -40069360, -22473416, -22935126, 20107964, 3368865, 58271968, --10261751, -4810900, -17618492, -50180788, -194884, 24453934, -18818936, 20527260, 24390046, -20775294, -1814087, -17717814, -74457552, -38903276, -23104240, -77945064, 49556408, 65650184, 30598958, -66100084, --53413288, -118582976, 16860430, 140959216, 64918432, 24890410, -37352256, -130084896, -29840896, 30083562, -88599272, 89115200, -60890288, -51290500, -24110872, 11587285, 5825587, 96792992, 1307281, -11864847, -7558069, -9669582, -23977192, 33994128, 5781563, -7390028, 18513994, -15539729, -26720066, 18599356, -15831786, -45024144, 29896194, -6838662, -10256919, -24058796, 25040734, -24317568, 28708098, -14458471, -29386704, -35260072, 13656922, -9981504, 70867, 25193204, 41103372, 11565810, -15835008, -11174968, --3003256, 22719304, -4092567, 32751810, -26232586, -20557860, 9051107, 32434520, 3394098, 19652696, --26386668, -7839926, -8767639, 20141250, -1759326, 2996814, -6166500, -56150792, 40827960, -8283918, --8521215, 667331, 18577344, 9664, -3149822, 13157632, 4984847, 4160213, 21857088, -13964012, -195958, 10838887, -3546032, -2360622, 13912473, -12922483, -2705293, 3486440, 21672404, -14422500, --9652402, 11608760, -210990, 6374269, -20767778, 27378806, -6250251, 9024800, -5700496, 3245922, -15451682, 6321655, -3192235, 12666932, -4593468, 12807056, -9992778, -1094143, 13901199, -3440806, --5284958, -27668716, 3122441, 20823612, 2560338, 9592273, -13499619, -4709432, -7945690, -9012452, --3223910, 14980309, -5240934, 9007620, -11709155, -14710800, -5837935, 3113315, 28308130, -11037529, -13059922, 531502, 3124589, -13979045, 7813083, 14210973, 1124745, -13522705, 10558103, -9111773, -7191923, -5676873, -3545496, -5442798, 2240899, 9882720, -4783520, -2911451, 5056250, -907312, --7387881, -1952600, 7947837, 6153078, -6357089, 845035, 7296076, -6442, -3867618, 827318, --6394670, 4765266, -59593, 2295123, -2704219, 1029182, 4786204, -2495376, 5546951, 704375, -5094905, 3319473, -7257421, -8031589, -2245731, 13263933, -8242579, 9130027, 7917772, -5782100, --13598403, 10324565, -8588861, 11703249, -723165, -2263985, -4529580, 1722282, 2397129, -1000727, --1192390, 746251, 1615445, -5630166, 53195316, 10498511, -28427314, -20284594, -31403190, -10028212, -6105833, 16653736, -5167920, -6804302, -5766531, -5656472, -5250598, 7585449, -3828427, -1117765, --1634772, -5584531, -1275068, 8344048, 1248225, -2475512, -8342974, 9584220, -12445741, 7296613, --4416837, -12305081, 95563, 5544803, 6328635, 4876399, -7201587, 1572495, -2281702, -4007205, -14805289, -13187697, -2360622, -573378, -870268, 1347009, -2162516, -7759396, 6538014, -12275017, -11709691, -1743757, -8163122, 2799782, -4194573, 10354629, -6039261, -3701725, 11246909, -10075993, -3529926, -4836133, -1070521, 8575439, -6107444, -2464238, 7742753, -5312338, 2062658, 773631, --6225018, 15206332, -13263396, -1152662, 5895380, -3398930, 9764608, -4428648, -2110977, 2530810, -3248069, -1063004, 2194192, -874563, -4274030, 3854196, 34897, 366146, 2159295, -288300, -3076807, -3075197, 932008, 600222, 723702, -387084, -1853815, 2474975, -316217, -664109, --1756105, 2187749, 3620658, -1221918, -1791001, 1108638, 2133525, -2644626, 2224256, -1996623, --1672890, 5722507, -834834, 2107755, 3062312, -3971234, 9790378, -3207804, -467615, -498753, --5581847, 5814312, -3591130, -5836861, 5229660, -25178172, -37771016, 49514532, 154568896, 13208098, -13481902, -105378096, -133237400, -27790050, -28198070, 78477104, 133639520, 68540696, 13228499, -48365628, --94039384, -66421668, -47443820, -2485176, 65125664, 95101312, 51438140, 11759084, -33318208, -59299004, --33160906, -31955630, -29876866, 18885508, 38789996, 38180648, 38517268, 9234717, -16648367, -6863895, --25319906, -39709120, -4362076, -11852499, -7974144, 35823248, 20744692, 29925184, 18197240, -13589813, --32622960, -7880728, -21189758, -3293166, 14886894, 4536559, 8062191, 16183437, -8170102, -11503533, --2603824, -6763500, 6578280, 10446434, 609885, 12898861, 7703561, -13562970, -12993887, -20784958, --17721572, 780073, 21479132, 32480690, 15695958, 4101694, -7505456, -21755084, -3684545, -24528558, --14996415, 11540577, 9108015, 27460948, 9303436, -6994891, 8144332, -14243722, -24656870, 4345970, -6318971, 8282308, 7711614, -1548336, -3033321, -2365453, -10218264, -7874823, 5445482, 8382703, -8489540, 8555038, -2311229, -8268349, -5420249, -3173981, 280784, -170188, -9290014, 2398739, -11843909, 6359773, 7396471, -2178085, -11785390, -6881075, -6928319, 2743947, 8384313, 5492190, -5209259, 2232846, -1621350, -8979703, -11766600, -5408975, 804770, 7337415, 11763915, 7169911, -7284802, 4563403, -7343857, -13770202, -17611514, -11453067, 5042829, 9943386, 12964359, 17875118, -5523865, -5325760, -8915815, -7279970, -5322002, -5087926, -5100274, -1471026, 4103305, 7919383, -7060390, 5502927, 3918621, 926102, -4853313, -8600135, -8225399, -4184909, -49929, 3730179, -5093831, 4672925, 2487860, 1524713, 624381, -717260, -3099893, -3832185, -3122978, -1045288, -1347546, 2326799, 1929514, 481036, -499290, 372052, 323196, 528281, 221191, -743566, --1465658, -465467, 770947, 235149, -1199370, -609885, 351114, 301185, -155156, 956167, -2083059, 1921998, -816581, -2188286, -1661079, -549756, -84826, -14496, -187905, 651761, -1414655, 1401233, 214212, -270046, -246424, -579821, -1079647, -862752, -547071, 243203, -555661, 992674, 790274, 294205, -211527, -266825, -624918, -544924, -489089, 25233, -382789, 657130, 253940, 87510, -261993, -265214, -382252, -9127, 214212, 388695, -97711, 89121, -155693, -163746, -266825, 10201, -2684, 128312, 16106, 113817, --43487, 49929, -78920, 36507, -69256, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +10916733, 1292248, 2952253, 1063004, 1553168, -2618320, -6614787, -1257889, 3488587, 1264868, +-3275450, -440771, 2668249, -670015, -3941706, 1207960, -4541928, -2793339, -142271, 1270237, +-1291711, -1003949, 2814277, -3893388, -93416, 519691, 1894618, 1524713, 1442572, 4807679, +2161979, -5923297, -1514513, -2679523, 755377, -129923, -446677, -3719979, -4877472, 6490770, +-2980707, 1606318, 1886564, 1646583, -6131066, -3461744, -1602023, 703301, -475131, -164819, +-557272, 1061931, 2346663, -3180423, -537, 1748589, 2009508, 2418604, 887985, 74088, +2321967, 851477, -995359, -264141, 3765076, -2756295, -2939905, -1559610, -1173600, 3241090, +1906429, 797253, -1188095, 3125663, -1368484, 1636383, -3645354, -314069, 292595, 795106, +769873, -2916283, 810675, 2124935, 1063541, 390305, -252866, 2770791, 1315871, -237834, +1766305, 1079647, 470299, -361851, 603443, 510564, 397821, -481036, 683974, 228707, +-530965, -395674, 966905, 250719, -71404, 54224, 59593, 202400, -860067, 676457, +-223338, 541166, -668941, -6176700, -3781182, 2685965, -6119792, -8559333, 1632088, 776315, +1020592, 1293859, 1169842, -7354058, -1248225, 2182380, -4728222, 4960151, 4745939, 4143570, +-1703491, 412317, 1069447, 3180960, 674847, -73014, 576063, -2105071, 1941862, -739271, +-823023, -972810, 6028524, -3590593, 2057289, -2255395, -2014340, -2022393, 1566053, 3352222, +-3590056, -1736777, -1966558, 2461016, 2241973, 3722663, 2462627, 522375, 3188476, -2727304, +1897302, 767725, 796716, 6804839, 1554241, 3377992, -5611375, -1475321, 2244657, -2756832, +2589329, -1177358, -2097018, 750009, 4016331, 2767033, 1824824, -971200, 781147, 3054259, +-3719442, 4861366, -711891, 3987340, -1663763, 3293166, 3852586, 3310346, -1890859, -4859219, +-7256884, -4845797, 415538, -2533494, 4702989, 807991, 689879, 1291175, -3452080, -1034013, +-1583769, 1725503, -976031, -637266, 2038499, -2544231, -962073, 1028645, -1479079, 132607, +-1644973, -1253594, -1064078, -271657, 933082, 284005, 117575, -1731409, 10483478, 7463043, +6187438, 5075041, 5805185, 2392834, -417686, -171262, -2105071, -683437, 7623030, -3357054, +-3378529, 5189394, 3920232, 4986457, -3486440, 1475858, -1298691, 1088237, 2273648, 3092913, +490163, -2345052, -1675574, -3003793, -1026497, -1876901, -5354214, -705985, 4558034, -3581466, +-587874, 1620813, -2748242, -2567317, 2587181, -1440962, -3571265, -1983738, 2070711, -3129421, +-3933116, -1862405, -1153736, 1275068, -2739116, -5777805, 424665, -1002875, -782221, 1595044, +-4675609, -2347200, 103079, -2020782, 2603287, -719407, 1132261, -8485245, -2538863, 4708358, +-1864016, -4699231, 1396401, 762357, 1320166, -1787243, -6669548, -3093987, 7530152, 450972, +2782602, 1529545, -1069984, 2230699, 3142842, 1255741, -1547262, -3659312, 1074, 834834, +-2717104, 1170916, -3525095, -424128, -2246268, -1163936, -2976949, -630286, -1700270, -2226941, +-1667521, 266825, -741419, 321049, -814433, 233539, -1504312, 1012002, 576599, -477278, +-278636, 1334661, -36507, -568009, -1341640, -751619, -612570, -166430, 120796, -32212, +-1549410, 14756971, 9152038, 8559333, 212601, 813896, 747861, -3572339, -7780334, -3004330, +5980205, -4515621, 2741263, 7962870, 707059, -2573759, -939524, -1657321, -786516, 3201361, +4663261, 131533, 1418413, 1846299, 3061775, 150324, -4150012, 1269700, -6725919, -2072859, +-796716, -1914482, -1171989, 820339, -1563368, -3586835, -2716030, -1305670, 353798, -1551020, +-4056597, 4873178, -1777580, 337692, -1213865, -3226057, 4075387, 11166915, 2749853, -3904662, +6665253, 1499481, -1988570, 2002529, -1097364, -4318590, 64961, -1816234, 1714229, -3741454, +-6417755, 245887, 1116155, -7844758, 2383170, 1613834, 4420058, 2480344, 5827734, -1966558, +-3865471, -2299418, -1175210, 2813741, -991064, -5042292, 3475702, -2460480, -4543539, 3126199, +-4538707, -2508798, 1487669, -1657857, 1626719, -1093606, -1849520, 1518808, 3926674, -898722, +-1872069, -695248, 38655, 1363115, 2773475, 787053, -754841, -1016297, -957778, -329639, +690953, -1973538, -649614, -578747, 3038153, 1526324, 2163053, -351650, 209917, 1644973, +1147293, 797790, -46708, 283468, -299574, 854162, -511101, -406411, -7558069, -12109660, +-3636764, -6091338, 8691940, -2035278, -996432, 3166465, -7908646, -5680631, 4840428, -3928285, +-3527779, -266825, -268972, 780073, 3206193, -1395328, 1488206, -2148021, -1491427, -219580, +-1314260, -3563749, -261993, -823560, 3697430, 3617436, 3288334, -4400194, 2057289, 1388348, +6096706, -3125126, -178241, -2151242, -4581120, 6512244, -6206765, -3148748, -2390149, 1475321, +5513128, -5142687, 5701032, -693637, 3092377, 4634270, 806917, 3553012, -6694781, 1402844, +-2500208, 266288, -7094749, 51540, -2420751, -6470368, -4870493, 300111, 4750234, 163746, +-3399467, 5281736, -1808181, 3020973, -388158, -6716792, 9313637, -5879274, -1115618, -3382824, +2351495, 3678103, 2526515, 3386045, 7544647, 5644661, -928250, 1107565, 3578245, 2143726, +-2645163, 3723200, 3002182, -656056, 1718524, -3839701, -5136244, -649077, -1637456, 2803540, +-3001645, -729071, -2885144, -773094, -1312649, -535260, 894964, 974958, 616328, -233002, +-709743, 1637456, 906775, -1908576, 1322313, -24159, -4452808, -510027, -1591285, 2444910, +-666257, -416075, 948651, -605590, 904091, 1888712, -120796, 1182190, 1400696, -389768, +528818, 2706366, 467615, 3145527, -8428336, -12265353, 1467805, 920734, 787590, 7741142, +-2435783, -8636642, 1008244, 894427, -2148558, -590558, -7402913, -1582159, 1040456, 1016297, +8506720, -1569811, 7634305, -1919314, -1837709, 529892, -7366943, 3089155, -2711198, 4451197, +-1154273, -2022930, -2670933, -1457605, 371515, -5688148, 9766219, -6797323, -10759430, 3146064, +603980, -7732015, -2150705, -14745160, 357019, -5318244, 32749, -5765994, -4489315, 689342, +623844, 2417530, -4527433, 3591667, -5122286, -10217190, 1308354, 2691871, -2960843, 3204583, +-1630477, -5719823, -4838818, -6932077, -3135326, -838056, 1220845, -2153926, 6432788, -93416, +-1874753, 435939, 484794, 1202054, 1087164, 627065, -5972152, -5797132, 1305133, 3905736, +2478733, 546535, -1239635, 4878009, 2849711, -2452426, -1620276, -5719823, -2212982, 2371896, +1275068, -3177202, 1326608, -978179, -806917, -1559610, -1672890, -741419, -2238215, -1899986, +1053341, 329639, 1487132, 2269353, 279710, 1972464, 193810, -1529008, 2085207, 1111860, +-316754, 151398, -1056025, -1285269, 53687, -41876, -1194538, -88047, -306553, -207769, +70867, -428423, 1384590, -2243584, -250719, -777926, 188979, 566936, 1416802, -105764, +-18823768, -4697621, 721018, -4778688, -3532611, -5983427, 1520418, 2124398, 4248260, -3215320, +-4041027, -4523675, 2234457, 5068062, -2552284, -2152316, -1321776, -767189, 2362769, -10472741, +-2625299, 5932424, 1893007, -3061775, 1083406, 5254356, -554588, -1330903, 1795296, -323196, +12826383, -5529771, 3106335, 1041530, -5461051, 1788854, 1167694, -6159520, 4309463, -8754754, +-896038, 7756711, 1658931, -221191, -1677722, -5984500, -5217849, 1385127, 3286187, -2251100, +1575716, 6425808, 3134789, -2664490, 3910031, -5698348, -13460428, -1772748, -5940477, 3732327, +-3824132, 9526237, 4717485, -437013, -1615982, -12349642, 3842385, 4721243, -3841848, 7547868, +-5917928, 2303176, -9881109, 4560182, 3393561, -11192148, -7176891, -2296197, 2710661, 3716757, +8102456, -1133335, -447750, 5293547, 1173600, 26307, -2416993, 1210644, 1173063, 1588601, +1682554, 431107, -271120, -1021129, -1212791, -3022583, -2562485, 2005750, 1371705, 1030255, +2441152, -1016834, 1151051, 1264331, -688805, 2139431, -340913, -27917, -565862, -2438468, +-585726, 2786360, 574989, 2065879, -826244, 751619, -1154809, 3311957, 262530, 2775086, +1177358, -1381369, 673773, 4627291, 8022999, 18249852, 19654308, 3840238, 5960341, -23622, +2896956, 98784, 2167348, -5307506, 2537252, -3327526, 4443681, 4030290, 10181757, 1481764, +-1920924, 6241661, 4669703, 7523172, 494995, 4656819, 2867965, -2405719, 2486786, 11236171, +1923609, -4939750, -2502355, 8302172, 5300527, 3964792, 7907035, -6036577, 2467459, 9212168, +-9096741, -11087995, 3785477, 5864778, 9762461, -4219806, -7039452, 5776731, 2255932, -919123, +3764539, -1503775, -730681, -97711, 13846438, -4994510, 2929705, -3344169, -1967632, -1651952, +7298760, -981937, 16099148, 7610145, -7492034, 8876087, 2106682, 4122095, 2081985, 1906429, +2341831, -2945274, 5549635, -12634720, -3157875, 5747740, -12666395, 4376572, -10199474, 2418604, +11636677, 2815351, 106837, 3132642, 1277753, -3097208, 962073, -3289408, 569083, 2630131, +-7524783, 4416300, -1206886, -1842541, 718870, 2391223, -1823214, -3078955, 1242856, 2782602, +-1263794, -2600603, -2353105, -1501091, 1283658, -1832877, -1431835, 1742146, 2640331, 1142461, +-1059246, 1590749, -918049, -3963718, -1571421, -46171, -1793149, 1153199, 1058710, 1685238, +2946885, 3993246, -1638530, 5625871, -1717987, -3249680, -867583, 2013803, 680752, -3300146, +-1905355, -2389076, 30449708, 5063230, 4958003, -9058086, 13241384, -4532801, -370978, -3629784, +924492, -8679592, -445066, 3811247, 1151051, -7107634, 8804146, -2269890, -4271345, 1051193, +2893734, -9092446, -12312061, 4999342, -4970888, -7576859, 1647120, -226023, -3602404, 6331856, +-6373195, 1981054, 6534793, -1307818, 9433896, 2727841, -11515881, -12422656, -5040681, 610422, +2421288, -9854266, 3690451, 3338800, 2033667, 2932389, 4463545, -10234907, -4823249, 2736968, +-11017665, -4234838, -73551, -11789685, -6025839, -4149475, 2546916, -6125697, -12426414, -6162741, +-6548752, 14446123, 7260106, -1371168, 2197413, -4095788, 11824045, 13777718, 1765232, 9176198, +7017977, 2517925, 1880122, -5575405, -973884, -4945655, 6976638, -9099962, 502511, -2327872, +-13488882, -4329864, -1771137, 7248831, -6572374, 3542811, 3402151, 1209033, 919660, 3037079, +-3067144, 2385318, -1767379, 2668249, -517007, 4035659, 1444720, 171799, -2007360, -1014686, +-5138929, 2673080, -531502, 4350265, -4153234, -204548, -238908, 2512556, -263067, 2222646, +1242856, 1117765, 1505923, 482647, -2709051, 3180423, 4522601, -2394444, -2884071, -3840775, +-1287417, -444529, -1086090, 160524, -755377, -20623896, 13919989, 22358526, -16778826, -9985799, +4594005, 4010426, -3416110, 7342784, 1981591, -6255620, -7655779, -163209, -2474438, -5462125, +2769717, -2517388, 333934, 6171331, -8342974, 1737851, 1089311, -4954782, 680752, -7861401, +1503239, 11498164, 5843840, -1173600, -3733400, -965831, -6607807, -7022272, 3408057, 5799817, +-1874216, -3249680, -2332704, 3456375, 5764383, 2756832, 10593000, -5754183, 4334159, -2790655, +1003949, 6600828, -2431488, -2134599, -12702903, -1976759, -9848360, 4888747, 3314641, 12563853, +-10854993, -4024384, -10509785, -17253958, -2947421, 7134478, -11944841, 2588792, -1377074, -8723079, +-10288594, -12942347, 17243220, 598611, 10212895, 7500087, 8664023, -4012573, -11584601, -8776766, +-10848014, 3701188, 8369281, -8134131, 3730716, 8941048, -6178311, 962073, 7221451, 8322036, +1932735, -3082713, 3511673, -1582696, 1831267, -9029095, -912144, 3351148, -3131568, 1060320, +459025, 294742, 1902134, 3280281, -3643206, -1361505, 1949378, 2906082, 736050, 1357210, +2825015, -739808, 3058554, -2783139, 2055679, 3095598, 3457449, 278636, -1480153, 2673080, +-2406792, 565862, -649077, -2070174, -1097364, -2048163, -660888, 758062, -2511482, -6682969, +2154463, 3420405, -16327855, 11842835, -1662152, -5870684, 9785009, 3703336, -9924596, -13749264, +-5585605, 205085, 73014, 831076, -5178120, 15977815, 6336151, 4930623, 3427921, 5120675, +-5043902, 1337346, 2910914, 2448131, 13975287, 1611150, -21422760, 2733210, 8568460, -7781407, +-12159589, -2406792, -6721087, -3710315, 732292, 15081778, 8706436, -1417876, -611496, -4420595, +-13388487, -4345433, -11110544, 7820599, 10300405, 216359, -6162741, -2065342, -2719251, 4923643, +6443525, 7215008, -16821240, 3250217, 268972, 1517734, 11183558, -6650220, 4394826, -6068789, +-4723391, 1257352, 7199976, 13573170, -2469606, -8716636, 2506650, -15724412, 12253005, 6820408, +-1895154, -6486475, 3060701, -3621731, -8124468, -6455873, -7402913, -3357054, -1836099, 483184, +6306086, -5092221, 17968532, 766652, -3154117, 1049583, 5096516, 239444, -586800, 5932961, +3709778, 3048890, -159451, -2907156, -2624225, -715112, -803696, -2695629, -7841000, 3898220, +3336653, -2856690, 625992, -4180614, -3496640, -1484448, -1220308, -170725, 6142877, -1420560, +-2477659, -1139777, -808528, 3947612, 6871948, -2472828, 3658775, -1200980, -5007932, 5180268, +-5392869, -4106526, -3093987, -4151086, 401043, 2988224, 1121523, 3059091, -425202, -1333051, +-776315, -3413962, 1472100, -2027761, -4248797, 2659122, -1977296, -2020782, -1938641, -261993, +-1565516, -128849, -1367410, -1098438, -215285, -514322, -7397545, -1302449, 7330973, -13463112, +-4345970, 9386114, -11687143, -751082, -1532230, -1096827, -13545790, 13460964, 5247913, -8683887, +-1976759, -3491809, -3744138, -19554450, -3214783, -8714489, -22944790, 5219996, 3070365, -9842991, +-8891119, -11672110, -14166413, 12123082, 6194954, 12741020, 18254, 26292180, 797790, 13925895, +18188112, -1753957, 5267241, 19573776, -13337484, 6315213, -8206609, 13590350, -4568235, 26086020, +11243688, -7594576, -12504797, 2406256, 5524939, 11113765, 2448668, -8890582, -2575370, 8903467, +18651970, -7573101, 12364137, -4264903, 7373385, -14545980, 5459441, -7727183, 5467494, 1373853, +1524177, -2314987, 11351599, 16869020, -30378840, 9480603, 5783711, 4846334, -5913633, 4338454, +-21928492, 2230699, -76236, -2948495, -8664023, -6729677, -7558606, -1667521, 14852534, -8424041, +-5648956, -12013024, -17180, 11407433, -5987185, -5759015, 8051990, 85899, 5714991, 1770063, +-1995549, 545998, 2248952, -5532992, 2516851, 1591285, -5587216, -3874597, -2986076, 1888712, +2957085, 3948686, 9881109, -704912, 7358890, 4261145, 2054605, -4791573, -2126009, -7437273, +-4053376, -908922, -3146064, -3322157, 3827890, 2921652, 4670240, 7064148, 715649, -1107028, +-1387811, -3863323, 2044941, -797790, -521302, 2615635, -3500935, 14851997, 15925202, -3527242, +16555488, -915365, -3370476, 1233729, 9338333, -3539590, -4131222, -1994476, -11651709, 1854889, +-3291019, 18392660, 12219719, -8868571, -9255655, -17595944, -6350109, 12658879, 22997402, -10504416, +7150047, 1466731, 3084324, 12422119, 9006546, -18025978, 3633006, -6480032, -3583077, -7477001, +-3982509, -7887171, -17242146, 2963528, 11639361, 4368519, 27174258, -6658810, -3673808, 18765786, +-6802155, -1118839, -4138738, 4921496, -20621748, -13344463, 7252053, 15406048, 22613540, 26847304, +-19717122, -10330470, -975494, 8936216, -825171, 30472256, 8562017, 4497905, -23633058, 1577864, +235686, 11391864, 15015206, -11209328, -3631932, 4607963, -4795331, -66572, 17051558, 6063420, +-16732656, 4317516, 8922795, -8130373, 26483306, -9201431, -14063334, -19896436, 14724222, -3237332, +-16581258, -13258027, -2957085, -677531, -6558415, 333397, -7145752, 1343251, -9973988, 644245, +4971962, -3520263, 3929895, 711891, -6004901, 624918, -28454, -1218160, 715649, -4174708, +5055714, 2147, -2477123, 5658083, 5860483, 217433, -1528472, 2508798, -5388037, -2308008, +-4314295, -862215, 4576825, -3580929, 2044404, 4412005, -8135742, -2961917, -1618129, 1330366, +-1476395, 3519189, 8025684, -2261300, -4674535, -2327336, 5212480, 1451699, 563178, 4115116, +-2304787, -1703491, -1415729, -2309082, -1845762, 3610457, 31375272, 14790257, -8170639, -2705293, +-28840706, 2190970, 7700877, 1955284, 43151536, -5511517, -3215320, -18996104, -16313896, 6650757, +-13333726, -8236674, -8931384, -6102612, 10744934, -7062537, -12263742, -10678362, 992137, 10733660, +-13878650, 3060164, 6315213, 1321239, 15575162, -1880659, 1241782, -15883326, -22229140, -9240622, +10210748, -12354473, 2991445, -10388452, -38830264, -20998632, 11651173, 745177, -22251152, 3342558, +31005368, -1523103, -804770, -12199855, 6780680, -13455059, -23950886, 505196, 3630858, -9393093, +4586488, 8909373, -2232846, -7936026, 6445136, 8273718, 15538118, -9061307, 11669963, 14870787, +6291590, 25944286, 2900714, -16320876, 18977312, 1028645, 3153580, -3584687, -3855807, 11620034, +-11652246, -1791001, 28880434, 22553948, -14070850, 14390288, -4229469, 26707180, 11266236, -9431211, +-21472688, -1060857, -7880728, -9432822, 5998459, -8513162, -302258, -2277407, -7541426, -12681965, +-2510409, 10489384, -11485816, -71941, -7157563, 954557, 4414153, -4760971, -13437879, -2494302, +-6398965, 8006893, 4859756, -3397856, -8925479, -3815005, -9601399, 5592048, -4759898, 2972117, +3654480, 5320391, 4271345, -7547332, -5341329, -8462159, 2360622, 5192616, 593779, 10480257, +11164767, 5973763, 4466229, -3062312, 5901822, -854162, -3010772, -22802518, -23571318, -28825674, +39631812, -22069690, 5479305, -1500554, -12195560, 19677930, -23171348, 9870372, 42135776, 25455734, +6284611, -34190088, -1591822, -22652194, -11033234, -20706574, -1622424, 5532455, -3357054, 15793668, +-7399155, 2403034, 8268886, 22185654, 3453691, 2836826, 27507654, -18149994, -2200097, 11727945, +-4903779, -14129369, -8879308, 13440563, -11592654, 5493263, 23609436, -6721087, -41589780, -2806761, +10850161, -51756504, 31440772, 23732378, -19185082, 31712428, 22014392, 14023605, 33504504, 483184, +17393544, 1736241, 2374043, 11715060, -20699058, 20798380, 28924458, 21755084, -22306450, -4654134, +31758598, -15447924, 25262460, 22605486, 53716084, 31967978, 2214056, 3485903, -6514392, 6489696, +9675488, -31117574, -43856984, -15606837, 4237522, 1458678, -5967320, 34433828, 16717623, 6336688, +-14826764, 13546327, -10387915, -13856638, -6582038, 15497316, 18669150, 3348464, -2875481, -3687766, +962073, -21617644, -4660577, -5703717, 7362111, 3825742, -10703595, -8637179, -89657, 16756815, +-4277788, -6667937, 888521, -6896644, -16691854, 8433705, -3246459, -6843494, -9594957, -75699, +6150393, 988379, -30000884, -1854889, 15482283, -2403034, 1077500, 2388002, 4835597, 12662637, +10656351, 336618, 355945, -5012227, -1077500, 2487860, 24160802, 29552060, -58117888, -53505628, +23430658, -15476915, -16644609, -7133941, -20145544, 7080791, -32732482, 41408316, 15786689, -17435956, +-199179, -17054778, -12557948, -13767518, -15444702, -10241886, -39502960, -35770100, -6467147, -8207146, +2456185, 3282429, 7089918, -2605972, 5254893, 6548752, 17853106, 19462644, -7177964, -9969693, +-11379516, -9906879, -22253300, 33341832, -11597485, 8076686, 25026238, 23387708, -8693014, -10118406, +-18484466, -12341589, -15137075, 25626460, 2954401, 3113315, -31567472, -11327439, 46167676, -4505958, +42999600, -8687645, -15800648, -10151155, -17888538, -18593450, -3173444, 170188, -25279640, 2112587, +12430172, -1060320, 9823127, -58910844, -23557358, -16505022, 31515396, -7486665, 5393942, 10674067, +49342196, 13923747, -4272956, -5000416, 42529304, 25540024, 6493454, 8259222, -1903207, 33581276, +-13727252, -19119046, 10615012, 15803332, 28287192, 26098906, -15002321, 17728552, 13508209, 14300094, +4520990, -10140955, -19847044, -17034914, 10933376, 14817637, 8171176, 5375152, 17715666, -1641214, +-4524748, -913754, -1153736, 9164386, 5751498, 11939472, 21006686, 14718853, 23989002, 6506876, +-20981452, 6881612, 6005975, 18639084, -27917, 14643691, 6514392, 14097693, 653909, -26616450, +-3124052, -5712844, -1455994, -11895449, -6794639, -30775588, 63933808, -20638928, -12850542, 37904160, +-24039468, -36267240, 33628520, -48824652, -14139569, 11512660, 8366060, -34060700, -13379360, 29234232, +167504, -5767068, -19037980, 22939958, -22787486, 1498944, 18041546, -6041409, 16563005, 103079, +-8217346, 5538361, 3914863, -9912248, 15745887, -8702677, -3544422, 4683662, -338766, 950798, +-2990371, 4649839, 9981504, 16145319, 23265838, 11385421, -9649718, -2728378, -14803679, 13610214, +-4942434, -21399674, 4985920, 33823, -12189654, -29242284, 20522428, 1494112, -13531831, 32920924, +1872606, -10280541, -5975910, 48783848, -45727980, -49279916, 29979946, 46747496, -86427624, 333397, +-32003948, -29131690, -12872554, 31343598, -24303610, 41507100, -5904507, -1136556, 55906516, -15904801, +-43300788, 53631792, 63303524, -61614528, 68728064, -23294292, 1692754, 56680148, -19014358, -21891986, +15587510, 15118285, -7297687, -3032247, 10560251, 1932198, 1364726, -13699872, 18711562, -74088, +-1193464, 166967, 2543695, 8244190, 5149129, -7024419, -7405598, 7644505, 18689550, -16358994, +-14894947, -4253092, 19583440, -926102, 10502806, -3080029, 4434017, -181462, 4545686, -2495913, +-3318936, -23337778, -9562745, 5485747, -8196945, -2626909, -8048769, -12774306, 19644644, 11850352, +-33735356, 13194140, 17779554, -3806415, 76773, -12319577, 17642116, 37699612, -17431662, -24453396, +-6270116, 5694590, 39033736, 28547038, -9734543, -3416647, 12443057, 31134754, -10113574, -2096481, +19674708, -25067576, -20893942, 16629576, -10914049, -8752606, -10018011, -1259499, -16749299, 1053878, +12137041, -7517804, 9465034, -8374650, -4671314, -5388574, -23300734, 3236258, -9197136, 14240501, +31432182, 1427540, 15870441, 12545063, 1594507, 5587216, 10124312, 32648194, -22874996, 15638513, +14412837, -17128866, 11708081, 10720238, 3934727, -15227807, -29488708, -30523796, 10420128, 10590852, +-10982768, -50831476, 41575284, -14107894, -21700860, -13056701, 41829760, -19717658, 45705432, -253940, +15668578, -42838540, 40727564, -18694382, 18316424, -5702643, -57773216, -18615462, 11973832, -36244156, +37511708, 3722663, -52907556, -60317448, -30389042, 41502804, 10838887, -37536404, 45989972, -49138184, +-1865090, 88028040, 13760538, 4771172, 9336722, 6446209, -22603876, 23884850, 2365990, 12086575, +-14967424, 22951768, -12219719, -12456479, -9632001, -1540820, -24696, 6787122, -1705102, -3648038, +5187247, -8319889, -16075526, 14976551, -4960151, -2848637, -19174344, 8834748, 5086852, 8375186, +3050501, 9701257, -6658810, 2114735, 28169080, -3420942, 1023276, 14326400, -14851460, -3508452, +1570347, -1782411, 11458436, -11259257, 12785581, -4406637, -30219390, 1795296, -7277822, 13682155, +10668699, 9286256, -10496363, 12161737, -19442244, -36686536, -17180, -38984344, 10567230, -3352222, +-7178501, 13211319, 21432960, -13737453, 2917894, 23875186, -18803904, 32335198, -4489315, -35330936, +30212410, -14518600, -6703370, 27182848, -34892852, 9247601, 383326, 12687333, -5658083, -12640089, +-53157736, 12234751, -22067542, -53097608, 64071784, -43198780, -18251464, -8515310, -14861124, -32594506, +18104360, 44438952, -27692876, 12518219, -40069360, -22473416, -22935126, 20107964, 3368865, 58271968, +-10261751, -4810900, -17618492, -50180788, -194884, 24453934, -18818936, 20527260, 24390046, -20775294, +1814087, -17717814, -74457552, -38903276, -23104240, -77945064, 49556408, 65650184, 30598958, -66100084, +-53413288, -118582976, 16860430, 140959216, 64918432, 24890410, -37352256, -130084896, -29840896, 30083562, +88599272, 89115200, -60890288, -51290500, -24110872, 11587285, 5825587, 96792992, 1307281, -11864847, +7558069, -9669582, -23977192, 33994128, 5781563, -7390028, 18513994, -15539729, -26720066, 18599356, +15831786, -45024144, 29896194, -6838662, -10256919, -24058796, 25040734, -24317568, 28708098, -14458471, +29386704, -35260072, 13656922, -9981504, 70867, 25193204, 41103372, 11565810, -15835008, -11174968, +-3003256, 22719304, -4092567, 32751810, -26232586, -20557860, 9051107, 32434520, 3394098, 19652696, +-26386668, -7839926, -8767639, 20141250, -1759326, 2996814, -6166500, -56150792, 40827960, -8283918, +-8521215, 667331, 18577344, 9664, -3149822, 13157632, 4984847, 4160213, 21857088, -13964012, +195958, 10838887, -3546032, -2360622, 13912473, -12922483, -2705293, 3486440, 21672404, -14422500, +-9652402, 11608760, -210990, 6374269, -20767778, 27378806, -6250251, 9024800, -5700496, 3245922, +15451682, 6321655, -3192235, 12666932, -4593468, 12807056, -9992778, -1094143, 13901199, -3440806, +-5284958, -27668716, 3122441, 20823612, 2560338, 9592273, -13499619, -4709432, -7945690, -9012452, +-3223910, 14980309, -5240934, 9007620, -11709155, -14710800, -5837935, 3113315, 28308130, -11037529, +13059922, 531502, 3124589, -13979045, 7813083, 14210973, 1124745, -13522705, 10558103, -9111773, +7191923, -5676873, -3545496, -5442798, 2240899, 9882720, -4783520, -2911451, 5056250, -907312, +-7387881, -1952600, 7947837, 6153078, -6357089, 845035, 7296076, -6442, -3867618, 827318, +-6394670, 4765266, -59593, 2295123, -2704219, 1029182, 4786204, -2495376, 5546951, 704375, +5094905, 3319473, -7257421, -8031589, -2245731, 13263933, -8242579, 9130027, 7917772, -5782100, +-13598403, 10324565, -8588861, 11703249, -723165, -2263985, -4529580, 1722282, 2397129, -1000727, +-1192390, 746251, 1615445, -5630166, 53195316, 10498511, -28427314, -20284594, -31403190, -10028212, +6105833, 16653736, -5167920, -6804302, -5766531, -5656472, -5250598, 7585449, -3828427, -1117765, +-1634772, -5584531, -1275068, 8344048, 1248225, -2475512, -8342974, 9584220, -12445741, 7296613, +-4416837, -12305081, 95563, 5544803, 6328635, 4876399, -7201587, 1572495, -2281702, -4007205, +14805289, -13187697, -2360622, -573378, -870268, 1347009, -2162516, -7759396, 6538014, -12275017, +11709691, -1743757, -8163122, 2799782, -4194573, 10354629, -6039261, -3701725, 11246909, -10075993, +3529926, -4836133, -1070521, 8575439, -6107444, -2464238, 7742753, -5312338, 2062658, 773631, +-6225018, 15206332, -13263396, -1152662, 5895380, -3398930, 9764608, -4428648, -2110977, 2530810, +3248069, -1063004, 2194192, -874563, -4274030, 3854196, 34897, 366146, 2159295, -288300, +3076807, -3075197, 932008, 600222, 723702, -387084, -1853815, 2474975, -316217, -664109, +-1756105, 2187749, 3620658, -1221918, -1791001, 1108638, 2133525, -2644626, 2224256, -1996623, +-1672890, 5722507, -834834, 2107755, 3062312, -3971234, 9790378, -3207804, -467615, -498753, +-5581847, 5814312, -3591130, -5836861, 5229660, -25178172, -37771016, 49514532, 154568896, 13208098, +13481902, -105378096, -133237400, -27790050, -28198070, 78477104, 133639520, 68540696, 13228499, -48365628, +-94039384, -66421668, -47443820, -2485176, 65125664, 95101312, 51438140, 11759084, -33318208, -59299004, +-33160906, -31955630, -29876866, 18885508, 38789996, 38180648, 38517268, 9234717, -16648367, -6863895, +-25319906, -39709120, -4362076, -11852499, -7974144, 35823248, 20744692, 29925184, 18197240, -13589813, +-32622960, -7880728, -21189758, -3293166, 14886894, 4536559, 8062191, 16183437, -8170102, -11503533, +-2603824, -6763500, 6578280, 10446434, 609885, 12898861, 7703561, -13562970, -12993887, -20784958, +-17721572, 780073, 21479132, 32480690, 15695958, 4101694, -7505456, -21755084, -3684545, -24528558, +-14996415, 11540577, 9108015, 27460948, 9303436, -6994891, 8144332, -14243722, -24656870, 4345970, +6318971, 8282308, 7711614, -1548336, -3033321, -2365453, -10218264, -7874823, 5445482, 8382703, +8489540, 8555038, -2311229, -8268349, -5420249, -3173981, 280784, -170188, -9290014, 2398739, +11843909, 6359773, 7396471, -2178085, -11785390, -6881075, -6928319, 2743947, 8384313, 5492190, +5209259, 2232846, -1621350, -8979703, -11766600, -5408975, 804770, 7337415, 11763915, 7169911, +7284802, 4563403, -7343857, -13770202, -17611514, -11453067, 5042829, 9943386, 12964359, 17875118, +5523865, -5325760, -8915815, -7279970, -5322002, -5087926, -5100274, -1471026, 4103305, 7919383, +7060390, 5502927, 3918621, 926102, -4853313, -8600135, -8225399, -4184909, -49929, 3730179, +5093831, 4672925, 2487860, 1524713, 624381, -717260, -3099893, -3832185, -3122978, -1045288, +1347546, 2326799, 1929514, 481036, -499290, 372052, 323196, 528281, 221191, -743566, +-1465658, -465467, 770947, 235149, -1199370, -609885, 351114, 301185, -155156, 956167, +2083059, 1921998, -816581, -2188286, -1661079, -549756, -84826, -14496, -187905, 651761, +1414655, 1401233, 214212, -270046, -246424, -579821, -1079647, -862752, -547071, 243203, +555661, 992674, 790274, 294205, -211527, -266825, -624918, -544924, -489089, 25233, +382789, 657130, 253940, 87510, -261993, -265214, -382252, -9127, 214212, 388695, +97711, 89121, -155693, -163746, -266825, 10201, -2684, 128312, 16106, 113817, +-43487, 49929, -78920, 36507, -69256, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 1235877, -3443490, 2669859, -881005, 2043868, 987843, 5901822, -1023276, -165893, 752693, 4316979, --847719, -4520453, -2091112, -4339528, 1061931, -1549946, -355409, -554588, 1052267, 410706, -885300, 2502355, 4618164, -2057289, -1129576, 914291, -2172180, -307090, 3602941, -1961190, -4452271, 452045, -1592359, 2947958, -4029753, -1038845, -2806761, 3937948, -114890, -1461363, --1069984, 42950, 3667365, 143881, 4413616, 1690607, -3623879, 2932926, -1583232, -2711735, --2211371, 3015604, -627602, 9616969, 1022739, 2415919, 1752347, -4485557, 68183, -663572, -1175210, -2547989, -1719061, 5011153, 4108673, 369904, 1709397, -460635, 2558190, -4137127, -424665, 3104725, 1960653, 315143, -316217, 2212445, -3505230, -1618666, 3739306, -2457258, -798864, 1817845, 2213519, 677531, -2801393, -1871532, 1482838, 325344, 1470489, -446677, -426276, -1402307, -74088, -699543, -408022, 797253, 1542430, 645856, -888521, -348429, --599685, 360777, 945430, -557809, 699006, 507880, 983548, -140123, 1178432, -477815, -298500, 719407, 924492, -7346005, -6619082, -4129074, -3748970, -3259880, 1252520, 4624069, -9445170, 1802813, 2439005, -27917, -6735583, -2829847, -2500208, -6063420, 9423695, 2494302, -3744138, 2576981, -2081985, 949188, 9021042, 3590056, -2121714, -184684, -2188286, 178241, --4174708, 2499671, -1317481, -1882269, 356482, 4781373, 505732, 1660005, 3002719, 4143033, --7447474, 83752, 1890323, 4320200, 6657736, -3717831, -752693, -1808181, 5552856, 2995203, -3580392, -606127, 1659468, 11094437, -7017977, 1393717, 652835, -4704600, 1997160, -6567542, --883153, 1668595, -1420024, -9895605, 2769717, 669478, -2673617, -2752537, -459025, -1500554, -3335042, -3148748, -1391033, 959388, -107374, -3063922, -150861, 2484639, -4141959, 352724, --1133335, -1006633, -1292785, -744103, 625992, -2427730, -1823751, 343061, -1450625, -1924145, --1970316, -688269, -1311576, 2384781, -2123861, -613643, 331249, 1190243, -148713, 66035, --747324, 129923, -1278290, 937377, -859530, -852014, -255014, -1868848, 9994389, 833224, -3610994, -456340, -2632815, 171799, 7033546, 3537443, 4552129, 7188165, -3155727, 31139, -7058242, 2202781, 3121904, 357556, 901406, 4072166, -3686693, -1138703, 5257577, -3594888, -2077154, 2930778, -2188823, 2143726, 7036230, -3358128, 2621004, 515933, 308164, 50466, --1422708, -4816269, -1445257, -4041027, -387621, 1636383, 3386582, 3506841, -605054, -6029597, --517007, 8713952, -3213709, 1731409, -1541356, -9240622, 5405217, 1317481, 4020090, -701690, -4573604, 4399121, -7808788, 3097208, 259846, 2905546, -560493, -5521718, -243203, -802085, --991601, -1062468, 3521873, -41876, 700617, 7087770, 1393180, 5631239, 197032, 527744, -1097364, -3121368, -4870493, 3325915, -3682935, 2180770, 1385127, -208306, 2342368, -2483028, --1391569, 1549946, 93416, -4730907, 1533303, 544924, 623844, -966368, 2058900, 183610, --804770, 2268280, -507880, -206695, -1885491, 668941, -935229, 318901, 25770, -288837, -466541, -729071, 1242319, 276489, -472983, 349503, -279173, 127775, -45634, -762357, --61203, 16333761, 9126269, 13981729, 4495757, -5750425, 2934537, -2556043, 366683, 1388885, --11916387, -3135326, -3297461, 3106872, 4651450, -1889249, -294742, 1608465, 357556, 8549669, --956167, -8884677, 2890513, -5119064, 3950296, 4566087, 3595425, 5313949, -1280974, -1777580, -2126009, -1533303, -2086280, 1565516, -1395864, 3212636, 4522064, -1905892, -6879464, 2267206, --6689949, -4250944, -846645, -13848585, 132070, -2290291, 5449777, 5260798, 2512019, 8579197, -8570607, 3860102, 1909650, -556198, 419296, 549756, -3884261, 8023536, -1057099, 2836289, --2517925, -2961917, -1087701, -4472672, 4017942, -2027225, -1673427, 7879118, -6488622, -1915019, -1664837, -2899103, -889058, -156229, 2749316, 3313567, 2183991, 5644124, -1801202, -1421634, --786516, -3403225, 1869385, 3664144, 4922570, 9664, -715112, -936840, 88047, 1163936, -1063004, -1360968, 1661079, 92342, 1209033, 1114544, -162672, -266825, 2143189, -484794, -1103807, 991064, 1021129, 998580, -556735, 920197, 3602404, -129386, 227096, 556198, -2676838, 612033, -532576, -1722819, 1433445, 1159641, -570157, 617938, -6043556, -14448270, --4947266, -1644973, 2185602, -1925219, 4480188, -1099512, 7138773, -6440304, 3846680, -1700270, -13003550, 5251135, -2677912, -5647345, 3106872, -7975218, -4066260, 2889976, -2638721, -4808216, -9028558, 3583613, -393526, -4238059, -5446556, 3651259, 3019899, 2696166, -129923, -1503239, --3323768, 5124433, -6729140, -3047816, -208306, 4751308, 3830574, -459025, 5470178, 569083, --2400887, 986232, -2391223, -2705830, -2911988, 3675418, -2663417, -188979, 5099200, 7358890, -7737921, 3032784, 2810519, -586800, 4428648, -1824287, 6323266, -1164473, 4070555, 2974802, --2453500, 240518, -2697776, 2946885, 2746632, 983548, -852551, -5299990, 3801046, -5760088, --572304, -6225018, 2378338, -520765, -471910, 1108638, -5108327, 181462, 1484985, 8433705, -2881386, 1374926, 2141578, 3260954, 1590212, 1670205, -2399813, 1858647, 1577327, -3524021, --161061, 146566, 875636, 1450088, -1582696, 1067836, -976568, 205622, -74625, 2114735, -362388, 241592, 396748, 695785, -307090, 1919850, -922344, 707059, 897648, 1852742, -1035624, 2581275, -1737851, 949725, -297963, 2981244, 1298691, 1053341, -239444, -435402, -385473, -598611, -472983, -1997697, -6672232, -13990856, -11310260, 716186, -9664750, -4745402, --13684303, -7269769, -8343511, 3330747, -4461398, -5910949, -2035815, 340376, -3524558, -13267154, -3561065, -2333241, 1329829, -5995775, 5990943, 2238752, 132607, -5331128, -2384781, 6816650, -4634270, 321049, -1012539, -4540854, 2844879, 1495722, 2946885, -5439576, -505196, -4414153, --3976603, -4316979, 455803, 8829916, -7177427, 177704, -6836514, 724239, 3194382, 4019553, --7207492, 7283191, 8822400, -2880849, -2085207, -1512902, -336081, 2827162, 3569118, 906775, -2433636, -4269735, -820339, -1568737, 7598334, -2347737, 8408472, -187905, -2558190, 6722161, --680752, -3977140, 1451162, 7282117, 8374650, -598611, -2593624, -4521527, 2900177, -6044093, --579284, 4094178, -3087545, 1860795, -190589, -8053, -2475512, 84826, -1912871, -3009162, --282394, 2601140, 1387811, 2592013, -1117228, -797253, -2019708, 833761, -1625108, 2699387, -1388348, 3759170, 385473, -834834, -297427, -624381, -1284195, 1743220, -1130650, -634581, -737124, 610959, -1796907, -600759, 531502, 97174, -972273, -1735167, -68183, -1596117, --1088237, -643171, 2191507, -112206, 789200, 690416, 139586, -1234266, -334471, -105764, --10721312, -10856604, -12337294, 3559991, -9973988, -4287988, 9772124, 4621922, -10835129, -832150, -200253, 4704600, 7238631, 12108587, -3210488, -4486630, -11909944, -14829985, -8613557, -3063386, -6096169, -6075768, 2979097, -8588324, 8910983, -6470905, 7172596, -3388192, 1078574, 1747515, --1340567, -6385006, 10037875, -8696772, -354335, -4687957, 1296006, -5444945, 1305670, -21628918, -423054, 9918153, -12741020, 2826625, 8824547, 3044595, -6604586, -840740, 10605885, -13084618, -20938, 5218922, 5162551, 4900021, -1813550, -1976222, -8339753, -4264903, 3500398, 5634997, -9183177, 11033771, -16334834, 6139119, -4892505, 1103807, -11502996, -4796405, 9568650, 2225867, -1358283, -6445672, 56371, 6039798, 4515621, 2639794, -5675263, -3798899, 6003291, -1682554, --2479270, -1390496, -4169340, 3489124, -653909, -3432216, -1235877, -1246614, 897648, -2257542, --2252710, 686121, 849330, 810138, -1271310, -2009508, 1656247, -1324461, -4322885, -492848, --1269700, 2527588, -1995012, 25233, 230854, 942745, -2704219, -1643362, -967441, 175557, -2905546, -453656, -676994, 1665374, 42413, 1634235, -819802, -2057289, -725850, -3406446, -745177, -148713, -2285996, 1273995, 12867185, 21449066, 11940546, 13977971, 2133525, 4956929, -18820546, -599685, 565862, 12869333, -6294812, 19864, 3706557, 6409702, 10627897, -8659191, --12328704, 6785512, 3776887, -7172059, 1537061, 4385162, -2745021, 2514703, -6637335, -1513439, --7752953, 2372433, 8450885, 2614561, 7402376, 5710159, 6024229, -14676977, 769336, 17055852, --2030446, -317828, 15907485, -2109366, -562641, 2343979, -2096481, -479963, 8805220, 13817984, --13587666, -2228014, 2711735, -4184372, 6414534, -2173254, 630823, 994285, -2962991, 12162811, --1560147, -4449049, 4562329, -4613332, -7597261, 2605972, 8296266, 3121904, -923418, 1666447, -7937637, 4132832, 7110855, 2130841, 883153, -96100, -6978785, -1459215, -5468567, -1265942, --2298344, -12444131, -5385352, 785979, 8011725, -3310346, 3094524, -2146947, -6577206, 2900177, -707596, -2106682, 1025423, -4019553, 192737, 978179, 2447058, 3479997, -847182, 2236067, --3029026, -4487167, -5363341, -584652, 4823785, -892279, -399432, 1598802, 243203, 515396, -2582349, -1282048, -508954, -1442035, 3719442, 68183, -590021, 421444, -985158, -2018635, --2441152, 972810, 2086817, 2632815, 1416266, 1031866, -519154, -191126, -15569, -886374, --3751117, 1180579, 36203888, 5024575, -781147, -216896, -17388712, -5083631, 1665374, -4055523, -7653632, 3369402, 12412455, -1588601, 537, -2689723, -5274757, 8327942, 1545115, 3177739, -4657355, 6513318, -6165963, -6199249, -7174743, -4992363, -4124779, -1815161, -9849971, -1949378, -15817291, 7448010, -3053722, -1099512, -1904281, 1293322, 5573257, -2778307, 22609782, -3972845, --664109, -10319196, 4060355, 9845139, -1751273, -7607461, -1035087, 3764002, 7531225, 3231426, -10607495, 15883326, 5129802, -389231, 9401147, 7679402, 2825552, 5921150, -19924890, 4552666, -455267, -17630304, 6382859, -472446, -7645042, 4889821, -8105140, -7878044, 9240622, 7264937, --4220342, -15616501, -7119445, 3664144, -9022116, -1894618, 3821447, 15198816, -2566243, 3011846, --8052527, -16857746, -9104794, -8120173, -3738769, 7935489, 998580, -5651103, -1788317, -3555696, --3489124, 5041218, 4162897, 1560147, 3537443, 4236985, -3750580, -2764348, -2816962, 491237, --3081102, -4501126, -4394289, 1765232, -1569811, -727460, 485331, 1488206, -3757023, 1965484, --908922, -536871, -1738388, -689342, -2415919, 5624260, -3669513, -1337346, 881005, -3782256, --3680250, -2803540, 79994, 2804614, 2273648, -19421842, 12317966, -2452426, -12167642, -718870, -11476689, -13088913, -2496987, -10595684, 7091528, 2006824, -3602941, -4638028, -1376000, 6685117, -5494874, 2746632, 7395934, 6089190, 854162, 7399692, 8949101, 3399467, 5046050, -9121437, --4151086, -6415071, 5717675, 6973417, 2771865, 2011655, -4022237, -3307662, -2387465, -2506650, --7362111, 6717866, 1792075, 243739, -7893076, -2623688, 13060459, -9463424, -9681930, -15358266, -5492190, -11568494, 16695075, 18886044, 13347685, 7497939, 931471, 14721000, -7693360, 11528229, --1333587, -8560944, 809601, 488553, -17757542, -8182987, 6926172, 833224, -2850248, 2517925, -15243376, 10102837, -17112760, -4570382, -73551, -651761, 5173288, 7172596, -166430, -14067629, -5764383, -8244190, -25554518, -7681549, -5055177, 7796440, 13178033, 4197794, 830002, 474057, -575526, 970663, 9441412, -154082, 1561758, 1005022, 4863514, -8374650, -246424, 2331094, -6298570, 7173669, 2798171, 4185983, 6710350, 8410620, 11276437, 4050691, 5683316, 5235565, -474057, -682900, -1806034, -1543504, 260919, 2084670, -6272800, -1777043, 3985193, 5900212, --441308, 1532767, -618475, 2380486, 256087, 3725347, -412317, 3566434, -2563022, 4615479, -314606, 4350265, -16077136, 1586454, 1808718, 10050223, 2187212, 25704842, 4113505, -10632192, --3416110, -8954470, 16273094, -20867098, -1844152, 14398341, -31477278, -12445205, -10609643, -11025181, --20871394, 1961726, -3643206, -8972724, -1122597, 9870372, 1262720, 1299228, -6142877, 2439005, --2065879, 2425046, 32212, 1553168, 8077223, -1966021, -479426, 16383153, -10581726, -2141578, -2851858, 14112189, -7392713, 20153060, -6082748, -8146479, -17237852, -22458384, -6532646, -16716013, -8172786, -5072357, -12530030, 1714766, 2047626, 9248138, 7840463, 3272228, -1568737, 28533078, -15808164, -1795296, 2802466, 9776956, 7323456, 4753992, -3843996, -546535, -5100274, -6639483, --6133750, 4313221, 22267794, -15540802, -3791383, -8842801, 16051903, -4206384, 4986457, -2268280, -7546258, -17597018, -13160854, -4526896, 7505992, 2398739, 6483253, -3870839, 4005594, 6060736, -5312875, 2543695, -1035624, -7482907, 4748623, 1802276, -6363531, -4438849, 4008278, -4156992, --3163780, -92342, 4313758, -3952981, 5194226, -3198140, 7413651, -4072166, 841277, 2632278, -1359357, -3515431, -6748468, 5295695, -2019708, -1462436, -517007, -644245, -2127620, 5034776, -6212670, 4372814, 3804804, -668941, 2196876, 7192460, -3832185, 2889976, 1242319, -88584, -1573032, -378494, 389231, -2488397, 3307662, 1048509, 3155727, -929324, 1383516, -538482, --2585570, 1888712, 479426, 2225330, 3221762, -478889, -12877386, -12272869, 6895033, -5475010, --23144506, 11484206, -6934225, 9179419, -6692633, 11541114, 7781407, 9601399, 15262703, 2518462, -12907450, 5242545, 3302830, 8826695, 2993592, 2442226, 587337, -338766, -8269960, 7357816, --16749299, 7335804, 1705639, -4763119, -9044664, -213138, 6419903, -7439420, -3156264, -11135776, --4361540, -13713831, 830539, 7577933, -176094, -1762010, -8753680, -15145665, -11049340, 11869679, -3920232, -4923107, -8747238, -2117956, -732829, -14809047, 12518219, 11441256, -14637785, -14175003, --23289460, -3524021, -27858768, 7512435, 10803990, 5717139, -1766305, -3537979, -2905009, 11434277, -11515881, 13335337, -8706436, -6886443, 8880382, -3834332, -4184909, -16304233, 7218230, 13343390, -15238007, -3585761, 8333847, -4684199, 2484639, 8361765, 4281546, -5873368, 2736968, -10062572, --6158446, -4168803, 1471026, 4262755, 3621731, -3981972, -3686156, -1479079, -4542465, -882616, --6248641, -7739531, -4095251, -3221762, -2404645, -1025423, -2283849, -3073586, 646929, -135828, -4460861, -1548873, 5705327, -1505923, 4547297, 314069, -2621004, 1173063, 11563126, 3594351, -5877663, -2670933, -4725538, 956704, 4179540, -4050691, 8366060, 8453569, 2374580, 3968550, -1713155, -9673340, -5144834, -4734128, -690953, -260919, -4231080, 22275312, 25614112, -10101763, --637803, 6977175, -20840256, -3810710, 25755308, 940598, -28213640, 3124052, 8565239, -642098, -9687836, 23136988, -9571335, 20912196, 11220602, 17849348, 4894652, -13631152, -14652818, 11674795, --13312251, -20713016, -6139656, -24616068, 5295695, -1648731, 8615704, 7522635, 5242008, 2783139, --1133335, 693637, 12369506, 6107444, -24297166, -2831457, 7929584, 15515032, 8486855, 19219978, -17177184, 13572097, -6598681, -2335925, 3413425, 34992172, -14848239, 2543158, 7228430, 13707925, --5858873, -19491098, -4289599, -4939213, -11931419, -21561810, -23725936, 6415608, -13410499, -9995463, -5851356, 18465138, 22567368, 381178, -1535451, -330712, 17265232, -11940546, -6331856, 20673826, --22869090, 2442763, -18130130, -12046310, 1050656, 23972896, -4189741, -16524350, 21150566, -22033720, -590558, -26586384, -2647847, -3416110, 7488276, 14650133, -11236171, -6298570, -8047695, 1884954, -203474, -8312373, 4313221, -2535105, -2676302, -3611531, -3194919, -9834938, 1814624, -4799089, -3063922, 2503429, -1101122, -2272575, 5504001, -122407, -322659, -11595338, 1296543, -1109712, --812823, 10560788, 631897, 2882460, -4920422, 1587527, -3044058, -6376416, 2254858, -12848932, -3747896, -4530654, 9011915, -7712688, -1544578, 1598265, -1590749, -2137283, -4501126, 6902013, --5230734, 7526930, -3307662, -4931696, 4837207, 4159139, 12458626, -14579803, -31368830, -7891466, --10696616, -10864657, -6188511, 1070521, -10509785, -9616969, 3405909, 6665253, -6467684, 16398722, --1463510, 10847477, -5332202, -1089311, 10052908, -14280229, -8327405, -5142687, 14816563, -3917547, --15547782, -6433861, 2740189, -8141648, 6935299, -11092290, -10380936, 15131170, 4854387, -12783970, -7820062, -1935420, -9401683, -1394791, -15804406, -14321032, 3069291, 23721104, 10063108, 7073811, --19065896, 14464376, -1406602, 10970420, -6447820, -13959717, 6862821, -25356414, 21086142, -34167000, --21056078, 7325067, 18843632, 954557, 22501870, -10202158, 6113886, -15902116, 21120502, 6206765, -15778099, 6638946, 3919695, -5389110, -4914517, -10676215, -3278671, -1114544, -17683454, -11229192, -1839857, -27727236, 1796370, 30048664, 9373766, 10488310, 3202435, -14388140, -10181220, -3353833, --3093987, -1515050, -5141076, -7828115, 6334003, 3459059, 5767068, 8092792, -8483634, 5121749, --3078418, -5262409, -3325379, 7134478, -2372433, -8948027, -12482786, -651224, -7430294, -4170950, --7626788, -2752000, -4929549, -3668439, 12173011, -7116224, 2941516, 3120294, -9396315, 10357314, -300111, 5950141, 8818105, -4612795, 4454955, 1324997, -201863, 2051921, 7399155, -4801774, --3911642, 6021544, 743029, 2619930, -1847910, -2542084, 391379, 5025112, -23607824, -22515292, -2454574, 8915815, -10996727, -50611356, -10268193, -515396, 6838662, -17290464, 1729261, -9755481, --1723356, -13827647, -14894410, 13201656, -14477798, -18337362, -2800856, -12912819, -13659607, 4533338, --19959250, -6950331, 12453795, 27674622, 22818088, -1336809, -13508746, 4568772, 20564304, -1198296, -13762149, -4136591, 17268990, 9306120, -17220672, 27553288, -20944408, -11456825, 18977850, -20890720, -6481643, -5001490, -15271830, 1569274, 23788750, -5144297, -13577465, 8551280, 11803644, -593242, -5034776, -34106872, 8427800, 1154273, 17331266, 8006893, -14591615, 14484240, -7655243, -1546188, --13504451, 7050189, 20086488, -4347581, -3670050, -20589536, -28496034, 16093242, -1826435, 12914967, --15469935, 11700565, 9813463, -20726438, 1432909, 17954038, 10660109, -9819906, -16199006, 14633490, -2681133, -13052406, 12384538, 1735167, 5660767, 1172526, 5277441, 673236, 13806709, -82678, -4917201, -1190243, 811749, 11763915, -3631932, 22549, 2985539, -3434900, 2443300, 796180, -8560407, -712428, -9009231, -1427003, 1421097, -5797132, -1396938, 297427, -3454764, 12165495, --2701535, -7456063, 1029718, 7621420, 3965329, -739808, 4755603, 314606, -4955856, -979789, -13329431, 8607651, -8630737, -6831146, 2116882, -3081102, 19081466, 18939196, -51244328, 19255950, -26126286, -6725919, 18205292, -285615, 9482751, -4271882, -10459856, -6924024, 11019275, 2472291, --14733885, -9739375, -1273995, -7061463, -3700114, -1699196, 31858994, 6279779, 7130183, -19755776, -13772886, -14098230, 303869, 2353642, -21374978, 9920301, -7864085, 1010928, -8597451, -15632070, -518617, 10195179, 29527364, 10474888, 3154654, 18094698, 7802882, -2308545, 3087545, 347355, -5234492, 2870649, 20059644, 8624294, 6130529, 3180423, -2464238, -6319508, -19557670, -16616155, -2388002, -2474975, -12030203, 1605781, 14838575, -22605486, 21822192, 5480379, -7905961, -1022739, --5720897, -1923072, 13256953, 5632850, 4384625, -15403363, -3010772, -21008832, -6346351, 5691906, -7733089, 7484518, -8946954, -7386807, 16284369, -2036351, -26138634, 3641059, -382252, -416612, --15394773, 4947266, 11682848, -1732482, 16773458, 11110007, -5511517, -444529, -7136088, 8869644, --681826, 2829847, 1464584, -3931506, -3072512, -836445, -3187940, 3509525, -7089381, -849867, -521302, 3738769, -3606699, -4459250, -5033702, 129386, -1154809, 2709051, 1745367, -306553, --3107409, 3316789, 2726231, 353261, 3901978, 530965, 2819646, 2353105, 3709778, -1166084, --13058311, -667331, -3650185, 2625836, -6031208, -45653892, 70745624, -69940856, -31597538, -15992311, --4745402, 40897216, 12052215, 45788108, 11468100, -9368934, 36118528, 15610596, -12178380, 16915728, -15350750, 8564702, 14367739, 13897440, -12337294, -19988240, -14190572, 2317135, -13043279, 6921877, -4157528, 8973797, -1343251, 6208375, 2146410, 22505628, 5389110, 2136746, 6979859, -5220533, --256087, 7961796, -14047764, -20037096, -13577465, -11643656, 2061584, 5983427, -14078903, -2268817, --8442832, -34745748, 17590038, -6247567, 8939974, -18253074, -6139119, -16901234, -23147190, 8822937, -6239514, 22652732, -890669, 19967840, -8344048, 16738561, 2055679, 23868208, -16770774, 14795625, -17790292, 9859634, 10362682, 942208, -7130183, 27952720, 18757732, -1769527, 33735896, 8138963, -4047470, 14484777, 21790516, 353798, 10082973, 12611098, 5838471, 5564130, -2392297, 1204738, --19532438, -4927401, -2524904, 3229816, 4254702, 3995393, 13202193, 5888937, 6798397, -5006858, --578210, 5252745, 685047, 549219, -4529043, 5495948, 4704600, 2711198, -3497177, 6958921, --885837, 1349157, -5142150, -4784594, -1816234, 679142, 770410, -3078418, -10645076, 2653216, -2517388, -2779918, -367757, -2619393, 994822, -3801583, 2846490, -3650185, 351114, 9862856, --2565706, -9434433, 6433324, 4698694, 3994320, -2128693, -1080721, 43309376, 3600793, -25885768, --38356744, -20151986, -16094316, 5238250, 31480500, -420370, -13535589, 28391344, 2166274, -22780506, -20400020, 22397180, -4265977, -347355, -2349347, -20177756, 22306450, 1324997, 12578885, -7087770, --18209588, -31436476, 5526549, 4010963, 4653060, -4414690, 9673340, -10447508, -353798, -20162724, --25376814, 8835285, -3424700, 8000987, -3881577, -9336185, -23021024, -35350804, 17858474, -19770808, -7835094, 16962436, -1465121, -9137006, -17631914, -12549894, 40396316, 9190156, -2151242, 5223754, --5677947, -16520055, -5708012, 23512262, -23130010, -38470560, -13733695, -12280922, -54114976, -42126648, --22967338, -23483270, 5427765, -368293, -19071802, -36010080, -14560476, -17097192, -12549358, -9964324, --7607461, -21618718, -20960514, 16103980, -18665390, 980326, 2367064, -22671522, -4351339, -16602733, --20982526, -5194226, -3777424, 9334038, 3575560, 12615393, -13579613, 3157338, 7103339, -285078, --18128520, -10235981, -12322798, -1395328, 5294084, -6260989, -9081708, 15062450, 8636105, 10760504, --18563922, 2801393, -9297530, -1285269, 250719, 1516124, -2685965, 17959942, 908386, -3513820, -1770063, 6087043, 8668318, 7261179, -1763084, 10489384, -8355322, -4488241, -3930432, -14491220, --988916, -4673462, -18782966, -15582141, 2022930, 389768, -921807, -5043366, -4634270, -1770063, --3324305, 29300266, -3157875, 27896886, 42199664, -8069170, -45041324, -44302052, -9141838, 20718922, -3200288, -34840236, 27388470, -6248104, -22297860, 27443230, -51920248, -11312944, 544387, -9582072, --7738458, 63009856, -26286810, 59029492, -2683281, 12168716, -4144107, -23760296, 38261716, 9781788, -39771396, -27390618, -26458610, 8331700, -42825656, -13196287, -6693707, -30231738, 62512712, -5711233, --64409476, -1264331, -28599650, 8142185, 16119012, 25637196, 21243446, -25793962, -15779710, -39980776, --11444477, -18655190, 17207786, 10994579, -1973001, 11457899, -7770133, -28421410, -11364483, -33121714, -33890512, -25658672, -17403744, 30039538, 7325604, 50947440, 24971476, 4268124, 27173184, -36393944, --13348221, -37563784, -36154496, -5783711, -5127654, -45771468, 47159276, -8439611, -36323076, -54466628, -3711389, -10923712, 39942660, -2675228, 2217277, 5214091, -6982006, 7425999, 9101573, 18568754, --12364137, -12708808, -7919920, 472446, -2146410, -2704219, -11678553, 13111461, 8293045, 15663209, --3564286, -8572218, -7154879, -2839510, 3081102, 21028160, 22519050, -3685619, 1358820, 12140799, --3267933, -28072444, -13502303, 1743220, 3974992, -2202245, -17769890, 6277095, -2013266, -4233227, --20375324, 8057359, 7038915, 24445344, 4098473, 6066642, -1103270, 10104447, 1856500, -5737003, --10763725, -775242, 1302449, 7991861, 3744675, -4575214, 782221, -84434760, 43488692, 10273562, --18504330, -13590350, 26776974, 15047418, -16578037, -4284767, -40075804, -16505559, 16706886, -34283504, -1088774, 6333466, -10759967, -22826678, -15916075, 31071404, 12182675, -6082211, -44712220, 15182173, -27733140, 16270410, -34684008, -22826678, -110595, 37582576, 3081639, -8965207, 5643587, 1306207, -18884972, -49845780, -43468292, 53557168, 8024073, 22453552, -51133196, 11160473, -2567854, 37359772, --33709588, -6316823, -51270100, 17907330, 36462660, 8688182, -22941030, 14676977, 53043384, -23835994, --25733296, -19894826, 7286412, 2287607, 46485504, -13911936, 3287798, -25169046, 7975755, -27608050, --1212791, 17812840, -34864932, 33095944, 9721658, -23953570, -37696928, -22649510, -2201171, 33381022, --60625072, -13094282, 54263692, 7233262, -24935506, -11534672, -17682380, 51445656, -6015639, -53846540, --6578280, 9127, -13604846, 21997748, -4088272, -7529615, 16347719, -1480153, -11375221, -14105209, --1801739, -12437688, 3461744, 9165460, 11780558, -10826002, -8304320, 11217381, -7674570, 10621991, --5957120, -10802916, 14484777, -8129300, 13009456, 18369038, 849330, -26625040, -2152852, -15873662, -6263673, 9824201, 6074695, -18613314, -159988, -14060112, 12781286, -3962644, -8410620, -5381057, -2484102, 4488241, -10306848, 4556424, 55711096, 28860032, 12746926, 13153874, 13305809, -8687108, --8934606, -18665928, 2246268, 6271189, 4806069, -928250, -32294932, 15577310, 6179921, -22185116, --19105626, -9525701, -11227581, 8484171, -8422968, -9334038, 2624762, -640487, -17211008, 22029424, --15842524, -4948876, -16457778, -14679661, 10521059, -6187438, -2276870, 5625871, 6822556, -1672890, --21863532, 5291400, 33774012, 7344394, -53298932, -3263102, -11668352, -16432545, 11075647, 12087649, -27400818, 13341779, -34810172, 37702296, -9444633, -25994752, 78216184, -15711527, -6830072, -25767120, --62407484, 28594282, 31506806, 10505490, 11813844, -53179212, 15348603, -4099546, -13036836, -9315247, -1996623, -5002563, 8195335, 10195179, 2061047, -7841537, -15383499, 16208133, 20143396, 28309204, --14120779, -2812667, 5855114, -4108136, 14658723, -36499704, 3384434, 6511708, -17286706, 2876554, --14431090, 5635534, 94489, 4525285, -2527588, 1044751, 1236414, -705985, -667331, -4838818, --3968550, 9786620, -5580773, -347355, 7037841, 1619740, 140660, 11949673, -10036802, 7320772, -8381629, -528281, -1913408, -10110353, 7987566, -18905910, -5505611, 12326019, 3360275, -5169530, --12990129, 3852049, -3179350, 15328201, 1974074, -32019518, -75758392, -128835600, 10741713, 130523520, -12851616, 277747488, 281244672, 101683352, 282243776, 163164736, -47176456, -4716411, -25176024, -213886688, --176745424, -124573376, -221391600, -212068848, -60050624, -133543952, -115755272, 26121454, 37507412, -28927678, -41635412, 60364692, 316754, 4109747, 120961848, 80277768, 31115964, 89006216, 167162816, 78376712, -92341800, 206156816, 82069312, 37010808, 178858000, 171901232, 8021389, 109941496, 195097280, 333934, -49908056, 115344032, -4023311, -94321776, 47221016, -19685446, -180954496, -169230832, -154954896, -302198208, --446173024, -310969600, -434073568, -579060928, -408065920, -331177952, -447165152, -285944416, -137048656, -132619464, --24606942, 133470400, 269739520, 304795584, 408446016, 555062272, 545955328, 515991456, 581759744, 580354240, -474490816, 381565984, 409119808, 271596000, 97252552, 129553928, 32440424, -238121584, -152527168, -161809664, --331832928, -280684160, -201229424, -236272064, -272879680, -170083920, -148028736, -206746304, -169966352, -88458072, --141257184, -186792960, -111631032, -79064440, -147512256, -83426520, 20434918, -46120968, -52147884, 59876676, --1134945, -74912816, -8647917, -47011100, -169132048, -117944632, -88434448, -157402496, -69536056, 39788040, -76739792, 140245184, 233785808, 270999552, 285020480, 318847648, 340082496, 334289120, 308949344, 286983808, -244514640, 193994544, 120013200, 89642944, 12015171, -75082472, -131315944, -211596928, -303880736, -296107936, --251233040, -228165312, -197125584, -135089072, -112981800, -101404712, -72184440, -47499652, -41632728, -17080548, --9271761, -6615860, 2203318, 19368156, 32132260, 40164924, 47959752, 54702852, 53946400, 52291764, -45088568, 44095892, 31992674, 25121264, 12984760, 7540889, -5583458, -14230837, -19115288, -18086644, --23982024, -23631984, -23475754, -23972360, -27299886, -19643032, -20133196, -12510703, 391379, 16029892, -23229868, 37631428, 44074956, 48703320, 51840792, 59017144, 55560232, 53575424, 51616380, 45845556, -30826054, 26853210, 21355652, 13776108, 4422206, 4271345, -6287296, -12198781, -18655728, -24482388, --35243428, -37953552, -45371496, -50705312, -55515672, -54788212, -59144920, -57855356, -54980952, -47741784, --41799160, -28247464, -18182744, -5893769, 2178085, 14578730, 20051054, 26979910, 29865592, 33560876, -31608812, 33571612, 29987462, 30001420, 25057376, 23674396, 18112950, 15127949, 8839580, 7357279, -2134599, 1916629, -1234803, -295279, -3041374, -1414118, -3238405, -1148904, -2823404, -493921, --2150168, -537, -1699733, 513249, -1098975, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +3443490, 2669859, -881005, 2043868, 987843, 5901822, -1023276, -165893, 752693, 4316979, +-847719, -4520453, -2091112, -4339528, 1061931, -1549946, -355409, -554588, 1052267, 410706, +885300, 2502355, 4618164, -2057289, -1129576, 914291, -2172180, -307090, 3602941, -1961190, +4452271, 452045, -1592359, 2947958, -4029753, -1038845, -2806761, 3937948, -114890, -1461363, +-1069984, 42950, 3667365, 143881, 4413616, 1690607, -3623879, 2932926, -1583232, -2711735, +-2211371, 3015604, -627602, 9616969, 1022739, 2415919, 1752347, -4485557, 68183, -663572, +1175210, -2547989, -1719061, 5011153, 4108673, 369904, 1709397, -460635, 2558190, -4137127, +424665, 3104725, 1960653, 315143, -316217, 2212445, -3505230, -1618666, 3739306, -2457258, +798864, 1817845, 2213519, 677531, -2801393, -1871532, 1482838, 325344, 1470489, -446677, +426276, -1402307, -74088, -699543, -408022, 797253, 1542430, 645856, -888521, -348429, +-599685, 360777, 945430, -557809, 699006, 507880, 983548, -140123, 1178432, -477815, +298500, 719407, 924492, -7346005, -6619082, -4129074, -3748970, -3259880, 1252520, 4624069, +9445170, 1802813, 2439005, -27917, -6735583, -2829847, -2500208, -6063420, 9423695, 2494302, +3744138, 2576981, -2081985, 949188, 9021042, 3590056, -2121714, -184684, -2188286, 178241, +-4174708, 2499671, -1317481, -1882269, 356482, 4781373, 505732, 1660005, 3002719, 4143033, +-7447474, 83752, 1890323, 4320200, 6657736, -3717831, -752693, -1808181, 5552856, 2995203, +3580392, -606127, 1659468, 11094437, -7017977, 1393717, 652835, -4704600, 1997160, -6567542, +-883153, 1668595, -1420024, -9895605, 2769717, 669478, -2673617, -2752537, -459025, -1500554, +3335042, -3148748, -1391033, 959388, -107374, -3063922, -150861, 2484639, -4141959, 352724, +-1133335, -1006633, -1292785, -744103, 625992, -2427730, -1823751, 343061, -1450625, -1924145, +-1970316, -688269, -1311576, 2384781, -2123861, -613643, 331249, 1190243, -148713, 66035, +-747324, 129923, -1278290, 937377, -859530, -852014, -255014, -1868848, 9994389, 833224, +3610994, -456340, -2632815, 171799, 7033546, 3537443, 4552129, 7188165, -3155727, 31139, +7058242, 2202781, 3121904, 357556, 901406, 4072166, -3686693, -1138703, 5257577, -3594888, +2077154, 2930778, -2188823, 2143726, 7036230, -3358128, 2621004, 515933, 308164, 50466, +-1422708, -4816269, -1445257, -4041027, -387621, 1636383, 3386582, 3506841, -605054, -6029597, +-517007, 8713952, -3213709, 1731409, -1541356, -9240622, 5405217, 1317481, 4020090, -701690, +4573604, 4399121, -7808788, 3097208, 259846, 2905546, -560493, -5521718, -243203, -802085, +-991601, -1062468, 3521873, -41876, 700617, 7087770, 1393180, 5631239, 197032, 527744, +1097364, -3121368, -4870493, 3325915, -3682935, 2180770, 1385127, -208306, 2342368, -2483028, +-1391569, 1549946, 93416, -4730907, 1533303, 544924, 623844, -966368, 2058900, 183610, +-804770, 2268280, -507880, -206695, -1885491, 668941, -935229, 318901, 25770, -288837, +466541, -729071, 1242319, 276489, -472983, 349503, -279173, 127775, -45634, -762357, +-61203, 16333761, 9126269, 13981729, 4495757, -5750425, 2934537, -2556043, 366683, 1388885, +-11916387, -3135326, -3297461, 3106872, 4651450, -1889249, -294742, 1608465, 357556, 8549669, +-956167, -8884677, 2890513, -5119064, 3950296, 4566087, 3595425, 5313949, -1280974, -1777580, +2126009, -1533303, -2086280, 1565516, -1395864, 3212636, 4522064, -1905892, -6879464, 2267206, +-6689949, -4250944, -846645, -13848585, 132070, -2290291, 5449777, 5260798, 2512019, 8579197, +8570607, 3860102, 1909650, -556198, 419296, 549756, -3884261, 8023536, -1057099, 2836289, +-2517925, -2961917, -1087701, -4472672, 4017942, -2027225, -1673427, 7879118, -6488622, -1915019, +1664837, -2899103, -889058, -156229, 2749316, 3313567, 2183991, 5644124, -1801202, -1421634, +-786516, -3403225, 1869385, 3664144, 4922570, 9664, -715112, -936840, 88047, 1163936, +1063004, -1360968, 1661079, 92342, 1209033, 1114544, -162672, -266825, 2143189, -484794, +1103807, 991064, 1021129, 998580, -556735, 920197, 3602404, -129386, 227096, 556198, +2676838, 612033, -532576, -1722819, 1433445, 1159641, -570157, 617938, -6043556, -14448270, +-4947266, -1644973, 2185602, -1925219, 4480188, -1099512, 7138773, -6440304, 3846680, -1700270, +13003550, 5251135, -2677912, -5647345, 3106872, -7975218, -4066260, 2889976, -2638721, -4808216, +9028558, 3583613, -393526, -4238059, -5446556, 3651259, 3019899, 2696166, -129923, -1503239, +-3323768, 5124433, -6729140, -3047816, -208306, 4751308, 3830574, -459025, 5470178, 569083, +-2400887, 986232, -2391223, -2705830, -2911988, 3675418, -2663417, -188979, 5099200, 7358890, +7737921, 3032784, 2810519, -586800, 4428648, -1824287, 6323266, -1164473, 4070555, 2974802, +-2453500, 240518, -2697776, 2946885, 2746632, 983548, -852551, -5299990, 3801046, -5760088, +-572304, -6225018, 2378338, -520765, -471910, 1108638, -5108327, 181462, 1484985, 8433705, +2881386, 1374926, 2141578, 3260954, 1590212, 1670205, -2399813, 1858647, 1577327, -3524021, +-161061, 146566, 875636, 1450088, -1582696, 1067836, -976568, 205622, -74625, 2114735, +362388, 241592, 396748, 695785, -307090, 1919850, -922344, 707059, 897648, 1852742, +1035624, 2581275, -1737851, 949725, -297963, 2981244, 1298691, 1053341, -239444, -435402, +385473, -598611, -472983, -1997697, -6672232, -13990856, -11310260, 716186, -9664750, -4745402, +-13684303, -7269769, -8343511, 3330747, -4461398, -5910949, -2035815, 340376, -3524558, -13267154, +3561065, -2333241, 1329829, -5995775, 5990943, 2238752, 132607, -5331128, -2384781, 6816650, +4634270, 321049, -1012539, -4540854, 2844879, 1495722, 2946885, -5439576, -505196, -4414153, +-3976603, -4316979, 455803, 8829916, -7177427, 177704, -6836514, 724239, 3194382, 4019553, +-7207492, 7283191, 8822400, -2880849, -2085207, -1512902, -336081, 2827162, 3569118, 906775, +2433636, -4269735, -820339, -1568737, 7598334, -2347737, 8408472, -187905, -2558190, 6722161, +-680752, -3977140, 1451162, 7282117, 8374650, -598611, -2593624, -4521527, 2900177, -6044093, +-579284, 4094178, -3087545, 1860795, -190589, -8053, -2475512, 84826, -1912871, -3009162, +-282394, 2601140, 1387811, 2592013, -1117228, -797253, -2019708, 833761, -1625108, 2699387, +1388348, 3759170, 385473, -834834, -297427, -624381, -1284195, 1743220, -1130650, -634581, +737124, 610959, -1796907, -600759, 531502, 97174, -972273, -1735167, -68183, -1596117, +-1088237, -643171, 2191507, -112206, 789200, 690416, 139586, -1234266, -334471, -105764, +-10721312, -10856604, -12337294, 3559991, -9973988, -4287988, 9772124, 4621922, -10835129, -832150, +200253, 4704600, 7238631, 12108587, -3210488, -4486630, -11909944, -14829985, -8613557, -3063386, +6096169, -6075768, 2979097, -8588324, 8910983, -6470905, 7172596, -3388192, 1078574, 1747515, +-1340567, -6385006, 10037875, -8696772, -354335, -4687957, 1296006, -5444945, 1305670, -21628918, +423054, 9918153, -12741020, 2826625, 8824547, 3044595, -6604586, -840740, 10605885, -13084618, +20938, 5218922, 5162551, 4900021, -1813550, -1976222, -8339753, -4264903, 3500398, 5634997, +9183177, 11033771, -16334834, 6139119, -4892505, 1103807, -11502996, -4796405, 9568650, 2225867, +1358283, -6445672, 56371, 6039798, 4515621, 2639794, -5675263, -3798899, 6003291, -1682554, +-2479270, -1390496, -4169340, 3489124, -653909, -3432216, -1235877, -1246614, 897648, -2257542, +-2252710, 686121, 849330, 810138, -1271310, -2009508, 1656247, -1324461, -4322885, -492848, +-1269700, 2527588, -1995012, 25233, 230854, 942745, -2704219, -1643362, -967441, 175557, +2905546, -453656, -676994, 1665374, 42413, 1634235, -819802, -2057289, -725850, -3406446, +745177, -148713, -2285996, 1273995, 12867185, 21449066, 11940546, 13977971, 2133525, 4956929, +18820546, -599685, 565862, 12869333, -6294812, 19864, 3706557, 6409702, 10627897, -8659191, +-12328704, 6785512, 3776887, -7172059, 1537061, 4385162, -2745021, 2514703, -6637335, -1513439, +-7752953, 2372433, 8450885, 2614561, 7402376, 5710159, 6024229, -14676977, 769336, 17055852, +-2030446, -317828, 15907485, -2109366, -562641, 2343979, -2096481, -479963, 8805220, 13817984, +-13587666, -2228014, 2711735, -4184372, 6414534, -2173254, 630823, 994285, -2962991, 12162811, +-1560147, -4449049, 4562329, -4613332, -7597261, 2605972, 8296266, 3121904, -923418, 1666447, +7937637, 4132832, 7110855, 2130841, 883153, -96100, -6978785, -1459215, -5468567, -1265942, +-2298344, -12444131, -5385352, 785979, 8011725, -3310346, 3094524, -2146947, -6577206, 2900177, +707596, -2106682, 1025423, -4019553, 192737, 978179, 2447058, 3479997, -847182, 2236067, +-3029026, -4487167, -5363341, -584652, 4823785, -892279, -399432, 1598802, 243203, 515396, +2582349, -1282048, -508954, -1442035, 3719442, 68183, -590021, 421444, -985158, -2018635, +-2441152, 972810, 2086817, 2632815, 1416266, 1031866, -519154, -191126, -15569, -886374, +-3751117, 1180579, 36203888, 5024575, -781147, -216896, -17388712, -5083631, 1665374, -4055523, +7653632, 3369402, 12412455, -1588601, 537, -2689723, -5274757, 8327942, 1545115, 3177739, +4657355, 6513318, -6165963, -6199249, -7174743, -4992363, -4124779, -1815161, -9849971, -1949378, +15817291, 7448010, -3053722, -1099512, -1904281, 1293322, 5573257, -2778307, 22609782, -3972845, +-664109, -10319196, 4060355, 9845139, -1751273, -7607461, -1035087, 3764002, 7531225, 3231426, +10607495, 15883326, 5129802, -389231, 9401147, 7679402, 2825552, 5921150, -19924890, 4552666, +455267, -17630304, 6382859, -472446, -7645042, 4889821, -8105140, -7878044, 9240622, 7264937, +-4220342, -15616501, -7119445, 3664144, -9022116, -1894618, 3821447, 15198816, -2566243, 3011846, +-8052527, -16857746, -9104794, -8120173, -3738769, 7935489, 998580, -5651103, -1788317, -3555696, +-3489124, 5041218, 4162897, 1560147, 3537443, 4236985, -3750580, -2764348, -2816962, 491237, +-3081102, -4501126, -4394289, 1765232, -1569811, -727460, 485331, 1488206, -3757023, 1965484, +-908922, -536871, -1738388, -689342, -2415919, 5624260, -3669513, -1337346, 881005, -3782256, +-3680250, -2803540, 79994, 2804614, 2273648, -19421842, 12317966, -2452426, -12167642, -718870, +11476689, -13088913, -2496987, -10595684, 7091528, 2006824, -3602941, -4638028, -1376000, 6685117, +5494874, 2746632, 7395934, 6089190, 854162, 7399692, 8949101, 3399467, 5046050, -9121437, +-4151086, -6415071, 5717675, 6973417, 2771865, 2011655, -4022237, -3307662, -2387465, -2506650, +-7362111, 6717866, 1792075, 243739, -7893076, -2623688, 13060459, -9463424, -9681930, -15358266, +5492190, -11568494, 16695075, 18886044, 13347685, 7497939, 931471, 14721000, -7693360, 11528229, +-1333587, -8560944, 809601, 488553, -17757542, -8182987, 6926172, 833224, -2850248, 2517925, +15243376, 10102837, -17112760, -4570382, -73551, -651761, 5173288, 7172596, -166430, -14067629, +5764383, -8244190, -25554518, -7681549, -5055177, 7796440, 13178033, 4197794, 830002, 474057, +575526, 970663, 9441412, -154082, 1561758, 1005022, 4863514, -8374650, -246424, 2331094, +6298570, 7173669, 2798171, 4185983, 6710350, 8410620, 11276437, 4050691, 5683316, 5235565, +474057, -682900, -1806034, -1543504, 260919, 2084670, -6272800, -1777043, 3985193, 5900212, +-441308, 1532767, -618475, 2380486, 256087, 3725347, -412317, 3566434, -2563022, 4615479, +314606, 4350265, -16077136, 1586454, 1808718, 10050223, 2187212, 25704842, 4113505, -10632192, +-3416110, -8954470, 16273094, -20867098, -1844152, 14398341, -31477278, -12445205, -10609643, -11025181, +-20871394, 1961726, -3643206, -8972724, -1122597, 9870372, 1262720, 1299228, -6142877, 2439005, +-2065879, 2425046, 32212, 1553168, 8077223, -1966021, -479426, 16383153, -10581726, -2141578, +2851858, 14112189, -7392713, 20153060, -6082748, -8146479, -17237852, -22458384, -6532646, -16716013, +8172786, -5072357, -12530030, 1714766, 2047626, 9248138, 7840463, 3272228, -1568737, 28533078, +15808164, -1795296, 2802466, 9776956, 7323456, 4753992, -3843996, -546535, -5100274, -6639483, +-6133750, 4313221, 22267794, -15540802, -3791383, -8842801, 16051903, -4206384, 4986457, -2268280, +7546258, -17597018, -13160854, -4526896, 7505992, 2398739, 6483253, -3870839, 4005594, 6060736, +5312875, 2543695, -1035624, -7482907, 4748623, 1802276, -6363531, -4438849, 4008278, -4156992, +-3163780, -92342, 4313758, -3952981, 5194226, -3198140, 7413651, -4072166, 841277, 2632278, +1359357, -3515431, -6748468, 5295695, -2019708, -1462436, -517007, -644245, -2127620, 5034776, +6212670, 4372814, 3804804, -668941, 2196876, 7192460, -3832185, 2889976, 1242319, -88584, +1573032, -378494, 389231, -2488397, 3307662, 1048509, 3155727, -929324, 1383516, -538482, +-2585570, 1888712, 479426, 2225330, 3221762, -478889, -12877386, -12272869, 6895033, -5475010, +-23144506, 11484206, -6934225, 9179419, -6692633, 11541114, 7781407, 9601399, 15262703, 2518462, +12907450, 5242545, 3302830, 8826695, 2993592, 2442226, 587337, -338766, -8269960, 7357816, +-16749299, 7335804, 1705639, -4763119, -9044664, -213138, 6419903, -7439420, -3156264, -11135776, +-4361540, -13713831, 830539, 7577933, -176094, -1762010, -8753680, -15145665, -11049340, 11869679, +3920232, -4923107, -8747238, -2117956, -732829, -14809047, 12518219, 11441256, -14637785, -14175003, +-23289460, -3524021, -27858768, 7512435, 10803990, 5717139, -1766305, -3537979, -2905009, 11434277, +11515881, 13335337, -8706436, -6886443, 8880382, -3834332, -4184909, -16304233, 7218230, 13343390, +15238007, -3585761, 8333847, -4684199, 2484639, 8361765, 4281546, -5873368, 2736968, -10062572, +-6158446, -4168803, 1471026, 4262755, 3621731, -3981972, -3686156, -1479079, -4542465, -882616, +-6248641, -7739531, -4095251, -3221762, -2404645, -1025423, -2283849, -3073586, 646929, -135828, +4460861, -1548873, 5705327, -1505923, 4547297, 314069, -2621004, 1173063, 11563126, 3594351, +5877663, -2670933, -4725538, 956704, 4179540, -4050691, 8366060, 8453569, 2374580, 3968550, +1713155, -9673340, -5144834, -4734128, -690953, -260919, -4231080, 22275312, 25614112, -10101763, +-637803, 6977175, -20840256, -3810710, 25755308, 940598, -28213640, 3124052, 8565239, -642098, +9687836, 23136988, -9571335, 20912196, 11220602, 17849348, 4894652, -13631152, -14652818, 11674795, +-13312251, -20713016, -6139656, -24616068, 5295695, -1648731, 8615704, 7522635, 5242008, 2783139, +-1133335, 693637, 12369506, 6107444, -24297166, -2831457, 7929584, 15515032, 8486855, 19219978, +17177184, 13572097, -6598681, -2335925, 3413425, 34992172, -14848239, 2543158, 7228430, 13707925, +-5858873, -19491098, -4289599, -4939213, -11931419, -21561810, -23725936, 6415608, -13410499, -9995463, +5851356, 18465138, 22567368, 381178, -1535451, -330712, 17265232, -11940546, -6331856, 20673826, +-22869090, 2442763, -18130130, -12046310, 1050656, 23972896, -4189741, -16524350, 21150566, -22033720, +590558, -26586384, -2647847, -3416110, 7488276, 14650133, -11236171, -6298570, -8047695, 1884954, +203474, -8312373, 4313221, -2535105, -2676302, -3611531, -3194919, -9834938, 1814624, -4799089, +3063922, 2503429, -1101122, -2272575, 5504001, -122407, -322659, -11595338, 1296543, -1109712, +-812823, 10560788, 631897, 2882460, -4920422, 1587527, -3044058, -6376416, 2254858, -12848932, +3747896, -4530654, 9011915, -7712688, -1544578, 1598265, -1590749, -2137283, -4501126, 6902013, +-5230734, 7526930, -3307662, -4931696, 4837207, 4159139, 12458626, -14579803, -31368830, -7891466, +-10696616, -10864657, -6188511, 1070521, -10509785, -9616969, 3405909, 6665253, -6467684, 16398722, +-1463510, 10847477, -5332202, -1089311, 10052908, -14280229, -8327405, -5142687, 14816563, -3917547, +-15547782, -6433861, 2740189, -8141648, 6935299, -11092290, -10380936, 15131170, 4854387, -12783970, +7820062, -1935420, -9401683, -1394791, -15804406, -14321032, 3069291, 23721104, 10063108, 7073811, +-19065896, 14464376, -1406602, 10970420, -6447820, -13959717, 6862821, -25356414, 21086142, -34167000, +-21056078, 7325067, 18843632, 954557, 22501870, -10202158, 6113886, -15902116, 21120502, 6206765, +15778099, 6638946, 3919695, -5389110, -4914517, -10676215, -3278671, -1114544, -17683454, -11229192, +1839857, -27727236, 1796370, 30048664, 9373766, 10488310, 3202435, -14388140, -10181220, -3353833, +-3093987, -1515050, -5141076, -7828115, 6334003, 3459059, 5767068, 8092792, -8483634, 5121749, +-3078418, -5262409, -3325379, 7134478, -2372433, -8948027, -12482786, -651224, -7430294, -4170950, +-7626788, -2752000, -4929549, -3668439, 12173011, -7116224, 2941516, 3120294, -9396315, 10357314, +300111, 5950141, 8818105, -4612795, 4454955, 1324997, -201863, 2051921, 7399155, -4801774, +-3911642, 6021544, 743029, 2619930, -1847910, -2542084, 391379, 5025112, -23607824, -22515292, +2454574, 8915815, -10996727, -50611356, -10268193, -515396, 6838662, -17290464, 1729261, -9755481, +-1723356, -13827647, -14894410, 13201656, -14477798, -18337362, -2800856, -12912819, -13659607, 4533338, +-19959250, -6950331, 12453795, 27674622, 22818088, -1336809, -13508746, 4568772, 20564304, -1198296, +13762149, -4136591, 17268990, 9306120, -17220672, 27553288, -20944408, -11456825, 18977850, -20890720, +6481643, -5001490, -15271830, 1569274, 23788750, -5144297, -13577465, 8551280, 11803644, -593242, +5034776, -34106872, 8427800, 1154273, 17331266, 8006893, -14591615, 14484240, -7655243, -1546188, +-13504451, 7050189, 20086488, -4347581, -3670050, -20589536, -28496034, 16093242, -1826435, 12914967, +-15469935, 11700565, 9813463, -20726438, 1432909, 17954038, 10660109, -9819906, -16199006, 14633490, +2681133, -13052406, 12384538, 1735167, 5660767, 1172526, 5277441, 673236, 13806709, -82678, +4917201, -1190243, 811749, 11763915, -3631932, 22549, 2985539, -3434900, 2443300, 796180, +8560407, -712428, -9009231, -1427003, 1421097, -5797132, -1396938, 297427, -3454764, 12165495, +-2701535, -7456063, 1029718, 7621420, 3965329, -739808, 4755603, 314606, -4955856, -979789, +13329431, 8607651, -8630737, -6831146, 2116882, -3081102, 19081466, 18939196, -51244328, 19255950, +26126286, -6725919, 18205292, -285615, 9482751, -4271882, -10459856, -6924024, 11019275, 2472291, +-14733885, -9739375, -1273995, -7061463, -3700114, -1699196, 31858994, 6279779, 7130183, -19755776, +13772886, -14098230, 303869, 2353642, -21374978, 9920301, -7864085, 1010928, -8597451, -15632070, +518617, 10195179, 29527364, 10474888, 3154654, 18094698, 7802882, -2308545, 3087545, 347355, +5234492, 2870649, 20059644, 8624294, 6130529, 3180423, -2464238, -6319508, -19557670, -16616155, +2388002, -2474975, -12030203, 1605781, 14838575, -22605486, 21822192, 5480379, -7905961, -1022739, +-5720897, -1923072, 13256953, 5632850, 4384625, -15403363, -3010772, -21008832, -6346351, 5691906, +7733089, 7484518, -8946954, -7386807, 16284369, -2036351, -26138634, 3641059, -382252, -416612, +-15394773, 4947266, 11682848, -1732482, 16773458, 11110007, -5511517, -444529, -7136088, 8869644, +-681826, 2829847, 1464584, -3931506, -3072512, -836445, -3187940, 3509525, -7089381, -849867, +521302, 3738769, -3606699, -4459250, -5033702, 129386, -1154809, 2709051, 1745367, -306553, +-3107409, 3316789, 2726231, 353261, 3901978, 530965, 2819646, 2353105, 3709778, -1166084, +-13058311, -667331, -3650185, 2625836, -6031208, -45653892, 70745624, -69940856, -31597538, -15992311, +-4745402, 40897216, 12052215, 45788108, 11468100, -9368934, 36118528, 15610596, -12178380, 16915728, +15350750, 8564702, 14367739, 13897440, -12337294, -19988240, -14190572, 2317135, -13043279, 6921877, +4157528, 8973797, -1343251, 6208375, 2146410, 22505628, 5389110, 2136746, 6979859, -5220533, +-256087, 7961796, -14047764, -20037096, -13577465, -11643656, 2061584, 5983427, -14078903, -2268817, +-8442832, -34745748, 17590038, -6247567, 8939974, -18253074, -6139119, -16901234, -23147190, 8822937, +6239514, 22652732, -890669, 19967840, -8344048, 16738561, 2055679, 23868208, -16770774, 14795625, +17790292, 9859634, 10362682, 942208, -7130183, 27952720, 18757732, -1769527, 33735896, 8138963, +4047470, 14484777, 21790516, 353798, 10082973, 12611098, 5838471, 5564130, -2392297, 1204738, +-19532438, -4927401, -2524904, 3229816, 4254702, 3995393, 13202193, 5888937, 6798397, -5006858, +-578210, 5252745, 685047, 549219, -4529043, 5495948, 4704600, 2711198, -3497177, 6958921, +-885837, 1349157, -5142150, -4784594, -1816234, 679142, 770410, -3078418, -10645076, 2653216, +2517388, -2779918, -367757, -2619393, 994822, -3801583, 2846490, -3650185, 351114, 9862856, +-2565706, -9434433, 6433324, 4698694, 3994320, -2128693, -1080721, 43309376, 3600793, -25885768, +-38356744, -20151986, -16094316, 5238250, 31480500, -420370, -13535589, 28391344, 2166274, -22780506, +20400020, 22397180, -4265977, -347355, -2349347, -20177756, 22306450, 1324997, 12578885, -7087770, +-18209588, -31436476, 5526549, 4010963, 4653060, -4414690, 9673340, -10447508, -353798, -20162724, +-25376814, 8835285, -3424700, 8000987, -3881577, -9336185, -23021024, -35350804, 17858474, -19770808, +7835094, 16962436, -1465121, -9137006, -17631914, -12549894, 40396316, 9190156, -2151242, 5223754, +-5677947, -16520055, -5708012, 23512262, -23130010, -38470560, -13733695, -12280922, -54114976, -42126648, +-22967338, -23483270, 5427765, -368293, -19071802, -36010080, -14560476, -17097192, -12549358, -9964324, +-7607461, -21618718, -20960514, 16103980, -18665390, 980326, 2367064, -22671522, -4351339, -16602733, +-20982526, -5194226, -3777424, 9334038, 3575560, 12615393, -13579613, 3157338, 7103339, -285078, +-18128520, -10235981, -12322798, -1395328, 5294084, -6260989, -9081708, 15062450, 8636105, 10760504, +-18563922, 2801393, -9297530, -1285269, 250719, 1516124, -2685965, 17959942, 908386, -3513820, +1770063, 6087043, 8668318, 7261179, -1763084, 10489384, -8355322, -4488241, -3930432, -14491220, +-988916, -4673462, -18782966, -15582141, 2022930, 389768, -921807, -5043366, -4634270, -1770063, +-3324305, 29300266, -3157875, 27896886, 42199664, -8069170, -45041324, -44302052, -9141838, 20718922, +3200288, -34840236, 27388470, -6248104, -22297860, 27443230, -51920248, -11312944, 544387, -9582072, +-7738458, 63009856, -26286810, 59029492, -2683281, 12168716, -4144107, -23760296, 38261716, 9781788, +39771396, -27390618, -26458610, 8331700, -42825656, -13196287, -6693707, -30231738, 62512712, -5711233, +-64409476, -1264331, -28599650, 8142185, 16119012, 25637196, 21243446, -25793962, -15779710, -39980776, +-11444477, -18655190, 17207786, 10994579, -1973001, 11457899, -7770133, -28421410, -11364483, -33121714, +33890512, -25658672, -17403744, 30039538, 7325604, 50947440, 24971476, 4268124, 27173184, -36393944, +-13348221, -37563784, -36154496, -5783711, -5127654, -45771468, 47159276, -8439611, -36323076, -54466628, +3711389, -10923712, 39942660, -2675228, 2217277, 5214091, -6982006, 7425999, 9101573, 18568754, +-12364137, -12708808, -7919920, 472446, -2146410, -2704219, -11678553, 13111461, 8293045, 15663209, +-3564286, -8572218, -7154879, -2839510, 3081102, 21028160, 22519050, -3685619, 1358820, 12140799, +-3267933, -28072444, -13502303, 1743220, 3974992, -2202245, -17769890, 6277095, -2013266, -4233227, +-20375324, 8057359, 7038915, 24445344, 4098473, 6066642, -1103270, 10104447, 1856500, -5737003, +-10763725, -775242, 1302449, 7991861, 3744675, -4575214, 782221, -84434760, 43488692, 10273562, +-18504330, -13590350, 26776974, 15047418, -16578037, -4284767, -40075804, -16505559, 16706886, -34283504, +1088774, 6333466, -10759967, -22826678, -15916075, 31071404, 12182675, -6082211, -44712220, 15182173, +27733140, 16270410, -34684008, -22826678, -110595, 37582576, 3081639, -8965207, 5643587, 1306207, +18884972, -49845780, -43468292, 53557168, 8024073, 22453552, -51133196, 11160473, -2567854, 37359772, +-33709588, -6316823, -51270100, 17907330, 36462660, 8688182, -22941030, 14676977, 53043384, -23835994, +-25733296, -19894826, 7286412, 2287607, 46485504, -13911936, 3287798, -25169046, 7975755, -27608050, +-1212791, 17812840, -34864932, 33095944, 9721658, -23953570, -37696928, -22649510, -2201171, 33381022, +-60625072, -13094282, 54263692, 7233262, -24935506, -11534672, -17682380, 51445656, -6015639, -53846540, +-6578280, 9127, -13604846, 21997748, -4088272, -7529615, 16347719, -1480153, -11375221, -14105209, +-1801739, -12437688, 3461744, 9165460, 11780558, -10826002, -8304320, 11217381, -7674570, 10621991, +-5957120, -10802916, 14484777, -8129300, 13009456, 18369038, 849330, -26625040, -2152852, -15873662, +6263673, 9824201, 6074695, -18613314, -159988, -14060112, 12781286, -3962644, -8410620, -5381057, +2484102, 4488241, -10306848, 4556424, 55711096, 28860032, 12746926, 13153874, 13305809, -8687108, +-8934606, -18665928, 2246268, 6271189, 4806069, -928250, -32294932, 15577310, 6179921, -22185116, +-19105626, -9525701, -11227581, 8484171, -8422968, -9334038, 2624762, -640487, -17211008, 22029424, +-15842524, -4948876, -16457778, -14679661, 10521059, -6187438, -2276870, 5625871, 6822556, -1672890, +-21863532, 5291400, 33774012, 7344394, -53298932, -3263102, -11668352, -16432545, 11075647, 12087649, +27400818, 13341779, -34810172, 37702296, -9444633, -25994752, 78216184, -15711527, -6830072, -25767120, +-62407484, 28594282, 31506806, 10505490, 11813844, -53179212, 15348603, -4099546, -13036836, -9315247, +1996623, -5002563, 8195335, 10195179, 2061047, -7841537, -15383499, 16208133, 20143396, 28309204, +-14120779, -2812667, 5855114, -4108136, 14658723, -36499704, 3384434, 6511708, -17286706, 2876554, +-14431090, 5635534, 94489, 4525285, -2527588, 1044751, 1236414, -705985, -667331, -4838818, +-3968550, 9786620, -5580773, -347355, 7037841, 1619740, 140660, 11949673, -10036802, 7320772, +8381629, -528281, -1913408, -10110353, 7987566, -18905910, -5505611, 12326019, 3360275, -5169530, +-12990129, 3852049, -3179350, 15328201, 1974074, -32019518, -75758392, -128835600, 10741713, 130523520, +12851616, 277747488, 281244672, 101683352, 282243776, 163164736, -47176456, -4716411, -25176024, -213886688, +-176745424, -124573376, -221391600, -212068848, -60050624, -133543952, -115755272, 26121454, 37507412, -28927678, +41635412, 60364692, 316754, 4109747, 120961848, 80277768, 31115964, 89006216, 167162816, 78376712, +92341800, 206156816, 82069312, 37010808, 178858000, 171901232, 8021389, 109941496, 195097280, 333934, +49908056, 115344032, -4023311, -94321776, 47221016, -19685446, -180954496, -169230832, -154954896, -302198208, +-446173024, -310969600, -434073568, -579060928, -408065920, -331177952, -447165152, -285944416, -137048656, -132619464, +-24606942, 133470400, 269739520, 304795584, 408446016, 555062272, 545955328, 515991456, 581759744, 580354240, +474490816, 381565984, 409119808, 271596000, 97252552, 129553928, 32440424, -238121584, -152527168, -161809664, +-331832928, -280684160, -201229424, -236272064, -272879680, -170083920, -148028736, -206746304, -169966352, -88458072, +-141257184, -186792960, -111631032, -79064440, -147512256, -83426520, 20434918, -46120968, -52147884, 59876676, +-1134945, -74912816, -8647917, -47011100, -169132048, -117944632, -88434448, -157402496, -69536056, 39788040, +76739792, 140245184, 233785808, 270999552, 285020480, 318847648, 340082496, 334289120, 308949344, 286983808, +244514640, 193994544, 120013200, 89642944, 12015171, -75082472, -131315944, -211596928, -303880736, -296107936, +-251233040, -228165312, -197125584, -135089072, -112981800, -101404712, -72184440, -47499652, -41632728, -17080548, +-9271761, -6615860, 2203318, 19368156, 32132260, 40164924, 47959752, 54702852, 53946400, 52291764, +45088568, 44095892, 31992674, 25121264, 12984760, 7540889, -5583458, -14230837, -19115288, -18086644, +-23982024, -23631984, -23475754, -23972360, -27299886, -19643032, -20133196, -12510703, 391379, 16029892, +23229868, 37631428, 44074956, 48703320, 51840792, 59017144, 55560232, 53575424, 51616380, 45845556, +30826054, 26853210, 21355652, 13776108, 4422206, 4271345, -6287296, -12198781, -18655728, -24482388, +-35243428, -37953552, -45371496, -50705312, -55515672, -54788212, -59144920, -57855356, -54980952, -47741784, +-41799160, -28247464, -18182744, -5893769, 2178085, 14578730, 20051054, 26979910, 29865592, 33560876, +31608812, 33571612, 29987462, 30001420, 25057376, 23674396, 18112950, 15127949, 8839580, 7357279, +2134599, 1916629, -1234803, -295279, -3041374, -1414118, -3238405, -1148904, -2823404, -493921, +-2150168, -537, -1699733, 513249, -1098975, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 10289668, --462246, -504122, 3228205, -1289027, 3693135, -1934883, -4823785, 1726577, 4772246, 752693, --782221, 6429566, 181462, 307627, -2214056, -1171452, 9918690, 1428614, -6790344, -4952098, -6986301, -595390, 7246684, 555661, -1416266, -640487, 5465883, 1133335, 11511049, 5128191, -3146601, -576063, 2533494, 5267241, -1314260, -3846143, -4918812, -891206, 4378183, 3836480, -5851893, 1698660, -3316789, -3374234, -1451699, 2502892, -815507, 1398012, -696858, -5187247, --4066260, 1648731, 3795677, 2399276, -1918777, -2112587, -170725, 5754183, 2879239, -578747, --1300838, 2693481, 1762547, 1182727, -2933463, 1510755, 2714419, -303332, 4158065, 4980552, --8637179, 3212636, 1739999, 5672041, 1677185, 495532, 2547453, -1091995, -4035659, -1444183, --2438468, -759136, -516470, 2494839, -140660, -1909650, 13422, 337155, 1444720, -1222992, -222265, -197569, 507343, 796180, 508954, 1013612, 84289, 645319, -1299765, 2907156, -4461398, 9722732, -7909183, 1799054, -1756642, 134218, -10155987, 1039919, 6067178, -8987756, --1894081, 6041945, 15949361, 2311229, -135291, 1157494, -10033044, -301721, 7349226, 6568079, -152471, -187905, 580357, 3456375, 5726802, 6083821, 6527814, -2909304, 1389959, -380641, -2500745, 726386, 1602560, -10136123, -2810519, 1600949, 802085, -5598490, -207769, 3847754, --4494684, 3543885, 3228205, 6026913, 2787434, -2283312, 2972654, 6732898, -3790309, -6052683, -2007897, 1421097, 1156957, 3197603, -2718178, -4893042, -7340636, 5918465, -1116155, -1370632, --2407329, 2603287, -119185, 3841312, 7543573, 1542967, 486405, -397284, -1856500, -5896990, -9156870, 2269890, -1125281, 4756140, -775242, -5436892, -4816269, -1056025, 1778117, -7933879, -625455, -4701379, -918049, 2428804, -166967, 1278827, -1450088, -2593087, -580894, 1315334, -1769527, 1335735, -305480, -795106, -76773, 1298691, -714038, -1321776, -1017907, 252866, --529892, -4781909, -4100083, -5185636, -7303055, 4075387, -68719, -3529926, -1368484, -1817845, -1615982, -2937758, -5007395, 1116155, -3247532, 8567923, 11451993, 9008694, -6229313, -269509, --388695, 2388002, -3447248, 7060926, 4469987, -1042066, 3456912, 5347771, 458488, 1273458, -1899449, 5194763, -476741, 1913408, 6275484, 606664, -48855, -2761664, 4521527, -6825777, -2767570, -982474, -1374390, 4497368, -4353486, -583579, 176094, -5937793, 2476049, -1222455, -2757369, -222265, -2531883, 1762547, 1900523, -343061, 5268851, -406411, 6074695, -122943, --4003447, -1823214, 252866, -2779918, 5419175, 2784750, 4654671, 5223754, -2277407, -5236102, --3380139, -39192, -945967, -1142461, 4303557, 5372467, -788663, -2995203, 1900523, 1441498, --2051921, -2860448, 989453, -4093641, 1008780, -112206, -108448, -1121523, -3825205, 834297, --1495186, 124017, 1738388, -35433, -1945620, 950262, -2675228, -83215, 190052, -652835, -243203, 481573, -1455994, -9127, 195958, -1780264, 386010, -559956, -91805, -952946, --9664, 451508, 1542967, -15125264, -3554086, -4716411, -8164196, 2778307, 2152316, -981400, -3813394, -533113, 3220689, 4525285, -1978906, -5291400, -6649146, -2546379, -6190659, 482110, -701153, -2706903, 3538516, -3040300, 1905892, -1390496, -3522947, -9411884, -3644280, 836445, -1498407, 2471217, -3479461, 2496987, 3802657, 1251446, 8604967, 2135673, -198642, 6646999, --4676146, 3839701, 654446, -2234994, -3158412, 4287988, 600222, 1356673, -10109816, -1866700, --3324305, 10184441, 4389457, 3670587, 4158065, 4677757, 3725347, 5187247, -2716030, -1107565, -3204583, 5096516, -657130, 5952288, -3172907, 1306744, -1261110, 5043366, 7573638, -11778948, -3118683, -2909304, 406948, -5553393, -2828236, 936303, -1657321, -2381023, -4686346, -2119566, -2253247, -106837, 5077725, -523449, 1977833, 4381404, 6983617, -251792, 1869385, -805306, -3269007, 527744, 1608465, -2148558, -724239, 239981, 1513976, -954020, -1540820, 86436, -123480, -1210107, 221728, 716723, 66035, 2037425, -853625, -936303, 268435, 1777580, --676457, 51540, -602906, 1064078, 1666447, -214748, 1596117, 1715303, -372052, -719407, --263067, 5914707, 3607236, 2151779, -1136556, 496606, 625992, 7631083, -6069326, 7654169, --1032940, 4174708, 7817378, -4897874, 6051609, -3789772, 3095598, 1192390, 9190156, 4077535, --5151277, -8440684, 1900523, -6328635, 5183489, -1298154, 6761353, -5057861, -848256, -4051228, -2313377, 1504849, 1913408, -511101, -750009, -7375533, -3262028, 6054294, -4860293, -988379, -3908957, 178241, -3813394, 1223529, 307627, -858993, -3311957, 6613176, 2078227, -9447317, --4292283, -7630010, -1369021, -6749541, -11649025, -2661269, 5030481, 14289356, 3090766, 1163399, -6703370, -197032, -5316633, -4633733, 3725347, 1446867, 2501819, 4107599, -10161893, -2510945, --9350681, -2068564, 2570538, -3713536, -8647380, 846645, 3684545, -1866700, -3241090, -1542430, -1455457, -1305670, -402116, 1858647, -1222455, -1301375, -1777580, -1292248, -3984119, 1383516, --1069984, 1787243, -710280, 1034013, 2447058, 321586, -715649, -261456, -2146410, -1423782, --3374234, -3056943, 417686, 333397, -44560, 1156420, 1904818, 1332514, -44560, 1210107, -1004486, -942208, 718870, 761283, -1782411, -753230, 16357920, 4006668, 11818139, -5493263, --867583, -3882651, -1009854, 12744242, -10887742, 3712462, 1132261, 16661252, 8731132, 11086384, -1915555, -2647311, 5096516, -3530463, -13835163, 2700461, 686658, 1698123, 10733660, 1115618, --6458557, -475668, 188979, 3519726, 3652333, -241055, -1514513, 4504347, -5273146, -1343251, --2718178, -1245541, 1239635, 280247, 9442486, 1455457, 7393250, 8716099, 2292439, 7696582, --662499, 2600603, 4531728, -4919348, -7562901, 1014686, 7419556, -11933030, 3476776, -9139690, --8710194, -5206037, -2486249, -8033737, -7953206, -8239895, -4362613, -1995012, 5482526, 208843, -6587943, 1085553, -5607617, 8505646, -8868034, -3254512, -3729642, -3530463, -4748087, -6051072, -8652748, 6879464, -3926137, 3413962, 2654827, 6987375, -73014, 5065914, -2556043, 6349573, -3073586, -3639448, 115427, -3282429, 3901441, -3754875, 325881, 3157875, 137439, 2431488, --771484, 446140, 1547799, -486942, -1777043, 1624571, -547071, 335007, -3326989, -2616709, --2673617, -1953673, -433792, -1064078, -2326799, -40265, 375273, -988379, 171262, -14496, --1392106, 348429, -8904004, -8906688, -5283347, -5457293, -2950643, -2230699, -10675678, -8531953, --7262253, -1078037, -650151, -1309428, 7362648, 775242, 3788161, 5702106, 6606197, 1075889, -12940200, 16269336, -365072, 4734665, 3634616, -1939715, 7072201, 3882651, -14623827, -455267, --5079873, 877247, 11254425, 4523138, -11700565, -3068217, 5160940, 5184026, 681289, 14971719, --6222334, 6055904, 6063420, 6686727, 3860639, 7783555, -13182328, 4848481, -5165772, 7842611, -256624, 3396246, -9906342, 7278896, 5215164, -1243393, 5048197, -821949, 1382980, -66035, --5185100, 1369558, -3328600, 3253438, -4098473, 5084168, 1552631, 12687333, 9426916, -2954401, -3343632, -10409390, 9050570, -2827162, 5535676, 9843528, 9607305, 477278, 9813463, 6828461, -4620848, 5020817, 9013526, 918049, 1916092, -7373385, -1321776, -2103997, 1658394, -5314485, -759136, -3868692, 1170916, -3854196, 1145146, -1407676, -2462090, -2269353, 1558536, 180389, --1262184, -901406, -3183645, -1005022, 513249, -903554, -2308545, 347892, 2306398, -5385352, --3381750, -2967823, 2133525, -3299072, 1990181, 32749, 1123671, -2731599, -4085051, -900869, -747324, 8596377, -7664906, -1971927, 6791954, -3610457, 11656541, -3705483, -8295193, 15561740, -21082920, 4718559, -8373039, 5857262, -4433480, 8698919, 5009543, -1868311, -8879308, -5760625, --15072651, 3959423, 6370510, -13240310, -1619203, 7732015, 1970853, -621160, 274341, -1603633, --7223062, 1767916, 8865349, 386010, 1883880, 3245385, 12574054, -8289824, -268972, 9188546, --8421357, 12334072, 606127, 17325362, -14431090, -12952548, 7107097, 664646, -1758789, 3743601, --1220845, 4842039, 2928631, 9647570, 9139690, -7551090, 1358820, -4925254, -3015604, 5785858, --742493, -2935610, -1307281, 302258, 8583492, -16413754, 12506408, -3896072, -5622112, 9328132, --7529078, 7485591, -10121627, -5640366, -1896228, -7467338, -2615635, -5262409, -8419747, -5622112, -1813013, -1878511, -2039573, -86436, -3932580, -1213328, -602369, 5243618, -288837, 793495, -2076080, -2155537, -877247, -1818382, 1243393, 2587181, 676994, -1007707, 6098317, 76773, -4519380, -4887136, -3205656, -2883534, -2127083, 2379949, 1115081, 213675, 3538516, -2602213, -2696703, 1124208, 2506650, 1481764, 335544, -3075197, -10413685, -8028905, -3461207, -7532836, --11357504, -2441689, 4192962, 13958107, 2319282, -8495982, -15612743, -3311957, 4900558, -2782602, -16855600, 5245766, -5903970, -11934104, -14817637, -28192702, -2255932, -3149822, 10827076, 7934952, --5723044, 688805, -4418448, -2479270, 10164040, -310311, 581431, -1276679, 11525545, 1901597, --3402151, -613643, -381178, 3063922, -10405095, -3335042, -4065724, 16488916, 3899294, -17431124, -4529043, -9067213, -5034776, 2517388, -16137803, 4992363, 11710228, 10302553, 8113193, 1926830, -3303904, -566399, 1763621, -10247792, 3752728, -16019691, -3020973, 9108015, 3390340, 9331890, -9292162, 7602629, -5186710, -11834782, -10268730, -8018704, 2637110, 3150896, 5504538, 5385889, -1222992, 3586298, 11579769, 16111496, -3830037, 5717675, -3975529, -4382478, 4982162, -7125888, --2464774, 255014, -4452808, 4167729, -3863860, -3435437, -1833951, 975494, -986769, 2254858, -78383, 3279208, -746251, -2043868, -892279, -2001455, -5068062, 1333051, 2778844, -279173, -1838783, -525597, 2502355, 4671851, 4544613, 3477850, -3577171, -1862942, 3503620, -1087164, --1352915, 296353, -548145, 3456912, -753230, -229781, -503048, 8207146, 14605573, 16855062, -12236362, 20843476, -9737228, 14806900, -12678743, -9988483, 11016054, 14021994, 16616155, -17139604, --69793, 4293357, -12651363, 5987185, -5545340, -9002788, 10274099, -13346074, 14492830, -13717589, -13579076, -9849434, -3593277, -914828, -17889076, -2501282, 19790136, -5065377, -14089640, 3010235, -9206262, -10307385, 5134097, 21356188, 11521250, 4318053, 9484898, -11308112, 7580081, -6794639, --19430968, -5909338, -5058398, 1440425, 8858370, 10901701, -4798016, -8536248, 7802882, 53150, -5979668, 3713536, -3139621, 1064078, -7710540, 1178432, 2493766, -103079, 2572149, 17577690, --2146410, 1739999, 5058935, 1050120, 2194192, -8938364, -9750113, 6799470, -11612518, -15819975, --16563005, 12911209, 8393977, 2489471, -860604, -1917166, 6203007, -973347, -4616553, 5919002, -16297253, 10992432, -4255776, -2759517, 5078799, 2914672, -1095754, -2572149, 1884417, 2296734, --635118, 670552, 8873939, 2117419, 1312113, 3463891, -2820183, 650151, 2861522, 5890011, --512712, 428960, -5696737, 1872069, -2937758, -2178622, 6067715, 4833986, 372588, 3791383, --3202435, -1564979, 1867237, 45634, -1668058, -3302830, -3515431, 2303176, 1096290, -1542967, -2126009, -13518410, -21475374, 7644505, 27878096, 13653164, -5236639, -21563420, -7502771, 1376000, -2998424, -4190814, 10574209, 7141994, -7849053, -4055523, -1066763, -14272176, 19808390, -9035001, -7044283, -1660542, -4693326, -17391396, 5676336, 3604015, -2188823, 2093797, 7765301, -2849174, -19364934, -4351339, -2981244, 16159814, -1829119, -11621108, -10405095, -20068234, 2733210, -4467303, --6254546, -4388920, -14737107, -6179921, -13802951, 1451699, -12152073, 10939282, -6878927, -247497, -3383897, 1337882, 6305549, -5848672, -14913200, 6455873, -1739462, 3678640, -3353833, -1529545, -417149, 14313515, 21435644, 5802501, -6760279, 7388418, 7767449, 8496519, -3528316, -7203197, -10921028, 5152350, 14602352, 3373160, 3885335, 386547, 4377109, 13138842, 17960480, 8818642, -3017752, 6726993, 2825552, -3786551, -12334072, -7840463, 1384053, 5939403, 924492, -339302, --4629438, -1739999, 2511482, 1686312, -9751723, -1876364, 2182917, -437550, -4863514, -4083440, --5434744, 998580, -970126, 3666828, 6884296, 4028679, 213675, -2326262, 4207994, 5046587, -328028, 1664837, -6808060, -282931, -2312303, -7001334, 1458678, 1234803, -6232535, -676994, --1464584, 2310693, -2423972, 5819144, 27917, -1424319, 7854959, 41753524, 924492, -11023034, -34548716, 17670032, 15231565, 30259656, 29904246, 8709120, 9466645, 7661148, 32508070, 1792612, --11556683, 14183593, 2944737, -12614856, -14381161, 12640089, 12089259, 23517094, -2351495, 1800665, -258235, 3306051, -13966697, 15752329, 10835129, 4902169, -10861972, 16664473, -5080410, -787590, --22064858, -4716948, -1723356, -1312113, -11666742, 7685307, -10856604, -6095096, -6386080, 3220689, --7541963, -10056129, -14111652, 14921790, -10757282, 15863999, 6914361, 13041668, 3935801, -13117367, --737661, -21135534, -9901510, -11489574, 4352950, -14659260, -8122857, -2610803, 3221, 15342160, -1472100, -2330557, -24581172, 9752260, 8143795, -519691, -378494, -12320114, 9326521, 1086627, --10792179, 29006062, 6332393, -3721052, -534723, -11620034, 1745367, 14553497, -4031901, -1157494, --16294032, -9491878, 5640366, -2215666, -7852811, 9431748, 5537287, -9549860, 8320963, -3286187, -2488397, -3177739, 8134668, 1832340, -1537061, 261456, 1797981, -11518565, -103616, -4239670, -3190624, 3983045, 5410048, -4717485, 3879966, 3123515, 2232846, 4262218, 4749697, -341987, -3599720, -5538361, 9506910, -4400194, 8000987, -5699422, 3394098, -12678743, -23252416, 7141457, -7002408, -7194070, 15134391, -16734803, 18177912, -13114146, -7638600, 5851356, 4205847, 46917148, -18330920, 7028177, -29279328, -779000, -6950868, -15518254, -4510790, -5672041, -5138929, -1737314, --24349780, -468688, -9214852, 301721, 11850352, -12915504, 15378130, -5042292, -17027398, -15187541, -12182138, 9347996, -3811247, -8385387, 15538118, -8386461, -7925289, 12217034, -354335, 3759707, --12592307, -424128, -7406134, 15669651, -2368675, 22478248, -8414378, 3378529, 6766184, -642098, -852014, 6857989, -14500883, -2323577, 18462454, 1498944, 5061619, -171262, -14987825, 6403260, --10465762, 5325223, 16137803, 20950314, 22836342, 24054502, -5201206, 8442832, -205085, 12908524, -29139742, -32017370, 24879672, -14802068, 6677064, 20012400, -12641162, 1289027, 6269579, 5457830, --1509144, 13929116, -5412733, -4404489, 5874979, -3340411, 13402982, -1990181, 5070209, -10815801, --1774895, -323196, -8730058, -3665218, -11008538, 114890, 3160022, 1068373, 12184822, -4028679, -804770, 1316408, 5168457, 1275605, 5213017, -7233799, 5423470, 1671816, -326954, 3877819, -5316096, -6082748, 5522254, -11696270, -10357314, 7212861, -3487514, -8297877, -1215476, 3395172, --5355288, 9415642, -11256036, -24722368, -4832375, 5019743, 322123, 5819144, -18398030, -2472828, --3786014, -26129508, -20268488, 10424959, 10835129, 5050345, 7463043, -13359496, -6593312, -9458592, -28570122, 6903623, 763430, 21461952, 12298639, 10814728, 9666361, 8469676, -15126875, 10907606, -4371740, -4587025, 8497593, -7557532, -7555921, 14997489, -6529424, 9476308, 19683298, 757525, -3738232, -278099, 1238024, -4218195, -11613592, -14539001, -23801098, 9817758, -20168092, 7640747, -7787313, 10214506, 23085, 706522, -2864206, -15391015, -7396471, 7963406, -5416491, 8216810, -19689204, -5964636, 15050639, 7023882, 1629403, -752156, -5432060, -14230300, -652298, -19266150, --6779606, 20881058, -11143293, 3414499, -34302832, 16380468, -6392522, 5362804, -26480084, -23386096, -2174864, 6436546, 12046310, -27154394, -2936684, 478352, 18549964, 15372225, 17164836, -5348845, -317828, 2756832, 8953933, 2289755, 4903242, 14374719, 8031052, -5272609, 5114769, 1541893, -970663, -151934, -3069828, -11585137, 4079145, -5524939, 1709397, 4821101, -197032, 1216013, --206158, 4839355, -2946348, 19360102, 5162014, -576063, 10650982, 6664716, 841277, 3398393, --377420, -8373039, 11195369, -3492345, 1460289, 13643500, 7417409, -3997541, -2684, -5157182, -8799851, 6343130, 7504919, 6675453, 20433844, -48400524, -11907797, -28752122, 9699647, -25822954, --8657580, -29264834, 7824894, -15265924, -11705933, -2510409, -24850680, -9047885, -26626112, -13458280, --30828738, 6635188, -28522878, -11290932, -14820858, -8318278, -7836168, -6676527, -27227946, -15583215, --20715164, -10644540, -5985037, 11740830, -1705102, 8759586, -16946868, -2775086, 975494, -19541028, -3773666, -1385664, 1654099, 5096516, -19764366, -1134408, 7289097, -2462090, 8216810, 16393353, -29733522, -24717536, 1518808, 33031520, 160524, 16204912, -11584064, 20462298, 3743601, -4909148, --27478664, -16199543, 22818624, 14068165, 22282290, 797253, -15542950, 5659693, 8051990, 15916612, --29880624, 196495, 5661304, -16512539, -5496485, -7148436, -10002979, -23964844, 37035504, -6822019, --11898133, -7617662, 7679402, 8875550, -20929912, -19472844, -771484, 6180995, 971736, 48318, --4081830, -7085623, -89657, 18644990, 11563126, -136365, -15367393, -10649908, 1727114, -5942624, -4072166, 4912906, 2512556, -1633161, -7926899, 3229279, 3930432, -2205466, 5950141, -3473018, --13646185, -6495065, -779000, 3951907, -1013612, -4401805, -19968376, -7995619, -4572530, 1497870, -2506114, -8642548, -15467788, 6047314, 9290551, -8218420, 372052, -7226820, 7824357, -2532420, --13719199, 20590074, -34749508, -365609, -6883759, 15025943, -7646116, -21415780, 18715856, -37593848, --32413582, -26754426, 15353434, -7954280, 871878, -14585172, -13802414, -16129750, 9084393, 7867307, -26230976, 12353400, 5324149, 24424942, -6468758, 8869644, -8777839, 7652558, 4440996, 14565308, -23536958, 12304544, -4861366, -14352170, -8548059, -2908767, 13234942, -4325569, 3716221, 530965, --6033892, 12520903, -756451, 10286984, 7646116, -19981262, 16547972, 30373472, 4763656, 25415468, -24601572, 11182484, 8172249, 102005, 13019120, -8036958, -29461328, -9558450, 21953188, 264141, --10806138, 11337103, 31161062, -7051800, 2426657, -22462678, 22228066, 19946902, -1400159, 6461242, --10116259, 51125144, -31996432, -27755690, -26209502, 2295660, 981937, -7656316, 22814866, -31894428, --496069, -20355998, 7864085, 9140764, -1386201, 22272626, 5167920, -1787243, -11958263, -52076, -5657546, 16263967, -11023034, -14159433, 6007049, -8392366, -2177549, 2087891, 3938485, 1436130, -154082, -949725, -13351443, 1398012, 3282966, 9342091, -7873749, -4373351, 5264556, 2581275, -3683471, 455803, -8699456, -858457, -9883793, -7444789, 10085120, 5217312, 5710696, 4057134, --269509, 2084133, -2641405, 6208375, 906238, -2583423, -514859, -8602283, -3212099, -5665599, -3605625, 56146496, -12625056, 31411244, 53327388, -17985712, 25399362, 11656004, -34111704, 31150860, -4365298, -14500346, 22434762, 9965935, 21057688, 82678, -18367964, 17329120, 5544266, 350040, -5047661, -4907000, -19415936, -11125039, -9469329, -16264504, -12593381, -2874944, 12362526, -11120744, --7166153, -16020228, 3109020, 1644436, 2267206, 22584012, -13710072, 5632313, -12745315, -6760816, -12476880, -9992241, -23264764, -29204168, 33566244, 15311558, -8761733, 23624468, -21853868, -18596134, --11800960, -1647120, 3084860, 398358, -20370494, -14485851, -16006806, -34186864, -21858162, -18311594, -6294812, 11781095, -1302449, 20218022, 3444564, -20365124, -18120468, 27194660, -23479512, 3471944, -23272818, -2894271, -41038412, 28625420, -15358266, 4714801, 1478006, 23708756, -6008123, -8886287, --1547799, -13346611, 6708739, -23123568, 7558606, -29774860, -19503446, 11691975, -13033078, -3546032, --1990181, -17641578, 5471789, -10264435, 8157217, -2611877, -670552, 1002338, 10723996, -7900056, --6704981, 2035815, -11565810, -4872641, 1366337, -7247758, -8202851, -5325760, -3684545, -8471823, --5118528, 12148315, -10158671, 4735739, 6947647, -1694365, 7453379, -10319196, 812286, -7234336, -14847165, 2913062, 5126581, -10562398, 12998719, 9233106, 9871445, 4376572, 971736, 3330747, -7089381, -7229504, 462783, -6010270, -27130772, 16314970, -7689065, 27520540, 18867254, -43670692, --5509370, 4770098, -26657788, -4217121, -4362076, 32467268, 23342074, 21734682, 26920318, -872952, --18862960, -14475114, -15014132, 844498, -41787348, 5149129, 35786204, -32488744, -58886148, 6129992, --22035330, 43576200, -289910, 1557999, 29127394, -13215614, 5984500, -1218160, -7913477, 25426744, --7298760, 12927315, 42526620, -31168040, -17861158, -28397250, 14199699, 2493229, 28470802, -16203301, -11216844, 1640678, 25930866, 15396384, -12681965, -8321499, 9810242, -4573604, -1155883, -18204218, --18068928, 9596031, -4034048, -5216775, -10275172, 23589572, -8908299, -9327595, 39385388, 42210940, -27274652, -35679904, -3176128, -11144903, 13903346, 52536040, -6633040, -39860516, -2617246, -16363289, -23542326, 10631118, -26780194, 14205067, 10404021, 13858786, -25838524, -9215389, 1923072, 22985592, -1417339, -3588445, 3760781, -7751879, 1811403, 22969486, 11118597, -9435506, -11438572, -2512019, -7219303, 9240085, 12096239, -11334419, -4328254, -20850456, -4380867, 13345537, -13136694, -1977833, --8109435, -7439420, -12338367, -2498597, 8424041, -1793686, -881005, 2195802, 5374615, -5466957, --15742666, -16254841, 9879499, 7677791, 13798656, -6793565, 10131291, 29702920, 1570347, -17627620, --2833605, 1699733, -1573032, -10991895, -4508642, 3362960, 8637716, -1745904, -25593710, 3745212, --20978768, 19320910, 11311333, -20750598, 35316980, 53223772, 1644973, -2583960, -18114562, -18559090, -3244311, 2984466, -8855686, 48147120, -4208531, 35892504, 28975996, -36424008, -1000191, -12262132, --38730404, 9731859, 9159018, 21166136, 36531380, -1169842, -10241350, 11902965, 13345537, 28579786, -12150462, 2569464, 23732916, 24759412, 8697846, -5761162, 21783000, 9586904, 26146688, 5515812, -7659001, 16210280, 27688580, -4635344, -21644488, -25259240, -8056285, -8807367, 43465068, 23686744, -66998804, -3149822, -33499672, 29620778, -9991168, -11569031, -9909563, -22759568, 3549254, 12744242, --296890, -12756053, 47674136, -9496710, 56225952, -15357192, 30354682, 2626373, -9249749, -30579630, --43438764, 40928892, -3741990, -6990596, -12320651, 38045356, 209917, -39908836, 73418168, 23024246, -8203925, -8383240, -30487288, 15413564, 1064078, 15518791, -14041859, 11082089, 5806259, -6869800, --10308995, 1935957, -12509092, -5940477, -14241038, 1744831, -2298881, -136902, 5051419, 12015171, --11915313, 4743255, -5690295, -295279, 16317118, 10782515, -5494874, -20033874, -389768, -1115618, -2930778, 18445810, -11654931, -6956774, 4871567, 11612518, -16460462, 1205812, 11288248, -162135, --1020592, -17368848, 9325448, -455267, 8520678, -18144626, 2344515, 7844221, 6395743, 9140227, --17220672, 14839112, -18262738, 11761768, 49823232, -29701846, -18738942, 3798362, 9163313, -5839545, -35314296, 27115202, 27821724, 9104794, 13835700, 23009214, 14544370, -8632884, -13648332, -31413928, --4858682, 16925930, 6054830, 3489124, -11434814, -29721174, -8429947, -4351339, 30272540, 205622, --3413425, 22612466, -3444564, 6106370, 5048734, -51025284, 13212930, 13524852, -8701067, -21929566, -4309463, -28862180, -14412837, -44098576, 13450227, -36851356, -72482408, 8237748, -820876, 50969452, --1585380, 17184164, 42418708, -7118909, -10780905, 18575734, -202937, -37058588, -12712029, 4650913, -6308233, 27004070, 11489574, 24026584, 21150030, -15280957, -11125039, 10128607, 31042950, -13049184, --6311992, -28541668, -19413252, 7337415, -38112468, 10910828, -42829412, 7982734, -11178189, 30330522, --13170517, 21446382, -45916960, -9570261, 6446746, -27599996, 7078643, 4678293, 4886062, -20859582, -11006391, -20427938, 5921686, -1724429, -8484171, -3874597, -1890859, 6306086, -6922414, -3397319, --5527623, 13016972, -8446590, 7541426, -19325206, 10089415, -1000727, -1717987, 2914672, 18697066, -6675990, 7908646, -22431540, 2794950, -9130564, -27991376, 11301670, -9058086, -6976638, -10421201, -10487236, -5143224, 5110474, 5720897, -2592013, 1108638, -6732361, 1850057, 5794985, -1439888, -964220, -845035, -10672994, 39035884, 41475964, 97137664, 11383811, -54258320, -40846748, -29954712, --34712464, 68021544, 90636160, 30826590, -8702141, -28438052, 960462, -34431144, 37940132, 35999880, -10612864, 5289252, -22541598, -3168612, 41758892, 9838159, 16755204, 14244259, 43823700, 36998996, --14261976, -32519344, -43154756, -28964722, -4356708, 12117713, 39400420, 23753316, -8260833, 21475374, --29958470, -10083509, -67331128, -10523744, 66218196, 51307680, -10334228, 134342816, 42083700, 4050154, --73618424, -12426951, -6335614, -17147120, 18778134, 10555956, 15909096, 28294170, -60071560, -64566780, --32520418, -43515536, -6243809, 14910516, 54322208, -32366874, 19867444, 84825064, 42330124, 14881525, -23735600, 17421998, -51163796, -84526568, 43301860, -20802138, 18643916, 45486924, 50162532, 4575214, --30338038, -39827232, -32590748, 35201552, 20269562, 6260989, 34992708, -34722664, -6054830, -5431523, --15431817, -17894444, -1533303, -360240, 11359115, 3684008, -4997195, 258235, -430570, 743566, -3006477, 6647536, 10118943, -9945534, -13794361, -47216188, -25915832, -23255638, 27986006, 16722455, -10014790, -38626252, -37971804, -61038464, -16681653, 24223078, 30775588, 40193376, 15720654, 11870753, -4691178, 4038343, -1125818, 9148817, -2125472, 28835874, 20327544, 4234838, 251256, 362388, --4901632, 95026, -3437585, -20665772, -88855360, -21197812, 49562312, 94849520, 83600464, 200366672, -104897600, 71143448, 62631896, 28474022, -11193222, -101255464, -127066608, -189608304, -145167216, -148958592, --56646860, 721555, 57047368, 106081400, 87547536, 90435904, 62362388, 85089744, 66643396, 94214400, -44893684, 35119412, 16821240, -24260660, -37267432, -57130580, -34507916, -124069256, -52380348, -117431920, --84691384, -134404016, -79864920, -125110784, -44407816, -62033824, -20174536, 9552544, 63513440, 166483664, -158586832, 222144304, 150401168, 102548784, 133221296, 181897776, 160131952, 134443216, 93853088, 11283953, --90948616, -90345176, -111925240, -213090512, -235185424, -256234528, -255807712, -280960640, -242934624, -204712096, --180480976, -117586008, 13536663, 133675488, 232635824, 307434304, 383318304, 426441920, 297354016, 283510240, -184050080, 111439368, 105385616, -6365142, -34787624, -163440688, -313117088, -337312768, -273761760, -211687120, --124660352, -100955352, -102715752, -56740812, -88209504, -35779760, -9798431, 67680096, 128664872, 105603584, -137536656, 147721104, 157682752, 139170368, 185894240, 138049920, 113196544, 58380416, 12022150, -31498216, --144003808, -127659312, -170960640, -226791984, -205370304, -235537088, -241945712, -70679056, 7909719, 122815664, -150490288, 160145376, 186028992, 194166352, 164831712, 143226960, 109942032, 83212304, 30141544, -21665426, --64131916, -115826144, -169924480, -159350272, -142110272, -106482976, -50061600, -22230750, -10474351, -6448357, -15658914, 32527934, 39698384, 42518564, 35276712, 28041304, 30631170, 24751360, 18669686, 33991980, -38386808, 29316374, 14464376, 7485591, 12199318, 15668041, 6249178, 3095061, 6237903, 836445, --11827266, -35400196, -42541116, -28210956, -21598854, -24828670, -23589572, -14520748, -20495584, -23381266, --20064476, -8260833, 1870995, 10173167, 14108431, 18976776, 21678310, 20010790, 17019882, 19320374, -19576998, 17012902, 11996381, 8338142, 2926483, -1067299, -2303176, -3824132, -7774428, -4822175, --2280628, -4078072, -5760625, -3799436, -747861, 3356517, 2638721, -446677, -3553012, -2975339, --5353677, -9904195, -12313671, -11530913, -10953240, -9507984, -10278394, -8945343, -3889093, 282394, -1404991, 7608535, 16209207, 19364396, 16056198, 14565308, 14669461, 12628278, 7373385, 3803731, -2605435, -46171, -4412005, -6541235, -7711614, -7814156, -7621420, -7081328, -5683853, -4032438, --3651259, -3367254, -2847027, -1453846, -804770, -248571, -53150, 542240, 504122, 650688, -344134, 396211, 47245, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-462246, -504122, 3228205, -1289027, 3693135, -1934883, -4823785, 1726577, 4772246, 752693, +-782221, 6429566, 181462, 307627, -2214056, -1171452, 9918690, 1428614, -6790344, -4952098, +6986301, -595390, 7246684, 555661, -1416266, -640487, 5465883, 1133335, 11511049, 5128191, +3146601, -576063, 2533494, 5267241, -1314260, -3846143, -4918812, -891206, 4378183, 3836480, +5851893, 1698660, -3316789, -3374234, -1451699, 2502892, -815507, 1398012, -696858, -5187247, +-4066260, 1648731, 3795677, 2399276, -1918777, -2112587, -170725, 5754183, 2879239, -578747, +-1300838, 2693481, 1762547, 1182727, -2933463, 1510755, 2714419, -303332, 4158065, 4980552, +-8637179, 3212636, 1739999, 5672041, 1677185, 495532, 2547453, -1091995, -4035659, -1444183, +-2438468, -759136, -516470, 2494839, -140660, -1909650, 13422, 337155, 1444720, -1222992, +222265, -197569, 507343, 796180, 508954, 1013612, 84289, 645319, -1299765, 2907156, +4461398, 9722732, -7909183, 1799054, -1756642, 134218, -10155987, 1039919, 6067178, -8987756, +-1894081, 6041945, 15949361, 2311229, -135291, 1157494, -10033044, -301721, 7349226, 6568079, +152471, -187905, 580357, 3456375, 5726802, 6083821, 6527814, -2909304, 1389959, -380641, +2500745, 726386, 1602560, -10136123, -2810519, 1600949, 802085, -5598490, -207769, 3847754, +-4494684, 3543885, 3228205, 6026913, 2787434, -2283312, 2972654, 6732898, -3790309, -6052683, +2007897, 1421097, 1156957, 3197603, -2718178, -4893042, -7340636, 5918465, -1116155, -1370632, +-2407329, 2603287, -119185, 3841312, 7543573, 1542967, 486405, -397284, -1856500, -5896990, +9156870, 2269890, -1125281, 4756140, -775242, -5436892, -4816269, -1056025, 1778117, -7933879, +625455, -4701379, -918049, 2428804, -166967, 1278827, -1450088, -2593087, -580894, 1315334, +1769527, 1335735, -305480, -795106, -76773, 1298691, -714038, -1321776, -1017907, 252866, +-529892, -4781909, -4100083, -5185636, -7303055, 4075387, -68719, -3529926, -1368484, -1817845, +1615982, -2937758, -5007395, 1116155, -3247532, 8567923, 11451993, 9008694, -6229313, -269509, +-388695, 2388002, -3447248, 7060926, 4469987, -1042066, 3456912, 5347771, 458488, 1273458, +1899449, 5194763, -476741, 1913408, 6275484, 606664, -48855, -2761664, 4521527, -6825777, +2767570, -982474, -1374390, 4497368, -4353486, -583579, 176094, -5937793, 2476049, -1222455, +2757369, -222265, -2531883, 1762547, 1900523, -343061, 5268851, -406411, 6074695, -122943, +-4003447, -1823214, 252866, -2779918, 5419175, 2784750, 4654671, 5223754, -2277407, -5236102, +-3380139, -39192, -945967, -1142461, 4303557, 5372467, -788663, -2995203, 1900523, 1441498, +-2051921, -2860448, 989453, -4093641, 1008780, -112206, -108448, -1121523, -3825205, 834297, +-1495186, 124017, 1738388, -35433, -1945620, 950262, -2675228, -83215, 190052, -652835, +243203, 481573, -1455994, -9127, 195958, -1780264, 386010, -559956, -91805, -952946, +-9664, 451508, 1542967, -15125264, -3554086, -4716411, -8164196, 2778307, 2152316, -981400, +3813394, -533113, 3220689, 4525285, -1978906, -5291400, -6649146, -2546379, -6190659, 482110, +701153, -2706903, 3538516, -3040300, 1905892, -1390496, -3522947, -9411884, -3644280, 836445, +1498407, 2471217, -3479461, 2496987, 3802657, 1251446, 8604967, 2135673, -198642, 6646999, +-4676146, 3839701, 654446, -2234994, -3158412, 4287988, 600222, 1356673, -10109816, -1866700, +-3324305, 10184441, 4389457, 3670587, 4158065, 4677757, 3725347, 5187247, -2716030, -1107565, +3204583, 5096516, -657130, 5952288, -3172907, 1306744, -1261110, 5043366, 7573638, -11778948, +3118683, -2909304, 406948, -5553393, -2828236, 936303, -1657321, -2381023, -4686346, -2119566, +2253247, -106837, 5077725, -523449, 1977833, 4381404, 6983617, -251792, 1869385, -805306, +3269007, 527744, 1608465, -2148558, -724239, 239981, 1513976, -954020, -1540820, 86436, +123480, -1210107, 221728, 716723, 66035, 2037425, -853625, -936303, 268435, 1777580, +-676457, 51540, -602906, 1064078, 1666447, -214748, 1596117, 1715303, -372052, -719407, +-263067, 5914707, 3607236, 2151779, -1136556, 496606, 625992, 7631083, -6069326, 7654169, +-1032940, 4174708, 7817378, -4897874, 6051609, -3789772, 3095598, 1192390, 9190156, 4077535, +-5151277, -8440684, 1900523, -6328635, 5183489, -1298154, 6761353, -5057861, -848256, -4051228, +2313377, 1504849, 1913408, -511101, -750009, -7375533, -3262028, 6054294, -4860293, -988379, +3908957, 178241, -3813394, 1223529, 307627, -858993, -3311957, 6613176, 2078227, -9447317, +-4292283, -7630010, -1369021, -6749541, -11649025, -2661269, 5030481, 14289356, 3090766, 1163399, +6703370, -197032, -5316633, -4633733, 3725347, 1446867, 2501819, 4107599, -10161893, -2510945, +-9350681, -2068564, 2570538, -3713536, -8647380, 846645, 3684545, -1866700, -3241090, -1542430, +1455457, -1305670, -402116, 1858647, -1222455, -1301375, -1777580, -1292248, -3984119, 1383516, +-1069984, 1787243, -710280, 1034013, 2447058, 321586, -715649, -261456, -2146410, -1423782, +-3374234, -3056943, 417686, 333397, -44560, 1156420, 1904818, 1332514, -44560, 1210107, +1004486, -942208, 718870, 761283, -1782411, -753230, 16357920, 4006668, 11818139, -5493263, +-867583, -3882651, -1009854, 12744242, -10887742, 3712462, 1132261, 16661252, 8731132, 11086384, +1915555, -2647311, 5096516, -3530463, -13835163, 2700461, 686658, 1698123, 10733660, 1115618, +-6458557, -475668, 188979, 3519726, 3652333, -241055, -1514513, 4504347, -5273146, -1343251, +-2718178, -1245541, 1239635, 280247, 9442486, 1455457, 7393250, 8716099, 2292439, 7696582, +-662499, 2600603, 4531728, -4919348, -7562901, 1014686, 7419556, -11933030, 3476776, -9139690, +-8710194, -5206037, -2486249, -8033737, -7953206, -8239895, -4362613, -1995012, 5482526, 208843, +6587943, 1085553, -5607617, 8505646, -8868034, -3254512, -3729642, -3530463, -4748087, -6051072, +8652748, 6879464, -3926137, 3413962, 2654827, 6987375, -73014, 5065914, -2556043, 6349573, +3073586, -3639448, 115427, -3282429, 3901441, -3754875, 325881, 3157875, 137439, 2431488, +-771484, 446140, 1547799, -486942, -1777043, 1624571, -547071, 335007, -3326989, -2616709, +-2673617, -1953673, -433792, -1064078, -2326799, -40265, 375273, -988379, 171262, -14496, +-1392106, 348429, -8904004, -8906688, -5283347, -5457293, -2950643, -2230699, -10675678, -8531953, +-7262253, -1078037, -650151, -1309428, 7362648, 775242, 3788161, 5702106, 6606197, 1075889, +12940200, 16269336, -365072, 4734665, 3634616, -1939715, 7072201, 3882651, -14623827, -455267, +-5079873, 877247, 11254425, 4523138, -11700565, -3068217, 5160940, 5184026, 681289, 14971719, +-6222334, 6055904, 6063420, 6686727, 3860639, 7783555, -13182328, 4848481, -5165772, 7842611, +256624, 3396246, -9906342, 7278896, 5215164, -1243393, 5048197, -821949, 1382980, -66035, +-5185100, 1369558, -3328600, 3253438, -4098473, 5084168, 1552631, 12687333, 9426916, -2954401, +3343632, -10409390, 9050570, -2827162, 5535676, 9843528, 9607305, 477278, 9813463, 6828461, +4620848, 5020817, 9013526, 918049, 1916092, -7373385, -1321776, -2103997, 1658394, -5314485, +759136, -3868692, 1170916, -3854196, 1145146, -1407676, -2462090, -2269353, 1558536, 180389, +-1262184, -901406, -3183645, -1005022, 513249, -903554, -2308545, 347892, 2306398, -5385352, +-3381750, -2967823, 2133525, -3299072, 1990181, 32749, 1123671, -2731599, -4085051, -900869, +747324, 8596377, -7664906, -1971927, 6791954, -3610457, 11656541, -3705483, -8295193, 15561740, +21082920, 4718559, -8373039, 5857262, -4433480, 8698919, 5009543, -1868311, -8879308, -5760625, +-15072651, 3959423, 6370510, -13240310, -1619203, 7732015, 1970853, -621160, 274341, -1603633, +-7223062, 1767916, 8865349, 386010, 1883880, 3245385, 12574054, -8289824, -268972, 9188546, +-8421357, 12334072, 606127, 17325362, -14431090, -12952548, 7107097, 664646, -1758789, 3743601, +-1220845, 4842039, 2928631, 9647570, 9139690, -7551090, 1358820, -4925254, -3015604, 5785858, +-742493, -2935610, -1307281, 302258, 8583492, -16413754, 12506408, -3896072, -5622112, 9328132, +-7529078, 7485591, -10121627, -5640366, -1896228, -7467338, -2615635, -5262409, -8419747, -5622112, +1813013, -1878511, -2039573, -86436, -3932580, -1213328, -602369, 5243618, -288837, 793495, +2076080, -2155537, -877247, -1818382, 1243393, 2587181, 676994, -1007707, 6098317, 76773, +4519380, -4887136, -3205656, -2883534, -2127083, 2379949, 1115081, 213675, 3538516, -2602213, +2696703, 1124208, 2506650, 1481764, 335544, -3075197, -10413685, -8028905, -3461207, -7532836, +-11357504, -2441689, 4192962, 13958107, 2319282, -8495982, -15612743, -3311957, 4900558, -2782602, +16855600, 5245766, -5903970, -11934104, -14817637, -28192702, -2255932, -3149822, 10827076, 7934952, +-5723044, 688805, -4418448, -2479270, 10164040, -310311, 581431, -1276679, 11525545, 1901597, +-3402151, -613643, -381178, 3063922, -10405095, -3335042, -4065724, 16488916, 3899294, -17431124, +4529043, -9067213, -5034776, 2517388, -16137803, 4992363, 11710228, 10302553, 8113193, 1926830, +3303904, -566399, 1763621, -10247792, 3752728, -16019691, -3020973, 9108015, 3390340, 9331890, +9292162, 7602629, -5186710, -11834782, -10268730, -8018704, 2637110, 3150896, 5504538, 5385889, +1222992, 3586298, 11579769, 16111496, -3830037, 5717675, -3975529, -4382478, 4982162, -7125888, +-2464774, 255014, -4452808, 4167729, -3863860, -3435437, -1833951, 975494, -986769, 2254858, +78383, 3279208, -746251, -2043868, -892279, -2001455, -5068062, 1333051, 2778844, -279173, +1838783, -525597, 2502355, 4671851, 4544613, 3477850, -3577171, -1862942, 3503620, -1087164, +-1352915, 296353, -548145, 3456912, -753230, -229781, -503048, 8207146, 14605573, 16855062, +12236362, 20843476, -9737228, 14806900, -12678743, -9988483, 11016054, 14021994, 16616155, -17139604, +-69793, 4293357, -12651363, 5987185, -5545340, -9002788, 10274099, -13346074, 14492830, -13717589, +13579076, -9849434, -3593277, -914828, -17889076, -2501282, 19790136, -5065377, -14089640, 3010235, +9206262, -10307385, 5134097, 21356188, 11521250, 4318053, 9484898, -11308112, 7580081, -6794639, +-19430968, -5909338, -5058398, 1440425, 8858370, 10901701, -4798016, -8536248, 7802882, 53150, +5979668, 3713536, -3139621, 1064078, -7710540, 1178432, 2493766, -103079, 2572149, 17577690, +-2146410, 1739999, 5058935, 1050120, 2194192, -8938364, -9750113, 6799470, -11612518, -15819975, +-16563005, 12911209, 8393977, 2489471, -860604, -1917166, 6203007, -973347, -4616553, 5919002, +16297253, 10992432, -4255776, -2759517, 5078799, 2914672, -1095754, -2572149, 1884417, 2296734, +-635118, 670552, 8873939, 2117419, 1312113, 3463891, -2820183, 650151, 2861522, 5890011, +-512712, 428960, -5696737, 1872069, -2937758, -2178622, 6067715, 4833986, 372588, 3791383, +-3202435, -1564979, 1867237, 45634, -1668058, -3302830, -3515431, 2303176, 1096290, -1542967, +2126009, -13518410, -21475374, 7644505, 27878096, 13653164, -5236639, -21563420, -7502771, 1376000, +2998424, -4190814, 10574209, 7141994, -7849053, -4055523, -1066763, -14272176, 19808390, -9035001, +7044283, -1660542, -4693326, -17391396, 5676336, 3604015, -2188823, 2093797, 7765301, -2849174, +19364934, -4351339, -2981244, 16159814, -1829119, -11621108, -10405095, -20068234, 2733210, -4467303, +-6254546, -4388920, -14737107, -6179921, -13802951, 1451699, -12152073, 10939282, -6878927, -247497, +3383897, 1337882, 6305549, -5848672, -14913200, 6455873, -1739462, 3678640, -3353833, -1529545, +417149, 14313515, 21435644, 5802501, -6760279, 7388418, 7767449, 8496519, -3528316, -7203197, +10921028, 5152350, 14602352, 3373160, 3885335, 386547, 4377109, 13138842, 17960480, 8818642, +3017752, 6726993, 2825552, -3786551, -12334072, -7840463, 1384053, 5939403, 924492, -339302, +-4629438, -1739999, 2511482, 1686312, -9751723, -1876364, 2182917, -437550, -4863514, -4083440, +-5434744, 998580, -970126, 3666828, 6884296, 4028679, 213675, -2326262, 4207994, 5046587, +328028, 1664837, -6808060, -282931, -2312303, -7001334, 1458678, 1234803, -6232535, -676994, +-1464584, 2310693, -2423972, 5819144, 27917, -1424319, 7854959, 41753524, 924492, -11023034, +34548716, 17670032, 15231565, 30259656, 29904246, 8709120, 9466645, 7661148, 32508070, 1792612, +-11556683, 14183593, 2944737, -12614856, -14381161, 12640089, 12089259, 23517094, -2351495, 1800665, +258235, 3306051, -13966697, 15752329, 10835129, 4902169, -10861972, 16664473, -5080410, -787590, +-22064858, -4716948, -1723356, -1312113, -11666742, 7685307, -10856604, -6095096, -6386080, 3220689, +-7541963, -10056129, -14111652, 14921790, -10757282, 15863999, 6914361, 13041668, 3935801, -13117367, +-737661, -21135534, -9901510, -11489574, 4352950, -14659260, -8122857, -2610803, 3221, 15342160, +1472100, -2330557, -24581172, 9752260, 8143795, -519691, -378494, -12320114, 9326521, 1086627, +-10792179, 29006062, 6332393, -3721052, -534723, -11620034, 1745367, 14553497, -4031901, -1157494, +-16294032, -9491878, 5640366, -2215666, -7852811, 9431748, 5537287, -9549860, 8320963, -3286187, +2488397, -3177739, 8134668, 1832340, -1537061, 261456, 1797981, -11518565, -103616, -4239670, +3190624, 3983045, 5410048, -4717485, 3879966, 3123515, 2232846, 4262218, 4749697, -341987, +3599720, -5538361, 9506910, -4400194, 8000987, -5699422, 3394098, -12678743, -23252416, 7141457, +7002408, -7194070, 15134391, -16734803, 18177912, -13114146, -7638600, 5851356, 4205847, 46917148, +18330920, 7028177, -29279328, -779000, -6950868, -15518254, -4510790, -5672041, -5138929, -1737314, +-24349780, -468688, -9214852, 301721, 11850352, -12915504, 15378130, -5042292, -17027398, -15187541, +12182138, 9347996, -3811247, -8385387, 15538118, -8386461, -7925289, 12217034, -354335, 3759707, +-12592307, -424128, -7406134, 15669651, -2368675, 22478248, -8414378, 3378529, 6766184, -642098, +852014, 6857989, -14500883, -2323577, 18462454, 1498944, 5061619, -171262, -14987825, 6403260, +-10465762, 5325223, 16137803, 20950314, 22836342, 24054502, -5201206, 8442832, -205085, 12908524, +29139742, -32017370, 24879672, -14802068, 6677064, 20012400, -12641162, 1289027, 6269579, 5457830, +-1509144, 13929116, -5412733, -4404489, 5874979, -3340411, 13402982, -1990181, 5070209, -10815801, +-1774895, -323196, -8730058, -3665218, -11008538, 114890, 3160022, 1068373, 12184822, -4028679, +804770, 1316408, 5168457, 1275605, 5213017, -7233799, 5423470, 1671816, -326954, 3877819, +5316096, -6082748, 5522254, -11696270, -10357314, 7212861, -3487514, -8297877, -1215476, 3395172, +-5355288, 9415642, -11256036, -24722368, -4832375, 5019743, 322123, 5819144, -18398030, -2472828, +-3786014, -26129508, -20268488, 10424959, 10835129, 5050345, 7463043, -13359496, -6593312, -9458592, +28570122, 6903623, 763430, 21461952, 12298639, 10814728, 9666361, 8469676, -15126875, 10907606, +4371740, -4587025, 8497593, -7557532, -7555921, 14997489, -6529424, 9476308, 19683298, 757525, +3738232, -278099, 1238024, -4218195, -11613592, -14539001, -23801098, 9817758, -20168092, 7640747, +7787313, 10214506, 23085, 706522, -2864206, -15391015, -7396471, 7963406, -5416491, 8216810, +19689204, -5964636, 15050639, 7023882, 1629403, -752156, -5432060, -14230300, -652298, -19266150, +-6779606, 20881058, -11143293, 3414499, -34302832, 16380468, -6392522, 5362804, -26480084, -23386096, +2174864, 6436546, 12046310, -27154394, -2936684, 478352, 18549964, 15372225, 17164836, -5348845, +317828, 2756832, 8953933, 2289755, 4903242, 14374719, 8031052, -5272609, 5114769, 1541893, +970663, -151934, -3069828, -11585137, 4079145, -5524939, 1709397, 4821101, -197032, 1216013, +-206158, 4839355, -2946348, 19360102, 5162014, -576063, 10650982, 6664716, 841277, 3398393, +-377420, -8373039, 11195369, -3492345, 1460289, 13643500, 7417409, -3997541, -2684, -5157182, +8799851, 6343130, 7504919, 6675453, 20433844, -48400524, -11907797, -28752122, 9699647, -25822954, +-8657580, -29264834, 7824894, -15265924, -11705933, -2510409, -24850680, -9047885, -26626112, -13458280, +-30828738, 6635188, -28522878, -11290932, -14820858, -8318278, -7836168, -6676527, -27227946, -15583215, +-20715164, -10644540, -5985037, 11740830, -1705102, 8759586, -16946868, -2775086, 975494, -19541028, +3773666, -1385664, 1654099, 5096516, -19764366, -1134408, 7289097, -2462090, 8216810, 16393353, +29733522, -24717536, 1518808, 33031520, 160524, 16204912, -11584064, 20462298, 3743601, -4909148, +-27478664, -16199543, 22818624, 14068165, 22282290, 797253, -15542950, 5659693, 8051990, 15916612, +-29880624, 196495, 5661304, -16512539, -5496485, -7148436, -10002979, -23964844, 37035504, -6822019, +-11898133, -7617662, 7679402, 8875550, -20929912, -19472844, -771484, 6180995, 971736, 48318, +-4081830, -7085623, -89657, 18644990, 11563126, -136365, -15367393, -10649908, 1727114, -5942624, +4072166, 4912906, 2512556, -1633161, -7926899, 3229279, 3930432, -2205466, 5950141, -3473018, +-13646185, -6495065, -779000, 3951907, -1013612, -4401805, -19968376, -7995619, -4572530, 1497870, +2506114, -8642548, -15467788, 6047314, 9290551, -8218420, 372052, -7226820, 7824357, -2532420, +-13719199, 20590074, -34749508, -365609, -6883759, 15025943, -7646116, -21415780, 18715856, -37593848, +-32413582, -26754426, 15353434, -7954280, 871878, -14585172, -13802414, -16129750, 9084393, 7867307, +26230976, 12353400, 5324149, 24424942, -6468758, 8869644, -8777839, 7652558, 4440996, 14565308, +23536958, 12304544, -4861366, -14352170, -8548059, -2908767, 13234942, -4325569, 3716221, 530965, +-6033892, 12520903, -756451, 10286984, 7646116, -19981262, 16547972, 30373472, 4763656, 25415468, +24601572, 11182484, 8172249, 102005, 13019120, -8036958, -29461328, -9558450, 21953188, 264141, +-10806138, 11337103, 31161062, -7051800, 2426657, -22462678, 22228066, 19946902, -1400159, 6461242, +-10116259, 51125144, -31996432, -27755690, -26209502, 2295660, 981937, -7656316, 22814866, -31894428, +-496069, -20355998, 7864085, 9140764, -1386201, 22272626, 5167920, -1787243, -11958263, -52076, +5657546, 16263967, -11023034, -14159433, 6007049, -8392366, -2177549, 2087891, 3938485, 1436130, +154082, -949725, -13351443, 1398012, 3282966, 9342091, -7873749, -4373351, 5264556, 2581275, +3683471, 455803, -8699456, -858457, -9883793, -7444789, 10085120, 5217312, 5710696, 4057134, +-269509, 2084133, -2641405, 6208375, 906238, -2583423, -514859, -8602283, -3212099, -5665599, +3605625, 56146496, -12625056, 31411244, 53327388, -17985712, 25399362, 11656004, -34111704, 31150860, +4365298, -14500346, 22434762, 9965935, 21057688, 82678, -18367964, 17329120, 5544266, 350040, +5047661, -4907000, -19415936, -11125039, -9469329, -16264504, -12593381, -2874944, 12362526, -11120744, +-7166153, -16020228, 3109020, 1644436, 2267206, 22584012, -13710072, 5632313, -12745315, -6760816, +12476880, -9992241, -23264764, -29204168, 33566244, 15311558, -8761733, 23624468, -21853868, -18596134, +-11800960, -1647120, 3084860, 398358, -20370494, -14485851, -16006806, -34186864, -21858162, -18311594, +6294812, 11781095, -1302449, 20218022, 3444564, -20365124, -18120468, 27194660, -23479512, 3471944, +23272818, -2894271, -41038412, 28625420, -15358266, 4714801, 1478006, 23708756, -6008123, -8886287, +-1547799, -13346611, 6708739, -23123568, 7558606, -29774860, -19503446, 11691975, -13033078, -3546032, +-1990181, -17641578, 5471789, -10264435, 8157217, -2611877, -670552, 1002338, 10723996, -7900056, +-6704981, 2035815, -11565810, -4872641, 1366337, -7247758, -8202851, -5325760, -3684545, -8471823, +-5118528, 12148315, -10158671, 4735739, 6947647, -1694365, 7453379, -10319196, 812286, -7234336, +14847165, 2913062, 5126581, -10562398, 12998719, 9233106, 9871445, 4376572, 971736, 3330747, +7089381, -7229504, 462783, -6010270, -27130772, 16314970, -7689065, 27520540, 18867254, -43670692, +-5509370, 4770098, -26657788, -4217121, -4362076, 32467268, 23342074, 21734682, 26920318, -872952, +-18862960, -14475114, -15014132, 844498, -41787348, 5149129, 35786204, -32488744, -58886148, 6129992, +-22035330, 43576200, -289910, 1557999, 29127394, -13215614, 5984500, -1218160, -7913477, 25426744, +-7298760, 12927315, 42526620, -31168040, -17861158, -28397250, 14199699, 2493229, 28470802, -16203301, +11216844, 1640678, 25930866, 15396384, -12681965, -8321499, 9810242, -4573604, -1155883, -18204218, +-18068928, 9596031, -4034048, -5216775, -10275172, 23589572, -8908299, -9327595, 39385388, 42210940, +27274652, -35679904, -3176128, -11144903, 13903346, 52536040, -6633040, -39860516, -2617246, -16363289, +23542326, 10631118, -26780194, 14205067, 10404021, 13858786, -25838524, -9215389, 1923072, 22985592, +1417339, -3588445, 3760781, -7751879, 1811403, 22969486, 11118597, -9435506, -11438572, -2512019, +7219303, 9240085, 12096239, -11334419, -4328254, -20850456, -4380867, 13345537, -13136694, -1977833, +-8109435, -7439420, -12338367, -2498597, 8424041, -1793686, -881005, 2195802, 5374615, -5466957, +-15742666, -16254841, 9879499, 7677791, 13798656, -6793565, 10131291, 29702920, 1570347, -17627620, +-2833605, 1699733, -1573032, -10991895, -4508642, 3362960, 8637716, -1745904, -25593710, 3745212, +-20978768, 19320910, 11311333, -20750598, 35316980, 53223772, 1644973, -2583960, -18114562, -18559090, +3244311, 2984466, -8855686, 48147120, -4208531, 35892504, 28975996, -36424008, -1000191, -12262132, +-38730404, 9731859, 9159018, 21166136, 36531380, -1169842, -10241350, 11902965, 13345537, 28579786, +12150462, 2569464, 23732916, 24759412, 8697846, -5761162, 21783000, 9586904, 26146688, 5515812, +7659001, 16210280, 27688580, -4635344, -21644488, -25259240, -8056285, -8807367, 43465068, 23686744, +66998804, -3149822, -33499672, 29620778, -9991168, -11569031, -9909563, -22759568, 3549254, 12744242, +-296890, -12756053, 47674136, -9496710, 56225952, -15357192, 30354682, 2626373, -9249749, -30579630, +-43438764, 40928892, -3741990, -6990596, -12320651, 38045356, 209917, -39908836, 73418168, 23024246, +8203925, -8383240, -30487288, 15413564, 1064078, 15518791, -14041859, 11082089, 5806259, -6869800, +-10308995, 1935957, -12509092, -5940477, -14241038, 1744831, -2298881, -136902, 5051419, 12015171, +-11915313, 4743255, -5690295, -295279, 16317118, 10782515, -5494874, -20033874, -389768, -1115618, +2930778, 18445810, -11654931, -6956774, 4871567, 11612518, -16460462, 1205812, 11288248, -162135, +-1020592, -17368848, 9325448, -455267, 8520678, -18144626, 2344515, 7844221, 6395743, 9140227, +-17220672, 14839112, -18262738, 11761768, 49823232, -29701846, -18738942, 3798362, 9163313, -5839545, +35314296, 27115202, 27821724, 9104794, 13835700, 23009214, 14544370, -8632884, -13648332, -31413928, +-4858682, 16925930, 6054830, 3489124, -11434814, -29721174, -8429947, -4351339, 30272540, 205622, +-3413425, 22612466, -3444564, 6106370, 5048734, -51025284, 13212930, 13524852, -8701067, -21929566, +4309463, -28862180, -14412837, -44098576, 13450227, -36851356, -72482408, 8237748, -820876, 50969452, +-1585380, 17184164, 42418708, -7118909, -10780905, 18575734, -202937, -37058588, -12712029, 4650913, +6308233, 27004070, 11489574, 24026584, 21150030, -15280957, -11125039, 10128607, 31042950, -13049184, +-6311992, -28541668, -19413252, 7337415, -38112468, 10910828, -42829412, 7982734, -11178189, 30330522, +-13170517, 21446382, -45916960, -9570261, 6446746, -27599996, 7078643, 4678293, 4886062, -20859582, +11006391, -20427938, 5921686, -1724429, -8484171, -3874597, -1890859, 6306086, -6922414, -3397319, +-5527623, 13016972, -8446590, 7541426, -19325206, 10089415, -1000727, -1717987, 2914672, 18697066, +6675990, 7908646, -22431540, 2794950, -9130564, -27991376, 11301670, -9058086, -6976638, -10421201, +10487236, -5143224, 5110474, 5720897, -2592013, 1108638, -6732361, 1850057, 5794985, -1439888, +964220, -845035, -10672994, 39035884, 41475964, 97137664, 11383811, -54258320, -40846748, -29954712, +-34712464, 68021544, 90636160, 30826590, -8702141, -28438052, 960462, -34431144, 37940132, 35999880, +10612864, 5289252, -22541598, -3168612, 41758892, 9838159, 16755204, 14244259, 43823700, 36998996, +-14261976, -32519344, -43154756, -28964722, -4356708, 12117713, 39400420, 23753316, -8260833, 21475374, +-29958470, -10083509, -67331128, -10523744, 66218196, 51307680, -10334228, 134342816, 42083700, 4050154, +-73618424, -12426951, -6335614, -17147120, 18778134, 10555956, 15909096, 28294170, -60071560, -64566780, +-32520418, -43515536, -6243809, 14910516, 54322208, -32366874, 19867444, 84825064, 42330124, 14881525, +23735600, 17421998, -51163796, -84526568, 43301860, -20802138, 18643916, 45486924, 50162532, 4575214, +-30338038, -39827232, -32590748, 35201552, 20269562, 6260989, 34992708, -34722664, -6054830, -5431523, +-15431817, -17894444, -1533303, -360240, 11359115, 3684008, -4997195, 258235, -430570, 743566, +3006477, 6647536, 10118943, -9945534, -13794361, -47216188, -25915832, -23255638, 27986006, 16722455, +10014790, -38626252, -37971804, -61038464, -16681653, 24223078, 30775588, 40193376, 15720654, 11870753, +4691178, 4038343, -1125818, 9148817, -2125472, 28835874, 20327544, 4234838, 251256, 362388, +-4901632, 95026, -3437585, -20665772, -88855360, -21197812, 49562312, 94849520, 83600464, 200366672, +104897600, 71143448, 62631896, 28474022, -11193222, -101255464, -127066608, -189608304, -145167216, -148958592, +-56646860, 721555, 57047368, 106081400, 87547536, 90435904, 62362388, 85089744, 66643396, 94214400, +44893684, 35119412, 16821240, -24260660, -37267432, -57130580, -34507916, -124069256, -52380348, -117431920, +-84691384, -134404016, -79864920, -125110784, -44407816, -62033824, -20174536, 9552544, 63513440, 166483664, +158586832, 222144304, 150401168, 102548784, 133221296, 181897776, 160131952, 134443216, 93853088, 11283953, +-90948616, -90345176, -111925240, -213090512, -235185424, -256234528, -255807712, -280960640, -242934624, -204712096, +-180480976, -117586008, 13536663, 133675488, 232635824, 307434304, 383318304, 426441920, 297354016, 283510240, +184050080, 111439368, 105385616, -6365142, -34787624, -163440688, -313117088, -337312768, -273761760, -211687120, +-124660352, -100955352, -102715752, -56740812, -88209504, -35779760, -9798431, 67680096, 128664872, 105603584, +137536656, 147721104, 157682752, 139170368, 185894240, 138049920, 113196544, 58380416, 12022150, -31498216, +-144003808, -127659312, -170960640, -226791984, -205370304, -235537088, -241945712, -70679056, 7909719, 122815664, +150490288, 160145376, 186028992, 194166352, 164831712, 143226960, 109942032, 83212304, 30141544, -21665426, +-64131916, -115826144, -169924480, -159350272, -142110272, -106482976, -50061600, -22230750, -10474351, -6448357, +15658914, 32527934, 39698384, 42518564, 35276712, 28041304, 30631170, 24751360, 18669686, 33991980, +38386808, 29316374, 14464376, 7485591, 12199318, 15668041, 6249178, 3095061, 6237903, 836445, +-11827266, -35400196, -42541116, -28210956, -21598854, -24828670, -23589572, -14520748, -20495584, -23381266, +-20064476, -8260833, 1870995, 10173167, 14108431, 18976776, 21678310, 20010790, 17019882, 19320374, +19576998, 17012902, 11996381, 8338142, 2926483, -1067299, -2303176, -3824132, -7774428, -4822175, +-2280628, -4078072, -5760625, -3799436, -747861, 3356517, 2638721, -446677, -3553012, -2975339, +-5353677, -9904195, -12313671, -11530913, -10953240, -9507984, -10278394, -8945343, -3889093, 282394, +1404991, 7608535, 16209207, 19364396, 16056198, 14565308, 14669461, 12628278, 7373385, 3803731, +2605435, -46171, -4412005, -6541235, -7711614, -7814156, -7621420, -7081328, -5683853, -4032438, +-3651259, -3367254, -2847027, -1453846, -804770, -248571, -53150, 542240, 504122, 650688, +344134, 396211, 47245, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 12934294, -573915, 2186138, 1808181, -5255966, -2726231, 7173133, 12464532, 2024003, 6643241, -2678986, -1261647, -326954, 5629092, -4437238, -10154376, 4129074, 4765803, -5904507, 6880001, 3404299, -6278169, 2005213, 1502702, -2713883, -863288, 351650, 4191888, 402653, -6275484, 303332, --493384, 1388348, -859530, 1149441, 1527398, 3778498, 2739652, 925565, 1192927, 403190, -1860258, -1905355, -3115999, -6935836, 1369021, 1565516, 587874, 5372467, -1866163, 4183298, -1171989, -1620813, -3264712, -2094870, 7504919, 1637456, 4201552, 732292, 1675037, -1398549, -286152, 538482, 2180770, -607738, -2754148, -1468879, -5766531, 683974, 1167157, 5000416, --1558536, 3832185, -624918, 2523293, 80531, 2277407, 1773285, 1084479, -890669, 2613488, -3586835, 2520072, 2357400, -37581, 542240, 622770, -1917166, 867047, 484258, 1768453, -932545, 754841, 962073, 1278290, -650151, 790811, -484794, -24159, -203474, 4871567, -4546760, 2192044, 1811939, 2607045, 2979097, 4603668, -2053531, 4774930, -27917, 5095979, --1180042, 9010841, 2954938, 3030100, -6167573, -775242, -1460826, -7841537, 4248260, 3725347, --2581275, -10297184, -4804458, -1481764, 4975720, 7031399, 4306242, -2704756, 1404991, -4372814, -132070, 461172, -3701188, -1727651, -9464497, 849330, -1257352, -3854733, 328565, 615791, --1352378, -223338, 8902393, -2085207, 7236483, 1498407, -5735929, 493921, 468688, 4188667, --1928440, 1241782, 893890, 389768, 5521181, 2018635, 5670431, 4304094, -3033321, 5318244, -2471754, 3903052, 278636, 1324461, -1425392, -2421825, -4818417, -5759015, 5992553, -5986648, --4757750, -4939750, 2726231, 2610266, 1034013, 1172526, 3477313, -2223183, 2596845, -1661079, --2509335, 3958349, -3661460, 673773, 1736777, -2943663, 646929, 507343, -552440, -402653, --348429, 2109366, -752156, 829466, -987843, 1635846, -520765, 945430, -1167694, -1118302, --1125818, -8057359, -7562364, 1656784, 112206, -1597191, 4471598, -560493, -824097, 4712653, --5193153, 1040456, -4539244, -2883534, -1665374, 78920, 7605850, 8715562, -4078608, 3431142, --6301791, -571768, -2495376, 8465917, -2542084, -452582, 836445, -11860015, -2115808, -5845451, --1983738, -1433982, 4377109, 5903970, 2358474, 7971460, -1069984, -3598646, -3725884, 4611721, -11876121, 8360154, -4706748, -5421323, 5913096, -5334887, 964220, 1922535, 9718974, -3579855, --4872641, 1082332, -3044058, 1886028, 2434173, 6229850, -6861747, -4398584, 3933116, 7521025, --747861, -3470871, -4480725, -10601053, 3971234, -6979, 3106872, 507343, 219043, -1658931, -1890859, -2700998, 1624035, 2301566, 2254858, -3760244, 2709051, -683974, -2704219, 259846, --5633924, 3498788, 466004, 446677, -2276333, -757525, -1936493, -3884261, -3013993, 2068564, -130460, 837519, -788663, 272730, -284005, -1112933, -942208, -1626182, 104153, -934692, --762357, -231928, 299037, -292058, 465467, -305480, 1885491, 748935, -1203128, 1320703, -732292, -1536525, 1013612, -19744502, -6420439, -1104880, 3418794, 2192044, 4958003, -9465034, --2754685, -492848, -9687836, -7031399, 2507724, 5828808, 3519189, 6439230, -773094, 3669513, -8722005, 7577933, 7242926, 4074313, -2712272, -2272038, -4394826, -2040110, -4415764, 9179419, -4356708, -1488206, -4043175, -2567317, -4129611, -6162741, -6520297, -8328479, 5034776, 3500398, --9115531, 2094333, -431644, 6262063, 1012539, 3048890, 4145717, -8731669, -1309428, -385473, -1185411, 4481262, 6940667, -2831457, -965294, -2093260, -5421860, 1612223, 1122597, -639413, --1457068, 5172215, 316754, -2956011, -949188, 2420214, 3377455, -1412507, -120796, 815507, --4714264, 3460670, -337692, -7187091, 848793, -8759049, 1410897, 6410239, -2130841, -318364, --9743670, -4827007, -7232725, -4463008, -575526, -806917, 4537096, 824097, 5322002, -3230889, -1810329, 2821794, 984084, 2776696, 352187, -1951526, 1120450, -898185, 932545, 37581, -399969, -402116, -1320703, -538482, 1214402, -1334124, 908922, 2199560, 1163399, 540092, -74625, 37044, -457951, -906238, -1433982, 1043140, 1444720, -882079, 952946, -928787, --671089, 10902238, 3976603, 1923609, -2797098, 8056285, 2988224, 4594542, 12513924, 13753022, -424128, -2123861, -4941360, -7330436, 2627446, 5490042, -2892661, -462246, 671089, -1209033, --4461934, 5211406, -5111011, 2452963, -14558865, -1998234, -3622268, -3423626, -7247221, -1402844, --1029182, 197032, -3767223, -5143760, -4227322, 657667, -2837363, -5464272, 3209951, 4850629, -280784, -4469451, -5218922, 1958505, -4045322, 4576288, -5735392, 3704946, 1198296, 9664, --8127152, -7340636, 1604170, -5298379, 8607114, 1635309, 7202660, -3718368, 7248831, 1510755, -4622459, 1687922, 4371740, -4066797, -6046777, -48855, 9349607, -855235, -6513318, -3315178, -3999688, -2581275, -3781719, 1029182, -10313290, 6942278, 8143258, -449361, -7202660, -8847633, --415538, 7562364, 5272073, -4182761, 5607617, 661962, -986769, -1059783, -746251, -421444, -1430761, -2455111, -2331630, 251792, 701153, -1832340, 529355, -829466, -427886, 2046015, --964757, -378494, 154619, -3089155, 1494649, 467615, 115964, 777389, 821413, -86436, -91268, -568009, -787590, -425202, -542777, -820339, 15410343, 3307125, 8416525, -3224447, -6278706, 4887673, 9838159, -7234873, -5367099, -1551557, 470836, 7208566, -3428458, 10874320, --902480, 6240051, 5167383, -2865817, 2065879, 6321118, 5616744, 1602560, 1479079, 5771363, --11744588, 2042257, 8905078, 7176891, -6395207, 7997229, -9383967, 5777268, -8289287, -3994320, --2255395, 8665097, -1849520, 9066676, 1874216, 2060511, 330176, -165356, 3421478, 5377836, -11520176, 1964411, 9926206, -4804458, 7224672, 9800042, -419833, -1598265, -3602404, 3872987, --13925358, -1010928, 1245004, -5035313, -8310762, -324270, -637266, -970663, 3500935, -8300025, -4151623, 3858491, 5246840, -13165685, 4464619, 3337190, -7980049, -785442, 4220342, 9930501, --12520367, -1397475, 837519, -11584601, -1146219, 1863479, -3367791, 7847442, -1835562, 811749, -2056753, -1207423, -496069, -383863, 1267015, -2892124, 347892, -1431298, 827855, 420907, --1831267, -44560, 2029909, -800475, -528818, 199179, -2579665, -795106, 384936, -804233, --1228361, -207232, 377957, -1225139, -675384, 1882806, 2240899, -2854006, -171799, 642635, --68183, -341987, -13764296, -16957068, -13506062, -12271795, -380105, 8580271, -17816062, 12673912, -8256001, -20086488, 12663174, 5322002, 4354560, 1956358, 1975685, 4508105, -3117610, -3301219, --6556805, -223875, 7726646, 6476811, 3823595, -11445551, 7837242, -8187819, 256624, -7202660, -8990977, -4771172, -3670587, 2804077, -13394929, 1317481, -4414690, -4038343, -1398012, 938450, -13242995, -6251862, -1988033, -5049808, 10080288, -6131603, -3258270, 3073586, 3055869, 2811056, -3590056, -4190814, 4880694, 1213865, -10980621, 15122580, 6060199, 2425046, 1614908, -98784, --7021198, 8645769, 7298223, 3012920, 9753334, 1013075, 4312684, 9746355, 5009543, 2079301, --6699075, 8026757, -3500398, 15354508, -1644436, 386547, -4165582, -16153909, 2137283, -3934190, --1890859, 8256001, -676994, -8773008, -4959077, 7093139, 5978595, 906775, 6922951, 1796370, --5046587, 2384244, -466004, -1718524, -1388885, 539018, 4103841, -1952600, 522912, 703301, -2315524, 850404, -1839857, 2964064, 451508, 774705, -161598, 751619, 384400, -1188632, -1723356, -1200980, 1421097, 1081258, -857920, 3343095, -445066, 809601, -1132261, -781684, -9854802, 6717329, -1141924, -6180458, 16196859, 25755308, -3401077, -3573413, 12453795, 3032784, -4108673, 3307662, -18547280, 2047089, -11992622, 9599789, 13684303, -3585761, -6606734, 2241973, -8668855, -5195300, 10471130, -4101694, 20207284, -5900748, 3912715, -983011, 5486821, 14401562, --5430450, 1426466, -1266479, 4172561, -5333276, -2567317, 8198019, 17667348, 1480690, 12937515, --4780836, 1793686, -2425583, 4321811, 9454834, 14103062, 10991358, 10449119, 10857140, 6877317, --1975685, 1688996, -1487669, 288300, 2161979, -7033009, -2024003, 11369852, -9966472, 3992172, --4378719, -2609730, -5177046, -20533164, 2305861, 11165841, 7061463, -2513093, -9739375, -23666880, --3808026, 9665287, -1984275, 3830037, -7374996, 5537824, -6800007, 6284611, 13443248, -5867999, --7252589, -13373991, 4056060, 1686848, 2213519, -10565620, 778463, 98247, -3195456, 645319, -5014911, 256624, 3452617, 1562294, 2241973, 2760590, -454193, 4321274, 1039382, 475668, --872415, -1349157, -1163399, 4123706, 1393717, -97711, 2757906, 1483911, 1996086, -335007, -2286533, 2809446, 3762391, -1517734, 419833, -1475858, -17674328, -14102525, 1854889, 8262980, --7931731, -5248450, 1060857, -4314832, -26476326, -22897544, 9995463, 9153649, 1722819, 1321239, --9674414, 15176804, 18510772, 11363947, -9496173, 8866960, 12164958, -1919850, -15354508, -6972880, -21303574, -6349036, 2168422, 1263794, 11984569, -9617506, -17047262, 3677029, 7885560, -4232691, -5058935, 11036992, -5335960, -4283693, -468151, -23893440, -6875706, 8176544, -4498978, -15977278, -2921115, -456340, -4983236, 3135863, -1473174, -15151034, -12782360, -22661858, -17952964, 3474629, -7960185, 705448, -5353140, -7587060, 216896, -5199058, 4857608, -10906533, 399969, -3885872, --3109020, -3717831, -953483, 4212289, -4913443, -21743808, 3287798, -3160559, 5389647, 5916318, -436476, 4100083, 5058398, 1563905, -1214402, 2610803, -3059627, 1185948, -6742562, -3617973, --3011309, -3753802, 1565516, 5948530, -3106335, 912144, -7669738, 856309, -747324, -5730023, -2511482, -1844152, 1461900, 2306398, 1360968, 1013075, 4869419, 1030255, 650688, 1588601, -31139, 635655, 688805, -1414118, -3651796, -758062, -3698504, 1724966, -2810519, 4134443, -58519, 5936719, 2762201, -3623879, -2361695, -1989644, -209380, 8647380, 27790050, 24688008, -19298898, -2054605, 18871012, 6125160, 26335128, 11160473, -521302, 32126892, -6662568, -1663226, --20424180, -5373004, -390305, -14397804, 8660802, 12914967, -4159139, -151398, -11577084, -19879256, --11714523, -15146202, -4393752, -9133248, -2849711, -1403381, 9162239, 2357400, -1857573, -8159364, --2791729, -5428839, 2956548, 266288, -8086887, 4351876, 5451924, 2193118, -6237367, -8194798, -2804614, 7693360, -1038308, -217970, -14545444, 26248156, 4444755, -4905390, -660888, 2398739, -11259794, 9593883, -9791452, 5633387, -3794604, 1275605, -1605244, -2398739, -14905684, -13265543, --17859548, 2804614, -692564, -3690988, 11307038, -3483755, 31814970, -3032784, -1654099, -7723962, --3435437, 4221416, 5522791, 3941169, -206158, 13771813, 9859634, -1914482, -6549289, 1920387, --3879429, 95026, 1349157, -4285841, -1388885, 234613, -1413044, 2269353, -5346161, 3345780, -6113886, -1724429, 3240016, -1737851, -1423782, -2310156, 1064615, 3485366, -1356136, 4634270, -920734, 1726040, 6284074, 2816962, -755377, 6666863, 3013993, 4668630, 5958194, 4682588, -574452, 131533, 4432406, -3858491, 208306, 2808909, 1530619, 3195456, 2891587, 1675574, -3689377, -16760036, -24307904, -13240847, 17748416, 14292577, -12521440, -12585328, 19045496, 11782169, --12375411, -16461536, -2948495, 2974265, 1612223, 2495376, -9925669, 10280541, -7466801, 19990388, --3332358, -13820131, 2996814, 5217312, -377420, 1657857, -6408091, -8936753, -766652, 8211441, --5211943, 6287296, -10026064, -25928180, -21421150, 13535053, -16747151, 13349295, 3580392, 1684701, --5784784, 7901129, 2208687, -1923072, -4059281, 3776350, 7660074, -7023346, 21783000, -5425081, -7141457, -6510634, 1660542, -1725503, -8932458, 21446382, -16953846, 23318452, -1123671, -11377905, --17804250, 9100499, 2854006, 3052111, 744640, 9566503, 6029597, 8684424, -18319646, -5319854, -198642, 395137, 4268661, -13517873, -6905771, -4365298, -2623688, -16959216, -3773666, -5610301, --19521164, -923418, -11190537, 2908767, -5398774, 1559610, 2205466, 8527121, 4709969, -3122441, --813359, -6978248, 3627100, -408559, 3112241, -8208756, 183610, -3242700, 1737314, -7561290, -1233729, 1818919, 113280, -1625108, 2407329, -4414153, 3158412, -6928856, 2416456, -4947266, -2182917, 1398012, 3169149, -2535105, 8533026, 3528316, -132607, -5237176, -4638565, -769336, -5611912, -1145146, -3138011, -2676838, 3763465, 337692, 3548180, 41249940, 13763760, -9197672, -21196200, 19740206, -10204305, -13003013, 31870804, -2852932, 7012608, -18897856, 46393700, 1622424, --12985297, 6737193, 2325188, 22528178, 395674, 28450938, -20438138, 443455, -22325240, 1727114, -15707769, 736050, -13675176, 19397682, 10373957, 5717675, 4678293, -6769942, -6527277, 1772748, --9674414, 12704513, -11310796, -15086073, 13337484, 5057324, -17498234, 9516574, 1162326, -12722230, --7130183, -4247723, 6703370, -1497333, -7661685, 9356049, -11310796, -4484483, -3875134, 15656230, --10269804, 7568806, 12026982, 5568962, -7103876, -14620069, 9277129, -12501576, 16916802, -21299280, -28106266, -8314520, -3947075, -3991098, 12799539, -920197, 4647155, 7652558, 4610111, 10875394, --10609643, -20207822, 1421634, 17179332, -11458436, -5424544, -11976516, -7185481, 3163244, -1182190, --3442416, 7434052, 5352066, 3932043, -1883343, 11332271, 6941741, -5255966, -2766496, 2239289, -610422, 9598178, 6086506, -772020, -3115462, -2425583, 10480257, 978716, -5362267, 6642704, -1996086, 287226, 5541045, 2522220, -967441, -5633387, 1585380, 6898255, -5100274, -1258962, -7854422, -490163, -1611150, -1956358, 4640712, 916976, 141734, -2064806, -24671902, -3053185, -22560926, -6585796, -14068702, 6243272, -6604586, -1202591, 10230075, -24492052, -14393509, 9487046, -12611635, 17207786, -1213328, -3230352, 6932614, -1641751, -24222004, -16572668, 28501940, -2144263, --24960202, -14474577, -10041097, -8237211, 2325188, 8404714, 461172, -4146791, -12452184, -19035296, -2573759, 2559264, -659814, 15608985, -10627897, -29871498, 12133283, 8821326, -34909496, 20877836, --5639829, -17607218, -14521284, -1285806, 19881940, 4779762, -6573985, -7170448, 5684389, 10473815, --14696841, 11286637, 1822140, 8322573, -6359236, -15267535, 13578539, 73551, 15226733, -47229608, -6015102, 7329899, -6983617, 13166222, 15261629, 44960792, 1279900, -29634200, -13671955, -7716983, --28827820, -28271086, 1474784, -16039555, 212601, -10645613, 10593000, -10833518, -10681047, 18997178, -4657892, -602369, -1041530, 11167989, -2350421, -1069447, 6444062, 5335960, -4093104, 3661460, --10141492, -2186675, 2822867, -1867237, -2949569, -4836133, -5203890, -2616172, -6416681, 2622078, --8154533, 1816771, -1418413, 7693360, -1810329, -3936875, -3401077, -4543539, -4930623, -1263257, --3451006, -5930276, -4437238, 4437775, -5939940, -2997350, -10612864, 3328063, 4243428, 11002632, -2454574, -1345935, 660351, -20680804, 3349538, 12650826, 11389716, -18362596, 32622960, 22632868, --10400263, 13508209, -26326538, -5923297, -8793409, 41566692, 26720066, -9985262, -15843061, -19507742, --4275640, 1032940, 7692824, 27860916, 5985574, 4675609, 6085969, 700617, -9168145, 1052267, --1700807, 12800076, 17416092, 21952652, 14380087, 9269076, -2120103, -4140349, 3548180, 19894826, -3208878, 3473018, -20248624, -10388452, 34331284, 13843753, 10361072, 184147, 20594906, 10899553, -43336756, -2495376, 44681620, 3097745, -13777718, 14370424, -11984032, -9086003, -1505923, -8310762, -568546, 8208756, 17928804, 3029563, -3719442, -19625854, 6392522, 1540283, 12984223, -15410880, -4180077, -6849936, 2406256, -19582904, 10001368, -17241072, -1984812, -23440320, -32027572, -5439576, --4914517, 26377004, 7236483, -903554, 5068062, 8172249, 10424959, 1665374, -278636, 346282, --18502182, 5819144, 387084, 17272748, -6922951, -930397, -4514548, 12250320, 2586644, 11182484, --1074, -13173738, 6518150, -762357, 4470524, -10035191, -4362076, 2305861, 2891050, -7482907, -857383, 6699075, 4372814, -6594923, -7079717, 12664248, -12680354, 5261335, -3801583, -10557030, -3479997, 2306398, 3511136, 4263292, -4626217, -699543, 6295349, 399969, 4438849, -1905355, --4718559, -5093295, -10979547, -16604880, 5011153, -19061602, -107911, 23138062, 7170985, 19724638, --22937272, -10519986, 11118060, 2317135, 32620814, -16612397, 19469086, -7394323, -9995463, -24376086, --9569187, -13107703, 16246788, 3814468, -21824340, 27200564, -14175003, -13107703, 2529736, 10581726, --8069707, 18797462, -9249749, -13112535, -6866042, 6217502, -2428804, -3630858, 1905355, 18722300, --12853763, 34298000, -13474386, -491774, 31673774, -6441377, 5451387, -43455404, 1773285, 7700340, --9956271, 19084150, -34985728, -42661372, 15999827, -7628399, 23384486, -17659832, -16785270, 1819992, --5645198, 36131948, -4594542, -1742683, 7878044, -33727304, 1720134, -34084860, -13818520, 1865090, -7919383, -42536820, -19153944, -5310190, -2285460, 13634911, -18425946, 21625698, -9147207, 2334852, --28111634, -1522029, -24867860, 9197136, 5099200, 18223546, 23134304, -8824010, 15086073, 1955821, --5261335, 7715909, 4651987, -7648263, -7873749, -13599477, -740882, -8143258, -8640400, 2775623, --2238215, 11484743, -15862925, -2852395, -10073846, 3732864, 5415417, -5558225, -995359, -8444443, --8562017, 9169755, 15006079, 17052094, 3256122, 963683, -4904316, 3112241, 2563559, -6654515, --10638634, 3390340, -5740761, -7749195, 11341398, 7944616, 6500970, -10801306, -12592844, -26562226, -21714818, -19069654, -5097590, 16913044, 39598524, -11381126, 32511828, 11286100, 8617852, -15130096, -35989680, 5456219, 16963510, 1428077, -20605642, 7492034, -20691004, -21036750, 13389561, -20954608, --4160750, -4987531, 21472688, 1710471, -6761353, 6750615, 9742060, -4452271, -19598472, -4769561, -15675020, 37051608, 8898635, -21009906, 2642479, -4102231, 9243843, 11193222, 19171660, -8405251, -770947, 12113955, 3147674, -715112, 25182466, 22364432, 27059904, 9144522, 22789634, 3001109, -13799730, -10640245, -1562294, 2913599, -20567524, 1509144, 35651448, -4554276, -7430831, 7372848, --222801, 9439801, -20742544, 27787902, -17175574, -7864622, -4486630, 1368484, 3573413, 3525631, --30314952, 38556996, -8085276, -12410308, -4291209, 32735704, -3452080, 6774237, -25654376, -18098456, -805843, 13597330, 12820477, 20919712, -33416994, -10594074, 32529546, -11628087, 3834332, 27565100, -6847252, 6000606, -1526861, 913217, -10271951, -855235, 2905009, 7844758, -4501663, 6526203, --11894912, -6866579, 925029, -3466576, -1829656, -28330678, -21661668, 1765232, 14504105, -13389024, --22605486, -9374303, -18524194, 5238250, 1066763, -7218230, 18238042, -5212480, 7588671, 8214125, --9570798, -6940131, -1412507, 2187212, -503585, 13572097, 14496, 842887, -6361921, -1498407, --10139344, 63247152, -3848828, 12773770, -676457, -6373195, 1629403, -29083372, -12619151, -8870718, -11188927, 8201240, 14116484, 1730335, -15532749, 16188805, -13223667, 18645526, 13478144, -14939507, --16280610, 1990181, 22513682, -23211078, 9554155, 10793790, -13502303, 5982890, -1926293, 8184060, --1245541, -33891052, 18817862, 11742977, -28823526, 34548180, -18518826, -4357245, -11556683, 27886686, --5761162, -23665806, -287226, 383863, 22775674, 23434952, 1302449, -18036716, 25997438, -4223027, -4378719, -33288144, 25962540, 10703059, 1320166, -19098646, -14740865, -2028298, 8855149, -15352897, --27721330, -11683385, 21410948, 13440026, -3485903, 35202624, 1819992, -5720360, -25675314, 31061740, --29156386, -9321153, 31431644, 10023917, 3819837, -11933567, 4632659, 31272730, 6644852, 13711146, -19501300, -51172924, -11514807, -8502425, -4545149, -21223580, -4072703, -2515777, 30773978, 8425652, -1785633, 15803869, 21894132, 15559056, -11328513, 5930813, 12969727, -2631204, 4815732, 5737540, -6771553, 4595615, 21747566, 11956115, 1044214, -6422050, -10278394, -19116900, 2453500, 26844, -4831838, 6283001, 2649458, 33239826, -4897874, 12027519, 6865505, -9039832, -26721140, -4260608, --10110353, -16423418, -18060338, 3066070, -3271691, -21378736, -277562, 8162049, -2461553, -2078764, -7122667, -5255966, -16708497, -7258495, -25813290, 1306207, -28842316, 26996554, 40889164, 19717658, -23030152, -35667020, -32758252, -24847996, 1882806, 45280228, -8855686, 17118666, 28572270, 15135465, --16669305, 1404991, 20693690, -27013196, -23529442, -19256486, 21698712, 15965467, -29385092, -40220220, -54492936, 34398392, -39927628, 18195092, -5232344, 16697759, 1098975, -11498701, -27946278, 25313464, --1329292, -19853486, -30957588, 8129836, 6411850, -7283728, 127238, -2436857, -15632607, -6207302, --8565239, 14416595, -27242978, 29641716, -20732880, 1430761, 45373644, -44108240, -11445014, 42304356, -2344515, 10151692, -6955163, -12810277, 12443057, -4559108, -19233938, 2714956, -42931956, 71854264, --7779260, -78614008, 29118268, 78124384, 45175004, -95924872, -28742458, 18473728, 6195491, -14388677, --22950158, 12259447, 28631862, -35952096, -10768020, -62918048, -11674795, 22043382, 7175280, -19077170, --32399086, 12652437, 26910654, -381715, -9338870, -14947560, 21213918, 13286481, 8141111, -1667521, --7463580, 2802466, 11475079, 9731859, -3076807, -25144886, -16608639, 26491896, 10432476, -13421773, --10063645, 19034758, 5450851, -2507724, -39269424, -17477832, -20031728, 21667574, 5014375, 4818954, --4890357, 642635, 20051054, -4175245, -4649839, -18222472, 2694018, -5851893, 28325310, 6269042, --7507603, 3606162, 28581396, -3812320, -12253542, 2431488, 222265, -1478006, -20315196, 4955856, -19278498, 46232640, -19572702, 15311558, -24610700, -63960116, 34389804, -15836081, -35511864, -24021752, --36293548, 17613660, 11678016, -48030620, 30767536, -16503949, -1515050, -226023, -25130928, 19524384, -18801756, 17199196, -1873680, 22388054, 11233487, -12990665, 946503, -27229556, -10261214, -24116242, --17338246, -836982, 39537320, -32873680, -7350300, -6800007, -30032022, 17827336, -33840048, 17770964, -14852534, -22439056, 17743046, -36293548, 10299868, -31507880, 20454782, -11576547, -17073032, -17108466, --26200374, -6642704, 12865038, 23010824, -26584774, 17986250, 9662066, 27944130, 33709588, 20024212, --28392956, -12731357, -53213036, -13040594, -15592879, 17987324, -62064424, -11382200, -36991480, -2840584, -36721972, 34324304, 22138408, 8258149, 49518288, 54789824, 48275432, -16302085, -21966074, 18768470, -47255916, 88065080, 6159520, 20883742, 10519986, -4351339, 16039018, -15468325, 9387725, -3768834, --403190, -9848897, 16280074, 19371914, -6811818, -15400142, -12107513, 14754286, 6209449, 16685411, --9133248, 6672769, -3412352, -6916508, -4840428, 16569447, 31927714, 15664819, -16816408, 8791798, --5922760, 11815992, 4976794, 6002754, 15530602, -9796820, -21299280, 2069101, 16080358, 13052942, -4207458, -2850248, -7449084, -28726888, 28350006, 8272644, -6891275, -29887604, -7232725, -20448340, -10166724, 11840688, -10009958, 7344931, 57498876, -33996812, 21504902, 26100516, -12069395, 2357400, -10023380, -3221226, 27901182, 1413581, 20207284, -25830470, -3631395, 22431004, 3719442, -35041564, -22697828, -14003204, -11379516, -13389024, -3452080, -13058311, 13309030, 18547280, 9067213, -3252901, --9716290, 16091632, -5216775, -25739740, 21104932, -43448428, -10904922, -8956617, -9504226, 24773372, -27171574, 48645336, -14224932, 20805896, -722091, 9374303, 31952946, -2334852, 3467112, -21279416, --66959612, 33179160, 6455873, -32360432, -22107270, 3273839, 17592722, -3084324, -18916110, 9854802, --19395536, 25617870, 14366129, -11153493, -23273890, 46437724, 5191005, 2483028, -4170413, 6459094, -3369402, 2051921, -15517180, -32963874, 9219147, -4796942, -11645267, -30369714, -7380365, -857383, -27224188, 11233487, -34064460, 19973208, 3660386, -1243393, -3678640, 11173357, 14354318, -2756295, --6268505, -2354716, -5923297, 5333813, 8586176, -295279, 4980552, 9583146, -3376381, 13803488, -5964099, 4306779, 7342784, -3762928, 17313014, 3005940, -3495567, 11324755, -13412646, 4482872, -7949448, -3088082, -5646272, 15600395, 22446572, -19815368, -3535832, -6886980, -6675453, 8121783, -7074348, -12377022, 7111392, 5739150, 5145908, 6007049, -11075647, 8224326, -679142, 4932233, --13851806, -3422552, 2910914, 64133524, 32263258, 64531884, -59616832, 5420786, 30535070, -11669426, -34820372, 68070400, 36894844, 2450279, -18564996, -18545668, 3211025, 29662654, 31154082, 7432978, --383326, -46496244, -9947144, 46417324, 14956687, -12585865, 25172266, -21395916, -30631170, -8048769, --2333778, 35947804, 46275588, 42129872, 15546708, -15948287, -25254408, -45995880, -46323908, 40350144, -16492674, 3557844, 61577484, 4022237, -19267760, -25056302, -26050588, 12788265, 26124676, 21314312, -40279276, 3150896, 28892782, -1648731, -5571647, 15064061, 26725434, 20050518, 16865800, -15164993, --6168647, -11906723, -27760522, -21719650, -40309880, -13123809, 10392210, -6306623, 28760174, 35225712, --898722, 586800, -14647449, -25308094, 4941897, 34042448, -2279017, 18953690, 7869991, -2203855, --10919417, -4619238, 2756832, 12045236, 8862665, -8784282, -19252190, -23138600, -22279070, -8259222, -8575439, -2042257, -14127758, -6815040, -9906879, -7850127, 4185983, -985158, 12613245, 18771154, -3821984, -22304838, -11926587, -13270375, -3405909, 15436649, 3330747, 3969087, -18773838, -17231946, --20237886, -9991168, 17029546, 12057047, 14653892, 8276939, -7595113, -8762807, 6024766, 5970542, --1891933, 4114579, -7946227, -5912023, 4182761, 3383361, 5924371, -3460670, -7898982, -3286724, --6131603, -900869, 11530913, -33986076, -66058208, 26021060, 107920720, 109580184, 92893704, 67180808, --41432476, -47412144, -51079508, -68108520, -104039144, -83944600, -72773392, 33749852, 78339128, 58133992, -125942400, 97210144, 50799264, -18786186, -33848636, -84683336, -65983044, -65478924, -13300440, -40149356, --32476396, 9636296, 17781702, 35581120, 35854388, 49021684, 48766132, 62751620, 36711232, 16045461, --9070434, -10677826, -27572080, -41895796, -50438484, -61814244, -40372692, -75906032, -50458348, -37990060, -38028176, 71904728, 77682536, 53626960, 36652716, 57239568, 43916576, 54932632, 43290048, 15088220, --20346334, -96369936, -68038728, -69489888, -107670000, -67655936, -58430344, -56837988, 20706038, 57052736, -90764472, 74615928, 106691280, 95626912, 93638880, 66646080, -36340792, -33020782, -74828528, -99111200, --109069624, -89577448, -42900816, -12264816, -22553948, 29467770, 78161424, 54994372, 37258304, 62573380, -52706764, 18752364, -12335146, -12559558, -4006668, -15394237, -41972568, -26475252, -29975650, -16293495, --13418015, -31374200, -11548093, 10727755, -10448582, 34622804, 45832668, 50224272, 53252224, 3255048, -15931107, 15470472, -4490925, -72931232, -58095876, -45493904, -40524628, -32009854, -30252676, 33497524, -50167364, 54412940, 52183316, 42931956, 29529510, 26482768, -347355, -7900593, -42089604, -56925496, --50884088, -42523396, -27047556, -17671642, 2111513, 25613574, 52068964, 38919920, 24835112, 17923436, -4974109, -355409, 85362, -10384694, -13491566, -11211475, -13181792, 3173444, -4919348, -18185966, -2458869, 8731669, -3183108, -4514548, -3712999, 2094870, 3476776, -4705674, 1084479, 11889543, -7484518, 3519189, 7367480, 7103876, 1269700, -1352378, -2207613, -4722317, -6667400, -4943508, --3567507, -4542465, -3773129, -1718524, -672162, 1036698, 2218888, 2260227, 2063195, 3573950, -2892661, 3187940, 1329829, -1216550, -1475321, -122407, -1378148, -2658048, -1705102, 1177895, -2739652, 3427921, 2703682, 2628520, 653909, -1366873, -2885681, -4315369, -5814312, -5432060, --4786204, -2977486, -1274532, 1124745, 4128001, 7341710, 8199093, 8187819, 6595459, 4103841, -905701, -2011118, -5883032, -7658464, -8315057, -7165616, -5158793, -2477123, 567473, 3425773, -4170950, 4918812, 4330401, 3130494, 1515587, 643708, -164819, -436476, -811749, -824634, --1003949, -541166, -633508, -495532, -646393, -278099, -359704, -59056, -209380, 69256, --157840, 78920, -113280, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +573915, 2186138, 1808181, -5255966, -2726231, 7173133, 12464532, 2024003, 6643241, -2678986, +1261647, -326954, 5629092, -4437238, -10154376, 4129074, 4765803, -5904507, 6880001, 3404299, +6278169, 2005213, 1502702, -2713883, -863288, 351650, 4191888, 402653, -6275484, 303332, +-493384, 1388348, -859530, 1149441, 1527398, 3778498, 2739652, 925565, 1192927, 403190, +1860258, -1905355, -3115999, -6935836, 1369021, 1565516, 587874, 5372467, -1866163, 4183298, +1171989, -1620813, -3264712, -2094870, 7504919, 1637456, 4201552, 732292, 1675037, -1398549, +286152, 538482, 2180770, -607738, -2754148, -1468879, -5766531, 683974, 1167157, 5000416, +-1558536, 3832185, -624918, 2523293, 80531, 2277407, 1773285, 1084479, -890669, 2613488, +3586835, 2520072, 2357400, -37581, 542240, 622770, -1917166, 867047, 484258, 1768453, +932545, 754841, 962073, 1278290, -650151, 790811, -484794, -24159, -203474, 4871567, +4546760, 2192044, 1811939, 2607045, 2979097, 4603668, -2053531, 4774930, -27917, 5095979, +-1180042, 9010841, 2954938, 3030100, -6167573, -775242, -1460826, -7841537, 4248260, 3725347, +-2581275, -10297184, -4804458, -1481764, 4975720, 7031399, 4306242, -2704756, 1404991, -4372814, +132070, 461172, -3701188, -1727651, -9464497, 849330, -1257352, -3854733, 328565, 615791, +-1352378, -223338, 8902393, -2085207, 7236483, 1498407, -5735929, 493921, 468688, 4188667, +-1928440, 1241782, 893890, 389768, 5521181, 2018635, 5670431, 4304094, -3033321, 5318244, +2471754, 3903052, 278636, 1324461, -1425392, -2421825, -4818417, -5759015, 5992553, -5986648, +-4757750, -4939750, 2726231, 2610266, 1034013, 1172526, 3477313, -2223183, 2596845, -1661079, +-2509335, 3958349, -3661460, 673773, 1736777, -2943663, 646929, 507343, -552440, -402653, +-348429, 2109366, -752156, 829466, -987843, 1635846, -520765, 945430, -1167694, -1118302, +-1125818, -8057359, -7562364, 1656784, 112206, -1597191, 4471598, -560493, -824097, 4712653, +-5193153, 1040456, -4539244, -2883534, -1665374, 78920, 7605850, 8715562, -4078608, 3431142, +-6301791, -571768, -2495376, 8465917, -2542084, -452582, 836445, -11860015, -2115808, -5845451, +-1983738, -1433982, 4377109, 5903970, 2358474, 7971460, -1069984, -3598646, -3725884, 4611721, +11876121, 8360154, -4706748, -5421323, 5913096, -5334887, 964220, 1922535, 9718974, -3579855, +-4872641, 1082332, -3044058, 1886028, 2434173, 6229850, -6861747, -4398584, 3933116, 7521025, +-747861, -3470871, -4480725, -10601053, 3971234, -6979, 3106872, 507343, 219043, -1658931, +1890859, -2700998, 1624035, 2301566, 2254858, -3760244, 2709051, -683974, -2704219, 259846, +-5633924, 3498788, 466004, 446677, -2276333, -757525, -1936493, -3884261, -3013993, 2068564, +130460, 837519, -788663, 272730, -284005, -1112933, -942208, -1626182, 104153, -934692, +-762357, -231928, 299037, -292058, 465467, -305480, 1885491, 748935, -1203128, 1320703, +732292, -1536525, 1013612, -19744502, -6420439, -1104880, 3418794, 2192044, 4958003, -9465034, +-2754685, -492848, -9687836, -7031399, 2507724, 5828808, 3519189, 6439230, -773094, 3669513, +8722005, 7577933, 7242926, 4074313, -2712272, -2272038, -4394826, -2040110, -4415764, 9179419, +4356708, -1488206, -4043175, -2567317, -4129611, -6162741, -6520297, -8328479, 5034776, 3500398, +-9115531, 2094333, -431644, 6262063, 1012539, 3048890, 4145717, -8731669, -1309428, -385473, +1185411, 4481262, 6940667, -2831457, -965294, -2093260, -5421860, 1612223, 1122597, -639413, +-1457068, 5172215, 316754, -2956011, -949188, 2420214, 3377455, -1412507, -120796, 815507, +-4714264, 3460670, -337692, -7187091, 848793, -8759049, 1410897, 6410239, -2130841, -318364, +-9743670, -4827007, -7232725, -4463008, -575526, -806917, 4537096, 824097, 5322002, -3230889, +1810329, 2821794, 984084, 2776696, 352187, -1951526, 1120450, -898185, 932545, 37581, +399969, -402116, -1320703, -538482, 1214402, -1334124, 908922, 2199560, 1163399, 540092, +74625, 37044, -457951, -906238, -1433982, 1043140, 1444720, -882079, 952946, -928787, +-671089, 10902238, 3976603, 1923609, -2797098, 8056285, 2988224, 4594542, 12513924, 13753022, +424128, -2123861, -4941360, -7330436, 2627446, 5490042, -2892661, -462246, 671089, -1209033, +-4461934, 5211406, -5111011, 2452963, -14558865, -1998234, -3622268, -3423626, -7247221, -1402844, +-1029182, 197032, -3767223, -5143760, -4227322, 657667, -2837363, -5464272, 3209951, 4850629, +280784, -4469451, -5218922, 1958505, -4045322, 4576288, -5735392, 3704946, 1198296, 9664, +-8127152, -7340636, 1604170, -5298379, 8607114, 1635309, 7202660, -3718368, 7248831, 1510755, +4622459, 1687922, 4371740, -4066797, -6046777, -48855, 9349607, -855235, -6513318, -3315178, +3999688, -2581275, -3781719, 1029182, -10313290, 6942278, 8143258, -449361, -7202660, -8847633, +-415538, 7562364, 5272073, -4182761, 5607617, 661962, -986769, -1059783, -746251, -421444, +1430761, -2455111, -2331630, 251792, 701153, -1832340, 529355, -829466, -427886, 2046015, +-964757, -378494, 154619, -3089155, 1494649, 467615, 115964, 777389, 821413, -86436, +91268, -568009, -787590, -425202, -542777, -820339, 15410343, 3307125, 8416525, -3224447, +6278706, 4887673, 9838159, -7234873, -5367099, -1551557, 470836, 7208566, -3428458, 10874320, +-902480, 6240051, 5167383, -2865817, 2065879, 6321118, 5616744, 1602560, 1479079, 5771363, +-11744588, 2042257, 8905078, 7176891, -6395207, 7997229, -9383967, 5777268, -8289287, -3994320, +-2255395, 8665097, -1849520, 9066676, 1874216, 2060511, 330176, -165356, 3421478, 5377836, +11520176, 1964411, 9926206, -4804458, 7224672, 9800042, -419833, -1598265, -3602404, 3872987, +-13925358, -1010928, 1245004, -5035313, -8310762, -324270, -637266, -970663, 3500935, -8300025, +4151623, 3858491, 5246840, -13165685, 4464619, 3337190, -7980049, -785442, 4220342, 9930501, +-12520367, -1397475, 837519, -11584601, -1146219, 1863479, -3367791, 7847442, -1835562, 811749, +2056753, -1207423, -496069, -383863, 1267015, -2892124, 347892, -1431298, 827855, 420907, +-1831267, -44560, 2029909, -800475, -528818, 199179, -2579665, -795106, 384936, -804233, +-1228361, -207232, 377957, -1225139, -675384, 1882806, 2240899, -2854006, -171799, 642635, +-68183, -341987, -13764296, -16957068, -13506062, -12271795, -380105, 8580271, -17816062, 12673912, +8256001, -20086488, 12663174, 5322002, 4354560, 1956358, 1975685, 4508105, -3117610, -3301219, +-6556805, -223875, 7726646, 6476811, 3823595, -11445551, 7837242, -8187819, 256624, -7202660, +8990977, -4771172, -3670587, 2804077, -13394929, 1317481, -4414690, -4038343, -1398012, 938450, +13242995, -6251862, -1988033, -5049808, 10080288, -6131603, -3258270, 3073586, 3055869, 2811056, +3590056, -4190814, 4880694, 1213865, -10980621, 15122580, 6060199, 2425046, 1614908, -98784, +-7021198, 8645769, 7298223, 3012920, 9753334, 1013075, 4312684, 9746355, 5009543, 2079301, +-6699075, 8026757, -3500398, 15354508, -1644436, 386547, -4165582, -16153909, 2137283, -3934190, +-1890859, 8256001, -676994, -8773008, -4959077, 7093139, 5978595, 906775, 6922951, 1796370, +-5046587, 2384244, -466004, -1718524, -1388885, 539018, 4103841, -1952600, 522912, 703301, +2315524, 850404, -1839857, 2964064, 451508, 774705, -161598, 751619, 384400, -1188632, +1723356, -1200980, 1421097, 1081258, -857920, 3343095, -445066, 809601, -1132261, -781684, +9854802, 6717329, -1141924, -6180458, 16196859, 25755308, -3401077, -3573413, 12453795, 3032784, +4108673, 3307662, -18547280, 2047089, -11992622, 9599789, 13684303, -3585761, -6606734, 2241973, +8668855, -5195300, 10471130, -4101694, 20207284, -5900748, 3912715, -983011, 5486821, 14401562, +-5430450, 1426466, -1266479, 4172561, -5333276, -2567317, 8198019, 17667348, 1480690, 12937515, +-4780836, 1793686, -2425583, 4321811, 9454834, 14103062, 10991358, 10449119, 10857140, 6877317, +-1975685, 1688996, -1487669, 288300, 2161979, -7033009, -2024003, 11369852, -9966472, 3992172, +-4378719, -2609730, -5177046, -20533164, 2305861, 11165841, 7061463, -2513093, -9739375, -23666880, +-3808026, 9665287, -1984275, 3830037, -7374996, 5537824, -6800007, 6284611, 13443248, -5867999, +-7252589, -13373991, 4056060, 1686848, 2213519, -10565620, 778463, 98247, -3195456, 645319, +5014911, 256624, 3452617, 1562294, 2241973, 2760590, -454193, 4321274, 1039382, 475668, +-872415, -1349157, -1163399, 4123706, 1393717, -97711, 2757906, 1483911, 1996086, -335007, +2286533, 2809446, 3762391, -1517734, 419833, -1475858, -17674328, -14102525, 1854889, 8262980, +-7931731, -5248450, 1060857, -4314832, -26476326, -22897544, 9995463, 9153649, 1722819, 1321239, +-9674414, 15176804, 18510772, 11363947, -9496173, 8866960, 12164958, -1919850, -15354508, -6972880, +21303574, -6349036, 2168422, 1263794, 11984569, -9617506, -17047262, 3677029, 7885560, -4232691, +5058935, 11036992, -5335960, -4283693, -468151, -23893440, -6875706, 8176544, -4498978, -15977278, +2921115, -456340, -4983236, 3135863, -1473174, -15151034, -12782360, -22661858, -17952964, 3474629, +7960185, 705448, -5353140, -7587060, 216896, -5199058, 4857608, -10906533, 399969, -3885872, +-3109020, -3717831, -953483, 4212289, -4913443, -21743808, 3287798, -3160559, 5389647, 5916318, +436476, 4100083, 5058398, 1563905, -1214402, 2610803, -3059627, 1185948, -6742562, -3617973, +-3011309, -3753802, 1565516, 5948530, -3106335, 912144, -7669738, 856309, -747324, -5730023, +2511482, -1844152, 1461900, 2306398, 1360968, 1013075, 4869419, 1030255, 650688, 1588601, +31139, 635655, 688805, -1414118, -3651796, -758062, -3698504, 1724966, -2810519, 4134443, +58519, 5936719, 2762201, -3623879, -2361695, -1989644, -209380, 8647380, 27790050, 24688008, +19298898, -2054605, 18871012, 6125160, 26335128, 11160473, -521302, 32126892, -6662568, -1663226, +-20424180, -5373004, -390305, -14397804, 8660802, 12914967, -4159139, -151398, -11577084, -19879256, +-11714523, -15146202, -4393752, -9133248, -2849711, -1403381, 9162239, 2357400, -1857573, -8159364, +-2791729, -5428839, 2956548, 266288, -8086887, 4351876, 5451924, 2193118, -6237367, -8194798, +2804614, 7693360, -1038308, -217970, -14545444, 26248156, 4444755, -4905390, -660888, 2398739, +11259794, 9593883, -9791452, 5633387, -3794604, 1275605, -1605244, -2398739, -14905684, -13265543, +-17859548, 2804614, -692564, -3690988, 11307038, -3483755, 31814970, -3032784, -1654099, -7723962, +-3435437, 4221416, 5522791, 3941169, -206158, 13771813, 9859634, -1914482, -6549289, 1920387, +-3879429, 95026, 1349157, -4285841, -1388885, 234613, -1413044, 2269353, -5346161, 3345780, +6113886, -1724429, 3240016, -1737851, -1423782, -2310156, 1064615, 3485366, -1356136, 4634270, +920734, 1726040, 6284074, 2816962, -755377, 6666863, 3013993, 4668630, 5958194, 4682588, +574452, 131533, 4432406, -3858491, 208306, 2808909, 1530619, 3195456, 2891587, 1675574, +3689377, -16760036, -24307904, -13240847, 17748416, 14292577, -12521440, -12585328, 19045496, 11782169, +-12375411, -16461536, -2948495, 2974265, 1612223, 2495376, -9925669, 10280541, -7466801, 19990388, +-3332358, -13820131, 2996814, 5217312, -377420, 1657857, -6408091, -8936753, -766652, 8211441, +-5211943, 6287296, -10026064, -25928180, -21421150, 13535053, -16747151, 13349295, 3580392, 1684701, +-5784784, 7901129, 2208687, -1923072, -4059281, 3776350, 7660074, -7023346, 21783000, -5425081, +7141457, -6510634, 1660542, -1725503, -8932458, 21446382, -16953846, 23318452, -1123671, -11377905, +-17804250, 9100499, 2854006, 3052111, 744640, 9566503, 6029597, 8684424, -18319646, -5319854, +198642, 395137, 4268661, -13517873, -6905771, -4365298, -2623688, -16959216, -3773666, -5610301, +-19521164, -923418, -11190537, 2908767, -5398774, 1559610, 2205466, 8527121, 4709969, -3122441, +-813359, -6978248, 3627100, -408559, 3112241, -8208756, 183610, -3242700, 1737314, -7561290, +1233729, 1818919, 113280, -1625108, 2407329, -4414153, 3158412, -6928856, 2416456, -4947266, +2182917, 1398012, 3169149, -2535105, 8533026, 3528316, -132607, -5237176, -4638565, -769336, +5611912, -1145146, -3138011, -2676838, 3763465, 337692, 3548180, 41249940, 13763760, -9197672, +21196200, 19740206, -10204305, -13003013, 31870804, -2852932, 7012608, -18897856, 46393700, 1622424, +-12985297, 6737193, 2325188, 22528178, 395674, 28450938, -20438138, 443455, -22325240, 1727114, +15707769, 736050, -13675176, 19397682, 10373957, 5717675, 4678293, -6769942, -6527277, 1772748, +-9674414, 12704513, -11310796, -15086073, 13337484, 5057324, -17498234, 9516574, 1162326, -12722230, +-7130183, -4247723, 6703370, -1497333, -7661685, 9356049, -11310796, -4484483, -3875134, 15656230, +-10269804, 7568806, 12026982, 5568962, -7103876, -14620069, 9277129, -12501576, 16916802, -21299280, +28106266, -8314520, -3947075, -3991098, 12799539, -920197, 4647155, 7652558, 4610111, 10875394, +-10609643, -20207822, 1421634, 17179332, -11458436, -5424544, -11976516, -7185481, 3163244, -1182190, +-3442416, 7434052, 5352066, 3932043, -1883343, 11332271, 6941741, -5255966, -2766496, 2239289, +610422, 9598178, 6086506, -772020, -3115462, -2425583, 10480257, 978716, -5362267, 6642704, +1996086, 287226, 5541045, 2522220, -967441, -5633387, 1585380, 6898255, -5100274, -1258962, +7854422, -490163, -1611150, -1956358, 4640712, 916976, 141734, -2064806, -24671902, -3053185, +22560926, -6585796, -14068702, 6243272, -6604586, -1202591, 10230075, -24492052, -14393509, 9487046, +12611635, 17207786, -1213328, -3230352, 6932614, -1641751, -24222004, -16572668, 28501940, -2144263, +-24960202, -14474577, -10041097, -8237211, 2325188, 8404714, 461172, -4146791, -12452184, -19035296, +2573759, 2559264, -659814, 15608985, -10627897, -29871498, 12133283, 8821326, -34909496, 20877836, +-5639829, -17607218, -14521284, -1285806, 19881940, 4779762, -6573985, -7170448, 5684389, 10473815, +-14696841, 11286637, 1822140, 8322573, -6359236, -15267535, 13578539, 73551, 15226733, -47229608, +6015102, 7329899, -6983617, 13166222, 15261629, 44960792, 1279900, -29634200, -13671955, -7716983, +-28827820, -28271086, 1474784, -16039555, 212601, -10645613, 10593000, -10833518, -10681047, 18997178, +4657892, -602369, -1041530, 11167989, -2350421, -1069447, 6444062, 5335960, -4093104, 3661460, +-10141492, -2186675, 2822867, -1867237, -2949569, -4836133, -5203890, -2616172, -6416681, 2622078, +-8154533, 1816771, -1418413, 7693360, -1810329, -3936875, -3401077, -4543539, -4930623, -1263257, +-3451006, -5930276, -4437238, 4437775, -5939940, -2997350, -10612864, 3328063, 4243428, 11002632, +2454574, -1345935, 660351, -20680804, 3349538, 12650826, 11389716, -18362596, 32622960, 22632868, +-10400263, 13508209, -26326538, -5923297, -8793409, 41566692, 26720066, -9985262, -15843061, -19507742, +-4275640, 1032940, 7692824, 27860916, 5985574, 4675609, 6085969, 700617, -9168145, 1052267, +-1700807, 12800076, 17416092, 21952652, 14380087, 9269076, -2120103, -4140349, 3548180, 19894826, +3208878, 3473018, -20248624, -10388452, 34331284, 13843753, 10361072, 184147, 20594906, 10899553, +43336756, -2495376, 44681620, 3097745, -13777718, 14370424, -11984032, -9086003, -1505923, -8310762, +568546, 8208756, 17928804, 3029563, -3719442, -19625854, 6392522, 1540283, 12984223, -15410880, +4180077, -6849936, 2406256, -19582904, 10001368, -17241072, -1984812, -23440320, -32027572, -5439576, +-4914517, 26377004, 7236483, -903554, 5068062, 8172249, 10424959, 1665374, -278636, 346282, +-18502182, 5819144, 387084, 17272748, -6922951, -930397, -4514548, 12250320, 2586644, 11182484, +-1074, -13173738, 6518150, -762357, 4470524, -10035191, -4362076, 2305861, 2891050, -7482907, +857383, 6699075, 4372814, -6594923, -7079717, 12664248, -12680354, 5261335, -3801583, -10557030, +3479997, 2306398, 3511136, 4263292, -4626217, -699543, 6295349, 399969, 4438849, -1905355, +-4718559, -5093295, -10979547, -16604880, 5011153, -19061602, -107911, 23138062, 7170985, 19724638, +-22937272, -10519986, 11118060, 2317135, 32620814, -16612397, 19469086, -7394323, -9995463, -24376086, +-9569187, -13107703, 16246788, 3814468, -21824340, 27200564, -14175003, -13107703, 2529736, 10581726, +-8069707, 18797462, -9249749, -13112535, -6866042, 6217502, -2428804, -3630858, 1905355, 18722300, +-12853763, 34298000, -13474386, -491774, 31673774, -6441377, 5451387, -43455404, 1773285, 7700340, +-9956271, 19084150, -34985728, -42661372, 15999827, -7628399, 23384486, -17659832, -16785270, 1819992, +-5645198, 36131948, -4594542, -1742683, 7878044, -33727304, 1720134, -34084860, -13818520, 1865090, +7919383, -42536820, -19153944, -5310190, -2285460, 13634911, -18425946, 21625698, -9147207, 2334852, +-28111634, -1522029, -24867860, 9197136, 5099200, 18223546, 23134304, -8824010, 15086073, 1955821, +-5261335, 7715909, 4651987, -7648263, -7873749, -13599477, -740882, -8143258, -8640400, 2775623, +-2238215, 11484743, -15862925, -2852395, -10073846, 3732864, 5415417, -5558225, -995359, -8444443, +-8562017, 9169755, 15006079, 17052094, 3256122, 963683, -4904316, 3112241, 2563559, -6654515, +-10638634, 3390340, -5740761, -7749195, 11341398, 7944616, 6500970, -10801306, -12592844, -26562226, +21714818, -19069654, -5097590, 16913044, 39598524, -11381126, 32511828, 11286100, 8617852, -15130096, +35989680, 5456219, 16963510, 1428077, -20605642, 7492034, -20691004, -21036750, 13389561, -20954608, +-4160750, -4987531, 21472688, 1710471, -6761353, 6750615, 9742060, -4452271, -19598472, -4769561, +15675020, 37051608, 8898635, -21009906, 2642479, -4102231, 9243843, 11193222, 19171660, -8405251, +770947, 12113955, 3147674, -715112, 25182466, 22364432, 27059904, 9144522, 22789634, 3001109, +13799730, -10640245, -1562294, 2913599, -20567524, 1509144, 35651448, -4554276, -7430831, 7372848, +-222801, 9439801, -20742544, 27787902, -17175574, -7864622, -4486630, 1368484, 3573413, 3525631, +-30314952, 38556996, -8085276, -12410308, -4291209, 32735704, -3452080, 6774237, -25654376, -18098456, +805843, 13597330, 12820477, 20919712, -33416994, -10594074, 32529546, -11628087, 3834332, 27565100, +6847252, 6000606, -1526861, 913217, -10271951, -855235, 2905009, 7844758, -4501663, 6526203, +-11894912, -6866579, 925029, -3466576, -1829656, -28330678, -21661668, 1765232, 14504105, -13389024, +-22605486, -9374303, -18524194, 5238250, 1066763, -7218230, 18238042, -5212480, 7588671, 8214125, +-9570798, -6940131, -1412507, 2187212, -503585, 13572097, 14496, 842887, -6361921, -1498407, +-10139344, 63247152, -3848828, 12773770, -676457, -6373195, 1629403, -29083372, -12619151, -8870718, +11188927, 8201240, 14116484, 1730335, -15532749, 16188805, -13223667, 18645526, 13478144, -14939507, +-16280610, 1990181, 22513682, -23211078, 9554155, 10793790, -13502303, 5982890, -1926293, 8184060, +-1245541, -33891052, 18817862, 11742977, -28823526, 34548180, -18518826, -4357245, -11556683, 27886686, +-5761162, -23665806, -287226, 383863, 22775674, 23434952, 1302449, -18036716, 25997438, -4223027, +4378719, -33288144, 25962540, 10703059, 1320166, -19098646, -14740865, -2028298, 8855149, -15352897, +-27721330, -11683385, 21410948, 13440026, -3485903, 35202624, 1819992, -5720360, -25675314, 31061740, +-29156386, -9321153, 31431644, 10023917, 3819837, -11933567, 4632659, 31272730, 6644852, 13711146, +19501300, -51172924, -11514807, -8502425, -4545149, -21223580, -4072703, -2515777, 30773978, 8425652, +1785633, 15803869, 21894132, 15559056, -11328513, 5930813, 12969727, -2631204, 4815732, 5737540, +6771553, 4595615, 21747566, 11956115, 1044214, -6422050, -10278394, -19116900, 2453500, 26844, +4831838, 6283001, 2649458, 33239826, -4897874, 12027519, 6865505, -9039832, -26721140, -4260608, +-10110353, -16423418, -18060338, 3066070, -3271691, -21378736, -277562, 8162049, -2461553, -2078764, +7122667, -5255966, -16708497, -7258495, -25813290, 1306207, -28842316, 26996554, 40889164, 19717658, +23030152, -35667020, -32758252, -24847996, 1882806, 45280228, -8855686, 17118666, 28572270, 15135465, +-16669305, 1404991, 20693690, -27013196, -23529442, -19256486, 21698712, 15965467, -29385092, -40220220, +54492936, 34398392, -39927628, 18195092, -5232344, 16697759, 1098975, -11498701, -27946278, 25313464, +-1329292, -19853486, -30957588, 8129836, 6411850, -7283728, 127238, -2436857, -15632607, -6207302, +-8565239, 14416595, -27242978, 29641716, -20732880, 1430761, 45373644, -44108240, -11445014, 42304356, +2344515, 10151692, -6955163, -12810277, 12443057, -4559108, -19233938, 2714956, -42931956, 71854264, +-7779260, -78614008, 29118268, 78124384, 45175004, -95924872, -28742458, 18473728, 6195491, -14388677, +-22950158, 12259447, 28631862, -35952096, -10768020, -62918048, -11674795, 22043382, 7175280, -19077170, +-32399086, 12652437, 26910654, -381715, -9338870, -14947560, 21213918, 13286481, 8141111, -1667521, +-7463580, 2802466, 11475079, 9731859, -3076807, -25144886, -16608639, 26491896, 10432476, -13421773, +-10063645, 19034758, 5450851, -2507724, -39269424, -17477832, -20031728, 21667574, 5014375, 4818954, +-4890357, 642635, 20051054, -4175245, -4649839, -18222472, 2694018, -5851893, 28325310, 6269042, +-7507603, 3606162, 28581396, -3812320, -12253542, 2431488, 222265, -1478006, -20315196, 4955856, +19278498, 46232640, -19572702, 15311558, -24610700, -63960116, 34389804, -15836081, -35511864, -24021752, +-36293548, 17613660, 11678016, -48030620, 30767536, -16503949, -1515050, -226023, -25130928, 19524384, +18801756, 17199196, -1873680, 22388054, 11233487, -12990665, 946503, -27229556, -10261214, -24116242, +-17338246, -836982, 39537320, -32873680, -7350300, -6800007, -30032022, 17827336, -33840048, 17770964, +14852534, -22439056, 17743046, -36293548, 10299868, -31507880, 20454782, -11576547, -17073032, -17108466, +-26200374, -6642704, 12865038, 23010824, -26584774, 17986250, 9662066, 27944130, 33709588, 20024212, +-28392956, -12731357, -53213036, -13040594, -15592879, 17987324, -62064424, -11382200, -36991480, -2840584, +36721972, 34324304, 22138408, 8258149, 49518288, 54789824, 48275432, -16302085, -21966074, 18768470, +47255916, 88065080, 6159520, 20883742, 10519986, -4351339, 16039018, -15468325, 9387725, -3768834, +-403190, -9848897, 16280074, 19371914, -6811818, -15400142, -12107513, 14754286, 6209449, 16685411, +-9133248, 6672769, -3412352, -6916508, -4840428, 16569447, 31927714, 15664819, -16816408, 8791798, +-5922760, 11815992, 4976794, 6002754, 15530602, -9796820, -21299280, 2069101, 16080358, 13052942, +4207458, -2850248, -7449084, -28726888, 28350006, 8272644, -6891275, -29887604, -7232725, -20448340, +10166724, 11840688, -10009958, 7344931, 57498876, -33996812, 21504902, 26100516, -12069395, 2357400, +10023380, -3221226, 27901182, 1413581, 20207284, -25830470, -3631395, 22431004, 3719442, -35041564, +22697828, -14003204, -11379516, -13389024, -3452080, -13058311, 13309030, 18547280, 9067213, -3252901, +-9716290, 16091632, -5216775, -25739740, 21104932, -43448428, -10904922, -8956617, -9504226, 24773372, +27171574, 48645336, -14224932, 20805896, -722091, 9374303, 31952946, -2334852, 3467112, -21279416, +-66959612, 33179160, 6455873, -32360432, -22107270, 3273839, 17592722, -3084324, -18916110, 9854802, +-19395536, 25617870, 14366129, -11153493, -23273890, 46437724, 5191005, 2483028, -4170413, 6459094, +3369402, 2051921, -15517180, -32963874, 9219147, -4796942, -11645267, -30369714, -7380365, -857383, +27224188, 11233487, -34064460, 19973208, 3660386, -1243393, -3678640, 11173357, 14354318, -2756295, +-6268505, -2354716, -5923297, 5333813, 8586176, -295279, 4980552, 9583146, -3376381, 13803488, +5964099, 4306779, 7342784, -3762928, 17313014, 3005940, -3495567, 11324755, -13412646, 4482872, +7949448, -3088082, -5646272, 15600395, 22446572, -19815368, -3535832, -6886980, -6675453, 8121783, +7074348, -12377022, 7111392, 5739150, 5145908, 6007049, -11075647, 8224326, -679142, 4932233, +-13851806, -3422552, 2910914, 64133524, 32263258, 64531884, -59616832, 5420786, 30535070, -11669426, +34820372, 68070400, 36894844, 2450279, -18564996, -18545668, 3211025, 29662654, 31154082, 7432978, +-383326, -46496244, -9947144, 46417324, 14956687, -12585865, 25172266, -21395916, -30631170, -8048769, +-2333778, 35947804, 46275588, 42129872, 15546708, -15948287, -25254408, -45995880, -46323908, 40350144, +16492674, 3557844, 61577484, 4022237, -19267760, -25056302, -26050588, 12788265, 26124676, 21314312, +40279276, 3150896, 28892782, -1648731, -5571647, 15064061, 26725434, 20050518, 16865800, -15164993, +-6168647, -11906723, -27760522, -21719650, -40309880, -13123809, 10392210, -6306623, 28760174, 35225712, +-898722, 586800, -14647449, -25308094, 4941897, 34042448, -2279017, 18953690, 7869991, -2203855, +-10919417, -4619238, 2756832, 12045236, 8862665, -8784282, -19252190, -23138600, -22279070, -8259222, +8575439, -2042257, -14127758, -6815040, -9906879, -7850127, 4185983, -985158, 12613245, 18771154, +3821984, -22304838, -11926587, -13270375, -3405909, 15436649, 3330747, 3969087, -18773838, -17231946, +-20237886, -9991168, 17029546, 12057047, 14653892, 8276939, -7595113, -8762807, 6024766, 5970542, +-1891933, 4114579, -7946227, -5912023, 4182761, 3383361, 5924371, -3460670, -7898982, -3286724, +-6131603, -900869, 11530913, -33986076, -66058208, 26021060, 107920720, 109580184, 92893704, 67180808, +-41432476, -47412144, -51079508, -68108520, -104039144, -83944600, -72773392, 33749852, 78339128, 58133992, +125942400, 97210144, 50799264, -18786186, -33848636, -84683336, -65983044, -65478924, -13300440, -40149356, +-32476396, 9636296, 17781702, 35581120, 35854388, 49021684, 48766132, 62751620, 36711232, 16045461, +-9070434, -10677826, -27572080, -41895796, -50438484, -61814244, -40372692, -75906032, -50458348, -37990060, +38028176, 71904728, 77682536, 53626960, 36652716, 57239568, 43916576, 54932632, 43290048, 15088220, +-20346334, -96369936, -68038728, -69489888, -107670000, -67655936, -58430344, -56837988, 20706038, 57052736, +90764472, 74615928, 106691280, 95626912, 93638880, 66646080, -36340792, -33020782, -74828528, -99111200, +-109069624, -89577448, -42900816, -12264816, -22553948, 29467770, 78161424, 54994372, 37258304, 62573380, +52706764, 18752364, -12335146, -12559558, -4006668, -15394237, -41972568, -26475252, -29975650, -16293495, +-13418015, -31374200, -11548093, 10727755, -10448582, 34622804, 45832668, 50224272, 53252224, 3255048, +15931107, 15470472, -4490925, -72931232, -58095876, -45493904, -40524628, -32009854, -30252676, 33497524, +50167364, 54412940, 52183316, 42931956, 29529510, 26482768, -347355, -7900593, -42089604, -56925496, +-50884088, -42523396, -27047556, -17671642, 2111513, 25613574, 52068964, 38919920, 24835112, 17923436, +4974109, -355409, 85362, -10384694, -13491566, -11211475, -13181792, 3173444, -4919348, -18185966, +2458869, 8731669, -3183108, -4514548, -3712999, 2094870, 3476776, -4705674, 1084479, 11889543, +7484518, 3519189, 7367480, 7103876, 1269700, -1352378, -2207613, -4722317, -6667400, -4943508, +-3567507, -4542465, -3773129, -1718524, -672162, 1036698, 2218888, 2260227, 2063195, 3573950, +2892661, 3187940, 1329829, -1216550, -1475321, -122407, -1378148, -2658048, -1705102, 1177895, +2739652, 3427921, 2703682, 2628520, 653909, -1366873, -2885681, -4315369, -5814312, -5432060, +-4786204, -2977486, -1274532, 1124745, 4128001, 7341710, 8199093, 8187819, 6595459, 4103841, +905701, -2011118, -5883032, -7658464, -8315057, -7165616, -5158793, -2477123, 567473, 3425773, +4170950, 4918812, 4330401, 3130494, 1515587, 643708, -164819, -436476, -811749, -824634, +-1003949, -541166, -633508, -495532, -646393, -278099, -359704, -59056, -209380, 69256, +-157840, 78920, -113280, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -3398393, -3420942, 2815888, 6496675, -8848706, 1939178, 5733245, 10643466, -1203665, 6017786, -310848, -5468030, 1248762, 8361228, -228707, -2647847, 5538361, 8014409, 7487739, 4502737, 1158567, --3027415, -2483028, 794032, 3792456, -1911797, 1731946, 519691, 4320200, -2074469, -179315, -1135482, -5282810, -2995203, -1592896, -5414880, 1250909, -1499481, -100932, -701690, -4596689, -3576097, 5362267, -1081258, 382252, 536871, -917512, 5785321, -7026030, 16106, 2834679, -810138, 870268, -1639604, -5826660, -1441498, 2197413, 2691334, 2904472, -491237, 53150, -71404, 1123134, -949188, 6001680, 200790, -578747, -3934190, 489626, -2809446, -2235531, -2416456, 2554969, 6265821, 175557, 6161131, 652298, 693100, 368830, -3212636, 156766, --1124745, -1691143, 690953, 1919850, -1211181, 750546, -1254131, 1516124, -1598802, -545998, --807991, 860067, -492311, 801011, -700080, 951872, 1771137, 829466, -824634, -268435, --411243, -464393, 525597, 332860, -396211, 6951942, 11244761, 1516660, 5592048, -2024003, -3316789, 4354560, -1348083, -3474092, 5890548, 10189273, -2007897, 1139777, 3926137, -4864588, -3022583, 4355634, -8910983, 2512556, 857383, -1992865, -10737, -9257802, 365609, 2605435, --4417374, 824634, 144418, 5945309, 4228932, -2219961, -645319, -555125, -6321118, -4233764, -682363, 2557653, 559420, 2840584, -4180077, 637803, 2070711, 438624, -3870839, -2817499, --866510, 1351304, 3111167, 3237332, 2142652, 3777961, 3679176, -4134980, -1278827, 175020, -5234492, -791348, 3752728, -2468533, -2573222, -786516, -4725001, -2168959, 955093, 2757369, --4034048, 3944391, -1124745, -1169842, -796716, -1589138, -2045478, 819802, 3053185, 1147830, -5102958, -7088307, -5729487, -1254667, 2109366, -70867, -1176284, 1088774, 149250, 1319629, -2148558, 3618510, 54761, -209380, 846645, -332323, -61740, 560493, -1669669, -868657, --3443490, 1372242, 6522982, 9238475, 5347235, -2310693, 3956202, -2407329, -1631014, -7881802, --6287832, 2857764, 6038187, 5924371, 6156299, 1388348, 328565, 3831648, -5092221, 5134634, -4142496, 398895, 3558381, 9164923, 6220187, 1761474, -6576132, 209917, 2207613, 1437740, -1083406, -7182259, 1723356, 1345935, 4819490, 5341329, -1672353, 3438658, -2591476, -2854006, -3874061, 2220498, -6894497, -6501507, -2858301, -3642669, -2728915, -2888366, -7964480, -7183333, --652298, 2626909, -45634, -734976, -5366025, 741419, 6370510, -1761474, -2011655, 2426657, --11811, 4635344, 2317135, 2382633, -2971044, -3639985, 6841883, 3159485, -2736431, 4536559, --598074, 3543885, -2968896, 584652, 5051956, -1886028, -1634235, 3673271, 448824, 1482838, -2170569, -2479270, 2835215, -1146756, 2323577, 2371359, 1810329, -1576253, 593779, -767189, --1366873, -1717987, 101469, 245350, 1145146, 1016297, 268972, -52613, 899796, 317291, -627602, -12730283, -7526394, -2330557, 2397666, -5235565, 1583769, -1417876, 3650722, -870268, --7157563, -5657009, 4920959, 4063576, 10197863, 9043054, -1388348, 6549289, -9838159, -1575716, -7617662, 2323577, 1754494, -983011, -3224447, -1472637, 1040456, -852014, -313533, 3888556, --4830765, 1099512, 1735167, -90194, 3025268, -3284039, -2726767, 1775432, -2123861, 2745021, --5395553, 920197, -3246459, -1244467, -3613678, -2667175, -4103305, -6038187, 3707094, -10737, -6329171, -5900748, -5088463, -12348, 1203665, -667331, -1229434, 449361, 3809636, 1859721, -812823, -2578054, -2525978, -1396938, -4745402, 784368, -1235340, 586800, -230854, -5066988, --435402, -372052, -5406290, 181462, -1024887, 660351, -916439, -5979668, 537408, 2735357, --1199370, 4006131, 1095217, -2090575, 1670742, 4202626, 1369558, 754304, 941672, -848256, -517007, 3296924, -255014, -481573, 1201517, 1376537, 519691, 1117765, 234076, 491237, --2178622, 280784, -170188, -1030255, -780073, -747861, -1107028, 210990, -907312, 4509716, --6888591, 2850785, -7693897, -1252520, 339302, -5571110, 5283347, 4139275, -11403138, -1067299, -1875290, -966905, -5008469, -6582038, 1340030, -3270618, -5581847, -2649995, 3253975, 3003256, -8028368, 10574209, -945430, 9459129, -5780489, 3774740, 4050691, -744103, 3990025, -2216740, -57445, -521839, -1959579, -912681, -2189897, 7897908, -465467, -5729487, -1416802, 4001299, -2405182, 3218004, 599148, -2629057, 5681705, 11716671, 702227, 1264868, 659278, -772020, -1819456, -687195, 6622303, -4985384, 6334003, 4499515, -4057134, 2165737, 4119411, 2929705, --4857608, -5143760, -10375567, -1596117, -996969, 1413044, 3985730, -874563, 2589329, -780610, --2769180, -2641405, 5331665, -1118302, 5657009, -8266202, -3318399, 2028835, -5323075, 1485522, -5692443, 649077, -54761, 528281, 1204202, 893890, -3228205, -918586, -535260, 580894, --581431, 1160178, 1454383, 869194, -940061, -2045478, 2359011, 1029718, 914828, 736587, -682363, 290447, 55298, -924492, 983011, 585726, 382789, 293132, 1034550, 817118, -1241246, -1319092, -878858, -1568200, -1573569, -293132, 1246614, -861141, -591095, 814970, -274878, 638340, -265751, 230854, 2898566, 1447941, 42950, 4161823, 11630771, 13954886, --3699041, -200790, 2812667, -1971927, 8861591, 8868571, -5606543, 8697846, 6642167, 2720862, -3813394, 3620658, 1692754, -625455, 532576, 1279900, -4821638, -5660230, 1430224, -1490354, --158914, 1132798, -5202279, 5296232, 10282689, -189515, -6302865, 10271951, 1151051, 447213, -3899830, -1642825, -3118683, 1613297, -3889630, 1661079, 10275709, 4575751, -150861, 3842385, -5553393, 14752139, -2461553, 6447283, -1325534, -6208375, 4104915, 523449, -2180770, 3018825, -8890582, 2444910, 1526324, 14496, 3522947, 13079249, 5735929, 1763621, 1250909, 3551938, --3789235, 6764574, -1764695, -12652437, 1503239, -1224603, 7657927, 9232569, 3877282, -3734474, --3580929, -3163780, -506806, 2975876, 216359, 2063732, 1256815, 2156611, 5746130, 2656437, --4640176, -1844152, 593242, 1752347, 252866, 35970, 131533, -2371359, 2627983, 780073, -501974, 440771, 502511, 397821, 1960116, -662499, 1420024, -1304060, -464930, -2145873, -428423, -730144, -158914, 287226, 929324, -15742666, -1642825, -6752226, -7714298, -2199023, --5472325, 139050, 4903779, -7465727, 7703024, -16360067, 2406256, -4937602, -8550206, -11741904, -12208981, 5911486, 871342, -10423886, -6637872, 3700651, -13270375, -9481140, 3255048, 2692945, -13648332, -1906966, 1209570, 9904731, -5901822, 9724343, 3463354, 3467112, -1851131, -6099928, --624381, 8067559, -4365298, 542777, 10394358, -3928285, -2978560, -5157719, -6068789, -5465883, --3912715, -8504572, -957778, 2338610, -2796024, 1665374, -2672544, -4439386, 5862094, -7619272, -4583267, -6504728, -7922604, 208843, 6619619, 246961, -1923072, 2422362, -5270462, -2868501, --7406671, -13482976, -6231461, 1701344, -3981435, 14994268, 6088653, -10795937, -5297842, -1770063, --3778498, 4677220, 10340671, 6564321, -4943508, 4560182, -5871221, 3349001, 572841, 4567698, --5196911, -1453846, 501437, -2520072, -4430259, -3955128, 729071, -464930, -1005559, 2121714, -932008, 139586, -1446330, 1174674, -260919, -1379758, -3220689, -306016, -1642288, 49392, -1474784, -1308354, -3587908, -660351, -1509144, -6090264, -842887, -1889249, 16748762, 11166915, -11409581, -3229816, -16617765, -1168231, -8597451, 2251637, 3473555, 8986145, -4330401, 4016331, --6939594, 1287953, -6142877, -15156940, -8428873, 5982353, -5763309, -11984569, -11578158, -10462003, --16729434, 2188823, -5980205, -12463458, -11518565, 2118493, 15743203, -2000918, -2844879, -5198521, --9845676, 2121177, -4030827, 1184337, -12236899, 894964, -12738873, 1877438, -1207423, 6869800, -5040144, 5738613, 2700461, -352187, 4476430, -2958159, 8985072, 2700998, 4457639, 2905546, --3182034, 3386045, 9055939, -1086090, 4978941, -1192927, 14347875, 1990181, 5279052, 828392, --8325794, -6116034, 108448, -2770791, 1700807, -1992328, 4638028, 4408784, 5420249, -2457795, -3016678, -11031623, 5756867, 16409996, -8032126, -1540820, 4159139, -9270687, -813359, 5983963, --3854196, -469762, -2119030, 5218386, -5408438, -1136556, 1253057, -2815351, 1253594, -904628, -1990181, -2598455, -2868501, 3119757, -1520418, -2866891, 1942936, -1066763, -97711, -4097399, -3054259, 1184337, -857383, -590558, 1672890, 756988, 1618129, 1399086, 160524, -1699196, --3334505, -825707, 1726577, -8201777, -23663660, -3953518, -8244727, -12499965, 6735583, -23829552, --3066607, -8499740, -4590783, 6834367, -7558069, 10027138, 8694624, 1343788, 7841000, 653372, -4151623, -6243809, -10933376, -12094628, -6731288, -11089069, 8621610, 11237782, -475131, -5989869, -3265786, 3205656, -4147328, 781684, -18813030, -10001905, 8757438, -4848481, 258235, 8536784, --812823, 5260261, 4547834, -2503429, 5202816, -115964, -10032507, 11113228, -7853348, 481036, -614717, -6221260, 4102231, 6600291, -3930969, 7548405, 852551, -654983, -6959458, 8533563, --52076, -7027640, -2310693, -14015552, -5856188, -8031052, -1012002, 9526774, 2765422, -980326, -155693, -9097278, 2026688, 6874632, -9112310, 452582, 13942538, -5813238, 1364189, 984084, --9919764, -6038724, 6340446, 5239860, -16138876, 3175055, 12061342, -136902, 1435593, -6442, -2903935, -1000191, 7611756, -1824824, -321049, 893890, 1458141, -3537443, 871342, 2599529, -822486, 4441533, 1658394, -183073, -1668058, -3653407, -1035624, 1605244, -2213519, 1511829, --2269890, -156766, 3131031, 1591822, -2216740, -3093450, 150861, 6442, 6669011, -2789581, -540629, 3555696, 1471026, 3506841, 42270532, 9308268, -5456756, -8546985, -751619, -2759517, -7545184, -1750199, 6386080, 11881490, -4765803, 517544, -7860327, -5507759, 2601677, -1393180, -6204081, -11916387, -6880538, 5495948, 11905112, 7737921, -320512, 2719251, -2859911, -7213935, -5193153, 9175661, 9759776, 11635603, -9673340, -2393371, -5533529, -12140262, -1486059, 532039, --2604898, 5442798, 7339562, -112206, 3638374, -2258079, -12770012, -7063611, -17090748, -17469780, --5042829, 5722507, -2514167, -7792682, 14586246, 5408975, -569620, -13754096, -601832, -4305168, --9744744, 23085, -4448513, -6426345, -13504451, -1833414, -4977867, -14968498, 13422, 11276437, --7627862, -3724811, 4216048, -6495065, 2558190, -6436546, 9277666, -3064459, -8941048, -13997835, --22817014, 4413616, 3869229, 17353278, 7033546, 5950141, -74625, 5206037, -4097936, 5523328, --510027, 1890859, 2801393, 6569153, 3054796, 183610, -1211718, -415001, 2643552, 1563905, -6922414, 5345624, 3636227, 1100049, -1403917, -3736622, 2000381, 4407174, 404801, 207769, --838592, -3312494, -554588, -556735, -1548336, -1227824, -2494839, 2006824, 3055332, -2934000, --2909840, -235686, -379031, 1527935, 9427453, -33365454, -19110994, 17790292, -4665408, 1208496, --9241696, 7803419, -3224447, -12825846, 6146635, 17991082, 2250026, -15598784, 4376572, -3334505, --3630321, 10396505, 10655814, -1359894, -2216740, 22643604, 5003637, -3156801, -13900125, 6228777, --19918448, -16273631, -15113990, 6212134, -2882460, -1522566, 12933220, 5266704, -13190918, -10903311, -2840584, 12902619, 4361540, -1358820, 707596, 8639327, -6185827, -13798119, 18128520, -5223754, -1868848, 7436199, 1118839, 2626373, 18648212, 438624, 11876121, 652835, -12512850, 1928440, -2663954, -2472291, 2378338, 8613557, -6328098, -1796907, 2167348, -24592982, 6554120, 5179731, --144955, 6058588, 4620848, -9042517, 4347581, 34076808, 14593762, 8518531, 2463164, 8377871, --26096758, -12237436, 13212930, 664109, -114890, -9877351, 8834211, 10823318, 8955544, 1632088, -1886028, -3440806, 155156, -6065568, -2243047, 5048197, -1091459, -2983929, 2564096, 348966, -2462090, -3470871, -1517197, 1366873, -641561, 2627446, -4312147, -1343788, 3104188, -3302293, -2514703, 1060857, 341987, 251792, 50466, -2644089, 1421097, 2744484, -1277216, -1144072, --2980707, 1475858, -162672, -22269942, 15607374, 16975858, 5301601, 9422621, -6357089, 27016954, --3290482, 10385768, 6886443, -12272869, -5214091, -5595269, 15497316, -9163850, -3017215, 9968082, -8153996, -9006010, -2600066, -26275000, 4814659, -2803540, -7872675, 2408403, 593779, 2071785, -2306934, 9060234, 244813, 9912248, 1044751, 4893042, -2650532, -8386461, -9190693, 17177722, --6198175, -12235288, -10520522, -4596689, -5843303, 7518341, 4469451, 5816460, 7421704, 2377801, --9472550, 5473399, -15370614, -4876399, -13447006, 9280351, -16205448, -11429445, -3538516, -5304285, -4677757, 10929081, -8722542, 10323491, 16686485, 8458401, 16069620, -6684043, 21614422, 2099165, -18292266, 10555419, 2164664, -9711995, -24832428, -16577500, -13699872, -7596187, -7736847, -2309082, --11633993, 8783208, 14315126, -5444408, -11207717, -9987946, -8126078, -14916958, 9334038, 6961605, --4128537, -3759707, -5972152, 886911, -3442953, 8216810, -114354, 2193118, -4456029, -3590593, --6226629, -1005022, -7431904, -6887517, 7040525, -389231, 738198, 295816, 2492692, -2747169, --411243, -4186519, 3758, 142808, -329102, 2333241, 93416, -3405372, -2455648, -2411087, -565862, -3668439, -4264366, -5088463, 1265405, -1293322, 12483859, 6360847, -7101729, 21014202, -2376191, -20516522, 25617332, 1713692, -10912438, 9037148, -21041582, -4032438, -13397614, -4188667, --2374580, -4117263, -9578851, 2675765, -18182208, -7039452, -6558952, -24539832, 2975876, -17800492, --12650289, -19969988, 4000225, -15071577, -4551055, -5003100, 157840, 7577396, -6126234, 10671920, -547071, 14164802, -3308736, 12317429, 15537044, -18673444, -285615, 4984310, 11404212, 424665, -13713294, 4572530, 13222057, -301185, -10114648, -6380174, -979253, 8535174, -1978369, -3965329, --867047, 15825881, 10001905, -3800509, -13075491, 4348118, 7170448, 5070746, 14050449, -18864570, --13938243, -4016331, 1318555, -5340255, 142271, -5446019, -11782169, 32991792, -16325708, -18979998, -14126684, 8095477, 12271795, 3719979, 4506495, 2491081, 7171522, -6838125, 18967650, -3373160, -4646618, -3725347, 2532420, 1079647, -1047435, 12036646, 1508070, 995359, -11934104, 5334887, -1777580, -1819456, -9720048, -1066226, -2015413, 182536, -3099356, 8638790, 2010045, 2356863, --7025493, 4712653, -3341485, 891743, 4198331, -261993, -2080375, -2344515, -6250251, 3540127, -6382322, -3134789, -709207, -2354716, 947577, -3727495, -8409009, -2648384, -284005, -5867999, -5970542, -629213, -811749, 1903744, -5651640, -6518150, -1808718, 2513093, -4290673, -5714454, -16763257, 12151536, 19800336, -6670084, -4769025, -27159762, 31510028, 14279156, -41722388, -22502944, -13506598, 18501108, 18832894, -12148852, -9664213, 22543746, 5476084, 5081483, 15811385, 12579422, --23029614, 6965900, 9843528, -1853815, 11010686, 1975685, -2877628, 2137820, -7437810, 38487200, -10201084, 4903779, -971736, -4902169, -2507724, -22029424, 4286378, 6308233, -5071820, -7310035, --35372276, -17069810, 7503845, 6051072, -11556146, -11513734, -1527935, -17012902, 7059853, 6133214, --2381559, 6916508, 14053670, 566936, -656056, -4614406, -7402376, -2579128, 1322850, -26271242, --3412889, 6000606, 15999290, -28423556, 6346888, 9998147, -2163053, -13457206, -11960947, 21215528, -21169894, -3230889, -13121662, -25151328, 5322538, 9884867, 5305895, 270583, -27210766, 11355894, -24870008, -8549132, 2854006, 7648800, -10160819, -16438987, -8565775, 2335389, -5008469, -1444720, --7635915, -6768869, -5567888, -2529736, -2169495, 3164317, -559420, -650688, -6962142, 2731599, --3254512, 1349694, 83215, 2107755, 4269198, 4787815, -7788923, 2984466, -6015639, -10322417, --5319854, 1303523, -1009854, 4286914, -969589, 2737505, 6017786, 145492, -265214, -5426691, --2931852, 7794829, 4041564, -3481608, -2027225, -927713, -5054640, 12414066, -9137543, 3364570, --7613367, -6766184, 1189169, 8399345, 16850768, -31044024, -40450000, -28159416, -36188856, 31392990, --20959440, 12615930, -3539590, -25469156, 4552129, -6942815, -9450002, -33057290, -30247844, -22629108, --8625368, 1134945, -17508972, -5113696, 4611721, 14172855, 1112933, -8891656, 18254, -9506373, -13622563, -17210470, 23696946, 20388210, -4915053, -6556268, -28156194, -16458315, -17136920, 2004139, -3747896, -4640176, 22950694, 6492380, 18595060, 3614752, -2237678, -8514236, 16720308, 11515881, -5215701, -16899086, 8968965, -28535762, -3229279, -3088082, -18954228, -3177202, 179852, 21705690, -14370424, 346819, 10011569, -469225, -21527986, 10865730, 2972117, 17834852, -10205916, -20729660, -12252468, -37194952, -8589398, 13062606, -5650567, -5987722, 9013526, -2498597, -7402913, 6795712, --3182571, -23901494, -21035140, -3548180, 9710921, 15762530, 22198538, 22247930, -9567040, -7679402, -4294968, 8009577, 7198365, 2963528, -10032507, 8636642, 55298, -1935420, 1013075, 5321465, -8941585, -2735894, 1409823, 8475044, -2108829, -260382, -8769786, 4228932, -2014340, -688269, -6992744, -1484448, -3322157, 3111167, -9969156, -3723200, 9846749, 2775623, 3090766, -3619047, --2485176, -1561758, -7996156, -1117228, -4531728, 5864241, -17204566, 203474, 12631499, -40703404, --3524021, -26000658, 1832340, -19209778, 17517560, -13785234, -1189169, 3167539, 6699612, 20590610, -7236483, -9647570, 22739168, 6786049, -38009924, 6104759, -22702124, -1828046, 4632659, -3396246, -19152870, -5784784, 3697967, 4602058, 1930588, -12448426, 19441706, -11272142, -784368, -22593676, -253403, 3641059, -3273839, -8048769, -10014253, -11872363, 29344290, 1012539, 15329275, -26034482, -3199751, -469762, 9166534, 15309411, -17522392, 31481036, 45806364, -2214593, 4672388, -16026134, -7564511, 10467372, -8517457, 2142652, 8848706, 17545478, -302795, 920197, -5206574, -15489263, --22818088, 11648488, -17045652, -7430294, -11072426, 4903242, 15819438, 13838921, -2493229, 5133023, --31068720, 20604032, -3591130, 4407174, -8937827, 20134270, -27858232, 33455110, 24676198, 27859842, --11034845, -760746, -27302570, -15035607, -9994389, 8971650, 7914014, -22905598, -16486232, 551903, --5570573, -16731045, 179315, -11604465, -13449690, -5199058, -1826435, 976568, -8819715, 1542430, -3267396, 13753022, 12589086, -1992865, 11878806, -5810017, -14357002, -8124468, -2916283, -7404524, --919660, -5515275, 8442832, 2443837, 32020592, 4162360, -10769630, -3805341, 3039226, -16668768, --10202695, 3929358, 845572, -4335233, 1836635, -8053, -17992154, -1918240, 12324946, -8970576, -12924630, 51155208, 14185740, 37294276, 11464341, -38196756, 15151034, 11038603, -13156559, 2942053, -24559696, 1422708, 23493472, 21415244, -25062208, 13935021, -25072408, -16407849, -2670396, 50070728, -14973330, -22153442, 20886962, 13966160, -27711666, -11782169, -2194192, 28156194, 3794604, -25177636, --14652818, -493384, -7297687, 15766288, 21990232, -7763691, 19303730, -12335683, -17420388, -286152, -40104256, 4065187, -23523536, 13509283, -1403917, -2002529, 11001559, -26036092, -23075786, -21307870, -15529528, -13847511, 4799089, 7052337, 23855858, 12267500, 24533926, 2960843, -1381369, 20574504, -36887328, 22422414, -37096168, 1081258, 3271691, -5913096, 6793565, 10526428, -28715614, -3962107, -5325760, 5244155, -34142844, -31752156, -18285286, -19165754, 33302102, 12753369, 1260573, 15148887, --27712740, 11641509, 7295539, 5337034, -2720325, -5950677, 22920092, 14276471, -9581535, 4292283, --7297687, 15477452, -4663798, 1386738, 2891587, 2569464, 11005854, -1467805, -18637474, -450435, -3151969, 5135171, 9150428, -2238752, 557272, 7385733, -14510547, -8108899, -1607392, -25556130, --4255239, 7493108, -2201171, 3125126, 14525579, -1794223, -10613938, 2530273, 3304977, 9945534, -11198053, -10752451, -7124277, -411780, -9701257, -5804649, -18331458, -21149492, 5673652, 674847, --9971303, -7773891, -10172093, -19220516, 14369887, -38513508, 27851252, 31336082, 8556112, 34117608, --34939024, -16935056, -9517111, -49957448, 28131498, 2942590, 17387102, 23087596, 22385370, 1855426, --775778, 22958748, -3680250, -26988500, -28215250, 17171816, -31868120, 31176094, -8965744, 6941741, -30701500, 27875412, -14009110, 42377904, -24532854, 2880313, -25504590, 4264366, -8743480, 16779900, -5611912, -17908404, 16167868, 24788404, 36149664, -20759188, 7710003, 22376780, -30547418, 1575179, --12290586, -43963824, -19010598, 11956652, -24260122, 8811662, -20366734, -310311, 29706142, -13919452, -12578885, 34432752, 24447490, 9356049, 45526116, -70727912, -13370233, 23879482, -2734821, 14003741, --21963390, -38120520, 46563888, -456877, -23451058, 10265509, 29473140, 73338712, 27699854, -55071680, --30172682, 19071266, 20464446, 9103720, -38606924, -3127273, 8488466, -11691438, 26100516, 9581535, -16670379, 20072530, 14891725, -9882183, 11506217, -30419106, 4442607, 16662326, -1948305, -16008954, -9535364, -9664750, 16298327, 18267570, -7673496, -14698452, -4012573, 33495376, -5920076, -3607773, --12990665, 15308337, -12899397, -7675107, 9621800, -5904507, 31309774, -2090039, -7729868, 31768262, --2794413, 7653095, 19289772, -1160178, -1628866, 2155537, 2879776, -14490146, 6743636, 1127966, --21453898, 14914811, -6645925, 28001040, -15062987, 8657043, 2605435, 37443524, -32885490, -2972117, --15693810, -19490562, 30054034, -11652783, 39454108, -3876208, -30338576, 47305844, 68390376, -9703405, --21748640, -32952600, 7925289, 36361192, 7224135, -7580618, -22552874, 5454609, 5443871, -4931160, -5699959, -3141232, -11020886, -11259794, 10573673, 15021111, -1029718, 20274394, -19321448, 41473816, -31286152, 18085570, -1373853, 2585570, 6027450, -21751324, -19012210, -21072720, -11003706, -5662915, -13404056, 11796665, 22602266, -10672994, -2510945, -9431748, 25703232, 50020800, -11589969, -31872952, --20458002, -1110786, -43212204, 33949568, -58757300, 17219060, 25186762, 25882546, -25489020, 6221260, -26230976, -59463284, -28002650, 12492449, -6091874, -29669098, -26176752, -3168075, -13600014, 44654776, -19284940, -15992848, -14715095, -24372866, 68266360, 14901926, 35793720, -2259153, 10647224, 13156559, -15526844, -21938692, -2566243, 28562070, 19757924, 11973832, -9037148, -11788611, 303869, 9146133, -13334800, 9183714, -17234630, 2857764, 502511, 4905390, 12968117, 13045963, -18042084, 8929774, --10986526, -13511430, 1802276, 14756971, 6191196, -8267275, 2333778, -852014, -2262374, -7000797, -27529130, -7645042, 452582, -15857019, 4201552, -5615670, 18300856, 6193880, -3434900, -9167608, -10593537, 8862665, -12081206, 1285269, -19918984, -7588671, 5256503, 8810589, 11940546, 315680, -12495134, -2455648, 2433636, 6405407, -25191594, 7248294, 39902392, 820339, -12960064, 32602560, -24004572, -7215545, -20787642, -32471026, 6532109, 62753768, 14273250, 31999654, -2442226, 2465311, --2155537, -7779260, 396211, 2542621, 15684147, 4701379, -11870216, 10159208, -10342281, -12150462, --12968117, -5906, 13051332, 2413772, 10509785, 10537165, 9159555, -9202504, -15287936, 4646081, --10481868, -27456116, -7672422, 5847061, -9105331, 31404800, -32369022, 26338350, -8094403, -97174, -39766028, -6475200, -736050, 51197620, -7569343, -21237540, 4118337, -18234284, -3746822, -17227114, -57671212, -16491064, 14154065, -14044543, -5862094, -8121783, 9836549, -14688788, -34846680, 15266998, --3730716, -39242580, 20704964, -10459856, 22005264, 48744656, -24249386, -756451, -2226941, -7469485, --26117696, -4821101, 24470576, 9499394, 15125264, -22426708, 6881612, 3762928, -21201570, -6024229, -5068062, 10886668, 14068702, 980326, 2914672, 8851928, -1873143, -10829223, 15824270, -6269042, --4439386, 14023068, 2185065, -4020626, 21348672, -1519882, -1333051, 72478, 7146289, -6425808, -10901701, -8304856, -3856881, -6574521, 5793911, -251792, -520765, 2990908, 10037339, -11698417, -2774012, -1618129, 7270306, 2044404, -1997160, 11974369, -7075959, 6451041, -1828582, 3531537, -1071594, 8979166, -1068910, -13750338, -186294, 65972308, 33182918, 69208568, -38788924, -9780177, -22610318, -21328808, 16328392, 71198208, 16683264, 10512469, -18850074, -17389786, 20213726, -10492605, -28637232, -4458176, -6665253, -8075613, -40876276, 10092636, 48962628, -25632364, 29582660, 26149908, --16674137, -4718559, 20343112, -32304060, 16201154, -2017024, 24526410, 8621073, -20441896, -6269579, --41064720, -20732880, 19182398, 14774687, 31829466, 50044960, 5268315, 1103807, -43105904, -25997438, --25753698, -20858508, 11243151, -17246442, -5058398, -3707631, 12868796, -32565516, -5339181, 17369922, -8768176, 27461484, -3653944, -12649752, 26960584, -4544076, 16520055, -20430622, -12556874, -2865817, --6952479, 13585518, 19620484, 28103582, 7830263, 2644626, -19170050, -5034776, -9840307, 23600308, -254477, 35189740, 6053220, 26598732, -25512642, -8776766, -177704, -252866, 18997714, -2646774, --9438191, -4760971, 4672925, 1695975, 4948339, 9164386, 7864085, -4440460, -5669357, 748398, --3345780, 7794829, 7926362, 2245731, -6602439, 682900, -8660265, -3241090, -1881733, 15369004, -5386963, -1552094, 3923453, -9613747, -11806865, -7598334, 3777961, 8626442, -7018514, -284542, -157303, 6542846, 3442416, -518080, 6568616, 1445793, -293668, -6021544, 3139621, 2318209, --2585034, 1101122, 2016487, -8922258, -17722646, -67881960, 2110977, 108304040, 98347768, 91809760, -39410620, -39497056, -53908284, -54155780, -47757888, -88673360, -62717796, -61828200, 47894256, 72704672, -59939488, 94730336, 79441328, 16435766, -3339337, -34368328, -65949760, -39905080, -69315944, -38170984, --22984518, 34897, -8981850, 17134772, 30221538, 50466404, 32288490, 53041772, 40955196, 42075112, -3617436, -35254164, -15589658, 882616, -37835976, -50724636, -65216932, -64749316, -45383308, -6761889, -32287416, 12309376, 46832860, 32585916, 53370336, 46923056, 51760260, 59367724, 32424856, -4908611, --9334038, -39297340, -31593242, -105557408, -83882320, -67791224, -52431352, 5820755, -22719304, 1173600, -72179608, 88445728, 121742992, 76478336, 46470472, 31098248, 7633768, -46848968, -42348376, -65186868, --83562880, -71349608, -65961032, -31414464, 5057861, 33250564, 55479704, 54183696, 46675020, 28934658, -31419834, 13048648, 8674760, -1823214, -25482578, -22770842, -20219096, -23164906, -11874511, -25852482, --17977660, 5998996, 2468533, -15163382, 8352101, 20716774, 12235288, 23682450, 37696392, 38603168, -17457432, -24376624, -10121627, -3684545, -48795124, -52086144, -44863616, -19155554, 14295262, 21858700, -18776524, 30779346, 35443144, 43070468, 29066728, 17439178, -6361384, -29384556, -29272886, -33239826, --44056700, -31784906, -17182016, 14857366, 24358908, 15302432, 9760313, 27823872, 19276350, 11260331, -2960306, -4459787, -8688182, 659814, -10488847, -13080860, -4423817, 4080756, -7173669, -5834176, -1503239, 5574868, 1040456, -3068754, -3556233, 4147328, 283468, -2434710, -4254165, 1362042, -6297496, 7384660, 1348083, 6340983, 6000070, 3050501, -1664837, -1547262, -5073967, -4910758, --7512435, -4217658, -4878546, -1313186, 649077, 1353452, -466004, 2975876, 3819300, 5734855, --1509144, -677531, 1962800, 2957622, -2404645, -217433, -770947, 363998, 1316944, 4271345, --274878, 1339493, 771484, 955093, -2640868, -3868155, -6614250, -4076461, -5286568, -3925063, --4258460, 1277216, 3405372, 6363531, 6594923, 10074920, 7926362, 7090454, 2738579, 459025, --4954245, -6372121, -9303436, -8071854, -8845485, -5111548, -3101503, 838592, 1890323, 6354941, -5394479, 6966437, 5550709, 5234492, 962610, 907312, -1959042, -1920387, -4365298, -2586644, --3185255, -829466, -1946157, 120259, -849867, 1138166, -242666, 1372242, -259846, 1190243, --397284, 1078574, -589484, 840740, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +3420942, 2815888, 6496675, -8848706, 1939178, 5733245, 10643466, -1203665, 6017786, -310848, +5468030, 1248762, 8361228, -228707, -2647847, 5538361, 8014409, 7487739, 4502737, 1158567, +-3027415, -2483028, 794032, 3792456, -1911797, 1731946, 519691, 4320200, -2074469, -179315, +1135482, -5282810, -2995203, -1592896, -5414880, 1250909, -1499481, -100932, -701690, -4596689, +3576097, 5362267, -1081258, 382252, 536871, -917512, 5785321, -7026030, 16106, 2834679, +810138, 870268, -1639604, -5826660, -1441498, 2197413, 2691334, 2904472, -491237, 53150, +71404, 1123134, -949188, 6001680, 200790, -578747, -3934190, 489626, -2809446, -2235531, +2416456, 2554969, 6265821, 175557, 6161131, 652298, 693100, 368830, -3212636, 156766, +-1124745, -1691143, 690953, 1919850, -1211181, 750546, -1254131, 1516124, -1598802, -545998, +-807991, 860067, -492311, 801011, -700080, 951872, 1771137, 829466, -824634, -268435, +-411243, -464393, 525597, 332860, -396211, 6951942, 11244761, 1516660, 5592048, -2024003, +3316789, 4354560, -1348083, -3474092, 5890548, 10189273, -2007897, 1139777, 3926137, -4864588, +3022583, 4355634, -8910983, 2512556, 857383, -1992865, -10737, -9257802, 365609, 2605435, +-4417374, 824634, 144418, 5945309, 4228932, -2219961, -645319, -555125, -6321118, -4233764, +682363, 2557653, 559420, 2840584, -4180077, 637803, 2070711, 438624, -3870839, -2817499, +-866510, 1351304, 3111167, 3237332, 2142652, 3777961, 3679176, -4134980, -1278827, 175020, +5234492, -791348, 3752728, -2468533, -2573222, -786516, -4725001, -2168959, 955093, 2757369, +-4034048, 3944391, -1124745, -1169842, -796716, -1589138, -2045478, 819802, 3053185, 1147830, +5102958, -7088307, -5729487, -1254667, 2109366, -70867, -1176284, 1088774, 149250, 1319629, +2148558, 3618510, 54761, -209380, 846645, -332323, -61740, 560493, -1669669, -868657, +-3443490, 1372242, 6522982, 9238475, 5347235, -2310693, 3956202, -2407329, -1631014, -7881802, +-6287832, 2857764, 6038187, 5924371, 6156299, 1388348, 328565, 3831648, -5092221, 5134634, +4142496, 398895, 3558381, 9164923, 6220187, 1761474, -6576132, 209917, 2207613, 1437740, +1083406, -7182259, 1723356, 1345935, 4819490, 5341329, -1672353, 3438658, -2591476, -2854006, +3874061, 2220498, -6894497, -6501507, -2858301, -3642669, -2728915, -2888366, -7964480, -7183333, +-652298, 2626909, -45634, -734976, -5366025, 741419, 6370510, -1761474, -2011655, 2426657, +-11811, 4635344, 2317135, 2382633, -2971044, -3639985, 6841883, 3159485, -2736431, 4536559, +-598074, 3543885, -2968896, 584652, 5051956, -1886028, -1634235, 3673271, 448824, 1482838, +2170569, -2479270, 2835215, -1146756, 2323577, 2371359, 1810329, -1576253, 593779, -767189, +-1366873, -1717987, 101469, 245350, 1145146, 1016297, 268972, -52613, 899796, 317291, +627602, -12730283, -7526394, -2330557, 2397666, -5235565, 1583769, -1417876, 3650722, -870268, +-7157563, -5657009, 4920959, 4063576, 10197863, 9043054, -1388348, 6549289, -9838159, -1575716, +7617662, 2323577, 1754494, -983011, -3224447, -1472637, 1040456, -852014, -313533, 3888556, +-4830765, 1099512, 1735167, -90194, 3025268, -3284039, -2726767, 1775432, -2123861, 2745021, +-5395553, 920197, -3246459, -1244467, -3613678, -2667175, -4103305, -6038187, 3707094, -10737, +6329171, -5900748, -5088463, -12348, 1203665, -667331, -1229434, 449361, 3809636, 1859721, +812823, -2578054, -2525978, -1396938, -4745402, 784368, -1235340, 586800, -230854, -5066988, +-435402, -372052, -5406290, 181462, -1024887, 660351, -916439, -5979668, 537408, 2735357, +-1199370, 4006131, 1095217, -2090575, 1670742, 4202626, 1369558, 754304, 941672, -848256, +517007, 3296924, -255014, -481573, 1201517, 1376537, 519691, 1117765, 234076, 491237, +-2178622, 280784, -170188, -1030255, -780073, -747861, -1107028, 210990, -907312, 4509716, +-6888591, 2850785, -7693897, -1252520, 339302, -5571110, 5283347, 4139275, -11403138, -1067299, +1875290, -966905, -5008469, -6582038, 1340030, -3270618, -5581847, -2649995, 3253975, 3003256, +8028368, 10574209, -945430, 9459129, -5780489, 3774740, 4050691, -744103, 3990025, -2216740, +57445, -521839, -1959579, -912681, -2189897, 7897908, -465467, -5729487, -1416802, 4001299, +2405182, 3218004, 599148, -2629057, 5681705, 11716671, 702227, 1264868, 659278, -772020, +1819456, -687195, 6622303, -4985384, 6334003, 4499515, -4057134, 2165737, 4119411, 2929705, +-4857608, -5143760, -10375567, -1596117, -996969, 1413044, 3985730, -874563, 2589329, -780610, +-2769180, -2641405, 5331665, -1118302, 5657009, -8266202, -3318399, 2028835, -5323075, 1485522, +5692443, 649077, -54761, 528281, 1204202, 893890, -3228205, -918586, -535260, 580894, +-581431, 1160178, 1454383, 869194, -940061, -2045478, 2359011, 1029718, 914828, 736587, +682363, 290447, 55298, -924492, 983011, 585726, 382789, 293132, 1034550, 817118, +1241246, -1319092, -878858, -1568200, -1573569, -293132, 1246614, -861141, -591095, 814970, +274878, 638340, -265751, 230854, 2898566, 1447941, 42950, 4161823, 11630771, 13954886, +-3699041, -200790, 2812667, -1971927, 8861591, 8868571, -5606543, 8697846, 6642167, 2720862, +3813394, 3620658, 1692754, -625455, 532576, 1279900, -4821638, -5660230, 1430224, -1490354, +-158914, 1132798, -5202279, 5296232, 10282689, -189515, -6302865, 10271951, 1151051, 447213, +3899830, -1642825, -3118683, 1613297, -3889630, 1661079, 10275709, 4575751, -150861, 3842385, +5553393, 14752139, -2461553, 6447283, -1325534, -6208375, 4104915, 523449, -2180770, 3018825, +8890582, 2444910, 1526324, 14496, 3522947, 13079249, 5735929, 1763621, 1250909, 3551938, +-3789235, 6764574, -1764695, -12652437, 1503239, -1224603, 7657927, 9232569, 3877282, -3734474, +-3580929, -3163780, -506806, 2975876, 216359, 2063732, 1256815, 2156611, 5746130, 2656437, +-4640176, -1844152, 593242, 1752347, 252866, 35970, 131533, -2371359, 2627983, 780073, +501974, 440771, 502511, 397821, 1960116, -662499, 1420024, -1304060, -464930, -2145873, +428423, -730144, -158914, 287226, 929324, -15742666, -1642825, -6752226, -7714298, -2199023, +-5472325, 139050, 4903779, -7465727, 7703024, -16360067, 2406256, -4937602, -8550206, -11741904, +12208981, 5911486, 871342, -10423886, -6637872, 3700651, -13270375, -9481140, 3255048, 2692945, +13648332, -1906966, 1209570, 9904731, -5901822, 9724343, 3463354, 3467112, -1851131, -6099928, +-624381, 8067559, -4365298, 542777, 10394358, -3928285, -2978560, -5157719, -6068789, -5465883, +-3912715, -8504572, -957778, 2338610, -2796024, 1665374, -2672544, -4439386, 5862094, -7619272, +4583267, -6504728, -7922604, 208843, 6619619, 246961, -1923072, 2422362, -5270462, -2868501, +-7406671, -13482976, -6231461, 1701344, -3981435, 14994268, 6088653, -10795937, -5297842, -1770063, +-3778498, 4677220, 10340671, 6564321, -4943508, 4560182, -5871221, 3349001, 572841, 4567698, +-5196911, -1453846, 501437, -2520072, -4430259, -3955128, 729071, -464930, -1005559, 2121714, +932008, 139586, -1446330, 1174674, -260919, -1379758, -3220689, -306016, -1642288, 49392, +1474784, -1308354, -3587908, -660351, -1509144, -6090264, -842887, -1889249, 16748762, 11166915, +11409581, -3229816, -16617765, -1168231, -8597451, 2251637, 3473555, 8986145, -4330401, 4016331, +-6939594, 1287953, -6142877, -15156940, -8428873, 5982353, -5763309, -11984569, -11578158, -10462003, +-16729434, 2188823, -5980205, -12463458, -11518565, 2118493, 15743203, -2000918, -2844879, -5198521, +-9845676, 2121177, -4030827, 1184337, -12236899, 894964, -12738873, 1877438, -1207423, 6869800, +5040144, 5738613, 2700461, -352187, 4476430, -2958159, 8985072, 2700998, 4457639, 2905546, +-3182034, 3386045, 9055939, -1086090, 4978941, -1192927, 14347875, 1990181, 5279052, 828392, +-8325794, -6116034, 108448, -2770791, 1700807, -1992328, 4638028, 4408784, 5420249, -2457795, +3016678, -11031623, 5756867, 16409996, -8032126, -1540820, 4159139, -9270687, -813359, 5983963, +-3854196, -469762, -2119030, 5218386, -5408438, -1136556, 1253057, -2815351, 1253594, -904628, +1990181, -2598455, -2868501, 3119757, -1520418, -2866891, 1942936, -1066763, -97711, -4097399, +3054259, 1184337, -857383, -590558, 1672890, 756988, 1618129, 1399086, 160524, -1699196, +-3334505, -825707, 1726577, -8201777, -23663660, -3953518, -8244727, -12499965, 6735583, -23829552, +-3066607, -8499740, -4590783, 6834367, -7558069, 10027138, 8694624, 1343788, 7841000, 653372, +4151623, -6243809, -10933376, -12094628, -6731288, -11089069, 8621610, 11237782, -475131, -5989869, +3265786, 3205656, -4147328, 781684, -18813030, -10001905, 8757438, -4848481, 258235, 8536784, +-812823, 5260261, 4547834, -2503429, 5202816, -115964, -10032507, 11113228, -7853348, 481036, +614717, -6221260, 4102231, 6600291, -3930969, 7548405, 852551, -654983, -6959458, 8533563, +-52076, -7027640, -2310693, -14015552, -5856188, -8031052, -1012002, 9526774, 2765422, -980326, +155693, -9097278, 2026688, 6874632, -9112310, 452582, 13942538, -5813238, 1364189, 984084, +-9919764, -6038724, 6340446, 5239860, -16138876, 3175055, 12061342, -136902, 1435593, -6442, +2903935, -1000191, 7611756, -1824824, -321049, 893890, 1458141, -3537443, 871342, 2599529, +822486, 4441533, 1658394, -183073, -1668058, -3653407, -1035624, 1605244, -2213519, 1511829, +-2269890, -156766, 3131031, 1591822, -2216740, -3093450, 150861, 6442, 6669011, -2789581, +540629, 3555696, 1471026, 3506841, 42270532, 9308268, -5456756, -8546985, -751619, -2759517, +7545184, -1750199, 6386080, 11881490, -4765803, 517544, -7860327, -5507759, 2601677, -1393180, +6204081, -11916387, -6880538, 5495948, 11905112, 7737921, -320512, 2719251, -2859911, -7213935, +5193153, 9175661, 9759776, 11635603, -9673340, -2393371, -5533529, -12140262, -1486059, 532039, +-2604898, 5442798, 7339562, -112206, 3638374, -2258079, -12770012, -7063611, -17090748, -17469780, +-5042829, 5722507, -2514167, -7792682, 14586246, 5408975, -569620, -13754096, -601832, -4305168, +-9744744, 23085, -4448513, -6426345, -13504451, -1833414, -4977867, -14968498, 13422, 11276437, +-7627862, -3724811, 4216048, -6495065, 2558190, -6436546, 9277666, -3064459, -8941048, -13997835, +-22817014, 4413616, 3869229, 17353278, 7033546, 5950141, -74625, 5206037, -4097936, 5523328, +-510027, 1890859, 2801393, 6569153, 3054796, 183610, -1211718, -415001, 2643552, 1563905, +6922414, 5345624, 3636227, 1100049, -1403917, -3736622, 2000381, 4407174, 404801, 207769, +-838592, -3312494, -554588, -556735, -1548336, -1227824, -2494839, 2006824, 3055332, -2934000, +-2909840, -235686, -379031, 1527935, 9427453, -33365454, -19110994, 17790292, -4665408, 1208496, +-9241696, 7803419, -3224447, -12825846, 6146635, 17991082, 2250026, -15598784, 4376572, -3334505, +-3630321, 10396505, 10655814, -1359894, -2216740, 22643604, 5003637, -3156801, -13900125, 6228777, +-19918448, -16273631, -15113990, 6212134, -2882460, -1522566, 12933220, 5266704, -13190918, -10903311, +2840584, 12902619, 4361540, -1358820, 707596, 8639327, -6185827, -13798119, 18128520, -5223754, +1868848, 7436199, 1118839, 2626373, 18648212, 438624, 11876121, 652835, -12512850, 1928440, +2663954, -2472291, 2378338, 8613557, -6328098, -1796907, 2167348, -24592982, 6554120, 5179731, +-144955, 6058588, 4620848, -9042517, 4347581, 34076808, 14593762, 8518531, 2463164, 8377871, +-26096758, -12237436, 13212930, 664109, -114890, -9877351, 8834211, 10823318, 8955544, 1632088, +1886028, -3440806, 155156, -6065568, -2243047, 5048197, -1091459, -2983929, 2564096, 348966, +2462090, -3470871, -1517197, 1366873, -641561, 2627446, -4312147, -1343788, 3104188, -3302293, +2514703, 1060857, 341987, 251792, 50466, -2644089, 1421097, 2744484, -1277216, -1144072, +-2980707, 1475858, -162672, -22269942, 15607374, 16975858, 5301601, 9422621, -6357089, 27016954, +-3290482, 10385768, 6886443, -12272869, -5214091, -5595269, 15497316, -9163850, -3017215, 9968082, +8153996, -9006010, -2600066, -26275000, 4814659, -2803540, -7872675, 2408403, 593779, 2071785, +2306934, 9060234, 244813, 9912248, 1044751, 4893042, -2650532, -8386461, -9190693, 17177722, +-6198175, -12235288, -10520522, -4596689, -5843303, 7518341, 4469451, 5816460, 7421704, 2377801, +-9472550, 5473399, -15370614, -4876399, -13447006, 9280351, -16205448, -11429445, -3538516, -5304285, +4677757, 10929081, -8722542, 10323491, 16686485, 8458401, 16069620, -6684043, 21614422, 2099165, +18292266, 10555419, 2164664, -9711995, -24832428, -16577500, -13699872, -7596187, -7736847, -2309082, +-11633993, 8783208, 14315126, -5444408, -11207717, -9987946, -8126078, -14916958, 9334038, 6961605, +-4128537, -3759707, -5972152, 886911, -3442953, 8216810, -114354, 2193118, -4456029, -3590593, +-6226629, -1005022, -7431904, -6887517, 7040525, -389231, 738198, 295816, 2492692, -2747169, +-411243, -4186519, 3758, 142808, -329102, 2333241, 93416, -3405372, -2455648, -2411087, +565862, -3668439, -4264366, -5088463, 1265405, -1293322, 12483859, 6360847, -7101729, 21014202, +2376191, -20516522, 25617332, 1713692, -10912438, 9037148, -21041582, -4032438, -13397614, -4188667, +-2374580, -4117263, -9578851, 2675765, -18182208, -7039452, -6558952, -24539832, 2975876, -17800492, +-12650289, -19969988, 4000225, -15071577, -4551055, -5003100, 157840, 7577396, -6126234, 10671920, +547071, 14164802, -3308736, 12317429, 15537044, -18673444, -285615, 4984310, 11404212, 424665, +13713294, 4572530, 13222057, -301185, -10114648, -6380174, -979253, 8535174, -1978369, -3965329, +-867047, 15825881, 10001905, -3800509, -13075491, 4348118, 7170448, 5070746, 14050449, -18864570, +-13938243, -4016331, 1318555, -5340255, 142271, -5446019, -11782169, 32991792, -16325708, -18979998, +14126684, 8095477, 12271795, 3719979, 4506495, 2491081, 7171522, -6838125, 18967650, -3373160, +4646618, -3725347, 2532420, 1079647, -1047435, 12036646, 1508070, 995359, -11934104, 5334887, +1777580, -1819456, -9720048, -1066226, -2015413, 182536, -3099356, 8638790, 2010045, 2356863, +-7025493, 4712653, -3341485, 891743, 4198331, -261993, -2080375, -2344515, -6250251, 3540127, +6382322, -3134789, -709207, -2354716, 947577, -3727495, -8409009, -2648384, -284005, -5867999, +5970542, -629213, -811749, 1903744, -5651640, -6518150, -1808718, 2513093, -4290673, -5714454, +16763257, 12151536, 19800336, -6670084, -4769025, -27159762, 31510028, 14279156, -41722388, -22502944, +13506598, 18501108, 18832894, -12148852, -9664213, 22543746, 5476084, 5081483, 15811385, 12579422, +-23029614, 6965900, 9843528, -1853815, 11010686, 1975685, -2877628, 2137820, -7437810, 38487200, +10201084, 4903779, -971736, -4902169, -2507724, -22029424, 4286378, 6308233, -5071820, -7310035, +-35372276, -17069810, 7503845, 6051072, -11556146, -11513734, -1527935, -17012902, 7059853, 6133214, +-2381559, 6916508, 14053670, 566936, -656056, -4614406, -7402376, -2579128, 1322850, -26271242, +-3412889, 6000606, 15999290, -28423556, 6346888, 9998147, -2163053, -13457206, -11960947, 21215528, +21169894, -3230889, -13121662, -25151328, 5322538, 9884867, 5305895, 270583, -27210766, 11355894, +24870008, -8549132, 2854006, 7648800, -10160819, -16438987, -8565775, 2335389, -5008469, -1444720, +-7635915, -6768869, -5567888, -2529736, -2169495, 3164317, -559420, -650688, -6962142, 2731599, +-3254512, 1349694, 83215, 2107755, 4269198, 4787815, -7788923, 2984466, -6015639, -10322417, +-5319854, 1303523, -1009854, 4286914, -969589, 2737505, 6017786, 145492, -265214, -5426691, +-2931852, 7794829, 4041564, -3481608, -2027225, -927713, -5054640, 12414066, -9137543, 3364570, +-7613367, -6766184, 1189169, 8399345, 16850768, -31044024, -40450000, -28159416, -36188856, 31392990, +-20959440, 12615930, -3539590, -25469156, 4552129, -6942815, -9450002, -33057290, -30247844, -22629108, +-8625368, 1134945, -17508972, -5113696, 4611721, 14172855, 1112933, -8891656, 18254, -9506373, +13622563, -17210470, 23696946, 20388210, -4915053, -6556268, -28156194, -16458315, -17136920, 2004139, +3747896, -4640176, 22950694, 6492380, 18595060, 3614752, -2237678, -8514236, 16720308, 11515881, +5215701, -16899086, 8968965, -28535762, -3229279, -3088082, -18954228, -3177202, 179852, 21705690, +14370424, 346819, 10011569, -469225, -21527986, 10865730, 2972117, 17834852, -10205916, -20729660, +12252468, -37194952, -8589398, 13062606, -5650567, -5987722, 9013526, -2498597, -7402913, 6795712, +-3182571, -23901494, -21035140, -3548180, 9710921, 15762530, 22198538, 22247930, -9567040, -7679402, +4294968, 8009577, 7198365, 2963528, -10032507, 8636642, 55298, -1935420, 1013075, 5321465, +8941585, -2735894, 1409823, 8475044, -2108829, -260382, -8769786, 4228932, -2014340, -688269, +6992744, -1484448, -3322157, 3111167, -9969156, -3723200, 9846749, 2775623, 3090766, -3619047, +-2485176, -1561758, -7996156, -1117228, -4531728, 5864241, -17204566, 203474, 12631499, -40703404, +-3524021, -26000658, 1832340, -19209778, 17517560, -13785234, -1189169, 3167539, 6699612, 20590610, +7236483, -9647570, 22739168, 6786049, -38009924, 6104759, -22702124, -1828046, 4632659, -3396246, +19152870, -5784784, 3697967, 4602058, 1930588, -12448426, 19441706, -11272142, -784368, -22593676, +253403, 3641059, -3273839, -8048769, -10014253, -11872363, 29344290, 1012539, 15329275, -26034482, +3199751, -469762, 9166534, 15309411, -17522392, 31481036, 45806364, -2214593, 4672388, -16026134, +7564511, 10467372, -8517457, 2142652, 8848706, 17545478, -302795, 920197, -5206574, -15489263, +-22818088, 11648488, -17045652, -7430294, -11072426, 4903242, 15819438, 13838921, -2493229, 5133023, +-31068720, 20604032, -3591130, 4407174, -8937827, 20134270, -27858232, 33455110, 24676198, 27859842, +-11034845, -760746, -27302570, -15035607, -9994389, 8971650, 7914014, -22905598, -16486232, 551903, +-5570573, -16731045, 179315, -11604465, -13449690, -5199058, -1826435, 976568, -8819715, 1542430, +3267396, 13753022, 12589086, -1992865, 11878806, -5810017, -14357002, -8124468, -2916283, -7404524, +-919660, -5515275, 8442832, 2443837, 32020592, 4162360, -10769630, -3805341, 3039226, -16668768, +-10202695, 3929358, 845572, -4335233, 1836635, -8053, -17992154, -1918240, 12324946, -8970576, +12924630, 51155208, 14185740, 37294276, 11464341, -38196756, 15151034, 11038603, -13156559, 2942053, +24559696, 1422708, 23493472, 21415244, -25062208, 13935021, -25072408, -16407849, -2670396, 50070728, +14973330, -22153442, 20886962, 13966160, -27711666, -11782169, -2194192, 28156194, 3794604, -25177636, +-14652818, -493384, -7297687, 15766288, 21990232, -7763691, 19303730, -12335683, -17420388, -286152, +40104256, 4065187, -23523536, 13509283, -1403917, -2002529, 11001559, -26036092, -23075786, -21307870, +15529528, -13847511, 4799089, 7052337, 23855858, 12267500, 24533926, 2960843, -1381369, 20574504, +36887328, 22422414, -37096168, 1081258, 3271691, -5913096, 6793565, 10526428, -28715614, -3962107, +5325760, 5244155, -34142844, -31752156, -18285286, -19165754, 33302102, 12753369, 1260573, 15148887, +-27712740, 11641509, 7295539, 5337034, -2720325, -5950677, 22920092, 14276471, -9581535, 4292283, +-7297687, 15477452, -4663798, 1386738, 2891587, 2569464, 11005854, -1467805, -18637474, -450435, +3151969, 5135171, 9150428, -2238752, 557272, 7385733, -14510547, -8108899, -1607392, -25556130, +-4255239, 7493108, -2201171, 3125126, 14525579, -1794223, -10613938, 2530273, 3304977, 9945534, +11198053, -10752451, -7124277, -411780, -9701257, -5804649, -18331458, -21149492, 5673652, 674847, +-9971303, -7773891, -10172093, -19220516, 14369887, -38513508, 27851252, 31336082, 8556112, 34117608, +-34939024, -16935056, -9517111, -49957448, 28131498, 2942590, 17387102, 23087596, 22385370, 1855426, +-775778, 22958748, -3680250, -26988500, -28215250, 17171816, -31868120, 31176094, -8965744, 6941741, +30701500, 27875412, -14009110, 42377904, -24532854, 2880313, -25504590, 4264366, -8743480, 16779900, +5611912, -17908404, 16167868, 24788404, 36149664, -20759188, 7710003, 22376780, -30547418, 1575179, +-12290586, -43963824, -19010598, 11956652, -24260122, 8811662, -20366734, -310311, 29706142, -13919452, +12578885, 34432752, 24447490, 9356049, 45526116, -70727912, -13370233, 23879482, -2734821, 14003741, +-21963390, -38120520, 46563888, -456877, -23451058, 10265509, 29473140, 73338712, 27699854, -55071680, +-30172682, 19071266, 20464446, 9103720, -38606924, -3127273, 8488466, -11691438, 26100516, 9581535, +16670379, 20072530, 14891725, -9882183, 11506217, -30419106, 4442607, 16662326, -1948305, -16008954, +9535364, -9664750, 16298327, 18267570, -7673496, -14698452, -4012573, 33495376, -5920076, -3607773, +-12990665, 15308337, -12899397, -7675107, 9621800, -5904507, 31309774, -2090039, -7729868, 31768262, +-2794413, 7653095, 19289772, -1160178, -1628866, 2155537, 2879776, -14490146, 6743636, 1127966, +-21453898, 14914811, -6645925, 28001040, -15062987, 8657043, 2605435, 37443524, -32885490, -2972117, +-15693810, -19490562, 30054034, -11652783, 39454108, -3876208, -30338576, 47305844, 68390376, -9703405, +-21748640, -32952600, 7925289, 36361192, 7224135, -7580618, -22552874, 5454609, 5443871, -4931160, +5699959, -3141232, -11020886, -11259794, 10573673, 15021111, -1029718, 20274394, -19321448, 41473816, +31286152, 18085570, -1373853, 2585570, 6027450, -21751324, -19012210, -21072720, -11003706, -5662915, +13404056, 11796665, 22602266, -10672994, -2510945, -9431748, 25703232, 50020800, -11589969, -31872952, +-20458002, -1110786, -43212204, 33949568, -58757300, 17219060, 25186762, 25882546, -25489020, 6221260, +26230976, -59463284, -28002650, 12492449, -6091874, -29669098, -26176752, -3168075, -13600014, 44654776, +19284940, -15992848, -14715095, -24372866, 68266360, 14901926, 35793720, -2259153, 10647224, 13156559, +15526844, -21938692, -2566243, 28562070, 19757924, 11973832, -9037148, -11788611, 303869, 9146133, +13334800, 9183714, -17234630, 2857764, 502511, 4905390, 12968117, 13045963, -18042084, 8929774, +-10986526, -13511430, 1802276, 14756971, 6191196, -8267275, 2333778, -852014, -2262374, -7000797, +27529130, -7645042, 452582, -15857019, 4201552, -5615670, 18300856, 6193880, -3434900, -9167608, +10593537, 8862665, -12081206, 1285269, -19918984, -7588671, 5256503, 8810589, 11940546, 315680, +12495134, -2455648, 2433636, 6405407, -25191594, 7248294, 39902392, 820339, -12960064, 32602560, +24004572, -7215545, -20787642, -32471026, 6532109, 62753768, 14273250, 31999654, -2442226, 2465311, +-2155537, -7779260, 396211, 2542621, 15684147, 4701379, -11870216, 10159208, -10342281, -12150462, +-12968117, -5906, 13051332, 2413772, 10509785, 10537165, 9159555, -9202504, -15287936, 4646081, +-10481868, -27456116, -7672422, 5847061, -9105331, 31404800, -32369022, 26338350, -8094403, -97174, +39766028, -6475200, -736050, 51197620, -7569343, -21237540, 4118337, -18234284, -3746822, -17227114, +57671212, -16491064, 14154065, -14044543, -5862094, -8121783, 9836549, -14688788, -34846680, 15266998, +-3730716, -39242580, 20704964, -10459856, 22005264, 48744656, -24249386, -756451, -2226941, -7469485, +-26117696, -4821101, 24470576, 9499394, 15125264, -22426708, 6881612, 3762928, -21201570, -6024229, +5068062, 10886668, 14068702, 980326, 2914672, 8851928, -1873143, -10829223, 15824270, -6269042, +-4439386, 14023068, 2185065, -4020626, 21348672, -1519882, -1333051, 72478, 7146289, -6425808, +10901701, -8304856, -3856881, -6574521, 5793911, -251792, -520765, 2990908, 10037339, -11698417, +2774012, -1618129, 7270306, 2044404, -1997160, 11974369, -7075959, 6451041, -1828582, 3531537, +1071594, 8979166, -1068910, -13750338, -186294, 65972308, 33182918, 69208568, -38788924, -9780177, +22610318, -21328808, 16328392, 71198208, 16683264, 10512469, -18850074, -17389786, 20213726, -10492605, +28637232, -4458176, -6665253, -8075613, -40876276, 10092636, 48962628, -25632364, 29582660, 26149908, +-16674137, -4718559, 20343112, -32304060, 16201154, -2017024, 24526410, 8621073, -20441896, -6269579, +-41064720, -20732880, 19182398, 14774687, 31829466, 50044960, 5268315, 1103807, -43105904, -25997438, +-25753698, -20858508, 11243151, -17246442, -5058398, -3707631, 12868796, -32565516, -5339181, 17369922, +8768176, 27461484, -3653944, -12649752, 26960584, -4544076, 16520055, -20430622, -12556874, -2865817, +-6952479, 13585518, 19620484, 28103582, 7830263, 2644626, -19170050, -5034776, -9840307, 23600308, +254477, 35189740, 6053220, 26598732, -25512642, -8776766, -177704, -252866, 18997714, -2646774, +-9438191, -4760971, 4672925, 1695975, 4948339, 9164386, 7864085, -4440460, -5669357, 748398, +-3345780, 7794829, 7926362, 2245731, -6602439, 682900, -8660265, -3241090, -1881733, 15369004, +5386963, -1552094, 3923453, -9613747, -11806865, -7598334, 3777961, 8626442, -7018514, -284542, +157303, 6542846, 3442416, -518080, 6568616, 1445793, -293668, -6021544, 3139621, 2318209, +-2585034, 1101122, 2016487, -8922258, -17722646, -67881960, 2110977, 108304040, 98347768, 91809760, +39410620, -39497056, -53908284, -54155780, -47757888, -88673360, -62717796, -61828200, 47894256, 72704672, +59939488, 94730336, 79441328, 16435766, -3339337, -34368328, -65949760, -39905080, -69315944, -38170984, +-22984518, 34897, -8981850, 17134772, 30221538, 50466404, 32288490, 53041772, 40955196, 42075112, +3617436, -35254164, -15589658, 882616, -37835976, -50724636, -65216932, -64749316, -45383308, -6761889, +32287416, 12309376, 46832860, 32585916, 53370336, 46923056, 51760260, 59367724, 32424856, -4908611, +-9334038, -39297340, -31593242, -105557408, -83882320, -67791224, -52431352, 5820755, -22719304, 1173600, +72179608, 88445728, 121742992, 76478336, 46470472, 31098248, 7633768, -46848968, -42348376, -65186868, +-83562880, -71349608, -65961032, -31414464, 5057861, 33250564, 55479704, 54183696, 46675020, 28934658, +31419834, 13048648, 8674760, -1823214, -25482578, -22770842, -20219096, -23164906, -11874511, -25852482, +-17977660, 5998996, 2468533, -15163382, 8352101, 20716774, 12235288, 23682450, 37696392, 38603168, +17457432, -24376624, -10121627, -3684545, -48795124, -52086144, -44863616, -19155554, 14295262, 21858700, +18776524, 30779346, 35443144, 43070468, 29066728, 17439178, -6361384, -29384556, -29272886, -33239826, +-44056700, -31784906, -17182016, 14857366, 24358908, 15302432, 9760313, 27823872, 19276350, 11260331, +2960306, -4459787, -8688182, 659814, -10488847, -13080860, -4423817, 4080756, -7173669, -5834176, +1503239, 5574868, 1040456, -3068754, -3556233, 4147328, 283468, -2434710, -4254165, 1362042, +6297496, 7384660, 1348083, 6340983, 6000070, 3050501, -1664837, -1547262, -5073967, -4910758, +-7512435, -4217658, -4878546, -1313186, 649077, 1353452, -466004, 2975876, 3819300, 5734855, +-1509144, -677531, 1962800, 2957622, -2404645, -217433, -770947, 363998, 1316944, 4271345, +-274878, 1339493, 771484, 955093, -2640868, -3868155, -6614250, -4076461, -5286568, -3925063, +-4258460, 1277216, 3405372, 6363531, 6594923, 10074920, 7926362, 7090454, 2738579, 459025, +-4954245, -6372121, -9303436, -8071854, -8845485, -5111548, -3101503, 838592, 1890323, 6354941, +5394479, 6966437, 5550709, 5234492, 962610, 907312, -1959042, -1920387, -4365298, -2586644, +-3185255, -829466, -1946157, 120259, -849867, 1138166, -242666, 1372242, -259846, 1190243, +-397284, 1078574, -589484, 840740, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 1065689, --1229434, 4410932, 5027796, 2650532, -1900523, -7579544, -6891275, 2477123, 4005594, -1500017, -7452305, -1469953, 4458713, -5304822, -4618164, 1994476, 215285, -1401770, 1992865, 4778688, --2063195, 634581, -2719251, -308164, 287763, 1938641, 1867237, 2437931, 441308, 1438277, -5528160, -2154463, -2540473, -2809446, -4947803, 1399623, -1015223, 9075266, 1802813, -718870, -749472, 5493263, -477815, -1237488, -1376537, -3273839, -561567, 4216584, -620086, 1729798, -4330401, -1381369, -275415, -6943889, -4028679, -6335077, -1199370, -1862942, 964757, 311922, -942745, 2216203, -1476932, 1054415, 104690, 525060, 995359, -2332167, 2210835, -776852, --2585034, -364535, -2607045, -836982, 282394, -4150012, 1126892, 155156, 3210488, 301721, --19327, -1923609, 461172, 3132642, 1583769, -819265, 388695, 672699, 806917, 2382633, -325881, 119722, -545998, -394063, 280247, 64961, -209917, 1563368, 906775, 916439, -711891, 467078, 243203, 451508, 893890, 5130876, 12100533, 4779762, 2863133, 3364033, --7110855, -833761, 3068754, -961536, 1200443, -6485938, 6378564, 8642011, 1490354, 3861713, --1819456, -5059472, -7841000, -8583492, -5708012, 6807523, -6423661, -4079682, -5436355, 1745904, -4521527, 856846, 613107, 2530273, -256087, 1599875, 5572183, -779537, 4632659, -4409321, -4226785, 2944200, 2687576, -2321430, -7206419, -1530619, 4126390, 2447058, -2014340, -237834, -1427540, -301185, -3477313, -725313, 2948495, -1007707, 326954, -1713692, -381178, 218506, -985158, 5093831, 2128156, -2603824, 439697, 425739, -1728724, 933082, -2517388, -289910, -4128001, 1348620, 4631586, -3303904, -2840584, -1693828, -732829, 2363306, 5250598, -3023657, --3799972, 4525822, -425202, -81604, 156229, 1565516, 1116692, 3804804, -1069984, 1777043, --2317135, -2163053, 170188, 1033477, -160524, 83752, 872415, 957241, 740882, -1972464, -2214056, -467615, 3553012, 1503239, -3976066, -3757560, -4261145, -670552, -3477313, -7337415, --6982006, 7212861, -151934, 1518808, -47782, 4393752, -6493454, 9657771, 8582955, 444529, -463856, 13422, 261456, -953483, 3365107, 2613488, 219043, -5496485, 2389076, -1705102, -2649995, -765578, 5864241, -1364189, -3402151, -1544041, -912681, 2171106, -30065, 3622268, --5808407, 3136400, 1021129, -3227131, 9158481, -1453310, -1303523, -191663, -136365, -2412161, --772557, 4885526, 4005594, -8577050, -4039417, 4361540, 1262720, -2050847, 7470022, 273804, -1679869, 7348689, 3041374, 5769752, 1636919, -2214593, -2989297, -5771363, -5586142, 813896, -2983392, 7151658, 279173, -2914672, -3642132, 1245541, -60130, -1996623, 2327336, -805306, --1828582, 1674500, 3882114, 1257352, -1937030, 1944010, 2025077, 2532420, 1630477, 129923, -248034, -2399813, -498753, -31675, 1236951, 1038845, 1980517, 1910724, 1592359, 603980, --149787, -9793599, -3407520, -4766877, 4450660, -3257196, 2892661, -3521336, -1449552, 8297877, -4063039, -5514738, 2518998, 7914551, 1166084, -2779918, -5555004, -6684043, -4574140, -6720550, -4465156, 1010391, 2460480, -1293859, -3033858, -3211562, -5910412, 303332, -176631, 1401233, --1435593, -5385889, 95026, 5743445, -1265942, 61740, -2856153, -5735929, -8472897, -734976, -6120866, 2216740, 652298, -2880849, 791885, -4606890, -1497333, -3467112, 450972, 777389, --5229660, 5910949, -3320010, 7522099, 2858838, 710280, -3408594, -1800128, 1946694, -436476, -1843078, 4036196, 834297, 1597728, -4459787, 2636036, -2234457, 6914898, 8584566, 3926674, -5774584, 2676838, -863825, -6016713, -3866544, 491237, 4446365, 4460861, -3555696, 463856, -4227322, -5510980, 5455146, 344134, -2771328, 1787780, -1152125, -267899, -3083250, 604517, -899259, 530965, -2469069, 654983, -1738388, -2340220, -794032, 161061, 1053341, -1528472, -399432, -665183, -2142115, 227633, 1808718, 744103, -1525787, 999117, -1141388, 3279745, --7905424, 1040456, -8454106, -35433, 1292248, 787053, 3808562, 382252, 601295, 14948634, --1878511, -6604586, -7125351, 7506529, 5026186, -5668283, 1364726, -6322192, -2713346, 206695, -7144678, -8870718, 2578591, -352187, 1406602, -683437, 9070971, -4702453, 2552284, -1428614, --2411624, 1371168, -444529, 2712272, -2787434, -2589329, -7691213, 1194001, -2561411, -1664837, -598074, -2732136, 2254858, -4345970, -2590402, -7638063, -241592, -6783364, -2869575, -8065949, -5970542, 1200443, -2481954, 5244692, -6114423, -46171, -11639361, -641561, 4006668, -333397, -3433290, 7381975, -2610266, -1058173, 9244380, 3889630, 3561065, 5635534, -2938831, -8574365, --920734, -5141076, 3725884, 8506183, -1547799, 2482491, 4524211, 3799972, -466541, -734976, -1043140, 144955, -1589138, 2277943, 2045478, -3568044, 1168768, 2980171, -1518808, -1100049, --5284958, -1241246, -2230699, -746787, -2313914, 446677, -570157, 396211, -249108, 342524, -1349694, -1569811, 539555, -654446, -1595580, -229244, -280784, -497142, 106837, 887985, -1484985, -1488743, 506269, -1262720, 210453, -161061, -1666447, -673236, -1275068, -252866, --2020245, 475668, 98784, -1154273, 4301410, 4698694, 1806034, -2951716, 2145336, 1178432, -9172440, -1453310, -1875827, -12335146, -3389266, 9158481, 9084930, 5728413, 4643397, 13066364, -889058, -15743739, -3942780, -2675765, -3720516, 8297877, -1247688, -3102577, 9824201, 1461900, --3940633, -1455457, 3969624, -3520263, -1287953, 1129576, -1166621, -5522254, -2398202, -316217, --5199595, -2478196, -2137283, 3626563, -2398202, 7041599, 6983080, 613107, 6646462, 4548907, --2883534, -1066763, -2168422, -10247792, 1229434, 2049773, -9611600, -1446330, -2663954, 3418794, -8944269, 1296543, -8898635, 1268626, -3376918, -6105296, 4990215, -1466195, -6347425, 2870649, -2566243, 7066295, -478352, -926102, 5330592, 6153078, 6906308, -7039452, 5032628, -933619, --1095754, 1801202, 7450158, -365609, -1870458, 2294050, 1215476, -6271189, -728534, 8537858, -1985886, -577673, -978716, -3893388, 2857227, -1443646, -1661079, 271120, -155693, 1964948, --31675, -2674691, -1808181, 3557307, -343061, 1399086, -1509681, 1720134, -1228361, -997506, --1213328, 898185, 2007897, -935766, 6285685, -16067473, 6701760, -1772748, -3632469, -3316789, -2780991, -1543504, -9484362, -10152229, 1268089, 15788837, 4387846, -11516418, 2627983, 9363566, --6713571, 1202591, -1669669, 5578626, -1074, 5148055, 13863081, 10057203, 6323803, -246424, --1104880, -6402186, -6808597, 2715493, -17874044, -2841658, 8532489, 942208, -864362, -8587250, --3016678, -372052, -346282, -4175245, -8827232, 9935870, -3391414, -2183991, -1557999, -8222178, --9198209, -293668, -4464619, 639950, 4447439, 3367791, 3771518, -7337415, -1858110, -3604551, --2245194, 11800960, -1196148, -5386426, 428423, 15134928, -8024073, 2546379, 11189464, 350577, --2507187, -5610838, 3441343, 648003, 8074539, -4309463, 6841346, 5516886, 10561861, 5094368, -7924752, 842887, -5099737, 1117765, -157303, -2962454, 4811974, 6784438, -5561983, 3709778, -2083059, -5037997, 720481, 1809255, 1474248, 1852205, -2828236, 1655710, -3104725, -936303, --815507, 241055, 652298, 1381369, 1791001, -336618, 2654290, -170725, -1095217, 921807, -1788317, -560493, 1110786, -2677375, 1137630, -853625, 1772748, -1963874, 9264244, 13196287, -8126615, 1307818, -2802466, -4997195, -10958072, -3225521, 7289633, -14999636, -6102075, 13581760, --18846854, -3460670, 10586021, 13210246, -1332514, -13356275, 1872069, -5139465, 17830556, 7846905, --12203613, -7920457, -1856500, -7595650, -15366319, -7751342, -6805913, -5622112, -12440910, 6218039, -2234994, 7645042, -4723391, -2354179, -10942503, -1177358, -9492415, 935766, -6303402, 1344862, -3346317, -14745160, -4803921, -5648956, -3879966, 3107946, 3154654, -4747550, 14498199, -997506, --3768297, -2775623, 1416266, -3459596, -1178432, 5327370, 4607426, 5970542, 7962870, 7479149, -613643, 4883915, -2396055, 11234561, 12099997, -6139656, -3145527, 7353521, -197569, -18391050, -858457, -9371082, 5696737, 5732708, 10378788, -7927436, 4425964, -11098732, -1059246, 6241661, --2681133, 9785009, -2553358, -1264331, 1990717, 581968, 1394791, -716723, 592169, 4124242, --3092913, -857920, 4038343, -684510, 3173444, -4777078, -4085051, 2709051, -647466, 805306, -449361, -625992, 736587, -2882997, -726386, -553514, -1216013, -1969243, -652298, 1433982, -1808181, -151934, -1903744, -10231149, -12224014, -6091338, -11806328, -17017734, 12065100, 1119376, -6784438, -9433896, -9672803, -13507672, -9018358, 4085588, -9892920, -9016210, 12271795, -3115999, -652298, 2887292, 7045894, -5477157, -4028143, 1952063, -3208878, 1846836, -537945, -6077916, --11439645, -18094160, 6043556, -13011603, -11796128, 570157, -3047279, -886374, -6601902, 2970507, -3523484, -14755360, -235149, -3279745, -5668820, -8224863, 4735739, 945430, 14783277, 1704565, --8156680, -559420, 1455457, 6015102, 2628520, 12985834, -1027034, -14223858, 6162205, -3051574, -6498823, -8520678, 1944010, 4770635, -24975772, -11949136, 8960912, -808528, -2592550, 3813394, --1175747, 15796890, -455803, 9992241, 8816494, -12868796, -14790794, 833761, -16395501, -411780, --707596, 303332, 2507187, 10312216, -252329, -6524056, 6040872, 7754564, -7150584, 1248762, -2454574, 7802882, -3709778, 250719, -3761855, 2624762, -94489, 1636383, 2725157, 4197257, -4392678, -148713, -3976603, 165356, 3162707, 936303, 766115, -3762928, 539555, -3767760, --417149, 2019708, -467615, 3677029, 2877091, -167504, 920197, 2978560, -2630131, 5260261, -35433, -2314451, 2512556, 8653285, 35062504, -8604430, -23681376, -2064269, -10405095, 25585120, -1889249, 14346265, 7643968, -4416837, -11390790, -5035849, -12405476, -3137474, 17100950, -19131394, -714575, -15605227, 4143570, 1323924, 7532299, 1788317, -7602629, -12648679, -14874009, -2721936, --14596446, -11325829, 1742683, 3389266, 10656351, -10060961, -21122650, -4388383, -7414724, 2531346, --9999221, -6662568, 2901251, -5250061, -8486319, -564251, 780073, -4269735, 20333986, -4194573, --3497177, 5171141, 5207111, -6074695, -2724620, 15142981, 12556337, 8334921, 15824807, 12505871, --126165, 5235029, 8919573, -6752763, -6501507, 1859721, 6378564, 10619844, 4192962, 21554830, -2197950, 14450954, -4268124, -8354249, -5552319, 30588758, 5260261, -3978214, -3869766, -10995116, --10696616, -7583302, -7559143, -8807367, 3323231, 7037841, -7686918, 2394444, 7408282, 3762391, --7119445, 1383516, 7553774, -1964948, 4084514, -3899830, -1301912, 1708323, -1533840, -901943, --2550674, -4982699, -999654, -4519380, 2142652, 3710852, 1677185, -3780645, 4722854, 3176128, --2993592, -3315715, -5317707, -1561221, -1655173, 1277753, -1366873, 2300492, 1491964, 377420, --763967, 18790, -4316979, 1615982, 6535867, -30669824, -11547020, 15553150, -3797825, -15606301, --14873472, -4849555, 16595217, 9032316, -13569949, 7575249, -18018998, -7213398, -2290291, -11621645, --16205448, 13635447, 7274601, -14178761, -5195300, 30988190, 7009924, -13498008, -18942954, 524523, -9948755, 1925756, 1564979, -21304112, -810675, -2214593, -15637439, -8788040, -6422050, -12148315, --6054830, 3824132, 284005, -12834436, -13269301, 1908576, 8004746, 26307, 10794327, 18671834, --13174275, 11664594, 8393977, 3876745, 2261837, 14136348, 4101694, 8810589, 5494874, 7964480, --2840047, -1427540, 15611669, 25038586, 3856881, -5524939, 2786897, -3323768, -9649718, 16021839, --7974681, -13059385, -21296596, -6987912, -24774982, 12494060, -10268193, -3989488, -1706713, -3285650, --9091909, -1228361, 9470940, -10917270, -1275068, 5390184, -3500398, -10640781, 5165235, 1132261, -2737505, -482110, -1597191, -3650722, -736050, -1775969, 5519570, 1777043, 1297080, 1190243, -1586990, 321586, 2647847, 2255932, 4843650, -6994891, -1180042, 840740, 4463545, -1738925, -3660386, -4120484, 1166084, 1308891, -1290638, -2171643, 3845070, -1665374, -686121, 2661806, -388695, 481036, -6238977, -13614509, 11578158, 6879464, -2004676, 7671349, 5765994, 16375637, -12691091, -26703422, -8808441, 29626684, -23325968, -6931541, -14113263, 21106544, 9455907, 9715216, -4149475, 3076807, 8507793, 22396106, 10719165, -9889162, -143881, 726386, -576063, 8858370, -10027675, 1199370, 5957120, 5630702, -5088463, 6933688, 4228396, 13840532, -6593312, -13328894, --11381663, -8920647, 2698313, -1166621, 5349919, 6000606, 6100464, 12193949, -5285494, 2571612, --5327370, -9512816, -3787624, 1010391, -10897406, 14008036, 17016660, -18418968, 6345278, -12757663, -10489384, -2081985, 4118874, -1394791, -10129680, -2479270, 11798275, -9169755, -2754148, 2082522, --18737868, -7181722, 4010963, -14540612, -939524, 23284092, 11646878, -1560684, -5255966, 18582712, -4950487, 13386339, -4133369, -5991480, 19466402, -6571837, 6127845, 2593624, 2829310, -3980898, --2850248, -3556233, -2394444, -6511171, -3954591, -4531728, 729608, 4215511, -1468342, -9145596, --2867965, -1242856, 1114007, -257161, -2203855, 65498, 2665564, 4504347, -3493419, -78383, --9804337, 1706713, -1151588, -1831804, 6750615, -79457, -560493, -3893925, 4162897, 1165547, -6125160, -2015413, -268435, -3999152, -357019, -5777268, 18556406, -1540283, -4289062, -15425912, -691490, 1438277, -4113505, -353798, -7119445, 2682744, -22095460, 20171314, -4054986, -7164006, --13973676, -15825344, -1606318, 19247896, -3464428, 5326297, -11873437, -6886980, -3291019, -11596949, --13953275, 12779675, -7867307, -6442451, 11370926, 11018739, -15549392, 5430450, 5934571, 13498545, -11191074, -4070555, -9822053, -6220187, -15111842, 16682190, 11016591, 5543192, 11943767, -12309913, -8485245, -1778117, 7784092, 8580271, -8012799, -623844, 27199492, 22767084, -17143362, 6905234, -14151917, -10811506, 3416647, -25346750, 7663296, -13703630, 11411728, -7939784, -8702677, -6175626, -30351998, 1758252, -8749922, 2714419, 10259066, 1369558, 6135361, -16285979, -1778653, 27231704, --811212, -10644540, -16549583, 552440, -12226161, 7727183, 7933342, 9548249, -16898548, -17699560, --4643397, 3033321, 5930813, 1901060, 190052, 485868, 6568079, -4300873, -1643899, -1293322, --2755759, 3244311, 2807835, -5368172, -3629247, -8276402, 5209796, -2995203, 2341831, 3716221, -5482526, 4334696, 1960653, 8444979, 652835, -1880659, 4133906, -6150393, 3601867, 2486786, -1831267, 5621576, 6070400, 1180579, -691490, 3585224, 534187, -453119, -6415608, -8501888, --1486596, -573915, -923418, -16651588, -701690, -1897839, -2915209, 5122822, -24552180, -11016054, --13860396, 11731703, -6007586, 17339320, 10186052, 22010634, -11014444, -664646, -17293148, 14754823, -26230440, -7995619, -21180632, 2296734, -4476430, 32670206, -8171712, -12479564, 12180527, 7058242, -4997195, 12460774, 3982509, -40511204, -23622, -2486249, 15748571, 28881508, -27212912, 1323924, -7947837, -12719009, -2792266, -36702108, -8528194, 19106162, -30575872, -17942226, -9494562, -11639898, -11969537, -7104950, -10994579, 16553878, 4796942, 6207302, 16638166, 2118493, -5932961, 12219182, -17467632, -16867948, -12925167, 26492432, 17877802, 6361921, 8179229, 6475200, -11949673, -16755741, --169651, 510027, -3651259, 5654325, -10460930, 7610682, -14430016, 6085432, 33195802, -15226196, --12967043, 18633178, 5140539, -5946382, 11458973, 16417512, 11837467, 14545980, 6915434, -6933688, -5734855, -17269526, 9256728, 4294968, 4828080, -8605504, -2803003, 2183991, -969052, -1461900, --2815351, 6093485, 11155641, -4086662, -11046656, 7249368, 12923557, 7152731, 4999879, -15130096, -9228811, 1343251, 4931160, -2138894, -5432060, -891743, 7758859, 1066763, -1596654, -6323266, --686658, -3537979, -2060511, -2727304, 3374234, 7821136, -4628364, 658204, 4568235, -1477469, --962073, -3706557, 600222, -2358474, -3188476, 7044820, 2369211, 9690520, 8708046, 14256607, --33018634, -60918744, -28118614, -4267050, 20696910, 1467268, 22822920, 21118892, -6441377, 3411815, --5231807, -11605002, -19112604, -11110007, -13819057, -8026757, 21653614, -28272160, -4986457, -23574538, --29272886, -5156645, -29547228, -23753854, 2809982, -6257231, -3497177, 5298916, 25751550, 1737314, --18868866, 996432, -2363306, -5724118, -24480776, -1682017, 28919088, 2595771, -623307, 11669963, -22428320, 15084999, 3808026, -9296994, 7723962, -7832947, -20827370, -38044284, 35921496, -4693863, -29893510, -2663954, 236760, -10939282, -17532594, 31532576, -18174690, -14779519, -1699196, -23241678, --21870510, 17864916, 13035226, 6767258, -2495913, 9006010, -16212965, 6044630, -13200045, -18538690, --20232518, -15815680, -6652905, 15307263, 767725, 5361730, -9488120, 5272073, -12349642, 8603356, -6624987, 6056441, -4187593, -743029, 7571491, -2371359, -9705015, -7384660, -9614284, -1067836, --7167227, -1865626, -2690797, -2790118, 2494839, 853625, -3988951, 1316944, 4639639, -1588601, --3406983, -7634305, -341987, -5347235, -979789, -1132798, -3776887, 8240969, -8338142, -7863548, --3859028, 4210142, -7425462, -7512972, 714038, -6344741, -359167, -1427003, 3033858, -1148367, -803159, -5211943, 1625108, -10408853, -5389110, -1904281, -21522082, 4497368, -5136781, -15904264, --23083838, -656056, -22068078, -26506390, -4021700, -12342662, -28266254, -40101036, 4875862, -15446313, -7691213, -3300146, 15244986, 32977296, 2051921, 3011309, -16601122, -18600430, 15460272, 7985955, --11936788, -394600, 10193568, -23071490, -17059074, -1686848, 29009282, -25132538, 643171, 119722, -13515188, -21543020, 22259742, 11051488, 6517613, -1055488, -8857296, -24937654, 33286, -6340983, -9118216, -13763223, -32176822, 26239028, -19287088, -9217000, -1107565, 25657598, -19649476, 8668855, --16102369, 9615895, -5684389, -24579560, 11740293, -31179852, -6543383, -9325448, 10927471, 24599962, --14330158, 8769786, 25667798, -20928838, 3562139, 5608691, 6172942, 6978248, -36967856, -11674258, --6114423, 12818330, 2977486, -619012, 6944962, -7095286, 14979235, -3271691, 3519726, -14858976, -12509092, 2601140, -22774064, -11028939, 10901164, 12912282, -1803349, -4021163, -8859981, 12053289, -1684164, -386547, -23740968, 3288871, -11390790, -18636400, -5397700, -4240207, -2275259, -11222213, --13629005, 4296041, -3121368, -7344931, 3946001, -2000381, -1955821, 166967, -3668976, 664646, -7350837, -14533096, 1367410, 1967095, -4624606, 9358734, 9263708, 9949292, 4187056, 5735392, --6778532, 2104534, 240518, 2359011, -3162707, -556735, -342524, 3736085, -2858301, -6923488, -5850819, 43455404, 4551055, 18290656, 50070728, -23477902, -13014288, -19696184, -7191386, 22890566, -1617592, 28220082, 7726110, -1172526, -10484552, 21282100, -13258564, 4718559, -8829379, 8688182, --14055817, 16169478, -7859254, -3984656, -9242233, 12386686, 8697846, -14011257, -3203509, 13045426, -4083440, -9066139, 971200, -11609833, -37448356, 16082505, -19637664, -29064044, 17920752, 7700877, -19374060, -2024003, -18717468, -7246147, -4958003, 10984379, 15048492, 16424492, 27850716, 27174794, --12089259, 3546569, -28939490, 57445, -21055004, -37981468, -3649112, -31013958, 10045392, -24821152, --16115791, -16525960, -22986664, 2027225, -5404143, 1681480, -6801081, -3173444, -1953673, -40176196, -6433324, 5796059, 9163850, 18886044, -3561602, -32007170, 18435610, -20830592, 11936251, 11430519, -25977572, -14354318, -12825309, -8812736, -4967130, -18714246, 7460895, 3962644, 2411624, -4705674, -6606197, -9494025, 9429601, -1830730, 2033130, 2472291, -11282342, -356482, 4560719, 10970420, --2854006, -7082401, 5057324, 7505992, 9774272, -6336688, 190589, 5106179, -530428, -1342714, --3458523, -7468948, 5192616, -437550, 3367254, -4305705, -420370, 6284611, -4226785, -7042136, --3730179, 760746, -2731062, -12145631, 19203336, -5141613, -3779571, 1353452, 3797288, -3485903, -3655554, 4274030, -1717987, -651224, -2441152, -4014184, 31324808, 58100708, -31830540, -26038240, --45010184, -92026120, -22582402, -9822590, 20653424, 12198781, -7822746, -17932562, 25207700, 30448634, -2767570, -1702955, 280784, -24450712, -14184129, -17410724, -13098040, -25858924, -255551, -6710887, --3007551, 17340394, -23983098, 19042274, 18174154, -5896990, 9391483, -1311576, -42754788, -30771294, --16962436, -15861314, -7122667, 3114925, 16564615, 5078799, 8926553, 41076532, 37650756, 8235063, --27896886, -14820322, -1180042, -14654965, -26461294, -66420596, -55541444, -25296284, -5934571, 2424509, -14494978, -46180564, -26417806, 23475218, 27612882, 32822676, -30198452, -36992016, 11951283, -22696754, -54415624, -27768038, -3131568, -16481937, -8740795, 7176354, 16088411, -8373576, -21521008, 19628000, -19360638, -4744865, 22175990, 19367082, -43130600, 38206956, -25023016, -250719, -7388418, -26145614, --7269769, 12667469, 9685151, -2483565, 4992900, -16110959, 310848, 7499013, 10604274, 16411070, --12694313, 2139968, -3679713, -7283191, -17961016, -2627446, -17311940, 14759118, -2893734, -18760954, -2820720, -21433498, -1509681, 2063195, -4983773, -9550934, 498216, 1192390, 2068027, 6345278, --1435056, -833761, 12090333, 3466576, -12500502, -14688788, 3692598, -9939091, -20141250, -7421704, --18968724, 5592048, 5738613, 14154065, 1994476, -15187541, -10915123, 10807211, 54783380, -18240726, -17663590, -747861, -24378772, 3789772, -49221400, -11060615, 10596758, 998580, -28638842, 16996796, -50210852, 35243428, -15504832, -31388158, -13352516, 3573950, 52774412, 7138773, 1369021, 247497, -24429774, 25121264, 6604049, 19219978, 15599858, 29528438, -8341364, 3420405, 18895708, -17129940, --26094074, 14755360, 43347496, 9438191, 21050172, 2071785, 12959527, -57863948, 10810433, -2200634, -13179107, 56854628, 23017266, 7744900, -5532992, 25518012, -5701032, -11866458, 9112310, 15884937, -33548526, -10704669, 20904680, 3854196, 5900212, 13222594, 17056388, -456340, -21985938, -13666586, -5332739, 42908332, 29506426, 22866406, 24852828, 20736638, -5744519, -52968220, -37918120, -72688024, --826244, 22259204, 42084772, 6594386, -30348238, 10165651, -18696530, 6142877, 14688251, 4446902, --8629126, -4843650, 390305, -4034048, 11979201, -7976828, -20906290, 472446, 7306276, 9478456, --13415330, -6146635, -25172804, 6373195, 11365020, -9717364, -8482024, 6424198, -4679904, -6233608, --5188321, -19730542, -3920232, 20461224, 13121125, 18527416, -9611063, -20868172, -15142981, 13616657, -11084237, -4887136, -538482, -1239635, 4204236, -5855114, 12674448, -13930190, -7453379, 991601, -2765422, 8052527, -16781510, 3571265, -12186970, 33643552, -9374303, 7330436, -10465225, 3866008, -338766, 3142306, -1240709, -7994008, -20573968, -9014063, 45056356, -2102387, -20656646, 4842576, --3775813, -17294222, -13547937, 2222109, 23850490, 63986960, 29004988, 56686052, 29939144, 25029996, -24244016, -17215840, -14037564, -16482474, 7260642, 46409804, 15155329, -39294656, 16957604, -42225436, -21122650, -26881664, -5524402, -23631984, -24974698, -1486059, 3359201, -650688, -31275414, 40626096, --8180302, 15091441, -39584028, 10354092, -9102646, -12511240, 20723218, -17141752, 41315436, 4576288, --16103980, 1843615, -12096775, -17145510, 11726871, -28178744, -5851893, 34803192, -7518341, 14090177, --1753957, -25677462, 28002650, -15269682, -57723824, 6955700, 4488241, -479426, 6522445, -8223252, --11128260, -3478387, 26345330, -49971408, 29541858, -11961484, -6768869, 32489816, -19981262, 9390409, -12232067, 47279536, 16702054, 20775294, -3205656, 28167470, -22513682, 22299470, 3869766, -8919036, -6207839, 1140314, 1115081, -12478491, -2997887, 1980517, -5033165, -9389335, 19504520, 119185, --1180579, -5896453, 6647536, -7776039, 17426292, 9807021, 9476845, 1932735, 146566, -1834488, -14641544, -11738146, -14543296, 5493800, 7805030, -900869, 13192529, -5742908, -2325188, 462246, --4125316, -14577119, -14105746, -1546188, 5123359, -7338489, 2808372, 4418448, 5466420, -4065724, --6442, 9257265, -4025458, -13540421, -24250996, 39779452, 36911484, 128837208, 51993264, -70030512, --32937030, -34240552, -53868552, 37693168, 115778360, 46476376, 22010096, -28870234, -7926362, -1789928, --1294933, 55736328, 38149512, 24421720, 83715352, -99963216, 6622840, 52552684, -12574591, 10972031, -54986856, 9834938, -15528991, 29815662, -55083492, -110566952, -10413685, 11131481, -42799884, -4621385, -59557776, 10274636, 3689914, 22839026, -46672336, -95190432, -87005296, -39399884, 29081760, 57043608, -125942936, 31885300, -15817828, -15492484, -33801928, -74854840, -22569516, 55337968, 55642912, 58409944, -56922276, 35897872, 29797946, 8899709, 13211856, -47943648, -29352880, 7558606, 13852880, 25149182, -30700426, 75093744, 19917374, 43878996, -28251222, -27827630, -50319300, -10608569, -38385732, -8828842, -78288128, 100456064, 2567317, -3612604, -61887256, -71380208, -40036612, -16617765, 40329744, 21715892, --3935801, 15300284, -5082557, -9789304, -18341658, -17297444, -1921461, 5022428, 4160750, 22493280, --1113470, 42950, -10758356, 907849, -13500156, -4167192, 559956, -20095616, -8768713, 999117, --5093295, -882079, 12641699, 11317239, 25805238, -10518375, -3981435, -24958054, -20084878, -15082315, -26768384, 17208860, 8853001, 9331890, -7428146, -22049288, -17620640, 1497870, -12192875, 22908818, -33711200, -528281, -7171522, -22667226, -7802345, -92177512, -56281788, 32668058, 86888800, 100357280, -210000816, 127497176, 87159920, 76317808, 60034516, -10698227, -90412816, -99729144, -192505264, -205443312, --194047696, -124608816, -42981884, 42912092, 75094816, 124100936, 122654600, 85487032, 85157928, 108008760, -104366632, 92957048, 59581932, 40830108, 36735928, -3994857, -5866389, -120255864, -85031224, -107628120, --129500240, -54943368, -126447056, -102744744, -186508960, -163917968, -115524960, -77787224, -11062225, 96962648, -118286080, 98985576, 106548472, 97919352, 182476512, 236658064, 212241712, 209745264, 185847536, 178668496, -133554696, 132726304, 29045254, -90016608, -186213136, -178899888, -266694928, -223225024, -324016096, -386887968, --343030432, -326582880, -195870912, -137057776, 25600690, 64553360, 153186448, 226628240, 350367328, 302690496, -437952448, 377502944, 271227712, 265872976, 121760712, 8508867, -23691576, -95106144, -164907952, -198085504, --235736256, -205097040, -184948272, -179319712, -144844016, -150151520, -122494616, -108622408, -32347546, -23364086, -30482994, 69508680, 80850072, 104324216, 149424592, 179727744, 192560032, 200594304, 148203760, 121882048, -119082264, 43663176, 29694868, -67014376, -159148400, -213157072, -217159984, -244045408, -154161408, -176853328, --117088864, -85226112, -22772454, 42069204, 84035328, 126450816, 132184600, 197736000, 204031344, 195104800, -166320992, 148402928, 59906204, 14995878, -36223756, -84079888, -159335776, -188798176, -155959920, -106448616, --93170192, -65768296, -59151900, -31368830, -2874944, 8151848, 6787659, 28993176, 33787432, 51832204, -45134736, 41385768, 39642548, 44386340, 32503238, 30578020, 35675072, 37160592, 22272090, 14761803, -2409477, 1009317, 6252399, -2629057, -19440632, -14954002, -20917028, -26305600, -34731788, -30588220, --25763898, -16822850, -20348482, -15826418, -13462575, -3526168, -7865159, -5773510, -2894271, 6385543, -1772748, 6390375, 10907606, 17753784, 13412646, 17358110, 14151380, 19922206, 16814796, 13439490, -4458176, 6264210, 2451353, 2217277, -5274757, -3982509, -5122822, -1787780, -6752763, -3617436, --6681359, -4328790, -5618354, 1537598, -1545115, -2152852, -6394133, -3369402, -5775121, -3454764, --9378598, -6380174, -5711770, -981400, -3026341, 1549410, 632434, 4584341, 2607045, 7270306, -5428839, 7226283, 3569655, 5640366, 2413772, 5518496, 2407866, 4931696, 1526861, 3433290, --510027, 1289027, -2632278, -290984, -3603478, -694174, -3555696, -360240, -2972117, 301721, --2369748, 894427, -1761474, 1389959, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-1229434, 4410932, 5027796, 2650532, -1900523, -7579544, -6891275, 2477123, 4005594, -1500017, +7452305, -1469953, 4458713, -5304822, -4618164, 1994476, 215285, -1401770, 1992865, 4778688, +-2063195, 634581, -2719251, -308164, 287763, 1938641, 1867237, 2437931, 441308, 1438277, +5528160, -2154463, -2540473, -2809446, -4947803, 1399623, -1015223, 9075266, 1802813, -718870, +749472, 5493263, -477815, -1237488, -1376537, -3273839, -561567, 4216584, -620086, 1729798, +4330401, -1381369, -275415, -6943889, -4028679, -6335077, -1199370, -1862942, 964757, 311922, +942745, 2216203, -1476932, 1054415, 104690, 525060, 995359, -2332167, 2210835, -776852, +-2585034, -364535, -2607045, -836982, 282394, -4150012, 1126892, 155156, 3210488, 301721, +-19327, -1923609, 461172, 3132642, 1583769, -819265, 388695, 672699, 806917, 2382633, +325881, 119722, -545998, -394063, 280247, 64961, -209917, 1563368, 906775, 916439, +711891, 467078, 243203, 451508, 893890, 5130876, 12100533, 4779762, 2863133, 3364033, +-7110855, -833761, 3068754, -961536, 1200443, -6485938, 6378564, 8642011, 1490354, 3861713, +-1819456, -5059472, -7841000, -8583492, -5708012, 6807523, -6423661, -4079682, -5436355, 1745904, +4521527, 856846, 613107, 2530273, -256087, 1599875, 5572183, -779537, 4632659, -4409321, +4226785, 2944200, 2687576, -2321430, -7206419, -1530619, 4126390, 2447058, -2014340, -237834, +1427540, -301185, -3477313, -725313, 2948495, -1007707, 326954, -1713692, -381178, 218506, +985158, 5093831, 2128156, -2603824, 439697, 425739, -1728724, 933082, -2517388, -289910, +4128001, 1348620, 4631586, -3303904, -2840584, -1693828, -732829, 2363306, 5250598, -3023657, +-3799972, 4525822, -425202, -81604, 156229, 1565516, 1116692, 3804804, -1069984, 1777043, +-2317135, -2163053, 170188, 1033477, -160524, 83752, 872415, 957241, 740882, -1972464, +2214056, -467615, 3553012, 1503239, -3976066, -3757560, -4261145, -670552, -3477313, -7337415, +-6982006, 7212861, -151934, 1518808, -47782, 4393752, -6493454, 9657771, 8582955, 444529, +463856, 13422, 261456, -953483, 3365107, 2613488, 219043, -5496485, 2389076, -1705102, +2649995, -765578, 5864241, -1364189, -3402151, -1544041, -912681, 2171106, -30065, 3622268, +-5808407, 3136400, 1021129, -3227131, 9158481, -1453310, -1303523, -191663, -136365, -2412161, +-772557, 4885526, 4005594, -8577050, -4039417, 4361540, 1262720, -2050847, 7470022, 273804, +1679869, 7348689, 3041374, 5769752, 1636919, -2214593, -2989297, -5771363, -5586142, 813896, +2983392, 7151658, 279173, -2914672, -3642132, 1245541, -60130, -1996623, 2327336, -805306, +-1828582, 1674500, 3882114, 1257352, -1937030, 1944010, 2025077, 2532420, 1630477, 129923, +248034, -2399813, -498753, -31675, 1236951, 1038845, 1980517, 1910724, 1592359, 603980, +-149787, -9793599, -3407520, -4766877, 4450660, -3257196, 2892661, -3521336, -1449552, 8297877, +4063039, -5514738, 2518998, 7914551, 1166084, -2779918, -5555004, -6684043, -4574140, -6720550, +4465156, 1010391, 2460480, -1293859, -3033858, -3211562, -5910412, 303332, -176631, 1401233, +-1435593, -5385889, 95026, 5743445, -1265942, 61740, -2856153, -5735929, -8472897, -734976, +6120866, 2216740, 652298, -2880849, 791885, -4606890, -1497333, -3467112, 450972, 777389, +-5229660, 5910949, -3320010, 7522099, 2858838, 710280, -3408594, -1800128, 1946694, -436476, +1843078, 4036196, 834297, 1597728, -4459787, 2636036, -2234457, 6914898, 8584566, 3926674, +5774584, 2676838, -863825, -6016713, -3866544, 491237, 4446365, 4460861, -3555696, 463856, +4227322, -5510980, 5455146, 344134, -2771328, 1787780, -1152125, -267899, -3083250, 604517, +899259, 530965, -2469069, 654983, -1738388, -2340220, -794032, 161061, 1053341, -1528472, +399432, -665183, -2142115, 227633, 1808718, 744103, -1525787, 999117, -1141388, 3279745, +-7905424, 1040456, -8454106, -35433, 1292248, 787053, 3808562, 382252, 601295, 14948634, +-1878511, -6604586, -7125351, 7506529, 5026186, -5668283, 1364726, -6322192, -2713346, 206695, +7144678, -8870718, 2578591, -352187, 1406602, -683437, 9070971, -4702453, 2552284, -1428614, +-2411624, 1371168, -444529, 2712272, -2787434, -2589329, -7691213, 1194001, -2561411, -1664837, +598074, -2732136, 2254858, -4345970, -2590402, -7638063, -241592, -6783364, -2869575, -8065949, +5970542, 1200443, -2481954, 5244692, -6114423, -46171, -11639361, -641561, 4006668, -333397, +3433290, 7381975, -2610266, -1058173, 9244380, 3889630, 3561065, 5635534, -2938831, -8574365, +-920734, -5141076, 3725884, 8506183, -1547799, 2482491, 4524211, 3799972, -466541, -734976, +1043140, 144955, -1589138, 2277943, 2045478, -3568044, 1168768, 2980171, -1518808, -1100049, +-5284958, -1241246, -2230699, -746787, -2313914, 446677, -570157, 396211, -249108, 342524, +1349694, -1569811, 539555, -654446, -1595580, -229244, -280784, -497142, 106837, 887985, +1484985, -1488743, 506269, -1262720, 210453, -161061, -1666447, -673236, -1275068, -252866, +-2020245, 475668, 98784, -1154273, 4301410, 4698694, 1806034, -2951716, 2145336, 1178432, +9172440, -1453310, -1875827, -12335146, -3389266, 9158481, 9084930, 5728413, 4643397, 13066364, +889058, -15743739, -3942780, -2675765, -3720516, 8297877, -1247688, -3102577, 9824201, 1461900, +-3940633, -1455457, 3969624, -3520263, -1287953, 1129576, -1166621, -5522254, -2398202, -316217, +-5199595, -2478196, -2137283, 3626563, -2398202, 7041599, 6983080, 613107, 6646462, 4548907, +-2883534, -1066763, -2168422, -10247792, 1229434, 2049773, -9611600, -1446330, -2663954, 3418794, +8944269, 1296543, -8898635, 1268626, -3376918, -6105296, 4990215, -1466195, -6347425, 2870649, +2566243, 7066295, -478352, -926102, 5330592, 6153078, 6906308, -7039452, 5032628, -933619, +-1095754, 1801202, 7450158, -365609, -1870458, 2294050, 1215476, -6271189, -728534, 8537858, +1985886, -577673, -978716, -3893388, 2857227, -1443646, -1661079, 271120, -155693, 1964948, +-31675, -2674691, -1808181, 3557307, -343061, 1399086, -1509681, 1720134, -1228361, -997506, +-1213328, 898185, 2007897, -935766, 6285685, -16067473, 6701760, -1772748, -3632469, -3316789, +2780991, -1543504, -9484362, -10152229, 1268089, 15788837, 4387846, -11516418, 2627983, 9363566, +-6713571, 1202591, -1669669, 5578626, -1074, 5148055, 13863081, 10057203, 6323803, -246424, +-1104880, -6402186, -6808597, 2715493, -17874044, -2841658, 8532489, 942208, -864362, -8587250, +-3016678, -372052, -346282, -4175245, -8827232, 9935870, -3391414, -2183991, -1557999, -8222178, +-9198209, -293668, -4464619, 639950, 4447439, 3367791, 3771518, -7337415, -1858110, -3604551, +-2245194, 11800960, -1196148, -5386426, 428423, 15134928, -8024073, 2546379, 11189464, 350577, +-2507187, -5610838, 3441343, 648003, 8074539, -4309463, 6841346, 5516886, 10561861, 5094368, +7924752, 842887, -5099737, 1117765, -157303, -2962454, 4811974, 6784438, -5561983, 3709778, +2083059, -5037997, 720481, 1809255, 1474248, 1852205, -2828236, 1655710, -3104725, -936303, +-815507, 241055, 652298, 1381369, 1791001, -336618, 2654290, -170725, -1095217, 921807, +1788317, -560493, 1110786, -2677375, 1137630, -853625, 1772748, -1963874, 9264244, 13196287, +8126615, 1307818, -2802466, -4997195, -10958072, -3225521, 7289633, -14999636, -6102075, 13581760, +-18846854, -3460670, 10586021, 13210246, -1332514, -13356275, 1872069, -5139465, 17830556, 7846905, +-12203613, -7920457, -1856500, -7595650, -15366319, -7751342, -6805913, -5622112, -12440910, 6218039, +2234994, 7645042, -4723391, -2354179, -10942503, -1177358, -9492415, 935766, -6303402, 1344862, +3346317, -14745160, -4803921, -5648956, -3879966, 3107946, 3154654, -4747550, 14498199, -997506, +-3768297, -2775623, 1416266, -3459596, -1178432, 5327370, 4607426, 5970542, 7962870, 7479149, +613643, 4883915, -2396055, 11234561, 12099997, -6139656, -3145527, 7353521, -197569, -18391050, +858457, -9371082, 5696737, 5732708, 10378788, -7927436, 4425964, -11098732, -1059246, 6241661, +-2681133, 9785009, -2553358, -1264331, 1990717, 581968, 1394791, -716723, 592169, 4124242, +-3092913, -857920, 4038343, -684510, 3173444, -4777078, -4085051, 2709051, -647466, 805306, +449361, -625992, 736587, -2882997, -726386, -553514, -1216013, -1969243, -652298, 1433982, +1808181, -151934, -1903744, -10231149, -12224014, -6091338, -11806328, -17017734, 12065100, 1119376, +6784438, -9433896, -9672803, -13507672, -9018358, 4085588, -9892920, -9016210, 12271795, -3115999, +652298, 2887292, 7045894, -5477157, -4028143, 1952063, -3208878, 1846836, -537945, -6077916, +-11439645, -18094160, 6043556, -13011603, -11796128, 570157, -3047279, -886374, -6601902, 2970507, +3523484, -14755360, -235149, -3279745, -5668820, -8224863, 4735739, 945430, 14783277, 1704565, +-8156680, -559420, 1455457, 6015102, 2628520, 12985834, -1027034, -14223858, 6162205, -3051574, +6498823, -8520678, 1944010, 4770635, -24975772, -11949136, 8960912, -808528, -2592550, 3813394, +-1175747, 15796890, -455803, 9992241, 8816494, -12868796, -14790794, 833761, -16395501, -411780, +-707596, 303332, 2507187, 10312216, -252329, -6524056, 6040872, 7754564, -7150584, 1248762, +2454574, 7802882, -3709778, 250719, -3761855, 2624762, -94489, 1636383, 2725157, 4197257, +4392678, -148713, -3976603, 165356, 3162707, 936303, 766115, -3762928, 539555, -3767760, +-417149, 2019708, -467615, 3677029, 2877091, -167504, 920197, 2978560, -2630131, 5260261, +35433, -2314451, 2512556, 8653285, 35062504, -8604430, -23681376, -2064269, -10405095, 25585120, +1889249, 14346265, 7643968, -4416837, -11390790, -5035849, -12405476, -3137474, 17100950, -19131394, +714575, -15605227, 4143570, 1323924, 7532299, 1788317, -7602629, -12648679, -14874009, -2721936, +-14596446, -11325829, 1742683, 3389266, 10656351, -10060961, -21122650, -4388383, -7414724, 2531346, +-9999221, -6662568, 2901251, -5250061, -8486319, -564251, 780073, -4269735, 20333986, -4194573, +-3497177, 5171141, 5207111, -6074695, -2724620, 15142981, 12556337, 8334921, 15824807, 12505871, +-126165, 5235029, 8919573, -6752763, -6501507, 1859721, 6378564, 10619844, 4192962, 21554830, +2197950, 14450954, -4268124, -8354249, -5552319, 30588758, 5260261, -3978214, -3869766, -10995116, +-10696616, -7583302, -7559143, -8807367, 3323231, 7037841, -7686918, 2394444, 7408282, 3762391, +-7119445, 1383516, 7553774, -1964948, 4084514, -3899830, -1301912, 1708323, -1533840, -901943, +-2550674, -4982699, -999654, -4519380, 2142652, 3710852, 1677185, -3780645, 4722854, 3176128, +-2993592, -3315715, -5317707, -1561221, -1655173, 1277753, -1366873, 2300492, 1491964, 377420, +-763967, 18790, -4316979, 1615982, 6535867, -30669824, -11547020, 15553150, -3797825, -15606301, +-14873472, -4849555, 16595217, 9032316, -13569949, 7575249, -18018998, -7213398, -2290291, -11621645, +-16205448, 13635447, 7274601, -14178761, -5195300, 30988190, 7009924, -13498008, -18942954, 524523, +9948755, 1925756, 1564979, -21304112, -810675, -2214593, -15637439, -8788040, -6422050, -12148315, +-6054830, 3824132, 284005, -12834436, -13269301, 1908576, 8004746, 26307, 10794327, 18671834, +-13174275, 11664594, 8393977, 3876745, 2261837, 14136348, 4101694, 8810589, 5494874, 7964480, +-2840047, -1427540, 15611669, 25038586, 3856881, -5524939, 2786897, -3323768, -9649718, 16021839, +-7974681, -13059385, -21296596, -6987912, -24774982, 12494060, -10268193, -3989488, -1706713, -3285650, +-9091909, -1228361, 9470940, -10917270, -1275068, 5390184, -3500398, -10640781, 5165235, 1132261, +2737505, -482110, -1597191, -3650722, -736050, -1775969, 5519570, 1777043, 1297080, 1190243, +1586990, 321586, 2647847, 2255932, 4843650, -6994891, -1180042, 840740, 4463545, -1738925, +3660386, -4120484, 1166084, 1308891, -1290638, -2171643, 3845070, -1665374, -686121, 2661806, +388695, 481036, -6238977, -13614509, 11578158, 6879464, -2004676, 7671349, 5765994, 16375637, +12691091, -26703422, -8808441, 29626684, -23325968, -6931541, -14113263, 21106544, 9455907, 9715216, +4149475, 3076807, 8507793, 22396106, 10719165, -9889162, -143881, 726386, -576063, 8858370, +10027675, 1199370, 5957120, 5630702, -5088463, 6933688, 4228396, 13840532, -6593312, -13328894, +-11381663, -8920647, 2698313, -1166621, 5349919, 6000606, 6100464, 12193949, -5285494, 2571612, +-5327370, -9512816, -3787624, 1010391, -10897406, 14008036, 17016660, -18418968, 6345278, -12757663, +10489384, -2081985, 4118874, -1394791, -10129680, -2479270, 11798275, -9169755, -2754148, 2082522, +-18737868, -7181722, 4010963, -14540612, -939524, 23284092, 11646878, -1560684, -5255966, 18582712, +4950487, 13386339, -4133369, -5991480, 19466402, -6571837, 6127845, 2593624, 2829310, -3980898, +-2850248, -3556233, -2394444, -6511171, -3954591, -4531728, 729608, 4215511, -1468342, -9145596, +-2867965, -1242856, 1114007, -257161, -2203855, 65498, 2665564, 4504347, -3493419, -78383, +-9804337, 1706713, -1151588, -1831804, 6750615, -79457, -560493, -3893925, 4162897, 1165547, +6125160, -2015413, -268435, -3999152, -357019, -5777268, 18556406, -1540283, -4289062, -15425912, +691490, 1438277, -4113505, -353798, -7119445, 2682744, -22095460, 20171314, -4054986, -7164006, +-13973676, -15825344, -1606318, 19247896, -3464428, 5326297, -11873437, -6886980, -3291019, -11596949, +-13953275, 12779675, -7867307, -6442451, 11370926, 11018739, -15549392, 5430450, 5934571, 13498545, +11191074, -4070555, -9822053, -6220187, -15111842, 16682190, 11016591, 5543192, 11943767, -12309913, +8485245, -1778117, 7784092, 8580271, -8012799, -623844, 27199492, 22767084, -17143362, 6905234, +14151917, -10811506, 3416647, -25346750, 7663296, -13703630, 11411728, -7939784, -8702677, -6175626, +30351998, 1758252, -8749922, 2714419, 10259066, 1369558, 6135361, -16285979, -1778653, 27231704, +-811212, -10644540, -16549583, 552440, -12226161, 7727183, 7933342, 9548249, -16898548, -17699560, +-4643397, 3033321, 5930813, 1901060, 190052, 485868, 6568079, -4300873, -1643899, -1293322, +-2755759, 3244311, 2807835, -5368172, -3629247, -8276402, 5209796, -2995203, 2341831, 3716221, +5482526, 4334696, 1960653, 8444979, 652835, -1880659, 4133906, -6150393, 3601867, 2486786, +1831267, 5621576, 6070400, 1180579, -691490, 3585224, 534187, -453119, -6415608, -8501888, +-1486596, -573915, -923418, -16651588, -701690, -1897839, -2915209, 5122822, -24552180, -11016054, +-13860396, 11731703, -6007586, 17339320, 10186052, 22010634, -11014444, -664646, -17293148, 14754823, +26230440, -7995619, -21180632, 2296734, -4476430, 32670206, -8171712, -12479564, 12180527, 7058242, +4997195, 12460774, 3982509, -40511204, -23622, -2486249, 15748571, 28881508, -27212912, 1323924, +7947837, -12719009, -2792266, -36702108, -8528194, 19106162, -30575872, -17942226, -9494562, -11639898, +11969537, -7104950, -10994579, 16553878, 4796942, 6207302, 16638166, 2118493, -5932961, 12219182, +17467632, -16867948, -12925167, 26492432, 17877802, 6361921, 8179229, 6475200, -11949673, -16755741, +-169651, 510027, -3651259, 5654325, -10460930, 7610682, -14430016, 6085432, 33195802, -15226196, +-12967043, 18633178, 5140539, -5946382, 11458973, 16417512, 11837467, 14545980, 6915434, -6933688, +5734855, -17269526, 9256728, 4294968, 4828080, -8605504, -2803003, 2183991, -969052, -1461900, +-2815351, 6093485, 11155641, -4086662, -11046656, 7249368, 12923557, 7152731, 4999879, -15130096, +9228811, 1343251, 4931160, -2138894, -5432060, -891743, 7758859, 1066763, -1596654, -6323266, +-686658, -3537979, -2060511, -2727304, 3374234, 7821136, -4628364, 658204, 4568235, -1477469, +-962073, -3706557, 600222, -2358474, -3188476, 7044820, 2369211, 9690520, 8708046, 14256607, +-33018634, -60918744, -28118614, -4267050, 20696910, 1467268, 22822920, 21118892, -6441377, 3411815, +-5231807, -11605002, -19112604, -11110007, -13819057, -8026757, 21653614, -28272160, -4986457, -23574538, +-29272886, -5156645, -29547228, -23753854, 2809982, -6257231, -3497177, 5298916, 25751550, 1737314, +-18868866, 996432, -2363306, -5724118, -24480776, -1682017, 28919088, 2595771, -623307, 11669963, +22428320, 15084999, 3808026, -9296994, 7723962, -7832947, -20827370, -38044284, 35921496, -4693863, +29893510, -2663954, 236760, -10939282, -17532594, 31532576, -18174690, -14779519, -1699196, -23241678, +-21870510, 17864916, 13035226, 6767258, -2495913, 9006010, -16212965, 6044630, -13200045, -18538690, +-20232518, -15815680, -6652905, 15307263, 767725, 5361730, -9488120, 5272073, -12349642, 8603356, +6624987, 6056441, -4187593, -743029, 7571491, -2371359, -9705015, -7384660, -9614284, -1067836, +-7167227, -1865626, -2690797, -2790118, 2494839, 853625, -3988951, 1316944, 4639639, -1588601, +-3406983, -7634305, -341987, -5347235, -979789, -1132798, -3776887, 8240969, -8338142, -7863548, +-3859028, 4210142, -7425462, -7512972, 714038, -6344741, -359167, -1427003, 3033858, -1148367, +803159, -5211943, 1625108, -10408853, -5389110, -1904281, -21522082, 4497368, -5136781, -15904264, +-23083838, -656056, -22068078, -26506390, -4021700, -12342662, -28266254, -40101036, 4875862, -15446313, +7691213, -3300146, 15244986, 32977296, 2051921, 3011309, -16601122, -18600430, 15460272, 7985955, +-11936788, -394600, 10193568, -23071490, -17059074, -1686848, 29009282, -25132538, 643171, 119722, +13515188, -21543020, 22259742, 11051488, 6517613, -1055488, -8857296, -24937654, 33286, -6340983, +9118216, -13763223, -32176822, 26239028, -19287088, -9217000, -1107565, 25657598, -19649476, 8668855, +-16102369, 9615895, -5684389, -24579560, 11740293, -31179852, -6543383, -9325448, 10927471, 24599962, +-14330158, 8769786, 25667798, -20928838, 3562139, 5608691, 6172942, 6978248, -36967856, -11674258, +-6114423, 12818330, 2977486, -619012, 6944962, -7095286, 14979235, -3271691, 3519726, -14858976, +12509092, 2601140, -22774064, -11028939, 10901164, 12912282, -1803349, -4021163, -8859981, 12053289, +1684164, -386547, -23740968, 3288871, -11390790, -18636400, -5397700, -4240207, -2275259, -11222213, +-13629005, 4296041, -3121368, -7344931, 3946001, -2000381, -1955821, 166967, -3668976, 664646, +7350837, -14533096, 1367410, 1967095, -4624606, 9358734, 9263708, 9949292, 4187056, 5735392, +-6778532, 2104534, 240518, 2359011, -3162707, -556735, -342524, 3736085, -2858301, -6923488, +5850819, 43455404, 4551055, 18290656, 50070728, -23477902, -13014288, -19696184, -7191386, 22890566, +1617592, 28220082, 7726110, -1172526, -10484552, 21282100, -13258564, 4718559, -8829379, 8688182, +-14055817, 16169478, -7859254, -3984656, -9242233, 12386686, 8697846, -14011257, -3203509, 13045426, +4083440, -9066139, 971200, -11609833, -37448356, 16082505, -19637664, -29064044, 17920752, 7700877, +19374060, -2024003, -18717468, -7246147, -4958003, 10984379, 15048492, 16424492, 27850716, 27174794, +-12089259, 3546569, -28939490, 57445, -21055004, -37981468, -3649112, -31013958, 10045392, -24821152, +-16115791, -16525960, -22986664, 2027225, -5404143, 1681480, -6801081, -3173444, -1953673, -40176196, +6433324, 5796059, 9163850, 18886044, -3561602, -32007170, 18435610, -20830592, 11936251, 11430519, +25977572, -14354318, -12825309, -8812736, -4967130, -18714246, 7460895, 3962644, 2411624, -4705674, +6606197, -9494025, 9429601, -1830730, 2033130, 2472291, -11282342, -356482, 4560719, 10970420, +-2854006, -7082401, 5057324, 7505992, 9774272, -6336688, 190589, 5106179, -530428, -1342714, +-3458523, -7468948, 5192616, -437550, 3367254, -4305705, -420370, 6284611, -4226785, -7042136, +-3730179, 760746, -2731062, -12145631, 19203336, -5141613, -3779571, 1353452, 3797288, -3485903, +3655554, 4274030, -1717987, -651224, -2441152, -4014184, 31324808, 58100708, -31830540, -26038240, +-45010184, -92026120, -22582402, -9822590, 20653424, 12198781, -7822746, -17932562, 25207700, 30448634, +2767570, -1702955, 280784, -24450712, -14184129, -17410724, -13098040, -25858924, -255551, -6710887, +-3007551, 17340394, -23983098, 19042274, 18174154, -5896990, 9391483, -1311576, -42754788, -30771294, +-16962436, -15861314, -7122667, 3114925, 16564615, 5078799, 8926553, 41076532, 37650756, 8235063, +-27896886, -14820322, -1180042, -14654965, -26461294, -66420596, -55541444, -25296284, -5934571, 2424509, +14494978, -46180564, -26417806, 23475218, 27612882, 32822676, -30198452, -36992016, 11951283, -22696754, +54415624, -27768038, -3131568, -16481937, -8740795, 7176354, 16088411, -8373576, -21521008, 19628000, +19360638, -4744865, 22175990, 19367082, -43130600, 38206956, -25023016, -250719, -7388418, -26145614, +-7269769, 12667469, 9685151, -2483565, 4992900, -16110959, 310848, 7499013, 10604274, 16411070, +-12694313, 2139968, -3679713, -7283191, -17961016, -2627446, -17311940, 14759118, -2893734, -18760954, +2820720, -21433498, -1509681, 2063195, -4983773, -9550934, 498216, 1192390, 2068027, 6345278, +-1435056, -833761, 12090333, 3466576, -12500502, -14688788, 3692598, -9939091, -20141250, -7421704, +-18968724, 5592048, 5738613, 14154065, 1994476, -15187541, -10915123, 10807211, 54783380, -18240726, +17663590, -747861, -24378772, 3789772, -49221400, -11060615, 10596758, 998580, -28638842, 16996796, +50210852, 35243428, -15504832, -31388158, -13352516, 3573950, 52774412, 7138773, 1369021, 247497, +24429774, 25121264, 6604049, 19219978, 15599858, 29528438, -8341364, 3420405, 18895708, -17129940, +-26094074, 14755360, 43347496, 9438191, 21050172, 2071785, 12959527, -57863948, 10810433, -2200634, +13179107, 56854628, 23017266, 7744900, -5532992, 25518012, -5701032, -11866458, 9112310, 15884937, +33548526, -10704669, 20904680, 3854196, 5900212, 13222594, 17056388, -456340, -21985938, -13666586, +5332739, 42908332, 29506426, 22866406, 24852828, 20736638, -5744519, -52968220, -37918120, -72688024, +-826244, 22259204, 42084772, 6594386, -30348238, 10165651, -18696530, 6142877, 14688251, 4446902, +-8629126, -4843650, 390305, -4034048, 11979201, -7976828, -20906290, 472446, 7306276, 9478456, +-13415330, -6146635, -25172804, 6373195, 11365020, -9717364, -8482024, 6424198, -4679904, -6233608, +-5188321, -19730542, -3920232, 20461224, 13121125, 18527416, -9611063, -20868172, -15142981, 13616657, +11084237, -4887136, -538482, -1239635, 4204236, -5855114, 12674448, -13930190, -7453379, 991601, +2765422, 8052527, -16781510, 3571265, -12186970, 33643552, -9374303, 7330436, -10465225, 3866008, +338766, 3142306, -1240709, -7994008, -20573968, -9014063, 45056356, -2102387, -20656646, 4842576, +-3775813, -17294222, -13547937, 2222109, 23850490, 63986960, 29004988, 56686052, 29939144, 25029996, +24244016, -17215840, -14037564, -16482474, 7260642, 46409804, 15155329, -39294656, 16957604, -42225436, +21122650, -26881664, -5524402, -23631984, -24974698, -1486059, 3359201, -650688, -31275414, 40626096, +-8180302, 15091441, -39584028, 10354092, -9102646, -12511240, 20723218, -17141752, 41315436, 4576288, +-16103980, 1843615, -12096775, -17145510, 11726871, -28178744, -5851893, 34803192, -7518341, 14090177, +-1753957, -25677462, 28002650, -15269682, -57723824, 6955700, 4488241, -479426, 6522445, -8223252, +-11128260, -3478387, 26345330, -49971408, 29541858, -11961484, -6768869, 32489816, -19981262, 9390409, +12232067, 47279536, 16702054, 20775294, -3205656, 28167470, -22513682, 22299470, 3869766, -8919036, +6207839, 1140314, 1115081, -12478491, -2997887, 1980517, -5033165, -9389335, 19504520, 119185, +-1180579, -5896453, 6647536, -7776039, 17426292, 9807021, 9476845, 1932735, 146566, -1834488, +14641544, -11738146, -14543296, 5493800, 7805030, -900869, 13192529, -5742908, -2325188, 462246, +-4125316, -14577119, -14105746, -1546188, 5123359, -7338489, 2808372, 4418448, 5466420, -4065724, +-6442, 9257265, -4025458, -13540421, -24250996, 39779452, 36911484, 128837208, 51993264, -70030512, +-32937030, -34240552, -53868552, 37693168, 115778360, 46476376, 22010096, -28870234, -7926362, -1789928, +-1294933, 55736328, 38149512, 24421720, 83715352, -99963216, 6622840, 52552684, -12574591, 10972031, +54986856, 9834938, -15528991, 29815662, -55083492, -110566952, -10413685, 11131481, -42799884, -4621385, +59557776, 10274636, 3689914, 22839026, -46672336, -95190432, -87005296, -39399884, 29081760, 57043608, +125942936, 31885300, -15817828, -15492484, -33801928, -74854840, -22569516, 55337968, 55642912, 58409944, +56922276, 35897872, 29797946, 8899709, 13211856, -47943648, -29352880, 7558606, 13852880, 25149182, +30700426, 75093744, 19917374, 43878996, -28251222, -27827630, -50319300, -10608569, -38385732, -8828842, +78288128, 100456064, 2567317, -3612604, -61887256, -71380208, -40036612, -16617765, 40329744, 21715892, +-3935801, 15300284, -5082557, -9789304, -18341658, -17297444, -1921461, 5022428, 4160750, 22493280, +-1113470, 42950, -10758356, 907849, -13500156, -4167192, 559956, -20095616, -8768713, 999117, +-5093295, -882079, 12641699, 11317239, 25805238, -10518375, -3981435, -24958054, -20084878, -15082315, +26768384, 17208860, 8853001, 9331890, -7428146, -22049288, -17620640, 1497870, -12192875, 22908818, +33711200, -528281, -7171522, -22667226, -7802345, -92177512, -56281788, 32668058, 86888800, 100357280, +210000816, 127497176, 87159920, 76317808, 60034516, -10698227, -90412816, -99729144, -192505264, -205443312, +-194047696, -124608816, -42981884, 42912092, 75094816, 124100936, 122654600, 85487032, 85157928, 108008760, +104366632, 92957048, 59581932, 40830108, 36735928, -3994857, -5866389, -120255864, -85031224, -107628120, +-129500240, -54943368, -126447056, -102744744, -186508960, -163917968, -115524960, -77787224, -11062225, 96962648, +118286080, 98985576, 106548472, 97919352, 182476512, 236658064, 212241712, 209745264, 185847536, 178668496, +133554696, 132726304, 29045254, -90016608, -186213136, -178899888, -266694928, -223225024, -324016096, -386887968, +-343030432, -326582880, -195870912, -137057776, 25600690, 64553360, 153186448, 226628240, 350367328, 302690496, +437952448, 377502944, 271227712, 265872976, 121760712, 8508867, -23691576, -95106144, -164907952, -198085504, +-235736256, -205097040, -184948272, -179319712, -144844016, -150151520, -122494616, -108622408, -32347546, -23364086, +30482994, 69508680, 80850072, 104324216, 149424592, 179727744, 192560032, 200594304, 148203760, 121882048, +119082264, 43663176, 29694868, -67014376, -159148400, -213157072, -217159984, -244045408, -154161408, -176853328, +-117088864, -85226112, -22772454, 42069204, 84035328, 126450816, 132184600, 197736000, 204031344, 195104800, +166320992, 148402928, 59906204, 14995878, -36223756, -84079888, -159335776, -188798176, -155959920, -106448616, +-93170192, -65768296, -59151900, -31368830, -2874944, 8151848, 6787659, 28993176, 33787432, 51832204, +45134736, 41385768, 39642548, 44386340, 32503238, 30578020, 35675072, 37160592, 22272090, 14761803, +2409477, 1009317, 6252399, -2629057, -19440632, -14954002, -20917028, -26305600, -34731788, -30588220, +-25763898, -16822850, -20348482, -15826418, -13462575, -3526168, -7865159, -5773510, -2894271, 6385543, +1772748, 6390375, 10907606, 17753784, 13412646, 17358110, 14151380, 19922206, 16814796, 13439490, +4458176, 6264210, 2451353, 2217277, -5274757, -3982509, -5122822, -1787780, -6752763, -3617436, +-6681359, -4328790, -5618354, 1537598, -1545115, -2152852, -6394133, -3369402, -5775121, -3454764, +-9378598, -6380174, -5711770, -981400, -3026341, 1549410, 632434, 4584341, 2607045, 7270306, +5428839, 7226283, 3569655, 5640366, 2413772, 5518496, 2407866, 4931696, 1526861, 3433290, +-510027, 1289027, -2632278, -290984, -3603478, -694174, -3555696, -360240, -2972117, 301721, +-2369748, 894427, -1761474, 1389959, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -5146982, --13877039, -1143535, -2240899, -1867774, 176631, -2287070, 833761, 1379758, 5645735, -1895691, --259846, -5215701, 353261, 5281736, 332860, 3821984, -1156957, 1613834, -2233920, -3289945, -75162, 3631395, -501437, -4517232, -224949, 4400194, 1392106, -1868311, -1605244, -195958, --642635, -1015760, 12885, -733903, -1549946, -185220, 860067, 620086, -241592, -3446175, -5090073, 6995965, 183073, 817118, -2867428, -1603097, 512175, -3650185, -4093641, 2421288, --3333968, 2391760, 3058554, 3087008, 1115618, -470836, 793495, 641561, 2289218, -5029944, -390842, -654983, -3700651, -4955856, 102005, 2463701, -1927904, -271120, -617938, -359167, -3445101, 1718524, 424128, 1353989, -1181653, -4085588, 1539209, 645856, 3444027, -4202089, --3216931, 2346663, -1917703, -889595, -3163244, 688805, -1877438, -1721208, -2147, -1385127, --1531156, 387621, -849867, -398358, -1738388, 1021665, -257698, 74088, -499827, 828392, --210453, 250182, -351650, -294205, -30602, -581431, -79994, -12768401, -2916283, 4861903, --682363, -3982509, 1676648, -9486509, -3616363, -1436130, -1690070, -4940823, -5133560, 2710124, -4281009, 3600256, -4800700, -7156490, 811749, -4219269, -7556458, 1662152, -471910, 2072322, -8513699, -2869575, -888521, -5440650, 7357816, 498216, 3675955, 2462627, 6042482, 2998424, -1875290, -6056978, -669478, -5574868, -1508070, 170188, -2301566, 1779190, 1573032, -2674154, --5098663, 3184182, 5338108, 1428077, -2524367, -4016331, -2434710, 1192927, -4427038, -5697274, --1585380, 2713346, -1537061, 1301912, 3554622, 2163053, -2608119, 5056787, 479963, 4296578, --3636764, -3151432, -1760937, -2222109, 3073586, -1786706, 207769, 5106179, 1869385, 59056, --4871030, 1264331, -1924682, 3561065, 5306432, -979789, 469225, -2478196, 2033667, 4573067, --1611687, 2823941, 1350767, 545998, 2428804, 883153, 157303, 1839320, 765041, -221191, -54224, 775778, 816044, -927176, 687732, 576599, 1024887, -665183, -2612951, 3293703, -4502737, 1845762, -2834142, 1992328, -1334124, 1387811, 8481487, 5259188, -7174743, 4891968, --3949223, -1919850, -1040456, 171262, 3607236, 165356, 9927280, 2899103, -3810173, -2471754, --2471217, 7024419, 1647120, 6767795, 2212445, 4568772, 7028714, 8093329, 3069828, -871878, --799401, 1254667, -6449967, -5967857, 1927367, -4519380, 2601140, 1288490, -1535988, -629213, -1904818, 6768332, -2190970, -2238215, -3444564, 8636642, -1147830, -10663330, -5328981, -4197257, --3880503, 4475893, 4270808, 3792456, 5617281, 2538326, 3529390, -101469, -314606, -102005, -5653251, 1887638, 3327526, -7396471, 513785, 404264, 430570, 554588, 3272228, 2336462, -969589, -3547643, -3566970, 2158221, 1773822, -995359, -190589, -2840047, -3663607, -2951180, -2094870, 3654480, 476205, 282394, 1289027, -959925, -88584, -740882, 692027, 714575, -418759, -411243, 1121523, 1804423, -205085, 257698, 430034, -184684, 506269, -618475, -1307818, 103079, -187905, -714575, 1164473, -2063732, 1276142, 456340, 976568, -56908, --1222455, 352724, -561567, 18983756, 4050154, 3003793, -2382096, -1180579, 1745904, 1446867, -4946192, 6780143, -389231, 9922448, 3824132, -3331284, -3318936, -124554, 4603131, -430570, --2642479, 5307506, 644245, 14250165, 3615289, 2916820, 498216, -1245541, 581968, 2256469, -2655901, -523986, -55298, 7698192, 976031, 8462159, -4282620, -3896609, 2669322, 12646531, -3546032, 3141769, -1171452, -5306969, -2215130, 1806571, 287763, -12885, 374199, -7580618, -459562, -3274376, 2995203, 2535641, -3121904, 1877975, 2612951, 1920387, -3699041, -3605088, -798864, 1418950, -73551, -4666482, 1163399, -1752884, 2976949, -336618, 511101, 2046015, --820339, 1176284, -1787780, 625455, 10915659, 1347546, 3813394, 231928, -3114388, 1907502, -572304, 3507378, -6203544, -4165045, 2007897, -798864, 1172526, -1496259, 2245731, 2051384, -161598, -2613488, -1109712, -3591130, -741419, -753230, 2284386, -1606318, -535797, 494995, --410706, -793495, -972273, 781684, -1027571, -1147293, -99321, 136902, 579821, -2406256, --1054951, 719944, 277025, -2629057, -745714, -95026, -3578782, -1388348, -459562, 2841121, --4218732, -656056, 4169876, -2075543, -6615860, 25770, 10764799, -682363, 8441221, 4420058, -11699491, 1484448, 1048509, 4341675, -3350075, -6941204, -9258876, 2237678, -4733591, 10901701, -6159520, 7721815, -1472100, -3119220, 928787, 1785096, 3555159, 10209674, 1191853, 4293357, --4656819, 3298535, -3308736, 1453310, -1791538, 3406446, 5791227, 851477, 5533529, 2101850, -2763812, -1539746, -1352378, 7486128, -1743220, -1790465, 5580773, -3278671, -323196, 864899, --2454037, -3178276, 2469606, -3654480, -716186, -4683662, -10138270, -1070521, -1542967, -199179, --10561861, -3967476, -3223910, -2670396, 3971234, 10470593, -2649458, 3408594, 5444408, -1453846, -1027571, 985695, 622770, -3725884, 4144644, -4743255, 1263257, 3520800, 9759239, 3113315, -2896956, 951872, -118112, 3007551, -3513820, 35970, 2024540, 1019518, 186831, -3882114, -2370822, 2944200, 2909304, -481036, 2171643, 1239635, 627602, 2029372, 1155346, 302258, -1132798, -204548, 885837, 624381, 751619, 1203128, 1447404, 1748052, 1193464, 1196148, -1292785, -677531, 1174137, -13617194, 1096827, 7455527, 3787624, -7599945, -669478, 449361, -1724429, 2905546, -530965, -5897527, -5820755, 976568, 9625559, 4703526, 5673115, 9859097, --6702834, 7057705, 12816182, -1107028, 2822331, -7240778, 2427730, 2716030, -6362994, -3308199, --1438277, 3041374, -6426345, -8304856, 1523103, 981937, -7259569, 629213, 2190970, -1412507, -15219217, -822486, -10908680, -695785, 3674345, 8651675, 3107946, 3897683, -7016366, 1952600, -2128693, -6168647, -470836, -1030255, 10555956, 6521908, -1825361, -3627637, -8286603, 3562139, -3238405, -4843113, -225486, 1983201, 3161633, 3316252, -4245575, -108448, -969589, 9971303, --8428873, 1035624, -2235531, 8978092, -697395, -2190970, -3815005, 1126892, -3945464, -9136469, -203474, 6948720, 2030446, 4355097, 1037772, -3293703, -1355599, -1663226, 5871757, 2347200, --1652489, -224412, 5330592, 4013647, -1559073, 571768, 805306, 1153199, -143881, 2147484, -1453310, 1310502, 99321, -759136, -380641, 420907, -806380, 249108, -1109175, -363462, -847182, -2802466, -692027, 5303748, 4654671, 1755031, -3578782, 1050120, 2174327, 16126528, -10557566, 8049843, 11200201, 4626754, -1087164, 1655173, 4069482, -11362336, 5730023, 200790, -6165426, -4571456, -2455648, -7329362, 1954747, 12961674, -12802224, -8031589, -13605383, 6825777, --3218541, 426276, -6280853, 783295, -2442226, -6144488, 2180770, 2989297, -9738301, -1327682, -1561221, -2134062, 4879620, -13907641, -6901476, 14171781, 1240709, -280247, -1593433, 468151, --7406134, -7695508, 257161, -11183021, -2772402, 1082869, 2783139, -4835060, -1309428, 13790603, --1102733, 4808753, 10081362, -9639517, -3548717, 2200634, 2220498, 1792612, -3160559, -6911140, -7635915, -926639, -7539278, 5313949, -1540283, 1197222, 1821603, -4013647, -2617783, -1739999, --3214783, -4349728, -5377299, -5019206, -6544457, -1986959, -2901787, -703838, -1048509, -159988, -602906, -2681133, -2294050, 1405528, 1524713, 2801393, -392453, -1264868, -3955128, -1146756, --4537633, -2842732, -814970, 746787, -548682, 484794, -1326071, -738734, 2965138, 1137093, -1983201, -2262911, 328028, 419296, 598611, -4483409, 85362, 1197759, -235149, 2225867, --610959, -790274, 237834, 623307, -26830660, -14705968, 11905112, -4511327, -5820218, 7429757, -6207302, -11276437, -15547245, -4813585, -5646272, -5671505, -1181116, -10480257, -7777112, 3995393, -282394, -14142790, -15851114, -8695161, -4440460, -684510, 7919383, -471373, -6002217, 4526896, --13216688, 500364, -743029, 660888, 4439923, 2612414, -9664750, -7073275, 5592048, 2100776, -21144660, 5313949, -7212324, 1052804, 565325, 302795, 5491116, 1156957, 2221572, -2107218, --4799626, 1463510, -12355547, -2212445, -5454609, -6400038, 1291711, -9665824, 11225434, -1393717, -4624069, 8181376, 2291365, 4366908, -644782, -5203353, -336618, -614717, -6660421, 8578660, --3638911, 15217606, -606664, -287763, 600222, -3876208, -8312373, 2615635, -6543383, -2554969, -8779450, -11410654, -11370389, 7610682, 7092602, 6220187, -9646497, 6947110, 2782602, 4073240, --377957, 1814087, 1789928, 5413807, 2204929, 1371168, 3896072, -475131, -323733, -3206193, --2610266, -468688, 2633352, -3447248, 409096, -347892, -2127620, -1213865, 832687, -4452271, --2816425, -3307125, -650688, 1510218, -79994, 3397856, -1174137, 3551938, 252866, 1356136, -506269, 2763812, -2149094, -1646583, 3073586, -1362042, 380641, 291521, 5387500, 19833622, --11080479, 9474161, 3858491, 7077033, -2828773, -10711112, 1522566, -2757369, -10084046, 20471962, --1450625, -5596343, -20121384, 12437688, 3423626, -144955, -7522635, -8617315, 224949, 20798380, -7706245, -721018, -2049773, -8801999, -7242926, 6069326, 2642479, -6862284, -4897337, 7321309, -1803886, -205085, 6211060, 9659918, 1502165, 12723304, 14319958, 8791261, -3304441, 3257196, -1168768, 2465848, 7472170, -10510859, 11166915, -665720, -5677410, -8499203, 52076, 7439420, -5136244, -10047002, 2227478, 8135205, 1235340, -7244536, -15862388, -14318347, 3808026, 6495601, -1077500, -5480915, -740345, 11643119, -5282810, -8580808, -16747151, 1890859, 3260954, -12378633, -4705137, 12619151, -5675263, 9844065, 3389803, -11450920, -8568460, 1024887, 11903502, -1107565, -12505334, -2040646, -4362076, 2758980, 6385006, 1826972, -2114735, -3221762, 2159832, 5777268, -4601521, 908922, 7438884, 1509681, 5343476, 1459215, 7299834, 1236414, 4516695, 64961, -3614215, 2075543, -1773285, -5179731, 481573, -6078990, -846109, -2402497, 999654, -668404, --214748, -5376762, -493384, 2734284, -2675228, 511101, -629213, 545461, -340376, -3840238, -636192, -689342, 23946590, 15640660, 3629784, -4846334, -2500745, -3403762, -16343424, -6692633, --155693, 10410464, -7480760, -4278325, -3467112, 119185, 17334488, -13489955, -3537979, -804233, -8172249, -2868501, -9857487, -16668768, 6008123, -11536282, -5185100, -7219840, -7678328, 2373506, --12939126, -6381785, 11610370, 17220134, 867047, -10880763, -9568113, 15876347, -1702418, -8698383, -16721918, 453656, 1107565, 638876, -18061948, 7321846, -6635725, 6535330, 6191196, -12401718, --1251983, -12578885, 4959077, -12200391, -1969779, 5022965, 7000797, -4117800, 4295504, -14791867, -10242960, -1208496, 7022809, 5744519, 4307316, -3333432, -2975339, 14618995, -10043781, 7228967, --2379949, -12564927, -7427609, -898722, 13314935, -7617662, 6305012, 1709397, -3941706, 104690, --14574435, 18524730, 11559904, -2261300, -4922570, 9045201, 4088809, -2747169, -4628364, 965294, --3035468, 4629975, -830539, 2403571, 7866233, 2708514, 6262599, -74088, 2326262, 841814, --976031, 97711, -403727, 5216238, 2250026, 7263327, 1401233, -4173098, 5519570, -2205466, -24159, 3947612, -3680787, -1341104, -1854889, -1712081, 3497714, 1955284, 1909650, 2859911, --152471, -891206, 7030325, -2370822, -2157147, 9166534, 1962263, -6359236, -14010720, -950798, --18262200, 2998424, 1817845, 8843338, -7188165, -1934346, 4957466, 3804804, 5435818, -12651900, -17819820, 12341052, 2480881, 9079561, -3996467, -17948132, 4371740, -7657390, -8150238, 8204462, -20625506, 3408057, -5465346, -7585986, -16228534, -134755, 938987, 25054692, -9752260, -563714, -931471, -934155, -15020038, -17314086, 13749801, 368830, 7889855, -2370822, -19246286, -11349451, -1726577, -3412352, -3932580, -5708549, 12886513, -2845953, 8432631, -9069360, 17880486, -21069498, -10525891, 10683731, 6643778, 5575405, 5416491, 16384763, 8675297, -1357747, 3704409, -25770, -16519518, 24408836, -2659122, 1808718, -7045894, 10125922, 16667157, -11434277, 3638911, -28576564, -18751290, 19038516, 12976707, 17702244, -7965017, -14394046, -851477, -2211908, -4039954, -3131031, --8376260, -6078990, -2989297, -885300, -4610111, 2733210, 5393405, 1901060, -7861938, 1479616, --4292820, -4816269, -2797098, 3233574, 3262028, -1518808, -1831267, -811212, -1225676, 766115, --7603703, 2492155, 1292248, 4942434, 1291711, -421444, -60130, 1022202, 4569845, 1444720, --3857418, 3136937, 168041, 396211, -20685100, -3058554, -26454852, -13572097, 10397042, -10828686, --23527830, 2183991, -12691091, 583579, 447750, -15084999, -14345191, 6483253, 13839458, 4177930, --16109349, 7702487, -18118856, -6351183, -6679748, 5668820, -7449084, -3393024, 8697846, 1487132, --5966784, -12894029, 13646722, 13237626, 17199196, 2246805, -1919850, 608812, 5508833, -1300838, -7051800, -7762080, 9273371, -3651796, 10683731, 8571681, 6448894, -3105261, 441845, -16626892, -5657546, -4185983, 12505334, 2275796, -29072634, 4466229, 14328011, 19275276, -11088532, -15146202, -18127984, 8230768, 12745315, -22705882, 11225971, 28426242, 29940754, 1906429, 710817, 17038672, --11792906, -15712601, 10065256, -17396228, 6531572, -8101382, -6847252, -3841848, -37473588, -21638046, --18250926, 13464722, 5107790, 3786551, -13312788, -5413270, -10057740, -1902671, -5403606, 14716705, -3496640, -5851356, -13074954, -2909840, 8465381, -1350230, -3616899, 2601677, 8861591, -3154117, --5237176, -2509335, -1943473, -601295, 6892349, 6925635, 6016176, -6077379, 7885560, -399969, -2253784, 9015673, -4050691, -4065187, 7859790, 14110041, -3299609, -4605816, -2246805, 1698660, --2543695, -9718974, 1569811, 7099581, 1915019, -9786620, -9374303, 4422206, 3178813, -522912, --599685, -1709934, -6970732, -4772783, -15569256, -29901562, 22863184, 2387465, 7682086, -3882651, -16193637, 419296, -13795972, 10670309, 4355634, -4900558, -8324184, -6543383, 2065879, 3888019, -14343043, -8175470, 11257646, 3569118, 20447802, -29343754, -7864085, -4662724, 3783866, 11959336, -17380658, 3930969, -14103062, 9513353, 13675176, 11491185, -3212099, 3999152, 834297, -4833986, --1967095, 816044, 4428648, 1574642, 10110890, 1648731, -12745315, 11892764, -13215077, -16895328, -2626373, 12181601, -5931887, -4399121, 4436701, 5934034, 10518912, -6028524, 4987531, 23732916, --9479530, -25266218, -32697050, -16547972, -22155052, 10038412, 19226422, 12272332, 4698158, 11541651, -6796249, 12758200, -10947872, 14424111, 7504382, 5835250, 15056008, 19541564, -6095096, -4400194, -5342940, -1317481, 17608830, 6789807, -2697240, 2937221, -21496312, -15065135, 2970507, -884763, -3812320, 1410360, 4507032, -4057670, 11316165, -6026376, -6924561, -6722161, -11314018, -4146254, --2247879, 3666828, 3004330, -1739462, -9722195, -614717, 3200288, 1031866, -3912178, 2247879, -119185, 3699578, -4079145, 1615445, 765041, 4470524, -2180233, 6908455, -4329864, -5024038, -1457068, -904091, -3652870, 1092532, 4793184, 349503, -761820, 29894046, 2917357, 4668093, --6183679, 10839424, -34195456, -15135465, -23363548, -24169392, 9609452, -21096342, 20732344, 23538568, -1058710, 5076115, -3605088, 4277251, -22357990, 9160628, 24790552, -14150843, -28792388, 3769371, --10814728, -9235253, -28085864, 4821101, 10343355, -159451, -3793530, 8988293, -16010564, -2724620, -10447508, -5807870, -14189498, 1660542, -7074348, 14624364, -9713069, -5465346, 13769128, 11866995, -25411174, 3295314, 6145562, -2407866, 6832756, 8972187, 15701864, -4599373, -503585, -9831180, -20709258, -26169772, 28037546, 915365, -11164767, 13047574, -10180683, -7589207, 25784836, -37305012, -6076305, -7944616, 7285339, -14533096, 6955700, 14665703, -7644505, -1464584, -3928821, -6266358, --3308199, 27327266, -31120796, -10734734, 52306260, -19803020, -23095650, 22532472, 13540421, 15000173, --13182865, 925029, -13105556, -7450158, -2068027, -15075335, 3260417, 1896765, -3913789, 5261872, -4799089, -6903086, -12742094, -3401077, -1091995, 4869419, -11250667, -8016020, 273804, -1260573, -2809446, 6867653, 16632261, -7719130, -404801, -1968706, -1768990, 4642860, 1853278, -10058813, --7504919, 7806103, -6481106, 2850248, 2025614, -6193880, 2268817, -1547799, -10162429, -8475581, -4940823, 3095061, -1563905, -361314, 6300180, -14996415, -22873922, 2122251, -8605504, -7895224, --12830141, -16316581, 20547124, 8688182, 1404991, 9488656, 24317032, 14203994, -1554241, 4838818, -16383153, 20671140, -18332532, 8511551, 17495012, 7470022, 6478958, 23891292, 11668889, 4910222, --622770, 10700374, -1097901, 12122008, 10201621, 5432060, -11122355, 21128554, -17331804, -2269890, -26671746, 26175678, -6142340, -23369990, 8877161, -440771, 22899692, 39134132, 8876087, -6090801, -2887829, -22585086, -2543695, -6027450, -4722854, 371515, 20129438, -8667244, 8923868, 24005110, -4205847, -22353158, 14856829, -1213865, 9493488, 22554484, 31983010, -9062381, -8333311, -2804614, --25125558, -37031208, 1129040, -16878684, -2601677, -20446728, -1972464, 590021, 2897492, 15063524, --302795, -10596758, -17390322, 12736726, -5278515, 10890963, 529892, 20338818, 7691750, 7472170, -204548, -6396280, 11586748, -8793946, -9994926, -3102577, -7481833, -2998424, 715649, 762357, --2601677, 3093450, 4629975, 330176, -1022202, 5898064, -4968741, -7274601, 4561256, 5193689, -1182727, -6290517, -7386807, -4421132, 6201933, 8127689, 1209033, -1177895, 9175124, 2450816, -4451197, 3726958, 6601365, 1801202, -1050120, -4788889, 2736968, 5133023, -10448582, 8371428, -24996710, -46860776, 25793426, -19752018, -46162308, -13705778, -11622182, -1668595, -10639708, 5572183, --12761422, -28644748, -17273822, -8591008, -2604898, 3242164, -11775727, 11475616, 22421340, 791885, --1409823, 6103686, 1374390, -4226785, -8329016, -4739497, 6057515, 6618545, -2001455, 6288906, -27528592, 7530689, -8069707, -27379342, -4383551, 19246286, -23528904, -11113228, -8979166, 220654, --1823214, 14762876, -4924180, 1708860, 20378010, 7216082, 22607098, -3261491, -10729365, -4986457, --5851893, -5951751, 10877005, 1101659, 7336878, 13715441, -24322936, 3476776, -6479495, -15197742, --11453067, 23614804, 17019344, 767189, -11643119, 4697084, 9944460, 940061, 6857989, -16396038, --40341016, -18757732, -14819785, 14642617, 1416802, -1960653, -6882685, 2783139, -4625680, -12832825, --13283797, -6987912, 16207059, 12203076, -18283676, -22841710, -8980240, 1479079, 13701483, 5479842, --4502737, -6208375, -4780836, 3107946, -10190347, 1396938, -6995965, 471373, 10300942, 11003706, -2832531, -5861557, 3470871, 7897908, -382252, -1833414, 5811628, -8275328, 11241540, 10078141, -3838627, -303869, -598611, -1261110, 9398462, -3854733, -5163088, -5862094, -8310762, -8139500, -2443300, -3079492, 3325379, -2421288, 1588064, 5893232, -3096135, -5920613, -8577050, -2461553, -3763465, -6118181, 13143674, -18101676, 21843666, -1401770, -35512936, 7548405, -17321066, -3134253, --2928631, -3788698, -22760106, 7406134, 780610, 18095234, -38646652, 979789, 18466212, 2627983, --9475772, -19005768, -1906429, 11451457, 16109349, -13369696, -5297306, 9255655, 18461380, 17567490, --17047262, -3064459, -27383100, 12896176, 13273596, 8797704, -8105140, -1794760, -7761006, -2557653, --9416179, 2900714, 19243600, -6993281, -8179229, -6458557, -11591580, 22619446, 18757732, -1593433, -26589606, -950798, 9161165, -23596014, 19144280, 8971650, -27295590, -8424041, 30273076, 12993887, -7862475, 6222334, -14933601, -11160473, -15983184, 26912266, -14287209, 20834350, 20842940, -23986318, -55497956, -11787001, 34226596, 1716913, -8371428, -14806900, 25577604, 10255845, -20764020, -12193949, --44030396, 17569638, -6509023, 20170240, -27324582, 30086782, -23494008, 8978092, -9454834, -6732361, -19127636, 1968169, 1259499, 11084237, 7097434, -4934918, 12328704, -1493575, 3190087, -8934069, -1148904, -1165010, -6327024, -8999030, -302795, -10004589, 4181151, 4368519, -2997887, 8719320, --3775276, -5207648, -7956964, 5129265, 394063, -1216550, -15091978, 6514929, -3557844, -17388712, --6218039, 4944044, -5624260, -9036074, 5303748, -4943508, 4244502, -9221295, 3582540, -9409200, --2360622, -1510755, 4296578, -2321430, 156229, -3167002, -3990025, 12985834, 23484344, 1470489, --18865106, 8924405, -36849208, -10324565, -33428268, -47303696, 2077154, -18418968, 6514929, -3854733, --6869264, -18218714, -11788075, 10128607, 28740310, -23895050, -4552129, -40904732, -35100084, 9472014, -14777372, -22609782, -22796612, 1130113, 5683853, -38008312, 2531346, 479963, 20110110, -17234630, -1275605, 15913928, -10040560, -19930258, -21405044, -10918344, -19467476, -16711181, -20343112, 28943248, --36629092, -23355496, 34160560, -1379758, 10030359, -28439126, -4363687, -8321499, 1293859, 47091632, --6164352, -1225676, 5236102, 21910238, 1074279, -21280490, -8743480, -15423764, 5663988, 56417616, -11592117, -20272246, 43300248, 30594126, -26865020, 31565862, 52837760, 168577, -19825032, 35291748, --5606543, 37146100, 34299072, 2559801, -1175747, -10321343, 24124832, 18878528, 11482595, -20241644, --6066642, -13156559, 30407832, -4035122, -19925964, -10238128, -20032802, -9119289, 20990042, 2077690, --10176388, -3892851, -12585865, -2442226, 18830748, -9027484, 5069672, -2047089, -16832514, 18647138, -2863670, 7363185, 9735617, -12355010, 4348118, 17134772, -2504503, 501437, -8702677, -214212, -2020782, -5875516, -4639102, 3111704, 13490492, -8422431, 5716602, -11186779, -4633196, 513249, --3036542, 12521440, -4224101, 416075, 1862942, 4501663, 1076426, -6158983, -765041, -3537979, -26796300, -67444944, -40074192, -43944496, -14557255, -29390462, 36430448, 13323525, 29928942, -4732517, --56892212, -9068287, 9577240, 39005284, -1331977, 8790724, 36429376, -13873818, -25883084, 2313914, --1478006, 45304924, 29987998, -15294915, -20471962, 48132624, 3668439, 23882166, 11953431, 44857176, -39344584, 29730838, 3421478, -25992068, -13691282, -19972672, 38042672, -18632106, -25650618, -14587856, -1574106, -1578401, 16920560, -16952772, 6195491, -77420008, 8806294, 11380053, 12811351, -32731408, --29650306, 8594230, 27237072, -33798172, 13069049, -19497004, -14576582, -22927610, -1875827, 22982906, --15723875, 25302726, -6503654, 9496710, -47841640, -31508416, -1127429, 24770688, 17877264, -35578436, --37526204, -18174154, 3579318, 39118024, 16450262, -4585952, -27969900, -33065880, -10971494, 5969468, -28192166, -3275986, 9337259, 18080202, -7246147, 6001680, -18722836, 10755135, 6607807, -12404402, --9664750, 163746, 14413910, -14781667, -633508, 22169010, 3526705, 2467459, -99858, -7492571, --15796890, 3082713, -17546552, 19498078, 17382806, 12362526, 1410897, -2607045, -20580410, 11901891, --4324495, 22823994, -5997385, -27972048, -16841640, -4389994, 25966298, 6321118, -5907728, -3760781, --21430814, -11297375, -8847633, -2396055, 11494406, 10273025, -21691732, -12921409, -13466333, -13953812, --5084705, 2784213, -2289218, -8521752, -13506062, -14590004, 1213865, -1995549, -7152731, 12634720, -86019072, 9521406, -47151760, -103507104, -10263898, 62524524, 14716169, 27675158, -3683471, 38301444, --7168301, 17229798, -9568113, 21999360, 29198798, 16716013, -15426986, -33726768, 39638252, 46649788, --11205570, -44850732, -28569048, 5425618, 25645250, 9469866, 8639864, 2340220, 5912023, 3690451, -5848672, -8310762, -53594748, 325344, 31754840, 25697326, -11230803, 3153043, 19218904, 44557064, -26146150, 22149146, -26749056, -17500382, -5272073, -4190814, -40153112, 28413894, 15686294, 29487634, -58237608, -29826938, -20313584, -2168959, -17196512, -13642427, -26633630, 46336792, -28581396, -29423210, --31601296, -10215043, 57713088, 15481210, 22011708, -744640, -5680631, -13040594, 35605816, 29879550, --15819438, -33681672, 11070815, -3999688, 13358959, -31568010, -13201119, -18178986, -24992414, 15239618, -23444078, 4949413, 234613, -12477417, 6503118, -4628901, 21750788, 2201171, -8360691, -4049081, -6809671, 14777372, 15181099, -8827768, 9188009, 5501316, 4461398, -383863, -17499844, -1875827, --14310831, -5134634, 180926, 2597918, 4024921, 5187247, 5062693, 14981920, 21153250, 19714974, --2328946, -4551055, 1945083, -9306657, 11443403, -13191455, -2119566, 11074573, -1151051, -2486786, --22238804, 11025718, -22178674, 7364795, -5333813, 3550864, -2349347, 2570538, -1466195, -13424457, -7122667, 6719477, -1548873, 4524211, -1181116, 3849365, -2185065, -3568581, -1045288, -1199907, -387621, -792421, 440234, 380105, -4894115, -2135673, -1187559, 2762738, 629750, -1434519, --2834142, -2985002, -149787, 681826, -1438277, 53150, -1887101, -578210, -2106145, -24770150, -1938104, 66831840, 50955492, 8282845, 3606162, -35897336, -69956968, -60684668, -30140470, 50235548, -54354420, 57013008, 31121870, -8089034, -36495948, -33167884, -22290880, 14517526, 21804476, 39082592, -3182571, -29329794, -25402048, -5237713, -25453586, -11440719, 5067525, 40457520, 56983480, 37417220, -17310866, 16508244, -36407364, -4042638, -72764800, -80631032, -51093468, -24177444, -22660248, 38006164, -58741732, 65831648, 58848032, 51592220, 20809654, 3673271, -25298432, -6621229, -40463960, -70664024, --6369974, 6812892, 6381248, 23736136, 13510357, 24078124, -79897128, -43162272, -28910498, -45767708, --20062866, 34269544, -20870856, 23153632, 2603824, -20726976, 16339666, -17280800, 18434000, 22385370, --17477832, -33833604, -70900784, -67900208, -51468740, 25156160, 8156143, -9502615, 12512313, 3926674, --397284, -32276680, -23509040, -60274496, -20738250, -22057342, -3107946, 44515188, 46649252, 7189776, -23750096, -14395120, -33512556, -58617176, -39511552, -36106716, -1994476, 18281528, 9568650, 14955613, -15053324, -10565083, 8825621, -9943923, 9176734, 2786897, -1125818, -1843078, 7432978, 7566659, -14878840, -3244848, -4487167, 15001784, 12927852, 2964601, -5480379, 11759620, -119309360, -60833916, --31849866, 40246528, 9195525, 153073168, 156662160, 118302728, 152738160, 160276368, 145409344, 104582456, -94716912, 105336760, 41785736, -6118718, -65190088, -100480760, -139128480, -134955392, -201452224, -122057064, --79568568, -63006632, -89864136, -47113644, -13028783, -67160944, -52323976, -55054500, -12548284, -33013266, --11874511, -44739064, -22854058, 26861800, 27622546, 8393977, -8352638, 29263222, 23536420, -67754184, -14044543, 46009300, 100413648, 73819752, 95597920, 39356932, 37953552, 159487168, 86237040, 163203392, -54554676, 153072640, 105552040, 133657768, 180063280, 170729248, 138299024, 155481568, 172550304, 187961728, -160385888, 185284352, 126290832, 187939712, 150763552, 133922984, 142627808, 78012176, 159681520, 77401216, -46859704, -58645096, 3831111, -86686936, -97592928, -149089584, -176182784, -270648448, -264419120, -249642288, --233574816, -220045136, -186074096, -226881648, -279401056, -275435712, -228578704, -241840480, -227540928, -228216304, --194886832, -212116624, -203505744, -151722944, -167687328, -128749696, -120354648, -110850960, -70779984, -91317448, --20917564, -33929168, 15564961, 21195664, 66430796, 98413808, 103022840, 119105888, 105656192, 159401264, -180569552, 179025504, 206770464, 216062624, 213958096, 163228080, 145611200, 127885872, 118441776, 115426712, -118368224, 111352392, 84659712, 54601920, 61908732, 47909824, 37137508, 24814710, -19449222, -25184078, --26603564, -32422708, -39746700, -44625784, -31571768, -34623340, -27844810, -28302224, -24712704, -17761300, --21416318, -17484812, -17161616, -20827370, -19353122, -21348134, -17069274, -14030584, -18937584, -21628918, --9842454, -4809827, -6780680, -6110128, -1192390, -1637993, -3699041, -3831648, 1607392, 7614977, -8061654, 8319889, 8273718, 7771744, 11042361, 11637751, 11705933, 8059506, 5695127, 4402342, -7358890, 7926899, 4695473, 1319629, 1571421, -1038308, 3386582, 2667712, 2806761, 2032593, -2815351, 2374043, 2372433, 5411659, 10991358, 7640210, 8026757, 7113003, 8857296, 8302172, -6351183, 3989488, 3930432, 1739462, 1496796, -2151779, -4176319, -7874286, -7199439, -11671574, --14554034, -15828565, -16342887, -18933826, -18862422, -19845434, -19585588, -19192598, -20475720, -20874078, --19996830, -18028662, -15984258, -14809584, -10718628, -9844065, -8116415, -7822209, -3862249, -2450816, --21475, 1051193, 2760053, 3244311, 5326833, 5631239, 6084358, 4725001, 4923643, 3707094, -3661460, 2369211, 2406792, 1288490, 1366337, 364535, 533113, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-13877039, -1143535, -2240899, -1867774, 176631, -2287070, 833761, 1379758, 5645735, -1895691, +-259846, -5215701, 353261, 5281736, 332860, 3821984, -1156957, 1613834, -2233920, -3289945, +75162, 3631395, -501437, -4517232, -224949, 4400194, 1392106, -1868311, -1605244, -195958, +-642635, -1015760, 12885, -733903, -1549946, -185220, 860067, 620086, -241592, -3446175, +5090073, 6995965, 183073, 817118, -2867428, -1603097, 512175, -3650185, -4093641, 2421288, +-3333968, 2391760, 3058554, 3087008, 1115618, -470836, 793495, 641561, 2289218, -5029944, +390842, -654983, -3700651, -4955856, 102005, 2463701, -1927904, -271120, -617938, -359167, +3445101, 1718524, 424128, 1353989, -1181653, -4085588, 1539209, 645856, 3444027, -4202089, +-3216931, 2346663, -1917703, -889595, -3163244, 688805, -1877438, -1721208, -2147, -1385127, +-1531156, 387621, -849867, -398358, -1738388, 1021665, -257698, 74088, -499827, 828392, +-210453, 250182, -351650, -294205, -30602, -581431, -79994, -12768401, -2916283, 4861903, +-682363, -3982509, 1676648, -9486509, -3616363, -1436130, -1690070, -4940823, -5133560, 2710124, +4281009, 3600256, -4800700, -7156490, 811749, -4219269, -7556458, 1662152, -471910, 2072322, +8513699, -2869575, -888521, -5440650, 7357816, 498216, 3675955, 2462627, 6042482, 2998424, +1875290, -6056978, -669478, -5574868, -1508070, 170188, -2301566, 1779190, 1573032, -2674154, +-5098663, 3184182, 5338108, 1428077, -2524367, -4016331, -2434710, 1192927, -4427038, -5697274, +-1585380, 2713346, -1537061, 1301912, 3554622, 2163053, -2608119, 5056787, 479963, 4296578, +-3636764, -3151432, -1760937, -2222109, 3073586, -1786706, 207769, 5106179, 1869385, 59056, +-4871030, 1264331, -1924682, 3561065, 5306432, -979789, 469225, -2478196, 2033667, 4573067, +-1611687, 2823941, 1350767, 545998, 2428804, 883153, 157303, 1839320, 765041, -221191, +54224, 775778, 816044, -927176, 687732, 576599, 1024887, -665183, -2612951, 3293703, +4502737, 1845762, -2834142, 1992328, -1334124, 1387811, 8481487, 5259188, -7174743, 4891968, +-3949223, -1919850, -1040456, 171262, 3607236, 165356, 9927280, 2899103, -3810173, -2471754, +-2471217, 7024419, 1647120, 6767795, 2212445, 4568772, 7028714, 8093329, 3069828, -871878, +-799401, 1254667, -6449967, -5967857, 1927367, -4519380, 2601140, 1288490, -1535988, -629213, +1904818, 6768332, -2190970, -2238215, -3444564, 8636642, -1147830, -10663330, -5328981, -4197257, +-3880503, 4475893, 4270808, 3792456, 5617281, 2538326, 3529390, -101469, -314606, -102005, +5653251, 1887638, 3327526, -7396471, 513785, 404264, 430570, 554588, 3272228, 2336462, +969589, -3547643, -3566970, 2158221, 1773822, -995359, -190589, -2840047, -3663607, -2951180, +2094870, 3654480, 476205, 282394, 1289027, -959925, -88584, -740882, 692027, 714575, +418759, -411243, 1121523, 1804423, -205085, 257698, 430034, -184684, 506269, -618475, +1307818, 103079, -187905, -714575, 1164473, -2063732, 1276142, 456340, 976568, -56908, +-1222455, 352724, -561567, 18983756, 4050154, 3003793, -2382096, -1180579, 1745904, 1446867, +4946192, 6780143, -389231, 9922448, 3824132, -3331284, -3318936, -124554, 4603131, -430570, +-2642479, 5307506, 644245, 14250165, 3615289, 2916820, 498216, -1245541, 581968, 2256469, +2655901, -523986, -55298, 7698192, 976031, 8462159, -4282620, -3896609, 2669322, 12646531, +3546032, 3141769, -1171452, -5306969, -2215130, 1806571, 287763, -12885, 374199, -7580618, +459562, -3274376, 2995203, 2535641, -3121904, 1877975, 2612951, 1920387, -3699041, -3605088, +798864, 1418950, -73551, -4666482, 1163399, -1752884, 2976949, -336618, 511101, 2046015, +-820339, 1176284, -1787780, 625455, 10915659, 1347546, 3813394, 231928, -3114388, 1907502, +572304, 3507378, -6203544, -4165045, 2007897, -798864, 1172526, -1496259, 2245731, 2051384, +161598, -2613488, -1109712, -3591130, -741419, -753230, 2284386, -1606318, -535797, 494995, +-410706, -793495, -972273, 781684, -1027571, -1147293, -99321, 136902, 579821, -2406256, +-1054951, 719944, 277025, -2629057, -745714, -95026, -3578782, -1388348, -459562, 2841121, +-4218732, -656056, 4169876, -2075543, -6615860, 25770, 10764799, -682363, 8441221, 4420058, +11699491, 1484448, 1048509, 4341675, -3350075, -6941204, -9258876, 2237678, -4733591, 10901701, +6159520, 7721815, -1472100, -3119220, 928787, 1785096, 3555159, 10209674, 1191853, 4293357, +-4656819, 3298535, -3308736, 1453310, -1791538, 3406446, 5791227, 851477, 5533529, 2101850, +2763812, -1539746, -1352378, 7486128, -1743220, -1790465, 5580773, -3278671, -323196, 864899, +-2454037, -3178276, 2469606, -3654480, -716186, -4683662, -10138270, -1070521, -1542967, -199179, +-10561861, -3967476, -3223910, -2670396, 3971234, 10470593, -2649458, 3408594, 5444408, -1453846, +1027571, 985695, 622770, -3725884, 4144644, -4743255, 1263257, 3520800, 9759239, 3113315, +2896956, 951872, -118112, 3007551, -3513820, 35970, 2024540, 1019518, 186831, -3882114, +2370822, 2944200, 2909304, -481036, 2171643, 1239635, 627602, 2029372, 1155346, 302258, +1132798, -204548, 885837, 624381, 751619, 1203128, 1447404, 1748052, 1193464, 1196148, +1292785, -677531, 1174137, -13617194, 1096827, 7455527, 3787624, -7599945, -669478, 449361, +1724429, 2905546, -530965, -5897527, -5820755, 976568, 9625559, 4703526, 5673115, 9859097, +-6702834, 7057705, 12816182, -1107028, 2822331, -7240778, 2427730, 2716030, -6362994, -3308199, +-1438277, 3041374, -6426345, -8304856, 1523103, 981937, -7259569, 629213, 2190970, -1412507, +15219217, -822486, -10908680, -695785, 3674345, 8651675, 3107946, 3897683, -7016366, 1952600, +2128693, -6168647, -470836, -1030255, 10555956, 6521908, -1825361, -3627637, -8286603, 3562139, +3238405, -4843113, -225486, 1983201, 3161633, 3316252, -4245575, -108448, -969589, 9971303, +-8428873, 1035624, -2235531, 8978092, -697395, -2190970, -3815005, 1126892, -3945464, -9136469, +203474, 6948720, 2030446, 4355097, 1037772, -3293703, -1355599, -1663226, 5871757, 2347200, +-1652489, -224412, 5330592, 4013647, -1559073, 571768, 805306, 1153199, -143881, 2147484, +1453310, 1310502, 99321, -759136, -380641, 420907, -806380, 249108, -1109175, -363462, +847182, -2802466, -692027, 5303748, 4654671, 1755031, -3578782, 1050120, 2174327, 16126528, +10557566, 8049843, 11200201, 4626754, -1087164, 1655173, 4069482, -11362336, 5730023, 200790, +6165426, -4571456, -2455648, -7329362, 1954747, 12961674, -12802224, -8031589, -13605383, 6825777, +-3218541, 426276, -6280853, 783295, -2442226, -6144488, 2180770, 2989297, -9738301, -1327682, +1561221, -2134062, 4879620, -13907641, -6901476, 14171781, 1240709, -280247, -1593433, 468151, +-7406134, -7695508, 257161, -11183021, -2772402, 1082869, 2783139, -4835060, -1309428, 13790603, +-1102733, 4808753, 10081362, -9639517, -3548717, 2200634, 2220498, 1792612, -3160559, -6911140, +7635915, -926639, -7539278, 5313949, -1540283, 1197222, 1821603, -4013647, -2617783, -1739999, +-3214783, -4349728, -5377299, -5019206, -6544457, -1986959, -2901787, -703838, -1048509, -159988, +602906, -2681133, -2294050, 1405528, 1524713, 2801393, -392453, -1264868, -3955128, -1146756, +-4537633, -2842732, -814970, 746787, -548682, 484794, -1326071, -738734, 2965138, 1137093, +1983201, -2262911, 328028, 419296, 598611, -4483409, 85362, 1197759, -235149, 2225867, +-610959, -790274, 237834, 623307, -26830660, -14705968, 11905112, -4511327, -5820218, 7429757, +6207302, -11276437, -15547245, -4813585, -5646272, -5671505, -1181116, -10480257, -7777112, 3995393, +282394, -14142790, -15851114, -8695161, -4440460, -684510, 7919383, -471373, -6002217, 4526896, +-13216688, 500364, -743029, 660888, 4439923, 2612414, -9664750, -7073275, 5592048, 2100776, +21144660, 5313949, -7212324, 1052804, 565325, 302795, 5491116, 1156957, 2221572, -2107218, +-4799626, 1463510, -12355547, -2212445, -5454609, -6400038, 1291711, -9665824, 11225434, -1393717, +4624069, 8181376, 2291365, 4366908, -644782, -5203353, -336618, -614717, -6660421, 8578660, +-3638911, 15217606, -606664, -287763, 600222, -3876208, -8312373, 2615635, -6543383, -2554969, +8779450, -11410654, -11370389, 7610682, 7092602, 6220187, -9646497, 6947110, 2782602, 4073240, +-377957, 1814087, 1789928, 5413807, 2204929, 1371168, 3896072, -475131, -323733, -3206193, +-2610266, -468688, 2633352, -3447248, 409096, -347892, -2127620, -1213865, 832687, -4452271, +-2816425, -3307125, -650688, 1510218, -79994, 3397856, -1174137, 3551938, 252866, 1356136, +506269, 2763812, -2149094, -1646583, 3073586, -1362042, 380641, 291521, 5387500, 19833622, +-11080479, 9474161, 3858491, 7077033, -2828773, -10711112, 1522566, -2757369, -10084046, 20471962, +-1450625, -5596343, -20121384, 12437688, 3423626, -144955, -7522635, -8617315, 224949, 20798380, +7706245, -721018, -2049773, -8801999, -7242926, 6069326, 2642479, -6862284, -4897337, 7321309, +1803886, -205085, 6211060, 9659918, 1502165, 12723304, 14319958, 8791261, -3304441, 3257196, +1168768, 2465848, 7472170, -10510859, 11166915, -665720, -5677410, -8499203, 52076, 7439420, +5136244, -10047002, 2227478, 8135205, 1235340, -7244536, -15862388, -14318347, 3808026, 6495601, +1077500, -5480915, -740345, 11643119, -5282810, -8580808, -16747151, 1890859, 3260954, -12378633, +4705137, 12619151, -5675263, 9844065, 3389803, -11450920, -8568460, 1024887, 11903502, -1107565, +12505334, -2040646, -4362076, 2758980, 6385006, 1826972, -2114735, -3221762, 2159832, 5777268, +4601521, 908922, 7438884, 1509681, 5343476, 1459215, 7299834, 1236414, 4516695, 64961, +3614215, 2075543, -1773285, -5179731, 481573, -6078990, -846109, -2402497, 999654, -668404, +-214748, -5376762, -493384, 2734284, -2675228, 511101, -629213, 545461, -340376, -3840238, +636192, -689342, 23946590, 15640660, 3629784, -4846334, -2500745, -3403762, -16343424, -6692633, +-155693, 10410464, -7480760, -4278325, -3467112, 119185, 17334488, -13489955, -3537979, -804233, +8172249, -2868501, -9857487, -16668768, 6008123, -11536282, -5185100, -7219840, -7678328, 2373506, +-12939126, -6381785, 11610370, 17220134, 867047, -10880763, -9568113, 15876347, -1702418, -8698383, +16721918, 453656, 1107565, 638876, -18061948, 7321846, -6635725, 6535330, 6191196, -12401718, +-1251983, -12578885, 4959077, -12200391, -1969779, 5022965, 7000797, -4117800, 4295504, -14791867, +10242960, -1208496, 7022809, 5744519, 4307316, -3333432, -2975339, 14618995, -10043781, 7228967, +-2379949, -12564927, -7427609, -898722, 13314935, -7617662, 6305012, 1709397, -3941706, 104690, +-14574435, 18524730, 11559904, -2261300, -4922570, 9045201, 4088809, -2747169, -4628364, 965294, +-3035468, 4629975, -830539, 2403571, 7866233, 2708514, 6262599, -74088, 2326262, 841814, +-976031, 97711, -403727, 5216238, 2250026, 7263327, 1401233, -4173098, 5519570, -2205466, +24159, 3947612, -3680787, -1341104, -1854889, -1712081, 3497714, 1955284, 1909650, 2859911, +-152471, -891206, 7030325, -2370822, -2157147, 9166534, 1962263, -6359236, -14010720, -950798, +-18262200, 2998424, 1817845, 8843338, -7188165, -1934346, 4957466, 3804804, 5435818, -12651900, +17819820, 12341052, 2480881, 9079561, -3996467, -17948132, 4371740, -7657390, -8150238, 8204462, +20625506, 3408057, -5465346, -7585986, -16228534, -134755, 938987, 25054692, -9752260, -563714, +931471, -934155, -15020038, -17314086, 13749801, 368830, 7889855, -2370822, -19246286, -11349451, +1726577, -3412352, -3932580, -5708549, 12886513, -2845953, 8432631, -9069360, 17880486, -21069498, +10525891, 10683731, 6643778, 5575405, 5416491, 16384763, 8675297, -1357747, 3704409, -25770, +16519518, 24408836, -2659122, 1808718, -7045894, 10125922, 16667157, -11434277, 3638911, -28576564, +18751290, 19038516, 12976707, 17702244, -7965017, -14394046, -851477, -2211908, -4039954, -3131031, +-8376260, -6078990, -2989297, -885300, -4610111, 2733210, 5393405, 1901060, -7861938, 1479616, +-4292820, -4816269, -2797098, 3233574, 3262028, -1518808, -1831267, -811212, -1225676, 766115, +-7603703, 2492155, 1292248, 4942434, 1291711, -421444, -60130, 1022202, 4569845, 1444720, +-3857418, 3136937, 168041, 396211, -20685100, -3058554, -26454852, -13572097, 10397042, -10828686, +-23527830, 2183991, -12691091, 583579, 447750, -15084999, -14345191, 6483253, 13839458, 4177930, +-16109349, 7702487, -18118856, -6351183, -6679748, 5668820, -7449084, -3393024, 8697846, 1487132, +-5966784, -12894029, 13646722, 13237626, 17199196, 2246805, -1919850, 608812, 5508833, -1300838, +7051800, -7762080, 9273371, -3651796, 10683731, 8571681, 6448894, -3105261, 441845, -16626892, +5657546, -4185983, 12505334, 2275796, -29072634, 4466229, 14328011, 19275276, -11088532, -15146202, +18127984, 8230768, 12745315, -22705882, 11225971, 28426242, 29940754, 1906429, 710817, 17038672, +-11792906, -15712601, 10065256, -17396228, 6531572, -8101382, -6847252, -3841848, -37473588, -21638046, +-18250926, 13464722, 5107790, 3786551, -13312788, -5413270, -10057740, -1902671, -5403606, 14716705, +3496640, -5851356, -13074954, -2909840, 8465381, -1350230, -3616899, 2601677, 8861591, -3154117, +-5237176, -2509335, -1943473, -601295, 6892349, 6925635, 6016176, -6077379, 7885560, -399969, +2253784, 9015673, -4050691, -4065187, 7859790, 14110041, -3299609, -4605816, -2246805, 1698660, +-2543695, -9718974, 1569811, 7099581, 1915019, -9786620, -9374303, 4422206, 3178813, -522912, +-599685, -1709934, -6970732, -4772783, -15569256, -29901562, 22863184, 2387465, 7682086, -3882651, +16193637, 419296, -13795972, 10670309, 4355634, -4900558, -8324184, -6543383, 2065879, 3888019, +14343043, -8175470, 11257646, 3569118, 20447802, -29343754, -7864085, -4662724, 3783866, 11959336, +17380658, 3930969, -14103062, 9513353, 13675176, 11491185, -3212099, 3999152, 834297, -4833986, +-1967095, 816044, 4428648, 1574642, 10110890, 1648731, -12745315, 11892764, -13215077, -16895328, +2626373, 12181601, -5931887, -4399121, 4436701, 5934034, 10518912, -6028524, 4987531, 23732916, +-9479530, -25266218, -32697050, -16547972, -22155052, 10038412, 19226422, 12272332, 4698158, 11541651, +6796249, 12758200, -10947872, 14424111, 7504382, 5835250, 15056008, 19541564, -6095096, -4400194, +5342940, -1317481, 17608830, 6789807, -2697240, 2937221, -21496312, -15065135, 2970507, -884763, +3812320, 1410360, 4507032, -4057670, 11316165, -6026376, -6924561, -6722161, -11314018, -4146254, +-2247879, 3666828, 3004330, -1739462, -9722195, -614717, 3200288, 1031866, -3912178, 2247879, +119185, 3699578, -4079145, 1615445, 765041, 4470524, -2180233, 6908455, -4329864, -5024038, +1457068, -904091, -3652870, 1092532, 4793184, 349503, -761820, 29894046, 2917357, 4668093, +-6183679, 10839424, -34195456, -15135465, -23363548, -24169392, 9609452, -21096342, 20732344, 23538568, +1058710, 5076115, -3605088, 4277251, -22357990, 9160628, 24790552, -14150843, -28792388, 3769371, +-10814728, -9235253, -28085864, 4821101, 10343355, -159451, -3793530, 8988293, -16010564, -2724620, +10447508, -5807870, -14189498, 1660542, -7074348, 14624364, -9713069, -5465346, 13769128, 11866995, +25411174, 3295314, 6145562, -2407866, 6832756, 8972187, 15701864, -4599373, -503585, -9831180, +20709258, -26169772, 28037546, 915365, -11164767, 13047574, -10180683, -7589207, 25784836, -37305012, +6076305, -7944616, 7285339, -14533096, 6955700, 14665703, -7644505, -1464584, -3928821, -6266358, +-3308199, 27327266, -31120796, -10734734, 52306260, -19803020, -23095650, 22532472, 13540421, 15000173, +-13182865, 925029, -13105556, -7450158, -2068027, -15075335, 3260417, 1896765, -3913789, 5261872, +4799089, -6903086, -12742094, -3401077, -1091995, 4869419, -11250667, -8016020, 273804, -1260573, +2809446, 6867653, 16632261, -7719130, -404801, -1968706, -1768990, 4642860, 1853278, -10058813, +-7504919, 7806103, -6481106, 2850248, 2025614, -6193880, 2268817, -1547799, -10162429, -8475581, +4940823, 3095061, -1563905, -361314, 6300180, -14996415, -22873922, 2122251, -8605504, -7895224, +-12830141, -16316581, 20547124, 8688182, 1404991, 9488656, 24317032, 14203994, -1554241, 4838818, +16383153, 20671140, -18332532, 8511551, 17495012, 7470022, 6478958, 23891292, 11668889, 4910222, +-622770, 10700374, -1097901, 12122008, 10201621, 5432060, -11122355, 21128554, -17331804, -2269890, +26671746, 26175678, -6142340, -23369990, 8877161, -440771, 22899692, 39134132, 8876087, -6090801, +2887829, -22585086, -2543695, -6027450, -4722854, 371515, 20129438, -8667244, 8923868, 24005110, +4205847, -22353158, 14856829, -1213865, 9493488, 22554484, 31983010, -9062381, -8333311, -2804614, +-25125558, -37031208, 1129040, -16878684, -2601677, -20446728, -1972464, 590021, 2897492, 15063524, +-302795, -10596758, -17390322, 12736726, -5278515, 10890963, 529892, 20338818, 7691750, 7472170, +204548, -6396280, 11586748, -8793946, -9994926, -3102577, -7481833, -2998424, 715649, 762357, +-2601677, 3093450, 4629975, 330176, -1022202, 5898064, -4968741, -7274601, 4561256, 5193689, +1182727, -6290517, -7386807, -4421132, 6201933, 8127689, 1209033, -1177895, 9175124, 2450816, +4451197, 3726958, 6601365, 1801202, -1050120, -4788889, 2736968, 5133023, -10448582, 8371428, +24996710, -46860776, 25793426, -19752018, -46162308, -13705778, -11622182, -1668595, -10639708, 5572183, +-12761422, -28644748, -17273822, -8591008, -2604898, 3242164, -11775727, 11475616, 22421340, 791885, +-1409823, 6103686, 1374390, -4226785, -8329016, -4739497, 6057515, 6618545, -2001455, 6288906, +27528592, 7530689, -8069707, -27379342, -4383551, 19246286, -23528904, -11113228, -8979166, 220654, +-1823214, 14762876, -4924180, 1708860, 20378010, 7216082, 22607098, -3261491, -10729365, -4986457, +-5851893, -5951751, 10877005, 1101659, 7336878, 13715441, -24322936, 3476776, -6479495, -15197742, +-11453067, 23614804, 17019344, 767189, -11643119, 4697084, 9944460, 940061, 6857989, -16396038, +-40341016, -18757732, -14819785, 14642617, 1416802, -1960653, -6882685, 2783139, -4625680, -12832825, +-13283797, -6987912, 16207059, 12203076, -18283676, -22841710, -8980240, 1479079, 13701483, 5479842, +-4502737, -6208375, -4780836, 3107946, -10190347, 1396938, -6995965, 471373, 10300942, 11003706, +2832531, -5861557, 3470871, 7897908, -382252, -1833414, 5811628, -8275328, 11241540, 10078141, +3838627, -303869, -598611, -1261110, 9398462, -3854733, -5163088, -5862094, -8310762, -8139500, +2443300, -3079492, 3325379, -2421288, 1588064, 5893232, -3096135, -5920613, -8577050, -2461553, +3763465, -6118181, 13143674, -18101676, 21843666, -1401770, -35512936, 7548405, -17321066, -3134253, +-2928631, -3788698, -22760106, 7406134, 780610, 18095234, -38646652, 979789, 18466212, 2627983, +-9475772, -19005768, -1906429, 11451457, 16109349, -13369696, -5297306, 9255655, 18461380, 17567490, +-17047262, -3064459, -27383100, 12896176, 13273596, 8797704, -8105140, -1794760, -7761006, -2557653, +-9416179, 2900714, 19243600, -6993281, -8179229, -6458557, -11591580, 22619446, 18757732, -1593433, +26589606, -950798, 9161165, -23596014, 19144280, 8971650, -27295590, -8424041, 30273076, 12993887, +7862475, 6222334, -14933601, -11160473, -15983184, 26912266, -14287209, 20834350, 20842940, -23986318, +55497956, -11787001, 34226596, 1716913, -8371428, -14806900, 25577604, 10255845, -20764020, -12193949, +-44030396, 17569638, -6509023, 20170240, -27324582, 30086782, -23494008, 8978092, -9454834, -6732361, +19127636, 1968169, 1259499, 11084237, 7097434, -4934918, 12328704, -1493575, 3190087, -8934069, +1148904, -1165010, -6327024, -8999030, -302795, -10004589, 4181151, 4368519, -2997887, 8719320, +-3775276, -5207648, -7956964, 5129265, 394063, -1216550, -15091978, 6514929, -3557844, -17388712, +-6218039, 4944044, -5624260, -9036074, 5303748, -4943508, 4244502, -9221295, 3582540, -9409200, +-2360622, -1510755, 4296578, -2321430, 156229, -3167002, -3990025, 12985834, 23484344, 1470489, +-18865106, 8924405, -36849208, -10324565, -33428268, -47303696, 2077154, -18418968, 6514929, -3854733, +-6869264, -18218714, -11788075, 10128607, 28740310, -23895050, -4552129, -40904732, -35100084, 9472014, +14777372, -22609782, -22796612, 1130113, 5683853, -38008312, 2531346, 479963, 20110110, -17234630, +1275605, 15913928, -10040560, -19930258, -21405044, -10918344, -19467476, -16711181, -20343112, 28943248, +-36629092, -23355496, 34160560, -1379758, 10030359, -28439126, -4363687, -8321499, 1293859, 47091632, +-6164352, -1225676, 5236102, 21910238, 1074279, -21280490, -8743480, -15423764, 5663988, 56417616, +11592117, -20272246, 43300248, 30594126, -26865020, 31565862, 52837760, 168577, -19825032, 35291748, +-5606543, 37146100, 34299072, 2559801, -1175747, -10321343, 24124832, 18878528, 11482595, -20241644, +-6066642, -13156559, 30407832, -4035122, -19925964, -10238128, -20032802, -9119289, 20990042, 2077690, +-10176388, -3892851, -12585865, -2442226, 18830748, -9027484, 5069672, -2047089, -16832514, 18647138, +2863670, 7363185, 9735617, -12355010, 4348118, 17134772, -2504503, 501437, -8702677, -214212, +2020782, -5875516, -4639102, 3111704, 13490492, -8422431, 5716602, -11186779, -4633196, 513249, +-3036542, 12521440, -4224101, 416075, 1862942, 4501663, 1076426, -6158983, -765041, -3537979, +26796300, -67444944, -40074192, -43944496, -14557255, -29390462, 36430448, 13323525, 29928942, -4732517, +-56892212, -9068287, 9577240, 39005284, -1331977, 8790724, 36429376, -13873818, -25883084, 2313914, +-1478006, 45304924, 29987998, -15294915, -20471962, 48132624, 3668439, 23882166, 11953431, 44857176, +39344584, 29730838, 3421478, -25992068, -13691282, -19972672, 38042672, -18632106, -25650618, -14587856, +1574106, -1578401, 16920560, -16952772, 6195491, -77420008, 8806294, 11380053, 12811351, -32731408, +-29650306, 8594230, 27237072, -33798172, 13069049, -19497004, -14576582, -22927610, -1875827, 22982906, +-15723875, 25302726, -6503654, 9496710, -47841640, -31508416, -1127429, 24770688, 17877264, -35578436, +-37526204, -18174154, 3579318, 39118024, 16450262, -4585952, -27969900, -33065880, -10971494, 5969468, +28192166, -3275986, 9337259, 18080202, -7246147, 6001680, -18722836, 10755135, 6607807, -12404402, +-9664750, 163746, 14413910, -14781667, -633508, 22169010, 3526705, 2467459, -99858, -7492571, +-15796890, 3082713, -17546552, 19498078, 17382806, 12362526, 1410897, -2607045, -20580410, 11901891, +-4324495, 22823994, -5997385, -27972048, -16841640, -4389994, 25966298, 6321118, -5907728, -3760781, +-21430814, -11297375, -8847633, -2396055, 11494406, 10273025, -21691732, -12921409, -13466333, -13953812, +-5084705, 2784213, -2289218, -8521752, -13506062, -14590004, 1213865, -1995549, -7152731, 12634720, +86019072, 9521406, -47151760, -103507104, -10263898, 62524524, 14716169, 27675158, -3683471, 38301444, +-7168301, 17229798, -9568113, 21999360, 29198798, 16716013, -15426986, -33726768, 39638252, 46649788, +-11205570, -44850732, -28569048, 5425618, 25645250, 9469866, 8639864, 2340220, 5912023, 3690451, +5848672, -8310762, -53594748, 325344, 31754840, 25697326, -11230803, 3153043, 19218904, 44557064, +26146150, 22149146, -26749056, -17500382, -5272073, -4190814, -40153112, 28413894, 15686294, 29487634, +58237608, -29826938, -20313584, -2168959, -17196512, -13642427, -26633630, 46336792, -28581396, -29423210, +-31601296, -10215043, 57713088, 15481210, 22011708, -744640, -5680631, -13040594, 35605816, 29879550, +-15819438, -33681672, 11070815, -3999688, 13358959, -31568010, -13201119, -18178986, -24992414, 15239618, +23444078, 4949413, 234613, -12477417, 6503118, -4628901, 21750788, 2201171, -8360691, -4049081, +6809671, 14777372, 15181099, -8827768, 9188009, 5501316, 4461398, -383863, -17499844, -1875827, +-14310831, -5134634, 180926, 2597918, 4024921, 5187247, 5062693, 14981920, 21153250, 19714974, +-2328946, -4551055, 1945083, -9306657, 11443403, -13191455, -2119566, 11074573, -1151051, -2486786, +-22238804, 11025718, -22178674, 7364795, -5333813, 3550864, -2349347, 2570538, -1466195, -13424457, +7122667, 6719477, -1548873, 4524211, -1181116, 3849365, -2185065, -3568581, -1045288, -1199907, +387621, -792421, 440234, 380105, -4894115, -2135673, -1187559, 2762738, 629750, -1434519, +-2834142, -2985002, -149787, 681826, -1438277, 53150, -1887101, -578210, -2106145, -24770150, +1938104, 66831840, 50955492, 8282845, 3606162, -35897336, -69956968, -60684668, -30140470, 50235548, +54354420, 57013008, 31121870, -8089034, -36495948, -33167884, -22290880, 14517526, 21804476, 39082592, +3182571, -29329794, -25402048, -5237713, -25453586, -11440719, 5067525, 40457520, 56983480, 37417220, +17310866, 16508244, -36407364, -4042638, -72764800, -80631032, -51093468, -24177444, -22660248, 38006164, +58741732, 65831648, 58848032, 51592220, 20809654, 3673271, -25298432, -6621229, -40463960, -70664024, +-6369974, 6812892, 6381248, 23736136, 13510357, 24078124, -79897128, -43162272, -28910498, -45767708, +-20062866, 34269544, -20870856, 23153632, 2603824, -20726976, 16339666, -17280800, 18434000, 22385370, +-17477832, -33833604, -70900784, -67900208, -51468740, 25156160, 8156143, -9502615, 12512313, 3926674, +-397284, -32276680, -23509040, -60274496, -20738250, -22057342, -3107946, 44515188, 46649252, 7189776, +23750096, -14395120, -33512556, -58617176, -39511552, -36106716, -1994476, 18281528, 9568650, 14955613, +15053324, -10565083, 8825621, -9943923, 9176734, 2786897, -1125818, -1843078, 7432978, 7566659, +14878840, -3244848, -4487167, 15001784, 12927852, 2964601, -5480379, 11759620, -119309360, -60833916, +-31849866, 40246528, 9195525, 153073168, 156662160, 118302728, 152738160, 160276368, 145409344, 104582456, +94716912, 105336760, 41785736, -6118718, -65190088, -100480760, -139128480, -134955392, -201452224, -122057064, +-79568568, -63006632, -89864136, -47113644, -13028783, -67160944, -52323976, -55054500, -12548284, -33013266, +-11874511, -44739064, -22854058, 26861800, 27622546, 8393977, -8352638, 29263222, 23536420, -67754184, +14044543, 46009300, 100413648, 73819752, 95597920, 39356932, 37953552, 159487168, 86237040, 163203392, +54554676, 153072640, 105552040, 133657768, 180063280, 170729248, 138299024, 155481568, 172550304, 187961728, +160385888, 185284352, 126290832, 187939712, 150763552, 133922984, 142627808, 78012176, 159681520, 77401216, +46859704, -58645096, 3831111, -86686936, -97592928, -149089584, -176182784, -270648448, -264419120, -249642288, +-233574816, -220045136, -186074096, -226881648, -279401056, -275435712, -228578704, -241840480, -227540928, -228216304, +-194886832, -212116624, -203505744, -151722944, -167687328, -128749696, -120354648, -110850960, -70779984, -91317448, +-20917564, -33929168, 15564961, 21195664, 66430796, 98413808, 103022840, 119105888, 105656192, 159401264, +180569552, 179025504, 206770464, 216062624, 213958096, 163228080, 145611200, 127885872, 118441776, 115426712, +118368224, 111352392, 84659712, 54601920, 61908732, 47909824, 37137508, 24814710, -19449222, -25184078, +-26603564, -32422708, -39746700, -44625784, -31571768, -34623340, -27844810, -28302224, -24712704, -17761300, +-21416318, -17484812, -17161616, -20827370, -19353122, -21348134, -17069274, -14030584, -18937584, -21628918, +-9842454, -4809827, -6780680, -6110128, -1192390, -1637993, -3699041, -3831648, 1607392, 7614977, +8061654, 8319889, 8273718, 7771744, 11042361, 11637751, 11705933, 8059506, 5695127, 4402342, +7358890, 7926899, 4695473, 1319629, 1571421, -1038308, 3386582, 2667712, 2806761, 2032593, +2815351, 2374043, 2372433, 5411659, 10991358, 7640210, 8026757, 7113003, 8857296, 8302172, +6351183, 3989488, 3930432, 1739462, 1496796, -2151779, -4176319, -7874286, -7199439, -11671574, +-14554034, -15828565, -16342887, -18933826, -18862422, -19845434, -19585588, -19192598, -20475720, -20874078, +-19996830, -18028662, -15984258, -14809584, -10718628, -9844065, -8116415, -7822209, -3862249, -2450816, +-21475, 1051193, 2760053, 3244311, 5326833, 5631239, 6084358, 4725001, 4923643, 3707094, +3661460, 2369211, 2406792, 1288490, 1366337, 364535, 533113, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { -7670275, --15194521, -2656437, 201327, -3478924, -7151121, -2356863, 5238787, -8405788, -4646081, -2781528, --1647657, 2672544, -1202054, 2975339, 1359357, 2605972, -291521, 3225521, -2813741, 526670, --1235340, 611496, 8109435, -1724429, -500901, -4019016, 5012227, 3113851, 2411087, 6257231, --3199751, -1816234, 2138357, 5602785, -1512365, -372052, -4522601, -4952098, -3314104, 3539053, --4398584, -3769371, -476741, 5040144, -6818798, -1448478, -5697274, -2761664, -1630477, 785979, --513249, -4081830, 5235565, 895501, 4711579, -1902671, -1194538, -5867999, -127238, -2056753, --2213519, 3385508, 1901597, -1049046, 1821066, 3746285, -1065689, 1611150, -2680597, -1545115, --648003, -2525978, 2246268, 784368, 1710471, -4008815, 2880313, 1660542, 6496675, 3866008, --1063004, -4125316, -336081, 901943, 514322, 1286343, -190052, -1395864, 57445, -947577, -9127, -1147293, 411780, -1116155, -73014, 1254131, 424128, 648540, -798864, -559956, -594853, 862215, 392453, -125628, 65498, -16106, 539555, -12516608, -4474282, 3587372, --3293703, -1498944, -1384053, 1686848, -621697, -3308199, 5222680, 4647155, 1571421, -593779, -2429878, -6427956, -922881, -6352257, -3178276, 4671851, -762894, 827318, -622233, -734439, -125091, 9783936, 8982924, 3997541, 4804995, 5666136, -1074279, -658741, -1932735, 4999342, --466541, -1904281, 1428614, -2920578, 2023467, 3597572, -1818382, 4056597, 4611721, 8948027, --3477850, -4227322, 3858491, -2317135, 154082, 1882806, -5177583, 309775, -2695629, -3055869, -6924561, 4050154, 4992900, -2840584, -3712999, 2625836, -4326643, 3056943, 13338558, 749472, -944893, 2987687, 1331977, 1224603, 7607998, -4056060, -994285, 1387811, 1022739, -3775813, --2736968, -3854196, -1793149, -1410897, 3519189, -596464, 3535295, 3582003, -3559454, -3852049, --953483, 2426657, 3412889, -4038343, -744640, -1202591, -2732136, -341450, -2585034, 681289, --132070, 1400696, -759672, 535797, -975494, -262530, -738734, 613643, -3633542, 3935801, -6391985, -3081102, 3173444, 10011032, 3366718, 2273648, -7006166, 5792301, 1538672, -9052717, -3838090, -2557653, -5412733, 2160906, -745714, 2081449, 5254356, -5534066, -5782100, -2599529, -7880191, 197569, 3914863, 8128763, -12116640, -9802189, 1598265, 5951214, -4374961, 363998, -8100845, 2065342, -1037235, -2455648, 9692667, 1164473, -2349347, 1335198, -8777303, 978716, --4836670, 4456566, 792421, 4734665, -2384781, -1210644, 2158758, 125091, 634581, 256087, -4571456, 3654480, -4994510, 2847563, 4047470, -6887517, 828929, -3113315, 1300301, -1592896, --5299453, 68719, 4589173, 3961034, 8844948, -5489505, 6851010, -4540854, -899259, 4039954, --4417374, -6616397, -2374580, 295816, -405874, -353261, -701690, 1291711, 2827162, -3855270, --38118, 1813013, -341450, 1554778, -3134789, -1821066, -1236414, -2327872, 690416, -515933, --1800665, 979253, 1039919, -1532230, -2311229, -137439, -529355, 2381023, -108448, -405874, -449898, 500364, -406411, -732292, 1622424, 521302, -1277216, -665720, -975494, 130997, -1660542, 148713, -566399, 20186346, 9036611, 12232067, -998043, -3371549, -4415764, -4409858, -2397129, -3701725, 5620502, -627602, 7715372, 477815, 4079145, 5081483, 3913789, 3367254, -4439386, -14977625, -4436701, -1397475, -3163780, -2761664, -4722317, -10664941, 477278, 7328288, --4505958, 4405026, -3618510, -5315559, -4023848, 621160, -3395709, -1246614, -3481608, -227633, -8822400, 485331, 3966402, 5592048, 7254200, -3392487, 1700270, -1606855, -5596343, 6373732, --3555159, -242666, -5538361, 4067871, -51540, 110059, -1526861, -2561411, 1879585, 5698348, --2379412, 3219078, 3034395, 2567854, 9770514, -9807558, -4150549, 258235, -5407901, -6992744, --2778307, -8562554, 1291175, 10084046, -6938520, -3291556, -7924215, 533113, -2492155, -3771518, --9290014, 5484137, 7137162, 2844342, 4989142, -2508798, 806917, -1853278, 2072322, 110059, -4938676, -1254667, 2128693, -77846, -1257352, 1741072, 1185948, 2284923, 1902671, -300111, -460635, 1261110, 506806, 989453, -76236, -919660, -1775432, 911607, 471373, -1195612, -885300, 995896, -294742, 448824, 1179505, -331786, -1052804, -370978, -319438, 6200322, -9011378, -5025112, 4716411, -4115116, -1906966, -1676648, -11041287, 7993471, -2298344, -1253594, -12850542, 7889855, 8604430, -3552475, 374736, 1454383, -1925756, 2775086, -6482717, -247497, --4422743, 5151814, -5036923, -3575560, -491237, 814970, -6230387, 1130650, 705448, 8161512, -98247, -11336566, 6525666, 5999533, 8697309, -1455457, 2216740, -6307160, -4659503, -2047089, --4523138, 1707786, 1225676, -1782948, -650151, 4626754, 7370701, -10129143, -2137820, -90194, --4086662, -4377109, 6669548, -5430450, 2537252, -5332739, -6916508, -5261335, -3401614, 2310693, -1006096, 12332462, -2071785, -3425237, 3734474, -3823595, -1060857, -3405372, 3493419, -3159485, -4493073, -2326262, -2023467, 2972654, 7492571, 1977833, -6975564, -55298, -3422552, -7203734, -2046015, 4930086, -1640678, 1063541, 1783485, 147103, -734976, 2487323, 82678, -2983392, -51540, -1141924, -507880, -1603097, 2392297, -665720, -1909650, -2185602, 319438, 2076080, --950798, -258235, -2884071, 161061, 551366, 870805, -499827, -2579665, -1256278, 2048699, --855772, -2778307, 1103270, -15467788, 14878840, 7931194, -8822400, -8968965, 3695819, 11745662, --137976, 3418794, 13755170, 4562866, 4162897, -2358474, 7183333, 6496675, 7563975, -13623636, --8313446, -8281771, 6535867, 5572183, 7184407, 300111, -8264054, 3366718, -1231582, 3708168, --11893301, 4562329, 7246147, -5635534, 3147137, 5797669, 1660005, -220117, 1275605, -1919314, -10456635, 7044820, 5604396, 162672, 3646964, 8006893, -7169911, -3915400, 373662, 10601590, -6831683, 4142496, -8004746, 248034, 5469641, 6310918, -2222646, 1923072, 6226092, 7643431, -2442226, 7063611, 2835752, -844498, -6552510, -91268, -10921565, -4527970, -5234492, 865973, -3613678, -6382322, -2557653, -11612518, 5036386, -3260954, -77846, 6084358, 8948564, 10755672, -1345935, -1174674, -6701760, -2054605, 3426847, 3640522, -7113003, 2182380, -3201361, 2556043, -475668, -2454574, 43487, 1218160, -2258616, 956704, -600222, -2746095, -1389422, -1749125, -1690607, 2015413, -370441, -1617592, 1108102, -1255741, -872952, -2150168, -301185, -505732, --2452426, 1886564, 1528472, 1941325, 13162464, 4014721, -2131915, -6011344, -15408732, -7595650, -9595494, -3405372, -14154065, -3878356, -2160369, 2106682, 7983271, 11971148, -601295, 3476776, --2652679, 5932961, -6613176, -7221451, -7593502, -13749264, 7417946, 4101157, -11323144, 288837, --8239895, -3248606, 7483444, 4113505, 6127845, -1754494, -1474248, -2024003, 13109314, 10060961, -10835129, -4937602, -9061844, 7194607, -1126892, -3308736, 9351754, 1588064, 9202504, -348429, -5191542, -6450504, -228707, 4514548, -19392852, -3000035, 1043140, -14332306, 3806952, -3696893, -13424457, 8434779, -8059506, 586263, 12265353, -1319092, 6299107, -4143033, 8461622, -3945464, -1750736, -3285113, 303869, 5797132, -7823820, 8492224, 4482335, 4852776, 1495722, 11305965, --4365298, -13059922, 2348273, 8959839, -4170413, -8133058, -5733245, -4181688, 9424769, 144955, --3900904, 332323, 322659, -1869385, -1690607, 529892, 1892470, -1098438, -1125281, -734976, -2097018, -1100585, -3409130, 926102, -3784403, 3495567, 2406792, -100932, -300111, 892279, --1032403, 1517734, 250719, 1034013, 306016, 428423, 4221953, 1384053, -2065879, 1109175, -583579, 1890859, -512712, 421981, -31396748, -6652368, 16855062, -13612899, -4920959, 14300094, -5397700, -4552666, 1518808, -11865384, 10577431, -1357747, -19100794, 1349694, -1002338, 7201587, -7084549, -3816615, -14967424, -6434398, -5718749, 293668, -7986492, -4410395, -10183367, -2952253, -11080479, -9137543, -4585952, -3532611, -5937256, -6287296, -8505646, 5764383, 1161789, 7175817, -1243393, -5357972, -8247411, -8160975, -1694365, 5367636, 7959648, -2861522, -7297687, 7595650, -3152506, -11483669, -12773233, -26038240, -2327872, -8352101, -5054640, 3803731, 3918084, 2327872, -11641509, -1270774, -5612449, -758599, -6047314, 13258027, 7037841, -2648384, 7074885, -7552700, -3689914, 3001645, -7368017, -3281892, -6614250, 4628901, 3252364, -12158516, 7922604, 12158516, --855235, -659278, -12433930, -4894652, 5393942, -3921842, 3541738, 12045236, -4119948, 2586644, -1161789, 859530, -3904662, 629213, -692564, -5150203, -3120831, -549756, 1726577, 204011, -1341640, -5373541, 551903, -2922188, 1262720, -3154117, -3037616, -1898376, -263604, 567473, --2345589, 595927, 1207960, -419296, 450435, 2143726, 1176284, -4304631, -2854543, -1422708, -352187, 1453846, -765578, 1473711, 228170, 1232119, -1049046, 213138, 5405217, 21036750, --9923522, 8122857, -5292474, 157840, 11756936, -3237869, -5503464, -2606508, -1294933, 2312840, -7938710, 27663884, -1690070, 1870995, 7439420, 1993939, -47782, -12623983, -13536663, 2276870, -1655173, -8175470, -4456566, -1714229, 7437810, -3149285, 1308354, 49929, 3154654, -3211025, -15862388, 9128416, -7652558, 9044664, 7821136, -9467719, 1533840, 4360466, 3049964, -2464774, --3445101, 13583908, -11846057, 5181878, 14609868, -4911832, 1683627, 9700721, -1186485, 8467528, -4377109, 362388, 4373888, 7299834, 9568650, 6347425, 643708, -121333, -6843494, -7177427, -135291, 1059246, -23440858, 15452755, -3717831, -6968048, -8237748, -16844324, -19439022, -12293807, -2203855, 9794136, -3636764, 1422171, -1695975, 9735080, -3680250, -7442105, 4233227, 2524367, --3337727, 1411971, 6340983, -6016713, 1116692, -7716446, -2799782, -3328600, 1778117, -682900, -3963181, 2787434, 737661, -905701, 1955821, 3041911, -192737, -5521718, 3107946, -39192, -4800163, 4946192, 2222109, -2121177, 4145180, 1172526, -791885, 90731, 134218, -3614215, -4164508, -156229, -2947958, 4356708, 8116415, -1393717, -1866700, 4461398, -1774895, -2709588, --1207423, 3881577, 28335510, 28196460, -676457, -23565412, 4705674, 4680978, -2565706, 6024229, -3650185, 1933809, -141734, -4079145, 23013508, 4122095, -3552475, -25600690, -14202383, 5917928, --1454920, -8966281, -15158550, 2039036, 2721936, 3831648, -3681324, -16854526, -17751636, 19291382, -18477486, 5635534, 16980154, -14491757, 2091112, 7460895, -2903398, -9218074, -16290811, -8206609, -3036005, -778463, -7574175, 7848516, 282394, 7616051, 6374269, 350577, -17524540, -10341744, --8171712, -1502165, 1949915, 2258616, -2870112, -5073430, 1349157, 2775623, -15657303, -4053376, -2715493, 3475166, -7036767, -19828790, -4478577, -5041755, 14719390, -643708, 6697465, -6681359, --4878009, -8919573, -9747965, -5865315, 1728188, -818191, 12378096, -7355132, 2257542, 14072460, --854162, 6990060, 6466074, 13668197, 3186329, -4073240, -6908992, -6270653, -2291902, 8230768, -1417339, 8297340, 4587025, -738734, -93952, 328028, 809601, -3819300, -4555350, -69793, --1031866, -534187, 1488743, -992674, 1193464, -5527623, -1139777, 3257733, -70867, 2028298, --9192304, -1131724, -252329, -1907502, 2027225, 1363652, 1315871, 1533303, 2246805, 2283312, -2588792, -907849, -4195646, 5014375, -3198140, 12199855, -6236830, 2063195, -4680978, 866510, -3302293, -7814693, -5155572, -13885092, -15183783, -10108742, -3852049, -788663, 452582, -8533563, --7752416, -15912854, 7679939, -15949361, -20336670, 13084618, -12164958, -15666967, 14569603, 2656974, --3205119, 15456514, 9045738, -12188580, 11242077, -30922690, -2018098, -8024610, -3223910, -14595373, -25427818, 11769284, -7362648, 3614752, 8058970, -5420249, 8890045, 19864, 456340, -7362111, -8634495, 9757629, 13412109, -21026550, -662499, -264677, 6255083, -9601936, -3553549, -9773198, --9419937, 16492674, 5436355, -12577812, 6478958, -7832410, -8106751, -13501230, -24237038, 6211597, -16116865, 952409, 16233903, 21822728, -1247151, -9138617, -20761336, 1479079, -2609193, 1184874, --5138929, 4153234, -9092983, 19512036, 10944114, 17046726, 3542811, -2276333, -5177046, 6863895, -8173860, 3499862, -1428077, -2624225, 824097, 9088688, -1578937, 3711926, -5783174, 2348810, --9592273, 766115, 1242856, -4421132, 9145059, 5082020, -2287607, -6164352, -5182415, -1912871, --434865, 2732136, -6076305, 1390496, 1145146, -645319, -4184372, 1402307, -9133785, -2063732, --2130841, -2771328, 1633698, -379568, -17723182, 2486786, -39373576, -26235808, -19029926, 10357851, -19335942, -27634894, 6311992, 19812684, 12028056, -151398, 7075959, 18687940, -8653822, -979789, --5534602, 677531, -12188043, 8703751, 48855, 1144072, 3038689, 25006910, -1389422, -10844792, --10819559, 6060199, 18184892, -7266548, -18679350, 5636608, 18455474, 10980621, -2638184, 9155797, -5965710, 8826158, 1801739, 7496866, 12476343, -1442572, -21388938, 1197222, 6424198, -19789598, --14675903, 19619410, 15158550, -14914274, -9990631, 4892505, -1140851, 9691594, 23567022, -4961761, --4719632, 4639639, -1358283, 8907225, 4250944, -8505109, -6919729, -3126199, 6808060, 6440841, --6440841, -17040282, -3164317, -25710212, 24321326, 4259534, -4622459, 2463701, 9999221, -388695, --11494943, 4356171, -5074504, -7231115, 5621039, -1408212, -11376295, -18350248, -6174016, -7400229, -15133317, -2296734, 4903242, 3044595, 1732482, -1297080, -1461900, 2522757, -4234301, 807454, -5395016, -525060, -3026878, -1513439, -12738873, -3748970, -471373, -2222646, -9309342, -8095477, --3590593, -1739462, -956704, -2550137, -615791, 302795, 6783901, 2594697, -1264868, -2656974, -960999, -2331630, -2217814, 4638028, -2383170, -5206574, -1694365, -3883724, 364535, -4811437, -23622, 3444564, 921271, -4720169, -1640141, -15107547, -701153, 2681133, -18628346, -4822712, -13935021, 18241262, 12828530, 33986612, 20427402, 30806726, 11444477, 8173860, -15906411, 17327508, --5830418, -1861868, -12736726, -8383240, 16649978, -5371394, 37788196, 17678622, 10897943, -1929514, -8733279, -5852967, -17651778, -8826158, -10955388, 8068633, -10327786, -129923, -11048803, 6577206, -15385110, 13993540, -905701, 20190642, 16782584, 902480, -5826660, -7548942, -13740674, -4606890, -31669478, 12401181, 36456756, -11614665, 209380, -1104344, 8523363, 29377576, 10050760, 839666, -18832894, 21684216, 22789634, -1917703, -13407277, -4796405, -3671660, -3731790, 15129022, 10448045, -14362908, 22004728, -13575855, 33206540, -22143778, -41496900, -6385543, -12832825, 8551280, 20269024, -9903658, -11081016, -1082869, -12044699, -9063455, -5873368, 227096, 16809966, 2881923, -4529580, -2682744, 1427540, 5068062, 5491116, 3704946, 6700149, 1857573, 4286914, 1587527, 4738423, -385473, -13220983, -5085778, 59593, -12422119, 1584843, -12970801, -6666863, -7829189, -7126962, --6083821, -4322348, -1633161, 981400, 3877819, 14001593, 1995012, -8483097, 4121558, 1054951, -12586402, -2112587, 5510443, 147640, 297963, -6426882, 1716913, 19982872, 31828392, -15721191, --12902619, 11791296, -9932112, -1508607, -4858682, 4558034, 13676786, 15358803, 21943524, -24266566, -27139362, -9729175, 1983201, -12513387, 10930692, 21055004, 7953206, 4052302, 845035, 25595320, -5626944, -660351, -9030169, -3700114, -26756572, -3353833, -13357348, -31251256, 2003602, -1722282, -12142409, -32559074, -7115150, 7839389, 11390253, 27404576, -8217883, 8091719, 14138495, 2398202, --4537633, 7854959, -7992934, -1713155, -41634876, 3736085, -18165028, -20330764, -23561654, 9363029, --37369972, 12216498, -14449881, -18254148, -25650082, 22672058, 23783382, 24173150, 4414153, 4530117, -22290880, -31423054, -3368865, -9609989, 12516072, -37360308, -13175349, -3762391, 11743514, 9636833, -7443179, 15243913, -14278082, 5648419, -17180406, -4881231, -10402948, -3861713, -3706020, 573378, --16291885, 7432441, 9817758, -1625645, 454193, -7749732, -2711735, 7823820, -10595684, -97174, -4836133, -12696460, 5629092, -11365557, -88047, 7305203, 1486059, -9296994, -6402186, 3755949, --5452998, 5956583, 3884798, 6854231, -1072668, -8128226, 15528991, -7351374, -3966939, -10051834, -6829535, -3342558, 816581, -9316321, 1085553, -11344619, -1989107, 8534637, -2820720, -4742718, --12187507, 1519345, 1455457, -1466731, -15936476, -29631516, -566399, -10595147, 35036732, 7285339, -24768002, -8164733, 33820720, -21329344, -39936752, 8947491, 6708202, 4489852, -19885162, -22652194, --17756468, 6554657, -17887466, 7763691, -9522479, 26505316, -8741869, -4092030, 19090056, 514322, --47813724, -19918448, -728534, 31368830, -3701725, -9953587, -27460410, 4661650, -6849936, -23642722, --27991376, -3327526, 5005785, -9696962, -10729365, -28007482, 18166102, -7021198, 6452652, -13993540, -492311, 8182987, 4929549, 24539296, 119185, -8579734, -32165546, -11397233, 15342160, -22030498, --11322608, 8018167, 17475686, 13650480, 34979824, 26708792, 348966, 20243792, 20699058, 7003481, -658741, 12104292, -10582263, 52926344, -24559696, -58015880, 15224585, -49399104, -2086817, -38689604, --450435, 47105052, 5727339, -22594750, 7291244, 7923678, -14892799, -12177843, -16829830, 3508452, --5234492, 15027017, -12158516, 10011569, -20225000, 5496485, -895501, -3374771, -4776541, 13610751, -25993142, 8109972, 10418517, 18034030, 5283347, -18200460, 5028333, -6805913, 11860552, -3859565, --5898601, -783295, -1492501, -4955319, -15187004, -9877351, -6884296, -907312, 1846836, -1165547, --9745281, -21423296, -13638669, 3136400, -4061429, -448287, -8468602, 2806761, 15115064, 5932961, -21872120, -33318746, -22703198, -13570486, -12137041, 13856101, 20679730, -12028593, 1075352, 19071266, --38273528, 3131031, 8569533, -28302224, 14503568, -9206799, 12757127, 5248450, 14418205, 1923609, --18878528, 19538880, -24505472, -4941897, 46498928, -18888192, 16828218, -10822781, 18953154, 17899814, --6470905, -20214264, 21494164, 57082800, -31427886, 8403640, -41603736, 21203180, 12233677, -22041772, -24448028, 2646774, -49890340, 7435662, 2109366, 22945326, -6397354, -3196530, -26367878, -25032680, --13334800, 62192200, -9773198, 31712964, -27917288, 20956220, 9798431, -5417028, -21536576, -3673808, -17139604, 35065188, -12927315, -11431055, -4002910, 7071664, 29976724, -7450695, -7477001, -22258668, -6597070, -33634424, -15385110, 24383604, 28949154, 3506841, -2731062, -15676094, -26328686, -75346072, -46840912, 18115636, 26777510, 2854543, -24873766, 27224188, -15516643, 11619497, 15809238, 15855409, -36103496, -516470, 8218957, 10228465, -4353486, -15769509, -5558762, 26753888, 16138340, -14745160, --3520263, -9978820, -2859911, 12578885, 3427384, -17285096, -11519102, 16848082, 3651259, -5114769, -8421357, -14593225, -9222905, -2905009, 7068443, 11944304, 7431367, 2420751, 9090298, -7330436, --10072772, 1932198, -1159104, -13086228, 1424319, -13501230, -685584, -8189966, -2150168, 2305861, --7177427, -12912282, 4239133, -31490700, 21914534, 22075058, -43397424, 4384088, -22937272, 3014530, --47735340, 47912508, 41202160, -4039417, -21922050, -7297687, -8946417, 23368918, -23998130, 30079804, --39932996, -22775674, 11060615, 14282914, 2975339, 13801341, 37550900, 11118060, 17198122, 4872641, -17886392, 13120051, -8713415, 4009889, 15123654, -830002, -1510755, 30421790, 13346611, 39854612, --3819837, 22821846, -128312, -28724742, 29442538, -15071040, -3504693, 9378598, -27645094, -18328772, -10496900, 43349640, 23381266, 15810311, -55707872, -12692702, -39105140, -143881, 62143880, 41208064, -46982112, 3918621, -45871324, 14442364, 46248208, 9957882, -11747272, 41509248, 4330401, 27821188, --71246528, -58780924, 42280732, -2847563, -19261854, -44978508, -9963787, -16752520, 19219978, 18137110, -21059836, 21960704, -9077950, 7001334, 39189428, 36526548, 37853156, 3377455, 54439248, 27445914, --9752797, -21362094, 256087, -10403485, 3167539, 27975806, -4442070, 1460826, 20124606, 22513144, -2080912, 362925, 8564165, 24921010, 8625905, 11828877, 16726750, 6256157, 13004087, -351114, --7415798, -2930242, -2863670, 1322850, 17300666, -6340983, 3014530, -13906030, 20949240, 10486700, -9130027, 61740, 10547366, 324270, 35930084, 9573482, 36888400, -9663676, 32260036, 15156403, -4719096, 14405857, 13845901, 16122770, -4279398, -2550137, 22033720, 7139847, 18525268, -41124848, -24249922, 32445256, 2443837, 11089069, -29350196, 22928682, -13357348, 10997801, 1052804, 112206, -19386946, -5982890, 12626667, -4043175, -23532662, 6302328, -1617592, 26338886, 23008140, 32748588, -10931229, -25036438, -20655034, 21264920, 23898272, 11063299, 2137820, 7566122, -6476811, -20521890, -3544422, -7591892, 29123100, 20326470, 17796734, 23057532, 23702314, -32618666, 36005248, 35342212, -25969520, -17528836, -15527381, -22675280, 31397822, 18321794, 51510080, -31284542, -30878668, -23931020, --45346264, -11834782, 49250928, 7839389, 38713760, -41129680, -43861280, 9617506, 28093382, -38461968, -6190659, -30630634, 12384001, -35358856, -2617246, 16824998, 17969606, -32151052, 12888660, -24455544, --48531520, -1603097, 57926224, 29894582, 23602456, -16118475, -41059352, 62746788, 50983408, 14263050, --56140592, -2200634, -12989592, 40186936, 20795694, 24910810, -29034516, 22036940, -12863964, 14433774, --19996830, 7186017, -22392886, 32828582, -6168110, 5391258, -38852812, 11338177, 5248987, -1832340, --8432095, 7943542, 4479651, 4075924, -23880556, 10182294, 25111600, 1530619, 15272367, 12559021, -10781979, 1605244, 5319317, 471373, 1784022, 1038308, -7266548, -937377, 8268349, -194884, -16056198, 13109314, -6513318, -1448478, 7728257, 3000572, 12580496, -22695144, 15319075, 1519882, --92879, -79750024, -15636902, -2177012, 1543504, 27562952, -73362872, -8558259, 34040836, -54659364, -12866111, -12533251, 64100240, 33501818, -38308960, 9473087, 43291660, 4255239, -16501264, 13994614, -10777684, 5531381, -310311, -4344897, 3787624, 6914898, 15143518, 43945032, 35716412, 38424388, -26741540, 48410188, 24024436, 49504328, 20820928, 43912284, 1017370, 27255862, 24948928, 27014270, -21085606, -2024003, 8473434, -33770256, -19749334, 64188824, 1191317, -25689274, -6806450, 20138028, -34220152, 69094216, -8957154, -38048580, -18766860, -28047210, 39756900, 45035952, 50838456, 15668578, --1447404, 34148748, -57629336, 52824340, 20401632, -27834072, -129923, -90240488, 2531346, -59635620, --82346872, -20569672, -48237852, -21075404, 94121520, 85565416, 80816792, -63240708, -6090801, -7168301, -63634772, 99160056, -21683680, -27908698, 55310588, 56473988, 48929340, -5698885, -7415261, -27361626, --34130496, 5109938, -12289512, 15294379, 24261734, 20833276, 14802605, 1506460, 9739912, 26627186, -4964982, 248034, -7089918, 1605244, 2236067, 7321309, 5886790, 5523328, 27881318, -2291902, --15923054, 16924318, 20379082, 4780836, 32296006, 7654706, 15844671, 34979288, 47050828, 34227668, -25371982, 10218264, 5117454, 13727252, 32372780, 14201846, 33170570, 24432996, 16136729, 22995254, -8818105, 31176630, 27511414, 22228066, 34080564, 19495930, 6674916, 9526774, -22592064, 57437136, -68490768, -56627532, -53075596, 18249852, 59802052, 2095407, -28900298, 795643, 15794742, 18722836, --50549616, 19173808, -7266548, 26969710, -28028956, -12595528, -32743220, 34541200, -5234492, -14388140, --30662308, 22635014, 12383464, -4582730, -26017838, 12505334, 10625749, 6627672, -23072564, -2603824, --1759863, 26592290, -20202990, -4121558, -29255706, -6876243, 9245991, 23440858, -30429306, -10701985, -31060130, 27838904, -9010841, -18521510, -804770, -9106404, 25811680, -14449881, -9059160, 13534516, -8914741, 16911434, -15268609, 5327907, -20777978, 23900956, 26659936, 13748190, 3526705, -20674362, -23585812, -16462073, 36915244, -26767846, 29508036, -46688980, 31302796, 4876936, -3532611, -32564442, --10738492, 11734924, -9315784, 4132832, -9051107, 10355703, -4980552, 11502996, -11217381, -13360033, --9934259, 11021960, -96100, -252866, -3362423, -6890738, 4056597, 12807592, -6988449, -425739, --188442, 2705830, -1565516, 3224447, -3045669, 9681930, -724239, 12236899, -11044508, 3077881, --5670968, 12411382, -13108240, 12282533, -13518410, 8698383, 2527052, 15285789, -4452271, 14583561, --13324599, -8260296, -3228742, 22899156, -11700565, 18038862, -7256884, 3830037, 983011, 13263396, --6516539, 7536057, 780073, 1729798, -2309619, 5686000, -2847027, -5694053, 13309030, -7097434, -749472, -5251135, 3009162, -4782446, 5880884, -8202314, 10023380, -7387344, 8101382, -10732050, -9461813, -14097156, 13513578, -7526930, 8747238, -9209484, 9279277, -9168681, 9538049, -8071854, -8538932, -11131481, 9348533, -9041980, 9575630, -10489921, 11053635, -10041097, -1828582, -12332999, -55098524, 58624692, -34492344, -20437066, 11632382, 55987584, 34792456, 20863878, 20076288, -8913668, --23419382, -7088307, 13166759, -199716, -5508296, 16707423, 302258, 11777874, 1455994, -6255620, --20979304, -5564667, -1214402, 1558536, -816581, -17047262, 19055696, 3187940, -7649337, -418759, --572841, 281320, 12308303, 22591528, 9645960, 2297808, -8112657, -11670500, -3013993, 7352447, -15152645, 20397336, -11356430, -11215233, 2561411, 20621212, 9311489, 4614406, -9288941, -18676666, -15967078, -3267396, 468151, 1105954, 5157182, 4949950, -2247879, -657667, -12171400, 1897302, -10770704, -5080947, 6443525, -3576634, -8667244, 5545877, -1629403, 3013993, -643171, 9378061, -6361921, -13908715, 4132832, 697395, -25266218, -33571076, 984084, 2000918, 7677791, 20496120, -2263448, -8974334, -8798777, 8096550, 8822400, 13393856, 9126269, 610422, 3905736, -1391033, --10123775, -4174171, 1567126, -13880261, -13303124, 8626979, 9133785, -169114, 10270341, -14482093, --2617246, -631360, 744103, -4438849, 2323577, 7903277, 10914586, 5368172, 9194451, -5747740, --11377905, 6742562, 1085553, -2739116, 7810398, 4391067, -5354751, -19363324, -72814728, 30981746, -112008992, 103488848, 88138632, 35310000, -83840448, -52303576, -75383656, -84247928, -75528072, -21863532, -16202764, 63683628, 66120484, 79417168, 52431888, 53088480, 1212791, -55625732, -53327388, -65519728, --51432232, -28475096, -2025614, -18309982, 19849728, 24687472, 39764956, 43875240, 44372380, 26589068, -2144799, 11865384, -9889699, 6399502, -30531848, -22035330, -28242632, -45919104, -36596344, -27888834, --19845970, -32626720, 4450660, 55927452, 63005560, 35310000, 65884260, 16436840, 38409356, 19883552, -11217918, -16508244, -35313220, -48192756, -67894840, -51918100, -77440408, -31957242, -34529928, 22273164, -22141630, 64768644, 74465608, 66464620, 59034864, 57873072, 36075576, 4503810, -20329690, -61770756, --38885024, -80710488, -68968048, -95735360, -15601469, -8522826, 23514410, 30368104, 54506356, 64295660, -53657564, 48058000, 35497904, 21053930, 2867428, -17790828, -25806310, -34571804, -53561464, -37509024, --46648176, -32327146, -16708497, -4747013, 10441602, 10313827, 50965692, 47128676, 46549928, 36436356, -26584774, 3225521, 16485158, -18457622, -30777736, -23852100, -66495220, -77350752, -15051713, -5177046, --3471407, 37786048, 30787400, 41234372, 28753732, 37683508, 11363410, 9766756, -3040300, -15916612, --20639466, -26479010, -29490320, -18043158, -3933653, -22881976, -12215961, 18338974, 25977036, 17541720, -22480932, 15463493, 11075110, 2938831, -2190433, -7938710, -11372537, -8688719, -14183593, -7342784, --2923799, -5259725, -7289097, 1619203, 5247913, 1210644, 8076149, 10526428, 7740068, 5596343, -4801237, 2540473, -843424, -4862977, -4938139, -6886980, -5145371, -5315559, -3452080, -2793876, -455803, 1325534, 2407329, 2004676, 3343632, 3434363, 2711735, 2054605, 2003602, 1465121, -1769527, 362388, -2085207, -3311957, -1641751, -2939905, -3384971, -2922725, -1828582, -803159, -1318018, 2040110, 2360622, 1582696, 3055869, 1952063, 1197759, 665720, 360240, -1198833, --1299765, -1545651, -597537, -1179505, -1069984, -1098975, -169651, -463856, 324807, 254477, -1044214, 762357, 1269163, 671089, 807454, -110059, -280247, -572304, 315143, -583042, --417149, -1090922, -371515, -380641, 491237, 285078, 807991, 301185, 447750, -395137, -53687, -317828, -108448, -675384, 62277, -245887, 280247, -6979, 428960, -128312, -376883, -137439, 236223, -261993, 207769, -248034, 214748, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +-15194521, -2656437, 201327, -3478924, -7151121, -2356863, 5238787, -8405788, -4646081, -2781528, +-1647657, 2672544, -1202054, 2975339, 1359357, 2605972, -291521, 3225521, -2813741, 526670, +-1235340, 611496, 8109435, -1724429, -500901, -4019016, 5012227, 3113851, 2411087, 6257231, +-3199751, -1816234, 2138357, 5602785, -1512365, -372052, -4522601, -4952098, -3314104, 3539053, +-4398584, -3769371, -476741, 5040144, -6818798, -1448478, -5697274, -2761664, -1630477, 785979, +-513249, -4081830, 5235565, 895501, 4711579, -1902671, -1194538, -5867999, -127238, -2056753, +-2213519, 3385508, 1901597, -1049046, 1821066, 3746285, -1065689, 1611150, -2680597, -1545115, +-648003, -2525978, 2246268, 784368, 1710471, -4008815, 2880313, 1660542, 6496675, 3866008, +-1063004, -4125316, -336081, 901943, 514322, 1286343, -190052, -1395864, 57445, -947577, +9127, -1147293, 411780, -1116155, -73014, 1254131, 424128, 648540, -798864, -559956, +594853, 862215, 392453, -125628, 65498, -16106, 539555, -12516608, -4474282, 3587372, +-3293703, -1498944, -1384053, 1686848, -621697, -3308199, 5222680, 4647155, 1571421, -593779, +2429878, -6427956, -922881, -6352257, -3178276, 4671851, -762894, 827318, -622233, -734439, +125091, 9783936, 8982924, 3997541, 4804995, 5666136, -1074279, -658741, -1932735, 4999342, +-466541, -1904281, 1428614, -2920578, 2023467, 3597572, -1818382, 4056597, 4611721, 8948027, +-3477850, -4227322, 3858491, -2317135, 154082, 1882806, -5177583, 309775, -2695629, -3055869, +6924561, 4050154, 4992900, -2840584, -3712999, 2625836, -4326643, 3056943, 13338558, 749472, +944893, 2987687, 1331977, 1224603, 7607998, -4056060, -994285, 1387811, 1022739, -3775813, +-2736968, -3854196, -1793149, -1410897, 3519189, -596464, 3535295, 3582003, -3559454, -3852049, +-953483, 2426657, 3412889, -4038343, -744640, -1202591, -2732136, -341450, -2585034, 681289, +-132070, 1400696, -759672, 535797, -975494, -262530, -738734, 613643, -3633542, 3935801, +6391985, -3081102, 3173444, 10011032, 3366718, 2273648, -7006166, 5792301, 1538672, -9052717, +3838090, -2557653, -5412733, 2160906, -745714, 2081449, 5254356, -5534066, -5782100, -2599529, +7880191, 197569, 3914863, 8128763, -12116640, -9802189, 1598265, 5951214, -4374961, 363998, +8100845, 2065342, -1037235, -2455648, 9692667, 1164473, -2349347, 1335198, -8777303, 978716, +-4836670, 4456566, 792421, 4734665, -2384781, -1210644, 2158758, 125091, 634581, 256087, +4571456, 3654480, -4994510, 2847563, 4047470, -6887517, 828929, -3113315, 1300301, -1592896, +-5299453, 68719, 4589173, 3961034, 8844948, -5489505, 6851010, -4540854, -899259, 4039954, +-4417374, -6616397, -2374580, 295816, -405874, -353261, -701690, 1291711, 2827162, -3855270, +-38118, 1813013, -341450, 1554778, -3134789, -1821066, -1236414, -2327872, 690416, -515933, +-1800665, 979253, 1039919, -1532230, -2311229, -137439, -529355, 2381023, -108448, -405874, +449898, 500364, -406411, -732292, 1622424, 521302, -1277216, -665720, -975494, 130997, +1660542, 148713, -566399, 20186346, 9036611, 12232067, -998043, -3371549, -4415764, -4409858, +2397129, -3701725, 5620502, -627602, 7715372, 477815, 4079145, 5081483, 3913789, 3367254, +4439386, -14977625, -4436701, -1397475, -3163780, -2761664, -4722317, -10664941, 477278, 7328288, +-4505958, 4405026, -3618510, -5315559, -4023848, 621160, -3395709, -1246614, -3481608, -227633, +8822400, 485331, 3966402, 5592048, 7254200, -3392487, 1700270, -1606855, -5596343, 6373732, +-3555159, -242666, -5538361, 4067871, -51540, 110059, -1526861, -2561411, 1879585, 5698348, +-2379412, 3219078, 3034395, 2567854, 9770514, -9807558, -4150549, 258235, -5407901, -6992744, +-2778307, -8562554, 1291175, 10084046, -6938520, -3291556, -7924215, 533113, -2492155, -3771518, +-9290014, 5484137, 7137162, 2844342, 4989142, -2508798, 806917, -1853278, 2072322, 110059, +4938676, -1254667, 2128693, -77846, -1257352, 1741072, 1185948, 2284923, 1902671, -300111, +460635, 1261110, 506806, 989453, -76236, -919660, -1775432, 911607, 471373, -1195612, +885300, 995896, -294742, 448824, 1179505, -331786, -1052804, -370978, -319438, 6200322, +9011378, -5025112, 4716411, -4115116, -1906966, -1676648, -11041287, 7993471, -2298344, -1253594, +12850542, 7889855, 8604430, -3552475, 374736, 1454383, -1925756, 2775086, -6482717, -247497, +-4422743, 5151814, -5036923, -3575560, -491237, 814970, -6230387, 1130650, 705448, 8161512, +98247, -11336566, 6525666, 5999533, 8697309, -1455457, 2216740, -6307160, -4659503, -2047089, +-4523138, 1707786, 1225676, -1782948, -650151, 4626754, 7370701, -10129143, -2137820, -90194, +-4086662, -4377109, 6669548, -5430450, 2537252, -5332739, -6916508, -5261335, -3401614, 2310693, +1006096, 12332462, -2071785, -3425237, 3734474, -3823595, -1060857, -3405372, 3493419, -3159485, +4493073, -2326262, -2023467, 2972654, 7492571, 1977833, -6975564, -55298, -3422552, -7203734, +2046015, 4930086, -1640678, 1063541, 1783485, 147103, -734976, 2487323, 82678, -2983392, +51540, -1141924, -507880, -1603097, 2392297, -665720, -1909650, -2185602, 319438, 2076080, +-950798, -258235, -2884071, 161061, 551366, 870805, -499827, -2579665, -1256278, 2048699, +-855772, -2778307, 1103270, -15467788, 14878840, 7931194, -8822400, -8968965, 3695819, 11745662, +-137976, 3418794, 13755170, 4562866, 4162897, -2358474, 7183333, 6496675, 7563975, -13623636, +-8313446, -8281771, 6535867, 5572183, 7184407, 300111, -8264054, 3366718, -1231582, 3708168, +-11893301, 4562329, 7246147, -5635534, 3147137, 5797669, 1660005, -220117, 1275605, -1919314, +10456635, 7044820, 5604396, 162672, 3646964, 8006893, -7169911, -3915400, 373662, 10601590, +6831683, 4142496, -8004746, 248034, 5469641, 6310918, -2222646, 1923072, 6226092, 7643431, +2442226, 7063611, 2835752, -844498, -6552510, -91268, -10921565, -4527970, -5234492, 865973, +3613678, -6382322, -2557653, -11612518, 5036386, -3260954, -77846, 6084358, 8948564, 10755672, +1345935, -1174674, -6701760, -2054605, 3426847, 3640522, -7113003, 2182380, -3201361, 2556043, +475668, -2454574, 43487, 1218160, -2258616, 956704, -600222, -2746095, -1389422, -1749125, +1690607, 2015413, -370441, -1617592, 1108102, -1255741, -872952, -2150168, -301185, -505732, +-2452426, 1886564, 1528472, 1941325, 13162464, 4014721, -2131915, -6011344, -15408732, -7595650, +9595494, -3405372, -14154065, -3878356, -2160369, 2106682, 7983271, 11971148, -601295, 3476776, +-2652679, 5932961, -6613176, -7221451, -7593502, -13749264, 7417946, 4101157, -11323144, 288837, +-8239895, -3248606, 7483444, 4113505, 6127845, -1754494, -1474248, -2024003, 13109314, 10060961, +10835129, -4937602, -9061844, 7194607, -1126892, -3308736, 9351754, 1588064, 9202504, -348429, +5191542, -6450504, -228707, 4514548, -19392852, -3000035, 1043140, -14332306, 3806952, -3696893, +13424457, 8434779, -8059506, 586263, 12265353, -1319092, 6299107, -4143033, 8461622, -3945464, +1750736, -3285113, 303869, 5797132, -7823820, 8492224, 4482335, 4852776, 1495722, 11305965, +-4365298, -13059922, 2348273, 8959839, -4170413, -8133058, -5733245, -4181688, 9424769, 144955, +-3900904, 332323, 322659, -1869385, -1690607, 529892, 1892470, -1098438, -1125281, -734976, +2097018, -1100585, -3409130, 926102, -3784403, 3495567, 2406792, -100932, -300111, 892279, +-1032403, 1517734, 250719, 1034013, 306016, 428423, 4221953, 1384053, -2065879, 1109175, +583579, 1890859, -512712, 421981, -31396748, -6652368, 16855062, -13612899, -4920959, 14300094, +5397700, -4552666, 1518808, -11865384, 10577431, -1357747, -19100794, 1349694, -1002338, 7201587, +7084549, -3816615, -14967424, -6434398, -5718749, 293668, -7986492, -4410395, -10183367, -2952253, +11080479, -9137543, -4585952, -3532611, -5937256, -6287296, -8505646, 5764383, 1161789, 7175817, +1243393, -5357972, -8247411, -8160975, -1694365, 5367636, 7959648, -2861522, -7297687, 7595650, +3152506, -11483669, -12773233, -26038240, -2327872, -8352101, -5054640, 3803731, 3918084, 2327872, +11641509, -1270774, -5612449, -758599, -6047314, 13258027, 7037841, -2648384, 7074885, -7552700, +3689914, 3001645, -7368017, -3281892, -6614250, 4628901, 3252364, -12158516, 7922604, 12158516, +-855235, -659278, -12433930, -4894652, 5393942, -3921842, 3541738, 12045236, -4119948, 2586644, +1161789, 859530, -3904662, 629213, -692564, -5150203, -3120831, -549756, 1726577, 204011, +1341640, -5373541, 551903, -2922188, 1262720, -3154117, -3037616, -1898376, -263604, 567473, +-2345589, 595927, 1207960, -419296, 450435, 2143726, 1176284, -4304631, -2854543, -1422708, +352187, 1453846, -765578, 1473711, 228170, 1232119, -1049046, 213138, 5405217, 21036750, +-9923522, 8122857, -5292474, 157840, 11756936, -3237869, -5503464, -2606508, -1294933, 2312840, +7938710, 27663884, -1690070, 1870995, 7439420, 1993939, -47782, -12623983, -13536663, 2276870, +1655173, -8175470, -4456566, -1714229, 7437810, -3149285, 1308354, 49929, 3154654, -3211025, +15862388, 9128416, -7652558, 9044664, 7821136, -9467719, 1533840, 4360466, 3049964, -2464774, +-3445101, 13583908, -11846057, 5181878, 14609868, -4911832, 1683627, 9700721, -1186485, 8467528, +4377109, 362388, 4373888, 7299834, 9568650, 6347425, 643708, -121333, -6843494, -7177427, +135291, 1059246, -23440858, 15452755, -3717831, -6968048, -8237748, -16844324, -19439022, -12293807, +2203855, 9794136, -3636764, 1422171, -1695975, 9735080, -3680250, -7442105, 4233227, 2524367, +-3337727, 1411971, 6340983, -6016713, 1116692, -7716446, -2799782, -3328600, 1778117, -682900, +3963181, 2787434, 737661, -905701, 1955821, 3041911, -192737, -5521718, 3107946, -39192, +4800163, 4946192, 2222109, -2121177, 4145180, 1172526, -791885, 90731, 134218, -3614215, +4164508, -156229, -2947958, 4356708, 8116415, -1393717, -1866700, 4461398, -1774895, -2709588, +-1207423, 3881577, 28335510, 28196460, -676457, -23565412, 4705674, 4680978, -2565706, 6024229, +3650185, 1933809, -141734, -4079145, 23013508, 4122095, -3552475, -25600690, -14202383, 5917928, +-1454920, -8966281, -15158550, 2039036, 2721936, 3831648, -3681324, -16854526, -17751636, 19291382, +18477486, 5635534, 16980154, -14491757, 2091112, 7460895, -2903398, -9218074, -16290811, -8206609, +3036005, -778463, -7574175, 7848516, 282394, 7616051, 6374269, 350577, -17524540, -10341744, +-8171712, -1502165, 1949915, 2258616, -2870112, -5073430, 1349157, 2775623, -15657303, -4053376, +2715493, 3475166, -7036767, -19828790, -4478577, -5041755, 14719390, -643708, 6697465, -6681359, +-4878009, -8919573, -9747965, -5865315, 1728188, -818191, 12378096, -7355132, 2257542, 14072460, +-854162, 6990060, 6466074, 13668197, 3186329, -4073240, -6908992, -6270653, -2291902, 8230768, +1417339, 8297340, 4587025, -738734, -93952, 328028, 809601, -3819300, -4555350, -69793, +-1031866, -534187, 1488743, -992674, 1193464, -5527623, -1139777, 3257733, -70867, 2028298, +-9192304, -1131724, -252329, -1907502, 2027225, 1363652, 1315871, 1533303, 2246805, 2283312, +2588792, -907849, -4195646, 5014375, -3198140, 12199855, -6236830, 2063195, -4680978, 866510, +3302293, -7814693, -5155572, -13885092, -15183783, -10108742, -3852049, -788663, 452582, -8533563, +-7752416, -15912854, 7679939, -15949361, -20336670, 13084618, -12164958, -15666967, 14569603, 2656974, +-3205119, 15456514, 9045738, -12188580, 11242077, -30922690, -2018098, -8024610, -3223910, -14595373, +25427818, 11769284, -7362648, 3614752, 8058970, -5420249, 8890045, 19864, 456340, -7362111, +8634495, 9757629, 13412109, -21026550, -662499, -264677, 6255083, -9601936, -3553549, -9773198, +-9419937, 16492674, 5436355, -12577812, 6478958, -7832410, -8106751, -13501230, -24237038, 6211597, +16116865, 952409, 16233903, 21822728, -1247151, -9138617, -20761336, 1479079, -2609193, 1184874, +-5138929, 4153234, -9092983, 19512036, 10944114, 17046726, 3542811, -2276333, -5177046, 6863895, +8173860, 3499862, -1428077, -2624225, 824097, 9088688, -1578937, 3711926, -5783174, 2348810, +-9592273, 766115, 1242856, -4421132, 9145059, 5082020, -2287607, -6164352, -5182415, -1912871, +-434865, 2732136, -6076305, 1390496, 1145146, -645319, -4184372, 1402307, -9133785, -2063732, +-2130841, -2771328, 1633698, -379568, -17723182, 2486786, -39373576, -26235808, -19029926, 10357851, +19335942, -27634894, 6311992, 19812684, 12028056, -151398, 7075959, 18687940, -8653822, -979789, +-5534602, 677531, -12188043, 8703751, 48855, 1144072, 3038689, 25006910, -1389422, -10844792, +-10819559, 6060199, 18184892, -7266548, -18679350, 5636608, 18455474, 10980621, -2638184, 9155797, +5965710, 8826158, 1801739, 7496866, 12476343, -1442572, -21388938, 1197222, 6424198, -19789598, +-14675903, 19619410, 15158550, -14914274, -9990631, 4892505, -1140851, 9691594, 23567022, -4961761, +-4719632, 4639639, -1358283, 8907225, 4250944, -8505109, -6919729, -3126199, 6808060, 6440841, +-6440841, -17040282, -3164317, -25710212, 24321326, 4259534, -4622459, 2463701, 9999221, -388695, +-11494943, 4356171, -5074504, -7231115, 5621039, -1408212, -11376295, -18350248, -6174016, -7400229, +15133317, -2296734, 4903242, 3044595, 1732482, -1297080, -1461900, 2522757, -4234301, 807454, +5395016, -525060, -3026878, -1513439, -12738873, -3748970, -471373, -2222646, -9309342, -8095477, +-3590593, -1739462, -956704, -2550137, -615791, 302795, 6783901, 2594697, -1264868, -2656974, +960999, -2331630, -2217814, 4638028, -2383170, -5206574, -1694365, -3883724, 364535, -4811437, +23622, 3444564, 921271, -4720169, -1640141, -15107547, -701153, 2681133, -18628346, -4822712, +13935021, 18241262, 12828530, 33986612, 20427402, 30806726, 11444477, 8173860, -15906411, 17327508, +-5830418, -1861868, -12736726, -8383240, 16649978, -5371394, 37788196, 17678622, 10897943, -1929514, +8733279, -5852967, -17651778, -8826158, -10955388, 8068633, -10327786, -129923, -11048803, 6577206, +15385110, 13993540, -905701, 20190642, 16782584, 902480, -5826660, -7548942, -13740674, -4606890, +31669478, 12401181, 36456756, -11614665, 209380, -1104344, 8523363, 29377576, 10050760, 839666, +18832894, 21684216, 22789634, -1917703, -13407277, -4796405, -3671660, -3731790, 15129022, 10448045, +14362908, 22004728, -13575855, 33206540, -22143778, -41496900, -6385543, -12832825, 8551280, 20269024, +9903658, -11081016, -1082869, -12044699, -9063455, -5873368, 227096, 16809966, 2881923, -4529580, +2682744, 1427540, 5068062, 5491116, 3704946, 6700149, 1857573, 4286914, 1587527, 4738423, +385473, -13220983, -5085778, 59593, -12422119, 1584843, -12970801, -6666863, -7829189, -7126962, +-6083821, -4322348, -1633161, 981400, 3877819, 14001593, 1995012, -8483097, 4121558, 1054951, +12586402, -2112587, 5510443, 147640, 297963, -6426882, 1716913, 19982872, 31828392, -15721191, +-12902619, 11791296, -9932112, -1508607, -4858682, 4558034, 13676786, 15358803, 21943524, -24266566, +27139362, -9729175, 1983201, -12513387, 10930692, 21055004, 7953206, 4052302, 845035, 25595320, +5626944, -660351, -9030169, -3700114, -26756572, -3353833, -13357348, -31251256, 2003602, -1722282, +12142409, -32559074, -7115150, 7839389, 11390253, 27404576, -8217883, 8091719, 14138495, 2398202, +-4537633, 7854959, -7992934, -1713155, -41634876, 3736085, -18165028, -20330764, -23561654, 9363029, +-37369972, 12216498, -14449881, -18254148, -25650082, 22672058, 23783382, 24173150, 4414153, 4530117, +22290880, -31423054, -3368865, -9609989, 12516072, -37360308, -13175349, -3762391, 11743514, 9636833, +7443179, 15243913, -14278082, 5648419, -17180406, -4881231, -10402948, -3861713, -3706020, 573378, +-16291885, 7432441, 9817758, -1625645, 454193, -7749732, -2711735, 7823820, -10595684, -97174, +4836133, -12696460, 5629092, -11365557, -88047, 7305203, 1486059, -9296994, -6402186, 3755949, +-5452998, 5956583, 3884798, 6854231, -1072668, -8128226, 15528991, -7351374, -3966939, -10051834, +6829535, -3342558, 816581, -9316321, 1085553, -11344619, -1989107, 8534637, -2820720, -4742718, +-12187507, 1519345, 1455457, -1466731, -15936476, -29631516, -566399, -10595147, 35036732, 7285339, +24768002, -8164733, 33820720, -21329344, -39936752, 8947491, 6708202, 4489852, -19885162, -22652194, +-17756468, 6554657, -17887466, 7763691, -9522479, 26505316, -8741869, -4092030, 19090056, 514322, +-47813724, -19918448, -728534, 31368830, -3701725, -9953587, -27460410, 4661650, -6849936, -23642722, +-27991376, -3327526, 5005785, -9696962, -10729365, -28007482, 18166102, -7021198, 6452652, -13993540, +492311, 8182987, 4929549, 24539296, 119185, -8579734, -32165546, -11397233, 15342160, -22030498, +-11322608, 8018167, 17475686, 13650480, 34979824, 26708792, 348966, 20243792, 20699058, 7003481, +658741, 12104292, -10582263, 52926344, -24559696, -58015880, 15224585, -49399104, -2086817, -38689604, +-450435, 47105052, 5727339, -22594750, 7291244, 7923678, -14892799, -12177843, -16829830, 3508452, +-5234492, 15027017, -12158516, 10011569, -20225000, 5496485, -895501, -3374771, -4776541, 13610751, +25993142, 8109972, 10418517, 18034030, 5283347, -18200460, 5028333, -6805913, 11860552, -3859565, +-5898601, -783295, -1492501, -4955319, -15187004, -9877351, -6884296, -907312, 1846836, -1165547, +-9745281, -21423296, -13638669, 3136400, -4061429, -448287, -8468602, 2806761, 15115064, 5932961, +21872120, -33318746, -22703198, -13570486, -12137041, 13856101, 20679730, -12028593, 1075352, 19071266, +-38273528, 3131031, 8569533, -28302224, 14503568, -9206799, 12757127, 5248450, 14418205, 1923609, +-18878528, 19538880, -24505472, -4941897, 46498928, -18888192, 16828218, -10822781, 18953154, 17899814, +-6470905, -20214264, 21494164, 57082800, -31427886, 8403640, -41603736, 21203180, 12233677, -22041772, +24448028, 2646774, -49890340, 7435662, 2109366, 22945326, -6397354, -3196530, -26367878, -25032680, +-13334800, 62192200, -9773198, 31712964, -27917288, 20956220, 9798431, -5417028, -21536576, -3673808, +17139604, 35065188, -12927315, -11431055, -4002910, 7071664, 29976724, -7450695, -7477001, -22258668, +6597070, -33634424, -15385110, 24383604, 28949154, 3506841, -2731062, -15676094, -26328686, -75346072, +46840912, 18115636, 26777510, 2854543, -24873766, 27224188, -15516643, 11619497, 15809238, 15855409, +36103496, -516470, 8218957, 10228465, -4353486, -15769509, -5558762, 26753888, 16138340, -14745160, +-3520263, -9978820, -2859911, 12578885, 3427384, -17285096, -11519102, 16848082, 3651259, -5114769, +8421357, -14593225, -9222905, -2905009, 7068443, 11944304, 7431367, 2420751, 9090298, -7330436, +-10072772, 1932198, -1159104, -13086228, 1424319, -13501230, -685584, -8189966, -2150168, 2305861, +-7177427, -12912282, 4239133, -31490700, 21914534, 22075058, -43397424, 4384088, -22937272, 3014530, +-47735340, 47912508, 41202160, -4039417, -21922050, -7297687, -8946417, 23368918, -23998130, 30079804, +-39932996, -22775674, 11060615, 14282914, 2975339, 13801341, 37550900, 11118060, 17198122, 4872641, +17886392, 13120051, -8713415, 4009889, 15123654, -830002, -1510755, 30421790, 13346611, 39854612, +-3819837, 22821846, -128312, -28724742, 29442538, -15071040, -3504693, 9378598, -27645094, -18328772, +10496900, 43349640, 23381266, 15810311, -55707872, -12692702, -39105140, -143881, 62143880, 41208064, +46982112, 3918621, -45871324, 14442364, 46248208, 9957882, -11747272, 41509248, 4330401, 27821188, +-71246528, -58780924, 42280732, -2847563, -19261854, -44978508, -9963787, -16752520, 19219978, 18137110, +21059836, 21960704, -9077950, 7001334, 39189428, 36526548, 37853156, 3377455, 54439248, 27445914, +-9752797, -21362094, 256087, -10403485, 3167539, 27975806, -4442070, 1460826, 20124606, 22513144, +2080912, 362925, 8564165, 24921010, 8625905, 11828877, 16726750, 6256157, 13004087, -351114, +-7415798, -2930242, -2863670, 1322850, 17300666, -6340983, 3014530, -13906030, 20949240, 10486700, +9130027, 61740, 10547366, 324270, 35930084, 9573482, 36888400, -9663676, 32260036, 15156403, +4719096, 14405857, 13845901, 16122770, -4279398, -2550137, 22033720, 7139847, 18525268, -41124848, +24249922, 32445256, 2443837, 11089069, -29350196, 22928682, -13357348, 10997801, 1052804, 112206, +19386946, -5982890, 12626667, -4043175, -23532662, 6302328, -1617592, 26338886, 23008140, 32748588, +10931229, -25036438, -20655034, 21264920, 23898272, 11063299, 2137820, 7566122, -6476811, -20521890, +3544422, -7591892, 29123100, 20326470, 17796734, 23057532, 23702314, -32618666, 36005248, 35342212, +25969520, -17528836, -15527381, -22675280, 31397822, 18321794, 51510080, -31284542, -30878668, -23931020, +-45346264, -11834782, 49250928, 7839389, 38713760, -41129680, -43861280, 9617506, 28093382, -38461968, +6190659, -30630634, 12384001, -35358856, -2617246, 16824998, 17969606, -32151052, 12888660, -24455544, +-48531520, -1603097, 57926224, 29894582, 23602456, -16118475, -41059352, 62746788, 50983408, 14263050, +-56140592, -2200634, -12989592, 40186936, 20795694, 24910810, -29034516, 22036940, -12863964, 14433774, +-19996830, 7186017, -22392886, 32828582, -6168110, 5391258, -38852812, 11338177, 5248987, -1832340, +-8432095, 7943542, 4479651, 4075924, -23880556, 10182294, 25111600, 1530619, 15272367, 12559021, +10781979, 1605244, 5319317, 471373, 1784022, 1038308, -7266548, -937377, 8268349, -194884, +16056198, 13109314, -6513318, -1448478, 7728257, 3000572, 12580496, -22695144, 15319075, 1519882, +-92879, -79750024, -15636902, -2177012, 1543504, 27562952, -73362872, -8558259, 34040836, -54659364, +12866111, -12533251, 64100240, 33501818, -38308960, 9473087, 43291660, 4255239, -16501264, 13994614, +10777684, 5531381, -310311, -4344897, 3787624, 6914898, 15143518, 43945032, 35716412, 38424388, +26741540, 48410188, 24024436, 49504328, 20820928, 43912284, 1017370, 27255862, 24948928, 27014270, +21085606, -2024003, 8473434, -33770256, -19749334, 64188824, 1191317, -25689274, -6806450, 20138028, +34220152, 69094216, -8957154, -38048580, -18766860, -28047210, 39756900, 45035952, 50838456, 15668578, +-1447404, 34148748, -57629336, 52824340, 20401632, -27834072, -129923, -90240488, 2531346, -59635620, +-82346872, -20569672, -48237852, -21075404, 94121520, 85565416, 80816792, -63240708, -6090801, -7168301, +63634772, 99160056, -21683680, -27908698, 55310588, 56473988, 48929340, -5698885, -7415261, -27361626, +-34130496, 5109938, -12289512, 15294379, 24261734, 20833276, 14802605, 1506460, 9739912, 26627186, +4964982, 248034, -7089918, 1605244, 2236067, 7321309, 5886790, 5523328, 27881318, -2291902, +-15923054, 16924318, 20379082, 4780836, 32296006, 7654706, 15844671, 34979288, 47050828, 34227668, +25371982, 10218264, 5117454, 13727252, 32372780, 14201846, 33170570, 24432996, 16136729, 22995254, +8818105, 31176630, 27511414, 22228066, 34080564, 19495930, 6674916, 9526774, -22592064, 57437136, +68490768, -56627532, -53075596, 18249852, 59802052, 2095407, -28900298, 795643, 15794742, 18722836, +-50549616, 19173808, -7266548, 26969710, -28028956, -12595528, -32743220, 34541200, -5234492, -14388140, +-30662308, 22635014, 12383464, -4582730, -26017838, 12505334, 10625749, 6627672, -23072564, -2603824, +-1759863, 26592290, -20202990, -4121558, -29255706, -6876243, 9245991, 23440858, -30429306, -10701985, +31060130, 27838904, -9010841, -18521510, -804770, -9106404, 25811680, -14449881, -9059160, 13534516, +8914741, 16911434, -15268609, 5327907, -20777978, 23900956, 26659936, 13748190, 3526705, -20674362, +23585812, -16462073, 36915244, -26767846, 29508036, -46688980, 31302796, 4876936, -3532611, -32564442, +-10738492, 11734924, -9315784, 4132832, -9051107, 10355703, -4980552, 11502996, -11217381, -13360033, +-9934259, 11021960, -96100, -252866, -3362423, -6890738, 4056597, 12807592, -6988449, -425739, +-188442, 2705830, -1565516, 3224447, -3045669, 9681930, -724239, 12236899, -11044508, 3077881, +-5670968, 12411382, -13108240, 12282533, -13518410, 8698383, 2527052, 15285789, -4452271, 14583561, +-13324599, -8260296, -3228742, 22899156, -11700565, 18038862, -7256884, 3830037, 983011, 13263396, +-6516539, 7536057, 780073, 1729798, -2309619, 5686000, -2847027, -5694053, 13309030, -7097434, +749472, -5251135, 3009162, -4782446, 5880884, -8202314, 10023380, -7387344, 8101382, -10732050, +9461813, -14097156, 13513578, -7526930, 8747238, -9209484, 9279277, -9168681, 9538049, -8071854, +8538932, -11131481, 9348533, -9041980, 9575630, -10489921, 11053635, -10041097, -1828582, -12332999, +55098524, 58624692, -34492344, -20437066, 11632382, 55987584, 34792456, 20863878, 20076288, -8913668, +-23419382, -7088307, 13166759, -199716, -5508296, 16707423, 302258, 11777874, 1455994, -6255620, +-20979304, -5564667, -1214402, 1558536, -816581, -17047262, 19055696, 3187940, -7649337, -418759, +-572841, 281320, 12308303, 22591528, 9645960, 2297808, -8112657, -11670500, -3013993, 7352447, +15152645, 20397336, -11356430, -11215233, 2561411, 20621212, 9311489, 4614406, -9288941, -18676666, +15967078, -3267396, 468151, 1105954, 5157182, 4949950, -2247879, -657667, -12171400, 1897302, +10770704, -5080947, 6443525, -3576634, -8667244, 5545877, -1629403, 3013993, -643171, 9378061, +6361921, -13908715, 4132832, 697395, -25266218, -33571076, 984084, 2000918, 7677791, 20496120, +2263448, -8974334, -8798777, 8096550, 8822400, 13393856, 9126269, 610422, 3905736, -1391033, +-10123775, -4174171, 1567126, -13880261, -13303124, 8626979, 9133785, -169114, 10270341, -14482093, +-2617246, -631360, 744103, -4438849, 2323577, 7903277, 10914586, 5368172, 9194451, -5747740, +-11377905, 6742562, 1085553, -2739116, 7810398, 4391067, -5354751, -19363324, -72814728, 30981746, +112008992, 103488848, 88138632, 35310000, -83840448, -52303576, -75383656, -84247928, -75528072, -21863532, +16202764, 63683628, 66120484, 79417168, 52431888, 53088480, 1212791, -55625732, -53327388, -65519728, +-51432232, -28475096, -2025614, -18309982, 19849728, 24687472, 39764956, 43875240, 44372380, 26589068, +2144799, 11865384, -9889699, 6399502, -30531848, -22035330, -28242632, -45919104, -36596344, -27888834, +-19845970, -32626720, 4450660, 55927452, 63005560, 35310000, 65884260, 16436840, 38409356, 19883552, +11217918, -16508244, -35313220, -48192756, -67894840, -51918100, -77440408, -31957242, -34529928, 22273164, +22141630, 64768644, 74465608, 66464620, 59034864, 57873072, 36075576, 4503810, -20329690, -61770756, +-38885024, -80710488, -68968048, -95735360, -15601469, -8522826, 23514410, 30368104, 54506356, 64295660, +53657564, 48058000, 35497904, 21053930, 2867428, -17790828, -25806310, -34571804, -53561464, -37509024, +-46648176, -32327146, -16708497, -4747013, 10441602, 10313827, 50965692, 47128676, 46549928, 36436356, +26584774, 3225521, 16485158, -18457622, -30777736, -23852100, -66495220, -77350752, -15051713, -5177046, +-3471407, 37786048, 30787400, 41234372, 28753732, 37683508, 11363410, 9766756, -3040300, -15916612, +-20639466, -26479010, -29490320, -18043158, -3933653, -22881976, -12215961, 18338974, 25977036, 17541720, +22480932, 15463493, 11075110, 2938831, -2190433, -7938710, -11372537, -8688719, -14183593, -7342784, +-2923799, -5259725, -7289097, 1619203, 5247913, 1210644, 8076149, 10526428, 7740068, 5596343, +4801237, 2540473, -843424, -4862977, -4938139, -6886980, -5145371, -5315559, -3452080, -2793876, +455803, 1325534, 2407329, 2004676, 3343632, 3434363, 2711735, 2054605, 2003602, 1465121, +1769527, 362388, -2085207, -3311957, -1641751, -2939905, -3384971, -2922725, -1828582, -803159, +1318018, 2040110, 2360622, 1582696, 3055869, 1952063, 1197759, 665720, 360240, -1198833, +-1299765, -1545651, -597537, -1179505, -1069984, -1098975, -169651, -463856, 324807, 254477, +1044214, 762357, 1269163, 671089, 807454, -110059, -280247, -572304, 315143, -583042, +-417149, -1090922, -371515, -380641, 491237, 285078, 807991, 301185, 447750, -395137, +53687, -317828, -108448, -675384, 62277, -245887, 280247, -6979, 428960, -128312, +376883, -137439, 236223, -261993, 207769, -248034, 214748, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { -5177583, --5267778, -4377109, 1221381, -2516851, -390842, -728534, 2542084, 10096394, -2692408, 1004486, --9618579, -5273683, 2947421, -4591320, -3559991, -1364189, -4056597, -1090922, 8399882, -3616363, --5360656, 9051107, 7267085, -2574296, -1671816, 8283918, 2371359, 3204046, 1612760, 392453, --2112587, -3510599, 3299609, -2618856, 2468533, 878858, 957778, -1175210, -2841121, -2251100, -2036888, -2589329, -4057134, -1848447, -1807644, -5195300, 5874442, 9046812, -5201206, 2943126, -261993, -2048163, 1447941, -238908, 86436, -3048890, 5616207, -3339337, -4095251, 4649302, -1435593, -258772, -512175, 2547989, 174483, -88047, -1596654, -822486, 4937065, -7208029, -2460480, 1307818, -1737851, -1735167, -2499671, -3676492, 40265, 3516505, 3621194, 1035624, --56908, 801548, -1993402, 2612414, -984621, 1530619, -1107028, -737124, -528818, -672162, --511101, 1196148, -45097, 483721, 746251, 428423, 1272921, 1574106, -513785, -384400, --700617, -510027, -1000191, -317291, -663036, -572841, -1017370, -424128, -103079, 618475, --387084, -15932181, -2506114, -5825587, -1422171, 1280974, -4331475, -9711995, 7125888, -2388002, -1667521, 4758824, -1502165, -488553, -581431, 2190970, -1671816, 8011725, -319438, 6180458, -9076340, -10878078, 2293513, 7558606, 534187, 1507534, 5245766, 9670119, 1396938, -2172180, -4881231, -1291175, -2505577, 2183991, 1735704, 2160906, -2707440, 9856950, -4531728, 2491618, -3691525, -38655, -465467, -4800700, 798864, -5563057, 4695473, -5682242, -4352413, 3160022, --5287642, 3647501, -3686693, 1538135, -2972654, 2032593, 4305168, 8406325, 2594160, 962073, -4103305, 74625, -7239168, 976031, 2055679, 2775086, -1808718, 394600, -983011, 1394254, -4063576, 2456721, 5545340, 1924145, 751082, -3352759, -1706176, 3275986, 2553895, -3208341, -3882114, 1909113, 4243965, -1302449, -1002875, -1305670, 207769, -799401, -3382287, -603980, -570694, 587874, 2202781, 266288, -641561, -812823, 936840, 491774, -1649268, -223338, --114890, 40265, 677531, 209380, -760746, -79457, -719944, -5772973, 4298189, 2821794, -869731, 5475547, -290447, 3076807, 7434052, 4623533, 9749039, 1902671, -1435056, -9962177, -1577327, -6100464, -2039036, 789737, 2258079, -3811784, 7516, 9620727, -4901095, -234613, --4893579, 2355790, 58519, 1887638, 3930432, 4646618, -2898029, 3492882, 3593814, 6969658, -277562, -6786049, 674310, 7387344, -710817, -432181, -1003949, 4977867, -5749351, 514859, -3794067, 4982699, 5946382, -2202245, -3872450, -465467, 8541616, 830002, 3093987, -6902550, --3089155, 1719598, 1445257, -1150514, 4532801, -274341, -924492, 2574833, -4349728, 316754, --671626, 3020973, 4590783, -6700686, -1499481, 2225330, 4525822, -2843805, -2757369, 1915019, -5361193, -427349, 3606699, 2597918, 3697967, 1596654, 4124242, 6247030, 253403, 1786706, --1700270, 2574833, 1815697, -1130113, -2780455, -473520, -1966558, 703838, -1796907, 840740, --811749, 491774, -1454920, 93952, -130460, 364535, -868120, 1439351, -1302449, -513785, --573915, -646929, 185757, 837519, 821949, 505732, -380105, -230854, -598074, 1927367, -357556, 17353816, 8363375, 6865505, -6477885, -1096827, -9024263, -6380174, 9610526, 914828, --6108517, -2785286, 2039573, -5708549, -542240, 9847823, 3900904, -360777, 3127810, 14421963, --9589588, 2341831, -1810866, -4603131, 8250632, 4247723, 4274566, -3170760, 3689914, 4794794, --1472100, 3094524, -980326, -4050154, 844498, 1589138, -720481, 4918275, 1195075, -1708323, -5381057, -2410014, -2542621, -3069291, 1509144, 2117419, 389768, 3920232, 517544, 12221329, -799401, 45634, -2826625, -2486786, 2920578, -9003325, 377957, 5486821, 4320200, -4835060, -7174743, 176631, 3212636, 5784784, -1619203, 4491462, 3448859, -1519345, -5159330, -3888019, -3248606, 8200167, 2332167, -3483755, -1731946, -1949378, 5614596, -4690641, -258772, 4682588, -5374615, 800475, 687732, -1423245, -2231236, 156766, -508954, -1823751, -375810, -797253, --920734, -1386738, -714575, 1967095, 1308891, -317828, 2484102, 793495, 1012539, -254477, -857920, -368830, -198642, -33286, 303332, 373125, 709743, 1410897, 360777, 224412, --390305, 4216584, 1078037, 11373610, 2795487, 6800544, -326954, 1548873, 1879048, 1935957, --1890859, 6959458, -2922188, 7526930, -3679713, -2832531, 1952063, -4875862, -1416266, -1490891, -2105071, 3172370, -1976222, -7161321, 3295314, -8671002, -3517578, -1414118, -187905, -1297617, -1727651, 7907035, 4446902, 608275, -8120710, -7747584, 297427, 5362804, -2759517, 909996, --966905, -3386582, -5197448, 628676, 3582003, 7643431, 6855842, -782221, 2232846, -9378061, -3281892, 6389838, 7196755, -783832, 6568616, 1496796, 9541807, 5716602, 1867774, 4399121, --377957, -2374043, -1632088, -854162, 6014028, -2174327, -3312494, -4041027, 6006512, -1324461, --10386305, 2194192, 4012573, 5971079, 7630547, 13066901, -5374078, -4320737, 7716446, 8220031, -6436546, 2862059, -1290101, -1347009, -4999342, -5534602, -1530619, -1913945, 1745367, -97174, --1600412, -95026, -3085934, 812823, -373125, 1613834, 246424, -2254321, -150861, 398358, --353798, -73014, 1180042, 2268280, 2182917, 1897839, 513785, 590558, -3155727, 302258, -2281702, -1296006, 1275068, 430570, -855772, -602906, -357019, 2370822, 1700270, 503585, --158377, 1378148, 146566, 985158, 523986, -573915, 744103, -276489, -292595, -14833206, -7100118, 10510859, 1185411, 8783745, 1007707, -7482907, -899259, -3382824, -2066416, 8125005, --10481331, -2669859, 3434363, 4254702, 9157944, -1634235, 3866008, -14416058, -7607461, 3948149, -8482560, -5488432, -4253092, -5898064, -7525320, 4056060, -1075352, 280784, 2575907, 1542967, -2695092, 11552388, -7037841, 11216844, -779537, 2459406, 2272575, 2601140, -3491809, 4037806, --7960185, -1273995, -4413616, -613643, -5956583, 7223598, 1069984, 19636590, 452582, -1036161, --5086852, 1068910, -4287451, 10362682, -6436009, 1555315, -11533598, 8733816, 7676181, -9200894, -5582384, 6050535, 2266132, -4889821, -5353677, 8763344, 2046552, -12167642, 5770289, -5666673, --3351148, 3009698, -3250753, 1318018, 2344515, 3546032, -6602439, -15471009, 2126546, 3730179, --637803, -3159485, 6034966, -2458869, -2160369, -2692408, 3964255, -4863514, -2155537, -2673080, --2284386, 1487669, -2084133, 2902861, 242666, -4300336, 3161633, 646929, -2458332, 73014, -2836826, 1183264, 1074, -188979, -960462, -2179159, 60130, 875100, 163746, -28454, -1229971, -2492692, 158377, 725850, -3147674, -2078764, -2679523, 6600291, 1284195, -133144, --5574331, -9376987, 3321620, -5033702, -2024003, 9067750, -12355010, -5153961, -9103720, -933619, -7809325, -732292, -6441377, -8948564, -10038949, 3903052, 10617696, -3053722, 6632503, 9976135, --2768643, -2317672, 3907347, 5540508, 11851425, -1734093, 6659347, 950262, 14090177, 10349261, -2829310, -3338263, 1415192, -7834557, 13677323, 3160022, -6048388, -6723772, 7881265, 6643241, -4786204, 3393024, 2330020, 7060390, -3077881, 3099356, -4704063, 648540, 366146, -7146289, --9526237, -3404299, -6735046, 4284767, -4119948, -3079492, -10392210, -6560563, 1966021, -3580929, --1266479, 4946729, 10365904, 13063680, 6788196, 5382668, -4856535, -10712722, 158914, -7511898, --17278116, 105227, -1242319, 6388227, 4310000, -4270808, -9642738, -5274757, 4616016, -281320, --1104880, -4032438, 2092186, 2138894, 1700807, -1080184, -5509906, 1096827, 681826, 475131, --1276679, -734439, -780610, 620623, -2720862, -2821794, -332860, 269509, -2272038, 127775, --490700, 1990717, 2706366, -3045669, -155156, 2084133, -413391, -1324461, 453656, 235149, -2934000, -1006096, 1867774, 1426466, -1336272, -1206349, -20002736, -6047851, 983011, 9792525, --7092602, 4828080, 2989834, -318364, 14486388, -1875827, 13624710, -8016020, 3914326, 4424890, -47782, -12484396, -5317170, -4618701, -14388140, 4935991, -3677029, 3093450, -1021665, 5237176, --151398, -5516349, 2842195, -9117679, 6638409, 4023848, 15497853, -606664, 333397, 14337138, --12760348, 11141145, 13448079, -8448738, 8608188, -3605088, -4252555, -7086159, 1653026, 1686848, -9516037, 6255083, -2643016, -3987340, -8369818, 4534949, 4970888, -9397925, -4395899, 8843338, --15620796, 1463510, -12104292, 6760816, 496606, -220117, 3447248, -4046933, 1206349, 14251775, --6042482, 3118146, 6763500, 4374424, 589484, -7514046, 3145527, 2780455, -4548371, -12179990, --47782, -2786360, -9831180, 7309498, -2813204, 2689187, -573378, 1382980, 2882997, 2982855, --5583458, 1357210, -732829, 1228361, -628676, 3633542, 1620276, -907312, -870805, -5266167, --412317, -3604015, 422517, 585189, 3601867, -5572720, 1855426, 2990371, -2322504, -3468186, -1021129, -517544, -2261300, 1653026, -664109, -2177549, 542777, -750546, -2725157, -719407, --1848447, -3367791, 1344862, -1047435, 71404, -1858647, -627602, -1901597, 646929, 3554086, --723165, -2209224, -8232916, 23741506, -8893267, 4671851, 3296924, 8520141, 2551211, 5199595, -11705933, -9050570, -5711770, -674310, 16324097, -6263673, -7095823, -8075613, 3955665, 2818036, -8885214, -18680960, 71404, 469762, -1380295, 9711995, -2445984, 7505456, 13681618, -9950902, --4605816, 4000225, -7630010, -9388799, 6252399, -8717173, 12856985, -2144263, -13460964, -1695975, --7777112, 4310000, 10464688, -135828, 5237176, -586800, 1942936, 12669617, 273267, 9207873, -3496104, -6778532, 7016903, 6169184, 726386, 5192616, 17965312, -2933463, -8251706, 4363150, --10413148, 871342, 17153026, 5930813, 2604361, -3227668, -5070209, -3265786, -6235219, 10477573, --6965900, -1760937, -4389994, 11879880, -21849572, 7493108, 7531225, 13135621, 2975876, 1056025, -11392938, -3198677, -5109401, -6463389, 36507, -5367099, -670552, -4610111, 3652333, 406948, --4288525, -4328254, -3801046, 1454383, 4377646, 3668976, 650151, 318364, -2048699, -4694400, --1712618, -1174137, 1829119, 2051921, -923418, -1121523, 803159, -2799245, -136902, -2716030, --1522566, -3591667, -5032091, -1321776, 1548873, 5493800, 749472, -1473711, -1584843, 2177549, --654446, 5265093, 2234994, 945967, 604517, 2026151, 34920768, 10443750, -6388227, -8471286, --7170985, 25326348, -21838834, 1746978, 8518531, 1272921, -11854647, -2668249, 5907728, -1262184, -1347546, 10503879, -10900090, -9127342, 4445291, 13686450, 8399345, 3532074, -6670621, -6486475, --6280316, -7276749, 6737193, 2683818, 9670119, 7781944, 4394289, -10323491, -4949413, -10998874, --2228014, -7223062, -16641925, -3110630, 7363185, 1627256, -7749732, -7782481, 141197, 3988951, -10330470, 1292785, 5209259, 1475321, 20010790, -17446694, 11333345, 2102923, -17834852, -3245922, --5421860, -4434554, 2663954, -7820062, 4627291, 3372623, 7888245, -9746355, 3365644, 15490336, -7204271, 24637006, -5596880, -665720, -6144488, -3158949, 593242, -548682, -23488640, 10375567, --1066226, -1431835, 6267431, 6221260, -6722698, -10036802, -10997801, -4123169, 7655243, 3229816, --2637647, -6516539, 5591511, -10206453, 5209796, -1739462, -4684736, -5807870, -6316823, -2327336, --2174327, 897648, -2699924, -1844689, 1179505, -1953136, -1848447, 980863, -5191542, -2413772, --467078, -1829656, -3023657, -1401233, -5276368, 623307, 3742527, 5097053, 5986648, -4549981, --5558225, -3970161, -5039608, 65498, -139586, -3136400, -3560528, 1191317, -589484, 3264712, --1190243, -382789, 2495376, 2498597, -2259690, -11547556, 2700998, 6511708, -383863, -7034620, --5125507, -15379741, -18593450, 3986804, -8313446, -3738769, 2586644, 4832, -2058900, -8075076, --4213363, 84289, 6358699, 7074348, -10260677, -5649493, 6266358, -8915815, -4578972, -14708116, -14291504, -1701344, 12866111, 1311039, 4758824, 13967234, 10314901, -5943161, 3036005, 7193534, --7467875, -2814277, 6729677, -2348273, -16627966, -2884608, -11677479, 17182016, -1889786, -4318590, --9805410, -13979582, 4991289, 3201361, 3257196, 7192460, 79457, -2383707, 7236483, 2071785, --1477469, 2779381, -4167192, 11435887, -2726767, 7293928, 20891258, 4885526, 3869229, 5122822, -7669201, -18031346, -14832670, 5840619, -16180752, 11383811, -2333778, 13013214, 3324305, 25161530, -9740986, 1924682, -7295002, -2985539, -12869333, -632971, 3958886, 2738579, 2687576, 4644471, -11344619, -4493610, -9261023, -2966749, -2593624, 3826279, 10302016, 3899294, -2510409, 3227668, -3012383, -279710, -2399813, -5755256, 395674, 935766, -2937221, -3716221, -758062, -6110128, -4476430, 2805688, -2987150, -701153, -6316823, -2829310, 2947421, 5819144, -2757906, -2291365, --85362, -4802847, 5432597, 33286, 3929895, -4970888, 53150, -5156645, 3249680, 5780489, --6316287, -1620276, -29613262, -20998632, 7899519, -8448738, -17052094, -26277146, -466004, 1948841, --4893042, -4306779, 25107842, 6413460, -17843978, 3647501, -10813654, -9373766, -8742406, -16215112, --2464238, 1372242, -21970906, -21101174, -7772280, 3368328, 2274185, 12619151, 10976863, 6592775, --5122822, -299574, 5139465, -11457899, -6115497, -3963181, 3992709, -10761577, -6292664, 7224672, -4657892, -361314, -1399623, -2062658, 6329708, -15445239, -8516383, -7631620, 10457708, -11977590, -8362838, 13615046, 18983218, -1291175, 5654325, -4480725, -8660802, -11761768, -2883534, 11526618, -4629438, -21017960, 1215476, 21698174, -14134201, 682900, -2782602, 1143535, 5465346, 11068131, --1989644, 3514894, 13608604, 9145596, 6173479, -10169409, -11924977, 8959302, -8534637, -16757889, --15780247, 17573396, 7019587, 9721122, 4504884, -2734284, -3035468, 8410620, 6287296, 1619203, -8426189, -3171297, -10208064, -5408438, -6997576, 3018288, 11069741, 5271536, 1677185, 6398965, -3902515, 5976984, -732292, -2949032, 4035659, -1233193, -3685619, -3393561, 3233037, -9667971, -2570001, 5833640, -3015067, 7198365, 5295158, -290447, -329102, 6805913, 1279363, -1413044, --3797288, -4042638, 1636919, 3667365, 1278290, 2988760, -3757023, -2913599, 1850594, -2455648, -2002529, -1439888, -17039210, 9243843, -13720810, -25462176, 4897874, -15615964, -8501351, 29322278, -2387465, 21872658, 20364050, -4347581, 21429202, 28795072, 21094196, -26385058, -3095061, -12437152, --11881490, -7827578, 912681, -11061688, 23125714, 6439230, 12870943, -10958072, 12340515, 8884140, -3460133, -13863618, -10142565, 21339546, -3544959, -20484310, -964757, -23658828, -2956548, 6213744, --7961796, 238371, -18649284, 8485245, 17712446, 9097278, -2120103, -9620190, -3064996, -2612414, --2811056, -9018894, -22991496, 15580531, 9341554, 8027831, 10359461, -13549548, 21114596, 2368138, --5795522, -4832375, -16032039, -7485055, 11132555, 6394670, 18135500, -2116345, -19786914, -35738424, --1634235, -449898, 602369, -13001403, -17439714, -3601330, 12317429, -6433324, -6773164, 4530117, --1124745, 17874580, -3084324, -16224776, -5264556, 16641925, 1560147, 3033858, -15866683, -5969468, --2592550, 6610492, 9252970, -4474819, 3548180, 526670, 7063611, 4142496, -148713, 2785286, -9302899, 2008971, 371515, -3048353, 1522566, 5679558, 341450, 2829847, 10588705, 1360431, --2903398, -7550553, -259309, 5286031, -4591320, 2649995, -1745904, -1690607, -2855617, -4566624, --2793339, -21475, 6946573, 4860829, -6131066, -12479564, -3045132, 4549444, 2302103, 1596117, -1280974, 38182796, 23584740, -3087545, -22368726, 4945655, 10692858, 6640557, 15768436, 24429774, --10956462, 2287070, -21876416, 6405944, 1468879, -8071318, 38551088, 15023259, 33220498, 14137959, -8337069, -28924994, 137439, 16588774, 2656437, -15263777, 6260989, -23487566, -9598715, 1921461, -6849399, -6835978, -4940286, 5437966, 3884261, 1999844, 20734492, 13362180, 3144453, -8148627, -14179298, -9149891, -7093139, -13584982, -4939213, 18362058, -28893318, -161598, 12496207, -13979045, --4809290, 5713380, 4494147, 26656178, -1848983, -24696, -12643847, 26066694, -11821361, 3528316, -2376191, 18131742, -4499515, -6180458, 16668231, -28419262, 7142531, 3016678, -12228846, 23205172, --29008210, -3372623, -9924059, -18986440, -9974525, -1445793, 7820599, 18283676, 29378650, 14762876, -19295678, 30176978, -12519830, 5774584, 7176354, -12524125, 16947940, 601832, -23257784, 12275017, -5998996, -8131984, 447750, 17945448, 13021804, 4199405, 10200010, 3392487, 3090766, 9964324, --2091649, 4379793, 8321499, -1866163, 1554778, -1342177, -841277, 6366216, 861141, 895501, --5707475, -2944200, -4062502, -7332046, 1296543, -3943317, -12462921, 4884989, 6914898, -2270964, --482110, 3483219, -4543002, 84289, 12436615, -1709397, -3937948, -7864622, -36939404, 10394358, -1699196, 44554916, 9885941, 8546448, -1463510, 21830246, 5585605, -32303522, -5247913, 34968548, --10567230, -7134478, 2663417, -2222109, 513249, -6154688, 35931696, 41371272, -22442814, 10167261, -10797548, 6184216, 11402601, -17978196, -25356414, 19430432, 4984310, -13710072, -24267638, -7050189, --8458938, 22039088, 17569638, 10177462, -20614770, 11273752, -9130564, 7227356, 865973, 9523016, -20293720, 4860829, -46538120, -14047227, 8109972, -18400714, 5246303, 19683836, 6198712, 34203508, --11681237, -51166484, -1583769, -20354386, 17425220, 15547245, -6003828, -10834592, 15415174, -24550570, --4822175, -13241921, 11186779, 16076063, 13241384, 14933601, -11552925, -20815560, -62539556, -29644938, --36595804, 5737540, -24962886, -11841762, -5472325, -26910654, 13942001, -48469244, 14593762, -34856344, --25778930, 24870008, 28849832, -9028021, -1726577, 15907485, 20166482, -28467580, 63351, 4644471, --4658966, 4999879, 14722611, -1979980, 6178848, -1325534, 5380521, -12619151, -7204808, -5781026, --8902393, -1849520, 11373073, 4933307, 10164040, 346282, -12086038, -10448045, 1140314, 6230387, --3045669, 6615324, 6288906, 16775605, 947577, 5712307, 1113470, 3925600, -8159364, -2372433, -2337536, -6135361, -455803, -2873870, -67646, 3013457, 16813724, -1741609, -11258183, -11708081, -319438, -1149441, -17904644, -11280732, 8134131, -12583180, -75699, -624918, -47482476, -7521562, -32510754, -38400228, 4379256, 13750338, 1069984, 9520332, -2159295, -30485678, -1823214, 15982110, -6212134, 24017458, 17257178, -26181584, -27191438, -4089883, -11347304, -4337380, -45268420, 16842178, -18985366, 31831076, 15389405, 28950764, -11913702, 3684545, 30866320, -9839233, 33533494, 8800925, -18104898, 5546414, -7563975, 15896211, -19105626, 675921, 42209864, -32439888, 3759707, -42098732, --18037252, -30344480, -19651086, -5527623, 3009698, -10138270, -31061740, -6006512, -52124796, 59558312, -21804476, 121870, -7268159, -14678588, 4153770, -26532160, 5705864, -39642548, 1749125, 1813550, -9668508, 25086904, 37267968, 1080184, -60203092, -28225988, 27047556, -13473849, -11314554, -14934675, --7229504, 30005178, 7168838, -17048872, 13564044, -28403156, 5848672, -5462662, -11632382, -28650654, --15235323, 17990544, -7648800, -6985228, 10683194, -10676752, -2338073, 17942762, -20051592, -14297409, --5145371, -4404489, 23597624, 10528575, 7157026, 13373454, 6288906, -2190433, 11479911, -197569, -8724152, 10962904, 18101140, -6559489, 975494, -1820529, 13671955, 19163608, 8221641, -4469451, --202400, -5660767, -12648679, 24525338, -5934034, 12729746, -5959267, 4058207, -6385543, -5319854, -7525857, 13320304, 660351, -4360466, -2358474, 11683922, -24481850, 17531520, 26642220, 10716480, --13151190, -15962246, 7283728, -20801064, 33268280, 28914794, 42342472, -30051350, -38480760, -8866423, --1555315, -18501108, 24613920, 31313532, -23390928, 530965, -41170484, -11344619, -19864224, -35945120, -10864657, 30759482, 17579302, -23163296, -9903658, 3372623, 19634442, 3626026, -2157147, 8215199, --2979097, -9703942, -33434710, -21638046, 7762617, -2490544, -18500572, 19910932, 16525960, 11530913, --34207268, -30011620, 28239946, 18021146, 20819854, -21270288, -56540024, -9999221, 22846542, 23904178, --6396280, 57054344, -7695508, 57346940, -86078120, -105357160, -44179644, -63266480, 77846, 25384868, -12419972, 69508144, -8512625, -4004520, 12177843, -13285408, -55110872, -47995724, -54646480, 43627740, -34652868, -12877923, -4333085, -89792200, 24465744, -717260, -40975060, 17175574, 25131464, 40329208, -30596810, 14896557, -3474629, -26395258, 99858, 1737851, -8214662, -11138461, 31139050, 20025822, -11683922, 32851668, -25730076, 6351720, -7732015, -15135465, 19598472, -2835752, -36245764, 107374, -10445897, -12392054, 16086800, -6429029, 3738232, -7526394, 38631084, 31090732, 35724464, -30472256, --7784628, 38113540, 27158152, -26531624, -17396766, -26736172, -16752520, 22339198, 24228984, -8544301, --3398930, 42409580, 914291, 4160213, -6412386, 7767985, 6387690, -1183264, -21705154, -5304285, --5213017, 6811282, 12234214, -41001368, 35798552, 27214524, 11224360, 33700996, -19766514, 12422119, --55763172, -26965952, 14719390, 20619602, 9507447, 7216619, 6988449, 14461692, -6733435, 63525252, -5775658, 39574904, 11410654, -19037442, 48440252, -6540162, 19056234, 1053878, 17398376, -1776506, --984621, 10684268, 24340116, 7137162, 17798882, 1311576, -3595425, 38268160, 4412005, -7979513, -724239, -2928631, -19160922, -5422396, 10830297, 7189239, -43027520, -10443750, 5521181, 10061498, -45146548, 36820216, -44486736, -24466282, 3766686, -9767293, 49715856, 4944581, 45864884, -32123134, -23138600, 4753455, 2640331, 21369072, 47143708, 30637612, 6386617, 41704132, 16456167, -19463718, --41819560, 36884104, -33324114, 22349936, -43920336, 303332, -69720208, 72599440, -17799956, 2604361, --48775260, 44112000, -16940962, 14033269, -35745940, 42616276, -22017612, -19889456, -14391362, -26627724, -8465917, -14875082, 12838194, -13782013, 23453206, -25996364, 23501524, -27372900, 15315853, -32067300, -25900800, -11008001, 28732258, -9859634, 15154255, -12033961, 9853729, -13741211, 711891, -15024869, -17536352, 7195681, 5123896, -5921686, 1896228, -11967389, 9542880, -12294881, 22080964, -17964238, --21314848, -9589051, 8958228, -25463788, 20010252, -6191732, 11107859, -7144141, 6437619, -11637214, -5773510, -5937256, 6866579, 8506720, -1548873, -70432096, -16990890, -5887327, 7875897, 5825050, --43038256, -25747792, 39869644, -15700253, 15041512, -17843978, 4381404, 49015776, 80228376, 5113159, --2284923, 39621612, 17999134, 16183437, 49905372, 724776, 30443266, 35861368, 35366372, -14004278, -15625091, 30966714, 44198972, 35341140, 54230404, 29953638, 69093672, 72351408, 53135724, 57632556, -40112312, -4633196, 19969988, 9976135, -14370424, -15120969, 12035035, 33556580, 8358007, 1290101, -461709, 16463147, 51023136, 38911868, 85249736, 16821240, -43246024, 17306034, 1530082, 17711372, --21876416, 33414846, -60647624, -79304960, 22815940, 79352208, 35310000, 15714212, -97885528, 403727, -38199440, 59411744, 80742704, -34151968, 5693516, -138068704, -90195920, 36730560, 52434572, -76937360, --64770792, -40973452, 76203992, 50211924, -89407800, -116577760, -22760106, 47378856, -54930484, 26477400, --7719667, -20205674, -29280940, 4129074, 12811351, 19589882, -2648921, -48232484, -40833328, 5142150, --12108587, 20242718, 3650185, -4990215, -17424682, -12110734, 8543227, -1036161, -39133056, -20125680, --29372744, -15625091, 6459631, -15387257, -10361609, -35792108, -46693272, -65610456, -64578056, -55283208, --45997488, -51809116, -50516868, -39297340, -53311820, -57550416, -47942572, -55251532, -34628712, -9359807, --30546882, -46035072, -29348586, 1824824, -15487115, -8813273, -9610526, 24503326, 27148488, 1336809, -13028246, 13716515, 9131100, 8070781, 1649268, 6434935, 6009196, 5952825, 4459250, 6941741, -2534031, 5660767, 2572686, 2167885, -310311, 1459752, -12943421, -2404645, -25675314, 65765612, -74876312, -84359064, -34395172, 31914292, -22994718, 15774341, -30278982, 27632208, -25573310, 6174553, -391379, -12712029, 6827925, 1298154, -7561290, -6074695, -20365124, -5682779, 4956393, 2397129, --20762408, 19978578, -19014894, -6851547, -16440061, 1775432, -15721191, 32702418, -382252, 8525510, --8529805, 8489540, -9090298, 9176198, 20387136, 27124330, -7111929, 8966818, 10376641, 23766202, --14687714, 15200426, -13070659, 28575492, -7339562, -16670379, 9633075, -7504919, -8452496, 2955474, --2267206, 12031814, -6322729, -16831440, -15697032, 2097018, 3382287, -29058138, 9007083, -4886599, --2561948, 4472672, -7775502, -5375152, 3226594, -5093295, 4267050, -15950972, 18381386, -51746304, -27348204, -22405234, 34631396, -23582054, 31047782, -1002338, 17023640, 9042517, 13912473, 5577015, -2631741, 5229660, -727997, -22255446, -4138738, 304943, -8348343, -4792110, -4181688, -3042448, -1611150, -8953396, -260919, 2325725, -358630, -14208826, 14861124, -3189550, 8157754, -15114527, -7394860, -9665824, 6400038, -11170136, 12424267, -15986405, 22042310, -4964446, 3543885, -23101018, -15986405, -2017561, 11810623, -22043920, 5985037, -9810242, 3955128, -5355824, 2721399, -14941654, -7624104, -3933653, -7808788, -295279, 18016314, -20656646, 2084670, -8868571, 10980084, -14946486, -13836774, -12307766, 4398047, -9276056, 10880763, -5180268, 6365679, -5686537, 7032472, -9357660, -5451924, -5226975, -601295, -2597918, 4673998, -3182571, 2500208, 151398, 3530463, -4391604, -1714766, 573378, -2002529, 2812130, -2643552, 1512365, -3767223, 3187403, -4074850, 2299418, --3038153, 2733210, -2217814, 2360622, -2996814, 3821447, -3767760, 3324305, -3528316, 4008278, --3062312, 4036196, -4028143, 4740570, -4981625, 4315906, -5147519, 4202089, -4096862, 4968204, --5756867, 5255966, -4980015, 4649839, -6388227, 5134634, -6193343, 5432597, -4622459, 4992900, --4686883, 4253092, -4955319, 4454955, -5487895, 3221762, -13464722, 63453848, 38643432, -21047488, --23996520, -2203855, 79073032, 32902134, 11183558, 21771190, -19033684, -24256364, 6852084, 15247134, -4117263, 1310502, -8288213, -6629819, 7553237, 7500624, 18508088, 8108899, -9783936, -4439923, --4771172, -10057740, 20938, 1697586, 5030481, 6171331, 326418, -2711198, 7475391, -21252036, --7914551, 9374840, 13662291, 16711718, -9291088, -5538361, -9884867, 17099876, 12009802, -3289408, -5598490, -19855634, -16995722, 15784542, 12459700, 3847217, -29873646, -15471009, 1392643, 4974646, -19925964, 14105209, -2056753, 5789079, 7186554, -9406515, 8749385, 9294846, -2585570, -5741298, -5703717, -10060424, 1113470, -1725503, -6878390, -10770167, 15116674, 3054259, 3487514, 20583094, -25215752, 8870181, 20442970, 18976240, -2811056, -5111011, -5517423, -3642132, 8096550, 12958990, --4835060, 4006668, -11427297, -4197257, -380105, 2794413, -6142877, -7531762, 8024610, 15016816, -6677064, 4199405, 6475200, -7150047, 791348, 7180112, 1603633, -2179159, 2007360, -669478, --8511551, 17827872, 6003291, -14135274, -13202193, 5481452, -2439005, 14089640, 7638063, -1700270, -5460514, 1895691, -2664490, -543850, -3811247, 4213363, 6663642, 1112933, -1439888, -5438503, -5007395, -972810, -4417911, -43487, -22725208, -62944356, 21849572, 115550192, 90984584, 86991880, -27906550, -80997176, -48477296, -71810240, -71901512, -65655556, -22823994, 35314296, 45668388, 71666896, -64316060, 38640748, 6570763, 6266358, -31016106, -49197776, -70275328, -27097486, -19026706, 6283537, --3895535, 35668628, 24186034, 10222559, 47805132, 26771068, 20501490, -4198331, 17996986, -32443646, --24368570, -20238960, -23535884, -31121334, -18668612, -12433930, -31561030, -21907018, 8463770, 46511812, -44990320, 51003812, 40143448, 58319752, 10157598, 14919106, -38726648, -28741384, -24566676, -58217208, --57895084, -52022256, -24525338, -30494804, 7199439, 22542672, 32538672, 65272228, 64191508, 61373472, -55128588, 48183092, 10341744, -28356448, -46116136, -82468200, -70792336, -51678120, -70365520, -32692218, --14664092, 3085397, 69113000, 54127324, 79495016, 78480864, 57379688, 16035797, -15830176, -23491324, --27196270, -24291798, -46761992, -57884884, -40415104, -27639726, -24408300, 3055332, 16263431, 25849798, -22287122, 46531140, 50889456, 38444788, 30588758, 5098663, -10771778, -21965536, -35923644, -30869540, --21909702, -34474628, -46715284, -4944044, 2673080, -7691213, 40192840, 53087944, 33940980, 29841432, -2181844, 8434242, -5580237, -9351218, -23276576, -27288074, -17978196, -20396800, 2832531, -8140574, -2553895, 403727, 18234284, 9860171, 9364102, 17135308, 17386028, 35433, -4702989, -12428025, --12525198, -3532074, -2925947, -5995775, -6067178, 1192390, 1365263, -1463510, 2862596, 3314641, -2930778, 927713, 11160473, 4163971, -426812, 1773822, -621160, -4090420, -4307852, -4912369, --5885179, -5176510, -1663226, -890669, 318364, 4896263, 6327561, 4913980, 4652524, 2456185, -427349, 69256, -807991, -4698158, -2812130, -33823, -3035468, -4320200, -2272038, -503048, -1955284, 1388348, 41876, 1182190, 3136400, 2243584, 1388885, 3139621, 1510218, -199716, --1432909, -2407329, -1995549, -2024540, -1692754, -1196685, -916976, -79457, 227096, -11274, -542240, 1161252, 1073742, 1734093, 2356327, 1202054, 314069, 637803, -437013, -1038845, --1635846, -1818919, -1676111, -1313186, -657130, 46708, 64961, 932545, 1189706, 718333, -846109, 1579474, 1020055, 208843, -450435, -348966, -376883, -853625, -1220308, -637803, --333397, -4832, 125091, 314606, 209380, 341450, 147640, 158914, -8053, 117038, --33823, 57982, -71404, 66035, }, +-5267778, -4377109, 1221381, -2516851, -390842, -728534, 2542084, 10096394, -2692408, 1004486, +-9618579, -5273683, 2947421, -4591320, -3559991, -1364189, -4056597, -1090922, 8399882, -3616363, +-5360656, 9051107, 7267085, -2574296, -1671816, 8283918, 2371359, 3204046, 1612760, 392453, +-2112587, -3510599, 3299609, -2618856, 2468533, 878858, 957778, -1175210, -2841121, -2251100, +2036888, -2589329, -4057134, -1848447, -1807644, -5195300, 5874442, 9046812, -5201206, 2943126, +261993, -2048163, 1447941, -238908, 86436, -3048890, 5616207, -3339337, -4095251, 4649302, +1435593, -258772, -512175, 2547989, 174483, -88047, -1596654, -822486, 4937065, -7208029, +2460480, 1307818, -1737851, -1735167, -2499671, -3676492, 40265, 3516505, 3621194, 1035624, +-56908, 801548, -1993402, 2612414, -984621, 1530619, -1107028, -737124, -528818, -672162, +-511101, 1196148, -45097, 483721, 746251, 428423, 1272921, 1574106, -513785, -384400, +-700617, -510027, -1000191, -317291, -663036, -572841, -1017370, -424128, -103079, 618475, +-387084, -15932181, -2506114, -5825587, -1422171, 1280974, -4331475, -9711995, 7125888, -2388002, +1667521, 4758824, -1502165, -488553, -581431, 2190970, -1671816, 8011725, -319438, 6180458, +9076340, -10878078, 2293513, 7558606, 534187, 1507534, 5245766, 9670119, 1396938, -2172180, +4881231, -1291175, -2505577, 2183991, 1735704, 2160906, -2707440, 9856950, -4531728, 2491618, +3691525, -38655, -465467, -4800700, 798864, -5563057, 4695473, -5682242, -4352413, 3160022, +-5287642, 3647501, -3686693, 1538135, -2972654, 2032593, 4305168, 8406325, 2594160, 962073, +4103305, 74625, -7239168, 976031, 2055679, 2775086, -1808718, 394600, -983011, 1394254, +4063576, 2456721, 5545340, 1924145, 751082, -3352759, -1706176, 3275986, 2553895, -3208341, +3882114, 1909113, 4243965, -1302449, -1002875, -1305670, 207769, -799401, -3382287, -603980, +570694, 587874, 2202781, 266288, -641561, -812823, 936840, 491774, -1649268, -223338, +-114890, 40265, 677531, 209380, -760746, -79457, -719944, -5772973, 4298189, 2821794, +869731, 5475547, -290447, 3076807, 7434052, 4623533, 9749039, 1902671, -1435056, -9962177, +1577327, -6100464, -2039036, 789737, 2258079, -3811784, 7516, 9620727, -4901095, -234613, +-4893579, 2355790, 58519, 1887638, 3930432, 4646618, -2898029, 3492882, 3593814, 6969658, +277562, -6786049, 674310, 7387344, -710817, -432181, -1003949, 4977867, -5749351, 514859, +3794067, 4982699, 5946382, -2202245, -3872450, -465467, 8541616, 830002, 3093987, -6902550, +-3089155, 1719598, 1445257, -1150514, 4532801, -274341, -924492, 2574833, -4349728, 316754, +-671626, 3020973, 4590783, -6700686, -1499481, 2225330, 4525822, -2843805, -2757369, 1915019, +5361193, -427349, 3606699, 2597918, 3697967, 1596654, 4124242, 6247030, 253403, 1786706, +-1700270, 2574833, 1815697, -1130113, -2780455, -473520, -1966558, 703838, -1796907, 840740, +-811749, 491774, -1454920, 93952, -130460, 364535, -868120, 1439351, -1302449, -513785, +-573915, -646929, 185757, 837519, 821949, 505732, -380105, -230854, -598074, 1927367, +357556, 17353816, 8363375, 6865505, -6477885, -1096827, -9024263, -6380174, 9610526, 914828, +-6108517, -2785286, 2039573, -5708549, -542240, 9847823, 3900904, -360777, 3127810, 14421963, +-9589588, 2341831, -1810866, -4603131, 8250632, 4247723, 4274566, -3170760, 3689914, 4794794, +-1472100, 3094524, -980326, -4050154, 844498, 1589138, -720481, 4918275, 1195075, -1708323, +5381057, -2410014, -2542621, -3069291, 1509144, 2117419, 389768, 3920232, 517544, 12221329, +799401, 45634, -2826625, -2486786, 2920578, -9003325, 377957, 5486821, 4320200, -4835060, +7174743, 176631, 3212636, 5784784, -1619203, 4491462, 3448859, -1519345, -5159330, -3888019, +3248606, 8200167, 2332167, -3483755, -1731946, -1949378, 5614596, -4690641, -258772, 4682588, +5374615, 800475, 687732, -1423245, -2231236, 156766, -508954, -1823751, -375810, -797253, +-920734, -1386738, -714575, 1967095, 1308891, -317828, 2484102, 793495, 1012539, -254477, +857920, -368830, -198642, -33286, 303332, 373125, 709743, 1410897, 360777, 224412, +-390305, 4216584, 1078037, 11373610, 2795487, 6800544, -326954, 1548873, 1879048, 1935957, +-1890859, 6959458, -2922188, 7526930, -3679713, -2832531, 1952063, -4875862, -1416266, -1490891, +2105071, 3172370, -1976222, -7161321, 3295314, -8671002, -3517578, -1414118, -187905, -1297617, +1727651, 7907035, 4446902, 608275, -8120710, -7747584, 297427, 5362804, -2759517, 909996, +-966905, -3386582, -5197448, 628676, 3582003, 7643431, 6855842, -782221, 2232846, -9378061, +3281892, 6389838, 7196755, -783832, 6568616, 1496796, 9541807, 5716602, 1867774, 4399121, +-377957, -2374043, -1632088, -854162, 6014028, -2174327, -3312494, -4041027, 6006512, -1324461, +-10386305, 2194192, 4012573, 5971079, 7630547, 13066901, -5374078, -4320737, 7716446, 8220031, +6436546, 2862059, -1290101, -1347009, -4999342, -5534602, -1530619, -1913945, 1745367, -97174, +-1600412, -95026, -3085934, 812823, -373125, 1613834, 246424, -2254321, -150861, 398358, +-353798, -73014, 1180042, 2268280, 2182917, 1897839, 513785, 590558, -3155727, 302258, +2281702, -1296006, 1275068, 430570, -855772, -602906, -357019, 2370822, 1700270, 503585, +-158377, 1378148, 146566, 985158, 523986, -573915, 744103, -276489, -292595, -14833206, +7100118, 10510859, 1185411, 8783745, 1007707, -7482907, -899259, -3382824, -2066416, 8125005, +-10481331, -2669859, 3434363, 4254702, 9157944, -1634235, 3866008, -14416058, -7607461, 3948149, +8482560, -5488432, -4253092, -5898064, -7525320, 4056060, -1075352, 280784, 2575907, 1542967, +2695092, 11552388, -7037841, 11216844, -779537, 2459406, 2272575, 2601140, -3491809, 4037806, +-7960185, -1273995, -4413616, -613643, -5956583, 7223598, 1069984, 19636590, 452582, -1036161, +-5086852, 1068910, -4287451, 10362682, -6436009, 1555315, -11533598, 8733816, 7676181, -9200894, +5582384, 6050535, 2266132, -4889821, -5353677, 8763344, 2046552, -12167642, 5770289, -5666673, +-3351148, 3009698, -3250753, 1318018, 2344515, 3546032, -6602439, -15471009, 2126546, 3730179, +-637803, -3159485, 6034966, -2458869, -2160369, -2692408, 3964255, -4863514, -2155537, -2673080, +-2284386, 1487669, -2084133, 2902861, 242666, -4300336, 3161633, 646929, -2458332, 73014, +2836826, 1183264, 1074, -188979, -960462, -2179159, 60130, 875100, 163746, -28454, +1229971, -2492692, 158377, 725850, -3147674, -2078764, -2679523, 6600291, 1284195, -133144, +-5574331, -9376987, 3321620, -5033702, -2024003, 9067750, -12355010, -5153961, -9103720, -933619, +7809325, -732292, -6441377, -8948564, -10038949, 3903052, 10617696, -3053722, 6632503, 9976135, +-2768643, -2317672, 3907347, 5540508, 11851425, -1734093, 6659347, 950262, 14090177, 10349261, +2829310, -3338263, 1415192, -7834557, 13677323, 3160022, -6048388, -6723772, 7881265, 6643241, +4786204, 3393024, 2330020, 7060390, -3077881, 3099356, -4704063, 648540, 366146, -7146289, +-9526237, -3404299, -6735046, 4284767, -4119948, -3079492, -10392210, -6560563, 1966021, -3580929, +-1266479, 4946729, 10365904, 13063680, 6788196, 5382668, -4856535, -10712722, 158914, -7511898, +-17278116, 105227, -1242319, 6388227, 4310000, -4270808, -9642738, -5274757, 4616016, -281320, +-1104880, -4032438, 2092186, 2138894, 1700807, -1080184, -5509906, 1096827, 681826, 475131, +-1276679, -734439, -780610, 620623, -2720862, -2821794, -332860, 269509, -2272038, 127775, +-490700, 1990717, 2706366, -3045669, -155156, 2084133, -413391, -1324461, 453656, 235149, +2934000, -1006096, 1867774, 1426466, -1336272, -1206349, -20002736, -6047851, 983011, 9792525, +-7092602, 4828080, 2989834, -318364, 14486388, -1875827, 13624710, -8016020, 3914326, 4424890, +47782, -12484396, -5317170, -4618701, -14388140, 4935991, -3677029, 3093450, -1021665, 5237176, +-151398, -5516349, 2842195, -9117679, 6638409, 4023848, 15497853, -606664, 333397, 14337138, +-12760348, 11141145, 13448079, -8448738, 8608188, -3605088, -4252555, -7086159, 1653026, 1686848, +9516037, 6255083, -2643016, -3987340, -8369818, 4534949, 4970888, -9397925, -4395899, 8843338, +-15620796, 1463510, -12104292, 6760816, 496606, -220117, 3447248, -4046933, 1206349, 14251775, +-6042482, 3118146, 6763500, 4374424, 589484, -7514046, 3145527, 2780455, -4548371, -12179990, +-47782, -2786360, -9831180, 7309498, -2813204, 2689187, -573378, 1382980, 2882997, 2982855, +-5583458, 1357210, -732829, 1228361, -628676, 3633542, 1620276, -907312, -870805, -5266167, +-412317, -3604015, 422517, 585189, 3601867, -5572720, 1855426, 2990371, -2322504, -3468186, +1021129, -517544, -2261300, 1653026, -664109, -2177549, 542777, -750546, -2725157, -719407, +-1848447, -3367791, 1344862, -1047435, 71404, -1858647, -627602, -1901597, 646929, 3554086, +-723165, -2209224, -8232916, 23741506, -8893267, 4671851, 3296924, 8520141, 2551211, 5199595, +11705933, -9050570, -5711770, -674310, 16324097, -6263673, -7095823, -8075613, 3955665, 2818036, +8885214, -18680960, 71404, 469762, -1380295, 9711995, -2445984, 7505456, 13681618, -9950902, +-4605816, 4000225, -7630010, -9388799, 6252399, -8717173, 12856985, -2144263, -13460964, -1695975, +-7777112, 4310000, 10464688, -135828, 5237176, -586800, 1942936, 12669617, 273267, 9207873, +3496104, -6778532, 7016903, 6169184, 726386, 5192616, 17965312, -2933463, -8251706, 4363150, +-10413148, 871342, 17153026, 5930813, 2604361, -3227668, -5070209, -3265786, -6235219, 10477573, +-6965900, -1760937, -4389994, 11879880, -21849572, 7493108, 7531225, 13135621, 2975876, 1056025, +11392938, -3198677, -5109401, -6463389, 36507, -5367099, -670552, -4610111, 3652333, 406948, +-4288525, -4328254, -3801046, 1454383, 4377646, 3668976, 650151, 318364, -2048699, -4694400, +-1712618, -1174137, 1829119, 2051921, -923418, -1121523, 803159, -2799245, -136902, -2716030, +-1522566, -3591667, -5032091, -1321776, 1548873, 5493800, 749472, -1473711, -1584843, 2177549, +-654446, 5265093, 2234994, 945967, 604517, 2026151, 34920768, 10443750, -6388227, -8471286, +-7170985, 25326348, -21838834, 1746978, 8518531, 1272921, -11854647, -2668249, 5907728, -1262184, +1347546, 10503879, -10900090, -9127342, 4445291, 13686450, 8399345, 3532074, -6670621, -6486475, +-6280316, -7276749, 6737193, 2683818, 9670119, 7781944, 4394289, -10323491, -4949413, -10998874, +-2228014, -7223062, -16641925, -3110630, 7363185, 1627256, -7749732, -7782481, 141197, 3988951, +10330470, 1292785, 5209259, 1475321, 20010790, -17446694, 11333345, 2102923, -17834852, -3245922, +-5421860, -4434554, 2663954, -7820062, 4627291, 3372623, 7888245, -9746355, 3365644, 15490336, +7204271, 24637006, -5596880, -665720, -6144488, -3158949, 593242, -548682, -23488640, 10375567, +-1066226, -1431835, 6267431, 6221260, -6722698, -10036802, -10997801, -4123169, 7655243, 3229816, +-2637647, -6516539, 5591511, -10206453, 5209796, -1739462, -4684736, -5807870, -6316823, -2327336, +-2174327, 897648, -2699924, -1844689, 1179505, -1953136, -1848447, 980863, -5191542, -2413772, +-467078, -1829656, -3023657, -1401233, -5276368, 623307, 3742527, 5097053, 5986648, -4549981, +-5558225, -3970161, -5039608, 65498, -139586, -3136400, -3560528, 1191317, -589484, 3264712, +-1190243, -382789, 2495376, 2498597, -2259690, -11547556, 2700998, 6511708, -383863, -7034620, +-5125507, -15379741, -18593450, 3986804, -8313446, -3738769, 2586644, 4832, -2058900, -8075076, +-4213363, 84289, 6358699, 7074348, -10260677, -5649493, 6266358, -8915815, -4578972, -14708116, +14291504, -1701344, 12866111, 1311039, 4758824, 13967234, 10314901, -5943161, 3036005, 7193534, +-7467875, -2814277, 6729677, -2348273, -16627966, -2884608, -11677479, 17182016, -1889786, -4318590, +-9805410, -13979582, 4991289, 3201361, 3257196, 7192460, 79457, -2383707, 7236483, 2071785, +-1477469, 2779381, -4167192, 11435887, -2726767, 7293928, 20891258, 4885526, 3869229, 5122822, +7669201, -18031346, -14832670, 5840619, -16180752, 11383811, -2333778, 13013214, 3324305, 25161530, +9740986, 1924682, -7295002, -2985539, -12869333, -632971, 3958886, 2738579, 2687576, 4644471, +11344619, -4493610, -9261023, -2966749, -2593624, 3826279, 10302016, 3899294, -2510409, 3227668, +3012383, -279710, -2399813, -5755256, 395674, 935766, -2937221, -3716221, -758062, -6110128, +4476430, 2805688, -2987150, -701153, -6316823, -2829310, 2947421, 5819144, -2757906, -2291365, +-85362, -4802847, 5432597, 33286, 3929895, -4970888, 53150, -5156645, 3249680, 5780489, +-6316287, -1620276, -29613262, -20998632, 7899519, -8448738, -17052094, -26277146, -466004, 1948841, +-4893042, -4306779, 25107842, 6413460, -17843978, 3647501, -10813654, -9373766, -8742406, -16215112, +-2464238, 1372242, -21970906, -21101174, -7772280, 3368328, 2274185, 12619151, 10976863, 6592775, +-5122822, -299574, 5139465, -11457899, -6115497, -3963181, 3992709, -10761577, -6292664, 7224672, +4657892, -361314, -1399623, -2062658, 6329708, -15445239, -8516383, -7631620, 10457708, -11977590, +8362838, 13615046, 18983218, -1291175, 5654325, -4480725, -8660802, -11761768, -2883534, 11526618, +4629438, -21017960, 1215476, 21698174, -14134201, 682900, -2782602, 1143535, 5465346, 11068131, +-1989644, 3514894, 13608604, 9145596, 6173479, -10169409, -11924977, 8959302, -8534637, -16757889, +-15780247, 17573396, 7019587, 9721122, 4504884, -2734284, -3035468, 8410620, 6287296, 1619203, +8426189, -3171297, -10208064, -5408438, -6997576, 3018288, 11069741, 5271536, 1677185, 6398965, +3902515, 5976984, -732292, -2949032, 4035659, -1233193, -3685619, -3393561, 3233037, -9667971, +2570001, 5833640, -3015067, 7198365, 5295158, -290447, -329102, 6805913, 1279363, -1413044, +-3797288, -4042638, 1636919, 3667365, 1278290, 2988760, -3757023, -2913599, 1850594, -2455648, +2002529, -1439888, -17039210, 9243843, -13720810, -25462176, 4897874, -15615964, -8501351, 29322278, +2387465, 21872658, 20364050, -4347581, 21429202, 28795072, 21094196, -26385058, -3095061, -12437152, +-11881490, -7827578, 912681, -11061688, 23125714, 6439230, 12870943, -10958072, 12340515, 8884140, +3460133, -13863618, -10142565, 21339546, -3544959, -20484310, -964757, -23658828, -2956548, 6213744, +-7961796, 238371, -18649284, 8485245, 17712446, 9097278, -2120103, -9620190, -3064996, -2612414, +-2811056, -9018894, -22991496, 15580531, 9341554, 8027831, 10359461, -13549548, 21114596, 2368138, +-5795522, -4832375, -16032039, -7485055, 11132555, 6394670, 18135500, -2116345, -19786914, -35738424, +-1634235, -449898, 602369, -13001403, -17439714, -3601330, 12317429, -6433324, -6773164, 4530117, +-1124745, 17874580, -3084324, -16224776, -5264556, 16641925, 1560147, 3033858, -15866683, -5969468, +-2592550, 6610492, 9252970, -4474819, 3548180, 526670, 7063611, 4142496, -148713, 2785286, +9302899, 2008971, 371515, -3048353, 1522566, 5679558, 341450, 2829847, 10588705, 1360431, +-2903398, -7550553, -259309, 5286031, -4591320, 2649995, -1745904, -1690607, -2855617, -4566624, +-2793339, -21475, 6946573, 4860829, -6131066, -12479564, -3045132, 4549444, 2302103, 1596117, +1280974, 38182796, 23584740, -3087545, -22368726, 4945655, 10692858, 6640557, 15768436, 24429774, +-10956462, 2287070, -21876416, 6405944, 1468879, -8071318, 38551088, 15023259, 33220498, 14137959, +8337069, -28924994, 137439, 16588774, 2656437, -15263777, 6260989, -23487566, -9598715, 1921461, +6849399, -6835978, -4940286, 5437966, 3884261, 1999844, 20734492, 13362180, 3144453, -8148627, +14179298, -9149891, -7093139, -13584982, -4939213, 18362058, -28893318, -161598, 12496207, -13979045, +-4809290, 5713380, 4494147, 26656178, -1848983, -24696, -12643847, 26066694, -11821361, 3528316, +2376191, 18131742, -4499515, -6180458, 16668231, -28419262, 7142531, 3016678, -12228846, 23205172, +-29008210, -3372623, -9924059, -18986440, -9974525, -1445793, 7820599, 18283676, 29378650, 14762876, +19295678, 30176978, -12519830, 5774584, 7176354, -12524125, 16947940, 601832, -23257784, 12275017, +5998996, -8131984, 447750, 17945448, 13021804, 4199405, 10200010, 3392487, 3090766, 9964324, +-2091649, 4379793, 8321499, -1866163, 1554778, -1342177, -841277, 6366216, 861141, 895501, +-5707475, -2944200, -4062502, -7332046, 1296543, -3943317, -12462921, 4884989, 6914898, -2270964, +-482110, 3483219, -4543002, 84289, 12436615, -1709397, -3937948, -7864622, -36939404, 10394358, +1699196, 44554916, 9885941, 8546448, -1463510, 21830246, 5585605, -32303522, -5247913, 34968548, +-10567230, -7134478, 2663417, -2222109, 513249, -6154688, 35931696, 41371272, -22442814, 10167261, +10797548, 6184216, 11402601, -17978196, -25356414, 19430432, 4984310, -13710072, -24267638, -7050189, +-8458938, 22039088, 17569638, 10177462, -20614770, 11273752, -9130564, 7227356, 865973, 9523016, +20293720, 4860829, -46538120, -14047227, 8109972, -18400714, 5246303, 19683836, 6198712, 34203508, +-11681237, -51166484, -1583769, -20354386, 17425220, 15547245, -6003828, -10834592, 15415174, -24550570, +-4822175, -13241921, 11186779, 16076063, 13241384, 14933601, -11552925, -20815560, -62539556, -29644938, +-36595804, 5737540, -24962886, -11841762, -5472325, -26910654, 13942001, -48469244, 14593762, -34856344, +-25778930, 24870008, 28849832, -9028021, -1726577, 15907485, 20166482, -28467580, 63351, 4644471, +-4658966, 4999879, 14722611, -1979980, 6178848, -1325534, 5380521, -12619151, -7204808, -5781026, +-8902393, -1849520, 11373073, 4933307, 10164040, 346282, -12086038, -10448045, 1140314, 6230387, +-3045669, 6615324, 6288906, 16775605, 947577, 5712307, 1113470, 3925600, -8159364, -2372433, +2337536, -6135361, -455803, -2873870, -67646, 3013457, 16813724, -1741609, -11258183, -11708081, +319438, -1149441, -17904644, -11280732, 8134131, -12583180, -75699, -624918, -47482476, -7521562, +32510754, -38400228, 4379256, 13750338, 1069984, 9520332, -2159295, -30485678, -1823214, 15982110, +6212134, 24017458, 17257178, -26181584, -27191438, -4089883, -11347304, -4337380, -45268420, 16842178, +18985366, 31831076, 15389405, 28950764, -11913702, 3684545, 30866320, -9839233, 33533494, 8800925, +18104898, 5546414, -7563975, 15896211, -19105626, 675921, 42209864, -32439888, 3759707, -42098732, +-18037252, -30344480, -19651086, -5527623, 3009698, -10138270, -31061740, -6006512, -52124796, 59558312, +21804476, 121870, -7268159, -14678588, 4153770, -26532160, 5705864, -39642548, 1749125, 1813550, +9668508, 25086904, 37267968, 1080184, -60203092, -28225988, 27047556, -13473849, -11314554, -14934675, +-7229504, 30005178, 7168838, -17048872, 13564044, -28403156, 5848672, -5462662, -11632382, -28650654, +-15235323, 17990544, -7648800, -6985228, 10683194, -10676752, -2338073, 17942762, -20051592, -14297409, +-5145371, -4404489, 23597624, 10528575, 7157026, 13373454, 6288906, -2190433, 11479911, -197569, +8724152, 10962904, 18101140, -6559489, 975494, -1820529, 13671955, 19163608, 8221641, -4469451, +-202400, -5660767, -12648679, 24525338, -5934034, 12729746, -5959267, 4058207, -6385543, -5319854, +7525857, 13320304, 660351, -4360466, -2358474, 11683922, -24481850, 17531520, 26642220, 10716480, +-13151190, -15962246, 7283728, -20801064, 33268280, 28914794, 42342472, -30051350, -38480760, -8866423, +-1555315, -18501108, 24613920, 31313532, -23390928, 530965, -41170484, -11344619, -19864224, -35945120, +10864657, 30759482, 17579302, -23163296, -9903658, 3372623, 19634442, 3626026, -2157147, 8215199, +-2979097, -9703942, -33434710, -21638046, 7762617, -2490544, -18500572, 19910932, 16525960, 11530913, +-34207268, -30011620, 28239946, 18021146, 20819854, -21270288, -56540024, -9999221, 22846542, 23904178, +-6396280, 57054344, -7695508, 57346940, -86078120, -105357160, -44179644, -63266480, 77846, 25384868, +12419972, 69508144, -8512625, -4004520, 12177843, -13285408, -55110872, -47995724, -54646480, 43627740, +34652868, -12877923, -4333085, -89792200, 24465744, -717260, -40975060, 17175574, 25131464, 40329208, +30596810, 14896557, -3474629, -26395258, 99858, 1737851, -8214662, -11138461, 31139050, 20025822, +11683922, 32851668, -25730076, 6351720, -7732015, -15135465, 19598472, -2835752, -36245764, 107374, +10445897, -12392054, 16086800, -6429029, 3738232, -7526394, 38631084, 31090732, 35724464, -30472256, +-7784628, 38113540, 27158152, -26531624, -17396766, -26736172, -16752520, 22339198, 24228984, -8544301, +-3398930, 42409580, 914291, 4160213, -6412386, 7767985, 6387690, -1183264, -21705154, -5304285, +-5213017, 6811282, 12234214, -41001368, 35798552, 27214524, 11224360, 33700996, -19766514, 12422119, +-55763172, -26965952, 14719390, 20619602, 9507447, 7216619, 6988449, 14461692, -6733435, 63525252, +5775658, 39574904, 11410654, -19037442, 48440252, -6540162, 19056234, 1053878, 17398376, -1776506, +-984621, 10684268, 24340116, 7137162, 17798882, 1311576, -3595425, 38268160, 4412005, -7979513, +724239, -2928631, -19160922, -5422396, 10830297, 7189239, -43027520, -10443750, 5521181, 10061498, +45146548, 36820216, -44486736, -24466282, 3766686, -9767293, 49715856, 4944581, 45864884, -32123134, +23138600, 4753455, 2640331, 21369072, 47143708, 30637612, 6386617, 41704132, 16456167, -19463718, +-41819560, 36884104, -33324114, 22349936, -43920336, 303332, -69720208, 72599440, -17799956, 2604361, +-48775260, 44112000, -16940962, 14033269, -35745940, 42616276, -22017612, -19889456, -14391362, -26627724, +8465917, -14875082, 12838194, -13782013, 23453206, -25996364, 23501524, -27372900, 15315853, -32067300, +25900800, -11008001, 28732258, -9859634, 15154255, -12033961, 9853729, -13741211, 711891, -15024869, +17536352, 7195681, 5123896, -5921686, 1896228, -11967389, 9542880, -12294881, 22080964, -17964238, +-21314848, -9589051, 8958228, -25463788, 20010252, -6191732, 11107859, -7144141, 6437619, -11637214, +5773510, -5937256, 6866579, 8506720, -1548873, -70432096, -16990890, -5887327, 7875897, 5825050, +-43038256, -25747792, 39869644, -15700253, 15041512, -17843978, 4381404, 49015776, 80228376, 5113159, +-2284923, 39621612, 17999134, 16183437, 49905372, 724776, 30443266, 35861368, 35366372, -14004278, +15625091, 30966714, 44198972, 35341140, 54230404, 29953638, 69093672, 72351408, 53135724, 57632556, +40112312, -4633196, 19969988, 9976135, -14370424, -15120969, 12035035, 33556580, 8358007, 1290101, +461709, 16463147, 51023136, 38911868, 85249736, 16821240, -43246024, 17306034, 1530082, 17711372, +-21876416, 33414846, -60647624, -79304960, 22815940, 79352208, 35310000, 15714212, -97885528, 403727, +38199440, 59411744, 80742704, -34151968, 5693516, -138068704, -90195920, 36730560, 52434572, -76937360, +-64770792, -40973452, 76203992, 50211924, -89407800, -116577760, -22760106, 47378856, -54930484, 26477400, +-7719667, -20205674, -29280940, 4129074, 12811351, 19589882, -2648921, -48232484, -40833328, 5142150, +-12108587, 20242718, 3650185, -4990215, -17424682, -12110734, 8543227, -1036161, -39133056, -20125680, +-29372744, -15625091, 6459631, -15387257, -10361609, -35792108, -46693272, -65610456, -64578056, -55283208, +-45997488, -51809116, -50516868, -39297340, -53311820, -57550416, -47942572, -55251532, -34628712, -9359807, +-30546882, -46035072, -29348586, 1824824, -15487115, -8813273, -9610526, 24503326, 27148488, 1336809, +13028246, 13716515, 9131100, 8070781, 1649268, 6434935, 6009196, 5952825, 4459250, 6941741, +2534031, 5660767, 2572686, 2167885, -310311, 1459752, -12943421, -2404645, -25675314, 65765612, +74876312, -84359064, -34395172, 31914292, -22994718, 15774341, -30278982, 27632208, -25573310, 6174553, +391379, -12712029, 6827925, 1298154, -7561290, -6074695, -20365124, -5682779, 4956393, 2397129, +-20762408, 19978578, -19014894, -6851547, -16440061, 1775432, -15721191, 32702418, -382252, 8525510, +-8529805, 8489540, -9090298, 9176198, 20387136, 27124330, -7111929, 8966818, 10376641, 23766202, +-14687714, 15200426, -13070659, 28575492, -7339562, -16670379, 9633075, -7504919, -8452496, 2955474, +-2267206, 12031814, -6322729, -16831440, -15697032, 2097018, 3382287, -29058138, 9007083, -4886599, +-2561948, 4472672, -7775502, -5375152, 3226594, -5093295, 4267050, -15950972, 18381386, -51746304, +27348204, -22405234, 34631396, -23582054, 31047782, -1002338, 17023640, 9042517, 13912473, 5577015, +2631741, 5229660, -727997, -22255446, -4138738, 304943, -8348343, -4792110, -4181688, -3042448, +1611150, -8953396, -260919, 2325725, -358630, -14208826, 14861124, -3189550, 8157754, -15114527, +7394860, -9665824, 6400038, -11170136, 12424267, -15986405, 22042310, -4964446, 3543885, -23101018, +15986405, -2017561, 11810623, -22043920, 5985037, -9810242, 3955128, -5355824, 2721399, -14941654, +7624104, -3933653, -7808788, -295279, 18016314, -20656646, 2084670, -8868571, 10980084, -14946486, +13836774, -12307766, 4398047, -9276056, 10880763, -5180268, 6365679, -5686537, 7032472, -9357660, +5451924, -5226975, -601295, -2597918, 4673998, -3182571, 2500208, 151398, 3530463, -4391604, +1714766, 573378, -2002529, 2812130, -2643552, 1512365, -3767223, 3187403, -4074850, 2299418, +-3038153, 2733210, -2217814, 2360622, -2996814, 3821447, -3767760, 3324305, -3528316, 4008278, +-3062312, 4036196, -4028143, 4740570, -4981625, 4315906, -5147519, 4202089, -4096862, 4968204, +-5756867, 5255966, -4980015, 4649839, -6388227, 5134634, -6193343, 5432597, -4622459, 4992900, +-4686883, 4253092, -4955319, 4454955, -5487895, 3221762, -13464722, 63453848, 38643432, -21047488, +-23996520, -2203855, 79073032, 32902134, 11183558, 21771190, -19033684, -24256364, 6852084, 15247134, +4117263, 1310502, -8288213, -6629819, 7553237, 7500624, 18508088, 8108899, -9783936, -4439923, +-4771172, -10057740, 20938, 1697586, 5030481, 6171331, 326418, -2711198, 7475391, -21252036, +-7914551, 9374840, 13662291, 16711718, -9291088, -5538361, -9884867, 17099876, 12009802, -3289408, +5598490, -19855634, -16995722, 15784542, 12459700, 3847217, -29873646, -15471009, 1392643, 4974646, +19925964, 14105209, -2056753, 5789079, 7186554, -9406515, 8749385, 9294846, -2585570, -5741298, +5703717, -10060424, 1113470, -1725503, -6878390, -10770167, 15116674, 3054259, 3487514, 20583094, +25215752, 8870181, 20442970, 18976240, -2811056, -5111011, -5517423, -3642132, 8096550, 12958990, +-4835060, 4006668, -11427297, -4197257, -380105, 2794413, -6142877, -7531762, 8024610, 15016816, +6677064, 4199405, 6475200, -7150047, 791348, 7180112, 1603633, -2179159, 2007360, -669478, +-8511551, 17827872, 6003291, -14135274, -13202193, 5481452, -2439005, 14089640, 7638063, -1700270, +5460514, 1895691, -2664490, -543850, -3811247, 4213363, 6663642, 1112933, -1439888, -5438503, +5007395, -972810, -4417911, -43487, -22725208, -62944356, 21849572, 115550192, 90984584, 86991880, +27906550, -80997176, -48477296, -71810240, -71901512, -65655556, -22823994, 35314296, 45668388, 71666896, +64316060, 38640748, 6570763, 6266358, -31016106, -49197776, -70275328, -27097486, -19026706, 6283537, +-3895535, 35668628, 24186034, 10222559, 47805132, 26771068, 20501490, -4198331, 17996986, -32443646, +-24368570, -20238960, -23535884, -31121334, -18668612, -12433930, -31561030, -21907018, 8463770, 46511812, +44990320, 51003812, 40143448, 58319752, 10157598, 14919106, -38726648, -28741384, -24566676, -58217208, +-57895084, -52022256, -24525338, -30494804, 7199439, 22542672, 32538672, 65272228, 64191508, 61373472, +55128588, 48183092, 10341744, -28356448, -46116136, -82468200, -70792336, -51678120, -70365520, -32692218, +-14664092, 3085397, 69113000, 54127324, 79495016, 78480864, 57379688, 16035797, -15830176, -23491324, +-27196270, -24291798, -46761992, -57884884, -40415104, -27639726, -24408300, 3055332, 16263431, 25849798, +22287122, 46531140, 50889456, 38444788, 30588758, 5098663, -10771778, -21965536, -35923644, -30869540, +-21909702, -34474628, -46715284, -4944044, 2673080, -7691213, 40192840, 53087944, 33940980, 29841432, +2181844, 8434242, -5580237, -9351218, -23276576, -27288074, -17978196, -20396800, 2832531, -8140574, +2553895, 403727, 18234284, 9860171, 9364102, 17135308, 17386028, 35433, -4702989, -12428025, +-12525198, -3532074, -2925947, -5995775, -6067178, 1192390, 1365263, -1463510, 2862596, 3314641, +2930778, 927713, 11160473, 4163971, -426812, 1773822, -621160, -4090420, -4307852, -4912369, +-5885179, -5176510, -1663226, -890669, 318364, 4896263, 6327561, 4913980, 4652524, 2456185, +427349, 69256, -807991, -4698158, -2812130, -33823, -3035468, -4320200, -2272038, -503048, +1955284, 1388348, 41876, 1182190, 3136400, 2243584, 1388885, 3139621, 1510218, -199716, +-1432909, -2407329, -1995549, -2024540, -1692754, -1196685, -916976, -79457, 227096, -11274, +542240, 1161252, 1073742, 1734093, 2356327, 1202054, 314069, 637803, -437013, -1038845, +-1635846, -1818919, -1676111, -1313186, -657130, 46708, 64961, 932545, 1189706, 718333, +846109, 1579474, 1020055, 208843, -450435, -348966, -376883, -853625, -1220308, -637803, +-333397, -4832, 125091, 314606, 209380, 341450, 147640, 158914, -8053, 117038, +-33823, 57982, -71404, 66035, }, { -3223910, --4303557, -6033356, 1952600, -2881386, -6213744, -3766150, 2638184, -7556458, -4388383, -9270150, -3137474, 4329864, 5217849, 3046206, -3418794, 7251516, -5004174, 1568200, 19864, -894964, --5280663, -2509335, -5794985, 351114, -2537252, 3302293, 1971927, -2573759, -992674, -488553, --5328981, -87510, -1284195, 2440615, -220654, 4833449, -1802276, 6081674, -2705293, 205622, -830539, -4217658, 2893734, -1204738, -1796370, 620623, -1303523, 2406256, -9237401, 4348655, -5360119, 894427, 2991982, 1796907, -4159139, -439160, -4502737, 6066105, -1702418, -3636227, -3477313, -5398237, 118112, 2195265, -6342056, 810675, -1575716, -2306934, 2027761, 525060, -458488, -2887829, -1989107, -9951439, -1324997, 2210298, -1696512, 528281, 1162862, 5369783, -4478577, 306016, 1443109, 679679, -908386, -706522, -1383516, -676994, -466004, -986232, --955093, -6442, 941672, 680215, 627065, -1513976, -28991, -18790, -457951, -75162, -350040, -189515, 35433, -714038, -609885, -634045, -46708, -592706, 915365, 1206349, -1236414, -14256070, -8574902, 1585917, -4634807, 883153, -4781909, -8189966, -5459441, 9297530, -5405217, -1440962, 6291054, 1481764, 1541356, 1765768, -3058554, -832150, 5111548, -4123169, -2317135, 3732327, -4002373, -6320045, 2887292, -5166846, 566936, 2957622, 7577396, -1712618, --3666292, -3203509, 1173063, 4123169, -5614059, -49392, 4602058, 1813013, 476205, -308164, --441308, 5986111, -238371, 5483600, 3596498, -1397475, 3583077, -1269163, -337692, -565325, --10028749, 3462281, 5651103, -3282429, -1879585, 1374390, 1529008, 1602023, 871878, -551366, --1222455, 331786, -2533494, 6851547, -3089692, 790274, 3710852, 2969433, -2467459, 2700461, -841277, 1756105, 3747359, 3312494, -4991826, 5143760, 5692979, -1945620, 79994, -369367, -3711389, -4573067, -2392834, 994285, 634581, 166967, 228170, -979253, -1553168, 911070, --744640, -398895, 246424, 1300838, -989990, -235686, 9127, -1797444, 590558, -1068373, --1120987, -867583, 648540, 90194, -536871, -1076426, 232465, -5650567, 7225746, 4728759, -11179263, -1854352, 1204738, 3424163, -5425081, -1125281, 2172180, -2241973, -7369627, -436476, -804233, 4953708, -5950141, -14557255, -11745662, -7238631, 2811593, 6925098, -6956774, 3922379, --3405372, 5351530, 4168803, 3628174, 6424734, 3575024, -5015448, -4638565, 883153, 3432216, --252866, 295816, 8982924, -67109, 1573569, 4469987, 4726075, 785442, 145492, 11095511, --765578, -4162897, -1242319, 2523293, 3246459, -2148021, 5974300, 1173063, 3212636, -4264366, --3769908, -1453846, -2488397, 1447941, -1971390, 6497749, -7483981, -6688338, 8116415, -847182, --327491, -9418863, 2939905, -4566624, 5095979, -3917547, -10423886, -476741, 5380521, -4465692, -6951405, -4172024, 3207267, 6485938, -1823214, 2714956, 6536940, -424128, -4807679, 406411, -3198677, 1480690, -2321967, 4498442, 308701, 2373506, 902480, 648540, 1711545, 311385, --668941, -44560, 245887, 690416, -1804960, -919660, -936840, 1729798, 217970, 1763084, -1840930, -1699733, 428423, 449898, -972810, -726386, -340913, 335007, -881542, 367220, --921807, 17395154, 4096325, 4641249, 1990181, -3970161, 8346732, -3944928, -2364916, 10625212, --800475, 8546448, -902480, -9758703, 3453154, -3305514, 10772852, 5680094, -752693, -9637907, --6747394, 8920110, 10567767, -12328704, 6180995, 4954782, 3715684, -798327, 1196685, 1037772, --937914, 12225624, -556735, -2085744, -3370476, -4090956, -5231270, -1717450, -280247, -7033546, --2509335, 1844152, -4907537, 279173, 280247, 7317551, -2744484, 235149, 3398930, 294742, -6987375, 3161096, 7264937, 3599183, 2210835, -7679939, 805843, -5689221, -5326833, 1279363, -7408819, -284005, 6362457, -2662880, -4815195, -1112397, 302795, 1878511, 4367445, -2015413, --42950, -2385854, 2438468, 1676111, -6271189, 1224603, 1297080, 836982, -1768453, 6562710, --700617, -1277216, 697932, 3081639, 1346472, -2150168, -701690, -869194, -1582159, 1291711, --1890323, 3097208, -1872069, -365072, 370441, -1459752, -425739, 1722282, -2031520, -460098, --2186675, 849867, 905164, 1757179, -2388002, 475131, -981400, 1206886, -819802, -2849174, --923418, 4906464, 3438121, 3945464, 11186242, 5852967, -4854924, -4340602, -12040404, -782221, --267899, -6425271, 2442226, 9662066, 1170916, -7612830, 7068980, 6717329, -700617, 2685428, -6808060, 1613297, -6186364, -955093, 14424648, 7095823, 1491427, -9516574, -3406983, 8680666, -2986076, -1297080, 4887673, 4370129, 4576288, -37044, 8952859, -81604, -1149441, 2255932, --4449049, -5828808, -295816, 985695, 3327526, 1827509, -5447629, 5530308, 9706626, 4982162, --268435, 7208566, -8210904, 4680978, -4893042, 5143224, -1373316, -5908802, -302795, -7697119, --12600360, -4600447, -5009006, -616328, -56371, -6598144, 1276142, -2029372, 3823058, 2522220, -4528506, -725850, 1820529, -6353867, 1097364, 1002875, 8847096, -3422552, -282394, -3076270, -1865626, 7956427, 4087198, -4626217, -7397545, 2333778, -2961380, -1017907, 3843996, -548145, -1289027, 900869, -4407174, 206158, -3364033, 951335, -3195993, -2153389, -1167694, -137976, --434329, 576599, -2049236, -216896, -693637, -1634772, -1381906, 486405, -363998, -849867, -212601, 752693, 2442763, -872415, 1426466, -1064615, -2472291, 1822677, -2704756, 2588255, --251256, -1746978, -302258, 858993, 1893544, -1408749, -192737, 403190, -485331, -11795591, --7793755, 16679505, -3645890, -3663607, 984621, -587874, 17891224, -5231270, -9644349, 233002, --9513889, 2370822, 7598871, 8159901, 2587181, -16603270, 13653164, -10744398, 5714454, -7346005, --5574331, -4113505, 6820945, 7323993, -10976863, 867047, 4805532, -3411815, 2208150, 3221762, --3962644, 505196, -9038759, -6082748, -13955422, 8266202, -1944547, 14074071, -6549289, 3052648, -9409200, -2351495, -2783139, -4164508, 10782515, 7863548, -13219372, 3770981, -7472706, -2515240, --2896956, -7432441, 4472135, 2363843, 11659226, 8196408, -14624364, -2401961, -6276558, 8546985, -2984466, 732829, -8529268, 1276142, -889595, 7182259, -1191853, 896574, -9811853, -227096, -6980933, -6433324, 1087164, -2032056, -1909113, -5200132, 1053341, -687195, 12368969, 5448166, -5660767, -2266132, -1374390, -2150705, -3361349, -1809255, 2763812, -3786014, -1198296, -3713536, -2811056, 2353642, -2013803, -1138166, 2613488, -3496104, 1736777, 529355, -935229, -1112397, -940598, -99321, -314069, -672162, 2284386, -3372086, 450972, 302258, 1710471, 1845762, -1850594, -1711545, 507880, -1207960, 2470680, 678068, 586800, 1806571, 4070019, -4483946, -307090, -9453223, -1181653, -10908680, 1707786, -2732673, 6262599, -440771, 5313949, -7471633, --14066555, 2986076, 9467719, 1237488, -1139240, 7384123, 4971425, -11502996, -181462, -4335233, -14567992, -644782, 1699733, 1147830, 153545, -452045, -5221070, 11547020, -976031, -16356846, --3067144, 9921374, -6383395, 1660542, -255014, 1332514, -2042794, 1586990, -3003793, 3919158, --6269579, 5919539, 8298414, -6491306, -1650878, -3838627, -11387032, 4571993, -8082055, 7051263, --7102802, -12284143, -3352222, 7319161, -2275259, -4380330, 4893042, 6769942, 3873524, 7419019, -12678207, 10218264, -649614, 2000918, 1736777, -6783364, 1305133, -7093139, -7736310, 4242891, --5899138, 1939178, -340376, 4472672, 4537633, -5861020, 6840273, -1851131, -2790655, -1241246, -4813585, -863825, -4424353, -3004867, -6270116, 7201050, -3592203, -922344, 1249299, -276489, --2648921, -2244121, 494995, 973347, 326954, -1233193, 1670742, 1242856, -1399086, 153008, -1080721, 677531, -846645, 4295, -1141388, 476205, -1919850, -1755031, 1109175, 580357, -2404645, 2643552, 239444, 1827509, 39192, -102005, -16072304, -13477607, 7867843, 14402636, -24696, -852551, 2774012, -6925635, -3330210, -16646219, -8836895, -4716411, -132070, -12108050, -17340394, 3441880, 9659381, -11038603, -13150116, -9907416, -3839701, 2636036, -14932528, -6694244, -6938520, -2965675, -18168786, -6167573, 2462090, 191663, 11288785, 3792456, -3534758, -8623221, -10737418, -6228240, -619012, 8085276, 2399813, -8806830, -4514548, -685584, -14711874, 3704946, -11451457, -4984310, -6310918, 1667521, -7442642, -2753074, 1487669, -4750234, -3621731, 3877282, --5545877, -11743514, 5813775, -6698002, -8747238, -12033961, -6004901, 1196148, -4793721, 1996623, -14811195, 8356396, -1787780, 14105209, 14343043, -6206765, 2009508, 3977677, -7406671, -4820027, --15704548, 1619203, -5017059, -12713640, -107911, 6693707, 11851962, 7281044, 3495567, 1320703, --10662793, -1339493, -2413772, 2800856, -4016868, -467615, 277025, -153008, 2601140, 499290, --939524, 2295660, -920734, -3367791, 2741800, -2257542, -2991982, 460098, 1142461, 1014149, -272194, 3281892, -301185, 2100776, 1263794, 251256, 696858, -18790, -2517388, 575526, --3473555, 814970, -5568962, -1394791, -212064, -3694209, -4356708, -575526, -4306779, -807991, --891206, -4952634, -10247255, 26097296, -1032403, 16005196, -8054138, -22831510, 6519224, 1985886, --907312, -10693395, -1053878, -7036767, 18090940, 13273596, 11837467, 8679592, -14194330, -63888, -1943473, 12617540, -21546240, -2424509, -5279052, -6275484, 3228205, -7077033, 2758980, 4816269, -3560528, 3852586, 4986457, -1480153, -2125472, -10457708, -2500745, -1583232, 10281615, 15569, --9422621, -2199023, 11188927, -1288490, 6507949, 8383776, -6072010, -3576097, -13879187, -8050916, -27151710, 7166690, 12081206, 6507413, 1570884, 1034013, -17212618, 10212895, 1610613, 3006477, -8784282, 9594957, 14918569, -17163226, -7094212, -9519795, -1205275, 2393908, -2269353, -4802311, --2819646, -14392972, -18103288, -11745662, -16966194, -2191507, -11089069, -18985366, -8029442, 6184216, -10406169, -3946538, -16245714, -565862, -2452963, 3859565, -4466229, 1057099, 9339943, 441845, --684510, -568009, 1190243, 1655173, -2757906, -2469606, -6527277, -7306813, 3900904, -1996623, -3491272, 3168612, -1188632, 2161979, 2880313, 5272609, 3735011, -2274722, 1159641, 6716255, -1294933, -6766184, -5601174, -3048353, -1410897, 523449, -2379949, 3894462, 4286378, -1016834, -6466610, 865436, -1796907, -1372242, 1507534, -3733400, 35032436, 7936026, -5062156, -7266548, -1120987, -11239929, -21977884, 16181826, 68719, 10417443, -7873212, 7539278, 17986786, -1770600, -2006824, -4520990, 15656230, 13191992, 5115306, -21204790, 1535988, 3132642, 13112535, 19092740, --5631776, -3893388, -2522220, 5128191, 6815040, 5677410, -9648107, 4422743, -11121281, 8522826, -11363410, -5417565, -11247982, 7116224, -12239583, -11187316, -467078, 3265249, 15953119, 1938104, --2182917, 13601625, -2517925, 12219182, 22558778, 11318313, 260382, -14310294, -1359357, -8237748, --6683506, 14423574, 5634997, -14512158, -165893, -11091216, -2811056, 19117974, 8791798, 2798708, -8185134, 11520176, 5971079, -15391552, 7945153, 12866648, 4412005, -10514080, 4346507, 1235340, -2209224, -8224326, 12712566, -3484292, -3047816, 15292231, 16200617, 2401961, 4615479, 17620104, -1042603, 8706436, -6167036, -173946, 10149545, 5890011, -4483409, 5250061, 9162776, -2463701, -83215, 11684995, 2420214, 4984310, -3443490, -5815386, -1758789, 3275986, 1707786, 2704756, -2771328, -1888175, -1810866, -1495186, 913754, 3519726, 4242354, -2815351, -838592, 7295539, -1082869, 9774272, -1736241, 2680597, -1305670, 1275068, 4409858, 2709051, 375810, -39192, --4108673, -2869038, -2067490, -4385699, 5634997, 5064840, -8513162, -440771, -10876468, -25597468, -8840653, -10202695, 2830384, 896574, 17935784, -12366821, -10931766, -4601521, -5004174, -6615860, -13245679, -11752104, -16581258, 4945118, -30982820, 897648, -5842230, -13113609, 16653736, -1079111, --994822, 7000260, -6614787, 5258114, -1686848, -18512382, -20208358, -213675, 4251481, 11825656, -5704254, -1360431, -2144263, -11646878, -5526549, 11669963, -18285824, 25195352, 14955076, 3356517, -18622978, -12455405, -5349919, -11404212, -11668889, -5050345, 8492224, 23791972, 191663, -12311524, --2092186, 1147293, -1352915, -1287417, -7586523, 6405407, 5871757, 16034187, -321049, 18131204, -9324911, 4971962, -482110, 3856344, -27131846, 14277545, -3478924, -15875273, 11286637, -28991, -14865956, 6596533, -25149182, 19472844, 15180562, -13158169, 21120502, 8126615, 15769509, 6250788, --2234994, -896574, -702227, -2975876, -5571110, -1712081, 2299418, -5550709, -8457864, 61740, --5531918, -9906342, -5947456, -7423314, 4655745, -4568772, 5734855, 1530082, 5851893, 2773475, --690416, -3169149, 973347, 548145, -488016, 808528, -1784559, -4118874, 1940252, -389231, -2376728, 2599529, 69793, 2195265, 993748, 3795141, 3236795, -5971615, -3610457, -5356361, --9992778, -7022272, -48070348, -3587372, 28226526, -5126044, 673773, 24903294, -5932424, 382789, -2855617, 6708202, -7636452, 6691559, -2743947, -8194261, 7817378, 9510131, -28175522, 3388192, --25096568, -597000, -13092134, -13999446, -3273302, -4156992, -13858786, 6921340, 2071248, 8710194, -11593727, -16922172, 21184926, 1543504, -20194400, 1708860, -14001593, -6912750, -15046881, -13462575, --6030134, 14230300, -12401181, 6808597, 14149233, -8545911, -15495705, -14061186, -20884278, -22264574, --13302051, -6306086, 1542430, -3329137, 5951751, 4270271, -13429289, -927176, 14682346, 8586713, --22192096, 8672076, -1875290, -6089190, -20580410, 13789529, -7517804, 19017042, 23802708, 660351, -22626962, -12537546, 13033615, -9863929, 14029511, 18163416, 1355599, -23848342, -956704, -32556926, -10330470, 7078643, 12716861, 6161131, -12992276, -11081016, -432718, -7426536, 7144678, -8036958, --499290, -486405, -8235063, -6259915, 5278515, -3127810, -9289477, -852551, 2598992, 6765647, -3400004, 14664092, -1746441, 1242319, -4589173, 10286447, -1680943, -2223719, 8792335, -493384, -1121523, 2149094, 11928735, -1952600, -5177046, 1262720, 8165270, 7936026, -8224863, -775778, -5312338, -9257265, 4938139, -1494112, 6391448, 392453, -8115341, -4387846, 3613141, 4138201, -4905390, 3743064, -22801444, 18434536, -43478492, -2560338, -4169876, -3614752, 4002910, -24934432, -1716376, -4902169, -2164664, 11402601, 4448513, 13265543, -10270341, 9393093, -4920959, -22145388, --8965744, -16249472, -10151155, 10748693, -19391240, 2558190, -7205345, -14634027, -2651069, 14361834, --19276886, -18478560, 7544110, 11154030, -656056, -8722005, 10343892, 11003169, 13392782, 11608223, -4763119, 15877957, 18735722, -10039486, 2781528, -8847096, 23514946, -1865626, -16324097, 19685446, -8584566, 4766340, -9360881, -12345883, 2864743, 7525857, 7488813, -613643, -10283762, 7841537, --11970074, 391379, -11812771, 36424544, 5582384, -10408316, 29843580, -3608846, 9107478, -7693360, -14973330, 22360136, -13892072, 21363168, 22586696, 29582660, 22646826, 2167885, 16810502, -13151727, --2639258, 3219615, -7350300, 13088376, 552440, -792958, -1335735, -3750580, 6320045, 3255048, -17863842, -5822902, 6579353, -3892314, 79457, 3417183, 5244155, -7499013, 2748779, 7536594, --3287261, -8422968, -1676648, -13539348, 4667556, 4275103, 3650722, -3537979, 2217277, 7173133, -3991635, -1680406, 6815576, 3118683, -4488778, -2228551, -1458141, 11232950, 14530948, 7793218, -3338263, 2663954, 4958540, 8696235, -5807870, -2282775, 3892314, -863825, 780610, 4040491, --3461744, 44935560, 11553462, -7482907, -6664716, 10554882, 2873333, 4584878, -1170379, -17749490, -14952392, -40715216, 4407174, 9126806, -1868848, -7318625, -15724949, -7046968, 1821603, 12267500, -18485540, -10820633, -23837068, -19084150, -2779381, 854699, -14069776, 28985124, -13498545, -8667244, -11863237, -3910031, 2098629, -2443300, 24705188, 4273493, -24856586, 9971840, 3103651, 17313014, --6171868, 1999307, -10302553, 8669928, 3741990, 21787296, -5313949, 9907416, 10233296, -12949863, --14463839, 1163399, 13109851, -25349970, -30175366, -8737574, -12411919, -1495186, -4403415, 3129958, -6805913, -5980742, 1005022, -34675956, -29591250, 23640574, 24950538, -30020210, -23194970, -28889024, --15211164, -11889006, 15017353, -15716359, -27998892, 943819, 1187559, -16995186, -3665218, 24488830, --3693672, 1474248, 7818451, -130997, 1376537, -956704, -8644159, -10586021, -593242, -2922188, -6995965, -1014686, -690953, -7634841, 3869766, -11874511, -297963, 3775276, 3963181, 5874979, -6514929, 1321776, 3685082, -2559264, 606127, -5996848, 2209761, 720481, -6900939, 7169911, -7055021, -10987063, 679142, 8196408, 6681359, 12611098, -2597918, -14446659, 4041564, 4846871, --7176891, 4709969, -7989176, -3673271, -1235877, -2441689, -6781754, 2551748, -24827596, -3143916, --5927055, 7402913, -11701638, -3310346, -38659000, 34237332, 22174380, -3817152, 47195248, -4711043, --25704306, -2464774, 10687489, -16042777, -20939040, -4506495, -14253386, -754304, 4127464, -21711060, -31878858, 986232, 3543348, -20032264, -5625334, 2083059, -5575405, 5026186, 7364259, 26037166, -4809827, -1397475, 21229486, 17342542, -6029061, 10205379, -13183939, 3701188, 11942693, 11416560, -29656750, -29233158, 18080738, 54069880, 543313, 8834748, 18670222, 2067490, 3837017, 8696235, -6896107, -18133888, -21398600, -7883413, 17497696, 5124970, -22238266, -12177843, -816044, -10801843, -20088098, 1789928, 15555298, -34207804, -20995410, 9927817, 23613194, 14321032, 9620727, 32458678, -19160386, -13678934, 22565758, -16895864, -3249143, -2454574, 12771085, -2679523, -13777181, 12104292, -5472325, 1135482, -15822660, 11071889, -48855, 193810, -6950868, 9330816, -7429757, -6176700, --5647882, 4440460, -5899675, -11748883, 4145180, 811749, 128849, -6397354, -1028108, -8006893, --6630893, -6403796, -3813931, -2473364, -2782065, -2436857, 1360431, 228170, -14920180, 10183904, -4248797, -4785668, -10969883, -15966004, -141197, -8691403, -5610301, 5783174, -3952444, 9912785, -5201743, -3469797, 2001455, 9279277, -3878892, -1513976, -4154844, 7831336, 2143726, 3276523, --7584376, 16019691, -45107896, 959388, -308164, -1445793, -5730023, 21066278, 1656784, -12120935, --22626424, 22896470, -20347408, 531502, 14673219, 11829414, -16007343, -4274030, -25764436, -106837, -7328288, 8987219, 10375030, 2750390, -16799764, -20876762, 17131550, 8881992, 8504572, 3380139, -8651675, 2625299, 12597139, -22512608, -38186556, 10590316, -5818607, -8102456, 21208012, -3710315, --11403675, 18824304, 17671642, 14749991, -1427003, -9571335, -16472810, -4219806, -21766358, 51015620, --4421132, 18382996, 3868692, -16916802, 13830868, -6459094, -16309601, 15950435, 12570832, -28033788, -19486804, -2972117, 27059368, -27431420, -20794084, 27704150, -1210107, -22395034, 22818624, -8382703, -39030516, -16583942, -13514651, -23592792, 14919106, 2793876, -19287088, 7683697, -25045564, -18210124, -1571421, 16216723, -14395657, -8743480, -28436978, -25687126, 30107720, -3458523, 13086228, 21195126, -28566364, 164283, -2956011, -2193655, 7504919, 11523934, 2092186, 5304822, 17577154, 7756174, -9666898, 5797669, 4377646, -3417183, -1676648, 10882910, 8223789, 14253923, -6764574, 9409736, -9860708, -15477452, 3929895, 3947075, -8483634, -4279935, -47782, 3954054, -6894497, 11230803, -596464, -2532420, -3209414, 9543954, 343061, 3016141, 852014, 2719788, 2139968, -8626979, --4333085, -6433324, 782221, -75162, 4756677, 6197638, -5541045, -12905840, 33430952, -7626252, -22633404, -35421132, -6245420, -822486, -42293080, -9296994, 6096169, 20762946, -10429791, -9920838, -893353, -3270081, 29644938, -2834679, -14949171, 31459024, -3935264, -1634235, 5907191, -12582107, -27166206, 1787243, -5582384, 13019120, 11131481, -14853608, -5120138, -6898255, 21146272, -42341936, --756451, -8220568, -14972256, 7237557, -15222975, 24634858, -6494528, -30515742, -3196530, 46335180, --28142774, 20296942, -31372588, -9035001, 31181462, 22795002, -16859894, 7905961, -20555714, -26996554, -5722507, -11879880, 11742977, 3386582, -1907502, 4578435, -39545376, -15469398, -20169704, -28904594, -13403519, -10982231, -8064875, -16034724, -28101972, -23629300, 18482854, -3709778, 57686780, 10104447, -5310190, 20593294, 36273148, 4734665, -26200912, 31826782, 24077050, -20378546, 5369783, -5178657, --20304458, -16004659, -13727789, -1593970, -12533788, 4679367, 8475044, 2937221, -9771051, 16919486, -2618320, 7793755, -2345052, -3001645, 8006893, 4873714, -8149701, -7355132, -7048042, 7729868, -3680250, 9347996, 9939091, 327491, -5374078, 7504382, -4343286, 16165720, 7662222, -19564650, --3879966, -14453639, 1710471, -4792110, -6980933, 20237350, -1121523, -6424734, 5171678, 6274947, --7439420, -1611687, -10222022, 4406637, 7323456, -1548873, -3256659, 1018444, -6892886, -1950452, --1102196, 9410810, 22501334, -13341242, -16915728, 19013284, -30223684, -3605625, -6158983, 1739462, -21436718, -14017163, 23783382, 10110353, 5483063, 7039452, -38565048, 26234198, 5011153, -27226872, -10755672, -28876138, 5035313, 38679400, -4684736, -22938884, -24263880, 10386842, 17708688, 14176613, -7698729, -25550760, -17351668, -7927973, -4602058, 33048700, -20787642, -12575664, 49386220, -27374510, --1949915, 19502910, 259309, 20547124, -2829310, -16590922, -10934987, -30141006, 15573015, 21423296, --31957778, 48063368, 16201690, -36254892, -32861868, -31532576, -37575596, -30562450, 1793149, 15093589, -3190624, -25464862, -9406515, 16997334, -219043, -15952582, 17799418, -34273304, 2433636, -7890392, --31425738, -29571386, 5387500, -11766600, 22635014, -41004052, -5240934, -14523969, -29744260, 2052994, -48631376, 12399034, -21100638, 10391673, -26040386, 10690174, -10394895, 932545, 1757715, 13690208, --1148904, 4684199, 17551920, 183073, -9212168, -4390531, 14150307, 9782325, 6708202, 3382824, --26776974, -2756832, 2415919, 15202574, 7969849, -14057428, 114354, 1617055, 24091008, 1329829, -8010114, -7320772, -4261682, 3504157, 8152385, -964757, -6569690, -13294534, 2391223, -5031554, --8749922, 4543539, -5957120, -6561100, 9649718, -7358353, -10130217, -14671071, -12486544, -2388539, -4336307, 64425, -10765872, 9419937, 23890756, -59210420, -53983980, -47558172, -30081950, 11886322, --12504797, 60175176, 16362215, -6925098, -13562970, -8123931, 17485886, -39906152, 46476376, 60589640, -24577950, -4182761, 48570176, -15826418, 29474214, 54989540, -9870909, 2537789, 10646687, 73330128, --18495202, -5206037, 44123272, 16099685, 14326937, -12671764, -44817448, 2530810, -35489852, 16438987, --44033080, -52374980, -450972, -3576097, -35990752, -2539400, -17435420, -37691024, -29479582, -48998596, --2179696, 48686140, -15633681, -10130754, -45400488, -25074556, -16669305, -16319265, 15475841, -11871826, -82228760, -20180978, -1085553, -30746598, 62051540, 50191524, -36003636, 40662604, -14478872, -61022896, --10763725, -6590628, 12670690, -14817637, -13695040, -8398272, -24458766, 6229313, 30184494, -36581312, --5134634, 9476308, 6200322, -42374148, 26922466, 18172006, 62221192, -27435714, 17004312, 25428354, --1662689, 6375879, -916976, 8240432, -7030862, 19377282, 8438000, 15550466, 13837311, 435402, -14245870, 3770981, -5527623, 14439680, -1061394, 1847373, 1493038, 9872519, 7635915, -11862163, --8917963, -14872935, 21447456, -15336254, 3029563, 12566537, 5393942, 23354422, 20456930, 35152160, -24322936, 19665044, 1184337, 12704513, -19060528, 16595217, 12690018, -4949413, -18347564, -34833796, --13553843, 9183714, -19253802, -7859790, -14055817, -34166464, -29232084, -14479945, -21832392, -13649943, --18838264, -24445344, -25312926, -8628052, -7490960, -12050068, -18683108, -10973105, -16718160, -12257837, --13703093, -4560182, -6568079, -5917928, -7117298, -6387690, -9249212, -5163088, -18581640, 24885040, -104487968, 12195560, -65514896, -16246251, -23169202, 5046587, 32613298, 58655296, 16750909, -49192408, --950262, 34086472, 7393250, 770410, -1538672, 8917426, -4715337, -5952825, 40475236, 25402584, -22601728, -34395172, -22351010, 23452668, 9043591, 13856638, -11962558, 4336307, 45090716, 1083406, -38227892, 20122996, 20841866, 37402724, 5388574, -19834696, 4562866, -22719304, 5668283, 15835544, -3987877, 61139396, -20449414, -39417600, -38038916, 47212964, 21731460, 25138444, 17139604, -27072252, --34014532, -20715702, -1228898, 10255845, -7492034, 16633335, 31222802, -2196876, 22617298, 20567524, --31781684, -6337761, 8942659, -14926622, -13506598, -15674483, -52385180, -8929237, 22512608, 1894081, -45533632, 30320858, -22259742, 16029892, 126165, -15309948, -12950937, -25431038, -56633440, -30291330, -2166811, 862215, -12652974, -3546569, -6025839, 17902498, 18719614, 9584220, -3585761, 1175210, -14147085, -7321309, 8814884, -25704842, -12268574, -3599183, 13469017, -3806415, 5202816, 8636105, -8616778, 851477, 24211268, -19921668, -17880486, -18152680, 12519830, -11922292, -18668076, -18607408, -12677133, -6471979, -13660680, -7467875, 9476308, 1968706, 13974213, -24324010, -15863462, -3335042, --1761474, 4123706, 10830297, -5874442, -9630390, 15307800, -8556112, -10720238, -8988293, 14691473, --4293357, -9008694, 4414153, -1850594, -8582955, -799938, -11389180, -8104067, -5164698, -1768990, --3637301, 1419487, -2934000, 82678, -1082869, 716723, -5811091, -360240, -2148558, -273804, --3255048, -62277, -5091684, 467078, -3877819, 336081, -3296924, 321049, -1396401, 1210107, --2267206, 519691, -3026341, 12348, -3240553, -866510, -4192425, -593779, -3076270, -783832, --2767033, -638876, -1737314, -743029, -2878165, -489089, -1251983, -237834, -1704028, -77309, --2339684, -280247, -1575716, -784368, -981937, -636192, -1603633, -455803, -1211181, -1102196, --729071, -566936, -1012002, -377957, -969589, -6983617, -24307368, 1739999, 83454976, 20071456, -35704064, -18327162, -74075840, -39244188, -54263152, -19776176, 38222524, 84169544, 39097088, 8358007, --39521752, -39344584, 27919972, 41310068, 22078816, 50411640, -1153736, -34830036, -48302276, -25130390, --6586333, 37171332, 5720897, 21021180, 20746302, 2230699, 52177948, 34770444, -2919504, -5996311, --46127948, -12581033, 22012, -118648, 28041842, 47164648, 30562450, 22080964, 46337328, 25082072, --45988364, -38885560, -10770704, -30711164, 32465658, 20270636, 47538844, 35147864, 42174968, 11095511, -8332774, -34846680, -34272764, -34237332, 12771622, 15831249, 985695, -5566278, 74403328, 17506286, --3958349, -7986492, 51298016, -54562728, 12359842, -102933184, -21677774, 24439974, -34529388, 32212254, -19940996, -530428, 74345344, 33686504, -40446244, -83734144, -38656852, -38500088, -19218368, -14960982, --9553081, 35112968, 24101208, 47731044, 7010997, -36942624, -23586886, -38713224, -33911452, -35896800, -16564615, 2230699, 16401943, 19753092, -8633958, 18191334, 11360188, -14462229, -384400, -15909096, --3592740, -33177548, -32810328, -13776108, -13563507, -459025, -30644592, 15933255, -1050120, 4861366, -10190884, -22334366, -42841224, -40967008, -862752, 7711614, 10430865, 25202868, 7841537, -14225469, --23509578, 7208566, -8080444, -13438953, 6310381, -119384520, -72192496, -40111236, 35506496, 9510131, -162694432, 172609360, 105664784, 191458368, 157327872, 165532864, 115457312, 139977280, 114410416, 1617592, --53896472, -77961712, -74036112, -156113472, -186343600, -195622336, -135817600, -107627048, -41735808, 6955700, --54739360, 33214592, -69104952, -25645250, -4344360, -22010096, 16900160, -64315524, 88144544, 14474040, -80391048, 50872276, 30320858, 20380156, 44668196, 28321552, 45799920, 103909752, 99657200, 78623672, -97401808, 122196648, 112113680, 104817600, 193642352, 67280664, 136372720, 176667568, 122163904, 160429920, -85856936, 114169896, 90058488, 107139032, 116895592, 42634528, 75835160, 56688736, 71004936, 67791224, -19077170, -13871134, -73614664, -27907624, -98354216, -86814176, -145681536, -165876464, -166155104, -351912992, --297200992, -319987424, -316638400, -370377568, -373796384, -231253920, -268156288, -200403168, -236552848, -180594240, --170225664, -148993488, -148671904, -86150064, -37489696, -54989004, -54770496, -45528264, 8941585, 70666704, -37590628, 147844592, 128107600, 187028640, 193133936, 177332752, 222504544, 205272592, 238769584, 185783648, -228462736, 241082416, 270541600, 235679344, 141533136, 140538848, 141366160, 142544592, 132476656, 92199528, -87331184, 35435628, 25957172, -3813394, 4635344, 16865262, -48468168, -72948944, -77669112, -49035104, --42195368, -81222128, -92899072, -109922712, -78565688, -101880920, -92745520, -79727480, -83905408, -87261928, --85525144, -23619636, -19656992, -11857331, -18693846, 9898826, -1969779, -3438658, -17435420, -7825431, -7204271, 10196252, 4879083, 14689325, 12035572, 18049600, 1626719, 1876364, -1473711, 8926016, --681826, 2204929, 1800128, 5888400, 1277753, 1185411, -7686918, -220654, -1375463, 1868848, --4836133, -788663, 202937, 2099165, -3825742, -6979, -2946348, -535260, -6324340, -3790846, --4212289, -840740, -6054830, -4639102, -9749039, -3193845, -3563749, 140660, -4489315, -5297842, --10674067, -9229348, -12710419, -7653632, -10162429, -9287330, -13991930, -10663330, -11245835, -6436009, --8775155, -5345087, -7621957, -3775813, -4050691, 1909113, 3398393, 8987756, 7508677, 11869142, -11892228, 18670222, 19341848, 20696374, 19800336, 22946400, 20059108, 21065204, 17728552, 17413944, -12492986, 11454678, 5028870, 4989142, -250182, -1066763, -5357435, -3964792, -6171868, -4177930, --6397354, -3896609, -5478231, -2580202, -4044786, -1175210, -2981781, -365072, -2284923, 224949, --1702418, 750546, -1279363, 1044751, }, +-4303557, -6033356, 1952600, -2881386, -6213744, -3766150, 2638184, -7556458, -4388383, -9270150, +3137474, 4329864, 5217849, 3046206, -3418794, 7251516, -5004174, 1568200, 19864, -894964, +-5280663, -2509335, -5794985, 351114, -2537252, 3302293, 1971927, -2573759, -992674, -488553, +-5328981, -87510, -1284195, 2440615, -220654, 4833449, -1802276, 6081674, -2705293, 205622, +830539, -4217658, 2893734, -1204738, -1796370, 620623, -1303523, 2406256, -9237401, 4348655, +5360119, 894427, 2991982, 1796907, -4159139, -439160, -4502737, 6066105, -1702418, -3636227, +3477313, -5398237, 118112, 2195265, -6342056, 810675, -1575716, -2306934, 2027761, 525060, +458488, -2887829, -1989107, -9951439, -1324997, 2210298, -1696512, 528281, 1162862, 5369783, +4478577, 306016, 1443109, 679679, -908386, -706522, -1383516, -676994, -466004, -986232, +-955093, -6442, 941672, 680215, 627065, -1513976, -28991, -18790, -457951, -75162, +350040, -189515, 35433, -714038, -609885, -634045, -46708, -592706, 915365, 1206349, +1236414, -14256070, -8574902, 1585917, -4634807, 883153, -4781909, -8189966, -5459441, 9297530, +5405217, -1440962, 6291054, 1481764, 1541356, 1765768, -3058554, -832150, 5111548, -4123169, +2317135, 3732327, -4002373, -6320045, 2887292, -5166846, 566936, 2957622, 7577396, -1712618, +-3666292, -3203509, 1173063, 4123169, -5614059, -49392, 4602058, 1813013, 476205, -308164, +-441308, 5986111, -238371, 5483600, 3596498, -1397475, 3583077, -1269163, -337692, -565325, +-10028749, 3462281, 5651103, -3282429, -1879585, 1374390, 1529008, 1602023, 871878, -551366, +-1222455, 331786, -2533494, 6851547, -3089692, 790274, 3710852, 2969433, -2467459, 2700461, +841277, 1756105, 3747359, 3312494, -4991826, 5143760, 5692979, -1945620, 79994, -369367, +3711389, -4573067, -2392834, 994285, 634581, 166967, 228170, -979253, -1553168, 911070, +-744640, -398895, 246424, 1300838, -989990, -235686, 9127, -1797444, 590558, -1068373, +-1120987, -867583, 648540, 90194, -536871, -1076426, 232465, -5650567, 7225746, 4728759, +11179263, -1854352, 1204738, 3424163, -5425081, -1125281, 2172180, -2241973, -7369627, -436476, +804233, 4953708, -5950141, -14557255, -11745662, -7238631, 2811593, 6925098, -6956774, 3922379, +-3405372, 5351530, 4168803, 3628174, 6424734, 3575024, -5015448, -4638565, 883153, 3432216, +-252866, 295816, 8982924, -67109, 1573569, 4469987, 4726075, 785442, 145492, 11095511, +-765578, -4162897, -1242319, 2523293, 3246459, -2148021, 5974300, 1173063, 3212636, -4264366, +-3769908, -1453846, -2488397, 1447941, -1971390, 6497749, -7483981, -6688338, 8116415, -847182, +-327491, -9418863, 2939905, -4566624, 5095979, -3917547, -10423886, -476741, 5380521, -4465692, +6951405, -4172024, 3207267, 6485938, -1823214, 2714956, 6536940, -424128, -4807679, 406411, +3198677, 1480690, -2321967, 4498442, 308701, 2373506, 902480, 648540, 1711545, 311385, +-668941, -44560, 245887, 690416, -1804960, -919660, -936840, 1729798, 217970, 1763084, +1840930, -1699733, 428423, 449898, -972810, -726386, -340913, 335007, -881542, 367220, +-921807, 17395154, 4096325, 4641249, 1990181, -3970161, 8346732, -3944928, -2364916, 10625212, +-800475, 8546448, -902480, -9758703, 3453154, -3305514, 10772852, 5680094, -752693, -9637907, +-6747394, 8920110, 10567767, -12328704, 6180995, 4954782, 3715684, -798327, 1196685, 1037772, +-937914, 12225624, -556735, -2085744, -3370476, -4090956, -5231270, -1717450, -280247, -7033546, +-2509335, 1844152, -4907537, 279173, 280247, 7317551, -2744484, 235149, 3398930, 294742, +6987375, 3161096, 7264937, 3599183, 2210835, -7679939, 805843, -5689221, -5326833, 1279363, +7408819, -284005, 6362457, -2662880, -4815195, -1112397, 302795, 1878511, 4367445, -2015413, +-42950, -2385854, 2438468, 1676111, -6271189, 1224603, 1297080, 836982, -1768453, 6562710, +-700617, -1277216, 697932, 3081639, 1346472, -2150168, -701690, -869194, -1582159, 1291711, +-1890323, 3097208, -1872069, -365072, 370441, -1459752, -425739, 1722282, -2031520, -460098, +-2186675, 849867, 905164, 1757179, -2388002, 475131, -981400, 1206886, -819802, -2849174, +-923418, 4906464, 3438121, 3945464, 11186242, 5852967, -4854924, -4340602, -12040404, -782221, +-267899, -6425271, 2442226, 9662066, 1170916, -7612830, 7068980, 6717329, -700617, 2685428, +6808060, 1613297, -6186364, -955093, 14424648, 7095823, 1491427, -9516574, -3406983, 8680666, +2986076, -1297080, 4887673, 4370129, 4576288, -37044, 8952859, -81604, -1149441, 2255932, +-4449049, -5828808, -295816, 985695, 3327526, 1827509, -5447629, 5530308, 9706626, 4982162, +-268435, 7208566, -8210904, 4680978, -4893042, 5143224, -1373316, -5908802, -302795, -7697119, +-12600360, -4600447, -5009006, -616328, -56371, -6598144, 1276142, -2029372, 3823058, 2522220, +4528506, -725850, 1820529, -6353867, 1097364, 1002875, 8847096, -3422552, -282394, -3076270, +1865626, 7956427, 4087198, -4626217, -7397545, 2333778, -2961380, -1017907, 3843996, -548145, +1289027, 900869, -4407174, 206158, -3364033, 951335, -3195993, -2153389, -1167694, -137976, +-434329, 576599, -2049236, -216896, -693637, -1634772, -1381906, 486405, -363998, -849867, +212601, 752693, 2442763, -872415, 1426466, -1064615, -2472291, 1822677, -2704756, 2588255, +-251256, -1746978, -302258, 858993, 1893544, -1408749, -192737, 403190, -485331, -11795591, +-7793755, 16679505, -3645890, -3663607, 984621, -587874, 17891224, -5231270, -9644349, 233002, +-9513889, 2370822, 7598871, 8159901, 2587181, -16603270, 13653164, -10744398, 5714454, -7346005, +-5574331, -4113505, 6820945, 7323993, -10976863, 867047, 4805532, -3411815, 2208150, 3221762, +-3962644, 505196, -9038759, -6082748, -13955422, 8266202, -1944547, 14074071, -6549289, 3052648, +9409200, -2351495, -2783139, -4164508, 10782515, 7863548, -13219372, 3770981, -7472706, -2515240, +-2896956, -7432441, 4472135, 2363843, 11659226, 8196408, -14624364, -2401961, -6276558, 8546985, +2984466, 732829, -8529268, 1276142, -889595, 7182259, -1191853, 896574, -9811853, -227096, +6980933, -6433324, 1087164, -2032056, -1909113, -5200132, 1053341, -687195, 12368969, 5448166, +5660767, -2266132, -1374390, -2150705, -3361349, -1809255, 2763812, -3786014, -1198296, -3713536, +2811056, 2353642, -2013803, -1138166, 2613488, -3496104, 1736777, 529355, -935229, -1112397, +940598, -99321, -314069, -672162, 2284386, -3372086, 450972, 302258, 1710471, 1845762, +1850594, -1711545, 507880, -1207960, 2470680, 678068, 586800, 1806571, 4070019, -4483946, +307090, -9453223, -1181653, -10908680, 1707786, -2732673, 6262599, -440771, 5313949, -7471633, +-14066555, 2986076, 9467719, 1237488, -1139240, 7384123, 4971425, -11502996, -181462, -4335233, +14567992, -644782, 1699733, 1147830, 153545, -452045, -5221070, 11547020, -976031, -16356846, +-3067144, 9921374, -6383395, 1660542, -255014, 1332514, -2042794, 1586990, -3003793, 3919158, +-6269579, 5919539, 8298414, -6491306, -1650878, -3838627, -11387032, 4571993, -8082055, 7051263, +-7102802, -12284143, -3352222, 7319161, -2275259, -4380330, 4893042, 6769942, 3873524, 7419019, +12678207, 10218264, -649614, 2000918, 1736777, -6783364, 1305133, -7093139, -7736310, 4242891, +-5899138, 1939178, -340376, 4472672, 4537633, -5861020, 6840273, -1851131, -2790655, -1241246, +4813585, -863825, -4424353, -3004867, -6270116, 7201050, -3592203, -922344, 1249299, -276489, +-2648921, -2244121, 494995, 973347, 326954, -1233193, 1670742, 1242856, -1399086, 153008, +1080721, 677531, -846645, 4295, -1141388, 476205, -1919850, -1755031, 1109175, 580357, +2404645, 2643552, 239444, 1827509, 39192, -102005, -16072304, -13477607, 7867843, 14402636, +24696, -852551, 2774012, -6925635, -3330210, -16646219, -8836895, -4716411, -132070, -12108050, +17340394, 3441880, 9659381, -11038603, -13150116, -9907416, -3839701, 2636036, -14932528, -6694244, +6938520, -2965675, -18168786, -6167573, 2462090, 191663, 11288785, 3792456, -3534758, -8623221, +10737418, -6228240, -619012, 8085276, 2399813, -8806830, -4514548, -685584, -14711874, 3704946, +11451457, -4984310, -6310918, 1667521, -7442642, -2753074, 1487669, -4750234, -3621731, 3877282, +-5545877, -11743514, 5813775, -6698002, -8747238, -12033961, -6004901, 1196148, -4793721, 1996623, +14811195, 8356396, -1787780, 14105209, 14343043, -6206765, 2009508, 3977677, -7406671, -4820027, +-15704548, 1619203, -5017059, -12713640, -107911, 6693707, 11851962, 7281044, 3495567, 1320703, +-10662793, -1339493, -2413772, 2800856, -4016868, -467615, 277025, -153008, 2601140, 499290, +-939524, 2295660, -920734, -3367791, 2741800, -2257542, -2991982, 460098, 1142461, 1014149, +272194, 3281892, -301185, 2100776, 1263794, 251256, 696858, -18790, -2517388, 575526, +-3473555, 814970, -5568962, -1394791, -212064, -3694209, -4356708, -575526, -4306779, -807991, +-891206, -4952634, -10247255, 26097296, -1032403, 16005196, -8054138, -22831510, 6519224, 1985886, +-907312, -10693395, -1053878, -7036767, 18090940, 13273596, 11837467, 8679592, -14194330, -63888, +1943473, 12617540, -21546240, -2424509, -5279052, -6275484, 3228205, -7077033, 2758980, 4816269, +3560528, 3852586, 4986457, -1480153, -2125472, -10457708, -2500745, -1583232, 10281615, 15569, +-9422621, -2199023, 11188927, -1288490, 6507949, 8383776, -6072010, -3576097, -13879187, -8050916, +27151710, 7166690, 12081206, 6507413, 1570884, 1034013, -17212618, 10212895, 1610613, 3006477, +8784282, 9594957, 14918569, -17163226, -7094212, -9519795, -1205275, 2393908, -2269353, -4802311, +-2819646, -14392972, -18103288, -11745662, -16966194, -2191507, -11089069, -18985366, -8029442, 6184216, +10406169, -3946538, -16245714, -565862, -2452963, 3859565, -4466229, 1057099, 9339943, 441845, +-684510, -568009, 1190243, 1655173, -2757906, -2469606, -6527277, -7306813, 3900904, -1996623, +3491272, 3168612, -1188632, 2161979, 2880313, 5272609, 3735011, -2274722, 1159641, 6716255, +1294933, -6766184, -5601174, -3048353, -1410897, 523449, -2379949, 3894462, 4286378, -1016834, +6466610, 865436, -1796907, -1372242, 1507534, -3733400, 35032436, 7936026, -5062156, -7266548, +1120987, -11239929, -21977884, 16181826, 68719, 10417443, -7873212, 7539278, 17986786, -1770600, +2006824, -4520990, 15656230, 13191992, 5115306, -21204790, 1535988, 3132642, 13112535, 19092740, +-5631776, -3893388, -2522220, 5128191, 6815040, 5677410, -9648107, 4422743, -11121281, 8522826, +11363410, -5417565, -11247982, 7116224, -12239583, -11187316, -467078, 3265249, 15953119, 1938104, +-2182917, 13601625, -2517925, 12219182, 22558778, 11318313, 260382, -14310294, -1359357, -8237748, +-6683506, 14423574, 5634997, -14512158, -165893, -11091216, -2811056, 19117974, 8791798, 2798708, +8185134, 11520176, 5971079, -15391552, 7945153, 12866648, 4412005, -10514080, 4346507, 1235340, +2209224, -8224326, 12712566, -3484292, -3047816, 15292231, 16200617, 2401961, 4615479, 17620104, +1042603, 8706436, -6167036, -173946, 10149545, 5890011, -4483409, 5250061, 9162776, -2463701, +83215, 11684995, 2420214, 4984310, -3443490, -5815386, -1758789, 3275986, 1707786, 2704756, +2771328, -1888175, -1810866, -1495186, 913754, 3519726, 4242354, -2815351, -838592, 7295539, +1082869, 9774272, -1736241, 2680597, -1305670, 1275068, 4409858, 2709051, 375810, -39192, +-4108673, -2869038, -2067490, -4385699, 5634997, 5064840, -8513162, -440771, -10876468, -25597468, +8840653, -10202695, 2830384, 896574, 17935784, -12366821, -10931766, -4601521, -5004174, -6615860, +13245679, -11752104, -16581258, 4945118, -30982820, 897648, -5842230, -13113609, 16653736, -1079111, +-994822, 7000260, -6614787, 5258114, -1686848, -18512382, -20208358, -213675, 4251481, 11825656, +5704254, -1360431, -2144263, -11646878, -5526549, 11669963, -18285824, 25195352, 14955076, 3356517, +18622978, -12455405, -5349919, -11404212, -11668889, -5050345, 8492224, 23791972, 191663, -12311524, +-2092186, 1147293, -1352915, -1287417, -7586523, 6405407, 5871757, 16034187, -321049, 18131204, +9324911, 4971962, -482110, 3856344, -27131846, 14277545, -3478924, -15875273, 11286637, -28991, +14865956, 6596533, -25149182, 19472844, 15180562, -13158169, 21120502, 8126615, 15769509, 6250788, +-2234994, -896574, -702227, -2975876, -5571110, -1712081, 2299418, -5550709, -8457864, 61740, +-5531918, -9906342, -5947456, -7423314, 4655745, -4568772, 5734855, 1530082, 5851893, 2773475, +-690416, -3169149, 973347, 548145, -488016, 808528, -1784559, -4118874, 1940252, -389231, +2376728, 2599529, 69793, 2195265, 993748, 3795141, 3236795, -5971615, -3610457, -5356361, +-9992778, -7022272, -48070348, -3587372, 28226526, -5126044, 673773, 24903294, -5932424, 382789, +2855617, 6708202, -7636452, 6691559, -2743947, -8194261, 7817378, 9510131, -28175522, 3388192, +-25096568, -597000, -13092134, -13999446, -3273302, -4156992, -13858786, 6921340, 2071248, 8710194, +11593727, -16922172, 21184926, 1543504, -20194400, 1708860, -14001593, -6912750, -15046881, -13462575, +-6030134, 14230300, -12401181, 6808597, 14149233, -8545911, -15495705, -14061186, -20884278, -22264574, +-13302051, -6306086, 1542430, -3329137, 5951751, 4270271, -13429289, -927176, 14682346, 8586713, +-22192096, 8672076, -1875290, -6089190, -20580410, 13789529, -7517804, 19017042, 23802708, 660351, +22626962, -12537546, 13033615, -9863929, 14029511, 18163416, 1355599, -23848342, -956704, -32556926, +10330470, 7078643, 12716861, 6161131, -12992276, -11081016, -432718, -7426536, 7144678, -8036958, +-499290, -486405, -8235063, -6259915, 5278515, -3127810, -9289477, -852551, 2598992, 6765647, +3400004, 14664092, -1746441, 1242319, -4589173, 10286447, -1680943, -2223719, 8792335, -493384, +1121523, 2149094, 11928735, -1952600, -5177046, 1262720, 8165270, 7936026, -8224863, -775778, +5312338, -9257265, 4938139, -1494112, 6391448, 392453, -8115341, -4387846, 3613141, 4138201, +4905390, 3743064, -22801444, 18434536, -43478492, -2560338, -4169876, -3614752, 4002910, -24934432, +1716376, -4902169, -2164664, 11402601, 4448513, 13265543, -10270341, 9393093, -4920959, -22145388, +-8965744, -16249472, -10151155, 10748693, -19391240, 2558190, -7205345, -14634027, -2651069, 14361834, +-19276886, -18478560, 7544110, 11154030, -656056, -8722005, 10343892, 11003169, 13392782, 11608223, +4763119, 15877957, 18735722, -10039486, 2781528, -8847096, 23514946, -1865626, -16324097, 19685446, +8584566, 4766340, -9360881, -12345883, 2864743, 7525857, 7488813, -613643, -10283762, 7841537, +-11970074, 391379, -11812771, 36424544, 5582384, -10408316, 29843580, -3608846, 9107478, -7693360, +14973330, 22360136, -13892072, 21363168, 22586696, 29582660, 22646826, 2167885, 16810502, -13151727, +-2639258, 3219615, -7350300, 13088376, 552440, -792958, -1335735, -3750580, 6320045, 3255048, +17863842, -5822902, 6579353, -3892314, 79457, 3417183, 5244155, -7499013, 2748779, 7536594, +-3287261, -8422968, -1676648, -13539348, 4667556, 4275103, 3650722, -3537979, 2217277, 7173133, +3991635, -1680406, 6815576, 3118683, -4488778, -2228551, -1458141, 11232950, 14530948, 7793218, +3338263, 2663954, 4958540, 8696235, -5807870, -2282775, 3892314, -863825, 780610, 4040491, +-3461744, 44935560, 11553462, -7482907, -6664716, 10554882, 2873333, 4584878, -1170379, -17749490, +14952392, -40715216, 4407174, 9126806, -1868848, -7318625, -15724949, -7046968, 1821603, 12267500, +18485540, -10820633, -23837068, -19084150, -2779381, 854699, -14069776, 28985124, -13498545, -8667244, +11863237, -3910031, 2098629, -2443300, 24705188, 4273493, -24856586, 9971840, 3103651, 17313014, +-6171868, 1999307, -10302553, 8669928, 3741990, 21787296, -5313949, 9907416, 10233296, -12949863, +-14463839, 1163399, 13109851, -25349970, -30175366, -8737574, -12411919, -1495186, -4403415, 3129958, +6805913, -5980742, 1005022, -34675956, -29591250, 23640574, 24950538, -30020210, -23194970, -28889024, +-15211164, -11889006, 15017353, -15716359, -27998892, 943819, 1187559, -16995186, -3665218, 24488830, +-3693672, 1474248, 7818451, -130997, 1376537, -956704, -8644159, -10586021, -593242, -2922188, +6995965, -1014686, -690953, -7634841, 3869766, -11874511, -297963, 3775276, 3963181, 5874979, +6514929, 1321776, 3685082, -2559264, 606127, -5996848, 2209761, 720481, -6900939, 7169911, +7055021, -10987063, 679142, 8196408, 6681359, 12611098, -2597918, -14446659, 4041564, 4846871, +-7176891, 4709969, -7989176, -3673271, -1235877, -2441689, -6781754, 2551748, -24827596, -3143916, +-5927055, 7402913, -11701638, -3310346, -38659000, 34237332, 22174380, -3817152, 47195248, -4711043, +-25704306, -2464774, 10687489, -16042777, -20939040, -4506495, -14253386, -754304, 4127464, -21711060, +31878858, 986232, 3543348, -20032264, -5625334, 2083059, -5575405, 5026186, 7364259, 26037166, +4809827, -1397475, 21229486, 17342542, -6029061, 10205379, -13183939, 3701188, 11942693, 11416560, +29656750, -29233158, 18080738, 54069880, 543313, 8834748, 18670222, 2067490, 3837017, 8696235, +6896107, -18133888, -21398600, -7883413, 17497696, 5124970, -22238266, -12177843, -816044, -10801843, +20088098, 1789928, 15555298, -34207804, -20995410, 9927817, 23613194, 14321032, 9620727, 32458678, +19160386, -13678934, 22565758, -16895864, -3249143, -2454574, 12771085, -2679523, -13777181, 12104292, +5472325, 1135482, -15822660, 11071889, -48855, 193810, -6950868, 9330816, -7429757, -6176700, +-5647882, 4440460, -5899675, -11748883, 4145180, 811749, 128849, -6397354, -1028108, -8006893, +-6630893, -6403796, -3813931, -2473364, -2782065, -2436857, 1360431, 228170, -14920180, 10183904, +4248797, -4785668, -10969883, -15966004, -141197, -8691403, -5610301, 5783174, -3952444, 9912785, +5201743, -3469797, 2001455, 9279277, -3878892, -1513976, -4154844, 7831336, 2143726, 3276523, +-7584376, 16019691, -45107896, 959388, -308164, -1445793, -5730023, 21066278, 1656784, -12120935, +-22626424, 22896470, -20347408, 531502, 14673219, 11829414, -16007343, -4274030, -25764436, -106837, +7328288, 8987219, 10375030, 2750390, -16799764, -20876762, 17131550, 8881992, 8504572, 3380139, +8651675, 2625299, 12597139, -22512608, -38186556, 10590316, -5818607, -8102456, 21208012, -3710315, +-11403675, 18824304, 17671642, 14749991, -1427003, -9571335, -16472810, -4219806, -21766358, 51015620, +-4421132, 18382996, 3868692, -16916802, 13830868, -6459094, -16309601, 15950435, 12570832, -28033788, +19486804, -2972117, 27059368, -27431420, -20794084, 27704150, -1210107, -22395034, 22818624, -8382703, +39030516, -16583942, -13514651, -23592792, 14919106, 2793876, -19287088, 7683697, -25045564, -18210124, +1571421, 16216723, -14395657, -8743480, -28436978, -25687126, 30107720, -3458523, 13086228, 21195126, +28566364, 164283, -2956011, -2193655, 7504919, 11523934, 2092186, 5304822, 17577154, 7756174, +9666898, 5797669, 4377646, -3417183, -1676648, 10882910, 8223789, 14253923, -6764574, 9409736, +9860708, -15477452, 3929895, 3947075, -8483634, -4279935, -47782, 3954054, -6894497, 11230803, +596464, -2532420, -3209414, 9543954, 343061, 3016141, 852014, 2719788, 2139968, -8626979, +-4333085, -6433324, 782221, -75162, 4756677, 6197638, -5541045, -12905840, 33430952, -7626252, +22633404, -35421132, -6245420, -822486, -42293080, -9296994, 6096169, 20762946, -10429791, -9920838, +893353, -3270081, 29644938, -2834679, -14949171, 31459024, -3935264, -1634235, 5907191, -12582107, +27166206, 1787243, -5582384, 13019120, 11131481, -14853608, -5120138, -6898255, 21146272, -42341936, +-756451, -8220568, -14972256, 7237557, -15222975, 24634858, -6494528, -30515742, -3196530, 46335180, +-28142774, 20296942, -31372588, -9035001, 31181462, 22795002, -16859894, 7905961, -20555714, -26996554, +5722507, -11879880, 11742977, 3386582, -1907502, 4578435, -39545376, -15469398, -20169704, -28904594, +13403519, -10982231, -8064875, -16034724, -28101972, -23629300, 18482854, -3709778, 57686780, 10104447, +5310190, 20593294, 36273148, 4734665, -26200912, 31826782, 24077050, -20378546, 5369783, -5178657, +-20304458, -16004659, -13727789, -1593970, -12533788, 4679367, 8475044, 2937221, -9771051, 16919486, +2618320, 7793755, -2345052, -3001645, 8006893, 4873714, -8149701, -7355132, -7048042, 7729868, +3680250, 9347996, 9939091, 327491, -5374078, 7504382, -4343286, 16165720, 7662222, -19564650, +-3879966, -14453639, 1710471, -4792110, -6980933, 20237350, -1121523, -6424734, 5171678, 6274947, +-7439420, -1611687, -10222022, 4406637, 7323456, -1548873, -3256659, 1018444, -6892886, -1950452, +-1102196, 9410810, 22501334, -13341242, -16915728, 19013284, -30223684, -3605625, -6158983, 1739462, +21436718, -14017163, 23783382, 10110353, 5483063, 7039452, -38565048, 26234198, 5011153, -27226872, +10755672, -28876138, 5035313, 38679400, -4684736, -22938884, -24263880, 10386842, 17708688, 14176613, +7698729, -25550760, -17351668, -7927973, -4602058, 33048700, -20787642, -12575664, 49386220, -27374510, +-1949915, 19502910, 259309, 20547124, -2829310, -16590922, -10934987, -30141006, 15573015, 21423296, +-31957778, 48063368, 16201690, -36254892, -32861868, -31532576, -37575596, -30562450, 1793149, 15093589, +3190624, -25464862, -9406515, 16997334, -219043, -15952582, 17799418, -34273304, 2433636, -7890392, +-31425738, -29571386, 5387500, -11766600, 22635014, -41004052, -5240934, -14523969, -29744260, 2052994, +48631376, 12399034, -21100638, 10391673, -26040386, 10690174, -10394895, 932545, 1757715, 13690208, +-1148904, 4684199, 17551920, 183073, -9212168, -4390531, 14150307, 9782325, 6708202, 3382824, +-26776974, -2756832, 2415919, 15202574, 7969849, -14057428, 114354, 1617055, 24091008, 1329829, +8010114, -7320772, -4261682, 3504157, 8152385, -964757, -6569690, -13294534, 2391223, -5031554, +-8749922, 4543539, -5957120, -6561100, 9649718, -7358353, -10130217, -14671071, -12486544, -2388539, +4336307, 64425, -10765872, 9419937, 23890756, -59210420, -53983980, -47558172, -30081950, 11886322, +-12504797, 60175176, 16362215, -6925098, -13562970, -8123931, 17485886, -39906152, 46476376, 60589640, +24577950, -4182761, 48570176, -15826418, 29474214, 54989540, -9870909, 2537789, 10646687, 73330128, +-18495202, -5206037, 44123272, 16099685, 14326937, -12671764, -44817448, 2530810, -35489852, 16438987, +-44033080, -52374980, -450972, -3576097, -35990752, -2539400, -17435420, -37691024, -29479582, -48998596, +-2179696, 48686140, -15633681, -10130754, -45400488, -25074556, -16669305, -16319265, 15475841, -11871826, +82228760, -20180978, -1085553, -30746598, 62051540, 50191524, -36003636, 40662604, -14478872, -61022896, +-10763725, -6590628, 12670690, -14817637, -13695040, -8398272, -24458766, 6229313, 30184494, -36581312, +-5134634, 9476308, 6200322, -42374148, 26922466, 18172006, 62221192, -27435714, 17004312, 25428354, +-1662689, 6375879, -916976, 8240432, -7030862, 19377282, 8438000, 15550466, 13837311, 435402, +14245870, 3770981, -5527623, 14439680, -1061394, 1847373, 1493038, 9872519, 7635915, -11862163, +-8917963, -14872935, 21447456, -15336254, 3029563, 12566537, 5393942, 23354422, 20456930, 35152160, +24322936, 19665044, 1184337, 12704513, -19060528, 16595217, 12690018, -4949413, -18347564, -34833796, +-13553843, 9183714, -19253802, -7859790, -14055817, -34166464, -29232084, -14479945, -21832392, -13649943, +-18838264, -24445344, -25312926, -8628052, -7490960, -12050068, -18683108, -10973105, -16718160, -12257837, +-13703093, -4560182, -6568079, -5917928, -7117298, -6387690, -9249212, -5163088, -18581640, 24885040, +104487968, 12195560, -65514896, -16246251, -23169202, 5046587, 32613298, 58655296, 16750909, -49192408, +-950262, 34086472, 7393250, 770410, -1538672, 8917426, -4715337, -5952825, 40475236, 25402584, +22601728, -34395172, -22351010, 23452668, 9043591, 13856638, -11962558, 4336307, 45090716, 1083406, +38227892, 20122996, 20841866, 37402724, 5388574, -19834696, 4562866, -22719304, 5668283, 15835544, +3987877, 61139396, -20449414, -39417600, -38038916, 47212964, 21731460, 25138444, 17139604, -27072252, +-34014532, -20715702, -1228898, 10255845, -7492034, 16633335, 31222802, -2196876, 22617298, 20567524, +-31781684, -6337761, 8942659, -14926622, -13506598, -15674483, -52385180, -8929237, 22512608, 1894081, +45533632, 30320858, -22259742, 16029892, 126165, -15309948, -12950937, -25431038, -56633440, -30291330, +2166811, 862215, -12652974, -3546569, -6025839, 17902498, 18719614, 9584220, -3585761, 1175210, +14147085, -7321309, 8814884, -25704842, -12268574, -3599183, 13469017, -3806415, 5202816, 8636105, +8616778, 851477, 24211268, -19921668, -17880486, -18152680, 12519830, -11922292, -18668076, -18607408, +12677133, -6471979, -13660680, -7467875, 9476308, 1968706, 13974213, -24324010, -15863462, -3335042, +-1761474, 4123706, 10830297, -5874442, -9630390, 15307800, -8556112, -10720238, -8988293, 14691473, +-4293357, -9008694, 4414153, -1850594, -8582955, -799938, -11389180, -8104067, -5164698, -1768990, +-3637301, 1419487, -2934000, 82678, -1082869, 716723, -5811091, -360240, -2148558, -273804, +-3255048, -62277, -5091684, 467078, -3877819, 336081, -3296924, 321049, -1396401, 1210107, +-2267206, 519691, -3026341, 12348, -3240553, -866510, -4192425, -593779, -3076270, -783832, +-2767033, -638876, -1737314, -743029, -2878165, -489089, -1251983, -237834, -1704028, -77309, +-2339684, -280247, -1575716, -784368, -981937, -636192, -1603633, -455803, -1211181, -1102196, +-729071, -566936, -1012002, -377957, -969589, -6983617, -24307368, 1739999, 83454976, 20071456, +35704064, -18327162, -74075840, -39244188, -54263152, -19776176, 38222524, 84169544, 39097088, 8358007, +-39521752, -39344584, 27919972, 41310068, 22078816, 50411640, -1153736, -34830036, -48302276, -25130390, +-6586333, 37171332, 5720897, 21021180, 20746302, 2230699, 52177948, 34770444, -2919504, -5996311, +-46127948, -12581033, 22012, -118648, 28041842, 47164648, 30562450, 22080964, 46337328, 25082072, +-45988364, -38885560, -10770704, -30711164, 32465658, 20270636, 47538844, 35147864, 42174968, 11095511, +8332774, -34846680, -34272764, -34237332, 12771622, 15831249, 985695, -5566278, 74403328, 17506286, +-3958349, -7986492, 51298016, -54562728, 12359842, -102933184, -21677774, 24439974, -34529388, 32212254, +19940996, -530428, 74345344, 33686504, -40446244, -83734144, -38656852, -38500088, -19218368, -14960982, +-9553081, 35112968, 24101208, 47731044, 7010997, -36942624, -23586886, -38713224, -33911452, -35896800, +16564615, 2230699, 16401943, 19753092, -8633958, 18191334, 11360188, -14462229, -384400, -15909096, +-3592740, -33177548, -32810328, -13776108, -13563507, -459025, -30644592, 15933255, -1050120, 4861366, +10190884, -22334366, -42841224, -40967008, -862752, 7711614, 10430865, 25202868, 7841537, -14225469, +-23509578, 7208566, -8080444, -13438953, 6310381, -119384520, -72192496, -40111236, 35506496, 9510131, +162694432, 172609360, 105664784, 191458368, 157327872, 165532864, 115457312, 139977280, 114410416, 1617592, +-53896472, -77961712, -74036112, -156113472, -186343600, -195622336, -135817600, -107627048, -41735808, 6955700, +-54739360, 33214592, -69104952, -25645250, -4344360, -22010096, 16900160, -64315524, 88144544, 14474040, +80391048, 50872276, 30320858, 20380156, 44668196, 28321552, 45799920, 103909752, 99657200, 78623672, +97401808, 122196648, 112113680, 104817600, 193642352, 67280664, 136372720, 176667568, 122163904, 160429920, +85856936, 114169896, 90058488, 107139032, 116895592, 42634528, 75835160, 56688736, 71004936, 67791224, +19077170, -13871134, -73614664, -27907624, -98354216, -86814176, -145681536, -165876464, -166155104, -351912992, +-297200992, -319987424, -316638400, -370377568, -373796384, -231253920, -268156288, -200403168, -236552848, -180594240, +-170225664, -148993488, -148671904, -86150064, -37489696, -54989004, -54770496, -45528264, 8941585, 70666704, +37590628, 147844592, 128107600, 187028640, 193133936, 177332752, 222504544, 205272592, 238769584, 185783648, +228462736, 241082416, 270541600, 235679344, 141533136, 140538848, 141366160, 142544592, 132476656, 92199528, +87331184, 35435628, 25957172, -3813394, 4635344, 16865262, -48468168, -72948944, -77669112, -49035104, +-42195368, -81222128, -92899072, -109922712, -78565688, -101880920, -92745520, -79727480, -83905408, -87261928, +-85525144, -23619636, -19656992, -11857331, -18693846, 9898826, -1969779, -3438658, -17435420, -7825431, +7204271, 10196252, 4879083, 14689325, 12035572, 18049600, 1626719, 1876364, -1473711, 8926016, +-681826, 2204929, 1800128, 5888400, 1277753, 1185411, -7686918, -220654, -1375463, 1868848, +-4836133, -788663, 202937, 2099165, -3825742, -6979, -2946348, -535260, -6324340, -3790846, +-4212289, -840740, -6054830, -4639102, -9749039, -3193845, -3563749, 140660, -4489315, -5297842, +-10674067, -9229348, -12710419, -7653632, -10162429, -9287330, -13991930, -10663330, -11245835, -6436009, +-8775155, -5345087, -7621957, -3775813, -4050691, 1909113, 3398393, 8987756, 7508677, 11869142, +11892228, 18670222, 19341848, 20696374, 19800336, 22946400, 20059108, 21065204, 17728552, 17413944, +12492986, 11454678, 5028870, 4989142, -250182, -1066763, -5357435, -3964792, -6171868, -4177930, +-6397354, -3896609, -5478231, -2580202, -4044786, -1175210, -2981781, -365072, -2284923, 224949, +-1702418, 750546, -1279363, 1044751, }, }, { { 5495411, -107911, -2041183, -466004, -4917201, -3379603, 2188286, 194347, -3094524, 3853660, 2585570, --834834, 237297, -522375, 3105261, -4303021, 1620276, 3226594, 2850248, -6192269, -4335770, --3074660, 4167192, 1010928, 1365263, -1721745, 4445291, 1671816, -1093606, 122407, -1256278, -876173, 1671279, -980326, -1267552, -3723200, 3978750, 6618008, 791885, 4206384, -768799, -853625, 1518808, 1834488, -5004174, 361851, -5228049, -1193464, -731755, 1658394, -2631741, --76773, 1158567, 537408, -3043521, 130997, 357556, 2510945, -3236258, -4063576, -537945, -5541045, 8881455, 30602, 1464047, 629213, -1889786, -5317170, -1345935, 3732864, -1690607, -3718368, 1446867, 3787088, -193274, 1483374, 1347546, -3165928, -4292820, -434865, 1638530, -2491618, 1211181, 1125818, 753230, 853088, -1462436, -2328946, -1588064, -1257352, -600759, -68719, -871342, -96637, 802622, 1296006, 1137630, -151398, 94489, 781147, -1611, --903554, 2574296, -5616207, -1210644, -5328981, 3103651, 289910, -2379412, 11197517, -4343823, --8112657, 666794, 3681861, -628676, -6117644, -1675574, -2688113, -941135, -2928094, -893890, -4121558, -240518, -2774012, 4839355, 652298, 4702453, -1288490, -1090385, 1737851, 172872, -2032593, -819802, 4337917, 7223062, -2026688, -4769561, -3583077, 3010235, -58519, -10990821, --1098975, -4348118, -1687922, 5458904, -3823595, -2814814, 3679713, -2384781, -581968, 5011153, -1662152, -3856344, 1703491, -2762201, -6570763, 2139968, 2512019, -4897874, -2914135, -1376537, --2129230, 10201, 2076617, 3438658, 5075578, 5783711, -1413581, 643171, -2306398, 2527588, -1527398, -1214402, 2352568, 3737159, -3558917, -1733556, 548682, 129923, 1372779, 4285841, --577136, -1072131, 3788161, 622770, -2700461, -1603097, -244276, -1570347, 1130113, -615791, --1510755, 663036, -1708323, -1250909, 787053, -1612760, -1174137, 111669, 1071594, -2010045, -199716, -440234, -761283, -935229, -131533, -1553168, -497679, -1483911, -9034464, -4620848, -2804077, 3991098, 1585380, 4332012, -3701188, 4535486, 5610838, -1589675, 6207839, -862752, -4578435, -2184528, 162135, -1960653, 5849746, 2257005, -213675, 5188858, -2749853, -2218888, -3833258, -9060770, -1551557, 479426, -1902134, -8075613, -4900558, 3329674, -3134789, -2115808, -139586, 6292664, -1490891, -4427575, -324270, 1610076, 3590593, -554588, -5693516, -3698504, --1027034, -2942053, 976031, -4989679, 2498060, -4694936, -6858526, 209917, 2440078, 2789581, --2175938, -1591822, -4491462, 5835787, 3407520, 806917, 87510, -171262, -1956895, -1072131, -2005750, 2488397, 8849243, -1000727, 2250026, 572841, -234613, -4324495, -3251827, 5972689, --2540473, 583042, 1515050, 860604, -907849, 4514548, 271120, 161061, -4871567, 4735739, -2690797, -1835562, -1058173, -534187, -1391569, 652298, 3451543, -48855, 1391569, 1032940, --445603, 791885, 1800665, -185220, 37581, 542777, 858457, 707596, 1044751, 1827509, -720481, -1340030, 1442035, 652835, -949188, -771484, -122407, 211527, 27380, 2218888, -2672544, 2435247, 5738613, -3802657, -5739150, -4591320, 2859911, 6393059, -1224066, 4899484, --4384625, -5273683, 4329864, -2189897, 409096, 1639604, 5433671, 2040646, 8653822, -3784403, --4684736, 2035815, -2617783, -2420751, 4881231, -7691213, -4794794, 772557, -1538672, 3505230, --2665027, 964220, 6132140, -5761699, 4246649, -3479461, 2731062, -3260954, -983011, -530965, -6352257, 1199907, 169114, -4699768, 170725, -5592585, 2033667, 1369021, -3793530, -100395, --1607928, 9660455, 1238024, 606664, -8458938, -4935455, -7145752, 5513665, -3674882, -415001, -2845416, 12321187, 8640937, -3501472, -7662222, -3181497, -6663642, 6949257, -1410897, -1948841, --3125126, -2048163, -648003, -3209414, -2187749, -554588, -2662343, 1832340, -1887638, 2578054, --9677635, 629213, -875100, -3058017, -1506997, -3246459, -731755, -5063230, 323733, -2114198, --258235, 3032247, -1058710, -1104344, -2244121, -2419677, -765578, 658204, -230854, -231928, --954557, -396211, -1112933, -190589, 144955, 569620, -820876, -875100, -1246614, -1067299, --980863, -1584843, 540629, -534187, -130997, -1610613, -4788889, 3417720, -4958540, -9024800, -9200894, 4059281, -9511742, 9506373, -1469416, -631360, -13395466, 7943542, 5410585, -10960220, -3306051, -1868311, 4190814, 882616, 4818417, 2978023, 1277216, -5135707, 536334, 1793686, --6633040, -2924336, -7839389, -1425392, -4850629, -2699387, 957778, -6257231, -2219961, -9187472, -3506841, 836982, 844498, 732829, -3864934, -8007430, -2422362, 2724083, -1231045, -755914, -8368207, -12399571, 5236102, 6230387, -860067, 327491, -2346663, -1044214, -3945464, -6161131, --4103841, -4869419, -3161096, 2990908, 1741072, 2654827, 4207994, -1062468, -2172180, 5866389, -11385958, 7929584, -126702, -9725417, 2696166, -1552631, 1461900, 10155987, -26307, 10231149, -9233643, -1334124, -3045669, -2544768, 755914, 815507, 3461744, 10373957, 2818572, 342524, --1043140, -6550362, 798864, 1924145, -2166274, -393526, 355945, -158914, 1227287, 834834, -760209, -887448, 1284732, 1084479, 1148367, 1212791, -3492345, -637266, -2506114, 927713, --1956895, 754304, -551366, -979789, -2099702, 323733, 532576, -3148211, -975494, 644245, -88047, 14436996, 3812320, -2676302, -608275, 4376035, -1431835, 13982266, -1399086, -2257005, -17933100, 17180, 9114994, -3447785, 343597, -872415, 1563905, -2376728, 1334124, -374199, --414464, -9773735, -830539, -2401424, -1636919, -4128537, 6291054, 2801929, 3782256, -5524939, --506269, -8675834, -3339337, 1516124, -602906, -5312338, -1511829, 2771328, 6569153, 3821447, --1956895, -8074002, -183610, 2174327, -1244467, 4129611, 2904472, 5632313, 7995082, -2666101, -44023, -8616778, -10259603, 9675488, 5344550, -452045, -338766, -423054, -3680787, -4240744, -15032, 7725036, 4618164, 1320703, 9643812, -7418483, 2243047, -6103149, -4534412, 4006668, -4316442, 3373697, 14477798, -620623, -6401112, 1027571, -6272800, 2783676, 1775432, 5150203, --2738579, -19864, 746251, -4933844, -764504, 3276523, -406411, 772020, -1999844, -1175210, --216359, 2235531, -1137093, 1373316, -2126546, 103616, -2778307, 815507, -1428614, -1093606, -560493, 1347009, -1680943, 1819456, 1333587, 2244121, 245350, 1286880, -499827, 743566, -529355, 752693, -791885, -127238, -734976, -228707, 526670, 1106491, -959388, 383863, --206158, -7991324, -10699300, 4145717, -9999221, -10737, 11158862, -11675869, 4281546, 5221607, --3115999, -14408005, 202937, 8406862, -9300752, 5778342, -639413, -4141422, -12064563, -352724, --8701067, 1530082, -4412005, -6803228, -8464307, 3471944, -1190243, -508954, 8069707, -4888747, -6809671, -5175436, -2054068, 10402948, 3582003, -5569499, 4288525, 2502892, -4807142, 2529199, -2632278, -1860258, -2046552, 405338, -2311229, -2757906, 1717987, 1895691, 14186277, -13356811, -2170569, 840740, -4771172, 9585293, 5473399, -3303904, -10335302, 910533, -1035624, -3134253, --6518150, -7660074, 9346386, 6042482, 786516, -943819, 4985384, 2513093, -2246805, 3967476, -2871186, -2599529, 9944460, -3698504, 6088653, -4077535, 3036005, 3112241, 2252710, -311922, --5512054, 5269925, -4287988, -4489852, -3059091, 1527398, 5369, 643708, -5226439, 2836826, -2218888, -3330210, 358093, -142271, -1641214, 300648, -1081795, 2522757, -714038, 376347, -2138894, -974421, -1592896, 1396938, -1818382, 1472100, -310848, -32212, -2094870, -958851, --51540, -2321967, 2299955, 1279363, 536334, 1500554, -467615, 1018444, -555125, 4712116, --10787884, 7912941, -4505421, -1996623, -6185290, -4464082, 3792993, -3561602, 3105261, 12097312, -4160213, 6646462, -15420006, -10217190, -5484137, -3694209, 1687385, -72478, 2680060, -12957379, -6951942, 2888366, 1749662, 12359305, 226560, -7007239, 11621645, 4565014, -5159867, 2369748, --6636262, 6097780, 2893734, 8127152, -6947647, -4947266, 2078764, -7044820, 8904541, -8147553, --121870, 7895224, 7293928, -15038828, -403727, 734439, 1771674, 2485712, 16451335, 3792456, -1050656, -5028870, -4129611, -8882529, -4785131, 12144020, 319438, -14499273, 245350, 3355980, --8207683, -9062918, 1103807, -5878737, 2438468, 13310641, 6560026, 5601711, -5432597, -14223858, -1175747, -2434173, 6558415, -1278827, -11883101, -1448478, 3139084, 3282966, 3248069, -1004486, -10118943, 1905892, -6383932, 8323647, -581431, 4982162, -132607, -1240709, -4296041, 6152004, -4265977, 2407329, -3107946, -1225676, -789737, -2073396, 1205812, -10201, -2633889, 1334124, -849330, -1498944, -1948841, -824634, -1461900, -214748, 1912334, -1908039, 1007170, 2357937, -2861522, -718870, 1247151, -1493038, -19019188, -5684926, 5398237, 14697378, 2113661, 7620346, -26131118, 4335233, 4471598, -4043175, -12504260, 7092065, -6055904, 6535330, -1559610, 17273284, -12606266, -6667937, -14129369, -11250130, 8548059, -7494181, 10475425, 4595615, 3422552, -3616899, --1364726, 12430172, -2439542, 10969346, 10996190, 5672578, 7717520, -8543227, 8355859, 4494684, --4459250, 12147241, -5342940, 11035918, 843424, 1245004, -16186658, 9760313, 905164, -3048890, -8014946, -11294153, -4468914, 6762963, 5541582, -10406169, 1687385, -6657736, -3814468, 10301479, -1395328, 3107409, -1079111, -11870216, 7976291, 7560753, 527207, 5977521, 2692945, -5259725, --5513128, -448824, 6338298, -10749229, -379568, 688269, 475131, -103616, 4713727, 6179384, -12702366, 7123204, 428423, -17840220, -5858336, -6680285, -590558, 1319092, -5004711, -10576357, --3324842, -4766340, 2794950, 408559, -3008088, 1129040, -3085397, 4915590, -1763621, -2107218, --2911451, 53150, 1423782, -6361384, 3992709, -4093104, 1660005, -1054951, -2346126, 108448, --3917010, 1262720, -3534221, -2579665, -505732, -2046015, -1882269, 2178622, 3757023, 2246805, -3616899, 4704600, -981400, 693100, 23588498, 6888054, 3148748, -8753680, -21223580, 15345381, -4800163, -14102525, 4212826, -1545651, 3620658, 2961917, -10174778, -21792664, -17040820, 5723044, -13343927, -2678986, 14007499, -6528887, 10926934, 13305809, 18072686, -4028143, 13351980, -11904576, -4514548, -6516539, 1597191, 7155953, -324270, -3905736, 3236795, 8992588, -6468758, -12084427, --12194486, 25435334, 21475, -1332514, -11530913, 11758547, 3814468, -23592792, -13659607, 5208185, --3348464, -4238059, 9146670, 3034931, 22722524, 12494060, -855772, -13312251, -13036836, -7456600, --5393405, -15098421, 13818520, -10357851, 10919954, 9342091, -9567577, -12352326, -11909944, -17390322, -4138738, -396211, -6288369, -7933342, -12760885, -4657892, -12573517, 2511482, 1427003, -4374961, -1614371, 10111964, -26234734, -10285910, -21429202, 10635950, 7405061, -9299678, -3191161, 4238596, --4131222, -282394, 4946192, -4114042, -8656507, -1112933, -2580202, -2859375, -230318, -1282585, --3758097, -34360, 623844, 4378719, -6435472, 1482301, 3317325, -584116, -2753611, -4234301, --1326071, -820876, 740345, -1602560, -504659, -2663417, 1038308, -1203128, -4192425, 6931541, -565862, 1928977, -5702106, -12931610, -24124294, -5688148, -6049999, 1089848, -5376226, 802622, -2871723, -2874407, 10783589, -13760538, -3790309, -13066364, -313533, -6619619, 15174119, 16382079, -13597866, -18752900, 13469554, -6910603, 10313827, -4046396, 7707319, -6359773, -7577933, 2649995, --9884330, 6383395, 8280697, -1178432, 5117991, -9565429, -822486, 15688442, -12259984, 423591, --3379603, -5351530, -9805410, -738198, 16056198, 20500952, -12660490, 6087580, -1254667, -12693776, --12435541, -13922136, -5913096, 26017302, 16189879, -5028333, 8797704, -5685463, 7677791, -14441828, -8815420, -551903, -7418483, 19798726, 10675141, 3957276, 6923488, 5596343, 19061602, 2373506, --15407121, 6347425, 12492449, 9371619, -27194660, 16782584, -11298448, -10500658, -4731444, 1651415, --10405095, 11871290, 26903676, -4653060, 4225174, 13480829, 2742874, -2255932, 3666828, 1348620, -8170639, 6911140, 4631586, 12671764, 6969122, -3546032, 9102646, 5363341, -3346853, -7720741, -4832375, -1058173, 5196911, -2195802, 1894081, 3865471, 1998770, -1068373, -459025, 1777043, -6441914, 1348620, -899259, 1375463, 5073430, -1942399, 756451, 7773891, 3489661, -1961190, -4733591, 1420560, 1648731, 3273839, 453119, 2729989, -669478, -4778151, -3911642, 3959960, --1808181, 17306034, 10850161, 46470472, 12667469, -7461969, 2721399, 8075613, -48855, 15688442, -11208791, 10965052, -13970992, -22629646, 22713398, -12680354, 1953673, 8255464, 24952686, 10419054, --15466714, 14078903, -14007499, -2535641, -19174344, -24578488, -2998961, 7037841, 6502581, 5328444, -6142877, -1650878, -17292076, -5996311, 5290326, 6095096, -9247601, 19292994, 11836393, -11042361, -6096706, 9773198, 3510062, 909459, -10679973, -967978, -7544647, -4005594, 891206, 12139188, -29185376, -7632694, 2491081, 4672388, 10773389, -10165114, 37051072, -2870649, 3429532, 3461207, --17072496, -16216186, -26913876, -11004780, 14467597, -4771172, 7192460, 6286759, 25452514, 4458713, -4432943, 1719598, 20026896, 10117332, -8602819, 18898392, -17026860, 3078955, 16918950, 22396106, -20109574, 8369818, -11704860, -18459770, -8286603, -5638755, -13910862, -7275138, -7977365, -1782948, --11700028, 3313567, -4120484, -1498944, -10213969, -785979, -6419903, 10359461, 890669, 2582886, --9094593, -1319629, -12436078, 1267552, 5129802, 20938, 8869644, 6096169, -104690, 4143570, --1987496, -5122286, -3375308, -2062121, -10654740, 1408212, 1999307, 2951716, 3042448, -4768488, -7346005, 8512625, 3463354, -5800890, -4294431, -1630477, 1730335, 4919885, 2341831, -3720516, --2225867, -1619203, -4672388, -19415936, 11006927, 4938139, 13464722, -3782793, -29229936, 2122788, --19565186, -17711372, 5322538, 3946001, 8315057, -5349919, 6010270, -1287417, -9947144, 15759846, --2489471, -5566278, -6328635, -11508365, -9556839, 5553930, -12073690, 2687039, -7709467, -5626944, --3305514, 15423764, -3045669, 16571594, 10576894, -4728222, 5621576, 5528697, 11996381, -8589935, --11303817, 1381906, 7056632, 8878771, 15814070, -17790828, -16957068, 6927246, 5621576, 19176492, --9638443, -1743220, 9670119, -296890, 2692408, -3966402, 12745315, 15679852, 7334731, -2415919, -10042170, 33275796, -7475391, -10211285, 12461311, -1778653, 19618336, 4322348, 9127879, 10668699, --3647501, 7336878, 22692460, -6635188, -27390080, 18792630, 5552319, -9448391, 2553358, -42103564, -27706298, -734976, 17141214, -11404749, 8897025, 795643, -16704202, -16312286, -2282775, 2581812, --12386149, -433792, 1764695, -2763275, -4211753, -3074660, -13561359, -2755759, -8203925, -419833, --4366908, -1762010, -4988068, 7524783, -6164889, -5138929, -8840116, -4760435, -10070625, -2405719, -2019172, -6091874, -827855, -5107253, -5128191, -5935645, -549756, -5030481, -3516505, 954020, --1656784, 3651259, -3316252, -6972343, -7171522, -625992, 927176, -5033165, -1167694, -2654290, -1832340, -9995463, -167504, -18402862, -288300, 27136678, 14202383, -36327372, 6052146, -7053410, -3559454, 5229660, -1290638, -19032610, 3011309, -3470334, 16431471, 30404610, -4703526, 9363566, -20869782, -1545651, -5329518, -5884642, 8498130, 30348776, -235149, -2790655, 25870736, -11013370, -7253126, -583042, -45634, -7299834, 9956808, -29092498, 1252520, 8345659, 21139830, 21434034, --17829482, 107374, 20319490, -1870995, 37515464, -14155675, -17862768, 1830730, 27346594, 4097936, --20378010, -10390600, 6496675, -747324, 12103218, -30865246, 4042638, 685047, -5961952, -22575958, --19070728, 4487167, -5552856, -2020782, 1438814, -23477364, -23579370, 4414153, 4097399, -24848534, --7839389, -16387985, 14425185, -38896296, -14118094, 11868068, -22855668, 12028593, -5919539, -10006200, -13013751, -4599373, 19376744, 17370458, 4409858, 10509248, -4742181, 1566589, -13139916, 13863618, --10115722, 7955353, -13786308, 9710384, 1048509, 3920232, -885300, -673236, -7783018, 8906688, --10310606, 1088774, 1547262, 4672388, -11352135, 5304822, -4399121, -4041564, 4009889, -3257733, --5160403, 7078643, 3633006, 7613904, 4024384, -1660542, -3640522, -4810900, -750546, 766115, --5245766, 1152125, -3746822, 1150514, -10897943, -6675990, -4285841, 4918812, 6934762, -4519380, -1789391, -2505577, 3160559, -9727027, 20573968, -383863, 11556683, -21467858, -1189169, -20342576, -21296058, 8873939, 27741194, 18892488, -9322763, 3307662, 21989158, 10715407, 11377905, 6666863, --17981418, -5634460, 9396852, 1068910, 11028939, -23795192, -17005386, 10198400, 35422744, 4391067, --11232950, 21764746, 6669011, 13457206, 4016331, 2320356, -19434728, -20542828, 703838, -57982, --34301756, 2407866, -6777996, -2180233, 11299522, -13920526, 8620536, 26811334, 3189550, -44771276, --31572842, -5610301, -9494562, -11445014, -9664, 7661148, 7349226, -11297375, 12611098, 11235098, -10879152, -7288023, 9404368, -5435818, -11236708, -3162170, 10459856, -33546916, -7260642, -15388331, --16967806, -7313793, 4954782, -9237938, -617938, 36017596, 21028696, -14464913, 409096, -41876, --6005438, -6955700, 3483219, 23998666, 9217000, 3243774, -7311108, -5969468, -12419972, -15096273, --15326591, -4044249, 2266669, 4367982, -5199058, 3848828, -1038308, -4039954, -1092532, -4662187, --13440026, -3899830, 127238, -3952981, -11596412, 1007707, -4043175, 12416750, -6281927, 3874597, --1072131, 4828617, 176094, -10953777, 1129040, 12022687, 2151779, 10759967, -2873333, 5254893, --3376381, 3144453, -547608, -8280160, -3216931, -1353452, -1164473, -2065342, 166430, -2879776, --5530844, 7329362, 14439143, -20045686, -4927938, -8599061, 5401458, 41366976, 6672232, -20623896, -5510980, 18170396, -3838090, 16964584, 21929030, -11455215, 5255966, 10836739, 7614440, 302795, --3125126, -6941204, 3344169, 12761958, 6761889, 11905649, -18043694, -28125594, -2889976, 12276090, -11071352, 8760123, -3099893, -25963614, 8381092, 5526013, 38683160, 40399536, 9720585, -30392262, -21921514, -11693585, -30794916, -7407745, -36459976, -28024124, -12218108, -13602698, -28261958, 4742718, --11352135, -32633162, -29618632, 8381629, 19334332, -3375844, -24997246, 7250442, 775778, 7820062, -15829639, 15174119, -19333796, 24824374, 17243220, 1986959, 6961605, 17213156, -863288, 45338212, --32424856, -15722802, -1046361, -37243272, 30444876, 2019708, 38256884, 11600707, 8586176, -2132988, -7605850, 15998753, 666257, -15281494, -215822, -8250632, 6088116, 5635534, 10951630, -4784594, --13937169, -292595, 12986907, 5937256, -8262980, -4340065, 6834367, -9497783, -30065, 2684, -11921755, 4462471, -6483253, -3022046, -7369090, -12139725, -10334765, -768799, 2272038, -6115497, --4340065, 1197222, -5960341, 9167071, 4571993, -301185, 5630702, 18711562, -7185481, -3781182, -2135136, 4894115, -10192494, 10899553, -3731253, -515933, 1889249, 8034810, 14186814, -20491288, -5557688, -40672804, -10709501, -2757906, -9705552, 44122736, 14224932, -12043625, -27643484, -14392435, --11241540, -17920752, -12728672, 6526740, -40468256, -9023726, 30103962, -3798899, -3128347, -31360778, -29888678, 14436459, 892816, -12060805, 12864501, 6002754, -6861747, 13269838, -20795694, -5848135, --10515691, 5753646, -4691715, -13516799, 15250892, -11571716, 6485401, 155156, -20205136, -12995497, --2975339, -25837450, -24881282, -33880312, -8464307, 15122580, -11074036, -6444062, 19588808, -23934242, --19233938, 20662014, 33823, -1508607, 19072340, -20401, -15948287, -9574556, 6567542, 13349295, --20666308, -6856379, 25587804, 10669773, 24696062, 12394202, -4821638, 12597676, -792421, -33493228, -10617696, -25415468, 18386218, 2868501, 6863895, -10881300, -28512678, 5724655, -4093641, -25228638, --9796820, 10858214, -12455405, 200253, 4112968, 7814693, -7925826, 111669, 1395328, -2476049, -5386963, -4066797, 3097745, 9883793, -1704028, 3164317, 2868501, -6966437, 2273648, 4559645, -2975876, -5295695, 6910603, 4315906, -309775, -7283191, -13983877, 2559801, -11026792, 8746164, --11262478, 7143605, 9554155, 75162, 725850, -100395, 5509370, 453656, -4694400, 10645076, -9001715, -4752382, -2973728, -7070590, -11407433, 30144228, 10711648, 974421, 3835406, -8054138, -12144020, 18516678, 47413216, 41146860, 3704409, -18328236, 8542153, 23794118, 6974490, 18389976, -13502303, 8826158, -13885092, -18148922, -21498996, -1662689, 8161512, 15075872, 30838938, 16095927, -19821274, 11294690, 18385144, 9054865, 17713518, -11911018, 3437048, 33042258, -774168, 25381110, -6888591, 20493974, -32663226, -5498632, -9547175, -9827959, 7759396, 12596602, 23854786, 38235948, -32284196, -11578158, 5824513, -42827804, 10470593, 9644349, 37688876, -30054034, 23874650, -7937100, --20837570, 15866683, 5057324, 13210246, 23644868, -7845295, -30046518, 15417322, -19281718, -26768384, --12533251, 35369592, -30769682, -44008920, -22013854, -7454990, 23206782, -2609730, -15661061, -30440044, --22737020, 14259828, -1973001, -769873, 19680078, -21543020, 6191196, 21700322, 8622684, 14456323, -21307870, -14584635, -7154879, -12361453, 16316044, 3385508, 8441221, 5694590, -14522358, 17914846, -4564477, 2647847, -7074348, -26749594, -25254408, 2291902, -11979201, -5240397, -11359652, -10186052, --4289599, 4429722, -77846, -11433203, 14357539, 11719892, -1539209, -12953084, 2152316, 7386807, --9004399, -4375498, -5142687, -163209, 6240588, -3125126, -6206228, -5359046, 4406100, 3345780, -7027640, 8392903, -4490925, -4138738, -5113159, 4835060, 5505075, 29584808, -9236327, -32948842, -2442226, -13827647, -46790448, -23850490, 61696668, 8499740, -27649388, -30626338, 3588445, 443992, -12867722, 15882789, -21369610, -14388140, -34181496, 7907035, -12294344, -8330626, 52649856, 11188390, --7088844, -54248120, -3325379, -28999082, 28845000, 35342212, 3893925, 27485106, -32273458, -12832289, --20319490, -4901632, 53787488, 66693324, 10855530, -17866528, -23638964, -48237316, 862215, 6192806, -58472760, 32479080, -8304856, -95820184, -49402324, 8217883, -8977019, 84109416, 28424094, -40401148, --16572131, -72105520, -22581864, 2527052, 47390668, 48642116, 54863376, 2599529, 13190918, -5742372, -4972499, 67192080, -24533390, 49362596, -11685532, -50662360, -14900852, -53701588, -16979080, 70370352, -32269164, 50258096, -16358457, 39424580, -43807592, -6991670, 10788421, 21040508, 42091216, -14053133, --593242, 2689723, -3637301, 6514929, 11474542, -11890617, 2155000, -12501576, -22394496, 10297184, -18822158, 10381473, -2042794, -13566728, -30056718, -29867202, -15431817, 10235981, 28376312, 15880642, -22043382, -29340532, -38216620, -29665876, 3748970, 33943128, 37967512, 28981902, -16822314, -73403672, --46834472, 1574106, 37455872, 80064096, 31412854, 6726993, -35927940, -47772920, -16187732, -15082315, -42362872, 46466176, 17796196, -2554969, -39662948, -29931090, 9698573, 14046154, 34599184, 16772921, --17053704, -12094091, -20512226, -9796820, 10481868, 9293235, 10623065, 13127568, -2254858, -3598109, --42487428, 47144784, 269509, -12513924, -73339248, -19971062, -19661286, -33349348, 71384504, 592706, -32094144, -48824116, 27220428, 22523346, -21687974, 14086956, -4000225, 12579422, 202400, 36268316, -13074954, -35479116, 21553756, 17468168, 97174, 24453934, -17964774, -9466645, 31077310, 21508122, -20771536, 10146860, 18102750, -53372484, 46705084, -26839250, -16788490, 10069551, -37121404, 54458036, --15295989, 5390721, 39611408, 1308891, -5779416, 21369072, 22116398, 38574712, -9210020, -35883380, --36318244, 4037269, -12976170, 16910896, -21880174, -10757819, -14743012, 10932302, -68434400, 1122597, -51189568, 14113799, 20971788, -1906429, -5390184, 13448616, -17903034, -20720532, 13011603, 7121056, --22123376, -24813636, 94836096, -10197863, -30539364, 8637179, 44571560, -1192927, -34711388, 14432164, --6331856, -13180181, 28774670, 36295696, -26300770, -43349640, 10040560, 10508174, -9786620, -25898652, -1522029, 13157632, -3762928, -4151623, -1488743, -4407710, 7197292, 7808788, -8682276, 1057099, -4130685, 2026151, -5126581, 2079838, -60130, -11933030, 8897562, 3791383, 16993574, 8407935, --6118181, 6941741, -3069828, 9975062, -461709, -2457258, 13908715, -3274376, 9607305, -2618320, --10499048, -806380, 12545599, -3322694, 14246407, -13123273, 17824114, 4277251, -12386686, 5464272, -525597, 6625524, -1879585, -4919885, -1030792, 4426501, 14099841, -37022620, 13423383, 57549876, -91532192, -40630928, 30093762, -60501056, -17351132, -36971080, -4600447, 55722904, 59861108, 46959024, --1064078, -38007240, -22386444, 20273856, 1983738, 10044318, 31521302, -820876, 15926812, -39790724, --9617506, -23108534, -27382564, 15068893, 13227426, 649614, 28363964, -23864986, -340376, 6082211, --32840930, -1106491, 2867428, -21263846, -7422777, 7741679, -13540958, 31256088, -9718974, 47435768, -36550708, -23597088, -6010270, -32738388, -36688148, -48518100, 16070694, 22200686, 65293168, 49236968, -23664732, 31264140, 6627672, -35715876, -22926536, -20033874, -23622320, -5217849, 14230300, -1359894, --16012712, 4299799, -16151761, 10545218, 24781424, 4678293, -24456080, 19639812, -11356967, -12800613, --24453396, 13030931, 11879343, 5731097, 3816079, 57070452, 44334800, 35697084, 6805913, -8227547, --47555488, -10058277, -4279935, 47588776, 28008018, 12466143, 15153718, 41248328, -5760088, -16288127, --21423296, -18504330, -7946763, -4043712, 4575751, 638340, 1132798, 21506512, -1636919, -12595528, --6962679, -4205847, 1318018, 10748156, 19925428, 8536248, -1528472, 12000675, -18836652, 7929047, -19031000, 7627862, 36648420, -14412837, 1154809, 6361921, -13984950, 4158065, -22783728, -946503, -9247065, 579284, 10623065, 5844914, -1671816, -282931, -3534758, -369904, 5712844, -6225018, --99629816, -56693568, -33673616, 57530012, 26042534, 152055264, 141695808, 147659904, 148116240, 159964448, -111466752, 59090160, 84242560, 51567524, -26058104, -46632072, -73427832, -140927536, -128137128, -131635912, --96489128, -96582544, -72662792, -59163176, -32428076, 3716221, -56710748, -28170690, -12350178, -8388608, --31039728, 8251169, 37126236, 42950748, 15083925, 50655380, 63181116, 16254841, 11815992, 13049184, -62054760, 65847756, 81843824, 92858800, 80160192, 92209728, 138712416, 56902948, 108121504, 148969872, -94772208, 113148768, 87891136, 44741212, 52166136, 58911920, 51282448, 71094056, 68924560, 43574052, -7606924, 21791054, 40251896, -2325725, 3892314, -19532974, -23656142, -69901664, -32472100, -121322088, --153617552, -122124712, -140250544, -189429536, -184022176, -108413024, -205451904, -185438432, -170323904, -191462656, --162617120, -123230128, -155881536, -113927768, -32573032, -75659608, -94646048, -36992552, -38039452, -30433602, --34628172, -14936286, 8209830, 19231790, 36326296, 48377436, 54410256, 62463856, 63529008, 91105384, -54784992, 107318888, 119145080, 57133264, 110571784, 106077640, 66247724, 81231792, 117017456, 80155904, -132209296, 100470560, 125277752, 88282512, 79267920, 83147344, 76735496, 60887604, 68874632, 60604672, -46972984, 35913980, 34154116, 28337120, 11151346, -9550934, -8391829, -5737003, -43425340, -69110856, --67138928, -68184752, -74896176, -68870336, -77496776, -55952688, -58488328, -47590920, -36050880, -28045600, --32283122, -31396748, -24658480, -17442936, -19481434, -24896852, -13947906, -7675107, -15295452, -22257594, --13764833, -10359461, -13959181, -16862578, -8163122, -1174137, 4849555, -214212, 3379603, 10998338, -11212549, -1090922, 3333968, 7406671, 4938139, -1600949, 1415192, 4003447, 3063922, -3249143, -187905, 2680060, 4547297, 2450279, 4648229, 915902, 2747705, 5120138, 9188009, 2951716, -1758252, 781147, 3065533, 819802, 2236604, -123480, 1125818, -2683818, -4330938, -7386807, --2957622, -4794257, -3964792, -6763500, -1947231, -3599183, -2213519, -2121177, 2818036, 865973, -2314987, -579821, 4716411, 4029216, 7420093, 3398930, 8617315, 9112847, 11089606, 6109054, -10105521, 9527848, 9742596, 5087389, 7626788, 5652177, 8081518, 3922379, 4998805, 2237141, -4919348, 603443, 2341831, -515396, 1217086, -2415382, -983548, -3289408, -992674, -3783329, --1522566, -3686156, -732292, -2981781, -195958, -2371896, 531502, -1712618, 1080184, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +107911, -2041183, -466004, -4917201, -3379603, 2188286, 194347, -3094524, 3853660, 2585570, +-834834, 237297, -522375, 3105261, -4303021, 1620276, 3226594, 2850248, -6192269, -4335770, +-3074660, 4167192, 1010928, 1365263, -1721745, 4445291, 1671816, -1093606, 122407, -1256278, +876173, 1671279, -980326, -1267552, -3723200, 3978750, 6618008, 791885, 4206384, -768799, +853625, 1518808, 1834488, -5004174, 361851, -5228049, -1193464, -731755, 1658394, -2631741, +-76773, 1158567, 537408, -3043521, 130997, 357556, 2510945, -3236258, -4063576, -537945, +5541045, 8881455, 30602, 1464047, 629213, -1889786, -5317170, -1345935, 3732864, -1690607, +3718368, 1446867, 3787088, -193274, 1483374, 1347546, -3165928, -4292820, -434865, 1638530, +2491618, 1211181, 1125818, 753230, 853088, -1462436, -2328946, -1588064, -1257352, -600759, +68719, -871342, -96637, 802622, 1296006, 1137630, -151398, 94489, 781147, -1611, +-903554, 2574296, -5616207, -1210644, -5328981, 3103651, 289910, -2379412, 11197517, -4343823, +-8112657, 666794, 3681861, -628676, -6117644, -1675574, -2688113, -941135, -2928094, -893890, +4121558, -240518, -2774012, 4839355, 652298, 4702453, -1288490, -1090385, 1737851, 172872, +2032593, -819802, 4337917, 7223062, -2026688, -4769561, -3583077, 3010235, -58519, -10990821, +-1098975, -4348118, -1687922, 5458904, -3823595, -2814814, 3679713, -2384781, -581968, 5011153, +1662152, -3856344, 1703491, -2762201, -6570763, 2139968, 2512019, -4897874, -2914135, -1376537, +-2129230, 10201, 2076617, 3438658, 5075578, 5783711, -1413581, 643171, -2306398, 2527588, +1527398, -1214402, 2352568, 3737159, -3558917, -1733556, 548682, 129923, 1372779, 4285841, +-577136, -1072131, 3788161, 622770, -2700461, -1603097, -244276, -1570347, 1130113, -615791, +-1510755, 663036, -1708323, -1250909, 787053, -1612760, -1174137, 111669, 1071594, -2010045, +199716, -440234, -761283, -935229, -131533, -1553168, -497679, -1483911, -9034464, -4620848, +2804077, 3991098, 1585380, 4332012, -3701188, 4535486, 5610838, -1589675, 6207839, -862752, +4578435, -2184528, 162135, -1960653, 5849746, 2257005, -213675, 5188858, -2749853, -2218888, +3833258, -9060770, -1551557, 479426, -1902134, -8075613, -4900558, 3329674, -3134789, -2115808, +139586, 6292664, -1490891, -4427575, -324270, 1610076, 3590593, -554588, -5693516, -3698504, +-1027034, -2942053, 976031, -4989679, 2498060, -4694936, -6858526, 209917, 2440078, 2789581, +-2175938, -1591822, -4491462, 5835787, 3407520, 806917, 87510, -171262, -1956895, -1072131, +2005750, 2488397, 8849243, -1000727, 2250026, 572841, -234613, -4324495, -3251827, 5972689, +-2540473, 583042, 1515050, 860604, -907849, 4514548, 271120, 161061, -4871567, 4735739, +2690797, -1835562, -1058173, -534187, -1391569, 652298, 3451543, -48855, 1391569, 1032940, +-445603, 791885, 1800665, -185220, 37581, 542777, 858457, 707596, 1044751, 1827509, +720481, -1340030, 1442035, 652835, -949188, -771484, -122407, 211527, 27380, 2218888, +2672544, 2435247, 5738613, -3802657, -5739150, -4591320, 2859911, 6393059, -1224066, 4899484, +-4384625, -5273683, 4329864, -2189897, 409096, 1639604, 5433671, 2040646, 8653822, -3784403, +-4684736, 2035815, -2617783, -2420751, 4881231, -7691213, -4794794, 772557, -1538672, 3505230, +-2665027, 964220, 6132140, -5761699, 4246649, -3479461, 2731062, -3260954, -983011, -530965, +6352257, 1199907, 169114, -4699768, 170725, -5592585, 2033667, 1369021, -3793530, -100395, +-1607928, 9660455, 1238024, 606664, -8458938, -4935455, -7145752, 5513665, -3674882, -415001, +2845416, 12321187, 8640937, -3501472, -7662222, -3181497, -6663642, 6949257, -1410897, -1948841, +-3125126, -2048163, -648003, -3209414, -2187749, -554588, -2662343, 1832340, -1887638, 2578054, +-9677635, 629213, -875100, -3058017, -1506997, -3246459, -731755, -5063230, 323733, -2114198, +-258235, 3032247, -1058710, -1104344, -2244121, -2419677, -765578, 658204, -230854, -231928, +-954557, -396211, -1112933, -190589, 144955, 569620, -820876, -875100, -1246614, -1067299, +-980863, -1584843, 540629, -534187, -130997, -1610613, -4788889, 3417720, -4958540, -9024800, +9200894, 4059281, -9511742, 9506373, -1469416, -631360, -13395466, 7943542, 5410585, -10960220, +3306051, -1868311, 4190814, 882616, 4818417, 2978023, 1277216, -5135707, 536334, 1793686, +-6633040, -2924336, -7839389, -1425392, -4850629, -2699387, 957778, -6257231, -2219961, -9187472, +3506841, 836982, 844498, 732829, -3864934, -8007430, -2422362, 2724083, -1231045, -755914, +8368207, -12399571, 5236102, 6230387, -860067, 327491, -2346663, -1044214, -3945464, -6161131, +-4103841, -4869419, -3161096, 2990908, 1741072, 2654827, 4207994, -1062468, -2172180, 5866389, +11385958, 7929584, -126702, -9725417, 2696166, -1552631, 1461900, 10155987, -26307, 10231149, +9233643, -1334124, -3045669, -2544768, 755914, 815507, 3461744, 10373957, 2818572, 342524, +-1043140, -6550362, 798864, 1924145, -2166274, -393526, 355945, -158914, 1227287, 834834, +760209, -887448, 1284732, 1084479, 1148367, 1212791, -3492345, -637266, -2506114, 927713, +-1956895, 754304, -551366, -979789, -2099702, 323733, 532576, -3148211, -975494, 644245, +88047, 14436996, 3812320, -2676302, -608275, 4376035, -1431835, 13982266, -1399086, -2257005, +17933100, 17180, 9114994, -3447785, 343597, -872415, 1563905, -2376728, 1334124, -374199, +-414464, -9773735, -830539, -2401424, -1636919, -4128537, 6291054, 2801929, 3782256, -5524939, +-506269, -8675834, -3339337, 1516124, -602906, -5312338, -1511829, 2771328, 6569153, 3821447, +-1956895, -8074002, -183610, 2174327, -1244467, 4129611, 2904472, 5632313, 7995082, -2666101, +44023, -8616778, -10259603, 9675488, 5344550, -452045, -338766, -423054, -3680787, -4240744, +15032, 7725036, 4618164, 1320703, 9643812, -7418483, 2243047, -6103149, -4534412, 4006668, +4316442, 3373697, 14477798, -620623, -6401112, 1027571, -6272800, 2783676, 1775432, 5150203, +-2738579, -19864, 746251, -4933844, -764504, 3276523, -406411, 772020, -1999844, -1175210, +-216359, 2235531, -1137093, 1373316, -2126546, 103616, -2778307, 815507, -1428614, -1093606, +560493, 1347009, -1680943, 1819456, 1333587, 2244121, 245350, 1286880, -499827, 743566, +529355, 752693, -791885, -127238, -734976, -228707, 526670, 1106491, -959388, 383863, +-206158, -7991324, -10699300, 4145717, -9999221, -10737, 11158862, -11675869, 4281546, 5221607, +-3115999, -14408005, 202937, 8406862, -9300752, 5778342, -639413, -4141422, -12064563, -352724, +-8701067, 1530082, -4412005, -6803228, -8464307, 3471944, -1190243, -508954, 8069707, -4888747, +6809671, -5175436, -2054068, 10402948, 3582003, -5569499, 4288525, 2502892, -4807142, 2529199, +2632278, -1860258, -2046552, 405338, -2311229, -2757906, 1717987, 1895691, 14186277, -13356811, +2170569, 840740, -4771172, 9585293, 5473399, -3303904, -10335302, 910533, -1035624, -3134253, +-6518150, -7660074, 9346386, 6042482, 786516, -943819, 4985384, 2513093, -2246805, 3967476, +2871186, -2599529, 9944460, -3698504, 6088653, -4077535, 3036005, 3112241, 2252710, -311922, +-5512054, 5269925, -4287988, -4489852, -3059091, 1527398, 5369, 643708, -5226439, 2836826, +2218888, -3330210, 358093, -142271, -1641214, 300648, -1081795, 2522757, -714038, 376347, +2138894, -974421, -1592896, 1396938, -1818382, 1472100, -310848, -32212, -2094870, -958851, +-51540, -2321967, 2299955, 1279363, 536334, 1500554, -467615, 1018444, -555125, 4712116, +-10787884, 7912941, -4505421, -1996623, -6185290, -4464082, 3792993, -3561602, 3105261, 12097312, +4160213, 6646462, -15420006, -10217190, -5484137, -3694209, 1687385, -72478, 2680060, -12957379, +6951942, 2888366, 1749662, 12359305, 226560, -7007239, 11621645, 4565014, -5159867, 2369748, +-6636262, 6097780, 2893734, 8127152, -6947647, -4947266, 2078764, -7044820, 8904541, -8147553, +-121870, 7895224, 7293928, -15038828, -403727, 734439, 1771674, 2485712, 16451335, 3792456, +1050656, -5028870, -4129611, -8882529, -4785131, 12144020, 319438, -14499273, 245350, 3355980, +-8207683, -9062918, 1103807, -5878737, 2438468, 13310641, 6560026, 5601711, -5432597, -14223858, +1175747, -2434173, 6558415, -1278827, -11883101, -1448478, 3139084, 3282966, 3248069, -1004486, +10118943, 1905892, -6383932, 8323647, -581431, 4982162, -132607, -1240709, -4296041, 6152004, +4265977, 2407329, -3107946, -1225676, -789737, -2073396, 1205812, -10201, -2633889, 1334124, +849330, -1498944, -1948841, -824634, -1461900, -214748, 1912334, -1908039, 1007170, 2357937, +2861522, -718870, 1247151, -1493038, -19019188, -5684926, 5398237, 14697378, 2113661, 7620346, +26131118, 4335233, 4471598, -4043175, -12504260, 7092065, -6055904, 6535330, -1559610, 17273284, +12606266, -6667937, -14129369, -11250130, 8548059, -7494181, 10475425, 4595615, 3422552, -3616899, +-1364726, 12430172, -2439542, 10969346, 10996190, 5672578, 7717520, -8543227, 8355859, 4494684, +-4459250, 12147241, -5342940, 11035918, 843424, 1245004, -16186658, 9760313, 905164, -3048890, +8014946, -11294153, -4468914, 6762963, 5541582, -10406169, 1687385, -6657736, -3814468, 10301479, +1395328, 3107409, -1079111, -11870216, 7976291, 7560753, 527207, 5977521, 2692945, -5259725, +-5513128, -448824, 6338298, -10749229, -379568, 688269, 475131, -103616, 4713727, 6179384, +12702366, 7123204, 428423, -17840220, -5858336, -6680285, -590558, 1319092, -5004711, -10576357, +-3324842, -4766340, 2794950, 408559, -3008088, 1129040, -3085397, 4915590, -1763621, -2107218, +-2911451, 53150, 1423782, -6361384, 3992709, -4093104, 1660005, -1054951, -2346126, 108448, +-3917010, 1262720, -3534221, -2579665, -505732, -2046015, -1882269, 2178622, 3757023, 2246805, +3616899, 4704600, -981400, 693100, 23588498, 6888054, 3148748, -8753680, -21223580, 15345381, +4800163, -14102525, 4212826, -1545651, 3620658, 2961917, -10174778, -21792664, -17040820, 5723044, +13343927, -2678986, 14007499, -6528887, 10926934, 13305809, 18072686, -4028143, 13351980, -11904576, +4514548, -6516539, 1597191, 7155953, -324270, -3905736, 3236795, 8992588, -6468758, -12084427, +-12194486, 25435334, 21475, -1332514, -11530913, 11758547, 3814468, -23592792, -13659607, 5208185, +-3348464, -4238059, 9146670, 3034931, 22722524, 12494060, -855772, -13312251, -13036836, -7456600, +-5393405, -15098421, 13818520, -10357851, 10919954, 9342091, -9567577, -12352326, -11909944, -17390322, +4138738, -396211, -6288369, -7933342, -12760885, -4657892, -12573517, 2511482, 1427003, -4374961, +1614371, 10111964, -26234734, -10285910, -21429202, 10635950, 7405061, -9299678, -3191161, 4238596, +-4131222, -282394, 4946192, -4114042, -8656507, -1112933, -2580202, -2859375, -230318, -1282585, +-3758097, -34360, 623844, 4378719, -6435472, 1482301, 3317325, -584116, -2753611, -4234301, +-1326071, -820876, 740345, -1602560, -504659, -2663417, 1038308, -1203128, -4192425, 6931541, +565862, 1928977, -5702106, -12931610, -24124294, -5688148, -6049999, 1089848, -5376226, 802622, +2871723, -2874407, 10783589, -13760538, -3790309, -13066364, -313533, -6619619, 15174119, 16382079, +13597866, -18752900, 13469554, -6910603, 10313827, -4046396, 7707319, -6359773, -7577933, 2649995, +-9884330, 6383395, 8280697, -1178432, 5117991, -9565429, -822486, 15688442, -12259984, 423591, +-3379603, -5351530, -9805410, -738198, 16056198, 20500952, -12660490, 6087580, -1254667, -12693776, +-12435541, -13922136, -5913096, 26017302, 16189879, -5028333, 8797704, -5685463, 7677791, -14441828, +8815420, -551903, -7418483, 19798726, 10675141, 3957276, 6923488, 5596343, 19061602, 2373506, +-15407121, 6347425, 12492449, 9371619, -27194660, 16782584, -11298448, -10500658, -4731444, 1651415, +-10405095, 11871290, 26903676, -4653060, 4225174, 13480829, 2742874, -2255932, 3666828, 1348620, +8170639, 6911140, 4631586, 12671764, 6969122, -3546032, 9102646, 5363341, -3346853, -7720741, +4832375, -1058173, 5196911, -2195802, 1894081, 3865471, 1998770, -1068373, -459025, 1777043, +6441914, 1348620, -899259, 1375463, 5073430, -1942399, 756451, 7773891, 3489661, -1961190, +4733591, 1420560, 1648731, 3273839, 453119, 2729989, -669478, -4778151, -3911642, 3959960, +-1808181, 17306034, 10850161, 46470472, 12667469, -7461969, 2721399, 8075613, -48855, 15688442, +11208791, 10965052, -13970992, -22629646, 22713398, -12680354, 1953673, 8255464, 24952686, 10419054, +-15466714, 14078903, -14007499, -2535641, -19174344, -24578488, -2998961, 7037841, 6502581, 5328444, +6142877, -1650878, -17292076, -5996311, 5290326, 6095096, -9247601, 19292994, 11836393, -11042361, +6096706, 9773198, 3510062, 909459, -10679973, -967978, -7544647, -4005594, 891206, 12139188, +29185376, -7632694, 2491081, 4672388, 10773389, -10165114, 37051072, -2870649, 3429532, 3461207, +-17072496, -16216186, -26913876, -11004780, 14467597, -4771172, 7192460, 6286759, 25452514, 4458713, +4432943, 1719598, 20026896, 10117332, -8602819, 18898392, -17026860, 3078955, 16918950, 22396106, +20109574, 8369818, -11704860, -18459770, -8286603, -5638755, -13910862, -7275138, -7977365, -1782948, +-11700028, 3313567, -4120484, -1498944, -10213969, -785979, -6419903, 10359461, 890669, 2582886, +-9094593, -1319629, -12436078, 1267552, 5129802, 20938, 8869644, 6096169, -104690, 4143570, +-1987496, -5122286, -3375308, -2062121, -10654740, 1408212, 1999307, 2951716, 3042448, -4768488, +7346005, 8512625, 3463354, -5800890, -4294431, -1630477, 1730335, 4919885, 2341831, -3720516, +-2225867, -1619203, -4672388, -19415936, 11006927, 4938139, 13464722, -3782793, -29229936, 2122788, +-19565186, -17711372, 5322538, 3946001, 8315057, -5349919, 6010270, -1287417, -9947144, 15759846, +-2489471, -5566278, -6328635, -11508365, -9556839, 5553930, -12073690, 2687039, -7709467, -5626944, +-3305514, 15423764, -3045669, 16571594, 10576894, -4728222, 5621576, 5528697, 11996381, -8589935, +-11303817, 1381906, 7056632, 8878771, 15814070, -17790828, -16957068, 6927246, 5621576, 19176492, +-9638443, -1743220, 9670119, -296890, 2692408, -3966402, 12745315, 15679852, 7334731, -2415919, +10042170, 33275796, -7475391, -10211285, 12461311, -1778653, 19618336, 4322348, 9127879, 10668699, +-3647501, 7336878, 22692460, -6635188, -27390080, 18792630, 5552319, -9448391, 2553358, -42103564, +27706298, -734976, 17141214, -11404749, 8897025, 795643, -16704202, -16312286, -2282775, 2581812, +-12386149, -433792, 1764695, -2763275, -4211753, -3074660, -13561359, -2755759, -8203925, -419833, +-4366908, -1762010, -4988068, 7524783, -6164889, -5138929, -8840116, -4760435, -10070625, -2405719, +2019172, -6091874, -827855, -5107253, -5128191, -5935645, -549756, -5030481, -3516505, 954020, +-1656784, 3651259, -3316252, -6972343, -7171522, -625992, 927176, -5033165, -1167694, -2654290, +1832340, -9995463, -167504, -18402862, -288300, 27136678, 14202383, -36327372, 6052146, -7053410, +3559454, 5229660, -1290638, -19032610, 3011309, -3470334, 16431471, 30404610, -4703526, 9363566, +20869782, -1545651, -5329518, -5884642, 8498130, 30348776, -235149, -2790655, 25870736, -11013370, +7253126, -583042, -45634, -7299834, 9956808, -29092498, 1252520, 8345659, 21139830, 21434034, +-17829482, 107374, 20319490, -1870995, 37515464, -14155675, -17862768, 1830730, 27346594, 4097936, +-20378010, -10390600, 6496675, -747324, 12103218, -30865246, 4042638, 685047, -5961952, -22575958, +-19070728, 4487167, -5552856, -2020782, 1438814, -23477364, -23579370, 4414153, 4097399, -24848534, +-7839389, -16387985, 14425185, -38896296, -14118094, 11868068, -22855668, 12028593, -5919539, -10006200, +13013751, -4599373, 19376744, 17370458, 4409858, 10509248, -4742181, 1566589, -13139916, 13863618, +-10115722, 7955353, -13786308, 9710384, 1048509, 3920232, -885300, -673236, -7783018, 8906688, +-10310606, 1088774, 1547262, 4672388, -11352135, 5304822, -4399121, -4041564, 4009889, -3257733, +-5160403, 7078643, 3633006, 7613904, 4024384, -1660542, -3640522, -4810900, -750546, 766115, +-5245766, 1152125, -3746822, 1150514, -10897943, -6675990, -4285841, 4918812, 6934762, -4519380, +1789391, -2505577, 3160559, -9727027, 20573968, -383863, 11556683, -21467858, -1189169, -20342576, +21296058, 8873939, 27741194, 18892488, -9322763, 3307662, 21989158, 10715407, 11377905, 6666863, +-17981418, -5634460, 9396852, 1068910, 11028939, -23795192, -17005386, 10198400, 35422744, 4391067, +-11232950, 21764746, 6669011, 13457206, 4016331, 2320356, -19434728, -20542828, 703838, -57982, +-34301756, 2407866, -6777996, -2180233, 11299522, -13920526, 8620536, 26811334, 3189550, -44771276, +-31572842, -5610301, -9494562, -11445014, -9664, 7661148, 7349226, -11297375, 12611098, 11235098, +10879152, -7288023, 9404368, -5435818, -11236708, -3162170, 10459856, -33546916, -7260642, -15388331, +-16967806, -7313793, 4954782, -9237938, -617938, 36017596, 21028696, -14464913, 409096, -41876, +-6005438, -6955700, 3483219, 23998666, 9217000, 3243774, -7311108, -5969468, -12419972, -15096273, +-15326591, -4044249, 2266669, 4367982, -5199058, 3848828, -1038308, -4039954, -1092532, -4662187, +-13440026, -3899830, 127238, -3952981, -11596412, 1007707, -4043175, 12416750, -6281927, 3874597, +-1072131, 4828617, 176094, -10953777, 1129040, 12022687, 2151779, 10759967, -2873333, 5254893, +-3376381, 3144453, -547608, -8280160, -3216931, -1353452, -1164473, -2065342, 166430, -2879776, +-5530844, 7329362, 14439143, -20045686, -4927938, -8599061, 5401458, 41366976, 6672232, -20623896, +5510980, 18170396, -3838090, 16964584, 21929030, -11455215, 5255966, 10836739, 7614440, 302795, +-3125126, -6941204, 3344169, 12761958, 6761889, 11905649, -18043694, -28125594, -2889976, 12276090, +11071352, 8760123, -3099893, -25963614, 8381092, 5526013, 38683160, 40399536, 9720585, -30392262, +21921514, -11693585, -30794916, -7407745, -36459976, -28024124, -12218108, -13602698, -28261958, 4742718, +-11352135, -32633162, -29618632, 8381629, 19334332, -3375844, -24997246, 7250442, 775778, 7820062, +15829639, 15174119, -19333796, 24824374, 17243220, 1986959, 6961605, 17213156, -863288, 45338212, +-32424856, -15722802, -1046361, -37243272, 30444876, 2019708, 38256884, 11600707, 8586176, -2132988, +7605850, 15998753, 666257, -15281494, -215822, -8250632, 6088116, 5635534, 10951630, -4784594, +-13937169, -292595, 12986907, 5937256, -8262980, -4340065, 6834367, -9497783, -30065, 2684, +11921755, 4462471, -6483253, -3022046, -7369090, -12139725, -10334765, -768799, 2272038, -6115497, +-4340065, 1197222, -5960341, 9167071, 4571993, -301185, 5630702, 18711562, -7185481, -3781182, +2135136, 4894115, -10192494, 10899553, -3731253, -515933, 1889249, 8034810, 14186814, -20491288, +5557688, -40672804, -10709501, -2757906, -9705552, 44122736, 14224932, -12043625, -27643484, -14392435, +-11241540, -17920752, -12728672, 6526740, -40468256, -9023726, 30103962, -3798899, -3128347, -31360778, +29888678, 14436459, 892816, -12060805, 12864501, 6002754, -6861747, 13269838, -20795694, -5848135, +-10515691, 5753646, -4691715, -13516799, 15250892, -11571716, 6485401, 155156, -20205136, -12995497, +-2975339, -25837450, -24881282, -33880312, -8464307, 15122580, -11074036, -6444062, 19588808, -23934242, +-19233938, 20662014, 33823, -1508607, 19072340, -20401, -15948287, -9574556, 6567542, 13349295, +-20666308, -6856379, 25587804, 10669773, 24696062, 12394202, -4821638, 12597676, -792421, -33493228, +10617696, -25415468, 18386218, 2868501, 6863895, -10881300, -28512678, 5724655, -4093641, -25228638, +-9796820, 10858214, -12455405, 200253, 4112968, 7814693, -7925826, 111669, 1395328, -2476049, +5386963, -4066797, 3097745, 9883793, -1704028, 3164317, 2868501, -6966437, 2273648, 4559645, +2975876, -5295695, 6910603, 4315906, -309775, -7283191, -13983877, 2559801, -11026792, 8746164, +-11262478, 7143605, 9554155, 75162, 725850, -100395, 5509370, 453656, -4694400, 10645076, +9001715, -4752382, -2973728, -7070590, -11407433, 30144228, 10711648, 974421, 3835406, -8054138, +12144020, 18516678, 47413216, 41146860, 3704409, -18328236, 8542153, 23794118, 6974490, 18389976, +13502303, 8826158, -13885092, -18148922, -21498996, -1662689, 8161512, 15075872, 30838938, 16095927, +19821274, 11294690, 18385144, 9054865, 17713518, -11911018, 3437048, 33042258, -774168, 25381110, +6888591, 20493974, -32663226, -5498632, -9547175, -9827959, 7759396, 12596602, 23854786, 38235948, +32284196, -11578158, 5824513, -42827804, 10470593, 9644349, 37688876, -30054034, 23874650, -7937100, +-20837570, 15866683, 5057324, 13210246, 23644868, -7845295, -30046518, 15417322, -19281718, -26768384, +-12533251, 35369592, -30769682, -44008920, -22013854, -7454990, 23206782, -2609730, -15661061, -30440044, +-22737020, 14259828, -1973001, -769873, 19680078, -21543020, 6191196, 21700322, 8622684, 14456323, +21307870, -14584635, -7154879, -12361453, 16316044, 3385508, 8441221, 5694590, -14522358, 17914846, +4564477, 2647847, -7074348, -26749594, -25254408, 2291902, -11979201, -5240397, -11359652, -10186052, +-4289599, 4429722, -77846, -11433203, 14357539, 11719892, -1539209, -12953084, 2152316, 7386807, +-9004399, -4375498, -5142687, -163209, 6240588, -3125126, -6206228, -5359046, 4406100, 3345780, +7027640, 8392903, -4490925, -4138738, -5113159, 4835060, 5505075, 29584808, -9236327, -32948842, +2442226, -13827647, -46790448, -23850490, 61696668, 8499740, -27649388, -30626338, 3588445, 443992, +12867722, 15882789, -21369610, -14388140, -34181496, 7907035, -12294344, -8330626, 52649856, 11188390, +-7088844, -54248120, -3325379, -28999082, 28845000, 35342212, 3893925, 27485106, -32273458, -12832289, +-20319490, -4901632, 53787488, 66693324, 10855530, -17866528, -23638964, -48237316, 862215, 6192806, +58472760, 32479080, -8304856, -95820184, -49402324, 8217883, -8977019, 84109416, 28424094, -40401148, +-16572131, -72105520, -22581864, 2527052, 47390668, 48642116, 54863376, 2599529, 13190918, -5742372, +4972499, 67192080, -24533390, 49362596, -11685532, -50662360, -14900852, -53701588, -16979080, 70370352, +32269164, 50258096, -16358457, 39424580, -43807592, -6991670, 10788421, 21040508, 42091216, -14053133, +-593242, 2689723, -3637301, 6514929, 11474542, -11890617, 2155000, -12501576, -22394496, 10297184, +18822158, 10381473, -2042794, -13566728, -30056718, -29867202, -15431817, 10235981, 28376312, 15880642, +22043382, -29340532, -38216620, -29665876, 3748970, 33943128, 37967512, 28981902, -16822314, -73403672, +-46834472, 1574106, 37455872, 80064096, 31412854, 6726993, -35927940, -47772920, -16187732, -15082315, +42362872, 46466176, 17796196, -2554969, -39662948, -29931090, 9698573, 14046154, 34599184, 16772921, +-17053704, -12094091, -20512226, -9796820, 10481868, 9293235, 10623065, 13127568, -2254858, -3598109, +-42487428, 47144784, 269509, -12513924, -73339248, -19971062, -19661286, -33349348, 71384504, 592706, +32094144, -48824116, 27220428, 22523346, -21687974, 14086956, -4000225, 12579422, 202400, 36268316, +13074954, -35479116, 21553756, 17468168, 97174, 24453934, -17964774, -9466645, 31077310, 21508122, +20771536, 10146860, 18102750, -53372484, 46705084, -26839250, -16788490, 10069551, -37121404, 54458036, +-15295989, 5390721, 39611408, 1308891, -5779416, 21369072, 22116398, 38574712, -9210020, -35883380, +-36318244, 4037269, -12976170, 16910896, -21880174, -10757819, -14743012, 10932302, -68434400, 1122597, +51189568, 14113799, 20971788, -1906429, -5390184, 13448616, -17903034, -20720532, 13011603, 7121056, +-22123376, -24813636, 94836096, -10197863, -30539364, 8637179, 44571560, -1192927, -34711388, 14432164, +-6331856, -13180181, 28774670, 36295696, -26300770, -43349640, 10040560, 10508174, -9786620, -25898652, +1522029, 13157632, -3762928, -4151623, -1488743, -4407710, 7197292, 7808788, -8682276, 1057099, +4130685, 2026151, -5126581, 2079838, -60130, -11933030, 8897562, 3791383, 16993574, 8407935, +-6118181, 6941741, -3069828, 9975062, -461709, -2457258, 13908715, -3274376, 9607305, -2618320, +-10499048, -806380, 12545599, -3322694, 14246407, -13123273, 17824114, 4277251, -12386686, 5464272, +525597, 6625524, -1879585, -4919885, -1030792, 4426501, 14099841, -37022620, 13423383, 57549876, +91532192, -40630928, 30093762, -60501056, -17351132, -36971080, -4600447, 55722904, 59861108, 46959024, +-1064078, -38007240, -22386444, 20273856, 1983738, 10044318, 31521302, -820876, 15926812, -39790724, +-9617506, -23108534, -27382564, 15068893, 13227426, 649614, 28363964, -23864986, -340376, 6082211, +-32840930, -1106491, 2867428, -21263846, -7422777, 7741679, -13540958, 31256088, -9718974, 47435768, +36550708, -23597088, -6010270, -32738388, -36688148, -48518100, 16070694, 22200686, 65293168, 49236968, +23664732, 31264140, 6627672, -35715876, -22926536, -20033874, -23622320, -5217849, 14230300, -1359894, +-16012712, 4299799, -16151761, 10545218, 24781424, 4678293, -24456080, 19639812, -11356967, -12800613, +-24453396, 13030931, 11879343, 5731097, 3816079, 57070452, 44334800, 35697084, 6805913, -8227547, +-47555488, -10058277, -4279935, 47588776, 28008018, 12466143, 15153718, 41248328, -5760088, -16288127, +-21423296, -18504330, -7946763, -4043712, 4575751, 638340, 1132798, 21506512, -1636919, -12595528, +-6962679, -4205847, 1318018, 10748156, 19925428, 8536248, -1528472, 12000675, -18836652, 7929047, +19031000, 7627862, 36648420, -14412837, 1154809, 6361921, -13984950, 4158065, -22783728, -946503, +9247065, 579284, 10623065, 5844914, -1671816, -282931, -3534758, -369904, 5712844, -6225018, +-99629816, -56693568, -33673616, 57530012, 26042534, 152055264, 141695808, 147659904, 148116240, 159964448, +111466752, 59090160, 84242560, 51567524, -26058104, -46632072, -73427832, -140927536, -128137128, -131635912, +-96489128, -96582544, -72662792, -59163176, -32428076, 3716221, -56710748, -28170690, -12350178, -8388608, +-31039728, 8251169, 37126236, 42950748, 15083925, 50655380, 63181116, 16254841, 11815992, 13049184, +62054760, 65847756, 81843824, 92858800, 80160192, 92209728, 138712416, 56902948, 108121504, 148969872, +94772208, 113148768, 87891136, 44741212, 52166136, 58911920, 51282448, 71094056, 68924560, 43574052, +7606924, 21791054, 40251896, -2325725, 3892314, -19532974, -23656142, -69901664, -32472100, -121322088, +-153617552, -122124712, -140250544, -189429536, -184022176, -108413024, -205451904, -185438432, -170323904, -191462656, +-162617120, -123230128, -155881536, -113927768, -32573032, -75659608, -94646048, -36992552, -38039452, -30433602, +-34628172, -14936286, 8209830, 19231790, 36326296, 48377436, 54410256, 62463856, 63529008, 91105384, +54784992, 107318888, 119145080, 57133264, 110571784, 106077640, 66247724, 81231792, 117017456, 80155904, +132209296, 100470560, 125277752, 88282512, 79267920, 83147344, 76735496, 60887604, 68874632, 60604672, +46972984, 35913980, 34154116, 28337120, 11151346, -9550934, -8391829, -5737003, -43425340, -69110856, +-67138928, -68184752, -74896176, -68870336, -77496776, -55952688, -58488328, -47590920, -36050880, -28045600, +-32283122, -31396748, -24658480, -17442936, -19481434, -24896852, -13947906, -7675107, -15295452, -22257594, +-13764833, -10359461, -13959181, -16862578, -8163122, -1174137, 4849555, -214212, 3379603, 10998338, +11212549, -1090922, 3333968, 7406671, 4938139, -1600949, 1415192, 4003447, 3063922, -3249143, +187905, 2680060, 4547297, 2450279, 4648229, 915902, 2747705, 5120138, 9188009, 2951716, +1758252, 781147, 3065533, 819802, 2236604, -123480, 1125818, -2683818, -4330938, -7386807, +-2957622, -4794257, -3964792, -6763500, -1947231, -3599183, -2213519, -2121177, 2818036, 865973, +2314987, -579821, 4716411, 4029216, 7420093, 3398930, 8617315, 9112847, 11089606, 6109054, +10105521, 9527848, 9742596, 5087389, 7626788, 5652177, 8081518, 3922379, 4998805, 2237141, +4919348, 603443, 2341831, -515396, 1217086, -2415382, -983548, -3289408, -992674, -3783329, +-1522566, -3686156, -732292, -2981781, -195958, -2371896, 531502, -1712618, 1080184, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 10821707, -521302, -665720, -413927, -800475, -5559299, -5552856, 5318244, 1334661, -3243237, -4842039, --2394444, -3647501, -6410239, 8199093, 948114, 3001645, 4025995, 11791296, -338229, 1925756, --2865280, -992674, -2211908, -7601019, 1672353, -2288681, 720481, 5372467, -2135673, -469225, -1123671, 617402, -1298154, 303869, -7103876, 1522566, -202937, -2481417, 2179159, 1071058, --4791573, 7568269, 231928, 1137093, 6958384, -2655901, -3049964, -6833830, -3522410, 4817880, -268972, 5132486, -2515240, -5578089, 2423435, -5194763, -2379412, -10081899, 4141959, 3608310, -2134599, 3112778, 6931541, 1864553, -3082176, 3815005, 5753109, -3721589, 2835752, 38655, --1245541, -1901597, -1582159, 3954591, -812823, 4382478, -2209224, 1795296, -1372242, 1629940, -3126736, -1649268, 1125281, -1120450, 2523293, 2126546, 1722819, -817118, 583042, 127238, --1439351, 767189, 2466922, 498753, 824097, -1411434, 958315, -743566, 560493, -1068910, -229244, 1486059, -4308926, 1196148, -2683281, -5359046, -571231, -6338298, -7784092, -4845797, --3750043, -8494372, 303332, -3037616, -1758252, 2675228, 9059697, 881005, -2200634, -994822, -1424855, -128312, 3741990, 6509023, -583042, 7303055, -871342, -422517, -904091, 4183298, --5494874, 903554, 627602, -1286880, -345208, -3206193, -5458904, 7509751, -2568927, -498753, --1360431, 3345780, -3577171, -2995203, 1268626, 1163936, 5178120, -3513283, 4260071, -2447058, --4322348, -278636, -1801202, 1226213, 2310693, -32212, 3007551, 1504849, 2186138, -2811593, --3401077, -5532992, -4135517, 588411, 6659884, 907849, 5405753, 1473711, -2814277, 3797288, -1752884, -3965329, 7052873, 1246077, -6675990, 1803349, 3001645, 666794, 1989644, 1801202, --4731444, 1790465, 1639067, 1234266, -282931, 3544422, 1157494, -816044, -1148904, 48855, -1380295, 34360, 1878511, 15569, 85362, 1163936, -456340, -958851, -670015, 265214, --923955, -906238, 1212791, -36507, 1165547, 1103807, -282931, -20401, -7878581, -7091528, -1539746, 744640, 5942624, -4615479, 6111739, -3147137, -1331440, -9605694, -591095, 558883, --3256122, -649077, 5135171, 4744865, 7263327, -1855963, -1093069, 4433480, 2135136, 3970697, --9824201, 9646497, -2091649, -234076, 1551020, -1292248, -71941, -976568, -669478, 5938866, --174483, 7828652, -1364726, -3360812, -6602439, 658204, -2991445, -2733747, 4560719, 3411815, -4767414, 41876, 585726, -7150047, -5076652, -196495, 6395207, 2092186, -832150, 2019708, --2676838, 6694244, -374199, -6013491, -7485055, -2795487, 8367133, 6203007, 6459094, 2879776, -233002, -7136625, -3143916, -1116155, -4111894, 4196183, -747861, -2088428, 3685619, -10110890, -2980171, -1403381, 2363843, -890669, -2865817, 4427575, 1713155, -4847945, -5037997, 2449742, --1313723, 2874407, 804233, -2251637, 1548873, 1792612, -85899, 629750, 2147, 119185, --841277, -111669, -1387274, -81604, -1208496, 1886564, 1086090, -1602560, 758599, -482110, -528281, 435402, 694174, -1217623, -972273, 258772, 738734, -2157684, -1165547, 1946157, --2203318, -4399121, -665183, -3418794, 1593433, 5398774, 2188823, 141734, -2167885, -12720083, --8297340, -323733, 3722663, 4387309, 310848, 846645, -1732482, 4350265, 2005213, 3476239, --5466420, 5188321, 3063922, -6002217, 2288681, 5412733, -242129, 1717987, 947577, 4904316, --3789772, 2892661, -442919, -713501, -4675609, 244276, 5129265, -3277597, -2280628, -4479651, -6011344, -624918, 1220845, -4708895, -13237626, -3920768, 2018098, 1184874, 4979478, -3580929, --2120103, -2058900, -822486, -4316442, 200790, -3900367, 8784282, 3026878, 7178501, -7239704, --1349157, -3025805, 6732898, -2066953, -1157494, -5583458, 3513820, -151934, -3635153, 5636071, -1831267, 656593, 6580964, 1357210, -5629629, -832687, 766652, -1585917, -1848983, 8053, --4767414, 9580461, 4041027, 1364726, 6071473, 2568391, 2448668, 4371203, -1179505, 3694746, --2053531, 611496, 468151, 193810, -1028108, 644245, 373662, -381715, -564788, -650151, -548682, -518617, 130997, 3162707, 423591, -118648, 36507, -66572, -339302, 2506650, -746787, 1619740, 202400, -1641751, -310848, 3579855, -2858301, 2288681, 173409, -1411434, -5974837, 4620311, -499827, -8154533, -10976863, -8409546, 3098282, 52613, -4758287, -1184874, -523986, -1027034, 12284143, 2176475, -8924405, -2314451, -2685428, 500364, -4212289, 7018514, --5228049, -6767258, 6354404, -2624225, 1730872, 1750736, -2935073, -7973070, 1053341, -4220342, --3797288, -3872450, -505196, 6315213, -877247, -1353989, 9228811, 1760400, 1404991, -11857331, --1339493, 6425271, 7436736, -4050154, 2013803, 1086627, -11769821, -1505386, -724776, -1129040, -2961380, 204011, -6600828, 932008, -5277441, 5133023, -1794760, 6587406, 1301375, -7400229, -3315178, 14103062, -5444945, 198642, -10450729, 2609193, 8799314, -15686294, 2255932, -1044214, --1358820, 3995930, -2536715, -4037806, 7405598, 7151121, -6104223, -663572, 4642860, -1982127, -1105417, 2262911, 1384590, 528818, -1770063, 4025995, -88047, 2660732, 126165, 3607773, -2419140, 2307471, -166430, 844498, 3946001, 508417, -784905, 1464584, 1245541, 552977, -3286724, -1721745, 1063541, 609349, -697932, 325881, 1206349, 909459, 426812, -219580, -175020, 10685879, 1173600, 4871030, 7336341, -9069897, -2962454, -6885907, 3404299, 4227322, -7983808, 15858093, 2343442, -11829951, -1248225, -2859911, -1369558, -5027259, -105764, -424128, -5815923, 4884989, 1599339, -265214, 118112, -1684164, -1489280, 6967511, -2335925, -746787, -4970351, -472446, 2882997, -339302, 6360847, -4771709, -9895605, 12343199, -826244, 3063922, --9266392, 850940, -2892124, 13682155, 2024003, 6293201, -1380832, 5602785, 3547643, -12038256, --2025614, -6677064, -5997922, 1011465, 8517994, 1270774, -1824824, 13562433, -1509144, -7362111, --5860483, -3757560, 6473590, 20400558, -129386, 5806259, 1363652, -6236293, -1498407, 315680, -5912023, 9390409, 763967, 7590818, 6506339, -11884711, 323196, -1947231, -383863, 6278169, --2779918, 1793686, 2790118, -710817, -6282464, -4088809, -9142912, 2397129, 3549791, -228170, -1330903, 1566589, 1038845, 123480, -2879776, 833224, 1276142, 79457, 1178969, -1230508, -2359548, 35970, 1159104, -420907, -489089, -917512, 254477, -374199, 374736, 2254321, -3160559, 2913062, 354335, 956167, 1920387, 1358283, 17717, 1379758, 352187, -32749, -2383170, -3445638, -15752866, 3684545, -1730872, 5498632, 3274376, 14665166, 2765422, -2606508, -3321620, 11252814, 12138651, 5217312, 8500814, 8998493, -7036230, -5203890, -11300596, -11898133, -1148367, 5322538, -10348187, -7109245, -724239, -11645267, -9933186, 5077188, 1410360, -5105643, --3659849, -7600482, 6236830, 4807679, 10368051, 20169704, -2405182, -5566815, -2323577, -9764608, --301185, -7584376, -8705362, 10387378, 985158, 1525250, -13389561, 13743358, 2520072, -8382166, --2918430, 7124814, 279710, 1626182, -424128, 1245541, 3795677, -6400038, 7434052, 270583, --5552319, -1395864, -9375377, 1526861, -9621800, -8265128, 7027104, 7558069, -7696045, -11815455, -2829847, -5650567, -1064078, -3084324, 3799972, -3321084, 5079336, 1780801, 6191732, -1364189, -4570382, 2549600, -10901701, -3655554, 2415919, 1488743, -23085, -5203353, -3199214, -1499481, -3315715, -1963337, -1992865, 235149, 2610266, 2278480, -344134, -76236, -3288334, -1574642, -365072, -649077, -534187, 2587718, 48318, -102005, -2480344, 2241436, 464930, -750546, --666257, -1445793, -519154, -1609002, 2057289, -497679, 820876, -595927, 4031364, -6037114, --6407018, 7756174, -2333778, -1954747, 4625143, -6652905, -6808597, 7816304, 10678899, 63351, --566936, 3469260, -9043054, 15438797, -9475772, 1005022, 7518877, -3664681, 7018514, 8266739, -2836826, -8944269, 9570261, -1547262, 3637837, -7043747, -1227287, -13276281, 4585952, -7942469, -3072512, -13662291, 8000987, -10024454, -6847252, 5521181, 7896298, 2500745, 922344, 190589, --8451959, -8028368, -4992363, 20445654, 11341935, -3373697, -19026706, -2825552, 5402532, 10964515, --6242735, 769336, -13145284, -4663261, -1600412, 3295851, 1958505, -3089692, -214748, 5651640, --6502044, -489626, -7416335, 3917547, 4878546, 14093935, 6053220, -7037304, 2945274, -3974455, --10734734, -1483911, 6222334, 758062, 17712446, -10257993, -4939213, 2612414, -9221295, 4586488, -1480153, -1863479, 8996346, 2103997, 3973382, -53150, 326418, -1525250, 4446365, 6503654, -1597191, -2032593, 4856535, -2656437, 1522566, -4696010, -1532230, -133144, -6023692, -228707, --2348273, -1192927, -2345052, -4031364, -1814624, 1213865, 1512365, 922881, -1279363, -321049, -2647847, -4529043, 445603, 248571, -13652627, -1912334, 2703145, 8094403, 3820910, 10543071, -1827509, -12417824, 7882876, -10491531, -11398306, 402653, -1103270, 8704825, 10638634, 9942312, -14297946, 3604551, -14897631, 16325708, 8807904, -6465537, 12423193, -1519345, 1459752, -10858214, --3852586, -3061238, -4917201, 10569378, -17648020, -3877282, -8320963, -7756174, 1398549, 8582418, --4067871, -10048076, -10819559, -13918915, -14227079, -7097971, -2459943, 6222871, -11176042, -14321032, --8572755, -3527242, -7124814, -4625143, 12528956, -6958384, 1141924, 6781754, -11443940, -6665789, --7723962, 12492986, -5318780, 8176544, 17703856, -1611150, 3946538, 1846836, -5469104, -7013682, --4904853, 8494908, -1279900, 9710384, 547608, 7359964, 1659468, -12067784, 15064061, -6393596, --1952600, -12825846, 7915625, 17095044, 2842732, -2206003, 4482335, 2085744, -10893111, -4951561, -619549, -2450279, -1191853, -4562866, -4605279, -635655, 788663, 799401, 7872138, -792421, -983548, -3789235, 2980707, 445066, 5914707, 2697240, 2660732, 1243393, -728534, -2432562, --2168422, -3425773, -786516, -2550137, 1766305, 1032403, -71941, -1740536, -1587527, -1243930, --552977, 738198, -645319, 3370476, 25282324, 15727096, 11671574, -8471823, -17974438, -5019206, -11152956, -17281874, -9213779, 197569, 13600014, 9520332, 7955890, -10071161, 7626788, -2812130, -7624104, -2101850, 19604378, 11537356, -833761, -18051210, -1716376, 13438416, 11680700, 340913, -23737210, 10537702, -4615479, -151398, 1759863, -2935073, -6463389, -9235790, -1300301, -25673168, -7362648, -8902393, 1342714, -1044751, 6796249, 9351754, 368830, 2381023, -11264089, 7970386, --4011500, 16755204, 515396, 2265059, -41052372, -1920924, 11115375, 5521181, 11814381, -4159676, --11403138, 6253473, 2363843, -9599789, 9120363, 1668595, -8927090, -22549, 515933, 3002182, --3199751, -15233175, -14976014, -779537, -5305895, 4903779, 5452461, 2078764, 5794985, -18621368, --6200322, 787053, 4221953, 4291746, -7221988, 5631776, 1481764, -2809982, 2080375, 5061619, --3347927, 532039, -993211, 1991254, -3407520, -5706401, -1737851, 6405407, -4844723, 523986, --3586835, 2457258, -1406602, 2153389, 3925600, -639413, -3640522, 2904472, -505196, -4599373, --2681133, 1398549, 2175938, 53150, -1647120, 686658, -222801, 2528662, -1147830, 5081483, --1665374, -538482, 3202435, -17410186, -27923730, 4475893, 9709847, 10018548, 267899, 23198728, --16496433, 5413270, 3208878, -4748087, -14641544, -6215892, -8315594, 9817221, -4298726, -9072582, --14903537, -1417876, -5492190, -2891050, -11235634, 5965710, -681826, -5310190, 6089190, 7681549, -9162239, -11905112, 21698174, 1277216, -3093987, -13353590, -12492986, -2585570, -1622424, -13026636, --13515188, -10430328, 8749385, -6059125, 14495515, 4594005, 24174224, 8247411, 9187472, -3142842, -12969191, -2296734, 3132105, 18312666, -5581310, 6616397, -22059488, -28147068, 6137509, -1372242, --17830556, 1068910, 447750, -24299852, 6832219, -7189776, -4794257, -9517648, 9156870, -8895951, -506806, -1022202, 4414153, -20938, -13276281, 7747048, -1914482, 3058017, -16746077, -23159538, --20579336, 1099512, -4881231, -23448910, -4928475, 22442278, 11849278, 5172215, 4286914, -10436234, -343061, -2428804, 1005022, -3464965, -2770254, -163209, -256087, 854162, -33286, -7298223, --1746978, 1873143, -1363652, 3456912, 5733782, 4765266, -52613, -845572, -2493766, 7578470, -4387309, 4975720, 4177930, 3035468, -565862, -2937758, -2609730, 5907191, -4598836, 3510599, -4999342, 1920924, 2466385, 374199, 1478006, -4044249, 366683, -1187559, -3440806, 1631014, -2306934, 4565550, 16954920, 22275848, -664109, 5987722, 13997298, 11592654, -1199370, -28173912, -19332184, -1810866, 5254893, -5661304, 9911174, -591632, -12235825, 3556770, 22236120, 3523484, --14595373, 12987444, 9197672, 6150930, -10970420, 11971148, 8785892, 1185411, 14148696, -5487358, -3799972, 22925998, 16614007, 833761, 5272073, 11353746, -21469468, -4157528, -1348083, -3177739, --18802830, 5016522, 5722507, 1285806, -14569066, -20401, -24960740, 1550483, -17824114, -3313567, -9241159, -7399155, -10769630, -8466454, 5352603, 4600447, -9926206, 4194036, -3548717, 12570296, --6358699, -6993281, 6484864, 11772505, -1047972, 5276904, 4517769, -27034672, -559956, -1746441, --13843753, 1713692, 17850958, 5691369, -4905390, -1914482, 13074417, 9396852, 5768141, -3383361, -20702816, 499827, -17004312, 2594160, 20728050, 10997801, 10588705, 6499896, 1256278, -4773856, --5698348, 4041027, 3495030, 5224828, 7887708, -1585917, 6266358, 4062502, 767725, -705448, --462246, 3091303, -2614025, -716186, -2584497, 301721, -1119913, 3394098, -6025302, 1449552, -2318209, 1059783, 4950487, -8005819, -3296924, 1830730, 1828046, -425739, 5081483, -1362042, --1382443, -1896228, 796716, 3571265, 3929358, -4221953, 946503, 2631741, -4025995, -2244657, --2097555, -1680943, 11267847, -25412784, 11030550, -26303990, -30310658, -20287814, 1703491, -17374754, -16908212, -5622112, -20253992, -1145683, -4853850, 2354716, 4245039, -5269925, -2272575, 13167833, --3675955, 4739497, -7036230, -7853885, 22064320, -7763691, -2105071, -1117765, 5322002, 12891344, --26838176, -2314987, 14957224, 13597330, 13573707, 1262720, -4555887, 27522150, 9873056, 8339216, -11309186, 4485020, -3575024, -297427, 16866336, 4836670, -11286637, 5668820, 30741228, -16541530, -21358336, 7189776, -31695248, 7252589, 21902186, -2848637, 10053982, -632434, -23936926, 11768747, -30623116, 1195612, 20941186, -12979391, 18567680, 14542759, -127238, -3244311, 17070348, 8331163, --21617108, 21448530, -5076115, -5542656, 13688061, -6985765, -7550016, -10335302, 3779034, 607738, -4010963, -1459215, -4103305, 15966541, -14405320, 2000381, -2711198, -5366025, -11715597, -11988327, -7076496, -1423782, -7095823, -10762651, -8243116, -15100031, -10008348, -1138166, -6833830, -4848481, --750009, -8110509, 3482682, -7212324, -6543920, -2431488, 1986959, 1834488, -3148748, -1017370, --10428717, 3679713, -10957535, 7992398, -2598992, -1316408, -4652524, -3291556, -278636, 12253005, -6714645, -1935957, 3329674, 8233453, 5071283, -5475547, -2049773, 2844342, -4154307, 6588480, -1864553, -3426847, 2698313, -10006737, -17003238, 41217192, 20802138, -48654464, -19670950, 4861366, --7747584, 13703093, 16727287, 17382806, 20470352, -12683038, 38538740, -6033356, 1239098, -12800613, -14693620, 18941342, -13575318, -16071768, -3049427, -9373229, 1975148, 7388418, 1458678, -10220948, --3482145, 15481746, -979789, 7685844, 2200097, 18685256, 28699508, 10503879, -13386876, -32298690, --2406256, -5714991, 3886409, -7690676, 10846403, 17468706, 1888712, -6860137, -14345191, 34725884, -30898532, -4344360, 15234786, -8615168, -10900627, -34005940, 18927920, -16019691, -3338800, -1293322, --10251550, 5622112, 21002390, 2881386, -8849780, 9543954, -3939022, -14208826, 21470542, 4012573, --29061360, 37322192, -25188372, -13939853, 14836965, 14637785, 12803298, -78920, -31059056, -2990908, -3047279, -2115272, -10007811, 5778879, -5092758, 1925219, 4187593, -13310641, 15331423, 10177999, -5334887, 1722282, -5874979, -4869419, -10201, 5006322, 757525, 3791919, -2165737, -10383620, -3342558, -15080704, -4393215, 4395362, -4076998, 7776575, -6558952, -1320166, -5529771, 6131066, -851477, 7610145, 9497246, 6018860, 555661, -7289633, 5350993, 8251706, -1408212, -1319092, --8892193, -4369056, 10944114, -3964255, 7484518, -948651, -3720516, 3452617, 3864397, -547608, --5759015, 10679973, -5542119, -13366475, 1504312, 19072340, 5675263, -25914758, -20758650, -4989679, -32416266, 3370476, -15547245, -41812580, -11614128, -1916092, 9936407, 28748364, 22050362, -3095598, -284542, 18905372, 15411416, 697932, 4233227, -56419764, -35550520, -17348446, -27857158, 2401424, --15535434, 24936044, -5705327, -1978906, -114354, -10073846, -11469710, 18061412, 11275900, 6377490, --2550674, -8635569, -7707319, 8984535, -20205674, -7597797, 3579855, -7032472, -9838696, 8404177, --29209536, -40903120, 9725953, 12746926, 15868294, -23896662, -12690018, 13191992, 5020817, -39875552, --34997540, 2100239, -16936666, -17548162, 6518687, -32220308, 16338056, -12480101, 13427142, 12856985, --7986492, -18171470, -41929620, -14725832, -12597676, 23509578, -20344186, -13294534, 7175280, 24033564, -14024142, 108448, -8191040, -2719788, 7197292, -7240241, 24312736, -15090904, -11811160, -5731097, --2115272, 6662031, -17913772, 10526965, 8084739, -7525320, -12544526, 2896956, -729071, 12192338, --15666967, -20451024, -5185100, 3216394, -11305428, -1717987, -13670881, 577136, 3333432, -6163278, -9536438, -2580202, -6759742, 2953864, -4569309, 2776160, -3892314, -14204531, -623844, 1041530, -13558138, 10634876, -6523519, 53687, -727997, -8008504, -10253161, 4986994, -2601677, -3724811, -3103114, 16624745, 22834730, -3651259, -30718142, 13916768, -4612795, -12814035, -26491896, 7903814, -11315628, -39276404, 14817637, 13955959, 35404488, 3199751, -8900246, 2187749, -43376484, -12600897, --5299990, 551903, 7895761, -14835354, 26524644, 10618770, 32790464, -6622303, 28829968, 18517752, -11355357, 26294864, 13257490, 17335562, 22290880, 933082, -29382408, -27690192, 5531381, 31586800, -22746146, -42223288, -1335735, -7208566, -6058052, -4498442, -29348048, 7403987, -20952998, 18644990, --14072997, 42170672, -11275900, -60719028, -6614787, -20990578, 11882027, 8899709, 17089138, 39237748, -8604430, -5457293, 21349208, -12835510, 43761960, 7278896, 29204704, 13702556, 2465311, -11276437, --10308995, 72018552, 198642, -49946712, -10253698, 39663488, -24038396, 5073430, -11231339, 17323750, -36287104, 20947092, -42446624, -2883534, -41799696, 5604933, -6017249, -24749212, -3201898, -6818261, --11198053, -237834, -21582748, -23523000, 7750269, 8637179, -1496259, -26312580, 18530100, -23338852, --36207112, -15461345, 8559333, -9084930, -16354699, -20769388, 3390877, 8495982, -19064822, -14460081, -6505265, -8469139, -15483894, 12094091, 9384504, -1104880, -2333778, 487479, -3904662, -6382322, --7037841, 2171643, -14389214, 7929047, -5467494, 2865280, -18192944, 19422378, 9040906, -41660644, --15025406, -47251620, 7572564, 40818296, -29967598, -28954522, 27698244, 12372727, -46229956, -44668196, -14611479, 1893544, 6923488, 14606110, -1412507, -13726179, -6322192, 27808302, -19804094, 34442416, -6113886, -8623221, 7885023, 19706384, 357019, -6489696, -36916856, -16843252, 4572530, -20467666, -17692580, 25334402, 2287070, 3812857, -26293252, 31405338, -10765872, -14702747, 26409218, -10444287, -476205, -19098108, -1472100, -13564044, -45504640, 15302968, -4725001, 33676300, 44203268, -1103807, --7399692, -28215788, -8357470, -8189429, 42079944, -40075268, -27549530, -66123168, 1950452, -27648852, -7948374, 22312356, -11874511, -3895535, 45197016, 28418188, 20832738, 3057480, 2452426, 33520072, --36456220, -2080375, 10870025, -4831302, 20738786, 9280351, 86831888, 13186623, -23216982, -1809255, --15786689, -43084964, -16494822, 1098975, 7624104, -8694624, -8449274, -8556112, -30056182, -876710, --2126546, -16656957, 4687957, 10354092, -25720412, 1211181, -17332340, 6434935, -839129, -6650220, --3144990, 1010391, 15741592, 8468065, 1052804, 16522739, -10102300, -2717641, -4618701, 15515032, -11083163, 7110319, 16836272, 7151658, -11406896, -6167573, -1574642, 7642895, -14447196, -4340602, -826781, -17224966, 18562312, -5073967, 2954401, 40034464, -29463476, 10241886, -10197326, -14207215, --14024142, 60440928, -8245264, 29679834, -24107114, 41226316, -14467060, 611496, 22020834, 23795192, -56642028, 2697776, 9082245, 8321499, -24367496, 29311004, 8851928, -17289928, 28347858, -12002823, -35755604, 27462020, -8793409, 23878944, 820876, 22282828, 4196183, 37831684, -23467702, 18833432, --38643432, -9677098, 12528420, 40991168, -2152852, 3228742, 17333952, -230318, -14224395, -49555868, --30961346, 8349417, -21636972, -1050656, 15206332, -43218108, 25942676, -2017024, 30919470, -15059229, --29786672, -5259188, 80583248, 18252000, -74228312, 12829067, 18278308, 4425964, 79734992, -5027259, --59636696, 61138860, -21225192, -4155381, 66600448, -7428146, 43605192, 6898255, -40498320, 1466731, -68055904, -56271052, 28806346, -34587372, -39347268, 28446642, 16645146, -35699232, -13634911, -22287122, --12612708, -13157095, 5728950, -21995602, -5151277, 8342437, -22958748, -16289737, 10843182, -26426934, --7087233, 8874476, 2869575, -6365679, 18816788, -8835821, -7406671, -9836549, -18511310, 8218420, --12237972, -13571560, -3942243, 1875827, 25272124, -310848, 6526203, -22009024, 1326608, 27231166, --6080063, -3763465, -3121904, 870268, 979789, 18826990, -11206107, -12412992, -6934225, -19026706, --22984518, 5276368, -11991549, -9779104, 12961138, 3848291, 8131984, -3820910, -58302032, -5498632, -10304700, -23152022, -5318780, -63218160, 40555764, 59536836, -25441238, 7604777, -44894756, -135379520, --24564528, 5269925, 69392712, 56319368, -54955180, -50978040, -49257368, -42382736, -28075128, 34586296, --4995584, 77374376, 54227184, -16764868, -63642824, -163069712, -103739032, 6325413, 181086016, 135910480, -26263188, -71600864, -175885888, -182378800, -12018392, 104603928, 164545568, 178100480, 19654844, -58943596, --72132904, -98258648, -86379848, 4852240, 61733176, 111725520, 78820704, 61002496, -79630304, -100080792, --115169552, -141153568, 16868484, 166899744, 166695200, 32629940, -58611272, -158563744, -205415408, -70887360, -17037598, 75745504, 189576640, 68350648, 631360, -105001752, -83983256, -36880348, 43899936, 72644000, -130430104, 32771138, 68586872, -6544457, -85787680, -72896336, 5005785, 82432768, 92081952, -42650100, --78362752, -98303752, -23482196, 14754823, 23898808, 13685913, -47706888, -43186968, -16593069, 29883308, -772557, -683437, 7695508, 23654532, 20822002, 14307610, -7809325, -60369524, -38610684, 3206730, -31199716, 55274080, 28061706, -17208860, -36811628, -50813760, -30370250, -21180094, -25311852, 55392732, -59875064, 63684700, 54601384, -26386132, -103004056, -89175336, -46748572, 38631620, 131573640, 125579472, -7672422, -81559280, -124838056, -114272440, -6840273, 61240864, 59483688, 27192512, 26386132, 29528, --33195266, -41850700, -50584516, -9192304, 48083232, 56997436, 41795400, 3748970, -38836704, -36971080, --16478179, 29433410, 21726628, -50476604, 53150, 26752278, -21569862, 29518774, -1673964, -4786204, --2572149, 6376953, 21554294, -8125542, 25490094, 18197776, 10101226, 12293270, 8449274, -1706713, --15333033, 24830816, -788127, 15366856, -9293235, 13746580, -4989679, -1336809, 8522289, -11455215, --13110388, 2426657, -5883032, 20226074, 19002010, -17238924, 8465917, -10035191, 11803644, 831613, -7612293, 3630858, 10008348, -12098386, 8391829, -14008036, -6725382, -1437203, -2035815, 12376485, --22644678, -3803194, -9566503, -19219978, -2127620, -7189239, 4371740, 19479288, -6033892, -25567940, -3853123, 16851842, 31343060, -777389, 2445447, -16469052, -13325136, 15377057, 1002338, -4974109, -111132, 26499948, 11122892, 8795019, 13647795, 24476482, -27343910, 11422466, -4932770, -39674224, --5012764, 31838056, -6094022, 28401544, -1547799, 17888002, -20703890, 13269838, -14176076, -3462818, -27037356, -7192460, 2229625, 1242319, -405874, 10664941, -324807, -3416110, -2604361, -74088, --2208687, 5688148, 7566659, 12141336, 1027034, -9107478, -4684736, -11973832, 4501663, -12435541, -6833830, 6106907, -4317516, 8060580, 2086280, -12907987, -37581, 697395, 4089883, -22665616, -7916162, 5912023, 1790465, 91805, -6710350, 8387535, -12076374, 12667469, -1179505, -695785, -2963528, -4962298, 9835475, -10552198, 2920578, -5477694, 6081137, -19013284, 47965120, 81512576, -7423314, -53997404, 18413598, -4435091, 66858684, 30808338, 65733400, -6538551, -30572114, -8833137, -14940044, 27050778, 21933324, -12487617, 2577517, 11267847, 8936216, 25543782, -17642652, 3993246, --23955180, -4334696, 843424, 5908265, 13242458, 2425046, -9917079, 19487340, -1316408, -17914846, -24466282, -4457639, -8039105, 5997922, -3028489, 18283676, 30275762, 376347, 8311836, -10353556, --5693516, 16856672, 13014288, 13903346, 3386582, -9373766, -18132278, -19531364, -20288888, 16362752, -18923626, 17654464, 27404576, 28407450, 13015362, 1199370, -24495810, 15067819, -2088965, -23088670, -28744068, -2372970, 19117974, 9395778, -27579596, 7504382, -7751879, 5735392, 19703700, 3275986, --22933514, -17028472, -13259101, -24988656, 15696495, -1793686, 26620208, -539555, 4895726, 250719, --13364864, -9296994, 5596343, -21458730, 7079717, -475668, -3439195, 7389491, -11097122, 6922414, -5346161, -1197222, -9279277, 12840878, -2605972, 11367168, -18888192, -14666240, -7808788, -7823283, -9973988, -4125853, -1699196, -2716567, -9074729, -5544803, -5288179, -194884, 18903224, 2217814, --3863860, -496069, -9805947, 7501161, -5111011, -1227287, -3250753, 8437463, 36507, 959925, --1038845, -6425808, -3441880, 9241159, -2515777, 6572911, -1159104, 3429532, -5109938, -28552942, --65011308, 4744328, 89210768, 118767656, 101303248, 70457328, -3311420, 4706748, -52125332, -61282740, --103879688, -77898360, -83468928, -26594438, 6691022, 27429272, 45172320, 113286208, 93643168, 63633700, -20170778, -9615358, -41155988, -30057792, -42777876, -53644680, -30360050, -30530776, -38336880, -17348446, --25334402, 5649493, 17346836, 15196668, 47790636, 44765908, 39090644, 26130044, 29532196, 19139448, -35432408, 8970039, 30615064, 1728188, -8398272, -53625352, -23795192, -64705828, -75954888, -84239344, --66636956, -49464600, -17974438, 13127031, 48308180, 52161840, 40531608, 84412216, 67822904, 73169064, -67132488, 63282584, 24959128, 41055592, -16630650, -40123048, -42747808, -99572912, -100165080, -96122440, --102972912, -84306448, -29242822, -13888314, 22510460, 57677652, 62144956, 76663016, 91600912, 82349552, -63603096, 58426588, 42465416, 16350940, -1871532, -34019364, -50906636, -50676856, -58525908, -48484812, --55070072, -56734908, -48487496, -37178848, -19087372, 2595771, 24607478, 48290464, 44605920, 44634912, -51929376, 58048092, 44393856, 45098768, 19713364, -20613158, -15583752, -36516348, -47173236, -38810400, --32452772, -22283900, -28722594, -20259898, 2254321, 6353331, 9755481, 25691420, 22063246, 14522358, -3287798, 9918690, 9507447, 3262028, 12091407, -7295539, -8662949, -6455336, 4447439, -1017370, -48855, -303332, -1787243, -8840653, -6584722, -2343979, 8702141, 304943, 3943317, 1676648, --4942434, -5567888, -3158949, -3806415, 1180579, 121333, 1454383, 1299228, 2029909, -1902134, -2105608, -1127966, 479426, 1888712, 5562520, 2669322, 6485938, 1168231, -132070, -1556389, --1404454, -4114579, -375810, -2189360, -1153199, -3153580, -266825, -1472100, 671089, -2884071, --455803, -5906, 2117419, -1343788, -422517, -2056753, 1153736, 119185, 2778307, 2760053, -3805878, 1225139, 2491081, -123480, 122943, -1189706, 1217623, -846109, 855235, -763967, -435402, -2466922, -1672353, -4452808, -2128693, -2601677, -443455, -1707786, 783832, -439697, -1525250, 427349, 3149822, 1668595, 3381750, 1658931, 3090766, 1318555, 2245731, -209380, -202937, -2684355, -1382980, -3191161, -1843615, -3696893, -1268626, -2251100, 301721, -311385, -1885491, 256624, 2110440, 423054, 1921461, 91805, 1635309, -373662, 1122060, -771484, -727997, -1044751, 649614, -1047972, 668404, -1016297, 721555, -921271, 821949, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +521302, -665720, -413927, -800475, -5559299, -5552856, 5318244, 1334661, -3243237, -4842039, +-2394444, -3647501, -6410239, 8199093, 948114, 3001645, 4025995, 11791296, -338229, 1925756, +-2865280, -992674, -2211908, -7601019, 1672353, -2288681, 720481, 5372467, -2135673, -469225, +1123671, 617402, -1298154, 303869, -7103876, 1522566, -202937, -2481417, 2179159, 1071058, +-4791573, 7568269, 231928, 1137093, 6958384, -2655901, -3049964, -6833830, -3522410, 4817880, +268972, 5132486, -2515240, -5578089, 2423435, -5194763, -2379412, -10081899, 4141959, 3608310, +2134599, 3112778, 6931541, 1864553, -3082176, 3815005, 5753109, -3721589, 2835752, 38655, +-1245541, -1901597, -1582159, 3954591, -812823, 4382478, -2209224, 1795296, -1372242, 1629940, +3126736, -1649268, 1125281, -1120450, 2523293, 2126546, 1722819, -817118, 583042, 127238, +-1439351, 767189, 2466922, 498753, 824097, -1411434, 958315, -743566, 560493, -1068910, +229244, 1486059, -4308926, 1196148, -2683281, -5359046, -571231, -6338298, -7784092, -4845797, +-3750043, -8494372, 303332, -3037616, -1758252, 2675228, 9059697, 881005, -2200634, -994822, +1424855, -128312, 3741990, 6509023, -583042, 7303055, -871342, -422517, -904091, 4183298, +-5494874, 903554, 627602, -1286880, -345208, -3206193, -5458904, 7509751, -2568927, -498753, +-1360431, 3345780, -3577171, -2995203, 1268626, 1163936, 5178120, -3513283, 4260071, -2447058, +-4322348, -278636, -1801202, 1226213, 2310693, -32212, 3007551, 1504849, 2186138, -2811593, +-3401077, -5532992, -4135517, 588411, 6659884, 907849, 5405753, 1473711, -2814277, 3797288, +1752884, -3965329, 7052873, 1246077, -6675990, 1803349, 3001645, 666794, 1989644, 1801202, +-4731444, 1790465, 1639067, 1234266, -282931, 3544422, 1157494, -816044, -1148904, 48855, +1380295, 34360, 1878511, 15569, 85362, 1163936, -456340, -958851, -670015, 265214, +-923955, -906238, 1212791, -36507, 1165547, 1103807, -282931, -20401, -7878581, -7091528, +1539746, 744640, 5942624, -4615479, 6111739, -3147137, -1331440, -9605694, -591095, 558883, +-3256122, -649077, 5135171, 4744865, 7263327, -1855963, -1093069, 4433480, 2135136, 3970697, +-9824201, 9646497, -2091649, -234076, 1551020, -1292248, -71941, -976568, -669478, 5938866, +-174483, 7828652, -1364726, -3360812, -6602439, 658204, -2991445, -2733747, 4560719, 3411815, +4767414, 41876, 585726, -7150047, -5076652, -196495, 6395207, 2092186, -832150, 2019708, +-2676838, 6694244, -374199, -6013491, -7485055, -2795487, 8367133, 6203007, 6459094, 2879776, +233002, -7136625, -3143916, -1116155, -4111894, 4196183, -747861, -2088428, 3685619, -10110890, +2980171, -1403381, 2363843, -890669, -2865817, 4427575, 1713155, -4847945, -5037997, 2449742, +-1313723, 2874407, 804233, -2251637, 1548873, 1792612, -85899, 629750, 2147, 119185, +-841277, -111669, -1387274, -81604, -1208496, 1886564, 1086090, -1602560, 758599, -482110, +528281, 435402, 694174, -1217623, -972273, 258772, 738734, -2157684, -1165547, 1946157, +-2203318, -4399121, -665183, -3418794, 1593433, 5398774, 2188823, 141734, -2167885, -12720083, +-8297340, -323733, 3722663, 4387309, 310848, 846645, -1732482, 4350265, 2005213, 3476239, +-5466420, 5188321, 3063922, -6002217, 2288681, 5412733, -242129, 1717987, 947577, 4904316, +-3789772, 2892661, -442919, -713501, -4675609, 244276, 5129265, -3277597, -2280628, -4479651, +6011344, -624918, 1220845, -4708895, -13237626, -3920768, 2018098, 1184874, 4979478, -3580929, +-2120103, -2058900, -822486, -4316442, 200790, -3900367, 8784282, 3026878, 7178501, -7239704, +-1349157, -3025805, 6732898, -2066953, -1157494, -5583458, 3513820, -151934, -3635153, 5636071, +1831267, 656593, 6580964, 1357210, -5629629, -832687, 766652, -1585917, -1848983, 8053, +-4767414, 9580461, 4041027, 1364726, 6071473, 2568391, 2448668, 4371203, -1179505, 3694746, +-2053531, 611496, 468151, 193810, -1028108, 644245, 373662, -381715, -564788, -650151, +548682, -518617, 130997, 3162707, 423591, -118648, 36507, -66572, -339302, 2506650, +746787, 1619740, 202400, -1641751, -310848, 3579855, -2858301, 2288681, 173409, -1411434, +5974837, 4620311, -499827, -8154533, -10976863, -8409546, 3098282, 52613, -4758287, -1184874, +523986, -1027034, 12284143, 2176475, -8924405, -2314451, -2685428, 500364, -4212289, 7018514, +-5228049, -6767258, 6354404, -2624225, 1730872, 1750736, -2935073, -7973070, 1053341, -4220342, +-3797288, -3872450, -505196, 6315213, -877247, -1353989, 9228811, 1760400, 1404991, -11857331, +-1339493, 6425271, 7436736, -4050154, 2013803, 1086627, -11769821, -1505386, -724776, -1129040, +2961380, 204011, -6600828, 932008, -5277441, 5133023, -1794760, 6587406, 1301375, -7400229, +3315178, 14103062, -5444945, 198642, -10450729, 2609193, 8799314, -15686294, 2255932, -1044214, +-1358820, 3995930, -2536715, -4037806, 7405598, 7151121, -6104223, -663572, 4642860, -1982127, +1105417, 2262911, 1384590, 528818, -1770063, 4025995, -88047, 2660732, 126165, 3607773, +2419140, 2307471, -166430, 844498, 3946001, 508417, -784905, 1464584, 1245541, 552977, +3286724, -1721745, 1063541, 609349, -697932, 325881, 1206349, 909459, 426812, -219580, +175020, 10685879, 1173600, 4871030, 7336341, -9069897, -2962454, -6885907, 3404299, 4227322, +7983808, 15858093, 2343442, -11829951, -1248225, -2859911, -1369558, -5027259, -105764, -424128, +5815923, 4884989, 1599339, -265214, 118112, -1684164, -1489280, 6967511, -2335925, -746787, +4970351, -472446, 2882997, -339302, 6360847, -4771709, -9895605, 12343199, -826244, 3063922, +-9266392, 850940, -2892124, 13682155, 2024003, 6293201, -1380832, 5602785, 3547643, -12038256, +-2025614, -6677064, -5997922, 1011465, 8517994, 1270774, -1824824, 13562433, -1509144, -7362111, +-5860483, -3757560, 6473590, 20400558, -129386, 5806259, 1363652, -6236293, -1498407, 315680, +5912023, 9390409, 763967, 7590818, 6506339, -11884711, 323196, -1947231, -383863, 6278169, +-2779918, 1793686, 2790118, -710817, -6282464, -4088809, -9142912, 2397129, 3549791, -228170, +1330903, 1566589, 1038845, 123480, -2879776, 833224, 1276142, 79457, 1178969, -1230508, +2359548, 35970, 1159104, -420907, -489089, -917512, 254477, -374199, 374736, 2254321, +3160559, 2913062, 354335, 956167, 1920387, 1358283, 17717, 1379758, 352187, -32749, +2383170, -3445638, -15752866, 3684545, -1730872, 5498632, 3274376, 14665166, 2765422, -2606508, +3321620, 11252814, 12138651, 5217312, 8500814, 8998493, -7036230, -5203890, -11300596, -11898133, +1148367, 5322538, -10348187, -7109245, -724239, -11645267, -9933186, 5077188, 1410360, -5105643, +-3659849, -7600482, 6236830, 4807679, 10368051, 20169704, -2405182, -5566815, -2323577, -9764608, +-301185, -7584376, -8705362, 10387378, 985158, 1525250, -13389561, 13743358, 2520072, -8382166, +-2918430, 7124814, 279710, 1626182, -424128, 1245541, 3795677, -6400038, 7434052, 270583, +-5552319, -1395864, -9375377, 1526861, -9621800, -8265128, 7027104, 7558069, -7696045, -11815455, +2829847, -5650567, -1064078, -3084324, 3799972, -3321084, 5079336, 1780801, 6191732, -1364189, +4570382, 2549600, -10901701, -3655554, 2415919, 1488743, -23085, -5203353, -3199214, -1499481, +3315715, -1963337, -1992865, 235149, 2610266, 2278480, -344134, -76236, -3288334, -1574642, +365072, -649077, -534187, 2587718, 48318, -102005, -2480344, 2241436, 464930, -750546, +-666257, -1445793, -519154, -1609002, 2057289, -497679, 820876, -595927, 4031364, -6037114, +-6407018, 7756174, -2333778, -1954747, 4625143, -6652905, -6808597, 7816304, 10678899, 63351, +-566936, 3469260, -9043054, 15438797, -9475772, 1005022, 7518877, -3664681, 7018514, 8266739, +2836826, -8944269, 9570261, -1547262, 3637837, -7043747, -1227287, -13276281, 4585952, -7942469, +3072512, -13662291, 8000987, -10024454, -6847252, 5521181, 7896298, 2500745, 922344, 190589, +-8451959, -8028368, -4992363, 20445654, 11341935, -3373697, -19026706, -2825552, 5402532, 10964515, +-6242735, 769336, -13145284, -4663261, -1600412, 3295851, 1958505, -3089692, -214748, 5651640, +-6502044, -489626, -7416335, 3917547, 4878546, 14093935, 6053220, -7037304, 2945274, -3974455, +-10734734, -1483911, 6222334, 758062, 17712446, -10257993, -4939213, 2612414, -9221295, 4586488, +1480153, -1863479, 8996346, 2103997, 3973382, -53150, 326418, -1525250, 4446365, 6503654, +1597191, -2032593, 4856535, -2656437, 1522566, -4696010, -1532230, -133144, -6023692, -228707, +-2348273, -1192927, -2345052, -4031364, -1814624, 1213865, 1512365, 922881, -1279363, -321049, +2647847, -4529043, 445603, 248571, -13652627, -1912334, 2703145, 8094403, 3820910, 10543071, +1827509, -12417824, 7882876, -10491531, -11398306, 402653, -1103270, 8704825, 10638634, 9942312, +14297946, 3604551, -14897631, 16325708, 8807904, -6465537, 12423193, -1519345, 1459752, -10858214, +-3852586, -3061238, -4917201, 10569378, -17648020, -3877282, -8320963, -7756174, 1398549, 8582418, +-4067871, -10048076, -10819559, -13918915, -14227079, -7097971, -2459943, 6222871, -11176042, -14321032, +-8572755, -3527242, -7124814, -4625143, 12528956, -6958384, 1141924, 6781754, -11443940, -6665789, +-7723962, 12492986, -5318780, 8176544, 17703856, -1611150, 3946538, 1846836, -5469104, -7013682, +-4904853, 8494908, -1279900, 9710384, 547608, 7359964, 1659468, -12067784, 15064061, -6393596, +-1952600, -12825846, 7915625, 17095044, 2842732, -2206003, 4482335, 2085744, -10893111, -4951561, +619549, -2450279, -1191853, -4562866, -4605279, -635655, 788663, 799401, 7872138, -792421, +983548, -3789235, 2980707, 445066, 5914707, 2697240, 2660732, 1243393, -728534, -2432562, +-2168422, -3425773, -786516, -2550137, 1766305, 1032403, -71941, -1740536, -1587527, -1243930, +-552977, 738198, -645319, 3370476, 25282324, 15727096, 11671574, -8471823, -17974438, -5019206, +11152956, -17281874, -9213779, 197569, 13600014, 9520332, 7955890, -10071161, 7626788, -2812130, +7624104, -2101850, 19604378, 11537356, -833761, -18051210, -1716376, 13438416, 11680700, 340913, +23737210, 10537702, -4615479, -151398, 1759863, -2935073, -6463389, -9235790, -1300301, -25673168, +7362648, -8902393, 1342714, -1044751, 6796249, 9351754, 368830, 2381023, -11264089, 7970386, +-4011500, 16755204, 515396, 2265059, -41052372, -1920924, 11115375, 5521181, 11814381, -4159676, +-11403138, 6253473, 2363843, -9599789, 9120363, 1668595, -8927090, -22549, 515933, 3002182, +-3199751, -15233175, -14976014, -779537, -5305895, 4903779, 5452461, 2078764, 5794985, -18621368, +-6200322, 787053, 4221953, 4291746, -7221988, 5631776, 1481764, -2809982, 2080375, 5061619, +-3347927, 532039, -993211, 1991254, -3407520, -5706401, -1737851, 6405407, -4844723, 523986, +-3586835, 2457258, -1406602, 2153389, 3925600, -639413, -3640522, 2904472, -505196, -4599373, +-2681133, 1398549, 2175938, 53150, -1647120, 686658, -222801, 2528662, -1147830, 5081483, +-1665374, -538482, 3202435, -17410186, -27923730, 4475893, 9709847, 10018548, 267899, 23198728, +-16496433, 5413270, 3208878, -4748087, -14641544, -6215892, -8315594, 9817221, -4298726, -9072582, +-14903537, -1417876, -5492190, -2891050, -11235634, 5965710, -681826, -5310190, 6089190, 7681549, +9162239, -11905112, 21698174, 1277216, -3093987, -13353590, -12492986, -2585570, -1622424, -13026636, +-13515188, -10430328, 8749385, -6059125, 14495515, 4594005, 24174224, 8247411, 9187472, -3142842, +12969191, -2296734, 3132105, 18312666, -5581310, 6616397, -22059488, -28147068, 6137509, -1372242, +-17830556, 1068910, 447750, -24299852, 6832219, -7189776, -4794257, -9517648, 9156870, -8895951, +506806, -1022202, 4414153, -20938, -13276281, 7747048, -1914482, 3058017, -16746077, -23159538, +-20579336, 1099512, -4881231, -23448910, -4928475, 22442278, 11849278, 5172215, 4286914, -10436234, +343061, -2428804, 1005022, -3464965, -2770254, -163209, -256087, 854162, -33286, -7298223, +-1746978, 1873143, -1363652, 3456912, 5733782, 4765266, -52613, -845572, -2493766, 7578470, +4387309, 4975720, 4177930, 3035468, -565862, -2937758, -2609730, 5907191, -4598836, 3510599, +4999342, 1920924, 2466385, 374199, 1478006, -4044249, 366683, -1187559, -3440806, 1631014, +2306934, 4565550, 16954920, 22275848, -664109, 5987722, 13997298, 11592654, -1199370, -28173912, +19332184, -1810866, 5254893, -5661304, 9911174, -591632, -12235825, 3556770, 22236120, 3523484, +-14595373, 12987444, 9197672, 6150930, -10970420, 11971148, 8785892, 1185411, 14148696, -5487358, +3799972, 22925998, 16614007, 833761, 5272073, 11353746, -21469468, -4157528, -1348083, -3177739, +-18802830, 5016522, 5722507, 1285806, -14569066, -20401, -24960740, 1550483, -17824114, -3313567, +9241159, -7399155, -10769630, -8466454, 5352603, 4600447, -9926206, 4194036, -3548717, 12570296, +-6358699, -6993281, 6484864, 11772505, -1047972, 5276904, 4517769, -27034672, -559956, -1746441, +-13843753, 1713692, 17850958, 5691369, -4905390, -1914482, 13074417, 9396852, 5768141, -3383361, +20702816, 499827, -17004312, 2594160, 20728050, 10997801, 10588705, 6499896, 1256278, -4773856, +-5698348, 4041027, 3495030, 5224828, 7887708, -1585917, 6266358, 4062502, 767725, -705448, +-462246, 3091303, -2614025, -716186, -2584497, 301721, -1119913, 3394098, -6025302, 1449552, +2318209, 1059783, 4950487, -8005819, -3296924, 1830730, 1828046, -425739, 5081483, -1362042, +-1382443, -1896228, 796716, 3571265, 3929358, -4221953, 946503, 2631741, -4025995, -2244657, +-2097555, -1680943, 11267847, -25412784, 11030550, -26303990, -30310658, -20287814, 1703491, -17374754, +16908212, -5622112, -20253992, -1145683, -4853850, 2354716, 4245039, -5269925, -2272575, 13167833, +-3675955, 4739497, -7036230, -7853885, 22064320, -7763691, -2105071, -1117765, 5322002, 12891344, +-26838176, -2314987, 14957224, 13597330, 13573707, 1262720, -4555887, 27522150, 9873056, 8339216, +11309186, 4485020, -3575024, -297427, 16866336, 4836670, -11286637, 5668820, 30741228, -16541530, +21358336, 7189776, -31695248, 7252589, 21902186, -2848637, 10053982, -632434, -23936926, 11768747, +30623116, 1195612, 20941186, -12979391, 18567680, 14542759, -127238, -3244311, 17070348, 8331163, +-21617108, 21448530, -5076115, -5542656, 13688061, -6985765, -7550016, -10335302, 3779034, 607738, +4010963, -1459215, -4103305, 15966541, -14405320, 2000381, -2711198, -5366025, -11715597, -11988327, +7076496, -1423782, -7095823, -10762651, -8243116, -15100031, -10008348, -1138166, -6833830, -4848481, +-750009, -8110509, 3482682, -7212324, -6543920, -2431488, 1986959, 1834488, -3148748, -1017370, +-10428717, 3679713, -10957535, 7992398, -2598992, -1316408, -4652524, -3291556, -278636, 12253005, +6714645, -1935957, 3329674, 8233453, 5071283, -5475547, -2049773, 2844342, -4154307, 6588480, +1864553, -3426847, 2698313, -10006737, -17003238, 41217192, 20802138, -48654464, -19670950, 4861366, +-7747584, 13703093, 16727287, 17382806, 20470352, -12683038, 38538740, -6033356, 1239098, -12800613, +14693620, 18941342, -13575318, -16071768, -3049427, -9373229, 1975148, 7388418, 1458678, -10220948, +-3482145, 15481746, -979789, 7685844, 2200097, 18685256, 28699508, 10503879, -13386876, -32298690, +-2406256, -5714991, 3886409, -7690676, 10846403, 17468706, 1888712, -6860137, -14345191, 34725884, +30898532, -4344360, 15234786, -8615168, -10900627, -34005940, 18927920, -16019691, -3338800, -1293322, +-10251550, 5622112, 21002390, 2881386, -8849780, 9543954, -3939022, -14208826, 21470542, 4012573, +-29061360, 37322192, -25188372, -13939853, 14836965, 14637785, 12803298, -78920, -31059056, -2990908, +3047279, -2115272, -10007811, 5778879, -5092758, 1925219, 4187593, -13310641, 15331423, 10177999, +5334887, 1722282, -5874979, -4869419, -10201, 5006322, 757525, 3791919, -2165737, -10383620, +3342558, -15080704, -4393215, 4395362, -4076998, 7776575, -6558952, -1320166, -5529771, 6131066, +851477, 7610145, 9497246, 6018860, 555661, -7289633, 5350993, 8251706, -1408212, -1319092, +-8892193, -4369056, 10944114, -3964255, 7484518, -948651, -3720516, 3452617, 3864397, -547608, +-5759015, 10679973, -5542119, -13366475, 1504312, 19072340, 5675263, -25914758, -20758650, -4989679, +32416266, 3370476, -15547245, -41812580, -11614128, -1916092, 9936407, 28748364, 22050362, -3095598, +284542, 18905372, 15411416, 697932, 4233227, -56419764, -35550520, -17348446, -27857158, 2401424, +-15535434, 24936044, -5705327, -1978906, -114354, -10073846, -11469710, 18061412, 11275900, 6377490, +-2550674, -8635569, -7707319, 8984535, -20205674, -7597797, 3579855, -7032472, -9838696, 8404177, +-29209536, -40903120, 9725953, 12746926, 15868294, -23896662, -12690018, 13191992, 5020817, -39875552, +-34997540, 2100239, -16936666, -17548162, 6518687, -32220308, 16338056, -12480101, 13427142, 12856985, +-7986492, -18171470, -41929620, -14725832, -12597676, 23509578, -20344186, -13294534, 7175280, 24033564, +14024142, 108448, -8191040, -2719788, 7197292, -7240241, 24312736, -15090904, -11811160, -5731097, +-2115272, 6662031, -17913772, 10526965, 8084739, -7525320, -12544526, 2896956, -729071, 12192338, +-15666967, -20451024, -5185100, 3216394, -11305428, -1717987, -13670881, 577136, 3333432, -6163278, +9536438, -2580202, -6759742, 2953864, -4569309, 2776160, -3892314, -14204531, -623844, 1041530, +13558138, 10634876, -6523519, 53687, -727997, -8008504, -10253161, 4986994, -2601677, -3724811, +3103114, 16624745, 22834730, -3651259, -30718142, 13916768, -4612795, -12814035, -26491896, 7903814, +11315628, -39276404, 14817637, 13955959, 35404488, 3199751, -8900246, 2187749, -43376484, -12600897, +-5299990, 551903, 7895761, -14835354, 26524644, 10618770, 32790464, -6622303, 28829968, 18517752, +11355357, 26294864, 13257490, 17335562, 22290880, 933082, -29382408, -27690192, 5531381, 31586800, +22746146, -42223288, -1335735, -7208566, -6058052, -4498442, -29348048, 7403987, -20952998, 18644990, +-14072997, 42170672, -11275900, -60719028, -6614787, -20990578, 11882027, 8899709, 17089138, 39237748, +8604430, -5457293, 21349208, -12835510, 43761960, 7278896, 29204704, 13702556, 2465311, -11276437, +-10308995, 72018552, 198642, -49946712, -10253698, 39663488, -24038396, 5073430, -11231339, 17323750, +36287104, 20947092, -42446624, -2883534, -41799696, 5604933, -6017249, -24749212, -3201898, -6818261, +-11198053, -237834, -21582748, -23523000, 7750269, 8637179, -1496259, -26312580, 18530100, -23338852, +-36207112, -15461345, 8559333, -9084930, -16354699, -20769388, 3390877, 8495982, -19064822, -14460081, +6505265, -8469139, -15483894, 12094091, 9384504, -1104880, -2333778, 487479, -3904662, -6382322, +-7037841, 2171643, -14389214, 7929047, -5467494, 2865280, -18192944, 19422378, 9040906, -41660644, +-15025406, -47251620, 7572564, 40818296, -29967598, -28954522, 27698244, 12372727, -46229956, -44668196, +14611479, 1893544, 6923488, 14606110, -1412507, -13726179, -6322192, 27808302, -19804094, 34442416, +6113886, -8623221, 7885023, 19706384, 357019, -6489696, -36916856, -16843252, 4572530, -20467666, +17692580, 25334402, 2287070, 3812857, -26293252, 31405338, -10765872, -14702747, 26409218, -10444287, +476205, -19098108, -1472100, -13564044, -45504640, 15302968, -4725001, 33676300, 44203268, -1103807, +-7399692, -28215788, -8357470, -8189429, 42079944, -40075268, -27549530, -66123168, 1950452, -27648852, +7948374, 22312356, -11874511, -3895535, 45197016, 28418188, 20832738, 3057480, 2452426, 33520072, +-36456220, -2080375, 10870025, -4831302, 20738786, 9280351, 86831888, 13186623, -23216982, -1809255, +-15786689, -43084964, -16494822, 1098975, 7624104, -8694624, -8449274, -8556112, -30056182, -876710, +-2126546, -16656957, 4687957, 10354092, -25720412, 1211181, -17332340, 6434935, -839129, -6650220, +-3144990, 1010391, 15741592, 8468065, 1052804, 16522739, -10102300, -2717641, -4618701, 15515032, +11083163, 7110319, 16836272, 7151658, -11406896, -6167573, -1574642, 7642895, -14447196, -4340602, +826781, -17224966, 18562312, -5073967, 2954401, 40034464, -29463476, 10241886, -10197326, -14207215, +-14024142, 60440928, -8245264, 29679834, -24107114, 41226316, -14467060, 611496, 22020834, 23795192, +56642028, 2697776, 9082245, 8321499, -24367496, 29311004, 8851928, -17289928, 28347858, -12002823, +35755604, 27462020, -8793409, 23878944, 820876, 22282828, 4196183, 37831684, -23467702, 18833432, +-38643432, -9677098, 12528420, 40991168, -2152852, 3228742, 17333952, -230318, -14224395, -49555868, +-30961346, 8349417, -21636972, -1050656, 15206332, -43218108, 25942676, -2017024, 30919470, -15059229, +-29786672, -5259188, 80583248, 18252000, -74228312, 12829067, 18278308, 4425964, 79734992, -5027259, +-59636696, 61138860, -21225192, -4155381, 66600448, -7428146, 43605192, 6898255, -40498320, 1466731, +68055904, -56271052, 28806346, -34587372, -39347268, 28446642, 16645146, -35699232, -13634911, -22287122, +-12612708, -13157095, 5728950, -21995602, -5151277, 8342437, -22958748, -16289737, 10843182, -26426934, +-7087233, 8874476, 2869575, -6365679, 18816788, -8835821, -7406671, -9836549, -18511310, 8218420, +-12237972, -13571560, -3942243, 1875827, 25272124, -310848, 6526203, -22009024, 1326608, 27231166, +-6080063, -3763465, -3121904, 870268, 979789, 18826990, -11206107, -12412992, -6934225, -19026706, +-22984518, 5276368, -11991549, -9779104, 12961138, 3848291, 8131984, -3820910, -58302032, -5498632, +10304700, -23152022, -5318780, -63218160, 40555764, 59536836, -25441238, 7604777, -44894756, -135379520, +-24564528, 5269925, 69392712, 56319368, -54955180, -50978040, -49257368, -42382736, -28075128, 34586296, +-4995584, 77374376, 54227184, -16764868, -63642824, -163069712, -103739032, 6325413, 181086016, 135910480, +26263188, -71600864, -175885888, -182378800, -12018392, 104603928, 164545568, 178100480, 19654844, -58943596, +-72132904, -98258648, -86379848, 4852240, 61733176, 111725520, 78820704, 61002496, -79630304, -100080792, +-115169552, -141153568, 16868484, 166899744, 166695200, 32629940, -58611272, -158563744, -205415408, -70887360, +17037598, 75745504, 189576640, 68350648, 631360, -105001752, -83983256, -36880348, 43899936, 72644000, +130430104, 32771138, 68586872, -6544457, -85787680, -72896336, 5005785, 82432768, 92081952, -42650100, +-78362752, -98303752, -23482196, 14754823, 23898808, 13685913, -47706888, -43186968, -16593069, 29883308, +772557, -683437, 7695508, 23654532, 20822002, 14307610, -7809325, -60369524, -38610684, 3206730, +31199716, 55274080, 28061706, -17208860, -36811628, -50813760, -30370250, -21180094, -25311852, 55392732, +59875064, 63684700, 54601384, -26386132, -103004056, -89175336, -46748572, 38631620, 131573640, 125579472, +7672422, -81559280, -124838056, -114272440, -6840273, 61240864, 59483688, 27192512, 26386132, 29528, +-33195266, -41850700, -50584516, -9192304, 48083232, 56997436, 41795400, 3748970, -38836704, -36971080, +-16478179, 29433410, 21726628, -50476604, 53150, 26752278, -21569862, 29518774, -1673964, -4786204, +-2572149, 6376953, 21554294, -8125542, 25490094, 18197776, 10101226, 12293270, 8449274, -1706713, +-15333033, 24830816, -788127, 15366856, -9293235, 13746580, -4989679, -1336809, 8522289, -11455215, +-13110388, 2426657, -5883032, 20226074, 19002010, -17238924, 8465917, -10035191, 11803644, 831613, +7612293, 3630858, 10008348, -12098386, 8391829, -14008036, -6725382, -1437203, -2035815, 12376485, +-22644678, -3803194, -9566503, -19219978, -2127620, -7189239, 4371740, 19479288, -6033892, -25567940, +3853123, 16851842, 31343060, -777389, 2445447, -16469052, -13325136, 15377057, 1002338, -4974109, +111132, 26499948, 11122892, 8795019, 13647795, 24476482, -27343910, 11422466, -4932770, -39674224, +-5012764, 31838056, -6094022, 28401544, -1547799, 17888002, -20703890, 13269838, -14176076, -3462818, +27037356, -7192460, 2229625, 1242319, -405874, 10664941, -324807, -3416110, -2604361, -74088, +-2208687, 5688148, 7566659, 12141336, 1027034, -9107478, -4684736, -11973832, 4501663, -12435541, +6833830, 6106907, -4317516, 8060580, 2086280, -12907987, -37581, 697395, 4089883, -22665616, +7916162, 5912023, 1790465, 91805, -6710350, 8387535, -12076374, 12667469, -1179505, -695785, +2963528, -4962298, 9835475, -10552198, 2920578, -5477694, 6081137, -19013284, 47965120, 81512576, +7423314, -53997404, 18413598, -4435091, 66858684, 30808338, 65733400, -6538551, -30572114, -8833137, +14940044, 27050778, 21933324, -12487617, 2577517, 11267847, 8936216, 25543782, -17642652, 3993246, +-23955180, -4334696, 843424, 5908265, 13242458, 2425046, -9917079, 19487340, -1316408, -17914846, +24466282, -4457639, -8039105, 5997922, -3028489, 18283676, 30275762, 376347, 8311836, -10353556, +-5693516, 16856672, 13014288, 13903346, 3386582, -9373766, -18132278, -19531364, -20288888, 16362752, +18923626, 17654464, 27404576, 28407450, 13015362, 1199370, -24495810, 15067819, -2088965, -23088670, +28744068, -2372970, 19117974, 9395778, -27579596, 7504382, -7751879, 5735392, 19703700, 3275986, +-22933514, -17028472, -13259101, -24988656, 15696495, -1793686, 26620208, -539555, 4895726, 250719, +-13364864, -9296994, 5596343, -21458730, 7079717, -475668, -3439195, 7389491, -11097122, 6922414, +5346161, -1197222, -9279277, 12840878, -2605972, 11367168, -18888192, -14666240, -7808788, -7823283, +9973988, -4125853, -1699196, -2716567, -9074729, -5544803, -5288179, -194884, 18903224, 2217814, +-3863860, -496069, -9805947, 7501161, -5111011, -1227287, -3250753, 8437463, 36507, 959925, +-1038845, -6425808, -3441880, 9241159, -2515777, 6572911, -1159104, 3429532, -5109938, -28552942, +-65011308, 4744328, 89210768, 118767656, 101303248, 70457328, -3311420, 4706748, -52125332, -61282740, +-103879688, -77898360, -83468928, -26594438, 6691022, 27429272, 45172320, 113286208, 93643168, 63633700, +20170778, -9615358, -41155988, -30057792, -42777876, -53644680, -30360050, -30530776, -38336880, -17348446, +-25334402, 5649493, 17346836, 15196668, 47790636, 44765908, 39090644, 26130044, 29532196, 19139448, +35432408, 8970039, 30615064, 1728188, -8398272, -53625352, -23795192, -64705828, -75954888, -84239344, +-66636956, -49464600, -17974438, 13127031, 48308180, 52161840, 40531608, 84412216, 67822904, 73169064, +67132488, 63282584, 24959128, 41055592, -16630650, -40123048, -42747808, -99572912, -100165080, -96122440, +-102972912, -84306448, -29242822, -13888314, 22510460, 57677652, 62144956, 76663016, 91600912, 82349552, +63603096, 58426588, 42465416, 16350940, -1871532, -34019364, -50906636, -50676856, -58525908, -48484812, +-55070072, -56734908, -48487496, -37178848, -19087372, 2595771, 24607478, 48290464, 44605920, 44634912, +51929376, 58048092, 44393856, 45098768, 19713364, -20613158, -15583752, -36516348, -47173236, -38810400, +-32452772, -22283900, -28722594, -20259898, 2254321, 6353331, 9755481, 25691420, 22063246, 14522358, +3287798, 9918690, 9507447, 3262028, 12091407, -7295539, -8662949, -6455336, 4447439, -1017370, +48855, -303332, -1787243, -8840653, -6584722, -2343979, 8702141, 304943, 3943317, 1676648, +-4942434, -5567888, -3158949, -3806415, 1180579, 121333, 1454383, 1299228, 2029909, -1902134, +2105608, -1127966, 479426, 1888712, 5562520, 2669322, 6485938, 1168231, -132070, -1556389, +-1404454, -4114579, -375810, -2189360, -1153199, -3153580, -266825, -1472100, 671089, -2884071, +-455803, -5906, 2117419, -1343788, -422517, -2056753, 1153736, 119185, 2778307, 2760053, +3805878, 1225139, 2491081, -123480, 122943, -1189706, 1217623, -846109, 855235, -763967, +435402, -2466922, -1672353, -4452808, -2128693, -2601677, -443455, -1707786, 783832, -439697, +1525250, 427349, 3149822, 1668595, 3381750, 1658931, 3090766, 1318555, 2245731, -209380, +202937, -2684355, -1382980, -3191161, -1843615, -3696893, -1268626, -2251100, 301721, -311385, +1885491, 256624, 2110440, 423054, 1921461, 91805, 1635309, -373662, 1122060, -771484, +727997, -1044751, 649614, -1047972, 668404, -1016297, 721555, -921271, 821949, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, { { 10429791, -5484137, -584652, 3586835, 943819, 788127, -11341935, -4990752, -5599564, 4393752, -573915, --3737159, 4066260, 4121021, 308701, 3954591, -1634235, -178241, -200253, -2508261, -1250372, --5510980, 2859375, -8127689, 3409667, -4260608, 3475166, 6384469, 2966749, -1268626, -1785633, -4705674, -734439, 175020, 4526896, -4861903, -109522, -1675574, -2743410, 543313, -644782, -949188, 4638028, 7546795, -2384244, 89121, 6336151, 431107, 1687385, -2371359, -3506841, --568546, 1087701, -6007586, -1537598, 3063922, 431107, 1074279, 1875290, -906238, -1836635, --1813013, -2063732, 2253247, 1912871, -1151051, -3389803, -4250407, 2098092, -15569, -3461207, -3623342, -780073, -297963, 583042, 983548, -1716376, 2144799, -2319819, -846645, 2897492, --2042794, 1167157, -3419868, -2552284, -1295470, -813359, -272730, 474057, -1414655, -1679869, --229244, -949188, 320512, -341450, -367757, -446140, 298500, 116501, -417149, -678068, --479963, -243203, -126702, -360777, -303869, -516470, 423054, -763967, -545461, 627602, --3748433, -1012539, 16106, -3524021, -3592740, -2132988, 8575976, -6018323, -2493229, -4197794, --7683697, 2879776, 1302986, 313533, 6572911, 6249715, 6236293, 2033130, -1180579, 981937, -4698694, -1999307, 2020245, 2394981, -5567888, 7927973, 1524177, 2476586, 5840619, -2234994, --5848672, 409633, 3955128, -2779381, -1277753, -3710852, 3937411, -85899, -411780, -6460705, --289910, -771484, 3978750, 2052994, -3560528, 7101192, 2606508, 1490354, 2473901, -1139777, -3964792, -1531693, 188979, -4928475, -5914170, 4751845, 3701725, 6576669, 634045, 1786170, --5086852, -7847442, -3866544, -2343442, -2296734, -3616899, -3134789, 1637993, -915365, 2402497, --2956548, -1114544, 1292785, 1484448, -891206, 4019553, 1212791, -2988760, 6039798, -2353105, -1856500, 7640747, 1624571, 1062468, -2364916, 122943, -2596308, -3084860, -500364, 1771674, --34897, 242666, 95563, -824097, -267899, 93416, -760209, 1804960, 1148367, -651761, --162135, 68719, 472983, 270583, -1183800, -624381, -281320, 149250, 535260, -535797, --848793, 752156, -432718, 580894, -298500, -456340, -585726, -7383586, -6905234, 4051765, -908386, 5669357, -8756365, -1221918, -3488587, 951335, 10400263, 5954436, -9117142, 3456912, -852551, -3785477, -4235912, -5152887, -8396124, 309775, 993748, -3098819, 1478006, -1781875, -309238, 2538326, 1942399, 5414343, -4740034, 8519068, -5200669, 4950487, 3908957, -3179887, -2282775, 419833, 3525095, -1408749, 1836635, 3251827, 1072131, 511101, -1312113, 2535105, -747324, -1124208, 6043019, -7909719, 533113, -4789426, 9520332, 3371013, -8332774, 3239479, -10886131, -10238665, -4896800, 1238561, -854162, -3880503, 3235721, -1357210, 7243463, -6101001, --622233, -2015950, -437550, -367220, 6997576, -6504191, -2178085, -703301, -6739341, 3626026, -2784213, 7252053, 2931852, 6174553, 5543192, 916976, -2267743, 1749125, -219043, -773631, --1697049, -158914, -2587718, -1025423, -604517, -3588982, 2254321, 188979, -2530273, -426276, --2057289, 185757, -116501, 1377074, -513249, -815507, 140123, -1159104, -71941, 1185948, -405874, -268435, -843961, 3273839, -5071820, 622770, -3181497, 3349538, 1219771, -5153961, -14828911, -9452686, 2974265, 16015933, -11334956, 5248450, -301721, 5213017, -1399623, -9735080, --2131915, 7970923, 7167764, 1946157, -80531, 4013647, 1974074, 103079, 3340411, 3326989, --2803003, 4249334, -1211718, 6723235, -5476620, -8471286, 1775432, -7403450, 2514167, 83752, --2127620, -2408940, -3383897, -5060545, 942745, 1704565, 148176, 1211181, 1424855, -3148211, --6489159, 5011153, 1101659, 766115, -353261, 7391102, 1462436, 3053185, 7842074, -4914517, -1867774, 241055, 2334315, 5442798, 4279935, -7271380, -6349573, -1705102, -3649649, -910533, -206695, -3181497, 1593433, -5838471, 228170, -5622649, 2681133, 2619930, -3261491, -4301947, -410169, 2216740, 368830, -4961761, 624918, -2884071, 2029372, 1633698, 714575, -1014686, --1431835, 863825, -209917, -629750, -102005, -1362578, -1127429, -3449933, -901406, 2931852, -1255741, -987843, -682900, 2008434, -811749, 520228, -1024887, -82678, -321586, -9127, --1297617, -928787, -551903, -472983, -529892, -633508, 5369, -464393, -862752, -761283, -301185, 1420024, 461709, 4479651, -1802813, 4037806, -601832, 1913408, -2237678, 91805, --1402307, 1207960, -573378, -9445170, 7217693, 4306779, 11777337, -7800198, 4937602, -9603547, --1421634, 5535139, 6401112, -6801081, 2081985, -7847442, 759136, -9166534, 3129421, -6918119, --8140574, -7659538, 3935801, -6228240, 452582, -7269769, 1110249, 833224, -874026, -5377836, -3438658, 4334696, 2895345, 1908039, -5337571, 2800856, -5607080, -2041183, 3747896, -92879, --614180, -1770600, -34360, 3469260, -4087198, -8456254, -1553704, 2327336, -1553168, -6325413, --5993627, -8980240, 2285460, -2741800, -8020852, 5656472, -5073430, -5374078, 10109279, -3800509, --1770063, 596464, -1609539, -3452080, 988916, -5660767, -2509872, -4797479, -3424163, -1721208, -3142842, 7291781, 568546, 4294431, 564251, 3148211, 2527588, 5846524, -257161, -359167, -810138, 2019708, -1050120, 35433, -409633, 4211753, 10201, 1917166, 503585, 627602, --576063, 763430, -2540473, 2745021, 251792, -171799, -2043868, -796716, -2825015, 1194538, --1355599, 788127, -224949, 2765959, -1282048, 357556, -2434173, -2334852, -16106, -1151051, -907849, 1675037, 561030, 723702, -1136019, 242129, 7623567, -10997264, 1950989, 9698573, --3616899, 10619307, 2913599, 712965, -3098282, -7337415, -4887673, 12639552, -6790344, -6979, --2362769, 1037235, 7554848, 6863358, -4147328, 9891847, 9801115, -4569845, -2439005, 6042482, --5069135, -4360466, -330712, -6729677, -164819, -1938641, 867047, 11868605, 4020626, 707596, --5414343, -15622944, -1916092, 8894340, 2163590, -5805722, 4512937, 7247758, 6265284, 7655243, --12398497, 2590402, 609885, -6070400, 3345780, -5452461, 3956739, -3036542, 4907000, 11093364, -14556181, 9271761, 4234301, -5936182, -1645509, -7101729, -7547868, -1493038, 8549669, 2200097, -159988, 2112050, -8317741, 2275796, 1068373, 33823, -4191351, 2372433, 4602058, -4714264, --9063455, 20842940, 2717104, -3593277, 1320166, 2352568, 9487583, -1777580, 2644626, 3345780, -4736275, -3132105, -1548336, -3389266, 1726577, -840740, 1900523, 1856500, -1164473, -1787780, -3576634, 610959, 993211, -525060, 2190970, -3498251, -2531346, -1604170, -574989, 4205310, -1567126, 2865817, 2144799, 2283849, 231391, 634581, -818191, -2388539, 2585570, 772557, -1146219, -1607392, -521302, 49392, 1170379, 3338800, 915902, -5555004, -1760400, -3350611, --1491427, 2804077, -3757023, 16493748, -1769527, 4750771, 11575474, 1678259, -1907502, -7537668, -4155381, -4008815, -5342940, -15381352, -7096360, 3252364, -982474, -2874407, -11359652, 4038343, -6018323, -8696235, -4766340, -2248416, -9388799, 3796751, 498753, -4767951, -4169876, -1568737, --12634720, -4335233, 6025302, 10479720, -8015483, -9711995, -3011309, -470836, -8137353, -6453725, -2335925, 4468377, -8901857, 17599702, -76236, 7212324, -4145180, 6780143, -4692252, 2105071, --12586939, -2529199, 4908074, -12340515, 3248069, -2725694, -6492917, -14030048, -475131, 7907572, --47245, -14809047, -2410014, 2778307, 5825587, 10986526, -4180077, 4951561, 12589086, 4320200, -1396938, -5741298, -1262720, -3562675, 595390, -4260608, 826781, -8098698, -1242319, 6292664, -1621350, 1258962, -3710852, -6277095, 3345780, -1128503, 3456375, -1308891, 308701, -787590, --1992328, -1650878, 2183991, 942208, -639950, -810675, -93952, -2435783, 977642, -2491618, --3308199, -1960116, 929860, 158914, -164283, -2362232, 1680406, -294742, -1404454, -3349001, --1236414, 204548, 256624, 1349157, 3371013, 1115081, 636192, 1773822, -699543, -257698, --1118302, 2757906, 4655745, -1405528, -5005785, 6060736, 898185, -8923331, -14388677, -11488501, --14887430, 12830678, -7856032, -1763621, 4023311, -13815836, -5934571, -9574556, -4467840, -2978023, -6163815, -12094628, -6667400, 4009889, 4690105, 7162932, -258772, 350040, -2330557, 88584, --3021510, 1859184, -9839233, -5102958, -8672076, 6020471, 2782602, 4686346, 5783174, -11674795, --1004486, -1167694, 10559714, -3926674, 3216394, 5936719, -2355253, 6348499, -4254165, 7065758, -9614821, -3725347, -837519, 8484171, -7336341, 11694122, -5134097, -18355616, 2700461, 9647570, --3819300, 1191853, -489626, 7421167, 9016747, -9233643, -4238059, 2267206, 6152004, -10878615, --8504035, -6571837, 13108777, -229244, -15422154, -3221762, -6524592, 5293547, 500364, 4017405, --5910412, 9503689, 210453, 1770600, 2525441, -8631811, -3158949, 730144, -1285806, -2115272, --2730526, 2518462, -2611877, -2275796, 1644436, 2856690, 1225676, -5043902, -664109, -1966021, --1700270, 2196876, 1680406, 4372814, -799401, -2042794, 1436667, -4737886, -779537, 31675, --3351148, 498216, 81604, -1122597, 381178, -5401458, -1213865, -590558, 396211, 763967, -2072859, -227096, 2353642, 1527935, 1102733, 236223, -556198, -8592619, -3428458, 5845988, -2214593, 8391829, 2928094, 4091493, -16499654, -6508486, 6497749, -4382478, -3075734, -5534066, -1741072, 8596914, 2309619, 2034741, -11031623, -3765613, -1970853, 4093104, 9785546, -11833172, -5627481, -9646497, -2505040, -8873402, 1196148, 1220308, -391379, 3696893, -8213588, -2388002, --7691750, -3191161, 205085, -358093, -9672266, 5585068, 6320581, -2325188, 7489349, 14597520, -1567663, 11061151, 14250165, 1125818, 533650, 3432216, -2904472, 4713727, 1039382, -3086471, --4698694, 17826262, -1771137, 10427644, 4684736, -5226975, -6009733, -4217121, 5062156, -4039954, -6554657, 15715285, 8039105, -2051384, 343061, -13118978, -8972187, -7987566, 12438762, 19418084, --8412230, -33823, -7774965, -1255204, 11947525, -3702799, -622233, -18646064, -2401424, -3356517, --1882269, 7146826, 605054, 1528472, 2265059, -3695283, 3081102, 1644436, 2758443, -2178622, -3951907, -1786706, -317828, -4670240, -1010391, 4189741, -1408749, -52613, -695248, 4030827, --892816, -2793339, 1788854, 1836635, 1123134, 1465658, 1575716, -1470489, 518617, 2881386, -4956393, 4281546, 2837363, 1563905, 420370, 464393, -2896419, -173409, 2034741, -1750199, -2137820, -575526, 826244, 2738579, -1008244, 4908074, -399969, 11367168, 30846456, 13701483, --4393215, -897111, -5939940, 14479408, -14499810, -7958575, -22075058, -69793, 10625749, 13618268, -2246805, -5150203, -13301514, -9423158, 9504226, -1780801, 15197205, 140660, -5105643, 7438347, -2473364, 54224, -3990025, 10218801, -2032593, 8853538, -305480, -4536559, 18740552, -4333622, -7502771, 18774912, 6369974, -595390, -9248675, -1522029, -14960445, -17144972, 3610994, 11293080, --2827162, 1747515, -19083614, -7002944, 10799695, 6131066, -5064840, 3815542, -5773510, -2530810, --8788577, -14309220, 716723, -3229816, -10399190, -16543677, -14593225, -4507032, -13416941, 6295349, --6093485, 2297271, 1560684, 92342, 164283, -1953136, -3125126, 8781061, 16913044, -11309723, -1932735, -4639639, 6019934, -6226092, -403727, -4440996, -2244657, 15899432, 11263552, 2770254, --1914482, 357556, -6568079, 2419677, 6250788, -1016834, -5698348, -2972117, 5395016, -6506876, -471373, 3063922, 2543695, -2155537, -2281702, 2604361, 2878702, -2105071, 3455838, 2284923, -2843805, -111132, 3800509, -210990, 2354716, 1433982, 1330903, 1115081, -1001801, 4839892, --4683125, -463856, 861141, -1155346, -1286880, -1929514, 1932198, 397821, -4051765, -1260573, -2435783, -2605435, -12668006, -14573361, 3869766, 5441187, 17471390, -14773077, 4806606, 4401268, --24303072, -1231045, 304406, -20509542, -10986526, -7313256, 5346698, -1723356, 1375463, -5849746, -8745627, 13442174, 7277822, -2007897, -20576114, -9109626, -11115375, 4127464, 1427540, -9171366, --547071, 7062537, -5873368, 12259984, -10954314, -404801, -6315750, -20791936, 3701725, -8891656, --9777493, 7644505, 11613592, -12910135, 5140002, 15084462, -4776541, 6572374, 5371394, -3619584, -2239289, -16888348, 25640954, 9960029, 6208375, 24256364, -29501056, -2288144, -3927211, 3086471, -12293807, 12520367, 5015985, 5939940, 15736760, -1544578, -10384157, -18420040, 7296076, -7004018, -874026, 4907000, -3482682, 7445326, 20116554, -12355010, 9477919, -6020471, -5517423, 15008226, -1334124, 4640176, 14807973, 12002286, -5113696, -6169184, -12667469, -3306051, 260382, 6646999, -7231651, -41339, 1869385, 954020, -53150, 1346472, 1824287, 486942, 4179540, -2040110, -806380, 2803003, 1799054, 779537, -1568200, 3792456, 2723009, 532576, -1970853, -3127810, --7065758, 4302484, -66572, -710817, 2434710, -3547106, -189515, 2386928, 3579318, 4990752, -3073586, 1341640, 1631014, -96100, 1772748, 3711389, 15887621, 18747532, 4647692, 11571179, --7553774, 5458367, 5258651, -30715996, 8653822, 9973451, 2057826, -9781251, -271657, -18961206, -22273164, 13451838, -7062537, -7506529, -11145977, -5795522, 16099148, -16349867, -9417253, -2456185, --2782065, -3531000, 2298881, -10834592, -11099806, -6518687, -8563091, -2314451, -11123428, -1541356, --7483981, -24311662, -15561203, -6015102, -3913789, 3378529, 4003447, -151934, 657667, 7021735, -3330747, 3586298, 17046726, 3554622, 5723581, 10650982, 22913650, 19616190, 980326, -7790534, --15127949, 13700409, -3431142, 37055904, 7429757, 16598438, -1870995, 2090039, -14790257, -613643, -12808129, 7407745, 9694815, -11165841, -7420093, -14341970, -27216134, 15646566, -24026584, -2960843, -31547072, 2073932, 12607340, 5999533, 9257265, 245887, -17124572, 16552804, -344134, -15029164, --13472239, 450435, 5162014, 11116449, 2932926, -13188771, 629213, -2657511, 2604361, -5225902, --4372277, 2273648, 2054605, -4128537, 335544, -1373316, -438624, -5425618, -2030983, -1774895, -2429341, -1495186, -3347927, 4234301, -2714956, -1126355, -7663296, -8126078, -44023, 115427, --3387656, -2188823, 2572686, 1895154, -3440806, -5471789, -397284, -5686537, 3292093, -21721260, -6244346, 8502962, -14958297, -11145977, -9127, 9306120, 21220360, -862752, -16783658, -16463147, --1117765, -9214315, 2560874, 3277060, -18712098, -15701327, -30420180, -8681740, -8995272, -20312510, --14165876, 97174, -9798968, -5769752, -5653788, -1446867, -20553030, -10664941, -12731357, -5949604, -6010807, -17041894, 1039919, 14615774, 16866336, -3782256, 4428648, 10029822, -17193828, 9809168, --7592966, 15298137, -7550016, 1611150, -8117488, -1474248, 29644938, -5908802, 10994579, -21618182, --3881040, 224949, -21004538, 19602230, 471910, -6849936, 13625784, -5448703, 3302830, 27704150, --11167452, -14787572, 10077067, -2619930, -31124018, 12787191, -41171556, -21701396, 16128676, 13059385, -2349347, 8922795, -231391, 34897, -31130996, -16329466, -7547868, 3077881, -17817134, 4574140, -2150168, 7493644, -11734388, 943819, 8563628, 6985228, 4802311, 850940, 3901978, -9783399, --6716255, -6517613, -2183991, -1132798, -1180579, 8367133, -4451734, 4516695, 7802882, -3720516, -2209761, -6173479, -5194226, -40802, 1792612, -5519570, 2243584, -6984691, 6065031, -2288681, --1569811, 541166, 5412733, -1532767, 1988033, -4825933, 4276714, 3728569, 10249939, 2750927, -8368207, -8276939, -3154117, -9897215, -3158949, -5264556, -5113696, 41482404, 22677964, 60666, --21366926, 10994579, -22279070, -18077518, 3271691, 18443126, 36382132, -5699422, 18385682, -6551973, -13047037, 22093848, 12323872, 14132053, 7548405, -4103305, -18072148, -18656264, -5668283, -17629230, --5207648, -3214246, -3986804, 14146012, -2416456, -36244692, 2118493, 8778913, 8370355, 21726092, --2248416, -43259448, 24609088, -19343996, 6330782, -4211216, 14558865, 21238614, -23608898, -1626182, --11798812, -20553030, 14894410, -10208600, -25348896, 9974525, 14800994, 24392194, 6450504, -3771518, -2663954, 19975892, -16051903, 31518080, -9898826, -8747238, -2831994, 19217832, -19959250, 1867774, -2440615, -55533392, -8235063, 17231408, -7994008, 2915746, 7722351, 4066797, -2719251, 4555887, -19065360, 22797150, -18014704, 6537477, -13193066, -2215130, 22539988, -442382, -2333241, 871878, --1510218, -11639361, 3230889, 823023, -6804302, -17255568, 248034, -4089883, 5304822, -7944616, --7450695, -9352291, 7984344, 1887101, 4903779, 3973919, 353261, 2947958, -3809099, -7871065, -12140262, -1163399, -5845988, -129923, -4205310, -2594160, -4858145, 681289, 1524713, -650151, -3391414, 8891656, -297427, -2080912, -3568044, 872952, -4444218, -2470680, 5090610, -3787624, --3171833, -4649839, -11631308, -6454799, 1672890, 7646116, -6053757, -1717450, 23853712, 15663746, --44080860, -25212532, 30347702, 34966404, -18757196, -6487548, -49618148, -27577448, 7249368, -2357937, -6698539, -26526792, -16470663, -18214420, 26911728, 39755292, -1854889, 10653666, -6407018, -3600793, --425202, 9044664, 17354352, 4092567, -6072547, -3418257, -3978214, -23925116, -13428752, -24323474, --3144990, 7368017, -10104984, 14820858, -10990284, -4261145, 23250806, -11355357, 13096966, 8933532, --4183298, -22448720, -16097001, -13433584, 4087735, 41620916, 7411503, 22321482, 26517128, 20581484, -15390478, 13594645, -22971096, 423054, -3711389, 30770220, 14740328, 17941152, 32318018, -15972983, --21647172, 7831873, 27341762, -46374372, -779537, 3550864, 21561810, -37531572, -56298432, -10163503, -15846819, 3804267, 6442988, 17528298, 1184337, -12639015, -18442590, 472983, 2596845, 3515968, -17118130, 25147034, 12020540, 1730872, 147103, -423591, 2144799, 2393908, -6325413, 9178882, -1225676, -8687108, -14958297, 1704565, -6338835, 3066070, 1705102, -1516124, 1021129, -6386617, -6539088, -3506841, 4414690, -6859600, -4254165, -12106976, -11698417, 383863, 6278706, -5459977, -12494060, 151398, 3781719, -3928285, 13354127, 919660, 6172405, -6758131, -3491272, -2290828, --2301029, -8439611, -1422171, 8752070, -15288473, 11725798, -427349, -11541651, -19924890, 7368554, --9633075, -19796042, 14252849, 26984206, 8452496, -10507637, 16241419, 27141508, 10201621, 5527086, -2035815, -3119220, 12928925, -22842784, 1450088, -32816772, 17590576, -26501022, -2130841, 14142254, -7942469, -15149423, 3266860, -17518098, 35849556, 4562329, 11680700, 18578418, 39534636, -16361678, -12887049, -18951006, 6890738, 14127221, 31789200, 7422777, -6386080, 32448478, 4452808, -2345589, --18653042, 1176284, 20432770, -6961068, 19639274, -24173686, 37205692, 38470560, -46277200, -1274532, --2879776, 10053982, -7852811, -6146098, 19965156, -16887274, -49384608, 517544, 43971340, -34746824, -17435956, -8096550, -4373351, -21204254, 48527760, -3224984, 8046085, 4364761, -32613298, 42152420, -3314641, 37473588, -74335144, 6977175, -6987375, -22530324, -6021008, 12941810, -17315698, 11514270, --15611132, -10516764, -20548198, 25786984, -9974525, 1633161, -21919366, 803696, -16113644, -5638755, -7443179, -11253888, 5146445, 528281, -14889041, 13247290, -6134287, 1746441, -6403796, 11997454, --9217537, 1726577, 783295, -3584150, 16059420, -9516037, -11373073, -6743099, -12743168, -17840220, --8945343, 1491427, 1003949, -12914967, -7311645, -8752606, -12396886, -9950902, 4131759, 2630668, --509491, -5440650, 31035434, 4013110, -24242406, 2714419, -49017924, -10862509, 2187212, -9186935, --39129836, -4051228, -25780004, -6087043, 23127326, 5675263, 30405148, 12975096, 11307575, 7434052, --10738492, 24843164, -12757663, -15569, 11355357, 5580773, -15348066, 12444131, 4735202, 29352344, -11724187, -5018133, 17350594, -13795435, 23521388, 8368744, -26383448, -26696980, 13654775, 17667884, -7016366, 3032247, -12938052, -17025250, 5019206, -16751983, -25820806, -7677254, -4559645, -23342610, --8980777, 8964670, -16325171, -26351772, 7249905, 9989557, 699543, -3096135, -1772211, -4354023, -9297530, 45299020, 8985072, -1330366, -1933809, -15814070, -25979720, -11293617, 36958192, 40064528, -20255066, 3926674, 36040680, 17561584, -8402030, -50293532, -38647728, -31525596, -60428580, -34974456, -8332774, 49060336, -21872658, 16675211, -24430848, 8048232, -2165737, 16931834, -8034273, -2724620, --21808234, -12306692, -5435818, -19184546, 24483462, -3733937, -12989055, -5988258, 2405182, -13852343, -9880572, 7482370, 15820512, 3772055, 4395899, -15566035, -18403934, -2018098, -13612362, -8422968, --15844671, -22606024, 1122060, -5831492, 1358283, 1742683, 17347910, 17498234, -6528351, -3355980, --7745437, 16908750, 11103564, 7414188, 2589329, -3317325, 9593346, -13188771, -5311264, -2057289, --15226733, -29378650, 15488189, -433792, -9466645, -9113384, -5435818, -4094178, 11003706, 21037824, --9100499, 27067958, -30996778, 25014964, -3333432, 33350958, -21721798, 19294066, -31953482, 27738510, --25861608, -10781442, 38331508, 8935679, 30749282, 44257492, 4351876, -3528853, -18639622, -1444720, -27875412, 7098507, -10144176, -31065498, 2460480, 6164889, 14492830, 8997420, 12029667, 7650948, --18342732, -28918014, -12481175, 28027882, 10529649, 89391152, -28600188, -23873038, 28938952, 45893872, -9418863, -776852, 11861089, 3043521, 14522895, -13482976, 5109401, 21457120, 23491324, 15828565, -69159176, -8803072, -9168681, -4504884, 35582192, 21401822, -18354006, 18754512, -601295, 6120866, --15148350, 31771484, -31893354, 2214056, 48780092, -36066452, 104969000, -48281876, 50132468, 46167676, --45522360, -41430328, 46604692, 2018635, -27187142, -11419781, 25668336, -71017824, 10963441, -8351027, --45880452, 29927332, -35953172, 2842195, 2537789, -14421963, -35481800, 9599789, -2854006, -1580548, -6700149, -7295002, -11773579, 6346351, 14733885, -5623186, 2159295, 11536282, -10908143, 16052440, -12273406, -25566330, 3573950, -14359149, 6423661, -1012002, 1982664, -13081397, 5338645, 3427384, --171262, -6560563, 19665582, 4465156, -826244, 18877456, -13451838, -12186970, 1913945, 8150774, -1932198, 9081708, 4581657, -26317948, -13750875, 6788733, -15577310, 22651658, -10292889, -12859132, --617402, -8904541, 17933636, 22846004, -53821844, -23084912, 33314450, -69844224, -42980276, -29282014, -48949204, 103781976, 28929826, -81630688, -18192408, -83393232, -43268576, 67782104, 40773200, 63720136, -35303020, -48390324, -76418744, -58506044, -13807783, 34470872, 39504036, 23543936, 13463649, -20357608, --83552680, -100847440, -21598316, 77022720, 137754096, 93148176, -17364016, -64644628, -92390656, -68816112, --55351392, -73014, 22413286, 74995496, 80412528, -43557412, -26968100, -100986496, -93543848, -33860448, -9463960, 97219272, 143976432, 63656248, -42221676, -150803824, -111461920, -82071456, 39791260, 85651848, -53759032, 33743412, 29028610, -90038080, -16301012, -51408076, 19268834, -7254737, 53455700, 83532816, -66653596, -78270408, -157379952, -118611424, 13363254, 91975648, -2058900, 127596496, 5535139, -33045478, --38216084, -28374164, 584116, 92143688, 79881560, 14474040, -31492310, -11494943, -5621039, 48283484, -53680112, 6255620, 2550137, -8498667, -1190243, -10434086, -12810277, -8768713, -4514548, 18378166, -29136522, 23500988, -34645892, -39706972, -15007689, -16558710, -15432891, 35864052, 29676614, 37722160, -11368242, -16427713, -28223304, -55225764, -34846144, 22928146, 48846664, 73462192, 50680076, 4028143, --113313584, -100014216, -33769716, 40834940, 64117420, 85204096, 64638720, -5220533, -64335388, -95354176, --91603064, -16945794, 100217696, 103283760, 52864068, -25128244, -68827384, -48386564, -32146220, 2691334, -20949240, 27271968, 24539296, 14758044, 1286880, -15699716, -19223200, -20015084, -15890842, -18526878, -36842768, 11479911, -29845190, -28161026, 86973, -45373108, -5610838, 6722161, 5189931, -3945464, -1133335, -15258945, -1903207, -1793149, 7828652, -5265093, 20913806, -5552856, -4026532, -5840619, --6567542, 13037373, 3730716, -6289980, 20255602, 1281511, -36009004, -17981418, 9919227, 17621714, --5997385, 2146947, 24676734, -608812, 3368865, -20185810, -9015136, 6214281, -4386772, -4486630, --2678449, 16324634, 5912560, -6393596, -19314468, -7693897, -1131187, -17617956, 1688459, -20121922, --13463112, -9365713, -17878338, 28032178, -5048197, -12687870, 11862700, -197032, -27551678, -1614908, -27531278, 22321482, -12785044, 17282412, 2914135, 16488379, -18399104, -27151172, 10419054, 11964168, -10557030, 9130027, -10238665, 10078141, -20236812, 13707925, -27609124, -24322936, 17980344, -14235132, -12277164, 16813724, 1243930, -13016972, 4205847, 4747013, -1074279, -1076426, -420370, 10948409, --9172976, 7105487, -9586367, 12833899, -11221139, -6147709, 4759361, -3906810, -377420, 5061082, -1258425, 3375308, 9937481, -7920994, -4655208, 5654325, 3450469, 11294690, -9146133, 3121904, --1063541, -7101192, -7062537, 2881923, 1870995, -7027640, -10358924, 2974265, 194347, -1983201, -6706592, -9990094, 11587822, 3415036, -9897215, -11140608, 9350144, -15643345, 10761041, -1795833, -7481296, -843961, 2627983, 13962939, -22236656, 44463648, 67676872, -8779450, -25109990, -21449604, -62396212, 28306518, 60387240, 32675038, 45634, -27979028, -6304475, 15506979, 28346784, 13669807, --13183939, -3150359, 13529147, 20078972, 2442763, 4577899, -14013941, 2643552, -6781217, 9203578, -10187662, 26538602, 22749904, -12006044, 1951526, -13487271, 3513820, 12163347, 18000208, 1431298, --8600672, 64961, -15520401, 13031468, -3595425, 5433671, 12055973, 349503, 16066936, -7824894, --4432406, -3670050, -16567299, -9819906, -25258166, -4681515, -28798292, 2064269, -9917079, 23782308, -3506304, 7071664, -22268332, 9501005, 148176, -9807558, 16305843, -8708046, -4591320, 4147328, -10781442, -1205812, -5921150, 36781028, 11931956, 8577587, 13774497, -9839233, -491774, -3218541, -19178640, 26750130, 25608742, -15184320, -16706886, -2183454, -6644315, 6796786, 17262010, 18029198, -794569, 10148471, -1202054, -2644089, 5872831, 11533598, -1087701, 9084393, -7521025, 1724966, -135828, 3234110, -2579665, 10162429, 5850819, -964220, -2811593, 3146601, 1784022, 11043435, -619549, -6371047, -7025493, -3937411, 3087545, 3826816, 7016903, -8411157, 1189169, -2231236, -5639292, -4074850, 7955890, -2586107, 2973191, -4367982, -3711926, 2628520, -6932077, 142808, -7682623, 2030983, -3160559, 824097, -373125, -25181930, -55021752, -7299297, 72427104, 111955304, -93776312, 74310448, -5114769, 8835285, -54608900, -61691836, -100874824, -57897232, -63571960, -19874424, -7873749, 43988520, 31128312, 95633888, 83060376, 27586038, 5703180, -14711874, -32563368, -51214264, --18898930, -52499532, -14119705, -25489020, -16658031, -12164958, 2673080, 1013612, 17744120, 25927644, -39144868, 42632384, 50954956, 44176960, -5402532, 4395899, -641561, 8386998, -25370372, 10321343, --27109834, -67441184, -33259152, -50453516, -85051624, -24799678, -7480223, -34320008, 11566347, 26228292, -59229208, 70016016, 103106056, 65271692, 53030500, 52897892, 32757178, -10123238, 5277441, -51964272, --44936096, -75303664, -89720256, -103415296, -75458816, -57983132, -6136972, -2714956, 8129300, 30345554, -51123532, 92331600, 91140280, 90912112, 72744936, 31324270, 46906412, 7464653, -23668492, -35436700, --84074520, -76296336, -67724120, -58253180, -46796888, -28164784, -17231408, -5771363, 4124779, 28372018, -33469606, 44299368, 36536748, 52494164, 47364900, 31140124, 35687420, 24128590, -6616397, -19338090, --22496502, -53373020, -46432356, -41659036, -31359166, -16965120, -719407, -1985349, 13578539, 21104396, -16284369, 19581830, 12377022, 3981972, -493384, 5719823, 1248225, -6490233, 6966437, 8556112, -516470, 4623533, -1365800, -1854352, 707596, 3210488, -208306, -7208566, -9728638, -9415642, --11026255, -7376607, -2294050, -2502892, 3114388, 1289564, 856309, 3709241, 4181688, 3405909, -4519916, 7180112, 6049462, 3466039, 4128537, 1422171, -1560684, -492311, -1960653, -2914135, --1450625, -2626909, -2525441, -3056406, -3860639, -4205847, -4065187, -2284923, 1074, 207769, -2246268, 2316598, 1701881, 1283658, 2190433, 2204392, 3651259, 2461016, 3070902, 1580011, --697932, -1678795, -667867, -2088965, -296890, -114354, -942208, -558883, -700080, -2057289, --1542967, -1327145, -543850, -661962, -85362, -142271, 152471, -636192, -678068, -1054951, -811212, 1258425, 3054259, 3034395, 3484829, 2530273, 1742146, 650688, 0, -952946, --1112933, -2601140, -2313377, -2705830, -2338610, -2667175, -1591822, -1093606, 1611, 78383, -1122597, 906775, 2121714, 2124935, 2464774, 1824287, 2156074, 1105954, 827318, -354872, --548145, -1396401, -1118302, -1494112, -841277, -1156957, -347355, -623844, 66035, -290984, -325881, -119185, 389231, -160524, 290984, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +5484137, -584652, 3586835, 943819, 788127, -11341935, -4990752, -5599564, 4393752, -573915, +-3737159, 4066260, 4121021, 308701, 3954591, -1634235, -178241, -200253, -2508261, -1250372, +-5510980, 2859375, -8127689, 3409667, -4260608, 3475166, 6384469, 2966749, -1268626, -1785633, +4705674, -734439, 175020, 4526896, -4861903, -109522, -1675574, -2743410, 543313, -644782, +949188, 4638028, 7546795, -2384244, 89121, 6336151, 431107, 1687385, -2371359, -3506841, +-568546, 1087701, -6007586, -1537598, 3063922, 431107, 1074279, 1875290, -906238, -1836635, +-1813013, -2063732, 2253247, 1912871, -1151051, -3389803, -4250407, 2098092, -15569, -3461207, +3623342, -780073, -297963, 583042, 983548, -1716376, 2144799, -2319819, -846645, 2897492, +-2042794, 1167157, -3419868, -2552284, -1295470, -813359, -272730, 474057, -1414655, -1679869, +-229244, -949188, 320512, -341450, -367757, -446140, 298500, 116501, -417149, -678068, +-479963, -243203, -126702, -360777, -303869, -516470, 423054, -763967, -545461, 627602, +-3748433, -1012539, 16106, -3524021, -3592740, -2132988, 8575976, -6018323, -2493229, -4197794, +-7683697, 2879776, 1302986, 313533, 6572911, 6249715, 6236293, 2033130, -1180579, 981937, +4698694, -1999307, 2020245, 2394981, -5567888, 7927973, 1524177, 2476586, 5840619, -2234994, +-5848672, 409633, 3955128, -2779381, -1277753, -3710852, 3937411, -85899, -411780, -6460705, +-289910, -771484, 3978750, 2052994, -3560528, 7101192, 2606508, 1490354, 2473901, -1139777, +3964792, -1531693, 188979, -4928475, -5914170, 4751845, 3701725, 6576669, 634045, 1786170, +-5086852, -7847442, -3866544, -2343442, -2296734, -3616899, -3134789, 1637993, -915365, 2402497, +-2956548, -1114544, 1292785, 1484448, -891206, 4019553, 1212791, -2988760, 6039798, -2353105, +1856500, 7640747, 1624571, 1062468, -2364916, 122943, -2596308, -3084860, -500364, 1771674, +-34897, 242666, 95563, -824097, -267899, 93416, -760209, 1804960, 1148367, -651761, +-162135, 68719, 472983, 270583, -1183800, -624381, -281320, 149250, 535260, -535797, +-848793, 752156, -432718, 580894, -298500, -456340, -585726, -7383586, -6905234, 4051765, +908386, 5669357, -8756365, -1221918, -3488587, 951335, 10400263, 5954436, -9117142, 3456912, +852551, -3785477, -4235912, -5152887, -8396124, 309775, 993748, -3098819, 1478006, -1781875, +309238, 2538326, 1942399, 5414343, -4740034, 8519068, -5200669, 4950487, 3908957, -3179887, +2282775, 419833, 3525095, -1408749, 1836635, 3251827, 1072131, 511101, -1312113, 2535105, +747324, -1124208, 6043019, -7909719, 533113, -4789426, 9520332, 3371013, -8332774, 3239479, +10886131, -10238665, -4896800, 1238561, -854162, -3880503, 3235721, -1357210, 7243463, -6101001, +-622233, -2015950, -437550, -367220, 6997576, -6504191, -2178085, -703301, -6739341, 3626026, +2784213, 7252053, 2931852, 6174553, 5543192, 916976, -2267743, 1749125, -219043, -773631, +-1697049, -158914, -2587718, -1025423, -604517, -3588982, 2254321, 188979, -2530273, -426276, +-2057289, 185757, -116501, 1377074, -513249, -815507, 140123, -1159104, -71941, 1185948, +405874, -268435, -843961, 3273839, -5071820, 622770, -3181497, 3349538, 1219771, -5153961, +14828911, -9452686, 2974265, 16015933, -11334956, 5248450, -301721, 5213017, -1399623, -9735080, +-2131915, 7970923, 7167764, 1946157, -80531, 4013647, 1974074, 103079, 3340411, 3326989, +-2803003, 4249334, -1211718, 6723235, -5476620, -8471286, 1775432, -7403450, 2514167, 83752, +-2127620, -2408940, -3383897, -5060545, 942745, 1704565, 148176, 1211181, 1424855, -3148211, +-6489159, 5011153, 1101659, 766115, -353261, 7391102, 1462436, 3053185, 7842074, -4914517, +1867774, 241055, 2334315, 5442798, 4279935, -7271380, -6349573, -1705102, -3649649, -910533, +206695, -3181497, 1593433, -5838471, 228170, -5622649, 2681133, 2619930, -3261491, -4301947, +410169, 2216740, 368830, -4961761, 624918, -2884071, 2029372, 1633698, 714575, -1014686, +-1431835, 863825, -209917, -629750, -102005, -1362578, -1127429, -3449933, -901406, 2931852, +1255741, -987843, -682900, 2008434, -811749, 520228, -1024887, -82678, -321586, -9127, +-1297617, -928787, -551903, -472983, -529892, -633508, 5369, -464393, -862752, -761283, +301185, 1420024, 461709, 4479651, -1802813, 4037806, -601832, 1913408, -2237678, 91805, +-1402307, 1207960, -573378, -9445170, 7217693, 4306779, 11777337, -7800198, 4937602, -9603547, +-1421634, 5535139, 6401112, -6801081, 2081985, -7847442, 759136, -9166534, 3129421, -6918119, +-8140574, -7659538, 3935801, -6228240, 452582, -7269769, 1110249, 833224, -874026, -5377836, +3438658, 4334696, 2895345, 1908039, -5337571, 2800856, -5607080, -2041183, 3747896, -92879, +-614180, -1770600, -34360, 3469260, -4087198, -8456254, -1553704, 2327336, -1553168, -6325413, +-5993627, -8980240, 2285460, -2741800, -8020852, 5656472, -5073430, -5374078, 10109279, -3800509, +-1770063, 596464, -1609539, -3452080, 988916, -5660767, -2509872, -4797479, -3424163, -1721208, +3142842, 7291781, 568546, 4294431, 564251, 3148211, 2527588, 5846524, -257161, -359167, +810138, 2019708, -1050120, 35433, -409633, 4211753, 10201, 1917166, 503585, 627602, +-576063, 763430, -2540473, 2745021, 251792, -171799, -2043868, -796716, -2825015, 1194538, +-1355599, 788127, -224949, 2765959, -1282048, 357556, -2434173, -2334852, -16106, -1151051, +907849, 1675037, 561030, 723702, -1136019, 242129, 7623567, -10997264, 1950989, 9698573, +-3616899, 10619307, 2913599, 712965, -3098282, -7337415, -4887673, 12639552, -6790344, -6979, +-2362769, 1037235, 7554848, 6863358, -4147328, 9891847, 9801115, -4569845, -2439005, 6042482, +-5069135, -4360466, -330712, -6729677, -164819, -1938641, 867047, 11868605, 4020626, 707596, +-5414343, -15622944, -1916092, 8894340, 2163590, -5805722, 4512937, 7247758, 6265284, 7655243, +-12398497, 2590402, 609885, -6070400, 3345780, -5452461, 3956739, -3036542, 4907000, 11093364, +14556181, 9271761, 4234301, -5936182, -1645509, -7101729, -7547868, -1493038, 8549669, 2200097, +159988, 2112050, -8317741, 2275796, 1068373, 33823, -4191351, 2372433, 4602058, -4714264, +-9063455, 20842940, 2717104, -3593277, 1320166, 2352568, 9487583, -1777580, 2644626, 3345780, +4736275, -3132105, -1548336, -3389266, 1726577, -840740, 1900523, 1856500, -1164473, -1787780, +3576634, 610959, 993211, -525060, 2190970, -3498251, -2531346, -1604170, -574989, 4205310, +1567126, 2865817, 2144799, 2283849, 231391, 634581, -818191, -2388539, 2585570, 772557, +1146219, -1607392, -521302, 49392, 1170379, 3338800, 915902, -5555004, -1760400, -3350611, +-1491427, 2804077, -3757023, 16493748, -1769527, 4750771, 11575474, 1678259, -1907502, -7537668, +4155381, -4008815, -5342940, -15381352, -7096360, 3252364, -982474, -2874407, -11359652, 4038343, +6018323, -8696235, -4766340, -2248416, -9388799, 3796751, 498753, -4767951, -4169876, -1568737, +-12634720, -4335233, 6025302, 10479720, -8015483, -9711995, -3011309, -470836, -8137353, -6453725, +2335925, 4468377, -8901857, 17599702, -76236, 7212324, -4145180, 6780143, -4692252, 2105071, +-12586939, -2529199, 4908074, -12340515, 3248069, -2725694, -6492917, -14030048, -475131, 7907572, +-47245, -14809047, -2410014, 2778307, 5825587, 10986526, -4180077, 4951561, 12589086, 4320200, +1396938, -5741298, -1262720, -3562675, 595390, -4260608, 826781, -8098698, -1242319, 6292664, +1621350, 1258962, -3710852, -6277095, 3345780, -1128503, 3456375, -1308891, 308701, -787590, +-1992328, -1650878, 2183991, 942208, -639950, -810675, -93952, -2435783, 977642, -2491618, +-3308199, -1960116, 929860, 158914, -164283, -2362232, 1680406, -294742, -1404454, -3349001, +-1236414, 204548, 256624, 1349157, 3371013, 1115081, 636192, 1773822, -699543, -257698, +-1118302, 2757906, 4655745, -1405528, -5005785, 6060736, 898185, -8923331, -14388677, -11488501, +-14887430, 12830678, -7856032, -1763621, 4023311, -13815836, -5934571, -9574556, -4467840, -2978023, +6163815, -12094628, -6667400, 4009889, 4690105, 7162932, -258772, 350040, -2330557, 88584, +-3021510, 1859184, -9839233, -5102958, -8672076, 6020471, 2782602, 4686346, 5783174, -11674795, +-1004486, -1167694, 10559714, -3926674, 3216394, 5936719, -2355253, 6348499, -4254165, 7065758, +9614821, -3725347, -837519, 8484171, -7336341, 11694122, -5134097, -18355616, 2700461, 9647570, +-3819300, 1191853, -489626, 7421167, 9016747, -9233643, -4238059, 2267206, 6152004, -10878615, +-8504035, -6571837, 13108777, -229244, -15422154, -3221762, -6524592, 5293547, 500364, 4017405, +-5910412, 9503689, 210453, 1770600, 2525441, -8631811, -3158949, 730144, -1285806, -2115272, +-2730526, 2518462, -2611877, -2275796, 1644436, 2856690, 1225676, -5043902, -664109, -1966021, +-1700270, 2196876, 1680406, 4372814, -799401, -2042794, 1436667, -4737886, -779537, 31675, +-3351148, 498216, 81604, -1122597, 381178, -5401458, -1213865, -590558, 396211, 763967, +2072859, -227096, 2353642, 1527935, 1102733, 236223, -556198, -8592619, -3428458, 5845988, +2214593, 8391829, 2928094, 4091493, -16499654, -6508486, 6497749, -4382478, -3075734, -5534066, +1741072, 8596914, 2309619, 2034741, -11031623, -3765613, -1970853, 4093104, 9785546, -11833172, +5627481, -9646497, -2505040, -8873402, 1196148, 1220308, -391379, 3696893, -8213588, -2388002, +-7691750, -3191161, 205085, -358093, -9672266, 5585068, 6320581, -2325188, 7489349, 14597520, +1567663, 11061151, 14250165, 1125818, 533650, 3432216, -2904472, 4713727, 1039382, -3086471, +-4698694, 17826262, -1771137, 10427644, 4684736, -5226975, -6009733, -4217121, 5062156, -4039954, +6554657, 15715285, 8039105, -2051384, 343061, -13118978, -8972187, -7987566, 12438762, 19418084, +-8412230, -33823, -7774965, -1255204, 11947525, -3702799, -622233, -18646064, -2401424, -3356517, +-1882269, 7146826, 605054, 1528472, 2265059, -3695283, 3081102, 1644436, 2758443, -2178622, +3951907, -1786706, -317828, -4670240, -1010391, 4189741, -1408749, -52613, -695248, 4030827, +-892816, -2793339, 1788854, 1836635, 1123134, 1465658, 1575716, -1470489, 518617, 2881386, +4956393, 4281546, 2837363, 1563905, 420370, 464393, -2896419, -173409, 2034741, -1750199, +2137820, -575526, 826244, 2738579, -1008244, 4908074, -399969, 11367168, 30846456, 13701483, +-4393215, -897111, -5939940, 14479408, -14499810, -7958575, -22075058, -69793, 10625749, 13618268, +2246805, -5150203, -13301514, -9423158, 9504226, -1780801, 15197205, 140660, -5105643, 7438347, +2473364, 54224, -3990025, 10218801, -2032593, 8853538, -305480, -4536559, 18740552, -4333622, +7502771, 18774912, 6369974, -595390, -9248675, -1522029, -14960445, -17144972, 3610994, 11293080, +-2827162, 1747515, -19083614, -7002944, 10799695, 6131066, -5064840, 3815542, -5773510, -2530810, +-8788577, -14309220, 716723, -3229816, -10399190, -16543677, -14593225, -4507032, -13416941, 6295349, +-6093485, 2297271, 1560684, 92342, 164283, -1953136, -3125126, 8781061, 16913044, -11309723, +1932735, -4639639, 6019934, -6226092, -403727, -4440996, -2244657, 15899432, 11263552, 2770254, +-1914482, 357556, -6568079, 2419677, 6250788, -1016834, -5698348, -2972117, 5395016, -6506876, +471373, 3063922, 2543695, -2155537, -2281702, 2604361, 2878702, -2105071, 3455838, 2284923, +2843805, -111132, 3800509, -210990, 2354716, 1433982, 1330903, 1115081, -1001801, 4839892, +-4683125, -463856, 861141, -1155346, -1286880, -1929514, 1932198, 397821, -4051765, -1260573, +2435783, -2605435, -12668006, -14573361, 3869766, 5441187, 17471390, -14773077, 4806606, 4401268, +-24303072, -1231045, 304406, -20509542, -10986526, -7313256, 5346698, -1723356, 1375463, -5849746, +8745627, 13442174, 7277822, -2007897, -20576114, -9109626, -11115375, 4127464, 1427540, -9171366, +-547071, 7062537, -5873368, 12259984, -10954314, -404801, -6315750, -20791936, 3701725, -8891656, +-9777493, 7644505, 11613592, -12910135, 5140002, 15084462, -4776541, 6572374, 5371394, -3619584, +2239289, -16888348, 25640954, 9960029, 6208375, 24256364, -29501056, -2288144, -3927211, 3086471, +12293807, 12520367, 5015985, 5939940, 15736760, -1544578, -10384157, -18420040, 7296076, -7004018, +874026, 4907000, -3482682, 7445326, 20116554, -12355010, 9477919, -6020471, -5517423, 15008226, +1334124, 4640176, 14807973, 12002286, -5113696, -6169184, -12667469, -3306051, 260382, 6646999, +7231651, -41339, 1869385, 954020, -53150, 1346472, 1824287, 486942, 4179540, -2040110, +806380, 2803003, 1799054, 779537, -1568200, 3792456, 2723009, 532576, -1970853, -3127810, +-7065758, 4302484, -66572, -710817, 2434710, -3547106, -189515, 2386928, 3579318, 4990752, +3073586, 1341640, 1631014, -96100, 1772748, 3711389, 15887621, 18747532, 4647692, 11571179, +-7553774, 5458367, 5258651, -30715996, 8653822, 9973451, 2057826, -9781251, -271657, -18961206, +22273164, 13451838, -7062537, -7506529, -11145977, -5795522, 16099148, -16349867, -9417253, -2456185, +-2782065, -3531000, 2298881, -10834592, -11099806, -6518687, -8563091, -2314451, -11123428, -1541356, +-7483981, -24311662, -15561203, -6015102, -3913789, 3378529, 4003447, -151934, 657667, 7021735, +3330747, 3586298, 17046726, 3554622, 5723581, 10650982, 22913650, 19616190, 980326, -7790534, +-15127949, 13700409, -3431142, 37055904, 7429757, 16598438, -1870995, 2090039, -14790257, -613643, +12808129, 7407745, 9694815, -11165841, -7420093, -14341970, -27216134, 15646566, -24026584, -2960843, +31547072, 2073932, 12607340, 5999533, 9257265, 245887, -17124572, 16552804, -344134, -15029164, +-13472239, 450435, 5162014, 11116449, 2932926, -13188771, 629213, -2657511, 2604361, -5225902, +-4372277, 2273648, 2054605, -4128537, 335544, -1373316, -438624, -5425618, -2030983, -1774895, +2429341, -1495186, -3347927, 4234301, -2714956, -1126355, -7663296, -8126078, -44023, 115427, +-3387656, -2188823, 2572686, 1895154, -3440806, -5471789, -397284, -5686537, 3292093, -21721260, +6244346, 8502962, -14958297, -11145977, -9127, 9306120, 21220360, -862752, -16783658, -16463147, +-1117765, -9214315, 2560874, 3277060, -18712098, -15701327, -30420180, -8681740, -8995272, -20312510, +-14165876, 97174, -9798968, -5769752, -5653788, -1446867, -20553030, -10664941, -12731357, -5949604, +6010807, -17041894, 1039919, 14615774, 16866336, -3782256, 4428648, 10029822, -17193828, 9809168, +-7592966, 15298137, -7550016, 1611150, -8117488, -1474248, 29644938, -5908802, 10994579, -21618182, +-3881040, 224949, -21004538, 19602230, 471910, -6849936, 13625784, -5448703, 3302830, 27704150, +-11167452, -14787572, 10077067, -2619930, -31124018, 12787191, -41171556, -21701396, 16128676, 13059385, +2349347, 8922795, -231391, 34897, -31130996, -16329466, -7547868, 3077881, -17817134, 4574140, +2150168, 7493644, -11734388, 943819, 8563628, 6985228, 4802311, 850940, 3901978, -9783399, +-6716255, -6517613, -2183991, -1132798, -1180579, 8367133, -4451734, 4516695, 7802882, -3720516, +2209761, -6173479, -5194226, -40802, 1792612, -5519570, 2243584, -6984691, 6065031, -2288681, +-1569811, 541166, 5412733, -1532767, 1988033, -4825933, 4276714, 3728569, 10249939, 2750927, +8368207, -8276939, -3154117, -9897215, -3158949, -5264556, -5113696, 41482404, 22677964, 60666, +-21366926, 10994579, -22279070, -18077518, 3271691, 18443126, 36382132, -5699422, 18385682, -6551973, +13047037, 22093848, 12323872, 14132053, 7548405, -4103305, -18072148, -18656264, -5668283, -17629230, +-5207648, -3214246, -3986804, 14146012, -2416456, -36244692, 2118493, 8778913, 8370355, 21726092, +-2248416, -43259448, 24609088, -19343996, 6330782, -4211216, 14558865, 21238614, -23608898, -1626182, +-11798812, -20553030, 14894410, -10208600, -25348896, 9974525, 14800994, 24392194, 6450504, -3771518, +2663954, 19975892, -16051903, 31518080, -9898826, -8747238, -2831994, 19217832, -19959250, 1867774, +2440615, -55533392, -8235063, 17231408, -7994008, 2915746, 7722351, 4066797, -2719251, 4555887, +19065360, 22797150, -18014704, 6537477, -13193066, -2215130, 22539988, -442382, -2333241, 871878, +-1510218, -11639361, 3230889, 823023, -6804302, -17255568, 248034, -4089883, 5304822, -7944616, +-7450695, -9352291, 7984344, 1887101, 4903779, 3973919, 353261, 2947958, -3809099, -7871065, +12140262, -1163399, -5845988, -129923, -4205310, -2594160, -4858145, 681289, 1524713, -650151, +3391414, 8891656, -297427, -2080912, -3568044, 872952, -4444218, -2470680, 5090610, -3787624, +-3171833, -4649839, -11631308, -6454799, 1672890, 7646116, -6053757, -1717450, 23853712, 15663746, +-44080860, -25212532, 30347702, 34966404, -18757196, -6487548, -49618148, -27577448, 7249368, -2357937, +6698539, -26526792, -16470663, -18214420, 26911728, 39755292, -1854889, 10653666, -6407018, -3600793, +-425202, 9044664, 17354352, 4092567, -6072547, -3418257, -3978214, -23925116, -13428752, -24323474, +-3144990, 7368017, -10104984, 14820858, -10990284, -4261145, 23250806, -11355357, 13096966, 8933532, +-4183298, -22448720, -16097001, -13433584, 4087735, 41620916, 7411503, 22321482, 26517128, 20581484, +15390478, 13594645, -22971096, 423054, -3711389, 30770220, 14740328, 17941152, 32318018, -15972983, +-21647172, 7831873, 27341762, -46374372, -779537, 3550864, 21561810, -37531572, -56298432, -10163503, +15846819, 3804267, 6442988, 17528298, 1184337, -12639015, -18442590, 472983, 2596845, 3515968, +17118130, 25147034, 12020540, 1730872, 147103, -423591, 2144799, 2393908, -6325413, 9178882, +1225676, -8687108, -14958297, 1704565, -6338835, 3066070, 1705102, -1516124, 1021129, -6386617, +6539088, -3506841, 4414690, -6859600, -4254165, -12106976, -11698417, 383863, 6278706, -5459977, +12494060, 151398, 3781719, -3928285, 13354127, 919660, 6172405, -6758131, -3491272, -2290828, +-2301029, -8439611, -1422171, 8752070, -15288473, 11725798, -427349, -11541651, -19924890, 7368554, +-9633075, -19796042, 14252849, 26984206, 8452496, -10507637, 16241419, 27141508, 10201621, 5527086, +2035815, -3119220, 12928925, -22842784, 1450088, -32816772, 17590576, -26501022, -2130841, 14142254, +7942469, -15149423, 3266860, -17518098, 35849556, 4562329, 11680700, 18578418, 39534636, -16361678, +12887049, -18951006, 6890738, 14127221, 31789200, 7422777, -6386080, 32448478, 4452808, -2345589, +-18653042, 1176284, 20432770, -6961068, 19639274, -24173686, 37205692, 38470560, -46277200, -1274532, +-2879776, 10053982, -7852811, -6146098, 19965156, -16887274, -49384608, 517544, 43971340, -34746824, +17435956, -8096550, -4373351, -21204254, 48527760, -3224984, 8046085, 4364761, -32613298, 42152420, +3314641, 37473588, -74335144, 6977175, -6987375, -22530324, -6021008, 12941810, -17315698, 11514270, +-15611132, -10516764, -20548198, 25786984, -9974525, 1633161, -21919366, 803696, -16113644, -5638755, +7443179, -11253888, 5146445, 528281, -14889041, 13247290, -6134287, 1746441, -6403796, 11997454, +-9217537, 1726577, 783295, -3584150, 16059420, -9516037, -11373073, -6743099, -12743168, -17840220, +-8945343, 1491427, 1003949, -12914967, -7311645, -8752606, -12396886, -9950902, 4131759, 2630668, +-509491, -5440650, 31035434, 4013110, -24242406, 2714419, -49017924, -10862509, 2187212, -9186935, +-39129836, -4051228, -25780004, -6087043, 23127326, 5675263, 30405148, 12975096, 11307575, 7434052, +-10738492, 24843164, -12757663, -15569, 11355357, 5580773, -15348066, 12444131, 4735202, 29352344, +11724187, -5018133, 17350594, -13795435, 23521388, 8368744, -26383448, -26696980, 13654775, 17667884, +7016366, 3032247, -12938052, -17025250, 5019206, -16751983, -25820806, -7677254, -4559645, -23342610, +-8980777, 8964670, -16325171, -26351772, 7249905, 9989557, 699543, -3096135, -1772211, -4354023, +9297530, 45299020, 8985072, -1330366, -1933809, -15814070, -25979720, -11293617, 36958192, 40064528, +20255066, 3926674, 36040680, 17561584, -8402030, -50293532, -38647728, -31525596, -60428580, -34974456, +8332774, 49060336, -21872658, 16675211, -24430848, 8048232, -2165737, 16931834, -8034273, -2724620, +-21808234, -12306692, -5435818, -19184546, 24483462, -3733937, -12989055, -5988258, 2405182, -13852343, +9880572, 7482370, 15820512, 3772055, 4395899, -15566035, -18403934, -2018098, -13612362, -8422968, +-15844671, -22606024, 1122060, -5831492, 1358283, 1742683, 17347910, 17498234, -6528351, -3355980, +-7745437, 16908750, 11103564, 7414188, 2589329, -3317325, 9593346, -13188771, -5311264, -2057289, +-15226733, -29378650, 15488189, -433792, -9466645, -9113384, -5435818, -4094178, 11003706, 21037824, +-9100499, 27067958, -30996778, 25014964, -3333432, 33350958, -21721798, 19294066, -31953482, 27738510, +-25861608, -10781442, 38331508, 8935679, 30749282, 44257492, 4351876, -3528853, -18639622, -1444720, +27875412, 7098507, -10144176, -31065498, 2460480, 6164889, 14492830, 8997420, 12029667, 7650948, +-18342732, -28918014, -12481175, 28027882, 10529649, 89391152, -28600188, -23873038, 28938952, 45893872, +9418863, -776852, 11861089, 3043521, 14522895, -13482976, 5109401, 21457120, 23491324, 15828565, +69159176, -8803072, -9168681, -4504884, 35582192, 21401822, -18354006, 18754512, -601295, 6120866, +-15148350, 31771484, -31893354, 2214056, 48780092, -36066452, 104969000, -48281876, 50132468, 46167676, +-45522360, -41430328, 46604692, 2018635, -27187142, -11419781, 25668336, -71017824, 10963441, -8351027, +-45880452, 29927332, -35953172, 2842195, 2537789, -14421963, -35481800, 9599789, -2854006, -1580548, +6700149, -7295002, -11773579, 6346351, 14733885, -5623186, 2159295, 11536282, -10908143, 16052440, +12273406, -25566330, 3573950, -14359149, 6423661, -1012002, 1982664, -13081397, 5338645, 3427384, +-171262, -6560563, 19665582, 4465156, -826244, 18877456, -13451838, -12186970, 1913945, 8150774, +1932198, 9081708, 4581657, -26317948, -13750875, 6788733, -15577310, 22651658, -10292889, -12859132, +-617402, -8904541, 17933636, 22846004, -53821844, -23084912, 33314450, -69844224, -42980276, -29282014, +48949204, 103781976, 28929826, -81630688, -18192408, -83393232, -43268576, 67782104, 40773200, 63720136, +35303020, -48390324, -76418744, -58506044, -13807783, 34470872, 39504036, 23543936, 13463649, -20357608, +-83552680, -100847440, -21598316, 77022720, 137754096, 93148176, -17364016, -64644628, -92390656, -68816112, +-55351392, -73014, 22413286, 74995496, 80412528, -43557412, -26968100, -100986496, -93543848, -33860448, +9463960, 97219272, 143976432, 63656248, -42221676, -150803824, -111461920, -82071456, 39791260, 85651848, +53759032, 33743412, 29028610, -90038080, -16301012, -51408076, 19268834, -7254737, 53455700, 83532816, +66653596, -78270408, -157379952, -118611424, 13363254, 91975648, -2058900, 127596496, 5535139, -33045478, +-38216084, -28374164, 584116, 92143688, 79881560, 14474040, -31492310, -11494943, -5621039, 48283484, +53680112, 6255620, 2550137, -8498667, -1190243, -10434086, -12810277, -8768713, -4514548, 18378166, +29136522, 23500988, -34645892, -39706972, -15007689, -16558710, -15432891, 35864052, 29676614, 37722160, +11368242, -16427713, -28223304, -55225764, -34846144, 22928146, 48846664, 73462192, 50680076, 4028143, +-113313584, -100014216, -33769716, 40834940, 64117420, 85204096, 64638720, -5220533, -64335388, -95354176, +-91603064, -16945794, 100217696, 103283760, 52864068, -25128244, -68827384, -48386564, -32146220, 2691334, +20949240, 27271968, 24539296, 14758044, 1286880, -15699716, -19223200, -20015084, -15890842, -18526878, +36842768, 11479911, -29845190, -28161026, 86973, -45373108, -5610838, 6722161, 5189931, -3945464, +1133335, -15258945, -1903207, -1793149, 7828652, -5265093, 20913806, -5552856, -4026532, -5840619, +-6567542, 13037373, 3730716, -6289980, 20255602, 1281511, -36009004, -17981418, 9919227, 17621714, +-5997385, 2146947, 24676734, -608812, 3368865, -20185810, -9015136, 6214281, -4386772, -4486630, +-2678449, 16324634, 5912560, -6393596, -19314468, -7693897, -1131187, -17617956, 1688459, -20121922, +-13463112, -9365713, -17878338, 28032178, -5048197, -12687870, 11862700, -197032, -27551678, -1614908, +27531278, 22321482, -12785044, 17282412, 2914135, 16488379, -18399104, -27151172, 10419054, 11964168, +10557030, 9130027, -10238665, 10078141, -20236812, 13707925, -27609124, -24322936, 17980344, -14235132, +12277164, 16813724, 1243930, -13016972, 4205847, 4747013, -1074279, -1076426, -420370, 10948409, +-9172976, 7105487, -9586367, 12833899, -11221139, -6147709, 4759361, -3906810, -377420, 5061082, +1258425, 3375308, 9937481, -7920994, -4655208, 5654325, 3450469, 11294690, -9146133, 3121904, +-1063541, -7101192, -7062537, 2881923, 1870995, -7027640, -10358924, 2974265, 194347, -1983201, +6706592, -9990094, 11587822, 3415036, -9897215, -11140608, 9350144, -15643345, 10761041, -1795833, +7481296, -843961, 2627983, 13962939, -22236656, 44463648, 67676872, -8779450, -25109990, -21449604, +62396212, 28306518, 60387240, 32675038, 45634, -27979028, -6304475, 15506979, 28346784, 13669807, +-13183939, -3150359, 13529147, 20078972, 2442763, 4577899, -14013941, 2643552, -6781217, 9203578, +10187662, 26538602, 22749904, -12006044, 1951526, -13487271, 3513820, 12163347, 18000208, 1431298, +-8600672, 64961, -15520401, 13031468, -3595425, 5433671, 12055973, 349503, 16066936, -7824894, +-4432406, -3670050, -16567299, -9819906, -25258166, -4681515, -28798292, 2064269, -9917079, 23782308, +3506304, 7071664, -22268332, 9501005, 148176, -9807558, 16305843, -8708046, -4591320, 4147328, +10781442, -1205812, -5921150, 36781028, 11931956, 8577587, 13774497, -9839233, -491774, -3218541, +19178640, 26750130, 25608742, -15184320, -16706886, -2183454, -6644315, 6796786, 17262010, 18029198, +794569, 10148471, -1202054, -2644089, 5872831, 11533598, -1087701, 9084393, -7521025, 1724966, +135828, 3234110, -2579665, 10162429, 5850819, -964220, -2811593, 3146601, 1784022, 11043435, +619549, -6371047, -7025493, -3937411, 3087545, 3826816, 7016903, -8411157, 1189169, -2231236, +5639292, -4074850, 7955890, -2586107, 2973191, -4367982, -3711926, 2628520, -6932077, 142808, +7682623, 2030983, -3160559, 824097, -373125, -25181930, -55021752, -7299297, 72427104, 111955304, +93776312, 74310448, -5114769, 8835285, -54608900, -61691836, -100874824, -57897232, -63571960, -19874424, +7873749, 43988520, 31128312, 95633888, 83060376, 27586038, 5703180, -14711874, -32563368, -51214264, +-18898930, -52499532, -14119705, -25489020, -16658031, -12164958, 2673080, 1013612, 17744120, 25927644, +39144868, 42632384, 50954956, 44176960, -5402532, 4395899, -641561, 8386998, -25370372, 10321343, +-27109834, -67441184, -33259152, -50453516, -85051624, -24799678, -7480223, -34320008, 11566347, 26228292, +59229208, 70016016, 103106056, 65271692, 53030500, 52897892, 32757178, -10123238, 5277441, -51964272, +-44936096, -75303664, -89720256, -103415296, -75458816, -57983132, -6136972, -2714956, 8129300, 30345554, +51123532, 92331600, 91140280, 90912112, 72744936, 31324270, 46906412, 7464653, -23668492, -35436700, +-84074520, -76296336, -67724120, -58253180, -46796888, -28164784, -17231408, -5771363, 4124779, 28372018, +33469606, 44299368, 36536748, 52494164, 47364900, 31140124, 35687420, 24128590, -6616397, -19338090, +-22496502, -53373020, -46432356, -41659036, -31359166, -16965120, -719407, -1985349, 13578539, 21104396, +16284369, 19581830, 12377022, 3981972, -493384, 5719823, 1248225, -6490233, 6966437, 8556112, +516470, 4623533, -1365800, -1854352, 707596, 3210488, -208306, -7208566, -9728638, -9415642, +-11026255, -7376607, -2294050, -2502892, 3114388, 1289564, 856309, 3709241, 4181688, 3405909, +4519916, 7180112, 6049462, 3466039, 4128537, 1422171, -1560684, -492311, -1960653, -2914135, +-1450625, -2626909, -2525441, -3056406, -3860639, -4205847, -4065187, -2284923, 1074, 207769, +2246268, 2316598, 1701881, 1283658, 2190433, 2204392, 3651259, 2461016, 3070902, 1580011, +-697932, -1678795, -667867, -2088965, -296890, -114354, -942208, -558883, -700080, -2057289, +-1542967, -1327145, -543850, -661962, -85362, -142271, 152471, -636192, -678068, -1054951, +811212, 1258425, 3054259, 3034395, 3484829, 2530273, 1742146, 650688, 0, -952946, +-1112933, -2601140, -2313377, -2705830, -2338610, -2667175, -1591822, -1093606, 1611, 78383, +1122597, 906775, 2121714, 2124935, 2464774, 1824287, 2156074, 1105954, 827318, -354872, +-548145, -1396401, -1118302, -1494112, -841277, -1156957, -347355, -623844, 66035, -290984, +325881, -119185, 389231, -160524, 290984, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, { 7448547, -2763275, -3663607, -679142, 2626909, -504122, 2792266, -6819871, -4780299, -1229971, -5654862, -2344515, -1221918, -674847, -3804804, -1764158, 3631932, 3534221, -1354525, -1135482, -2328409, --5517959, 6151467, 3585761, 205622, 598074, -286152, 134218, 4963909, -2534568, 950798, --7904888, -6397891, -1655710, 632971, -5520644, -969589, 1906966, 519691, 57982, -2702608, --2156074, 5190468, -2421288, -2145336, -762357, -677531, 2226941, -1140851, -3406983, -71404, -2916283, -4160750, 144418, -4459787, 279710, -3253438, 4967667, -237297, -5310727, -720481, --548145, 675921, -7566659, -863825, 591632, -4988068, 2282775, 155156, -5836324, 2686502, -3534221, -3049964, -3587372, -6330782, 3307125, 1974074, 5885179, 2965138, -911607, 1195075, --852551, 1838783, 1850594, 4127464, 1009317, -1735167, -92879, 522375, -162672, 2376728, -576599, -760746, -1162326, 1178432, 879931, 1792075, 847182, 722628, 1021665, 993211, -366683, 631897, -135291, -258772, 349503, 290447, 421444, -204548, 501974, -668404, --18254, -5511517, 2505040, -6866042, -1879585, -986232, -3431679, 3262028, 7671349, -3158949, --998580, 329639, -3144453, 2167348, -458488, -2604898, -4352413, -2355253, 6918119, 6630893, -3761855, 7707856, 4571993, 2430415, 7304129, -4562866, 1618129, 3083787, -131533, 1222992, --2153926, 1363652, -10076530, 181462, -576599, 3608846, -2275259, -1316944, -695785, 2755759, --3186329, -550830, 914828, 1929514, 1919314, -572841, -3419868, 612033, 1203665, 2434173, -1869385, 2836289, -3216394, -1949915, -586263, -5750961, -673236, 1479079, 4912906, 5444945, --750009, 2985002, 2253247, -448824, 2037425, 2387465, 3544959, -1461363, -47245, -2697240, -459025, -2330020, 1575179, -3430605, -3202972, 1880122, -20938, -6373195, -594316, -4784057, --1287953, -717260, -802085, -6337761, 605590, 2176475, -1858110, -1841467, 1085553, 748935, -455267, -1293322, -3383897, -222265, -1482838, 1236951, 46171, 41339, -379031, -1448478, --1553168, -1807644, 124554, -811749, 762357, -1153199, 435402, 212064, -1004486, -75162, --1118839, -457951, 64961, -48855, -995359, -296353, -169114, -6964290, -6482717, 2384244, --724239, 5379447, 5493263, 409633, 172336, 10443213, -2793876, -286689, 8846559, 328028, --5050345, -7491497, 5451387, -2216203, 74625, -4651450, 1473174, -3331284, 3716757, 16336982, --5934571, -4840428, -5861557, -6417218, 1209033, -5237713, -12855911, -352724, 1335198, 4832, --5085778, -1104880, 4232691, -5292474, -3064459, 7626788, 2562485, -1970853, -1780264, 4904316, --2399813, 3505767, 3266860, -7003481, -4587562, -4154307, 4613869, -3559991, -2061584, -1942399, --2279554, -381715, -4663261, 24696, -1375463, 1151051, -605054, -10241350, 4791036, -5730560, -4559645, 833761, -8360154, 1699196, 5665599, 1726040, 9403831, -3963718, 558883, 1089311, -2234994, 3346317, -3646427, 1396938, 1279363, -5441187, 7502234, 536334, -1013612, 3167002, --1027034, 1420560, -1319092, -2838974, -154082, -1826435, 2493229, -632971, 508954, 2913599, -1050656, 1112933, -602369, 1589138, 325881, -420370, 1089848, 2123325, -1484985, 145492, --1568737, 1017370, -479963, 3149285, -4392678, 2094870, 2154463, -2287607, 1014686, -1100585, --9439801, 2950643, 8773544, 7397545, 8225399, 1506460, -1826435, -7041599, -3764539, -3279208, --2719788, 7396471, 10153840, 789737, -732292, 7324530, -11829951, 285615, -984621, -158914, --3875671, -3914326, 4267587, 5356361, 144418, -1129040, 2093260, -5686000, -4367445, 4438849, --4810900, 9201431, 8273181, 1430761, 5085242, 4358318, 850940, -3708168, 1275605, -164819, --6491306, 6311992, -581431, 2970507, 5079873, -6036577, -2381559, -7180649, -1655710, 1682554, -6745246, -6918656, -2785286, 5102421, -1093069, -4417374, 7401303, -6158446, -13022341, 2216203, --7346542, -3245385, 3511673, -3117610, 600222, 798864, -3198677, 5571647, -5106179, -5740761, --6952479, -745177, -3031710, 477815, 1811939, -4213900, 1090922, 1233729, 283468, -1999307, -1090922, 922881, 2866891, 453119, -962073, -1969779, -1309965, -865973, -550293, -686658, --1264868, 390842, 532039, 854162, 230318, -372588, -1019518, -379568, 1407139, -1456531, --1569274, -442919, -76236, -122407, 1067836, 1317481, 1187022, -749472, 394600, 275415, -447750, 257161, -446677, 2813741, -1386738, 153008, -11738682, 2488397, 11090679, 875100, -1744831, 3347390, 10387378, 1404991, -9972377, 11057930, 4874788, 3981972, 6750615, 5832029, -53687, -2091649, 6365679, 4844186, 1668058, -4596152, 5535139, 2583423, 8191577, 9532143, -3636227, -2378338, 219043, -92879, 3981972, 12103218, 7204271, -6754373, 11734924, 445603, --1449015, 1525787, -8660265, 9592273, -1287953, 146566, -1156957, 2425046, -1308891, 4938139, --6991133, 9796820, 8367670, -344134, -1578401, -5495948, -10427644, -3605088, 4115116, -2457795, --3924526, 5488432, 6461779, -4426501, -3932043, -13391171, -4656282, -1690607, -676457, -14982993, -7581691, 795643, -8928700, -7357279, 2422362, -3513820, 875100, -2254858, 444529, -3979287, --904091, -3556233, 2496450, 4941360, -1451699, 3746285, 408022, -1632088, 4425427, 1503239, -178778, 3627637, -474594, -1738925, -2367601, -2673080, -2779381, -2653753, -3242700, -2394444, -108448, -1352378, -3050501, -1546725, 242666, -708133, -1174674, 570157, 1150514, 512712, --1432372, -2025614, -2488397, 183073, -2366527, 2040646, -1334124, -1404991, -1320703, -39728, --966905, 122943, 493384, 936840, -1159104, 1153736, 5376762, -6827925, -192200, 202400, -120259, 11372000, 6045167, 29528, 13877576, 6600828, 12514998, 3142842, 4144107, 13624710, --5475547, -8879308, -5827197, 12744242, 2955474, -7006166, 9496710, -2520609, -5756867, 8720931, -20296942, -5160940, 893890, 3374234, 3774740, -5205501, 542777, 11355357, 1075889, 13937169, --3143379, 14956687, 10377715, 3659849, 8679055, 5679021, -5418101, 3791383, -1488206, -1226750, -1289564, 1102733, -1090385, 4010963, 2586107, 9687836, 6339909, -7934415, 2673080, 3700114, --6049999, 437550, -14099304, -18023294, 7122667, -4558034, -11957189, -2460480, -6495065, 7874823, -1587527, -3602404, -9056475, 7068443, -6587943, 4338454, -7377680, 1134408, -3044058, 11036992, -1922535, -4219269, 4101157, -9294309, 8397198, 1447404, -8169565, 424665, -956167, -2254321, --1090922, 1198833, 2253247, -2291365, 3797288, -823023, -1671279, -1737851, -1514513, -3422552, --411780, -1191853, -3489661, -1204202, 1074816, -2048699, 2013803, 362925, -1330366, 599148, --2369748, -389231, -1697049, -170725, -208843, 126165, 961536, 1359894, 1355062, 84289, -615254, -61740, 587874, -1096827, 811212, -770947, 543850, -8061654, 1202054, 181462, -2239289, -4967130, 5602785, 5897527, -515396, -4156992, -13776644, -12056510, -9041443, 4148939, -1377611, 2089502, -11271605, 7102266, 5235565, 8869107, -9644886, 9150965, 7266011, -5742372, --4526359, -2964064, 9578851, 6391448, -4022237, 809601, 14425185, 7117298, 3821984, 8156680, -5823976, 2101313, -4599910, 944893, 789737, -2139968, -5122286, 12569759, 6060199, -11942693, -8118562, 7818451, 8041790, 6075231, 1802813, -7492034, 355945, -1108102, 11202885, 1344862, -5080947, 9927280, -1669669, -11100880, 2571075, 5784247, 11317239, -15037217, -8276939, 3962107, -290447, 1251446, -8699993, -2307471, -8432631, -1315334, 4205310, -2943126, -4551592, -5820218, -2549063, -1537061, -2710661, -7168301, 393526, -9555228, -40802, -1040993, -4643934, -5440113, -6189048, -2209761, -1375463, -3138011, -5675800, 1928977, 2933463, 1811939, 2324651, 1462973, --3077881, -1873143, -846109, -919660, -2886218, -5790690, -2382096, -274878, -1792612, -300648, --2905009, 130997, -1518271, -1291175, -2078227, -2610803, -1174137, 2340757, -1665374, -999654, -496606, 864362, 777926, -1344862, 2005213, 2683818, 2972117, -928250, -52076, -200790, -466541, 351114, 5240934, 730144, -9293772, 9460739, 6007586, -2776160, 3697967, 5713380, --6300180, -2077690, 24055038, -752156, 9354976, 6609955, -20159502, -10661719, -1177358, -814970, --280247, 11454678, 2519535, -5531381, 11761231, 7281580, -1524177, -1912334, 3722126, -1896765, --4219806, -8940511, -10671920, 5901822, -2377265, -4984310, -566936, -16531866, -3125126, 1112397, -9086540, -10918881, -3211562, 1433445, 687195, 2401961, 767725, 11688753, -13651017, -4515621, -2979097, -430034, -8075076, -1683627, 10543071, 9114994, 7828115, -2163053, -13594645, -6176163, -4857071, -1538135, 9052717, -527744, -222265, -6752763, -4231617, 7945153, -9761387, 6652905, -5156645, -7007776, -3520800, -1632625, 1081795, -7547868, 3630858, 2606508, -3744138, -1162326, --10330470, 3721589, 7923678, 11373610, 962073, 3049427, 5359583, 1660005, -9028558, 6163278, --2190970, 1009317, -6979, -2899103, -3134789, -1675574, 4152697, 735513, 3464965, -393526, -541166, -5012764, -1737314, -2312303, 3745212, -395137, -1660005, 2601677, -1956895, 2034741, --1257889, 321586, -4168266, 953483, -998043, -875636, -2686502, 933082, -455267, -2353105, --4309463, -977105, 388695, -1741609, 1694902, -470836, -2839510, -18292802, -1086627, 2455111, -12315819, 1483911, -460098, 7374459, -5337571, 16050830, -16035797, -1592359, -3405372, 2640868, --747324, -1367410, 4166655, -3081102, -5429913, -3707631, -3195993, -9707163, -1493038, 6796249, --1542967, -4350265, 10237055, -223338, 12306155, -12074227, -6849399, 15125801, -1517734, -995359, -933082, -9637907, -1083406, -12015708, 3525631, -14409615, -334471, 10577968, -3452080, 7182259, -9576703, 5470178, 7545184, -9776419, 9685688, 989990, -25243134, -4332549, 3701188, -2150705, --2787971, -10921028, 8566312, -9322763, -1793686, -10562398, -9804873, -15299210, 13585518, 3758, -15830176, -7968238, 11935714, 15705622, -10364830, 12778601, -15823196, -13269838, -14323179, -5086315, --10089415, 3141232, 4779225, -656593, -1853815, -184147, -11329587, 785442, 137976, 6447283, -2601677, 2461016, 4670240, 2530273, -2458332, -205622, -4610648, -2859911, 128312, 1778653, -86436, 2023467, -1512902, 2182380, -691490, 1101659, -7028177, 315143, 2685428, 1928977, -3911105, -2337536, -3102577, -4239133, -98784, -469225, -3292629, -3702262, 368293, -701153, -597537, -100395, -1053878, 1743757, 5592585, -1497333, -1318018, -838056, -1539209, 4902169, -188979, 474057, -1755031, 2855080, -3279745, -766115, 2157147, 11860015, 20163798, 2813204, --5279589, -10926397, 6819335, 18451716, 245350, 5242545, 1026497, 7324530, 5167383, 5606543, -10160282, -12228309, -896574, -4582730, 15972983, 11742441, -510564, 18250390, 9746355, 1582159, --17153562, -8596377, -13063680, -6127308, 1401233, 4898410, -4642860, 651224, 18687940, -3531537, -83215, 912144, 19200652, -11731703, -4641786, -4798552, -1810329, -11477226, 13247827, 850940, -8908299, -13758928, 1938641, -1523640, -8107825, -3278671, -15081778, 4726612, 355945, 3165391, --1792075, -943282, -17518098, -6000606, 6940667, 11157788, -3173444, 2905009, 23451596, -1537598, -1426466, 4276714, 10611254, -9925133, 2345589, 11831561, -6953552, 8597451, 2600066, 8961986, --11858942, -6084358, 1694902, 2721399, 6121939, 6834367, 6630356, -4505958, 1976759, 4030827, -8007430, 12341589, 5804649, -5881958, -2653753, -4632122, 2075543, 2595234, 5465883, 4879083, -3040300, 5156108, -5485747, -1133335, -5595806, 4877472, -6422050, 6580427, 4831838, -4953708, -3007551, -614717, -2925947, 721555, 1086627, -1788854, 1596117, 8178155, -160524, -25233, --4942434, 2570001, -127775, -171262, -4476430, 4682588, -3792456, 1459752, 2121177, 3712999, --311922, -1777043, -10919417, -16663936, 4631049, -1799054, -16804596, 4591857, 1696512, 15220827, -13477071, -12516072, -14992120, 3337190, -11447162, -6053220, 474057, 22676890, 323733, -2918430, --20296404, -10198400, -1756105, -15174119, -23003844, 15742129, -5932961, -7304129, -1324997, 17072496, --5357972, 1828046, -3434363, -3482682, -9947681, -5352066, 1667521, -24077586, -15457050, -4493610, --8773008, -8191577, -2813204, -9483825, 8164733, 3683471, 2614561, -5808944, 4128001, -34745212, -32245540, 18866180, -3274913, -4466229, 18137110, 1025960, -10863583, -15526844, -1976222, -5495411, --6445672, -9373229, -9509594, 11792370, 11063836, -5096516, 24317032, -13610751, -11124502, -10112500, -48318, 7861938, -28508920, 8334384, -9024800, 14803142, -16161962, 6991133, -1480153, -5564130, -11133629, -21086678, 19710142, 1020055, -279710, -4550518, 565325, -396748, -9980967, 1846836, --2775086, 5091147, 6618545, -6206228, 3015604, 4120484, 9293235, 214212, -3063386, -644245, --857920, -3829500, 2700998, -1576790, -2262911, 2249489, -3731790, -1310502, 867583, 2543695, -3157875, -7583839, -5739150, -5078799, 797790, 2901251, -49392, 1860258, 1684164, 4833986, -2548526, -4201015, 3696893, 585726, -4687957, 16515223, 1363652, 38507604, 12546136, -780610, -1656784, -14899778, -19300510, 24050744, -7122130, 2726767, 31932008, -8319889, -1539746, -6830609, -24902220, 4789426, -10290742, 14699526, -5342403, 21835076, 11465415, 5440113, 3238405, -2418067, --8354785, -2724620, -2263448, -23407034, -5876052, -3769908, 12954695, -7248294, 2447595, 4308389, --16765405, -24981678, -885837, 21575768, -1434519, 19168440, -3313031, -26779658, -10365367, 1225139, -6077916, 4852776, -21780316, 192200, -6229850, 15832323, -16160351, 20013474, 29590714, 19193136, --6012954, 3588982, 11943230, -4243428, 23188528, 26836030, 23661512, 7744900, 25944824, -868657, --10438381, 3369939, -13551159, -17103096, 9355513, -7328288, 21205864, 10973105, 5632850, -7256884, --26086020, -23637352, 16618839, -10450729, -21105470, 14125611, 28168544, 16954384, -9016747, 13470628, -8266739, -2894808, -6641630, 8011725, -9997073, -3004867, -1060857, -6860674, 927176, -1449552, -5810017, 3551938, -1331440, -9137543, 5135171, 4707821, 3228205, -1938104, 313533, -8530879, -707059, -34360, 2241973, 2071248, 237297, 5170067, -1768990, 7134478, 8000987, 2131378, -6500433, 660888, -5117454, -12102681, 2770791, 369904, 2636036, -2009508, -8722005, -19463182, -11388643, 14221710, -220654, 6945499, 4683662, 6868190, 5716065, 2596308, -1562294, 3331821, --4099546, 7358353, -13241384, -36883032, -14809047, 20147154, 1131724, -6060736, -12374875, -124554, -16938814, 21629992, 4570919, -13372381, -2405182, 17284560, -21060372, 1935957, -2685965, 15454366, -17641042, -14278619, 26798986, 5139465, 981937, 37893960, 91805, -11990475, 13194676, -6422587, -1788317, -8195335, 2706366, 25145960, 2789045, 32053878, 13438416, -28158342, -30854508, -6810208, -7847979, 17067126, -23968064, -8529805, -3598646, 28829432, 26342646, -22807886, -1045288, -13966160, -8573828, -4902169, 30120068, 266288, -6847252, 19755238, -4239670, -23658290, -12068321, -3997004, -24226836, -21809844, 12903692, 37806988, 17759690, 25321516, -7043210, 10196789, -7101729, -15932181, --15389942, 7793755, -11017128, -903017, -4120484, 6747931, -437013, 15234249, -3731253, -7287486, --2796561, -3285650, 3508988, -2646237, 5645735, -10780368, 7512435, -7203197, -3503620, 1968706, --3097745, -3512210, 4609037, -4863514, -2096481, -1603097, -4177393, -13232794, -7684770, -1494649, --1882269, -4078072, -5463199, -1438277, 3498788, -2510409, 1896765, -2251637, -515396, 2698850, --10387915, 850404, -1817845, -7805566, -711354, -18296024, 13734769, 19252190, 16775069, -28921772, --13222594, 17627620, 54956792, 2926483, 12225088, -16229071, 5294084, -1166084, -2200097, -15263777, -4859219, -5614596, 26549878, 20393578, -27031450, -12512850, 29294362, 14315663, 10747619, 2697240, -15982647, 17856864, 6147709, 10526965, 10385768, -13593035, 2281702, -13319230, -5473399, 3194382, --2214056, 1832340, -10843719, -10388989, 8083666, -2425583, 11023034, 8069707, -24990804, 18557480, -4103841, 14872935, -16765942, 9449465, 15694347, -12265890, -19195282, -20006494, -21294984, -21984864, --17595408, 6102075, 32301912, 8148090, 10175851, 14840186, 1381369, -589484, -12156368, 21115670, --26844082, -54802708, 18988588, -12737799, 2689187, -46530600, 11738682, 14436996, 2837900, 8991514, -8102456, -7078106, -11510512, -18561774, 6127845, 3871913, -13677323, 10031970, -5010616, -23859080, --12609487, -446140, -3928821, 2331630, 1904818, 6857989, 3580392, 1110786, -155156, 5413270, --3120831, -7718593, -13125420, -8216810, -8376797, -3171297, -4491462, 4806069, 7892003, 5524402, --10402948, -1035087, -4207458, -81068, 6459631, 1723893, -9163313, -17668422, -1205812, 586263, -1751810, -6393059, -2347200, -6677064, -1030255, -8679055, -8679592, 5656472, -8475044, 3464965, -1769527, -4685273, -1493038, 5407901, -4751308, 1971927, -6474663, 13002477, 9284646, 12419435, --17715130, -9142912, -2535641, 11353209, -23627152, 39261368, 18585934, -3175055, 21344914, 12883291, -20337208, -10700374, -13785234, -13316546, 24642374, 8792872, 4400731, 22295712, -19567334, -63136020, --4270271, 4231617, 7449621, -35537096, 27484570, 20043002, -38237020, -29375966, 874563, 15736223, -1268089, 8939974, 20167018, -5364951, 12495670, -18439368, -21182778, -16834662, -22003118, -34149284, -9443559, 3534758, -22996866, 30260192, 11693048, -7401303, -7286949, -17873506, -13453448, -31140124, --16982838, 11059004, 27550604, -10537702, 2697240, 11347304, -24575266, 17661442, 23864448, 3507378, --6209449, 20434918, 5528697, 2276333, -14740865, -17183628, -1331977, 30554398, -9481140, -28264642, --570157, -36009544, -37541772, -39069172, -18787798, -20638928, -13223667, 16728898, -2430415, 15029701, --3190087, -5043902, -14192183, -3862249, -4232691, 8032663, -6276558, -9101036, -1855963, -3622805, -1255741, -13244069, 2421288, -6156836, -5337034, 6864432, -6372121, -2203318, 2211908, -4792110, -10185515, -6612102, 1471026, 16514686, 1978369, 9592273, -3776887, -5973763, 16802986, 2387465, --8988293, 181462, 117575, 1158031, 2342905, -4944581, 10485089, 471910, -839666, -5267241, -945967, -5352603, -13828721, -23897734, -12525735, -12841415, 15557982, 30622044, 11304354, -13973139, --29535416, 31671088, 17047262, -15290620, -8242579, -8165270, 1771674, 7444789, -9768366, 16449725, -15301895, 843424, -10301479, -9769440, -9197672, -1196148, 5939403, -4646081, -10183904, -24215026, -7435662, 21247740, -12238509, 18780282, 548145, 12593918, -10577968, 14003741, 40680856, -15294915, -17732310, 35327716, 6100464, -6235219, -9863392, 10210211, 717260, 18000744, -13861470, 48479444, --15076946, -32647658, 7425999, -14913200, 38343320, 12521440, -12080669, 2132988, -23244364, -31863288, -38920992, 4375498, -10580652, 38442104, -20045686, 4928475, -11366094, 22232362, -28586228, -32078574, --22923852, 6984691, 13639742, 25458418, 10810433, 26907434, 42249056, -5344550, 8400419, -5730560, -5223754, -1494112, 1571958, -31292594, 1020592, -43162272, -14507863, -8640937, 7459822, -1623498, -9256728, -3585224, -13032005, -13699872, -3272228, -9127879, -10097468, -17343078, -196495, -1998234, -12824235, 5345087, -10769094, 9429601, 4300336, 7735236, 10292889, -13937706, 3605088, -5931350, --2834142, 13499082, -4828617, 6597070, 9035537, -5808407, -15154255, -7869991, 5196374, -24809878, --7920457, 270583, -3732864, -5837398, 10815265, -11895986, -13093208, 8672613, 14623827, -7157563, -12163347, -8581882, 29442000, -4103305, 549219, 35958540, 3554086, -19211926, -22982906, -19735912, -36271000, -24326158, 14186814, 17411798, -12105902, 3740917, -20474110, -4370666, 15991774, -14409615, -11446625, -4728759, -25649008, -55358372, -5322538, 50044424, 20551956, 5224828, -10226854, -14917495, --3065533, -19614042, 6053220, -27694486, 32926294, 2529736, 3695819, 2790655, -11538967, -33433636, --13127031, 26941792, -22280680, -5585068, -15516643, 12053826, -11209328, 37245420, -6325413, 7706782, --13893145, -34710316, 7368554, -26499412, -6307697, -2311229, -48979808, -41021232, -39126616, 12895102, --7493644, -20995410, -14003204, -13431436, -12735115, -18744848, -12994960, -3253975, -44029320, 12200391, -4529043, 16100222, -10045392, 37945500, -4340065, 7311108, -13544716, -5242545, 20080046, -40531068, -16818556, 26535382, -27645630, -17661442, 1240172, 4274030, -7619272, -13125957, -21760988, -1341640, -56371, -12893492, 10495826, -9522479, -17446694, -9432285, -7764227, 10721312, -773094, 314606, --871342, 7985418, -21413634, -6051072, -3024194, -4130148, -1967095, 289373, -25601226, 722091, --8659728, -6692633, -2708514, -11315091, 2514167, -3280281, 1680943, 363998, -2772402, -2893197, --6861211, -1136556, -5755793, -1311576, 2867965, -5804649, -9832791, 154082, -2878165, -2187749, --6424198, -10318122, -7615514, -2766496, -2006287, -2012192, 2872260, -7604777, -8224326, 14804215, -9437654, 17977660, -6583648, -38278360, 11260331, 253403, 63377612, 64263448, 8114267, 347892, -15514496, 7342247, 16552804, 27575300, 10691784, 28645822, 44019656, -11158862, 6051072, -36174900, --4772783, 4434017, -4323959, -10948409, -21452288, -18571438, 10462003, 9822590, -47390132, 33793340, -9519258, 47798156, -2608119, -9751723, 16030965, -3561602, 50898048, 12650826, -2271501, 9503152, -10325638, -13787382, -30569430, -24434068, -11826192, 37549288, 819802, 41297720, 5417028, 40374840, --11390790, -56031068, -20577188, -16404091, 29214904, 3326989, -26819386, -39495444, -27150098, -5660230, -34249144, -29720100, -25419764, -17128330, 30594662, -15101642, -8531953, -39299488, -38641284, 12119324, -6865505, 52269752, 13762686, -5701032, -13906030, 16295106, 17297444, 55832428, 1286343, -18272402, --23978266, -1690070, -2236604, 1153199, 8961986, 7939247, -12789339, -3062312, 4468377, 11558294, --12283606, -10273562, 15960635, 23066658, 10992969, 6994891, 9224516, -9863392, -3951907, -6241125, --1076426, -1394791, 5279589, -13959, 30418570, 6270116, -1124208, -9309878, -15715822, 15111306, -24690156, -8938901, 539555, 913217, 3193845, 14015015, 6236830, 10410464, 10758893, 2692408, -8382166, 2712809, -455803, 2733210, -7423314, -2524904, 1866163, -4496294, -3022583, -9777493, --592706, 3172907, 652298, 38765836, 14474040, -18606872, 36184564, -2112587, -71667968, -21626234, -44863080, 50203336, -35452272, -35156456, -36086852, 20122458, 30429844, 61389040, 18308908, 8004746, --35204772, -3464965, -2414845, 13860396, 30408368, 22342956, 1530619, -37017788, -72307384, -19043884, --36729488, 54232016, 57090316, 100179576, -30302604, -96304440, -21304648, -33084134, 74538624, 25465398, -75594648, 19552302, -25718802, -73406896, -49974092, 2645700, 8777839, 82247016, 33056216, -2905546, --68097784, -118192672, -31272730, 2462090, 54187992, 124231928, 26691612, 37400576, -80514528, -122829088, -4883378, 28087476, 97311608, 57354456, 40635224, -22797150, -79533664, -64821792, -1080721, 18117246, --2157684, 49200460, -41206452, -38277284, -9920838, -87373056, 13148506, 4024921, 23313620, -17697950, --35748088, -19146428, -15400679, -40087616, 8671539, 11477763, -13265006, -2204929, -37957312, 5137318, -10348187, 12124693, 16938814, 5350993, -19686520, 6503654, -6568079, -3538516, 2312303, 30187178, -4733591, -1196685, -8268349, -23377506, -5034776, -9484362, 8440684, -4443681, 9414031, 6197101, --21691196, -48267380, -24155432, -35530116, 28311888, 28770912, 33978560, 19527606, -45287208, -40633076, --62951336, -15344308, 50108848, 55755116, 54089744, 2407329, -60765196, -45383308, -35624068, -1015760, -89338544, 62050468, 24930674, -48483740, -56547540, -42315628, 20157892, 21059298, 30641370, 16030429, --10039486, -14208289, -26972932, -11766063, 7537131, 919660, 9026411, 12805445, -850404, -41779832, -55261732, -1971927, 8709120, -23714662, -51065012, 30115774, -51425792, 54552528, 8752606, 4167192, -12364137, -34033856, 33675764, 2467996, 23613730, -32660006, 11939472, -482110, 40290016, -16528108, -10401337, 25672630, -29399052, -18092012, 3547106, -28169080, 45138496, -10720775, -17722108, 39288752, -46625092, -13033078, -33426120, -9114457, -29390462, -6249178, 19144280, -3598109, -36754184, 3764002, -20713016, -13843216, 23285702, -19480898, 9357660, 23633594, -9153649, 15350213, -41941428, -43483324, -44156020, 23612120, 67825584, -3421478, -16489453, 56419764, -32000190, -29631516, 20568598, 18635864, -32911260, -30005178, -13482439, 8082592, -5708549, 31717796, -25306484, -80679352, 21356724, 44205416, -1126355, -37685652, 7553237, 22228066, -8419747, -10266582, -29354490, -10204305, -24137716, 24275692, -6577743, -17970144, -4182761, 29109140, -20503638, -8017094, -18478024, -2760053, 14920716, -21414706, -11700565, 30462592, 12421582, -943282, -8283918, -2242510, -10915659, -14943802, 23978802, -10280541, -11199664, -3777961, -11398843, -581431, 3114925, 1736241, 9110699, 9845676, -17307644, -5926518, -9489730, 6988986, 18353468, -2823404, -14778982, 5615133, -17303350, 8101919, -15703474, -9630390, -926639, -3977677, -10305774, 24698746, -10332618, 4725001, 11633456, 1921998, 9277666, 16259672, -380105, -3404835, 1519345, -1395328, -21291764, -13073344, 81109384, 22217328, 22563074, -68700152, --17145510, -53813256, -45434848, 41050224, 43206296, 85499376, 39537860, -11342472, -16416976, -9836012, -27096948, 18900004, 709743, 41661184, 8240969, -16405701, -19488414, -15670725, 29998200, 212064, -26255672, 12386686, 15908559, 4141959, -6413997, 3250753, -31139, 4132296, -6657200, -1516124, -8697309, 7409893, 56121264, 45271104, 36972688, -3020436, 10206453, -22597434, -3637301, -13975824, --25566866, -26586384, 8226473, 14827838, 21414706, 26299158, 21645562, -13254806, -34232500, 52493092, --37219112, -16130287, -9441949, 18165564, 2454037, 25819196, 26780732, 23592792, -31354872, -11041287, -4372814, -12125766, -50639276, 34169148, -11824582, -8904004, 19246286, 39620000, 44754632, 32840930, -31970126, 27801860, -29335700, 4065187, -7481833, -8901320, 16814260, 13552769, 17908404, 8916889, --8151848, -14424111, -21202642, -22728430, -46074800, -18186502, 6791417, -2408403, 28066000, 173946, --12834436, -4061965, -18377092, 7182796, 2092723, -1138703, -297963, 12144557, 26262114, -3016678, -1238561, 14717779, 972810, 380641, -5362267, -1512365, -6358699, -5819144, 1467268, -12334609, -5464272, 7378754, -9357660, -13450764, 3637301, 2947958, -5108327, 13586055, 17816598, -2259690, -2538863, -5659157, -18329310, -7471633, 3639448, 3265249, -104901352, -52183316, -72059888, 52071108, -11438035, 148937120, 153804928, 153387776, 175138032, 172605616, 123903368, 77227272, 96633544, 42856256, -8967892, -81463184, -71035000, -178050560, -155815504, -139755552, -82431696, -103877544, -79259864, -6384469, --25336548, -10095321, -12509629, 766652, -203474, 4855461, 20315196, 21950504, 20830592, 61567284, -63050120, 66960688, 47747688, 133797360, 34961032, 56332256, 93586800, 104457896, 38800196, 105128992, -126355256, 99761888, 86526408, 88099976, 9723269, 52818436, 106365400, 105218648, 67760088, 88332448, -77139760, -867583, -28472948, -19908784, -52489868, -64666640, -8272107, -72696080, -111094160, -86439976, --103465760, -152930896, -69998840, -103335304, -114671872, -162318096, -132064336, -149668880, -171130832, -113867096, --193507600, -228822432, -229763040, -124867584, -155431104, -195800576, -38412040, -87065968, -40840308, -21749714, -64385316, 28841242, 94410896, 50309636, 89199488, 85028008, 55901684, 44205952, 69210176, 128147864, -130287296, 130842424, 133536440, 138847168, 168559216, 150701808, 125078576, 153855936, 173469968, 138782208, -104387032, 124616328, 104819752, 67877128, 85562192, 58022324, 28947006, 12674985, 26656178, 8070244, --10463077, -7090991, -13562433, -32936494, -50367080, -50033684, -54591180, -46575164, -58360552, -92010008, --82702280, -95079304, -107303312, -125062472, -124727464, -103203768, -103657960, -84851376, -53694072, -60605208, --41089416, -28736552, 3779571, 113280, 869194, 5590437, 19352586, 22138946, 7961796, 17643188, -27967754, 22295712, 10387378, 11760157, 21060910, 12521440, 5887327, 8785356, 12328704, 11211475, -7853348, 9605694, 15520401, 14835354, 7014756, 2393371, 5186173, 9203578, 5516349, 3758, -3732327, 6972343, 5464809, 2654290, 4760435, 5076652, 3954054, 3482682, 1747515, 1334661, -3897146, 3122978, 3411278, 1404454, -2167348, -2742874, 1567126, 3263102, -705448, -2262911, -617402, 2147, 659278, 1937030, 1363115, 2318746, 4214437, 3942243, 6271189, 8435853, -9817758, 7620883, 7777649, 8529805, 7134478, 5009006, 5712844, 6808060, 5264556, 2521683, -3285113, 1961190, 1528472, -106300, -2600066, -2378338, -3318399, -6832219, -9496173, -9353902, --8200703, -10675141, -10042170, -9166534, -8208756, -7983271, -6602439, -5299990, -3601330, -3008625, --1858110, -1100049, -278636, 94489, 845572, 851477, 1544578, 1047972, 1236951, 774168, -1088237, 488016, 637803, 130997, 282931, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, }, +2763275, -3663607, -679142, 2626909, -504122, 2792266, -6819871, -4780299, -1229971, -5654862, +2344515, -1221918, -674847, -3804804, -1764158, 3631932, 3534221, -1354525, -1135482, -2328409, +-5517959, 6151467, 3585761, 205622, 598074, -286152, 134218, 4963909, -2534568, 950798, +-7904888, -6397891, -1655710, 632971, -5520644, -969589, 1906966, 519691, 57982, -2702608, +-2156074, 5190468, -2421288, -2145336, -762357, -677531, 2226941, -1140851, -3406983, -71404, +2916283, -4160750, 144418, -4459787, 279710, -3253438, 4967667, -237297, -5310727, -720481, +-548145, 675921, -7566659, -863825, 591632, -4988068, 2282775, 155156, -5836324, 2686502, +3534221, -3049964, -3587372, -6330782, 3307125, 1974074, 5885179, 2965138, -911607, 1195075, +-852551, 1838783, 1850594, 4127464, 1009317, -1735167, -92879, 522375, -162672, 2376728, +576599, -760746, -1162326, 1178432, 879931, 1792075, 847182, 722628, 1021665, 993211, +366683, 631897, -135291, -258772, 349503, 290447, 421444, -204548, 501974, -668404, +-18254, -5511517, 2505040, -6866042, -1879585, -986232, -3431679, 3262028, 7671349, -3158949, +-998580, 329639, -3144453, 2167348, -458488, -2604898, -4352413, -2355253, 6918119, 6630893, +3761855, 7707856, 4571993, 2430415, 7304129, -4562866, 1618129, 3083787, -131533, 1222992, +-2153926, 1363652, -10076530, 181462, -576599, 3608846, -2275259, -1316944, -695785, 2755759, +-3186329, -550830, 914828, 1929514, 1919314, -572841, -3419868, 612033, 1203665, 2434173, +1869385, 2836289, -3216394, -1949915, -586263, -5750961, -673236, 1479079, 4912906, 5444945, +-750009, 2985002, 2253247, -448824, 2037425, 2387465, 3544959, -1461363, -47245, -2697240, +459025, -2330020, 1575179, -3430605, -3202972, 1880122, -20938, -6373195, -594316, -4784057, +-1287953, -717260, -802085, -6337761, 605590, 2176475, -1858110, -1841467, 1085553, 748935, +455267, -1293322, -3383897, -222265, -1482838, 1236951, 46171, 41339, -379031, -1448478, +-1553168, -1807644, 124554, -811749, 762357, -1153199, 435402, 212064, -1004486, -75162, +-1118839, -457951, 64961, -48855, -995359, -296353, -169114, -6964290, -6482717, 2384244, +-724239, 5379447, 5493263, 409633, 172336, 10443213, -2793876, -286689, 8846559, 328028, +-5050345, -7491497, 5451387, -2216203, 74625, -4651450, 1473174, -3331284, 3716757, 16336982, +-5934571, -4840428, -5861557, -6417218, 1209033, -5237713, -12855911, -352724, 1335198, 4832, +-5085778, -1104880, 4232691, -5292474, -3064459, 7626788, 2562485, -1970853, -1780264, 4904316, +-2399813, 3505767, 3266860, -7003481, -4587562, -4154307, 4613869, -3559991, -2061584, -1942399, +-2279554, -381715, -4663261, 24696, -1375463, 1151051, -605054, -10241350, 4791036, -5730560, +4559645, 833761, -8360154, 1699196, 5665599, 1726040, 9403831, -3963718, 558883, 1089311, +2234994, 3346317, -3646427, 1396938, 1279363, -5441187, 7502234, 536334, -1013612, 3167002, +-1027034, 1420560, -1319092, -2838974, -154082, -1826435, 2493229, -632971, 508954, 2913599, +1050656, 1112933, -602369, 1589138, 325881, -420370, 1089848, 2123325, -1484985, 145492, +-1568737, 1017370, -479963, 3149285, -4392678, 2094870, 2154463, -2287607, 1014686, -1100585, +-9439801, 2950643, 8773544, 7397545, 8225399, 1506460, -1826435, -7041599, -3764539, -3279208, +-2719788, 7396471, 10153840, 789737, -732292, 7324530, -11829951, 285615, -984621, -158914, +-3875671, -3914326, 4267587, 5356361, 144418, -1129040, 2093260, -5686000, -4367445, 4438849, +-4810900, 9201431, 8273181, 1430761, 5085242, 4358318, 850940, -3708168, 1275605, -164819, +-6491306, 6311992, -581431, 2970507, 5079873, -6036577, -2381559, -7180649, -1655710, 1682554, +6745246, -6918656, -2785286, 5102421, -1093069, -4417374, 7401303, -6158446, -13022341, 2216203, +-7346542, -3245385, 3511673, -3117610, 600222, 798864, -3198677, 5571647, -5106179, -5740761, +-6952479, -745177, -3031710, 477815, 1811939, -4213900, 1090922, 1233729, 283468, -1999307, +1090922, 922881, 2866891, 453119, -962073, -1969779, -1309965, -865973, -550293, -686658, +-1264868, 390842, 532039, 854162, 230318, -372588, -1019518, -379568, 1407139, -1456531, +-1569274, -442919, -76236, -122407, 1067836, 1317481, 1187022, -749472, 394600, 275415, +447750, 257161, -446677, 2813741, -1386738, 153008, -11738682, 2488397, 11090679, 875100, +1744831, 3347390, 10387378, 1404991, -9972377, 11057930, 4874788, 3981972, 6750615, 5832029, +53687, -2091649, 6365679, 4844186, 1668058, -4596152, 5535139, 2583423, 8191577, 9532143, +3636227, -2378338, 219043, -92879, 3981972, 12103218, 7204271, -6754373, 11734924, 445603, +-1449015, 1525787, -8660265, 9592273, -1287953, 146566, -1156957, 2425046, -1308891, 4938139, +-6991133, 9796820, 8367670, -344134, -1578401, -5495948, -10427644, -3605088, 4115116, -2457795, +-3924526, 5488432, 6461779, -4426501, -3932043, -13391171, -4656282, -1690607, -676457, -14982993, +7581691, 795643, -8928700, -7357279, 2422362, -3513820, 875100, -2254858, 444529, -3979287, +-904091, -3556233, 2496450, 4941360, -1451699, 3746285, 408022, -1632088, 4425427, 1503239, +178778, 3627637, -474594, -1738925, -2367601, -2673080, -2779381, -2653753, -3242700, -2394444, +108448, -1352378, -3050501, -1546725, 242666, -708133, -1174674, 570157, 1150514, 512712, +-1432372, -2025614, -2488397, 183073, -2366527, 2040646, -1334124, -1404991, -1320703, -39728, +-966905, 122943, 493384, 936840, -1159104, 1153736, 5376762, -6827925, -192200, 202400, +120259, 11372000, 6045167, 29528, 13877576, 6600828, 12514998, 3142842, 4144107, 13624710, +-5475547, -8879308, -5827197, 12744242, 2955474, -7006166, 9496710, -2520609, -5756867, 8720931, +20296942, -5160940, 893890, 3374234, 3774740, -5205501, 542777, 11355357, 1075889, 13937169, +-3143379, 14956687, 10377715, 3659849, 8679055, 5679021, -5418101, 3791383, -1488206, -1226750, +1289564, 1102733, -1090385, 4010963, 2586107, 9687836, 6339909, -7934415, 2673080, 3700114, +-6049999, 437550, -14099304, -18023294, 7122667, -4558034, -11957189, -2460480, -6495065, 7874823, +1587527, -3602404, -9056475, 7068443, -6587943, 4338454, -7377680, 1134408, -3044058, 11036992, +1922535, -4219269, 4101157, -9294309, 8397198, 1447404, -8169565, 424665, -956167, -2254321, +-1090922, 1198833, 2253247, -2291365, 3797288, -823023, -1671279, -1737851, -1514513, -3422552, +-411780, -1191853, -3489661, -1204202, 1074816, -2048699, 2013803, 362925, -1330366, 599148, +-2369748, -389231, -1697049, -170725, -208843, 126165, 961536, 1359894, 1355062, 84289, +615254, -61740, 587874, -1096827, 811212, -770947, 543850, -8061654, 1202054, 181462, +2239289, -4967130, 5602785, 5897527, -515396, -4156992, -13776644, -12056510, -9041443, 4148939, +1377611, 2089502, -11271605, 7102266, 5235565, 8869107, -9644886, 9150965, 7266011, -5742372, +-4526359, -2964064, 9578851, 6391448, -4022237, 809601, 14425185, 7117298, 3821984, 8156680, +5823976, 2101313, -4599910, 944893, 789737, -2139968, -5122286, 12569759, 6060199, -11942693, +8118562, 7818451, 8041790, 6075231, 1802813, -7492034, 355945, -1108102, 11202885, 1344862, +5080947, 9927280, -1669669, -11100880, 2571075, 5784247, 11317239, -15037217, -8276939, 3962107, +290447, 1251446, -8699993, -2307471, -8432631, -1315334, 4205310, -2943126, -4551592, -5820218, +2549063, -1537061, -2710661, -7168301, 393526, -9555228, -40802, -1040993, -4643934, -5440113, +6189048, -2209761, -1375463, -3138011, -5675800, 1928977, 2933463, 1811939, 2324651, 1462973, +-3077881, -1873143, -846109, -919660, -2886218, -5790690, -2382096, -274878, -1792612, -300648, +-2905009, 130997, -1518271, -1291175, -2078227, -2610803, -1174137, 2340757, -1665374, -999654, +496606, 864362, 777926, -1344862, 2005213, 2683818, 2972117, -928250, -52076, -200790, +466541, 351114, 5240934, 730144, -9293772, 9460739, 6007586, -2776160, 3697967, 5713380, +-6300180, -2077690, 24055038, -752156, 9354976, 6609955, -20159502, -10661719, -1177358, -814970, +-280247, 11454678, 2519535, -5531381, 11761231, 7281580, -1524177, -1912334, 3722126, -1896765, +-4219806, -8940511, -10671920, 5901822, -2377265, -4984310, -566936, -16531866, -3125126, 1112397, +9086540, -10918881, -3211562, 1433445, 687195, 2401961, 767725, 11688753, -13651017, -4515621, +2979097, -430034, -8075076, -1683627, 10543071, 9114994, 7828115, -2163053, -13594645, -6176163, +4857071, -1538135, 9052717, -527744, -222265, -6752763, -4231617, 7945153, -9761387, 6652905, +5156645, -7007776, -3520800, -1632625, 1081795, -7547868, 3630858, 2606508, -3744138, -1162326, +-10330470, 3721589, 7923678, 11373610, 962073, 3049427, 5359583, 1660005, -9028558, 6163278, +-2190970, 1009317, -6979, -2899103, -3134789, -1675574, 4152697, 735513, 3464965, -393526, +541166, -5012764, -1737314, -2312303, 3745212, -395137, -1660005, 2601677, -1956895, 2034741, +-1257889, 321586, -4168266, 953483, -998043, -875636, -2686502, 933082, -455267, -2353105, +-4309463, -977105, 388695, -1741609, 1694902, -470836, -2839510, -18292802, -1086627, 2455111, +12315819, 1483911, -460098, 7374459, -5337571, 16050830, -16035797, -1592359, -3405372, 2640868, +-747324, -1367410, 4166655, -3081102, -5429913, -3707631, -3195993, -9707163, -1493038, 6796249, +-1542967, -4350265, 10237055, -223338, 12306155, -12074227, -6849399, 15125801, -1517734, -995359, +933082, -9637907, -1083406, -12015708, 3525631, -14409615, -334471, 10577968, -3452080, 7182259, +9576703, 5470178, 7545184, -9776419, 9685688, 989990, -25243134, -4332549, 3701188, -2150705, +-2787971, -10921028, 8566312, -9322763, -1793686, -10562398, -9804873, -15299210, 13585518, 3758, +15830176, -7968238, 11935714, 15705622, -10364830, 12778601, -15823196, -13269838, -14323179, -5086315, +-10089415, 3141232, 4779225, -656593, -1853815, -184147, -11329587, 785442, 137976, 6447283, +2601677, 2461016, 4670240, 2530273, -2458332, -205622, -4610648, -2859911, 128312, 1778653, +86436, 2023467, -1512902, 2182380, -691490, 1101659, -7028177, 315143, 2685428, 1928977, +3911105, -2337536, -3102577, -4239133, -98784, -469225, -3292629, -3702262, 368293, -701153, +597537, -100395, -1053878, 1743757, 5592585, -1497333, -1318018, -838056, -1539209, 4902169, +188979, 474057, -1755031, 2855080, -3279745, -766115, 2157147, 11860015, 20163798, 2813204, +-5279589, -10926397, 6819335, 18451716, 245350, 5242545, 1026497, 7324530, 5167383, 5606543, +10160282, -12228309, -896574, -4582730, 15972983, 11742441, -510564, 18250390, 9746355, 1582159, +-17153562, -8596377, -13063680, -6127308, 1401233, 4898410, -4642860, 651224, 18687940, -3531537, +83215, 912144, 19200652, -11731703, -4641786, -4798552, -1810329, -11477226, 13247827, 850940, +8908299, -13758928, 1938641, -1523640, -8107825, -3278671, -15081778, 4726612, 355945, 3165391, +-1792075, -943282, -17518098, -6000606, 6940667, 11157788, -3173444, 2905009, 23451596, -1537598, +1426466, 4276714, 10611254, -9925133, 2345589, 11831561, -6953552, 8597451, 2600066, 8961986, +-11858942, -6084358, 1694902, 2721399, 6121939, 6834367, 6630356, -4505958, 1976759, 4030827, +8007430, 12341589, 5804649, -5881958, -2653753, -4632122, 2075543, 2595234, 5465883, 4879083, +3040300, 5156108, -5485747, -1133335, -5595806, 4877472, -6422050, 6580427, 4831838, -4953708, +3007551, -614717, -2925947, 721555, 1086627, -1788854, 1596117, 8178155, -160524, -25233, +-4942434, 2570001, -127775, -171262, -4476430, 4682588, -3792456, 1459752, 2121177, 3712999, +-311922, -1777043, -10919417, -16663936, 4631049, -1799054, -16804596, 4591857, 1696512, 15220827, +13477071, -12516072, -14992120, 3337190, -11447162, -6053220, 474057, 22676890, 323733, -2918430, +-20296404, -10198400, -1756105, -15174119, -23003844, 15742129, -5932961, -7304129, -1324997, 17072496, +-5357972, 1828046, -3434363, -3482682, -9947681, -5352066, 1667521, -24077586, -15457050, -4493610, +-8773008, -8191577, -2813204, -9483825, 8164733, 3683471, 2614561, -5808944, 4128001, -34745212, +32245540, 18866180, -3274913, -4466229, 18137110, 1025960, -10863583, -15526844, -1976222, -5495411, +-6445672, -9373229, -9509594, 11792370, 11063836, -5096516, 24317032, -13610751, -11124502, -10112500, +48318, 7861938, -28508920, 8334384, -9024800, 14803142, -16161962, 6991133, -1480153, -5564130, +11133629, -21086678, 19710142, 1020055, -279710, -4550518, 565325, -396748, -9980967, 1846836, +-2775086, 5091147, 6618545, -6206228, 3015604, 4120484, 9293235, 214212, -3063386, -644245, +-857920, -3829500, 2700998, -1576790, -2262911, 2249489, -3731790, -1310502, 867583, 2543695, +3157875, -7583839, -5739150, -5078799, 797790, 2901251, -49392, 1860258, 1684164, 4833986, +2548526, -4201015, 3696893, 585726, -4687957, 16515223, 1363652, 38507604, 12546136, -780610, +1656784, -14899778, -19300510, 24050744, -7122130, 2726767, 31932008, -8319889, -1539746, -6830609, +24902220, 4789426, -10290742, 14699526, -5342403, 21835076, 11465415, 5440113, 3238405, -2418067, +-8354785, -2724620, -2263448, -23407034, -5876052, -3769908, 12954695, -7248294, 2447595, 4308389, +-16765405, -24981678, -885837, 21575768, -1434519, 19168440, -3313031, -26779658, -10365367, 1225139, +6077916, 4852776, -21780316, 192200, -6229850, 15832323, -16160351, 20013474, 29590714, 19193136, +-6012954, 3588982, 11943230, -4243428, 23188528, 26836030, 23661512, 7744900, 25944824, -868657, +-10438381, 3369939, -13551159, -17103096, 9355513, -7328288, 21205864, 10973105, 5632850, -7256884, +-26086020, -23637352, 16618839, -10450729, -21105470, 14125611, 28168544, 16954384, -9016747, 13470628, +8266739, -2894808, -6641630, 8011725, -9997073, -3004867, -1060857, -6860674, 927176, -1449552, +5810017, 3551938, -1331440, -9137543, 5135171, 4707821, 3228205, -1938104, 313533, -8530879, +707059, -34360, 2241973, 2071248, 237297, 5170067, -1768990, 7134478, 8000987, 2131378, +6500433, 660888, -5117454, -12102681, 2770791, 369904, 2636036, -2009508, -8722005, -19463182, +11388643, 14221710, -220654, 6945499, 4683662, 6868190, 5716065, 2596308, -1562294, 3331821, +-4099546, 7358353, -13241384, -36883032, -14809047, 20147154, 1131724, -6060736, -12374875, -124554, +16938814, 21629992, 4570919, -13372381, -2405182, 17284560, -21060372, 1935957, -2685965, 15454366, +17641042, -14278619, 26798986, 5139465, 981937, 37893960, 91805, -11990475, 13194676, -6422587, +1788317, -8195335, 2706366, 25145960, 2789045, 32053878, 13438416, -28158342, -30854508, -6810208, +7847979, 17067126, -23968064, -8529805, -3598646, 28829432, 26342646, -22807886, -1045288, -13966160, +8573828, -4902169, 30120068, 266288, -6847252, 19755238, -4239670, -23658290, -12068321, -3997004, +24226836, -21809844, 12903692, 37806988, 17759690, 25321516, -7043210, 10196789, -7101729, -15932181, +-15389942, 7793755, -11017128, -903017, -4120484, 6747931, -437013, 15234249, -3731253, -7287486, +-2796561, -3285650, 3508988, -2646237, 5645735, -10780368, 7512435, -7203197, -3503620, 1968706, +-3097745, -3512210, 4609037, -4863514, -2096481, -1603097, -4177393, -13232794, -7684770, -1494649, +-1882269, -4078072, -5463199, -1438277, 3498788, -2510409, 1896765, -2251637, -515396, 2698850, +-10387915, 850404, -1817845, -7805566, -711354, -18296024, 13734769, 19252190, 16775069, -28921772, +-13222594, 17627620, 54956792, 2926483, 12225088, -16229071, 5294084, -1166084, -2200097, -15263777, +4859219, -5614596, 26549878, 20393578, -27031450, -12512850, 29294362, 14315663, 10747619, 2697240, +15982647, 17856864, 6147709, 10526965, 10385768, -13593035, 2281702, -13319230, -5473399, 3194382, +-2214056, 1832340, -10843719, -10388989, 8083666, -2425583, 11023034, 8069707, -24990804, 18557480, +4103841, 14872935, -16765942, 9449465, 15694347, -12265890, -19195282, -20006494, -21294984, -21984864, +-17595408, 6102075, 32301912, 8148090, 10175851, 14840186, 1381369, -589484, -12156368, 21115670, +-26844082, -54802708, 18988588, -12737799, 2689187, -46530600, 11738682, 14436996, 2837900, 8991514, +8102456, -7078106, -11510512, -18561774, 6127845, 3871913, -13677323, 10031970, -5010616, -23859080, +-12609487, -446140, -3928821, 2331630, 1904818, 6857989, 3580392, 1110786, -155156, 5413270, +-3120831, -7718593, -13125420, -8216810, -8376797, -3171297, -4491462, 4806069, 7892003, 5524402, +-10402948, -1035087, -4207458, -81068, 6459631, 1723893, -9163313, -17668422, -1205812, 586263, +1751810, -6393059, -2347200, -6677064, -1030255, -8679055, -8679592, 5656472, -8475044, 3464965, +1769527, -4685273, -1493038, 5407901, -4751308, 1971927, -6474663, 13002477, 9284646, 12419435, +-17715130, -9142912, -2535641, 11353209, -23627152, 39261368, 18585934, -3175055, 21344914, 12883291, +20337208, -10700374, -13785234, -13316546, 24642374, 8792872, 4400731, 22295712, -19567334, -63136020, +-4270271, 4231617, 7449621, -35537096, 27484570, 20043002, -38237020, -29375966, 874563, 15736223, +1268089, 8939974, 20167018, -5364951, 12495670, -18439368, -21182778, -16834662, -22003118, -34149284, +9443559, 3534758, -22996866, 30260192, 11693048, -7401303, -7286949, -17873506, -13453448, -31140124, +-16982838, 11059004, 27550604, -10537702, 2697240, 11347304, -24575266, 17661442, 23864448, 3507378, +-6209449, 20434918, 5528697, 2276333, -14740865, -17183628, -1331977, 30554398, -9481140, -28264642, +-570157, -36009544, -37541772, -39069172, -18787798, -20638928, -13223667, 16728898, -2430415, 15029701, +-3190087, -5043902, -14192183, -3862249, -4232691, 8032663, -6276558, -9101036, -1855963, -3622805, +1255741, -13244069, 2421288, -6156836, -5337034, 6864432, -6372121, -2203318, 2211908, -4792110, +10185515, -6612102, 1471026, 16514686, 1978369, 9592273, -3776887, -5973763, 16802986, 2387465, +-8988293, 181462, 117575, 1158031, 2342905, -4944581, 10485089, 471910, -839666, -5267241, +945967, -5352603, -13828721, -23897734, -12525735, -12841415, 15557982, 30622044, 11304354, -13973139, +-29535416, 31671088, 17047262, -15290620, -8242579, -8165270, 1771674, 7444789, -9768366, 16449725, +15301895, 843424, -10301479, -9769440, -9197672, -1196148, 5939403, -4646081, -10183904, -24215026, +7435662, 21247740, -12238509, 18780282, 548145, 12593918, -10577968, 14003741, 40680856, -15294915, +17732310, 35327716, 6100464, -6235219, -9863392, 10210211, 717260, 18000744, -13861470, 48479444, +-15076946, -32647658, 7425999, -14913200, 38343320, 12521440, -12080669, 2132988, -23244364, -31863288, +38920992, 4375498, -10580652, 38442104, -20045686, 4928475, -11366094, 22232362, -28586228, -32078574, +-22923852, 6984691, 13639742, 25458418, 10810433, 26907434, 42249056, -5344550, 8400419, -5730560, +5223754, -1494112, 1571958, -31292594, 1020592, -43162272, -14507863, -8640937, 7459822, -1623498, +9256728, -3585224, -13032005, -13699872, -3272228, -9127879, -10097468, -17343078, -196495, -1998234, +12824235, 5345087, -10769094, 9429601, 4300336, 7735236, 10292889, -13937706, 3605088, -5931350, +-2834142, 13499082, -4828617, 6597070, 9035537, -5808407, -15154255, -7869991, 5196374, -24809878, +-7920457, 270583, -3732864, -5837398, 10815265, -11895986, -13093208, 8672613, 14623827, -7157563, +12163347, -8581882, 29442000, -4103305, 549219, 35958540, 3554086, -19211926, -22982906, -19735912, +36271000, -24326158, 14186814, 17411798, -12105902, 3740917, -20474110, -4370666, 15991774, -14409615, +11446625, -4728759, -25649008, -55358372, -5322538, 50044424, 20551956, 5224828, -10226854, -14917495, +-3065533, -19614042, 6053220, -27694486, 32926294, 2529736, 3695819, 2790655, -11538967, -33433636, +-13127031, 26941792, -22280680, -5585068, -15516643, 12053826, -11209328, 37245420, -6325413, 7706782, +-13893145, -34710316, 7368554, -26499412, -6307697, -2311229, -48979808, -41021232, -39126616, 12895102, +-7493644, -20995410, -14003204, -13431436, -12735115, -18744848, -12994960, -3253975, -44029320, 12200391, +4529043, 16100222, -10045392, 37945500, -4340065, 7311108, -13544716, -5242545, 20080046, -40531068, +16818556, 26535382, -27645630, -17661442, 1240172, 4274030, -7619272, -13125957, -21760988, -1341640, +56371, -12893492, 10495826, -9522479, -17446694, -9432285, -7764227, 10721312, -773094, 314606, +-871342, 7985418, -21413634, -6051072, -3024194, -4130148, -1967095, 289373, -25601226, 722091, +-8659728, -6692633, -2708514, -11315091, 2514167, -3280281, 1680943, 363998, -2772402, -2893197, +-6861211, -1136556, -5755793, -1311576, 2867965, -5804649, -9832791, 154082, -2878165, -2187749, +-6424198, -10318122, -7615514, -2766496, -2006287, -2012192, 2872260, -7604777, -8224326, 14804215, +9437654, 17977660, -6583648, -38278360, 11260331, 253403, 63377612, 64263448, 8114267, 347892, +15514496, 7342247, 16552804, 27575300, 10691784, 28645822, 44019656, -11158862, 6051072, -36174900, +-4772783, 4434017, -4323959, -10948409, -21452288, -18571438, 10462003, 9822590, -47390132, 33793340, +9519258, 47798156, -2608119, -9751723, 16030965, -3561602, 50898048, 12650826, -2271501, 9503152, +10325638, -13787382, -30569430, -24434068, -11826192, 37549288, 819802, 41297720, 5417028, 40374840, +-11390790, -56031068, -20577188, -16404091, 29214904, 3326989, -26819386, -39495444, -27150098, -5660230, +34249144, -29720100, -25419764, -17128330, 30594662, -15101642, -8531953, -39299488, -38641284, 12119324, +6865505, 52269752, 13762686, -5701032, -13906030, 16295106, 17297444, 55832428, 1286343, -18272402, +-23978266, -1690070, -2236604, 1153199, 8961986, 7939247, -12789339, -3062312, 4468377, 11558294, +-12283606, -10273562, 15960635, 23066658, 10992969, 6994891, 9224516, -9863392, -3951907, -6241125, +-1076426, -1394791, 5279589, -13959, 30418570, 6270116, -1124208, -9309878, -15715822, 15111306, +24690156, -8938901, 539555, 913217, 3193845, 14015015, 6236830, 10410464, 10758893, 2692408, +8382166, 2712809, -455803, 2733210, -7423314, -2524904, 1866163, -4496294, -3022583, -9777493, +-592706, 3172907, 652298, 38765836, 14474040, -18606872, 36184564, -2112587, -71667968, -21626234, +44863080, 50203336, -35452272, -35156456, -36086852, 20122458, 30429844, 61389040, 18308908, 8004746, +-35204772, -3464965, -2414845, 13860396, 30408368, 22342956, 1530619, -37017788, -72307384, -19043884, +-36729488, 54232016, 57090316, 100179576, -30302604, -96304440, -21304648, -33084134, 74538624, 25465398, +75594648, 19552302, -25718802, -73406896, -49974092, 2645700, 8777839, 82247016, 33056216, -2905546, +-68097784, -118192672, -31272730, 2462090, 54187992, 124231928, 26691612, 37400576, -80514528, -122829088, +4883378, 28087476, 97311608, 57354456, 40635224, -22797150, -79533664, -64821792, -1080721, 18117246, +-2157684, 49200460, -41206452, -38277284, -9920838, -87373056, 13148506, 4024921, 23313620, -17697950, +-35748088, -19146428, -15400679, -40087616, 8671539, 11477763, -13265006, -2204929, -37957312, 5137318, +10348187, 12124693, 16938814, 5350993, -19686520, 6503654, -6568079, -3538516, 2312303, 30187178, +4733591, -1196685, -8268349, -23377506, -5034776, -9484362, 8440684, -4443681, 9414031, 6197101, +-21691196, -48267380, -24155432, -35530116, 28311888, 28770912, 33978560, 19527606, -45287208, -40633076, +-62951336, -15344308, 50108848, 55755116, 54089744, 2407329, -60765196, -45383308, -35624068, -1015760, +89338544, 62050468, 24930674, -48483740, -56547540, -42315628, 20157892, 21059298, 30641370, 16030429, +-10039486, -14208289, -26972932, -11766063, 7537131, 919660, 9026411, 12805445, -850404, -41779832, +55261732, -1971927, 8709120, -23714662, -51065012, 30115774, -51425792, 54552528, 8752606, 4167192, +12364137, -34033856, 33675764, 2467996, 23613730, -32660006, 11939472, -482110, 40290016, -16528108, +10401337, 25672630, -29399052, -18092012, 3547106, -28169080, 45138496, -10720775, -17722108, 39288752, +46625092, -13033078, -33426120, -9114457, -29390462, -6249178, 19144280, -3598109, -36754184, 3764002, +20713016, -13843216, 23285702, -19480898, 9357660, 23633594, -9153649, 15350213, -41941428, -43483324, +44156020, 23612120, 67825584, -3421478, -16489453, 56419764, -32000190, -29631516, 20568598, 18635864, +32911260, -30005178, -13482439, 8082592, -5708549, 31717796, -25306484, -80679352, 21356724, 44205416, +1126355, -37685652, 7553237, 22228066, -8419747, -10266582, -29354490, -10204305, -24137716, 24275692, +6577743, -17970144, -4182761, 29109140, -20503638, -8017094, -18478024, -2760053, 14920716, -21414706, +11700565, 30462592, 12421582, -943282, -8283918, -2242510, -10915659, -14943802, 23978802, -10280541, +11199664, -3777961, -11398843, -581431, 3114925, 1736241, 9110699, 9845676, -17307644, -5926518, +9489730, 6988986, 18353468, -2823404, -14778982, 5615133, -17303350, 8101919, -15703474, -9630390, +926639, -3977677, -10305774, 24698746, -10332618, 4725001, 11633456, 1921998, 9277666, 16259672, +380105, -3404835, 1519345, -1395328, -21291764, -13073344, 81109384, 22217328, 22563074, -68700152, +-17145510, -53813256, -45434848, 41050224, 43206296, 85499376, 39537860, -11342472, -16416976, -9836012, +27096948, 18900004, 709743, 41661184, 8240969, -16405701, -19488414, -15670725, 29998200, 212064, +26255672, 12386686, 15908559, 4141959, -6413997, 3250753, -31139, 4132296, -6657200, -1516124, +8697309, 7409893, 56121264, 45271104, 36972688, -3020436, 10206453, -22597434, -3637301, -13975824, +-25566866, -26586384, 8226473, 14827838, 21414706, 26299158, 21645562, -13254806, -34232500, 52493092, +-37219112, -16130287, -9441949, 18165564, 2454037, 25819196, 26780732, 23592792, -31354872, -11041287, +4372814, -12125766, -50639276, 34169148, -11824582, -8904004, 19246286, 39620000, 44754632, 32840930, +31970126, 27801860, -29335700, 4065187, -7481833, -8901320, 16814260, 13552769, 17908404, 8916889, +-8151848, -14424111, -21202642, -22728430, -46074800, -18186502, 6791417, -2408403, 28066000, 173946, +-12834436, -4061965, -18377092, 7182796, 2092723, -1138703, -297963, 12144557, 26262114, -3016678, +1238561, 14717779, 972810, 380641, -5362267, -1512365, -6358699, -5819144, 1467268, -12334609, +5464272, 7378754, -9357660, -13450764, 3637301, 2947958, -5108327, 13586055, 17816598, -2259690, +2538863, -5659157, -18329310, -7471633, 3639448, 3265249, -104901352, -52183316, -72059888, 52071108, +11438035, 148937120, 153804928, 153387776, 175138032, 172605616, 123903368, 77227272, 96633544, 42856256, +8967892, -81463184, -71035000, -178050560, -155815504, -139755552, -82431696, -103877544, -79259864, -6384469, +-25336548, -10095321, -12509629, 766652, -203474, 4855461, 20315196, 21950504, 20830592, 61567284, +63050120, 66960688, 47747688, 133797360, 34961032, 56332256, 93586800, 104457896, 38800196, 105128992, +126355256, 99761888, 86526408, 88099976, 9723269, 52818436, 106365400, 105218648, 67760088, 88332448, +77139760, -867583, -28472948, -19908784, -52489868, -64666640, -8272107, -72696080, -111094160, -86439976, +-103465760, -152930896, -69998840, -103335304, -114671872, -162318096, -132064336, -149668880, -171130832, -113867096, +-193507600, -228822432, -229763040, -124867584, -155431104, -195800576, -38412040, -87065968, -40840308, -21749714, +64385316, 28841242, 94410896, 50309636, 89199488, 85028008, 55901684, 44205952, 69210176, 128147864, +130287296, 130842424, 133536440, 138847168, 168559216, 150701808, 125078576, 153855936, 173469968, 138782208, +104387032, 124616328, 104819752, 67877128, 85562192, 58022324, 28947006, 12674985, 26656178, 8070244, +-10463077, -7090991, -13562433, -32936494, -50367080, -50033684, -54591180, -46575164, -58360552, -92010008, +-82702280, -95079304, -107303312, -125062472, -124727464, -103203768, -103657960, -84851376, -53694072, -60605208, +-41089416, -28736552, 3779571, 113280, 869194, 5590437, 19352586, 22138946, 7961796, 17643188, +27967754, 22295712, 10387378, 11760157, 21060910, 12521440, 5887327, 8785356, 12328704, 11211475, +7853348, 9605694, 15520401, 14835354, 7014756, 2393371, 5186173, 9203578, 5516349, 3758, +3732327, 6972343, 5464809, 2654290, 4760435, 5076652, 3954054, 3482682, 1747515, 1334661, +3897146, 3122978, 3411278, 1404454, -2167348, -2742874, 1567126, 3263102, -705448, -2262911, +617402, 2147, 659278, 1937030, 1363115, 2318746, 4214437, 3942243, 6271189, 8435853, +9817758, 7620883, 7777649, 8529805, 7134478, 5009006, 5712844, 6808060, 5264556, 2521683, +3285113, 1961190, 1528472, -106300, -2600066, -2378338, -3318399, -6832219, -9496173, -9353902, +-8200703, -10675141, -10042170, -9166534, -8208756, -7983271, -6602439, -5299990, -3601330, -3008625, +-1858110, -1100049, -278636, 94489, 845572, 851477, 1544578, 1047972, 1236951, 774168, +1088237, 488016, 637803, 130997, 282931, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, }, }, }; const Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819] ={ { { -4883915, -5020817, -1855426, 3221, 4694936, -2680060, 1831804, -344671, 656593, -3192235, -6675990, --1378685, 2623688, -1717450, 1596117, 2311229, 1965484, -1469953, 1113470, -4134443, -757525, -1030792, 1708860, -143345, -93952, 510027, 1019518, -3462818, -2873333, 1208496, 2392297, --1198833, 2504503, 4777614, -6426345, 910533, -3075197, -2086280, 1433982, -801548, 3948149, --1226750, 3555696, 1866163, 581431, -256624, 1900523, 111669, -388695, -2005750, 5763309, --4003447, -1213865, 2024540, 2238215, -102005, -1949378, 1106491, -2156074, 2234457, 430034, -812823, -45634, -766115, -711891, 2985539, -7693360, 1804423, -989990, -4466229, -756451, -3760781, 1820529, 2334852, -3367791, 2707977, -1172526, 1702418, 1038308, 1324461, -1422171, -561030, 2026151, -1344325, -3005940, 1225139, -2790118, 537945, 2049236, -3221, -1008244, --1167157, 550293, 1094680, -452582, 1315334, 62277, 941135, 812286, -370978, -190052, -355409, -433792, -268435, -336081, 361851, -601832, 295816, -882079, -225486, -826781, --125091, -259309, -945430, -201327, -8958228, 6958921, -3354370, 1549946, 1292248, 210453, --1925219, -155693, -5038534, -6266894, 1705639, -1201517, 1949378, 1977296, 5639292, -4614406, -667331, 3847754, 3712999, -3741990, -4006131, -2110977, -3479997, 332323, -1169842, -2688650, --2089502, 30602, -6345278, -6032819, -1285806, 1224603, -556735, 522912, -732829, 1397475, --3337190, 3865471, -1363115, 2210298, -484794, 1568200, -3045669, 1053878, 2099165, 2564096, -1092532, 510027, 901406, -1065689, -2527052, 5142687, 3861713, 1645509, -1926293, 6372121, -4289062, -1784559, 4031901, -302258, -3171833, -756451, -1152125, -2801393, 1825898, 2136209, -1006096, -2145336, 4475893, -2945274, 2617246, 3815005, -740345, 412854, -5600101, -2454037, --6026376, 904628, 2848100, -2859911, -875100, 1147293, -2734284, -736050, 1313723, -131533, -938450, -594853, -1461900, -3931506, -1951526, -683437, -965831, -296353, -97174, 276489, --503585, -636192, -1466731, -630286, 28454, 351114, 299037, -766652, -149787, 13422, -198105, -143881, 205085, -44560, 385473, -31139, -728534, -1153736, -1250909, -82141, --748398, 257698, 7541963, 3467649, -2860448, 1309965, 1009854, 12002286, -3503083, 3456912, -5868536, -1104344, 5343476, 2189897, 3646964, -4718559, -1724966, -5533529, -2537252, 3766150, --74088, -2622078, 668404, -3874597, -270046, -2530273, 3594351, -1541893, -454730, -1387274, -1927367, 850404, 77846, -438624, 1589138, -5836324, -4474819, 2029909, 572841, -552977, --2932389, 6985765, 2037425, -884226, 2339147, 2773475, 40802, 1378148, 690953, -3434363, -3158949, -4090956, -3066070, 3687766, -4341138, 3785477, 1729261, -3300146, 5718212, 3075197, -2219424, -1545115, 5185636, 1204202, -667331, -1495186, 1605244, 601832, -863288, -6077916, --843424, -1190243, 1892470, -3574487, 4851166, -1684164, 3981972, -4136591, 175020, -442919, -4950487, -2304250, -1577864, 883153, 1864553, -72478, 1000727, -763430, -4488778, -519154, --284542, -247497, -581968, -99858, 56908, -630823, -834834, -942745, -1028645, 69793, --381715, 10737, 652835, -768799, 518080, 592169, 1373853, -1619740, 1089311, 474594, -853088, -107911, 1273458, 460098, -569620, -989453, -256087, -474594, 12512850, -10373957, --9105868, -2929168, 9582072, -1330366, -5182952, 6563247, -4362613, 3104725, -233539, -7130183, --4847945, 6025839, -3892851, 2989297, -4062502, 3984656, -1764695, -1094680, -446677, -3926137, -2085207, 2891050, -3947075, 979253, -2002529, 826244, 1816234, -566399, 2601140, 795106, -2130304, 3370476, -4299263, -3156801, 3905199, 213675, 3035468, 2963528, -2721936, -4056597, --1606855, 720481, 5374615, -5771899, 2407329, -6446746, -7858180, -1835025, -4485020, -734439, --5316633, -10131828, -5356898, 4733591, 4424890, 2879239, -3358665, 9741523, -2967286, 1661616, --5349919, -5047661, 1360431, 22012, -468688, -6376416, -2065879, -343597, -1269163, -1219771, --3421478, -2749316, 736050, -862215, -1864553, 239981, -3314104, 622233, 1928977, 3347927, -1880122, -2780991, 2977486, -1910724, -157840, 3333432, 1430224, 513785, -1056562, 1729261, -1977833, 1553704, 366146, -825171, 318901, 2381023, 1239635, 1545115, 676457, -852551, -1287417, 272730, -115427, 388695, -640487, 255014, 374736, -667867, 1321239, 1954210, -2295660, -116501, -143345, 361314, -1432909, 2144263, -112206, 1350767, 16019691, -5257577, -7490960, -1999307, 10068477, -1953673, -1570347, 1705639, 2020245, -1699733, -11601244, 1149441, --1138166, -3073586, -199716, -542777, 4097399, -1309965, 9833864, -1289027, 1086627, -691490, -5550709, -1080184, 1896228, -4594005, -206158, -3149285, -3336653, -925029, -990527, 61203, -3542811, -6309307, -1916092, 2170032, -777389, 4400731, 955630, -1087164, -2958696, -2864743, --3141232, -5768678, 2124398, 2475512, 2105608, -10070625, -1545115, 7147363, 3937948, -1595044, --382252, -3103651, -6997039, -7327751, 7264937, -2243584, -4992363, -2729989, 3915400, 3193845, -294742, 3577708, 1403917, 3460133, -1766842, -7186017, -2524904, -3228205, -3744675, 5319317, -3438658, -573915, 5836324, 8848170, -2171643, 3757560, -3481608, -423591, -7516, 3859565, --362925, 974958, 814970, 1205275, 2991982, -3026341, 2333778, -1568737, 185220, -1924682, -274341, 1027571, 2117956, 1584843, -96100, 572304, 86436, -230318, 1072668, -2856690, --448824, -2279554, 483721, -405874, -409096, -996432, -642635, -1188095, 1236951, 605054, --24026584, 13134547, 4753455, -1153199, -1114007, 18254, -3699041, -6726993, -1498407, 3219078, -10103374, 6775848, -9300752, -1811403, -5552856, 3720516, -518080, -12541305, -3735548, 7629473, -4691178, 2582349, 6456947, 3900904, -711891, -860604, 1874216, -4795868, -2858301, 1059246, -5626944, -2425583, -4818417, -6941741, -3524021, 3415573, 11130945, 744103, -2002529, 2338073, --2347737, -8317741, 573915, -5880347, -4646618, -5488968, 3359201, -362925, -7812546, 1421634, -2901251, 3009162, -8448738, -4693863, -3172907, -2117956, -958315, -3138547, -1545115, -4048544, --8201777, -984621, -6971806, -8352638, -5197984, -1504312, 1392106, -4985384, -7352447, 2122788, -5823439, -340913, -1120450, -730144, 4224101, -6415608, 4725538, 7498476, 7277822, 5735392, -9803263, 90731, -4101157, 2618856, 397284, -1075352, -960462, -22012, -2290828, 3224984, -123480, 213138, -2046015, -581968, 1027571, 1197759, -1210107, -1094680, 578747, 3330747, --482110, 1248762, 1088774, 2844342, -2375117, 120796, -93416, -2618320, 347355, 334471, -2151242, 215822, 408022, 1862942, 1148904, -3254512, 1165547, -1180042, -9922448, 3738232, --4909685, -850940, 1291711, 2923262, -413391, 5124433, 122943, -1037235, -13916768, 6445136, --2589329, -2960843, 4988605, -8069170, -11092290, 4519916, -3889630, -5204427, -1646046, 10005663, -6291590, -3669513, -2165201, 4651450, -1391569, -506269, 1343251, 4539244, 8338679, 5304822, -6746320, -1043677, -296890, 156229, -4453344, 1127966, -1879048, 11352135, -8690329, -5041755, --4598836, -4310000, 2728915, 1531156, 4065724, -686121, -5741298, -7692824, -2225867, -9575630, --13329431, -2683281, 357019, 10341208, 2048163, -8219494, -2111513, 7749195, -3294240, 2587718, -2332167, 4342749, -6172405, -9262634, -4096325, -4721780, 14924474, 1653562, -4791036, 3234647, -2486786, -1116155, 1877438, 3400004, -418222, 6610492, -8776766, -7873212, 2545842, -3645354, -7955353, -3696356, -208306, 4263829, -1315871, 3775276, -233002, -209917, -264141, -1309428, --140660, 3394635, 1265942, 3297461, 1860795, 1636383, 117038, -1233729, -542777, 1369558, --435402, 401579, -679142, 2361695, -1971927, 1366873, -1766842, 2381559, -2292439, 200253, --221191, -265214, 1709397, 2243584, -2398202, 1659468, 922881, -823023, 3521336, 8611946, -2764885, -642098, 5971079, -1056562, -7290170, -1306744, -586800, 7305740, -4025995, -918049, --2149631, 1229971, -2179159, 505196, 2434173, 3480534, 5008469, 3292629, 1632625, 12765180, -5079336, 4233227, -474594, -9969693, 726386, -8295730, 2617783, -5608154, 1453846, 75162, -3295851, 15685221, 4508642, -2378338, 5690295, -4371203, 4858145, -2694555, 8220031, -4405026, -22012, -6081674, 3793530, 6252936, -7208029, 14746770, -3545496, 1132261, -2199023, -3896609, -1640141, -4352950, -12537546, 2198487, -3097745, -631360, -7719130, 1917703, -2691334, -12898324, --5809480, -3548180, -11401528, 6584185, 16591996, 20103132, -19014894, -14494441, -8010114, 890669, -4824859, -5807870, 2803003, -6600828, 1832340, 9329206, 14334453, -9736691, 16042777, 5207111, -1947768, 2818036, 2962991, -3445638, 5560372, 5146445, 6186364, 4789963, 2051384, 7211250, -115964, 2333778, -46171, 85899, 3940633, -1031329, -4570919, -1154809, 3135863, 2470680, -1051730, 73014, -205085, -288300, 3162170, 2566243, 1176821, -2626373, 791885, 886911, -144418, 3393561, 1525250, 2153926, 84826, 2572686, 1517734, 2601140, 3533684, 3700651, -332323, 259846, -1692754, 4072166, 3631395, -282394, -976568, 526670, 2649995, 7444252, --13361106, 19958714, 639413, 11780558, 4411469, -3830574, -3963718, 10931229, -6081137, 6988449, -8567923, -852014, -5637145, 556735, 8855686, 5084168, 4663798, 4076461, -540629, 1611687, -3131031, 11162083, 7937100, -5623723, -4756677, -671089, -2296734, -993211, -5506685, -3611531, -5729487, 9865003, 2701535, 14769856, -3824132, 16129750, 961536, 7707856, 17770964, 12628278, -4221416, 3794604, 8164733, -1522566, -6844031, 164283, 7700340, -4093641, -7885560, 506806, --1046898, 16228534, 13122736, 39728, 18365280, -1412507, 9987410, 5341329, 7951595, -812823, --6006512, 8325794, -1391033, 9705552, 6761353, 20298016, -10993506, -1743220, -22450868, 5017596, --10910828, -1329829, 10700374, -4095251, 4546760, -1679332, 12470438, -3027952, -8256001, -453656, --2637647, 3845606, -287763, 6109591, 7209103, 2028298, -1564442, 5692979, -948651, 2570001, -296353, -3461744, 2777233, 2752000, 5104569, 2701535, 5689221, 2613488, 176631, 399432, --1395328, 251792, 5589900, -1710471, -3716757, 2488397, 1074, 973347, 4636954, 1176821, -1358820, 2002529, 3186329, -729608, -230318, 2110977, 3825742, 5852967, 5512054, 179852, -2778844, 238371, 72478, 2661806, 3980898, -13140989, -9638443, 4751308, -7782481, 4469987, --4685810, 1292248, 12120398, -2069101, -11393474, 3074123, -4769561, 11628624, -12171400, -8542690, -4996121, 5582921, 8538395, 265751, -810138, 5449240, -3305514, -8389145, 5220533, -3482682, --6616934, 1937567, 6560563, -4841502, 12299713, 4897337, -400506, 1538672, 6049999, 2550674, --20883742, 8474507, -2095944, -2296197, -3562139, 11046119, 117575, 11763915, 548682, 943282, -1360968, -3232500, -1216550, 5657009, -6645388, 1485522, 19090056, 1566589, 14057965, 973884, --2777770, -1647657, -9351754, -19687594, -14178761, 6353331, 9062381, -3998615, 15061377, 6277095, --10608569, -6359236, 13807783, 9615358, 9190156, 2653753, -4108136, -15032, -638876, -8572218, --2484102, -5075578, -22901840, -10053445, -405874, 15308874, 3576097, -3735548, 1796907, 13113072, --3153043, 507880, 225486, 3194382, -4209068, -2262911, -3102040, -2049236, -991601, 3010235, -10201, -756988, -31139, 2310693, 2175938, 3706020, -2578054, -4513474, 1742683, -4769025, --2330557, 370441, 1856500, 322659, -598074, 4562329, -2016487, -1639067, -5306969, 1879585, --4771172, 3716757, 1967095, 2386928, -3992709, 144955, -489626, 1821066, -2191507, 1362578, --1927367, 2382633, -4430796, -85362, -5232344, 6077379, 12774306, 5026186, 4454955, 14627585, -12272869, 10285910, 653909, 3990562, 1033477, -2075543, -2547453, 2613488, -889595, -8352101, -2136746, 8702677, 152471, -2178085, 2862596, -20781200, 7251516, -8123931, 5469641, 7383586, -6680285, -7645579, 4507032, -558883, 75162, 12711493, 9359271, 377420, 5130339, 3867081, --1437203, -6860137, 1987496, 6335614, 374199, 9128953, 2915209, 8281771, 16082505, 1080721, -6646462, 7031399, 8745627, -102005, -5172751, 13928042, -5028870, 11293617, -12738336, -10436234, -15249818, -496069, 5218386, 9091909, 13342316, 17169668, 7398618, 2586644, -7988103, 3981972, --1421634, -14858439, 13102871, 8256538, -12103755, -468688, 1044214, -15234786, 5485747, 12593918, -7559143, 164819, 5014375, 3643206, -6943889, 13760001, 1573569, -2372433, 7230578, 13614509, -5519570, -261993, -4381404, -3381750, -1320166, 2557653, 4044786, 5790690, 2080375, 1232656, -2005213, 6721624, 6038187, 7442105, 191126, -475131, 3127273, 6414534, 306016, 854162, --944356, 3118683, 789737, -418759, -2028298, 1751810, -4132296, -7594576, -73014, 4720706, -173409, 3425237, -3471944, 2700461, 458488, 3028489, 715649, -1831267, 2080375, -1138703, --875100, -202400, -4480725, 3686156, -1465658, 1705102, 2939368, 443455, -390305, -1902134, --2798171, -34899292, -21716428, 7033546, 7378754, 14271103, 23651312, -6576669, -3740380, -7604240, --7021198, -8963597, -9562745, 708670, 3796214, 2928631, 14922864, 579821, 14645838, -818191, -5028333, 6708202, 5199058, 10832444, 7767985, 464393, 9603010, -211527, -1146756, -5632313, -6499360, -972810, -14323179, -12484933, 7773891, -1898376, 17081084, 10089952, 10987600, 3952981, --21478058, 5063767, 13521094, -2191507, 3943854, -3414499, 2696703, 16843788, -572304, 14092325, -23728620, 1198296, -8924942, -392990, 275415, -15025406, 20154670, 9441412, -2640331, -1300838, -14616847, 6714645, -17634062, -14554570, 5712844, -6431714, 8493298, 5922760, 2724620, -7178501, --12503724, -793495, 3235721, 2165737, 13641890, -18446884, 2728915, -1458141, -15397458, -7592966, --15482820, 13353590, -4546760, 18541374, -14689325, 1135482, -7027640, 10424422, 4723391, -4866198, --807991, 9575630, 702764, 2808372, -5602248, -3297461, -4720706, 8440684, 4425964, -314069, -2418604, 2325188, -7883413, 245350, -2143189, 2499671, 1777043, -2037425, -8049843, -3164317, --5914170, 6877317, -5242008, 839129, -1321239, 6790880, -1386201, -1596117, -2413772, -4801774, --136902, -3315178, 2966749, 7493108, 6988986, -867047, -7049115, 8727910, 24712704, -29417842, --8232379, -14340896, -606127, 4663261, 775778, 19722490, -20357072, 9623948, -2783139, 3931506, --2468533, 10831371, -5976984, -10076530, -847719, -2935073, 7650411, -635118, 5170604, 11476689, --2393908, -8596914, -1156957, 12906914, -7598871, 3080029, 2895882, 515933, -1178969, 12819941, --491774, -3301756, -21413096, 6890738, -5304822, -13514651, -11771432, -3119757, -13048648, -7678328, --11332808, 5377299, -13372918, 13339095, -12275553, 8272644, -6348499, 16171089, -15671262, -9090835, --2371359, 9373229, 3843459, 86436, -6458557, -12823699, 1289564, 5022428, 18304614, 9613211, -3983045, -10469520, 6217502, -9286256, -10499048, 9155260, -10193568, 4857608, 11854647, 9913858, --2659659, -3776350, -8584566, 14294725, 1377611, 13681618, 22080426, -4315906, -11617887, -5170067, --3883187, -7953206, 3475166, -13206488, 5733245, 4320200, 3946001, 10460930, -7413651, 396748, --1371705, 2659659, 9477919, 286689, 7446937, -2702071, -208843, 948651, -4269198, -1506460, -4458176, 2382633, -6091338, -7903277, -3795677, 3500398, 3096135, -3467649, 11265699, 3318936, --8302709, 4172024, 6000606, 15074261, 12199318, 6871948, 2494302, 1460826, -6370510, -4948876, --255014, -5014911, 903554, -2907156, -9287867, 5100274, -3109556, -1285806, 1039382, 5026186, -63888, 16460999, 22759568, -23894514, 17719424, 12373801, 694711, 8930311, 30218316, -8390755, --8577050, 2938295, 8965207, 12586939, 4222490, -11680164, 13407814, -4813048, 26715234, -624918, --4290136, 8687108, 7098507, 6997576, -180389, 25057912, -20648592, 5140002, -270046, 6933688, --8550206, -17202954, 8704825, 6853157, 7121056, -5973763, -4489852, 20956756, 7943542, 26316876, -2510945, -9634685, -930397, 5905580, -2169495, 27314918, -3314641, 14905147, -2527588, 24515136, -9027484, 6665253, -5814849, -1302986, 13573707, 323196, 14527190, 10947335, 12852153, -16838420, -2834679, 12151536, 14649597, 10917270, 8441758, 19621558, 24119462, -18235894, -2069101, 36538896, --8642548, -9810779, 23732378, 31891206, 731218, -253940, -17090748, -14106283, -797253, 16046535, --2202781, -2949569, 862752, -1160715, -4297652, -12206297, -4341138, -867583, -7120519, 558883, -7572564, -4086662, 9646497, -9546639, 8522289, -1887638, 7442642, -7140383, 389231, 5468567, -3318399, 9308805, -1488206, -4811974, -2005213, 2819646, 8600672, 2570001, -2868501, 11738682, --3483219, 6221797, 6328098, -995359, -1148904, -2571612, 17195438, -6154152, 2346663, 4416837, -6496138, -3016678, -10890426, -6342593, -1765232, 12945031, 6398965, -900333, 932545, 4647692, --665183, 221728, 4719632, 2481954, 1327145, 178241, 10069551, 22585086, -1319092, 7094212, --19186156, 18393734, -9706089, -5943161, -16801376, -10853919, 34561600, 550293, -24283208, -10771241, --702227, 170188, -3193308, 26774826, 12479027, -2201708, -11146514, -980326, 7018514, -3224447, -35554812, 7645042, 15622407, 5478768, -8031052, -20048370, 4708895, -137976, 3122978, -15507516, --1691143, -10439455, 11948599, 173409, 1917703, 12553653, -11326903, -8152922, 2395518, 659814, -3631395, -17114370, -13612899, -29402272, -15524696, 1395328, -16947404, 2390686, -12327093, -7195681, -21825950, 7030325, -10766409, 6706592, 2377265, 52613, 20975010, -3468186, 25428354, 9925133, --11125576, -31033286, 5303211, 5128191, 17132088, -9174587, -22552336, -7820599, 6342056, 1282585, --5506148, -15955267, -5347771, -22610856, -26134340, 8290361, -1626182, 26781806, -8697309, -16022912, --14285061, -1110249, 18605798, -821949, 6719477, 12265353, 9027484, -3927211, 5909875, 8456791, -2528662, 8666707, 8067023, -5660230, -1091459, 12065100, -2594697, 1880122, 11014444, -1905355, -6426345, -8080981, 2986076, 6720013, -4074850, 4119411, 3427921, -7516193, 10040023, -9490804, -4696547, 5456219, 7895761, -1755031, -5954972, 11300059, -1781338, 8437463, -12088185, -5420249, --8974871, -6964827, 739808, -5674726, 4110284, 937377, 1496796, -11443403, 16091095, -18048526, --1185411, 27169964, -5976984, 7971460, 2727304, 3513820, -25668872, 21132850, -2232309, -20551418, --12105902, 10641318, -3185792, 5283884, -259309, -8568460, -6459094, 3600256, -6471442, -1558536, --500364, -29734596, -7899519, -19963544, 4251481, 6988449, -328028, -8832600, 3368865, -4267050, -11479911, -26321170, 1605781, 4496831, 14861124, -11506217, 13834090, -11335492, 8745090, 2302103, -10726681, -17214766, 5086852, -8570607, -18376554, 11758010, -14902463, -29705068, 4189204, -2861522, -23192824, -11357504, 3104188, 10648298, 15331960, 17457432, 1725503, -6098854, -11210402, 263604, -8193187, 11465415, -23249194, 25777856, -365609, -17555142, -13221520, -23329188, 9298067, 5549098, -9087077, 3996467, 24479702, -8849780, 26619670, -14634564, 6106370, -6007049, -12611098, -37428492, -20900922, 3930969, -10065256, -25444996, -1640141, 4592931, -2337536, 9164923, -7002408, -8258685, --1486596, 3835406, -7284265, -7140920, -4663798, -1433445, 3754338, -2331630, -2432562, -10177462, -7284802, 102542, -5675263, 4463008, -4167192, 7613367, -2578054, 3734474, 4964982, 9432285, --3486440, 8548059, 785979, 328028, -9576703, -7540889, 2113661, 3369402, 1113470, 328565, --2010582, -6325950, -3604551, -3098819, -6907381, -3270081, 11535208, -6061810, -6873559, 3454764, --14854681, -22018686, -138513, 12067247, -4871567, -23842438, -3847754, -34819836, 16785270, -38475928, -22879290, -26614302, -23251880, 6564321, 19836844, 14824080, -13280039, 13906030, 24968256, 4409858, -3664144, 5852967, 2179159, -14795089, 17881560, -30185030, -18815714, 1658394, -1953673, -1968169, --4096862, -7544110, 3933653, 27717034, 7082401, 3828963, 2505040, -13081397, 16015933, -2937758, --28015534, -4321274, 499827, 579821, -19200652, -13512504, 14592151, -4804995, 25112136, 4663798, --88047, -20532628, -11356967, 7554848, 3148748, -5601174, 21496848, -17104170, -10498511, -747324, --1374926, 20393042, 1547262, 23858006, -104690, -19485730, 4742181, -16609175, 12550968, -2319819, -17142826, 32658932, -50352048, 17135308, 6841883, 9223442, 18906982, 4742181, -23154706, -5317707, --2203318, -4135517, 11664057, -23562190, 2127083, -6141267, -3470334, -16217260, -8849780, -24552718, -2633352, -1500554, 2427194, 6828998, -10090489, -1749662, 11844446, -7297687, 2240899, -4033511, --12226161, 5701032, 7224135, -8427800, -995896, -13353590, -889058, -19348290, 6883222, 4850629, --2522757, 2164664, -5001490, 903554, 3853123, -3023120, -3724274, 11190000, 13465259, -2950106, -4401805, 2289755, 13823889, 6296959, -17620104, 2435783, 9962714, -5602248, 10067940, 3397319, -4584878, 41149008, 35566624, -10129680, -13700409, -778463, -26986890, 15818365, -1500017, 5988258, -2146947, -13632226, 41059352, -17591650, -72296112, -10558103, 14485851, -48673252, -8296803, 15269146, --41205380, 5750961, 26911192, -18939196, 26848378, -25706454, 23074712, 28584618, -18190260, 7800198, --2578054, 640487, -7674033, -11281268, -2028298, 17598628, -11275363, -18844706, -10246718, -15173046, --1550483, -11907260, -1890323, 6313065, -2778307, 17184702, -15093052, -18602578, 14894947, -19679004, --29152090, -37446748, -12989055, -881542, 7348152, 20881594, -8654896, 9364102, 9844065, -6863895, --3164317, 34400004, -22675280, -872415, 23606750, 7303592, 18577344, -4622459, 6816113, 26118232, -13494787, -1417339, -3116536, -16095390, 6670084, 26270168, -24356760, 18581640, -24102282, 7056095, -34249144, 7879655, -19127636, 19434728, 3159485, -12266963, -9504763, 23517094, 7814693, 10143639, --1343788, 1779190, 6525129, 7713762, -627065, -2356863, 10078141, 8724689, 1913408, -11625403, -12870406, 1580548, -4338991, 3144990, 4460324, -8466991, -2171106, 6524592, 1334124, 10869488, --13353590, 20192788, 15722265, -2785286, -12734578, -5207648, 13533442, 15388331, 24901146, -774705, -4845797, 4055523, 13676786, -20728050, -10995653, 20774756, 13057774, 1396938, -3307662, 1772748, -5789616, -10859288, -8471286, -7310571, 1555315, 6612102, -3320547, -11778411, -8421357, 36103496, -24460376, -34862248, -7054484, 31077846, -9496710, -19296214, -13625247, -19363324, -11431055, 31371514, -19133542, -2573222, 14236206, -3474629, 17359720, -10981158, -6096169, 34852584, -14549202, 6257768, --10124312, -3824132, -420907, 9492415, 28372018, 10887205, -19268834, -5701032, -909996, -2973191, -15961172, 2077690, 28572270, -8489003, 4920422, -3012383, 8327405, -24034100, 14386530, -22176526, -14955076, -1238561, 21959094, -5801427, 16280074, -7585449, 5116917, 9278203, -9500468, 9613747, -22173306, 27631672, -14689325, 28312962, 11923903, 33602212, -9684614, 6268505, -1271847, -4233764, --6473590, -2415919, -11169599, -55309516, -34782792, -10792716, -718333, 7738458, 3869229, 12659953, -20774756, -30488900, -1735704, -12378096, 45967960, -3324842, -14035953, -4107599, -40397388, -33872260, -50808388, 20566450, 11327976, -7955353, 15888158, 1203665, -37002216, 7437273, 2459406, -14179835, --14472966, 2202245, 153545, 3809636, -7792145, -4061429, -18166102, -15450071, 6427956, 7923678, -6944962, 5264020, -9486509, -13976360, -8507256, -18046378, 11247982, 3711926, -31913218, -3924526, --9318468, -2360085, 15477988, -14826227, -20692078, -4700842, 13204340, 4324495, -14405857, 8346732, -18289044, -34418796, -9330280, 12002286, -747324, -2803003, -6667937, -1588601, 5825587, 10022843, -2266132, 27487254, -39482560, 37381784, -10768557, -11015517, 9705015, 17462800, -30896384, -6095096, -653909, 6307697, 1778117, -773094, 15662672, -9324374, 2103997, 8286603, 9161165, 13083544, -10841034, 3697430, -16910360, -3318936, 23247584, -22371948, -19119584, 24091008, 8291971, 17052094, -26320634, 40758164, -9118752, -25750476, 34491272, -13784698, -5705864, 35949952, 11362873, -13051869, --37304476, -24588688, -3658239, -13710072, 17693654, 35431868, 18204218, -12021077, 36385888, 12312597, --13048648, 10115722, 40593348, 11825656, 7946763, -8435853, -32342714, -43443596, -34517580, -2388002, -26346404, 8136816, 16683800, 62194884, 30693984, -37044092, -24928528, 16589311, -51339892, -23514946, -44462576, 15970299, -57053272, -47575352, -22022444, -36393944, -34215320, -20412906, 31209916, -8729521, --6415071, 81292992, 13749801, -23234162, -6369974, -25113210, 43233140, -8964670, 9471477, 3110630, -718333, -23493472, -9036074, -1724966, -11869679, 2975339, 9343701, 21249350, 2838437, -14224932, --534187, 58519, -9386114, 4499515, 6207302, 7289633, -18640158, 4945118, -17265232, 3156264, -9169218, -880468, 13902272, -3211562, -843961, 14151380, -2814814, 7979513, 15589658, -5128191, -4677757, 10882373, 11724724, 9761924, 1964948, 2570001, 8160438, -8408472, -3275986, 5769215, --55371256, 38477000, 16551730, 12497281, 15498389, -5877663, 19000936, 15626702, 22262962, -4143570, -30507690, -19067508, 23152022, -8346732, -17648558, -5545340, -28981902, 3083250, -10618233, 10327249, --7328825, -11172284, 27877558, -31922882, 20670604, -1029718, -13910325, -5521181, 12360379, 14014478, -10096931, 26419954, 21264384, -15201500, -3172370, -13593035, 11854647, -12040404, 9245991, 12760348, -5818070, 7187628, 4724464, -7452305, 29097330, -2665564, 8648454, 2964601, 13404593, 7496329, --34799972, 2312303, -20823076, 5364951, 15349139, -2792803, -14752139, -13450764, 32409286, -34213172, --27737436, 50939384, -21643414, 13254269, 5033702, 16399796, -7708930, 8608725, -35449588, 2481954, -34360812, -18366354, -13947369, 29709900, -2068027, -24530706, -18252000, 10989748, -9692131, -5657546, -18340048, -13497472, 4521527, 22977538, -25880400, 1763621, 15048492, -8313446, -5207111, -6677601, -9227737, 2637647, 3674882, -3320547, 5200132, 4046933, -5163088, 468151, 823023, 13749264, -6794102, -12740484, 15579994, 4005594, -8090645, 4662187, 4677757, -1333051, -4793184, 11332271, --108448, 3882651, 1275605, 14634564, -6891275, -5373004, 8680129, -12954695, 16275779, -1130113, --9451612, -1422708, -1169305, 2087891, -374199, -6201933, -1145683, 8682813, 16917340, -33296198, --133538584, -144016688, -5728950, -82831128, 72360536, 262967968, 114325584, 158387664, 200176080, -76316736, --54129472, -21854404, -180769808, -126582888, -41391672, -198159056, -86655800, -18097918, -81309640, 18751828, -185025040, 168054560, 181899376, 235933824, 141960480, -13314935, 52640728, -53497576, -210872688, -114791592, --85074176, -175296400, -120353040, 6186364, -135085856, -44795436, 29203630, -134963440, -69459824, 100114080, -38526932, 108614888, 271280864, 220455296, 178168672, 320967744, 232829104, -4465156, 33058364, -60588028, --288547168, -275825472, -284534592, -442900256, -300178496, -185716528, -181822064, 1661079, 143129248, 161299648, -226247600, 342817856, 317198912, 267728400, 264304240, 151151712, 52784076, 7910256, -16838956, -120864136, --207668112, -254826848, -272832960, -368158144, -306171040, -236220512, -115888416, 122686816, 363162560, 338246400, -370649248, 259796128, 31206158, -35900556, -111983760, -153708288, -104126648, -51354924, -51825224, -23244364, --24068996, -37835440, -284005, 4848481, 26501022, 84107808, 76287744, 56124484, 77304040, -7900056, --50851876, -7302518, -59614684, -51641076, 31113816, 33757908, 7384123, 7334194, -90561000, -230745504, --218571424, -186180928, -140436848, 67604392, 209500448, 256379488, 323928032, 290386496, 178890752, 124091808, -43705588, -52121040, -108837152, -129674728, -168087296, -206096688, -232428064, -271307168, -241328304, -83675088, -58921584, 139241232, 180591568, 196377712, 147273360, 102186936, 51091856, -2022393, -6049462, 24994026, -39906688, 43802224, 47631724, 39638792, 3680787, -32318556, -70068096, -125386736, -120377192, -96618512, --78635480, -38289096, 3576097, 27172110, 24034636, 15705085, 9292162, 7614440, }, +5020817, -1855426, 3221, 4694936, -2680060, 1831804, -344671, 656593, -3192235, -6675990, +-1378685, 2623688, -1717450, 1596117, 2311229, 1965484, -1469953, 1113470, -4134443, -757525, +1030792, 1708860, -143345, -93952, 510027, 1019518, -3462818, -2873333, 1208496, 2392297, +-1198833, 2504503, 4777614, -6426345, 910533, -3075197, -2086280, 1433982, -801548, 3948149, +-1226750, 3555696, 1866163, 581431, -256624, 1900523, 111669, -388695, -2005750, 5763309, +-4003447, -1213865, 2024540, 2238215, -102005, -1949378, 1106491, -2156074, 2234457, 430034, +812823, -45634, -766115, -711891, 2985539, -7693360, 1804423, -989990, -4466229, -756451, +3760781, 1820529, 2334852, -3367791, 2707977, -1172526, 1702418, 1038308, 1324461, -1422171, +561030, 2026151, -1344325, -3005940, 1225139, -2790118, 537945, 2049236, -3221, -1008244, +-1167157, 550293, 1094680, -452582, 1315334, 62277, 941135, 812286, -370978, -190052, +355409, -433792, -268435, -336081, 361851, -601832, 295816, -882079, -225486, -826781, +-125091, -259309, -945430, -201327, -8958228, 6958921, -3354370, 1549946, 1292248, 210453, +-1925219, -155693, -5038534, -6266894, 1705639, -1201517, 1949378, 1977296, 5639292, -4614406, +667331, 3847754, 3712999, -3741990, -4006131, -2110977, -3479997, 332323, -1169842, -2688650, +-2089502, 30602, -6345278, -6032819, -1285806, 1224603, -556735, 522912, -732829, 1397475, +-3337190, 3865471, -1363115, 2210298, -484794, 1568200, -3045669, 1053878, 2099165, 2564096, +1092532, 510027, 901406, -1065689, -2527052, 5142687, 3861713, 1645509, -1926293, 6372121, +4289062, -1784559, 4031901, -302258, -3171833, -756451, -1152125, -2801393, 1825898, 2136209, +1006096, -2145336, 4475893, -2945274, 2617246, 3815005, -740345, 412854, -5600101, -2454037, +-6026376, 904628, 2848100, -2859911, -875100, 1147293, -2734284, -736050, 1313723, -131533, +938450, -594853, -1461900, -3931506, -1951526, -683437, -965831, -296353, -97174, 276489, +-503585, -636192, -1466731, -630286, 28454, 351114, 299037, -766652, -149787, 13422, +198105, -143881, 205085, -44560, 385473, -31139, -728534, -1153736, -1250909, -82141, +-748398, 257698, 7541963, 3467649, -2860448, 1309965, 1009854, 12002286, -3503083, 3456912, +5868536, -1104344, 5343476, 2189897, 3646964, -4718559, -1724966, -5533529, -2537252, 3766150, +-74088, -2622078, 668404, -3874597, -270046, -2530273, 3594351, -1541893, -454730, -1387274, +1927367, 850404, 77846, -438624, 1589138, -5836324, -4474819, 2029909, 572841, -552977, +-2932389, 6985765, 2037425, -884226, 2339147, 2773475, 40802, 1378148, 690953, -3434363, +3158949, -4090956, -3066070, 3687766, -4341138, 3785477, 1729261, -3300146, 5718212, 3075197, +2219424, -1545115, 5185636, 1204202, -667331, -1495186, 1605244, 601832, -863288, -6077916, +-843424, -1190243, 1892470, -3574487, 4851166, -1684164, 3981972, -4136591, 175020, -442919, +4950487, -2304250, -1577864, 883153, 1864553, -72478, 1000727, -763430, -4488778, -519154, +-284542, -247497, -581968, -99858, 56908, -630823, -834834, -942745, -1028645, 69793, +-381715, 10737, 652835, -768799, 518080, 592169, 1373853, -1619740, 1089311, 474594, +853088, -107911, 1273458, 460098, -569620, -989453, -256087, -474594, 12512850, -10373957, +-9105868, -2929168, 9582072, -1330366, -5182952, 6563247, -4362613, 3104725, -233539, -7130183, +-4847945, 6025839, -3892851, 2989297, -4062502, 3984656, -1764695, -1094680, -446677, -3926137, +2085207, 2891050, -3947075, 979253, -2002529, 826244, 1816234, -566399, 2601140, 795106, +2130304, 3370476, -4299263, -3156801, 3905199, 213675, 3035468, 2963528, -2721936, -4056597, +-1606855, 720481, 5374615, -5771899, 2407329, -6446746, -7858180, -1835025, -4485020, -734439, +-5316633, -10131828, -5356898, 4733591, 4424890, 2879239, -3358665, 9741523, -2967286, 1661616, +-5349919, -5047661, 1360431, 22012, -468688, -6376416, -2065879, -343597, -1269163, -1219771, +-3421478, -2749316, 736050, -862215, -1864553, 239981, -3314104, 622233, 1928977, 3347927, +1880122, -2780991, 2977486, -1910724, -157840, 3333432, 1430224, 513785, -1056562, 1729261, +1977833, 1553704, 366146, -825171, 318901, 2381023, 1239635, 1545115, 676457, -852551, +1287417, 272730, -115427, 388695, -640487, 255014, 374736, -667867, 1321239, 1954210, +2295660, -116501, -143345, 361314, -1432909, 2144263, -112206, 1350767, 16019691, -5257577, +7490960, -1999307, 10068477, -1953673, -1570347, 1705639, 2020245, -1699733, -11601244, 1149441, +-1138166, -3073586, -199716, -542777, 4097399, -1309965, 9833864, -1289027, 1086627, -691490, +5550709, -1080184, 1896228, -4594005, -206158, -3149285, -3336653, -925029, -990527, 61203, +3542811, -6309307, -1916092, 2170032, -777389, 4400731, 955630, -1087164, -2958696, -2864743, +-3141232, -5768678, 2124398, 2475512, 2105608, -10070625, -1545115, 7147363, 3937948, -1595044, +-382252, -3103651, -6997039, -7327751, 7264937, -2243584, -4992363, -2729989, 3915400, 3193845, +294742, 3577708, 1403917, 3460133, -1766842, -7186017, -2524904, -3228205, -3744675, 5319317, +3438658, -573915, 5836324, 8848170, -2171643, 3757560, -3481608, -423591, -7516, 3859565, +-362925, 974958, 814970, 1205275, 2991982, -3026341, 2333778, -1568737, 185220, -1924682, +274341, 1027571, 2117956, 1584843, -96100, 572304, 86436, -230318, 1072668, -2856690, +-448824, -2279554, 483721, -405874, -409096, -996432, -642635, -1188095, 1236951, 605054, +-24026584, 13134547, 4753455, -1153199, -1114007, 18254, -3699041, -6726993, -1498407, 3219078, +10103374, 6775848, -9300752, -1811403, -5552856, 3720516, -518080, -12541305, -3735548, 7629473, +4691178, 2582349, 6456947, 3900904, -711891, -860604, 1874216, -4795868, -2858301, 1059246, +5626944, -2425583, -4818417, -6941741, -3524021, 3415573, 11130945, 744103, -2002529, 2338073, +-2347737, -8317741, 573915, -5880347, -4646618, -5488968, 3359201, -362925, -7812546, 1421634, +2901251, 3009162, -8448738, -4693863, -3172907, -2117956, -958315, -3138547, -1545115, -4048544, +-8201777, -984621, -6971806, -8352638, -5197984, -1504312, 1392106, -4985384, -7352447, 2122788, +5823439, -340913, -1120450, -730144, 4224101, -6415608, 4725538, 7498476, 7277822, 5735392, +9803263, 90731, -4101157, 2618856, 397284, -1075352, -960462, -22012, -2290828, 3224984, +123480, 213138, -2046015, -581968, 1027571, 1197759, -1210107, -1094680, 578747, 3330747, +-482110, 1248762, 1088774, 2844342, -2375117, 120796, -93416, -2618320, 347355, 334471, +2151242, 215822, 408022, 1862942, 1148904, -3254512, 1165547, -1180042, -9922448, 3738232, +-4909685, -850940, 1291711, 2923262, -413391, 5124433, 122943, -1037235, -13916768, 6445136, +-2589329, -2960843, 4988605, -8069170, -11092290, 4519916, -3889630, -5204427, -1646046, 10005663, +6291590, -3669513, -2165201, 4651450, -1391569, -506269, 1343251, 4539244, 8338679, 5304822, +6746320, -1043677, -296890, 156229, -4453344, 1127966, -1879048, 11352135, -8690329, -5041755, +-4598836, -4310000, 2728915, 1531156, 4065724, -686121, -5741298, -7692824, -2225867, -9575630, +-13329431, -2683281, 357019, 10341208, 2048163, -8219494, -2111513, 7749195, -3294240, 2587718, +2332167, 4342749, -6172405, -9262634, -4096325, -4721780, 14924474, 1653562, -4791036, 3234647, +2486786, -1116155, 1877438, 3400004, -418222, 6610492, -8776766, -7873212, 2545842, -3645354, +7955353, -3696356, -208306, 4263829, -1315871, 3775276, -233002, -209917, -264141, -1309428, +-140660, 3394635, 1265942, 3297461, 1860795, 1636383, 117038, -1233729, -542777, 1369558, +-435402, 401579, -679142, 2361695, -1971927, 1366873, -1766842, 2381559, -2292439, 200253, +-221191, -265214, 1709397, 2243584, -2398202, 1659468, 922881, -823023, 3521336, 8611946, +2764885, -642098, 5971079, -1056562, -7290170, -1306744, -586800, 7305740, -4025995, -918049, +-2149631, 1229971, -2179159, 505196, 2434173, 3480534, 5008469, 3292629, 1632625, 12765180, +5079336, 4233227, -474594, -9969693, 726386, -8295730, 2617783, -5608154, 1453846, 75162, +3295851, 15685221, 4508642, -2378338, 5690295, -4371203, 4858145, -2694555, 8220031, -4405026, +22012, -6081674, 3793530, 6252936, -7208029, 14746770, -3545496, 1132261, -2199023, -3896609, +1640141, -4352950, -12537546, 2198487, -3097745, -631360, -7719130, 1917703, -2691334, -12898324, +-5809480, -3548180, -11401528, 6584185, 16591996, 20103132, -19014894, -14494441, -8010114, 890669, +4824859, -5807870, 2803003, -6600828, 1832340, 9329206, 14334453, -9736691, 16042777, 5207111, +1947768, 2818036, 2962991, -3445638, 5560372, 5146445, 6186364, 4789963, 2051384, 7211250, +115964, 2333778, -46171, 85899, 3940633, -1031329, -4570919, -1154809, 3135863, 2470680, +1051730, 73014, -205085, -288300, 3162170, 2566243, 1176821, -2626373, 791885, 886911, +144418, 3393561, 1525250, 2153926, 84826, 2572686, 1517734, 2601140, 3533684, 3700651, +332323, 259846, -1692754, 4072166, 3631395, -282394, -976568, 526670, 2649995, 7444252, +-13361106, 19958714, 639413, 11780558, 4411469, -3830574, -3963718, 10931229, -6081137, 6988449, +8567923, -852014, -5637145, 556735, 8855686, 5084168, 4663798, 4076461, -540629, 1611687, +3131031, 11162083, 7937100, -5623723, -4756677, -671089, -2296734, -993211, -5506685, -3611531, +5729487, 9865003, 2701535, 14769856, -3824132, 16129750, 961536, 7707856, 17770964, 12628278, +4221416, 3794604, 8164733, -1522566, -6844031, 164283, 7700340, -4093641, -7885560, 506806, +-1046898, 16228534, 13122736, 39728, 18365280, -1412507, 9987410, 5341329, 7951595, -812823, +-6006512, 8325794, -1391033, 9705552, 6761353, 20298016, -10993506, -1743220, -22450868, 5017596, +-10910828, -1329829, 10700374, -4095251, 4546760, -1679332, 12470438, -3027952, -8256001, -453656, +-2637647, 3845606, -287763, 6109591, 7209103, 2028298, -1564442, 5692979, -948651, 2570001, +296353, -3461744, 2777233, 2752000, 5104569, 2701535, 5689221, 2613488, 176631, 399432, +-1395328, 251792, 5589900, -1710471, -3716757, 2488397, 1074, 973347, 4636954, 1176821, +1358820, 2002529, 3186329, -729608, -230318, 2110977, 3825742, 5852967, 5512054, 179852, +2778844, 238371, 72478, 2661806, 3980898, -13140989, -9638443, 4751308, -7782481, 4469987, +-4685810, 1292248, 12120398, -2069101, -11393474, 3074123, -4769561, 11628624, -12171400, -8542690, +4996121, 5582921, 8538395, 265751, -810138, 5449240, -3305514, -8389145, 5220533, -3482682, +-6616934, 1937567, 6560563, -4841502, 12299713, 4897337, -400506, 1538672, 6049999, 2550674, +-20883742, 8474507, -2095944, -2296197, -3562139, 11046119, 117575, 11763915, 548682, 943282, +1360968, -3232500, -1216550, 5657009, -6645388, 1485522, 19090056, 1566589, 14057965, 973884, +-2777770, -1647657, -9351754, -19687594, -14178761, 6353331, 9062381, -3998615, 15061377, 6277095, +-10608569, -6359236, 13807783, 9615358, 9190156, 2653753, -4108136, -15032, -638876, -8572218, +-2484102, -5075578, -22901840, -10053445, -405874, 15308874, 3576097, -3735548, 1796907, 13113072, +-3153043, 507880, 225486, 3194382, -4209068, -2262911, -3102040, -2049236, -991601, 3010235, +10201, -756988, -31139, 2310693, 2175938, 3706020, -2578054, -4513474, 1742683, -4769025, +-2330557, 370441, 1856500, 322659, -598074, 4562329, -2016487, -1639067, -5306969, 1879585, +-4771172, 3716757, 1967095, 2386928, -3992709, 144955, -489626, 1821066, -2191507, 1362578, +-1927367, 2382633, -4430796, -85362, -5232344, 6077379, 12774306, 5026186, 4454955, 14627585, +12272869, 10285910, 653909, 3990562, 1033477, -2075543, -2547453, 2613488, -889595, -8352101, +2136746, 8702677, 152471, -2178085, 2862596, -20781200, 7251516, -8123931, 5469641, 7383586, +6680285, -7645579, 4507032, -558883, 75162, 12711493, 9359271, 377420, 5130339, 3867081, +-1437203, -6860137, 1987496, 6335614, 374199, 9128953, 2915209, 8281771, 16082505, 1080721, +6646462, 7031399, 8745627, -102005, -5172751, 13928042, -5028870, 11293617, -12738336, -10436234, +15249818, -496069, 5218386, 9091909, 13342316, 17169668, 7398618, 2586644, -7988103, 3981972, +-1421634, -14858439, 13102871, 8256538, -12103755, -468688, 1044214, -15234786, 5485747, 12593918, +7559143, 164819, 5014375, 3643206, -6943889, 13760001, 1573569, -2372433, 7230578, 13614509, +5519570, -261993, -4381404, -3381750, -1320166, 2557653, 4044786, 5790690, 2080375, 1232656, +2005213, 6721624, 6038187, 7442105, 191126, -475131, 3127273, 6414534, 306016, 854162, +-944356, 3118683, 789737, -418759, -2028298, 1751810, -4132296, -7594576, -73014, 4720706, +173409, 3425237, -3471944, 2700461, 458488, 3028489, 715649, -1831267, 2080375, -1138703, +-875100, -202400, -4480725, 3686156, -1465658, 1705102, 2939368, 443455, -390305, -1902134, +-2798171, -34899292, -21716428, 7033546, 7378754, 14271103, 23651312, -6576669, -3740380, -7604240, +-7021198, -8963597, -9562745, 708670, 3796214, 2928631, 14922864, 579821, 14645838, -818191, +5028333, 6708202, 5199058, 10832444, 7767985, 464393, 9603010, -211527, -1146756, -5632313, +6499360, -972810, -14323179, -12484933, 7773891, -1898376, 17081084, 10089952, 10987600, 3952981, +-21478058, 5063767, 13521094, -2191507, 3943854, -3414499, 2696703, 16843788, -572304, 14092325, +23728620, 1198296, -8924942, -392990, 275415, -15025406, 20154670, 9441412, -2640331, -1300838, +14616847, 6714645, -17634062, -14554570, 5712844, -6431714, 8493298, 5922760, 2724620, -7178501, +-12503724, -793495, 3235721, 2165737, 13641890, -18446884, 2728915, -1458141, -15397458, -7592966, +-15482820, 13353590, -4546760, 18541374, -14689325, 1135482, -7027640, 10424422, 4723391, -4866198, +-807991, 9575630, 702764, 2808372, -5602248, -3297461, -4720706, 8440684, 4425964, -314069, +2418604, 2325188, -7883413, 245350, -2143189, 2499671, 1777043, -2037425, -8049843, -3164317, +-5914170, 6877317, -5242008, 839129, -1321239, 6790880, -1386201, -1596117, -2413772, -4801774, +-136902, -3315178, 2966749, 7493108, 6988986, -867047, -7049115, 8727910, 24712704, -29417842, +-8232379, -14340896, -606127, 4663261, 775778, 19722490, -20357072, 9623948, -2783139, 3931506, +-2468533, 10831371, -5976984, -10076530, -847719, -2935073, 7650411, -635118, 5170604, 11476689, +-2393908, -8596914, -1156957, 12906914, -7598871, 3080029, 2895882, 515933, -1178969, 12819941, +-491774, -3301756, -21413096, 6890738, -5304822, -13514651, -11771432, -3119757, -13048648, -7678328, +-11332808, 5377299, -13372918, 13339095, -12275553, 8272644, -6348499, 16171089, -15671262, -9090835, +-2371359, 9373229, 3843459, 86436, -6458557, -12823699, 1289564, 5022428, 18304614, 9613211, +3983045, -10469520, 6217502, -9286256, -10499048, 9155260, -10193568, 4857608, 11854647, 9913858, +-2659659, -3776350, -8584566, 14294725, 1377611, 13681618, 22080426, -4315906, -11617887, -5170067, +-3883187, -7953206, 3475166, -13206488, 5733245, 4320200, 3946001, 10460930, -7413651, 396748, +-1371705, 2659659, 9477919, 286689, 7446937, -2702071, -208843, 948651, -4269198, -1506460, +4458176, 2382633, -6091338, -7903277, -3795677, 3500398, 3096135, -3467649, 11265699, 3318936, +-8302709, 4172024, 6000606, 15074261, 12199318, 6871948, 2494302, 1460826, -6370510, -4948876, +-255014, -5014911, 903554, -2907156, -9287867, 5100274, -3109556, -1285806, 1039382, 5026186, +63888, 16460999, 22759568, -23894514, 17719424, 12373801, 694711, 8930311, 30218316, -8390755, +-8577050, 2938295, 8965207, 12586939, 4222490, -11680164, 13407814, -4813048, 26715234, -624918, +-4290136, 8687108, 7098507, 6997576, -180389, 25057912, -20648592, 5140002, -270046, 6933688, +-8550206, -17202954, 8704825, 6853157, 7121056, -5973763, -4489852, 20956756, 7943542, 26316876, +2510945, -9634685, -930397, 5905580, -2169495, 27314918, -3314641, 14905147, -2527588, 24515136, +9027484, 6665253, -5814849, -1302986, 13573707, 323196, 14527190, 10947335, 12852153, -16838420, +2834679, 12151536, 14649597, 10917270, 8441758, 19621558, 24119462, -18235894, -2069101, 36538896, +-8642548, -9810779, 23732378, 31891206, 731218, -253940, -17090748, -14106283, -797253, 16046535, +-2202781, -2949569, 862752, -1160715, -4297652, -12206297, -4341138, -867583, -7120519, 558883, +7572564, -4086662, 9646497, -9546639, 8522289, -1887638, 7442642, -7140383, 389231, 5468567, +3318399, 9308805, -1488206, -4811974, -2005213, 2819646, 8600672, 2570001, -2868501, 11738682, +-3483219, 6221797, 6328098, -995359, -1148904, -2571612, 17195438, -6154152, 2346663, 4416837, +6496138, -3016678, -10890426, -6342593, -1765232, 12945031, 6398965, -900333, 932545, 4647692, +-665183, 221728, 4719632, 2481954, 1327145, 178241, 10069551, 22585086, -1319092, 7094212, +-19186156, 18393734, -9706089, -5943161, -16801376, -10853919, 34561600, 550293, -24283208, -10771241, +-702227, 170188, -3193308, 26774826, 12479027, -2201708, -11146514, -980326, 7018514, -3224447, +35554812, 7645042, 15622407, 5478768, -8031052, -20048370, 4708895, -137976, 3122978, -15507516, +-1691143, -10439455, 11948599, 173409, 1917703, 12553653, -11326903, -8152922, 2395518, 659814, +3631395, -17114370, -13612899, -29402272, -15524696, 1395328, -16947404, 2390686, -12327093, -7195681, +21825950, 7030325, -10766409, 6706592, 2377265, 52613, 20975010, -3468186, 25428354, 9925133, +-11125576, -31033286, 5303211, 5128191, 17132088, -9174587, -22552336, -7820599, 6342056, 1282585, +-5506148, -15955267, -5347771, -22610856, -26134340, 8290361, -1626182, 26781806, -8697309, -16022912, +-14285061, -1110249, 18605798, -821949, 6719477, 12265353, 9027484, -3927211, 5909875, 8456791, +2528662, 8666707, 8067023, -5660230, -1091459, 12065100, -2594697, 1880122, 11014444, -1905355, +6426345, -8080981, 2986076, 6720013, -4074850, 4119411, 3427921, -7516193, 10040023, -9490804, +4696547, 5456219, 7895761, -1755031, -5954972, 11300059, -1781338, 8437463, -12088185, -5420249, +-8974871, -6964827, 739808, -5674726, 4110284, 937377, 1496796, -11443403, 16091095, -18048526, +-1185411, 27169964, -5976984, 7971460, 2727304, 3513820, -25668872, 21132850, -2232309, -20551418, +-12105902, 10641318, -3185792, 5283884, -259309, -8568460, -6459094, 3600256, -6471442, -1558536, +-500364, -29734596, -7899519, -19963544, 4251481, 6988449, -328028, -8832600, 3368865, -4267050, +11479911, -26321170, 1605781, 4496831, 14861124, -11506217, 13834090, -11335492, 8745090, 2302103, +10726681, -17214766, 5086852, -8570607, -18376554, 11758010, -14902463, -29705068, 4189204, -2861522, +23192824, -11357504, 3104188, 10648298, 15331960, 17457432, 1725503, -6098854, -11210402, 263604, +8193187, 11465415, -23249194, 25777856, -365609, -17555142, -13221520, -23329188, 9298067, 5549098, +9087077, 3996467, 24479702, -8849780, 26619670, -14634564, 6106370, -6007049, -12611098, -37428492, +20900922, 3930969, -10065256, -25444996, -1640141, 4592931, -2337536, 9164923, -7002408, -8258685, +-1486596, 3835406, -7284265, -7140920, -4663798, -1433445, 3754338, -2331630, -2432562, -10177462, +7284802, 102542, -5675263, 4463008, -4167192, 7613367, -2578054, 3734474, 4964982, 9432285, +-3486440, 8548059, 785979, 328028, -9576703, -7540889, 2113661, 3369402, 1113470, 328565, +-2010582, -6325950, -3604551, -3098819, -6907381, -3270081, 11535208, -6061810, -6873559, 3454764, +-14854681, -22018686, -138513, 12067247, -4871567, -23842438, -3847754, -34819836, 16785270, -38475928, +22879290, -26614302, -23251880, 6564321, 19836844, 14824080, -13280039, 13906030, 24968256, 4409858, +3664144, 5852967, 2179159, -14795089, 17881560, -30185030, -18815714, 1658394, -1953673, -1968169, +-4096862, -7544110, 3933653, 27717034, 7082401, 3828963, 2505040, -13081397, 16015933, -2937758, +-28015534, -4321274, 499827, 579821, -19200652, -13512504, 14592151, -4804995, 25112136, 4663798, +-88047, -20532628, -11356967, 7554848, 3148748, -5601174, 21496848, -17104170, -10498511, -747324, +-1374926, 20393042, 1547262, 23858006, -104690, -19485730, 4742181, -16609175, 12550968, -2319819, +17142826, 32658932, -50352048, 17135308, 6841883, 9223442, 18906982, 4742181, -23154706, -5317707, +-2203318, -4135517, 11664057, -23562190, 2127083, -6141267, -3470334, -16217260, -8849780, -24552718, +2633352, -1500554, 2427194, 6828998, -10090489, -1749662, 11844446, -7297687, 2240899, -4033511, +-12226161, 5701032, 7224135, -8427800, -995896, -13353590, -889058, -19348290, 6883222, 4850629, +-2522757, 2164664, -5001490, 903554, 3853123, -3023120, -3724274, 11190000, 13465259, -2950106, +4401805, 2289755, 13823889, 6296959, -17620104, 2435783, 9962714, -5602248, 10067940, 3397319, +4584878, 41149008, 35566624, -10129680, -13700409, -778463, -26986890, 15818365, -1500017, 5988258, +2146947, -13632226, 41059352, -17591650, -72296112, -10558103, 14485851, -48673252, -8296803, 15269146, +-41205380, 5750961, 26911192, -18939196, 26848378, -25706454, 23074712, 28584618, -18190260, 7800198, +-2578054, 640487, -7674033, -11281268, -2028298, 17598628, -11275363, -18844706, -10246718, -15173046, +-1550483, -11907260, -1890323, 6313065, -2778307, 17184702, -15093052, -18602578, 14894947, -19679004, +-29152090, -37446748, -12989055, -881542, 7348152, 20881594, -8654896, 9364102, 9844065, -6863895, +-3164317, 34400004, -22675280, -872415, 23606750, 7303592, 18577344, -4622459, 6816113, 26118232, +13494787, -1417339, -3116536, -16095390, 6670084, 26270168, -24356760, 18581640, -24102282, 7056095, +34249144, 7879655, -19127636, 19434728, 3159485, -12266963, -9504763, 23517094, 7814693, 10143639, +-1343788, 1779190, 6525129, 7713762, -627065, -2356863, 10078141, 8724689, 1913408, -11625403, +12870406, 1580548, -4338991, 3144990, 4460324, -8466991, -2171106, 6524592, 1334124, 10869488, +-13353590, 20192788, 15722265, -2785286, -12734578, -5207648, 13533442, 15388331, 24901146, -774705, +4845797, 4055523, 13676786, -20728050, -10995653, 20774756, 13057774, 1396938, -3307662, 1772748, +5789616, -10859288, -8471286, -7310571, 1555315, 6612102, -3320547, -11778411, -8421357, 36103496, +24460376, -34862248, -7054484, 31077846, -9496710, -19296214, -13625247, -19363324, -11431055, 31371514, +19133542, -2573222, 14236206, -3474629, 17359720, -10981158, -6096169, 34852584, -14549202, 6257768, +-10124312, -3824132, -420907, 9492415, 28372018, 10887205, -19268834, -5701032, -909996, -2973191, +15961172, 2077690, 28572270, -8489003, 4920422, -3012383, 8327405, -24034100, 14386530, -22176526, +14955076, -1238561, 21959094, -5801427, 16280074, -7585449, 5116917, 9278203, -9500468, 9613747, +22173306, 27631672, -14689325, 28312962, 11923903, 33602212, -9684614, 6268505, -1271847, -4233764, +-6473590, -2415919, -11169599, -55309516, -34782792, -10792716, -718333, 7738458, 3869229, 12659953, +20774756, -30488900, -1735704, -12378096, 45967960, -3324842, -14035953, -4107599, -40397388, -33872260, +50808388, 20566450, 11327976, -7955353, 15888158, 1203665, -37002216, 7437273, 2459406, -14179835, +-14472966, 2202245, 153545, 3809636, -7792145, -4061429, -18166102, -15450071, 6427956, 7923678, +6944962, 5264020, -9486509, -13976360, -8507256, -18046378, 11247982, 3711926, -31913218, -3924526, +-9318468, -2360085, 15477988, -14826227, -20692078, -4700842, 13204340, 4324495, -14405857, 8346732, +18289044, -34418796, -9330280, 12002286, -747324, -2803003, -6667937, -1588601, 5825587, 10022843, +2266132, 27487254, -39482560, 37381784, -10768557, -11015517, 9705015, 17462800, -30896384, -6095096, +653909, 6307697, 1778117, -773094, 15662672, -9324374, 2103997, 8286603, 9161165, 13083544, +10841034, 3697430, -16910360, -3318936, 23247584, -22371948, -19119584, 24091008, 8291971, 17052094, +26320634, 40758164, -9118752, -25750476, 34491272, -13784698, -5705864, 35949952, 11362873, -13051869, +-37304476, -24588688, -3658239, -13710072, 17693654, 35431868, 18204218, -12021077, 36385888, 12312597, +-13048648, 10115722, 40593348, 11825656, 7946763, -8435853, -32342714, -43443596, -34517580, -2388002, +26346404, 8136816, 16683800, 62194884, 30693984, -37044092, -24928528, 16589311, -51339892, -23514946, +44462576, 15970299, -57053272, -47575352, -22022444, -36393944, -34215320, -20412906, 31209916, -8729521, +-6415071, 81292992, 13749801, -23234162, -6369974, -25113210, 43233140, -8964670, 9471477, 3110630, +718333, -23493472, -9036074, -1724966, -11869679, 2975339, 9343701, 21249350, 2838437, -14224932, +-534187, 58519, -9386114, 4499515, 6207302, 7289633, -18640158, 4945118, -17265232, 3156264, +9169218, -880468, 13902272, -3211562, -843961, 14151380, -2814814, 7979513, 15589658, -5128191, +4677757, 10882373, 11724724, 9761924, 1964948, 2570001, 8160438, -8408472, -3275986, 5769215, +-55371256, 38477000, 16551730, 12497281, 15498389, -5877663, 19000936, 15626702, 22262962, -4143570, +30507690, -19067508, 23152022, -8346732, -17648558, -5545340, -28981902, 3083250, -10618233, 10327249, +-7328825, -11172284, 27877558, -31922882, 20670604, -1029718, -13910325, -5521181, 12360379, 14014478, +10096931, 26419954, 21264384, -15201500, -3172370, -13593035, 11854647, -12040404, 9245991, 12760348, +5818070, 7187628, 4724464, -7452305, 29097330, -2665564, 8648454, 2964601, 13404593, 7496329, +-34799972, 2312303, -20823076, 5364951, 15349139, -2792803, -14752139, -13450764, 32409286, -34213172, +-27737436, 50939384, -21643414, 13254269, 5033702, 16399796, -7708930, 8608725, -35449588, 2481954, +34360812, -18366354, -13947369, 29709900, -2068027, -24530706, -18252000, 10989748, -9692131, -5657546, +18340048, -13497472, 4521527, 22977538, -25880400, 1763621, 15048492, -8313446, -5207111, -6677601, +9227737, 2637647, 3674882, -3320547, 5200132, 4046933, -5163088, 468151, 823023, 13749264, +6794102, -12740484, 15579994, 4005594, -8090645, 4662187, 4677757, -1333051, -4793184, 11332271, +-108448, 3882651, 1275605, 14634564, -6891275, -5373004, 8680129, -12954695, 16275779, -1130113, +-9451612, -1422708, -1169305, 2087891, -374199, -6201933, -1145683, 8682813, 16917340, -33296198, +-133538584, -144016688, -5728950, -82831128, 72360536, 262967968, 114325584, 158387664, 200176080, -76316736, +-54129472, -21854404, -180769808, -126582888, -41391672, -198159056, -86655800, -18097918, -81309640, 18751828, +185025040, 168054560, 181899376, 235933824, 141960480, -13314935, 52640728, -53497576, -210872688, -114791592, +-85074176, -175296400, -120353040, 6186364, -135085856, -44795436, 29203630, -134963440, -69459824, 100114080, +38526932, 108614888, 271280864, 220455296, 178168672, 320967744, 232829104, -4465156, 33058364, -60588028, +-288547168, -275825472, -284534592, -442900256, -300178496, -185716528, -181822064, 1661079, 143129248, 161299648, +226247600, 342817856, 317198912, 267728400, 264304240, 151151712, 52784076, 7910256, -16838956, -120864136, +-207668112, -254826848, -272832960, -368158144, -306171040, -236220512, -115888416, 122686816, 363162560, 338246400, +370649248, 259796128, 31206158, -35900556, -111983760, -153708288, -104126648, -51354924, -51825224, -23244364, +-24068996, -37835440, -284005, 4848481, 26501022, 84107808, 76287744, 56124484, 77304040, -7900056, +-50851876, -7302518, -59614684, -51641076, 31113816, 33757908, 7384123, 7334194, -90561000, -230745504, +-218571424, -186180928, -140436848, 67604392, 209500448, 256379488, 323928032, 290386496, 178890752, 124091808, +43705588, -52121040, -108837152, -129674728, -168087296, -206096688, -232428064, -271307168, -241328304, -83675088, +58921584, 139241232, 180591568, 196377712, 147273360, 102186936, 51091856, -2022393, -6049462, 24994026, +39906688, 43802224, 47631724, 39638792, 3680787, -32318556, -70068096, -125386736, -120377192, -96618512, +-78635480, -38289096, 3576097, 27172110, 24034636, 15705085, 9292162, 7614440, }, { -7769596, -3768297, -8835821, 1731946, 642635, 554051, -6028524, -2137283, 1660005, -1321776, 1964948, -3140158, 1896228, -82141, 2475512, -6815576, 165356, -265751, -166967, 3743601, 5696737, --5975374, -1340030, -3624953, -1181116, 2125472, 3909494, 631897, 970126, -1473711, -1946157, --1586990, -1208496, -2721399, 1487132, -2743410, -1851131, 3117610, -2664490, 2237678, 369904, --6746857, -2286533, -3719442, -891743, 2863133, -1995012, -592169, -1962263, -2030983, -1419487, -2798708, 4258460, 782758, 2367601, 1879585, -2263448, -4291746, 2301029, 1893544, -938987, --3693135, -3081102, 2777770, 561567, 2077154, 988916, -5676336, -1875290, -2114198, 3129421, -1264868, -5708549, 1500017, -3026878, -938450, -298500, -2070174, 1626182, -1889249, 435402, -2175938, 2246268, 1379758, 1548336, 1013075, -183073, 1081795, 1331440, 125628, -1109712, -1523640, 314069, 12348, -451508, -1023813, 489626, 960999, 171799, 788663, -305480, --521839, -13422, -801548, 840203, -148176, 993748, -192200, 191663, -96637, 923418, -485868, -49392, -389231, 584652, -10961830, 7269769, -5234492, 734976, -690416, -1993939, -5572720, -4885526, -3244311, 4832, 5890548, -2174327, -326954, -623307, 4875325, -2925947, --7783018, -1723893, -3996467, -5440113, 217433, -425202, 915902, 3160022, 5205501, 3245922, -517544, 7947300, 3106335, 278099, 5677947, 5947993, -461172, -3190624, 242129, 2632815, -2113661, -36507, -1129040, -4599373, -4048007, -1986959, 4558571, 1890323, 7839389, 4438849, --334471, 2628520, 3202435, 1075889, -4849018, 5274757, -2074469, 2762738, -195421, 1676648, --5784247, -915902, -1829656, 2061047, -1756105, -2179159, 6066105, -408022, -4529580, 1807108, --3443490, 2836289, -1935957, 4546760, 3925063, 4361540, 1480153, -4180614, 2321430, -624918, -2288681, -1802813, 664109, 5970542, -2281702, 2906082, 3935264, -576599, 254477, -166967, --698469, -1571958, 1005022, -81604, 1505386, -19327, 1219234, 89657, 114354, 872415, -1466195, 618475, 1408212, 1565516, -279173, -1118839, 2032593, 235686, -41339, 171799, -1245541, -315143, -1091995, 602906, -251256, 336081, 59056, 1227287, 410706, 675384, -414464, 2190970, 2462627, 124017, -2135673, 2296734, 897111, 693637, 1088237, -8685498, -2812667, -5537287, 917512, 1785633, 1883343, -2545305, 4609037, 723165, -1708323, -804233, -5379984, 3852586, -2343979, -3023657, -2473364, 2070174, 3817152, -2321430, -2524904, 732292, --9842454, -39728, -4201015, -1675574, -4179003, -5495948, -674310, 4967667, 1373316, -4483946, --1185411, 4248797, 1291711, -2760590, 4831302, -2124398, -6736656, -2029372, 3783866, -1694365, -4477504, 8532489, 6921340, 933619, -93952, 2393908, -1048509, -5074504, 54761, 1877438, --3615289, 3022583, -7171522, -1099512, 447750, -3073049, -2340757, 3096672, 6256157, -4928475, --5114769, 3151432, 3202435, 5858873, 1900523, -3468186, 4706211, 4029216, -1349157, 4495220, --5004711, 5040144, 1233729, 3405372, 698469, -2728915, -1541356, -522375, 1120987, 71941, --2459406, 813896, 29528, -1476932, -1178969, 296890, -361314, 1068910, 68183, 1806571, --1332514, -1014149, -64425, 198105, 1601486, -849330, -1591285, 685047, 62814, -377420, -1090385, -287763, 662499, -761820, 667867, 925029, 130460, 1524713, 14785425, -5742372, --2528125, -945430, 10660109, -1059783, 8062191, -5859946, 7104950, -7029251, -6167036, 1484985, -3365644, -4149475, -1018444, 2121714, -541703, 2766496, -4278861, 4942434, 1788317, -5296232, --199716, 2128156, 1661079, 949725, 10028749, 7994545, 6254546, 2147, 4060355, 383326, -1172526, 3005940, -9251896, -1411971, 5640903, 3672734, 4378719, -100395, -1637993, 2046015, --362925, 11312944, -1710471, 1910724, 1137093, 556735, -3343632, 6786049, -769336, 7055558, --3883187, -4070019, 2923799, -2710124, -9411347, -4332549, 1897839, -890132, -6731288, 1883343, -22012, 8766028, 769873, 764504, -2676302, 3194382, 3237332, -714038, -508954, 7700877, -5659693, 5623723, -3708704, -5277978, -4609037, -9019431, 753230, -6384469, -2155000, 407485, --3481071, -3970697, -2212982, -444529, -1354525, 2128693, 3963181, -736587, -456340, -1774358, -919660, -1283658, -1486059, 638876, 1087701, 22012, 1400696, -811212, 52076, -783295, --528281, -425202, 816044, -482647, -487479, -285615, -1280974, -1453846, 91268, -155693, --1763084, 1505923, 1504849, 1834488, -33286, -1271310, -746251, 1443109, 10844792, -8636642, --242666, -9032316, -5943698, -3533684, 7788387, 4560182, -10908680, -14902463, -5753646, 5224828, -3707094, -2254858, 5070209, 24696, -1293859, 554588, -7849590, 2330557, -1057636, 628139, -2444910, 504659, -55298, 3261491, 2857227, -5222144, -5209796, 5892159, -1901597, -2934537, -3596498, -10200547, 2398739, 2101313, -9404368, 3389266, 9678709, 5856188, 6635188, 1343788, -3649649, 9193377, 1703491, 1734630, -10597295, 5561446, 7943542, 6499896, 1227287, 6603512, --7558069, 7398618, -2252174, -7429220, -11444477, -131533, -7289097, -5877663, -2537789, -6979322, --17383344, 735513, 879395, -599148, 2676838, 8522826, 3186866, 3427921, 2252710, -6218576, -883153, 2884608, 2464774, 2186138, 2500745, -6381248, -1913408, -8039105, -3644817, -592169, -1848447, -2948495, 2827162, 556735, 481573, -2023467, -344671, -1080721, -2684, -1166621, -1056025, 335007, 796180, -307627, -1483911, -1236951, -1223529, 1220308, 776852, -14496, --580357, -1121523, -1217086, -1182727, -3629247, 533113, 493384, -2753074, -1443646, -1007170, --23475754, 11538967, 1474784, -9131637, 2201708, -1020055, -2704219, -1879585, -5178120, 2754148, --2661806, 524523, 3367254, 3096672, 10151692, -4131222, -9726490, 5262409, -12329777, -5334350, -1997160, 1669132, 1392106, 3963718, 4930623, 4231080, -101469, 5607617, 355409, -2268280, -7474854, 4608500, -2291365, 4421132, -7753490, 14598594, 542777, 2688650, -1381906, -12594992, --2184528, -4709969, -4409321, 1913945, 10460393, 259846, 431107, -1387274, -2895882, -6817187, -2138357, -1156957, 3741990, -8582418, 2876554, 4511863, 1997697, -6369974, -2252710, 1627256, -812823, 5086852, 1003412, 17746268, -5081483, -7623567, -8621073, -2649458, 178241, 6308233, --8586713, -1155883, -3682398, 3879966, -12534862, -588411, -3397856, -5290863, 1559610, -1566053, -3415573, -489089, 6278169, 3933116, -19864, 1292248, 484258, 748398, 7281580, 833761, -5207111, 1846836, -1316944, 92342, 186294, 1463510, -958851, 732292, -279710, 2164127, -408022, -1689533, -2396055, 1897302, -922881, -2895882, -1257889, -1541893, -663036, -913217, --53150, 3491272, 60130, 954020, 426812, 1387811, -1396938, -817654, -3034931, 10569378, --3438121, -2558727, 2251100, 3096672, -8580271, -8658117, -7921531, -7448547, -12162811, 7612293, --7131793, 2110977, 2912525, 10990284, -1858110, -2656974, 8600672, 1963874, 1773285, -10177999, --6680285, 4946729, 2128156, 3924526, 5925445, -10721849, 80531, 4518843, 10155450, -147103, -924492, -1579474, -32749, -7013682, -1359894, -2212445, -13003550, -1087164, 3921305, -7487202, -3144453, -8141648, -88047, -5648956, -1193464, -1797444, 688805, 10402948, -3091840, 86436, -5313949, -3049427, 3093450, -8730595, -15508590, -8456791, -4734665, -2247879, 1598265, 10256919, --4901095, 2705830, 2461553, -7484518, 2456721, -5779952, -2063732, 3711926, 10413148, -1674500, --615791, 3274913, -293132, -9899900, -9362492, -3976603, 9230422, -1192927, -13987635, 908922, --9211094, -4137664, -1960653, -1047972, 3032247, -3604551, -1128503, 3384971, -1043677, 3987877, -3461207, 2464238, -1716913, 3901441, -3620658, -2761127, -2585034, 512712, -480499, -856846, --908922, -779537, -1299765, 699006, -393526, 2474438, -1850057, -1228361, 1008780, -1645509, --985158, -4126390, -4944581, -535260, 309775, 2289218, 244813, 1337882, 34897, 10321880, -10834592, -3311957, 1009317, 11365557, -11555073, -10279467, 8696235, -2077690, 1189706, 7898982, --1559073, -2153926, 7886097, -14601815, 6223408, -652298, 2472291, 7117298, 7332046, -8172249, -1548873, -11230803, 3455301, -3374234, -1206349, -7812009, -404264, -11201275, 1082332, -9707163, -6801081, -3398930, 1283122, 12138114, 5619965, 5441187, -9686762, 1795833, 11238319, -2646774, --15984795, 8590471, -1957431, 1579474, -3150896, -7394323, 10549513, 3811784, 8594766, 2166811, -1239098, -7077569, -9217000, 3337727, 4304094, 4641786, 6120329, 14163192, -476741, -10944650, --7145215, 8535711, -1233729, -9403294, -2485712, -556735, -2576444, -11904576, 183073, 1655173, -2974265, -4297652, 6870874, -326954, 755377, 9806484, 4998268, 10210211, -10023380, -4163971, -1846299, -5480915, 4560719, 2829310, 2792803, -392990, -1276142, -813896, -156229, -3920768, -5044976, -1822140, 3093450, -790274, 3603478, -1411434, -1789928, 250719, 2070174, -1750736, --69256, -414464, -1990717, -971736, 912681, -2157684, -683974, -4613869, -3627637, 1996623, -3206193, 1702955, 1460826, -449361, -380641, -2137283, -349503, 2431488, -3102040, -401579, -1431835, -584652, 2509335, 2475512, -1736777, -657667, 2243584, 1602023, -1167694, 8219494, --10004589, 11718281, -2637647, 12395276, -10122701, 9174587, 1010391, -969589, 15439871, -8065949, -925029, -7829189, -2331094, 23530516, 11358041, 4996121, 3407520, 6692096, -3757023, -31675, --19889994, 3694746, -827318, -8603893, 9543417, 7155416, -293668, 1698123, -11491185, 10129143, --5363878, 10756746, 7054484, 5742908, -8242579, -1452773, -6929393, 10328323, 2384781, -3764002, -18315888, 8749385, -2058900, 958851, -15162308, 2572686, 710817, 12045236, -5405217, -15432354, --2647311, -4272956, -2991445, -21810380, -10858751, -23230404, -11823508, -8305393, 2742874, -5844377, -10975252, 1362578, -12530030, 7561290, -8380018, 11854647, -10562398, -8578660, 6190122, 10559177, -10416906, 30065, -9747965, -7792682, 4783520, -6391985, 250719, -3230352, 3941706, -4388383, --6434935, 11361799, 5281199, 1549946, -1799054, 4280472, 2432562, 5269388, -485331, 3568044, -1274532, 5917928, 125628, -280784, 343061, -2918967, 112206, 1511829, 734976, 647466, -166430, 4557497, 2098629, -3601330, 406948, 2072322, -1130113, -1376000, -863288, 273804, -877784, 2294586, -569083, 1564442, 2673080, -555125, -2699924, -238371, -2944737, -1296006, --2719251, -1755031, 2368138, 162135, -1519882, -14412300, -17111686, -11342472, -1632088, -220117, --2219961, 4067334, 6190659, 4298189, -2684, 2304787, -5430986, 3563749, -11024107, -15368467, -482647, 11781632, 2063195, -4150549, 9428527, 5578626, 9125732, 15359877, 1994476, -4745939, --9789841, -7841537, 4488778, -8987756, -6230924, 2309082, -7111392, -15677704, -8593156, -870805, --1819992, 3660386, -3526168, 8676908, 2521146, 3288334, 12015708, -1931125, 1424855, 2779918, --9591199, 11307038, 1862405, -10468983, -17119740, 4350265, 1538672, -12446278, 13166222, 8542690, --11532524, 3898220, 11067057, 6221260, 2966749, 9185861, -4206921, -3714073, 694711, -5097053, --8150238, 13941464, -12437152, -1393180, 5201206, 1188095, 21675626, -18824842, 5738613, -2412161, --91805, 6055367, 241055, 1292248, -5064840, 2862596, -11167989, -23679228, -1338956, -294742, --12175159, -7743826, -1702955, 4468377, 3894999, 1661616, 992137, -3950833, -130997, -5531918, --2795487, -1079647, -3218541, -4988605, 1694365, -956704, 835908, -2558727, -1881196, 1166084, --4076998, -8646306, -3037079, 571231, -2363306, -8338679, -4670240, 3441880, 2344515, 1625645, --1676111, -3212636, -4017942, -753230, -2033130, -4740034, -3946001, -5586679, -2941516, -3774203, --3800509, -125091, -955093, 1496259, -1509681, -1062468, 3049427, -4175782, -11172284, 9836549, --20196546, -14342506, 10631118, -497679, -18396956, 9430138, -10768557, 20817706, 4153234, -27399744, --3498788, 2491618, -6935836, 2062658, 4760435, 9727027, 8310762, -15913391, -715649, 1491964, --3319473, -14581951, -2275259, -3022046, -5031018, -4443681, -232465, 1086090, 12392591, 13608604, --4239133, 7333657, 6303938, 6193343, 13531294, 181462, 3621731, -15604153, -5390721, 5514201, --3111704, 7551626, 18582712, 2755759, -16310138, -36280124, -106837, -11173357, 10282152, -6842957, --3721589, -7112466, -19632296, 8555575, 26186416, 1558536, 6844568, -20537460, 4231617, -2304250, --9286793, 2390149, 10027138, 5259188, 8085813, -8820252, 12981539, 7665443, -15186467, -22479858, --1461363, -17082696, -16047608, -10166724, -11839077, 1587527, 21087752, 8159364, 750546, -2768107, -13568339, -6864432, -10149008, -1560684, 2090575, -1528472, 2477659, 2175401, 97711, 2204929, -5176510, 1988033, -589484, 467078, -2041720, -1919314, 5430986, -1564979, 5342403, 222265, --3069828, 755377, -1629940, -2167885, 6462315, -1461900, 3482145, -7869454, -1051730, 3993783, --70867, 1706713, 6599754, -4860293, 6027450, -483721, 639413, 1991254, -2075543, 4774930, -636192, 417686, 776315, 374199, 2075543, 6124624, -2536715, 2253784, 2300492, 2484102, -2593087, -39564164, -24974698, 17972828, 14476187, 23538032, -62277, 9288404, 2317672, 7446937, --277562, 4811437, -10397579, -12466679, -7733089, -11158325, -7195144, -7941932, 9589051, 22630182, -4959077, -27557048, -6531035, 4860829, -7303592, 6765111, -15746424, -1249299, -511101, 944893, -7708393, 5855651, 1101122, -1870995, -3502009, 6448357, 12498355, -9972377, -15495168, 10350871, -4934381, 13568339, 6200859, 19711752, -13598403, -4749697, 12584791, 18796388, 16323023, 9683541, -4605279, -3995393, 1249299, -2334852, 84289, 6534256, -24508694, 13211319, -1921998, 3601867, --1611150, 18650896, -5673115, -246424, -4075387, 11839077, 10033580, -20890184, 15015206, -17765596, --894427, -8994198, -8946417, 8157217, 1489280, -27710056, -2455111, -2157684, -5116380, -3198677, --650151, -3510062, 14413373, 1449552, 13786845, -4327717, 16302085, 7723962, -8420820, 3620121, --2104534, 969589, 1056562, 1570884, 2195802, 874563, -3163244, -5186710, 8105677, 3630321, -6651831, 1892470, -3963718, 7694971, 294205, 438087, 5769752, -16141561, -7505992, -7152731, -2266132, -180926, -10996727, 514322, 1838783, -469225, -2072322, 10737, 3769371, -3979287, --170725, 4419522, 2174327, 5378373, -4673462, -2244121, 1318555, 5832566, 21975200, -24447490, --562104, -13895830, -39199092, -4634270, -14467597, -30939870, 6183679, -199179, -6012418, 1946157, -16628503, -1074816, -17575544, 6033356, 710817, -5646809, -4227322, -3132105, 890132, 19164680, --4299263, -702764, 8702677, 6433324, -2756832, 9281961, 8493298, -4088809, -4021700, -7694434, -10666014, -2544231, -18357764, 2808909, -1212255, 6314676, 24064702, -16054051, -25756382, -16240882, --7518341, 3569118, 8600672, 4574677, 18321794, 9160628, -12899934, -7444789, -17597554, 15252503, -9388799, 1705639, 3247532, -10091563, 1075889, -10677289, 18474802, 18126910, 1306207, -8428336, --4679367, 1801202, 16822314, 33556044, 20659866, -3161633, -7475928, 478352, 10696079, 4651450, -9875204, 13607530, -13442174, -610422, -25943750, -17482128, -16661252, -11159936, 7009387, 15963320, -10980621, 1757179, -3147674, -1470489, -14425185, -18149458, -4556424, -9629854, -9073655, 2114735, --1809255, -2294586, 135828, 614180, 4191351, -4597763, 9330280, -9407589, 4032974, -11981348, --3980898, 12885, 2274722, -323733, 2164664, 4638028, -3206730, 578747, 11092290, 13513578, -16280074, 8943733, 10223096, 4641249, 1999307, 801011, 357019, 658204, -2765422, -8714489, --8507793, -1376537, 6752763, 44023, 1114007, -3532074, -2458332, 1083942, 8258685, 5206037, -9843528, 6957310, 8390219, -19150722, -2259690, -9921911, 14396730, -15912854, 3073049, 1387274, -28167470, -17437030, -5116917, -17934172, -3887482, -17714592, -14890652, -10747619, 5542119, -19054086, --13828184, -20718922, -5299990, -3126199, -6349036, -9368397, -23092428, 6023692, -16326244, 6584185, --17128866, 21088826, 3238405, 9446781, -4083977, -19912006, 10650982, 6164352, -6710350, 10648298, -14899242, -8067559, -21455510, -11492796, 28732794, -12289512, -947577, 734439, -4886599, 6313602, -18619220, 3300682, 7914014, -6003291, 13318157, 183610, 10489384, 3197066, 3555159, -326954, -1067836, 22790708, 6899865, 54564340, -33313914, 21263846, 29894582, -7899519, 674310, 15425375, --11184632, -3272765, 25029996, 9921374, -4181151, 13292387, -5694590, -24241332, -17942226, 6090264, -969052, -32388886, -9021042, -3306051, -16829830, 8652212, 5037997, -10930155, -8961986, -6597607, -943819, 2989297, 6853694, -5677410, 803696, 4013110, -1795833, -7191923, 1984275, 1521492, -2267743, 6747394, 1198296, -4091493, 545461, 7817378, 6918656, 3377992, -7744363, -155156, -14251238, -4052302, -3006477, 7923678, -7740068, -13383655, -3818226, 751082, -1741609, -6859600, --2112587, -395137, -7584912, -1552631, 814970, -2083059, -7870528, -12959527, 4940823, 13986561, -5057324, -260919, 511638, -2582349, -8253854, -6565395, 30640296, 34205120, 775778, 24771224, -24680492, -1058710, 11282879, -24239184, -7288560, 22007950, 2385854, 21731460, 30325154, 25001004, --4642323, 16411607, -24810416, -38918308, -16445430, -14384382, 9780714, 347892, 10443750, 11212012, -23963770, 18564996, 6718940, -18418968, -1927367, 18963354, 6364605, -8905615, 12378633, 26039850, --2548526, 9234180, -20676510, 10329396, -16246251, -4245039, -10183367, -21556978, 13732084, 1761474, -6881612, 26360362, -13763760, -15630997, 9783936, 27299886, -20903068, -13987098, 9155260, -6629282, -38579008, 28526100, -26533234, -9926206, -20899848, 1364726, 23678154, -10600516, -15836618, -7169374, -1790465, 5826660, -19025632, 4847945, 39319888, 3023120, -25690884, -39580808, 32455994, -38178500, --31853624, -18658412, -16116865, -27580132, 7765838, 7218230, 44971528, 11319923, 19958176, -9706089, -21672942, -2465848, -8800388, 8194261, 1301375, -1929514, 22218940, 2911451, 11522860, 14055280, -7858717, 16823386, -4439923, 4620311, -3310346, -1260036, -3289945, -13971529, -10085657, -11527155, -13693966, 4846871, 12230456, 14824616, -2945811, 8906152, 19452980, 6949794, -5874979, 9924596, -11800960, 3991635, -2383170, -13848585, -12151536, 12444131, 5567352, 8282845, 16671452, 36328980, -15936476, 9172440, 6987912, 10281615, -5104569, -1211718, 18622978, -11780558, 6689949, -6545530, -6323803, 3681861, -35524748, -20596516, -26735634, 6997576, 14719927, 5149666, 22632868, 20334522, -28725816, 8880382, 31373662, 13983340, 20218022, -10047539, -4019553, -10093710, -24332600, -17466558, --37592776, -22316114, -7303592, -21922050, 4730907, -905701, -665720, 8909910, 7274064, 3358128, -18061412, -4606353, -15148887, 21691196, 1911797, -28789166, -12495134, -3142306, -34647500, -26254598, --25585120, 2330557, 12226698, 3315715, -13361106, -1698660, 14352170, 8873939, 34299072, 6393059, --46342160, -15434502, -8088497, 7367480, 7131257, -5333276, -12358232, 17124034, -25706990, -4764730, --20628192, 15557445, -40454296, -25016038, -33006824, -26453778, 1180042, -14918032, -11600170, -26539140, -13269838, 47679504, -1312649, 30821222, -17182016, 7559680, -22717692, -92342, 33883532, 8096014, --16132434, 1800665, 12994960, -22937272, -35606888, -19127100, 9007620, -27635968, 11797201, -407485, --845035, 17737142, 9182103, -4734128, 20506322, 20498806, 16376173, -5407364, -5738613, -3591130, --320512, 14288282, 10195715, 7216619, 290984, 14901389, 8186745, 2298881, 1885491, 11040750, --4669703, -3772055, 7614440, -11471321, 10302553, -9963250, -9879499, -11725798, 20486994, 12801150, -19040664, 6997576, 7141457, 1697586, 1282585, 9338870, -14387604, -23070954, 1759863, 6452115, -5718212, -9440875, 26409218, 10785737, 26641682, -43562780, 18854370, 32673426, -3211562, 37637336, --19997904, -57510684, -29775398, -438087, -5767068, 6305549, -20622286, 19825032, 28047748, -25324200, -22271016, -13892609, -16986058, -40174588, -16421271, -23105314, -15263777, -18489834, 18066780, 2658048, --35997732, -46090368, 34748432, 7826504, 12432857, -10810433, 2750927, -12505334, 292595, 10537165, -16012712, 14506252, 38909720, 1208496, -27992450, 37738804, -4041027, -9855876, -17584670, 15904801, --31122944, -20912196, 17591112, -16203838, -24253144, -30419642, -26665304, -5723581, 3512210, 2842732, --8266202, 32724966, 27839442, -2724620, -15946677, -27426050, -31490164, 7728794, 6582038, -6216429, --3121368, 44939316, 2982855, -13147969, 19377282, 9306657, -29688962, 23557896, 42742976, -46947212, -75754632, 20233590, 21832392, 8289824, 21986474, -6037651, -46864536, 32044750, 2670933, -5830955, -33251636, -39536248, 6856916, 6934762, -289910, -3830574, 1594507, -3095598, -10995653, 5823439, -11614665, -9743133, -1326071, -14407468, -16596827, 21415244, -4829154, -10522133, 4825396, -5741835, --13234405, -23835994, -5574331, -8109972, 20753282, -20001662, -2128156, 24549496, -5315559, 19615652, --7131793, -17177184, 8803609, -3474092, -8289824, 10149008, 2262911, 27040040, -3764539, -435402, -17815524, 54350664, 23877870, 1275605, -18184354, 25967910, -421981, 1887638, -12452721, 23699630, --27472758, 20076288, 19294066, 20333448, 9842454, -7428146, 26949846, 33803540, -6877854, 13980119, --20928302, 34012920, 14521821, 11404212, -21656836, -47345572, 9460739, -14481556, -10803453, -19183472, --24204288, 14685030, 6595459, -11724187, 2736968, 1193464, -12772696, -57854820, -3583613, -12239046, --5909338, -832150, 40845676, 27924266, -13576928, 10577968, -26856968, 3062312, 20158430, -30668214, --28472948, -23376970, 36980204, -26500486, 7719667, 29717416, -39957156, -37104224, 34254512, 27263916, -28760712, 38416872, 14229227, -49066780, 11112154, 14552960, -4305168, 80217640, -8257612, -12183212, --36203888, -31303332, 16201154, -28853590, 18861886, 6577206, 21329882, 43945032, -28145458, -19209242, -53524956, -32567664, -35935456, 23518704, -46293840, 33704756, -35191352, 8033200, 12156905, -25511568, -10624675, -29619706, 20656108, 37780680, -1503239, 6550899, 7804493, 1393180, -11503533, -10896869, --2432025, 10937671, -4833986, 7371775, -7625178, -23453742, 10090489, 2047089, 15979426, 7868380, -13960791, -4776004, -4592931, -23270670, 16360067, -3175592, -21163452, 4918812, 43736724, 12039867, --11103564, 12798466, 23580982, -11707007, 2630131, 17987324, -8999030, 17931488, 6172942, -5702106, --28037546, 4708895, -10675678, -749472, 35101156, -16086263, 1921998, -9327595, 12139188, 40338332, -3468723, -34213172, 49101676, 12007655, -3158949, 35035660, 17417166, 28366648, 10663867, -41888816, --9134322, -15585899, 19874962, 49069464, -30921618, 8035884, -14788109, 21930104, 25152402, -32890322, -27672474, -26388280, -23760296, 12282533, 22798224, 1114007, 7641284, 17825188, -26629334, 23760296, -1967632, 28965260, -4993973, -7451769, 9513889, 42819212, -19031000, 34626028, -16555488, 7108708, -9140227, 34602940, -1896228, -2077154, 11982422, 52074868, 3553549, -40421548, -3163244, -48696876, -29477972, 266825, 80233744, 17309256, -23278186, -6947110, 17847736, -17564806, 28271622, 52427592, -35931160, 941672, 15352897, 22796612, -2434710, -24173686, -3199214, -5383205, -83471616, 52279416, -39040716, 36025648, 8806294, -36079336, -10699837, 27444304, 14287209, 23917062, 12958453, -79946520, --28492276, 49295488, 13651017, 15994458, 42474544, -29885456, -857920, -4115653, 24106040, 6161668, --2258616, -6444062, 19018652, -4878009, -21745420, 10911364, -10438918, -12457553, 11438572, 16696148, --12197707, -3793530, -352724, 13175349, -16713865, 13683766, -14755897, 7043210, -25575994, -26228828, -26139170, 3414499, 2390149, -2988760, -18873696, -5816997, 17535814, 1890859, 6019934, 29053306, --4404489, -22042846, -2029372, -12529493, 10005663, 10868952, -10400263, -8912057, 11556683, 24045374, -30529702, 31479426, -19498614, 32030792, -29353418, 4917738, 15315317, -15103789, 2131915, 5996311, --8042327, -15772194, -29687350, 45157288, -10150081, -8937827, -15096810, -2568391, -6244883, 14651207, --30408368, -8804683, -19035296, 6485938, -19133542, 18309982, -138513, 9414031, -21095268, -38458748, -1802813, -28123982, -29343216, 13242995, -22509924, -19087908, 37120328, -13785234, -21714818, 2735894, --22326850, 10429791, 14016626, -4130685, -18234820, -5365488, 10626823, 9309878, -8291435, -829466, -32737314, -5878200, -20204600, -25706990, -3690988, -11294153, -38632156, 36206576, 12538620, -44404592, -27318676, -2017561, -18596672, 85270136, 48050484, 39239360, 20856362, 11945915, -20247012, 3114388, -9390946, 10011569, 3826816, 37313604, 8377334, -11123965, -18391050, -75511432, 15407121, 9876277, --363998, -14769319, -28420872, -5659157, -18306224, -16436840, -1172526, 23791434, -16327855, 41187124, -6055367, -8264054, -2876554, -3548180, 3295851, 17305496, -6718940, 4309463, 12189654, 4160213, -2359011, 9447854, -15360951, 7440494, 2792803, 24079734, -8360154, -6066105, -6613176, -6134287, --19122268, -10473278, 7015292, -20956220, 15627239, -4278861, -9947681, 14317273, 9169755, 12032888, --4470524, -1950989, 1648731, 2246805, -13169980, 6876243, 998580, -685584, -1134408, 8560407, --39060044, 65988416, 8433168, 21641266, 11814918, -16337519, 12295954, 18600430, 4662724, -1872069, --15910169, -2775623, 4536559, -7435662, -5624260, 2785286, 7447474, 19210852, -13249437, 8091182, -826781, 15335181, -5362267, 3053185, 5095442, -17577154, 14358613, 2334315, 3595961, 5153424, -5341329, -11133092, 11944841, -9594957, 2494302, 11401528, -6140193, 11178189, -4758824, 14085345, -10976863, 6362457, -17383880, 13064217, 9975598, 7956964, 21811454, -20890184, -1762547, -173409, --4378719, 6414534, -10733660, -17304960, 11954505, 13456133, 6811818, -1640141, 2928094, -1846836, -7066295, -6060199, 2915209, -12848932, 11790222, -19958714, 18937584, 10534481, -6250251, -267362, -7912941, 569620, 7102802, 151934, 881542, -660888, -6688338, 9688372, 13208098, -11564199, --2570001, 2429341, 7371238, -5250061, -5422396, 1537061, 2490007, -1310502, 1410897, -4248797, -1704028, 5405217, -4107599, 1156420, 3278134, -4355097, 3833258, 4734665, -332323, -1521492, --2150705, 923418, 9903658, -3688303, 1373316, -9097278, 647466, 10098542, -7042673, 7517267, --3369402, 571768, 16824460, -2931852, 434865, -353261, -5054640, 8658117, 3650185, 3718368, -3651796, -2735894, 2340757, 9482214, -2659122, 6455873, -4103841, -719944, 12753905, -52625160, --122606824, -19586662, 71805944, 65180424, 160488976, 83813600, -43142408, -13246753, -88809720, -150803824, --10371809, -68522984, -9509594, 109915728, 46970836, 84924392, 130380712, -15144592, -19054086, -66186520, --112542104, -89491552, -5730023, -33614024, -12705050, 93552440, 29700236, 60861296, 110603464, 18134962, --413391, 11467563, -67214088, -101802000, 17530982, -105197168, -68800008, 23377506, -10547366, 17128330, -135453600, 15562277, 51946020, 110599168, -22000434, 3456375, 24684788, -106575856, -88871464, -31478352, --121298464, -46964392, 15484431, 22470732, 83584360, 117725056, 83919368, 59248536, 51615844, -19576460, --71051104, -58331560, -87848184, -92284888, -39557184, -23360328, 630286, 77509664, 92438432, 28973312, -72234904, 21104932, -22857816, 15239081, -50332184, -69939248, -13689135, -32464584, -21749714, 39495444, --1460289, 27559194, 49070540, -13415867, -1079647, 52076, -24839944, -7596187, -1713692, -18570902, -20781200, 7590818, -4843113, 34013992, 10826539, -4804458, 32625646, -11399380, -34973380, 758062, --53425100, -37321656, 11537356, -35474820, 7592429, 41255844, 30258044, 56211996, 61210800, 22373022, -21633750, -2493229, -50493248, -70471824, -72613400, -75746584, -48209936, -3548180, 24310588, 52456048, -90927144, 97675608, 80999328, 63506996, -3823058, -59535228, -85520312, -109204376, -111530640, -59366112, --17980880, 46760384, 98652176, 89492624, 53832584, 40014600, 11560441, -8215199, -13448079, -39270496, --45605036, -34097744, -28732258, -20415590, -4365298, 4234838, 16190416, 24474872, 24661166, 23924578, -20991116, 9780714, -1379758, -7547332, -7346005, -5318780, -2968896, -2348810, }, +3768297, -8835821, 1731946, 642635, 554051, -6028524, -2137283, 1660005, -1321776, 1964948, +3140158, 1896228, -82141, 2475512, -6815576, 165356, -265751, -166967, 3743601, 5696737, +-5975374, -1340030, -3624953, -1181116, 2125472, 3909494, 631897, 970126, -1473711, -1946157, +-1586990, -1208496, -2721399, 1487132, -2743410, -1851131, 3117610, -2664490, 2237678, 369904, +-6746857, -2286533, -3719442, -891743, 2863133, -1995012, -592169, -1962263, -2030983, -1419487, +2798708, 4258460, 782758, 2367601, 1879585, -2263448, -4291746, 2301029, 1893544, -938987, +-3693135, -3081102, 2777770, 561567, 2077154, 988916, -5676336, -1875290, -2114198, 3129421, +1264868, -5708549, 1500017, -3026878, -938450, -298500, -2070174, 1626182, -1889249, 435402, +2175938, 2246268, 1379758, 1548336, 1013075, -183073, 1081795, 1331440, 125628, -1109712, +1523640, 314069, 12348, -451508, -1023813, 489626, 960999, 171799, 788663, -305480, +-521839, -13422, -801548, 840203, -148176, 993748, -192200, 191663, -96637, 923418, +485868, -49392, -389231, 584652, -10961830, 7269769, -5234492, 734976, -690416, -1993939, +5572720, -4885526, -3244311, 4832, 5890548, -2174327, -326954, -623307, 4875325, -2925947, +-7783018, -1723893, -3996467, -5440113, 217433, -425202, 915902, 3160022, 5205501, 3245922, +517544, 7947300, 3106335, 278099, 5677947, 5947993, -461172, -3190624, 242129, 2632815, +2113661, -36507, -1129040, -4599373, -4048007, -1986959, 4558571, 1890323, 7839389, 4438849, +-334471, 2628520, 3202435, 1075889, -4849018, 5274757, -2074469, 2762738, -195421, 1676648, +-5784247, -915902, -1829656, 2061047, -1756105, -2179159, 6066105, -408022, -4529580, 1807108, +-3443490, 2836289, -1935957, 4546760, 3925063, 4361540, 1480153, -4180614, 2321430, -624918, +2288681, -1802813, 664109, 5970542, -2281702, 2906082, 3935264, -576599, 254477, -166967, +-698469, -1571958, 1005022, -81604, 1505386, -19327, 1219234, 89657, 114354, 872415, +1466195, 618475, 1408212, 1565516, -279173, -1118839, 2032593, 235686, -41339, 171799, +1245541, -315143, -1091995, 602906, -251256, 336081, 59056, 1227287, 410706, 675384, +414464, 2190970, 2462627, 124017, -2135673, 2296734, 897111, 693637, 1088237, -8685498, +2812667, -5537287, 917512, 1785633, 1883343, -2545305, 4609037, 723165, -1708323, -804233, +5379984, 3852586, -2343979, -3023657, -2473364, 2070174, 3817152, -2321430, -2524904, 732292, +-9842454, -39728, -4201015, -1675574, -4179003, -5495948, -674310, 4967667, 1373316, -4483946, +-1185411, 4248797, 1291711, -2760590, 4831302, -2124398, -6736656, -2029372, 3783866, -1694365, +4477504, 8532489, 6921340, 933619, -93952, 2393908, -1048509, -5074504, 54761, 1877438, +-3615289, 3022583, -7171522, -1099512, 447750, -3073049, -2340757, 3096672, 6256157, -4928475, +-5114769, 3151432, 3202435, 5858873, 1900523, -3468186, 4706211, 4029216, -1349157, 4495220, +-5004711, 5040144, 1233729, 3405372, 698469, -2728915, -1541356, -522375, 1120987, 71941, +-2459406, 813896, 29528, -1476932, -1178969, 296890, -361314, 1068910, 68183, 1806571, +-1332514, -1014149, -64425, 198105, 1601486, -849330, -1591285, 685047, 62814, -377420, +1090385, -287763, 662499, -761820, 667867, 925029, 130460, 1524713, 14785425, -5742372, +-2528125, -945430, 10660109, -1059783, 8062191, -5859946, 7104950, -7029251, -6167036, 1484985, +3365644, -4149475, -1018444, 2121714, -541703, 2766496, -4278861, 4942434, 1788317, -5296232, +-199716, 2128156, 1661079, 949725, 10028749, 7994545, 6254546, 2147, 4060355, 383326, +1172526, 3005940, -9251896, -1411971, 5640903, 3672734, 4378719, -100395, -1637993, 2046015, +-362925, 11312944, -1710471, 1910724, 1137093, 556735, -3343632, 6786049, -769336, 7055558, +-3883187, -4070019, 2923799, -2710124, -9411347, -4332549, 1897839, -890132, -6731288, 1883343, +22012, 8766028, 769873, 764504, -2676302, 3194382, 3237332, -714038, -508954, 7700877, +5659693, 5623723, -3708704, -5277978, -4609037, -9019431, 753230, -6384469, -2155000, 407485, +-3481071, -3970697, -2212982, -444529, -1354525, 2128693, 3963181, -736587, -456340, -1774358, +919660, -1283658, -1486059, 638876, 1087701, 22012, 1400696, -811212, 52076, -783295, +-528281, -425202, 816044, -482647, -487479, -285615, -1280974, -1453846, 91268, -155693, +-1763084, 1505923, 1504849, 1834488, -33286, -1271310, -746251, 1443109, 10844792, -8636642, +-242666, -9032316, -5943698, -3533684, 7788387, 4560182, -10908680, -14902463, -5753646, 5224828, +3707094, -2254858, 5070209, 24696, -1293859, 554588, -7849590, 2330557, -1057636, 628139, +2444910, 504659, -55298, 3261491, 2857227, -5222144, -5209796, 5892159, -1901597, -2934537, +3596498, -10200547, 2398739, 2101313, -9404368, 3389266, 9678709, 5856188, 6635188, 1343788, +3649649, 9193377, 1703491, 1734630, -10597295, 5561446, 7943542, 6499896, 1227287, 6603512, +-7558069, 7398618, -2252174, -7429220, -11444477, -131533, -7289097, -5877663, -2537789, -6979322, +-17383344, 735513, 879395, -599148, 2676838, 8522826, 3186866, 3427921, 2252710, -6218576, +883153, 2884608, 2464774, 2186138, 2500745, -6381248, -1913408, -8039105, -3644817, -592169, +1848447, -2948495, 2827162, 556735, 481573, -2023467, -344671, -1080721, -2684, -1166621, +1056025, 335007, 796180, -307627, -1483911, -1236951, -1223529, 1220308, 776852, -14496, +-580357, -1121523, -1217086, -1182727, -3629247, 533113, 493384, -2753074, -1443646, -1007170, +-23475754, 11538967, 1474784, -9131637, 2201708, -1020055, -2704219, -1879585, -5178120, 2754148, +-2661806, 524523, 3367254, 3096672, 10151692, -4131222, -9726490, 5262409, -12329777, -5334350, +1997160, 1669132, 1392106, 3963718, 4930623, 4231080, -101469, 5607617, 355409, -2268280, +7474854, 4608500, -2291365, 4421132, -7753490, 14598594, 542777, 2688650, -1381906, -12594992, +-2184528, -4709969, -4409321, 1913945, 10460393, 259846, 431107, -1387274, -2895882, -6817187, +2138357, -1156957, 3741990, -8582418, 2876554, 4511863, 1997697, -6369974, -2252710, 1627256, +812823, 5086852, 1003412, 17746268, -5081483, -7623567, -8621073, -2649458, 178241, 6308233, +-8586713, -1155883, -3682398, 3879966, -12534862, -588411, -3397856, -5290863, 1559610, -1566053, +3415573, -489089, 6278169, 3933116, -19864, 1292248, 484258, 748398, 7281580, 833761, +5207111, 1846836, -1316944, 92342, 186294, 1463510, -958851, 732292, -279710, 2164127, +408022, -1689533, -2396055, 1897302, -922881, -2895882, -1257889, -1541893, -663036, -913217, +-53150, 3491272, 60130, 954020, 426812, 1387811, -1396938, -817654, -3034931, 10569378, +-3438121, -2558727, 2251100, 3096672, -8580271, -8658117, -7921531, -7448547, -12162811, 7612293, +-7131793, 2110977, 2912525, 10990284, -1858110, -2656974, 8600672, 1963874, 1773285, -10177999, +-6680285, 4946729, 2128156, 3924526, 5925445, -10721849, 80531, 4518843, 10155450, -147103, +924492, -1579474, -32749, -7013682, -1359894, -2212445, -13003550, -1087164, 3921305, -7487202, +3144453, -8141648, -88047, -5648956, -1193464, -1797444, 688805, 10402948, -3091840, 86436, +5313949, -3049427, 3093450, -8730595, -15508590, -8456791, -4734665, -2247879, 1598265, 10256919, +-4901095, 2705830, 2461553, -7484518, 2456721, -5779952, -2063732, 3711926, 10413148, -1674500, +-615791, 3274913, -293132, -9899900, -9362492, -3976603, 9230422, -1192927, -13987635, 908922, +-9211094, -4137664, -1960653, -1047972, 3032247, -3604551, -1128503, 3384971, -1043677, 3987877, +3461207, 2464238, -1716913, 3901441, -3620658, -2761127, -2585034, 512712, -480499, -856846, +-908922, -779537, -1299765, 699006, -393526, 2474438, -1850057, -1228361, 1008780, -1645509, +-985158, -4126390, -4944581, -535260, 309775, 2289218, 244813, 1337882, 34897, 10321880, +10834592, -3311957, 1009317, 11365557, -11555073, -10279467, 8696235, -2077690, 1189706, 7898982, +-1559073, -2153926, 7886097, -14601815, 6223408, -652298, 2472291, 7117298, 7332046, -8172249, +1548873, -11230803, 3455301, -3374234, -1206349, -7812009, -404264, -11201275, 1082332, -9707163, +6801081, -3398930, 1283122, 12138114, 5619965, 5441187, -9686762, 1795833, 11238319, -2646774, +-15984795, 8590471, -1957431, 1579474, -3150896, -7394323, 10549513, 3811784, 8594766, 2166811, +1239098, -7077569, -9217000, 3337727, 4304094, 4641786, 6120329, 14163192, -476741, -10944650, +-7145215, 8535711, -1233729, -9403294, -2485712, -556735, -2576444, -11904576, 183073, 1655173, +2974265, -4297652, 6870874, -326954, 755377, 9806484, 4998268, 10210211, -10023380, -4163971, +1846299, -5480915, 4560719, 2829310, 2792803, -392990, -1276142, -813896, -156229, -3920768, +5044976, -1822140, 3093450, -790274, 3603478, -1411434, -1789928, 250719, 2070174, -1750736, +-69256, -414464, -1990717, -971736, 912681, -2157684, -683974, -4613869, -3627637, 1996623, +3206193, 1702955, 1460826, -449361, -380641, -2137283, -349503, 2431488, -3102040, -401579, +1431835, -584652, 2509335, 2475512, -1736777, -657667, 2243584, 1602023, -1167694, 8219494, +-10004589, 11718281, -2637647, 12395276, -10122701, 9174587, 1010391, -969589, 15439871, -8065949, +925029, -7829189, -2331094, 23530516, 11358041, 4996121, 3407520, 6692096, -3757023, -31675, +-19889994, 3694746, -827318, -8603893, 9543417, 7155416, -293668, 1698123, -11491185, 10129143, +-5363878, 10756746, 7054484, 5742908, -8242579, -1452773, -6929393, 10328323, 2384781, -3764002, +18315888, 8749385, -2058900, 958851, -15162308, 2572686, 710817, 12045236, -5405217, -15432354, +-2647311, -4272956, -2991445, -21810380, -10858751, -23230404, -11823508, -8305393, 2742874, -5844377, +10975252, 1362578, -12530030, 7561290, -8380018, 11854647, -10562398, -8578660, 6190122, 10559177, +10416906, 30065, -9747965, -7792682, 4783520, -6391985, 250719, -3230352, 3941706, -4388383, +-6434935, 11361799, 5281199, 1549946, -1799054, 4280472, 2432562, 5269388, -485331, 3568044, +1274532, 5917928, 125628, -280784, 343061, -2918967, 112206, 1511829, 734976, 647466, +166430, 4557497, 2098629, -3601330, 406948, 2072322, -1130113, -1376000, -863288, 273804, +877784, 2294586, -569083, 1564442, 2673080, -555125, -2699924, -238371, -2944737, -1296006, +-2719251, -1755031, 2368138, 162135, -1519882, -14412300, -17111686, -11342472, -1632088, -220117, +-2219961, 4067334, 6190659, 4298189, -2684, 2304787, -5430986, 3563749, -11024107, -15368467, +482647, 11781632, 2063195, -4150549, 9428527, 5578626, 9125732, 15359877, 1994476, -4745939, +-9789841, -7841537, 4488778, -8987756, -6230924, 2309082, -7111392, -15677704, -8593156, -870805, +-1819992, 3660386, -3526168, 8676908, 2521146, 3288334, 12015708, -1931125, 1424855, 2779918, +-9591199, 11307038, 1862405, -10468983, -17119740, 4350265, 1538672, -12446278, 13166222, 8542690, +-11532524, 3898220, 11067057, 6221260, 2966749, 9185861, -4206921, -3714073, 694711, -5097053, +-8150238, 13941464, -12437152, -1393180, 5201206, 1188095, 21675626, -18824842, 5738613, -2412161, +-91805, 6055367, 241055, 1292248, -5064840, 2862596, -11167989, -23679228, -1338956, -294742, +-12175159, -7743826, -1702955, 4468377, 3894999, 1661616, 992137, -3950833, -130997, -5531918, +-2795487, -1079647, -3218541, -4988605, 1694365, -956704, 835908, -2558727, -1881196, 1166084, +-4076998, -8646306, -3037079, 571231, -2363306, -8338679, -4670240, 3441880, 2344515, 1625645, +-1676111, -3212636, -4017942, -753230, -2033130, -4740034, -3946001, -5586679, -2941516, -3774203, +-3800509, -125091, -955093, 1496259, -1509681, -1062468, 3049427, -4175782, -11172284, 9836549, +-20196546, -14342506, 10631118, -497679, -18396956, 9430138, -10768557, 20817706, 4153234, -27399744, +-3498788, 2491618, -6935836, 2062658, 4760435, 9727027, 8310762, -15913391, -715649, 1491964, +-3319473, -14581951, -2275259, -3022046, -5031018, -4443681, -232465, 1086090, 12392591, 13608604, +-4239133, 7333657, 6303938, 6193343, 13531294, 181462, 3621731, -15604153, -5390721, 5514201, +-3111704, 7551626, 18582712, 2755759, -16310138, -36280124, -106837, -11173357, 10282152, -6842957, +-3721589, -7112466, -19632296, 8555575, 26186416, 1558536, 6844568, -20537460, 4231617, -2304250, +-9286793, 2390149, 10027138, 5259188, 8085813, -8820252, 12981539, 7665443, -15186467, -22479858, +-1461363, -17082696, -16047608, -10166724, -11839077, 1587527, 21087752, 8159364, 750546, -2768107, +13568339, -6864432, -10149008, -1560684, 2090575, -1528472, 2477659, 2175401, 97711, 2204929, +5176510, 1988033, -589484, 467078, -2041720, -1919314, 5430986, -1564979, 5342403, 222265, +-3069828, 755377, -1629940, -2167885, 6462315, -1461900, 3482145, -7869454, -1051730, 3993783, +-70867, 1706713, 6599754, -4860293, 6027450, -483721, 639413, 1991254, -2075543, 4774930, +636192, 417686, 776315, 374199, 2075543, 6124624, -2536715, 2253784, 2300492, 2484102, +2593087, -39564164, -24974698, 17972828, 14476187, 23538032, -62277, 9288404, 2317672, 7446937, +-277562, 4811437, -10397579, -12466679, -7733089, -11158325, -7195144, -7941932, 9589051, 22630182, +4959077, -27557048, -6531035, 4860829, -7303592, 6765111, -15746424, -1249299, -511101, 944893, +7708393, 5855651, 1101122, -1870995, -3502009, 6448357, 12498355, -9972377, -15495168, 10350871, +4934381, 13568339, 6200859, 19711752, -13598403, -4749697, 12584791, 18796388, 16323023, 9683541, +4605279, -3995393, 1249299, -2334852, 84289, 6534256, -24508694, 13211319, -1921998, 3601867, +-1611150, 18650896, -5673115, -246424, -4075387, 11839077, 10033580, -20890184, 15015206, -17765596, +-894427, -8994198, -8946417, 8157217, 1489280, -27710056, -2455111, -2157684, -5116380, -3198677, +-650151, -3510062, 14413373, 1449552, 13786845, -4327717, 16302085, 7723962, -8420820, 3620121, +-2104534, 969589, 1056562, 1570884, 2195802, 874563, -3163244, -5186710, 8105677, 3630321, +6651831, 1892470, -3963718, 7694971, 294205, 438087, 5769752, -16141561, -7505992, -7152731, +2266132, -180926, -10996727, 514322, 1838783, -469225, -2072322, 10737, 3769371, -3979287, +-170725, 4419522, 2174327, 5378373, -4673462, -2244121, 1318555, 5832566, 21975200, -24447490, +-562104, -13895830, -39199092, -4634270, -14467597, -30939870, 6183679, -199179, -6012418, 1946157, +16628503, -1074816, -17575544, 6033356, 710817, -5646809, -4227322, -3132105, 890132, 19164680, +-4299263, -702764, 8702677, 6433324, -2756832, 9281961, 8493298, -4088809, -4021700, -7694434, +10666014, -2544231, -18357764, 2808909, -1212255, 6314676, 24064702, -16054051, -25756382, -16240882, +-7518341, 3569118, 8600672, 4574677, 18321794, 9160628, -12899934, -7444789, -17597554, 15252503, +9388799, 1705639, 3247532, -10091563, 1075889, -10677289, 18474802, 18126910, 1306207, -8428336, +-4679367, 1801202, 16822314, 33556044, 20659866, -3161633, -7475928, 478352, 10696079, 4651450, +9875204, 13607530, -13442174, -610422, -25943750, -17482128, -16661252, -11159936, 7009387, 15963320, +10980621, 1757179, -3147674, -1470489, -14425185, -18149458, -4556424, -9629854, -9073655, 2114735, +-1809255, -2294586, 135828, 614180, 4191351, -4597763, 9330280, -9407589, 4032974, -11981348, +-3980898, 12885, 2274722, -323733, 2164664, 4638028, -3206730, 578747, 11092290, 13513578, +16280074, 8943733, 10223096, 4641249, 1999307, 801011, 357019, 658204, -2765422, -8714489, +-8507793, -1376537, 6752763, 44023, 1114007, -3532074, -2458332, 1083942, 8258685, 5206037, +9843528, 6957310, 8390219, -19150722, -2259690, -9921911, 14396730, -15912854, 3073049, 1387274, +28167470, -17437030, -5116917, -17934172, -3887482, -17714592, -14890652, -10747619, 5542119, -19054086, +-13828184, -20718922, -5299990, -3126199, -6349036, -9368397, -23092428, 6023692, -16326244, 6584185, +-17128866, 21088826, 3238405, 9446781, -4083977, -19912006, 10650982, 6164352, -6710350, 10648298, +14899242, -8067559, -21455510, -11492796, 28732794, -12289512, -947577, 734439, -4886599, 6313602, +18619220, 3300682, 7914014, -6003291, 13318157, 183610, 10489384, 3197066, 3555159, -326954, +1067836, 22790708, 6899865, 54564340, -33313914, 21263846, 29894582, -7899519, 674310, 15425375, +-11184632, -3272765, 25029996, 9921374, -4181151, 13292387, -5694590, -24241332, -17942226, 6090264, +969052, -32388886, -9021042, -3306051, -16829830, 8652212, 5037997, -10930155, -8961986, -6597607, +943819, 2989297, 6853694, -5677410, 803696, 4013110, -1795833, -7191923, 1984275, 1521492, +2267743, 6747394, 1198296, -4091493, 545461, 7817378, 6918656, 3377992, -7744363, -155156, +14251238, -4052302, -3006477, 7923678, -7740068, -13383655, -3818226, 751082, -1741609, -6859600, +-2112587, -395137, -7584912, -1552631, 814970, -2083059, -7870528, -12959527, 4940823, 13986561, +5057324, -260919, 511638, -2582349, -8253854, -6565395, 30640296, 34205120, 775778, 24771224, +24680492, -1058710, 11282879, -24239184, -7288560, 22007950, 2385854, 21731460, 30325154, 25001004, +-4642323, 16411607, -24810416, -38918308, -16445430, -14384382, 9780714, 347892, 10443750, 11212012, +23963770, 18564996, 6718940, -18418968, -1927367, 18963354, 6364605, -8905615, 12378633, 26039850, +-2548526, 9234180, -20676510, 10329396, -16246251, -4245039, -10183367, -21556978, 13732084, 1761474, +6881612, 26360362, -13763760, -15630997, 9783936, 27299886, -20903068, -13987098, 9155260, -6629282, +38579008, 28526100, -26533234, -9926206, -20899848, 1364726, 23678154, -10600516, -15836618, -7169374, +1790465, 5826660, -19025632, 4847945, 39319888, 3023120, -25690884, -39580808, 32455994, -38178500, +-31853624, -18658412, -16116865, -27580132, 7765838, 7218230, 44971528, 11319923, 19958176, -9706089, +21672942, -2465848, -8800388, 8194261, 1301375, -1929514, 22218940, 2911451, 11522860, 14055280, +7858717, 16823386, -4439923, 4620311, -3310346, -1260036, -3289945, -13971529, -10085657, -11527155, +13693966, 4846871, 12230456, 14824616, -2945811, 8906152, 19452980, 6949794, -5874979, 9924596, +11800960, 3991635, -2383170, -13848585, -12151536, 12444131, 5567352, 8282845, 16671452, 36328980, +15936476, 9172440, 6987912, 10281615, -5104569, -1211718, 18622978, -11780558, 6689949, -6545530, +6323803, 3681861, -35524748, -20596516, -26735634, 6997576, 14719927, 5149666, 22632868, 20334522, +28725816, 8880382, 31373662, 13983340, 20218022, -10047539, -4019553, -10093710, -24332600, -17466558, +-37592776, -22316114, -7303592, -21922050, 4730907, -905701, -665720, 8909910, 7274064, 3358128, +18061412, -4606353, -15148887, 21691196, 1911797, -28789166, -12495134, -3142306, -34647500, -26254598, +-25585120, 2330557, 12226698, 3315715, -13361106, -1698660, 14352170, 8873939, 34299072, 6393059, +-46342160, -15434502, -8088497, 7367480, 7131257, -5333276, -12358232, 17124034, -25706990, -4764730, +-20628192, 15557445, -40454296, -25016038, -33006824, -26453778, 1180042, -14918032, -11600170, -26539140, +13269838, 47679504, -1312649, 30821222, -17182016, 7559680, -22717692, -92342, 33883532, 8096014, +-16132434, 1800665, 12994960, -22937272, -35606888, -19127100, 9007620, -27635968, 11797201, -407485, +-845035, 17737142, 9182103, -4734128, 20506322, 20498806, 16376173, -5407364, -5738613, -3591130, +-320512, 14288282, 10195715, 7216619, 290984, 14901389, 8186745, 2298881, 1885491, 11040750, +-4669703, -3772055, 7614440, -11471321, 10302553, -9963250, -9879499, -11725798, 20486994, 12801150, +19040664, 6997576, 7141457, 1697586, 1282585, 9338870, -14387604, -23070954, 1759863, 6452115, +5718212, -9440875, 26409218, 10785737, 26641682, -43562780, 18854370, 32673426, -3211562, 37637336, +-19997904, -57510684, -29775398, -438087, -5767068, 6305549, -20622286, 19825032, 28047748, -25324200, +22271016, -13892609, -16986058, -40174588, -16421271, -23105314, -15263777, -18489834, 18066780, 2658048, +-35997732, -46090368, 34748432, 7826504, 12432857, -10810433, 2750927, -12505334, 292595, 10537165, +16012712, 14506252, 38909720, 1208496, -27992450, 37738804, -4041027, -9855876, -17584670, 15904801, +-31122944, -20912196, 17591112, -16203838, -24253144, -30419642, -26665304, -5723581, 3512210, 2842732, +-8266202, 32724966, 27839442, -2724620, -15946677, -27426050, -31490164, 7728794, 6582038, -6216429, +-3121368, 44939316, 2982855, -13147969, 19377282, 9306657, -29688962, 23557896, 42742976, -46947212, +75754632, 20233590, 21832392, 8289824, 21986474, -6037651, -46864536, 32044750, 2670933, -5830955, +33251636, -39536248, 6856916, 6934762, -289910, -3830574, 1594507, -3095598, -10995653, 5823439, +11614665, -9743133, -1326071, -14407468, -16596827, 21415244, -4829154, -10522133, 4825396, -5741835, +-13234405, -23835994, -5574331, -8109972, 20753282, -20001662, -2128156, 24549496, -5315559, 19615652, +-7131793, -17177184, 8803609, -3474092, -8289824, 10149008, 2262911, 27040040, -3764539, -435402, +17815524, 54350664, 23877870, 1275605, -18184354, 25967910, -421981, 1887638, -12452721, 23699630, +-27472758, 20076288, 19294066, 20333448, 9842454, -7428146, 26949846, 33803540, -6877854, 13980119, +-20928302, 34012920, 14521821, 11404212, -21656836, -47345572, 9460739, -14481556, -10803453, -19183472, +-24204288, 14685030, 6595459, -11724187, 2736968, 1193464, -12772696, -57854820, -3583613, -12239046, +-5909338, -832150, 40845676, 27924266, -13576928, 10577968, -26856968, 3062312, 20158430, -30668214, +-28472948, -23376970, 36980204, -26500486, 7719667, 29717416, -39957156, -37104224, 34254512, 27263916, +28760712, 38416872, 14229227, -49066780, 11112154, 14552960, -4305168, 80217640, -8257612, -12183212, +-36203888, -31303332, 16201154, -28853590, 18861886, 6577206, 21329882, 43945032, -28145458, -19209242, +53524956, -32567664, -35935456, 23518704, -46293840, 33704756, -35191352, 8033200, 12156905, -25511568, +10624675, -29619706, 20656108, 37780680, -1503239, 6550899, 7804493, 1393180, -11503533, -10896869, +-2432025, 10937671, -4833986, 7371775, -7625178, -23453742, 10090489, 2047089, 15979426, 7868380, +13960791, -4776004, -4592931, -23270670, 16360067, -3175592, -21163452, 4918812, 43736724, 12039867, +-11103564, 12798466, 23580982, -11707007, 2630131, 17987324, -8999030, 17931488, 6172942, -5702106, +-28037546, 4708895, -10675678, -749472, 35101156, -16086263, 1921998, -9327595, 12139188, 40338332, +3468723, -34213172, 49101676, 12007655, -3158949, 35035660, 17417166, 28366648, 10663867, -41888816, +-9134322, -15585899, 19874962, 49069464, -30921618, 8035884, -14788109, 21930104, 25152402, -32890322, +27672474, -26388280, -23760296, 12282533, 22798224, 1114007, 7641284, 17825188, -26629334, 23760296, +1967632, 28965260, -4993973, -7451769, 9513889, 42819212, -19031000, 34626028, -16555488, 7108708, +9140227, 34602940, -1896228, -2077154, 11982422, 52074868, 3553549, -40421548, -3163244, -48696876, +29477972, 266825, 80233744, 17309256, -23278186, -6947110, 17847736, -17564806, 28271622, 52427592, +35931160, 941672, 15352897, 22796612, -2434710, -24173686, -3199214, -5383205, -83471616, 52279416, +39040716, 36025648, 8806294, -36079336, -10699837, 27444304, 14287209, 23917062, 12958453, -79946520, +-28492276, 49295488, 13651017, 15994458, 42474544, -29885456, -857920, -4115653, 24106040, 6161668, +-2258616, -6444062, 19018652, -4878009, -21745420, 10911364, -10438918, -12457553, 11438572, 16696148, +-12197707, -3793530, -352724, 13175349, -16713865, 13683766, -14755897, 7043210, -25575994, -26228828, +26139170, 3414499, 2390149, -2988760, -18873696, -5816997, 17535814, 1890859, 6019934, 29053306, +-4404489, -22042846, -2029372, -12529493, 10005663, 10868952, -10400263, -8912057, 11556683, 24045374, +30529702, 31479426, -19498614, 32030792, -29353418, 4917738, 15315317, -15103789, 2131915, 5996311, +-8042327, -15772194, -29687350, 45157288, -10150081, -8937827, -15096810, -2568391, -6244883, 14651207, +-30408368, -8804683, -19035296, 6485938, -19133542, 18309982, -138513, 9414031, -21095268, -38458748, +1802813, -28123982, -29343216, 13242995, -22509924, -19087908, 37120328, -13785234, -21714818, 2735894, +-22326850, 10429791, 14016626, -4130685, -18234820, -5365488, 10626823, 9309878, -8291435, -829466, +32737314, -5878200, -20204600, -25706990, -3690988, -11294153, -38632156, 36206576, 12538620, -44404592, +27318676, -2017561, -18596672, 85270136, 48050484, 39239360, 20856362, 11945915, -20247012, 3114388, +9390946, 10011569, 3826816, 37313604, 8377334, -11123965, -18391050, -75511432, 15407121, 9876277, +-363998, -14769319, -28420872, -5659157, -18306224, -16436840, -1172526, 23791434, -16327855, 41187124, +6055367, -8264054, -2876554, -3548180, 3295851, 17305496, -6718940, 4309463, 12189654, 4160213, +2359011, 9447854, -15360951, 7440494, 2792803, 24079734, -8360154, -6066105, -6613176, -6134287, +-19122268, -10473278, 7015292, -20956220, 15627239, -4278861, -9947681, 14317273, 9169755, 12032888, +-4470524, -1950989, 1648731, 2246805, -13169980, 6876243, 998580, -685584, -1134408, 8560407, +-39060044, 65988416, 8433168, 21641266, 11814918, -16337519, 12295954, 18600430, 4662724, -1872069, +-15910169, -2775623, 4536559, -7435662, -5624260, 2785286, 7447474, 19210852, -13249437, 8091182, +826781, 15335181, -5362267, 3053185, 5095442, -17577154, 14358613, 2334315, 3595961, 5153424, +5341329, -11133092, 11944841, -9594957, 2494302, 11401528, -6140193, 11178189, -4758824, 14085345, +10976863, 6362457, -17383880, 13064217, 9975598, 7956964, 21811454, -20890184, -1762547, -173409, +-4378719, 6414534, -10733660, -17304960, 11954505, 13456133, 6811818, -1640141, 2928094, -1846836, +7066295, -6060199, 2915209, -12848932, 11790222, -19958714, 18937584, 10534481, -6250251, -267362, +7912941, 569620, 7102802, 151934, 881542, -660888, -6688338, 9688372, 13208098, -11564199, +-2570001, 2429341, 7371238, -5250061, -5422396, 1537061, 2490007, -1310502, 1410897, -4248797, +1704028, 5405217, -4107599, 1156420, 3278134, -4355097, 3833258, 4734665, -332323, -1521492, +-2150705, 923418, 9903658, -3688303, 1373316, -9097278, 647466, 10098542, -7042673, 7517267, +-3369402, 571768, 16824460, -2931852, 434865, -353261, -5054640, 8658117, 3650185, 3718368, +3651796, -2735894, 2340757, 9482214, -2659122, 6455873, -4103841, -719944, 12753905, -52625160, +-122606824, -19586662, 71805944, 65180424, 160488976, 83813600, -43142408, -13246753, -88809720, -150803824, +-10371809, -68522984, -9509594, 109915728, 46970836, 84924392, 130380712, -15144592, -19054086, -66186520, +-112542104, -89491552, -5730023, -33614024, -12705050, 93552440, 29700236, 60861296, 110603464, 18134962, +-413391, 11467563, -67214088, -101802000, 17530982, -105197168, -68800008, 23377506, -10547366, 17128330, +135453600, 15562277, 51946020, 110599168, -22000434, 3456375, 24684788, -106575856, -88871464, -31478352, +-121298464, -46964392, 15484431, 22470732, 83584360, 117725056, 83919368, 59248536, 51615844, -19576460, +-71051104, -58331560, -87848184, -92284888, -39557184, -23360328, 630286, 77509664, 92438432, 28973312, +72234904, 21104932, -22857816, 15239081, -50332184, -69939248, -13689135, -32464584, -21749714, 39495444, +-1460289, 27559194, 49070540, -13415867, -1079647, 52076, -24839944, -7596187, -1713692, -18570902, +20781200, 7590818, -4843113, 34013992, 10826539, -4804458, 32625646, -11399380, -34973380, 758062, +-53425100, -37321656, 11537356, -35474820, 7592429, 41255844, 30258044, 56211996, 61210800, 22373022, +21633750, -2493229, -50493248, -70471824, -72613400, -75746584, -48209936, -3548180, 24310588, 52456048, +90927144, 97675608, 80999328, 63506996, -3823058, -59535228, -85520312, -109204376, -111530640, -59366112, +-17980880, 46760384, 98652176, 89492624, 53832584, 40014600, 11560441, -8215199, -13448079, -39270496, +-45605036, -34097744, -28732258, -20415590, -4365298, 4234838, 16190416, 24474872, 24661166, 23924578, +20991116, 9780714, -1379758, -7547332, -7346005, -5318780, -2968896, -2348810, }, }, { { -4409321, -4645544, 1169842, -2513093, -1113470, -5609228, -1494112, 4714264, -2479270, -1804423, 1459215, --723702, -166967, 308164, -1490891, -1195075, 5713917, 2785823, -683974, 290984, -838056, --1690607, 796180, 2050847, 3149285, -788663, 1211181, 1461900, -5037997, -1535451, 1074, --989453, 3107946, 294742, -1051730, 2800319, -2114735, 955093, 4337380, -2386928, 285615, -592169, 3295314, -1253057, 4540854, -6410776, -2333778, 2807298, -1263794, -5432060, 399432, -1105417, 1821603, 1874216, -580357, -2334315, 209917, -2117419, -1439351, 644245, 2703145, -2491081, -3621194, 3202435, -3963718, 3555696, 209380, 3118146, -1204738, -2568927, -1134408, -2098092, -397821, -522912, -623844, 2902861, -3117073, 1610613, 768262, 783832, 995359, -2321967, 745177, -1489817, -1682017, -930397, 1265405, -272730, -1234266, 238371, -1490891, --330176, -102005, -1525787, -607738, -860067, 202937, 821413, -1028108, -740882, 427886, --211527, -1471563, -15569, 804233, -573915, -73014, 300111, -135828, 576599, 420907, -41876, -1111860, -373662, 41876, -505732, 30602, -124554, -779000, 436476, -1320703, --15288473, 5019743, -5557151, -2214056, -4549981, -4671851, 2656437, -1557999, -3944928, -2119566, -5366562, 7975755, -4361540, -1623498, -387084, -5743982, -5397164, 404801, -545461, 3509525, -1182727, 2614025, -2302103, -1441498, -2982855, 840740, 5148055, 2234994, 1001264, -3318936, -2517388, 761283, 1540820, -2166274, 192200, 760746, 1156957, -2943663, -2152852, 805843, --4063576, -4154307, 1782948, 3151432, -3542274, -1782411, -1365263, 255014, 3141769, 2532957, -1096290, 477815, 8125005, 3190624, -2565706, 3163780, 2253784, -2257542, 3838627, -1430224, --962610, -21475, -1673427, 3411278, -1920387, 896038, 2056216, 1647657, -3036005, 1196148, -566936, 614717, -1061931, -1505386, -632434, 4765266, 317291, -1412507, -1021665, 1124745, --4287988, 830539, 2553358, -165893, 1653026, -944356, -1545115, 1036161, 944356, -399969, -1606855, 827855, -458488, 1140314, 1194001, 1996623, 259846, 6979, -141197, -600759, --849330, -85899, -152471, -531502, 587874, -188979, 1990181, 11633456, 4636417, -812286, -525060, 2665027, 1391569, -788663, -5030481, 161061, 4458713, -4577899, -513785, -8590471, -2252174, 3496640, 230854, -2047626, 6276558, 4413079, -4049081, 1954210, 235149, -3549791, -5600638, 3087545, -367757, 2261300, 5336497, -1656784, -1105954, 355409, 28991, 126165, -1279363, 6554657, 1317481, 977105, -10602664, -562104, 479963, 1264868, -4799626, 1108638, --3871913, -2971581, -4095251, -2675765, 21475, 1229434, -2503429, 2498060, -6092948, -3499862, --374736, -82678, 1950452, -2442226, -571231, -2211908, 1319629, 3296388, -1997697, 352187, --1729798, -316217, 5110474, 4003447, -1618129, 3751654, -1801739, -3202435, -4001299, -302258, --374199, -2698850, 2434173, -430570, 692564, -301185, -891206, 180926, -577136, -2188286, --141197, -3485903, 391379, -1717987, -1123134, -2928631, 3393024, -1043140, 1155346, 2317672, -917512, -1183264, -275952, -1328219, -98784, 583042, -1306744, 1346472, -111669, 146029, -192737, -481036, 790811, 458488, 248034, 99321, 1918240, 921271, -619549, -1308891, --1193464, 1159104, 1560684, -5906, 397284, 18367428, -7986492, 1513976, -667331, -3384434, -2921652, 5151277, -3338263, 5537824, -299574, 5906654, 1641214, 2087354, -2539400, 3349538, -1298691, 3430068, -7220377, 3874061, -4267050, 1340567, -3583077, 4536559, -1232119, 4569845, --2678449, 1684164, -1753420, -392990, -195958, -457414, 1801202, 9492951, 426276, 2789581, --2619930, -4395899, 192737, 88584, 193274, 1447941, -3041374, 6228240, -387621, 5221607, -371515, -2253247, -2845953, -7824894, 3854733, 2553895, -3651796, 411780, 3146601, 1670742, --9108552, 5449240, -297427, 3875134, -5466420, -5893232, -2851322, -5740224, -1043140, 6642704, -1392643, -2540473, 408559, 3759170, -1250909, -3010772, -1553168, -3376918, 2433636, -5121749, --889058, -3928821, -1488206, -14496, 4423817, 2076617, 499827, 1380295, 5551245, 2913062, -695248, 2028298, -1545651, -612033, 389768, 106300, 905164, 467078, -933082, 546535, -1974611, -130997, 444529, 733366, -920197, -1272921, 1249299, -1523640, 1841467, 1079647, -1708860, 45634, -617938, 1039919, 1693291, 441845, -665183, 550830, 4801237, -11261404, -2295123, -3550864, -10289668, -7931194, 4216048, 4702453, 6188511, -3063386, -1592359, 4260608, -2035815, 6367289, 2073396, -710280, 651224, 4064113, 7918309, -2027225, 2308008, -96637, -6416145, 1476395, -392453, -1286343, -4896263, -7444252, 80531, -1069984, 2237678, -420907, -1752884, 1305133, 454193, 478352, 1482301, -2541010, 285078, 3541201, 5538361, -2709051, -658204, -2387465, -3182034, 4576825, -3511673, -8744017, -3438658, -2238752, 4202089, 352187, -4636417, 4240207, -2246268, 188442, -3628711, -503585, -1557999, 5430986, -6838125, -196495, -2304787, -7240241, -8150774, 127238, 2518998, 5163625, -3598646, -8621073, 4501663, -7954280, -9303436, 5259188, 1531693, 3968013, -93416, -3828427, 11826192, -1073742, 5724118, -216359, -8272644, 5689758, 3024731, -840203, -1612223, -2772402, -1021665, 1253594, 300648, 2289218, --2338073, 1428077, -1241782, -843424, -877784, -952409, 1123671, -591095, -19327, -1748052, --79457, 1087164, 1996086, -1999844, -2450279, 351650, 1086090, -10201, 1305670, -725850, -154619, -953483, -308701, 683437, 1234266, 1519345, 906775, -1183800, -24921548, 5126044, -1252520, -12519830, -15799037, -2546916, -12199318, 9904195, 2830384, -7357279, 451508, -3427921, -1094143, -5025649, 634581, -294205, 49929, 6979859, -2505577, -1636383, -2922725, -2578054, --6598681, -4424890, 6602976, -2736968, 4172024, -3688303, 1800128, 104690, 3768297, -3850975, -2851858, -3868155, 1675574, -1483911, -2420214, 2386391, -6170258, 2362232, -3146064, -1132261, --4487704, 10817412, 5142150, 9484362, -4054449, 3998078, 3211562, -1887101, 1679869, -4496294, -4759361, 10401874, 8217346, -5731097, -1542967, 2436320, -4155918, -2787434, -7270306, -13591961, --4617627, 6969658, 2500208, -3353833, 1372779, 715649, -3709778, -6455336, -6522445, 4634807, -534723, -9989020, 1058173, 966905, -493384, -744640, 3311420, 7247221, -740882, -4832, -1012002, -3758, -1906429, -6601902, 2185602, 2230162, 1358283, 3090229, 1868311, -2822331, -728534, -1775432, 368830, -1500554, -606664, -1660542, 42950, 379031, -199716, -1200443, --1170916, -349503, 515396, -33823, 2428804, 873489, 2267206, 2458332, 2656974, -3177202, --3230352, -1205812, 2440615, -823560, 896574, -945967, 1348620, 1418950, 913754, -1545115, --874026, -9754408, -4061429, -2529736, 7379291, -1940252, 1758789, -7597261, -7928510, 406411, -2311229, -4633196, -2652142, -4345970, 9042517, 2008434, -3016141, -6573448, -6491843, -6340446, --1756642, 3076270, 9083319, 2965138, 5138929, -4049081, 9672803, 5541045, 1792075, 134755, -9948218, -5777805, 961536, 3173981, 6740415, -10850698, -5519033, 4777078, 1932198, -1470489, -11361799, -4924717, 3231426, 6874632, 2150705, 1185948, 5022428, 2068564, 2513093, 2584497, -1111860, 2973191, -139050, 4362613, -973884, 10638634, -7676181, 8763344, 6959995, -5994701, -6892886, 1312649, 5863167, 5947456, -12927315, -297427, -490700, -3855270, 2100776, -3472481, -3620121, -1423782, 8289287, -852014, 1324997, 3436511, 2348273, 3328600, -5243082, -1717450, --5359046, -4936528, -2837363, 8073465, 1221918, -2500745, 2392297, 2266669, 1043677, -1296006, -857383, -899259, 3182034, 1257889, 1023813, -1469416, 993748, -2950106, -258772, 3564286, -1843078, -505196, 1182190, 1305133, -963146, 1541356, 1009854, 3462281, 1887101, -1824287, --735513, -1054951, 1051730, -2953327, 895501, 13029320, -3384434, -1966558, -3135863, 9292699, -4901632, 1034550, 3574487, -6207302, 13874355, 4626217, -1044214, 5265093, 6726456, -11243688, --709743, 2717104, 1368484, 28991, 9601399, -4549444, -5753109, 13191455, 2035278, -889595, --1258962, 6913824, 574989, -955093, -1241246, -3149285, 3475166, -1937030, 4619238, 3257196, --8234526, -7808251, 1034013, 15560667, -134755, 3208878, -9523553, 4766877, 6424198, -3921842, -4776004, 5903433, -9656160, -5887327, -1168768, -12396349, -6548752, -7384123, 2233920, -2507187, --2706903, -1328756, 8796093, -11954505, 5348845, 2641405, -3839164, 7355669, -4634807, 737661, --10020696, -177167, 6140730, 5504538, 11514270, -13514651, -3316252, -15008763, -3177739, -275952, --3528853, 1714766, -686121, 13708999, 10671920, 6038187, -6761353, 372588, 2673080, 6691022, -8258149, -168041, 84826, -1150514, 222801, 4684199, -178241, -388695, -140123, 97174, -283468, 579284, 1943473, -1916629, -557809, 1960653, 374736, 1811403, -14496, 206158, --1524177, 2480344, 1576790, 34360, 2376728, -1179505, -99321, 2172180, 632434, -374736, --2646237, -185757, 658204, 386010, -911607, 2777233, 4720169, -861678, -78383, -2116345, -1595580, 8907225, -9888625, 377957, -6040335, 17067664, -7141457, -4081293, 14803679, 11172284, -2113661, -20521890, -4962298, 9516037, 821949, -937377, -2874407, -1569811, -1548336, 1488206, -3243237, 2957085, 2821794, 18278844, -3745748, -2595234, 73551, 2429341, -5374078, 3252364, -1995549, -632434, -5919539, -3711926, 6645388, 7096360, 13408351, 3458523, -5428839, 3418257, --107374, 3463354, 314069, 7449621, -6103686, -9160628, -9421011, 6255620, -2637647, 1341104, -2538863, -3349001, -561030, 15881715, 5478231, -13320841, 9572945, 3077344, 16108275, -8301098, --7793755, 4681515, 8704288, 6006512, 3395709, -1435056, 573378, 4167729, -5156645, -1460289, -241592, 6851010, -4867809, 13722957, -424128, -147640, -7004555, -7936026, 15715822, 4691178, --12769475, -2965138, 10854993, 7518341, 1562294, 2747705, -6465000, 2085207, 1813550, 2142115, -1268626, 2373506, -2931852, -3614752, 563714, -74088, -2936147, -962073, 2880849, 2789045, --3949759, 1102733, 79457, 1794760, 2499134, -634581, -619549, -956167, 1717987, 4848481, --3391951, 2687576, -132070, 153008, -1947231, -440771, -1423782, -993748, 2403571, -762894, --1241246, -3090766, -6979, -1735704, -12320114, -10470057, -4148402, 3668976, 3762928, 18720152, -18159658, -2238752, 1349157, 700080, 9664, -315143, -3912178, -12379169, -9547175, -4967130, -4209605, -3526705, -10814728, -3127810, 1889249, -893890, -16509317, -4911832, 3481608, -1773822, -1404991, 1032403, 4772783, 7109782, 1017907, -5318244, 5163625, 5442261, 3740380, -309238, -7019051, -14445049, 4655208, -12807592, 15695421, -11336566, 4173098, -12021077, -2139431, -13419088, --7209640, -8393440, -9156870, 6087043, -8073465, -1606318, 2616172, -178241, -4384088, -3112778, --1553168, -13117367, 257698, 780610, 6298570, -20432770, 307627, -599148, 9323300, 11348377, --7929047, -4829691, 253940, 8705899, -17016124, 10723996, -7752416, -5071283, 639950, -16445967, --1033477, -1387274, -2752000, -2990371, -2237678, 16369731, 6507949, 3317325, -4131222, -3748970, --4315369, 458488, 3831648, -6635725, -383326, -1199370, -1977296, 826781, 4645544, -1859721, --3323231, 3023657, 1671279, -112743, 3193845, 1799591, 2639258, -1781338, -2430415, 4093104, --3209951, 1025960, -4141959, -784905, -53150, -828392, -1716913, -3489124, -4039417, -4063576, -739808, -244813, -1120450, -2932389, -2995740, -1144072, -1698123, 893353, 3857418, 2967286, --9756018, -25290914, -10154913, -4878009, 4305168, 6730751, -8361228, -3208878, -10496363, -9257802, -4746476, -8142721, 8211978, 3306588, 5869073, -1073742, -8286603, 14220100, 5574868, 7928510, --10334765, 4254165, 1752884, -14981383, 9093520, 5432597, 426276, -10228465, -4028679, 4915053, -5181878, -333934, 1701344, 7132867, -7209640, -5323612, 8375723, -17062294, -16874390, -22086870, --5083094, 6968585, -19452444, -16210280, -9926206, 217970, 6789270, 2109903, 1799591, 228707, --5747203, -7807714, -18391586, 9513889, 2547989, 21988622, -5454609, 474057, -13852880, -16465831, -1903744, 10459856, 550293, -10428717, 6633040, 2654827, 14882062, 1372779, 1710471, -7397545, --1571421, 6280853, -14966887, -27712202, -7888245, -6999186, 1296006, 7153268, -13416404, -6795175, -4117263, -4720169, -1270774, 4220342, -2755759, -2315524, 5480915, 1306744, -716186, 2710661, -4207994, 4842039, 733366, -3390877, -8990440, -885300, -5571110, 1374926, 755377, 1047972, -3419331, -3216394, 3085934, 4457639, 2801929, 2498060, 2310156, -6565395, -6189048, -2311229, --5366025, 521839, 1228361, 1680406, 5859946, -1473711, 3635153, 2345052, -2811593, -1360968, --3985193, -5073430, -1625645, -6672232, -2418067, -1515050, -23607824, -18145700, -8351027, 12451110, --1092532, 21324512, 4210679, -1857573, -11978664, 4250944, 21978958, -23024246, -20717848, -6860137, --3445101, -14448807, 13673565, 3985193, 7410429, 8827768, -14452028, -1746978, 5805722, -9137006, -17059074, 217970, 3844533, -4999879, 4219806, -11307575, -6416681, -3915400, 6427419, 3000035, -10383083, -17040282, 1540283, -182536, -12641699, 13769128, -8243116, -20274930, 4020626, 7223598, -1497333, -6103686, -1439888, -8487929, 1420560, 6817187, 2962454, -13893682, 5448166, -3227131, --15312632, -9154186, -18818936, 335007, -2894808, -589484, 2491081, 11478837, 14426795, 11866995, --6069863, -10531797, 3502009, -2757369, -1702955, -8171176, 15021111, 12255689, -2594697, 22865332, --14593225, 7544647, 14559402, 15479599, 493384, 9793599, -6345278, -2660732, -12785044, -5575942, -7775502, -2754685, -9934259, 6110665, -5651640, 6424198, -2837363, -6984691, 3670050, -1504312, --3811784, -3133179, 2728915, -3481608, 2398739, 4475356, -4751308, 6122476, -649077, -3578245, -2467996, 591095, 537945, -3008088, 3809099, -5754183, 2049773, 1928440, 385473, -3904662, --234613, -2392834, 3003793, 5013301, 11426760, 5523865, 9168681, -644245, 102542, 4431870, --5545877, 1352378, -7587597, -3360275, 8602819, -20468204, 2574296, 220654, -12945568, 1864016, --28779502, -24899000, -5970005, -240518, 1058710, -649077, -10239739, -382252, -2937221, 9176198, -1783485, -605054, 1715303, -21757230, 7501698, 4028143, 12051678, 4978404, 5214627, 14142254, -7047505, 2022930, 35442072, 7554311, 13630079, 18781892, 870268, 13236552, 3315178, -7400229, -8605504, 577136, 4138738, -7250442, 529892, -4717485, 2998424, -4704063, 9964324, 1163399, --6212670, -7793218, 1059783, -21077016, 12220793, 8208756, -1079647, -1948305, 4799089, -5636608, --4647155, -6948184, -8339216, 6906845, -6653978, 11442867, 13366475, 13054553, 13932874, -3287798, --21129628, 284005, 8909910, 21248814, -4948876, -841814, 10086731, 14820858, 21915608, -2902861, -9651328, -6549825, -3766686, -17678086, -13743358, -6070400, -6241125, -5099200, 3670587, 693100, --7561290, 8483634, 5391795, 6648610, 12048457, 4747550, 4511327, -1518271, 6979, -1866163, --3458523, 17717, 2167348, -77309, 6353867, 4992363, 3101503, -457414, -5226439, 205085, --3757023, -4254165, 2644626, 3120831, 956704, -6612102, -1475858, -9569724, -2315524, 2967286, -4669167, -3154654, 3877819, -5535676, -6302865, -3316789, -3809099, 3354370, 1797444, -5680094, --3825742, 17408040, 22578644, -16698833, -17476758, -23106924, 20958366, -2110977, -8340827, 7339026, -7110319, 19632296, 16386374, 1173600, 17959406, 25475598, 7348689, -12779138, 12293807, -11814918, --6535867, -2331094, -8200167, -9891847, 5374615, -4915053, -4810364, -11962021, 27759984, 3612068, --14500883, 162672, -1804423, 12523588, 13251585, 5326297, -8400956, 13350906, -3379603, 8310762, --25031606, 1504849, 10693395, -10643466, 3833795, -11580306, -9382356, 26239566, 11033771, 8046621, --1606318, -22891638, -5392332, 6873022, 5191542, 3928285, -5254356, 18560164, -12691628, 10400800, --5845988, 6947110, 7661685, 14747844, 19885162, -22638236, -373662, 11939472, 5927592, 16702054, -16224776, -22571126, 287763, -6101538, -11577084, -539018, -12117176, 5281199, 9679246, -4399121, -17352742, -3653407, -10008884, -12219719, 10887742, 12443057, 12406550, -3147137, 2347200, -505732, --17455284, -16906066, -15823733, 10136660, 5220533, 3372623, 8206609, -335007, -4249334, 12269648, -1877975, 117038, 7613367, 11893301, 7297150, 1078574, 1498944, -3271691, 7326141, 3740380, -15179488, -1214402, 2025077, 10711112, 8744017, 3124589, -1278290, 6919193, -3758, -1201517, -12032351, -9279277, 717260, 7493108, 789737, -1994476, -3350611, -1609539, 187368, 8083666, -1697049, 770947, 8898635, 6541772, -5385889, 17271674, 34621196, 1280437, -16852378, 4491999, --11338714, 6994891, -9881109, -10639171, 31417686, -24217174, 39500816, 24108188, -6055904, 7795903, -18992882, 2576444, -30118458, 11553462, -24422794, 5568962, 1984812, -12176769, 343061, -1834488, -17151416, -8866960, -1030255, -870805, -5427765, 36383740, -2255395, -5704791, 4565550, 12115566, --12614856, -26539140, 20637318, -3535295, -1726040, 23473070, -14061723, -4067871, -16712791, 4220342, --11715060, 13159780, 12217034, 24988120, -7341173, 6825240, 16729434, -24120536, 2823404, -15451682, --24152748, -30967788, -16271484, -33467458, -37478420, -5460514, 2330557, -17825188, -19016504, 11491185, --1408212, -10855530, -20485920, 14487998, -10975252, 3592740, 18447958, -35144108, -10135586, -6659884, -15433428, 41492604, -19805704, 964220, -12586939, -18776524, 8938901, -22422950, 17820894, 30852898, --8907762, -14796699, -15436112, -4153770, -3707631, 31139, 10078141, 7153805, -8207146, 7967165, --1039382, 6205691, 373662, -7829726, -2144263, 8833674, -15115601, 6818261, -7908646, 1794760, --6430103, -2777770, -9076877, 1774895, -8716636, -13908178, -6501507, 2911988, -10047002, -335007, -3107946, 14602352, -8551280, -5355824, 4982162, 5821292, -10687489, -7051800, 3161096, -3263102, --5638219, 10072772, 1942936, -8488466, 7402376, 1711545, -12443057, 2116345, -10230075, 11168526, --5106179, -16229071, -23997056, -18205292, 20045686, -16488379, 8060043, 19100794, 8115341, 12255689, --22893786, 32797444, 20583094, 17875654, -13278965, 23500988, -2655901, 15534360, 10145250, 3435974, -8400419, 11400454, 6870874, -3855807, -5943161, -5255966, 2277407, -15830713, -18749142, 10481331, -4533338, 6080600, -15446850, 4171487, 4561792, 11482058, 17013440, 25756918, -14670535, 3894462, -36531380, 7901666, 3804804, 3541201, -7686381, 2689723, 36361728, 10588705, 23499914, 6740415, --25441776, -10535018, -18571976, 52997748, 21376052, -20480552, -12992276, -18265422, 2921652, -11984569, --28969018, 6617471, -21987012, 32454384, -2462627, -26859114, 35174708, 28676960, 3896609, -7791608, -4636417, -16345572, 21575768, 38924752, -10626286, 18463528, 43301324, -6846715, -7307350, -4952634, -26264798, -1920924, -14866492, -13732084, -14215268, -229781, -1976222, -12167642, 708670, -5098663, -13084081, 3335042, -13120588, -8084739, -14914274, -1580548, 1694365, -2371359, -10554882, -11412265, --8446053, 7168301, 11713450, 1893544, -12896713, -1815697, 15597174, 133681, 14251238, 7698192, --8584566, -725313, -13125420, 12506408, 5173288, -16387985, -31295816, 2844342, -2441152, -9350144, -9678709, -74088, -5866926, -4391067, 2665564, 842350, -1742146, -25120190, 9963787, -3449396, -24899000, -52100100, -35747012, 20605106, 9856950, 7452842, 17495550, -17781164, -23175106, -12764643, --19088446, 10777147, -20480552, 5966247, 13591424, 22327388, 737661, 18710488, 10897406, 3070365, --5974837, -19588272, -13820668, 11402601, -23949274, 12181601, 2814277, 20388746, 15560130, -7638063, --29806536, -19386408, -1803886, -1498944, -7883413, 20390894, -36029944, -2803540, 1257889, -37740416, --730144, -4657892, -3010772, 4027069, 22091164, -21537114, -59304372, 22126598, 24169928, 14394046, -46261628, -38096360, -4885526, 25685516, 19663434, -23917062, -11101954, -6608881, 36442796, 7157026, -34786552, -50331112, 7348152, -60038276, -35940824, -34813396, 41266044, 13054016, -26603564, 24202678, -2842195, -23365158, 23756538, -34943852, -36643588, 5457293, -38056096, 11274826, -65016140, 9907416, -20539070, -27724550, 30476014, -13836774, -7323993, 20340966, -7008313, -5623723, -14485851, -1089311, -4820564, 11204496, -1313186, 10409927, 20540144, -15468325, -1657857, -12307766, 7335268, -8053601, --2095407, 4436701, 2563559, 2707977, -2661806, 21087752, -6965363, 1665374, 9089761, -18697604, --16359530, -18158048, -8380555, -30549566, -13948980, -11202885, 26337276, 5151277, 23450522, 10020696, -4792110, 10575283, 7481296, 901943, 8927090, 1828582, 18282602, 44980120, 16646219, -16108275, --10515154, 6208912, -11420318, -13401372, -1590212, 20929376, -3628711, 3911642, -22243636, -4602058, -30741766, -22428856, 17009682, 40137544, 20080582, -1706713, -7650411, -13201656, -25658672, -18879066, -22130356, -12606266, 20767778, 14955076, 7136625, 974421, 8117488, -6406481, -32631014, -11331734, -23374822, 18503792, 19432042, -20663088, 35665408, -9185861, 13882945, -26358752, 24157580, 41525356, --8331163, -14808510, -1504312, 1509144, -9205726, 9059697, 18199388, -34099356, 22405234, 21680458, --5277978, 25134686, 13372918, 10831371, -15917686, 3268470, 22546430, -47553340, -42282880, -17661980, -11257646, -21911850, -64287608, 26923540, 17700098, -8383240, -10868952, 449361, -3725884, -22079890, --59044528, -3620121, 42016056, 10139881, -7412577, -5069672, 9118752, 34315180, 27427124, -40395780, --16588774, 26859652, -5641977, -10878615, -46061376, -2754148, 25361782, 8339753, -7041599, 15528991, --5738077, 1577864, -17310866, -2925947, 10633265, 15792595, -8952859, -3342558, 3330747, 9096741, --5617281, 5567888, 821413, -11356967, 6841883, 19211388, 3389803, 5674726, 3676492, 8623757, --9016210, -16028818, 1625108, 17147656, -14049912, 6099391, -4698694, 1453846, -13625784, -26483306, --14281840, 9738301, 32196148, -3372623, 15247134, -21363704, -9276056, -14473503, 8964670, 6155225, -10207527, -7346005, -10937671, -865973, 2374580, -1056562, 21913996, 29035052, 683974, -32659468, -43335148, -12127914, -30188788, 27120034, -4312147, -16409459, 20970714, 5637682, -4343823, 17692580, --24173150, 22996866, -8167417, 804770, -7002408, -5981279, -33714420, 13398150, -12846247, 5349919, --13493177, -1084479, -10049687, 9696426, -5872294, 36509368, 6484327, 23895050, -9247065, 5997922, -15123117, -6376416, 10463614, -2038499, 18258442, -887448, -6086506, 28834800, -25703768, 14389214, -19723564, -11528766, 22318798, -13615583, -520228, 11489574, -8684424, 26217554, 23488102, 4900558, -39064340, -24031416, -55079196, -9253507, -34044060, -22524420, 80519360, -2028835, 24725052, -3736622, --33938296, -854699, 33845416, 47907140, 29145648, 48257180, -25920664, -7744363, -11599633, -27524834, -18291192, -7715909, -16973710, -1758789, -33401424, -61081416, 15404437, 21524766, -18058726, 12191802, --3780645, -18212272, 19477140, 14341433, -7100118, 20055886, -7344931, -17882634, 9213779, -8873939, -23786066, 2247342, 1794223, 13437342, 4495757, -15131170, -6334003, 7803419, -4971962, 14804752, --20622822, 13326747, -21625160, -5501853, 5406290, -15348066, 9810779, 627065, -23043574, -3725884, -1493575, -6180995, -53150, -4298726, -16909824, 6935299, 5073967, -2681670, 16981764, 26045218, --14192183, -20293184, -1303523, -9671729, 28159416, 28940026, -17054778, -10782515, 24560234, -25841208, -31070868, -18720152, 4296041, -38118, 3242700, -23838142, -3670587, -21558588, -17835926, 87510, --7019051, -16256988, -6475200, 11965779, -13882408, 11029476, -6547678, 33411624, -15441481, 10000294, -2047089, -8271034, -26783952, -9804337, 20442434, 3719442, -6659347, 26798448, -19782620, -19965692, --2704219, 25591562, -23225036, -3220689, 4582730, 6966974, -25869124, 7823820, 9013526, -9226127, --27052926, 517544, -21003464, 8938901, 4800700, 8096014, -41362684, -17656610, 23620710, 63696512, --28806882, -3949223, 5145908, -10713259, -17961554, -320512, 53201760, 12291123, -5404680, -4638028, --14042932, -3230352, -10750303, 20668994, 1098438, -13131863, -14128832, 781147, 9556839, -21166136, -16577500, 4951024, 18071074, 765578, 22979686, 9694815, -15984258, 21609054, 20599200, 50972672, -16237124, 4003983, 5281199, -18542984, 6252936, 16714939, 17256104, 6007049, -1155883, 723165, --2025614, 6489696, 7221988, -1617055, 9317395, -2314987, -894964, 17666274, 7531762, 3102577, --5203890, 5290326, 13378286, 14099304, 16167868, 5932961, 5977521, -8937827, -1074, -433792, -3018825, 9197136, -304406, -7115687, 8336532, -7459822, 6950331, -232465, 8189966, 1319092, --6585259, -1743757, 623844, 1967095, 4119411, -856846, 2975876, 2301566, -20401, -40421012, -53762252, 7452305, 12267500, 12923557, -12372190, -14274324, 552440, -5484137, 7679402, 17725330, --24817932, 8253854, -5202816, 6487011, 6089190, 4234301, 14206141, 11108396, -10557566, 9988483, -8705362, -8578123, -14800457, 4558034, -5224291, -12291123, 7417409, 6074158, -997506, -8030515, -272730, -5849746, -2806761, 585726, 3246459, 5670968, -11054709, -1635309, 8937827, -3955128, -8027294, 1539209, 5805722, 11681774, 3502546, -11908334, 1298691, 11145440, -6270116, -576063, -5450314, -18940268, -1097364, -4680441, -17606144, 24427090, -6156836, -1018444, 14551886, 2486786, --10842108, 4301947, -10358924, -2104534, 8123931, -9767293, -3470334, 18054432, -19114216, 2046015, -1788854, 6558952, -8456791, 5804649, -2858838, 5408975, -7243463, 333934, -1698660, 18183818, --8230768, -827855, 4816269, -9199283, -810675, 12584254, -2582886, 8108362, -5464809, -5229123, -1019518, 4869419, -4716948, 9277666, 19327, -2048699, -1934883, -2949569, -2835215, 7909719, --6660958, 7741679, 4337917, -10218801, 2552284, -1052804, -770410, 5992553, -8392366, -3432753, -1348083, -5681705, 6002754, -5844377, -743029, 9589588, 1843078, -1820529, 4497368, -4849555, --3719979, -2364380, 4795331, 7993471, -2345052, -2331094, 1008244, 12678207, -53141092, -108196128, --13875966, 68014032, 52310556, 150069376, 72237056, -34910032, -30489972, -71061848, -124499288, -15686831, --48227116, -14926085, 88015152, 56127708, 59914792, 114534432, -3943854, -25276956, -43110736, -113146616, --62423056, -20043002, -20966956, 3214246, 51605104, 39977020, 42436960, 79962088, 46821584, -29311004, -42665668, -44688596, -104346232, 13426605, -70007432, -97436168, 38101728, -8307004, -17994302, 119955752, -39348344, 31936840, 103408856, -11025718, -20253456, 31518618, -69177424, -85980416, -23068806, -73613056, --65775812, 14023068, 14348412, 29837138, 90232968, 79915384, 48446696, 57337812, 11153493, -45105208, --48569636, -60146724, -82680264, -38579544, -20929376, -28058484, 25088514, 79808544, 52138220, 51483236, -42349988, -29742648, -248034, 8473970, -68223408, -28097140, -17042430, -19937238, 31403190, 16087874, --3851512, 25670482, -5867999, -5274757, 4455492, -18371186, -13819594, 9151502, -11340861, 18617610, -23424214, -8651675, 12737262, 23848342, -13800804, 15639050, 7873749, -46439872, 8305393, -15043660, --50401440, 828392, -28751048, -25751550, 36792836, 39786428, 38449620, 71159552, 22749904, 22677964, -24196236, -31077310, -62017180, -69293392, -88681408, -66090956, -19865834, 11611444, 53906136, 89234928, -98915248, 77219216, 56332256, 11134703, -52264384, -78809432, -96182032, -89429272, -46296528, -2950106, -25303262, 64063732, 59192164, 32273994, 32499480, 12581033, -866510, -256087, -9987946, -19697256, --16267189, -20473036, -24694988, -18291728, -13554380, -3812320, 6594923, 16110422, 19504520, 20598664, -16960288, 9419400, 2436857, -2137820, -2969970, -1813550, -957778, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +4645544, 1169842, -2513093, -1113470, -5609228, -1494112, 4714264, -2479270, -1804423, 1459215, +-723702, -166967, 308164, -1490891, -1195075, 5713917, 2785823, -683974, 290984, -838056, +-1690607, 796180, 2050847, 3149285, -788663, 1211181, 1461900, -5037997, -1535451, 1074, +-989453, 3107946, 294742, -1051730, 2800319, -2114735, 955093, 4337380, -2386928, 285615, +592169, 3295314, -1253057, 4540854, -6410776, -2333778, 2807298, -1263794, -5432060, 399432, +1105417, 1821603, 1874216, -580357, -2334315, 209917, -2117419, -1439351, 644245, 2703145, +2491081, -3621194, 3202435, -3963718, 3555696, 209380, 3118146, -1204738, -2568927, -1134408, +2098092, -397821, -522912, -623844, 2902861, -3117073, 1610613, 768262, 783832, 995359, +2321967, 745177, -1489817, -1682017, -930397, 1265405, -272730, -1234266, 238371, -1490891, +-330176, -102005, -1525787, -607738, -860067, 202937, 821413, -1028108, -740882, 427886, +-211527, -1471563, -15569, 804233, -573915, -73014, 300111, -135828, 576599, 420907, +41876, -1111860, -373662, 41876, -505732, 30602, -124554, -779000, 436476, -1320703, +-15288473, 5019743, -5557151, -2214056, -4549981, -4671851, 2656437, -1557999, -3944928, -2119566, +5366562, 7975755, -4361540, -1623498, -387084, -5743982, -5397164, 404801, -545461, 3509525, +1182727, 2614025, -2302103, -1441498, -2982855, 840740, 5148055, 2234994, 1001264, -3318936, +2517388, 761283, 1540820, -2166274, 192200, 760746, 1156957, -2943663, -2152852, 805843, +-4063576, -4154307, 1782948, 3151432, -3542274, -1782411, -1365263, 255014, 3141769, 2532957, +1096290, 477815, 8125005, 3190624, -2565706, 3163780, 2253784, -2257542, 3838627, -1430224, +-962610, -21475, -1673427, 3411278, -1920387, 896038, 2056216, 1647657, -3036005, 1196148, +566936, 614717, -1061931, -1505386, -632434, 4765266, 317291, -1412507, -1021665, 1124745, +-4287988, 830539, 2553358, -165893, 1653026, -944356, -1545115, 1036161, 944356, -399969, +1606855, 827855, -458488, 1140314, 1194001, 1996623, 259846, 6979, -141197, -600759, +-849330, -85899, -152471, -531502, 587874, -188979, 1990181, 11633456, 4636417, -812286, +525060, 2665027, 1391569, -788663, -5030481, 161061, 4458713, -4577899, -513785, -8590471, +2252174, 3496640, 230854, -2047626, 6276558, 4413079, -4049081, 1954210, 235149, -3549791, +5600638, 3087545, -367757, 2261300, 5336497, -1656784, -1105954, 355409, 28991, 126165, +1279363, 6554657, 1317481, 977105, -10602664, -562104, 479963, 1264868, -4799626, 1108638, +-3871913, -2971581, -4095251, -2675765, 21475, 1229434, -2503429, 2498060, -6092948, -3499862, +-374736, -82678, 1950452, -2442226, -571231, -2211908, 1319629, 3296388, -1997697, 352187, +-1729798, -316217, 5110474, 4003447, -1618129, 3751654, -1801739, -3202435, -4001299, -302258, +-374199, -2698850, 2434173, -430570, 692564, -301185, -891206, 180926, -577136, -2188286, +-141197, -3485903, 391379, -1717987, -1123134, -2928631, 3393024, -1043140, 1155346, 2317672, +917512, -1183264, -275952, -1328219, -98784, 583042, -1306744, 1346472, -111669, 146029, +192737, -481036, 790811, 458488, 248034, 99321, 1918240, 921271, -619549, -1308891, +-1193464, 1159104, 1560684, -5906, 397284, 18367428, -7986492, 1513976, -667331, -3384434, +2921652, 5151277, -3338263, 5537824, -299574, 5906654, 1641214, 2087354, -2539400, 3349538, +1298691, 3430068, -7220377, 3874061, -4267050, 1340567, -3583077, 4536559, -1232119, 4569845, +-2678449, 1684164, -1753420, -392990, -195958, -457414, 1801202, 9492951, 426276, 2789581, +-2619930, -4395899, 192737, 88584, 193274, 1447941, -3041374, 6228240, -387621, 5221607, +371515, -2253247, -2845953, -7824894, 3854733, 2553895, -3651796, 411780, 3146601, 1670742, +-9108552, 5449240, -297427, 3875134, -5466420, -5893232, -2851322, -5740224, -1043140, 6642704, +1392643, -2540473, 408559, 3759170, -1250909, -3010772, -1553168, -3376918, 2433636, -5121749, +-889058, -3928821, -1488206, -14496, 4423817, 2076617, 499827, 1380295, 5551245, 2913062, +695248, 2028298, -1545651, -612033, 389768, 106300, 905164, 467078, -933082, 546535, +1974611, -130997, 444529, 733366, -920197, -1272921, 1249299, -1523640, 1841467, 1079647, +1708860, 45634, -617938, 1039919, 1693291, 441845, -665183, 550830, 4801237, -11261404, +2295123, -3550864, -10289668, -7931194, 4216048, 4702453, 6188511, -3063386, -1592359, 4260608, +2035815, 6367289, 2073396, -710280, 651224, 4064113, 7918309, -2027225, 2308008, -96637, +6416145, 1476395, -392453, -1286343, -4896263, -7444252, 80531, -1069984, 2237678, -420907, +1752884, 1305133, 454193, 478352, 1482301, -2541010, 285078, 3541201, 5538361, -2709051, +658204, -2387465, -3182034, 4576825, -3511673, -8744017, -3438658, -2238752, 4202089, 352187, +4636417, 4240207, -2246268, 188442, -3628711, -503585, -1557999, 5430986, -6838125, -196495, +2304787, -7240241, -8150774, 127238, 2518998, 5163625, -3598646, -8621073, 4501663, -7954280, +9303436, 5259188, 1531693, 3968013, -93416, -3828427, 11826192, -1073742, 5724118, -216359, +8272644, 5689758, 3024731, -840203, -1612223, -2772402, -1021665, 1253594, 300648, 2289218, +-2338073, 1428077, -1241782, -843424, -877784, -952409, 1123671, -591095, -19327, -1748052, +-79457, 1087164, 1996086, -1999844, -2450279, 351650, 1086090, -10201, 1305670, -725850, +154619, -953483, -308701, 683437, 1234266, 1519345, 906775, -1183800, -24921548, 5126044, +1252520, -12519830, -15799037, -2546916, -12199318, 9904195, 2830384, -7357279, 451508, -3427921, +1094143, -5025649, 634581, -294205, 49929, 6979859, -2505577, -1636383, -2922725, -2578054, +-6598681, -4424890, 6602976, -2736968, 4172024, -3688303, 1800128, 104690, 3768297, -3850975, +2851858, -3868155, 1675574, -1483911, -2420214, 2386391, -6170258, 2362232, -3146064, -1132261, +-4487704, 10817412, 5142150, 9484362, -4054449, 3998078, 3211562, -1887101, 1679869, -4496294, +4759361, 10401874, 8217346, -5731097, -1542967, 2436320, -4155918, -2787434, -7270306, -13591961, +-4617627, 6969658, 2500208, -3353833, 1372779, 715649, -3709778, -6455336, -6522445, 4634807, +534723, -9989020, 1058173, 966905, -493384, -744640, 3311420, 7247221, -740882, -4832, +1012002, -3758, -1906429, -6601902, 2185602, 2230162, 1358283, 3090229, 1868311, -2822331, +728534, -1775432, 368830, -1500554, -606664, -1660542, 42950, 379031, -199716, -1200443, +-1170916, -349503, 515396, -33823, 2428804, 873489, 2267206, 2458332, 2656974, -3177202, +-3230352, -1205812, 2440615, -823560, 896574, -945967, 1348620, 1418950, 913754, -1545115, +-874026, -9754408, -4061429, -2529736, 7379291, -1940252, 1758789, -7597261, -7928510, 406411, +2311229, -4633196, -2652142, -4345970, 9042517, 2008434, -3016141, -6573448, -6491843, -6340446, +-1756642, 3076270, 9083319, 2965138, 5138929, -4049081, 9672803, 5541045, 1792075, 134755, +9948218, -5777805, 961536, 3173981, 6740415, -10850698, -5519033, 4777078, 1932198, -1470489, +11361799, -4924717, 3231426, 6874632, 2150705, 1185948, 5022428, 2068564, 2513093, 2584497, +1111860, 2973191, -139050, 4362613, -973884, 10638634, -7676181, 8763344, 6959995, -5994701, +6892886, 1312649, 5863167, 5947456, -12927315, -297427, -490700, -3855270, 2100776, -3472481, +3620121, -1423782, 8289287, -852014, 1324997, 3436511, 2348273, 3328600, -5243082, -1717450, +-5359046, -4936528, -2837363, 8073465, 1221918, -2500745, 2392297, 2266669, 1043677, -1296006, +857383, -899259, 3182034, 1257889, 1023813, -1469416, 993748, -2950106, -258772, 3564286, +1843078, -505196, 1182190, 1305133, -963146, 1541356, 1009854, 3462281, 1887101, -1824287, +-735513, -1054951, 1051730, -2953327, 895501, 13029320, -3384434, -1966558, -3135863, 9292699, +4901632, 1034550, 3574487, -6207302, 13874355, 4626217, -1044214, 5265093, 6726456, -11243688, +-709743, 2717104, 1368484, 28991, 9601399, -4549444, -5753109, 13191455, 2035278, -889595, +-1258962, 6913824, 574989, -955093, -1241246, -3149285, 3475166, -1937030, 4619238, 3257196, +-8234526, -7808251, 1034013, 15560667, -134755, 3208878, -9523553, 4766877, 6424198, -3921842, +4776004, 5903433, -9656160, -5887327, -1168768, -12396349, -6548752, -7384123, 2233920, -2507187, +-2706903, -1328756, 8796093, -11954505, 5348845, 2641405, -3839164, 7355669, -4634807, 737661, +-10020696, -177167, 6140730, 5504538, 11514270, -13514651, -3316252, -15008763, -3177739, -275952, +-3528853, 1714766, -686121, 13708999, 10671920, 6038187, -6761353, 372588, 2673080, 6691022, +8258149, -168041, 84826, -1150514, 222801, 4684199, -178241, -388695, -140123, 97174, +283468, 579284, 1943473, -1916629, -557809, 1960653, 374736, 1811403, -14496, 206158, +-1524177, 2480344, 1576790, 34360, 2376728, -1179505, -99321, 2172180, 632434, -374736, +-2646237, -185757, 658204, 386010, -911607, 2777233, 4720169, -861678, -78383, -2116345, +1595580, 8907225, -9888625, 377957, -6040335, 17067664, -7141457, -4081293, 14803679, 11172284, +2113661, -20521890, -4962298, 9516037, 821949, -937377, -2874407, -1569811, -1548336, 1488206, +3243237, 2957085, 2821794, 18278844, -3745748, -2595234, 73551, 2429341, -5374078, 3252364, +1995549, -632434, -5919539, -3711926, 6645388, 7096360, 13408351, 3458523, -5428839, 3418257, +-107374, 3463354, 314069, 7449621, -6103686, -9160628, -9421011, 6255620, -2637647, 1341104, +2538863, -3349001, -561030, 15881715, 5478231, -13320841, 9572945, 3077344, 16108275, -8301098, +-7793755, 4681515, 8704288, 6006512, 3395709, -1435056, 573378, 4167729, -5156645, -1460289, +241592, 6851010, -4867809, 13722957, -424128, -147640, -7004555, -7936026, 15715822, 4691178, +-12769475, -2965138, 10854993, 7518341, 1562294, 2747705, -6465000, 2085207, 1813550, 2142115, +1268626, 2373506, -2931852, -3614752, 563714, -74088, -2936147, -962073, 2880849, 2789045, +-3949759, 1102733, 79457, 1794760, 2499134, -634581, -619549, -956167, 1717987, 4848481, +-3391951, 2687576, -132070, 153008, -1947231, -440771, -1423782, -993748, 2403571, -762894, +-1241246, -3090766, -6979, -1735704, -12320114, -10470057, -4148402, 3668976, 3762928, 18720152, +18159658, -2238752, 1349157, 700080, 9664, -315143, -3912178, -12379169, -9547175, -4967130, +4209605, -3526705, -10814728, -3127810, 1889249, -893890, -16509317, -4911832, 3481608, -1773822, +1404991, 1032403, 4772783, 7109782, 1017907, -5318244, 5163625, 5442261, 3740380, -309238, +7019051, -14445049, 4655208, -12807592, 15695421, -11336566, 4173098, -12021077, -2139431, -13419088, +-7209640, -8393440, -9156870, 6087043, -8073465, -1606318, 2616172, -178241, -4384088, -3112778, +-1553168, -13117367, 257698, 780610, 6298570, -20432770, 307627, -599148, 9323300, 11348377, +-7929047, -4829691, 253940, 8705899, -17016124, 10723996, -7752416, -5071283, 639950, -16445967, +-1033477, -1387274, -2752000, -2990371, -2237678, 16369731, 6507949, 3317325, -4131222, -3748970, +-4315369, 458488, 3831648, -6635725, -383326, -1199370, -1977296, 826781, 4645544, -1859721, +-3323231, 3023657, 1671279, -112743, 3193845, 1799591, 2639258, -1781338, -2430415, 4093104, +-3209951, 1025960, -4141959, -784905, -53150, -828392, -1716913, -3489124, -4039417, -4063576, +739808, -244813, -1120450, -2932389, -2995740, -1144072, -1698123, 893353, 3857418, 2967286, +-9756018, -25290914, -10154913, -4878009, 4305168, 6730751, -8361228, -3208878, -10496363, -9257802, +4746476, -8142721, 8211978, 3306588, 5869073, -1073742, -8286603, 14220100, 5574868, 7928510, +-10334765, 4254165, 1752884, -14981383, 9093520, 5432597, 426276, -10228465, -4028679, 4915053, +5181878, -333934, 1701344, 7132867, -7209640, -5323612, 8375723, -17062294, -16874390, -22086870, +-5083094, 6968585, -19452444, -16210280, -9926206, 217970, 6789270, 2109903, 1799591, 228707, +-5747203, -7807714, -18391586, 9513889, 2547989, 21988622, -5454609, 474057, -13852880, -16465831, +1903744, 10459856, 550293, -10428717, 6633040, 2654827, 14882062, 1372779, 1710471, -7397545, +-1571421, 6280853, -14966887, -27712202, -7888245, -6999186, 1296006, 7153268, -13416404, -6795175, +4117263, -4720169, -1270774, 4220342, -2755759, -2315524, 5480915, 1306744, -716186, 2710661, +4207994, 4842039, 733366, -3390877, -8990440, -885300, -5571110, 1374926, 755377, 1047972, +3419331, -3216394, 3085934, 4457639, 2801929, 2498060, 2310156, -6565395, -6189048, -2311229, +-5366025, 521839, 1228361, 1680406, 5859946, -1473711, 3635153, 2345052, -2811593, -1360968, +-3985193, -5073430, -1625645, -6672232, -2418067, -1515050, -23607824, -18145700, -8351027, 12451110, +-1092532, 21324512, 4210679, -1857573, -11978664, 4250944, 21978958, -23024246, -20717848, -6860137, +-3445101, -14448807, 13673565, 3985193, 7410429, 8827768, -14452028, -1746978, 5805722, -9137006, +17059074, 217970, 3844533, -4999879, 4219806, -11307575, -6416681, -3915400, 6427419, 3000035, +10383083, -17040282, 1540283, -182536, -12641699, 13769128, -8243116, -20274930, 4020626, 7223598, +1497333, -6103686, -1439888, -8487929, 1420560, 6817187, 2962454, -13893682, 5448166, -3227131, +-15312632, -9154186, -18818936, 335007, -2894808, -589484, 2491081, 11478837, 14426795, 11866995, +-6069863, -10531797, 3502009, -2757369, -1702955, -8171176, 15021111, 12255689, -2594697, 22865332, +-14593225, 7544647, 14559402, 15479599, 493384, 9793599, -6345278, -2660732, -12785044, -5575942, +7775502, -2754685, -9934259, 6110665, -5651640, 6424198, -2837363, -6984691, 3670050, -1504312, +-3811784, -3133179, 2728915, -3481608, 2398739, 4475356, -4751308, 6122476, -649077, -3578245, +2467996, 591095, 537945, -3008088, 3809099, -5754183, 2049773, 1928440, 385473, -3904662, +-234613, -2392834, 3003793, 5013301, 11426760, 5523865, 9168681, -644245, 102542, 4431870, +-5545877, 1352378, -7587597, -3360275, 8602819, -20468204, 2574296, 220654, -12945568, 1864016, +-28779502, -24899000, -5970005, -240518, 1058710, -649077, -10239739, -382252, -2937221, 9176198, +1783485, -605054, 1715303, -21757230, 7501698, 4028143, 12051678, 4978404, 5214627, 14142254, +7047505, 2022930, 35442072, 7554311, 13630079, 18781892, 870268, 13236552, 3315178, -7400229, +8605504, 577136, 4138738, -7250442, 529892, -4717485, 2998424, -4704063, 9964324, 1163399, +-6212670, -7793218, 1059783, -21077016, 12220793, 8208756, -1079647, -1948305, 4799089, -5636608, +-4647155, -6948184, -8339216, 6906845, -6653978, 11442867, 13366475, 13054553, 13932874, -3287798, +-21129628, 284005, 8909910, 21248814, -4948876, -841814, 10086731, 14820858, 21915608, -2902861, +9651328, -6549825, -3766686, -17678086, -13743358, -6070400, -6241125, -5099200, 3670587, 693100, +-7561290, 8483634, 5391795, 6648610, 12048457, 4747550, 4511327, -1518271, 6979, -1866163, +-3458523, 17717, 2167348, -77309, 6353867, 4992363, 3101503, -457414, -5226439, 205085, +-3757023, -4254165, 2644626, 3120831, 956704, -6612102, -1475858, -9569724, -2315524, 2967286, +4669167, -3154654, 3877819, -5535676, -6302865, -3316789, -3809099, 3354370, 1797444, -5680094, +-3825742, 17408040, 22578644, -16698833, -17476758, -23106924, 20958366, -2110977, -8340827, 7339026, +7110319, 19632296, 16386374, 1173600, 17959406, 25475598, 7348689, -12779138, 12293807, -11814918, +-6535867, -2331094, -8200167, -9891847, 5374615, -4915053, -4810364, -11962021, 27759984, 3612068, +-14500883, 162672, -1804423, 12523588, 13251585, 5326297, -8400956, 13350906, -3379603, 8310762, +-25031606, 1504849, 10693395, -10643466, 3833795, -11580306, -9382356, 26239566, 11033771, 8046621, +-1606318, -22891638, -5392332, 6873022, 5191542, 3928285, -5254356, 18560164, -12691628, 10400800, +-5845988, 6947110, 7661685, 14747844, 19885162, -22638236, -373662, 11939472, 5927592, 16702054, +16224776, -22571126, 287763, -6101538, -11577084, -539018, -12117176, 5281199, 9679246, -4399121, +17352742, -3653407, -10008884, -12219719, 10887742, 12443057, 12406550, -3147137, 2347200, -505732, +-17455284, -16906066, -15823733, 10136660, 5220533, 3372623, 8206609, -335007, -4249334, 12269648, +1877975, 117038, 7613367, 11893301, 7297150, 1078574, 1498944, -3271691, 7326141, 3740380, +15179488, -1214402, 2025077, 10711112, 8744017, 3124589, -1278290, 6919193, -3758, -1201517, +12032351, -9279277, 717260, 7493108, 789737, -1994476, -3350611, -1609539, 187368, 8083666, +1697049, 770947, 8898635, 6541772, -5385889, 17271674, 34621196, 1280437, -16852378, 4491999, +-11338714, 6994891, -9881109, -10639171, 31417686, -24217174, 39500816, 24108188, -6055904, 7795903, +18992882, 2576444, -30118458, 11553462, -24422794, 5568962, 1984812, -12176769, 343061, -1834488, +17151416, -8866960, -1030255, -870805, -5427765, 36383740, -2255395, -5704791, 4565550, 12115566, +-12614856, -26539140, 20637318, -3535295, -1726040, 23473070, -14061723, -4067871, -16712791, 4220342, +-11715060, 13159780, 12217034, 24988120, -7341173, 6825240, 16729434, -24120536, 2823404, -15451682, +-24152748, -30967788, -16271484, -33467458, -37478420, -5460514, 2330557, -17825188, -19016504, 11491185, +-1408212, -10855530, -20485920, 14487998, -10975252, 3592740, 18447958, -35144108, -10135586, -6659884, +15433428, 41492604, -19805704, 964220, -12586939, -18776524, 8938901, -22422950, 17820894, 30852898, +-8907762, -14796699, -15436112, -4153770, -3707631, 31139, 10078141, 7153805, -8207146, 7967165, +-1039382, 6205691, 373662, -7829726, -2144263, 8833674, -15115601, 6818261, -7908646, 1794760, +-6430103, -2777770, -9076877, 1774895, -8716636, -13908178, -6501507, 2911988, -10047002, -335007, +3107946, 14602352, -8551280, -5355824, 4982162, 5821292, -10687489, -7051800, 3161096, -3263102, +-5638219, 10072772, 1942936, -8488466, 7402376, 1711545, -12443057, 2116345, -10230075, 11168526, +-5106179, -16229071, -23997056, -18205292, 20045686, -16488379, 8060043, 19100794, 8115341, 12255689, +-22893786, 32797444, 20583094, 17875654, -13278965, 23500988, -2655901, 15534360, 10145250, 3435974, +8400419, 11400454, 6870874, -3855807, -5943161, -5255966, 2277407, -15830713, -18749142, 10481331, +4533338, 6080600, -15446850, 4171487, 4561792, 11482058, 17013440, 25756918, -14670535, 3894462, +36531380, 7901666, 3804804, 3541201, -7686381, 2689723, 36361728, 10588705, 23499914, 6740415, +-25441776, -10535018, -18571976, 52997748, 21376052, -20480552, -12992276, -18265422, 2921652, -11984569, +-28969018, 6617471, -21987012, 32454384, -2462627, -26859114, 35174708, 28676960, 3896609, -7791608, +4636417, -16345572, 21575768, 38924752, -10626286, 18463528, 43301324, -6846715, -7307350, -4952634, +26264798, -1920924, -14866492, -13732084, -14215268, -229781, -1976222, -12167642, 708670, -5098663, +13084081, 3335042, -13120588, -8084739, -14914274, -1580548, 1694365, -2371359, -10554882, -11412265, +-8446053, 7168301, 11713450, 1893544, -12896713, -1815697, 15597174, 133681, 14251238, 7698192, +-8584566, -725313, -13125420, 12506408, 5173288, -16387985, -31295816, 2844342, -2441152, -9350144, +9678709, -74088, -5866926, -4391067, 2665564, 842350, -1742146, -25120190, 9963787, -3449396, +24899000, -52100100, -35747012, 20605106, 9856950, 7452842, 17495550, -17781164, -23175106, -12764643, +-19088446, 10777147, -20480552, 5966247, 13591424, 22327388, 737661, 18710488, 10897406, 3070365, +-5974837, -19588272, -13820668, 11402601, -23949274, 12181601, 2814277, 20388746, 15560130, -7638063, +-29806536, -19386408, -1803886, -1498944, -7883413, 20390894, -36029944, -2803540, 1257889, -37740416, +-730144, -4657892, -3010772, 4027069, 22091164, -21537114, -59304372, 22126598, 24169928, 14394046, +46261628, -38096360, -4885526, 25685516, 19663434, -23917062, -11101954, -6608881, 36442796, 7157026, +34786552, -50331112, 7348152, -60038276, -35940824, -34813396, 41266044, 13054016, -26603564, 24202678, +2842195, -23365158, 23756538, -34943852, -36643588, 5457293, -38056096, 11274826, -65016140, 9907416, +20539070, -27724550, 30476014, -13836774, -7323993, 20340966, -7008313, -5623723, -14485851, -1089311, +4820564, 11204496, -1313186, 10409927, 20540144, -15468325, -1657857, -12307766, 7335268, -8053601, +-2095407, 4436701, 2563559, 2707977, -2661806, 21087752, -6965363, 1665374, 9089761, -18697604, +-16359530, -18158048, -8380555, -30549566, -13948980, -11202885, 26337276, 5151277, 23450522, 10020696, +4792110, 10575283, 7481296, 901943, 8927090, 1828582, 18282602, 44980120, 16646219, -16108275, +-10515154, 6208912, -11420318, -13401372, -1590212, 20929376, -3628711, 3911642, -22243636, -4602058, +30741766, -22428856, 17009682, 40137544, 20080582, -1706713, -7650411, -13201656, -25658672, -18879066, +22130356, -12606266, 20767778, 14955076, 7136625, 974421, 8117488, -6406481, -32631014, -11331734, +23374822, 18503792, 19432042, -20663088, 35665408, -9185861, 13882945, -26358752, 24157580, 41525356, +-8331163, -14808510, -1504312, 1509144, -9205726, 9059697, 18199388, -34099356, 22405234, 21680458, +-5277978, 25134686, 13372918, 10831371, -15917686, 3268470, 22546430, -47553340, -42282880, -17661980, +11257646, -21911850, -64287608, 26923540, 17700098, -8383240, -10868952, 449361, -3725884, -22079890, +-59044528, -3620121, 42016056, 10139881, -7412577, -5069672, 9118752, 34315180, 27427124, -40395780, +-16588774, 26859652, -5641977, -10878615, -46061376, -2754148, 25361782, 8339753, -7041599, 15528991, +-5738077, 1577864, -17310866, -2925947, 10633265, 15792595, -8952859, -3342558, 3330747, 9096741, +-5617281, 5567888, 821413, -11356967, 6841883, 19211388, 3389803, 5674726, 3676492, 8623757, +-9016210, -16028818, 1625108, 17147656, -14049912, 6099391, -4698694, 1453846, -13625784, -26483306, +-14281840, 9738301, 32196148, -3372623, 15247134, -21363704, -9276056, -14473503, 8964670, 6155225, +10207527, -7346005, -10937671, -865973, 2374580, -1056562, 21913996, 29035052, 683974, -32659468, +43335148, -12127914, -30188788, 27120034, -4312147, -16409459, 20970714, 5637682, -4343823, 17692580, +-24173150, 22996866, -8167417, 804770, -7002408, -5981279, -33714420, 13398150, -12846247, 5349919, +-13493177, -1084479, -10049687, 9696426, -5872294, 36509368, 6484327, 23895050, -9247065, 5997922, +15123117, -6376416, 10463614, -2038499, 18258442, -887448, -6086506, 28834800, -25703768, 14389214, +19723564, -11528766, 22318798, -13615583, -520228, 11489574, -8684424, 26217554, 23488102, 4900558, +39064340, -24031416, -55079196, -9253507, -34044060, -22524420, 80519360, -2028835, 24725052, -3736622, +-33938296, -854699, 33845416, 47907140, 29145648, 48257180, -25920664, -7744363, -11599633, -27524834, +18291192, -7715909, -16973710, -1758789, -33401424, -61081416, 15404437, 21524766, -18058726, 12191802, +-3780645, -18212272, 19477140, 14341433, -7100118, 20055886, -7344931, -17882634, 9213779, -8873939, +23786066, 2247342, 1794223, 13437342, 4495757, -15131170, -6334003, 7803419, -4971962, 14804752, +-20622822, 13326747, -21625160, -5501853, 5406290, -15348066, 9810779, 627065, -23043574, -3725884, +1493575, -6180995, -53150, -4298726, -16909824, 6935299, 5073967, -2681670, 16981764, 26045218, +-14192183, -20293184, -1303523, -9671729, 28159416, 28940026, -17054778, -10782515, 24560234, -25841208, +31070868, -18720152, 4296041, -38118, 3242700, -23838142, -3670587, -21558588, -17835926, 87510, +-7019051, -16256988, -6475200, 11965779, -13882408, 11029476, -6547678, 33411624, -15441481, 10000294, +2047089, -8271034, -26783952, -9804337, 20442434, 3719442, -6659347, 26798448, -19782620, -19965692, +-2704219, 25591562, -23225036, -3220689, 4582730, 6966974, -25869124, 7823820, 9013526, -9226127, +-27052926, 517544, -21003464, 8938901, 4800700, 8096014, -41362684, -17656610, 23620710, 63696512, +-28806882, -3949223, 5145908, -10713259, -17961554, -320512, 53201760, 12291123, -5404680, -4638028, +-14042932, -3230352, -10750303, 20668994, 1098438, -13131863, -14128832, 781147, 9556839, -21166136, +16577500, 4951024, 18071074, 765578, 22979686, 9694815, -15984258, 21609054, 20599200, 50972672, +16237124, 4003983, 5281199, -18542984, 6252936, 16714939, 17256104, 6007049, -1155883, 723165, +-2025614, 6489696, 7221988, -1617055, 9317395, -2314987, -894964, 17666274, 7531762, 3102577, +-5203890, 5290326, 13378286, 14099304, 16167868, 5932961, 5977521, -8937827, -1074, -433792, +3018825, 9197136, -304406, -7115687, 8336532, -7459822, 6950331, -232465, 8189966, 1319092, +-6585259, -1743757, 623844, 1967095, 4119411, -856846, 2975876, 2301566, -20401, -40421012, +53762252, 7452305, 12267500, 12923557, -12372190, -14274324, 552440, -5484137, 7679402, 17725330, +-24817932, 8253854, -5202816, 6487011, 6089190, 4234301, 14206141, 11108396, -10557566, 9988483, +8705362, -8578123, -14800457, 4558034, -5224291, -12291123, 7417409, 6074158, -997506, -8030515, +272730, -5849746, -2806761, 585726, 3246459, 5670968, -11054709, -1635309, 8937827, -3955128, +8027294, 1539209, 5805722, 11681774, 3502546, -11908334, 1298691, 11145440, -6270116, -576063, +5450314, -18940268, -1097364, -4680441, -17606144, 24427090, -6156836, -1018444, 14551886, 2486786, +-10842108, 4301947, -10358924, -2104534, 8123931, -9767293, -3470334, 18054432, -19114216, 2046015, +1788854, 6558952, -8456791, 5804649, -2858838, 5408975, -7243463, 333934, -1698660, 18183818, +-8230768, -827855, 4816269, -9199283, -810675, 12584254, -2582886, 8108362, -5464809, -5229123, +1019518, 4869419, -4716948, 9277666, 19327, -2048699, -1934883, -2949569, -2835215, 7909719, +-6660958, 7741679, 4337917, -10218801, 2552284, -1052804, -770410, 5992553, -8392366, -3432753, +1348083, -5681705, 6002754, -5844377, -743029, 9589588, 1843078, -1820529, 4497368, -4849555, +-3719979, -2364380, 4795331, 7993471, -2345052, -2331094, 1008244, 12678207, -53141092, -108196128, +-13875966, 68014032, 52310556, 150069376, 72237056, -34910032, -30489972, -71061848, -124499288, -15686831, +-48227116, -14926085, 88015152, 56127708, 59914792, 114534432, -3943854, -25276956, -43110736, -113146616, +-62423056, -20043002, -20966956, 3214246, 51605104, 39977020, 42436960, 79962088, 46821584, -29311004, +42665668, -44688596, -104346232, 13426605, -70007432, -97436168, 38101728, -8307004, -17994302, 119955752, +39348344, 31936840, 103408856, -11025718, -20253456, 31518618, -69177424, -85980416, -23068806, -73613056, +-65775812, 14023068, 14348412, 29837138, 90232968, 79915384, 48446696, 57337812, 11153493, -45105208, +-48569636, -60146724, -82680264, -38579544, -20929376, -28058484, 25088514, 79808544, 52138220, 51483236, +42349988, -29742648, -248034, 8473970, -68223408, -28097140, -17042430, -19937238, 31403190, 16087874, +-3851512, 25670482, -5867999, -5274757, 4455492, -18371186, -13819594, 9151502, -11340861, 18617610, +23424214, -8651675, 12737262, 23848342, -13800804, 15639050, 7873749, -46439872, 8305393, -15043660, +-50401440, 828392, -28751048, -25751550, 36792836, 39786428, 38449620, 71159552, 22749904, 22677964, +24196236, -31077310, -62017180, -69293392, -88681408, -66090956, -19865834, 11611444, 53906136, 89234928, +98915248, 77219216, 56332256, 11134703, -52264384, -78809432, -96182032, -89429272, -46296528, -2950106, +25303262, 64063732, 59192164, 32273994, 32499480, 12581033, -866510, -256087, -9987946, -19697256, +-16267189, -20473036, -24694988, -18291728, -13554380, -3812320, 6594923, 16110422, 19504520, 20598664, +16960288, 9419400, 2436857, -2137820, -2969970, -1813550, -957778, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -1056562, -2688113, 4654134, -3479997, -3011309, -4655208, 4212826, 2098629, 365072, 6233072, -625992, --79994, -1909113, -1544578, 1350767, -1669669, -3251827, 1826435, 525060, 5205501, 7114077, --1854889, -4189741, -5160403, -327491, -2951716, -2844879, -1952063, -398895, -4110821, 3954591, --1473711, -1555315, -2720325, -2006824, 756451, 4443681, -465467, -1285806, 1341640, -4370666, -3274913, -2727304, -9797894, 4855998, 3226594, 5394479, 5596343, 1063541, 2945811, -2925410, -828929, 4240207, 328565, -53150, -1023276, -565862, 2274722, -2071248, -1494649, 104153, -2162516, -1798518, -2238215, -3278671, 4190814, 1662689, 515933, -1023813, -4196720, -147103, -3134253, 1945620, -599685, -796716, 3139621, -383863, -231391, -1370632, -1294396, -1919850, --2271501, 139586, 477815, 1076426, -2337536, -927713, 1298154, -1620813, 1401770, 376883, -627602, -607738, -39192, 302258, 683437, 169651, -272730, 426276, -298500, -801011, --259846, -1324461, 877247, 448824, -378494, 16106, -598611, 785442, 811749, 259309, -80531, 302795, 287763, -825171, 29528, -163209, -200790, -324807, -111132, 457951, --14710800, 7640210, -745714, 195421, 2642479, 3732864, -5495411, -718333, -1006096, 3100430, -1164473, -3371013, 10423349, -1142461, -671626, 4625680, 3791919, 1225139, 2623688, 8505646, --4245575, 245887, -2176475, 832150, -2649458, 191663, 242129, 937914, -4759361, 386547, --1161789, -1801739, -227633, 2956011, -1665374, 2747169, 4002910, -6968585, 911607, -2844879, --793495, -4298189, 2109366, -2558727, -461172, -1453310, -4372814, 1642288, -2942590, 1963874, -1064615, -2170032, -3190624, 82678, 2913062, 2193118, 5315022, 2450279, -2335389, -6577206, --467078, 1138703, 8244190, -2582886, -1283658, -109522, -1639604, -4329327, -2084133, -4031364, --569083, 3312494, -781684, 3947075, 2525441, 2031520, 2850248, 501437, -5202279, -1226213, --3358665, -2134062, -5774584, -212064, -1666984, 757525, 1528472, 663572, -885300, -1187022, -166967, 1501091, -1326071, -373125, 5369, -485331, -151934, -547608, 578210, -1992865, --709743, -484258, 26844, -209917, -398895, -11811, -2814277, 10711112, 5579163, -1750199, --4333622, 6123550, -7182796, -1211181, 3971771, -2976949, -2149094, -3104188, 7067906, -2515240, -2173254, 572841, 2146947, 9653476, -9735080, 2869575, 4853850, -3264175, -9010841, -4716948, --629750, 536871, -1290638, -1654636, 3755949, 5453535, -466004, -3913789, 279710, -4952098, -1453846, -3121368, 1726040, 5825050, 2134599, -5913633, -166430, 329639, 8756365, 1609539, -4379256, -1291711, 1938104, 1506460, -10604811, 141734, 5015985, 2297271, 5611375, -5001490, --3059091, -4980015, 1341640, 3149285, -1014149, 1054951, 273804, -2512019, 943819, -1893007, -1688996, 1568737, -361851, 2569464, 536334, -409633, 1149441, 6279242, 1162326, 3266323, -4109747, 2245731, 103616, -120796, -5907191, -35433, 6307697, 2203318, 2801929, -142808, --427886, 3939559, -2952790, 306016, -262530, 1991791, 1080184, -2684, -2559801, 404801, --1287953, -401579, 448287, -845572, -594316, 603443, -62277, 2021856, 870805, 1846836, -911070, 551903, 1027034, -771484, -999654, 103616, 134755, 2313377, 1446867, 328565, -826244, 2198487, -352724, 206158, 709743, 22122840, -5714991, -2069101, -3358665, 4523138, -3019362, 7525857, 2987150, -1115081, 3606699, -164283, 4034585, 1556389, 5608154, 111132, -4706748, 6117644, -6795712, 1210107, 1756105, 1124208, 1069984, 1508070, -4039954, -20938, --4651987, -683974, -168041, -7893613, -5355288, 1961190, -33286, -289910, 3139084, 3062849, --1602560, -6809134, 2039573, 6111202, 4036733, 5698348, -1536525, 3072512, 5672578, -9459665, -2998961, 4136591, -4662724, 5825050, -4064650, -872952, 581968, 1132798, -3138547, 2745021, --823560, -1084479, -3265249, -2691334, 3279745, 3269007, 1488743, 3218004, 5042829, 2740189, -7008850, -1494649, -7875897, 7607461, 1252520, 3722663, 1592359, -1321239, 1999307, 1432909, -340376, 5213554, -1592359, 5143760, -7402376, -1726040, 969589, 2276870, 513785, -4074850, --1859721, 651224, 243739, -451508, 260919, 1542430, -1976759, -1158031, -1110249, -1471563, -860604, -462783, -535797, -1204738, -843424, 2223183, -523449, -770947, -14496, -819802, --637266, 1113470, -436476, 1190780, -241055, 68719, 969052, -304406, 9791452, -11266236, -7469485, 1568200, 7649337, 1762547, -4330938, 1403917, 5890548, -7066295, -1506460, 795643, --7967165, -1584843, -6126771, -3753802, -4467840, -4897874, 2060511, -7608535, -4731980, -6064494, --1557999, 5834713, 2094333, -7293392, -2851322, -7627325, -1898376, 1650878, 10919417, -8818105, -3595425, -2252174, -3245922, -6574521, 289373, 1109175, 6992207, 3674882, 863288, -5961952, --10353556, -161598, 3008625, 8106751, 2808372, 2594160, -6023692, 2179159, 5063230, 384936, -767725, -3220152, -3208341, -1082332, 2935610, 522912, -2087891, 55835, -6624987, -950262, --5587753, 3500935, -1194538, 3500398, -5475547, -4617627, -7529078, -874026, -4852776, -2080912, -1893007, -7284802, -3171833, 837519, 3984119, -8749922, 5075578, -4118874, -4446902, -4650913, --3913789, 2626909, -2639794, 1216550, 1480153, -2321967, 303332, 1819456, 1383516, 92879, --2107218, -311922, -1029182, -2348273, -444529, 1735704, 999654, -1162326, 1557999, -1361505, --1065152, -258772, 510564, -1749125, 90731, -213675, 1155883, 932008, 1927367, -1577864, -433792, -357019, -703838, 610422, -1848983, -638340, 894427, 497142, -27346056, 4402879, -3117073, -7897908, -1760937, -38655, 270583, -1517197, -2626373, -2026688, -8128763, 6248104, --3939022, 856309, -6770479, -2413772, 9789304, 8864276, -5629092, -3405909, 281320, -166967, --4620311, -5397164, -3820374, 629213, 418222, 150861, -556735, 2270964, -6672769, 2070174, -228170, -11784853, -1414118, -3537443, 5381594, 7847442, 1228361, -1400696, 376347, -6915434, --8638790, 4614406, 8547522, 9498857, -2566243, 1716913, 5553393, 5709622, -2966212, 5265630, -8614094, -381178, 7252053, 6124624, -7221988, 2344515, 420907, 7748658, -4760971, -5100274, -4481799, 5867462, -1807644, 504122, -8508867, 5969468, -4757750, 6302328, -10582263, 1125818, -2524367, 5028870, 352724, -4457103, -9024800, -5564667, 7605314, -7530689, -344134, 825171, -4108136, -2296197, -1593970, 3171833, -6027450, -5284958, 2167885, 1412507, -428423, 4292820, --1990717, 999117, 1127966, 1129576, 1648194, 325881, -1668595, 1022202, 2243584, -952409, -325881, -478889, -1105954, 880468, -2777233, -424128, -2995203, -606127, -550293, -1013612, --1526861, 596464, -873489, -71404, -2321967, 907312, -403190, 784905, 976031, 327491, -417686, -10597832, 3753802, -9365713, 11846594, 11392938, 347355, -15438260, 6389838, 873489, --2881386, 10650445, 43487, -9199820, -980326, 11578695, -14528264, 457951, -3636227, -11465952, --3190624, 207769, -2259153, -5872831, 3379066, -4865124, 3952981, -4144107, -7769596, 4140349, --583042, 5949067, -11567958, 4719632, 9099425, -3659849, 746251, 9149891, 13378286, -3558917, --2734821, -11275900, 657130, -9302362, -761820, -6475737, 319438, 907312, 5403606, 2590939, -4938139, -3565360, 906238, 3062312, -588947, 12349642, -8199630, -4048544, 16245714, 16319802, --3223373, -1029182, -10244034, -5235029, 519154, -2841658, -6780680, 9858024, 3037079, -2567317, -14462229, 2804077, -6942278, -191126, -13284334, -6661495, -7531762, -6453725, -1766305, -10369662, --7486665, 4274030, 3949223, -761820, 2329483, -3076807, 3471407, -2310693, -3395172, 587337, --4887136, -2232309, 6273337, 502511, 3125663, -1676648, 641024, 481573, 1471026, 1360968, --275415, -124554, -3106872, -35433, 661962, 502511, -876173, -880468, 2095944, 624918, --449898, 74625, -535797, 70867, 1161252, 13157632, -3456375, -113280, 9073655, -2124398, -5379984, -2894271, -11429445, -707059, 54224, -2320356, -6754373, -7546258, 3991098, -5970542, -10660646, -3228205, -7659538, 6606197, 13370233, -3276523, 3780108, -3548717, 7744363, 204011, --16151761, 5802501, 9042517, 931471, -2651606, -9385040, 7944079, 5319317, 5132486, 1069984, -3252901, 10604811, -7415798, 1353452, 2115272, -5848135, -11340324, 10880763, 6080063, 20221242, --983011, 8939438, -2921652, -6309844, 1123134, -958851, -242129, -1772748, -6533182, 14529874, -379568, 1165547, 2095944, -1989107, 11970611, 1548873, 10029286, 4203699, 1722282, 10711112, --4996121, -11934104, -2323577, 2246805, 1586990, -4915590, 5887864, -3508988, -16710644, 1551020, -3364570, -9216463, 4347581, -924492, 1843078, 58519, -3768297, -4168266, 15569, 1622424, -5144297, -424665, 1465658, -1935957, -1433982, 2347737, 1546725, -252866, 1592896, -1666984, --165356, 155693, -2267206, -3268470, 2090039, -3642669, -926639, -1567126, -3192771, -855235, --404264, -1155346, 1426466, -509491, -1331440, -360777, 6180458, 2455648, 2371359, -1202591, -901943, -1886028, -2483028, -780610, -843424, 1112397, -1637456, 3022046, -3843459, -1174674, -845572, 10630581, -17624936, 2893734, 7894687, 11751567, -12343736, -1778653, 8368744, 5832566, -7141994, 1261647, 15074798, 2794950, 6250788, -1874216, 892279, 6220187, 3411278, 7180649, -569620, -9969156, -14545444, 7714298, 3733937, -2769180, 1711008, 4338454, -13609141, 127238, --8587787, 4017942, -467078, 8920110, -2858838, 3984119, -2059974, 2310156, 1221381, -379568, -5023501, 6703907, 2403571, 3881577, -10661719, 4411469, -1877438, -18596134, -12352326, 3164854, --13576928, -937377, 11224897, -8191577, 22296248, 8056285, -4488241, 12095702, 569620, -3965866, --8995272, -8916352, -12377559, -1928977, 7239168, -8862128, -1097901, 8028368, 3670587, 4531728, -16338592, 2011655, 10683194, 75699, 2099165, -17541184, 4859756, 1314260, -15958488, -15116137, -8721468, -5769752, 1017370, 4583267, -2600603, -4115653, 925029, -920197, -1090385, 915902, --2852932, 2561948, -2050847, 566399, -5036923, 2731599, 849330, 1108102, -270046, 6214818, --5036923, 429497, -1409286, -1259499, 1260036, 1268089, 1741609, 2989297, 4999342, 3083250, --3208878, 775778, -402116, 4547297, -1495186, 2932926, -4657892, -3545496, -2682744, -2262911, --305480, -256087, 2318746, 2703682, -9143449, -222801, 5831492, -25770, 4108136, -9366787, -7373385, -522375, 2181307, 6878390, -12665859, -8686571, 2358474, -115427, 7026030, 14450417, --1288490, 3647501, 15506443, -5683853, -10430328, -543850, 11372537, -2395518, -12998182, 1105954, -4863514, -2505040, -4035122, -900333, 16811038, -3133716, 14477261, 10960220, 13212930, 784905, -1122060, 7750806, 2629057, -2611877, 2760053, -10365367, 7905961, 13245142, 8323110, 1191317, -7405598, -5725729, 5697811, -5568962, 8310762, -7394323, 188442, -536334, -535797, 23513872, --3466576, -1253594, -1999844, 3317325, 6510097, 12408161, 14143327, -7648800, 3420405, 14093935, --7830799, -9716290, 5919002, -4198331, 6100464, 26851062, -12622909, 1870458, 2543695, -6920266, -3056943, 8804146, 6167036, 784368, -5455146, -13141526, 6286759, -5699422, 7266548, -4903779, -1047435, -6478422, -1404454, -10874320, 962073, -3414499, -3838090, -1305133, 1352378, 2815351, -5446019, 2348273, -3084860, -724239, 5549098, -3209414, -2843268, 442382, 411243, -4925791, --46171, -2460480, -1217623, -888521, -877247, 1960116, 1210644, 3963718, -2491081, -2464774, -313533, -2962454, 1421097, 6195491, -3068217, -3240553, -6109054, 3176128, -1539209, -1550483, --9080098, -14316737, -11020886, -14898168, -5738077, 1674500, 11930882, 8838506, 3202972, 12563853, -3779034, 7675107, 7065758, -3406446, 10897406, 11810086, 8341900, -15939161, -8931921, -9230958, -3479461, -6365679, 445066, 4540854, -4629975, -11246909, 7279970, -5331665, 2586107, 2421825, -11479911, -11964168, 18611168, -18376018, 19012746, -38655, 9540733, -9219684, 3360275, -20540682, --11437498, -9992241, 9061307, 4175782, 13135621, -1301375, -42413, -6660421, -16465831, 10758893, --8989367, -4669703, 7841537, 18687940, 18083960, 8484171, -1198296, -12226161, 7204271, -18779208, --1452773, -10660646, 6062883, 20278688, -19444390, 7102802, 9044127, -12089796, -1185948, -2056753, -6798933, -8012799, -11536282, 2307471, -4656819, -16959752, 8630200, -1669669, -15921981, 11844446, -15672873, -5154498, 545461, 2219961, -6719477, 10176925, 4733591, -2869575, -2507724, -6665253, --3788698, 8165807, 4696547, 4663261, -328028, -7344394, -2188286, -2487323, -8140037, -1730872, -2485176, -482110, -2361158, -733366, -5791227, 773094, -1946157, 3974455, 2241436, 836982, --6711960, 5582384, 557809, -2907156, -1663763, -1098975, -293668, 3316252, -2443300, -1025960, -2580202, 6863895, 3493419, 2035815, -4095251, 5478768, -13685913, -15979963, -4518306, 10286984, --12236899, 8079907, -16807280, -3009698, -6467147, -5929203, -13325136, -1198833, -4975183, -8014409, -6407018, -8928700, 9601399, 2019708, 7500087, -11795591, -22046068, -1841467, 4548907, -9241159, --6757594, 3596498, 2878702, -10807211, -5120675, 15351287, 7462506, -2033667, 8409009, 22050362, -790274, 2787971, 2267206, -1685238, -354872, 3242164, 2962454, -16962436, -6155762, -20724828, --6539088, -19328964, -9098351, 1041530, 22581864, 10524817, -11161546, -13130252, 8425652, 17815524, -11280732, -7988103, 13675176, -5215164, -1020592, -23945516, -7108708, -3097208, -2944200, -16382079, --26220238, 8395587, -53687, -19202798, 4896263, 30008400, 3921842, 3384971, -18957448, -1721208, --268972, 4187056, -21287468, 19648402, 3112241, 5418101, 10878078, 4186519, 11799886, -916976, -5542656, -4643397, -9215389, -7693360, 4060355, -6201933, -1955821, -8281771, 2776696, 6736120, -129923, 5670968, 639413, -2302639, -99321, -4769025, 3301219, 3388729, 609349, 603980, --3236258, -1342177, 1807644, 4924180, 3591667, -4370666, -1546188, -1815697, -9956271, -13830332, --10165651, -3353833, -1278290, 1581622, -2376191, -3935264, -4238059, -30065, -2841121, -3706020, --6187438, -3384971, 9970230, -6197638, 12112345, -18402324, -3794604, 4327717, -8880919, 21087216, --17499308, -18014166, -14659260, 20390894, 9080098, -11905649, -10740103, -7184944, -2285996, -6481106, --6667400, 947040, 7574712, 20140712, -2297271, 8545374, 7434589, 7220377, -13550085, -16900160, --12159589, 14057428, -2511482, 17093970, 5635534, -1969243, -23534274, -19209778, -2042257, 1483911, --13674639, -8591545, -6455873, -6611029, -30848066, -6769942, -7578470, -11176579, -5491653, -7339562, --14186814, 9852655, 19157702, 10596221, 479963, 11261941, 14377940, -5225365, 4526896, 3586835, -1382980, -682900, -3715684, 10036265, 4038880, 16887274, -3982509, 1591285, 6017249, 33337536, --427349, 17681306, 22445500, -2045478, -19624780, 1602560, 19494856, 2782065, -16712791, -15042586, --19152332, 12392591, -15647640, -4326643, 22369264, -9716290, -15014132, 4544613, -4123169, 345745, -6105296, -9488656, -4226785, 1774895, -2814814, -4355634, -852014, 1623498, 11181410, -1142998, --5807333, -5094905, -48318, -4399121, -3528853, -3234647, -5634460, -2772402, 2127083, -2789045, --533650, -7765301, 1975148, -831076, 1552631, 7560753, 4800700, -4624069, 2097018, 1562294, --6753836, -10406169, 3855807, 4013110, 594853, -10635950, -11374684, -1906966, -7945153, -2702608, --1161789, 18866180, 13743358, -31657668, 10040023, 12627741, -5550709, 9171366, 30079804, 2473364, -6694781, -10508174, 6971269, -11105175, -7096897, -5916855, 2208687, 7740605, 10821170, -1551557, -4460324, -3273839, -1843615, -5806796, 7963943, 28395102, -9274982, -9153112, 10180146, 7181186, -1025423, -20649130, 13384729, -16462073, 9444633, 11853036, 1315871, 3013457, -3411815, 19537270, -14782741, 177704, 9942849, -7810935, 12538083, 2107218, 14158897, 20694226, -465467, 5255966, --2705293, -7616051, -533650, 9026948, 10160282, -19750944, -12014097, 4643934, 21459804, -10391137, -14241038, 9557913, 2760053, -23012972, 2787971, 3599183, -27473296, 16202227, -15381888, -18263812, --34772056, 8478265, 21081846, -9536438, -19407884, 4038880, 23365696, 14928769, 2593087, -3032247, -318901, 8262980, -7160784, 11020349, 17943836, 17127256, -1275068, 7269232, 17752710, -2780991, --247497, -1952063, 15284178, -2243584, 3750580, -7145752, 3877819, -4394826, 582505, 220117, --1209570, -3460133, 3340411, 9014599, 3028489, 2565169, -8148090, 2074469, -8412230, 2554432, -13226889, -4817343, 195958, 1746978, -6289443, -8185671, -9432285, -2138357, 5970005, -2768643, -1595044, -5701032, -590558, 217970, -17452600, -4476967, -748935, 3670050, 4442070, -3623879, -6182069, 3277597, 3299072, -5174362, -5073967, 7744363, 21812528, 15812459, -5468030, -42627552, -5005248, 21329344, 10177999, 4632659, -18700288, -118112, -12913356, 2996277, -1252520, 3528853, -6410239, 8930848, 3804804, -23178864, 13412646, -3231963, 4054986, 17591112, 6767258, 3282966, --6313065, 21821118, -784905, 21688512, -26375932, -7762080, 8392366, -15374372, -13292387, 917512, --3488587, -12037720, 1386201, 19160386, -663036, 1258425, -10104447, -20975010, -13389561, -6004901, -8653822, -2325188, 1988033, -10326712, -11247446, -5518496, 16634408, -11489574, 9562745, 6432251, -5363341, 1836099, -17293148, -24619826, -2046552, 16436840, -20478940, 9844602, -17639968, 10992432, --18555332, -961536, -18296024, 25848186, -23666880, -14134201, 6053220, 4223027, 11803644, 9840844, --6173479, -3288334, -6212134, 3186329, -311385, 15397458, -19212462, -7615514, -24672440, 12697534, --8806294, 933619, -1088237, 6689412, -5508833, 2487860, -10133438, -15351287, 9785009, -7950522, -188442, 2496987, 13016972, 5188858, -9455371, 1972464, -3242700, -12131672, -2299418, 2797634, -3751117, -10974178, -5399848, 12028593, -1290638, -10206990, -4520990, 14121316, -16687559, -5689758, -3335579, -3911642, 5865852, -1295470, -7369627, -9892920, -3211562, -4460861, -3119757, -3287798, -2638184, -819802, 6113349, -6569153, 3364570, 1135482, -3017752, 6594923, -36378372, -5168457, -10863046, 2648384, -8687645, -12991202, 1175747, -12349642, -1176821, -19063212, 17809082, -7144141, -11134703, -24783036, -14085882, -524523, 30325154, -24861956, -2195802, -19463718, -15515569, -4742718, -18979998, -4438312, 8398272, 8885214, -10147934, -21589726, 30345554, 13215614, -17446158, 3352222, -2178622, 8368207, -16980690, 15156403, -1403381, -31805306, 3299609, 6344204, 8134668, -26355530, --6371584, 3303367, 23134842, 4398584, 12859132, -33993592, -20724290, 10407780, -69793, 22159884, --6013491, -3758097, 1626182, 11258720, 10252624, 3929358, -43276092, 12160126, -5105106, 9876814, -22950694, -7293928, -2125472, -26323854, 8461086, 11891154, -13917305, -8225936, 23748484, 37620156, -9760850, 6126771, -10739029, -4422206, -20636780, 1563905, 166430, -25378962, 9164386, -767189, --7518877, -1938641, 11849815, -9721122, -6642704, -1133871, -2812667, -915365, 10448582, -4548907, -114354, 6073621, 2319819, 8355859, 6935836, 5354214, 3671660, 10004589, 11602854, -15658377, -4875862, -9771587, 7643968, 1169305, -10022843, -6715718, -3968550, -3273839, -6615324, 6027450, --3429532, -6415608, 10661719, -1688459, -3534758, 6160594, 10980084, -19327, -4109747, 3085934, -10233296, 11273215, 6952479, -3655017, 1762547, 2119030, 9188546, -31213674, -20424180, -7045357, --343061, -17786534, 14090177, -36881420, 1772211, -22646826, 11720966, -8405251, -25178172, -2239826, --6802155, -8875550, -28677496, -20924006, 5958194, 22577032, -15197205, 27873264, -23796266, -15640660, -5060545, -2340220, 12625056, -7919920, -8329552, -11551315, -3266323, -39170100, -11313481, 1110786, --1750736, -6548752, -15462956, 12270185, -13690745, 20885890, -6535867, -2630668, -14884746, -13676250, --25993678, -11311333, 9515500, 3926137, -1625108, 1689533, -9387188, -7055558, -12085501, -10101763, -5221070, 7688529, 3551401, -22537840, 25694104, 3474092, -11264089, 20601348, 14654428, 24556476, --4766877, 14318884, -33779916, -18231600, -31927176, 32350768, -10566693, -22610856, -21855478, -46147276, --19426674, 31893890, -2236604, -16213502, 11531987, -31499290, -21196738, 7876433, -2007897, -26288958, --25813290, -333397, -14909442, 3916473, 5316096, -19558744, 18866180, -11652246, -17250736, 1460289, --10305237, 27181238, -10671920, 12202539, 1760400, 16516297, -8613020, -4859219, 1396938, -7561827, --476205, -15881715, -12210055, -3082713, 6405944, 295816, 10790568, 4414690, 7949985, -7145215, --255551, -13823889, -3599720, -5000953, 3911105, 13151727, 5859946, 5265093, 6057515, 5430450, -1235340, -18007724, -5565204, -12440910, -3319473, 2055142, 8244190, 40263708, 51555176, -4908074, --22920092, -5462125, -8672613, -23157390, 9953587, 634581, -16785270, 49277232, 17088064, -11684459, --34186328, -3070365, 8228084, 8983998, 9998684, 23568634, -6796249, -11664594, 11061688, -42776800, --28592672, -11180337, -3081639, 4580046, -22851374, -20871394, 21984326, 17484274, -13466333, -25897042, -16415365, 471910, 28968480, -23604604, -5431523, -8058970, -1481764, -18664318, -27800250, 23328652, --17243756, -10902774, -21247740, -4769561, 14017700, 13160854, -8571144, 1834488, 2461553, 17592186, -26968100, 19840602, -34570192, -16634408, -20509542, -5158793, 11793443, 4286914, -23629300, -34002184, -28805272, 1795296, -28222230, -46882252, 23632520, -6136435, 12721156, 11707007, 12440373, 1614371, -9188546, -18459232, -6962142, 12591233, 2321430, -8672613, 5252208, -2250563, -24813636, 12470974, --31507880, -2124398, -1506460, -5559299, -11286100, -4476967, 13920526, -1023276, -3118683, 7038378, --10139344, 30637076, -2360622, 2660195, -2210835, 207232, 7734163, -578210, 7458748, -15783468, -3479461, -2984466, -10853382, 1006633, 5325223, 10115185, -5067525, 2736968, -26071526, -8690329, --1334124, -13841069, 11768747, -1708860, -3048890, -7514582, -10666551, -16053514, -22197464, 6603512, --2113661, 16189342, 19531900, 12187507, -13080860, -18549964, -23172960, -8922258, 21556440, 17293686, -3147137, 7977902, -7337415, -13643500, -10080825, -9829033, 4538707, 18041546, 22355842, -27849642, --23379118, 66219268, -5401458, -6535330, -10005126, -20970714, -2343442, 23861764, 38356744, -17742510, --10756746, -3944391, -17552458, -4395362, -9929964, 15231028, -15874199, 17442400, 8257612, -6038724, --22116398, -1651415, -9160628, 33042258, -18257906, -475668, -34360, -3325915, 14870787, -9557376, --1344862, 6853694, -4627291, -32322314, 16375637, -14758044, -17167522, -3948149, -18306224, -10590852, --33176474, 31623844, 1345935, -21095268, -38860328, 22546430, -22970022, -22334366, 188442, -17398912, -7727183, 14295799, 43957380, -12547210, 17139066, -3726421, -21434034, -18124762, -5413807, 66292820, --58612344, -4294431, 60764660, -55730960, -21268678, 31367756, -4765266, -25191594, 58751932, -29165512, --12250320, 27020714, 6563784, 11523397, -17599702, 19508278, 27315456, 12854300, -7172059, -1822677, -27582280, -4057134, 15712064, -391916, 10915659, -15895137, -2232846, 7300908, 4295504, 3047816, -564788, 1117765, 11364483, -5310190, 2800856, 4268661, 3719442, -24931748, -10451266, 7978439, --21306260, 6350109, 11849815, -8927626, -9616432, -7269769, 4838281, -10219875, 11865384, 10245644, --1557999, 5937793, -7735773, -15018427, -14874009, 29116120, 5005248, 18166102, 3488587, 3597035, -11260331, -9917616, -2607045, 18474802, -11244761, -25173878, 18605262, -2523293, 31513248, -39693552, -36044976, -5900212, -22044456, 19480362, 6985228, -3360812, 4257387, 2834679, -4086662, 7241852, --7487739, -9768366, -4326643, -13615583, -11306501, -25762824, -9727027, 22567906, 21289616, -32083942, -11024644, 17365090, 14585709, -5334887, -31675920, -2668249, -15569793, -37125160, 23773180, 60029148, --34112240, -3503083, 42722040, -11854647, -14936286, 34733936, 25851408, 12862353, -13703630, -27597850, -9503689, -11115912, -17353816, 62770412, 46261092, -37522444, -27560806, 34001644, -61391724, -21465710, --17221746, -10416906, 43313672, 28862180, 19074486, 20905216, -72164040, -25045564, 69226280, 40189084, -8418673, -18195092, 24009940, -24074902, -48948668, -32573568, 24240258, -17727478, -3613678, 28079960, -51845088, -5995775, -28815472, 3952981, 20653960, -34957276, -12774843, 36864240, 33224794, 33254858, -23200876, -6360847, -20667382, -10165114, 28285580, 8320963, 12061879, -5159867, 3435974, 12984760, -1414118, -4852776, -5669894, -7778186, 6535330, 4747013, 27165132, 7765838, -5003100, -10473278, -2966212, 1576790, -3627100, -9164923, 2994129, 21023328, -21756156, -6376953, 20318416, -4325569, --173946, 13515725, -4728222, 10064719, 4509179, 11780558, -21967148, -2954938, 5071283, 25691420, -6538551, 12456479, 11014981, 6131603, -4483946, 8659728, 12453795, -13324599, 7133404, -61268784, -26558468, 331786, -6247567, 31439160, -5307506, -23684598, 11960410, 10896869, 30750892, 17430052, --16571058, 918586, 4789426, 21067888, 4922033, -24199456, -889058, -1364189, 4986994, -22511534, --24526410, 35629440, -12783433, -37220188, 19207094, 33071248, -18544596, -6313065, 2224793, 22673670, --26982596, -35496832, 9802726, 29997662, -6442451, -12776454, -7353521, -7303592, 13107703, 5564667, -7857106, 75590352, 4239133, -9657771, 1095754, 2375117, 40890236, 1291711, -14443975, 9196062, --31845036, -18746458, 8345659, 158377, 35156456, 27849642, -17955648, -5283347, -16969952, 803696, -12655658, 3185792, 3980361, 12577812, -8958765, -37168648, 9540196, 25074020, -11777337, 22126060, --34324304, 16188269, 10459856, -30169460, 5247913, 587874, -13069585, 1369558, -5540508, 14986215, -14719390, -25281788, -15495168, 33709588, -25648470, 12390981, -2319819, -9901510, 7491497, -1014149, --15051176, 8614631, 5321465, 6164352, -378494, -2580739, 1774358, 4665945, -5672578, -5484137, -4685273, 3281355, -3089155, -281857, 7565048, 12550431, -7326678, -5079873, 1714229, -2248952, -4508642, -3113851, -1571958, 2907156, -32212, 7543573, -2264522, 3724811, -9645423, 5940477, --6689949, 6280853, 11167989, -974421, 338229, 1542967, -12567074, 21321292, -39366596, -129994704, --153868272, -13640816, -106646720, 42198052, 260760880, 140367040, 211834224, 223225552, -24021752, -64063196, -19283330, -162230576, -198335680, -61143692, -218355600, -175270096, 44725640, -126021856, -34170224, 251806416, -91316376, 178082768, 307539520, 183100896, 82037096, 62457952, 22011708, -136706128, -170201504, -56047176, --232546704, -232748032, 30930206, -174011136, -142734656, 86126976, -146353152, -150543440, 114015272, 46413028, --20571820, 268790336, 251757568, 160793376, 341240512, 321543808, 110016128, 128091496, 99921880, -161630896, --161975568, -204945632, -405914144, -479237824, -344579328, -343098624, -252981632, 8850317, 23626616, 167358240, -289322944, 356492480, 324891712, 376936000, 323047040, 190562336, 128242888, 42798812, -63411972, -142835040, --203224432, -174645712, -253262944, -283750784, -235234288, -275115200, -206328624, 32909114, 66457640, 160562528, -321951296, 256349952, 197674256, 149405808, 59020368, -48597020, -39573292, -80473192, -100683696, -76896024, --87436408, -84533544, -35874252, -34111704, 2164664, 52511344, 37479496, 73653856, 88517128, 15577310, -64287072, 61702572, -16800302, 20645370, 14656039, -46595564, 2299955, 15355045, -53863184, -58930708, --82276544, -169632960, -189603472, -147516016, -140883520, -46046344, 69653632, 125216016, 203660912, 307008032, -331532288, 307394016, 215565488, 65954056, -69013144, -148154896, -221248256, -273264064, -268667392, -209836000, --143895904, -68214816, -20581484, 9103720, 25472914, 63021664, 103716480, 106873280, 99418832, 101996344, -72934984, 65732328, 57207892, 23780160, 6444599, 15372225, 13837848, 9188546, 6893960, -11006391, --32198296, -46876348, -53939956, -44794360, -26738856, -17313550, -15388868, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +2688113, 4654134, -3479997, -3011309, -4655208, 4212826, 2098629, 365072, 6233072, -625992, +-79994, -1909113, -1544578, 1350767, -1669669, -3251827, 1826435, 525060, 5205501, 7114077, +-1854889, -4189741, -5160403, -327491, -2951716, -2844879, -1952063, -398895, -4110821, 3954591, +-1473711, -1555315, -2720325, -2006824, 756451, 4443681, -465467, -1285806, 1341640, -4370666, +3274913, -2727304, -9797894, 4855998, 3226594, 5394479, 5596343, 1063541, 2945811, -2925410, +828929, 4240207, 328565, -53150, -1023276, -565862, 2274722, -2071248, -1494649, 104153, +2162516, -1798518, -2238215, -3278671, 4190814, 1662689, 515933, -1023813, -4196720, -147103, +3134253, 1945620, -599685, -796716, 3139621, -383863, -231391, -1370632, -1294396, -1919850, +-2271501, 139586, 477815, 1076426, -2337536, -927713, 1298154, -1620813, 1401770, 376883, +627602, -607738, -39192, 302258, 683437, 169651, -272730, 426276, -298500, -801011, +-259846, -1324461, 877247, 448824, -378494, 16106, -598611, 785442, 811749, 259309, +80531, 302795, 287763, -825171, 29528, -163209, -200790, -324807, -111132, 457951, +-14710800, 7640210, -745714, 195421, 2642479, 3732864, -5495411, -718333, -1006096, 3100430, +1164473, -3371013, 10423349, -1142461, -671626, 4625680, 3791919, 1225139, 2623688, 8505646, +-4245575, 245887, -2176475, 832150, -2649458, 191663, 242129, 937914, -4759361, 386547, +-1161789, -1801739, -227633, 2956011, -1665374, 2747169, 4002910, -6968585, 911607, -2844879, +-793495, -4298189, 2109366, -2558727, -461172, -1453310, -4372814, 1642288, -2942590, 1963874, +1064615, -2170032, -3190624, 82678, 2913062, 2193118, 5315022, 2450279, -2335389, -6577206, +-467078, 1138703, 8244190, -2582886, -1283658, -109522, -1639604, -4329327, -2084133, -4031364, +-569083, 3312494, -781684, 3947075, 2525441, 2031520, 2850248, 501437, -5202279, -1226213, +-3358665, -2134062, -5774584, -212064, -1666984, 757525, 1528472, 663572, -885300, -1187022, +166967, 1501091, -1326071, -373125, 5369, -485331, -151934, -547608, 578210, -1992865, +-709743, -484258, 26844, -209917, -398895, -11811, -2814277, 10711112, 5579163, -1750199, +-4333622, 6123550, -7182796, -1211181, 3971771, -2976949, -2149094, -3104188, 7067906, -2515240, +2173254, 572841, 2146947, 9653476, -9735080, 2869575, 4853850, -3264175, -9010841, -4716948, +-629750, 536871, -1290638, -1654636, 3755949, 5453535, -466004, -3913789, 279710, -4952098, +1453846, -3121368, 1726040, 5825050, 2134599, -5913633, -166430, 329639, 8756365, 1609539, +4379256, -1291711, 1938104, 1506460, -10604811, 141734, 5015985, 2297271, 5611375, -5001490, +-3059091, -4980015, 1341640, 3149285, -1014149, 1054951, 273804, -2512019, 943819, -1893007, +1688996, 1568737, -361851, 2569464, 536334, -409633, 1149441, 6279242, 1162326, 3266323, +4109747, 2245731, 103616, -120796, -5907191, -35433, 6307697, 2203318, 2801929, -142808, +-427886, 3939559, -2952790, 306016, -262530, 1991791, 1080184, -2684, -2559801, 404801, +-1287953, -401579, 448287, -845572, -594316, 603443, -62277, 2021856, 870805, 1846836, +911070, 551903, 1027034, -771484, -999654, 103616, 134755, 2313377, 1446867, 328565, +826244, 2198487, -352724, 206158, 709743, 22122840, -5714991, -2069101, -3358665, 4523138, +3019362, 7525857, 2987150, -1115081, 3606699, -164283, 4034585, 1556389, 5608154, 111132, +4706748, 6117644, -6795712, 1210107, 1756105, 1124208, 1069984, 1508070, -4039954, -20938, +-4651987, -683974, -168041, -7893613, -5355288, 1961190, -33286, -289910, 3139084, 3062849, +-1602560, -6809134, 2039573, 6111202, 4036733, 5698348, -1536525, 3072512, 5672578, -9459665, +2998961, 4136591, -4662724, 5825050, -4064650, -872952, 581968, 1132798, -3138547, 2745021, +-823560, -1084479, -3265249, -2691334, 3279745, 3269007, 1488743, 3218004, 5042829, 2740189, +7008850, -1494649, -7875897, 7607461, 1252520, 3722663, 1592359, -1321239, 1999307, 1432909, +340376, 5213554, -1592359, 5143760, -7402376, -1726040, 969589, 2276870, 513785, -4074850, +-1859721, 651224, 243739, -451508, 260919, 1542430, -1976759, -1158031, -1110249, -1471563, +860604, -462783, -535797, -1204738, -843424, 2223183, -523449, -770947, -14496, -819802, +-637266, 1113470, -436476, 1190780, -241055, 68719, 969052, -304406, 9791452, -11266236, +7469485, 1568200, 7649337, 1762547, -4330938, 1403917, 5890548, -7066295, -1506460, 795643, +-7967165, -1584843, -6126771, -3753802, -4467840, -4897874, 2060511, -7608535, -4731980, -6064494, +-1557999, 5834713, 2094333, -7293392, -2851322, -7627325, -1898376, 1650878, 10919417, -8818105, +3595425, -2252174, -3245922, -6574521, 289373, 1109175, 6992207, 3674882, 863288, -5961952, +-10353556, -161598, 3008625, 8106751, 2808372, 2594160, -6023692, 2179159, 5063230, 384936, +767725, -3220152, -3208341, -1082332, 2935610, 522912, -2087891, 55835, -6624987, -950262, +-5587753, 3500935, -1194538, 3500398, -5475547, -4617627, -7529078, -874026, -4852776, -2080912, +1893007, -7284802, -3171833, 837519, 3984119, -8749922, 5075578, -4118874, -4446902, -4650913, +-3913789, 2626909, -2639794, 1216550, 1480153, -2321967, 303332, 1819456, 1383516, 92879, +-2107218, -311922, -1029182, -2348273, -444529, 1735704, 999654, -1162326, 1557999, -1361505, +-1065152, -258772, 510564, -1749125, 90731, -213675, 1155883, 932008, 1927367, -1577864, +433792, -357019, -703838, 610422, -1848983, -638340, 894427, 497142, -27346056, 4402879, +3117073, -7897908, -1760937, -38655, 270583, -1517197, -2626373, -2026688, -8128763, 6248104, +-3939022, 856309, -6770479, -2413772, 9789304, 8864276, -5629092, -3405909, 281320, -166967, +-4620311, -5397164, -3820374, 629213, 418222, 150861, -556735, 2270964, -6672769, 2070174, +228170, -11784853, -1414118, -3537443, 5381594, 7847442, 1228361, -1400696, 376347, -6915434, +-8638790, 4614406, 8547522, 9498857, -2566243, 1716913, 5553393, 5709622, -2966212, 5265630, +8614094, -381178, 7252053, 6124624, -7221988, 2344515, 420907, 7748658, -4760971, -5100274, +4481799, 5867462, -1807644, 504122, -8508867, 5969468, -4757750, 6302328, -10582263, 1125818, +2524367, 5028870, 352724, -4457103, -9024800, -5564667, 7605314, -7530689, -344134, 825171, +4108136, -2296197, -1593970, 3171833, -6027450, -5284958, 2167885, 1412507, -428423, 4292820, +-1990717, 999117, 1127966, 1129576, 1648194, 325881, -1668595, 1022202, 2243584, -952409, +325881, -478889, -1105954, 880468, -2777233, -424128, -2995203, -606127, -550293, -1013612, +-1526861, 596464, -873489, -71404, -2321967, 907312, -403190, 784905, 976031, 327491, +417686, -10597832, 3753802, -9365713, 11846594, 11392938, 347355, -15438260, 6389838, 873489, +-2881386, 10650445, 43487, -9199820, -980326, 11578695, -14528264, 457951, -3636227, -11465952, +-3190624, 207769, -2259153, -5872831, 3379066, -4865124, 3952981, -4144107, -7769596, 4140349, +-583042, 5949067, -11567958, 4719632, 9099425, -3659849, 746251, 9149891, 13378286, -3558917, +-2734821, -11275900, 657130, -9302362, -761820, -6475737, 319438, 907312, 5403606, 2590939, +4938139, -3565360, 906238, 3062312, -588947, 12349642, -8199630, -4048544, 16245714, 16319802, +-3223373, -1029182, -10244034, -5235029, 519154, -2841658, -6780680, 9858024, 3037079, -2567317, +14462229, 2804077, -6942278, -191126, -13284334, -6661495, -7531762, -6453725, -1766305, -10369662, +-7486665, 4274030, 3949223, -761820, 2329483, -3076807, 3471407, -2310693, -3395172, 587337, +-4887136, -2232309, 6273337, 502511, 3125663, -1676648, 641024, 481573, 1471026, 1360968, +-275415, -124554, -3106872, -35433, 661962, 502511, -876173, -880468, 2095944, 624918, +-449898, 74625, -535797, 70867, 1161252, 13157632, -3456375, -113280, 9073655, -2124398, +5379984, -2894271, -11429445, -707059, 54224, -2320356, -6754373, -7546258, 3991098, -5970542, +10660646, -3228205, -7659538, 6606197, 13370233, -3276523, 3780108, -3548717, 7744363, 204011, +-16151761, 5802501, 9042517, 931471, -2651606, -9385040, 7944079, 5319317, 5132486, 1069984, +3252901, 10604811, -7415798, 1353452, 2115272, -5848135, -11340324, 10880763, 6080063, 20221242, +-983011, 8939438, -2921652, -6309844, 1123134, -958851, -242129, -1772748, -6533182, 14529874, +379568, 1165547, 2095944, -1989107, 11970611, 1548873, 10029286, 4203699, 1722282, 10711112, +-4996121, -11934104, -2323577, 2246805, 1586990, -4915590, 5887864, -3508988, -16710644, 1551020, +3364570, -9216463, 4347581, -924492, 1843078, 58519, -3768297, -4168266, 15569, 1622424, +5144297, -424665, 1465658, -1935957, -1433982, 2347737, 1546725, -252866, 1592896, -1666984, +-165356, 155693, -2267206, -3268470, 2090039, -3642669, -926639, -1567126, -3192771, -855235, +-404264, -1155346, 1426466, -509491, -1331440, -360777, 6180458, 2455648, 2371359, -1202591, +901943, -1886028, -2483028, -780610, -843424, 1112397, -1637456, 3022046, -3843459, -1174674, +845572, 10630581, -17624936, 2893734, 7894687, 11751567, -12343736, -1778653, 8368744, 5832566, +7141994, 1261647, 15074798, 2794950, 6250788, -1874216, 892279, 6220187, 3411278, 7180649, +569620, -9969156, -14545444, 7714298, 3733937, -2769180, 1711008, 4338454, -13609141, 127238, +-8587787, 4017942, -467078, 8920110, -2858838, 3984119, -2059974, 2310156, 1221381, -379568, +5023501, 6703907, 2403571, 3881577, -10661719, 4411469, -1877438, -18596134, -12352326, 3164854, +-13576928, -937377, 11224897, -8191577, 22296248, 8056285, -4488241, 12095702, 569620, -3965866, +-8995272, -8916352, -12377559, -1928977, 7239168, -8862128, -1097901, 8028368, 3670587, 4531728, +16338592, 2011655, 10683194, 75699, 2099165, -17541184, 4859756, 1314260, -15958488, -15116137, +8721468, -5769752, 1017370, 4583267, -2600603, -4115653, 925029, -920197, -1090385, 915902, +-2852932, 2561948, -2050847, 566399, -5036923, 2731599, 849330, 1108102, -270046, 6214818, +-5036923, 429497, -1409286, -1259499, 1260036, 1268089, 1741609, 2989297, 4999342, 3083250, +-3208878, 775778, -402116, 4547297, -1495186, 2932926, -4657892, -3545496, -2682744, -2262911, +-305480, -256087, 2318746, 2703682, -9143449, -222801, 5831492, -25770, 4108136, -9366787, +7373385, -522375, 2181307, 6878390, -12665859, -8686571, 2358474, -115427, 7026030, 14450417, +-1288490, 3647501, 15506443, -5683853, -10430328, -543850, 11372537, -2395518, -12998182, 1105954, +4863514, -2505040, -4035122, -900333, 16811038, -3133716, 14477261, 10960220, 13212930, 784905, +1122060, 7750806, 2629057, -2611877, 2760053, -10365367, 7905961, 13245142, 8323110, 1191317, +7405598, -5725729, 5697811, -5568962, 8310762, -7394323, 188442, -536334, -535797, 23513872, +-3466576, -1253594, -1999844, 3317325, 6510097, 12408161, 14143327, -7648800, 3420405, 14093935, +-7830799, -9716290, 5919002, -4198331, 6100464, 26851062, -12622909, 1870458, 2543695, -6920266, +3056943, 8804146, 6167036, 784368, -5455146, -13141526, 6286759, -5699422, 7266548, -4903779, +1047435, -6478422, -1404454, -10874320, 962073, -3414499, -3838090, -1305133, 1352378, 2815351, +5446019, 2348273, -3084860, -724239, 5549098, -3209414, -2843268, 442382, 411243, -4925791, +-46171, -2460480, -1217623, -888521, -877247, 1960116, 1210644, 3963718, -2491081, -2464774, +313533, -2962454, 1421097, 6195491, -3068217, -3240553, -6109054, 3176128, -1539209, -1550483, +-9080098, -14316737, -11020886, -14898168, -5738077, 1674500, 11930882, 8838506, 3202972, 12563853, +3779034, 7675107, 7065758, -3406446, 10897406, 11810086, 8341900, -15939161, -8931921, -9230958, +3479461, -6365679, 445066, 4540854, -4629975, -11246909, 7279970, -5331665, 2586107, 2421825, +11479911, -11964168, 18611168, -18376018, 19012746, -38655, 9540733, -9219684, 3360275, -20540682, +-11437498, -9992241, 9061307, 4175782, 13135621, -1301375, -42413, -6660421, -16465831, 10758893, +-8989367, -4669703, 7841537, 18687940, 18083960, 8484171, -1198296, -12226161, 7204271, -18779208, +-1452773, -10660646, 6062883, 20278688, -19444390, 7102802, 9044127, -12089796, -1185948, -2056753, +6798933, -8012799, -11536282, 2307471, -4656819, -16959752, 8630200, -1669669, -15921981, 11844446, +15672873, -5154498, 545461, 2219961, -6719477, 10176925, 4733591, -2869575, -2507724, -6665253, +-3788698, 8165807, 4696547, 4663261, -328028, -7344394, -2188286, -2487323, -8140037, -1730872, +2485176, -482110, -2361158, -733366, -5791227, 773094, -1946157, 3974455, 2241436, 836982, +-6711960, 5582384, 557809, -2907156, -1663763, -1098975, -293668, 3316252, -2443300, -1025960, +2580202, 6863895, 3493419, 2035815, -4095251, 5478768, -13685913, -15979963, -4518306, 10286984, +-12236899, 8079907, -16807280, -3009698, -6467147, -5929203, -13325136, -1198833, -4975183, -8014409, +6407018, -8928700, 9601399, 2019708, 7500087, -11795591, -22046068, -1841467, 4548907, -9241159, +-6757594, 3596498, 2878702, -10807211, -5120675, 15351287, 7462506, -2033667, 8409009, 22050362, +790274, 2787971, 2267206, -1685238, -354872, 3242164, 2962454, -16962436, -6155762, -20724828, +-6539088, -19328964, -9098351, 1041530, 22581864, 10524817, -11161546, -13130252, 8425652, 17815524, +11280732, -7988103, 13675176, -5215164, -1020592, -23945516, -7108708, -3097208, -2944200, -16382079, +-26220238, 8395587, -53687, -19202798, 4896263, 30008400, 3921842, 3384971, -18957448, -1721208, +-268972, 4187056, -21287468, 19648402, 3112241, 5418101, 10878078, 4186519, 11799886, -916976, +5542656, -4643397, -9215389, -7693360, 4060355, -6201933, -1955821, -8281771, 2776696, 6736120, +129923, 5670968, 639413, -2302639, -99321, -4769025, 3301219, 3388729, 609349, 603980, +-3236258, -1342177, 1807644, 4924180, 3591667, -4370666, -1546188, -1815697, -9956271, -13830332, +-10165651, -3353833, -1278290, 1581622, -2376191, -3935264, -4238059, -30065, -2841121, -3706020, +-6187438, -3384971, 9970230, -6197638, 12112345, -18402324, -3794604, 4327717, -8880919, 21087216, +-17499308, -18014166, -14659260, 20390894, 9080098, -11905649, -10740103, -7184944, -2285996, -6481106, +-6667400, 947040, 7574712, 20140712, -2297271, 8545374, 7434589, 7220377, -13550085, -16900160, +-12159589, 14057428, -2511482, 17093970, 5635534, -1969243, -23534274, -19209778, -2042257, 1483911, +-13674639, -8591545, -6455873, -6611029, -30848066, -6769942, -7578470, -11176579, -5491653, -7339562, +-14186814, 9852655, 19157702, 10596221, 479963, 11261941, 14377940, -5225365, 4526896, 3586835, +1382980, -682900, -3715684, 10036265, 4038880, 16887274, -3982509, 1591285, 6017249, 33337536, +-427349, 17681306, 22445500, -2045478, -19624780, 1602560, 19494856, 2782065, -16712791, -15042586, +-19152332, 12392591, -15647640, -4326643, 22369264, -9716290, -15014132, 4544613, -4123169, 345745, +6105296, -9488656, -4226785, 1774895, -2814814, -4355634, -852014, 1623498, 11181410, -1142998, +-5807333, -5094905, -48318, -4399121, -3528853, -3234647, -5634460, -2772402, 2127083, -2789045, +-533650, -7765301, 1975148, -831076, 1552631, 7560753, 4800700, -4624069, 2097018, 1562294, +-6753836, -10406169, 3855807, 4013110, 594853, -10635950, -11374684, -1906966, -7945153, -2702608, +-1161789, 18866180, 13743358, -31657668, 10040023, 12627741, -5550709, 9171366, 30079804, 2473364, +6694781, -10508174, 6971269, -11105175, -7096897, -5916855, 2208687, 7740605, 10821170, -1551557, +4460324, -3273839, -1843615, -5806796, 7963943, 28395102, -9274982, -9153112, 10180146, 7181186, +1025423, -20649130, 13384729, -16462073, 9444633, 11853036, 1315871, 3013457, -3411815, 19537270, +14782741, 177704, 9942849, -7810935, 12538083, 2107218, 14158897, 20694226, -465467, 5255966, +-2705293, -7616051, -533650, 9026948, 10160282, -19750944, -12014097, 4643934, 21459804, -10391137, +14241038, 9557913, 2760053, -23012972, 2787971, 3599183, -27473296, 16202227, -15381888, -18263812, +-34772056, 8478265, 21081846, -9536438, -19407884, 4038880, 23365696, 14928769, 2593087, -3032247, +318901, 8262980, -7160784, 11020349, 17943836, 17127256, -1275068, 7269232, 17752710, -2780991, +-247497, -1952063, 15284178, -2243584, 3750580, -7145752, 3877819, -4394826, 582505, 220117, +-1209570, -3460133, 3340411, 9014599, 3028489, 2565169, -8148090, 2074469, -8412230, 2554432, +13226889, -4817343, 195958, 1746978, -6289443, -8185671, -9432285, -2138357, 5970005, -2768643, +1595044, -5701032, -590558, 217970, -17452600, -4476967, -748935, 3670050, 4442070, -3623879, +6182069, 3277597, 3299072, -5174362, -5073967, 7744363, 21812528, 15812459, -5468030, -42627552, +5005248, 21329344, 10177999, 4632659, -18700288, -118112, -12913356, 2996277, -1252520, 3528853, +6410239, 8930848, 3804804, -23178864, 13412646, -3231963, 4054986, 17591112, 6767258, 3282966, +-6313065, 21821118, -784905, 21688512, -26375932, -7762080, 8392366, -15374372, -13292387, 917512, +-3488587, -12037720, 1386201, 19160386, -663036, 1258425, -10104447, -20975010, -13389561, -6004901, +8653822, -2325188, 1988033, -10326712, -11247446, -5518496, 16634408, -11489574, 9562745, 6432251, +5363341, 1836099, -17293148, -24619826, -2046552, 16436840, -20478940, 9844602, -17639968, 10992432, +-18555332, -961536, -18296024, 25848186, -23666880, -14134201, 6053220, 4223027, 11803644, 9840844, +-6173479, -3288334, -6212134, 3186329, -311385, 15397458, -19212462, -7615514, -24672440, 12697534, +-8806294, 933619, -1088237, 6689412, -5508833, 2487860, -10133438, -15351287, 9785009, -7950522, +188442, 2496987, 13016972, 5188858, -9455371, 1972464, -3242700, -12131672, -2299418, 2797634, +3751117, -10974178, -5399848, 12028593, -1290638, -10206990, -4520990, 14121316, -16687559, -5689758, +3335579, -3911642, 5865852, -1295470, -7369627, -9892920, -3211562, -4460861, -3119757, -3287798, +2638184, -819802, 6113349, -6569153, 3364570, 1135482, -3017752, 6594923, -36378372, -5168457, +10863046, 2648384, -8687645, -12991202, 1175747, -12349642, -1176821, -19063212, 17809082, -7144141, +11134703, -24783036, -14085882, -524523, 30325154, -24861956, -2195802, -19463718, -15515569, -4742718, +18979998, -4438312, 8398272, 8885214, -10147934, -21589726, 30345554, 13215614, -17446158, 3352222, +2178622, 8368207, -16980690, 15156403, -1403381, -31805306, 3299609, 6344204, 8134668, -26355530, +-6371584, 3303367, 23134842, 4398584, 12859132, -33993592, -20724290, 10407780, -69793, 22159884, +-6013491, -3758097, 1626182, 11258720, 10252624, 3929358, -43276092, 12160126, -5105106, 9876814, +22950694, -7293928, -2125472, -26323854, 8461086, 11891154, -13917305, -8225936, 23748484, 37620156, +9760850, 6126771, -10739029, -4422206, -20636780, 1563905, 166430, -25378962, 9164386, -767189, +-7518877, -1938641, 11849815, -9721122, -6642704, -1133871, -2812667, -915365, 10448582, -4548907, +114354, 6073621, 2319819, 8355859, 6935836, 5354214, 3671660, 10004589, 11602854, -15658377, +4875862, -9771587, 7643968, 1169305, -10022843, -6715718, -3968550, -3273839, -6615324, 6027450, +-3429532, -6415608, 10661719, -1688459, -3534758, 6160594, 10980084, -19327, -4109747, 3085934, +10233296, 11273215, 6952479, -3655017, 1762547, 2119030, 9188546, -31213674, -20424180, -7045357, +-343061, -17786534, 14090177, -36881420, 1772211, -22646826, 11720966, -8405251, -25178172, -2239826, +-6802155, -8875550, -28677496, -20924006, 5958194, 22577032, -15197205, 27873264, -23796266, -15640660, +5060545, -2340220, 12625056, -7919920, -8329552, -11551315, -3266323, -39170100, -11313481, 1110786, +-1750736, -6548752, -15462956, 12270185, -13690745, 20885890, -6535867, -2630668, -14884746, -13676250, +-25993678, -11311333, 9515500, 3926137, -1625108, 1689533, -9387188, -7055558, -12085501, -10101763, +5221070, 7688529, 3551401, -22537840, 25694104, 3474092, -11264089, 20601348, 14654428, 24556476, +-4766877, 14318884, -33779916, -18231600, -31927176, 32350768, -10566693, -22610856, -21855478, -46147276, +-19426674, 31893890, -2236604, -16213502, 11531987, -31499290, -21196738, 7876433, -2007897, -26288958, +-25813290, -333397, -14909442, 3916473, 5316096, -19558744, 18866180, -11652246, -17250736, 1460289, +-10305237, 27181238, -10671920, 12202539, 1760400, 16516297, -8613020, -4859219, 1396938, -7561827, +-476205, -15881715, -12210055, -3082713, 6405944, 295816, 10790568, 4414690, 7949985, -7145215, +-255551, -13823889, -3599720, -5000953, 3911105, 13151727, 5859946, 5265093, 6057515, 5430450, +1235340, -18007724, -5565204, -12440910, -3319473, 2055142, 8244190, 40263708, 51555176, -4908074, +-22920092, -5462125, -8672613, -23157390, 9953587, 634581, -16785270, 49277232, 17088064, -11684459, +-34186328, -3070365, 8228084, 8983998, 9998684, 23568634, -6796249, -11664594, 11061688, -42776800, +-28592672, -11180337, -3081639, 4580046, -22851374, -20871394, 21984326, 17484274, -13466333, -25897042, +16415365, 471910, 28968480, -23604604, -5431523, -8058970, -1481764, -18664318, -27800250, 23328652, +-17243756, -10902774, -21247740, -4769561, 14017700, 13160854, -8571144, 1834488, 2461553, 17592186, +26968100, 19840602, -34570192, -16634408, -20509542, -5158793, 11793443, 4286914, -23629300, -34002184, +28805272, 1795296, -28222230, -46882252, 23632520, -6136435, 12721156, 11707007, 12440373, 1614371, +9188546, -18459232, -6962142, 12591233, 2321430, -8672613, 5252208, -2250563, -24813636, 12470974, +-31507880, -2124398, -1506460, -5559299, -11286100, -4476967, 13920526, -1023276, -3118683, 7038378, +-10139344, 30637076, -2360622, 2660195, -2210835, 207232, 7734163, -578210, 7458748, -15783468, +3479461, -2984466, -10853382, 1006633, 5325223, 10115185, -5067525, 2736968, -26071526, -8690329, +-1334124, -13841069, 11768747, -1708860, -3048890, -7514582, -10666551, -16053514, -22197464, 6603512, +-2113661, 16189342, 19531900, 12187507, -13080860, -18549964, -23172960, -8922258, 21556440, 17293686, +3147137, 7977902, -7337415, -13643500, -10080825, -9829033, 4538707, 18041546, 22355842, -27849642, +-23379118, 66219268, -5401458, -6535330, -10005126, -20970714, -2343442, 23861764, 38356744, -17742510, +-10756746, -3944391, -17552458, -4395362, -9929964, 15231028, -15874199, 17442400, 8257612, -6038724, +-22116398, -1651415, -9160628, 33042258, -18257906, -475668, -34360, -3325915, 14870787, -9557376, +-1344862, 6853694, -4627291, -32322314, 16375637, -14758044, -17167522, -3948149, -18306224, -10590852, +-33176474, 31623844, 1345935, -21095268, -38860328, 22546430, -22970022, -22334366, 188442, -17398912, +7727183, 14295799, 43957380, -12547210, 17139066, -3726421, -21434034, -18124762, -5413807, 66292820, +-58612344, -4294431, 60764660, -55730960, -21268678, 31367756, -4765266, -25191594, 58751932, -29165512, +-12250320, 27020714, 6563784, 11523397, -17599702, 19508278, 27315456, 12854300, -7172059, -1822677, +27582280, -4057134, 15712064, -391916, 10915659, -15895137, -2232846, 7300908, 4295504, 3047816, +564788, 1117765, 11364483, -5310190, 2800856, 4268661, 3719442, -24931748, -10451266, 7978439, +-21306260, 6350109, 11849815, -8927626, -9616432, -7269769, 4838281, -10219875, 11865384, 10245644, +-1557999, 5937793, -7735773, -15018427, -14874009, 29116120, 5005248, 18166102, 3488587, 3597035, +11260331, -9917616, -2607045, 18474802, -11244761, -25173878, 18605262, -2523293, 31513248, -39693552, +36044976, -5900212, -22044456, 19480362, 6985228, -3360812, 4257387, 2834679, -4086662, 7241852, +-7487739, -9768366, -4326643, -13615583, -11306501, -25762824, -9727027, 22567906, 21289616, -32083942, +11024644, 17365090, 14585709, -5334887, -31675920, -2668249, -15569793, -37125160, 23773180, 60029148, +-34112240, -3503083, 42722040, -11854647, -14936286, 34733936, 25851408, 12862353, -13703630, -27597850, +9503689, -11115912, -17353816, 62770412, 46261092, -37522444, -27560806, 34001644, -61391724, -21465710, +-17221746, -10416906, 43313672, 28862180, 19074486, 20905216, -72164040, -25045564, 69226280, 40189084, +8418673, -18195092, 24009940, -24074902, -48948668, -32573568, 24240258, -17727478, -3613678, 28079960, +51845088, -5995775, -28815472, 3952981, 20653960, -34957276, -12774843, 36864240, 33224794, 33254858, +23200876, -6360847, -20667382, -10165114, 28285580, 8320963, 12061879, -5159867, 3435974, 12984760, +1414118, -4852776, -5669894, -7778186, 6535330, 4747013, 27165132, 7765838, -5003100, -10473278, +2966212, 1576790, -3627100, -9164923, 2994129, 21023328, -21756156, -6376953, 20318416, -4325569, +-173946, 13515725, -4728222, 10064719, 4509179, 11780558, -21967148, -2954938, 5071283, 25691420, +6538551, 12456479, 11014981, 6131603, -4483946, 8659728, 12453795, -13324599, 7133404, -61268784, +26558468, 331786, -6247567, 31439160, -5307506, -23684598, 11960410, 10896869, 30750892, 17430052, +-16571058, 918586, 4789426, 21067888, 4922033, -24199456, -889058, -1364189, 4986994, -22511534, +-24526410, 35629440, -12783433, -37220188, 19207094, 33071248, -18544596, -6313065, 2224793, 22673670, +-26982596, -35496832, 9802726, 29997662, -6442451, -12776454, -7353521, -7303592, 13107703, 5564667, +7857106, 75590352, 4239133, -9657771, 1095754, 2375117, 40890236, 1291711, -14443975, 9196062, +-31845036, -18746458, 8345659, 158377, 35156456, 27849642, -17955648, -5283347, -16969952, 803696, +12655658, 3185792, 3980361, 12577812, -8958765, -37168648, 9540196, 25074020, -11777337, 22126060, +-34324304, 16188269, 10459856, -30169460, 5247913, 587874, -13069585, 1369558, -5540508, 14986215, +14719390, -25281788, -15495168, 33709588, -25648470, 12390981, -2319819, -9901510, 7491497, -1014149, +-15051176, 8614631, 5321465, 6164352, -378494, -2580739, 1774358, 4665945, -5672578, -5484137, +4685273, 3281355, -3089155, -281857, 7565048, 12550431, -7326678, -5079873, 1714229, -2248952, +4508642, -3113851, -1571958, 2907156, -32212, 7543573, -2264522, 3724811, -9645423, 5940477, +-6689949, 6280853, 11167989, -974421, 338229, 1542967, -12567074, 21321292, -39366596, -129994704, +-153868272, -13640816, -106646720, 42198052, 260760880, 140367040, 211834224, 223225552, -24021752, -64063196, +19283330, -162230576, -198335680, -61143692, -218355600, -175270096, 44725640, -126021856, -34170224, 251806416, +91316376, 178082768, 307539520, 183100896, 82037096, 62457952, 22011708, -136706128, -170201504, -56047176, +-232546704, -232748032, 30930206, -174011136, -142734656, 86126976, -146353152, -150543440, 114015272, 46413028, +-20571820, 268790336, 251757568, 160793376, 341240512, 321543808, 110016128, 128091496, 99921880, -161630896, +-161975568, -204945632, -405914144, -479237824, -344579328, -343098624, -252981632, 8850317, 23626616, 167358240, +289322944, 356492480, 324891712, 376936000, 323047040, 190562336, 128242888, 42798812, -63411972, -142835040, +-203224432, -174645712, -253262944, -283750784, -235234288, -275115200, -206328624, 32909114, 66457640, 160562528, +321951296, 256349952, 197674256, 149405808, 59020368, -48597020, -39573292, -80473192, -100683696, -76896024, +-87436408, -84533544, -35874252, -34111704, 2164664, 52511344, 37479496, 73653856, 88517128, 15577310, +64287072, 61702572, -16800302, 20645370, 14656039, -46595564, 2299955, 15355045, -53863184, -58930708, +-82276544, -169632960, -189603472, -147516016, -140883520, -46046344, 69653632, 125216016, 203660912, 307008032, +331532288, 307394016, 215565488, 65954056, -69013144, -148154896, -221248256, -273264064, -268667392, -209836000, +-143895904, -68214816, -20581484, 9103720, 25472914, 63021664, 103716480, 106873280, 99418832, 101996344, +72934984, 65732328, 57207892, 23780160, 6444599, 15372225, 13837848, 9188546, 6893960, -11006391, +-32198296, -46876348, -53939956, -44794360, -26738856, -17313550, -15388868, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -8929774, --10633265, 5459977, 321586, 8239895, 2979634, 3637301, 2328409, 3346317, -105764, -109522, --1868311, -5405217, -3132642, 1436667, -283468, -997506, -657130, 2874407, 2221035, 32212, -2575370, -2423435, -6164352, 1959042, -1449552, 689879, -3154117, 2460480, -2587181, -1283122, --1036698, 4407710, -1062468, -48855, -1864016, -506269, -5000953, 1677185, -868657, 2688113, --2393371, 317828, -1146219, -3995393, 1238024, -398358, -1110786, 1777580, 3253438, -681289, --2045478, -5842766, 499827, -3474092, 1578937, 56908, -2284386, -91805, -1000727, -817118, --4249334, 2725694, -3772055, 2064269, -1506460, -2495376, -2160369, -4489315, 2437394, 229244, -1195612, 2700461, -2916283, -4603668, 2913062, -4411469, 105764, -2939905, 901406, -2275796, -1966021, -1151051, 1020592, -1963337, 317828, -911070, 1141388, -941135, -1074279, -1002875, --987843, -1761474, 216359, 433255, -346819, -1387811, 920734, -1047972, 106837, -700617, --1241246, -442919, -470299, -193810, -306016, -176094, -1032940, -536334, 109522, -594316, --359167, -318364, -15739981, -189515, -2106145, 4116189, 59593, 1572495, -1318018, 2038499, -382789, 1780801, -1835562, 10130754, -2223719, -1445793, -4373351, 1442572, -5276904, -1706176, -379568, -2574296, -49392, 3707094, 2119566, 1398549, 2495376, 3600793, -4415764, -1697049, --97174, 2283312, -4166118, 4035659, -3488050, -1769527, 3235184, -630286, 740345, -2596308, -2988760, 3122441, 3357591, -5184563, -1584843, 5572183, -80531, -856309, -1257889, 6076305, -3966402, 4697621, 81068, -1116155, -1411971, -348966, -129386, 677531, 1820529, -5902359, --532576, -2756832, -3479997, -470299, 1003412, -3069828, 817654, -2349884, -853625, -959388, --68719, 2022930, 1891396, -1082332, -693100, -1350767, -4772783, -1148367, -2956011, 61740, --3900367, 1041530, 72478, 3930432, -1352915, 522912, -3412889, 278099, 493921, -1617592, --1628330, 1655710, 70867, 423591, -142271, 1153736, -289910, 465467, -178241, -296890, -1450625, 629750, 621697, 193810, -132607, 5335960, 6320581, -4410395, 558346, -3763465, -5790153, 1056025, -2406256, -3407520, -3016141, -638876, 725850, 1527935, 7705708, -4598836, --740345, -1832877, 3012920, -8627516, -1020055, 5484137, -163746, 4606353, 2029909, 3692598, -3841848, 1665374, -766652, -4057134, 1322313, -1143535, 500364, 6415071, 1606855, 5502390, --2910914, -1518808, 406948, -7429220, 854699, 5531381, -1643362, 505732, -4651450, 3490735, --92342, 1544041, -5502390, 3218541, -3700651, -2066953, -3864934, -4534949, 2592550, 874026, --1480153, -2326799, -2204929, -1621887, -1109175, 2550137, -2551748, -4606353, -7093676, 6540162, -5013838, 261456, -7096360, 2142115, -3409667, 2780455, -2308008, 498216, -4352413, -2742337, --5665599, -2565169, -802085, 5513128, 3278671, -6169721, 2662343, 129923, -544924, 2688650, --374199, 2134062, 4376572, 223875, 916439, 2902324, 593779, 576063, 2867965, -510027, --82678, 216359, 368830, 607201, 709207, -644245, 828929, -603443, 207232, 141197, -733366, 168577, 1815697, 1588064, 111132, -88584, 1782411, 910533, -1343251, 255014, -642098, 26761942, -9898826, 12004970, -9486509, 844498, 2871723, 2838437, -7826504, -2640868, --2609193, -13126494, -42413, 721555, -4711043, -741419, -27917, 9429064, 1767916, -6534793, -4819490, 5253819, 1196685, 9557913, -7059853, -2570538, -3759170, 2036888, 7666517, -530428, -511101, 2864743, -1336272, 3435974, 1570884, 8748312, -1287417, 3442953, -5686537, 5238250, --3972308, 5845451, -74625, -6067178, -884763, 8818105, -359167, 5973226, 3602941, 5745593, -540092, -4508642, -3655017, 115964, -2708514, 4720169, 3147137, -4629975, 672699, -3613141, -6234682, -1666984, 5008469, 5963025, 1072668, 6146098, -250182, -2949569, -977105, -3764539, -206158, 8069707, -5014375, -5148055, -1920924, 2305324, -3503083, -2171106, 1593970, 3886946, --1570884, 1440425, -7770670, 1941862, 542777, -538482, 2770254, 193274, 772557, 1876901, --200790, -991064, 878321, -1779190, 601295, -730144, 263604, 359704, -239444, -607738, --1522566, -105227, -1204738, -757525, -485868, -2671470, -22262426, 2440615, -6553583, -4685810, --7187628, -8713952, 3440806, 7796977, -1172526, 3033321, 1236951, 4005057, 909996, 295279, -2418604, -4770098, 11064373, -573915, -6438156, 7261716, -2217814, 3083250, -7257421, -4516158, --5142150, 2228014, 1352915, 5681705, 173409, -3529926, 594853, -3151969, -3464428, -3844533, --1335735, -5352603, -2712272, 4985920, -4642860, -330176, -3632469, -5681705, -2531346, 708670, -1818919, 3601867, -2860985, -2626373, 3562139, 617938, 1340030, 941135, 2204392, 3337727, --5437966, -1826972, -554051, -7627325, 2017024, -544924, 4459250, -4476967, -3415573, -4185983, -716186, 4714801, 3653944, 8324721, 5590974, -5166846, 2089502, -2349884, 3941169, 2454037, --5576478, 4000762, 1076426, -6200322, 792958, -1145146, 526134, -1179505, -4228396, 753230, --3034931, -3207804, 1163936, -1775432, 729071, 2244121, -1523640, -2049773, -2110440, -3174518, --590558, 2403034, -648003, 2499671, 16643, 1678795, 1155883, 859530, -1131724, -472446, -429497, -1129576, -1231045, 256624, -1188095, -489626, 318901, -2247879, 1240172, -1168231, --387621, 219043, -79994, 140123, 714038, -1024350, 635118, 1447404, -28349468, 7783555, --8455180, -7044820, -5066988, 955630, -1474248, 16699370, 1645509, 3995393, -1860258, 63888, --6859063, 6812355, 1991254, -993748, 1370632, 8893267, -4453344, -1541356, 2055679, 613107, -4467840, -3890704, -1745904, 4902705, 1804423, 4515621, 543313, -4804995, -3140158, 2697776, --464930, -1638530, -2994129, -1739999, -195421, 8419210, 2131378, -1537061, 179315, 609885, --2555506, 6059662, 4651987, -1462973, -6378564, 1580548, -3376381, 5761699, 4491462, -4523138, -1759863, -5852430, -5195837, -4593468, -5733782, -2007360, 1267552, -3476776, 286689, -3838627, --3227131, 6626061, 4234838, -5672578, -7614977, 821413, 6488085, -5043366, -3714073, 5443334, -4313758, 6212670, -4031364, -218506, 1767379, 2535105, 7026030, 1853815, -919660, -317291, --5120138, -818728, -93416, -4445291, 320512, -1347546, -2006287, 31675, -594853, 2110977, --521302, -903554, 1028108, -717796, -1831804, -1265405, 383326, 1686848, -839666, -720481, -51540, -501437, 3289945, 523986, 4265977, -3092377, 768262, 145492, -1782948, -119722, --151398, -2366527, 576063, -520228, -2535105, -2434173, -1233193, -2333778, -1722282, 503585, --1126892, -14919643, -1469953, 2524367, 7270306, -1403381, -3795677, 1713692, 10678362, -13425531, -3123515, -2714956, -2487323, -6036040, 3642669, -10755135, -7004018, 3716221, -5624260, 3420405, -15347529, -2699387, 6205691, -7199439, 7413114, -1909113, 2213519, -6454799, 3024731, 1854889, --3465502, 1542967, -697395, -3310346, -220117, 4233227, 6606734, -5152350, -8247948, -6516539, --6054294, 805306, 4843650, 12851616, -146566, 8662412, 9023726, -8373039, 6455336, -12324946, --4515621, 805843, -5493263, -5094905, 3424163, -11933567, -2364380, 8345659, -3591130, -3103651, -1096827, -3627637, 3399467, -3598646, 5833103, 7565048, -2091112, 2369748, 310848, -7605850, -653909, -4912906, -3409130, -6002754, 3427384, 2652679, -5796595, 498753, 4313758, 4041564, -5111011, 5300527, -809601, -4982699, 4151623, 2203855, 2485176, 1387811, 3001645, -310848, --101469, 470836, 1233193, 1486596, -2055679, -600759, -1658931, -1069984, 2408940, 2102923, -2325725, -4195110, 862215, -496606, -1744831, -2010045, 2178622, -1314797, -2311766, 618475, -545461, -727997, 5141076, 1740536, -1010391, -1104344, -2390149, -627065, 2101313, 3236795, -804233, 42950, 3222299, 35440460, -1652489, -13935021, -1694902, -555125, 1399086, 4517232, -1876901, -1561758, -1393717, -6986301, -3278134, 4010963, 8704825, -7023346, -4396436, 5834176, -529892, -2014877, 2374043, -500901, -8139500, -8287140, 11429445, -994285, -659814, -1833414, -5902359, -386010, 680752, 3784403, -6161131, 6674379, 2814277, 1145683, 2589329, 6672232, --15812996, -7038378, -3795141, 14705431, 1957431, 1167694, -4438312, -4893042, 4449049, -586263, -5147519, -1734093, -10080288, 1163399, 1309428, -1461900, 5001490, 2290291, 1393717, 8189429, -19844896, -1488206, -1602023, 7609072, 2357937, -2258079, 5243618, 15467788, -1658931, 3024731, -5640903, 4558571, 4072166, 4170413, 4641249, 3606162, -4000762, 6222871, 11043435, -2455648, -4275640, 142808, -1316944, -7512972, 4802311, 1876901, -554588, 2384781, 2697776, 712965, -368293, -2474975, -2882460, -1074279, -5804112, -2520609, -3913789, 5184026, 2558727, 2025077, --766652, -679679, 359704, -3284039, 66035, 1328756, -4600447, 4174708, -1973538, 817118, --1369021, 314069, 1603097, 1949378, -3576097, -3499862, -2937758, 498216, -566399, -902480, --224412, 2613488, -614717, 359167, -1442572, -3096135, -1692754, 7154342, 7966091, -10118406, --2925947, -8588324, 8529805, 15964930, -7626252, -1782948, -8750996, -3801046, -10591926, 7570417, --6460168, -2625299, -670552, 82678, -4205847, -5189394, 9540196, -8637179, -3177202, 994822, -6516003, 6945499, -9946071, -2923799, 3849901, -8564702, 4887673, -6794102, -2749853, 2509335, -221728, -3716221, -1013075, 2051921, 11155104, 1379758, 2537252, 4832, -9494562, 10401874, --5077188, -7797513, 6266894, -5558762, -6263673, 8198019, -3681324, 1049046, -1785633, 1101122, -10802916, -1844689, 2444910, -9423158, -710280, 10966125, 2483565, 10864120, 9335111, -3065533, --2349884, -12644384, 1974611, -2129230, 8413841, 10263898, -5869073, 2551748, -18533858, -5084705, -6187974, -6423124, 9659918, 638876, 2116345, -3416647, -681289, -4464082, 827318, -3080565, -6834904, 6671158, -263067, 2264522, -61740, 3764002, 1672890, 2722473, 5784784, -1743220, --6416145, 2950643, 1515050, 4078072, -1020592, 4327180, -841277, -1526861, 1142461, -2632278, --1687922, 424128, -4490925, 1248225, -1529545, 4004520, 1792612, -318901, -803159, -2678986, --3971771, -346819, 602369, 1610076, -1421097, 875636, -3729105, -78383, 287763, -2028835, -2601677, 227633, 122943, 1050656, -1174674, 167504, 90194, 6406481, -8133595, 2793339, --7605314, -823560, -10275172, 16896938, -4964982, 1155346, -5325223, -15400142, 8890045, 3117610, --11489574, 7125888, -5171141, -3806952, 4030827, 15993921, -7970386, 15451145, -293668, -10849087, -467078, 3615289, -9540196, 10550050, -5519570, 7814156, 16983374, 1666447, -7914551, -2211908, --890669, 3897683, -6728067, -3675418, -894964, 8371965, -2970507, -3352759, -11092827, -369904, --13117367, -2413772, 14901926, -3331821, 8494372, 812286, 2281165, -19498614, 289373, -12473122, -10077604, 17488570, 5417028, 4402342, 1110786, 2630131, -10167798, 3604551, 5473936, -4529580, --1242319, -4013647, -2534568, 7891466, 210453, 9569724, 29316910, 10710038, 2957085, -10044318, --9313637, -6044630, 5790690, -9944997, -828929, -892816, 2076080, 5650030, -5425618, -1014686, -5484673, 5995238, 1270774, 1036161, 4107599, 5164698, 4340065, -32749, -911070, -950262, -496606, -2111513, -2611877, 2348810, -1298691, 3642132, -4393215, -1388885, 3115462, 2625299, --217433, 2373506, -2237678, 1090922, 1663226, 2204929, -2460480, -2451353, 3523484, 2498597, -2000381, -882079, -1699733, 857383, -4892505, -1283658, 844498, -2619930, 1256278, -1814624, --1232119, 573378, 455803, -404801, -925565, -3669513, 30596274, -16569447, -454193, -8233989, --15529528, -20725902, 5737003, -6649146, 6075231, -19618874, 3841312, 6982543, 6282464, -8249559, --18012556, -14191109, -11917461, 131533, -6941204, -13160854, -9062381, -4624069, -10751914, -7514582, -1753420, 13515725, -403190, 1891933, -539018, -11967926, 7281580, -1132261, 2088428, -2710661, --7957501, 6660958, -9908490, -13807783, 12240657, -13472776, 2567317, -181999, -18891414, -11294153, -7256884, -400506, 8943733, -6073084, -20066624, -147640, 588411, 7382512, 7850127, 18589156, --10924249, -38511360, -13559749, -13182865, 8486319, -25117506, -8593693, -4250407, -23079006, -7725036, --519154, -4445828, -4436701, 4937602, -6322192, -620623, -5939940, 5321465, -13631689, 4793721, -10715407, -13739600, -7004555, 6657200, 5158256, 4468377, -14125611, 3251290, 33286, -2051921, -7289097, -1942936, 5971079, 5318244, -1342714, 1602560, 1044214, -1763621, -4789426, 7569343, --2639258, -5452461, 35970, -289910, 3961571, 1374390, -116501, 1198296, -4164508, -4201552, -334471, 1367947, 2324114, 4301410, -639413, 1923072, -561567, 1691143, -4825396, -2120640, --3385508, -3080029, -619549, -722091, 1604170, -5411122, -2542084, -4071092, -2951180, -5666136, --6978785, -6180995, -775778, -637266, 625455, -3834869, -4932770, -17763448, 6977711, 8732205, --2961917, -3444564, -8876624, -9779641, 22493280, 8185671, -21070572, 7260106, -11498701, -1108638, --10451803, -21618718, 6303938, -11269994, -4755066, 886374, 590558, -5505075, -18318572, -11333345, -8922795, -11203959, -352724, -9908490, -15253576, -5915781, 16844862, 2717104, 2962991, -14713484, --4982162, -3000572, -1964411, 6003291, 7358353, 9564355, 11767137, -5741835, 6612102, 2356327, --6868727, 4220879, -11512123, -9955197, -8681203, 3762928, -10022306, 523449, -15046881, -13111461, --6824703, 15603079, 12102144, 11871826, 12993887, -11944304, 16292422, 607738, 7481833, 22531398, --4662187, -4060355, 3613141, -10734734, 4414153, -4993973, -14013941, 1915555, 11365557, -13394929, --9669045, -1547262, 12214887, -10144176, 1119913, 3898220, 7320772, 1974074, -3110093, -6863358, -1817308, 5364414, -2936684, 810138, -3683471, 1309965, -3507378, 1534377, 149250, 2097555, --1384053, 1506997, 2398739, 6514392, -897648, 47245, 423591, 3144453, -4804458, -1758252, --5283347, -1241782, -1272384, -5718212, 1004486, 5602785, -603980, -6835978, -1327682, -401043, --6277632, -6670084, -10239202, -3929895, 3730179, 898722, 2593087, -1251983, -1966021, -3340948, --684510, -8582955, -1775432, 5633387, 8299488, -110595, 2378875, -4704063, -8392366, -19698868, -22737020, -17595408, 23542864, 13214004, 9028558, 5108864, 9311489, 10094784, 9351754, 25285546, --8720394, 1862405, -1582696, -4264903, -662499, 3206193, -2237678, 4928475, -1530619, 7960185, -6716792, -1342714, -4258997, -25041270, -8840653, -18145164, -733366, 9676561, 9798968, 3151969, -5046587, 7308961, 6094022, 7084549, 18100602, 26894012, 18112950, 3692061, -3299609, -5123896, --7589744, 9445170, 9676024, 10775536, -7857643, -6230387, -9773198, -1583232, 13191992, 175557, -15785615, -9454297, 8511551, 5099737, 14180908, -29350196, -20928302, -8580808, -11691975, -12046846, -3750580, -4898410, 18624588, 5524402, -20500416, -1670742, 33503430, -11224897, 10536629, -5018670, -13845901, -6367826, -4043175, 512175, -5537287, -7429757, -404264, 5625871, 8390219, 5769752, --2034741, 6502581, -1593970, 3010772, -8369281, -5783711, 5585068, 3466576, -8413841, -3727495, --3492882, -1150514, 2262911, -2257542, -4053912, 1921461, 518080, 1387274, -534723, -2433099, -3934727, 1219771, -2013803, 5001490, -564788, 1451699, -797790, 5895380, -4895726, 5243082, -2455648, -4997195, 3417183, 133681, 1015760, -5217312, -14954539, 5606543, 270046, 1036698, --1591285, 5690295, -1256815, -2759517, 1979980, 4421669, 3867618, -2306934, 4762045, -14501420, --7264937, 11994770, 5235565, 8841727, 23098334, 1956358, 15432354, 22551262, 15668578, -10241350, --22967338, -799938, -10548440, 24729884, 7120519, 19312858, -2771865, -10401337, -3828963, -11348377, -4457639, -8742406, 1042066, -9735617, 5039071, -7125351, -2989834, -15614354, -15440407, -1575716, --22115860, 12060268, 8332774, -6663642, 11311870, -5439576, 4393215, 12548821, -13986561, -18375480, -3248069, -4059818, 30746598, 13008382, -33765960, -9174587, -9594420, -17477832, -18447958, -37769944, -6632503, -13578539, -3553012, 5335423, 1355599, 7690676, -1513439, -4536023, -28594818, 3322157, --13009993, 3433290, 16738561, 3447785, 11218455, -17107928, -22619446, 4485020, 13996225, 9349070, -5247377, 8876624, 14552960, 18135500, 18727668, -16751983, -10042170, -12095702, -8595840, -14107357, -19761144, 11491722, 11138998, 2950643, 8517457, 7201050, -702227, 10230612, -15933255, -5709086, --1904818, 1202054, -3449396, -11403675, 644782, -2396055, 1471026, 3556770, 11551851, 528818, -5408438, 5301601, 871342, 5633387, 198105, -3601330, 714575, -8786429, -3510599, 4505958, -6673843, 1925756, 1234266, -10724533, -1011465, 246424, -5079336, -3661997, 1592896, 3267396, --9709847, -10903848, -4886599, 3514357, 3153043, 5356361, 1345935, -3579318, 2447058, -11290932, --9878425, 40805948, 26949310, 37439768, 2421825, -7427609, -25447682, -7508140, 4246649, 5900748, --6075231, -19662898, -7117835, 32349694, 13364864, -4477504, 9895068, -732829, -11901891, -3474092, --7772280, 22056804, -1712618, 1292785, 9502615, 623844, 10784663, -114354, 15273441, -14075145, -17600776, 3566970, -8230231, -4967130, -9114994, 15907485, -22069152, -23805930, 15027554, 24893630, -1140314, 17183628, 23605140, -26615376, 8826695, 5435818, -1494112, -245350, 3917010, -9992778, -18520972, -11265699, -8989367, 7492571, 905701, -2017561, -4357781, -5553930, 2633889, -17584670, --5309654, 14149770, -17388712, -4002910, -11762842, 431107, 35041564, -11033771, 2202781, 9379672, -118112, -8091182, -21978422, 21406118, 9931575, -44164076, 10878615, 11098195, 8150774, -9915469, --4679367, 22537840, 941672, 1644973, 5709622, -15705622, 523449, 9962714, -4158065, 5747740, --1337882, -5121212, -13165685, 1969779, -1810329, 12096775, -1223529, -543313, -8807904, 9574556, --3333968, -3371013, -13909788, -6973417, 4742718, -8924405, 619549, -4420058, 5401995, -5246303, --11228655, 5563594, -12090870, -3329674, -5571110, 505732, 588947, -4548371, 11777874, -1537061, -15926276, 9740449, -1773822, 1616518, 10123775, -7209103, 1672890, 1138703, 9696426, -9029095, --5483063, -17971216, -43437152, 39140036, 23439248, 12586939, 8933532, 19466402, -43833900, 18366354, -20631412, 8979703, -27964532, 15967078, 28809030, 13485124, 31739808, 11734924, 807991, -994285, --716723, -5107253, 13605920, 22611930, 21567178, 7695508, -6272263, -10858214, 2927557, -9864466, --11567421, 12702366, 8837432, 2616709, -11593190, -11302206, -2263985, -9795747, 5392869, 25938918, --4296578, -8070781, 8946954, 4893579, 7887171, 9209484, -1693291, -4954782, 20920786, 13891535, -7023882, 9339943, -1391033, -20293184, 5032628, 13885092, 2043331, -15050639, 20709258, 5548561, -28700582, 1272384, 25827786, 2946885, -8104067, -2509335, 6401649, 36588828, -4323959, 13283260, -9236327, 17393544, 9275519, 280784, -834297, 11412802, 52032456, 2617246, 21036212, -17355962, --12837657, 6765647, 8407398, 10275709, 4416837, 1839320, -25173340, -9883793, -26409218, 1632088, --4317516, -8637716, -7196755, -2796024, -10992432, 1580011, -907849, -11671037, 8719857, -13624173, --6437619, -12289512, -8252780, -669478, 1622961, -9808632, -11299522, 2917357, 7592429, 8709657, --1497870, -3153580, -14615237, -19303194, 2185602, 2495913, -8614631, 17792976, 17346836, 25424596, -9116068, -5470178, 3691525, 7915625, 9812390, 11592117, 1923609, -11916924, 3248069, 15453829, -8096014, 858457, 6368900, -28547038, 31158378, -542777, 27574764, 610959, 1822677, -25162602, --7761543, -11365557, 19126026, 4797479, 8457327, 4983236, -19299972, 1821603, 1515050, -17007534, --24244554, -24839406, 8362302, -9295920, 22528178, 1198296, -7162932, -5953899, 4855461, -8834211, -1452773, 6500970, -9483825, 5216238, 7604777, 2476049, 2180770, 16935056, 28682866, -5737003, --213138, 14281840, 11813308, 17127256, -12780212, -5147519, 5221607, -17288318, 1699733, 1356673, --22756348, 29233158, -1410897, 14685030, 12826920, 8835285, -17299592, 1501628, 14847702, -12193412, -26400090, 7099044, -9598715, 21656836, 16478179, 11323681, -36659692, -7622493, 7351911, -12678743, -2021319, -20617454, -5077725, -31171262, -8827232, -4893579, -8517457, -34529928, -3398930, -9538585, -51717848, -7591892, 10579578, -5460514, 8326331, -4491462, -8369281, 5428839, -7004018, -1246614, --3732327, 13723494, 5062156, 5945846, -22231824, -20113332, -14824080, -6365142, 4041564, -28210956, --4420058, -2416993, 2203855, 10109279, 7881802, -999654, 10998874, -9981504, 345208, 430034, --16027744, -22473416, 4537096, -6688875, -20559472, -5840082, -9601936, 1249836, -21977884, -2688113, --9501541, 12903692, 386010, -9609989, -3266323, 3907347, 5352603, -2280628, 10182831, -10269804, --6077916, 12779138, 12555800, 16088411, 14131516, 10531260, -7634841, 6588480, 17639968, 17034378, -7501698, -20534238, -23833848, 10620380, -3263102, 7690139, -4369056, 20272782, -15080704, -3087545, --5187247, 17689360, -13242458, 30986578, 38071128, 38845832, 2415919, -7154342, 6327024, -4997732, -9521942, -1609002, -187905, -11323681, -31118648, -10326175, -29801168, 17150878, 16124381, -18331994, --13730474, -18377092, -8584566, -2609730, 40699112, 529892, -20718386, -22239878, -1314797, 28491202, -13619878, -56948044, -11599096, -10022306, 7530152, 21482890, -24724516, -7783555, -14710263, 6535867, --33749852, 16864190, -5601711, -699543, 9409200, 1459215, -16510928, 33415920, -3308199, 15938087, -35736276, 73256576, 43923020, -992137, 24690694, 37403260, 48037060, 52111912, 14923401, 31957242, -9154723, 501974, 19604378, -15304042, 32139778, 13857712, -13915157, -47759500, -34778496, 4645007, --13567802, -9709847, -8788040, -5194226, -5828271, -19601156, -12853227, 852014, -2993592, -958851, --6147172, -1620813, -10211285, 12888123, -21213918, -8570607, 6233608, 4062502, 1989644, -5348308, --6581501, -3607236, 4366371, -3235184, 11048803, -12724914, -16093242, -16034187, -9908490, 12513387, -13919989, -5005248, -2330020, 5226975, -2559801, 23146116, 5062693, 2219961, 18473192, 11731166, -10605348, 26275000, 17219060, 19826642, 6203007, 9672803, 21604760, 8531953, 8972724, -7183333, --16262894, 18925236, -23647016, 39813272, -4610111, -7207492, 814433, 31722628, -21053392, -3650722, --843424, 510027, 11560441, -8108899, 16636556, 5829881, -3037616, 3925600, 1977833, 13088913, --39737576, -12475806, -1142998, 4292283, -3863860, -28936806, 23883776, -1243930, 3328063, 8697309, --18860812, -8556649, -43856984, 11707544, -10227391, 8485782, 32136556, -8734890, 6786049, -4072166, -15351287, -26169236, -35035660, 30798674, -2835215, 2699924, 5255966, 30976914, 22580254, 26891864, --419296, -35868884, 21356724, 10062572, -8449811, -12656195, 20412906, -3677566, 25798794, 42672112, -33166274, 5694590, 2921115, 31493384, -6172942, 9707163, 25901874, -17566954, 29943976, 18361522, -10693932, -21097954, -10419591, -28169616, -794569, 9733470, 42039676, 17747342, -38981124, -3551938, -25259776, -3651796, 12312597, 16950088, -27635430, -6794102, 13543106, 3301219, 7585986, -12040941, -9012452, 15269146, 2014340, 261993, 22326314, 4292820, -4770635, -5750425, 7434052, -1932735, -12012487, 1923609, 9099425, 10341744, -1531156, -10660646, 21976810, -3124589, -6702834, -1387274, --14870251, -14958834, -9811316, -10354629, 7159711, 13016435, -13034152, -11169599, 2629057, 19543712, --28168006, -6823630, 10910291, -3330747, 91805, -3827353, -3027415, -20253456, -265214, -5392332, -5631239, 1568737, 3388729, 237297, 1771137, -1603097, -55188184, 12604118, -9155260, -2200097, -43050604, 18478024, -13526463, -10499048, -180926, -27904940, -34149284, 2841658, 284542, -19253802, -20372104, 2421288, -19709068, 12400644, 37046240, -5018133, -21350282, 13350369, -12571906, -13759465, -6916508, 30032558, -9794136, 4344360, 8257612, -9346386, -22395570, -14767171, 29726542, 10386305, --29286308, 24990268, 9844602, -20153598, -10478646, 41195716, -13406740, -31755378, -16255914, 54774792, --54134840, -25187298, 32160178, -14632954, -17389786, -51697984, 40287332, -33138358, 11861626, 1618666, --6164889, -58376660, -17190606, 49777596, 31490700, -39532488, -10757282, -17182016, -8036958, 7973607, -10878078, 12873628, -68801080, 37543920, 28923920, 30187178, 521839, 15744276, -33634424, -30070676, -58980100, 24053964, 6586333, 23601920, -31656056, 6258304, -13969918, 15029701, -8500814, 41216116, --16789028, -14506789, 5805185, 4857608, -15569256, 9281424, 4619774, 3384434, -2873333, 1956895, -3405372, 3226594, -3793530, -2379412, 8741869, 354872, -4509179, 17947594, 5418101, -16232292, -1858647, 15370614, 4134443, -15451145, 20613696, 36699420, -18025440, -21283710, -5640903, -4922570, -12594992, 26840862, 8272107, -25148108, -8231842, -3797288, 3815005, 7435126, -4112968, 10880226, --7885560, -1122060, 6552510, -45426796, 7956964, 56883084, 17827336, 6168110, 1622961, 4337380, -24431384, 33423436, -7563975, 6298033, 8691940, -5677410, 20184198, -10543608, -2785823, -7964480, -15520401, 11540577, -6253473, 10615012, -15095199, -12290586, 15496779, -9866077, 17022566, -11251204, --4963909, -274878, 9330816, -524523, 6957310, 2849174, 17333414, -12307766, -2416993, 357019, --6818798, 16734803, 14526653, -11904576, -4189204, -7297150, 3888556, -15374372, 8375186, 4808753, -7691750, -6114423, -4625680, 19040664, -22769770, -3899294, 9681393, -6144488, -4099010, 9982041, --27996208, 6818798, -10101226, 1723893, -9890773, 24300924, -7845832, -10430328, 10008348, -5462662, --15849503, 30892626, -803696, 3206193, -6845104, -11833172, -13950591, 15608985, -17434882, -8382703, -17839146, -24237038, -10531260, 3180423, -2231236, 3029563, -335007, 3514894, 10860899, -3837017, -4285304, -4902705, 11394548, 6267968, -435939, 1013612, 6960532, -6022081, 5071283, 870805, -5573257, -2446521, 8637179, -4325569, 2357400, -7423851, -6406481, -10160819, 1953136, 651761, -3464965, -4952098, 11472395, -3719979, -1915555, 9851044, 8688719, 4683662, -3969624, -6525129, -5945846, 7866770, 4947803, 3426847, -56908, 7114614, 7710003, 3437048, 6556268, 905164, --5001490, 14734959, -42477764, -119853744, -98487360, 51880520, 14797236, 118887376, 212517136, 31457414, -66920960, 24263344, -169716704, -53757960, -115171696, -139164992, 3789772, 22075596, -58116276, 83915072, -109881368, 61611844, 175317344, 101045552, -22690312, -41772852, -81528680, -158582544, -125250376, -37015100, --111701896, -15683073, 96156800, 15943455, 22291418, 145415776, 74132208, 45796700, 151633280, 23246510, --42012296, 59192704, -79595944, -157556576, -65996468, -132951248, -166342480, -2565169, -34831648, -43888660, -110586280, 121865936, 77517720, 183938416, 148405616, 69927976, 63248224, 36550708, -123118992, -113288888, --143406816, -189333440, -151813136, -64151244, -44088912, 3741454, 108652472, 132120176, 138337136, 132578664, -122876328, 26090852, 2172717, -21033528, -93864360, -102871448, -59475096, -107861128, -45431628, 9248138, --23607824, 53902376, 97165584, 29590178, 40993852, 18125298, -26652956, -16721381, -40745280, -53049288, --6448894, 14721537, 325344, 43472584, 40182104, 4415764, 38681012, -145492, -49143552, 43142948, -12961674, -43791488, 30595200, -32478542, -65641596, 29792040, -46732464, -115732192, 1753420, -51037096, --33719788, 114390552, 51774220, 54308252, 163842272, 108506440, 60254632, 71389872, -17882634, -103752992, --131733088, -178965920, -197857872, -125675040, -80234824, -13973676, 75252656, 167494592, 185031488, 171438992, -178644336, 95409480, 4387846, -45678588, -117630568, -150588000, -97391608, -108795280, -86541984, -17474074, -3308199, 11541114, 42762840, 36324148, 31913218, 56554520, 56602300, 47831440, 56633440, 39530880, -14287746, -2864743, -21993454, -52027088, -54877872, -40637908, -32021666, -13900125, -4604742, -3220689, --3836480, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-10633265, 5459977, 321586, 8239895, 2979634, 3637301, 2328409, 3346317, -105764, -109522, +-1868311, -5405217, -3132642, 1436667, -283468, -997506, -657130, 2874407, 2221035, 32212, +2575370, -2423435, -6164352, 1959042, -1449552, 689879, -3154117, 2460480, -2587181, -1283122, +-1036698, 4407710, -1062468, -48855, -1864016, -506269, -5000953, 1677185, -868657, 2688113, +-2393371, 317828, -1146219, -3995393, 1238024, -398358, -1110786, 1777580, 3253438, -681289, +-2045478, -5842766, 499827, -3474092, 1578937, 56908, -2284386, -91805, -1000727, -817118, +-4249334, 2725694, -3772055, 2064269, -1506460, -2495376, -2160369, -4489315, 2437394, 229244, +1195612, 2700461, -2916283, -4603668, 2913062, -4411469, 105764, -2939905, 901406, -2275796, +1966021, -1151051, 1020592, -1963337, 317828, -911070, 1141388, -941135, -1074279, -1002875, +-987843, -1761474, 216359, 433255, -346819, -1387811, 920734, -1047972, 106837, -700617, +-1241246, -442919, -470299, -193810, -306016, -176094, -1032940, -536334, 109522, -594316, +-359167, -318364, -15739981, -189515, -2106145, 4116189, 59593, 1572495, -1318018, 2038499, +382789, 1780801, -1835562, 10130754, -2223719, -1445793, -4373351, 1442572, -5276904, -1706176, +379568, -2574296, -49392, 3707094, 2119566, 1398549, 2495376, 3600793, -4415764, -1697049, +-97174, 2283312, -4166118, 4035659, -3488050, -1769527, 3235184, -630286, 740345, -2596308, +2988760, 3122441, 3357591, -5184563, -1584843, 5572183, -80531, -856309, -1257889, 6076305, +3966402, 4697621, 81068, -1116155, -1411971, -348966, -129386, 677531, 1820529, -5902359, +-532576, -2756832, -3479997, -470299, 1003412, -3069828, 817654, -2349884, -853625, -959388, +-68719, 2022930, 1891396, -1082332, -693100, -1350767, -4772783, -1148367, -2956011, 61740, +-3900367, 1041530, 72478, 3930432, -1352915, 522912, -3412889, 278099, 493921, -1617592, +-1628330, 1655710, 70867, 423591, -142271, 1153736, -289910, 465467, -178241, -296890, +1450625, 629750, 621697, 193810, -132607, 5335960, 6320581, -4410395, 558346, -3763465, +5790153, 1056025, -2406256, -3407520, -3016141, -638876, 725850, 1527935, 7705708, -4598836, +-740345, -1832877, 3012920, -8627516, -1020055, 5484137, -163746, 4606353, 2029909, 3692598, +3841848, 1665374, -766652, -4057134, 1322313, -1143535, 500364, 6415071, 1606855, 5502390, +-2910914, -1518808, 406948, -7429220, 854699, 5531381, -1643362, 505732, -4651450, 3490735, +-92342, 1544041, -5502390, 3218541, -3700651, -2066953, -3864934, -4534949, 2592550, 874026, +-1480153, -2326799, -2204929, -1621887, -1109175, 2550137, -2551748, -4606353, -7093676, 6540162, +5013838, 261456, -7096360, 2142115, -3409667, 2780455, -2308008, 498216, -4352413, -2742337, +-5665599, -2565169, -802085, 5513128, 3278671, -6169721, 2662343, 129923, -544924, 2688650, +-374199, 2134062, 4376572, 223875, 916439, 2902324, 593779, 576063, 2867965, -510027, +-82678, 216359, 368830, 607201, 709207, -644245, 828929, -603443, 207232, 141197, +733366, 168577, 1815697, 1588064, 111132, -88584, 1782411, 910533, -1343251, 255014, +642098, 26761942, -9898826, 12004970, -9486509, 844498, 2871723, 2838437, -7826504, -2640868, +-2609193, -13126494, -42413, 721555, -4711043, -741419, -27917, 9429064, 1767916, -6534793, +4819490, 5253819, 1196685, 9557913, -7059853, -2570538, -3759170, 2036888, 7666517, -530428, +511101, 2864743, -1336272, 3435974, 1570884, 8748312, -1287417, 3442953, -5686537, 5238250, +-3972308, 5845451, -74625, -6067178, -884763, 8818105, -359167, 5973226, 3602941, 5745593, +540092, -4508642, -3655017, 115964, -2708514, 4720169, 3147137, -4629975, 672699, -3613141, +6234682, -1666984, 5008469, 5963025, 1072668, 6146098, -250182, -2949569, -977105, -3764539, +206158, 8069707, -5014375, -5148055, -1920924, 2305324, -3503083, -2171106, 1593970, 3886946, +-1570884, 1440425, -7770670, 1941862, 542777, -538482, 2770254, 193274, 772557, 1876901, +-200790, -991064, 878321, -1779190, 601295, -730144, 263604, 359704, -239444, -607738, +-1522566, -105227, -1204738, -757525, -485868, -2671470, -22262426, 2440615, -6553583, -4685810, +-7187628, -8713952, 3440806, 7796977, -1172526, 3033321, 1236951, 4005057, 909996, 295279, +2418604, -4770098, 11064373, -573915, -6438156, 7261716, -2217814, 3083250, -7257421, -4516158, +-5142150, 2228014, 1352915, 5681705, 173409, -3529926, 594853, -3151969, -3464428, -3844533, +-1335735, -5352603, -2712272, 4985920, -4642860, -330176, -3632469, -5681705, -2531346, 708670, +1818919, 3601867, -2860985, -2626373, 3562139, 617938, 1340030, 941135, 2204392, 3337727, +-5437966, -1826972, -554051, -7627325, 2017024, -544924, 4459250, -4476967, -3415573, -4185983, +716186, 4714801, 3653944, 8324721, 5590974, -5166846, 2089502, -2349884, 3941169, 2454037, +-5576478, 4000762, 1076426, -6200322, 792958, -1145146, 526134, -1179505, -4228396, 753230, +-3034931, -3207804, 1163936, -1775432, 729071, 2244121, -1523640, -2049773, -2110440, -3174518, +-590558, 2403034, -648003, 2499671, 16643, 1678795, 1155883, 859530, -1131724, -472446, +429497, -1129576, -1231045, 256624, -1188095, -489626, 318901, -2247879, 1240172, -1168231, +-387621, 219043, -79994, 140123, 714038, -1024350, 635118, 1447404, -28349468, 7783555, +-8455180, -7044820, -5066988, 955630, -1474248, 16699370, 1645509, 3995393, -1860258, 63888, +-6859063, 6812355, 1991254, -993748, 1370632, 8893267, -4453344, -1541356, 2055679, 613107, +4467840, -3890704, -1745904, 4902705, 1804423, 4515621, 543313, -4804995, -3140158, 2697776, +-464930, -1638530, -2994129, -1739999, -195421, 8419210, 2131378, -1537061, 179315, 609885, +-2555506, 6059662, 4651987, -1462973, -6378564, 1580548, -3376381, 5761699, 4491462, -4523138, +1759863, -5852430, -5195837, -4593468, -5733782, -2007360, 1267552, -3476776, 286689, -3838627, +-3227131, 6626061, 4234838, -5672578, -7614977, 821413, 6488085, -5043366, -3714073, 5443334, +4313758, 6212670, -4031364, -218506, 1767379, 2535105, 7026030, 1853815, -919660, -317291, +-5120138, -818728, -93416, -4445291, 320512, -1347546, -2006287, 31675, -594853, 2110977, +-521302, -903554, 1028108, -717796, -1831804, -1265405, 383326, 1686848, -839666, -720481, +51540, -501437, 3289945, 523986, 4265977, -3092377, 768262, 145492, -1782948, -119722, +-151398, -2366527, 576063, -520228, -2535105, -2434173, -1233193, -2333778, -1722282, 503585, +-1126892, -14919643, -1469953, 2524367, 7270306, -1403381, -3795677, 1713692, 10678362, -13425531, +3123515, -2714956, -2487323, -6036040, 3642669, -10755135, -7004018, 3716221, -5624260, 3420405, +15347529, -2699387, 6205691, -7199439, 7413114, -1909113, 2213519, -6454799, 3024731, 1854889, +-3465502, 1542967, -697395, -3310346, -220117, 4233227, 6606734, -5152350, -8247948, -6516539, +-6054294, 805306, 4843650, 12851616, -146566, 8662412, 9023726, -8373039, 6455336, -12324946, +-4515621, 805843, -5493263, -5094905, 3424163, -11933567, -2364380, 8345659, -3591130, -3103651, +1096827, -3627637, 3399467, -3598646, 5833103, 7565048, -2091112, 2369748, 310848, -7605850, +653909, -4912906, -3409130, -6002754, 3427384, 2652679, -5796595, 498753, 4313758, 4041564, +5111011, 5300527, -809601, -4982699, 4151623, 2203855, 2485176, 1387811, 3001645, -310848, +-101469, 470836, 1233193, 1486596, -2055679, -600759, -1658931, -1069984, 2408940, 2102923, +2325725, -4195110, 862215, -496606, -1744831, -2010045, 2178622, -1314797, -2311766, 618475, +545461, -727997, 5141076, 1740536, -1010391, -1104344, -2390149, -627065, 2101313, 3236795, +804233, 42950, 3222299, 35440460, -1652489, -13935021, -1694902, -555125, 1399086, 4517232, +1876901, -1561758, -1393717, -6986301, -3278134, 4010963, 8704825, -7023346, -4396436, 5834176, +529892, -2014877, 2374043, -500901, -8139500, -8287140, 11429445, -994285, -659814, -1833414, +5902359, -386010, 680752, 3784403, -6161131, 6674379, 2814277, 1145683, 2589329, 6672232, +-15812996, -7038378, -3795141, 14705431, 1957431, 1167694, -4438312, -4893042, 4449049, -586263, +5147519, -1734093, -10080288, 1163399, 1309428, -1461900, 5001490, 2290291, 1393717, 8189429, +19844896, -1488206, -1602023, 7609072, 2357937, -2258079, 5243618, 15467788, -1658931, 3024731, +5640903, 4558571, 4072166, 4170413, 4641249, 3606162, -4000762, 6222871, 11043435, -2455648, +4275640, 142808, -1316944, -7512972, 4802311, 1876901, -554588, 2384781, 2697776, 712965, +368293, -2474975, -2882460, -1074279, -5804112, -2520609, -3913789, 5184026, 2558727, 2025077, +-766652, -679679, 359704, -3284039, 66035, 1328756, -4600447, 4174708, -1973538, 817118, +-1369021, 314069, 1603097, 1949378, -3576097, -3499862, -2937758, 498216, -566399, -902480, +-224412, 2613488, -614717, 359167, -1442572, -3096135, -1692754, 7154342, 7966091, -10118406, +-2925947, -8588324, 8529805, 15964930, -7626252, -1782948, -8750996, -3801046, -10591926, 7570417, +-6460168, -2625299, -670552, 82678, -4205847, -5189394, 9540196, -8637179, -3177202, 994822, +6516003, 6945499, -9946071, -2923799, 3849901, -8564702, 4887673, -6794102, -2749853, 2509335, +221728, -3716221, -1013075, 2051921, 11155104, 1379758, 2537252, 4832, -9494562, 10401874, +-5077188, -7797513, 6266894, -5558762, -6263673, 8198019, -3681324, 1049046, -1785633, 1101122, +10802916, -1844689, 2444910, -9423158, -710280, 10966125, 2483565, 10864120, 9335111, -3065533, +-2349884, -12644384, 1974611, -2129230, 8413841, 10263898, -5869073, 2551748, -18533858, -5084705, +6187974, -6423124, 9659918, 638876, 2116345, -3416647, -681289, -4464082, 827318, -3080565, +6834904, 6671158, -263067, 2264522, -61740, 3764002, 1672890, 2722473, 5784784, -1743220, +-6416145, 2950643, 1515050, 4078072, -1020592, 4327180, -841277, -1526861, 1142461, -2632278, +-1687922, 424128, -4490925, 1248225, -1529545, 4004520, 1792612, -318901, -803159, -2678986, +-3971771, -346819, 602369, 1610076, -1421097, 875636, -3729105, -78383, 287763, -2028835, +2601677, 227633, 122943, 1050656, -1174674, 167504, 90194, 6406481, -8133595, 2793339, +-7605314, -823560, -10275172, 16896938, -4964982, 1155346, -5325223, -15400142, 8890045, 3117610, +-11489574, 7125888, -5171141, -3806952, 4030827, 15993921, -7970386, 15451145, -293668, -10849087, +467078, 3615289, -9540196, 10550050, -5519570, 7814156, 16983374, 1666447, -7914551, -2211908, +-890669, 3897683, -6728067, -3675418, -894964, 8371965, -2970507, -3352759, -11092827, -369904, +-13117367, -2413772, 14901926, -3331821, 8494372, 812286, 2281165, -19498614, 289373, -12473122, +10077604, 17488570, 5417028, 4402342, 1110786, 2630131, -10167798, 3604551, 5473936, -4529580, +-1242319, -4013647, -2534568, 7891466, 210453, 9569724, 29316910, 10710038, 2957085, -10044318, +-9313637, -6044630, 5790690, -9944997, -828929, -892816, 2076080, 5650030, -5425618, -1014686, +5484673, 5995238, 1270774, 1036161, 4107599, 5164698, 4340065, -32749, -911070, -950262, +496606, -2111513, -2611877, 2348810, -1298691, 3642132, -4393215, -1388885, 3115462, 2625299, +-217433, 2373506, -2237678, 1090922, 1663226, 2204929, -2460480, -2451353, 3523484, 2498597, +2000381, -882079, -1699733, 857383, -4892505, -1283658, 844498, -2619930, 1256278, -1814624, +-1232119, 573378, 455803, -404801, -925565, -3669513, 30596274, -16569447, -454193, -8233989, +-15529528, -20725902, 5737003, -6649146, 6075231, -19618874, 3841312, 6982543, 6282464, -8249559, +-18012556, -14191109, -11917461, 131533, -6941204, -13160854, -9062381, -4624069, -10751914, -7514582, +1753420, 13515725, -403190, 1891933, -539018, -11967926, 7281580, -1132261, 2088428, -2710661, +-7957501, 6660958, -9908490, -13807783, 12240657, -13472776, 2567317, -181999, -18891414, -11294153, +7256884, -400506, 8943733, -6073084, -20066624, -147640, 588411, 7382512, 7850127, 18589156, +-10924249, -38511360, -13559749, -13182865, 8486319, -25117506, -8593693, -4250407, -23079006, -7725036, +-519154, -4445828, -4436701, 4937602, -6322192, -620623, -5939940, 5321465, -13631689, 4793721, +10715407, -13739600, -7004555, 6657200, 5158256, 4468377, -14125611, 3251290, 33286, -2051921, +7289097, -1942936, 5971079, 5318244, -1342714, 1602560, 1044214, -1763621, -4789426, 7569343, +-2639258, -5452461, 35970, -289910, 3961571, 1374390, -116501, 1198296, -4164508, -4201552, +334471, 1367947, 2324114, 4301410, -639413, 1923072, -561567, 1691143, -4825396, -2120640, +-3385508, -3080029, -619549, -722091, 1604170, -5411122, -2542084, -4071092, -2951180, -5666136, +-6978785, -6180995, -775778, -637266, 625455, -3834869, -4932770, -17763448, 6977711, 8732205, +-2961917, -3444564, -8876624, -9779641, 22493280, 8185671, -21070572, 7260106, -11498701, -1108638, +-10451803, -21618718, 6303938, -11269994, -4755066, 886374, 590558, -5505075, -18318572, -11333345, +8922795, -11203959, -352724, -9908490, -15253576, -5915781, 16844862, 2717104, 2962991, -14713484, +-4982162, -3000572, -1964411, 6003291, 7358353, 9564355, 11767137, -5741835, 6612102, 2356327, +-6868727, 4220879, -11512123, -9955197, -8681203, 3762928, -10022306, 523449, -15046881, -13111461, +-6824703, 15603079, 12102144, 11871826, 12993887, -11944304, 16292422, 607738, 7481833, 22531398, +-4662187, -4060355, 3613141, -10734734, 4414153, -4993973, -14013941, 1915555, 11365557, -13394929, +-9669045, -1547262, 12214887, -10144176, 1119913, 3898220, 7320772, 1974074, -3110093, -6863358, +1817308, 5364414, -2936684, 810138, -3683471, 1309965, -3507378, 1534377, 149250, 2097555, +-1384053, 1506997, 2398739, 6514392, -897648, 47245, 423591, 3144453, -4804458, -1758252, +-5283347, -1241782, -1272384, -5718212, 1004486, 5602785, -603980, -6835978, -1327682, -401043, +-6277632, -6670084, -10239202, -3929895, 3730179, 898722, 2593087, -1251983, -1966021, -3340948, +-684510, -8582955, -1775432, 5633387, 8299488, -110595, 2378875, -4704063, -8392366, -19698868, +22737020, -17595408, 23542864, 13214004, 9028558, 5108864, 9311489, 10094784, 9351754, 25285546, +-8720394, 1862405, -1582696, -4264903, -662499, 3206193, -2237678, 4928475, -1530619, 7960185, +6716792, -1342714, -4258997, -25041270, -8840653, -18145164, -733366, 9676561, 9798968, 3151969, +5046587, 7308961, 6094022, 7084549, 18100602, 26894012, 18112950, 3692061, -3299609, -5123896, +-7589744, 9445170, 9676024, 10775536, -7857643, -6230387, -9773198, -1583232, 13191992, 175557, +15785615, -9454297, 8511551, 5099737, 14180908, -29350196, -20928302, -8580808, -11691975, -12046846, +3750580, -4898410, 18624588, 5524402, -20500416, -1670742, 33503430, -11224897, 10536629, -5018670, +13845901, -6367826, -4043175, 512175, -5537287, -7429757, -404264, 5625871, 8390219, 5769752, +-2034741, 6502581, -1593970, 3010772, -8369281, -5783711, 5585068, 3466576, -8413841, -3727495, +-3492882, -1150514, 2262911, -2257542, -4053912, 1921461, 518080, 1387274, -534723, -2433099, +3934727, 1219771, -2013803, 5001490, -564788, 1451699, -797790, 5895380, -4895726, 5243082, +2455648, -4997195, 3417183, 133681, 1015760, -5217312, -14954539, 5606543, 270046, 1036698, +-1591285, 5690295, -1256815, -2759517, 1979980, 4421669, 3867618, -2306934, 4762045, -14501420, +-7264937, 11994770, 5235565, 8841727, 23098334, 1956358, 15432354, 22551262, 15668578, -10241350, +-22967338, -799938, -10548440, 24729884, 7120519, 19312858, -2771865, -10401337, -3828963, -11348377, +4457639, -8742406, 1042066, -9735617, 5039071, -7125351, -2989834, -15614354, -15440407, -1575716, +-22115860, 12060268, 8332774, -6663642, 11311870, -5439576, 4393215, 12548821, -13986561, -18375480, +3248069, -4059818, 30746598, 13008382, -33765960, -9174587, -9594420, -17477832, -18447958, -37769944, +6632503, -13578539, -3553012, 5335423, 1355599, 7690676, -1513439, -4536023, -28594818, 3322157, +-13009993, 3433290, 16738561, 3447785, 11218455, -17107928, -22619446, 4485020, 13996225, 9349070, +5247377, 8876624, 14552960, 18135500, 18727668, -16751983, -10042170, -12095702, -8595840, -14107357, +19761144, 11491722, 11138998, 2950643, 8517457, 7201050, -702227, 10230612, -15933255, -5709086, +-1904818, 1202054, -3449396, -11403675, 644782, -2396055, 1471026, 3556770, 11551851, 528818, +5408438, 5301601, 871342, 5633387, 198105, -3601330, 714575, -8786429, -3510599, 4505958, +6673843, 1925756, 1234266, -10724533, -1011465, 246424, -5079336, -3661997, 1592896, 3267396, +-9709847, -10903848, -4886599, 3514357, 3153043, 5356361, 1345935, -3579318, 2447058, -11290932, +-9878425, 40805948, 26949310, 37439768, 2421825, -7427609, -25447682, -7508140, 4246649, 5900748, +-6075231, -19662898, -7117835, 32349694, 13364864, -4477504, 9895068, -732829, -11901891, -3474092, +-7772280, 22056804, -1712618, 1292785, 9502615, 623844, 10784663, -114354, 15273441, -14075145, +17600776, 3566970, -8230231, -4967130, -9114994, 15907485, -22069152, -23805930, 15027554, 24893630, +1140314, 17183628, 23605140, -26615376, 8826695, 5435818, -1494112, -245350, 3917010, -9992778, +18520972, -11265699, -8989367, 7492571, 905701, -2017561, -4357781, -5553930, 2633889, -17584670, +-5309654, 14149770, -17388712, -4002910, -11762842, 431107, 35041564, -11033771, 2202781, 9379672, +118112, -8091182, -21978422, 21406118, 9931575, -44164076, 10878615, 11098195, 8150774, -9915469, +-4679367, 22537840, 941672, 1644973, 5709622, -15705622, 523449, 9962714, -4158065, 5747740, +-1337882, -5121212, -13165685, 1969779, -1810329, 12096775, -1223529, -543313, -8807904, 9574556, +-3333968, -3371013, -13909788, -6973417, 4742718, -8924405, 619549, -4420058, 5401995, -5246303, +-11228655, 5563594, -12090870, -3329674, -5571110, 505732, 588947, -4548371, 11777874, -1537061, +15926276, 9740449, -1773822, 1616518, 10123775, -7209103, 1672890, 1138703, 9696426, -9029095, +-5483063, -17971216, -43437152, 39140036, 23439248, 12586939, 8933532, 19466402, -43833900, 18366354, +20631412, 8979703, -27964532, 15967078, 28809030, 13485124, 31739808, 11734924, 807991, -994285, +-716723, -5107253, 13605920, 22611930, 21567178, 7695508, -6272263, -10858214, 2927557, -9864466, +-11567421, 12702366, 8837432, 2616709, -11593190, -11302206, -2263985, -9795747, 5392869, 25938918, +-4296578, -8070781, 8946954, 4893579, 7887171, 9209484, -1693291, -4954782, 20920786, 13891535, +7023882, 9339943, -1391033, -20293184, 5032628, 13885092, 2043331, -15050639, 20709258, 5548561, +28700582, 1272384, 25827786, 2946885, -8104067, -2509335, 6401649, 36588828, -4323959, 13283260, +9236327, 17393544, 9275519, 280784, -834297, 11412802, 52032456, 2617246, 21036212, -17355962, +-12837657, 6765647, 8407398, 10275709, 4416837, 1839320, -25173340, -9883793, -26409218, 1632088, +-4317516, -8637716, -7196755, -2796024, -10992432, 1580011, -907849, -11671037, 8719857, -13624173, +-6437619, -12289512, -8252780, -669478, 1622961, -9808632, -11299522, 2917357, 7592429, 8709657, +-1497870, -3153580, -14615237, -19303194, 2185602, 2495913, -8614631, 17792976, 17346836, 25424596, +9116068, -5470178, 3691525, 7915625, 9812390, 11592117, 1923609, -11916924, 3248069, 15453829, +8096014, 858457, 6368900, -28547038, 31158378, -542777, 27574764, 610959, 1822677, -25162602, +-7761543, -11365557, 19126026, 4797479, 8457327, 4983236, -19299972, 1821603, 1515050, -17007534, +-24244554, -24839406, 8362302, -9295920, 22528178, 1198296, -7162932, -5953899, 4855461, -8834211, +1452773, 6500970, -9483825, 5216238, 7604777, 2476049, 2180770, 16935056, 28682866, -5737003, +-213138, 14281840, 11813308, 17127256, -12780212, -5147519, 5221607, -17288318, 1699733, 1356673, +-22756348, 29233158, -1410897, 14685030, 12826920, 8835285, -17299592, 1501628, 14847702, -12193412, +26400090, 7099044, -9598715, 21656836, 16478179, 11323681, -36659692, -7622493, 7351911, -12678743, +2021319, -20617454, -5077725, -31171262, -8827232, -4893579, -8517457, -34529928, -3398930, -9538585, +51717848, -7591892, 10579578, -5460514, 8326331, -4491462, -8369281, 5428839, -7004018, -1246614, +-3732327, 13723494, 5062156, 5945846, -22231824, -20113332, -14824080, -6365142, 4041564, -28210956, +-4420058, -2416993, 2203855, 10109279, 7881802, -999654, 10998874, -9981504, 345208, 430034, +-16027744, -22473416, 4537096, -6688875, -20559472, -5840082, -9601936, 1249836, -21977884, -2688113, +-9501541, 12903692, 386010, -9609989, -3266323, 3907347, 5352603, -2280628, 10182831, -10269804, +-6077916, 12779138, 12555800, 16088411, 14131516, 10531260, -7634841, 6588480, 17639968, 17034378, +7501698, -20534238, -23833848, 10620380, -3263102, 7690139, -4369056, 20272782, -15080704, -3087545, +-5187247, 17689360, -13242458, 30986578, 38071128, 38845832, 2415919, -7154342, 6327024, -4997732, +9521942, -1609002, -187905, -11323681, -31118648, -10326175, -29801168, 17150878, 16124381, -18331994, +-13730474, -18377092, -8584566, -2609730, 40699112, 529892, -20718386, -22239878, -1314797, 28491202, +13619878, -56948044, -11599096, -10022306, 7530152, 21482890, -24724516, -7783555, -14710263, 6535867, +-33749852, 16864190, -5601711, -699543, 9409200, 1459215, -16510928, 33415920, -3308199, 15938087, +35736276, 73256576, 43923020, -992137, 24690694, 37403260, 48037060, 52111912, 14923401, 31957242, +9154723, 501974, 19604378, -15304042, 32139778, 13857712, -13915157, -47759500, -34778496, 4645007, +-13567802, -9709847, -8788040, -5194226, -5828271, -19601156, -12853227, 852014, -2993592, -958851, +-6147172, -1620813, -10211285, 12888123, -21213918, -8570607, 6233608, 4062502, 1989644, -5348308, +-6581501, -3607236, 4366371, -3235184, 11048803, -12724914, -16093242, -16034187, -9908490, 12513387, +13919989, -5005248, -2330020, 5226975, -2559801, 23146116, 5062693, 2219961, 18473192, 11731166, +10605348, 26275000, 17219060, 19826642, 6203007, 9672803, 21604760, 8531953, 8972724, -7183333, +-16262894, 18925236, -23647016, 39813272, -4610111, -7207492, 814433, 31722628, -21053392, -3650722, +-843424, 510027, 11560441, -8108899, 16636556, 5829881, -3037616, 3925600, 1977833, 13088913, +-39737576, -12475806, -1142998, 4292283, -3863860, -28936806, 23883776, -1243930, 3328063, 8697309, +-18860812, -8556649, -43856984, 11707544, -10227391, 8485782, 32136556, -8734890, 6786049, -4072166, +15351287, -26169236, -35035660, 30798674, -2835215, 2699924, 5255966, 30976914, 22580254, 26891864, +-419296, -35868884, 21356724, 10062572, -8449811, -12656195, 20412906, -3677566, 25798794, 42672112, +33166274, 5694590, 2921115, 31493384, -6172942, 9707163, 25901874, -17566954, 29943976, 18361522, +10693932, -21097954, -10419591, -28169616, -794569, 9733470, 42039676, 17747342, -38981124, -3551938, +25259776, -3651796, 12312597, 16950088, -27635430, -6794102, 13543106, 3301219, 7585986, -12040941, +9012452, 15269146, 2014340, 261993, 22326314, 4292820, -4770635, -5750425, 7434052, -1932735, +12012487, 1923609, 9099425, 10341744, -1531156, -10660646, 21976810, -3124589, -6702834, -1387274, +-14870251, -14958834, -9811316, -10354629, 7159711, 13016435, -13034152, -11169599, 2629057, 19543712, +-28168006, -6823630, 10910291, -3330747, 91805, -3827353, -3027415, -20253456, -265214, -5392332, +5631239, 1568737, 3388729, 237297, 1771137, -1603097, -55188184, 12604118, -9155260, -2200097, +43050604, 18478024, -13526463, -10499048, -180926, -27904940, -34149284, 2841658, 284542, -19253802, +20372104, 2421288, -19709068, 12400644, 37046240, -5018133, -21350282, 13350369, -12571906, -13759465, +6916508, 30032558, -9794136, 4344360, 8257612, -9346386, -22395570, -14767171, 29726542, 10386305, +-29286308, 24990268, 9844602, -20153598, -10478646, 41195716, -13406740, -31755378, -16255914, 54774792, +-54134840, -25187298, 32160178, -14632954, -17389786, -51697984, 40287332, -33138358, 11861626, 1618666, +-6164889, -58376660, -17190606, 49777596, 31490700, -39532488, -10757282, -17182016, -8036958, 7973607, +10878078, 12873628, -68801080, 37543920, 28923920, 30187178, 521839, 15744276, -33634424, -30070676, +58980100, 24053964, 6586333, 23601920, -31656056, 6258304, -13969918, 15029701, -8500814, 41216116, +-16789028, -14506789, 5805185, 4857608, -15569256, 9281424, 4619774, 3384434, -2873333, 1956895, +3405372, 3226594, -3793530, -2379412, 8741869, 354872, -4509179, 17947594, 5418101, -16232292, +1858647, 15370614, 4134443, -15451145, 20613696, 36699420, -18025440, -21283710, -5640903, -4922570, +12594992, 26840862, 8272107, -25148108, -8231842, -3797288, 3815005, 7435126, -4112968, 10880226, +-7885560, -1122060, 6552510, -45426796, 7956964, 56883084, 17827336, 6168110, 1622961, 4337380, +24431384, 33423436, -7563975, 6298033, 8691940, -5677410, 20184198, -10543608, -2785823, -7964480, +15520401, 11540577, -6253473, 10615012, -15095199, -12290586, 15496779, -9866077, 17022566, -11251204, +-4963909, -274878, 9330816, -524523, 6957310, 2849174, 17333414, -12307766, -2416993, 357019, +-6818798, 16734803, 14526653, -11904576, -4189204, -7297150, 3888556, -15374372, 8375186, 4808753, +7691750, -6114423, -4625680, 19040664, -22769770, -3899294, 9681393, -6144488, -4099010, 9982041, +-27996208, 6818798, -10101226, 1723893, -9890773, 24300924, -7845832, -10430328, 10008348, -5462662, +-15849503, 30892626, -803696, 3206193, -6845104, -11833172, -13950591, 15608985, -17434882, -8382703, +17839146, -24237038, -10531260, 3180423, -2231236, 3029563, -335007, 3514894, 10860899, -3837017, +4285304, -4902705, 11394548, 6267968, -435939, 1013612, 6960532, -6022081, 5071283, 870805, +5573257, -2446521, 8637179, -4325569, 2357400, -7423851, -6406481, -10160819, 1953136, 651761, +3464965, -4952098, 11472395, -3719979, -1915555, 9851044, 8688719, 4683662, -3969624, -6525129, +5945846, 7866770, 4947803, 3426847, -56908, 7114614, 7710003, 3437048, 6556268, 905164, +-5001490, 14734959, -42477764, -119853744, -98487360, 51880520, 14797236, 118887376, 212517136, 31457414, +66920960, 24263344, -169716704, -53757960, -115171696, -139164992, 3789772, 22075596, -58116276, 83915072, +109881368, 61611844, 175317344, 101045552, -22690312, -41772852, -81528680, -158582544, -125250376, -37015100, +-111701896, -15683073, 96156800, 15943455, 22291418, 145415776, 74132208, 45796700, 151633280, 23246510, +-42012296, 59192704, -79595944, -157556576, -65996468, -132951248, -166342480, -2565169, -34831648, -43888660, +110586280, 121865936, 77517720, 183938416, 148405616, 69927976, 63248224, 36550708, -123118992, -113288888, +-143406816, -189333440, -151813136, -64151244, -44088912, 3741454, 108652472, 132120176, 138337136, 132578664, +122876328, 26090852, 2172717, -21033528, -93864360, -102871448, -59475096, -107861128, -45431628, 9248138, +-23607824, 53902376, 97165584, 29590178, 40993852, 18125298, -26652956, -16721381, -40745280, -53049288, +-6448894, 14721537, 325344, 43472584, 40182104, 4415764, 38681012, -145492, -49143552, 43142948, +12961674, -43791488, 30595200, -32478542, -65641596, 29792040, -46732464, -115732192, 1753420, -51037096, +-33719788, 114390552, 51774220, 54308252, 163842272, 108506440, 60254632, 71389872, -17882634, -103752992, +-131733088, -178965920, -197857872, -125675040, -80234824, -13973676, 75252656, 167494592, 185031488, 171438992, +178644336, 95409480, 4387846, -45678588, -117630568, -150588000, -97391608, -108795280, -86541984, -17474074, +3308199, 11541114, 42762840, 36324148, 31913218, 56554520, 56602300, 47831440, 56633440, 39530880, +14287746, -2864743, -21993454, -52027088, -54877872, -40637908, -32021666, -13900125, -4604742, -3220689, +-3836480, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -10573136, --12868796, 6489159, -2356327, 5675263, -2819109, -2884071, -5756867, 1356136, 1220308, -258235, -93416, -646393, -4403415, -512712, -2517925, -2896956, -2744484, -106837, 330712, -221191, --495532, 2181844, -606127, -6664179, 4145180, 2057826, -2269353, 663036, -64425, 68183, -935766, 4279398, -2386928, 249645, -7549479, 3759170, 743029, 1695438, 2609730, 4236449, --2370822, -1807108, -857383, -3801046, 304406, -576063, 3281892, -1769527, -224949, -1842541, --2105608, 3991635, -3012383, -1461363, 375273, -2739116, 2282775, -107374, -1284195, 2466385, -4533875, 279173, -176094, -642098, 3876208, -3857954, 33823, -607738, 2028298, -954020, --1765232, 4211216, -74625, 884226, -1171452, 869194, 2267206, -1823214, -2542621, 122943, -2213519, 3712462, -1674500, -1139777, 914828, 195421, 568009, -1711545, -550293, 1011465, --230318, 709207, -1349157, -425739, -832687, -1169305, -842887, -788127, 591095, 98784, --590558, 587874, 407485, -539555, -166967, -137439, -731755, -1319629, -369904, -5369, -270583, 706522, -15343771, 2608119, 1813013, 5377836, -2108292, 1629403, 6252936, -2422362, -1708860, -3794604, -5567352, 2036351, -3790309, -4326643, -4340065, 1305670, 1655173, -7405598, -4352413, 2884071, -1260036, -2712809, 1731946, -675921, -1686848, 534187, 2454037, 1813013, -3920232, 754304, -1194001, 4033511, -2030446, 8799851, 1981591, 5420786, 2090039, 4755603, -2118493, 3276523, 1774895, 389231, 182536, 6658273, 1129576, -1072131, 440771, 3514357, -2605435, 380105, -297963, -1372242, 742493, 8123394, 2331094, 3752728, -3926137, -2024003, --4140885, -2622078, -4019553, 3015604, 1906966, -2573222, -1829656, 1805497, -1915019, 2015413, --900869, -614717, -2779918, -4693863, 2019172, -7620883, -1075352, -1632625, -1926293, 406411, --1777043, 348966, 2869038, 1380832, -1952600, 345745, -1548336, -3325379, -535797, 1581622, --161598, -2570538, 932545, 459562, 973884, 1742683, 70330, 234613, -1203128, -741956, --176094, -32749, 632971, -1398549, -1182727, 8637179, 11900818, -3645354, 3200825, -5910949, --311922, 353798, 15205795, -1554241, -4014721, -6551973, 156766, 4363687, 6997039, -1575716, --9173513, -2639258, -3494493, -2505577, 3124052, -672699, 5844914, 651761, -3297461, -7422241, -2232846, -695248, 1731409, -894964, 845035, 3638374, 1341104, -9339406, 1131724, 6009196, -2962454, 739271, 1445793, -1500554, 4170950, -5522254, -531502, 4555887, -3134789, 537, -7409356, -3418794, -341987, -2508798, 4561256, -4789426, -3546032, 2216203, -4958540, -2449205, -6470905, 3798899, -5767068, -2130304, -858993, -1433982, -2624225, 2073932, -2251100, 2378875, --62277, 353798, 1051193, 4877472, -545998, 6724308, 3484829, -5164698, -2370822, -2521146, -4049081, 1203128, -262530, -2075543, 5418638, 2083059, -90731, -117575, -1342177, -1241782, -1615982, 622770, 1791538, 4219269, 1544578, -228170, 287763, 340376, 1380832, -280784, -533650, 2017561, 451508, 2496987, 96100, 884226, 1291175, 1530619, 562641, 969589, -1124208, 914291, 1449552, -438624, 456877, 984084, 1484448, -125628, -1102733, -1314797, -339302, 28390270, -10488847, 5761699, -8010114, -831076, 283468, -581968, -4245575, 2327336, -3267933, 796180, -3088082, -6575595, -245350, 4020626, 2856690, -2890513, -4950487, -397284, -4435628, 8100309, -4367982, -586263, -3297461, -7087233, 794569, -3565360, 2152852, -2639794, -5515812, -9678709, 6536940, -428960, -5761162, 1403381, 2428267, -683437, -3049964, 188442, -7573638, -286689, 1249299, -1072131, 2900714, 1333587, -1785096, -2845953, -6221797, 4033511, --1299765, -1835025, 2397666, 38655, -10459856, 8036421, -11258183, -6504191, -7971996, 1714766, --930934, 4775467, -2607582, 2537252, -4796942, 2303176, -1251446, -1970316, -5292474, 3237332, -3735011, 6368900, -1544578, -618475, 1734630, -1946694, -1137630, 1218697, 3693672, -4888747, -2420751, 3494493, 3903589, -6193343, -5043902, 2107218, -3149822, 1600949, -43487, -382789, -553514, 765041, -252866, 1446330, -1789928, 862215, -548145, 3601330, 227096, 871342, -826244, 216359, -1410897, -139050, 367757, -411780, -22416508, 2263448, 216896, -1921461, --3474629, 3899830, -3058554, 2588792, -824634, -57982, 3600793, 4695473, -2919504, 3454228, --1032403, -1932735, -6302865, -325881, -8508867, -6249715, 7452305, 2649458, -2913062, -1074279, --896038, 5169530, 2717641, -2683281, 4709432, 3129958, 1835562, 1620276, 1994476, 3586298, -3081639, 3044058, 8336532, 7504382, 3230352, 819265, -5209259, 5767068, -7730941, 1511829, --2165201, 6248641, -4735739, -6153078, 10539313, -2471217, -5669357, -5055177, 7841000, 4810900, -274341, 4027069, 5688148, 2603824, 9207873, -561567, -1468879, 5220533, 3185792, 295279, -193810, -4809827, 2864206, 2980171, 7430294, 3017752, 4621385, -2873333, -3838627, -8139500, --1881196, -4408247, -3509525, -3714610, 4090956, -159451, 301721, -2393908, -2768107, -778463, --2437394, 737124, -1647657, -2707977, 1088774, -279710, 84289, -2535641, -384936, 89121, --3191698, -450435, -774168, 196495, -1444720, -1664837, -1040993, -627602, 37581, -545998, -483721, -759136, 867583, 197032, 764504, 1725503, -420907, 1822677, 356482, 1191317, --864899, 358630, -1612223, -609885, -290447, -1933809, -615791, -960462, -29869350, 7989713, --6392522, -9442486, -9336722, 5761162, -6935299, 5086315, -8706972, 4763119, 4065187, 2491081, --9164923, 6244346, -131533, 3772055, -7596724, 4198868, 8942122, 6830609, 227096, -3231963, -1240172, -1957431, -9684078, -1978906, -4664872, 2189897, -6098854, 5197984, 5098663, -2044404, --245887, 7160784, -1595580, 4851166, -3942243, -6283001, 3241627, -130460, 3354906, 8813810, -5356361, -352187, -15425912, -7408282, -2160369, 2115808, -2391223, 8461622, -13404593, 4214437, -1795296, -157303, 4174171, -1756642, 6478958, -14052596, -6570226, 5413807, -14122389, -2636573, -6558952, 2334315, -3136937, -9427990, 3470871, 6047314, 4431870, -1702418, -9890236, -874026, -52613, -1142998, -549219, -4855461, 2167885, -7753490, 4731444, 645319, -4608500, 883690, --5538897, 395137, -6620692, -1870995, 2290828, 2408940, 192737, -659278, -2296197, -1739999, -439160, -3901978, 3100430, 214748, -1898376, -12885, -3369402, -2665027, 724776, -1402307, -1793149, -1788317, -1005022, -1181116, -1290638, -2290828, -403190, -1290101, -523986, 607201, --549219, -1047972, 811212, -438624, -894964, -921807, -2027225, -1434519, 247497, 1033477, --324270, -14036490, 1513976, 2340220, 10994579, -10384157, 12004970, 3404835, -971200, -2818572, --1298691, 1116692, -8783745, -1677722, 2808372, -2880313, -5159330, -1387811, 8297340, -8573292, --1874753, 8601209, 29528, -3400004, 3020973, -4172024, 6313602, 2790118, -92879, 3173444, --3684545, -5768141, -427349, 454193, 4717485, -10121627, -5481452, -4458176, -3148748, -2987150, --3090229, 1537598, 477278, 861678, -7584376, -7747048, -6189048, 245350, -9739375, -5344013, -5794448, -3911105, 1259499, 645856, -210453, 2455648, 3423089, 3317325, 3877819, 5763309, --1045288, 6234145, -430034, 3169686, -552440, -3947075, -271657, -6386080, 3932580, -7479149, -6980933, -8348880, -167504, -8611409, 780073, -8651138, -8404714, 4002910, 11471858, 3522410, --7470559, 5345624, -46171, -3232500, -2006824, -3387656, 4532264, 4000762, 5583458, 1070521, -4341675, -3652333, -450435, 4363150, 454193, 1391569, 795643, -2029372, 2525441, -167504, -905164, 3882651, 1061931, -879395, -2337536, -975494, 1515050, 1633161, 1183800, 519154, --1837709, 217970, -440771, -3913789, 3817689, 534187, 1353989, 270583, -1015760, -1800665, -1297617, -1835025, -992137, 39034272, 471373, -11252814, 1777580, -6109054, 15565498, -2545842, -4383014, 1139240, 759136, -13675176, -7004018, 7583302, 6670084, -10776073, -1887101, -328565, -9596031, 4714801, 3655554, 9401683, 1486059, 614717, 8169028, -2857227, -12424804, 1836099, -9512279, 5624797, -3593277, 186294, 6635188, 4038343, 1818919, -358093, -6968585, 3389803, --7580081, 750546, -14276471, 3739843, 4405026, -1161252, -6566468, 9062381, 4774930, -1884954, -7058779, 3246459, -5939403, 10880763, 1180579, -3865471, 2534568, 11157251, 1745367, -294205, --9306657, -5439039, 1313723, 3779034, 12730820, -4200478, -5034239, 1097901, 6953015, -4491999, --5507222, -501974, 9256728, 6615324, -2295660, -7104950, -362388, 8072391, -3205119, 16769700, -3665755, 2502355, -8575976, 7283191, 451508, -1859184, -4352413, 426276, -2425583, 445603, -10386842, 4727686, 3792993, 1978906, 1214939, 170188, -658741, 959388, 2103460, 3741990, -595927, 673773, 1393717, -2841658, 79457, 1232119, -621697, 3258807, -2291902, -64425, --1112933, 1283658, 5529234, 1887101, -1702955, -408022, 1332514, 471373, 1859721, -351650, --2356863, 2203318, 1990181, -1854889, -483721, 4867809, 1681480, 8798777, 4672388, -13883482, --1445793, -7026030, 13937706, -5244692, 6491306, 1231582, 8724152, 3431679, 1285269, -732292, -3538516, -4003447, -5934571, -16429324, -12155294, 3998615, 10798622, 14486925, -5346161, -7103339, --6242735, 3218004, -3425237, -758599, -594316, 1934346, 2201708, 9664750, -5166846, 889595, -2379949, 4709432, -4689031, -3497714, -7733626, -5259188, -5392869, -9221832, -23351200, -293668, --3131568, -10055592, 2249489, -1154809, -12665322, 4231617, -10740103, 2731599, -1305670, -902480, -5447629, 7035157, -202937, -10494216, 3084324, -6595459, -7252053, 10059350, 9106941, 10132902, --3310346, 1624035, 1351841, -5202279, 808528, -2510409, 15909096, -2647847, -1631551, -1596654, --107911, -9730785, -12016245, 2838974, -870805, -913754, 2725694, 17285632, -2128156, -8128226, --3409667, 9065065, -1312113, -2967823, -2601677, -205085, -7357279, 1763621, -1400696, 1358820, --3707631, 144418, -4667019, -416075, -278636, 1875827, -1945620, -984084, -2841658, 3847754, -268972, -2860985, 657667, 1258962, -3011846, 753767, 1225676, 4707821, -954020, 1069447, -3381750, 2044404, -1697586, 1979443, -3564286, -5905580, 753767, 530965, -2182380, -5508833, --1081258, -1383516, 4900558, 1766305, 3304977, -595390, 4115653, 4501126, -15300284, 5615133, -1836099, 16104517, -10882910, -6174016, -3633542, 8587787, -8251169, -7925826, 7107634, 4779225, --8346732, -8412767, -8243116, -18403934, 12037183, 11305965, 11983496, -5194763, 3769371, 11900281, --17304960, 4295, 11312407, 10495826, 4742181, -45634, -5559299, 1138166, -2692408, -14964740, -1867237, 4079145, 2166811, 9898289, -8765491, 926102, -16358457, -2087354, 3200825, -8987219, -3442953, 2742874, 7277822, 8916889, 12396349, -2553895, -4904853, -15009300, -10731513, 4614406, -22005264, -6848326, -943819, -10166188, -5407364, -8067023, 4719632, 4871030, -1721745, 711891, --16152298, -2135673, 10886131, -8720394, -7580081, 6467147, -2938831, 9467182, 2314987, -6966974, -1093606, -10522133, -3060164, -2782065, 20258286, -2034741, -5971079, 4440460, 4110284, -1785096, --3482682, -1038845, -2806224, -3773666, -3544422, -2688650, 1392643, 1575179, 3238405, -845572, --84289, -1956358, 1948305, 513249, -5239860, 1393717, -80531, -563178, 1847910, -115427, --2877628, -2811593, -6762426, 2244657, -2152852, 1988570, 2534568, -3161633, 1410360, 921271, --709743, 2555506, -25233, 7296076, 987843, -1318555, 138513, -2114198, -417149, 1276142, -170725, -629213, 557809, -2843268, 2245194, -9569724, 21889838, -10900090, -5649493, -513249, --802622, -15664819, 927176, -11553462, 8222178, -21650930, -3221762, -6967511, 7290170, -7490423, --7546258, -18325552, 12228309, -7570954, 4980552, -5936182, 3603478, 9663140, -7139310, -12031814, --4098473, 8137353, 16927002, 5408438, 7043747, 788663, -17198660, -9222369, -9306120, -4799626, -2919504, 15473157, 6616397, 8990977, 8404177, -2424509, -3690988, -5271536, -14388677, 727997, --10063645, 15447924, -7161321, 10624675, 2211908, -5634997, 3504693, -3767760, -4927401, -8490077, -12658342, 3286724, 21437256, 4661114, -23225572, -5822365, 7349763, 5973763, 3314104, -1358820, -1980517, 24178518, 12045236, -4146791, 2534568, -6575595, 17485348, -724239, -762894, 6782827, --15541339, -6728067, -5334887, -16596291, -19673634, 3835406, 6915434, -1886028, -9737228, -2580739, --3156264, -7638600, 34360, -1602560, -6090264, 5916318, 9074729, -2068027, -1440962, -1440425, --3692598, 2570001, 519154, -1102733, -1949915, -1655173, -1184874, 2958696, -1872606, -4377646, --1161789, -272730, 1272384, 796716, -2750927, 6409702, -2243047, 3866544, -885300, 3216931, -1609539, -1116692, -4531191, -4299799, 1325534, -1222992, -6789270, -2521146, -1771137, 2373506, -483184, -574452, 1722282, 2976412, 891743, -1902671, -2887292, -13333726, 8060580, 17949742, --1707786, -722628, -362925, 16687022, 5202816, 4039954, 2891050, 2019172, 2876554, -6501507, -1266479, -20558398, 3001109, -9879499, 8652212, 21131776, -2699387, 1588601, -16593069, 22274774, -10814191, 9495099, -2732673, -12164958, 1504312, -4114579, 11307575, 8142185, -10071698, 595390, -5978595, 4261682, -7791608, -6886443, 32583232, -7493644, -5650030, 6920803, -8265128, -5986648, -10375030, 10200010, 422517, 3961571, 3707094, -12541305, -6249715, -477815, 4311074, 11092290, -2743410, 2666101, -14219026, -1283122, 4213363, -19366008, 4271882, -5341866, -1951526, -3520800, -5724118, -5716065, -10538239, -11210938, -17837000, 2319819, -7226283, -3419868, 11433740, -3808562, -3711926, -20064476, -35433, 18608482, 4337380, -9295920, -5571647, 11331197, 5772973, -12283606, -6930467, -8876087, -6897718, -2875481, -1734093, 4275103, -1200443, 796716, -1917166, -2394444, -1486059, 2313377, -3148748, 2741800, 8179229, 1337882, -1127429, 3572339, 5164698, -2134062, -3510599, -2238215, -3189550, 959925, 2330557, 6867653, 1783485, -599685, 2463701, -971200, -3498788, -1917703, 3214783, -2393371, 1059783, 2905546, 813896, -4640712, -2694018, 8698919, --3674345, -6840273, 3391414, 1870995, 2524904, -1753957, 11043972, 3293166, -10327786, -10369125, -24533926, -14740328, 3798362, -9434969, 28929826, 6121402, 5319854, -9293235, -10993506, 1022202, -8238284, -8913668, -14198088, -8448738, -20629264, -8055211, -12127914, -52613, -27713814, 1908039, -14954539, 9201967, 12215961, -8581882, 3157875, 13276818, -1580011, 9620190, 3549254, 15009300, --7581154, 12513924, 9934259, 7105487, 16256451, -9148817, 9668508, -5008469, -5832029, -3866544, -3564823, -31614718, -10141492, -19657528, 22695680, -14343580, -16210280, -3476776, 12790949, 344134, --5818070, 17867600, -6429029, -5681168, -13015362, -31967442, 1513976, 2961380, 13282186, -13407277, -2684, -8176007, -10816338, 17086454, -3487514, 8558796, -18622442, -18096308, -11322608, 14246407, --1504312, -9024263, -9614284, -380105, -15800648, -10759967, 1495722, -6607807, -11793980, 17344688, --23834922, -22669912, 5893232, 105227, 9980967, 1160715, -1131724, -7302518, -6497212, 1078574, --11289858, -4518306, 9549323, 1293322, 1605781, -5541045, 5638755, 2131378, -6183143, 2906082, --4593468, -904091, -4709432, 4096862, -6253473, -1525250, 4197794, 8283918, 886374, 377957, --9015673, -2674691, -650688, 1350767, -1361505, 7691750, -354872, -2873333, 4854387, -5640903, --5265630, 3280281, 6949794, -1901597, -4986994, -6662568, 5343476, 4397510, 8628052, -11963631, --165893, 15846819, 2007360, -4900021, 8134131, -13025025, 25678536, 16091095, -242129, -11865921, --13416941, 5478231, -3447785, -1287953, -795643, 23420994, -11631845, 353798, -8121247, 8569533, --14696304, -13468481, -26441430, 6026913, -10802380, -14892799, -1902134, -25133612, -12404402, 6994891, -5247377, -3514894, 12949863, 1140314, 15716896, -7056632, -21885542, -3387119, -16059420, -3118683, --4890357, -20968568, 2637647, 16950626, -48029008, 5999533, 24696, 11818676, -2473901, -14989436, --28538448, 11272142, -3585761, 10531260, 6252936, -3531537, 16506633, -20711942, 28855200, -7323456, -16056735, 33717104, 13423920, 23974508, 9358197, 6249178, -3372086, 12495670, -4760435, -13191992, --17796196, -11485279, -687195, 9912248, -1723356, -7783018, -11080479, -9882720, 13284334, -6007049, --4912369, 11946988, 2094333, 8988293, -1023276, -1352378, -3733400, 2084670, 4452271, -6172405, --1082332, -15044197, -10927471, 7342784, -3742527, -411780, -2273648, -314606, -5812702, -9011378, -6429029, -5433134, 8379481, -8665633, -4058744, -981937, -6140730, -3067144, 4180077, 1751273, -10178536, -2594697, -6204081, 3859028, -12330314, 192200, 1414655, -1913945, 718333, -1372242, -5951214, 8683350, 1400159, -313533, -4274566, -7268159, -3601330, 418759, 14148696, 7131257, --7256347, 40425304, 32943472, 29687350, -6747931, 89121, -25183004, 18844170, 23369990, 7960722, -22574884, 9023726, 7681549, 7935489, -3976066, 3136400, 6253473, -5738613, -24264418, -14722611, --888521, -16112033, -18786724, -44126492, 9707163, 7644505, 11514807, -8436390, -3011309, -5857799, -318901, -13788993, -389231, -10502806, 12226698, 10188199, -6299644, -8542153, -23272280, 39223252, --12239046, 7758859, -13422, 2542621, 6259915, -16189342, 19552302, -9841918, 6684043, 4401805, --14609331, -15036681, -2787971, -1297080, 9082245, 41401876, -3457986, 6175626, 1371705, 12503187, -8882529, 9321153, -7311645, -2157147, 3578245, -19975356, 4065187, -17090212, -27332098, 9549860, -867583, 2193118, -20010790, -48067128, 20797306, 21751324, 14969572, -27247272, 25967910, 27624156, -10208064, 8036958, 243203, -7917236, -18166638, 13631152, -12801687, 863288, 223875, -7174743, -5485210, -13009456, -1366337, -2512019, 6452652, -3577171, -6013491, -8065412, 12421045, -6769942, --2967286, 3286187, -11174968, 6257231, 5073967, -3815542, -3918084, 1137093, -10382547, 9650792, --3491272, -2536178, -878321, 872415, 7063074, -5512591, -13127031, 3968013, -7323456, -2201171, --7505456, -6575058, 1012002, -5302674, -2474975, -4933844, 16830904, -7394860, -13702556, 2233920, --4927401, -23708756, -47311212, 39245800, 6303938, 6959995, -15766288, -11353209, -50333260, 13904957, -35982700, 11028939, -31880468, -15953656, 5170604, -12414066, -7881802, 14744086, -16598438, 9262097, -8264054, 6834904, -18476950, 6594923, 5713380, -8673686, -17292076, -10012643, -6659347, -4479114, --16495359, -14228153, -7827578, -17009144, 13406740, -6352794, -21950504, -7583839, 13460428, -2789045, --15221901, -8382166, -7770133, -57445, -12066174, -7279970, -19992536, -18996640, 8085813, -6760279, -24937116, 16389058, 1601486, 14881525, -21805012, 14095546, -20697984, 17390860, -2982855, 8895951, --9233106, 30904438, -7708930, 17307108, -4431333, 25421374, 10234907, 6186364, -26240102, 28460600, -22778360, 9921911, 10583336, -20463372, -3908957, 8378945, 13981729, -3624416, 3374234, -22602802, -14503568, 24800752, -547071, -17748416, -1036698, -11734388, -10053982, 4862977, -59056, -4896263, -5729487, -12948790, -3048890, 507880, 3688303, -8923868, -12266427, 4731444, -5976447, -11565273, --20772610, -1511292, 6445672, -1713692, -10462003, -12592307, -3875134, 8048769, -8677445, 3354370, -4646618, 1338419, 3415573, -1038845, -5583458, -4676146, -1569274, 5834713, 1941862, -2205466, --7798587, 10728828, -6905771, -5983963, -5041755, 2202781, 12422119, -8340827, 12232067, 10393821, --4118337, 3838090, 6514392, -32829656, 28046674, -3228205, 13476534, -18068928, -5818070, -4432943, --4152160, -4145180, 16408923, 574989, -13533979, 11053098, 1952063, 8010651, 13916231, 14088566, -799938, -11951283, 49597744, -13458280, 38157564, 437013, 2347737, -21415780, -9365176, 3745748, -18513456, 9297530, -5922223, 15288473, 3160022, -20649130, 3567507, 3258807, 21537650, -574989, -12929999, -15590194, 96100, 14748918, 7313793, 12386149, 32314260, 26058640, -3930432, 13642427, --1918240, 25606058, -20231980, 17206176, 6979322, -624918, 15304579, -7708393, 39567924, -6499896, -19172198, -14031658, -12659953, 979789, 42146516, 14024679, -38912940, 34936336, -581431, 12472048, --29299730, 10350871, 3517041, -58573152, 24864102, 45370960, 17424682, -18463528, -11716134, 9481140, -44580688, 25617332, 34020436, -11945915, -16279537, -14637785, 7300371, 9583146, -1336809, -16569447, --7346542, 21420076, 3971771, 5182415, -7035694, 10060961, -2248952, 4790499, -4289062, -5302137, --6531035, 13103408, 21578990, 21049098, 4925254, 11370926, 19857782, 13379360, 14078366, 19195820, -10931766, 18353468, 13959717, 5349382, -26927298, -4909685, -12424267, 8023536, 16176994, -17756468, --6150393, 21809844, 12064026, 2841121, -4665945, 18527416, -13861470, 3689377, 19085760, 15127412, -8558259, 10288594, 11790759, 9917616, 11691975, 7698729, -8935143, -4364761, -15902653, 20333986, -3195456, 13576928, -10773925, 27122718, -9361955, 12703976, 4294968, 5734318, 4068408, 2486249, --28151900, -16248935, 287226, 2678449, 19429358, 16071231, -22943178, 2469069, -12589623, -11423002, -5798743, 1530619, -7787313, 9643275, 37418828, -24625732, -1858110, 57242252, -34665216, 4187593, -20517058, -10379325, -8296266, 11927124, 18963892, -20448876, 10239739, -37165424, -3885872, 55640228, -2567854, 15817291, -5739687, 30438970, 30665530, -8360154, -375273, -14353244, 3677566, -10598369, --26933204, -17365090, -32163400, -23809152, 36144296, 14508400, 10817412, 47889960, -33740728, -20047834, -6291054, 17951352, -13131326, 8735427, -14075682, 26503706, 16112570, 9170292, 19696184, 69403448, --16193100, -5451387, -19128174, -22376780, -1153736, 29152090, -22575958, -3010772, 21099026, 22258132, -26743150, 15352361, -17524540, 4524211, -9533754, -2194728, 15757698, 4918812, -946503, 11460046, --20647518, 1332514, 774168, 5618354, -4311074, -5493800, 13222057, -4812511, -2735894, 14055817, -18618684, 14423574, 6840809, 6060736, 12450573, 3466576, 1393180, 8200703, 1307818, -4860293, -4126390, -231928, -787053, -23785528, 6232535, 15133854, 25426744, -5943698, -6563784, -8369818, -13197361, 14173929, -31609886, 3661997, -13788993, -2244121, 2310693, 1867237, 5508833, -8137890, --16961362, 13558675, -4235375, 31180926, -28660854, 7038378, -2245194, -9283572, -8478802, -4261682, -9414031, 5774584, 6332393, -1646046, 17335562, 2938831, -23131620, -18190260, -2689187, -10736344, --13391171, 2892124, 14296336, -2149094, -3496104, -21130702, 10151155, -3473018, 21310018, -7414724, --41590852, 4975720, -12479564, -6320581, -148713, -33645164, -17870286, -28907278, 303869, -2164664, --8311299, -38237020, -15750182, -3393024, 19733764, 22016002, 1543504, 1641751, 10516764, 2405182, --26469346, 22968948, 31077310, -13619341, 4491999, -13641353, 5408975, -124554, 23609972, -26794690, --19691352, -61269320, -21992916, 15446313, 24427090, 17573396, 15673409, -15080704, -5281199, 12244415, -11454678, 26616986, 12328704, 11393474, 20183662, 5213554, -22837414, -24104430, -33050848, 13733158, --21235928, 1897302, -18662706, -28230820, -43188044, 6155225, -12736189, -13331042, 3501472, 4132832, --1953673, -6085969, 559420, 14229764, 9470940, 3728569, -5804112, 10333154, 22708566, -4967667, --12955232, -10207527, 10952703, -5874979, -5542119, -20426864, -20270098, -15154792, -34383896, -1716913, --284005, -13442711, 5645198, 9379135, 6319508, 17144972, 4292283, 20211042, 912144, 5727339, -21648782, -10515154, -1013612, 3539053, -597537, -15057082, -987843, -2687039, 26148298, -1423245, --11465952, 8616778, 2874944, 8086887, 16579648, 5830955, -49035104, 20628728, -14633490, 1868311, -34892316, 29226716, -11558294, -4854924, 17967996, -11154030, -11784317, -9771051, 2408403, -3332895, --1327682, 4211216, -3858491, 17234630, 40954660, -17258252, -32133334, 32104344, -24906516, -6670084, -192737, 40056476, 3042448, -12059731, 11718281, 11201812, -41925860, -12257837, 6834367, -1577864, --19958176, -1449552, 7779797, -61438972, -28543816, 30506078, -30431990, -33718176, -20955146, 24925842, --32408750, -50516868, 50806780, -14940044, -31976032, -1803886, 19771346, -19446538, -34319472, -800475, -15450071, -1715303, -44120052, 10403485, -766652, -19646792, 46141372, 43639016, -3425773, -17670032, --34454764, 53194244, 7274064, 9467719, 18226768, -12975633, -51650204, 23306640, 39278012, 31627602, --19633370, 11483669, 42862164, 25068650, -29845190, -6446746, -23435490, 10602664, 6339372, 27172648, -26594974, -31977106, -1213865, -3224447, 4716411, -12338904, 12792560, -8028368, 7369627, 6904160, -5368172, -8884677, 6940131, -13353053, 22276922, -11157788, -5796059, 14421963, 12328704, -12707198, -1983738, -5810017, -15137075, -7821673, 5987185, 12129525, 7199976, -11927661, 6781754, -7562901, --18801220, 1214939, 3301219, -2701535, -1584306, 13077639, 765041, 1741072, 5968394, -1384590, -3198677, -19746650, 15066745, -50758460, 5582921, 47869020, 26055956, 6707129, -625992, -8649527, -12422119, -16860968, 39728448, -3016678, 10570988, 14702747, -13710072, 555125, -1760400, -15123654, --96637, 5771363, 22261352, -51540, -13881334, 6908992, 17900350, -2938295, 28395102, -22056804, -4565014, 6446746, 7370701, 24697136, -13562433, 2212982, -989453, -32135482, 4508642, -10477036, --17647484, 7567733, -6760279, 25336012, 18147848, -13216688, -28933584, 13758928, 2710124, 5831492, -16034187, 35152160, -6075768, 7328288, -14350559, 20200842, 14317273, 15118285, -16834662, 23132156, --8027831, -10011569, -20298552, -1743757, -8085813, 29940754, -22377316, 1680406, 7279970, -6740415, --13702019, 41787348, -1930588, 9979357, -3935801, 5108864, -3574487, 11780558, -1562294, -4995584, --3462281, -4384088, 13840532, 9786620, 13022341, 7401840, 4107063, -8892193, 9605694, 870268, -5303211, 4722854, 11704323, -1550483, 365609, 2008434, 3714073, 4006668, 8707509, -7131257, -5474473, 4938676, 4259534, 3738769, 2937221, 8693551, 3264712, -11121818, 6773701, 7933342, -8121783, 3686693, 8727910, 2549600, -594853, 5101348, 2811056, 6453189, -558346, -5464272, -1341104, 8888435, -4483409, 3778498, 410706, 9669045, 8522289, 3463891, 5975374, 9006010, -4098473, 16758962, -44322452, -124505736, -118375744, 51528872, 5108327, 113922400, 241282672, 52872120, -97284768, 51912732, -178860160, -80035640, -120267672, -176675088, -11775190, 20932596, -83414168, 74243880, -126297808, 77334648, 217448832, 133450536, 1306207, -20072530, -76833208, -191960880, -155448832, -66990216, --147242752, -43445204, 84325776, 25062208, 21416318, 199131328, 76914272, 48517024, 184385632, 8739185, --9211631, 84969488, -42204496, -151926944, -73450920, -151816352, -221653600, -24566676, -100628936, -82245400, -71108552, 137661216, 63807108, 243256752, 193936032, 112380504, 147317920, 49868864, -72028216, -111203144, --148099056, -237423648, -190202096, -127729640, -108671264, -33877092, 82819320, 125566056, 140120624, 188135680, -158572336, 74216496, 27159226, 40767828, -63394256, -97437240, -69020664, -145565568, -109362216, -18890340, --65227668, 25909928, 106700944, 38029788, 54522464, 77349680, 8389145, 4588636, -18709952, -72961296, --38030860, 562641, -28956132, 22456774, 31050466, -12600897, 39333848, 33607584, -52625696, 40310416, -47283296, -33292438, 76962592, 11638825, -75373992, 52791592, -41255844, -147731312, -24206972, -89821728, --108755016, 67185096, 8735963, 17026324, 142314816, 90204512, 100758856, 161437088, 119086024, 39277476, -17263084, -112615656, -204296560, -203641040, -203811232, -193120528, -117455008, 5947456, 111295488, 162829184, -223603520, 207243984, 196269264, 154291872, 26627724, -71069896, -77388328, -163993664, -202383696, -122074784, --108815144, -60921964, 11917461, 29442000, 36089536, 69954816, 62122944, 57802744, 82423640, 67642512, -43942348, 37842420, 10064719, -22348862, -38424924, -44301512, -45687716, -26032334, -13195750, -9221832, --8396661, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-12868796, 6489159, -2356327, 5675263, -2819109, -2884071, -5756867, 1356136, 1220308, -258235, +93416, -646393, -4403415, -512712, -2517925, -2896956, -2744484, -106837, 330712, -221191, +-495532, 2181844, -606127, -6664179, 4145180, 2057826, -2269353, 663036, -64425, 68183, +935766, 4279398, -2386928, 249645, -7549479, 3759170, 743029, 1695438, 2609730, 4236449, +-2370822, -1807108, -857383, -3801046, 304406, -576063, 3281892, -1769527, -224949, -1842541, +-2105608, 3991635, -3012383, -1461363, 375273, -2739116, 2282775, -107374, -1284195, 2466385, +4533875, 279173, -176094, -642098, 3876208, -3857954, 33823, -607738, 2028298, -954020, +-1765232, 4211216, -74625, 884226, -1171452, 869194, 2267206, -1823214, -2542621, 122943, +2213519, 3712462, -1674500, -1139777, 914828, 195421, 568009, -1711545, -550293, 1011465, +-230318, 709207, -1349157, -425739, -832687, -1169305, -842887, -788127, 591095, 98784, +-590558, 587874, 407485, -539555, -166967, -137439, -731755, -1319629, -369904, -5369, +270583, 706522, -15343771, 2608119, 1813013, 5377836, -2108292, 1629403, 6252936, -2422362, +1708860, -3794604, -5567352, 2036351, -3790309, -4326643, -4340065, 1305670, 1655173, -7405598, +4352413, 2884071, -1260036, -2712809, 1731946, -675921, -1686848, 534187, 2454037, 1813013, +3920232, 754304, -1194001, 4033511, -2030446, 8799851, 1981591, 5420786, 2090039, 4755603, +2118493, 3276523, 1774895, 389231, 182536, 6658273, 1129576, -1072131, 440771, 3514357, +2605435, 380105, -297963, -1372242, 742493, 8123394, 2331094, 3752728, -3926137, -2024003, +-4140885, -2622078, -4019553, 3015604, 1906966, -2573222, -1829656, 1805497, -1915019, 2015413, +-900869, -614717, -2779918, -4693863, 2019172, -7620883, -1075352, -1632625, -1926293, 406411, +-1777043, 348966, 2869038, 1380832, -1952600, 345745, -1548336, -3325379, -535797, 1581622, +-161598, -2570538, 932545, 459562, 973884, 1742683, 70330, 234613, -1203128, -741956, +-176094, -32749, 632971, -1398549, -1182727, 8637179, 11900818, -3645354, 3200825, -5910949, +-311922, 353798, 15205795, -1554241, -4014721, -6551973, 156766, 4363687, 6997039, -1575716, +-9173513, -2639258, -3494493, -2505577, 3124052, -672699, 5844914, 651761, -3297461, -7422241, +2232846, -695248, 1731409, -894964, 845035, 3638374, 1341104, -9339406, 1131724, 6009196, +2962454, 739271, 1445793, -1500554, 4170950, -5522254, -531502, 4555887, -3134789, 537, +7409356, -3418794, -341987, -2508798, 4561256, -4789426, -3546032, 2216203, -4958540, -2449205, +6470905, 3798899, -5767068, -2130304, -858993, -1433982, -2624225, 2073932, -2251100, 2378875, +-62277, 353798, 1051193, 4877472, -545998, 6724308, 3484829, -5164698, -2370822, -2521146, +4049081, 1203128, -262530, -2075543, 5418638, 2083059, -90731, -117575, -1342177, -1241782, +1615982, 622770, 1791538, 4219269, 1544578, -228170, 287763, 340376, 1380832, -280784, +533650, 2017561, 451508, 2496987, 96100, 884226, 1291175, 1530619, 562641, 969589, +1124208, 914291, 1449552, -438624, 456877, 984084, 1484448, -125628, -1102733, -1314797, +339302, 28390270, -10488847, 5761699, -8010114, -831076, 283468, -581968, -4245575, 2327336, +3267933, 796180, -3088082, -6575595, -245350, 4020626, 2856690, -2890513, -4950487, -397284, +4435628, 8100309, -4367982, -586263, -3297461, -7087233, 794569, -3565360, 2152852, -2639794, +5515812, -9678709, 6536940, -428960, -5761162, 1403381, 2428267, -683437, -3049964, 188442, +7573638, -286689, 1249299, -1072131, 2900714, 1333587, -1785096, -2845953, -6221797, 4033511, +-1299765, -1835025, 2397666, 38655, -10459856, 8036421, -11258183, -6504191, -7971996, 1714766, +-930934, 4775467, -2607582, 2537252, -4796942, 2303176, -1251446, -1970316, -5292474, 3237332, +3735011, 6368900, -1544578, -618475, 1734630, -1946694, -1137630, 1218697, 3693672, -4888747, +2420751, 3494493, 3903589, -6193343, -5043902, 2107218, -3149822, 1600949, -43487, -382789, +553514, 765041, -252866, 1446330, -1789928, 862215, -548145, 3601330, 227096, 871342, +826244, 216359, -1410897, -139050, 367757, -411780, -22416508, 2263448, 216896, -1921461, +-3474629, 3899830, -3058554, 2588792, -824634, -57982, 3600793, 4695473, -2919504, 3454228, +-1032403, -1932735, -6302865, -325881, -8508867, -6249715, 7452305, 2649458, -2913062, -1074279, +-896038, 5169530, 2717641, -2683281, 4709432, 3129958, 1835562, 1620276, 1994476, 3586298, +3081639, 3044058, 8336532, 7504382, 3230352, 819265, -5209259, 5767068, -7730941, 1511829, +-2165201, 6248641, -4735739, -6153078, 10539313, -2471217, -5669357, -5055177, 7841000, 4810900, +274341, 4027069, 5688148, 2603824, 9207873, -561567, -1468879, 5220533, 3185792, 295279, +193810, -4809827, 2864206, 2980171, 7430294, 3017752, 4621385, -2873333, -3838627, -8139500, +-1881196, -4408247, -3509525, -3714610, 4090956, -159451, 301721, -2393908, -2768107, -778463, +-2437394, 737124, -1647657, -2707977, 1088774, -279710, 84289, -2535641, -384936, 89121, +-3191698, -450435, -774168, 196495, -1444720, -1664837, -1040993, -627602, 37581, -545998, +483721, -759136, 867583, 197032, 764504, 1725503, -420907, 1822677, 356482, 1191317, +-864899, 358630, -1612223, -609885, -290447, -1933809, -615791, -960462, -29869350, 7989713, +-6392522, -9442486, -9336722, 5761162, -6935299, 5086315, -8706972, 4763119, 4065187, 2491081, +-9164923, 6244346, -131533, 3772055, -7596724, 4198868, 8942122, 6830609, 227096, -3231963, +1240172, -1957431, -9684078, -1978906, -4664872, 2189897, -6098854, 5197984, 5098663, -2044404, +-245887, 7160784, -1595580, 4851166, -3942243, -6283001, 3241627, -130460, 3354906, 8813810, +5356361, -352187, -15425912, -7408282, -2160369, 2115808, -2391223, 8461622, -13404593, 4214437, +1795296, -157303, 4174171, -1756642, 6478958, -14052596, -6570226, 5413807, -14122389, -2636573, +6558952, 2334315, -3136937, -9427990, 3470871, 6047314, 4431870, -1702418, -9890236, -874026, +52613, -1142998, -549219, -4855461, 2167885, -7753490, 4731444, 645319, -4608500, 883690, +-5538897, 395137, -6620692, -1870995, 2290828, 2408940, 192737, -659278, -2296197, -1739999, +439160, -3901978, 3100430, 214748, -1898376, -12885, -3369402, -2665027, 724776, -1402307, +1793149, -1788317, -1005022, -1181116, -1290638, -2290828, -403190, -1290101, -523986, 607201, +-549219, -1047972, 811212, -438624, -894964, -921807, -2027225, -1434519, 247497, 1033477, +-324270, -14036490, 1513976, 2340220, 10994579, -10384157, 12004970, 3404835, -971200, -2818572, +-1298691, 1116692, -8783745, -1677722, 2808372, -2880313, -5159330, -1387811, 8297340, -8573292, +-1874753, 8601209, 29528, -3400004, 3020973, -4172024, 6313602, 2790118, -92879, 3173444, +-3684545, -5768141, -427349, 454193, 4717485, -10121627, -5481452, -4458176, -3148748, -2987150, +-3090229, 1537598, 477278, 861678, -7584376, -7747048, -6189048, 245350, -9739375, -5344013, +5794448, -3911105, 1259499, 645856, -210453, 2455648, 3423089, 3317325, 3877819, 5763309, +-1045288, 6234145, -430034, 3169686, -552440, -3947075, -271657, -6386080, 3932580, -7479149, +6980933, -8348880, -167504, -8611409, 780073, -8651138, -8404714, 4002910, 11471858, 3522410, +-7470559, 5345624, -46171, -3232500, -2006824, -3387656, 4532264, 4000762, 5583458, 1070521, +4341675, -3652333, -450435, 4363150, 454193, 1391569, 795643, -2029372, 2525441, -167504, +905164, 3882651, 1061931, -879395, -2337536, -975494, 1515050, 1633161, 1183800, 519154, +-1837709, 217970, -440771, -3913789, 3817689, 534187, 1353989, 270583, -1015760, -1800665, +1297617, -1835025, -992137, 39034272, 471373, -11252814, 1777580, -6109054, 15565498, -2545842, +4383014, 1139240, 759136, -13675176, -7004018, 7583302, 6670084, -10776073, -1887101, -328565, +9596031, 4714801, 3655554, 9401683, 1486059, 614717, 8169028, -2857227, -12424804, 1836099, +9512279, 5624797, -3593277, 186294, 6635188, 4038343, 1818919, -358093, -6968585, 3389803, +-7580081, 750546, -14276471, 3739843, 4405026, -1161252, -6566468, 9062381, 4774930, -1884954, +7058779, 3246459, -5939403, 10880763, 1180579, -3865471, 2534568, 11157251, 1745367, -294205, +-9306657, -5439039, 1313723, 3779034, 12730820, -4200478, -5034239, 1097901, 6953015, -4491999, +-5507222, -501974, 9256728, 6615324, -2295660, -7104950, -362388, 8072391, -3205119, 16769700, +3665755, 2502355, -8575976, 7283191, 451508, -1859184, -4352413, 426276, -2425583, 445603, +10386842, 4727686, 3792993, 1978906, 1214939, 170188, -658741, 959388, 2103460, 3741990, +595927, 673773, 1393717, -2841658, 79457, 1232119, -621697, 3258807, -2291902, -64425, +-1112933, 1283658, 5529234, 1887101, -1702955, -408022, 1332514, 471373, 1859721, -351650, +-2356863, 2203318, 1990181, -1854889, -483721, 4867809, 1681480, 8798777, 4672388, -13883482, +-1445793, -7026030, 13937706, -5244692, 6491306, 1231582, 8724152, 3431679, 1285269, -732292, +3538516, -4003447, -5934571, -16429324, -12155294, 3998615, 10798622, 14486925, -5346161, -7103339, +-6242735, 3218004, -3425237, -758599, -594316, 1934346, 2201708, 9664750, -5166846, 889595, +2379949, 4709432, -4689031, -3497714, -7733626, -5259188, -5392869, -9221832, -23351200, -293668, +-3131568, -10055592, 2249489, -1154809, -12665322, 4231617, -10740103, 2731599, -1305670, -902480, +5447629, 7035157, -202937, -10494216, 3084324, -6595459, -7252053, 10059350, 9106941, 10132902, +-3310346, 1624035, 1351841, -5202279, 808528, -2510409, 15909096, -2647847, -1631551, -1596654, +-107911, -9730785, -12016245, 2838974, -870805, -913754, 2725694, 17285632, -2128156, -8128226, +-3409667, 9065065, -1312113, -2967823, -2601677, -205085, -7357279, 1763621, -1400696, 1358820, +-3707631, 144418, -4667019, -416075, -278636, 1875827, -1945620, -984084, -2841658, 3847754, +268972, -2860985, 657667, 1258962, -3011846, 753767, 1225676, 4707821, -954020, 1069447, +3381750, 2044404, -1697586, 1979443, -3564286, -5905580, 753767, 530965, -2182380, -5508833, +-1081258, -1383516, 4900558, 1766305, 3304977, -595390, 4115653, 4501126, -15300284, 5615133, +1836099, 16104517, -10882910, -6174016, -3633542, 8587787, -8251169, -7925826, 7107634, 4779225, +-8346732, -8412767, -8243116, -18403934, 12037183, 11305965, 11983496, -5194763, 3769371, 11900281, +-17304960, 4295, 11312407, 10495826, 4742181, -45634, -5559299, 1138166, -2692408, -14964740, +1867237, 4079145, 2166811, 9898289, -8765491, 926102, -16358457, -2087354, 3200825, -8987219, +3442953, 2742874, 7277822, 8916889, 12396349, -2553895, -4904853, -15009300, -10731513, 4614406, +22005264, -6848326, -943819, -10166188, -5407364, -8067023, 4719632, 4871030, -1721745, 711891, +-16152298, -2135673, 10886131, -8720394, -7580081, 6467147, -2938831, 9467182, 2314987, -6966974, +1093606, -10522133, -3060164, -2782065, 20258286, -2034741, -5971079, 4440460, 4110284, -1785096, +-3482682, -1038845, -2806224, -3773666, -3544422, -2688650, 1392643, 1575179, 3238405, -845572, +-84289, -1956358, 1948305, 513249, -5239860, 1393717, -80531, -563178, 1847910, -115427, +-2877628, -2811593, -6762426, 2244657, -2152852, 1988570, 2534568, -3161633, 1410360, 921271, +-709743, 2555506, -25233, 7296076, 987843, -1318555, 138513, -2114198, -417149, 1276142, +170725, -629213, 557809, -2843268, 2245194, -9569724, 21889838, -10900090, -5649493, -513249, +-802622, -15664819, 927176, -11553462, 8222178, -21650930, -3221762, -6967511, 7290170, -7490423, +-7546258, -18325552, 12228309, -7570954, 4980552, -5936182, 3603478, 9663140, -7139310, -12031814, +-4098473, 8137353, 16927002, 5408438, 7043747, 788663, -17198660, -9222369, -9306120, -4799626, +2919504, 15473157, 6616397, 8990977, 8404177, -2424509, -3690988, -5271536, -14388677, 727997, +-10063645, 15447924, -7161321, 10624675, 2211908, -5634997, 3504693, -3767760, -4927401, -8490077, +12658342, 3286724, 21437256, 4661114, -23225572, -5822365, 7349763, 5973763, 3314104, -1358820, +1980517, 24178518, 12045236, -4146791, 2534568, -6575595, 17485348, -724239, -762894, 6782827, +-15541339, -6728067, -5334887, -16596291, -19673634, 3835406, 6915434, -1886028, -9737228, -2580739, +-3156264, -7638600, 34360, -1602560, -6090264, 5916318, 9074729, -2068027, -1440962, -1440425, +-3692598, 2570001, 519154, -1102733, -1949915, -1655173, -1184874, 2958696, -1872606, -4377646, +-1161789, -272730, 1272384, 796716, -2750927, 6409702, -2243047, 3866544, -885300, 3216931, +1609539, -1116692, -4531191, -4299799, 1325534, -1222992, -6789270, -2521146, -1771137, 2373506, +483184, -574452, 1722282, 2976412, 891743, -1902671, -2887292, -13333726, 8060580, 17949742, +-1707786, -722628, -362925, 16687022, 5202816, 4039954, 2891050, 2019172, 2876554, -6501507, +1266479, -20558398, 3001109, -9879499, 8652212, 21131776, -2699387, 1588601, -16593069, 22274774, +10814191, 9495099, -2732673, -12164958, 1504312, -4114579, 11307575, 8142185, -10071698, 595390, +5978595, 4261682, -7791608, -6886443, 32583232, -7493644, -5650030, 6920803, -8265128, -5986648, +10375030, 10200010, 422517, 3961571, 3707094, -12541305, -6249715, -477815, 4311074, 11092290, +2743410, 2666101, -14219026, -1283122, 4213363, -19366008, 4271882, -5341866, -1951526, -3520800, +5724118, -5716065, -10538239, -11210938, -17837000, 2319819, -7226283, -3419868, 11433740, -3808562, +3711926, -20064476, -35433, 18608482, 4337380, -9295920, -5571647, 11331197, 5772973, -12283606, +6930467, -8876087, -6897718, -2875481, -1734093, 4275103, -1200443, 796716, -1917166, -2394444, +1486059, 2313377, -3148748, 2741800, 8179229, 1337882, -1127429, 3572339, 5164698, -2134062, +3510599, -2238215, -3189550, 959925, 2330557, 6867653, 1783485, -599685, 2463701, -971200, +3498788, -1917703, 3214783, -2393371, 1059783, 2905546, 813896, -4640712, -2694018, 8698919, +-3674345, -6840273, 3391414, 1870995, 2524904, -1753957, 11043972, 3293166, -10327786, -10369125, +24533926, -14740328, 3798362, -9434969, 28929826, 6121402, 5319854, -9293235, -10993506, 1022202, +8238284, -8913668, -14198088, -8448738, -20629264, -8055211, -12127914, -52613, -27713814, 1908039, +14954539, 9201967, 12215961, -8581882, 3157875, 13276818, -1580011, 9620190, 3549254, 15009300, +-7581154, 12513924, 9934259, 7105487, 16256451, -9148817, 9668508, -5008469, -5832029, -3866544, +3564823, -31614718, -10141492, -19657528, 22695680, -14343580, -16210280, -3476776, 12790949, 344134, +-5818070, 17867600, -6429029, -5681168, -13015362, -31967442, 1513976, 2961380, 13282186, -13407277, +2684, -8176007, -10816338, 17086454, -3487514, 8558796, -18622442, -18096308, -11322608, 14246407, +-1504312, -9024263, -9614284, -380105, -15800648, -10759967, 1495722, -6607807, -11793980, 17344688, +-23834922, -22669912, 5893232, 105227, 9980967, 1160715, -1131724, -7302518, -6497212, 1078574, +-11289858, -4518306, 9549323, 1293322, 1605781, -5541045, 5638755, 2131378, -6183143, 2906082, +-4593468, -904091, -4709432, 4096862, -6253473, -1525250, 4197794, 8283918, 886374, 377957, +-9015673, -2674691, -650688, 1350767, -1361505, 7691750, -354872, -2873333, 4854387, -5640903, +-5265630, 3280281, 6949794, -1901597, -4986994, -6662568, 5343476, 4397510, 8628052, -11963631, +-165893, 15846819, 2007360, -4900021, 8134131, -13025025, 25678536, 16091095, -242129, -11865921, +-13416941, 5478231, -3447785, -1287953, -795643, 23420994, -11631845, 353798, -8121247, 8569533, +-14696304, -13468481, -26441430, 6026913, -10802380, -14892799, -1902134, -25133612, -12404402, 6994891, +5247377, -3514894, 12949863, 1140314, 15716896, -7056632, -21885542, -3387119, -16059420, -3118683, +-4890357, -20968568, 2637647, 16950626, -48029008, 5999533, 24696, 11818676, -2473901, -14989436, +-28538448, 11272142, -3585761, 10531260, 6252936, -3531537, 16506633, -20711942, 28855200, -7323456, +16056735, 33717104, 13423920, 23974508, 9358197, 6249178, -3372086, 12495670, -4760435, -13191992, +-17796196, -11485279, -687195, 9912248, -1723356, -7783018, -11080479, -9882720, 13284334, -6007049, +-4912369, 11946988, 2094333, 8988293, -1023276, -1352378, -3733400, 2084670, 4452271, -6172405, +-1082332, -15044197, -10927471, 7342784, -3742527, -411780, -2273648, -314606, -5812702, -9011378, +6429029, -5433134, 8379481, -8665633, -4058744, -981937, -6140730, -3067144, 4180077, 1751273, +10178536, -2594697, -6204081, 3859028, -12330314, 192200, 1414655, -1913945, 718333, -1372242, +5951214, 8683350, 1400159, -313533, -4274566, -7268159, -3601330, 418759, 14148696, 7131257, +-7256347, 40425304, 32943472, 29687350, -6747931, 89121, -25183004, 18844170, 23369990, 7960722, +22574884, 9023726, 7681549, 7935489, -3976066, 3136400, 6253473, -5738613, -24264418, -14722611, +-888521, -16112033, -18786724, -44126492, 9707163, 7644505, 11514807, -8436390, -3011309, -5857799, +318901, -13788993, -389231, -10502806, 12226698, 10188199, -6299644, -8542153, -23272280, 39223252, +-12239046, 7758859, -13422, 2542621, 6259915, -16189342, 19552302, -9841918, 6684043, 4401805, +-14609331, -15036681, -2787971, -1297080, 9082245, 41401876, -3457986, 6175626, 1371705, 12503187, +8882529, 9321153, -7311645, -2157147, 3578245, -19975356, 4065187, -17090212, -27332098, 9549860, +867583, 2193118, -20010790, -48067128, 20797306, 21751324, 14969572, -27247272, 25967910, 27624156, +10208064, 8036958, 243203, -7917236, -18166638, 13631152, -12801687, 863288, 223875, -7174743, +5485210, -13009456, -1366337, -2512019, 6452652, -3577171, -6013491, -8065412, 12421045, -6769942, +-2967286, 3286187, -11174968, 6257231, 5073967, -3815542, -3918084, 1137093, -10382547, 9650792, +-3491272, -2536178, -878321, 872415, 7063074, -5512591, -13127031, 3968013, -7323456, -2201171, +-7505456, -6575058, 1012002, -5302674, -2474975, -4933844, 16830904, -7394860, -13702556, 2233920, +-4927401, -23708756, -47311212, 39245800, 6303938, 6959995, -15766288, -11353209, -50333260, 13904957, +35982700, 11028939, -31880468, -15953656, 5170604, -12414066, -7881802, 14744086, -16598438, 9262097, +8264054, 6834904, -18476950, 6594923, 5713380, -8673686, -17292076, -10012643, -6659347, -4479114, +-16495359, -14228153, -7827578, -17009144, 13406740, -6352794, -21950504, -7583839, 13460428, -2789045, +-15221901, -8382166, -7770133, -57445, -12066174, -7279970, -19992536, -18996640, 8085813, -6760279, +24937116, 16389058, 1601486, 14881525, -21805012, 14095546, -20697984, 17390860, -2982855, 8895951, +-9233106, 30904438, -7708930, 17307108, -4431333, 25421374, 10234907, 6186364, -26240102, 28460600, +22778360, 9921911, 10583336, -20463372, -3908957, 8378945, 13981729, -3624416, 3374234, -22602802, +14503568, 24800752, -547071, -17748416, -1036698, -11734388, -10053982, 4862977, -59056, -4896263, +5729487, -12948790, -3048890, 507880, 3688303, -8923868, -12266427, 4731444, -5976447, -11565273, +-20772610, -1511292, 6445672, -1713692, -10462003, -12592307, -3875134, 8048769, -8677445, 3354370, +4646618, 1338419, 3415573, -1038845, -5583458, -4676146, -1569274, 5834713, 1941862, -2205466, +-7798587, 10728828, -6905771, -5983963, -5041755, 2202781, 12422119, -8340827, 12232067, 10393821, +-4118337, 3838090, 6514392, -32829656, 28046674, -3228205, 13476534, -18068928, -5818070, -4432943, +-4152160, -4145180, 16408923, 574989, -13533979, 11053098, 1952063, 8010651, 13916231, 14088566, +799938, -11951283, 49597744, -13458280, 38157564, 437013, 2347737, -21415780, -9365176, 3745748, +18513456, 9297530, -5922223, 15288473, 3160022, -20649130, 3567507, 3258807, 21537650, -574989, +12929999, -15590194, 96100, 14748918, 7313793, 12386149, 32314260, 26058640, -3930432, 13642427, +-1918240, 25606058, -20231980, 17206176, 6979322, -624918, 15304579, -7708393, 39567924, -6499896, +19172198, -14031658, -12659953, 979789, 42146516, 14024679, -38912940, 34936336, -581431, 12472048, +-29299730, 10350871, 3517041, -58573152, 24864102, 45370960, 17424682, -18463528, -11716134, 9481140, +44580688, 25617332, 34020436, -11945915, -16279537, -14637785, 7300371, 9583146, -1336809, -16569447, +-7346542, 21420076, 3971771, 5182415, -7035694, 10060961, -2248952, 4790499, -4289062, -5302137, +-6531035, 13103408, 21578990, 21049098, 4925254, 11370926, 19857782, 13379360, 14078366, 19195820, +10931766, 18353468, 13959717, 5349382, -26927298, -4909685, -12424267, 8023536, 16176994, -17756468, +-6150393, 21809844, 12064026, 2841121, -4665945, 18527416, -13861470, 3689377, 19085760, 15127412, +8558259, 10288594, 11790759, 9917616, 11691975, 7698729, -8935143, -4364761, -15902653, 20333986, +3195456, 13576928, -10773925, 27122718, -9361955, 12703976, 4294968, 5734318, 4068408, 2486249, +-28151900, -16248935, 287226, 2678449, 19429358, 16071231, -22943178, 2469069, -12589623, -11423002, +5798743, 1530619, -7787313, 9643275, 37418828, -24625732, -1858110, 57242252, -34665216, 4187593, +20517058, -10379325, -8296266, 11927124, 18963892, -20448876, 10239739, -37165424, -3885872, 55640228, +2567854, 15817291, -5739687, 30438970, 30665530, -8360154, -375273, -14353244, 3677566, -10598369, +-26933204, -17365090, -32163400, -23809152, 36144296, 14508400, 10817412, 47889960, -33740728, -20047834, +6291054, 17951352, -13131326, 8735427, -14075682, 26503706, 16112570, 9170292, 19696184, 69403448, +-16193100, -5451387, -19128174, -22376780, -1153736, 29152090, -22575958, -3010772, 21099026, 22258132, +26743150, 15352361, -17524540, 4524211, -9533754, -2194728, 15757698, 4918812, -946503, 11460046, +-20647518, 1332514, 774168, 5618354, -4311074, -5493800, 13222057, -4812511, -2735894, 14055817, +18618684, 14423574, 6840809, 6060736, 12450573, 3466576, 1393180, 8200703, 1307818, -4860293, +4126390, -231928, -787053, -23785528, 6232535, 15133854, 25426744, -5943698, -6563784, -8369818, +13197361, 14173929, -31609886, 3661997, -13788993, -2244121, 2310693, 1867237, 5508833, -8137890, +-16961362, 13558675, -4235375, 31180926, -28660854, 7038378, -2245194, -9283572, -8478802, -4261682, +9414031, 5774584, 6332393, -1646046, 17335562, 2938831, -23131620, -18190260, -2689187, -10736344, +-13391171, 2892124, 14296336, -2149094, -3496104, -21130702, 10151155, -3473018, 21310018, -7414724, +-41590852, 4975720, -12479564, -6320581, -148713, -33645164, -17870286, -28907278, 303869, -2164664, +-8311299, -38237020, -15750182, -3393024, 19733764, 22016002, 1543504, 1641751, 10516764, 2405182, +-26469346, 22968948, 31077310, -13619341, 4491999, -13641353, 5408975, -124554, 23609972, -26794690, +-19691352, -61269320, -21992916, 15446313, 24427090, 17573396, 15673409, -15080704, -5281199, 12244415, +11454678, 26616986, 12328704, 11393474, 20183662, 5213554, -22837414, -24104430, -33050848, 13733158, +-21235928, 1897302, -18662706, -28230820, -43188044, 6155225, -12736189, -13331042, 3501472, 4132832, +-1953673, -6085969, 559420, 14229764, 9470940, 3728569, -5804112, 10333154, 22708566, -4967667, +-12955232, -10207527, 10952703, -5874979, -5542119, -20426864, -20270098, -15154792, -34383896, -1716913, +-284005, -13442711, 5645198, 9379135, 6319508, 17144972, 4292283, 20211042, 912144, 5727339, +21648782, -10515154, -1013612, 3539053, -597537, -15057082, -987843, -2687039, 26148298, -1423245, +-11465952, 8616778, 2874944, 8086887, 16579648, 5830955, -49035104, 20628728, -14633490, 1868311, +34892316, 29226716, -11558294, -4854924, 17967996, -11154030, -11784317, -9771051, 2408403, -3332895, +-1327682, 4211216, -3858491, 17234630, 40954660, -17258252, -32133334, 32104344, -24906516, -6670084, +192737, 40056476, 3042448, -12059731, 11718281, 11201812, -41925860, -12257837, 6834367, -1577864, +-19958176, -1449552, 7779797, -61438972, -28543816, 30506078, -30431990, -33718176, -20955146, 24925842, +-32408750, -50516868, 50806780, -14940044, -31976032, -1803886, 19771346, -19446538, -34319472, -800475, +15450071, -1715303, -44120052, 10403485, -766652, -19646792, 46141372, 43639016, -3425773, -17670032, +-34454764, 53194244, 7274064, 9467719, 18226768, -12975633, -51650204, 23306640, 39278012, 31627602, +-19633370, 11483669, 42862164, 25068650, -29845190, -6446746, -23435490, 10602664, 6339372, 27172648, +26594974, -31977106, -1213865, -3224447, 4716411, -12338904, 12792560, -8028368, 7369627, 6904160, +5368172, -8884677, 6940131, -13353053, 22276922, -11157788, -5796059, 14421963, 12328704, -12707198, +1983738, -5810017, -15137075, -7821673, 5987185, 12129525, 7199976, -11927661, 6781754, -7562901, +-18801220, 1214939, 3301219, -2701535, -1584306, 13077639, 765041, 1741072, 5968394, -1384590, +3198677, -19746650, 15066745, -50758460, 5582921, 47869020, 26055956, 6707129, -625992, -8649527, +12422119, -16860968, 39728448, -3016678, 10570988, 14702747, -13710072, 555125, -1760400, -15123654, +-96637, 5771363, 22261352, -51540, -13881334, 6908992, 17900350, -2938295, 28395102, -22056804, +4565014, 6446746, 7370701, 24697136, -13562433, 2212982, -989453, -32135482, 4508642, -10477036, +-17647484, 7567733, -6760279, 25336012, 18147848, -13216688, -28933584, 13758928, 2710124, 5831492, +16034187, 35152160, -6075768, 7328288, -14350559, 20200842, 14317273, 15118285, -16834662, 23132156, +-8027831, -10011569, -20298552, -1743757, -8085813, 29940754, -22377316, 1680406, 7279970, -6740415, +-13702019, 41787348, -1930588, 9979357, -3935801, 5108864, -3574487, 11780558, -1562294, -4995584, +-3462281, -4384088, 13840532, 9786620, 13022341, 7401840, 4107063, -8892193, 9605694, 870268, +5303211, 4722854, 11704323, -1550483, 365609, 2008434, 3714073, 4006668, 8707509, -7131257, +5474473, 4938676, 4259534, 3738769, 2937221, 8693551, 3264712, -11121818, 6773701, 7933342, +8121783, 3686693, 8727910, 2549600, -594853, 5101348, 2811056, 6453189, -558346, -5464272, +1341104, 8888435, -4483409, 3778498, 410706, 9669045, 8522289, 3463891, 5975374, 9006010, +4098473, 16758962, -44322452, -124505736, -118375744, 51528872, 5108327, 113922400, 241282672, 52872120, +97284768, 51912732, -178860160, -80035640, -120267672, -176675088, -11775190, 20932596, -83414168, 74243880, +126297808, 77334648, 217448832, 133450536, 1306207, -20072530, -76833208, -191960880, -155448832, -66990216, +-147242752, -43445204, 84325776, 25062208, 21416318, 199131328, 76914272, 48517024, 184385632, 8739185, +-9211631, 84969488, -42204496, -151926944, -73450920, -151816352, -221653600, -24566676, -100628936, -82245400, +71108552, 137661216, 63807108, 243256752, 193936032, 112380504, 147317920, 49868864, -72028216, -111203144, +-148099056, -237423648, -190202096, -127729640, -108671264, -33877092, 82819320, 125566056, 140120624, 188135680, +158572336, 74216496, 27159226, 40767828, -63394256, -97437240, -69020664, -145565568, -109362216, -18890340, +-65227668, 25909928, 106700944, 38029788, 54522464, 77349680, 8389145, 4588636, -18709952, -72961296, +-38030860, 562641, -28956132, 22456774, 31050466, -12600897, 39333848, 33607584, -52625696, 40310416, +47283296, -33292438, 76962592, 11638825, -75373992, 52791592, -41255844, -147731312, -24206972, -89821728, +-108755016, 67185096, 8735963, 17026324, 142314816, 90204512, 100758856, 161437088, 119086024, 39277476, +17263084, -112615656, -204296560, -203641040, -203811232, -193120528, -117455008, 5947456, 111295488, 162829184, +223603520, 207243984, 196269264, 154291872, 26627724, -71069896, -77388328, -163993664, -202383696, -122074784, +-108815144, -60921964, 11917461, 29442000, 36089536, 69954816, 62122944, 57802744, 82423640, 67642512, +43942348, 37842420, 10064719, -22348862, -38424924, -44301512, -45687716, -26032334, -13195750, -9221832, +-8396661, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -5057861, --1954210, 1161789, -951872, -2919504, -227096, 6715182, -3470871, 771484, -1473711, -89121, --2590402, 4829691, -2529199, -2690797, -3041911, 5757941, -3448322, -911070, -1639067, 1611150, -2646237, 3365107, -4782446, -23085, 4543002, 2006824, 762357, -263067, -588411, 2049236, -4631586, 1111323, -5990406, -3089692, -3231963, 5203353, -552977, 3968013, -2519535, 1833951, -5197984, -2552284, -3948686, 1386738, -1489280, -272730, -3535295, -1429150, -2646774, 989990, --4786741, -1582159, -1239098, -161061, 6432788, -2114198, -988916, -238371, -1709934, -676457, --628139, 3898220, 2002529, 2388002, -3374771, 2455648, 2567854, -2292439, 1051193, 1527398, --1745904, -2350421, 2725157, -4117263, 2887292, 1751273, 751082, -3815542, -1338956, 1417876, --354872, -794569, -1045825, -91268, -2062658, -2376728, -382789, -392453, 267899, -893890, -3221, 1407139, -70330, 523986, 183610, 278099, -2147, -275415, -1045825, -619549, -687732, -365609, 18254, -140660, -3170223, 3351148, 390842, -1446867, -2164127, -591095, --1102196, 3758, -2681670, -2057826, 1512365, -424128, -1034550, -4678830, -705985, 4351876, --2940979, -733903, 3270618, -1890859, -3519189, -2678449, 2226941, 19327, -352187, -674847, --3376381, 1133335, -1509681, -790274, 3794604, -2093797, -5169530, -1537061, 273804, 1546188, -1342177, 443455, -3931506, -904091, -4786741, -4336843, -1182727, 4545149, -801011, -8981313, --419296, 3026341, 2611340, -1853278, 1751273, 1933272, 164283, 2673080, -4855461, -3423626, --471910, 1406065, 204011, 1002875, -539018, 1268089, 1130650, 1870995, -300648, 1154273, -1077500, -901406, 1836635, -457951, -4738423, -3864397, -2525978, -1992328, -2139968, 646929, --1095754, 3658239, 3001109, -557272, -1480153, -1268626, -698469, 1100585, 1704028, 220117, --1031329, 186831, 219580, -997506, 1276679, 9664, -321586, -498216, -131533, -741419, -497679, -144955, 76236, -858457, 491237, -540092, -16643, 8053, 333397, -141734, --432181, -164283, -831613, -313533, 60130, -396748, 47245, -672162, 4108673, 2295123, -6155225, 405338, -1218697, -764504, 4352413, -1194001, 2331094, -3998078, -432181, -113280, -2280628, 1585917, 3901978, 2746095, -2021319, -3946538, -3228205, 2192044, -1382980, 2997350, -1877438, 392990, -207769, 2490544, 1745904, -1825898, 2044941, -4248797, -605054, -3939022, --3381750, -4738960, 1363115, 2688650, -518617, 3743601, -2935610, 3467649, -7058779, 2698313, -1180579, 5198521, 1506997, 1862405, 2789581, -133681, -1815697, 1937567, 4524748, 1538672, -2181307, -741419, -100395, -6452652, -449361, 1018444, 1219771, -952946, 3417183, 6453189, --2181844, -4655745, 3074660, 678605, -3315178, -59593, -1548873, -3323768, 386010, 4641786, -1140851, 1684701, 760746, -501974, 1744294, 1086090, -114890, 1523640, 72478, -427349, --367220, -882616, 876710, -1293859, -185220, 2154463, -493921, -54224, 799938, -512712, -1446330, -2060511, -951872, 28991, -847719, -900333, 192200, -506806, 679679, 1578937, --622770, 891206, 211527, 91805, -5906, 219043, -1804423, -459025, -430570, 347892, -1433445, 863288, 2265059, 3387119, 3258270, -3156264, 4973036, -1770063, -3306051, -4885526, -1132261, -6461242, -405338, 670552, 1785633, -4121558, 2661269, -67109, 591632, 1724429, -1058710, 1459215, -5562520, -374199, -1260036, -3629247, 2119566, 1066763, 832150, 3112241, -10954314, -808528, 562104, 1561221, 2706366, 1071058, -8993662, 1867237, -1494649, -1033477, -4924717, 143881, 2450279, 3551938, -4437238, -2477123, -1280437, -4305705, -9229885, 434865, --3479461, -557272, -804770, -191126, -2139968, -4518306, 1282585, -4323422, -1372242, 973347, --4818417, 4987531, 1722282, 1417339, -2024003, -370441, -788127, 991064, -1552631, 2560338, --3951907, 1312649, 6011344, 4977867, -1738925, 2531346, -2365990, 1072668, -4480725, -148713, -2790655, 3216931, 2880849, -497142, 5362267, 489089, 2681670, 2392297, -91268, 1114544, -587337, 199716, -903017, 537945, 838592, -323733, 98784, -605590, -1468342, -230854, -1012002, -789200, 2166811, -599148, -1117228, -958315, 764504, -541166, 952409, -181999, --902480, 541166, -244813, 1115618, 687732, 654983, 456877, -1937030, -448287, 263067, -839666, 29528, 171262, -519154, 7312719, -9306120, 379568, -5735929, 2913599, 4210142, -5136244, -813896, -4907537, 110059, 5059472, 1067299, 955630, -3830574, -526134, -6696391, -8864812, -486405, -6852084, 7387881, 1838783, 2179159, -497679, -2685428, -888521, -3541738, --3494493, 2720862, 3866544, -805843, 3647501, -3033858, -1902134, -14496, 5096516, 4825933, --1373853, -2742337, 3964255, 2525978, 357556, 3356517, 786516, -3973382, 4150549, 2586644, --328565, -1389422, 1134408, -4281546, 11356430, -601832, -422517, 8461086, -786516, -5196911, --2828236, -624381, 2049236, -5400385, 3671123, 1101659, 111669, -4903779, -4138201, -8657580, --779537, 4022237, 1991791, 4880694, -2726767, -1930051, 10227391, -2855617, 1697049, -1432909, --4259534, 318364, 1858647, -4438849, -7871602, 318901, -4859756, -4896263, -2404645, 2543158, -213138, -746251, -3019362, -1036698, 329639, -1131187, -850940, 796716, 2783139, 387084, -689342, -1987496, -1025960, -212601, -33823, -2800856, -2062658, -1780801, -119722, 670015, -258772, -916976, 53687, -184684, -296890, -1472100, -551903, -218506, -574452, -773631, --9816685, -150324, -4153234, -4692252, 1365800, -5627481, 113280, 3776887, 2036351, 7960185, --13394929, 8528731, -1467268, 3704409, -2603824, -1956895, -7062000, 6203544, 5465346, 1341104, --6283537, -388695, -3655017, -476205, 6445136, 4475356, 947040, 6142340, -137439, 272730, -557809, -261456, -4379793, 9205726, -977642, 40802, 10699300, -6981470, 2520609, -3353833, --749472, 3351685, -1518271, -5516886, 10296647, 8020852, -340913, 2573222, 4287451, 11131481, --1497333, -2059974, -6113886, 1017907, 2075006, -6462852, -6892886, -6065568, 7172596, 121870, --3008088, 4916127, 3482682, 22012, -1759326, 1573032, -3940633, -1036698, -4283693, -993748, -3971234, -7878581, 1822140, -1683627, -5463736, 3291556, 5196911, 2198487, 5413270, 4687420, --4023311, -6423661, -3216394, 2788508, -2543158, -4942971, 3170760, 5349382, -3920768, 646393, -1132798, 581968, -3661997, 2110440, -1636383, -1303523, -2353105, -1240709, -1843615, -195421, --213138, 695248, 1122060, -936840, -807991, -367757, -1464047, -858457, -399432, -588947, -1150514, 1443109, 367757, 2128156, -1977833, 1437203, -1716376, -781147, 1472637, 7350300, -7799124, 1292785, -6720550, -924492, -6382859, 2662343, 16794396, 4145717, 11637751, 4276177, -149250, -10854456, -2664490, 1788854, 10512469, -4647155, -2311766, -4047470, 1011465, 8449274, --6180458, 4137127, 7315403, 1626182, 2695092, -4783520, 9039296, -1934883, 11771432, -110059, --3593277, -11041824, 1358283, 41339, 13175349, -3973919, -1068373, 8352638, 67109, 1106491, --2709588, -8634495, 931471, 4973572, -6194954, -4889284, 1297617, -10355166, 5689221, 5748814, --1740536, -673236, 2927557, 5863167, -490700, -3608310, -130997, 8609799, -1093606, -1323924, --3250217, 11146514, 11292543, 763430, -2041183, 1758789, -476205, 2942053, 5222144, -431644, -7540352, -2935610, -4180614, -6099928, 2067490, -500901, -9272834, -6693170, -3847217, 7294465, --2130304, -3417183, -937377, 1074, -3143379, -4754529, -1665911, -1395328, -2834679, 462783, --1777043, -1564979, 1499481, -3022046, -3111167, 976568, 2498597, -1507534, -2003602, -1520418, --2613488, -1257352, 815507, -907312, 449898, 1374926, -459025, -778463, -2305324, 1421097, -200253, -7406134, 7508677, 5712844, 442382, -4913443, -5517423, -2401424, -10961293, 12730820, -9576703, -2052458, 3549791, 1148904, -2091649, 9652939, -774168, -4489315, 14289893, -15483894, -3999688, 6670084, -53150, -6332930, 6810745, 1051730, 9847823, -3811247, -1058173, 2623688, -3934727, 663572, -1345935, 14325327, 6180995, -6551973, -9891310, 6879464, -9895605, -2874944, --11392938, -1479616, 17057462, 6975027, 8246337, 56371, -9049496, -1510218, -4421669, -1970316, -12757127, -1991791, -14058502, -1139240, 2759517, -8948564, -1483911, 5763846, 4539244, -6016713, --3140695, 6156299, 8153996, -2374043, 8494372, 147103, 2136209, 3174518, 720481, 3332895, -5095979, 4926865, 4799089, -2529199, -10199474, -11272679, 2810519, -2268817, 8057896, -1447404, -9563282, 3231426, 4449049, -5098126, -4545149, 3403762, -176094, 693100, 893353, 419833, --4571993, -2100239, -707596, -3803194, -111669, -3267933, 587874, -1847910, 1409286, -464930, -2441152, -5369, 1336272, 426276, -1227287, -1074279, -1470489, 3018825, 347892, -898185, -960999, 1559073, 1307281, 291521, -2236604, -6256157, -3543885, 22012, -3025268, -76773, -6189048, -877784, 5767604, -11780022, 4110821, 3243237, 1635846, -7742753, -6492380, -8242042, -6278169, 3228205, -5915244, -5901822, 7913477, 2518998, -725850, -4980552, -8179765, -3384971, -3204046, -5264556, 529355, -9800042, -2809982, 1051193, 3237869, 6263673, -1116692, 3965329, -5439039, -5730560, -13600014, 9205189, 331249, -2238752, 8752606, -1464047, 255014, -6062347, -7679402, -5070209, -6412923, -2569464, 6277632, 9574556, 8030515, 2423435, 1538672, -17186848, -7662759, -1145146, 3164854, -6010807, -1216550, -6714108, -2394981, -1730872, -8876624, -4532801, --3697430, -4917201, 8995272, -3040300, 11729556, -1526324, -766652, 7309498, 8365523, 14154602, -9684078, -310311, -4726075, -655519, -78383, -6956774, 1629403, -4532264, -7605850, 14470282, --9360344, -9951976, -1524177, 5368172, 709743, 1646046, 633508, 6059662, -175020, 1628330, -2102923, -2427194, 286689, 3710315, -2165737, 1501091, 2645163, 2163053, 4648765, 1008780, -20401, 2543158, 410706, -918049, 1697049, 2635499, 1015223, -37044, 780610, 398895, -5405217, 412317, 4394289, 2921115, 633508, 4625143, 5073430, 490163, -171262, 669478, -683437, 603980, -461172, -624918, 1271847, -3187403, -4567698, -18160732, 4028143, -12496207, --7475928, 11832635, 9206262, -20737176, -19010598, 646929, 8124468, -4820564, 5017059, -6843494, --761283, -12038793, -3139084, -10868415, -772020, -2974265, 354335, 4176856, 3429532, 6767795, --834297, -5772436, 5021354, -6884296, -2754148, 2207613, 440771, 3506841, 7187628, -1162862, -910533, 1650341, -2910914, -765041, -10518912, -12465606, -12062416, 9127, -12134893, 4064113, -1598265, -4800163, -5645198, -2432562, -2020782, -1047972, -7227356, -11418171, -651224, 18113488, -9980430, -2562485, -10831908, -11188390, 12498355, -11750494, -3883724, -2099702, -7847979, -5957657, --7999914, -9361418, -13019656, -17609902, -2543158, -2850785, -2518462, 5881421, 5564667, 1445257, -4873714, -4011500, -4903779, 16252156, 6868727, -4362613, -12016782, 3699041, -7121056, -8446590, --55298, 13623099, -2739652, -144418, 9360881, -1090385, -6288906, 231928, 2206540, -228707, --2594160, -2508798, -102542, 2268280, 1092532, 1500554, 913217, 4625143, -1404991, 2466385, --6772090, 3071439, 1597728, -1255741, 1395864, -1462436, 2444910, -1267552, -1996623, -1179505, -2217814, 1897302, 223875, 2556043, -3856881, 3778498, -1939715, -2362769, 1159104, -14951855, -1668058, 7480223, 8129300, 7534983, 3158949, 14899778, -5942088, -10921565, -2890513, 1871532, --2248952, 4708895, 9898289, 20030116, 12580496, 7314866, 9305047, -7798587, -14871324, -5138392, --11153493, 12539157, 2799782, -2717104, -9059160, 14235132, 12224551, -4612258, -969052, -127238, --7470022, -6247030, -11207180, 3242164, 3776350, 6275484, -10601053, 893890, 2938831, -4865661, --10303627, 230854, 5882495, 7792145, 1260573, -20108500, -7230578, -9959492, 4031364, 11869142, --80531, -11318849, 2605435, -10929081, 5939403, -2713883, 887448, -7776039, 16085726, 12681965, --4077535, -3818763, -9404368, -710280, 12842489, 2890513, 15800111, 15229954, 12681965, 7425462, -2539400, -10295573, -5774047, -13674102, 15622407, 15706695, -1336272, -12084964, 7665443, 18259516, --293668, 2276333, -4489852, -477278, -12087112, 1869921, -9545028, 6465000, 2229625, 9113384, -9055402, 4910758, 704912, 779000, 5581310, 2032593, -1367947, -3736085, -1263257, -5683853, -940061, 4367445, -3771518, -2122788, -4308926, 3077881, -1005559, 6600291, -6327024, 1674500, --256624, 6286222, -3091840, 2073932, 3784403, 684510, -244813, 223338, 1080184, -2901251, --1199370, 3767223, -9881109, -2465311, 7269769, 12656732, -13233868, -16072841, -13888314, 15312632, --6336688, 10242423, -150861, 185757, 24614994, -2947958, 1810866, -10873247, -16985522, 4265977, --2536178, 4609574, 2984466, -1331440, -9720048, 2783139, 3627637, 1738925, -9177808, 6111739, -4417911, 17992692, -8283382, 1268626, 9810779, 10077604, 387621, 10176388, -2561411, 446140, -9054865, 7693360, 2049773, -3912715, -14452028, -10918881, 8479339, -197569, -3308199, -2831994, -2151242, 19448148, -1196685, -6742025, 9885404, -4728222, 9343701, 2282775, 28003724, -5464809, --899796, -48318, 4164508, 9580998, -1864553, -3244311, 6230387, -13125420, 10721312, 19720880, -5841693, -4119948, 11001559, -4179003, -578210, 22306450, -12873628, 4948876, 8761196, -3729642, -18572512, 4463008, 3991098, -7117298, -10688563, 1916629, 4862977, -11460583, 11678016, 1074, -2957085, 77846, 3409130, 10781979, -2443300, 10879152, 5160403, 3595425, 6062347, 5416491, --3155190, 6866579, 6383395, -5576478, 2117419, 4732517, 8702141, 2075543, 2510945, 4358318, -5097053, 7748121, 794032, 278099, -459562, 5310190, 4493073, -4856535, -73551, 3518652, -4951024, 3900904, -2900714, 7386270, -199179, 2573222, 911070, 6104223, 3109020, 2858301, -2923262, 4232154, 2381023, 2822331, 4878009, -13969918, -3978750, 9625559, -4614406, -7272990, --6487011, -6656126, 1244467, 9680856, -1183264, -21363168, 59593, -16221555, 6373732, 7042136, -182536, 3354906, -7106561, -866510, 8696772, -20455318, 5266704, -4422743, 11496554, 7982734, -5199058, 957241, -8125005, -18453326, -933619, -16119012, 10057740, 204011, -4836670, 17115444, -8893267, -6724845, -5342403, -3473018, -2547453, -4683662, -9129490, 1737851, 2685965, 24731496, --780073, -17540646, 39192, 12128451, 937377, -8986145, 5776731, -13600551, 9192841, -5693516, -6106907, -7879655, 3730716, -13909788, 36914708, 1488206, 25516938, -2371359, -6942278, 6709276, --8179229, -7978976, 14234595, 13902809, -12058658, -31984622, 30575872, -10618770, -8339753, -3915937, --4256313, 4139812, -2779918, 2461016, 13188234, 3246459, -10620380, -8515846, -6427419, 4022774, --6720013, -892279, 6142340, -16566226, -1415729, 1132798, -2593624, -4815732, 1883880, -3394635, -9088688, -3534221, 4050154, -4003447, -2945274, 272194, -4213363, 2496450, 2162516, -1698660, -2288681, -3834332, 1901060, -981937, -294742, -1700807, 52076, -6914898, -5093831, -947577, --2838437, -5654325, -7548942, -4204773, -1843078, -2978023, -642635, -5015448, -5906, -4451734, --1295470, -5811628, 3140158, -3215320, -1800128, -15748571, -5591511, -4791573, -13540421, -23845658, --5885179, 374199, -12664785, 6190122, -5419175, 10596221, -9138080, -3827890, -13020193, 31026306, -26249230, -5898601, 5853504, 18022756, -18961206, 19216758, -7998840, -8022462, 6928319, 2528662, -3284576, -2838437, -4181151, 531502, 6222334, 5366562, -8431558, 9648107, -9086003, -15124190, -10965052, 9642202, -12590160, -15648176, -18080738, -2659122, -2997887, 5049271, -11809013, -14803142, --7558606, 24748138, 8662412, 8412767, -10608569, 9539659, 13028246, -10181757, 24322936, 4503810, --8705362, -11419781, 6509560, -9594420, -20802674, 5051419, -237834, 450972, 11370389, 10573136, --9142375, 1720134, -26659936, -3330747, -10514617, 22044994, 1316944, 3091840, -12859132, 10416369, --22648436, -2774549, 8860518, 2532420, -2462627, -2607582, 2745558, -1069447, 2554969, -3411278, -636729, 1855426, 5388574, 1313723, 1717987, -1255204, 3199214, -3347390, 1029182, 10029286, --1975685, 427886, -3216394, 4454955, 2086817, -561030, 5265630, -5564667, -5258651, 5688684, --4796942, -1806571, -4394289, 2394981, -6427419, -2927557, -2092723, 5136781, 5181341, -8295730, -1305670, 4202626, -2839510, -9352291, -4500052, 6880001, -4510253, -11534135, 14614163, 15399068, -13935558, 9400073, -119722, 12763569, 11574400, 1935420, -2191507, 5143224, 34360, -13014288, --1548873, 4940823, -10174778, 14532022, -15152108, 12133819, 13215077, -3802120, -2980707, 5601711, -17633526, 13209709, -15935939, -3479461, -4264366, -1271847, 3984119, -7435126, -7784092, 17297980, -434865, 24841554, -16222091, -15387794, 12508555, -8287677, 4512937, -9751186, 8352101, 9528922, -6292664, -3893925, -14251775, 1410360, 4746476, -11857331, -21774410, -753230, 1992865, -12857521, -23539642, -2686502, -6660421, 31261994, 29456496, 2939368, -4080756, -1099512, -6271726, 7087233, --15428059, 14471892, 1928440, -8399882, 17501454, 2804077, 3560528, -4990752, -9478993, -23481660, -5171141, -7999377, -3854196, 10828686, 4408247, -5156645, -15328201, -4246112, -17457432, 7464117, -15738371, -2223719, -11855183, -8305393, -11821897, 130460, 6400575, 7639673, -1597728, -8389145, --4348118, -4578972, 1121523, -2544231, -4005057, 3371013, -616865, -2481417, 4152697, -9483288, -2723546, 2445447, 14666240, 1323924, -3237869, -7504919, 6473590, -7840463, -1015223, 5478768, --10401874, 9699110, 2083596, -421981, 1996086, 6557342, -3303904, -10290742, 250182, -3061775, --1294933, 9882183, 9427990, -25803626, -59762860, 20028506, 18977312, -6685117, 4234838, -14391899, -25785910, 16489453, -14622216, 4163434, 3506841, 367757, -6580964, -4744865, -30822296, 13034152, -15215459, -3518652, -9664, -1730872, 10239739, -7730941, 19542102, 5789079, -23227720, -13166759, -29498910, 19362250, -19222664, -4525822, -6831683, -11775727, 1840930, -4705674, 4210142, 38318624, -10451266, 40148816, 22943178, 25872882, 23590108, 46243912, -3026878, -4296578, 11071352, -3271691, --38784628, 31447750, -13616657, 18032420, -25632902, -20395726, -38289632, 7603703, -3514894, -12861816, -9358197, -18006650, 82141, -25722560, -25673704, 7203197, 15018964, -20876762, -5521181, -14475650, --20080046, -22569516, -16195785, 12339978, -9774809, -28177670, 40484900, 25356414, 40819368, -5328981, --8765491, -8124468, -14380624, -23145042, -1461900, -5089000, -17493402, -5848135, 5172751, -12408161, --11167989, 1291175, -1813550, -5530844, -4517232, 10066866, 10748693, 337155, 2729989, 7628399, -9584220, 1945083, -777389, -1472100, 4522064, -1915555, 1151588, -1762010, -6700686, -181999, -6379100, -6610492, 8704288, 10959683, 4660577, 357019, 1821603, 1156957, -7277285, 601832, -4195646, -3760781, 89121, -1719061, 1232119, -2607582, 1009854, 4076998, -5561983, -4766877, -8859444, 3598646, -1075352, 1345399, -21578990, -56873956, 24888798, 29694330, -13180181, -5640903, --1299228, 33602212, 1261647, 7327214, 7237020, -7679939, 6828998, 15749108, -2934000, -14794015, -3919695, 28606092, -14877767, -9246528, 6416681, -3790309, 21468394, -5149666, 9781788, -10789495, --12984760, -12978317, 14137959, -4022774, 12571906, 14615237, -3541201, 2079838, 277025, -11616813, -4098473, -10521596, 12819941, 31114354, 51002736, -456340, -1261110, -21341692, 11815455, 16802986, --312459, 18849000, 26894548, 11404212, 15374372, -23256712, -13879187, 19634980, 50960324, -9131637, --29615946, 7763691, -9718974, -370978, 13953812, 424665, -13405667, -6336688, -6827925, -34368328, --14245333, 388695, 5917928, 12206297, -1794223, -13118441, -7459822, 3417720, -5194763, -13176960, -13930726, 33380486, 14562623, 18052822, 2022393, -4379793, -26831198, -5820755, 7864085, 6131066, --5862631, 15481746, -4145717, 8730058, -18724446, 1247688, -6333466, -5294084, 369904, 5399848, -5334350, -5188321, -10101226, 10105521, -3714073, 8327942, 922881, -1921461, 863288, 1899449, -7759932, 393526, -1013075, -3775276, -4147865, 6658810, 2349347, 6147172, -12680891, 9097278, -5368172, 2575370, -4475356, -1569811, 9536975, -989990, 557809, -7070053, 863288, -10919954, --2145873, 3332358, 9558987, 4781909, 8466991, 18117782, 6019934, 9492951, 3718905, 27307402, --8613557, -3438658, -10735271, 6322729, -6666326, 5990406, 30998390, 6101001, -32836098, -8039105, --9575093, -28123982, 17859548, 8398272, -3245385, 3932580, 1760400, -12656195, -104690, -941672, --12513387, -3808026, 27067420, 39711804, 18777598, -13925895, -21905944, 10280541, 18191334, 1959579, -14558865, -10197326, -6988986, 14854144, 4743792, 125091, -33348810, -43604656, -1378148, -25542170, --14744623, 9004399, 36444408, 7791608, 1844152, -10657961, -12557948, -18357228, -16007880, 2875481, -11025181, -4013110, -18040474, -29242284, 11620034, 638876, -16163573, -27275190, -18329310, -30013768, --53864260, -32679870, -4807142, -6600828, 64882460, -8076149, -2377801, 37193880, 4435628, 1946157, -22524420, -13571023, -32723892, -38276748, -5855114, -18423262, -20141786, -21658446, -23440858, 4418448, -21305722, 33545842, 20117626, 3954054, 2269353, -8860518, 17488570, 3395709, -5198521, -21948894, -4572530, 15627239, -676457, -268972, -7713225, 4157528, 8884140, 14259291, 4189204, 5935108, -5663988, 7018514, 9102646, 9143985, -2515777, 6899865, 1584843, -5224828, -11250130, -13820668, -1517734, 3018825, -13414793, -6869800, -12890807, 4036733, 6877317, 10133438, 15362561, 25422986, -19261318, 19330038, 11818676, 7399692, -4495757, 1835562, 294205, -12201465, -18206366, -14083198, --15509664, 20462834, -29096256, 7315940, 4592394, -12686797, -40793064, 27710056, 8210367, -2649458, --41304164, 10956462, 6382859, -21827560, 3622268, 19091130, 11729019, 5536750, -18709414, -3841848, --6996502, 3260417, -7057168, 1695975, -14495515, -20857434, 22819162, -15809775, 34688304, -21449604, --19412178, -13175349, -24398098, 2105071, -489089, 36419712, -27035208, -28531468, 14669461, 9345849, --23606750, -31411244, -3500398, -17719962, 20306606, 4283156, -25990994, 16811576, -4457103, -39972188, -26191248, -17857400, 17087528, -29755534, -7293928, -879931, -12515535, -5175436, 3396782, 37440304, --10146323, -3566434, -10804527, 10650982, -17774186, 13823352, 29275034, -1861868, 29435558, 23077396, --3545496, 47161424, -2793339, 5396090, -1415729, 13266080, 47581260, -3980361, -13193066, -50958176, -39396660, 13995688, 33633352, 11388643, -26460756, 11701638, 7539278, 4781909, -23493472, 13347148, -2734284, 3803731, -12634720, -3750580, 16063178, 13697724, 598611, -1728188, -1651415, -1918240, -3927211, 10019085, -20633022, -6160057, -2863670, 3223373, -4224101, 4512400, 4440460, 6436009, --4822175, -11032160, 17023102, 26587996, 9330816, -13742822, -11746736, -5121212, -4006668, 7151658, -3626026, -2732136, -16838420, -12123619, -13642964, -1398012, 13073880, 5686000, 11023034, 4154844, --18362596, -3348464, 8028368, 27936078, -53846540, 2061047, -60601452, -20307680, -10295037, 18443664, -55959664, 47562468, 17518098, 28080496, -18249316, -15375983, 2704756, -4129074, 12950400, 4103305, --12656732, 18771154, 27638652, 22970558, 17165910, 14514305, -482110, 2584497, -9417253, 26157424, -12200391, -5015985, -16148003, 5389110, 10719165, -2863133, 34221224, 35754528, -20707112, -15307263, -739271, 27773406, 17296370, 4440996, 3377992, -6651294, -12559558, 6907381, 42684996, -17316234, --21182778, -23030152, 22282290, 9101573, -12850542, -19922742, -31947040, -37795176, 4096862, 8259759, -6766721, -8352638, -2848637, -10414759, 7398081, -30153354, -49567680, -22340810, -3513820, -8443906, --19400368, 24748138, 41329396, -9341554, 21285322, 45680736, 29744260, 10560788, -31604516, 5064840, -5589363, -27925340, -15505369, -4491999, -22292490, 24205362, 34453692, -2124935, -8063264, -4322885, --10173167, -5676873, -14208826, -13893682, -5191005, -6933151, 4864051, -3163244, -3937411, 6733972, --21072720, -2614561, 1605781, 21209622, -21907554, -3624953, -5087926, 3958349, -13998372, -4958003, -4107063, -7678865, -12955232, -2196339, -1116692, -12664785, 14664629, -20379082, -2426120, -7581154, -4361003, -2252174, -6117107, -11948599, 238371, 5842766, -4376035, -34298000, 27553288, -3564286, -23664196, 14334453, 487479, 15677704, -6963216, -1822140, 13486197, 16552267, 2495913, 32212, --609349, -15170898, -9886478, 3990562, -21139830, 516470, -7989176, 462246, -17935784, 2996814, -927713, -16306917, 13506062, 5725192, 9118216, -20465520, -5583458, 3802657, -1142461, 1431298, -11638825, 2545842, 3205656, -2389613, -4602058, -3242164, -1752347, 7516730, -3499325, -13079786, -10481331, -17969070, -5709086, -6191196, 2069637, -8815420, -10480257, 13611288, -1822140, -13730474, -8286066, -19133006, 15214385, 4722854, 636729, 15720654, 17450988, 2401424, 4911295, -13200045, -16923244, -8356933, -11725261, -1035624, 2427730, 32126356, -14540612, -23777476, 20256140, -7770133, -20238960, -3469260, 1242856, -8915815, 12220793, -20662550, -17213692, -6801618, 7993471, 4808753, --1345399, 9869835, -12370580, -12439836, -8346732, 2918967, 3494493, 718870, -632434, -3771518, -2030983, -17149804, 3371013, 3484292, -4234301, -1596654, 5066451, -2757369, -7427072, 8856223, --4528506, 1090922, -481573, -2248952, 5876589, 2586644, -6321118, -712428, -1584843, -5556614, --1306207, -2055142, -11521250, 3488050, 6862284, 5578626, -5291400, 5211406, -8437463, -2588792, -96100, -5378373, 16521665, -7661148, -89492088, -170450608, -60821568, -133515504, -152109488, 36950676, --5376226, 50716048, 196624672, 213190896, 150468816, 214711328, 176432432, 58385248, 61624728, 45514304, --118897040, -122442536, -68225552, -118865368, -128453344, -43220256, -38052336, -108335720, -81677392, -13497472, --48501992, -59281288, -14930380, -45439680, -80135496, -45774152, 14602889, -32337346, -39768712, 46630460, --8257075, -44718124, 40188008, 74639552, -17628156, 18429168, 115857280, 15693810, -37532644, 76766632, -67045512, -67080408, 37950332, 84633408, -26781268, 8968965, 146903984, 111984296, 56291452, 206418272, -229885984, 117372328, 211695184, 273406336, 171520048, 161774240, 224769600, 144372112, 91763584, 101602824, -52755084, -62214748, -120024472, -162727728, -277481184, -337613408, -382675680, -432752864, -426673856, -462485824, --413162976, -306823872, -306766432, -241950544, -21989158, -12880607, 5908802, 172845584, 136513920, 45199164, -90481000, 134757824, 49706732, 59921236, 136903696, 99535328, 20047834, 81960864, 115858888, 49562312, -62275416, 142525264, 53216792, -23032298, 65582004, 45725832, -31964758, 61845380, 137756784, 64633352, -101482024, 219956016, 182951648, 173267568, 258502272, 238642880, 164461808, 142896784, 128157528, 47743392, --2170032, 6535867, -27303644, -86391120, -85927264, -98708552, -168664432, -188726768, -180856784, -202928608, --243339424, -213241376, -206064480, -219896416, -170239616, -115214648, -90120224, -56909392, 1956358, 22580790, -18983218, 31466004, 34665756, 17690434, 16227997, 31777390, 27537720, 18664318, 22523346, 26280904, -19871740, 25792352, 39473972, 43389908, 41404560, 47466368, 46247136, 32323924, 26185878, 17865454, -13853417, 13482976, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-1954210, 1161789, -951872, -2919504, -227096, 6715182, -3470871, 771484, -1473711, -89121, +-2590402, 4829691, -2529199, -2690797, -3041911, 5757941, -3448322, -911070, -1639067, 1611150, +2646237, 3365107, -4782446, -23085, 4543002, 2006824, 762357, -263067, -588411, 2049236, +4631586, 1111323, -5990406, -3089692, -3231963, 5203353, -552977, 3968013, -2519535, 1833951, +5197984, -2552284, -3948686, 1386738, -1489280, -272730, -3535295, -1429150, -2646774, 989990, +-4786741, -1582159, -1239098, -161061, 6432788, -2114198, -988916, -238371, -1709934, -676457, +-628139, 3898220, 2002529, 2388002, -3374771, 2455648, 2567854, -2292439, 1051193, 1527398, +-1745904, -2350421, 2725157, -4117263, 2887292, 1751273, 751082, -3815542, -1338956, 1417876, +-354872, -794569, -1045825, -91268, -2062658, -2376728, -382789, -392453, 267899, -893890, +3221, 1407139, -70330, 523986, 183610, 278099, -2147, -275415, -1045825, -619549, +687732, -365609, 18254, -140660, -3170223, 3351148, 390842, -1446867, -2164127, -591095, +-1102196, 3758, -2681670, -2057826, 1512365, -424128, -1034550, -4678830, -705985, 4351876, +-2940979, -733903, 3270618, -1890859, -3519189, -2678449, 2226941, 19327, -352187, -674847, +-3376381, 1133335, -1509681, -790274, 3794604, -2093797, -5169530, -1537061, 273804, 1546188, +1342177, 443455, -3931506, -904091, -4786741, -4336843, -1182727, 4545149, -801011, -8981313, +-419296, 3026341, 2611340, -1853278, 1751273, 1933272, 164283, 2673080, -4855461, -3423626, +-471910, 1406065, 204011, 1002875, -539018, 1268089, 1130650, 1870995, -300648, 1154273, +1077500, -901406, 1836635, -457951, -4738423, -3864397, -2525978, -1992328, -2139968, 646929, +-1095754, 3658239, 3001109, -557272, -1480153, -1268626, -698469, 1100585, 1704028, 220117, +-1031329, 186831, 219580, -997506, 1276679, 9664, -321586, -498216, -131533, -741419, +497679, -144955, 76236, -858457, 491237, -540092, -16643, 8053, 333397, -141734, +-432181, -164283, -831613, -313533, 60130, -396748, 47245, -672162, 4108673, 2295123, +6155225, 405338, -1218697, -764504, 4352413, -1194001, 2331094, -3998078, -432181, -113280, +2280628, 1585917, 3901978, 2746095, -2021319, -3946538, -3228205, 2192044, -1382980, 2997350, +1877438, 392990, -207769, 2490544, 1745904, -1825898, 2044941, -4248797, -605054, -3939022, +-3381750, -4738960, 1363115, 2688650, -518617, 3743601, -2935610, 3467649, -7058779, 2698313, +1180579, 5198521, 1506997, 1862405, 2789581, -133681, -1815697, 1937567, 4524748, 1538672, +2181307, -741419, -100395, -6452652, -449361, 1018444, 1219771, -952946, 3417183, 6453189, +-2181844, -4655745, 3074660, 678605, -3315178, -59593, -1548873, -3323768, 386010, 4641786, +1140851, 1684701, 760746, -501974, 1744294, 1086090, -114890, 1523640, 72478, -427349, +-367220, -882616, 876710, -1293859, -185220, 2154463, -493921, -54224, 799938, -512712, +1446330, -2060511, -951872, 28991, -847719, -900333, 192200, -506806, 679679, 1578937, +-622770, 891206, 211527, 91805, -5906, 219043, -1804423, -459025, -430570, 347892, +1433445, 863288, 2265059, 3387119, 3258270, -3156264, 4973036, -1770063, -3306051, -4885526, +1132261, -6461242, -405338, 670552, 1785633, -4121558, 2661269, -67109, 591632, 1724429, +1058710, 1459215, -5562520, -374199, -1260036, -3629247, 2119566, 1066763, 832150, 3112241, +10954314, -808528, 562104, 1561221, 2706366, 1071058, -8993662, 1867237, -1494649, -1033477, +4924717, 143881, 2450279, 3551938, -4437238, -2477123, -1280437, -4305705, -9229885, 434865, +-3479461, -557272, -804770, -191126, -2139968, -4518306, 1282585, -4323422, -1372242, 973347, +-4818417, 4987531, 1722282, 1417339, -2024003, -370441, -788127, 991064, -1552631, 2560338, +-3951907, 1312649, 6011344, 4977867, -1738925, 2531346, -2365990, 1072668, -4480725, -148713, +2790655, 3216931, 2880849, -497142, 5362267, 489089, 2681670, 2392297, -91268, 1114544, +587337, 199716, -903017, 537945, 838592, -323733, 98784, -605590, -1468342, -230854, +1012002, -789200, 2166811, -599148, -1117228, -958315, 764504, -541166, 952409, -181999, +-902480, 541166, -244813, 1115618, 687732, 654983, 456877, -1937030, -448287, 263067, +839666, 29528, 171262, -519154, 7312719, -9306120, 379568, -5735929, 2913599, 4210142, +5136244, -813896, -4907537, 110059, 5059472, 1067299, 955630, -3830574, -526134, -6696391, +8864812, -486405, -6852084, 7387881, 1838783, 2179159, -497679, -2685428, -888521, -3541738, +-3494493, 2720862, 3866544, -805843, 3647501, -3033858, -1902134, -14496, 5096516, 4825933, +-1373853, -2742337, 3964255, 2525978, 357556, 3356517, 786516, -3973382, 4150549, 2586644, +-328565, -1389422, 1134408, -4281546, 11356430, -601832, -422517, 8461086, -786516, -5196911, +-2828236, -624381, 2049236, -5400385, 3671123, 1101659, 111669, -4903779, -4138201, -8657580, +-779537, 4022237, 1991791, 4880694, -2726767, -1930051, 10227391, -2855617, 1697049, -1432909, +-4259534, 318364, 1858647, -4438849, -7871602, 318901, -4859756, -4896263, -2404645, 2543158, +213138, -746251, -3019362, -1036698, 329639, -1131187, -850940, 796716, 2783139, 387084, +689342, -1987496, -1025960, -212601, -33823, -2800856, -2062658, -1780801, -119722, 670015, +258772, -916976, 53687, -184684, -296890, -1472100, -551903, -218506, -574452, -773631, +-9816685, -150324, -4153234, -4692252, 1365800, -5627481, 113280, 3776887, 2036351, 7960185, +-13394929, 8528731, -1467268, 3704409, -2603824, -1956895, -7062000, 6203544, 5465346, 1341104, +-6283537, -388695, -3655017, -476205, 6445136, 4475356, 947040, 6142340, -137439, 272730, +557809, -261456, -4379793, 9205726, -977642, 40802, 10699300, -6981470, 2520609, -3353833, +-749472, 3351685, -1518271, -5516886, 10296647, 8020852, -340913, 2573222, 4287451, 11131481, +-1497333, -2059974, -6113886, 1017907, 2075006, -6462852, -6892886, -6065568, 7172596, 121870, +-3008088, 4916127, 3482682, 22012, -1759326, 1573032, -3940633, -1036698, -4283693, -993748, +3971234, -7878581, 1822140, -1683627, -5463736, 3291556, 5196911, 2198487, 5413270, 4687420, +-4023311, -6423661, -3216394, 2788508, -2543158, -4942971, 3170760, 5349382, -3920768, 646393, +1132798, 581968, -3661997, 2110440, -1636383, -1303523, -2353105, -1240709, -1843615, -195421, +-213138, 695248, 1122060, -936840, -807991, -367757, -1464047, -858457, -399432, -588947, +1150514, 1443109, 367757, 2128156, -1977833, 1437203, -1716376, -781147, 1472637, 7350300, +7799124, 1292785, -6720550, -924492, -6382859, 2662343, 16794396, 4145717, 11637751, 4276177, +149250, -10854456, -2664490, 1788854, 10512469, -4647155, -2311766, -4047470, 1011465, 8449274, +-6180458, 4137127, 7315403, 1626182, 2695092, -4783520, 9039296, -1934883, 11771432, -110059, +-3593277, -11041824, 1358283, 41339, 13175349, -3973919, -1068373, 8352638, 67109, 1106491, +-2709588, -8634495, 931471, 4973572, -6194954, -4889284, 1297617, -10355166, 5689221, 5748814, +-1740536, -673236, 2927557, 5863167, -490700, -3608310, -130997, 8609799, -1093606, -1323924, +-3250217, 11146514, 11292543, 763430, -2041183, 1758789, -476205, 2942053, 5222144, -431644, +7540352, -2935610, -4180614, -6099928, 2067490, -500901, -9272834, -6693170, -3847217, 7294465, +-2130304, -3417183, -937377, 1074, -3143379, -4754529, -1665911, -1395328, -2834679, 462783, +-1777043, -1564979, 1499481, -3022046, -3111167, 976568, 2498597, -1507534, -2003602, -1520418, +-2613488, -1257352, 815507, -907312, 449898, 1374926, -459025, -778463, -2305324, 1421097, +200253, -7406134, 7508677, 5712844, 442382, -4913443, -5517423, -2401424, -10961293, 12730820, +9576703, -2052458, 3549791, 1148904, -2091649, 9652939, -774168, -4489315, 14289893, -15483894, +3999688, 6670084, -53150, -6332930, 6810745, 1051730, 9847823, -3811247, -1058173, 2623688, +3934727, 663572, -1345935, 14325327, 6180995, -6551973, -9891310, 6879464, -9895605, -2874944, +-11392938, -1479616, 17057462, 6975027, 8246337, 56371, -9049496, -1510218, -4421669, -1970316, +12757127, -1991791, -14058502, -1139240, 2759517, -8948564, -1483911, 5763846, 4539244, -6016713, +-3140695, 6156299, 8153996, -2374043, 8494372, 147103, 2136209, 3174518, 720481, 3332895, +5095979, 4926865, 4799089, -2529199, -10199474, -11272679, 2810519, -2268817, 8057896, -1447404, +9563282, 3231426, 4449049, -5098126, -4545149, 3403762, -176094, 693100, 893353, 419833, +-4571993, -2100239, -707596, -3803194, -111669, -3267933, 587874, -1847910, 1409286, -464930, +2441152, -5369, 1336272, 426276, -1227287, -1074279, -1470489, 3018825, 347892, -898185, +960999, 1559073, 1307281, 291521, -2236604, -6256157, -3543885, 22012, -3025268, -76773, +6189048, -877784, 5767604, -11780022, 4110821, 3243237, 1635846, -7742753, -6492380, -8242042, +6278169, 3228205, -5915244, -5901822, 7913477, 2518998, -725850, -4980552, -8179765, -3384971, +3204046, -5264556, 529355, -9800042, -2809982, 1051193, 3237869, 6263673, -1116692, 3965329, +5439039, -5730560, -13600014, 9205189, 331249, -2238752, 8752606, -1464047, 255014, -6062347, +7679402, -5070209, -6412923, -2569464, 6277632, 9574556, 8030515, 2423435, 1538672, -17186848, +7662759, -1145146, 3164854, -6010807, -1216550, -6714108, -2394981, -1730872, -8876624, -4532801, +-3697430, -4917201, 8995272, -3040300, 11729556, -1526324, -766652, 7309498, 8365523, 14154602, +9684078, -310311, -4726075, -655519, -78383, -6956774, 1629403, -4532264, -7605850, 14470282, +-9360344, -9951976, -1524177, 5368172, 709743, 1646046, 633508, 6059662, -175020, 1628330, +2102923, -2427194, 286689, 3710315, -2165737, 1501091, 2645163, 2163053, 4648765, 1008780, +20401, 2543158, 410706, -918049, 1697049, 2635499, 1015223, -37044, 780610, 398895, +5405217, 412317, 4394289, 2921115, 633508, 4625143, 5073430, 490163, -171262, 669478, +683437, 603980, -461172, -624918, 1271847, -3187403, -4567698, -18160732, 4028143, -12496207, +-7475928, 11832635, 9206262, -20737176, -19010598, 646929, 8124468, -4820564, 5017059, -6843494, +-761283, -12038793, -3139084, -10868415, -772020, -2974265, 354335, 4176856, 3429532, 6767795, +-834297, -5772436, 5021354, -6884296, -2754148, 2207613, 440771, 3506841, 7187628, -1162862, +910533, 1650341, -2910914, -765041, -10518912, -12465606, -12062416, 9127, -12134893, 4064113, +1598265, -4800163, -5645198, -2432562, -2020782, -1047972, -7227356, -11418171, -651224, 18113488, +9980430, -2562485, -10831908, -11188390, 12498355, -11750494, -3883724, -2099702, -7847979, -5957657, +-7999914, -9361418, -13019656, -17609902, -2543158, -2850785, -2518462, 5881421, 5564667, 1445257, +4873714, -4011500, -4903779, 16252156, 6868727, -4362613, -12016782, 3699041, -7121056, -8446590, +-55298, 13623099, -2739652, -144418, 9360881, -1090385, -6288906, 231928, 2206540, -228707, +-2594160, -2508798, -102542, 2268280, 1092532, 1500554, 913217, 4625143, -1404991, 2466385, +-6772090, 3071439, 1597728, -1255741, 1395864, -1462436, 2444910, -1267552, -1996623, -1179505, +2217814, 1897302, 223875, 2556043, -3856881, 3778498, -1939715, -2362769, 1159104, -14951855, +1668058, 7480223, 8129300, 7534983, 3158949, 14899778, -5942088, -10921565, -2890513, 1871532, +-2248952, 4708895, 9898289, 20030116, 12580496, 7314866, 9305047, -7798587, -14871324, -5138392, +-11153493, 12539157, 2799782, -2717104, -9059160, 14235132, 12224551, -4612258, -969052, -127238, +-7470022, -6247030, -11207180, 3242164, 3776350, 6275484, -10601053, 893890, 2938831, -4865661, +-10303627, 230854, 5882495, 7792145, 1260573, -20108500, -7230578, -9959492, 4031364, 11869142, +-80531, -11318849, 2605435, -10929081, 5939403, -2713883, 887448, -7776039, 16085726, 12681965, +-4077535, -3818763, -9404368, -710280, 12842489, 2890513, 15800111, 15229954, 12681965, 7425462, +2539400, -10295573, -5774047, -13674102, 15622407, 15706695, -1336272, -12084964, 7665443, 18259516, +-293668, 2276333, -4489852, -477278, -12087112, 1869921, -9545028, 6465000, 2229625, 9113384, +9055402, 4910758, 704912, 779000, 5581310, 2032593, -1367947, -3736085, -1263257, -5683853, +940061, 4367445, -3771518, -2122788, -4308926, 3077881, -1005559, 6600291, -6327024, 1674500, +-256624, 6286222, -3091840, 2073932, 3784403, 684510, -244813, 223338, 1080184, -2901251, +-1199370, 3767223, -9881109, -2465311, 7269769, 12656732, -13233868, -16072841, -13888314, 15312632, +-6336688, 10242423, -150861, 185757, 24614994, -2947958, 1810866, -10873247, -16985522, 4265977, +-2536178, 4609574, 2984466, -1331440, -9720048, 2783139, 3627637, 1738925, -9177808, 6111739, +4417911, 17992692, -8283382, 1268626, 9810779, 10077604, 387621, 10176388, -2561411, 446140, +9054865, 7693360, 2049773, -3912715, -14452028, -10918881, 8479339, -197569, -3308199, -2831994, +2151242, 19448148, -1196685, -6742025, 9885404, -4728222, 9343701, 2282775, 28003724, -5464809, +-899796, -48318, 4164508, 9580998, -1864553, -3244311, 6230387, -13125420, 10721312, 19720880, +5841693, -4119948, 11001559, -4179003, -578210, 22306450, -12873628, 4948876, 8761196, -3729642, +18572512, 4463008, 3991098, -7117298, -10688563, 1916629, 4862977, -11460583, 11678016, 1074, +2957085, 77846, 3409130, 10781979, -2443300, 10879152, 5160403, 3595425, 6062347, 5416491, +-3155190, 6866579, 6383395, -5576478, 2117419, 4732517, 8702141, 2075543, 2510945, 4358318, +5097053, 7748121, 794032, 278099, -459562, 5310190, 4493073, -4856535, -73551, 3518652, +4951024, 3900904, -2900714, 7386270, -199179, 2573222, 911070, 6104223, 3109020, 2858301, +2923262, 4232154, 2381023, 2822331, 4878009, -13969918, -3978750, 9625559, -4614406, -7272990, +-6487011, -6656126, 1244467, 9680856, -1183264, -21363168, 59593, -16221555, 6373732, 7042136, +182536, 3354906, -7106561, -866510, 8696772, -20455318, 5266704, -4422743, 11496554, 7982734, +5199058, 957241, -8125005, -18453326, -933619, -16119012, 10057740, 204011, -4836670, 17115444, +8893267, -6724845, -5342403, -3473018, -2547453, -4683662, -9129490, 1737851, 2685965, 24731496, +-780073, -17540646, 39192, 12128451, 937377, -8986145, 5776731, -13600551, 9192841, -5693516, +6106907, -7879655, 3730716, -13909788, 36914708, 1488206, 25516938, -2371359, -6942278, 6709276, +-8179229, -7978976, 14234595, 13902809, -12058658, -31984622, 30575872, -10618770, -8339753, -3915937, +-4256313, 4139812, -2779918, 2461016, 13188234, 3246459, -10620380, -8515846, -6427419, 4022774, +-6720013, -892279, 6142340, -16566226, -1415729, 1132798, -2593624, -4815732, 1883880, -3394635, +9088688, -3534221, 4050154, -4003447, -2945274, 272194, -4213363, 2496450, 2162516, -1698660, +2288681, -3834332, 1901060, -981937, -294742, -1700807, 52076, -6914898, -5093831, -947577, +-2838437, -5654325, -7548942, -4204773, -1843078, -2978023, -642635, -5015448, -5906, -4451734, +-1295470, -5811628, 3140158, -3215320, -1800128, -15748571, -5591511, -4791573, -13540421, -23845658, +-5885179, 374199, -12664785, 6190122, -5419175, 10596221, -9138080, -3827890, -13020193, 31026306, +26249230, -5898601, 5853504, 18022756, -18961206, 19216758, -7998840, -8022462, 6928319, 2528662, +3284576, -2838437, -4181151, 531502, 6222334, 5366562, -8431558, 9648107, -9086003, -15124190, +10965052, 9642202, -12590160, -15648176, -18080738, -2659122, -2997887, 5049271, -11809013, -14803142, +-7558606, 24748138, 8662412, 8412767, -10608569, 9539659, 13028246, -10181757, 24322936, 4503810, +-8705362, -11419781, 6509560, -9594420, -20802674, 5051419, -237834, 450972, 11370389, 10573136, +-9142375, 1720134, -26659936, -3330747, -10514617, 22044994, 1316944, 3091840, -12859132, 10416369, +-22648436, -2774549, 8860518, 2532420, -2462627, -2607582, 2745558, -1069447, 2554969, -3411278, +636729, 1855426, 5388574, 1313723, 1717987, -1255204, 3199214, -3347390, 1029182, 10029286, +-1975685, 427886, -3216394, 4454955, 2086817, -561030, 5265630, -5564667, -5258651, 5688684, +-4796942, -1806571, -4394289, 2394981, -6427419, -2927557, -2092723, 5136781, 5181341, -8295730, +1305670, 4202626, -2839510, -9352291, -4500052, 6880001, -4510253, -11534135, 14614163, 15399068, +13935558, 9400073, -119722, 12763569, 11574400, 1935420, -2191507, 5143224, 34360, -13014288, +-1548873, 4940823, -10174778, 14532022, -15152108, 12133819, 13215077, -3802120, -2980707, 5601711, +17633526, 13209709, -15935939, -3479461, -4264366, -1271847, 3984119, -7435126, -7784092, 17297980, +434865, 24841554, -16222091, -15387794, 12508555, -8287677, 4512937, -9751186, 8352101, 9528922, +6292664, -3893925, -14251775, 1410360, 4746476, -11857331, -21774410, -753230, 1992865, -12857521, +23539642, -2686502, -6660421, 31261994, 29456496, 2939368, -4080756, -1099512, -6271726, 7087233, +-15428059, 14471892, 1928440, -8399882, 17501454, 2804077, 3560528, -4990752, -9478993, -23481660, +5171141, -7999377, -3854196, 10828686, 4408247, -5156645, -15328201, -4246112, -17457432, 7464117, +15738371, -2223719, -11855183, -8305393, -11821897, 130460, 6400575, 7639673, -1597728, -8389145, +-4348118, -4578972, 1121523, -2544231, -4005057, 3371013, -616865, -2481417, 4152697, -9483288, +2723546, 2445447, 14666240, 1323924, -3237869, -7504919, 6473590, -7840463, -1015223, 5478768, +-10401874, 9699110, 2083596, -421981, 1996086, 6557342, -3303904, -10290742, 250182, -3061775, +-1294933, 9882183, 9427990, -25803626, -59762860, 20028506, 18977312, -6685117, 4234838, -14391899, +25785910, 16489453, -14622216, 4163434, 3506841, 367757, -6580964, -4744865, -30822296, 13034152, +15215459, -3518652, -9664, -1730872, 10239739, -7730941, 19542102, 5789079, -23227720, -13166759, +29498910, 19362250, -19222664, -4525822, -6831683, -11775727, 1840930, -4705674, 4210142, 38318624, +10451266, 40148816, 22943178, 25872882, 23590108, 46243912, -3026878, -4296578, 11071352, -3271691, +-38784628, 31447750, -13616657, 18032420, -25632902, -20395726, -38289632, 7603703, -3514894, -12861816, +9358197, -18006650, 82141, -25722560, -25673704, 7203197, 15018964, -20876762, -5521181, -14475650, +-20080046, -22569516, -16195785, 12339978, -9774809, -28177670, 40484900, 25356414, 40819368, -5328981, +-8765491, -8124468, -14380624, -23145042, -1461900, -5089000, -17493402, -5848135, 5172751, -12408161, +-11167989, 1291175, -1813550, -5530844, -4517232, 10066866, 10748693, 337155, 2729989, 7628399, +9584220, 1945083, -777389, -1472100, 4522064, -1915555, 1151588, -1762010, -6700686, -181999, +6379100, -6610492, 8704288, 10959683, 4660577, 357019, 1821603, 1156957, -7277285, 601832, +4195646, -3760781, 89121, -1719061, 1232119, -2607582, 1009854, 4076998, -5561983, -4766877, +8859444, 3598646, -1075352, 1345399, -21578990, -56873956, 24888798, 29694330, -13180181, -5640903, +-1299228, 33602212, 1261647, 7327214, 7237020, -7679939, 6828998, 15749108, -2934000, -14794015, +3919695, 28606092, -14877767, -9246528, 6416681, -3790309, 21468394, -5149666, 9781788, -10789495, +-12984760, -12978317, 14137959, -4022774, 12571906, 14615237, -3541201, 2079838, 277025, -11616813, +4098473, -10521596, 12819941, 31114354, 51002736, -456340, -1261110, -21341692, 11815455, 16802986, +-312459, 18849000, 26894548, 11404212, 15374372, -23256712, -13879187, 19634980, 50960324, -9131637, +-29615946, 7763691, -9718974, -370978, 13953812, 424665, -13405667, -6336688, -6827925, -34368328, +-14245333, 388695, 5917928, 12206297, -1794223, -13118441, -7459822, 3417720, -5194763, -13176960, +13930726, 33380486, 14562623, 18052822, 2022393, -4379793, -26831198, -5820755, 7864085, 6131066, +-5862631, 15481746, -4145717, 8730058, -18724446, 1247688, -6333466, -5294084, 369904, 5399848, +5334350, -5188321, -10101226, 10105521, -3714073, 8327942, 922881, -1921461, 863288, 1899449, +7759932, 393526, -1013075, -3775276, -4147865, 6658810, 2349347, 6147172, -12680891, 9097278, +5368172, 2575370, -4475356, -1569811, 9536975, -989990, 557809, -7070053, 863288, -10919954, +-2145873, 3332358, 9558987, 4781909, 8466991, 18117782, 6019934, 9492951, 3718905, 27307402, +-8613557, -3438658, -10735271, 6322729, -6666326, 5990406, 30998390, 6101001, -32836098, -8039105, +-9575093, -28123982, 17859548, 8398272, -3245385, 3932580, 1760400, -12656195, -104690, -941672, +-12513387, -3808026, 27067420, 39711804, 18777598, -13925895, -21905944, 10280541, 18191334, 1959579, +14558865, -10197326, -6988986, 14854144, 4743792, 125091, -33348810, -43604656, -1378148, -25542170, +-14744623, 9004399, 36444408, 7791608, 1844152, -10657961, -12557948, -18357228, -16007880, 2875481, +11025181, -4013110, -18040474, -29242284, 11620034, 638876, -16163573, -27275190, -18329310, -30013768, +-53864260, -32679870, -4807142, -6600828, 64882460, -8076149, -2377801, 37193880, 4435628, 1946157, +22524420, -13571023, -32723892, -38276748, -5855114, -18423262, -20141786, -21658446, -23440858, 4418448, +21305722, 33545842, 20117626, 3954054, 2269353, -8860518, 17488570, 3395709, -5198521, -21948894, +4572530, 15627239, -676457, -268972, -7713225, 4157528, 8884140, 14259291, 4189204, 5935108, +5663988, 7018514, 9102646, 9143985, -2515777, 6899865, 1584843, -5224828, -11250130, -13820668, +1517734, 3018825, -13414793, -6869800, -12890807, 4036733, 6877317, 10133438, 15362561, 25422986, +19261318, 19330038, 11818676, 7399692, -4495757, 1835562, 294205, -12201465, -18206366, -14083198, +-15509664, 20462834, -29096256, 7315940, 4592394, -12686797, -40793064, 27710056, 8210367, -2649458, +-41304164, 10956462, 6382859, -21827560, 3622268, 19091130, 11729019, 5536750, -18709414, -3841848, +-6996502, 3260417, -7057168, 1695975, -14495515, -20857434, 22819162, -15809775, 34688304, -21449604, +-19412178, -13175349, -24398098, 2105071, -489089, 36419712, -27035208, -28531468, 14669461, 9345849, +-23606750, -31411244, -3500398, -17719962, 20306606, 4283156, -25990994, 16811576, -4457103, -39972188, +26191248, -17857400, 17087528, -29755534, -7293928, -879931, -12515535, -5175436, 3396782, 37440304, +-10146323, -3566434, -10804527, 10650982, -17774186, 13823352, 29275034, -1861868, 29435558, 23077396, +-3545496, 47161424, -2793339, 5396090, -1415729, 13266080, 47581260, -3980361, -13193066, -50958176, +39396660, 13995688, 33633352, 11388643, -26460756, 11701638, 7539278, 4781909, -23493472, 13347148, +2734284, 3803731, -12634720, -3750580, 16063178, 13697724, 598611, -1728188, -1651415, -1918240, +3927211, 10019085, -20633022, -6160057, -2863670, 3223373, -4224101, 4512400, 4440460, 6436009, +-4822175, -11032160, 17023102, 26587996, 9330816, -13742822, -11746736, -5121212, -4006668, 7151658, +3626026, -2732136, -16838420, -12123619, -13642964, -1398012, 13073880, 5686000, 11023034, 4154844, +-18362596, -3348464, 8028368, 27936078, -53846540, 2061047, -60601452, -20307680, -10295037, 18443664, +55959664, 47562468, 17518098, 28080496, -18249316, -15375983, 2704756, -4129074, 12950400, 4103305, +-12656732, 18771154, 27638652, 22970558, 17165910, 14514305, -482110, 2584497, -9417253, 26157424, +12200391, -5015985, -16148003, 5389110, 10719165, -2863133, 34221224, 35754528, -20707112, -15307263, +739271, 27773406, 17296370, 4440996, 3377992, -6651294, -12559558, 6907381, 42684996, -17316234, +-21182778, -23030152, 22282290, 9101573, -12850542, -19922742, -31947040, -37795176, 4096862, 8259759, +6766721, -8352638, -2848637, -10414759, 7398081, -30153354, -49567680, -22340810, -3513820, -8443906, +-19400368, 24748138, 41329396, -9341554, 21285322, 45680736, 29744260, 10560788, -31604516, 5064840, +5589363, -27925340, -15505369, -4491999, -22292490, 24205362, 34453692, -2124935, -8063264, -4322885, +-10173167, -5676873, -14208826, -13893682, -5191005, -6933151, 4864051, -3163244, -3937411, 6733972, +-21072720, -2614561, 1605781, 21209622, -21907554, -3624953, -5087926, 3958349, -13998372, -4958003, +4107063, -7678865, -12955232, -2196339, -1116692, -12664785, 14664629, -20379082, -2426120, -7581154, +4361003, -2252174, -6117107, -11948599, 238371, 5842766, -4376035, -34298000, 27553288, -3564286, +23664196, 14334453, 487479, 15677704, -6963216, -1822140, 13486197, 16552267, 2495913, 32212, +-609349, -15170898, -9886478, 3990562, -21139830, 516470, -7989176, 462246, -17935784, 2996814, +927713, -16306917, 13506062, 5725192, 9118216, -20465520, -5583458, 3802657, -1142461, 1431298, +11638825, 2545842, 3205656, -2389613, -4602058, -3242164, -1752347, 7516730, -3499325, -13079786, +10481331, -17969070, -5709086, -6191196, 2069637, -8815420, -10480257, 13611288, -1822140, -13730474, +8286066, -19133006, 15214385, 4722854, 636729, 15720654, 17450988, 2401424, 4911295, -13200045, +16923244, -8356933, -11725261, -1035624, 2427730, 32126356, -14540612, -23777476, 20256140, -7770133, +20238960, -3469260, 1242856, -8915815, 12220793, -20662550, -17213692, -6801618, 7993471, 4808753, +-1345399, 9869835, -12370580, -12439836, -8346732, 2918967, 3494493, 718870, -632434, -3771518, +2030983, -17149804, 3371013, 3484292, -4234301, -1596654, 5066451, -2757369, -7427072, 8856223, +-4528506, 1090922, -481573, -2248952, 5876589, 2586644, -6321118, -712428, -1584843, -5556614, +-1306207, -2055142, -11521250, 3488050, 6862284, 5578626, -5291400, 5211406, -8437463, -2588792, +96100, -5378373, 16521665, -7661148, -89492088, -170450608, -60821568, -133515504, -152109488, 36950676, +-5376226, 50716048, 196624672, 213190896, 150468816, 214711328, 176432432, 58385248, 61624728, 45514304, +-118897040, -122442536, -68225552, -118865368, -128453344, -43220256, -38052336, -108335720, -81677392, -13497472, +-48501992, -59281288, -14930380, -45439680, -80135496, -45774152, 14602889, -32337346, -39768712, 46630460, +-8257075, -44718124, 40188008, 74639552, -17628156, 18429168, 115857280, 15693810, -37532644, 76766632, +67045512, -67080408, 37950332, 84633408, -26781268, 8968965, 146903984, 111984296, 56291452, 206418272, +229885984, 117372328, 211695184, 273406336, 171520048, 161774240, 224769600, 144372112, 91763584, 101602824, +52755084, -62214748, -120024472, -162727728, -277481184, -337613408, -382675680, -432752864, -426673856, -462485824, +-413162976, -306823872, -306766432, -241950544, -21989158, -12880607, 5908802, 172845584, 136513920, 45199164, +90481000, 134757824, 49706732, 59921236, 136903696, 99535328, 20047834, 81960864, 115858888, 49562312, +62275416, 142525264, 53216792, -23032298, 65582004, 45725832, -31964758, 61845380, 137756784, 64633352, +101482024, 219956016, 182951648, 173267568, 258502272, 238642880, 164461808, 142896784, 128157528, 47743392, +-2170032, 6535867, -27303644, -86391120, -85927264, -98708552, -168664432, -188726768, -180856784, -202928608, +-243339424, -213241376, -206064480, -219896416, -170239616, -115214648, -90120224, -56909392, 1956358, 22580790, +18983218, 31466004, 34665756, 17690434, 16227997, 31777390, 27537720, 18664318, 22523346, 26280904, +19871740, 25792352, 39473972, 43389908, 41404560, 47466368, 46247136, 32323924, 26185878, 17865454, +13853417, 13482976, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -4371203, -3634616, 3891240, -1843078, 3905199, -2352032, -512175, 5196911, -2124398, 2473901, 1511292, --5755256, -2593624, 4327717, -1679869, -821413, 2725157, 1804960, 1943473, 523449, 6663105, -1141388, -1705639, 1496796, -2295123, 4129611, -1181116, -2263985, -979253, -5386963, -1818919, --3966939, 1309965, -64425, 1466195, -1587527, 2268817, 1071594, -238908, 695248, 371515, -525597, 738198, -2847563, 7128572, 1053878, -2585570, 5277978, -1260036, -4549444, -4983236, -4872641, -960999, -385473, 3230889, 366146, -830539, 2522757, -262530, 1463510, 428960, -1859184, -958315, 2024003, -902480, 2404108, 3494493, 1900523, -2053531, -2113124, -1033477, -942208, -2194728, 1558536, -1073742, 1933272, 2520609, -3112778, -1751810, 2724620, 817654, --854162, 4202089, 2436320, 2010045, -203474, 1114007, -78920, 568546, -478889, 646929, -253940, 312459, -947040, 1563368, 515396, 120259, -263604, 641024, 1021665, -523449, -1099512, -31675, 4567161, 899796, 1040993, 3833795, 49392, 2767570, 1318555, -309775, -296890, -2989297, 1402307, 243739, 4697084, 1665374, 1542967, 215285, 1391569, 5153961, --4856535, 2755759, 731755, -3204046, -1431835, -1983738, -644782, -1840394, 1309965, 5951214, -3748970, 4446365, 3534758, 6067178, 4423280, -5492727, -9968082, -1256815, 476205, -2426120, -5265630, -215822, 7882876, -3669513, -3678640, 3402151, 195958, 289910, 3127810, -5743982, -1488206, -4110821, 5461051, 3218004, -8053, 8286066, 381178, -784368, -1012539, -1446867, --2040646, 3927211, 2108829, -2009508, -646393, -5757404, -2519535, -754841, 6058052, 4131759, -755914, 3047279, 130997, 3244848, 23622, 1345935, -3442416, -2228551, 861678, 456340, --161061, -1748589, 1644436, 1914482, -463856, -1797444, -306553, 1928977, -280247, 1029182, --897648, -530965, -702764, 616865, -612033, 113280, -20401, 976031, -782758, 942208, -1481764, -686658, 369904, 120796, -5369, 1752347, -537408, 445066, -628676, 696322, -539018, 297963, -179315, 1536525, -50466, 74625, 679679, 3628174, 8248485, 2421288, -365072, 258235, 2326799, 2168959, 495532, 1303523, 1871532, -125628, -170188, 2359548, -9336185, 3122441, 7285875, -4126390, -3361886, -1366337, -4367445, -5120675, -2038499, 3788698, --6309307, -883690, -734976, -9935870, 2007360, -10037339, -3325915, -1337346, 2396592, 32212, -2106145, -1959579, -85362, -6774774, 2505577, -2246268, -3768834, 715112, 1921998, -315143, -514859, 2898566, 5156108, -8650601, 2385854, 587874, -2537252, -2755222, -539018, 1195612, --1137630, -5203890, -1204738, 1417339, 2733747, -356482, 6478422, 571768, 308164, 2641942, --4115653, 6117644, 1970853, 3636227, 1641751, 3042984, -619012, -579821, 1827509, 1063541, --834297, -1845762, -1480153, -3051574, -67646, -4096325, 290984, 2388002, -195958, -1744294, --3193845, 2852395, -1692754, 1156957, 450972, -506806, -3038153, 254477, -274341, 748935, --921807, -887448, 272730, -987306, -1665374, -905164, -689879, -168577, -1093606, -192200, --617402, 1434519, -256624, -780610, -249645, 762894, -297963, -1304060, -1380832, 1481227, -34897, 126702, -869731, 4925791, 5382668, -165893, 5937793, 379031, -766115, 734439, -504122, -1092532, -48855, -4132296, -2352032, 3703873, 4359392, -5083094, -1203128, 2124398, --3381750, -9731859, 2436857, 3611531, 4247186, -2228014, -2568391, -3463354, 5326833, 6067715, -1053341, 2400887, -4742181, -3840775, 4516158, 1712618, -3550327, 6264210, -6252936, 1053341, -615254, 5875516, 2171643, -1286343, 973884, -2020782, 3235721, -7638063, -2248952, -11009612, --4793184, 5592048, -448287, 8568997, -1147830, -7132867, 4542465, 1007707, -2901787, -326954, -366146, -2879776, 1917166, 5138392, 5793911, 172336, 2779381, -251256, 6589554, -3330747, -2860448, -602906, -96100, 228707, 2292976, -657130, 8239358, 842350, 763967, -1253057, -4862440, 1677722, -1614908, -3439732, 94489, 3332358, 1163936, 994285, -2128156, -87510, -684510, -305480, -551903, -564788, -1127429, 922344, 95563, 419833, 719944, 1764158, --660351, -1765768, 1999844, -501974, 217970, 69256, -214748, -201863, 805843, 750546, -979253, -313533, 914828, 9664, 537408, 922881, -185757, 146566, 778463, 1185948, -648003, 761283, 249645, 125091, 6022081, -8165270, -1122597, -5531918, -5745056, 2068027, -1122597, 11906723, 628139, 4388920, -9922985, -2364916, 2201708, -5148055, 3419331, 1007170, -850404, 2915209, 3368865, 7818988, 3485903, -1220308, 2480881, -3874597, 1145146, 3165928, --205085, 670552, 3472481, 4493073, 10809359, 2131378, -1596117, -7369090, -301185, 5632313, --8735963, 991064, -632434, 2774012, -4373888, -5141613, 9363029, -5948530, 1940788, -347892, --5845988, 13545790, 3500935, 7117835, 3831111, 7781407, -1410897, -2881386, 4953708, -4517232, -3811784, -3591130, 2081449, 5379984, 2966212, -2354716, -391379, 2770791, -4709432, -3455838, -292058, -515933, 8014946, -4350802, -7466801, -1074279, 4170950, 6785512, -4161823, -7029788, --1541893, 9896678, 1314797, 42950, -3505230, 533650, -192200, 3094524, 3138547, -143881, -1508070, 1730335, -4788352, -1049583, 1666984, -177167, 2816962, 1176821, 294205, -1973538, --201327, -215822, 1088774, -263067, 2938831, -505196, -291521, -1387811, 335544, -1770600, -95026, -134755, 741956, 1774358, 70330, 1497333, -81068, -1652489, -332860, 238908, --3153043, 3588445, -12938052, 7332046, 2153926, -2893734, 3933116, -10572599, -8825621, 1145683, --4358855, 10009421, 8888435, 9452686, -6310918, 3676492, 137976, 9423158, 664109, 6663105, -2665564, -2815888, -8483097, -7685307, 2449742, -10241350, -157840, -2416993, -4981625, -6839199, --4023848, 62814, 8236674, 33286, 3208341, -11716134, -6551436, -1242856, -7353521, 514322, -7348152, -7953206, 3278671, -95026, -2727841, -737661, -1713692, 8100309, 4337917, 4038343, --1953136, -2463701, 11142756, -3371013, -3053185, -9193377, 6703370, -13052406, 1774358, -4291209, -2025077, 4639639, -3159485, -6965363, -4323959, 477278, 9446781, -4754529, -1064615, -6140730, --4966593, 3063386, 3267396, 7479686, -8757975, -69793, -4649839, -3050501, 1809792, -3451543, --6887517, -3917010, -632971, 6286759, 6373195, 2217814, 313533, 934692, 2889439, 250719, -420907, 1328756, -1845762, 187905, 2615098, -790274, 275952, 3237869, -834297, -119185, -478889, 2357937, -56371, 370441, 815507, 404801, 1935420, -2330557, -2628520, -169114, --987843, 31139, 1394791, -624918, 2633352, 1682017, -12078522, 3218004, 1097901, 2004139, --16623671, 14829448, 291521, -343061, -306553, -5409512, 1732482, 174483, 5303211, -4671314, -5947993, 1684164, -3724274, -6413460, -8009577, 3994320, 699543, -711354, 539018, -4634270, -4974109, 3700651, 9185861, 5442798, 3627637, 5050345, -1206886, -5100274, -3810710, 278636, --2680060, 3949759, -4495757, -6822556, -7456063, 406411, -10196789, 4620848, 5326833, -6126771, -6209986, -7393250, 3690451, -10891500, 1457068, -2033130, 788663, -2926483, -168041, -10138270, --1695975, -3518652, -6410776, -1762547, -5009006, 1546188, -4514548, -2645700, -6477885, 2813741, --6194417, -503585, 9922985, -1742146, 293668, 3171833, -2209224, -10132902, -11502996, -1970853, --8042863, 343597, -2194728, 7444789, 546535, 2766496, -7576859, 612570, -1709397, -1435056, -5475547, 1298691, -652835, -3042448, 1488206, 2065342, 769873, 2826089, -120796, 1549410, --864899, -361851, 427886, 440234, 1030792, -341987, 3182571, -970126, -2715493, 1048509, --37581, 752156, 1050656, 609349, -395137, -1465658, 809064, -2523293, 949188, 4756140, -3252901, -10346039, -366683, 1800128, -9637370, -10960757, 5935108, -10760504, 2042794, 7117835, --5239323, -12360379, -5319317, 261456, 8099235, -3331284, 14315663, -1016834, -1167157, -8311299, --5921150, -1005022, 2863670, 781684, -2998424, -2516314, -707059, -3117610, -6186901, 5037460, --5134097, -3150359, 5345087, 1567126, -8719320, -9263171, -8537858, 7318088, -7944616, -8559870, -13877576, -8767639, 6097243, -1248225, 3708704, -12589623, 5695127, 692027, -2098629, -647466, --2510945, 4029753, 2914135, 11804718, -3048353, -2278480, 5550172, 11406896, 3077344, 2273648, --5486821, -3610457, -9501005, -2037425, -312996, -134755, 6759205, -2186675, 3578782, 11942157, --1919314, -476205, -1474784, -272730, -12256763, -13955422, 629213, 9147743, 33823, -18512920, -4748623, -6505802, 3022046, -11576011, -7264401, -1839320, 250719, -4268124, 1773285, 4222490, --606664, -615254, -493384, -2020782, 1811939, -2298344, 1802813, 234076, 525060, -2013266, --1443109, -2792803, 1184874, 147640, -952409, -2682207, -685584, -843961, -1792075, -2000381, -1083406, -2267206, -957241, 1829656, 457414, -1129576, -273267, -4295, -2931315, 237297, -5150203, -812823, 6092948, -881005, -2511482, -3659312, 5179731, 3205656, -2806224, 2368138, -5273683, -2702071, -17706540, -7693360, -3430068, -1944547, 7989176, -13894219, -10161356, 8572218, -5361730, 21530134, 6125697, 4981625, 5978058, 2748779, -3787088, 450435, -3990562, 6869264, -377420, 6932077, 281320, -182536, -9366250, 4907537, -6328635, 4982162, -907312, 5222680, -2143726, 7005629, -10843182, 1282048, -7496329, 9114994, 639950, -9145596, 12171937, 8937290, -5828271, -5483063, -18320720, 5295695, -1908039, -2290291, 9113384, -879395, 4269735, 8710194, --1828582, -11070278, 7516, 4948339, 3329137, -2983392, -1127429, -8121783, 3119757, 1091995, -1823214, -1235877, 1258962, 6955700, -4233764, 3161096, -1033477, -289373, 12684112, -3403762, -5890548, 4117263, -3844533, -4451197, 1686848, 914291, -1994476, 1022739, -2079838, 1986422, --1843615, 4743792, 559956, 4531191, 1005559, -163209, 5887864, 1995012, -1576790, 1566053, --1219234, -1851131, 967978, 2235531, -2044404, 1401233, -988379, -2301029, 35970, 2221035, --913754, -2561411, 907849, -1238024, -3712999, 1591822, 156229, -2050847, -1016297, -732292, --2034741, -270046, 3005403, 4006131, -3721589, 4614943, -5037997, -20020454, 4126927, 4909148, -20354386, -4231080, -3228742, 9645960, 12663174, -20552492, -11702175, 11277510, -5801427, 408559, -4655208, -13080323, -28676960, -11245298, 16370268, 13011603, 11030550, -3306051, 6205691, -3321620, -5720360, -5954436, 2047089, -14460081, 3601867, -5083094, 7480760, 7251516, 306553, -6810208, -6818261, 4294431, 11733851, -1177895, -7192460, -3578245, -18341120, -9376450, 4570382, -1200980, --12265353, 8395587, 11526618, -16221555, 15776489, -1472100, -1668058, 9911174, 2094870, 9371619, --1166621, 3368865, -3493956, -1873680, 4792647, 18801756, -6728067, 11979201, -941672, 1141388, -4561792, 10433012, -9560060, 1139240, 15319611, 4570919, -6929930, 4084514, 6089727, 1425392, -12054363, 8679592, 15137075, -1349157, 4388383, -124017, 590558, -8370355, -5753646, -6653978, --3164854, -4832, -1335198, -2688650, -2321967, 4509179, 6585259, 2994129, -3292093, 5252745, --1461900, -835371, -3080029, -2524367, 3379066, 1101659, -1132798, 214212, -3423089, -2960843, --3367254, 80531, -1850057, 3060701, 1948841, -1294933, 1424855, 3582003, -2117956, 1647657, -2161442, -1910724, -1656784, -2035278, -261456, -583579, 2297271, -756988, -860067, -12996571, --3260417, 13558138, 8637716, 10240813, -6526740, -3253975, -989990, -1348620, 14515379, 1940788, --14792941, -6550899, -4476967, 9608379, 1928440, 2127083, 8163122, 17803176, -26140782, 17455284, --3388729, -3025805, -6711960, 5246840, 5408438, 10290205, 1648731, 9810779, -949725, -2523293, -3078955, -1552631, 5031018, 9028021, 1115618, -597537, 11825656, -8676371, -1574642, 2950106, --974421, 10453950, -12199855, 1194538, -10433549, 1782948, -11065983, -1490354, 388695, 6172942, -15095736, -8702141, -4795868, -9023726, -489089, -13225815, -8606041, -8669391, 5944235, 10949482, -175557, 21616034, -13619878, 19325206, -13534516, -3094524, 5972689, 4456029, 19110456, 11075647, --14257681, 7545184, -5962489, -19673634, -470299, -12443057, 15807090, 24058260, 15282031, -2899640, --8473970, -3051038, 13435195, -1917166, 7010461, 891743, 3115462, 4817880, 1515050, 1966558, -1595580, -5772973, 4076461, 151398, 1723893, -2178622, -1923072, -5474473, -3105261, -1832340, -3416110, -1620276, 2288681, 2969970, -1096290, -627065, 72478, 3372623, 2081985, 1303523, -6123550, -7516, 6396817, -5611912, -2528662, 4209605, 3957276, -2297808, 1341104, -1912871, --4183835, 580894, -13309567, -8424041, 8590, 16798154, -2922188, 7582765, 15613280, -12713640, -5855114, -20494510, 12792023, -12474733, -5994164, 20367808, 7052873, 21938156, -9041980, 404801, --9600863, 6528351, 28025198, 7403450, 9638443, -13790603, -2487860, 955093, 10907606, 9717900, -18002892, -14214731, -4833449, -15490873, -13169980, 1258962, 1285806, 9598178, -8930848, 6802155, --21202642, 13684303, 10371272, 5104032, -3442416, -2262911, 1571958, 6635725, 2284923, 2064269, -67646, 14821932, 12642773, 5661841, 1291175, -10740639, -10675678, 30303142, 1283122, 4025995, -16907138, 7687992, -4571456, -3256659, 10814728, 21903260, -15504295, -6245420, -17493938, -16127602, -21316996, 9750113, 382252, -3868155, 7176354, 16374026, 10430328, 16887274, 4799089, -7120519, -12189654, -8302172, -21845814, 6803765, 948651, 666794, 213138, 9518184, 16088411, -2947958, -8589935, 9678709, 8686571, 1310502, 2048699, 8522826, 259309, -2243047, -1646583, -3148748, -8181376, -4364224, -1187559, 2320356, 4680441, 957778, -599148, 8877161, 1937030, -1517734, -6600828, 8506720, 3919695, -3120294, 104690, -1232656, 2661806, 381715, 163209, 77846, --1758252, 3164317, 1233193, 1031866, 2914672, 3964792, -518617, -3668439, -1414655, -199179, -4963372, 2016487, 831076, -663572, 6529961, -13982803, -10441602, -4072166, -13013214, 14706505, --1637993, -3707631, -12394202, -2028298, -11540577, -28572806, 4978941, -3482145, -9020505, 6512781, --15170898, -874026, -8291435, -22888954, -5255966, -9899900, -10870025, 18385682, -4913443, -6563784, --3343632, -365609, -4664872, -6417218, -1056025, 4897337, 15495168, 11754252, -467078, -838056, --26061862, 1658394, 3525095, 10742787, -6045167, -5338645, 39462160, -6713034, -19351512, -18688476, -16339129, -10894721, 4682588, -22159884, 5485747, -6158446, -11950210, -10205379, -25346750, 4148402, -7210177, 18074296, 5237176, -9652939, 14118631, 1767379, 13275744, 14914274, 42643656, 11548630, -2903935, -16510391, -18672908, -4905390, 1919850, -2274722, -16909824, 7668127, 19468550, 4619774, -13826573, 21637508, 19221052, -8080444, -15518254, -10445897, 1285269, 3536369, -1969243, -16275242, -3083250, -13211856, 3996467, -5796059, 788663, -7237020, 4748623, -1096827, 2988224, 527744, --3229816, -7389491, -1818382, -52613, 4312147, 6242198, 4726075, 7176891, 310311, 6164352, -10422812, 397821, 1896765, 6068252, 1945083, -5177046, -3146064, -8920647, -2786360, 5612986, -2978560, 835371, -1306207, 3623342, 1832877, -1748589, -4350802, -7757248, 931471, 1428077, --1240709, -2414309, -710817, -2615098, -5699959, -17220134, -7433515, -2644089, 5349382, -6278169, -10288057, -5299990, -7029251, 19945292, 10391137, 22677428, 324807, -6554657, -8902930, 24042154, --20590074, -7671349, 28067074, -16885664, 5644661, 5859946, 7314330, 1672890, 15794205, -4888747, -14219563, -5352066, 3146064, 3412352, -7243999, 10554345, -15908559, -11086921, -10305774, -4737886, --14133664, -26120380, -4709432, -7807714, 4209605, -6717329, -34685620, 9676561, 21874268, -1240709, --4589173, 34171296, -42253352, -9137006, 23656142, -5765994, 18371722, -13435195, -8290898, 6374805, --40318468, 13081397, -13689135, 20211580, 14899242, -21449066, 42439644, 6273337, 2312840, -2151779, -16764868, -30639222, 12620225, -1421097, -4798552, 8238821, -19746650, 28074054, 25535728, -47036336, -6835978, -9343701, -44096968, -7581691, -19645180, 10895795, 2864206, 7682623, -17756468, 27748174, --2636036, -7414188, 12885976, -503585, 9178345, -1908576, 14445049, 376883, 7243999, 2261300, --547608, -1495186, 8114267, -5777805, -6440304, 179315, -7579544, 11516955, -2420751, -5914170, -704912, 5320928, 2625836, 5487895, 2202245, 13361106, 3245385, -7200513, 13902272, -7448547, -7948911, 11937325, -3227668, 2720862, 8436390, -5696737, 8297340, 1344325, 25973814, -11578695, --33418066, -33528126, 2697776, 4203163, -14720464, 8803072, -18636400, 6036577, -8427263, 17314624, -22166326, 766115, 21447456, 19520090, -10785200, -228170, -13807783, -3429532, -3209951, 7567196, --1316944, -2088428, -2278480, -22378928, -33872260, -13586055, 17746804, 13736916, -14506789, -16690780, -9824738, 9958955, -22010634, 11182484, -14627048, -2679523, 17119740, 23756000, 222265, -13988172, -9128953, 1868311, 14828375, 2623151, 12384001, 12787728, -3531000, -48535276, 5571110, 1343251, -19731616, -7089918, 20123532, 19950660, -13228499, -65786016, -8760660, 2772938, -7839389, 39688720, -41633804, 29070486, 41371808, -10602127, 19496468, -16209743, 27679990, 19429358, -32442572, 41181220, --42405824, -36101884, -34027952, 10934987, 25752624, 21461414, 7258495, -26554710, 24693914, 3524021, --8740795, -11313481, 1547799, 23327578, -17875118, -7089381, 35584340, 6664179, 16327855, 3218541, -1825361, 8850854, -13305809, 7334731, -5377836, 386010, 3739306, -3309272, -6845641, -4463008, --5978595, -13358959, 3125126, 12620761, -2385318, 12903692, 10004053, -8060043, -6373195, -5942088, -8006893, 5084705, -16334834, -9399536, 963683, 936303, -2344515, 2316598, 10889353, -128312, -8680666, 1026497, -6244346, -25970056, -49162344, 10479183, 18284212, -2536178, 25090662, 9680319, --30969936, -7728794, 6725919, 7763691, 8673686, -6169184, 14525043, 1340567, -9157944, -4141422, -5248987, 20611012, 26866094, 20327006, 32196686, -30735322, -8444443, -7895224, -31434328, -7458211, -5548561, 1714766, 3631932, -12469364, -14107894, 16148003, 36172216, -16960288, 18731426, -12077448, -4962298, -11132018, -1802276, -28004260, -10111427, -1509681, -38807712, -22670448, -37977176, -32076426, -21443698, 50331648, 40214852, 1264868, -2398202, 221728, -8910983, -17191680, -60797948, -20279224, --8615704, 5055714, 2731599, -21413634, -14899778, 7984344, 26934814, 16076063, 8767102, 17614734, -30195230, 11856257, -29972966, 23111220, -17701708, -9256728, 17963700, 40227736, 8767639, 51556252, --12151536, -53436372, -6068252, -17193290, -32693828, 49573048, 14161581, 16183974, 18254, -4321811, -14434848, 11903502, 800475, -1920387, -8477192, -1648194, -2438468, 13610751, 16445430, 19600620, --2107218, -633508, -676457, -620623, 12899934, -5400922, -4179003, -7423314, -5786395, 7359964, --1383516, -139050, 2270964, 4730370, 7625715, 9400610, -1194001, -5427765, -9564892, 4937602, -1917166, 4664872, 12182675, 10699300, -5262946, 2784750, 5545877, -9273908, -2783676, -2037425, --8924405, -4029216, -295279, 8314520, -21051246, -34443492, 21228950, -3394098, -20825222, 9968619, -22514218, 19487340, -40233644, -34765612, 8604967, -16185047, 4049617, 19583978, -10747619, -7940858, -32411434, 8750459, -4591857, -10395968, -9287867, 12124156, -7377143, -1499481, -1028645, -13288092, --5183489, -22068078, -29364154, 10390063, 15913928, -18568218, 13444858, 9178345, -6468758, -12904766, -1897302, 23080080, 13251585, 4098473, -23249194, -25987236, -12708808, 6931004, 28933048, -21816286, --11594801, -9957882, 17245368, 46675556, 12291123, -45788108, -10241886, -5449240, 23396834, 460635, -12079059, -6039798, -10927471, -10197863, -25971130, 24059334, 25480430, 10232760, 26944478, -8530879, -17397838, -8167417, -19589346, -21659520, -23164906, 4013647, -43299176, 45251240, -2212445, -17275970, --25068114, -20513300, -1463510, -13454522, -4125853, -23851028, -14770393, -42330124, -11839614, -27910308, -10189273, -9950902, 8152922, 9416179, 10082436, -7044820, 23285166, -5363341, 16848620, 569620, -4001299, -1376000, 7291244, -3666292, -9431211, 1867237, 2619393, 8646843, -14044543, -4937065, -3549791, -13838385, -17717, 5006322, -17286170, -7592429, 4056597, -2440615, -13255343, -20445654, --12312061, 7405598, -3937948, 9320616, 2201171, 321586, 13785234, 921271, 11850889, 4572530, -7366943, 27734214, 16589311, -7842074, 4184372, 35009352, 26261578, 10012106, 5141613, 16452946, -14889041, -23845658, -34368328, 11627550, 26725434, 38292316, 139586, -8624294, -24023362, -14114873, -16023449, -504659, -20526722, -41261212, -41300944, 8644695, -12485470, 23076322, -47576964, -15721191, -9130564, 6799470, 8931921, -15060840, 6787122, -1307818, -9030169, -1800128, -22395034, 20528334, -25242596, 18821620, -30118458, -16060493, -838056, 10152766, 14966350, 16133508, 12831215, -3410204, --2259690, -4080219, 21340618, 59531468, 37484328, -31016106, -30618284, -19399830, -39408472, 46275052, -24566140, -14349486, -40878424, -39055212, 44288628, 27315992, 5827734, 34170760, -35618700, -3926674, -2079301, -9144522, 3340411, -13224741, -36035312, 8922258, -27573690, 36710696, 34586296, -13249437, --6293201, 401579, 3857418, 39071316, 39851928, -63382444, -35478040, -20365662, 7868917, 17812304, -17112760, -24553792, -26456998, -31108448, -3969624, 32270236, 600759, 6429566, -7481296, -34405908, -7811472, -14419816, -18131742, 7876970, 60157460, 20395726, -11409581, -15426449, -14570140, -11904039, -15700790, 18845780, 21637508, -3890704, 13912473, -21301964, 5020280, 7808251, 9575093, -7646116, -4008278, 17859010, -4770635, -5012227, -3134789, 17635136, 11276974, 27436252, 6740415, -9696962, --7526930, 10198400, 33694556, 27627914, 5574868, -20249698, -25163676, -7978439, -6192269, 5990406, --12450573, 23312546, -38139848, 33227478, 48988932, 53179748, -59977608, 11013907, -1905892, -5150740, -25354802, -10827613, -17847736, 17576616, 8912057, 36453000, -3770445, -28857886, 813896, -13165685, -21475374, -33155536, -11808476, -15576773, -22164178, 30285962, -22216256, -3135326, 20776368, 12119324, --7429757, -11567421, -31115428, 4030290, 40795748, 24919400, -1846836, 12182138, -9314173, 33419140, --22603876, 15454366, -12523051, 20775294, 34367792, -7624104, -22499186, 11092290, -30647276, 50616188, -5815386, -26798448, -9310415, -41831908, 5216238, 60031832, -11052025, -35242356, -24785182, 36828272, -10845329, -19252190, -1123671, 9537512, 20488604, 50604380, -41384156, 18434000, 41275708, -6209986, --49125836, -47346108, -27926952, 83122112, -60949344, 20666846, -64188824, -30693984, 133539120, 12936978, --58486180, -55940340, -64764884, 81541568, 10302553, -15316390, -64906084, -15452755, 20020990, 66015796, --23839752, 7272454, -28724204, 9900973, 39816496, 24526410, -36048736, 17019882, 6336151, 15636365, -13537737, -36253284, 993211, -8506183, -14024679, 7344394, -13616657, -26673894, 10009421, -7761006, -34596500, 5345087, -32389958, -36488968, -11977590, 1187022, 27808302, 21333102, 4618164, -16916802, -6901476, -510027, -13963476, 1184874, 17540110, 15965467, 3513820, -26780732, 6355478, 10784126, -16722455, 15469935, 10601590, 21766358, -56346748, 9863392, -50626928, 22338662, 23922430, 47257524, -20907364, 10828686, 12352326, -14744086, -36152352, -25150254, -23746874, 10122164, 5872294, -6171331, -21592948, 33324114, -14936286, -20955682, 23133230, 4101694, -30861488, -7109782, 13946296, -25458956, --4518306, 5604396, 12928925, 6887517, 18294414, 31389232, 5520107, -20044076, -2341294, 6033356, --15936476, -7128572, 14653892, -11171747, -20171850, 27997282, -6790344, -6956774, -11180874, -11028402, -18126910, 4610111, 4117263, 24160802, -11590506, -18694918, -1119376, 1782948, -7958038, 6166500, --1352378, -6668474, -1240172, -23570244, 5215701, 4597763, -4045322, 12677670, 8531953, 4421669, -5635534, -24342800, 28765006, -10801843, -10464151, 8811125, -26387742, 8564165, -19772956, 2283312, --15652471, 5057861, 6838662, 10653130, 907312, 9448391, 14223858, -5520644, -3267933, 7903814, --532039, -5030481, 4299799, 997506, -3338800, -5061082, -4638028, -3042984, 10249939, -9859097, -9939628, 678605, 2653753, 4991289, 2920578, 7274601, -463320, -205085, -4511327, -988916, --6196564, 12381317, 846109, -5559835, -9126806, -2966749, 4734128, -8860518, 11675332, -5706401, --14987825, 846109, 6252399, -865973, -513249, 1530619, -7132330, -26132728, 42376296, -2136746, -24011014, -21688512, 2743410, -3882114, 7617662, 6896107, 12890271, -6502044, 9497783, -5819681, -5253282, -888521, 4164508, 10264972, -1221381, 15888695, -6320045, 12018929, 668404, -449898, --4437775, 7717520, -6062347, 6977711, -4037269, 542777, -3343632, 3848291, -2724083, 9064528, --2775623, -6248641, 14468134, -9921911, 7580081, 6137509, 2253247, 7058779, -8815957, -6080063, -6656663, 6260452, -3862249, -765578, 7095286, -566936, -9816685, 4400194, -4974646, 5133560, -6888591, 3301219, 2376728, 2290828, -10572062, 5250598, 3013457, -3131031, 3904662, -4920959, -2444373, -2413235, -457951, -1265942, 3723737, 7204808, -9863929, 8894877, -1723356, -3412352, -5094368, -6809671, 3283503, 4922033, -1176284, -2423972, 3405909, -1277216, 2007360, -853625, --3503083, -470836, 3799972, -930934, 1478006, -705448, -2567854, 1745367, 1540283, 2741800, --3731790, 3080029, -247497, -1473174, 3557307, -3889630, 6204617, 3230352, -2316061, 6398428, --480499, -2420214, 255014, -2416993, 3782256, -4059281, 4336843, 1832340, 2333778, 1174674, --2493766, 2177549, 974421, 579284, 392453, 261456, -1018444, 1227824, -2612414, 3262565, -1263794, -2889976, 10449655, -35759360, -111293344, -16433619, 53932980, 27856084, 131200512, 24330990, -28149752, 17680232, -35443144, -49896244, -35565552, -63940252, -54955716, -31216896, -12846784, 36457292, -99621768, 78989816, 68032816, 38626788, -30762704, -50018116, -36817532, -68898792, -65253976, -20082194, --9229885, -15310485, 25184614, 39412768, 26053808, 48085916, 37156836, 11291469, 34170224, 6876243, --5182415, 3049427, -20742544, -54444616, -46282032, -39361764, -55173688, -23181012, 15995532, 10948409, -35175244, 39821328, 34808564, 35711044, 36487896, 23073102, 22573274, 2368675, -20426328, -38086696, --26024818, -35860828, -47352552, -23387170, -21779780, -17766670, 6587406, 17812304, 17051558, 33292976, -41648296, 20088636, 29329258, 25014964, -7077569, 2807835, 11193759, -13973676, -12661027, -22353694, --40098888, -40257804, -31987842, -33121178, -6584185, 13799193, 9174050, 26213796, 39355860, 31019328, -28635620, 29444686, 19611894, 6410239, 1766305, -9224516, -17289928, -18564460, -27628988, -34916472, --37164352, -31993212, -28748364, -16441135, 3605625, 18033494, 41303088, 54681912, 47960828, 39767104, -33712808, 19489488, 3999688, -16940962, -34868692, -47509316, -49798000, -54880556, -40511744, -16920024, --4352413, 11444477, 32559074, 42089604, 45386532, 46777024, 39070244, 16564078, -1279900, -12120935, --26682484, -34649112, -32581086, -28914256, -20886962, -8549132, 995359, 11500849, 14865419, 11462194, -12537010, 10005663, 6784975, 5341866, 5468567, 1833414, 1801202, -470836, -2814277, -3337190, --2980707, -4291746, -5121749, -5400922, -4730907, -3991635, -2706366, -787590, 926102, 956167, -603980, 410169, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +3634616, 3891240, -1843078, 3905199, -2352032, -512175, 5196911, -2124398, 2473901, 1511292, +-5755256, -2593624, 4327717, -1679869, -821413, 2725157, 1804960, 1943473, 523449, 6663105, +1141388, -1705639, 1496796, -2295123, 4129611, -1181116, -2263985, -979253, -5386963, -1818919, +-3966939, 1309965, -64425, 1466195, -1587527, 2268817, 1071594, -238908, 695248, 371515, +525597, 738198, -2847563, 7128572, 1053878, -2585570, 5277978, -1260036, -4549444, -4983236, +4872641, -960999, -385473, 3230889, 366146, -830539, 2522757, -262530, 1463510, 428960, +1859184, -958315, 2024003, -902480, 2404108, 3494493, 1900523, -2053531, -2113124, -1033477, +942208, -2194728, 1558536, -1073742, 1933272, 2520609, -3112778, -1751810, 2724620, 817654, +-854162, 4202089, 2436320, 2010045, -203474, 1114007, -78920, 568546, -478889, 646929, +253940, 312459, -947040, 1563368, 515396, 120259, -263604, 641024, 1021665, -523449, +1099512, -31675, 4567161, 899796, 1040993, 3833795, 49392, 2767570, 1318555, -309775, +296890, -2989297, 1402307, 243739, 4697084, 1665374, 1542967, 215285, 1391569, 5153961, +-4856535, 2755759, 731755, -3204046, -1431835, -1983738, -644782, -1840394, 1309965, 5951214, +3748970, 4446365, 3534758, 6067178, 4423280, -5492727, -9968082, -1256815, 476205, -2426120, +5265630, -215822, 7882876, -3669513, -3678640, 3402151, 195958, 289910, 3127810, -5743982, +1488206, -4110821, 5461051, 3218004, -8053, 8286066, 381178, -784368, -1012539, -1446867, +-2040646, 3927211, 2108829, -2009508, -646393, -5757404, -2519535, -754841, 6058052, 4131759, +755914, 3047279, 130997, 3244848, 23622, 1345935, -3442416, -2228551, 861678, 456340, +-161061, -1748589, 1644436, 1914482, -463856, -1797444, -306553, 1928977, -280247, 1029182, +-897648, -530965, -702764, 616865, -612033, 113280, -20401, 976031, -782758, 942208, +1481764, -686658, 369904, 120796, -5369, 1752347, -537408, 445066, -628676, 696322, +539018, 297963, -179315, 1536525, -50466, 74625, 679679, 3628174, 8248485, 2421288, +365072, 258235, 2326799, 2168959, 495532, 1303523, 1871532, -125628, -170188, 2359548, +9336185, 3122441, 7285875, -4126390, -3361886, -1366337, -4367445, -5120675, -2038499, 3788698, +-6309307, -883690, -734976, -9935870, 2007360, -10037339, -3325915, -1337346, 2396592, 32212, +2106145, -1959579, -85362, -6774774, 2505577, -2246268, -3768834, 715112, 1921998, -315143, +514859, 2898566, 5156108, -8650601, 2385854, 587874, -2537252, -2755222, -539018, 1195612, +-1137630, -5203890, -1204738, 1417339, 2733747, -356482, 6478422, 571768, 308164, 2641942, +-4115653, 6117644, 1970853, 3636227, 1641751, 3042984, -619012, -579821, 1827509, 1063541, +-834297, -1845762, -1480153, -3051574, -67646, -4096325, 290984, 2388002, -195958, -1744294, +-3193845, 2852395, -1692754, 1156957, 450972, -506806, -3038153, 254477, -274341, 748935, +-921807, -887448, 272730, -987306, -1665374, -905164, -689879, -168577, -1093606, -192200, +-617402, 1434519, -256624, -780610, -249645, 762894, -297963, -1304060, -1380832, 1481227, +34897, 126702, -869731, 4925791, 5382668, -165893, 5937793, 379031, -766115, 734439, +504122, -1092532, -48855, -4132296, -2352032, 3703873, 4359392, -5083094, -1203128, 2124398, +-3381750, -9731859, 2436857, 3611531, 4247186, -2228014, -2568391, -3463354, 5326833, 6067715, +1053341, 2400887, -4742181, -3840775, 4516158, 1712618, -3550327, 6264210, -6252936, 1053341, +615254, 5875516, 2171643, -1286343, 973884, -2020782, 3235721, -7638063, -2248952, -11009612, +-4793184, 5592048, -448287, 8568997, -1147830, -7132867, 4542465, 1007707, -2901787, -326954, +366146, -2879776, 1917166, 5138392, 5793911, 172336, 2779381, -251256, 6589554, -3330747, +2860448, -602906, -96100, 228707, 2292976, -657130, 8239358, 842350, 763967, -1253057, +4862440, 1677722, -1614908, -3439732, 94489, 3332358, 1163936, 994285, -2128156, -87510, +684510, -305480, -551903, -564788, -1127429, 922344, 95563, 419833, 719944, 1764158, +-660351, -1765768, 1999844, -501974, 217970, 69256, -214748, -201863, 805843, 750546, +979253, -313533, 914828, 9664, 537408, 922881, -185757, 146566, 778463, 1185948, +648003, 761283, 249645, 125091, 6022081, -8165270, -1122597, -5531918, -5745056, 2068027, +1122597, 11906723, 628139, 4388920, -9922985, -2364916, 2201708, -5148055, 3419331, 1007170, +850404, 2915209, 3368865, 7818988, 3485903, -1220308, 2480881, -3874597, 1145146, 3165928, +-205085, 670552, 3472481, 4493073, 10809359, 2131378, -1596117, -7369090, -301185, 5632313, +-8735963, 991064, -632434, 2774012, -4373888, -5141613, 9363029, -5948530, 1940788, -347892, +-5845988, 13545790, 3500935, 7117835, 3831111, 7781407, -1410897, -2881386, 4953708, -4517232, +3811784, -3591130, 2081449, 5379984, 2966212, -2354716, -391379, 2770791, -4709432, -3455838, +292058, -515933, 8014946, -4350802, -7466801, -1074279, 4170950, 6785512, -4161823, -7029788, +-1541893, 9896678, 1314797, 42950, -3505230, 533650, -192200, 3094524, 3138547, -143881, +1508070, 1730335, -4788352, -1049583, 1666984, -177167, 2816962, 1176821, 294205, -1973538, +-201327, -215822, 1088774, -263067, 2938831, -505196, -291521, -1387811, 335544, -1770600, +95026, -134755, 741956, 1774358, 70330, 1497333, -81068, -1652489, -332860, 238908, +-3153043, 3588445, -12938052, 7332046, 2153926, -2893734, 3933116, -10572599, -8825621, 1145683, +-4358855, 10009421, 8888435, 9452686, -6310918, 3676492, 137976, 9423158, 664109, 6663105, +2665564, -2815888, -8483097, -7685307, 2449742, -10241350, -157840, -2416993, -4981625, -6839199, +-4023848, 62814, 8236674, 33286, 3208341, -11716134, -6551436, -1242856, -7353521, 514322, +7348152, -7953206, 3278671, -95026, -2727841, -737661, -1713692, 8100309, 4337917, 4038343, +-1953136, -2463701, 11142756, -3371013, -3053185, -9193377, 6703370, -13052406, 1774358, -4291209, +2025077, 4639639, -3159485, -6965363, -4323959, 477278, 9446781, -4754529, -1064615, -6140730, +-4966593, 3063386, 3267396, 7479686, -8757975, -69793, -4649839, -3050501, 1809792, -3451543, +-6887517, -3917010, -632971, 6286759, 6373195, 2217814, 313533, 934692, 2889439, 250719, +420907, 1328756, -1845762, 187905, 2615098, -790274, 275952, 3237869, -834297, -119185, +478889, 2357937, -56371, 370441, 815507, 404801, 1935420, -2330557, -2628520, -169114, +-987843, 31139, 1394791, -624918, 2633352, 1682017, -12078522, 3218004, 1097901, 2004139, +-16623671, 14829448, 291521, -343061, -306553, -5409512, 1732482, 174483, 5303211, -4671314, +5947993, 1684164, -3724274, -6413460, -8009577, 3994320, 699543, -711354, 539018, -4634270, +4974109, 3700651, 9185861, 5442798, 3627637, 5050345, -1206886, -5100274, -3810710, 278636, +-2680060, 3949759, -4495757, -6822556, -7456063, 406411, -10196789, 4620848, 5326833, -6126771, +6209986, -7393250, 3690451, -10891500, 1457068, -2033130, 788663, -2926483, -168041, -10138270, +-1695975, -3518652, -6410776, -1762547, -5009006, 1546188, -4514548, -2645700, -6477885, 2813741, +-6194417, -503585, 9922985, -1742146, 293668, 3171833, -2209224, -10132902, -11502996, -1970853, +-8042863, 343597, -2194728, 7444789, 546535, 2766496, -7576859, 612570, -1709397, -1435056, +5475547, 1298691, -652835, -3042448, 1488206, 2065342, 769873, 2826089, -120796, 1549410, +-864899, -361851, 427886, 440234, 1030792, -341987, 3182571, -970126, -2715493, 1048509, +-37581, 752156, 1050656, 609349, -395137, -1465658, 809064, -2523293, 949188, 4756140, +3252901, -10346039, -366683, 1800128, -9637370, -10960757, 5935108, -10760504, 2042794, 7117835, +-5239323, -12360379, -5319317, 261456, 8099235, -3331284, 14315663, -1016834, -1167157, -8311299, +-5921150, -1005022, 2863670, 781684, -2998424, -2516314, -707059, -3117610, -6186901, 5037460, +-5134097, -3150359, 5345087, 1567126, -8719320, -9263171, -8537858, 7318088, -7944616, -8559870, +13877576, -8767639, 6097243, -1248225, 3708704, -12589623, 5695127, 692027, -2098629, -647466, +-2510945, 4029753, 2914135, 11804718, -3048353, -2278480, 5550172, 11406896, 3077344, 2273648, +-5486821, -3610457, -9501005, -2037425, -312996, -134755, 6759205, -2186675, 3578782, 11942157, +-1919314, -476205, -1474784, -272730, -12256763, -13955422, 629213, 9147743, 33823, -18512920, +4748623, -6505802, 3022046, -11576011, -7264401, -1839320, 250719, -4268124, 1773285, 4222490, +-606664, -615254, -493384, -2020782, 1811939, -2298344, 1802813, 234076, 525060, -2013266, +-1443109, -2792803, 1184874, 147640, -952409, -2682207, -685584, -843961, -1792075, -2000381, +1083406, -2267206, -957241, 1829656, 457414, -1129576, -273267, -4295, -2931315, 237297, +5150203, -812823, 6092948, -881005, -2511482, -3659312, 5179731, 3205656, -2806224, 2368138, +5273683, -2702071, -17706540, -7693360, -3430068, -1944547, 7989176, -13894219, -10161356, 8572218, +5361730, 21530134, 6125697, 4981625, 5978058, 2748779, -3787088, 450435, -3990562, 6869264, +377420, 6932077, 281320, -182536, -9366250, 4907537, -6328635, 4982162, -907312, 5222680, +2143726, 7005629, -10843182, 1282048, -7496329, 9114994, 639950, -9145596, 12171937, 8937290, +5828271, -5483063, -18320720, 5295695, -1908039, -2290291, 9113384, -879395, 4269735, 8710194, +-1828582, -11070278, 7516, 4948339, 3329137, -2983392, -1127429, -8121783, 3119757, 1091995, +1823214, -1235877, 1258962, 6955700, -4233764, 3161096, -1033477, -289373, 12684112, -3403762, +5890548, 4117263, -3844533, -4451197, 1686848, 914291, -1994476, 1022739, -2079838, 1986422, +-1843615, 4743792, 559956, 4531191, 1005559, -163209, 5887864, 1995012, -1576790, 1566053, +-1219234, -1851131, 967978, 2235531, -2044404, 1401233, -988379, -2301029, 35970, 2221035, +-913754, -2561411, 907849, -1238024, -3712999, 1591822, 156229, -2050847, -1016297, -732292, +-2034741, -270046, 3005403, 4006131, -3721589, 4614943, -5037997, -20020454, 4126927, 4909148, +20354386, -4231080, -3228742, 9645960, 12663174, -20552492, -11702175, 11277510, -5801427, 408559, +4655208, -13080323, -28676960, -11245298, 16370268, 13011603, 11030550, -3306051, 6205691, -3321620, +5720360, -5954436, 2047089, -14460081, 3601867, -5083094, 7480760, 7251516, 306553, -6810208, +6818261, 4294431, 11733851, -1177895, -7192460, -3578245, -18341120, -9376450, 4570382, -1200980, +-12265353, 8395587, 11526618, -16221555, 15776489, -1472100, -1668058, 9911174, 2094870, 9371619, +-1166621, 3368865, -3493956, -1873680, 4792647, 18801756, -6728067, 11979201, -941672, 1141388, +4561792, 10433012, -9560060, 1139240, 15319611, 4570919, -6929930, 4084514, 6089727, 1425392, +12054363, 8679592, 15137075, -1349157, 4388383, -124017, 590558, -8370355, -5753646, -6653978, +-3164854, -4832, -1335198, -2688650, -2321967, 4509179, 6585259, 2994129, -3292093, 5252745, +-1461900, -835371, -3080029, -2524367, 3379066, 1101659, -1132798, 214212, -3423089, -2960843, +-3367254, 80531, -1850057, 3060701, 1948841, -1294933, 1424855, 3582003, -2117956, 1647657, +2161442, -1910724, -1656784, -2035278, -261456, -583579, 2297271, -756988, -860067, -12996571, +-3260417, 13558138, 8637716, 10240813, -6526740, -3253975, -989990, -1348620, 14515379, 1940788, +-14792941, -6550899, -4476967, 9608379, 1928440, 2127083, 8163122, 17803176, -26140782, 17455284, +-3388729, -3025805, -6711960, 5246840, 5408438, 10290205, 1648731, 9810779, -949725, -2523293, +3078955, -1552631, 5031018, 9028021, 1115618, -597537, 11825656, -8676371, -1574642, 2950106, +-974421, 10453950, -12199855, 1194538, -10433549, 1782948, -11065983, -1490354, 388695, 6172942, +15095736, -8702141, -4795868, -9023726, -489089, -13225815, -8606041, -8669391, 5944235, 10949482, +175557, 21616034, -13619878, 19325206, -13534516, -3094524, 5972689, 4456029, 19110456, 11075647, +-14257681, 7545184, -5962489, -19673634, -470299, -12443057, 15807090, 24058260, 15282031, -2899640, +-8473970, -3051038, 13435195, -1917166, 7010461, 891743, 3115462, 4817880, 1515050, 1966558, +1595580, -5772973, 4076461, 151398, 1723893, -2178622, -1923072, -5474473, -3105261, -1832340, +3416110, -1620276, 2288681, 2969970, -1096290, -627065, 72478, 3372623, 2081985, 1303523, +6123550, -7516, 6396817, -5611912, -2528662, 4209605, 3957276, -2297808, 1341104, -1912871, +-4183835, 580894, -13309567, -8424041, 8590, 16798154, -2922188, 7582765, 15613280, -12713640, +5855114, -20494510, 12792023, -12474733, -5994164, 20367808, 7052873, 21938156, -9041980, 404801, +-9600863, 6528351, 28025198, 7403450, 9638443, -13790603, -2487860, 955093, 10907606, 9717900, +18002892, -14214731, -4833449, -15490873, -13169980, 1258962, 1285806, 9598178, -8930848, 6802155, +-21202642, 13684303, 10371272, 5104032, -3442416, -2262911, 1571958, 6635725, 2284923, 2064269, +67646, 14821932, 12642773, 5661841, 1291175, -10740639, -10675678, 30303142, 1283122, 4025995, +16907138, 7687992, -4571456, -3256659, 10814728, 21903260, -15504295, -6245420, -17493938, -16127602, +21316996, 9750113, 382252, -3868155, 7176354, 16374026, 10430328, 16887274, 4799089, -7120519, +12189654, -8302172, -21845814, 6803765, 948651, 666794, 213138, 9518184, 16088411, -2947958, +8589935, 9678709, 8686571, 1310502, 2048699, 8522826, 259309, -2243047, -1646583, -3148748, +8181376, -4364224, -1187559, 2320356, 4680441, 957778, -599148, 8877161, 1937030, -1517734, +6600828, 8506720, 3919695, -3120294, 104690, -1232656, 2661806, 381715, 163209, 77846, +-1758252, 3164317, 1233193, 1031866, 2914672, 3964792, -518617, -3668439, -1414655, -199179, +4963372, 2016487, 831076, -663572, 6529961, -13982803, -10441602, -4072166, -13013214, 14706505, +-1637993, -3707631, -12394202, -2028298, -11540577, -28572806, 4978941, -3482145, -9020505, 6512781, +-15170898, -874026, -8291435, -22888954, -5255966, -9899900, -10870025, 18385682, -4913443, -6563784, +-3343632, -365609, -4664872, -6417218, -1056025, 4897337, 15495168, 11754252, -467078, -838056, +-26061862, 1658394, 3525095, 10742787, -6045167, -5338645, 39462160, -6713034, -19351512, -18688476, +16339129, -10894721, 4682588, -22159884, 5485747, -6158446, -11950210, -10205379, -25346750, 4148402, +7210177, 18074296, 5237176, -9652939, 14118631, 1767379, 13275744, 14914274, 42643656, 11548630, +2903935, -16510391, -18672908, -4905390, 1919850, -2274722, -16909824, 7668127, 19468550, 4619774, +13826573, 21637508, 19221052, -8080444, -15518254, -10445897, 1285269, 3536369, -1969243, -16275242, +3083250, -13211856, 3996467, -5796059, 788663, -7237020, 4748623, -1096827, 2988224, 527744, +-3229816, -7389491, -1818382, -52613, 4312147, 6242198, 4726075, 7176891, 310311, 6164352, +10422812, 397821, 1896765, 6068252, 1945083, -5177046, -3146064, -8920647, -2786360, 5612986, +2978560, 835371, -1306207, 3623342, 1832877, -1748589, -4350802, -7757248, 931471, 1428077, +-1240709, -2414309, -710817, -2615098, -5699959, -17220134, -7433515, -2644089, 5349382, -6278169, +10288057, -5299990, -7029251, 19945292, 10391137, 22677428, 324807, -6554657, -8902930, 24042154, +-20590074, -7671349, 28067074, -16885664, 5644661, 5859946, 7314330, 1672890, 15794205, -4888747, +14219563, -5352066, 3146064, 3412352, -7243999, 10554345, -15908559, -11086921, -10305774, -4737886, +-14133664, -26120380, -4709432, -7807714, 4209605, -6717329, -34685620, 9676561, 21874268, -1240709, +-4589173, 34171296, -42253352, -9137006, 23656142, -5765994, 18371722, -13435195, -8290898, 6374805, +-40318468, 13081397, -13689135, 20211580, 14899242, -21449066, 42439644, 6273337, 2312840, -2151779, +16764868, -30639222, 12620225, -1421097, -4798552, 8238821, -19746650, 28074054, 25535728, -47036336, +6835978, -9343701, -44096968, -7581691, -19645180, 10895795, 2864206, 7682623, -17756468, 27748174, +-2636036, -7414188, 12885976, -503585, 9178345, -1908576, 14445049, 376883, 7243999, 2261300, +-547608, -1495186, 8114267, -5777805, -6440304, 179315, -7579544, 11516955, -2420751, -5914170, +704912, 5320928, 2625836, 5487895, 2202245, 13361106, 3245385, -7200513, 13902272, -7448547, +7948911, 11937325, -3227668, 2720862, 8436390, -5696737, 8297340, 1344325, 25973814, -11578695, +-33418066, -33528126, 2697776, 4203163, -14720464, 8803072, -18636400, 6036577, -8427263, 17314624, +22166326, 766115, 21447456, 19520090, -10785200, -228170, -13807783, -3429532, -3209951, 7567196, +-1316944, -2088428, -2278480, -22378928, -33872260, -13586055, 17746804, 13736916, -14506789, -16690780, +9824738, 9958955, -22010634, 11182484, -14627048, -2679523, 17119740, 23756000, 222265, -13988172, +9128953, 1868311, 14828375, 2623151, 12384001, 12787728, -3531000, -48535276, 5571110, 1343251, +19731616, -7089918, 20123532, 19950660, -13228499, -65786016, -8760660, 2772938, -7839389, 39688720, +41633804, 29070486, 41371808, -10602127, 19496468, -16209743, 27679990, 19429358, -32442572, 41181220, +-42405824, -36101884, -34027952, 10934987, 25752624, 21461414, 7258495, -26554710, 24693914, 3524021, +-8740795, -11313481, 1547799, 23327578, -17875118, -7089381, 35584340, 6664179, 16327855, 3218541, +1825361, 8850854, -13305809, 7334731, -5377836, 386010, 3739306, -3309272, -6845641, -4463008, +-5978595, -13358959, 3125126, 12620761, -2385318, 12903692, 10004053, -8060043, -6373195, -5942088, +8006893, 5084705, -16334834, -9399536, 963683, 936303, -2344515, 2316598, 10889353, -128312, +8680666, 1026497, -6244346, -25970056, -49162344, 10479183, 18284212, -2536178, 25090662, 9680319, +-30969936, -7728794, 6725919, 7763691, 8673686, -6169184, 14525043, 1340567, -9157944, -4141422, +5248987, 20611012, 26866094, 20327006, 32196686, -30735322, -8444443, -7895224, -31434328, -7458211, +5548561, 1714766, 3631932, -12469364, -14107894, 16148003, 36172216, -16960288, 18731426, -12077448, +4962298, -11132018, -1802276, -28004260, -10111427, -1509681, -38807712, -22670448, -37977176, -32076426, +21443698, 50331648, 40214852, 1264868, -2398202, 221728, -8910983, -17191680, -60797948, -20279224, +-8615704, 5055714, 2731599, -21413634, -14899778, 7984344, 26934814, 16076063, 8767102, 17614734, +30195230, 11856257, -29972966, 23111220, -17701708, -9256728, 17963700, 40227736, 8767639, 51556252, +-12151536, -53436372, -6068252, -17193290, -32693828, 49573048, 14161581, 16183974, 18254, -4321811, +14434848, 11903502, 800475, -1920387, -8477192, -1648194, -2438468, 13610751, 16445430, 19600620, +-2107218, -633508, -676457, -620623, 12899934, -5400922, -4179003, -7423314, -5786395, 7359964, +-1383516, -139050, 2270964, 4730370, 7625715, 9400610, -1194001, -5427765, -9564892, 4937602, +1917166, 4664872, 12182675, 10699300, -5262946, 2784750, 5545877, -9273908, -2783676, -2037425, +-8924405, -4029216, -295279, 8314520, -21051246, -34443492, 21228950, -3394098, -20825222, 9968619, +22514218, 19487340, -40233644, -34765612, 8604967, -16185047, 4049617, 19583978, -10747619, -7940858, +32411434, 8750459, -4591857, -10395968, -9287867, 12124156, -7377143, -1499481, -1028645, -13288092, +-5183489, -22068078, -29364154, 10390063, 15913928, -18568218, 13444858, 9178345, -6468758, -12904766, +1897302, 23080080, 13251585, 4098473, -23249194, -25987236, -12708808, 6931004, 28933048, -21816286, +-11594801, -9957882, 17245368, 46675556, 12291123, -45788108, -10241886, -5449240, 23396834, 460635, +12079059, -6039798, -10927471, -10197863, -25971130, 24059334, 25480430, 10232760, 26944478, -8530879, +17397838, -8167417, -19589346, -21659520, -23164906, 4013647, -43299176, 45251240, -2212445, -17275970, +-25068114, -20513300, -1463510, -13454522, -4125853, -23851028, -14770393, -42330124, -11839614, -27910308, +10189273, -9950902, 8152922, 9416179, 10082436, -7044820, 23285166, -5363341, 16848620, 569620, +4001299, -1376000, 7291244, -3666292, -9431211, 1867237, 2619393, 8646843, -14044543, -4937065, +3549791, -13838385, -17717, 5006322, -17286170, -7592429, 4056597, -2440615, -13255343, -20445654, +-12312061, 7405598, -3937948, 9320616, 2201171, 321586, 13785234, 921271, 11850889, 4572530, +7366943, 27734214, 16589311, -7842074, 4184372, 35009352, 26261578, 10012106, 5141613, 16452946, +14889041, -23845658, -34368328, 11627550, 26725434, 38292316, 139586, -8624294, -24023362, -14114873, +16023449, -504659, -20526722, -41261212, -41300944, 8644695, -12485470, 23076322, -47576964, -15721191, +9130564, 6799470, 8931921, -15060840, 6787122, -1307818, -9030169, -1800128, -22395034, 20528334, +25242596, 18821620, -30118458, -16060493, -838056, 10152766, 14966350, 16133508, 12831215, -3410204, +-2259690, -4080219, 21340618, 59531468, 37484328, -31016106, -30618284, -19399830, -39408472, 46275052, +24566140, -14349486, -40878424, -39055212, 44288628, 27315992, 5827734, 34170760, -35618700, -3926674, +2079301, -9144522, 3340411, -13224741, -36035312, 8922258, -27573690, 36710696, 34586296, -13249437, +-6293201, 401579, 3857418, 39071316, 39851928, -63382444, -35478040, -20365662, 7868917, 17812304, +17112760, -24553792, -26456998, -31108448, -3969624, 32270236, 600759, 6429566, -7481296, -34405908, +7811472, -14419816, -18131742, 7876970, 60157460, 20395726, -11409581, -15426449, -14570140, -11904039, +15700790, 18845780, 21637508, -3890704, 13912473, -21301964, 5020280, 7808251, 9575093, -7646116, +4008278, 17859010, -4770635, -5012227, -3134789, 17635136, 11276974, 27436252, 6740415, -9696962, +-7526930, 10198400, 33694556, 27627914, 5574868, -20249698, -25163676, -7978439, -6192269, 5990406, +-12450573, 23312546, -38139848, 33227478, 48988932, 53179748, -59977608, 11013907, -1905892, -5150740, +25354802, -10827613, -17847736, 17576616, 8912057, 36453000, -3770445, -28857886, 813896, -13165685, +21475374, -33155536, -11808476, -15576773, -22164178, 30285962, -22216256, -3135326, 20776368, 12119324, +-7429757, -11567421, -31115428, 4030290, 40795748, 24919400, -1846836, 12182138, -9314173, 33419140, +-22603876, 15454366, -12523051, 20775294, 34367792, -7624104, -22499186, 11092290, -30647276, 50616188, +5815386, -26798448, -9310415, -41831908, 5216238, 60031832, -11052025, -35242356, -24785182, 36828272, +10845329, -19252190, -1123671, 9537512, 20488604, 50604380, -41384156, 18434000, 41275708, -6209986, +-49125836, -47346108, -27926952, 83122112, -60949344, 20666846, -64188824, -30693984, 133539120, 12936978, +-58486180, -55940340, -64764884, 81541568, 10302553, -15316390, -64906084, -15452755, 20020990, 66015796, +-23839752, 7272454, -28724204, 9900973, 39816496, 24526410, -36048736, 17019882, 6336151, 15636365, +13537737, -36253284, 993211, -8506183, -14024679, 7344394, -13616657, -26673894, 10009421, -7761006, +34596500, 5345087, -32389958, -36488968, -11977590, 1187022, 27808302, 21333102, 4618164, -16916802, +6901476, -510027, -13963476, 1184874, 17540110, 15965467, 3513820, -26780732, 6355478, 10784126, +16722455, 15469935, 10601590, 21766358, -56346748, 9863392, -50626928, 22338662, 23922430, 47257524, +20907364, 10828686, 12352326, -14744086, -36152352, -25150254, -23746874, 10122164, 5872294, -6171331, +21592948, 33324114, -14936286, -20955682, 23133230, 4101694, -30861488, -7109782, 13946296, -25458956, +-4518306, 5604396, 12928925, 6887517, 18294414, 31389232, 5520107, -20044076, -2341294, 6033356, +-15936476, -7128572, 14653892, -11171747, -20171850, 27997282, -6790344, -6956774, -11180874, -11028402, +18126910, 4610111, 4117263, 24160802, -11590506, -18694918, -1119376, 1782948, -7958038, 6166500, +-1352378, -6668474, -1240172, -23570244, 5215701, 4597763, -4045322, 12677670, 8531953, 4421669, +5635534, -24342800, 28765006, -10801843, -10464151, 8811125, -26387742, 8564165, -19772956, 2283312, +-15652471, 5057861, 6838662, 10653130, 907312, 9448391, 14223858, -5520644, -3267933, 7903814, +-532039, -5030481, 4299799, 997506, -3338800, -5061082, -4638028, -3042984, 10249939, -9859097, +9939628, 678605, 2653753, 4991289, 2920578, 7274601, -463320, -205085, -4511327, -988916, +-6196564, 12381317, 846109, -5559835, -9126806, -2966749, 4734128, -8860518, 11675332, -5706401, +-14987825, 846109, 6252399, -865973, -513249, 1530619, -7132330, -26132728, 42376296, -2136746, +24011014, -21688512, 2743410, -3882114, 7617662, 6896107, 12890271, -6502044, 9497783, -5819681, +5253282, -888521, 4164508, 10264972, -1221381, 15888695, -6320045, 12018929, 668404, -449898, +-4437775, 7717520, -6062347, 6977711, -4037269, 542777, -3343632, 3848291, -2724083, 9064528, +-2775623, -6248641, 14468134, -9921911, 7580081, 6137509, 2253247, 7058779, -8815957, -6080063, +6656663, 6260452, -3862249, -765578, 7095286, -566936, -9816685, 4400194, -4974646, 5133560, +6888591, 3301219, 2376728, 2290828, -10572062, 5250598, 3013457, -3131031, 3904662, -4920959, +2444373, -2413235, -457951, -1265942, 3723737, 7204808, -9863929, 8894877, -1723356, -3412352, +5094368, -6809671, 3283503, 4922033, -1176284, -2423972, 3405909, -1277216, 2007360, -853625, +-3503083, -470836, 3799972, -930934, 1478006, -705448, -2567854, 1745367, 1540283, 2741800, +-3731790, 3080029, -247497, -1473174, 3557307, -3889630, 6204617, 3230352, -2316061, 6398428, +-480499, -2420214, 255014, -2416993, 3782256, -4059281, 4336843, 1832340, 2333778, 1174674, +-2493766, 2177549, 974421, 579284, 392453, 261456, -1018444, 1227824, -2612414, 3262565, +1263794, -2889976, 10449655, -35759360, -111293344, -16433619, 53932980, 27856084, 131200512, 24330990, +28149752, 17680232, -35443144, -49896244, -35565552, -63940252, -54955716, -31216896, -12846784, 36457292, +99621768, 78989816, 68032816, 38626788, -30762704, -50018116, -36817532, -68898792, -65253976, -20082194, +-9229885, -15310485, 25184614, 39412768, 26053808, 48085916, 37156836, 11291469, 34170224, 6876243, +-5182415, 3049427, -20742544, -54444616, -46282032, -39361764, -55173688, -23181012, 15995532, 10948409, +35175244, 39821328, 34808564, 35711044, 36487896, 23073102, 22573274, 2368675, -20426328, -38086696, +-26024818, -35860828, -47352552, -23387170, -21779780, -17766670, 6587406, 17812304, 17051558, 33292976, +41648296, 20088636, 29329258, 25014964, -7077569, 2807835, 11193759, -13973676, -12661027, -22353694, +-40098888, -40257804, -31987842, -33121178, -6584185, 13799193, 9174050, 26213796, 39355860, 31019328, +28635620, 29444686, 19611894, 6410239, 1766305, -9224516, -17289928, -18564460, -27628988, -34916472, +-37164352, -31993212, -28748364, -16441135, 3605625, 18033494, 41303088, 54681912, 47960828, 39767104, +33712808, 19489488, 3999688, -16940962, -34868692, -47509316, -49798000, -54880556, -40511744, -16920024, +-4352413, 11444477, 32559074, 42089604, 45386532, 46777024, 39070244, 16564078, -1279900, -12120935, +-26682484, -34649112, -32581086, -28914256, -20886962, -8549132, 995359, 11500849, 14865419, 11462194, +12537010, 10005663, 6784975, 5341866, 5468567, 1833414, 1801202, -470836, -2814277, -3337190, +-2980707, -4291746, -5121749, -5400922, -4730907, -3991635, -2706366, -787590, 926102, 956167, +603980, 410169, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -3556770, -2687039, 1690070, -3508988, -618475, 4480188, 1328756, 1105954, 2470143, -584652, 675384, --1165547, -4686346, -1841467, -233539, -1034013, 1345935, -1450625, -455803, -3969087, -6442, -684510, -2804077, -609885, -3539590, -1258962, -1129576, -4282620, -1969243, 1363115, 1862942, -4799626, 2837900, 6131603, -670552, -1000191, 892816, -2115808, 5325223, 313533, 2511482, -4226248, 733903, -1712618, 1721208, -2259690, -3012920, -756451, -1308891, -1665374, -5558225, --1797981, 14496, 862752, 1642825, 459562, 2807298, -3152506, 2474975, -25233, 604517, -1755568, -2205466, -4909685, -2129230, 2083059, 3048890, 2319819, 179315, 2365453, 1780264, -3218541, 1602560, 1387274, -2146947, 161598, -363462, -432181, -1831804, -2245194, -987843, --522375, -223875, -1731409, -4832, 244276, 654983, 157840, 1221918, -674310, 544387, --1083942, -1656247, 808528, -260919, -41876, 1112933, 793495, 971736, 70330, 70867, --946503, 537945, 176094, 308164, -139050, 1513439, -329639, 55835, -661425, -566936, --743566, 624918, -501974, -1437203, -2571075, 2444910, -3954054, -2429878, 6368900, -1031329, -5630702, -2879776, 548145, 2785286, 1240172, 186831, -3778498, -5360656, -5592048, 602906, -145492, -1582696, 760746, -4950487, 9863392, 1115618, -5483600, 1460289, -2871723, -3128884, -2944200, 4182225, -60130, 941672, 1999307, -302258, 23622, 3283503, -1797444, -802085, -199179, 5979132, -115964, -699006, -2257005, -3532074, 1844689, -871342, -3623342, -1637993, --4362613, 585726, -3956739, 89657, -2995740, -990527, -2634426, -5487895, -2247342, -344671, -5184026, 762357, -1496259, 2825015, 4747013, 716186, -6458557, 2976412, -14496, 1207960, -2125472, -1502165, 4098473, -2042794, -3653944, -3812320, -6749541, 631360, -2302639, -2396592, --3039763, -3187403, -181999, -3476776, 1103807, -543313, -1972464, -731755, -2228551, 47245, --96100, -2557116, -1061394, 1036698, -370441, 165356, 575526, 239981, 439697, 324807, --693637, -2289755, -411243, -859530, 646393, -293132, 271120, -438624, 19864, -35433, --495532, -1437740, -1180042, -195421, -520228, -554588, -462783, -1077500, -397821, -4952098, -8290361, -2076080, -7517804, 582505, 2578591, 245887, 2377265, 1941325, -5949067, 2137283, --1376537, -231391, 255014, -1079111, 4563403, -1394791, -2941516, -247497, 3650185, 2300492, -1364726, 2149631, 8829916, 2338610, -3009698, 3993246, -3677029, 1234803, -2964064, 8299488, -1307281, -2686502, -1609539, -2693481, -922881, 5509370, -4374961, -3690451, -1113470, 4564477, -2625299, -4203163, 1204738, 958851, -2452426, 129923, -9014063, 3011846, -2067490, -1716913, --5711233, 8682276, 496069, -4518843, -3546569, -4435091, 348966, -954557, 491237, -24159, --5199058, 6873022, -3876208, -3557844, 2724620, 736587, 2705830, -1927367, -401579, -4227859, -387084, 924492, -5369246, -4008278, 396748, -3741990, 1353989, -3346853, -944893, -943819, -2392834, -4322885, -4491999, -918586, -712428, -1072668, -289373, -1937030, -491237, -1409823, --1162862, -913754, -1401233, -1694365, -153545, -2275259, 603980, -1509681, -5906, 144955, --547608, -856846, -118112, -603443, 1174137, -178778, -992137, -58519, -1753420, -343597, --1075352, 86436, 235686, -1202591, 7194607, 223338, 1556389, -5951214, 1830193, 3419331, -2495913, -249108, -2984466, 7737384, 1344862, -1541356, 3710852, 3032247, -3616899, 4741107, --3187403, 7818451, 1108638, 6978248, -761283, 1231582, -2736431, -7900056, 855235, 162135, -271120, -1365263, 1626182, 4172024, -1046898, -4057134, -2685965, -5770826, -1596117, -2841658, --3052648, 532039, 1989107, 3134789, -3710852, 2589865, -2483565, -3085934, -416612, 2649995, -496606, 657667, -5770826, -5567352, -1055488, -1650878, -4219269, 9196062, 4268661, -580894, -1773285, 3696356, -9276592, -4692789, 6222871, -3468186, 5836861, 1324997, -1214939, -6225018, --4594005, 7403987, 3923453, 7000797, -7351374, -509491, -5098126, -406411, 1814087, -2717641, -867047, 545461, -4576288, 4112968, 461709, 623307, -745177, -8152385, 886911, -1962263, --2564632, -2551211, -492311, 1418413, -1312113, 632434, -2866354, -607201, -1312113, 1833414, --351650, -220654, -928787, 66035, -970663, 626528, -1617055, -775778, 537408, -461172, --98784, -102005, -10201, 753767, 472446, -134755, -1133335, -1181116, -1228898, 1062468, -487479, 1548873, 816581, 628139, -12179454, 582505, -1620813, 3218004, -7396471, 2282238, --2537789, 12184822, -3315178, -6409165, -2389613, -5386426, 1592896, 4484483, -1517734, 8498667, -809064, -2588792, 1995549, 981400, 2161442, -3095598, -603980, 3125126, 4955319, 1927904, --1073205, 2350958, -4558571, -1460826, 6248641, 4458176, 7349226, 5206037, -197032, -3835943, --7988103, 5403606, -938987, -5832029, 2923262, -1584306, -8939438, 172872, -7465727, -645319, -6607271, -1193464, -5045513, -2347737, 6306623, -5589900, -9127879, 9131100, -1807108, -2291365, -2078764, 1109175, 1013075, 2152852, 2138894, 1166621, -6747394, -2590939, 5078799, -752156, --2054605, 1503775, 8771934, -4541928, -4988068, -2296197, 3547106, 1787780, -8051990, -3598109, --2819646, -3531000, 2545305, -524523, -679679, -3016141, -2426120, -6361384, -3708168, 1472100, -132607, 954557, -330712, 3690988, 3794067, 629213, 1337346, -1990717, 369367, 139586, -1505386, -2439542, -1171452, 253940, -19327, 1074279, -122407, -1402844, 1314797, 475668, --2731599, -560493, 692564, 436476, 376883, -705985, 276489, -1331977, -1352378, -1142461, -596464, -605054, -729608, -229781, -10652056, -254477, 2814277, 10200010, 10543071, -3435437, -5237176, -6829535, 2210298, 4465156, 6763500, -2010582, 10158135, -1947231, 8612483, -4753992, -7212324, -3671660, -12063489, -2768107, 2981244, -4189741, 4622459, -2641942, -2916820, 1266479, --13219909, -4303557, -297427, -2332167, -818728, -6416681, -2228014, -2315524, 2073396, 13411035, -7728257, -7864085, 4252555, 10715407, 2643016, -3816615, 2656974, -2881923, -3227668, 7700877, -5364414, -5428839, -747861, 5477157, 11515881, -3758097, 6254546, 17087528, 7349226, -7938710, -3169149, 1947768, -9565429, 1385664, -7907572, 3480534, -8614631, -2069101, 338229, 4021700, --5627481, -1595580, -2797634, -5142687, 6575595, 5619428, -324807, -3781719, 1006633, 963683, -920734, 1549410, 4884989, 921271, -6522445, -153545, 7902740, 213138, 1768453, 1560684, -2391223, -2501282, -1156420, -3999152, -1692754, -3682398, -307627, 2144799, -478352, -2097018, -1157494, -446677, 455267, -1147830, -774168, 1447404, -110595, 3498788, 863288, -774168, -1861868, -64961, -826781, -1349157, -1792612, 765041, -946503, -501437, 924492, -107911, -1654099, 80531, -2153389, 4686346, -2295123, -10729902, 2501819, -8615704, 1415729, -2841121, -11188927, -5648956, 1597191, 2958159, 1129040, 4073777, -1620276, 12243878, 979789, -7907035, --1453310, -5825587, -915365, -1882806, -5450851, -6852621, -1742146, -4406637, -2069101, 7839389, -2930242, -6593849, 2602213, -7878581, -1474248, 5762773, -10755135, -9497246, 5437429, 5102958, -2659122, -308701, -6522982, 2607582, -3205656, -6169184, -2835215, 346819, 1978906, 10246181, --4014184, -1147830, 563714, 4782446, 2535641, -3536906, -4554276, -8198556, -2482491, -1811403, --4492536, -5257577, 3376918, 6845104, -10737, -4365835, 7595113, 1461363, -3715147, 935766, --1085016, -978716, -2585034, -1471563, 4939750, -3905199, -5837398, -3375308, 3091840, -4529580, -8028368, 3588982, -1298154, -3281892, -3700114, 2278480, 4997732, 10190884, -2918430, 5217312, -200253, -16106, 585189, 1639067, -1848983, 49929, 1287417, 2147484, -1315871, 1503775, --1125281, 4941360, 1915555, 3716757, 75699, 2527052, -102542, 2244121, -412317, -199716, -2644626, 993211, 351650, 1388885, 341987, 2586644, -1878511, 610422, 1800665, 2378338, -2082522, -782758, -2585570, -35433, 1687922, 365609, 339302, 2138357, 5562520, 10612864, --7915625, -276489, 7226820, -3457986, -5187784, 6646462, -10486700, -639950, 1937567, -1363115, --3912715, -4614943, -2221572, 1816234, -564788, 5021891, 2527588, -1676648, -3997541, -2914135, -8260833, 325881, -10103911, 4712653, -6392522, -6260989, 3836480, 7279433, 7415261, 5633387, --181999, 3808562, 2586107, 3595961, -3314641, -163209, -2989297, -7269232, 3054796, -1873680, --401579, -1599875, 704375, -1197759, 8031052, 14952392, 2458869, -2587181, -47245, -10672457, -10358387, -7275138, -4728222, -7000797, -8587787, 14535780, 791348, -8070244, -2928631, 10031970, -5166309, -7593502, -5683316, 11498701, 925029, 1193464, 14856292, -7090454, 4078608, -5323075, --14750528, 6937983, 7097434, 1194001, -8517457, -1186485, -1852742, 1771674, -3698504, 5408975, -3321620, -11651173, 4947266, 5598490, 7117835, 1243393, -6240051, 10440529, 1764158, -912681, --807454, -3481608, -3684545, -1305670, 652298, 3164317, -15569, 273804, -344134, -2786360, -1170379, 1281511, 546535, -1267552, -783832, 2126546, 741956, 2419677, -1579474, 586800, --3668439, 435939, 3435437, -4602058, 625992, -3600256, 4201552, -1733556, -115427, -2797098, --36507, 2465848, -312459, 3354370, -11811, 5010616, 6408091, 11894375, 10891500, -453656, -9284109, 4161287, 9468255, 9145596, -15250892, 5500243, -4944581, -6609418, -4822712, -1458678, --9729712, -2055142, 2362769, -8326331, -17064442, 3879966, -1212255, -15381352, -11286637, -10082973, --5633924, 528281, -2896419, 3629247, -2037962, 6088116, 11902965, -6839736, 4042638, -2700461, --5466957, -3990562, 718333, -1187559, -501437, 8856223, -375273, 8928163, 11584601, 3445638, -4983236, 7656853, -1013075, 1536525, -11454678, 10684268, -9343701, -3302293, -2982855, 932545, --2588792, -8923868, -7858180, -17226040, 15586973, -17596482, -17049946, 2866891, 16346646, 5788006, --2120640, -4128001, 7514046, -8268349, 9400610, -2761664, 1189706, 955630, -6251325, 6541235, --7384123, -6040335, -715649, 2347737, -7054484, -1125818, 3775813, -581968, -1942399, 5024038, --3346853, -6350109, -1470489, 3171297, -4209068, -2476049, -2886755, -664646, 1891933, -1384053, -556198, -1076426, -2317672, 629213, -1497870, 1439351, -1564979, 2095944, -660888, 3934190, --590558, 1504849, 2138357, -1402844, -2703682, -311385, -681826, -186831, -853625, 1811939, -68183, 2352032, -2161442, 810675, -4604742, 173409, 167504, -1711545, 1357747, 7137699, -9298604, 9294846, 10117869, 23848342, 10714870, 13631689, -6730214, 22075058, -12597676, 610422, -4872104, -96100, -8295730, 2760590, -2287607, -18811420, 7138236, -4734665, 2028835, -1757715, --6226092, 17180, 5604933, -7592966, -3935801, -1178969, 4434554, -11471858, 7282654, 2752000, --10510859, -815507, 4300336, -9526237, 3582003, -11425687, 5287642, -973347, -3688303, -436476, --7458211, 9613211, 11361799, -10813654, -6173479, 4917201, -3843459, 3029026, 2749853, 736587, -375810, 13106630, -3292093, -8745627, 8122320, -324807, -6880001, -5779416, -10871099, 2107755, -2980707, 5450851, 5237176, -5020280, -8443369, 4741107, 2377265, 16380468, 1737314, -2020782, -425202, 1103270, -4820027, -2152316, -6045704, 6715182, 3887482, 4376572, -1273458, -10456635, --9529996, -3118683, -837519, -3750580, -6601365, 1869385, -2885144, 4328790, 769873, -691490, -2696703, 2793876, 4444755, 4164508, 3358665, -18790, -989990, 1191317, 2989834, 2311229, --1322850, -1252520, -832150, 768262, -2147, -816044, 59056, -5144297, 639413, 3371549, -2586107, -4007205, -2881386, 5760625, 3087008, 5712844, 2261837, -4164508, 3969624, -1013075, --3147674, 620623, -4495220, -2467996, -1140851, 1729798, -897111, -12882218, -14477261, 24143622, -16834124, 21583284, 1373316, -13860396, 4876936, 11261404, 8016020, -3540664, -8771934, -2585570, --3228205, -4260071, -7553237, -3034395, -6345278, 16093242, 2567317, 2652142, 115964, 932008, -1703491, -5958194, 10649371, 6010270, -642098, 3868155, -1524713, 10961293, 2014877, -978179, --17951890, -1334661, 1120450, 1702955, -3367791, 2237678, -8507256, 14559402, 11792370, 11381126, -9932649, -7822746, -10828686, 8296803, 2552284, 4053376, -718870, -12605192, -9119289, 721018, --7110855, 77309, -5973226, -2602750, 7551626, 2398739, -5401458, 1925219, -13934485, 420370, --23619636, -12006044, -22316114, 19258096, 17357036, 18526342, 22454626, 10871099, -3721589, -9968619, --3027952, -557272, 3219078, 17787070, -5881958, -13524852, 10307922, -8609799, 4486630, -1976222, --1950452, 4167192, -4013647, -7318088, -2074469, -9009231, -1916092, -8101382, -1866700, 1129040, --720481, -981937, -2206003, -2830920, -5597953, -90731, 2927557, 452045, -2823404, 978179, -4877472, -664646, 3258270, 1784022, 1925219, 1365800, -6471979, 5653788, -2507724, -2058900, -3789772, 1302986, 4190814, 421981, -5390184, -1007170, 106837, 929324, -3303367, -8567386, --11528229, 10162429, 13186623, -6478958, 12243341, 1725503, -5201206, 4923107, -17749490, -5508296, -5004174, -5656472, -10885595, -20515448, 10077067, -8816494, 2371359, 13287018, 3187940, 15493021, -11851962, 6737193, 2542621, -9151502, -2687039, -4791573, 836982, 8628052, 4496831, 1780264, -7365869, 21065204, -1101122, -17918066, -7868917, 2894271, 4300336, -1027034, 443455, 1695438, --7643968, 469762, -16865262, 3792456, -17643188, -6433861, -13662291, 6725919, -6816113, -11210402, -17104708, 4796942, 1393717, -7699266, -10262824, 2561948, 4066260, 1506997, 5573257, -8746701, -19229642, -23350126, 6073621, -9732933, -14173929, -7940858, 12238509, 3688303, -13287555, 9386651, --10581726, 25936234, -2418067, -2847027, -12617003, 1510218, -16831440, -9029632, 22453552, -9038759, --10197863, -6658810, 6713571, 843961, 9517111, 4744328, 4975183, 6937446, 3769908, -636192, -716186, 3309272, 1417339, -1833951, 5574868, -1750736, -1942936, -4201015, -3773666, -1694902, -2057289, -3307125, 243739, 1618129, -1365263, 1411434, 260919, 5502390, 2882997, -6442, --1122597, 10201, -400506, 3288334, -2923262, 2983392, -825171, 1321239, 4609037, -1458678, -241055, -635118, -2319819, 5646272, -795106, 24395414, 25103546, 23678154, 5052492, -6350109, --3961034, -15255187, 12387223, 363998, 7268696, -4565014, 2336462, -5578626, -4291746, -8821326, -4765803, -9185324, 15083388, -39366060, -11461657, 281857, -11911018, 8460549, -12242804, 2517925, --4730370, 12380243, 2203855, 11917461, 864899, -2813741, -190052, 4362076, -13790066, -9909026, --10726681, -1519345, 13424994, -26479010, 9189083, 23025856, 2832531, -16943110, -665720, -14270566, --13677323, 9470940, -1790465, -11658689, 6481643, 967441, -4344360, -6588480, 3770445, 9570798, -5816997, -13542032, -9884330, 7742216, 11674258, -9535364, -12596602, 6206228, 13079786, -15908559, --549756, -14203457, -19489488, 23181012, -3859028, 3578245, -4350265, 14366129, -3389803, 3514357, --7724499, 12495670, 6933688, 11496554, 13293461, -13252658, -14626511, -5961952, -2803540, -8784819, --22006876, 2422362, 1196685, -14496, -1621887, -3575024, -2961380, 6320045, -556735, -2731062, -5837935, -6440304, -3426310, 2389076, 11464341, -3482145, -3540664, 559956, -1450088, 3960497, --1388348, -639950, -2019172, -3223910, -8053601, -11557220, 2043868, -819265, -8804683, -4403952, -2316598, -3068754, -9975062, -5553393, -670552, -1737314, 795643, 2834142, 1189706, -22549, -8176544, 2822331, 12869870, -4784057, -638340, -19092204, -9030169, -4583804, -16227460, -23199266, --4536559, -7920457, 21370146, 6243272, 31897112, 5556077, -9482751, 3995393, 5851356, -26526254, -1256815, 22816476, 14405857, -15559056, 1852742, 11281268, -21351356, -3632469, -10810970, 8723079, --8513162, 5667746, 1188095, -4410932, 901406, -291521, -7031935, 6956237, -14585172, -5836861, --6404333, -18239116, -4029216, -2607045, 37044, 1061394, -5159867, -5904507, 32584306, 9645960, --13008919, -23475218, -8685498, 2126009, 23475754, -5986111, -3351685, -13501230, -3804267, -9570798, -19194208, -16061030, 17091822, 21772800, -22520124, 14450417, 5270999, -9682467, -8689793, 5143760, -10013179, -48785996, -6726456, -336081, -6969122, 12539694, -6876780, -36532992, -14439680, -10830297, --16726213, -16244103, 2480344, 2866354, -9637370, -8514773, -15471009, 1292785, -5970005, 1023276, --6939057, -7942469, -9073118, 1735167, -2148021, 5011153, -7917236, 3401614, -1329292, -7969849, --16450798, -4297115, -1360431, 4910758, -2685428, -21621402, 3940096, 10060424, 3696893, -762357, --7930657, 7313256, -1522566, -2743410, -13354127, -2485176, -4919885, 10391137, -2108292, 1432372, --423591, 2017024, 6282464, -5224291, -98784, 71941, -2872796, 292595, 2397129, -15560667, --13654775, -5296769, -11154567, -7700877, -3499325, -7027640, -9034464, -7031935, 5352066, 32123134, --1119913, -37751152, -21204790, -23408646, -4525285, -13000329, -710280, -19219978, 31157840, 18515068, --3532611, 24538758, 545998, 26471494, 6186364, -15426986, -21099026, -13265006, -17065516, -7617662, -3921305, 11386495, -3945464, 3683471, -14149770, 2320893, -20324858, -1875827, -1380295, 6853694, --7786776, 32161252, 3915937, -881542, 21122650, -8337606, -15414101, -8926016, 12837120, -1029182, --8876624, 3566434, -395674, 27384174, 6480569, 71404, -10924786, -16546898, -42080480, 2705830, --33498598, 16821776, 56625924, -40679784, -9025874, 9242233, -7340636, -7141457, -11739756, 9556839, --12050068, -39325256, -10815265, -39206072, -8571681, -1099512, -24974698, -3428995, -35786740, 15426986, --3932580, -22388054, 54812372, 4360466, 22117470, 18953154, 30056718, -18616536, -1655173, -11185169, --4486094, -7534447, 14050986, 9290551, 12575127, -26718992, -5824513, -14481556, -19297288, -15677704, --10132365, -1990181, 10043781, 8810589, 5558225, 7805030, -2600066, 2619930, 14545444, -2631204, -14380624, 4531728, -13373454, -3374771, 4126390, -5417028, -2684892, 17635136, -217970, -5127654, -19055160, -8870181, -1880659, -15904264, -4441533, -11031623, 7926899, -8378945, -4366371, -3049964, -2689723, -3588445, 7080254, 419833, 7330436, 2449205, -3537979, -11910481, -66410932, -7089381, --17114370, -18710488, 23934778, 18955302, -23399518, -18524730, 45294188, -5330055, 14565308, 2172717, --2570538, -5417565, -5140002, -14942191, -360240, 5083631, 7947837, 5333276, 16060493, -12939663, --511638, -12612708, -7621420, 4879620, 22865870, 14672145, 20164872, 18118856, -4312147, 6459094, -10750840, -125091, -18916110, -3554622, 25688736, -4784057, -37227164, -16451335, 3832722, -31503586, --13793287, -32278826, -22318260, -20224464, 29457570, 20172924, -6698002, 20193862, 7569343, 28543816, -19013284, 9091372, -50719268, -11396159, 2003602, -44475460, -32711008, -12585865, -8902393, -52065740, -10915123, 28599114, 38225208, 46017352, -15809775, -30194156, -623844, -30459908, -22863184, -42250132, --47153908, -33210834, -28191092, 30926448, 1043677, 6120329, -28675886, -29847338, -26982596, -2784750, -40368936, 51525648, 1024350, -19082540, -14929306, -20962124, -54604604, -24365350, -24543054, -6814503, --2485176, -12449500, 13772886, -214748, -4675609, -19488414, -25662966, -13349295, -14687178, -22424024, --5434744, -5849209, -2686502, -6162205, -10710038, 13276818, 7777649, -1597728, -12817793, 8689793, -14143327, 915365, -13147969, -6806987, 9725417, 2616709, -3368328, -12268037, 9708774, -2625299, --4518306, 1005022, 7403450, 1875827, -2885681, 1075352, 5609764, -20352776, -49432388, 19510426, -2560338, -33547452, 31678068, 15848966, 9878962, -7148973, -29992294, -7355132, 1070521, 29628832, -39228620, 2556043, 10734734, 2811056, 1394791, -1545651, 5451924, -16037408, 55151676, 13523241, --17789218, -17634062, -7835094, 2762738, 27027692, -12662100, -3932043, 363998, 13742822, -12689481, -7301445, 1299228, -2905546, -45017164, -14105209, 14970109, 23652384, 8779450, -4955319, -12666932, --29874182, -2829847, 5001490, -6669011, 616865, -7354058, -19237158, 19949586, -4408784, 7458211, --20587388, -3824669, 52938692, 4495220, -5797132, 6709813, 6962142, 5531918, 26678190, -9199820, --11988864, 20426864, -2201171, 12358232, 7395934, 17898740, -6644315, -19044958, 9982578, -8450885, -1600412, 75348224, 71971304, 32968706, -6376416, -3030636, 9131637, 34534220, 15687368, -9385040, --1093606, -3765076, -19072340, -19581292, 11159936, 6317360, 2912525, 17655536, -2232309, -8687645, -10075993, 5020280, 14858976, -20798380, -17561584, -21130702, 3282429, -9041980, 1249836, -3571265, -7950522, 9693741, 18424336, 11534135, -19523310, -13536126, 7034620, -11132555, -6842420, 2406256, -6372121, -7164006, -19221590, -1213865, 673773, -707596, 8540542, 3247532, -15521475, 5783174, -25109452, 29877940, 21509734, 25671556, 17628694, 23279796, -5996848, -279710, 19184546, 35546760, -3842385, -39765492, -11254962, 7474317, 4684199, -10378788, 28115392, 13403519, 10279467, -10774999, -33080912, -3172907, -229244, -10309532, 17142288, 10944114, -27227946, -39323108, -11753178, 5272609, -1142998, -8441221, -36163624, -4648765, 11470247, 1698123, -12879533, -6000606, -11623255, -14635638, -7180112, 8855149, -23588498, -26361972, -9850507, -32429150, 7409356, 26308822, -25171192, 25247428, --13514651, -15692200, -28135794, -38758320, -43490300, -41189272, -21778706, -1152662, 14029511, 5881421, -13953812, -22269942, -48412336, -19755776, -46589120, -80714248, -31536334, 62977644, 108591272, 63234804, --28167470, -22775138, -98852968, -88778048, 59692528, 9513353, 78796544, 81817520, 84949624, 27913530, --35690640, -43817256, -48958868, -55614456, -9242233, 53196392, 90516976, 28276990, 8204462, -5284421, --47152300, -68229848, -46654620, 7681012, 62023624, 28530930, 39663488, 32351304, 10831371, -25151328, --28183038, 76773, -16291348, 4083977, 29532196, 31857920, 22724136, 3753802, 10795400, -567473, --22492744, 3369402, 6934762, -4381404, 1958505, -7064685, 43321188, 25021942, 26823682, 16122770, --17276506, -40717364, -57894548, 7343857, 17742510, 36765456, 36290864, 47937204, 21980568, -37462316, --47266652, -56312928, -11730093, -1255204, 27839978, 16005196, 7303055, 14925548, -29713658, -82689392, --56781080, -51486996, -13798119, 5148592, 16405701, -6380174, -13462038, -20138564, -3547643, 7641284, --24974162, 34968012, 16813186, 31047782, -68272800, 15462956, 9242233, -21020644, 15320685, -15734613, --7738458, -4717485, -9744744, 29375428, 54209468, -15779710, 10913512, -7589744, 13008382, 27511414, --8403640, -5077725, -14974940, 7865159, -9488656, -29951492, 21858700, 36791228, -4814659, -19370302, --17641578, -38903812, -10642392, 29348586, 20048370, 10162966, -42696808, -24917252, -18577344, 37725920, -32913946, 28679108, -83398600, -55686400, -6668474, 41145248, 88236344, 217433, -105890272, -39073464, -3652870, 35600984, -2801393, 19471234, 14957760, -46450608, -20144470, -12966506, -27625230, 1757179, --51984672, 7983271, 20800526, -63189708, -40169756, -19840064, -7889855, 69535520, -229244, -107248016, -10482941, 14867029, 16550656, 41944112, 19885162, -45964204, 2530273, -2000918, 91822104, 64355788, --53449256, 48680232, -28365574, 19200652, 50849192, 17905182, -27469000, 25116432, -10803990, 6223945, -17849348, -2186138, -18469970, 34320008, -21939766, 25058450, -11541114, 13318694, -3798362, 27520540, --9373766, 21539260, -37780680, -6969658, -31139, -5408438, 12714714, 23336704, -23822036, 48530984, --18694918, -17289928, -32896766, 23989002, 51968568, 9697499, -67282272, 4991289, -14711874, 32456530, -16773995, 14338211, -26677116, -2422899, -16753594, 15855946, -6449431, -11470247, -3345780, 21658446, --4701379, -14345191, -16090558, 11970074, 2684892, 11347840, -6748468, -409096, -12130061, -1708860, --1904281, 5333276, 2784750, 12815646, 23630374, -56464860, 8009577, -41460392, 7550016, 35193500, -31114890, 10187662, -20179904, 4037269, -11993696, -2969970, -14880988, -10995653, 7636452, 2054605, --21660594, -2496987, 11260867, -2410014, 1265942, 4076998, -13819594, -13685913, -364535, 9049496, -1196148, -22024592, 1830730, 11289322, 3541201, 2621004, 23030152, -2543158, -6148246, 8253317, -8814347, -15585899, -17283486, 12806519, 2473364, -13272523, 8902930, 3853123, 4310537, -9286793, -3733400, 10436234, 1253594, -13066901, 17713518, -2157684, -19870666, 593779, 15538655, 4840965, --13005698, 11823508, 3914326, -18129056, 7446937, 927713, 18500034, -16777216, 1505386, 12744242, --29372744, 932545, 12676059, -492848, 8784819, -4888210, -18804440, 2491618, -19897510, 18670222, -9640054, 5260261, -7395397, -7800735, 15425912, -13301514, 13765370, 15117748, -21626770, -7023882, -925565, 16740172, 261993, -9711458, 6202470, -11761231, -704375, 1699196, 9887015, 672699, -1626719, -6079526, 10291279, -3447785, -12005507, 10916733, -4847408, 4706211, -2718178, 7870528, -9948755, -11426224, 2001455, -6193880, 2695092, -6293738, 22121766, -6256157, -12404402, 9975062, --5584531, -1883343, -6307697, 6519761, 6028524, -8950712, 5013301, 8705362, -4500589, 574989, --12336757, -27938226, 45817100, 6478422, 20728586, -17812840, 7931731, -3845070, 5557151, 5027259, --7623567, 3100967, 8421357, -4804458, 18295486, 853088, 635118, 6243809, 6014028, -644245, --4607963, 7834021, -1161252, -5345624, -1055488, 7873749, -8402030, 1853278, 3882114, -10711648, -13502840, -2623688, -6415608, 20695300, -8434779, -12096775, 9548249, 5305895, -5632850, 9018894, -7233262, -2418067, -2835752, -1531156, 2761664, 5226975, 3086471, 48855, -3491809, 10716480, --11249056, 10281078, 1667521, -1150514, 2918967, 3325379, 3382824, 559956, -10003516, 2930242, -8763344, -6080063, 46708, 113280, 6693707, -557809, -2495376, 10107132, -5003637, 5480915, --10282152, -3718368, 10110890, -9429064, 9723806, -2383707, 6428493, 7873749, -8722005, -2865817, -10964515, -8968429, -404264, 1269163, 3368328, 941135, -1166621, 532576, 886374, 5158256, --4218732, 1240172, 3275450, -188442, -2149631, 694174, 1951526, -298500, 716723, -1761474, -2334315, 3272228, -5411659, -733903, 9549860, -4451734, 2774549, -559420, 5470715, 1672353, --2923262, 747861, -525060, -3015067, -2127620, 11326366, -1839857, -2422899, 1664837, 1390496, --809064, 2521146, 4670240, 291521, 1260036, 573378, -921807, 835908, 1413044, -1984812, -1545115, 8590, 10660109, -37832220, -120885072, -6185827, 65093452, 29196114, 138708112, 11800423, -29266444, 1187559, -40491876, -50996296, -34554084, -62139048, -43487616, -27359478, 954020, 47391208, -93382256, 68718400, 59799368, 19458886, -32556388, -47795468, -42979736, -50644644, -56171192, -22781580, --10801843, -4932770, 27354110, 36331128, 27379880, 50802484, 32779728, 12150462, 34064996, 773094, --14861124, -9822053, -30663382, -62810676, -38213396, -36779416, -37527276, 1941325, 17414482, 12051141, -46097348, 37824704, 26032334, 37204080, 39528732, 11202348, 11815455, -4227859, -34138548, -47387448, --36257576, -47494284, -33822868, -11800423, -8411693, 2922188, 25799332, 20236276, 18209588, 36506148, -30118458, 22183506, 37643776, 10334228, -7799661, -1559610, -15196131, -32760936, -19117974, -41445360, --52455508, -30878668, -26141856, -11322071, 30341260, 41053444, 38206420, 44167296, 36264020, 20668456, -19840064, 9667435, -4351876, -11218991, -21153788, -31132070, -31261994, -35234300, -37091876, -31636730, --10875931, -3725347, 12364137, 31836446, 35336844, 35067872, 40862320, 32592896, 24300924, 20308216, -6562710, -15809238, -28300076, -45917496, -58760520, -54905788, -43640624, -21888764, 5446556, 29463476, -40306656, 46540804, 48375292, 41862508, 29458644, 15112916, -9759776, -23766738, -31585726, -36478232, --32076426, -24023900, -16726750, -6840273, 7540352, 10192494, 13710609, 15955267, 14025216, 11304354, -8856759, 6091874, 5172215, 2390149, -1968706, -3034395, -3290482, -4902169, -5582921, -6993281, --8396124, -9071508, -7470022, -5532455, -3078418, 76236, 4412542, 5966247, 4590783, 2843805, -1946694, 1621350, 0, 0, 0, 0, 0, 0, }, +2687039, 1690070, -3508988, -618475, 4480188, 1328756, 1105954, 2470143, -584652, 675384, +-1165547, -4686346, -1841467, -233539, -1034013, 1345935, -1450625, -455803, -3969087, -6442, +684510, -2804077, -609885, -3539590, -1258962, -1129576, -4282620, -1969243, 1363115, 1862942, +4799626, 2837900, 6131603, -670552, -1000191, 892816, -2115808, 5325223, 313533, 2511482, +4226248, 733903, -1712618, 1721208, -2259690, -3012920, -756451, -1308891, -1665374, -5558225, +-1797981, 14496, 862752, 1642825, 459562, 2807298, -3152506, 2474975, -25233, 604517, +1755568, -2205466, -4909685, -2129230, 2083059, 3048890, 2319819, 179315, 2365453, 1780264, +3218541, 1602560, 1387274, -2146947, 161598, -363462, -432181, -1831804, -2245194, -987843, +-522375, -223875, -1731409, -4832, 244276, 654983, 157840, 1221918, -674310, 544387, +-1083942, -1656247, 808528, -260919, -41876, 1112933, 793495, 971736, 70330, 70867, +-946503, 537945, 176094, 308164, -139050, 1513439, -329639, 55835, -661425, -566936, +-743566, 624918, -501974, -1437203, -2571075, 2444910, -3954054, -2429878, 6368900, -1031329, +5630702, -2879776, 548145, 2785286, 1240172, 186831, -3778498, -5360656, -5592048, 602906, +145492, -1582696, 760746, -4950487, 9863392, 1115618, -5483600, 1460289, -2871723, -3128884, +2944200, 4182225, -60130, 941672, 1999307, -302258, 23622, 3283503, -1797444, -802085, +199179, 5979132, -115964, -699006, -2257005, -3532074, 1844689, -871342, -3623342, -1637993, +-4362613, 585726, -3956739, 89657, -2995740, -990527, -2634426, -5487895, -2247342, -344671, +5184026, 762357, -1496259, 2825015, 4747013, 716186, -6458557, 2976412, -14496, 1207960, +2125472, -1502165, 4098473, -2042794, -3653944, -3812320, -6749541, 631360, -2302639, -2396592, +-3039763, -3187403, -181999, -3476776, 1103807, -543313, -1972464, -731755, -2228551, 47245, +-96100, -2557116, -1061394, 1036698, -370441, 165356, 575526, 239981, 439697, 324807, +-693637, -2289755, -411243, -859530, 646393, -293132, 271120, -438624, 19864, -35433, +-495532, -1437740, -1180042, -195421, -520228, -554588, -462783, -1077500, -397821, -4952098, +8290361, -2076080, -7517804, 582505, 2578591, 245887, 2377265, 1941325, -5949067, 2137283, +-1376537, -231391, 255014, -1079111, 4563403, -1394791, -2941516, -247497, 3650185, 2300492, +1364726, 2149631, 8829916, 2338610, -3009698, 3993246, -3677029, 1234803, -2964064, 8299488, +1307281, -2686502, -1609539, -2693481, -922881, 5509370, -4374961, -3690451, -1113470, 4564477, +2625299, -4203163, 1204738, 958851, -2452426, 129923, -9014063, 3011846, -2067490, -1716913, +-5711233, 8682276, 496069, -4518843, -3546569, -4435091, 348966, -954557, 491237, -24159, +-5199058, 6873022, -3876208, -3557844, 2724620, 736587, 2705830, -1927367, -401579, -4227859, +387084, 924492, -5369246, -4008278, 396748, -3741990, 1353989, -3346853, -944893, -943819, +2392834, -4322885, -4491999, -918586, -712428, -1072668, -289373, -1937030, -491237, -1409823, +-1162862, -913754, -1401233, -1694365, -153545, -2275259, 603980, -1509681, -5906, 144955, +-547608, -856846, -118112, -603443, 1174137, -178778, -992137, -58519, -1753420, -343597, +-1075352, 86436, 235686, -1202591, 7194607, 223338, 1556389, -5951214, 1830193, 3419331, +2495913, -249108, -2984466, 7737384, 1344862, -1541356, 3710852, 3032247, -3616899, 4741107, +-3187403, 7818451, 1108638, 6978248, -761283, 1231582, -2736431, -7900056, 855235, 162135, +271120, -1365263, 1626182, 4172024, -1046898, -4057134, -2685965, -5770826, -1596117, -2841658, +-3052648, 532039, 1989107, 3134789, -3710852, 2589865, -2483565, -3085934, -416612, 2649995, +496606, 657667, -5770826, -5567352, -1055488, -1650878, -4219269, 9196062, 4268661, -580894, +1773285, 3696356, -9276592, -4692789, 6222871, -3468186, 5836861, 1324997, -1214939, -6225018, +-4594005, 7403987, 3923453, 7000797, -7351374, -509491, -5098126, -406411, 1814087, -2717641, +867047, 545461, -4576288, 4112968, 461709, 623307, -745177, -8152385, 886911, -1962263, +-2564632, -2551211, -492311, 1418413, -1312113, 632434, -2866354, -607201, -1312113, 1833414, +-351650, -220654, -928787, 66035, -970663, 626528, -1617055, -775778, 537408, -461172, +-98784, -102005, -10201, 753767, 472446, -134755, -1133335, -1181116, -1228898, 1062468, +487479, 1548873, 816581, 628139, -12179454, 582505, -1620813, 3218004, -7396471, 2282238, +-2537789, 12184822, -3315178, -6409165, -2389613, -5386426, 1592896, 4484483, -1517734, 8498667, +809064, -2588792, 1995549, 981400, 2161442, -3095598, -603980, 3125126, 4955319, 1927904, +-1073205, 2350958, -4558571, -1460826, 6248641, 4458176, 7349226, 5206037, -197032, -3835943, +-7988103, 5403606, -938987, -5832029, 2923262, -1584306, -8939438, 172872, -7465727, -645319, +6607271, -1193464, -5045513, -2347737, 6306623, -5589900, -9127879, 9131100, -1807108, -2291365, +2078764, 1109175, 1013075, 2152852, 2138894, 1166621, -6747394, -2590939, 5078799, -752156, +-2054605, 1503775, 8771934, -4541928, -4988068, -2296197, 3547106, 1787780, -8051990, -3598109, +-2819646, -3531000, 2545305, -524523, -679679, -3016141, -2426120, -6361384, -3708168, 1472100, +132607, 954557, -330712, 3690988, 3794067, 629213, 1337346, -1990717, 369367, 139586, +1505386, -2439542, -1171452, 253940, -19327, 1074279, -122407, -1402844, 1314797, 475668, +-2731599, -560493, 692564, 436476, 376883, -705985, 276489, -1331977, -1352378, -1142461, +596464, -605054, -729608, -229781, -10652056, -254477, 2814277, 10200010, 10543071, -3435437, +5237176, -6829535, 2210298, 4465156, 6763500, -2010582, 10158135, -1947231, 8612483, -4753992, +7212324, -3671660, -12063489, -2768107, 2981244, -4189741, 4622459, -2641942, -2916820, 1266479, +-13219909, -4303557, -297427, -2332167, -818728, -6416681, -2228014, -2315524, 2073396, 13411035, +7728257, -7864085, 4252555, 10715407, 2643016, -3816615, 2656974, -2881923, -3227668, 7700877, +5364414, -5428839, -747861, 5477157, 11515881, -3758097, 6254546, 17087528, 7349226, -7938710, +3169149, 1947768, -9565429, 1385664, -7907572, 3480534, -8614631, -2069101, 338229, 4021700, +-5627481, -1595580, -2797634, -5142687, 6575595, 5619428, -324807, -3781719, 1006633, 963683, +920734, 1549410, 4884989, 921271, -6522445, -153545, 7902740, 213138, 1768453, 1560684, +2391223, -2501282, -1156420, -3999152, -1692754, -3682398, -307627, 2144799, -478352, -2097018, +1157494, -446677, 455267, -1147830, -774168, 1447404, -110595, 3498788, 863288, -774168, +1861868, -64961, -826781, -1349157, -1792612, 765041, -946503, -501437, 924492, -107911, +1654099, 80531, -2153389, 4686346, -2295123, -10729902, 2501819, -8615704, 1415729, -2841121, +11188927, -5648956, 1597191, 2958159, 1129040, 4073777, -1620276, 12243878, 979789, -7907035, +-1453310, -5825587, -915365, -1882806, -5450851, -6852621, -1742146, -4406637, -2069101, 7839389, +2930242, -6593849, 2602213, -7878581, -1474248, 5762773, -10755135, -9497246, 5437429, 5102958, +2659122, -308701, -6522982, 2607582, -3205656, -6169184, -2835215, 346819, 1978906, 10246181, +-4014184, -1147830, 563714, 4782446, 2535641, -3536906, -4554276, -8198556, -2482491, -1811403, +-4492536, -5257577, 3376918, 6845104, -10737, -4365835, 7595113, 1461363, -3715147, 935766, +-1085016, -978716, -2585034, -1471563, 4939750, -3905199, -5837398, -3375308, 3091840, -4529580, +8028368, 3588982, -1298154, -3281892, -3700114, 2278480, 4997732, 10190884, -2918430, 5217312, +200253, -16106, 585189, 1639067, -1848983, 49929, 1287417, 2147484, -1315871, 1503775, +-1125281, 4941360, 1915555, 3716757, 75699, 2527052, -102542, 2244121, -412317, -199716, +2644626, 993211, 351650, 1388885, 341987, 2586644, -1878511, 610422, 1800665, 2378338, +2082522, -782758, -2585570, -35433, 1687922, 365609, 339302, 2138357, 5562520, 10612864, +-7915625, -276489, 7226820, -3457986, -5187784, 6646462, -10486700, -639950, 1937567, -1363115, +-3912715, -4614943, -2221572, 1816234, -564788, 5021891, 2527588, -1676648, -3997541, -2914135, +8260833, 325881, -10103911, 4712653, -6392522, -6260989, 3836480, 7279433, 7415261, 5633387, +-181999, 3808562, 2586107, 3595961, -3314641, -163209, -2989297, -7269232, 3054796, -1873680, +-401579, -1599875, 704375, -1197759, 8031052, 14952392, 2458869, -2587181, -47245, -10672457, +10358387, -7275138, -4728222, -7000797, -8587787, 14535780, 791348, -8070244, -2928631, 10031970, +5166309, -7593502, -5683316, 11498701, 925029, 1193464, 14856292, -7090454, 4078608, -5323075, +-14750528, 6937983, 7097434, 1194001, -8517457, -1186485, -1852742, 1771674, -3698504, 5408975, +3321620, -11651173, 4947266, 5598490, 7117835, 1243393, -6240051, 10440529, 1764158, -912681, +-807454, -3481608, -3684545, -1305670, 652298, 3164317, -15569, 273804, -344134, -2786360, +1170379, 1281511, 546535, -1267552, -783832, 2126546, 741956, 2419677, -1579474, 586800, +-3668439, 435939, 3435437, -4602058, 625992, -3600256, 4201552, -1733556, -115427, -2797098, +-36507, 2465848, -312459, 3354370, -11811, 5010616, 6408091, 11894375, 10891500, -453656, +9284109, 4161287, 9468255, 9145596, -15250892, 5500243, -4944581, -6609418, -4822712, -1458678, +-9729712, -2055142, 2362769, -8326331, -17064442, 3879966, -1212255, -15381352, -11286637, -10082973, +-5633924, 528281, -2896419, 3629247, -2037962, 6088116, 11902965, -6839736, 4042638, -2700461, +-5466957, -3990562, 718333, -1187559, -501437, 8856223, -375273, 8928163, 11584601, 3445638, +4983236, 7656853, -1013075, 1536525, -11454678, 10684268, -9343701, -3302293, -2982855, 932545, +-2588792, -8923868, -7858180, -17226040, 15586973, -17596482, -17049946, 2866891, 16346646, 5788006, +-2120640, -4128001, 7514046, -8268349, 9400610, -2761664, 1189706, 955630, -6251325, 6541235, +-7384123, -6040335, -715649, 2347737, -7054484, -1125818, 3775813, -581968, -1942399, 5024038, +-3346853, -6350109, -1470489, 3171297, -4209068, -2476049, -2886755, -664646, 1891933, -1384053, +556198, -1076426, -2317672, 629213, -1497870, 1439351, -1564979, 2095944, -660888, 3934190, +-590558, 1504849, 2138357, -1402844, -2703682, -311385, -681826, -186831, -853625, 1811939, +68183, 2352032, -2161442, 810675, -4604742, 173409, 167504, -1711545, 1357747, 7137699, +9298604, 9294846, 10117869, 23848342, 10714870, 13631689, -6730214, 22075058, -12597676, 610422, +4872104, -96100, -8295730, 2760590, -2287607, -18811420, 7138236, -4734665, 2028835, -1757715, +-6226092, 17180, 5604933, -7592966, -3935801, -1178969, 4434554, -11471858, 7282654, 2752000, +-10510859, -815507, 4300336, -9526237, 3582003, -11425687, 5287642, -973347, -3688303, -436476, +-7458211, 9613211, 11361799, -10813654, -6173479, 4917201, -3843459, 3029026, 2749853, 736587, +375810, 13106630, -3292093, -8745627, 8122320, -324807, -6880001, -5779416, -10871099, 2107755, +2980707, 5450851, 5237176, -5020280, -8443369, 4741107, 2377265, 16380468, 1737314, -2020782, +425202, 1103270, -4820027, -2152316, -6045704, 6715182, 3887482, 4376572, -1273458, -10456635, +-9529996, -3118683, -837519, -3750580, -6601365, 1869385, -2885144, 4328790, 769873, -691490, +2696703, 2793876, 4444755, 4164508, 3358665, -18790, -989990, 1191317, 2989834, 2311229, +-1322850, -1252520, -832150, 768262, -2147, -816044, 59056, -5144297, 639413, 3371549, +2586107, -4007205, -2881386, 5760625, 3087008, 5712844, 2261837, -4164508, 3969624, -1013075, +-3147674, 620623, -4495220, -2467996, -1140851, 1729798, -897111, -12882218, -14477261, 24143622, +16834124, 21583284, 1373316, -13860396, 4876936, 11261404, 8016020, -3540664, -8771934, -2585570, +-3228205, -4260071, -7553237, -3034395, -6345278, 16093242, 2567317, 2652142, 115964, 932008, +1703491, -5958194, 10649371, 6010270, -642098, 3868155, -1524713, 10961293, 2014877, -978179, +-17951890, -1334661, 1120450, 1702955, -3367791, 2237678, -8507256, 14559402, 11792370, 11381126, +9932649, -7822746, -10828686, 8296803, 2552284, 4053376, -718870, -12605192, -9119289, 721018, +-7110855, 77309, -5973226, -2602750, 7551626, 2398739, -5401458, 1925219, -13934485, 420370, +-23619636, -12006044, -22316114, 19258096, 17357036, 18526342, 22454626, 10871099, -3721589, -9968619, +-3027952, -557272, 3219078, 17787070, -5881958, -13524852, 10307922, -8609799, 4486630, -1976222, +-1950452, 4167192, -4013647, -7318088, -2074469, -9009231, -1916092, -8101382, -1866700, 1129040, +-720481, -981937, -2206003, -2830920, -5597953, -90731, 2927557, 452045, -2823404, 978179, +4877472, -664646, 3258270, 1784022, 1925219, 1365800, -6471979, 5653788, -2507724, -2058900, +3789772, 1302986, 4190814, 421981, -5390184, -1007170, 106837, 929324, -3303367, -8567386, +-11528229, 10162429, 13186623, -6478958, 12243341, 1725503, -5201206, 4923107, -17749490, -5508296, +5004174, -5656472, -10885595, -20515448, 10077067, -8816494, 2371359, 13287018, 3187940, 15493021, +11851962, 6737193, 2542621, -9151502, -2687039, -4791573, 836982, 8628052, 4496831, 1780264, +7365869, 21065204, -1101122, -17918066, -7868917, 2894271, 4300336, -1027034, 443455, 1695438, +-7643968, 469762, -16865262, 3792456, -17643188, -6433861, -13662291, 6725919, -6816113, -11210402, +17104708, 4796942, 1393717, -7699266, -10262824, 2561948, 4066260, 1506997, 5573257, -8746701, +19229642, -23350126, 6073621, -9732933, -14173929, -7940858, 12238509, 3688303, -13287555, 9386651, +-10581726, 25936234, -2418067, -2847027, -12617003, 1510218, -16831440, -9029632, 22453552, -9038759, +-10197863, -6658810, 6713571, 843961, 9517111, 4744328, 4975183, 6937446, 3769908, -636192, +716186, 3309272, 1417339, -1833951, 5574868, -1750736, -1942936, -4201015, -3773666, -1694902, +2057289, -3307125, 243739, 1618129, -1365263, 1411434, 260919, 5502390, 2882997, -6442, +-1122597, 10201, -400506, 3288334, -2923262, 2983392, -825171, 1321239, 4609037, -1458678, +241055, -635118, -2319819, 5646272, -795106, 24395414, 25103546, 23678154, 5052492, -6350109, +-3961034, -15255187, 12387223, 363998, 7268696, -4565014, 2336462, -5578626, -4291746, -8821326, +4765803, -9185324, 15083388, -39366060, -11461657, 281857, -11911018, 8460549, -12242804, 2517925, +-4730370, 12380243, 2203855, 11917461, 864899, -2813741, -190052, 4362076, -13790066, -9909026, +-10726681, -1519345, 13424994, -26479010, 9189083, 23025856, 2832531, -16943110, -665720, -14270566, +-13677323, 9470940, -1790465, -11658689, 6481643, 967441, -4344360, -6588480, 3770445, 9570798, +5816997, -13542032, -9884330, 7742216, 11674258, -9535364, -12596602, 6206228, 13079786, -15908559, +-549756, -14203457, -19489488, 23181012, -3859028, 3578245, -4350265, 14366129, -3389803, 3514357, +-7724499, 12495670, 6933688, 11496554, 13293461, -13252658, -14626511, -5961952, -2803540, -8784819, +-22006876, 2422362, 1196685, -14496, -1621887, -3575024, -2961380, 6320045, -556735, -2731062, +5837935, -6440304, -3426310, 2389076, 11464341, -3482145, -3540664, 559956, -1450088, 3960497, +-1388348, -639950, -2019172, -3223910, -8053601, -11557220, 2043868, -819265, -8804683, -4403952, +2316598, -3068754, -9975062, -5553393, -670552, -1737314, 795643, 2834142, 1189706, -22549, +8176544, 2822331, 12869870, -4784057, -638340, -19092204, -9030169, -4583804, -16227460, -23199266, +-4536559, -7920457, 21370146, 6243272, 31897112, 5556077, -9482751, 3995393, 5851356, -26526254, +1256815, 22816476, 14405857, -15559056, 1852742, 11281268, -21351356, -3632469, -10810970, 8723079, +-8513162, 5667746, 1188095, -4410932, 901406, -291521, -7031935, 6956237, -14585172, -5836861, +-6404333, -18239116, -4029216, -2607045, 37044, 1061394, -5159867, -5904507, 32584306, 9645960, +-13008919, -23475218, -8685498, 2126009, 23475754, -5986111, -3351685, -13501230, -3804267, -9570798, +19194208, -16061030, 17091822, 21772800, -22520124, 14450417, 5270999, -9682467, -8689793, 5143760, +10013179, -48785996, -6726456, -336081, -6969122, 12539694, -6876780, -36532992, -14439680, -10830297, +-16726213, -16244103, 2480344, 2866354, -9637370, -8514773, -15471009, 1292785, -5970005, 1023276, +-6939057, -7942469, -9073118, 1735167, -2148021, 5011153, -7917236, 3401614, -1329292, -7969849, +-16450798, -4297115, -1360431, 4910758, -2685428, -21621402, 3940096, 10060424, 3696893, -762357, +-7930657, 7313256, -1522566, -2743410, -13354127, -2485176, -4919885, 10391137, -2108292, 1432372, +-423591, 2017024, 6282464, -5224291, -98784, 71941, -2872796, 292595, 2397129, -15560667, +-13654775, -5296769, -11154567, -7700877, -3499325, -7027640, -9034464, -7031935, 5352066, 32123134, +-1119913, -37751152, -21204790, -23408646, -4525285, -13000329, -710280, -19219978, 31157840, 18515068, +-3532611, 24538758, 545998, 26471494, 6186364, -15426986, -21099026, -13265006, -17065516, -7617662, +3921305, 11386495, -3945464, 3683471, -14149770, 2320893, -20324858, -1875827, -1380295, 6853694, +-7786776, 32161252, 3915937, -881542, 21122650, -8337606, -15414101, -8926016, 12837120, -1029182, +-8876624, 3566434, -395674, 27384174, 6480569, 71404, -10924786, -16546898, -42080480, 2705830, +-33498598, 16821776, 56625924, -40679784, -9025874, 9242233, -7340636, -7141457, -11739756, 9556839, +-12050068, -39325256, -10815265, -39206072, -8571681, -1099512, -24974698, -3428995, -35786740, 15426986, +-3932580, -22388054, 54812372, 4360466, 22117470, 18953154, 30056718, -18616536, -1655173, -11185169, +-4486094, -7534447, 14050986, 9290551, 12575127, -26718992, -5824513, -14481556, -19297288, -15677704, +-10132365, -1990181, 10043781, 8810589, 5558225, 7805030, -2600066, 2619930, 14545444, -2631204, +14380624, 4531728, -13373454, -3374771, 4126390, -5417028, -2684892, 17635136, -217970, -5127654, +19055160, -8870181, -1880659, -15904264, -4441533, -11031623, 7926899, -8378945, -4366371, -3049964, +2689723, -3588445, 7080254, 419833, 7330436, 2449205, -3537979, -11910481, -66410932, -7089381, +-17114370, -18710488, 23934778, 18955302, -23399518, -18524730, 45294188, -5330055, 14565308, 2172717, +-2570538, -5417565, -5140002, -14942191, -360240, 5083631, 7947837, 5333276, 16060493, -12939663, +-511638, -12612708, -7621420, 4879620, 22865870, 14672145, 20164872, 18118856, -4312147, 6459094, +10750840, -125091, -18916110, -3554622, 25688736, -4784057, -37227164, -16451335, 3832722, -31503586, +-13793287, -32278826, -22318260, -20224464, 29457570, 20172924, -6698002, 20193862, 7569343, 28543816, +19013284, 9091372, -50719268, -11396159, 2003602, -44475460, -32711008, -12585865, -8902393, -52065740, +10915123, 28599114, 38225208, 46017352, -15809775, -30194156, -623844, -30459908, -22863184, -42250132, +-47153908, -33210834, -28191092, 30926448, 1043677, 6120329, -28675886, -29847338, -26982596, -2784750, +40368936, 51525648, 1024350, -19082540, -14929306, -20962124, -54604604, -24365350, -24543054, -6814503, +-2485176, -12449500, 13772886, -214748, -4675609, -19488414, -25662966, -13349295, -14687178, -22424024, +-5434744, -5849209, -2686502, -6162205, -10710038, 13276818, 7777649, -1597728, -12817793, 8689793, +14143327, 915365, -13147969, -6806987, 9725417, 2616709, -3368328, -12268037, 9708774, -2625299, +-4518306, 1005022, 7403450, 1875827, -2885681, 1075352, 5609764, -20352776, -49432388, 19510426, +2560338, -33547452, 31678068, 15848966, 9878962, -7148973, -29992294, -7355132, 1070521, 29628832, +39228620, 2556043, 10734734, 2811056, 1394791, -1545651, 5451924, -16037408, 55151676, 13523241, +-17789218, -17634062, -7835094, 2762738, 27027692, -12662100, -3932043, 363998, 13742822, -12689481, +7301445, 1299228, -2905546, -45017164, -14105209, 14970109, 23652384, 8779450, -4955319, -12666932, +-29874182, -2829847, 5001490, -6669011, 616865, -7354058, -19237158, 19949586, -4408784, 7458211, +-20587388, -3824669, 52938692, 4495220, -5797132, 6709813, 6962142, 5531918, 26678190, -9199820, +-11988864, 20426864, -2201171, 12358232, 7395934, 17898740, -6644315, -19044958, 9982578, -8450885, +1600412, 75348224, 71971304, 32968706, -6376416, -3030636, 9131637, 34534220, 15687368, -9385040, +-1093606, -3765076, -19072340, -19581292, 11159936, 6317360, 2912525, 17655536, -2232309, -8687645, +10075993, 5020280, 14858976, -20798380, -17561584, -21130702, 3282429, -9041980, 1249836, -3571265, +7950522, 9693741, 18424336, 11534135, -19523310, -13536126, 7034620, -11132555, -6842420, 2406256, +6372121, -7164006, -19221590, -1213865, 673773, -707596, 8540542, 3247532, -15521475, 5783174, +25109452, 29877940, 21509734, 25671556, 17628694, 23279796, -5996848, -279710, 19184546, 35546760, +3842385, -39765492, -11254962, 7474317, 4684199, -10378788, 28115392, 13403519, 10279467, -10774999, +33080912, -3172907, -229244, -10309532, 17142288, 10944114, -27227946, -39323108, -11753178, 5272609, +1142998, -8441221, -36163624, -4648765, 11470247, 1698123, -12879533, -6000606, -11623255, -14635638, +7180112, 8855149, -23588498, -26361972, -9850507, -32429150, 7409356, 26308822, -25171192, 25247428, +-13514651, -15692200, -28135794, -38758320, -43490300, -41189272, -21778706, -1152662, 14029511, 5881421, +13953812, -22269942, -48412336, -19755776, -46589120, -80714248, -31536334, 62977644, 108591272, 63234804, +-28167470, -22775138, -98852968, -88778048, 59692528, 9513353, 78796544, 81817520, 84949624, 27913530, +-35690640, -43817256, -48958868, -55614456, -9242233, 53196392, 90516976, 28276990, 8204462, -5284421, +-47152300, -68229848, -46654620, 7681012, 62023624, 28530930, 39663488, 32351304, 10831371, -25151328, +-28183038, 76773, -16291348, 4083977, 29532196, 31857920, 22724136, 3753802, 10795400, -567473, +-22492744, 3369402, 6934762, -4381404, 1958505, -7064685, 43321188, 25021942, 26823682, 16122770, +-17276506, -40717364, -57894548, 7343857, 17742510, 36765456, 36290864, 47937204, 21980568, -37462316, +-47266652, -56312928, -11730093, -1255204, 27839978, 16005196, 7303055, 14925548, -29713658, -82689392, +-56781080, -51486996, -13798119, 5148592, 16405701, -6380174, -13462038, -20138564, -3547643, 7641284, +-24974162, 34968012, 16813186, 31047782, -68272800, 15462956, 9242233, -21020644, 15320685, -15734613, +-7738458, -4717485, -9744744, 29375428, 54209468, -15779710, 10913512, -7589744, 13008382, 27511414, +-8403640, -5077725, -14974940, 7865159, -9488656, -29951492, 21858700, 36791228, -4814659, -19370302, +-17641578, -38903812, -10642392, 29348586, 20048370, 10162966, -42696808, -24917252, -18577344, 37725920, +32913946, 28679108, -83398600, -55686400, -6668474, 41145248, 88236344, 217433, -105890272, -39073464, +3652870, 35600984, -2801393, 19471234, 14957760, -46450608, -20144470, -12966506, -27625230, 1757179, +-51984672, 7983271, 20800526, -63189708, -40169756, -19840064, -7889855, 69535520, -229244, -107248016, +10482941, 14867029, 16550656, 41944112, 19885162, -45964204, 2530273, -2000918, 91822104, 64355788, +-53449256, 48680232, -28365574, 19200652, 50849192, 17905182, -27469000, 25116432, -10803990, 6223945, +17849348, -2186138, -18469970, 34320008, -21939766, 25058450, -11541114, 13318694, -3798362, 27520540, +-9373766, 21539260, -37780680, -6969658, -31139, -5408438, 12714714, 23336704, -23822036, 48530984, +-18694918, -17289928, -32896766, 23989002, 51968568, 9697499, -67282272, 4991289, -14711874, 32456530, +16773995, 14338211, -26677116, -2422899, -16753594, 15855946, -6449431, -11470247, -3345780, 21658446, +-4701379, -14345191, -16090558, 11970074, 2684892, 11347840, -6748468, -409096, -12130061, -1708860, +-1904281, 5333276, 2784750, 12815646, 23630374, -56464860, 8009577, -41460392, 7550016, 35193500, +31114890, 10187662, -20179904, 4037269, -11993696, -2969970, -14880988, -10995653, 7636452, 2054605, +-21660594, -2496987, 11260867, -2410014, 1265942, 4076998, -13819594, -13685913, -364535, 9049496, +1196148, -22024592, 1830730, 11289322, 3541201, 2621004, 23030152, -2543158, -6148246, 8253317, +8814347, -15585899, -17283486, 12806519, 2473364, -13272523, 8902930, 3853123, 4310537, -9286793, +3733400, 10436234, 1253594, -13066901, 17713518, -2157684, -19870666, 593779, 15538655, 4840965, +-13005698, 11823508, 3914326, -18129056, 7446937, 927713, 18500034, -16777216, 1505386, 12744242, +-29372744, 932545, 12676059, -492848, 8784819, -4888210, -18804440, 2491618, -19897510, 18670222, +9640054, 5260261, -7395397, -7800735, 15425912, -13301514, 13765370, 15117748, -21626770, -7023882, +925565, 16740172, 261993, -9711458, 6202470, -11761231, -704375, 1699196, 9887015, 672699, +1626719, -6079526, 10291279, -3447785, -12005507, 10916733, -4847408, 4706211, -2718178, 7870528, +9948755, -11426224, 2001455, -6193880, 2695092, -6293738, 22121766, -6256157, -12404402, 9975062, +-5584531, -1883343, -6307697, 6519761, 6028524, -8950712, 5013301, 8705362, -4500589, 574989, +-12336757, -27938226, 45817100, 6478422, 20728586, -17812840, 7931731, -3845070, 5557151, 5027259, +-7623567, 3100967, 8421357, -4804458, 18295486, 853088, 635118, 6243809, 6014028, -644245, +-4607963, 7834021, -1161252, -5345624, -1055488, 7873749, -8402030, 1853278, 3882114, -10711648, +13502840, -2623688, -6415608, 20695300, -8434779, -12096775, 9548249, 5305895, -5632850, 9018894, +7233262, -2418067, -2835752, -1531156, 2761664, 5226975, 3086471, 48855, -3491809, 10716480, +-11249056, 10281078, 1667521, -1150514, 2918967, 3325379, 3382824, 559956, -10003516, 2930242, +8763344, -6080063, 46708, 113280, 6693707, -557809, -2495376, 10107132, -5003637, 5480915, +-10282152, -3718368, 10110890, -9429064, 9723806, -2383707, 6428493, 7873749, -8722005, -2865817, +10964515, -8968429, -404264, 1269163, 3368328, 941135, -1166621, 532576, 886374, 5158256, +-4218732, 1240172, 3275450, -188442, -2149631, 694174, 1951526, -298500, 716723, -1761474, +2334315, 3272228, -5411659, -733903, 9549860, -4451734, 2774549, -559420, 5470715, 1672353, +-2923262, 747861, -525060, -3015067, -2127620, 11326366, -1839857, -2422899, 1664837, 1390496, +-809064, 2521146, 4670240, 291521, 1260036, 573378, -921807, 835908, 1413044, -1984812, +1545115, 8590, 10660109, -37832220, -120885072, -6185827, 65093452, 29196114, 138708112, 11800423, +29266444, 1187559, -40491876, -50996296, -34554084, -62139048, -43487616, -27359478, 954020, 47391208, +93382256, 68718400, 59799368, 19458886, -32556388, -47795468, -42979736, -50644644, -56171192, -22781580, +-10801843, -4932770, 27354110, 36331128, 27379880, 50802484, 32779728, 12150462, 34064996, 773094, +-14861124, -9822053, -30663382, -62810676, -38213396, -36779416, -37527276, 1941325, 17414482, 12051141, +46097348, 37824704, 26032334, 37204080, 39528732, 11202348, 11815455, -4227859, -34138548, -47387448, +-36257576, -47494284, -33822868, -11800423, -8411693, 2922188, 25799332, 20236276, 18209588, 36506148, +30118458, 22183506, 37643776, 10334228, -7799661, -1559610, -15196131, -32760936, -19117974, -41445360, +-52455508, -30878668, -26141856, -11322071, 30341260, 41053444, 38206420, 44167296, 36264020, 20668456, +19840064, 9667435, -4351876, -11218991, -21153788, -31132070, -31261994, -35234300, -37091876, -31636730, +-10875931, -3725347, 12364137, 31836446, 35336844, 35067872, 40862320, 32592896, 24300924, 20308216, +6562710, -15809238, -28300076, -45917496, -58760520, -54905788, -43640624, -21888764, 5446556, 29463476, +40306656, 46540804, 48375292, 41862508, 29458644, 15112916, -9759776, -23766738, -31585726, -36478232, +-32076426, -24023900, -16726750, -6840273, 7540352, 10192494, 13710609, 15955267, 14025216, 11304354, +8856759, 6091874, 5172215, 2390149, -1968706, -3034395, -3290482, -4902169, -5582921, -6993281, +-8396124, -9071508, -7470022, -5532455, -3078418, 76236, 4412542, 5966247, 4590783, 2843805, +1946694, 1621350, 0, 0, 0, 0, 0, 0, }, { -2763275, -666257, 3242164, -281320, 294205, -4798016, -2411087, 713501, 6369974, -4101157, 1333587, --6607271, 6790880, 452045, 2491618, -775242, 1080184, -1268626, -2324651, -5742372, 2439005, --5757404, -2687039, -3244848, 3278134, 2608119, 1260036, 2718178, 5120675, 343061, -4633196, -3062312, 507343, -208306, 2511482, -911607, -1673964, -6774237, 1111323, -1932198, 1495186, -2863133, -3670587, -1452773, 3364033, 1066763, 410169, -3441880, 8726300, 5266704, 866510, -4231617, 3478924, 3378529, -7950522, 514859, -758599, -2090575, 1968706, 1340567, -1262184, --1467805, -411780, -2362769, 2367064, -878321, 4651987, -149250, -1167157, -2177012, -4037806, --718333, 3140695, -111669, 732829, 3699578, 1022202, 4275640, -66035, 670015, -419296, -4595615, 4076461, 4124779, 911607, 22012, 1843078, -64425, 583579, 113817, 227096, --314069, -1248762, -1048509, -214748, -1204738, 606127, 652298, -504659, 1368484, -507343, --360777, -253403, 579284, 175557, 1227824, 126165, 46708, 119722, 1584306, 787590, --88047, -394063, 102542, -194884, 410706, 1633161, 378494, 2076080, 7222525, -3497177, -2413772, -1988570, -3126736, -1280437, -2164664, 3947075, -3255048, -6040872, -1541893, 1596117, --5036386, -3040300, 5691369, 9834938, -1655710, 3762391, -3369939, -3543885, -156229, 1042066, --431644, -95563, 3649112, -6227166, 2034741, -453119, -1305670, -5247377, 457951, 129923, -2960843, 893890, -4111894, 5431523, -4316442, 5068599, -569083, 926639, 2057289, -586263, --2532957, 3966402, 971200, 5296769, 803696, -4651987, 8452496, 6731825, -2345589, -678605, --1631014, -5864778, -3180423, -956167, -1015223, 2385318, -3238405, 273267, 2313377, 24159, --93952, -360240, -561030, -3193308, 5106179, 181462, -117575, -1594507, -576599, -4671851, --4178466, 1400159, 3404299, -408559, -893890, 18790, -44560, -2379412, 4570919, 651761, -1505386, -1165010, 1239098, 812286, -201863, -54224, -213675, 93416, 1072668, -571231, -674310, 767725, -156229, -150861, 553514, 1260573, 1078574, -746251, 287763, 415001, --622233, -301721, 1701881, -201327, -103079, -1306744, -1259499, -2028835, -788127, -7576323, -9218074, -2070711, -1138166, 6571300, -2637647, 3364033, 14666240, -1817308, 389768, -5681705, --4595615, -7065221, 4016331, -2949569, 1937030, 3811247, -4466229, -3826279, -2815888, 262530, -1401233, -5506685, -2186675, 2328409, 1995549, -2217277, -936303, 3276523, -3487514, 481573, --1757179, -676457, -2442763, 1987496, -2245194, 851477, 1905355, -955630, 6138045, 205622, --887448, -4627828, 497142, 6560026, 865973, 2178085, -6101538, -8698383, -3189013, -7490960, --6615860, -227633, -2882460, -312996, -8015483, 6759742, -7424388, 1029182, 5007395, -4620311, --7755101, -5536750, -1666447, 5064304, 4495220, 6796249, -4079682, -3594888, -2882997, -2483028, -4909148, 1222455, -2095944, -1150514, 2312840, 2632278, 769873, 1185411, 1673964, -424665, --2895345, -513785, -1931662, 664646, 202937, 577136, 525060, 102005, 1154809, 112743, -1353989, 91805, -1092532, 1379221, -1689533, -1118839, 293132, -477278, 1388885, -911070, --691490, -327491, 151398, -602369, -1027571, 872952, -349503, 634045, -872952, -841277, --1026497, -1185411, -757525, -1081795, 8020852, 832687, -3226057, 453656, -2670396, -595927, -5613523, 9414031, -3219615, -3296924, -8543764, 1079111, 2145336, 4858682, -3221762, 5238787, -831076, 8069170, -6476811, 1034013, -12230993, -1351841, 1462973, -2995203, -2749853, -1086627, -4510253, -3699041, -6427956, 1817308, -9431748, -2064806, -4529043, 2072322, -1001264, 3182571, -423591, -7202124, -7764764, 202937, 4143033, 7681012, -1522029, -3140695, 6448357, -7115687, --3857418, 3416647, 3070365, 5078262, -4850629, 168041, 1978369, -3078418, -1022739, 2992519, --4399657, 5731634, -2487323, -1083406, -6118181, -5112085, 2476586, -28991, 131533, -883153, --3746822, 3542274, -2348273, 4408247, -57982, -5872831, -6123550, 2229088, -3069291, 1078574, --8722542, -8369281, -1309965, 7840463, 79457, -1640678, 416075, 1112933, 865436, -381178, -1282048, -4119411, 793495, 669478, 1272921, 1556389, 1782948, 900869, -2265595, 144418, -2059974, 911607, 581431, -1168768, -1366873, 301721, 34360, -496069, 1942399, -63888, --92342, -1346472, 2417530, 1931662, -73014, 144418, -1123671, 656593, 788127, 301721, -155693, 753230, -1006096, 4831302, -13042742, 3058554, -5651640, 4830765, 5515275, -6151467, --11433203, 1637456, -1505923, 7286949, -4337380, 10540387, -4403952, 6984154, -8581345, -3161096, -3617436, 5200132, 1471563, -9127, -5256503, -665720, -4131222, -5164162, 2900714, -4403415, -1755031, 1045288, 2157684, -2491081, 4913980, -890132, 4232154, -921807, -8041253, -1316408, --2558190, 843961, 8070781, 536871, -672162, -389231, -3242700, 2815351, -3055869, 4281546, -4619774, 1701344, 1789391, 8142185, -1988033, -1433982, -6468758, 4654134, 4097399, 891206, -1070521, 886911, 360240, 2408403, 4962835, 3337190, 1905892, 1836099, -1237488, 6481106, -2219961, -1292248, -4931160, 2552821, -1449015, 9448391, 5364414, 1227824, -4316979, -1579474, -7194070, -2745021, 963683, 4198868, -2288144, -2845953, -5668820, 765578, 2107755, -407485, -2765422, -2185602, -809064, -1693828, 2036351, -128849, -604517, -2686502, 685047, 745177, -1670205, 1979443, -622770, 365609, 2168422, -119185, 2200097, -105764, 688805, 3235721, -695248, 3324842, -213138, -670552, -169114, -240518, 147103, 278636, -2436320, 964220, -2019708, 253403, 837519, -549756, -16821240, -9130027, 3398393, -3272228, 6788196, 6773164, -10213432, 4235375, 4140349, 2531346, -12257837, -2731062, -1684164, 1115618, -1217086, 3833795, -2724083, -4702453, -3756486, 3166465, 5985574, 7552700, 6508486, 8577050, -4684736, -4669703, --6215892, 6616934, -3811784, 5469641, -1375463, -269509, -5822902, -3477850, -3329674, 4969814, -6111202, 1092532, 6108517, 8753680, -3471407, 2224256, 10257456, -5144297, 3329137, 3492882, -383863, 7726646, 9881646, 7529615, 17139604, 3198677, -2436857, -3160022, -2942590, -171799, -3012383, 5211943, -954020, -1665374, -1820529, -4580046, 1921998, 2496450, 4434017, -10687489, --1478006, 2720325, 7089381, 4964446, -9151502, -6757594, 1715303, 1723356, 7394860, -6509560, -398358, -645319, 769873, -9268003, -2527052, -3183108, -2269890, -3800509, -1620813, 306553, -3544422, 6979, 180926, 1403917, 1683627, -3530463, -582505, 279710, -8590, 1281511, --1248225, -2301566, -1597728, -1753420, 2496450, -2410551, -1197222, -2776696, 670552, -582505, -1762547, -2539936, 1040456, -848793, 1020055, 973884, 145492, 2232846, -2141041, 1109712, -1179505, 387621, 2540473, 4088809, 8159901, -1026497, 1688459, 6979859, 10236518, 5775658, --11240466, 63351, -11960947, -8476118, -5121749, -970126, -7307887, 8784282, 3267933, 5210332, --14884746, -1043677, 9783936, 4987531, -4347044, -6243272, -3799436, 3830574, -11379516, -639413, --7301982, 11253351, -1448478, -3256659, 1227824, -374736, -1893544, 2007897, -2935073, 5239860, -3740380, 7519414, -522912, 408022, 11600170, -3634616, 7776039, -1232656, -1326608, 20401632, -2462090, -2160369, -4567161, -15737834, 1697049, -16130287, -2682744, 17033304, -4764193, -3283503, --11783780, -3443490, 457951, -6331319, 3454764, -595390, -8625368, 9227200, 3332358, 3018825, -2572686, -6388764, 7071664, -10965588, 3218541, 4240744, 504659, -1434519, -4405026, -3473555, --4487167, -1432909, 3692598, 4715874, -1140851, -3821447, -2229625, 5254356, 2193655, 10038949, --129386, 775778, 4126390, -396211, -1797981, -1368484, -1217086, -1086090, -1603097, 1196685, --1836635, -53150, 2094333, 769336, 2135136, 2030983, 1668595, 199716, 3077881, 2206540, -1359894, 948114, 972273, -3141232, -2625836, 2312303, 385473, -1930051, 406411, -2197413, -701690, 2551211, 985695, -408559, 993211, 2190970, 551366, -1740536, 1008244, 6735046, --13292387, 5866389, -4629438, -6674379, -6358699, 5180805, 6593312, 3884261, 11364483, 8410083, -1774358, 3487514, -8742406, 1887638, 4071629, 8836895, 1784559, -4097936, 3286187, 4179540, --7827041, 1253057, -8031052, 6435472, 5870147, 7533373, -7137162, 4515621, 8056822, -3503620, -2146947, 10669236, -233539, -6445672, -5119601, 2456185, -1658931, -6551973, -2646237, 226023, -1641214, 3713536, -4494684, 7479149, 4574677, -1584843, 8994198, -996432, 3466039, 11775190, --12316356, 22997402, -10448582, 3251290, 6992207, -2284923, -1188632, 3003256, 15595026, -740882, --2058363, -357019, -3593814, 7639673, 8539469, -2600066, 3703336, 3110630, 2843268, 5280126, -6743099, 655519, 7284802, 1658394, -6094559, -9408126, 2361158, 1044751, 4451197, 1970853, -14440217, -1340567, 8103530, 6572911, -4361540, -8070244, -872415, 1035624, 2208687, -2112050, -3779571, 1846836, -3437585, -855772, -3278671, -1129040, 2181307, -972273, 3179350, -674847, -1194538, 901943, -1352378, 1748052, 1961726, -2747169, 2001455, 1385127, 682900, 784905, --15569, 661425, 3518652, 1177358, -1133871, 727997, 1028108, 1806571, 2199023, -543313, --2291902, -580894, -1992328, -1451699, 2622615, 7561290, 9972377, 6111202, -10686952, 20352240, --6459094, 3816079, -15010374, 5896453, -13277891, 10197863, 1024887, -2906082, -7526930, 9634149, -1263257, 6123013, 6355478, 3212636, -11181947, 5634997, -6779606, -1305670, 5003100, 5401995, -1246614, -2146410, -11198590, 1483374, 10268730, 1074816, 6640557, 7374459, -11688217, 6347425, --5951751, -5938329, 8591545, 9454297, 4939213, 5281736, 1472100, 5057324, -12039330, -5454609, --3853123, 253940, 12790413, 6051072, 5061619, -1042603, 5618354, -385473, 14092325, 5104032, -5340255, 2052994, -795643, -20969104, 7728257, 4824322, -1936493, -1589138, -15584289, 29528, --5958731, 3606162, 13566191, -2399813, -7766912, 15697569, -708670, 8807904, -5272073, -77309, --9867687, -1049046, 195421, -17236778, -5078799, -3092913, -7681549, -3713536, -1502702, 926639, -8578123, 478352, -190052, -1813550, -4402342, -874026, 810675, -1792612, 629750, 38655, -2318209, -4186519, -1554241, -717260, -3665755, 16106, -2364916, -1700270, -1176821, -3179887, --1501628, 3299072, -1132798, 418222, -916976, 3582540, -128849, 1502165, -2420214, -5773510, --1638530, -470299, 2447595, 766652, 3467649, -469225, -1030255, 2655901, -3527242, 4278861, --75162, 13392782, -11476153, 1711008, 4892505, 6077379, -19942606, 13291313, 3738232, -14168560, --9048959, 7782481, 17833242, -6235219, -3202435, -12263205, 25516938, 9931575, 1619203, 4277788, --13349295, -8632884, -530428, 1144072, 13250511, 2899103, 10222559, 11488501, -468688, 742493, -8010651, -2071785, -8480950, -8108362, -2040646, 11373073, -6097780, 14379014, -6626061, 21100638, -9399536, 17024176, -4574140, 2779381, 13666586, -10587631, 6385006, 6183679, 5811628, -6051609, -7289097, 1786706, 2341831, 6227703, 12993887, 10931766, -11041824, -2561948, 5721970, -10767483, --6834904, -2825015, -22069152, 5936719, -10899553, -6822556, 2149631, -2714956, 7579544, 14103062, -9041980, 5714454, -7588134, -1775969, -448287, -14926085, 2745021, 1289027, 18487686, 3994320, -4166118, -3987340, 14283987, -112743, -401043, 57445, -4638028, -2110440, 603443, -840203, --5029944, 474594, -1292785, 919123, -6002754, -6504728, -2139431, 5197984, -863825, 2026151, -1963874, 1607392, -431107, -1376537, -1803349, -3608846, -6029061, 2068027, 308164, -1476932, --7125351, 5239860, 3563212, 2024003, -600222, 437550, -2436857, 1778653, -1294396, -2351495, -818728, 3025805, 1821603, -1893007, -477815, -777926, 2218888, -15928960, -23499376, 12692702, --9574019, 10402411, 3399467, 5025649, 6163278, -15799574, -28711856, 2520072, 4148939, 16152298, --15950435, -17512192, 15091978, -6055367, 6866579, -3328063, 3597035, 2361695, 3984119, -7998303, -3853660, -1184337, -2486249, 9933722, 3733937, -1474248, -12939663, -1810329, -357556, -2430415, --602906, -7056095, -17161616, -7684234, 12628814, -5422396, 6238440, -9792525, 7237557, 3661997, --105227, -4962298, -21281562, 11718281, 11461657, 14638322, -10251550, -4422743, 20014010, 17593260, -8193724, 3726958, 11329050, 4082903, 10185515, -5520644, 8854075, -16923782, -1028645, 4621922, --4342212, 19968376, 827855, 10879689, -6489696, -10862509, 23222888, -479426, 9251360, -3158412, -382789, -27349278, -2237678, 5699959, -10458782, 12739947, 9799505, 2295660, -5513128, -20868172, --376883, -4331475, 5242545, 6194954, 1124208, -2644626, 4957466, 97174, 2474975, -1441498, --6201396, -2423435, -5653251, 9914395, 3165928, -339302, -122943, 1118302, 9368934, -1748052, --2131378, 1285269, -633508, -35433, 4260071, 2113661, 3842922, -2842195, -246961, -4459787, -942208, -103616, 4029216, 3739306, -4228932, 6822019, 7239704, -5749888, 555125, -11770358, --15421617, -4474282, -3608846, -26411364, -24774982, -6487548, 125091, 18656264, 15177341, 15021111, --5802501, -2408940, -3753802, 16037945, 6893960, -6722161, -1185411, -5350993, 11601244, 9006010, --6688338, -9368934, -8598525, -17568026, 7344931, 495532, 503585, 3841312, -2622078, 6670084, -24719148, -14061723, 7457137, 1480690, -9519258, -5448703, -11303817, 4294431, -5020280, -5675800, -12803298, 1578401, -4261682, 12927852, -1750199, -5697811, 4504347, 9434433, -5181878, 10138807, -18205292, 17558364, -11988327, -158914, 4393215, 9898289, -15183246, -3157338, -4186519, 18938122, -8076686, -2032593, -11503533, -12767864, -11349451, 17105780, 14168560, -27074936, -22586160, -17127256, --12058658, 4096862, -10874320, 6621229, 1817308, 2698313, -21776022, -6972880, 19712290, 15205795, --6585796, -13970455, 13622563, 7144141, -1622424, 239444, -1720671, -3301756, 7750806, -6924024, -1709934, 1203128, -271120, -4998268, -9131637, 1782948, 7454990, -713501, 837519, -3180423, -7082938, 7747048, 781684, -1007170, 2627983, -258772, 3148211, 3389266, 4891968, -6515466, --603980, 2414309, 25770, -4034048, 1116155, 8216810, 7655243, -2882997, 5874442, -8923868, -2274185, -2862596, -2449742, -3557844, -5556077, 21782464, 17156784, 10626823, 1605244, -14322105, --7465727, -2260764, 5814849, 9010305, -12679280, 3227668, 731755, -10842645, -5156645, 8631811, --6464463, 6847789, 2918967, 8063264, -10124849, -103616, -22543210, 3307125, -28498718, 11636677, -11508365, -11114838, 13000866, 15502684, 400506, 4363687, -18396956, 10746545, 1020055, -7684234, -9881646, -2420214, 81604, -251792, 1156957, 19087908, -2226404, -108448, 23449984, -316217, --10924249, -31144418, -25611426, 28308130, 17609366, 6912750, 7075422, -11961484, -24010478, -11843909, -3717831, -9279277, 18644454, -1088237, 2412161, 20110110, -4221953, -6360310, -4618701, -12809740, --21686364, -17245904, 48760228, -23808614, -10820633, 13923210, -24817394, -17904644, 17633526, 24753508, -8100845, -4611185, 29148870, 14029511, -23601920, -8251169, -13218836, -12903155, 26491358, 1829119, --17791366, -12327630, -13867913, 3783329, -2930778, 8007967, -286689, -4184909, -6552510, 498216, -7266548, -4059818, 3309272, -3958886, 3573413, 3231426, 10152766, -4095251, -1586990, 8684424, -606664, 4386236, 4482872, 6165426, 1080721, -3779034, -2158758, -1052267, -1570347, 3733400, --1292248, -4225174, 8157754, 8420283, -4813048, 2059974, -5466957, 1823751, 1899449, 5146445, --1443646, -645856, -2757906, 2590939, 6003828, -20007032, -14753750, -10281078, -18305150, -1606318, -17434882, -1212791, 3623879, 8606578, 5728413, -14725832, -7104413, -12161200, -6489159, 15705622, --4736275, -1660542, -2099702, 9541807, 9515500, 28307056, 4549981, 20849918, -1168231, 7067906, --11283416, -8485782, 7502234, -14370424, -15982647, 573378, 5097590, -8179765, 6628745, -9584756, -2986613, -25296820, 14194867, 7964480, 11618423, 1488743, -10258529, -21187610, -7527467, -1846836, -17552994, -13289166, -7847442, 4937065, 40082784, -11020349, 40746892, -24922622, 9904731, -9161165, -17905718, -7038378, 30925376, -29000692, 44269300, -4138201, 9139690, 19185082, -32753420, 29286308, --34988416, 23686744, -57039312, 30988726, -29301878, 26045756, -38240780, 33697240, 1174674, 21857088, -9482751, -17809618, 15566572, -12741557, 38717520, -17578228, 6405407, -23039278, 6287296, -1506997, -4275640, -8216273, 10771778, -10562398, 7640747, -3719442, 2484639, 3291556, 3449933, 4515621, --2601140, -6064494, -4918275, -5810554, -13393319, 7785702, 2014877, -9194451, -4265440, -2759517, -6001680, -10240813, 9788230, -7838852, 1969243, -4192962, 4771172, 1609539, -73014, 14848776, --13120051, 8042863, -12677133, 19139984, -3623342, 18697604, -7347079, 5847598, 8455180, 2835752, -2922725, -10201, 8956617, -13347685, 14645302, -10181757, 9639517, -17569100, -15916612, 18538690, -31975494, -26477936, 40533216, -2346663, 2684, -1552094, 7046431, -12053826, -8850317, -18061948, --4028679, 582505, 52613, -92342, 15943455, 2728378, 17478906, 17095044, -10858214, 6289980, -36441724, 11898670, 7820062, 5460514, -31575526, 1605244, -5101348, -3965866, -28954522, -6136435, -16675211, 4694936, 5561446, 8364986, 21123186, 5493263, -6483790, -2175401, -1791001, 7898982, --14330158, -8852464, 21814676, 13502303, 10174778, 16820702, 12470974, -7350300, -3643743, -25143812, --11002632, 10197863, 8096550, 18946712, -13636521, -6833830, -4759361, 13919452, 8200167, 12491912, -5207111, -9940702, -9161165, 31337156, -9552544, -30508764, 7089381, 22016002, 15154255, -434865, --2590939, 2688113, 5098126, 3080565, 28066000, -33782604, -28766080, 3310883, 11432666, -14565308, --7441568, 2412698, -11375221, 5369783, -5528697, -1487669, 3073049, -2240899, -7617662, 233002, -6447283, -4161287, 133681, -11229192, -1881196, -9889699, 7304129, -3189013, 6707665, -4070019, -4224637, 1651952, 5680094, 8674760, -8782134, -4057670, -2556043, 6817187, -4207458, -8101382, --14593762, -139586, -5767604, -2287607, 2341294, 1372779, 530428, 2783676, 4930086, -1051193, -14944876, 1721745, -1060320, -11585137, 2120103, -2229625, -506269, -12412992, -64105608, 17726940, --7802882, -4062502, 15737834, -10860899, 16887274, -2265595, -27775016, -5060009, 2710661, 9760313, -12417824, 2893734, -19680078, 19492710, -7634841, -1767916, -12090870, -5437429, 10459319, -2084670, -9331353, 15717433, -3627637, -20288352, 4512937, 22272090, -20723754, 7631083, 17297980, -3141769, --13703630, -25588342, -17255568, 18054432, 46277200, -14244259, -18444738, 52128556, -3394098, -7504382, -37528352, 21844204, 18653580, 15064598, 6195491, -11029476, 19072876, 17752710, 12245489, 5662915, --34482144, 21545704, 19084688, -36420248, -21047488, -13086765, -10184978, -10035191, 39758512, 19840602, --22707492, 21239688, -8395587, -21251498, 9271224, 10807748, -9371619, -9009768, -33319820, 3744675, -5710696, 24379844, 11698417, 3013993, 20405390, -16207059, 42193760, -44841068, -52284784, 36916316, --22556094, -1407676, 25914758, -16327855, -11215770, -3238942, -3067681, 3209951, 15905338, 7791071, --12995497, -810138, 6202470, -1569274, 8842801, -364535, 4894652, 937914, -6892886, 3689377, -14112189, 9692667, -603980, 1867774, 9439264, -1537061, -1112397, 2369211, 21845278, 11184095, --3499862, 4749697, -19359566, -874026, 5115843, -8946417, -12002823, 11300059, -5188321, -365072, -11649025, -10142565, 4480725, -1760937, -2895882, 14420353, -8177081, -17141752, -69851200, 21368000, -39265128, -24485072, -5171141, -19061064, 40400072, 27138288, 17003776, -3321620, -14254996, 2816425, -16225850, 7505992, -7140920, -1642825, 22230214, -1563905, -8324721, -30012694, -14283987, 25142738, -14571750, -16016470, 12650826, -11625403, -3757023, 7473243, 7000797, -7043747, 4482872, -26327612, -7402376, 35355632, -4613332, -7012071, -34953516, -21048024, 16792786, -27590334, -15044197, 6181532, -6878390, -8609262, 22723062, 21443698, -22309670, 8176544, 12256226, 35617628, 32615982, -5289789, -10592463, -988379, 37305548, 16147466, 15060303, 35340064, -15949898, -23286776, -11984569, -29778618, -24892020, 11673721, 12099997, 6369437, 42322072, -28226526, -6680822, 17996450, -10143102, 19984482, --1093069, 2222646, 9240085, -24669756, -37329172, 4553202, 7043210, 40787692, 31016644, 614180, --30314952, -4913980, -33100240, -333397, -1166084, -9406515, -8572755, 4329864, -2974265, -2632815, --8487929, -5589900, -7553774, -4585415, 1016834, -8990977, -8192113, -1503775, 8106214, 4041027, --10847477, 9579388, -5559299, 17918066, -5789616, -16251083, -6025302, 7833484, -5117454, -12374875, -13809394, -3180960, -12846784, -19867982, 2915209, -3351148, 2188823, 4161287, -7691750, -6660958, --17360258, -4023848, -4680441, 1010928, 3064996, 6142877, 5380521, -13336947, 16343424, 27683212, -24183350, 24907590, 32028644, -18237504, 25256018, -48977124, -21324512, 18702436, 4546223, 35976256, -16503412, 30696668, -13174275, 4161287, -26414048, 18129056, 29879014, 27166206, 2862059, 19284404, --47017544, -30601106, 29408178, 8628589, -29252486, -15081241, 3733937, 43348032, 13494250, -17501992, --22070226, 4499515, -6343130, 26694832, 28860032, -2746632, -4528506, 5793911, -8009577, 34492884, -10027138, -8075613, 7069516, -16291885, -9581535, -77009840, -26069378, 13822279, -11924977, -11460046, --243203, -13831405, -13793287, 35409320, 23775328, -17722646, 32356136, 66867272, 13865228, 47648904, -6707665, 9740449, 35032976, 23125714, -18670222, -21254182, -37401112, -23260470, -2337536, -36958732, -13852880, -4392141, -35721244, -25646324, -25522306, -32169306, -19433116, -12891881, -17013976, 5131412, -30718142, 37405408, 19821810, -3827890, -27103392, -3419868, 1203665, 2373506, -13127568, -2322504, --8817568, 7345468, 10667625, 1212255, 7854422, -202937, -5140002, 8971113, -9483288, 1256815, -8650601, 18329846, 2675765, -136365, 12502113, 5253819, 33258616, -8265128, -26756572, -1363652, -18346490, 3263102, -7152195, -8188355, -21713744, -20688320, -11546483, -8228621, -3626026, -12419435, --17765596, -19087908, -10272488, -1538672, 2831994, 25296820, 18508088, -6786049, 29644938, 52326660, -36423472, 25478820, 16143708, 9997073, -12641162, -8347269, -12603582, -11652246, -454730, 30668214, --3143379, 26079578, -16570521, 7086159, -57247084, 16365973, -8539469, 29709362, -7157563, -34163244, -34726420, -12790413, 5475547, 19851338, 14891188, 31813360, -4636954, 5012227, -5827734, 36245228, --7468412, 7046431, 25294136, -28723668, 24944634, -7030862, 15335181, 24223616, -6269042, 5610301, -4214437, 2704756, -7546795, 10929081, 10580115, -3991098, -13907641, -2357937, -16244640, -5133023, --2924873, 13711683, -6701223, -25924960, -17022566, 27828166, 28106266, -26103200, -21849036, 33274722, -39064340, -14756971, -3612604, 28225988, 1371705, 14643691, 20604568, -46760920, -13652627, -2940979, -45802068, 4430259, -2987150, -44548476, 9148280, 17850420, 11791833, 1844152, 12314745, 4883915, -6482180, 57365732, -1491427, 3244311, 33894808, -19903952, 22612466, 4423280, 17130478, 11237245, --25642028, -8309151, 31096100, 20644298, 12085501, -7077033, 11054709, 5614596, 272194, 4327717, -8137353, -3517578, 13724568, -8609262, -2080375, 14093935, 8494372, 3036542, -28768764, 2837363, -14666776, -10694469, 5427228, -25597468, -16052977, 18351322, 9134322, 15126875, 13331578, -10070625, --27949500, -7671886, 10033580, 24849608, 15327665, -3455838, -5076652, -8442832, 20642686, -178241, --3692598, -8076149, 11134166, 4722317, -4016331, -20374788, -12597676, 13196824, 13409425, 9430138, --13715978, -19694572, 10409390, 26356604, 12678207, 1924682, -12663711, -3056943, 6609418, -233002, -1020592, 1533303, -2685428, -6043019, 33007898, -55984360, -3893925, -47370804, -43910672, 10998874, -9220758, 8008504, 1068910, 41718628, 23753854, 53720376, 58784144, -6492917, -28964722, 6124624, --7894687, -5392869, 12703440, 5680094, -4759898, -27089970, -29659970, 32080722, 14780593, -3657702, -4864051, 5214091, 2891050, 5909875, -3093450, -7681549, -43845172, 964757, 25052544, -7360500, --33822868, -11060078, 27615566, -51386064, -17772038, 32517734, 19568408, 38833484, -1229971, 2857227, --35903780, -36107792, -45645300, 38366944, 54154704, -71448928, -35755604, -3696356, 36169532, -28311888, --4764730, 65614216, 26520886, 16689169, 43242268, 31769336, 47480864, -17139066, 47202764, -7144678, --37321656, -54567024, -12985834, 21007222, -43465068, -8395587, 9133785, -9052180, -15432354, 9322763, -8165270, -29679298, 21986474, 10950556, 32035624, -7660611, -31799400, 39497592, 7748121, -35803384, --19327, -8242042, 14741402, -15782394, -16545288, -8250632, -1906429, -394600, -12608950, -14848776, -11387569, -15493558, -380105, -15306190, 8240969, 14817100, 2057826, 22086332, 14801531, -21946210, --8492761, 165356, -20148766, 3490198, -3634616, 8065412, -5513128, 7134478, 18928994, 229244, -3428995, -13289703, 20374788, 13327820, -14900852, -4103305, 14443975, 14047764, -2336999, -21055004, --3056943, -41513008, 31920734, -2742337, 9736691, 12335146, 11941083, 359704, -14016089, 22631256, -5645735, 21843666, -4744865, -46437724, -4253628, 13365938, -15296526, -17021492, -10440529, -15691663, -18865644, -4890357, -16535624, -970126, 17548162, -23671712, 16520055, -8233989, 8772471, -23318988, --5839545, 9408126, -2033667, -2177549, 2841658, 13042742, -2347737, -2143189, -16304770, 8085813, --4497368, 2594160, 5005785, 1690607, 12036109, -17679696, -13516799, 18478560, 15923591, -22193706, -10550050, -17938468, 20645908, -17331804, 7772280, 5322002, -14687714, 32478006, 3133716, -36166308, -16637630, 4363150, -27986006, 15675557, -10289668, 16696685, -24266028, 12429098, -25702694, 11777874, -18249316, -16552267, 9466108, -17586280, 593242, 587337, 1659468, -11557757, 206158, 8794482, --511101, -15874736, 11957189, -9947681, -21378736, 9200357, -9501005, 4650913, 9930501, -7560216, --4584341, 1788317, -1418413, 6457484, -3404835, -2357937, 5746666, 7325604, 2445984, -7366406, --4413079, 7074885, 4219806, -16670379, 15205258, -2183454, -5710696, 2123861, -1209033, 3600256, -8149164, -2015413, 15447924, -4563940, -6740415, -7536057, -3041911, 1488743, -7327751, 1949915, --2499134, -2978023, 1851131, 2501819, -3056406, -69256, -874563, -3232500, 3147137, 2126546, --3587372, 9670119, 20732344, -9463960, -110973368, -200787040, -66302484, -155467616, -153792576, 83845280, -17956184, 116351736, 262075680, 236206560, 193795904, 236546928, 145019040, 32918776, 46062988, -32902134, --174462112, -172430592, -128863512, -167526272, -114657912, -23223426, -77175192, -106736376, -45950780, -12767864, --55155432, -25900264, -431107, -27255862, -49018460, 11100343, 43574052, -13881871, 60214904, 89604296, -2846490, 17825188, 120952720, 60271812, 1391033, 113373176, 92836792, -20972862, 44311176, 105891344, --1346472, 9254044, 149197504, 80427024, 33837364, 180249584, 198587472, 97966056, 188301568, 233979616, -61855584, 31953482, 95691872, -37376952, -112261320, -65275448, -146273168, -260020544, -259424080, -294641184, --392551424, -395449440, -379395936, -388260736, -347292128, -297739488, -238337936, -156064624, -79091824, 38930120, -172355424, 227028752, 276987808, 374867968, 329790144, 294760928, 329285472, 243121456, 113817704, 133605696, -150991728, 55975236, 73049880, 151125936, 74445208, 14232985, 65090768, 58520540, -32891396, 121333, -40793064, -59744604, -76190576, 17442936, -15067282, -24873766, 84329536, 72316512, 7628399, 65733936, -95432024, 16763257, -7106561, 5338108, -97590248, -176729312, -184493536, -235586480, -296375840, -281000928, --251261488, -229061888, -204137648, -150024288, -142177376, -155504656, -103988136, -34077880, 9470403, 38356204, -102005472, 122057064, 138254464, 247564064, 288730240, 266666464, 246146720, 195955200, 124162672, 106183936, -90483688, 55253144, 39558796, 36326832, 14534169, -3498788, -4943508, -10708964, -21847424, -27338004, --22399328, -31034896, -42196980, -40799504, -39538932, -44727252, -42505680, -32320166, -25908316, -19180250, --15596100, -14795625, 0, 0, 0, 0, 0, 0, }, +666257, 3242164, -281320, 294205, -4798016, -2411087, 713501, 6369974, -4101157, 1333587, +-6607271, 6790880, 452045, 2491618, -775242, 1080184, -1268626, -2324651, -5742372, 2439005, +-5757404, -2687039, -3244848, 3278134, 2608119, 1260036, 2718178, 5120675, 343061, -4633196, +3062312, 507343, -208306, 2511482, -911607, -1673964, -6774237, 1111323, -1932198, 1495186, +2863133, -3670587, -1452773, 3364033, 1066763, 410169, -3441880, 8726300, 5266704, 866510, +4231617, 3478924, 3378529, -7950522, 514859, -758599, -2090575, 1968706, 1340567, -1262184, +-1467805, -411780, -2362769, 2367064, -878321, 4651987, -149250, -1167157, -2177012, -4037806, +-718333, 3140695, -111669, 732829, 3699578, 1022202, 4275640, -66035, 670015, -419296, +4595615, 4076461, 4124779, 911607, 22012, 1843078, -64425, 583579, 113817, 227096, +-314069, -1248762, -1048509, -214748, -1204738, 606127, 652298, -504659, 1368484, -507343, +-360777, -253403, 579284, 175557, 1227824, 126165, 46708, 119722, 1584306, 787590, +-88047, -394063, 102542, -194884, 410706, 1633161, 378494, 2076080, 7222525, -3497177, +2413772, -1988570, -3126736, -1280437, -2164664, 3947075, -3255048, -6040872, -1541893, 1596117, +-5036386, -3040300, 5691369, 9834938, -1655710, 3762391, -3369939, -3543885, -156229, 1042066, +-431644, -95563, 3649112, -6227166, 2034741, -453119, -1305670, -5247377, 457951, 129923, +2960843, 893890, -4111894, 5431523, -4316442, 5068599, -569083, 926639, 2057289, -586263, +-2532957, 3966402, 971200, 5296769, 803696, -4651987, 8452496, 6731825, -2345589, -678605, +-1631014, -5864778, -3180423, -956167, -1015223, 2385318, -3238405, 273267, 2313377, 24159, +-93952, -360240, -561030, -3193308, 5106179, 181462, -117575, -1594507, -576599, -4671851, +-4178466, 1400159, 3404299, -408559, -893890, 18790, -44560, -2379412, 4570919, 651761, +1505386, -1165010, 1239098, 812286, -201863, -54224, -213675, 93416, 1072668, -571231, +674310, 767725, -156229, -150861, 553514, 1260573, 1078574, -746251, 287763, 415001, +-622233, -301721, 1701881, -201327, -103079, -1306744, -1259499, -2028835, -788127, -7576323, +9218074, -2070711, -1138166, 6571300, -2637647, 3364033, 14666240, -1817308, 389768, -5681705, +-4595615, -7065221, 4016331, -2949569, 1937030, 3811247, -4466229, -3826279, -2815888, 262530, +1401233, -5506685, -2186675, 2328409, 1995549, -2217277, -936303, 3276523, -3487514, 481573, +-1757179, -676457, -2442763, 1987496, -2245194, 851477, 1905355, -955630, 6138045, 205622, +-887448, -4627828, 497142, 6560026, 865973, 2178085, -6101538, -8698383, -3189013, -7490960, +-6615860, -227633, -2882460, -312996, -8015483, 6759742, -7424388, 1029182, 5007395, -4620311, +-7755101, -5536750, -1666447, 5064304, 4495220, 6796249, -4079682, -3594888, -2882997, -2483028, +4909148, 1222455, -2095944, -1150514, 2312840, 2632278, 769873, 1185411, 1673964, -424665, +-2895345, -513785, -1931662, 664646, 202937, 577136, 525060, 102005, 1154809, 112743, +1353989, 91805, -1092532, 1379221, -1689533, -1118839, 293132, -477278, 1388885, -911070, +-691490, -327491, 151398, -602369, -1027571, 872952, -349503, 634045, -872952, -841277, +-1026497, -1185411, -757525, -1081795, 8020852, 832687, -3226057, 453656, -2670396, -595927, +5613523, 9414031, -3219615, -3296924, -8543764, 1079111, 2145336, 4858682, -3221762, 5238787, +831076, 8069170, -6476811, 1034013, -12230993, -1351841, 1462973, -2995203, -2749853, -1086627, +4510253, -3699041, -6427956, 1817308, -9431748, -2064806, -4529043, 2072322, -1001264, 3182571, +423591, -7202124, -7764764, 202937, 4143033, 7681012, -1522029, -3140695, 6448357, -7115687, +-3857418, 3416647, 3070365, 5078262, -4850629, 168041, 1978369, -3078418, -1022739, 2992519, +-4399657, 5731634, -2487323, -1083406, -6118181, -5112085, 2476586, -28991, 131533, -883153, +-3746822, 3542274, -2348273, 4408247, -57982, -5872831, -6123550, 2229088, -3069291, 1078574, +-8722542, -8369281, -1309965, 7840463, 79457, -1640678, 416075, 1112933, 865436, -381178, +1282048, -4119411, 793495, 669478, 1272921, 1556389, 1782948, 900869, -2265595, 144418, +2059974, 911607, 581431, -1168768, -1366873, 301721, 34360, -496069, 1942399, -63888, +-92342, -1346472, 2417530, 1931662, -73014, 144418, -1123671, 656593, 788127, 301721, +155693, 753230, -1006096, 4831302, -13042742, 3058554, -5651640, 4830765, 5515275, -6151467, +-11433203, 1637456, -1505923, 7286949, -4337380, 10540387, -4403952, 6984154, -8581345, -3161096, +3617436, 5200132, 1471563, -9127, -5256503, -665720, -4131222, -5164162, 2900714, -4403415, +1755031, 1045288, 2157684, -2491081, 4913980, -890132, 4232154, -921807, -8041253, -1316408, +-2558190, 843961, 8070781, 536871, -672162, -389231, -3242700, 2815351, -3055869, 4281546, +4619774, 1701344, 1789391, 8142185, -1988033, -1433982, -6468758, 4654134, 4097399, 891206, +1070521, 886911, 360240, 2408403, 4962835, 3337190, 1905892, 1836099, -1237488, 6481106, +2219961, -1292248, -4931160, 2552821, -1449015, 9448391, 5364414, 1227824, -4316979, -1579474, +7194070, -2745021, 963683, 4198868, -2288144, -2845953, -5668820, 765578, 2107755, -407485, +2765422, -2185602, -809064, -1693828, 2036351, -128849, -604517, -2686502, 685047, 745177, +1670205, 1979443, -622770, 365609, 2168422, -119185, 2200097, -105764, 688805, 3235721, +695248, 3324842, -213138, -670552, -169114, -240518, 147103, 278636, -2436320, 964220, +2019708, 253403, 837519, -549756, -16821240, -9130027, 3398393, -3272228, 6788196, 6773164, +10213432, 4235375, 4140349, 2531346, -12257837, -2731062, -1684164, 1115618, -1217086, 3833795, +2724083, -4702453, -3756486, 3166465, 5985574, 7552700, 6508486, 8577050, -4684736, -4669703, +-6215892, 6616934, -3811784, 5469641, -1375463, -269509, -5822902, -3477850, -3329674, 4969814, +6111202, 1092532, 6108517, 8753680, -3471407, 2224256, 10257456, -5144297, 3329137, 3492882, +383863, 7726646, 9881646, 7529615, 17139604, 3198677, -2436857, -3160022, -2942590, -171799, +3012383, 5211943, -954020, -1665374, -1820529, -4580046, 1921998, 2496450, 4434017, -10687489, +-1478006, 2720325, 7089381, 4964446, -9151502, -6757594, 1715303, 1723356, 7394860, -6509560, +398358, -645319, 769873, -9268003, -2527052, -3183108, -2269890, -3800509, -1620813, 306553, +3544422, 6979, 180926, 1403917, 1683627, -3530463, -582505, 279710, -8590, 1281511, +-1248225, -2301566, -1597728, -1753420, 2496450, -2410551, -1197222, -2776696, 670552, -582505, +1762547, -2539936, 1040456, -848793, 1020055, 973884, 145492, 2232846, -2141041, 1109712, +1179505, 387621, 2540473, 4088809, 8159901, -1026497, 1688459, 6979859, 10236518, 5775658, +-11240466, 63351, -11960947, -8476118, -5121749, -970126, -7307887, 8784282, 3267933, 5210332, +-14884746, -1043677, 9783936, 4987531, -4347044, -6243272, -3799436, 3830574, -11379516, -639413, +-7301982, 11253351, -1448478, -3256659, 1227824, -374736, -1893544, 2007897, -2935073, 5239860, +3740380, 7519414, -522912, 408022, 11600170, -3634616, 7776039, -1232656, -1326608, 20401632, +2462090, -2160369, -4567161, -15737834, 1697049, -16130287, -2682744, 17033304, -4764193, -3283503, +-11783780, -3443490, 457951, -6331319, 3454764, -595390, -8625368, 9227200, 3332358, 3018825, +2572686, -6388764, 7071664, -10965588, 3218541, 4240744, 504659, -1434519, -4405026, -3473555, +-4487167, -1432909, 3692598, 4715874, -1140851, -3821447, -2229625, 5254356, 2193655, 10038949, +-129386, 775778, 4126390, -396211, -1797981, -1368484, -1217086, -1086090, -1603097, 1196685, +-1836635, -53150, 2094333, 769336, 2135136, 2030983, 1668595, 199716, 3077881, 2206540, +1359894, 948114, 972273, -3141232, -2625836, 2312303, 385473, -1930051, 406411, -2197413, +701690, 2551211, 985695, -408559, 993211, 2190970, 551366, -1740536, 1008244, 6735046, +-13292387, 5866389, -4629438, -6674379, -6358699, 5180805, 6593312, 3884261, 11364483, 8410083, +1774358, 3487514, -8742406, 1887638, 4071629, 8836895, 1784559, -4097936, 3286187, 4179540, +-7827041, 1253057, -8031052, 6435472, 5870147, 7533373, -7137162, 4515621, 8056822, -3503620, +2146947, 10669236, -233539, -6445672, -5119601, 2456185, -1658931, -6551973, -2646237, 226023, +1641214, 3713536, -4494684, 7479149, 4574677, -1584843, 8994198, -996432, 3466039, 11775190, +-12316356, 22997402, -10448582, 3251290, 6992207, -2284923, -1188632, 3003256, 15595026, -740882, +-2058363, -357019, -3593814, 7639673, 8539469, -2600066, 3703336, 3110630, 2843268, 5280126, +6743099, 655519, 7284802, 1658394, -6094559, -9408126, 2361158, 1044751, 4451197, 1970853, +14440217, -1340567, 8103530, 6572911, -4361540, -8070244, -872415, 1035624, 2208687, -2112050, +3779571, 1846836, -3437585, -855772, -3278671, -1129040, 2181307, -972273, 3179350, -674847, +1194538, 901943, -1352378, 1748052, 1961726, -2747169, 2001455, 1385127, 682900, 784905, +-15569, 661425, 3518652, 1177358, -1133871, 727997, 1028108, 1806571, 2199023, -543313, +-2291902, -580894, -1992328, -1451699, 2622615, 7561290, 9972377, 6111202, -10686952, 20352240, +-6459094, 3816079, -15010374, 5896453, -13277891, 10197863, 1024887, -2906082, -7526930, 9634149, +1263257, 6123013, 6355478, 3212636, -11181947, 5634997, -6779606, -1305670, 5003100, 5401995, +1246614, -2146410, -11198590, 1483374, 10268730, 1074816, 6640557, 7374459, -11688217, 6347425, +-5951751, -5938329, 8591545, 9454297, 4939213, 5281736, 1472100, 5057324, -12039330, -5454609, +-3853123, 253940, 12790413, 6051072, 5061619, -1042603, 5618354, -385473, 14092325, 5104032, +5340255, 2052994, -795643, -20969104, 7728257, 4824322, -1936493, -1589138, -15584289, 29528, +-5958731, 3606162, 13566191, -2399813, -7766912, 15697569, -708670, 8807904, -5272073, -77309, +-9867687, -1049046, 195421, -17236778, -5078799, -3092913, -7681549, -3713536, -1502702, 926639, +8578123, 478352, -190052, -1813550, -4402342, -874026, 810675, -1792612, 629750, 38655, +2318209, -4186519, -1554241, -717260, -3665755, 16106, -2364916, -1700270, -1176821, -3179887, +-1501628, 3299072, -1132798, 418222, -916976, 3582540, -128849, 1502165, -2420214, -5773510, +-1638530, -470299, 2447595, 766652, 3467649, -469225, -1030255, 2655901, -3527242, 4278861, +-75162, 13392782, -11476153, 1711008, 4892505, 6077379, -19942606, 13291313, 3738232, -14168560, +-9048959, 7782481, 17833242, -6235219, -3202435, -12263205, 25516938, 9931575, 1619203, 4277788, +-13349295, -8632884, -530428, 1144072, 13250511, 2899103, 10222559, 11488501, -468688, 742493, +8010651, -2071785, -8480950, -8108362, -2040646, 11373073, -6097780, 14379014, -6626061, 21100638, +9399536, 17024176, -4574140, 2779381, 13666586, -10587631, 6385006, 6183679, 5811628, -6051609, +7289097, 1786706, 2341831, 6227703, 12993887, 10931766, -11041824, -2561948, 5721970, -10767483, +-6834904, -2825015, -22069152, 5936719, -10899553, -6822556, 2149631, -2714956, 7579544, 14103062, +9041980, 5714454, -7588134, -1775969, -448287, -14926085, 2745021, 1289027, 18487686, 3994320, +4166118, -3987340, 14283987, -112743, -401043, 57445, -4638028, -2110440, 603443, -840203, +-5029944, 474594, -1292785, 919123, -6002754, -6504728, -2139431, 5197984, -863825, 2026151, +1963874, 1607392, -431107, -1376537, -1803349, -3608846, -6029061, 2068027, 308164, -1476932, +-7125351, 5239860, 3563212, 2024003, -600222, 437550, -2436857, 1778653, -1294396, -2351495, +818728, 3025805, 1821603, -1893007, -477815, -777926, 2218888, -15928960, -23499376, 12692702, +-9574019, 10402411, 3399467, 5025649, 6163278, -15799574, -28711856, 2520072, 4148939, 16152298, +-15950435, -17512192, 15091978, -6055367, 6866579, -3328063, 3597035, 2361695, 3984119, -7998303, +3853660, -1184337, -2486249, 9933722, 3733937, -1474248, -12939663, -1810329, -357556, -2430415, +-602906, -7056095, -17161616, -7684234, 12628814, -5422396, 6238440, -9792525, 7237557, 3661997, +-105227, -4962298, -21281562, 11718281, 11461657, 14638322, -10251550, -4422743, 20014010, 17593260, +8193724, 3726958, 11329050, 4082903, 10185515, -5520644, 8854075, -16923782, -1028645, 4621922, +-4342212, 19968376, 827855, 10879689, -6489696, -10862509, 23222888, -479426, 9251360, -3158412, +382789, -27349278, -2237678, 5699959, -10458782, 12739947, 9799505, 2295660, -5513128, -20868172, +-376883, -4331475, 5242545, 6194954, 1124208, -2644626, 4957466, 97174, 2474975, -1441498, +-6201396, -2423435, -5653251, 9914395, 3165928, -339302, -122943, 1118302, 9368934, -1748052, +-2131378, 1285269, -633508, -35433, 4260071, 2113661, 3842922, -2842195, -246961, -4459787, +942208, -103616, 4029216, 3739306, -4228932, 6822019, 7239704, -5749888, 555125, -11770358, +-15421617, -4474282, -3608846, -26411364, -24774982, -6487548, 125091, 18656264, 15177341, 15021111, +-5802501, -2408940, -3753802, 16037945, 6893960, -6722161, -1185411, -5350993, 11601244, 9006010, +-6688338, -9368934, -8598525, -17568026, 7344931, 495532, 503585, 3841312, -2622078, 6670084, +24719148, -14061723, 7457137, 1480690, -9519258, -5448703, -11303817, 4294431, -5020280, -5675800, +12803298, 1578401, -4261682, 12927852, -1750199, -5697811, 4504347, 9434433, -5181878, 10138807, +18205292, 17558364, -11988327, -158914, 4393215, 9898289, -15183246, -3157338, -4186519, 18938122, +8076686, -2032593, -11503533, -12767864, -11349451, 17105780, 14168560, -27074936, -22586160, -17127256, +-12058658, 4096862, -10874320, 6621229, 1817308, 2698313, -21776022, -6972880, 19712290, 15205795, +-6585796, -13970455, 13622563, 7144141, -1622424, 239444, -1720671, -3301756, 7750806, -6924024, +1709934, 1203128, -271120, -4998268, -9131637, 1782948, 7454990, -713501, 837519, -3180423, +7082938, 7747048, 781684, -1007170, 2627983, -258772, 3148211, 3389266, 4891968, -6515466, +-603980, 2414309, 25770, -4034048, 1116155, 8216810, 7655243, -2882997, 5874442, -8923868, +2274185, -2862596, -2449742, -3557844, -5556077, 21782464, 17156784, 10626823, 1605244, -14322105, +-7465727, -2260764, 5814849, 9010305, -12679280, 3227668, 731755, -10842645, -5156645, 8631811, +-6464463, 6847789, 2918967, 8063264, -10124849, -103616, -22543210, 3307125, -28498718, 11636677, +11508365, -11114838, 13000866, 15502684, 400506, 4363687, -18396956, 10746545, 1020055, -7684234, +9881646, -2420214, 81604, -251792, 1156957, 19087908, -2226404, -108448, 23449984, -316217, +-10924249, -31144418, -25611426, 28308130, 17609366, 6912750, 7075422, -11961484, -24010478, -11843909, +3717831, -9279277, 18644454, -1088237, 2412161, 20110110, -4221953, -6360310, -4618701, -12809740, +-21686364, -17245904, 48760228, -23808614, -10820633, 13923210, -24817394, -17904644, 17633526, 24753508, +8100845, -4611185, 29148870, 14029511, -23601920, -8251169, -13218836, -12903155, 26491358, 1829119, +-17791366, -12327630, -13867913, 3783329, -2930778, 8007967, -286689, -4184909, -6552510, 498216, +7266548, -4059818, 3309272, -3958886, 3573413, 3231426, 10152766, -4095251, -1586990, 8684424, +606664, 4386236, 4482872, 6165426, 1080721, -3779034, -2158758, -1052267, -1570347, 3733400, +-1292248, -4225174, 8157754, 8420283, -4813048, 2059974, -5466957, 1823751, 1899449, 5146445, +-1443646, -645856, -2757906, 2590939, 6003828, -20007032, -14753750, -10281078, -18305150, -1606318, +17434882, -1212791, 3623879, 8606578, 5728413, -14725832, -7104413, -12161200, -6489159, 15705622, +-4736275, -1660542, -2099702, 9541807, 9515500, 28307056, 4549981, 20849918, -1168231, 7067906, +-11283416, -8485782, 7502234, -14370424, -15982647, 573378, 5097590, -8179765, 6628745, -9584756, +2986613, -25296820, 14194867, 7964480, 11618423, 1488743, -10258529, -21187610, -7527467, -1846836, +17552994, -13289166, -7847442, 4937065, 40082784, -11020349, 40746892, -24922622, 9904731, -9161165, +17905718, -7038378, 30925376, -29000692, 44269300, -4138201, 9139690, 19185082, -32753420, 29286308, +-34988416, 23686744, -57039312, 30988726, -29301878, 26045756, -38240780, 33697240, 1174674, 21857088, +9482751, -17809618, 15566572, -12741557, 38717520, -17578228, 6405407, -23039278, 6287296, -1506997, +4275640, -8216273, 10771778, -10562398, 7640747, -3719442, 2484639, 3291556, 3449933, 4515621, +-2601140, -6064494, -4918275, -5810554, -13393319, 7785702, 2014877, -9194451, -4265440, -2759517, +6001680, -10240813, 9788230, -7838852, 1969243, -4192962, 4771172, 1609539, -73014, 14848776, +-13120051, 8042863, -12677133, 19139984, -3623342, 18697604, -7347079, 5847598, 8455180, 2835752, +2922725, -10201, 8956617, -13347685, 14645302, -10181757, 9639517, -17569100, -15916612, 18538690, +31975494, -26477936, 40533216, -2346663, 2684, -1552094, 7046431, -12053826, -8850317, -18061948, +-4028679, 582505, 52613, -92342, 15943455, 2728378, 17478906, 17095044, -10858214, 6289980, +36441724, 11898670, 7820062, 5460514, -31575526, 1605244, -5101348, -3965866, -28954522, -6136435, +16675211, 4694936, 5561446, 8364986, 21123186, 5493263, -6483790, -2175401, -1791001, 7898982, +-14330158, -8852464, 21814676, 13502303, 10174778, 16820702, 12470974, -7350300, -3643743, -25143812, +-11002632, 10197863, 8096550, 18946712, -13636521, -6833830, -4759361, 13919452, 8200167, 12491912, +5207111, -9940702, -9161165, 31337156, -9552544, -30508764, 7089381, 22016002, 15154255, -434865, +-2590939, 2688113, 5098126, 3080565, 28066000, -33782604, -28766080, 3310883, 11432666, -14565308, +-7441568, 2412698, -11375221, 5369783, -5528697, -1487669, 3073049, -2240899, -7617662, 233002, +6447283, -4161287, 133681, -11229192, -1881196, -9889699, 7304129, -3189013, 6707665, -4070019, +4224637, 1651952, 5680094, 8674760, -8782134, -4057670, -2556043, 6817187, -4207458, -8101382, +-14593762, -139586, -5767604, -2287607, 2341294, 1372779, 530428, 2783676, 4930086, -1051193, +14944876, 1721745, -1060320, -11585137, 2120103, -2229625, -506269, -12412992, -64105608, 17726940, +-7802882, -4062502, 15737834, -10860899, 16887274, -2265595, -27775016, -5060009, 2710661, 9760313, +12417824, 2893734, -19680078, 19492710, -7634841, -1767916, -12090870, -5437429, 10459319, -2084670, +9331353, 15717433, -3627637, -20288352, 4512937, 22272090, -20723754, 7631083, 17297980, -3141769, +-13703630, -25588342, -17255568, 18054432, 46277200, -14244259, -18444738, 52128556, -3394098, -7504382, +37528352, 21844204, 18653580, 15064598, 6195491, -11029476, 19072876, 17752710, 12245489, 5662915, +-34482144, 21545704, 19084688, -36420248, -21047488, -13086765, -10184978, -10035191, 39758512, 19840602, +-22707492, 21239688, -8395587, -21251498, 9271224, 10807748, -9371619, -9009768, -33319820, 3744675, +5710696, 24379844, 11698417, 3013993, 20405390, -16207059, 42193760, -44841068, -52284784, 36916316, +-22556094, -1407676, 25914758, -16327855, -11215770, -3238942, -3067681, 3209951, 15905338, 7791071, +-12995497, -810138, 6202470, -1569274, 8842801, -364535, 4894652, 937914, -6892886, 3689377, +14112189, 9692667, -603980, 1867774, 9439264, -1537061, -1112397, 2369211, 21845278, 11184095, +-3499862, 4749697, -19359566, -874026, 5115843, -8946417, -12002823, 11300059, -5188321, -365072, +11649025, -10142565, 4480725, -1760937, -2895882, 14420353, -8177081, -17141752, -69851200, 21368000, +39265128, -24485072, -5171141, -19061064, 40400072, 27138288, 17003776, -3321620, -14254996, 2816425, +16225850, 7505992, -7140920, -1642825, 22230214, -1563905, -8324721, -30012694, -14283987, 25142738, +14571750, -16016470, 12650826, -11625403, -3757023, 7473243, 7000797, -7043747, 4482872, -26327612, +7402376, 35355632, -4613332, -7012071, -34953516, -21048024, 16792786, -27590334, -15044197, 6181532, +6878390, -8609262, 22723062, 21443698, -22309670, 8176544, 12256226, 35617628, 32615982, -5289789, +10592463, -988379, 37305548, 16147466, 15060303, 35340064, -15949898, -23286776, -11984569, -29778618, +24892020, 11673721, 12099997, 6369437, 42322072, -28226526, -6680822, 17996450, -10143102, 19984482, +-1093069, 2222646, 9240085, -24669756, -37329172, 4553202, 7043210, 40787692, 31016644, 614180, +-30314952, -4913980, -33100240, -333397, -1166084, -9406515, -8572755, 4329864, -2974265, -2632815, +-8487929, -5589900, -7553774, -4585415, 1016834, -8990977, -8192113, -1503775, 8106214, 4041027, +-10847477, 9579388, -5559299, 17918066, -5789616, -16251083, -6025302, 7833484, -5117454, -12374875, +13809394, -3180960, -12846784, -19867982, 2915209, -3351148, 2188823, 4161287, -7691750, -6660958, +-17360258, -4023848, -4680441, 1010928, 3064996, 6142877, 5380521, -13336947, 16343424, 27683212, +24183350, 24907590, 32028644, -18237504, 25256018, -48977124, -21324512, 18702436, 4546223, 35976256, +16503412, 30696668, -13174275, 4161287, -26414048, 18129056, 29879014, 27166206, 2862059, 19284404, +-47017544, -30601106, 29408178, 8628589, -29252486, -15081241, 3733937, 43348032, 13494250, -17501992, +-22070226, 4499515, -6343130, 26694832, 28860032, -2746632, -4528506, 5793911, -8009577, 34492884, +10027138, -8075613, 7069516, -16291885, -9581535, -77009840, -26069378, 13822279, -11924977, -11460046, +-243203, -13831405, -13793287, 35409320, 23775328, -17722646, 32356136, 66867272, 13865228, 47648904, +6707665, 9740449, 35032976, 23125714, -18670222, -21254182, -37401112, -23260470, -2337536, -36958732, +13852880, -4392141, -35721244, -25646324, -25522306, -32169306, -19433116, -12891881, -17013976, 5131412, +30718142, 37405408, 19821810, -3827890, -27103392, -3419868, 1203665, 2373506, -13127568, -2322504, +-8817568, 7345468, 10667625, 1212255, 7854422, -202937, -5140002, 8971113, -9483288, 1256815, +8650601, 18329846, 2675765, -136365, 12502113, 5253819, 33258616, -8265128, -26756572, -1363652, +18346490, 3263102, -7152195, -8188355, -21713744, -20688320, -11546483, -8228621, -3626026, -12419435, +-17765596, -19087908, -10272488, -1538672, 2831994, 25296820, 18508088, -6786049, 29644938, 52326660, +36423472, 25478820, 16143708, 9997073, -12641162, -8347269, -12603582, -11652246, -454730, 30668214, +-3143379, 26079578, -16570521, 7086159, -57247084, 16365973, -8539469, 29709362, -7157563, -34163244, +34726420, -12790413, 5475547, 19851338, 14891188, 31813360, -4636954, 5012227, -5827734, 36245228, +-7468412, 7046431, 25294136, -28723668, 24944634, -7030862, 15335181, 24223616, -6269042, 5610301, +4214437, 2704756, -7546795, 10929081, 10580115, -3991098, -13907641, -2357937, -16244640, -5133023, +-2924873, 13711683, -6701223, -25924960, -17022566, 27828166, 28106266, -26103200, -21849036, 33274722, +39064340, -14756971, -3612604, 28225988, 1371705, 14643691, 20604568, -46760920, -13652627, -2940979, +45802068, 4430259, -2987150, -44548476, 9148280, 17850420, 11791833, 1844152, 12314745, 4883915, +6482180, 57365732, -1491427, 3244311, 33894808, -19903952, 22612466, 4423280, 17130478, 11237245, +-25642028, -8309151, 31096100, 20644298, 12085501, -7077033, 11054709, 5614596, 272194, 4327717, +8137353, -3517578, 13724568, -8609262, -2080375, 14093935, 8494372, 3036542, -28768764, 2837363, +14666776, -10694469, 5427228, -25597468, -16052977, 18351322, 9134322, 15126875, 13331578, -10070625, +-27949500, -7671886, 10033580, 24849608, 15327665, -3455838, -5076652, -8442832, 20642686, -178241, +-3692598, -8076149, 11134166, 4722317, -4016331, -20374788, -12597676, 13196824, 13409425, 9430138, +-13715978, -19694572, 10409390, 26356604, 12678207, 1924682, -12663711, -3056943, 6609418, -233002, +1020592, 1533303, -2685428, -6043019, 33007898, -55984360, -3893925, -47370804, -43910672, 10998874, +9220758, 8008504, 1068910, 41718628, 23753854, 53720376, 58784144, -6492917, -28964722, 6124624, +-7894687, -5392869, 12703440, 5680094, -4759898, -27089970, -29659970, 32080722, 14780593, -3657702, +4864051, 5214091, 2891050, 5909875, -3093450, -7681549, -43845172, 964757, 25052544, -7360500, +-33822868, -11060078, 27615566, -51386064, -17772038, 32517734, 19568408, 38833484, -1229971, 2857227, +-35903780, -36107792, -45645300, 38366944, 54154704, -71448928, -35755604, -3696356, 36169532, -28311888, +-4764730, 65614216, 26520886, 16689169, 43242268, 31769336, 47480864, -17139066, 47202764, -7144678, +-37321656, -54567024, -12985834, 21007222, -43465068, -8395587, 9133785, -9052180, -15432354, 9322763, +8165270, -29679298, 21986474, 10950556, 32035624, -7660611, -31799400, 39497592, 7748121, -35803384, +-19327, -8242042, 14741402, -15782394, -16545288, -8250632, -1906429, -394600, -12608950, -14848776, +11387569, -15493558, -380105, -15306190, 8240969, 14817100, 2057826, 22086332, 14801531, -21946210, +-8492761, 165356, -20148766, 3490198, -3634616, 8065412, -5513128, 7134478, 18928994, 229244, +3428995, -13289703, 20374788, 13327820, -14900852, -4103305, 14443975, 14047764, -2336999, -21055004, +-3056943, -41513008, 31920734, -2742337, 9736691, 12335146, 11941083, 359704, -14016089, 22631256, +5645735, 21843666, -4744865, -46437724, -4253628, 13365938, -15296526, -17021492, -10440529, -15691663, +18865644, -4890357, -16535624, -970126, 17548162, -23671712, 16520055, -8233989, 8772471, -23318988, +-5839545, 9408126, -2033667, -2177549, 2841658, 13042742, -2347737, -2143189, -16304770, 8085813, +-4497368, 2594160, 5005785, 1690607, 12036109, -17679696, -13516799, 18478560, 15923591, -22193706, +10550050, -17938468, 20645908, -17331804, 7772280, 5322002, -14687714, 32478006, 3133716, -36166308, +16637630, 4363150, -27986006, 15675557, -10289668, 16696685, -24266028, 12429098, -25702694, 11777874, +18249316, -16552267, 9466108, -17586280, 593242, 587337, 1659468, -11557757, 206158, 8794482, +-511101, -15874736, 11957189, -9947681, -21378736, 9200357, -9501005, 4650913, 9930501, -7560216, +-4584341, 1788317, -1418413, 6457484, -3404835, -2357937, 5746666, 7325604, 2445984, -7366406, +-4413079, 7074885, 4219806, -16670379, 15205258, -2183454, -5710696, 2123861, -1209033, 3600256, +8149164, -2015413, 15447924, -4563940, -6740415, -7536057, -3041911, 1488743, -7327751, 1949915, +-2499134, -2978023, 1851131, 2501819, -3056406, -69256, -874563, -3232500, 3147137, 2126546, +-3587372, 9670119, 20732344, -9463960, -110973368, -200787040, -66302484, -155467616, -153792576, 83845280, +17956184, 116351736, 262075680, 236206560, 193795904, 236546928, 145019040, 32918776, 46062988, -32902134, +-174462112, -172430592, -128863512, -167526272, -114657912, -23223426, -77175192, -106736376, -45950780, -12767864, +-55155432, -25900264, -431107, -27255862, -49018460, 11100343, 43574052, -13881871, 60214904, 89604296, +2846490, 17825188, 120952720, 60271812, 1391033, 113373176, 92836792, -20972862, 44311176, 105891344, +-1346472, 9254044, 149197504, 80427024, 33837364, 180249584, 198587472, 97966056, 188301568, 233979616, +61855584, 31953482, 95691872, -37376952, -112261320, -65275448, -146273168, -260020544, -259424080, -294641184, +-392551424, -395449440, -379395936, -388260736, -347292128, -297739488, -238337936, -156064624, -79091824, 38930120, +172355424, 227028752, 276987808, 374867968, 329790144, 294760928, 329285472, 243121456, 113817704, 133605696, +150991728, 55975236, 73049880, 151125936, 74445208, 14232985, 65090768, 58520540, -32891396, 121333, +40793064, -59744604, -76190576, 17442936, -15067282, -24873766, 84329536, 72316512, 7628399, 65733936, +95432024, 16763257, -7106561, 5338108, -97590248, -176729312, -184493536, -235586480, -296375840, -281000928, +-251261488, -229061888, -204137648, -150024288, -142177376, -155504656, -103988136, -34077880, 9470403, 38356204, +102005472, 122057064, 138254464, 247564064, 288730240, 266666464, 246146720, 195955200, 124162672, 106183936, +90483688, 55253144, 39558796, 36326832, 14534169, -3498788, -4943508, -10708964, -21847424, -27338004, +-22399328, -31034896, -42196980, -40799504, -39538932, -44727252, -42505680, -32320166, -25908316, -19180250, +-15596100, -14795625, 0, 0, 0, 0, 0, 0, }, }, { { -8479339, -937377, 5580773, 1907502, 3636764, -5305359, -2907156, 239444, -940061, 1421097, 4420058, --10628970, -74625, 3493419, 2098629, 3220152, -3077344, -4296041, 4645544, -78920, 1294933, -2895345, 3843996, 1417339, 802085, 3456912, -510564, -1107565, -2987687, 1609002, -840740, --486942, -1551020, 1986422, 5056787, 20401, -1050656, 2378875, -3234647, -4840965, -2675228, --981937, -3139084, 281857, -725850, 2031520, -1958505, 563714, -3927748, -379031, -3229816, --155156, -1479079, -1276679, 1644436, -1864553, -189515, 2657511, -1397475, 3169686, 3842385, -278636, 5193689, -2656974, -177167, 2482491, -898185, 1675037, 2360622, 1275068, -2731599, -1074816, 1250372, 878321, 166430, -2284923, 3031173, -818191, 1448478, -499290, -627602, -190589, -3153580, -260919, -2450279, -1142998, -107374, -427886, -83752, -244813, -1316944, -1567126, 183610, 438624, 110059, 875100, -534187, 1105417, -81068, 470299, -180926, --482110, 623844, 60130, -184684, -13959, 880468, 188442, -153545, 542777, 285615, --113817, 14093398, -3992172, 1350230, -3084860, -259846, -1294933, 1615445, 1084479, 4826470, -1474784, 836982, 1861332, -1179505, -9757629, -9336185, -2927020, 1236951, 2842732, -2376191, -518617, -3041911, -1095217, 142271, 1639067, -4147865, -4518843, -1342714, -301721, 2419140, -784905, -1023276, -3266860, 562104, -1806034, 79457, 2261300, -3311420, 1569811, 2918967, --2304787, -6068789, -1596654, 2188823, -376347, 1774895, -311385, 1534377, -297427, 1687385, -315680, -5666136, 1096827, 2298344, -908922, 1553168, 250182, -341450, -1135482, 42413, --3344706, -311385, -929324, -4218732, -723702, -147103, 3718368, -3708168, 6126234, 7128035, -5606543, -2452426, -1155883, -1313186, 2710124, -1050120, -1556926, 1688996, -4060892, -3693135, -434329, 3245922, -117038, -1666984, -3633542, -2151242, -2773475, -1469953, -2560338, 936303, --1539746, -422517, -1614908, -854699, 73551, 834297, 57445, 858993, -602906, 51540, -677531, 348966, 531502, 539555, 310311, -684510, 679142, -13308493, -86436, -2052458, -918049, -459562, -6890202, -1318018, -1455457, 2153389, 3347390, -4612795, 3682935, -1174674, -2536715, 2549063, -1388885, 5540508, 334471, 245887, -965831, 962610, -1379758, 1022739, --1549946, 206695, -3624416, 389231, 3986804, 537, 1676648, 4204236, -4138201, -4355634, -1813550, -1977833, 3358128, -3401077, -1031866, -7111929, -5489505, -4752382, 2069101, 613643, -2522757, -2583423, -1846299, -536334, 4457639, -4937602, 2033130, 862215, 360777, 2505040, --1730335, -2261300, -2979097, 1816771, 958851, -4367445, -4822712, -5598490, -170725, -1201517, -1816771, -252866, -1065689, 526134, 745177, 2507187, -6701223, 830539, 3802657, 5657009, -5798206, 4800700, -854162, -3535832, 5195837, 1592359, 1001264, -2595771, 1494649, 1078574, -149250, -640487, -1548873, -223338, 1770600, -1371705, -2284923, -926102, -989453, 388158, --200790, -549219, 1541893, 129386, 1971390, -178241, 559956, 1332514, 1234803, 977642, -693100, -783295, -886911, -276489, 774168, -144955, 755914, -530428, 1330366, 1135482, --1180042, 80531, 81068, -1899449, 1431298, -7771207, 4826470, -4118337, 5751498, 7489349, -4669167, -79457, 2223719, 512712, 6133750, -3341485, -3356517, 1761474, -931471, 2516314, -4721243, -6738804, 2146947, 6058588, 2857764, -433255, -47245, 738198, -2811593, -40265, --2656437, -3704409, -965831, 5740761, -2150705, 2669322, -1986422, -3500398, 6871948, -5985037, -4614406, 5047661, 1000191, 3201361, -4434554, -1211181, -1755031, -1398012, 3204583, 971200, --4769561, 779537, -460098, 907312, -1028108, 1721208, 1651415, 5724655, -5986648, 2885681, -2278480, -602369, 2263448, 633508, 3522410, 3295851, 2089502, -1934346, 2806761, 4954782, --124554, 2903935, -2097018, 5873905, 6062883, 6654515, -1912871, -4661114, 1504849, -650151, -2374043, 1712618, -25770, -353798, -6667400, -1745367, -1546725, -528818, -1367410, -2002529, -2289755, 876173, 723165, 2682744, -159451, 2712809, 1714229, 877247, -380105, 465467, --594316, -1140851, 803696, 200790, 1315871, -398358, 316754, -90731, -886911, 1475858, --55835, -1272921, 518617, 1195075, 140123, -1656784, 412317, -768262, 2273112, 1661079, -1657321, -190589, 512712, 1293322, 133681, 663572, 10902238, -999117, -3404299, 10370735, --4095251, 4660577, -2492155, -9903121, 1768453, -2844342, 315143, 11884175, -4597763, -5615133, -457414, 6252936, -10044318, -3717294, 7537668, -2637647, 2435783, 3576634, -2688650, 3257196, --2101850, -3464965, 700080, -964220, -1222455, -1271310, 4198868, -3348464, 8177618, 2058363, -174483, -4670777, -1393717, 5021891, -5742372, 1243393, 1985349, -873489, -8006893, 5498095, -1452236, 1370632, 705448, -1078037, 4125853, -2426120, 5642514, 3242164, -2201708, -9726490, -4334159, 2645163, -249108, -2733210, 2348810, 6327024, 6387690, -668941, 3775276, -5718212, -4170413, -985158, -1993939, 2522757, 4937602, -3439195, 4887136, 913217, -2081449, -1692754, -3983582, -3307662, 9474161, -4843650, 3913789, -3241090, 839129, -2891587, 3781182, -3364033, -154619, 2203318, -673236, 455267, -2947421, -957778, -420370, 57982, 782221, -1231582, -1628330, -120796, -1167157, 1721745, -3383897, -3349538, -1959579, 103616, -354872, -632434, -74088, -2267743, 2810519, 231391, -212064, 2035815, -1656247, -279173, 2211908, 1013612, -756988, 3615289, 3241090, 10240813, 1357210, -2577517, -13080323, 4052302, 7431367, 4449586, -2910377, -1096290, 3785477, 14248554, -1723893, 6589554, 651761, 3690988, 1410360, 271120, -2863133, -1180579, -6076305, -1689533, -4515085, -1165547, -6371584, 2313377, 195421, 7483444, -1473174, -3463354, 2478733, -1047435, -1817308, 4801237, 1729261, 3591667, 2100239, -2055679, --8324721, 528818, 4859756, -317291, -1586454, 2189360, -4392141, -1859721, -7752416, -9605694, -5000416, 5564667, 4350802, -1345399, -1562831, 87510, -144418, 2854543, -470836, 3125126, -2806761, -76236, 2892661, -2655901, 795643, -1393180, 1726577, 2107218, 9061307, 43487, -7420093, -2757906, -7579544, -670015, -999654, -2870649, 6090801, -462246, 2536715, 587337, --4293894, -5176510, -1801202, -1074279, 619012, 5375689, 1797444, 600759, 2304250, 3615826, --1470489, 2736431, -273804, 2334852, 1491964, 617402, 3241627, -306016, 1915019, 1107565, -1014149, -541703, -794032, -1821066, -795643, 1919850, 2940442, -669478, 303869, -1579474, --182536, 161598, -1560684, 1200443, -2982855, 169651, -96637, 44023, 4712116, -11611981, --382252, 11824045, 16256451, -6757594, 1824287, 2578591, -5650030, -3298535, 636729, -4715337, --4912906, 11376831, 1588064, -7554311, -1207423, -4932770, -2811056, 7396471, -2332167, -3288871, -6713571, 4142496, 6782827, -2892124, 1392106, 6615860, 286689, -3987877, 1808718, -586263, -820339, -8399345, -5725192, 2496987, -604517, 1985886, -7733089, 3615826, 2816425, 1795296, --13626857, -7984344, -3462281, -1714229, 1924682, -5966784, -3995930, 1322313, 10423349, 6864969, -3682935, -1861868, -1160715, -3959423, 2998424, -1155883, -7738458, -5911486, -731755, -130460, -10915659, 6047314, -5436355, -6060199, 7539278, 1502702, -4581657, 38118, 6761889, 2566780, -177167, -8837432, 9701794, -3428458, 6458557, 8500814, 8923331, 789737, -3331821, -2688113, -4569845, 5269388, -4639639, 3705483, 4967667, 3532611, -1557999, -1184337, 674847, 3038153, -2451890, -2637647, -4126390, -3847217, 1865626, -1844152, -1253057, -2668249, -571768, -1911261, -947040, -1576253, 1136019, 937914, -354872, 8053, 2147484, -1593433, -3306051, -583042, -2949569, -1799591, -1663763, -1702418, -1270237, -207232, -115964, -2010045, -112743, -1461363, --768262, 563714, 1949378, -1309965, -114890, -420370, -948651, 1841467, 2233920, -3149285, -4818954, -6154688, 7031935, -644245, -1900523, 3739306, -7095286, 2423972, 3869229, 777389, -2704756, 3349538, -1916092, 7834021, -3682398, -13369159, -7949448, -1758789, 528818, -2832531, --5706401, -6247030, -4234301, 13132399, -3638911, -1036161, 1902134, -2729452, 1574642, 10773389, --5175973, 5113696, -3352222, -6925635, 6213207, 4482335, 2871186, 9655623, 226023, 4547834, --412317, 1153199, -367757, -3171297, 2138357, -733903, 7005092, 1399086, -4807679, -1238561, --1378685, -329102, -7843147, 3159485, -7732015, 1884954, 10433012, -6793028, -13013751, 3026878, -1818919, 5977521, -2627446, -117575, 6110665, -3757023, 3002182, 4499515, 1276679, -2728378, -6034429, 1304060, 7744900, 1647120, -4783520, -4541391, 5039071, 8453569, 2987687, -70867, --6929930, -1396401, -2216203, 5019743, 1287953, -9482751, 1514513, 2529736, 717260, 972810, -3711389, -1656247, 1579474, -2577517, 1648194, 1497870, 1214939, 1959042, 874563, 1301912, -1202591, -2177549, 742493, -650688, -318364, 2170569, 930934, 1219771, 2454037, -714575, --7588134, 763967, -479426, 590558, -660351, -437013, 2158758, 1431298, -1194001, -1406602, --10411538, 23913842, -5627481, 10725070, 976568, 4457103, 3213709, -97711, -13458817, 11387032, --16770237, 5379984, 3977140, 15047418, -7108171, 6760816, -10684268, 6915971, -3483755, -11501386, --5534066, 2662880, 2895882, 4151086, 2090039, 5986648, 3902515, 9094056, -2873870, -7516193, --6782827, 2588255, -126165, -3731790, 6065568, 2629594, -1299765, 3606162, 7517804, -735513, -1909650, -1168768, 3692061, 2163053, -9735617, -4252018, -12741020, -2960306, -2206540, -332323, -6040335, 5383205, 754841, -3543348, -122943, -1948305, -3067681, 1655173, 17801028, 1566589, --446140, 5636608, -484258, 6463926, -2848637, 42950, -4297115, 17872432, 4166118, -7406134, --8485782, -5674189, 642635, -419833, -11515344, 602369, 2302639, 749472, 12439836, -3279208, -1776506, -7785165, -2604361, -21095268, -3707094, 1062468, 739271, -8123394, 2050847, -3921305, -2574296, 1197222, -3897683, -499290, 2699387, 4250407, 7883413, 2069101, -2965138, -2748242, --6470905, -2510945, 527744, 1044214, -3753802, -1430761, 3394098, 1208496, -1031329, -904628, --2803003, -2569464, -1312649, 708670, -5406290, -3790309, 919123, 2112587, -56908, -1393180, -1242319, 4349728, 650688, 332860, -449898, -1931662, 49929, -6254010, 12577812, 1133335, -10479720, 6379637, 10278394, 3477850, -10297721, 10199474, -6571300, 17609366, -11297375, -3309809, --15646029, -3268470, -1612223, 7027104, -7249368, 10289131, 8314520, -4929549, 636192, 11756936, -16540456, -5210332, 469762, -2113124, 5221070, 117038, -1874753, 2428267, 4572530, -7822209, -5979132, 1161789, 6847252, 2626909, 1090385, -13386876, -2115272, 15602006, -1810329, 5240934, -11989938, 3473555, -874563, -4139812, -5446556, -3267396, 598611, -5093295, -3018288, 9049496, -8397198, 2641405, 13910862, 9228274, -2849711, -1363115, 1950452, 3230352, -4182761, -11031087, -14464376, 6359236, -2905009, 13202193, 13844290, 15380815, 6718403, 2327872, -5521181, 396211, --7747048, -6250788, -3929895, -15413027, 6242735, -1953136, 13200582, -3119757, -10282152, -1948841, -1040456, -1537598, -13733158, 2196876, 3725347, 6266358, 6691022, -4667556, 2185065, -3192771, --8915815, 1746978, 3515968, -705985, -2605435, -6783364, 7137699, 3984119, -6280316, -7201587, --3977140, 4090956, -689342, -2070174, 1959579, -3223910, 2029372, -856309, 1266479, 3061775, --4535486, -2175938, 2088428, -1021665, 120259, 9139154, 3046743, 558346, -586800, 2123861, --3020436, -1801202, -261993, 2939368, 13697188, 780073, 2478196, -2090575, 1103807, -1789391, --20830054, 2383170, -233539, -3766150, -1584306, -10248866, 11695733, 12003897, 13415867, -21851182, -7011534, 4489852, 511101, 21503290, 8801462, -10730439, -1285806, 21231098, 2471754, 3771518, -4299263, -6264747, 3511136, 4362613, 13158169, 6680285, -10131828, -16618302, 6240588, 3919695, --8407935, -1589138, 766652, -10220948, 1120987, 12446278, 5264020, 6971269, 10077604, 16381005, -1505386, 14427332, 2806761, -5744519, -881542, -8555575, -4521527, 3567507, 4839892, 3732864, -7207492, -10283225, -4696547, 18394808, -1415729, -3962644, -10339060, 8720394, 7851200, 2732136, -3245922, -149787, 5014375, -8008504, 13080323, -6628745, -7905961, -6396817, -4458176, 17811766, -4735202, 3705483, -19459960, -10666014, -16013786, 1154809, -1785096, -1583769, -15201500, -21009906, --693100, 9430674, -5279052, 2682207, -1477469, -1446330, 5172215, -7322919, -3237869, -3343632, -6260989, 1049046, -4796942, -82678, -872952, -127238, -2343979, -4412542, 970126, 7015292, --3549254, -2316061, -4636417, -2057826, -3291556, -1556389, 2934000, -1044214, 4716948, -1612223, --1200443, -2794950, -2216203, 7378217, -918586, -504659, -3654480, -568546, 4200478, 1188095, --5541045, 1206886, 237834, 1553704, 19372450, 22798760, -5905580, 6365142, -1720134, -6738267, -1270237, -15365246, -9509058, -730144, -3132105, 30593588, -13841606, 3867618, -19523848, -2917357, -11838540, -5051956, -10887742, -11429982, -4206384, 4633196, 6009733, -818728, -1020592, -12840342, -2970507, 8892193, 4475356, 5429913, 1593433, 1944547, -7505456, -2500208, 4962298, 1779727, --54224, 508954, -9044664, 3955128, -9516574, -1592359, -291521, 2699924, -10562398, -1139240, -5114233, 7494181, -12029667, -6343667, 21240760, -8235063, -16823924, 14045617, -13697188, -4361003, --6085432, -2508261, -10526965, -7327751, -2248416, -10616622, -15118822, 24245090, 13361643, 10773389, -7363722, -9498857, -3738232, -6426345, 6781217, -11497627, 8056822, -6163815, 3436511, 8084202, -5261335, 1592359, -15570867, 15152108, -18591840, -4924717, -18026514, -7358890, 11785390, -748935, -6664179, 13542569, 4274030, -1442572, 2598455, -4813585, 212064, -1510218, -5197448, 6082748, --2192044, -2907693, 6971269, 3664144, -1920924, 418759, 265214, 1057099, -3226594, 3000572, -903554, 1589138, -3850975, 2526515, -1821603, 6601902, -3046743, 4647692, -1490354, -2388002, -6997039, -4787278, -2121177, -4289599, 2779381, 6922951, 3153043, -2056753, 3233037, -2882997, -3303904, 4798016, -5348308, -12776454, -1011465, 32073742, -14435922, 13919452, -28753732, 7852811, --18295486, -3464965, 10129680, -951872, 6475200, 10616622, 8456254, -12565464, 9286793, 1883343, -6849399, -2734821, 9524627, 8838506, -2014877, 1822140, 5700496, 6455336, -9281424, -3206193, --13508746, -1704565, 11787538, 279173, -5700496, 1182190, 4315369, 790274, -4963372, -9625022, -2367601, -6521371, 6126234, -6163815, 22774600, -2184528, -12499429, -14062260, 3085934, -7741142, -7117835, -15767362, -12382391, -16018617, 3600256, -13537200, -3293166, -19408958, 13763223, 2788508, -9235790, 5690832, -20959440, 1546188, -1942936, -7879655, -11747272, -3253438, -10014790, -12598213, --6992744, 5746666, 8184060, 11955041, -7008850, 1613297, 5129265, -17613660, 7975755, -12091407, --1173600, 9824738, 4132832, 3924526, 1759863, 20255602, -11728482, -4356708, -4514011, 5252745, --17429514, 1293322, -1491427, -257161, 11179263, 6452115, 5486284, 1921998, -4312147, 591632, --2182380, 8093329, -3245922, -1158031, -4702989, 9184788, 3635690, -3368328, 2461553, -8340290, -5575405, 2772938, 4366908, 600222, -1734630, 5089536, 9376987, 3099356, -4693326, -6412923, --2660195, 2267206, -6498286, -1597191, -9834938, -7243999, -3929895, -148713, -5452998, 3766686, --4318053, 9404368, -7629473, -312996, -139050, -26712550, -7680476, 30117384, 26656714, 15009300, --12801150, 13238700, 19954954, -13094282, 17636746, -14099304, 16289737, 3894999, -1017907, 5415954, --279710, 8607651, -12746926, -3572339, -5713917, 6574521, -12083354, -10844792, 17154100, -1574106, --3495567, 1687385, -16448651, -293668, 26630408, 14561013, 3085934, -177167, 5724655, 25210384, -10790568, 460635, 4298726, -6877854, -2923799, -5908802, 10859825, -5519570, 7272990, 1440962, -12958453, -15203110, -262530, -837519, 451508, -4226248, 7255811, 11668352, -2674154, -3212099, -11746736, 1427003, 1503775, 26579406, 4220342, 448824, -12087649, 5449240, -8978629, 12359305, --14139032, -12479027, 1973538, -12290049, -13191992, -20120312, 5461588, -6651294, 10474888, -3329674, -5928666, -29427506, 6058588, -9886478, -17870822, 9432285, 12403866, 6579890, 3863860, 2352032, -5223217, 8003135, -3787088, -4461934, -5403069, -237297, -5930276, 3847217, 813359, -8412230, --5865852, 5013838, 2940979, 511101, 8750996, -2923799, -886911, -6817724, -1449015, 180389, -3638374, 2424509, -5817533, -3433290, -1595044, -6898791, -1311576, -6467684, 2677912, 1940788, -7871065, 5507222, -541166, -3025268, 10737, 208843, -2229088, -326954, -8196408, -1299765, -3370476, 3808026, 1047972, -1218160, 7915088, 1486059, 22325776, -34360812, 14414447, 15025943, --24427626, -2493229, -20931524, -6908455, -18792092, -8500277, 21489868, -7360500, -1577327, -15117211, --2937221, 3468186, -22408992, -876710, 14305462, -27666568, 1008780, -18891950, -10204842, 374736, -2028835, -12513387, -10057740, -10486163, -3031710, -9016210, -591095, 4795868, -2731062, 7013145, --13507135, -8608725, 18015240, -8439611, 9749576, -10733123, 10143639, 9291088, 1571958, 2476049, -9446244, 443992, 13466870, 17059074, -3233037, 2523293, 25334402, 1502702, 13009993, -918586, --10107132, -19989852, 3338800, 13879187, -22072910, 288837, -12987981, -6815040, -28618440, 12357158, -18850074, -4933844, 9071508, -4632122, 20500416, 22713398, -1848983, -22491134, -21877490, 31169114, --24300388, 9093520, 3573950, 3239479, 23294292, -9928891, 37965900, -632971, -8644159, -9900436, --6882685, 6078453, -2411087, -2896419, -260919, 9816685, -2468533, -6167573, 8194798, -2960306, -4117800, -7550016, -4589710, 7189239, 522375, 10741713, -3574487, 4576825, -7932268, -2249489, --10843719, 2245194, 4372814, 5371931, 1007707, 5519033, 492311, -1677185, 5824513, -9146670, -6026376, -7756174, -2806761, 4727149, -9578851, -2398202, -5512591, -16001438, -4328254, 1065689, -5749888, -7808251, -4114579, -6864432, -2280091, 1694365, 6299107, 37312528, 42050952, -2485712, --31717260, 31323734, -34675420, 4884452, 14702747, 3642132, -3712999, -16000901, 18013630, -8068096, --6457484, -16294569, -9477919, -5083094, -20337744, -11193222, -9090835, -5090073, -3343095, 14119168, --207769, 12203076, 89657, -5280663, -17814450, -19519552, -4929549, -716723, -263067, -2967823, --7297150, -8435853, 9336722, 22472880, -12214350, 7737384, -7626788, -7864622, 8929237, -8712341, --14105746, 31550830, -3485903, 2896419, 1547799, -17637284, -3878356, -3703873, 8937827, -22783728, --10088878, 24089398, 3874061, -10249939, 13094282, 24482388, -13930190, -17253958, 8959839, -14627585, -236760, -27371290, 8833674, 23261006, -2381559, 12128451, 7086159, 4061429, 26692148, 8369281, --118112, 15381888, -2233383, -2143726, 9421011, 10084046, -38708928, 3528316, -16833588, 13677860, --629213, 514859, 9630927, -2925410, -3694746, -5104569, 5189394, 1964411, -3782256, 5158256, --5534602, 549219, -2935073, -7483981, 3441880, -3753802, 8373576, 4589173, -127775, 25770, -2308545, -2232846, 4964446, 2416456, 1562294, 2011118, -1388348, 1821066, -3331821, -6501507, --3545496, -1697586, 909996, -8453569, 6887517, 4603668, 360240, 2496450, -5651103, 7899519, -983548, -4712653, 2892661, 3402151, -10095321, -2105608, 1034013, -824097, 164283, 1833951, -1286343, -51167020, -35837208, 14963666, -15180025, -14304389, -43524124, -12553653, 9295920, 3608846, --8563091, -24197308, -299037, 12287365, -884763, 1682554, 12729209, 22596896, -19572702, 51424716, --13217762, -17052630, -5182415, -2871186, 246961, -20328080, 478889, -3563749, 10873783, -6852621, -15384036, -6345814, -13066364, 5382131, 6350646, -11662984, 12764106, -39139500, 324270, -3115462, -15641734, 18913426, -13676786, 17638894, -6753299, 5057324, -8413841, -2807835, -5170604, 14117021, --1877438, 18581102, 29010356, -25224342, -7048578, 13628468, -17000018, 10309532, -19313394, -10647224, --9612674, -11304354, -19717122, -10103911, 9193377, 7514582, 15129022, 19638202, 14263586, -23775866, -2971581, 4405563, 5657546, 4808753, 15197205, -7438347, -16086263, 9207336, -4192962, -12568685, -2443837, -21533892, -8922795, -18758806, 1702418, 11055783, -6848862, 10625749, 5686000, -642635, --4093641, -317828, -16738561, -6277095, 5515275, 2779918, 3625489, 1151588, 1848983, 1487669, -5165772, 1401233, -11257646, -1582696, 1655710, -1144609, 2864206, -5158256, -4743255, -10989748, -2778844, 9690520, -11067594, -7770133, 5616744, -2814277, -11296301, 7384660, -5532992, -4531728, -6666863, -536871, -2168422, -3473018, -5060009, -6700149, -7123740, -1864016, -6076305, -3629247, --3169686, 4789426, -417686, 7146289, -10640781, -34854732, 26303454, -44617196, 31354336, -4498978, --19958714, -17031156, -19010062, -12875238, -10023917, 953483, 22985054, -1867237, -19275814, 20467130, -29008746, -44532368, -11896523, 3098819, -3690451, -6953552, -2237141, -6185827, -7921531, -12952011, -16510928, -5801964, -12371116, -21195664, -21068426, 20738786, 5392332, -3808026, -2306934, 8053, --4658429, -5661304, 4558034, -18649284, 10139881, 21198348, 15819438, 9865003, 20236276, 23552526, --13566191, 5007932, -19520090, 21068962, -12089796, -3485366, -145492, -30772904, 9953050, 25303800, -4279935, -10429254, -8496519, 33086280, -13367012, -14317810, 9251896, -33792264, -3987877, -16774532, -682900, -33043330, 13756780, 5714454, 13480829, -53601728, -45995880, 7486128, -16103980, -10798085, --6702297, -35908612, 11828877, -21240760, -23189602, 17428978, -15624017, -9220221, 7394323, -3787088, --7060926, -1319629, -1997697, 7485055, -17749490, -8377871, -17128330, 13422, -7558606, 3406983, --2505040, -13517336, -5593121, 4734665, -938987, 955093, 3543885, -14799384, 1822677, -18745922, -8562017, 2822867, -13659607, 4312684, -16235513, -3502546, -5988258, 1199907, 8498130, -6395743, -8795019, -4743255, 15023796, -6919729, 9412421, -5304285, -1753957, -493384, -1913945, 3059091, --1639604, -11811, -1317481, -3433290, -51003, 5417028, -1598802, -2336999, -1972464, 1732482, --2006824, -2037425, -1535451, -967978, 375810, -964757, -751619, -862752, -1945620, -807454, -933082, -42413, 3280281, 39715024, -54683524, 56120728, 16663399, -1654099, 4861366, -40119288, -8587787, 19184546, -6839199, 47834124, -13303661, 20818780, -16494822, 52669184, -1612223, -6844031, --19772418, -7119445, 7944079, -5071820, 21562884, 16727287, -5280126, 1628866, -20329154, 8076686, -21366388, 21538188, -22936736, 9931038, -4294431, 22979686, -5872294, 15006079, -13456669, -10604274, --30691836, 2272575, -19334870, -28843390, 41489920, -18101140, -3326989, -7693360, -9575630, 5721434, -3720516, 14705968, -6568079, 22509924, 2418067, 40734008, 15912317, 45071388, 38515120, -3691525, -25861072, 19622632, -6400575, 23061290, 31538482, -13302587, -30837328, 17842368, 11838004, 25603374, -13432510, -2429878, 24159, -33253784, -2823941, -9753871, -11756936, 44394392, -4734665, -440234, -55413132, 36870148, 20185810, 24641838, 13016435, 1612223, 6663642, 31982474, 763430, -8349417, -9858024, 26874148, 13016435, 15327128, 7960185, 18598282, -594853, 5364951, 7328825, 13024488, -4853313, 3314641, 2747169, 1483374, 10950019, 15821586, 7155953, 20906828, 1950452, 12904229, -13246753, 23567560, 92342, 16132971, 14777909, 3060164, 12545063, 672162, 3165391, -3989488, -5475547, 6553047, 3746285, 3393561, 1370632, -2818036, 1196148, 5516886, -2384244, 2996277, -11260867, -2362232, 17067664, -38375532, 73679088, -9994926, -8200167, -4698158, 53602804, -32916092, -26883810, -36037996, 34144992, 6917045, -6666863, 879931, 19994684, -8586713, 18639622, -8656507, --177704, 37667400, 11534672, -9630390, -164819, 9415105, 7364259, -36509908, 9710921, -13285944, --3358128, -19226958, 18564996, 17721572, 2698850, 8419210, 31372588, -10398653, -50119048, 12005507, -32687386, -12658879, -32999308, 8791261, 23365158, 7998303, -99858, -39355860, -19039590, -23272280, -21762062, 8961986, 22413286, -47374028, 2867965, -8662412, -52623548, -13493177, 7519951, 23863376, -32824288, -17457968, 61477624, 12139725, 838592, -12582644, -25145422, -17078938, 11374147, -28434830, -57898308, -18456548, 2108829, 34593276, -22965728, 21188684, -22450868, -12490302, 47940424, -24234352, -31312996, 29386704, 10256382, 13510357, -42163692, -4777078, -2570538, -14386530, 19293530, 18006114, -6803228, 5667210, 18742700, -4291746, 7047505, -2029909, 5281736, -7948911, 6338835, -1124208, -5269925, 4757750, 783295, -13935558, -2941516, 2284386, -5636608, -1347009, 9628780, 5987722, -16208133, -7249368, 2957085, -27074400, -23654532, -2947958, -2015413, 16746077, 11667279, -7383049, --6383395, -21480742, -718333, 7984344, -4198331, 413391, 4560719, -6441377, 4235375, -15681999, -214748, -4942434, -7036767, 11146514, -43320652, 24714852, 15812459, 24719684, -9877351, -7035694, -10007811, 59593, 2843805, 912681, 4881767, 1155346, -6820945, 31977642, -7473780, -22071836, -9319005, -594853, -19432580, 6747394, 4478577, 13187697, -8972187, -14712947, 15789910, -12723304, --1750199, -3801583, 12956306, -22390202, 7619809, -13896904, 11320997, -19726248, 6985228, -6626598, -3370476, 43184284, -29735132, 5614059, 9480603, -26796300, 9688909, 12326019, -19873350, -4152160, --7632157, 35913444, 2992519, -41576356, 24846922, -33611876, 6072547, 17374216, -16162499, 19876034, --24112484, -19866372, 27282170, -4663261, 11569568, -40963252, 7625178, 8835285, -2219961, -6332393, --388695, 16602196, 577673, -54469312, 32937030, -3445638, 12617540, -14319958, -16703665, 51912732, --1438277, -33228014, 2820720, 16754667, 3774203, -50507204, 1737314, 46821048, -8635569, -21681532, -5067525, 22641994, -3090229, 61740, -4053912, -2356863, 3173444, -8210904, -4859219, 15370077, --6752763, -435402, -9125195, 9010305, 13653701, -2476586, -2140504, 14525043, 4683125, -10004053, --2458332, 6251862, 4112431, -8499740, 4467840, 9991168, -8431021, 2136209, 2420751, 6434935, --15626165, 977642, 9657771, 3666828, -10916733, 600222, 7575249, 1255204, -8127152, -5432060, -20485920, -7113540, -107075680, -227823856, -90900832, -171527568, -208907216, 73983496, -857383, 75884016, -288629856, 252064112, 143390704, 276215776, 154007856, 17377438, 95428808, 58706836, -104518568, -73883104, --21790516, -115852984, -140099680, -46664284, -70968968, -110911088, -27918898, -5094368, -141215296, -97320736, --14810121, -85860152, -111140872, -32447942, -54588496, -120822264, -23268522, 12206297, -67799816, -51719996, -50965692, -18460844, -72706280, 15149960, 47976396, -35919348, 29376502, 105641160, -15632607, -28304908, -104542192, 55764780, -26240640, 173695456, 236126032, 146938880, 248988384, 372514848, 286524800, 272667072, -398497792, 345453344, 254232000, 311948832, 283574688, 180363936, 159536016, 85826328, -29753386, -124581968, --222852432, -316567552, -376702976, -472311104, -504623776, -532122816, -602827648, -602401344, -455308416, -465896032, --424299808, -191122816, -147904720, -143854560, 63703492, 121643136, 2567317, 126785824, 175977696, 60209536, -83857088, 165034656, 123339112, 71798968, 116486496, 144235744, 61284888, 89785216, 179014240, 106449688, -70076152, 164971312, 123714384, 49942416, 107213656, 122490856, 15721191, 63251448, 147455360, 84536768, -101431024, 207883392, 195565424, 206089712, 266861344, 268735552, 215572992, 203900896, 174033680, 106267152, -76625440, 40767828, -6388764, -41973104, -113781200, -155447744, -210108720, -279958848, -311737856, -352222752, --410007232, -390456000, -350705024, -309728896, -226481680, -148488832, -78776144, -29069950, 12165495, 25860534, -31632972, 40833328, 43250320, 36562520, 39009040, 43104828, 41725072, 46758772, 60379188, 67723584, -72143104, 80195096, 81867984, 80804440, 77153720, 57716844, 36150740, 23155780, 19529216, 19545322, -0, 0, 0, 0, 0, 0, 0, 0, }, +937377, 5580773, 1907502, 3636764, -5305359, -2907156, 239444, -940061, 1421097, 4420058, +-10628970, -74625, 3493419, 2098629, 3220152, -3077344, -4296041, 4645544, -78920, 1294933, +2895345, 3843996, 1417339, 802085, 3456912, -510564, -1107565, -2987687, 1609002, -840740, +-486942, -1551020, 1986422, 5056787, 20401, -1050656, 2378875, -3234647, -4840965, -2675228, +-981937, -3139084, 281857, -725850, 2031520, -1958505, 563714, -3927748, -379031, -3229816, +-155156, -1479079, -1276679, 1644436, -1864553, -189515, 2657511, -1397475, 3169686, 3842385, +278636, 5193689, -2656974, -177167, 2482491, -898185, 1675037, 2360622, 1275068, -2731599, +1074816, 1250372, 878321, 166430, -2284923, 3031173, -818191, 1448478, -499290, -627602, +190589, -3153580, -260919, -2450279, -1142998, -107374, -427886, -83752, -244813, -1316944, +1567126, 183610, 438624, 110059, 875100, -534187, 1105417, -81068, 470299, -180926, +-482110, 623844, 60130, -184684, -13959, 880468, 188442, -153545, 542777, 285615, +-113817, 14093398, -3992172, 1350230, -3084860, -259846, -1294933, 1615445, 1084479, 4826470, +1474784, 836982, 1861332, -1179505, -9757629, -9336185, -2927020, 1236951, 2842732, -2376191, +518617, -3041911, -1095217, 142271, 1639067, -4147865, -4518843, -1342714, -301721, 2419140, +784905, -1023276, -3266860, 562104, -1806034, 79457, 2261300, -3311420, 1569811, 2918967, +-2304787, -6068789, -1596654, 2188823, -376347, 1774895, -311385, 1534377, -297427, 1687385, +315680, -5666136, 1096827, 2298344, -908922, 1553168, 250182, -341450, -1135482, 42413, +-3344706, -311385, -929324, -4218732, -723702, -147103, 3718368, -3708168, 6126234, 7128035, +5606543, -2452426, -1155883, -1313186, 2710124, -1050120, -1556926, 1688996, -4060892, -3693135, +434329, 3245922, -117038, -1666984, -3633542, -2151242, -2773475, -1469953, -2560338, 936303, +-1539746, -422517, -1614908, -854699, 73551, 834297, 57445, 858993, -602906, 51540, +677531, 348966, 531502, 539555, 310311, -684510, 679142, -13308493, -86436, -2052458, +918049, -459562, -6890202, -1318018, -1455457, 2153389, 3347390, -4612795, 3682935, -1174674, +2536715, 2549063, -1388885, 5540508, 334471, 245887, -965831, 962610, -1379758, 1022739, +-1549946, 206695, -3624416, 389231, 3986804, 537, 1676648, 4204236, -4138201, -4355634, +1813550, -1977833, 3358128, -3401077, -1031866, -7111929, -5489505, -4752382, 2069101, 613643, +2522757, -2583423, -1846299, -536334, 4457639, -4937602, 2033130, 862215, 360777, 2505040, +-1730335, -2261300, -2979097, 1816771, 958851, -4367445, -4822712, -5598490, -170725, -1201517, +1816771, -252866, -1065689, 526134, 745177, 2507187, -6701223, 830539, 3802657, 5657009, +5798206, 4800700, -854162, -3535832, 5195837, 1592359, 1001264, -2595771, 1494649, 1078574, +149250, -640487, -1548873, -223338, 1770600, -1371705, -2284923, -926102, -989453, 388158, +-200790, -549219, 1541893, 129386, 1971390, -178241, 559956, 1332514, 1234803, 977642, +693100, -783295, -886911, -276489, 774168, -144955, 755914, -530428, 1330366, 1135482, +-1180042, 80531, 81068, -1899449, 1431298, -7771207, 4826470, -4118337, 5751498, 7489349, +4669167, -79457, 2223719, 512712, 6133750, -3341485, -3356517, 1761474, -931471, 2516314, +4721243, -6738804, 2146947, 6058588, 2857764, -433255, -47245, 738198, -2811593, -40265, +-2656437, -3704409, -965831, 5740761, -2150705, 2669322, -1986422, -3500398, 6871948, -5985037, +4614406, 5047661, 1000191, 3201361, -4434554, -1211181, -1755031, -1398012, 3204583, 971200, +-4769561, 779537, -460098, 907312, -1028108, 1721208, 1651415, 5724655, -5986648, 2885681, +2278480, -602369, 2263448, 633508, 3522410, 3295851, 2089502, -1934346, 2806761, 4954782, +-124554, 2903935, -2097018, 5873905, 6062883, 6654515, -1912871, -4661114, 1504849, -650151, +2374043, 1712618, -25770, -353798, -6667400, -1745367, -1546725, -528818, -1367410, -2002529, +2289755, 876173, 723165, 2682744, -159451, 2712809, 1714229, 877247, -380105, 465467, +-594316, -1140851, 803696, 200790, 1315871, -398358, 316754, -90731, -886911, 1475858, +-55835, -1272921, 518617, 1195075, 140123, -1656784, 412317, -768262, 2273112, 1661079, +1657321, -190589, 512712, 1293322, 133681, 663572, 10902238, -999117, -3404299, 10370735, +-4095251, 4660577, -2492155, -9903121, 1768453, -2844342, 315143, 11884175, -4597763, -5615133, +457414, 6252936, -10044318, -3717294, 7537668, -2637647, 2435783, 3576634, -2688650, 3257196, +-2101850, -3464965, 700080, -964220, -1222455, -1271310, 4198868, -3348464, 8177618, 2058363, +174483, -4670777, -1393717, 5021891, -5742372, 1243393, 1985349, -873489, -8006893, 5498095, +1452236, 1370632, 705448, -1078037, 4125853, -2426120, 5642514, 3242164, -2201708, -9726490, +4334159, 2645163, -249108, -2733210, 2348810, 6327024, 6387690, -668941, 3775276, -5718212, +4170413, -985158, -1993939, 2522757, 4937602, -3439195, 4887136, 913217, -2081449, -1692754, +3983582, -3307662, 9474161, -4843650, 3913789, -3241090, 839129, -2891587, 3781182, -3364033, +154619, 2203318, -673236, 455267, -2947421, -957778, -420370, 57982, 782221, -1231582, +1628330, -120796, -1167157, 1721745, -3383897, -3349538, -1959579, 103616, -354872, -632434, +74088, -2267743, 2810519, 231391, -212064, 2035815, -1656247, -279173, 2211908, 1013612, +756988, 3615289, 3241090, 10240813, 1357210, -2577517, -13080323, 4052302, 7431367, 4449586, +2910377, -1096290, 3785477, 14248554, -1723893, 6589554, 651761, 3690988, 1410360, 271120, +2863133, -1180579, -6076305, -1689533, -4515085, -1165547, -6371584, 2313377, 195421, 7483444, +1473174, -3463354, 2478733, -1047435, -1817308, 4801237, 1729261, 3591667, 2100239, -2055679, +-8324721, 528818, 4859756, -317291, -1586454, 2189360, -4392141, -1859721, -7752416, -9605694, +5000416, 5564667, 4350802, -1345399, -1562831, 87510, -144418, 2854543, -470836, 3125126, +2806761, -76236, 2892661, -2655901, 795643, -1393180, 1726577, 2107218, 9061307, 43487, +7420093, -2757906, -7579544, -670015, -999654, -2870649, 6090801, -462246, 2536715, 587337, +-4293894, -5176510, -1801202, -1074279, 619012, 5375689, 1797444, 600759, 2304250, 3615826, +-1470489, 2736431, -273804, 2334852, 1491964, 617402, 3241627, -306016, 1915019, 1107565, +1014149, -541703, -794032, -1821066, -795643, 1919850, 2940442, -669478, 303869, -1579474, +-182536, 161598, -1560684, 1200443, -2982855, 169651, -96637, 44023, 4712116, -11611981, +-382252, 11824045, 16256451, -6757594, 1824287, 2578591, -5650030, -3298535, 636729, -4715337, +-4912906, 11376831, 1588064, -7554311, -1207423, -4932770, -2811056, 7396471, -2332167, -3288871, +6713571, 4142496, 6782827, -2892124, 1392106, 6615860, 286689, -3987877, 1808718, -586263, +820339, -8399345, -5725192, 2496987, -604517, 1985886, -7733089, 3615826, 2816425, 1795296, +-13626857, -7984344, -3462281, -1714229, 1924682, -5966784, -3995930, 1322313, 10423349, 6864969, +3682935, -1861868, -1160715, -3959423, 2998424, -1155883, -7738458, -5911486, -731755, -130460, +10915659, 6047314, -5436355, -6060199, 7539278, 1502702, -4581657, 38118, 6761889, 2566780, +177167, -8837432, 9701794, -3428458, 6458557, 8500814, 8923331, 789737, -3331821, -2688113, +4569845, 5269388, -4639639, 3705483, 4967667, 3532611, -1557999, -1184337, 674847, 3038153, +2451890, -2637647, -4126390, -3847217, 1865626, -1844152, -1253057, -2668249, -571768, -1911261, +947040, -1576253, 1136019, 937914, -354872, 8053, 2147484, -1593433, -3306051, -583042, +2949569, -1799591, -1663763, -1702418, -1270237, -207232, -115964, -2010045, -112743, -1461363, +-768262, 563714, 1949378, -1309965, -114890, -420370, -948651, 1841467, 2233920, -3149285, +4818954, -6154688, 7031935, -644245, -1900523, 3739306, -7095286, 2423972, 3869229, 777389, +2704756, 3349538, -1916092, 7834021, -3682398, -13369159, -7949448, -1758789, 528818, -2832531, +-5706401, -6247030, -4234301, 13132399, -3638911, -1036161, 1902134, -2729452, 1574642, 10773389, +-5175973, 5113696, -3352222, -6925635, 6213207, 4482335, 2871186, 9655623, 226023, 4547834, +-412317, 1153199, -367757, -3171297, 2138357, -733903, 7005092, 1399086, -4807679, -1238561, +-1378685, -329102, -7843147, 3159485, -7732015, 1884954, 10433012, -6793028, -13013751, 3026878, +1818919, 5977521, -2627446, -117575, 6110665, -3757023, 3002182, 4499515, 1276679, -2728378, +6034429, 1304060, 7744900, 1647120, -4783520, -4541391, 5039071, 8453569, 2987687, -70867, +-6929930, -1396401, -2216203, 5019743, 1287953, -9482751, 1514513, 2529736, 717260, 972810, +3711389, -1656247, 1579474, -2577517, 1648194, 1497870, 1214939, 1959042, 874563, 1301912, +1202591, -2177549, 742493, -650688, -318364, 2170569, 930934, 1219771, 2454037, -714575, +-7588134, 763967, -479426, 590558, -660351, -437013, 2158758, 1431298, -1194001, -1406602, +-10411538, 23913842, -5627481, 10725070, 976568, 4457103, 3213709, -97711, -13458817, 11387032, +-16770237, 5379984, 3977140, 15047418, -7108171, 6760816, -10684268, 6915971, -3483755, -11501386, +-5534066, 2662880, 2895882, 4151086, 2090039, 5986648, 3902515, 9094056, -2873870, -7516193, +-6782827, 2588255, -126165, -3731790, 6065568, 2629594, -1299765, 3606162, 7517804, -735513, +1909650, -1168768, 3692061, 2163053, -9735617, -4252018, -12741020, -2960306, -2206540, -332323, +6040335, 5383205, 754841, -3543348, -122943, -1948305, -3067681, 1655173, 17801028, 1566589, +-446140, 5636608, -484258, 6463926, -2848637, 42950, -4297115, 17872432, 4166118, -7406134, +-8485782, -5674189, 642635, -419833, -11515344, 602369, 2302639, 749472, 12439836, -3279208, +1776506, -7785165, -2604361, -21095268, -3707094, 1062468, 739271, -8123394, 2050847, -3921305, +2574296, 1197222, -3897683, -499290, 2699387, 4250407, 7883413, 2069101, -2965138, -2748242, +-6470905, -2510945, 527744, 1044214, -3753802, -1430761, 3394098, 1208496, -1031329, -904628, +-2803003, -2569464, -1312649, 708670, -5406290, -3790309, 919123, 2112587, -56908, -1393180, +1242319, 4349728, 650688, 332860, -449898, -1931662, 49929, -6254010, 12577812, 1133335, +10479720, 6379637, 10278394, 3477850, -10297721, 10199474, -6571300, 17609366, -11297375, -3309809, +-15646029, -3268470, -1612223, 7027104, -7249368, 10289131, 8314520, -4929549, 636192, 11756936, +16540456, -5210332, 469762, -2113124, 5221070, 117038, -1874753, 2428267, 4572530, -7822209, +5979132, 1161789, 6847252, 2626909, 1090385, -13386876, -2115272, 15602006, -1810329, 5240934, +11989938, 3473555, -874563, -4139812, -5446556, -3267396, 598611, -5093295, -3018288, 9049496, +8397198, 2641405, 13910862, 9228274, -2849711, -1363115, 1950452, 3230352, -4182761, -11031087, +14464376, 6359236, -2905009, 13202193, 13844290, 15380815, 6718403, 2327872, -5521181, 396211, +-7747048, -6250788, -3929895, -15413027, 6242735, -1953136, 13200582, -3119757, -10282152, -1948841, +1040456, -1537598, -13733158, 2196876, 3725347, 6266358, 6691022, -4667556, 2185065, -3192771, +-8915815, 1746978, 3515968, -705985, -2605435, -6783364, 7137699, 3984119, -6280316, -7201587, +-3977140, 4090956, -689342, -2070174, 1959579, -3223910, 2029372, -856309, 1266479, 3061775, +-4535486, -2175938, 2088428, -1021665, 120259, 9139154, 3046743, 558346, -586800, 2123861, +-3020436, -1801202, -261993, 2939368, 13697188, 780073, 2478196, -2090575, 1103807, -1789391, +-20830054, 2383170, -233539, -3766150, -1584306, -10248866, 11695733, 12003897, 13415867, -21851182, +7011534, 4489852, 511101, 21503290, 8801462, -10730439, -1285806, 21231098, 2471754, 3771518, +4299263, -6264747, 3511136, 4362613, 13158169, 6680285, -10131828, -16618302, 6240588, 3919695, +-8407935, -1589138, 766652, -10220948, 1120987, 12446278, 5264020, 6971269, 10077604, 16381005, +1505386, 14427332, 2806761, -5744519, -881542, -8555575, -4521527, 3567507, 4839892, 3732864, +7207492, -10283225, -4696547, 18394808, -1415729, -3962644, -10339060, 8720394, 7851200, 2732136, +3245922, -149787, 5014375, -8008504, 13080323, -6628745, -7905961, -6396817, -4458176, 17811766, +4735202, 3705483, -19459960, -10666014, -16013786, 1154809, -1785096, -1583769, -15201500, -21009906, +-693100, 9430674, -5279052, 2682207, -1477469, -1446330, 5172215, -7322919, -3237869, -3343632, +6260989, 1049046, -4796942, -82678, -872952, -127238, -2343979, -4412542, 970126, 7015292, +-3549254, -2316061, -4636417, -2057826, -3291556, -1556389, 2934000, -1044214, 4716948, -1612223, +-1200443, -2794950, -2216203, 7378217, -918586, -504659, -3654480, -568546, 4200478, 1188095, +-5541045, 1206886, 237834, 1553704, 19372450, 22798760, -5905580, 6365142, -1720134, -6738267, +1270237, -15365246, -9509058, -730144, -3132105, 30593588, -13841606, 3867618, -19523848, -2917357, +11838540, -5051956, -10887742, -11429982, -4206384, 4633196, 6009733, -818728, -1020592, -12840342, +2970507, 8892193, 4475356, 5429913, 1593433, 1944547, -7505456, -2500208, 4962298, 1779727, +-54224, 508954, -9044664, 3955128, -9516574, -1592359, -291521, 2699924, -10562398, -1139240, +5114233, 7494181, -12029667, -6343667, 21240760, -8235063, -16823924, 14045617, -13697188, -4361003, +-6085432, -2508261, -10526965, -7327751, -2248416, -10616622, -15118822, 24245090, 13361643, 10773389, +7363722, -9498857, -3738232, -6426345, 6781217, -11497627, 8056822, -6163815, 3436511, 8084202, +5261335, 1592359, -15570867, 15152108, -18591840, -4924717, -18026514, -7358890, 11785390, -748935, +6664179, 13542569, 4274030, -1442572, 2598455, -4813585, 212064, -1510218, -5197448, 6082748, +-2192044, -2907693, 6971269, 3664144, -1920924, 418759, 265214, 1057099, -3226594, 3000572, +903554, 1589138, -3850975, 2526515, -1821603, 6601902, -3046743, 4647692, -1490354, -2388002, +6997039, -4787278, -2121177, -4289599, 2779381, 6922951, 3153043, -2056753, 3233037, -2882997, +3303904, 4798016, -5348308, -12776454, -1011465, 32073742, -14435922, 13919452, -28753732, 7852811, +-18295486, -3464965, 10129680, -951872, 6475200, 10616622, 8456254, -12565464, 9286793, 1883343, +6849399, -2734821, 9524627, 8838506, -2014877, 1822140, 5700496, 6455336, -9281424, -3206193, +-13508746, -1704565, 11787538, 279173, -5700496, 1182190, 4315369, 790274, -4963372, -9625022, +2367601, -6521371, 6126234, -6163815, 22774600, -2184528, -12499429, -14062260, 3085934, -7741142, +7117835, -15767362, -12382391, -16018617, 3600256, -13537200, -3293166, -19408958, 13763223, 2788508, +9235790, 5690832, -20959440, 1546188, -1942936, -7879655, -11747272, -3253438, -10014790, -12598213, +-6992744, 5746666, 8184060, 11955041, -7008850, 1613297, 5129265, -17613660, 7975755, -12091407, +-1173600, 9824738, 4132832, 3924526, 1759863, 20255602, -11728482, -4356708, -4514011, 5252745, +-17429514, 1293322, -1491427, -257161, 11179263, 6452115, 5486284, 1921998, -4312147, 591632, +-2182380, 8093329, -3245922, -1158031, -4702989, 9184788, 3635690, -3368328, 2461553, -8340290, +5575405, 2772938, 4366908, 600222, -1734630, 5089536, 9376987, 3099356, -4693326, -6412923, +-2660195, 2267206, -6498286, -1597191, -9834938, -7243999, -3929895, -148713, -5452998, 3766686, +-4318053, 9404368, -7629473, -312996, -139050, -26712550, -7680476, 30117384, 26656714, 15009300, +-12801150, 13238700, 19954954, -13094282, 17636746, -14099304, 16289737, 3894999, -1017907, 5415954, +-279710, 8607651, -12746926, -3572339, -5713917, 6574521, -12083354, -10844792, 17154100, -1574106, +-3495567, 1687385, -16448651, -293668, 26630408, 14561013, 3085934, -177167, 5724655, 25210384, +10790568, 460635, 4298726, -6877854, -2923799, -5908802, 10859825, -5519570, 7272990, 1440962, +12958453, -15203110, -262530, -837519, 451508, -4226248, 7255811, 11668352, -2674154, -3212099, +11746736, 1427003, 1503775, 26579406, 4220342, 448824, -12087649, 5449240, -8978629, 12359305, +-14139032, -12479027, 1973538, -12290049, -13191992, -20120312, 5461588, -6651294, 10474888, -3329674, +5928666, -29427506, 6058588, -9886478, -17870822, 9432285, 12403866, 6579890, 3863860, 2352032, +5223217, 8003135, -3787088, -4461934, -5403069, -237297, -5930276, 3847217, 813359, -8412230, +-5865852, 5013838, 2940979, 511101, 8750996, -2923799, -886911, -6817724, -1449015, 180389, +3638374, 2424509, -5817533, -3433290, -1595044, -6898791, -1311576, -6467684, 2677912, 1940788, +7871065, 5507222, -541166, -3025268, 10737, 208843, -2229088, -326954, -8196408, -1299765, +3370476, 3808026, 1047972, -1218160, 7915088, 1486059, 22325776, -34360812, 14414447, 15025943, +-24427626, -2493229, -20931524, -6908455, -18792092, -8500277, 21489868, -7360500, -1577327, -15117211, +-2937221, 3468186, -22408992, -876710, 14305462, -27666568, 1008780, -18891950, -10204842, 374736, +2028835, -12513387, -10057740, -10486163, -3031710, -9016210, -591095, 4795868, -2731062, 7013145, +-13507135, -8608725, 18015240, -8439611, 9749576, -10733123, 10143639, 9291088, 1571958, 2476049, +9446244, 443992, 13466870, 17059074, -3233037, 2523293, 25334402, 1502702, 13009993, -918586, +-10107132, -19989852, 3338800, 13879187, -22072910, 288837, -12987981, -6815040, -28618440, 12357158, +18850074, -4933844, 9071508, -4632122, 20500416, 22713398, -1848983, -22491134, -21877490, 31169114, +-24300388, 9093520, 3573950, 3239479, 23294292, -9928891, 37965900, -632971, -8644159, -9900436, +-6882685, 6078453, -2411087, -2896419, -260919, 9816685, -2468533, -6167573, 8194798, -2960306, +4117800, -7550016, -4589710, 7189239, 522375, 10741713, -3574487, 4576825, -7932268, -2249489, +-10843719, 2245194, 4372814, 5371931, 1007707, 5519033, 492311, -1677185, 5824513, -9146670, +6026376, -7756174, -2806761, 4727149, -9578851, -2398202, -5512591, -16001438, -4328254, 1065689, +5749888, -7808251, -4114579, -6864432, -2280091, 1694365, 6299107, 37312528, 42050952, -2485712, +-31717260, 31323734, -34675420, 4884452, 14702747, 3642132, -3712999, -16000901, 18013630, -8068096, +-6457484, -16294569, -9477919, -5083094, -20337744, -11193222, -9090835, -5090073, -3343095, 14119168, +-207769, 12203076, 89657, -5280663, -17814450, -19519552, -4929549, -716723, -263067, -2967823, +-7297150, -8435853, 9336722, 22472880, -12214350, 7737384, -7626788, -7864622, 8929237, -8712341, +-14105746, 31550830, -3485903, 2896419, 1547799, -17637284, -3878356, -3703873, 8937827, -22783728, +-10088878, 24089398, 3874061, -10249939, 13094282, 24482388, -13930190, -17253958, 8959839, -14627585, +236760, -27371290, 8833674, 23261006, -2381559, 12128451, 7086159, 4061429, 26692148, 8369281, +-118112, 15381888, -2233383, -2143726, 9421011, 10084046, -38708928, 3528316, -16833588, 13677860, +-629213, 514859, 9630927, -2925410, -3694746, -5104569, 5189394, 1964411, -3782256, 5158256, +-5534602, 549219, -2935073, -7483981, 3441880, -3753802, 8373576, 4589173, -127775, 25770, +2308545, -2232846, 4964446, 2416456, 1562294, 2011118, -1388348, 1821066, -3331821, -6501507, +-3545496, -1697586, 909996, -8453569, 6887517, 4603668, 360240, 2496450, -5651103, 7899519, +983548, -4712653, 2892661, 3402151, -10095321, -2105608, 1034013, -824097, 164283, 1833951, +1286343, -51167020, -35837208, 14963666, -15180025, -14304389, -43524124, -12553653, 9295920, 3608846, +-8563091, -24197308, -299037, 12287365, -884763, 1682554, 12729209, 22596896, -19572702, 51424716, +-13217762, -17052630, -5182415, -2871186, 246961, -20328080, 478889, -3563749, 10873783, -6852621, +15384036, -6345814, -13066364, 5382131, 6350646, -11662984, 12764106, -39139500, 324270, -3115462, +15641734, 18913426, -13676786, 17638894, -6753299, 5057324, -8413841, -2807835, -5170604, 14117021, +-1877438, 18581102, 29010356, -25224342, -7048578, 13628468, -17000018, 10309532, -19313394, -10647224, +-9612674, -11304354, -19717122, -10103911, 9193377, 7514582, 15129022, 19638202, 14263586, -23775866, +2971581, 4405563, 5657546, 4808753, 15197205, -7438347, -16086263, 9207336, -4192962, -12568685, +2443837, -21533892, -8922795, -18758806, 1702418, 11055783, -6848862, 10625749, 5686000, -642635, +-4093641, -317828, -16738561, -6277095, 5515275, 2779918, 3625489, 1151588, 1848983, 1487669, +5165772, 1401233, -11257646, -1582696, 1655710, -1144609, 2864206, -5158256, -4743255, -10989748, +2778844, 9690520, -11067594, -7770133, 5616744, -2814277, -11296301, 7384660, -5532992, -4531728, +6666863, -536871, -2168422, -3473018, -5060009, -6700149, -7123740, -1864016, -6076305, -3629247, +-3169686, 4789426, -417686, 7146289, -10640781, -34854732, 26303454, -44617196, 31354336, -4498978, +-19958714, -17031156, -19010062, -12875238, -10023917, 953483, 22985054, -1867237, -19275814, 20467130, +29008746, -44532368, -11896523, 3098819, -3690451, -6953552, -2237141, -6185827, -7921531, -12952011, +16510928, -5801964, -12371116, -21195664, -21068426, 20738786, 5392332, -3808026, -2306934, 8053, +-4658429, -5661304, 4558034, -18649284, 10139881, 21198348, 15819438, 9865003, 20236276, 23552526, +-13566191, 5007932, -19520090, 21068962, -12089796, -3485366, -145492, -30772904, 9953050, 25303800, +4279935, -10429254, -8496519, 33086280, -13367012, -14317810, 9251896, -33792264, -3987877, -16774532, +682900, -33043330, 13756780, 5714454, 13480829, -53601728, -45995880, 7486128, -16103980, -10798085, +-6702297, -35908612, 11828877, -21240760, -23189602, 17428978, -15624017, -9220221, 7394323, -3787088, +-7060926, -1319629, -1997697, 7485055, -17749490, -8377871, -17128330, 13422, -7558606, 3406983, +-2505040, -13517336, -5593121, 4734665, -938987, 955093, 3543885, -14799384, 1822677, -18745922, +8562017, 2822867, -13659607, 4312684, -16235513, -3502546, -5988258, 1199907, 8498130, -6395743, +8795019, -4743255, 15023796, -6919729, 9412421, -5304285, -1753957, -493384, -1913945, 3059091, +-1639604, -11811, -1317481, -3433290, -51003, 5417028, -1598802, -2336999, -1972464, 1732482, +-2006824, -2037425, -1535451, -967978, 375810, -964757, -751619, -862752, -1945620, -807454, +933082, -42413, 3280281, 39715024, -54683524, 56120728, 16663399, -1654099, 4861366, -40119288, +8587787, 19184546, -6839199, 47834124, -13303661, 20818780, -16494822, 52669184, -1612223, -6844031, +-19772418, -7119445, 7944079, -5071820, 21562884, 16727287, -5280126, 1628866, -20329154, 8076686, +21366388, 21538188, -22936736, 9931038, -4294431, 22979686, -5872294, 15006079, -13456669, -10604274, +-30691836, 2272575, -19334870, -28843390, 41489920, -18101140, -3326989, -7693360, -9575630, 5721434, +3720516, 14705968, -6568079, 22509924, 2418067, 40734008, 15912317, 45071388, 38515120, -3691525, +25861072, 19622632, -6400575, 23061290, 31538482, -13302587, -30837328, 17842368, 11838004, 25603374, +13432510, -2429878, 24159, -33253784, -2823941, -9753871, -11756936, 44394392, -4734665, -440234, +55413132, 36870148, 20185810, 24641838, 13016435, 1612223, 6663642, 31982474, 763430, -8349417, +9858024, 26874148, 13016435, 15327128, 7960185, 18598282, -594853, 5364951, 7328825, 13024488, +4853313, 3314641, 2747169, 1483374, 10950019, 15821586, 7155953, 20906828, 1950452, 12904229, +13246753, 23567560, 92342, 16132971, 14777909, 3060164, 12545063, 672162, 3165391, -3989488, +5475547, 6553047, 3746285, 3393561, 1370632, -2818036, 1196148, 5516886, -2384244, 2996277, +11260867, -2362232, 17067664, -38375532, 73679088, -9994926, -8200167, -4698158, 53602804, -32916092, +26883810, -36037996, 34144992, 6917045, -6666863, 879931, 19994684, -8586713, 18639622, -8656507, +-177704, 37667400, 11534672, -9630390, -164819, 9415105, 7364259, -36509908, 9710921, -13285944, +-3358128, -19226958, 18564996, 17721572, 2698850, 8419210, 31372588, -10398653, -50119048, 12005507, +32687386, -12658879, -32999308, 8791261, 23365158, 7998303, -99858, -39355860, -19039590, -23272280, +21762062, 8961986, 22413286, -47374028, 2867965, -8662412, -52623548, -13493177, 7519951, 23863376, +32824288, -17457968, 61477624, 12139725, 838592, -12582644, -25145422, -17078938, 11374147, -28434830, +57898308, -18456548, 2108829, 34593276, -22965728, 21188684, -22450868, -12490302, 47940424, -24234352, +31312996, 29386704, 10256382, 13510357, -42163692, -4777078, -2570538, -14386530, 19293530, 18006114, +6803228, 5667210, 18742700, -4291746, 7047505, -2029909, 5281736, -7948911, 6338835, -1124208, +5269925, 4757750, 783295, -13935558, -2941516, 2284386, -5636608, -1347009, 9628780, 5987722, +16208133, -7249368, 2957085, -27074400, -23654532, -2947958, -2015413, 16746077, 11667279, -7383049, +-6383395, -21480742, -718333, 7984344, -4198331, 413391, 4560719, -6441377, 4235375, -15681999, +214748, -4942434, -7036767, 11146514, -43320652, 24714852, 15812459, 24719684, -9877351, -7035694, +10007811, 59593, 2843805, 912681, 4881767, 1155346, -6820945, 31977642, -7473780, -22071836, +9319005, -594853, -19432580, 6747394, 4478577, 13187697, -8972187, -14712947, 15789910, -12723304, +-1750199, -3801583, 12956306, -22390202, 7619809, -13896904, 11320997, -19726248, 6985228, -6626598, +3370476, 43184284, -29735132, 5614059, 9480603, -26796300, 9688909, 12326019, -19873350, -4152160, +-7632157, 35913444, 2992519, -41576356, 24846922, -33611876, 6072547, 17374216, -16162499, 19876034, +-24112484, -19866372, 27282170, -4663261, 11569568, -40963252, 7625178, 8835285, -2219961, -6332393, +-388695, 16602196, 577673, -54469312, 32937030, -3445638, 12617540, -14319958, -16703665, 51912732, +-1438277, -33228014, 2820720, 16754667, 3774203, -50507204, 1737314, 46821048, -8635569, -21681532, +5067525, 22641994, -3090229, 61740, -4053912, -2356863, 3173444, -8210904, -4859219, 15370077, +-6752763, -435402, -9125195, 9010305, 13653701, -2476586, -2140504, 14525043, 4683125, -10004053, +-2458332, 6251862, 4112431, -8499740, 4467840, 9991168, -8431021, 2136209, 2420751, 6434935, +-15626165, 977642, 9657771, 3666828, -10916733, 600222, 7575249, 1255204, -8127152, -5432060, +20485920, -7113540, -107075680, -227823856, -90900832, -171527568, -208907216, 73983496, -857383, 75884016, +288629856, 252064112, 143390704, 276215776, 154007856, 17377438, 95428808, 58706836, -104518568, -73883104, +-21790516, -115852984, -140099680, -46664284, -70968968, -110911088, -27918898, -5094368, -141215296, -97320736, +-14810121, -85860152, -111140872, -32447942, -54588496, -120822264, -23268522, 12206297, -67799816, -51719996, +50965692, -18460844, -72706280, 15149960, 47976396, -35919348, 29376502, 105641160, -15632607, -28304908, +104542192, 55764780, -26240640, 173695456, 236126032, 146938880, 248988384, 372514848, 286524800, 272667072, +398497792, 345453344, 254232000, 311948832, 283574688, 180363936, 159536016, 85826328, -29753386, -124581968, +-222852432, -316567552, -376702976, -472311104, -504623776, -532122816, -602827648, -602401344, -455308416, -465896032, +-424299808, -191122816, -147904720, -143854560, 63703492, 121643136, 2567317, 126785824, 175977696, 60209536, +83857088, 165034656, 123339112, 71798968, 116486496, 144235744, 61284888, 89785216, 179014240, 106449688, +70076152, 164971312, 123714384, 49942416, 107213656, 122490856, 15721191, 63251448, 147455360, 84536768, +101431024, 207883392, 195565424, 206089712, 266861344, 268735552, 215572992, 203900896, 174033680, 106267152, +76625440, 40767828, -6388764, -41973104, -113781200, -155447744, -210108720, -279958848, -311737856, -352222752, +-410007232, -390456000, -350705024, -309728896, -226481680, -148488832, -78776144, -29069950, 12165495, 25860534, +31632972, 40833328, 43250320, 36562520, 39009040, 43104828, 41725072, 46758772, 60379188, 67723584, +72143104, 80195096, 81867984, 80804440, 77153720, 57716844, 36150740, 23155780, 19529216, 19545322, +0, 0, 0, 0, 0, 0, 0, 0, }, { -7162395, -207232, 5693516, 3911105, 3934727, 2473901, 1562294, -2245194, 85362, -2554969, 6091338, -3726958, 1462436, 880468, 879395, -77309, -1927367, 2989834, 4190814, 4025995, 2467459, --3070365, -4425427, -4846871, -4598836, -487479, 2400887, -4738960, 3950833, -957241, 6906308, --1156420, 4387846, 52613, -5728413, 1633698, -737661, 4628364, 319975, -547071, -2337536, --3929358, 353261, 2209224, -5029944, -6883222, 4803921, -3989488, -3671123, -3470871, 2707440, --2739116, 1151588, -1227824, -339302, -4056060, -1223529, -2761127, -4027606, 1321239, 3125126, --1165547, -4430796, -869194, -904628, -2227478, -3830574, -299574, -3115999, -3672734, -664109, -250182, 862752, -1246614, 538482, -682900, -5179194, -1145683, 637266, -1433445, -1329829, --1626719, 1655710, -1985886, 1705102, -143345, 294205, 653372, -1268089, 1243930, 10201, --694174, 307627, -341450, -1076963, 174483, 805306, -555125, -471373, -52076, 1301912, -587337, 182536, 200253, 701690, 475131, 815507, 230854, 1049583, -876173, -386547, --396748, 13487808, -4713727, -3085934, -4202089, -2887292, 314606, -9025874, 1523640, -4478041, --8836358, -1888175, 7573638, -5447093, 1476932, -643171, 2541010, 3825742, 4093104, 6615324, --1416802, -3790846, 1687385, 1597728, -3038689, -439160, -2053531, -1336272, 813359, -3473018, --2171106, -505196, -4372277, -5131949, 2622078, 3967476, -2353105, -5897527, -1034013, -1382980, -834834, 4764730, 315143, -1974074, -317291, 6379100, 795106, -3903589, -3764002, 1651415, -1207960, 5091684, 2891050, -333934, -4861366, 272194, -286152, 4179003, -4474282, -1502702, -2457795, 4857071, -1369558, 431644, -3679176, -2065879, 2254858, 140123, 475131, 1319092, --1430761, 1768990, 523986, 2164127, 1330903, 836982, 8444443, 2587181, -346282, -1138166, --2489471, 3621731, 2246805, 3914326, 2787434, 982474, 1037772, -817118, 775242, -1581085, --1688996, -1296006, 443455, -597537, -413391, -255551, 1362578, 226023, 1780801, 168577, --564251, -222265, -170725, -245887, 580357, 418759, 719944, -9894531, -2320356, -4665945, -4539781, 1154273, 117038, 3230889, -1905892, -7646653, -4027069, 5094368, -268435, 5247913, --380105, -2957085, 5817533, 2190970, 12741020, -2386928, 5537824, 816044, -5986648, 1520418, --5083094, 3309272, 1180042, 1308354, -5432597, 2734821, -936840, -1913408, 2246268, 8677445, -3234647, -38655, -6942278, 6041945, -1258425, 38118, 4279935, -6315213, -1170379, 4374961, --2574833, -2246268, -7128572, -7787313, -580894, 4735202, 2793876, -3117073, -74088, 3088618, -3867618, 1546725, -779537, -1490891, -6830072, 3229816, 8524973, 3882651, -2443300, -1189706, -2706366, 4072703, -308164, -1257352, 1024887, -5621039, -1032403, -3936338, -1833414, -354872, --2413235, 6497749, 5666136, -1679332, 2848100, 2109903, -1072668, -3823595, 912144, -2957622, --1114544, 884763, -3817152, -807991, 390305, -1102733, 1095754, 1645509, -2439542, -870268, --155156, 172872, -1912871, 513785, -882079, 1452236, -1695975, 1604170, -1158031, 390842, -267362, -825171, 649614, 290984, -614717, 565862, 632434, 652298, -1257889, -588947, -31139, -1785096, 239444, 1063541, -350577, -7442105, 8316131, -7164543, 7594576, -69793, --6052683, -14278082, -5621576, -4096862, 2142115, 7487739, 5862631, -1800128, -1143535, -1737851, --4092030, -1176821, -4598836, 1582159, 1699733, 2840584, 4713190, 2795487, 9011915, 32749, -1825898, -3167002, -734439, -2142652, 3317325, 1007170, -4180077, -6052683, 258772, -4343286, -555661, 4125853, -6845641, 4840428, -11525008, -3164854, -8545374, 1477469, -513785, 160524, --3340411, -4506495, 1614371, 4107599, 2946348, 1101122, -6861211, 2119566, -4733054, -1786706, --1345935, -9349070, -3639985, 2832531, 3645890, -295816, -6433861, 1139777, 2474975, -1219771, --1258425, 804770, 5647882, 2049773, -1234266, -1772211, 1020055, -13327284, 992137, 3420405, -3210488, 9447854, 1335198, -5244692, 5946919, -2035815, 922881, 2114735, 1992865, -1327145, --4367445, 284005, 2617783, 2503966, 4034585, -1219234, -1279363, 734976, -731755, -470836, -668404, -1104880, 406948, 952409, -519691, -2115808, -1619740, -49929, 281857, 598074, --1001801, 2069637, -1034550, -555125, 1341640, 1565516, -420370, -2348273, -1226750, 980863, --1184337, -617402, -709743, 543313, 1879585, -313533, 9509594, -2461016, 99321, 6261526, --3285650, -3071975, 9380745, -7211250, -17013440, -11178189, -6600291, 10164040, 4304094, 1377074, --9869835, 10371809, -4525822, 2882460, -2731062, 4052302, 4973572, -447750, 91268, -128312, --1728724, -5417028, -4377646, -1357747, 528818, 4689568, 2640868, 7345468, 3487514, -3257196, --1756642, 6534256, -4768488, 8025684, -6487011, 1698123, 3502009, 2250026, -5268315, 7070590, --731218, 7599945, 10024991, 1506997, -4059281, -3934190, 4214974, -4875325, -10264972, -2671470, -2107755, -6597070, 3704946, 3003793, -2219424, -4114579, -1781875, -1593970, 1927367, -821413, --5799280, -2224256, 9901510, 7962870, 4261145, -11876658, -11678016, -6387153, 11121818, 5630702, --920197, 1529008, -5551782, 7029251, -361851, -5512591, -1951526, 705985, -586800, -2775086, --446677, -2202781, -1198296, 2065879, 3034931, -1826435, -76236, 252866, 473520, 420370, --3103651, 3495567, -288300, -3516505, -2111513, -506269, -1131187, 39728, -297963, -457951, --408022, 814970, 132070, -1631551, -146029, 600759, -433792, -2523293, -1743220, -2355790, --857920, 1651415, 4787278, 7050189, -394600, 2717641, -11097122, -3745748, 1811939, 3795141, --13762686, -1524177, 5918465, -4145717, -8956617, 5577015, -10417443, -7639136, -4134443, 909996, --3787088, -2570538, -346282, 7737921, -6583111, 1716376, -2093797, -2734284, -5543729, -1529545, --8089034, -2408403, -250719, 1540820, -5660230, -1194001, -3576097, 511638, -1831804, -2507187, -1469416, 6366216, 1604170, -3319473, 3150359, -4862977, -1222992, 1862405, -1866163, 3171833, --1051730, -359167, -22427246, 1487132, -7784628, 3792993, 3224984, 4950487, -12351789, -12584254, -1681480, 439160, 2922188, 82141, 6689412, -2720325, 3628174, 4514548, -2168959, 10530186, --3312494, -6857452, -1479079, -5676336, -214748, -11230266, 148176, 5554467, 2585034, 8381629, --2340757, -2295123, 3684008, -4433480, 1031866, 2727304, 5393405, -2900177, 3086471, -4400194, -853088, 172872, 564788, -2170032, -1050656, -1618129, 1708860, -2012729, -3215320, -67646, --1527398, -2000381, -736050, -1567663, -701153, -986769, 896574, -1568200, 889595, -3164317, --355945, -1894618, -821949, 252329, 193810, -449898, -1531156, 137976, 8677981, -17501992, -4685810, 746251, 4857608, 7044820, 1275605, -6789270, -14910516, 1061931, -6029061, 11323144, --4612795, 2335925, 821413, 2418604, 8541616, -3774203, -263604, -3964255, -2234994, 2231236, --2157147, 8015483, 5969468, 1712081, -1701881, 110059, 5365488, -552977, 2589865, -124017, --4424353, 3910031, -1137630, -3313567, 4738960, 8027831, 22012, 3138547, 562104, -5327907, --3322694, 9747965, -4708895, 4662187, 7100655, -9422085, 6720550, 3593277, 3411815, -4183835, -6891812, 1983738, -1191317, 8813810, 325881, -110059, -4131222, -2355790, -4295, -3861176, --9429601, -2486249, 9630927, 7258495, 7923678, -890669, -8356396, 3461744, 10103374, -1893007, --7154879, -373125, -5055177, -1305133, -839129, 7859790, -753767, 4031364, -1035087, 357556, --5545877, 1457605, -954557, 2166274, 2155000, -3829500, 2594697, -6055904, 595390, 2167885, -158914, -1570347, -104153, 1189706, -4190278, -783832, -3943317, 1217086, -2493229, -1580011, --2415919, -4056060, -2668249, -1047972, 585189, -1250372, -98784, 1269163, 428423, -1069984, --751619, -1224066, 2319819, 66572, 838056, 1492501, 934155, 1046361, -542240, 1969243, --300648, 34897, 824634, -788663, -1089311, 507880, 2088965, -8311299, -2452963, -13399224, --3919158, -7773354, -9165460, -8690866, -3080029, 11686069, 12716861, 17521856, 3916473, -6689949, --4117800, 14502494, -57445, -3387119, 11110007, -1168768, 481573, -17368848, 7849053, 4362076, --11590506, 16049756, -2240899, 7206419, -1953673, 3764002, 7132867, 8053, 12613245, 4830228, -3576097, -1469416, -4479651, 1202591, 7639673, -2059437, 2265595, 3572339, 10119480, -482647, --3069828, 6518150, -7672959, -4826470, 3461744, 11166378, -4960151, -5999533, -1896765, 9200357, -77846, 1293322, -3446711, -1582159, 3297998, 4848481, 423591, -3981972, -12743705, 1502165, -3746285, 12117713, 3517578, -986769, 9307194, 16634408, -3434363, 5822365, 3921842, 6886980, --1348083, -5860483, 3423626, -13806709, -3758633, -2100776, -4482335, -2798708, 7177964, 2471217, --8939438, -5280126, 248571, -2925947, -325881, -6844568, -214748, -2350958, -1728724, -948651, -680215, -1912871, -482110, -937377, 1457605, -544924, 1336809, -1876901, -62277, 280784, -615791, 2765422, 77309, -1072131, 2582886, 3776887, -309238, -2329483, -1472100, -3278134, --2866354, 3921842, -673773, 1053341, 1433982, 1385127, 1294396, -3019362, 1466195, -1100585, --15169824, 21242908, -10710038, 4822712, -786516, -7327214, 16192027, 3812857, 2009508, -17114908, -4442070, -6826314, -7789997, 1901597, -7603703, 8658654, 5240397, -1455457, 1735704, -4193499, --1894081, -6219650, -3999152, -7470022, -11535208, -2842195, -8071318, -2166811, 4391604, -3262028, --4344897, 9134859, 5740761, 9168145, -7516730, -847719, -1510218, -8257612, 81604, -4390531, --20556788, 1800128, 371515, -3178813, 7132867, -744640, 7868917, 6666863, 2460480, 12368432, -11004243, -10865730, -2978560, 91268, -401579, 3868155, 1479616, 10516227, -2245731, 16796544, --22549, -9904731, -8038568, 1286343, 3031173, 3436511, 12208981, 3207804, 3056406, 11477226, -15282567, 625992, -9376450, -8879845, -840740, -2979097, -2166274, 19745038, 1415729, -8967892, -6415071, -7851737, 7506529, 1239635, -1558536, -2347737, -6032282, 1679332, 1996623, -893890, -1765232, 3330747, 1853815, 2269890, -886911, -839129, 217970, -1103807, -930934, 2238215, -884226, 1588064, 1996623, 3539590, 200253, -1662152, 3294240, 1873680, 635655, 753230, --682900, 500364, -125628, 3525631, 5501316, -2970507, 2624762, -651224, 2287607, 297427, -487479, 4692789, -244813, 454730, 402653, 3855270, 2558727, 2820720, 12743168, 976568, -8587787, -9400610, 4203163, 752156, -699543, 5671505, 13474386, -3719442, -1226750, 12406013, --16411607, -9148280, -7169374, -18799072, 3689377, -5964099, -2652679, 2253784, -12833362, 14053670, -10596758, 14928233, 6693707, -9300215, 871878, 592169, 11164767, -2070174, -369367, -439697, --6947647, 552440, -4090956, 6241661, -7371775, -2788508, -2495376, -3186866, -8633421, 4050691, --12656195, -1934346, -906238, 7937637, 4685810, 1054415, 119722, -2218351, 907849, 117575, -6574521, 1523103, 1894081, -1056562, -19809462, -9205726, 2277407, 8201240, 9817221, -15507516, -10357851, 3077881, -6124087, 1490891, 3339337, -3675955, 15003395, 139586, 2863670, -3542811, --20944408, -7179038, -9547175, -2481954, 369367, -5806796, 2996814, 4456566, -4312147, -897648, -13444858, 380105, 6844031, -8253317, 1030255, -134218, 7733089, 6842420, 4918275, -1863479, -1589138, 5618354, 3402151, -247497, 5912560, 5749351, 6278706, 817654, 2389076, 2157147, -1014686, -814433, -813359, 5433134, 1016834, -2865280, 478889, -416612, 2984466, -2084670, -944356, 2834679, -2212982, 4406100, 1519882, -601832, 362925, -3803194, 2794950, 2825015, --459562, -843424, -2335925, -3149822, 19393388, 3082176, 7833484, -11696270, -10590852, 6075231, -10060961, 1169305, -3572876, 18610630, 5848672, 62277, -5168457, 4041027, -1454383, -2073396, --704912, -3215857, 857920, -6209986, -14781667, 4852776, 1506997, 4488778, 1454920, 8195335, -2487860, -8850854, -17993228, 455267, 1333587, -1458141, -15748034, -7692287, -2380486, 4395362, --3448859, 1750199, -13777718, 658741, -3089155, 76773, 1365263, 3809636, -1499481, -12962748, --11928198, -7434052, 4988068, 3688303, -3191161, -2699924, -20783346, -11761768, -437550, -20261508, -18621368, -19130858, -5272073, -12390981, 19972134, 6400038, -14104673, 7072201, -1656247, 7547332, --12022150, -3984656, 500364, 8121783, -11415486, -4566087, -3896609, -11593727, 797790, 7683697, --1476395, -2137820, 13833016, -21971442, 17267380, -2879239, 3626563, -9914932, 6924024, -1123134, -5510443, -5036386, 253940, 4379793, 4745402, -1386201, -2435247, 14496, 459562, 564788, --1646583, 5401458, 5651103, 3999152, 1013075, 4054449, -420370, 4986994, -1877975, 907312, --252866, -1892470, -1963337, 335544, -4163434, -5000953, -1488743, -319438, 5015448, -314069, --868657, -1392106, -3529390, 2447595, -1163399, -1830730, -1298154, 2598992, -597000, -5667746, --805843, 2004676, 428960, -546535, 17034378, 37327024, -5081483, -11712913, -10979547, -9698036, --13892072, 2230699, -23611582, -263604, -18268106, -8475581, 5550709, 11370389, 6492917, -8254391, --1188095, 10812580, -809601, 12488154, -7541963, -7612293, -6725919, 5856188, -4454418, -5791227, -1946694, -6931004, -7061463, 8443369, 20024748, 7515119, 8527121, 3738232, -11894912, -2872796, --9664750, -9143985, -1506997, -1715303, -7609072, -12152073, -24329380, -2342905, -8874476, 3066607, --4547297, 9012452, 8364449, 4705137, 8757975, 6126771, -996969, 16912508, 24182814, 5714991, --28456842, 5697274, -5150203, -16711718, 2253784, 8041790, 3975529, 636729, 7740605, -556198, --13589277, 736587, 6353867, -13651017, -7181186, -12797392, -23609972, 18440978, 2506114, -1471026, -12883291, 10005126, 666794, 651224, 12734041, -17480516, -7617125, 1854889, 9381282, 7866233, -12075301, 8638253, -7212324, -4252555, -1630477, -2856153, -1078037, -1835562, -3519726, -4655208, --7107097, -7221988, -5133023, -2821794, -796716, 3411815, -1954210, -1545115, -8133058, -5644124, -810675, 4152697, 2903398, 1650341, 1685238, 1110786, -1165010, -4245575, -2037425, -2689723, --2322504, 695785, -4483409, 815507, -3202435, 3273839, -402653, -1279900, -3067144, 2686502, --2821794, -1002338, 5608154, -2435783, -193274, 27567248, -20399484, 23830090, -1989107, -2851322, --12119861, -4471598, -12040404, -10229001, 12733504, -11309723, 6586869, 28579250, 10631655, -4221416, --12883828, -10810970, 12754442, -10404558, -17621178, -7248831, 1819992, 1699196, -20118700, 1444183, --6094559, 10516764, -6346888, -277025, 2347737, 30056182, -7249905, -9575630, 14586783, -11578695, -17520246, -10215043, 12833362, 2170569, -9242770, -8451422, 16287590, -20993264, 16025060, -9037685, -1658394, -5011153, 8762807, -7248294, -3694209, -267362, -6455873, 30654256, -8791798, 20923470, -8128226, 9604084, -130997, 7926362, 13429289, 15042586, -4109210, -14565845, 93416, 12421582, -5014375, -2205466, -18321794, 24522116, -5118528, -16217260, -4482872, -9945534, 7683160, 10586021, -442919, 17746268, -4784057, 9100499, -20155208, -3568044, -21507048, -6706592, -7860864, -494995, -1207423, -4156455, 7696045, 2515240, -5795522, -9914395, -7339026, -2141041, -907312, -4976257, --1055488, -1770063, 6090264, -1813013, 271120, -2318209, -9306120, -2831994, -3733400, 1129040, --1540283, -5248987, -8127689, 3208878, -5490579, 2524367, 3624953, -5713917, -13939853, -3352222, --2175938, -3741990, -4968204, 548682, -2317672, 1478543, 1646583, -6361921, -811749, -6405407, -5928666, 3607236, -3337190, 1573569, -5572720, -31242128, -13332115, 19185618, -3777961, -7838852, -22299470, 2151242, -11562052, 8469676, 12147778, 10307922, 1626182, -19210314, -7924215, 2958696, -2861522, 10073846, 6674379, 11361262, -9798968, -7732015, 3832722, -2641942, 9320616, -18054432, --3033321, -19530290, -6295885, 3570192, -2667712, -2425583, 20953534, 4391067, -15479599, -2319819, -1272921, -15811922, -2120640, 812823, 9550934, 24098524, -8513699, 8081518, -13405130, 2061047, --7878044, -10133438, 9829570, 21082384, -16656957, 1651415, 18766322, -8426726, -1712618, -6997576, -12287365, 2999498, -15226196, -148176, -5311264, -4908611, -1504312, -7450158, 11368778, -26912266, -5719286, 2296734, -11324755, 15135465, 23161148, 16384226, 44111460, 13414257, -11305428, -15626702, --12943421, -7033009, 16195785, -5803038, 22487376, 2100776, 27381490, -32503238, -20867636, 9838159, --5345087, -3331821, 13132399, -8829379, -1010391, 14001057, 6223408, 10394895, 15298137, 11985643, --2594160, 4912906, -9362492, 367220, -367220, -6538551, -7194070, 4818954, -9911174, -816581, -14967424, 1394254, -8952322, -11651173, 2159832, -14646912, -5415417, 15817291, 8191577, -2557116, --3631932, 3066070, -2943663, -4957466, 1045288, -3613141, -5632313, -941135, -7728794, 5476620, -4715874, 5245229, -2888903, -2035278, 3319473, 8095477, 22090090, -51231980, -1883343, 29466160, --38884488, -1613297, 7842074, -40169756, 18219252, 5086315, 32485522, -3061238, 11582453, 9701794, --35333624, -29218662, -11286100, -2676302, -17608292, -21674016, -11400991, 20359218, 14309220, 12403329, -1458141, 2448668, 6530498, 1425929, -25616796, -9472550, -32928978, -10394358, 18646064, 5678484, -12644384, 41776612, 10967736, 15897285, -508417, 8501888, 36786396, 27730456, 7829189, 18255222, -16740172, 36735392, 30179662, -39654896, 25089588, -2047089, 24016384, 24480776, 10266046, 44070660, -38915624, -21180094, 19331110, -83752, 18428630, -31871342, 3267933, 3664144, 1340567, -7055558, -20463908, 22206592, -21174726, -7009387, -12380780, 7943005, -17531520, -21731998, 20762946, 35389992, -13044889, 36823440, -10416906, 49961208, 48845588, 13833553, 25677462, -7239168, -12659953, 11671037, -11426224, 5687074, 3996467, 3203509, 6689412, -6721087, -12444668, -8782671, -23481124, -24529632, --9870909, 11751567, -199716, 10388989, 1903207, 6412923, 15140833, 18652506, -5863167, 8675297, --786516, -7402376, -6222334, -5198521, -15447924, -6929930, 340913, -13219372, -4675609, -11875585, --6608881, 2841658, 16988206, -7746511, 6160057, 5003637, -2789581, 9570261, 5517423, 7363185, -259846, 12637404, 8012799, 5642514, -4915053, -7272990, -16315507, 23956254, 43021612, -5750961, --58559196, -18611168, 6049999, -4451197, -9660992, -12735115, 260382, -33398202, -20054812, -27698780, --4439386, -7976291, 9341554, -19712826, -5664525, 5539971, 9365176, -43487, 10409927, 20462834, -4230543, 29444148, -18798534, 7259569, 1209033, 28114856, 7346005, -5239323, -28073516, 18911814, --4817880, 25691958, -21352430, -16713865, -16174310, -8367670, -25881472, -3291019, -4469451, -24093692, -13434658, 28043452, -13418552, 4414153, -36031016, 34956740, -10923712, -18547280, 15826954, 14166950, --20602422, 2138357, -12837657, 4885526, -9400610, 43729748, -1588064, -3349538, -10675678, 76937360, -1975148, -10001905, 32821604, 26730266, -27801324, 22126060, -34067144, -18526342, -35603132, 27643484, --24499030, 13573707, 18719614, 15347529, -31569084, 40315784, -7187091, -51733416, -59533616, -22982370, --7329362, -16806744, 13873818, 14168560, 23546622, 4366908, 2046015, -17186848, 17782238, 28441810, -40920300, 11315091, -11751567, 4525822, 34810708, 6353867, -19256486, -4195646, 37141804, 9098351, --22024056, -5117454, 18305150, 11199664, 16659104, 11853573, 23487566, 815507, 12870406, 5229660, -16592532, 8535711, 26415122, 9465571, 16652662, -2605435, 5157719, 1938641, -2077154, 7767449, --2465311, 9885941, 16393890, 3244848, 9460739, 1978369, 12328704, -27420144, -6700149, 22565758, --16466905, -78799232, 5681705, 50727860, -30573188, -20366198, 40739912, -29553670, -1879048, -8352638, -39101384, -67020816, 37539624, 22318260, -18891950, 7067369, 36672040, 26227754, -12794171, 15039902, -6753836, -10147934, 17260936, -296353, 10475962, 15933792, -6736120, 3911105, -1685238, 7645579, --9682467, -7730405, -598611, 13696651, -39756364, -19601156, 19804094, -4375498, -26356066, -31055834, -5411122, 38857104, -16799764, -24661702, 19072876, 29015188, -6310381, 7376070, -5097053, 27038430, --14614163, 40490804, -5450851, 190589, 22136262, 585726, 5102958, -28562070, 45081588, -23178864, --28221156, 21527986, -29884382, -9753871, 5056250, 15034533, 41648296, -14646912, 25969520, -5157719, -13595719, -70398808, -53948548, -9772661, -21029770, 10910291, 9747428, 26921392, -4227322, -5469641, -31942208, -34833260, -775778, 22523346, 22095996, -7985418, 24618216, 3260417, -5247377, 35970, --5467494, 23744190, -13104482, -1173063, 22980222, 5452461, -5216238, 9237401, -11419244, 3124589, --875100, 579284, 9282498, 4536559, -13065827, -2794413, 4036733, -9962177, -14919106, -1074, -10896332, 19384262, -16203301, 18949396, 6398965, -18515068, 15516643, 17998598, -8973260, -20991116, -19488950, -9463424, 3577708, 10974178, -10710575, -27857158, 9162239, 7794829, -15574625, -14453102, -1063004, 10867341, -12366821, -5913633, -26510148, -12553116, 19080930, -33013802, 31912680, -28142236, --35243964, 19601694, -17153026, -11665668, 20032802, -15432891, 16694001, -12184822, 7641284, 39239896, --35549980, -2791729, -5630702, 33013266, 4253628, 2886755, -31853624, -29928406, -10794327, -8927090, --4862977, -9829570, 5616744, 1469416, -3488587, 4657892, 6875169, 3151969, 5279052, -6372658, -15288473, -10362682, 14617384, -28388124, 737124, -23050016, -29791504, -17689360, 39003672, -17200808, --17536888, -13117904, 8761196, -8105140, 17211008, 25177098, -26976690, 23634668, 4014721, -37205692, --18763638, 76042936, 39318816, -58137752, -11165304, 36469640, -18913962, -21403970, 14519137, -18539226, --40258340, 28418188, 12815109, -54660440, 22106734, 27259620, -32251984, -21399674, 32176284, -8239358, --24702504, 5280126, 15820512, -39701604, 7173133, 6657736, 11040213, -30383672, -9251896, -2930778, --9946071, -2396592, 1644436, 3015067, -18721226, 2564632, 26852136, 9072582, 1387811, 8605504, --803159, -4863514, -15264851, -4992900, -8419747, -11339251, -25912612, 6446746, -14936823, -4436165, -31048856, -28153510, -18491982, 22740242, -17071422, -6477348, -7588671, 10018548, -18469970, -6995965, -28587302, 14908368, -14484777, 15844134, 8766028, -12482786, -8005282, 38955892, -31820876, -24895242, -41561860, -673236, -33816424, 4142496, 20269562, -20263118, -42142220, 27422830, 3071975, -46788300, -7590818, 12459700, -34216392, -1202054, 22332220, -6809671, -15444166, 11470784, 9104794, -23787140, --2774549, 16692927, 48168596, 68131600, -26939108, 76244800, -5781026, -20592758, -15879568, -25523380, --1951526, 12987981, 45060112, 1762010, 14024679, -11171210, -38472708, 948651, 1626719, 25712358, -5051956, -29023242, 54573464, -23009214, 10362145, 24643448, -26888106, -21787832, -38459820, -16732119, -24092620, 29969744, 36980204, -13685913, -89778240, 20145544, 47188804, 60421600, 51977156, -617402, --25556130, -31743566, 11090679, 30891016, -19391778, -10202158, -79516488, -48686676, 43058656, 72255848, -14999100, -1835562, -17294760, -31408558, -7183870, 20136954, -27708444, 11068668, -3755949, 45710264, --1738388, 17899814, -88938576, -11212549, 1312113, 54871428, 42656004, -1043677, -26485452, -7266011, -65371548, 29542396, -76237816, -94635848, -36768140, 19127100, 147301808, 15978889, -25315074, 20336670, --39137352, 104565808, 32133872, -83118352, -51801600, -10297184, 74028592, 11154567, -30480310, -28407988, --26085484, 21082920, 39981312, 19989314, -42538428, -3484292, -14453639, 35394288, -3566970, 21435108, --7241315, -8930311, -28116466, 11134166, -8423505, -2953864, 22352084, -34612068, 20557860, -5166309, --5007932, 225486, 16305843, 34474628, 17680232, 2406792, -6498286, 7354595, 0, 14033806, -4900021, 15477988, 4139812, 3962644, -17127256, 8163659, 9511742, 6334003, 446140, 5221607, -3570729, 15323370, 7540352, -12324409, 31393526, -36105104, 1153736, -14501957, 8379481, -22341346, -21034602, 5851893, -11895449, -22530862, -11068131, -4236985, 6595459, -30760018, 7129109, -15038828, --5853504, -24071144, -11341935, 19611358, -20558934, -7216619, -2812667, 9620727, 6483253, -7951595, -11092290, -17590038, -1389959, 287226, 9493488, -11493332, 16790638, 12604118, -12751758, -14694157, --5638219, 23948200, -17172352, 7625715, 17736604, 4047470, -17273822, -6520297, 7443715, -10746008, -8058433, 892816, 3900367, -15850577, 3358128, -12865038, -561567, 12185359, 15239618, 11985106, --8814347, 11445551, 1432372, -14057428, -2107218, 102005, 16950088, -4510253, 3570192, 14887967, --3184718, -19040664, 26808112, -10732586, 15852724, 11805254, 2720862, 3928285, -11347304, -13717052, -18455474, 3046743, 16231218, 5142150, 8828842, 4754529, -546535, -599685, -14248017, 1870995, -3756486, 5285494, 5566278, -1474248, 6487011, 1414655, -918049, 2096481, 761820, 7069516, --1928977, 5588290, -6612102, -1344325, -96637, 848793, -3770445, -1748589, 12446815, 8252243, --2246805, -8635032, -10283762, -3412889, -4227322, 11848741, 1024350, -3094524, -7723962, -3527779, -934155, -5921150, 13089450, 1617592, -5527086, 2655364, -408022, -1996623, 3574487, -3467112, -11324218, -10391137, 7719667, -10091563, -29118804, 54577760, 4990215, 3022046, -21992916, 12693239, --1817845, 14356465, 10947335, 16795470, 1887101, 4312147, -9386651, 2758980, 15391552, -1460826, -8440148, -1291175, 2714419, 3441880, 6267431, -6461242, 11661910, -7869991, 1110249, -1229971, -3984656, -992674, 2380486, 8883066, 9738838, -4638028, 4322885, 1936493, -2123325, -4118874, -12956843, -3922916, 2779381, -3626563, 6799470, 5906, -6138045, 13024488, -8018167, -2745021, -3491272, -6056978, -3643743, -1847910, 590558, -2288144, 274341, -1195075, -3298535, 4460861, --8296266, 5319317, 3632469, -2806224, 5599564, -4154307, 6622840, -3323768, 1326608, 1341640, --3878892, 6520834, 78383, 960999, -1967095, 8762270, -10254234, 11077258, -7725036, 1388885, -1976222, -236760, 2119030, -1685775, 6456947, -5914707, 511638, 5553930, -6514929, 4220342, -3826816, -894427, 906238, 3817689, 1868848, -1654099, 2582886, 759672, -753230, 597000, -2280091, 341987, -2682207, 841814, 1235340, -1337346, 3295314, -615791, 2726231, -1604170, -531502, 2163053, -1255204, 427349, 1526861, -1969243, 3605088, -243739, 1832877, -358093, -3789772, -1212791, 541703, 3554622, -2933463, 4097936, -2209224, 1835562, -2274722, 4027606, -10452877, -49754512, -123906584, 19286014, 94407136, 87718264, 152150832, -38801808, -40703404, -103553272, --141403744, -29131152, 51161652, 54757076, 103089416, 56020332, 4435628, -26736708, -71944464, -51126752, --8820789, -7977365, 25654376, 23817742, 13762686, 8809515, 6924024, -3762391, -17673254, -1338956, -20434380, 189515, 4305168, -1136019, -15311558, -11693048, -26046292, -25486872, 11576547, 10716480, -23675470, 36039072, 26975078, 13216688, 4766340, -38825432, -27491012, -21227876, -21312702, -23728084, -4958003, 15198279, 26346404, 33705828, 27843736, 6113349, -3298535, -22285512, -22805202, -13502303, --6611029, 2233920, 3745748, 7596724, 653909, -7244536, 2462090, -11591043, 6062347, 9943923, -1122060, 19857244, 23931558, 7459285, -4563940, -26288422, -34711924, -13916768, -6418292, -3992709, -17632988, 13733158, -3617436, 15568183, 16818018, 9479530, 11612518, -6382859, -12527883, -9996536, --14411226, -11361799, -2145873, -10903848, -4361540, 658204, 8768176, 12484933, 17889076, 15531675, -14228690, 11385421, -5916318, -13368623, -22573274, -27722940, -16201154, -11996917, 1531156, 13312788, -19492172, 22701050, 17861158, 16547972, 10589779, -13969918, -25078314, -22542672, -11098732, -3172907, --1065152, 1757179, 9526774, 8489003, 3990025, 1979980, 7786239, 4502200, 6767795, 1959579, --10533407, -11460046, -7624104, -2997887, 3562139, 2608656, -3848291, -2097555, 3539590, 1918777, -1499481, 4835597, 7638063, 3541201, 120259, -3833258, -4506495, -3730716, -4631586, -5951214, --4598836, -458488, 3103114, 4300873, 4996121, 4050154, 1229971, 60130, 96637, 234076, -0, 0, 0, 0, 0, 0, 0, 0, }, +207232, 5693516, 3911105, 3934727, 2473901, 1562294, -2245194, 85362, -2554969, 6091338, +3726958, 1462436, 880468, 879395, -77309, -1927367, 2989834, 4190814, 4025995, 2467459, +-3070365, -4425427, -4846871, -4598836, -487479, 2400887, -4738960, 3950833, -957241, 6906308, +-1156420, 4387846, 52613, -5728413, 1633698, -737661, 4628364, 319975, -547071, -2337536, +-3929358, 353261, 2209224, -5029944, -6883222, 4803921, -3989488, -3671123, -3470871, 2707440, +-2739116, 1151588, -1227824, -339302, -4056060, -1223529, -2761127, -4027606, 1321239, 3125126, +-1165547, -4430796, -869194, -904628, -2227478, -3830574, -299574, -3115999, -3672734, -664109, +250182, 862752, -1246614, 538482, -682900, -5179194, -1145683, 637266, -1433445, -1329829, +-1626719, 1655710, -1985886, 1705102, -143345, 294205, 653372, -1268089, 1243930, 10201, +-694174, 307627, -341450, -1076963, 174483, 805306, -555125, -471373, -52076, 1301912, +587337, 182536, 200253, 701690, 475131, 815507, 230854, 1049583, -876173, -386547, +-396748, 13487808, -4713727, -3085934, -4202089, -2887292, 314606, -9025874, 1523640, -4478041, +-8836358, -1888175, 7573638, -5447093, 1476932, -643171, 2541010, 3825742, 4093104, 6615324, +-1416802, -3790846, 1687385, 1597728, -3038689, -439160, -2053531, -1336272, 813359, -3473018, +-2171106, -505196, -4372277, -5131949, 2622078, 3967476, -2353105, -5897527, -1034013, -1382980, +834834, 4764730, 315143, -1974074, -317291, 6379100, 795106, -3903589, -3764002, 1651415, +1207960, 5091684, 2891050, -333934, -4861366, 272194, -286152, 4179003, -4474282, -1502702, +2457795, 4857071, -1369558, 431644, -3679176, -2065879, 2254858, 140123, 475131, 1319092, +-1430761, 1768990, 523986, 2164127, 1330903, 836982, 8444443, 2587181, -346282, -1138166, +-2489471, 3621731, 2246805, 3914326, 2787434, 982474, 1037772, -817118, 775242, -1581085, +-1688996, -1296006, 443455, -597537, -413391, -255551, 1362578, 226023, 1780801, 168577, +-564251, -222265, -170725, -245887, 580357, 418759, 719944, -9894531, -2320356, -4665945, +4539781, 1154273, 117038, 3230889, -1905892, -7646653, -4027069, 5094368, -268435, 5247913, +-380105, -2957085, 5817533, 2190970, 12741020, -2386928, 5537824, 816044, -5986648, 1520418, +-5083094, 3309272, 1180042, 1308354, -5432597, 2734821, -936840, -1913408, 2246268, 8677445, +3234647, -38655, -6942278, 6041945, -1258425, 38118, 4279935, -6315213, -1170379, 4374961, +-2574833, -2246268, -7128572, -7787313, -580894, 4735202, 2793876, -3117073, -74088, 3088618, +3867618, 1546725, -779537, -1490891, -6830072, 3229816, 8524973, 3882651, -2443300, -1189706, +2706366, 4072703, -308164, -1257352, 1024887, -5621039, -1032403, -3936338, -1833414, -354872, +-2413235, 6497749, 5666136, -1679332, 2848100, 2109903, -1072668, -3823595, 912144, -2957622, +-1114544, 884763, -3817152, -807991, 390305, -1102733, 1095754, 1645509, -2439542, -870268, +-155156, 172872, -1912871, 513785, -882079, 1452236, -1695975, 1604170, -1158031, 390842, +267362, -825171, 649614, 290984, -614717, 565862, 632434, 652298, -1257889, -588947, +31139, -1785096, 239444, 1063541, -350577, -7442105, 8316131, -7164543, 7594576, -69793, +-6052683, -14278082, -5621576, -4096862, 2142115, 7487739, 5862631, -1800128, -1143535, -1737851, +-4092030, -1176821, -4598836, 1582159, 1699733, 2840584, 4713190, 2795487, 9011915, 32749, +1825898, -3167002, -734439, -2142652, 3317325, 1007170, -4180077, -6052683, 258772, -4343286, +555661, 4125853, -6845641, 4840428, -11525008, -3164854, -8545374, 1477469, -513785, 160524, +-3340411, -4506495, 1614371, 4107599, 2946348, 1101122, -6861211, 2119566, -4733054, -1786706, +-1345935, -9349070, -3639985, 2832531, 3645890, -295816, -6433861, 1139777, 2474975, -1219771, +-1258425, 804770, 5647882, 2049773, -1234266, -1772211, 1020055, -13327284, 992137, 3420405, +3210488, 9447854, 1335198, -5244692, 5946919, -2035815, 922881, 2114735, 1992865, -1327145, +-4367445, 284005, 2617783, 2503966, 4034585, -1219234, -1279363, 734976, -731755, -470836, +668404, -1104880, 406948, 952409, -519691, -2115808, -1619740, -49929, 281857, 598074, +-1001801, 2069637, -1034550, -555125, 1341640, 1565516, -420370, -2348273, -1226750, 980863, +-1184337, -617402, -709743, 543313, 1879585, -313533, 9509594, -2461016, 99321, 6261526, +-3285650, -3071975, 9380745, -7211250, -17013440, -11178189, -6600291, 10164040, 4304094, 1377074, +-9869835, 10371809, -4525822, 2882460, -2731062, 4052302, 4973572, -447750, 91268, -128312, +-1728724, -5417028, -4377646, -1357747, 528818, 4689568, 2640868, 7345468, 3487514, -3257196, +-1756642, 6534256, -4768488, 8025684, -6487011, 1698123, 3502009, 2250026, -5268315, 7070590, +-731218, 7599945, 10024991, 1506997, -4059281, -3934190, 4214974, -4875325, -10264972, -2671470, +2107755, -6597070, 3704946, 3003793, -2219424, -4114579, -1781875, -1593970, 1927367, -821413, +-5799280, -2224256, 9901510, 7962870, 4261145, -11876658, -11678016, -6387153, 11121818, 5630702, +-920197, 1529008, -5551782, 7029251, -361851, -5512591, -1951526, 705985, -586800, -2775086, +-446677, -2202781, -1198296, 2065879, 3034931, -1826435, -76236, 252866, 473520, 420370, +-3103651, 3495567, -288300, -3516505, -2111513, -506269, -1131187, 39728, -297963, -457951, +-408022, 814970, 132070, -1631551, -146029, 600759, -433792, -2523293, -1743220, -2355790, +-857920, 1651415, 4787278, 7050189, -394600, 2717641, -11097122, -3745748, 1811939, 3795141, +-13762686, -1524177, 5918465, -4145717, -8956617, 5577015, -10417443, -7639136, -4134443, 909996, +-3787088, -2570538, -346282, 7737921, -6583111, 1716376, -2093797, -2734284, -5543729, -1529545, +-8089034, -2408403, -250719, 1540820, -5660230, -1194001, -3576097, 511638, -1831804, -2507187, +1469416, 6366216, 1604170, -3319473, 3150359, -4862977, -1222992, 1862405, -1866163, 3171833, +-1051730, -359167, -22427246, 1487132, -7784628, 3792993, 3224984, 4950487, -12351789, -12584254, +1681480, 439160, 2922188, 82141, 6689412, -2720325, 3628174, 4514548, -2168959, 10530186, +-3312494, -6857452, -1479079, -5676336, -214748, -11230266, 148176, 5554467, 2585034, 8381629, +-2340757, -2295123, 3684008, -4433480, 1031866, 2727304, 5393405, -2900177, 3086471, -4400194, +853088, 172872, 564788, -2170032, -1050656, -1618129, 1708860, -2012729, -3215320, -67646, +-1527398, -2000381, -736050, -1567663, -701153, -986769, 896574, -1568200, 889595, -3164317, +-355945, -1894618, -821949, 252329, 193810, -449898, -1531156, 137976, 8677981, -17501992, +4685810, 746251, 4857608, 7044820, 1275605, -6789270, -14910516, 1061931, -6029061, 11323144, +-4612795, 2335925, 821413, 2418604, 8541616, -3774203, -263604, -3964255, -2234994, 2231236, +-2157147, 8015483, 5969468, 1712081, -1701881, 110059, 5365488, -552977, 2589865, -124017, +-4424353, 3910031, -1137630, -3313567, 4738960, 8027831, 22012, 3138547, 562104, -5327907, +-3322694, 9747965, -4708895, 4662187, 7100655, -9422085, 6720550, 3593277, 3411815, -4183835, +6891812, 1983738, -1191317, 8813810, 325881, -110059, -4131222, -2355790, -4295, -3861176, +-9429601, -2486249, 9630927, 7258495, 7923678, -890669, -8356396, 3461744, 10103374, -1893007, +-7154879, -373125, -5055177, -1305133, -839129, 7859790, -753767, 4031364, -1035087, 357556, +-5545877, 1457605, -954557, 2166274, 2155000, -3829500, 2594697, -6055904, 595390, 2167885, +158914, -1570347, -104153, 1189706, -4190278, -783832, -3943317, 1217086, -2493229, -1580011, +-2415919, -4056060, -2668249, -1047972, 585189, -1250372, -98784, 1269163, 428423, -1069984, +-751619, -1224066, 2319819, 66572, 838056, 1492501, 934155, 1046361, -542240, 1969243, +-300648, 34897, 824634, -788663, -1089311, 507880, 2088965, -8311299, -2452963, -13399224, +-3919158, -7773354, -9165460, -8690866, -3080029, 11686069, 12716861, 17521856, 3916473, -6689949, +-4117800, 14502494, -57445, -3387119, 11110007, -1168768, 481573, -17368848, 7849053, 4362076, +-11590506, 16049756, -2240899, 7206419, -1953673, 3764002, 7132867, 8053, 12613245, 4830228, +3576097, -1469416, -4479651, 1202591, 7639673, -2059437, 2265595, 3572339, 10119480, -482647, +-3069828, 6518150, -7672959, -4826470, 3461744, 11166378, -4960151, -5999533, -1896765, 9200357, +77846, 1293322, -3446711, -1582159, 3297998, 4848481, 423591, -3981972, -12743705, 1502165, +3746285, 12117713, 3517578, -986769, 9307194, 16634408, -3434363, 5822365, 3921842, 6886980, +-1348083, -5860483, 3423626, -13806709, -3758633, -2100776, -4482335, -2798708, 7177964, 2471217, +-8939438, -5280126, 248571, -2925947, -325881, -6844568, -214748, -2350958, -1728724, -948651, +680215, -1912871, -482110, -937377, 1457605, -544924, 1336809, -1876901, -62277, 280784, +615791, 2765422, 77309, -1072131, 2582886, 3776887, -309238, -2329483, -1472100, -3278134, +-2866354, 3921842, -673773, 1053341, 1433982, 1385127, 1294396, -3019362, 1466195, -1100585, +-15169824, 21242908, -10710038, 4822712, -786516, -7327214, 16192027, 3812857, 2009508, -17114908, +4442070, -6826314, -7789997, 1901597, -7603703, 8658654, 5240397, -1455457, 1735704, -4193499, +-1894081, -6219650, -3999152, -7470022, -11535208, -2842195, -8071318, -2166811, 4391604, -3262028, +-4344897, 9134859, 5740761, 9168145, -7516730, -847719, -1510218, -8257612, 81604, -4390531, +-20556788, 1800128, 371515, -3178813, 7132867, -744640, 7868917, 6666863, 2460480, 12368432, +11004243, -10865730, -2978560, 91268, -401579, 3868155, 1479616, 10516227, -2245731, 16796544, +-22549, -9904731, -8038568, 1286343, 3031173, 3436511, 12208981, 3207804, 3056406, 11477226, +15282567, 625992, -9376450, -8879845, -840740, -2979097, -2166274, 19745038, 1415729, -8967892, +6415071, -7851737, 7506529, 1239635, -1558536, -2347737, -6032282, 1679332, 1996623, -893890, +1765232, 3330747, 1853815, 2269890, -886911, -839129, 217970, -1103807, -930934, 2238215, +884226, 1588064, 1996623, 3539590, 200253, -1662152, 3294240, 1873680, 635655, 753230, +-682900, 500364, -125628, 3525631, 5501316, -2970507, 2624762, -651224, 2287607, 297427, +487479, 4692789, -244813, 454730, 402653, 3855270, 2558727, 2820720, 12743168, 976568, +8587787, -9400610, 4203163, 752156, -699543, 5671505, 13474386, -3719442, -1226750, 12406013, +-16411607, -9148280, -7169374, -18799072, 3689377, -5964099, -2652679, 2253784, -12833362, 14053670, +10596758, 14928233, 6693707, -9300215, 871878, 592169, 11164767, -2070174, -369367, -439697, +-6947647, 552440, -4090956, 6241661, -7371775, -2788508, -2495376, -3186866, -8633421, 4050691, +-12656195, -1934346, -906238, 7937637, 4685810, 1054415, 119722, -2218351, 907849, 117575, +6574521, 1523103, 1894081, -1056562, -19809462, -9205726, 2277407, 8201240, 9817221, -15507516, +10357851, 3077881, -6124087, 1490891, 3339337, -3675955, 15003395, 139586, 2863670, -3542811, +-20944408, -7179038, -9547175, -2481954, 369367, -5806796, 2996814, 4456566, -4312147, -897648, +13444858, 380105, 6844031, -8253317, 1030255, -134218, 7733089, 6842420, 4918275, -1863479, +1589138, 5618354, 3402151, -247497, 5912560, 5749351, 6278706, 817654, 2389076, 2157147, +1014686, -814433, -813359, 5433134, 1016834, -2865280, 478889, -416612, 2984466, -2084670, +944356, 2834679, -2212982, 4406100, 1519882, -601832, 362925, -3803194, 2794950, 2825015, +-459562, -843424, -2335925, -3149822, 19393388, 3082176, 7833484, -11696270, -10590852, 6075231, +10060961, 1169305, -3572876, 18610630, 5848672, 62277, -5168457, 4041027, -1454383, -2073396, +-704912, -3215857, 857920, -6209986, -14781667, 4852776, 1506997, 4488778, 1454920, 8195335, +2487860, -8850854, -17993228, 455267, 1333587, -1458141, -15748034, -7692287, -2380486, 4395362, +-3448859, 1750199, -13777718, 658741, -3089155, 76773, 1365263, 3809636, -1499481, -12962748, +-11928198, -7434052, 4988068, 3688303, -3191161, -2699924, -20783346, -11761768, -437550, -20261508, +18621368, -19130858, -5272073, -12390981, 19972134, 6400038, -14104673, 7072201, -1656247, 7547332, +-12022150, -3984656, 500364, 8121783, -11415486, -4566087, -3896609, -11593727, 797790, 7683697, +-1476395, -2137820, 13833016, -21971442, 17267380, -2879239, 3626563, -9914932, 6924024, -1123134, +5510443, -5036386, 253940, 4379793, 4745402, -1386201, -2435247, 14496, 459562, 564788, +-1646583, 5401458, 5651103, 3999152, 1013075, 4054449, -420370, 4986994, -1877975, 907312, +-252866, -1892470, -1963337, 335544, -4163434, -5000953, -1488743, -319438, 5015448, -314069, +-868657, -1392106, -3529390, 2447595, -1163399, -1830730, -1298154, 2598992, -597000, -5667746, +-805843, 2004676, 428960, -546535, 17034378, 37327024, -5081483, -11712913, -10979547, -9698036, +-13892072, 2230699, -23611582, -263604, -18268106, -8475581, 5550709, 11370389, 6492917, -8254391, +-1188095, 10812580, -809601, 12488154, -7541963, -7612293, -6725919, 5856188, -4454418, -5791227, +1946694, -6931004, -7061463, 8443369, 20024748, 7515119, 8527121, 3738232, -11894912, -2872796, +-9664750, -9143985, -1506997, -1715303, -7609072, -12152073, -24329380, -2342905, -8874476, 3066607, +-4547297, 9012452, 8364449, 4705137, 8757975, 6126771, -996969, 16912508, 24182814, 5714991, +-28456842, 5697274, -5150203, -16711718, 2253784, 8041790, 3975529, 636729, 7740605, -556198, +-13589277, 736587, 6353867, -13651017, -7181186, -12797392, -23609972, 18440978, 2506114, -1471026, +12883291, 10005126, 666794, 651224, 12734041, -17480516, -7617125, 1854889, 9381282, 7866233, +12075301, 8638253, -7212324, -4252555, -1630477, -2856153, -1078037, -1835562, -3519726, -4655208, +-7107097, -7221988, -5133023, -2821794, -796716, 3411815, -1954210, -1545115, -8133058, -5644124, +810675, 4152697, 2903398, 1650341, 1685238, 1110786, -1165010, -4245575, -2037425, -2689723, +-2322504, 695785, -4483409, 815507, -3202435, 3273839, -402653, -1279900, -3067144, 2686502, +-2821794, -1002338, 5608154, -2435783, -193274, 27567248, -20399484, 23830090, -1989107, -2851322, +-12119861, -4471598, -12040404, -10229001, 12733504, -11309723, 6586869, 28579250, 10631655, -4221416, +-12883828, -10810970, 12754442, -10404558, -17621178, -7248831, 1819992, 1699196, -20118700, 1444183, +-6094559, 10516764, -6346888, -277025, 2347737, 30056182, -7249905, -9575630, 14586783, -11578695, +17520246, -10215043, 12833362, 2170569, -9242770, -8451422, 16287590, -20993264, 16025060, -9037685, +1658394, -5011153, 8762807, -7248294, -3694209, -267362, -6455873, 30654256, -8791798, 20923470, +8128226, 9604084, -130997, 7926362, 13429289, 15042586, -4109210, -14565845, 93416, 12421582, +5014375, -2205466, -18321794, 24522116, -5118528, -16217260, -4482872, -9945534, 7683160, 10586021, +442919, 17746268, -4784057, 9100499, -20155208, -3568044, -21507048, -6706592, -7860864, -494995, +1207423, -4156455, 7696045, 2515240, -5795522, -9914395, -7339026, -2141041, -907312, -4976257, +-1055488, -1770063, 6090264, -1813013, 271120, -2318209, -9306120, -2831994, -3733400, 1129040, +-1540283, -5248987, -8127689, 3208878, -5490579, 2524367, 3624953, -5713917, -13939853, -3352222, +-2175938, -3741990, -4968204, 548682, -2317672, 1478543, 1646583, -6361921, -811749, -6405407, +5928666, 3607236, -3337190, 1573569, -5572720, -31242128, -13332115, 19185618, -3777961, -7838852, +22299470, 2151242, -11562052, 8469676, 12147778, 10307922, 1626182, -19210314, -7924215, 2958696, +2861522, 10073846, 6674379, 11361262, -9798968, -7732015, 3832722, -2641942, 9320616, -18054432, +-3033321, -19530290, -6295885, 3570192, -2667712, -2425583, 20953534, 4391067, -15479599, -2319819, +1272921, -15811922, -2120640, 812823, 9550934, 24098524, -8513699, 8081518, -13405130, 2061047, +-7878044, -10133438, 9829570, 21082384, -16656957, 1651415, 18766322, -8426726, -1712618, -6997576, +12287365, 2999498, -15226196, -148176, -5311264, -4908611, -1504312, -7450158, 11368778, -26912266, +5719286, 2296734, -11324755, 15135465, 23161148, 16384226, 44111460, 13414257, -11305428, -15626702, +-12943421, -7033009, 16195785, -5803038, 22487376, 2100776, 27381490, -32503238, -20867636, 9838159, +-5345087, -3331821, 13132399, -8829379, -1010391, 14001057, 6223408, 10394895, 15298137, 11985643, +-2594160, 4912906, -9362492, 367220, -367220, -6538551, -7194070, 4818954, -9911174, -816581, +14967424, 1394254, -8952322, -11651173, 2159832, -14646912, -5415417, 15817291, 8191577, -2557116, +-3631932, 3066070, -2943663, -4957466, 1045288, -3613141, -5632313, -941135, -7728794, 5476620, +4715874, 5245229, -2888903, -2035278, 3319473, 8095477, 22090090, -51231980, -1883343, 29466160, +-38884488, -1613297, 7842074, -40169756, 18219252, 5086315, 32485522, -3061238, 11582453, 9701794, +-35333624, -29218662, -11286100, -2676302, -17608292, -21674016, -11400991, 20359218, 14309220, 12403329, +1458141, 2448668, 6530498, 1425929, -25616796, -9472550, -32928978, -10394358, 18646064, 5678484, +12644384, 41776612, 10967736, 15897285, -508417, 8501888, 36786396, 27730456, 7829189, 18255222, +16740172, 36735392, 30179662, -39654896, 25089588, -2047089, 24016384, 24480776, 10266046, 44070660, +38915624, -21180094, 19331110, -83752, 18428630, -31871342, 3267933, 3664144, 1340567, -7055558, +20463908, 22206592, -21174726, -7009387, -12380780, 7943005, -17531520, -21731998, 20762946, 35389992, +13044889, 36823440, -10416906, 49961208, 48845588, 13833553, 25677462, -7239168, -12659953, 11671037, +11426224, 5687074, 3996467, 3203509, 6689412, -6721087, -12444668, -8782671, -23481124, -24529632, +-9870909, 11751567, -199716, 10388989, 1903207, 6412923, 15140833, 18652506, -5863167, 8675297, +-786516, -7402376, -6222334, -5198521, -15447924, -6929930, 340913, -13219372, -4675609, -11875585, +-6608881, 2841658, 16988206, -7746511, 6160057, 5003637, -2789581, 9570261, 5517423, 7363185, +259846, 12637404, 8012799, 5642514, -4915053, -7272990, -16315507, 23956254, 43021612, -5750961, +-58559196, -18611168, 6049999, -4451197, -9660992, -12735115, 260382, -33398202, -20054812, -27698780, +-4439386, -7976291, 9341554, -19712826, -5664525, 5539971, 9365176, -43487, 10409927, 20462834, +4230543, 29444148, -18798534, 7259569, 1209033, 28114856, 7346005, -5239323, -28073516, 18911814, +-4817880, 25691958, -21352430, -16713865, -16174310, -8367670, -25881472, -3291019, -4469451, -24093692, +13434658, 28043452, -13418552, 4414153, -36031016, 34956740, -10923712, -18547280, 15826954, 14166950, +-20602422, 2138357, -12837657, 4885526, -9400610, 43729748, -1588064, -3349538, -10675678, 76937360, +1975148, -10001905, 32821604, 26730266, -27801324, 22126060, -34067144, -18526342, -35603132, 27643484, +-24499030, 13573707, 18719614, 15347529, -31569084, 40315784, -7187091, -51733416, -59533616, -22982370, +-7329362, -16806744, 13873818, 14168560, 23546622, 4366908, 2046015, -17186848, 17782238, 28441810, +40920300, 11315091, -11751567, 4525822, 34810708, 6353867, -19256486, -4195646, 37141804, 9098351, +-22024056, -5117454, 18305150, 11199664, 16659104, 11853573, 23487566, 815507, 12870406, 5229660, +16592532, 8535711, 26415122, 9465571, 16652662, -2605435, 5157719, 1938641, -2077154, 7767449, +-2465311, 9885941, 16393890, 3244848, 9460739, 1978369, 12328704, -27420144, -6700149, 22565758, +-16466905, -78799232, 5681705, 50727860, -30573188, -20366198, 40739912, -29553670, -1879048, -8352638, +39101384, -67020816, 37539624, 22318260, -18891950, 7067369, 36672040, 26227754, -12794171, 15039902, +6753836, -10147934, 17260936, -296353, 10475962, 15933792, -6736120, 3911105, -1685238, 7645579, +-9682467, -7730405, -598611, 13696651, -39756364, -19601156, 19804094, -4375498, -26356066, -31055834, +5411122, 38857104, -16799764, -24661702, 19072876, 29015188, -6310381, 7376070, -5097053, 27038430, +-14614163, 40490804, -5450851, 190589, 22136262, 585726, 5102958, -28562070, 45081588, -23178864, +-28221156, 21527986, -29884382, -9753871, 5056250, 15034533, 41648296, -14646912, 25969520, -5157719, +13595719, -70398808, -53948548, -9772661, -21029770, 10910291, 9747428, 26921392, -4227322, -5469641, +31942208, -34833260, -775778, 22523346, 22095996, -7985418, 24618216, 3260417, -5247377, 35970, +-5467494, 23744190, -13104482, -1173063, 22980222, 5452461, -5216238, 9237401, -11419244, 3124589, +-875100, 579284, 9282498, 4536559, -13065827, -2794413, 4036733, -9962177, -14919106, -1074, +10896332, 19384262, -16203301, 18949396, 6398965, -18515068, 15516643, 17998598, -8973260, -20991116, +19488950, -9463424, 3577708, 10974178, -10710575, -27857158, 9162239, 7794829, -15574625, -14453102, +1063004, 10867341, -12366821, -5913633, -26510148, -12553116, 19080930, -33013802, 31912680, -28142236, +-35243964, 19601694, -17153026, -11665668, 20032802, -15432891, 16694001, -12184822, 7641284, 39239896, +-35549980, -2791729, -5630702, 33013266, 4253628, 2886755, -31853624, -29928406, -10794327, -8927090, +-4862977, -9829570, 5616744, 1469416, -3488587, 4657892, 6875169, 3151969, 5279052, -6372658, +15288473, -10362682, 14617384, -28388124, 737124, -23050016, -29791504, -17689360, 39003672, -17200808, +-17536888, -13117904, 8761196, -8105140, 17211008, 25177098, -26976690, 23634668, 4014721, -37205692, +-18763638, 76042936, 39318816, -58137752, -11165304, 36469640, -18913962, -21403970, 14519137, -18539226, +-40258340, 28418188, 12815109, -54660440, 22106734, 27259620, -32251984, -21399674, 32176284, -8239358, +-24702504, 5280126, 15820512, -39701604, 7173133, 6657736, 11040213, -30383672, -9251896, -2930778, +-9946071, -2396592, 1644436, 3015067, -18721226, 2564632, 26852136, 9072582, 1387811, 8605504, +-803159, -4863514, -15264851, -4992900, -8419747, -11339251, -25912612, 6446746, -14936823, -4436165, +31048856, -28153510, -18491982, 22740242, -17071422, -6477348, -7588671, 10018548, -18469970, -6995965, +28587302, 14908368, -14484777, 15844134, 8766028, -12482786, -8005282, 38955892, -31820876, -24895242, +41561860, -673236, -33816424, 4142496, 20269562, -20263118, -42142220, 27422830, 3071975, -46788300, +7590818, 12459700, -34216392, -1202054, 22332220, -6809671, -15444166, 11470784, 9104794, -23787140, +-2774549, 16692927, 48168596, 68131600, -26939108, 76244800, -5781026, -20592758, -15879568, -25523380, +-1951526, 12987981, 45060112, 1762010, 14024679, -11171210, -38472708, 948651, 1626719, 25712358, +5051956, -29023242, 54573464, -23009214, 10362145, 24643448, -26888106, -21787832, -38459820, -16732119, +24092620, 29969744, 36980204, -13685913, -89778240, 20145544, 47188804, 60421600, 51977156, -617402, +-25556130, -31743566, 11090679, 30891016, -19391778, -10202158, -79516488, -48686676, 43058656, 72255848, +14999100, -1835562, -17294760, -31408558, -7183870, 20136954, -27708444, 11068668, -3755949, 45710264, +-1738388, 17899814, -88938576, -11212549, 1312113, 54871428, 42656004, -1043677, -26485452, -7266011, +65371548, 29542396, -76237816, -94635848, -36768140, 19127100, 147301808, 15978889, -25315074, 20336670, +-39137352, 104565808, 32133872, -83118352, -51801600, -10297184, 74028592, 11154567, -30480310, -28407988, +-26085484, 21082920, 39981312, 19989314, -42538428, -3484292, -14453639, 35394288, -3566970, 21435108, +-7241315, -8930311, -28116466, 11134166, -8423505, -2953864, 22352084, -34612068, 20557860, -5166309, +-5007932, 225486, 16305843, 34474628, 17680232, 2406792, -6498286, 7354595, 0, 14033806, +4900021, 15477988, 4139812, 3962644, -17127256, 8163659, 9511742, 6334003, 446140, 5221607, +3570729, 15323370, 7540352, -12324409, 31393526, -36105104, 1153736, -14501957, 8379481, -22341346, +21034602, 5851893, -11895449, -22530862, -11068131, -4236985, 6595459, -30760018, 7129109, -15038828, +-5853504, -24071144, -11341935, 19611358, -20558934, -7216619, -2812667, 9620727, 6483253, -7951595, +11092290, -17590038, -1389959, 287226, 9493488, -11493332, 16790638, 12604118, -12751758, -14694157, +-5638219, 23948200, -17172352, 7625715, 17736604, 4047470, -17273822, -6520297, 7443715, -10746008, +8058433, 892816, 3900367, -15850577, 3358128, -12865038, -561567, 12185359, 15239618, 11985106, +-8814347, 11445551, 1432372, -14057428, -2107218, 102005, 16950088, -4510253, 3570192, 14887967, +-3184718, -19040664, 26808112, -10732586, 15852724, 11805254, 2720862, 3928285, -11347304, -13717052, +18455474, 3046743, 16231218, 5142150, 8828842, 4754529, -546535, -599685, -14248017, 1870995, +3756486, 5285494, 5566278, -1474248, 6487011, 1414655, -918049, 2096481, 761820, 7069516, +-1928977, 5588290, -6612102, -1344325, -96637, 848793, -3770445, -1748589, 12446815, 8252243, +-2246805, -8635032, -10283762, -3412889, -4227322, 11848741, 1024350, -3094524, -7723962, -3527779, +934155, -5921150, 13089450, 1617592, -5527086, 2655364, -408022, -1996623, 3574487, -3467112, +11324218, -10391137, 7719667, -10091563, -29118804, 54577760, 4990215, 3022046, -21992916, 12693239, +-1817845, 14356465, 10947335, 16795470, 1887101, 4312147, -9386651, 2758980, 15391552, -1460826, +8440148, -1291175, 2714419, 3441880, 6267431, -6461242, 11661910, -7869991, 1110249, -1229971, +3984656, -992674, 2380486, 8883066, 9738838, -4638028, 4322885, 1936493, -2123325, -4118874, +12956843, -3922916, 2779381, -3626563, 6799470, 5906, -6138045, 13024488, -8018167, -2745021, +3491272, -6056978, -3643743, -1847910, 590558, -2288144, 274341, -1195075, -3298535, 4460861, +-8296266, 5319317, 3632469, -2806224, 5599564, -4154307, 6622840, -3323768, 1326608, 1341640, +-3878892, 6520834, 78383, 960999, -1967095, 8762270, -10254234, 11077258, -7725036, 1388885, +1976222, -236760, 2119030, -1685775, 6456947, -5914707, 511638, 5553930, -6514929, 4220342, +3826816, -894427, 906238, 3817689, 1868848, -1654099, 2582886, 759672, -753230, 597000, +2280091, 341987, -2682207, 841814, 1235340, -1337346, 3295314, -615791, 2726231, -1604170, +531502, 2163053, -1255204, 427349, 1526861, -1969243, 3605088, -243739, 1832877, -358093, +3789772, -1212791, 541703, 3554622, -2933463, 4097936, -2209224, 1835562, -2274722, 4027606, +10452877, -49754512, -123906584, 19286014, 94407136, 87718264, 152150832, -38801808, -40703404, -103553272, +-141403744, -29131152, 51161652, 54757076, 103089416, 56020332, 4435628, -26736708, -71944464, -51126752, +-8820789, -7977365, 25654376, 23817742, 13762686, 8809515, 6924024, -3762391, -17673254, -1338956, +20434380, 189515, 4305168, -1136019, -15311558, -11693048, -26046292, -25486872, 11576547, 10716480, +23675470, 36039072, 26975078, 13216688, 4766340, -38825432, -27491012, -21227876, -21312702, -23728084, +4958003, 15198279, 26346404, 33705828, 27843736, 6113349, -3298535, -22285512, -22805202, -13502303, +-6611029, 2233920, 3745748, 7596724, 653909, -7244536, 2462090, -11591043, 6062347, 9943923, +1122060, 19857244, 23931558, 7459285, -4563940, -26288422, -34711924, -13916768, -6418292, -3992709, +17632988, 13733158, -3617436, 15568183, 16818018, 9479530, 11612518, -6382859, -12527883, -9996536, +-14411226, -11361799, -2145873, -10903848, -4361540, 658204, 8768176, 12484933, 17889076, 15531675, +14228690, 11385421, -5916318, -13368623, -22573274, -27722940, -16201154, -11996917, 1531156, 13312788, +19492172, 22701050, 17861158, 16547972, 10589779, -13969918, -25078314, -22542672, -11098732, -3172907, +-1065152, 1757179, 9526774, 8489003, 3990025, 1979980, 7786239, 4502200, 6767795, 1959579, +-10533407, -11460046, -7624104, -2997887, 3562139, 2608656, -3848291, -2097555, 3539590, 1918777, +1499481, 4835597, 7638063, 3541201, 120259, -3833258, -4506495, -3730716, -4631586, -5951214, +-4598836, -458488, 3103114, 4300873, 4996121, 4050154, 1229971, 60130, 96637, 234076, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -5836861, --78920, 1278290, 969589, 4165582, 547608, -510027, -2685965, 6121939, 3781182, 199716, --754304, 6081137, 2064269, -1942399, -5333276, 3403762, -1536525, 2643552, -5076115, 328028, --1214402, -3770445, -1023813, -1896765, -703301, 289910, 23622, -2748779, -1690070, -435939, --531502, -1708860, 1829656, -175020, -1831804, 3262028, -5426691, -2572149, 2587718, -3256122, -446140, -2020782, -2980707, 2026688, 1836099, -1596654, 2034204, 3926137, 2206540, -2034204, --2384781, 430570, 768799, -2398739, 2596845, 4330401, -3695283, -1177895, 2127620, 1596117, --882616, -1127966, -1806034, 2387465, 722628, -2856690, 3248069, 1585380, -2674154, -1999844, -3415573, -2576981, -3299609, -6209449, -5404680, 2943126, 3397319, 275952, 1489817, -586800, -1218697, -2297808, 3485366, -287226, 1611150, -1596117, 897111, -1453310, -1141388, 58519, -2231773, -490163, -573378, -997506, 329102, -752693, 150324, 265751, -466004, -539018, -67109, -25233, -185220, -591632, 298500, -215285, 7792682, -747861, -1573032, -3189550, -4988068, -2654290, -282931, -4051765, -4323422, -5437429, -2558190, 4265440, -4413079, -1649804, --1552631, 1479079, -1098975, -6058052, 3157875, 1518271, 11778948, -1202591, 5510980, -1098438, --290984, -533113, 608812, -2483028, 4561792, -1197759, -918586, -2752537, -504122, -984084, -7068980, 1312649, -715112, -6624450, -676994, -1273995, 1998770, -4210142, -1165547, 1139777, -950262, -1164473, -710817, -2616172, -985158, -3144453, -1415192, 6103686, -1796370, 1932735, -3407520, -824634, -3317325, -4352950, 1130650, 1021665, 1314797, 2705830, 3207267, 2641405, -1526861, -1209570, -1173063, -1399623, -6128382, -1465658, -623307, 2968359, 2530810, -1514513, --148713, 3260417, -3400004, 1340030, 97174, -849330, -1967095, -2996814, -37044, 1783485, -1803349, 1899986, -794032, 781147, -709743, 158914, 2672544, 1083942, 207232, 23085, --407485, -63351, 170725, 532039, -339302, -373125, 1159641, 594316, 1181116, 1210644, -248571, 672699, -173409, 194884, 88047, -541703, -1371705, -249645, -10328859, -2523830, --209917, -2211908, -1535988, 3609920, -7258495, -6084358, -3565897, -2379949, 1024350, 8143795, --1778117, -25233, 971736, -5852430, -1538672, -4889284, -765578, 8625368, -676994, -4210142, --2742874, 99321, 1750736, 1720134, -2433636, -10946798, -5246303, -1473711, -4233227, 379031, -186831, 4419522, -2870649, 3923990, 949188, -2035278, -5869073, -4916127, 6771553, -5616207, -3715684, 1079647, -3605088, -1357747, -3220152, -2314451, 3183645, -6031208, 3103651, 1048509, --106300, 999654, 412854, -609885, 125628, -3061238, -4193499, 290447, -1283658, -3099356, --1256815, -4787278, 5546951, 3794604, 952409, 4538707, 532576, -1942936, 5637145, -2987687, --1875827, -1926293, 4289599, -4203163, 1859721, 3011846, 163746, 1862942, 4672925, 1707250, --146029, 289910, 992674, 771484, -926102, -566399, 55298, -246424, 1498944, 724239, -1585380, 1175747, 450972, -1438277, -1683090, 1009854, -61203, -101469, 1534914, -1076426, --855772, -30065, 367757, 499827, -153008, -1731946, 1436667, 380641, -6940667, 8510478, -9656697, 2647847, 2600603, -2760053, 4507568, 2260764, -5636608, 1770600, 3641596, -6739341, --5878737, 5925981, -5149129, -743566, -3314641, 5972689, 1315334, -676994, -2182917, -38118, --3854196, 3599183, -1916092, 2182917, -915902, -23622, 3898220, 1534377, 562641, -1495186, -3820910, 2425046, 1149978, -317828, 3952444, -297427, 737661, -2472828, 4814659, 1088774, -1931125, 3521873, -9615895, -3118146, -1881196, -3437585, -3335579, 990527, 5394479, -2307471, --1415729, -2929705, -1298154, 1176284, 2384781, -6616397, -378494, 2332167, 290447, -509491, -2902324, 1893544, -6194954, -1722282, -1331440, 3864397, -4066797, 5451924, 5901285, 3095598, -1235877, -2724083, -122407, 487479, 3953518, -1037235, 496069, 489626, 618475, 5826660, -658204, 6207839, 2309619, 106300, -2942053, -1680406, 2560874, -504659, 19864, 262530, -176094, 580894, 2607045, 752693, 1032940, 114890, 998580, -2047626, -151934, 667867, -845572, -513249, -308164, 28991, 843961, -599148, -431107, 878321, 853088, 1578401, -747324, 1461900, -836445, 130460, 193274, -554588, 1389959, 10682121, -1991254, -159451, -3896609, 2520609, 1884954, 3598109, 9487046, -2655364, -877247, -9154186, 175020, -7867307, --9976672, 347892, 4242891, -12885439, 4366371, 4205310, 2304787, -3918084, -3096135, -4272419, --1622961, 239981, 267362, 4087735, 5405753, -748935, -5328981, -3239479, 4001299, -5731097, --2851322, -4845260, 1040993, -7825431, 3892851, 610422, -531502, 1249299, -253940, -1796907, -4832, 5025112, -5811628, 7028177, -5345087, -631360, 1296006, -3552475, -2898029, 2745021, -1355062, -1130650, -2718178, 5242545, 2189360, -3669513, -7334194, 841277, 1696512, 4282083, --178778, -1907502, 369904, 2263448, -1746441, 10189273, -3413425, -1669132, -7275675, -4831838, -11507291, 4660040, -2556579, -670552, -4000762, -4491999, -357556, 1588064, 306016, -2187749, -2485176, 1353452, 3444027, -379568, -2490007, 989453, 103079, -1152662, 1008244, 955093, --260382, 431644, 1362042, 431644, -322123, -1052267, 571768, 338229, -960999, 1872606, -1597728, 497679, -938450, -2444910, 176094, -211527, -91268, 1050656, -1195612, 759672, -1276142, -782758, 2943126, 6882148, -9192841, -5430986, 6428493, -4817343, -5130339, -5632313, --6733435, 4838818, -1702418, -200790, -1550483, 252329, -7492034, -1496259, 3425773, 3746822, -849867, -3956202, -5750961, -4772246, -6068789, 1228898, 7233262, 973347, 2338073, 2478733, -2410551, -4255239, 4455492, 2772938, -3189550, -2564632, -9826348, 1509144, 2187212, -7715909, --618475, 2370822, -1454920, 951872, -703301, -8278013, 7030862, -7712151, 6054830, 324807, -3046743, -8680129, -4864588, -7772817, -6137509, 1129576, -2195802, -2763275, -3464965, -26844, -3854733, -7192460, -135291, 2084670, -2335389, -8019241, -5033702, -1680943, 1496796, 3887482, -1675574, -6605660, 7031935, -2275259, -1554778, 7000260, -9204652, -3028489, -1847910, -1647120, -10981695, -4016868, -204548, -4168266, -3467112, 1991254, 1497333, -259309, 1159641, -887448, --1568737, 2044941, 10737, 829466, 861678, 2647311, -1059783, 763430, 572841, 172872, -679142, -3035468, 3921305, 3565897, -1239098, -628676, 542240, -529892, 657130, 103079, --294742, -1466195, 874026, -763430, 327491, 3469260, 2204392, 1858110, -1452236, 2471217, -972273, -1017370, 1111323, 365072, 817118, 14220100, -12597676, -6620155, -8378945, 6125160, -2331630, -4256850, 2896956, -23622, 8475044, 574452, 124017, -8094403, 5784247, 9359807, -9808632, 8169565, -4493610, -649077, 1290638, -5149129, -3519189, 1411434, 625455, -7438884, --3634079, -3106872, 3693135, -517544, -5621039, -2551748, 1894081, 4549444, 590021, -1516124, -106300, -3921842, -77309, -192737, 646929, -8507256, 5035313, 5950677, 1251446, 3096672, -3547643, -6873559, 9958955, 8996883, 1693828, -6110128, 3589519, -2120640, -9120900, -2265595, --2843805, -71404, 615254, -102005, -5487358, -4874251, -11339251, -9423158, 191126, 5835787, --5159867, 2505577, 805843, -3443490, -9223442, -837519, 5493800, -3517041, 4938139, 9672803, -2981244, -3869229, 5599564, 71941, -509491, 2714956, 4376572, -279710, -674310, 1291711, -2853469, -1434519, -6167573, 463856, -97711, 767189, 854699, 2198487, 4650913, -1530619, --723165, 3562675, 3218004, 785442, 537408, -2108829, 4488241, 611496, -213138, 2757369, -911070, 1081258, 532039, 2500745, 2204929, 2490007, 3979287, 432181, 2410014, 454193, -2674691, 1357210, 1556389, 1134945, 2538863, 2290828, -13496935, 1444720, -5030481, -18082886, --13909788, 3498788, 142808, -3102577, 3239479, 8724689, -1371168, 5236639, 4635344, 2706903, --1374926, -4690641, 3860102, -3991635, 498216, -3423626, 5455146, 9978820, -8941048, -2556043, -569083, 3642669, 980326, -2764348, -1613834, -3310883, -244276, -4103305, 5277441, 1184337, --6281927, 7034083, -7008850, -2219424, 8614631, 7607461, 6408628, -7275138, -4779762, -6514392, -7598334, 10308995, -139050, -2102923, 8170102, -11986180, 1491964, 3246995, -1146219, -10067403, -9096741, 3209414, 4630512, 8552354, 468151, -12152073, 3212636, 5027259, -3102577, -879931, -8410620, -8674760, -8152385, -7021735, 868657, 10849087, 5866389, -1534377, 12405476, -16456167, --6065568, 222801, 7946763, 3722126, -2367064, -13072270, -2029372, -5226975, 1474784, 5012764, -12782360, 2206540, -3588445, 1702955, -2157147, -818191, -4205847, 51540, -3462818, 1225676, -3498788, 2008971, 3222299, 3656091, 1167157, 813896, 45634, 680752, -1733019, -1791538, -182536, 3859565, 1461900, -425739, 696858, 1580548, 3088618, 454193, -1005022, 570157, --981400, 2514167, -4543539, -2718178, -1996623, 2912525, 2496450, -14540075, 14723148, 5992016, --345745, -1481764, 1250372, 2541010, 7982734, -1497870, 893353, -2535105, -1826972, 4510790, -2330557, 5235029, 2310693, 3029026, -9927817, -4104915, 16693464, 1705102, 4970888, 7024956, -2644626, -5637682, -10474351, 3281355, -4363150, 410706, 3701188, -5203890, -6126771, 7495792, -8791261, -4557497, -3238405, 6816113, -8344585, 3675418, -6419903, 2911451, -6213207, 9050570, -1269700, -1181116, 3189013, 15538118, 4291746, 6027987, -1743220, 804233, 2654827, 11477763, --985158, 16443282, 496069, 7819525, -276489, 14843944, 5257040, 11081016, 8406325, -1855963, --4956929, -1328219, -5663988, -6246493, 8700530, -1748052, -3394098, 1356673, 130460, -4440996, --2163590, 1360968, 3894999, 1082332, -7437810, -7368017, -3828963, -7522635, -195958, -155693, --2211371, 2087891, -148176, 3062312, -448824, -3067144, 634581, -1294396, -5670431, -3575024, -811212, 7587597, -3197066, 2810519, -856846, -79994, 3517041, -2636573, 1195612, 1724966, --1926830, -1313186, -947577, -2169495, 1069447, -2713346, -3541201, -1348620, -3837017, 4812511, --1351304, 295279, -413927, -284542, 508954, -1591285, 710280, 1219771, 624918, 1963337, -2602750, 463856, 1939715, -1447404, -4151623, 831076, -1150514, 1743220, -1698660, 17060146, --4481262, -151934, -21030308, -751082, 11235634, -5887864, 9762461, -13380971, 1938641, 1337882, --391379, -17743584, -804233, -29561724, 1389422, -3267933, -12383464, -2168422, 1653026, -6496138, -1118839, 7459822, 1142461, -6777996, 1249836, -2108292, 6547141, -7288560, 416075, 9462350, -2128156, 768799, -1421634, 7246684, -4683662, 744640, -37044, 5556614, 1069984, -9993315, --5320391, -7055021, 8239358, -18703508, 9035001, 7414724, 6380174, 3546032, 1385664, -8200167, -5820755, -12134356, -2875481, -2568927, -2518462, -559956, 761283, 3864934, -9320616, -3684008, -15708843, 6559489, -5734318, -6687264, 1705639, -2794413, 4787278, -3222299, -971736, -5113696, -14246407, 7229504, -4891968, 863825, -7257958, 1654099, -5479305, -1923072, 5657546, 5248450, --1646046, 10368051, -4085051, 5127654, -6812355, 7228967, 1061394, -4256313, -5735929, -8571681, -2166274, -972810, 3892314, -1127966, -2522757, 1531693, 1596654, 2547453, 2085207, 4729833, --180389, 1495186, -3679713, 2936147, -2641405, -1369021, -1981054, -432181, -4684199, -847182, -1833414, 4191351, -4025458, -1988570, -2908230, 2860985, 2239826, -1905892, -362925, -3176665, -2412698, 10828149, 10940892, 6352257, 5672578, -5318244, 6309844, 10517838, -7812009, -278636, --20275466, 11618423, 7928510, -2887829, 4697621, -1303523, 1621350, 7234336, -4539781, 11315628, --10202158, 985695, 12741020, 5581847, 784368, 9835475, -3477850, 4519916, 2593087, 5270999, -8705899, -5141076, -1042066, 16058883, 8028368, -348429, 2217277, -10875394, 14776835, -12437152, --783295, 12942347, 4016868, 13933948, -8742406, 2237678, -565325, -3405372, 1869385, -13452911, --9439264, 12687333, -6317360, -2713346, -4290136, -14306536, 10162429, -3369939, -2370822, -6336688, -6251325, 14544907, -11464341, -2330020, 9803263, -10764799, -4698694, 8763881, 12220793, -20199232, --5390184, -1729798, 8619999, -302258, 10066866, -2441689, -7378754, 493921, 5357435, 13049721, -6577206, -8764418, -459025, 6422587, -13007845, -7958575, -2492692, -6657200, -6775311, -792421, -6168647, -5833103, 1441498, 6437082, 1784022, 1158031, 4494684, -1107565, 2892124, 2801393, -2736968, 1581622, -518080, -3910568, -1340567, -1083406, -3575024, -1606318, 547608, 467078, --542240, 566936, 3929895, -3238405, -1060320, -2403034, 1877975, 1858110, -783295, -2680597, --5962489, 3010772, 2255395, 3878892, 1045288, 955093, -435402, -3686693, 1475858, -1475321, --1708860, -1065152, 10573136, 22405770, 4331475, -13243532, -4720169, 4399657, -29387776, 928787, -179852, -4599910, -1442035, 13577465, -22179748, 4880157, 10369125, -8155069, 9189619, 17144436, -4250407, -15838229, 4288525, -3986267, -287226, -15524696, -4690105, 14166950, -1591285, 12990665, --3418794, -4548371, 2125472, -10986526, -6179384, -7907572, -5867999, -4319127, 10597295, -11704323, -1903207, 20461224, 13810467, 4618164, -20795694, 3461744, 13644037, 5715528, 811212, -7410966, --9030169, -22194780, -15337328, 3177739, -7590281, -7582765, -438087, 9492415, 6717866, -6667400, -290984, 13503377, -5196374, -2276333, 612570, 17751100, 674310, -883153, 9023189, 2835752, --20193326, 5674189, 5848672, -88047, -16723529, 7068980, 9795210, -7338489, -5243618, -13699872, -3650185, -5019743, 5190468, 2623688, -3230889, -5796595, 3784403, 1755031, 5843840, -2888903, -9114994, 3245922, -6257231, 776315, -326418, -8564702, 159451, 723702, -31675, -146566, --4530654, -3887482, -1826435, -75699, 5713380, 1931662, 2986613, 4665408, -2117419, -2706903, -2194728, -4431333, -4010426, -124554, -225486, 1440425, -1328219, 1060320, 2810519, 3045669, -370441, -1722282, -429497, -178241, -506806, 92342, -745714, 418759, -103079, 3958349, --2238215, -2728378, 7094749, 5151277, -685047, 2047089, -6592775, 23167054, 1289564, -4651450, --300648, 10251550, -4913980, 2841121, -2469606, 2438468, 8795556, -15975668, 16921098, 19163070, -5410048, 8125005, -6461779, 10879689, 25228638, 847182, -2859911, -4611721, 10756746, -3769371, --6069863, -2092186, 3834332, -12516072, 5616207, -11018739, 12679280, 2915746, 12768401, -7951058, -11641509, 3500398, 15228343, 2561948, 3233574, -5393405, 9497246, 2418067, -2966212, 13698798, --5282810, -9677098, 19346680, 15451682, 5728413, 14608258, 21166136, 25655988, -7924752, -7976828, --8996883, 3253975, -11720966, 13927505, -1676111, -1213865, -19648402, 4627828, 22382686, 22808424, --838056, -2925947, -15573551, 301185, 14873472, -7516193, -9207873, 8447127, 1362042, -8031052, -2916283, -1255204, -4893579, -1056562, -4190278, -111132, 8650601, 6460168, -1705102, 1600412, --2033667, -8533563, -11155641, -2025614, 5630166, 2324114, 7948374, -1527398, -7398081, -1971927, -8240432, -3784403, 4709969, 7611756, -7543573, -1953136, -692027, 1998234, -362925, 5106716, -3737695, 1891933, -7519414, 1988570, 4189204, 1330903, 1749125, 2808372, -6667937, -3062312, -49929, -268972, -3517578, -8639327, -2782065, 847182, 4560719, 1075889, -3529926, -4080219, --30380452, -21248276, 11064909, 4254165, -15961709, 1571421, 6951405, -14556718, -9190693, -6317360, -17196512, 7673496, 5445482, -5561446, -4297652, -4434017, -10838350, -14420890, -25361246, 13104482, -11200738, -5427765, 28470264, 13655312, 27333708, 18753974, 1676648, -8835821, 7188165, 3313567, -12391518, 14271639, 15752866, -2326262, -2859375, 6697465, -7231115, -1704565, -6382859, -11882027, --19531364, -5716065, 19734838, -4951561, -7987566, -11256036, 7804493, 11955578, 7905961, 750009, -11596949, 22721988, -13654775, -6229313, -10529112, -7616051, -22009560, -5397164, 5464809, -10011569, --7888781, -25286620, -36046588, 3912715, -23778550, -37317896, -27064200, -11378442, 24055574, 8318815, -14646912, 11020886, -24943022, -10519449, 2062658, 12439836, -12437152, -14670535, -14246407, -4430259, -7307350, -8443369, -31070330, -19522774, -4549981, -6300180, -2323577, -4618164, 17399986, 15947214, -16453483, 16858820, 5519570, -161061, 6247030, 1753957, -628139, 4973036, -14056891, -5408975, -5964099, 8160975, -474594, -4559108, -5145908, 2041183, -7700340, -11060078, 10055592, -8242042, --4272956, 907312, -9711995, -9073118, -16498580, -6405944, -3955665, 1161789, 13593035, -3525631, --2135136, -4344897, 6880538, -3687766, 272194, 6671695, 433792, -4712653, 2960306, 6656663, --4193499, -997506, -319438, 3524558, -57669064, -9054328, 18529562, -19633906, 8053601, -7653095, --31289374, -9751186, 33492692, 42184096, -22407382, 777926, -7725573, -34428996, -27423366, -25912612, --27657442, -14790257, -18066780, -1501628, 5893232, -4825396, 7033546, 6484864, -11336029, -3115999, --15550466, 6501507, -24473798, -22049826, 5258651, 3774203, -6691559, -8104067, 19149112, -5680631, -26601954, 5854578, 24654722, -16752520, 10714870, 6936909, 29868276, 15937550, 10444287, 2809982, -4482872, -3597035, 8741869, 12264279, -9721122, -13556527, 20883742, -2959769, -26322780, -50470160, --60679296, -43781288, 7185481, -150861, -56516400, 18258442, 9532680, 14047227, -19331648, 2354179, -6553583, 2422362, 28869160, 29417304, 58891516, 19495930, -31553514, -40491340, -24925306, -22419192, --25925496, -23087060, -913754, 12466679, 16816408, -11024644, 22172232, -19246286, -26808112, -20893406, --13919989, -10515691, -20983600, 12924630, -1584843, 12353937, 9454834, 1292785, 21755084, -11647951, --5167920, -21964462, 7181186, 11441256, -1986422, -2149094, 6423661, -21110302, 595390, -7649337, -3820374, -10289131, -14547054, 8489003, -602369, -6196564, -2469606, 10012106, -8249022, 5063767, --7694971, 5796595, 5039071, -3196530, -7645042, 4450123, 4928475, -15661061, 6209986, -4181688, --4756677, -4997195, 3095598, -10262824, -4698694, 32355600, -8655433, -61085172, -17468706, 50333796, --6975027, 11251741, 7160784, 9429601, 17609366, 14468134, 5022428, -9925133, -3717294, 2547453, --10895258, -2479270, 18460844, -16486232, -9871982, -16522739, -3995930, 2919504, 2102387, 4463008, -8616778, -12539694, 11216844, 27623620, -522375, -15993921, 1443646, -10432476, -3651259, 16429324, --17260400, 2044941, 5424544, 20078972, 28915868, -18300318, -10523207, 11316165, 1524177, 3273302, -3338800, -12093554, -31200790, -5456756, -14532559, 28490666, -53893788, -35302484, -14599668, -5748814, -15549929, 3386582, -19035832, -3077881, -21929030, -23539642, -8489540, -16983374, 3105261, 14179298, -64756296, 12138114, -9644886, -41539312, -34280280, 10299868, -1070521, -38981124, 21095806, 21143050, --39814884, -603980, 10327249, 11635066, 42885248, 18994492, 8937290, -42261404, -21898428, -29112362, -26603564, -2529199, -8763881, -4582193, 8274792, 28255516, 23810224, -12397423, -25206090, -36603860, -8877161, 21926344, -7722351, -3591667, 19108846, 11135240, 16645683, 4414690, 5892695, -13971529, --4293894, -6498286, 7155953, 7739531, -2058900, -3074660, -2191507, 10375567, 11324755, -16457778, -9580998, 7557532, 13696651, -8602819, -6234145, 8894340, 2960843, -11802033, -1361505, 14417668, -2577517, -10206990, -21426518, -72515688, 10282152, 11188390, -2464774, -1225139, -5648419, -20915954, -8118562, -4654134, 36888400, -38203736, -7859254, 38875360, -1874216, -26397406, -3318936, 22903986, -27858768, 17086454, -5107790, 19917374, -15211700, 13426068, -6235219, -5266704, -13178033, 21821656, -14814416, -14405320, -6687264, -2193655, 22125524, -2207613, 2252710, -14391362, 14869714, 9612137, --16582869, 29752850, 1217086, -26988500, 23607288, -29311542, -15522549, 26451630, -56852484, -36283348, -30713312, -19721952, 22734872, -36095980, 7888245, 13060459, -19906636, 622770, -1693291, -37252936, --8749922, 38198364, 40324376, -46169288, -15420006, 13915157, -37047852, 47522740, 47589848, 6701760, --68454264, -35993436, 72507640, -38511360, -7794829, 58788976, -34710852, -70666704, -15966004, 63578400, --13849659, -46630996, -11561515, -85021024, -4006668, 68650760, -25192668, -68745784, -7102266, -19391778, --9372692, 20312510, -2566780, -919123, -25130390, -16472273, -8091182, 27391154, -35029752, 1611150, -5489505, -11040213, 1118839, 32625108, -21053930, -26421028, -3593277, 9120363, 20426864, -8269423, -10228465, 15549392, 1691143, -23861764, -12780212, 441308, -19040664, -9301825, 36140004, -13772350, --35458712, -9576166, 20524574, 8437463, -2772938, 4490925, -32072132, -18531174, 24260122, 35989140, -4288525, -26847304, -13152264, 1061394, 9466645, 17995376, -10561325, -40075268, -37822020, -1156957, --47663936, -14195941, -20425790, -19201188, -14594836, 30654256, -3648575, -10026601, -13274133, 5869610, --16906066, -39692476, 30370250, 9490804, 26204670, 8142721, 27113592, -11029476, -17147656, 5923297, --28849832, 22085258, -26147224, -5627481, 16857210, -19811074, -4370129, -12088722, -31593242, 4582193, --23901494, -17246978, -20876226, -15469935, -9646497, -21192980, 3524021, 23179402, -15964930, -5772973, -2707440, 21346524, -9963787, 7461969, -22207666, 35650376, 11047193, 15197205, 9662066, 34183644, --2158221, -40523016, 8770323, 14494978, -11345693, -295279, 21126944, -28242094, -27959700, -32752346, -28030030, 8169565, -40183176, 15445239, -26550950, -5344550, -37493992, 16374026, 26485452, 5319854, --41512468, 23082228, 19154480, -5478768, -36486284, 9636296, -22034256, -7723425, -1634772, -11326366, -17997524, -16491601, -29581588, 14456323, -6629282, 12189117, -193810, -1329829, -219043, -8252243, --9220758, 6008123, 26356604, -3453154, -37266356, -10554345, 15495705, -18664854, -7852811, 17627082, --6743099, -2831994, -14895483, 28951300, 17169132, -8888435, 13149579, -2613488, 5918465, 23422604, --4279398, -21048024, 8699993, 13241921, -10684805, 16787954, -2731062, 10241350, 1255204, -8028905, -14304389, 20447266, -11836930, -22167400, 8612483, 13123809, -10718091, -2500745, 12541305, 3995930, -35314832, 66304096, -15899969, 32900524, 6442451, -15614890, -29567092, -17223356, 38592428, -12593918, -7210177, 14994805, -3841848, 35563404, -5173288, 27916214, 29196650, -35734664, 18490908, -9333501, -926639, 13152800, 10946261, -1187022, 5873368, 10650982, 35738960, 36715528, 28367186, -20685636, --6999186, -48734456, -1401770, 11547020, 22080426, 5105643, -40273372, 17703856, -24142012, 31331786, --28195924, -19748260, 2122251, -23636278, -3977140, -13636521, 48272748, -26313118, -12808129, -50482508, --16342351, -26494042, 71402760, 43375412, -14936823, -48023640, -51418276, -30593052, 35571456, 46309948, -23569170, 6842957, -61711700, -28685550, 20418812, 17362942, 2793339, 22374096, -12719009, -40679244, -19368692, -69022808, 75196288, -7012608, -48423608, 112950120, 16315507, 39310224, 67810016, -112115824, --80661632, 22382686, -6536940, 17146046, 24677808, -70092256, -5065377, 14149770, 1537061, 58721328, -4296041, -30749818, -3080565, 31561030, -18187040, 13786308, 16355772, 639413, -12706661, 15431281, --40674952, 31144418, -7825431, -13008919, 17723720, 4670240, 1392643, 18439906, -4218195, 11036992, --2118493, 7074885, -5185100, -21460340, 13155485, 9037685, 12448963, -151934, 511101, 8400419, -4837207, 3239479, 25103010, 27685896, 1739999, 18127984, -16934520, 2539400, -11070278, 20964272, -19316078, 2918430, -5394479, -12666932, -29463476, 2429341, -29357712, 19871204, -41475964, 25678536, --17064978, 42136852, -18996640, -1957431, 24012088, 4270271, 2116882, -10860899, -9392020, 1096827, --16121697, 17779018, -2055142, 18879066, -14783814, -14595373, 4989142, 743029, -14985678, 9458055, --1867237, 8253854, -4581120, -4059818, 7918309, -7531762, -582505, 5879274, -3026878, -3597035, -29931090, -2057826, -9973988, -5358509, 14235669, -1301375, -16243566, 8639864, 17537426, 3531000, -464393, -10359998, 3723737, -8391829, 8069707, 21250424, -7495255, 9713069, -7960722, -2396055, --8723615, -4159676, 5663988, 6867116, -12362526, 7477538, 2283849, -1588601, -12357158, 2121177, -4580583, -9216463, 13415867, 11187316, -22369800, 5719823, -20525112, -23423678, 16173236, -8348880, -19521164, 10576894, 666257, 9947681, -3029026, -12093017, -2806224, 709743, 13633837, -6126771, -4236449, 5567888, -7701950, -1432909, 4794257, -2368675, -1414655, 7826504, 537, 2990908, --6371047, 2682744, -569083, -6683506, 12720619, 1093606, 10403485, -5053566, 8563091, -4256850, -696858, -6663105, 5762236, -3246459, 12606803, -3913252, 11929809, -12173548, 2802466, 780073, --2441689, 401043, 1600412, 9381819, -296890, -11077258, 7431367, -6252936, 1301375, 6683506, --6725919, 11698954, -24361592, 51601348, 9773198, 12713103, -6512244, 4763656, -1458678, 9816685, -3121368, 22022444, 1550483, -11870216, 7274601, -7727183, 3426310, 4552666, -10045929, 587874, -2472828, -10845866, 9977746, 2605435, -4434554, 13421773, -4738423, 5338645, -4048544, 2546916, -2589329, 1279363, -1639604, -3894462, -1784022, 1929514, 372052, -2168422, -6459094, 4912906, --4323959, 2481954, 4312147, -4386772, 987843, -4092567, 1235877, -6527814, -10639171, 11095511, --5880884, -2795487, 4727149, 2217277, -1838246, 1319092, 9530532, -10392210, 4571993, -3876745, -8263517, -8723615, 5049271, 2528125, -1501091, 1988033, 257161, 183610, 4071092, -5493263, -3181497, 2819646, -1455457, -479426, 7232725, -1040456, 2498597, -8267812, 11292006, -8650064, --79994, 5688148, -5018670, 3903589, 1309965, 1421634, -5249524, 4348118, 4509179, -2732136, -1818382, 2279554, -3724274, 1395864, 1914482, -752156, 3966939, 239444, -31675, -354872, -3566970, 2772402, -2171106, 3117073, -1512902, 1432909, 1602023, -317291, 4423280, -1902671, -90194, 2851322, -3392487, 340913, -291521, -2376191, 404801, 2558727, -679142, -1986959, -4407174, -2714419, 9754408, -45804752, -113715168, 24567750, 94564976, 63926832, 133378600, -43619152, --37289444, -76732808, -122642792, -12117713, 38227356, 50395000, 65765612, 33160906, 3637301, -10746545, --28434830, -40550396, -6144488, -10827613, 3993783, 9315247, -483184, 2345589, 4903242, 2182380, -16060493, 19078244, 11851425, -2179696, 2202245, -14105209, -29614336, -31549220, -15476915, -20689932, -17043504, 31428424, 33343978, 36621040, 20061256, -5910949, -14462765, -26898306, -28432684, -19742354, --11120744, -1266479, 7172059, 13817447, 14812805, 12479564, 10733123, -1829656, 2878702, -3161633, -1415192, -2371359, -1479079, -837519, -10089952, -10545755, -7662759, -15903727, 9664, -2978560, -1994476, 27105538, 35668628, 12068321, 12079059, -9762998, -19623706, -13530758, -23627152, -18938658, -6671158, -1599875, -11461657, 8829916, 9411347, 11272142, 26692148, 11147588, 11700028, 2950643, --14396194, -14135811, -11617887, -12621835, -16047072, -13647259, -8172249, 2565706, 17818208, 26927298, -25154012, 10253698, 5066451, -6506876, -12207371, -10909754, -12099997, -13897440, -6401649, -5753109, --498753, 4764730, 3593814, 10902774, 14368813, 10471667, 7074348, 2563559, -933619, -6751689, --7075422, -10926397, -12399034, -9655623, -8703214, -2121177, 9212168, 13889924, 14851997, 13303124, -5356898, 2531883, -6673843, -10450192, -5654862, -7698192, -10627360, -7919920, 1420024, 7295002, -6718403, 3897683, 4257923, 3983582, 2929168, 984621, -800475, -1020592, -2873870, -3522947, --3422015, -3826816, -4690105, -2426120, 1854352, 3567507, 3937411, 2598992, 1114007, 340376, -282394, 299574, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-78920, 1278290, 969589, 4165582, 547608, -510027, -2685965, 6121939, 3781182, 199716, +-754304, 6081137, 2064269, -1942399, -5333276, 3403762, -1536525, 2643552, -5076115, 328028, +-1214402, -3770445, -1023813, -1896765, -703301, 289910, 23622, -2748779, -1690070, -435939, +-531502, -1708860, 1829656, -175020, -1831804, 3262028, -5426691, -2572149, 2587718, -3256122, +446140, -2020782, -2980707, 2026688, 1836099, -1596654, 2034204, 3926137, 2206540, -2034204, +-2384781, 430570, 768799, -2398739, 2596845, 4330401, -3695283, -1177895, 2127620, 1596117, +-882616, -1127966, -1806034, 2387465, 722628, -2856690, 3248069, 1585380, -2674154, -1999844, +3415573, -2576981, -3299609, -6209449, -5404680, 2943126, 3397319, 275952, 1489817, -586800, +1218697, -2297808, 3485366, -287226, 1611150, -1596117, 897111, -1453310, -1141388, 58519, +2231773, -490163, -573378, -997506, 329102, -752693, 150324, 265751, -466004, -539018, +67109, -25233, -185220, -591632, 298500, -215285, 7792682, -747861, -1573032, -3189550, +4988068, -2654290, -282931, -4051765, -4323422, -5437429, -2558190, 4265440, -4413079, -1649804, +-1552631, 1479079, -1098975, -6058052, 3157875, 1518271, 11778948, -1202591, 5510980, -1098438, +-290984, -533113, 608812, -2483028, 4561792, -1197759, -918586, -2752537, -504122, -984084, +7068980, 1312649, -715112, -6624450, -676994, -1273995, 1998770, -4210142, -1165547, 1139777, +950262, -1164473, -710817, -2616172, -985158, -3144453, -1415192, 6103686, -1796370, 1932735, +3407520, -824634, -3317325, -4352950, 1130650, 1021665, 1314797, 2705830, 3207267, 2641405, +1526861, -1209570, -1173063, -1399623, -6128382, -1465658, -623307, 2968359, 2530810, -1514513, +-148713, 3260417, -3400004, 1340030, 97174, -849330, -1967095, -2996814, -37044, 1783485, +1803349, 1899986, -794032, 781147, -709743, 158914, 2672544, 1083942, 207232, 23085, +-407485, -63351, 170725, 532039, -339302, -373125, 1159641, 594316, 1181116, 1210644, +248571, 672699, -173409, 194884, 88047, -541703, -1371705, -249645, -10328859, -2523830, +-209917, -2211908, -1535988, 3609920, -7258495, -6084358, -3565897, -2379949, 1024350, 8143795, +-1778117, -25233, 971736, -5852430, -1538672, -4889284, -765578, 8625368, -676994, -4210142, +-2742874, 99321, 1750736, 1720134, -2433636, -10946798, -5246303, -1473711, -4233227, 379031, +186831, 4419522, -2870649, 3923990, 949188, -2035278, -5869073, -4916127, 6771553, -5616207, +3715684, 1079647, -3605088, -1357747, -3220152, -2314451, 3183645, -6031208, 3103651, 1048509, +-106300, 999654, 412854, -609885, 125628, -3061238, -4193499, 290447, -1283658, -3099356, +-1256815, -4787278, 5546951, 3794604, 952409, 4538707, 532576, -1942936, 5637145, -2987687, +-1875827, -1926293, 4289599, -4203163, 1859721, 3011846, 163746, 1862942, 4672925, 1707250, +-146029, 289910, 992674, 771484, -926102, -566399, 55298, -246424, 1498944, 724239, +1585380, 1175747, 450972, -1438277, -1683090, 1009854, -61203, -101469, 1534914, -1076426, +-855772, -30065, 367757, 499827, -153008, -1731946, 1436667, 380641, -6940667, 8510478, +9656697, 2647847, 2600603, -2760053, 4507568, 2260764, -5636608, 1770600, 3641596, -6739341, +-5878737, 5925981, -5149129, -743566, -3314641, 5972689, 1315334, -676994, -2182917, -38118, +-3854196, 3599183, -1916092, 2182917, -915902, -23622, 3898220, 1534377, 562641, -1495186, +3820910, 2425046, 1149978, -317828, 3952444, -297427, 737661, -2472828, 4814659, 1088774, +1931125, 3521873, -9615895, -3118146, -1881196, -3437585, -3335579, 990527, 5394479, -2307471, +-1415729, -2929705, -1298154, 1176284, 2384781, -6616397, -378494, 2332167, 290447, -509491, +2902324, 1893544, -6194954, -1722282, -1331440, 3864397, -4066797, 5451924, 5901285, 3095598, +1235877, -2724083, -122407, 487479, 3953518, -1037235, 496069, 489626, 618475, 5826660, +658204, 6207839, 2309619, 106300, -2942053, -1680406, 2560874, -504659, 19864, 262530, +176094, 580894, 2607045, 752693, 1032940, 114890, 998580, -2047626, -151934, 667867, +845572, -513249, -308164, 28991, 843961, -599148, -431107, 878321, 853088, 1578401, +747324, 1461900, -836445, 130460, 193274, -554588, 1389959, 10682121, -1991254, -159451, +3896609, 2520609, 1884954, 3598109, 9487046, -2655364, -877247, -9154186, 175020, -7867307, +-9976672, 347892, 4242891, -12885439, 4366371, 4205310, 2304787, -3918084, -3096135, -4272419, +-1622961, 239981, 267362, 4087735, 5405753, -748935, -5328981, -3239479, 4001299, -5731097, +-2851322, -4845260, 1040993, -7825431, 3892851, 610422, -531502, 1249299, -253940, -1796907, +4832, 5025112, -5811628, 7028177, -5345087, -631360, 1296006, -3552475, -2898029, 2745021, +1355062, -1130650, -2718178, 5242545, 2189360, -3669513, -7334194, 841277, 1696512, 4282083, +-178778, -1907502, 369904, 2263448, -1746441, 10189273, -3413425, -1669132, -7275675, -4831838, +11507291, 4660040, -2556579, -670552, -4000762, -4491999, -357556, 1588064, 306016, -2187749, +2485176, 1353452, 3444027, -379568, -2490007, 989453, 103079, -1152662, 1008244, 955093, +-260382, 431644, 1362042, 431644, -322123, -1052267, 571768, 338229, -960999, 1872606, +1597728, 497679, -938450, -2444910, 176094, -211527, -91268, 1050656, -1195612, 759672, +1276142, -782758, 2943126, 6882148, -9192841, -5430986, 6428493, -4817343, -5130339, -5632313, +-6733435, 4838818, -1702418, -200790, -1550483, 252329, -7492034, -1496259, 3425773, 3746822, +849867, -3956202, -5750961, -4772246, -6068789, 1228898, 7233262, 973347, 2338073, 2478733, +2410551, -4255239, 4455492, 2772938, -3189550, -2564632, -9826348, 1509144, 2187212, -7715909, +-618475, 2370822, -1454920, 951872, -703301, -8278013, 7030862, -7712151, 6054830, 324807, +3046743, -8680129, -4864588, -7772817, -6137509, 1129576, -2195802, -2763275, -3464965, -26844, +3854733, -7192460, -135291, 2084670, -2335389, -8019241, -5033702, -1680943, 1496796, 3887482, +1675574, -6605660, 7031935, -2275259, -1554778, 7000260, -9204652, -3028489, -1847910, -1647120, +10981695, -4016868, -204548, -4168266, -3467112, 1991254, 1497333, -259309, 1159641, -887448, +-1568737, 2044941, 10737, 829466, 861678, 2647311, -1059783, 763430, 572841, 172872, +679142, -3035468, 3921305, 3565897, -1239098, -628676, 542240, -529892, 657130, 103079, +-294742, -1466195, 874026, -763430, 327491, 3469260, 2204392, 1858110, -1452236, 2471217, +972273, -1017370, 1111323, 365072, 817118, 14220100, -12597676, -6620155, -8378945, 6125160, +2331630, -4256850, 2896956, -23622, 8475044, 574452, 124017, -8094403, 5784247, 9359807, +9808632, 8169565, -4493610, -649077, 1290638, -5149129, -3519189, 1411434, 625455, -7438884, +-3634079, -3106872, 3693135, -517544, -5621039, -2551748, 1894081, 4549444, 590021, -1516124, +106300, -3921842, -77309, -192737, 646929, -8507256, 5035313, 5950677, 1251446, 3096672, +3547643, -6873559, 9958955, 8996883, 1693828, -6110128, 3589519, -2120640, -9120900, -2265595, +-2843805, -71404, 615254, -102005, -5487358, -4874251, -11339251, -9423158, 191126, 5835787, +-5159867, 2505577, 805843, -3443490, -9223442, -837519, 5493800, -3517041, 4938139, 9672803, +2981244, -3869229, 5599564, 71941, -509491, 2714956, 4376572, -279710, -674310, 1291711, +2853469, -1434519, -6167573, 463856, -97711, 767189, 854699, 2198487, 4650913, -1530619, +-723165, 3562675, 3218004, 785442, 537408, -2108829, 4488241, 611496, -213138, 2757369, +911070, 1081258, 532039, 2500745, 2204929, 2490007, 3979287, 432181, 2410014, 454193, +2674691, 1357210, 1556389, 1134945, 2538863, 2290828, -13496935, 1444720, -5030481, -18082886, +-13909788, 3498788, 142808, -3102577, 3239479, 8724689, -1371168, 5236639, 4635344, 2706903, +-1374926, -4690641, 3860102, -3991635, 498216, -3423626, 5455146, 9978820, -8941048, -2556043, +569083, 3642669, 980326, -2764348, -1613834, -3310883, -244276, -4103305, 5277441, 1184337, +-6281927, 7034083, -7008850, -2219424, 8614631, 7607461, 6408628, -7275138, -4779762, -6514392, +7598334, 10308995, -139050, -2102923, 8170102, -11986180, 1491964, 3246995, -1146219, -10067403, +9096741, 3209414, 4630512, 8552354, 468151, -12152073, 3212636, 5027259, -3102577, -879931, +8410620, -8674760, -8152385, -7021735, 868657, 10849087, 5866389, -1534377, 12405476, -16456167, +-6065568, 222801, 7946763, 3722126, -2367064, -13072270, -2029372, -5226975, 1474784, 5012764, +12782360, 2206540, -3588445, 1702955, -2157147, -818191, -4205847, 51540, -3462818, 1225676, +3498788, 2008971, 3222299, 3656091, 1167157, 813896, 45634, 680752, -1733019, -1791538, +182536, 3859565, 1461900, -425739, 696858, 1580548, 3088618, 454193, -1005022, 570157, +-981400, 2514167, -4543539, -2718178, -1996623, 2912525, 2496450, -14540075, 14723148, 5992016, +-345745, -1481764, 1250372, 2541010, 7982734, -1497870, 893353, -2535105, -1826972, 4510790, +2330557, 5235029, 2310693, 3029026, -9927817, -4104915, 16693464, 1705102, 4970888, 7024956, +2644626, -5637682, -10474351, 3281355, -4363150, 410706, 3701188, -5203890, -6126771, 7495792, +8791261, -4557497, -3238405, 6816113, -8344585, 3675418, -6419903, 2911451, -6213207, 9050570, +1269700, -1181116, 3189013, 15538118, 4291746, 6027987, -1743220, 804233, 2654827, 11477763, +-985158, 16443282, 496069, 7819525, -276489, 14843944, 5257040, 11081016, 8406325, -1855963, +-4956929, -1328219, -5663988, -6246493, 8700530, -1748052, -3394098, 1356673, 130460, -4440996, +-2163590, 1360968, 3894999, 1082332, -7437810, -7368017, -3828963, -7522635, -195958, -155693, +-2211371, 2087891, -148176, 3062312, -448824, -3067144, 634581, -1294396, -5670431, -3575024, +811212, 7587597, -3197066, 2810519, -856846, -79994, 3517041, -2636573, 1195612, 1724966, +-1926830, -1313186, -947577, -2169495, 1069447, -2713346, -3541201, -1348620, -3837017, 4812511, +-1351304, 295279, -413927, -284542, 508954, -1591285, 710280, 1219771, 624918, 1963337, +2602750, 463856, 1939715, -1447404, -4151623, 831076, -1150514, 1743220, -1698660, 17060146, +-4481262, -151934, -21030308, -751082, 11235634, -5887864, 9762461, -13380971, 1938641, 1337882, +-391379, -17743584, -804233, -29561724, 1389422, -3267933, -12383464, -2168422, 1653026, -6496138, +1118839, 7459822, 1142461, -6777996, 1249836, -2108292, 6547141, -7288560, 416075, 9462350, +2128156, 768799, -1421634, 7246684, -4683662, 744640, -37044, 5556614, 1069984, -9993315, +-5320391, -7055021, 8239358, -18703508, 9035001, 7414724, 6380174, 3546032, 1385664, -8200167, +5820755, -12134356, -2875481, -2568927, -2518462, -559956, 761283, 3864934, -9320616, -3684008, +15708843, 6559489, -5734318, -6687264, 1705639, -2794413, 4787278, -3222299, -971736, -5113696, +14246407, 7229504, -4891968, 863825, -7257958, 1654099, -5479305, -1923072, 5657546, 5248450, +-1646046, 10368051, -4085051, 5127654, -6812355, 7228967, 1061394, -4256313, -5735929, -8571681, +2166274, -972810, 3892314, -1127966, -2522757, 1531693, 1596654, 2547453, 2085207, 4729833, +-180389, 1495186, -3679713, 2936147, -2641405, -1369021, -1981054, -432181, -4684199, -847182, +1833414, 4191351, -4025458, -1988570, -2908230, 2860985, 2239826, -1905892, -362925, -3176665, +2412698, 10828149, 10940892, 6352257, 5672578, -5318244, 6309844, 10517838, -7812009, -278636, +-20275466, 11618423, 7928510, -2887829, 4697621, -1303523, 1621350, 7234336, -4539781, 11315628, +-10202158, 985695, 12741020, 5581847, 784368, 9835475, -3477850, 4519916, 2593087, 5270999, +8705899, -5141076, -1042066, 16058883, 8028368, -348429, 2217277, -10875394, 14776835, -12437152, +-783295, 12942347, 4016868, 13933948, -8742406, 2237678, -565325, -3405372, 1869385, -13452911, +-9439264, 12687333, -6317360, -2713346, -4290136, -14306536, 10162429, -3369939, -2370822, -6336688, +6251325, 14544907, -11464341, -2330020, 9803263, -10764799, -4698694, 8763881, 12220793, -20199232, +-5390184, -1729798, 8619999, -302258, 10066866, -2441689, -7378754, 493921, 5357435, 13049721, +6577206, -8764418, -459025, 6422587, -13007845, -7958575, -2492692, -6657200, -6775311, -792421, +6168647, -5833103, 1441498, 6437082, 1784022, 1158031, 4494684, -1107565, 2892124, 2801393, +2736968, 1581622, -518080, -3910568, -1340567, -1083406, -3575024, -1606318, 547608, 467078, +-542240, 566936, 3929895, -3238405, -1060320, -2403034, 1877975, 1858110, -783295, -2680597, +-5962489, 3010772, 2255395, 3878892, 1045288, 955093, -435402, -3686693, 1475858, -1475321, +-1708860, -1065152, 10573136, 22405770, 4331475, -13243532, -4720169, 4399657, -29387776, 928787, +179852, -4599910, -1442035, 13577465, -22179748, 4880157, 10369125, -8155069, 9189619, 17144436, +4250407, -15838229, 4288525, -3986267, -287226, -15524696, -4690105, 14166950, -1591285, 12990665, +-3418794, -4548371, 2125472, -10986526, -6179384, -7907572, -5867999, -4319127, 10597295, -11704323, +1903207, 20461224, 13810467, 4618164, -20795694, 3461744, 13644037, 5715528, 811212, -7410966, +-9030169, -22194780, -15337328, 3177739, -7590281, -7582765, -438087, 9492415, 6717866, -6667400, +290984, 13503377, -5196374, -2276333, 612570, 17751100, 674310, -883153, 9023189, 2835752, +-20193326, 5674189, 5848672, -88047, -16723529, 7068980, 9795210, -7338489, -5243618, -13699872, +3650185, -5019743, 5190468, 2623688, -3230889, -5796595, 3784403, 1755031, 5843840, -2888903, +9114994, 3245922, -6257231, 776315, -326418, -8564702, 159451, 723702, -31675, -146566, +-4530654, -3887482, -1826435, -75699, 5713380, 1931662, 2986613, 4665408, -2117419, -2706903, +2194728, -4431333, -4010426, -124554, -225486, 1440425, -1328219, 1060320, 2810519, 3045669, +370441, -1722282, -429497, -178241, -506806, 92342, -745714, 418759, -103079, 3958349, +-2238215, -2728378, 7094749, 5151277, -685047, 2047089, -6592775, 23167054, 1289564, -4651450, +-300648, 10251550, -4913980, 2841121, -2469606, 2438468, 8795556, -15975668, 16921098, 19163070, +5410048, 8125005, -6461779, 10879689, 25228638, 847182, -2859911, -4611721, 10756746, -3769371, +-6069863, -2092186, 3834332, -12516072, 5616207, -11018739, 12679280, 2915746, 12768401, -7951058, +11641509, 3500398, 15228343, 2561948, 3233574, -5393405, 9497246, 2418067, -2966212, 13698798, +-5282810, -9677098, 19346680, 15451682, 5728413, 14608258, 21166136, 25655988, -7924752, -7976828, +-8996883, 3253975, -11720966, 13927505, -1676111, -1213865, -19648402, 4627828, 22382686, 22808424, +-838056, -2925947, -15573551, 301185, 14873472, -7516193, -9207873, 8447127, 1362042, -8031052, +2916283, -1255204, -4893579, -1056562, -4190278, -111132, 8650601, 6460168, -1705102, 1600412, +-2033667, -8533563, -11155641, -2025614, 5630166, 2324114, 7948374, -1527398, -7398081, -1971927, +8240432, -3784403, 4709969, 7611756, -7543573, -1953136, -692027, 1998234, -362925, 5106716, +3737695, 1891933, -7519414, 1988570, 4189204, 1330903, 1749125, 2808372, -6667937, -3062312, +49929, -268972, -3517578, -8639327, -2782065, 847182, 4560719, 1075889, -3529926, -4080219, +-30380452, -21248276, 11064909, 4254165, -15961709, 1571421, 6951405, -14556718, -9190693, -6317360, +17196512, 7673496, 5445482, -5561446, -4297652, -4434017, -10838350, -14420890, -25361246, 13104482, +11200738, -5427765, 28470264, 13655312, 27333708, 18753974, 1676648, -8835821, 7188165, 3313567, +12391518, 14271639, 15752866, -2326262, -2859375, 6697465, -7231115, -1704565, -6382859, -11882027, +-19531364, -5716065, 19734838, -4951561, -7987566, -11256036, 7804493, 11955578, 7905961, 750009, +11596949, 22721988, -13654775, -6229313, -10529112, -7616051, -22009560, -5397164, 5464809, -10011569, +-7888781, -25286620, -36046588, 3912715, -23778550, -37317896, -27064200, -11378442, 24055574, 8318815, +14646912, 11020886, -24943022, -10519449, 2062658, 12439836, -12437152, -14670535, -14246407, -4430259, +7307350, -8443369, -31070330, -19522774, -4549981, -6300180, -2323577, -4618164, 17399986, 15947214, +16453483, 16858820, 5519570, -161061, 6247030, 1753957, -628139, 4973036, -14056891, -5408975, +5964099, 8160975, -474594, -4559108, -5145908, 2041183, -7700340, -11060078, 10055592, -8242042, +-4272956, 907312, -9711995, -9073118, -16498580, -6405944, -3955665, 1161789, 13593035, -3525631, +-2135136, -4344897, 6880538, -3687766, 272194, 6671695, 433792, -4712653, 2960306, 6656663, +-4193499, -997506, -319438, 3524558, -57669064, -9054328, 18529562, -19633906, 8053601, -7653095, +-31289374, -9751186, 33492692, 42184096, -22407382, 777926, -7725573, -34428996, -27423366, -25912612, +-27657442, -14790257, -18066780, -1501628, 5893232, -4825396, 7033546, 6484864, -11336029, -3115999, +-15550466, 6501507, -24473798, -22049826, 5258651, 3774203, -6691559, -8104067, 19149112, -5680631, +26601954, 5854578, 24654722, -16752520, 10714870, 6936909, 29868276, 15937550, 10444287, 2809982, +4482872, -3597035, 8741869, 12264279, -9721122, -13556527, 20883742, -2959769, -26322780, -50470160, +-60679296, -43781288, 7185481, -150861, -56516400, 18258442, 9532680, 14047227, -19331648, 2354179, +6553583, 2422362, 28869160, 29417304, 58891516, 19495930, -31553514, -40491340, -24925306, -22419192, +-25925496, -23087060, -913754, 12466679, 16816408, -11024644, 22172232, -19246286, -26808112, -20893406, +-13919989, -10515691, -20983600, 12924630, -1584843, 12353937, 9454834, 1292785, 21755084, -11647951, +-5167920, -21964462, 7181186, 11441256, -1986422, -2149094, 6423661, -21110302, 595390, -7649337, +3820374, -10289131, -14547054, 8489003, -602369, -6196564, -2469606, 10012106, -8249022, 5063767, +-7694971, 5796595, 5039071, -3196530, -7645042, 4450123, 4928475, -15661061, 6209986, -4181688, +-4756677, -4997195, 3095598, -10262824, -4698694, 32355600, -8655433, -61085172, -17468706, 50333796, +-6975027, 11251741, 7160784, 9429601, 17609366, 14468134, 5022428, -9925133, -3717294, 2547453, +-10895258, -2479270, 18460844, -16486232, -9871982, -16522739, -3995930, 2919504, 2102387, 4463008, +8616778, -12539694, 11216844, 27623620, -522375, -15993921, 1443646, -10432476, -3651259, 16429324, +-17260400, 2044941, 5424544, 20078972, 28915868, -18300318, -10523207, 11316165, 1524177, 3273302, +3338800, -12093554, -31200790, -5456756, -14532559, 28490666, -53893788, -35302484, -14599668, -5748814, +15549929, 3386582, -19035832, -3077881, -21929030, -23539642, -8489540, -16983374, 3105261, 14179298, +64756296, 12138114, -9644886, -41539312, -34280280, 10299868, -1070521, -38981124, 21095806, 21143050, +-39814884, -603980, 10327249, 11635066, 42885248, 18994492, 8937290, -42261404, -21898428, -29112362, +26603564, -2529199, -8763881, -4582193, 8274792, 28255516, 23810224, -12397423, -25206090, -36603860, +8877161, 21926344, -7722351, -3591667, 19108846, 11135240, 16645683, 4414690, 5892695, -13971529, +-4293894, -6498286, 7155953, 7739531, -2058900, -3074660, -2191507, 10375567, 11324755, -16457778, +9580998, 7557532, 13696651, -8602819, -6234145, 8894340, 2960843, -11802033, -1361505, 14417668, +2577517, -10206990, -21426518, -72515688, 10282152, 11188390, -2464774, -1225139, -5648419, -20915954, +8118562, -4654134, 36888400, -38203736, -7859254, 38875360, -1874216, -26397406, -3318936, 22903986, +27858768, 17086454, -5107790, 19917374, -15211700, 13426068, -6235219, -5266704, -13178033, 21821656, +14814416, -14405320, -6687264, -2193655, 22125524, -2207613, 2252710, -14391362, 14869714, 9612137, +-16582869, 29752850, 1217086, -26988500, 23607288, -29311542, -15522549, 26451630, -56852484, -36283348, +30713312, -19721952, 22734872, -36095980, 7888245, 13060459, -19906636, 622770, -1693291, -37252936, +-8749922, 38198364, 40324376, -46169288, -15420006, 13915157, -37047852, 47522740, 47589848, 6701760, +-68454264, -35993436, 72507640, -38511360, -7794829, 58788976, -34710852, -70666704, -15966004, 63578400, +-13849659, -46630996, -11561515, -85021024, -4006668, 68650760, -25192668, -68745784, -7102266, -19391778, +-9372692, 20312510, -2566780, -919123, -25130390, -16472273, -8091182, 27391154, -35029752, 1611150, +5489505, -11040213, 1118839, 32625108, -21053930, -26421028, -3593277, 9120363, 20426864, -8269423, +10228465, 15549392, 1691143, -23861764, -12780212, 441308, -19040664, -9301825, 36140004, -13772350, +-35458712, -9576166, 20524574, 8437463, -2772938, 4490925, -32072132, -18531174, 24260122, 35989140, +4288525, -26847304, -13152264, 1061394, 9466645, 17995376, -10561325, -40075268, -37822020, -1156957, +-47663936, -14195941, -20425790, -19201188, -14594836, 30654256, -3648575, -10026601, -13274133, 5869610, +-16906066, -39692476, 30370250, 9490804, 26204670, 8142721, 27113592, -11029476, -17147656, 5923297, +-28849832, 22085258, -26147224, -5627481, 16857210, -19811074, -4370129, -12088722, -31593242, 4582193, +-23901494, -17246978, -20876226, -15469935, -9646497, -21192980, 3524021, 23179402, -15964930, -5772973, +2707440, 21346524, -9963787, 7461969, -22207666, 35650376, 11047193, 15197205, 9662066, 34183644, +-2158221, -40523016, 8770323, 14494978, -11345693, -295279, 21126944, -28242094, -27959700, -32752346, +28030030, 8169565, -40183176, 15445239, -26550950, -5344550, -37493992, 16374026, 26485452, 5319854, +-41512468, 23082228, 19154480, -5478768, -36486284, 9636296, -22034256, -7723425, -1634772, -11326366, +17997524, -16491601, -29581588, 14456323, -6629282, 12189117, -193810, -1329829, -219043, -8252243, +-9220758, 6008123, 26356604, -3453154, -37266356, -10554345, 15495705, -18664854, -7852811, 17627082, +-6743099, -2831994, -14895483, 28951300, 17169132, -8888435, 13149579, -2613488, 5918465, 23422604, +-4279398, -21048024, 8699993, 13241921, -10684805, 16787954, -2731062, 10241350, 1255204, -8028905, +14304389, 20447266, -11836930, -22167400, 8612483, 13123809, -10718091, -2500745, 12541305, 3995930, +35314832, 66304096, -15899969, 32900524, 6442451, -15614890, -29567092, -17223356, 38592428, -12593918, +7210177, 14994805, -3841848, 35563404, -5173288, 27916214, 29196650, -35734664, 18490908, -9333501, +926639, 13152800, 10946261, -1187022, 5873368, 10650982, 35738960, 36715528, 28367186, -20685636, +-6999186, -48734456, -1401770, 11547020, 22080426, 5105643, -40273372, 17703856, -24142012, 31331786, +-28195924, -19748260, 2122251, -23636278, -3977140, -13636521, 48272748, -26313118, -12808129, -50482508, +-16342351, -26494042, 71402760, 43375412, -14936823, -48023640, -51418276, -30593052, 35571456, 46309948, +23569170, 6842957, -61711700, -28685550, 20418812, 17362942, 2793339, 22374096, -12719009, -40679244, +19368692, -69022808, 75196288, -7012608, -48423608, 112950120, 16315507, 39310224, 67810016, -112115824, +-80661632, 22382686, -6536940, 17146046, 24677808, -70092256, -5065377, 14149770, 1537061, 58721328, +4296041, -30749818, -3080565, 31561030, -18187040, 13786308, 16355772, 639413, -12706661, 15431281, +-40674952, 31144418, -7825431, -13008919, 17723720, 4670240, 1392643, 18439906, -4218195, 11036992, +-2118493, 7074885, -5185100, -21460340, 13155485, 9037685, 12448963, -151934, 511101, 8400419, +4837207, 3239479, 25103010, 27685896, 1739999, 18127984, -16934520, 2539400, -11070278, 20964272, +19316078, 2918430, -5394479, -12666932, -29463476, 2429341, -29357712, 19871204, -41475964, 25678536, +-17064978, 42136852, -18996640, -1957431, 24012088, 4270271, 2116882, -10860899, -9392020, 1096827, +-16121697, 17779018, -2055142, 18879066, -14783814, -14595373, 4989142, 743029, -14985678, 9458055, +-1867237, 8253854, -4581120, -4059818, 7918309, -7531762, -582505, 5879274, -3026878, -3597035, +29931090, -2057826, -9973988, -5358509, 14235669, -1301375, -16243566, 8639864, 17537426, 3531000, +464393, -10359998, 3723737, -8391829, 8069707, 21250424, -7495255, 9713069, -7960722, -2396055, +-8723615, -4159676, 5663988, 6867116, -12362526, 7477538, 2283849, -1588601, -12357158, 2121177, +4580583, -9216463, 13415867, 11187316, -22369800, 5719823, -20525112, -23423678, 16173236, -8348880, +19521164, 10576894, 666257, 9947681, -3029026, -12093017, -2806224, 709743, 13633837, -6126771, +4236449, 5567888, -7701950, -1432909, 4794257, -2368675, -1414655, 7826504, 537, 2990908, +-6371047, 2682744, -569083, -6683506, 12720619, 1093606, 10403485, -5053566, 8563091, -4256850, +696858, -6663105, 5762236, -3246459, 12606803, -3913252, 11929809, -12173548, 2802466, 780073, +-2441689, 401043, 1600412, 9381819, -296890, -11077258, 7431367, -6252936, 1301375, 6683506, +-6725919, 11698954, -24361592, 51601348, 9773198, 12713103, -6512244, 4763656, -1458678, 9816685, +3121368, 22022444, 1550483, -11870216, 7274601, -7727183, 3426310, 4552666, -10045929, 587874, +2472828, -10845866, 9977746, 2605435, -4434554, 13421773, -4738423, 5338645, -4048544, 2546916, +2589329, 1279363, -1639604, -3894462, -1784022, 1929514, 372052, -2168422, -6459094, 4912906, +-4323959, 2481954, 4312147, -4386772, 987843, -4092567, 1235877, -6527814, -10639171, 11095511, +-5880884, -2795487, 4727149, 2217277, -1838246, 1319092, 9530532, -10392210, 4571993, -3876745, +8263517, -8723615, 5049271, 2528125, -1501091, 1988033, 257161, 183610, 4071092, -5493263, +3181497, 2819646, -1455457, -479426, 7232725, -1040456, 2498597, -8267812, 11292006, -8650064, +-79994, 5688148, -5018670, 3903589, 1309965, 1421634, -5249524, 4348118, 4509179, -2732136, +1818382, 2279554, -3724274, 1395864, 1914482, -752156, 3966939, 239444, -31675, -354872, +3566970, 2772402, -2171106, 3117073, -1512902, 1432909, 1602023, -317291, 4423280, -1902671, +90194, 2851322, -3392487, 340913, -291521, -2376191, 404801, 2558727, -679142, -1986959, +4407174, -2714419, 9754408, -45804752, -113715168, 24567750, 94564976, 63926832, 133378600, -43619152, +-37289444, -76732808, -122642792, -12117713, 38227356, 50395000, 65765612, 33160906, 3637301, -10746545, +-28434830, -40550396, -6144488, -10827613, 3993783, 9315247, -483184, 2345589, 4903242, 2182380, +16060493, 19078244, 11851425, -2179696, 2202245, -14105209, -29614336, -31549220, -15476915, -20689932, +17043504, 31428424, 33343978, 36621040, 20061256, -5910949, -14462765, -26898306, -28432684, -19742354, +-11120744, -1266479, 7172059, 13817447, 14812805, 12479564, 10733123, -1829656, 2878702, -3161633, +1415192, -2371359, -1479079, -837519, -10089952, -10545755, -7662759, -15903727, 9664, -2978560, +1994476, 27105538, 35668628, 12068321, 12079059, -9762998, -19623706, -13530758, -23627152, -18938658, +6671158, -1599875, -11461657, 8829916, 9411347, 11272142, 26692148, 11147588, 11700028, 2950643, +-14396194, -14135811, -11617887, -12621835, -16047072, -13647259, -8172249, 2565706, 17818208, 26927298, +25154012, 10253698, 5066451, -6506876, -12207371, -10909754, -12099997, -13897440, -6401649, -5753109, +-498753, 4764730, 3593814, 10902774, 14368813, 10471667, 7074348, 2563559, -933619, -6751689, +-7075422, -10926397, -12399034, -9655623, -8703214, -2121177, 9212168, 13889924, 14851997, 13303124, +5356898, 2531883, -6673843, -10450192, -5654862, -7698192, -10627360, -7919920, 1420024, 7295002, +6718403, 3897683, 4257923, 3983582, 2929168, 984621, -800475, -1020592, -2873870, -3522947, +-3422015, -3826816, -4690105, -2426120, 1854352, 3567507, 3937411, 2598992, 1114007, 340376, +282394, 299574, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -6425271, -817654, 2046015, 1981591, 10121627, 2752537, 2140504, -2994129, 390842, -5127654, 1207423, -4716948, -2387465, 228707, -991601, -2522220, -4063576, 3143916, -6799470, -3429532, -3411278, -3693135, 4044786, 2133525, 970126, 2930778, 2420214, 4838281, -1676648, 1696512, 3010235, -642635, 993748, -3521336, -1516124, -1469953, -1323924, 3272765, -6254546, 1051193, -2165201, -6562710, 159988, -1175747, -1641751, -2698313, -897111, -2816425, -8250096, -2607045, -1612760, --1327682, -1847910, 858993, -1543504, -382789, -528818, 2895882, 1295470, -367757, 1848983, --1610613, 3546032, -2315524, -3839164, 3717831, 3893925, -1675037, -3687230, 360777, 2024540, -1532230, 1759863, -1740536, 24159, 1433445, 1927367, 847182, -526670, 242129, 2394981, -4616553, 2234457, -562641, -53150, -1086090, -1153199, 970126, -1519345, 942745, 1140314, --440234, -148176, 510027, 444529, -456877, 386010, 270046, -2115272, 342524, 166967, -663572, 378494, -803159, 767189, 612033, -53150, 9155797, -1711545, -875100, 984084, -2527052, -6744710, 4202089, -8005819, -360240, -3874597, -569083, -2560338, -603980, -622233, -4025458, -3390340, 4359929, -4542465, -4963372, 2106145, 6663105, -7851200, -2180233, -3796214, -56371, -1973538, 2124398, 2819646, 1425392, 2872260, -4562866, 169114, 6407018, 2519535, -817118, -4647155, -6641630, -3994320, 1020592, -3395172, -1917703, 1301375, 4315369, -3884798, --3828963, 1555852, -2799245, 4958003, 1661079, -506269, 3495030, 3321620, -2684, 5572183, -2756295, 1747515, 1476932, 3654480, 5748814, -3781182, 1100049, 1583232, -4039954, 363462, -3284039, -1273458, 8302172, -2559801, -2201708, -1724429, 3062312, 4227859, -5382668, -2189360, -1466731, -973347, 1322850, 523986, -2358474, 1056562, 504659, -1734093, -2852932, 1179505, -801011, 2621004, 220654, 811212, 1202054, -113817, -856309, 1921998, 114890, -4832, -1653562, -893890, 801011, 2208687, -185757, -474057, 417686, -326954, 681289, -1348620, --423591, -626528, 89657, -202937, 863288, 93952, -845035, 40265, -11768747, -1913408, --2631204, -2105071, -1063004, -1448478, 6245956, 7468948, -1718524, 6092948, 2317135, -3382287, -1579474, -5121212, 890669, 1073205, -6884296, -1025960, 1056025, 1192390, 4741644, -923955, -4116726, -2776160, -5284421, -5574868, -1605781, -2825015, -4235375, 4362076, -1727114, -853625, --779000, 904628, 2364916, -6751689, 11811, 932545, -3211025, 8027831, 614180, -1990181, --1757179, 8572218, -628676, 1081795, 5060009, 142808, 3086471, 1199907, 271120, 4727149, --42950, -3320547, 4234301, 2272575, 2714419, 3845070, 1257352, -3135326, 2211371, 3154117, -3053185, 4735739, 11811, -4399121, -3528316, 5555004, 7724499, -7072201, 1402307, -1876364, --1262720, 1615445, 2938831, 2830920, -2277407, -915365, -2201708, -3650722, -3204046, -1176821, --2043868, -3138547, 695785, -861141, 1169842, 1005559, -992137, 556198, 172336, -2551211, -839129, -1727114, -3111167, 200790, -932008, -1305670, -1409286, -401579, 537945, -477278, -869731, -600759, -1065689, -1439888, -1347009, -576599, 214212, 1015223, -8646306, 9238475, -8559870, 6455336, -4484483, 5048734, 9108552, -2277943, 7121056, 2685965, 1080184, -1097364, -7850664, 3714610, -1822140, -5612449, 3273839, -2320356, -2992519, 3184718, 3764539, 1654099, --5566815, 914291, 5025649, -2436320, 1714229, -10969883, 1596654, -875636, 5304822, 1301375, --2261837, -3302830, 6784975, -5820218, 488553, -4699768, 566936, -1435056, 3798362, -782221, --1215476, -5761162, -1365800, -1011465, 7178501, 362388, -6532109, -237297, -343597, 2244121, -3442953, -2910377, 31675, -3715147, 3988951, -867047, 4817343, -2585570, 7162932, 3550864, --7863548, 8356933, -1184337, -5769215, 1002875, 7635915, 1571421, 1176821, -6153078, -401579, --2371359, -3336116, -3213173, 294742, 2932389, 3759170, 2064269, 2054605, -2388002, 1813550, --2066416, -238371, -89657, -964757, -379031, 2172180, -3410204, 934692, -312459, 300648, -1176821, 937377, -69256, 1491964, 186831, -2260764, -2423435, 1436667, 686121, -99321, --1591822, -320512, 413927, -219580, -681826, -1576790, 1017907, -28454, -956704, 1090922, --628676, -433792, -1232656, -775778, -449361, -1595044, 1145146, 9941239, -3456375, -7241852, --402116, -10848014, -38655, -9325448, -3259880, 6366216, -6660958, -7347079, 2166274, 580894, -629213, -1742146, -2425583, -5325760, 3559991, -10395968, -3215320, 1024350, 6401649, 351650, -6495601, 2291902, 14303852, 5462125, -176094, 603980, 6799470, -1657321, -2068027, -1309428, -1107028, -4544076, -2268280, -7642358, -556735, -3526168, -2120640, 9352291, 129386, 5840619, --2374043, 2365453, -614717, 3473018, -1193464, 3230889, -3244311, -4019016, -664109, 1099512, --4049617, -4057134, 334471, 2043331, 4338454, -657130, -2058363, -917512, 4116189, 7021735, -368293, -4832375, -6890202, 68719, 1867237, 689879, 9356049, -5907191, -338766, 4168266, --1571421, -4953171, 6588480, 2996277, 1153736, -3301756, -3549791, -5904507, -2321430, -660888, --3066070, -1556926, -2658585, 470836, 663036, 1437203, 169114, 403190, -3295314, -1727651, --3531537, -1253057, -1033477, -2709051, -1720134, 888521, -330176, -1164473, -322659, 837519, --2217814, 1068910, -1604707, -214748, -679679, -1235340, -440234, -63351, 973347, -1585380, --2323041, 1159641, 602369, 8894340, -6857452, -1407676, 549756, -547071, -272730, -5645735, --4354560, -622770, 3717294, 1344862, 1480153, 1559610, 3906810, -819265, 3570729, 2899640, --9287867, -3571265, -10897406, 2810519, -3853660, 5462662, -3548180, -4811974, -3546032, 2835215, --7272990, -6034429, 8396661, -4608500, 9105868, -2167348, 2720325, -3223910, -6178311, 6769406, --5245229, -5864778, -616328, -3192771, -6912750, -5305895, -8709120, 353261, 5547487, 3207267, --3405372, 9635759, 3501472, -3546032, -4512937, -6977711, 270046, -2616172, -4914517, -2462627, --2105608, -3438121, 1800128, 7711614, -503585, 505732, -5261335, 2454037, 2573759, -4544613, --3646964, 1845225, 9336722, 3737695, -2365990, -1240172, -2010582, -9652939, -7641284, -6407555, -6667937, 7133404, -1078037, -3329674, 3076270, -2124398, 2695629, -1417876, 1254131, 224949, -98247, -3127810, 2054068, -1828046, -1358283, -489089, 1832877, 1410360, -229244, -2610266, -1617592, -376347, 1176284, -881542, -624918, -2303176, -1051730, -80531, -326954, 451508, -403727, -289373, 350040, -1909113, 817654, 194347, 234613, -686658, 2334315, 1519345, --144418, -932008, 191126, -1449015, 2645163, 12802761, -2414845, -15032, -2092186, 8337069, -7903814, 2735894, -13153337, -2179159, -15977278, 9475235, 4006668, 277025, 16517370, 7822209, --1439888, -7382512, 6815040, -3149822, 1700270, 2327336, 1085553, 5426691, -4794257, 9265855, -3532611, 919660, -2786360, -4684199, 6286222, 5308580, -1004486, 3460133, -7858180, 1499481, --10497437, 4311074, 607738, 5387500, -8617315, 1816234, -2804077, 1933809, 9837623, 8348880, -409096, 2434710, -6088116, 8050916, 244276, 17102560, 18066244, -2367601, -4797479, -4888210, --3890167, -10435160, -2909304, -13636521, 845572, -1111860, -741956, -2755759, 4820027, 8111583, -12679817, 11800423, 9082782, -14870251, -10611254, -432718, 768262, 15669114, -10989748, 8435853, --566399, -3121368, -1592359, -346282, -3075197, -8622147, -5641977, -1593433, 2556043, 852014, --194884, -2321967, 1388885, -3029026, -273804, -1590749, 3341485, 3743601, -870268, -661425, -3477313, 2675765, 469225, -468151, 1292785, 266288, 545998, -630286, 1518271, -71941, --842887, -1348083, 465467, 1526324, 2240899, 4817880, 3744138, -1762547, 478352, -3346317, --609349, 1563368, -246424, -625455, 124554, 740345, -4617627, 9197136, 1984812, -6772627, --3738769, 17262548, 16975858, 19024558, -1854352, -788663, -3223910, 3213173, 9314710, 10716480, -3120831, -4581120, -9138617, -18598820, 5535676, -10995653, -2400887, -1104344, -2367601, 1277216, --539555, -3394098, -394600, -10768020, -4258997, 673773, -1980517, -12034498, -5070746, 1060857, -8781061, -2447595, 270046, -9572408, -3221762, 148176, 6376953, -3863323, 3927748, -10699300, --2971581, 2532420, 4089883, -2904472, 14431090, -2924336, -1810329, -7466801, -2458869, 5843840, -1992328, -617938, 7536057, 10456635, 12166032, -2099165, -6067178, -6853694, 112743, 1483374, -2864743, -4850092, 3933653, 5218922, 4366371, 4292820, 12163884, 8245801, 5441724, -603980, -2746095, -12048994, -2255932, 1323387, 6205154, 9847286, -1846836, -5480915, 1736777, 3424700, --2820183, 5072893, 4039417, 5480915, 850940, 2426657, -250719, -377420, -3920768, 3127273, --1220308, 2073932, 1801739, 625992, 2885144, 310848, 4639639, 3330210, 2101850, 1366337, -1309428, 70330, -593779, 435939, -1930051, -76773, -2414845, -3830574, -1546188, 868120, -682363, 1755568, -796180, 1177358, -1600412, 795643, 2054605, -17603998, 21971442, -589484, -3256122, 12027519, 244276, -4182225, 661962, -21380884, -12993350, -6096169, 3455838, -4191888, -2481954, -9986873, 6968048, -3474092, -54761, 13231184, -12840878, -8548059, 12399571, -3853660, --18070538, 1303523, -11126113, 2326262, -886911, 6801618, 2962454, 3437048, 1421634, -2170569, -8092792, -882079, 10385768, 6337224, -3634616, -6191732, -5774584, 2828773, -2815351, 2845416, -2045478, 6100464, 1822140, -11419244, 720481, 3894462, -3905736, 494995, -7837242, -1742146, -741956, 523449, 18146236, -3154117, 12907987, 15397995, -4187056, 8245264, -2486786, -447750, --8515310, 5442798, 13138842, 9153649, 2081449, 3599183, 8162586, -527207, 6773701, -2735357, --3709241, -6531572, 3610994, 16727824, 3790309, -2162516, 1376000, -11762305, -3929895, 279710, -11120207, 8077760, 3539053, 7172059, -2011118, 7043747, -27380, 4430259, 605590, -345745, --801548, 4908611, -477815, -3099356, -1859184, -1234803, -705448, -1253057, -2426120, 3540664, --2251100, -3077881, -843424, -4041027, -2726231, -3451543, -1927367, -2414309, -3038689, 1035087, -770947, 1305133, 1149441, -1840930, -901943, -3191161, -4099010, -392990, -2258616, 1335735, --1056025, 333934, 2078764, 2104534, 1518271, 3628711, -928250, -348966, 2830920, 21039434, -3062849, 5246303, -4973036, -2522220, 14292041, -9432285, -2174327, -18562848, 17392470, 9081171, -1258425, -6308770, -17513266, 1770063, -4654134, 2142652, -19637128, 7003481, 10385768, -11420855, --2720862, 1703491, 1219771, 3794604, 11274826, 13853954, 57445, -34897, 2611877, 523449, --8385924, -9614821, -6349573, -12669080, -6212670, 10783052, 5042292, -4042638, -5326297, -3544422, --22234508, 4827543, 5367636, -10427644, 17075716, 602369, 12743168, -4590783, 8275328, -2733747, --10981158, 983011, 10159208, -5600101, 5590437, 6493454, 18141404, 5004174, 5721434, 17350058, -9941239, 6562173, -23989002, 4959077, 3710315, 4645007, 525060, -9818295, 17447230, -12950937, -9968619, 10390600, -15631533, -3443490, 21480206, -19119584, 3280818, -4497368, -2026688, -6903086, -8389145, -3601867, -7087233, -6113349, 3775276, 8089034, -7530689, 9396852, -7772280, -3446175, -10763188, 3921305, -839666, -4743792, -4972499, -164283, -1945083, -8184597, -891206, -1766305, --2237141, -772557, 6489159, -577673, -5890548, 519691, 2565706, 6114960, 3898757, 4851703, --1908039, 2545842, -3489661, 141197, -1148904, 2536178, 5174362, -3817152, 2413772, 2383707, --212601, 1374926, 1117228, -11361799, -16969952, -7668127, -7270843, -22669374, 14890652, 2056216, -15918759, 602369, 2025077, -8058433, -4329864, 7584912, -898722, 7854422, -8417062, -2915209, -1168231, -3996467, -6941204, 9427990, -10226317, 11293617, -4350802, 3458523, -2790655, -8207146, --7369627, 3069291, -2848637, -408559, 5706401, 22926536, 1391033, -3295851, -8121247, 3022046, -18490908, -3770981, -3338263, -11242614, -4042638, 1254131, -10602664, -4091493, -15011448, 9175124, --18316424, -32956894, -3678103, 738734, 15315317, -16422881, 14696841, 9433896, -7904351, -15520401, --2679523, 2202245, 4206384, 251792, 9209484, -6612639, -2602750, -32518808, -4545686, 32977832, -3018825, -5884642, -4654671, -17541184, 12742094, -5832566, -5135171, -4544076, -2716030, -7753490, --11337640, 3051038, 6180458, -607738, 4663261, -9651865, -17373680, -890132, -9255118, -2861522, -104690, -9213779, 1872606, -6789807, -11714523, -8777303, -4350802, 3453154, 5065914, -1259499, --13819594, -3662533, 660351, -6962679, -3189013, -825707, -6443525, -3917547, 1467268, -528281, --5109938, -2208687, 2047089, 581431, -6727530, -2842195, -62814, 5761699, 6459094, 1541893, --2225330, -2678449, -998580, 4234838, -1181116, -686121, 139586, 1445257, -5686000, 4847945, --1338419, 3190087, 15620259, 13969381, -4265977, -5506685, -1213328, -22041772, 14780593, -13886166, --11407433, -8830453, 5662915, 2374580, 13720810, 1783485, -7256347, -8560944, -8821863, 7108171, --3295314, -4703526, 12559558, 13956496, 4873178, -9208410, 11589432, 18525804, -6873559, -3925600, -16110422, 4204236, 3354906, -10294500, 145492, 15257334, -22199076, 15494631, -3185792, 2181307, -9398462, 11232950, 74088, 5654862, -10365904, -8515310, 5959267, 21270826, 5849746, 5250061, -8195872, -10612327, 2420751, 9482214, 5617281, -1687922, 7748121, 4778688, -12529493, 10392747, --12205760, 2851858, 9235790, -9777493, 7672959, -11948599, -4600447, 2256469, 620623, 7729868, --4735739, 6635188, -4845260, 974958, 2642479, -2194728, -4741644, -9669582, 26141318, 2808909, -7969849, -11281268, -26294326, 18716930, -17817672, -7785702, 77309, -4141959, -2522220, -1554778, --7261716, 4647692, 3920232, 2008434, -6696391, 8505646, 6715718, -2846490, -2741800, 2503966, --2221035, 2353642, -2241436, 9011378, 3490198, 830539, 6567542, 6735046, -3744138, 20401, -3403225, 4670240, 2090039, 2220498, -4074850, -5591511, 4655745, 5790153, 8594766, -1197222, --7483981, -1121523, 911070, 3747359, -11607686, 4408784, -3735548, -1774358, 2952790, 2717104, --2705830, 4046396, 556735, 3201361, -1671279, 7718593, -14532559, 15519864, -5622649, -15217069, --19750944, -5477694, -1948841, 11708618, -17377974, -2741263, -1983201, 9238475, 17396766, 14425185, -9002251, 1435593, -4376572, -2606508, -1715839, 12268037, 10084583, -2286533, 1651415, -2583423, -7915088, -18875844, 11372537, 6309844, 8916352, 3084324, 2105071, 16414828, -6374269, -13821205, -140660, -4493073, 1015760, -19200114, -10611254, -1047435, 16183437, -10803990, -3379603, 2742337, --587874, 561030, 15905875, 6474127, -2395518, 1494112, 7813620, 5218386, 18520436, -5327907, -8492761, 9495099, 5082557, -2885144, 3081639, -19985020, 8650064, -3646964, 972810, -4498978, --10998874, -14750528, 3082713, -6973417, -20129438, 4965519, -17094506, -12502113, -2908767, -25742960, --15613817, 3995930, 11091216, -12791486, 2844342, 1156957, 29770566, 28315646, 26654568, -675384, -1550483, -13859323, -8383240, 11235634, -5947456, -3803194, 1890859, -3423626, 6293738, -7514582, --3751654, -142808, 2424509, -4457639, 5776731, 5891622, 316754, -2312840, 1641214, 5765994, --4499515, -5867999, -1479079, 5207111, -6787122, 11741904, 6725382, -376883, 5321465, -1691680, --4741644, -7475391, -4077535, -6607271, -3600256, 4137664, 770410, 11870753, -2648921, -3556770, --26189100, -28976534, 17293148, 15544024, 5236639, 16840566, 28176060, 8041790, -10699837, 9120900, --4243965, -7905424, 12899397, 965294, -11497091, 7114077, 9291625, 2179159, 3286187, 746251, -1455994, 25811142, -530428, 5558225, 2426120, 16033113, 965831, 25605522, -97711, -11210402, -20470352, 4221953, -9021579, -3152506, 10847477, -2201171, -170188, 8516383, -15527381, 15556372, --3259343, -22679574, -6345814, 2273112, -22698902, -2503429, -2356327, 10032507, 9671729, 17132624, --11969537, 2653216, 2734284, 3600793, 7318088, -10836202, -12251394, 6478958, -288837, 13110388, -10635413, 3331821, 27299886, -4500589, -4180077, -18602040, 27854474, 4971962, 19332722, 11880953, --31054224, 4508642, 2841121, 19099182, -10087268, 8173860, 190052, -8209830, -1012539, -6623914, -15359877, -29343216, -3558381, -2054068, 131533, 1386201, 4737349, 7251516, -91268, 13629005, --518080, -1887101, -4344897, -2763812, 890132, -4664335, 1611150, -1232119, 4108673, 2929705, --1388885, 1190243, -1580548, -8144869, -435939, 464930, 2087354, -8320426, 4490389, -1669132, -4715874, 3774740, 6659347, -6730751, 7780334, -4172024, 2514703, 5666136, 5073430, -1687385, -180926, -3007014, 4391067, -208306, 2138894, -51003, -912144, 11370389, 6339909, 212064, -5240934, 1623498, 5443334, 17149804, -36230732, 21507048, 21883932, -9345312, 5200669, 3036542, -5921686, 143345, 17424682, -12713640, -2742874, -13639742, -111669, -7715372, 1231045, 3647501, --19869592, 8923331, 21599390, -14877767, -14230300, -14558329, 28758564, -12584791, -7046431, 2649458, --9838159, -29819422, 5251672, 21599928, -29680908, -13485124, 10277857, 15902116, 4343286, -4548907, -6896107, -10570451, -4916664, -586263, 14728517, -20244866, -16045461, 11368242, 18496276, 7233262, --23052700, -7512972, 601832, -1113470, -3981435, 12006044, -3548180, 18144090, -14771466, -3277060, -10201, -16998944, 10783589, -19782082, -13529684, 6245956, -8781061, 19130858, 27786828, 16316044, --18302466, 9667971, -5347771, -5553930, -12900471, -4087198, -21055540, 16085189, 11938398, 5686537, -694174, -10042170, -5542656, 6467684, -21971442, 17726940, -4137127, -3089155, 9376987, 1599339, -8548596, -2461016, -1256278, -7585449, -2097018, 659278, 1584843, -5963025, -1990717, -2872796, --2039036, 9936944, 1150514, -219043, -4691178, 4005057, 4071629, -3603478, 2295660, 4523675, -1122597, 7653632, -2657511, -5480379, 1218160, -8901857, 4677757, 3243774, 1250372, -328565, -3634079, -805843, 5869073, 1792075, 4214974, -7053947, -1991791, 6473053, 486405, 2605435, -3467649, -6579890, 1081258, 6652368, 21021718, 35051764, -267362, -26563836, 5609228, -31694174, -5411122, 14369887, 6747931, 1892470, 19030464, 14064944, -865973, -2922725, -26201448, -14133127, -374736, -12277164, 35460324, -6492380, -8056285, -15336791, 1896765, 13320841, 9322763, -507880, -6846178, 10371272, -15748034, 5362804, 30425012, 10755135, -20900922, -14749991, 9872519, -10354092, --1422708, 7390565, -4640712, -17265232, -4128001, 2067490, 28991030, -6303402, 6432788, -7742753, --23443542, 4074850, 29412472, -7939784, -17646946, 5114233, -10810433, 7176891, -6180458, -7204808, -20212652, -5196374, -2313377, 9867687, -17431124, 6267431, 21392158, -8876087, 1835025, -12562242, -37620692, -6863358, 4482872, 12195023, -8743480, -2108829, -10050223, 5262409, -11356430, -9592273, --8959302, 14401562, -19565186, 2861522, -2900177, -5843840, 15202574, 334471, -5197448, -6464463, -791348, 5702643, 4435628, -8715562, -1589675, 388158, -2435783, -10783589, -6488085, -1964948, -2561411, 864899, 862215, 1506997, 8773008, -8866960, 9222905, 1820529, 2657511, 617938, -7310035, -4152697, 12009265, -2646774, -198105, 9209484, 12062953, -6324340, 7881265, -3952444, -2632278, -7010997, 6089190, 5122822, -10434623, -528281, -4185983, -1436130, -5228586, 3759170, --6431177, 5761699, -10212358, -58040576, -20332376, -1046898, 18554796, -9729175, -29046326, -10940355, --4250407, 14235132, 3709778, -3875134, -14361297, 15178414, 26949846, -12227772, 20374788, 5113696, --38565048, 14393509, 18112414, -6350109, -15677704, -2935610, 23778550, 25373594, -2094333, -19232326, -1351304, -2191507, -2480344, -16026670, 3971234, 7319698, -25428354, 17563196, 14932528, -17933636, -3333968, -20120312, 7138236, 49196168, -43939664, 45485316, 20586316, 2063195, 27827094, 13834090, --28437516, 17113834, -21379274, -4787278, 23390392, 1107565, 6714108, -11935177, -20818780, 63392644, --14872935, 932545, 24989730, -12046310, 4893042, 1925756, 15448460, 35720708, 33946348, 32130650, -2023467, -607738, -5143224, 1650878, -8653822, 2430952, 27269822, -7196218, -9429064, 2745558, -3793530, 15839839, 18451180, 5275831, 5192079, 13115220, 5588290, -9976672, 3288871, -5135707, --14778446, -6624987, 7806640, -11132555, -16044387, -12179454, -534723, 1496796, -9186398, 4753992, -10452340, 1647120, -3346317, -595390, -11716134, 13943611, -2018635, -3006477, 9665287, -7938710, -6580964, -5935108, -4743255, 16408386, -27380, -12129525, 15556372, -9503689, 9392020, 4416837, --6058052, 4708358, -2107218, 11340861, -5147519, 3980361, 593242, 979789, -1165010, 12070469, --6146098, -1377074, -834834, 2177549, -1711545, 5284958, 14854681, -3930432, -42831024, 19451906, --31119722, 43751760, 5154498, -38045896, 8571144, 340913, 17852032, 8432095, -9225053, 32379758, -7885560, 1651415, 21600464, -17275970, -24055574, 794569, 12562779, 43641700, -6161131, 124017, --4594005, 31457952, 3399467, -24962886, -14789720, 4743792, -2792803, 13937706, -24300924, 11678553, -3930969, 7208029, -2201708, -9464497, 5490579, 9778030, 63888, 29237990, -47144784, 4142496, --16654809, -10300942, -6120329, -34417720, -50096500, -51782272, -37710888, 4027069, 142271, -30020748, --294742, -5443871, 3186866, -18615462, -48278652, 47556024, -909996, -6982543, 9620727, -47106128, --3302293, -11699491, 8782671, 13886703, 64666100, 48285632, -5480915, -552440, -1600949, 12757127, -19496468, 11919071, 8850854, -1770063, -7900056, -45820320, 8578123, -900869, -17976048, -7974681, -29870424, -4165045, -5560909, 14350023, -1311039, 15737834, -6205691, 7930120, -982474, -3226594, -10971494, 13591424, -6292664, 1957968, 5881421, -2476049, 2706366, 758062, -293668, 9305047, --4055523, -4639102, 7516193, -8875013, 11704323, 2147, 6262599, 9938554, -5103495, 2520609, -8441221, -1987496, -5808944, -2009508, 802085, -1479616, 2182917, -11571179, -914828, -9144522, -9535901, 1538672, 6356015, 4731980, -1583769, 387621, -836982, 4537096, 5845451, 5068599, --12159589, 58932320, -56114284, 9695352, -10749229, 2247879, 23847806, -17277580, 6018323, 971200, --60714732, 1574642, -6742025, 3018825, 7107634, -27093190, -10044855, -44895832, -11506217, -2130304, -2542621, -16955458, -12707734, -19522774, -8078834, 19492710, 4322348, 39307004, 9698036, -13213467, --13834627, 24175298, -26736708, 46224584, -35982164, 10564009, -29011430, 657667, 27865748, -50394460, -47623672, 8451959, 5588826, -34587908, -6830609, -6513855, 98784, 16685411, 16692390, 20987358, --39901320, -949725, -15628849, -13567265, -15297600, -21502216, -14813879, 817654, 23015656, -24405078, -6694781, -44987100, -14969572, 11461120, 13524315, 2505577, -51147692, -27666032, -18154290, -26040924, --21515638, 1891396, -16925392, 27350352, 8302172, 13746043, -9342628, -14053133, 45830524, -15244986, -12409234, -9100499, 3682935, 34426312, 4726075, 6295349, -19098108, 19609210, 11467026, -7963943, -18255758, -13495324, 5137855, -4937065, 12410845, 2572149, -3947075, 6773701, 15773804, -5219459, -5155572, 5684389, 4837207, -1722282, 4371740, -2094870, 10888816, -3411278, 1956358, 10292352, --1929514, -3799972, 3307125, 4548907, -6802155, -1381906, -19216220, 12332999, 8491150, 249645, --10568304, -4221416, 1162326, 4252018, 15005005, -2229625, -3841312, 5360119, 4015795, -2015950, -15188615, 3049964, -18036178, 4992900, 18277234, 25606596, -47421808, 72998336, -54465016, -5488968, --32755032, 6787659, 983011, -19688130, -27981712, 33326262, 22473954, 10657961, -14156212, 14860587, -4788889, 31484258, -24435142, -16042240, 19652696, 32720134, -41135588, 16988744, -1235340, 19945828, --14679124, 6021544, -18105972, 4036196, -34132640, 11533061, 37091336, -976031, -2601140, 46056008, -8207146, -20868172, -44515188, 38516192, -20000588, 17509508, -16201690, 45994268, 20402706, -4779762, -4920959, -26227218, 3752728, 11639361, -12575664, 13029320, -55143620, 21973052, 50417548, 39510476, --21520470, -22292490, -22454090, 25666724, 2260764, -7794829, 2261300, 65102040, -31431644, -14504105, -25311316, -21328808, -58341764, 25138980, 13291850, -41567232, 23678154, 40801116, 35953172, -10646150, --15790447, -28258200, 15499463, -17329120, -11087458, 26288422, 17892834, 8331700, 23003308, 13171054, --8648454, -7926362, -29266980, 7177964, -12195023, 10512469, -10741713, 21318070, 14674830, 3524558, --3780108, 20291572, -10760504, -1225139, 2734284, 7994545, 4780836, 9557376, 8614094, 1024350, --4680441, -2530273, 7246147, 4092567, 2990371, 1325534, 11318849, 36531920, -971200, -2503966, -5523865, -12212203, 4567698, 13388487, -18544596, 8575976, 9743133, -6766721, -5137855, 8884140, -4871567, -10378788, -46938624, 25035364, -2776160, 6518687, -17227650, 15001247, 278099, 8225936, -2454574, 2724083, -9822590, 7472170, 25339234, -32410896, 27805618, -4752382, -17176648, 5740224, --11709691, 7558069, -11999065, -9783399, 8164733, -25829934, -2738042, 34463892, -49811420, 14057965, -2274722, -8283382, -15384573, -18036716, -11864310, 36178656, -29868276, -4210679, 11562052, -30175904, -7549479, 16656420, 10972031, 5749888, 5097590, -16981764, 13291850, -44397076, 481573, 39023536, --16429324, -4285841, -8888972, -10889353, -468151, -31378494, 16523276, 12759274, -26196616, 24536612, -6630893, -29553134, 12029667, -5635534, 21342766, 18895708, -27786290, 9778567, 30467424, -28732794, -15964393, -20412368, 15993384, 18914500, -29529510, 16680579, -2327872, -15368467, 22157736, 1357210, --35490388, 11026792, 15465103, 4930086, -10038412, 1910724, 26504780, -12156368, -25236690, 26823144, --1364726, 2240899, -1401233, -3124589, 16123844, -11980274, -6105833, 11826192, 4182761, -2600066, --12237972, 17923972, -6973953, -11314554, 697395, 9569724, -5816460, -4009352, -3038689, 14093398, --11050414, -5274220, 709207, 7803419, -6930467, 5694590, -557272, 14017163, -8966281, 2510945, -839666, 1700807, 24089398, -8378945, -106415864, -234564272, -92240864, -155486400, -212211120, 81916304, -29929480, 70902392, 318740256, 265725872, 175572896, 273875584, 186482656, 23269596, 47242492, 34529388, --144333984, -92707408, -63526324, -165281072, -168730480, -45921792, -46419468, -104464880, -30429844, -21673478, --126058904, -108241232, -34498788, -59095528, -119012472, -28282896, -19160386, -93015032, -9922448, 66413080, --27414776, -21930104, 97543536, 60239064, -38458748, 86545200, 142094160, 16731582, 80344880, 174187232, -85668488, 44741748, 187810336, 137587664, 102572944, 227844800, 307889568, 243753360, 282925600, 366358016, -239577040, 157158224, 205816976, 132957152, -35803384, -8074002, -89920512, -224297152, -317518880, -341648000, --457647008, -520731488, -552917952, -534852288, -513977664, -511009856, -426680320, -326364352, -306217760, -199535056, -16931834, 85929944, 111173616, 335034304, 328798016, 227063104, 334043776, 306245664, 166558832, 161895568, -213347136, 129408440, 61351996, 149486880, 152477248, 68977712, 123349848, 185794384, 123454536, 73828344, -158160016, 131148976, 26970784, 80641232, 116485952, 13713294, 22687628, 127436512, 78206520, 42454676, -135013376, 133860168, 49293340, 106783624, 92249456, -23176718, -65720516, -68127312, -157736432, -213777696, --211134144, -243776432, -268844544, -278795456, -272988672, -280032416, -311534912, -322285760, -308402816, -344053184, --294648704, -200646384, -153515552, -52246128, 88911728, 186234080, 272623584, 352035936, 357820704, 306426592, -278176992, 228533056, 172809088, 139306192, 116966992, 94453312, 73554000, 66612260, 61385820, 45123464, -37513856, 33026152, 15964930, -3494493, -15859704, -34508452, -52265992, -54976120, -43868260, -32267016, --24082956, -21229486, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +817654, 2046015, 1981591, 10121627, 2752537, 2140504, -2994129, 390842, -5127654, 1207423, +4716948, -2387465, 228707, -991601, -2522220, -4063576, 3143916, -6799470, -3429532, -3411278, +3693135, 4044786, 2133525, 970126, 2930778, 2420214, 4838281, -1676648, 1696512, 3010235, +642635, 993748, -3521336, -1516124, -1469953, -1323924, 3272765, -6254546, 1051193, -2165201, +6562710, 159988, -1175747, -1641751, -2698313, -897111, -2816425, -8250096, -2607045, -1612760, +-1327682, -1847910, 858993, -1543504, -382789, -528818, 2895882, 1295470, -367757, 1848983, +-1610613, 3546032, -2315524, -3839164, 3717831, 3893925, -1675037, -3687230, 360777, 2024540, +1532230, 1759863, -1740536, 24159, 1433445, 1927367, 847182, -526670, 242129, 2394981, +4616553, 2234457, -562641, -53150, -1086090, -1153199, 970126, -1519345, 942745, 1140314, +-440234, -148176, 510027, 444529, -456877, 386010, 270046, -2115272, 342524, 166967, +663572, 378494, -803159, 767189, 612033, -53150, 9155797, -1711545, -875100, 984084, +2527052, -6744710, 4202089, -8005819, -360240, -3874597, -569083, -2560338, -603980, -622233, +4025458, -3390340, 4359929, -4542465, -4963372, 2106145, 6663105, -7851200, -2180233, -3796214, +56371, -1973538, 2124398, 2819646, 1425392, 2872260, -4562866, 169114, 6407018, 2519535, +817118, -4647155, -6641630, -3994320, 1020592, -3395172, -1917703, 1301375, 4315369, -3884798, +-3828963, 1555852, -2799245, 4958003, 1661079, -506269, 3495030, 3321620, -2684, 5572183, +2756295, 1747515, 1476932, 3654480, 5748814, -3781182, 1100049, 1583232, -4039954, 363462, +3284039, -1273458, 8302172, -2559801, -2201708, -1724429, 3062312, 4227859, -5382668, -2189360, +1466731, -973347, 1322850, 523986, -2358474, 1056562, 504659, -1734093, -2852932, 1179505, +801011, 2621004, 220654, 811212, 1202054, -113817, -856309, 1921998, 114890, -4832, +1653562, -893890, 801011, 2208687, -185757, -474057, 417686, -326954, 681289, -1348620, +-423591, -626528, 89657, -202937, 863288, 93952, -845035, 40265, -11768747, -1913408, +-2631204, -2105071, -1063004, -1448478, 6245956, 7468948, -1718524, 6092948, 2317135, -3382287, +1579474, -5121212, 890669, 1073205, -6884296, -1025960, 1056025, 1192390, 4741644, -923955, +4116726, -2776160, -5284421, -5574868, -1605781, -2825015, -4235375, 4362076, -1727114, -853625, +-779000, 904628, 2364916, -6751689, 11811, 932545, -3211025, 8027831, 614180, -1990181, +-1757179, 8572218, -628676, 1081795, 5060009, 142808, 3086471, 1199907, 271120, 4727149, +-42950, -3320547, 4234301, 2272575, 2714419, 3845070, 1257352, -3135326, 2211371, 3154117, +3053185, 4735739, 11811, -4399121, -3528316, 5555004, 7724499, -7072201, 1402307, -1876364, +-1262720, 1615445, 2938831, 2830920, -2277407, -915365, -2201708, -3650722, -3204046, -1176821, +-2043868, -3138547, 695785, -861141, 1169842, 1005559, -992137, 556198, 172336, -2551211, +839129, -1727114, -3111167, 200790, -932008, -1305670, -1409286, -401579, 537945, -477278, +869731, -600759, -1065689, -1439888, -1347009, -576599, 214212, 1015223, -8646306, 9238475, +8559870, 6455336, -4484483, 5048734, 9108552, -2277943, 7121056, 2685965, 1080184, -1097364, +7850664, 3714610, -1822140, -5612449, 3273839, -2320356, -2992519, 3184718, 3764539, 1654099, +-5566815, 914291, 5025649, -2436320, 1714229, -10969883, 1596654, -875636, 5304822, 1301375, +-2261837, -3302830, 6784975, -5820218, 488553, -4699768, 566936, -1435056, 3798362, -782221, +-1215476, -5761162, -1365800, -1011465, 7178501, 362388, -6532109, -237297, -343597, 2244121, +3442953, -2910377, 31675, -3715147, 3988951, -867047, 4817343, -2585570, 7162932, 3550864, +-7863548, 8356933, -1184337, -5769215, 1002875, 7635915, 1571421, 1176821, -6153078, -401579, +-2371359, -3336116, -3213173, 294742, 2932389, 3759170, 2064269, 2054605, -2388002, 1813550, +-2066416, -238371, -89657, -964757, -379031, 2172180, -3410204, 934692, -312459, 300648, +1176821, 937377, -69256, 1491964, 186831, -2260764, -2423435, 1436667, 686121, -99321, +-1591822, -320512, 413927, -219580, -681826, -1576790, 1017907, -28454, -956704, 1090922, +-628676, -433792, -1232656, -775778, -449361, -1595044, 1145146, 9941239, -3456375, -7241852, +-402116, -10848014, -38655, -9325448, -3259880, 6366216, -6660958, -7347079, 2166274, 580894, +629213, -1742146, -2425583, -5325760, 3559991, -10395968, -3215320, 1024350, 6401649, 351650, +6495601, 2291902, 14303852, 5462125, -176094, 603980, 6799470, -1657321, -2068027, -1309428, +1107028, -4544076, -2268280, -7642358, -556735, -3526168, -2120640, 9352291, 129386, 5840619, +-2374043, 2365453, -614717, 3473018, -1193464, 3230889, -3244311, -4019016, -664109, 1099512, +-4049617, -4057134, 334471, 2043331, 4338454, -657130, -2058363, -917512, 4116189, 7021735, +368293, -4832375, -6890202, 68719, 1867237, 689879, 9356049, -5907191, -338766, 4168266, +-1571421, -4953171, 6588480, 2996277, 1153736, -3301756, -3549791, -5904507, -2321430, -660888, +-3066070, -1556926, -2658585, 470836, 663036, 1437203, 169114, 403190, -3295314, -1727651, +-3531537, -1253057, -1033477, -2709051, -1720134, 888521, -330176, -1164473, -322659, 837519, +-2217814, 1068910, -1604707, -214748, -679679, -1235340, -440234, -63351, 973347, -1585380, +-2323041, 1159641, 602369, 8894340, -6857452, -1407676, 549756, -547071, -272730, -5645735, +-4354560, -622770, 3717294, 1344862, 1480153, 1559610, 3906810, -819265, 3570729, 2899640, +-9287867, -3571265, -10897406, 2810519, -3853660, 5462662, -3548180, -4811974, -3546032, 2835215, +-7272990, -6034429, 8396661, -4608500, 9105868, -2167348, 2720325, -3223910, -6178311, 6769406, +-5245229, -5864778, -616328, -3192771, -6912750, -5305895, -8709120, 353261, 5547487, 3207267, +-3405372, 9635759, 3501472, -3546032, -4512937, -6977711, 270046, -2616172, -4914517, -2462627, +-2105608, -3438121, 1800128, 7711614, -503585, 505732, -5261335, 2454037, 2573759, -4544613, +-3646964, 1845225, 9336722, 3737695, -2365990, -1240172, -2010582, -9652939, -7641284, -6407555, +6667937, 7133404, -1078037, -3329674, 3076270, -2124398, 2695629, -1417876, 1254131, 224949, +98247, -3127810, 2054068, -1828046, -1358283, -489089, 1832877, 1410360, -229244, -2610266, +1617592, -376347, 1176284, -881542, -624918, -2303176, -1051730, -80531, -326954, 451508, +403727, -289373, 350040, -1909113, 817654, 194347, 234613, -686658, 2334315, 1519345, +-144418, -932008, 191126, -1449015, 2645163, 12802761, -2414845, -15032, -2092186, 8337069, +7903814, 2735894, -13153337, -2179159, -15977278, 9475235, 4006668, 277025, 16517370, 7822209, +-1439888, -7382512, 6815040, -3149822, 1700270, 2327336, 1085553, 5426691, -4794257, 9265855, +3532611, 919660, -2786360, -4684199, 6286222, 5308580, -1004486, 3460133, -7858180, 1499481, +-10497437, 4311074, 607738, 5387500, -8617315, 1816234, -2804077, 1933809, 9837623, 8348880, +409096, 2434710, -6088116, 8050916, 244276, 17102560, 18066244, -2367601, -4797479, -4888210, +-3890167, -10435160, -2909304, -13636521, 845572, -1111860, -741956, -2755759, 4820027, 8111583, +12679817, 11800423, 9082782, -14870251, -10611254, -432718, 768262, 15669114, -10989748, 8435853, +-566399, -3121368, -1592359, -346282, -3075197, -8622147, -5641977, -1593433, 2556043, 852014, +-194884, -2321967, 1388885, -3029026, -273804, -1590749, 3341485, 3743601, -870268, -661425, +3477313, 2675765, 469225, -468151, 1292785, 266288, 545998, -630286, 1518271, -71941, +-842887, -1348083, 465467, 1526324, 2240899, 4817880, 3744138, -1762547, 478352, -3346317, +-609349, 1563368, -246424, -625455, 124554, 740345, -4617627, 9197136, 1984812, -6772627, +-3738769, 17262548, 16975858, 19024558, -1854352, -788663, -3223910, 3213173, 9314710, 10716480, +3120831, -4581120, -9138617, -18598820, 5535676, -10995653, -2400887, -1104344, -2367601, 1277216, +-539555, -3394098, -394600, -10768020, -4258997, 673773, -1980517, -12034498, -5070746, 1060857, +8781061, -2447595, 270046, -9572408, -3221762, 148176, 6376953, -3863323, 3927748, -10699300, +-2971581, 2532420, 4089883, -2904472, 14431090, -2924336, -1810329, -7466801, -2458869, 5843840, +1992328, -617938, 7536057, 10456635, 12166032, -2099165, -6067178, -6853694, 112743, 1483374, +2864743, -4850092, 3933653, 5218922, 4366371, 4292820, 12163884, 8245801, 5441724, -603980, +2746095, -12048994, -2255932, 1323387, 6205154, 9847286, -1846836, -5480915, 1736777, 3424700, +-2820183, 5072893, 4039417, 5480915, 850940, 2426657, -250719, -377420, -3920768, 3127273, +-1220308, 2073932, 1801739, 625992, 2885144, 310848, 4639639, 3330210, 2101850, 1366337, +1309428, 70330, -593779, 435939, -1930051, -76773, -2414845, -3830574, -1546188, 868120, +682363, 1755568, -796180, 1177358, -1600412, 795643, 2054605, -17603998, 21971442, -589484, +3256122, 12027519, 244276, -4182225, 661962, -21380884, -12993350, -6096169, 3455838, -4191888, +2481954, -9986873, 6968048, -3474092, -54761, 13231184, -12840878, -8548059, 12399571, -3853660, +-18070538, 1303523, -11126113, 2326262, -886911, 6801618, 2962454, 3437048, 1421634, -2170569, +8092792, -882079, 10385768, 6337224, -3634616, -6191732, -5774584, 2828773, -2815351, 2845416, +2045478, 6100464, 1822140, -11419244, 720481, 3894462, -3905736, 494995, -7837242, -1742146, +741956, 523449, 18146236, -3154117, 12907987, 15397995, -4187056, 8245264, -2486786, -447750, +-8515310, 5442798, 13138842, 9153649, 2081449, 3599183, 8162586, -527207, 6773701, -2735357, +-3709241, -6531572, 3610994, 16727824, 3790309, -2162516, 1376000, -11762305, -3929895, 279710, +11120207, 8077760, 3539053, 7172059, -2011118, 7043747, -27380, 4430259, 605590, -345745, +-801548, 4908611, -477815, -3099356, -1859184, -1234803, -705448, -1253057, -2426120, 3540664, +-2251100, -3077881, -843424, -4041027, -2726231, -3451543, -1927367, -2414309, -3038689, 1035087, +770947, 1305133, 1149441, -1840930, -901943, -3191161, -4099010, -392990, -2258616, 1335735, +-1056025, 333934, 2078764, 2104534, 1518271, 3628711, -928250, -348966, 2830920, 21039434, +3062849, 5246303, -4973036, -2522220, 14292041, -9432285, -2174327, -18562848, 17392470, 9081171, +1258425, -6308770, -17513266, 1770063, -4654134, 2142652, -19637128, 7003481, 10385768, -11420855, +-2720862, 1703491, 1219771, 3794604, 11274826, 13853954, 57445, -34897, 2611877, 523449, +-8385924, -9614821, -6349573, -12669080, -6212670, 10783052, 5042292, -4042638, -5326297, -3544422, +-22234508, 4827543, 5367636, -10427644, 17075716, 602369, 12743168, -4590783, 8275328, -2733747, +-10981158, 983011, 10159208, -5600101, 5590437, 6493454, 18141404, 5004174, 5721434, 17350058, +9941239, 6562173, -23989002, 4959077, 3710315, 4645007, 525060, -9818295, 17447230, -12950937, +9968619, 10390600, -15631533, -3443490, 21480206, -19119584, 3280818, -4497368, -2026688, -6903086, +8389145, -3601867, -7087233, -6113349, 3775276, 8089034, -7530689, 9396852, -7772280, -3446175, +10763188, 3921305, -839666, -4743792, -4972499, -164283, -1945083, -8184597, -891206, -1766305, +-2237141, -772557, 6489159, -577673, -5890548, 519691, 2565706, 6114960, 3898757, 4851703, +-1908039, 2545842, -3489661, 141197, -1148904, 2536178, 5174362, -3817152, 2413772, 2383707, +-212601, 1374926, 1117228, -11361799, -16969952, -7668127, -7270843, -22669374, 14890652, 2056216, +15918759, 602369, 2025077, -8058433, -4329864, 7584912, -898722, 7854422, -8417062, -2915209, +1168231, -3996467, -6941204, 9427990, -10226317, 11293617, -4350802, 3458523, -2790655, -8207146, +-7369627, 3069291, -2848637, -408559, 5706401, 22926536, 1391033, -3295851, -8121247, 3022046, +18490908, -3770981, -3338263, -11242614, -4042638, 1254131, -10602664, -4091493, -15011448, 9175124, +-18316424, -32956894, -3678103, 738734, 15315317, -16422881, 14696841, 9433896, -7904351, -15520401, +-2679523, 2202245, 4206384, 251792, 9209484, -6612639, -2602750, -32518808, -4545686, 32977832, +3018825, -5884642, -4654671, -17541184, 12742094, -5832566, -5135171, -4544076, -2716030, -7753490, +-11337640, 3051038, 6180458, -607738, 4663261, -9651865, -17373680, -890132, -9255118, -2861522, +104690, -9213779, 1872606, -6789807, -11714523, -8777303, -4350802, 3453154, 5065914, -1259499, +-13819594, -3662533, 660351, -6962679, -3189013, -825707, -6443525, -3917547, 1467268, -528281, +-5109938, -2208687, 2047089, 581431, -6727530, -2842195, -62814, 5761699, 6459094, 1541893, +-2225330, -2678449, -998580, 4234838, -1181116, -686121, 139586, 1445257, -5686000, 4847945, +-1338419, 3190087, 15620259, 13969381, -4265977, -5506685, -1213328, -22041772, 14780593, -13886166, +-11407433, -8830453, 5662915, 2374580, 13720810, 1783485, -7256347, -8560944, -8821863, 7108171, +-3295314, -4703526, 12559558, 13956496, 4873178, -9208410, 11589432, 18525804, -6873559, -3925600, +16110422, 4204236, 3354906, -10294500, 145492, 15257334, -22199076, 15494631, -3185792, 2181307, +9398462, 11232950, 74088, 5654862, -10365904, -8515310, 5959267, 21270826, 5849746, 5250061, +8195872, -10612327, 2420751, 9482214, 5617281, -1687922, 7748121, 4778688, -12529493, 10392747, +-12205760, 2851858, 9235790, -9777493, 7672959, -11948599, -4600447, 2256469, 620623, 7729868, +-4735739, 6635188, -4845260, 974958, 2642479, -2194728, -4741644, -9669582, 26141318, 2808909, +7969849, -11281268, -26294326, 18716930, -17817672, -7785702, 77309, -4141959, -2522220, -1554778, +-7261716, 4647692, 3920232, 2008434, -6696391, 8505646, 6715718, -2846490, -2741800, 2503966, +-2221035, 2353642, -2241436, 9011378, 3490198, 830539, 6567542, 6735046, -3744138, 20401, +3403225, 4670240, 2090039, 2220498, -4074850, -5591511, 4655745, 5790153, 8594766, -1197222, +-7483981, -1121523, 911070, 3747359, -11607686, 4408784, -3735548, -1774358, 2952790, 2717104, +-2705830, 4046396, 556735, 3201361, -1671279, 7718593, -14532559, 15519864, -5622649, -15217069, +-19750944, -5477694, -1948841, 11708618, -17377974, -2741263, -1983201, 9238475, 17396766, 14425185, +9002251, 1435593, -4376572, -2606508, -1715839, 12268037, 10084583, -2286533, 1651415, -2583423, +7915088, -18875844, 11372537, 6309844, 8916352, 3084324, 2105071, 16414828, -6374269, -13821205, +140660, -4493073, 1015760, -19200114, -10611254, -1047435, 16183437, -10803990, -3379603, 2742337, +-587874, 561030, 15905875, 6474127, -2395518, 1494112, 7813620, 5218386, 18520436, -5327907, +8492761, 9495099, 5082557, -2885144, 3081639, -19985020, 8650064, -3646964, 972810, -4498978, +-10998874, -14750528, 3082713, -6973417, -20129438, 4965519, -17094506, -12502113, -2908767, -25742960, +-15613817, 3995930, 11091216, -12791486, 2844342, 1156957, 29770566, 28315646, 26654568, -675384, +1550483, -13859323, -8383240, 11235634, -5947456, -3803194, 1890859, -3423626, 6293738, -7514582, +-3751654, -142808, 2424509, -4457639, 5776731, 5891622, 316754, -2312840, 1641214, 5765994, +-4499515, -5867999, -1479079, 5207111, -6787122, 11741904, 6725382, -376883, 5321465, -1691680, +-4741644, -7475391, -4077535, -6607271, -3600256, 4137664, 770410, 11870753, -2648921, -3556770, +-26189100, -28976534, 17293148, 15544024, 5236639, 16840566, 28176060, 8041790, -10699837, 9120900, +-4243965, -7905424, 12899397, 965294, -11497091, 7114077, 9291625, 2179159, 3286187, 746251, +1455994, 25811142, -530428, 5558225, 2426120, 16033113, 965831, 25605522, -97711, -11210402, +20470352, 4221953, -9021579, -3152506, 10847477, -2201171, -170188, 8516383, -15527381, 15556372, +-3259343, -22679574, -6345814, 2273112, -22698902, -2503429, -2356327, 10032507, 9671729, 17132624, +-11969537, 2653216, 2734284, 3600793, 7318088, -10836202, -12251394, 6478958, -288837, 13110388, +10635413, 3331821, 27299886, -4500589, -4180077, -18602040, 27854474, 4971962, 19332722, 11880953, +-31054224, 4508642, 2841121, 19099182, -10087268, 8173860, 190052, -8209830, -1012539, -6623914, +15359877, -29343216, -3558381, -2054068, 131533, 1386201, 4737349, 7251516, -91268, 13629005, +-518080, -1887101, -4344897, -2763812, 890132, -4664335, 1611150, -1232119, 4108673, 2929705, +-1388885, 1190243, -1580548, -8144869, -435939, 464930, 2087354, -8320426, 4490389, -1669132, +4715874, 3774740, 6659347, -6730751, 7780334, -4172024, 2514703, 5666136, 5073430, -1687385, +180926, -3007014, 4391067, -208306, 2138894, -51003, -912144, 11370389, 6339909, 212064, +5240934, 1623498, 5443334, 17149804, -36230732, 21507048, 21883932, -9345312, 5200669, 3036542, +5921686, 143345, 17424682, -12713640, -2742874, -13639742, -111669, -7715372, 1231045, 3647501, +-19869592, 8923331, 21599390, -14877767, -14230300, -14558329, 28758564, -12584791, -7046431, 2649458, +-9838159, -29819422, 5251672, 21599928, -29680908, -13485124, 10277857, 15902116, 4343286, -4548907, +6896107, -10570451, -4916664, -586263, 14728517, -20244866, -16045461, 11368242, 18496276, 7233262, +-23052700, -7512972, 601832, -1113470, -3981435, 12006044, -3548180, 18144090, -14771466, -3277060, +10201, -16998944, 10783589, -19782082, -13529684, 6245956, -8781061, 19130858, 27786828, 16316044, +-18302466, 9667971, -5347771, -5553930, -12900471, -4087198, -21055540, 16085189, 11938398, 5686537, +694174, -10042170, -5542656, 6467684, -21971442, 17726940, -4137127, -3089155, 9376987, 1599339, +8548596, -2461016, -1256278, -7585449, -2097018, 659278, 1584843, -5963025, -1990717, -2872796, +-2039036, 9936944, 1150514, -219043, -4691178, 4005057, 4071629, -3603478, 2295660, 4523675, +1122597, 7653632, -2657511, -5480379, 1218160, -8901857, 4677757, 3243774, 1250372, -328565, +3634079, -805843, 5869073, 1792075, 4214974, -7053947, -1991791, 6473053, 486405, 2605435, +3467649, -6579890, 1081258, 6652368, 21021718, 35051764, -267362, -26563836, 5609228, -31694174, +5411122, 14369887, 6747931, 1892470, 19030464, 14064944, -865973, -2922725, -26201448, -14133127, +374736, -12277164, 35460324, -6492380, -8056285, -15336791, 1896765, 13320841, 9322763, -507880, +6846178, 10371272, -15748034, 5362804, 30425012, 10755135, -20900922, -14749991, 9872519, -10354092, +-1422708, 7390565, -4640712, -17265232, -4128001, 2067490, 28991030, -6303402, 6432788, -7742753, +-23443542, 4074850, 29412472, -7939784, -17646946, 5114233, -10810433, 7176891, -6180458, -7204808, +20212652, -5196374, -2313377, 9867687, -17431124, 6267431, 21392158, -8876087, 1835025, -12562242, +37620692, -6863358, 4482872, 12195023, -8743480, -2108829, -10050223, 5262409, -11356430, -9592273, +-8959302, 14401562, -19565186, 2861522, -2900177, -5843840, 15202574, 334471, -5197448, -6464463, +791348, 5702643, 4435628, -8715562, -1589675, 388158, -2435783, -10783589, -6488085, -1964948, +2561411, 864899, 862215, 1506997, 8773008, -8866960, 9222905, 1820529, 2657511, 617938, +7310035, -4152697, 12009265, -2646774, -198105, 9209484, 12062953, -6324340, 7881265, -3952444, +2632278, -7010997, 6089190, 5122822, -10434623, -528281, -4185983, -1436130, -5228586, 3759170, +-6431177, 5761699, -10212358, -58040576, -20332376, -1046898, 18554796, -9729175, -29046326, -10940355, +-4250407, 14235132, 3709778, -3875134, -14361297, 15178414, 26949846, -12227772, 20374788, 5113696, +-38565048, 14393509, 18112414, -6350109, -15677704, -2935610, 23778550, 25373594, -2094333, -19232326, +1351304, -2191507, -2480344, -16026670, 3971234, 7319698, -25428354, 17563196, 14932528, -17933636, +3333968, -20120312, 7138236, 49196168, -43939664, 45485316, 20586316, 2063195, 27827094, 13834090, +-28437516, 17113834, -21379274, -4787278, 23390392, 1107565, 6714108, -11935177, -20818780, 63392644, +-14872935, 932545, 24989730, -12046310, 4893042, 1925756, 15448460, 35720708, 33946348, 32130650, +2023467, -607738, -5143224, 1650878, -8653822, 2430952, 27269822, -7196218, -9429064, 2745558, +3793530, 15839839, 18451180, 5275831, 5192079, 13115220, 5588290, -9976672, 3288871, -5135707, +-14778446, -6624987, 7806640, -11132555, -16044387, -12179454, -534723, 1496796, -9186398, 4753992, +10452340, 1647120, -3346317, -595390, -11716134, 13943611, -2018635, -3006477, 9665287, -7938710, +6580964, -5935108, -4743255, 16408386, -27380, -12129525, 15556372, -9503689, 9392020, 4416837, +-6058052, 4708358, -2107218, 11340861, -5147519, 3980361, 593242, 979789, -1165010, 12070469, +-6146098, -1377074, -834834, 2177549, -1711545, 5284958, 14854681, -3930432, -42831024, 19451906, +-31119722, 43751760, 5154498, -38045896, 8571144, 340913, 17852032, 8432095, -9225053, 32379758, +7885560, 1651415, 21600464, -17275970, -24055574, 794569, 12562779, 43641700, -6161131, 124017, +-4594005, 31457952, 3399467, -24962886, -14789720, 4743792, -2792803, 13937706, -24300924, 11678553, +3930969, 7208029, -2201708, -9464497, 5490579, 9778030, 63888, 29237990, -47144784, 4142496, +-16654809, -10300942, -6120329, -34417720, -50096500, -51782272, -37710888, 4027069, 142271, -30020748, +-294742, -5443871, 3186866, -18615462, -48278652, 47556024, -909996, -6982543, 9620727, -47106128, +-3302293, -11699491, 8782671, 13886703, 64666100, 48285632, -5480915, -552440, -1600949, 12757127, +19496468, 11919071, 8850854, -1770063, -7900056, -45820320, 8578123, -900869, -17976048, -7974681, +29870424, -4165045, -5560909, 14350023, -1311039, 15737834, -6205691, 7930120, -982474, -3226594, +10971494, 13591424, -6292664, 1957968, 5881421, -2476049, 2706366, 758062, -293668, 9305047, +-4055523, -4639102, 7516193, -8875013, 11704323, 2147, 6262599, 9938554, -5103495, 2520609, +8441221, -1987496, -5808944, -2009508, 802085, -1479616, 2182917, -11571179, -914828, -9144522, +9535901, 1538672, 6356015, 4731980, -1583769, 387621, -836982, 4537096, 5845451, 5068599, +-12159589, 58932320, -56114284, 9695352, -10749229, 2247879, 23847806, -17277580, 6018323, 971200, +-60714732, 1574642, -6742025, 3018825, 7107634, -27093190, -10044855, -44895832, -11506217, -2130304, +2542621, -16955458, -12707734, -19522774, -8078834, 19492710, 4322348, 39307004, 9698036, -13213467, +-13834627, 24175298, -26736708, 46224584, -35982164, 10564009, -29011430, 657667, 27865748, -50394460, +47623672, 8451959, 5588826, -34587908, -6830609, -6513855, 98784, 16685411, 16692390, 20987358, +-39901320, -949725, -15628849, -13567265, -15297600, -21502216, -14813879, 817654, 23015656, -24405078, +6694781, -44987100, -14969572, 11461120, 13524315, 2505577, -51147692, -27666032, -18154290, -26040924, +-21515638, 1891396, -16925392, 27350352, 8302172, 13746043, -9342628, -14053133, 45830524, -15244986, +12409234, -9100499, 3682935, 34426312, 4726075, 6295349, -19098108, 19609210, 11467026, -7963943, +18255758, -13495324, 5137855, -4937065, 12410845, 2572149, -3947075, 6773701, 15773804, -5219459, +5155572, 5684389, 4837207, -1722282, 4371740, -2094870, 10888816, -3411278, 1956358, 10292352, +-1929514, -3799972, 3307125, 4548907, -6802155, -1381906, -19216220, 12332999, 8491150, 249645, +-10568304, -4221416, 1162326, 4252018, 15005005, -2229625, -3841312, 5360119, 4015795, -2015950, +15188615, 3049964, -18036178, 4992900, 18277234, 25606596, -47421808, 72998336, -54465016, -5488968, +-32755032, 6787659, 983011, -19688130, -27981712, 33326262, 22473954, 10657961, -14156212, 14860587, +4788889, 31484258, -24435142, -16042240, 19652696, 32720134, -41135588, 16988744, -1235340, 19945828, +-14679124, 6021544, -18105972, 4036196, -34132640, 11533061, 37091336, -976031, -2601140, 46056008, +8207146, -20868172, -44515188, 38516192, -20000588, 17509508, -16201690, 45994268, 20402706, -4779762, +4920959, -26227218, 3752728, 11639361, -12575664, 13029320, -55143620, 21973052, 50417548, 39510476, +-21520470, -22292490, -22454090, 25666724, 2260764, -7794829, 2261300, 65102040, -31431644, -14504105, +25311316, -21328808, -58341764, 25138980, 13291850, -41567232, 23678154, 40801116, 35953172, -10646150, +-15790447, -28258200, 15499463, -17329120, -11087458, 26288422, 17892834, 8331700, 23003308, 13171054, +-8648454, -7926362, -29266980, 7177964, -12195023, 10512469, -10741713, 21318070, 14674830, 3524558, +-3780108, 20291572, -10760504, -1225139, 2734284, 7994545, 4780836, 9557376, 8614094, 1024350, +-4680441, -2530273, 7246147, 4092567, 2990371, 1325534, 11318849, 36531920, -971200, -2503966, +5523865, -12212203, 4567698, 13388487, -18544596, 8575976, 9743133, -6766721, -5137855, 8884140, +4871567, -10378788, -46938624, 25035364, -2776160, 6518687, -17227650, 15001247, 278099, 8225936, +2454574, 2724083, -9822590, 7472170, 25339234, -32410896, 27805618, -4752382, -17176648, 5740224, +-11709691, 7558069, -11999065, -9783399, 8164733, -25829934, -2738042, 34463892, -49811420, 14057965, +2274722, -8283382, -15384573, -18036716, -11864310, 36178656, -29868276, -4210679, 11562052, -30175904, +7549479, 16656420, 10972031, 5749888, 5097590, -16981764, 13291850, -44397076, 481573, 39023536, +-16429324, -4285841, -8888972, -10889353, -468151, -31378494, 16523276, 12759274, -26196616, 24536612, +6630893, -29553134, 12029667, -5635534, 21342766, 18895708, -27786290, 9778567, 30467424, -28732794, +15964393, -20412368, 15993384, 18914500, -29529510, 16680579, -2327872, -15368467, 22157736, 1357210, +-35490388, 11026792, 15465103, 4930086, -10038412, 1910724, 26504780, -12156368, -25236690, 26823144, +-1364726, 2240899, -1401233, -3124589, 16123844, -11980274, -6105833, 11826192, 4182761, -2600066, +-12237972, 17923972, -6973953, -11314554, 697395, 9569724, -5816460, -4009352, -3038689, 14093398, +-11050414, -5274220, 709207, 7803419, -6930467, 5694590, -557272, 14017163, -8966281, 2510945, +839666, 1700807, 24089398, -8378945, -106415864, -234564272, -92240864, -155486400, -212211120, 81916304, +29929480, 70902392, 318740256, 265725872, 175572896, 273875584, 186482656, 23269596, 47242492, 34529388, +-144333984, -92707408, -63526324, -165281072, -168730480, -45921792, -46419468, -104464880, -30429844, -21673478, +-126058904, -108241232, -34498788, -59095528, -119012472, -28282896, -19160386, -93015032, -9922448, 66413080, +-27414776, -21930104, 97543536, 60239064, -38458748, 86545200, 142094160, 16731582, 80344880, 174187232, +85668488, 44741748, 187810336, 137587664, 102572944, 227844800, 307889568, 243753360, 282925600, 366358016, +239577040, 157158224, 205816976, 132957152, -35803384, -8074002, -89920512, -224297152, -317518880, -341648000, +-457647008, -520731488, -552917952, -534852288, -513977664, -511009856, -426680320, -326364352, -306217760, -199535056, +16931834, 85929944, 111173616, 335034304, 328798016, 227063104, 334043776, 306245664, 166558832, 161895568, +213347136, 129408440, 61351996, 149486880, 152477248, 68977712, 123349848, 185794384, 123454536, 73828344, +158160016, 131148976, 26970784, 80641232, 116485952, 13713294, 22687628, 127436512, 78206520, 42454676, +135013376, 133860168, 49293340, 106783624, 92249456, -23176718, -65720516, -68127312, -157736432, -213777696, +-211134144, -243776432, -268844544, -278795456, -272988672, -280032416, -311534912, -322285760, -308402816, -344053184, +-294648704, -200646384, -153515552, -52246128, 88911728, 186234080, 272623584, 352035936, 357820704, 306426592, +278176992, 228533056, 172809088, 139306192, 116966992, 94453312, 73554000, 66612260, 61385820, 45123464, +37513856, 33026152, 15964930, -3494493, -15859704, -34508452, -52265992, -54976120, -43868260, -32267016, +-24082956, -21229486, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -3984119, -2426657, 3886946, -1370095, 3454228, -561030, 3645890, 1834488, -801548, -1427540, 3693135, -312459, 736587, -4197794, -673236, -301721, -187368, 5740224, 2804077, -208843, -4306242, --3131031, -1852742, 526134, -98784, 1243930, 2638721, 804233, 973347, -4345433, -668941, --4229469, 169651, -2338610, 2769717, 2766496, -1103807, -2281702, 2895345, 620623, -1087164, --3910031, -531502, -2507724, 701690, 2392297, -3968550, -1935957, -664109, -1551557, 10126996, -2413235, 5845988, 426276, 1917166, -42950, -2927557, -2713883, -3456375, 1633161, -2851858, -2051384, 62814, 2503966, 2559264, 6219113, 1874753, -514859, -316754, -3693135, 6021008, -5542119, 966905, 1709397, 1567663, 1715303, -353798, -3091840, 918049, 1788854, -1165010, -517544, -955093, -2826089, 1341640, -2357400, -1604707, -734439, 183610, -1054951, -1148904, --1343788, -34360, -75162, -216896, 270583, -477278, 898185, -506806, -841277, -88047, -1126892, 417686, -463856, -1523640, -448824, 1395328, 92342, 624918, 552977, 13995151, --3311420, -2928094, -1137093, -2772402, 642098, -6654515, 518617, 1324461, 338229, 4521527, -517544, -934692, -3995930, 2557653, -5632850, -4856535, 1752884, -2369211, -1132798, -840203, -938450, 3795677, 5195300, 389768, -806380, 6175626, 2226404, -360240, 224949, -2524904, -77846, 6778532, 2684, -3151432, -2548526, -732829, 2299955, -3138011, -3867081, -3950833, --3231963, 3092913, -3040837, 1156420, -3694746, 1299228, 4472672, 291521, 3178276, -1352378, --2522220, -1248762, 2204929, -135291, 3412352, 4990215, 731755, -1510755, -2582349, -130997, --382252, 227633, 158377, -4401805, -464930, -2057826, -2238752, 2131378, 452045, 1367410, -1620276, -5237713, -2918967, 2168959, -979789, 3868155, 702764, 3258807, -666794, -833224, --900869, -1897839, -445066, -2090039, -840203, 57982, 3051574, -738198, -68719, -529892, -966905, -28454, 1176284, 233539, -257161, -772020, 947577, -1500017, 6979, 76773, --851477, 701153, 897648, -1267015, 424128, -626528, 545461, 528281, -3758, 897648, -96100, -469225, -9992241, -4937065, -2165737, -6834904, -2381559, -6562173, 1906966, -594853, --4095788, -4720169, -720481, -3859565, -113817, 3171297, -261993, -5861020, -2190433, 66035, --2306934, -1913408, 1668058, 5483063, 7030862, -1156957, -1906429, 3941706, 4482335, -1424855, --1068373, -918049, -3205119, 948651, 1445257, -2886755, -2171106, -687732, 2697240, 6002217, -370441, -2048699, -20401, -3056406, -1142998, -4847945, -2295660, -2162516, -7659001, -831613, --3489661, -2426120, -8406325, 5183489, -3673271, -3255585, 1466731, -541166, -628139, 1078574, --6988986, -1828582, -2521146, -571231, -4046396, -568009, -1919314, 1828046, 2393371, -2285460, --1235340, -3347390, 1155346, -514859, -705448, -6442, -5182415, -137976, -4686346, 700080, --341450, -1483374, 1350230, 5652177, 2675765, -1347009, 282931, -1003949, -2228551, 206158, -852551, -1119913, -183610, -1384053, 12348, -576599, -1733019, 676994, 634045, -1809792, --867583, 479963, -780610, 236760, -1199370, -923955, -979253, -1690070, -1847910, -148176, -438624, -936840, -1125818, -8053, -545998, -237834, -620086, -17717, -363462, -619012, --1530619, 802085, -557272, -727997, -758062, -18480170, -1451699, -9104257, 8192650, -4735739, -14740328, -9415642, 9295383, -8344048, -493921, -112206, -6430103, 5021891, 192737, -2385854, -1517734, -2085744, -834834, -6257231, -49392, -4717485, 3757560, 1327145, 4597763, -2674154, -6855305, 6179384, -5972152, 1701881, -5076652, 5432597, 59056, -3762928, 326418, -512175, --186831, 3993246, 591632, -5883032, 2445447, 4271882, -272194, 5041218, -2325725, 4115116, --6114423, -3091840, 4024384, -3497714, 1024350, 5427765, -4909685, 8008504, 3165391, -7860864, -1924682, -7571491, 2740189, 4261145, 2870112, 4103841, 5873368, 2005750, -714575, -447213, -395674, 1884417, 4223027, -1430224, 7973607, 1571958, 5465883, 2992519, 1592359, 419296, -5483600, 1016834, 1365800, -3109556, -4267587, 2210835, 2961380, 353261, 4714801, -525597, --32212, -838056, 5597416, 1724966, -1993939, 1303523, 958851, 841277, 1910724, 328565, -3484829, -508417, 1203128, 695785, 1335198, -842350, 667867, 367757, 82141, 348429, --1182190, -1028645, 443992, -1275068, -581968, -1385127, 913217, 20401, 12213276, 68719, --3323768, -1114007, -4555350, -5438503, 8919036, -1730872, -1298691, 8186208, -634045, -1579474, -3619584, 6371047, 1816771, 3165928, -163746, -6949257, -1843078, 5228586, -7924752, -7844221, --2944200, 1723356, -5589363, -3353296, 108448, -777926, 5486821, -2111513, -1207423, 5794985, -8048232, -6971806, 1819992, -1656784, 2933463, 810138, -3102577, -666794, 3343632, 5143224, --1385127, -7238094, -1637993, -630286, -1919850, -3607773, 518080, -450435, 1312649, -988916, -999654, 6782290, -5017059, 658741, -3823595, -3082176, -5252745, -1570347, -3039226, -7237557, --270046, 507343, -2832531, -544924, -2997887, 2807298, 3510599, -542777, 1036698, -2599529, --736587, 8763344, -1170916, -3617973, -11895986, -5399848, -170725, -4049617, 2727304, -1141388, -1006633, -3221, -2404645, -440771, 3443490, -2913062, 662499, -814433, 317828, 16643, --2507187, -1832877, -1067299, -1911261, -403727, -3031173, -654446, -1715303, 315143, -1194001, --415001, -1630477, -1788317, -1727651, -468151, -177167, 600222, 455803, -261993, 503585, -380641, -86436, 1673964, 1480690, -47245, 881005, -725850, -914828, 184684, 15832323, -17791902, 3386582, -6470905, 4053912, 7016366, 7037841, 3972308, 5317170, 2382633, 8703751, --878321, -1061931, -3544422, 5465883, -3197603, -7655243, -10550587, 1221381, -5056787, -4349728, -3739843, -1101659, -2801393, 8894877, -630823, 11048803, 124554, -4350802, -2975876, 3886409, -2580739, -2160369, -8731132, 12620225, 7297150, 89121, 6842957, 4097936, 4453881, -4115116, -5027796, 2580202, 1020592, -1502165, -2237678, -5536750, -7830263, 2241436, 3810710, -6087043, -2468533, 5305895, 7890392, 2113124, 7130183, 3332358, 6077379, -8876087, 2664490, 853625, -1808181, 259846, -590021, 3819300, 3457449, 3379066, 4878546, -1566053, 2381023, 1436130, -7010461, 8600672, -4306779, -5029407, 789737, -2025614, -4525822, 1951526, 4763119, -2882997, -2032593, -8517457, -6263673, 1495722, -4314832, -1996623, -1377074, -3843996, 40802, -4832, -521839, -45097, 1729798, 2065879, -105764, 1068910, 380641, 1576253, 1652489, 72478, -152471, -52076, 1804423, 950262, 1012002, 2244121, -346282, -1064615, 1684701, -420907, -28991, 2570001, 1586990, 2436320, 3294240, 563178, 1497870, 933082, 2195265, 14540075, -4598836, 6422587, -5314485, 2110977, -13156022, 712965, -9502078, 7206955, 4853850, -4001836, -6072547, 3449933, -6429029, -1593970, 9322763, -300111, 6424734, -1752347, 1302986, 7430294, --9220758, -708670, 1530082, 2717641, 636729, 2989297, 409096, 9009231, -4154307, -2587181, --2699387, 6811818, 888521, -3198140, 4160213, 11485816, -7994545, 1419487, 1572495, -697932, -4664335, -2323577, 8803072, 2947958, 2251100, -7196755, -681826, -1910724, 4101694, 3055869, -4429185, -4946192, -3190624, 4174171, -8579734, -4833449, 1994476, 9259413, 5658620, 8186745, --8894877, -2840584, -9038759, -2364380, 2800856, -788127, -8523363, 1110786, -5203890, -90194, --9329206, -11382737, -4590247, -8222178, 523986, 2881386, 1688996, -3529926, 4591320, 7264401, -2102923, 2127620, 4251481, -1341640, -6924024, -451508, -4742181, 2487860, 865973, -499290, -1369021, 623307, -5049271, -2647847, -1384053, 2535641, 444529, -1829656, -539555, -191663, --670552, 387621, -962073, -513249, 442919, 2299955, 678605, 719407, 616328, -497679, -780073, 1519345, 898185, 1989107, 702764, 1007170, 218506, 1563905, -2406792, -17141752, --15458661, -11124502, 3373697, 3416647, 12809203, -5685463, 12164421, -4996658, -20118164, -1811403, --1889786, -7799124, -13024488, -4772783, -306553, -8041253, -91805, -12359305, 878858, -13028246, -7421704, -3301219, 5399848, -2580202, -256624, -4071629, -4719632, 7998303, 1547262, -2371896, -9080098, 985695, 1437203, 3092913, 8353175, 7326678, 5583995, 103616, -9954124, -1075352, -4735202, 1404454, 6049462, -2959233, 2676838, -14614700, 4573067, 8741869, -11070815, 6448357, -2234457, 10347113, 7914551, -75699, -2785286, -315680, 7015829, 3417183, -9342628, -7631620, --12903155, -6293738, -8677981, -2028298, -10727218, -2348810, -3632469, 10806675, -5129802, 5301064, --2875481, -1669669, -3602404, -7603703, -4079682, -2499134, -2563559, 6769942, -20649130, -4473209, -9569187, 355945, 1785096, 5066988, 9689446, -6209449, 1100585, 2499134, -520228, -186294, --1496259, 2575370, 3965866, -1859721, 258235, -491237, 4437238, -1770600, -207232, 4440460, -855235, 1497870, 2026151, 2029909, -823023, 278099, -1292248, -1868311, -1078037, -3231426, -825171, 1942936, 1336809, 714038, -4147865, -92342, -621697, -300111, -1988570, 1020592, -1738925, -1094143, -280247, 2042794, 2205466, -22512608, 17440252, -4793184, 10349261, 6059662, --324807, -14860587, 11872900, 1694365, -945967, 7530689, 5365488, -6087580, -17717, 12776454, -4296041, -5647345, 9089761, -4846334, -3881577, -2637647, 2972117, 141734, -1564442, 1301375, -3942243, 3532074, 3630858, -9265855, 5851893, -7685844, 10640245, -6494528, 10590316, 3457986, -1078037, -10239202, -10406169, -3402151, -3419331, 12306155, 3531000, 9855876, 4175245, -8672076, -404264, -1921461, 4265977, 306553, 3764002, -1026497, -5813775, -3378529, 6277632, 15568720, -11245835, 1319092, 3907347, -1064615, -2109366, 8012799, 6737730, -2794413, 9883793, 13909788, -19430968, 469225, -11039140, -13320841, 4728222, 2480881, -496606, 3419331, 132607, -4230006, --432718, 11759620, -2065342, -5056250, 20908974, 5323612, -3457986, 6190122, 212064, -154619, --586800, -3239479, -396748, 6406481, 3218541, -1964411, -2976949, 4517769, 3676492, -217970, -8542153, 2527588, 1676111, 1003949, 3881577, 1551020, 3642669, 2547989, 1330366, 809064, -4570382, 2590402, 2479807, 770410, 4539244, -454193, 1837709, 2772402, 1941325, -224412, -5064304, 5821828, 1860795, -767189, 6039261, 624918, -2615635, -299574, 4451734, 418222, --221728, -718870, -635655, 423054, 1279900, 3015604, 10501732, -15330886, 12924630, 5326297, --10466835, 24552180, 3701188, -12504797, 2915746, 6856916, 667331, 4961761, 17619566, -16809966, -11004243, -6777996, 9761924, -3680250, 2094333, -15560667, 2665027, -1651415, 6283537, -5935645, -884763, 1245004, 175020, -9107478, 8799314, 978716, -943282, 4197794, -1745904, 4139812, --2173790, 12451110, 9781788, 12328167, 12204686, -1904818, 4265440, 5357972, 541703, -6335077, -8628052, -10153303, 3156801, 10227391, -6038187, 5460514, -11341935, 3710315, -996432, -2605972, --989990, 964220, 3490735, 3470871, 11927124, -7732015, -398358, 8009577, 16996260, -14975477, -3844533, -3594351, 5148055, -2659122, 24823838, -15178951, 5428839, -8403104, -4759361, 2345052, -2565706, 1504312, -21769578, -11324218, 17916456, 9978820, -2017561, -9569187, -11285027, -4308926, -3963181, -11937325, -6650757, 6105296, 3272765, -86973, -405338, -8296803, 1517734, -2293513, --3257196, 4045322, -2152316, -2433099, -1072668, -7221988, 2429341, -1732482, -2601677, -2502892, -3275450, -3376918, 4006668, -445066, -1162326, 1610076, 1338956, 5522254, -5598490, -954557, --4297115, -671626, 2518998, 2237678, 6825777, -2057826, 3690451, 1095217, -2720862, 11457899, --15131707, -3231426, 21337398, -6439230, -452582, 11418707, 2662880, 7036230, -15968152, 15269146, -971736, 1116155, -4072166, -9618579, -1344862, -1511829, -10297184, -6226629, 11368242, -3649649, -2163590, -5620502, -25071872, 8452496, 1115618, -7765838, 4760971, 9673877, -932008, 1043677, --1981591, 2411624, 6553047, 2063732, 10543608, 7206419, 1632088, 9207336, -7464653, -7360500, --10460393, 3912715, 6012418, 1724429, -16579648, 4663798, -14169097, 20467130, -4881767, 7253126, -17467632, -6925635, 11091216, 2740726, 12077448, 4838818, -5858336, -17986786, -12905840, -10078141, --1403381, -10578504, -2124398, -9252433, -6001680, 18020610, 3896609, -7735773, -6852084, 3605088, -6691559, -1607392, 2603824, -32871532, 13201119, 2197413, -10547366, -12986370, -3391414, -21725018, -2327872, 10737418, 1178969, -9359807, 5745593, 4809827, -7668127, 3790309, 2269353, -1953673, -245350, -4947803, 1280974, 1660005, 1261647, -6436009, -3506304, 2581275, -4012036, 878321, --2425046, -1590749, 1534377, 5341866, -6837051, 2335925, 5305895, -6407018, -5995775, 745177, --5502927, 1220308, -3655554, 3750043, 2050310, -6416681, 3568581, -4230006, -2714419, 4352950, -1016297, 9852118, 3062312, -60130, -622233, 731755, -2595234, 7099581, -20359218, -24948392, -14945412, -12293807, -14292577, -4144107, 9353902, 19340238, -12859132, 955630, 9172976, -2869575, --4102231, 4910758, 3176665, 14513768, 4813585, -14136348, -607201, -7217156, -556735, -8439074, --11075110, 1599875, 10936060, -902480, 4838281, -9226663, 2605972, 10790568, 8365523, 1180579, -787053, 6705518, 6381785, 4015795, 9885404, -12701292, 13737990, 9838696, 3324305, -10517301, -688269, 7926899, -8315594, 9225053, -6619619, 10461467, -2899103, 13690208, -21760988, 22907208, -5310727, 21595096, 1313186, -4701379, -1604170, 7730405, 425202, -18229452, 617402, -1396938, --18894098, 5828271, 13262859, -17954038, 14768245, -15819975, 4793721, 5945309, 3156801, -19770272, --9591199, -9766756, 1787243, 1342177, -11589432, -16950626, 3176128, -14923938, 9982041, -7269769, --3997004, 4963909, -9357123, -7248831, -9599789, -4024384, -5409512, 169114, -7706782, -5773510, --7045357, -10349797, -5117991, -2261837, -2454037, -2711735, -3129421, -2110440, -5021354, -5458367, -3383897, -6509560, -3629247, -1762010, 4779762, -2531883, 3221, -8280697, -6041945, -2786360, --315143, -1978906, -7133941, -1090922, -763430, 5539971, 3481071, -4714801, -4474282, 801548, --2469606, 4054449, -2511482, 2115808, -4485020, -11515344, 17443472, 3520263, 11479374, 11126650, -3122978, -8591545, 1893007, 29444148, -20253992, 4872104, -3565897, -11059541, 653909, 3953518, -4748087, -140660, 67646, -5801964, -8509941, -13238700, -6695854, 10001368, -8393440, -13300977, -7644505, -4766340, 2929705, -1759326, 5939940, -5661304, 12524125, -4517769, 1352378, -281857, -1321239, 11547020, 3924526, -5356361, 6152541, -4901632, 9456444, -5686000, 3877282, -13533979, --9898289, -7247221, 2362769, -6759742, -11812234, 4978941, 8751533, 2574296, -6284074, 4051228, -6180995, 7036230, 18924162, 26126822, 35485020, -3584150, 5655935, 8607651, 5015448, 4834523, -5703180, -7204271, 14081050, -1925756, 18382996, 22752590, 16642461, 6823630, 9368397, 3219078, -31733902, 9219684, -5810554, -4929549, -4511327, -1711008, -2042794, 1804423, -2533494, -5802501, -5307506, -9256191, 2792803, -1978906, 2946885, -4515085, -3733400, -2761127, 7196218, -6830072, --6739878, -315143, 2967286, -3340948, -8652748, -2681133, 498753, -3911642, 4621385, 8978629, --4996121, -340913, 1865090, -642635, 2950106, 5332202, -2368138, -5790153, -991064, 3206730, --2938831, 8217346, 9473624, 6070400, -2690260, -6095096, -814433, 9571871, 1088774, 67646, -4170413, 1636919, -49392, -1208496, 2347737, 2708514, -6229850, -276489, 35423280, 28350006, --12381854, -5713917, -14765561, 8472897, 4130685, 17324824, -3068217, -7555385, -3412352, -11288248, -2525978, 389768, 16363825, -6175089, 6097243, -22084184, 12136504, -1777043, 8541616, -157840, -7741679, 1268626, -12544526, -6527814, -10759967, -8227547, 9066676, 21792664, 9523016, -2658048, --6769406, -357019, -1829656, 5387500, 7392176, -14038101, -265214, -4938139, -4663261, -15241765, --11703786, -24659554, 468151, -1307818, 8879845, -7445326, 15781320, -12051141, -5251672, 31473520, -31267898, -21688512, 4851166, 18037788, -10489921, -5102958, 9347996, -3569655, -13178033, 35005056, --8705899, -53404160, 17772038, -778463, -27448062, 20932596, 22484690, -8059506, 15755551, 19877108, --9401147, 600222, 12713640, -13835163, 5793911, 10903848, -19608674, -2816962, -6431714, 955630, --7141457, -8590, 2812130, -8432095, 6759205, -9761387, -4375498, 4563940, 9564892, -5609764, -610959, 1772748, -1357747, 3091303, -6866042, 10070625, -5113696, 10640245, 10530186, -403190, -625455, 6933688, -5098663, 1377074, -186294, 8717173, -6555194, 5215164, 1740536, -20973400, -4126390, -2772402, -3801046, 944893, -474057, 2039573, -11627550, 1411971, -2938831, -10566693, -1903207, 17591112, -16605417, 5296769, 9898289, -14501420, 71404, 7590818, -13328357, -6648073, -2406256, 6136972, 11695196, 5639829, -9622337, -1865090, 8625368, -10114648, 9930501, -5098663, --12921946, 11421392, 5848672, 5623723, -3320547, -3353833, -4655208, -760746, 9586904, -20193862, -9848360, -561567, 16610786, -10701985, -88584, -13273060, 5592585, -21512418, 2236067, 807454, --8626979, -6585259, 3299609, -14532559, -24986510, 14916421, -1527398, 4384088, -14835354, 8869644, --2516314, 9541807, 10242423, 5009006, -10507637, 8429947, -5113159, -2415919, -19353122, 2624762, --13816910, -15138149, -22028888, -9125195, 3359738, 5927055, -22736484, -11307038, 1070521, -8231305, --30485140, -24201604, -24881820, -5272073, -14937359, 12958453, 18304076, 4915053, -18438832, -21352966, --24884504, -2462090, -1989107, 13342853, -12096775, -20769388, -10297721, -13885092, 4507032, 99321, -4715337, 2305324, -6976638, 1306744, 4858145, -5492727, -2432025, -4679367, -3031710, -3427921, --6790880, -471373, 7968238, 113817, 2183454, 2218888, -1623498, 5972152, -4197794, 9323300, -8298951, -3525095, -7859254, -544387, -3153580, -4436701, -5028333, -4430259, 6621229, 138513, -6221260, -6885907, -7525857, -1497333, 3323231, -11847667, 1777043, 1011465, -8791261, 1711008, --7281044, -15429133, 9170292, -3806415, 925565, -2695629, 1353452, -7968238, -2287607, -15480136, -26925150, 29920890, -7077569, 20207284, -5610301, -7770133, -7721815, 19681688, -16955458, -3796214, --8009577, 31157304, 1295470, 11481521, 4204773, -2769717, 15612743, 8811125, 12808129, 4146254, --1833951, -5275294, 12264816, -1860258, -11747809, 15006616, -259309, 13165685, -14384382, 10304700, -3747359, -14606647, -11259794, 27157616, 17666274, -1474248, 9822053, 8269960, -17005924, -11059541, -5822902, 4512400, 12142409, 1695438, 2779918, 4888210, 14784888, 6235219, 3903052, -14377940, -40492952, 27303644, 3257733, -17933100, 9172976, -5888937, 5171678, -3933653, 8789114, -5716602, -1509681, 22489522, -15278809, -7214472, -20585778, 6023155, -5499169, -3408057, 19094888, 6203544, -2545305, 1872606, -7683160, -15221901, 11317776, 220654, 348966, 12259984, 12050068, -709743, --8655970, -9934796, 19719806, -1798518, -1039919, -3566970, 14846091, -939524, -10210748, 7007239, -5568962, 9490804, 4291746, 3519726, 13711146, -2525441, -4905390, 5021354, -273804, 824097, -1259499, 6533719, -3464428, 246424, -4436701, 1762010, 6604049, -2762738, 1593970, 8519605, --2872260, 2058363, 6008659, 714575, -1603097, -12395276, 8269960, -6798933, 5421323, -8174397, --1853815, 3743064, -5353677, -1806034, 12085501, 9118216, 1024887, -1545115, 11283953, 2588255, -5373541, 5356361, 2510409, -1683627, 4825396, -9709847, -21046950, 54731840, -61380452, -7084549, --32293322, 39696772, 10720775, 7017440, -15394237, 3734474, -12553653, 35561256, -6224482, -2265059, -3703873, -1745367, -13836774, 5330055, 8146479, 10765872, -23923504, -12583717, -12282533, 4938139, --7186554, -6447283, -689342, -210453, 15831249, -8113193, 869194, 11906723, -1391033, -15819438, -2086280, 12528420, -1400696, -24944634, 18751290, 2247342, 446140, -34360, -10425496, 8231305, --46062988, -32235878, -4387309, -11544335, 2213519, 3531000, -21505438, 33996812, -13345000, 46833396, --6484864, -16405164, 16172162, 2674691, 14452565, 21680458, 7019587, -22289806, -6030134, 25028922, -58273044, 1918240, -14705431, 24210194, 2259153, 28554554, 4791036, 38659536, -9808632, -1570347, --863825, 9011378, 1520418, 14835891, 27373438, 1584843, -5552319, -4880694, 8861054, -7415261, --2966212, 17704392, 13180718, 1906966, -3096672, -6739341, -7290707, -4649839, -5881958, 12735115, --7679402, -5573794, 6576132, 2211371, -2184528, 5655935, 6772090, -3704946, 5851356, 9002788, --4437775, 507880, -12604118, 16165720, 199179, 12975633, 1154809, -13751948, 378494, 1296006, -3883187, 1333051, 301185, -11851962, -10545218, -796180, -5997922, 8497593, 3492345, -4161287, --68183, 6638946, 1734093, -4101157, 736587, 4750771, 413391, -2565706, 2226404, 79898200, -24674588, 8687108, -2698313, -8769249, -11677479, 25972740, 23789824, -27792196, 16206522, 12277164, -2631741, -8507256, -14882062, -37839200, -14345191, 11885785, 3690451, -12279848, 22519050, -7551626, -8973797, 8949101, -5739687, -5489505, 23502598, 464393, -9286256, 14668387, -13185013, 28981366, --14540612, -8839580, -1845762, 11203422, 5770826, 29313152, -9332964, -17795660, -6537477, 7627325, -1750736, 15627239, 4060355, 1218697, -6702834, 12558484, 55051816, 23351738, -20852604, 17580912, --11078331, -16974248, 13357348, -788663, 3683471, -1297080, 9534291, -14851460, -22606560, -59310816, --15871515, 20892332, -8126615, -20497732, 8551817, -4939750, 8512088, -23896662, -21081846, -10002442, -8576513, 9198209, 27870580, 4734128, -2326799, -22310208, -31587336, -4124779, -14396730, 2483028, -10911364, -15137075, -15667504, -3542274, -19408958, -32042604, -10938208, -8699456, -17367774, -4217658, -9068287, -9128416, -5060545, -10458782, -2759517, -22910430, -14816563, -14687714, 20401, 1835562, -7798050, -12936441, 6732898, -17355962, 311922, -10333154, -1712081, 5018133, -5690832, 7754564, --22882512, -4741644, 7227893, 2913599, 6605123, -3148748, -6569690, 10705206, -2625299, -2594160, -7231115, -11539503, -9378061, -1970853, 1651415, -15219753, -7559680, -8444443, -5019206, -1601486, --683974, 928250, -7220914, 328565, -12486007, 17802640, -14169634, 48931488, 41087804, 19277960, --11148661, -17138530, 29390462, 25200184, -32877974, -6611566, -20114406, 28394028, -4718022, -40101572, --17421998, 14403710, 25223270, -46370616, 18743238, -32076426, 12021077, -18902152, -4806606, 22450330, --7418483, 3499325, 14400488, 29885456, -19376744, -32617592, 7450695, -2482491, 3691525, 30631170, -7827041, 22881976, -28744606, -5242545, 9405978, -25680146, 42248520, -4827007, 25376814, -3437048, --5767068, 20782810, 20844014, -11816529, 46530064, -10777147, -20024748, 22459458, 40008156, 2346126, -7384660, 2017024, 17744120, -18663244, 14271103, 60564408, 27997282, -1807108, 26599806, 32632624, --23926190, -73909408, 5797132, 44705776, 50633908, 13882945, -4658966, -21719650, 26394722, 55794848, -26225070, 13667660, -54363548, 10385768, -30690762, -19180250, -47889960, 40993852, 9156333, -14025216, --18888730, 14467597, -13571023, 7872138, 5770289, 7341173, -17548700, -3716221, -1916092, 9607842, --5833640, 8135205, 7358890, -8049843, -4922570, 11266236, 833761, 12087649, -4748087, 4538170, --7508140, 4336843, 23051090, 4345970, 4648229, -2808909, -23962160, -12268037, -14624364, 8114804, -41517840, 38778724, 35459248, -2680060, -24999394, -24051280, -10991895, 16312286, 18654116, -1305670, --7952669, -12996571, -18451180, 5049271, 11157251, 8866423, 8861591, 6523519, 723165, 33820184, --67343480, 51163260, 10522670, -30957050, 303869, 28542206, -19221052, 657130, 15801722, -20168630, -1591285, -18146236, -11525545, 18826990, -16419123, -9455907, -34367256, 14650670, 33199560, 9170292, --15074261, -25624848, -4158602, 18891950, 10243497, -21931176, -665720, 25934624, -3548180, 1549410, --9005473, -6644852, 61385820, -29752850, -7606387, -7115150, 10254771, 28280212, -30421790, -17318382, -40373768, -5072893, -2663954, -48708688, -40080636, 16428787, 27136678, 14533632, -49627272, 33636572, --967978, -7942469, 7045357, -35811436, -9876277, -4978941, -17617956, 31491238, -24943022, -14232448, --26812944, -15878494, -35336308, 10219875, -55222544, -15911243, 6431177, -27924804, 6752226, 14822469, -6678138, -869194, -9921911, -20330228, 29180008, -6835978, -2840584, -11011759, 17665738, 34904124, -5305359, -48394080, 4214974, -21862458, 3188476, 3877282, -8735963, 2775623, -14331232, -5419175, --1206349, -11449309, 214748, -3711926, 8429410, 6884833, -2601677, 3152506, 15688979, -7711077, --5598490, 15366319, -11598559, 9971840, -5604933, -6072010, 1229434, -7496866, -3239479, 9053254, --18944028, 5017059, 4538707, 6326487, 13681618, -10311143, 1715303, 9422085, 3795141, -4231617, --8875013, -2560338, -2058900, -552977, -9085466, 1956358, -1478543, -38579544, 23527830, -635655, -30430918, -6174016, 31474594, 4013110, -3926137, 14116484, 36508296, 17521856, 9422085, 7355132, -4740570, 14403173, -18246094, -1414118, -13661754, -14367739, 22489522, 14011257, 8660802, -6375879, --5543729, -2585570, 23516556, 3657165, -10285910, -16872780, -687195, -3939559, 17706540, 2747705, -14821395, 27748710, -7631620, -70057360, 4686883, 57057568, 6024766, -41737420, -5338645, 16169478, -12716324, 22456774, 20423644, -1595580, -13161927, -13489955, 17879412, -10768557, 2048699, 6305549, --72768024, -12556874, -13955959, 11631308, 57273924, -979253, 4634807, -13214541, 3923990, 11871290, -24040542, 12608950, -14164802, -7396471, -35332548, -2075006, 24324010, -10655814, -5033165, 9020505, -24703042, 20081656, -5317170, -25060060, 158377, 9245991, 2802466, -16626892, 2065342, 2099702, --1265942, -14343043, -18692772, 16306917, 13326210, -598611, -2928631, -14023068, 11178189, 4706211, -2542621, 4430796, 3560528, 6564858, 412854, -15537044, 8732205, 523449, -983011, 990527, -4152160, 2079301, -2123325, 73551, 602369, -5024038, -3036005, -21505974, 3391414, 15382962, --10743861, 5567888, -17506824, 9979357, 4551592, -2474975, -4852776, -1632088, -1733556, 2207613, --3860639, 19588808, -2420214, -115112640, -216399248, -87050400, -146506704, -168368080, 104485280, 36430988, -95991448, 288896672, 189061776, 152517504, 228663520, 114071112, 7255274, 90339272, 22410066, -91710440, --64458332, -73116984, -167773776, -136342656, -58970436, -122106456, -134511936, -55723444, -82837032, -138922864, --71840304, 10570988, -87389696, -80032960, 17497696, -17469242, -79701168, 89006752, 58093192, -67019208, -66034584, 100189776, 15087146, 57204132, 201543488, 95589328, 60335164, 237037104, 166104096, 96052648, -233728368, 313306592, 193965024, 280924672, 363995808, 260001216, 172434352, 227247264, 119601416, -116052160, --76428408, -153231552, -356656224, -357711712, -362243456, -546825600, -539878976, -542499456, -565066816, -533560576, --518955008, -408637152, -327060672, -247448096, -102014600, 29774860, 79170744, 201628848, 350529984, 296884768, -398152064, 566101376, 475904384, 444356256, 541167488, 400782176, 205583984, 222685472, 209030160, 78274168, -55764244, 112037984, 41405096, -10045929, 37473052, 13161927, -78136192, -69956424, -42159936, -139772192, --160428304, -70185672, -122082832, -168148512, -69500088, -44829260, -91661048, -1542967, 29429116, -30469034, --4674535, -22543210, -128282080, -184868816, -207100096, -258740112, -304497088, -273414944, -249868848, -232778096, --174697264, -111378704, -79285632, -14591615, 61543660, 95661272, 138835888, 228612512, 278014304, 324187360, -347507424, 329170592, 293462752, 224423312, 153472064, 85607824, 11964705, -14595373, -24757802, -40394704, --45456860, -46375448, -53682260, -57008176, -51444044, -46326592, -51407000, -55174760, -52517248, -55126444, --60093572, -57780732, -54537496, -42010684, -24932286, -15557982, -3936338, 4896263, 3944391, 1649268, -438624, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +2426657, 3886946, -1370095, 3454228, -561030, 3645890, 1834488, -801548, -1427540, 3693135, +312459, 736587, -4197794, -673236, -301721, -187368, 5740224, 2804077, -208843, -4306242, +-3131031, -1852742, 526134, -98784, 1243930, 2638721, 804233, 973347, -4345433, -668941, +-4229469, 169651, -2338610, 2769717, 2766496, -1103807, -2281702, 2895345, 620623, -1087164, +-3910031, -531502, -2507724, 701690, 2392297, -3968550, -1935957, -664109, -1551557, 10126996, +2413235, 5845988, 426276, 1917166, -42950, -2927557, -2713883, -3456375, 1633161, -2851858, +2051384, 62814, 2503966, 2559264, 6219113, 1874753, -514859, -316754, -3693135, 6021008, +5542119, 966905, 1709397, 1567663, 1715303, -353798, -3091840, 918049, 1788854, -1165010, +517544, -955093, -2826089, 1341640, -2357400, -1604707, -734439, 183610, -1054951, -1148904, +-1343788, -34360, -75162, -216896, 270583, -477278, 898185, -506806, -841277, -88047, +1126892, 417686, -463856, -1523640, -448824, 1395328, 92342, 624918, 552977, 13995151, +-3311420, -2928094, -1137093, -2772402, 642098, -6654515, 518617, 1324461, 338229, 4521527, +517544, -934692, -3995930, 2557653, -5632850, -4856535, 1752884, -2369211, -1132798, -840203, +938450, 3795677, 5195300, 389768, -806380, 6175626, 2226404, -360240, 224949, -2524904, +77846, 6778532, 2684, -3151432, -2548526, -732829, 2299955, -3138011, -3867081, -3950833, +-3231963, 3092913, -3040837, 1156420, -3694746, 1299228, 4472672, 291521, 3178276, -1352378, +-2522220, -1248762, 2204929, -135291, 3412352, 4990215, 731755, -1510755, -2582349, -130997, +-382252, 227633, 158377, -4401805, -464930, -2057826, -2238752, 2131378, 452045, 1367410, +1620276, -5237713, -2918967, 2168959, -979789, 3868155, 702764, 3258807, -666794, -833224, +-900869, -1897839, -445066, -2090039, -840203, 57982, 3051574, -738198, -68719, -529892, +966905, -28454, 1176284, 233539, -257161, -772020, 947577, -1500017, 6979, 76773, +-851477, 701153, 897648, -1267015, 424128, -626528, 545461, 528281, -3758, 897648, +96100, -469225, -9992241, -4937065, -2165737, -6834904, -2381559, -6562173, 1906966, -594853, +-4095788, -4720169, -720481, -3859565, -113817, 3171297, -261993, -5861020, -2190433, 66035, +-2306934, -1913408, 1668058, 5483063, 7030862, -1156957, -1906429, 3941706, 4482335, -1424855, +-1068373, -918049, -3205119, 948651, 1445257, -2886755, -2171106, -687732, 2697240, 6002217, +370441, -2048699, -20401, -3056406, -1142998, -4847945, -2295660, -2162516, -7659001, -831613, +-3489661, -2426120, -8406325, 5183489, -3673271, -3255585, 1466731, -541166, -628139, 1078574, +-6988986, -1828582, -2521146, -571231, -4046396, -568009, -1919314, 1828046, 2393371, -2285460, +-1235340, -3347390, 1155346, -514859, -705448, -6442, -5182415, -137976, -4686346, 700080, +-341450, -1483374, 1350230, 5652177, 2675765, -1347009, 282931, -1003949, -2228551, 206158, +852551, -1119913, -183610, -1384053, 12348, -576599, -1733019, 676994, 634045, -1809792, +-867583, 479963, -780610, 236760, -1199370, -923955, -979253, -1690070, -1847910, -148176, +438624, -936840, -1125818, -8053, -545998, -237834, -620086, -17717, -363462, -619012, +-1530619, 802085, -557272, -727997, -758062, -18480170, -1451699, -9104257, 8192650, -4735739, +14740328, -9415642, 9295383, -8344048, -493921, -112206, -6430103, 5021891, 192737, -2385854, +1517734, -2085744, -834834, -6257231, -49392, -4717485, 3757560, 1327145, 4597763, -2674154, +6855305, 6179384, -5972152, 1701881, -5076652, 5432597, 59056, -3762928, 326418, -512175, +-186831, 3993246, 591632, -5883032, 2445447, 4271882, -272194, 5041218, -2325725, 4115116, +-6114423, -3091840, 4024384, -3497714, 1024350, 5427765, -4909685, 8008504, 3165391, -7860864, +1924682, -7571491, 2740189, 4261145, 2870112, 4103841, 5873368, 2005750, -714575, -447213, +395674, 1884417, 4223027, -1430224, 7973607, 1571958, 5465883, 2992519, 1592359, 419296, +5483600, 1016834, 1365800, -3109556, -4267587, 2210835, 2961380, 353261, 4714801, -525597, +-32212, -838056, 5597416, 1724966, -1993939, 1303523, 958851, 841277, 1910724, 328565, +3484829, -508417, 1203128, 695785, 1335198, -842350, 667867, 367757, 82141, 348429, +-1182190, -1028645, 443992, -1275068, -581968, -1385127, 913217, 20401, 12213276, 68719, +-3323768, -1114007, -4555350, -5438503, 8919036, -1730872, -1298691, 8186208, -634045, -1579474, +3619584, 6371047, 1816771, 3165928, -163746, -6949257, -1843078, 5228586, -7924752, -7844221, +-2944200, 1723356, -5589363, -3353296, 108448, -777926, 5486821, -2111513, -1207423, 5794985, +8048232, -6971806, 1819992, -1656784, 2933463, 810138, -3102577, -666794, 3343632, 5143224, +-1385127, -7238094, -1637993, -630286, -1919850, -3607773, 518080, -450435, 1312649, -988916, +999654, 6782290, -5017059, 658741, -3823595, -3082176, -5252745, -1570347, -3039226, -7237557, +-270046, 507343, -2832531, -544924, -2997887, 2807298, 3510599, -542777, 1036698, -2599529, +-736587, 8763344, -1170916, -3617973, -11895986, -5399848, -170725, -4049617, 2727304, -1141388, +1006633, -3221, -2404645, -440771, 3443490, -2913062, 662499, -814433, 317828, 16643, +-2507187, -1832877, -1067299, -1911261, -403727, -3031173, -654446, -1715303, 315143, -1194001, +-415001, -1630477, -1788317, -1727651, -468151, -177167, 600222, 455803, -261993, 503585, +380641, -86436, 1673964, 1480690, -47245, 881005, -725850, -914828, 184684, 15832323, +17791902, 3386582, -6470905, 4053912, 7016366, 7037841, 3972308, 5317170, 2382633, 8703751, +-878321, -1061931, -3544422, 5465883, -3197603, -7655243, -10550587, 1221381, -5056787, -4349728, +3739843, -1101659, -2801393, 8894877, -630823, 11048803, 124554, -4350802, -2975876, 3886409, +2580739, -2160369, -8731132, 12620225, 7297150, 89121, 6842957, 4097936, 4453881, -4115116, +5027796, 2580202, 1020592, -1502165, -2237678, -5536750, -7830263, 2241436, 3810710, -6087043, +2468533, 5305895, 7890392, 2113124, 7130183, 3332358, 6077379, -8876087, 2664490, 853625, +1808181, 259846, -590021, 3819300, 3457449, 3379066, 4878546, -1566053, 2381023, 1436130, +7010461, 8600672, -4306779, -5029407, 789737, -2025614, -4525822, 1951526, 4763119, -2882997, +2032593, -8517457, -6263673, 1495722, -4314832, -1996623, -1377074, -3843996, 40802, -4832, +521839, -45097, 1729798, 2065879, -105764, 1068910, 380641, 1576253, 1652489, 72478, +152471, -52076, 1804423, 950262, 1012002, 2244121, -346282, -1064615, 1684701, -420907, +28991, 2570001, 1586990, 2436320, 3294240, 563178, 1497870, 933082, 2195265, 14540075, +4598836, 6422587, -5314485, 2110977, -13156022, 712965, -9502078, 7206955, 4853850, -4001836, +6072547, 3449933, -6429029, -1593970, 9322763, -300111, 6424734, -1752347, 1302986, 7430294, +-9220758, -708670, 1530082, 2717641, 636729, 2989297, 409096, 9009231, -4154307, -2587181, +-2699387, 6811818, 888521, -3198140, 4160213, 11485816, -7994545, 1419487, 1572495, -697932, +4664335, -2323577, 8803072, 2947958, 2251100, -7196755, -681826, -1910724, 4101694, 3055869, +4429185, -4946192, -3190624, 4174171, -8579734, -4833449, 1994476, 9259413, 5658620, 8186745, +-8894877, -2840584, -9038759, -2364380, 2800856, -788127, -8523363, 1110786, -5203890, -90194, +-9329206, -11382737, -4590247, -8222178, 523986, 2881386, 1688996, -3529926, 4591320, 7264401, +2102923, 2127620, 4251481, -1341640, -6924024, -451508, -4742181, 2487860, 865973, -499290, +1369021, 623307, -5049271, -2647847, -1384053, 2535641, 444529, -1829656, -539555, -191663, +-670552, 387621, -962073, -513249, 442919, 2299955, 678605, 719407, 616328, -497679, +780073, 1519345, 898185, 1989107, 702764, 1007170, 218506, 1563905, -2406792, -17141752, +-15458661, -11124502, 3373697, 3416647, 12809203, -5685463, 12164421, -4996658, -20118164, -1811403, +-1889786, -7799124, -13024488, -4772783, -306553, -8041253, -91805, -12359305, 878858, -13028246, +7421704, -3301219, 5399848, -2580202, -256624, -4071629, -4719632, 7998303, 1547262, -2371896, +9080098, 985695, 1437203, 3092913, 8353175, 7326678, 5583995, 103616, -9954124, -1075352, +4735202, 1404454, 6049462, -2959233, 2676838, -14614700, 4573067, 8741869, -11070815, 6448357, +2234457, 10347113, 7914551, -75699, -2785286, -315680, 7015829, 3417183, -9342628, -7631620, +-12903155, -6293738, -8677981, -2028298, -10727218, -2348810, -3632469, 10806675, -5129802, 5301064, +-2875481, -1669669, -3602404, -7603703, -4079682, -2499134, -2563559, 6769942, -20649130, -4473209, +9569187, 355945, 1785096, 5066988, 9689446, -6209449, 1100585, 2499134, -520228, -186294, +-1496259, 2575370, 3965866, -1859721, 258235, -491237, 4437238, -1770600, -207232, 4440460, +855235, 1497870, 2026151, 2029909, -823023, 278099, -1292248, -1868311, -1078037, -3231426, +825171, 1942936, 1336809, 714038, -4147865, -92342, -621697, -300111, -1988570, 1020592, +1738925, -1094143, -280247, 2042794, 2205466, -22512608, 17440252, -4793184, 10349261, 6059662, +-324807, -14860587, 11872900, 1694365, -945967, 7530689, 5365488, -6087580, -17717, 12776454, +4296041, -5647345, 9089761, -4846334, -3881577, -2637647, 2972117, 141734, -1564442, 1301375, +3942243, 3532074, 3630858, -9265855, 5851893, -7685844, 10640245, -6494528, 10590316, 3457986, +1078037, -10239202, -10406169, -3402151, -3419331, 12306155, 3531000, 9855876, 4175245, -8672076, +404264, -1921461, 4265977, 306553, 3764002, -1026497, -5813775, -3378529, 6277632, 15568720, +11245835, 1319092, 3907347, -1064615, -2109366, 8012799, 6737730, -2794413, 9883793, 13909788, +19430968, 469225, -11039140, -13320841, 4728222, 2480881, -496606, 3419331, 132607, -4230006, +-432718, 11759620, -2065342, -5056250, 20908974, 5323612, -3457986, 6190122, 212064, -154619, +-586800, -3239479, -396748, 6406481, 3218541, -1964411, -2976949, 4517769, 3676492, -217970, +8542153, 2527588, 1676111, 1003949, 3881577, 1551020, 3642669, 2547989, 1330366, 809064, +4570382, 2590402, 2479807, 770410, 4539244, -454193, 1837709, 2772402, 1941325, -224412, +5064304, 5821828, 1860795, -767189, 6039261, 624918, -2615635, -299574, 4451734, 418222, +-221728, -718870, -635655, 423054, 1279900, 3015604, 10501732, -15330886, 12924630, 5326297, +-10466835, 24552180, 3701188, -12504797, 2915746, 6856916, 667331, 4961761, 17619566, -16809966, +11004243, -6777996, 9761924, -3680250, 2094333, -15560667, 2665027, -1651415, 6283537, -5935645, +884763, 1245004, 175020, -9107478, 8799314, 978716, -943282, 4197794, -1745904, 4139812, +-2173790, 12451110, 9781788, 12328167, 12204686, -1904818, 4265440, 5357972, 541703, -6335077, +8628052, -10153303, 3156801, 10227391, -6038187, 5460514, -11341935, 3710315, -996432, -2605972, +-989990, 964220, 3490735, 3470871, 11927124, -7732015, -398358, 8009577, 16996260, -14975477, +3844533, -3594351, 5148055, -2659122, 24823838, -15178951, 5428839, -8403104, -4759361, 2345052, +2565706, 1504312, -21769578, -11324218, 17916456, 9978820, -2017561, -9569187, -11285027, -4308926, +3963181, -11937325, -6650757, 6105296, 3272765, -86973, -405338, -8296803, 1517734, -2293513, +-3257196, 4045322, -2152316, -2433099, -1072668, -7221988, 2429341, -1732482, -2601677, -2502892, +3275450, -3376918, 4006668, -445066, -1162326, 1610076, 1338956, 5522254, -5598490, -954557, +-4297115, -671626, 2518998, 2237678, 6825777, -2057826, 3690451, 1095217, -2720862, 11457899, +-15131707, -3231426, 21337398, -6439230, -452582, 11418707, 2662880, 7036230, -15968152, 15269146, +971736, 1116155, -4072166, -9618579, -1344862, -1511829, -10297184, -6226629, 11368242, -3649649, +2163590, -5620502, -25071872, 8452496, 1115618, -7765838, 4760971, 9673877, -932008, 1043677, +-1981591, 2411624, 6553047, 2063732, 10543608, 7206419, 1632088, 9207336, -7464653, -7360500, +-10460393, 3912715, 6012418, 1724429, -16579648, 4663798, -14169097, 20467130, -4881767, 7253126, +17467632, -6925635, 11091216, 2740726, 12077448, 4838818, -5858336, -17986786, -12905840, -10078141, +-1403381, -10578504, -2124398, -9252433, -6001680, 18020610, 3896609, -7735773, -6852084, 3605088, +6691559, -1607392, 2603824, -32871532, 13201119, 2197413, -10547366, -12986370, -3391414, -21725018, +2327872, 10737418, 1178969, -9359807, 5745593, 4809827, -7668127, 3790309, 2269353, -1953673, +245350, -4947803, 1280974, 1660005, 1261647, -6436009, -3506304, 2581275, -4012036, 878321, +-2425046, -1590749, 1534377, 5341866, -6837051, 2335925, 5305895, -6407018, -5995775, 745177, +-5502927, 1220308, -3655554, 3750043, 2050310, -6416681, 3568581, -4230006, -2714419, 4352950, +1016297, 9852118, 3062312, -60130, -622233, 731755, -2595234, 7099581, -20359218, -24948392, +14945412, -12293807, -14292577, -4144107, 9353902, 19340238, -12859132, 955630, 9172976, -2869575, +-4102231, 4910758, 3176665, 14513768, 4813585, -14136348, -607201, -7217156, -556735, -8439074, +-11075110, 1599875, 10936060, -902480, 4838281, -9226663, 2605972, 10790568, 8365523, 1180579, +787053, 6705518, 6381785, 4015795, 9885404, -12701292, 13737990, 9838696, 3324305, -10517301, +688269, 7926899, -8315594, 9225053, -6619619, 10461467, -2899103, 13690208, -21760988, 22907208, +5310727, 21595096, 1313186, -4701379, -1604170, 7730405, 425202, -18229452, 617402, -1396938, +-18894098, 5828271, 13262859, -17954038, 14768245, -15819975, 4793721, 5945309, 3156801, -19770272, +-9591199, -9766756, 1787243, 1342177, -11589432, -16950626, 3176128, -14923938, 9982041, -7269769, +-3997004, 4963909, -9357123, -7248831, -9599789, -4024384, -5409512, 169114, -7706782, -5773510, +-7045357, -10349797, -5117991, -2261837, -2454037, -2711735, -3129421, -2110440, -5021354, -5458367, +3383897, -6509560, -3629247, -1762010, 4779762, -2531883, 3221, -8280697, -6041945, -2786360, +-315143, -1978906, -7133941, -1090922, -763430, 5539971, 3481071, -4714801, -4474282, 801548, +-2469606, 4054449, -2511482, 2115808, -4485020, -11515344, 17443472, 3520263, 11479374, 11126650, +3122978, -8591545, 1893007, 29444148, -20253992, 4872104, -3565897, -11059541, 653909, 3953518, +4748087, -140660, 67646, -5801964, -8509941, -13238700, -6695854, 10001368, -8393440, -13300977, +7644505, -4766340, 2929705, -1759326, 5939940, -5661304, 12524125, -4517769, 1352378, -281857, +1321239, 11547020, 3924526, -5356361, 6152541, -4901632, 9456444, -5686000, 3877282, -13533979, +-9898289, -7247221, 2362769, -6759742, -11812234, 4978941, 8751533, 2574296, -6284074, 4051228, +6180995, 7036230, 18924162, 26126822, 35485020, -3584150, 5655935, 8607651, 5015448, 4834523, +5703180, -7204271, 14081050, -1925756, 18382996, 22752590, 16642461, 6823630, 9368397, 3219078, +31733902, 9219684, -5810554, -4929549, -4511327, -1711008, -2042794, 1804423, -2533494, -5802501, +5307506, -9256191, 2792803, -1978906, 2946885, -4515085, -3733400, -2761127, 7196218, -6830072, +-6739878, -315143, 2967286, -3340948, -8652748, -2681133, 498753, -3911642, 4621385, 8978629, +-4996121, -340913, 1865090, -642635, 2950106, 5332202, -2368138, -5790153, -991064, 3206730, +-2938831, 8217346, 9473624, 6070400, -2690260, -6095096, -814433, 9571871, 1088774, 67646, +4170413, 1636919, -49392, -1208496, 2347737, 2708514, -6229850, -276489, 35423280, 28350006, +-12381854, -5713917, -14765561, 8472897, 4130685, 17324824, -3068217, -7555385, -3412352, -11288248, +2525978, 389768, 16363825, -6175089, 6097243, -22084184, 12136504, -1777043, 8541616, -157840, +7741679, 1268626, -12544526, -6527814, -10759967, -8227547, 9066676, 21792664, 9523016, -2658048, +-6769406, -357019, -1829656, 5387500, 7392176, -14038101, -265214, -4938139, -4663261, -15241765, +-11703786, -24659554, 468151, -1307818, 8879845, -7445326, 15781320, -12051141, -5251672, 31473520, +31267898, -21688512, 4851166, 18037788, -10489921, -5102958, 9347996, -3569655, -13178033, 35005056, +-8705899, -53404160, 17772038, -778463, -27448062, 20932596, 22484690, -8059506, 15755551, 19877108, +-9401147, 600222, 12713640, -13835163, 5793911, 10903848, -19608674, -2816962, -6431714, 955630, +-7141457, -8590, 2812130, -8432095, 6759205, -9761387, -4375498, 4563940, 9564892, -5609764, +610959, 1772748, -1357747, 3091303, -6866042, 10070625, -5113696, 10640245, 10530186, -403190, +625455, 6933688, -5098663, 1377074, -186294, 8717173, -6555194, 5215164, 1740536, -20973400, +4126390, -2772402, -3801046, 944893, -474057, 2039573, -11627550, 1411971, -2938831, -10566693, +1903207, 17591112, -16605417, 5296769, 9898289, -14501420, 71404, 7590818, -13328357, -6648073, +2406256, 6136972, 11695196, 5639829, -9622337, -1865090, 8625368, -10114648, 9930501, -5098663, +-12921946, 11421392, 5848672, 5623723, -3320547, -3353833, -4655208, -760746, 9586904, -20193862, +9848360, -561567, 16610786, -10701985, -88584, -13273060, 5592585, -21512418, 2236067, 807454, +-8626979, -6585259, 3299609, -14532559, -24986510, 14916421, -1527398, 4384088, -14835354, 8869644, +-2516314, 9541807, 10242423, 5009006, -10507637, 8429947, -5113159, -2415919, -19353122, 2624762, +-13816910, -15138149, -22028888, -9125195, 3359738, 5927055, -22736484, -11307038, 1070521, -8231305, +-30485140, -24201604, -24881820, -5272073, -14937359, 12958453, 18304076, 4915053, -18438832, -21352966, +-24884504, -2462090, -1989107, 13342853, -12096775, -20769388, -10297721, -13885092, 4507032, 99321, +4715337, 2305324, -6976638, 1306744, 4858145, -5492727, -2432025, -4679367, -3031710, -3427921, +-6790880, -471373, 7968238, 113817, 2183454, 2218888, -1623498, 5972152, -4197794, 9323300, +8298951, -3525095, -7859254, -544387, -3153580, -4436701, -5028333, -4430259, 6621229, 138513, +6221260, -6885907, -7525857, -1497333, 3323231, -11847667, 1777043, 1011465, -8791261, 1711008, +-7281044, -15429133, 9170292, -3806415, 925565, -2695629, 1353452, -7968238, -2287607, -15480136, +26925150, 29920890, -7077569, 20207284, -5610301, -7770133, -7721815, 19681688, -16955458, -3796214, +-8009577, 31157304, 1295470, 11481521, 4204773, -2769717, 15612743, 8811125, 12808129, 4146254, +-1833951, -5275294, 12264816, -1860258, -11747809, 15006616, -259309, 13165685, -14384382, 10304700, +3747359, -14606647, -11259794, 27157616, 17666274, -1474248, 9822053, 8269960, -17005924, -11059541, +5822902, 4512400, 12142409, 1695438, 2779918, 4888210, 14784888, 6235219, 3903052, -14377940, +40492952, 27303644, 3257733, -17933100, 9172976, -5888937, 5171678, -3933653, 8789114, -5716602, +1509681, 22489522, -15278809, -7214472, -20585778, 6023155, -5499169, -3408057, 19094888, 6203544, +2545305, 1872606, -7683160, -15221901, 11317776, 220654, 348966, 12259984, 12050068, -709743, +-8655970, -9934796, 19719806, -1798518, -1039919, -3566970, 14846091, -939524, -10210748, 7007239, +5568962, 9490804, 4291746, 3519726, 13711146, -2525441, -4905390, 5021354, -273804, 824097, +1259499, 6533719, -3464428, 246424, -4436701, 1762010, 6604049, -2762738, 1593970, 8519605, +-2872260, 2058363, 6008659, 714575, -1603097, -12395276, 8269960, -6798933, 5421323, -8174397, +-1853815, 3743064, -5353677, -1806034, 12085501, 9118216, 1024887, -1545115, 11283953, 2588255, +5373541, 5356361, 2510409, -1683627, 4825396, -9709847, -21046950, 54731840, -61380452, -7084549, +-32293322, 39696772, 10720775, 7017440, -15394237, 3734474, -12553653, 35561256, -6224482, -2265059, +3703873, -1745367, -13836774, 5330055, 8146479, 10765872, -23923504, -12583717, -12282533, 4938139, +-7186554, -6447283, -689342, -210453, 15831249, -8113193, 869194, 11906723, -1391033, -15819438, +2086280, 12528420, -1400696, -24944634, 18751290, 2247342, 446140, -34360, -10425496, 8231305, +-46062988, -32235878, -4387309, -11544335, 2213519, 3531000, -21505438, 33996812, -13345000, 46833396, +-6484864, -16405164, 16172162, 2674691, 14452565, 21680458, 7019587, -22289806, -6030134, 25028922, +58273044, 1918240, -14705431, 24210194, 2259153, 28554554, 4791036, 38659536, -9808632, -1570347, +-863825, 9011378, 1520418, 14835891, 27373438, 1584843, -5552319, -4880694, 8861054, -7415261, +-2966212, 17704392, 13180718, 1906966, -3096672, -6739341, -7290707, -4649839, -5881958, 12735115, +-7679402, -5573794, 6576132, 2211371, -2184528, 5655935, 6772090, -3704946, 5851356, 9002788, +-4437775, 507880, -12604118, 16165720, 199179, 12975633, 1154809, -13751948, 378494, 1296006, +3883187, 1333051, 301185, -11851962, -10545218, -796180, -5997922, 8497593, 3492345, -4161287, +-68183, 6638946, 1734093, -4101157, 736587, 4750771, 413391, -2565706, 2226404, 79898200, +24674588, 8687108, -2698313, -8769249, -11677479, 25972740, 23789824, -27792196, 16206522, 12277164, +2631741, -8507256, -14882062, -37839200, -14345191, 11885785, 3690451, -12279848, 22519050, -7551626, +8973797, 8949101, -5739687, -5489505, 23502598, 464393, -9286256, 14668387, -13185013, 28981366, +-14540612, -8839580, -1845762, 11203422, 5770826, 29313152, -9332964, -17795660, -6537477, 7627325, +1750736, 15627239, 4060355, 1218697, -6702834, 12558484, 55051816, 23351738, -20852604, 17580912, +-11078331, -16974248, 13357348, -788663, 3683471, -1297080, 9534291, -14851460, -22606560, -59310816, +-15871515, 20892332, -8126615, -20497732, 8551817, -4939750, 8512088, -23896662, -21081846, -10002442, +8576513, 9198209, 27870580, 4734128, -2326799, -22310208, -31587336, -4124779, -14396730, 2483028, +10911364, -15137075, -15667504, -3542274, -19408958, -32042604, -10938208, -8699456, -17367774, -4217658, +9068287, -9128416, -5060545, -10458782, -2759517, -22910430, -14816563, -14687714, 20401, 1835562, +7798050, -12936441, 6732898, -17355962, 311922, -10333154, -1712081, 5018133, -5690832, 7754564, +-22882512, -4741644, 7227893, 2913599, 6605123, -3148748, -6569690, 10705206, -2625299, -2594160, +7231115, -11539503, -9378061, -1970853, 1651415, -15219753, -7559680, -8444443, -5019206, -1601486, +-683974, 928250, -7220914, 328565, -12486007, 17802640, -14169634, 48931488, 41087804, 19277960, +-11148661, -17138530, 29390462, 25200184, -32877974, -6611566, -20114406, 28394028, -4718022, -40101572, +-17421998, 14403710, 25223270, -46370616, 18743238, -32076426, 12021077, -18902152, -4806606, 22450330, +-7418483, 3499325, 14400488, 29885456, -19376744, -32617592, 7450695, -2482491, 3691525, 30631170, +7827041, 22881976, -28744606, -5242545, 9405978, -25680146, 42248520, -4827007, 25376814, -3437048, +-5767068, 20782810, 20844014, -11816529, 46530064, -10777147, -20024748, 22459458, 40008156, 2346126, +7384660, 2017024, 17744120, -18663244, 14271103, 60564408, 27997282, -1807108, 26599806, 32632624, +-23926190, -73909408, 5797132, 44705776, 50633908, 13882945, -4658966, -21719650, 26394722, 55794848, +26225070, 13667660, -54363548, 10385768, -30690762, -19180250, -47889960, 40993852, 9156333, -14025216, +-18888730, 14467597, -13571023, 7872138, 5770289, 7341173, -17548700, -3716221, -1916092, 9607842, +-5833640, 8135205, 7358890, -8049843, -4922570, 11266236, 833761, 12087649, -4748087, 4538170, +-7508140, 4336843, 23051090, 4345970, 4648229, -2808909, -23962160, -12268037, -14624364, 8114804, +41517840, 38778724, 35459248, -2680060, -24999394, -24051280, -10991895, 16312286, 18654116, -1305670, +-7952669, -12996571, -18451180, 5049271, 11157251, 8866423, 8861591, 6523519, 723165, 33820184, +-67343480, 51163260, 10522670, -30957050, 303869, 28542206, -19221052, 657130, 15801722, -20168630, +1591285, -18146236, -11525545, 18826990, -16419123, -9455907, -34367256, 14650670, 33199560, 9170292, +-15074261, -25624848, -4158602, 18891950, 10243497, -21931176, -665720, 25934624, -3548180, 1549410, +-9005473, -6644852, 61385820, -29752850, -7606387, -7115150, 10254771, 28280212, -30421790, -17318382, +40373768, -5072893, -2663954, -48708688, -40080636, 16428787, 27136678, 14533632, -49627272, 33636572, +-967978, -7942469, 7045357, -35811436, -9876277, -4978941, -17617956, 31491238, -24943022, -14232448, +-26812944, -15878494, -35336308, 10219875, -55222544, -15911243, 6431177, -27924804, 6752226, 14822469, +6678138, -869194, -9921911, -20330228, 29180008, -6835978, -2840584, -11011759, 17665738, 34904124, +5305359, -48394080, 4214974, -21862458, 3188476, 3877282, -8735963, 2775623, -14331232, -5419175, +-1206349, -11449309, 214748, -3711926, 8429410, 6884833, -2601677, 3152506, 15688979, -7711077, +-5598490, 15366319, -11598559, 9971840, -5604933, -6072010, 1229434, -7496866, -3239479, 9053254, +-18944028, 5017059, 4538707, 6326487, 13681618, -10311143, 1715303, 9422085, 3795141, -4231617, +-8875013, -2560338, -2058900, -552977, -9085466, 1956358, -1478543, -38579544, 23527830, -635655, +30430918, -6174016, 31474594, 4013110, -3926137, 14116484, 36508296, 17521856, 9422085, 7355132, +4740570, 14403173, -18246094, -1414118, -13661754, -14367739, 22489522, 14011257, 8660802, -6375879, +-5543729, -2585570, 23516556, 3657165, -10285910, -16872780, -687195, -3939559, 17706540, 2747705, +14821395, 27748710, -7631620, -70057360, 4686883, 57057568, 6024766, -41737420, -5338645, 16169478, +12716324, 22456774, 20423644, -1595580, -13161927, -13489955, 17879412, -10768557, 2048699, 6305549, +-72768024, -12556874, -13955959, 11631308, 57273924, -979253, 4634807, -13214541, 3923990, 11871290, +24040542, 12608950, -14164802, -7396471, -35332548, -2075006, 24324010, -10655814, -5033165, 9020505, +24703042, 20081656, -5317170, -25060060, 158377, 9245991, 2802466, -16626892, 2065342, 2099702, +-1265942, -14343043, -18692772, 16306917, 13326210, -598611, -2928631, -14023068, 11178189, 4706211, +2542621, 4430796, 3560528, 6564858, 412854, -15537044, 8732205, 523449, -983011, 990527, +4152160, 2079301, -2123325, 73551, 602369, -5024038, -3036005, -21505974, 3391414, 15382962, +-10743861, 5567888, -17506824, 9979357, 4551592, -2474975, -4852776, -1632088, -1733556, 2207613, +-3860639, 19588808, -2420214, -115112640, -216399248, -87050400, -146506704, -168368080, 104485280, 36430988, +95991448, 288896672, 189061776, 152517504, 228663520, 114071112, 7255274, 90339272, 22410066, -91710440, +-64458332, -73116984, -167773776, -136342656, -58970436, -122106456, -134511936, -55723444, -82837032, -138922864, +-71840304, 10570988, -87389696, -80032960, 17497696, -17469242, -79701168, 89006752, 58093192, -67019208, +66034584, 100189776, 15087146, 57204132, 201543488, 95589328, 60335164, 237037104, 166104096, 96052648, +233728368, 313306592, 193965024, 280924672, 363995808, 260001216, 172434352, 227247264, 119601416, -116052160, +-76428408, -153231552, -356656224, -357711712, -362243456, -546825600, -539878976, -542499456, -565066816, -533560576, +-518955008, -408637152, -327060672, -247448096, -102014600, 29774860, 79170744, 201628848, 350529984, 296884768, +398152064, 566101376, 475904384, 444356256, 541167488, 400782176, 205583984, 222685472, 209030160, 78274168, +55764244, 112037984, 41405096, -10045929, 37473052, 13161927, -78136192, -69956424, -42159936, -139772192, +-160428304, -70185672, -122082832, -168148512, -69500088, -44829260, -91661048, -1542967, 29429116, -30469034, +-4674535, -22543210, -128282080, -184868816, -207100096, -258740112, -304497088, -273414944, -249868848, -232778096, +-174697264, -111378704, -79285632, -14591615, 61543660, 95661272, 138835888, 228612512, 278014304, 324187360, +347507424, 329170592, 293462752, 224423312, 153472064, 85607824, 11964705, -14595373, -24757802, -40394704, +-45456860, -46375448, -53682260, -57008176, -51444044, -46326592, -51407000, -55174760, -52517248, -55126444, +-60093572, -57780732, -54537496, -42010684, -24932286, -15557982, -3936338, 4896263, 3944391, 1649268, +438624, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -6948184, --644245, 6500970, -5812165, 2239826, -9788767, 96100, -3546569, 3928821, -3310883, 889595, --2247879, -4098473, -1058173, -396748, 2964064, 3712999, -3535295, -6157373, 3216394, 1093606, -2246268, 1352378, 2540473, -3570192, -2683818, 632434, -687732, 3200825, 2302103, -2732136, --595390, 2437931, 4525822, 2784750, 25770, -3565897, 1903744, -618475, -1904818, 2495376, -1072668, -3275986, -2745558, -2226941, 1816771, -3209951, -1732482, 2681670, 1025960, -105764, --3362960, 1224603, -2893197, -7439957, 721555, -2539400, -4807142, 2193118, -1377611, -1379758, --1657321, 93416, 3640522, 2192044, 1218160, 1656784, 2744484, -5606006, 2901251, -2236067, --2164127, -1247151, 1842541, 346819, 3912178, 5706938, 2216203, 433255, 632971, -94489, -3638911, -1553704, -149250, 1778653, 111669, -1522566, -1567126, 510564, -59056, -1717450, --874026, 528281, -105764, -234613, -697932, -853625, 550830, 359167, 598611, -258772, -197569, -181462, -1602023, -618475, 704375, 1260573, -730681, -846109, 268972, 14862197, --1241246, 2734284, 3280281, -1508607, 1551557, 5928129, -4601521, -803696, 1702955, -2282238, --440234, 4358318, -1392643, -967441, -290447, 1697049, -819802, 2105608, -1457605, -1431298, --654446, -3358128, -5747203, -1071594, -1836635, -759136, 3401614, -6085432, 7507066, 59056, -140660, 271657, 1425392, -166967, -2872260, 468151, 2320356, 5672041, 291521, -26844, --852551, -1893007, 3769908, 1801202, -1365263, 2090575, -3738232, 654983, 1203665, -2819109, --9732396, -3033321, -236223, -556735, -456877, -840740, -1233729, -689342, -1845225, 2404108, -7183870, 4084514, 320512, 4832, -186294, 2527052, -1462436, -6526203, -221191, -3389803, -2150168, -3848291, 2192044, -9425843, -54761, -1325534, 3211562, 5167383, -784905, -1205275, -776315, -1074, 2770254, 1036161, 466004, 3768834, -2759517, -342524, 477815, 1363115, -8053, 1389959, 77309, 898185, 400506, -157840, 280247, -312459, -40265, 811749, -1190780, 168041, -326954, -439160, 156229, -179852, 673773, 510027, 327491, -194884, -122943, 482647, -13077102, -12610024, -4745939, -1867774, -1799591, 10737, 3189013, 761283, -2590402, -5921686, 2928631, 3689914, 3565897, 4181688, -3235184, 899259, 9839770, -6085969, --214748, -4335233, -6287832, -752156, -446677, 5451924, -2644089, 573915, -4696547, 3011309, -1880659, 2364380, -10528575, 1624035, -1925756, -3692598, -994285, -50466, -7811472, -5057324, --4362076, -350577, 6526740, 2264522, 2161979, 3136937, -2920041, 1846836, -2619930, 5581310, -8585640, -803159, -789737, 2442763, 600759, 2222109, 4824322, -2261837, 4991289, -779537, --153545, 2955474, 4042638, -1527935, -5840082, -5370320, 2075006, -732292, -1003412, -2365453, -2651069, -4471061, 1662152, 3356517, 5665599, -3291556, 5432597, 3551401, 1766842, 2718714, -655519, -916439, -3659849, 2607582, -1722282, -3413425, -4317516, 1794760, -1423245, 2607582, -457414, -1658394, -2015413, -1023813, 858457, -1060857, -380105, -1364726, -605590, -77309, -1327682, 703301, -42950, 776315, 2617246, -246961, 6979, 1534914, -826781, 436476, --576599, -441308, 752693, 1107028, 1107028, 715649, -16643, -337155, 816581, 395674, -1791538, 2153389, -1709397, -169651, 942208, -14339285, 6152541, -6439230, 11455215, -10736881, -8369818, 4249870, -4482335, -5592585, -3130494, 2157147, 1938641, -3035468, 6739878, -2472291, --6514392, -1354525, 6972343, 4772246, -7127498, 1102196, -926102, -7458211, -3114388, -4807679, --1154809, -5716602, -1549410, -2401424, -7872675, -2821794, 3939559, 5679558, -1139777, -6741488, --1396401, 4734128, -1500554, 141197, 286689, 83215, -6714645, -221191, -836982, -1716376, --351114, 1156957, -4818954, 2710124, -5157182, -133144, -71941, 85899, 3761855, 58519, --1802813, 1528472, 2597382, 6258841, 2830384, 1408212, -1854889, -3913252, -3705483, -1546188, --4043712, -2898029, 2326799, 4091493, -3059627, -5083094, -3499325, 1588601, 852014, -4768488, --1663226, 574452, -4024921, -1853278, 520228, 1206886, 1590212, -1860795, -2238215, -3049427, -83752, -387084, -1194001, 921271, -1028645, -359704, -2340757, -533113, -805843, 2013803, -973884, -843961, 968515, -139586, 288300, -1007170, 89657, -605054, -73551, -840740, --1564979, 1091995, -130460, -1487132, -943819, -158914, -1367410, -1579474, 17548162, 7016366, --1110249, 4022237, -2747705, 9860171, 4207994, 17714056, 399969, -17027934, 4449049, 10417443, --6091874, 1870995, 7204271, -5428839, 5102958, -4392141, -890669, -5428839, -5145908, -1600412, -1527935, -516470, 2444910, -2299418, 7652021, -4478577, 2222109, 1445257, 5009543, -8981313, --4621922, -3513820, -981400, -3151432, 939524, 5555540, 4022774, 8795556, -1189706, -607738, --4894652, -1598265, 5617817, -5349919, 4657892, -5003100, -2022393, 8072391, 11699491, 8353175, -1559610, -6083821, 4394826, 3226057, -3155727, 6789807, -4351876, 1366873, 1173063, -12306692, --537, -11664594, -4599373, 1896765, -2984466, -5552856, -4657355, 1005559, 8149164, 2033130, --3168075, -4052839, -3474092, 834834, 1421634, 3869229, -5966784, -5458367, 497142, -1034550, -488553, -1554241, -779000, -958315, -398895, 1842541, 600222, 855772, -661425, -1249299, --1103807, 375810, 3339874, 1084479, 2466385, 755914, -3536369, 2784213, 1387274, 517544, -683974, 1612760, -221191, 1390496, 419833, -25233, -995359, -839129, -1430761, 472983, -1684164, -290984, -594853, -858457, -5054640, -585189, -475131, 177167, -654446, 10864120, -21988622, -9557376, -7099581, -1914482, -2571612, 7671886, -7306276, -13318694, -4612795, 943282, --3257196, 3838627, 1817308, 6652905, 2791192, -2650532, 9562745, 8967355, -4123169, 659814, --6158983, -1038845, 344671, -3788161, -731755, 6693170, 9598715, 391916, 1583769, 3954054, -2528662, 1549946, 660888, -3624416, -6888054, 800475, -9910100, 363998, 2281702, -3153580, -3898757, -2505577, -5477157, -421981, 5340792, 2367064, -2387465, 16197932, -43487, 5228586, --9635759, -2144263, 6617471, -3093987, -7133404, 4203163, -8360154, -7496866, 1713155, 9189619, --7512972, -4224637, -2216740, 384400, -3399467, -3389266, 12398497, 7250979, -1117228, 692027, --5828808, -4178466, -2367064, 3726958, 4905927, 430570, 3934727, 2541010, -790274, 3648575, --3346853, 12374875, 7019051, 1364726, 403727, 1141388, -2084133, -799401, -2074469, -2196876, --57982, -79994, -1996086, 1068910, -3015604, -910533, 2366527, -846109, 2425583, 1379758, -2295660, 96637, 1588064, 1803349, 1645509, 310848, 2724620, 893890, 390305, -1962263, -210453, -726923, -13959, 135291, 991601, -130997, 905701, -1870995, -62814, 8677981, --15627775, -2124398, -11744051, -6699075, -10641318, -2727304, -1655710, -1619740, -4106526, 4720169, --14983530, 7669201, -5126581, 4552129, 1975148, 6221260, 325881, 2568927, -6054294, -2578054, -2770254, -6025302, -4383014, 7333657, 2004676, 3311957, 2931315, -769873, 1955284, 10926934, --3944928, 1037772, -4955319, 8785356, -5335960, -19565186, 6032819, 3062849, 8209293, 4435628, -11320997, -7671349, -3054259, 6833830, -2863133, -6560563, -3112241, 3551401, -9517648, 9378598, --345745, 6248104, -8036958, -3529926, -2927020, -8705362, -1784022, -6922951, -3164317, 727460, -10002442, 8055211, -921271, -12288438, -7010997, -2268817, 9716290, 8038032, 5850819, 5413270, --3455301, -14222784, -3645354, -424128, 3321620, -4497368, -1404991, 7264937, -1396938, 8588324, -102005, 5947456, 2273648, 278099, -2200634, -237297, 3236258, 856309, -1513976, 286689, --3931506, -683437, -230318, -5264020, -3150896, -3368328, -1642825, 1028108, -2116882, 841277, --2835752, -378494, -832150, -1546725, 2299418, 1104344, -488553, -3586835, -1389422, 1417876, -2342905, 30602, -3481071, -1852742, 788127, 1784022, 494995, 857383, 264141, -20565378, --24823300, -14068702, 10043781, 720481, -4713727, -5334350, -7999377, -930397, 2579128, -13886166, --1418413, 8620536, -5423470, -3878356, 9633075, 2470680, -6514929, 2364916, -6307697, 14350023, --4760435, -3519726, 4574140, -7595113, -4803921, -4489315, 2348273, -5298916, -2048163, 2334852, -1649804, -17035988, 7486665, 7306276, -4976794, 13047574, 4953171, 1174137, 12497818, 7109245, -2157147, 1687922, 13521094, -1430761, -2411087, -989990, 8274792, 4608500, -12422119, 4711043, -3777424, -160524, -6656126, -19972672, 8698919, -1377074, -4985384, -12548821, -7126962, 7604240, --1707786, -3699578, -8391292, -16251619, 1562831, -2302639, -8667244, -3677566, -15378667, -2504503, --3512747, -2950643, -726386, 5435818, 11682848, 4985920, -4000762, -8455717, 3191698, 540092, -4835060, 3037616, -1964411, 3537979, 1240172, -431644, -4623533, 376883, -7482907, -483721, --1697586, 1192927, -2932926, 3467112, 1999844, -853625, -675384, -739808, 438624, -1712618, --498216, 1986959, -863825, -764504, 3767223, -1533840, -1048509, 3055869, -2433099, 1839857, --6271189, -4052302, -2346663, -3313567, -398895, -3290482, -4433480, -3269544, -988379, -685047, -1410360, -162135, -2734821, 1545651, 515933, -21169356, 17037598, 959925, 8710194, -1549946, --704375, 1607928, 9409200, 938450, -1164473, -12781823, 4558571, -1394254, -9876277, 2595234, --6450504, -4952634, 18349710, 5227512, 5655398, -3944391, 6577743, 7946227, 7674570, -4432943, -6702297, 3491809, -7713225, 5050345, -7501161, -2574833, 4807679, 2294586, -766652, -4145180, --3905199, 12221866, -3537979, -5332202, -3417720, 2518462, 2663417, -5801427, -9827422, -688269, --10545755, -1216550, -9507447, -3561065, -2248416, 1905892, -4839892, -8206072, 10422275, -4265977, --11455215, 7372848, 12247636, -5882495, -3911105, 6238440, 4506495, 12178917, 7856569, 1279363, --106300, -12416750, 3022583, 12007118, 9622337, -8430484, 9174587, 9981504, -6626061, -18458158, --5964099, -16524350, 2799782, 9584756, 4809827, 1220308, -4970351, -6639483, -738734, 949188, -2889439, -1438814, 5436355, -2354716, -1904281, 2210298, 5755256, -8375186, -1117765, -984084, --2573759, 150861, 2317135, -380641, -261456, -1238024, -163209, -1248762, 476205, -4295, --179852, 913754, 3004867, -2494839, -1496259, 1832340, 1931125, 6437619, -613643, 2764885, -2495913, -2593087, 2256469, 1146756, -2371896, 754304, 934692, 884763, 2568927, 5657546, -1178432, -1702955, 3695283, -998580, -2058900, 472446, 4145717, -33678988, 16247324, 4655745, --1513439, 22843320, -1270237, 11601244, -10102300, -2305324, 1870995, 223875, 13089450, 8356396, --17599702, 11116986, 907849, 6707665, -15845745, -541166, 9273371, -15546171, 19626926, 5379447, --136365, -6903623, 1241782, 8551280, -13947906, 1374926, 3653944, 2561948, -8572755, -3119220, -8251706, 4711043, -807991, 1299765, -5615133, -9642738, 4094715, -16358994, -611496, 23638426, -23065584, -7278359, 2920578, -929324, 6651294, 16631187, 1461900, 7996156, 2697240, -8616778, --586263, -1584306, -24911884, -11206643, 15527381, 787053, 4833449, -5961415, -1466731, 5569499, -7551090, -610959, 19308026, 347355, 15074261, 1938104, 3229816, 2028835, -9760850, -12275553, -15264851, 3588982, -7864622, 11098732, -8974871, 885837, 9397925, 1579474, -2327872, 4413079, --3947612, -3784940, 4735739, 6472516, 519691, -8532489, -4075387, -9197672, -3246459, 2353105, -3044595, 1555852, -3522947, -1620276, -6601902, 4871030, -18254, -2631741, -1157494, 2082522, -1182190, 6025839, 5406827, 3518652, 3538516, 1235877, 4308926, -2791192, 2019172, 2333778, -2240362, -2431488, 4354023, 2315524, -569083, -721018, -1046361, -1009317, -1886564, 11305428, --24597814, 9882720, 15497853, -2145873, 4609574, 6972343, -3761855, -2383707, 9564355, -3605088, -14513768, -13816910, 7550553, 17939542, -19226958, 775242, -9143985, 11330124, 4784057, 9396315, --9728638, -7604777, -110059, 24242942, 281320, 12263205, -5440113, 737661, -1666447, -2160369, --10761041, -422517, -3017215, 4932770, -4802311, -6989523, -5861557, -453119, -2039573, 10945724, -1888712, -6066642, -5488432, -5586679, -2035815, -2667712, 17888002, 767189, 8987756, 602369, --4287988, -3927211, 14879914, 11082089, -4274030, -14025753, 7921531, 5427765, -30878130, 1777580, -17438640, 16980154, 3974992, 13498008, -18624052, 30516816, 2691334, 5824513, 6054830, 14545980, --1128503, -13079249, -3955128, -15450608, 17573396, -7785702, -5186173, 15297063, -441845, -6052146, --4645544, -11549167, 10937134, -18835580, -2740726, 1782411, -438624, 2648384, -3879429, -8104067, --5116917, 2478196, 2093797, -3848828, 1006096, -3673808, -3898757, -2933463, 3485903, 1770063, --4427575, 4114579, 875636, -5465346, 2493766, -1035624, -1872069, -4183298, -4660040, 844498, -2324114, 9687836, -4224637, 5715528, 752156, -1997697, -653372, -1206886, -2517925, 1427540, --224412, -2965675, -917512, -2077690, 839666, 1903744, 1651952, 9299678, -18372260, -14714558, -12912819, 10846940, 26673358, -9584756, -7218230, -4900558, 4923107, -11501922, -1500554, 4323959, --929860, 14277545, 9148817, -11664594, 912144, 3245385, 8192113, -13267154, 13664975, -363998, -5979668, -2462090, -6428493, -13911936, 4731444, -2521146, -5948530, 2638184, -8592619, -8357470, --1982127, 4186519, 16581795, -25024090, -15196668, -13560822, -15220827, -4415764, 17198660, -10392210, --615254, 16929688, -2647847, -7839389, -14941654, -4136591, -6519761, -30751428, -23902030, -6848862, -5223217, -3068754, 5207111, -6944962, -5046050, 14390288, 8632347, -15452219, -8051453, -17277580, --6957310, 1256815, 6707129, -3218004, 1687385, -14765024, -11842299, -10823854, -448287, 2345589, -774168, -13982803, 304943, 18455474, 7881265, 21088826, -16877074, 25807384, 2151779, -16289737, --2829847, 593242, 4409858, -2860985, 6924024, -10021232, 4540318, -8893267, 3979824, 5820755, --2027225, 13140452, -1255204, 2985002, -3728569, -4953708, -2851858, 234076, 2862596, -5231270, --1046361, 1557999, -1271847, 4959614, -1669669, -2703145, -8723615, 3650185, 411243, 4349192, -1772748, -3022046, -8215736, 2464238, -10464151, 2482491, -2820183, -565325, 965831, -2357937, -681826, 1491427, 7042136, 2674691, -3236258, -13123273, 2500208, -1446330, 30200062, 3290482, -14537391, -12603582, -8574365, -3100967, -14245333, -9039296, -13761075, -6394670, -8924942, 16392280, -4101694, 4137664, 16875464, -448287, -983548, 7635378, 15181636, 23771570, 17358648, -3564286, --6470905, -27361626, 7523172, 8587787, 3319473, -17056926, 19712290, 7881265, 11572253, -3223910, -1075352, 11228118, 24625732, 24019068, 13817984, 2921652, 25603374, 683437, -7675107, 8339753, -15514496, 12647605, 23023172, 12202539, 486942, 2800319, -13940390, 6059125, -34798360, -5932424, --3525631, 7738458, 27293980, 15407121, 3994320, 19887846, -14459007, -13041668, 2770254, -33712272, --8107288, 1428614, 6429029, 7854959, 8879308, -1990181, 14763413, 1893544, 7609072, 27391154, --16894254, -8713952, -4711043, 5255966, -3268470, -25770340, -4941360, 17648020, -1345399, 22371410, --12053826, 660351, 9164923, -2116882, 2516314, -9272298, -4643397, -7188702, -4908611, -7981123, --6674379, 1791538, 1287417, -16058883, -7577933, -9029095, -2523830, 3010235, 4761508, -7139847, --408559, 2193655, -11445551, 1725503, -4678293, -7385197, -4015258, 614717, 2639258, -5056787, --1424319, -7755637, -759136, -2057826, -2682207, -5651103, -8499203, 2138357, 2604361, -4522601, --3338800, -3314641, -2710661, 1535451, 5328444, 1575716, 1557463, -23238994, -7289097, 4283156, -17659294, 32396938, -12953621, 619549, 5397164, -5883569, 30032022, 5364414, -14718853, 26317948, --5366025, -8767102, 18854906, -17015586, -9927280, 1195075, 1700270, 2389076, 12368969, 6635188, -10048076, -3013457, 5355288, 15105937, 972810, 10313827, 1938104, 440234, 16695075, -21690122, --7845295, -7327751, 14539001, -11036992, -2826625, -6485401, 14399415, -6046777, 31968516, 23381802, --21692806, 10695542, -26075820, 3791383, 9492415, 5125507, 5699422, -33259152, -6410776, -32075890, -4311074, 2689723, 3966402, -5032628, -5771899, 15401216, -27685896, 9578314, -11959873, -52206940, --19513648, -17061220, 8648454, -7572564, 7998840, 26186952, 27928024, 15829639, 14718316, 13652627, -4010963, -20738250, 21864068, 73014, -24079734, -19166292, -30275224, -40135932, -20666308, -4031901, -32182190, 11616813, 2008434, 12344273, -9763534, -195958, 6233072, 5168457, -2534568, 4741644, -1574106, 3298535, 1399623, -9901510, 8067023, 5352603, 3990025, 1625645, -5137855, 2849174, --7665443, -2727304, -11936788, 10015864, 7596187, -1621350, 1144609, 8018167, 12745315, -5682242, --12325482, -3728569, 10137733, -2211908, -7335268, 10799158, -875636, -6232535, 7490960, 3008088, -542777, -1825361, -219043, -5290326, 3689377, -3366718, -1469953, 7741142, -41836204, -19655918, --14792404, 7250442, -32010392, 10918344, -19299436, 26495654, -31834834, -40261560, -9039296, -6145025, -30853972, 14867566, 13516799, -8420820, 3237332, -19720342, -15940234, 3218004, 6149857, -25302726, --23574002, -16639240, -2474438, 12169253, 8639327, -17881560, -22470196, -13185013, -13431436, -30304216, --17678086, 12855374, -8733279, -576599, -4520453, 9334038, 15031849, -4440996, -45212584, 18534932, -37090800, 13601625, -1213328, -45346800, -11116986, 19246286, -5980205, 49890340, -5746666, -40895068, -6313065, -7204271, 2983929, 741419, -8474507, 10505490, 13106093, -43126304, -11777874, 1971927, -14785425, -8321499, -22135188, 19027242, 1593970, -14877767, -42953432, -49795852, -25783762, -3537979, -3307662, 39205536, 55581708, 28431072, 21608518, 9204115, -32749662, 11463805, -455803, -17330730, --5174899, -53803592, -11542188, -721555, 127775, 1516660, 23035520, 8380555, 6684043, -9960029, --3336116, 19879794, -14062797, -599148, -1101122, 3552475, -10499048, -17229262, -19109920, 7994545, --9046275, -3445638, 10796474, 29528, 1547262, -14750528, 4631049, 4279398, 2261837, -12207371, --6225018, -8167954, -12665322, 1302986, -7445326, 13020730, 5023501, -9511205, 1517734, -3757560, -9023726, -12947179, -1879048, -925565, 6349573, 5539434, 2813204, 6769942, -328028, 3410741, -75163000, 69035160, -29177324, 35800700, 31707060, -8952322, -5412733, -16511465, -8961449, -19402514, --13669807, 57280904, -3167002, 33367064, 351114, 1615445, 386010, -22619982, 5331128, 4681515, --49766860, 7403987, 11965779, -26147224, -5542119, -8055211, -3645890, 7366943, -1567663, 1531156, -21801254, 8895951, -10748156, 6770479, 34797824, 604517, 15978352, -830002, 13015898, -19206020, --23344220, -12969727, -42769284, 11451993, 4660577, -18917720, -51952460, -33818036, -48581984, 35347580, --25287694, 5558762, 8613020, 8072391, 6602439, 37725384, -36378908, 270583, -20452634, 39936752, --89593552, 18418430, 6769942, 28681792, 25893820, 202937, -8404177, -13616120, -4108136, -25918518, -18930068, 52771188, -4170413, 10958072, 33103998, -23144506, 13049721, 16298864, -29430726, -20204600, --54435488, 45037564, -8904004, -39502960, 26390964, -6564321, 17175574, -1124745, 14860050, 2647311, --11817603, 18701898, 17651778, 2979634, 10029286, 17017734, 9875740, -11304891, -5087926, -11039140, --5119601, 14355928, 27113054, -1122060, -5267778, -1049046, 17319456, -27598922, 15633681, -7442105, -36727876, 7387344, -22255984, -4416837, 16149077, -8536248, -11816529, -8579197, -6948184, -8434779, -8714489, 6449431, 23337242, -19713364, 915902, -2223719, 12603045, 894427, -2003065, 7729868, -8986682, 7242389, 15014669, 1968169, 17348446, -26094610, -24743306, 30555472, -62287228, 42921220, --25697864, -17964774, -11305965, 3894999, -18046916, -14053133, 19509352, -6011344, -42606612, 14678051, --2625299, 7521562, -9605694, 37848864, -30909806, 1298691, 15705085, -10742250, 11894375, -25228102, -2067490, -21709986, -10996190, 23579908, 3024731, 9441412, -13405667, 22795002, -6566468, -10656351, -8753680, -13978508, -11617350, -7474317, -7672422, -23559506, -31524524, -8788040, 17530982, 270583, --9849434, -31499290, 1244467, -24896852, -1624035, 10022843, -24592446, -6063957, 18174690, 18409304, -13411572, -30567820, -14425185, 21076478, 6910066, -584116, 17125108, -100325064, -23159000, -11178726, --45525580, 4497905, 12582644, -2661806, 8472897, 21527450, -12338367, -21310554, 5502390, -19343996, --5797132, 20905754, 33195802, -12540231, -39917964, -24106040, 2665564, -21307870, 3412889, -16521665, --15550466, 4203163, -31958852, 420907, -19912006, -6100464, -10870562, 4535486, 8189966, -3127810, --19753092, 4447976, -1217086, -12465606, 15629386, -587874, -14513768, -4965519, -3717831, -5443334, --10015864, 5581310, -9130564, 7678328, 10644540, -4036196, 1355599, -6056441, -13706851, -19479288, -3670587, 2742337, 9266392, -22547504, 4959077, 68183, -14442901, 11462194, -5840619, 8270497, -18691698, -41000832, 8584566, 6024766, 12226161, -6600291, -3896072, 13875966, 766652, 67275296, --8640400, -18760418, 2459406, -7614977, 33282776, 6170258, -2930778, 31585726, 32061930, 10441602, -12344810, 17514340, -39743480, -22058952, 32789390, -4634807, -32640140, -16617228, -14864345, 22276922, -11922829, -12101607, -47090560, 14453639, 7283728, 6070937, 7627862, -5840082, 4683662, -35426500, -31435940, 21705690, 11545409, -17847736, -15078556, -259846, 15705085, -3649112, 16338056, 6948720, --37245420, -16746614, 5812165, -37642168, 2160906, 6933151, -32981590, -46619724, -6544994, 13770202, --27012660, -56569016, -24710020, -14989436, 36535676, -22457848, 41239204, -8752606, 1923072, 17386028, -2405182, -63376536, -4211216, 2384781, 29492466, -56438016, -77640664, 5370320, -5052492, -49746996, -27951110, 12900471, -1833414, -419833, 45722612, -65658240, 53707492, 11090679, 7221988, 21508122, --23500988, -21588654, -4036733, 9890236, -13336410, -1236414, 27620934, -23608362, -18651432, 24120536, --13711146, -7120519, 10305774, 6466610, -27231704, 13669270, -9048959, -2734821, 9780714, 9245991, --28990492, -4984310, -22505628, 12421582, 17768816, 921807, -37306624, 26282516, -6328635, -842887, -16202764, -4274566, -13470091, -2710124, 21374978, -32182190, 22014392, 946503, -2212982, 7776575, -4421669, -20224464, 9434433, -335544, 1140851, -26286810, 18130130, -17295296, 19997904, 2712809, --23610508, 1722819, 3238942, -7082401, 3506841, 31629750, 12401181, 74435544, -31120796, -32464048, --13430363, -1174137, 70697312, -9660455, 58564564, -40860172, -16019691, 24883966, -44531296, -14565308, --41896868, 7094212, 42760156, -58508192, -21420076, -4843113, 17880486, -292595, 6609955, 16465831, --4062502, -37001144, -34286188, 1946157, 24354612, 65446712, -14405320, 17915382, -18688476, 32428076, -1169305, 4000225, -8944269, -38263328, 1350767, 35741644, -6022081, -1837172, -13169443, -33340758, -44314936, 17088064, 29595010, 39773008, -1857573, 2575907, 24628954, -62885300, 21913460, -31619550, -74839272, -6791417, 7455527, 11490111, -21706228, -21744346, 7616051, -31516470, 47535088, -27454504, --34840236, -35081828, 49705120, 17098802, 28851442, -6109054, 28825136, 29395294, -29586956, -8291971, --27430346, -14247480, 51806432, 36885716, 4977330, 10307385, -78096464, 53918484, 70570608, 8378408, --5511517, -13095355, -41826004, 61079804, -3358665, 4392141, -11774116, 2042257, -26327612, 57191784, --13387413, 28021440, 4637491, -9592809, -3098282, 55106040, -30071750, 27302034, 9242770, -22974854, -3463891, -7186017, 15370077, 4656282, 22461068, -8945343, 2597918, 4491462, 25770, 22306450, -37961068, -11301133, -1617055, 4625143, 21005612, 6239514, -28642064, -19106162, 41111428, 8276402, -20342576, -39675296, -47714404, 44741748, 29852170, 14198625, -3032247, -36896992, -405874, 6597070, --55509768, 37976636, -39477192, 4795331, -18190798, 14657113, -1532230, 20884816, -3359738, -18065170, -31116502, -10926397, -4352413, 4786741, -13061532, -11351062, 35924180, -8476118, -4932233, -4206384, --1842541, 16482474, -12566001, 3882114, -9193914, 8227547, -8026220, -6121402, -19265076, 28180354, --17401596, 9343701, 4526896, 19522774, -21929566, 4905390, -8963060, 22144852, 2917357, 1755568, -17536888, 5215701, -29038274, -4303557, -4967667, 8062191, 12733504, 10621991, -26394722, 11297375, --19934554, 14095546, -11355894, 2984466, -6507949, 13913547, -5432060, 4018479, -29524142, 6962679, -14374182, -13562433, 13455059, 1812476, 4965519, 8345122, -11884175, 20394116, 8091182, -1176821, --6394133, 9893994, -6187438, 18494130, -15473157, -4659503, -14723685, 19149112, -18942954, 17389786, --15782394, 21153788, -17979806, 11075647, -17724256, 15549929, -1169305, 1582159, -5089536, 804233, --3038689, -2778844, -5405753, 9224516, 3693135, -1313723, 3105798, -2863670, -4926865, 9262634, -1505386, 3491272, -5937793, 335544, 9372692, -10754061, -2532957, 6189585, 223338, -3238942, --6816113, 16808354, -5243082, -8535711, 4475893, 1476395, -2584497, 1753957, -877247, 1597191, --2777233, 2373506, -4874251, 8220568, -6754910, 9485972, 4262755, -23131084, 46692200, 3883187, -5858873, -18696530, -13776108, -29676614, 19868518, -8341364, -6074158, -12911209, -525597, -11514270, --1451162, -1542967, 5192079, 5803575, -937377, -1407139, -8455717, 7830263, 7321846, -7023346, -3271155, -15906948, 6301791, 3054259, -2806761, -2499671, -5325760, 5021354, 1086090, -11340861, --3064996, -3352222, -9410810, 15353971, 1586990, -9869298, 1476932, -3892314, 13383655, -4691715, --6298033, 2561411, -8027831, 15613280, 424665, -8695161, 2452426, -3568044, 7629473, -9912785, --1983201, 3215320, -3613141, 6835978, -3940633, 1950452, 3095598, -8946954, 1222455, 8809515, --13553306, -929860, 4082903, -12599287, 22855132, -20971788, 10425496, 3743064, -11977590, 23611046, --16114180, 3755412, 2998961, -10045392, 7777649, -4129611, -7737384, 7502771, -9214315, 5939940, --4243428, -3158949, 6781217, -5698885, 2169495, -2335925, -84289, 1284732, -3107946, 1410897, --185220, -3060701, 6413460, -5513128, 4777078, 136902, -4509179, 4355634, -7944079, -806380, -2078227, -1347546, -1104880, 1078574, -4134443, 5012764, -2573759, -1838246, 528281, 484258, --3226594, -527207, -1867237, 1706713, 2529199, -3670050, 3161096, -3505230, -679679, 3310346, --2508798, 10911364, -50020264, -115479856, 30309048, 106904424, 90385440, 121281824, -59779504, -77469400, --116504208, -119077968, 8200167, 88793080, 98035848, 107392440, 35723928, -23358716, -85183160, -141038144, --77262704, 35891968, 55603720, 94081792, 71322224, 19494320, -12621835, -29701310, -70636104, -45766636, --43544524, -7971460, 37249716, 57088168, 30065844, 38117296, 19295678, -21452288, -3325379, -45891724, --63880124, -10918881, -14878840, 11286637, 60317984, 34758632, 29956324, 8858370, -22555020, -23236310, --20008642, -33078228, -8640937, 1484448, 14226005, 17333952, 28867012, 8239895, -985695, -14541149, --26819386, -2278480, 9695352, 9941239, 16939352, -4293357, -13453448, -6451041, -13471702, -10572599, -2904472, 7627862, 21689048, 18389976, 17576616, 1039382, -9394704, -35173096, -32698660, -13311714, -2121177, 27216670, 29190746, 12058658, 12390981, -1358283, -23500450, -14370961, -1676648, -5487358, -1284732, 2503966, 5677410, 4752918, -3021510, -7650948, 4561256, 7118372, 5833640, 6075231, --534187, -4393215, -2738579, -11911018, -4902169, -6559489, -11219528, 6678674, 16325171, 19062676, -6314139, 6896644, -3696356, -4418985, -17041894, -25295746, -9762998, 2932926, 7919920, 9874667, -20774220, 19352586, 9365176, -7623030, -16259136, -18296024, -17172352, -12654047, -869731, 15446313, -23834384, 18951006, 5470715, -8948027, -10819023, -10735271, -6268505, -4066797, -4714801, 4726612, -10892574, 8103530, 1710471, -1356673, -878858, -2743410, -3231963, -4454418, -2032593, 2703145, -2148021, 1435056, 1441498, 1399086, 956704, -1888175, -1979443, -308701, 120796, -30065, --62814, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-644245, 6500970, -5812165, 2239826, -9788767, 96100, -3546569, 3928821, -3310883, 889595, +-2247879, -4098473, -1058173, -396748, 2964064, 3712999, -3535295, -6157373, 3216394, 1093606, +2246268, 1352378, 2540473, -3570192, -2683818, 632434, -687732, 3200825, 2302103, -2732136, +-595390, 2437931, 4525822, 2784750, 25770, -3565897, 1903744, -618475, -1904818, 2495376, +1072668, -3275986, -2745558, -2226941, 1816771, -3209951, -1732482, 2681670, 1025960, -105764, +-3362960, 1224603, -2893197, -7439957, 721555, -2539400, -4807142, 2193118, -1377611, -1379758, +-1657321, 93416, 3640522, 2192044, 1218160, 1656784, 2744484, -5606006, 2901251, -2236067, +-2164127, -1247151, 1842541, 346819, 3912178, 5706938, 2216203, 433255, 632971, -94489, +3638911, -1553704, -149250, 1778653, 111669, -1522566, -1567126, 510564, -59056, -1717450, +-874026, 528281, -105764, -234613, -697932, -853625, 550830, 359167, 598611, -258772, +197569, -181462, -1602023, -618475, 704375, 1260573, -730681, -846109, 268972, 14862197, +-1241246, 2734284, 3280281, -1508607, 1551557, 5928129, -4601521, -803696, 1702955, -2282238, +-440234, 4358318, -1392643, -967441, -290447, 1697049, -819802, 2105608, -1457605, -1431298, +-654446, -3358128, -5747203, -1071594, -1836635, -759136, 3401614, -6085432, 7507066, 59056, +140660, 271657, 1425392, -166967, -2872260, 468151, 2320356, 5672041, 291521, -26844, +-852551, -1893007, 3769908, 1801202, -1365263, 2090575, -3738232, 654983, 1203665, -2819109, +-9732396, -3033321, -236223, -556735, -456877, -840740, -1233729, -689342, -1845225, 2404108, +7183870, 4084514, 320512, 4832, -186294, 2527052, -1462436, -6526203, -221191, -3389803, +2150168, -3848291, 2192044, -9425843, -54761, -1325534, 3211562, 5167383, -784905, -1205275, +776315, -1074, 2770254, 1036161, 466004, 3768834, -2759517, -342524, 477815, 1363115, +8053, 1389959, 77309, 898185, 400506, -157840, 280247, -312459, -40265, 811749, +1190780, 168041, -326954, -439160, 156229, -179852, 673773, 510027, 327491, -194884, +122943, 482647, -13077102, -12610024, -4745939, -1867774, -1799591, 10737, 3189013, 761283, +2590402, -5921686, 2928631, 3689914, 3565897, 4181688, -3235184, 899259, 9839770, -6085969, +-214748, -4335233, -6287832, -752156, -446677, 5451924, -2644089, 573915, -4696547, 3011309, +1880659, 2364380, -10528575, 1624035, -1925756, -3692598, -994285, -50466, -7811472, -5057324, +-4362076, -350577, 6526740, 2264522, 2161979, 3136937, -2920041, 1846836, -2619930, 5581310, +8585640, -803159, -789737, 2442763, 600759, 2222109, 4824322, -2261837, 4991289, -779537, +-153545, 2955474, 4042638, -1527935, -5840082, -5370320, 2075006, -732292, -1003412, -2365453, +2651069, -4471061, 1662152, 3356517, 5665599, -3291556, 5432597, 3551401, 1766842, 2718714, +655519, -916439, -3659849, 2607582, -1722282, -3413425, -4317516, 1794760, -1423245, 2607582, +457414, -1658394, -2015413, -1023813, 858457, -1060857, -380105, -1364726, -605590, -77309, +1327682, 703301, -42950, 776315, 2617246, -246961, 6979, 1534914, -826781, 436476, +-576599, -441308, 752693, 1107028, 1107028, 715649, -16643, -337155, 816581, 395674, +1791538, 2153389, -1709397, -169651, 942208, -14339285, 6152541, -6439230, 11455215, -10736881, +8369818, 4249870, -4482335, -5592585, -3130494, 2157147, 1938641, -3035468, 6739878, -2472291, +-6514392, -1354525, 6972343, 4772246, -7127498, 1102196, -926102, -7458211, -3114388, -4807679, +-1154809, -5716602, -1549410, -2401424, -7872675, -2821794, 3939559, 5679558, -1139777, -6741488, +-1396401, 4734128, -1500554, 141197, 286689, 83215, -6714645, -221191, -836982, -1716376, +-351114, 1156957, -4818954, 2710124, -5157182, -133144, -71941, 85899, 3761855, 58519, +-1802813, 1528472, 2597382, 6258841, 2830384, 1408212, -1854889, -3913252, -3705483, -1546188, +-4043712, -2898029, 2326799, 4091493, -3059627, -5083094, -3499325, 1588601, 852014, -4768488, +-1663226, 574452, -4024921, -1853278, 520228, 1206886, 1590212, -1860795, -2238215, -3049427, +83752, -387084, -1194001, 921271, -1028645, -359704, -2340757, -533113, -805843, 2013803, +973884, -843961, 968515, -139586, 288300, -1007170, 89657, -605054, -73551, -840740, +-1564979, 1091995, -130460, -1487132, -943819, -158914, -1367410, -1579474, 17548162, 7016366, +-1110249, 4022237, -2747705, 9860171, 4207994, 17714056, 399969, -17027934, 4449049, 10417443, +-6091874, 1870995, 7204271, -5428839, 5102958, -4392141, -890669, -5428839, -5145908, -1600412, +1527935, -516470, 2444910, -2299418, 7652021, -4478577, 2222109, 1445257, 5009543, -8981313, +-4621922, -3513820, -981400, -3151432, 939524, 5555540, 4022774, 8795556, -1189706, -607738, +-4894652, -1598265, 5617817, -5349919, 4657892, -5003100, -2022393, 8072391, 11699491, 8353175, +1559610, -6083821, 4394826, 3226057, -3155727, 6789807, -4351876, 1366873, 1173063, -12306692, +-537, -11664594, -4599373, 1896765, -2984466, -5552856, -4657355, 1005559, 8149164, 2033130, +-3168075, -4052839, -3474092, 834834, 1421634, 3869229, -5966784, -5458367, 497142, -1034550, +488553, -1554241, -779000, -958315, -398895, 1842541, 600222, 855772, -661425, -1249299, +-1103807, 375810, 3339874, 1084479, 2466385, 755914, -3536369, 2784213, 1387274, 517544, +683974, 1612760, -221191, 1390496, 419833, -25233, -995359, -839129, -1430761, 472983, +1684164, -290984, -594853, -858457, -5054640, -585189, -475131, 177167, -654446, 10864120, +21988622, -9557376, -7099581, -1914482, -2571612, 7671886, -7306276, -13318694, -4612795, 943282, +-3257196, 3838627, 1817308, 6652905, 2791192, -2650532, 9562745, 8967355, -4123169, 659814, +-6158983, -1038845, 344671, -3788161, -731755, 6693170, 9598715, 391916, 1583769, 3954054, +2528662, 1549946, 660888, -3624416, -6888054, 800475, -9910100, 363998, 2281702, -3153580, +3898757, -2505577, -5477157, -421981, 5340792, 2367064, -2387465, 16197932, -43487, 5228586, +-9635759, -2144263, 6617471, -3093987, -7133404, 4203163, -8360154, -7496866, 1713155, 9189619, +-7512972, -4224637, -2216740, 384400, -3399467, -3389266, 12398497, 7250979, -1117228, 692027, +-5828808, -4178466, -2367064, 3726958, 4905927, 430570, 3934727, 2541010, -790274, 3648575, +-3346853, 12374875, 7019051, 1364726, 403727, 1141388, -2084133, -799401, -2074469, -2196876, +-57982, -79994, -1996086, 1068910, -3015604, -910533, 2366527, -846109, 2425583, 1379758, +2295660, 96637, 1588064, 1803349, 1645509, 310848, 2724620, 893890, 390305, -1962263, +210453, -726923, -13959, 135291, 991601, -130997, 905701, -1870995, -62814, 8677981, +-15627775, -2124398, -11744051, -6699075, -10641318, -2727304, -1655710, -1619740, -4106526, 4720169, +-14983530, 7669201, -5126581, 4552129, 1975148, 6221260, 325881, 2568927, -6054294, -2578054, +2770254, -6025302, -4383014, 7333657, 2004676, 3311957, 2931315, -769873, 1955284, 10926934, +-3944928, 1037772, -4955319, 8785356, -5335960, -19565186, 6032819, 3062849, 8209293, 4435628, +11320997, -7671349, -3054259, 6833830, -2863133, -6560563, -3112241, 3551401, -9517648, 9378598, +-345745, 6248104, -8036958, -3529926, -2927020, -8705362, -1784022, -6922951, -3164317, 727460, +10002442, 8055211, -921271, -12288438, -7010997, -2268817, 9716290, 8038032, 5850819, 5413270, +-3455301, -14222784, -3645354, -424128, 3321620, -4497368, -1404991, 7264937, -1396938, 8588324, +102005, 5947456, 2273648, 278099, -2200634, -237297, 3236258, 856309, -1513976, 286689, +-3931506, -683437, -230318, -5264020, -3150896, -3368328, -1642825, 1028108, -2116882, 841277, +-2835752, -378494, -832150, -1546725, 2299418, 1104344, -488553, -3586835, -1389422, 1417876, +2342905, 30602, -3481071, -1852742, 788127, 1784022, 494995, 857383, 264141, -20565378, +-24823300, -14068702, 10043781, 720481, -4713727, -5334350, -7999377, -930397, 2579128, -13886166, +-1418413, 8620536, -5423470, -3878356, 9633075, 2470680, -6514929, 2364916, -6307697, 14350023, +-4760435, -3519726, 4574140, -7595113, -4803921, -4489315, 2348273, -5298916, -2048163, 2334852, +1649804, -17035988, 7486665, 7306276, -4976794, 13047574, 4953171, 1174137, 12497818, 7109245, +2157147, 1687922, 13521094, -1430761, -2411087, -989990, 8274792, 4608500, -12422119, 4711043, +3777424, -160524, -6656126, -19972672, 8698919, -1377074, -4985384, -12548821, -7126962, 7604240, +-1707786, -3699578, -8391292, -16251619, 1562831, -2302639, -8667244, -3677566, -15378667, -2504503, +-3512747, -2950643, -726386, 5435818, 11682848, 4985920, -4000762, -8455717, 3191698, 540092, +4835060, 3037616, -1964411, 3537979, 1240172, -431644, -4623533, 376883, -7482907, -483721, +-1697586, 1192927, -2932926, 3467112, 1999844, -853625, -675384, -739808, 438624, -1712618, +-498216, 1986959, -863825, -764504, 3767223, -1533840, -1048509, 3055869, -2433099, 1839857, +-6271189, -4052302, -2346663, -3313567, -398895, -3290482, -4433480, -3269544, -988379, -685047, +1410360, -162135, -2734821, 1545651, 515933, -21169356, 17037598, 959925, 8710194, -1549946, +-704375, 1607928, 9409200, 938450, -1164473, -12781823, 4558571, -1394254, -9876277, 2595234, +-6450504, -4952634, 18349710, 5227512, 5655398, -3944391, 6577743, 7946227, 7674570, -4432943, +6702297, 3491809, -7713225, 5050345, -7501161, -2574833, 4807679, 2294586, -766652, -4145180, +-3905199, 12221866, -3537979, -5332202, -3417720, 2518462, 2663417, -5801427, -9827422, -688269, +-10545755, -1216550, -9507447, -3561065, -2248416, 1905892, -4839892, -8206072, 10422275, -4265977, +-11455215, 7372848, 12247636, -5882495, -3911105, 6238440, 4506495, 12178917, 7856569, 1279363, +-106300, -12416750, 3022583, 12007118, 9622337, -8430484, 9174587, 9981504, -6626061, -18458158, +-5964099, -16524350, 2799782, 9584756, 4809827, 1220308, -4970351, -6639483, -738734, 949188, +2889439, -1438814, 5436355, -2354716, -1904281, 2210298, 5755256, -8375186, -1117765, -984084, +-2573759, 150861, 2317135, -380641, -261456, -1238024, -163209, -1248762, 476205, -4295, +-179852, 913754, 3004867, -2494839, -1496259, 1832340, 1931125, 6437619, -613643, 2764885, +2495913, -2593087, 2256469, 1146756, -2371896, 754304, 934692, 884763, 2568927, 5657546, +1178432, -1702955, 3695283, -998580, -2058900, 472446, 4145717, -33678988, 16247324, 4655745, +-1513439, 22843320, -1270237, 11601244, -10102300, -2305324, 1870995, 223875, 13089450, 8356396, +-17599702, 11116986, 907849, 6707665, -15845745, -541166, 9273371, -15546171, 19626926, 5379447, +-136365, -6903623, 1241782, 8551280, -13947906, 1374926, 3653944, 2561948, -8572755, -3119220, +8251706, 4711043, -807991, 1299765, -5615133, -9642738, 4094715, -16358994, -611496, 23638426, +23065584, -7278359, 2920578, -929324, 6651294, 16631187, 1461900, 7996156, 2697240, -8616778, +-586263, -1584306, -24911884, -11206643, 15527381, 787053, 4833449, -5961415, -1466731, 5569499, +7551090, -610959, 19308026, 347355, 15074261, 1938104, 3229816, 2028835, -9760850, -12275553, +15264851, 3588982, -7864622, 11098732, -8974871, 885837, 9397925, 1579474, -2327872, 4413079, +-3947612, -3784940, 4735739, 6472516, 519691, -8532489, -4075387, -9197672, -3246459, 2353105, +3044595, 1555852, -3522947, -1620276, -6601902, 4871030, -18254, -2631741, -1157494, 2082522, +1182190, 6025839, 5406827, 3518652, 3538516, 1235877, 4308926, -2791192, 2019172, 2333778, +2240362, -2431488, 4354023, 2315524, -569083, -721018, -1046361, -1009317, -1886564, 11305428, +-24597814, 9882720, 15497853, -2145873, 4609574, 6972343, -3761855, -2383707, 9564355, -3605088, +14513768, -13816910, 7550553, 17939542, -19226958, 775242, -9143985, 11330124, 4784057, 9396315, +-9728638, -7604777, -110059, 24242942, 281320, 12263205, -5440113, 737661, -1666447, -2160369, +-10761041, -422517, -3017215, 4932770, -4802311, -6989523, -5861557, -453119, -2039573, 10945724, +1888712, -6066642, -5488432, -5586679, -2035815, -2667712, 17888002, 767189, 8987756, 602369, +-4287988, -3927211, 14879914, 11082089, -4274030, -14025753, 7921531, 5427765, -30878130, 1777580, +17438640, 16980154, 3974992, 13498008, -18624052, 30516816, 2691334, 5824513, 6054830, 14545980, +-1128503, -13079249, -3955128, -15450608, 17573396, -7785702, -5186173, 15297063, -441845, -6052146, +-4645544, -11549167, 10937134, -18835580, -2740726, 1782411, -438624, 2648384, -3879429, -8104067, +-5116917, 2478196, 2093797, -3848828, 1006096, -3673808, -3898757, -2933463, 3485903, 1770063, +-4427575, 4114579, 875636, -5465346, 2493766, -1035624, -1872069, -4183298, -4660040, 844498, +2324114, 9687836, -4224637, 5715528, 752156, -1997697, -653372, -1206886, -2517925, 1427540, +-224412, -2965675, -917512, -2077690, 839666, 1903744, 1651952, 9299678, -18372260, -14714558, +12912819, 10846940, 26673358, -9584756, -7218230, -4900558, 4923107, -11501922, -1500554, 4323959, +-929860, 14277545, 9148817, -11664594, 912144, 3245385, 8192113, -13267154, 13664975, -363998, +5979668, -2462090, -6428493, -13911936, 4731444, -2521146, -5948530, 2638184, -8592619, -8357470, +-1982127, 4186519, 16581795, -25024090, -15196668, -13560822, -15220827, -4415764, 17198660, -10392210, +-615254, 16929688, -2647847, -7839389, -14941654, -4136591, -6519761, -30751428, -23902030, -6848862, +5223217, -3068754, 5207111, -6944962, -5046050, 14390288, 8632347, -15452219, -8051453, -17277580, +-6957310, 1256815, 6707129, -3218004, 1687385, -14765024, -11842299, -10823854, -448287, 2345589, +774168, -13982803, 304943, 18455474, 7881265, 21088826, -16877074, 25807384, 2151779, -16289737, +-2829847, 593242, 4409858, -2860985, 6924024, -10021232, 4540318, -8893267, 3979824, 5820755, +-2027225, 13140452, -1255204, 2985002, -3728569, -4953708, -2851858, 234076, 2862596, -5231270, +-1046361, 1557999, -1271847, 4959614, -1669669, -2703145, -8723615, 3650185, 411243, 4349192, +1772748, -3022046, -8215736, 2464238, -10464151, 2482491, -2820183, -565325, 965831, -2357937, +681826, 1491427, 7042136, 2674691, -3236258, -13123273, 2500208, -1446330, 30200062, 3290482, +14537391, -12603582, -8574365, -3100967, -14245333, -9039296, -13761075, -6394670, -8924942, 16392280, +4101694, 4137664, 16875464, -448287, -983548, 7635378, 15181636, 23771570, 17358648, -3564286, +-6470905, -27361626, 7523172, 8587787, 3319473, -17056926, 19712290, 7881265, 11572253, -3223910, +1075352, 11228118, 24625732, 24019068, 13817984, 2921652, 25603374, 683437, -7675107, 8339753, +15514496, 12647605, 23023172, 12202539, 486942, 2800319, -13940390, 6059125, -34798360, -5932424, +-3525631, 7738458, 27293980, 15407121, 3994320, 19887846, -14459007, -13041668, 2770254, -33712272, +-8107288, 1428614, 6429029, 7854959, 8879308, -1990181, 14763413, 1893544, 7609072, 27391154, +-16894254, -8713952, -4711043, 5255966, -3268470, -25770340, -4941360, 17648020, -1345399, 22371410, +-12053826, 660351, 9164923, -2116882, 2516314, -9272298, -4643397, -7188702, -4908611, -7981123, +-6674379, 1791538, 1287417, -16058883, -7577933, -9029095, -2523830, 3010235, 4761508, -7139847, +-408559, 2193655, -11445551, 1725503, -4678293, -7385197, -4015258, 614717, 2639258, -5056787, +-1424319, -7755637, -759136, -2057826, -2682207, -5651103, -8499203, 2138357, 2604361, -4522601, +-3338800, -3314641, -2710661, 1535451, 5328444, 1575716, 1557463, -23238994, -7289097, 4283156, +17659294, 32396938, -12953621, 619549, 5397164, -5883569, 30032022, 5364414, -14718853, 26317948, +-5366025, -8767102, 18854906, -17015586, -9927280, 1195075, 1700270, 2389076, 12368969, 6635188, +10048076, -3013457, 5355288, 15105937, 972810, 10313827, 1938104, 440234, 16695075, -21690122, +-7845295, -7327751, 14539001, -11036992, -2826625, -6485401, 14399415, -6046777, 31968516, 23381802, +-21692806, 10695542, -26075820, 3791383, 9492415, 5125507, 5699422, -33259152, -6410776, -32075890, +4311074, 2689723, 3966402, -5032628, -5771899, 15401216, -27685896, 9578314, -11959873, -52206940, +-19513648, -17061220, 8648454, -7572564, 7998840, 26186952, 27928024, 15829639, 14718316, 13652627, +4010963, -20738250, 21864068, 73014, -24079734, -19166292, -30275224, -40135932, -20666308, -4031901, +32182190, 11616813, 2008434, 12344273, -9763534, -195958, 6233072, 5168457, -2534568, 4741644, +1574106, 3298535, 1399623, -9901510, 8067023, 5352603, 3990025, 1625645, -5137855, 2849174, +-7665443, -2727304, -11936788, 10015864, 7596187, -1621350, 1144609, 8018167, 12745315, -5682242, +-12325482, -3728569, 10137733, -2211908, -7335268, 10799158, -875636, -6232535, 7490960, 3008088, +542777, -1825361, -219043, -5290326, 3689377, -3366718, -1469953, 7741142, -41836204, -19655918, +-14792404, 7250442, -32010392, 10918344, -19299436, 26495654, -31834834, -40261560, -9039296, -6145025, +30853972, 14867566, 13516799, -8420820, 3237332, -19720342, -15940234, 3218004, 6149857, -25302726, +-23574002, -16639240, -2474438, 12169253, 8639327, -17881560, -22470196, -13185013, -13431436, -30304216, +-17678086, 12855374, -8733279, -576599, -4520453, 9334038, 15031849, -4440996, -45212584, 18534932, +37090800, 13601625, -1213328, -45346800, -11116986, 19246286, -5980205, 49890340, -5746666, -40895068, +6313065, -7204271, 2983929, 741419, -8474507, 10505490, 13106093, -43126304, -11777874, 1971927, +14785425, -8321499, -22135188, 19027242, 1593970, -14877767, -42953432, -49795852, -25783762, -3537979, +3307662, 39205536, 55581708, 28431072, 21608518, 9204115, -32749662, 11463805, -455803, -17330730, +-5174899, -53803592, -11542188, -721555, 127775, 1516660, 23035520, 8380555, 6684043, -9960029, +-3336116, 19879794, -14062797, -599148, -1101122, 3552475, -10499048, -17229262, -19109920, 7994545, +-9046275, -3445638, 10796474, 29528, 1547262, -14750528, 4631049, 4279398, 2261837, -12207371, +-6225018, -8167954, -12665322, 1302986, -7445326, 13020730, 5023501, -9511205, 1517734, -3757560, +9023726, -12947179, -1879048, -925565, 6349573, 5539434, 2813204, 6769942, -328028, 3410741, +75163000, 69035160, -29177324, 35800700, 31707060, -8952322, -5412733, -16511465, -8961449, -19402514, +-13669807, 57280904, -3167002, 33367064, 351114, 1615445, 386010, -22619982, 5331128, 4681515, +-49766860, 7403987, 11965779, -26147224, -5542119, -8055211, -3645890, 7366943, -1567663, 1531156, +21801254, 8895951, -10748156, 6770479, 34797824, 604517, 15978352, -830002, 13015898, -19206020, +-23344220, -12969727, -42769284, 11451993, 4660577, -18917720, -51952460, -33818036, -48581984, 35347580, +-25287694, 5558762, 8613020, 8072391, 6602439, 37725384, -36378908, 270583, -20452634, 39936752, +-89593552, 18418430, 6769942, 28681792, 25893820, 202937, -8404177, -13616120, -4108136, -25918518, +18930068, 52771188, -4170413, 10958072, 33103998, -23144506, 13049721, 16298864, -29430726, -20204600, +-54435488, 45037564, -8904004, -39502960, 26390964, -6564321, 17175574, -1124745, 14860050, 2647311, +-11817603, 18701898, 17651778, 2979634, 10029286, 17017734, 9875740, -11304891, -5087926, -11039140, +-5119601, 14355928, 27113054, -1122060, -5267778, -1049046, 17319456, -27598922, 15633681, -7442105, +36727876, 7387344, -22255984, -4416837, 16149077, -8536248, -11816529, -8579197, -6948184, -8434779, +8714489, 6449431, 23337242, -19713364, 915902, -2223719, 12603045, 894427, -2003065, 7729868, +8986682, 7242389, 15014669, 1968169, 17348446, -26094610, -24743306, 30555472, -62287228, 42921220, +-25697864, -17964774, -11305965, 3894999, -18046916, -14053133, 19509352, -6011344, -42606612, 14678051, +-2625299, 7521562, -9605694, 37848864, -30909806, 1298691, 15705085, -10742250, 11894375, -25228102, +2067490, -21709986, -10996190, 23579908, 3024731, 9441412, -13405667, 22795002, -6566468, -10656351, +8753680, -13978508, -11617350, -7474317, -7672422, -23559506, -31524524, -8788040, 17530982, 270583, +-9849434, -31499290, 1244467, -24896852, -1624035, 10022843, -24592446, -6063957, 18174690, 18409304, +13411572, -30567820, -14425185, 21076478, 6910066, -584116, 17125108, -100325064, -23159000, -11178726, +-45525580, 4497905, 12582644, -2661806, 8472897, 21527450, -12338367, -21310554, 5502390, -19343996, +-5797132, 20905754, 33195802, -12540231, -39917964, -24106040, 2665564, -21307870, 3412889, -16521665, +-15550466, 4203163, -31958852, 420907, -19912006, -6100464, -10870562, 4535486, 8189966, -3127810, +-19753092, 4447976, -1217086, -12465606, 15629386, -587874, -14513768, -4965519, -3717831, -5443334, +-10015864, 5581310, -9130564, 7678328, 10644540, -4036196, 1355599, -6056441, -13706851, -19479288, +3670587, 2742337, 9266392, -22547504, 4959077, 68183, -14442901, 11462194, -5840619, 8270497, +18691698, -41000832, 8584566, 6024766, 12226161, -6600291, -3896072, 13875966, 766652, 67275296, +-8640400, -18760418, 2459406, -7614977, 33282776, 6170258, -2930778, 31585726, 32061930, 10441602, +12344810, 17514340, -39743480, -22058952, 32789390, -4634807, -32640140, -16617228, -14864345, 22276922, +11922829, -12101607, -47090560, 14453639, 7283728, 6070937, 7627862, -5840082, 4683662, -35426500, +31435940, 21705690, 11545409, -17847736, -15078556, -259846, 15705085, -3649112, 16338056, 6948720, +-37245420, -16746614, 5812165, -37642168, 2160906, 6933151, -32981590, -46619724, -6544994, 13770202, +-27012660, -56569016, -24710020, -14989436, 36535676, -22457848, 41239204, -8752606, 1923072, 17386028, +2405182, -63376536, -4211216, 2384781, 29492466, -56438016, -77640664, 5370320, -5052492, -49746996, +27951110, 12900471, -1833414, -419833, 45722612, -65658240, 53707492, 11090679, 7221988, 21508122, +-23500988, -21588654, -4036733, 9890236, -13336410, -1236414, 27620934, -23608362, -18651432, 24120536, +-13711146, -7120519, 10305774, 6466610, -27231704, 13669270, -9048959, -2734821, 9780714, 9245991, +-28990492, -4984310, -22505628, 12421582, 17768816, 921807, -37306624, 26282516, -6328635, -842887, +16202764, -4274566, -13470091, -2710124, 21374978, -32182190, 22014392, 946503, -2212982, 7776575, +4421669, -20224464, 9434433, -335544, 1140851, -26286810, 18130130, -17295296, 19997904, 2712809, +-23610508, 1722819, 3238942, -7082401, 3506841, 31629750, 12401181, 74435544, -31120796, -32464048, +-13430363, -1174137, 70697312, -9660455, 58564564, -40860172, -16019691, 24883966, -44531296, -14565308, +-41896868, 7094212, 42760156, -58508192, -21420076, -4843113, 17880486, -292595, 6609955, 16465831, +-4062502, -37001144, -34286188, 1946157, 24354612, 65446712, -14405320, 17915382, -18688476, 32428076, +1169305, 4000225, -8944269, -38263328, 1350767, 35741644, -6022081, -1837172, -13169443, -33340758, +44314936, 17088064, 29595010, 39773008, -1857573, 2575907, 24628954, -62885300, 21913460, -31619550, +74839272, -6791417, 7455527, 11490111, -21706228, -21744346, 7616051, -31516470, 47535088, -27454504, +-34840236, -35081828, 49705120, 17098802, 28851442, -6109054, 28825136, 29395294, -29586956, -8291971, +-27430346, -14247480, 51806432, 36885716, 4977330, 10307385, -78096464, 53918484, 70570608, 8378408, +-5511517, -13095355, -41826004, 61079804, -3358665, 4392141, -11774116, 2042257, -26327612, 57191784, +-13387413, 28021440, 4637491, -9592809, -3098282, 55106040, -30071750, 27302034, 9242770, -22974854, +3463891, -7186017, 15370077, 4656282, 22461068, -8945343, 2597918, 4491462, 25770, 22306450, +37961068, -11301133, -1617055, 4625143, 21005612, 6239514, -28642064, -19106162, 41111428, 8276402, +20342576, -39675296, -47714404, 44741748, 29852170, 14198625, -3032247, -36896992, -405874, 6597070, +-55509768, 37976636, -39477192, 4795331, -18190798, 14657113, -1532230, 20884816, -3359738, -18065170, +31116502, -10926397, -4352413, 4786741, -13061532, -11351062, 35924180, -8476118, -4932233, -4206384, +-1842541, 16482474, -12566001, 3882114, -9193914, 8227547, -8026220, -6121402, -19265076, 28180354, +-17401596, 9343701, 4526896, 19522774, -21929566, 4905390, -8963060, 22144852, 2917357, 1755568, +17536888, 5215701, -29038274, -4303557, -4967667, 8062191, 12733504, 10621991, -26394722, 11297375, +-19934554, 14095546, -11355894, 2984466, -6507949, 13913547, -5432060, 4018479, -29524142, 6962679, +14374182, -13562433, 13455059, 1812476, 4965519, 8345122, -11884175, 20394116, 8091182, -1176821, +-6394133, 9893994, -6187438, 18494130, -15473157, -4659503, -14723685, 19149112, -18942954, 17389786, +-15782394, 21153788, -17979806, 11075647, -17724256, 15549929, -1169305, 1582159, -5089536, 804233, +-3038689, -2778844, -5405753, 9224516, 3693135, -1313723, 3105798, -2863670, -4926865, 9262634, +1505386, 3491272, -5937793, 335544, 9372692, -10754061, -2532957, 6189585, 223338, -3238942, +-6816113, 16808354, -5243082, -8535711, 4475893, 1476395, -2584497, 1753957, -877247, 1597191, +-2777233, 2373506, -4874251, 8220568, -6754910, 9485972, 4262755, -23131084, 46692200, 3883187, +5858873, -18696530, -13776108, -29676614, 19868518, -8341364, -6074158, -12911209, -525597, -11514270, +-1451162, -1542967, 5192079, 5803575, -937377, -1407139, -8455717, 7830263, 7321846, -7023346, +3271155, -15906948, 6301791, 3054259, -2806761, -2499671, -5325760, 5021354, 1086090, -11340861, +-3064996, -3352222, -9410810, 15353971, 1586990, -9869298, 1476932, -3892314, 13383655, -4691715, +-6298033, 2561411, -8027831, 15613280, 424665, -8695161, 2452426, -3568044, 7629473, -9912785, +-1983201, 3215320, -3613141, 6835978, -3940633, 1950452, 3095598, -8946954, 1222455, 8809515, +-13553306, -929860, 4082903, -12599287, 22855132, -20971788, 10425496, 3743064, -11977590, 23611046, +-16114180, 3755412, 2998961, -10045392, 7777649, -4129611, -7737384, 7502771, -9214315, 5939940, +-4243428, -3158949, 6781217, -5698885, 2169495, -2335925, -84289, 1284732, -3107946, 1410897, +-185220, -3060701, 6413460, -5513128, 4777078, 136902, -4509179, 4355634, -7944079, -806380, +2078227, -1347546, -1104880, 1078574, -4134443, 5012764, -2573759, -1838246, 528281, 484258, +-3226594, -527207, -1867237, 1706713, 2529199, -3670050, 3161096, -3505230, -679679, 3310346, +-2508798, 10911364, -50020264, -115479856, 30309048, 106904424, 90385440, 121281824, -59779504, -77469400, +-116504208, -119077968, 8200167, 88793080, 98035848, 107392440, 35723928, -23358716, -85183160, -141038144, +-77262704, 35891968, 55603720, 94081792, 71322224, 19494320, -12621835, -29701310, -70636104, -45766636, +-43544524, -7971460, 37249716, 57088168, 30065844, 38117296, 19295678, -21452288, -3325379, -45891724, +-63880124, -10918881, -14878840, 11286637, 60317984, 34758632, 29956324, 8858370, -22555020, -23236310, +-20008642, -33078228, -8640937, 1484448, 14226005, 17333952, 28867012, 8239895, -985695, -14541149, +-26819386, -2278480, 9695352, 9941239, 16939352, -4293357, -13453448, -6451041, -13471702, -10572599, +2904472, 7627862, 21689048, 18389976, 17576616, 1039382, -9394704, -35173096, -32698660, -13311714, +2121177, 27216670, 29190746, 12058658, 12390981, -1358283, -23500450, -14370961, -1676648, -5487358, +1284732, 2503966, 5677410, 4752918, -3021510, -7650948, 4561256, 7118372, 5833640, 6075231, +-534187, -4393215, -2738579, -11911018, -4902169, -6559489, -11219528, 6678674, 16325171, 19062676, +6314139, 6896644, -3696356, -4418985, -17041894, -25295746, -9762998, 2932926, 7919920, 9874667, +20774220, 19352586, 9365176, -7623030, -16259136, -18296024, -17172352, -12654047, -869731, 15446313, +23834384, 18951006, 5470715, -8948027, -10819023, -10735271, -6268505, -4066797, -4714801, 4726612, +10892574, 8103530, 1710471, -1356673, -878858, -2743410, -3231963, -4454418, -2032593, 2703145, +2148021, 1435056, 1441498, 1399086, 956704, -1888175, -1979443, -308701, 120796, -30065, +-62814, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -5540508, --4885526, 6077916, -1243393, 4852776, 1415729, 7217693, -1682554, -3734474, -2572686, 4409321, -122407, -1605781, -427886, 4985920, -1328219, 904091, 1749125, -3351685, -2550674, -1093606, -919123, -3478924, 883153, 703838, -4029753, -1313186, -2411624, 336618, -1762547, 639950, -6569153, 3364033, -1924145, 307090, -3122978, 2389076, -842350, 3876745, -8061117, -891743, -1243393, -2876018, 512712, 3897683, 2977486, -3636227, -2687039, -2925410, -545998, -2320356, --1177895, -3550327, 1347009, -324807, -4099546, -2134599, -1658394, -221191, 839129, -909459, --430570, 1745367, 691490, -1948305, 1006633, 4345433, -2245194, -595390, -4696547, -1805497, --371515, 1923609, -1990181, 545998, 783295, 633508, 1505386, -3642132, -129923, -2061047, -1709397, -1326071, -3504157, -1013075, -119722, -79457, -1554241, -1643899, 1690607, -785979, --324270, 611496, 982474, 28991, -240518, 175557, 579284, 21475, -399969, 758599, -127238, -694711, -632971, 707596, -271120, 245887, -477278, 637803, -618475, -409096, --114354, -148176, 216359, 7539815, -2809982, 2458332, 6305012, -5101348, -5756330, -838056, --1433445, -59593, 3213709, 1797981, -8005819, 1263257, -4591857, -6311992, -403727, 2331630, -2512019, -2050310, -264677, -662499, 3445101, -699543, 2833068, -1308891, 331786, 635655, -863825, -3990025, 1686848, 3113315, -1451162, 3963718, -2185602, -414464, -4932770, 3524021, -885837, -1286343, -3825205, -3774203, -1720671, -1277753, 1916092, -399969, 1654636, 1654636, --3393561, 2133525, -4559108, 1650341, 2655901, 5052492, 4847945, -4158602, 2071785, -247497, --1103807, 2966749, -2248416, -2663954, -2019172, 2422899, 1197222, 3152506, -3113851, 4736812, --1529545, -217970, 1421097, 802622, 2767033, -2072859, 3942243, 4998268, 8708046, 4065187, -2769717, -5120675, -941135, -3333968, -2428804, 3186866, -416075, 3932580, 1597191, -287226, --782221, -654983, 2257005, -1686312, 1799591, 2154463, -1682017, 1044214, 777926, 251256, -1285806, -770410, -239444, -1660005, -9224516, -9926743, 1133335, -812823, 2362769, 2205466, -6558952, 2968359, 3134253, 1589675, -3205119, 1240172, 8286066, -5531918, -617938, 260382, -6652905, 4005057, 930397, 2954401, -521839, 2283849, 3069291, 6820945, 3781182, 3833258, -2061584, 1647657, 3326989, 1212255, -4744865, 2924873, 3928821, -1386738, 2858838, 3775276, --1306744, 1195612, 4710506, 1749662, -1125818, 1701881, 4807679, -233002, -44023, -933082, -1326071, 4510790, -1319629, -2521683, 1308891, -1543504, 2386391, 2837363, -3338263, 734439, --2152852, 189515, 1381369, 3799972, 3125126, -7946763, -6442, 3915400, -2015950, -3302830, -458488, 625992, 3933116, -311385, -8483634, -3697430, 2763275, -2345589, 4014721, -1096290, -34360, 1032940, 5032091, 3164854, 2141578, -2566780, 4135517, -477278, 2538326, 1257889, -512175, 880468, 872415, -47245, -646393, 569083, -343597, -2043331, -860604, -830539, --248571, -457951, 5906, -605590, -1477469, 758062, 326954, -740882, 181999, 1418950, -1038308, 501974, -186294, -219043, -136902, -58519, 1340030, -16789028, 2364380, 1744294, -7845295, -293668, 6127845, 3149285, 1568200, -9834938, 23085, -140660, -7628936, 1233729, -5719286, 1095217, -100932, -710817, -3038153, -3484292, 1568200, 2262911, -261456, 1512902, -1764695, 6870337, 795643, 3047816, 3212099, -3590056, 787053, -839666, -983548, -451508, -2536715, -383326, -1709934, -2742874, -1636383, 887448, -4874788, -3463891, 2068027, -3879966, -1280437, -6378027, -7633768, -1945083, 9463960, -2494839, -547608, 5583995, 1880122, 415538, -5979132, -842350, 677531, -754304, 1760400, 3838627, -1490891, -5966247, 3823595, -3477850, --6613713, -2638184, -1842541, -6442, 2446521, 7173669, 59593, -71941, -2796561, -266288, -4243428, -2001992, -2177012, 5115843, -4311074, -332860, 2352568, -5232881, -1013612, -1814624, --1758789, 583579, -2791192, -3948149, 254477, 2448668, -1126892, -1704565, -2225330, -2261300, --304943, 1631551, 746251, -223338, -650688, -1759863, 94489, -589484, -2137283, -3160022, --2685428, -37581, -335544, 1276679, -2086817, -100932, -295279, 1016297, -153545, 436476, -14968498, 497679, -900869, -5666673, -3257196, 7902740, -3189013, 6171868, 5311264, -6014565, --974421, 4631049, -3364570, -1618129, -1569274, -2174327, 999117, 1669132, 290447, 2897492, --1306207, 464930, 1096290, -1197759, -2824478, -2939905, -3328600, 279173, 3901978, 1709934, --3286187, 322659, 1545651, 7446937, -2190970, 6668474, -6046777, 2760590, 4807142, -3145527, --1919314, -6159520, 2929705, -40802, -4324495, 4319664, -5364414, 6053757, -316217, 8559333, -1976222, 955093, 2079301, 3579855, 1910724, -2732673, 4225711, -756451, -4480188, -7004555, --1900523, 3012920, -3510599, -2257542, 2759517, -3903052, 7728794, -7388955, -21475, 4993973, --4222490, -1649268, -7769596, -548682, -3035468, -1672890, -2323041, 6770479, 2663417, 722091, -290984, 5846524, 588947, -461709, 4670240, 3870303, 3505767, 7255811, -1525787, 743029, --2019172, 2078764, 2393908, 525597, 711354, -1177895, -33823, -1683627, -846109, 209380, -668404, 1190243, -552977, -208843, 2334315, 1121523, -851477, 4518306, -229244, -1068373, --1821603, -1157494, 1655173, -1491427, 169114, -140660, -1554241, 738734, 494458, -379568, -1148904, 1228898, -1176284, 1273995, 7224672, 12786118, -3730716, -5558225, 1470489, -2265059, -3530463, 11642046, 77846, -2669859, 3698504, 2011655, 3451006, 2098629, -6325950, 248034, --5645198, 3162170, 2739652, 1677722, 10643466, -495532, 7936563, -194884, -188979, 2428267, --60130, 8361228, 1110786, 5270999, -1934883, 7135552, -3204046, 3812857, 14110578, -2290291, --3554622, 9960566, 2098629, 6495601, -152471, -6165426, 1933272, -3549254, 4268124, -7431367, --990527, -3853123, 4207994, -613107, 872415, 7701950, -3728032, -7704098, 2168959, -646929, --358630, 6267968, 1213865, 909996, -2812130, -5060009, -5379984, -1780264, -4440996, -3338263, -4610111, -2297271, -432718, -1661616, 547071, 46171, 4115653, 2594160, -4702453, -6772090, --1583769, 241055, 1878511, -1829119, -1662689, 5609228, 3190087, 2775623, 816581, -4523675, --2097018, 2487323, 112743, -1475858, 1995549, -599685, 1219234, -1451162, 125628, -819265, --2575370, -3033858, -806917, -2680597, 723702, -372052, 273267, 1888712, -488016, -1421634, -2289755, 525060, 1462973, 887448, 149787, -814970, 1134408, -248034, -254477, -47782, --243203, 135828, -464393, 674847, 1453310, -1734630, 486405, -2051384, 328565, -971200, -17539572, -9206262, 6154688, 240518, 3033858, -4235375, -3319473, -1928977, 3813394, 4912906, -1043677, -2691334, -5099737, 2666638, 4848481, -947577, 1521492, -2593624, 5285494, 1960116, --9936407, -3261491, 3195993, -577673, -4225174, -197569, 4517232, -3315178, 1531156, -6457484, -3766686, 8172786, -3385508, 8644695, 289373, -1571421, 5752572, -245887, 439697, 5209796, --11250667, 1691680, 3404299, 4787278, 3228205, 3740380, -5052492, -3910031, -182536, 1795833, --5471789, 1808718, 5305359, 4771709, 1759863, 14564234, -4594005, -1823751, -6599218, -2822867, --4328790, -6059125, 7496866, 3132642, 7321846, -1144072, -11735461, 6830072, -4147865, 3754338, -3355443, 1640141, 2015950, -9260486, 10968273, 2398202, -5095442, -8886287, -5578626, -5566278, -770410, 4540854, -4147328, 347892, 2782602, 2385854, -4295, -1927367, 447213, -192737, -1723356, 1848447, 1975148, 1384053, 1302449, 686121, -3241090, -2897492, 131533, -1063541, -1047972, 1320703, -1511829, 2106682, -520228, 770410, 1730335, 753767, 1340567, 404264, --3447248, -235686, -55835, 1215476, 882616, 419833, -788127, -923418, 1848447, -541166, -4517232, 784368, 1947231, -21022254, -17696876, -16316044, 3640522, 3351148, 1365800, 732292, --1165010, -1270774, 436476, -2783139, -5920613, -4115653, -10364293, -4578435, -5031018, 6193880, --7966628, -3526705, -4510253, 1336809, 90194, -2067490, 2323041, -692027, -8271570, -168041, -7588671, 980326, -7378754, -6522445, 2849711, -2638184, 6368900, 4478577, -6971806, 6881075, -10861972, -9107478, -9328669, -4989142, 3426310, 8635032, -6152541, -6361921, 3266860, -3673808, -671626, -818728, -792958, -9907416, 1891933, 5997385, -3080029, 3433826, -4926865, -5858336, --5815923, -2878702, -10018548, 17157320, -3638374, -1158567, 2995740, 1866163, 3654480, 2336462, -5352603, 2443837, 4647155, 10619307, -13706851, 9590125, -3270081, -2606508, -471373, -15298137, --700617, 4680978, 424128, 602906, 4274030, 1563905, -379568, 2543158, -5172215, 5987722, --2165201, -3486440, 3250217, -2120640, -1913408, 612570, 2652679, -2047626, -3247532, 1104344, -2574833, 100932, -1103807, -2830920, -1556926, 390305, -4002910, -2674691, -1397475, 1908576, --906238, 143345, 2109366, 35970, -3987877, -908386, -3396246, -3019899, -2849174, -1758789, --3147674, 2664490, -941672, 175020, 5714454, -1140314, -1743757, -1546725, 3090229, 775242, --1065152, -20672752, 15845208, 4198331, 3453691, -3827353, 15509127, -2441152, 7306813, -22012, -6573985, -9230958, 3652870, 3621731, 1411434, -4541391, 13804562, -3743064, 4206921, 3176665, -14326937, -9667435, -630823, 3986267, -2493766, -7093676, 4278861, -6672232, 1723356, 1828046, --7838852, 3033858, 638876, 395137, 15756624, 9854802, -1323387, -6447820, -5043902, 3518652, --842887, -9450002, 2677912, -830002, 2778844, 7118372, 10478110, -7197292, 7123204, 3570729, --4730907, 3408057, 2736431, -7443715, -4034585, -4666482, 7498476, -8112657, -6898791, -18595598, --13634911, 3778498, -2568391, -2674154, -7173133, -14428406, 5525476, 1112397, -436476, 7069516, -6009733, 8502425, 5037460, 2057826, -255014, 1360968, 9597641, -7096897, 13146895, -4836670, --3740917, -12018392, 1906429, -2206003, -6138045, -1084479, 1453846, -3022583, 3491809, -1451162, -142271, -1477469, -488016, -1268626, -301185, 2173790, 3435974, 278636, 2835215, -3204583, --2289218, -1623498, 1175210, 2475512, -3278671, -1228361, -1533840, 481573, -1834488, 1473711, --340376, 1283122, 2164127, 36507, -3495030, 4930623, 4723927, 1974611, 21475, -2126546, --145492, -1107028, -526134, 5576478, -24987582, 23119272, 16607565, -6772627, -5717675, 6243272, -56908, 569083, 11033771, 7809861, 321586, -1624035, 4444218, -2563022, -1595580, 3115462, --4944044, 6213207, 4258460, -5159867, 6698002, -716723, 1807644, -483184, -11011222, -609885, -8018704, 8313983, 3263638, 3564823, 4458176, -5124970, -6487011, 2808909, 4997195, -202400, --2501819, -5652177, 2355790, -1653026, 7083475, 8341900, -926102, 9615358, -4992900, 10715407, -5807333, 12913356, 937914, 1893007, -3709241, -5264556, -992674, 9913858, 16181826, 989990, -12336220, -5305359, -11818676, 1592896, 4474819, -10327786, 10785200, -3550864, 3819300, -22764400, --9785546, -134218, -5462125, 4424890, 7544647, 15835544, 3309272, 134755, -7735773, -13731010, -3563212, 610422, -11522860, 4749160, 2513630, -8308078, -2349884, 2011655, 9135395, 228707, -2774012, 2813204, 4770098, 3925600, -7699266, 2771865, -118648, -1510218, 187368, -354872, --1218697, 3308199, 3124589, -3191161, -1305670, -17717, 2237678, -1205275, 3183645, 500364, -2325725, 2084670, -2492155, 1924682, 2332167, 5980742, 564251, 3430605, 3747896, 951335, -4396436, 1619740, 2280091, 1038308, 577136, 1618129, 5162014, -2160369, -4706748, 1190780, -6153078, -9710384, 16675211, -7154879, 2004676, 12465069, 12899934, -952409, -7412040, -3974992, --3930432, 956704, -9581535, -7600482, 8025684, 2017024, 5159867, 6288906, 7432441, -3322694, -4821638, -1821603, 5773510, 24049670, 5664525, -11592117, 11259257, 12931073, 563714, -2131915, -683437, -6395207, -8817031, -4613869, 13186086, 8857296, 7301982, 11216307, 2273648, -1930588, --5155572, -14242648, 6601365, 7514582, 4171487, -2255932, -1763621, -4912906, 1981591, 11596949, -7990787, -13285944, 8777303, -11201275, 11810623, 2522220, 4421669, 5281199, -1976222, -6330782, --1926830, 4755603, 20434380, -3252901, 10206990, -4538170, -9241159, 10851235, 9766756, 2479807, -2233920, 9840844, 3441343, 580894, -1122597, -6255083, -1930051, -9176734, 2947421, -7124277, --3568044, 14483703, -767189, 395137, 286152, 6681896, -2183991, 1995012, 4420058, 6729140, -7271380, 6066642, 2374580, 3188476, 3323768, 6096169, -944356, -4862977, 6885907, 2739652, -3795677, 4185983, 174483, -482647, 428960, -3034395, 1890323, 6535867, 731755, 842350, --1377074, -2422899, 5454072, 5873905, 1137093, 10409390, -1293859, 4494684, 7961259, 514322, -2208687, -1147293, -3051574, 826781, 1728188, 2889439, 5733245, 2508798, 4294968, 1604707, -1028645, 5980205, 8505109, -4292283, 8644159, 11042898, -12664785, 8529805, 4935991, -3061238, -789737, 5868536, -5299990, -11187853, 16806744, 3633006, 3218541, 3141232, 9976135, 2907693, --10039486, 10726144, -14397267, -16819628, 1495722, 2024003, -9287867, -3044058, -27509266, -19477676, --14668387, -4955856, -15090904, -7430831, 5724118, -13566191, 9520869, 8757438, -11049877, 14268418, -7611756, -2790655, -1435593, -7383049, 320512, -13184476, 28934658, 8461622, 4509179, -14441291, -3518115, -4458176, 19187766, -3858491, -499827, -17511118, 17137456, 1147830, 6711960, 5563057, -9994926, 5666136, -3880503, 5731097, -8534100, 8664023, -3132105, 5107253, -13661217, 30942018, -4720169, -14343043, 7785165, 9038759, 7063074, 10532870, 8986682, -13929116, 11109470, -272730, -8958765, -7045894, 2662880, -17923972, 7541426, 7819525, 2268817, -4298189, -13561359, -872415, -9283035, -12030740, -1643362, -1414655, -57982, 3690451, 2793339, -2704219, 5216238, -294205, --2557116, 4133369, 3170760, -3757023, -3039226, -7852274, -492848, -7304129, 4394289, 1239635, -733903, 5767604, 8871255, 5638219, 4173635, 2834679, -3156264, -1219234, 91268, -5695664, --4719632, -1293859, -1911797, 3106872, 7204271, 2294050, 4556961, -1016297, -89121, -22364432, -6277095, -3061238, -2173254, 13280576, -2439005, -2260764, 1292785, 11890617, -3091303, 6936372, --5800354, -6841346, -8742406, -11087458, 19270444, 10047539, 6996502, -6048925, -17637284, -21648782, -10431939, 7185481, -7675107, 5163088, -5212480, 519154, 19181860, 8377871, -5424007, 10344429, --3478924, 5369783, -6373732, 6493454, -14145475, -20809116, -8072928, -9280887, -1562831, 24359444, --19810536, 11468100, 6605123, 4981089, -4363150, 9590662, 4300336, -19033148, -24193014, -8614094, --11022497, 27420682, 19898584, -6637335, -12204150, -1016297, -12523588, -2648384, 19983410, 18487150, -10513006, -16302085, 3549791, -12734041, 20037096, 9504763, -2085744, 71404, 6767795, -11819213, -2690260, 17653390, 9622874, -15968152, 17384418, -8854612, 10404558, 27545236, 10553808, -6485938, --8118025, 23574002, 2640331, -1436667, -10667088, 4153234, -5005248, 1516660, -3106872, -556735, --652298, -11742441, 1529545, -1462973, -3298535, 5163088, -860604, -4154844, 799938, -2470143, -705985, -3066070, -4519380, 4067871, -5014911, -3245385, 2459406, 6127845, -247497, 4326643, -3629247, -817654, 42413, -5906654, 871342, 1996086, -4938139, 6703370, 3374771, -4095251, --2679523, -2860448, -1205275, -6596533, 3968550, 6245420, 357556, -4913443, -2778844, 3241627, --1351304, 3115462, 4481799, 313533, 1700807, -17768280, -6956774, 29768956, 13785771, 17157320, -4190814, -24723442, 7648263, -20057498, 13202193, 37205156, 13232257, 23345832, -10500121, 6746320, -10850161, -1112397, 2806224, -9535364, 2441689, 14636175, 782221, -3891777, -13196824, 7279433, -5466957, -13448616, 7032472, -5101348, 10312216, 14713484, 15645492, 18844170, 1906966, -14596446, -3968013, 8909373, -146566, 25653840, 2275259, -29464550, -18475876, 8398272, -7480223, -34775276, -1283658, 14839112, 5493800, 1567126, -3142842, 18335752, -14374182, -17838072, -3424700, -6379100, --17351668, -952409, 1296006, -10108206, -14936286, -9150965, 763430, 2178085, -21585968, 6466610, --8983461, 5267241, 24977382, -3395172, -8644159, 17398376, -2993592, 14487998, -13678934, 9360344, -644245, -15855409, -17683990, 31988916, 3147137, 4331475, 1551020, 46171, 32096828, 26208428, -8316668, -2398739, 12610561, -6145025, 4331475, 7508677, -1344325, 9863929, 4278861, 2885144, --14561550, 8706972, 4709432, -803159, 1374926, -4927938, 4255776, 11331734, -1822140, -3654480, --6227166, -6833830, 6859063, 8047695, 490700, 56371, -6130529, -6619619, 1246614, -9515500, -1416266, -3148211, 10063645, 3590593, 496069, -6277095, -10966125, -2479270, -5286031, -7397008, -4355634, 4482335, 8647917, 25170656, 3271691, -34470872, -15591805, 21391084, -30829812, 17522930, --29176250, 2374043, -4658429, -42198052, -5558762, 18997714, 38841536, 12372727, -5640366, 9431748, --14894410, -4993437, -33880312, -1883343, -23010824, -3313031, -5036386, -15904264, -16874390, -5603859, -9701794, -15285252, 10537165, 19398756, -19989314, 7249368, 6458557, 3433826, -21272974, -3248069, --217970, -22286586, 5814849, 28389196, -2152852, -41213968, 14599668, -24893094, -63546724, 17922362, --26278758, -32682554, 1744294, -14965814, 4539781, 11235098, -6259378, 16734803, -13984414, 14618458, --11537893, -28440736, 170725, 20351166, 19514184, -36956584, 5441187, -4420058, -27507654, -7358353, --6812355, 47873852, 23905252, 28083180, 12799003, 12213813, 29631516, 42561516, -9711995, -20164872, --22000434, 3863860, -27334246, -8411157, 14157286, 22992570, 3235184, 2088428, 19967840, -4621922, --11324755, -15411416, 12031814, 13643500, 13406740, 3129958, 15379204, 6376953, -9426916, -2094333, --9130564, 14024679, 2268280, -1639604, -15726023, 4772246, 12607876, 1384053, 241055, 12316356, --9827959, -6575595, 6819335, 695248, -4958540, -9468255, -3020973, 14492830, -697932, -32087700, --2977486, -793495, -7348689, -6256694, -8472360, -5194763, 6998649, 6258304, 3729105, 2221572, --5268851, -6656663, 55716464, 60232084, -35359392, -14008573, 26891328, -12200391, 10846940, -16780438, -5019206, -17241072, -32293860, 44000868, 6415071, 13817984, 11316165, 4120484, 5779416, 1322313, -8916352, 10933376, -31249108, -25761750, -22570590, -21308406, -15963320, -10060424, -8339216, -16753057, --9491878, -14198088, 16145319, 12277164, 6207839, -7823820, 3280281, -33063196, -16612934, 8994735, --30048664, -2777233, 14625437, 25942140, 3802120, 5028333, -11098195, -19403052, -22886806, 18387292, --2488397, 18204218, -64170568, 4009352, -7460895, 7389491, 39237748, 4820564, 6549289, 4429185, --11492796, -13215077, 361314, -2607045, -36026184, 7733089, -13212393, 32319628, 2156611, -35403416, --48195440, -29943976, -6083821, -33843804, -33143188, -20561620, 23378044, -6052146, -22824530, -30775588, -25724170, -3305514, 15222975, -17313014, 9342091, 25365004, -16840030, -24417426, -10255845, -12605729, -26527328, 5595269, -11629161, 10457172, 7784628, 23088670, 14328548, 6725919, -20495584, -20424180, --4488778, 2403571, -5360656, 3705483, 14220637, -3098282, -1189706, -10363219, -7597261, -5645198, --10787347, -2019708, 4441533, 6542846, 33530810, 2261300, -8395050, -2640331, 4496831, 10507637, --594316, 16623134, 6971269, 38341708, 5950677, -252866, 1417876, 7049115, -10610180, -16483011, -62755376, -36376224, 23831700, 44472776, -21304112, 6334540, 35544612, -44917304, 1833414, 5098663, -21923124, -50377820, 2849174, 3462818, 16632798, -21945672, 328565, 9104794, -29617558, 4484483, --2202245, -5475547, 16387985, -4837207, -4423280, 6974490, -3834332, -4976794, 16079284, -14900852, -4475893, -6098317, 4153770, -9520869, -5254893, -11627550, 230854, 2348810, 31419296, 10496900, -15304579, -3097208, 426276, 23312008, -910533, -8718247, 13108240, 9679246, -10397579, -30348776, -27960238, -30246770, 5044976, 14632954, 19199578, -29764660, 31967442, 51311976, -27921046, -51991652, -69785168, 24716464, -34323768, 16000901, -33036888, -41052372, -20412368, -7434589, -42874512, 34879968, --59804736, 18083422, 28701118, -23690502, -79981952, 75848584, -13065827, -19437948, 50596864, -50227496, -26120380, 43182676, -12802224, -11724187, 13499619, 14897094, -7964480, 5434744, 4543002, 13758928, --6613176, -4867809, 15416785, 63351, 3557307, -1519345, 3004867, 12329777, 9183177, -1559073, --10780368, 18023294, 19523310, -3565897, -16517907, -1666984, 8362838, 1881196, 12092480, 161598, -10603737, 4533338, 15483894, 11436424, 13037373, -19016504, 5084705, -265751, 951872, 178778, --11491185, -20550344, 30412664, -4776541, -27759984, 10264435, 6976101, 3023657, -4403415, -19206556, --15238544, 34819300, -23038742, -18430242, -36750424, -16944720, 21767968, 16884054, -9840307, -12259984, -11571179, 28875602, -12477954, 21772800, 26074210, -18585934, -2714419, 15911780, -4185446, -143881, --5330592, 1328756, -26742076, 7245610, -5974300, 834834, 6373195, -5437429, 5450314, -11144903, --22409528, -10647224, -38976828, 4799626, -141734, -5875516, 7162932, 3641059, -2593624, -8938901, -15588584, 24654186, -26035554, 37918656, -4339528, 5006322, 5448703, 33512020, 15352897, 24506010, --30888868, -7709467, -5838471, 43707736, -40900436, -14015552, 19913616, -1532767, -47222092, 3136400, --9784472, -8124468, 21481278, 23544474, 1604707, -17770428, 38060928, -16111496, 63508072, 785979, --29541858, -92879, -5171678, -33420214, 63807644, 12782896, -9574019, -75647256, -37828460, 21251498, --27875948, -25092810, 29556892, -110861160, 2748242, 21796422, 15988553, -9004936, 31120796, -19107236, --2517388, 110059, 16189879, -4645544, 3274376, 22053584, -1583232, -5598490, -7030325, -7972533, --390305, 2451890, -1510218, -3366718, 14232985, -20003274, -4518843, 2359011, 3299072, -11986717, --20281910, -5166846, -6248104, -2909840, -1717450, 3911105, -22491134, 1719598, 17011828, -10619844, -13004624, 9985799, -9811316, 611496, -7185481, 2839510, 4777078, -10466835, 29417842, -14281840, --13191992, -17027398, 14239427, 19317152, 11791833, 48008072, -9225053, 10887742, -4577899, -24752970, -12429098, -15771657, -8877697, 9910637, 21544092, -22691922, 24821152, 2863670, -1233729, 50586660, --10255308, -5608154, 37924560, -24225764, 33504504, 14461692, -7919920, 13366475, 14124000, 31253404, -32502702, 9447317, -26357140, 55205364, -55356224, 1873680, 50407348, -27116276, 11178189, -5975910, --6510634, -58372364, 39660800, 10490994, 17617418, 18596134, -12108587, -29055990, -21831318, -17705466, -2784213, 55472188, 394063, 43509628, -14455786, -33483566, 1859721, 12512850, -27485106, 44647796, -18178450, 21940840, 44110388, 28552942, -47160888, 17997524, -67653784, -83598856, 1767379, 70399344, -44163540, 5696737, -49787796, -177893792, -32693828, 55009404, 62872416, 89085672, -4512937, -112974816, --63712620, -58852864, 90339808, 69042672, -12451647, -45145476, -26402238, -54900956, -6994354, 70731136, --6849936, 16546362, 11826192, -11598022, -25608742, 38548944, -15628849, 21506512, 15781857, -1462436, --35782984, 49090404, -19342386, -9268539, 14230300, 12738336, -26553098, 443455, -8309688, -10023917, -3403225, -954557, 19676318, -35107064, 18625662, -42251740, -6657200, -7043747, 50258096, 1497333, -13655849, -30659088, 16056198, -11526082, 22226992, 26558468, -12816182, -30494268, 11018202, 7902740, -25736518, 7217156, -43612172, 36628016, -27421218, -4743792, -17755932, 17024176, -19945828, -848793, --2097555, -5411122, 4093104, 18756660, -19812148, 8717710, 1555315, -4587025, 276489, 13226889, --16747688, -4581657, -2454574, 27471148, -27819576, 7377680, -12191802, 18203682, -20310364, -5778342, -6964827, -3934727, 3856344, -13140452, -2323577, 11880416, -3608310, 4589173, 3770981, 2484639, -14865419, -13771813, 9328669, 10715943, 13272523, -1866163, -30778272, 3940096, 3666828, 12534325, -11463805, -2248416, 3083787, -5194763, -13982266, -2392834, 6432788, -2649995, 18716394, -15235323, --5020280, -30389578, 9091372, 3267933, -4769561, 6771016, 5950141, -455267, -15666430, 4870493, -15355045, -3005940, -2209224, 6003291, -6159520, 11424613, -7034083, 1918777, -14374182, 6789270, -2755222, -2319819, -3909494, 8311299, -3956739, -6083285, -8650064, 9041443, -327491, -4592931, --1901597, 8994198, -3528853, 3951907, -4960151, -3061238, -421444, 278099, -41339, -5017596, -599685, 103616, -4126927, 4225174, -3911105, 11749957, 1938641, 1525250, -16278463, 4555350, --256624, -6583111, 7480760, 13791677, -9964324, -2326262, -300111, -7292855, 11069204, -1895154, -1660005, -7314866, 3884798, -1623498, 1449552, -4704063, -24839406, 60313152, 16461536, 14921790, --7944079, -19275814, -18538690, 5295158, 11735998, 1869921, -656056, -41876, -8774081, -1581085, -4267587, -2313914, 1858110, -922881, -8786966, -440234, 4407710, 6904160, -6102612, 1708323, -4451197, -8776766, 14472429, -8746701, -7604240, -7581154, 2015413, 4234301, 6739341, -7294465, -9386651, -13447006, 8965207, 7967165, -5879810, -600759, -381178, -1536525, 7000260, -7474854, -2232309, -2383170, -9634685, 13732084, -7616051, -250719, -5628018, -1768453, 9619653, -12481175, -5137855, 3469260, -5399848, 4594005, -10599442, 3096672, 4489852, -7911330, 248571, 4256850, --7262253, 7353521, -10046465, 2806761, 10418517, -15159624, 4425427, -5793374, 1110249, 5954436, --4461934, -2321430, 1138166, 1294396, -838056, 4253092, -3168075, -2799782, 2149094, -2504503, -1435056, -970663, 1865090, 1670205, -2371896, 1215476, -386010, 2189897, -1940252, -584116, -1568200, 30602, -1083942, -3543348, 2317672, 2316598, -438624, -2458869, 2414309, -144418, --1001801, 2366527, -4924180, -1049046, 2935610, -3650722, 5364414, -3260954, 348966, 8699993, --2436320, 6255620, -3470871, -389231, 7056095, -4911295, 9025874, -46599860, -109318192, 30926986, -106989784, 73576544, 116342072, -64791728, -68966440, -94036696, -108853800, 2326262, 83965536, 86750288, -90569584, 17772038, -29945586, -59407988, -85263688, -72267656, 5616207, 56120728, 66568236, 59896540, -14321568, -16564615, -10351945, -46788300, -52334176, -22083112, -1438814, 20115480, 44105556, 21540872, -15989626, 22088480, -11049340, -26251914, -4311611, -41962904, -19695646, 451508, 6643778, 31963146, -37214280, 3293166, -5657546, -3507915, -27490476, -7454453, -402116, -5727339, 9493488, 18386218, --3941169, -1470489, -7239168, -11498701, 2338073, 1123671, -1272921, 20746840, 14033806, 5180268, --548145, -19588808, -28324236, -22395570, 1596654, 21053930, 18065706, 23721642, 3208878, 604517, -5378373, -29469382, -16785806, -13864691, -2538326, 22588844, 5091684, 7569880, 21066278, -12182675, --17724256, -4134980, -3042448, 6523519, 7582228, 2364380, 4224637, 1845225, -10887742, -11274826, --2765422, -16643, 8079907, 11706470, 3827353, -1668595, -2562485, -3347927, 2918430, -3301756, --13837848, -2182380, 3242164, 6392522, 13745506, 3339874, -2869575, -6624987, -11331197, -2486786, -1126355, 3678103, 6459094, 8076686, 6357089, -3274913, -9817758, -10344429, -9030706, -1043140, -4477504, 4962298, 13284871, 13642427, 6645388, -2953327, -16789028, -17755394, -8233453, -6224482, -6267968, 16568373, 12277701, 5311264, 70867, -1313723, -2155000, -5058398, -8322573, -7997766, --3400540, 1205812, 3506841, 5606006, 8131984, 7780870, 3052648, -2842195, -6265284, -6518687, --4183835, -918049, 641024, 546535, 176631, 75699, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-4885526, 6077916, -1243393, 4852776, 1415729, 7217693, -1682554, -3734474, -2572686, 4409321, +122407, -1605781, -427886, 4985920, -1328219, 904091, 1749125, -3351685, -2550674, -1093606, +919123, -3478924, 883153, 703838, -4029753, -1313186, -2411624, 336618, -1762547, 639950, +6569153, 3364033, -1924145, 307090, -3122978, 2389076, -842350, 3876745, -8061117, -891743, +1243393, -2876018, 512712, 3897683, 2977486, -3636227, -2687039, -2925410, -545998, -2320356, +-1177895, -3550327, 1347009, -324807, -4099546, -2134599, -1658394, -221191, 839129, -909459, +-430570, 1745367, 691490, -1948305, 1006633, 4345433, -2245194, -595390, -4696547, -1805497, +-371515, 1923609, -1990181, 545998, 783295, 633508, 1505386, -3642132, -129923, -2061047, +1709397, -1326071, -3504157, -1013075, -119722, -79457, -1554241, -1643899, 1690607, -785979, +-324270, 611496, 982474, 28991, -240518, 175557, 579284, 21475, -399969, 758599, +127238, -694711, -632971, 707596, -271120, 245887, -477278, 637803, -618475, -409096, +-114354, -148176, 216359, 7539815, -2809982, 2458332, 6305012, -5101348, -5756330, -838056, +-1433445, -59593, 3213709, 1797981, -8005819, 1263257, -4591857, -6311992, -403727, 2331630, +2512019, -2050310, -264677, -662499, 3445101, -699543, 2833068, -1308891, 331786, 635655, +863825, -3990025, 1686848, 3113315, -1451162, 3963718, -2185602, -414464, -4932770, 3524021, +885837, -1286343, -3825205, -3774203, -1720671, -1277753, 1916092, -399969, 1654636, 1654636, +-3393561, 2133525, -4559108, 1650341, 2655901, 5052492, 4847945, -4158602, 2071785, -247497, +-1103807, 2966749, -2248416, -2663954, -2019172, 2422899, 1197222, 3152506, -3113851, 4736812, +-1529545, -217970, 1421097, 802622, 2767033, -2072859, 3942243, 4998268, 8708046, 4065187, +2769717, -5120675, -941135, -3333968, -2428804, 3186866, -416075, 3932580, 1597191, -287226, +-782221, -654983, 2257005, -1686312, 1799591, 2154463, -1682017, 1044214, 777926, 251256, +1285806, -770410, -239444, -1660005, -9224516, -9926743, 1133335, -812823, 2362769, 2205466, +6558952, 2968359, 3134253, 1589675, -3205119, 1240172, 8286066, -5531918, -617938, 260382, +6652905, 4005057, 930397, 2954401, -521839, 2283849, 3069291, 6820945, 3781182, 3833258, +2061584, 1647657, 3326989, 1212255, -4744865, 2924873, 3928821, -1386738, 2858838, 3775276, +-1306744, 1195612, 4710506, 1749662, -1125818, 1701881, 4807679, -233002, -44023, -933082, +1326071, 4510790, -1319629, -2521683, 1308891, -1543504, 2386391, 2837363, -3338263, 734439, +-2152852, 189515, 1381369, 3799972, 3125126, -7946763, -6442, 3915400, -2015950, -3302830, +458488, 625992, 3933116, -311385, -8483634, -3697430, 2763275, -2345589, 4014721, -1096290, +34360, 1032940, 5032091, 3164854, 2141578, -2566780, 4135517, -477278, 2538326, 1257889, +512175, 880468, 872415, -47245, -646393, 569083, -343597, -2043331, -860604, -830539, +-248571, -457951, 5906, -605590, -1477469, 758062, 326954, -740882, 181999, 1418950, +1038308, 501974, -186294, -219043, -136902, -58519, 1340030, -16789028, 2364380, 1744294, +7845295, -293668, 6127845, 3149285, 1568200, -9834938, 23085, -140660, -7628936, 1233729, +5719286, 1095217, -100932, -710817, -3038153, -3484292, 1568200, 2262911, -261456, 1512902, +1764695, 6870337, 795643, 3047816, 3212099, -3590056, 787053, -839666, -983548, -451508, +2536715, -383326, -1709934, -2742874, -1636383, 887448, -4874788, -3463891, 2068027, -3879966, +1280437, -6378027, -7633768, -1945083, 9463960, -2494839, -547608, 5583995, 1880122, 415538, +5979132, -842350, 677531, -754304, 1760400, 3838627, -1490891, -5966247, 3823595, -3477850, +-6613713, -2638184, -1842541, -6442, 2446521, 7173669, 59593, -71941, -2796561, -266288, +4243428, -2001992, -2177012, 5115843, -4311074, -332860, 2352568, -5232881, -1013612, -1814624, +-1758789, 583579, -2791192, -3948149, 254477, 2448668, -1126892, -1704565, -2225330, -2261300, +-304943, 1631551, 746251, -223338, -650688, -1759863, 94489, -589484, -2137283, -3160022, +-2685428, -37581, -335544, 1276679, -2086817, -100932, -295279, 1016297, -153545, 436476, +14968498, 497679, -900869, -5666673, -3257196, 7902740, -3189013, 6171868, 5311264, -6014565, +-974421, 4631049, -3364570, -1618129, -1569274, -2174327, 999117, 1669132, 290447, 2897492, +-1306207, 464930, 1096290, -1197759, -2824478, -2939905, -3328600, 279173, 3901978, 1709934, +-3286187, 322659, 1545651, 7446937, -2190970, 6668474, -6046777, 2760590, 4807142, -3145527, +-1919314, -6159520, 2929705, -40802, -4324495, 4319664, -5364414, 6053757, -316217, 8559333, +1976222, 955093, 2079301, 3579855, 1910724, -2732673, 4225711, -756451, -4480188, -7004555, +-1900523, 3012920, -3510599, -2257542, 2759517, -3903052, 7728794, -7388955, -21475, 4993973, +-4222490, -1649268, -7769596, -548682, -3035468, -1672890, -2323041, 6770479, 2663417, 722091, +290984, 5846524, 588947, -461709, 4670240, 3870303, 3505767, 7255811, -1525787, 743029, +-2019172, 2078764, 2393908, 525597, 711354, -1177895, -33823, -1683627, -846109, 209380, +668404, 1190243, -552977, -208843, 2334315, 1121523, -851477, 4518306, -229244, -1068373, +-1821603, -1157494, 1655173, -1491427, 169114, -140660, -1554241, 738734, 494458, -379568, +1148904, 1228898, -1176284, 1273995, 7224672, 12786118, -3730716, -5558225, 1470489, -2265059, +3530463, 11642046, 77846, -2669859, 3698504, 2011655, 3451006, 2098629, -6325950, 248034, +-5645198, 3162170, 2739652, 1677722, 10643466, -495532, 7936563, -194884, -188979, 2428267, +-60130, 8361228, 1110786, 5270999, -1934883, 7135552, -3204046, 3812857, 14110578, -2290291, +-3554622, 9960566, 2098629, 6495601, -152471, -6165426, 1933272, -3549254, 4268124, -7431367, +-990527, -3853123, 4207994, -613107, 872415, 7701950, -3728032, -7704098, 2168959, -646929, +-358630, 6267968, 1213865, 909996, -2812130, -5060009, -5379984, -1780264, -4440996, -3338263, +4610111, -2297271, -432718, -1661616, 547071, 46171, 4115653, 2594160, -4702453, -6772090, +-1583769, 241055, 1878511, -1829119, -1662689, 5609228, 3190087, 2775623, 816581, -4523675, +-2097018, 2487323, 112743, -1475858, 1995549, -599685, 1219234, -1451162, 125628, -819265, +-2575370, -3033858, -806917, -2680597, 723702, -372052, 273267, 1888712, -488016, -1421634, +2289755, 525060, 1462973, 887448, 149787, -814970, 1134408, -248034, -254477, -47782, +-243203, 135828, -464393, 674847, 1453310, -1734630, 486405, -2051384, 328565, -971200, +17539572, -9206262, 6154688, 240518, 3033858, -4235375, -3319473, -1928977, 3813394, 4912906, +1043677, -2691334, -5099737, 2666638, 4848481, -947577, 1521492, -2593624, 5285494, 1960116, +-9936407, -3261491, 3195993, -577673, -4225174, -197569, 4517232, -3315178, 1531156, -6457484, +3766686, 8172786, -3385508, 8644695, 289373, -1571421, 5752572, -245887, 439697, 5209796, +-11250667, 1691680, 3404299, 4787278, 3228205, 3740380, -5052492, -3910031, -182536, 1795833, +-5471789, 1808718, 5305359, 4771709, 1759863, 14564234, -4594005, -1823751, -6599218, -2822867, +-4328790, -6059125, 7496866, 3132642, 7321846, -1144072, -11735461, 6830072, -4147865, 3754338, +3355443, 1640141, 2015950, -9260486, 10968273, 2398202, -5095442, -8886287, -5578626, -5566278, +770410, 4540854, -4147328, 347892, 2782602, 2385854, -4295, -1927367, 447213, -192737, +1723356, 1848447, 1975148, 1384053, 1302449, 686121, -3241090, -2897492, 131533, -1063541, +1047972, 1320703, -1511829, 2106682, -520228, 770410, 1730335, 753767, 1340567, 404264, +-3447248, -235686, -55835, 1215476, 882616, 419833, -788127, -923418, 1848447, -541166, +4517232, 784368, 1947231, -21022254, -17696876, -16316044, 3640522, 3351148, 1365800, 732292, +-1165010, -1270774, 436476, -2783139, -5920613, -4115653, -10364293, -4578435, -5031018, 6193880, +-7966628, -3526705, -4510253, 1336809, 90194, -2067490, 2323041, -692027, -8271570, -168041, +7588671, 980326, -7378754, -6522445, 2849711, -2638184, 6368900, 4478577, -6971806, 6881075, +10861972, -9107478, -9328669, -4989142, 3426310, 8635032, -6152541, -6361921, 3266860, -3673808, +671626, -818728, -792958, -9907416, 1891933, 5997385, -3080029, 3433826, -4926865, -5858336, +-5815923, -2878702, -10018548, 17157320, -3638374, -1158567, 2995740, 1866163, 3654480, 2336462, +5352603, 2443837, 4647155, 10619307, -13706851, 9590125, -3270081, -2606508, -471373, -15298137, +-700617, 4680978, 424128, 602906, 4274030, 1563905, -379568, 2543158, -5172215, 5987722, +-2165201, -3486440, 3250217, -2120640, -1913408, 612570, 2652679, -2047626, -3247532, 1104344, +2574833, 100932, -1103807, -2830920, -1556926, 390305, -4002910, -2674691, -1397475, 1908576, +-906238, 143345, 2109366, 35970, -3987877, -908386, -3396246, -3019899, -2849174, -1758789, +-3147674, 2664490, -941672, 175020, 5714454, -1140314, -1743757, -1546725, 3090229, 775242, +-1065152, -20672752, 15845208, 4198331, 3453691, -3827353, 15509127, -2441152, 7306813, -22012, +6573985, -9230958, 3652870, 3621731, 1411434, -4541391, 13804562, -3743064, 4206921, 3176665, +14326937, -9667435, -630823, 3986267, -2493766, -7093676, 4278861, -6672232, 1723356, 1828046, +-7838852, 3033858, 638876, 395137, 15756624, 9854802, -1323387, -6447820, -5043902, 3518652, +-842887, -9450002, 2677912, -830002, 2778844, 7118372, 10478110, -7197292, 7123204, 3570729, +-4730907, 3408057, 2736431, -7443715, -4034585, -4666482, 7498476, -8112657, -6898791, -18595598, +-13634911, 3778498, -2568391, -2674154, -7173133, -14428406, 5525476, 1112397, -436476, 7069516, +6009733, 8502425, 5037460, 2057826, -255014, 1360968, 9597641, -7096897, 13146895, -4836670, +-3740917, -12018392, 1906429, -2206003, -6138045, -1084479, 1453846, -3022583, 3491809, -1451162, +142271, -1477469, -488016, -1268626, -301185, 2173790, 3435974, 278636, 2835215, -3204583, +-2289218, -1623498, 1175210, 2475512, -3278671, -1228361, -1533840, 481573, -1834488, 1473711, +-340376, 1283122, 2164127, 36507, -3495030, 4930623, 4723927, 1974611, 21475, -2126546, +-145492, -1107028, -526134, 5576478, -24987582, 23119272, 16607565, -6772627, -5717675, 6243272, +56908, 569083, 11033771, 7809861, 321586, -1624035, 4444218, -2563022, -1595580, 3115462, +-4944044, 6213207, 4258460, -5159867, 6698002, -716723, 1807644, -483184, -11011222, -609885, +8018704, 8313983, 3263638, 3564823, 4458176, -5124970, -6487011, 2808909, 4997195, -202400, +-2501819, -5652177, 2355790, -1653026, 7083475, 8341900, -926102, 9615358, -4992900, 10715407, +5807333, 12913356, 937914, 1893007, -3709241, -5264556, -992674, 9913858, 16181826, 989990, +12336220, -5305359, -11818676, 1592896, 4474819, -10327786, 10785200, -3550864, 3819300, -22764400, +-9785546, -134218, -5462125, 4424890, 7544647, 15835544, 3309272, 134755, -7735773, -13731010, +3563212, 610422, -11522860, 4749160, 2513630, -8308078, -2349884, 2011655, 9135395, 228707, +2774012, 2813204, 4770098, 3925600, -7699266, 2771865, -118648, -1510218, 187368, -354872, +-1218697, 3308199, 3124589, -3191161, -1305670, -17717, 2237678, -1205275, 3183645, 500364, +2325725, 2084670, -2492155, 1924682, 2332167, 5980742, 564251, 3430605, 3747896, 951335, +4396436, 1619740, 2280091, 1038308, 577136, 1618129, 5162014, -2160369, -4706748, 1190780, +6153078, -9710384, 16675211, -7154879, 2004676, 12465069, 12899934, -952409, -7412040, -3974992, +-3930432, 956704, -9581535, -7600482, 8025684, 2017024, 5159867, 6288906, 7432441, -3322694, +4821638, -1821603, 5773510, 24049670, 5664525, -11592117, 11259257, 12931073, 563714, -2131915, +683437, -6395207, -8817031, -4613869, 13186086, 8857296, 7301982, 11216307, 2273648, -1930588, +-5155572, -14242648, 6601365, 7514582, 4171487, -2255932, -1763621, -4912906, 1981591, 11596949, +7990787, -13285944, 8777303, -11201275, 11810623, 2522220, 4421669, 5281199, -1976222, -6330782, +-1926830, 4755603, 20434380, -3252901, 10206990, -4538170, -9241159, 10851235, 9766756, 2479807, +2233920, 9840844, 3441343, 580894, -1122597, -6255083, -1930051, -9176734, 2947421, -7124277, +-3568044, 14483703, -767189, 395137, 286152, 6681896, -2183991, 1995012, 4420058, 6729140, +7271380, 6066642, 2374580, 3188476, 3323768, 6096169, -944356, -4862977, 6885907, 2739652, +3795677, 4185983, 174483, -482647, 428960, -3034395, 1890323, 6535867, 731755, 842350, +-1377074, -2422899, 5454072, 5873905, 1137093, 10409390, -1293859, 4494684, 7961259, 514322, +2208687, -1147293, -3051574, 826781, 1728188, 2889439, 5733245, 2508798, 4294968, 1604707, +1028645, 5980205, 8505109, -4292283, 8644159, 11042898, -12664785, 8529805, 4935991, -3061238, +789737, 5868536, -5299990, -11187853, 16806744, 3633006, 3218541, 3141232, 9976135, 2907693, +-10039486, 10726144, -14397267, -16819628, 1495722, 2024003, -9287867, -3044058, -27509266, -19477676, +-14668387, -4955856, -15090904, -7430831, 5724118, -13566191, 9520869, 8757438, -11049877, 14268418, +7611756, -2790655, -1435593, -7383049, 320512, -13184476, 28934658, 8461622, 4509179, -14441291, +3518115, -4458176, 19187766, -3858491, -499827, -17511118, 17137456, 1147830, 6711960, 5563057, +9994926, 5666136, -3880503, 5731097, -8534100, 8664023, -3132105, 5107253, -13661217, 30942018, +4720169, -14343043, 7785165, 9038759, 7063074, 10532870, 8986682, -13929116, 11109470, -272730, +8958765, -7045894, 2662880, -17923972, 7541426, 7819525, 2268817, -4298189, -13561359, -872415, +9283035, -12030740, -1643362, -1414655, -57982, 3690451, 2793339, -2704219, 5216238, -294205, +-2557116, 4133369, 3170760, -3757023, -3039226, -7852274, -492848, -7304129, 4394289, 1239635, +733903, 5767604, 8871255, 5638219, 4173635, 2834679, -3156264, -1219234, 91268, -5695664, +-4719632, -1293859, -1911797, 3106872, 7204271, 2294050, 4556961, -1016297, -89121, -22364432, +6277095, -3061238, -2173254, 13280576, -2439005, -2260764, 1292785, 11890617, -3091303, 6936372, +-5800354, -6841346, -8742406, -11087458, 19270444, 10047539, 6996502, -6048925, -17637284, -21648782, +10431939, 7185481, -7675107, 5163088, -5212480, 519154, 19181860, 8377871, -5424007, 10344429, +-3478924, 5369783, -6373732, 6493454, -14145475, -20809116, -8072928, -9280887, -1562831, 24359444, +-19810536, 11468100, 6605123, 4981089, -4363150, 9590662, 4300336, -19033148, -24193014, -8614094, +-11022497, 27420682, 19898584, -6637335, -12204150, -1016297, -12523588, -2648384, 19983410, 18487150, +10513006, -16302085, 3549791, -12734041, 20037096, 9504763, -2085744, 71404, 6767795, -11819213, +2690260, 17653390, 9622874, -15968152, 17384418, -8854612, 10404558, 27545236, 10553808, -6485938, +-8118025, 23574002, 2640331, -1436667, -10667088, 4153234, -5005248, 1516660, -3106872, -556735, +-652298, -11742441, 1529545, -1462973, -3298535, 5163088, -860604, -4154844, 799938, -2470143, +705985, -3066070, -4519380, 4067871, -5014911, -3245385, 2459406, 6127845, -247497, 4326643, +3629247, -817654, 42413, -5906654, 871342, 1996086, -4938139, 6703370, 3374771, -4095251, +-2679523, -2860448, -1205275, -6596533, 3968550, 6245420, 357556, -4913443, -2778844, 3241627, +-1351304, 3115462, 4481799, 313533, 1700807, -17768280, -6956774, 29768956, 13785771, 17157320, +4190814, -24723442, 7648263, -20057498, 13202193, 37205156, 13232257, 23345832, -10500121, 6746320, +10850161, -1112397, 2806224, -9535364, 2441689, 14636175, 782221, -3891777, -13196824, 7279433, +5466957, -13448616, 7032472, -5101348, 10312216, 14713484, 15645492, 18844170, 1906966, -14596446, +3968013, 8909373, -146566, 25653840, 2275259, -29464550, -18475876, 8398272, -7480223, -34775276, +1283658, 14839112, 5493800, 1567126, -3142842, 18335752, -14374182, -17838072, -3424700, -6379100, +-17351668, -952409, 1296006, -10108206, -14936286, -9150965, 763430, 2178085, -21585968, 6466610, +-8983461, 5267241, 24977382, -3395172, -8644159, 17398376, -2993592, 14487998, -13678934, 9360344, +644245, -15855409, -17683990, 31988916, 3147137, 4331475, 1551020, 46171, 32096828, 26208428, +8316668, -2398739, 12610561, -6145025, 4331475, 7508677, -1344325, 9863929, 4278861, 2885144, +-14561550, 8706972, 4709432, -803159, 1374926, -4927938, 4255776, 11331734, -1822140, -3654480, +-6227166, -6833830, 6859063, 8047695, 490700, 56371, -6130529, -6619619, 1246614, -9515500, +1416266, -3148211, 10063645, 3590593, 496069, -6277095, -10966125, -2479270, -5286031, -7397008, +4355634, 4482335, 8647917, 25170656, 3271691, -34470872, -15591805, 21391084, -30829812, 17522930, +-29176250, 2374043, -4658429, -42198052, -5558762, 18997714, 38841536, 12372727, -5640366, 9431748, +-14894410, -4993437, -33880312, -1883343, -23010824, -3313031, -5036386, -15904264, -16874390, -5603859, +9701794, -15285252, 10537165, 19398756, -19989314, 7249368, 6458557, 3433826, -21272974, -3248069, +-217970, -22286586, 5814849, 28389196, -2152852, -41213968, 14599668, -24893094, -63546724, 17922362, +-26278758, -32682554, 1744294, -14965814, 4539781, 11235098, -6259378, 16734803, -13984414, 14618458, +-11537893, -28440736, 170725, 20351166, 19514184, -36956584, 5441187, -4420058, -27507654, -7358353, +-6812355, 47873852, 23905252, 28083180, 12799003, 12213813, 29631516, 42561516, -9711995, -20164872, +-22000434, 3863860, -27334246, -8411157, 14157286, 22992570, 3235184, 2088428, 19967840, -4621922, +-11324755, -15411416, 12031814, 13643500, 13406740, 3129958, 15379204, 6376953, -9426916, -2094333, +-9130564, 14024679, 2268280, -1639604, -15726023, 4772246, 12607876, 1384053, 241055, 12316356, +-9827959, -6575595, 6819335, 695248, -4958540, -9468255, -3020973, 14492830, -697932, -32087700, +-2977486, -793495, -7348689, -6256694, -8472360, -5194763, 6998649, 6258304, 3729105, 2221572, +-5268851, -6656663, 55716464, 60232084, -35359392, -14008573, 26891328, -12200391, 10846940, -16780438, +5019206, -17241072, -32293860, 44000868, 6415071, 13817984, 11316165, 4120484, 5779416, 1322313, +8916352, 10933376, -31249108, -25761750, -22570590, -21308406, -15963320, -10060424, -8339216, -16753057, +-9491878, -14198088, 16145319, 12277164, 6207839, -7823820, 3280281, -33063196, -16612934, 8994735, +-30048664, -2777233, 14625437, 25942140, 3802120, 5028333, -11098195, -19403052, -22886806, 18387292, +-2488397, 18204218, -64170568, 4009352, -7460895, 7389491, 39237748, 4820564, 6549289, 4429185, +-11492796, -13215077, 361314, -2607045, -36026184, 7733089, -13212393, 32319628, 2156611, -35403416, +-48195440, -29943976, -6083821, -33843804, -33143188, -20561620, 23378044, -6052146, -22824530, -30775588, +25724170, -3305514, 15222975, -17313014, 9342091, 25365004, -16840030, -24417426, -10255845, -12605729, +26527328, 5595269, -11629161, 10457172, 7784628, 23088670, 14328548, 6725919, -20495584, -20424180, +-4488778, 2403571, -5360656, 3705483, 14220637, -3098282, -1189706, -10363219, -7597261, -5645198, +-10787347, -2019708, 4441533, 6542846, 33530810, 2261300, -8395050, -2640331, 4496831, 10507637, +-594316, 16623134, 6971269, 38341708, 5950677, -252866, 1417876, 7049115, -10610180, -16483011, +62755376, -36376224, 23831700, 44472776, -21304112, 6334540, 35544612, -44917304, 1833414, 5098663, +21923124, -50377820, 2849174, 3462818, 16632798, -21945672, 328565, 9104794, -29617558, 4484483, +-2202245, -5475547, 16387985, -4837207, -4423280, 6974490, -3834332, -4976794, 16079284, -14900852, +4475893, -6098317, 4153770, -9520869, -5254893, -11627550, 230854, 2348810, 31419296, 10496900, +15304579, -3097208, 426276, 23312008, -910533, -8718247, 13108240, 9679246, -10397579, -30348776, +27960238, -30246770, 5044976, 14632954, 19199578, -29764660, 31967442, 51311976, -27921046, -51991652, +69785168, 24716464, -34323768, 16000901, -33036888, -41052372, -20412368, -7434589, -42874512, 34879968, +-59804736, 18083422, 28701118, -23690502, -79981952, 75848584, -13065827, -19437948, 50596864, -50227496, +26120380, 43182676, -12802224, -11724187, 13499619, 14897094, -7964480, 5434744, 4543002, 13758928, +-6613176, -4867809, 15416785, 63351, 3557307, -1519345, 3004867, 12329777, 9183177, -1559073, +-10780368, 18023294, 19523310, -3565897, -16517907, -1666984, 8362838, 1881196, 12092480, 161598, +10603737, 4533338, 15483894, 11436424, 13037373, -19016504, 5084705, -265751, 951872, 178778, +-11491185, -20550344, 30412664, -4776541, -27759984, 10264435, 6976101, 3023657, -4403415, -19206556, +-15238544, 34819300, -23038742, -18430242, -36750424, -16944720, 21767968, 16884054, -9840307, -12259984, +11571179, 28875602, -12477954, 21772800, 26074210, -18585934, -2714419, 15911780, -4185446, -143881, +-5330592, 1328756, -26742076, 7245610, -5974300, 834834, 6373195, -5437429, 5450314, -11144903, +-22409528, -10647224, -38976828, 4799626, -141734, -5875516, 7162932, 3641059, -2593624, -8938901, +15588584, 24654186, -26035554, 37918656, -4339528, 5006322, 5448703, 33512020, 15352897, 24506010, +-30888868, -7709467, -5838471, 43707736, -40900436, -14015552, 19913616, -1532767, -47222092, 3136400, +-9784472, -8124468, 21481278, 23544474, 1604707, -17770428, 38060928, -16111496, 63508072, 785979, +-29541858, -92879, -5171678, -33420214, 63807644, 12782896, -9574019, -75647256, -37828460, 21251498, +-27875948, -25092810, 29556892, -110861160, 2748242, 21796422, 15988553, -9004936, 31120796, -19107236, +-2517388, 110059, 16189879, -4645544, 3274376, 22053584, -1583232, -5598490, -7030325, -7972533, +-390305, 2451890, -1510218, -3366718, 14232985, -20003274, -4518843, 2359011, 3299072, -11986717, +-20281910, -5166846, -6248104, -2909840, -1717450, 3911105, -22491134, 1719598, 17011828, -10619844, +13004624, 9985799, -9811316, 611496, -7185481, 2839510, 4777078, -10466835, 29417842, -14281840, +-13191992, -17027398, 14239427, 19317152, 11791833, 48008072, -9225053, 10887742, -4577899, -24752970, +12429098, -15771657, -8877697, 9910637, 21544092, -22691922, 24821152, 2863670, -1233729, 50586660, +-10255308, -5608154, 37924560, -24225764, 33504504, 14461692, -7919920, 13366475, 14124000, 31253404, +32502702, 9447317, -26357140, 55205364, -55356224, 1873680, 50407348, -27116276, 11178189, -5975910, +-6510634, -58372364, 39660800, 10490994, 17617418, 18596134, -12108587, -29055990, -21831318, -17705466, +2784213, 55472188, 394063, 43509628, -14455786, -33483566, 1859721, 12512850, -27485106, 44647796, +18178450, 21940840, 44110388, 28552942, -47160888, 17997524, -67653784, -83598856, 1767379, 70399344, +44163540, 5696737, -49787796, -177893792, -32693828, 55009404, 62872416, 89085672, -4512937, -112974816, +-63712620, -58852864, 90339808, 69042672, -12451647, -45145476, -26402238, -54900956, -6994354, 70731136, +-6849936, 16546362, 11826192, -11598022, -25608742, 38548944, -15628849, 21506512, 15781857, -1462436, +-35782984, 49090404, -19342386, -9268539, 14230300, 12738336, -26553098, 443455, -8309688, -10023917, +3403225, -954557, 19676318, -35107064, 18625662, -42251740, -6657200, -7043747, 50258096, 1497333, +13655849, -30659088, 16056198, -11526082, 22226992, 26558468, -12816182, -30494268, 11018202, 7902740, +25736518, 7217156, -43612172, 36628016, -27421218, -4743792, -17755932, 17024176, -19945828, -848793, +-2097555, -5411122, 4093104, 18756660, -19812148, 8717710, 1555315, -4587025, 276489, 13226889, +-16747688, -4581657, -2454574, 27471148, -27819576, 7377680, -12191802, 18203682, -20310364, -5778342, +6964827, -3934727, 3856344, -13140452, -2323577, 11880416, -3608310, 4589173, 3770981, 2484639, +14865419, -13771813, 9328669, 10715943, 13272523, -1866163, -30778272, 3940096, 3666828, 12534325, +11463805, -2248416, 3083787, -5194763, -13982266, -2392834, 6432788, -2649995, 18716394, -15235323, +-5020280, -30389578, 9091372, 3267933, -4769561, 6771016, 5950141, -455267, -15666430, 4870493, +15355045, -3005940, -2209224, 6003291, -6159520, 11424613, -7034083, 1918777, -14374182, 6789270, +2755222, -2319819, -3909494, 8311299, -3956739, -6083285, -8650064, 9041443, -327491, -4592931, +-1901597, 8994198, -3528853, 3951907, -4960151, -3061238, -421444, 278099, -41339, -5017596, +599685, 103616, -4126927, 4225174, -3911105, 11749957, 1938641, 1525250, -16278463, 4555350, +-256624, -6583111, 7480760, 13791677, -9964324, -2326262, -300111, -7292855, 11069204, -1895154, +1660005, -7314866, 3884798, -1623498, 1449552, -4704063, -24839406, 60313152, 16461536, 14921790, +-7944079, -19275814, -18538690, 5295158, 11735998, 1869921, -656056, -41876, -8774081, -1581085, +4267587, -2313914, 1858110, -922881, -8786966, -440234, 4407710, 6904160, -6102612, 1708323, +4451197, -8776766, 14472429, -8746701, -7604240, -7581154, 2015413, 4234301, 6739341, -7294465, +9386651, -13447006, 8965207, 7967165, -5879810, -600759, -381178, -1536525, 7000260, -7474854, +2232309, -2383170, -9634685, 13732084, -7616051, -250719, -5628018, -1768453, 9619653, -12481175, +5137855, 3469260, -5399848, 4594005, -10599442, 3096672, 4489852, -7911330, 248571, 4256850, +-7262253, 7353521, -10046465, 2806761, 10418517, -15159624, 4425427, -5793374, 1110249, 5954436, +-4461934, -2321430, 1138166, 1294396, -838056, 4253092, -3168075, -2799782, 2149094, -2504503, +1435056, -970663, 1865090, 1670205, -2371896, 1215476, -386010, 2189897, -1940252, -584116, +1568200, 30602, -1083942, -3543348, 2317672, 2316598, -438624, -2458869, 2414309, -144418, +-1001801, 2366527, -4924180, -1049046, 2935610, -3650722, 5364414, -3260954, 348966, 8699993, +-2436320, 6255620, -3470871, -389231, 7056095, -4911295, 9025874, -46599860, -109318192, 30926986, +106989784, 73576544, 116342072, -64791728, -68966440, -94036696, -108853800, 2326262, 83965536, 86750288, +90569584, 17772038, -29945586, -59407988, -85263688, -72267656, 5616207, 56120728, 66568236, 59896540, +14321568, -16564615, -10351945, -46788300, -52334176, -22083112, -1438814, 20115480, 44105556, 21540872, +15989626, 22088480, -11049340, -26251914, -4311611, -41962904, -19695646, 451508, 6643778, 31963146, +37214280, 3293166, -5657546, -3507915, -27490476, -7454453, -402116, -5727339, 9493488, 18386218, +-3941169, -1470489, -7239168, -11498701, 2338073, 1123671, -1272921, 20746840, 14033806, 5180268, +-548145, -19588808, -28324236, -22395570, 1596654, 21053930, 18065706, 23721642, 3208878, 604517, +5378373, -29469382, -16785806, -13864691, -2538326, 22588844, 5091684, 7569880, 21066278, -12182675, +-17724256, -4134980, -3042448, 6523519, 7582228, 2364380, 4224637, 1845225, -10887742, -11274826, +-2765422, -16643, 8079907, 11706470, 3827353, -1668595, -2562485, -3347927, 2918430, -3301756, +-13837848, -2182380, 3242164, 6392522, 13745506, 3339874, -2869575, -6624987, -11331197, -2486786, +1126355, 3678103, 6459094, 8076686, 6357089, -3274913, -9817758, -10344429, -9030706, -1043140, +4477504, 4962298, 13284871, 13642427, 6645388, -2953327, -16789028, -17755394, -8233453, -6224482, +6267968, 16568373, 12277701, 5311264, 70867, -1313723, -2155000, -5058398, -8322573, -7997766, +-3400540, 1205812, 3506841, 5606006, 8131984, 7780870, 3052648, -2842195, -6265284, -6518687, +-4183835, -918049, 641024, 546535, 176631, 75699, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -4398047, --2920041, 1234803, -1123671, -1386201, -2139968, 525597, 4264366, -1364189, 21475, 438624, -7299834, -140660, 1401233, -2997887, -2079838, -742493, -1958505, -2107218, -1975148, -1343251, --1876364, -2482491, 2096481, 3469797, -1898912, 529892, 147640, -3933116, 118112, -85362, --2785286, 5270462, -2684892, 2997350, 1149978, -806917, -3015604, -2792266, 2718178, -1409286, --1012539, -4161823, -1052267, -386010, -1955284, 5557151, -1205275, -349503, 2331094, -405338, --4621922, -2379412, -4073240, -2742337, 6344204, -1781338, 7054484, -30065, -282394, -1278827, -830002, 294742, -4179540, -4466766, 3262028, 368830, 2221035, -301185, 2585034, 1578937, --4049081, -28454, 1362578, 2187749, 4832, 1846299, 3376918, -4488778, 1195075, 1152125, --2234457, -2684, 1031866, 3218004, 2132451, -2246268, -667331, -124017, 765578, 1022202, -791885, 840740, -577136, 435939, -1209033, -784368, -5906, 1637993, 733903, -50466, --105227, -1113470, 665720, -86973, -367220, -96637, 594316, 244276, 430570, 1055488, --338229, 463320, 1284732, 9656697, -723702, -1136019, -2439005, -5237713, -6467684, -5915244, -690416, 5323612, 1881733, 7098507, 2458332, -3182034, 883153, -8390219, -7101729, 3339874, --2477123, 4693326, -409633, -3714073, -1836099, 9294309, 2096481, 3944928, -151398, 3026878, --1355599, -1112397, 1861868, -1250909, -4021163, -272194, 1508607, -445603, -216359, 5921686, -3673271, -6310918, 171262, -3993783, 6704981, 3975529, 305480, -2346126, -2413235, 3099893, -1740536, 5010616, -4602058, 7938174, 9732933, -2647311, 9483825, 13422, 4982699, 3107946, --1722819, 1665911, 7606387, -860067, -5089536, 4407710, 1439888, -29528, -562641, -873489, -350577, 4450660, -2816425, 1634235, 1212255, 2369211, -3641596, 4197257, 991601, -341450, -1344862, 633508, 430570, -150861, 967978, 2477659, -1704028, 1014686, 675384, 1057099, --1553704, 137439, -2508261, 466004, 1213865, -1438814, -912144, 361314, 722628, 848793, -252866, 774705, 21475, 37044, -8361765, -6541235, 2030983, -3710315, 2615098, -4632122, --6577206, -6075768, 823560, -4541928, 4122095, 3024194, -5840619, -1210107, 2345589, 543850, -2889439, -1726040, 2989834, 3702262, -5188321, 1643362, 1676648, -4156455, 2413772, 418759, --4917738, 3626026, 3479461, -1746441, 3803731, 543850, 3099356, 2824478, 1156957, -1844689, --483721, -5871221, -1795833, -2920041, 3062312, 3250753, 1256278, -9402757, 1767916, 3960497, --2153389, 6608881, -5433671, -7170985, 517544, -2127620, 2263985, -5119064, 9306120, -490163, --3154654, 915365, 85899, 5317707, -334471, -3099356, -238371, -2103460, -2901787, -3630321, -1675037, -6563784, 640487, 242666, 1893544, 4391067, 1408212, 3125663, 4800700, -3304441, --620623, 1084479, -4175782, 2831457, -1449015, 2413772, 1882806, -1277753, -1018444, 3551938, --1192390, -3229816, 416612, -338766, -163746, -1740536, 2539400, -1987496, 937914, 972273, -1271310, -510027, -584116, 161598, -1039919, 393526, -728534, 67646, -471373, -969589, -1215476, -490700, 226560, -169114, 28454, 22549, 175020, -20105816, -448824, -2561411, -13957570, 186831, 727460, 2881386, -2086280, 6970195, 1625645, -7705708, -4203163, -9019431, -1454383, -747861, -3180423, -2699924, -3386045, -2203318, 10827613, -5166309, -2617246, -2980707, --8476118, -483721, -2179159, 2722473, 4013110, -1483911, -186294, 2311229, -2690260, -826781, --1220308, -3151969, 3215857, 6620692, -941135, -1246077, 5203353, -7190849, 4452808, -5767604, --11507291, -7336341, -11461657, -1853278, -6593312, -4466766, 1058173, 4393752, 2159295, 3104725, --1804423, 3793530, -4945655, -1210107, 3973382, -139050, 5569499, -2500745, 1625645, -4117800, --3151969, 2845416, -7053410, 1737851, 5069135, -6864969, 577136, -1903207, -3250753, -4541928, --4109210, -1438814, -1869385, 955093, 4738423, -2455648, 1413581, -4173635, -4449586, -3519726, -1551020, 2206540, 513785, -1177895, -1362578, -1928440, 911070, -1650878, -1458141, -729608, --1359894, -265214, 151934, -2308008, -603980, -367220, -1759326, -536334, -834834, -95026, --373125, -3114388, 286152, 1165547, -654983, -1287417, -204548, 1767916, 884763, -832150, -12785581, 69256, -7154342, -6878927, -2365990, -5022965, -1941862, -3782256, 967441, 600759, --5657009, -3342022, -6211597, 11737072, 4978404, 1064078, -673773, 6354404, -9521942, -172872, --206695, -6036577, -8011188, 7143068, 142808, 5088463, -8033737, -3540664, -2798708, 2763812, --284542, 3403225, -5538361, 1644973, 2273112, -6027987, -5763846, -5250598, 1256815, -1752347, --1605244, 5032628, -1473711, 525597, 106837, -1037235, -5711770, -3529390, -641561, -8645232, --5603859, -4574140, 2417530, 1606855, 3464965, -892816, 1532230, -140123, -852551, 3960497, --3078418, 6931004, 1011465, 2065342, -884763, -2352032, 2813741, 2108292, 5549635, -1714229, -904628, 3313031, -1945083, 15032, -7233799, 3374771, -5556077, 3495567, -4092567, -4087198, --7797513, -1589675, 2044941, 802085, -1266479, 1769527, 853625, 3526705, 647466, -1152125, -3205656, 1653562, -2728378, 620623, -2203855, 2403034, -925565, 351650, -548682, -352187, --1928440, -142808, 192200, 309238, -1094143, 865973, -1600949, 591095, -220654, -914828, --1403917, 313533, -911607, 2040110, 690953, -642635, -832687, -934692, 1744831, 1017370, -1675574, 76773, 279173, 735513, 15052787, 14245870, 10618233, -3677566, 3850438, 5340255, -3110093, 2985002, -5374078, -4704063, -7014756, 6121402, -6586333, -872952, -4808753, 8142185, --9176734, -6876780, -3460133, -1545651, -5083631, -7620346, 2086817, 318901, 374736, -9225053, --5107253, 2308545, 1849520, 2514703, -2547989, -3717294, 219580, 2666638, 3445638, -2660732, -3273302, -4942434, -1358820, -11973295, 4286378, 1341104, -2117956, -2344515, -8836895, -4097936, -1031329, -2221035, -12383464, 6547141, 2667175, -112743, -3400004, -2684355, -5284421, 1489817, --1925756, 3442953, -853088, -1875290, -7079717, -1462973, -782758, -3968550, 7606387, -5688684, -21475, 4449586, -2001455, -6146098, -3475166, 5068062, 7429757, 3594888, -661425, -345208, -3889630, -8227010, 3213709, -983548, -482647, 249108, 1656784, -594853, -427886, 275952, --1676111, -5025112, -1413044, -1629403, 1400159, 907849, 474057, -2032593, -1088237, -2327872, --2791192, -812823, -196495, 3087545, 212064, 296353, 304943, -1271310, -749472, 1339493, --1792075, -412854, 486942, 780073, -2122251, -126702, -275952, 1038845, -1552631, -502511, --955630, -1570884, -3211562, -1589138, -249645, -1515587, -96100, -1611, -250182, -1883880, -18321256, 6164352, -2642479, -2105071, 6453725, -12330851, -2294586, 10035191, 5050882, -6950331, --120796, -4708358, 1967632, 7721278, 18940268, 6263673, 14761266, -5194763, -1056562, -14305999, -4901632, -4160213, 4073777, -6256157, -288837, 622770, -2190970, 5159867, -2260764, 2471754, -6374805, -4836133, 2902324, 8097624, -2157684, 2716030, 56908, 3260417, 4476430, 4559645, --24256364, 8895951, -2758980, -11376295, -1938104, 6955700, 2178622, -8789114, 4796942, 6933688, --14260902, 1150514, -3986267, 8422431, 1978906, 6956237, -1644436, -5012227, -9995463, 612570, --6022618, 18971944, 3565360, -3125126, 6385006, 788663, 6180995, -14942191, -1905355, 2293513, -4690105, 1087164, -6923488, -1115081, 2615635, 6629282, 5671505, -4651450, 188979, 6519224, --220117, 3058554, -2214056, -1146219, 4650376, 423054, -291521, -650151, 297427, 2221572, --2097555, -985695, -208843, 1717987, 1761474, -252866, -535260, 4488778, -1371168, -808528, --2316061, 280247, 1295470, -1223529, 152471, 1352378, 1914482, -1653026, -666794, -2720862, -268435, 2074469, -945967, 347892, 1049046, 1050120, 3714073, 416612, 1854889, -164819, --1512365, 2323577, 653909, -21703006, -23802172, -8147016, -1851131, 441845, 5066451, -10164577, -3216394, 11990475, -6868727, 6383395, 8308078, -5780489, 188442, -2814814, 10160282, 14158360, --6770479, -7991861, 7131793, 685584, -6784438, 3218541, 127238, 1774895, 2039036, -3634616, --2632815, -15128485, -762357, -4327717, -331786, -448824, 10302553, 3052648, -18445810, 308701, -8921184, -10099079, 2677375, 10859288, -2369748, 3821984, 239981, -2850785, -6996502, 13960791, -11770358, -8936753, 4699768, -3324842, -441845, 4343823, -3078418, 3642669, -5506685, -632434, -11818139, -3352759, 2518462, 5568962, -4004520, -9697499, -391379, 3326989, 1746978, -4661650, -640487, 2611340, 4220342, 8623221, 5363878, 9489193, 5042829, 1831804, 4440996, -1560684, -8587787, -282931, -6737193, -9110163, 1146219, 2954401, -1566589, 6806987, -3491809, -3680787, -2734821, -861678, 756988, 342524, -4183298, -592169, -2509872, 3092377, 1416802, 2485712, -4887673, 601832, -1692754, -7054484, -514859, 1631551, -1773285, -733366, 739271, -1575179, -1533840, 1561221, 228707, -1668058, -1155883, 3444564, -459025, 1613834, 886374, 1110249, --2443837, -2627983, -1516660, 594316, 1218697, 2058363, 1563368, 1003412, 994822, 2588255, --648003, -23369454, 26096758, -1501628, 16796006, 1293322, -9721658, -2904472, -5622649, -6821482, --871878, 479963, 12157442, -1906966, 8361228, -8376260, -419833, 2087354, 1950989, 972273, -10574209, 10536629, 3875134, 1697586, -1296006, -2025614, -569083, -1726577, -17533668, -5963025, -8135742, 5260261, -1918240, 924492, -8274255, 4242891, -10154913, 2266132, 16248398, 1798518, -3564286, -13437879, 7245073, 6318434, 1779727, -9001178, -3904662, -4173635, 793495, -8074539, -8349954, 10179072, 6174016, -851477, 15247671, 5434744, 22291418, 8739185, -5883569, 18574122, -482647, -6700686, 13474923, -2128693, 4495220, 8508330, -6031208, -5164698, 12474196, 13392782, -7949985, -10755135, 4184372, -42950, -4920422, -8821326, 6671158, 11862700, 7211787, 17196512, -2445984, -3710852, -3732864, -10492068, -3915400, 6609955, 1112397, -1866163, 514859, -6518687, --4515085, 992674, 1789391, -150861, 7192997, 5672041, 2593624, 299037, 2186675, 3432753, -1846299, -3212099, -1212255, 1037235, -634581, -1056025, 3108483, 343061, -715112, 2475512, -1046898, 843961, 1076426, -2094870, 689879, 6278169, -2669322, 3985730, 1968706, 239444, --2642479, -3026878, -1433982, 5740224, -12565464, 16683264, -4832912, -10983842, 3663607, 7245610, --7286949, -3707094, -15379204, 6420439, -5641977, -1874753, -14096620, -6215355, -4783520, -2433099, --6357089, 3301756, -2853469, -3496104, 3314641, 4631049, 8207146, 8016557, -3478387, -2934537, --11355357, 4447976, 220117, 7446937, 2055679, 1973538, -2571075, 2961380, -7095823, -6045167, -3345243, 1670742, 3396246, -13887240, 4641786, 9026948, -25233, -12237972, -12735115, -9967008, --29372208, 4113505, -3377992, 14178224, -6952479, 11770895, 3800509, 760746, 15241228, 2274722, --1748589, 10899553, 4064650, -14977088, -7407745, 1733556, -4747550, -8525510, -5138929, 19191524, -8868571, -9113384, -1083406, -5143760, -2470143, 2756832, 13611288, 190052, -3628711, 17923972, --6423124, -16394427, -15563888, -18546742, -3260954, 1354525, -459562, -3313567, -2237141, -7966628, --1528472, 2251637, -2425583, -2402497, 1589138, 1450088, -11595338, -4842576, -9073655, 370978, --3053722, -3012920, -4841502, -1589138, 1336272, 6995428, 107374, 8593693, 4295504, 6294812, -710817, 2931315, -2932389, 5734318, 1074, -4234301, -6190659, 3527242, 607201, 1925756, --1590749, 1081258, -1923609, 1945620, -667331, 2318209, -460098, -1076426, 1572495, -382252, -7329362, -12034498, -2995203, -3197603, -1542430, -802622, 32114544, 5288179, 11767674, -5654862, -10283225, 20702280, -17671106, 26883810, 15961172, -7150047, 285615, 1660005, -9608916, -16163036, -1161252, -9359271, -14401562, -6447820, 1333051, 51540, -1726040, -6468758, -1035624, -6298033, --388158, -7286412, -480499, 5034776, -11301133, 6262599, 9618579, -7421167, -6862821, 4958540, -3787624, -626528, 28858422, 2563022, 19258096, -13780403, -1277753, -16713865, -12222940, 2980171, --12258374, -16897476, -11216307, -12829604, -2737505, -3402688, -14203457, -15488726, 20304994, 3196530, -1341640, -2724083, 10553808, 5838471, 12716861, -1236414, 12025372, -6665789, 2797634, -22345642, -18345416, 8851391, 1511292, -12265353, -849330, 5563057, 1242319, 2153926, 9105331, 12606266, --9672266, -12521440, -8171176, -1946694, -126165, 1387274, -7281580, 855772, 2195265, 5203353, -6830609, -838056, -4080756, 7043747, 3560528, -5231807, -271120, 2553895, -3044595, -5530308, -1094143, -1866700, -1733019, -155156, -2336462, 6458020, -6701760, 3754338, -96100, 7142531, --7345468, -1792075, 1352378, -1874216, -2734284, -1181653, -5797669, -6472516, -1122060, 696858, -2022393, 2370822, -4295504, 4483409, 3487514, -2636573, 4103841, -766115, 2407329, 217433, -2386391, -1780801, 15586973, -6415608, -5237713, 17405892, -14721537, -11235634, -2782602, -8945880, --1461900, -17523466, 3882114, -10805601, 8221641, 1123671, 2777233, 9952513, 2833068, 7011534, -9651328, 9157407, 7556995, 12848395, 1489280, 8719320, 7814156, -9453760, 16237661, 3941706, -7482907, -8830453, 12661564, 5679021, 8877697, 2211371, 3138011, -1698123, -11764989, 2932389, -6580427, 7762080, 8487929, 1783485, -14299020, -9065602, 10203769, 5523328, 2283849, -5472325, -7047505, -5238250, -14333380, 20914344, 12757127, 9304510, -8121783, -4031901, -10691784, -33219962, --1055488, -4691715, 4229469, -7809325, -8377871, -14687714, 2533494, 4624069, 18505404, -14703284, -5883569, 204548, 8491687, -12955769, -15869367, -9703942, 10166724, 3047816, 3145527, 5361730, --4392678, 1741072, 11926587, 4190814, 6015639, 7574175, -3104188, -2856690, -5071283, 51540, -5185100, 6413997, 193810, 2615635, 1260573, 978179, 4869956, -3117610, -2662880, -4367982, --2461553, -4518843, -186294, -6825240, -2771328, -7212324, -448287, -4371740, -1282048, -1061394, --2522757, 1972464, -1833414, -9245991, -1422708, 3587908, 3957276, 7470559, -1181116, -4573067, -2088965, -1856500, -6730751, 6067178, 5147519, 4913980, 11615202, 7558069, -705985, -26699128, -15480136, 16469052, -8049843, 14057965, 4898947, -22501870, -3898220, 29790966, -4128001, -19658066, --2989834, -1802276, -17064978, 12115029, 2597382, -8557722, 13054016, 8694088, 30728344, 18050136, -580894, 2354716, 28998008, -7308424, 7420093, -11700565, -16878684, -4962298, -11430519, 2704219, --731218, 5928666, -769873, -1967095, -4773320, 22879828, 1220308, -17839684, -14121316, -3135326, --3573950, -533650, 7556995, 20892868, 13407277, 4500589, -12489765, 16276852, 29673930, -6140193, -13550085, 12670154, 35733592, 6882685, 6921877, 10878615, 15310485, 8526047, -12084427, -11639898, -8333311, -21716966, -13006235, -15531675, 14980846, 13095892, 9218074, -3433290, 11085847, 22962506, --12882218, 18314814, 18274548, -2321967, 17968532, -16631187, -7235946, -5724655, 37480568, -18101676, -18505940, 11591580, 6924024, 5336497, -16348793, -1514513, -12817256, 14071387, 13430363, -85899, -1161789, -6542846, 10093173, -3754875, 1181653, 3860102, 4256313, 97174, 6242735, -4042101, --2040646, -1533303, -3944928, 2013266, 3857418, -2951180, 1881733, 4421669, 7785702, 1291711, --6753299, 3087008, -7335268, 1484985, 7048042, 4577362, 7445863, -1118839, 11867532, -4476967, -8827232, -2120640, -2542084, -1398549, 730144, 9511205, -6568616, 4634270, 53687, 4693326, --5294084, 1590749, 2522757, -2408403, 12593918, 5956583, 20477868, 36502928, 3943854, -3748433, -3893925, -1930588, -5972152, 1112933, 3846143, -8878234, -11830487, 4058207, -6122476, -3333432, -9337796, -432718, 18304076, -9576703, 17948132, 8825621, 1814624, -10359998, 3437048, 17884244, -5229123, -9037685, 3592740, -2126009, 571768, 10518375, -14456323, -7652558, 16287590, 376883, --3928285, 14111115, -614717, 5014911, 3284576, -13441637, -24474334, -5168457, 8611946, 15775952, -3498788, -12047920, 15819975, -5117454, 31994822, -16115254, 21566104, -12505871, 7789460, 18440978, --27084064, -28075664, -72478, -7922067, 7386270, 8999030, 1418950, -4103841, -16499117, 11245298, --2273648, 19990926, 9160628, 18616536, 5215701, 10848551, -4384625, 14299020, 5308043, -8508867, -1893544, -217970, -40955196, -1193464, 7402376, 9970230, 17560510, 14766098, -4631049, 1258425, --2877091, 2774012, 170725, -4558571, -10716480, 4748087, -6172942, 14270029, 1873143, 2791192, -7202660, 4155381, -4285304, 4121021, 10540387, 9066139, -2876018, -1638530, 1698123, -2189360, --1274532, -6445672, -944356, -13508209, -1651952, 4634807, -11038603, 7819525, -8270497, -6905234, -2263448, -7023882, 7395397, 2772402, -2437394, 4662724, -284542, -777389, 3256122, 9916006, --6630893, 1539209, 1758252, 23791434, 30776662, -6739341, -1206349, 10842108, 40719512, 1120450, --24107652, -9663676, 4888747, 4611185, -7628936, 7762617, -5512054, 12597139, -20443508, 1047435, -12721156, -8560407, -9225053, 1748589, -20204600, -6254546, -6584185, -32190244, -27158688, -15768972, -11850889, 13915157, -2447595, -22921166, 2576444, 776315, -808528, 4549444, -11489574, 27436788, --7840463, 3460133, 30444338, -26687854, 12853227, 4464619, -9290551, 11028402, -7195144, -21649856, -454193, 18648212, -8357470, -13619341, 7793218, 2474975, 17830556, 89657, -27464168, 2153389, --16233366, 27020176, -9810242, 4045859, 6664179, 3198140, -3878356, -17620104, 7347079, 18382996, -5364951, 18967650, -27843736, -15384036, -4580046, -301185, 3010235, -21547850, 19260780, -2698313, --20477868, -6889128, 12971338, 12004970, -11334419, -15812459, 15575699, -12599287, -7844758, -345745, --1912871, -1770600, -1000727, -4642860, -852551, 7754027, -1755568, 7121056, -8203925, 5647345, -7517804, -2070174, 4072166, 1166084, -1493575, 44560, 1048509, 13314399, 733366, -2610266, -1176284, 2920041, -6637335, 2343442, -8496519, -727997, 9922448, -3595425, -7731478, -2922188, -4478577, 103079, 377957, 5789616, 520228, -7834557, -3994857, 14157286, 10429254, -3458523, --546535, -21110302, 31081604, 905164, -53181896, 21330956, -7292855, 4165582, 5448703, 7162395, -13080323, 4780299, -9612137, -2308008, 13172665, 8911520, -10543608, -547071, -8361228, -4327717, --26111254, -3316789, 12597676, 15636902, 3531537, -6181532, 17322676, -17805860, 19735374, -11341935, --6359773, 2366527, -6096706, 5272609, -15706159, -21216602, -23740968, -7590281, 12326019, -4737349, -141734, 14486388, 4040491, 2543158, -432718, 505732, -4983236, 208306, 15618649, 9614821, -16481400, 13972602, 16534550, 11248519, -9795747, -6250251, 4079145, -1040993, -18952616, 12769475, --3411278, -17918604, 22527640, -245350, 3681324, -618475, -8162586, -2695092, 9474698, 13697188, -11412265, 353798, 6999186, -22958748, -3237332, -8180839, 12520367, 4315369, -6375342, -7304129, -28942174, -8815957, -9880572, -3135326, 4689568, -7162932, -19028852, -1080721, -3237332, -10303627, -17886928, 3635690, 6750615, -5499169, -927176, 4146791, 1102196, 5238787, 5694590, -1872606, -3504693, -3457449, 3968550, 1478006, -3126199, -2415919, 2949032, 4082367, 1151051, -3660923, --2978023, -3296924, -2374043, 49929, 2079838, -2996277, -3545496, 810675, -244276, -687732, -3141769, -1500017, 4954782, 1439351, 14432164, -1272921, -1759326, -3232500, -6194417, -8096550, -72334768, -71203576, -3646964, -77408192, -12050604, -29493004, -3663070, 18780282, -9669582, -21496312, -33653752, -9224516, -5961415, 1017907, 10315438, -1306744, 27955942, 18461916, 11042898, -16656420, -1018981, -11397233, -11573863, -7786239, 332323, -3640522, -3185792, -9455907, -2170032, 15392089, -1819992, 10149008, 10152229, -934692, 13581760, 19811610, 977105, -4195110, -10490458, -12533788, -4871567, 5326833, -10399190, 16770237, -22409528, -22688702, 2391223, -8016020, 11973832, -21044266, -8832600, -40361956, -21551072, -32335198, -2899103, -16019154, -1548873, -9822590, -12213276, -10646150, --1072668, 2614025, -31589484, 3474629, -7005629, 3499325, 31139, -14664092, -25720948, 17597554, --15523622, -2859911, 15730318, -1713692, -5083094, 10376641, 13019656, -2814814, 12969191, 8463770, -15695958, 8618926, 15884937, 7477538, -9596031, -2739116, -8466991, 284005, -7029788, 1383516, -5684926, 8101382, 8866960, -4076998, 4061965, 2905009, 5778342, -1486596, -2355253, 2987687, -6950331, 844498, 1535451, 7699266, 3887482, 7930120, -1247688, 289373, -930934, 3830037, -5444408, -1085016, -9322763, 4981625, -1640141, 1891396, -2994129, 1211718, -2719251, -1431835, -386547, -7750806, 29528, 10459319, -6672769, -7001871, 813896, 3532611, 3573413, 1184337, --6903086, 58997280, 29798484, 14583561, -13860933, -7016366, -30294014, 7078643, 24894704, -4467303, --5508833, 40556304, -6877317, -8620536, 20244866, 29774860, 5426155, 30358976, -7187091, 4692252, -18067316, 20345260, 31957242, 25885232, -1022739, -11110007, 9833328, 11823508, 11218991, 13843753, -23983634, 11861626, 30413200, -11389716, -475131, 9070971, 8490077, 25746182, 15136002, 27569932, --19363860, -5935645, 11221676, -20961052, 17458506, 17651242, 16993574, 7344394, -21060372, -7573638, -40877888, 10674604, 27664422, 22911504, 25193742, -4883378, 33287608, 51831664, 18097382, 4762045, -36530308, 25218974, -13620952, -8389145, -17212082, -13832479, 15559056, 17895518, 1853815, -14752676, -623307, -13178570, -310848, -5800890, 9043591, -31238908, -3277060, 3319473, -15600395, 12139725, -2424509, -9674951, 8691403, -19632832, -12551505, -21772800, -7022272, -10448582, 8040179, 2515240, --9884867, 2405182, 14602352, 4313221, -4391067, -8608725, -13220446, -5147519, 4771709, -19063750, --8631811, -1576790, 15661061, 5205501, -6248641, 3255585, -10031970, -2796024, -2892661, -8524436, --5238787, 14383309, -3047279, -1016834, -3241090, 3381750, 9451076, 6512781, 8131447, 19786378, -277562, 15930034, 993748, 1576790, 10256382, 8497593, -12927852, -7720741, -803696, 2974265, -1619203, -8053, -18720152, 9063992, -22537840, 39040180, 55475408, 32251446, -14447196, -30711700, --11438572, 27382564, -8332774, -22921166, 41289668, -28874528, 24579024, 13856101, -32774896, -13625247, --3621731, -53893248, 1932198, 6068252, -26144002, 52874804, -18416282, 49105436, -37081672, 5374078, -2144263, 35887136, 52766896, -4446902, 17767742, 24946780, -29532732, 19594714, -39897560, -10999411, -75120048, -4299799, -21036750, -4122095, -42425688, 1780801, -13533979, 47118476, 17672180, 21922050, --7492571, -12481712, -23744190, -21734146, 5196374, 3000572, -155693, 31394064, -7904351, 5994701, --32862942, -16879222, 21477520, -48512728, -19420768, -14573898, -16884054, 45344116, 3002719, 48994840, -34803192, 15650861, 18474802, -10930692, -26183732, 21980032, -35531192, -21460878, 43133820, 13262859, --26495116, -43097312, -26451630, -30645128, 24337970, -26438208, 13414793, -19066970, -2017024, -16357920, -17156246, 10308995, 1170916, -14168023, -3018825, -9747428, 2513093, -19290846, -13845901, -7193534, -3867081, 10953240, -805306, -7780334, -11478837, -17894982, -13336410, 11587285, 15206332, -4787278, -10340671, 22092238, 10021769, -20227686, -6480032, -7334194, 12387759, -12272332, -8694088, -2762201, -4228932, -16168941, -22611392, -15518791, -5788542, 9257265, -852551, 2241973, -3693672, 12622372, -3303367, 35417376, -58496380, 62438088, -1465658, 4899484, -19877108, 50437948, 11911555, 32517734, -12341589, -21149492, 7334731, 18105972, -30724586, 21656298, 466004, 14403173, -41045928, -3107946, -10162429, 37965364, -15719043, -31134218, -1296543, 37759740, 19945828, -14286672, -32397476, -1500017, -27260158, 3660386, 1962800, 7641284, 19835770, 50016504, -70294656, -11500312, 6866042, 39242044, -8827232, -21212844, -5215701, 15018964, 35883916, -3505767, 1808181, -67368176, 19603304, 10662793, -18474264, -48847200, 43368432, 37404872, 14105209, -22032108, -2185065, -24389508, 18388902, 32053878, -13467407, 15065135, -2717104, 24328306, -35209068, 33567316, -9832254, -11807939, 39385924, 32521492, -2165201, -12121471, -32249298, 23796266, 25982942, -69102264, -5413270, 39938900, 9992778, -310311, --24684788, -10525891, 67747744, -5052492, -23072028, -2798171, -12407087, -14925548, 22578106, -18893024, -6940667, 10408316, 13806172, -9368934, 1420024, -9513889, -11515881, -7586523, 10440529, 10529649, --10536629, -1977833, 5254893, -8279623, 20543366, -19517942, 5192616, -3393024, -6303402, 7422777, -33978024, 2373506, 131533, -5295695, -11869679, 204011, 18530100, 4549981, -787053, -3427921, --8619999, 15870441, -3985193, -766652, -9154723, 9167608, -52147884, 25677462, 5065914, 16405701, -19749334, 28663002, 10262287, 9326521, -13441100, 14863271, 2859911, 33996276, -3737695, -9921911, -26737782, 20587388, -4314832, 1948841, -11210938, 545461, 8576513, -2424509, -6634114, 15364709, --11922292, 1768990, 20685636, -4223027, 12004434, -20711942, -4111894, 3016678, -8464307, -3111167, -2549063, 15193984, -3656628, -24794310, 1133871, 50149112, 10494216, -26795228, 8232916, -27318676, --18733036, -13971529, -3715684, 32126892, -3313567, -25088514, 51651276, -55427628, 9611063, 57191784, -6167036, 40303972, -30407832, -56697328, 18554796, 2283312, 45592152, 2741263, -25469156, 21442624, --5586679, -4372277, -10744398, -1460826, -15791521, 8330089, 2374043, 12520903, -19316078, -16368120, --6505265, 20540144, 26072062, -8254927, 13954349, -1683090, 21852794, 15761993, -27122182, 22209812, --5422933, 3651796, -4453881, -8050916, 85362, 309238, 3138547, -1646583, 2479270, 2401424, -1737314, 3583077, -8808978, 914291, 5208185, -7064685, -782758, 5264020, -4621385, 6765111, -7148973, -9803800, 12596065, 5528697, 13040594, -2370285, 6152004, 10838887, -19380504, 258772, -6189585, 11931419, -6803765, -4683125, -6537477, -4351876, 22156126, -10135586, -106493176, -244153856, --97014720, -147111216, -215228864, 115087944, 31514860, 66060356, 305528928, 235443664, 137154944, 251477312, -187502704, 31738198, 61700428, 51320564, -119776976, -102499928, -50463720, -182902800, -174986624, -67205504, --90123984, -126987152, -53385368, -45837500, -129331664, -107922864, -9384504, -61624192, -104951824, -36230732, -32875290, -76236744, 22398254, 112650016, -9066139, -16517907, 152976000, 122218664, -5825587, 178953568, -207263840, 84055728, 194702144, 273553440, 162918848, 141645344, 328174144, 261996224, 196725072, 233493216, -309586080, 110580912, 43506408, 129544264, -102869296, -294081792, -213476512, -325214912, -526698816, -471585248, --500714272, -581980416, -593386752, -511484448, -445680704, -446705600, -314376576, -139270224, -94665376, -14501957, -151785216, 279665184, 282040288, 350556320, 504142176, 440926720, 402742848, 557059968, 442388608, 250142112, -364811840, 255635376, 98792840, 89697704, 117497960, 11982422, -37787660, 22746684, 2836826, -82906288, --44630080, 7207492, -66430260, -122240672, -59158880, -83909168, -178365696, -112239304, -43852688, -133041984, --89887760, 17794586, -42775728, -62180924, 29912300, -36818072, -146983984, -112297824, -180297360, -303956992, --286713216, -274494048, -285630368, -250611344, -168907104, -131568272, -79719424, -15364172, 66423280, 118810072, -181738864, 229998720, 285086496, 297256832, 314661664, 351279456, 332600672, 305599808, 288465568, 191623728, -66986456, 6649683, -29064044, -81466936, -96795144, -83759912, -95332168, -106209712, -94211184, -94285808, --93087512, -77677168, -76464376, -79218528, -77041512, -66199404, -55065240, -45322104, -28477780, -13413720, -3209951, 10022306, 13147432, 9614284, 5858873, 4073777, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-2920041, 1234803, -1123671, -1386201, -2139968, 525597, 4264366, -1364189, 21475, 438624, +7299834, -140660, 1401233, -2997887, -2079838, -742493, -1958505, -2107218, -1975148, -1343251, +-1876364, -2482491, 2096481, 3469797, -1898912, 529892, 147640, -3933116, 118112, -85362, +-2785286, 5270462, -2684892, 2997350, 1149978, -806917, -3015604, -2792266, 2718178, -1409286, +-1012539, -4161823, -1052267, -386010, -1955284, 5557151, -1205275, -349503, 2331094, -405338, +-4621922, -2379412, -4073240, -2742337, 6344204, -1781338, 7054484, -30065, -282394, -1278827, +830002, 294742, -4179540, -4466766, 3262028, 368830, 2221035, -301185, 2585034, 1578937, +-4049081, -28454, 1362578, 2187749, 4832, 1846299, 3376918, -4488778, 1195075, 1152125, +-2234457, -2684, 1031866, 3218004, 2132451, -2246268, -667331, -124017, 765578, 1022202, +791885, 840740, -577136, 435939, -1209033, -784368, -5906, 1637993, 733903, -50466, +-105227, -1113470, 665720, -86973, -367220, -96637, 594316, 244276, 430570, 1055488, +-338229, 463320, 1284732, 9656697, -723702, -1136019, -2439005, -5237713, -6467684, -5915244, +690416, 5323612, 1881733, 7098507, 2458332, -3182034, 883153, -8390219, -7101729, 3339874, +-2477123, 4693326, -409633, -3714073, -1836099, 9294309, 2096481, 3944928, -151398, 3026878, +-1355599, -1112397, 1861868, -1250909, -4021163, -272194, 1508607, -445603, -216359, 5921686, +3673271, -6310918, 171262, -3993783, 6704981, 3975529, 305480, -2346126, -2413235, 3099893, +1740536, 5010616, -4602058, 7938174, 9732933, -2647311, 9483825, 13422, 4982699, 3107946, +-1722819, 1665911, 7606387, -860067, -5089536, 4407710, 1439888, -29528, -562641, -873489, +350577, 4450660, -2816425, 1634235, 1212255, 2369211, -3641596, 4197257, 991601, -341450, +1344862, 633508, 430570, -150861, 967978, 2477659, -1704028, 1014686, 675384, 1057099, +-1553704, 137439, -2508261, 466004, 1213865, -1438814, -912144, 361314, 722628, 848793, +252866, 774705, 21475, 37044, -8361765, -6541235, 2030983, -3710315, 2615098, -4632122, +-6577206, -6075768, 823560, -4541928, 4122095, 3024194, -5840619, -1210107, 2345589, 543850, +2889439, -1726040, 2989834, 3702262, -5188321, 1643362, 1676648, -4156455, 2413772, 418759, +-4917738, 3626026, 3479461, -1746441, 3803731, 543850, 3099356, 2824478, 1156957, -1844689, +-483721, -5871221, -1795833, -2920041, 3062312, 3250753, 1256278, -9402757, 1767916, 3960497, +-2153389, 6608881, -5433671, -7170985, 517544, -2127620, 2263985, -5119064, 9306120, -490163, +-3154654, 915365, 85899, 5317707, -334471, -3099356, -238371, -2103460, -2901787, -3630321, +1675037, -6563784, 640487, 242666, 1893544, 4391067, 1408212, 3125663, 4800700, -3304441, +-620623, 1084479, -4175782, 2831457, -1449015, 2413772, 1882806, -1277753, -1018444, 3551938, +-1192390, -3229816, 416612, -338766, -163746, -1740536, 2539400, -1987496, 937914, 972273, +1271310, -510027, -584116, 161598, -1039919, 393526, -728534, 67646, -471373, -969589, +1215476, -490700, 226560, -169114, 28454, 22549, 175020, -20105816, -448824, -2561411, +13957570, 186831, 727460, 2881386, -2086280, 6970195, 1625645, -7705708, -4203163, -9019431, +1454383, -747861, -3180423, -2699924, -3386045, -2203318, 10827613, -5166309, -2617246, -2980707, +-8476118, -483721, -2179159, 2722473, 4013110, -1483911, -186294, 2311229, -2690260, -826781, +-1220308, -3151969, 3215857, 6620692, -941135, -1246077, 5203353, -7190849, 4452808, -5767604, +-11507291, -7336341, -11461657, -1853278, -6593312, -4466766, 1058173, 4393752, 2159295, 3104725, +-1804423, 3793530, -4945655, -1210107, 3973382, -139050, 5569499, -2500745, 1625645, -4117800, +-3151969, 2845416, -7053410, 1737851, 5069135, -6864969, 577136, -1903207, -3250753, -4541928, +-4109210, -1438814, -1869385, 955093, 4738423, -2455648, 1413581, -4173635, -4449586, -3519726, +1551020, 2206540, 513785, -1177895, -1362578, -1928440, 911070, -1650878, -1458141, -729608, +-1359894, -265214, 151934, -2308008, -603980, -367220, -1759326, -536334, -834834, -95026, +-373125, -3114388, 286152, 1165547, -654983, -1287417, -204548, 1767916, 884763, -832150, +12785581, 69256, -7154342, -6878927, -2365990, -5022965, -1941862, -3782256, 967441, 600759, +-5657009, -3342022, -6211597, 11737072, 4978404, 1064078, -673773, 6354404, -9521942, -172872, +-206695, -6036577, -8011188, 7143068, 142808, 5088463, -8033737, -3540664, -2798708, 2763812, +-284542, 3403225, -5538361, 1644973, 2273112, -6027987, -5763846, -5250598, 1256815, -1752347, +-1605244, 5032628, -1473711, 525597, 106837, -1037235, -5711770, -3529390, -641561, -8645232, +-5603859, -4574140, 2417530, 1606855, 3464965, -892816, 1532230, -140123, -852551, 3960497, +-3078418, 6931004, 1011465, 2065342, -884763, -2352032, 2813741, 2108292, 5549635, -1714229, +904628, 3313031, -1945083, 15032, -7233799, 3374771, -5556077, 3495567, -4092567, -4087198, +-7797513, -1589675, 2044941, 802085, -1266479, 1769527, 853625, 3526705, 647466, -1152125, +3205656, 1653562, -2728378, 620623, -2203855, 2403034, -925565, 351650, -548682, -352187, +-1928440, -142808, 192200, 309238, -1094143, 865973, -1600949, 591095, -220654, -914828, +-1403917, 313533, -911607, 2040110, 690953, -642635, -832687, -934692, 1744831, 1017370, +1675574, 76773, 279173, 735513, 15052787, 14245870, 10618233, -3677566, 3850438, 5340255, +3110093, 2985002, -5374078, -4704063, -7014756, 6121402, -6586333, -872952, -4808753, 8142185, +-9176734, -6876780, -3460133, -1545651, -5083631, -7620346, 2086817, 318901, 374736, -9225053, +-5107253, 2308545, 1849520, 2514703, -2547989, -3717294, 219580, 2666638, 3445638, -2660732, +3273302, -4942434, -1358820, -11973295, 4286378, 1341104, -2117956, -2344515, -8836895, -4097936, +1031329, -2221035, -12383464, 6547141, 2667175, -112743, -3400004, -2684355, -5284421, 1489817, +-1925756, 3442953, -853088, -1875290, -7079717, -1462973, -782758, -3968550, 7606387, -5688684, +21475, 4449586, -2001455, -6146098, -3475166, 5068062, 7429757, 3594888, -661425, -345208, +3889630, -8227010, 3213709, -983548, -482647, 249108, 1656784, -594853, -427886, 275952, +-1676111, -5025112, -1413044, -1629403, 1400159, 907849, 474057, -2032593, -1088237, -2327872, +-2791192, -812823, -196495, 3087545, 212064, 296353, 304943, -1271310, -749472, 1339493, +-1792075, -412854, 486942, 780073, -2122251, -126702, -275952, 1038845, -1552631, -502511, +-955630, -1570884, -3211562, -1589138, -249645, -1515587, -96100, -1611, -250182, -1883880, +18321256, 6164352, -2642479, -2105071, 6453725, -12330851, -2294586, 10035191, 5050882, -6950331, +-120796, -4708358, 1967632, 7721278, 18940268, 6263673, 14761266, -5194763, -1056562, -14305999, +4901632, -4160213, 4073777, -6256157, -288837, 622770, -2190970, 5159867, -2260764, 2471754, +6374805, -4836133, 2902324, 8097624, -2157684, 2716030, 56908, 3260417, 4476430, 4559645, +-24256364, 8895951, -2758980, -11376295, -1938104, 6955700, 2178622, -8789114, 4796942, 6933688, +-14260902, 1150514, -3986267, 8422431, 1978906, 6956237, -1644436, -5012227, -9995463, 612570, +-6022618, 18971944, 3565360, -3125126, 6385006, 788663, 6180995, -14942191, -1905355, 2293513, +4690105, 1087164, -6923488, -1115081, 2615635, 6629282, 5671505, -4651450, 188979, 6519224, +-220117, 3058554, -2214056, -1146219, 4650376, 423054, -291521, -650151, 297427, 2221572, +-2097555, -985695, -208843, 1717987, 1761474, -252866, -535260, 4488778, -1371168, -808528, +-2316061, 280247, 1295470, -1223529, 152471, 1352378, 1914482, -1653026, -666794, -2720862, +268435, 2074469, -945967, 347892, 1049046, 1050120, 3714073, 416612, 1854889, -164819, +-1512365, 2323577, 653909, -21703006, -23802172, -8147016, -1851131, 441845, 5066451, -10164577, +3216394, 11990475, -6868727, 6383395, 8308078, -5780489, 188442, -2814814, 10160282, 14158360, +-6770479, -7991861, 7131793, 685584, -6784438, 3218541, 127238, 1774895, 2039036, -3634616, +-2632815, -15128485, -762357, -4327717, -331786, -448824, 10302553, 3052648, -18445810, 308701, +8921184, -10099079, 2677375, 10859288, -2369748, 3821984, 239981, -2850785, -6996502, 13960791, +11770358, -8936753, 4699768, -3324842, -441845, 4343823, -3078418, 3642669, -5506685, -632434, +11818139, -3352759, 2518462, 5568962, -4004520, -9697499, -391379, 3326989, 1746978, -4661650, +640487, 2611340, 4220342, 8623221, 5363878, 9489193, 5042829, 1831804, 4440996, -1560684, +8587787, -282931, -6737193, -9110163, 1146219, 2954401, -1566589, 6806987, -3491809, -3680787, +2734821, -861678, 756988, 342524, -4183298, -592169, -2509872, 3092377, 1416802, 2485712, +4887673, 601832, -1692754, -7054484, -514859, 1631551, -1773285, -733366, 739271, -1575179, +1533840, 1561221, 228707, -1668058, -1155883, 3444564, -459025, 1613834, 886374, 1110249, +-2443837, -2627983, -1516660, 594316, 1218697, 2058363, 1563368, 1003412, 994822, 2588255, +-648003, -23369454, 26096758, -1501628, 16796006, 1293322, -9721658, -2904472, -5622649, -6821482, +-871878, 479963, 12157442, -1906966, 8361228, -8376260, -419833, 2087354, 1950989, 972273, +10574209, 10536629, 3875134, 1697586, -1296006, -2025614, -569083, -1726577, -17533668, -5963025, +8135742, 5260261, -1918240, 924492, -8274255, 4242891, -10154913, 2266132, 16248398, 1798518, +3564286, -13437879, 7245073, 6318434, 1779727, -9001178, -3904662, -4173635, 793495, -8074539, +8349954, 10179072, 6174016, -851477, 15247671, 5434744, 22291418, 8739185, -5883569, 18574122, +482647, -6700686, 13474923, -2128693, 4495220, 8508330, -6031208, -5164698, 12474196, 13392782, +7949985, -10755135, 4184372, -42950, -4920422, -8821326, 6671158, 11862700, 7211787, 17196512, +2445984, -3710852, -3732864, -10492068, -3915400, 6609955, 1112397, -1866163, 514859, -6518687, +-4515085, 992674, 1789391, -150861, 7192997, 5672041, 2593624, 299037, 2186675, 3432753, +1846299, -3212099, -1212255, 1037235, -634581, -1056025, 3108483, 343061, -715112, 2475512, +1046898, 843961, 1076426, -2094870, 689879, 6278169, -2669322, 3985730, 1968706, 239444, +-2642479, -3026878, -1433982, 5740224, -12565464, 16683264, -4832912, -10983842, 3663607, 7245610, +-7286949, -3707094, -15379204, 6420439, -5641977, -1874753, -14096620, -6215355, -4783520, -2433099, +-6357089, 3301756, -2853469, -3496104, 3314641, 4631049, 8207146, 8016557, -3478387, -2934537, +-11355357, 4447976, 220117, 7446937, 2055679, 1973538, -2571075, 2961380, -7095823, -6045167, +3345243, 1670742, 3396246, -13887240, 4641786, 9026948, -25233, -12237972, -12735115, -9967008, +-29372208, 4113505, -3377992, 14178224, -6952479, 11770895, 3800509, 760746, 15241228, 2274722, +-1748589, 10899553, 4064650, -14977088, -7407745, 1733556, -4747550, -8525510, -5138929, 19191524, +8868571, -9113384, -1083406, -5143760, -2470143, 2756832, 13611288, 190052, -3628711, 17923972, +-6423124, -16394427, -15563888, -18546742, -3260954, 1354525, -459562, -3313567, -2237141, -7966628, +-1528472, 2251637, -2425583, -2402497, 1589138, 1450088, -11595338, -4842576, -9073655, 370978, +-3053722, -3012920, -4841502, -1589138, 1336272, 6995428, 107374, 8593693, 4295504, 6294812, +710817, 2931315, -2932389, 5734318, 1074, -4234301, -6190659, 3527242, 607201, 1925756, +-1590749, 1081258, -1923609, 1945620, -667331, 2318209, -460098, -1076426, 1572495, -382252, +7329362, -12034498, -2995203, -3197603, -1542430, -802622, 32114544, 5288179, 11767674, -5654862, +10283225, 20702280, -17671106, 26883810, 15961172, -7150047, 285615, 1660005, -9608916, -16163036, +1161252, -9359271, -14401562, -6447820, 1333051, 51540, -1726040, -6468758, -1035624, -6298033, +-388158, -7286412, -480499, 5034776, -11301133, 6262599, 9618579, -7421167, -6862821, 4958540, +3787624, -626528, 28858422, 2563022, 19258096, -13780403, -1277753, -16713865, -12222940, 2980171, +-12258374, -16897476, -11216307, -12829604, -2737505, -3402688, -14203457, -15488726, 20304994, 3196530, +1341640, -2724083, 10553808, 5838471, 12716861, -1236414, 12025372, -6665789, 2797634, -22345642, +18345416, 8851391, 1511292, -12265353, -849330, 5563057, 1242319, 2153926, 9105331, 12606266, +-9672266, -12521440, -8171176, -1946694, -126165, 1387274, -7281580, 855772, 2195265, 5203353, +6830609, -838056, -4080756, 7043747, 3560528, -5231807, -271120, 2553895, -3044595, -5530308, +1094143, -1866700, -1733019, -155156, -2336462, 6458020, -6701760, 3754338, -96100, 7142531, +-7345468, -1792075, 1352378, -1874216, -2734284, -1181653, -5797669, -6472516, -1122060, 696858, +2022393, 2370822, -4295504, 4483409, 3487514, -2636573, 4103841, -766115, 2407329, 217433, +2386391, -1780801, 15586973, -6415608, -5237713, 17405892, -14721537, -11235634, -2782602, -8945880, +-1461900, -17523466, 3882114, -10805601, 8221641, 1123671, 2777233, 9952513, 2833068, 7011534, +9651328, 9157407, 7556995, 12848395, 1489280, 8719320, 7814156, -9453760, 16237661, 3941706, +7482907, -8830453, 12661564, 5679021, 8877697, 2211371, 3138011, -1698123, -11764989, 2932389, +6580427, 7762080, 8487929, 1783485, -14299020, -9065602, 10203769, 5523328, 2283849, -5472325, +7047505, -5238250, -14333380, 20914344, 12757127, 9304510, -8121783, -4031901, -10691784, -33219962, +-1055488, -4691715, 4229469, -7809325, -8377871, -14687714, 2533494, 4624069, 18505404, -14703284, +5883569, 204548, 8491687, -12955769, -15869367, -9703942, 10166724, 3047816, 3145527, 5361730, +-4392678, 1741072, 11926587, 4190814, 6015639, 7574175, -3104188, -2856690, -5071283, 51540, +5185100, 6413997, 193810, 2615635, 1260573, 978179, 4869956, -3117610, -2662880, -4367982, +-2461553, -4518843, -186294, -6825240, -2771328, -7212324, -448287, -4371740, -1282048, -1061394, +-2522757, 1972464, -1833414, -9245991, -1422708, 3587908, 3957276, 7470559, -1181116, -4573067, +2088965, -1856500, -6730751, 6067178, 5147519, 4913980, 11615202, 7558069, -705985, -26699128, +15480136, 16469052, -8049843, 14057965, 4898947, -22501870, -3898220, 29790966, -4128001, -19658066, +-2989834, -1802276, -17064978, 12115029, 2597382, -8557722, 13054016, 8694088, 30728344, 18050136, +580894, 2354716, 28998008, -7308424, 7420093, -11700565, -16878684, -4962298, -11430519, 2704219, +-731218, 5928666, -769873, -1967095, -4773320, 22879828, 1220308, -17839684, -14121316, -3135326, +-3573950, -533650, 7556995, 20892868, 13407277, 4500589, -12489765, 16276852, 29673930, -6140193, +13550085, 12670154, 35733592, 6882685, 6921877, 10878615, 15310485, 8526047, -12084427, -11639898, +8333311, -21716966, -13006235, -15531675, 14980846, 13095892, 9218074, -3433290, 11085847, 22962506, +-12882218, 18314814, 18274548, -2321967, 17968532, -16631187, -7235946, -5724655, 37480568, -18101676, +18505940, 11591580, 6924024, 5336497, -16348793, -1514513, -12817256, 14071387, 13430363, -85899, +1161789, -6542846, 10093173, -3754875, 1181653, 3860102, 4256313, 97174, 6242735, -4042101, +-2040646, -1533303, -3944928, 2013266, 3857418, -2951180, 1881733, 4421669, 7785702, 1291711, +-6753299, 3087008, -7335268, 1484985, 7048042, 4577362, 7445863, -1118839, 11867532, -4476967, +8827232, -2120640, -2542084, -1398549, 730144, 9511205, -6568616, 4634270, 53687, 4693326, +-5294084, 1590749, 2522757, -2408403, 12593918, 5956583, 20477868, 36502928, 3943854, -3748433, +3893925, -1930588, -5972152, 1112933, 3846143, -8878234, -11830487, 4058207, -6122476, -3333432, +9337796, -432718, 18304076, -9576703, 17948132, 8825621, 1814624, -10359998, 3437048, 17884244, +5229123, -9037685, 3592740, -2126009, 571768, 10518375, -14456323, -7652558, 16287590, 376883, +-3928285, 14111115, -614717, 5014911, 3284576, -13441637, -24474334, -5168457, 8611946, 15775952, +3498788, -12047920, 15819975, -5117454, 31994822, -16115254, 21566104, -12505871, 7789460, 18440978, +-27084064, -28075664, -72478, -7922067, 7386270, 8999030, 1418950, -4103841, -16499117, 11245298, +-2273648, 19990926, 9160628, 18616536, 5215701, 10848551, -4384625, 14299020, 5308043, -8508867, +1893544, -217970, -40955196, -1193464, 7402376, 9970230, 17560510, 14766098, -4631049, 1258425, +-2877091, 2774012, 170725, -4558571, -10716480, 4748087, -6172942, 14270029, 1873143, 2791192, +7202660, 4155381, -4285304, 4121021, 10540387, 9066139, -2876018, -1638530, 1698123, -2189360, +-1274532, -6445672, -944356, -13508209, -1651952, 4634807, -11038603, 7819525, -8270497, -6905234, +2263448, -7023882, 7395397, 2772402, -2437394, 4662724, -284542, -777389, 3256122, 9916006, +-6630893, 1539209, 1758252, 23791434, 30776662, -6739341, -1206349, 10842108, 40719512, 1120450, +-24107652, -9663676, 4888747, 4611185, -7628936, 7762617, -5512054, 12597139, -20443508, 1047435, +12721156, -8560407, -9225053, 1748589, -20204600, -6254546, -6584185, -32190244, -27158688, -15768972, +11850889, 13915157, -2447595, -22921166, 2576444, 776315, -808528, 4549444, -11489574, 27436788, +-7840463, 3460133, 30444338, -26687854, 12853227, 4464619, -9290551, 11028402, -7195144, -21649856, +454193, 18648212, -8357470, -13619341, 7793218, 2474975, 17830556, 89657, -27464168, 2153389, +-16233366, 27020176, -9810242, 4045859, 6664179, 3198140, -3878356, -17620104, 7347079, 18382996, +5364951, 18967650, -27843736, -15384036, -4580046, -301185, 3010235, -21547850, 19260780, -2698313, +-20477868, -6889128, 12971338, 12004970, -11334419, -15812459, 15575699, -12599287, -7844758, -345745, +-1912871, -1770600, -1000727, -4642860, -852551, 7754027, -1755568, 7121056, -8203925, 5647345, +7517804, -2070174, 4072166, 1166084, -1493575, 44560, 1048509, 13314399, 733366, -2610266, +1176284, 2920041, -6637335, 2343442, -8496519, -727997, 9922448, -3595425, -7731478, -2922188, +4478577, 103079, 377957, 5789616, 520228, -7834557, -3994857, 14157286, 10429254, -3458523, +-546535, -21110302, 31081604, 905164, -53181896, 21330956, -7292855, 4165582, 5448703, 7162395, +13080323, 4780299, -9612137, -2308008, 13172665, 8911520, -10543608, -547071, -8361228, -4327717, +-26111254, -3316789, 12597676, 15636902, 3531537, -6181532, 17322676, -17805860, 19735374, -11341935, +-6359773, 2366527, -6096706, 5272609, -15706159, -21216602, -23740968, -7590281, 12326019, -4737349, +141734, 14486388, 4040491, 2543158, -432718, 505732, -4983236, 208306, 15618649, 9614821, +16481400, 13972602, 16534550, 11248519, -9795747, -6250251, 4079145, -1040993, -18952616, 12769475, +-3411278, -17918604, 22527640, -245350, 3681324, -618475, -8162586, -2695092, 9474698, 13697188, +11412265, 353798, 6999186, -22958748, -3237332, -8180839, 12520367, 4315369, -6375342, -7304129, +28942174, -8815957, -9880572, -3135326, 4689568, -7162932, -19028852, -1080721, -3237332, -10303627, +17886928, 3635690, 6750615, -5499169, -927176, 4146791, 1102196, 5238787, 5694590, -1872606, +3504693, -3457449, 3968550, 1478006, -3126199, -2415919, 2949032, 4082367, 1151051, -3660923, +-2978023, -3296924, -2374043, 49929, 2079838, -2996277, -3545496, 810675, -244276, -687732, +3141769, -1500017, 4954782, 1439351, 14432164, -1272921, -1759326, -3232500, -6194417, -8096550, +72334768, -71203576, -3646964, -77408192, -12050604, -29493004, -3663070, 18780282, -9669582, -21496312, +33653752, -9224516, -5961415, 1017907, 10315438, -1306744, 27955942, 18461916, 11042898, -16656420, +1018981, -11397233, -11573863, -7786239, 332323, -3640522, -3185792, -9455907, -2170032, 15392089, +1819992, 10149008, 10152229, -934692, 13581760, 19811610, 977105, -4195110, -10490458, -12533788, +4871567, 5326833, -10399190, 16770237, -22409528, -22688702, 2391223, -8016020, 11973832, -21044266, +8832600, -40361956, -21551072, -32335198, -2899103, -16019154, -1548873, -9822590, -12213276, -10646150, +-1072668, 2614025, -31589484, 3474629, -7005629, 3499325, 31139, -14664092, -25720948, 17597554, +-15523622, -2859911, 15730318, -1713692, -5083094, 10376641, 13019656, -2814814, 12969191, 8463770, +15695958, 8618926, 15884937, 7477538, -9596031, -2739116, -8466991, 284005, -7029788, 1383516, +5684926, 8101382, 8866960, -4076998, 4061965, 2905009, 5778342, -1486596, -2355253, 2987687, +6950331, 844498, 1535451, 7699266, 3887482, 7930120, -1247688, 289373, -930934, 3830037, +5444408, -1085016, -9322763, 4981625, -1640141, 1891396, -2994129, 1211718, -2719251, -1431835, +386547, -7750806, 29528, 10459319, -6672769, -7001871, 813896, 3532611, 3573413, 1184337, +-6903086, 58997280, 29798484, 14583561, -13860933, -7016366, -30294014, 7078643, 24894704, -4467303, +-5508833, 40556304, -6877317, -8620536, 20244866, 29774860, 5426155, 30358976, -7187091, 4692252, +18067316, 20345260, 31957242, 25885232, -1022739, -11110007, 9833328, 11823508, 11218991, 13843753, +23983634, 11861626, 30413200, -11389716, -475131, 9070971, 8490077, 25746182, 15136002, 27569932, +-19363860, -5935645, 11221676, -20961052, 17458506, 17651242, 16993574, 7344394, -21060372, -7573638, +40877888, 10674604, 27664422, 22911504, 25193742, -4883378, 33287608, 51831664, 18097382, 4762045, +36530308, 25218974, -13620952, -8389145, -17212082, -13832479, 15559056, 17895518, 1853815, -14752676, +623307, -13178570, -310848, -5800890, 9043591, -31238908, -3277060, 3319473, -15600395, 12139725, +2424509, -9674951, 8691403, -19632832, -12551505, -21772800, -7022272, -10448582, 8040179, 2515240, +-9884867, 2405182, 14602352, 4313221, -4391067, -8608725, -13220446, -5147519, 4771709, -19063750, +-8631811, -1576790, 15661061, 5205501, -6248641, 3255585, -10031970, -2796024, -2892661, -8524436, +-5238787, 14383309, -3047279, -1016834, -3241090, 3381750, 9451076, 6512781, 8131447, 19786378, +277562, 15930034, 993748, 1576790, 10256382, 8497593, -12927852, -7720741, -803696, 2974265, +1619203, -8053, -18720152, 9063992, -22537840, 39040180, 55475408, 32251446, -14447196, -30711700, +-11438572, 27382564, -8332774, -22921166, 41289668, -28874528, 24579024, 13856101, -32774896, -13625247, +-3621731, -53893248, 1932198, 6068252, -26144002, 52874804, -18416282, 49105436, -37081672, 5374078, +2144263, 35887136, 52766896, -4446902, 17767742, 24946780, -29532732, 19594714, -39897560, -10999411, +75120048, -4299799, -21036750, -4122095, -42425688, 1780801, -13533979, 47118476, 17672180, 21922050, +-7492571, -12481712, -23744190, -21734146, 5196374, 3000572, -155693, 31394064, -7904351, 5994701, +-32862942, -16879222, 21477520, -48512728, -19420768, -14573898, -16884054, 45344116, 3002719, 48994840, +34803192, 15650861, 18474802, -10930692, -26183732, 21980032, -35531192, -21460878, 43133820, 13262859, +-26495116, -43097312, -26451630, -30645128, 24337970, -26438208, 13414793, -19066970, -2017024, -16357920, +17156246, 10308995, 1170916, -14168023, -3018825, -9747428, 2513093, -19290846, -13845901, -7193534, +3867081, 10953240, -805306, -7780334, -11478837, -17894982, -13336410, 11587285, 15206332, -4787278, +10340671, 22092238, 10021769, -20227686, -6480032, -7334194, 12387759, -12272332, -8694088, -2762201, +4228932, -16168941, -22611392, -15518791, -5788542, 9257265, -852551, 2241973, -3693672, 12622372, +3303367, 35417376, -58496380, 62438088, -1465658, 4899484, -19877108, 50437948, 11911555, 32517734, +12341589, -21149492, 7334731, 18105972, -30724586, 21656298, 466004, 14403173, -41045928, -3107946, +10162429, 37965364, -15719043, -31134218, -1296543, 37759740, 19945828, -14286672, -32397476, -1500017, +27260158, 3660386, 1962800, 7641284, 19835770, 50016504, -70294656, -11500312, 6866042, 39242044, +8827232, -21212844, -5215701, 15018964, 35883916, -3505767, 1808181, -67368176, 19603304, 10662793, +18474264, -48847200, 43368432, 37404872, 14105209, -22032108, -2185065, -24389508, 18388902, 32053878, +13467407, 15065135, -2717104, 24328306, -35209068, 33567316, -9832254, -11807939, 39385924, 32521492, +2165201, -12121471, -32249298, 23796266, 25982942, -69102264, -5413270, 39938900, 9992778, -310311, +-24684788, -10525891, 67747744, -5052492, -23072028, -2798171, -12407087, -14925548, 22578106, -18893024, +6940667, 10408316, 13806172, -9368934, 1420024, -9513889, -11515881, -7586523, 10440529, 10529649, +-10536629, -1977833, 5254893, -8279623, 20543366, -19517942, 5192616, -3393024, -6303402, 7422777, +33978024, 2373506, 131533, -5295695, -11869679, 204011, 18530100, 4549981, -787053, -3427921, +-8619999, 15870441, -3985193, -766652, -9154723, 9167608, -52147884, 25677462, 5065914, 16405701, +19749334, 28663002, 10262287, 9326521, -13441100, 14863271, 2859911, 33996276, -3737695, -9921911, +26737782, 20587388, -4314832, 1948841, -11210938, 545461, 8576513, -2424509, -6634114, 15364709, +-11922292, 1768990, 20685636, -4223027, 12004434, -20711942, -4111894, 3016678, -8464307, -3111167, +2549063, 15193984, -3656628, -24794310, 1133871, 50149112, 10494216, -26795228, 8232916, -27318676, +-18733036, -13971529, -3715684, 32126892, -3313567, -25088514, 51651276, -55427628, 9611063, 57191784, +6167036, 40303972, -30407832, -56697328, 18554796, 2283312, 45592152, 2741263, -25469156, 21442624, +-5586679, -4372277, -10744398, -1460826, -15791521, 8330089, 2374043, 12520903, -19316078, -16368120, +-6505265, 20540144, 26072062, -8254927, 13954349, -1683090, 21852794, 15761993, -27122182, 22209812, +-5422933, 3651796, -4453881, -8050916, 85362, 309238, 3138547, -1646583, 2479270, 2401424, +1737314, 3583077, -8808978, 914291, 5208185, -7064685, -782758, 5264020, -4621385, 6765111, +7148973, -9803800, 12596065, 5528697, 13040594, -2370285, 6152004, 10838887, -19380504, 258772, +6189585, 11931419, -6803765, -4683125, -6537477, -4351876, 22156126, -10135586, -106493176, -244153856, +-97014720, -147111216, -215228864, 115087944, 31514860, 66060356, 305528928, 235443664, 137154944, 251477312, +187502704, 31738198, 61700428, 51320564, -119776976, -102499928, -50463720, -182902800, -174986624, -67205504, +-90123984, -126987152, -53385368, -45837500, -129331664, -107922864, -9384504, -61624192, -104951824, -36230732, +32875290, -76236744, 22398254, 112650016, -9066139, -16517907, 152976000, 122218664, -5825587, 178953568, +207263840, 84055728, 194702144, 273553440, 162918848, 141645344, 328174144, 261996224, 196725072, 233493216, +309586080, 110580912, 43506408, 129544264, -102869296, -294081792, -213476512, -325214912, -526698816, -471585248, +-500714272, -581980416, -593386752, -511484448, -445680704, -446705600, -314376576, -139270224, -94665376, -14501957, +151785216, 279665184, 282040288, 350556320, 504142176, 440926720, 402742848, 557059968, 442388608, 250142112, +364811840, 255635376, 98792840, 89697704, 117497960, 11982422, -37787660, 22746684, 2836826, -82906288, +-44630080, 7207492, -66430260, -122240672, -59158880, -83909168, -178365696, -112239304, -43852688, -133041984, +-89887760, 17794586, -42775728, -62180924, 29912300, -36818072, -146983984, -112297824, -180297360, -303956992, +-286713216, -274494048, -285630368, -250611344, -168907104, -131568272, -79719424, -15364172, 66423280, 118810072, +181738864, 229998720, 285086496, 297256832, 314661664, 351279456, 332600672, 305599808, 288465568, 191623728, +66986456, 6649683, -29064044, -81466936, -96795144, -83759912, -95332168, -106209712, -94211184, -94285808, +-93087512, -77677168, -76464376, -79218528, -77041512, -66199404, -55065240, -45322104, -28477780, -13413720, +3209951, 10022306, 13147432, 9614284, 5858873, 4073777, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -8562554, -5064840, -6513318, 790274, -2760590, -862752, 2532957, -4039417, -7337952, -1877438, 619549, --4208531, -2426657, 3556770, -2112587, 1644436, -9188009, -791348, 6214281, 3308199, -10279467, --3543348, -2697776, -2734284, 3470334, -1503775, -5354751, -3367791, -3828427, -3900904, 6772090, -2113124, 4361540, -2831994, 5729487, 5203353, 3711389, -2066953, -4863514, -3825742, 403727, -964757, 7794829, 2758443, 1483374, -3677566, 847182, 331249, 891743, 3083787, 1830193, --5298916, -4500052, -2331630, 2849174, 657667, -996969, -5664525, -1729261, 2213519, 2563559, --2289755, -862752, 119722, 2714956, -592169, -2993592, -3758, 433255, -3868155, 8221641, -509491, -5576478, -16643, -857383, 5268851, 426812, 3562675, 4934381, 1839857, -333397, -228170, -1787780, -1178969, -1187022, 3121368, -1005559, -417686, -1409286, 1067836, 383863, --621697, -122943, -833224, 171262, -134755, 643171, 621160, 1054951, -5645198, -5108327, -5800890, 5320928, -4297115, 3205656, 324807, 1654636, -14120779, 5468030, -2095407, -9640591, --12573517, 344671, 9098351, 555661, 5900748, 226560, -11370926, -3919158, 1316408, 3986267, --1998234, -965831, -4784057, 642635, -864362, 8048232, 4092567, 1716913, 1449015, 2193118, -2798171, 7339026, 4449586, -6467684, -542777, 1514513, 1574642, -7694434, 2513630, -2282238, --4864588, -1370632, -198105, 5277978, 1363115, -2936684, 5345624, 8326868, -1753957, -3147674, -2020782, -587874, 4558034, 4645007, 3640522, -5554467, -4224101, 3997004, -1673964, -1389422, --4255776, 469225, -6325413, 3780645, 3411278, 4472672, 1159641, 5196911, -5604396, -3521336, -7303592, 388158, 2716567, 8616241, 3340948, 853625, -3453691, 5056787, 621697, -2556043, -1459215, -6081674, 188979, -635655, 923418, 1640141, -678068, -2706903, -1469953, -436476, -1344325, 1248225, 438087, -744640, 761820, 1723893, 322659, -564251, 7201050, 649077, -2796024, -6038187, -5127117, 2956548, -1412507, -2199560, -2798708, -2615635, 2196339, -6988449, --4002373, -8633421, -10377178, -1908576, 8660265, 5590974, -3481071, -958851, -1189706, -1998770, --7471096, 5405217, -1866700, -1907502, 484794, 3538516, -1674500, 328028, -247497, 5117991, --4705674, 5134097, 2805151, 6152541, -2082522, 4763656, 2121177, -2920578, 4290673, -2887292, -2474438, 4565550, -3423089, 4794257, -2843268, -2286533, -712428, -1397475, 2415382, -1375463, --3624416, 1477469, -3145527, 708670, 438087, 508417, 7213398, 1416802, -1648194, 57445, --2946348, -4105452, 2138357, -976031, 6885370, 7030862, 2851858, -1930051, -1075889, -32749, --2757906, -3180960, 3544422, 5576478, 185220, -587337, 3425237, 3706557, -476205, 1321239, -1190243, -2663417, 2548526, -468688, 3655017, -1792075, -694711, -119722, -1516124, -147640, -2662880, -563714, 807991, 798327, -1878511, 608275, -343597, -360240, 760746, 715649, --1203128, 1391569, -464930, -570157, 99858, -134755, -227096, -1077500, -816044, 13702019, --5815923, 5609764, -7005092, -5894306, 15569, -1646046, -1500554, 1897839, -2953864, 5917391, -5774584, 4944044, -1500017, -660888, -2594160, -6344741, 978179, -3817689, -714038, 679679, --2130304, 3592203, 1354525, -447750, -10458782, -4377109, -6594923, 231928, -4317516, -6638946, --2911451, -3675418, -4057134, 6578280, -5276368, 4632122, 396211, -1886564, 2596845, 2221035, --4729833, -1309965, 91805, 5076115, -490163, -6978248, -8837969, -9211094, 2388002, -3375308, -198105, -745177, 1326608, 3091303, 5107790, -3547643, -1872606, 1665911, 1755568, 637803, -6408091, -3602941, 3962644, -7380365, 14431090, 1757179, -1536525, 2788508, 1381906, 2742337, --4010963, -724239, 1097364, -462246, -861678, -7299834, -2418604, -4966593, -1469953, -596464, --3564823, -3505767, 2597382, 3011309, 928787, 578747, -326418, 2542084, 1511292, 2921115, --1462436, 243203, 100395, 2683281, -1072668, -174483, -153545, 285615, -2124398, 510564, --1533303, 765041, 1091995, -526670, -1784022, 344671, 570157, -569620, -602369, -1948305, -528818, -239981, -967978, 1207960, 1425392, -192200, -6662568, 1022202, 1291175, 492311, --1013075, -3969624, 2436857, 1960116, -6014028, 7165616, -8830453, 10998874, -1028108, 3702262, -1661079, -176631, -1133871, 2300492, 10310069, 11560978, -2161979, 2120103, -1343251, -1587527, -1570347, 2491618, 7939247, -954557, 2436320, -3947612, 4372814, 1008780, 6269042, 3063386, -5874979, -8358007, 3590056, 3113315, -2601677, -38118, 6374805, 77309, 541166, 1976222, -3896609, -1256278, -501974, 12261058, 5856725, 1132798, 1158031, -2501282, 5590974, -7327751, --10766409, -13038984, -759136, 6933151, -165356, 3482145, 9352291, 3728569, -1601486, -3222836, -5007932, -913217, 12012487, 5428302, 1821066, 1722819, -6484864, 1438277, 4977330, -2461016, --7307350, 1341640, 2691871, -270583, -2508261, -888521, 1297617, -2339684, 1429687, 1411434, -1296006, -425739, 1488743, -2295660, -2137820, -671089, -1340030, 798864, -2145873, 1316408, -2199023, 1462436, 1670205, 1673427, 559956, 1090385, -2976412, -2506114, -904628, -1293322, --1532230, -281320, 1060857, 606664, -61203, 1940252, 1075889, -99858, 2437931, 1530082, --15933792, 1724966, -1189706, 10956462, -8174397, 4817880, -16872242, 6664179, -1577327, -8591008, --9440338, -6598681, 5060009, 3957276, 12836047, 1719598, 4287451, 12288975, -2114735, -8908299, -1358820, -6859063, 1700807, 10024991, 1879585, -2784213, -1171989, -1893007, 2961380, 3897146, --804770, 2612951, 5174899, -3194382, 1652489, -6025839, -449361, -7546795, -1167694, 1058173, --3570729, 5612986, 3835406, 4787815, 9511742, 634045, 11507291, 8822937, 4272419, -5946382, -13193603, 5698348, 2333241, 11575474, -1248225, 287763, 979789, 3861713, -2390686, -3342558, --7895224, -7626788, -6231998, 99858, -4914517, 10162429, -6092411, 4223027, 6338835, -3519189, -338229, -2871186, -1686312, -9919764, -11381663, 5245229, -1975685, -3787088, -3368865, 1010391, -1342177, 807991, 2239289, -3942780, 9324911, 695785, 2809446, -1869921, 524523, 2815888, --4536559, 1574106, 179315, 1614371, 2115808, 32749, 1653026, 3229279, 9664, 964757, -2295123, 2579128, 3297998, -89657, 565862, -1637456, -469762, 220654, -788127, -2334852, -169114, -634045, -1033477, 317828, 13381507, 539555, 192200, -1204202, -2579128, 2429341, -585189, -6781754, -8699993, -11800960, -6170258, -12348568, -7842074, -4186519, -9131637, -5762773, --3978214, -4730907, -12355010, 8524973, 5348845, 345208, 4503810, 2087354, -3413425, 15406048, -970126, -5281736, -2765959, -10390600, -4459787, 11481521, 579284, -9575093, -9582072, 1432909, --9699647, 3148748, 3429532, -7538742, 319975, 2400887, 557272, 11303817, 3394635, -5110474, -1157494, -6133750, 5707475, 846109, 2537789, -13743358, 9521942, -4698158, 3978214, 357556, -1861332, 2301566, 373125, -3973919, -299574, -5341329, 28991, -10823854, -42413, -11679090, -15469398, -2586107, 9848360, -7187091, -3363496, -1509681, -7443179, -4122632, 6054294, -172336, --213675, 4519380, 5820755, 975494, 9494025, 8249559, 11414949, 6116571, 2440078, 1438277, -5193153, 2812130, 1740536, 2154463, 1191317, 2590939, -696858, 4201552, 745177, -214212, --852014, 3286187, 1336809, 2355253, 1176284, -1464047, 1126892, 1332514, 1094143, -2446521, -4798016, 2631741, -439160, -3587372, -374736, -489089, -2596308, 1015760, 501437, 2778844, --2208687, -4973036, -6855842, -35433, 5032091, -13160854, -10737, -5692979, -4558571, 9308268, --15178951, -14338748, 3729642, 19103478, 484258, 1810866, 1464047, -2918967, 10458782, 10154376, -5864241, 2876018, -2761127, -15540265, 9202504, 71941, -12451110, -4022237, 2880313, -635655, -98247, 1265405, -3003256, -12261595, -696858, 494458, -2246805, -5127117, 3670587, 10622528, --13720273, 8524973, -5148592, -2589865, 807454, 6762963, 22275312, -14418205, -3639985, 1407139, --1437203, -2645163, 727997, -5532455, 1913945, -4997195, 15311022, 5260798, 2860985, 4219806, --3247532, -892279, 8099772, -1282585, 3514894, -6750615, 11751031, 514859, -8335995, 16441135, --10492068, 7565585, 2147484, 3727495, 11951820, -4776541, 5082557, -590558, 12348, 1433982, --812823, -8083129, -4289599, -527744, -3581466, -1275605, -1957431, -4961761, -5074504, -3810173, -2347200, -4345970, 2486786, -1167694, -190052, -3814468, -2616172, -2816425, 2225330, -5263483, -514859, 500364, 3177739, 4983773, -1970853, -958315, -4507568, -3847217, 255551, -3385508, -936840, -634581, -3003256, 47782, -920197, 1351304, 1783485, -1262720, 16307991, 1283122, -4259534, 4844723, -2718178, -9373766, -7347079, 1136556, 16314433, 9251360, 2018098, -14571213, -2113124, -8010114, 60130, 16321413, 15700790, 7933879, 10617159, -9558987, -19801946, -10366977, --14267881, 7927436, -128312, -2405719, -40802, -10799695, -3194919, 3351148, -2016487, -4099010, --3980361, 11566347, -732292, 3152506, -3270081, 7585449, 1622424, -4365835, -9176198, -7054484, -20940650, -894427, -4714264, 6691559, -11938935, 3755949, -6825240, -20885352, -4668630, -2712272, -6342056, 2428267, 5574331, 1769527, 8286603, 315143, 594853, 4581120, -20397336, -3221226, --5463736, -1453846, 2004676, 11729556, 12975633, 4672925, -3367254, -8928163, -11710765, -3935801, --6880001, 1482301, -3409667, -3655554, -8056822, 12093554, 8739185, 3544959, 11144366, -2644626, -4466229, 6822019, -4316442, 4064113, -2770791, 891206, 4082903, -1232656, -2661269, -1116155, --1456531, -1054951, -64961, 275415, 4048007, 163209, 509491, 1235877, -2202245, -6179384, -280247, -1439888, -770947, -1117765, -3604551, -412317, 1245004, 5497558, 4551592, -2550137, -668404, 3617436, -731218, 833224, -1264868, 830002, 3506304, 437013, 3844533, -23621784, --15449534, -3588982, -5636071, 12045236, 8269423, -1992865, 20753818, -21005074, -4908611, -7936563, -22169010, 10628433, -7303592, 8164196, 3098819, -8647917, 15307800, -16910360, 8353175, -7794829, -1309428, 1829119, -5651103, 14781130, -10408316, 9072045, -4340602, -21777632, -3620658, 15192910, --9214315, -14872398, 194347, -1864553, -22244710, -4168803, 8914205, 3773129, 11851425, 8710731, --2519535, 21378736, -5124970, -6596533, -10525891, -9804337, -9480067, 5862094, 7981660, -6894497, --7772280, 2553358, -6742025, 8959839, -2474975, 4859756, -3646964, -5568962, -4272956, -130997, --12590697, 3401077, 9073655, -2129767, 3922916, 5447629, 6442451, 11613055, -8318815, 3731790, -9059697, -1174137, -19302656, -20551418, 2261837, -1957968, 1526861, -7524246, -3122978, 1510218, --7441031, -13505525, -4124242, 10187126, 8269960, -4063576, -1642825, 3134253, 2798708, -1609002, --3275986, 244276, -427349, -5308043, -1961190, 5644124, -1615982, 4536023, 826781, -1407139, --2768643, 3646427, 3600793, 4220342, 517544, -2359011, 2460480, -6316287, -3779571, 3127810, -1472100, 2686502, 4942434, -2503966, 1039382, 1947231, 2421825, 476205, -2866354, -4134443, -1879585, -2241973, -1359357, 17055852, -10550587, -26788784, 249108, 19338628, 24639154, 4725001, --8906688, -6634114, 2647847, -4226248, -3743601, 10921028, 11052025, -5201743, 10668162, -13208635, --1509681, 9801652, -4580583, 11837467, 5619965, -1457605, -15941308, 6310381, -3637301, -3651796, -945430, -1030792, -1590749, 22212498, -10717017, 11423002, 19006304, 13276281, 7011534, 423054, --12368432, 12669080, -6875706, 12081206, -6599218, 2934000, -13012140, -2340220, -12293270, -7956427, -1986422, -11352135, -3090766, -3828427, -373125, 10478110, -12009802, -10216117, -3702799, -5778879, --2360085, -10120554, -13245679, -16489990, 1781338, 13163538, -804770, -8015483, 1480153, 2979097, -10384694, -11104638, -6390375, -3391414, -196495, 7946763, 228707, 2394444, -7718056, -3020973, -4168266, 15881178, 7107097, 11054709, 12664248, 16587701, 6461779, -1945620, -5635534, 4256850, -5155572, 7492571, 3231426, 987306, 169114, 10204842, 3710852, -3359201, 957241, 5869073, -2415382, 1668595, -3461744, -3227668, -2360085, -4612795, 514322, 5017059, 4673998, 1335198, --2480881, 6876243, 3954591, 8622684, 4505421, 610422, 5726802, 441845, -4107063, 6714645, -142808, -476205, -2224256, 1645509, -1324461, 269509, 5739150, -45168560, -21471078, 15068893, --36881956, -25567940, -1646583, -15049565, -10315438, 11253888, 12876312, 3941169, -2360622, 4659503, -36840620, -4518306, 5900748, 14176076, 16169478, -16802448, -8706972, -7960722, 13611288, 14839649, -7471096, 2726231, 13917305, -4092567, -6950868, 9756555, 18832894, 1332514, 6099391, 19129784, -14137959, 11502996, -8567923, 3616899, 5821828, -46171, -289373, 12273943, -4000762, -204011, --1213865, 8192113, 337692, -13447543, -8960912, 2681670, -18210124, 13807783, -4017942, 30522722, -1253057, 16732656, 3359738, -748398, -9808632, -491774, 3955128, -12933757, -6606197, -15107011, --1864016, 7695508, 10557030, -4610648, -24506010, 8868034, -3855270, 8347806, -8755828, -10546292, -7756711, -15935402, -12119861, 23666344, 406411, 10878615, -2180770, -10300942, 2903935, 13918915, -3455838, 11058467, -17929340, -938450, -1161789, -3028489, -15403900, 15047955, -8943733, 1055488, --1702418, 1767916, -5672041, -617938, 3235721, 4568772, -3762928, 9830643, -2372970, -3224447, --5727339, -5008469, -4932233, 4688494, -1854889, -3563749, -1397475, 1188095, -3734474, 6844568, --1997697, 7753490, -4833986, 3248606, 1282048, 3050501, 5141613, 953483, 18333604, -8333847, --21175800, 9108552, -11052561, 4655208, -266825, -10529112, 19515258, -26058640, -1062468, -31460636, -782221, 25466472, 35609036, 16865262, -6099391, 16483011, -1235877, -2254321, 1782948, -2760590, -8766028, -1050656, -16646756, 1008780, -23138600, 8186745, -7152731, -5126581, 15538118, -277562, --17790292, -19863686, 4626217, 2789045, -9906342, -8221105, 14918032, -21532818, -105227, -4308926, -7625715, -5745593, -4669167, -17213156, -7326141, -7571491, -3210488, 12492449, -14748918, 5363878, --1788854, -2507187, 1948305, 5418101, -24974162, -2602750, 3398930, -2149631, 9255655, -7812546, --11029476, -4975183, -27946816, -12271258, -12177306, 648003, 11948062, 18037788, -8490613, 13666586, --23300734, 37436008, 2575907, -6642704, 19563040, -23116050, 19634980, 8841727, -5233418, 479963, -6561637, 594316, 3149822, 17948668, -7627862, 7704098, -4123706, 5597416, 8929774, 8859444, -10744934, -3614215, 9062918, 2218888, 1375463, -1414655, -12020540, 547071, -8523363, 4028143, -5565204, -1757715, -1317481, 1704565, 1240172, 6121939, 2803540, -4259534, 6557342, 24696, -794569, 8183524, 5544803, 3346853, 14681272, -11919071, 119722, 5487895, 46708, -9327058, -2329483, -5876589, -5642514, 22841172, 1219234, -16447577, -446140, -2556043, 10551661, 6930467, --10066330, 11456825, 131533, -25838524, -28133646, -2759517, -8530342, 6929393, -1284195, -9977746, --25366076, -22127672, 11952357, -18836652, -4290673, 1122597, 5862094, 1340567, 17950816, 1450088, --9193914, 12020003, -1683627, 1708323, 11076184, -14753750, -1042603, 3131568, -15076946, 9041980, -12384538, 5381057, 11012296, 5741298, 17098264, 4639102, 12427488, -17616346, -5560909, -2850248, --23656142, -172872, -2624762, 9826348, -1652489, 11271605, -1959042, -13730474, -9390946, -748398, --21882322, 9522479, 532039, -4277788, 12684649, 8040716, 10525891, 10956462, 3297461, -1357210, -9184788, -29610042, 8904541, 3689377, 13176423, -5263483, -20943872, 13115756, -3217468, 22566296, --33394444, -11898670, -23404350, 15942919, -6866579, -21485038, -23977192, -15784542, -7135015, 7596187, -5945309, -6589554, -6852621, -3595961, -484794, -7271917, -2799782, 12178917, 1843615, -1188632, -3535832, 2647847, 2192044, 6605123, -5181341, -6823630, -215285, -11840688, -42413, -4166655, --1726577, -7646653, -2095944, -10428181, -9359807, 11793443, -6629819, -435402, 3941169, 5677947, --1028108, 9900436, -8267812, -2669322, 4076461, -9715753, -2680060, 11366631, 4070019, 2547989, --3898757, -5869073, 4386772, 15659988, 14518600, 53112104, 40129492, 5439576, 11634530, 3374234, -30830886, 854162, 15005542, -13998372, 36513664, -14457397, 33112588, -1480153, 21149492, -2451890, -14923401, -14837501, 3570192, 7471096, -8149164, -2647847, -4384088, -3411278, 9866614, 255014, --8537858, -11722039, -17737678, -22516366, -10854993, -3771518, 119185, 7118909, -19008452, 8077760, --10471130, -16091095, -3375308, -11747809, 5357435, -2837363, -24733642, -5843840, -12589086, -14853608, --15662672, 14239427, 18943490, -39637180, 8971650, 3568581, 11113765, 3976603, -5034776, 24051280, -13471702, 12609487, -33239826, -14810658, -471373, 8238821, 27456652, 1083942, -3755412, 1386738, -23251342, 20978768, -19866908, 22447110, 1617592, 5086315, -3832722, 13198435, -28304372, -9838696, -29078002, -4409858, -1943473, -11155641, 19369766, 12754442, -10096394, -16931298, -2987150, -665183, -1666984, 319975, -3696356, -15776489, -5483600, 12421582, 16130287, 10110890, -9012989, -2296197, --2688113, -7592429, 2414845, 2633889, 7413114, -1573569, -5366562, 4758287, 1732482, 2898029, -14580340, 2066416, -4164508, -5497558, 2434710, 5339718, 11328513, 2371359, -11195369, -5856725, --8432631, 3387119, 4157528, -9105868, -19662360, 6407018, -1704565, -3211025, -6943889, -11969537, -14304389, -6045704, 12428562, 19485730, -22603876, 6658810, -13034152, 36959804, -22325240, 20762408, -19112068, -7656316, -35065724, -20521890, -2575370, -9532680, -1316944, -16225850, -25623238, -33993056, --19607062, -22727356, 9405442, -19478750, 7712688, 2005213, -2492692, -2264522, -16098074, -5166846, --16530792, 4489852, 14227079, 18733574, 56371, -5616207, -16965120, -4251481, 1367947, -10191957, -2538326, -13952738, -9209484, -2232309, -13876502, 10473278, -12291660, -35685808, 1015223, -1368484, --11996917, 14821932, 11521250, 16927540, 6294275, 13262322, 27071178, 4336307, -27545236, -6484864, -12505334, -6258304, -22952842, 12385075, 17631914, 5782100, -442919, -30888332, 27040578, -1569811, -22010096, -18795850, 22291418, 55151676, -5228586, -1850594, -27393838, 14317273, -22346714, 18319646, -9109626, -12377559, -3043521, -30181808, 6561100, -16574816, -79457, 11263015, 11200738, -663036, --8076149, -6933151, 7885023, 20003274, -10178536, -1828582, 2766496, -9074729, -2920578, -3031710, -3899294, -1223529, 8153459, -4134443, -10072772, -5636608, 2584497, 7423314, -9979893, -3234647, --512175, 1085553, 6785512, 1308891, -2787434, 2315524, -16697759, -9589051, -1361505, -1732482, -3034931, 736050, 968515, -529892, -3179350, 8114804, -804233, 5994164, -762894, -2016487, --6390912, -4358855, -43503188, 14866492, -57081724, 37812356, 13590350, -9700721, 40301824, -3801583, --20410758, 35742716, -13659070, -1881733, 7626252, 12540231, 33066954, 1402307, -2596308, 23343684, -9976135, 19611358, 24033026, 17811766, 1738388, 12465606, 2064269, -1195075, -13004087, 8441758, -12669080, 3086471, -642635, -14101451, 6908455, -13208635, 16076063, 15794742, 2861522, 18651432, --11332271, 12329240, 19424526, 12352863, -25900800, -27939836, 33022930, -3143916, 20710870, 31976032, -902480, 74088, -3175055, 6321655, 18603114, 17570174, 1986959, 14601815, 168577, -16572668, --20574504, -30677878, 705985, -12435004, 608812, 17448304, 16474958, -28699508, 2639258, 11180874, --25028922, 4218195, 35241280, -15177341, -17313014, 18849000, -20047834, 4685273, -5502390, 36797668, --10506027, 22736484, -11082089, 19110456, -1604707, 7111392, 15447924, -24008868, -7124277, 9163313, --15719043, 11676405, -14086419, -3948149, -7868380, -7348152, 1229434, -3948149, -6347962, 3849365, -11134166, -5505611, 3191161, 3988414, -9281424, 1673427, 1502702, -2445447, -6500970, -2775623, --4972499, -15440944, -5918465, 3302830, -20055350, 7327751, -10174778, 7810935, -4505958, -1975148, --13998909, -7441031, 388158, 3913789, -6060199, -13878650, 2527052, 926639, 7657927, 3175592, -235686, 8994198, 7451232, 741956, 4134980, -19990388, 4418448, -23153632, 47499652, 11634530, --25421912, 9633612, -5933498, -22623740, -26669600, -27048094, 7957501, -1351841, 23801098, 35346508, -16949552, 8551280, -4334159, 11728482, 1069984, -44521632, 19464254, 46213848, -30325154, -31825170, --27540404, -38896296, 28056336, -38300372, 17164300, 228707, -4861366, -270046, -12510703, -14829985, -18920942, -39402028, 40403832, 23207318, 5290863, -25933550, -19666118, -17185238, 3539053, 6736656, --16854526, -2348810, -12471511, 27849104, 12540768, -5064304, -942745, 11432666, 2474975, 13053479, --22899692, -9062381, -2289755, -4073240, -21312702, -14958297, 12487617, -40365712, -23906862, 3034395, -47035260, 22715008, -14485314, -1001801, -35965520, 17403744, 54569172, 1897302, -11889006, -8257612, --25961466, 33652680, -10966662, -13050795, -1270774, 19935090, 12403866, -17352742, -15759846, -5611912, -17448304, -4722317, 5005785, -1400696, -14115947, -4555350, 22138946, 12739410, 1671279, -10366977, --1808718, -1590212, 17223892, 14136885, 6920803, 6377490, -20781200, 7872138, 7257958, -3098282, -4510253, -3235721, -3118146, -18060874, -2089502, -929324, -2729989, -5763309, 4665408, 6622303, -3299072, -21230024, -18451180, -8997420, -242666, 1302449, -21604222, 7652558, 26739392, 5443871, --7656316, 526134, 3985193, 108985, -37044, -22217866, -15334644, -44321916, 9574556, -32682016, --48816060, 11355357, 26852136, 6536940, 7144141, -20718922, -25885768, -6799470, -38308960, -18880676, -9895068, -32085554, 50302656, 9711995, -12469364, 10735271, -24237038, -47831440, -16098611, -36607616, -5706401, 10562398, -13480829, -26068840, -13257490, -16124918, 13914083, -19154480, -7041062, -2580202, -21473762, -15706159, -2942053, -7404524, 5418638, 8901320, 1549410, -6561100, 22157200, 28980828, -18514530, -15013058, -12299176, -42909944, -23907398, -9900436, 11244224, 71781792, -12376485, 725313, -31920734, -3027415, 13543642, -16478179, -17115444, -13892072, 15098958, -40718436, 216896, -5509906, --607201, 34997540, -15534360, 53043920, 4618164, 40164924, -51446192, -15537044, 14774151, -1154273, --22369800, -18911814, 41601592, -43105364, -35529580, 51007568, 8932995, 44268228, -17715666, -3095061, --3158949, 14151380, 6040335, -4214437, 15052250, 15005542, -884226, 6981470, 4711043, 1457068, --5315022, -9710921, -2234994, -6475200, -8529268, 7748121, 4539244, -7327214, 5103495, -15831786, --1586454, 10934450, 19315542, -1698123, -12227235, -1070521, -13909788, 7795366, 13276818, -9422085, --7646116, 7324530, 8857296, -19969988, 7087770, 729608, 12932683, -8576513, -8687108, -241592, -4112431, 5879274, -22292490, 3479461, -9429064, 17550846, -6140730, -2648384, -44131324, 20992726, -32353452, -23495618, -19319300, -6614787, -21219822, -25556130, 6799470, 7539278, 19821274, 858993, -17316234, 30840012, 32170378, 21351894, 7367480, -23620172, 2292439, 12263742, 16255377, 25020868, -232465, -12967043, -18882286, -7130183, 25349434, -10424422, 9946607, 22047678, 2131915, 43330852, -4952634, -27666032, 23860690, 23605140, 6761889, 10177462, 21856552, 3500398, 1804423, -25386478, -54788212, -58460412, -43036108, -49867256, -16571058, 10324028, -29379186, 15066745, 32642826, -9692667, -3135326, 28851980, 9142375, -31241056, -10925323, -24174224, -3547643, 1814624, 1508070, 27902792, -27331562, -6286222, -7013145, 17536888, 42126648, 7347616, 34637836, -29272350, 30775052, -13522705, -10129680, -6152004, -19807852, -13683229, -3235721, 14003204, 8445516, 34478924, -44704168, 22717692, --17769354, -10984916, -8821863, 16540456, -7995619, -1522566, 3447785, -17851494, 11049340, -8722542, --761283, -13544716, 4032974, -2720862, 428960, -15256261, 2093260, -1376000, 2871723, -1468879, --16846472, 6681359, -9682467, -8612483, -4131222, 12447889, 14176613, 15921981, -13848048, 27352500, --20811264, -6180995, 1333051, -2196339, -15452755, -8147016, -1123671, -11375758, 3010235, -903554, --755377, -1317481, -11545409, 1496796, -2158758, -24957518, -50216756, -50544248, -36580236, 7511898, -93910536, 23737210, -12948790, -28388124, -67853504, -95444912, 21553756, 39535712, 47460464, -9982578, -4117263, -27984934, -48688288, 14042932, 8844948, 15847356, 2294050, -40832256, -12472585, 9980430, --8205535, -1608465, -7721815, 53209812, 46726560, 31507880, -2878702, -22835804, -38783556, -25672630, --23206246, 36347772, -6017786, 26598196, 12032888, 12458090, -16345572, -88406536, -60863980, 30061012, --47890496, -16342351, 102009232, 70140040, 52707300, -39944268, 28872380, -27664422, 2032056, 2030983, -14812805, 43272868, 76263584, -29189672, -2709588, -50273664, -40613748, -66535484, 7232725, -2739652, --71636832, -17155174, 46163384, 17257178, 32225140, 43673376, 78692392, -57303992, -34386044, 4562329, --46768972, -6016713, 26175678, 61300996, 31173946, 9584220, -37382320, -35842040, 24224690, -10193568, -36138392, 31774168, -8553427, 14567992, 5865852, -6090264, -11994770, -6975027, -4509179, 10809896, -3153580, -251792, 3781719, -1094680, 5240934, 169114, 22886270, 18822158, 29824790, 5398237, --16342351, -34441344, -28130962, 11494406, 26805964, 30706332, -3809636, -19563040, -79255032, -40711460, --37497212, 940598, 4059818, 8144869, -238371, 5950141, -8933532, 4295, -13240847, -11832635, -16818018, 14847165, 8651138, 8740258, 4418448, 2033667, 23262616, -37721088, -124932008, -116255640, --66723928, -72566160, -18080738, 120370752, 61170536, 123842160, 109904456, 172254496, 123032560, 105828528, -17095044, -45919104, -103823320, -166393472, -141293680, -142310528, -74359840, -35695472, -8359080, 1201517, -4119411, 29395830, 39298412, 99050000, 60176248, 116887536, 76168024, 100197296, 36280124, 96815544, -33664492, 23692114, 22945326, -5750425, -27140972, -65525096, -75586592, -140383152, -96135328, -177893792, --140714944, -215911760, -127972848, -101573296, -24471114, 59337656, 31598074, 5333276, 59273768, 126608120, -169169632, 221744864, 264361136, 226169760, 165264976, 206039776, 170046880, 95297272, 42902964, -10572062, --70841192, -164007616, -194742944, -260862352, -336744224, -389762912, -351673536, -309996768, -220571808, -150638992, -46195056, 145269760, 177118016, 272665984, 227720784, 284360128, 298912544, 293163744, 338026272, 221853312, -57685704, -55870008, -108266464, -134084048, -86757800, -125577328, -107594840, -125680408, -170003392, -172029552, --200196480, -118600688, -92260192, -78731584, -43933756, -2707977, 11866458, 48595408, 132080448, 139081776, -197581376, 171901776, 225963056, 166077792, 111059800, 114491480, 43718472, -30105036, -48995912, -217961008, --280880672, -261649952, -230791136, -135231344, -106036840, -58089432, 5114233, 58809912, 89801320, 121946472, -145718576, 173156432, 164531072, 155421984, 136944496, 76417128, -304406, -38872676, -90344104, -94649272, --80968720, -66227320, -68890736, -69854960, -54808076, -39465380, -23320062, -9865003, -8927090, -6482717, -1961190, -6857989, -7970386, 9463424, 22465900, 24951076, 16435229, 11529303, 19292456, 23252416, -17068200, 15530602, 14453102, 9055402, 6154152, 5211943, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +5064840, -6513318, 790274, -2760590, -862752, 2532957, -4039417, -7337952, -1877438, 619549, +-4208531, -2426657, 3556770, -2112587, 1644436, -9188009, -791348, 6214281, 3308199, -10279467, +-3543348, -2697776, -2734284, 3470334, -1503775, -5354751, -3367791, -3828427, -3900904, 6772090, +2113124, 4361540, -2831994, 5729487, 5203353, 3711389, -2066953, -4863514, -3825742, 403727, +964757, 7794829, 2758443, 1483374, -3677566, 847182, 331249, 891743, 3083787, 1830193, +-5298916, -4500052, -2331630, 2849174, 657667, -996969, -5664525, -1729261, 2213519, 2563559, +-2289755, -862752, 119722, 2714956, -592169, -2993592, -3758, 433255, -3868155, 8221641, +509491, -5576478, -16643, -857383, 5268851, 426812, 3562675, 4934381, 1839857, -333397, +228170, -1787780, -1178969, -1187022, 3121368, -1005559, -417686, -1409286, 1067836, 383863, +-621697, -122943, -833224, 171262, -134755, 643171, 621160, 1054951, -5645198, -5108327, +5800890, 5320928, -4297115, 3205656, 324807, 1654636, -14120779, 5468030, -2095407, -9640591, +-12573517, 344671, 9098351, 555661, 5900748, 226560, -11370926, -3919158, 1316408, 3986267, +-1998234, -965831, -4784057, 642635, -864362, 8048232, 4092567, 1716913, 1449015, 2193118, +2798171, 7339026, 4449586, -6467684, -542777, 1514513, 1574642, -7694434, 2513630, -2282238, +-4864588, -1370632, -198105, 5277978, 1363115, -2936684, 5345624, 8326868, -1753957, -3147674, +2020782, -587874, 4558034, 4645007, 3640522, -5554467, -4224101, 3997004, -1673964, -1389422, +-4255776, 469225, -6325413, 3780645, 3411278, 4472672, 1159641, 5196911, -5604396, -3521336, +7303592, 388158, 2716567, 8616241, 3340948, 853625, -3453691, 5056787, 621697, -2556043, +1459215, -6081674, 188979, -635655, 923418, 1640141, -678068, -2706903, -1469953, -436476, +1344325, 1248225, 438087, -744640, 761820, 1723893, 322659, -564251, 7201050, 649077, +2796024, -6038187, -5127117, 2956548, -1412507, -2199560, -2798708, -2615635, 2196339, -6988449, +-4002373, -8633421, -10377178, -1908576, 8660265, 5590974, -3481071, -958851, -1189706, -1998770, +-7471096, 5405217, -1866700, -1907502, 484794, 3538516, -1674500, 328028, -247497, 5117991, +-4705674, 5134097, 2805151, 6152541, -2082522, 4763656, 2121177, -2920578, 4290673, -2887292, +2474438, 4565550, -3423089, 4794257, -2843268, -2286533, -712428, -1397475, 2415382, -1375463, +-3624416, 1477469, -3145527, 708670, 438087, 508417, 7213398, 1416802, -1648194, 57445, +-2946348, -4105452, 2138357, -976031, 6885370, 7030862, 2851858, -1930051, -1075889, -32749, +-2757906, -3180960, 3544422, 5576478, 185220, -587337, 3425237, 3706557, -476205, 1321239, +1190243, -2663417, 2548526, -468688, 3655017, -1792075, -694711, -119722, -1516124, -147640, +2662880, -563714, 807991, 798327, -1878511, 608275, -343597, -360240, 760746, 715649, +-1203128, 1391569, -464930, -570157, 99858, -134755, -227096, -1077500, -816044, 13702019, +-5815923, 5609764, -7005092, -5894306, 15569, -1646046, -1500554, 1897839, -2953864, 5917391, +5774584, 4944044, -1500017, -660888, -2594160, -6344741, 978179, -3817689, -714038, 679679, +-2130304, 3592203, 1354525, -447750, -10458782, -4377109, -6594923, 231928, -4317516, -6638946, +-2911451, -3675418, -4057134, 6578280, -5276368, 4632122, 396211, -1886564, 2596845, 2221035, +-4729833, -1309965, 91805, 5076115, -490163, -6978248, -8837969, -9211094, 2388002, -3375308, +198105, -745177, 1326608, 3091303, 5107790, -3547643, -1872606, 1665911, 1755568, 637803, +6408091, -3602941, 3962644, -7380365, 14431090, 1757179, -1536525, 2788508, 1381906, 2742337, +-4010963, -724239, 1097364, -462246, -861678, -7299834, -2418604, -4966593, -1469953, -596464, +-3564823, -3505767, 2597382, 3011309, 928787, 578747, -326418, 2542084, 1511292, 2921115, +-1462436, 243203, 100395, 2683281, -1072668, -174483, -153545, 285615, -2124398, 510564, +-1533303, 765041, 1091995, -526670, -1784022, 344671, 570157, -569620, -602369, -1948305, +528818, -239981, -967978, 1207960, 1425392, -192200, -6662568, 1022202, 1291175, 492311, +-1013075, -3969624, 2436857, 1960116, -6014028, 7165616, -8830453, 10998874, -1028108, 3702262, +1661079, -176631, -1133871, 2300492, 10310069, 11560978, -2161979, 2120103, -1343251, -1587527, +1570347, 2491618, 7939247, -954557, 2436320, -3947612, 4372814, 1008780, 6269042, 3063386, +5874979, -8358007, 3590056, 3113315, -2601677, -38118, 6374805, 77309, 541166, 1976222, +3896609, -1256278, -501974, 12261058, 5856725, 1132798, 1158031, -2501282, 5590974, -7327751, +-10766409, -13038984, -759136, 6933151, -165356, 3482145, 9352291, 3728569, -1601486, -3222836, +5007932, -913217, 12012487, 5428302, 1821066, 1722819, -6484864, 1438277, 4977330, -2461016, +-7307350, 1341640, 2691871, -270583, -2508261, -888521, 1297617, -2339684, 1429687, 1411434, +1296006, -425739, 1488743, -2295660, -2137820, -671089, -1340030, 798864, -2145873, 1316408, +2199023, 1462436, 1670205, 1673427, 559956, 1090385, -2976412, -2506114, -904628, -1293322, +-1532230, -281320, 1060857, 606664, -61203, 1940252, 1075889, -99858, 2437931, 1530082, +-15933792, 1724966, -1189706, 10956462, -8174397, 4817880, -16872242, 6664179, -1577327, -8591008, +-9440338, -6598681, 5060009, 3957276, 12836047, 1719598, 4287451, 12288975, -2114735, -8908299, +1358820, -6859063, 1700807, 10024991, 1879585, -2784213, -1171989, -1893007, 2961380, 3897146, +-804770, 2612951, 5174899, -3194382, 1652489, -6025839, -449361, -7546795, -1167694, 1058173, +-3570729, 5612986, 3835406, 4787815, 9511742, 634045, 11507291, 8822937, 4272419, -5946382, +13193603, 5698348, 2333241, 11575474, -1248225, 287763, 979789, 3861713, -2390686, -3342558, +-7895224, -7626788, -6231998, 99858, -4914517, 10162429, -6092411, 4223027, 6338835, -3519189, +338229, -2871186, -1686312, -9919764, -11381663, 5245229, -1975685, -3787088, -3368865, 1010391, +1342177, 807991, 2239289, -3942780, 9324911, 695785, 2809446, -1869921, 524523, 2815888, +-4536559, 1574106, 179315, 1614371, 2115808, 32749, 1653026, 3229279, 9664, 964757, +2295123, 2579128, 3297998, -89657, 565862, -1637456, -469762, 220654, -788127, -2334852, +169114, -634045, -1033477, 317828, 13381507, 539555, 192200, -1204202, -2579128, 2429341, +585189, -6781754, -8699993, -11800960, -6170258, -12348568, -7842074, -4186519, -9131637, -5762773, +-3978214, -4730907, -12355010, 8524973, 5348845, 345208, 4503810, 2087354, -3413425, 15406048, +970126, -5281736, -2765959, -10390600, -4459787, 11481521, 579284, -9575093, -9582072, 1432909, +-9699647, 3148748, 3429532, -7538742, 319975, 2400887, 557272, 11303817, 3394635, -5110474, +1157494, -6133750, 5707475, 846109, 2537789, -13743358, 9521942, -4698158, 3978214, 357556, +1861332, 2301566, 373125, -3973919, -299574, -5341329, 28991, -10823854, -42413, -11679090, +15469398, -2586107, 9848360, -7187091, -3363496, -1509681, -7443179, -4122632, 6054294, -172336, +-213675, 4519380, 5820755, 975494, 9494025, 8249559, 11414949, 6116571, 2440078, 1438277, +5193153, 2812130, 1740536, 2154463, 1191317, 2590939, -696858, 4201552, 745177, -214212, +-852014, 3286187, 1336809, 2355253, 1176284, -1464047, 1126892, 1332514, 1094143, -2446521, +4798016, 2631741, -439160, -3587372, -374736, -489089, -2596308, 1015760, 501437, 2778844, +-2208687, -4973036, -6855842, -35433, 5032091, -13160854, -10737, -5692979, -4558571, 9308268, +-15178951, -14338748, 3729642, 19103478, 484258, 1810866, 1464047, -2918967, 10458782, 10154376, +5864241, 2876018, -2761127, -15540265, 9202504, 71941, -12451110, -4022237, 2880313, -635655, +98247, 1265405, -3003256, -12261595, -696858, 494458, -2246805, -5127117, 3670587, 10622528, +-13720273, 8524973, -5148592, -2589865, 807454, 6762963, 22275312, -14418205, -3639985, 1407139, +-1437203, -2645163, 727997, -5532455, 1913945, -4997195, 15311022, 5260798, 2860985, 4219806, +-3247532, -892279, 8099772, -1282585, 3514894, -6750615, 11751031, 514859, -8335995, 16441135, +-10492068, 7565585, 2147484, 3727495, 11951820, -4776541, 5082557, -590558, 12348, 1433982, +-812823, -8083129, -4289599, -527744, -3581466, -1275605, -1957431, -4961761, -5074504, -3810173, +2347200, -4345970, 2486786, -1167694, -190052, -3814468, -2616172, -2816425, 2225330, -5263483, +514859, 500364, 3177739, 4983773, -1970853, -958315, -4507568, -3847217, 255551, -3385508, +936840, -634581, -3003256, 47782, -920197, 1351304, 1783485, -1262720, 16307991, 1283122, +4259534, 4844723, -2718178, -9373766, -7347079, 1136556, 16314433, 9251360, 2018098, -14571213, +2113124, -8010114, 60130, 16321413, 15700790, 7933879, 10617159, -9558987, -19801946, -10366977, +-14267881, 7927436, -128312, -2405719, -40802, -10799695, -3194919, 3351148, -2016487, -4099010, +-3980361, 11566347, -732292, 3152506, -3270081, 7585449, 1622424, -4365835, -9176198, -7054484, +20940650, -894427, -4714264, 6691559, -11938935, 3755949, -6825240, -20885352, -4668630, -2712272, +6342056, 2428267, 5574331, 1769527, 8286603, 315143, 594853, 4581120, -20397336, -3221226, +-5463736, -1453846, 2004676, 11729556, 12975633, 4672925, -3367254, -8928163, -11710765, -3935801, +-6880001, 1482301, -3409667, -3655554, -8056822, 12093554, 8739185, 3544959, 11144366, -2644626, +4466229, 6822019, -4316442, 4064113, -2770791, 891206, 4082903, -1232656, -2661269, -1116155, +-1456531, -1054951, -64961, 275415, 4048007, 163209, 509491, 1235877, -2202245, -6179384, +280247, -1439888, -770947, -1117765, -3604551, -412317, 1245004, 5497558, 4551592, -2550137, +668404, 3617436, -731218, 833224, -1264868, 830002, 3506304, 437013, 3844533, -23621784, +-15449534, -3588982, -5636071, 12045236, 8269423, -1992865, 20753818, -21005074, -4908611, -7936563, +22169010, 10628433, -7303592, 8164196, 3098819, -8647917, 15307800, -16910360, 8353175, -7794829, +1309428, 1829119, -5651103, 14781130, -10408316, 9072045, -4340602, -21777632, -3620658, 15192910, +-9214315, -14872398, 194347, -1864553, -22244710, -4168803, 8914205, 3773129, 11851425, 8710731, +-2519535, 21378736, -5124970, -6596533, -10525891, -9804337, -9480067, 5862094, 7981660, -6894497, +-7772280, 2553358, -6742025, 8959839, -2474975, 4859756, -3646964, -5568962, -4272956, -130997, +-12590697, 3401077, 9073655, -2129767, 3922916, 5447629, 6442451, 11613055, -8318815, 3731790, +9059697, -1174137, -19302656, -20551418, 2261837, -1957968, 1526861, -7524246, -3122978, 1510218, +-7441031, -13505525, -4124242, 10187126, 8269960, -4063576, -1642825, 3134253, 2798708, -1609002, +-3275986, 244276, -427349, -5308043, -1961190, 5644124, -1615982, 4536023, 826781, -1407139, +-2768643, 3646427, 3600793, 4220342, 517544, -2359011, 2460480, -6316287, -3779571, 3127810, +1472100, 2686502, 4942434, -2503966, 1039382, 1947231, 2421825, 476205, -2866354, -4134443, +1879585, -2241973, -1359357, 17055852, -10550587, -26788784, 249108, 19338628, 24639154, 4725001, +-8906688, -6634114, 2647847, -4226248, -3743601, 10921028, 11052025, -5201743, 10668162, -13208635, +-1509681, 9801652, -4580583, 11837467, 5619965, -1457605, -15941308, 6310381, -3637301, -3651796, +945430, -1030792, -1590749, 22212498, -10717017, 11423002, 19006304, 13276281, 7011534, 423054, +-12368432, 12669080, -6875706, 12081206, -6599218, 2934000, -13012140, -2340220, -12293270, -7956427, +1986422, -11352135, -3090766, -3828427, -373125, 10478110, -12009802, -10216117, -3702799, -5778879, +-2360085, -10120554, -13245679, -16489990, 1781338, 13163538, -804770, -8015483, 1480153, 2979097, +10384694, -11104638, -6390375, -3391414, -196495, 7946763, 228707, 2394444, -7718056, -3020973, +4168266, 15881178, 7107097, 11054709, 12664248, 16587701, 6461779, -1945620, -5635534, 4256850, +5155572, 7492571, 3231426, 987306, 169114, 10204842, 3710852, -3359201, 957241, 5869073, +2415382, 1668595, -3461744, -3227668, -2360085, -4612795, 514322, 5017059, 4673998, 1335198, +-2480881, 6876243, 3954591, 8622684, 4505421, 610422, 5726802, 441845, -4107063, 6714645, +142808, -476205, -2224256, 1645509, -1324461, 269509, 5739150, -45168560, -21471078, 15068893, +-36881956, -25567940, -1646583, -15049565, -10315438, 11253888, 12876312, 3941169, -2360622, 4659503, +36840620, -4518306, 5900748, 14176076, 16169478, -16802448, -8706972, -7960722, 13611288, 14839649, +7471096, 2726231, 13917305, -4092567, -6950868, 9756555, 18832894, 1332514, 6099391, 19129784, +14137959, 11502996, -8567923, 3616899, 5821828, -46171, -289373, 12273943, -4000762, -204011, +-1213865, 8192113, 337692, -13447543, -8960912, 2681670, -18210124, 13807783, -4017942, 30522722, +1253057, 16732656, 3359738, -748398, -9808632, -491774, 3955128, -12933757, -6606197, -15107011, +-1864016, 7695508, 10557030, -4610648, -24506010, 8868034, -3855270, 8347806, -8755828, -10546292, +7756711, -15935402, -12119861, 23666344, 406411, 10878615, -2180770, -10300942, 2903935, 13918915, +3455838, 11058467, -17929340, -938450, -1161789, -3028489, -15403900, 15047955, -8943733, 1055488, +-1702418, 1767916, -5672041, -617938, 3235721, 4568772, -3762928, 9830643, -2372970, -3224447, +-5727339, -5008469, -4932233, 4688494, -1854889, -3563749, -1397475, 1188095, -3734474, 6844568, +-1997697, 7753490, -4833986, 3248606, 1282048, 3050501, 5141613, 953483, 18333604, -8333847, +-21175800, 9108552, -11052561, 4655208, -266825, -10529112, 19515258, -26058640, -1062468, -31460636, +782221, 25466472, 35609036, 16865262, -6099391, 16483011, -1235877, -2254321, 1782948, -2760590, +8766028, -1050656, -16646756, 1008780, -23138600, 8186745, -7152731, -5126581, 15538118, -277562, +-17790292, -19863686, 4626217, 2789045, -9906342, -8221105, 14918032, -21532818, -105227, -4308926, +7625715, -5745593, -4669167, -17213156, -7326141, -7571491, -3210488, 12492449, -14748918, 5363878, +-1788854, -2507187, 1948305, 5418101, -24974162, -2602750, 3398930, -2149631, 9255655, -7812546, +-11029476, -4975183, -27946816, -12271258, -12177306, 648003, 11948062, 18037788, -8490613, 13666586, +-23300734, 37436008, 2575907, -6642704, 19563040, -23116050, 19634980, 8841727, -5233418, 479963, +6561637, 594316, 3149822, 17948668, -7627862, 7704098, -4123706, 5597416, 8929774, 8859444, +10744934, -3614215, 9062918, 2218888, 1375463, -1414655, -12020540, 547071, -8523363, 4028143, +5565204, -1757715, -1317481, 1704565, 1240172, 6121939, 2803540, -4259534, 6557342, 24696, +794569, 8183524, 5544803, 3346853, 14681272, -11919071, 119722, 5487895, 46708, -9327058, +2329483, -5876589, -5642514, 22841172, 1219234, -16447577, -446140, -2556043, 10551661, 6930467, +-10066330, 11456825, 131533, -25838524, -28133646, -2759517, -8530342, 6929393, -1284195, -9977746, +-25366076, -22127672, 11952357, -18836652, -4290673, 1122597, 5862094, 1340567, 17950816, 1450088, +-9193914, 12020003, -1683627, 1708323, 11076184, -14753750, -1042603, 3131568, -15076946, 9041980, +12384538, 5381057, 11012296, 5741298, 17098264, 4639102, 12427488, -17616346, -5560909, -2850248, +-23656142, -172872, -2624762, 9826348, -1652489, 11271605, -1959042, -13730474, -9390946, -748398, +-21882322, 9522479, 532039, -4277788, 12684649, 8040716, 10525891, 10956462, 3297461, -1357210, +9184788, -29610042, 8904541, 3689377, 13176423, -5263483, -20943872, 13115756, -3217468, 22566296, +-33394444, -11898670, -23404350, 15942919, -6866579, -21485038, -23977192, -15784542, -7135015, 7596187, +5945309, -6589554, -6852621, -3595961, -484794, -7271917, -2799782, 12178917, 1843615, -1188632, +3535832, 2647847, 2192044, 6605123, -5181341, -6823630, -215285, -11840688, -42413, -4166655, +-1726577, -7646653, -2095944, -10428181, -9359807, 11793443, -6629819, -435402, 3941169, 5677947, +-1028108, 9900436, -8267812, -2669322, 4076461, -9715753, -2680060, 11366631, 4070019, 2547989, +-3898757, -5869073, 4386772, 15659988, 14518600, 53112104, 40129492, 5439576, 11634530, 3374234, +30830886, 854162, 15005542, -13998372, 36513664, -14457397, 33112588, -1480153, 21149492, -2451890, +14923401, -14837501, 3570192, 7471096, -8149164, -2647847, -4384088, -3411278, 9866614, 255014, +-8537858, -11722039, -17737678, -22516366, -10854993, -3771518, 119185, 7118909, -19008452, 8077760, +-10471130, -16091095, -3375308, -11747809, 5357435, -2837363, -24733642, -5843840, -12589086, -14853608, +-15662672, 14239427, 18943490, -39637180, 8971650, 3568581, 11113765, 3976603, -5034776, 24051280, +13471702, 12609487, -33239826, -14810658, -471373, 8238821, 27456652, 1083942, -3755412, 1386738, +23251342, 20978768, -19866908, 22447110, 1617592, 5086315, -3832722, 13198435, -28304372, -9838696, +29078002, -4409858, -1943473, -11155641, 19369766, 12754442, -10096394, -16931298, -2987150, -665183, +1666984, 319975, -3696356, -15776489, -5483600, 12421582, 16130287, 10110890, -9012989, -2296197, +-2688113, -7592429, 2414845, 2633889, 7413114, -1573569, -5366562, 4758287, 1732482, 2898029, +14580340, 2066416, -4164508, -5497558, 2434710, 5339718, 11328513, 2371359, -11195369, -5856725, +-8432631, 3387119, 4157528, -9105868, -19662360, 6407018, -1704565, -3211025, -6943889, -11969537, +14304389, -6045704, 12428562, 19485730, -22603876, 6658810, -13034152, 36959804, -22325240, 20762408, +19112068, -7656316, -35065724, -20521890, -2575370, -9532680, -1316944, -16225850, -25623238, -33993056, +-19607062, -22727356, 9405442, -19478750, 7712688, 2005213, -2492692, -2264522, -16098074, -5166846, +-16530792, 4489852, 14227079, 18733574, 56371, -5616207, -16965120, -4251481, 1367947, -10191957, +2538326, -13952738, -9209484, -2232309, -13876502, 10473278, -12291660, -35685808, 1015223, -1368484, +-11996917, 14821932, 11521250, 16927540, 6294275, 13262322, 27071178, 4336307, -27545236, -6484864, +12505334, -6258304, -22952842, 12385075, 17631914, 5782100, -442919, -30888332, 27040578, -1569811, +22010096, -18795850, 22291418, 55151676, -5228586, -1850594, -27393838, 14317273, -22346714, 18319646, +9109626, -12377559, -3043521, -30181808, 6561100, -16574816, -79457, 11263015, 11200738, -663036, +-8076149, -6933151, 7885023, 20003274, -10178536, -1828582, 2766496, -9074729, -2920578, -3031710, +3899294, -1223529, 8153459, -4134443, -10072772, -5636608, 2584497, 7423314, -9979893, -3234647, +-512175, 1085553, 6785512, 1308891, -2787434, 2315524, -16697759, -9589051, -1361505, -1732482, +3034931, 736050, 968515, -529892, -3179350, 8114804, -804233, 5994164, -762894, -2016487, +-6390912, -4358855, -43503188, 14866492, -57081724, 37812356, 13590350, -9700721, 40301824, -3801583, +-20410758, 35742716, -13659070, -1881733, 7626252, 12540231, 33066954, 1402307, -2596308, 23343684, +9976135, 19611358, 24033026, 17811766, 1738388, 12465606, 2064269, -1195075, -13004087, 8441758, +12669080, 3086471, -642635, -14101451, 6908455, -13208635, 16076063, 15794742, 2861522, 18651432, +-11332271, 12329240, 19424526, 12352863, -25900800, -27939836, 33022930, -3143916, 20710870, 31976032, +902480, 74088, -3175055, 6321655, 18603114, 17570174, 1986959, 14601815, 168577, -16572668, +-20574504, -30677878, 705985, -12435004, 608812, 17448304, 16474958, -28699508, 2639258, 11180874, +-25028922, 4218195, 35241280, -15177341, -17313014, 18849000, -20047834, 4685273, -5502390, 36797668, +-10506027, 22736484, -11082089, 19110456, -1604707, 7111392, 15447924, -24008868, -7124277, 9163313, +-15719043, 11676405, -14086419, -3948149, -7868380, -7348152, 1229434, -3948149, -6347962, 3849365, +11134166, -5505611, 3191161, 3988414, -9281424, 1673427, 1502702, -2445447, -6500970, -2775623, +-4972499, -15440944, -5918465, 3302830, -20055350, 7327751, -10174778, 7810935, -4505958, -1975148, +-13998909, -7441031, 388158, 3913789, -6060199, -13878650, 2527052, 926639, 7657927, 3175592, +235686, 8994198, 7451232, 741956, 4134980, -19990388, 4418448, -23153632, 47499652, 11634530, +-25421912, 9633612, -5933498, -22623740, -26669600, -27048094, 7957501, -1351841, 23801098, 35346508, +16949552, 8551280, -4334159, 11728482, 1069984, -44521632, 19464254, 46213848, -30325154, -31825170, +-27540404, -38896296, 28056336, -38300372, 17164300, 228707, -4861366, -270046, -12510703, -14829985, +18920942, -39402028, 40403832, 23207318, 5290863, -25933550, -19666118, -17185238, 3539053, 6736656, +-16854526, -2348810, -12471511, 27849104, 12540768, -5064304, -942745, 11432666, 2474975, 13053479, +-22899692, -9062381, -2289755, -4073240, -21312702, -14958297, 12487617, -40365712, -23906862, 3034395, +47035260, 22715008, -14485314, -1001801, -35965520, 17403744, 54569172, 1897302, -11889006, -8257612, +-25961466, 33652680, -10966662, -13050795, -1270774, 19935090, 12403866, -17352742, -15759846, -5611912, +17448304, -4722317, 5005785, -1400696, -14115947, -4555350, 22138946, 12739410, 1671279, -10366977, +-1808718, -1590212, 17223892, 14136885, 6920803, 6377490, -20781200, 7872138, 7257958, -3098282, +4510253, -3235721, -3118146, -18060874, -2089502, -929324, -2729989, -5763309, 4665408, 6622303, +3299072, -21230024, -18451180, -8997420, -242666, 1302449, -21604222, 7652558, 26739392, 5443871, +-7656316, 526134, 3985193, 108985, -37044, -22217866, -15334644, -44321916, 9574556, -32682016, +-48816060, 11355357, 26852136, 6536940, 7144141, -20718922, -25885768, -6799470, -38308960, -18880676, +9895068, -32085554, 50302656, 9711995, -12469364, 10735271, -24237038, -47831440, -16098611, -36607616, +5706401, 10562398, -13480829, -26068840, -13257490, -16124918, 13914083, -19154480, -7041062, -2580202, +21473762, -15706159, -2942053, -7404524, 5418638, 8901320, 1549410, -6561100, 22157200, 28980828, +18514530, -15013058, -12299176, -42909944, -23907398, -9900436, 11244224, 71781792, -12376485, 725313, +31920734, -3027415, 13543642, -16478179, -17115444, -13892072, 15098958, -40718436, 216896, -5509906, +-607201, 34997540, -15534360, 53043920, 4618164, 40164924, -51446192, -15537044, 14774151, -1154273, +-22369800, -18911814, 41601592, -43105364, -35529580, 51007568, 8932995, 44268228, -17715666, -3095061, +-3158949, 14151380, 6040335, -4214437, 15052250, 15005542, -884226, 6981470, 4711043, 1457068, +-5315022, -9710921, -2234994, -6475200, -8529268, 7748121, 4539244, -7327214, 5103495, -15831786, +-1586454, 10934450, 19315542, -1698123, -12227235, -1070521, -13909788, 7795366, 13276818, -9422085, +-7646116, 7324530, 8857296, -19969988, 7087770, 729608, 12932683, -8576513, -8687108, -241592, +4112431, 5879274, -22292490, 3479461, -9429064, 17550846, -6140730, -2648384, -44131324, 20992726, +32353452, -23495618, -19319300, -6614787, -21219822, -25556130, 6799470, 7539278, 19821274, 858993, +17316234, 30840012, 32170378, 21351894, 7367480, -23620172, 2292439, 12263742, 16255377, 25020868, +232465, -12967043, -18882286, -7130183, 25349434, -10424422, 9946607, 22047678, 2131915, 43330852, +4952634, -27666032, 23860690, 23605140, 6761889, 10177462, 21856552, 3500398, 1804423, -25386478, +54788212, -58460412, -43036108, -49867256, -16571058, 10324028, -29379186, 15066745, 32642826, -9692667, +3135326, 28851980, 9142375, -31241056, -10925323, -24174224, -3547643, 1814624, 1508070, 27902792, +27331562, -6286222, -7013145, 17536888, 42126648, 7347616, 34637836, -29272350, 30775052, -13522705, +10129680, -6152004, -19807852, -13683229, -3235721, 14003204, 8445516, 34478924, -44704168, 22717692, +-17769354, -10984916, -8821863, 16540456, -7995619, -1522566, 3447785, -17851494, 11049340, -8722542, +-761283, -13544716, 4032974, -2720862, 428960, -15256261, 2093260, -1376000, 2871723, -1468879, +-16846472, 6681359, -9682467, -8612483, -4131222, 12447889, 14176613, 15921981, -13848048, 27352500, +-20811264, -6180995, 1333051, -2196339, -15452755, -8147016, -1123671, -11375758, 3010235, -903554, +-755377, -1317481, -11545409, 1496796, -2158758, -24957518, -50216756, -50544248, -36580236, 7511898, +93910536, 23737210, -12948790, -28388124, -67853504, -95444912, 21553756, 39535712, 47460464, -9982578, +4117263, -27984934, -48688288, 14042932, 8844948, 15847356, 2294050, -40832256, -12472585, 9980430, +-8205535, -1608465, -7721815, 53209812, 46726560, 31507880, -2878702, -22835804, -38783556, -25672630, +-23206246, 36347772, -6017786, 26598196, 12032888, 12458090, -16345572, -88406536, -60863980, 30061012, +-47890496, -16342351, 102009232, 70140040, 52707300, -39944268, 28872380, -27664422, 2032056, 2030983, +14812805, 43272868, 76263584, -29189672, -2709588, -50273664, -40613748, -66535484, 7232725, -2739652, +-71636832, -17155174, 46163384, 17257178, 32225140, 43673376, 78692392, -57303992, -34386044, 4562329, +-46768972, -6016713, 26175678, 61300996, 31173946, 9584220, -37382320, -35842040, 24224690, -10193568, +36138392, 31774168, -8553427, 14567992, 5865852, -6090264, -11994770, -6975027, -4509179, 10809896, +3153580, -251792, 3781719, -1094680, 5240934, 169114, 22886270, 18822158, 29824790, 5398237, +-16342351, -34441344, -28130962, 11494406, 26805964, 30706332, -3809636, -19563040, -79255032, -40711460, +-37497212, 940598, 4059818, 8144869, -238371, 5950141, -8933532, 4295, -13240847, -11832635, +16818018, 14847165, 8651138, 8740258, 4418448, 2033667, 23262616, -37721088, -124932008, -116255640, +-66723928, -72566160, -18080738, 120370752, 61170536, 123842160, 109904456, 172254496, 123032560, 105828528, +17095044, -45919104, -103823320, -166393472, -141293680, -142310528, -74359840, -35695472, -8359080, 1201517, +4119411, 29395830, 39298412, 99050000, 60176248, 116887536, 76168024, 100197296, 36280124, 96815544, +33664492, 23692114, 22945326, -5750425, -27140972, -65525096, -75586592, -140383152, -96135328, -177893792, +-140714944, -215911760, -127972848, -101573296, -24471114, 59337656, 31598074, 5333276, 59273768, 126608120, +169169632, 221744864, 264361136, 226169760, 165264976, 206039776, 170046880, 95297272, 42902964, -10572062, +-70841192, -164007616, -194742944, -260862352, -336744224, -389762912, -351673536, -309996768, -220571808, -150638992, +46195056, 145269760, 177118016, 272665984, 227720784, 284360128, 298912544, 293163744, 338026272, 221853312, +57685704, -55870008, -108266464, -134084048, -86757800, -125577328, -107594840, -125680408, -170003392, -172029552, +-200196480, -118600688, -92260192, -78731584, -43933756, -2707977, 11866458, 48595408, 132080448, 139081776, +197581376, 171901776, 225963056, 166077792, 111059800, 114491480, 43718472, -30105036, -48995912, -217961008, +-280880672, -261649952, -230791136, -135231344, -106036840, -58089432, 5114233, 58809912, 89801320, 121946472, +145718576, 173156432, 164531072, 155421984, 136944496, 76417128, -304406, -38872676, -90344104, -94649272, +-80968720, -66227320, -68890736, -69854960, -54808076, -39465380, -23320062, -9865003, -8927090, -6482717, +1961190, -6857989, -7970386, 9463424, 22465900, 24951076, 16435229, 11529303, 19292456, 23252416, +17068200, 15530602, 14453102, 9055402, 6154152, 5211943, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -12016245, -4409858, -6861211, 3652333, -3889630, -7934415, -13678397, 2362232, 363998, 3390340, 2976949, --992137, -1042603, 989453, 8204462, -5894843, -10487773, 3422015, -4362613, -7042136, 82678, --1086627, 4284767, 1500017, 3044595, -3188476, -822486, -2105608, 6982543, -1959042, -2880849, --2545305, -1279900, -1741609, -2862059, -2536178, -1770600, 1344862, 553514, 872415, 197569, -1781875, 2938831, 1466195, -2696703, -7978439, -121870, -5563057, 758599, -423054, -2555506, -3499325, 198105, -24696, -7945690, -3278134, 1014686, -669478, 2716567, 151398, 2412698, --2345052, 974958, -1045825, 4831302, -1779190, 2522757, -4413616, -4387309, -5542656, 228170, --1355062, -1646583, -15569, -1963874, -86436, -2282775, 423054, 54224, -995359, -3503083, -293132, 314606, 1937567, 1706713, -34897, 1821066, -249645, -1493575, -529892, -729608, -675921, -60130, 50466, 1007170, 712965, -179315, 907312, -687195, -8598525, -1796370, --1148904, -2456185, -1120450, -2956011, 2819109, -1186485, -1018981, -272730, 42950, -202400, --2083596, 7569343, 4871567, 7911867, -3734474, 7873749, -4698158, -3319473, 3060701, 8721468, --206158, -5344550, -7849590, -5668283, -1095754, 6203544, 2441152, 2072859, 2759517, -2784750, -4238059, 498753, 3164854, -1592896, -7150047, 1898376, -4949950, -3431142, -3474629, -872952, --9073655, -469225, 421444, -3839164, 8463770, -1658931, -2743410, -3457986, -89657, 879395, --3633542, 68183, -4454955, -1732482, 119722, -1893544, 6087580, 129386, -1642288, 3352222, -2187212, 5580237, 2267206, 6719477, 1671279, 5481452, -6323803, 1577864, 5058935, -1796370, --4514548, -6288369, -117575, -556198, -1238024, 1460826, 1836635, -1391569, 4854924, -4242891, -1618666, 1619203, -3097208, 2193655, 520765, -2349347, 1228898, -651224, 492848, -2209224, -675921, 185757, 411243, -320512, -133681, 970663, 290984, 1865626, 9737765, -4380330, --3363496, 1000727, -2134062, -1581622, 4900021, -3761318, 4720169, 2179159, 135291, 2421288, --3108483, -2966212, -5477157, -5910412, 7856569, 3724811, 2786897, 4209605, -2700461, -1800128, --1976759, 9905268, -3784403, 10838887, -325344, -2726767, -2563559, -5701569, -6118181, -7448010, --419833, -1858110, 1395328, 7245073, -571231, -3360812, -10025527, 374199, 8046621, 11767137, --5464809, 3054259, 2211371, -2966212, -2608656, 3084860, 11176579, -2634963, 1802813, -934692, --1572495, -1023276, 5390721, 7722351, -5779952, -3147674, 2443837, 10118406, 1741609, 7171522, --5788542, -5404143, -239981, -879931, 2105608, 1550483, -71941, 649077, 1107565, -2616172, -1287953, 3284576, 2571612, -1963874, 6518150, -1632088, 4120484, -2106682, -2163053, 2438468, -2103997, 2205466, 557272, 2298881, 502511, -3343632, -2215130, 665720, -96100, 1249299, --565325, 1860258, -15569, 1043677, -934155, -175020, -22012, -481573, -1097364, -96100, --642635, -168577, -785979, -721555, 1894081, -16643, -807991, 1990181, 108448, 15882252, --11045582, -2500208, -4633196, 1171452, 4175245, 7587597, -7735236, 5176510, -2074469, -8185671, --13186623, -2765959, -5643050, 852014, -1322313, -5625871, -2902324, 2978023, 3170223, 10172093, -5623186, 5135707, 472983, 1542967, -5376226, -3678103, 8177618, 6227703, 4222490, 1904281, -3893925, 765041, -22012, -6961605, -9789841, 6432251, -2650532, -6633040, -3177202, -4199941, -3430605, -3708704, 8221641, 1828582, -4817880, -2404645, -3701188, -3246995, 3993246, 5995775, --569083, 4014721, -3050501, -3433290, -22012, 739808, -3247532, -1327145, 4733054, -24159, --2014877, -2431488, 2559801, 2819109, -410169, 3424163, 446677, -2564632, 8213051, -1257889, -869731, 315680, -9980430, 3797825, 3080565, 5078262, 3325379, -3722663, -869194, -9051644, --4160213, -8313983, -3056943, -3774203, -3758, 700080, -5461588, 151934, -1346472, -70330, -2276870, -908922, -1036698, -268435, -1537061, 179852, -801011, 532039, -958851, -2113124, --1054415, -603980, -3427921, -400506, -191663, 610422, -245350, 323733, -219580, -12348, --1847910, -2442763, 202400, -438087, -1081795, 343597, -10811506, 2880313, 187905, -3151969, --5887864, 2564632, -5623186, -973884, 9922985, 14992657, 7421704, 8273181, -540092, -4072166, -6241125, 5589900, 2404645, 3016678, 7428146, -1016297, 5422396, 5255430, 7705172, 7381975, --5916318, 4969277, -312459, 1785633, -5507222, 1764158, -673236, 5062156, -1862942, -1354525, --3867081, 3699041, -6036577, -4905927, 566936, 5310727, 2942590, -3109020, -1569274, -920197, --2021856, 3228742, -7277822, 6817724, 40265, 8466991, -11872363, 895501, -10685342, -3344169, --3356517, 2985539, -1053341, -2400887, 2433636, 938987, 2971581, 4696010, 7699803, -898185, --6055367, 1364726, 10350871, 2145336, -2903398, -706522, 6410776, -3297461, 3930432, -3184182, --10909754, 6394670, 6805376, 6288906, -5353677, -8100845, -5799817, 6950331, -665720, -1009854, -4962835, 1852742, 1283122, 886911, -267362, 1947231, 2624762, -803696, -1313186, 1482838, -230318, -435402, 943819, -1330903, 478352, 2265059, -839129, 2376728, -898722, -1682554, -901943, -5369, 92879, 1225676, 986232, 1243930, 1022739, 906238, 17180, 1202054, --16406238, 251792, -3659312, 1482301, -9201431, 1095217, 1486596, 12137578, -9760850, 99321, --13084618, 2951716, -7919383, -1945083, 448287, -4296041, 3741990, 1650878, -6868727, 107374, --138513, 6301791, -4166655, 10163503, -159988, -8841190, -4541928, 10819023, -1081258, 4322348, -2844342, -1803349, 6438693, -7183870, -6826314, -5292474, 699543, -6879464, 7257421, -4033511, -4639639, -6660421, -121870, -8089571, 5263483, 701153, 6313065, 5671505, -5428302, 10673531, -9063455, 8592619, 1654636, 9023726, 7374459, -7669738, 6529961, 3136400, 557809, -7119445, -3229816, -6059125, 5953362, -2607045, -4827007, -584652, 8905615, 3184718, -10364830, 9829033, --864899, -3479461, -5947993, 10013179, 8607651, -7466264, 7332046, -535260, -8957154, 110059, --5116917, -2775086, 4833986, -4287451, 3432753, -356482, 1484448, -2051384, 2597382, -363998, --340376, -589484, -1053341, 949725, 447213, -2484102, 817654, 1248225, -75162, 933082, -1013075, -2329483, 428423, -271120, -28991, -1961726, 621160, -797253, -1273995, -2612951, -2937758, 642635, -1514513, -392990, 23383412, 3978214, -927713, -8056822, -15139760, 3870839, --2225330, -22225382, 19507742, -9444096, -14101988, 2985539, -894964, 2632278, -904628, 3784940, -5630702, 78920, -351650, -11356430, -936303, -1073742, 13403519, -2442226, 356482, 4934918, --2341831, -1644973, -5441724, 11443403, -8572755, 8269960, -2029909, -6849399, 1293322, -7657927, --3884798, -12439836, 2203318, 5718212, -3353833, -6204081, -4902705, 7527467, -11652783, -2753611, --5740224, -157840, -1659468, 1524177, -10106595, 9863929, -13803488, -9443022, 3762391, 1673964, --509491, 3696356, -7151658, -10306311, 1293859, -2798171, -456340, 5069135, -6148246, 4596152, -3211562, 11382200, -3134789, 1639604, -858457, 171799, 15791521, 1329829, 15635828, -3762391, --5845451, 1788317, -8012799, -707596, 8002061, 651224, -9323837, -8171176, 2316598, -859530, -59056, 8026757, 648003, -1496796, 3354906, -446140, -297963, -3733937, 1413581, 1765232, --1854889, -39192, -897111, 3108483, -1371168, -613643, 1620276, 425739, 996969, -279173, -1805497, -568009, 42950, 961536, -1926830, 2454037, -1508607, 920197, 2086280, 1133871, -1974611, 551366, -17235704, -2330020, -3570729, -13998372, -24041080, 7305740, 12361990, -8863739, --4301947, 6955163, -2662880, 14843944, -1739999, -8057896, -4828617, -22413824, 7474854, 2438468, --2108292, -15768436, 3636764, -8806830, -2370285, -7741142, -3990025, 11066520, -10767483, 4531728, --15909096, 10062035, 1954747, 120796, -4636417, 1116155, -2134062, -8937290, -16744467, 3156264, --34360, 3491272, 6931541, -4133906, -1398012, -10810970, -5579700, -2955474, 4484483, 2991445, -7851737, 12548821, 9819369, 4999342, 7479149, 2208150, 7798587, 6984154, -6942815, 8012262, -9091909, -1964411, 12196097, -1361505, 14319421, -6444062, -15495168, -2609193, 9799505, 10755672, -12408697, -2491081, -21597780, -2251637, -1193464, 729608, -775778, -5386426, 3045132, -15810311, -12196097, 7632694, 7378754, -8321499, -7821136, -1805497, 4510253, -646929, -8742406, -13422, --4291746, -7165079, -2882997, -1262720, -3426847, 224949, -2902324, 1340030, -1825361, -1071594, -2231236, 333397, 996432, -1222992, -3147137, -3543885, 2371896, -2847027, -134755, -1102196, -1445257, -1220308, -741419, -1210107, 3580929, 1816234, 1069984, -1226213, 22947474, -5043366, --5505075, 7654706, 12358232, -884763, 5754720, 14307073, 10340671, -23487028, -21575768, 176094, --2068564, 3164854, -9640054, -17136382, 4075387, 13734769, 9082245, -9949829, 16167331, 13053479, -12264279, -20591146, 5837398, 10791642, 563178, 1636919, 9199820, 21203180, -4090420, -9702331, -6443525, 4800163, -2879776, 11455752, 17125646, 3187403, 17741436, 7741679, -13298829, 1490354, -14714558, -1598265, -6026913, 7605314, 1240709, 2885144, 15444166, 9896678, 5262409, 1817308, --17906256, -18267570, -1514513, 2878165, 4780299, -5648419, -782221, -4735739, 1615445, 2260227, --6823630, 2572149, -4184372, -1083406, -5796059, 636192, 11418171, -6765111, -16462073, -2594697, --13999446, 3064996, -4986457, -388158, -1865090, 6592775, -2459406, 4765803, -45097, 4082367, -1959579, -1935957, -2216740, -2886755, -8109972, 2927557, 1079647, 2003065, 293132, -6322192, -3182571, -4955319, -4113505, -1472637, -5288179, -1161252, -1712081, -2026151, -1646046, 3406446, --1500017, 2254321, -187368, 1802813, 357019, 4407174, -1894081, 1153199, -3565897, -968515, --3053185, -2877091, -554051, -2138894, 6885907, 2827699, 293132, -1020055, -929324, -38486128, --24070608, -7408819, 6793565, -2524367, -9735080, 1536525, -9492951, 26647050, -11039677, 17029008, -26298622, 14170171, 12864501, -10545755, 9198746, -5331128, -12465069, 10497974, 12298102, 8077760, -17646946, -94489, -1123134, -8087961, -8268886, -7110319, -11313481, -11042361, -7630547, 3939022, -1292248, -315680, -7196755, -4030827, -10987063, 4271345, -9520869, -8683887, -3999688, 4290673, --275952, -5934571, -15901043, 1654636, -4867272, 5455146, -18716930, -14543296, 15982110, -2706366, --3371013, -7734163, -4838281, 11921755, 3699578, -2752000, 6421513, -2056216, 6691022, 5266704, -7668664, -5914170, -9576166, -23751170, 1387811, -23044110, -1796907, -19545322, -3034931, 18006650, --2555506, 2985539, -13273596, -5889474, -6972343, 1206886, -8616778, -5119064, 7967165, 9954660, --1315871, -1299765, 904091, -4925254, 1473174, -795106, -4834523, -2142652, -4175245, -1810866, --2486786, -10850698, 1583769, -2048699, -1636919, 377420, -3157338, -3706020, -7543037, -1984812, --4475356, -5311801, -1205275, -6618545, -3213173, 762357, -4236985, -4905390, 312459, -4150549, -1027034, 1213328, 4295504, -3047816, 2924873, 1218697, -4416837, -1864553, -1258425, -2223183, -573915, -1219234, -1464584, 26376468, 506269, -19113678, -16217260, 16549046, 12962211, -12232604, --11835856, 22194780, 14081587, 818191, -13196287, 1597191, -5565741, 10533407, -8203388, 1262184, --3494493, -2410551, 22914188, -3230352, -6284611, 4273493, 3867618, 6880538, 7049652, 800475, --9097814, 6878927, 3426310, 7880728, 17704928, 8152922, -25602836, -7287486, -4215511, -19535658, -7524246, -3367791, 347355, -10874320, 9162239, -4206384, 1706176, -14147622, 9559523, -11517492, -889058, 11419244, -1890323, 12045773, -9441949, 15015743, -19268834, 9630390, 148713, -6879464, -25049860, 6739878, -5296232, -14939507, 6442988, -3037616, 1990717, -2233920, 9112847, 13749801, -18388366, -11644193, 8221105, -4589173, 16435766, 6100464, 2277407, -1475321, 9818295, 1813013, --6649683, 8091182, -5805722, -9621264, -4279935, -13101261, 78920, -14682346, -1345399, -9878962, -11258720, -3552475, 7202124, -7898982, 199716, -4401268, 6788196, -2137283, -763430, -4357245, -2222109, -3255585, -5434744, -3017215, 2195265, -5087389, 3009698, -4020090, 1801739, -2584497, --2674691, -2581812, -5790690, -3250217, 21475, -4085588, -3883187, 5291937, 4421132, 2523830, --2758443, -6609955, -835371, 2953864, -369367, -5115306, -3213709, -38540888, -25012816, 20515986, --15315853, -14379551, 7802882, 17943836, -29964914, -5097053, 6955700, 1779190, -15715285, -23472534, -43664248, -19029926, 5804112, -21616570, 11690901, -7620346, 20338818, 18064096, 1692754, 3089692, --24480776, -167504, 11360725, -9995463, -14654965, 11400454, 3120831, 12303471, 9739912, -2196876, -4005594, -2867965, -1693291, 18210124, -15734076, -9291088, 14567992, -726386, -11912092, 15448460, --612570, -3543885, -10662256, -4765266, 5608154, -8337069, -1076426, 5366025, -10580115, -10813654, --7099581, 7783018, -22801444, 10718091, -1174137, 21451214, -20393042, 6636798, -15541339, 5589363, --9385040, -11894375, 19305342, -10838350, -4867809, -10551661, 8269960, -12054899, 6941741, -4159676, -14083735, 14490683, -1963874, -22817550, 8948564, 9371619, -1222992, -808528, -13109851, -9055939, --2288144, -11267310, -9126269, -3246459, -400506, -5645735, -7526930, 8380555, 2703682, -5354214, --4549444, -5467494, -5839545, 6080600, 2138357, 1414118, -8710194, -3342558, 7244536, -4354560, --5397164, 3398393, -3902515, -31675, 2554432, 4243965, -1890859, -7151121, 1285806, 4185446, --9615895, 172872, 2326799, 183610, -5131412, -2893197, 110595, -2289218, 19300510, 9376987, --21734146, 7406134, 23381266, -2067490, 53150, 10783589, -6993281, 16386374, 14837501, -19625316, --12028056, -3627637, 10362145, 18709952, 3327526, 9934796, 21134998, 15800648, -22224308, -2405182, -35322348, 8701604, -2347200, -4191888, -6640020, -10397042, 3121368, 8630737, 9652402, 8951249, --6307697, -15108621, 4065187, -7870528, 8294656, 24350854, -6469832, -24510304, 29314762, -8864812, --16129750, 23703924, -4266513, -7113003, -25393994, -4611185, 10520522, 4970888, -5504001, -10769094, -9833864, 1000191, -11754789, 10045929, -2343442, 23115514, -17029008, 2365990, -3310883, 26485990, -9063992, -37758668, 11841225, -15813533, -6593849, -13538811, 16331613, 53905060, 19736986, 3069291, -12510166, 15643345, -19879794, -8512625, -5577552, -11435350, -6851010, -12651900, 11901891, -27792196, --7322919, 2423972, 3339337, -9168681, 1751810, 4799626, -2685965, -3609920, 9456981, 1638530, -6323803, 5135707, -5655398, 1508070, 4691715, 1673964, 3929895, -2953864, 2424509, -5496485, -751082, -1747515, -5120138, -2837363, -1134945, 8325257, 503048, 2065342, 380641, -1888712, --1699733, 574452, -718870, -7971996, -912144, 1124208, -1824824, -6185827, -14047227, -5267778, --4234838, 8135742, -1405528, 1656247, -8164196, -28502476, -12089796, 2018098, -11533061, -35893040, -31244814, -5929203, 14119168, 2712809, -16419123, -28308130, -27266064, 30709554, 18735722, 7088844, --10741713, -20450486, -15293305, -24295020, -6189048, 9131100, -3719979, 2039036, 3954054, -3947612, --12544526, -12080132, -20627654, -7380365, -3905736, 10223096, 7175280, 11234024, -5477157, -9221832, --3809099, 14668387, 2157147, 12990665, -43198244, -10154913, 20401, 9536438, -13727789, -569083, --15900506, 12560095, 11107859, 2143189, 53539452, 881005, 16790638, 22028888, 1040993, 7135015, -421981, -3819300, -6339909, 11113228, 16364899, 21309480, -385473, -3995393, 1556389, 14005888, -12802224, 474594, 10397579, 8917963, 7030862, -2829847, 21021718, -6019934, 26948772, -26526254, --13171591, -32630478, -10068477, 5849209, 885300, -8450348, 1845225, -105227, 14715095, -2959769, -17610976, -8012262, -6409165, -8804683, 4618701, 9844065, -1507534, -4782983, -5222680, 6076305, -178241, 20422570, -3149822, -1402307, 3750043, 5733245, 8504035, -7062000, -544924, 2737505, -4240744, -9748502, 3474629, 3718368, 12606803, -12393128, 7130183, 4726075, -5197448, 10629507, --5913096, -7282654, 126702, -2469606, 5529771, 2728915, -4289062, -129386, 4558571, 1042603, -10994579, -508954, 7219303, 20288888, -3740917, 894427, 5343476, -27765890, 1164473, 3984656, -17478370, 26663156, -22691386, 5027259, -14305462, 19005768, 17230872, 2182917, 33079838, 10320806, -13174812, -12054899, -1937030, -21111374, 33051384, -19203872, 5166846, 20225538, -4809827, -13001403, -10215580, -2968896, 5170067, 21714280, 566399, -6876780, -1996086, 4077535, -681826, -12872554, -9543954, -1223529, -3650185, 37071472, -28477780, 26824218, 17317308, 33472828, 13639742, -23648090, -18315888, 381178, 17020956, 44077640, -31778464, -13159243, -4082903, 867583, 29968672, -17762910, -1568200, -19075560, 1508070, 33793340, -3796214, 35068944, 9891847, 6008123, 15949361, -21402896, --3532611, 15426449, 21829708, -35435092, -1252520, -30359514, 13618804, -15781320, -511101, 7198365, -9905805, 766115, -10792179, -8594766, -33196876, -3765613, -23580444, 19147502, 1669132, -1481764, -14913200, 846109, -63888, 14323716, 10697153, 7207492, 188979, -4815195, 6764574, -11207717, --825707, -7685844, 7706782, 8016557, -6766184, -1296006, -14398341, 6399502, -883153, -5906, --382252, -13981192, -16849694, -5572183, 5465346, 12794708, 6514392, 5777268, -2026688, 10717554, -7461432, -466004, -5444408, 9324911, -13269301, -3727495, 2774549, 15030238, 12429098, 2695092, --6045704, -21467320, 6030134, -37565396, -33108292, 478352, 446677, -21028696, 17053168, 4930623, --5751498, -19514720, 26515518, -6195491, 39475044, -5781563, 8469676, 14241038, -19276350, -6434935, -5971615, -22937810, -12964359, -20062330, 17151952, -16077136, -4436165, -5293011, 14833206, -13558138, --22949084, -31917512, -1027034, 26502096, 1485522, -14647986, -6337761, -18539764, -6320581, 130997, -10939819, -20877836, -2460480, -4571456, -15000173, -20520280, 842350, 3397856, 13112535, 4515085, -22630182, 6288906, 28592134, -12017855, 23579370, -6078453, -18678276, -4861903, 38435664, -16695075, -17430052, -12246026, 28155658, -15004468, 9393630, 17940616, -1235340, -7435662, 3263102, -10271414, -25581898, -23622320, -9064528, 25680684, -3337190, -21466246, 838592, 19628000, 10744934, 19630148, --20017232, -16879222, -10894185, -2187749, 19190988, 23415088, -41653668, 2185065, 11819213, -22767622, -3569655, 14368813, 11001559, 10540923, 10108206, 6882685, -3366181, 758062, 7698729, 8828305, -6999186, 17719424, -5574331, 9317932, 3740917, 19183472, 11220065, -14803142, -18919868, 5966247, -19949586, -5731634, -5784247, -12831215, -22084722, 2528662, -18879602, -5858336, 4066260, -12420509, -11385958, 3331284, -4096325, -10253698, -2190433, -10628433, -1084479, 5924908, 2574833, 1688459, --2081449, -2590402, -35620848, 39280696, -12983686, 33457258, -6896644, 26889180, 2330557, -8318815, --18257906, -12894566, -2340757, 475131, 19789598, -7430294, -1428614, 5725729, -17840758, 29032368, -10914049, 1156420, -23735064, 16428250, 8712341, -18937048, 18709414, 1702955, -2807298, 4774393, --455267, 24523726, -5472325, -30645128, 33333778, -17041894, -2565169, 24765856, -10763725, -5317170, --14618458, 39043400, -17326434, -4738960, -24235426, -4660040, 3113315, 34907348, -16173236, 6628745, -11236171, 20784420, -5304822, -22025130, 24221468, 14680735, 19692426, -9470940, -4536023, 2537252, -21805548, -11940009, -25251724, -28278602, 15249281, -19785304, 5236102, 21255794, 19821274, -13780403, --4585415, 28585692, -45318884, -1013075, 6440304, 15794742, -1942936, -16536698, -3148211, 26074746, --4884989, 53473952, 21068426, -15213848, -1893007, 1639067, -6262599, -19276886, -23523000, -17283486, -15029164, -11167989, -4427575, -387084, 23471460, 10162429, -7892540, 10348724, 7699266, -251792, -3610457, 4393752, -98784, 3301756, 24041616, 19718194, 19174344, 13010530, 2014340, -11673721, -6528887, -9105331, 11631845, -14042932, 15538118, 22483616, 7650948, 28461138, 30813170, 12497281, --83215, 16146393, 5735392, -2852932, -9540196, 16782584, -4138201, -13283260, 36507, 8174397, --3604551, 7126962, 13357348, 5070209, 13629005, -7598334, -8668318, -50306416, 17134236, 9794673, -44865764, 39315056, -5813238, -14511621, -46227268, 1362578, 15483894, -19785840, 15124727, 27080306, -26346940, -12196097, 31715650, 28351616, 1377611, -17090748, -18301392, 28950764, 24777666, -35150012, --47914120, 63750200, 3352222, -4493073, 8418673, 4743792, 23700704, 23528904, -9392020, -8018167, -33272038, 15820512, -5873905, -22048214, 13464722, 2690797, 1870995, 11864847, 1745367, -1000191, --13164612, 7479686, -3874061, -16199006, 29921964, -47421272, 33208150, 27514634, -44844828, -3081102, -23029614, 5834176, 26262114, -6077379, 3791383, 24004572, -3040300, 12284680, -22048214, -35057132, -98967856, -40377524, -56731148, -12375411, 110207248, 47591460, -46802260, -10560251, 19564112, 13507672, --880468, -28275918, 41514080, 23228256, 17487496, 4156992, -55755116, -9101573, 9218074, 16712791, --22827752, -37888056, 3473018, 12084427, 5371394, -17835926, -18847928, 9214315, 5225365, 13851270, --2431488, -4522601, -1261647, 14798847, 18803904, 13007308, -28016072, -10773925, 19967840, 14746770, --14059575, 174483, 16301548, 28875066, 11346230, -15042049, -20422570, -26714696, 12780212, -8458938, -11893301, -22555020, 12861280, 6749004, 14475650, -10247255, -5377299, -18067854, -7636989, 18134426, -3400540, -14775761, 8361228, 27331562, 7212861, -19659676, -12409234, 24756192, 42871828, 2995203, -71201432, -31570694, -12141873, 41319732, 2040110, -2325725, -21248276, -42415488, 35262220, -22085796, --24075440, 18336290, -26725434, 13303661, -25341918, -28023588, -4735739, 6200859, 3971771, -6553047, -33728916, 8519068, 20564304, 9947144, 568546, 597000, -15248208, -32318556, 10351945, 32382442, --26396332, 22640920, -26908506, -2718714, -1489817, -41523208, 29603062, -14335527, 11518565, 902480, --12261595, 798864, -30110406, 31000000, -21806622, 10421738, -35053912, -21196200, -45974940, 17457968, --21508660, -24063628, -19560892, -9943923, -6442, 49008260, 17459042, 24288040, -6731288, -22766012, --28984050, 7755637, 1727651, -49741088, -23255100, -87550760, -41318660, -33790656, -5150203, -40284108, --33332168, -7212324, 32013612, 36683316, -29827474, -37512780, -43337292, 21898428, 51662016, 2755222, -41530724, 1182727, 25049324, 10207527, 2958159, 12242804, 4376035, -874026, -15106474, 21613886, -17666812, 9679246, -18035642, -6978785, -2494839, 9337259, 9572945, -3431142, 10396505, -4495220, --12168179, -20904142, 2503966, 29417304, 10426570, -3328063, 8132521, -9306120, 15562814, -5602248, -20378546, 20016696, 2207076, -21248276, 3408594, 4915590, 23106388, 5813238, 26278758, -17548700, --11048266, 24528022, 25120190, 6900402, -6764037, -4466229, -25179246, -11764452, -50134616, 11805254, -17702782, -43410844, 24063628, 4795331, -12596065, 2597382, -12275553, -1213865, 9343164, 12673375, -22216256, -26148834, 2545842, 30151744, -3350611, -14374182, 27116812, -11917997, 1899449, -16057809, --6517613, -32063542, 8358543, 772557, 18115098, -12654047, 1343788, 22523346, -10662256, 360240, -23241678, -45625976, 2967823, -52231096, -16616692, -34992708, 27935542, 9876277, -2049773, 11718281, --10249939, 12784507, 35503272, 9547175, 55122684, -30719216, -35241280, 32469952, 8840116, -23834384, --22372484, -9139154, 20354924, -19569482, -755377, -16925930, -21849572, 12815646, 16042777, -32583232, --18941342, 27992450, -497679, 9874130, -6071473, 15333570, 6810745, 28254980, -16468515, -12236899, -7166153, 6500433, -8178155, -29564408, -21609592, -23396298, 31272730, -14561013, -24217174, 6996502, --6341519, -8003672, -15967615, 5992553, 7150584, -2684892, -4756140, -8715562, -14717242, -2608656, --3345243, -10763188, 383863, -5291937, -10102300, 6082748, -5966247, 5592585, -5887327, -5034776, -14760192, -5903433, 6971269, 5122822, -14078903, 6228777, 1852205, -5740761, -17071958, 23145042, -15234786, -6635188, 3587372, -11468100, -8685498, 7009924, -214748, -14718316, 5117991, -5937256, -13294534, -3635153, -2484639, 2485712, 6191196, -33851860, -68504192, -34213172, -13007308, 30036316, -39127688, -74772696, 12953084, -29657822, -40523016, -8258149, 46896748, 30023968, 25588342, -16072841, --18017388, -21510270, 23667954, 16750372, 36499704, 4838818, -47347720, -18477486, 35639100, -5387500, -10470593, 31981400, -15229417, -22000434, -34635152, -34616364, 231928, 22705882, 48842904, 36250060, -23983098, 9909026, -49948860, -53127136, 18613852, -36623188, 8674760, 46992312, 18653042, 3280281, --23665270, -42347304, -7279433, -18189724, 14239964, 11194832, 7951595, 29502130, -4596689, -5580237, -7710003, 21444234, 34571804, 35949412, 12127377, 32028108, 10702522, 11580306, -7057705, -35624068, --14074608, -15381888, -29353954, 22191560, 20575578, 15462419, 15206332, -6679748, -35243964, 5959804, -10451266, -421444, 23356570, 15203647, 12209518, -2647311, 1538135, 3587908, 24042690, 24437828, -18371186, 5499706, -4532801, -17683454, -3388729, 10548440, 2938295, -5121212, -187368, -14012868, --6693707, -8040179, -9415642, 7505992, 26239028, 13105556, -4933844, -2494302, -19814832, -1868848, -6781754, 13467407, 14651207, -4493073, -6431177, -30515206, -17859548, -4274030, 81068, 12499965, -10123238, -5875516, -7536057, 5142687, 1808718, 3350075, 7405061, -8393440, -3212636, -1542430, -4862977, 8346732, 624381, -2689723, -2457795, -12662100, 21192442, -60351268, -121411744, -62691492, -11719892, 47356848, 115472344, 112976432, 47042240, 48051020, 34483756, 1840394, -57573500, -97520456, --146939952, -43881680, -61496416, -10729902, 59907276, 106827112, 89801864, 79313552, 43687332, -1005559, --28019830, -37553584, -8069707, -65017752, -51657720, -49057652, -32174674, -26396870, -12279311, -2324114, -22341346, 52674552, 54220204, 53317188, 39007968, 50794432, 26911728, 29049548, -9542880, -2131915, --24014236, -62963148, -91231008, -110187920, -53413824, -21487722, 17113298, -2839510, 11607149, 25624312, -33469606, 71484360, 82386064, 109236048, 69641824, 7041599, 31807990, -16495896, -60360396, -52765820, --105075304, -122541320, -91645472, -56626460, -24384140, -19188304, 44069584, 49824840, 138174464, 113186344, -82778512, 81086296, 38805028, -4942971, -54932096, -79373144, -57985280, -69497400, -95481952, -45326400, -2607582, -9320079, 2682744, 41748692, 58132384, 42999600, 22393422, 21742198, 37032280, 15838229, --2781528, -4425427, -18204218, -3043521, -16246251, -42748884, -22641994, -31874026, -51835424, -9098888, --9021042, 41435160, 37704980, 22743462, 40567576, 70300560, 50260244, -12310987, -8513699, -33862060, --30198988, -70717176, -73410120, -35460860, -15011984, 6133750, 24862492, 29518236, 43898324, 50099184, -48352740, 50866372, 12934294, -5132486, -27078696, -32990180, -43663712, -48249664, -48510580, -20837570, -10845329, 14587320, 21026012, 22070764, 15260019, 16369194, 17044578, 5551782, 3984119, -5629629, --6033892, 10413685, -6889128, -16646756, 1023276, 3924526, -2014340, -4838818, -6873022, 720481, --1183800, -6866579, -1421634, 733903, 66035, -76773, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +4409858, -6861211, 3652333, -3889630, -7934415, -13678397, 2362232, 363998, 3390340, 2976949, +-992137, -1042603, 989453, 8204462, -5894843, -10487773, 3422015, -4362613, -7042136, 82678, +-1086627, 4284767, 1500017, 3044595, -3188476, -822486, -2105608, 6982543, -1959042, -2880849, +-2545305, -1279900, -1741609, -2862059, -2536178, -1770600, 1344862, 553514, 872415, 197569, +1781875, 2938831, 1466195, -2696703, -7978439, -121870, -5563057, 758599, -423054, -2555506, +3499325, 198105, -24696, -7945690, -3278134, 1014686, -669478, 2716567, 151398, 2412698, +-2345052, 974958, -1045825, 4831302, -1779190, 2522757, -4413616, -4387309, -5542656, 228170, +-1355062, -1646583, -15569, -1963874, -86436, -2282775, 423054, 54224, -995359, -3503083, +293132, 314606, 1937567, 1706713, -34897, 1821066, -249645, -1493575, -529892, -729608, +675921, -60130, 50466, 1007170, 712965, -179315, 907312, -687195, -8598525, -1796370, +-1148904, -2456185, -1120450, -2956011, 2819109, -1186485, -1018981, -272730, 42950, -202400, +-2083596, 7569343, 4871567, 7911867, -3734474, 7873749, -4698158, -3319473, 3060701, 8721468, +-206158, -5344550, -7849590, -5668283, -1095754, 6203544, 2441152, 2072859, 2759517, -2784750, +4238059, 498753, 3164854, -1592896, -7150047, 1898376, -4949950, -3431142, -3474629, -872952, +-9073655, -469225, 421444, -3839164, 8463770, -1658931, -2743410, -3457986, -89657, 879395, +-3633542, 68183, -4454955, -1732482, 119722, -1893544, 6087580, 129386, -1642288, 3352222, +2187212, 5580237, 2267206, 6719477, 1671279, 5481452, -6323803, 1577864, 5058935, -1796370, +-4514548, -6288369, -117575, -556198, -1238024, 1460826, 1836635, -1391569, 4854924, -4242891, +1618666, 1619203, -3097208, 2193655, 520765, -2349347, 1228898, -651224, 492848, -2209224, +675921, 185757, 411243, -320512, -133681, 970663, 290984, 1865626, 9737765, -4380330, +-3363496, 1000727, -2134062, -1581622, 4900021, -3761318, 4720169, 2179159, 135291, 2421288, +-3108483, -2966212, -5477157, -5910412, 7856569, 3724811, 2786897, 4209605, -2700461, -1800128, +-1976759, 9905268, -3784403, 10838887, -325344, -2726767, -2563559, -5701569, -6118181, -7448010, +-419833, -1858110, 1395328, 7245073, -571231, -3360812, -10025527, 374199, 8046621, 11767137, +-5464809, 3054259, 2211371, -2966212, -2608656, 3084860, 11176579, -2634963, 1802813, -934692, +-1572495, -1023276, 5390721, 7722351, -5779952, -3147674, 2443837, 10118406, 1741609, 7171522, +-5788542, -5404143, -239981, -879931, 2105608, 1550483, -71941, 649077, 1107565, -2616172, +1287953, 3284576, 2571612, -1963874, 6518150, -1632088, 4120484, -2106682, -2163053, 2438468, +2103997, 2205466, 557272, 2298881, 502511, -3343632, -2215130, 665720, -96100, 1249299, +-565325, 1860258, -15569, 1043677, -934155, -175020, -22012, -481573, -1097364, -96100, +-642635, -168577, -785979, -721555, 1894081, -16643, -807991, 1990181, 108448, 15882252, +-11045582, -2500208, -4633196, 1171452, 4175245, 7587597, -7735236, 5176510, -2074469, -8185671, +-13186623, -2765959, -5643050, 852014, -1322313, -5625871, -2902324, 2978023, 3170223, 10172093, +5623186, 5135707, 472983, 1542967, -5376226, -3678103, 8177618, 6227703, 4222490, 1904281, +3893925, 765041, -22012, -6961605, -9789841, 6432251, -2650532, -6633040, -3177202, -4199941, +3430605, -3708704, 8221641, 1828582, -4817880, -2404645, -3701188, -3246995, 3993246, 5995775, +-569083, 4014721, -3050501, -3433290, -22012, 739808, -3247532, -1327145, 4733054, -24159, +-2014877, -2431488, 2559801, 2819109, -410169, 3424163, 446677, -2564632, 8213051, -1257889, +869731, 315680, -9980430, 3797825, 3080565, 5078262, 3325379, -3722663, -869194, -9051644, +-4160213, -8313983, -3056943, -3774203, -3758, 700080, -5461588, 151934, -1346472, -70330, +2276870, -908922, -1036698, -268435, -1537061, 179852, -801011, 532039, -958851, -2113124, +-1054415, -603980, -3427921, -400506, -191663, 610422, -245350, 323733, -219580, -12348, +-1847910, -2442763, 202400, -438087, -1081795, 343597, -10811506, 2880313, 187905, -3151969, +-5887864, 2564632, -5623186, -973884, 9922985, 14992657, 7421704, 8273181, -540092, -4072166, +6241125, 5589900, 2404645, 3016678, 7428146, -1016297, 5422396, 5255430, 7705172, 7381975, +-5916318, 4969277, -312459, 1785633, -5507222, 1764158, -673236, 5062156, -1862942, -1354525, +-3867081, 3699041, -6036577, -4905927, 566936, 5310727, 2942590, -3109020, -1569274, -920197, +-2021856, 3228742, -7277822, 6817724, 40265, 8466991, -11872363, 895501, -10685342, -3344169, +-3356517, 2985539, -1053341, -2400887, 2433636, 938987, 2971581, 4696010, 7699803, -898185, +-6055367, 1364726, 10350871, 2145336, -2903398, -706522, 6410776, -3297461, 3930432, -3184182, +-10909754, 6394670, 6805376, 6288906, -5353677, -8100845, -5799817, 6950331, -665720, -1009854, +4962835, 1852742, 1283122, 886911, -267362, 1947231, 2624762, -803696, -1313186, 1482838, +230318, -435402, 943819, -1330903, 478352, 2265059, -839129, 2376728, -898722, -1682554, +901943, -5369, 92879, 1225676, 986232, 1243930, 1022739, 906238, 17180, 1202054, +-16406238, 251792, -3659312, 1482301, -9201431, 1095217, 1486596, 12137578, -9760850, 99321, +-13084618, 2951716, -7919383, -1945083, 448287, -4296041, 3741990, 1650878, -6868727, 107374, +-138513, 6301791, -4166655, 10163503, -159988, -8841190, -4541928, 10819023, -1081258, 4322348, +2844342, -1803349, 6438693, -7183870, -6826314, -5292474, 699543, -6879464, 7257421, -4033511, +4639639, -6660421, -121870, -8089571, 5263483, 701153, 6313065, 5671505, -5428302, 10673531, +9063455, 8592619, 1654636, 9023726, 7374459, -7669738, 6529961, 3136400, 557809, -7119445, +3229816, -6059125, 5953362, -2607045, -4827007, -584652, 8905615, 3184718, -10364830, 9829033, +-864899, -3479461, -5947993, 10013179, 8607651, -7466264, 7332046, -535260, -8957154, 110059, +-5116917, -2775086, 4833986, -4287451, 3432753, -356482, 1484448, -2051384, 2597382, -363998, +-340376, -589484, -1053341, 949725, 447213, -2484102, 817654, 1248225, -75162, 933082, +1013075, -2329483, 428423, -271120, -28991, -1961726, 621160, -797253, -1273995, -2612951, +2937758, 642635, -1514513, -392990, 23383412, 3978214, -927713, -8056822, -15139760, 3870839, +-2225330, -22225382, 19507742, -9444096, -14101988, 2985539, -894964, 2632278, -904628, 3784940, +5630702, 78920, -351650, -11356430, -936303, -1073742, 13403519, -2442226, 356482, 4934918, +-2341831, -1644973, -5441724, 11443403, -8572755, 8269960, -2029909, -6849399, 1293322, -7657927, +-3884798, -12439836, 2203318, 5718212, -3353833, -6204081, -4902705, 7527467, -11652783, -2753611, +-5740224, -157840, -1659468, 1524177, -10106595, 9863929, -13803488, -9443022, 3762391, 1673964, +-509491, 3696356, -7151658, -10306311, 1293859, -2798171, -456340, 5069135, -6148246, 4596152, +3211562, 11382200, -3134789, 1639604, -858457, 171799, 15791521, 1329829, 15635828, -3762391, +-5845451, 1788317, -8012799, -707596, 8002061, 651224, -9323837, -8171176, 2316598, -859530, +59056, 8026757, 648003, -1496796, 3354906, -446140, -297963, -3733937, 1413581, 1765232, +-1854889, -39192, -897111, 3108483, -1371168, -613643, 1620276, 425739, 996969, -279173, +1805497, -568009, 42950, 961536, -1926830, 2454037, -1508607, 920197, 2086280, 1133871, +1974611, 551366, -17235704, -2330020, -3570729, -13998372, -24041080, 7305740, 12361990, -8863739, +-4301947, 6955163, -2662880, 14843944, -1739999, -8057896, -4828617, -22413824, 7474854, 2438468, +-2108292, -15768436, 3636764, -8806830, -2370285, -7741142, -3990025, 11066520, -10767483, 4531728, +-15909096, 10062035, 1954747, 120796, -4636417, 1116155, -2134062, -8937290, -16744467, 3156264, +-34360, 3491272, 6931541, -4133906, -1398012, -10810970, -5579700, -2955474, 4484483, 2991445, +7851737, 12548821, 9819369, 4999342, 7479149, 2208150, 7798587, 6984154, -6942815, 8012262, +9091909, -1964411, 12196097, -1361505, 14319421, -6444062, -15495168, -2609193, 9799505, 10755672, +12408697, -2491081, -21597780, -2251637, -1193464, 729608, -775778, -5386426, 3045132, -15810311, +12196097, 7632694, 7378754, -8321499, -7821136, -1805497, 4510253, -646929, -8742406, -13422, +-4291746, -7165079, -2882997, -1262720, -3426847, 224949, -2902324, 1340030, -1825361, -1071594, +2231236, 333397, 996432, -1222992, -3147137, -3543885, 2371896, -2847027, -134755, -1102196, +1445257, -1220308, -741419, -1210107, 3580929, 1816234, 1069984, -1226213, 22947474, -5043366, +-5505075, 7654706, 12358232, -884763, 5754720, 14307073, 10340671, -23487028, -21575768, 176094, +-2068564, 3164854, -9640054, -17136382, 4075387, 13734769, 9082245, -9949829, 16167331, 13053479, +12264279, -20591146, 5837398, 10791642, 563178, 1636919, 9199820, 21203180, -4090420, -9702331, +6443525, 4800163, -2879776, 11455752, 17125646, 3187403, 17741436, 7741679, -13298829, 1490354, +14714558, -1598265, -6026913, 7605314, 1240709, 2885144, 15444166, 9896678, 5262409, 1817308, +-17906256, -18267570, -1514513, 2878165, 4780299, -5648419, -782221, -4735739, 1615445, 2260227, +-6823630, 2572149, -4184372, -1083406, -5796059, 636192, 11418171, -6765111, -16462073, -2594697, +-13999446, 3064996, -4986457, -388158, -1865090, 6592775, -2459406, 4765803, -45097, 4082367, +1959579, -1935957, -2216740, -2886755, -8109972, 2927557, 1079647, 2003065, 293132, -6322192, +3182571, -4955319, -4113505, -1472637, -5288179, -1161252, -1712081, -2026151, -1646046, 3406446, +-1500017, 2254321, -187368, 1802813, 357019, 4407174, -1894081, 1153199, -3565897, -968515, +-3053185, -2877091, -554051, -2138894, 6885907, 2827699, 293132, -1020055, -929324, -38486128, +-24070608, -7408819, 6793565, -2524367, -9735080, 1536525, -9492951, 26647050, -11039677, 17029008, +26298622, 14170171, 12864501, -10545755, 9198746, -5331128, -12465069, 10497974, 12298102, 8077760, +17646946, -94489, -1123134, -8087961, -8268886, -7110319, -11313481, -11042361, -7630547, 3939022, +1292248, -315680, -7196755, -4030827, -10987063, 4271345, -9520869, -8683887, -3999688, 4290673, +-275952, -5934571, -15901043, 1654636, -4867272, 5455146, -18716930, -14543296, 15982110, -2706366, +-3371013, -7734163, -4838281, 11921755, 3699578, -2752000, 6421513, -2056216, 6691022, 5266704, +7668664, -5914170, -9576166, -23751170, 1387811, -23044110, -1796907, -19545322, -3034931, 18006650, +-2555506, 2985539, -13273596, -5889474, -6972343, 1206886, -8616778, -5119064, 7967165, 9954660, +-1315871, -1299765, 904091, -4925254, 1473174, -795106, -4834523, -2142652, -4175245, -1810866, +-2486786, -10850698, 1583769, -2048699, -1636919, 377420, -3157338, -3706020, -7543037, -1984812, +-4475356, -5311801, -1205275, -6618545, -3213173, 762357, -4236985, -4905390, 312459, -4150549, +1027034, 1213328, 4295504, -3047816, 2924873, 1218697, -4416837, -1864553, -1258425, -2223183, +573915, -1219234, -1464584, 26376468, 506269, -19113678, -16217260, 16549046, 12962211, -12232604, +-11835856, 22194780, 14081587, 818191, -13196287, 1597191, -5565741, 10533407, -8203388, 1262184, +-3494493, -2410551, 22914188, -3230352, -6284611, 4273493, 3867618, 6880538, 7049652, 800475, +-9097814, 6878927, 3426310, 7880728, 17704928, 8152922, -25602836, -7287486, -4215511, -19535658, +7524246, -3367791, 347355, -10874320, 9162239, -4206384, 1706176, -14147622, 9559523, -11517492, +889058, 11419244, -1890323, 12045773, -9441949, 15015743, -19268834, 9630390, 148713, -6879464, +25049860, 6739878, -5296232, -14939507, 6442988, -3037616, 1990717, -2233920, 9112847, 13749801, +18388366, -11644193, 8221105, -4589173, 16435766, 6100464, 2277407, -1475321, 9818295, 1813013, +-6649683, 8091182, -5805722, -9621264, -4279935, -13101261, 78920, -14682346, -1345399, -9878962, +11258720, -3552475, 7202124, -7898982, 199716, -4401268, 6788196, -2137283, -763430, -4357245, +2222109, -3255585, -5434744, -3017215, 2195265, -5087389, 3009698, -4020090, 1801739, -2584497, +-2674691, -2581812, -5790690, -3250217, 21475, -4085588, -3883187, 5291937, 4421132, 2523830, +-2758443, -6609955, -835371, 2953864, -369367, -5115306, -3213709, -38540888, -25012816, 20515986, +-15315853, -14379551, 7802882, 17943836, -29964914, -5097053, 6955700, 1779190, -15715285, -23472534, +43664248, -19029926, 5804112, -21616570, 11690901, -7620346, 20338818, 18064096, 1692754, 3089692, +-24480776, -167504, 11360725, -9995463, -14654965, 11400454, 3120831, 12303471, 9739912, -2196876, +4005594, -2867965, -1693291, 18210124, -15734076, -9291088, 14567992, -726386, -11912092, 15448460, +-612570, -3543885, -10662256, -4765266, 5608154, -8337069, -1076426, 5366025, -10580115, -10813654, +-7099581, 7783018, -22801444, 10718091, -1174137, 21451214, -20393042, 6636798, -15541339, 5589363, +-9385040, -11894375, 19305342, -10838350, -4867809, -10551661, 8269960, -12054899, 6941741, -4159676, +14083735, 14490683, -1963874, -22817550, 8948564, 9371619, -1222992, -808528, -13109851, -9055939, +-2288144, -11267310, -9126269, -3246459, -400506, -5645735, -7526930, 8380555, 2703682, -5354214, +-4549444, -5467494, -5839545, 6080600, 2138357, 1414118, -8710194, -3342558, 7244536, -4354560, +-5397164, 3398393, -3902515, -31675, 2554432, 4243965, -1890859, -7151121, 1285806, 4185446, +-9615895, 172872, 2326799, 183610, -5131412, -2893197, 110595, -2289218, 19300510, 9376987, +-21734146, 7406134, 23381266, -2067490, 53150, 10783589, -6993281, 16386374, 14837501, -19625316, +-12028056, -3627637, 10362145, 18709952, 3327526, 9934796, 21134998, 15800648, -22224308, -2405182, +35322348, 8701604, -2347200, -4191888, -6640020, -10397042, 3121368, 8630737, 9652402, 8951249, +-6307697, -15108621, 4065187, -7870528, 8294656, 24350854, -6469832, -24510304, 29314762, -8864812, +-16129750, 23703924, -4266513, -7113003, -25393994, -4611185, 10520522, 4970888, -5504001, -10769094, +9833864, 1000191, -11754789, 10045929, -2343442, 23115514, -17029008, 2365990, -3310883, 26485990, +9063992, -37758668, 11841225, -15813533, -6593849, -13538811, 16331613, 53905060, 19736986, 3069291, +12510166, 15643345, -19879794, -8512625, -5577552, -11435350, -6851010, -12651900, 11901891, -27792196, +-7322919, 2423972, 3339337, -9168681, 1751810, 4799626, -2685965, -3609920, 9456981, 1638530, +6323803, 5135707, -5655398, 1508070, 4691715, 1673964, 3929895, -2953864, 2424509, -5496485, +751082, -1747515, -5120138, -2837363, -1134945, 8325257, 503048, 2065342, 380641, -1888712, +-1699733, 574452, -718870, -7971996, -912144, 1124208, -1824824, -6185827, -14047227, -5267778, +-4234838, 8135742, -1405528, 1656247, -8164196, -28502476, -12089796, 2018098, -11533061, -35893040, +31244814, -5929203, 14119168, 2712809, -16419123, -28308130, -27266064, 30709554, 18735722, 7088844, +-10741713, -20450486, -15293305, -24295020, -6189048, 9131100, -3719979, 2039036, 3954054, -3947612, +-12544526, -12080132, -20627654, -7380365, -3905736, 10223096, 7175280, 11234024, -5477157, -9221832, +-3809099, 14668387, 2157147, 12990665, -43198244, -10154913, 20401, 9536438, -13727789, -569083, +-15900506, 12560095, 11107859, 2143189, 53539452, 881005, 16790638, 22028888, 1040993, 7135015, +421981, -3819300, -6339909, 11113228, 16364899, 21309480, -385473, -3995393, 1556389, 14005888, +12802224, 474594, 10397579, 8917963, 7030862, -2829847, 21021718, -6019934, 26948772, -26526254, +-13171591, -32630478, -10068477, 5849209, 885300, -8450348, 1845225, -105227, 14715095, -2959769, +17610976, -8012262, -6409165, -8804683, 4618701, 9844065, -1507534, -4782983, -5222680, 6076305, +178241, 20422570, -3149822, -1402307, 3750043, 5733245, 8504035, -7062000, -544924, 2737505, +4240744, -9748502, 3474629, 3718368, 12606803, -12393128, 7130183, 4726075, -5197448, 10629507, +-5913096, -7282654, 126702, -2469606, 5529771, 2728915, -4289062, -129386, 4558571, 1042603, +10994579, -508954, 7219303, 20288888, -3740917, 894427, 5343476, -27765890, 1164473, 3984656, +17478370, 26663156, -22691386, 5027259, -14305462, 19005768, 17230872, 2182917, 33079838, 10320806, +13174812, -12054899, -1937030, -21111374, 33051384, -19203872, 5166846, 20225538, -4809827, -13001403, +10215580, -2968896, 5170067, 21714280, 566399, -6876780, -1996086, 4077535, -681826, -12872554, +9543954, -1223529, -3650185, 37071472, -28477780, 26824218, 17317308, 33472828, 13639742, -23648090, +18315888, 381178, 17020956, 44077640, -31778464, -13159243, -4082903, 867583, 29968672, -17762910, +1568200, -19075560, 1508070, 33793340, -3796214, 35068944, 9891847, 6008123, 15949361, -21402896, +-3532611, 15426449, 21829708, -35435092, -1252520, -30359514, 13618804, -15781320, -511101, 7198365, +9905805, 766115, -10792179, -8594766, -33196876, -3765613, -23580444, 19147502, 1669132, -1481764, +14913200, 846109, -63888, 14323716, 10697153, 7207492, 188979, -4815195, 6764574, -11207717, +-825707, -7685844, 7706782, 8016557, -6766184, -1296006, -14398341, 6399502, -883153, -5906, +-382252, -13981192, -16849694, -5572183, 5465346, 12794708, 6514392, 5777268, -2026688, 10717554, +7461432, -466004, -5444408, 9324911, -13269301, -3727495, 2774549, 15030238, 12429098, 2695092, +-6045704, -21467320, 6030134, -37565396, -33108292, 478352, 446677, -21028696, 17053168, 4930623, +-5751498, -19514720, 26515518, -6195491, 39475044, -5781563, 8469676, 14241038, -19276350, -6434935, +5971615, -22937810, -12964359, -20062330, 17151952, -16077136, -4436165, -5293011, 14833206, -13558138, +-22949084, -31917512, -1027034, 26502096, 1485522, -14647986, -6337761, -18539764, -6320581, 130997, +10939819, -20877836, -2460480, -4571456, -15000173, -20520280, 842350, 3397856, 13112535, 4515085, +22630182, 6288906, 28592134, -12017855, 23579370, -6078453, -18678276, -4861903, 38435664, -16695075, +17430052, -12246026, 28155658, -15004468, 9393630, 17940616, -1235340, -7435662, 3263102, -10271414, +25581898, -23622320, -9064528, 25680684, -3337190, -21466246, 838592, 19628000, 10744934, 19630148, +-20017232, -16879222, -10894185, -2187749, 19190988, 23415088, -41653668, 2185065, 11819213, -22767622, +3569655, 14368813, 11001559, 10540923, 10108206, 6882685, -3366181, 758062, 7698729, 8828305, +6999186, 17719424, -5574331, 9317932, 3740917, 19183472, 11220065, -14803142, -18919868, 5966247, +19949586, -5731634, -5784247, -12831215, -22084722, 2528662, -18879602, -5858336, 4066260, -12420509, +11385958, 3331284, -4096325, -10253698, -2190433, -10628433, -1084479, 5924908, 2574833, 1688459, +-2081449, -2590402, -35620848, 39280696, -12983686, 33457258, -6896644, 26889180, 2330557, -8318815, +-18257906, -12894566, -2340757, 475131, 19789598, -7430294, -1428614, 5725729, -17840758, 29032368, +10914049, 1156420, -23735064, 16428250, 8712341, -18937048, 18709414, 1702955, -2807298, 4774393, +-455267, 24523726, -5472325, -30645128, 33333778, -17041894, -2565169, 24765856, -10763725, -5317170, +-14618458, 39043400, -17326434, -4738960, -24235426, -4660040, 3113315, 34907348, -16173236, 6628745, +11236171, 20784420, -5304822, -22025130, 24221468, 14680735, 19692426, -9470940, -4536023, 2537252, +21805548, -11940009, -25251724, -28278602, 15249281, -19785304, 5236102, 21255794, 19821274, -13780403, +-4585415, 28585692, -45318884, -1013075, 6440304, 15794742, -1942936, -16536698, -3148211, 26074746, +-4884989, 53473952, 21068426, -15213848, -1893007, 1639067, -6262599, -19276886, -23523000, -17283486, +15029164, -11167989, -4427575, -387084, 23471460, 10162429, -7892540, 10348724, 7699266, -251792, +3610457, 4393752, -98784, 3301756, 24041616, 19718194, 19174344, 13010530, 2014340, -11673721, +6528887, -9105331, 11631845, -14042932, 15538118, 22483616, 7650948, 28461138, 30813170, 12497281, +-83215, 16146393, 5735392, -2852932, -9540196, 16782584, -4138201, -13283260, 36507, 8174397, +-3604551, 7126962, 13357348, 5070209, 13629005, -7598334, -8668318, -50306416, 17134236, 9794673, +44865764, 39315056, -5813238, -14511621, -46227268, 1362578, 15483894, -19785840, 15124727, 27080306, +26346940, -12196097, 31715650, 28351616, 1377611, -17090748, -18301392, 28950764, 24777666, -35150012, +-47914120, 63750200, 3352222, -4493073, 8418673, 4743792, 23700704, 23528904, -9392020, -8018167, +33272038, 15820512, -5873905, -22048214, 13464722, 2690797, 1870995, 11864847, 1745367, -1000191, +-13164612, 7479686, -3874061, -16199006, 29921964, -47421272, 33208150, 27514634, -44844828, -3081102, +23029614, 5834176, 26262114, -6077379, 3791383, 24004572, -3040300, 12284680, -22048214, -35057132, +98967856, -40377524, -56731148, -12375411, 110207248, 47591460, -46802260, -10560251, 19564112, 13507672, +-880468, -28275918, 41514080, 23228256, 17487496, 4156992, -55755116, -9101573, 9218074, 16712791, +-22827752, -37888056, 3473018, 12084427, 5371394, -17835926, -18847928, 9214315, 5225365, 13851270, +-2431488, -4522601, -1261647, 14798847, 18803904, 13007308, -28016072, -10773925, 19967840, 14746770, +-14059575, 174483, 16301548, 28875066, 11346230, -15042049, -20422570, -26714696, 12780212, -8458938, +11893301, -22555020, 12861280, 6749004, 14475650, -10247255, -5377299, -18067854, -7636989, 18134426, +3400540, -14775761, 8361228, 27331562, 7212861, -19659676, -12409234, 24756192, 42871828, 2995203, +71201432, -31570694, -12141873, 41319732, 2040110, -2325725, -21248276, -42415488, 35262220, -22085796, +-24075440, 18336290, -26725434, 13303661, -25341918, -28023588, -4735739, 6200859, 3971771, -6553047, +33728916, 8519068, 20564304, 9947144, 568546, 597000, -15248208, -32318556, 10351945, 32382442, +-26396332, 22640920, -26908506, -2718714, -1489817, -41523208, 29603062, -14335527, 11518565, 902480, +-12261595, 798864, -30110406, 31000000, -21806622, 10421738, -35053912, -21196200, -45974940, 17457968, +-21508660, -24063628, -19560892, -9943923, -6442, 49008260, 17459042, 24288040, -6731288, -22766012, +-28984050, 7755637, 1727651, -49741088, -23255100, -87550760, -41318660, -33790656, -5150203, -40284108, +-33332168, -7212324, 32013612, 36683316, -29827474, -37512780, -43337292, 21898428, 51662016, 2755222, +41530724, 1182727, 25049324, 10207527, 2958159, 12242804, 4376035, -874026, -15106474, 21613886, +17666812, 9679246, -18035642, -6978785, -2494839, 9337259, 9572945, -3431142, 10396505, -4495220, +-12168179, -20904142, 2503966, 29417304, 10426570, -3328063, 8132521, -9306120, 15562814, -5602248, +20378546, 20016696, 2207076, -21248276, 3408594, 4915590, 23106388, 5813238, 26278758, -17548700, +-11048266, 24528022, 25120190, 6900402, -6764037, -4466229, -25179246, -11764452, -50134616, 11805254, +17702782, -43410844, 24063628, 4795331, -12596065, 2597382, -12275553, -1213865, 9343164, 12673375, +22216256, -26148834, 2545842, 30151744, -3350611, -14374182, 27116812, -11917997, 1899449, -16057809, +-6517613, -32063542, 8358543, 772557, 18115098, -12654047, 1343788, 22523346, -10662256, 360240, +23241678, -45625976, 2967823, -52231096, -16616692, -34992708, 27935542, 9876277, -2049773, 11718281, +-10249939, 12784507, 35503272, 9547175, 55122684, -30719216, -35241280, 32469952, 8840116, -23834384, +-22372484, -9139154, 20354924, -19569482, -755377, -16925930, -21849572, 12815646, 16042777, -32583232, +-18941342, 27992450, -497679, 9874130, -6071473, 15333570, 6810745, 28254980, -16468515, -12236899, +7166153, 6500433, -8178155, -29564408, -21609592, -23396298, 31272730, -14561013, -24217174, 6996502, +-6341519, -8003672, -15967615, 5992553, 7150584, -2684892, -4756140, -8715562, -14717242, -2608656, +-3345243, -10763188, 383863, -5291937, -10102300, 6082748, -5966247, 5592585, -5887327, -5034776, +14760192, -5903433, 6971269, 5122822, -14078903, 6228777, 1852205, -5740761, -17071958, 23145042, +15234786, -6635188, 3587372, -11468100, -8685498, 7009924, -214748, -14718316, 5117991, -5937256, +13294534, -3635153, -2484639, 2485712, 6191196, -33851860, -68504192, -34213172, -13007308, 30036316, +39127688, -74772696, 12953084, -29657822, -40523016, -8258149, 46896748, 30023968, 25588342, -16072841, +-18017388, -21510270, 23667954, 16750372, 36499704, 4838818, -47347720, -18477486, 35639100, -5387500, +10470593, 31981400, -15229417, -22000434, -34635152, -34616364, 231928, 22705882, 48842904, 36250060, +23983098, 9909026, -49948860, -53127136, 18613852, -36623188, 8674760, 46992312, 18653042, 3280281, +-23665270, -42347304, -7279433, -18189724, 14239964, 11194832, 7951595, 29502130, -4596689, -5580237, +7710003, 21444234, 34571804, 35949412, 12127377, 32028108, 10702522, 11580306, -7057705, -35624068, +-14074608, -15381888, -29353954, 22191560, 20575578, 15462419, 15206332, -6679748, -35243964, 5959804, +10451266, -421444, 23356570, 15203647, 12209518, -2647311, 1538135, 3587908, 24042690, 24437828, +18371186, 5499706, -4532801, -17683454, -3388729, 10548440, 2938295, -5121212, -187368, -14012868, +-6693707, -8040179, -9415642, 7505992, 26239028, 13105556, -4933844, -2494302, -19814832, -1868848, +6781754, 13467407, 14651207, -4493073, -6431177, -30515206, -17859548, -4274030, 81068, 12499965, +10123238, -5875516, -7536057, 5142687, 1808718, 3350075, 7405061, -8393440, -3212636, -1542430, +4862977, 8346732, 624381, -2689723, -2457795, -12662100, 21192442, -60351268, -121411744, -62691492, +11719892, 47356848, 115472344, 112976432, 47042240, 48051020, 34483756, 1840394, -57573500, -97520456, +-146939952, -43881680, -61496416, -10729902, 59907276, 106827112, 89801864, 79313552, 43687332, -1005559, +-28019830, -37553584, -8069707, -65017752, -51657720, -49057652, -32174674, -26396870, -12279311, -2324114, +22341346, 52674552, 54220204, 53317188, 39007968, 50794432, 26911728, 29049548, -9542880, -2131915, +-24014236, -62963148, -91231008, -110187920, -53413824, -21487722, 17113298, -2839510, 11607149, 25624312, +33469606, 71484360, 82386064, 109236048, 69641824, 7041599, 31807990, -16495896, -60360396, -52765820, +-105075304, -122541320, -91645472, -56626460, -24384140, -19188304, 44069584, 49824840, 138174464, 113186344, +82778512, 81086296, 38805028, -4942971, -54932096, -79373144, -57985280, -69497400, -95481952, -45326400, +2607582, -9320079, 2682744, 41748692, 58132384, 42999600, 22393422, 21742198, 37032280, 15838229, +-2781528, -4425427, -18204218, -3043521, -16246251, -42748884, -22641994, -31874026, -51835424, -9098888, +-9021042, 41435160, 37704980, 22743462, 40567576, 70300560, 50260244, -12310987, -8513699, -33862060, +-30198988, -70717176, -73410120, -35460860, -15011984, 6133750, 24862492, 29518236, 43898324, 50099184, +48352740, 50866372, 12934294, -5132486, -27078696, -32990180, -43663712, -48249664, -48510580, -20837570, +10845329, 14587320, 21026012, 22070764, 15260019, 16369194, 17044578, 5551782, 3984119, -5629629, +-6033892, 10413685, -6889128, -16646756, 1023276, 3924526, -2014340, -4838818, -6873022, 720481, +-1183800, -6866579, -1421634, 733903, 66035, -76773, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -4551055, --7092602, -5158793, 2002529, -785442, -12138651, -6896107, -530428, 1733556, -3736085, 1276142, --4507568, 877784, -3258270, 8514773, -6942278, -3049427, -3053722, 5424544, 3746285, 8668318, -2287070, 1799054, -3967476, 4088272, 520228, 1105417, -485331, 3279745, 4500052, 331786, -4485557, 4254702, -2073396, 2377265, -2534031, -2828236, 315680, -2312303, 1443109, -3624953, --6555731, 1762010, 2340220, -1633161, 1823751, -3136937, 2951180, 4013647, -6924024, 1344862, --382789, 2597918, 2226404, 356482, -6833830, -2056753, -3003256, 2258616, -80531, 679142, --2193655, 1257889, -3505230, 160524, 3803731, 2419140, 257698, -1953136, 1259499, -5598490, --3138011, -4115116, 744640, 697395, -348966, 5898064, 28991, 5140539, 75162, 537945, -481573, -25233, -2788508, 2085207, -168577, 1028645, -596464, 660888, 978179, -384936, --972810, -384936, -292058, -300648, -161598, -1502165, 258772, 1544041, 894427, 15032, -175020, -423054, -678068, 653372, -14011257, -446140, 738198, 198105, 2298344, -4947803, -3628711, 2035815, -2598455, -8352638, 5488432, 5628018, -1329292, 4682588, 3380139, -4632659, -9192841, 1910187, -4166118, 4936528, 352187, 4612258, 674847, -8017094, 3040837, -1525787, --2968359, -3118146, -2435783, 5237176, 4062502, 321049, 4250944, 1531693, -4023848, -4985920, --456877, -1171989, 2139431, 1447404, -3917547, 926102, 2035815, 1917703, -3444564, -2894808, --4562866, -1609002, -1139777, 906775, -1118839, 6113886, 2618856, -956167, -3104188, 1139777, -2547453, 1312649, 6590628, -1107028, 3319473, -399432, -2168422, -4012573, 2823404, -914828, --1857573, 3858491, -1193464, 1279363, -864362, -808528, -4449586, 969052, -1261647, 5223217, -6473590, -3904125, -3962107, -2791729, 1089848, -2506114, -1275068, -1619740, -1610076, -1748052, -1036698, 2405182, -156766, 616865, 719944, -259846, 77309, -1187022, -2645700, -4149475, --9535901, -5700496, -2082522, 6831146, 867047, 1267552, 4173635, 1120987, 1788317, -9989557, --9180493, -5848672, -1552094, -46171, 4205310, -3005403, 3285113, -1721745, -6181532, 1914482, --925565, -4227859, -91805, 5904507, 8575439, 3889630, -3962644, 2299418, 250719, 6190122, --52613, -4942971, -193274, -2888366, 6072010, 2658585, 2835215, 6163278, -1090385, 445066, -8257612, 7231651, -295279, -38655, 546535, -463320, 2181307, 602369, -6055367, -8015483, --2848100, -1021129, 5369, -2659122, -8946417, -952409, 2455111, -4866735, -2390686, -3171297, --2724083, 942745, 1126355, 2942053, -6240588, -4983236, 4781373, -2034204, -1104880, 986769, --388158, 3126199, -6010270, 2371896, 2204929, -2384244, -2301029, 2390149, -2635499, 3812320, --1515587, 33286, -17180, -1505923, 740345, 2817499, 1552094, 317291, 1698123, 483184, --796180, -1540283, -860067, -888521, 335007, 430034, -272194, -226560, 406411, -139050, -12744779, -4890357, -3874597, -620086, 218506, -4765803, 42950, -3334505, 6130529, -1500017, --7580618, -10558103, -2711198, -6993818, 9745818, 791348, 6915971, 5826123, -9241159, -520228, -3879429, 2805688, 4912906, 914291, -594853, -838592, 2304787, -3063386, 3529390, 1948841, --3295851, 2039036, 150324, 2381023, 5299453, -2861522, 2105608, -338766, 3027952, 2605435, --1084479, 3591130, -1017370, 3123515, -2386928, 2848637, -7485055, -3182034, -2733210, 2105608, -6473590, -4755066, -3142306, -1755031, 394600, -2173254, -2867965, -1519345, 2621541, 2123861, -3744138, -1242319, 2134062, -2205466, -2324114, -217970, -1396401, 2590939, -34360, -3910568, -2199560, -2283312, -3849365, -1429687, -2394444, 1693291, -2808909, -7623567, -1080184, -3295851, --3248606, 1653562, -2103460, -4589173, -933619, 970663, -329102, 276489, -45097, -2881923, -92342, 1521492, -1089848, -1204738, 306016, -58519, 550830, 489089, 1495722, 434865, --1298154, 862215, -230318, -460635, -501974, -1290101, -1209570, -1315871, 2166274, 3345243, --1291711, 5071283, -7919383, 3560528, -4727149, -5219459, 7687455, 2869038, -9036074, 957241, -74088, 2743947, -6497212, -4154307, -550830, -5261872, -9604084, -9301289, -6129455, -9282498, -4015258, -953483, 1431835, 5053029, -8144869, 5398237, -2286533, 2536178, 1682017, -813896, -865973, -1163936, -1152125, -5306432, -3166465, 6971806, -2542084, -5767604, -5299453, -501437, --2367601, 2183454, -5064304, -7861938, 1229434, 7337952, -1090385, 4453344, -2509335, 2433636, --3910568, 2998961, 1246077, -5371931, 7939784, 1421634, -1642288, 1859721, 7303055, 6725382, -3554086, -711354, -8097624, -1364189, -6746320, 1955284, -1464584, 1133871, 1193464, 1891396, --6131066, -47245, -438087, 2973728, 6304475, -7865159, 1064615, -2302639, -7351374, -832150, -2166811, -752693, -164283, -707059, 2437931, 475668, -2126009, -1466731, -1535451, -943282, --2534568, 86973, -202400, 1425392, -3058554, -2155537, -227096, -411780, -373662, 139050, --228707, 490700, -1106491, -1153199, -290447, -196495, -803696, -209380, -212064, 1362042, -1277216, -26307, 37581, -1422708, -2296734, -823560, 121870, -9019968, -8642011, -5614059, --9517648, -11278584, -10752451, 4555887, 4975720, -6916508, -1832340, -6261526, -10220948, 5471789, --2683281, -8863739, 3040300, -602906, 444529, 901406, 3002182, 988916, -329102, 2284923, -3056406, -5095979, -4911832, -1317481, -5987185, -421444, -6381785, -11015517, -892279, 6673843, --7997229, -6112812, 4303021, -4205847, 477278, 1700270, -4135517, -3311420, -3512210, -11867532, --5174362, 2554969, -3428995, -3929895, -7518877, 3345780, 6641093, -2411624, 10260677, -5698885, --2729989, -43487, -2529199, -8702677, -658741, 1996623, -333934, -1830730, -7648263, -1250909, -7433515, 3773666, 2157147, 3882651, 2724083, -1968706, 14258218, -4496294, -5608691, -5290863, --6400038, 2525441, 8077223, 5552319, 569620, -1320703, -4160213, -1468342, -178241, -1925219, -290447, -2582886, 941135, 5961952, 3799436, -2928094, -680752, -1060320, 2092723, -1234803, -2282238, -2477123, -1311039, 372588, 413927, -615254, 734439, -1430224, 1483374, 61740, -1154273, 1004486, 661425, -696322, -1212791, -295816, -1225139, 16069083, 10945724, -454193, -9999758, -794032, 1500017, 1949378, -5402532, 9124121, 139586, 8055211, 7719667, -6165963, -10014253, 196495, -7565585, -12503724, 11494943, 5595806, 11419781, -9497246, 6575058, 3586835, --10469520, -10335302, -6110128, -2905546, 11002632, -10405095, 9283572, -856309, -1007707, 6704981, -6312528, 8604967, 3175055, -4644471, 4207458, 8090108, -4860293, 8088497, 12259984, 5243618, -7444789, 3123515, 2113124, 2123861, 327491, -6629282, 2474438, 714575, 499290, 5655398, --3960497, 3390340, 3759707, -1588064, 10693395, -6228240, -3801583, -2373506, 9235790, -1638530, -7627862, 3896609, 5156645, 4667556, 898722, -13000329, -2020782, -10412611, -5676336, 13630616, -7090454, -6017786, -364535, -7428146, -6691559, -3441343, 11298985, 1058710, 3889630, 2258616, --1768990, 2374043, 4045859, 7139310, -2007360, 4201552, 2980707, 2626373, -2439005, -1486059, -1118839, -1195075, -61740, 1999307, 2610803, 1157494, 1126355, 3221762, 3076807, 1224603, -85899, 1588601, -667331, 2749316, 4072703, 2018635, 106837, 4559108, -14037027, 8929237, -8573292, 25295746, 1030255, 2224793, -1229434, -3426847, -1613834, 8580808, 7820062, 6820945, -9852655, 4019553, 15538655, 4574140, -6112812, 1517734, 13545253, 5371394, 1400696, 2132988, --6922414, -9966472, 6436546, -4935991, -9768366, -20712480, -305480, 8279623, -610959, 4893042, --7161321, -3776887, -2663417, 1574642, -2254321, -6194954, -3016141, -16681116, -4342212, -14156212, -1213865, -7453379, 5713917, -8115878, 3112241, -7802345, -2701535, -477815, 250182, 1221381, -1597728, -10342281, 5019743, -1548873, 2307471, -5400385, 155693, 8276939, 3338800, 11435350, -6409165, -3478924, -668404, -2347737, -1159641, -2673617, -3630858, -170725, 4697084, 3045132, -3492882, 2251100, -16338592, 10799695, 10596221, -3953518, 6070937, 4757750, -8633958, 4180077, -2595771, 569083, -1829656, 1530619, 5587216, -4883915, 3258807, -1356136, 287763, -350040, -1235877, 3020436, -2492155, -1081795, 4149475, -2896956, 212601, 174483, 1576790, -1872606, --3466576, 2173254, 140123, -1032940, -1034013, 582505, -121333, 2037962, 2298344, 2633352, -38655, -2683281, 27225798, 9816148, -4545149, 13449153, -8829379, 9381282, 6239514, -12809740, -2734821, -16114717, 331249, -5471789, -11348377, 6079526, 207232, 4655745, 6657736, 8266202, -13254806, 5542656, -940598, -3410741, -9022653, -16240882, 5769215, 6383395, 1768453, -5658083, -8786429, 1163936, 9283035, 5539434, -16952772, -6416145, 2285460, -12454868, 644782, -872415, --2368138, 3696356, 2757369, -2915746, 12502650, -7196755, 497142, 7035694, -6160057, 4842039, --2688650, -7552163, 5084705, -30602, -978179, 7233799, 4767414, 301721, -3737695, 14941654, -668404, 8422968, 846645, -4604205, -5165772, -12453795, -4825396, 5261872, -327491, 4498442, --1410897, -9689983, 3894462, 3266323, -14270029, 4203699, 7368554, -3757023, 7859254, 1906429, --8096014, -8189966, 9370008, -127238, -18738406, 2412698, 2029909, 867583, -1895691, 1184337, --2564632, 551366, 5610301, -1632088, 909459, 1495722, 1665911, -4634270, 1439351, -1598802, -1315871, 3577171, 3702262, 2752000, 1295470, -3004867, 1423782, -174483, -264677, 1351841, --3440269, 58519, 2385854, 3350075, -2141041, -1209570, -4031364, 825171, 4268661, -4068408, -1723356, 1608465, -28284508, -9389872, 29560112, 8208220, 4720169, -4447976, -795643, -4541928, -6029061, -9555228, 12922483, 7395934, 6058588, 6228777, -4577899, -445066, -533113, 4159676, -8697309, -13085155, -7770133, -4177393, 9944460, 3595961, 5546414, 5975374, -1366873, -9379135, -3074660, 738734, 18054968, 14216879, 3732864, 10798085, 586263, -5196374, 2233920, -1485522, --2481417, 6963753, 8548059, 7048042, 17468168, 8449274, 6850473, 7683697, -7929047, -12971875, --6092948, 5928129, -11074573, -5465883, 10755672, 11485279, 6288906, -5178120, 10147934, -3986267, -1102196, 2443300, 5827197, -2972654, -6338298, 3643206, -5716602, -17891760, 773631, 5805185, --9765682, 1290101, -1764158, -2515777, -1791538, -5779416, 14564234, -1505386, 8323647, -20871394, --19872276, -16811038, -7678328, 1729798, 2040110, -531502, 1147293, -338766, -4441533, 2195265, --4882304, -1420560, -2142652, 5111548, 805306, 1860258, -3922379, -706522, -3491809, -1248225, -2765959, 4418448, 4722854, 4558034, -67109, -3022046, 2466922, 4017942, 2472291, 4000762, -1389422, -361851, 1678795, 589484, 818191, -1179505, -2735357, 3234647, 3587372, -1167157, --1034550, -777389, -604517, 14556181, 22890566, -33740188, -4788889, 1999307, -272730, -4055523, --8426726, 9223442, -10812580, -17172352, -1762547, 16741783, -2416456, -9810242, 3093987, -13719736, --7461969, 529892, 8780524, -14380624, 1578937, 15661598, 16069083, 402116, 5680094, 14035953, --8051990, -12569759, -17564806, 1684701, -17508972, -3754338, 7349226, 6909529, -15495168, -14623290, --8894877, 6272800, -4128537, -2746632, -4080756, 13936632, -20750060, -6083285, 3210488, -11199664, --3872450, 19864, -13096966, 588411, 5364414, -731755, 17133162, -1180579, -6962142, 1436130, --884226, -5652177, 3273839, 8419747, -7825431, 12015171, -5961952, -22426708, 1035624, -8766028, --4815195, -643708, -2414309, -29580514, -4980015, 13529147, 11684995, 8164196, 17628156, 17952426, --24338506, -2754685, 1552631, 5033165, -7082938, -12135967, -242129, 5468030, 6469295, 5516886, -4306242, 2034741, 3471407, -6523519, 23622, 3852049, -2058363, -1536525, 711891, 1227287, -3491809, -3912178, 703301, -1607928, 1631014, 2240362, -5201743, 704375, -541166, -3613678, -1511292, -868657, 674310, 110595, -95563, -4560719, 2295660, 259846, 1195075, -3060701, --2258079, -2051384, -1905892, -32273458, 8995272, -6016176, 10984916, -10339060, -122407, 16858284, --5657546, 23958938, 5499706, 4604205, -10320806, 4519916, 11871290, -7338489, -1501091, 15489263, -9979357, 11654931, 1637993, -17940616, 11387032, -11588896, -1093069, -6991670, 1763621, -8923331, -5173825, -2336462, 5042292, 4798552, 8565775, 8684424, 9640591, -11453604, 2724620, 18262200, -3893388, -3292629, -3671660, -9187472, -7406134, -49392, 671089, 3278671, 15371151, 1315334, -8479339, 8210904, -580894, -3928285, -3741454, 13943611, -16296717, -3555159, -14421426, -11891691, --3338263, 89657, -24196772, 6279779, -7606924, 14809047, -3069291, 635655, 10284836, 2093260, -24845848, 20510616, 29595546, 11181947, 1257889, -3451006, -3000572, -5004174, -1451162, -5949604, --16291885, 11024644, 13510357, 6424734, -2202781, 1493575, -11472395, -15628312, 7257421, 1912334, -2164664, -5052492, -2145873, -5481452, -2945811, 4766877, 1597728, 6254010, -401579, 1357747, --3587908, 4345433, -12921409, -3463354, -441845, -571768, -2419140, 2216203, 605590, 773094, --878858, -3217468, -618475, -1381906, -849867, 3959960, 495532, 425202, -2641942, 787053, -664646, -287763, -5752035, -4281546, -9451612, 12746926, -3721052, -2775623, 29734058, -6124624, --6527814, 33059974, -460635, 18814642, 13888314, 1112933, 7797513, -4434017, 6117107, 5741298, -3651796, 4660040, 15285252, -10528575, 18417894, -10136123, -301721, 3772592, -2476586, -13349295, --11913166, -355945, -19345606, -6186901, -21134460, -1461363, -12550431, -9402757, -6867116, -6044093, -3166465, -17012366, 19753628, 3094524, -12809740, -9577777, -597000, -2487323, -3127810, 5102958, -2723546, 19407884, 2240899, -224949, -9905268, 1631014, 4034585, -732292, -10567230, -4588099, -12194486, 13279502, -774705, -11288785, 4628364, -2226404, 17339320, 19293530, -7524246, -4997195, --3553012, 2188286, -7400229, 7798050, -24005110, -2257542, 28399934, -25616796, -12612708, -5938329, -1851668, 2265595, 3399467, -2319819, 7612830, -4541928, -1269700, 13821205, -2167348, 10016937, --6771016, 10091026, -8825621, 6911676, 5641440, 13718662, -278636, -2320893, 5799817, 9030706, -808528, -2162516, -1415192, 919123, -4902169, -1495186, 4625680, 6095633, 1921998, -1975685, -5922223, -4624069, 4866198, 4063576, 4440460, 2444910, 163209, -7209640, 7250979, 4285841, -3357054, 1592359, 3421478, 6343130, 1460826, -4976257, 2484102, -4055523, -3124052, 5250061, --1276679, 4545149, 4926865, -1922535, -3582540, 2027225, -17297980, -9479530, -2705830, 13387413, -16136729, 11059541, -10268193, -26353382, 45624364, 11477763, -28632400, -28727426, -4304094, 6956774, -19432042, -24992952, -4412005, 4667019, -361314, -3594351, 26146150, 5610301, -15349139, 8195872, -1079111, -733903, 13765370, -2511482, 7522635, -17040820, -5773510, 29944512, 11061151, 23613730, -7451232, 21349208, 3731790, -7841537, 15009837, 13681081, 21442088, 10559714, -24218784, -9183177, -5235565, 12517682, -9730248, 3692598, -9375914, -15658914, 1580011, -1810329, -9373229, 7284802, -10142565, 8808978, 6431177, 6039261, -4622459, 16207059, -133681, -16102369, -11697880, 14576582, -7896834, -25289842, 10991895, 4489852, 8124468, -22097606, -15111842, 14209362, 21943524, 12409234, --4941360, -23630910, 5339718, -1045288, 20143396, -6728067, -27101780, 11356430, 15796890, -5990406, -16441135, 13538811, 5572183, -10821707, 1409823, -142808, 3153043, 1186485, -745177, -5757941, --2430952, -7226820, -760746, -1428077, 3764539, -4414690, -2660732, -1483374, -3321084, -2019172, --1772211, -2018098, 8383240, 2524904, 85362, 8169028, -2044941, -7707856, -5192079, -4131222, --3348464, 354335, -5637682, 2360085, 3400004, 2887292, 2132988, -7403450, -2896419, 6211597, -5105643, -766652, 10897943, 21285322, 8205535, 22471268, 3767760, 10310069, 7679939, 37430640, -50927036, 3984656, 10193568, -32407676, -10296647, 19607062, -16514149, 38554848, -7670275, 6080063, -10386305, 22580790, 12524662, -5376226, -16356846, -19170586, -6326487, -3151432, -24041616, -11393474, --9566503, 15428059, -8946954, 4595615, -15420006, 2055142, -6063957, -22496502, 23380192, 16217797, -18821084, 8291435, -11482058, -11115912, -26188564, 483721, -23606750, -7170448, -2017024, 3112241, -12071542, 9525701, -7672959, -5435818, 9996536, 22111028, 5924908, 8454106, 16123307, -20565378, -14555107, -11681774, -10815265, -20764020, -9117679, 9495099, 8007967, 1323387, 24254754, -5315559, --9028021, 3718368, 6327024, 33348274, -10996727, 13368623, 13144211, -32058172, 8590, 4005594, --7093139, -4724464, 11054172, -6362457, 913754, 13583371, 6990596, -19729470, -23710366, -22867480, --10735271, -8512088, 19040126, 16623134, -4589173, -7268159, 944893, 2110440, 12549894, -1419487, --3965866, 7801808, -1464584, -1301375, -3326989, 5651103, 7721815, -4109210, 7391102, 6984691, -7148436, 1262184, -3043521, 6319508, -4381941, 3786014, 8050380, 593779, 4800163, 6445136, --10949482, -477815, 5327370, 5957657, 8024610, 944356, 7184407, 378494, 462783, -2469606, -4125316, 6041409, 31903554, -7567196, 4663261, -14266808, -4087198, -19018652, 15111306, -27362700, -1257352, -22033720, 4359929, 9433896, 3423626, -13188771, 45197016, -3176128, -6080600, 4103841, --25724170, 1475858, -17381732, 597000, 4884452, -5211943, -592706, 10644003, -9445707, 405338, -13678397, 1116692, 3460670, -22136262, 2818036, -1873143, -1380832, -5609228, -27460410, -15285789, -6785512, 2242510, 12191802, -31822486, 3469260, -29617558, 15015743, -20201378, -32309428, 16357383, -29788820, 5131412, 14652281, -22317724, 22095996, -5484137, 3298535, -13691282, 18403934, 7408282, -19110456, 5994701, 23186918, -21012590, 4012036, 1152662, -3601867, -16663399, -13583371, -15663209, -17768280, -4742718, 24148454, -15016816, -11518565, 2692945, 3216394, -13434658, 6971269, -7908646, --31454730, 13810467, 20837034, 34586296, 12099460, 24527484, -14184666, 26307, -15992311, 26275000, -8862665, -5061082, -10480794, 12460774, -8993125, -2555506, 1329292, -7960722, -13394929, -8953933, --6352794, -5352066, -17838610, -7793218, -14870787, 11421392, -2843805, 6769406, 13340705, 3479997, --10123238, -1021665, -10131291, -4399121, -15136538, -8413841, -16021839, -2863670, 26208428, 5284421, --2025614, 5820218, 7844221, -15239618, -6995965, -958315, -2057826, -6371584, 6633040, -3070902, --23232014, -2084133, -5367636, -52807160, 6482180, -16870094, 48863844, -9197672, -24679956, 9811316, --1419487, -24587078, -4214974, 4092030, -14811732, 36892160, 5228586, 3539053, 16729971, -20747376, --31947040, -19682224, 45009648, -3593814, -9596031, 29753922, 16756278, -14192183, -14139032, -7950522, -35668628, 5004711, -8750459, -13963476, -6785512, -27888834, 18769008, -3249143, 7577396, 17940616, --6395207, -28882582, -3590593, 37249176, -1654099, -9290014, 17893908, -8156680, 22217866, 14625974, --1951526, -27523224, -14085882, -3773129, -25538950, -14948097, -14737643, 1998234, -3554622, 21510270, --15018964, -5186710, -142271, 55300388, 19175956, -9516574, 11149735, 6524056, -3293166, 28085864, -13615583, -10624675, 4365835, 22708566, 25617870, -15652471, -11206643, -37548216, -30183956, 17166984, --11292543, 18532248, -534187, -22073984, 5375152, -1743220, 6983080, -14685567, -11233487, 20794622, -5235029, 2762201, -2084670, -2424509, 13785771, -6620692, 7091528, -3528316, 8595303, 17470854, -4625680, -12620761, 2064269, -4847945, 9501005, 7862475, 2589865, 11373610, 17666812, -6942815, -14249091, -1379758, -18945100, -4895189, 592169, -10585484, 4250407, 13791140, -272194, -6979322, -843424, -2579128, 17974438, 15420543, 1561758, 7299297, 9258339, 4843650, 12006044, -15411953, --11476689, 5516349, 3095061, -3275450, -1370632, -2537252, -5765994, -5684926, -59680720, 20480014, --12782896, 31747324, 32278290, -18722836, 15235860, -31965294, -47995724, 1163936, -33758980, 4429722, --4236985, 26101054, -19398220, 18620830, 15971910, 26178900, -39882528, 4342749, -24414204, -22369800, -2406792, -28876138, -18634252, 26196616, -7661685, 9943923, 30586610, -6075231, 10064182, -25218438, -2889976, -27804544, 25761750, -23048942, -15311558, -17015050, 28738164, 23036058, -16511465, 31501438, -20855824, -6666326, 31257162, -1743757, -33085744, -9141838, -3904662, -25776246, 5801427, -54536956, -5468567, -13874355, -26179436, -21137144, 24375550, -14559939, 50542100, 37563248, -56511568, 25770, --1478543, 2714419, 26121992, -44361644, -30942556, 30522186, -25433186, -31774704, -36597952, 2481954, -75163536, 37371048, -34979288, -22007950, 3047816, 27374510, 10460930, -36557152, 5439039, -24414204, --14358076, -1273458, -4403415, 1437203, 24127516, 5733245, 14307610, 9516574, -28135794, 7592429, -12632036, -3942780, -10138807, 1521492, -24008868, 21409876, 7762080, 5880884, -31843424, 5352603, -16428787, 4673998, -7521562, -5916855, 14122926, -23194434, -1495186, -17286706, -9580998, 22805740, --24059334, -943819, 14344654, -12032888, 11247446, 13701483, 3558917, 2088428, 10030359, 3318399, --12801150, 18737332, -14424648, -11258720, -6545530, -19704774, -6808597, -18464602, -17700098, 6441377, -27705224, -31722628, 15244986, -52969832, -8336532, -20909512, -18252538, 27302570, -36308580, -56439092, -32251984, 48736604, 11502996, -10035191, -45134200, 2535105, 17087528, 16998406, -7909183, -18435610, -1834488, -4940823, -6259378, 5177046, -6991133, -15537044, -29681446, 3182571, -18014704, 3833258, --16186658, -33934000, 20365662, 14726906, 25133074, 351114, 27217208, 14911053, 3783329, -9503152, --14465987, -23549842, -16761110, -9807021, 6177774, 15297063, -10975789, -5750425, -38395396, 35163436, -42000484, 22991496, -21893058, 22036404, -29772714, -1025423, 6485401, -64990908, 4981625, 5852967, -30182346, -39003136, 49371184, 18953154, -35807680, -20685100, 14715632, -6731825, -26287348, -32471026, --34639448, -47457240, 34333432, -15293842, 5234492, -72285376, -28754806, 3920768, 597000, 15973520, --11619497, 2421288, 12075837, 12390981, -34459596, -8358007, 5414880, 18523120, 13640816, -3445101, --13322452, -6110665, -2994666, 17259326, 2886755, -11596412, -1451162, -9121974, -3461207, 15923054, -7415261, -8611409, 17419850, -17943836, -10317585, -13514115, 16853452, -7227356, 1965484, -8281771, -7346542, -24772298, 3558917, 9674951, 3807489, -4734128, -10632192, -9602473, -12427488, 11839077, -2647311, -4573067, -14209362, 14245870, 833224, 609885, 2107218, -25211994, -12131672, -16657494, -2123861, -8650601, -5191005, -49203684, -6680285, 17721036, -23166516, -21619254, 20138564, 20377472, -4060355, -19556596, -66505420, -9937481, 12884902, 7735773, 28697360, -818728, 16646219, -4524748, --510027, -8558259, 1156957, 17374216, 1948305, 507880, 17000018, -4776004, -4195110, -22671522, --2142652, -3841312, -2582349, 3624953, 13560285, 18371186, -3715684, -244276, 14548128, -3562139, --28192702, -2196876, -25030532, 3368865, 3357591, -33028298, 23708756, -45410152, 10064182, 12132209, --19828790, -1687922, 58486716, -16869020, 19724100, -12663711, 10427644, -44146896, 4700305, 25335476, --710280, 21810380, -5173288, 1971390, -1444720, 27953794, -18219788, -22220014, 25097642, -23550380, --28645822, -733366, -45744624, 30147986, 25373056, -9541807, 9797894, 3833795, -268435, -39352636, --6406481, -3383361, 17177184, 6027987, -16414828, 15046881, -1100049, -20272782, -13440026, -12776991, -2659122, 2247879, -2682744, -900869, 12474196, -12755516, -3506841, 8107825, -13079786, -7558069, -10132365, -13937169, 927176, 11440182, 794569, -3838627, 5232344, -957241, 1236951, 9906342, --3741990, -3670587, -7893076, 2964064, -4956929, -5311801, 4631586, 5192079, -11119670, 1296543, --10375030, 9596031, -11818676, 6113349, -2147, -2654290, 1276142, -3134253, -1298154, -1010928, --24344412, -73437496, -34567508, -11567958, 23879482, 53955528, -49584324, 10736881, -14407468, -50005232, --7064148, 44777180, 12000139, 36872296, -31261994, 9196062, -10866267, 2102387, 21749178, 3611531, -11792906, -7140383, -63677724, 18786724, 3073586, -27084600, 27679454, 21090974, -19274202, 19491098, -2308545, -20795694, 6314676, -12878459, 39758512, 4809290, 16085189, 696322, -40853728, -32772212, --11042898, -24304146, 26548266, 38097972, 39226472, 31512712, -10946798, 4332549, -32097902, -4915590, --3239479, -13582297, -16917876, 2649458, 3092377, -44178572, -12920872, -17325362, -1216013, 19662898, --21701932, -5098126, 7625715, -47245, 22699440, -25248502, -1024887, -28591598, -14975477, -21165062, -11605002, 7471633, 22677428, -3177202, -2358474, -26966490, -8054138, -12869870, -3382287, 11218455, -15530602, 31785442, -20477330, 5679021, -17743046, 6232535, 11955041, 3192235, -9766756, -4144644, --3433290, -4148939, -1451162, 8264054, 8860518, -2688650, -1047435, -4440996, -6289443, 3919695, -8818642, 2806224, 978716, 2199023, -7445326, -8864812, -8112657, 13202193, -383863, 9066139, -7648263, -1492501, -10449119, -11423539, 1665374, 2910914, -8671539, -3003256, -7547868, 5342940, --5470715, 1664300, 1581622, 5586679, -2953864, -3687230, 1423245, 1856500, 19069654, -30870078, --121735480, -64207612, 13144211, 51173460, 114566640, 87520696, 49303540, 16576426, 25710212, -8192650, --48204028, -93235152, -124003760, -31402116, -35947804, 1829656, 60381872, 86106576, 57753352, 77144592, -17760226, 16320876, -9034464, -39085812, -44229572, -35800700, -38006704, -47027744, -37682432, -16148540, --2424509, -619549, 30116310, 39039104, 74721696, 35265440, 11625403, 30636002, 47688632, 15158013, -9101036, -38524248, -52668648, -86129664, -39782136, -45198088, -32673964, -19499688, -15266461, 6323266, -10608032, 36142148, 74115568, 59569048, 65069828, 48119204, 59035400, 43867724, -35504348, -32614908, --82030120, -63602560, -46495704, -104545944, -80806592, -49507552, 3929895, 63265944, 60369524, 71256728, -89193584, 76190576, 41084584, 49425408, 1976222, -19454592, -52309480, -76060648, -76292576, -63052268, --37826852, -8249022, 10888279, 18323942, 21182778, 35179540, 25507274, 41162968, 26134876, 10223633, -6768869, -1685238, -4026532, -1090922, -28506772, -20043538, -3994320, -13382581, -34053720, -9693204, --12197170, -12805445, -2317672, 25358560, 48223356, 39826156, 4258460, 39140036, 27724550, -5282810, --32276680, -51323784, -47537772, -21697102, -23513336, -14889041, -8125005, 13423920, 29911762, 41248864, -47119012, 33740728, 13318694, 14351096, -8957154, -25884694, -43292196, -39007428, -17136382, -1905892, --12637404, -4318590, 12534325, 15674483, 16426102, 15391015, 4071092, 6305549, 10040023, -1909650, --8971650, 105764, 3290482, -6816650, -7377143, -1222455, 3005940, 1996086, -4589173, -2531883, -2313377, 876173, -3190087, -4255239, -1751810, 462246, -71941, -90194, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-7092602, -5158793, 2002529, -785442, -12138651, -6896107, -530428, 1733556, -3736085, 1276142, +-4507568, 877784, -3258270, 8514773, -6942278, -3049427, -3053722, 5424544, 3746285, 8668318, +2287070, 1799054, -3967476, 4088272, 520228, 1105417, -485331, 3279745, 4500052, 331786, +4485557, 4254702, -2073396, 2377265, -2534031, -2828236, 315680, -2312303, 1443109, -3624953, +-6555731, 1762010, 2340220, -1633161, 1823751, -3136937, 2951180, 4013647, -6924024, 1344862, +-382789, 2597918, 2226404, 356482, -6833830, -2056753, -3003256, 2258616, -80531, 679142, +-2193655, 1257889, -3505230, 160524, 3803731, 2419140, 257698, -1953136, 1259499, -5598490, +-3138011, -4115116, 744640, 697395, -348966, 5898064, 28991, 5140539, 75162, 537945, +481573, -25233, -2788508, 2085207, -168577, 1028645, -596464, 660888, 978179, -384936, +-972810, -384936, -292058, -300648, -161598, -1502165, 258772, 1544041, 894427, 15032, +175020, -423054, -678068, 653372, -14011257, -446140, 738198, 198105, 2298344, -4947803, +3628711, 2035815, -2598455, -8352638, 5488432, 5628018, -1329292, 4682588, 3380139, -4632659, +9192841, 1910187, -4166118, 4936528, 352187, 4612258, 674847, -8017094, 3040837, -1525787, +-2968359, -3118146, -2435783, 5237176, 4062502, 321049, 4250944, 1531693, -4023848, -4985920, +-456877, -1171989, 2139431, 1447404, -3917547, 926102, 2035815, 1917703, -3444564, -2894808, +-4562866, -1609002, -1139777, 906775, -1118839, 6113886, 2618856, -956167, -3104188, 1139777, +2547453, 1312649, 6590628, -1107028, 3319473, -399432, -2168422, -4012573, 2823404, -914828, +-1857573, 3858491, -1193464, 1279363, -864362, -808528, -4449586, 969052, -1261647, 5223217, +6473590, -3904125, -3962107, -2791729, 1089848, -2506114, -1275068, -1619740, -1610076, -1748052, +1036698, 2405182, -156766, 616865, 719944, -259846, 77309, -1187022, -2645700, -4149475, +-9535901, -5700496, -2082522, 6831146, 867047, 1267552, 4173635, 1120987, 1788317, -9989557, +-9180493, -5848672, -1552094, -46171, 4205310, -3005403, 3285113, -1721745, -6181532, 1914482, +-925565, -4227859, -91805, 5904507, 8575439, 3889630, -3962644, 2299418, 250719, 6190122, +-52613, -4942971, -193274, -2888366, 6072010, 2658585, 2835215, 6163278, -1090385, 445066, +8257612, 7231651, -295279, -38655, 546535, -463320, 2181307, 602369, -6055367, -8015483, +-2848100, -1021129, 5369, -2659122, -8946417, -952409, 2455111, -4866735, -2390686, -3171297, +-2724083, 942745, 1126355, 2942053, -6240588, -4983236, 4781373, -2034204, -1104880, 986769, +-388158, 3126199, -6010270, 2371896, 2204929, -2384244, -2301029, 2390149, -2635499, 3812320, +-1515587, 33286, -17180, -1505923, 740345, 2817499, 1552094, 317291, 1698123, 483184, +-796180, -1540283, -860067, -888521, 335007, 430034, -272194, -226560, 406411, -139050, +12744779, -4890357, -3874597, -620086, 218506, -4765803, 42950, -3334505, 6130529, -1500017, +-7580618, -10558103, -2711198, -6993818, 9745818, 791348, 6915971, 5826123, -9241159, -520228, +3879429, 2805688, 4912906, 914291, -594853, -838592, 2304787, -3063386, 3529390, 1948841, +-3295851, 2039036, 150324, 2381023, 5299453, -2861522, 2105608, -338766, 3027952, 2605435, +-1084479, 3591130, -1017370, 3123515, -2386928, 2848637, -7485055, -3182034, -2733210, 2105608, +6473590, -4755066, -3142306, -1755031, 394600, -2173254, -2867965, -1519345, 2621541, 2123861, +3744138, -1242319, 2134062, -2205466, -2324114, -217970, -1396401, 2590939, -34360, -3910568, +2199560, -2283312, -3849365, -1429687, -2394444, 1693291, -2808909, -7623567, -1080184, -3295851, +-3248606, 1653562, -2103460, -4589173, -933619, 970663, -329102, 276489, -45097, -2881923, +92342, 1521492, -1089848, -1204738, 306016, -58519, 550830, 489089, 1495722, 434865, +-1298154, 862215, -230318, -460635, -501974, -1290101, -1209570, -1315871, 2166274, 3345243, +-1291711, 5071283, -7919383, 3560528, -4727149, -5219459, 7687455, 2869038, -9036074, 957241, +74088, 2743947, -6497212, -4154307, -550830, -5261872, -9604084, -9301289, -6129455, -9282498, +4015258, -953483, 1431835, 5053029, -8144869, 5398237, -2286533, 2536178, 1682017, -813896, +865973, -1163936, -1152125, -5306432, -3166465, 6971806, -2542084, -5767604, -5299453, -501437, +-2367601, 2183454, -5064304, -7861938, 1229434, 7337952, -1090385, 4453344, -2509335, 2433636, +-3910568, 2998961, 1246077, -5371931, 7939784, 1421634, -1642288, 1859721, 7303055, 6725382, +3554086, -711354, -8097624, -1364189, -6746320, 1955284, -1464584, 1133871, 1193464, 1891396, +-6131066, -47245, -438087, 2973728, 6304475, -7865159, 1064615, -2302639, -7351374, -832150, +2166811, -752693, -164283, -707059, 2437931, 475668, -2126009, -1466731, -1535451, -943282, +-2534568, 86973, -202400, 1425392, -3058554, -2155537, -227096, -411780, -373662, 139050, +-228707, 490700, -1106491, -1153199, -290447, -196495, -803696, -209380, -212064, 1362042, +1277216, -26307, 37581, -1422708, -2296734, -823560, 121870, -9019968, -8642011, -5614059, +-9517648, -11278584, -10752451, 4555887, 4975720, -6916508, -1832340, -6261526, -10220948, 5471789, +-2683281, -8863739, 3040300, -602906, 444529, 901406, 3002182, 988916, -329102, 2284923, +3056406, -5095979, -4911832, -1317481, -5987185, -421444, -6381785, -11015517, -892279, 6673843, +-7997229, -6112812, 4303021, -4205847, 477278, 1700270, -4135517, -3311420, -3512210, -11867532, +-5174362, 2554969, -3428995, -3929895, -7518877, 3345780, 6641093, -2411624, 10260677, -5698885, +-2729989, -43487, -2529199, -8702677, -658741, 1996623, -333934, -1830730, -7648263, -1250909, +7433515, 3773666, 2157147, 3882651, 2724083, -1968706, 14258218, -4496294, -5608691, -5290863, +-6400038, 2525441, 8077223, 5552319, 569620, -1320703, -4160213, -1468342, -178241, -1925219, +290447, -2582886, 941135, 5961952, 3799436, -2928094, -680752, -1060320, 2092723, -1234803, +2282238, -2477123, -1311039, 372588, 413927, -615254, 734439, -1430224, 1483374, 61740, +1154273, 1004486, 661425, -696322, -1212791, -295816, -1225139, 16069083, 10945724, -454193, +9999758, -794032, 1500017, 1949378, -5402532, 9124121, 139586, 8055211, 7719667, -6165963, +10014253, 196495, -7565585, -12503724, 11494943, 5595806, 11419781, -9497246, 6575058, 3586835, +-10469520, -10335302, -6110128, -2905546, 11002632, -10405095, 9283572, -856309, -1007707, 6704981, +6312528, 8604967, 3175055, -4644471, 4207458, 8090108, -4860293, 8088497, 12259984, 5243618, +7444789, 3123515, 2113124, 2123861, 327491, -6629282, 2474438, 714575, 499290, 5655398, +-3960497, 3390340, 3759707, -1588064, 10693395, -6228240, -3801583, -2373506, 9235790, -1638530, +7627862, 3896609, 5156645, 4667556, 898722, -13000329, -2020782, -10412611, -5676336, 13630616, +7090454, -6017786, -364535, -7428146, -6691559, -3441343, 11298985, 1058710, 3889630, 2258616, +-1768990, 2374043, 4045859, 7139310, -2007360, 4201552, 2980707, 2626373, -2439005, -1486059, +1118839, -1195075, -61740, 1999307, 2610803, 1157494, 1126355, 3221762, 3076807, 1224603, +85899, 1588601, -667331, 2749316, 4072703, 2018635, 106837, 4559108, -14037027, 8929237, +8573292, 25295746, 1030255, 2224793, -1229434, -3426847, -1613834, 8580808, 7820062, 6820945, +9852655, 4019553, 15538655, 4574140, -6112812, 1517734, 13545253, 5371394, 1400696, 2132988, +-6922414, -9966472, 6436546, -4935991, -9768366, -20712480, -305480, 8279623, -610959, 4893042, +-7161321, -3776887, -2663417, 1574642, -2254321, -6194954, -3016141, -16681116, -4342212, -14156212, +1213865, -7453379, 5713917, -8115878, 3112241, -7802345, -2701535, -477815, 250182, 1221381, +1597728, -10342281, 5019743, -1548873, 2307471, -5400385, 155693, 8276939, 3338800, 11435350, +6409165, -3478924, -668404, -2347737, -1159641, -2673617, -3630858, -170725, 4697084, 3045132, +3492882, 2251100, -16338592, 10799695, 10596221, -3953518, 6070937, 4757750, -8633958, 4180077, +2595771, 569083, -1829656, 1530619, 5587216, -4883915, 3258807, -1356136, 287763, -350040, +1235877, 3020436, -2492155, -1081795, 4149475, -2896956, 212601, 174483, 1576790, -1872606, +-3466576, 2173254, 140123, -1032940, -1034013, 582505, -121333, 2037962, 2298344, 2633352, +38655, -2683281, 27225798, 9816148, -4545149, 13449153, -8829379, 9381282, 6239514, -12809740, +2734821, -16114717, 331249, -5471789, -11348377, 6079526, 207232, 4655745, 6657736, 8266202, +13254806, 5542656, -940598, -3410741, -9022653, -16240882, 5769215, 6383395, 1768453, -5658083, +8786429, 1163936, 9283035, 5539434, -16952772, -6416145, 2285460, -12454868, 644782, -872415, +-2368138, 3696356, 2757369, -2915746, 12502650, -7196755, 497142, 7035694, -6160057, 4842039, +-2688650, -7552163, 5084705, -30602, -978179, 7233799, 4767414, 301721, -3737695, 14941654, +668404, 8422968, 846645, -4604205, -5165772, -12453795, -4825396, 5261872, -327491, 4498442, +-1410897, -9689983, 3894462, 3266323, -14270029, 4203699, 7368554, -3757023, 7859254, 1906429, +-8096014, -8189966, 9370008, -127238, -18738406, 2412698, 2029909, 867583, -1895691, 1184337, +-2564632, 551366, 5610301, -1632088, 909459, 1495722, 1665911, -4634270, 1439351, -1598802, +1315871, 3577171, 3702262, 2752000, 1295470, -3004867, 1423782, -174483, -264677, 1351841, +-3440269, 58519, 2385854, 3350075, -2141041, -1209570, -4031364, 825171, 4268661, -4068408, +1723356, 1608465, -28284508, -9389872, 29560112, 8208220, 4720169, -4447976, -795643, -4541928, +6029061, -9555228, 12922483, 7395934, 6058588, 6228777, -4577899, -445066, -533113, 4159676, +8697309, -13085155, -7770133, -4177393, 9944460, 3595961, 5546414, 5975374, -1366873, -9379135, +3074660, 738734, 18054968, 14216879, 3732864, 10798085, 586263, -5196374, 2233920, -1485522, +-2481417, 6963753, 8548059, 7048042, 17468168, 8449274, 6850473, 7683697, -7929047, -12971875, +-6092948, 5928129, -11074573, -5465883, 10755672, 11485279, 6288906, -5178120, 10147934, -3986267, +1102196, 2443300, 5827197, -2972654, -6338298, 3643206, -5716602, -17891760, 773631, 5805185, +-9765682, 1290101, -1764158, -2515777, -1791538, -5779416, 14564234, -1505386, 8323647, -20871394, +-19872276, -16811038, -7678328, 1729798, 2040110, -531502, 1147293, -338766, -4441533, 2195265, +-4882304, -1420560, -2142652, 5111548, 805306, 1860258, -3922379, -706522, -3491809, -1248225, +2765959, 4418448, 4722854, 4558034, -67109, -3022046, 2466922, 4017942, 2472291, 4000762, +1389422, -361851, 1678795, 589484, 818191, -1179505, -2735357, 3234647, 3587372, -1167157, +-1034550, -777389, -604517, 14556181, 22890566, -33740188, -4788889, 1999307, -272730, -4055523, +-8426726, 9223442, -10812580, -17172352, -1762547, 16741783, -2416456, -9810242, 3093987, -13719736, +-7461969, 529892, 8780524, -14380624, 1578937, 15661598, 16069083, 402116, 5680094, 14035953, +-8051990, -12569759, -17564806, 1684701, -17508972, -3754338, 7349226, 6909529, -15495168, -14623290, +-8894877, 6272800, -4128537, -2746632, -4080756, 13936632, -20750060, -6083285, 3210488, -11199664, +-3872450, 19864, -13096966, 588411, 5364414, -731755, 17133162, -1180579, -6962142, 1436130, +-884226, -5652177, 3273839, 8419747, -7825431, 12015171, -5961952, -22426708, 1035624, -8766028, +-4815195, -643708, -2414309, -29580514, -4980015, 13529147, 11684995, 8164196, 17628156, 17952426, +-24338506, -2754685, 1552631, 5033165, -7082938, -12135967, -242129, 5468030, 6469295, 5516886, +4306242, 2034741, 3471407, -6523519, 23622, 3852049, -2058363, -1536525, 711891, 1227287, +3491809, -3912178, 703301, -1607928, 1631014, 2240362, -5201743, 704375, -541166, -3613678, +1511292, -868657, 674310, 110595, -95563, -4560719, 2295660, 259846, 1195075, -3060701, +-2258079, -2051384, -1905892, -32273458, 8995272, -6016176, 10984916, -10339060, -122407, 16858284, +-5657546, 23958938, 5499706, 4604205, -10320806, 4519916, 11871290, -7338489, -1501091, 15489263, +9979357, 11654931, 1637993, -17940616, 11387032, -11588896, -1093069, -6991670, 1763621, -8923331, +5173825, -2336462, 5042292, 4798552, 8565775, 8684424, 9640591, -11453604, 2724620, 18262200, +3893388, -3292629, -3671660, -9187472, -7406134, -49392, 671089, 3278671, 15371151, 1315334, +8479339, 8210904, -580894, -3928285, -3741454, 13943611, -16296717, -3555159, -14421426, -11891691, +-3338263, 89657, -24196772, 6279779, -7606924, 14809047, -3069291, 635655, 10284836, 2093260, +24845848, 20510616, 29595546, 11181947, 1257889, -3451006, -3000572, -5004174, -1451162, -5949604, +-16291885, 11024644, 13510357, 6424734, -2202781, 1493575, -11472395, -15628312, 7257421, 1912334, +2164664, -5052492, -2145873, -5481452, -2945811, 4766877, 1597728, 6254010, -401579, 1357747, +-3587908, 4345433, -12921409, -3463354, -441845, -571768, -2419140, 2216203, 605590, 773094, +-878858, -3217468, -618475, -1381906, -849867, 3959960, 495532, 425202, -2641942, 787053, +664646, -287763, -5752035, -4281546, -9451612, 12746926, -3721052, -2775623, 29734058, -6124624, +-6527814, 33059974, -460635, 18814642, 13888314, 1112933, 7797513, -4434017, 6117107, 5741298, +3651796, 4660040, 15285252, -10528575, 18417894, -10136123, -301721, 3772592, -2476586, -13349295, +-11913166, -355945, -19345606, -6186901, -21134460, -1461363, -12550431, -9402757, -6867116, -6044093, +3166465, -17012366, 19753628, 3094524, -12809740, -9577777, -597000, -2487323, -3127810, 5102958, +2723546, 19407884, 2240899, -224949, -9905268, 1631014, 4034585, -732292, -10567230, -4588099, +12194486, 13279502, -774705, -11288785, 4628364, -2226404, 17339320, 19293530, -7524246, -4997195, +-3553012, 2188286, -7400229, 7798050, -24005110, -2257542, 28399934, -25616796, -12612708, -5938329, +1851668, 2265595, 3399467, -2319819, 7612830, -4541928, -1269700, 13821205, -2167348, 10016937, +-6771016, 10091026, -8825621, 6911676, 5641440, 13718662, -278636, -2320893, 5799817, 9030706, +808528, -2162516, -1415192, 919123, -4902169, -1495186, 4625680, 6095633, 1921998, -1975685, +5922223, -4624069, 4866198, 4063576, 4440460, 2444910, 163209, -7209640, 7250979, 4285841, +3357054, 1592359, 3421478, 6343130, 1460826, -4976257, 2484102, -4055523, -3124052, 5250061, +-1276679, 4545149, 4926865, -1922535, -3582540, 2027225, -17297980, -9479530, -2705830, 13387413, +16136729, 11059541, -10268193, -26353382, 45624364, 11477763, -28632400, -28727426, -4304094, 6956774, +19432042, -24992952, -4412005, 4667019, -361314, -3594351, 26146150, 5610301, -15349139, 8195872, +1079111, -733903, 13765370, -2511482, 7522635, -17040820, -5773510, 29944512, 11061151, 23613730, +7451232, 21349208, 3731790, -7841537, 15009837, 13681081, 21442088, 10559714, -24218784, -9183177, +5235565, 12517682, -9730248, 3692598, -9375914, -15658914, 1580011, -1810329, -9373229, 7284802, +10142565, 8808978, 6431177, 6039261, -4622459, 16207059, -133681, -16102369, -11697880, 14576582, +7896834, -25289842, 10991895, 4489852, 8124468, -22097606, -15111842, 14209362, 21943524, 12409234, +-4941360, -23630910, 5339718, -1045288, 20143396, -6728067, -27101780, 11356430, 15796890, -5990406, +16441135, 13538811, 5572183, -10821707, 1409823, -142808, 3153043, 1186485, -745177, -5757941, +-2430952, -7226820, -760746, -1428077, 3764539, -4414690, -2660732, -1483374, -3321084, -2019172, +-1772211, -2018098, 8383240, 2524904, 85362, 8169028, -2044941, -7707856, -5192079, -4131222, +-3348464, 354335, -5637682, 2360085, 3400004, 2887292, 2132988, -7403450, -2896419, 6211597, +5105643, -766652, 10897943, 21285322, 8205535, 22471268, 3767760, 10310069, 7679939, 37430640, +50927036, 3984656, 10193568, -32407676, -10296647, 19607062, -16514149, 38554848, -7670275, 6080063, +10386305, 22580790, 12524662, -5376226, -16356846, -19170586, -6326487, -3151432, -24041616, -11393474, +-9566503, 15428059, -8946954, 4595615, -15420006, 2055142, -6063957, -22496502, 23380192, 16217797, +18821084, 8291435, -11482058, -11115912, -26188564, 483721, -23606750, -7170448, -2017024, 3112241, +12071542, 9525701, -7672959, -5435818, 9996536, 22111028, 5924908, 8454106, 16123307, -20565378, +14555107, -11681774, -10815265, -20764020, -9117679, 9495099, 8007967, 1323387, 24254754, -5315559, +-9028021, 3718368, 6327024, 33348274, -10996727, 13368623, 13144211, -32058172, 8590, 4005594, +-7093139, -4724464, 11054172, -6362457, 913754, 13583371, 6990596, -19729470, -23710366, -22867480, +-10735271, -8512088, 19040126, 16623134, -4589173, -7268159, 944893, 2110440, 12549894, -1419487, +-3965866, 7801808, -1464584, -1301375, -3326989, 5651103, 7721815, -4109210, 7391102, 6984691, +7148436, 1262184, -3043521, 6319508, -4381941, 3786014, 8050380, 593779, 4800163, 6445136, +-10949482, -477815, 5327370, 5957657, 8024610, 944356, 7184407, 378494, 462783, -2469606, +4125316, 6041409, 31903554, -7567196, 4663261, -14266808, -4087198, -19018652, 15111306, -27362700, +1257352, -22033720, 4359929, 9433896, 3423626, -13188771, 45197016, -3176128, -6080600, 4103841, +-25724170, 1475858, -17381732, 597000, 4884452, -5211943, -592706, 10644003, -9445707, 405338, +13678397, 1116692, 3460670, -22136262, 2818036, -1873143, -1380832, -5609228, -27460410, -15285789, +6785512, 2242510, 12191802, -31822486, 3469260, -29617558, 15015743, -20201378, -32309428, 16357383, +29788820, 5131412, 14652281, -22317724, 22095996, -5484137, 3298535, -13691282, 18403934, 7408282, +19110456, 5994701, 23186918, -21012590, 4012036, 1152662, -3601867, -16663399, -13583371, -15663209, +17768280, -4742718, 24148454, -15016816, -11518565, 2692945, 3216394, -13434658, 6971269, -7908646, +-31454730, 13810467, 20837034, 34586296, 12099460, 24527484, -14184666, 26307, -15992311, 26275000, +8862665, -5061082, -10480794, 12460774, -8993125, -2555506, 1329292, -7960722, -13394929, -8953933, +-6352794, -5352066, -17838610, -7793218, -14870787, 11421392, -2843805, 6769406, 13340705, 3479997, +-10123238, -1021665, -10131291, -4399121, -15136538, -8413841, -16021839, -2863670, 26208428, 5284421, +-2025614, 5820218, 7844221, -15239618, -6995965, -958315, -2057826, -6371584, 6633040, -3070902, +-23232014, -2084133, -5367636, -52807160, 6482180, -16870094, 48863844, -9197672, -24679956, 9811316, +-1419487, -24587078, -4214974, 4092030, -14811732, 36892160, 5228586, 3539053, 16729971, -20747376, +-31947040, -19682224, 45009648, -3593814, -9596031, 29753922, 16756278, -14192183, -14139032, -7950522, +35668628, 5004711, -8750459, -13963476, -6785512, -27888834, 18769008, -3249143, 7577396, 17940616, +-6395207, -28882582, -3590593, 37249176, -1654099, -9290014, 17893908, -8156680, 22217866, 14625974, +-1951526, -27523224, -14085882, -3773129, -25538950, -14948097, -14737643, 1998234, -3554622, 21510270, +-15018964, -5186710, -142271, 55300388, 19175956, -9516574, 11149735, 6524056, -3293166, 28085864, +13615583, -10624675, 4365835, 22708566, 25617870, -15652471, -11206643, -37548216, -30183956, 17166984, +-11292543, 18532248, -534187, -22073984, 5375152, -1743220, 6983080, -14685567, -11233487, 20794622, +5235029, 2762201, -2084670, -2424509, 13785771, -6620692, 7091528, -3528316, 8595303, 17470854, +4625680, -12620761, 2064269, -4847945, 9501005, 7862475, 2589865, 11373610, 17666812, -6942815, +14249091, -1379758, -18945100, -4895189, 592169, -10585484, 4250407, 13791140, -272194, -6979322, +843424, -2579128, 17974438, 15420543, 1561758, 7299297, 9258339, 4843650, 12006044, -15411953, +-11476689, 5516349, 3095061, -3275450, -1370632, -2537252, -5765994, -5684926, -59680720, 20480014, +-12782896, 31747324, 32278290, -18722836, 15235860, -31965294, -47995724, 1163936, -33758980, 4429722, +-4236985, 26101054, -19398220, 18620830, 15971910, 26178900, -39882528, 4342749, -24414204, -22369800, +2406792, -28876138, -18634252, 26196616, -7661685, 9943923, 30586610, -6075231, 10064182, -25218438, +2889976, -27804544, 25761750, -23048942, -15311558, -17015050, 28738164, 23036058, -16511465, 31501438, +20855824, -6666326, 31257162, -1743757, -33085744, -9141838, -3904662, -25776246, 5801427, -54536956, +5468567, -13874355, -26179436, -21137144, 24375550, -14559939, 50542100, 37563248, -56511568, 25770, +-1478543, 2714419, 26121992, -44361644, -30942556, 30522186, -25433186, -31774704, -36597952, 2481954, +75163536, 37371048, -34979288, -22007950, 3047816, 27374510, 10460930, -36557152, 5439039, -24414204, +-14358076, -1273458, -4403415, 1437203, 24127516, 5733245, 14307610, 9516574, -28135794, 7592429, +12632036, -3942780, -10138807, 1521492, -24008868, 21409876, 7762080, 5880884, -31843424, 5352603, +16428787, 4673998, -7521562, -5916855, 14122926, -23194434, -1495186, -17286706, -9580998, 22805740, +-24059334, -943819, 14344654, -12032888, 11247446, 13701483, 3558917, 2088428, 10030359, 3318399, +-12801150, 18737332, -14424648, -11258720, -6545530, -19704774, -6808597, -18464602, -17700098, 6441377, +27705224, -31722628, 15244986, -52969832, -8336532, -20909512, -18252538, 27302570, -36308580, -56439092, +32251984, 48736604, 11502996, -10035191, -45134200, 2535105, 17087528, 16998406, -7909183, -18435610, +1834488, -4940823, -6259378, 5177046, -6991133, -15537044, -29681446, 3182571, -18014704, 3833258, +-16186658, -33934000, 20365662, 14726906, 25133074, 351114, 27217208, 14911053, 3783329, -9503152, +-14465987, -23549842, -16761110, -9807021, 6177774, 15297063, -10975789, -5750425, -38395396, 35163436, +42000484, 22991496, -21893058, 22036404, -29772714, -1025423, 6485401, -64990908, 4981625, 5852967, +30182346, -39003136, 49371184, 18953154, -35807680, -20685100, 14715632, -6731825, -26287348, -32471026, +-34639448, -47457240, 34333432, -15293842, 5234492, -72285376, -28754806, 3920768, 597000, 15973520, +-11619497, 2421288, 12075837, 12390981, -34459596, -8358007, 5414880, 18523120, 13640816, -3445101, +-13322452, -6110665, -2994666, 17259326, 2886755, -11596412, -1451162, -9121974, -3461207, 15923054, +7415261, -8611409, 17419850, -17943836, -10317585, -13514115, 16853452, -7227356, 1965484, -8281771, +7346542, -24772298, 3558917, 9674951, 3807489, -4734128, -10632192, -9602473, -12427488, 11839077, +2647311, -4573067, -14209362, 14245870, 833224, 609885, 2107218, -25211994, -12131672, -16657494, +2123861, -8650601, -5191005, -49203684, -6680285, 17721036, -23166516, -21619254, 20138564, 20377472, +4060355, -19556596, -66505420, -9937481, 12884902, 7735773, 28697360, -818728, 16646219, -4524748, +-510027, -8558259, 1156957, 17374216, 1948305, 507880, 17000018, -4776004, -4195110, -22671522, +-2142652, -3841312, -2582349, 3624953, 13560285, 18371186, -3715684, -244276, 14548128, -3562139, +-28192702, -2196876, -25030532, 3368865, 3357591, -33028298, 23708756, -45410152, 10064182, 12132209, +-19828790, -1687922, 58486716, -16869020, 19724100, -12663711, 10427644, -44146896, 4700305, 25335476, +-710280, 21810380, -5173288, 1971390, -1444720, 27953794, -18219788, -22220014, 25097642, -23550380, +-28645822, -733366, -45744624, 30147986, 25373056, -9541807, 9797894, 3833795, -268435, -39352636, +-6406481, -3383361, 17177184, 6027987, -16414828, 15046881, -1100049, -20272782, -13440026, -12776991, +2659122, 2247879, -2682744, -900869, 12474196, -12755516, -3506841, 8107825, -13079786, -7558069, +10132365, -13937169, 927176, 11440182, 794569, -3838627, 5232344, -957241, 1236951, 9906342, +-3741990, -3670587, -7893076, 2964064, -4956929, -5311801, 4631586, 5192079, -11119670, 1296543, +-10375030, 9596031, -11818676, 6113349, -2147, -2654290, 1276142, -3134253, -1298154, -1010928, +-24344412, -73437496, -34567508, -11567958, 23879482, 53955528, -49584324, 10736881, -14407468, -50005232, +-7064148, 44777180, 12000139, 36872296, -31261994, 9196062, -10866267, 2102387, 21749178, 3611531, +11792906, -7140383, -63677724, 18786724, 3073586, -27084600, 27679454, 21090974, -19274202, 19491098, +2308545, -20795694, 6314676, -12878459, 39758512, 4809290, 16085189, 696322, -40853728, -32772212, +-11042898, -24304146, 26548266, 38097972, 39226472, 31512712, -10946798, 4332549, -32097902, -4915590, +-3239479, -13582297, -16917876, 2649458, 3092377, -44178572, -12920872, -17325362, -1216013, 19662898, +-21701932, -5098126, 7625715, -47245, 22699440, -25248502, -1024887, -28591598, -14975477, -21165062, +11605002, 7471633, 22677428, -3177202, -2358474, -26966490, -8054138, -12869870, -3382287, 11218455, +15530602, 31785442, -20477330, 5679021, -17743046, 6232535, 11955041, 3192235, -9766756, -4144644, +-3433290, -4148939, -1451162, 8264054, 8860518, -2688650, -1047435, -4440996, -6289443, 3919695, +8818642, 2806224, 978716, 2199023, -7445326, -8864812, -8112657, 13202193, -383863, 9066139, +7648263, -1492501, -10449119, -11423539, 1665374, 2910914, -8671539, -3003256, -7547868, 5342940, +-5470715, 1664300, 1581622, 5586679, -2953864, -3687230, 1423245, 1856500, 19069654, -30870078, +-121735480, -64207612, 13144211, 51173460, 114566640, 87520696, 49303540, 16576426, 25710212, -8192650, +-48204028, -93235152, -124003760, -31402116, -35947804, 1829656, 60381872, 86106576, 57753352, 77144592, +17760226, 16320876, -9034464, -39085812, -44229572, -35800700, -38006704, -47027744, -37682432, -16148540, +-2424509, -619549, 30116310, 39039104, 74721696, 35265440, 11625403, 30636002, 47688632, 15158013, +9101036, -38524248, -52668648, -86129664, -39782136, -45198088, -32673964, -19499688, -15266461, 6323266, +10608032, 36142148, 74115568, 59569048, 65069828, 48119204, 59035400, 43867724, -35504348, -32614908, +-82030120, -63602560, -46495704, -104545944, -80806592, -49507552, 3929895, 63265944, 60369524, 71256728, +89193584, 76190576, 41084584, 49425408, 1976222, -19454592, -52309480, -76060648, -76292576, -63052268, +-37826852, -8249022, 10888279, 18323942, 21182778, 35179540, 25507274, 41162968, 26134876, 10223633, +6768869, -1685238, -4026532, -1090922, -28506772, -20043538, -3994320, -13382581, -34053720, -9693204, +-12197170, -12805445, -2317672, 25358560, 48223356, 39826156, 4258460, 39140036, 27724550, -5282810, +-32276680, -51323784, -47537772, -21697102, -23513336, -14889041, -8125005, 13423920, 29911762, 41248864, +47119012, 33740728, 13318694, 14351096, -8957154, -25884694, -43292196, -39007428, -17136382, -1905892, +-12637404, -4318590, 12534325, 15674483, 16426102, 15391015, 4071092, 6305549, 10040023, -1909650, +-8971650, 105764, 3290482, -6816650, -7377143, -1222455, 3005940, 1996086, -4589173, -2531883, +2313377, 876173, -3190087, -4255239, -1751810, 462246, -71941, -90194, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -1562831, --2220498, -4257923, 2469606, 3956739, 7029788, 1888712, -4956393, -8808441, 1897302, -4122095, -338229, 2747705, 1063004, 7102802, -5896990, -1464047, -811749, -481036, -5063767, 3098282, -1307818, 635118, 125628, -2482491, -1908576, -1802813, -586800, 231928, 1180042, -1876901, -2700998, 6356015, -213138, 2814814, -4527433, -2638721, -5416491, -2625836, 5734318, 258235, --1180579, 1004486, 6084358, 639950, 3055869, -786516, -2866891, -913754, 3470334, -3006477, -5450851, 3343632, 6147172, 3020436, 384936, -1902134, -4087198, -2280091, -3553549, -565862, --2594697, 1005022, 222265, -1414118, 897111, -1218160, 2196876, -571231, -610959, 3089155, --312996, -244276, 412317, -3033858, 1369021, -2226941, -3554622, -2069637, -1563905, 1522029, --294205, -271657, -4030290, -695248, 1050656, 767725, -1600412, 125628, -1581622, 682900, -1133335, 817118, 320512, -306016, -641561, 158914, -1242856, -701153, 278099, 157840, -557272, 510027, 503048, 81604, -12274480, -2782065, 5031554, 879395, 6860674, 3657165, --5651103, 1486059, -124554, 2244121, -2024540, -9427990, 5438503, 3328063, 6231998, 7785702, -6707129, 2346126, 89657, -9606768, -991064, 4402342, -4378719, -3805341, -10026601, -680215, --1678259, -1167157, -2552821, 1180579, -5985574, 2721936, -1050656, 2524904, 744640, -4031364, -3104188, 2582886, 6953015, -817654, -5570573, -2885681, 3013993, 1203665, -1394254, 279710, -2218888, 279710, -4070555, -47782, 856846, -442919, 257698, -2578591, -1126355, -3430605, --704375, 4201552, 1505386, -1449552, 1799591, -558346, -216896, 628139, -4887136, -460635, --242129, 2721936, 5292474, -1576790, -533113, -3425773, -2643016, 1338956, 6022618, -5341866, --833224, 1355062, -288300, -1460826, -91805, -1424319, 1962263, 2044404, 1089848, 3332358, --1589138, -1043677, -340376, 772020, -762894, 124017, 544387, 461709, -395137, -1422708, -1050120, -1416802, 6787659, 2547453, 2294050, -2276333, 178778, 638340, 650688, -11654931, --6302328, -528281, -2899103, -3607236, -178778, -3037079, -11860015, 7068980, 1626719, 3199751, --1246614, 2434710, -3134253, 150324, 428423, 6111202, -2171106, -1287417, -1019518, -1032940, --975494, -432718, 6624987, -1282585, -97174, -3772055, -209917, -1821066, 2153926, 1089311, --6415071, 4976257, -6493454, -124017, 5696737, -815507, 213675, 434329, -130997, -3979287, --2827699, 6539625, 3781719, -8104067, -4330938, 1282585, -4758287, -3452617, 3468723, -5832566, -1133871, 1413044, 3335579, 6965363, 5339718, 3266860, 2495376, -4745402, -4947803, -4236449, -1377074, 6061273, 2342905, -1039382, -2706903, 1987496, -2288144, -997506, 1411971, -2246805, --3405909, -457951, 2730526, -494458, -2324651, 309775, 22549, 2660732, 1108102, 2457795, -559956, -1126355, -1155346, -923955, -482647, -308701, 790274, 1546188, 1837172, 1932735, -8908836, -2181307, -2276870, -2670396, 2512556, -2987687, 4356171, -8450348, -1082869, 6268505, -3281892, -6355478, 4702453, 7719130, 7284802, 4645544, 890669, -289910, -4764730, -6144488, -2605972, -591095, 6158446, -483721, 3682398, -3838627, -2554432, -2059974, 609349, 1961726, --349503, -7503845, 1582159, 2598455, 1887101, 3234110, 1983738, -4072703, -10027138, -3229279, -1467268, 1932735, 470836, -431107, 1901060, -4114579, -68719, -7471633, 3490198, -7708930, --2034204, -3269544, -5073430, 3699578, 1634772, 1568200, -4430259, -2155000, -1305133, -4443144, -418759, -378494, 2371896, -1905355, -3741454, -2856153, -8873939, 2816962, 1026497, 3809636, -5618354, 7176354, 2799782, -2829310, -4228932, -1996623, 3898220, 3889093, -4407174, 4803921, -202937, -3125126, 6926709, -1344325, 1561221, 1174674, 2031520, -124554, -1548873, 448824, -2151779, 772557, -341987, 2331630, -1222455, -957241, -1693291, 799401, 209380, -865973, -1274532, -1236951, -2230162, -935229, 1689533, -406948, -389231, 609349, 4460324, 4121021, --706522, 2918430, -8606578, 1023813, -4108136, 462783, 1286880, -5402532, 1980517, 15855946, -1736241, -1387811, -8915278, 12767327, -24159, 5370320, 638340, -252866, -6927782, 6745783, -1731946, -3707094, 884226, 523986, -2763812, 2736431, 7099044, -2049773, 7548942, -2218888, -3230889, -104690, 4978941, 4436165, 4958003, 69793, -2697776, 3897683, -2843268, 3434900, --976031, 3462818, 3354370, 3227668, -416075, -972810, 1289564, -2773475, -4030290, -10290205, -6735583, -6648073, 4661114, 610422, 1963337, -1187022, -12290049, -2646774, -3317325, -5972689, -814970, 3740380, -7894150, -2483028, 3564286, 672162, 5585605, 9763534, -265214, -2624762, --2330557, -10119480, 3109556, 1975148, -2264522, 546535, 4025458, 4142496, 1197222, 1067299, -2914672, 350040, -445066, 4361540, 2563022, -2374580, 4449586, 3266323, 4368519, 1356673, --741419, 329639, -281857, -278099, -1611150, 586800, -977105, 1029182, -1235340, 2052994, -734976, 212601, 1691143, 166430, -507880, 493384, -360240, -128849, -574989, 2044941, -1247151, 433792, 1451699, -439160, 2307471, 319975, 743566, -4495220, -5429913, -526670, -2924873, -1739462, -2619393, -3958886, 1158567, 7198902, 3231963, 1131724, -16364362, -7515119, --2277407, 3346317, -1949378, 5535139, 18685792, 5807333, -6853157, 1063004, -8108362, -2633889, -5695127, -6465537, -1633161, 8329016, 2019708, -2090575, 1194001, 4708895, -2825015, 2281165, -2487323, 2442763, -4626217, 2114735, -2159832, -2654290, -6839199, -2670933, -3993783, -7633768, -3347927, 259309, -508954, 7699803, 5635534, 1971390, 6194954, 33823, -7825431, 6594386, --737661, -5369783, -4223027, -7794829, 363462, 9380209, 650688, -4134980, 3997004, -6991670, --4365298, 3613678, -5645198, -7529078, -3943317, -2375654, 4252555, -6652905, -2044941, -3098282, -8559870, 1230508, -2957622, 4192425, -2558727, -3120294, 492848, 6770479, -1265405, 447213, -3755949, 2144263, -8638253, -330712, 5280663, 2507187, 3080029, -704912, -1671816, 3877819, --2308008, 668404, -1891396, 1105417, 1461900, 2004676, -4378183, 25770, 459025, 1103270, -270046, 46708, 2051921, -384400, -389768, -1933809, 1508070, 5688148, 4107599, -10622528, -10069014, -3799972, 923418, -4646081, 8622684, -1228898, -5819144, -18964428, -2535641, 9834401, -2430952, -14785962, 6731825, -15032, -3033321, -4744865, -3847754, -1464584, -8798777, -1487669, -7101192, 9250823, 11006927, 6681896, 10036265, -3294777, 7903814, 3809099, -15620259, -372052, -4056597, 5541582, 2697240, -5386963, 299037, -1127429, 5502927, -9362492, -3373160, 6954089, --2305324, 3908957, 2046015, -6237367, -6933688, -3578782, -10385231, -2956548, -3196530, 4257923, -1535451, -6005438, -1389422, -12821014, -3242164, 5231807, -3757560, -12669080, -201327, 7192997, --15381352, 4456029, 2544231, 4883378, -7300908, -3389803, -6940667, 534723, -2095407, -7849053, --2080912, -1321239, 4702989, 2661806, 11475079, 728534, 103616, 1831267, -890669, -5824513, -7245073, 2531883, -3012383, 6365679, 1132798, -3164854, 1026497, -199179, 3848291, 887448, -735513, 2411624, -2090039, 87510, -2243047, -5369, -1794223, 1771674, -751082, 767725, -2141578, 309238, -1410897, 2018635, 470299, 2148558, 543850, -620086, -11756399, 2643016, -9449465, 12170864, 9075803, 9268539, 3591667, -6398965, 6498286, 11249056, -16604344, 8355322, -8355859, -17791366, -4653060, 4393215, 19224810, -1480153, -1202054, -4559108, -5361730, 23778550, -11800960, 3321620, 2991982, 12341052, -205085, -1859184, -4587025, 1858110, -10667625, -9633612, --2182917, 3002719, 7170985, 3259880, 1643362, -3627637, 712428, -7832947, 3286187, -11616813, -11416023, -1262720, -5655398, -6673843, -7607461, -11720966, 2050847, -11345693, -3796214, 7806640, --1787780, -3879429, -3714610, -1808181, -9688909, -6739341, -4353486, -4130148, -2193655, 3580929, -2018098, 600759, 542777, -8574902, 14802068, 8501888, 231928, -1079111, 19461570, -2335389, --3332895, -4763119, -9824738, -2690260, 6522982, 6257231, -936303, 7612293, -15091441, 4479114, --5741298, 1455994, 5843303, -2018635, -110059, 955093, 519691, 1874753, -2353642, 2824478, -3645354, -3395172, 1426466, 1915019, 2385318, 6185827, -4622996, -417149, 676994, -108985, -1468342, 692027, 1532230, 1953136, -1665911, 1256815, -505732, 155156, -3291019, -710817, --759672, 2822331, 21895206, 7478612, 4633196, 10627360, -11993159, -7216619, 6861211, 7298223, -16252156, 2352032, 4533338, -10940892, -624381, 5399848, -14341970, -4627828, 5768678, -4796405, -199179, 3923990, 10632192, -3606162, 4166118, 2166274, 2353105, 9054328, 7910793, 9649718, --7588671, -5098663, 10481331, -13291313, -4395899, -4418985, -877247, -3612604, -8473970, 8238821, --285078, -9178882, 443455, -3631932, -9532680, -11912629, -6604586, -7152731, 14056354, -4502737, --3569655, -8352638, -685047, -4266513, 2178085, 16538845, -3100967, -5449240, 2822867, -1013075, -9560060, -11123965, 18775450, 3733937, -18065706, -13163538, 4763119, -12190728, 197569, -13050795, -57445, 2753074, -1669132, 14033806, 17624936, -8413841, 2133525, -3488050, -13049721, -4904316, --7110319, -8543764, -1964948, 6373732, -4435091, -10063645, 6633577, 401579, -5442798, -4625680, -2180770, 3687766, -1627256, -1086627, -5126581, 241055, -4734665, -985695, -2376191, 3258270, -3711926, 853088, -4702453, 461172, 292058, 2990371, -78383, -1203665, 241592, -5931887, --659814, -3364570, -2371896, 414464, 1314797, -3139621, 2391760, -1846299, -1701344, 3955128, --1613297, -3948149, -19105626, 7332583, 39757440, -6784975, -373662, -17289390, -7225209, 11864847, --1632088, 22836878, 13751412, 12711493, 170725, 9828496, -18539764, 17027398, 8865886, 886911, -2299418, -10713259, 4776541, -76236, 17358110, 9720585, 11595338, -4102768, 1207423, 3088082, --11517492, -9278740, -4177930, 5383742, 20235202, -5504001, -6715182, -6778532, -3751117, 2700998, --12724377, -3638374, -758599, -6775848, -13473312, -2784750, -17114908, -6175089, 10215043, -11882564, --5135707, -2276870, 1058173, -19306952, -11593727, -2447595, -1927904, -3620121, 12328704, 5459441, -915365, 7459285, 12699681, -7669738, -3103651, -10490994, 4924717, -8232379, 7197292, 8220568, -9890773, 17854716, 5156108, -13290776, -2056753, 29866666, 9825275, 16830366, 8200167, 5172751, --1023813, 2123861, -6919193, -8919036, 4196183, 3059091, -8812736, 2470143, 6386617, 5743982, --8453569, 6815576, 2430952, 4937602, 5767068, 50466, 2860448, 4776541, 2075543, 5592048, --406411, 1279900, -1582696, -3627100, 954557, 4894115, 870268, -2000381, 7901666, 5035849, -4375498, 264677, -774168, -1177895, -38118, 359167, -1095217, 2815351, 2291902, 2237678, -2526515, 1288490, -3952981, 20482162, 22446036, -22628036, 5566278, 16626892, 10053445, -6300717, --12030203, -10408853, 23395224, 1930588, 8814884, 12274480, -6962679, 3473018, 5152887, -14294725, --15183246, 12370043, 4222490, -22125524, -5087926, 28786482, 13820131, -47245, -16393890, 5395016, -4340065, 17507360, 5806796, -8524436, 11476153, 2034204, -4796942, -1656784, -3440269, -13645111, --6429566, 2096481, 2380486, -16290811, -17563196, -10406706, -5021354, -19348828, 11527692, -1207960, --13717589, 2622078, 355945, -5962489, -1635309, 4154844, -79457, 4372814, 5107790, 7796977, --7618735, -9081171, 12030740, 24324010, 11048803, 6640557, 17779018, -3332358, 9705015, 23640036, -14495515, 2222109, 2678449, -7398618, -14433774, 14060649, -13747117, 6187974, -5482526, 4294968, --18006650, 8648454, -195958, -5908802, -3364033, 10249403, -9689983, -4905927, -2480344, 1551557, --197569, 3026878, -3820910, -497142, -6909529, -1770600, -369367, 1268089, -2045478, 2395518, --2568927, 2076080, -2296197, 7858717, 2497524, -2031520, -3619584, 2969970, 367220, 2723546, -2509335, -1887101, 2263985, 2890513, -1902134, 754841, 3616363, -1086090, 1305670, 3933116, -4179540, 7190849, -4619774, -21237540, 5958731, -10239739, -4723927, -7915088, -1336809, 18177912, -18002356, -36427764, 11266773, 11559368, -11320997, -18533320, -24167780, 4261145, -7105487, 4471598, --8441221, -6635725, -3931506, 22546968, 5701032, -1965484, -398358, -3593814, -6751689, 5701569, -3738769, -107374, 9032853, 1964411, -1921998, 3220689, 8195872, 23269596, 2325188, 2863133, --11515344, -4924717, -5460514, -5791764, -722091, -1940252, 7690139, 11130408, 509491, 12859132, --3007551, -2177549, -2656437, -1436130, -22578644, 25437480, 634045, 1799591, -1894618, -6616397, -6729140, -1746978, 10304700, 582505, -9900973, 2670933, 10925860, -7792145, 10144713, 2470680, --15581604, -2659122, -3352759, -28297392, -9687299, 7232725, 7284802, -11563663, -6673843, 6752763, -914828, 18910204, -15093052, 6862821, 8418136, -1224603, 7358890, 6856379, 8344585, 3221762, -3700114, 3383897, 2748779, -1259499, -1569274, -4884452, 1921461, 7067369, 1231582, -5185636, --2045478, -2930242, 1647120, -2272038, -1951526, -3454228, 4546760, 2595771, 3090766, 333934, --8266739, 3288871, -8402030, 641561, 1304596, 2952790, -4005057, -1916092, -1277216, 2709588, -4974646, 2266132, 2074469, 703838, -5935108, 18496276, 5288716, 5660767, -13650480, 10079215, --5499169, 9600326, -7650411, 12397423, -11404212, -9314173, 17064442, 2068564, 4316979, -10268730, --22884660, -2255395, 6605123, 1700270, 9728101, -8225936, 1202054, -188979, -17103634, -12362526, -5578089, -19327352, -12673375, 6054830, 19327, -20207822, -2939368, -10113574, 12764106, 7605314, -2253784, -4781909, -12665859, -26879516, 9387188, -12093554, 14601815, -4519380, -4960687, -2578591, --7169374, 3980361, 3778498, -21511344, -9512816, 20980378, 18373334, -19140522, 24677808, 1177895, -18154826, -4468377, -4435628, -2399813, -7253663, 9363029, -7150047, -20081120, -10675141, 23631984, --5382668, -4878009, -1395328, 7247758, 4641249, 11886322, -27341762, 7941932, 18496814, 14526116, --6049999, -1635846, -5957120, -12453795, 1315334, 11226508, 17513266, -10913512, -11028402, -12498355, --1345935, -2132451, 1065152, -6053220, 2988760, 2988224, -2189897, -980326, -2751464, -5523865, -5184026, 2684, 702764, -8330089, -7020661, -1955821, -9075266, -3606699, -4604205, 889595, --3292093, -102542, 6804839, -2916820, 2774012, -213138, -6558952, 1144609, -3364570, -960462, -2663417, 5938866, 744103, 2417530, 5549635, 5504538, 7354058, -2499671, -2148558, -1488206, -7541963, -1320703, -12496207, -835371, 12792023, 9925133, -9677098, -16480863, -13827647, -8127152, --16022912, -903554, 7566122, 17563196, -3054259, -852551, -29430190, 17607756, 21932250, -3493956, --11941620, -12138651, -7523172, 33014340, -20125144, -87510, -2384781, 8898635, -1490354, 38033548, -918049, -20727512, -5461051, -19699942, 25679072, 22316114, -18035104, 20990578, 5256503, 16892644, -6320581, -31787052, 9958419, 16971564, -22006338, -6129455, -24968792, -12502113, 863288, -23026394, --19625316, -588411, -15899432, -252866, 5592048, -5723044, -15768972, 12918188, 11743514, -25999048, --19842748, 10822781, 4585415, 6943352, 13172665, 17166984, -6320045, -9371619, -524523, -6087580, --317291, -1966021, -8698383, 3421478, -36034240, 12246026, 17550310, -18632642, -15303505, 11588896, --11712913, -10672457, -5049808, 6467147, 942208, 22331682, 199716, 13031468, -1255741, -9151502, -4885526, 6709813, 7035157, -5918465, 188442, 686658, -784368, -3812857, -8885750, 5857799, -9440338, -4849018, -15665893, 3968550, 1397475, 16616155, -1551020, -6540699, 5192616, 1823751, -8373576, -37581, -5025649, 95563, 6843494, 5033702, 1749125, -1815697, 1341640, -3122978, --2545842, -7843147, 3982509, 3717294, -5282273, 2560874, 2425583, 1410897, -836445, -2653753, -753767, -7519951, 8381092, 20337208, 37970196, 59759100, 2063195, -23768886, -30681098, -6992744, -1499481, -7121593, 29157460, 21923124, 15254650, 25366614, 18543522, 15028627, 1266479, 12157442, --15193447, 22003118, 25425132, 1958505, 26441966, -10526965, 2421825, 6318434, -24135568, -16163573, --5509906, -14272713, -16831976, -2288681, 27174794, -117575, -4904853, 3597035, 6034429, -3399467, --36175972, -4751308, 9829570, -5136781, -10879689, 4744328, 14398341, 25280178, 6474127, 13005698, -18020072, 22071300, -29844654, -20667382, 12162811, -8522289, 38661148, -3738769, 33287070, -26349624, -16044387, 27125940, 1335198, 4621922, 16443819, -28827284, -13193603, 1015760, 16930762, 727997, -19442244, 8013872, 7515656, 19743428, 7365332, -2321967, -7872675, -22759032, -4992900, 1600412, -6447283, 727997, 846645, 779537, -12208981, 6797323, 4728759, 11143830, -3397856, 8448738, -13726179, 8214662, 3736085, 222801, -1247151, 3088082, -4276177, 3006477, -4071092, 401579, -3109020, 2991982, -3558381, 6274411, 6177237, 7576859, 1174674, 846645, 3414499, -2357937, -5340255, -3454228, 5390184, 11813844, -1047435, -1954210, 1241246, 10305774, -5821292, 2626909, --846109, -1230508, -1553704, 1638530, 3123515, 4779225, 3787088, 3706557, 9659381, -6299107, -11395622, -5129265, 42939472, 14498736, 15281494, 31390842, -1972464, 6897181, 13842143, 20277614, --21904334, -17510582, -7263327, -19236084, -3115462, -25950730, 13815299, 21271900, 15625628, 21127480, --13714904, -7479686, 16402480, 12807592, -8479339, 21423296, 13003013, -4546223, -25515864, 14663555, -16023449, -12823162, -1654099, 7851200, 4020626, -20513300, 24297166, 6730214, 26058640, 14382772, -10387378, -13677323, 12308303, -7111929, 39556648, -30613990, 3672197, 12186433, -5597416, -19642496, -13027710, 12847321, -2181844, 12647605, -11704323, 32368484, -14576045, 8788577, 7227893, -19983946, --8562554, -27725088, 12195023, 8574902, -20635170, 19854024, 16924318, -14095546, 12203613, -1196685, -32729798, 10979010, -16019154, -11551315, -11406359, 10598906, -6554657, 9092446, -3933653, 2292976, -11092290, 7249368, 5634997, -10318659, 28132036, 3474629, -10645076, -15500537, 13679471, 7101729, -12916040, -6893960, 3898220, 10506027, 21238614, 5753646, -3325379, 17945984, -4599373, -4691715, --2355790, 2117419, 4861366, -10091563, -9088688, 4392141, -7849590, -4447439, 1092532, -3422015, --1018444, -952946, -7724499, 5846524, 3202972, -14695231, 3688840, -10882910, -6979322, -3189013, -5577015, 3361886, 10423349, 4958540, -295279, 3355443, 3830574, 4842039, 399432, 1655710, -2379412, 9250823, -2899640, -38056632, 16586627, -32500554, 33107218, 39826156, -2399813, 6757594, --32858648, -545998, -7544647, 3081639, 18680424, 19154480, -6010270, 9818295, 15489800, 2260227, -6354404, 4311074, 6272263, -4359929, 22712860, -3440269, 4970888, -13042742, 25601764, 5367636, --2657511, -1078037, 23030152, 8683887, 10761577, 25489558, -5940477, -16106664, 31367756, -33767568, --14682346, -6030671, 7259569, 22003654, 4996658, -9332427, -9542344, -16407849, -485868, -3156801, -6314676, 35414688, 34484292, 21799644, 31108984, -3034395, 46909096, -15891916, 13022878, -11333345, -1043140, 14628122, -7299834, 1587527, -14162118, -18351858, 272730, -11579769, 9583146, -15677704, -23200876, -17589502, -28144384, -11758547, -7228967, -2660195, 33847028, -20552492, -4713190, -2998961, --21246130, -5471252, 12385612, 26507464, -2332704, -1259499, 1046361, -8825621, -18243410, 644782, --771484, -2877628, -1869385, -91268, -10519986, 8404177, -8998493, 10405632, -4128001, -8139500, --8789651, 2085744, 8396124, -5967320, -7515119, -2757906, 6977711, 7581691, -5483063, 3517578, -4683125, 2652142, 4673998, -4465156, -3885335, 2067490, 533650, 4751308, -5869610, 4168266, -7767449, -411243, -2430952, -4028679, 6822019, -13728863, -6347425, 13431436, -8063801, -1015223, --2045478, 2553358, -8279087, 6023692, -2559801, 12380243, 10734734, 176631, -13336947, 58553288, -81298896, 24929600, 63377612, -13875429, -44066900, -30888332, -21584358, 10690710, 11662447, -14696304, --23663122, 20509006, 27597312, 16113107, 27533962, 21223044, 5252745, 8438000, 4169876, -1388885, --18097918, 7980586, -21447992, 15110769, 150324, -20100446, 23296976, 14068702, 11150272, 40200356, -24729348, -11551851, -7755101, -14499273, -17150878, -21036750, -8284455, 805306, -16613470, -5185100, -34751656, 52674016, 38830800, 5285494, 26502632, 28233504, 43215424, 19757386, -22894860, -37628744, --23444616, -24022826, 14200236, 11891691, -51395188, -35285840, -9073655, 21636434, 46774880, -35065724, --1384590, -30440580, -3948686, 38196756, -21044802, 14368813, -30529164, -5019206, -9123584, 25743498, --28618440, -16350940, 461709, 11341398, -23236846, 53303764, -12572443, -883153, 30324616, -13377749, -22793392, -7324530, -18853832, -14697378, 8842801, 816044, 7533910, 4670240, -16842178, 399969, --7130183, 20366734, 11926587, 3536906, 11125576, 12658342, 664109, -240518, -4095251, -12824235, -25995290, -8143258, 5401995, 118648, -15161771, 512175, 1582696, -4867809, -10001368, -2263985, --5910412, 1329292, 3786551, -4542465, 784368, 17635672, 12567611, -2412698, -2968359, 16693464, --7168301, -2268280, -14341970, -20610474, -7820599, -5559835, -2439005, -5774047, -23241142, -44906032, -5250061, 24711094, -20918638, 38393788, -15609522, 15161771, -5366562, -44740676, -23061826, -2325188, --26461830, -60330868, -17121350, 21553756, 33135672, -16447040, -26016764, -53841172, -16222628, 15705622, --10940355, -15701864, -26949846, 6198175, -6300717, -4654671, -5288179, 10722386, 21288006, -16905528, -16389595, 14095546, -17246442, -49119932, 3716757, 3859565, 12359842, 5808407, 31768800, 3140158, --49014168, 229244, -53951232, -335007, 18321256, 22379464, -4468377, 2897492, 24620364, -13113609, --9816685, -16872780, 15818901, 11680164, -8051453, 19179176, -6331319, 8043937, 8623757, 31438624, -3860102, -11231876, -34057480, -11663521, 17145510, 15138149, 26417270, 38963408, 67159864, 33571612, -15878494, -17626546, -68166496, -18624052, -10163503, 51803212, -9092983, 3191698, -612033, -16391743, -1830193, 15168751, 6853694, -388695, 332323, 254477, -324270, 25117506, -9503152, -7508140, --8775692, 17424146, 6236293, 8812736, -7308424, -21445846, 6612102, 9066676, -10226854, -1437740, -4984310, -1225139, 1184874, -3794604, -31321050, -10095321, -2971044, 14170171, 21678310, 2667712, --18961744, -17963700, 7713762, 3036542, -2224793, -3001645, 479426, -1853815, -1456531, 16542067, --18675054, 2378338, -16137803, 16565152, -9633075, 449361, -23008140, -3409667, 14515916, -4595615, -7541426, -12758200, 3543348, -43776992, -13377749, 30306362, -15038291, -12641162, -3306051, -9893994, --35098472, -39043936, -57045756, -18084496, 51003, -4508105, 37243272, 10164577, 48664664, 29956860, -15035070, -6908455, -18053358, -3461744, 68274408, 4135517, 19645718, 10991358, -8622684, 33931852, --14247480, 27365920, -30048128, -3096135, -21664352, 25744570, -36471788, -7789997, 11094974, 11355357, -11656004, -31958852, 22622666, -36563056, 7369627, -17974976, -12261058, 36145372, 2113661, 2262374, -12453795, -13888850, -839129, 9354976, -44255880, 1068910, 10176388, -6560026, 28469190, -12876849, --5596343, 47800840, -18176838, -40007620, 83215, -15192373, 3209414, -3151432, -2114735, -32141388, -17096118, -5347235, -43671764, 26142930, -54083840, 10362145, -12407624, -21548924, -34190624, -4547834, -9238475, 15581068, 1387274, 12588012, 15761456, -18807662, 32934346, -7769059, 8797704, -588947, -15715285, -867583, -1785096, -5506685, 9290014, -19840064, -2550137, 6287296, 4250944, -7809861, --135828, -8725226, -11410654, 5709086, 4657355, 8506720, 5542656, -2650532, 6682432, 19424526, --9703405, -10358924, 3403762, -1124208, 3821447, 14360760, -2092723, 7747584, 7386270, 7335804, --9882720, -12000675, -2943663, -1126355, -12414066, -882616, -2474975, 5066988, -13559749, 3879429, --18924700, -66735200, -68579352, -58546308, -29519310, 120998896, 37888056, -15138686, -15801185, -59913720, --126835216, -14335527, 34027416, 42469712, 18218714, -19573240, -14664092, -37444060, -41227392, 30874372, --29726006, 76229224, 57132192, -89101248, 28690918, 11587285, -18758806, 6805376, 63791540, 9029632, -43967580, 87352656, -19175418, -71963248, 3234647, -12386686, -67085780, -18399104, 32200444, -3093987, -39667244, 64164128, 5596343, -55910812, -109313896, -93885304, -83936544, -8967355, 81027776, 22978612, -21504364, 12040404, -22231288, -109589312, -68625528, -35221416, -13508746, 6541235, 24562382, 23851028, -30692910, 31455804, 39150776, -47317116, -17146584, -38776576, -3451006, -42396696, 26091926, 26068840, -53616224, 59569584, 28363428, 746787, -16098611, -11184095, -73804720, -58764816, 51298552, 80371720, -54670640, 64195804, -15650861, -28877750, -58440548, -33304788, 17036524, 8590, 3807489, 17969606, -5898064, 4449049, -14299557, -18851686, -9447854, -14267344, 345745, 14082124, 3854196, 5390721, --3413425, 8171712, -15578920, 10214506, -4769561, -14428943, -14212047, -4359392, -23524610, -7304129, --14440217, 14703821, 16574816, 7981123, 6327024, -15337328, -31370978, -31025234, 8084202, -3015604, -13921600, 12253005, 6466074, -22636626, -11580306, -21558052, -33183992, 9820980, 22939420, -8871255, --121768232, -136324944, -92743376, -95395520, -25590488, 106556528, 71724880, 114979496, 128088272, 194632880, -129216240, 133721656, 86231136, -6813429, -96453152, -166669424, -196809360, -170889776, -134812576, -97623000, --23740432, -5173825, -14254996, 4721243, 42157252, 69490424, 96552472, 83866752, 114467320, 110504136, -142940272, 130662032, 36607616, 87620552, -19233938, 23784456, 17546552, 4716948, -12320651, -127836480, --153313696, -196057744, -229834976, -209082768, -116224496, -103421736, -85016728, -106574248, -123169464, -26641146, -29941290, 76948632, 113022600, 163536784, 195575088, 250975872, 331434560, 321683392, 244395984, 198096784, -164973456, 87024624, 138521280, -56552908, -113223392, -270952320, -310038112, -385605376, -370272896, -338864864, --320932832, -310228704, -190948336, -118580824, -64470680, 172683984, 176159696, 269123200, 346027808, 299740928, -270986144, 273855712, 215344288, 163902928, 90142776, 11492259, -1463510, -51218560, -61929132, -90070296, --116286776, -160002560, -172614192, -157502896, -181144544, -140391200, -128580584, -121756952, -106627392, -55441584, --10983305, 56186224, 116709296, 109102368, 170671264, 188196336, 208002048, 245097680, 198619696, 115471272, -57822608, -35779224, -90550256, -91090888, -175111184, -162739536, -222120144, -177416512, -184124176, -118828320, --123693448, -72920488, -9342091, 61786324, 93720480, 164700192, 192387696, 186087504, 181366800, 176068960, -135773584, 47742320, -31244814, -45542760, -58606440, -65387656, -73498704, -87575992, -80851688, -60436096, --64958696, -59369868, -51081120, -37298568, -16554415, -11860552, -8407935, 1801202, 10766409, 6766721, -10054518, 25705916, 30918932, 27554362, 18340584, 12511240, 9405442, 9110163, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-2220498, -4257923, 2469606, 3956739, 7029788, 1888712, -4956393, -8808441, 1897302, -4122095, +338229, 2747705, 1063004, 7102802, -5896990, -1464047, -811749, -481036, -5063767, 3098282, +1307818, 635118, 125628, -2482491, -1908576, -1802813, -586800, 231928, 1180042, -1876901, +2700998, 6356015, -213138, 2814814, -4527433, -2638721, -5416491, -2625836, 5734318, 258235, +-1180579, 1004486, 6084358, 639950, 3055869, -786516, -2866891, -913754, 3470334, -3006477, +5450851, 3343632, 6147172, 3020436, 384936, -1902134, -4087198, -2280091, -3553549, -565862, +-2594697, 1005022, 222265, -1414118, 897111, -1218160, 2196876, -571231, -610959, 3089155, +-312996, -244276, 412317, -3033858, 1369021, -2226941, -3554622, -2069637, -1563905, 1522029, +-294205, -271657, -4030290, -695248, 1050656, 767725, -1600412, 125628, -1581622, 682900, +1133335, 817118, 320512, -306016, -641561, 158914, -1242856, -701153, 278099, 157840, +557272, 510027, 503048, 81604, -12274480, -2782065, 5031554, 879395, 6860674, 3657165, +-5651103, 1486059, -124554, 2244121, -2024540, -9427990, 5438503, 3328063, 6231998, 7785702, +6707129, 2346126, 89657, -9606768, -991064, 4402342, -4378719, -3805341, -10026601, -680215, +-1678259, -1167157, -2552821, 1180579, -5985574, 2721936, -1050656, 2524904, 744640, -4031364, +3104188, 2582886, 6953015, -817654, -5570573, -2885681, 3013993, 1203665, -1394254, 279710, +2218888, 279710, -4070555, -47782, 856846, -442919, 257698, -2578591, -1126355, -3430605, +-704375, 4201552, 1505386, -1449552, 1799591, -558346, -216896, 628139, -4887136, -460635, +-242129, 2721936, 5292474, -1576790, -533113, -3425773, -2643016, 1338956, 6022618, -5341866, +-833224, 1355062, -288300, -1460826, -91805, -1424319, 1962263, 2044404, 1089848, 3332358, +-1589138, -1043677, -340376, 772020, -762894, 124017, 544387, 461709, -395137, -1422708, +1050120, -1416802, 6787659, 2547453, 2294050, -2276333, 178778, 638340, 650688, -11654931, +-6302328, -528281, -2899103, -3607236, -178778, -3037079, -11860015, 7068980, 1626719, 3199751, +-1246614, 2434710, -3134253, 150324, 428423, 6111202, -2171106, -1287417, -1019518, -1032940, +-975494, -432718, 6624987, -1282585, -97174, -3772055, -209917, -1821066, 2153926, 1089311, +-6415071, 4976257, -6493454, -124017, 5696737, -815507, 213675, 434329, -130997, -3979287, +-2827699, 6539625, 3781719, -8104067, -4330938, 1282585, -4758287, -3452617, 3468723, -5832566, +1133871, 1413044, 3335579, 6965363, 5339718, 3266860, 2495376, -4745402, -4947803, -4236449, +1377074, 6061273, 2342905, -1039382, -2706903, 1987496, -2288144, -997506, 1411971, -2246805, +-3405909, -457951, 2730526, -494458, -2324651, 309775, 22549, 2660732, 1108102, 2457795, +559956, -1126355, -1155346, -923955, -482647, -308701, 790274, 1546188, 1837172, 1932735, +8908836, -2181307, -2276870, -2670396, 2512556, -2987687, 4356171, -8450348, -1082869, 6268505, +3281892, -6355478, 4702453, 7719130, 7284802, 4645544, 890669, -289910, -4764730, -6144488, +2605972, -591095, 6158446, -483721, 3682398, -3838627, -2554432, -2059974, 609349, 1961726, +-349503, -7503845, 1582159, 2598455, 1887101, 3234110, 1983738, -4072703, -10027138, -3229279, +1467268, 1932735, 470836, -431107, 1901060, -4114579, -68719, -7471633, 3490198, -7708930, +-2034204, -3269544, -5073430, 3699578, 1634772, 1568200, -4430259, -2155000, -1305133, -4443144, +418759, -378494, 2371896, -1905355, -3741454, -2856153, -8873939, 2816962, 1026497, 3809636, +5618354, 7176354, 2799782, -2829310, -4228932, -1996623, 3898220, 3889093, -4407174, 4803921, +202937, -3125126, 6926709, -1344325, 1561221, 1174674, 2031520, -124554, -1548873, 448824, +2151779, 772557, -341987, 2331630, -1222455, -957241, -1693291, 799401, 209380, -865973, +1274532, -1236951, -2230162, -935229, 1689533, -406948, -389231, 609349, 4460324, 4121021, +-706522, 2918430, -8606578, 1023813, -4108136, 462783, 1286880, -5402532, 1980517, 15855946, +1736241, -1387811, -8915278, 12767327, -24159, 5370320, 638340, -252866, -6927782, 6745783, +1731946, -3707094, 884226, 523986, -2763812, 2736431, 7099044, -2049773, 7548942, -2218888, +3230889, -104690, 4978941, 4436165, 4958003, 69793, -2697776, 3897683, -2843268, 3434900, +-976031, 3462818, 3354370, 3227668, -416075, -972810, 1289564, -2773475, -4030290, -10290205, +6735583, -6648073, 4661114, 610422, 1963337, -1187022, -12290049, -2646774, -3317325, -5972689, +814970, 3740380, -7894150, -2483028, 3564286, 672162, 5585605, 9763534, -265214, -2624762, +-2330557, -10119480, 3109556, 1975148, -2264522, 546535, 4025458, 4142496, 1197222, 1067299, +2914672, 350040, -445066, 4361540, 2563022, -2374580, 4449586, 3266323, 4368519, 1356673, +-741419, 329639, -281857, -278099, -1611150, 586800, -977105, 1029182, -1235340, 2052994, +734976, 212601, 1691143, 166430, -507880, 493384, -360240, -128849, -574989, 2044941, +1247151, 433792, 1451699, -439160, 2307471, 319975, 743566, -4495220, -5429913, -526670, +2924873, -1739462, -2619393, -3958886, 1158567, 7198902, 3231963, 1131724, -16364362, -7515119, +-2277407, 3346317, -1949378, 5535139, 18685792, 5807333, -6853157, 1063004, -8108362, -2633889, +5695127, -6465537, -1633161, 8329016, 2019708, -2090575, 1194001, 4708895, -2825015, 2281165, +2487323, 2442763, -4626217, 2114735, -2159832, -2654290, -6839199, -2670933, -3993783, -7633768, +3347927, 259309, -508954, 7699803, 5635534, 1971390, 6194954, 33823, -7825431, 6594386, +-737661, -5369783, -4223027, -7794829, 363462, 9380209, 650688, -4134980, 3997004, -6991670, +-4365298, 3613678, -5645198, -7529078, -3943317, -2375654, 4252555, -6652905, -2044941, -3098282, +8559870, 1230508, -2957622, 4192425, -2558727, -3120294, 492848, 6770479, -1265405, 447213, +3755949, 2144263, -8638253, -330712, 5280663, 2507187, 3080029, -704912, -1671816, 3877819, +-2308008, 668404, -1891396, 1105417, 1461900, 2004676, -4378183, 25770, 459025, 1103270, +270046, 46708, 2051921, -384400, -389768, -1933809, 1508070, 5688148, 4107599, -10622528, +10069014, -3799972, 923418, -4646081, 8622684, -1228898, -5819144, -18964428, -2535641, 9834401, +2430952, -14785962, 6731825, -15032, -3033321, -4744865, -3847754, -1464584, -8798777, -1487669, +7101192, 9250823, 11006927, 6681896, 10036265, -3294777, 7903814, 3809099, -15620259, -372052, +4056597, 5541582, 2697240, -5386963, 299037, -1127429, 5502927, -9362492, -3373160, 6954089, +-2305324, 3908957, 2046015, -6237367, -6933688, -3578782, -10385231, -2956548, -3196530, 4257923, +1535451, -6005438, -1389422, -12821014, -3242164, 5231807, -3757560, -12669080, -201327, 7192997, +-15381352, 4456029, 2544231, 4883378, -7300908, -3389803, -6940667, 534723, -2095407, -7849053, +-2080912, -1321239, 4702989, 2661806, 11475079, 728534, 103616, 1831267, -890669, -5824513, +7245073, 2531883, -3012383, 6365679, 1132798, -3164854, 1026497, -199179, 3848291, 887448, +735513, 2411624, -2090039, 87510, -2243047, -5369, -1794223, 1771674, -751082, 767725, +2141578, 309238, -1410897, 2018635, 470299, 2148558, 543850, -620086, -11756399, 2643016, +9449465, 12170864, 9075803, 9268539, 3591667, -6398965, 6498286, 11249056, -16604344, 8355322, +8355859, -17791366, -4653060, 4393215, 19224810, -1480153, -1202054, -4559108, -5361730, 23778550, +11800960, 3321620, 2991982, 12341052, -205085, -1859184, -4587025, 1858110, -10667625, -9633612, +-2182917, 3002719, 7170985, 3259880, 1643362, -3627637, 712428, -7832947, 3286187, -11616813, +11416023, -1262720, -5655398, -6673843, -7607461, -11720966, 2050847, -11345693, -3796214, 7806640, +-1787780, -3879429, -3714610, -1808181, -9688909, -6739341, -4353486, -4130148, -2193655, 3580929, +2018098, 600759, 542777, -8574902, 14802068, 8501888, 231928, -1079111, 19461570, -2335389, +-3332895, -4763119, -9824738, -2690260, 6522982, 6257231, -936303, 7612293, -15091441, 4479114, +-5741298, 1455994, 5843303, -2018635, -110059, 955093, 519691, 1874753, -2353642, 2824478, +3645354, -3395172, 1426466, 1915019, 2385318, 6185827, -4622996, -417149, 676994, -108985, +1468342, 692027, 1532230, 1953136, -1665911, 1256815, -505732, 155156, -3291019, -710817, +-759672, 2822331, 21895206, 7478612, 4633196, 10627360, -11993159, -7216619, 6861211, 7298223, +16252156, 2352032, 4533338, -10940892, -624381, 5399848, -14341970, -4627828, 5768678, -4796405, +199179, 3923990, 10632192, -3606162, 4166118, 2166274, 2353105, 9054328, 7910793, 9649718, +-7588671, -5098663, 10481331, -13291313, -4395899, -4418985, -877247, -3612604, -8473970, 8238821, +-285078, -9178882, 443455, -3631932, -9532680, -11912629, -6604586, -7152731, 14056354, -4502737, +-3569655, -8352638, -685047, -4266513, 2178085, 16538845, -3100967, -5449240, 2822867, -1013075, +9560060, -11123965, 18775450, 3733937, -18065706, -13163538, 4763119, -12190728, 197569, -13050795, +57445, 2753074, -1669132, 14033806, 17624936, -8413841, 2133525, -3488050, -13049721, -4904316, +-7110319, -8543764, -1964948, 6373732, -4435091, -10063645, 6633577, 401579, -5442798, -4625680, +2180770, 3687766, -1627256, -1086627, -5126581, 241055, -4734665, -985695, -2376191, 3258270, +3711926, 853088, -4702453, 461172, 292058, 2990371, -78383, -1203665, 241592, -5931887, +-659814, -3364570, -2371896, 414464, 1314797, -3139621, 2391760, -1846299, -1701344, 3955128, +-1613297, -3948149, -19105626, 7332583, 39757440, -6784975, -373662, -17289390, -7225209, 11864847, +-1632088, 22836878, 13751412, 12711493, 170725, 9828496, -18539764, 17027398, 8865886, 886911, +2299418, -10713259, 4776541, -76236, 17358110, 9720585, 11595338, -4102768, 1207423, 3088082, +-11517492, -9278740, -4177930, 5383742, 20235202, -5504001, -6715182, -6778532, -3751117, 2700998, +-12724377, -3638374, -758599, -6775848, -13473312, -2784750, -17114908, -6175089, 10215043, -11882564, +-5135707, -2276870, 1058173, -19306952, -11593727, -2447595, -1927904, -3620121, 12328704, 5459441, +915365, 7459285, 12699681, -7669738, -3103651, -10490994, 4924717, -8232379, 7197292, 8220568, +9890773, 17854716, 5156108, -13290776, -2056753, 29866666, 9825275, 16830366, 8200167, 5172751, +-1023813, 2123861, -6919193, -8919036, 4196183, 3059091, -8812736, 2470143, 6386617, 5743982, +-8453569, 6815576, 2430952, 4937602, 5767068, 50466, 2860448, 4776541, 2075543, 5592048, +-406411, 1279900, -1582696, -3627100, 954557, 4894115, 870268, -2000381, 7901666, 5035849, +4375498, 264677, -774168, -1177895, -38118, 359167, -1095217, 2815351, 2291902, 2237678, +2526515, 1288490, -3952981, 20482162, 22446036, -22628036, 5566278, 16626892, 10053445, -6300717, +-12030203, -10408853, 23395224, 1930588, 8814884, 12274480, -6962679, 3473018, 5152887, -14294725, +-15183246, 12370043, 4222490, -22125524, -5087926, 28786482, 13820131, -47245, -16393890, 5395016, +4340065, 17507360, 5806796, -8524436, 11476153, 2034204, -4796942, -1656784, -3440269, -13645111, +-6429566, 2096481, 2380486, -16290811, -17563196, -10406706, -5021354, -19348828, 11527692, -1207960, +-13717589, 2622078, 355945, -5962489, -1635309, 4154844, -79457, 4372814, 5107790, 7796977, +-7618735, -9081171, 12030740, 24324010, 11048803, 6640557, 17779018, -3332358, 9705015, 23640036, +14495515, 2222109, 2678449, -7398618, -14433774, 14060649, -13747117, 6187974, -5482526, 4294968, +-18006650, 8648454, -195958, -5908802, -3364033, 10249403, -9689983, -4905927, -2480344, 1551557, +-197569, 3026878, -3820910, -497142, -6909529, -1770600, -369367, 1268089, -2045478, 2395518, +-2568927, 2076080, -2296197, 7858717, 2497524, -2031520, -3619584, 2969970, 367220, 2723546, +2509335, -1887101, 2263985, 2890513, -1902134, 754841, 3616363, -1086090, 1305670, 3933116, +4179540, 7190849, -4619774, -21237540, 5958731, -10239739, -4723927, -7915088, -1336809, 18177912, +18002356, -36427764, 11266773, 11559368, -11320997, -18533320, -24167780, 4261145, -7105487, 4471598, +-8441221, -6635725, -3931506, 22546968, 5701032, -1965484, -398358, -3593814, -6751689, 5701569, +3738769, -107374, 9032853, 1964411, -1921998, 3220689, 8195872, 23269596, 2325188, 2863133, +-11515344, -4924717, -5460514, -5791764, -722091, -1940252, 7690139, 11130408, 509491, 12859132, +-3007551, -2177549, -2656437, -1436130, -22578644, 25437480, 634045, 1799591, -1894618, -6616397, +6729140, -1746978, 10304700, 582505, -9900973, 2670933, 10925860, -7792145, 10144713, 2470680, +-15581604, -2659122, -3352759, -28297392, -9687299, 7232725, 7284802, -11563663, -6673843, 6752763, +914828, 18910204, -15093052, 6862821, 8418136, -1224603, 7358890, 6856379, 8344585, 3221762, +3700114, 3383897, 2748779, -1259499, -1569274, -4884452, 1921461, 7067369, 1231582, -5185636, +-2045478, -2930242, 1647120, -2272038, -1951526, -3454228, 4546760, 2595771, 3090766, 333934, +-8266739, 3288871, -8402030, 641561, 1304596, 2952790, -4005057, -1916092, -1277216, 2709588, +4974646, 2266132, 2074469, 703838, -5935108, 18496276, 5288716, 5660767, -13650480, 10079215, +-5499169, 9600326, -7650411, 12397423, -11404212, -9314173, 17064442, 2068564, 4316979, -10268730, +-22884660, -2255395, 6605123, 1700270, 9728101, -8225936, 1202054, -188979, -17103634, -12362526, +5578089, -19327352, -12673375, 6054830, 19327, -20207822, -2939368, -10113574, 12764106, 7605314, +2253784, -4781909, -12665859, -26879516, 9387188, -12093554, 14601815, -4519380, -4960687, -2578591, +-7169374, 3980361, 3778498, -21511344, -9512816, 20980378, 18373334, -19140522, 24677808, 1177895, +18154826, -4468377, -4435628, -2399813, -7253663, 9363029, -7150047, -20081120, -10675141, 23631984, +-5382668, -4878009, -1395328, 7247758, 4641249, 11886322, -27341762, 7941932, 18496814, 14526116, +-6049999, -1635846, -5957120, -12453795, 1315334, 11226508, 17513266, -10913512, -11028402, -12498355, +-1345935, -2132451, 1065152, -6053220, 2988760, 2988224, -2189897, -980326, -2751464, -5523865, +5184026, 2684, 702764, -8330089, -7020661, -1955821, -9075266, -3606699, -4604205, 889595, +-3292093, -102542, 6804839, -2916820, 2774012, -213138, -6558952, 1144609, -3364570, -960462, +2663417, 5938866, 744103, 2417530, 5549635, 5504538, 7354058, -2499671, -2148558, -1488206, +7541963, -1320703, -12496207, -835371, 12792023, 9925133, -9677098, -16480863, -13827647, -8127152, +-16022912, -903554, 7566122, 17563196, -3054259, -852551, -29430190, 17607756, 21932250, -3493956, +-11941620, -12138651, -7523172, 33014340, -20125144, -87510, -2384781, 8898635, -1490354, 38033548, +918049, -20727512, -5461051, -19699942, 25679072, 22316114, -18035104, 20990578, 5256503, 16892644, +6320581, -31787052, 9958419, 16971564, -22006338, -6129455, -24968792, -12502113, 863288, -23026394, +-19625316, -588411, -15899432, -252866, 5592048, -5723044, -15768972, 12918188, 11743514, -25999048, +-19842748, 10822781, 4585415, 6943352, 13172665, 17166984, -6320045, -9371619, -524523, -6087580, +-317291, -1966021, -8698383, 3421478, -36034240, 12246026, 17550310, -18632642, -15303505, 11588896, +-11712913, -10672457, -5049808, 6467147, 942208, 22331682, 199716, 13031468, -1255741, -9151502, +4885526, 6709813, 7035157, -5918465, 188442, 686658, -784368, -3812857, -8885750, 5857799, +9440338, -4849018, -15665893, 3968550, 1397475, 16616155, -1551020, -6540699, 5192616, 1823751, +8373576, -37581, -5025649, 95563, 6843494, 5033702, 1749125, -1815697, 1341640, -3122978, +-2545842, -7843147, 3982509, 3717294, -5282273, 2560874, 2425583, 1410897, -836445, -2653753, +753767, -7519951, 8381092, 20337208, 37970196, 59759100, 2063195, -23768886, -30681098, -6992744, +1499481, -7121593, 29157460, 21923124, 15254650, 25366614, 18543522, 15028627, 1266479, 12157442, +-15193447, 22003118, 25425132, 1958505, 26441966, -10526965, 2421825, 6318434, -24135568, -16163573, +-5509906, -14272713, -16831976, -2288681, 27174794, -117575, -4904853, 3597035, 6034429, -3399467, +-36175972, -4751308, 9829570, -5136781, -10879689, 4744328, 14398341, 25280178, 6474127, 13005698, +18020072, 22071300, -29844654, -20667382, 12162811, -8522289, 38661148, -3738769, 33287070, -26349624, +16044387, 27125940, 1335198, 4621922, 16443819, -28827284, -13193603, 1015760, 16930762, 727997, +19442244, 8013872, 7515656, 19743428, 7365332, -2321967, -7872675, -22759032, -4992900, 1600412, +6447283, 727997, 846645, 779537, -12208981, 6797323, 4728759, 11143830, -3397856, 8448738, +13726179, 8214662, 3736085, 222801, -1247151, 3088082, -4276177, 3006477, -4071092, 401579, +3109020, 2991982, -3558381, 6274411, 6177237, 7576859, 1174674, 846645, 3414499, -2357937, +5340255, -3454228, 5390184, 11813844, -1047435, -1954210, 1241246, 10305774, -5821292, 2626909, +-846109, -1230508, -1553704, 1638530, 3123515, 4779225, 3787088, 3706557, 9659381, -6299107, +11395622, -5129265, 42939472, 14498736, 15281494, 31390842, -1972464, 6897181, 13842143, 20277614, +-21904334, -17510582, -7263327, -19236084, -3115462, -25950730, 13815299, 21271900, 15625628, 21127480, +-13714904, -7479686, 16402480, 12807592, -8479339, 21423296, 13003013, -4546223, -25515864, 14663555, +16023449, -12823162, -1654099, 7851200, 4020626, -20513300, 24297166, 6730214, 26058640, 14382772, +10387378, -13677323, 12308303, -7111929, 39556648, -30613990, 3672197, 12186433, -5597416, -19642496, +13027710, 12847321, -2181844, 12647605, -11704323, 32368484, -14576045, 8788577, 7227893, -19983946, +-8562554, -27725088, 12195023, 8574902, -20635170, 19854024, 16924318, -14095546, 12203613, -1196685, +32729798, 10979010, -16019154, -11551315, -11406359, 10598906, -6554657, 9092446, -3933653, 2292976, +11092290, 7249368, 5634997, -10318659, 28132036, 3474629, -10645076, -15500537, 13679471, 7101729, +12916040, -6893960, 3898220, 10506027, 21238614, 5753646, -3325379, 17945984, -4599373, -4691715, +-2355790, 2117419, 4861366, -10091563, -9088688, 4392141, -7849590, -4447439, 1092532, -3422015, +-1018444, -952946, -7724499, 5846524, 3202972, -14695231, 3688840, -10882910, -6979322, -3189013, +5577015, 3361886, 10423349, 4958540, -295279, 3355443, 3830574, 4842039, 399432, 1655710, +2379412, 9250823, -2899640, -38056632, 16586627, -32500554, 33107218, 39826156, -2399813, 6757594, +-32858648, -545998, -7544647, 3081639, 18680424, 19154480, -6010270, 9818295, 15489800, 2260227, +6354404, 4311074, 6272263, -4359929, 22712860, -3440269, 4970888, -13042742, 25601764, 5367636, +-2657511, -1078037, 23030152, 8683887, 10761577, 25489558, -5940477, -16106664, 31367756, -33767568, +-14682346, -6030671, 7259569, 22003654, 4996658, -9332427, -9542344, -16407849, -485868, -3156801, +6314676, 35414688, 34484292, 21799644, 31108984, -3034395, 46909096, -15891916, 13022878, -11333345, +1043140, 14628122, -7299834, 1587527, -14162118, -18351858, 272730, -11579769, 9583146, -15677704, +23200876, -17589502, -28144384, -11758547, -7228967, -2660195, 33847028, -20552492, -4713190, -2998961, +-21246130, -5471252, 12385612, 26507464, -2332704, -1259499, 1046361, -8825621, -18243410, 644782, +-771484, -2877628, -1869385, -91268, -10519986, 8404177, -8998493, 10405632, -4128001, -8139500, +-8789651, 2085744, 8396124, -5967320, -7515119, -2757906, 6977711, 7581691, -5483063, 3517578, +4683125, 2652142, 4673998, -4465156, -3885335, 2067490, 533650, 4751308, -5869610, 4168266, +7767449, -411243, -2430952, -4028679, 6822019, -13728863, -6347425, 13431436, -8063801, -1015223, +-2045478, 2553358, -8279087, 6023692, -2559801, 12380243, 10734734, 176631, -13336947, 58553288, +81298896, 24929600, 63377612, -13875429, -44066900, -30888332, -21584358, 10690710, 11662447, -14696304, +-23663122, 20509006, 27597312, 16113107, 27533962, 21223044, 5252745, 8438000, 4169876, -1388885, +-18097918, 7980586, -21447992, 15110769, 150324, -20100446, 23296976, 14068702, 11150272, 40200356, +24729348, -11551851, -7755101, -14499273, -17150878, -21036750, -8284455, 805306, -16613470, -5185100, +34751656, 52674016, 38830800, 5285494, 26502632, 28233504, 43215424, 19757386, -22894860, -37628744, +-23444616, -24022826, 14200236, 11891691, -51395188, -35285840, -9073655, 21636434, 46774880, -35065724, +-1384590, -30440580, -3948686, 38196756, -21044802, 14368813, -30529164, -5019206, -9123584, 25743498, +-28618440, -16350940, 461709, 11341398, -23236846, 53303764, -12572443, -883153, 30324616, -13377749, +22793392, -7324530, -18853832, -14697378, 8842801, 816044, 7533910, 4670240, -16842178, 399969, +-7130183, 20366734, 11926587, 3536906, 11125576, 12658342, 664109, -240518, -4095251, -12824235, +25995290, -8143258, 5401995, 118648, -15161771, 512175, 1582696, -4867809, -10001368, -2263985, +-5910412, 1329292, 3786551, -4542465, 784368, 17635672, 12567611, -2412698, -2968359, 16693464, +-7168301, -2268280, -14341970, -20610474, -7820599, -5559835, -2439005, -5774047, -23241142, -44906032, +5250061, 24711094, -20918638, 38393788, -15609522, 15161771, -5366562, -44740676, -23061826, -2325188, +-26461830, -60330868, -17121350, 21553756, 33135672, -16447040, -26016764, -53841172, -16222628, 15705622, +-10940355, -15701864, -26949846, 6198175, -6300717, -4654671, -5288179, 10722386, 21288006, -16905528, +16389595, 14095546, -17246442, -49119932, 3716757, 3859565, 12359842, 5808407, 31768800, 3140158, +-49014168, 229244, -53951232, -335007, 18321256, 22379464, -4468377, 2897492, 24620364, -13113609, +-9816685, -16872780, 15818901, 11680164, -8051453, 19179176, -6331319, 8043937, 8623757, 31438624, +3860102, -11231876, -34057480, -11663521, 17145510, 15138149, 26417270, 38963408, 67159864, 33571612, +15878494, -17626546, -68166496, -18624052, -10163503, 51803212, -9092983, 3191698, -612033, -16391743, +1830193, 15168751, 6853694, -388695, 332323, 254477, -324270, 25117506, -9503152, -7508140, +-8775692, 17424146, 6236293, 8812736, -7308424, -21445846, 6612102, 9066676, -10226854, -1437740, +4984310, -1225139, 1184874, -3794604, -31321050, -10095321, -2971044, 14170171, 21678310, 2667712, +-18961744, -17963700, 7713762, 3036542, -2224793, -3001645, 479426, -1853815, -1456531, 16542067, +-18675054, 2378338, -16137803, 16565152, -9633075, 449361, -23008140, -3409667, 14515916, -4595615, +7541426, -12758200, 3543348, -43776992, -13377749, 30306362, -15038291, -12641162, -3306051, -9893994, +-35098472, -39043936, -57045756, -18084496, 51003, -4508105, 37243272, 10164577, 48664664, 29956860, +15035070, -6908455, -18053358, -3461744, 68274408, 4135517, 19645718, 10991358, -8622684, 33931852, +-14247480, 27365920, -30048128, -3096135, -21664352, 25744570, -36471788, -7789997, 11094974, 11355357, +11656004, -31958852, 22622666, -36563056, 7369627, -17974976, -12261058, 36145372, 2113661, 2262374, +12453795, -13888850, -839129, 9354976, -44255880, 1068910, 10176388, -6560026, 28469190, -12876849, +-5596343, 47800840, -18176838, -40007620, 83215, -15192373, 3209414, -3151432, -2114735, -32141388, +17096118, -5347235, -43671764, 26142930, -54083840, 10362145, -12407624, -21548924, -34190624, -4547834, +9238475, 15581068, 1387274, 12588012, 15761456, -18807662, 32934346, -7769059, 8797704, -588947, +15715285, -867583, -1785096, -5506685, 9290014, -19840064, -2550137, 6287296, 4250944, -7809861, +-135828, -8725226, -11410654, 5709086, 4657355, 8506720, 5542656, -2650532, 6682432, 19424526, +-9703405, -10358924, 3403762, -1124208, 3821447, 14360760, -2092723, 7747584, 7386270, 7335804, +-9882720, -12000675, -2943663, -1126355, -12414066, -882616, -2474975, 5066988, -13559749, 3879429, +-18924700, -66735200, -68579352, -58546308, -29519310, 120998896, 37888056, -15138686, -15801185, -59913720, +-126835216, -14335527, 34027416, 42469712, 18218714, -19573240, -14664092, -37444060, -41227392, 30874372, +-29726006, 76229224, 57132192, -89101248, 28690918, 11587285, -18758806, 6805376, 63791540, 9029632, +43967580, 87352656, -19175418, -71963248, 3234647, -12386686, -67085780, -18399104, 32200444, -3093987, +39667244, 64164128, 5596343, -55910812, -109313896, -93885304, -83936544, -8967355, 81027776, 22978612, +21504364, 12040404, -22231288, -109589312, -68625528, -35221416, -13508746, 6541235, 24562382, 23851028, +30692910, 31455804, 39150776, -47317116, -17146584, -38776576, -3451006, -42396696, 26091926, 26068840, +53616224, 59569584, 28363428, 746787, -16098611, -11184095, -73804720, -58764816, 51298552, 80371720, +54670640, 64195804, -15650861, -28877750, -58440548, -33304788, 17036524, 8590, 3807489, 17969606, +5898064, 4449049, -14299557, -18851686, -9447854, -14267344, 345745, 14082124, 3854196, 5390721, +-3413425, 8171712, -15578920, 10214506, -4769561, -14428943, -14212047, -4359392, -23524610, -7304129, +-14440217, 14703821, 16574816, 7981123, 6327024, -15337328, -31370978, -31025234, 8084202, -3015604, +13921600, 12253005, 6466074, -22636626, -11580306, -21558052, -33183992, 9820980, 22939420, -8871255, +-121768232, -136324944, -92743376, -95395520, -25590488, 106556528, 71724880, 114979496, 128088272, 194632880, +129216240, 133721656, 86231136, -6813429, -96453152, -166669424, -196809360, -170889776, -134812576, -97623000, +-23740432, -5173825, -14254996, 4721243, 42157252, 69490424, 96552472, 83866752, 114467320, 110504136, +142940272, 130662032, 36607616, 87620552, -19233938, 23784456, 17546552, 4716948, -12320651, -127836480, +-153313696, -196057744, -229834976, -209082768, -116224496, -103421736, -85016728, -106574248, -123169464, -26641146, +29941290, 76948632, 113022600, 163536784, 195575088, 250975872, 331434560, 321683392, 244395984, 198096784, +164973456, 87024624, 138521280, -56552908, -113223392, -270952320, -310038112, -385605376, -370272896, -338864864, +-320932832, -310228704, -190948336, -118580824, -64470680, 172683984, 176159696, 269123200, 346027808, 299740928, +270986144, 273855712, 215344288, 163902928, 90142776, 11492259, -1463510, -51218560, -61929132, -90070296, +-116286776, -160002560, -172614192, -157502896, -181144544, -140391200, -128580584, -121756952, -106627392, -55441584, +-10983305, 56186224, 116709296, 109102368, 170671264, 188196336, 208002048, 245097680, 198619696, 115471272, +57822608, -35779224, -90550256, -91090888, -175111184, -162739536, -222120144, -177416512, -184124176, -118828320, +-123693448, -72920488, -9342091, 61786324, 93720480, 164700192, 192387696, 186087504, 181366800, 176068960, +135773584, 47742320, -31244814, -45542760, -58606440, -65387656, -73498704, -87575992, -80851688, -60436096, +-64958696, -59369868, -51081120, -37298568, -16554415, -11860552, -8407935, 1801202, 10766409, 6766721, +10054518, 25705916, 30918932, 27554362, 18340584, 12511240, 9405442, 9110163, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 13406740, -1573569, -5842766, 2067490, -3676492, 1025423, -2377801, -1482301, -3195456, 2348273, 4016868, -1200443, 1285269, -7240241, 1482301, 179315, 2319282, 2834142, 1577327, 4240744, -833224, --2290291, 493384, 5058398, 82678, -3781182, -334471, 4315369, 2367064, 513785, 93952, -1254667, -56371, 381178, 877784, -79457, -1468342, -123480, 91268, 1730335, -2441689, --5812702, 4386772, 4384088, 3836480, 3599720, -127238, 1990717, 3438658, -3501472, -744640, --34897, -4678830, 1128503, 405874, 4346507, 503585, 2462627, 132070, 5450851, 2798171, --730144, 3849365, 2350958, -1167694, -4343823, 1163936, 1209033, -1100585, 389768, -2437931, --594853, 2316061, 1629940, 1935957, 4505958, -673236, -1341640, 672699, 2704219, 6169721, --3528853, 1693828, 1710471, 1845225, -123480, -343061, 1946157, -985158, 111132, 962610, --1089311, -130460, 233002, 388695, -690416, -1063541, 773094, -207769, 199716, -344671, -1175747, -71404, 1387811, -246424, 11334419, -7558606, 2563022, 6385543, 1499481, 4504347, -5449777, -4932770, 1046898, -439160, 2124935, -6256694, -4970351, -914291, 4881767, 6622303, --2527052, -2173790, 3173444, -5350456, -7170985, -1309428, -8434779, 2905546, 2803540, 780610, --5240397, -5318244, 1898912, -3088618, 722628, -140660, 5561983, 5887864, 5302137, -845035, -3715147, -5791764, 2527588, -3408057, -316217, 325344, 4536023, -4881231, -4353486, 51003, -5966247, 2478733, 2328409, -3597035, 2018098, 1497333, -1764158, -7442105, -1214939, -2512556, --3283503, -2932926, 3414499, -3120831, -1021665, 796180, 2116882, 5376226, -2061584, -107374, --4050154, -1938104, 828392, -5578626, -356482, 1550483, 3820374, -1194538, -2914135, -1444720, --5841156, 2783676, 1698123, 362388, -487479, -5013838, 2061584, 442919, -1808718, 1859184, --731218, 473520, 1656784, 193274, 331786, 1972464, 852014, 431107, 36507, 1588601, -558883, -263067, 627065, 945430, -4001836, -7248831, -1810329, 1243393, -2238752, -3671123, --2036888, -7226283, -4072166, 7630010, -311385, -3388729, 4042638, -6120329, -1406602, -7632694, --1591285, -6016176, -3149285, 7056632, 364535, -1443646, -7974144, -4975720, -1804423, -3420405, -1342177, -4248797, 409096, 2632815, 8441221, 4137664, 3162170, 3652333, 6832219, -5751498, --73014, -1726577, -4435628, 1823751, -911607, -1729798, -4642323, 2413772, 4868883, 507343, --3545496, -2272038, 12472048, 50466, -3590056, -4996121, -7486128, -9972377, -1248762, -5171678, -1193464, -1014149, 2782065, 517007, 1343788, -4582730, 681826, 748398, 6034429, 2039573, --4519380, 252866, -1407676, -1342177, -1079647, 2157684, 3234647, 3169686, -2960306, -2880849, -1814624, 862215, 1186485, 1305670, -1152662, -4422743, -5194763, -614180, 935766, -1239635, -539555, 35970, -705985, -1095217, -1628866, -632434, -313533, -978179, -1809792, 153545, -588947, -978716, 343061, -861141, 170188, -1077500, -540629, 212601, 282931, -1298691, -192737, -494458, -2334852, 242129, -821413, 1311039, -17431662, 6905234, -3114925, 2921115, --7211787, -2900714, -5645735, -5162014, 354872, -1621887, -3536369, 8887361, 2305861, -818191, --5383742, -1698123, 2501819, -6164889, -3263638, -5871221, -3267396, 8494908, 830539, 5666136, --537945, -52076, -1422171, 1609539, 1572495, -4498978, 59593, 1353452, 2543158, 9216463, --4811974, -5579163, -1100585, 10193568, 3211025, 10848014, 963683, 1001264, -1912334, 5359046, --925565, 7900056, -797790, -918049, -1414655, -3285650, 3362960, 1019518, -2812130, 2296734, -2981781, 5484137, -3162707, -277562, -976568, 4883915, -1988570, -824097, -1830730, -1250909, -1184337, -1600949, 576599, 823560, -1184337, 1207423, -8081518, 773631, 5267778, 1843078, -7052337, 569620, 758599, 1693828, 4497905, 7182796, -4741644, 687195, -362388, 1693828, --212601, -182536, 2166274, 4655745, 1806034, 2282238, 265214, -812823, -1198833, 628139, -2376728, -831613, 1089311, 1074816, 1134408, -48855, 500901, 1976759, -328565, 517007, --56371, 2281165, 1352378, -746251, -113817, 2454037, 1280437, -744103, 1829656, 999117, --3731790, -1841467, -79457, -8618926, -1440425, 81068, -4290136, -15254113, -3699041, -3289408, --6647536, -1297080, -1709934, 9552544, -3314104, 7224672, 3383897, 5211406, -9808632, -4406637, --9911711, -9207873, -8053, 1733556, 5765994, -2780455, -4333622, -2663417, -6703907, 1435056, -3049427, 3510062, 2159832, -2030983, 2495913, -4471598, 480499, -8066486, 2910914, -2079301, -1102196, 1779190, 3011309, 3218004, -3085934, 122943, 7810935, -4186519, 3783866, 3976603, --263604, 2382096, 3840238, -1584843, 1509681, 3789235, 202937, 6680822, -3503083, -4621922, --2243047, 2185602, -24696, -8877697, -4511327, -9836012, -10714870, -1823214, 2890513, -8725763, -3884261, -1416266, -161598, -2987150, 2916283, -5191005, -838592, -1813550, -7335804, -6459094, --2148558, 3837553, 115427, 3291019, -1393180, 2130304, 1695438, -4054449, 13959, -803159, -2284923, -2733210, -4583804, -1495186, 613643, -3221, -1770600, 779000, -1102196, -415538, -719944, -243203, 41876, -93952, -1049046, -227096, -1018444, -675384, -661425, -23085, -462246, 55835, 1291711, 500364, -638876, 4925254, -14198088, -684510, 4411469, 2784213, --7536057, -917512, -4795331, 1234266, 1439888, 1030792, -8230768, -11017665, -7510824, 1290638, --6004365, 6572374, 2079301, -10608032, 7665443, 6723235, 5317707, 4765266, -5273146, 8643085, -2281165, -61740, -3363496, 2923262, 5177046, -4741107, -6968585, 2582886, -2629594, -8630737, --1153736, -8327942, -3038689, 15098421, -4027069, -6776385, -8412767, 477278, 1374926, 6012418, -2391223, -5518496, 5027796, -633508, -4342749, -5737540, -6104223, 9308268, 4160213, 5869610, --4430796, -6054294, 2736968, 1514513, -6242735, -306016, -3828427, 6021544, -1160715, 545998, --7377143, 4720169, 3941706, -4185983, -2702608, -2594160, 8347806, 110059, 1224066, -2402497, -5719823, -5834176, -9940702, -4425427, 858993, -1894618, 5411659, -1103807, -629750, -5784784, --3064459, 2518462, 324807, -4114579, -2701535, 3528316, 1889786, -1110249, 143881, 60666, --10737, -1127429, 1516124, 686121, 2362769, 385473, 399432, 91805, 1014686, -478352, -1470489, -1941325, 2020245, -7623567, -335007, 1877438, -1915019, -6095096, -9043591, -7246684, -7286949, 843961, 8934069, 10668162, 10357851, 1566589, 14219563, 3410204, -1585380, 6575595, -5017059, 13143137, 1890323, 7556458, -10378788, 17075180, 12559021, 6072547, -5187784, -4110284, -6165426, 1425392, 4422206, -2537252, 7360500, -2196876, -1915555, 6627672, 5377836, -6739878, -4538170, -1799054, 7168838, 7797513, -15286862, -2811593, 9421548, 2849711, 5130339, 4049617, -9329206, -4497368, 3743064, 186294, -7854422, -3818226, -214748, 1651415, -11533061, -962073, -7297150, -5746666, 12248173, 9196062, -3696893, -88584, 2351495, 4614943, 7153268, -2747169, --2305861, 11609297, -2733747, -214212, 5047661, 263067, 6782827, 5424007, 2234994, 3758097, -3912715, 3754338, 1731409, 1613297, -1607928, -2674691, -1130650, -2433099, -285615, -1689533, -1289564, 1191317, -2450279, -1907502, -287226, 1903744, 3794604, 3199751, 1800128, 397284, -1889249, -3223910, -1467268, -1713155, 729608, -1229971, 1695438, -3751654, 419296, -24159, -3278134, 1351841, 168041, 611496, 3397856, 1086090, -2921115, 1016834, -264141, 840740, -29695940, -15530602, 2165201, 12246562, -1177358, 445066, 16207059, 17772038, 2109903, -1348083, -3738232, -846109, 4015795, 5114769, -6495065, -1979443, 10490458, 9276592, -4329864, -8431021, --9033390, -9356049, -5064304, 7808251, -6001680, 3435437, 412854, -10933376, -744640, -7259032, --883690, 3162707, 4796405, -14181982, -6687264, -11286100, -3526168, 17164836, 2455648, -1517197, -1507534, -1524713, 829466, 5092758, 2952790, 8588861, -477815, 6427956, 3789772, -5931350, -3764539, -9043054, 236760, -9082245, -9529996, 3633542, -10484015, 4442070, -143881, 5370857, -4216584, 3886409, -5609228, 6555731, -9512279, -153008, -4396436, -1432909, 11887933, 474057, -5937256, 5956583, -1238024, -2213519, 4580046, -9796820, 3917547, 9425843, -13987098, -10203769, --2876018, 7143605, -684510, -8521215, 3211025, -1191317, 3651259, -3097208, 1100585, -1731409, -6129992, -1083406, 5633924, 3201361, 5258651, 1903207, 1436130, -2709051, 3550327, 1670742, --154082, 2182380, 1781875, -948114, 2638721, 2181307, -1335198, -1315871, -4598836, -861141, --2641405, 1074, -149787, -1449552, 2312303, -705448, 1340567, 602369, 4728222, -3662533, --17729088, 3300146, 4282620, -11975443, 5409512, -78920, 12553116, -3311957, -6386617, 5315559, --15519864, -5334887, 13084081, 5745056, -7971460, -19160922, 8525510, -2662343, 4678293, -12222403, --16215649, -10991895, 14011257, 1155883, 7723425, -1340567, -7439420, -11011222, 5183489, -2930778, --9605157, -11203422, 795643, -9999221, -7713762, -4190278, -1997697, -10833518, 6056978, 7261179, -9787694, -4679904, 8697309, -7009924, 13775034, -2554432, -757525, 10522670, 5387500, -2591476, --7088307, -3528316, 10126996, 2359011, -7563975, 3617436, 10758356, 10204842, 4359929, -12444668, --13778792, -1218160, 2651606, 868657, -9925133, 2981244, 10908143, 3178276, -4680978, -17605070, -4687957, -7652021, -17207786, 550830, 896574, -9698036, 13946833, -996432, -5767068, -19035832, --139050, -5593121, -906238, 7165079, -4286378, -7271917, -510027, 1653026, 1705639, -5762773, --5876052, -5801427, 2126546, -5006322, 296890, -893890, 801011, -1384053, 1388885, 2571612, -2257542, 2937758, 1430761, 5272073, 6671695, 388158, 1950452, 1239098, -2625836, -717260, --2143189, 830002, 715649, 404801, -6515466, 778463, -570157, -2359548, -328028, -2120103, -1941325, -2593624, -2750927, -21936008, 13775034, 10627360, 11699491, 1673427, 12364674, 1270774, --7902203, -9142375, 1404991, 9928354, -6815040, 2328409, -14769856, 10174241, 10790032, -5390721, --3025268, 2520609, 11815455, 8632884, -6054294, -5402532, 8093866, -9629317, 3387119, -13178033, -27917, -3849365, -17680770, -18233210, 3602941, 10622528, 4949950, -15553150, -8367670, 12021077, --13181255, -5415417, 10674604, -2777770, 13331042, -4578972, -9199283, 3580392, -13406740, 15607374, --1580548, 2843268, -7194607, -3592203, -559420, -14459544, -8818105, 1267552, -2289218, 1551020, --4636954, -15349676, 2988224, -12691091, 5794985, -3123515, 9322227, -15316390, 7029251, 2739116, --4297115, 11592654, -1357747, -7796977, -15055471, -1940788, 3426310, -12122545, 9127342, -8158827, -5956046, -15993921, -16364362, 7926899, 6332930, -6482717, -5091147, 5326297, 3653407, -3403762, --2848100, -4337380, -5628555, -431107, -9099962, -880468, -1255204, 779537, 2612951, -1610076, -2640868, -1679869, -506806, -4873178, -2399813, -1259499, -586263, 7413651, -2117419, -940061, -4285841, -4489315, 3221762, 1915555, -1726577, -1022202, -4559645, -4175245, -145492, -2405182, --2910914, 7178501, -6950331, 2396055, 8545911, 12598750, -3302830, 1407139, -4442070, -16798690, --3562139, -3591130, 7332046, -14758044, -11811, -8513699, 9195525, -10325638, -14047764, 9367324, -4338454, 6091874, 19435264, -3201361, -5521181, 5468030, -12381317, -14496588, 1238561, 18554796, -5692979, 10412074, -7357279, -9122511, -14708116, 2937758, 18900004, -8460012, 9906342, 2249489, -14711337, -22437446, -7069516, -394063, 2694555, 12750684, 6222871, -17108466, -4563403, -7953206, --610959, -19698868, -3024731, -7108171, 1430224, -10382547, -615254, 2374580, -28646894, 3260954, --8928700, 1731409, -11289858, -653372, 7144678, 3572876, -3783866, -3677029, -15061913, 15188615, -14718853, 4785668, 3737695, -13183939, 20155744, 6945499, 10436771, -3994320, -31489090, 12266427, --984084, 23649700, 22359600, 6974490, -2756295, 9758703, 624381, 8538932, 570694, 933619, --5478768, 2622078, -4992900, -2782065, -1307818, 10276246, -28991, 568546, 2774549, -712428, --5454609, -2928094, 1077500, 4130148, -1844152, 2025077, -3142842, 4298189, -3291556, -5331128, --2543695, -826244, 2602213, 887448, -987306, -984621, -1010391, 6748468, -1340030, 322123, -1280437, 3328063, 27215060, 9607842, 18631568, -18045306, 4216048, 18997714, -5686537, -6822019, -2700998, -11718818, 8979703, 2289218, -13689671, -17930414, -1330903, 15242302, -376347, -1207960, -9978283, -14854144, -3772055, -12224551, 6894497, -20845624, 361314, -4442070, 7605850, -21772262, --15038291, -9503152, 6403796, 7031935, 4871567, -7049652, 5312338, -5239860, 6477885, -4294968, --1891933, -1481227, -6102612, 4165045, 9660455, 5761162, 9724880, -780073, -9401147, 1361505, --9360881, 25001542, -6298033, -24554864, -7639673, 6736656, 21361556, -21344914, -8792872, -1372779, -13741211, 898722, -30218854, -3692598, 13969381, 28837484, 1083406, 20082194, 28919626, -2130841, -9320079, 13677323, -3764539, 24652576, -3294777, 29766270, 4752918, -8152385, -25782152, -16138876, -207769, 7779797, 3721589, -3905736, -4998268, -7995619, -10926934, -9702868, 11847667, 3482145, --129386, -16940962, -1902134, 645319, -3082176, -9625022, 2531346, 5127654, -1447404, -4977867, --3634079, -9429601, -5694053, -2757369, 5966247, -1145683, -5133560, 5178657, -7380902, 5337034, -5377299, -4610111, -8949101, 8210367, 12175159, 1884954, 382789, 762357, 7097434, -2091649, --8464844, 1022202, 8223789, 6829535, -8405788, -7119982, 1318018, 1372779, 127238, 2457795, --1310502, 11460583, 13868449, -23730768, -23086522, 6149857, -5368709, 760746, -9174050, 21599928, --9664750, -6162741, 7518877, 5435281, 230854, -9828496, -7195681, -11967389, 4859756, -660351, --5781563, -922344, 14365055, 21573620, -23269596, -1451699, -22699440, -2384781, -5850819, 22560926, --9488656, -9053791, -4353486, 13744969, 4575214, 3819300, 5771363, 5522791, -4045859, 307627, --2925410, 3698504, -2665027, 21124260, -5468567, 5635534, 14872398, -7693360, -17015586, 3831648, -5833640, -5954436, -6509023, -1384053, 3531537, 10737418, -14570140, 19605988, 28798830, 19372450, --8048232, -11599096, -26612154, -34333432, -12620225, -86973, -6191732, -1697586, -3887482, 8265128, --686121, -13231720, 6999723, -5833103, -1238561, 12663711, 21068962, -5102958, 5939940, -3652870, -1178969, 19208704, 9703942, 16436840, 16705275, -13277355, -4075924, -3000035, 499290, -250719, -5962489, 466541, 3664681, 16858820, 724776, 7909719, -3535832, -3626026, -6856379, -2048699, -1003949, 7718593, -2099165, -6300180, -2969970, 3754875, -2619930, -1353989, -1947231, 2403034, -632434, -2392834, -1308354, 1800665, 877247, 964757, 9716290, -3877819, 266825, 1350767, -167504, -5248987, 2472828, 3119220, 6215355, -12217571, 23172960, 10440529, 13198435, 19793894, -30566746, -11698954, 15834471, -31405338, -3834332, -14070313, -30856118, 12535936, 7353521, 9440875, -4169340, 12278238, 3775276, -22202296, 18762028, 33108830, -4911295, -5291400, 8138963, 3316252, --6871411, -29460792, 2454574, 132070, -2643016, 425739, 10071698, -21056078, 4603131, 6013491, --4298189, -12135430, -5890011, -13528610, 13840532, -30248918, -4351339, -19448148, 10852845, 4399121, -11005317, -3831648, 3025268, -7719667, 18566070, 5598490, 15248208, -13817447, 14988899, -319438, --14598594, 30254824, -4971962, 3721589, 20459614, -19603842, 22928682, 13697188, -17900350, 7587060, --6818798, 10075993, -24813636, 18183280, 2616172, 6399502, -2291365, 5898601, -20142322, 12866648, -22961432, -45521820, 4696010, 43935904, -28326920, -9093520, 3144990, 21422224, 15227270, 5293547, -13310104, -5976984, 8043937, -3320010, -9670656, 4817880, -2128156, -1622961, 8304856, 11994770, --982474, -4649839, -3951907, 3556233, 7690676, -10133438, -3754875, -6932077, -4272419, -9060770, -9118752, 11989938, -2479807, 5524402, -3361886, 2248952, 7675107, 8616778, -9864466, 852014, -3721589, -5195837, 7932268, 415538, -106300, 7148973, 3702262, -8575439, -7130183, 2451353, -1198833, -2582349, 1517734, 18386754, -11215233, -13495324, -479963, -12923557, -5901822, -34055332, --29070486, -4070019, -16698296, -20047296, -14463302, 8805220, -5180805, -10186589, -16292422, 14931991, -963146, -24616068, -3914326, -215822, -11722039, -3752728, 9921374, 7080254, -1765232, 9664, -428423, -6242198, 5200669, 11375221, -4330938, -2818572, 17558900, -33135136, -5416491, 9215389, -35210680, -14680735, -9172440, -13236552, -17912162, 7710540, 37369436, 6854231, 23139136, 4691715, --3829500, -2047626, -2791729, -18138720, 3932580, 3988414, -14711874, 3159485, 29189672, -4835060, --9028021, 4800700, -10506027, -2505040, 25750476, 37993280, 10266046, 22768158, 26418344, -9481677, --11049877, 2909840, -8743480, 1399623, -26154204, -337692, -20381230, 6090264, 4245575, 12306692, --21214990, -8034810, -7239168, -8420283, -6644852, -7548942, 11811160, 2433636, 15225659, -3979824, -5806259, 15107547, -2793339, 423054, -2203318, -6161131, -4854387, -945967, -3665218, -5675263, --86973, 2184528, -2865817, 905164, 7122130, -7253126, -6476811, 367220, 5346161, 2643552, --3409667, -10690174, -10261751, -1384053, 2433636, -6394133, -3471407, 2091649, -2103460, 983011, -779537, 7101729, 2457258, 1712081, -7885560, 8640400, -3651796, 27110370, 30617748, -12203613, -69198904, -9444096, 1641751, -12735652, 8199630, -5354214, 8093329, 17814988, 5090610, -16503949, --8936216, -17246978, -229244, -11690901, -21378736, 2936147, 13967234, -2291365, 4105989, 6663105, -8214662, -63351, -6127308, -8016557, 4163971, 11274, -10630044, 4260071, 29779692, 21074330, -11999602, -25139518, 18156974, 14218489, -6591164, -7623030, -7656853, -10013179, -4285304, 8241506, --18195092, 1818382, 2327336, 11025718, 28388660, 5548024, 5925981, 1618129, -3339874, -5655935, -12340515, -7371775, 28665148, 9285719, -2716030, 12615930, 2432025, -19202798, -13824426, 16352014, -18804978, 7056632, -4643397, 12560632, 13465796, 19206020, 37402184, 4102768, -10691247, -19108846, --12781286, 9804337, 2158758, 3245922, -1729261, 13244069, 1443109, -1489817, -17387102, -8481487, -18205830, 20481088, -7210713, -13721884, -16478179, -4669167, 8917426, 5705864, 1682554, -5465883, -1487669, 125091, -7267622, 203474, -16111496, -4064113, -564788, 11742977, -2036351, -3364570, -141197, 9557913, -5579163, 6896107, -3446175, -7432441, 6630356, 9456981, 6044630, 6740415, --783832, 7208566, 13413720, 5997922, 5766531, 4000225, -4862440, -2051384, 437013, -1008780, -4080756, -3578245, 6621229, 8645769, 5072357, 809064, -6356552, 2727841, 2414309, 7021198, -11217918, -10737955, 49445812, -7349226, 2102387, 5483600, -3728569, -684510, 12404939, -9190156, --10865194, -5701569, 16008417, 14295262, -38200512, 7379291, 6563784, 15643345, -9745281, -15073188, --14333380, 10945187, 9933722, -15400142, -8374650, -6315213, 25776246, 12955769, 7291244, -4974109, --26574574, 7565048, 6782290, 13752485, -3221226, 7317014, -7306276, 2614025, -23056996, 9629854, -9563818, 355945, -5638755, -14500883, -28682866, 18685792, -12016245, 9615895, 9965398, 16510391, -2423435, -17526688, 29325500, 5734855, -28408524, -13225278, 17221208, 4079145, 22507240, 9473087, -3840775, -20329154, -9895605, 11368778, -35219804, 38115688, -27044872, 1552094, 23038742, -6135361, -45507324, 6803765, 8404714, -16412144, 52993992, 5514738, 34550864, -23315230, -10232760, -7332046, -13617731, -1414655, -5132486, 23966454, -19568408, 23115514, -27189828, 5928129, 3052648, 5028333, --5043366, 20381230, -2168959, 10402948, 9433359, 13547401, 7978976, 3999152, 9765145, 10588168, -676457, 3916473, 1482301, -7093676, 9364102, 320512, 6541235, 12812424, 6727530, 863288, --321049, 9822053, 10841571, 5306969, -5655398, 21442088, -637266, -4236985, -3839701, 13778255, --10100152, 4813585, -1975148, 7423851, 792421, 3103114, 4382478, -2894808, -2018098, 2127620, -4427575, 3581466, 4617090, 5541582, -6131603, 17343614, 40761924, 13534516, 25595858, 32631014, --1403917, 37420440, -28841242, -10326175, -10865194, -9532143, 3991635, 6116034, -2487323, -12730820, --24819006, 23802708, 22434762, 9539659, 20257214, -33226940, -28815472, 9720585, 13707388, -15348603, --21624624, 13812078, -6857989, -30959734, -11447698, -5876052, 15263777, -28458454, 15697569, 10735271, -12418898, -13292924, -874563, -13145284, -5871221, -37906844, -9333501, 18434536, -60224032, -19013284, --2397666, -1303523, 1984812, -36131948, -9102109, -54437100, -4643397, 10815801, -15620259, -16996796, --7161321, 16443282, -5649493, -19590956, -22517976, -56792352, -20389820, 26667452, -25283398, -38203196, -31911070, -9999221, -43147780, 13074417, 38723964, -20712480, -9558450, 4769025, -28352152, 35072704, -15388868, 22478248, -11876658, -2411087, 11356967, 33413234, 15373299, 5332739, -10844792, -2250026, -37660420, 3762391, 5717675, -2697240, -22484154, -9817758, 17577690, -304406, 922344, -3522410, --20121922, -1416266, 8407935, -12256226, 14445586, -18951006, -12449500, 4030290, -6918656, 10014253, -3779034, -17223356, 6880538, 8834211, 4438849, 3438658, -7293928, 4288525, -434329, -4094715, --12568148, 6267968, 4723927, -1276142, 8996346, -13481902, 1242856, -12894566, 49392, 3642132, --4937602, -2078227, -979253, 5354214, 418759, 47595752, 65606164, -9679246, -1520955, -24999930, --25162602, -43725988, 19250044, -7008313, 65527244, -13229036, -27649926, -38662220, 2746095, 12682502, --14006962, 12775917, 42996380, -16363825, -7122130, -29214368, -13060996, 29255706, 33626372, -32937030, --9030169, 17586818, -6782290, 8038568, -9550934, 42239928, 33913060, 71675488, 23630910, 31957778, --13597866, 23045720, 48566416, 16084653, -2659659, 11688753, -1212791, 31845036, 16827682, 46229416, -13306882, -45714020, 16625818, 18287434, 38440496, -20827370, -17713518, 22501334, 24299852, -10919417, -38636452, -12903692, 16079284, -41548440, 26998702, -9371619, 14985678, 15454903, 33921116, 29543470, --22709640, -23616952, -7361037, 35653596, 35930624, -12887586, -19331648, -37341520, -3917547, 27187680, -30626338, 20667920, -8454106, -24517820, -23310934, -3517041, 16843252, -15810311, 23331336, 6269042, -16401943, 3460133, -7821136, 18816788, 11847130, -2103460, -7388955, 6346351, 15801722, -21746494, -9357123, 11872900, 15397995, 8927090, 21628918, -6359773, 7823820, -9302899, -14316200, 9143985, -18240726, 16476031, 24380918, 463856, -49392, 7950522, 6659884, 43728672, 8489540, -1100585, --18580028, 826781, 27710592, 14714558, 21438866, 13114146, -439160, 1119913, -4620848, 562104, -26593900, 22705882, 2400887, 8956617, -2604898, -3611531, 1012539, 11918534, 8495982, 8160975, --5734855, -4853850, 6363531, 1636919, -15897285, -52763136, 3762928, 81046568, 48425220, -11223286, --118620016, -16892106, -12009802, 9363029, -13470091, 2331094, 12406550, -4447976, 5369246, -25729538, -16510928, 19931870, 36696200, -26423712, -33491082, 34765612, 54913304, 13943074, -24392730, -32399622, --6979322, 8275865, 3077344, 8790187, 208843, 12194486, 4867809, 35955856, -11449846, -49115100, --21335250, 15945603, 5792301, -16909824, -21549998, 2983929, 23213762, 41351408, 37831684, -690416, -629213, 15643345, -14635101, -42359652, 12904229, -26373784, 51005956, 56084220, -1144072, 15940771, -7989713, 11304354, -24751896, -3409130, 53179212, -19883552, 473520, -72110888, -9622337, 8348880, -16698833, 15917149, 14942728, -17707614, -11274289, 32913946, 47877076, -8254927, -2097555, 4859756, -19259170, 23591718, -10897406, 8086887, -26103738, -30554398, 3120831, 8680129, 11366094, -3518652, --4853313, -5583995, -6662568, 21282100, -162672, -3685082, -11108396, -616328, 12951474, 12050068, --6350109, 16387985, 3643743, 24797530, 1972464, 4619774, 756451, -8329552, -7407745, -4021700, --5776194, -1375463, -7457674, -4861366, 1807644, 20692616, 23000086, 7159174, 11908334, 4820564, -4107599, 20248086, -14483167, 15450608, 5357435, 25141664, -6761889, 6800007, 4460324, -9771051, -7753490, -4480188, 7911330, -2489471, 13583908, -4511863, -8684961, 7127498, 2840584, 3651259, -5258114, 3753265, 9573482, 2208687, 3465502, 2101313, 3238942, 3721052, 2735357, 6669011, -4394826, 1012002, 645856, 1705102, 5940477, 4809827, 4429185, 5477694, -6285685, -53438520, --22168474, 42549168, 46921980, 44537736, 60453276, 10289131, -26148834, -80000208, -60723860, -11544335, -16848082, 50502372, 55006184, 25916906, 1159641, -26953604, -23276576, -10444824, 17138530, 47114180, -26793616, -6383932, 1670742, -4011500, -25999048, -35676144, -29110214, 5283347, 43481176, 32517198, -65407520, 42381664, 42112156, 59117004, -17303350, -41166724, -46642272, -62105764, -76261976, -28982976, --9013526, 22431004, 41960756, 60401200, 56638272, 45806364, 29117194, 58001924, -11399917, -37063420, --1733556, -9630927, 15408195, 17362942, 69524784, 60442000, -22573274, 10616085, -15806553, -46768436, --13708462, 12054899, -27972586, 42913704, -17289928, 14060649, 3697967, -5240934, 37404332, 51622284, -41442140, 28819230, -21559126, -52861920, -59757492, 16726750, -25179246, 4257387, -2852932, 33392834, -5299453, 18740016, -16101296, -37175628, -34133716, -53997404, -46603616, 19435264, 11180337, 26633630, -40685688, 31258772, 1242319, -24336358, -38580080, -52765820, -28628104, -13780403, -19250044, 8237211, --6980396, -6493454, -6185290, -16325171, 168577, -7490423, -10548977, -13060459, -8020852, -2130304, -8383776, -15719580, -9545565, 22308060, 2232846, -119464512, -125736776, -130787120, -134055592, -177140560, --19223200, -50107236, -12120398, 16551193, 80706192, 91716880, 94836632, 132741872, 183504624, 175827904, -172805856, 138838576, 100291248, 72878080, 21925808, -83719112, -40156332, -49458696, -30610768, -100545184, --16660178, -41609644, -45818712, -83195664, -63918776, -65040300, -58906012, -61546344, -108156400, -95783680, --56499756, -51095080, -64177548, -88938576, -13483513, -77876880, -147614272, -126491616, -111038328, -58529668, --75420160, -13453448, -152784864, -67647880, -67648960, -31255550, -22764400, -78668768, 3539590, -78816944, --9468255, 12314208, 37006512, 3340411, 38034084, 56727928, 89203784, 95056216, 130791416, 85453744, -205208704, 129667208, 238850640, 162376064, 237952464, 275961856, 327714592, 269165056, 271026944, 305413504, -274085472, 278319776, 270913120, 234870288, 135953424, 108615968, 76703288, 55919400, 65488588, 97633736, -53890028, -19767050, -33867964, -39142184, -67223216, -87312928, -106416944, -98044440, -161110672, -156117232, --160748816, -194795552, -171485152, -216383680, -191542656, -224826512, -230847520, -217517552, -239963584, -217045632, --242307024, -192364608, -188419680, -156209568, -166662992, -171856144, -120736360, -108163384, -82571280, -42059004, -14302241, 46119896, 40519260, 51621748, 46302968, 52185464, 60047400, 85623392, 102984728, 93013960, -83799640, 102304512, 95332168, 117667608, 107268952, 78353624, 71478992, 62064424, 54842976, 34498788, -26384520, 24437290, 15589658, 16940962, 6990596, 11067594, 9880572, 6725382, 9915469, 7137162, -4484483, 1649804, -3459596, -496606, 87510, -10295573, -16087337, -9226127, -7261179, -6651831, --4581657, -3251827, -2968896, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +1573569, -5842766, 2067490, -3676492, 1025423, -2377801, -1482301, -3195456, 2348273, 4016868, +1200443, 1285269, -7240241, 1482301, 179315, 2319282, 2834142, 1577327, 4240744, -833224, +-2290291, 493384, 5058398, 82678, -3781182, -334471, 4315369, 2367064, 513785, 93952, +1254667, -56371, 381178, 877784, -79457, -1468342, -123480, 91268, 1730335, -2441689, +-5812702, 4386772, 4384088, 3836480, 3599720, -127238, 1990717, 3438658, -3501472, -744640, +-34897, -4678830, 1128503, 405874, 4346507, 503585, 2462627, 132070, 5450851, 2798171, +-730144, 3849365, 2350958, -1167694, -4343823, 1163936, 1209033, -1100585, 389768, -2437931, +-594853, 2316061, 1629940, 1935957, 4505958, -673236, -1341640, 672699, 2704219, 6169721, +-3528853, 1693828, 1710471, 1845225, -123480, -343061, 1946157, -985158, 111132, 962610, +-1089311, -130460, 233002, 388695, -690416, -1063541, 773094, -207769, 199716, -344671, +1175747, -71404, 1387811, -246424, 11334419, -7558606, 2563022, 6385543, 1499481, 4504347, +5449777, -4932770, 1046898, -439160, 2124935, -6256694, -4970351, -914291, 4881767, 6622303, +-2527052, -2173790, 3173444, -5350456, -7170985, -1309428, -8434779, 2905546, 2803540, 780610, +-5240397, -5318244, 1898912, -3088618, 722628, -140660, 5561983, 5887864, 5302137, -845035, +3715147, -5791764, 2527588, -3408057, -316217, 325344, 4536023, -4881231, -4353486, 51003, +5966247, 2478733, 2328409, -3597035, 2018098, 1497333, -1764158, -7442105, -1214939, -2512556, +-3283503, -2932926, 3414499, -3120831, -1021665, 796180, 2116882, 5376226, -2061584, -107374, +-4050154, -1938104, 828392, -5578626, -356482, 1550483, 3820374, -1194538, -2914135, -1444720, +-5841156, 2783676, 1698123, 362388, -487479, -5013838, 2061584, 442919, -1808718, 1859184, +-731218, 473520, 1656784, 193274, 331786, 1972464, 852014, 431107, 36507, 1588601, +558883, -263067, 627065, 945430, -4001836, -7248831, -1810329, 1243393, -2238752, -3671123, +-2036888, -7226283, -4072166, 7630010, -311385, -3388729, 4042638, -6120329, -1406602, -7632694, +-1591285, -6016176, -3149285, 7056632, 364535, -1443646, -7974144, -4975720, -1804423, -3420405, +1342177, -4248797, 409096, 2632815, 8441221, 4137664, 3162170, 3652333, 6832219, -5751498, +-73014, -1726577, -4435628, 1823751, -911607, -1729798, -4642323, 2413772, 4868883, 507343, +-3545496, -2272038, 12472048, 50466, -3590056, -4996121, -7486128, -9972377, -1248762, -5171678, +1193464, -1014149, 2782065, 517007, 1343788, -4582730, 681826, 748398, 6034429, 2039573, +-4519380, 252866, -1407676, -1342177, -1079647, 2157684, 3234647, 3169686, -2960306, -2880849, +1814624, 862215, 1186485, 1305670, -1152662, -4422743, -5194763, -614180, 935766, -1239635, +539555, 35970, -705985, -1095217, -1628866, -632434, -313533, -978179, -1809792, 153545, +588947, -978716, 343061, -861141, 170188, -1077500, -540629, 212601, 282931, -1298691, +192737, -494458, -2334852, 242129, -821413, 1311039, -17431662, 6905234, -3114925, 2921115, +-7211787, -2900714, -5645735, -5162014, 354872, -1621887, -3536369, 8887361, 2305861, -818191, +-5383742, -1698123, 2501819, -6164889, -3263638, -5871221, -3267396, 8494908, 830539, 5666136, +-537945, -52076, -1422171, 1609539, 1572495, -4498978, 59593, 1353452, 2543158, 9216463, +-4811974, -5579163, -1100585, 10193568, 3211025, 10848014, 963683, 1001264, -1912334, 5359046, +-925565, 7900056, -797790, -918049, -1414655, -3285650, 3362960, 1019518, -2812130, 2296734, +2981781, 5484137, -3162707, -277562, -976568, 4883915, -1988570, -824097, -1830730, -1250909, +1184337, -1600949, 576599, 823560, -1184337, 1207423, -8081518, 773631, 5267778, 1843078, +7052337, 569620, 758599, 1693828, 4497905, 7182796, -4741644, 687195, -362388, 1693828, +-212601, -182536, 2166274, 4655745, 1806034, 2282238, 265214, -812823, -1198833, 628139, +2376728, -831613, 1089311, 1074816, 1134408, -48855, 500901, 1976759, -328565, 517007, +-56371, 2281165, 1352378, -746251, -113817, 2454037, 1280437, -744103, 1829656, 999117, +-3731790, -1841467, -79457, -8618926, -1440425, 81068, -4290136, -15254113, -3699041, -3289408, +-6647536, -1297080, -1709934, 9552544, -3314104, 7224672, 3383897, 5211406, -9808632, -4406637, +-9911711, -9207873, -8053, 1733556, 5765994, -2780455, -4333622, -2663417, -6703907, 1435056, +3049427, 3510062, 2159832, -2030983, 2495913, -4471598, 480499, -8066486, 2910914, -2079301, +1102196, 1779190, 3011309, 3218004, -3085934, 122943, 7810935, -4186519, 3783866, 3976603, +-263604, 2382096, 3840238, -1584843, 1509681, 3789235, 202937, 6680822, -3503083, -4621922, +-2243047, 2185602, -24696, -8877697, -4511327, -9836012, -10714870, -1823214, 2890513, -8725763, +3884261, -1416266, -161598, -2987150, 2916283, -5191005, -838592, -1813550, -7335804, -6459094, +-2148558, 3837553, 115427, 3291019, -1393180, 2130304, 1695438, -4054449, 13959, -803159, +2284923, -2733210, -4583804, -1495186, 613643, -3221, -1770600, 779000, -1102196, -415538, +719944, -243203, 41876, -93952, -1049046, -227096, -1018444, -675384, -661425, -23085, +462246, 55835, 1291711, 500364, -638876, 4925254, -14198088, -684510, 4411469, 2784213, +-7536057, -917512, -4795331, 1234266, 1439888, 1030792, -8230768, -11017665, -7510824, 1290638, +-6004365, 6572374, 2079301, -10608032, 7665443, 6723235, 5317707, 4765266, -5273146, 8643085, +2281165, -61740, -3363496, 2923262, 5177046, -4741107, -6968585, 2582886, -2629594, -8630737, +-1153736, -8327942, -3038689, 15098421, -4027069, -6776385, -8412767, 477278, 1374926, 6012418, +2391223, -5518496, 5027796, -633508, -4342749, -5737540, -6104223, 9308268, 4160213, 5869610, +-4430796, -6054294, 2736968, 1514513, -6242735, -306016, -3828427, 6021544, -1160715, 545998, +-7377143, 4720169, 3941706, -4185983, -2702608, -2594160, 8347806, 110059, 1224066, -2402497, +5719823, -5834176, -9940702, -4425427, 858993, -1894618, 5411659, -1103807, -629750, -5784784, +-3064459, 2518462, 324807, -4114579, -2701535, 3528316, 1889786, -1110249, 143881, 60666, +-10737, -1127429, 1516124, 686121, 2362769, 385473, 399432, 91805, 1014686, -478352, +1470489, -1941325, 2020245, -7623567, -335007, 1877438, -1915019, -6095096, -9043591, -7246684, +7286949, 843961, 8934069, 10668162, 10357851, 1566589, 14219563, 3410204, -1585380, 6575595, +5017059, 13143137, 1890323, 7556458, -10378788, 17075180, 12559021, 6072547, -5187784, -4110284, +6165426, 1425392, 4422206, -2537252, 7360500, -2196876, -1915555, 6627672, 5377836, -6739878, +4538170, -1799054, 7168838, 7797513, -15286862, -2811593, 9421548, 2849711, 5130339, 4049617, +9329206, -4497368, 3743064, 186294, -7854422, -3818226, -214748, 1651415, -11533061, -962073, +7297150, -5746666, 12248173, 9196062, -3696893, -88584, 2351495, 4614943, 7153268, -2747169, +-2305861, 11609297, -2733747, -214212, 5047661, 263067, 6782827, 5424007, 2234994, 3758097, +3912715, 3754338, 1731409, 1613297, -1607928, -2674691, -1130650, -2433099, -285615, -1689533, +1289564, 1191317, -2450279, -1907502, -287226, 1903744, 3794604, 3199751, 1800128, 397284, +1889249, -3223910, -1467268, -1713155, 729608, -1229971, 1695438, -3751654, 419296, -24159, +3278134, 1351841, 168041, 611496, 3397856, 1086090, -2921115, 1016834, -264141, 840740, +29695940, -15530602, 2165201, 12246562, -1177358, 445066, 16207059, 17772038, 2109903, -1348083, +3738232, -846109, 4015795, 5114769, -6495065, -1979443, 10490458, 9276592, -4329864, -8431021, +-9033390, -9356049, -5064304, 7808251, -6001680, 3435437, 412854, -10933376, -744640, -7259032, +-883690, 3162707, 4796405, -14181982, -6687264, -11286100, -3526168, 17164836, 2455648, -1517197, +1507534, -1524713, 829466, 5092758, 2952790, 8588861, -477815, 6427956, 3789772, -5931350, +3764539, -9043054, 236760, -9082245, -9529996, 3633542, -10484015, 4442070, -143881, 5370857, +4216584, 3886409, -5609228, 6555731, -9512279, -153008, -4396436, -1432909, 11887933, 474057, +5937256, 5956583, -1238024, -2213519, 4580046, -9796820, 3917547, 9425843, -13987098, -10203769, +-2876018, 7143605, -684510, -8521215, 3211025, -1191317, 3651259, -3097208, 1100585, -1731409, +6129992, -1083406, 5633924, 3201361, 5258651, 1903207, 1436130, -2709051, 3550327, 1670742, +-154082, 2182380, 1781875, -948114, 2638721, 2181307, -1335198, -1315871, -4598836, -861141, +-2641405, 1074, -149787, -1449552, 2312303, -705448, 1340567, 602369, 4728222, -3662533, +-17729088, 3300146, 4282620, -11975443, 5409512, -78920, 12553116, -3311957, -6386617, 5315559, +-15519864, -5334887, 13084081, 5745056, -7971460, -19160922, 8525510, -2662343, 4678293, -12222403, +-16215649, -10991895, 14011257, 1155883, 7723425, -1340567, -7439420, -11011222, 5183489, -2930778, +-9605157, -11203422, 795643, -9999221, -7713762, -4190278, -1997697, -10833518, 6056978, 7261179, +9787694, -4679904, 8697309, -7009924, 13775034, -2554432, -757525, 10522670, 5387500, -2591476, +-7088307, -3528316, 10126996, 2359011, -7563975, 3617436, 10758356, 10204842, 4359929, -12444668, +-13778792, -1218160, 2651606, 868657, -9925133, 2981244, 10908143, 3178276, -4680978, -17605070, +4687957, -7652021, -17207786, 550830, 896574, -9698036, 13946833, -996432, -5767068, -19035832, +-139050, -5593121, -906238, 7165079, -4286378, -7271917, -510027, 1653026, 1705639, -5762773, +-5876052, -5801427, 2126546, -5006322, 296890, -893890, 801011, -1384053, 1388885, 2571612, +2257542, 2937758, 1430761, 5272073, 6671695, 388158, 1950452, 1239098, -2625836, -717260, +-2143189, 830002, 715649, 404801, -6515466, 778463, -570157, -2359548, -328028, -2120103, +1941325, -2593624, -2750927, -21936008, 13775034, 10627360, 11699491, 1673427, 12364674, 1270774, +-7902203, -9142375, 1404991, 9928354, -6815040, 2328409, -14769856, 10174241, 10790032, -5390721, +-3025268, 2520609, 11815455, 8632884, -6054294, -5402532, 8093866, -9629317, 3387119, -13178033, +27917, -3849365, -17680770, -18233210, 3602941, 10622528, 4949950, -15553150, -8367670, 12021077, +-13181255, -5415417, 10674604, -2777770, 13331042, -4578972, -9199283, 3580392, -13406740, 15607374, +-1580548, 2843268, -7194607, -3592203, -559420, -14459544, -8818105, 1267552, -2289218, 1551020, +-4636954, -15349676, 2988224, -12691091, 5794985, -3123515, 9322227, -15316390, 7029251, 2739116, +-4297115, 11592654, -1357747, -7796977, -15055471, -1940788, 3426310, -12122545, 9127342, -8158827, +5956046, -15993921, -16364362, 7926899, 6332930, -6482717, -5091147, 5326297, 3653407, -3403762, +-2848100, -4337380, -5628555, -431107, -9099962, -880468, -1255204, 779537, 2612951, -1610076, +2640868, -1679869, -506806, -4873178, -2399813, -1259499, -586263, 7413651, -2117419, -940061, +4285841, -4489315, 3221762, 1915555, -1726577, -1022202, -4559645, -4175245, -145492, -2405182, +-2910914, 7178501, -6950331, 2396055, 8545911, 12598750, -3302830, 1407139, -4442070, -16798690, +-3562139, -3591130, 7332046, -14758044, -11811, -8513699, 9195525, -10325638, -14047764, 9367324, +4338454, 6091874, 19435264, -3201361, -5521181, 5468030, -12381317, -14496588, 1238561, 18554796, +5692979, 10412074, -7357279, -9122511, -14708116, 2937758, 18900004, -8460012, 9906342, 2249489, +14711337, -22437446, -7069516, -394063, 2694555, 12750684, 6222871, -17108466, -4563403, -7953206, +-610959, -19698868, -3024731, -7108171, 1430224, -10382547, -615254, 2374580, -28646894, 3260954, +-8928700, 1731409, -11289858, -653372, 7144678, 3572876, -3783866, -3677029, -15061913, 15188615, +14718853, 4785668, 3737695, -13183939, 20155744, 6945499, 10436771, -3994320, -31489090, 12266427, +-984084, 23649700, 22359600, 6974490, -2756295, 9758703, 624381, 8538932, 570694, 933619, +-5478768, 2622078, -4992900, -2782065, -1307818, 10276246, -28991, 568546, 2774549, -712428, +-5454609, -2928094, 1077500, 4130148, -1844152, 2025077, -3142842, 4298189, -3291556, -5331128, +-2543695, -826244, 2602213, 887448, -987306, -984621, -1010391, 6748468, -1340030, 322123, +1280437, 3328063, 27215060, 9607842, 18631568, -18045306, 4216048, 18997714, -5686537, -6822019, +2700998, -11718818, 8979703, 2289218, -13689671, -17930414, -1330903, 15242302, -376347, -1207960, +9978283, -14854144, -3772055, -12224551, 6894497, -20845624, 361314, -4442070, 7605850, -21772262, +-15038291, -9503152, 6403796, 7031935, 4871567, -7049652, 5312338, -5239860, 6477885, -4294968, +-1891933, -1481227, -6102612, 4165045, 9660455, 5761162, 9724880, -780073, -9401147, 1361505, +-9360881, 25001542, -6298033, -24554864, -7639673, 6736656, 21361556, -21344914, -8792872, -1372779, +13741211, 898722, -30218854, -3692598, 13969381, 28837484, 1083406, 20082194, 28919626, -2130841, +9320079, 13677323, -3764539, 24652576, -3294777, 29766270, 4752918, -8152385, -25782152, -16138876, +207769, 7779797, 3721589, -3905736, -4998268, -7995619, -10926934, -9702868, 11847667, 3482145, +-129386, -16940962, -1902134, 645319, -3082176, -9625022, 2531346, 5127654, -1447404, -4977867, +-3634079, -9429601, -5694053, -2757369, 5966247, -1145683, -5133560, 5178657, -7380902, 5337034, +5377299, -4610111, -8949101, 8210367, 12175159, 1884954, 382789, 762357, 7097434, -2091649, +-8464844, 1022202, 8223789, 6829535, -8405788, -7119982, 1318018, 1372779, 127238, 2457795, +-1310502, 11460583, 13868449, -23730768, -23086522, 6149857, -5368709, 760746, -9174050, 21599928, +-9664750, -6162741, 7518877, 5435281, 230854, -9828496, -7195681, -11967389, 4859756, -660351, +-5781563, -922344, 14365055, 21573620, -23269596, -1451699, -22699440, -2384781, -5850819, 22560926, +-9488656, -9053791, -4353486, 13744969, 4575214, 3819300, 5771363, 5522791, -4045859, 307627, +-2925410, 3698504, -2665027, 21124260, -5468567, 5635534, 14872398, -7693360, -17015586, 3831648, +5833640, -5954436, -6509023, -1384053, 3531537, 10737418, -14570140, 19605988, 28798830, 19372450, +-8048232, -11599096, -26612154, -34333432, -12620225, -86973, -6191732, -1697586, -3887482, 8265128, +-686121, -13231720, 6999723, -5833103, -1238561, 12663711, 21068962, -5102958, 5939940, -3652870, +1178969, 19208704, 9703942, 16436840, 16705275, -13277355, -4075924, -3000035, 499290, -250719, +5962489, 466541, 3664681, 16858820, 724776, 7909719, -3535832, -3626026, -6856379, -2048699, +1003949, 7718593, -2099165, -6300180, -2969970, 3754875, -2619930, -1353989, -1947231, 2403034, +632434, -2392834, -1308354, 1800665, 877247, 964757, 9716290, -3877819, 266825, 1350767, +167504, -5248987, 2472828, 3119220, 6215355, -12217571, 23172960, 10440529, 13198435, 19793894, +30566746, -11698954, 15834471, -31405338, -3834332, -14070313, -30856118, 12535936, 7353521, 9440875, +4169340, 12278238, 3775276, -22202296, 18762028, 33108830, -4911295, -5291400, 8138963, 3316252, +-6871411, -29460792, 2454574, 132070, -2643016, 425739, 10071698, -21056078, 4603131, 6013491, +-4298189, -12135430, -5890011, -13528610, 13840532, -30248918, -4351339, -19448148, 10852845, 4399121, +11005317, -3831648, 3025268, -7719667, 18566070, 5598490, 15248208, -13817447, 14988899, -319438, +-14598594, 30254824, -4971962, 3721589, 20459614, -19603842, 22928682, 13697188, -17900350, 7587060, +-6818798, 10075993, -24813636, 18183280, 2616172, 6399502, -2291365, 5898601, -20142322, 12866648, +22961432, -45521820, 4696010, 43935904, -28326920, -9093520, 3144990, 21422224, 15227270, 5293547, +13310104, -5976984, 8043937, -3320010, -9670656, 4817880, -2128156, -1622961, 8304856, 11994770, +-982474, -4649839, -3951907, 3556233, 7690676, -10133438, -3754875, -6932077, -4272419, -9060770, +9118752, 11989938, -2479807, 5524402, -3361886, 2248952, 7675107, 8616778, -9864466, 852014, +3721589, -5195837, 7932268, 415538, -106300, 7148973, 3702262, -8575439, -7130183, 2451353, +1198833, -2582349, 1517734, 18386754, -11215233, -13495324, -479963, -12923557, -5901822, -34055332, +-29070486, -4070019, -16698296, -20047296, -14463302, 8805220, -5180805, -10186589, -16292422, 14931991, +963146, -24616068, -3914326, -215822, -11722039, -3752728, 9921374, 7080254, -1765232, 9664, +428423, -6242198, 5200669, 11375221, -4330938, -2818572, 17558900, -33135136, -5416491, 9215389, +35210680, -14680735, -9172440, -13236552, -17912162, 7710540, 37369436, 6854231, 23139136, 4691715, +-3829500, -2047626, -2791729, -18138720, 3932580, 3988414, -14711874, 3159485, 29189672, -4835060, +-9028021, 4800700, -10506027, -2505040, 25750476, 37993280, 10266046, 22768158, 26418344, -9481677, +-11049877, 2909840, -8743480, 1399623, -26154204, -337692, -20381230, 6090264, 4245575, 12306692, +-21214990, -8034810, -7239168, -8420283, -6644852, -7548942, 11811160, 2433636, 15225659, -3979824, +5806259, 15107547, -2793339, 423054, -2203318, -6161131, -4854387, -945967, -3665218, -5675263, +-86973, 2184528, -2865817, 905164, 7122130, -7253126, -6476811, 367220, 5346161, 2643552, +-3409667, -10690174, -10261751, -1384053, 2433636, -6394133, -3471407, 2091649, -2103460, 983011, +779537, 7101729, 2457258, 1712081, -7885560, 8640400, -3651796, 27110370, 30617748, -12203613, +69198904, -9444096, 1641751, -12735652, 8199630, -5354214, 8093329, 17814988, 5090610, -16503949, +-8936216, -17246978, -229244, -11690901, -21378736, 2936147, 13967234, -2291365, 4105989, 6663105, +8214662, -63351, -6127308, -8016557, 4163971, 11274, -10630044, 4260071, 29779692, 21074330, +11999602, -25139518, 18156974, 14218489, -6591164, -7623030, -7656853, -10013179, -4285304, 8241506, +-18195092, 1818382, 2327336, 11025718, 28388660, 5548024, 5925981, 1618129, -3339874, -5655935, +12340515, -7371775, 28665148, 9285719, -2716030, 12615930, 2432025, -19202798, -13824426, 16352014, +18804978, 7056632, -4643397, 12560632, 13465796, 19206020, 37402184, 4102768, -10691247, -19108846, +-12781286, 9804337, 2158758, 3245922, -1729261, 13244069, 1443109, -1489817, -17387102, -8481487, +18205830, 20481088, -7210713, -13721884, -16478179, -4669167, 8917426, 5705864, 1682554, -5465883, +1487669, 125091, -7267622, 203474, -16111496, -4064113, -564788, 11742977, -2036351, -3364570, +141197, 9557913, -5579163, 6896107, -3446175, -7432441, 6630356, 9456981, 6044630, 6740415, +-783832, 7208566, 13413720, 5997922, 5766531, 4000225, -4862440, -2051384, 437013, -1008780, +4080756, -3578245, 6621229, 8645769, 5072357, 809064, -6356552, 2727841, 2414309, 7021198, +11217918, -10737955, 49445812, -7349226, 2102387, 5483600, -3728569, -684510, 12404939, -9190156, +-10865194, -5701569, 16008417, 14295262, -38200512, 7379291, 6563784, 15643345, -9745281, -15073188, +-14333380, 10945187, 9933722, -15400142, -8374650, -6315213, 25776246, 12955769, 7291244, -4974109, +-26574574, 7565048, 6782290, 13752485, -3221226, 7317014, -7306276, 2614025, -23056996, 9629854, +9563818, 355945, -5638755, -14500883, -28682866, 18685792, -12016245, 9615895, 9965398, 16510391, +2423435, -17526688, 29325500, 5734855, -28408524, -13225278, 17221208, 4079145, 22507240, 9473087, +3840775, -20329154, -9895605, 11368778, -35219804, 38115688, -27044872, 1552094, 23038742, -6135361, +45507324, 6803765, 8404714, -16412144, 52993992, 5514738, 34550864, -23315230, -10232760, -7332046, +13617731, -1414655, -5132486, 23966454, -19568408, 23115514, -27189828, 5928129, 3052648, 5028333, +-5043366, 20381230, -2168959, 10402948, 9433359, 13547401, 7978976, 3999152, 9765145, 10588168, +676457, 3916473, 1482301, -7093676, 9364102, 320512, 6541235, 12812424, 6727530, 863288, +-321049, 9822053, 10841571, 5306969, -5655398, 21442088, -637266, -4236985, -3839701, 13778255, +-10100152, 4813585, -1975148, 7423851, 792421, 3103114, 4382478, -2894808, -2018098, 2127620, +4427575, 3581466, 4617090, 5541582, -6131603, 17343614, 40761924, 13534516, 25595858, 32631014, +-1403917, 37420440, -28841242, -10326175, -10865194, -9532143, 3991635, 6116034, -2487323, -12730820, +-24819006, 23802708, 22434762, 9539659, 20257214, -33226940, -28815472, 9720585, 13707388, -15348603, +-21624624, 13812078, -6857989, -30959734, -11447698, -5876052, 15263777, -28458454, 15697569, 10735271, +12418898, -13292924, -874563, -13145284, -5871221, -37906844, -9333501, 18434536, -60224032, -19013284, +-2397666, -1303523, 1984812, -36131948, -9102109, -54437100, -4643397, 10815801, -15620259, -16996796, +-7161321, 16443282, -5649493, -19590956, -22517976, -56792352, -20389820, 26667452, -25283398, -38203196, +31911070, -9999221, -43147780, 13074417, 38723964, -20712480, -9558450, 4769025, -28352152, 35072704, +15388868, 22478248, -11876658, -2411087, 11356967, 33413234, 15373299, 5332739, -10844792, -2250026, +37660420, 3762391, 5717675, -2697240, -22484154, -9817758, 17577690, -304406, 922344, -3522410, +-20121922, -1416266, 8407935, -12256226, 14445586, -18951006, -12449500, 4030290, -6918656, 10014253, +3779034, -17223356, 6880538, 8834211, 4438849, 3438658, -7293928, 4288525, -434329, -4094715, +-12568148, 6267968, 4723927, -1276142, 8996346, -13481902, 1242856, -12894566, 49392, 3642132, +-4937602, -2078227, -979253, 5354214, 418759, 47595752, 65606164, -9679246, -1520955, -24999930, +-25162602, -43725988, 19250044, -7008313, 65527244, -13229036, -27649926, -38662220, 2746095, 12682502, +-14006962, 12775917, 42996380, -16363825, -7122130, -29214368, -13060996, 29255706, 33626372, -32937030, +-9030169, 17586818, -6782290, 8038568, -9550934, 42239928, 33913060, 71675488, 23630910, 31957778, +-13597866, 23045720, 48566416, 16084653, -2659659, 11688753, -1212791, 31845036, 16827682, 46229416, +13306882, -45714020, 16625818, 18287434, 38440496, -20827370, -17713518, 22501334, 24299852, -10919417, +38636452, -12903692, 16079284, -41548440, 26998702, -9371619, 14985678, 15454903, 33921116, 29543470, +-22709640, -23616952, -7361037, 35653596, 35930624, -12887586, -19331648, -37341520, -3917547, 27187680, +30626338, 20667920, -8454106, -24517820, -23310934, -3517041, 16843252, -15810311, 23331336, 6269042, +16401943, 3460133, -7821136, 18816788, 11847130, -2103460, -7388955, 6346351, 15801722, -21746494, +9357123, 11872900, 15397995, 8927090, 21628918, -6359773, 7823820, -9302899, -14316200, 9143985, +18240726, 16476031, 24380918, 463856, -49392, 7950522, 6659884, 43728672, 8489540, -1100585, +-18580028, 826781, 27710592, 14714558, 21438866, 13114146, -439160, 1119913, -4620848, 562104, +26593900, 22705882, 2400887, 8956617, -2604898, -3611531, 1012539, 11918534, 8495982, 8160975, +-5734855, -4853850, 6363531, 1636919, -15897285, -52763136, 3762928, 81046568, 48425220, -11223286, +-118620016, -16892106, -12009802, 9363029, -13470091, 2331094, 12406550, -4447976, 5369246, -25729538, +16510928, 19931870, 36696200, -26423712, -33491082, 34765612, 54913304, 13943074, -24392730, -32399622, +-6979322, 8275865, 3077344, 8790187, 208843, 12194486, 4867809, 35955856, -11449846, -49115100, +-21335250, 15945603, 5792301, -16909824, -21549998, 2983929, 23213762, 41351408, 37831684, -690416, +629213, 15643345, -14635101, -42359652, 12904229, -26373784, 51005956, 56084220, -1144072, 15940771, +7989713, 11304354, -24751896, -3409130, 53179212, -19883552, 473520, -72110888, -9622337, 8348880, +16698833, 15917149, 14942728, -17707614, -11274289, 32913946, 47877076, -8254927, -2097555, 4859756, +19259170, 23591718, -10897406, 8086887, -26103738, -30554398, 3120831, 8680129, 11366094, -3518652, +-4853313, -5583995, -6662568, 21282100, -162672, -3685082, -11108396, -616328, 12951474, 12050068, +-6350109, 16387985, 3643743, 24797530, 1972464, 4619774, 756451, -8329552, -7407745, -4021700, +-5776194, -1375463, -7457674, -4861366, 1807644, 20692616, 23000086, 7159174, 11908334, 4820564, +4107599, 20248086, -14483167, 15450608, 5357435, 25141664, -6761889, 6800007, 4460324, -9771051, +7753490, -4480188, 7911330, -2489471, 13583908, -4511863, -8684961, 7127498, 2840584, 3651259, +5258114, 3753265, 9573482, 2208687, 3465502, 2101313, 3238942, 3721052, 2735357, 6669011, +4394826, 1012002, 645856, 1705102, 5940477, 4809827, 4429185, 5477694, -6285685, -53438520, +-22168474, 42549168, 46921980, 44537736, 60453276, 10289131, -26148834, -80000208, -60723860, -11544335, +16848082, 50502372, 55006184, 25916906, 1159641, -26953604, -23276576, -10444824, 17138530, 47114180, +26793616, -6383932, 1670742, -4011500, -25999048, -35676144, -29110214, 5283347, 43481176, 32517198, +65407520, 42381664, 42112156, 59117004, -17303350, -41166724, -46642272, -62105764, -76261976, -28982976, +-9013526, 22431004, 41960756, 60401200, 56638272, 45806364, 29117194, 58001924, -11399917, -37063420, +-1733556, -9630927, 15408195, 17362942, 69524784, 60442000, -22573274, 10616085, -15806553, -46768436, +-13708462, 12054899, -27972586, 42913704, -17289928, 14060649, 3697967, -5240934, 37404332, 51622284, +41442140, 28819230, -21559126, -52861920, -59757492, 16726750, -25179246, 4257387, -2852932, 33392834, +5299453, 18740016, -16101296, -37175628, -34133716, -53997404, -46603616, 19435264, 11180337, 26633630, +40685688, 31258772, 1242319, -24336358, -38580080, -52765820, -28628104, -13780403, -19250044, 8237211, +-6980396, -6493454, -6185290, -16325171, 168577, -7490423, -10548977, -13060459, -8020852, -2130304, +8383776, -15719580, -9545565, 22308060, 2232846, -119464512, -125736776, -130787120, -134055592, -177140560, +-19223200, -50107236, -12120398, 16551193, 80706192, 91716880, 94836632, 132741872, 183504624, 175827904, +172805856, 138838576, 100291248, 72878080, 21925808, -83719112, -40156332, -49458696, -30610768, -100545184, +-16660178, -41609644, -45818712, -83195664, -63918776, -65040300, -58906012, -61546344, -108156400, -95783680, +-56499756, -51095080, -64177548, -88938576, -13483513, -77876880, -147614272, -126491616, -111038328, -58529668, +-75420160, -13453448, -152784864, -67647880, -67648960, -31255550, -22764400, -78668768, 3539590, -78816944, +-9468255, 12314208, 37006512, 3340411, 38034084, 56727928, 89203784, 95056216, 130791416, 85453744, +205208704, 129667208, 238850640, 162376064, 237952464, 275961856, 327714592, 269165056, 271026944, 305413504, +274085472, 278319776, 270913120, 234870288, 135953424, 108615968, 76703288, 55919400, 65488588, 97633736, +53890028, -19767050, -33867964, -39142184, -67223216, -87312928, -106416944, -98044440, -161110672, -156117232, +-160748816, -194795552, -171485152, -216383680, -191542656, -224826512, -230847520, -217517552, -239963584, -217045632, +-242307024, -192364608, -188419680, -156209568, -166662992, -171856144, -120736360, -108163384, -82571280, -42059004, +14302241, 46119896, 40519260, 51621748, 46302968, 52185464, 60047400, 85623392, 102984728, 93013960, +83799640, 102304512, 95332168, 117667608, 107268952, 78353624, 71478992, 62064424, 54842976, 34498788, +26384520, 24437290, 15589658, 16940962, 6990596, 11067594, 9880572, 6725382, 9915469, 7137162, +4484483, 1649804, -3459596, -496606, 87510, -10295573, -16087337, -9226127, -7261179, -6651831, +-4581657, -3251827, -2968896, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 17045114, -2260227, -5585605, 2661806, 3018288, 1051193, -7075959, 3245922, 5035849, -5403606, -1613834, --6622840, -1449552, -2807835, -2422362, -944356, 375810, -219043, 683437, 2396592, -2946885, -1333051, -6787122, 2350421, 4185446, 900333, -1778117, -5499169, 3610457, -2409477, 5833640, -4980552, -205622, -2302103, 4757750, 5547487, 4461934, 4514011, 1127966, -3442953, 1090922, -4270271, -1779190, -3598109, 3249680, 5146445, -2247879, 2691871, -5837935, -472983, -5120138, -3508452, -6817724, -1834488, -1264868, 2345589, 3409667, 2419677, -188442, -3609383, 449361, --4996658, -3297461, 924492, -613643, -3009162, 1655710, 1704028, 437013, 3167539, -2806224, -1367947, -3792456, -1499481, -1609539, 2101313, -1963337, -4013110, -1795833, -1490354, 5539971, -4764730, 1214402, -2517925, 335544, -286689, 974958, 1917703, 359704, 115427, 345208, --70867, 89657, -703838, 561567, -2110977, 108448, -154082, 882079, 464393, -644782, --919660, 201863, 389768, 413391, 9718437, -9793062, 372052, 173946, -2478733, -2938295, --3129958, 1015223, -5518496, -5443334, 770410, 2645700, -201327, 3135863, 2443837, -2991982, -1234803, -10740639, -2626909, -2399276, -2498597, -3384434, -3733937, -9465571, -7354058, 1012539, -2218351, -505732, 5128191, 4102768, 1727114, -1820529, -1018981, 4806069, -1851668, 599685, --696322, -5039071, 1691680, -1683627, -3432216, -1322313, 4128001, 9969693, -3795141, 1118839, -2429878, -1836099, 3142306, 1409286, -3476776, 2037425, -8228621, -3804804, 98247, 3375844, -5236102, -3198140, -1481227, -350040, -11927661, 2047089, 6176163, 341450, 902480, 3384434, --1935420, 5278515, 7112466, -890132, 2026151, 4279935, 4061429, 814970, 228707, -1972464, --2844342, -1771674, 1265405, -2704219, 5941014, 3997004, -126165, -2891050, -1479616, 3427921, -4026532, -2002529, 3126199, -1890323, 854699, -1927367, -1167694, -1318018, 380641, 99858, -236760, 275952, -215822, -634581, -2573222, -8390219, 1941325, 304406, -8115341, 1240172, -4545686, 6689412, 1717987, -4816269, 11340861, -1524713, -2234994, 5328981, -3295851, -3212099, -545461, -4144107, 5054640, 5050345, -2044941, -7633231, -3770981, 3794604, -4912906, 10786810, -9310952, -7445863, -9107478, 323196, 1703491, -8669391, -567473, 3578245, 2430415, -4245575, --2467996, 9944460, -1056025, 6844031, -679679, -2226941, -2312840, -5126044, 892279, -731218, -5367099, -4584341, 1242319, -1204202, 997506, -2701535, -354335, 4524748, 3599183, -5673115, -8834211, 726923, -39728, -143345, -809064, 2393908, -1217086, -7910793, -1122060, -4178466, -6889128, 2883534, 180389, 8459475, -4680441, 5658083, 5567352, 509491, -4116726, -843961, --875636, -91805, -1170916, -1708860, 2341294, 2477659, -3738769, 1791538, -220117, 2622078, -2318746, -768262, 363462, -1161789, -1756105, 1251446, -1615982, -1366873, 694174, 1772211, --1632088, -1219771, -2124398, -914291, 1279363, -813896, -308701, 23085, 649614, -1180579, --668404, 1634772, 544924, -351114, -514322, -1845762, -20218022, 4638028, 1080184, 14401562, --782758, 5785858, -7752416, 1665374, -5810554, -1392643, -2849711, -918049, 2641942, -1560147, -2466922, 4853313, 3703336, 13674102, 9433896, -6211060, 3131031, -335007, 2519535, 1612223, --1750736, -13589813, 3435974, -695785, -137439, 5156108, -814433, -3791919, -2641405, -643171, --4225174, -2269890, -10864120, -2549063, 280247, -3837017, -687195, 4499515, 6435472, -2084670, -7953743, -5956046, 1304060, 2717641, 1036161, -1848983, -4196720, 2962454, -1059783, 1823751, --3120294, -4432406, 819802, 2577517, -4479651, 4263829, -3063386, 10157061, 10772315, -3279745, -3928285, 4136591, -566399, -1400696, -1454383, -13171054, 5496485, 5348845, 155156, -2219424, --5507222, 574989, -1621887, -6713571, -15038828, 983011, -3733937, 3852049, -8053, -64961, --2518462, -1704028, -2837900, -286152, 1533840, -1966558, 2281702, -2420751, -1407676, -1025423, --608812, 1222992, 1013612, -820876, 464393, 331249, 816581, 1334124, 1028645, -711891, --1602560, 1122597, -681289, -1198833, 429497, 379031, -711354, 827855, 1352378, 454193, --4327180, -6606734, 6594923, 3757560, -574452, 7622493, -4086662, 6838125, -7700877, -7393250, -3600793, -11798275, -4178466, 2976949, 7184407, 9388262, -1637456, 7007776, -242129, 6674379, -2469069, 1085016, -1096827, 365609, 6661495, -3174518, -699543, 1211718, 579284, -6562710, --815507, -3560528, 13570486, -6486475, -6572374, -1596654, 6396817, 6435472, 5528160, 7393250, --1278290, 1357747, -1638530, -3670587, 2800319, -331786, -697932, -4197794, 10645076, 6562173, --3287261, 2027225, 3147674, -5614596, 1194538, 4135517, -1045288, 7981660, -3221226, -1037235, --8675834, -3275450, -7376070, 328028, 10180146, -4007205, 2876554, 1742146, 353798, -2779918, --940061, 88584, -2485176, 4884989, -5019743, -2370822, -443455, 10728828, 1702418, -67109, -3391951, -2924873, -8048769, 1993402, 813896, -1285806, 586263, 1974074, -529892, 403190, -3916473, 737124, -311922, 926639, 59593, -528818, -932545, 3628174, -175557, 299574, --3320010, 2010045, 515933, 2000918, -489626, -1372779, -407485, 1012539, 1647120, 1057636, --2705830, 125628, 1919314, -601832, -3413962, -2212982, -19057844, 13824426, 1457605, -7010461, --16831440, -1675037, 428960, -9957882, -897111, 4639102, 3954054, 365609, -2877628, 3672734, -12033425, 12206834, -5228049, -5737540, -13234942, 2646237, -2384781, 12858595, -5238250, -284005, --3015604, 4839892, -1440962, -13180181, 4330401, -618475, -7809325, 7516, 1235877, -1069984, --1328756, -5417565, -7540889, 4585415, 1137093, 5996848, -5209796, 10093710, 4793721, -2085207, --8939438, -1775969, 3236258, 9871445, 3066070, -5583458, -2542084, 4587025, 2966212, -2867965, --1395328, 4835060, 3965329, 5104032, 9787157, 10916733, 5340792, 5812165, 6717866, -3931506, -980863, -7227893, 7233799, 1138166, 3659312, -5163625, -8019778, 1833414, -10254234, -3699041, --4467303, 7532836, 7905424, 8265128, 2181844, -2344515, -2610266, 7720741, 1580011, -1081258, -1954210, -2434173, 4941897, 255014, -64425, 1619740, 2034741, -768799, 4052839, -3221, -694711, -1940788, -1157494, 1113470, 3164854, -194347, 1154273, 1826435, 1062468, 608275, --941135, 1509681, -1252520, -6855305, -406948, 12825309, 7885560, 10842645, 2063732, -11864847, --3910568, 12592844, -3631932, -7980049, -8311836, -8186208, -8658654, 4760435, 4839892, 3104725, -2846490, 2936684, 12118250, -1500017, 5260261, -10409390, -11709155, 7839926, -415538, -6394133, -459562, -16316044, -5325760, -5499169, 2005213, -577136, -1504849, -11480448, -7511361, 1269163, -7927436, 12874701, -5106716, -5057861, 6864432, -8849243, -632971, -457414, 2961917, 5629092, -4598836, 8921184, -4790499, 12936441, 6107981, -13993003, 6990060, -7781407, -9274445, -7723962, --11219528, 10149545, 2389076, -11969537, 1370632, 2515777, 1111860, 1886564, -2190433, 8414915, --4884989, 6466610, -10404558, 7884486, -5277978, -4820027, 1031329, 3493956, -403190, 5693516, -16340740, -1381369, -8759049, 5167383, 10710038, 845572, -1161252, -8498130, -3700651, 7876970, --1337882, -540629, 271657, 1583769, -2208687, -1277753, -192737, 2319282, -1345399, -287763, --1546188, 4439923, -3257196, 678605, -3061238, -3837553, 1011465, 1227287, -1195612, 590558, --1109175, -846645, -240518, -439160, -92342, -1628866, -956167, 4558034, -235149, 26307, -26589068, -23968064, 11085847, 11567421, -10772852, -1944010, 15906948, 5767604, 10102837, 3021510, --3499862, 23929948, -960999, -4476967, -25770, 81604, 11486353, 18001282, 6815040, -122943, -361851, 2703145, 6184753, -84826, 3281892, -12579959, 5956583, 9808632, -2056753, 4001836, -1074, 1823751, -8110509, -6326487, 456877, -276489, 11107322, 5488968, 4594542, -4676146, --5753109, -5744519, 6393596, 9295383, 78383, -2985539, 18149994, 9403831, 12128451, -6534256, --13542569, -2575907, -14181982, -9327595, -4272956, -5910412, -814970, 10619307, -3359201, 412854, --8684424, -9269076, 10577431, -530428, 4933844, 5285494, -5517959, 10166188, 2646237, 914828, --3531000, -6801618, 7977365, -2440615, -14125074, 8169565, 6900402, 8542153, 3850975, -9947681, --2086280, 930934, -10388989, 5940477, 5959267, -969052, 4500052, 3764539, 4022237, -972273, -6357089, 948114, -250719, -3221762, 1579474, -62814, 5064304, 1093069, -141197, 1036698, --48855, 3725884, -1585380, -459025, -2468533, 1265405, -658204, -1933809, 420907, 520765, --734976, 576063, 4102768, 3097208, -1773822, -1156957, -2646774, 688269, -570157, -355409, --18583786, 2284386, 6135361, -9127879, 7612830, -15771657, 3602941, 4810900, -2075543, -6245420, --8014946, -9344775, -15823733, 2021856, 17996450, -5918465, 8680666, 4828080, 13383655, 7112466, --5056787, -11488501, 5922223, -2896956, -4085051, -11905112, -1779190, -1593970, -4750771, -5093831, --2738042, -8361765, -10994043, 12833899, -1258425, -7432978, 10064719, 3563212, -8778376, 1333051, --644245, 5739687, -11664594, 3303367, 4010426, -17210470, 5755256, 5645735, -8870718, 2571612, -672162, -2764885, 6366216, 614180, -1200980, 787590, 4312684, 11650099, 9250823, 11888469, -8192113, 4255776, -3070365, 17683990, -4488241, -9014599, 19581292, 1333587, 11834246, 2573222, --3795141, -18149458, -16800838, -4148402, 1063004, -6613713, -3216931, -5187247, 11553462, -10091026, --2946885, -1692754, 2820720, -9848897, 7128035, -757525, 2254321, -825171, -3830037, -6400575, --4311074, -5035849, -4099010, -1195075, 654983, -3087545, -2208150, -1712618, 4225711, -4890357, --4323422, -3510062, -4162897, -152471, 3390877, -1480153, -1659468, 2448131, 595927, -1206886, -1658931, -3052111, -3375844, 2610266, -3936875, -6323266, 2232846, 5706938, -3020436, 636729, -3819300, -1283658, -3139084, -30940944, 15134391, 26657252, 1851668, -15128485, 6893960, -2794413, --1060320, 4370129, 2574296, 6862284, -8075076, 932008, 23882166, 18354006, 16044387, -17520782, --751082, 4305168, 9158481, -8406862, -9425843, -2399276, 3013457, 8303246, 4117263, -22531936, --25583510, 7957501, -855235, 14412837, 14763413, -9531069, 12217571, 9842991, 13050795, -889058, --7792682, -8101382, 6234145, -8579734, -3297461, -2684, -374736, 7813620, 16596827, 9337796, --4549981, -3917010, -8225399, -2094870, 728534, 4494147, -1773822, -2924336, 8158291, 5140539, --12541305, -166430, 518080, 15074261, -7587060, -8652212, -16438450, -5577552, 2814277, 1102733, -8490077, -1829656, 2124398, -7349763, -10922639, -9904195, -10008348, -5756330, 4776541, -20623360, -2463164, -2887829, -3236795, -4359929, 4079682, 11298448, 8229158, 1309428, -1849520, -10476499, --3342558, -964757, -2131378, 6922951, 3533148, 2114198, 1523640, 3599720, 4199941, -1604170, --1756642, 107374, -1902671, 367220, 462783, 1383516, 2308545, -6700149, 1034550, -865973, -5084168, 1381369, -6740951, -375273, -4268124, -3269544, -1683090, -1504849, -1791001, -850404, -3810710, 3490735, 2943126, 5042292, 15592342, 1273995, 13530221, -1851668, 17562658, 8761733, -13695040, 8418136, 3990025, -6782290, -686121, -4245039, 9386651, 2764885, 8243653, -7871065, --1376537, 14564234, -17952964, -10034654, 13993540, -23680840, -10440529, 1766305, -4520453, -11725261, -23849416, -4262218, 16474421, 6609955, -14352170, -2195802, -5397700, -17352742, -22541062, 18005040, --163746, -6558952, 4453881, 328028, -2992519, 6557342, 2573222, -2324114, -8291971, 1592359, -17009144, 14421426, -11894912, 4720706, 934155, 13454522, -6124624, 9119289, -19339164, -4680441, -13204877, 4437238, -4426501, 15759309, -5012764, 11048803, -21470004, -24755654, -8925479, 485868, --17538498, 18953690, 13375065, 19254876, -8827232, -6496138, -6676527, 1002875, -9764071, -99858, --14923401, -13545253, 620623, 3821984, 13827110, 6540699, -1455994, -5094368, 4351876, 7987566, -5234492, 3196530, -4915590, 5776731, 5157182, 6510097, 4819490, 3528316, 5216238, -7155953, -6038724, -4327180, -2196876, 9469866, 8368744, 5631239, -995359, 341987, -2527052, 4858682, -1523640, -1987496, 2637110, 4929012, 744640, 3832722, 3722663, -4927938, 1637993, -3723737, --1089311, 1172526, 21589726, 15525770, 24328306, -21605832, -16239808, -37012416, 15947750, -4121021, --31628676, -6134824, 3000572, 4658429, -11818676, 12875238, 10877542, 1221381, -143345, 2010045, --5240934, -11013370, 2427194, -6263673, -10307385, -135291, 23977728, 744103, -3639985, -19174882, -8088497, 15141370, -7834557, -23135916, -4197794, 7798050, 2765422, -4911295, 5041218, 1647657, -8321499, -2339684, 13725105, 20976084, 7934952, -13947906, 15808164, 7117835, -17865454, -19011672, -20664698, 9994389, -8048232, -9277129, -459562, -16851304, 12334609, 16250546, -387621, 915902, -4091493, -2081449, 17784386, 5979668, 4622996, -7374996, 2873333, 6005438, 21961778, -5272609, -8414915, -17016124, -19383188, 17282948, -2608656, -1616518, 1784559, 16473884, 360240, -775778, -10395431, -4975720, 2071248, 9540733, 11643656, -5570036, -7256884, -15631533, -7714298, 5105106, --6909529, 5440113, -177167, 5772973, -3131031, 4257387, 878858, -2408940, 1872606, 8738648, -2149631, 8698919, 2618320, -5508296, 347355, 3628711, 3004330, -5405753, -4961224, -5266167, --2268280, -4138201, -4056060, -6431177, -2778844, 3577171, 2263985, -658741, -1059246, 1953673, --4284767, -108448, 5484673, -1554778, -907849, -2652142, -2248952, -1160715, -8168491, -1151051, --3182034, -3502546, -5104032, -7267622, -25049324, -2065342, -16390132, -33248416, -34266860, -14812268, --26163868, -11862700, -4227322, 4699231, 14631880, 16324097, 1671279, -8833137, 17581986, -8939974, -8665633, -32826436, -3229816, -22519588, -15115064, 15252503, 10707890, 10419054, 3463891, 21964462, --2221572, -1374926, -15822660, -5485210, -3187940, -10769094, -10877005, -26975078, -10609106, -2979097, --4351339, -16689706, 14756971, 5877126, 8804146, -7348152, -2831457, -40935332, -11800960, -11283416, -9477382, 20979304, -12927852, -1982664, -23851564, -1722282, 12271795, -3908957, -8056822, 5365488, -17601312, 30039002, 6311992, 952409, -1663226, -8058970, -12026982, 8032663, -7925826, 27247810, -5356361, 11731703, 55566140, -11059541, -9460202, -14038637, -19479824, -2643016, 18981608, 8544837, -2712809, 6316823, -8029978, -6225018, -16954920, -4059818, 9530532, -1556926, -3750043, -1591822, --3954054, 1997697, -625992, 3695819, 3744675, 3820910, 5013838, 5490579, 14153528, 8641474, --5246840, 8238821, -220117, 526134, 5920613, -6847789, 128849, -7900593, -4779225, -10814191, --8033737, -11279121, -9361955, -6271189, 12367895, -7697119, -4345433, -9079024, 566399, 2698313, --1964948, 3728569, 1499481, -228707, -7672959, -27808840, 15775415, 26007638, -15397995, 775242, -5826123, -9003862, -2177549, -19459960, -416075, -10924786, 28234042, -26844, -5347235, 22655952, --5782100, 6568079, -26042534, 13472239, 4001299, 17561048, -8236137, 13069049, 23095112, 24812026, -13914083, 22363358, 11445014, -3597572, 21735756, -10570988, -14361834, -4628364, 8706972, 14721537, --35458176, -2457795, -22935126, 18132278, 8194798, -492311, 6220187, 25407952, 1056562, 22670984, -9666898, 34354368, 3060164, -3959960, 15030775, 4936528, -17572858, 3728569, -2080375, -23570780, -16474958, -14233522, -23000624, -47004660, 3610457, -5831492, 27585502, -15426986, 36927592, 12159052, --656593, -5693516, 14379551, 15164456, -27078696, -11588896, -20021526, 6927782, -9056475, 20266876, -6420976, 6792491, 9774809, -4710506, 1702955, -7142531, -2509872, 539018, -2715493, -20922396, -8213588, -66035, 6150930, 176094, -6192269, 644782, 8501351, -13926431, 11945378, -5118528, --75699, 1339493, -11712376, -1018981, 7016903, 3550327, -8424578, -3486977, -2066416, -9855876, -3265786, -2821257, 14296336, -11511586, 5069672, 9976135, 3546032, -4254165, -3182034, 4846334, -2346663, 3003793, -2578054, 5025649, -15369004, 4094715, 3644280, 6580964, -4689031, -7176354, -511638, 6441914, 861678, 17859010, -11941083, -13361643, -13145284, 17173964, 8909910, 22363358, -6208375, 69186552, -20547660, 372052, 520765, 32205276, 13335873, 14911590, -21125870, 9278203, --8329552, 598074, -9771587, 2150705, 23277112, -6125160, 7383586, 44978508, 14120779, -20371566, --23852100, 2774549, 29334626, 15298137, 5576478, -11349988, 24973088, 4239670, -3703336, -27440546, -8391292, -4359929, 11828340, -24910274, -15202574, 1298691, -6334540, 3278671, -23226110, -801011, --14166413, 6582575, 20598126, 16464220, 5391258, -31871342, 271657, 3151432, -28718298, -25651156, --16996796, -14024142, -13998372, 22733798, 5196374, -650151, 14826227, 23638426, 6310918, 20472498, -558346, 13554380, 90393496, -20623896, 14898168, 10377178, -15879031, 3365107, -60224568, 1214402, -29912300, 7829726, -16565689, 23028540, 5555540, 8761733, -15023259, -3409667, -12833899, 4514011, -1124745, 1146756, 5164162, -18660022, 6915971, -10234370, -7439957, -25549150, 6350109, 5874442, -5101885, 6585796, 31991600, 4836133, 3430605, 3679176, 2511482, 19124952, 2255395, 8080981, -6696391, 14592688, 5872831, -867047, -3222299, -2644089, 2429341, 9259413, 11050951, 3277597, --16782048, -7702487, -3713536, -3710315, -5543192, -17524004, -4256850, 13467944, 36599564, -17013440, --865973, -24550570, -17829482, 5816997, 16043850, -20310364, 24260660, 10175851, -31825708, 19589882, --12880607, -15761456, -1307281, -19062676, 4497905, -8528731, 24622510, -14171781, -1109175, 13558675, --47501264, 6817724, 14761803, -14327474, 11716671, -28698434, 28716688, 3150896, 4960151, -54316304, -49052820, 21041582, 16120623, 1094143, -30962420, 28414966, -1795296, -14057965, 50164144, -9971303, --22001506, -11586211, 6075768, 14526653, 13759465, 3673808, -8434242, -59027884, -6648610, 14785962, -882616, 21693880, -30971546, 32003412, 3270081, 10831908, -31479962, -9089761, 5093831, 40787156, --16934520, 9543417, -29163364, 25831544, 14492830, 24378234, -9371082, 10811506, 4234301, -31884764, --30440580, 16770237, 13716515, 26003342, 5594195, 33367600, -50232328, -65747896, 10528575, -13861470, -37187976, -24230058, -5222680, 4297115, -27974196, 1398549, -16688095, 14576045, 20684562, 2076080, -16789028, 18452254, 5509906, -16644609, -8378408, 29677150, 15473157, 3861713, 5224828, -8886824, -747861, 18073222, 10165114, -14612016, -8225936, 16816944, -2335389, 10482941, 10572062, -6453725, --8538395, -8662949, 121333, 8978629, 4112431, 11483132, 16503412, 1361505, -463856, 13431436, -890669, 2709588, 4306779, -5603322, 4661114, -9807021, 5657009, 2026151, 295279, 4126390, --4891968, -45965276, 41857140, -9073655, -10152766, -16379395, -4811974, -36250596, -67662376, 23325430, -19382114, -3008088, -13977434, -27577986, -4585952, -8570607, -14685030, 26623966, -60512868, -25867514, --31961536, -9543954, -46081776, -4265440, -6968048, -1671279, -7743826, -9358197, 7391102, -474057, --20408610, -6400575, -487479, -27907086, -14924474, -8243116, 2012192, 21457656, -11038603, 43023224, --22504554, -3233574, 18079664, -19202798, 11655467, 2440078, -29512868, -44139380, -10830834, 11265699, -40240084, 17454210, -30842160, -13048111, -88525720, -29626148, -6391448, 18622442, 48063904, -2548526, --51496656, 2863133, 27963996, -10289131, -2437394, 29654602, 31205622, 71602472, -79115984, -15336791, -11212549, 20024748, -24972014, -29644402, -42304892, -41997800, -23496692, -19524384, -5500780, -3002182, --48875656, -20253456, -17913234, 18097918, -9224516, -4813048, 44024488, 33347736, 2676838, -6283537, --2017024, -27189290, -1207960, 9692667, -19645180, -10521059, 3726421, 12426951, -8326331, -9623948, --6512244, 13866839, -9170829, 14531485, 1041530, 15007689, 10663330, 10819023, -8260833, 5479842, --20591684, 10634339, -2705293, 6273337, -18205830, -14093935, -2039036, 4714801, -10248329, 278099, --23076860, -4035659, -2764885, 9894531, 12228309, -14678051, 30142080, 642098, 11189464, 6722698, -21840446, 21905406, -1055488, 13941464, -26118232, 6114423, -10652593, -62904092, 14060112, -10879689, -18409840, -17497696, -17999134, 1177895, -26393648, 4315906, -26610544, -696858, -4748623, -10545218, -12602508, -19929186, -25901338, -23702314, -30391188, -5243618, -3438121, 33362770, 7295002, -24664386, --36511516, 4587562, -893890, 8469139, -7211250, 20133196, -24048058, -9709310, -33721936, -21711596, --9780714, 907312, -14304389, 34797288, -12351789, -30135638, 9179956, 36121212, 26254598, 10549513, --25808458, -16953846, -2731599, 32774896, 63065688, -795643, 12327630, -12333535, -61920008, -13796509, -5516886, 23099408, 52655764, -29432874, -35872640, 20775294, 9867150, -12636331, 1578401, -19871740, -12054363, -52468932, -6102612, 2782602, 12607876, -31718334, 36265632, -51318416, -58244588, -53910428, -27036820, -11228655, 51117092, -71570264, -31161062, 5528160, 72803992, -6050535, -13033615, -40285720, --14736570, -4875325, 35089344, -3168075, -203474, 1916629, 6060736, 516470, -563178, -15352897, --12967580, 16591996, 7368554, 1861868, -38190848, 9397925, -9840307, -4680441, -19777788, 726386, --1789928, -3772055, -44921600, 3993783, -9947681, -5298916, -3898220, 7459285, -156229, 2625836, --308164, 118648, -143881, 57982, -16378321, -3319473, -10536629, -9189619, 7823283, 7997766, --13133473, 361851, -9353902, 12093017, -4516695, 37345816, 11457899, -66524748, -11754252, -45882600, -20562692, 3889630, -91495152, 6295349, -28106266, -59261960, -46082852, -67636608, 41965052, -20599736, --53208740, -23896124, 17389248, -31704374, -27335320, -21332028, -12619688, -23522462, -23338852, -43174084, --31194884, -59251220, -33368674, -30104500, -9862856, -27861990, -5614059, -12984223, -676994, 2369211, -8032663, 16743393, -16227997, 13951664, 1830193, 30594126, 13427142, 19165218, 19365470, -55489904, --14463302, 44837312, -7498476, -27509266, -31032750, -22939958, 18069464, 72281080, -4606353, -892816, --48185240, -49149996, -10233833, 10388989, 43290048, -2755759, 39475044, 14766634, -47327320, 85985784, -1830730, 66966056, 357019, -16802986, 36027796, -47805672, -61877056, -39533028, -137296144, -83176336, --27164058, 63257352, 38845296, -54899344, -36097588, -84030496, 42000484, 56057912, -42880416, -42805256, -10095321, 37150392, 52669720, 15010374, 30285962, -27676232, -15216532, -20771536, -31878322, -12790413, --2736431, 3463891, 1471563, -17111150, 2892661, 12356621, 4059818, -2326799, -12552042, -8136816, --14327474, -4912369, -21245592, -4086662, 13310104, -20285668, -33665028, -4420595, -22049288, -14561550, --2485712, -27980638, -21925808, -5163088, 13782013, 14776298, 15883863, 322659, -12066174, -1352378, -5224291, -6565932, 21299816, 1780801, 15731391, 1731409, 69793, 16452946, 12228309, 18410914, -38111392, 24876988, 28465970, 24698210, -23368918, -56748868, 65997004, 63108100, -39907224, -51781200, --240518, 56625924, -6137509, -3287798, -17640504, 49516140, -5487895, -13216151, -1203128, 13674639, -25426744, 680215, -19085760, -21729314, 30558692, 2267206, -13124883, -32678258, 18586470, 10249939, --3707631, -25757992, 8107825, 11078868, 9207873, -16294032, -9765682, 2873333, 25218974, -7420093, -9066139, -37089192, -10307385, 53687, 24436216, -51628192, -9208410, 5015448, 37171868, -17866528, -5777268, -26385594, 3612068, 10911364, -18126910, -13841069, -2133525, 6026376, 11349988, -11777337, -814433, -46018964, 24916716, -7704635, 43119860, -26738856, 19248970, -18204218, 20012936, 3721052, -13429289, 11349451, -33462628, 37852620, 7508140, 21829708, -36934036, 10251550, -9378061, 5853504, --10512469, 1445257, -2536178, 5015448, 12577812, -1996086, -14749455, -8812199, 3800509, -2018098, -952409, -5782637, -14367202, 4795331, 3848828, -4496294, -4049617, -301185, -4488241, 643171, --7803956, -285078, -3800509, 6431714, 3799972, -2718714, -5787469, 1974611, 181999, -5145908, -3756486, -15827491, -121333, -1889786, 7054484, -303869, 18214956, -12114492, -12257837, -4220879, -9625559, -13114683, 19536732, -16440061, 8298951, -8081518, 17810692, -15962783, 19593640, -11164231, -15322296, -13869523, 23807004, -22436910, 17243756, -5196374, 12979928, -12099460, 12754442, -13692893, -14385456, -13771813, 11541114, -9204652, 12751758, -9868761, 10635950, -9786083, 3100967, -3188476, -6408628, -4757750, 5177583, -4076998, 4045859, -2652142, 5296769, -19353122, -43012488, -57189100, -41679972, 27649388, -32624572, -46478524, -22788560, 21502216, 11264625, 28607704, 30787400, 6025839, --15557445, -4538707, 10755672, -10604811, -891206, 6365142, 1723356, 17238924, 12031814, 5222144, --15548318, -581431, -9638980, 10001905, -16290274, -14095009, 11782169, -3758633, -6648610, -6505802, --11335492, -15503758, 1156420, 12658342, 11522860, 9684078, -3710315, -12783433, -11133629, -7766375, -13776108, 18778134, -8783745, -13127031, -5709086, 15582678, 8018167, 20847234, -14767708, -5606006, -8206072, -3930432, 656056, -2234994, 7369090, 4436165, 5946919, 1254131, -14133127, 5837398, -2594160, -522912, 10894721, -5674726, -2818572, 1884954, -2040646, 1399623, -4110821, 18504866, -4627291, -1498407, 17608292, 17660368, -17973902, -27180164, -9982578, -18616536, 536334, 12310987, -3498788, -11135776, -13450764, -3584687, -2610266, 10698227, 5090073, 6667400, 10006200, 6116571, --5608691, 6193343, 4377646, -13084081, -17548700, 5249524, -4639102, 8722005, 6388764, -9618042, --2585570, -3268470, -3538516, -11176042, -6143951, -696858, 3518652, 5334887, 14849313, -7401303, --5548024, 3805878, -3462818, 19608136, -47631188, -125398016, -46098956, 22492744, 65234648, 137780944, -92198456, 23731304, 34942244, -18410914, -56084220, -93134752, -81039592, -64423972, -18583786, 2482491, -44819596, 49421116, 105191800, 51074676, 33668784, -2637110, -22430466, -50629612, -26300232, -40938556, --47225848, -29067264, -24348170, -1809792, 13145821, 39364448, 24320790, 28258200, 25669946, 25964688, -39031052, 3377992, 27039504, -5008469, -12156905, -32939178, -19644106, -49126908, -72341744, -63189708, -732829, -10739566, 19822348, 33990372, 18620294, 52427056, 45756436, 66259536, 37698000, 44940928, -2210298, 2221572, -35442072, -57870388, -67656472, -81190992, -53390200, -66349728, -5597953, -250182, -31928250, 33521146, 80197776, 63027036, 89585504, 36383204, 41872708, 17485886, -396748, -53451404, --87235080, -58386324, -69696584, -43393128, -47201152, -4392141, 7275675, 27861990, 36508832, 49514532, -50501300, 48601312, 31788126, 34808024, 9033927, -6285685, -11977590, -39158292, -35747548, -46886012, --33174864, -46868832, -35757212, -3709241, 8346195, 24740086, 37287832, 33309082, 34276524, 56542172, -20436528, 34531536, 26462368, -35618164, -64539936, -27949500, -56913148, -35844724, -19550154, -4046933, -5035313, 18134962, 32790464, 22864258, 35276712, 22429930, 19188304, 7769596, -2204392, -20501490, --6782290, -9608916, -36036388, -33621540, -9318468, -3789772, 1864553, 11841225, 13784161, 17557826, -13964012, 13880797, 5147519, 4683662, -265214, -7879118, -3991635, -2893734, -8113730, -12856985, --4488778, -6484864, -7667054, -1001801, 3180423, 3663070, 5330055, 5941014, 5523328, 2313914, -1056562, 714038, 734976, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +2260227, -5585605, 2661806, 3018288, 1051193, -7075959, 3245922, 5035849, -5403606, -1613834, +-6622840, -1449552, -2807835, -2422362, -944356, 375810, -219043, 683437, 2396592, -2946885, +1333051, -6787122, 2350421, 4185446, 900333, -1778117, -5499169, 3610457, -2409477, 5833640, +4980552, -205622, -2302103, 4757750, 5547487, 4461934, 4514011, 1127966, -3442953, 1090922, +4270271, -1779190, -3598109, 3249680, 5146445, -2247879, 2691871, -5837935, -472983, -5120138, +3508452, -6817724, -1834488, -1264868, 2345589, 3409667, 2419677, -188442, -3609383, 449361, +-4996658, -3297461, 924492, -613643, -3009162, 1655710, 1704028, 437013, 3167539, -2806224, +1367947, -3792456, -1499481, -1609539, 2101313, -1963337, -4013110, -1795833, -1490354, 5539971, +4764730, 1214402, -2517925, 335544, -286689, 974958, 1917703, 359704, 115427, 345208, +-70867, 89657, -703838, 561567, -2110977, 108448, -154082, 882079, 464393, -644782, +-919660, 201863, 389768, 413391, 9718437, -9793062, 372052, 173946, -2478733, -2938295, +-3129958, 1015223, -5518496, -5443334, 770410, 2645700, -201327, 3135863, 2443837, -2991982, +1234803, -10740639, -2626909, -2399276, -2498597, -3384434, -3733937, -9465571, -7354058, 1012539, +2218351, -505732, 5128191, 4102768, 1727114, -1820529, -1018981, 4806069, -1851668, 599685, +-696322, -5039071, 1691680, -1683627, -3432216, -1322313, 4128001, 9969693, -3795141, 1118839, +2429878, -1836099, 3142306, 1409286, -3476776, 2037425, -8228621, -3804804, 98247, 3375844, +5236102, -3198140, -1481227, -350040, -11927661, 2047089, 6176163, 341450, 902480, 3384434, +-1935420, 5278515, 7112466, -890132, 2026151, 4279935, 4061429, 814970, 228707, -1972464, +-2844342, -1771674, 1265405, -2704219, 5941014, 3997004, -126165, -2891050, -1479616, 3427921, +4026532, -2002529, 3126199, -1890323, 854699, -1927367, -1167694, -1318018, 380641, 99858, +236760, 275952, -215822, -634581, -2573222, -8390219, 1941325, 304406, -8115341, 1240172, +4545686, 6689412, 1717987, -4816269, 11340861, -1524713, -2234994, 5328981, -3295851, -3212099, +545461, -4144107, 5054640, 5050345, -2044941, -7633231, -3770981, 3794604, -4912906, 10786810, +9310952, -7445863, -9107478, 323196, 1703491, -8669391, -567473, 3578245, 2430415, -4245575, +-2467996, 9944460, -1056025, 6844031, -679679, -2226941, -2312840, -5126044, 892279, -731218, +5367099, -4584341, 1242319, -1204202, 997506, -2701535, -354335, 4524748, 3599183, -5673115, +8834211, 726923, -39728, -143345, -809064, 2393908, -1217086, -7910793, -1122060, -4178466, +6889128, 2883534, 180389, 8459475, -4680441, 5658083, 5567352, 509491, -4116726, -843961, +-875636, -91805, -1170916, -1708860, 2341294, 2477659, -3738769, 1791538, -220117, 2622078, +2318746, -768262, 363462, -1161789, -1756105, 1251446, -1615982, -1366873, 694174, 1772211, +-1632088, -1219771, -2124398, -914291, 1279363, -813896, -308701, 23085, 649614, -1180579, +-668404, 1634772, 544924, -351114, -514322, -1845762, -20218022, 4638028, 1080184, 14401562, +-782758, 5785858, -7752416, 1665374, -5810554, -1392643, -2849711, -918049, 2641942, -1560147, +2466922, 4853313, 3703336, 13674102, 9433896, -6211060, 3131031, -335007, 2519535, 1612223, +-1750736, -13589813, 3435974, -695785, -137439, 5156108, -814433, -3791919, -2641405, -643171, +-4225174, -2269890, -10864120, -2549063, 280247, -3837017, -687195, 4499515, 6435472, -2084670, +7953743, -5956046, 1304060, 2717641, 1036161, -1848983, -4196720, 2962454, -1059783, 1823751, +-3120294, -4432406, 819802, 2577517, -4479651, 4263829, -3063386, 10157061, 10772315, -3279745, +3928285, 4136591, -566399, -1400696, -1454383, -13171054, 5496485, 5348845, 155156, -2219424, +-5507222, 574989, -1621887, -6713571, -15038828, 983011, -3733937, 3852049, -8053, -64961, +-2518462, -1704028, -2837900, -286152, 1533840, -1966558, 2281702, -2420751, -1407676, -1025423, +-608812, 1222992, 1013612, -820876, 464393, 331249, 816581, 1334124, 1028645, -711891, +-1602560, 1122597, -681289, -1198833, 429497, 379031, -711354, 827855, 1352378, 454193, +-4327180, -6606734, 6594923, 3757560, -574452, 7622493, -4086662, 6838125, -7700877, -7393250, +3600793, -11798275, -4178466, 2976949, 7184407, 9388262, -1637456, 7007776, -242129, 6674379, +2469069, 1085016, -1096827, 365609, 6661495, -3174518, -699543, 1211718, 579284, -6562710, +-815507, -3560528, 13570486, -6486475, -6572374, -1596654, 6396817, 6435472, 5528160, 7393250, +-1278290, 1357747, -1638530, -3670587, 2800319, -331786, -697932, -4197794, 10645076, 6562173, +-3287261, 2027225, 3147674, -5614596, 1194538, 4135517, -1045288, 7981660, -3221226, -1037235, +-8675834, -3275450, -7376070, 328028, 10180146, -4007205, 2876554, 1742146, 353798, -2779918, +-940061, 88584, -2485176, 4884989, -5019743, -2370822, -443455, 10728828, 1702418, -67109, +3391951, -2924873, -8048769, 1993402, 813896, -1285806, 586263, 1974074, -529892, 403190, +3916473, 737124, -311922, 926639, 59593, -528818, -932545, 3628174, -175557, 299574, +-3320010, 2010045, 515933, 2000918, -489626, -1372779, -407485, 1012539, 1647120, 1057636, +-2705830, 125628, 1919314, -601832, -3413962, -2212982, -19057844, 13824426, 1457605, -7010461, +-16831440, -1675037, 428960, -9957882, -897111, 4639102, 3954054, 365609, -2877628, 3672734, +12033425, 12206834, -5228049, -5737540, -13234942, 2646237, -2384781, 12858595, -5238250, -284005, +-3015604, 4839892, -1440962, -13180181, 4330401, -618475, -7809325, 7516, 1235877, -1069984, +-1328756, -5417565, -7540889, 4585415, 1137093, 5996848, -5209796, 10093710, 4793721, -2085207, +-8939438, -1775969, 3236258, 9871445, 3066070, -5583458, -2542084, 4587025, 2966212, -2867965, +-1395328, 4835060, 3965329, 5104032, 9787157, 10916733, 5340792, 5812165, 6717866, -3931506, +980863, -7227893, 7233799, 1138166, 3659312, -5163625, -8019778, 1833414, -10254234, -3699041, +-4467303, 7532836, 7905424, 8265128, 2181844, -2344515, -2610266, 7720741, 1580011, -1081258, +1954210, -2434173, 4941897, 255014, -64425, 1619740, 2034741, -768799, 4052839, -3221, +694711, -1940788, -1157494, 1113470, 3164854, -194347, 1154273, 1826435, 1062468, 608275, +-941135, 1509681, -1252520, -6855305, -406948, 12825309, 7885560, 10842645, 2063732, -11864847, +-3910568, 12592844, -3631932, -7980049, -8311836, -8186208, -8658654, 4760435, 4839892, 3104725, +2846490, 2936684, 12118250, -1500017, 5260261, -10409390, -11709155, 7839926, -415538, -6394133, +459562, -16316044, -5325760, -5499169, 2005213, -577136, -1504849, -11480448, -7511361, 1269163, +7927436, 12874701, -5106716, -5057861, 6864432, -8849243, -632971, -457414, 2961917, 5629092, +4598836, 8921184, -4790499, 12936441, 6107981, -13993003, 6990060, -7781407, -9274445, -7723962, +-11219528, 10149545, 2389076, -11969537, 1370632, 2515777, 1111860, 1886564, -2190433, 8414915, +-4884989, 6466610, -10404558, 7884486, -5277978, -4820027, 1031329, 3493956, -403190, 5693516, +16340740, -1381369, -8759049, 5167383, 10710038, 845572, -1161252, -8498130, -3700651, 7876970, +-1337882, -540629, 271657, 1583769, -2208687, -1277753, -192737, 2319282, -1345399, -287763, +-1546188, 4439923, -3257196, 678605, -3061238, -3837553, 1011465, 1227287, -1195612, 590558, +-1109175, -846645, -240518, -439160, -92342, -1628866, -956167, 4558034, -235149, 26307, +26589068, -23968064, 11085847, 11567421, -10772852, -1944010, 15906948, 5767604, 10102837, 3021510, +-3499862, 23929948, -960999, -4476967, -25770, 81604, 11486353, 18001282, 6815040, -122943, +361851, 2703145, 6184753, -84826, 3281892, -12579959, 5956583, 9808632, -2056753, 4001836, +1074, 1823751, -8110509, -6326487, 456877, -276489, 11107322, 5488968, 4594542, -4676146, +-5753109, -5744519, 6393596, 9295383, 78383, -2985539, 18149994, 9403831, 12128451, -6534256, +-13542569, -2575907, -14181982, -9327595, -4272956, -5910412, -814970, 10619307, -3359201, 412854, +-8684424, -9269076, 10577431, -530428, 4933844, 5285494, -5517959, 10166188, 2646237, 914828, +-3531000, -6801618, 7977365, -2440615, -14125074, 8169565, 6900402, 8542153, 3850975, -9947681, +-2086280, 930934, -10388989, 5940477, 5959267, -969052, 4500052, 3764539, 4022237, -972273, +6357089, 948114, -250719, -3221762, 1579474, -62814, 5064304, 1093069, -141197, 1036698, +-48855, 3725884, -1585380, -459025, -2468533, 1265405, -658204, -1933809, 420907, 520765, +-734976, 576063, 4102768, 3097208, -1773822, -1156957, -2646774, 688269, -570157, -355409, +-18583786, 2284386, 6135361, -9127879, 7612830, -15771657, 3602941, 4810900, -2075543, -6245420, +-8014946, -9344775, -15823733, 2021856, 17996450, -5918465, 8680666, 4828080, 13383655, 7112466, +-5056787, -11488501, 5922223, -2896956, -4085051, -11905112, -1779190, -1593970, -4750771, -5093831, +-2738042, -8361765, -10994043, 12833899, -1258425, -7432978, 10064719, 3563212, -8778376, 1333051, +-644245, 5739687, -11664594, 3303367, 4010426, -17210470, 5755256, 5645735, -8870718, 2571612, +672162, -2764885, 6366216, 614180, -1200980, 787590, 4312684, 11650099, 9250823, 11888469, +8192113, 4255776, -3070365, 17683990, -4488241, -9014599, 19581292, 1333587, 11834246, 2573222, +-3795141, -18149458, -16800838, -4148402, 1063004, -6613713, -3216931, -5187247, 11553462, -10091026, +-2946885, -1692754, 2820720, -9848897, 7128035, -757525, 2254321, -825171, -3830037, -6400575, +-4311074, -5035849, -4099010, -1195075, 654983, -3087545, -2208150, -1712618, 4225711, -4890357, +-4323422, -3510062, -4162897, -152471, 3390877, -1480153, -1659468, 2448131, 595927, -1206886, +1658931, -3052111, -3375844, 2610266, -3936875, -6323266, 2232846, 5706938, -3020436, 636729, +3819300, -1283658, -3139084, -30940944, 15134391, 26657252, 1851668, -15128485, 6893960, -2794413, +-1060320, 4370129, 2574296, 6862284, -8075076, 932008, 23882166, 18354006, 16044387, -17520782, +-751082, 4305168, 9158481, -8406862, -9425843, -2399276, 3013457, 8303246, 4117263, -22531936, +-25583510, 7957501, -855235, 14412837, 14763413, -9531069, 12217571, 9842991, 13050795, -889058, +-7792682, -8101382, 6234145, -8579734, -3297461, -2684, -374736, 7813620, 16596827, 9337796, +-4549981, -3917010, -8225399, -2094870, 728534, 4494147, -1773822, -2924336, 8158291, 5140539, +-12541305, -166430, 518080, 15074261, -7587060, -8652212, -16438450, -5577552, 2814277, 1102733, +8490077, -1829656, 2124398, -7349763, -10922639, -9904195, -10008348, -5756330, 4776541, -20623360, +2463164, -2887829, -3236795, -4359929, 4079682, 11298448, 8229158, 1309428, -1849520, -10476499, +-3342558, -964757, -2131378, 6922951, 3533148, 2114198, 1523640, 3599720, 4199941, -1604170, +-1756642, 107374, -1902671, 367220, 462783, 1383516, 2308545, -6700149, 1034550, -865973, +5084168, 1381369, -6740951, -375273, -4268124, -3269544, -1683090, -1504849, -1791001, -850404, +3810710, 3490735, 2943126, 5042292, 15592342, 1273995, 13530221, -1851668, 17562658, 8761733, +13695040, 8418136, 3990025, -6782290, -686121, -4245039, 9386651, 2764885, 8243653, -7871065, +-1376537, 14564234, -17952964, -10034654, 13993540, -23680840, -10440529, 1766305, -4520453, -11725261, +23849416, -4262218, 16474421, 6609955, -14352170, -2195802, -5397700, -17352742, -22541062, 18005040, +-163746, -6558952, 4453881, 328028, -2992519, 6557342, 2573222, -2324114, -8291971, 1592359, +17009144, 14421426, -11894912, 4720706, 934155, 13454522, -6124624, 9119289, -19339164, -4680441, +13204877, 4437238, -4426501, 15759309, -5012764, 11048803, -21470004, -24755654, -8925479, 485868, +-17538498, 18953690, 13375065, 19254876, -8827232, -6496138, -6676527, 1002875, -9764071, -99858, +-14923401, -13545253, 620623, 3821984, 13827110, 6540699, -1455994, -5094368, 4351876, 7987566, +5234492, 3196530, -4915590, 5776731, 5157182, 6510097, 4819490, 3528316, 5216238, -7155953, +6038724, -4327180, -2196876, 9469866, 8368744, 5631239, -995359, 341987, -2527052, 4858682, +1523640, -1987496, 2637110, 4929012, 744640, 3832722, 3722663, -4927938, 1637993, -3723737, +-1089311, 1172526, 21589726, 15525770, 24328306, -21605832, -16239808, -37012416, 15947750, -4121021, +-31628676, -6134824, 3000572, 4658429, -11818676, 12875238, 10877542, 1221381, -143345, 2010045, +-5240934, -11013370, 2427194, -6263673, -10307385, -135291, 23977728, 744103, -3639985, -19174882, +8088497, 15141370, -7834557, -23135916, -4197794, 7798050, 2765422, -4911295, 5041218, 1647657, +8321499, -2339684, 13725105, 20976084, 7934952, -13947906, 15808164, 7117835, -17865454, -19011672, +20664698, 9994389, -8048232, -9277129, -459562, -16851304, 12334609, 16250546, -387621, 915902, +4091493, -2081449, 17784386, 5979668, 4622996, -7374996, 2873333, 6005438, 21961778, -5272609, +8414915, -17016124, -19383188, 17282948, -2608656, -1616518, 1784559, 16473884, 360240, -775778, +10395431, -4975720, 2071248, 9540733, 11643656, -5570036, -7256884, -15631533, -7714298, 5105106, +-6909529, 5440113, -177167, 5772973, -3131031, 4257387, 878858, -2408940, 1872606, 8738648, +2149631, 8698919, 2618320, -5508296, 347355, 3628711, 3004330, -5405753, -4961224, -5266167, +-2268280, -4138201, -4056060, -6431177, -2778844, 3577171, 2263985, -658741, -1059246, 1953673, +-4284767, -108448, 5484673, -1554778, -907849, -2652142, -2248952, -1160715, -8168491, -1151051, +-3182034, -3502546, -5104032, -7267622, -25049324, -2065342, -16390132, -33248416, -34266860, -14812268, +-26163868, -11862700, -4227322, 4699231, 14631880, 16324097, 1671279, -8833137, 17581986, -8939974, +8665633, -32826436, -3229816, -22519588, -15115064, 15252503, 10707890, 10419054, 3463891, 21964462, +-2221572, -1374926, -15822660, -5485210, -3187940, -10769094, -10877005, -26975078, -10609106, -2979097, +-4351339, -16689706, 14756971, 5877126, 8804146, -7348152, -2831457, -40935332, -11800960, -11283416, +9477382, 20979304, -12927852, -1982664, -23851564, -1722282, 12271795, -3908957, -8056822, 5365488, +17601312, 30039002, 6311992, 952409, -1663226, -8058970, -12026982, 8032663, -7925826, 27247810, +5356361, 11731703, 55566140, -11059541, -9460202, -14038637, -19479824, -2643016, 18981608, 8544837, +2712809, 6316823, -8029978, -6225018, -16954920, -4059818, 9530532, -1556926, -3750043, -1591822, +-3954054, 1997697, -625992, 3695819, 3744675, 3820910, 5013838, 5490579, 14153528, 8641474, +-5246840, 8238821, -220117, 526134, 5920613, -6847789, 128849, -7900593, -4779225, -10814191, +-8033737, -11279121, -9361955, -6271189, 12367895, -7697119, -4345433, -9079024, 566399, 2698313, +-1964948, 3728569, 1499481, -228707, -7672959, -27808840, 15775415, 26007638, -15397995, 775242, +5826123, -9003862, -2177549, -19459960, -416075, -10924786, 28234042, -26844, -5347235, 22655952, +-5782100, 6568079, -26042534, 13472239, 4001299, 17561048, -8236137, 13069049, 23095112, 24812026, +13914083, 22363358, 11445014, -3597572, 21735756, -10570988, -14361834, -4628364, 8706972, 14721537, +-35458176, -2457795, -22935126, 18132278, 8194798, -492311, 6220187, 25407952, 1056562, 22670984, +9666898, 34354368, 3060164, -3959960, 15030775, 4936528, -17572858, 3728569, -2080375, -23570780, +16474958, -14233522, -23000624, -47004660, 3610457, -5831492, 27585502, -15426986, 36927592, 12159052, +-656593, -5693516, 14379551, 15164456, -27078696, -11588896, -20021526, 6927782, -9056475, 20266876, +6420976, 6792491, 9774809, -4710506, 1702955, -7142531, -2509872, 539018, -2715493, -20922396, +8213588, -66035, 6150930, 176094, -6192269, 644782, 8501351, -13926431, 11945378, -5118528, +-75699, 1339493, -11712376, -1018981, 7016903, 3550327, -8424578, -3486977, -2066416, -9855876, +3265786, -2821257, 14296336, -11511586, 5069672, 9976135, 3546032, -4254165, -3182034, 4846334, +2346663, 3003793, -2578054, 5025649, -15369004, 4094715, 3644280, 6580964, -4689031, -7176354, +511638, 6441914, 861678, 17859010, -11941083, -13361643, -13145284, 17173964, 8909910, 22363358, +6208375, 69186552, -20547660, 372052, 520765, 32205276, 13335873, 14911590, -21125870, 9278203, +-8329552, 598074, -9771587, 2150705, 23277112, -6125160, 7383586, 44978508, 14120779, -20371566, +-23852100, 2774549, 29334626, 15298137, 5576478, -11349988, 24973088, 4239670, -3703336, -27440546, +8391292, -4359929, 11828340, -24910274, -15202574, 1298691, -6334540, 3278671, -23226110, -801011, +-14166413, 6582575, 20598126, 16464220, 5391258, -31871342, 271657, 3151432, -28718298, -25651156, +-16996796, -14024142, -13998372, 22733798, 5196374, -650151, 14826227, 23638426, 6310918, 20472498, +558346, 13554380, 90393496, -20623896, 14898168, 10377178, -15879031, 3365107, -60224568, 1214402, +29912300, 7829726, -16565689, 23028540, 5555540, 8761733, -15023259, -3409667, -12833899, 4514011, +1124745, 1146756, 5164162, -18660022, 6915971, -10234370, -7439957, -25549150, 6350109, 5874442, +5101885, 6585796, 31991600, 4836133, 3430605, 3679176, 2511482, 19124952, 2255395, 8080981, +6696391, 14592688, 5872831, -867047, -3222299, -2644089, 2429341, 9259413, 11050951, 3277597, +-16782048, -7702487, -3713536, -3710315, -5543192, -17524004, -4256850, 13467944, 36599564, -17013440, +-865973, -24550570, -17829482, 5816997, 16043850, -20310364, 24260660, 10175851, -31825708, 19589882, +-12880607, -15761456, -1307281, -19062676, 4497905, -8528731, 24622510, -14171781, -1109175, 13558675, +-47501264, 6817724, 14761803, -14327474, 11716671, -28698434, 28716688, 3150896, 4960151, -54316304, +49052820, 21041582, 16120623, 1094143, -30962420, 28414966, -1795296, -14057965, 50164144, -9971303, +-22001506, -11586211, 6075768, 14526653, 13759465, 3673808, -8434242, -59027884, -6648610, 14785962, +882616, 21693880, -30971546, 32003412, 3270081, 10831908, -31479962, -9089761, 5093831, 40787156, +-16934520, 9543417, -29163364, 25831544, 14492830, 24378234, -9371082, 10811506, 4234301, -31884764, +-30440580, 16770237, 13716515, 26003342, 5594195, 33367600, -50232328, -65747896, 10528575, -13861470, +37187976, -24230058, -5222680, 4297115, -27974196, 1398549, -16688095, 14576045, 20684562, 2076080, +16789028, 18452254, 5509906, -16644609, -8378408, 29677150, 15473157, 3861713, 5224828, -8886824, +747861, 18073222, 10165114, -14612016, -8225936, 16816944, -2335389, 10482941, 10572062, -6453725, +-8538395, -8662949, 121333, 8978629, 4112431, 11483132, 16503412, 1361505, -463856, 13431436, +890669, 2709588, 4306779, -5603322, 4661114, -9807021, 5657009, 2026151, 295279, 4126390, +-4891968, -45965276, 41857140, -9073655, -10152766, -16379395, -4811974, -36250596, -67662376, 23325430, +19382114, -3008088, -13977434, -27577986, -4585952, -8570607, -14685030, 26623966, -60512868, -25867514, +-31961536, -9543954, -46081776, -4265440, -6968048, -1671279, -7743826, -9358197, 7391102, -474057, +-20408610, -6400575, -487479, -27907086, -14924474, -8243116, 2012192, 21457656, -11038603, 43023224, +-22504554, -3233574, 18079664, -19202798, 11655467, 2440078, -29512868, -44139380, -10830834, 11265699, +40240084, 17454210, -30842160, -13048111, -88525720, -29626148, -6391448, 18622442, 48063904, -2548526, +-51496656, 2863133, 27963996, -10289131, -2437394, 29654602, 31205622, 71602472, -79115984, -15336791, +11212549, 20024748, -24972014, -29644402, -42304892, -41997800, -23496692, -19524384, -5500780, -3002182, +-48875656, -20253456, -17913234, 18097918, -9224516, -4813048, 44024488, 33347736, 2676838, -6283537, +-2017024, -27189290, -1207960, 9692667, -19645180, -10521059, 3726421, 12426951, -8326331, -9623948, +-6512244, 13866839, -9170829, 14531485, 1041530, 15007689, 10663330, 10819023, -8260833, 5479842, +-20591684, 10634339, -2705293, 6273337, -18205830, -14093935, -2039036, 4714801, -10248329, 278099, +-23076860, -4035659, -2764885, 9894531, 12228309, -14678051, 30142080, 642098, 11189464, 6722698, +21840446, 21905406, -1055488, 13941464, -26118232, 6114423, -10652593, -62904092, 14060112, -10879689, +18409840, -17497696, -17999134, 1177895, -26393648, 4315906, -26610544, -696858, -4748623, -10545218, +12602508, -19929186, -25901338, -23702314, -30391188, -5243618, -3438121, 33362770, 7295002, -24664386, +-36511516, 4587562, -893890, 8469139, -7211250, 20133196, -24048058, -9709310, -33721936, -21711596, +-9780714, 907312, -14304389, 34797288, -12351789, -30135638, 9179956, 36121212, 26254598, 10549513, +-25808458, -16953846, -2731599, 32774896, 63065688, -795643, 12327630, -12333535, -61920008, -13796509, +5516886, 23099408, 52655764, -29432874, -35872640, 20775294, 9867150, -12636331, 1578401, -19871740, +12054363, -52468932, -6102612, 2782602, 12607876, -31718334, 36265632, -51318416, -58244588, -53910428, +27036820, -11228655, 51117092, -71570264, -31161062, 5528160, 72803992, -6050535, -13033615, -40285720, +-14736570, -4875325, 35089344, -3168075, -203474, 1916629, 6060736, 516470, -563178, -15352897, +-12967580, 16591996, 7368554, 1861868, -38190848, 9397925, -9840307, -4680441, -19777788, 726386, +-1789928, -3772055, -44921600, 3993783, -9947681, -5298916, -3898220, 7459285, -156229, 2625836, +-308164, 118648, -143881, 57982, -16378321, -3319473, -10536629, -9189619, 7823283, 7997766, +-13133473, 361851, -9353902, 12093017, -4516695, 37345816, 11457899, -66524748, -11754252, -45882600, +20562692, 3889630, -91495152, 6295349, -28106266, -59261960, -46082852, -67636608, 41965052, -20599736, +-53208740, -23896124, 17389248, -31704374, -27335320, -21332028, -12619688, -23522462, -23338852, -43174084, +-31194884, -59251220, -33368674, -30104500, -9862856, -27861990, -5614059, -12984223, -676994, 2369211, +8032663, 16743393, -16227997, 13951664, 1830193, 30594126, 13427142, 19165218, 19365470, -55489904, +-14463302, 44837312, -7498476, -27509266, -31032750, -22939958, 18069464, 72281080, -4606353, -892816, +-48185240, -49149996, -10233833, 10388989, 43290048, -2755759, 39475044, 14766634, -47327320, 85985784, +1830730, 66966056, 357019, -16802986, 36027796, -47805672, -61877056, -39533028, -137296144, -83176336, +-27164058, 63257352, 38845296, -54899344, -36097588, -84030496, 42000484, 56057912, -42880416, -42805256, +10095321, 37150392, 52669720, 15010374, 30285962, -27676232, -15216532, -20771536, -31878322, -12790413, +-2736431, 3463891, 1471563, -17111150, 2892661, 12356621, 4059818, -2326799, -12552042, -8136816, +-14327474, -4912369, -21245592, -4086662, 13310104, -20285668, -33665028, -4420595, -22049288, -14561550, +-2485712, -27980638, -21925808, -5163088, 13782013, 14776298, 15883863, 322659, -12066174, -1352378, +5224291, -6565932, 21299816, 1780801, 15731391, 1731409, 69793, 16452946, 12228309, 18410914, +38111392, 24876988, 28465970, 24698210, -23368918, -56748868, 65997004, 63108100, -39907224, -51781200, +-240518, 56625924, -6137509, -3287798, -17640504, 49516140, -5487895, -13216151, -1203128, 13674639, +25426744, 680215, -19085760, -21729314, 30558692, 2267206, -13124883, -32678258, 18586470, 10249939, +-3707631, -25757992, 8107825, 11078868, 9207873, -16294032, -9765682, 2873333, 25218974, -7420093, +9066139, -37089192, -10307385, 53687, 24436216, -51628192, -9208410, 5015448, 37171868, -17866528, +5777268, -26385594, 3612068, 10911364, -18126910, -13841069, -2133525, 6026376, 11349988, -11777337, +814433, -46018964, 24916716, -7704635, 43119860, -26738856, 19248970, -18204218, 20012936, 3721052, +13429289, 11349451, -33462628, 37852620, 7508140, 21829708, -36934036, 10251550, -9378061, 5853504, +-10512469, 1445257, -2536178, 5015448, 12577812, -1996086, -14749455, -8812199, 3800509, -2018098, +952409, -5782637, -14367202, 4795331, 3848828, -4496294, -4049617, -301185, -4488241, 643171, +-7803956, -285078, -3800509, 6431714, 3799972, -2718714, -5787469, 1974611, 181999, -5145908, +3756486, -15827491, -121333, -1889786, 7054484, -303869, 18214956, -12114492, -12257837, -4220879, +9625559, -13114683, 19536732, -16440061, 8298951, -8081518, 17810692, -15962783, 19593640, -11164231, +15322296, -13869523, 23807004, -22436910, 17243756, -5196374, 12979928, -12099460, 12754442, -13692893, +14385456, -13771813, 11541114, -9204652, 12751758, -9868761, 10635950, -9786083, 3100967, -3188476, +6408628, -4757750, 5177583, -4076998, 4045859, -2652142, 5296769, -19353122, -43012488, -57189100, +41679972, 27649388, -32624572, -46478524, -22788560, 21502216, 11264625, 28607704, 30787400, 6025839, +-15557445, -4538707, 10755672, -10604811, -891206, 6365142, 1723356, 17238924, 12031814, 5222144, +-15548318, -581431, -9638980, 10001905, -16290274, -14095009, 11782169, -3758633, -6648610, -6505802, +-11335492, -15503758, 1156420, 12658342, 11522860, 9684078, -3710315, -12783433, -11133629, -7766375, +13776108, 18778134, -8783745, -13127031, -5709086, 15582678, 8018167, 20847234, -14767708, -5606006, +8206072, -3930432, 656056, -2234994, 7369090, 4436165, 5946919, 1254131, -14133127, 5837398, +2594160, -522912, 10894721, -5674726, -2818572, 1884954, -2040646, 1399623, -4110821, 18504866, +4627291, -1498407, 17608292, 17660368, -17973902, -27180164, -9982578, -18616536, 536334, 12310987, +3498788, -11135776, -13450764, -3584687, -2610266, 10698227, 5090073, 6667400, 10006200, 6116571, +-5608691, 6193343, 4377646, -13084081, -17548700, 5249524, -4639102, 8722005, 6388764, -9618042, +-2585570, -3268470, -3538516, -11176042, -6143951, -696858, 3518652, 5334887, 14849313, -7401303, +-5548024, 3805878, -3462818, 19608136, -47631188, -125398016, -46098956, 22492744, 65234648, 137780944, +92198456, 23731304, 34942244, -18410914, -56084220, -93134752, -81039592, -64423972, -18583786, 2482491, +44819596, 49421116, 105191800, 51074676, 33668784, -2637110, -22430466, -50629612, -26300232, -40938556, +-47225848, -29067264, -24348170, -1809792, 13145821, 39364448, 24320790, 28258200, 25669946, 25964688, +39031052, 3377992, 27039504, -5008469, -12156905, -32939178, -19644106, -49126908, -72341744, -63189708, +732829, -10739566, 19822348, 33990372, 18620294, 52427056, 45756436, 66259536, 37698000, 44940928, +2210298, 2221572, -35442072, -57870388, -67656472, -81190992, -53390200, -66349728, -5597953, -250182, +31928250, 33521146, 80197776, 63027036, 89585504, 36383204, 41872708, 17485886, -396748, -53451404, +-87235080, -58386324, -69696584, -43393128, -47201152, -4392141, 7275675, 27861990, 36508832, 49514532, +50501300, 48601312, 31788126, 34808024, 9033927, -6285685, -11977590, -39158292, -35747548, -46886012, +-33174864, -46868832, -35757212, -3709241, 8346195, 24740086, 37287832, 33309082, 34276524, 56542172, +20436528, 34531536, 26462368, -35618164, -64539936, -27949500, -56913148, -35844724, -19550154, -4046933, +5035313, 18134962, 32790464, 22864258, 35276712, 22429930, 19188304, 7769596, -2204392, -20501490, +-6782290, -9608916, -36036388, -33621540, -9318468, -3789772, 1864553, 11841225, 13784161, 17557826, +13964012, 13880797, 5147519, 4683662, -265214, -7879118, -3991635, -2893734, -8113730, -12856985, +-4488778, -6484864, -7667054, -1001801, 3180423, 3663070, 5330055, 5941014, 5523328, 2313914, +1056562, 714038, 734976, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 7651484, -815507, -2067490, -2163053, 1333587, -3695283, -53687, -7201587, 5168993, 6554120, 4579509, -6449967, -7733626, 628676, 1772748, -2756295, -2121177, -1883880, -9058086, -1522029, 5391258, --9273908, -7535520, 4391067, 3980898, -5958194, -2075543, 3948686, 509491, 4800163, 2059437, -4999879, -3133716, 958851, 696858, -1324997, 2331094, 1831804, 3396246, 1426466, -1493575, -328028, 3794067, -1022202, -1719061, -638876, -4578435, -10112500, 6018323, 2921652, -3160022, -4439923, -1772211, 493384, -150861, 2064269, -2664490, -692027, 5981279, -5626407, -2252174, -1956895, 980863, -869194, -272730, 2621541, 304406, 2320893, -4006668, 4083440, 2105071, --5228049, 4170950, 370978, 1514513, -623307, -1549946, -6102612, -1883880, -455803, 3142306, --804770, 2571075, -1533303, 309775, 765578, 312459, 1821603, -319975, 126702, -217433, --1235340, -558346, 243739, -658741, 88047, -25233, -280247, 1674500, 1679869, 878858, -700617, 613643, 217433, 11811, 224949, 97174, -253403, -739808, -836982, 11946988, --6880538, 2092723, -7604240, 908386, 1771674, -7665980, -9692131, 2413772, -10515154, 2310693, --2746632, -731218, -6451578, -940061, -7243999, -3726421, 23085, -7663296, 8131984, 2859911, --12707198, 1200980, -705985, -2305861, -5443334, 2726231, 6583111, 125628, -492311, 6179921, --3641059, 73551, -2320356, 4093641, -4808753, 1402844, 5774584, -5038534, 5048734, 1772211, -5461588, -475668, 1232656, -834297, -2318209, 7158637, -8902393, 2045478, -3946001, -1716376, --1170379, -3244848, -2404645, -7096360, -4466766, -1115081, 4604742, -400506, 1721208, 6452652, --163746, -5609228, -733903, 194884, 1738925, -2742337, -5906, -5517423, 102005, -2251637, -1805497, 2855617, 4197257, 1493038, -2393908, -3103114, 4119411, -1392643, -1910724, 763430, -2283312, 4755603, 563714, 1358820, -328028, 2784750, -559956, -2221572, -1148904, -1103807, --117575, 1886028, 352724, -133681, -1023813, 1826972, -21475, -695785, -531502, -477815, --551903, 864362, -384936, -99321, -1078037, -2876554, -9896678, -117038, -5964636, -1882269, --972810, -6955700, -953483, -1620276, 3450469, 8112120, 8157754, 970126, -3489124, 3262565, --7904888, -1130113, -3026341, 2755222, -11779485, 4158602, 1992328, -430034, -3391414, -5077188, --2323577, -4188667, -3606162, 2203318, -791348, -4514548, -1320166, 914291, 7686918, -296890, --7772817, 608275, 3342022, -97174, -2449205, 644782, 2921652, -8442832, -660888, -3671123, -5927592, 3611531, 1001801, -7805030, 878858, 3006477, 4782446, 4478577, -5133560, -2412161, -229244, -1603097, -1611687, 4172024, -2592013, 2553895, 697395, -3279745, -743029, -4505958, -5425618, 2039036, -5366562, -3699041, 903017, 2846490, -4257923, -5366562, -915902, 266825, --3571802, 768262, -1467268, 1811403, -3404299, 5058935, 2707977, 3813931, 1088237, 503585, -3429532, 4642323, 540092, 1319629, -444529, 660888, 77846, -192737, 517544, 391379, -537408, -732292, 25770, 357556, -259846, 82678, 1546188, -899259, 352187, -1076963, --864362, -721555, 158914, 587337, 394600, 54761, -1002875, -663036, -16843788, 5437429, -4862440, 8147016, -2122788, 5113159, -14529337, -3979287, 4542465, 530428, -7191386, -1881196, --2399276, -12731357, -5164162, 1279363, -593242, -9080635, 5655935, 8039642, -8277476, 6263673, --10837276, -3695283, -981400, 3714610, -68719, -4403952, 2960306, 1466731, -733903, 4823785, --2352568, -3132105, -983548, -1794760, -3215320, 4743792, -3668439, 1331977, 3552475, -741419, --2843268, -5333813, -657130, -3811247, -1170916, -4431333, -1206349, 9802726, 188442, 5953362, --5493263, 4992363, -1578401, -8041790, -4747013, 4424353, -2929705, -4099010, 2917357, -4816806, -3982509, 1056025, -1488743, 5205501, 4704600, 2063195, -5195300, -5885716, -418759, 7792145, -1540283, 1165547, -4440460, 1134945, 2794413, -5977521, -2193118, 1918240, 4149475, 2045478, -3511136, -217970, 23085, 1278290, 155693, -689342, 202937, -528818, -762357, -2655901, --2117419, 622770, -1277216, -774705, 879395, 381178, 641561, -185220, 1071594, -718333, -45097, -947577, 4295, -1145683, 557809, 173409, 766652, -1488743, -9048422, -8603356, --5699959, 1022202, -1484448, 3468186, -3143916, -34360, 580894, -2596308, -1010928, 2118493, --2574296, 9979893, -6614250, 4599373, -1766305, -727460, -4707821, -1325534, -687732, 7263864, --5034239, 610959, 1371705, -7210713, -4426501, -4939750, -4206921, -8352638, -2908767, 2944200, -5588826, 3525095, -6679748, -9402220, -2101850, 241055, -4811437, 827855, -3284576, -4927401, --11630235, -5868536, -8166344, 4632659, -2148021, 3755412, -4711579, -11339787, -6036577, 511638, --2348810, -3752728, -1734093, -4494147, 5982890, 493384, 3462818, 4651450, 1141388, -242666, --3965329, 125628, 5057324, -929860, -3830037, -5289789, 8355322, -7041599, -9812390, -6944962, --4021163, -5472862, 6064494, 9707700, -7826504, -5413270, 1148904, 4684199, 7224135, 5703717, -4441533, 4381404, -1619203, -1985886, -2262911, -2341831, 1750736, -1453846, 439697, -1763084, --2809446, -1174137, -2037425, 1409823, -1291175, -2508261, -1486059, -1468879, -2521146, -2781528, --1759326, -737661, 497679, 445603, 1237488, 117575, -4293894, 457414, -701690, -1753957, -451508, -788127, -1330903, -2828773, -2342368, 32212, -40802, -980326, -1122597, -43487, -2309082, -18480708, 5698885, -1313723, 3266860, 10126996, 3974455, -2514703, 3426847, -7633231, -4712653, 5524939, -10069014, -2159295, -5099737, 5668820, 4937065, 7695508, 8934069, -11621108, --5984500, 1904818, 9972914, -3794067, 4635881, -11111080, -3355980, -3903052, -2357400, -6730751, -1663763, -11001022, 7614440, -2167885, -1952063, 5555004, -332860, 1261110, 5913096, 151398, -4840428, 3233574, -1370095, -1917166, -653372, -7727183, -5657009, -7061463, -444529, 14652281, -3406446, 2826089, -342524, -2057289, -120796, 8752070, -1871532, 2732136, -16902844, 15546171, --3767223, -2788508, 896574, 9517648, 3470334, -1605244, -5793911, 16658031, -3211025, -213138, -5343476, -4233227, -23622, 2378875, -3751654, 3281355, 3272765, 13754096, -6847252, -8633421, --1581085, 4108673, -5177046, 1143535, 3563749, 1126355, -3022583, 1352378, 3654480, -2314451, -332323, -3950833, -1231582, -1170379, -3211025, 4213363, -3053722, -2607045, 1937030, -134755, --3621194, -340376, 884226, 1547799, 185757, 1823214, -1307281, -1137093, -1063541, 1220308, --1332514, 2179159, 249645, -938450, 1013612, 2275796, -51003, -1050120, 7998303, 4487167, -8900783, -3558381, -2114198, 5130339, -8207146, 7393250, 8436926, -4223027, -707059, -13249437, -632434, 4566624, 3696356, -2801929, -9012989, -18289044, 299037, -3104725, -8677981, 2030983, -5841156, -7937100, -3380139, -8657043, 4387846, 503048, -1285269, -2874407, -3751654, 9346386, -10902774, 4245039, 5197448, -2421825, -5466957, 15203647, 3784403, -2584497, -8919573, 6585259, -279710, 8745627, -765041, 10806138, 5408438, 7564511, 6398965, 3265786, 8414378, 10500121, --294205, 1947768, -3343632, -100395, 5733782, 2405182, 3121904, -9270150, -3398930, -1948305, --8071854, -7716446, -5080947, 4337917, 8927626, 11671037, 15267535, 3408594, 1344325, 12306692, --4890357, -9254044, -3216931, -4679367, 7969312, 6518150, 2503966, -8761733, -2378338, 1583769, -1287417, -1688459, -4031901, 1259499, 1046898, 5099737, -1202591, -2785286, 603980, 1011465, -1261110, 121870, 90731, 1035624, 2345052, -1614908, -1581622, 184147, -179852, -2276333, --508417, -2911451, 3240553, 1069447, -2189360, -58519, 2207076, -1107028, -168041, -1712618, -993748, 1186485, -744103, 2827699, 2149094, 14127758, -13378823, -6286759, -1789391, 5417565, --12514998, 7927973, -12329777, 6081137, -28991, 6451578, 10211822, -4168266, 9327595, 10198937, -9698573, -5608154, 8182450, -8792335, -7007239, -1082332, -5413270, -78383, -4653597, 8014946, --5917391, 1768990, -5841693, -10266582, -4778151, -2157147, 12427488, -10404558, 9790915, 4311611, --14409615, 16546898, 4086662, 1851668, 11629161, 2069101, 535797, -6573448, -19864, -3668439, -13259101, 5599564, 9298604, -3611531, -2177012, 6397354, 11047193, -11527692, 11447698, 2093797, --1843078, -2145336, -10848551, 5242008, -5111011, 2216740, 499290, -9843528, 3342558, 8343511, --7558069, 5294084, 3481608, 11676405, 1257889, -783295, 7101729, 10211822, 847719, -5852430, -6871411, -7898982, -4099546, 2111513, -3183108, 2136746, -2548526, 1018444, 4430796, 3227668, --3207804, 2820720, -1642825, 2274185, -2246805, 7110319, 734439, 6788733, -797253, 1702955, --1416802, -587337, -2149094, 4302484, 1824287, -3544422, 3724274, 4311074, -459562, -592706, -2648921, -187905, -205622, 3588445, -92342, 880468, 2334852, 1514513, -539555, 2739652, --2250563, -419296, 546535, 739271, 628139, -157303, -306016, -2733210, 1316408, 4057134, --11404749, -8158827, 12411382, -15892990, 4009352, -8457864, 9449465, -10094784, 15433965, 5356361, -1496259, -13382044, 6826851, 11343545, 2997887, -6874632, -4473209, -3930432, 10524817, 5734318, --14685567, 2088965, -10390063, -560493, 1189706, -8866960, 11642046, 11700028, -5306432, 2576981, -7926899, -9666898, -1474784, -2965138, -8019241, 17065516, -6199786, -3796751, -8589935, -14324790, --2279017, 283468, -4960151, 2149631, -11874511, 1065689, 833224, -2359548, 9377524, -1935420, --7304666, 3821447, -11811, -5440650, 4679367, 20234664, -4050691, 4836133, 1095217, -13704167, --2239826, 12275553, 5515275, 12187507, -1253594, 7058779, -9695352, 4377109, 4274566, 1461363, --8242042, 7644505, 2683818, -21330956, 1658394, -3825742, 14280229, -5451387, 11086384, 10310606, -8252243, -986769, 3162170, 522912, 824634, -1352915, -2362232, 5621576, 2244657, -34360, --3711926, -5133023, -1214939, 2261837, 3615826, 2643016, 4641786, 210990, -1268626, -1870995, --1508607, 1733019, 2770791, -204548, 2183454, 1493575, 393526, 2068564, -398895, 2161979, --3504693, -4260608, -5699959, -208843, 2573222, 1238024, -2686502, -905701, -1887101, -2002529, -3458523, 1131187, 1529545, -24959128, 28223304, 3328600, 11141145, -20476256, 11180874, 14549202, --16765942, 6389838, 8303783, 6423661, -10832981, 1422708, 1914482, -3656628, 6328098, 13032541, --10459856, -8705362, -3182034, 11047730, 9556302, 13510893, -649077, 5706938, -10065256, -2637647, --2612951, 2209224, 6353867, 17268990, 10285373, 6277632, 3286724, -573378, 8252780, -3054796, --14816027, -2878702, 4359392, 4731980, -8669928, -6569153, -10737955, 2073396, -850404, 3769908, --7038378, 12607340, 12328704, -10674604, 25381110, 1162862, -2329483, -145492, -5280663, -1143535, --1622424, -10263898, 172872, 30065, 6739878, -21357262, 5234492, -7570954, 15516106, 18734110, -8112120, 7783018, 3503083, 1249836, 16916266, -3173981, -12504797, 10702522, -5630702, 2868501, -8358007, 15237470, 2143726, 1502165, -12197170, -532039, 3571265, 9671193, -4201015, 5252745, -2536178, -3704409, 9825811, 1656247, 4406637, -2864206, -903554, -2838437, 482110, 1127966, --1495186, -87510, 2961380, -1635846, 3001109, 2017561, -2090039, -224949, 1395864, -887448, -241592, -2015413, -6623377, -1907502, -1005559, 6924024, 8578660, 838592, 1265942, -2467459, --2864206, 718333, 940598, -3590056, -2779918, -1867774, -1618129, 2298344, -3965866, -196495, --2913062, 10264435, 1964948, -7147900, 6655052, 9988483, 8675834, 5475010, 10350334, -12595528, --8036421, 1397475, -11395085, -2847563, -1945620, 2500208, -2961380, -7403450, -9302899, -5599027, -4533875, 7790534, -13729400, 2866891, -1475858, -400506, -16535087, -14850923, -2624762, -11528229, -5381057, -13142063, 799938, 6972343, 10041097, -8975945, 11940009, 3016678, -1228361, -2685965, -17729624, -4996658, -923955, -14324790, -8067023, 11595338, -925029, 4361003, -13780403, -15093589, --4150549, -8538932, -1515587, 608275, -5587753, -7167227, 4198868, -6657736, 548682, -9788230, --5296769, -301185, -16078747, 1424319, 10532870, 1959579, 5519570, 11447698, 19687056, -19079318, -3441880, -11794517, -11436961, -6440304, -8695698, -5629092, -5140539, 19232864, 10594611, 10619844, -2199560, 3078418, -13964549, 623307, -4928475, 2172717, -6070937, 8478265, 11256572, 1043140, --5116380, -3525631, -9635759, 813896, 5908265, 3216394, -2338073, 6043019, 2935610, 6400038, --1394791, -1249836, 1054951, 4140349, -2686502, 1729798, -3948149, -5546951, 3959423, 1359357, -814433, 814433, -7470022, -4511863, -38655, 5670968, -4835060, 2803003, -6478422, -2239826, --1034550, 2222109, 1559073, -2005213, -1579474, -8690329, 19815906, 21010444, 23088134, -17266306, -1203665, 12422656, 9773198, -10113037, -19287624, -2301029, -2920041, -15191299, -8800388, 28651190, -2208687, 1898912, 10695005, -1308354, 4545149, -4022774, -11439645, 7438884, 6225555, -15484431, --21962852, -17047798, -13542569, -12920335, 1189706, 3672734, 6475737, -8615704, 8333311, 1941325, --4238596, -9114994, -347355, 437013, -14010183, -11002632, 1561221, -2592013, 1864553, -8532489, -6800544, 2060511, -8010651, -17161616, -6799470, -5840082, -22774600, -7237020, 2081449, 11163694, --1132798, 13232257, -2394444, -1192390, -19415936, -4190814, 7568269, 3558917, -32458678, 9217000, -2762738, -9111236, -5541582, -9501541, -10686416, -499827, 445603, -10355703, -3358665, 6487011, -9408126, 14811732, -11426224, 469762, 8359080, -453119, -24830816, -19833086, -272194, -5303748, -6162741, -257161, -6140193, -8949638, 4052839, -2630668, 3678103, 10058277, -316217, -5085242, --8486319, -15567109, -5327907, 871342, -2605435, -2686502, 976031, 941672, 6849399, -3603478, -682900, 2516851, 1328756, -5670968, 610422, -1494112, -13516262, 1306207, -5022428, -6157910, -2156074, 1587527, -4115653, -1352915, 4827007, 1343788, 1263257, -5050345, -5672578, -2053531, --450972, 227633, 3434900, 7945153, -6739878, 22556632, -19305342, -11885248, -3925063, -36501316, --19067508, -100395, -23269596, 18067316, -8185134, -7541426, 2065879, 41372348, 19963008, 1278290, -8491687, -1925219, -11108933, -1107565, -17185774, -12436615, 5908802, 6001680, 7416872, -11943230, -15289010, 9358197, 17297980, -17589502, 2818036, 25642028, 2389076, 1046898, 5051419, -24598352, -6267431, -6220724, 4034048, -9909026, -23232014, -1428614, 9370545, 11429445, 2946885, -3635153, -1671279, -1073205, 7678328, -17544404, -25535192, 4554813, -9332964, 15222438, -6115497, -6353867, -19877646, 4466766, 8536248, 1575716, -16843788, -6913824, -2035278, 9063992, 26222922, 20184736, --6053220, -23218594, -505732, -2685965, 8566312, -14323179, -17954574, -10197326, 8459475, -18185428, --2867965, -15262166, 63351, 12263742, -408559, -22866406, -5058398, 3011309, 5975374, 2828773, --14279693, -9622337, -15280420, 2343979, -3236795, -6643778, -5126044, -6640020, 1252520, -2780455, --6366752, -1813013, 4426501, -42950, -247497, -7769596, -228707, -745177, -4978941, 390842, -9482751, 3168612, 1686312, -9829570, 3765076, -1102733, -1183264, 1518808, -285615, -214748, --2071785, -5861020, -6568079, -5367636, 6553583, 5749351, -2744484, -14592151, -5457830, -5430986, --1258425, -41510860, 16047608, 13171054, -6079526, -27430346, -6040335, -10557030, -11111617, 12123082, -14975477, -1513439, 4107599, -31166968, 11005317, -39012800, -9855876, -3364570, 7798050, 19668266, -31217432, 12975633, -18034030, 4229469, 21818434, 2932389, 6654515, 11860015, -18330384, -7048578, --2872796, 5604933, -12906914, -6918119, -3897146, -9674414, -7385733, 13290239, 13028246, 3381750, -1106491, 22473416, -4195646, 10519986, -25336012, 16864190, 4835060, -22945862, 2374043, 7417946, --21589726, -2738579, -21114596, 7125351, 8929774, 9552007, -14207752, -1165547, 14235669, -11784853, -192737, -1849520, 23481660, -13824963, 17306570, 8818642, -21827560, 19252728, -16064251, 12414603, -16297790, -16367583, 9300752, -13953812, -17418240, -26227218, -21911312, -23976118, -5715528, 4362076, --7211787, 21100638, 21864068, -9158481, 19272056, -2876018, -4029753, 24551644, -5418101, -16322486, -11439109, -2381559, -12782360, -9774272, 9702868, 1802276, 5042829, 7745437, 1382443, 6389301, -9761387, -2508798, 10941966, 7597797, 5471789, 6300180, 938987, 3909494, 9302362, 7573638, -9430674, 1511829, 7835094, -1349694, 569083, 6922951, -3346853, -12123082, 5820218, 2075543, -40802, 378494, 5557688, -10708427, 5589900, 7757785, 6216429, -7048042, 6820945, -32802276, --15469398, -16103443, 28835336, 943282, 10826002, -4606353, 40860708, 6510097, -27166742, 2065879, -30043296, -11030013, 6751689, -4880694, 2675228, -17447230, -23551990, 37554656, 26757646, -10200010, -20556250, 8115341, 26716308, 30354144, -8776229, -7088307, 27011050, 19807316, 2266132, -8455180, --13310641, -13987098, 12545599, 23811836, 11241540, -4279398, 16040629, -8345122, 15227807, -6727530, -22171158, 39197484, 29880088, -31832686, 14639396, -5386426, -12920872, -376883, 11173357, 10775536, -71567576, -7178501, -686658, -11599633, -12633646, 13968307, 25890600, -6287296, 19694572, 16809428, --2196339, 635655, -13864691, 14216879, 11966853, 38081328, 38737384, 47022376, 19566798, -11959336, --9678172, -21556978, 21126408, -31903018, 23147726, -29944512, 17661980, -10540387, -17993766, 13070122, --48506288, -38367480, 7030325, 7574175, -13859323, -13438953, 22671522, 11315628, -20798380, 3124589, --4716948, -11375221, 3758633, 5866389, 1806034, 5944235, 6977711, 12258910, -5640903, 2413235, --6826851, -12109123, -7393786, 2935073, 1076426, 16802448, 3601867, -4029216, -13573707, 2186138, --5369783, -4343823, -6027987, 4722854, 10133975, 3614752, 8797704, 7390028, 11625403, -4850629, -8861054, 1202591, 2595234, -762357, 775242, -6789807, 8172249, 19503446, 10465225, -2021856, --2152852, 15508590, 12999792, -11950747, 3837553, 7813083, -5992016, 22433152, 5067525, -52586504, -12059731, 6888591, -39119636, 2302639, -6713034, 1619740, 14326400, -1902134, -36158256, -6426345, --11530913, -2032593, 25589952, 30720828, -17498234, -4416837, -14689862, 7556995, -27710592, -53739704, --19263466, -16238734, 2807298, 868120, 24417962, -36745592, 17485348, -8560407, -4079145, 15066745, -7066832, 25523380, 5802501, 9810779, 27307402, -31255550, 38945152, 30910342, 16108275, 28987808, --11296838, 10984379, -27211302, -5449240, -13711683, 24001888, -21338472, 5099200, -45788648, -56791816, -37853696, -1804423, 24412594, -17289390, 16149614, -11317776, 3479997, -6521371, -37211060, -11822434, --24886652, -11872900, 13427678, 55043228, 19643570, -48721036, -11041824, 12786118, -11307038, -7384123, --32171452, -16727287, 24790552, -9409736, 5976984, 4765266, -20062330, 12549358, -2958159, 849330, --41140956, -12105902, -905701, -18928458, -10689100, 1413044, -27851252, 2750390, 6197101, -22669912, --17741974, -31947578, -23730768, -2379412, -13156559, -6470905, 766115, -9291088, -9010305, -3927211, --14067092, -6934225, 1774895, 9342628, -12410845, -4643934, -21228412, 7267622, 5178657, 12241731, --8807904, 12732967, -27457726, -1869921, -34897, -2180770, 4158065, -4720169, 2871723, -12998182, --13390097, 3850975, 3308199, -32236414, 17130478, 17114908, 30323006, -14668924, 11165841, -16872780, --19628538, 8879308, 40237400, 65157876, -3975529, -4220342, 1447404, -1349694, -28916404, 45624364, -21946210, 24314884, 18744848, -13086765, 15882789, -25566330, -36870684, -6283001, 27740120, 18089328, --13146895, -8437463, -1762547, 22480932, 1015760, 16413754, 16053514, 26602490, 8904004, -16580721, --15770046, 15252503, -17762374, -13197898, 7913477, 29211146, 26903676, -30572650, -23664196, 15917149, -18931142, 57332444, -13228499, -31067110, -32244466, 27487790, -20616380, 25941066, 29272350, 58992988, -125030256, -27844810, -15879568, -46733004, -74512312, -23676008, -37502044, 4406100, 51884280, -7515656, -27497454, 39262444, 25706990, -14367739, -46141372, -75521096, 42256036, -2865280, 48056924, -24568824, --65544960, 22999550, -38831872, -51652352, -26540214, -16362752, 16522739, 16365436, 29525216, -2080375, --14323716, -2166274, -1177895, -26666378, -25928180, 13328894, -9167071, 26584236, 24131810, -11404212, -24024436, -18792630, 541703, 23789824, 2554432, -36718212, 9838159, -18428094, -3224447, -5838471, --4938676, -27031988, -22236656, 4456566, 32223530, 34676492, -32350768, -3688303, 39342976, 37815576, -44560, 8093329, -35633196, -18763102, 5273146, 20973936, -30807800, 8035884, 23985782, 12215961, -9068823, 2893197, 15121506, -25233470, 4694936, -23002234, -63432372, 15969225, -26503706, 26326002, -3870839, 14697915, 12883828, -58030376, -41111964, -20365662, -12785581, -13492103, -23716272, -7380365, --39400956, -25100326, 18953154, -25660282, 48831632, -36335960, 3738232, 10059887, -3861713, 4290136, --2095407, 11662984, -11324218, -12212203, -2112587, 8737037, -1537598, 20936354, -19766514, 4452271, -30601642, 9797357, 4589173, 15573015, 1931662, -12475269, -7940858, 24821690, 5568962, -39260832, --17403208, -31859530, -14499810, 42194296, 39355860, -40668508, -4498442, -46238544, -11142219, -3856881, -10660646, 23163296, -37868728, 25246892, -32239636, -5469641, -21842594, 48581448, -9825811, 34259880, -32057636, 71331888, -32869922, 29407642, 4787815, 27939300, 9760850, 21310018, -35756140, -32862942, -47662864, 2303176, -1799591, -33777772, 38481296, -13052406, 19740206, -35553204, 74673376, -40039296, -41539312, -50127100, 19789062, -37791416, 20855824, -34821984, 25789132, -22069690, 15146202, -12338367, -8338679, -18787798, -11599633, -8921184, -2346126, 6584185, 1148904, 5297842, 428423, 5202279, --2842195, -9628780, -15175193, 6816650, 7529615, 2117956, 6896107, -5738077, 2681133, -4566087, -2818036, 25597468, -6494528, -18514530, 2578591, -10534481, -19695646, 6146635, -10773925, 7740605, --9042517, 6408628, -17218524, 6849936, -22252226, 31101468, 4785668, -57204668, -25195888, -35458712, -1929514, -8322036, -77232104, -35095788, -20277078, -41168336, -25653840, -77829104, -65706556, -12037183, -27894738, -42905648, -25666724, -6378027, -36561984, -8515846, -3070365, -35390532, -9557913, 7046968, -1577864, -46920372, -26770532, -26840862, -14992657, -16732119, -4955319, -32635308, 26874148, 17453674, -38438348, 55988120, 48664664, 12287365, 51459612, 20509006, 9004399, -23156854, 17885318, 18611168, -14668924, -6197638, -17915382, -8414378, 12712029, 22761716, 117880208, 15800111, 24100672, 17142288, -48061220, 18474802, 42179800, 77001248, -37512244, -75856104, 9154723, 48088600, 86057184, 38024420, --74822624, 9839770, -18871012, 108656768, 79860624, 97182224, 89071720, -77888696, -51504176, 63425392, -76182520, -22580790, -44769128, -53954988, 120296664, 80039400, -5525476, -104097656, 24522116, -4274566, --23455354, 28296318, 7315940, -9382356, -22682796, -739808, 15927886, 44486196, 31411780, -27064736, --11237782, -7518341, -6230387, 24954834, 17882096, 19268298, -272194, 10153840, 40736692, 27593554, -5207111, 16091095, -11943230, 20159502, 26041998, 34547644, 44014824, 34377992, 26060250, -163209, --6766721, -9570261, -3775276, -20331302, -11695196, -9976135, -25400436, -32472100, -37142876, -63242856, --36386428, -23783918, -38579008, -70343512, -49387828, -41647760, -48752172, -57642220, -61092688, -21170430, --23972896, -33595772, -19364934, -21106544, -14496588, -19844896, -19596326, -19148038, -18945638, -55890948, -89661200, 72392208, -62634044, 14002130, -1418413, 10076530, -2406256, -6205691, 23117124, -23205708, -22583474, -9205726, 124554, 8892730, 7312719, 8019778, -18790, -13176423, -8354249, 14382235, --11798275, -1564442, 13962939, -7642895, -7870528, -11106249, -20156818, -20383378, 14937896, -7488276, -5619965, -12861816, 2647311, -27196270, -4794794, 7320772, 17552458, -11202885, 3920768, 11835319, -19225884, -4713727, 15945066, -12992276, 50530828, -18873696, 17519708, 2152316, 9991168, -9621264, -13518410, -5546951, 36074504, -6063957, 11293617, -25289304, 33127082, -17550846, -1156957, -5105106, -4989679, -10077067, 19988778, -23081692, 18802830, -21187610, 27380416, -28686086, 34670588, -23186918, --12135430, -14657113, -6988986, 1059783, -22429392, 14442364, -13194676, 12614319, 1290638, 17551384, -6991133, 12015171, 22058416, 9032316, -7310035, 5480915, 5597416, -3511673, 4190814, -7241315, -8161512, -4265977, 326418, -7126962, 15644955, -15631533, 1736241, -1856500, 12768938, -2867428, -2901251, -3419331, 5355824, -7717520, 5899675, -6699075, -2837900, 11158862, 10989211, -3795677, --10209674, 6240588, 9806484, 9411884, -8745627, 7152731, -5884642, 5175436, 1939178, 1522566, --9356049, 9811853, -3345780, -13223667, 10919954, 8975945, -7709467, -2566780, -1132261, 1789928, --7387881, 10380936, -9762998, 2929168, -10705206, 9300215, -7476465, 7775502, -5807870, 9751723, --11068131, 11932493, -10848014, 5125507, -8821326, 8772471, -10209137, 7920457, -6080063, 10378252, --11773042, 12176232, -10335302, -21983790, -45426260, -49982144, 42490112, 10733660, -13156022, -67734320, --27228482, 37728068, 7690676, 27246198, 30393336, -10982768, -19103478, 889595, 7201587, 5575405, -5037997, -11997454, -8805757, -6673843, 31675, 18301930, 9901510, -914828, 4120484, -5310190, --8862665, -5691906, -4639639, 295279, 5413807, -4204773, 6986838, 7295002, -24871618, -11094974, --11003169, 13235479, 9245991, -885300, -11573326, -15709380, 13648332, 2957622, 9155797, 12671764, --23057532, -15413027, 4220342, 18519362, 9393093, -26310432, -16163573, -21388400, -10159208, 5424544, -4832375, -8850317, 9663676, -4034048, -9186398, 4042101, 8810589, -6643778, 2110440, -335544, --8202851, -834297, -2885144, -18718542, -18795850, -1246077, -20050518, -15142981, 658741, 5996848, --4350802, 22053584, 16383153, 9222369, 730144, -2218351, -9822053, 12171400, 6047314, 7059853, -6954089, -6302328, -2566780, -568009, 3567507, -11705396, -14076755, -2047089, 6274411, 818728, -7929047, 5385352, -7305203, 2324114, 4397510, 2951180, -2299955, 7771207, -9731322, -5949067, -18129594, 10269267, -11022497, -8446590, -5564667, -10008348, 11054172, -470836, 1672353, 4930623, -3363496, -217970, -306016, -7483981, 4823785, 2716567, 6590091, -3741990, -942745, 4103305, -17636210, -43859132, -119562760, -45428944, 27266064, 57630408, 135865920, 79868136, 21749714, 28464358, --23499376, -43932684, -96171832, -64838972, -49699752, -16244640, 19762218, 52981104, 41190884, 51434380, -49704584, 33699388, -11311870, -39169028, -33899640, -34845608, -27991912, -40399000, 12461848, -25531434, -1924682, 18824842, 34791384, 19636590, 32570884, 42917460, 855235, 12816182, 1003949, -645319, --23916526, -3158412, -21274584, -41620380, -65672196, -36594732, -19995220, 5314485, 5061082, 39090644, -54299660, 52166672, 62135292, 9049496, 40799504, 16158204, -3609920, -38183868, -37361384, -50787988, --66627292, -45459008, -51613160, -32715302, 261993, 16028281, 37202468, 59999084, 88428544, 70812200, -64216204, 34744136, -13167296, -13075491, -34616900, -73785928, -56622700, -93243736, -61241940, -27159226, --20604032, 29145648, 56052008, 76715632, 54221816, 41464152, 25283936, 28739774, 25337622, -4039417, --28968480, -27709518, -43621300, -48371532, -38409356, -26340498, -24399172, -23283018, 10753524, 22667764, -40219148, 47613472, 39157752, 34317324, 19684908, 672162, 1089848, 4420058, -28839632, -49107044, --20013474, -42891692, -48499844, -1661079, 12253005, 27064736, 28120224, 17882634, 29715804, 17179870, -23796266, -5028333, -393526, -20816632, -12393665, -11077258, -13642427, -15788300, -12594455, 2056753, --5181341, -15032, 14536317, 19968914, 12717935, 10924786, -2667712, -3567507, -76236, -367220, --5999533, -7295002, -1095217, -4362613, -4267587, -2720862, 178241, -4603668, -1415729, 8649527, -3157875, 3783866, 5685463, 4010963, 1215476, 197032, -997506, -1186485, -715112, -471373, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +815507, -2067490, -2163053, 1333587, -3695283, -53687, -7201587, 5168993, 6554120, 4579509, +6449967, -7733626, 628676, 1772748, -2756295, -2121177, -1883880, -9058086, -1522029, 5391258, +-9273908, -7535520, 4391067, 3980898, -5958194, -2075543, 3948686, 509491, 4800163, 2059437, +4999879, -3133716, 958851, 696858, -1324997, 2331094, 1831804, 3396246, 1426466, -1493575, +328028, 3794067, -1022202, -1719061, -638876, -4578435, -10112500, 6018323, 2921652, -3160022, +4439923, -1772211, 493384, -150861, 2064269, -2664490, -692027, 5981279, -5626407, -2252174, +1956895, 980863, -869194, -272730, 2621541, 304406, 2320893, -4006668, 4083440, 2105071, +-5228049, 4170950, 370978, 1514513, -623307, -1549946, -6102612, -1883880, -455803, 3142306, +-804770, 2571075, -1533303, 309775, 765578, 312459, 1821603, -319975, 126702, -217433, +-1235340, -558346, 243739, -658741, 88047, -25233, -280247, 1674500, 1679869, 878858, +700617, 613643, 217433, 11811, 224949, 97174, -253403, -739808, -836982, 11946988, +-6880538, 2092723, -7604240, 908386, 1771674, -7665980, -9692131, 2413772, -10515154, 2310693, +-2746632, -731218, -6451578, -940061, -7243999, -3726421, 23085, -7663296, 8131984, 2859911, +-12707198, 1200980, -705985, -2305861, -5443334, 2726231, 6583111, 125628, -492311, 6179921, +-3641059, 73551, -2320356, 4093641, -4808753, 1402844, 5774584, -5038534, 5048734, 1772211, +5461588, -475668, 1232656, -834297, -2318209, 7158637, -8902393, 2045478, -3946001, -1716376, +-1170379, -3244848, -2404645, -7096360, -4466766, -1115081, 4604742, -400506, 1721208, 6452652, +-163746, -5609228, -733903, 194884, 1738925, -2742337, -5906, -5517423, 102005, -2251637, +1805497, 2855617, 4197257, 1493038, -2393908, -3103114, 4119411, -1392643, -1910724, 763430, +2283312, 4755603, 563714, 1358820, -328028, 2784750, -559956, -2221572, -1148904, -1103807, +-117575, 1886028, 352724, -133681, -1023813, 1826972, -21475, -695785, -531502, -477815, +-551903, 864362, -384936, -99321, -1078037, -2876554, -9896678, -117038, -5964636, -1882269, +-972810, -6955700, -953483, -1620276, 3450469, 8112120, 8157754, 970126, -3489124, 3262565, +-7904888, -1130113, -3026341, 2755222, -11779485, 4158602, 1992328, -430034, -3391414, -5077188, +-2323577, -4188667, -3606162, 2203318, -791348, -4514548, -1320166, 914291, 7686918, -296890, +-7772817, 608275, 3342022, -97174, -2449205, 644782, 2921652, -8442832, -660888, -3671123, +5927592, 3611531, 1001801, -7805030, 878858, 3006477, 4782446, 4478577, -5133560, -2412161, +229244, -1603097, -1611687, 4172024, -2592013, 2553895, 697395, -3279745, -743029, -4505958, +5425618, 2039036, -5366562, -3699041, 903017, 2846490, -4257923, -5366562, -915902, 266825, +-3571802, 768262, -1467268, 1811403, -3404299, 5058935, 2707977, 3813931, 1088237, 503585, +3429532, 4642323, 540092, 1319629, -444529, 660888, 77846, -192737, 517544, 391379, +537408, -732292, 25770, 357556, -259846, 82678, 1546188, -899259, 352187, -1076963, +-864362, -721555, 158914, 587337, 394600, 54761, -1002875, -663036, -16843788, 5437429, +4862440, 8147016, -2122788, 5113159, -14529337, -3979287, 4542465, 530428, -7191386, -1881196, +-2399276, -12731357, -5164162, 1279363, -593242, -9080635, 5655935, 8039642, -8277476, 6263673, +-10837276, -3695283, -981400, 3714610, -68719, -4403952, 2960306, 1466731, -733903, 4823785, +-2352568, -3132105, -983548, -1794760, -3215320, 4743792, -3668439, 1331977, 3552475, -741419, +-2843268, -5333813, -657130, -3811247, -1170916, -4431333, -1206349, 9802726, 188442, 5953362, +-5493263, 4992363, -1578401, -8041790, -4747013, 4424353, -2929705, -4099010, 2917357, -4816806, +3982509, 1056025, -1488743, 5205501, 4704600, 2063195, -5195300, -5885716, -418759, 7792145, +1540283, 1165547, -4440460, 1134945, 2794413, -5977521, -2193118, 1918240, 4149475, 2045478, +3511136, -217970, 23085, 1278290, 155693, -689342, 202937, -528818, -762357, -2655901, +-2117419, 622770, -1277216, -774705, 879395, 381178, 641561, -185220, 1071594, -718333, +45097, -947577, 4295, -1145683, 557809, 173409, 766652, -1488743, -9048422, -8603356, +-5699959, 1022202, -1484448, 3468186, -3143916, -34360, 580894, -2596308, -1010928, 2118493, +-2574296, 9979893, -6614250, 4599373, -1766305, -727460, -4707821, -1325534, -687732, 7263864, +-5034239, 610959, 1371705, -7210713, -4426501, -4939750, -4206921, -8352638, -2908767, 2944200, +5588826, 3525095, -6679748, -9402220, -2101850, 241055, -4811437, 827855, -3284576, -4927401, +-11630235, -5868536, -8166344, 4632659, -2148021, 3755412, -4711579, -11339787, -6036577, 511638, +-2348810, -3752728, -1734093, -4494147, 5982890, 493384, 3462818, 4651450, 1141388, -242666, +-3965329, 125628, 5057324, -929860, -3830037, -5289789, 8355322, -7041599, -9812390, -6944962, +-4021163, -5472862, 6064494, 9707700, -7826504, -5413270, 1148904, 4684199, 7224135, 5703717, +4441533, 4381404, -1619203, -1985886, -2262911, -2341831, 1750736, -1453846, 439697, -1763084, +-2809446, -1174137, -2037425, 1409823, -1291175, -2508261, -1486059, -1468879, -2521146, -2781528, +-1759326, -737661, 497679, 445603, 1237488, 117575, -4293894, 457414, -701690, -1753957, +451508, -788127, -1330903, -2828773, -2342368, 32212, -40802, -980326, -1122597, -43487, +2309082, -18480708, 5698885, -1313723, 3266860, 10126996, 3974455, -2514703, 3426847, -7633231, +4712653, 5524939, -10069014, -2159295, -5099737, 5668820, 4937065, 7695508, 8934069, -11621108, +-5984500, 1904818, 9972914, -3794067, 4635881, -11111080, -3355980, -3903052, -2357400, -6730751, +1663763, -11001022, 7614440, -2167885, -1952063, 5555004, -332860, 1261110, 5913096, 151398, +4840428, 3233574, -1370095, -1917166, -653372, -7727183, -5657009, -7061463, -444529, 14652281, +3406446, 2826089, -342524, -2057289, -120796, 8752070, -1871532, 2732136, -16902844, 15546171, +-3767223, -2788508, 896574, 9517648, 3470334, -1605244, -5793911, 16658031, -3211025, -213138, +5343476, -4233227, -23622, 2378875, -3751654, 3281355, 3272765, 13754096, -6847252, -8633421, +-1581085, 4108673, -5177046, 1143535, 3563749, 1126355, -3022583, 1352378, 3654480, -2314451, +332323, -3950833, -1231582, -1170379, -3211025, 4213363, -3053722, -2607045, 1937030, -134755, +-3621194, -340376, 884226, 1547799, 185757, 1823214, -1307281, -1137093, -1063541, 1220308, +-1332514, 2179159, 249645, -938450, 1013612, 2275796, -51003, -1050120, 7998303, 4487167, +8900783, -3558381, -2114198, 5130339, -8207146, 7393250, 8436926, -4223027, -707059, -13249437, +632434, 4566624, 3696356, -2801929, -9012989, -18289044, 299037, -3104725, -8677981, 2030983, +5841156, -7937100, -3380139, -8657043, 4387846, 503048, -1285269, -2874407, -3751654, 9346386, +10902774, 4245039, 5197448, -2421825, -5466957, 15203647, 3784403, -2584497, -8919573, 6585259, +279710, 8745627, -765041, 10806138, 5408438, 7564511, 6398965, 3265786, 8414378, 10500121, +-294205, 1947768, -3343632, -100395, 5733782, 2405182, 3121904, -9270150, -3398930, -1948305, +-8071854, -7716446, -5080947, 4337917, 8927626, 11671037, 15267535, 3408594, 1344325, 12306692, +-4890357, -9254044, -3216931, -4679367, 7969312, 6518150, 2503966, -8761733, -2378338, 1583769, +1287417, -1688459, -4031901, 1259499, 1046898, 5099737, -1202591, -2785286, 603980, 1011465, +1261110, 121870, 90731, 1035624, 2345052, -1614908, -1581622, 184147, -179852, -2276333, +-508417, -2911451, 3240553, 1069447, -2189360, -58519, 2207076, -1107028, -168041, -1712618, +993748, 1186485, -744103, 2827699, 2149094, 14127758, -13378823, -6286759, -1789391, 5417565, +-12514998, 7927973, -12329777, 6081137, -28991, 6451578, 10211822, -4168266, 9327595, 10198937, +9698573, -5608154, 8182450, -8792335, -7007239, -1082332, -5413270, -78383, -4653597, 8014946, +-5917391, 1768990, -5841693, -10266582, -4778151, -2157147, 12427488, -10404558, 9790915, 4311611, +-14409615, 16546898, 4086662, 1851668, 11629161, 2069101, 535797, -6573448, -19864, -3668439, +13259101, 5599564, 9298604, -3611531, -2177012, 6397354, 11047193, -11527692, 11447698, 2093797, +-1843078, -2145336, -10848551, 5242008, -5111011, 2216740, 499290, -9843528, 3342558, 8343511, +-7558069, 5294084, 3481608, 11676405, 1257889, -783295, 7101729, 10211822, 847719, -5852430, +6871411, -7898982, -4099546, 2111513, -3183108, 2136746, -2548526, 1018444, 4430796, 3227668, +-3207804, 2820720, -1642825, 2274185, -2246805, 7110319, 734439, 6788733, -797253, 1702955, +-1416802, -587337, -2149094, 4302484, 1824287, -3544422, 3724274, 4311074, -459562, -592706, +2648921, -187905, -205622, 3588445, -92342, 880468, 2334852, 1514513, -539555, 2739652, +-2250563, -419296, 546535, 739271, 628139, -157303, -306016, -2733210, 1316408, 4057134, +-11404749, -8158827, 12411382, -15892990, 4009352, -8457864, 9449465, -10094784, 15433965, 5356361, +1496259, -13382044, 6826851, 11343545, 2997887, -6874632, -4473209, -3930432, 10524817, 5734318, +-14685567, 2088965, -10390063, -560493, 1189706, -8866960, 11642046, 11700028, -5306432, 2576981, +7926899, -9666898, -1474784, -2965138, -8019241, 17065516, -6199786, -3796751, -8589935, -14324790, +-2279017, 283468, -4960151, 2149631, -11874511, 1065689, 833224, -2359548, 9377524, -1935420, +-7304666, 3821447, -11811, -5440650, 4679367, 20234664, -4050691, 4836133, 1095217, -13704167, +-2239826, 12275553, 5515275, 12187507, -1253594, 7058779, -9695352, 4377109, 4274566, 1461363, +-8242042, 7644505, 2683818, -21330956, 1658394, -3825742, 14280229, -5451387, 11086384, 10310606, +8252243, -986769, 3162170, 522912, 824634, -1352915, -2362232, 5621576, 2244657, -34360, +-3711926, -5133023, -1214939, 2261837, 3615826, 2643016, 4641786, 210990, -1268626, -1870995, +-1508607, 1733019, 2770791, -204548, 2183454, 1493575, 393526, 2068564, -398895, 2161979, +-3504693, -4260608, -5699959, -208843, 2573222, 1238024, -2686502, -905701, -1887101, -2002529, +3458523, 1131187, 1529545, -24959128, 28223304, 3328600, 11141145, -20476256, 11180874, 14549202, +-16765942, 6389838, 8303783, 6423661, -10832981, 1422708, 1914482, -3656628, 6328098, 13032541, +-10459856, -8705362, -3182034, 11047730, 9556302, 13510893, -649077, 5706938, -10065256, -2637647, +-2612951, 2209224, 6353867, 17268990, 10285373, 6277632, 3286724, -573378, 8252780, -3054796, +-14816027, -2878702, 4359392, 4731980, -8669928, -6569153, -10737955, 2073396, -850404, 3769908, +-7038378, 12607340, 12328704, -10674604, 25381110, 1162862, -2329483, -145492, -5280663, -1143535, +-1622424, -10263898, 172872, 30065, 6739878, -21357262, 5234492, -7570954, 15516106, 18734110, +8112120, 7783018, 3503083, 1249836, 16916266, -3173981, -12504797, 10702522, -5630702, 2868501, +8358007, 15237470, 2143726, 1502165, -12197170, -532039, 3571265, 9671193, -4201015, 5252745, +2536178, -3704409, 9825811, 1656247, 4406637, -2864206, -903554, -2838437, 482110, 1127966, +-1495186, -87510, 2961380, -1635846, 3001109, 2017561, -2090039, -224949, 1395864, -887448, +241592, -2015413, -6623377, -1907502, -1005559, 6924024, 8578660, 838592, 1265942, -2467459, +-2864206, 718333, 940598, -3590056, -2779918, -1867774, -1618129, 2298344, -3965866, -196495, +-2913062, 10264435, 1964948, -7147900, 6655052, 9988483, 8675834, 5475010, 10350334, -12595528, +-8036421, 1397475, -11395085, -2847563, -1945620, 2500208, -2961380, -7403450, -9302899, -5599027, +4533875, 7790534, -13729400, 2866891, -1475858, -400506, -16535087, -14850923, -2624762, -11528229, +5381057, -13142063, 799938, 6972343, 10041097, -8975945, 11940009, 3016678, -1228361, -2685965, +17729624, -4996658, -923955, -14324790, -8067023, 11595338, -925029, 4361003, -13780403, -15093589, +-4150549, -8538932, -1515587, 608275, -5587753, -7167227, 4198868, -6657736, 548682, -9788230, +-5296769, -301185, -16078747, 1424319, 10532870, 1959579, 5519570, 11447698, 19687056, -19079318, +3441880, -11794517, -11436961, -6440304, -8695698, -5629092, -5140539, 19232864, 10594611, 10619844, +2199560, 3078418, -13964549, 623307, -4928475, 2172717, -6070937, 8478265, 11256572, 1043140, +-5116380, -3525631, -9635759, 813896, 5908265, 3216394, -2338073, 6043019, 2935610, 6400038, +-1394791, -1249836, 1054951, 4140349, -2686502, 1729798, -3948149, -5546951, 3959423, 1359357, +814433, 814433, -7470022, -4511863, -38655, 5670968, -4835060, 2803003, -6478422, -2239826, +-1034550, 2222109, 1559073, -2005213, -1579474, -8690329, 19815906, 21010444, 23088134, -17266306, +1203665, 12422656, 9773198, -10113037, -19287624, -2301029, -2920041, -15191299, -8800388, 28651190, +2208687, 1898912, 10695005, -1308354, 4545149, -4022774, -11439645, 7438884, 6225555, -15484431, +-21962852, -17047798, -13542569, -12920335, 1189706, 3672734, 6475737, -8615704, 8333311, 1941325, +-4238596, -9114994, -347355, 437013, -14010183, -11002632, 1561221, -2592013, 1864553, -8532489, +6800544, 2060511, -8010651, -17161616, -6799470, -5840082, -22774600, -7237020, 2081449, 11163694, +-1132798, 13232257, -2394444, -1192390, -19415936, -4190814, 7568269, 3558917, -32458678, 9217000, +2762738, -9111236, -5541582, -9501541, -10686416, -499827, 445603, -10355703, -3358665, 6487011, +9408126, 14811732, -11426224, 469762, 8359080, -453119, -24830816, -19833086, -272194, -5303748, +6162741, -257161, -6140193, -8949638, 4052839, -2630668, 3678103, 10058277, -316217, -5085242, +-8486319, -15567109, -5327907, 871342, -2605435, -2686502, 976031, 941672, 6849399, -3603478, +682900, 2516851, 1328756, -5670968, 610422, -1494112, -13516262, 1306207, -5022428, -6157910, +2156074, 1587527, -4115653, -1352915, 4827007, 1343788, 1263257, -5050345, -5672578, -2053531, +-450972, 227633, 3434900, 7945153, -6739878, 22556632, -19305342, -11885248, -3925063, -36501316, +-19067508, -100395, -23269596, 18067316, -8185134, -7541426, 2065879, 41372348, 19963008, 1278290, +8491687, -1925219, -11108933, -1107565, -17185774, -12436615, 5908802, 6001680, 7416872, -11943230, +15289010, 9358197, 17297980, -17589502, 2818036, 25642028, 2389076, 1046898, 5051419, -24598352, +6267431, -6220724, 4034048, -9909026, -23232014, -1428614, 9370545, 11429445, 2946885, -3635153, +1671279, -1073205, 7678328, -17544404, -25535192, 4554813, -9332964, 15222438, -6115497, -6353867, +19877646, 4466766, 8536248, 1575716, -16843788, -6913824, -2035278, 9063992, 26222922, 20184736, +-6053220, -23218594, -505732, -2685965, 8566312, -14323179, -17954574, -10197326, 8459475, -18185428, +-2867965, -15262166, 63351, 12263742, -408559, -22866406, -5058398, 3011309, 5975374, 2828773, +-14279693, -9622337, -15280420, 2343979, -3236795, -6643778, -5126044, -6640020, 1252520, -2780455, +-6366752, -1813013, 4426501, -42950, -247497, -7769596, -228707, -745177, -4978941, 390842, +9482751, 3168612, 1686312, -9829570, 3765076, -1102733, -1183264, 1518808, -285615, -214748, +-2071785, -5861020, -6568079, -5367636, 6553583, 5749351, -2744484, -14592151, -5457830, -5430986, +-1258425, -41510860, 16047608, 13171054, -6079526, -27430346, -6040335, -10557030, -11111617, 12123082, +14975477, -1513439, 4107599, -31166968, 11005317, -39012800, -9855876, -3364570, 7798050, 19668266, +31217432, 12975633, -18034030, 4229469, 21818434, 2932389, 6654515, 11860015, -18330384, -7048578, +-2872796, 5604933, -12906914, -6918119, -3897146, -9674414, -7385733, 13290239, 13028246, 3381750, +1106491, 22473416, -4195646, 10519986, -25336012, 16864190, 4835060, -22945862, 2374043, 7417946, +-21589726, -2738579, -21114596, 7125351, 8929774, 9552007, -14207752, -1165547, 14235669, -11784853, +192737, -1849520, 23481660, -13824963, 17306570, 8818642, -21827560, 19252728, -16064251, 12414603, +16297790, -16367583, 9300752, -13953812, -17418240, -26227218, -21911312, -23976118, -5715528, 4362076, +-7211787, 21100638, 21864068, -9158481, 19272056, -2876018, -4029753, 24551644, -5418101, -16322486, +11439109, -2381559, -12782360, -9774272, 9702868, 1802276, 5042829, 7745437, 1382443, 6389301, +9761387, -2508798, 10941966, 7597797, 5471789, 6300180, 938987, 3909494, 9302362, 7573638, +9430674, 1511829, 7835094, -1349694, 569083, 6922951, -3346853, -12123082, 5820218, 2075543, +40802, 378494, 5557688, -10708427, 5589900, 7757785, 6216429, -7048042, 6820945, -32802276, +-15469398, -16103443, 28835336, 943282, 10826002, -4606353, 40860708, 6510097, -27166742, 2065879, +30043296, -11030013, 6751689, -4880694, 2675228, -17447230, -23551990, 37554656, 26757646, -10200010, +20556250, 8115341, 26716308, 30354144, -8776229, -7088307, 27011050, 19807316, 2266132, -8455180, +-13310641, -13987098, 12545599, 23811836, 11241540, -4279398, 16040629, -8345122, 15227807, -6727530, +22171158, 39197484, 29880088, -31832686, 14639396, -5386426, -12920872, -376883, 11173357, 10775536, +71567576, -7178501, -686658, -11599633, -12633646, 13968307, 25890600, -6287296, 19694572, 16809428, +-2196339, 635655, -13864691, 14216879, 11966853, 38081328, 38737384, 47022376, 19566798, -11959336, +-9678172, -21556978, 21126408, -31903018, 23147726, -29944512, 17661980, -10540387, -17993766, 13070122, +-48506288, -38367480, 7030325, 7574175, -13859323, -13438953, 22671522, 11315628, -20798380, 3124589, +-4716948, -11375221, 3758633, 5866389, 1806034, 5944235, 6977711, 12258910, -5640903, 2413235, +-6826851, -12109123, -7393786, 2935073, 1076426, 16802448, 3601867, -4029216, -13573707, 2186138, +-5369783, -4343823, -6027987, 4722854, 10133975, 3614752, 8797704, 7390028, 11625403, -4850629, +8861054, 1202591, 2595234, -762357, 775242, -6789807, 8172249, 19503446, 10465225, -2021856, +-2152852, 15508590, 12999792, -11950747, 3837553, 7813083, -5992016, 22433152, 5067525, -52586504, +12059731, 6888591, -39119636, 2302639, -6713034, 1619740, 14326400, -1902134, -36158256, -6426345, +-11530913, -2032593, 25589952, 30720828, -17498234, -4416837, -14689862, 7556995, -27710592, -53739704, +-19263466, -16238734, 2807298, 868120, 24417962, -36745592, 17485348, -8560407, -4079145, 15066745, +7066832, 25523380, 5802501, 9810779, 27307402, -31255550, 38945152, 30910342, 16108275, 28987808, +-11296838, 10984379, -27211302, -5449240, -13711683, 24001888, -21338472, 5099200, -45788648, -56791816, +37853696, -1804423, 24412594, -17289390, 16149614, -11317776, 3479997, -6521371, -37211060, -11822434, +-24886652, -11872900, 13427678, 55043228, 19643570, -48721036, -11041824, 12786118, -11307038, -7384123, +-32171452, -16727287, 24790552, -9409736, 5976984, 4765266, -20062330, 12549358, -2958159, 849330, +-41140956, -12105902, -905701, -18928458, -10689100, 1413044, -27851252, 2750390, 6197101, -22669912, +-17741974, -31947578, -23730768, -2379412, -13156559, -6470905, 766115, -9291088, -9010305, -3927211, +-14067092, -6934225, 1774895, 9342628, -12410845, -4643934, -21228412, 7267622, 5178657, 12241731, +-8807904, 12732967, -27457726, -1869921, -34897, -2180770, 4158065, -4720169, 2871723, -12998182, +-13390097, 3850975, 3308199, -32236414, 17130478, 17114908, 30323006, -14668924, 11165841, -16872780, +-19628538, 8879308, 40237400, 65157876, -3975529, -4220342, 1447404, -1349694, -28916404, 45624364, +21946210, 24314884, 18744848, -13086765, 15882789, -25566330, -36870684, -6283001, 27740120, 18089328, +-13146895, -8437463, -1762547, 22480932, 1015760, 16413754, 16053514, 26602490, 8904004, -16580721, +-15770046, 15252503, -17762374, -13197898, 7913477, 29211146, 26903676, -30572650, -23664196, 15917149, +18931142, 57332444, -13228499, -31067110, -32244466, 27487790, -20616380, 25941066, 29272350, 58992988, +125030256, -27844810, -15879568, -46733004, -74512312, -23676008, -37502044, 4406100, 51884280, -7515656, +27497454, 39262444, 25706990, -14367739, -46141372, -75521096, 42256036, -2865280, 48056924, -24568824, +-65544960, 22999550, -38831872, -51652352, -26540214, -16362752, 16522739, 16365436, 29525216, -2080375, +-14323716, -2166274, -1177895, -26666378, -25928180, 13328894, -9167071, 26584236, 24131810, -11404212, +24024436, -18792630, 541703, 23789824, 2554432, -36718212, 9838159, -18428094, -3224447, -5838471, +-4938676, -27031988, -22236656, 4456566, 32223530, 34676492, -32350768, -3688303, 39342976, 37815576, +44560, 8093329, -35633196, -18763102, 5273146, 20973936, -30807800, 8035884, 23985782, 12215961, +9068823, 2893197, 15121506, -25233470, 4694936, -23002234, -63432372, 15969225, -26503706, 26326002, +3870839, 14697915, 12883828, -58030376, -41111964, -20365662, -12785581, -13492103, -23716272, -7380365, +-39400956, -25100326, 18953154, -25660282, 48831632, -36335960, 3738232, 10059887, -3861713, 4290136, +-2095407, 11662984, -11324218, -12212203, -2112587, 8737037, -1537598, 20936354, -19766514, 4452271, +30601642, 9797357, 4589173, 15573015, 1931662, -12475269, -7940858, 24821690, 5568962, -39260832, +-17403208, -31859530, -14499810, 42194296, 39355860, -40668508, -4498442, -46238544, -11142219, -3856881, +10660646, 23163296, -37868728, 25246892, -32239636, -5469641, -21842594, 48581448, -9825811, 34259880, +32057636, 71331888, -32869922, 29407642, 4787815, 27939300, 9760850, 21310018, -35756140, -32862942, +47662864, 2303176, -1799591, -33777772, 38481296, -13052406, 19740206, -35553204, 74673376, -40039296, +41539312, -50127100, 19789062, -37791416, 20855824, -34821984, 25789132, -22069690, 15146202, -12338367, +8338679, -18787798, -11599633, -8921184, -2346126, 6584185, 1148904, 5297842, 428423, 5202279, +-2842195, -9628780, -15175193, 6816650, 7529615, 2117956, 6896107, -5738077, 2681133, -4566087, +2818036, 25597468, -6494528, -18514530, 2578591, -10534481, -19695646, 6146635, -10773925, 7740605, +-9042517, 6408628, -17218524, 6849936, -22252226, 31101468, 4785668, -57204668, -25195888, -35458712, +1929514, -8322036, -77232104, -35095788, -20277078, -41168336, -25653840, -77829104, -65706556, -12037183, +27894738, -42905648, -25666724, -6378027, -36561984, -8515846, -3070365, -35390532, -9557913, 7046968, +1577864, -46920372, -26770532, -26840862, -14992657, -16732119, -4955319, -32635308, 26874148, 17453674, +38438348, 55988120, 48664664, 12287365, 51459612, 20509006, 9004399, -23156854, 17885318, 18611168, +14668924, -6197638, -17915382, -8414378, 12712029, 22761716, 117880208, 15800111, 24100672, 17142288, +48061220, 18474802, 42179800, 77001248, -37512244, -75856104, 9154723, 48088600, 86057184, 38024420, +-74822624, 9839770, -18871012, 108656768, 79860624, 97182224, 89071720, -77888696, -51504176, 63425392, +76182520, -22580790, -44769128, -53954988, 120296664, 80039400, -5525476, -104097656, 24522116, -4274566, +-23455354, 28296318, 7315940, -9382356, -22682796, -739808, 15927886, 44486196, 31411780, -27064736, +-11237782, -7518341, -6230387, 24954834, 17882096, 19268298, -272194, 10153840, 40736692, 27593554, +5207111, 16091095, -11943230, 20159502, 26041998, 34547644, 44014824, 34377992, 26060250, -163209, +-6766721, -9570261, -3775276, -20331302, -11695196, -9976135, -25400436, -32472100, -37142876, -63242856, +-36386428, -23783918, -38579008, -70343512, -49387828, -41647760, -48752172, -57642220, -61092688, -21170430, +-23972896, -33595772, -19364934, -21106544, -14496588, -19844896, -19596326, -19148038, -18945638, -55890948, +89661200, 72392208, -62634044, 14002130, -1418413, 10076530, -2406256, -6205691, 23117124, -23205708, +22583474, -9205726, 124554, 8892730, 7312719, 8019778, -18790, -13176423, -8354249, 14382235, +-11798275, -1564442, 13962939, -7642895, -7870528, -11106249, -20156818, -20383378, 14937896, -7488276, +5619965, -12861816, 2647311, -27196270, -4794794, 7320772, 17552458, -11202885, 3920768, 11835319, +19225884, -4713727, 15945066, -12992276, 50530828, -18873696, 17519708, 2152316, 9991168, -9621264, +13518410, -5546951, 36074504, -6063957, 11293617, -25289304, 33127082, -17550846, -1156957, -5105106, +4989679, -10077067, 19988778, -23081692, 18802830, -21187610, 27380416, -28686086, 34670588, -23186918, +-12135430, -14657113, -6988986, 1059783, -22429392, 14442364, -13194676, 12614319, 1290638, 17551384, +6991133, 12015171, 22058416, 9032316, -7310035, 5480915, 5597416, -3511673, 4190814, -7241315, +8161512, -4265977, 326418, -7126962, 15644955, -15631533, 1736241, -1856500, 12768938, -2867428, +2901251, -3419331, 5355824, -7717520, 5899675, -6699075, -2837900, 11158862, 10989211, -3795677, +-10209674, 6240588, 9806484, 9411884, -8745627, 7152731, -5884642, 5175436, 1939178, 1522566, +-9356049, 9811853, -3345780, -13223667, 10919954, 8975945, -7709467, -2566780, -1132261, 1789928, +-7387881, 10380936, -9762998, 2929168, -10705206, 9300215, -7476465, 7775502, -5807870, 9751723, +-11068131, 11932493, -10848014, 5125507, -8821326, 8772471, -10209137, 7920457, -6080063, 10378252, +-11773042, 12176232, -10335302, -21983790, -45426260, -49982144, 42490112, 10733660, -13156022, -67734320, +-27228482, 37728068, 7690676, 27246198, 30393336, -10982768, -19103478, 889595, 7201587, 5575405, +5037997, -11997454, -8805757, -6673843, 31675, 18301930, 9901510, -914828, 4120484, -5310190, +-8862665, -5691906, -4639639, 295279, 5413807, -4204773, 6986838, 7295002, -24871618, -11094974, +-11003169, 13235479, 9245991, -885300, -11573326, -15709380, 13648332, 2957622, 9155797, 12671764, +-23057532, -15413027, 4220342, 18519362, 9393093, -26310432, -16163573, -21388400, -10159208, 5424544, +4832375, -8850317, 9663676, -4034048, -9186398, 4042101, 8810589, -6643778, 2110440, -335544, +-8202851, -834297, -2885144, -18718542, -18795850, -1246077, -20050518, -15142981, 658741, 5996848, +-4350802, 22053584, 16383153, 9222369, 730144, -2218351, -9822053, 12171400, 6047314, 7059853, +6954089, -6302328, -2566780, -568009, 3567507, -11705396, -14076755, -2047089, 6274411, 818728, +7929047, 5385352, -7305203, 2324114, 4397510, 2951180, -2299955, 7771207, -9731322, -5949067, +18129594, 10269267, -11022497, -8446590, -5564667, -10008348, 11054172, -470836, 1672353, 4930623, +3363496, -217970, -306016, -7483981, 4823785, 2716567, 6590091, -3741990, -942745, 4103305, +17636210, -43859132, -119562760, -45428944, 27266064, 57630408, 135865920, 79868136, 21749714, 28464358, +-23499376, -43932684, -96171832, -64838972, -49699752, -16244640, 19762218, 52981104, 41190884, 51434380, +49704584, 33699388, -11311870, -39169028, -33899640, -34845608, -27991912, -40399000, 12461848, -25531434, +1924682, 18824842, 34791384, 19636590, 32570884, 42917460, 855235, 12816182, 1003949, -645319, +-23916526, -3158412, -21274584, -41620380, -65672196, -36594732, -19995220, 5314485, 5061082, 39090644, +54299660, 52166672, 62135292, 9049496, 40799504, 16158204, -3609920, -38183868, -37361384, -50787988, +-66627292, -45459008, -51613160, -32715302, 261993, 16028281, 37202468, 59999084, 88428544, 70812200, +64216204, 34744136, -13167296, -13075491, -34616900, -73785928, -56622700, -93243736, -61241940, -27159226, +-20604032, 29145648, 56052008, 76715632, 54221816, 41464152, 25283936, 28739774, 25337622, -4039417, +-28968480, -27709518, -43621300, -48371532, -38409356, -26340498, -24399172, -23283018, 10753524, 22667764, +40219148, 47613472, 39157752, 34317324, 19684908, 672162, 1089848, 4420058, -28839632, -49107044, +-20013474, -42891692, -48499844, -1661079, 12253005, 27064736, 28120224, 17882634, 29715804, 17179870, +23796266, -5028333, -393526, -20816632, -12393665, -11077258, -13642427, -15788300, -12594455, 2056753, +-5181341, -15032, 14536317, 19968914, 12717935, 10924786, -2667712, -3567507, -76236, -367220, +-5999533, -7295002, -1095217, -4362613, -4267587, -2720862, 178241, -4603668, -1415729, 8649527, +3157875, 3783866, 5685463, 4010963, 1215476, 197032, -997506, -1186485, -715112, -471373, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 8075613, -5168993, 141734, 270583, 6361384, 1582696, -3165928, 2160369, 4234301, -2147484, -3509525, --12622909, 675384, -4248260, 8429947, -4185446, 4228932, 3401614, -435402, 2748242, 4667556, -1267552, 1095217, -2306398, -2765422, -2153926, -3485366, 3036542, 1823214, -1656784, 2752000, --1905892, -2782065, -3343632, -1598802, -2644626, 236223, 30602, -478352, 5761162, -3325915, -4709432, -1691143, -1215476, 3186329, -1978906, 1007707, -1980517, 3493956, -1043677, -9844065, -2914135, 366146, 1190243, 4983236, 2542621, 381178, -1148367, -3237869, 8419747, -4439923, -3258270, 1745904, -3520263, 3583613, 1553704, -4097399, 3242700, -4225711, 212064, -407485, -3690988, 647466, 3857954, -1465121, -8750459, -1826972, -2141578, -4101694, -3748970, -3633542, -2966212, 1366873, 1010391, 1870995, 1779190, 409096, 818191, -974421, 562104, -704912, --396211, -2077154, -80531, -654446, 1557463, -103616, -565862, -270046, 113280, -1045825, -318901, -420370, 535797, -291521, 47782, -1209033, -222801, -1524177, -1043677, 15338402, --7602092, 830002, -481573, -469762, 3471944, -2784750, -11052025, -10186052, 4760435, -3237332, --966905, 2573222, 537945, 2539936, 2833605, -4865124, 2587718, 1781338, -3459059, 3991635, -6019934, -3974455, -1329292, 274341, -6560026, -2978023, 623844, 7772280, -1293322, -468151, --6536940, 3816615, -33823, -5861557, -2530273, 1996086, -923955, 1101122, -5083094, -154082, -302795, -2088428, 5347235, 1330366, 1167694, 5170604, -584652, 6725382, -2315524, -8627516, -3427384, 3329137, -3069828, -1353989, -1098975, 1031866, 338766, 2360622, -2014340, 1550483, --4733591, -244276, 3033321, -4517232, -572841, 2604361, 791885, -2377801, 1497333, -1808181, -440234, 4367445, 1538135, -6078990, 7303055, 2727304, 2662343, -657130, 4187056, 4667019, --2076617, -318364, 1003412, 1181116, 1438277, 1955821, -234076, 139050, 1445257, -234613, -181999, 903554, 2260227, -389231, 2302639, -108985, 534187, 1173063, 285078, -695785, --218506, 796716, 766115, -154619, -1067299, -3751117, -8999567, -1111323, 923955, 9847823, --3808026, 8434242, 2085744, -331249, 486405, 7540889, -1802276, -2117419, -2232846, 5301601, -10817949, 2800319, -7523172, -10201621, -14488535, 1850057, -3811784, -6119792, -3371013, -9465034, --80531, -4416837, 675384, 4479114, 4730370, -5416491, -4844186, -3462281, 570694, -8039105, --905164, 2440078, -3652333, -1363652, 808528, 3177202, -4522064, 1126892, 10535555, -483721, --542777, -3940096, 4371203, -2006287, 360240, 3311957, 4348118, 6454262, -1065152, 913217, --1984275, -133681, -1136556, 813359, 10126996, -11325292, 227633, 2145336, 5974837, -2542084, --3007551, -710817, -2840047, 8063264, -4489852, -10679973, -756451, -3220689, -4471061, 2591476, --10542534, 3840238, -1143535, -2971044, 195958, 7383049, -2217814, -2844879, -2881923, 3513283, --3355443, -956704, 615254, -354872, 1270774, 67646, 490700, 2155537, 170188, 525597, --559420, 1722282, 383326, -404801, -2006287, -1127429, -155156, -1102733, 2054068, 1200443, --1174674, 1482301, 155693, 174483, -1088774, 519154, -475668, -5369, -16508244, 6166500, --5163088, 6920266, -6218576, -564788, 4792110, -9549323, -1638530, 2910377, -2597382, 13910325, --5835250, -1765232, -5566278, -4659503, 7151121, 7945690, 3080565, -9370008, -11300059, 10448045, -1757715, -10599979, 3962644, 382252, 5018670, -3150359, 4789426, -6347425, 3097208, 10222022, -4235912, 4371740, 2331630, 167504, -2595771, 2124935, 807991, -6995965, 127775, -2229088, --5117991, -5135171, -1931662, 4026532, -7348689, 986769, -5311801, -565862, -798864, 2409477, -4383014, 9223979, 3281892, -76236, 3991635, -4965519, -7252589, -154619, 1714229, 729608, -8806830, -2026151, -1051193, -2837363, -1219234, 1220308, 4291746, -1188095, 1809792, -4389994, -7136625, -1897839, -2456185, -1674500, 2333241, -3893388, 151398, 4362076, -281320, -1298154, -682900, 3455838, 2786360, -583042, 2253784, -1929514, 1440962, -1183800, 584116, 2459406, --842887, 1026497, 1104880, -1750199, 1755031, 1005022, 424665, -777926, -1508070, -418222, -1962263, 1226750, -622233, 721555, -324270, 3092913, -235149, -929324, -8236137, -1909113, --5340255, -530965, 10976326, 7021735, 4910758, -817118, -9630927, 1362578, -6331319, -10208600, --3378529, 7375533, -5759551, -9050570, 2384244, 794569, -4501126, 985158, 5175436, 1437203, --12069932, -3409130, 7609609, 8961986, 4476430, -9999758, -3619047, 4580046, -1692217, -2140504, -664109, 3368865, 554051, 1254667, 10292352, 34897, 6231461, 4833986, -64961, -4613332, --99858, -2715493, 6141803, -3489661, -5832566, 27917, 9627706, 554051, 9564355, 5162014, -939524, 6185290, -1027571, 13274670, 1082869, 6573985, 7486665, 705448, -6167573, -934692, --7381438, 3787624, -5286568, -2958696, -4873714, -3209414, -2333241, 2439542, 832150, 3665755, --140660, -4212289, -3666292, 1385127, 6840809, -2012729, 1699733, -7321309, 2332704, 6345278, -9735617, -3340411, -715112, 1619740, -3336116, -244276, 3219078, -975494, 5906654, 396748, -1350230, 155156, 287763, 2182917, -1431298, -927713, -760746, -437013, 601832, 736587, --1105417, 970663, -333934, -1172526, -1429687, 490700, -1357747, -892816, -1703491, 833761, -1184337, -244813, 3328063, -2155537, 587337, -234076, -1886028, 3166465, -914291, -449898, -9999758, -14951318, -2758443, 12517145, -6220724, 2287070, -9667971, 4254165, 17607218, -2384244, -923418, -745714, -12453258, 1004486, -802085, 18690088, -5907728, -914828, 8159901, -5151277, -11573326, -7809861, -1178969, -11807939, 13339632, 185220, -5267241, 171262, 4878009, -6206228, -9268539, -985158, 8211978, -56371, 4294431, -12904229, -8322573, -6018323, -1951526, 7784628, --11714523, 6257768, 4814122, 1636919, -4861903, -7047505, 16064251, 3201361, -1844152, 6245956, --5703717, 3389803, -7587060, -7423314, -3119220, -4981089, 17347372, 5196374, -3475166, -5153424, --6650757, 5470715, 4485557, 1652489, -6138045, -736050, -2503429, 7432978, 643171, 6015102, --14055280, 7641284, -1259499, 389231, -1591285, 2480881, -6222871, -2864743, -9759776, -3169686, -3505767, 5950141, 6239514, 2336462, 2251637, 1481227, -3516505, 2092723, 1392106, -240518, --2371359, -3866008, 2036888, 1957431, -3007014, 1551020, 171799, -2430415, 1569274, 466004, --1087701, -560493, 115427, 496069, -1845225, 1275068, 653909, -2799782, -699006, -1427540, -190052, 2007897, 1323387, -277025, 44023, -1287953, 153545, -1187022, 6329171, 3114925, -5215701, 1541356, 56371, -1989107, -8012799, -2496450, -5171141, 3144453, -308701, 12030740, --10127533, -13042742, -3310346, 4041564, -4085051, -3172907, 10225243, 2034204, -5686537, -6548752, --6790880, 11180337, -5679021, 7546795, -3686693, 8259222, -8302709, 1789928, 12687333, 4323959, --17376364, 3958349, 348966, -2255395, -1586454, 1743757, -2115808, 1646583, -2874944, 1351304, --750009, -7786776, 7714298, 7922067, -2420751, 8779987, -7572028, -1343788, -2215666, -3624416, -9659918, -7028177, -12429635, -6979859, 2281165, -10139881, -9456981, -4744865, -3225521, -6510097, --587337, 8242042, 8677981, 1294396, 9359271, 2900177, 1214939, 7088307, -7674033, -1381369, --45097, -6307160, -109522, -6111202, 7298223, -2151242, -1388348, 6068789, -1167694, -1962800, --1310502, 7253663, -938987, 2506650, -7147363, -2557653, 3924526, -4645544, 290984, 90194, -741956, -3549254, -2472828, -1885491, 68183, -1961726, -2334852, 694174, -396211, -2097018, --949188, 231391, -264141, -678605, -744640, -1221918, 332323, -3849365, -2698850, -2604361, --2588255, -3758, -188442, -940598, 883690, 19327352, -9545565, -9188546, 6222871, 15707769, -3053185, 14147085, 8074002, 12848395, 5691906, -2403571, -5835250, 4601521, -9605157, -7306276, -10721312, 8968429, 22405234, -577673, 3116536, -8299488, 8653285, 3920768, -9987946, -2367601, -12688944, -41339, -13982803, -5647345, -7892003, -2677375, 7798050, 7164543, -5304285, -2570001, -9727027, -9424769, 4328254, 8199630, 9795747, -5226439, 8432095, -3558917, -12736189, 4504347, -11689827, -3119757, 3375308, 2863133, -3962644, 1438277, 3503083, -3622805, 1304060, 9479530, --5574331, -2932926, 8737574, -1860795, -1765232, -14474040, -5128191, -8732742, -14377940, -9666898, -7218230, -4694936, -6146635, 12477417, 12456479, -3124052, 13397077, 5395016, 8801462, -2446521, --6928319, 5818607, -7184944, -14323716, -8645769, -3659312, 7080254, 3297998, 11869142, 2129767, --2561411, -1888712, -8053, 2095944, -3693672, 275952, -2148021, -272730, 2080375, -321049, -330176, 3881577, -1399623, -653372, 3811784, -2763812, -1443109, -1815161, 1121523, -2028298, -1385127, 900333, 586800, 2057289, 2558190, 1216550, 4624069, 619012, 3156264, 1132261, -2368138, 2790655, -2415919, 2233920, 2322504, -1628866, -540629, -179315, -3375308, 1031866, --9757629, -10438381, 14139032, -2354716, 32300302, -13302051, -6255083, -740882, 7881802, -4502200, --4399657, -13305272, -15397458, 6956774, 1336809, 21259552, 6886443, -2165737, -2427194, 14124000, -14413910, -11905112, 8651138, -11371463, 2990371, -4893579, -5866389, -3484829, 2419677, -1843078, -7484518, 3761318, 8375186, -1035087, -4001836, -7856569, -1526861, 9167071, 815507, -12154221, --1535451, 2972654, -5200669, 9650792, 8137890, 1708323, 2827699, -26550950, -10181220, 9299678, --627602, 14927696, 4156455, 16824998, -1893544, -9074192, 8968965, -5064840, 6116034, 1112397, -24480240, 20272246, 2384244, 5754183, -3344169, 8078297, 8534637, 9263171, 9977209, 16268799, --305480, 2945811, -6234145, -5392869, 5078262, -7561827, -18843632, -13932874, -337155, 11735461, --5915244, -10615549, -6130529, -5706401, -649077, -12678207, -523449, 2403571, -98784, -1670742, --1264868, 1363652, 2732673, -300648, 2055679, -9451076, -5840619, -2985002, -6751689, 646393, --2450279, -3873524, -2658048, -1547799, 3826816, 1626182, -3629247, 1236414, 8486319, 4435091, --1818919, -2974802, -3896072, -2193655, -3146064, -6591701, 2420214, -2503429, -559956, 4895726, -1554241, -889595, 904628, -28055264, 22111028, -651224, 2501819, -7783018, 12390444, -26637924, --17080012, -5396627, -6851547, -660888, -23883776, 4656282, 475131, -657667, -10914586, -11110544, -4500589, 15194521, 2342905, -20316270, -4413079, -16638166, 13117904, 8458401, 647466, -7375533, --3493419, -3773129, 10808822, -1558536, -230318, -2359011, -14718316, 7628399, 10299332, -6179921, --3302830, 8005819, -16018617, -11680164, -17671106, -5998459, 4434017, -11278047, -5388574, -491237, --18298172, 5578626, 11275363, 19962472, 2868501, -1993402, 1219771, -13146358, -10308995, 15282031, --1097364, -5822365, -3619584, -23420456, -12568148, 4574140, -4952098, -2738042, -1831804, 15311022, --2662880, -14564234, 1162326, 11336566, -297427, -7146289, -146029, 778463, -6020471, -10213432, -8016557, -18774376, -9293772, -143345, 9069897, -11475616, 7254200, 4804995, 6609418, 7042673, --7209103, -1823751, 8643085, 1653026, -5285494, 4959077, 7153805, -6687801, 2486249, 6417755, -6061273, 9521406, 643708, -2908230, -1625108, 1563905, 132070, 4188130, 3529926, 327491, --862752, -3036005, -1030255, 2100776, 4256850, -7031399, 916976, -1329292, 2924336, 6799470, -348429, 4765803, -2524367, 3170760, 3899830, 5738613, 4479651, 5602248, -396748, 3224984, --1011465, 2741263, 14862197, 13649406, 4966056, 23115514, -10306311, -4798016, 3764539, -6029061, --1759326, 7564511, 24768540, -3971234, 5051419, -132070, -1496259, -386010, 27315992, -13200582, -14188961, -121870, -17865990, 5956583, -17722108, -10823854, 10290742, -9325985, 7292318, 418222, -1018444, 12256763, 9833864, -14674830, -16627966, -12494597, -4156455, 4797479, 4854924, 1830193, -3344169, -19993610, 3112778, -10719165, -25176562, 17211008, -4918275, 16187195, 17311940, 1032940, -6497749, -9183177, -11183021, -19826642, 4611185, 18246632, 3260417, -7955890, 1125818, -3984656, -2838974, -10657424, -8706436, -10640781, 1893007, -1252520, -3439732, 11778948, 10600516, 6400575, -17140140, 1974074, -17929340, 23284092, -16920024, -5170604, -4204773, -4434554, 19517942, -3052648, --27828166, 23778550, -9212168, -5611912, 6554120, 6083285, 18331994, 11739756, 7706782, 9003325, -8133595, 6180458, 406948, 7750269, 9289477, 2528125, 183073, 9968619, -1697049, 1231045, --9026948, -2099702, -2834679, -4636417, 820339, -644782, 6025302, 4432406, 1835562, -648003, -2936147, 1335735, 2157684, 4123706, -1178432, -1438814, 907849, -1412507, 3059627, 1508607, -1464047, 2489471, 1435593, 9247601, 6742562, 2024540, 21172042, 23928874, 5592585, -44973140, -1632088, 12733504, -14840723, 9071508, 18011482, 914291, 4905390, 11395622, 8753680, 3427384, -16190953, 3711389, -2223719, 30430918, 11326903, 4026532, 13157632, -9980967, 16136192, -11225971, --961536, -1204202, -3700651, -16587164, 5609764, -11709155, 21671868, -1844152, -4234301, 31911070, -4272419, 4748623, 10611254, 1299228, 6124624, -7036230, -13849122, -1470489, 9378598, -16311749, -19077170, 17319992, 12715788, 3446711, 7577396, -11228118, -11775727, -18579492, -8247948, -9965398, --9604084, 4581657, -1802813, -18182744, -8111583, 16247861, -261993, -14971182, 8580271, -694174, --10281615, -24389508, 1722819, -37037652, 21630530, -12509092, 19675246, 1107028, 5496485, 799938, --7295002, 10050760, 33265058, 3215320, 9490267, -5651103, -25906706, 2464238, -2785823, 19134616, -11049877, -4291209, -905164, -3749507, -2037425, 6628745, -7406134, 6237903, -862215, -6332393, --6554657, 7194070, -8030515, -7723962, -11137387, -2053531, -8004746, 2724083, 7024419, 685584, --2017024, -4986457, 10251550, -9385577, 2537789, 1471026, 875100, -5405753, 4088809, 10318122, --433792, -4762582, -1212255, 9449465, 9556302, -7385733, 9150428, -389231, -2374580, 1738388, --575526, 10409390, 2637110, 12400107, 9224516, 24508694, -33712808, 13282723, -19748260, 16815870, --8387535, -14176076, -4072166, -16325708, -6869800, -3662533, 5877663, 7486665, -4772246, 23529978, --1122597, -4085588, -3177739, -21369610, -2377801, 56371, -17972290, 5725192, -15329812, -19337554, --6267431, 11588359, -31987842, -21736292, -14527190, 1607928, -22437446, -19075024, -15448460, -7786776, --6283001, -2983392, -15176804, 16149614, 2742337, -1619740, -11338177, -11668889, 21859236, -19096498, --13067975, 5706938, 5798206, 7822209, -11107322, -15439334, -6540699, -2905546, 7126425, -11102490, --4478041, -4572530, -13242458, -22557706, -28493350, 26871462, -29523068, -1687385, 2054068, -5193689, --5486284, -26413512, 10179072, -6371047, -27688580, -680752, -6103686, 25983478, 6417755, 18478024, -17601850, -5299453, 6877854, -2945274, -5055177, 12986907, -3314104, 7443715, -10009958, 734976, --10080288, 8545911, 6701223, 1183264, 6133750, -2669859, -967978, 6476811, 3105798, -6408628, -4706748, 10589242, -1644973, 2416993, -5786395, -13637595, -1433982, -1229434, -454730, -9474698, --2048699, 1482838, -1363115, -5061619, 6456947, -1207960, -3632469, -11033234, -11126113, 143881, -6135898, 3586298, 2389613, -761283, 8053601, 9096741, -4053912, 1955821, 2247879, -611496, -2763812, -29996052, 34702264, 5495411, 3499862, -6017249, 17619030, 217433, 29011430, -7911330, -19900730, 10729365, -28617368, 12403866, 4687420, 13586055, -2348273, -7619809, -11406896, -4192962, -13962939, 30758408, 3238405, -4491999, -19476602, 7350300, -21065204, -3325915, 21221970, -19186692, -9664, 1355599, -3335579, -7237557, -8187282, 34093988, -7388418, -8364986, -4158602, 7738994, -11407433, 4294431, 536871, -6937446, -129923, 5111011, 20679194, -4744865, 29596620, 17327508, -8796630, -7113540, 25792352, 29358786, -2449205, -7763691, -1570884, -9528385, 2887829, -9433896, -14770393, 5060545, 21293910, 16498580, -26154740, -29410326, 35261144, 26250304, 4129611, -4968741, --14038637, -19359028, -7617662, 19903416, -18742164, -20205136, -2890513, -5426155, -32413582, -7172596, -7146826, -12498355, 1692754, -33823, 1673964, 2684892, 5340255, -9488656, -5927592, -9750113, --3598646, 22549, 1405528, -5284421, -2596308, -872415, -16027207, -5239860, -7661685, -3434363, --482110, 1501628, 603980, 2768643, -1089848, 689879, -8471286, 4940286, -7305203, -8251169, -5879810, 2668785, -15057618, -1509144, -4765266, 7520488, 14201309, 439160, -12259447, 9909563, --2866891, 2697776, 3330210, -3804804, -2945274, 1048509, -6606197, -8424578, 15343771, -12607340, --4096862, -2668249, 3018825, 464930, -18937584, -54842976, 27453968, -26381836, 10731513, 39107824, -5962489, -16411607, 11279658, 13620415, -5703717, -12418361, -2586107, -27022324, 8907762, -28085864, --17058000, 11256572, 1154273, 4846334, -25374130, -5178120, -18318572, -15561740, -22601192, -7900593, -7731478, -13471702, -13664975, 13259101, 1827509, -1130650, 4214974, -26004416, -1606855, -20228222, -17299054, 4756140, -49475876, 12441983, 26504244, -5684389, 15807627, 13289703, 8974871, 7182259, -25312390, 19830938, 722628, -18141404, -3841312, 20042464, 13011067, -16816944, 1198833, -19641422, --6332930, 1299765, 14220100, 19028852, -35002908, -27697170, -15500000, 2919504, -10414759, -3875671, -32541894, 5327370, 7694971, 25323664, -10302553, 5201206, -6482717, 25910464, -13220983, 1028645, -2572149, 19185618, -5368709, -2073396, 7019587, 7853348, -1016297, 3816079, 12537010, 464930, --409633, -551366, 12206834, -6231998, -3974992, 2900714, 5272609, 3547643, 1595580, 5719286, --2697776, -23622, -5613523, -208306, -4181688, -670552, -5752035, 9316321, -7090454, -10449119, -9780714, 6369437, 6726456, -7399155, -9458592, -75699, -16946330, -4716411, -8747238, -8946417, -3415036, -183610, -9058086, 2943663, 3646964, -1096290, -5373004, -5262946, 3897683, 2333241, -8035884, 18126372, 17517024, -30652644, 6363531, -6629282, -8096550, -7147363, 20492900, 10878078, --15029164, -8576513, 15624017, -28187334, 1547262, 10222022, 15650861, -3366181, 3422015, -32883880, --178241, -14576045, 10937134, 4025995, 18183280, -28916404, -14638322, -4216048, 3506841, -2496987, -5585068, 2060511, 15705622, 29710436, -18875308, -24306830, 6340983, -25328496, -7530689, 10608032, --18475876, -17883170, 1428614, 11026792, 15402290, 10984916, -6977711, -1544041, -32316408, -21729850, -28561532, -19853486, 38576860, -16368120, 7796977, 5681705, -377420, -28377386, 35512400, -16545825, --3448322, -6366216, 13816373, 26840324, -27192512, -15378667, 31742492, -23510650, -134218, -8843338, -6412923, 36887864, 114354, -2654290, -22887344, 28237262, -9279814, 7392713, 9217537, -17750026, --21589726, 2175938, 12292196, -6353867, 6248104, -50899656, -23884314, -7209640, -26108032, -12723841, -4234838, 16995722, -3671660, -4534949, -13407277, 461709, -1383516, -9600863, -3469797, 6088116, -379568, 8123394, 3628711, 7711614, -10148471, -1287417, -2229088, 10688563, 8214125, -6165963, -19209242, 7295002, -7924752, 11901354, 3076270, -980326, -6270116, 4627828, -4578972, -3962107, -8494372, 941672, -3957812, -3189550, 7087770, -1784022, 6388764, -1256815, 11749957, 2728378, -1561221, 1737851, 17754858, -19897510, 5756330, 16793322, 16594680, 37465000, -23553064, 34431144, --5883569, -22265110, -21807160, 5815386, 14461155, -9744744, -4434017, -15267535, -6211597, 29208462, --20336134, -1717987, 23483270, -7358890, 14072460, -9130027, -4304094, 24939802, -736050, 1455457, -24018530, 16747151, 5981816, -2745021, 20303384, 27730456, -27927488, 26074746, -24656870, 13315472, --17766670, 3946001, 21453362, 7502234, -48325900, 21715354, 13870060, 52076, 24672976, -38241852, --7318088, 26368952, 22366580, 3942243, 35087200, -18386754, 508417, -4248797, -5305895, 15234249, -6298570, 26442504, 21936008, -16148540, 14583025, -30176978, -9335111, 2672544, -1464047, -2119566, --4864588, -47356848, -26189636, -36517960, -24888798, 27588722, -16931298, -3868155, 3190624, 45016624, --10645076, -15506979, 35989140, 22264036, -991064, 29351270, 4463545, 5778879, -13554917, 328028, --11333882, -11744051, -6156836, 9711458, -11464341, -5726802, 5597953, 2433099, 9029632, -3312494, --1496259, 11926050, 6785512, 998043, -9194988, -7122130, -1137093, -2545842, 6928319, 11918534, --862215, 2390149, 2682207, -4366371, 28890098, 9268539, 2045478, 1509144, -9460202, 8039105, --16900696, -892816, 14531485, -648003, -3873524, 10926934, 6014565, 3616363, -284542, -9027484, -6231998, 7235410, 2222109, -11940009, 11514270, 29552060, -16320339, 11400454, 14586783, -21307332, -2728378, -26204132, 9960029, -2808909, -13966697, 20740934, 605590, 32358284, -1990717, -24241332, -40967544, -7379291, 4083977, 5640366, -38459820, 11562052, 33097018, 11788611, -14395657, -25196962, -2617246, 6124624, 28303834, 18239116, -9231495, -5523865, -22056804, 193810, 32027034, -43550968, -13211856, 30418032, -27381490, 10031433, 2844342, 10534481, 32039920, 10681584, 12367358, -5950677, --31457952, 32556388, -6045167, -16670379, 68305552, 33590404, 17429514, 2973191, 1553168, -32159104, --26351772, -11971148, 20084340, -697932, -18644454, -13182865, 25334402, -15489263, 17452062, 9882183, --12503187, 18619756, 8542153, -27076548, -13508746, -15893526, 4463008, 16916266, -33838436, 11107322, --34672736, -43840340, -27547920, 42005316, -14525579, 8664560, -9822053, -14622216, -2092723, -17425756, --12048457, -9292699, 2149094, -16707960, 1968169, 9738301, -9127, -14716169, -10900090, 5096516, -1664300, 18625126, 2507187, -21524228, -8342974, -12358232, 17643188, -3638911, -7132330, -17053704, --215285, 10149545, 4660577, 11569031, -5891085, -1976759, 3441880, 11778411, 7549479, -401043, --6718940, 8746701, -8228084, -936303, 4785668, -7746511, -204011, 13166222, -430034, 2374043, --14571750, -10340134, -11089069, 6505802, -11798275, 41917808, 69837776, -11564199, -2267743, -57142392, --19145354, -41991896, -27991376, 39072928, 2817499, 10683194, -32337882, 10592463, -28390270, -63919312, -9381819, 30857730, -2489471, 4085588, 33158758, -43782896, 50151260, 25088514, 15686831, -24713778, -33732672, 65077880, -12869333, 20206210, 49373332, 41783588, 73546480, 16107738, 26433376, 20141786, -17941152, 63279364, -16378858, -7345468, 23318452, 13986024, -6808597, 34889628, 2145336, 7490423, --20547124, -56196424, 2244657, 37814504, 5785321, 22992034, -40636296, 2746095, -54053236, 328565, --58094264, 4239670, 40852656, -4929549, -17275970, -55199992, 72691248, 13458280, 4937065, 75487808, --840203, -16918414, -12631499, 4166118, 15114527, -3867081, 335007, -5672578, -39707508, 23876260, -9224516, -24625194, -15214922, 20002200, -23965380, -41282152, -20234664, 9358197, 39832064, -41324564, -33170032, -1346472, 17719962, -6994354, 14469745, -9706626, -1415729, 3868692, 4090956, 13604846, -12137041, 2756832, 25451976, -1079111, 10466835, 13629542, 7825431, 6091874, 6077379, 22182970, -16350940, 8120173, -8590471, -3397856, 19051938, -25183004, 9772661, -14962592, 3623342, -5472325, -17178796, 20004348, 40274444, 22683332, 37988448, 21940840, 7952669, 40088152, 41401876, 39583492, -22552874, -6658810, 23600308, 26312580, 16106127, 31643172, 23734526, 98247, 7155416, 5467494, -5153961, 9323300, 6672769, -8026220, -8174397, 430034, 6585796, -1926830, -21905944, -72838352, -3676492, 98816464, 14500883, -19930796, -18915036, -44733696, -29227790, 1556926, 61727808, 11077794, --41000832, -2719788, 16908750, 4295504, 1357747, -3788161, 10834055, -29113972, -10910828, 15314243, -34238404, 34732328, -32383516, -12163884, 2583423, 4932770, 8771934, -37012416, 3700114, 6467147, --9750113, 27260158, -195421, 31409632, 46779712, 22762252, 9754944, 20760798, -26423712, 24523726, --21327196, 36479840, 63733020, 21420612, -34307124, -29189672, 28933048, 11023034, 54339928, 41293964, -12552042, -9653476, -12078522, 2212982, 2917894, -18322868, 21188684, 19043884, 3608846, 49616536, -33660196, -3894999, 24027120, 27296128, 12536473, 27314382, 1232656, -45952392, -5683316, -10547903, --10696616, 53723600, 24508694, 9322227, 42252816, 25707526, 26958436, 33753076, 11475079, -32925220, --16655346, -18254, -539018, -11094437, -9826885, -19627464, 12766253, 9035001, 19862076, -8451422, -22153978, 7069516, 22935126, 16203301, -5025649, -10789495, 3477313, 7094212, 258235, 3561065, -16803522, 2575907, 26265336, 36094904, 10102300, -1970316, 2614561, 26246546, 5849209, -6976101, --6675990, 20987894, -1012539, -5149666, -3848828, 7658464, 14176076, 29327110, -14855218, 3385508, --9627169, 3466039, 1142461, 24202140, -12349642, 12560632, 13973139, 9532143, -10471667, 4462471, -16254304, 3314641, 477278, 17004850, 2146410, 10798085, 5934034, 2928631, -3047816, 4225711, --2214593, 5015448, 1114007, 5290326, 901406, 9165997, 2126009, 4663798, 1585917, 7167227, -1376537, 7495792, 1595580, -526134, -14556718, -69439960, -15044734, 38685308, 20892332, 84694608, -4583267, -12350178, -38033008, -74446816, -81748264, -13673565, 35172560, 39511016, 25324200, -41345504, --54573464, -468151, -6723235, 21676700, 56847652, 28869160, -5381057, -34214248, -46319612, -29198262, -1860795, -28612536, 11072426, -23972896, -11807939, 37783900, 31343060, 27759448, 10886668, -39133596, --10883984, -37452652, -28683940, -15182709, 21994528, -4352950, 23363548, 57309896, 60016264, -25272662, -6912213, -44560824, -30288110, -21428128, -3831111, 7981123, 34821448, 36822364, 51210504, 36068060, -13092671, -25684978, -23324894, -5952288, 16485695, -42178728, 3080029, 48491256, 39017092, -10623065, -52867288, 46732464, 26651882, 48841832, -93347360, 21747566, -26499412, -29281476, 16081968, -15953119, --1284732, 93679144, 79765592, 27713276, -24553254, -2753611, -37397892, -7951058, -50310712, -18499498, --8393440, 18810346, 61791156, 31678068, 13025025, 10321343, -9853729, -31667330, -39782672, -609885, --26227754, 20338280, -2193118, -919123, 23776938, 18556944, 7415798, 19222126, 7203197, 30465814, --21725018, -1313723, -23961086, 9117679, -20819854, -20136954, 3498251, -6757594, 16798154, 28609850, -1962263, -28447180, -46036680, -14965814, -26616450, 1995549, 12173011, 20769924, -17689896, -7483981, -23580444, 2032593, -119969176, -136030736, -146262960, -147783376, -200384384, -11873974, -71760848, -23181012, -26607860, 66992364, 94001800, 96944392, 198101616, 212397408, 172939008, 128635880, 136284688, 129933496, -50126564, -19303730, -89222040, -89418000, -137203264, -44578540, -74321728, -55431920, -5118528, -116489712, --33435246, -104045584, -28242094, -119557392, -112658064, -52023864, -92994096, -9478456, -46922516, -43421584, --69514048, -46044732, -105008728, -74268576, -39382164, -36158792, -55503324, -34037616, -3990562, -44966160, -15251966, 67266704, -52278340, 79570176, 47782584, 106202728, 106757320, 93149248, 114941376, 97045320, -160286032, 159140352, 126995744, 169804752, 145689056, 222382672, 219070176, 258062032, 200934672, 216196848, -235676128, 212816160, 254544464, 188563024, 275626304, 220218544, 84031032, 107686640, 28484224, 42661912, --148963424, -125099512, -139563888, -148647200, -156631552, -202496976, -190563936, -209574000, -230017504, -270531392, --226011376, -207048560, -230041136, -250996272, -299143392, -240052160, -265689360, -267551760, -202892640, -228866464, --131945688, -163920112, -112076632, -104183560, -55062556, -40372156, -57016764, -9896678, 27023934, 129907192, -123240864, 89353040, 101184064, 108689520, 147529984, 150953072, 163422976, 172185776, 148242400, 150448944, -110693120, 156531696, 160251136, 121903520, 85893440, 66139812, 96290480, 95058360, 74155832, 44241920, -24610700, 37218040, -9754408, 4849555, -17558900, -14202920, -71130024, -65409132, -47492136, -33187750, --43352864, -33563020, -15937550, -13494787, -17284022, -32502702, -29576756, -15161235, -19100794, -13125420, --10730976, 1491964, 4895726, 316754, -4364761, -1374926, 435402, -1043140, -1068910, -1057099, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +5168993, 141734, 270583, 6361384, 1582696, -3165928, 2160369, 4234301, -2147484, -3509525, +-12622909, 675384, -4248260, 8429947, -4185446, 4228932, 3401614, -435402, 2748242, 4667556, +1267552, 1095217, -2306398, -2765422, -2153926, -3485366, 3036542, 1823214, -1656784, 2752000, +-1905892, -2782065, -3343632, -1598802, -2644626, 236223, 30602, -478352, 5761162, -3325915, +4709432, -1691143, -1215476, 3186329, -1978906, 1007707, -1980517, 3493956, -1043677, -9844065, +2914135, 366146, 1190243, 4983236, 2542621, 381178, -1148367, -3237869, 8419747, -4439923, +3258270, 1745904, -3520263, 3583613, 1553704, -4097399, 3242700, -4225711, 212064, -407485, +3690988, 647466, 3857954, -1465121, -8750459, -1826972, -2141578, -4101694, -3748970, -3633542, +2966212, 1366873, 1010391, 1870995, 1779190, 409096, 818191, -974421, 562104, -704912, +-396211, -2077154, -80531, -654446, 1557463, -103616, -565862, -270046, 113280, -1045825, +318901, -420370, 535797, -291521, 47782, -1209033, -222801, -1524177, -1043677, 15338402, +-7602092, 830002, -481573, -469762, 3471944, -2784750, -11052025, -10186052, 4760435, -3237332, +-966905, 2573222, 537945, 2539936, 2833605, -4865124, 2587718, 1781338, -3459059, 3991635, +6019934, -3974455, -1329292, 274341, -6560026, -2978023, 623844, 7772280, -1293322, -468151, +-6536940, 3816615, -33823, -5861557, -2530273, 1996086, -923955, 1101122, -5083094, -154082, +302795, -2088428, 5347235, 1330366, 1167694, 5170604, -584652, 6725382, -2315524, -8627516, +3427384, 3329137, -3069828, -1353989, -1098975, 1031866, 338766, 2360622, -2014340, 1550483, +-4733591, -244276, 3033321, -4517232, -572841, 2604361, 791885, -2377801, 1497333, -1808181, +440234, 4367445, 1538135, -6078990, 7303055, 2727304, 2662343, -657130, 4187056, 4667019, +-2076617, -318364, 1003412, 1181116, 1438277, 1955821, -234076, 139050, 1445257, -234613, +181999, 903554, 2260227, -389231, 2302639, -108985, 534187, 1173063, 285078, -695785, +-218506, 796716, 766115, -154619, -1067299, -3751117, -8999567, -1111323, 923955, 9847823, +-3808026, 8434242, 2085744, -331249, 486405, 7540889, -1802276, -2117419, -2232846, 5301601, +10817949, 2800319, -7523172, -10201621, -14488535, 1850057, -3811784, -6119792, -3371013, -9465034, +-80531, -4416837, 675384, 4479114, 4730370, -5416491, -4844186, -3462281, 570694, -8039105, +-905164, 2440078, -3652333, -1363652, 808528, 3177202, -4522064, 1126892, 10535555, -483721, +-542777, -3940096, 4371203, -2006287, 360240, 3311957, 4348118, 6454262, -1065152, 913217, +-1984275, -133681, -1136556, 813359, 10126996, -11325292, 227633, 2145336, 5974837, -2542084, +-3007551, -710817, -2840047, 8063264, -4489852, -10679973, -756451, -3220689, -4471061, 2591476, +-10542534, 3840238, -1143535, -2971044, 195958, 7383049, -2217814, -2844879, -2881923, 3513283, +-3355443, -956704, 615254, -354872, 1270774, 67646, 490700, 2155537, 170188, 525597, +-559420, 1722282, 383326, -404801, -2006287, -1127429, -155156, -1102733, 2054068, 1200443, +-1174674, 1482301, 155693, 174483, -1088774, 519154, -475668, -5369, -16508244, 6166500, +-5163088, 6920266, -6218576, -564788, 4792110, -9549323, -1638530, 2910377, -2597382, 13910325, +-5835250, -1765232, -5566278, -4659503, 7151121, 7945690, 3080565, -9370008, -11300059, 10448045, +1757715, -10599979, 3962644, 382252, 5018670, -3150359, 4789426, -6347425, 3097208, 10222022, +4235912, 4371740, 2331630, 167504, -2595771, 2124935, 807991, -6995965, 127775, -2229088, +-5117991, -5135171, -1931662, 4026532, -7348689, 986769, -5311801, -565862, -798864, 2409477, +4383014, 9223979, 3281892, -76236, 3991635, -4965519, -7252589, -154619, 1714229, 729608, +8806830, -2026151, -1051193, -2837363, -1219234, 1220308, 4291746, -1188095, 1809792, -4389994, +7136625, -1897839, -2456185, -1674500, 2333241, -3893388, 151398, 4362076, -281320, -1298154, +682900, 3455838, 2786360, -583042, 2253784, -1929514, 1440962, -1183800, 584116, 2459406, +-842887, 1026497, 1104880, -1750199, 1755031, 1005022, 424665, -777926, -1508070, -418222, +1962263, 1226750, -622233, 721555, -324270, 3092913, -235149, -929324, -8236137, -1909113, +-5340255, -530965, 10976326, 7021735, 4910758, -817118, -9630927, 1362578, -6331319, -10208600, +-3378529, 7375533, -5759551, -9050570, 2384244, 794569, -4501126, 985158, 5175436, 1437203, +-12069932, -3409130, 7609609, 8961986, 4476430, -9999758, -3619047, 4580046, -1692217, -2140504, +664109, 3368865, 554051, 1254667, 10292352, 34897, 6231461, 4833986, -64961, -4613332, +-99858, -2715493, 6141803, -3489661, -5832566, 27917, 9627706, 554051, 9564355, 5162014, +939524, 6185290, -1027571, 13274670, 1082869, 6573985, 7486665, 705448, -6167573, -934692, +-7381438, 3787624, -5286568, -2958696, -4873714, -3209414, -2333241, 2439542, 832150, 3665755, +-140660, -4212289, -3666292, 1385127, 6840809, -2012729, 1699733, -7321309, 2332704, 6345278, +9735617, -3340411, -715112, 1619740, -3336116, -244276, 3219078, -975494, 5906654, 396748, +1350230, 155156, 287763, 2182917, -1431298, -927713, -760746, -437013, 601832, 736587, +-1105417, 970663, -333934, -1172526, -1429687, 490700, -1357747, -892816, -1703491, 833761, +1184337, -244813, 3328063, -2155537, 587337, -234076, -1886028, 3166465, -914291, -449898, +9999758, -14951318, -2758443, 12517145, -6220724, 2287070, -9667971, 4254165, 17607218, -2384244, +923418, -745714, -12453258, 1004486, -802085, 18690088, -5907728, -914828, 8159901, -5151277, +11573326, -7809861, -1178969, -11807939, 13339632, 185220, -5267241, 171262, 4878009, -6206228, +9268539, -985158, 8211978, -56371, 4294431, -12904229, -8322573, -6018323, -1951526, 7784628, +-11714523, 6257768, 4814122, 1636919, -4861903, -7047505, 16064251, 3201361, -1844152, 6245956, +-5703717, 3389803, -7587060, -7423314, -3119220, -4981089, 17347372, 5196374, -3475166, -5153424, +-6650757, 5470715, 4485557, 1652489, -6138045, -736050, -2503429, 7432978, 643171, 6015102, +-14055280, 7641284, -1259499, 389231, -1591285, 2480881, -6222871, -2864743, -9759776, -3169686, +3505767, 5950141, 6239514, 2336462, 2251637, 1481227, -3516505, 2092723, 1392106, -240518, +-2371359, -3866008, 2036888, 1957431, -3007014, 1551020, 171799, -2430415, 1569274, 466004, +-1087701, -560493, 115427, 496069, -1845225, 1275068, 653909, -2799782, -699006, -1427540, +190052, 2007897, 1323387, -277025, 44023, -1287953, 153545, -1187022, 6329171, 3114925, +5215701, 1541356, 56371, -1989107, -8012799, -2496450, -5171141, 3144453, -308701, 12030740, +-10127533, -13042742, -3310346, 4041564, -4085051, -3172907, 10225243, 2034204, -5686537, -6548752, +-6790880, 11180337, -5679021, 7546795, -3686693, 8259222, -8302709, 1789928, 12687333, 4323959, +-17376364, 3958349, 348966, -2255395, -1586454, 1743757, -2115808, 1646583, -2874944, 1351304, +-750009, -7786776, 7714298, 7922067, -2420751, 8779987, -7572028, -1343788, -2215666, -3624416, +9659918, -7028177, -12429635, -6979859, 2281165, -10139881, -9456981, -4744865, -3225521, -6510097, +-587337, 8242042, 8677981, 1294396, 9359271, 2900177, 1214939, 7088307, -7674033, -1381369, +-45097, -6307160, -109522, -6111202, 7298223, -2151242, -1388348, 6068789, -1167694, -1962800, +-1310502, 7253663, -938987, 2506650, -7147363, -2557653, 3924526, -4645544, 290984, 90194, +741956, -3549254, -2472828, -1885491, 68183, -1961726, -2334852, 694174, -396211, -2097018, +-949188, 231391, -264141, -678605, -744640, -1221918, 332323, -3849365, -2698850, -2604361, +-2588255, -3758, -188442, -940598, 883690, 19327352, -9545565, -9188546, 6222871, 15707769, +3053185, 14147085, 8074002, 12848395, 5691906, -2403571, -5835250, 4601521, -9605157, -7306276, +10721312, 8968429, 22405234, -577673, 3116536, -8299488, 8653285, 3920768, -9987946, -2367601, +12688944, -41339, -13982803, -5647345, -7892003, -2677375, 7798050, 7164543, -5304285, -2570001, +9727027, -9424769, 4328254, 8199630, 9795747, -5226439, 8432095, -3558917, -12736189, 4504347, +11689827, -3119757, 3375308, 2863133, -3962644, 1438277, 3503083, -3622805, 1304060, 9479530, +-5574331, -2932926, 8737574, -1860795, -1765232, -14474040, -5128191, -8732742, -14377940, -9666898, +7218230, -4694936, -6146635, 12477417, 12456479, -3124052, 13397077, 5395016, 8801462, -2446521, +-6928319, 5818607, -7184944, -14323716, -8645769, -3659312, 7080254, 3297998, 11869142, 2129767, +-2561411, -1888712, -8053, 2095944, -3693672, 275952, -2148021, -272730, 2080375, -321049, +330176, 3881577, -1399623, -653372, 3811784, -2763812, -1443109, -1815161, 1121523, -2028298, +1385127, 900333, 586800, 2057289, 2558190, 1216550, 4624069, 619012, 3156264, 1132261, +2368138, 2790655, -2415919, 2233920, 2322504, -1628866, -540629, -179315, -3375308, 1031866, +-9757629, -10438381, 14139032, -2354716, 32300302, -13302051, -6255083, -740882, 7881802, -4502200, +-4399657, -13305272, -15397458, 6956774, 1336809, 21259552, 6886443, -2165737, -2427194, 14124000, +14413910, -11905112, 8651138, -11371463, 2990371, -4893579, -5866389, -3484829, 2419677, -1843078, +7484518, 3761318, 8375186, -1035087, -4001836, -7856569, -1526861, 9167071, 815507, -12154221, +-1535451, 2972654, -5200669, 9650792, 8137890, 1708323, 2827699, -26550950, -10181220, 9299678, +-627602, 14927696, 4156455, 16824998, -1893544, -9074192, 8968965, -5064840, 6116034, 1112397, +24480240, 20272246, 2384244, 5754183, -3344169, 8078297, 8534637, 9263171, 9977209, 16268799, +-305480, 2945811, -6234145, -5392869, 5078262, -7561827, -18843632, -13932874, -337155, 11735461, +-5915244, -10615549, -6130529, -5706401, -649077, -12678207, -523449, 2403571, -98784, -1670742, +-1264868, 1363652, 2732673, -300648, 2055679, -9451076, -5840619, -2985002, -6751689, 646393, +-2450279, -3873524, -2658048, -1547799, 3826816, 1626182, -3629247, 1236414, 8486319, 4435091, +-1818919, -2974802, -3896072, -2193655, -3146064, -6591701, 2420214, -2503429, -559956, 4895726, +1554241, -889595, 904628, -28055264, 22111028, -651224, 2501819, -7783018, 12390444, -26637924, +-17080012, -5396627, -6851547, -660888, -23883776, 4656282, 475131, -657667, -10914586, -11110544, +4500589, 15194521, 2342905, -20316270, -4413079, -16638166, 13117904, 8458401, 647466, -7375533, +-3493419, -3773129, 10808822, -1558536, -230318, -2359011, -14718316, 7628399, 10299332, -6179921, +-3302830, 8005819, -16018617, -11680164, -17671106, -5998459, 4434017, -11278047, -5388574, -491237, +-18298172, 5578626, 11275363, 19962472, 2868501, -1993402, 1219771, -13146358, -10308995, 15282031, +-1097364, -5822365, -3619584, -23420456, -12568148, 4574140, -4952098, -2738042, -1831804, 15311022, +-2662880, -14564234, 1162326, 11336566, -297427, -7146289, -146029, 778463, -6020471, -10213432, +8016557, -18774376, -9293772, -143345, 9069897, -11475616, 7254200, 4804995, 6609418, 7042673, +-7209103, -1823751, 8643085, 1653026, -5285494, 4959077, 7153805, -6687801, 2486249, 6417755, +6061273, 9521406, 643708, -2908230, -1625108, 1563905, 132070, 4188130, 3529926, 327491, +-862752, -3036005, -1030255, 2100776, 4256850, -7031399, 916976, -1329292, 2924336, 6799470, +348429, 4765803, -2524367, 3170760, 3899830, 5738613, 4479651, 5602248, -396748, 3224984, +-1011465, 2741263, 14862197, 13649406, 4966056, 23115514, -10306311, -4798016, 3764539, -6029061, +-1759326, 7564511, 24768540, -3971234, 5051419, -132070, -1496259, -386010, 27315992, -13200582, +14188961, -121870, -17865990, 5956583, -17722108, -10823854, 10290742, -9325985, 7292318, 418222, +1018444, 12256763, 9833864, -14674830, -16627966, -12494597, -4156455, 4797479, 4854924, 1830193, +3344169, -19993610, 3112778, -10719165, -25176562, 17211008, -4918275, 16187195, 17311940, 1032940, +6497749, -9183177, -11183021, -19826642, 4611185, 18246632, 3260417, -7955890, 1125818, -3984656, +2838974, -10657424, -8706436, -10640781, 1893007, -1252520, -3439732, 11778948, 10600516, 6400575, +17140140, 1974074, -17929340, 23284092, -16920024, -5170604, -4204773, -4434554, 19517942, -3052648, +-27828166, 23778550, -9212168, -5611912, 6554120, 6083285, 18331994, 11739756, 7706782, 9003325, +8133595, 6180458, 406948, 7750269, 9289477, 2528125, 183073, 9968619, -1697049, 1231045, +-9026948, -2099702, -2834679, -4636417, 820339, -644782, 6025302, 4432406, 1835562, -648003, +2936147, 1335735, 2157684, 4123706, -1178432, -1438814, 907849, -1412507, 3059627, 1508607, +1464047, 2489471, 1435593, 9247601, 6742562, 2024540, 21172042, 23928874, 5592585, -44973140, +1632088, 12733504, -14840723, 9071508, 18011482, 914291, 4905390, 11395622, 8753680, 3427384, +16190953, 3711389, -2223719, 30430918, 11326903, 4026532, 13157632, -9980967, 16136192, -11225971, +-961536, -1204202, -3700651, -16587164, 5609764, -11709155, 21671868, -1844152, -4234301, 31911070, +4272419, 4748623, 10611254, 1299228, 6124624, -7036230, -13849122, -1470489, 9378598, -16311749, +19077170, 17319992, 12715788, 3446711, 7577396, -11228118, -11775727, -18579492, -8247948, -9965398, +-9604084, 4581657, -1802813, -18182744, -8111583, 16247861, -261993, -14971182, 8580271, -694174, +-10281615, -24389508, 1722819, -37037652, 21630530, -12509092, 19675246, 1107028, 5496485, 799938, +-7295002, 10050760, 33265058, 3215320, 9490267, -5651103, -25906706, 2464238, -2785823, 19134616, +11049877, -4291209, -905164, -3749507, -2037425, 6628745, -7406134, 6237903, -862215, -6332393, +-6554657, 7194070, -8030515, -7723962, -11137387, -2053531, -8004746, 2724083, 7024419, 685584, +-2017024, -4986457, 10251550, -9385577, 2537789, 1471026, 875100, -5405753, 4088809, 10318122, +-433792, -4762582, -1212255, 9449465, 9556302, -7385733, 9150428, -389231, -2374580, 1738388, +-575526, 10409390, 2637110, 12400107, 9224516, 24508694, -33712808, 13282723, -19748260, 16815870, +-8387535, -14176076, -4072166, -16325708, -6869800, -3662533, 5877663, 7486665, -4772246, 23529978, +-1122597, -4085588, -3177739, -21369610, -2377801, 56371, -17972290, 5725192, -15329812, -19337554, +-6267431, 11588359, -31987842, -21736292, -14527190, 1607928, -22437446, -19075024, -15448460, -7786776, +-6283001, -2983392, -15176804, 16149614, 2742337, -1619740, -11338177, -11668889, 21859236, -19096498, +-13067975, 5706938, 5798206, 7822209, -11107322, -15439334, -6540699, -2905546, 7126425, -11102490, +-4478041, -4572530, -13242458, -22557706, -28493350, 26871462, -29523068, -1687385, 2054068, -5193689, +-5486284, -26413512, 10179072, -6371047, -27688580, -680752, -6103686, 25983478, 6417755, 18478024, +17601850, -5299453, 6877854, -2945274, -5055177, 12986907, -3314104, 7443715, -10009958, 734976, +-10080288, 8545911, 6701223, 1183264, 6133750, -2669859, -967978, 6476811, 3105798, -6408628, +4706748, 10589242, -1644973, 2416993, -5786395, -13637595, -1433982, -1229434, -454730, -9474698, +-2048699, 1482838, -1363115, -5061619, 6456947, -1207960, -3632469, -11033234, -11126113, 143881, +6135898, 3586298, 2389613, -761283, 8053601, 9096741, -4053912, 1955821, 2247879, -611496, +2763812, -29996052, 34702264, 5495411, 3499862, -6017249, 17619030, 217433, 29011430, -7911330, +19900730, 10729365, -28617368, 12403866, 4687420, 13586055, -2348273, -7619809, -11406896, -4192962, +13962939, 30758408, 3238405, -4491999, -19476602, 7350300, -21065204, -3325915, 21221970, -19186692, +9664, 1355599, -3335579, -7237557, -8187282, 34093988, -7388418, -8364986, -4158602, 7738994, +11407433, 4294431, 536871, -6937446, -129923, 5111011, 20679194, -4744865, 29596620, 17327508, +8796630, -7113540, 25792352, 29358786, -2449205, -7763691, -1570884, -9528385, 2887829, -9433896, +14770393, 5060545, 21293910, 16498580, -26154740, -29410326, 35261144, 26250304, 4129611, -4968741, +-14038637, -19359028, -7617662, 19903416, -18742164, -20205136, -2890513, -5426155, -32413582, -7172596, +7146826, -12498355, 1692754, -33823, 1673964, 2684892, 5340255, -9488656, -5927592, -9750113, +-3598646, 22549, 1405528, -5284421, -2596308, -872415, -16027207, -5239860, -7661685, -3434363, +-482110, 1501628, 603980, 2768643, -1089848, 689879, -8471286, 4940286, -7305203, -8251169, +5879810, 2668785, -15057618, -1509144, -4765266, 7520488, 14201309, 439160, -12259447, 9909563, +-2866891, 2697776, 3330210, -3804804, -2945274, 1048509, -6606197, -8424578, 15343771, -12607340, +-4096862, -2668249, 3018825, 464930, -18937584, -54842976, 27453968, -26381836, 10731513, 39107824, +5962489, -16411607, 11279658, 13620415, -5703717, -12418361, -2586107, -27022324, 8907762, -28085864, +-17058000, 11256572, 1154273, 4846334, -25374130, -5178120, -18318572, -15561740, -22601192, -7900593, +7731478, -13471702, -13664975, 13259101, 1827509, -1130650, 4214974, -26004416, -1606855, -20228222, +17299054, 4756140, -49475876, 12441983, 26504244, -5684389, 15807627, 13289703, 8974871, 7182259, +25312390, 19830938, 722628, -18141404, -3841312, 20042464, 13011067, -16816944, 1198833, -19641422, +-6332930, 1299765, 14220100, 19028852, -35002908, -27697170, -15500000, 2919504, -10414759, -3875671, +32541894, 5327370, 7694971, 25323664, -10302553, 5201206, -6482717, 25910464, -13220983, 1028645, +2572149, 19185618, -5368709, -2073396, 7019587, 7853348, -1016297, 3816079, 12537010, 464930, +-409633, -551366, 12206834, -6231998, -3974992, 2900714, 5272609, 3547643, 1595580, 5719286, +-2697776, -23622, -5613523, -208306, -4181688, -670552, -5752035, 9316321, -7090454, -10449119, +9780714, 6369437, 6726456, -7399155, -9458592, -75699, -16946330, -4716411, -8747238, -8946417, +3415036, -183610, -9058086, 2943663, 3646964, -1096290, -5373004, -5262946, 3897683, 2333241, +8035884, 18126372, 17517024, -30652644, 6363531, -6629282, -8096550, -7147363, 20492900, 10878078, +-15029164, -8576513, 15624017, -28187334, 1547262, 10222022, 15650861, -3366181, 3422015, -32883880, +-178241, -14576045, 10937134, 4025995, 18183280, -28916404, -14638322, -4216048, 3506841, -2496987, +5585068, 2060511, 15705622, 29710436, -18875308, -24306830, 6340983, -25328496, -7530689, 10608032, +-18475876, -17883170, 1428614, 11026792, 15402290, 10984916, -6977711, -1544041, -32316408, -21729850, +28561532, -19853486, 38576860, -16368120, 7796977, 5681705, -377420, -28377386, 35512400, -16545825, +-3448322, -6366216, 13816373, 26840324, -27192512, -15378667, 31742492, -23510650, -134218, -8843338, +6412923, 36887864, 114354, -2654290, -22887344, 28237262, -9279814, 7392713, 9217537, -17750026, +-21589726, 2175938, 12292196, -6353867, 6248104, -50899656, -23884314, -7209640, -26108032, -12723841, +4234838, 16995722, -3671660, -4534949, -13407277, 461709, -1383516, -9600863, -3469797, 6088116, +379568, 8123394, 3628711, 7711614, -10148471, -1287417, -2229088, 10688563, 8214125, -6165963, +19209242, 7295002, -7924752, 11901354, 3076270, -980326, -6270116, 4627828, -4578972, -3962107, +8494372, 941672, -3957812, -3189550, 7087770, -1784022, 6388764, -1256815, 11749957, 2728378, +1561221, 1737851, 17754858, -19897510, 5756330, 16793322, 16594680, 37465000, -23553064, 34431144, +-5883569, -22265110, -21807160, 5815386, 14461155, -9744744, -4434017, -15267535, -6211597, 29208462, +-20336134, -1717987, 23483270, -7358890, 14072460, -9130027, -4304094, 24939802, -736050, 1455457, +24018530, 16747151, 5981816, -2745021, 20303384, 27730456, -27927488, 26074746, -24656870, 13315472, +-17766670, 3946001, 21453362, 7502234, -48325900, 21715354, 13870060, 52076, 24672976, -38241852, +-7318088, 26368952, 22366580, 3942243, 35087200, -18386754, 508417, -4248797, -5305895, 15234249, +6298570, 26442504, 21936008, -16148540, 14583025, -30176978, -9335111, 2672544, -1464047, -2119566, +-4864588, -47356848, -26189636, -36517960, -24888798, 27588722, -16931298, -3868155, 3190624, 45016624, +-10645076, -15506979, 35989140, 22264036, -991064, 29351270, 4463545, 5778879, -13554917, 328028, +-11333882, -11744051, -6156836, 9711458, -11464341, -5726802, 5597953, 2433099, 9029632, -3312494, +-1496259, 11926050, 6785512, 998043, -9194988, -7122130, -1137093, -2545842, 6928319, 11918534, +-862215, 2390149, 2682207, -4366371, 28890098, 9268539, 2045478, 1509144, -9460202, 8039105, +-16900696, -892816, 14531485, -648003, -3873524, 10926934, 6014565, 3616363, -284542, -9027484, +6231998, 7235410, 2222109, -11940009, 11514270, 29552060, -16320339, 11400454, 14586783, -21307332, +2728378, -26204132, 9960029, -2808909, -13966697, 20740934, 605590, 32358284, -1990717, -24241332, +40967544, -7379291, 4083977, 5640366, -38459820, 11562052, 33097018, 11788611, -14395657, -25196962, +2617246, 6124624, 28303834, 18239116, -9231495, -5523865, -22056804, 193810, 32027034, -43550968, +13211856, 30418032, -27381490, 10031433, 2844342, 10534481, 32039920, 10681584, 12367358, -5950677, +-31457952, 32556388, -6045167, -16670379, 68305552, 33590404, 17429514, 2973191, 1553168, -32159104, +-26351772, -11971148, 20084340, -697932, -18644454, -13182865, 25334402, -15489263, 17452062, 9882183, +-12503187, 18619756, 8542153, -27076548, -13508746, -15893526, 4463008, 16916266, -33838436, 11107322, +-34672736, -43840340, -27547920, 42005316, -14525579, 8664560, -9822053, -14622216, -2092723, -17425756, +-12048457, -9292699, 2149094, -16707960, 1968169, 9738301, -9127, -14716169, -10900090, 5096516, +1664300, 18625126, 2507187, -21524228, -8342974, -12358232, 17643188, -3638911, -7132330, -17053704, +-215285, 10149545, 4660577, 11569031, -5891085, -1976759, 3441880, 11778411, 7549479, -401043, +-6718940, 8746701, -8228084, -936303, 4785668, -7746511, -204011, 13166222, -430034, 2374043, +-14571750, -10340134, -11089069, 6505802, -11798275, 41917808, 69837776, -11564199, -2267743, -57142392, +-19145354, -41991896, -27991376, 39072928, 2817499, 10683194, -32337882, 10592463, -28390270, -63919312, +9381819, 30857730, -2489471, 4085588, 33158758, -43782896, 50151260, 25088514, 15686831, -24713778, +33732672, 65077880, -12869333, 20206210, 49373332, 41783588, 73546480, 16107738, 26433376, 20141786, +17941152, 63279364, -16378858, -7345468, 23318452, 13986024, -6808597, 34889628, 2145336, 7490423, +-20547124, -56196424, 2244657, 37814504, 5785321, 22992034, -40636296, 2746095, -54053236, 328565, +-58094264, 4239670, 40852656, -4929549, -17275970, -55199992, 72691248, 13458280, 4937065, 75487808, +-840203, -16918414, -12631499, 4166118, 15114527, -3867081, 335007, -5672578, -39707508, 23876260, +9224516, -24625194, -15214922, 20002200, -23965380, -41282152, -20234664, 9358197, 39832064, -41324564, +33170032, -1346472, 17719962, -6994354, 14469745, -9706626, -1415729, 3868692, 4090956, 13604846, +12137041, 2756832, 25451976, -1079111, 10466835, 13629542, 7825431, 6091874, 6077379, 22182970, +16350940, 8120173, -8590471, -3397856, 19051938, -25183004, 9772661, -14962592, 3623342, -5472325, +17178796, 20004348, 40274444, 22683332, 37988448, 21940840, 7952669, 40088152, 41401876, 39583492, +22552874, -6658810, 23600308, 26312580, 16106127, 31643172, 23734526, 98247, 7155416, 5467494, +5153961, 9323300, 6672769, -8026220, -8174397, 430034, 6585796, -1926830, -21905944, -72838352, +3676492, 98816464, 14500883, -19930796, -18915036, -44733696, -29227790, 1556926, 61727808, 11077794, +-41000832, -2719788, 16908750, 4295504, 1357747, -3788161, 10834055, -29113972, -10910828, 15314243, +34238404, 34732328, -32383516, -12163884, 2583423, 4932770, 8771934, -37012416, 3700114, 6467147, +-9750113, 27260158, -195421, 31409632, 46779712, 22762252, 9754944, 20760798, -26423712, 24523726, +-21327196, 36479840, 63733020, 21420612, -34307124, -29189672, 28933048, 11023034, 54339928, 41293964, +12552042, -9653476, -12078522, 2212982, 2917894, -18322868, 21188684, 19043884, 3608846, 49616536, +33660196, -3894999, 24027120, 27296128, 12536473, 27314382, 1232656, -45952392, -5683316, -10547903, +-10696616, 53723600, 24508694, 9322227, 42252816, 25707526, 26958436, 33753076, 11475079, -32925220, +-16655346, -18254, -539018, -11094437, -9826885, -19627464, 12766253, 9035001, 19862076, -8451422, +22153978, 7069516, 22935126, 16203301, -5025649, -10789495, 3477313, 7094212, 258235, 3561065, +16803522, 2575907, 26265336, 36094904, 10102300, -1970316, 2614561, 26246546, 5849209, -6976101, +-6675990, 20987894, -1012539, -5149666, -3848828, 7658464, 14176076, 29327110, -14855218, 3385508, +-9627169, 3466039, 1142461, 24202140, -12349642, 12560632, 13973139, 9532143, -10471667, 4462471, +16254304, 3314641, 477278, 17004850, 2146410, 10798085, 5934034, 2928631, -3047816, 4225711, +-2214593, 5015448, 1114007, 5290326, 901406, 9165997, 2126009, 4663798, 1585917, 7167227, +1376537, 7495792, 1595580, -526134, -14556718, -69439960, -15044734, 38685308, 20892332, 84694608, +4583267, -12350178, -38033008, -74446816, -81748264, -13673565, 35172560, 39511016, 25324200, -41345504, +-54573464, -468151, -6723235, 21676700, 56847652, 28869160, -5381057, -34214248, -46319612, -29198262, +1860795, -28612536, 11072426, -23972896, -11807939, 37783900, 31343060, 27759448, 10886668, -39133596, +-10883984, -37452652, -28683940, -15182709, 21994528, -4352950, 23363548, 57309896, 60016264, -25272662, +6912213, -44560824, -30288110, -21428128, -3831111, 7981123, 34821448, 36822364, 51210504, 36068060, +13092671, -25684978, -23324894, -5952288, 16485695, -42178728, 3080029, 48491256, 39017092, -10623065, +52867288, 46732464, 26651882, 48841832, -93347360, 21747566, -26499412, -29281476, 16081968, -15953119, +-1284732, 93679144, 79765592, 27713276, -24553254, -2753611, -37397892, -7951058, -50310712, -18499498, +-8393440, 18810346, 61791156, 31678068, 13025025, 10321343, -9853729, -31667330, -39782672, -609885, +-26227754, 20338280, -2193118, -919123, 23776938, 18556944, 7415798, 19222126, 7203197, 30465814, +-21725018, -1313723, -23961086, 9117679, -20819854, -20136954, 3498251, -6757594, 16798154, 28609850, +1962263, -28447180, -46036680, -14965814, -26616450, 1995549, 12173011, 20769924, -17689896, -7483981, +23580444, 2032593, -119969176, -136030736, -146262960, -147783376, -200384384, -11873974, -71760848, -23181012, +26607860, 66992364, 94001800, 96944392, 198101616, 212397408, 172939008, 128635880, 136284688, 129933496, +50126564, -19303730, -89222040, -89418000, -137203264, -44578540, -74321728, -55431920, -5118528, -116489712, +-33435246, -104045584, -28242094, -119557392, -112658064, -52023864, -92994096, -9478456, -46922516, -43421584, +-69514048, -46044732, -105008728, -74268576, -39382164, -36158792, -55503324, -34037616, -3990562, -44966160, +15251966, 67266704, -52278340, 79570176, 47782584, 106202728, 106757320, 93149248, 114941376, 97045320, +160286032, 159140352, 126995744, 169804752, 145689056, 222382672, 219070176, 258062032, 200934672, 216196848, +235676128, 212816160, 254544464, 188563024, 275626304, 220218544, 84031032, 107686640, 28484224, 42661912, +-148963424, -125099512, -139563888, -148647200, -156631552, -202496976, -190563936, -209574000, -230017504, -270531392, +-226011376, -207048560, -230041136, -250996272, -299143392, -240052160, -265689360, -267551760, -202892640, -228866464, +-131945688, -163920112, -112076632, -104183560, -55062556, -40372156, -57016764, -9896678, 27023934, 129907192, +123240864, 89353040, 101184064, 108689520, 147529984, 150953072, 163422976, 172185776, 148242400, 150448944, +110693120, 156531696, 160251136, 121903520, 85893440, 66139812, 96290480, 95058360, 74155832, 44241920, +24610700, 37218040, -9754408, 4849555, -17558900, -14202920, -71130024, -65409132, -47492136, -33187750, +-43352864, -33563020, -15937550, -13494787, -17284022, -32502702, -29576756, -15161235, -19100794, -13125420, +-10730976, 1491964, 4895726, 316754, -4364761, -1374926, 435402, -1043140, -1068910, -1057099, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -2838974, -5248450, -212064, 2153926, 833761, -4591320, -3453691, 1197759, -3111704, -4616553, 2632278, --546535, 686658, -2649995, 1946157, 187905, -4090956, -185757, 4719096, 3835406, -2937758, --5174899, -4716948, 694174, -1088237, -924492, -4014721, 4366908, -1163399, 1230508, -1832340, --1111323, -402653, 1656247, -1189706, -2298881, -8810589, 2995740, -671626, 2847027, 1686848, -1196685, -231391, 5872831, 1099512, 1173600, 815507, -3004867, -1925756, -278636, 427349, --3008088, -716186, 1170916, -418222, -2842195, -1501091, 104690, 2775086, -4351876, -5907728, --7315403, 2585570, 4191351, 419296, 3466576, 2538863, 486942, -6710887, -174483, -1759863, --2352568, 111132, 374736, 2773475, -598611, 3949223, 2799782, -1256278, -4016331, -1959042, --717260, 1020055, 307090, 1290638, 1504849, 2755759, -58519, -270046, -1300301, -1132261, --1076426, -485331, -2240899, -1064615, -1267015, 690953, -148176, -288300, -688805, 1044214, --1577327, 3165391, 4140349, -963683, -63351, -5941014, 5283884, -6803765, 2617246, 11435887, --2460480, -4269735, 641024, 5961952, 625992, -1708860, -836982, -1722282, -1091995, -5389110, --2103997, 2640331, -4280472, -2453500, 233539, -248571, 4711043, -2893197, 872952, -1126892, -1022739, -611496, -2765422, 5215701, 8880919, 2240899, -514859, -1677722, 9612137, 437550, --4031364, 258772, -7182259, 16106, 3737159, -5516349, -707059, 1171989, -4405563, -1332514, -5059472, 712965, -550830, 4881231, -3259343, -5149666, 2903935, 1923072, -3597035, -1786706, --3850438, -4512400, -4853850, -2688113, -2777770, 3924526, 2789581, 765041, -116501, -2731599, -2521683, -595390, -1866163, 3325379, 3674882, -2629594, -529355, -1245541, -1679869, 513249, -4211216, -2131915, 940061, 4015795, 2653216, -924492, 1015223, -704912, -114890, 1701344, --245350, 25233, 1731409, -1856500, 748935, 380641, -597537, -1710471, 1306207, 149787, --767189, 402116, 184684, -613107, 192200, -314069, -572304, -998580, 5847061, -8523899, --5627481, -2029909, -1240172, 287763, 1096290, -8128226, 5644124, -2567854, 1844152, 1162862, -1878511, 3549254, -25770, -1177358, -2705293, 5849746, -462783, 3802120, 7225209, -1569274, -6143414, 5239323, -4543539, 3035468, 3072512, 3295314, -8017094, -798864, 478889, -2521683, --5042829, 76236, 5883032, -1383516, -2520609, -1981054, 1799054, 5452998, 2693481, -2789581, --46708, -2301029, 230854, -733903, -2719251, 5092221, -6585259, -5443334, -4998268, 1542967, --703301, -182536, -6143951, -6489696, 1579474, -139586, 366146, -642635, -345745, -4845260, --2866891, -5297306, 1036698, 4534412, -1415192, 4023311, 753230, 3576634, -7733089, 30065, -1116155, -2582886, -1167694, 1029718, -2756295, -341987, 2024540, 2184528, -1716376, -5175436, -4552666, 710817, 110595, -1146219, -661962, -4144644, 181999, 282394, -729608, 744103, -133144, -1464584, 623844, 667331, -418222, -599148, -206695, -250182, -280247, 224949, -2179696, 33286, -654983, 1801202, 804770, -145492, -601832, -181999, -2920578, 720481, --586263, 5018670, 7982734, 506269, -3035468, -6788196, 3106335, 2015950, 1883880, 8456254, --5528160, 195421, 1030255, -1532767, -2765422, 1250909, 533650, 5097590, 11246909, -989990, -1947231, 4702989, -2038499, 4195110, 7310571, -5100811, -189515, -1900523, -104690, 3261491, --5692979, 6152541, 1373316, 72478, 3244848, -532576, 4492536, -2433636, -1032403, -1263257, -7056632, 3289408, 4495220, -850404, 3704409, -6845641, 7917236, -3062849, 3115462, -7206419, -2911451, 5234492, 9649181, 3543885, 1804960, -6345814, -2427730, 1755031, -4801774, -5713917, --1352378, 11399380, 13202193, 2533494, 3109020, -3763465, -1669132, 7383049, 1443109, 3234647, --442919, 2249489, 1981591, -972810, 1691143, -1076963, 1275605, 892816, 4665945, 3797288, --5851356, 5219996, -1709397, 2685965, -1840930, 1975148, -1553168, -2173254, -38118, -3471407, -548145, 2546916, 581431, 1315334, -1231582, -1532230, -788663, 639413, 111669, 584116, --222801, 406411, -979789, 369904, 376883, 1855963, 111669, 1265405, -592169, 1133871, -5567888, 156766, 695785, 7811472, -6576132, -7741679, 12072079, -3124052, -1929514, 7894687, -4726612, 586800, -13843753, 14963129, -2735894, -1886028, -1567126, -810138, 599148, 929860, -4682588, 6984154, 4602595, -995359, 7835094, 4974109, 2521683, 2114735, -2874407, 3582540, --5622112, 4503810, -852014, 1891396, -4757750, -6914361, 896574, -865436, 2548526, 4188667, --2048699, -6616397, -3858491, 1644973, -7945153, 5157182, 1609002, -12670154, 5743445, 892816, -3290482, 839129, 1985349, 2172180, -504122, -3558917, -3091840, -8637716, -6345814, -3512747, --4405563, -952946, 533650, -6314676, -8951249, -1313186, 5851893, 10077067, -493384, -6665789, -1132261, -10496900, 743029, -689342, -4118337, 8909910, 8370892, 2842195, -300648, -2114198, --610959, -4631586, 2215666, 8547522, 4575214, 7070590, 1442572, -3175592, 3295314, 1737314, --215822, 709743, 404801, 243739, 1541893, 1604170, 1529545, -438624, 2669322, 754841, -5250061, 2080375, 1421097, 285078, 468151, 1418950, -358093, 2492692, 921271, 989453, --1381369, 3091303, 779000, -1047972, -439697, -13585518, 7031399, -2587718, -4828617, -3828427, --4618701, -6455336, 12463995, -15857019, 3750043, 3840238, 5199595, 7758859, 1282585, 2160369, -2928631, 2106145, 1625108, 2632815, 6831683, 1237488, -3745748, -1611, -649077, -4878546, --4407710, 2266669, 4581120, 4923643, 677531, 3511673, -8254391, -956704, -107374, -450972, --7821136, -4687957, -2809446, 5122822, 4604742, -78383, -8560944, 49392, -4632122, -3321084, --1674500, -2305324, 5394479, 7326678, 2234994, 7621420, -12183748, -8519068, 4067334, 2490007, -425202, 1612760, 808528, -3954054, -7659538, -5300527, 4076998, -3435437, 6228777, 6121939, --2220498, 5800890, -9220221, -4565550, -2586107, -3115999, 686121, 16811038, -2405719, 4753455, --2671470, -2435247, -1701344, 3566434, 3836480, -447213, 3099356, 2108292, -5232881, 1444183, -413391, 2248952, 500901, 273804, -2632278, 1692217, -97711, 1714766, 561567, 886374, --476741, -1006096, 514322, -1534377, -2194728, 747324, -1195612, -1899986, -548145, 565325, -762894, 746787, 836445, -113280, 604517, 1187022, 1006633, 330712, 303869, -397284, --623307, 1107028, 13911936, -2665564, 388158, 5863704, -13227426, 9106404, 4622459, -7451769, -8289287, 9273371, 3118683, -14281840, 8843338, 392990, -1339493, 7242926, 7823283, -434865, --2299418, 236760, -5537824, 5198521, -3024194, -5275831, -11108933, 2605435, -12075301, 3253438, --2953327, -1342714, 3492882, -9837086, -4037269, 8195335, -707059, -3812857, 5018133, 341987, --4289062, 3717294, 1352378, 373662, -1834488, 2837363, -5986111, -619012, -8745627, 8291971, -8288750, -10299332, 6897718, -7344931, -2768643, 7128035, 9961640, -712428, -4951024, 3019362, --617938, 1445257, -12159052, -9609989, 1928977, 1736777, -2623151, -2490544, 3163780, -365072, --4304631, 5153961, -4963372, 1752884, 3729642, -841814, 5844914, -5840082, 5910412, -30602, -9398999, -3211025, 2858838, 5311801, 607738, -3357054, -950798, -339302, 2762201, -909996, --4411469, 3735548, 817118, -1843615, 1654099, -1236951, -48318, -1729798, -490700, 1282585, --1472637, 963146, 2582886, -1325534, 634581, 188442, -845572, 1639067, 443992, 1396401, --2067490, 853088, -2116882, -2420751, 912681, -377957, 995896, 1034013, 315143, 3847217, -1676111, -5063767, 9760850, -3343632, 4748623, -9858561, -700080, -2603824, -8950175, 309775, -6319508, 11232950, 14697378, -8374113, -236223, -10437307, -782221, -6648073, 5931887, -6225018, --12307766, 794569, -7888781, -741419, 10202158, -6052146, -6037651, 10947872, 336618, 1879048, --1147293, -6441914, 2732673, 2333778, 13194140, -9108552, 6469832, -7725573, 1923072, 2559264, --7622493, -4694936, 12669617, 3462281, -9428527, -2437394, -3451543, -7570954, -321586, 12418361, -6651294, 8640400, 1973001, 3452617, -11339787, -1643899, 14414447, 1138166, -8963060, 4790499, -4763656, -6579890, -5729487, -3173981, -14814416, -2288681, 4395362, 7313793, 13001403, -3263638, --7117835, -2062658, -4431870, 10553808, -3931506, -9222369, -6285148, -2727841, -1262184, -2860985, --5332202, 11490111, -6592238, -805306, 1057099, 544924, 3748970, 2335389, -3390340, -4552129, -3411815, 4096862, 4333085, -998043, 1957968, -1207423, -721018, 1933809, -430570, -2021856, -2039573, 952409, -63351, -1326071, -446677, -3365644, 308701, -839666, -2893734, -1481227, -1309428, 1138166, 49392, 1337346, 6324340, -21955872, -15133854, -9700721, 1158031, -18396418, -2749316, 13674639, 4524748, 14079977, -7555921, -3484829, -1529545, -7318625, -2739116, -10986526, -19526532, 11148124, 7784628, -16497506, -3189013, -5310190, -10734197, 3711926, -1130113, 3480534, --13332652, -918049, -1195075, -9575630, 5569499, 1584306, 9784472, 3934727, -8182987, 12890271, --6096169, 5230734, 2714956, -110059, 10201084, 9479530, 2391760, -12303471, 15006079, -7598871, -10759430, 4903242, -5568425, -6194954, 12065100, 1768453, -1406602, 3138547, -10192494, -3656091, -5877126, -855772, 10669236, -6171331, -9647033, 3951370, 2729452, 324807, 10610717, 4569845, -2157147, -6773701, 7721815, 3024731, -5919539, -818191, -635655, -3406983, -2476049, -2873870, -4644471, 11650636, 19640348, 9123584, -3313567, 992674, -4509179, 4514548, 6043019, -100395, --5018670, -2956011, -6550899, 4035659, -3579318, 954557, -3095061, -852551, 4357781, -522912, -471910, -3992172, 4261682, -2254858, -1912871, 2335389, -3920232, 4289599, -3003793, 2294050, --2123325, -406411, 961536, -2930778, -2081449, -1288490, -4769025, -4794794, -2102923, -257161, --1690070, 3787088, 3499862, 2041183, -13863081, 18636400, 7727720, 21311090, -9553618, -11442867, -20308216, 690416, -2091649, 4455492, 1562831, 11891691, 15843597, 2071785, -14704894, -23554674, -3315715, -6497212, 1448478, 673773, -10188199, -645319, 12846247, 10502806, 8264591, 16534550, --3720516, 14011257, -9824201, 12409234, 4094178, 9616432, -6427956, 16935056, 9759239, 12368432, --19602768, -86436, 17861696, 10169946, 3257196, -4225174, 26861800, 11340861, -10508711, -6479495, -6564858, -10231686, -978179, -4907000, 1403381, 22551800, 23629836, 17156246, 6317360, 207232, -8908836, -7827041, -1959042, 9683004, -10001368, 23880018, 14904073, 11725798, 4639639, -908922, --11250130, 14183056, 536871, 12373264, -5500780, 4814659, -7931731, -4548907, -180926, 6246493, --9333501, 22233972, 9601936, -2432025, -10865194, -20928838, 10329933, 1848447, -6784975, -627602, -2621541, -4879083, 3070365, 8098698, -1371705, -2765422, 281320, -1697586, -2056216, 1842541, --2500745, -1837709, -3437048, 3639448, 2094333, -5244692, 2986076, 3390877, 3300146, -93952, --1529545, -579284, -13422, 1761474, -423054, 1305133, -3089155, 5142150, -6415608, 118112, -2246268, 5763309, 22985592, -1382980, -11419244, -5169530, -8962523, -380641, -14354318, 3673808, --12376485, 6943352, 1541893, -3366718, -9752260, -11631308, -17627620, -18267570, -5462125, 15778099, --1233729, -10353019, 4206384, -9874130, 7495792, -8441221, 14761266, -15257334, 3504157, -10833518, --11105712, -2067490, 1824287, -3263102, 6937983, -21942988, 8763881, 2070174, -5335960, -1557463, --1512902, -10881837, -17440788, -18671296, 13342853, 6584185, -7346005, 11558294, 308701, -4884452, --13771276, -28849832, -23783918, 13390097, -4212826, 257698, -2918430, -1400159, -1444183, -19556596, -7346542, -23095112, -12368432, 1009854, -798864, -4977330, -3175592, -3120294, 23695334, -7406671, --7831873, -6501507, 24793236, -4540318, -10074383, 15708306, -12453258, -7923141, -10279467, -8645769, --32168768, 6367826, 5046587, -10810970, -1654099, 7436199, -4282620, -2950643, -6079526, -5548561, --877247, -2935610, -2946885, 11129334, -1032403, -1272384, 7378754, 8839043, -4516158, -3297998, --845572, -1641214, 2156074, -5505075, 497142, 562104, 892816, -3300682, -4113505, -1704565, -3524558, -1553704, -3094524, -473520, 2182380, -7076496, -1242319, 3910031, 122943, -2856690, -3628174, -2500745, 3198677, -73551, 3049964, 3342022, 3337727, -6189585, -769336, -33990908, --25667262, -14683419, 29677150, -1512365, -4947266, -3626563, -2340757, -9780714, 10502806, 8119099, -26560614, -24512988, -4779225, 7548405, -17931488, -7176354, -6344741, 30595200, -448824, 7052337, -15573551, 1408749, 14988362, -16185584, -20344186, -13614509, -3745212, -3461207, 2427194, 9560060, --471373, -17136920, -11825119, -878321, -9149891, -19225348, 17157320, -2869575, -9590662, -122407, -5507759, 5449777, 3203509, -8688719, 1748052, -17877802, -7829189, -26512834, 12455405, 8008504, --3138547, -8325257, 9796284, -13210783, -3379066, 28600188, -3016141, 24238112, 10838350, 6498286, --6352257, -30443802, -12666932, -5856725, -16396038, -12256226, -7819525, 13625784, -6236830, 310311, --12241731, 25958246, -9290551, 10707353, 7254737, -17711908, -7137162, 3905736, 16402480, 29967060, -24919400, 10801843, -1713692, 10289131, 62814, 894964, -5891622, 3027952, -6090801, -4224637, --128312, 1764695, -3685619, -4868346, -8796630, -6991670, 3709241, 2881386, 3018288, -3233574, --1381906, -17439714, -366146, -8042327, -3817152, 3159485, 2379412, 1008780, 7166153, 179315, --1065152, 719407, -2959233, -12653511, -1253057, -7191923, 3546032, -6381785, -7010461, 813359, -8007430, 3682398, -2370285, -4725538, -4450123, -2076617, 4260608, 1140314, -2036351, 17648558, --816581, -9993852, 10902238, 6263673, 36871756, 1315334, 459025, 13032541, -16555488, -11409581, --3237869, 3083250, 6025302, -4408784, 15650324, -9507984, 2243047, 14710800, 6676527, 5492190, -5515275, -10758356, 2136209, -260919, -5199595, 2311229, -7755101, -13898514, -7192997, 1175210, --13651017, 17860084, -1189169, 1857037, -2328946, 12319577, 13922136, -2525441, -10072772, -849867, --3129421, 16375637, 21027624, -14769319, -10083509, -7419019, 5361730, 15625091, -13748727, 4743255, --469225, 3365107, -7079180, -9561134, 3177202, 10350871, 2052458, -12539157, 11608760, 33770256, --10740639, 6389301, -2383707, 2731062, 13145821, 3808026, 15471009, 12942884, -3218004, 19767050, -35836132, 1588601, -13042205, 35084516, -550293, 33554968, -11414412, -16199006, 15552077, 6096706, -23467702, -3631395, 32990718, 10536629, 7754564, -9669045, 15695421, 1983201, 1692754, 3828963, -12839805, 2850785, 14643691, 1948305, 3732864, 684510, 2311766, 2513630, 4764730, -1279900, -5325223, 12412455, 5245766, 5791227, 1861332, 3481071, -6669011, 6177237, 2431488, 2942590, -4522064, 2542084, -299574, 129923, 3558381, -3207267, 1319092, 386010, 3180960, 8944806, -3269544, -55835, -4280472, 4828617, 929324, 1344325, -689879, 4725001, 2753074, 6876780, --23116588, -7454453, 36093296, 6043556, -16664473, 4976794, -12622909, 4685810, 6926172, -2918967, --19084688, -7168301, -28534152, 11859478, 9797357, -10956462, 10626823, 16592532, 3415036, -4432943, --16665010, 3822521, 26675506, -12738336, 16011101, 15308337, 2420214, 11522860, 10663330, 523449, -13297756, 8894340, -25397216, -3570192, -10232760, 25987774, 17220672, -18076444, 11144903, -2051384, -13707925, 43316892, -4086125, -7289633, 4334159, 38989712, 16004122, -2363843, 4991826, 7090454, -22498112, 19879794, -13566191, 23858544, 10939819, 22119618, -15631533, 2405719, 4443144, 4733054, -13667660, 20301236, -13180181, -10455024, 16068010, 8055211, -5445482, -5709086, 65498, 24360518, --45873472, 10830297, -16303696, -12020540, 2222646, -15698642, -14595909, -2080375, -25079388, 18133888, --5322538, 19158238, -678605, 16761110, -11040750, 6754373, 418222, 5560372, -503048, -6436009, -5085242, 3590056, 4065187, 8187282, -3972845, 4152160, 5650030, -4677220, 453119, 7823820, -2914672, -4187593, 8728984, -5718212, 1190243, 4554813, -5578626, -4210142, 1800128, 1752884, -9735617, 8053064, 5786395, 2932389, -901943, 6283537, 1440425, 2772938, 2798708, 5215164, -6366216, -5247913, -4363687, -8493298, 6726993, 2653753, 575526, 2119030, -8945343, -8573292, -5996311, 7803956, 8240969, -10150618, -12122545, -31379032, 1490354, -17498770, 28650654, 3519189, --7358353, -4218195, 17222282, 4971425, 27927488, 11274289, -7162932, 1188632, 5954972, 12715788, -21030844, -23415088, -20223390, -4227322, 35321276, -10826539, 4575751, 10086731, 15521475, 18766860, -26868242, 23175106, 2115272, -5481989, 25099788, 1979980, -15862388, 8519068, -14710263, 10723460, -2747169, -13144747, 12145094, 47095392, 26295400, -16579111, -12502113, -1671279, -12972412, -12896713, --11101954, 8123394, -6288906, -10966662, 2531346, 12991202, 7820599, 4337380, 18571976, 5004711, --4394826, 19573776, 16529719, -14067629, 9663676, -15886010, -12367895, -14079977, 42950, -34074124, --10021232, 23790898, 17604534, -8076149, 11847667, -2821257, 925565, -20925618, 4795868, 12627741, -20064476, 11279658, 13316009, 7299834, 6415608, -8907762, -7807714, -9477382, 5419175, -2021319, -824634, 4080756, 4255776, -404801, 10407780, -3223910, -4489852, -4910758, 7318088, -9469866, --3794604, -11687143, -581431, 2321430, -5009543, 471910, -2754685, 7320772, -1365263, -15424301, -271657, -1051193, 4636417, 6045704, 1990181, 6868190, -403190, 11162620, 2312303, -881542, --271657, 1218160, 497679, 566936, -12811351, 10594074, 8552354, -16271484, -6954089, -35381940, --2815351, 29511794, 370978, -21618718, 3502009, 1017370, -14508936, 19673634, 11391327, -7901666, -5618891, 8919036, 12164421, 6753836, 2124398, -8730058, 4780836, 7004018, 18821084, 28102508, --7698192, -18912352, -9944460, 5363878, 5866389, 23128398, -8826158, -18111340, -14097156, -14490683, -27994596, 51287816, 18640158, 2574833, 56273736, 3384971, 23337778, 13311714, -4723927, -11795054, -10011569, -15969762, -10636487, 11405823, 776852, -33896956, -35102768, -8781598, 14674830, -18315352, --22969486, -12648142, -17004312, -14001057, 11871290, -9750113, -26046292, 11716671, 1035624, -7593502, -6102075, -5869610, 13142600, 52789444, -32331440, 26613228, -36761160, -20846160, -12183748, -8318278, -20445118, 8260833, 9806484, -3970697, 11360725, 23691576, 5929203, 555661, 310848, -6872485, -3260954, 6496138, 18983756, -1140314, -9403831, -1403381, 14501957, 9322227, -4096325, 5500780, -6582575, -5232881, -179852, -2237678, 18197776, 6594923, 8628589, 6405944, 5207648, -7491497, --5310190, -1177358, 4671851, -9167071, 1349157, -9040906, -6237367, 1475858, 969589, -10391137, -10198400, 13934485, -1363652, -1773285, 8476655, 125091, -3638911, 12335146, -5059472, 8560407, -798864, 28574418, 18377628, 16569447, 24336358, -28398860, 10922639, -29744796, -1192390, 38876432, -34575024, 14739254, 537408, 6727530, 4393215, -11148124, 9010841, 11194295, -48985176, 3003793, -7202660, 14897631, -17949742, -27581744, 20234128, 9573482, 5149666, -11788611, 23999740, -3370476, -18656802, 15502684, -1846836, 2368675, -5418101, 18894098, -11207180, 5769752, 11369852, -987843, -24146306, 13981729, -1348083, 12389907, 14078903, -722628, -10893648, -36741836, -6771553, 3929358, --21755620, 2109366, 17369922, -33387466, -14810121, 5129265, -14348412, -2317672, 17631378, 1030255, --12459163, -16262357, 7253663, 7070590, -33750928, -11247982, -2792803, 149787, 21216064, 10399190, -2383170, 37056440, -4655745, -1190780, 1475858, -21121576, 20029580, 181462, 32861868, -12722767, --5477694, 9893994, 4978404, -27987618, 928787, -3853660, -11184632, -9036611, 3519189, 1174674, --7884486, -687732, -4890357, -3447248, 1039382, -11963095, 3476776, 1661616, -1653026, 4600447, -1282585, -7890392, 1636919, 2281702, 2127620, -7632694, 11203959, 2215666, 14570677, -10706817, -1384590, -9018894, -3159485, -1643899, -16069083, 3443490, 1529545, -654983, -2144263, -2889976, -6001680, -7237020, -5561446, 7028714, 9413495, -9306120, -34672196, -30218854, 5537824, -15552613, --4867272, -23284628, -29007136, -30520038, -20055350, 21777632, 29727080, 802085, -24465208, 1948305, -1151051, 338766, 11307575, 18978386, 18977850, 484258, -12284143, -30447560, -17454210, -26650808, --5710696, 129386, 2263448, 2767570, 3765076, 7360500, 9536975, 17961554, -28161564, 12382928, -4939750, 6234145, 15130096, 26743688, 30026116, -17275970, 13389024, -23884314, -7450695, -21671868, --2100776, -8441758, 49908056, 17711908, 35957468, 1521492, -19269370, -8278013, 23032298, 24921010, --14629732, 46033460, -19270444, 2874944, 2036351, 7997229, 16919486, 51208360, -3571802, 12540768, -28525026, 6512781, -22582938, 14358613, 52405044, -9562745, -12668006, -30902290, -2564632, 19328964, -11941083, 1621887, -29656750, -22476100, 3786014, -23453742, 7074348, 1037772, -29524142, -3348464, -3052111, -4644471, 21343304, 20033874, 455803, -5850819, -12712029, 13868449, -5871221, 24102820, --5483600, 311922, 16525424, 16571594, 23598698, 18216566, -13297219, -5221070, 3192235, -4408784, -1627256, -10151155, -9737765, -9885941, 5184563, -12106976, -14077829, 8361228, 10950556, 983011, --12087649, 7705708, 4326643, -2988224, -3051038, -8247411, -127238, 4702989, -2042794, -7374459, --9552544, -1832877, -6256157, 7879118, 4478041, -4090420, -5290326, 10084046, 46531140, -2442226, --289373, 19723026, 3806952, -64277408, -20220706, 45590004, 15151571, -13423383, -25621090, -3629784, --16936666, 23490250, 12192875, 4380330, -13588740, -30449170, 6495065, -52421688, -6430640, 25578140, -34936336, -4077535, -29721710, -20264192, -61336964, 17956184, -10675141, 23969676, 18116708, -17464410, --12711493, -54444080, -40893996, 21233782, 57941256, 23106924, 27504970, -19352586, -34490736, -33111514, --13894219, 49228916, 66342212, 34572340, -77173048, -28325846, -59144384, -31654982, 73260328, 17821966, -16225850, -9776419, -70604432, -57835492, -58016420, -10827613, 5598490, 36506148, -13593571, 27760522, --55994564, 34754340, 13900662, 4199941, 70351024, 4476430, -6523519, -3409130, -95494304, -29213294, --6505802, 30029338, 15663209, 13705778, 42119132, -45089104, 2886218, -29850560, 32491428, 23439784, -2236067, 6451041, 6909529, -5360119, 19319836, 10322417, 5125507, 16422344, -11236708, -21021718, -5091147, 15018964, 22858352, 18806588, 12429635, -15793132, -25545928, -35830228, -3204046, 2521683, -28958280, 35851704, -5405217, -27370752, -46979964, -22594750, 3350611, 35866736, 57643292, 14977088, --56385940, -57922464, -59074052, -694174, 48194900, 42381664, 44775036, -15087146, -21800180, -42074036, --42408508, 15494631, 28681792, 37330244, 18991272, -29693256, -27988692, -15897821, -4413079, 34633544, -18415210, 5669894, -1547799, -21342766, -15317464, -3241627, 4268661, -27590334, 52947284, 22723598, -24268712, -65591668, 13151727, -91370064, -20199768, -275415, 12898324, 5230734, -58566176, 31687194, --16267726, -10576894, -11059541, -12491912, -14395657, -18146774, 38287484, -11010149, -32992866, 10472204, --9380209, 3986267, 18432926, -37246492, -13370233, -2342368, 15544560, 1551557, 42121820, -3636764, --24188718, 55632176, -47182364, 27488328, -43759812, -14509473, 21266530, -35556424, 2542084, 25681220, --13485124, -3121368, -2696703, 33083060, 50514720, 29196650, -17063906, -7064685, -7953206, 3144990, -16195248, -6765647, -10105521, 9770514, 5165772, -91743720, -3737159, -3461207, 13299903, 11322608, -554588, 75162, 26038240, -28933048, -7458748, -2891050, 19834158, -73680704, -10360535, 66432408, --17089138, -26920318, -282931, 50247360, -9307194, -12144557, 13672492, -19918984, -20783884, 30992484, -48118128, -17555142, -24507084, 8184060, 14406931, -7755101, -25831544, -676457, 3715147, -5383205, --3782793, -8211441, -11259257, 5135171, 344134, -10475962, -1881196, -555661, -393526, -9674951, -5466420, -12903155, -13511430, -8078297, -8258685, 12321187, -1826435, -2823404, -294205, -7321846, -10328323, -13712220, 3901978, 180926, 978179, 9162239, -433792, -16449725, 1874216, -4510253, -3062312, 1992328, -14595909, 22780506, -6041945, -2416993, -2188286, 1868311, 5859409, -785979, --5348845, -12221866, -22310744, -67123360, -55140936, 48186848, 41077604, 3758633, 43885440, -48110612, --2922725, -92759480, -33041720, -16550120, 44715980, 40695888, 24888798, -37435472, -12973486, -1791001, --17926120, 8642011, 16079821, 20918102, 27991912, -21612812, 15625628, -40227736, -25500832, -6499896, --8668318, 911070, 26381300, -31792958, 27180700, -12379169, -17719962, -7145752, 2434710, -39873404, --1010928, -36114232, -13558138, -14119705, -34313032, 46849504, 21456046, 10524817, 11365020, -9241159, --48062296, -71184248, -41641320, -41924248, 28233504, 6635188, 30441654, 42484744, 35006668, -11643119, -8310225, -24672440, -18966576, -22550188, 17466558, -23891292, -1251446, -22807350, -23567560, -14883135, -27558658, -22415434, -6392522, 2116882, -3293166, -32270774, -34713000, -21106544, -12514461, -46750184, --27857694, 6926709, 27963458, 29180544, 37263136, -2567317, -30575872, -39592620, -30466888, 15353434, -4851166, -5023501, 18084496, 45932528, 12128988, 12159052, -11754252, -8871792, -15262703, -9385040, --4985384, -14805289, -3491272, 17342542, -3850975, -7866233, -14292577, -15906948, -17867600, -5431523, -8586176, -4911832, 3638911, 1998770, -32106492, 3314104, -15338939, 13255343, 25695178, -13129715, -17736604, -2423435, 4291209, 441308, -25391310, -4197257, -8295730, -6752226, 23113366, -14740328, --99975568, -135506752, -128042104, -121785944, -146004736, -24419574, -40365712, 25920128, 41320268, 130760816, -84006872, 110859552, 152775200, 167980464, 114683680, 145937088, 83072720, 38725572, -5827197, -27396522, --37221796, -61609696, -60469920, -83566104, -35329328, -30740154, -78617232, -58704688, -56209848, -63931660, --104020888, -70853000, -54539104, -43803296, -80052288, -11157251, -23970212, -33285460, -77518792, -71603544, --59025200, -50471236, -36640904, -14903537, -49276160, 14271103, 25593174, -38579544, 43280924, 60108604, -57759256, 104812768, 85182088, 65615824, 72219872, 72659576, 72108208, 110221744, 124031680, 121886344, -83422760, 131459288, 129814312, 135242080, 137529152, 156161792, 138625440, 146378928, 194237216, 99092408, -100071664, 101423504, 94518808, -4447976, 43201464, 54335096, -31084288, -16762184, -53597432, -98354752, --89000848, -94003952, -169333920, -124311920, -75579616, -132449816, -140167872, -115754736, -123284352, -122127928, --146591536, -134413680, -135646880, -127032248, -118471304, -108113992, -100013144, -100224136, -83204792, -70188352, --110928264, -16963510, -49847392, -57363584, -12874164, -7123740, -56115360, -7131793, -21639656, -8070781, -20755430, 24841018, 65246996, 38691748, 54559508, 60465088, 65846680, 59726888, 83419536, 81347752, -86646136, 80821624, 97010424, 99584184, 97806072, 79061224, 102270152, 107405320, 83400752, 56191596, -54465016, 32988570, 28629178, 7789460, -3415573, -3235721, -17642116, -15925739, -12101607, -7037841, --15665893, -16919486, -15651935, -7326141, -15650861, -20058572, -11640435, -3979287, -13694503, -18891950, --15096273, -12797392, -20027432, -20374788, -15313169, -9833864, -8535174, -8010114, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +5248450, -212064, 2153926, 833761, -4591320, -3453691, 1197759, -3111704, -4616553, 2632278, +-546535, 686658, -2649995, 1946157, 187905, -4090956, -185757, 4719096, 3835406, -2937758, +-5174899, -4716948, 694174, -1088237, -924492, -4014721, 4366908, -1163399, 1230508, -1832340, +-1111323, -402653, 1656247, -1189706, -2298881, -8810589, 2995740, -671626, 2847027, 1686848, +1196685, -231391, 5872831, 1099512, 1173600, 815507, -3004867, -1925756, -278636, 427349, +-3008088, -716186, 1170916, -418222, -2842195, -1501091, 104690, 2775086, -4351876, -5907728, +-7315403, 2585570, 4191351, 419296, 3466576, 2538863, 486942, -6710887, -174483, -1759863, +-2352568, 111132, 374736, 2773475, -598611, 3949223, 2799782, -1256278, -4016331, -1959042, +-717260, 1020055, 307090, 1290638, 1504849, 2755759, -58519, -270046, -1300301, -1132261, +-1076426, -485331, -2240899, -1064615, -1267015, 690953, -148176, -288300, -688805, 1044214, +-1577327, 3165391, 4140349, -963683, -63351, -5941014, 5283884, -6803765, 2617246, 11435887, +-2460480, -4269735, 641024, 5961952, 625992, -1708860, -836982, -1722282, -1091995, -5389110, +-2103997, 2640331, -4280472, -2453500, 233539, -248571, 4711043, -2893197, 872952, -1126892, +1022739, -611496, -2765422, 5215701, 8880919, 2240899, -514859, -1677722, 9612137, 437550, +-4031364, 258772, -7182259, 16106, 3737159, -5516349, -707059, 1171989, -4405563, -1332514, +5059472, 712965, -550830, 4881231, -3259343, -5149666, 2903935, 1923072, -3597035, -1786706, +-3850438, -4512400, -4853850, -2688113, -2777770, 3924526, 2789581, 765041, -116501, -2731599, +2521683, -595390, -1866163, 3325379, 3674882, -2629594, -529355, -1245541, -1679869, 513249, +4211216, -2131915, 940061, 4015795, 2653216, -924492, 1015223, -704912, -114890, 1701344, +-245350, 25233, 1731409, -1856500, 748935, 380641, -597537, -1710471, 1306207, 149787, +-767189, 402116, 184684, -613107, 192200, -314069, -572304, -998580, 5847061, -8523899, +-5627481, -2029909, -1240172, 287763, 1096290, -8128226, 5644124, -2567854, 1844152, 1162862, +1878511, 3549254, -25770, -1177358, -2705293, 5849746, -462783, 3802120, 7225209, -1569274, +6143414, 5239323, -4543539, 3035468, 3072512, 3295314, -8017094, -798864, 478889, -2521683, +-5042829, 76236, 5883032, -1383516, -2520609, -1981054, 1799054, 5452998, 2693481, -2789581, +-46708, -2301029, 230854, -733903, -2719251, 5092221, -6585259, -5443334, -4998268, 1542967, +-703301, -182536, -6143951, -6489696, 1579474, -139586, 366146, -642635, -345745, -4845260, +-2866891, -5297306, 1036698, 4534412, -1415192, 4023311, 753230, 3576634, -7733089, 30065, +1116155, -2582886, -1167694, 1029718, -2756295, -341987, 2024540, 2184528, -1716376, -5175436, +4552666, 710817, 110595, -1146219, -661962, -4144644, 181999, 282394, -729608, 744103, +133144, -1464584, 623844, 667331, -418222, -599148, -206695, -250182, -280247, 224949, +2179696, 33286, -654983, 1801202, 804770, -145492, -601832, -181999, -2920578, 720481, +-586263, 5018670, 7982734, 506269, -3035468, -6788196, 3106335, 2015950, 1883880, 8456254, +-5528160, 195421, 1030255, -1532767, -2765422, 1250909, 533650, 5097590, 11246909, -989990, +1947231, 4702989, -2038499, 4195110, 7310571, -5100811, -189515, -1900523, -104690, 3261491, +-5692979, 6152541, 1373316, 72478, 3244848, -532576, 4492536, -2433636, -1032403, -1263257, +7056632, 3289408, 4495220, -850404, 3704409, -6845641, 7917236, -3062849, 3115462, -7206419, +2911451, 5234492, 9649181, 3543885, 1804960, -6345814, -2427730, 1755031, -4801774, -5713917, +-1352378, 11399380, 13202193, 2533494, 3109020, -3763465, -1669132, 7383049, 1443109, 3234647, +-442919, 2249489, 1981591, -972810, 1691143, -1076963, 1275605, 892816, 4665945, 3797288, +-5851356, 5219996, -1709397, 2685965, -1840930, 1975148, -1553168, -2173254, -38118, -3471407, +548145, 2546916, 581431, 1315334, -1231582, -1532230, -788663, 639413, 111669, 584116, +-222801, 406411, -979789, 369904, 376883, 1855963, 111669, 1265405, -592169, 1133871, +5567888, 156766, 695785, 7811472, -6576132, -7741679, 12072079, -3124052, -1929514, 7894687, +4726612, 586800, -13843753, 14963129, -2735894, -1886028, -1567126, -810138, 599148, 929860, +4682588, 6984154, 4602595, -995359, 7835094, 4974109, 2521683, 2114735, -2874407, 3582540, +-5622112, 4503810, -852014, 1891396, -4757750, -6914361, 896574, -865436, 2548526, 4188667, +-2048699, -6616397, -3858491, 1644973, -7945153, 5157182, 1609002, -12670154, 5743445, 892816, +3290482, 839129, 1985349, 2172180, -504122, -3558917, -3091840, -8637716, -6345814, -3512747, +-4405563, -952946, 533650, -6314676, -8951249, -1313186, 5851893, 10077067, -493384, -6665789, +1132261, -10496900, 743029, -689342, -4118337, 8909910, 8370892, 2842195, -300648, -2114198, +-610959, -4631586, 2215666, 8547522, 4575214, 7070590, 1442572, -3175592, 3295314, 1737314, +-215822, 709743, 404801, 243739, 1541893, 1604170, 1529545, -438624, 2669322, 754841, +5250061, 2080375, 1421097, 285078, 468151, 1418950, -358093, 2492692, 921271, 989453, +-1381369, 3091303, 779000, -1047972, -439697, -13585518, 7031399, -2587718, -4828617, -3828427, +-4618701, -6455336, 12463995, -15857019, 3750043, 3840238, 5199595, 7758859, 1282585, 2160369, +2928631, 2106145, 1625108, 2632815, 6831683, 1237488, -3745748, -1611, -649077, -4878546, +-4407710, 2266669, 4581120, 4923643, 677531, 3511673, -8254391, -956704, -107374, -450972, +-7821136, -4687957, -2809446, 5122822, 4604742, -78383, -8560944, 49392, -4632122, -3321084, +-1674500, -2305324, 5394479, 7326678, 2234994, 7621420, -12183748, -8519068, 4067334, 2490007, +425202, 1612760, 808528, -3954054, -7659538, -5300527, 4076998, -3435437, 6228777, 6121939, +-2220498, 5800890, -9220221, -4565550, -2586107, -3115999, 686121, 16811038, -2405719, 4753455, +-2671470, -2435247, -1701344, 3566434, 3836480, -447213, 3099356, 2108292, -5232881, 1444183, +413391, 2248952, 500901, 273804, -2632278, 1692217, -97711, 1714766, 561567, 886374, +-476741, -1006096, 514322, -1534377, -2194728, 747324, -1195612, -1899986, -548145, 565325, +762894, 746787, 836445, -113280, 604517, 1187022, 1006633, 330712, 303869, -397284, +-623307, 1107028, 13911936, -2665564, 388158, 5863704, -13227426, 9106404, 4622459, -7451769, +8289287, 9273371, 3118683, -14281840, 8843338, 392990, -1339493, 7242926, 7823283, -434865, +-2299418, 236760, -5537824, 5198521, -3024194, -5275831, -11108933, 2605435, -12075301, 3253438, +-2953327, -1342714, 3492882, -9837086, -4037269, 8195335, -707059, -3812857, 5018133, 341987, +-4289062, 3717294, 1352378, 373662, -1834488, 2837363, -5986111, -619012, -8745627, 8291971, +8288750, -10299332, 6897718, -7344931, -2768643, 7128035, 9961640, -712428, -4951024, 3019362, +-617938, 1445257, -12159052, -9609989, 1928977, 1736777, -2623151, -2490544, 3163780, -365072, +-4304631, 5153961, -4963372, 1752884, 3729642, -841814, 5844914, -5840082, 5910412, -30602, +9398999, -3211025, 2858838, 5311801, 607738, -3357054, -950798, -339302, 2762201, -909996, +-4411469, 3735548, 817118, -1843615, 1654099, -1236951, -48318, -1729798, -490700, 1282585, +-1472637, 963146, 2582886, -1325534, 634581, 188442, -845572, 1639067, 443992, 1396401, +-2067490, 853088, -2116882, -2420751, 912681, -377957, 995896, 1034013, 315143, 3847217, +1676111, -5063767, 9760850, -3343632, 4748623, -9858561, -700080, -2603824, -8950175, 309775, +6319508, 11232950, 14697378, -8374113, -236223, -10437307, -782221, -6648073, 5931887, -6225018, +-12307766, 794569, -7888781, -741419, 10202158, -6052146, -6037651, 10947872, 336618, 1879048, +-1147293, -6441914, 2732673, 2333778, 13194140, -9108552, 6469832, -7725573, 1923072, 2559264, +-7622493, -4694936, 12669617, 3462281, -9428527, -2437394, -3451543, -7570954, -321586, 12418361, +6651294, 8640400, 1973001, 3452617, -11339787, -1643899, 14414447, 1138166, -8963060, 4790499, +4763656, -6579890, -5729487, -3173981, -14814416, -2288681, 4395362, 7313793, 13001403, -3263638, +-7117835, -2062658, -4431870, 10553808, -3931506, -9222369, -6285148, -2727841, -1262184, -2860985, +-5332202, 11490111, -6592238, -805306, 1057099, 544924, 3748970, 2335389, -3390340, -4552129, +3411815, 4096862, 4333085, -998043, 1957968, -1207423, -721018, 1933809, -430570, -2021856, +2039573, 952409, -63351, -1326071, -446677, -3365644, 308701, -839666, -2893734, -1481227, +1309428, 1138166, 49392, 1337346, 6324340, -21955872, -15133854, -9700721, 1158031, -18396418, +2749316, 13674639, 4524748, 14079977, -7555921, -3484829, -1529545, -7318625, -2739116, -10986526, +19526532, 11148124, 7784628, -16497506, -3189013, -5310190, -10734197, 3711926, -1130113, 3480534, +-13332652, -918049, -1195075, -9575630, 5569499, 1584306, 9784472, 3934727, -8182987, 12890271, +-6096169, 5230734, 2714956, -110059, 10201084, 9479530, 2391760, -12303471, 15006079, -7598871, +10759430, 4903242, -5568425, -6194954, 12065100, 1768453, -1406602, 3138547, -10192494, -3656091, +5877126, -855772, 10669236, -6171331, -9647033, 3951370, 2729452, 324807, 10610717, 4569845, +2157147, -6773701, 7721815, 3024731, -5919539, -818191, -635655, -3406983, -2476049, -2873870, +4644471, 11650636, 19640348, 9123584, -3313567, 992674, -4509179, 4514548, 6043019, -100395, +-5018670, -2956011, -6550899, 4035659, -3579318, 954557, -3095061, -852551, 4357781, -522912, +471910, -3992172, 4261682, -2254858, -1912871, 2335389, -3920232, 4289599, -3003793, 2294050, +-2123325, -406411, 961536, -2930778, -2081449, -1288490, -4769025, -4794794, -2102923, -257161, +-1690070, 3787088, 3499862, 2041183, -13863081, 18636400, 7727720, 21311090, -9553618, -11442867, +20308216, 690416, -2091649, 4455492, 1562831, 11891691, 15843597, 2071785, -14704894, -23554674, +3315715, -6497212, 1448478, 673773, -10188199, -645319, 12846247, 10502806, 8264591, 16534550, +-3720516, 14011257, -9824201, 12409234, 4094178, 9616432, -6427956, 16935056, 9759239, 12368432, +-19602768, -86436, 17861696, 10169946, 3257196, -4225174, 26861800, 11340861, -10508711, -6479495, +6564858, -10231686, -978179, -4907000, 1403381, 22551800, 23629836, 17156246, 6317360, 207232, +8908836, -7827041, -1959042, 9683004, -10001368, 23880018, 14904073, 11725798, 4639639, -908922, +-11250130, 14183056, 536871, 12373264, -5500780, 4814659, -7931731, -4548907, -180926, 6246493, +-9333501, 22233972, 9601936, -2432025, -10865194, -20928838, 10329933, 1848447, -6784975, -627602, +2621541, -4879083, 3070365, 8098698, -1371705, -2765422, 281320, -1697586, -2056216, 1842541, +-2500745, -1837709, -3437048, 3639448, 2094333, -5244692, 2986076, 3390877, 3300146, -93952, +-1529545, -579284, -13422, 1761474, -423054, 1305133, -3089155, 5142150, -6415608, 118112, +2246268, 5763309, 22985592, -1382980, -11419244, -5169530, -8962523, -380641, -14354318, 3673808, +-12376485, 6943352, 1541893, -3366718, -9752260, -11631308, -17627620, -18267570, -5462125, 15778099, +-1233729, -10353019, 4206384, -9874130, 7495792, -8441221, 14761266, -15257334, 3504157, -10833518, +-11105712, -2067490, 1824287, -3263102, 6937983, -21942988, 8763881, 2070174, -5335960, -1557463, +-1512902, -10881837, -17440788, -18671296, 13342853, 6584185, -7346005, 11558294, 308701, -4884452, +-13771276, -28849832, -23783918, 13390097, -4212826, 257698, -2918430, -1400159, -1444183, -19556596, +7346542, -23095112, -12368432, 1009854, -798864, -4977330, -3175592, -3120294, 23695334, -7406671, +-7831873, -6501507, 24793236, -4540318, -10074383, 15708306, -12453258, -7923141, -10279467, -8645769, +-32168768, 6367826, 5046587, -10810970, -1654099, 7436199, -4282620, -2950643, -6079526, -5548561, +-877247, -2935610, -2946885, 11129334, -1032403, -1272384, 7378754, 8839043, -4516158, -3297998, +-845572, -1641214, 2156074, -5505075, 497142, 562104, 892816, -3300682, -4113505, -1704565, +3524558, -1553704, -3094524, -473520, 2182380, -7076496, -1242319, 3910031, 122943, -2856690, +3628174, -2500745, 3198677, -73551, 3049964, 3342022, 3337727, -6189585, -769336, -33990908, +-25667262, -14683419, 29677150, -1512365, -4947266, -3626563, -2340757, -9780714, 10502806, 8119099, +26560614, -24512988, -4779225, 7548405, -17931488, -7176354, -6344741, 30595200, -448824, 7052337, +15573551, 1408749, 14988362, -16185584, -20344186, -13614509, -3745212, -3461207, 2427194, 9560060, +-471373, -17136920, -11825119, -878321, -9149891, -19225348, 17157320, -2869575, -9590662, -122407, +5507759, 5449777, 3203509, -8688719, 1748052, -17877802, -7829189, -26512834, 12455405, 8008504, +-3138547, -8325257, 9796284, -13210783, -3379066, 28600188, -3016141, 24238112, 10838350, 6498286, +-6352257, -30443802, -12666932, -5856725, -16396038, -12256226, -7819525, 13625784, -6236830, 310311, +-12241731, 25958246, -9290551, 10707353, 7254737, -17711908, -7137162, 3905736, 16402480, 29967060, +24919400, 10801843, -1713692, 10289131, 62814, 894964, -5891622, 3027952, -6090801, -4224637, +-128312, 1764695, -3685619, -4868346, -8796630, -6991670, 3709241, 2881386, 3018288, -3233574, +-1381906, -17439714, -366146, -8042327, -3817152, 3159485, 2379412, 1008780, 7166153, 179315, +-1065152, 719407, -2959233, -12653511, -1253057, -7191923, 3546032, -6381785, -7010461, 813359, +8007430, 3682398, -2370285, -4725538, -4450123, -2076617, 4260608, 1140314, -2036351, 17648558, +-816581, -9993852, 10902238, 6263673, 36871756, 1315334, 459025, 13032541, -16555488, -11409581, +-3237869, 3083250, 6025302, -4408784, 15650324, -9507984, 2243047, 14710800, 6676527, 5492190, +5515275, -10758356, 2136209, -260919, -5199595, 2311229, -7755101, -13898514, -7192997, 1175210, +-13651017, 17860084, -1189169, 1857037, -2328946, 12319577, 13922136, -2525441, -10072772, -849867, +-3129421, 16375637, 21027624, -14769319, -10083509, -7419019, 5361730, 15625091, -13748727, 4743255, +-469225, 3365107, -7079180, -9561134, 3177202, 10350871, 2052458, -12539157, 11608760, 33770256, +-10740639, 6389301, -2383707, 2731062, 13145821, 3808026, 15471009, 12942884, -3218004, 19767050, +35836132, 1588601, -13042205, 35084516, -550293, 33554968, -11414412, -16199006, 15552077, 6096706, +23467702, -3631395, 32990718, 10536629, 7754564, -9669045, 15695421, 1983201, 1692754, 3828963, +12839805, 2850785, 14643691, 1948305, 3732864, 684510, 2311766, 2513630, 4764730, -1279900, +5325223, 12412455, 5245766, 5791227, 1861332, 3481071, -6669011, 6177237, 2431488, 2942590, +4522064, 2542084, -299574, 129923, 3558381, -3207267, 1319092, 386010, 3180960, 8944806, +3269544, -55835, -4280472, 4828617, 929324, 1344325, -689879, 4725001, 2753074, 6876780, +-23116588, -7454453, 36093296, 6043556, -16664473, 4976794, -12622909, 4685810, 6926172, -2918967, +-19084688, -7168301, -28534152, 11859478, 9797357, -10956462, 10626823, 16592532, 3415036, -4432943, +-16665010, 3822521, 26675506, -12738336, 16011101, 15308337, 2420214, 11522860, 10663330, 523449, +13297756, 8894340, -25397216, -3570192, -10232760, 25987774, 17220672, -18076444, 11144903, -2051384, +13707925, 43316892, -4086125, -7289633, 4334159, 38989712, 16004122, -2363843, 4991826, 7090454, +22498112, 19879794, -13566191, 23858544, 10939819, 22119618, -15631533, 2405719, 4443144, 4733054, +13667660, 20301236, -13180181, -10455024, 16068010, 8055211, -5445482, -5709086, 65498, 24360518, +-45873472, 10830297, -16303696, -12020540, 2222646, -15698642, -14595909, -2080375, -25079388, 18133888, +-5322538, 19158238, -678605, 16761110, -11040750, 6754373, 418222, 5560372, -503048, -6436009, +5085242, 3590056, 4065187, 8187282, -3972845, 4152160, 5650030, -4677220, 453119, 7823820, +2914672, -4187593, 8728984, -5718212, 1190243, 4554813, -5578626, -4210142, 1800128, 1752884, +9735617, 8053064, 5786395, 2932389, -901943, 6283537, 1440425, 2772938, 2798708, 5215164, +6366216, -5247913, -4363687, -8493298, 6726993, 2653753, 575526, 2119030, -8945343, -8573292, +5996311, 7803956, 8240969, -10150618, -12122545, -31379032, 1490354, -17498770, 28650654, 3519189, +-7358353, -4218195, 17222282, 4971425, 27927488, 11274289, -7162932, 1188632, 5954972, 12715788, +21030844, -23415088, -20223390, -4227322, 35321276, -10826539, 4575751, 10086731, 15521475, 18766860, +26868242, 23175106, 2115272, -5481989, 25099788, 1979980, -15862388, 8519068, -14710263, 10723460, +2747169, -13144747, 12145094, 47095392, 26295400, -16579111, -12502113, -1671279, -12972412, -12896713, +-11101954, 8123394, -6288906, -10966662, 2531346, 12991202, 7820599, 4337380, 18571976, 5004711, +-4394826, 19573776, 16529719, -14067629, 9663676, -15886010, -12367895, -14079977, 42950, -34074124, +-10021232, 23790898, 17604534, -8076149, 11847667, -2821257, 925565, -20925618, 4795868, 12627741, +20064476, 11279658, 13316009, 7299834, 6415608, -8907762, -7807714, -9477382, 5419175, -2021319, +824634, 4080756, 4255776, -404801, 10407780, -3223910, -4489852, -4910758, 7318088, -9469866, +-3794604, -11687143, -581431, 2321430, -5009543, 471910, -2754685, 7320772, -1365263, -15424301, +271657, -1051193, 4636417, 6045704, 1990181, 6868190, -403190, 11162620, 2312303, -881542, +-271657, 1218160, 497679, 566936, -12811351, 10594074, 8552354, -16271484, -6954089, -35381940, +-2815351, 29511794, 370978, -21618718, 3502009, 1017370, -14508936, 19673634, 11391327, -7901666, +5618891, 8919036, 12164421, 6753836, 2124398, -8730058, 4780836, 7004018, 18821084, 28102508, +-7698192, -18912352, -9944460, 5363878, 5866389, 23128398, -8826158, -18111340, -14097156, -14490683, +27994596, 51287816, 18640158, 2574833, 56273736, 3384971, 23337778, 13311714, -4723927, -11795054, +10011569, -15969762, -10636487, 11405823, 776852, -33896956, -35102768, -8781598, 14674830, -18315352, +-22969486, -12648142, -17004312, -14001057, 11871290, -9750113, -26046292, 11716671, 1035624, -7593502, +6102075, -5869610, 13142600, 52789444, -32331440, 26613228, -36761160, -20846160, -12183748, -8318278, +20445118, 8260833, 9806484, -3970697, 11360725, 23691576, 5929203, 555661, 310848, -6872485, +3260954, 6496138, 18983756, -1140314, -9403831, -1403381, 14501957, 9322227, -4096325, 5500780, +6582575, -5232881, -179852, -2237678, 18197776, 6594923, 8628589, 6405944, 5207648, -7491497, +-5310190, -1177358, 4671851, -9167071, 1349157, -9040906, -6237367, 1475858, 969589, -10391137, +10198400, 13934485, -1363652, -1773285, 8476655, 125091, -3638911, 12335146, -5059472, 8560407, +798864, 28574418, 18377628, 16569447, 24336358, -28398860, 10922639, -29744796, -1192390, 38876432, +34575024, 14739254, 537408, 6727530, 4393215, -11148124, 9010841, 11194295, -48985176, 3003793, +7202660, 14897631, -17949742, -27581744, 20234128, 9573482, 5149666, -11788611, 23999740, -3370476, +18656802, 15502684, -1846836, 2368675, -5418101, 18894098, -11207180, 5769752, 11369852, -987843, +24146306, 13981729, -1348083, 12389907, 14078903, -722628, -10893648, -36741836, -6771553, 3929358, +-21755620, 2109366, 17369922, -33387466, -14810121, 5129265, -14348412, -2317672, 17631378, 1030255, +-12459163, -16262357, 7253663, 7070590, -33750928, -11247982, -2792803, 149787, 21216064, 10399190, +2383170, 37056440, -4655745, -1190780, 1475858, -21121576, 20029580, 181462, 32861868, -12722767, +-5477694, 9893994, 4978404, -27987618, 928787, -3853660, -11184632, -9036611, 3519189, 1174674, +-7884486, -687732, -4890357, -3447248, 1039382, -11963095, 3476776, 1661616, -1653026, 4600447, +1282585, -7890392, 1636919, 2281702, 2127620, -7632694, 11203959, 2215666, 14570677, -10706817, +1384590, -9018894, -3159485, -1643899, -16069083, 3443490, 1529545, -654983, -2144263, -2889976, +6001680, -7237020, -5561446, 7028714, 9413495, -9306120, -34672196, -30218854, 5537824, -15552613, +-4867272, -23284628, -29007136, -30520038, -20055350, 21777632, 29727080, 802085, -24465208, 1948305, +1151051, 338766, 11307575, 18978386, 18977850, 484258, -12284143, -30447560, -17454210, -26650808, +-5710696, 129386, 2263448, 2767570, 3765076, 7360500, 9536975, 17961554, -28161564, 12382928, +4939750, 6234145, 15130096, 26743688, 30026116, -17275970, 13389024, -23884314, -7450695, -21671868, +-2100776, -8441758, 49908056, 17711908, 35957468, 1521492, -19269370, -8278013, 23032298, 24921010, +-14629732, 46033460, -19270444, 2874944, 2036351, 7997229, 16919486, 51208360, -3571802, 12540768, +28525026, 6512781, -22582938, 14358613, 52405044, -9562745, -12668006, -30902290, -2564632, 19328964, +11941083, 1621887, -29656750, -22476100, 3786014, -23453742, 7074348, 1037772, -29524142, -3348464, +3052111, -4644471, 21343304, 20033874, 455803, -5850819, -12712029, 13868449, -5871221, 24102820, +-5483600, 311922, 16525424, 16571594, 23598698, 18216566, -13297219, -5221070, 3192235, -4408784, +1627256, -10151155, -9737765, -9885941, 5184563, -12106976, -14077829, 8361228, 10950556, 983011, +-12087649, 7705708, 4326643, -2988224, -3051038, -8247411, -127238, 4702989, -2042794, -7374459, +-9552544, -1832877, -6256157, 7879118, 4478041, -4090420, -5290326, 10084046, 46531140, -2442226, +-289373, 19723026, 3806952, -64277408, -20220706, 45590004, 15151571, -13423383, -25621090, -3629784, +-16936666, 23490250, 12192875, 4380330, -13588740, -30449170, 6495065, -52421688, -6430640, 25578140, +34936336, -4077535, -29721710, -20264192, -61336964, 17956184, -10675141, 23969676, 18116708, -17464410, +-12711493, -54444080, -40893996, 21233782, 57941256, 23106924, 27504970, -19352586, -34490736, -33111514, +-13894219, 49228916, 66342212, 34572340, -77173048, -28325846, -59144384, -31654982, 73260328, 17821966, +16225850, -9776419, -70604432, -57835492, -58016420, -10827613, 5598490, 36506148, -13593571, 27760522, +-55994564, 34754340, 13900662, 4199941, 70351024, 4476430, -6523519, -3409130, -95494304, -29213294, +-6505802, 30029338, 15663209, 13705778, 42119132, -45089104, 2886218, -29850560, 32491428, 23439784, +2236067, 6451041, 6909529, -5360119, 19319836, 10322417, 5125507, 16422344, -11236708, -21021718, +5091147, 15018964, 22858352, 18806588, 12429635, -15793132, -25545928, -35830228, -3204046, 2521683, +28958280, 35851704, -5405217, -27370752, -46979964, -22594750, 3350611, 35866736, 57643292, 14977088, +-56385940, -57922464, -59074052, -694174, 48194900, 42381664, 44775036, -15087146, -21800180, -42074036, +-42408508, 15494631, 28681792, 37330244, 18991272, -29693256, -27988692, -15897821, -4413079, 34633544, +18415210, 5669894, -1547799, -21342766, -15317464, -3241627, 4268661, -27590334, 52947284, 22723598, +24268712, -65591668, 13151727, -91370064, -20199768, -275415, 12898324, 5230734, -58566176, 31687194, +-16267726, -10576894, -11059541, -12491912, -14395657, -18146774, 38287484, -11010149, -32992866, 10472204, +-9380209, 3986267, 18432926, -37246492, -13370233, -2342368, 15544560, 1551557, 42121820, -3636764, +-24188718, 55632176, -47182364, 27488328, -43759812, -14509473, 21266530, -35556424, 2542084, 25681220, +-13485124, -3121368, -2696703, 33083060, 50514720, 29196650, -17063906, -7064685, -7953206, 3144990, +16195248, -6765647, -10105521, 9770514, 5165772, -91743720, -3737159, -3461207, 13299903, 11322608, +554588, 75162, 26038240, -28933048, -7458748, -2891050, 19834158, -73680704, -10360535, 66432408, +-17089138, -26920318, -282931, 50247360, -9307194, -12144557, 13672492, -19918984, -20783884, 30992484, +48118128, -17555142, -24507084, 8184060, 14406931, -7755101, -25831544, -676457, 3715147, -5383205, +-3782793, -8211441, -11259257, 5135171, 344134, -10475962, -1881196, -555661, -393526, -9674951, +5466420, -12903155, -13511430, -8078297, -8258685, 12321187, -1826435, -2823404, -294205, -7321846, +10328323, -13712220, 3901978, 180926, 978179, 9162239, -433792, -16449725, 1874216, -4510253, +3062312, 1992328, -14595909, 22780506, -6041945, -2416993, -2188286, 1868311, 5859409, -785979, +-5348845, -12221866, -22310744, -67123360, -55140936, 48186848, 41077604, 3758633, 43885440, -48110612, +-2922725, -92759480, -33041720, -16550120, 44715980, 40695888, 24888798, -37435472, -12973486, -1791001, +-17926120, 8642011, 16079821, 20918102, 27991912, -21612812, 15625628, -40227736, -25500832, -6499896, +-8668318, 911070, 26381300, -31792958, 27180700, -12379169, -17719962, -7145752, 2434710, -39873404, +-1010928, -36114232, -13558138, -14119705, -34313032, 46849504, 21456046, 10524817, 11365020, -9241159, +-48062296, -71184248, -41641320, -41924248, 28233504, 6635188, 30441654, 42484744, 35006668, -11643119, +8310225, -24672440, -18966576, -22550188, 17466558, -23891292, -1251446, -22807350, -23567560, -14883135, +27558658, -22415434, -6392522, 2116882, -3293166, -32270774, -34713000, -21106544, -12514461, -46750184, +-27857694, 6926709, 27963458, 29180544, 37263136, -2567317, -30575872, -39592620, -30466888, 15353434, +4851166, -5023501, 18084496, 45932528, 12128988, 12159052, -11754252, -8871792, -15262703, -9385040, +-4985384, -14805289, -3491272, 17342542, -3850975, -7866233, -14292577, -15906948, -17867600, -5431523, +8586176, -4911832, 3638911, 1998770, -32106492, 3314104, -15338939, 13255343, 25695178, -13129715, +17736604, -2423435, 4291209, 441308, -25391310, -4197257, -8295730, -6752226, 23113366, -14740328, +-99975568, -135506752, -128042104, -121785944, -146004736, -24419574, -40365712, 25920128, 41320268, 130760816, +84006872, 110859552, 152775200, 167980464, 114683680, 145937088, 83072720, 38725572, -5827197, -27396522, +-37221796, -61609696, -60469920, -83566104, -35329328, -30740154, -78617232, -58704688, -56209848, -63931660, +-104020888, -70853000, -54539104, -43803296, -80052288, -11157251, -23970212, -33285460, -77518792, -71603544, +-59025200, -50471236, -36640904, -14903537, -49276160, 14271103, 25593174, -38579544, 43280924, 60108604, +57759256, 104812768, 85182088, 65615824, 72219872, 72659576, 72108208, 110221744, 124031680, 121886344, +83422760, 131459288, 129814312, 135242080, 137529152, 156161792, 138625440, 146378928, 194237216, 99092408, +100071664, 101423504, 94518808, -4447976, 43201464, 54335096, -31084288, -16762184, -53597432, -98354752, +-89000848, -94003952, -169333920, -124311920, -75579616, -132449816, -140167872, -115754736, -123284352, -122127928, +-146591536, -134413680, -135646880, -127032248, -118471304, -108113992, -100013144, -100224136, -83204792, -70188352, +-110928264, -16963510, -49847392, -57363584, -12874164, -7123740, -56115360, -7131793, -21639656, -8070781, +20755430, 24841018, 65246996, 38691748, 54559508, 60465088, 65846680, 59726888, 83419536, 81347752, +86646136, 80821624, 97010424, 99584184, 97806072, 79061224, 102270152, 107405320, 83400752, 56191596, +54465016, 32988570, 28629178, 7789460, -3415573, -3235721, -17642116, -15925739, -12101607, -7037841, +-15665893, -16919486, -15651935, -7326141, -15650861, -20058572, -11640435, -3979287, -13694503, -18891950, +-15096273, -12797392, -20027432, -20374788, -15313169, -9833864, -8535174, -8010114, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -6308233, -7975755, -615791, 3212099, 1615982, 3783329, -6770479, -3656628, 4343286, 2100239, 44023, --3766150, 767189, -10504416, -6765111, -368293, -4034048, -4562329, 1868311, 8203925, 1373316, -6246493, -1451699, 6172942, -3692061, -3295314, -415538, -5578626, 1102196, 2767570, -2019172, --139050, 1442572, 258235, 2510945, -303332, -5971079, 2130304, -3703336, -2793339, 1669669, --3680250, -5572720, 5533529, -5847061, 5265630, 4915590, 3234110, -272730, -6860674, -3997004, -763967, -1304060, 8812199, -5410585, 2136746, -708133, 1156957, -6687801, -11156714, -1979980, --3357054, -3733400, -887985, 4696547, -1032940, -5040144, 4397510, 1858647, -2246805, 3668439, --731755, 1089848, -5143224, -438624, -1293859, -99858, 1952063, -2366527, 1578401, -4711579, -3154654, -754841, 322123, -1735167, -1567126, -3221, 1910187, 681289, -82141, 715649, --49929, -2850248, 801548, 204011, 1761474, -312459, 46171, -34897, 26307, -207769, --1028645, 4281546, 4270271, 605054, 7701413, -87510, 3325379, 4138738, -50466, -3758633, -392990, -5340255, -6840273, -2596308, -7794829, -8045011, -2621004, 5288179, -1891933, -1832340, --4190814, -1060320, -7326678, 3579855, -2053531, 1808181, 4394826, 1490891, -1544578, 3022046, -2864206, -3575560, 2481417, 329639, 661425, 2679523, -6391985, -2757906, 4524211, -2902324, --213675, -1846299, 5021354, -6437619, -537945, -5391795, 3493419, -320512, -397821, 4871030, --2107755, -2340757, -1685775, -4552666, 323196, -2062121, -363998, 301185, 3096672, 3148211, -1058173, -1398549, -5376226, -8791798, -2727841, -610959, -2174864, 4725538, -1908576, -2710661, -3770445, -2429878, -3773129, 8343511, -1815161, -4667019, -421444, 766115, -1400159, 4115653, --535260, -3678640, 52613, 161598, -794569, -1108102, 3272228, 739271, 461172, -1952600, -406411, -594853, 220654, 1276679, -287226, 723702, 1518271, 191663, -308164, -327491, -643171, -1854889, -693637, -370978, -856309, 771484, 639413, -304406, 8938364, -5683316, --2679523, -4112431, 3321084, 643708, -398358, 6447820, 1553168, 1890323, -9341017, 1724966, --4353486, -5069672, -6584722, -105764, 245350, 7828115, -6387153, 2962454, -2673617, 9678709, --3480534, -3204046, 6894497, -2630668, 2386391, 1040993, -446677, 1139777, -4606353, 752156, -228707, 1954747, 9106404, 3171833, 861141, -3881577, 3194382, -7066295, -1949378, -1351841, -3883724, 3310883, 5507759, 3606162, -4107599, -6058588, -2631204, 4632122, -554588, 2405719, --960462, -666794, 9260486, 2183454, -687195, -11034845, -4908074, 289373, 3854733, 5907728, -8325257, 4656819, -1991254, 1492501, -2019708, -2821257, 5978595, -3754338, 6155225, 282931, --5525476, 2000918, -2838974, 4794257, -4096325, -468151, 4182225, 4782446, -4775467, -1836099, --884763, -1961190, 2897492, -642098, -2030983, 1330366, 712965, 732829, 826781, 1160715, -646929, 694711, 327491, -343061, -397821, -1772748, 2780455, -105227, 185757, 318364, -62814, 441308, 1494649, 1435593, -44560, -374199, 1858647, 1401233, 1119376, 4686883, --1122597, -785442, -1729798, -5486284, 213138, 3940096, 3925063, 7342247, 3365644, -9642202, --8054138, -6989523, 288837, -1184337, 511638, -3808026, -2365990, -592706, 2927020, -39728, --6177774, 6674916, -954020, -6202470, 1269700, 1464584, -127238, -595927, 2683281, 3534221, --2212445, 5401995, 267899, 3164854, -7368017, 5240934, 1864016, 3022046, -5071283, -557272, -3707094, 3172370, 8046085, -301185, -11112154, -3039763, -5323075, 2603287, 1799591, -461172, --2967286, 847719, -4557497, -1615445, -8298414, -4884989, -280247, 4619774, 5156108, -3724274, --3187940, -3263638, 5299453, -1810329, -653372, -7969849, 4801774, -7866233, -2732136, -343597, --1663763, -2138357, 8366060, -714575, -1945620, -2241973, 1659468, -5045513, 579821, -8748312, --7030862, 2559264, -2455111, -1308891, 3124589, -1586454, 4168803, 819265, 1914482, 2933463, --785442, 1415729, 956704, 539555, -617402, 1070521, 433255, 261993, -651761, -690953, -170188, -2565169, -48855, 1604707, 384400, -102005, 303869, -1575716, -509491, 957241, --471373, 2231236, -2899640, 4105989, -3301756, 3221, 5667210, 10318659, 7138773, 1532230, --8079371, -6062347, 2168422, -1387274, -5181341, -1701344, -6674379, -2870112, 13411035, 1549946, --1428614, -2498597, 8053, -3121368, -2158221, 9067213, -9409200, -1110249, 929324, -2013266, -2362232, 5484137, -2520072, -3098282, 1387274, -3854196, -3760244, -8749385, -3240553, 2356327, --7832410, -1313186, 3886946, 5900212, 2099702, -12286828, -3707094, 2468533, 6193343, -4820564, -10688026, -1246077, -5424544, -3026878, -2313914, -4224101, 5810017, -4345970, -1159104, -5739150, --4502200, -2107218, -4578435, 6142877, -2261300, -12317429, 4704063, 8262980, 110059, 2985539, --14969035, 11680700, 211527, -9816148, 989990, -6631430, -1406602, 1035087, -7124277, -8359617, -5550709, 2593087, -7238094, -498753, 179315, -4482872, -567473, -1660542, 1112397, -3979824, --2053531, -792958, -1982127, -1014149, -2925947, 950798, -199179, 1493575, -3181497, 738198, -1787243, -54761, -1811939, 1152662, -1759326, 1656247, 1351304, -1356673, 1317481, -260382, --936303, -446677, 453119, 625992, 374736, -11076721, 2500208, -8153459, 8719320, 2225867, --3313031, -6579353, -11533598, -5007932, -8348880, 2894271, 16143708, 2765422, -4180614, -230854, --2199023, -2468533, -7256347, -4764730, -7471096, 2047089, -548682, 1664300, -2604898, 1264331, --7895761, -520228, 1824824, -5355824, -1967095, 703301, -2918967, 801548, -2685965, 11941083, --14548128, -2567317, 1194538, 3944391, -1489817, -5955509, -8918500, -6308233, 4803384, -1247151, -5327370, -4505958, 13817447, 1838783, -2666101, -105227, -8190503, -10455561, -5286568, 4008815, --8941585, -509491, 10523207, -258772, -4970351, -9945534, -16865262, 736587, 8664023, -2360622, -9940702, -862215, -3107946, -6194954, -5508296, 1006096, 3949223, -3142842, 14412300, 4393215, --4625143, 2258079, -5920076, 2217277, 2725694, -1940252, 3124052, 5881421, 2482491, 311385, --3868155, -10549513, 712428, -2364916, -1067836, -1575179, 761820, 268972, -139050, -4640712, -738198, -2644626, 878858, -2604898, -879931, -650151, -244276, -199716, -512712, -1859721, --1702955, -2041183, -3062312, -3216931, -1364189, 205622, 856309, -1670205, -52613, 137976, -316217, -1261647, 9472014, -4160213, -10955925, -2996814, -8182987, -4258997, -3556233, 11605002, --2917894, -3884798, -4900558, 7461432, 6700149, 5923834, 16365436, 17153026, 7936563, 10664404, --4020626, -4928475, 7086159, 10523207, -4573604, 4629975, 3241090, -9128416, -8654896, 5113159, --1275068, -105227, -8637179, -10953777, -2616709, -8877697, 10049150, 18808198, 3875134, 7428683, -2153926, -2202245, 6709276, -12832825, -3439732, 2681133, 7149510, -4219269, -10378252, 15154792, --35433, -4641786, -3707631, 6224482, -1862942, 5550172, -3792456, 8704825, -733366, -217970, -10737418, 3348464, 4951561, 1939715, -1640141, 8032126, -12222940, -4892505, 4570919, 13835700, --8412230, -971200, -1716376, -1941862, -5764383, -1263794, -2990908, -3958349, -565862, 935229, -3908957, -1619740, 11101954, 4050154, -6370510, -1532767, 832150, 4242354, 1503239, -1922535, --3841848, -835371, 2456721, -2470143, -2161979, -1889786, 2280091, 1421634, 2252174, 1175210, --2040110, -807991, 71404, -2061047, -351114, 1615982, 1005559, -253940, -2287070, 3032247, --408559, 1887638, -1272384, 926102, -2657511, -257698, -383326, 128312, -1768453, 6856916, --6709813, -2596845, 6191196, -4805532, 2684892, 4668630, -9159555, -9773198, 2804614, 7516193, --2538863, 6862284, -4968741, -2184528, 13055090, -14771466, 8927626, -4192962, 117575, 416612, -16117939, -3563212, 3193308, 5140539, 8885750, 5209796, 7785702, -1273458, -1238561, 2557116, -1262720, 1312649, -7763691, 12103218, -16106664, -3531000, -4231617, 9021579, -1803886, 10990284, --492848, 1052267, -19167902, -5246303, 11704323, 19894826, -169114, -9849434, -8299488, 8180839, -6579353, 4954245, 4697621, -8441221, -3858491, -4880157, 2596308, 376347, -5183489, 3077344, -2684355, -2409477, -2647311, -11558294, -3037616, -4231080, 16557636, 1531156, 3133179, 6287296, -512175, -12936978, 661425, -7782481, 6482717, 15462956, -8174397, 4792110, -2340757, -8002598, -3893388, -6706055, -1146219, 2819109, 2094333, 3550864, 1509144, -545461, -2921652, 3359738, -7257958, 1231045, 3604551, 5970542, 2667712, 6748468, -2019172, 6383395, 335007, 162135, -1403381, 724776, 1845762, -183073, -3116536, -1730872, 149250, 1717450, 1809792, -1213865, -3101503, 2936147, -2449742, 4146791, 6984154, -12017855, -4626754, -4521527, 2284386, -693100, -17877264, -2247879, 620623, 11348914, -10126996, -7352984, -9495099, -9938017, -2417530, -366683, -4457103, 19123878, -1760937, -11010149, 19794430, 324270, 5528697, 13535589, 9321690, 12632036, --3320547, 9978820, -6461779, 13224204, 11546483, -3137474, 6007049, -5325223, -4962835, 4993437, -15115601, 6814503, 5961415, 2141578, -4854924, -8366597, -8539469, 1379221, 10380399, -6060199, --7320772, -8959302, -3432753, -17757006, -4198331, 3401077, -13081934, 6305549, 890132, -5954972, --15363098, -10247792, -24159, -20328618, 6328098, 4496831, -498216, 5660767, 3633006, -1986422, --10641318, -6418292, -1248225, -6712497, 6201396, -7034083, 16773458, -11337103, 537408, 7388418, -587337, -5070746, -19491636, 3381750, 9451612, 2302639, 485331, 10532870, 5738613, -6041409, --69793, -704912, 709207, -432181, -3439732, -6845641, -2128156, -7395397, 328028, 1847373, -814970, -1916629, -3913252, -1772748, -2645163, 3210488, 872415, 4201015, 2895882, 2412698, -824634, -347892, -1561221, -1301375, -3456912, 1542430, 107374, 1536525, -1733556, -223338, --2921115, 178778, -2313914, 865973, -24816858, 8718784, 11337640, 19942606, -54224, -14808510, -4185446, 7137699, -15328738, -15944529, -9960029, -391916, 8521752, -438087, -6238440, -324270, --5457293, -3677029, -9877351, 16510391, 12904766, 4857071, -20233054, -6063420, 3267933, -1149441, --4495220, 25629144, 9402757, 8055748, 7557532, 12167105, 9141838, 2226941, 9571335, -647466, --15891916, 8613557, -16347719, 5005248, -16183974, 13690745, -4265440, 16530255, -8998493, 4021163, --7274064, 5961952, 9687299, 25229174, 5353677, -32068910, -1677185, -4458176, 6910603, 14021458, --2813741, -6223945, 10324028, -1814624, -5033165, 13812078, 900869, -606664, 726923, 5918465, -11070815, 8751533, -9463960, -7050726, -5960341, -9623411, 2285996, -885837, 10947335, 7852811, --14702210, -3548717, -8303246, 7153805, -4025995, -3931506, 2611877, 483184, -5643050, 4872641, -1221918, 812823, -803159, 2771865, 2903935, 459562, -8303246, 2331630, 1494649, -1069984, --1431835, -2771865, 147103, -3709241, 1761474, 4185446, -1231582, -1243930, 4149475, 641024, --3785477, -2937221, -645856, 1998234, -1623498, -401579, -2309619, 628139, -1528472, 15569, -3993783, -2647847, 27016954, -10253698, -18022220, -5745056, 7026567, -4465156, 12978854, 18781356, --7568806, 17223892, 11082089, 8652212, -2857227, -2090039, -3482682, 16706349, 3048353, 2001455, --9742596, 4224101, -5095442, -439697, -16084653, 10880763, -14760192, 54224, -10413148, 17426830, --8921184, 375810, 17224430, 13085155, 8848170, -1067836, -6846715, 7995619, -257698, -1562294, --22011708, -6549289, -13297756, -10813117, -8434779, -3988414, 11436424, 7175817, 6667400, 13959, -16834662, -8933532, 17814450, 15653008, 16803522, 29389388, -11373073, -8885750, 12922483, 2419677, --11414949, 17727478, -5843303, -8580808, 5750425, -2209761, -6160594, -5094368, 7612293, -10305774, -4657355, -6391985, 16284905, -6949257, 243739, 4738960, 11870216, 16131897, 1279900, -14124000, --15340013, 4989679, -10226317, -32905892, -17328046, 5225902, -391379, 9489730, 1194001, -5414880, --648003, -3154117, 1372242, -5729487, -2536715, -3941169, -1676111, 423591, -739808, -10298258, --2730526, -6755447, -6077916, -4774393, 2052458, -505732, 379568, -7509214, -5254893, -311922, --329102, 1427003, 3811247, 3134789, 2304787, -5415417, 212064, 1192390, -7013145, 2415919, -355409, 2990908, 1319092, 3824669, 2116345, -1617592, 3204046, -2537789, -1927367, -25209848, --21310554, -1031866, 4474819, -14551349, 643171, 1285269, 23431194, -15287936, -17490718, 5665062, --7373385, -31139, -12781823, 12169790, -12986370, -17396766, -10528039, 20098836, -13717589, -11206107, --2587181, 8158291, -6017786, -14421963, 4466229, -5842766, 77309, 6558415, -19026706, -1436667, -10525354, 16924318, -2580202, 25871810, 11336029, -2952253, 1141388, 11764452, -4855461, -10524817, -1986959, 14013941, 1552631, 6726456, 304943, -11480984, 3957812, -25201258, 2283312, 1366873, --3220152, -14844481, -13484050, 1633698, -6156299, -10193031, -6835978, -8206609, 9634685, -16598975, --9483288, -4788352, 7210713, -9767829, 20340428, -3066607, -17114908, -1484985, -10193568, -27137750, --8126615, 1793149, -836982, -17631378, -9423695, -4027606, 4007205, -10480257, -5211406, 17388712, --6198712, -23741506, -8362302, 3069291, 1806571, 7797513, 6588480, 4918812, -5525476, -6900939, --1653562, -4823249, 3455301, 1039919, -3053185, 5076652, 2108829, 2982318, -2061047, 2442763, -1825898, -19327, -1019518, -1762547, -2211908, 38655, 1369021, -8443369, 1800665, -4860829, -5415954, 2003065, -6249715, -5532992, -490163, -4380867, -648540, 1775969, -1590212, -2959769, --4637491, -3525095, 2433099, 897111, -5251672, 1952600, 538482, -3496640, -2977486, 19248432, -17204028, 5158793, 35217660, -6540699, -12300786, -11020886, -5161477, -18969796, 25633438, -15352897, --5603859, -12435004, -6415608, -5843840, 3026341, -18039936, 283468, 211527, -2486786, 5132486, --19071266, -4840428, 13086228, -12982076, 716186, -16800838, 16135655, 104690, -28656022, -14860587, --5187247, -603980, 7971996, -17393544, -9757092, 11965242, -2040646, 8269960, 7597261, 7510824, --10441602, 1183264, 12680354, 4705674, -23655070, 15273441, 11016591, -12764106, 36339720, -617402, --26075820, 7263864, 8244190, -530965, 19396072, -5892159, -32395328, 9194451, 4650913, 9769440, -11504607, -14745696, 23447300, 8892730, 7295539, -5499169, 35505956, -2646774, 617402, 24308978, --4134443, 11135776, 19182934, 6660958, 2865817, -4513474, 9222905, 490700, 16219944, -7027640, -15788837, 14579803, 887985, 14429480, 8581345, 11520713, -5812702, 75162, 13104482, 9557913, -7041062, 4336307, 4486630, -8529268, -1010391, 544387, -4035122, 673236, -1462973, -3574487, -7594039, -7661685, -1475858, -7511361, 6618008, -3114925, 7930657, -6610492, 1105954, -4557497, --6675453, 4794257, -2546916, -12348, -6515466, -9514963, -7181186, 7651484, 716186, -2914135, -789200, 9490804, 6760816, -2643552, 3278671, 306553, -2617246, 9819369, 340376, 7093676, --25128244, -24663312, 50577000, 16311212, -31601296, -15896211, -14499273, -28941638, -2157147, -15278809, -21061982, -11921219, 97174, 26268020, 558346, 4354023, -19359566, 24217174, 18051748, -329639, --5851893, -1904818, -15052250, 1126355, 1905355, 3055869, -20681342, -3028489, -1202591, -6242198, --4609574, -14271639, 13496935, 26728118, 32125818, -2637647, -13020730, -5450851, -6660421, -4524748, --19725174, 6687801, 7701950, 7051263, -20554640, -27454504, 29648696, 11175505, 16603807, 21514564, -20195474, -8779987, -13811004, 19465328, -19835232, 10036802, -14845554, -11414412, -6622303, 23163296, --7687992, 4685273, 7973607, -4255776, -18752900, 38748660, -23443542, 2377801, 28094454, -25458418, --11499775, 2959233, 10284299, 28846074, 5186173, -16782584, 492848, 3486440, -3907883, -7067906, -4175782, -11766600, 9010841, -9747428, -13613973, 7318088, 4160213, 10355703, 4705137, -419833, --4702453, 1132798, 2941516, 3165928, 11152956, -684510, 1575179, 6864432, -16421807, 2323041, --7376607, 1762547, 1877438, -2705293, -6187974, -7769059, -1843078, -7797513, 3087008, 4159139, -9558450, -887985, -6316823, 6014028, 7421704, 4433480, 4558034, -11898670, 467078, 2932389, --2883534, 10137733, -3768834, 711354, 1141388, 9355513, -4432943, 2758980, 13125420, -8449811, -8221641, 33676840, 20285130, -3073049, -21614960, 2231236, 34534760, 27492086, 5767604, -27388470, --10566693, -23649700, -1791001, 18457622, 22807350, -1704565, 8651138, 27113054, 28856812, 44793288, -45090176, -22558242, 9788767, -24357296, -4429722, -19751480, -7115687, 15520401, -3511136, 6777996, -6083285, -14043469, -10296110, 11413339, 12728136, 16523813, 11735461, -589484, 12099460, 18241262, --9704479, 9222905, 10744934, 3178813, 10492605, 34927748, -26304528, -22648974, -5125507, 21570400, -20666308, -12330314, -191126, 33153926, 26804890, -18837726, -12577812, 11372000, -23002234, 6356015, --11088532, -20866024, 6694781, -24511378, 25392384, 9308805, 28131498, -11864847, -16517907, -31858994, --6930467, 10361609, -27929098, -23892366, -13107703, 12424804, 7332046, 5826660, -12331925, 5293011, --8841190, 3343632, 25854630, -11066520, 2987687, -14735496, 11067594, -6101001, -12400644, 8668855, -12032351, -6772627, -3541738, -4030827, 8619462, 19273666, -6257231, -13040058, 212064, -289910, --4886062, -2117956, -18084496, 2440078, -9648644, -4347044, 6440304, -5939940, -3289945, -597000, --5082557, 7871065, -8004746, -12548821, -11404749, -9603547, 10029822, 5257577, -2422899, 4405026, -2909840, -8164733, -8936753, 3203509, -15760919, 13298292, 33883532, -2178085, -10481331, 21760452, -4479114, -1242856, -32248226, 28342490, -13978508, -30634928, -10406706, 2087891, 35334160, 3398930, -25322590, 10278930, -29976188, -6503654, -26555782, 4279935, -26470420, -19022410, -11361799, 1349157, -5572720, -20504710, 20145008, -6482717, 12243878, 13173202, 13027173, 24449638, 44573708, 26169772, --8500814, -21907554, -762357, 46945604, 29241212, -15962783, 23367306, -8985072, 28542206, -14161044, -2775086, -10597295, -5262409, -1582159, -8015483, 70547520, -13414257, -19451370, -22500796, -31631360, --12173548, -24376086, -1084479, 27273580, -10853919, 8066486, -9073655, -13895293, 24799142, -6882685, -41775536, 7754564, 33416994, -40803264, 16816408, 71718976, 26097832, -39978628, 23815056, 21818434, -1321239, 4641786, -12250320, 13675176, 62954020, 33490008, 14135811, 19108310, -19680614, 36448704, --3800509, 5617817, 5792301, 9012989, 4237522, 23982560, -19786378, -4922570, 1739462, 30570504, --5140539, 7513509, 35401268, -2762738, -19672024, -4529580, 13030931, 2171643, -8307004, -19934016, -11632382, 8352101, -13719736, -8048232, 9549323, -16858820, -14020384, 4593468, 7055558, -30602, -4911832, 3347390, 5739687, -6158446, 6003291, -3737159, -5005248, 5542119, 2400350, 7657390, -1186485, 49008260, 22868016, 5441724, -1563905, -53556632, 24910810, 33598992, -24274618, -17652852, -41486700, 27067958, -33318746, -35330400, 1170379, -20656646, 8903467, 3405372, 8491150, -33199560, -8586713, -6458557, -16624745, 29488708, -2150168, -4909685, 9814000, 24734180, 22117470, 15212774, --28513214, 631360, -13975287, -30259118, 10910828, 8588861, 18523120, -6373732, -14250165, 38766376, --27950574, 12312061, 13313325, 10981695, 8167954, -4772783, 22741314, -21190832, -36839544, -6111739, --42180872, 36932960, 22488448, 36246840, -3105798, 7184407, -29407104, 30457224, 38131792, 13817984, --16499654, -42881492, -10088878, -56591024, 618475, -10476499, -38656852, -32530620, 14697378, 2467996, -23404350, -18202072, 26858042, 22893786, -32408750, 6905234, -19468550, -5340255, -29316910, 3792456, -84306984, 21201032, 24536612, 31092878, 13538811, -23898808, -3591667, -233002, 19769734, -4495757, -20316806, -9230958, -13024488, 617402, -1756642, -23594940, 20066088, -3650185, -6147172, -7233262, --16952772, 2512556, -8187819, -10483478, -15790447, -12021613, 7180112, -8644159, 7018514, 8548596, --6282464, -9749576, -13703630, 6248104, -2779381, 5830418, 20030116, 12863427, -606664, -1540820, -6158446, 12909061, -12992813, 11407433, -13100724, -5520644, -33506650, 15107011, 11596412, -15636365, -5883569, -7935489, -50529216, -13197898, 12910672, -5666136, 5947456, -28071906, 37314676, -48410724, -4200478, -35402340, 25129316, 27539330, 9288404, 23081154, 2918967, -23271744, 40480604, -18493592, -4622996, 836445, -22659710, 38253664, 3056943, 10080288, 8753680, 12085501, 6757058, 28714540, -34033856, 11559368, 39696772, -33888904, -2173254, 241592, 50641424, -9367324, 40473624, 22572738, -55449640, 11054709, -12002286, -17296370, 22323630, -40871984, 39278012, -23164906, -13355738, -6263136, -8311836, 29656212, -6395743, -53059488, -14325863, 86611776, 6890738, -54118736, 13931263, -35752380, -11202885, 85340464, -22907208, -23030688, 59559384, -63459752, 32691144, 14886357, 19760608, 55674588, -35548372, -48991620, 61152280, 40231496, 2350958, 64951180, -26051662, -8554501, 47342888, 31210990, -6138045, 12935368, 488553, -257698, 6210523, 16456167, -13961328, 17374754, 17993766, -14105209, -8126078, 12233141, -20213190, -1499481, 8355859, -1508070, 4539244, 26825292, 1028108, 18028126, --8681203, 707596, 13360033, -7519951, -6035503, -16836272, 3591667, 16302622, 11190537, 15389942, --27205934, 16089484, 18838264, 8788040, 3838627, 8083129, -619549, 17121888, 30251066, 7824357, -14948634, 14123463, -6155225, -7155953, 14775224, 21540872, 29281476, 55824912, 27797028, -26767846, -35700304, 10699837, 32209034, -9278203, -59617904, 60617556, 52640192, 32345398, 99380712, -9269076, --83374976, -43110196, -39342976, 88140248, 64801392, 15665893, -5589900, -16109349, -58282168, -27692876, --18869402, -33502356, 89719720, 72771776, 101192112, 1877975, -115698368, -180230784, -87856776, 100417944, -135552928, 138379008, 55832964, -114705152, -210686944, -129230200, -65155728, 97231616, 165390608, 93891208, -51142860, 13663365, -74477416, -100207496, -74891344, -5651103, 58247808, 117871080, 141021488, 25061672, -27691264, -111823768, -185217776, -98826120, 92532384, 155081600, 147162224, 91807072, -53748832, -180289312, --116565952, -151182848, 766652, 102634688, 111126376, 55604796, -43793096, -94926832, -83909168, -66519380, -19963544, 63216012, 44739064, 127896072, 46518252, -28635620, -75277352, -28093382, 85600312, 124496072, -42426224, -4904853, -75780400, -15532749, -16687022, 49100604, 19110994, -12628278, -52147884, -15904264, -3488587, -8591008, -15222438, -3584687, 13094818, 26485452, 45679660, 21543556, -43631500, -39674224, --36269388, 8672076, 48150880, 52459804, 25184078, 5390184, -32849520, -14789183, -65118684, -58641336, --4144644, 17026860, 73496552, 108803336, 42464340, -38333120, -88883808, -112429896, -45936824, 87628608, -146404704, 99345816, 31524524, -73296840, -117599960, -58635968, 991601, 21235928, 22835804, 50174880, -27216670, 10764262, -28748900, -64632816, -46846820, 6252399, -12566537, -32347010, 37434400, 5425081, --54120348, 7030325, -14050449, -21668110, 16345035, -16573205, -6578280, -28881508, 1734093, -10951093, --21590264, 8816494, -2385854, 7421167, 3571802, 18177912, -17601850, -5756867, 5516349, 2178085, -8432095, -7311645, 18211736, -12550431, 12576201, 6177774, -5768141, -13179644, -5686000, -24903830, -27509802, -2195802, 1048509, -4467840, -6407018, 1819992, -665720, 1031329, 10720775, 6648610, --179315, 15708306, -13150653, 5092758, -12483859, 14170171, 8563091, -10071698, 7456063, -12368432, --14230837, -11243151, -22014392, -2033667, 16745004, -14799920, -29995514, -20264192, 1888175, 18705656, -454730, 14034343, -28559386, -7186554, -3270081, -2277943, -27938762, -6698539, 973347, 4391604, --10000294, 29468308, 11761768, -9168145, 26897232, -2416993, -48115980, -1768453, -7020124, -4097936, -9250286, 6320581, 12750684, -14822469, 20633022, -35156992, 10152766, 6458020, -1557463, 197569, --2378875, -2235531, 11768747, -2027225, 1998770, -5128191, -632971, -10178536, 2530810, 262530, -20523502, 10201, 9015673, -9338333, 1012002, -4603131, -12348031, 3959423, -465467, -5867999, -14562087, -2621541, -3997541, -5789079, 10620380, -3926137, -20643760, 4381941, -4256313, 6509023, --8932458, 1104880, -2764348, -12311524, 11275900, -10870025, 7673496, -10375030, 5315022, -777389, --4255239, -29228326, -47957068, -75341776, 2769180, 62201864, -23771034, -38155952, -40783936, -38536596, -8071318, 8012262, 71694816, -10356240, -10268193, -31875100, 3595425, 9716827, 22591528, -23956790, -12165495, -17419314, 28088550, 8966281, 9212168, 3395709, -17447230, -9484362, -11365020, -3741990, -10178536, -10513543, -9263171, 19814294, -18064632, -11261941, 16372415, -15557982, -5716065, -13353053, --21809308, 7727720, 14320495, 2646774, 13491566, -20502564, -5224828, -593242, 11895986, 14749455, -18253074, 1291175, -1920924, -30842160, -31718870, -11715060, -10296647, -6926709, 14542222, 19957640, -28144384, 3118683, -12880070, 28245852, -20200304, -9009231, 12537010, -8830990, 37044628, 1898912, --6213744, 6292664, -13585518, 10764799, 25643640, 21059836, -7647190, 7975755, -25007448, -16282758, --9315247, -6152541, 18452790, -2388539, 18010946, 4814659, -6028524, 2182380, 3161096, -21626234, -12787728, -16005196, 9863929, -7341173, -4614943, -1116692, 11697343, -11230803, 1287417, 1994476, -10189273, 18094698, -9336185, -2688650, -14522358, -5770826, 4817343, -5646809, 3789772, -4412005, --6060199, -9978820, -15880642, -8637179, 14121852, -5608154, 6847252, -10281615, -2603824, -809601, --3489661, -9216463, -4394289, 1056562, -1324461, 141197, -243739, -13948980, 19636054, -48543868, --113477328, -86721832, -10009421, 37539088, 97904856, 82649664, 78922712, 80581640, 53192632, 22388590, --29042568, -51546588, -98342400, -72493144, -71200896, -71025336, -44149580, 42811160, 57751740, 84813792, -65161096, 54539104, 18029198, 36365488, -8167417, -9470940, -11410117, -19961934, -37220188, -30565134, --62704912, -22904524, -49791556, -23795730, -11748883, 16256451, 3301756, 23283554, 5441724, 32631014, -24084030, 39484172, 52624624, 65243776, 41826004, 27992986, 46466716, 3507915, -15741055, -57412976, --67177584, -92573192, -82385528, -77167680, -29472602, -50680616, -26412976, 3010772, 14016089, 32560148, -62366148, 66298188, 74277704, 111997712, 63181116, 85779088, 59629180, 13469017, -9038759, -35306240, --89620400, -98213016, -93321584, -103745472, -76013944, -53199076, -42516420, -11780558, 21907018, 36452460, -46553152, 69005632, 73498168, 77189152, 73128800, 45408540, 31883690, 14984604, 1750736, -324270, --21952652, -36188320, -52003464, -62095028, -65673272, -62372588, -43633648, -19781546, -17519172, -6798397, -11775190, 30865246, 38734700, 73016056, 51687248, 40594420, 40818832, 14555644, -1588601, -10691247, --12872554, -13911399, -35380328, -31999654, -22934052, -24275156, -17552994, 2208150, 5609228, 6886443, --4195110, 11512660, 416612, 13644574, 14296872, 4525822, -4839892, -716723, 3125126, 1840394, -2273648, 6394670, 1486059, -3404835, -10267119, -2488934, 2340220, -383326, 6375879, 4872641, --1081795, -1055488, -4389994, -3587372, -2379412, -1650341, -1961190, 1397475, -1194001, -930397, --272730, -2176475, -2898566, 275952, 583042, 886911, 636729, 428423, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +7975755, -615791, 3212099, 1615982, 3783329, -6770479, -3656628, 4343286, 2100239, 44023, +-3766150, 767189, -10504416, -6765111, -368293, -4034048, -4562329, 1868311, 8203925, 1373316, +6246493, -1451699, 6172942, -3692061, -3295314, -415538, -5578626, 1102196, 2767570, -2019172, +-139050, 1442572, 258235, 2510945, -303332, -5971079, 2130304, -3703336, -2793339, 1669669, +-3680250, -5572720, 5533529, -5847061, 5265630, 4915590, 3234110, -272730, -6860674, -3997004, +763967, -1304060, 8812199, -5410585, 2136746, -708133, 1156957, -6687801, -11156714, -1979980, +-3357054, -3733400, -887985, 4696547, -1032940, -5040144, 4397510, 1858647, -2246805, 3668439, +-731755, 1089848, -5143224, -438624, -1293859, -99858, 1952063, -2366527, 1578401, -4711579, +3154654, -754841, 322123, -1735167, -1567126, -3221, 1910187, 681289, -82141, 715649, +-49929, -2850248, 801548, 204011, 1761474, -312459, 46171, -34897, 26307, -207769, +-1028645, 4281546, 4270271, 605054, 7701413, -87510, 3325379, 4138738, -50466, -3758633, +392990, -5340255, -6840273, -2596308, -7794829, -8045011, -2621004, 5288179, -1891933, -1832340, +-4190814, -1060320, -7326678, 3579855, -2053531, 1808181, 4394826, 1490891, -1544578, 3022046, +2864206, -3575560, 2481417, 329639, 661425, 2679523, -6391985, -2757906, 4524211, -2902324, +-213675, -1846299, 5021354, -6437619, -537945, -5391795, 3493419, -320512, -397821, 4871030, +-2107755, -2340757, -1685775, -4552666, 323196, -2062121, -363998, 301185, 3096672, 3148211, +1058173, -1398549, -5376226, -8791798, -2727841, -610959, -2174864, 4725538, -1908576, -2710661, +3770445, -2429878, -3773129, 8343511, -1815161, -4667019, -421444, 766115, -1400159, 4115653, +-535260, -3678640, 52613, 161598, -794569, -1108102, 3272228, 739271, 461172, -1952600, +406411, -594853, 220654, 1276679, -287226, 723702, 1518271, 191663, -308164, -327491, +643171, -1854889, -693637, -370978, -856309, 771484, 639413, -304406, 8938364, -5683316, +-2679523, -4112431, 3321084, 643708, -398358, 6447820, 1553168, 1890323, -9341017, 1724966, +-4353486, -5069672, -6584722, -105764, 245350, 7828115, -6387153, 2962454, -2673617, 9678709, +-3480534, -3204046, 6894497, -2630668, 2386391, 1040993, -446677, 1139777, -4606353, 752156, +228707, 1954747, 9106404, 3171833, 861141, -3881577, 3194382, -7066295, -1949378, -1351841, +3883724, 3310883, 5507759, 3606162, -4107599, -6058588, -2631204, 4632122, -554588, 2405719, +-960462, -666794, 9260486, 2183454, -687195, -11034845, -4908074, 289373, 3854733, 5907728, +8325257, 4656819, -1991254, 1492501, -2019708, -2821257, 5978595, -3754338, 6155225, 282931, +-5525476, 2000918, -2838974, 4794257, -4096325, -468151, 4182225, 4782446, -4775467, -1836099, +-884763, -1961190, 2897492, -642098, -2030983, 1330366, 712965, 732829, 826781, 1160715, +646929, 694711, 327491, -343061, -397821, -1772748, 2780455, -105227, 185757, 318364, +62814, 441308, 1494649, 1435593, -44560, -374199, 1858647, 1401233, 1119376, 4686883, +-1122597, -785442, -1729798, -5486284, 213138, 3940096, 3925063, 7342247, 3365644, -9642202, +-8054138, -6989523, 288837, -1184337, 511638, -3808026, -2365990, -592706, 2927020, -39728, +-6177774, 6674916, -954020, -6202470, 1269700, 1464584, -127238, -595927, 2683281, 3534221, +-2212445, 5401995, 267899, 3164854, -7368017, 5240934, 1864016, 3022046, -5071283, -557272, +3707094, 3172370, 8046085, -301185, -11112154, -3039763, -5323075, 2603287, 1799591, -461172, +-2967286, 847719, -4557497, -1615445, -8298414, -4884989, -280247, 4619774, 5156108, -3724274, +-3187940, -3263638, 5299453, -1810329, -653372, -7969849, 4801774, -7866233, -2732136, -343597, +-1663763, -2138357, 8366060, -714575, -1945620, -2241973, 1659468, -5045513, 579821, -8748312, +-7030862, 2559264, -2455111, -1308891, 3124589, -1586454, 4168803, 819265, 1914482, 2933463, +-785442, 1415729, 956704, 539555, -617402, 1070521, 433255, 261993, -651761, -690953, +170188, -2565169, -48855, 1604707, 384400, -102005, 303869, -1575716, -509491, 957241, +-471373, 2231236, -2899640, 4105989, -3301756, 3221, 5667210, 10318659, 7138773, 1532230, +-8079371, -6062347, 2168422, -1387274, -5181341, -1701344, -6674379, -2870112, 13411035, 1549946, +-1428614, -2498597, 8053, -3121368, -2158221, 9067213, -9409200, -1110249, 929324, -2013266, +2362232, 5484137, -2520072, -3098282, 1387274, -3854196, -3760244, -8749385, -3240553, 2356327, +-7832410, -1313186, 3886946, 5900212, 2099702, -12286828, -3707094, 2468533, 6193343, -4820564, +10688026, -1246077, -5424544, -3026878, -2313914, -4224101, 5810017, -4345970, -1159104, -5739150, +-4502200, -2107218, -4578435, 6142877, -2261300, -12317429, 4704063, 8262980, 110059, 2985539, +-14969035, 11680700, 211527, -9816148, 989990, -6631430, -1406602, 1035087, -7124277, -8359617, +5550709, 2593087, -7238094, -498753, 179315, -4482872, -567473, -1660542, 1112397, -3979824, +-2053531, -792958, -1982127, -1014149, -2925947, 950798, -199179, 1493575, -3181497, 738198, +1787243, -54761, -1811939, 1152662, -1759326, 1656247, 1351304, -1356673, 1317481, -260382, +-936303, -446677, 453119, 625992, 374736, -11076721, 2500208, -8153459, 8719320, 2225867, +-3313031, -6579353, -11533598, -5007932, -8348880, 2894271, 16143708, 2765422, -4180614, -230854, +-2199023, -2468533, -7256347, -4764730, -7471096, 2047089, -548682, 1664300, -2604898, 1264331, +-7895761, -520228, 1824824, -5355824, -1967095, 703301, -2918967, 801548, -2685965, 11941083, +-14548128, -2567317, 1194538, 3944391, -1489817, -5955509, -8918500, -6308233, 4803384, -1247151, +5327370, -4505958, 13817447, 1838783, -2666101, -105227, -8190503, -10455561, -5286568, 4008815, +-8941585, -509491, 10523207, -258772, -4970351, -9945534, -16865262, 736587, 8664023, -2360622, +9940702, -862215, -3107946, -6194954, -5508296, 1006096, 3949223, -3142842, 14412300, 4393215, +-4625143, 2258079, -5920076, 2217277, 2725694, -1940252, 3124052, 5881421, 2482491, 311385, +-3868155, -10549513, 712428, -2364916, -1067836, -1575179, 761820, 268972, -139050, -4640712, +738198, -2644626, 878858, -2604898, -879931, -650151, -244276, -199716, -512712, -1859721, +-1702955, -2041183, -3062312, -3216931, -1364189, 205622, 856309, -1670205, -52613, 137976, +316217, -1261647, 9472014, -4160213, -10955925, -2996814, -8182987, -4258997, -3556233, 11605002, +-2917894, -3884798, -4900558, 7461432, 6700149, 5923834, 16365436, 17153026, 7936563, 10664404, +-4020626, -4928475, 7086159, 10523207, -4573604, 4629975, 3241090, -9128416, -8654896, 5113159, +-1275068, -105227, -8637179, -10953777, -2616709, -8877697, 10049150, 18808198, 3875134, 7428683, +2153926, -2202245, 6709276, -12832825, -3439732, 2681133, 7149510, -4219269, -10378252, 15154792, +-35433, -4641786, -3707631, 6224482, -1862942, 5550172, -3792456, 8704825, -733366, -217970, +10737418, 3348464, 4951561, 1939715, -1640141, 8032126, -12222940, -4892505, 4570919, 13835700, +-8412230, -971200, -1716376, -1941862, -5764383, -1263794, -2990908, -3958349, -565862, 935229, +3908957, -1619740, 11101954, 4050154, -6370510, -1532767, 832150, 4242354, 1503239, -1922535, +-3841848, -835371, 2456721, -2470143, -2161979, -1889786, 2280091, 1421634, 2252174, 1175210, +-2040110, -807991, 71404, -2061047, -351114, 1615982, 1005559, -253940, -2287070, 3032247, +-408559, 1887638, -1272384, 926102, -2657511, -257698, -383326, 128312, -1768453, 6856916, +-6709813, -2596845, 6191196, -4805532, 2684892, 4668630, -9159555, -9773198, 2804614, 7516193, +-2538863, 6862284, -4968741, -2184528, 13055090, -14771466, 8927626, -4192962, 117575, 416612, +16117939, -3563212, 3193308, 5140539, 8885750, 5209796, 7785702, -1273458, -1238561, 2557116, +1262720, 1312649, -7763691, 12103218, -16106664, -3531000, -4231617, 9021579, -1803886, 10990284, +-492848, 1052267, -19167902, -5246303, 11704323, 19894826, -169114, -9849434, -8299488, 8180839, +6579353, 4954245, 4697621, -8441221, -3858491, -4880157, 2596308, 376347, -5183489, 3077344, +2684355, -2409477, -2647311, -11558294, -3037616, -4231080, 16557636, 1531156, 3133179, 6287296, +512175, -12936978, 661425, -7782481, 6482717, 15462956, -8174397, 4792110, -2340757, -8002598, +3893388, -6706055, -1146219, 2819109, 2094333, 3550864, 1509144, -545461, -2921652, 3359738, +7257958, 1231045, 3604551, 5970542, 2667712, 6748468, -2019172, 6383395, 335007, 162135, +1403381, 724776, 1845762, -183073, -3116536, -1730872, 149250, 1717450, 1809792, -1213865, +3101503, 2936147, -2449742, 4146791, 6984154, -12017855, -4626754, -4521527, 2284386, -693100, +17877264, -2247879, 620623, 11348914, -10126996, -7352984, -9495099, -9938017, -2417530, -366683, +4457103, 19123878, -1760937, -11010149, 19794430, 324270, 5528697, 13535589, 9321690, 12632036, +-3320547, 9978820, -6461779, 13224204, 11546483, -3137474, 6007049, -5325223, -4962835, 4993437, +15115601, 6814503, 5961415, 2141578, -4854924, -8366597, -8539469, 1379221, 10380399, -6060199, +-7320772, -8959302, -3432753, -17757006, -4198331, 3401077, -13081934, 6305549, 890132, -5954972, +-15363098, -10247792, -24159, -20328618, 6328098, 4496831, -498216, 5660767, 3633006, -1986422, +-10641318, -6418292, -1248225, -6712497, 6201396, -7034083, 16773458, -11337103, 537408, 7388418, +587337, -5070746, -19491636, 3381750, 9451612, 2302639, 485331, 10532870, 5738613, -6041409, +-69793, -704912, 709207, -432181, -3439732, -6845641, -2128156, -7395397, 328028, 1847373, +814970, -1916629, -3913252, -1772748, -2645163, 3210488, 872415, 4201015, 2895882, 2412698, +824634, -347892, -1561221, -1301375, -3456912, 1542430, 107374, 1536525, -1733556, -223338, +-2921115, 178778, -2313914, 865973, -24816858, 8718784, 11337640, 19942606, -54224, -14808510, +4185446, 7137699, -15328738, -15944529, -9960029, -391916, 8521752, -438087, -6238440, -324270, +-5457293, -3677029, -9877351, 16510391, 12904766, 4857071, -20233054, -6063420, 3267933, -1149441, +-4495220, 25629144, 9402757, 8055748, 7557532, 12167105, 9141838, 2226941, 9571335, -647466, +-15891916, 8613557, -16347719, 5005248, -16183974, 13690745, -4265440, 16530255, -8998493, 4021163, +-7274064, 5961952, 9687299, 25229174, 5353677, -32068910, -1677185, -4458176, 6910603, 14021458, +-2813741, -6223945, 10324028, -1814624, -5033165, 13812078, 900869, -606664, 726923, 5918465, +11070815, 8751533, -9463960, -7050726, -5960341, -9623411, 2285996, -885837, 10947335, 7852811, +-14702210, -3548717, -8303246, 7153805, -4025995, -3931506, 2611877, 483184, -5643050, 4872641, +1221918, 812823, -803159, 2771865, 2903935, 459562, -8303246, 2331630, 1494649, -1069984, +-1431835, -2771865, 147103, -3709241, 1761474, 4185446, -1231582, -1243930, 4149475, 641024, +-3785477, -2937221, -645856, 1998234, -1623498, -401579, -2309619, 628139, -1528472, 15569, +3993783, -2647847, 27016954, -10253698, -18022220, -5745056, 7026567, -4465156, 12978854, 18781356, +-7568806, 17223892, 11082089, 8652212, -2857227, -2090039, -3482682, 16706349, 3048353, 2001455, +-9742596, 4224101, -5095442, -439697, -16084653, 10880763, -14760192, 54224, -10413148, 17426830, +-8921184, 375810, 17224430, 13085155, 8848170, -1067836, -6846715, 7995619, -257698, -1562294, +-22011708, -6549289, -13297756, -10813117, -8434779, -3988414, 11436424, 7175817, 6667400, 13959, +16834662, -8933532, 17814450, 15653008, 16803522, 29389388, -11373073, -8885750, 12922483, 2419677, +-11414949, 17727478, -5843303, -8580808, 5750425, -2209761, -6160594, -5094368, 7612293, -10305774, +4657355, -6391985, 16284905, -6949257, 243739, 4738960, 11870216, 16131897, 1279900, -14124000, +-15340013, 4989679, -10226317, -32905892, -17328046, 5225902, -391379, 9489730, 1194001, -5414880, +-648003, -3154117, 1372242, -5729487, -2536715, -3941169, -1676111, 423591, -739808, -10298258, +-2730526, -6755447, -6077916, -4774393, 2052458, -505732, 379568, -7509214, -5254893, -311922, +-329102, 1427003, 3811247, 3134789, 2304787, -5415417, 212064, 1192390, -7013145, 2415919, +355409, 2990908, 1319092, 3824669, 2116345, -1617592, 3204046, -2537789, -1927367, -25209848, +-21310554, -1031866, 4474819, -14551349, 643171, 1285269, 23431194, -15287936, -17490718, 5665062, +-7373385, -31139, -12781823, 12169790, -12986370, -17396766, -10528039, 20098836, -13717589, -11206107, +-2587181, 8158291, -6017786, -14421963, 4466229, -5842766, 77309, 6558415, -19026706, -1436667, +10525354, 16924318, -2580202, 25871810, 11336029, -2952253, 1141388, 11764452, -4855461, -10524817, +1986959, 14013941, 1552631, 6726456, 304943, -11480984, 3957812, -25201258, 2283312, 1366873, +-3220152, -14844481, -13484050, 1633698, -6156299, -10193031, -6835978, -8206609, 9634685, -16598975, +-9483288, -4788352, 7210713, -9767829, 20340428, -3066607, -17114908, -1484985, -10193568, -27137750, +-8126615, 1793149, -836982, -17631378, -9423695, -4027606, 4007205, -10480257, -5211406, 17388712, +-6198712, -23741506, -8362302, 3069291, 1806571, 7797513, 6588480, 4918812, -5525476, -6900939, +-1653562, -4823249, 3455301, 1039919, -3053185, 5076652, 2108829, 2982318, -2061047, 2442763, +1825898, -19327, -1019518, -1762547, -2211908, 38655, 1369021, -8443369, 1800665, -4860829, +5415954, 2003065, -6249715, -5532992, -490163, -4380867, -648540, 1775969, -1590212, -2959769, +-4637491, -3525095, 2433099, 897111, -5251672, 1952600, 538482, -3496640, -2977486, 19248432, +17204028, 5158793, 35217660, -6540699, -12300786, -11020886, -5161477, -18969796, 25633438, -15352897, +-5603859, -12435004, -6415608, -5843840, 3026341, -18039936, 283468, 211527, -2486786, 5132486, +-19071266, -4840428, 13086228, -12982076, 716186, -16800838, 16135655, 104690, -28656022, -14860587, +-5187247, -603980, 7971996, -17393544, -9757092, 11965242, -2040646, 8269960, 7597261, 7510824, +-10441602, 1183264, 12680354, 4705674, -23655070, 15273441, 11016591, -12764106, 36339720, -617402, +-26075820, 7263864, 8244190, -530965, 19396072, -5892159, -32395328, 9194451, 4650913, 9769440, +11504607, -14745696, 23447300, 8892730, 7295539, -5499169, 35505956, -2646774, 617402, 24308978, +-4134443, 11135776, 19182934, 6660958, 2865817, -4513474, 9222905, 490700, 16219944, -7027640, +15788837, 14579803, 887985, 14429480, 8581345, 11520713, -5812702, 75162, 13104482, 9557913, +7041062, 4336307, 4486630, -8529268, -1010391, 544387, -4035122, 673236, -1462973, -3574487, +7594039, -7661685, -1475858, -7511361, 6618008, -3114925, 7930657, -6610492, 1105954, -4557497, +-6675453, 4794257, -2546916, -12348, -6515466, -9514963, -7181186, 7651484, 716186, -2914135, +789200, 9490804, 6760816, -2643552, 3278671, 306553, -2617246, 9819369, 340376, 7093676, +-25128244, -24663312, 50577000, 16311212, -31601296, -15896211, -14499273, -28941638, -2157147, -15278809, +21061982, -11921219, 97174, 26268020, 558346, 4354023, -19359566, 24217174, 18051748, -329639, +-5851893, -1904818, -15052250, 1126355, 1905355, 3055869, -20681342, -3028489, -1202591, -6242198, +-4609574, -14271639, 13496935, 26728118, 32125818, -2637647, -13020730, -5450851, -6660421, -4524748, +-19725174, 6687801, 7701950, 7051263, -20554640, -27454504, 29648696, 11175505, 16603807, 21514564, +20195474, -8779987, -13811004, 19465328, -19835232, 10036802, -14845554, -11414412, -6622303, 23163296, +-7687992, 4685273, 7973607, -4255776, -18752900, 38748660, -23443542, 2377801, 28094454, -25458418, +-11499775, 2959233, 10284299, 28846074, 5186173, -16782584, 492848, 3486440, -3907883, -7067906, +4175782, -11766600, 9010841, -9747428, -13613973, 7318088, 4160213, 10355703, 4705137, -419833, +-4702453, 1132798, 2941516, 3165928, 11152956, -684510, 1575179, 6864432, -16421807, 2323041, +-7376607, 1762547, 1877438, -2705293, -6187974, -7769059, -1843078, -7797513, 3087008, 4159139, +9558450, -887985, -6316823, 6014028, 7421704, 4433480, 4558034, -11898670, 467078, 2932389, +-2883534, 10137733, -3768834, 711354, 1141388, 9355513, -4432943, 2758980, 13125420, -8449811, +8221641, 33676840, 20285130, -3073049, -21614960, 2231236, 34534760, 27492086, 5767604, -27388470, +-10566693, -23649700, -1791001, 18457622, 22807350, -1704565, 8651138, 27113054, 28856812, 44793288, +45090176, -22558242, 9788767, -24357296, -4429722, -19751480, -7115687, 15520401, -3511136, 6777996, +6083285, -14043469, -10296110, 11413339, 12728136, 16523813, 11735461, -589484, 12099460, 18241262, +-9704479, 9222905, 10744934, 3178813, 10492605, 34927748, -26304528, -22648974, -5125507, 21570400, +20666308, -12330314, -191126, 33153926, 26804890, -18837726, -12577812, 11372000, -23002234, 6356015, +-11088532, -20866024, 6694781, -24511378, 25392384, 9308805, 28131498, -11864847, -16517907, -31858994, +-6930467, 10361609, -27929098, -23892366, -13107703, 12424804, 7332046, 5826660, -12331925, 5293011, +-8841190, 3343632, 25854630, -11066520, 2987687, -14735496, 11067594, -6101001, -12400644, 8668855, +12032351, -6772627, -3541738, -4030827, 8619462, 19273666, -6257231, -13040058, 212064, -289910, +-4886062, -2117956, -18084496, 2440078, -9648644, -4347044, 6440304, -5939940, -3289945, -597000, +-5082557, 7871065, -8004746, -12548821, -11404749, -9603547, 10029822, 5257577, -2422899, 4405026, +2909840, -8164733, -8936753, 3203509, -15760919, 13298292, 33883532, -2178085, -10481331, 21760452, +4479114, -1242856, -32248226, 28342490, -13978508, -30634928, -10406706, 2087891, 35334160, 3398930, +25322590, 10278930, -29976188, -6503654, -26555782, 4279935, -26470420, -19022410, -11361799, 1349157, +5572720, -20504710, 20145008, -6482717, 12243878, 13173202, 13027173, 24449638, 44573708, 26169772, +-8500814, -21907554, -762357, 46945604, 29241212, -15962783, 23367306, -8985072, 28542206, -14161044, +2775086, -10597295, -5262409, -1582159, -8015483, 70547520, -13414257, -19451370, -22500796, -31631360, +-12173548, -24376086, -1084479, 27273580, -10853919, 8066486, -9073655, -13895293, 24799142, -6882685, +41775536, 7754564, 33416994, -40803264, 16816408, 71718976, 26097832, -39978628, 23815056, 21818434, +1321239, 4641786, -12250320, 13675176, 62954020, 33490008, 14135811, 19108310, -19680614, 36448704, +-3800509, 5617817, 5792301, 9012989, 4237522, 23982560, -19786378, -4922570, 1739462, 30570504, +-5140539, 7513509, 35401268, -2762738, -19672024, -4529580, 13030931, 2171643, -8307004, -19934016, +11632382, 8352101, -13719736, -8048232, 9549323, -16858820, -14020384, 4593468, 7055558, -30602, +4911832, 3347390, 5739687, -6158446, 6003291, -3737159, -5005248, 5542119, 2400350, 7657390, +1186485, 49008260, 22868016, 5441724, -1563905, -53556632, 24910810, 33598992, -24274618, -17652852, +41486700, 27067958, -33318746, -35330400, 1170379, -20656646, 8903467, 3405372, 8491150, -33199560, +8586713, -6458557, -16624745, 29488708, -2150168, -4909685, 9814000, 24734180, 22117470, 15212774, +-28513214, 631360, -13975287, -30259118, 10910828, 8588861, 18523120, -6373732, -14250165, 38766376, +-27950574, 12312061, 13313325, 10981695, 8167954, -4772783, 22741314, -21190832, -36839544, -6111739, +-42180872, 36932960, 22488448, 36246840, -3105798, 7184407, -29407104, 30457224, 38131792, 13817984, +-16499654, -42881492, -10088878, -56591024, 618475, -10476499, -38656852, -32530620, 14697378, 2467996, +23404350, -18202072, 26858042, 22893786, -32408750, 6905234, -19468550, -5340255, -29316910, 3792456, +84306984, 21201032, 24536612, 31092878, 13538811, -23898808, -3591667, -233002, 19769734, -4495757, +20316806, -9230958, -13024488, 617402, -1756642, -23594940, 20066088, -3650185, -6147172, -7233262, +-16952772, 2512556, -8187819, -10483478, -15790447, -12021613, 7180112, -8644159, 7018514, 8548596, +-6282464, -9749576, -13703630, 6248104, -2779381, 5830418, 20030116, 12863427, -606664, -1540820, +6158446, 12909061, -12992813, 11407433, -13100724, -5520644, -33506650, 15107011, 11596412, -15636365, +5883569, -7935489, -50529216, -13197898, 12910672, -5666136, 5947456, -28071906, 37314676, -48410724, +4200478, -35402340, 25129316, 27539330, 9288404, 23081154, 2918967, -23271744, 40480604, -18493592, +4622996, 836445, -22659710, 38253664, 3056943, 10080288, 8753680, 12085501, 6757058, 28714540, +34033856, 11559368, 39696772, -33888904, -2173254, 241592, 50641424, -9367324, 40473624, 22572738, +55449640, 11054709, -12002286, -17296370, 22323630, -40871984, 39278012, -23164906, -13355738, -6263136, +8311836, 29656212, -6395743, -53059488, -14325863, 86611776, 6890738, -54118736, 13931263, -35752380, +11202885, 85340464, -22907208, -23030688, 59559384, -63459752, 32691144, 14886357, 19760608, 55674588, +35548372, -48991620, 61152280, 40231496, 2350958, 64951180, -26051662, -8554501, 47342888, 31210990, +6138045, 12935368, 488553, -257698, 6210523, 16456167, -13961328, 17374754, 17993766, -14105209, +8126078, 12233141, -20213190, -1499481, 8355859, -1508070, 4539244, 26825292, 1028108, 18028126, +-8681203, 707596, 13360033, -7519951, -6035503, -16836272, 3591667, 16302622, 11190537, 15389942, +-27205934, 16089484, 18838264, 8788040, 3838627, 8083129, -619549, 17121888, 30251066, 7824357, +14948634, 14123463, -6155225, -7155953, 14775224, 21540872, 29281476, 55824912, 27797028, -26767846, +35700304, 10699837, 32209034, -9278203, -59617904, 60617556, 52640192, 32345398, 99380712, -9269076, +-83374976, -43110196, -39342976, 88140248, 64801392, 15665893, -5589900, -16109349, -58282168, -27692876, +-18869402, -33502356, 89719720, 72771776, 101192112, 1877975, -115698368, -180230784, -87856776, 100417944, +135552928, 138379008, 55832964, -114705152, -210686944, -129230200, -65155728, 97231616, 165390608, 93891208, +51142860, 13663365, -74477416, -100207496, -74891344, -5651103, 58247808, 117871080, 141021488, 25061672, +27691264, -111823768, -185217776, -98826120, 92532384, 155081600, 147162224, 91807072, -53748832, -180289312, +-116565952, -151182848, 766652, 102634688, 111126376, 55604796, -43793096, -94926832, -83909168, -66519380, +19963544, 63216012, 44739064, 127896072, 46518252, -28635620, -75277352, -28093382, 85600312, 124496072, +42426224, -4904853, -75780400, -15532749, -16687022, 49100604, 19110994, -12628278, -52147884, -15904264, +3488587, -8591008, -15222438, -3584687, 13094818, 26485452, 45679660, 21543556, -43631500, -39674224, +-36269388, 8672076, 48150880, 52459804, 25184078, 5390184, -32849520, -14789183, -65118684, -58641336, +-4144644, 17026860, 73496552, 108803336, 42464340, -38333120, -88883808, -112429896, -45936824, 87628608, +146404704, 99345816, 31524524, -73296840, -117599960, -58635968, 991601, 21235928, 22835804, 50174880, +27216670, 10764262, -28748900, -64632816, -46846820, 6252399, -12566537, -32347010, 37434400, 5425081, +-54120348, 7030325, -14050449, -21668110, 16345035, -16573205, -6578280, -28881508, 1734093, -10951093, +-21590264, 8816494, -2385854, 7421167, 3571802, 18177912, -17601850, -5756867, 5516349, 2178085, +8432095, -7311645, 18211736, -12550431, 12576201, 6177774, -5768141, -13179644, -5686000, -24903830, +27509802, -2195802, 1048509, -4467840, -6407018, 1819992, -665720, 1031329, 10720775, 6648610, +-179315, 15708306, -13150653, 5092758, -12483859, 14170171, 8563091, -10071698, 7456063, -12368432, +-14230837, -11243151, -22014392, -2033667, 16745004, -14799920, -29995514, -20264192, 1888175, 18705656, +454730, 14034343, -28559386, -7186554, -3270081, -2277943, -27938762, -6698539, 973347, 4391604, +-10000294, 29468308, 11761768, -9168145, 26897232, -2416993, -48115980, -1768453, -7020124, -4097936, +9250286, 6320581, 12750684, -14822469, 20633022, -35156992, 10152766, 6458020, -1557463, 197569, +-2378875, -2235531, 11768747, -2027225, 1998770, -5128191, -632971, -10178536, 2530810, 262530, +20523502, 10201, 9015673, -9338333, 1012002, -4603131, -12348031, 3959423, -465467, -5867999, +14562087, -2621541, -3997541, -5789079, 10620380, -3926137, -20643760, 4381941, -4256313, 6509023, +-8932458, 1104880, -2764348, -12311524, 11275900, -10870025, 7673496, -10375030, 5315022, -777389, +-4255239, -29228326, -47957068, -75341776, 2769180, 62201864, -23771034, -38155952, -40783936, -38536596, +8071318, 8012262, 71694816, -10356240, -10268193, -31875100, 3595425, 9716827, 22591528, -23956790, +12165495, -17419314, 28088550, 8966281, 9212168, 3395709, -17447230, -9484362, -11365020, -3741990, +10178536, -10513543, -9263171, 19814294, -18064632, -11261941, 16372415, -15557982, -5716065, -13353053, +-21809308, 7727720, 14320495, 2646774, 13491566, -20502564, -5224828, -593242, 11895986, 14749455, +18253074, 1291175, -1920924, -30842160, -31718870, -11715060, -10296647, -6926709, 14542222, 19957640, +28144384, 3118683, -12880070, 28245852, -20200304, -9009231, 12537010, -8830990, 37044628, 1898912, +-6213744, 6292664, -13585518, 10764799, 25643640, 21059836, -7647190, 7975755, -25007448, -16282758, +-9315247, -6152541, 18452790, -2388539, 18010946, 4814659, -6028524, 2182380, 3161096, -21626234, +12787728, -16005196, 9863929, -7341173, -4614943, -1116692, 11697343, -11230803, 1287417, 1994476, +10189273, 18094698, -9336185, -2688650, -14522358, -5770826, 4817343, -5646809, 3789772, -4412005, +-6060199, -9978820, -15880642, -8637179, 14121852, -5608154, 6847252, -10281615, -2603824, -809601, +-3489661, -9216463, -4394289, 1056562, -1324461, 141197, -243739, -13948980, 19636054, -48543868, +-113477328, -86721832, -10009421, 37539088, 97904856, 82649664, 78922712, 80581640, 53192632, 22388590, +-29042568, -51546588, -98342400, -72493144, -71200896, -71025336, -44149580, 42811160, 57751740, 84813792, +65161096, 54539104, 18029198, 36365488, -8167417, -9470940, -11410117, -19961934, -37220188, -30565134, +-62704912, -22904524, -49791556, -23795730, -11748883, 16256451, 3301756, 23283554, 5441724, 32631014, +24084030, 39484172, 52624624, 65243776, 41826004, 27992986, 46466716, 3507915, -15741055, -57412976, +-67177584, -92573192, -82385528, -77167680, -29472602, -50680616, -26412976, 3010772, 14016089, 32560148, +62366148, 66298188, 74277704, 111997712, 63181116, 85779088, 59629180, 13469017, -9038759, -35306240, +-89620400, -98213016, -93321584, -103745472, -76013944, -53199076, -42516420, -11780558, 21907018, 36452460, +46553152, 69005632, 73498168, 77189152, 73128800, 45408540, 31883690, 14984604, 1750736, -324270, +-21952652, -36188320, -52003464, -62095028, -65673272, -62372588, -43633648, -19781546, -17519172, -6798397, +11775190, 30865246, 38734700, 73016056, 51687248, 40594420, 40818832, 14555644, -1588601, -10691247, +-12872554, -13911399, -35380328, -31999654, -22934052, -24275156, -17552994, 2208150, 5609228, 6886443, +-4195110, 11512660, 416612, 13644574, 14296872, 4525822, -4839892, -716723, 3125126, 1840394, +2273648, 6394670, 1486059, -3404835, -10267119, -2488934, 2340220, -383326, 6375879, 4872641, +-1081795, -1055488, -4389994, -3587372, -2379412, -1650341, -1961190, 1397475, -1194001, -930397, +-272730, -2176475, -2898566, 275952, 583042, 886911, 636729, 428423, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -9297530, -7221988, 367757, 3323768, 3297998, 9343701, 4401805, -3434900, -4341138, -6060736, 4363150, --5300527, -3850975, 879931, 1349157, 587337, 5486821, -1776506, 5129265, -1298691, 4605279, --4337917, 2026688, -1909650, -4636417, -316217, -8854075, 1341640, 2187212, 3976066, -3227131, --40802, 3470871, -2535105, 3897146, 3669513, -2185602, 2638184, -2932926, -1358820, -2165737, --3169686, -4029753, 3628174, 5354751, -3989488, 2382096, 4307316, 3488050, 5270999, 671626, --780610, 3074123, 2334852, -5551782, -202937, 653909, 363462, 1775969, 3614215, 818728, -1315871, -1920387, -1213865, 2561948, 3590593, 2007360, -1890859, -3312494, 3701188, -2989297, --967441, 2077154, -616865, -125628, 1580548, 382252, 106300, 3357591, -3272228, 2503429, -1363115, 1644436, 3097208, -1236414, -354335, -1037235, -430034, 135828, 1517734, -1194538, --216359, -823023, -476205, 57982, -116501, -476741, -340913, 347892, 449361, -2684, --195421, -328565, 49392, -100395, 52076, -474594, -107911, 487479, -1068910, 3682935, --1955821, 2697776, 256087, -230854, -7508140, 1202591, 6391448, -3927748, 2639794, -7973070, --8067023, -2660195, -6560026, -5726802, -863825, 1180042, 4503810, 714575, -2172717, 1017907, -3064996, -3966939, 5491653, -3724274, -4027069, 4651987, -2317672, 5359583, 6813429, 941672, --4916664, 3437585, 2246805, 1376537, -2502355, -1815161, 2861522, 2388002, 485868, -5558225, --1603633, -5134634, 4635344, -4634807, -3021510, 3410204, 161598, 2959769, 848256, 1134408, -5045513, 851477, 5659157, -7297687, -3744675, -1688996, 3616363, 5109938, 5844377, 7947837, -864899, -2267743, -759136, -1069984, -241592, -5170067, -2260764, -2251100, -626528, 794569, --4188667, -2485176, -943282, -1788317, -3274376, 3934190, -3936338, -1347009, 2625836, -6753299, -2043868, 3675418, 4085588, 2143726, 1187559, 2441689, -1194001, -2622615, -655519, 700617, --276489, 700617, 134218, -733366, 57445, -1054415, -1227824, 1497333, 682363, -144955, --4832, -17717, 1147830, 523986, -438087, -472983, -457414, 78383, 851477, -1008244, --159988, -63351, -177167, 549219, -18254, -413391, 8549669, -6314676, -2361158, -1233729, -5261872, 4751845, -4768488, -421444, -8863202, -1924145, 10776610, 4070555, -4316442, 7743826, -2535641, 2988224, 802622, -2575907, -8458401, 1154273, -3801583, -2398202, -1534377, -5146982, --1813550, -3980361, 2803540, -1792612, -2325188, 4850629, -9104257, 8405788, -2943126, 1209033, --2841121, 2634963, -325881, -821949, -211527, 3586835, 191126, 2273112, -3244848, 6300180, --4873714, 7333657, 1573032, -709743, -4083440, -4792647, 9961640, 1729261, -9310952, 9550397, -9002788, -4867809, -1774895, 2835752, -3666828, -672699, -2254321, 2269890, 5747740, -3475702, -1324997, -2600603, -2373506, 951335, 7732552, -7066832, 4308389, -7284265, -5595806, -5258651, --916439, 153545, 9664, 4423817, 6847252, 1791538, 1671816, 3344706, 2719788, 1501628, -1709934, 2007897, -727460, 2160369, -972810, -2112050, 3649649, -178778, 513785, -657130, --1066763, -630286, 36507, 1540283, -376883, 346819, 166967, -1367410, 25233, 758062, -980863, -111669, 859530, 2437931, -3271691, 395674, -6462852, 6227703, -9084393, 387621, -9549860, -17251274, 12074227, 4850092, -4559108, 3829500, -312996, 10531797, -1057099, -8636105, --6022618, 3571265, 4108673, 1214939, 331249, 4505958, 1379758, 783295, 6094559, 2528125, -1777580, 4413079, 3185255, 15004468, -4058207, 4035659, -161598, -2395518, 3934727, 2471217, -1574106, 1959042, -2392834, -4076998, 331249, 56371, 271657, 2226941, 4620311, -4590247, --4884452, 2199560, -1125281, -1826435, -2900177, 6149320, -4306779, 8858907, 4191888, 455803, -2124935, 810138, 2464774, 11239393, 9446781, 783295, 592706, 2216740, -2184528, 4252018, --857383, 3842385, 1225676, 318364, 70330, -4691715, 4628901, 3565897, -952946, -2663417, -446140, 4468914, 498753, -1154809, 319975, -3246459, 2478733, 988916, 3140158, -731755, -982474, 1372242, 1354525, 1163936, 1916092, 963683, 896038, -3966939, -159451, 1671279, -2353105, -1298154, 1555315, 1452236, 1293322, 1460289, 663572, 1152662, 1407139, 1580548, -317828, 667331, 511638, 778463, 299574, 481036, 1009854, 459025, -91805, -796716, --1087701, 2228551, -1000727, 4868346, 132070, 5616744, -2121177, 4984847, -3733400, 10399726, --7916699, -2935610, -3769371, 10723996, 6070937, 3959960, 6806450, -6109591, -1226750, 9899363, -5615670, 4661650, 4806069, 2587718, 3305514, -1101122, 9478993, -953483, -4347581, -3209414, -3330210, -3539590, 2179696, -8921721, 3326452, -1684701, 185757, -9587441, 4158065, -2030983, -9040369, -1440425, 2867428, 2510945, -3797288, -912144, 4122632, 600222, 2829847, -2001992, -5016522, 7135552, 905701, -4919348, 1909113, 5028870, 3577708, 696858, -3388729, -6945499, -5857262, -7736847, -3284039, 4396436, -10304163, -2323041, 6398965, -4723927, 1348620, 128312, --576063, -1338956, 2604361, -5100274, 288300, -8542690, -4440460, -11689827, 890132, -3248606, -261456, -2230162, -361851, -2940442, 2691871, 2615098, 1040993, -1809255, 2485176, -235686, -971736, -3335579, 865436, 739808, 1086627, 788663, 2325188, -251256, 2623151, -1100049, --172872, 1869921, 2462090, 433255, 1363115, -1532230, -597000, -396748, -612570, -1085553, -766115, 1970316, 524523, 2076617, -1919850, -1100049, -1075889, -2611877, -3059091, 2805688, --18962818, 3308736, -5982353, -3485366, 4337380, 3279745, 2306398, 810675, -13933948, -1495722, -4329864, -7511361, -1967632, -10266582, -5218922, 2247342, -1224603, -9459665, 9804337, 5881421, --3010235, 1014149, 7712151, -5037460, 2065879, -3466039, -5395016, -3730179, -9750650, -3696356, -7337952, 3399467, 9379135, -4819490, -15374372, -6710887, 3743064, -5004711, -10027138, -1771674, --1899986, 9059697, 4642860, -10744398, 7096897, -7633231, -488016, -5541045, -5282810, -5085242, --11829951, -7077033, 823560, 7488276, 11396696, 7235410, 2084670, 4460861, -5279052, -8854075, --5463199, 5442798, -2739652, 5877663, -1867774, -5666136, -339302, 410169, -2750390, -6372658, -325344, 4620848, -15401216, -10237591, 14249091, -4749160, 224949, -7994545, 3713536, 2019172, --995359, -717260, 5170604, 3767760, 1110786, -1742683, -2021319, -462246, -2250026, 1124745, -1472100, -3133716, -1595044, 1015223, 272194, -105227, 828392, 2869038, -3248606, -1571421, --5882495, -2476586, -946503, -1198833, 218506, 714038, 1576790, 4295, 2042794, -2628520, --1879585, 331786, 437550, 731218, 7244536, -203474, 3666292, -4968741, 3644280, -6790344, --477815, 11792370, -5556077, 11140071, 11298985, 13925358, 3487514, 5572720, 12014634, 9402757, -6925635, -9310952, 1218160, 2945811, 8060580, -1584306, -6901476, 8945343, 9075803, -2570001, -6049999, -3007551, -3150896, 5689758, 4919885, -685584, 5836861, 517544, -9518184, -7612830, -8250096, 11958800, -929324, -4134980, 2536178, 372588, -5686537, -10679436, 5589900, -10098005, --4906464, 7731478, 1648194, 6840809, 303869, 10950019, 1532230, 12024298, -13967234, 12688944, --2450816, -471373, 3832722, 6712497, -5365488, -11559368, -3271155, 10620917, -2052994, -12369506, --7303592, -7573101, 2064269, 4496831, -10771778, 5470178, 6252399, 11221139, 3462281, 3547643, -52613, 3172370, 594316, 2486786, 1711008, -8148627, -892279, 3913789, 2747705, 6634651, --4319127, -1311576, -55835, 558346, 3172907, 427886, 2624225, 1079111, -1248225, -541166, -2502355, 2302103, 897648, 2507187, 714038, 1113470, 3300146, 51003, -1743220, -904628, -740345, 1608465, -201863, -755377, 2672544, 1372242, 611496, -2711735, -852551, -1550483, --1332514, -125628, 2854543, 158377, 2717104, 3763465, 12053826, 1552094, 5039608, 14328548, -15444702, 4607963, 3893925, -11403138, -5747203, 12613245, -9346386, 12890271, 3655554, -48855, --2547453, -4503273, -7425462, 1367410, 5733782, -13861470, -6251325, -5895380, 3104725, 2784750, -3068217, 427886, 2386928, -507880, 4212289, 3394098, -3642132, -6504728, -11950210, 2109366, --6438693, 10816875, 473520, -6012954, -7501161, -2311766, 5067525, -9418863, 5934034, -3156264, -1987496, -117575, -6657200, 6648073, 8475044, -5788542, 7140383, 2012729, -493384, 20199768, --5030481, -13123809, 2540473, 4915053, -3220689, 1078574, -5646272, 13706851, 8043937, -1380832, --2871723, 9726490, 9378598, -1971390, -7873212, -5790153, 19161460, -1782411, -2557653, -7724499, --4924180, -1563905, 1932735, -2025077, -5003100, 8195872, -2525441, 9730248, 2911988, -3107946, --995359, 1714229, 29528, -1705639, -1619203, 3403762, -4254165, -1102196, -1075889, 5602785, -607738, -1267552, -50466, -2915746, -2589865, -398358, 664109, 5871221, -1294396, 3462281, -1440425, -1968706, 1313186, 195421, -2764885, 2160369, -1324997, 3000572, -193810, -3170223, --2189360, -1833414, -2201708, -90194, -621697, -1040993, 1170916, 1031329, 1766842, 4924180, --10581189, -3029026, -3362960, 828392, 4437775, 10336376, 9029632, -14552960, 287763, 1656247, --1513439, -4378183, -10036265, -1073205, 3326989, 5887864, 4786204, -9225053, -1642288, -11681237, -10855530, 425202, -1124745, 5185100, -5223754, -1002875, -12429635, 2022930, -7437810, 5048734, --1011465, -2133525, -4232691, -8282845, -8039105, -1010928, -9905805, -16142098, -3033858, -7393786, --15498389, -1324997, -1374390, -8527658, 5492727, 8414915, -1101122, 3970697, -1117228, -1421097, -2254858, 2427730, -12562242, -3770981, 6817187, -6113349, 14922864, 2620467, 3946538, -9745281, --140660, -4449049, -9904731, -1138703, 13849122, 6356015, 10511932, 5774047, -4648765, -11296838, --17559974, 11664057, 12004434, -1530619, 6181532, -13750875, 6492380, 5497022, 9767293, 1381369, --11732777, -1601486, -10939282, -3878892, 861678, -3637837, 2267743, -2525978, -3658775, -1043140, -1011465, -646393, -1225139, 3104725, -1042603, 1138166, -7951595, 33823, -692027, -1363115, --3630321, -1637456, 2333241, -3446711, -3918621, -1511292, -1437203, -1717450, -61203, -1066226, --4332549, -3580929, -2183454, 1088237, 1388348, 2388539, 1148904, 2179696, 743566, -3229279, -579821, -641561, -1956358, 1017370, -3645890, 1394791, -1998770, -27109834, -6783364, 21555904, -7203734, 8792872, -5618354, 8880919, 15027554, 1106491, -2534568, -25035364, -5846524, -1173600, -14348412, 4042638, 5748277, -18754512, -5057861, -6971806, -4474282, 11665131, -6590091, -2279554, -2013266, 3343632, -5933498, -2584497, 3002182, -5235565, 11454678, -12847321, 1381906, 8476655, --11027329, 9046812, 15356656, 17903572, 8580808, 8766028, 11733314, -8047158, -14787572, 5905043, -6405944, 9777493, 7754564, -16687559, -4769025, 8784282, 5051956, 3201361, 10459319, 2364380, -12185359, -4529580, -2652142, 6995428, 6433861, 1959042, -10776610, -5737003, -11575474, -13216151, --794569, -14455786, 741419, -8411157, 573915, -7649337, -4552666, -18571976, 12792560, 3393561, --2795487, -3321620, -2124935, 2495913, -6910603, -954557, -16207059, -8852464, 5589363, 7326678, -2972117, 2465311, 587874, -8472897, 3837017, 3881577, 2964064, -8096014, 1802276, 322123, --6503654, -2171106, 1067836, 1022202, -3381213, -4839355, 1536525, -2376728, -3030636, -731755, -636729, -600222, -433255, 1646583, -1577327, 2290828, -463856, 3266323, -1520418, 2918430, -4494147, -3243237, 2467996, 224412, 1690607, -1999844, -280247, 2639258, 2034204, -3995930, -2034741, 2095944, 16995722, -8292508, -7096360, -6291590, 11700028, 14853071, -9339406, 23841364, -4999342, -10210748, 12199318, 3466039, -9948755, -11694659, -9438728, -780610, -5074504, -3490735, --15574088, 6219113, 6468221, 21494164, 2900177, -3696356, -9725953, -10199474, 2561411, -1231045, --13625247, 2384781, -5063767, 624381, 10493142, -8160438, 13882408, -12231530, -10270341, -724239, --15979426, -19129248, 3081639, -2221035, -22058416, 1492501, 235686, -10522133, 5488432, -5128728, -2763812, -14929306, -24338506, 15933792, -14899242, 24703578, 13485660, -17716204, -2285996, -17951890, --4851166, -2308008, 7416335, -6490770, 11329587, 14272176, 13566728, -9845676, -8012799, 1232119, --12045773, -1162326, -3940096, -15912317, 9470940, 6988449, -8471286, 12451647, -18577882, -1825361, -1098975, -4904316, -3142306, 16081968, 11900281, 7885560, -984084, -8464844, -6831683, -6393059, -2782602, 2551748, -522375, 1778653, -498753, -794032, 334471, -726386, 644782, 3167002, --3837017, 1478006, -276489, 3489661, -2068027, -420370, 2044941, 4679904, 1876364, 3767223, --4550518, -5019743, 2363306, -3360812, 802085, -72478, -5301601, -3012920, -3161633, 4295, -1743757, 1522029, 1071594, 1191853, -14448807, -10988137, 7209640, 8733816, 9655086, 16321949, --6010807, 30029338, -919660, -15534897, 6801618, 14807973, 4074850, 7787313, -6557342, -16638166, -25062744, 13914620, 10288594, 4874251, -8638790, 8077760, 20883204, -7650411, 4507032, -193274, -4427038, 3607773, 14893873, -4262218, 5092221, -5226975, 4560719, -1395864, -754304, 9243843, -2006824, -18398566, -12310987, -17239462, -11779485, -9133785, -4502737, -13191455, -7430831, -6465537, --11410654, -7937100, 5107253, -11936251, -4075387, -9259949, 22262426, 11325829, 19389092, -17488570, --1591822, -15976741, -3328600, 17966386, 9922985, 21161840, 10133438, 13109314, -13836774, 6308233, -6222334, 19600620, 19928648, 5982890, 18037788, -15451682, -7337415, 11563126, -40564356, 762357, -6738804, 879931, 10147934, 6544457, 22971096, -1742146, -3104188, 24850144, 7562901, -2172180, --11049877, -193274, 257161, 20370494, 2767033, 580894, 1711008, 4144644, 6410239, -1102733, --1086627, 6596533, 3223373, 2168959, 3539053, 4798016, 3755949, -210990, 879931, 683974, -6863895, -1168231, 3658775, 6588480, 4910758, 7346542, -3120294, -2393371, 1817308, 2405182, --2383707, 243739, 4299799, 6825240, -332860, 2064269, 17480516, 11359652, -11475079, 22353158, -13254269, -1140851, -5604933, -2820183, 13404593, 33028836, 17622788, 4744328, 1349157, 10849624, --2685965, 26665304, 15040439, 16655883, 639950, -8490613, 5611375, 2008434, -14226005, -3494493, --941672, -3349538, -4091493, 5416491, 2900177, -11631845, -5630166, -20555176, -2162516, -6387690, --26506928, -11876121, 748935, 9903658, -13669807, 17029008, -4772246, -4062502, -2376191, -4153234, -12324946, -8330626, 8596377, -27118960, 8332237, 11835856, 9066139, 18076444, -17911088, 15480136, --16086263, -11962021, 13326210, -7842611, -2449205, 11244761, -18236968, 16117939, 25760676, -522375, --3824132, 32959042, -7168301, 6350109, 18505940, -39605504, -20352240, 1351841, 1130113, 5380521, -9451612, 19276350, 11510512, -15141370, -12218108, -3587372, -4411469, -20454244, -2081985, -4070019, -4961761, -21371758, 155693, -6433324, 8604967, -3217468, 10980084, 2983929, 2147, -6321655, --4746476, -5943161, -6405407, -4820564, 4258460, -12985834, 9217537, -1536525, 5086852, 331249, --934155, -8858907, 4768488, -6286759, 1505386, -6679748, -3759707, -28991, -3069828, -7665980, -460635, -2390686, 740345, -5212480, -5879810, -6132140, 1000727, 1337882, 7677254, 8336532, --177167, 208306, -6032282, -31468688, -18950470, 23074712, 22943178, 2416993, -5496485, 19448148, --31565326, -16972100, -34149284, 14856829, 4082367, 1458678, 6555194, -15568720, 7800735, 10734734, -14092861, 23918672, 24586004, 20642686, -891206, 4623533, 215822, -9066676, -1917166, -7580081, --3940096, 28513214, -6727530, -26329224, -6695317, -5464809, 2294050, 41106596, -14939507, -14818711, -13874892, -22355304, 7651484, -24800214, 32258962, 9069360, -964757, 8227547, -12530567, -15844134, -22080964, -26994406, -21576842, -19418084, 5301601, 8024073, 10009958, -18021682, 18354542, -5757941, -1320166, 28313498, -2007360, -4895726, 8286603, 22835268, -14898168, 37915972, 1338956, -43845712, --5396627, -1756642, -14688788, -4290673, -81068, -4171487, -12010876, -10119480, 21463026, 14355391, --5377299, 13887777, -25218974, 6977175, 11193222, 6931004, 737661, 13368623, -2293513, -679142, -4958540, 13065291, -5523328, -5821828, -4563403, 518080, 4891431, -2621541, -10450729, -11238856, -467615, -5324686, 3788698, -226560, 2648921, 5826123, -7337415, -4889284, 12453795, -2991982, -2182917, -1063004, 245887, -4378183, -4855461, -2514167, -1688996, -6765111, 3132642, 5990406, -3321084, -222265, 474057, 2641405, -5211406, 1063004, 5737003, -698469, 4905390, -2952790, --9198209, -12437152, 186294, 5459441, -8862665, -4029216, 41791644, 24776056, -33660196, -27191974, -33641940, 32073206, 20075750, 23057532, -40080096, -8777839, -11034845, 10604274, 3912715, -16163036, --29599840, -44837848, 13143137, 11866458, 3497714, 12366285, -6110128, -2225330, -10629507, 8935679, -15546708, 13966697, 3659849, 18547816, 5957657, -2068564, -7533373, -27241904, -1449552, -11443403, --9492951, 9516037, -29241748, 2652679, 1196148, -13620415, 11964705, 10984379, 5429376, -19654844, --18299782, -48228724, -12269111, 375273, -15446850, 2757906, 10209674, 10188199, 27002460, 13277355, --11909407, -8325794, -17919678, 22733262, -9529459, 39323648, 32846300, 9133785, -20965346, 43412456, -19972134, -17539572, 2705293, 21829172, 50481436, -20820928, -38562364, -19868518, 543850, -13879187, -6103686, 13952738, 11635603, -10091563, -15761993, -8683887, -13116293, -14384919, 4017405, 15717433, -12542378, 7084012, 6256694, 2323041, 10551661, 1468879, 1708860, 15369004, 12033961, -663036, --5021891, 3505230, -7974144, 8569533, -3030100, 8771397, -4461398, 3536906, 2292976, 5812702, -7443715, 4422743, 3467649, -7192460, -14248554, 1735704, -7231115, -3621194, 4305168, 1335198, --2105071, -2719251, 10302553, 3442416, 13936095, -4421132, 7455527, 7542500, -9478456, 9903121, -519154, -7917772, 16753594, 6030671, -5754720, -16114717, 13639742, -27361626, -25299504, -9057012, -19756312, -11198053, -14345728, -55835, 22752052, 2483565, 23508504, -7744900, 28361816, 3357054, -15241228, -9813463, -6528887, 9045201, -29056528, -8025147, 11104101, -5086315, -3810710, -23350126, --22049826, 10415296, -13401909, -9581535, 18305150, 25061672, -3537979, 16530792, -29358248, 1939178, --7871065, 38441568, -15654619, 12899934, 23616952, 22494354, 6691022, -15428059, 10096931, 7295539, -6960532, 12536473, -37547676, 69806104, 22449258, -5932961, 3862786, 7999377, 19541028, -5178120, -15093589, 40797356, -2099165, -49999324, 21203180, 17675402, -17605070, 23795730, -4967667, -10306848, --26684632, 52235392, -26556856, 58135604, -37908992, 14543296, -495532, 63143000, 28159954, -26668526, -26051124, 1351841, -16464757, 12871480, 2212982, 5918465, 14334453, 6219650, -15915001, -3976603, -19452444, 5375152, 11125576, -8603356, 12270185, -20068772, 7815230, -912681, -6285148, 12858595, --6738804, -3717294, 9366787, -1316944, 1637456, -1371705, 15561203, -9776419, 15192910, -8577050, -14076755, 19523848, 7454990, 5458904, 10955925, -2551748, -7303592, -7162395, 9492951, 3416647, --1241782, 93416, -2113124, -13640279, -10368051, -1930051, 723165, -8450885, 47631724, 5566815, -25796648, 13086228, -26422638, 1494112, 15454366, -4842039, -23026930, -4536023, -50055696, -14128832, --18733036, -10922639, 10761577, -1622424, 17732310, -8923331, 1802276, 17236778, -15643882, 1504849, -9794136, -1155346, -17149804, -209917, -11820287, 34257196, -6166500, 19771882, 3107946, -531502, -35194036, 25242060, -15672873, -18460306, 8834211, 15776489, 19265076, 23320062, -554051, 8081518, -22203370, -1440425, -9098351, 6756521, 664646, -20024212, -567473, 12790413, -19583978, -26479010, --2596308, -1844689, -2925410, -9066139, -9586367, -31519154, -126165, 30404074, 9345312, 16785270, -9982578, -4408247, -40485972, -29917132, 7864622, 25834228, 8440684, 12899397, 52964464, 54776940, -46526844, -4029216, 23081692, -15110232, -39225400, -65594888, 11265699, 7696045, -2989297, 8706972, --20716238, 4061965, -5102958, 23547696, -1869921, 18827526, -23713052, 11256036, -29102698, -6027987, -12192338, 1676648, -14849313, 3052111, -12241731, -13603235, -5686000, 3054796, 11028939, 13887777, -18773302, -4990215, -1085016, 4412005, -5232344, 5591511, -19591494, -17132088, -11655467, -16071768, --15105400, -16411070, 10281078, 7034083, -2727841, -10952703, -15997679, 9166534, 92342, 14771466, --3819837, 13023951, 9909026, 76236, 4219806, 15699716, -19527068, -18815178, 11093364, -2208687, --14444512, -30776126, 9231495, -18315888, 9505299, -7756711, -21602612, -6445672, 255014, 11261404, --8893267, 5910949, -31880468, 30577482, -67258112, -6400038, -16494285, -13492103, 9489730, 39104604, -6650757, 14429480, -32898376, 7849053, 12724914, 26999238, -13409962, -21166672, -14511621, -6926709, --568009, -190052, 16554415, 12105902, -9035001, -48489644, -22748294, -39358544, 5083631, 70491152, --49117244, -19248970, -7145215, 40909028, -13063680, 17528298, -12458090, 19928112, -7237020, -11425150, --24665998, 13391171, -28661928, 27398670, 49238580, 6678138, -8474507, -8694624, 40933724, 11143830, -155693, 21788370, 7537131, 8148090, -7253126, 47153908, -72927472, 53613004, -44224740, 21671868, -53057880, -41717016, 85703928, 58454504, -21286932, -6863358, 59119152, 21809308, -5005248, 38997228, -35128000, -44546864, 60990148, -36134096, 11318849, 12003360, -15629923, 12081206, 20322712, -11787538, --21536040, 7605314, -11334419, 5551782, 5662378, -5652177, -16744467, 7337415, 6791954, -6667400, -7896298, 6296959, -13343927, 34656628, 4334696, 1141388, 1338419, -6503654, 5852967, 5043366, -2434173, -10720775, 6426345, 2003602, -4243428, -9346923, 21772262, -7567196, 17834314, 20053202, --1340030, -6834367, 5837935, 5260261, 8275865, 24082418, 21020644, -17830556, 9169755, -6985765, --390842, 10639171, -1634235, 49753440, 47438452, -40207336, 39534636, 36369784, -33879240, -51261508, --75781480, 17819282, 114192976, 46966004, 369904, 23648090, -108848432, -44917304, -3697430, 16720308, -82184200, 80347560, 14024142, -30840550, -60226716, -35316444, 4271345, 26001196, 39391292, 63184876, -38280508, -50770272, -119998704, -97881768, -9435506, 109086264, 118790744, 74998720, 23090818, -25121264, --48212080, -73109472, -41515152, -44451836, 87456808, 72645080, 46080704, 40652404, -61495880, -86425480, --100117296, -89820648, 34839164, 121734408, 150086016, 50689204, -45168024, -106667664, -127728568, -34802120, -20842940, 13234942, 80325016, 31422518, -29996588, -17933100, -61378304, -13459891, -70204464, 30502320, -83800720, 156241776, -9223442, -83566104, -181222928, -7122667, -61089468, -6551973, 87278568, 17200808, --7699266, -38856032, -81468552, -53637700, 39560408, 63340568, 21158082, -11132018, -27547384, -33413234, -32807108, 37284076, 23393614, 19929722, 9262634, 18573050, -1476932, 1687922, -17820894, -8492761, -2406256, 47040092, 41564008, -2229625, -17324288, -4689031, -41719164, -28373090, -704912, 15953119, -43882756, 33411624, 24173150, 2044404, -58228484, -52937620, -35339528, 13703093, 56965760, 109462608, -67546952, -50705312, -90574416, -80554792, -31936304, 2113661, 75537200, 94286344, 70966816, 12212740, --55582784, -127587912, -79746808, 25726318, 79597552, 90094992, 26947698, -13459354, -34496640, -41760504, -707059, -10460930, 51341504, 30015378, -4581657, 10883447, 5512054, -36643588, -3876745, -3017215, -3937948, 1101659, 2872796, -13423383, -5411659, -4975720, -3429532, -6125697, 21844740, -7904888, -9348533, -16522739, -1724966, 6774774, -846109, -5041218, 37766184, 5206037, -21488796, -24919400, -5163088, 5204964, -14700599, 4031901, 18929532, 9844602, 17810692, -18331994, 5463736, -671626, -4217658, -12910135, 2369748, 14276471, 20161114, 5104032, -5358509, 5915781, 2199560, -4736275, -13712220, -20412906, 4510253, -33236068, -10499048, 13700409, -11374684, -13370233, 17956722, -11540577, --31113280, -24021752, 21148956, -2673617, -4328790, 4865661, 10654203, 26914950, -17682918, -22899156, -849330, -3163244, 18112414, 112206, 10534481, 4857071, -1938641, 27958090, -36587216, -5366025, --5288179, -21434034, 5338645, 11956652, 382789, -12779675, 5510443, -2907693, 3485903, -11055783, -7940321, -605054, 1161252, -1012539, -2860985, 14155675, -14428943, 1069984, -2604361, -5171678, --4731980, 1614908, -6348499, 6464463, 8178692, -8735427, -2383707, -3373697, 7471096, 8428336, --4461398, 10399190, 834297, -1561758, -7242389, 7479149, 2405719, -3047279, -11856794, 5436355, --10782515, 6742562, -5929739, -5196911, 9426916, 9556839, -13385266, 1499481, -3320547, -12974022, -3927748, -7621420, 8190503, -7514582, -30088930, -33182918, -78932376, 22812718, 22565222, -1613834, --66542464, -43021612, -6335614, -10923176, 44452912, 29982630, 14417668, -29465624, -12166032, -7817378, -27831924, 3045669, -7941932, -17301202, 11407970, 5056787, 13841606, -773631, -5666136, -7090991, --15934866, -7968238, -9647033, 26579942, 14207752, 3114925, 3979287, -17530982, -947577, 2111513, -24271398, -1772748, 11308112, -9041980, -6297496, 4929012, -10016937, 6594923, 2895882, 7094212, -23676008, -2092723, 20775830, -294205, 13338558, -10344966, 867583, -15203110, -19666118, -20700132, --17710834, 5812165, 3060701, 1504312, -26077430, 12861280, -22698366, -2579665, 1171452, -14231374, --15402826, -8147553, 272194, -27115202, -18342732, 16818556, -8189966, 15657303, 2484102, -4364224, --14660871, -16935056, -1107028, 23990614, 29743722, -7428683, -3054796, -11206643, -14919643, -10310069, -9478456, 5025112, 3642669, 9292162, -1847373, -6183679, 6442451, 3539053, 5361193, 8127689, --4570919, 2729452, -908386, 173409, -6209986, 10744398, 3404835, 2438468, -3232500, 1543504, --234613, 16757889, 2136746, 5016522, -9409200, 620086, -6092411, 10963978, 758599, 157840, --3863860, 2538863, -1262720, 130997, 5255430, 491237, 6888054, -4690641, 2238752, 719407, --8826158, -483184, 5049271, 1935420, -1815697, 17746804, -38152732, -94612224, -90687160, -13756780, -27435714, 91260536, 78864728, 74349640, 79859552, 44466332, 10760504, -40305584, -40502080, -84171696, --65369404, -57303992, -36354212, -45721536, 62989452, 51831664, 68209984, 39351564, 55751360, -2004139, -14686104, -8937827, -21746494, -12420509, -26001732, -30228516, -30131344, -29702920, -35187056, -25738666, --20921860, -2350421, 5542656, 49473728, 41502268, 21897890, 23503672, 32647658, 30276298, 14609331, -70395584, 9185861, 920197, 13238700, -26297548, -80736792, -23109608, -64712272, -69442104, -73332272, --51901460, -46185392, 2305861, 38361576, 39095476, 47794396, 86872160, 62565864, 76235672, 74968120, -47801376, 51445120, 17547088, -18049064, -58700392, -76968496, -87997440, -57198228, -78978544, -66318592, --75833552, -44202728, -5293011, 20817170, 61349312, 58597848, 59436980, 99037112, 68961072, 81874424, -50959252, 8522826, -9623948, -24745454, -40991704, -45844480, -48641580, -47334836, -54641648, -46769508, --34274912, -20999168, -10922102, -8198556, 23685670, 22563074, 31714576, 51331840, 57765164, 36694052, -44125956, 27271432, -1708860, -11966316, -26683558, -33286534, -28613608, -24642374, -29909078, -10888816, --7439420, 695785, 8391292, 9402220, 2312840, 1302449, 8213051, -1187022, -7259569, 6633577, -3852586, 4733591, 7246684, 2183454, 1877975, 4459250, 10094247, 8725226, 3910031, 852014, --2333778, -8684424, -6696391, -7903814, -6986838, -2757906, -5435281, -4656282, -2718714, -2073396, --3004867, -828929, 3099893, 3169686, 3795141, 6293738, 4003447, 2831457, 3544959, 927713, -641024, 338229, 5906, 26307, 64961, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +7221988, 367757, 3323768, 3297998, 9343701, 4401805, -3434900, -4341138, -6060736, 4363150, +-5300527, -3850975, 879931, 1349157, 587337, 5486821, -1776506, 5129265, -1298691, 4605279, +-4337917, 2026688, -1909650, -4636417, -316217, -8854075, 1341640, 2187212, 3976066, -3227131, +-40802, 3470871, -2535105, 3897146, 3669513, -2185602, 2638184, -2932926, -1358820, -2165737, +-3169686, -4029753, 3628174, 5354751, -3989488, 2382096, 4307316, 3488050, 5270999, 671626, +-780610, 3074123, 2334852, -5551782, -202937, 653909, 363462, 1775969, 3614215, 818728, +1315871, -1920387, -1213865, 2561948, 3590593, 2007360, -1890859, -3312494, 3701188, -2989297, +-967441, 2077154, -616865, -125628, 1580548, 382252, 106300, 3357591, -3272228, 2503429, +1363115, 1644436, 3097208, -1236414, -354335, -1037235, -430034, 135828, 1517734, -1194538, +-216359, -823023, -476205, 57982, -116501, -476741, -340913, 347892, 449361, -2684, +-195421, -328565, 49392, -100395, 52076, -474594, -107911, 487479, -1068910, 3682935, +-1955821, 2697776, 256087, -230854, -7508140, 1202591, 6391448, -3927748, 2639794, -7973070, +-8067023, -2660195, -6560026, -5726802, -863825, 1180042, 4503810, 714575, -2172717, 1017907, +3064996, -3966939, 5491653, -3724274, -4027069, 4651987, -2317672, 5359583, 6813429, 941672, +-4916664, 3437585, 2246805, 1376537, -2502355, -1815161, 2861522, 2388002, 485868, -5558225, +-1603633, -5134634, 4635344, -4634807, -3021510, 3410204, 161598, 2959769, 848256, 1134408, +5045513, 851477, 5659157, -7297687, -3744675, -1688996, 3616363, 5109938, 5844377, 7947837, +864899, -2267743, -759136, -1069984, -241592, -5170067, -2260764, -2251100, -626528, 794569, +-4188667, -2485176, -943282, -1788317, -3274376, 3934190, -3936338, -1347009, 2625836, -6753299, +2043868, 3675418, 4085588, 2143726, 1187559, 2441689, -1194001, -2622615, -655519, 700617, +-276489, 700617, 134218, -733366, 57445, -1054415, -1227824, 1497333, 682363, -144955, +-4832, -17717, 1147830, 523986, -438087, -472983, -457414, 78383, 851477, -1008244, +-159988, -63351, -177167, 549219, -18254, -413391, 8549669, -6314676, -2361158, -1233729, +5261872, 4751845, -4768488, -421444, -8863202, -1924145, 10776610, 4070555, -4316442, 7743826, +2535641, 2988224, 802622, -2575907, -8458401, 1154273, -3801583, -2398202, -1534377, -5146982, +-1813550, -3980361, 2803540, -1792612, -2325188, 4850629, -9104257, 8405788, -2943126, 1209033, +-2841121, 2634963, -325881, -821949, -211527, 3586835, 191126, 2273112, -3244848, 6300180, +-4873714, 7333657, 1573032, -709743, -4083440, -4792647, 9961640, 1729261, -9310952, 9550397, +9002788, -4867809, -1774895, 2835752, -3666828, -672699, -2254321, 2269890, 5747740, -3475702, +1324997, -2600603, -2373506, 951335, 7732552, -7066832, 4308389, -7284265, -5595806, -5258651, +-916439, 153545, 9664, 4423817, 6847252, 1791538, 1671816, 3344706, 2719788, 1501628, +1709934, 2007897, -727460, 2160369, -972810, -2112050, 3649649, -178778, 513785, -657130, +-1066763, -630286, 36507, 1540283, -376883, 346819, 166967, -1367410, 25233, 758062, +980863, -111669, 859530, 2437931, -3271691, 395674, -6462852, 6227703, -9084393, 387621, +9549860, -17251274, 12074227, 4850092, -4559108, 3829500, -312996, 10531797, -1057099, -8636105, +-6022618, 3571265, 4108673, 1214939, 331249, 4505958, 1379758, 783295, 6094559, 2528125, +1777580, 4413079, 3185255, 15004468, -4058207, 4035659, -161598, -2395518, 3934727, 2471217, +1574106, 1959042, -2392834, -4076998, 331249, 56371, 271657, 2226941, 4620311, -4590247, +-4884452, 2199560, -1125281, -1826435, -2900177, 6149320, -4306779, 8858907, 4191888, 455803, +2124935, 810138, 2464774, 11239393, 9446781, 783295, 592706, 2216740, -2184528, 4252018, +-857383, 3842385, 1225676, 318364, 70330, -4691715, 4628901, 3565897, -952946, -2663417, +446140, 4468914, 498753, -1154809, 319975, -3246459, 2478733, 988916, 3140158, -731755, +982474, 1372242, 1354525, 1163936, 1916092, 963683, 896038, -3966939, -159451, 1671279, +2353105, -1298154, 1555315, 1452236, 1293322, 1460289, 663572, 1152662, 1407139, 1580548, +317828, 667331, 511638, 778463, 299574, 481036, 1009854, 459025, -91805, -796716, +-1087701, 2228551, -1000727, 4868346, 132070, 5616744, -2121177, 4984847, -3733400, 10399726, +-7916699, -2935610, -3769371, 10723996, 6070937, 3959960, 6806450, -6109591, -1226750, 9899363, +5615670, 4661650, 4806069, 2587718, 3305514, -1101122, 9478993, -953483, -4347581, -3209414, +3330210, -3539590, 2179696, -8921721, 3326452, -1684701, 185757, -9587441, 4158065, -2030983, +9040369, -1440425, 2867428, 2510945, -3797288, -912144, 4122632, 600222, 2829847, -2001992, +5016522, 7135552, 905701, -4919348, 1909113, 5028870, 3577708, 696858, -3388729, -6945499, +5857262, -7736847, -3284039, 4396436, -10304163, -2323041, 6398965, -4723927, 1348620, 128312, +-576063, -1338956, 2604361, -5100274, 288300, -8542690, -4440460, -11689827, 890132, -3248606, +261456, -2230162, -361851, -2940442, 2691871, 2615098, 1040993, -1809255, 2485176, -235686, +971736, -3335579, 865436, 739808, 1086627, 788663, 2325188, -251256, 2623151, -1100049, +-172872, 1869921, 2462090, 433255, 1363115, -1532230, -597000, -396748, -612570, -1085553, +766115, 1970316, 524523, 2076617, -1919850, -1100049, -1075889, -2611877, -3059091, 2805688, +-18962818, 3308736, -5982353, -3485366, 4337380, 3279745, 2306398, 810675, -13933948, -1495722, +4329864, -7511361, -1967632, -10266582, -5218922, 2247342, -1224603, -9459665, 9804337, 5881421, +-3010235, 1014149, 7712151, -5037460, 2065879, -3466039, -5395016, -3730179, -9750650, -3696356, +7337952, 3399467, 9379135, -4819490, -15374372, -6710887, 3743064, -5004711, -10027138, -1771674, +-1899986, 9059697, 4642860, -10744398, 7096897, -7633231, -488016, -5541045, -5282810, -5085242, +-11829951, -7077033, 823560, 7488276, 11396696, 7235410, 2084670, 4460861, -5279052, -8854075, +-5463199, 5442798, -2739652, 5877663, -1867774, -5666136, -339302, 410169, -2750390, -6372658, +325344, 4620848, -15401216, -10237591, 14249091, -4749160, 224949, -7994545, 3713536, 2019172, +-995359, -717260, 5170604, 3767760, 1110786, -1742683, -2021319, -462246, -2250026, 1124745, +1472100, -3133716, -1595044, 1015223, 272194, -105227, 828392, 2869038, -3248606, -1571421, +-5882495, -2476586, -946503, -1198833, 218506, 714038, 1576790, 4295, 2042794, -2628520, +-1879585, 331786, 437550, 731218, 7244536, -203474, 3666292, -4968741, 3644280, -6790344, +-477815, 11792370, -5556077, 11140071, 11298985, 13925358, 3487514, 5572720, 12014634, 9402757, +6925635, -9310952, 1218160, 2945811, 8060580, -1584306, -6901476, 8945343, 9075803, -2570001, +6049999, -3007551, -3150896, 5689758, 4919885, -685584, 5836861, 517544, -9518184, -7612830, +8250096, 11958800, -929324, -4134980, 2536178, 372588, -5686537, -10679436, 5589900, -10098005, +-4906464, 7731478, 1648194, 6840809, 303869, 10950019, 1532230, 12024298, -13967234, 12688944, +-2450816, -471373, 3832722, 6712497, -5365488, -11559368, -3271155, 10620917, -2052994, -12369506, +-7303592, -7573101, 2064269, 4496831, -10771778, 5470178, 6252399, 11221139, 3462281, 3547643, +52613, 3172370, 594316, 2486786, 1711008, -8148627, -892279, 3913789, 2747705, 6634651, +-4319127, -1311576, -55835, 558346, 3172907, 427886, 2624225, 1079111, -1248225, -541166, +2502355, 2302103, 897648, 2507187, 714038, 1113470, 3300146, 51003, -1743220, -904628, +740345, 1608465, -201863, -755377, 2672544, 1372242, 611496, -2711735, -852551, -1550483, +-1332514, -125628, 2854543, 158377, 2717104, 3763465, 12053826, 1552094, 5039608, 14328548, +15444702, 4607963, 3893925, -11403138, -5747203, 12613245, -9346386, 12890271, 3655554, -48855, +-2547453, -4503273, -7425462, 1367410, 5733782, -13861470, -6251325, -5895380, 3104725, 2784750, +3068217, 427886, 2386928, -507880, 4212289, 3394098, -3642132, -6504728, -11950210, 2109366, +-6438693, 10816875, 473520, -6012954, -7501161, -2311766, 5067525, -9418863, 5934034, -3156264, +1987496, -117575, -6657200, 6648073, 8475044, -5788542, 7140383, 2012729, -493384, 20199768, +-5030481, -13123809, 2540473, 4915053, -3220689, 1078574, -5646272, 13706851, 8043937, -1380832, +-2871723, 9726490, 9378598, -1971390, -7873212, -5790153, 19161460, -1782411, -2557653, -7724499, +-4924180, -1563905, 1932735, -2025077, -5003100, 8195872, -2525441, 9730248, 2911988, -3107946, +-995359, 1714229, 29528, -1705639, -1619203, 3403762, -4254165, -1102196, -1075889, 5602785, +607738, -1267552, -50466, -2915746, -2589865, -398358, 664109, 5871221, -1294396, 3462281, +1440425, -1968706, 1313186, 195421, -2764885, 2160369, -1324997, 3000572, -193810, -3170223, +-2189360, -1833414, -2201708, -90194, -621697, -1040993, 1170916, 1031329, 1766842, 4924180, +-10581189, -3029026, -3362960, 828392, 4437775, 10336376, 9029632, -14552960, 287763, 1656247, +-1513439, -4378183, -10036265, -1073205, 3326989, 5887864, 4786204, -9225053, -1642288, -11681237, +10855530, 425202, -1124745, 5185100, -5223754, -1002875, -12429635, 2022930, -7437810, 5048734, +-1011465, -2133525, -4232691, -8282845, -8039105, -1010928, -9905805, -16142098, -3033858, -7393786, +-15498389, -1324997, -1374390, -8527658, 5492727, 8414915, -1101122, 3970697, -1117228, -1421097, +2254858, 2427730, -12562242, -3770981, 6817187, -6113349, 14922864, 2620467, 3946538, -9745281, +-140660, -4449049, -9904731, -1138703, 13849122, 6356015, 10511932, 5774047, -4648765, -11296838, +-17559974, 11664057, 12004434, -1530619, 6181532, -13750875, 6492380, 5497022, 9767293, 1381369, +-11732777, -1601486, -10939282, -3878892, 861678, -3637837, 2267743, -2525978, -3658775, -1043140, +1011465, -646393, -1225139, 3104725, -1042603, 1138166, -7951595, 33823, -692027, -1363115, +-3630321, -1637456, 2333241, -3446711, -3918621, -1511292, -1437203, -1717450, -61203, -1066226, +-4332549, -3580929, -2183454, 1088237, 1388348, 2388539, 1148904, 2179696, 743566, -3229279, +579821, -641561, -1956358, 1017370, -3645890, 1394791, -1998770, -27109834, -6783364, 21555904, +7203734, 8792872, -5618354, 8880919, 15027554, 1106491, -2534568, -25035364, -5846524, -1173600, +14348412, 4042638, 5748277, -18754512, -5057861, -6971806, -4474282, 11665131, -6590091, -2279554, +2013266, 3343632, -5933498, -2584497, 3002182, -5235565, 11454678, -12847321, 1381906, 8476655, +-11027329, 9046812, 15356656, 17903572, 8580808, 8766028, 11733314, -8047158, -14787572, 5905043, +6405944, 9777493, 7754564, -16687559, -4769025, 8784282, 5051956, 3201361, 10459319, 2364380, +12185359, -4529580, -2652142, 6995428, 6433861, 1959042, -10776610, -5737003, -11575474, -13216151, +-794569, -14455786, 741419, -8411157, 573915, -7649337, -4552666, -18571976, 12792560, 3393561, +-2795487, -3321620, -2124935, 2495913, -6910603, -954557, -16207059, -8852464, 5589363, 7326678, +2972117, 2465311, 587874, -8472897, 3837017, 3881577, 2964064, -8096014, 1802276, 322123, +-6503654, -2171106, 1067836, 1022202, -3381213, -4839355, 1536525, -2376728, -3030636, -731755, +636729, -600222, -433255, 1646583, -1577327, 2290828, -463856, 3266323, -1520418, 2918430, +4494147, -3243237, 2467996, 224412, 1690607, -1999844, -280247, 2639258, 2034204, -3995930, +2034741, 2095944, 16995722, -8292508, -7096360, -6291590, 11700028, 14853071, -9339406, 23841364, +4999342, -10210748, 12199318, 3466039, -9948755, -11694659, -9438728, -780610, -5074504, -3490735, +-15574088, 6219113, 6468221, 21494164, 2900177, -3696356, -9725953, -10199474, 2561411, -1231045, +-13625247, 2384781, -5063767, 624381, 10493142, -8160438, 13882408, -12231530, -10270341, -724239, +-15979426, -19129248, 3081639, -2221035, -22058416, 1492501, 235686, -10522133, 5488432, -5128728, +2763812, -14929306, -24338506, 15933792, -14899242, 24703578, 13485660, -17716204, -2285996, -17951890, +-4851166, -2308008, 7416335, -6490770, 11329587, 14272176, 13566728, -9845676, -8012799, 1232119, +-12045773, -1162326, -3940096, -15912317, 9470940, 6988449, -8471286, 12451647, -18577882, -1825361, +1098975, -4904316, -3142306, 16081968, 11900281, 7885560, -984084, -8464844, -6831683, -6393059, +2782602, 2551748, -522375, 1778653, -498753, -794032, 334471, -726386, 644782, 3167002, +-3837017, 1478006, -276489, 3489661, -2068027, -420370, 2044941, 4679904, 1876364, 3767223, +-4550518, -5019743, 2363306, -3360812, 802085, -72478, -5301601, -3012920, -3161633, 4295, +1743757, 1522029, 1071594, 1191853, -14448807, -10988137, 7209640, 8733816, 9655086, 16321949, +-6010807, 30029338, -919660, -15534897, 6801618, 14807973, 4074850, 7787313, -6557342, -16638166, +25062744, 13914620, 10288594, 4874251, -8638790, 8077760, 20883204, -7650411, 4507032, -193274, +4427038, 3607773, 14893873, -4262218, 5092221, -5226975, 4560719, -1395864, -754304, 9243843, +2006824, -18398566, -12310987, -17239462, -11779485, -9133785, -4502737, -13191455, -7430831, -6465537, +-11410654, -7937100, 5107253, -11936251, -4075387, -9259949, 22262426, 11325829, 19389092, -17488570, +-1591822, -15976741, -3328600, 17966386, 9922985, 21161840, 10133438, 13109314, -13836774, 6308233, +6222334, 19600620, 19928648, 5982890, 18037788, -15451682, -7337415, 11563126, -40564356, 762357, +6738804, 879931, 10147934, 6544457, 22971096, -1742146, -3104188, 24850144, 7562901, -2172180, +-11049877, -193274, 257161, 20370494, 2767033, 580894, 1711008, 4144644, 6410239, -1102733, +-1086627, 6596533, 3223373, 2168959, 3539053, 4798016, 3755949, -210990, 879931, 683974, +6863895, -1168231, 3658775, 6588480, 4910758, 7346542, -3120294, -2393371, 1817308, 2405182, +-2383707, 243739, 4299799, 6825240, -332860, 2064269, 17480516, 11359652, -11475079, 22353158, +13254269, -1140851, -5604933, -2820183, 13404593, 33028836, 17622788, 4744328, 1349157, 10849624, +-2685965, 26665304, 15040439, 16655883, 639950, -8490613, 5611375, 2008434, -14226005, -3494493, +-941672, -3349538, -4091493, 5416491, 2900177, -11631845, -5630166, -20555176, -2162516, -6387690, +-26506928, -11876121, 748935, 9903658, -13669807, 17029008, -4772246, -4062502, -2376191, -4153234, +12324946, -8330626, 8596377, -27118960, 8332237, 11835856, 9066139, 18076444, -17911088, 15480136, +-16086263, -11962021, 13326210, -7842611, -2449205, 11244761, -18236968, 16117939, 25760676, -522375, +-3824132, 32959042, -7168301, 6350109, 18505940, -39605504, -20352240, 1351841, 1130113, 5380521, +9451612, 19276350, 11510512, -15141370, -12218108, -3587372, -4411469, -20454244, -2081985, -4070019, +4961761, -21371758, 155693, -6433324, 8604967, -3217468, 10980084, 2983929, 2147, -6321655, +-4746476, -5943161, -6405407, -4820564, 4258460, -12985834, 9217537, -1536525, 5086852, 331249, +-934155, -8858907, 4768488, -6286759, 1505386, -6679748, -3759707, -28991, -3069828, -7665980, +460635, -2390686, 740345, -5212480, -5879810, -6132140, 1000727, 1337882, 7677254, 8336532, +-177167, 208306, -6032282, -31468688, -18950470, 23074712, 22943178, 2416993, -5496485, 19448148, +-31565326, -16972100, -34149284, 14856829, 4082367, 1458678, 6555194, -15568720, 7800735, 10734734, +14092861, 23918672, 24586004, 20642686, -891206, 4623533, 215822, -9066676, -1917166, -7580081, +-3940096, 28513214, -6727530, -26329224, -6695317, -5464809, 2294050, 41106596, -14939507, -14818711, +13874892, -22355304, 7651484, -24800214, 32258962, 9069360, -964757, 8227547, -12530567, -15844134, +22080964, -26994406, -21576842, -19418084, 5301601, 8024073, 10009958, -18021682, 18354542, -5757941, +1320166, 28313498, -2007360, -4895726, 8286603, 22835268, -14898168, 37915972, 1338956, -43845712, +-5396627, -1756642, -14688788, -4290673, -81068, -4171487, -12010876, -10119480, 21463026, 14355391, +-5377299, 13887777, -25218974, 6977175, 11193222, 6931004, 737661, 13368623, -2293513, -679142, +4958540, 13065291, -5523328, -5821828, -4563403, 518080, 4891431, -2621541, -10450729, -11238856, +467615, -5324686, 3788698, -226560, 2648921, 5826123, -7337415, -4889284, 12453795, -2991982, +2182917, -1063004, 245887, -4378183, -4855461, -2514167, -1688996, -6765111, 3132642, 5990406, +3321084, -222265, 474057, 2641405, -5211406, 1063004, 5737003, -698469, 4905390, -2952790, +-9198209, -12437152, 186294, 5459441, -8862665, -4029216, 41791644, 24776056, -33660196, -27191974, +33641940, 32073206, 20075750, 23057532, -40080096, -8777839, -11034845, 10604274, 3912715, -16163036, +-29599840, -44837848, 13143137, 11866458, 3497714, 12366285, -6110128, -2225330, -10629507, 8935679, +15546708, 13966697, 3659849, 18547816, 5957657, -2068564, -7533373, -27241904, -1449552, -11443403, +-9492951, 9516037, -29241748, 2652679, 1196148, -13620415, 11964705, 10984379, 5429376, -19654844, +-18299782, -48228724, -12269111, 375273, -15446850, 2757906, 10209674, 10188199, 27002460, 13277355, +-11909407, -8325794, -17919678, 22733262, -9529459, 39323648, 32846300, 9133785, -20965346, 43412456, +19972134, -17539572, 2705293, 21829172, 50481436, -20820928, -38562364, -19868518, 543850, -13879187, +6103686, 13952738, 11635603, -10091563, -15761993, -8683887, -13116293, -14384919, 4017405, 15717433, +12542378, 7084012, 6256694, 2323041, 10551661, 1468879, 1708860, 15369004, 12033961, -663036, +-5021891, 3505230, -7974144, 8569533, -3030100, 8771397, -4461398, 3536906, 2292976, 5812702, +7443715, 4422743, 3467649, -7192460, -14248554, 1735704, -7231115, -3621194, 4305168, 1335198, +-2105071, -2719251, 10302553, 3442416, 13936095, -4421132, 7455527, 7542500, -9478456, 9903121, +519154, -7917772, 16753594, 6030671, -5754720, -16114717, 13639742, -27361626, -25299504, -9057012, +19756312, -11198053, -14345728, -55835, 22752052, 2483565, 23508504, -7744900, 28361816, 3357054, +15241228, -9813463, -6528887, 9045201, -29056528, -8025147, 11104101, -5086315, -3810710, -23350126, +-22049826, 10415296, -13401909, -9581535, 18305150, 25061672, -3537979, 16530792, -29358248, 1939178, +-7871065, 38441568, -15654619, 12899934, 23616952, 22494354, 6691022, -15428059, 10096931, 7295539, +6960532, 12536473, -37547676, 69806104, 22449258, -5932961, 3862786, 7999377, 19541028, -5178120, +15093589, 40797356, -2099165, -49999324, 21203180, 17675402, -17605070, 23795730, -4967667, -10306848, +-26684632, 52235392, -26556856, 58135604, -37908992, 14543296, -495532, 63143000, 28159954, -26668526, +26051124, 1351841, -16464757, 12871480, 2212982, 5918465, 14334453, 6219650, -15915001, -3976603, +19452444, 5375152, 11125576, -8603356, 12270185, -20068772, 7815230, -912681, -6285148, 12858595, +-6738804, -3717294, 9366787, -1316944, 1637456, -1371705, 15561203, -9776419, 15192910, -8577050, +14076755, 19523848, 7454990, 5458904, 10955925, -2551748, -7303592, -7162395, 9492951, 3416647, +-1241782, 93416, -2113124, -13640279, -10368051, -1930051, 723165, -8450885, 47631724, 5566815, +25796648, 13086228, -26422638, 1494112, 15454366, -4842039, -23026930, -4536023, -50055696, -14128832, +-18733036, -10922639, 10761577, -1622424, 17732310, -8923331, 1802276, 17236778, -15643882, 1504849, +9794136, -1155346, -17149804, -209917, -11820287, 34257196, -6166500, 19771882, 3107946, -531502, +35194036, 25242060, -15672873, -18460306, 8834211, 15776489, 19265076, 23320062, -554051, 8081518, +22203370, -1440425, -9098351, 6756521, 664646, -20024212, -567473, 12790413, -19583978, -26479010, +-2596308, -1844689, -2925410, -9066139, -9586367, -31519154, -126165, 30404074, 9345312, 16785270, +9982578, -4408247, -40485972, -29917132, 7864622, 25834228, 8440684, 12899397, 52964464, 54776940, +46526844, -4029216, 23081692, -15110232, -39225400, -65594888, 11265699, 7696045, -2989297, 8706972, +-20716238, 4061965, -5102958, 23547696, -1869921, 18827526, -23713052, 11256036, -29102698, -6027987, +12192338, 1676648, -14849313, 3052111, -12241731, -13603235, -5686000, 3054796, 11028939, 13887777, +18773302, -4990215, -1085016, 4412005, -5232344, 5591511, -19591494, -17132088, -11655467, -16071768, +-15105400, -16411070, 10281078, 7034083, -2727841, -10952703, -15997679, 9166534, 92342, 14771466, +-3819837, 13023951, 9909026, 76236, 4219806, 15699716, -19527068, -18815178, 11093364, -2208687, +-14444512, -30776126, 9231495, -18315888, 9505299, -7756711, -21602612, -6445672, 255014, 11261404, +-8893267, 5910949, -31880468, 30577482, -67258112, -6400038, -16494285, -13492103, 9489730, 39104604, +6650757, 14429480, -32898376, 7849053, 12724914, 26999238, -13409962, -21166672, -14511621, -6926709, +-568009, -190052, 16554415, 12105902, -9035001, -48489644, -22748294, -39358544, 5083631, 70491152, +-49117244, -19248970, -7145215, 40909028, -13063680, 17528298, -12458090, 19928112, -7237020, -11425150, +-24665998, 13391171, -28661928, 27398670, 49238580, 6678138, -8474507, -8694624, 40933724, 11143830, +155693, 21788370, 7537131, 8148090, -7253126, 47153908, -72927472, 53613004, -44224740, 21671868, +53057880, -41717016, 85703928, 58454504, -21286932, -6863358, 59119152, 21809308, -5005248, 38997228, +35128000, -44546864, 60990148, -36134096, 11318849, 12003360, -15629923, 12081206, 20322712, -11787538, +-21536040, 7605314, -11334419, 5551782, 5662378, -5652177, -16744467, 7337415, 6791954, -6667400, +7896298, 6296959, -13343927, 34656628, 4334696, 1141388, 1338419, -6503654, 5852967, 5043366, +2434173, -10720775, 6426345, 2003602, -4243428, -9346923, 21772262, -7567196, 17834314, 20053202, +-1340030, -6834367, 5837935, 5260261, 8275865, 24082418, 21020644, -17830556, 9169755, -6985765, +-390842, 10639171, -1634235, 49753440, 47438452, -40207336, 39534636, 36369784, -33879240, -51261508, +-75781480, 17819282, 114192976, 46966004, 369904, 23648090, -108848432, -44917304, -3697430, 16720308, +82184200, 80347560, 14024142, -30840550, -60226716, -35316444, 4271345, 26001196, 39391292, 63184876, +38280508, -50770272, -119998704, -97881768, -9435506, 109086264, 118790744, 74998720, 23090818, -25121264, +-48212080, -73109472, -41515152, -44451836, 87456808, 72645080, 46080704, 40652404, -61495880, -86425480, +-100117296, -89820648, 34839164, 121734408, 150086016, 50689204, -45168024, -106667664, -127728568, -34802120, +20842940, 13234942, 80325016, 31422518, -29996588, -17933100, -61378304, -13459891, -70204464, 30502320, +83800720, 156241776, -9223442, -83566104, -181222928, -7122667, -61089468, -6551973, 87278568, 17200808, +-7699266, -38856032, -81468552, -53637700, 39560408, 63340568, 21158082, -11132018, -27547384, -33413234, +32807108, 37284076, 23393614, 19929722, 9262634, 18573050, -1476932, 1687922, -17820894, -8492761, +2406256, 47040092, 41564008, -2229625, -17324288, -4689031, -41719164, -28373090, -704912, 15953119, +43882756, 33411624, 24173150, 2044404, -58228484, -52937620, -35339528, 13703093, 56965760, 109462608, +67546952, -50705312, -90574416, -80554792, -31936304, 2113661, 75537200, 94286344, 70966816, 12212740, +-55582784, -127587912, -79746808, 25726318, 79597552, 90094992, 26947698, -13459354, -34496640, -41760504, +707059, -10460930, 51341504, 30015378, -4581657, 10883447, 5512054, -36643588, -3876745, -3017215, +3937948, 1101659, 2872796, -13423383, -5411659, -4975720, -3429532, -6125697, 21844740, -7904888, +9348533, -16522739, -1724966, 6774774, -846109, -5041218, 37766184, 5206037, -21488796, -24919400, +5163088, 5204964, -14700599, 4031901, 18929532, 9844602, 17810692, -18331994, 5463736, -671626, +4217658, -12910135, 2369748, 14276471, 20161114, 5104032, -5358509, 5915781, 2199560, -4736275, +13712220, -20412906, 4510253, -33236068, -10499048, 13700409, -11374684, -13370233, 17956722, -11540577, +-31113280, -24021752, 21148956, -2673617, -4328790, 4865661, 10654203, 26914950, -17682918, -22899156, +849330, -3163244, 18112414, 112206, 10534481, 4857071, -1938641, 27958090, -36587216, -5366025, +-5288179, -21434034, 5338645, 11956652, 382789, -12779675, 5510443, -2907693, 3485903, -11055783, +7940321, -605054, 1161252, -1012539, -2860985, 14155675, -14428943, 1069984, -2604361, -5171678, +-4731980, 1614908, -6348499, 6464463, 8178692, -8735427, -2383707, -3373697, 7471096, 8428336, +-4461398, 10399190, 834297, -1561758, -7242389, 7479149, 2405719, -3047279, -11856794, 5436355, +-10782515, 6742562, -5929739, -5196911, 9426916, 9556839, -13385266, 1499481, -3320547, -12974022, +3927748, -7621420, 8190503, -7514582, -30088930, -33182918, -78932376, 22812718, 22565222, -1613834, +-66542464, -43021612, -6335614, -10923176, 44452912, 29982630, 14417668, -29465624, -12166032, -7817378, +27831924, 3045669, -7941932, -17301202, 11407970, 5056787, 13841606, -773631, -5666136, -7090991, +-15934866, -7968238, -9647033, 26579942, 14207752, 3114925, 3979287, -17530982, -947577, 2111513, +24271398, -1772748, 11308112, -9041980, -6297496, 4929012, -10016937, 6594923, 2895882, 7094212, +23676008, -2092723, 20775830, -294205, 13338558, -10344966, 867583, -15203110, -19666118, -20700132, +-17710834, 5812165, 3060701, 1504312, -26077430, 12861280, -22698366, -2579665, 1171452, -14231374, +-15402826, -8147553, 272194, -27115202, -18342732, 16818556, -8189966, 15657303, 2484102, -4364224, +-14660871, -16935056, -1107028, 23990614, 29743722, -7428683, -3054796, -11206643, -14919643, -10310069, +9478456, 5025112, 3642669, 9292162, -1847373, -6183679, 6442451, 3539053, 5361193, 8127689, +-4570919, 2729452, -908386, 173409, -6209986, 10744398, 3404835, 2438468, -3232500, 1543504, +-234613, 16757889, 2136746, 5016522, -9409200, 620086, -6092411, 10963978, 758599, 157840, +-3863860, 2538863, -1262720, 130997, 5255430, 491237, 6888054, -4690641, 2238752, 719407, +-8826158, -483184, 5049271, 1935420, -1815697, 17746804, -38152732, -94612224, -90687160, -13756780, +27435714, 91260536, 78864728, 74349640, 79859552, 44466332, 10760504, -40305584, -40502080, -84171696, +-65369404, -57303992, -36354212, -45721536, 62989452, 51831664, 68209984, 39351564, 55751360, -2004139, +14686104, -8937827, -21746494, -12420509, -26001732, -30228516, -30131344, -29702920, -35187056, -25738666, +-20921860, -2350421, 5542656, 49473728, 41502268, 21897890, 23503672, 32647658, 30276298, 14609331, +70395584, 9185861, 920197, 13238700, -26297548, -80736792, -23109608, -64712272, -69442104, -73332272, +-51901460, -46185392, 2305861, 38361576, 39095476, 47794396, 86872160, 62565864, 76235672, 74968120, +47801376, 51445120, 17547088, -18049064, -58700392, -76968496, -87997440, -57198228, -78978544, -66318592, +-75833552, -44202728, -5293011, 20817170, 61349312, 58597848, 59436980, 99037112, 68961072, 81874424, +50959252, 8522826, -9623948, -24745454, -40991704, -45844480, -48641580, -47334836, -54641648, -46769508, +-34274912, -20999168, -10922102, -8198556, 23685670, 22563074, 31714576, 51331840, 57765164, 36694052, +44125956, 27271432, -1708860, -11966316, -26683558, -33286534, -28613608, -24642374, -29909078, -10888816, +-7439420, 695785, 8391292, 9402220, 2312840, 1302449, 8213051, -1187022, -7259569, 6633577, +3852586, 4733591, 7246684, 2183454, 1877975, 4459250, 10094247, 8725226, 3910031, 852014, +-2333778, -8684424, -6696391, -7903814, -6986838, -2757906, -5435281, -4656282, -2718714, -2073396, +-3004867, -828929, 3099893, 3169686, 3795141, 6293738, 4003447, 2831457, 3544959, 927713, +641024, 338229, 5906, 26307, 64961, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -4422206, -7414188, 2582886, -1357747, 1876364, 2378875, 4445291, 7424925, -3573950, 2461553, -3045669, --2370822, 1486596, 9664, 614717, -5254893, -2555506, 1842541, 3695283, -501437, 3112778, --5634460, -4997732, 3134253, 2003602, 855772, 2280628, -1929514, 4025458, 4504347, 4374424, -6274411, -3491272, -2888366, 218506, 789737, -6030671, -389231, -528818, 1646046, 586800, --3777961, -934692, 5122822, -2747169, 996969, -3150359, 1498407, 1579474, 1017907, -4690105, -3772592, 339839, 843424, -651224, -1549410, -1948841, -3204583, 6790880, -1206886, -1258425, --1533303, 3012920, 695248, -6433324, 1624035, -2941516, -4420058, 2597382, -2735894, -6963753, -2767033, 1015760, 295816, -6417218, -7785165, -3181497, -3841848, 3600256, -1054415, -15032, --1767916, -2107755, -1758789, 48318, 3176128, 574452, -1430224, -120796, -1494112, -664646, -1403917, 424665, -1354525, -1825898, -639413, -751619, 691490, -461172, 255014, 252866, -754841, 194347, 1085553, -461172, 249645, -255014, 762357, -49392, 699006, 4347044, -517544, 375273, 3867618, -5771363, 966905, -4815732, -6096706, 1760400, 5720360, -3535295, -2716030, -2660195, -1285269, 1154809, 288300, -2828773, -8406862, -8347269, 150861, -2111513, --75162, 4370666, 701153, 5350456, 7226820, -3805341, 6241125, 783295, 6335077, 403727, -7517267, 960999, -4204773, -1152662, 424128, 3427921, -925565, -1125818, 747324, 2602213, --3122978, -185757, -963146, 2302639, 2801929, 158914, -2845416, -197569, -514322, 1648731, -2942590, 5274220, -1837172, 3424163, -1539746, -4581120, -4092567, -2763812, 2596308, 2820183, --1547262, 4563403, 151934, 1660542, 239444, 5548024, 3677566, 4089883, 1661616, 2411087, -1487669, 2237678, 4531728, -955093, -231391, 6403260, 1286880, 191126, 1333587, -2372433, -358093, 1894081, -141734, -5972152, 1876901, 642635, -957241, -2068564, 1384590, 415538, -3258807, -1195612, -590021, -1239635, -1010928, 830002, 238371, 1312113, 619012, 308701, --1174674, -926639, -548682, -572841, 514322, -1547799, 1371168, -552440, 406411, -369904, --553514, -856846, 529355, -689879, -523986, -1686312, 6424198, -6649683, -4496294, -3700114, --5393405, 1649268, 2261300, -4344360, 953483, 8794482, -6482180, 4439386, 7575249, 7494718, --4693863, -1313186, 3688840, 675921, 1112397, -3422552, 1809792, -11506217, 8958765, 14070313, -2452426, 4715337, -2338610, -227633, 7446937, -3973382, -9095130, -1539746, 89657, -60130, --7356205, 509491, 1773285, -8720394, -4128001, 4001836, 1322850, -3120831, -849867, 2982318, --4283156, 8968965, 2762201, 388695, -5820218, -597000, 3058554, -1986422, 146566, -2087354, --161598, -884763, -4672388, 265214, -4520453, 6729140, -6569153, -4365298, -1507534, -7834557, -5190468, -4225174, -10920491, -2021319, -4736275, 1307281, 4953171, -5101885, 586263, -3470871, -3504157, 470836, -3638911, 3062312, -3939022, -5167383, 5687611, -3723200, 1592359, 119722, -476205, 1984275, -1176284, -1769527, -1999307, -3154117, 1007170, -4449049, 209380, -915365, -1349694, -1336272, -151934, -11811, 75699, -2369748, 2064269, 84289, 354872, -1284732, --933619, -966905, -108448, 1398549, -5071283, 3238942, -146566, -993211, 3844533, -3637837, --12781286, -2495913, -784368, 5587753, 7914551, 7010461, 3373697, -2750927, -858993, -7881802, --6679748, 2308008, 8993125, -2573222, 9212705, 5859946, -5679558, 3055869, -870268, 3195456, --6347962, -4284230, 1051730, 4588099, -576063, 2735357, 3826279, -7181722, -1436667, -3313567, --9774809, 6081674, 974958, 2208687, 4246112, 7756174, 2711735, 363998, 6091874, -1422708, --3104188, 6256694, -3286724, 10574209, 4882304, 4204236, 230318, -3042984, -3689377, 5182415, -7056095, -5237713, 1284732, 6724845, -1182727, 2185065, 14873472, -4497368, -1777043, 2885681, --7437273, -304943, 1347546, -3325915, 3634079, -2410551, 2246805, 7372312, 273804, -1703491, --5006858, -418759, -6221797, 2632815, -2298881, -3071975, -1262184, 1178432, -1777580, -1804960, --1495722, 332323, 2315524, 1693828, 485868, -539018, -678068, -536334, -326954, -1043677, --1817845, -364535, -550293, 962073, 24159, 479426, -1837709, 777926, 1001264, -704912, --1606855, -615254, -1685775, -912144, -738734, 1249836, 159988, -281320, -107374, 283468, --2547453, -505732, 920734, -3192771, -18236432, -1417876, -321586, -3594351, -5611375, -1791538, -9885404, -6892886, -10351408, 3980898, -4167192, 1559073, 1917166, 6660421, -4434554, -1285269, -1358283, 6198712, -2806224, -3951370, -1144072, -3389266, 4576825, 8345122, 4223564, 147640, --623844, -4665945, -224412, 13088376, 2349884, -1541893, 15097884, -824634, 11243688, -3303904, -149250, 7666517, 2363843, 1963874, 2768107, 1408749, 4234838, 2510409, -7083475, 13355738, -8128226, 10981695, 7369627, 4893042, -7208029, 3293166, 3758633, 640487, -4397510, 12408161, -7520488, 11218455, 2041720, -2137820, -2685965, 8284455, -3939559, -8383240, 10020159, 3201898, --5413270, -3088082, 554051, -2474438, 1034550, -1072131, 1466195, -3370476, -886911, -7926362, -3136937, -899259, -147103, 3033858, -924492, -1411434, 4776004, -222801, 3724811, 4997195, -4085588, 2682207, 2640331, 1127429, 1569811, 115427, -954020, -842887, 2217277, -512175, --1253594, -1280437, 1089311, -1455994, -335544, -212064, 2750390, 1216013, 1990717, -1704565, -639413, -1347009, -437550, 1952063, -179315, -654983, -523449, -387621, -4587562, -609885, --11943767, -4680441, -13363791, -9135395, 1043140, -8655970, -6802692, 872415, -1475321, 9047349, --5923297, 10020696, 12272332, 1321239, -10329933, -7229504, 11027865, -5502927, -2951180, 6226092, --7985955, -14200772, 5770289, 12387223, -6285685, 3218541, -179315, 5444408, -14836965, 3042448, --5931350, 3672197, 350040, -6170258, 10429791, 4821101, 4433480, 13899588, 6492917, 2934000, -7881802, 1647120, 2585570, 4024921, 1367410, 708670, 2186675, 1966558, 15791521, 8931921, -12348, 13287018, 8320963, 9829033, 15291694, -7714298, -6462315, 13432510, -4610111, -435939, --7885560, -3278134, 4793721, 7164006, -5999533, -632971, 2054605, -1630477, 3720516, -6317360, --1161252, -7319161, 14416595, -4567161, 7889318, -2152316, -3804804, 10654203, 1888712, -3015604, -3471944, -1226213, 333934, -2909304, 4031364, -670015, 1470489, 4366908, 2486249, 1365263, -2442763, 273804, -357556, 1805497, 462783, -2841121, 656056, -525060, -1344862, 2743947, -20401, 1388348, 1108102, -503585, 527207, -1626182, 376883, -1476395, 150861, -545461, -1935420, 609349, 1664300, 544387, 4553739, -4858145, 1569274, 706522, 1555315, -6977711, -9082245, 5277978, 12338367, 2397666, -1668595, -13914620, -7441568, -5209259, 3556770, -7222525, --12054363, -3346317, 3090766, 1354525, -13462038, 10940892, 841277, -803696, -11467563, -6581501, -2705293, 1430761, -12741020, -3944928, 4656282, 534723, 1284732, 6550362, 7628399, 4478041, --1973538, 3868155, 1188632, -4547834, -9432285, 16273094, -4081293, -7888245, 153008, 4057670, -5248987, 12176769, 1993939, -191663, -4569845, -105764, 6733435, -820339, 8413841, 16165183, -1350767, -3464965, 483721, 13924284, 17365626, -8622147, 2418067, 2462627, 9385577, 5002027, -1649268, 2928094, -6924561, 4350265, 4471598, 4515085, -2997887, 298500, 3402151, 5216775, --739271, 1822140, 1185948, -5829881, 2823941, 325344, -5309117, -3802120, 5607617, -2473901, -3875671, -5587216, -4320200, -1870995, 1266479, -33823, 5055714, 2370822, 893890, 304943, -2519535, 2397666, 719944, -4221953, 169651, -1737851, 667867, -1292785, -1063004, 10737, --450435, -544387, -1478543, -4129074, -1187559, 523986, -2850248, -1731946, -1816234, 147103, --1819456, -2885144, -718333, 1477469, 2254858, -4488241, 6431177, -5662915, -10304700, 7203197, --801011, -2478733, 2764348, 6138045, -17314624, 1108102, 13344463, -1503775, 23974508, 11478837, --7265474, -5323075, -2200097, -6871948, -3027415, 10726144, -4067334, -3463354, 10752451, 8732742, -2915209, 5025112, 10053982, 6664179, 7536057, -5448166, -3706557, 9542344, -1818919, 8641474, -104153, -10233833, -6555731, 2820183, 8170102, -11135240, 748935, -5927592, 3180960, -6780143, -9548786, 9508521, -9192304, -946503, 2755759, -261993, -12447889, -5568425, 2200634, 8328479, -13700409, 4675609, -10050223, -2193118, -2400887, -1149441, 8640937, 1400159, 6936909, -10302016, -4702989, 741419, -8135205, 9744207, 4188667, -1276142, -2112587, 1711545, -301185, -8327405, -6364605, -1901060, 3821984, -6465000, -11425150, -6339372, 2785823, 5160403, 191126, 2863670, -10384694, 137976, -2568391, 6518150, -1938641, 6136972, 431644, 2013266, -5168457, 565862, -210990, 2830920, 3154654, 4356708, 2825015, -1036698, -1190780, -1984812, 5208185, -2374580, -2750927, 587337, 1691143, 2131915, 2953327, 1293859, -904628, 2615098, 1098975, 893353, --912144, 3508452, 1731946, 756451, -3374771, 1284732, -1276679, -11274, 2456721, 11126650, --13597866, -2118493, -4307316, 14050986, -6200322, 11586748, -3544422, 10820096, 14653355, -6418829, -4660577, -3660923, 8371428, -3107409, 6979859, 5801964, 5473936, -1187022, 5754720, -2822331, --7185481, -3425773, 8143795, -9408663, 1554241, 19327, 7261716, 14640470, -13290776, 523449, -13131863, -266288, 12011413, 1685775, 5310727, -1596117, -955630, 3279208, -18380850, 1868848, --383863, -7284265, 4937602, 3071439, 13441100, 6710350, -1270774, 25465398, 6391448, -13344463, -3601867, 1333587, 8934606, -5724655, 1762547, 7545184, 649614, 4612795, -1277216, -14585172, --14925548, 71941, -5007932, 12079059, -20305532, 26220776, -97711, 14614700, 16728361, 4045859, --4361540, -3295314, -7776575, -10341744, -833761, 3379066, -2577517, 5271536, -3449396, -8324721, --5223754, -4195110, 1556926, -1280974, 973347, 5629629, 2870649, 2680060, 2105608, -2321967, --2829310, 183610, -560493, 1622424, 432718, 661962, 1815697, 3266323, 1989644, -6477348, -1232119, -1217623, 4769561, 4768488, 2801929, -434329, -1335198, 1872606, 1534377, -2292439, --2374580, -598611, -1610076, 454730, -1723893, -3143379, 1294933, 5244155, -1311039, 2110977, --3983045, 516470, 2358474, 2401961, -79994, 1539209, 3419868, -24267638, -1764695, 8190503, -1307281, -9148817, -22539988, -64425, 2518998, -3999688, -991064, -6678674, 3435974, -5570036, -11534135, 4030290, -6951942, -8688719, -14832133, 11011222, -4764193, 699006, 14362908, 19758998, -12035035, -1898912, 992137, -13648332, -5856188, -5523328, 3606699, -19340238, 4996658, 5209796, -1063004, -9971303, 9479530, 14747844, -2425046, -316754, 1689533, -8649527, -9119826, 5170604, -3544422, 11141145, -12345347, 13304735, -7070053, 7307350, -11429982, -9055939, -4538170, -350577, --1379221, 4818954, -2486249, -19988240, -14972793, -4265977, 505732, -20042464, 254477, 9823127, --5311801, -2370285, 3007551, 8342974, -17602386, 8922795, -3111704, -2707440, -103079, 7119982, -8957154, -10627360, -5406290, -7167764, -3462281, -2632815, 5205501, 1663226, -6383395, -2930242, --4896800, 3319473, 11679090, 7629473, -68719, -412854, -6531572, 171799, -3991635, 5424007, --1003412, 9517111, 3202435, 3268470, -3446711, 119722, 114354, -7758859, 8195872, 528281, --1443109, 4185983, -1509144, -1385127, -384400, 540092, -6649683, 2835752, 4062502, 4204236, --684510, -1669132, 1468879, 2332704, -2371896, -1513439, 2371896, -5166846, 571231, -230318, -4768488, -472446, 21748640, 530965, -4409321, 16915728, -3692061, -6875169, -1815161, -1552094, -20980916, 23992224, -3116536, 5107790, 6120866, -3059627, -11382737, 5612449, 22313428, 17017734, -14557255, -5277978, 6315213, 11981885, -15535434, -11574937, 13590887, -6925635, -7595650, -519691, -16989280, -2553358, 15641197, 1029718, 14038101, -8392366, 19284404, 5865315, -5960341, -9826885, -3536906, -13904420, 1689533, -16499654, -5609228, -5917391, 9467719, -9446781, 15586436, -19053012, --32944010, 20601884, 9243306, -4050154, 197569, 22723062, 10695005, 1805497, -5938329, 4908611, --2619393, 272194, -14739254, -14981383, 8844411, -5031018, 4900021, 28209346, -7351911, 6066105, --18388902, 21795886, -7266548, -9740986, -4634270, -3051574, 9134322, -18480170, 15480136, -18114024, -13092134, -9329743, -12593918, 12593381, -511638, 4121021, -5084705, 7444252, -4054986, -5708549, --2513093, -8649527, 5986111, -294205, -5589900, -2404108, 2136746, 9200894, 1782411, 1299765, -2496450, -248571, -1535451, 4660040, -2594697, 2094870, 1989644, -2415382, -639413, -558346, -6655052, 5759015, -2090575, -3228742, -6883222, -159988, -1375463, -1027034, -1090385, 171799, -6381248, 1869921, -726386, 7967701, -24724516, -18378702, -17820356, 24875376, 831613, 10676215, -6359236, -21916144, -19164144, 12881681, -34190088, 9988483, 10149008, -2197950, -13606993, -12511240, -21293910, -11455215, -1510218, -3583077, -11045045, 16199006, 5152887, 14656039, 8517994, 10111964, --3212636, 16456167, -1521492, -10762114, -12680354, -2917357, 7134478, -9607305, 12771085, 8204998, --9641128, -34610456, -2915209, -2842732, -864899, 25149718, 562104, -19698330, -11696270, -12044699, -10318659, -7591355, -16413754, -18306762, -11398843, -8900783, -40820444, 980863, 5081483, 13410499, --21327734, 6983080, -17624398, -14408005, -4944044, 17065516, 4353486, 15840376, 29894046, 9004399, -6852084, 19508816, -15215995, -1935420, -7233262, -8335995, 15613817, 14457934, 22942104, 11289322, --21032992, -13993540, 16494822, -24823300, -27368606, -8591545, 19917374, 3170223, -4888747, 13602698, -11076184, -105227, 3148748, 11536282, -7559143, 6829535, -5575942, -1051730, -5810017, -1065689, -1501628, 8085276, -5143224, -6470905, -34360, 4568235, 1438814, 4155381, -664646, -6468221, --1570347, -4279935, 317291, -3573950, -725313, -494458, -7313256, 5928129, 883153, 6033892, -7546795, 10473278, -3948149, -5552319, -464930, 1023276, 12047383, -10572062, -22408992, 6523519, --35970, -154082, 1124208, 3447248, 5104569, 10237591, 3524021, 8659728, 4901095, 10207527, -26016764, 1122597, -33260764, -12023761, 8772471, 588947, -6704444, -21300354, -13930190, 4790499, -17740900, 7022809, -16443282, 9188546, 7350300, -18647138, -3310883, -23119808, 18595060, -9495099, --11937325, 17175038, -16159814, 4817880, 35544612, -3911642, 5987722, 10647761, 173946, 5367099, --20456930, 5255966, 3885872, 3569655, 46610596, 31621696, -3234647, -15963857, -10482405, 14789720, -17134772, -18377628, -10139344, -24737402, 39808980, 11120744, 4802847, -6174016, -4101694, -8629126, --4675609, 28669980, -7406134, 7897371, 28649042, 4968204, -7813620, -20924544, 753767, 8624294, --42232952, 9405978, 4849555, 29189672, 20030116, 15635292, 26114474, 14807973, -4926328, 2709051, -9242233, -2781528, 1473711, -1693291, 4323959, 2423972, 24415816, -568009, 10153303, -4140349, -9816148, -685584, 13034152, 2833605, 3791919, 11783780, -731755, 4948339, 8089034, 306016, -6584185, 9076877, 4181151, 7252589, 10683731, 6098317, -3675955, -673773, 2538863, 2648384, -326418, -4115653, 2318746, 2815888, 1479079, 5634460, -536334, 8795019, 4981089, -3504693, -9321153, -1173600, -5903970, -27122182, -3881040, 18710488, 10491531, -30383672, -40066676, 4626217, -27205396, 11018202, 16627429, -9429601, 12842489, 2173790, 344671, -14522895, -5201743, -22626962, -33643016, 11300596, -27312234, -18712636, 12226698, 1327145, 6738267, -8145406, 16779364, 9835475, -11548630, 22054658, 19501300, 4056060, 19064822, -9999758, 10940892, -12348, 13298829, 6156836, --3208878, -7976291, 9171903, -11864847, 31368294, -8380555, -5954436, 6491843, 15493558, 15399605, --10416906, 27096412, 26763552, 15646029, 6451578, 2316061, -8653822, -20288888, -34875672, -5585068, -12345347, -671626, 15113990, 16608639, 17663590, 6258304, 9814537, 57942332, -28506772, -12329240, -5662915, 11277510, -1540283, -45061724, 10515691, -6915434, 6680285, 8121783, 19918448, 4132296, -236223, -18035104, 18725520, -6615860, 2599529, 16634945, 7369627, -17464410, -3940633, -9747428, --3517578, -7444789, 1088237, 853625, 6935836, -1534914, 8488466, 8665097, 11052025, 62277, --285078, -6642704, -3267396, -8949101, -6372121, -2534031, 11726871, 4017942, -2113124, 1007170, --4924717, 1930051, 10231149, 11973832, -2609730, -10652056, -476741, 881005, 4796405, -2778844, -3215857, -4933307, 7656316, -14973330, 1216013, -4430796, -5708549, 239444, 2662880, -9554692, -4365835, -1613297, 4304631, -5071820, -8919573, 3413962, 15158013, 14920716, -8206072, -11167989, -3339337, -10730976, -34408056, 35601520, -10368588, 10020159, 3314641, 29863444, 23816668, 14972793, --14216879, -2338073, 20437066, 10849087, 24050744, 64064268, -3943854, -25232932, -6558952, 19161996, --2836826, -29806536, 45585708, 23622320, -16041703, -24953760, -3055332, 5609228, -7910256, 18107582, -15401753, 17767206, 34038688, 5705327, 9634149, 6089190, -13151190, -31654982, 18640158, -21538188, --16160888, 24999394, 13124883, 14104136, 7422777, 5155035, -1406602, -31259846, -27728846, 523449, -16626892, -20664698, 19606526, -9164923, -23157390, 7316477, 20369956, -3755949, 3943854, 20207284, -19937776, 20674362, 1551557, -12612171, 11810623, 49118856, 5951751, 19975892, 28087476, 1373853, --8867497, -24682104, -9953050, -38898980, -13311714, -9736154, -4771172, 8842801, 1539746, -1767916, --11152956, -7366406, -6466074, 9610526, -9976135, -1999844, -8798241, 2874944, -5578626, -9584756, -408022, -13795435, -4836670, 235149, -12433393, -2356863, -10829760, -6270653, 1225676, -19921132, --1903744, 934155, -198642, 9411884, -12656732, -4177930, 13619341, 264677, -5334350, -590558, --4554813, 2618320, -5821828, -4418448, 6788196, -467078, 478889, 18168248, 14977088, 530428, --11720966, -17381196, -30827128, 5687074, 19188304, 26189636, -21982716, -23448374, 29105382, 13157632, --985158, -2782065, -11857331, 5667746, -5447629, -12385075, 13426605, 16336445, 11349451, 1226213, --2210835, -8908299, 2092723, 6946036, 4260608, -10084583, -36003636, 8209830, -8077760, -10705743, -2152316, -4533338, 3172370, -35884452, 16937204, 13308493, -25798258, 18293340, 24246164, 20311438, --5272073, 3521336, -3084324, 13292387, -2833068, 64425, 64538328, -19200652, 5496485, -17127792, --9880572, 36504536, 13448079, 12557411, 23407034, -29477972, -24373940, 36703180, -23004918, 18799072, -23230942, 2343442, 6303938, 8920647, 41626288, -13965623, -15699179, -37936908, -8011188, -16263431, -13040594, -23692650, 40462352, 22069690, 24773372, 12258910, 21671868, 11416560, 38633232, 9599252, -18668076, 14261439, -18762564, -8932458, -7162932, 3486440, 2347200, 18974092, 8378408, 105764, --726923, 4421132, 1915019, -7213398, -14256070, -7577933, -10662793, 13729937, -4631049, -7647190, -4558034, -2894808, 16969416, 7878044, -2824478, 9543954, -10647761, 5302674, 8628589, -2949032, -16443819, 16729971, 11279121, -7689065, 13913010, 8012799, -13382044, -2502355, 1581085, -8091182, -1095217, 11978127, -13464722, -15654082, 7122667, 3232500, -1341640, -10349797, 26659398, -15407658, -14107894, 45291504, 22506166, 17154100, -25273198, 7159174, 25241522, -21509734, 35723928, 12826383, -19128710, 17126182, -10945187, 17740362, 15285789, 6456410, 35418448, 26855894, -1999307, -60508572, --7063611, 28168544, 27176406, 27933930, 6724845, 15611669, 1417339, 7882339, -1965484, -18705656, -38816304, -964757, 36988260, 16689169, 26706644, -37244344, 25351582, 12659953, 11439109, -9725417, -8845485, -6897181, 8447664, 37179920, 14865956, 48496088, 2462627, 10766409, 28381144, -5665062, -44572096, 21983254, 3981972, -29416768, -18337362, 16276852, 1957968, -4864588, 1072131, -4982162, -3595961, -21427054, 14460618, -22820772, -33939368, -12705587, -1792075, -11339251, -8659728, 28883118, --3325915, 26305600, -24898462, 28900298, 3999152, -31935230, 31765042, 26444114, -9774272, -4445291, -7681549, 13892609, 9040369, -1325534, -14381161, 9156333, -6135361, -922344, 18384070, -3730716, --2865280, -14766634, -3813394, 4081830, 2988760, -995359, 13858786, 12152073, -9460739, 3283503, --92342, 503048, 12759811, 3854733, -13623636, 9259413, -11633993, 5964099, -9385040, -3825742, --2884608, -2165201, 1748052, 2634426, 1811939, 711891, -2598455, 2297271, -6484864, 4558571, -5379447, -1146756, -5297306, 4006668, -1105417, 6811282, -3723737, -3313567, -9417253, -452045, --8351564, -27005144, -25817586, -10389526, -11183021, 20903606, -33804076, -42122356, -45798312, -55315956, -24714316, 27135066, -1580011, -4461398, -172872, -13169443, 3205119, 6861211, -11662984, 37642168, -35469452, 23162758, 25373594, -23382338, 15526307, 1262720, 18489834, -7307887, -9527311, -34564288, -30903900, -31236224, -37811280, -9958955, -7943542, 40552008, -22297860, 5428839, -21048024, -5913096, -39121784, 7230041, 12377022, 19343996, 35929012, 2183991, -4023848, -43921408, -8101919, -3546032, --1247688, 24023362, 12928925, 81713904, 4093641, -2552821, -27111444, -2205466, 32494648, 29781304, --2685428, -14391899, -40385576, 10066866, 25567404, -13118978, -29452202, -12499429, 25198574, -7713225, -18496814, -58531816, -32745368, -46790984, -12661564, 18780282, 9974525, -20383914, -19457812, -22903986, -9188546, 48209396, 14589467, -206695, -17107928, -1383516, -13327820, -3637837, 5698348, 5703180, --15346455, -6927782, -1379221, 10466835, -26081726, -17733384, -6099391, 12828530, -1794223, 16877074, -5386426, 2005750, -5903433, -2893197, -11750494, -2466922, -17701708, -3914326, 19414862, 7006166, -8831527, -13535589, -24476482, 12144020, 11470247, -7051800, -29528, -10052371, -1904281, 3102040, --1348083, 9204115, 5662915, 6041409, 11611444, 6512781, 9163850, 9984188, -2003065, 8033200, -4246649, -6693707, -16349330, -8483097, 39759048, 1304060, 231928, 70380552, 6968585, -52121040, --40023728, 49353468, 43810276, 2788508, -34715684, -43120396, -24729884, 8619462, 42618960, 38004556, -25460030, -15458124, 5045513, -15526307, 13952738, 32366874, 49885508, 54507428, -6759742, -28972776, --45889580, -68576672, -652298, 36761700, 148871088, -19289772, -7877507, -71757096, -29685204, 6231461, -17242684, 88737248, 63971392, 39658116, -44936096, -25307558, -43903692, -2469069, 74257304, 68743096, -83689584, -22934588, -82261512, -59792924, -83060376, 20948702, 76348952, 67188856, 123729416, -58929100, --71775880, -62857384, -10439992, 54813448, 72966128, 102040368, 46205260, -21308944, -39608188, 9501005, --2980171, 29111288, 81609744, -17832704, 50732692, -17988396, -46887084, 790811, 7368017, 44277356, -2136746, -4001299, 4242354, -11458973, -40550932, 17042968, -5562520, 13944685, -11448772, -33298344, --8070244, -7772817, 3794067, 22296786, 3120831, -6304475, 8552354, -8002061, -10386305, -1848983, -32360968, 8319889, 29717416, -2062658, 3407520, -8388071, 3884798, 3525095, 6016176, 23044648, -39699456, -1065152, -10701448, -36237712, -47964584, 2005213, 2913599, 58187144, 37473588, 6404333, --20088098, -81723024, -46030240, -6939594, 37085432, 72536632, 37641632, -21808770, -26973468, -84726816, --31462246, 40558448, 74592848, 60280404, 3972845, -38293928, -43384000, -4215511, -1481227, 35291208, --6411313, -36407900, 47585552, -11111080, 56196964, -51873540, 529892, -22701586, -53886272, 39304856, --28339268, 36381056, -28980828, -11208254, -2694018, 18702436, 4080756, -20687246, -11118060, -953483, -29036126, -27156542, 33321430, 23934778, -18354542, 4131222, -23017266, -23081692, 38814692, -38472708, --19502910, 25810606, 59354836, -475668, 7907572, -5504538, -26199838, -7330973, 24129126, -8460549, --39464844, 5519570, -8760123, -6693170, 11686606, -35873176, 17877802, -143345, 12189117, 27591944, --62658204, -46271292, -15521475, -1428614, 64121716, -34144992, 23107998, 50538880, -27960774, -16438450, --1958505, 27403502, 39758512, -21873194, 11345693, -8067023, 15615427, 62227632, -23324356, -70180304, -14715095, 32116692, 8143795, -37512244, 23180476, 9806484, 23270670, -7355669, -1275068, -26203596, --21026550, 15413564, 3697430, -27924266, 7977365, 19286550, -9581535, -143345, -31199180, 4540854, --7930657, -34049428, -1408749, 15236933, 12986907, 5499706, -1147293, 8444979, -23506356, -5738613, -8000987, -11272679, 17627620, -10873247, -4804458, -10278930, -229781, -10951093, 16841640, 3138011, --13793287, -11565810, -828392, -459562, 27940372, -9821516, 9715216, -5085778, -838056, 6196564, --12499965, -10752987, 1546725, -23837068, -6947110, 7046968, -20656646, 1009317, -4115653, -6983080, -4023848, 13344463, -366683, 2011655, -7471633, -4850092, -72426568, -22986128, 31092342, 42567956, -35347044, -36126580, 11518029, -100852808, -65582540, -55731496, -8877161, 47190416, 30370788, -2150168, --22175990, -27405650, 13359496, -16783122, -1716913, 36062692, 9830106, 1651952, -35752380, -17251810, --3644280, -16964584, 10921028, -3029026, 19378892, -5126581, -197032, -6396280, -1153199, -4664872, --20408074, -15497316, -34252900, -24235964, 17499844, 33480344, 36536212, 20279762, 31843962, -4886062, -27099634, -6368900, -12379169, -42811696, -1620276, -23665806, 18343806, 6970732, 54135380, -43717400, -15555298, 30292404, -16668768, -23250268, -13411572, -10860362, -11046656, 3885872, 38477000, 24656334, --10186052, -1476932, 27639188, -31959926, -35211752, 14529874, -40876276, -31563178, -27413702, 3389803, -13370770, 15856482, 47595216, 32245540, -5062156, 23992224, -13738527, 927176, 6036577, 17769354, -28936268, 31111670, 22038014, 18152680, 14748918, 1214402, -39808440, -11335492, -20498806, -5197984, -23431194, -1044214, 3657702, -8730595, -17646946, 1945083, -8651675, -7292318, -19222126, 8511551, -14670535, -6496675, 5748277, 12835510, 7236483, 8359080, 1628330, 8229158, -5557688, 5650030, --2531883, -10207527, 7938710, 9716290, -7833484, -11739219, 1205275, -7941395, -13472776, 10509785, -11528229, 4399121, 14805826, -1346472, -13288629, 22968412, -9435506, -86497960, -127776888, -156829664, --123946312, -184840896, -32807108, -67602248, 20294258, 38631620, 133545032, 77936480, 138346800, 140676816, -192649680, 140579104, 142914496, 105228848, 4383551, -30681098, -55955908, -34471408, -115299472, -78845936, --62824636, -64205468, -63529008, -63410360, -61546880, -66406636, -72856064, -54349588, -84688704, -69283728, --60394220, -27199492, -71184784, -22092774, 25999048, -52927420, -25636660, 14063334, 11456825, -44828184, -37118716, 47732120, 60490320, 82091320, 83453360, -6693707, 49570364, 80692768, 114590264, 90278064, -180574384, 169572832, 149770880, 121324240, 153663200, 76215272, 122317448, 148902224, 114664352, 73267848, -124370440, 40256728, 41703060, 76340896, 76609872, 54346368, 15683073, 44399224, -14942728, 2514703, -38873212, -44534516, -111682032, -166882560, -66003448, -228427296, -199794896, -175768320, -203199200, -226096736, --189498784, -164084400, -158253440, -109153376, -143444384, -73741368, -91112360, -96892848, -146812176, -118706992, --85592792, -70172248, -59370944, -55713780, -34911640, 13703630, -222265, -3491809, 41261212, 86177448, -71929968, 72772856, 116196584, 99258304, 103241888, 131006704, 123636536, 105097312, 100065760, 119936960, -102216464, 98993088, 105182136, 109018616, 92835184, 81045496, 74702368, 69687992, 91281480, 71452152, -53732188, 56017112, 42037528, 24381456, -14480482, -30367030, -39531416, -71105864, -60648696, -63018444, --74770552, -79284024, -72722920, -47602732, -53134652, -48323752, -48862768, -25378962, -27830314, -33794952, --22845468, -7496329, -8087961, -15794742, -9655623, 993748, -5212480, -7736310, -5793374, -299037, --398895, -436476, 399432, 703838, 124554, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +7414188, 2582886, -1357747, 1876364, 2378875, 4445291, 7424925, -3573950, 2461553, -3045669, +-2370822, 1486596, 9664, 614717, -5254893, -2555506, 1842541, 3695283, -501437, 3112778, +-5634460, -4997732, 3134253, 2003602, 855772, 2280628, -1929514, 4025458, 4504347, 4374424, +6274411, -3491272, -2888366, 218506, 789737, -6030671, -389231, -528818, 1646046, 586800, +-3777961, -934692, 5122822, -2747169, 996969, -3150359, 1498407, 1579474, 1017907, -4690105, +3772592, 339839, 843424, -651224, -1549410, -1948841, -3204583, 6790880, -1206886, -1258425, +-1533303, 3012920, 695248, -6433324, 1624035, -2941516, -4420058, 2597382, -2735894, -6963753, +2767033, 1015760, 295816, -6417218, -7785165, -3181497, -3841848, 3600256, -1054415, -15032, +-1767916, -2107755, -1758789, 48318, 3176128, 574452, -1430224, -120796, -1494112, -664646, +1403917, 424665, -1354525, -1825898, -639413, -751619, 691490, -461172, 255014, 252866, +754841, 194347, 1085553, -461172, 249645, -255014, 762357, -49392, 699006, 4347044, +517544, 375273, 3867618, -5771363, 966905, -4815732, -6096706, 1760400, 5720360, -3535295, +2716030, -2660195, -1285269, 1154809, 288300, -2828773, -8406862, -8347269, 150861, -2111513, +-75162, 4370666, 701153, 5350456, 7226820, -3805341, 6241125, 783295, 6335077, 403727, +7517267, 960999, -4204773, -1152662, 424128, 3427921, -925565, -1125818, 747324, 2602213, +-3122978, -185757, -963146, 2302639, 2801929, 158914, -2845416, -197569, -514322, 1648731, +2942590, 5274220, -1837172, 3424163, -1539746, -4581120, -4092567, -2763812, 2596308, 2820183, +-1547262, 4563403, 151934, 1660542, 239444, 5548024, 3677566, 4089883, 1661616, 2411087, +1487669, 2237678, 4531728, -955093, -231391, 6403260, 1286880, 191126, 1333587, -2372433, +358093, 1894081, -141734, -5972152, 1876901, 642635, -957241, -2068564, 1384590, 415538, +3258807, -1195612, -590021, -1239635, -1010928, 830002, 238371, 1312113, 619012, 308701, +-1174674, -926639, -548682, -572841, 514322, -1547799, 1371168, -552440, 406411, -369904, +-553514, -856846, 529355, -689879, -523986, -1686312, 6424198, -6649683, -4496294, -3700114, +-5393405, 1649268, 2261300, -4344360, 953483, 8794482, -6482180, 4439386, 7575249, 7494718, +-4693863, -1313186, 3688840, 675921, 1112397, -3422552, 1809792, -11506217, 8958765, 14070313, +2452426, 4715337, -2338610, -227633, 7446937, -3973382, -9095130, -1539746, 89657, -60130, +-7356205, 509491, 1773285, -8720394, -4128001, 4001836, 1322850, -3120831, -849867, 2982318, +-4283156, 8968965, 2762201, 388695, -5820218, -597000, 3058554, -1986422, 146566, -2087354, +-161598, -884763, -4672388, 265214, -4520453, 6729140, -6569153, -4365298, -1507534, -7834557, +5190468, -4225174, -10920491, -2021319, -4736275, 1307281, 4953171, -5101885, 586263, -3470871, +3504157, 470836, -3638911, 3062312, -3939022, -5167383, 5687611, -3723200, 1592359, 119722, +476205, 1984275, -1176284, -1769527, -1999307, -3154117, 1007170, -4449049, 209380, -915365, +1349694, -1336272, -151934, -11811, 75699, -2369748, 2064269, 84289, 354872, -1284732, +-933619, -966905, -108448, 1398549, -5071283, 3238942, -146566, -993211, 3844533, -3637837, +-12781286, -2495913, -784368, 5587753, 7914551, 7010461, 3373697, -2750927, -858993, -7881802, +-6679748, 2308008, 8993125, -2573222, 9212705, 5859946, -5679558, 3055869, -870268, 3195456, +-6347962, -4284230, 1051730, 4588099, -576063, 2735357, 3826279, -7181722, -1436667, -3313567, +-9774809, 6081674, 974958, 2208687, 4246112, 7756174, 2711735, 363998, 6091874, -1422708, +-3104188, 6256694, -3286724, 10574209, 4882304, 4204236, 230318, -3042984, -3689377, 5182415, +7056095, -5237713, 1284732, 6724845, -1182727, 2185065, 14873472, -4497368, -1777043, 2885681, +-7437273, -304943, 1347546, -3325915, 3634079, -2410551, 2246805, 7372312, 273804, -1703491, +-5006858, -418759, -6221797, 2632815, -2298881, -3071975, -1262184, 1178432, -1777580, -1804960, +-1495722, 332323, 2315524, 1693828, 485868, -539018, -678068, -536334, -326954, -1043677, +-1817845, -364535, -550293, 962073, 24159, 479426, -1837709, 777926, 1001264, -704912, +-1606855, -615254, -1685775, -912144, -738734, 1249836, 159988, -281320, -107374, 283468, +-2547453, -505732, 920734, -3192771, -18236432, -1417876, -321586, -3594351, -5611375, -1791538, +9885404, -6892886, -10351408, 3980898, -4167192, 1559073, 1917166, 6660421, -4434554, -1285269, +1358283, 6198712, -2806224, -3951370, -1144072, -3389266, 4576825, 8345122, 4223564, 147640, +-623844, -4665945, -224412, 13088376, 2349884, -1541893, 15097884, -824634, 11243688, -3303904, +149250, 7666517, 2363843, 1963874, 2768107, 1408749, 4234838, 2510409, -7083475, 13355738, +8128226, 10981695, 7369627, 4893042, -7208029, 3293166, 3758633, 640487, -4397510, 12408161, +7520488, 11218455, 2041720, -2137820, -2685965, 8284455, -3939559, -8383240, 10020159, 3201898, +-5413270, -3088082, 554051, -2474438, 1034550, -1072131, 1466195, -3370476, -886911, -7926362, +3136937, -899259, -147103, 3033858, -924492, -1411434, 4776004, -222801, 3724811, 4997195, +4085588, 2682207, 2640331, 1127429, 1569811, 115427, -954020, -842887, 2217277, -512175, +-1253594, -1280437, 1089311, -1455994, -335544, -212064, 2750390, 1216013, 1990717, -1704565, +639413, -1347009, -437550, 1952063, -179315, -654983, -523449, -387621, -4587562, -609885, +-11943767, -4680441, -13363791, -9135395, 1043140, -8655970, -6802692, 872415, -1475321, 9047349, +-5923297, 10020696, 12272332, 1321239, -10329933, -7229504, 11027865, -5502927, -2951180, 6226092, +-7985955, -14200772, 5770289, 12387223, -6285685, 3218541, -179315, 5444408, -14836965, 3042448, +-5931350, 3672197, 350040, -6170258, 10429791, 4821101, 4433480, 13899588, 6492917, 2934000, +7881802, 1647120, 2585570, 4024921, 1367410, 708670, 2186675, 1966558, 15791521, 8931921, +12348, 13287018, 8320963, 9829033, 15291694, -7714298, -6462315, 13432510, -4610111, -435939, +-7885560, -3278134, 4793721, 7164006, -5999533, -632971, 2054605, -1630477, 3720516, -6317360, +-1161252, -7319161, 14416595, -4567161, 7889318, -2152316, -3804804, 10654203, 1888712, -3015604, +3471944, -1226213, 333934, -2909304, 4031364, -670015, 1470489, 4366908, 2486249, 1365263, +2442763, 273804, -357556, 1805497, 462783, -2841121, 656056, -525060, -1344862, 2743947, +20401, 1388348, 1108102, -503585, 527207, -1626182, 376883, -1476395, 150861, -545461, +1935420, 609349, 1664300, 544387, 4553739, -4858145, 1569274, 706522, 1555315, -6977711, +9082245, 5277978, 12338367, 2397666, -1668595, -13914620, -7441568, -5209259, 3556770, -7222525, +-12054363, -3346317, 3090766, 1354525, -13462038, 10940892, 841277, -803696, -11467563, -6581501, +2705293, 1430761, -12741020, -3944928, 4656282, 534723, 1284732, 6550362, 7628399, 4478041, +-1973538, 3868155, 1188632, -4547834, -9432285, 16273094, -4081293, -7888245, 153008, 4057670, +5248987, 12176769, 1993939, -191663, -4569845, -105764, 6733435, -820339, 8413841, 16165183, +1350767, -3464965, 483721, 13924284, 17365626, -8622147, 2418067, 2462627, 9385577, 5002027, +1649268, 2928094, -6924561, 4350265, 4471598, 4515085, -2997887, 298500, 3402151, 5216775, +-739271, 1822140, 1185948, -5829881, 2823941, 325344, -5309117, -3802120, 5607617, -2473901, +3875671, -5587216, -4320200, -1870995, 1266479, -33823, 5055714, 2370822, 893890, 304943, +2519535, 2397666, 719944, -4221953, 169651, -1737851, 667867, -1292785, -1063004, 10737, +-450435, -544387, -1478543, -4129074, -1187559, 523986, -2850248, -1731946, -1816234, 147103, +-1819456, -2885144, -718333, 1477469, 2254858, -4488241, 6431177, -5662915, -10304700, 7203197, +-801011, -2478733, 2764348, 6138045, -17314624, 1108102, 13344463, -1503775, 23974508, 11478837, +-7265474, -5323075, -2200097, -6871948, -3027415, 10726144, -4067334, -3463354, 10752451, 8732742, +2915209, 5025112, 10053982, 6664179, 7536057, -5448166, -3706557, 9542344, -1818919, 8641474, +104153, -10233833, -6555731, 2820183, 8170102, -11135240, 748935, -5927592, 3180960, -6780143, +9548786, 9508521, -9192304, -946503, 2755759, -261993, -12447889, -5568425, 2200634, 8328479, +13700409, 4675609, -10050223, -2193118, -2400887, -1149441, 8640937, 1400159, 6936909, -10302016, +4702989, 741419, -8135205, 9744207, 4188667, -1276142, -2112587, 1711545, -301185, -8327405, +6364605, -1901060, 3821984, -6465000, -11425150, -6339372, 2785823, 5160403, 191126, 2863670, +10384694, 137976, -2568391, 6518150, -1938641, 6136972, 431644, 2013266, -5168457, 565862, +210990, 2830920, 3154654, 4356708, 2825015, -1036698, -1190780, -1984812, 5208185, -2374580, +2750927, 587337, 1691143, 2131915, 2953327, 1293859, -904628, 2615098, 1098975, 893353, +-912144, 3508452, 1731946, 756451, -3374771, 1284732, -1276679, -11274, 2456721, 11126650, +-13597866, -2118493, -4307316, 14050986, -6200322, 11586748, -3544422, 10820096, 14653355, -6418829, +4660577, -3660923, 8371428, -3107409, 6979859, 5801964, 5473936, -1187022, 5754720, -2822331, +-7185481, -3425773, 8143795, -9408663, 1554241, 19327, 7261716, 14640470, -13290776, 523449, +13131863, -266288, 12011413, 1685775, 5310727, -1596117, -955630, 3279208, -18380850, 1868848, +-383863, -7284265, 4937602, 3071439, 13441100, 6710350, -1270774, 25465398, 6391448, -13344463, +3601867, 1333587, 8934606, -5724655, 1762547, 7545184, 649614, 4612795, -1277216, -14585172, +-14925548, 71941, -5007932, 12079059, -20305532, 26220776, -97711, 14614700, 16728361, 4045859, +-4361540, -3295314, -7776575, -10341744, -833761, 3379066, -2577517, 5271536, -3449396, -8324721, +-5223754, -4195110, 1556926, -1280974, 973347, 5629629, 2870649, 2680060, 2105608, -2321967, +-2829310, 183610, -560493, 1622424, 432718, 661962, 1815697, 3266323, 1989644, -6477348, +1232119, -1217623, 4769561, 4768488, 2801929, -434329, -1335198, 1872606, 1534377, -2292439, +-2374580, -598611, -1610076, 454730, -1723893, -3143379, 1294933, 5244155, -1311039, 2110977, +-3983045, 516470, 2358474, 2401961, -79994, 1539209, 3419868, -24267638, -1764695, 8190503, +1307281, -9148817, -22539988, -64425, 2518998, -3999688, -991064, -6678674, 3435974, -5570036, +11534135, 4030290, -6951942, -8688719, -14832133, 11011222, -4764193, 699006, 14362908, 19758998, +12035035, -1898912, 992137, -13648332, -5856188, -5523328, 3606699, -19340238, 4996658, 5209796, +1063004, -9971303, 9479530, 14747844, -2425046, -316754, 1689533, -8649527, -9119826, 5170604, +3544422, 11141145, -12345347, 13304735, -7070053, 7307350, -11429982, -9055939, -4538170, -350577, +-1379221, 4818954, -2486249, -19988240, -14972793, -4265977, 505732, -20042464, 254477, 9823127, +-5311801, -2370285, 3007551, 8342974, -17602386, 8922795, -3111704, -2707440, -103079, 7119982, +8957154, -10627360, -5406290, -7167764, -3462281, -2632815, 5205501, 1663226, -6383395, -2930242, +-4896800, 3319473, 11679090, 7629473, -68719, -412854, -6531572, 171799, -3991635, 5424007, +-1003412, 9517111, 3202435, 3268470, -3446711, 119722, 114354, -7758859, 8195872, 528281, +-1443109, 4185983, -1509144, -1385127, -384400, 540092, -6649683, 2835752, 4062502, 4204236, +-684510, -1669132, 1468879, 2332704, -2371896, -1513439, 2371896, -5166846, 571231, -230318, +4768488, -472446, 21748640, 530965, -4409321, 16915728, -3692061, -6875169, -1815161, -1552094, +20980916, 23992224, -3116536, 5107790, 6120866, -3059627, -11382737, 5612449, 22313428, 17017734, +14557255, -5277978, 6315213, 11981885, -15535434, -11574937, 13590887, -6925635, -7595650, -519691, +16989280, -2553358, 15641197, 1029718, 14038101, -8392366, 19284404, 5865315, -5960341, -9826885, +3536906, -13904420, 1689533, -16499654, -5609228, -5917391, 9467719, -9446781, 15586436, -19053012, +-32944010, 20601884, 9243306, -4050154, 197569, 22723062, 10695005, 1805497, -5938329, 4908611, +-2619393, 272194, -14739254, -14981383, 8844411, -5031018, 4900021, 28209346, -7351911, 6066105, +-18388902, 21795886, -7266548, -9740986, -4634270, -3051574, 9134322, -18480170, 15480136, -18114024, +13092134, -9329743, -12593918, 12593381, -511638, 4121021, -5084705, 7444252, -4054986, -5708549, +-2513093, -8649527, 5986111, -294205, -5589900, -2404108, 2136746, 9200894, 1782411, 1299765, +2496450, -248571, -1535451, 4660040, -2594697, 2094870, 1989644, -2415382, -639413, -558346, +6655052, 5759015, -2090575, -3228742, -6883222, -159988, -1375463, -1027034, -1090385, 171799, +6381248, 1869921, -726386, 7967701, -24724516, -18378702, -17820356, 24875376, 831613, 10676215, +6359236, -21916144, -19164144, 12881681, -34190088, 9988483, 10149008, -2197950, -13606993, -12511240, +21293910, -11455215, -1510218, -3583077, -11045045, 16199006, 5152887, 14656039, 8517994, 10111964, +-3212636, 16456167, -1521492, -10762114, -12680354, -2917357, 7134478, -9607305, 12771085, 8204998, +-9641128, -34610456, -2915209, -2842732, -864899, 25149718, 562104, -19698330, -11696270, -12044699, +10318659, -7591355, -16413754, -18306762, -11398843, -8900783, -40820444, 980863, 5081483, 13410499, +-21327734, 6983080, -17624398, -14408005, -4944044, 17065516, 4353486, 15840376, 29894046, 9004399, +6852084, 19508816, -15215995, -1935420, -7233262, -8335995, 15613817, 14457934, 22942104, 11289322, +-21032992, -13993540, 16494822, -24823300, -27368606, -8591545, 19917374, 3170223, -4888747, 13602698, +11076184, -105227, 3148748, 11536282, -7559143, 6829535, -5575942, -1051730, -5810017, -1065689, +1501628, 8085276, -5143224, -6470905, -34360, 4568235, 1438814, 4155381, -664646, -6468221, +-1570347, -4279935, 317291, -3573950, -725313, -494458, -7313256, 5928129, 883153, 6033892, +7546795, 10473278, -3948149, -5552319, -464930, 1023276, 12047383, -10572062, -22408992, 6523519, +-35970, -154082, 1124208, 3447248, 5104569, 10237591, 3524021, 8659728, 4901095, 10207527, +26016764, 1122597, -33260764, -12023761, 8772471, 588947, -6704444, -21300354, -13930190, 4790499, +17740900, 7022809, -16443282, 9188546, 7350300, -18647138, -3310883, -23119808, 18595060, -9495099, +-11937325, 17175038, -16159814, 4817880, 35544612, -3911642, 5987722, 10647761, 173946, 5367099, +-20456930, 5255966, 3885872, 3569655, 46610596, 31621696, -3234647, -15963857, -10482405, 14789720, +17134772, -18377628, -10139344, -24737402, 39808980, 11120744, 4802847, -6174016, -4101694, -8629126, +-4675609, 28669980, -7406134, 7897371, 28649042, 4968204, -7813620, -20924544, 753767, 8624294, +-42232952, 9405978, 4849555, 29189672, 20030116, 15635292, 26114474, 14807973, -4926328, 2709051, +9242233, -2781528, 1473711, -1693291, 4323959, 2423972, 24415816, -568009, 10153303, -4140349, +9816148, -685584, 13034152, 2833605, 3791919, 11783780, -731755, 4948339, 8089034, 306016, +6584185, 9076877, 4181151, 7252589, 10683731, 6098317, -3675955, -673773, 2538863, 2648384, +326418, -4115653, 2318746, 2815888, 1479079, 5634460, -536334, 8795019, 4981089, -3504693, +9321153, -1173600, -5903970, -27122182, -3881040, 18710488, 10491531, -30383672, -40066676, 4626217, +27205396, 11018202, 16627429, -9429601, 12842489, 2173790, 344671, -14522895, -5201743, -22626962, +33643016, 11300596, -27312234, -18712636, 12226698, 1327145, 6738267, -8145406, 16779364, 9835475, +11548630, 22054658, 19501300, 4056060, 19064822, -9999758, 10940892, -12348, 13298829, 6156836, +-3208878, -7976291, 9171903, -11864847, 31368294, -8380555, -5954436, 6491843, 15493558, 15399605, +-10416906, 27096412, 26763552, 15646029, 6451578, 2316061, -8653822, -20288888, -34875672, -5585068, +12345347, -671626, 15113990, 16608639, 17663590, 6258304, 9814537, 57942332, -28506772, -12329240, +5662915, 11277510, -1540283, -45061724, 10515691, -6915434, 6680285, 8121783, 19918448, 4132296, +236223, -18035104, 18725520, -6615860, 2599529, 16634945, 7369627, -17464410, -3940633, -9747428, +-3517578, -7444789, 1088237, 853625, 6935836, -1534914, 8488466, 8665097, 11052025, 62277, +-285078, -6642704, -3267396, -8949101, -6372121, -2534031, 11726871, 4017942, -2113124, 1007170, +-4924717, 1930051, 10231149, 11973832, -2609730, -10652056, -476741, 881005, 4796405, -2778844, +3215857, -4933307, 7656316, -14973330, 1216013, -4430796, -5708549, 239444, 2662880, -9554692, +4365835, -1613297, 4304631, -5071820, -8919573, 3413962, 15158013, 14920716, -8206072, -11167989, +3339337, -10730976, -34408056, 35601520, -10368588, 10020159, 3314641, 29863444, 23816668, 14972793, +-14216879, -2338073, 20437066, 10849087, 24050744, 64064268, -3943854, -25232932, -6558952, 19161996, +-2836826, -29806536, 45585708, 23622320, -16041703, -24953760, -3055332, 5609228, -7910256, 18107582, +15401753, 17767206, 34038688, 5705327, 9634149, 6089190, -13151190, -31654982, 18640158, -21538188, +-16160888, 24999394, 13124883, 14104136, 7422777, 5155035, -1406602, -31259846, -27728846, 523449, +16626892, -20664698, 19606526, -9164923, -23157390, 7316477, 20369956, -3755949, 3943854, 20207284, +19937776, 20674362, 1551557, -12612171, 11810623, 49118856, 5951751, 19975892, 28087476, 1373853, +-8867497, -24682104, -9953050, -38898980, -13311714, -9736154, -4771172, 8842801, 1539746, -1767916, +-11152956, -7366406, -6466074, 9610526, -9976135, -1999844, -8798241, 2874944, -5578626, -9584756, +408022, -13795435, -4836670, 235149, -12433393, -2356863, -10829760, -6270653, 1225676, -19921132, +-1903744, 934155, -198642, 9411884, -12656732, -4177930, 13619341, 264677, -5334350, -590558, +-4554813, 2618320, -5821828, -4418448, 6788196, -467078, 478889, 18168248, 14977088, 530428, +-11720966, -17381196, -30827128, 5687074, 19188304, 26189636, -21982716, -23448374, 29105382, 13157632, +-985158, -2782065, -11857331, 5667746, -5447629, -12385075, 13426605, 16336445, 11349451, 1226213, +-2210835, -8908299, 2092723, 6946036, 4260608, -10084583, -36003636, 8209830, -8077760, -10705743, +2152316, -4533338, 3172370, -35884452, 16937204, 13308493, -25798258, 18293340, 24246164, 20311438, +-5272073, 3521336, -3084324, 13292387, -2833068, 64425, 64538328, -19200652, 5496485, -17127792, +-9880572, 36504536, 13448079, 12557411, 23407034, -29477972, -24373940, 36703180, -23004918, 18799072, +23230942, 2343442, 6303938, 8920647, 41626288, -13965623, -15699179, -37936908, -8011188, -16263431, +13040594, -23692650, 40462352, 22069690, 24773372, 12258910, 21671868, 11416560, 38633232, 9599252, +18668076, 14261439, -18762564, -8932458, -7162932, 3486440, 2347200, 18974092, 8378408, 105764, +-726923, 4421132, 1915019, -7213398, -14256070, -7577933, -10662793, 13729937, -4631049, -7647190, +4558034, -2894808, 16969416, 7878044, -2824478, 9543954, -10647761, 5302674, 8628589, -2949032, +16443819, 16729971, 11279121, -7689065, 13913010, 8012799, -13382044, -2502355, 1581085, -8091182, +1095217, 11978127, -13464722, -15654082, 7122667, 3232500, -1341640, -10349797, 26659398, -15407658, +14107894, 45291504, 22506166, 17154100, -25273198, 7159174, 25241522, -21509734, 35723928, 12826383, +19128710, 17126182, -10945187, 17740362, 15285789, 6456410, 35418448, 26855894, -1999307, -60508572, +-7063611, 28168544, 27176406, 27933930, 6724845, 15611669, 1417339, 7882339, -1965484, -18705656, +38816304, -964757, 36988260, 16689169, 26706644, -37244344, 25351582, 12659953, 11439109, -9725417, +8845485, -6897181, 8447664, 37179920, 14865956, 48496088, 2462627, 10766409, 28381144, -5665062, +44572096, 21983254, 3981972, -29416768, -18337362, 16276852, 1957968, -4864588, 1072131, -4982162, +3595961, -21427054, 14460618, -22820772, -33939368, -12705587, -1792075, -11339251, -8659728, 28883118, +-3325915, 26305600, -24898462, 28900298, 3999152, -31935230, 31765042, 26444114, -9774272, -4445291, +7681549, 13892609, 9040369, -1325534, -14381161, 9156333, -6135361, -922344, 18384070, -3730716, +-2865280, -14766634, -3813394, 4081830, 2988760, -995359, 13858786, 12152073, -9460739, 3283503, +-92342, 503048, 12759811, 3854733, -13623636, 9259413, -11633993, 5964099, -9385040, -3825742, +-2884608, -2165201, 1748052, 2634426, 1811939, 711891, -2598455, 2297271, -6484864, 4558571, +5379447, -1146756, -5297306, 4006668, -1105417, 6811282, -3723737, -3313567, -9417253, -452045, +-8351564, -27005144, -25817586, -10389526, -11183021, 20903606, -33804076, -42122356, -45798312, -55315956, +24714316, 27135066, -1580011, -4461398, -172872, -13169443, 3205119, 6861211, -11662984, 37642168, +35469452, 23162758, 25373594, -23382338, 15526307, 1262720, 18489834, -7307887, -9527311, -34564288, +30903900, -31236224, -37811280, -9958955, -7943542, 40552008, -22297860, 5428839, -21048024, -5913096, +39121784, 7230041, 12377022, 19343996, 35929012, 2183991, -4023848, -43921408, -8101919, -3546032, +-1247688, 24023362, 12928925, 81713904, 4093641, -2552821, -27111444, -2205466, 32494648, 29781304, +-2685428, -14391899, -40385576, 10066866, 25567404, -13118978, -29452202, -12499429, 25198574, -7713225, +18496814, -58531816, -32745368, -46790984, -12661564, 18780282, 9974525, -20383914, -19457812, -22903986, +9188546, 48209396, 14589467, -206695, -17107928, -1383516, -13327820, -3637837, 5698348, 5703180, +-15346455, -6927782, -1379221, 10466835, -26081726, -17733384, -6099391, 12828530, -1794223, 16877074, +5386426, 2005750, -5903433, -2893197, -11750494, -2466922, -17701708, -3914326, 19414862, 7006166, +8831527, -13535589, -24476482, 12144020, 11470247, -7051800, -29528, -10052371, -1904281, 3102040, +-1348083, 9204115, 5662915, 6041409, 11611444, 6512781, 9163850, 9984188, -2003065, 8033200, +4246649, -6693707, -16349330, -8483097, 39759048, 1304060, 231928, 70380552, 6968585, -52121040, +-40023728, 49353468, 43810276, 2788508, -34715684, -43120396, -24729884, 8619462, 42618960, 38004556, +25460030, -15458124, 5045513, -15526307, 13952738, 32366874, 49885508, 54507428, -6759742, -28972776, +-45889580, -68576672, -652298, 36761700, 148871088, -19289772, -7877507, -71757096, -29685204, 6231461, +17242684, 88737248, 63971392, 39658116, -44936096, -25307558, -43903692, -2469069, 74257304, 68743096, +83689584, -22934588, -82261512, -59792924, -83060376, 20948702, 76348952, 67188856, 123729416, -58929100, +-71775880, -62857384, -10439992, 54813448, 72966128, 102040368, 46205260, -21308944, -39608188, 9501005, +-2980171, 29111288, 81609744, -17832704, 50732692, -17988396, -46887084, 790811, 7368017, 44277356, +2136746, -4001299, 4242354, -11458973, -40550932, 17042968, -5562520, 13944685, -11448772, -33298344, +-8070244, -7772817, 3794067, 22296786, 3120831, -6304475, 8552354, -8002061, -10386305, -1848983, +32360968, 8319889, 29717416, -2062658, 3407520, -8388071, 3884798, 3525095, 6016176, 23044648, +39699456, -1065152, -10701448, -36237712, -47964584, 2005213, 2913599, 58187144, 37473588, 6404333, +-20088098, -81723024, -46030240, -6939594, 37085432, 72536632, 37641632, -21808770, -26973468, -84726816, +-31462246, 40558448, 74592848, 60280404, 3972845, -38293928, -43384000, -4215511, -1481227, 35291208, +-6411313, -36407900, 47585552, -11111080, 56196964, -51873540, 529892, -22701586, -53886272, 39304856, +-28339268, 36381056, -28980828, -11208254, -2694018, 18702436, 4080756, -20687246, -11118060, -953483, +29036126, -27156542, 33321430, 23934778, -18354542, 4131222, -23017266, -23081692, 38814692, -38472708, +-19502910, 25810606, 59354836, -475668, 7907572, -5504538, -26199838, -7330973, 24129126, -8460549, +-39464844, 5519570, -8760123, -6693170, 11686606, -35873176, 17877802, -143345, 12189117, 27591944, +-62658204, -46271292, -15521475, -1428614, 64121716, -34144992, 23107998, 50538880, -27960774, -16438450, +-1958505, 27403502, 39758512, -21873194, 11345693, -8067023, 15615427, 62227632, -23324356, -70180304, +14715095, 32116692, 8143795, -37512244, 23180476, 9806484, 23270670, -7355669, -1275068, -26203596, +-21026550, 15413564, 3697430, -27924266, 7977365, 19286550, -9581535, -143345, -31199180, 4540854, +-7930657, -34049428, -1408749, 15236933, 12986907, 5499706, -1147293, 8444979, -23506356, -5738613, +8000987, -11272679, 17627620, -10873247, -4804458, -10278930, -229781, -10951093, 16841640, 3138011, +-13793287, -11565810, -828392, -459562, 27940372, -9821516, 9715216, -5085778, -838056, 6196564, +-12499965, -10752987, 1546725, -23837068, -6947110, 7046968, -20656646, 1009317, -4115653, -6983080, +4023848, 13344463, -366683, 2011655, -7471633, -4850092, -72426568, -22986128, 31092342, 42567956, +35347044, -36126580, 11518029, -100852808, -65582540, -55731496, -8877161, 47190416, 30370788, -2150168, +-22175990, -27405650, 13359496, -16783122, -1716913, 36062692, 9830106, 1651952, -35752380, -17251810, +-3644280, -16964584, 10921028, -3029026, 19378892, -5126581, -197032, -6396280, -1153199, -4664872, +-20408074, -15497316, -34252900, -24235964, 17499844, 33480344, 36536212, 20279762, 31843962, -4886062, +27099634, -6368900, -12379169, -42811696, -1620276, -23665806, 18343806, 6970732, 54135380, -43717400, +15555298, 30292404, -16668768, -23250268, -13411572, -10860362, -11046656, 3885872, 38477000, 24656334, +-10186052, -1476932, 27639188, -31959926, -35211752, 14529874, -40876276, -31563178, -27413702, 3389803, +13370770, 15856482, 47595216, 32245540, -5062156, 23992224, -13738527, 927176, 6036577, 17769354, +28936268, 31111670, 22038014, 18152680, 14748918, 1214402, -39808440, -11335492, -20498806, -5197984, +23431194, -1044214, 3657702, -8730595, -17646946, 1945083, -8651675, -7292318, -19222126, 8511551, +14670535, -6496675, 5748277, 12835510, 7236483, 8359080, 1628330, 8229158, -5557688, 5650030, +-2531883, -10207527, 7938710, 9716290, -7833484, -11739219, 1205275, -7941395, -13472776, 10509785, +11528229, 4399121, 14805826, -1346472, -13288629, 22968412, -9435506, -86497960, -127776888, -156829664, +-123946312, -184840896, -32807108, -67602248, 20294258, 38631620, 133545032, 77936480, 138346800, 140676816, +192649680, 140579104, 142914496, 105228848, 4383551, -30681098, -55955908, -34471408, -115299472, -78845936, +-62824636, -64205468, -63529008, -63410360, -61546880, -66406636, -72856064, -54349588, -84688704, -69283728, +-60394220, -27199492, -71184784, -22092774, 25999048, -52927420, -25636660, 14063334, 11456825, -44828184, +37118716, 47732120, 60490320, 82091320, 83453360, -6693707, 49570364, 80692768, 114590264, 90278064, +180574384, 169572832, 149770880, 121324240, 153663200, 76215272, 122317448, 148902224, 114664352, 73267848, +124370440, 40256728, 41703060, 76340896, 76609872, 54346368, 15683073, 44399224, -14942728, 2514703, +38873212, -44534516, -111682032, -166882560, -66003448, -228427296, -199794896, -175768320, -203199200, -226096736, +-189498784, -164084400, -158253440, -109153376, -143444384, -73741368, -91112360, -96892848, -146812176, -118706992, +-85592792, -70172248, -59370944, -55713780, -34911640, 13703630, -222265, -3491809, 41261212, 86177448, +71929968, 72772856, 116196584, 99258304, 103241888, 131006704, 123636536, 105097312, 100065760, 119936960, +102216464, 98993088, 105182136, 109018616, 92835184, 81045496, 74702368, 69687992, 91281480, 71452152, +53732188, 56017112, 42037528, 24381456, -14480482, -30367030, -39531416, -71105864, -60648696, -63018444, +-74770552, -79284024, -72722920, -47602732, -53134652, -48323752, -48862768, -25378962, -27830314, -33794952, +-22845468, -7496329, -8087961, -15794742, -9655623, 993748, -5212480, -7736310, -5793374, -299037, +-398895, -436476, 399432, 703838, 124554, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, }; const Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819] ={ { { 5241471, -2590939, -3527242, 5304822, -3109020, -1074816, 81068, -1825361, -2042794, -4123706, 986769, -6240588, 641024, 1112933, 2654827, 637266, -2216203, -696322, -1316944, -1335735, 3787624, -1032940, 498216, -1298154, 700080, -164283, -1438277, -2364916, 3671123, 2816425, 525060, --788663, 4257387, -5930813, -2205466, 2515240, -2453500, 5091684, 522912, 3591667, 463856, -409096, 2330557, -2049236, -849867, -77309, -56908, -1600949, -1274532, 2243047, -112206, --5470178, 5125507, -727460, 872415, -4621922, 2193118, -2050310, 1816771, 132607, -158914, --1740536, -178241, -2675765, 2754685, -5195837, -586800, 3788161, -3008088, 1408749, 5661304, -1717450, 567473, -2823404, 298500, 1505386, -1069447, 1887638, -1191853, -825171, -1598802, -1708323, -1864553, -2979097, 943282, 494995, -749472, 3644280, -928250, -790811, -893890, -1209570, 1323924, -95563, 141734, 658741, -734439, 652835, -1412507, -580894, -237834, --294205, -765578, -26307, -51003, -156229, -453656, -33286, -768799, 404264, -391916, -878858, -584116, 654983, 883153, 10931766, 2019708, -1530082, 3341485, -1651415, -1366873, --1750199, -711354, -4104378, 5811091, 3357054, 2508798, 2700998, 2569464, -2692945, -3628711, -4891431, -1051193, -3795141, -7225209, 1183264, -2138894, 2267743, 45634, -613107, -1617055, -2274185, -2676838, -1352915, 3571265, 6783901, 1767379, 3086471, 588411, 3411815, -706522, -3629784, 2290291, 410169, 2030446, 180389, 596464, 186831, 4958540, 1050120, 1304596, --1120450, 734439, -351650, -693637, 4023311, 4605816, -1656247, -1695438, 928250, 4238596, --6899328, -361851, -1874216, -5106716, -2078764, 710280, -2177549, 2269890, 1838783, 151934, --3114388, 1449015, -664109, -2978560, 3820374, -5273683, -2493766, -5624797, -2784750, -799401, -836445, 5674189, -2454037, -1479616, 1753420, -896038, -1350767, 2687039, -446140, -111669, --1228898, -1903744, -2361158, -630823, 2003602, 797253, 973347, 929324, 710280, 70330, --336618, -147103, 158914, 1414118, 687732, 744103, -485868, 115427, 484794, 399969, --1074, 90194, 3221, -108985, -196495, -991064, -761820, -515396, 545998, 457414, --223338, 3299072, 1460826, -6663105, -619549, 981400, 4744328, -1432909, -8250096, 6648610, --7794829, 408559, -3396246, -2710124, -8265665, -5507759, -3214783, -2093797, 3424163, 1148904, --5435281, 766652, -2898566, 36507, -173946, 2240362, 477815, -2386391, 408559, 577136, -1358820, -1688996, -1143535, -510564, -2677375, -4103305, 5568425, 2565706, 773631, -772020, -4747550, 4078608, -4640176, 1297080, 467615, -898185, -2694018, 606664, -4794257, 1072668, --893353, -3945464, 4882304, 70867, -354335, 6070937, -5261872, 4772246, 1790465, -724239, --3892851, 1124208, -542777, -4153234, -3426310, 16106, -1487669, -1874216, -5697274, 248571, -1243930, 2664490, -1637993, 2476586, 781147, -1030255, -775242, -3399467, 2943663, 578210, -450435, -5636608, 2967823, -514322, 421981, -2923799, 112743, -5181341, 649614, 1079647, -718333, -471910, 530965, -128312, 61740, -927176, 306553, -297427, 1160178, 618475, -497142, 1017370, 41876, 326418, 1080184, 600222, -702227, -330176, 1699733, -625455, -359704, -609885, 653372, -1954747, -448824, -622770, 817118, -383326, -12273406, -11628624, -4508642, 7691213, 4661650, -10475425, 7460895, -2536715, -950262, 656056, -4846871, -3686156, -8801999, -126702, -10737, 664646, -205622, 2868501, -4372277, 2653753, -2314451, 2378338, -4031901, -2673617, -719944, 2330020, -667331, 4196183, -1304596, 1821603, 368293, -431107, -354872, -3582540, -4975183, 4697084, 617402, -908386, 42950, -4669703, -5806259, -164819, -113817, 3022583, -5397700, -4605816, -980863, -9597641, 3726421, -759136, 1958505, -740345, --2309082, 1464584, 12293807, 6820408, 3568581, -3687230, 4845797, -58519, -6313065, 15032, --6589554, 5596880, 772020, 658204, -3754338, 31675, 3832185, 1399623, 766115, 476205, -428423, 4111894, 2870112, 523986, 2796024, 1657321, 2232846, 6019934, 2500745, 2958696, --2793876, 2258079, 1687385, -727997, 4748623, 1434519, -14496, -434865, 1417339, 2517925, -308164, -40265, -938987, 598611, 2083059, 1141388, -476205, 195421, -1713692, 481036, -429497, -774705, 164819, -118112, -34360, 1154809, -227096, 1205275, 1671279, 590558, --984621, -1903744, 308701, -1205275, 909459, 808528, -1203128, 477815, -17632988, -1342177, --4241817, -616865, -2947421, -10002979, -426276, -2690797, -4124242, -9377524, -1156957, 6657736, --4653597, 4379256, -776315, 6174553, -2093260, 5016522, -1654636, -4968741, -1334124, 533113, --2180233, -4467840, -3590593, -4392141, 140660, -4007741, 1459215, 471910, 399432, 1894618, --3015604, -4037806, 5822902, -532576, 1725503, 59056, -4574677, -2902324, -3230352, 155693, --2319819, 4059281, 4125853, 680215, -5603859, -1837709, 10302016, 2561948, -4361003, -3469260, --2209224, -3821447, -2021319, 8048232, 4896263, -5846524, 3573413, 4746476, 7007776, -1810866, -2847027, -432718, 59593, -2840584, -5839545, -1058710, 4304094, 440771, 8338679, 5916318, -393526, 1934883, 7033009, -5605469, -2570001, -1655173, -3453154, 2477659, 1088237, 1135482, --3026878, 2052994, -2199560, 2275796, -4303021, -202400, -398895, -1689533, -105764, -370441, -2112587, 576599, 473520, -1845225, -1247688, -595927, -1737851, -75162, -2506650, -1459752, -101469, -195958, 1561758, -1066763, 427349, -516470, 849867, 613107, 2160906, -1786706, -22600654, 15170361, -4670777, -851477, 58519, -615254, -2582349, 3156801, 7739531, 6532109, -3394635, -11855720, -5266167, 1524713, 691490, 5038534, -8921721, 1804423, 12104292, 8145406, --1386201, 2902324, -1059783, -4085588, -5575942, 311385, -4750771, -2774012, 1395328, 3757560, --3481071, -6489696, -3081102, 1115618, 5963025, 8322036, -1581085, -8801462, -1859184, -3147674, --8827768, -533113, -264141, -4239670, 1463510, 2377801, 5164162, -7408819, 3029026, 3818226, -835908, -7165079, -5318244, 2437931, 316217, 1857037, -778463, -703838, -245887, -3973919, -1959579, 2070174, -2770791, 4968204, 5883569, 8038568, 1932735, 598074, 7579007, 12347494, -1974611, 1685775, 2107218, 7259032, 824634, 4293357, 12196633, 3613678, 2248416, 331786, --2302103, -10427644, 1395328, -285078, -1692217, -2001455, 1282585, -1453846, 2576444, 1137630, --1378685, -768262, -352724, 2093260, 1338419, -590558, -405874, 1421097, 3097745, 12885, --777389, 1071058, 118112, -1458678, -2881923, 2079838, -2713883, 1642288, 1145683, 2000381, --136365, -349503, 41339, 643171, -3785477, 94489, 551366, -374736, 11893838, 263067, -2478733, 2893197, 5735929, -2236067, 3652870, -3090229, -1971390, -9797894, 3910568, 6696928, --6062347, 5083631, -2508798, -8584029, 8943196, 5311801, -1592896, 5370857, 10473278, 7349226, --5401995, -3004330, 5279589, 1683627, -1192390, 4080756, 3730716, 5455682, 344671, -2365990, --4670240, -8278013, -272194, -6868190, 847719, -2225867, 3846143, -5458367, -12592307, 2787434, --3123515, 5829881, 1465121, 474057, -3485366, -7400229, -6225018, -569083, -637266, -5575405, -7878044, 10212358, 10581189, 4297652, -7577396, -646393, 10025527, 985695, -1729261, 4689031, --1312113, -2506114, -9518184, 5264556, 2757369, 13815299, 6376416, -9350681, 3146601, 3543885, --992674, -151398, 3347927, -2259690, 767725, -3995930, -9870909, 8942659, 1632088, 5339181, -2576444, -4631586, 7552700, -1654636, 1800128, 429497, -1670205, 310848, 231391, 623307, -3951907, 1331440, 754841, 363998, -1349694, -1565516, -2063732, -1196685, 1363115, -630286, --103079, -763967, 1249299, -1131724, -603980, 144955, -150324, 555661, -2175938, 2556043, --1064078, 2252710, 736050, -1136556, -1435056, 3169686, -2870112, 2550674, -695248, -3663607, --6111202, -1648731, -1560147, -10549513, 529355, 1295470, 5281736, -1994476, -4544613, 1894081, -578210, 2497524, 85362, 5732708, 2305324, 3959960, 679679, -441308, 3411278, 1995012, --10383083, -3208878, -14845018, 674310, -2762738, 1717450, 2639794, 200790, 7105487, 1808181, -10142565, 1247688, -12039330, 247497, -4838281, -1991254, -562104, -1804960, -608812, -9549860, -2090039, -4596152, 11518565, -11942693, 6640557, -2592550, -10192494, -1905892, -7162932, -1540820, --2172180, -10853382, 3129421, 3330210, -1975148, -1792075, -679142, 3847217, -8610336, 224412, -8102456, 1500017, 11266236, 18379238, 7606924, -16633871, -22192096, 10779294, 4842039, 16593606, --3419331, 7966628, 1717987, 7912404, 11086384, 14262513, -7559680, 4119948, 10625212, -8676371, -1635846, -1107028, -1072131, 807991, 7593502, -1144609, 2608119, -4896263, 1796907, -3772592, --3970161, -1751273, -3312494, 561030, -1944010, -5591511, -185220, 3729105, 2335389, -1029718, --1014686, -820339, 104690, 1743220, 1842541, -1434519, -2160906, -953483, 3245922, -773631, -3146064, 509491, 485331, -776315, 783832, 940598, 291521, 879931, 180926, -2633352, --2551748, -1660005, 858993, 2695629, -3740380, -2490007, -1157494, 1584843, -1739999, -20310900, -15164993, 2818036, -2702608, -270046, -9225590, -7517267, 7904888, -2098629, -2604361, 8250096, --6133214, -6544994, 344671, 8207146, 3456912, -2598992, 221728, -4636417, -651224, 686658, -4361003, 238908, -10411538, -10283225, 2302639, -1335735, 2469069, -984084, 4130685, 8078297, -14947560, -183073, 9263708, -2232309, 2598992, 6456410, -6253473, 12277701, -1783485, -7539278, --10759430, -1992328, -8932458, -11169599, -3138011, 5236102, -3503083, -8660802, 4324495, 6281390, -9684078, 12618077, -10271951, 3970161, -2887292, -9347996, 3498251, -10455561, -1969243, -17114908, -6833830, -5053566, 2516314, -3019362, 2681133, -18402324, -18449568, -11100343, -4350802, 10306848, --9936944, 19492710, -6866579, 2020245, -1825898, 3711389, -1788317, -13635447, 1974074, 1702955, -3735011, 3290482, 1597728, 5425081, -3063386, -4604205, 8590, 326418, -4596152, 2198487, --5912023, 3459059, 1972464, 2828773, -876173, 132607, -1811403, -4432943, -3323231, -1741609, --2066416, 3166465, -2050310, -5375152, 1900523, 2498060, -1021129, 3883724, -319975, -955630, --26307, 1035624, -1610613, -1415192, 1985349, 2872260, 2027761, 1082869, -4014184, -2698850, --870805, -3007551, 1180579, 479963, -37581, -2675228, 17060146, 1104880, 6374805, 4625143, -1704028, 10109816, 1275605, -13904957, 6644315, 2114198, 6338835, -532039, -10480794, 14948097, -7918846, 6200859, -1513976, -4399121, 1799591, -979789, -8341900, 5433671, 3606162, -4475356, -5849746, 9549323, 132607, 3659849, 9283035, -10134512, 2334315, -3345780, 4095251, -19153944, -5754720, 9371082, -3365107, 2571075, 9155797, 5069135, 14496, 3172370, -9777493, 2586107, --5813238, 536871, 2652679, 1631551, -4545686, 18552112, -3464965, -3392487, -4464619, -15987479, --6691022, -9754944, -11591043, -2094870, 15691663, 17512730, -1887101, 5484137, 6787659, -14432701, --4882841, 11922829, 9571335, -5667210, -4268661, -14212047, -4850629, -5309117, -7103339, -7968775, -1951526, -14500346, 2200634, 13828184, 18960134, 6012418, -5850819, -281320, 9955197, -3444564, --7132867, 786516, -1104880, -2927020, -4862977, 801011, -699543, 2388002, 2812130, 1879585, --1881733, 1003949, 1391569, 1386201, -500901, -2680597, -6362994, 1869385, -616865, -2381023, -4410932, 1580011, 2367064, -2484102, 3705483, -2669859, -2389613, -3020436, 2881386, 750009, -2059437, 4741644, -655519, -2250563, -1542430, 2443837, 774705, -70867, -144955, 770410, -392453, -134755, -1206349, 2483028, 2870112, 3998078, -1569811, -5404143, 3377455, 912681, --7196218, -10644003, -11464341, -4558571, -11208254, -4636954, -4545686, 204548, -10661183, 2415382, -4490925, 528818, -12167642, 3821447, -15094663, 4705674, 8438537, 281857, 13112535, 442382, --3885335, -2343979, 8851391, -3128347, 12179454, 4384625, -4188667, -4110284, 2164664, -6138582, --3324305, 525597, 11528766, -314069, 6109054, 3533684, 1075889, 8150774, -3584687, -7315940, -3317862, -5213017, -2420214, -14366666, 8184060, -4987531, -4230006, -2835752, -15892453, 19161996, -4992363, -2173254, 8352638, 2818036, 4093104, -8337606, -12636868, -14332843, -6915971, 861678, --14530411, 5553393, 10633265, -16250009, -5913096, 6118181, -7469485, 4068408, 18249316, 701690, --2879776, -4712116, 4174171, -9763534, 6536940, 3617973, -8853001, 3054796, 6410776, -3471944, --10493679, -8901857, -4655745, -202937, 2966212, 2603824, 2052994, -1700270, -2567317, -1170916, -2409477, 270583, -1416266, -5825587, -7042136, -1799054, 568009, -4936528, -6020471, -4061965, --2484102, -2174327, -5270462, -4457103, -2403571, -3168075, -6749004, 1350767, 6494528, -484258, --519691, -2405182, -1857573, 2305861, -2324651, 659278, -5300527, 373125, -1476932, -2717641, -74088, -2535105, 1764695, 2695092, -2176475, 3984119, -2566780, -848256, -2655364, -15032, -521839, 11679090, 28790240, 30438970, 9095130, 18931678, -12979928, -12918188, -3114925, -1808718, -1015223, 4394826, 9601936, 17538498, 5632313, 16244103, 1703491, 5008469, 2317672, -4318590, -7272990, -53687, 2847027, 1388885, -8297877, -874026, -4493610, -8750459, -5634460, 290984, -795106, -11649025, -4955856, 15022722, 10617696, 7885560, 12495134, -7645042, -15032, -21456582, -906238, 18720152, -3722126, -3529926, 2129230, -1823751, 14422500, -983548, -2525441, 11370926, --13466333, -21478058, -8833137, 2113124, -11749957, 8790187, 11943767, -16869558, -6565395, 328565, --427349, -24283208, -15694884, 8036421, 3273839, -1635309, 7766912, -10481331, -6665789, -14911590, -3481608, 5062693, 1141388, 1257889, -10156524, -16451335, 13669807, -22442814, 6504728, -8081518, -21521008, 2478196, 8903467, -5938329, -8665633, 6517613, 2803003, 9943386, -9356586, -1421634, -6453725, -182536, -5238250, -4517232, -5152350, 743566, 4931696, 5827197, -6349573, -2323577, --1138166, -8012262, -3070365, 1787243, -1034013, 1009854, -4467840, -6987375, -1161252, 479426, -5574868, 2065342, -3654480, 4706211, 627065, 2548526, -8147553, 1953136, -4916664, 4122095, -581431, 4350265, 6321118, 2319819, -4651987, -8703751, 2704756, 3367254, -28179818, -20266340, -14038101, -2923262, 25526064, -6219650, 21014738, -16902844, 508954, 7558606, -1674500, 914291, -2468533, -1309428, -12687870, 4458713, 4773856, 5561446, 6323266, -3895535, 10429254, -9469866, --6998113, -5410585, 14669461, -8090645, -2728915, 1321776, -306016, -7610145, 6541235, -8492224, --10116259, -19063212, 1739999, 3500935, -12950937, -6037114, 6238440, -2616172, 3333968, 1040993, -15060303, 1053341, 11334956, 5060009, 488016, 9088151, 2063732, 3151432, -17082158, 17598092, -6231461, 13789529, -8376797, 3665218, -9168145, 14305462, 10849624, 17452062, 2782065, -4562866, --12680891, -782221, 2236604, -10786810, 15333033, 2480344, 2384781, 16519518, 3694746, -4939213, --6592775, -527744, 9815611, 11857868, -3852586, 14785962, -17678622, -18510236, -8105677, 4319127, --5646809, 8091719, -2014340, 4351876, 14154065, -614180, 7025493, -5876589, -5389647, 6207302, --545461, 9946071, -3068754, -44023, -3048353, -6110128, 1242319, -3585761, -1436130, 4114042, -1389422, -5549098, -5109401, 3007551, 7512972, 7826504, -790811, 6417218, 6930467, -9691594, -4532264, 9226663, 7226283, 4112968, -7265474, -8760660, -9178882, -9208410, -9184788, 808528, --3209414, -1245004, 1034550, -6718940, 4796405, 4399121, -3484829, 5228049, 1837172, 2499134, --6438693, 12986907, -30627948, -1392106, 15961172, -10194105, -3400540, 11767674, -12746926, -25892748, -5160403, 4414690, 4027069, -3362960, -15305116, 3886409, 4372277, 1177895, 8527121, -27428198, -12621835, -6350109, 6583111, -15613817, 12757663, -19762756, -12610024, 7720204, -5151814, -2266669, --15010911, 11864310, 15604153, 1611, 1778653, -7114077, 23392002, 5839545, 6416145, -4186519, --20146080, -4286378, 11215233, -1970853, 16758962, 206158, -5986111, 4099010, -1097364, 10546829, --19912542, -2336462, -15251429, 16658568, -6091338, 5643587, -378494, -500901, -18024368, -6267968, -16007880, 5182952, 1523103, -4691715, 573915, 2140504, -23107998, -23926190, 25708600, -11245835, --27679990, 11433203, 13256953, -22252226, -29153164, -20301774, -19493782, 3622268, 7918846, -2310156, --18724446, -466541, -9957345, -4601521, -13530758, -608812, 1520955, 1534377, -2579665, 13111461, --6876243, 5261335, -5810017, -121333, 3712999, -3117610, -336618, -7471096, 10285373, -2170032, -3728569, -5416491, -7999377, -1494649, 4155381, 4749160, 1620813, -7759396, 4930086, -920734, --6197638, 6491306, -9482751, -1697586, -5776731, 9974525, -4048544, -10541997, 4938139, -4020626, --4406637, -14074608, -498753, 3483219, 12288438, 5194763, -6823630, -3355443, 1473174, -1637456, --3486440, 2510945, -249108, -2444373, -2380486, -635118, 12252468, -17054242, -9112847, -17820356, --1372242, 3329674, -23332946, 3503083, -11282879, 32523640, 1976759, -29795262, -6533182, 14025216, -9002251, 6691022, 15119895, 14651744, -21047488, -5731097, -7987029, 19674708, -6767258, 23018878, -223875, -13775571, -10473815, -21155936, -23645942, 1105417, 3041374, -4227859, -12057047, -5569499, -1873680, 3460670, 8470749, -12024298, 6206765, -14084808, -15899969, 2819646, -3177202, -4649839, --16589311, -16339666, -7421167, -5287642, 23190140, 1768453, 7982197, 12520367, -109522, 28449864, -11964705, -9959492, 1779190, 14468671, -5499706, 18412524, -4638565, 1985886, 1599339, -25863756, --25785374, 3478387, 18543522, 10201, -5379984, -28896004, 2142652, 9356586, 6429566, -10172630, --7658464, -6059125, 3795141, -12707734, 30592516, 16687022, 18879602, 3293166, -21068962, 7381975, -10064719, 29761440, 7264401, 2687039, 12420509, 4777078, -4611185, -121333, 9589051, -1258425, -1573032, 2604898, -7344931, -5765457, 9332427, -142271, -6980933, 9097814, -5581847, -2583423, --4205310, -4779225, 8749385, -5850819, -2135673, 4074313, -8792872, 3424700, -526134, -5599564, -11432129, -4415227, 300111, -14602352, 8973260, -4738423, -3404835, -9557376, -12712566, 1660005, --4952634, 8757438, -6442, 5034776, 3788161, -190589, -5130876, -245887, -14172855, -12931610, -27304180, -8470749, -10105521, -1454920, -7519414, -18606872, 404264, 12843563, -31894964, -569620, -8284455, 10157598, -10873247, 7203197, -18260054, 1372779, -4708895, 5680631, -16354699, 10146323, --27851790, 4525285, 768799, 15737297, 14846628, 7341710, -10401874, 11549167, -3391414, 12904229, --14104136, 2176475, 16517370, 13036836, -7755101, 2632815, 414464, -3721052, 8011725, -3178276, --9618579, -10783052, 7638063, -19429896, 12787728, 2916820, -20767778, 19488950, 18720688, 17542258, -6351720, -9236327, 22656490, 2640331, 9730785, -14003741, -12085501, -13430900, 4132296, 5077188, -8110509, -18810884, 1805497, 13661217, -35938676, 1240709, -11812771, 22405234, 14506252, 11191074, --3195993, 14805826, -14107357, -867047, -9830106, -21735218, -928787, -20030116, -16667157, 9600863, -26521960, -25094958, -5945846, -4708895, 26623428, -6744173, 11628624, -7800735, -4707821, -1186485, -9396315, -5742908, -2359011, 594853, 6387690, 4551592, 3339874, -3736622, 934692, 2593624, -13159243, -10640781, 10972031, -2597382, 8012262, -188979, 2093260, 2597382, 5021891, -7125888, --1619740, -1560147, -8644695, -7901666, -7679939, 5054640, 4187056, -1803886, -3486977, -4668093, --6078990, -3973919, 427886, -2928631, -140660, 7689065, -266825, -14817637, 6746320, -8787503, --1385664, 23739894, 5152350, 12020540, -34206192, 15855946, -19119584, 25897042, -2547989, 10069014, -19678466, -21219822, 37845640, 27086748, 20503638, -9324374, 5580237, 25873420, -6427419, -8377871, --5965710, -1417876, -19495394, 5128191, -10331544, -23809688, 23084376, 7543037, 6412923, 2813741, -5426155, 8831527, 24299314, 5011153, -14992120, -1367410, -15560130, 3018825, 2368675, -27627378, --1064078, 14911590, 1202591, -2059437, -8295730, 29190208, 6147172, 12378096, 6561637, -15901043, --11179263, -8734353, 18312130, 10645613, -3526168, 10943040, -1505386, -20042464, 19469624, 2253784, -22301080, 2350958, 2404645, 335544, -29317446, 3907347, 906238, 3150896, 18430778, -7347079, -28933584, -43888124, -7647190, 32536524, -13093745, 10686416, -14776835, -23419382, -18641232, 13405667, --12699145, 12489228, -20035486, -4438849, 3532074, -5089536, -7792145, -2676302, -2234994, 8673150, -20421496, 2013803, 12178380, -4065187, -1876364, 14659797, -2003602, -4358855, 4246112, -7532299, -6731288, 12742631, -8448738, -1458678, -3194382, 2216203, 2583423, 5968394, 23075786, -4306242, -8242042, 265214, 5681705, 8176544, 4360466, 1136019, 12937515, 13637595, -3658775, -2093797, -5893232, 2835752, 5132486, -17904108, -1262720, 16694538, -3563212, 3337190, 6835441, -1105954, -17394080, 6135361, -35447440, -42407972, -3748970, -19875498, 2690260, 12077985, -16974248, 4957466, --25926034, 11282342, -14280766, -70875552, -4566087, 43247636, -18641768, -8007967, 43447352, -10188199, -2341294, 52064132, -12458090, 11520713, 4866735, -7591355, 41918344, -33741800, -4359392, -908386, --5939940, -6777996, -6911676, -822486, 13652627, -7665980, -22874458, 278636, 456877, 6781217, -8339216, 1537061, 18824842, -695248, 8662949, -5111548, -22695144, 15849503, -2786360, -23335094, -897111, 13510893, 41291280, 20922934, 34712464, 767725, 8548059, 16608639, 3917010, -1984812, -32451700, -1667521, -12639552, 38031400, 6641093, 6760279, 278099, -5311801, 21709986, 41876, --12617540, -14201309, -2943126, -2768643, 32870996, -22238804, 2888366, 4285304, -5832029, 38649336, -333934, -24629490, 4156992, 12671227, -18121004, -807454, 18494130, 15312632, -9309342, 1532767, --10521596, 8973797, -2820720, 1294396, -10351945, 9722195, 148176, -977105, -15052250, 6322729, -5179194, -9743670, 804770, 3658775, -5046587, -3257733, 11686606, 1917166, 6536940, -4179003, -3461207, 20290500, -18276696, -8244727, -5958194, 21939230, 8193724, 11672110, -13123273, -11924977, --4831838, -1321239, -15921444, -17828946, 21622476, 8844948, -12550431, -11633993, -7108708, 26844, --12435004, -10832444, 284542, 3496104, 8302172, -1934346, -3868692, 2123325, 24089934, 19452444, --39756364, -19417010, 30521648, -5610301, -29804388, -261456, 588411, 10797548, 32273994, 28739236, --17724794, 5326833, -4051765, 261993, -340376, -18596672, 27983860, -8315057, -18421114, 6544994, --13239774, 15928960, 1342714, 22649510, -7032472, -21480742, -19473918, 17160542, -8317741, 22339736, --6058588, 14470819, -14753213, -11420318, -7050726, 1599875, -18504866, 4520453, 907849, 300111, -17955648, -211527, 5951751, -12525198, 8864276, -19765976, 21082920, -19015968, 12501576, 6385543, -17709760, -29759828, 941672, 2498060, -9068287, -21505974, -36495948, -6103149, -31155156, -11959873, --24948392, -11596412, -45532024, -14136348, 20544440, 26107496, 14136885, 15194521, -2537789, 16508781, --32465658, -7414724, 4942434, 20907900, 5688148, -44551160, -1841467, -19590956, -13120051, 52068964, -34918084, -24701968, -10136123, -17348984, 5719286, -45913200, 2734821, 9570261, -13208098, -13629005, -8262980, 2673617, 355945, -8822400, -7825431, -7556995, -7739531, 14320495, 13058311, -945967, --3769908, -14136885, -16304233, -3452617, -4150549, 5454609, 13925895, -27370216, -2163590, 13684303, --146566, 17513802, -6207302, -16791712, 8973260, 18930606, 9480067, -11389180, 1299765, 17517560, --22414898, -15911780, 29501056, 1613297, -1116692, -3028489, 4589173, 6802692, 8886824, -3745212, --7315940, -52413632, 15336791, 8163122, -27528056, 10817412, 10282152, -20067698, -15323370, 23471460, -2965138, 12473122, -6284611, 15493558, -4908074, -2519535, 12295954, 5863167, 4063039, 277562, --8230231, -14282377, -8621073, 22187264, -7797513, -19361712, 32852742, 20205674, 2645700, 14904073, -4494684, -17015050, -50046568, 20451560, -1615445, -27144194, 22789096, -2476049, -36458368, -30790620, --15903727, 23899882, 9690520, 24774446, 31384936, 9280351, -25234544, 7934952, 9179419, -32303522, --5122822, 18088254, -9977746, -35193500, -26555782, -42884712, -27203250, -6262063, 27149562, 39094940, -18972482, -2662343, 27074400, -6802692, -66017944, -52503292, 11630771, -26484916, -31224412, 44863080, -6064494, -60498372, -46582680, 15899969, 2934537, 10291279, 22623740, 54077932, 31199716, -4589710, -60432336, 19185618, -63061932, 539018, -13302587, 32670206, 10002442, -20771536, 10350871, -15593416, --9052180, -13564044, 20764020, -3806952, 15244986, 12610561, 16500191, -3638911, -16095927, -5293011, -11476153, -7027640, 9696426, 6099928, 7067906, -14161044, 1973001, 5746666, 576063, 25493316, --570694, 11334956, 2814277, -4203163, 13940927, 3300146, -1693291, 15161771, -6892349, -2294586, -9633075, 3824669, -1061394, -6126234, -8195872, 992674, -9456444, -7312182, 5714991, 7305740, -49609020, 47986596, -15019501, 16663936, -19601156, 11971684, 776852, 6898255, -23379118, 1803886, --19951734, -17976586, 316754, -41448044, 1169842, -17676474, 4763656, 12104828, -164283, 14033269, --20180978, 30768608, -15079630, -620086, 21493626, -20155744, 8018704, 15316927, 19093278, 2647311, -7010997, 4603668, -29542396, -16628503, -4607963, 4299799, 4789963, -4513474, 19914690, -6452652, --63351, -3859028, -8323647, 6873022, 4138738, -23610508, 7138236, -18995566, 5393405, -45496052, --1979443, -1237488, 119185, 18431852, -7259569, -16656420, -7175280, 16922708, 163746, -43979928, -61604864, -5474473, -11521787, 13269301, -2461016, -9141838, -11289322, -12332462, -12941273, 41996192, --16065325, -24499568, 21085068, 1930051, -33013802, -7949448, 14104673, 10943040, -10741176, 22601728, --3790846, -6337224, 21219286, -15574625, -13996225, 26458072, -11546483, -4306779, -1237488, 11151883, -5650567, -380105, -1658394, 556198, 5233955, -5560909, -207769, 5101885, 5726265, 6500433, --16097537, 4104915, 8425115, -15952045, 1539209, 3221762, -2618320, -6514392, 6598144, 1721745, --5534602, 822486, -348429, -2768107, -19780472, 11253888, -11627550, 3486440, 3573950, -18167712, --817654, 790274, 79457, -350040, -5917928, -985695, 5308580, -829466, -38969312, -57749592, --55357296, 122641184, 101938904, 115883584, 262156752, 68487008, -65593816, 20633022, -210137712, -222957120, --55097988, -140153376, -108246600, 66185984, -34381752, 13735305, 167053824, 82813952, 123842160, 237672752, -158519728, 41356240, 34524020, -70143792, -216390656, -165457712, -126530808, -255796448, -103424424, 6067178, --45216880, -20437602, 129417568, 34237868, 17426292, 160160944, 19899658, 38252052, 227676224, 167276624, -106005160, 215132768, 107243720, -37846180, -3214783, -68190120, -335209312, -292626848, -236352592, -367449472, --279888512, -99262600, -132587248, 29817274, 255129104, 227741712, 315354752, 398032352, 296237312, 230945216, -224735232, 124215288, -42115912, -80267568, -182861984, -261174272, -256440144, -222319312, -254577200, -260610032, --209494544, -117306296, -85012432, 31417686, 199468480, 287551808, 410650944, 461801856, 275661728, 66695472, --39724152, -278681088, -265160000, -202181296, -157153392, -58733140, 29127932, 21408802, 28007482, 35067336, -16197395, 41336912, 58304716, 43080132, 70458936, 39763344, -18660022, -22736484, -63227288, -115181360, --32059784, -36568424, -42036456, 35124780, 30054034, -39760124, -50971060, -94142464, -153156384, -64932928, -85897200, 146859968, 285884832, 345068416, 234268992, 144892864, 37933152, -131108168, -191228592, -216287040, --252678288, -237629264, -182725088, -148447488, -123167312, -75435728, -20340966, 61395484, 217233008, 303904896, -269475904, 193068448, 118275344, 23935316, -49637472, -74557944, -93976568, -67868000, -20431160, -6199249, --22164178, -34699576, -53975392, -84289808, -108737832, -105415144, -106363256, -64825016, 3194382, 30339112, -60224568, 79373680, 71092984, 40979356, 15219217, 4548907, 1192927, 832687, }, +2590939, -3527242, 5304822, -3109020, -1074816, 81068, -1825361, -2042794, -4123706, 986769, +6240588, 641024, 1112933, 2654827, 637266, -2216203, -696322, -1316944, -1335735, 3787624, +1032940, 498216, -1298154, 700080, -164283, -1438277, -2364916, 3671123, 2816425, 525060, +-788663, 4257387, -5930813, -2205466, 2515240, -2453500, 5091684, 522912, 3591667, 463856, +409096, 2330557, -2049236, -849867, -77309, -56908, -1600949, -1274532, 2243047, -112206, +-5470178, 5125507, -727460, 872415, -4621922, 2193118, -2050310, 1816771, 132607, -158914, +-1740536, -178241, -2675765, 2754685, -5195837, -586800, 3788161, -3008088, 1408749, 5661304, +1717450, 567473, -2823404, 298500, 1505386, -1069447, 1887638, -1191853, -825171, -1598802, +1708323, -1864553, -2979097, 943282, 494995, -749472, 3644280, -928250, -790811, -893890, +1209570, 1323924, -95563, 141734, 658741, -734439, 652835, -1412507, -580894, -237834, +-294205, -765578, -26307, -51003, -156229, -453656, -33286, -768799, 404264, -391916, +878858, -584116, 654983, 883153, 10931766, 2019708, -1530082, 3341485, -1651415, -1366873, +-1750199, -711354, -4104378, 5811091, 3357054, 2508798, 2700998, 2569464, -2692945, -3628711, +4891431, -1051193, -3795141, -7225209, 1183264, -2138894, 2267743, 45634, -613107, -1617055, +2274185, -2676838, -1352915, 3571265, 6783901, 1767379, 3086471, 588411, 3411815, -706522, +3629784, 2290291, 410169, 2030446, 180389, 596464, 186831, 4958540, 1050120, 1304596, +-1120450, 734439, -351650, -693637, 4023311, 4605816, -1656247, -1695438, 928250, 4238596, +-6899328, -361851, -1874216, -5106716, -2078764, 710280, -2177549, 2269890, 1838783, 151934, +-3114388, 1449015, -664109, -2978560, 3820374, -5273683, -2493766, -5624797, -2784750, -799401, +836445, 5674189, -2454037, -1479616, 1753420, -896038, -1350767, 2687039, -446140, -111669, +-1228898, -1903744, -2361158, -630823, 2003602, 797253, 973347, 929324, 710280, 70330, +-336618, -147103, 158914, 1414118, 687732, 744103, -485868, 115427, 484794, 399969, +-1074, 90194, 3221, -108985, -196495, -991064, -761820, -515396, 545998, 457414, +-223338, 3299072, 1460826, -6663105, -619549, 981400, 4744328, -1432909, -8250096, 6648610, +-7794829, 408559, -3396246, -2710124, -8265665, -5507759, -3214783, -2093797, 3424163, 1148904, +-5435281, 766652, -2898566, 36507, -173946, 2240362, 477815, -2386391, 408559, 577136, +1358820, -1688996, -1143535, -510564, -2677375, -4103305, 5568425, 2565706, 773631, -772020, +4747550, 4078608, -4640176, 1297080, 467615, -898185, -2694018, 606664, -4794257, 1072668, +-893353, -3945464, 4882304, 70867, -354335, 6070937, -5261872, 4772246, 1790465, -724239, +-3892851, 1124208, -542777, -4153234, -3426310, 16106, -1487669, -1874216, -5697274, 248571, +1243930, 2664490, -1637993, 2476586, 781147, -1030255, -775242, -3399467, 2943663, 578210, +450435, -5636608, 2967823, -514322, 421981, -2923799, 112743, -5181341, 649614, 1079647, +718333, -471910, 530965, -128312, 61740, -927176, 306553, -297427, 1160178, 618475, +497142, 1017370, 41876, 326418, 1080184, 600222, -702227, -330176, 1699733, -625455, +359704, -609885, 653372, -1954747, -448824, -622770, 817118, -383326, -12273406, -11628624, +4508642, 7691213, 4661650, -10475425, 7460895, -2536715, -950262, 656056, -4846871, -3686156, +8801999, -126702, -10737, 664646, -205622, 2868501, -4372277, 2653753, -2314451, 2378338, +4031901, -2673617, -719944, 2330020, -667331, 4196183, -1304596, 1821603, 368293, -431107, +354872, -3582540, -4975183, 4697084, 617402, -908386, 42950, -4669703, -5806259, -164819, +113817, 3022583, -5397700, -4605816, -980863, -9597641, 3726421, -759136, 1958505, -740345, +-2309082, 1464584, 12293807, 6820408, 3568581, -3687230, 4845797, -58519, -6313065, 15032, +-6589554, 5596880, 772020, 658204, -3754338, 31675, 3832185, 1399623, 766115, 476205, +428423, 4111894, 2870112, 523986, 2796024, 1657321, 2232846, 6019934, 2500745, 2958696, +-2793876, 2258079, 1687385, -727997, 4748623, 1434519, -14496, -434865, 1417339, 2517925, +308164, -40265, -938987, 598611, 2083059, 1141388, -476205, 195421, -1713692, 481036, +429497, -774705, 164819, -118112, -34360, 1154809, -227096, 1205275, 1671279, 590558, +-984621, -1903744, 308701, -1205275, 909459, 808528, -1203128, 477815, -17632988, -1342177, +-4241817, -616865, -2947421, -10002979, -426276, -2690797, -4124242, -9377524, -1156957, 6657736, +-4653597, 4379256, -776315, 6174553, -2093260, 5016522, -1654636, -4968741, -1334124, 533113, +-2180233, -4467840, -3590593, -4392141, 140660, -4007741, 1459215, 471910, 399432, 1894618, +-3015604, -4037806, 5822902, -532576, 1725503, 59056, -4574677, -2902324, -3230352, 155693, +-2319819, 4059281, 4125853, 680215, -5603859, -1837709, 10302016, 2561948, -4361003, -3469260, +-2209224, -3821447, -2021319, 8048232, 4896263, -5846524, 3573413, 4746476, 7007776, -1810866, +2847027, -432718, 59593, -2840584, -5839545, -1058710, 4304094, 440771, 8338679, 5916318, +393526, 1934883, 7033009, -5605469, -2570001, -1655173, -3453154, 2477659, 1088237, 1135482, +-3026878, 2052994, -2199560, 2275796, -4303021, -202400, -398895, -1689533, -105764, -370441, +2112587, 576599, 473520, -1845225, -1247688, -595927, -1737851, -75162, -2506650, -1459752, +101469, -195958, 1561758, -1066763, 427349, -516470, 849867, 613107, 2160906, -1786706, +22600654, 15170361, -4670777, -851477, 58519, -615254, -2582349, 3156801, 7739531, 6532109, +3394635, -11855720, -5266167, 1524713, 691490, 5038534, -8921721, 1804423, 12104292, 8145406, +-1386201, 2902324, -1059783, -4085588, -5575942, 311385, -4750771, -2774012, 1395328, 3757560, +-3481071, -6489696, -3081102, 1115618, 5963025, 8322036, -1581085, -8801462, -1859184, -3147674, +-8827768, -533113, -264141, -4239670, 1463510, 2377801, 5164162, -7408819, 3029026, 3818226, +835908, -7165079, -5318244, 2437931, 316217, 1857037, -778463, -703838, -245887, -3973919, +1959579, 2070174, -2770791, 4968204, 5883569, 8038568, 1932735, 598074, 7579007, 12347494, +1974611, 1685775, 2107218, 7259032, 824634, 4293357, 12196633, 3613678, 2248416, 331786, +-2302103, -10427644, 1395328, -285078, -1692217, -2001455, 1282585, -1453846, 2576444, 1137630, +-1378685, -768262, -352724, 2093260, 1338419, -590558, -405874, 1421097, 3097745, 12885, +-777389, 1071058, 118112, -1458678, -2881923, 2079838, -2713883, 1642288, 1145683, 2000381, +-136365, -349503, 41339, 643171, -3785477, 94489, 551366, -374736, 11893838, 263067, +2478733, 2893197, 5735929, -2236067, 3652870, -3090229, -1971390, -9797894, 3910568, 6696928, +-6062347, 5083631, -2508798, -8584029, 8943196, 5311801, -1592896, 5370857, 10473278, 7349226, +-5401995, -3004330, 5279589, 1683627, -1192390, 4080756, 3730716, 5455682, 344671, -2365990, +-4670240, -8278013, -272194, -6868190, 847719, -2225867, 3846143, -5458367, -12592307, 2787434, +-3123515, 5829881, 1465121, 474057, -3485366, -7400229, -6225018, -569083, -637266, -5575405, +7878044, 10212358, 10581189, 4297652, -7577396, -646393, 10025527, 985695, -1729261, 4689031, +-1312113, -2506114, -9518184, 5264556, 2757369, 13815299, 6376416, -9350681, 3146601, 3543885, +-992674, -151398, 3347927, -2259690, 767725, -3995930, -9870909, 8942659, 1632088, 5339181, +2576444, -4631586, 7552700, -1654636, 1800128, 429497, -1670205, 310848, 231391, 623307, +3951907, 1331440, 754841, 363998, -1349694, -1565516, -2063732, -1196685, 1363115, -630286, +-103079, -763967, 1249299, -1131724, -603980, 144955, -150324, 555661, -2175938, 2556043, +-1064078, 2252710, 736050, -1136556, -1435056, 3169686, -2870112, 2550674, -695248, -3663607, +-6111202, -1648731, -1560147, -10549513, 529355, 1295470, 5281736, -1994476, -4544613, 1894081, +578210, 2497524, 85362, 5732708, 2305324, 3959960, 679679, -441308, 3411278, 1995012, +-10383083, -3208878, -14845018, 674310, -2762738, 1717450, 2639794, 200790, 7105487, 1808181, +10142565, 1247688, -12039330, 247497, -4838281, -1991254, -562104, -1804960, -608812, -9549860, +2090039, -4596152, 11518565, -11942693, 6640557, -2592550, -10192494, -1905892, -7162932, -1540820, +-2172180, -10853382, 3129421, 3330210, -1975148, -1792075, -679142, 3847217, -8610336, 224412, +8102456, 1500017, 11266236, 18379238, 7606924, -16633871, -22192096, 10779294, 4842039, 16593606, +-3419331, 7966628, 1717987, 7912404, 11086384, 14262513, -7559680, 4119948, 10625212, -8676371, +1635846, -1107028, -1072131, 807991, 7593502, -1144609, 2608119, -4896263, 1796907, -3772592, +-3970161, -1751273, -3312494, 561030, -1944010, -5591511, -185220, 3729105, 2335389, -1029718, +-1014686, -820339, 104690, 1743220, 1842541, -1434519, -2160906, -953483, 3245922, -773631, +3146064, 509491, 485331, -776315, 783832, 940598, 291521, 879931, 180926, -2633352, +-2551748, -1660005, 858993, 2695629, -3740380, -2490007, -1157494, 1584843, -1739999, -20310900, +15164993, 2818036, -2702608, -270046, -9225590, -7517267, 7904888, -2098629, -2604361, 8250096, +-6133214, -6544994, 344671, 8207146, 3456912, -2598992, 221728, -4636417, -651224, 686658, +4361003, 238908, -10411538, -10283225, 2302639, -1335735, 2469069, -984084, 4130685, 8078297, +14947560, -183073, 9263708, -2232309, 2598992, 6456410, -6253473, 12277701, -1783485, -7539278, +-10759430, -1992328, -8932458, -11169599, -3138011, 5236102, -3503083, -8660802, 4324495, 6281390, +9684078, 12618077, -10271951, 3970161, -2887292, -9347996, 3498251, -10455561, -1969243, -17114908, +6833830, -5053566, 2516314, -3019362, 2681133, -18402324, -18449568, -11100343, -4350802, 10306848, +-9936944, 19492710, -6866579, 2020245, -1825898, 3711389, -1788317, -13635447, 1974074, 1702955, +3735011, 3290482, 1597728, 5425081, -3063386, -4604205, 8590, 326418, -4596152, 2198487, +-5912023, 3459059, 1972464, 2828773, -876173, 132607, -1811403, -4432943, -3323231, -1741609, +-2066416, 3166465, -2050310, -5375152, 1900523, 2498060, -1021129, 3883724, -319975, -955630, +-26307, 1035624, -1610613, -1415192, 1985349, 2872260, 2027761, 1082869, -4014184, -2698850, +-870805, -3007551, 1180579, 479963, -37581, -2675228, 17060146, 1104880, 6374805, 4625143, +1704028, 10109816, 1275605, -13904957, 6644315, 2114198, 6338835, -532039, -10480794, 14948097, +7918846, 6200859, -1513976, -4399121, 1799591, -979789, -8341900, 5433671, 3606162, -4475356, +5849746, 9549323, 132607, 3659849, 9283035, -10134512, 2334315, -3345780, 4095251, -19153944, +5754720, 9371082, -3365107, 2571075, 9155797, 5069135, 14496, 3172370, -9777493, 2586107, +-5813238, 536871, 2652679, 1631551, -4545686, 18552112, -3464965, -3392487, -4464619, -15987479, +-6691022, -9754944, -11591043, -2094870, 15691663, 17512730, -1887101, 5484137, 6787659, -14432701, +-4882841, 11922829, 9571335, -5667210, -4268661, -14212047, -4850629, -5309117, -7103339, -7968775, +1951526, -14500346, 2200634, 13828184, 18960134, 6012418, -5850819, -281320, 9955197, -3444564, +-7132867, 786516, -1104880, -2927020, -4862977, 801011, -699543, 2388002, 2812130, 1879585, +-1881733, 1003949, 1391569, 1386201, -500901, -2680597, -6362994, 1869385, -616865, -2381023, +4410932, 1580011, 2367064, -2484102, 3705483, -2669859, -2389613, -3020436, 2881386, 750009, +2059437, 4741644, -655519, -2250563, -1542430, 2443837, 774705, -70867, -144955, 770410, +392453, -134755, -1206349, 2483028, 2870112, 3998078, -1569811, -5404143, 3377455, 912681, +-7196218, -10644003, -11464341, -4558571, -11208254, -4636954, -4545686, 204548, -10661183, 2415382, +4490925, 528818, -12167642, 3821447, -15094663, 4705674, 8438537, 281857, 13112535, 442382, +-3885335, -2343979, 8851391, -3128347, 12179454, 4384625, -4188667, -4110284, 2164664, -6138582, +-3324305, 525597, 11528766, -314069, 6109054, 3533684, 1075889, 8150774, -3584687, -7315940, +3317862, -5213017, -2420214, -14366666, 8184060, -4987531, -4230006, -2835752, -15892453, 19161996, +4992363, -2173254, 8352638, 2818036, 4093104, -8337606, -12636868, -14332843, -6915971, 861678, +-14530411, 5553393, 10633265, -16250009, -5913096, 6118181, -7469485, 4068408, 18249316, 701690, +-2879776, -4712116, 4174171, -9763534, 6536940, 3617973, -8853001, 3054796, 6410776, -3471944, +-10493679, -8901857, -4655745, -202937, 2966212, 2603824, 2052994, -1700270, -2567317, -1170916, +2409477, 270583, -1416266, -5825587, -7042136, -1799054, 568009, -4936528, -6020471, -4061965, +-2484102, -2174327, -5270462, -4457103, -2403571, -3168075, -6749004, 1350767, 6494528, -484258, +-519691, -2405182, -1857573, 2305861, -2324651, 659278, -5300527, 373125, -1476932, -2717641, +74088, -2535105, 1764695, 2695092, -2176475, 3984119, -2566780, -848256, -2655364, -15032, +521839, 11679090, 28790240, 30438970, 9095130, 18931678, -12979928, -12918188, -3114925, -1808718, +1015223, 4394826, 9601936, 17538498, 5632313, 16244103, 1703491, 5008469, 2317672, -4318590, +7272990, -53687, 2847027, 1388885, -8297877, -874026, -4493610, -8750459, -5634460, 290984, +795106, -11649025, -4955856, 15022722, 10617696, 7885560, 12495134, -7645042, -15032, -21456582, +906238, 18720152, -3722126, -3529926, 2129230, -1823751, 14422500, -983548, -2525441, 11370926, +-13466333, -21478058, -8833137, 2113124, -11749957, 8790187, 11943767, -16869558, -6565395, 328565, +-427349, -24283208, -15694884, 8036421, 3273839, -1635309, 7766912, -10481331, -6665789, -14911590, +3481608, 5062693, 1141388, 1257889, -10156524, -16451335, 13669807, -22442814, 6504728, -8081518, +21521008, 2478196, 8903467, -5938329, -8665633, 6517613, 2803003, 9943386, -9356586, -1421634, +6453725, -182536, -5238250, -4517232, -5152350, 743566, 4931696, 5827197, -6349573, -2323577, +-1138166, -8012262, -3070365, 1787243, -1034013, 1009854, -4467840, -6987375, -1161252, 479426, +5574868, 2065342, -3654480, 4706211, 627065, 2548526, -8147553, 1953136, -4916664, 4122095, +581431, 4350265, 6321118, 2319819, -4651987, -8703751, 2704756, 3367254, -28179818, -20266340, +14038101, -2923262, 25526064, -6219650, 21014738, -16902844, 508954, 7558606, -1674500, 914291, +2468533, -1309428, -12687870, 4458713, 4773856, 5561446, 6323266, -3895535, 10429254, -9469866, +-6998113, -5410585, 14669461, -8090645, -2728915, 1321776, -306016, -7610145, 6541235, -8492224, +-10116259, -19063212, 1739999, 3500935, -12950937, -6037114, 6238440, -2616172, 3333968, 1040993, +15060303, 1053341, 11334956, 5060009, 488016, 9088151, 2063732, 3151432, -17082158, 17598092, +6231461, 13789529, -8376797, 3665218, -9168145, 14305462, 10849624, 17452062, 2782065, -4562866, +-12680891, -782221, 2236604, -10786810, 15333033, 2480344, 2384781, 16519518, 3694746, -4939213, +-6592775, -527744, 9815611, 11857868, -3852586, 14785962, -17678622, -18510236, -8105677, 4319127, +-5646809, 8091719, -2014340, 4351876, 14154065, -614180, 7025493, -5876589, -5389647, 6207302, +-545461, 9946071, -3068754, -44023, -3048353, -6110128, 1242319, -3585761, -1436130, 4114042, +1389422, -5549098, -5109401, 3007551, 7512972, 7826504, -790811, 6417218, 6930467, -9691594, +4532264, 9226663, 7226283, 4112968, -7265474, -8760660, -9178882, -9208410, -9184788, 808528, +-3209414, -1245004, 1034550, -6718940, 4796405, 4399121, -3484829, 5228049, 1837172, 2499134, +-6438693, 12986907, -30627948, -1392106, 15961172, -10194105, -3400540, 11767674, -12746926, -25892748, +5160403, 4414690, 4027069, -3362960, -15305116, 3886409, 4372277, 1177895, 8527121, -27428198, +12621835, -6350109, 6583111, -15613817, 12757663, -19762756, -12610024, 7720204, -5151814, -2266669, +-15010911, 11864310, 15604153, 1611, 1778653, -7114077, 23392002, 5839545, 6416145, -4186519, +-20146080, -4286378, 11215233, -1970853, 16758962, 206158, -5986111, 4099010, -1097364, 10546829, +-19912542, -2336462, -15251429, 16658568, -6091338, 5643587, -378494, -500901, -18024368, -6267968, +16007880, 5182952, 1523103, -4691715, 573915, 2140504, -23107998, -23926190, 25708600, -11245835, +-27679990, 11433203, 13256953, -22252226, -29153164, -20301774, -19493782, 3622268, 7918846, -2310156, +-18724446, -466541, -9957345, -4601521, -13530758, -608812, 1520955, 1534377, -2579665, 13111461, +-6876243, 5261335, -5810017, -121333, 3712999, -3117610, -336618, -7471096, 10285373, -2170032, +3728569, -5416491, -7999377, -1494649, 4155381, 4749160, 1620813, -7759396, 4930086, -920734, +-6197638, 6491306, -9482751, -1697586, -5776731, 9974525, -4048544, -10541997, 4938139, -4020626, +-4406637, -14074608, -498753, 3483219, 12288438, 5194763, -6823630, -3355443, 1473174, -1637456, +-3486440, 2510945, -249108, -2444373, -2380486, -635118, 12252468, -17054242, -9112847, -17820356, +-1372242, 3329674, -23332946, 3503083, -11282879, 32523640, 1976759, -29795262, -6533182, 14025216, +9002251, 6691022, 15119895, 14651744, -21047488, -5731097, -7987029, 19674708, -6767258, 23018878, +223875, -13775571, -10473815, -21155936, -23645942, 1105417, 3041374, -4227859, -12057047, -5569499, +1873680, 3460670, 8470749, -12024298, 6206765, -14084808, -15899969, 2819646, -3177202, -4649839, +-16589311, -16339666, -7421167, -5287642, 23190140, 1768453, 7982197, 12520367, -109522, 28449864, +11964705, -9959492, 1779190, 14468671, -5499706, 18412524, -4638565, 1985886, 1599339, -25863756, +-25785374, 3478387, 18543522, 10201, -5379984, -28896004, 2142652, 9356586, 6429566, -10172630, +-7658464, -6059125, 3795141, -12707734, 30592516, 16687022, 18879602, 3293166, -21068962, 7381975, +10064719, 29761440, 7264401, 2687039, 12420509, 4777078, -4611185, -121333, 9589051, -1258425, +1573032, 2604898, -7344931, -5765457, 9332427, -142271, -6980933, 9097814, -5581847, -2583423, +-4205310, -4779225, 8749385, -5850819, -2135673, 4074313, -8792872, 3424700, -526134, -5599564, +11432129, -4415227, 300111, -14602352, 8973260, -4738423, -3404835, -9557376, -12712566, 1660005, +-4952634, 8757438, -6442, 5034776, 3788161, -190589, -5130876, -245887, -14172855, -12931610, +27304180, -8470749, -10105521, -1454920, -7519414, -18606872, 404264, 12843563, -31894964, -569620, +8284455, 10157598, -10873247, 7203197, -18260054, 1372779, -4708895, 5680631, -16354699, 10146323, +-27851790, 4525285, 768799, 15737297, 14846628, 7341710, -10401874, 11549167, -3391414, 12904229, +-14104136, 2176475, 16517370, 13036836, -7755101, 2632815, 414464, -3721052, 8011725, -3178276, +-9618579, -10783052, 7638063, -19429896, 12787728, 2916820, -20767778, 19488950, 18720688, 17542258, +6351720, -9236327, 22656490, 2640331, 9730785, -14003741, -12085501, -13430900, 4132296, 5077188, +8110509, -18810884, 1805497, 13661217, -35938676, 1240709, -11812771, 22405234, 14506252, 11191074, +-3195993, 14805826, -14107357, -867047, -9830106, -21735218, -928787, -20030116, -16667157, 9600863, +26521960, -25094958, -5945846, -4708895, 26623428, -6744173, 11628624, -7800735, -4707821, -1186485, +9396315, -5742908, -2359011, 594853, 6387690, 4551592, 3339874, -3736622, 934692, 2593624, +13159243, -10640781, 10972031, -2597382, 8012262, -188979, 2093260, 2597382, 5021891, -7125888, +-1619740, -1560147, -8644695, -7901666, -7679939, 5054640, 4187056, -1803886, -3486977, -4668093, +-6078990, -3973919, 427886, -2928631, -140660, 7689065, -266825, -14817637, 6746320, -8787503, +-1385664, 23739894, 5152350, 12020540, -34206192, 15855946, -19119584, 25897042, -2547989, 10069014, +19678466, -21219822, 37845640, 27086748, 20503638, -9324374, 5580237, 25873420, -6427419, -8377871, +-5965710, -1417876, -19495394, 5128191, -10331544, -23809688, 23084376, 7543037, 6412923, 2813741, +5426155, 8831527, 24299314, 5011153, -14992120, -1367410, -15560130, 3018825, 2368675, -27627378, +-1064078, 14911590, 1202591, -2059437, -8295730, 29190208, 6147172, 12378096, 6561637, -15901043, +-11179263, -8734353, 18312130, 10645613, -3526168, 10943040, -1505386, -20042464, 19469624, 2253784, +22301080, 2350958, 2404645, 335544, -29317446, 3907347, 906238, 3150896, 18430778, -7347079, +28933584, -43888124, -7647190, 32536524, -13093745, 10686416, -14776835, -23419382, -18641232, 13405667, +-12699145, 12489228, -20035486, -4438849, 3532074, -5089536, -7792145, -2676302, -2234994, 8673150, +20421496, 2013803, 12178380, -4065187, -1876364, 14659797, -2003602, -4358855, 4246112, -7532299, +6731288, 12742631, -8448738, -1458678, -3194382, 2216203, 2583423, 5968394, 23075786, -4306242, +8242042, 265214, 5681705, 8176544, 4360466, 1136019, 12937515, 13637595, -3658775, -2093797, +5893232, 2835752, 5132486, -17904108, -1262720, 16694538, -3563212, 3337190, 6835441, -1105954, +17394080, 6135361, -35447440, -42407972, -3748970, -19875498, 2690260, 12077985, -16974248, 4957466, +-25926034, 11282342, -14280766, -70875552, -4566087, 43247636, -18641768, -8007967, 43447352, -10188199, +2341294, 52064132, -12458090, 11520713, 4866735, -7591355, 41918344, -33741800, -4359392, -908386, +-5939940, -6777996, -6911676, -822486, 13652627, -7665980, -22874458, 278636, 456877, 6781217, +8339216, 1537061, 18824842, -695248, 8662949, -5111548, -22695144, 15849503, -2786360, -23335094, +897111, 13510893, 41291280, 20922934, 34712464, 767725, 8548059, 16608639, 3917010, -1984812, +32451700, -1667521, -12639552, 38031400, 6641093, 6760279, 278099, -5311801, 21709986, 41876, +-12617540, -14201309, -2943126, -2768643, 32870996, -22238804, 2888366, 4285304, -5832029, 38649336, +333934, -24629490, 4156992, 12671227, -18121004, -807454, 18494130, 15312632, -9309342, 1532767, +-10521596, 8973797, -2820720, 1294396, -10351945, 9722195, 148176, -977105, -15052250, 6322729, +5179194, -9743670, 804770, 3658775, -5046587, -3257733, 11686606, 1917166, 6536940, -4179003, +3461207, 20290500, -18276696, -8244727, -5958194, 21939230, 8193724, 11672110, -13123273, -11924977, +-4831838, -1321239, -15921444, -17828946, 21622476, 8844948, -12550431, -11633993, -7108708, 26844, +-12435004, -10832444, 284542, 3496104, 8302172, -1934346, -3868692, 2123325, 24089934, 19452444, +-39756364, -19417010, 30521648, -5610301, -29804388, -261456, 588411, 10797548, 32273994, 28739236, +-17724794, 5326833, -4051765, 261993, -340376, -18596672, 27983860, -8315057, -18421114, 6544994, +-13239774, 15928960, 1342714, 22649510, -7032472, -21480742, -19473918, 17160542, -8317741, 22339736, +-6058588, 14470819, -14753213, -11420318, -7050726, 1599875, -18504866, 4520453, 907849, 300111, +17955648, -211527, 5951751, -12525198, 8864276, -19765976, 21082920, -19015968, 12501576, 6385543, +17709760, -29759828, 941672, 2498060, -9068287, -21505974, -36495948, -6103149, -31155156, -11959873, +-24948392, -11596412, -45532024, -14136348, 20544440, 26107496, 14136885, 15194521, -2537789, 16508781, +-32465658, -7414724, 4942434, 20907900, 5688148, -44551160, -1841467, -19590956, -13120051, 52068964, +34918084, -24701968, -10136123, -17348984, 5719286, -45913200, 2734821, 9570261, -13208098, -13629005, +8262980, 2673617, 355945, -8822400, -7825431, -7556995, -7739531, 14320495, 13058311, -945967, +-3769908, -14136885, -16304233, -3452617, -4150549, 5454609, 13925895, -27370216, -2163590, 13684303, +-146566, 17513802, -6207302, -16791712, 8973260, 18930606, 9480067, -11389180, 1299765, 17517560, +-22414898, -15911780, 29501056, 1613297, -1116692, -3028489, 4589173, 6802692, 8886824, -3745212, +-7315940, -52413632, 15336791, 8163122, -27528056, 10817412, 10282152, -20067698, -15323370, 23471460, +2965138, 12473122, -6284611, 15493558, -4908074, -2519535, 12295954, 5863167, 4063039, 277562, +-8230231, -14282377, -8621073, 22187264, -7797513, -19361712, 32852742, 20205674, 2645700, 14904073, +4494684, -17015050, -50046568, 20451560, -1615445, -27144194, 22789096, -2476049, -36458368, -30790620, +-15903727, 23899882, 9690520, 24774446, 31384936, 9280351, -25234544, 7934952, 9179419, -32303522, +-5122822, 18088254, -9977746, -35193500, -26555782, -42884712, -27203250, -6262063, 27149562, 39094940, +18972482, -2662343, 27074400, -6802692, -66017944, -52503292, 11630771, -26484916, -31224412, 44863080, +6064494, -60498372, -46582680, 15899969, 2934537, 10291279, 22623740, 54077932, 31199716, -4589710, +60432336, 19185618, -63061932, 539018, -13302587, 32670206, 10002442, -20771536, 10350871, -15593416, +-9052180, -13564044, 20764020, -3806952, 15244986, 12610561, 16500191, -3638911, -16095927, -5293011, +11476153, -7027640, 9696426, 6099928, 7067906, -14161044, 1973001, 5746666, 576063, 25493316, +-570694, 11334956, 2814277, -4203163, 13940927, 3300146, -1693291, 15161771, -6892349, -2294586, +9633075, 3824669, -1061394, -6126234, -8195872, 992674, -9456444, -7312182, 5714991, 7305740, +49609020, 47986596, -15019501, 16663936, -19601156, 11971684, 776852, 6898255, -23379118, 1803886, +-19951734, -17976586, 316754, -41448044, 1169842, -17676474, 4763656, 12104828, -164283, 14033269, +-20180978, 30768608, -15079630, -620086, 21493626, -20155744, 8018704, 15316927, 19093278, 2647311, +7010997, 4603668, -29542396, -16628503, -4607963, 4299799, 4789963, -4513474, 19914690, -6452652, +-63351, -3859028, -8323647, 6873022, 4138738, -23610508, 7138236, -18995566, 5393405, -45496052, +-1979443, -1237488, 119185, 18431852, -7259569, -16656420, -7175280, 16922708, 163746, -43979928, +61604864, -5474473, -11521787, 13269301, -2461016, -9141838, -11289322, -12332462, -12941273, 41996192, +-16065325, -24499568, 21085068, 1930051, -33013802, -7949448, 14104673, 10943040, -10741176, 22601728, +-3790846, -6337224, 21219286, -15574625, -13996225, 26458072, -11546483, -4306779, -1237488, 11151883, +5650567, -380105, -1658394, 556198, 5233955, -5560909, -207769, 5101885, 5726265, 6500433, +-16097537, 4104915, 8425115, -15952045, 1539209, 3221762, -2618320, -6514392, 6598144, 1721745, +-5534602, 822486, -348429, -2768107, -19780472, 11253888, -11627550, 3486440, 3573950, -18167712, +-817654, 790274, 79457, -350040, -5917928, -985695, 5308580, -829466, -38969312, -57749592, +-55357296, 122641184, 101938904, 115883584, 262156752, 68487008, -65593816, 20633022, -210137712, -222957120, +-55097988, -140153376, -108246600, 66185984, -34381752, 13735305, 167053824, 82813952, 123842160, 237672752, +158519728, 41356240, 34524020, -70143792, -216390656, -165457712, -126530808, -255796448, -103424424, 6067178, +-45216880, -20437602, 129417568, 34237868, 17426292, 160160944, 19899658, 38252052, 227676224, 167276624, +106005160, 215132768, 107243720, -37846180, -3214783, -68190120, -335209312, -292626848, -236352592, -367449472, +-279888512, -99262600, -132587248, 29817274, 255129104, 227741712, 315354752, 398032352, 296237312, 230945216, +224735232, 124215288, -42115912, -80267568, -182861984, -261174272, -256440144, -222319312, -254577200, -260610032, +-209494544, -117306296, -85012432, 31417686, 199468480, 287551808, 410650944, 461801856, 275661728, 66695472, +-39724152, -278681088, -265160000, -202181296, -157153392, -58733140, 29127932, 21408802, 28007482, 35067336, +16197395, 41336912, 58304716, 43080132, 70458936, 39763344, -18660022, -22736484, -63227288, -115181360, +-32059784, -36568424, -42036456, 35124780, 30054034, -39760124, -50971060, -94142464, -153156384, -64932928, +85897200, 146859968, 285884832, 345068416, 234268992, 144892864, 37933152, -131108168, -191228592, -216287040, +-252678288, -237629264, -182725088, -148447488, -123167312, -75435728, -20340966, 61395484, 217233008, 303904896, +269475904, 193068448, 118275344, 23935316, -49637472, -74557944, -93976568, -67868000, -20431160, -6199249, +-22164178, -34699576, -53975392, -84289808, -108737832, -105415144, -106363256, -64825016, 3194382, 30339112, +60224568, 79373680, 71092984, 40979356, 15219217, 4548907, 1192927, 832687, }, { 8950175, --1191317, 726386, 7012071, -891743, -344134, -2033667, 7650411, 461709, 3710315, 2278480, -2238215, -3151969, 1571421, -4888747, -552977, 3810173, 750546, 2235531, 3557307, -6040872, --4247186, 1449552, -322123, 4499515, 2712272, -224412, -2514703, -1560147, -3106335, -483184, --434865, -455267, 830539, 1181116, -2707440, 4507568, -1059246, -695785, 1513439, -5731097, --1349694, 2488397, 852014, 5667210, -47782, -409096, 1079111, 390842, 2329483, 3924526, -4956929, -284005, -542240, 93952, -2895882, -3635690, 1980517, 3253975, -2311229, -2186138, --1508607, 4147865, 2411624, -568546, 615791, -4886599, -1438814, 2542621, 2076080, 3615826, --5287105, 1194001, 1956358, -1095754, 3674882, -238908, 3198677, 1537061, 1006096, 4097936, -2000918, 1032940, -537, 481036, -1011465, 341450, 535260, -326418, -1491427, 716186, -673773, -1082332, -186831, -732292, 725313, 1173600, 11274, -156766, -103079, -1099512, -499290, -393526, 870805, 420907, 241055, 185757, -526670, 286689, 95563, 456340, --907312, -424665, -231391, 107374, 11616813, 3238405, -2698850, 5969468, -2916283, 6212670, --2084133, -2784213, 3114925, 5812702, -205085, -2823404, 1516660, 1248762, -263067, -8192113, -1902671, 2447058, 635655, 5176510, 6895033, 3751654, 6790344, 4670777, 4129611, -1068373, -4589173, 2261300, -3515431, 1350230, 2110440, -4460324, -5735392, -835908, 2235531, 132607, --2079838, -2720325, -2708514, -1290638, 3069291, 6227703, 5222680, 2023467, 4009352, -6444599, -397284, -1607928, 51540, -7402376, 2752537, -666257, -1766842, -238908, -2031520, -3631932, --2596308, 2665564, 618475, 2057826, -2722473, 5137318, 1301912, -5832029, 2428267, 803159, -1633698, 3282429, 976568, 5976984, -1889249, 707596, -6912213, 1373853, 667867, 258235, -165893, -1240709, 4920959, -1442035, -2281702, 3793530, -3859565, -1822140, -1589675, -654446, --1794760, 1312113, 338229, 716723, -40802, -103616, 74625, -637803, 435939, 716186, --236760, -233002, -19327, -1208496, -2071248, 840740, 271657, -1574642, -200790, -108985, --340376, -1920387, 531502, 65498, -42413, 212601, 370441, 293132, -732292, 48855, --1349157, 647466, -2427194, -2303713, -836982, 2230699, -4057134, 1230508, -7945690, 1542430, -1418950, -853088, 5560372, 420907, -694711, 570157, 2913062, -4765803, 622233, 1542430, -3016678, -6806450, -3546569, -2529199, 2452426, 1093606, -2222646, -6878927, 1617055, -6842420, --489089, 2804077, -1345399, 2150705, -1258962, 4715337, 6833830, 3708704, -3636764, 732292, -5163625, 3293166, -3299072, 2778844, 744103, -5318780, 1826972, 7460358, 3404299, 2543695, -8185671, 803159, -3196530, -6250788, -340913, -3481071, -4315906, -1950989, 4472135, -4243428, -1438277, -2507187, -2469606, 5351530, -757525, 940598, 4150549, 5807333, -2615098, -5208722, -6644852, 5213017, 3221226, 376883, -4096862, 709207, 5237713, -5311801, 1573032, -3438658, --181462, 3347927, -3144453, -106837, -5992016, -1497870, -586263, 966905, -380105, -2176475, --332323, 1200443, -1815161, -386010, 747324, 746251, 443992, 556198, -155693, -364535, --2403571, 1325534, -193810, 1363652, -970663, -1471026, 479963, 1297617, -872415, 1154809, --250719, -1074, -163209, -171262, 1234803, -686658, 439697, -693637, -15617575, -5695664, --2417530, 8552354, -3254512, -1267552, -5058398, -4252018, -743029, -11236708, 6293738, 2100776, --332860, -4140349, 6197101, -1730872, 3141232, -2497524, 1979980, 3977677, -4959077, 541166, -5448703, 3104725, 2188286, 5858873, 5212480, -3257196, -4189204, -5193153, -96100, -6833830, -1627256, -9032316, -1742146, 6689949, 3498251, -2274185, -712965, -6788733, 3086471, -2889439, -5996848, -3435437, -6169721, -1242319, -2546916, -5039071, 1955284, -1135482, -3229279, -3259343, --10922639, 1517734, -3279745, -8064338, -2157684, 5015448, 2553895, -4157528, 3452080, 4472672, -4289062, 1622961, -5585068, -901943, -1242856, 3894999, -3925600, -1478006, 2033130, 2098629, --6111739, -7245610, -13069049, -2204392, -7591355, 2529736, -295279, -1780801, 3841312, -779000, --1749662, 1708860, 2619930, 2552284, 1957968, 4583267, -1942399, -1564979, -1228898, 704375, -229244, -997506, 1254131, 1842541, -401043, 462246, -796180, -994822, -192200, -631897, -188979, 436476, 54761, -1105417, 178778, -731218, -295279, 695248, 1467268, -608275, -1757715, 2184528, 338229, -574452, -1857573, -328565, 1251983, 879395, -13560285, -5450314, --2414845, -4041027, 4637491, 6020471, 5710696, -11357504, -8449811, 3240553, 13828184, 8145943, -7516, 1945083, 3948686, -4986994, 3289945, -4625680, 3335579, 4883915, 768799, 3914326, -1239098, -299574, 2052994, 1187559, -3694209, -4715337, 6489159, 2602213, -4725001, 4615479, --2574833, -505196, 11147051, -5345087, 6312528, 12428562, 5087389, -738734, 483184, -4520453, -5826660, -5977521, -3250753, -10028749, 1885491, 7682623, -193274, -7108171, -2523293, -10065793, --5097590, -1894081, -14276471, -7798587, -1414655, 1481764, -6254010, 3134789, -1661616, -4966593, -5337034, 15745887, 1460289, 8009577, 5448703, 4695473, -5004711, 2066416, -8521752, 874026, -2435783, 1873143, -3318936, 41339, -8655433, -3046743, -3046743, -650688, 4184372, 4464619, --218506, 1715303, 2430415, -1273995, -963683, -834297, 788663, 62277, 584116, 433792, -1357747, -770410, -70330, -2112587, -280784, -361851, 1454920, 806917, -936840, -1292248, --1236414, -1216550, -425202, -1485522, 487479, 2619930, -2137820, -316217, 878321, 1471026, -21109228, 13502840, -7392713, 2820183, 6726993, -2718178, 3807489, -1227824, 6267968, 3288871, -1938104, 5874979, 3166465, 2955474, -1901597, -14095009, 6694781, -2320356, -3331284, 11200201, -6771553, 3933653, 5019743, 3898757, 2724083, -2076080, 1543504, 547608, -3735011, 3031173, -4700842, -7909719, 1430761, -5085778, 3727495, 4527970, -12618077, -110595, -14996952, 351114, -1757715, 1358820, 3962107, 10255308, -1346472, -5172215, -2685428, -2733210, -4021163, 3018825, -3045132, 1076963, -1758252, -1733556, 9769440, -3183108, -2081985, -5298916, 8665097, -1240172, -7264401, -3377992, 7770133, -7495792, -16062104, -4650913, 889595, 3320547, 5283347, -5280126, --4112431, 2277943, 1327682, -2399276, -4272956, 10064719, -4016331, 9578851, 2393371, 6794639, -2525978, 4974646, 4002910, -1626182, -761820, 2008971, -399969, 5265093, 15032, -1625645, -352724, -5712844, -1270237, -1254667, 281320, -1851131, -865973, -565325, -261993, -581431, --3168075, -2381559, 613643, 297963, -3542811, -118112, 375273, 590558, 1264331, 679679, -3229279, 236760, -1266479, -49392, -590021, -1470489, -1971927, -639950, 9893457, -3760781, --6628745, -274341, 1014149, -9398999, -7407208, -2323577, 2527588, -1381906, 12202002, 7368017, -283468, 11708618, 4173635, 3438658, -10061498, 9415642, -1803886, -2343442, -8496519, -3803731, -7452305, 7419019, -2162516, 4923107, -10212895, -1419487, 6770479, 5146445, -3854733, -7208566, --4110284, -4453881, -5626407, -4628901, 1048509, -7581154, -796716, 10481868, -5112622, 1210644, --464930, -2413235, 4016331, -1673964, 6776922, 5369, 9585293, -2485176, -6162741, 3487514, --4887136, -4773320, -4889284, -13723494, 1510755, 5667210, 8082592, 5874979, 10646150, -1113470, --4214437, 6187974, -7714835, 1757715, 1087701, -1162862, 6860674, 6469832, -1765768, -8304320, -1559610, -4300336, -7988639, -7333657, 3929895, 7059853, 4336843, -15348603, 3350611, 1606855, --868657, 7202124, 3794604, 5887327, 2128693, -603443, 7650948, 1013075, 3413425, 2788508, -498753, -3518115, 451508, -1977296, -4387309, 777389, 1175747, 1990181, -634045, 513785, -353798, 338229, 1392643, 949725, 919123, -202400, -2827699, 1865090, -1224066, -1255204, --1151051, -1964948, 3380676, 3933116, 3236258, 1314797, 228170, 529892, -958315, 2574296, --12070469, -7066295, 1275068, -6895033, -17866528, 13540958, -295816, -887448, 1716376, 1072668, --11815992, 8268349, -12318503, 1102196, 5639292, -1616518, 2057826, 1992865, -13251585, -4457639, --5900212, -1220845, 2729452, -4349728, -2755222, -530428, -768262, 1222992, 5560909, 2979634, -11944304, -4320200, 16390669, -1137093, 462246, -10697690, -1570347, 7968775, -1560684, -16458315, -6671695, 7667054, -4878009, 4061429, -6128919, 11424076, 6339909, -313533, -645856, -7313793, --4645544, -8004746, 7536057, 7419019, 3287798, 855772, 3413425, -6451041, -16962436, -6204081, -5993627, 2622078, -12568148, 329639, 1531156, 1737314, -6003291, 4348118, 9001715, 4635344, -235686, 3637301, 6213744, -3468186, 9229348, 154082, -184684, -9081708, -11548630, 7468412, --3474629, 3707631, 3839701, -627602, -2417530, -2541010, -1868848, 1183800, -2780991, 3763465, -952409, -1049583, 1043140, -1348620, 238908, -4756677, 1280974, 355945, -731218, -2660732, -986769, -2358474, -25770, 731218, -377957, -1557463, 81604, -1564442, 5850819, 4332549, -1747515, -704375, -369904, -1697049, 158377, -696322, 3795141, -1278827, -358093, 3451543, -956167, 1410897, 2702608, -1851668, -827318, 2559264, 1724429, -796716, -257698, -18791556, -10087804, -2531346, 3687230, -5536213, -3088618, 7958038, -9207873, 8944269, -5586679, -10648298, -4794257, -5721434, 22731652, 3419331, -8012262, -11034308, -2037962, -13692893, -6359773, -14751065, --923955, 9916006, -7063611, 6128919, 9920838, -9217000, -26307, -10763725, 5996311, 2159832, --457414, 6390375, -6793565, -9651328, -8239895, 588411, 1760400, 8158827, -11775727, 8363375, -1565516, -17267916, -9583146, -13932874, -5801964, 5330055, -4776004, -4633196, -26640072, -528818, --5906654, -2408403, -17115982, -5909338, -2328946, 1344325, 13821742, 12690018, 10640781, 6190659, -13319230, -14397267, 11162083, 1585917, 5163088, 3802657, -10380399, 16044924, 9853192, 6342593, --7121056, -9433359, -6886980, 9324374, 989990, 64425, 4956929, 2455111, 5215701, -4640712, -13996225, 7420093, -1591822, -2273648, 3075734, 2865817, 1635309, -818728, -942745, 1332514, --306016, -222801, -5918465, 368830, -3456912, 236223, 1770063, 671626, -440234, 54761, -1068373, 1043140, -5639292, -1445257, 1876364, -1581085, -2259153, -105227, 653909, 943282, -984621, -777389, -1243930, 993748, -2517388, -4086125, -1138166, -988379, -1443646, 797253, --421444, 3712999, 1621350, -1440962, 1515587, -820876, 7124814, 13223131, 14324253, 5861020, -10020696, 8119099, 4846334, -2623151, 1069984, -3912178, 330176, -1351841, -8662412, 11023034, -17486422, 6968585, -4791036, 7836705, 7447474, -310311, 4622996, -8257612, -15911780, -10589779, --7247221, 4594542, -1933272, -8320426, 6205154, -2867428, -7443715, -104690, 12879533, 6482180, -9540196, 3330747, 7021198, 7793218, -1795833, 7135552, -2789581, -8192650, 3442416, -9485972, -3526168, 3749507, -13933411, -9066676, 5702643, 14409615, -7487739, 10034654, 14026826, -11624866, -471373, 12774843, 1376000, -4701916, -1086090, -6590628, -11482058, 111669, -3492345, -6048925, -7873212, 364535, -13143674, 16796006, -6968585, 13614509, -16164109, -11077794, 7870528, -9968082, -5465346, -6717866, -4895726, -9368934, -5738613, -7636989, -19086298, 3095598, 11610907, -5424544, --903017, 8025147, 8573292, 6063957, -1249299, -755377, -4990752, -1609539, -2225867, -2649458, -1988570, -592169, -1877438, 2720862, 2455648, -1270774, -326954, -3496104, 1414118, -3089692, --5549635, -475131, 5013838, -52613, -2949569, -858993, 8333847, 4115116, 191663, -2638184, --3159485, -2347200, 409096, 464930, -2674154, -1080721, -11811, 872415, 3245385, 678068, -5182952, 3053185, 3676492, 1315334, 1577327, -921271, 420907, -12042015, 7776039, -5239860, --12796855, 18496814, 9699647, -13150653, 9432822, 8324184, 2611877, 15580531, -31925028, 2246268, -13374528, 4464082, 1372779, 13937169, 738198, 7598334, -18377092, -2576444, 5250598, 163746, --9099962, 3552475, 7669201, 3541738, 3737695, 9824201, 8434242, 13079786, 10538776, -4132296, --4025458, 10103911, -6058052, 7064685, -11323144, -6339372, -14542759, -6796786, 8342437, 2763812, --3195456, 12048457, -14177687, -19510962, -31252866, 9687299, 11077794, 8435853, 6863358, -7504919, -5213554, -4391604, 12095165, 31657130, -4734128, -6782290, -13601625, -4473209, 12097312, -8193724, -7022272, 11612518, 2119566, -355409, -9012989, -2765422, 4580583, -22092774, -20109036, 1941862, -2956548, -7908646, 11359115, 8417062, 16259672, 25884694, 10559714, -6147709, -2960306, 5374078, -60666, -14452565, 7020661, 5899138, 5325760, 1578937, 6884296, -397821, 3903589, 2949569, -2267743, -3394098, 474057, -474057, -243203, 5175436, 1784022, -233002, 2985002, -5849746, -1836635, 862752, -510027, 5447629, 1322313, -1808718, -743029, -3641596, 10169409, 486942, -1922535, 4000762, -1252520, -1670205, 5822365, -6262599, 5792837, -4633733, 4840428, -505196, --172872, -1270774, 2104534, -1130650, 4998268, -4128001, -1389959, 1261647, -651224, -1555852, --2774549, 3268470, 47640316, 26867168, 17199734, -4437775, -4800700, -636192, -4005057, -4940823, --7332583, -8938901, -15220290, 632971, -1028108, 3688303, 6710887, 12645457, 19242528, -2605972, --24914032, -9801115, 21481278, -3380676, 8083666, -2814814, -307090, 14236206, 4997195, 10801306, -6431177, -486405, -590021, -239981, 7262253, 9170292, -3519189, -14101988, 18471580, 13159780, -9431748, 3412889, 4832375, -7515119, -13881334, 19160922, 10769630, 4904853, -8851391, -9946607, --13849122, -8600672, -2415382, -8736500, 4876936, -17826798, 2518462, 13090523, -8482024, 4592931, -853625, 1886028, -20245938, 7157026, -8659728, 14775761, -32551020, 5557151, -8462696, -11050951, -2760053, -6684043, 6768332, 6319508, -21184926, 192200, 14914274, 2182380, 4417374, 9303973, -3874597, 15457587, 6383395, 3239479, 1100049, -2285996, 10043244, -19756850, -313533, -1189706, --1748052, 738198, -505196, -188442, -1654099, -2939368, -3730716, 6097780, 5199595, -2735357, --379031, -9479530, 988379, -627065, -9258339, -80531, -13762149, -10540387, 4719096, 1723356, -7337415, -8250096, 3591667, 7118909, 1640141, -343597, 1916629, 3800509, 384400, -2095407, -7638063, 19864, 2525978, -4482872, -3279745, 3118146, 4603131, 769336, -29209536, -15059766, -2196339, -25735980, 5928666, 18619220, -8943733, 22640920, 26633630, 3349001, 13322989, 16370268, -7389491, -15777025, 10304163, 12482786, -584116, 3128347, 8863739, 7773891, 18804978, 3167002, --7205882, 11949136, 4329327, -1901597, 303869, 7997766, -10943040, -5001490, -4613869, 6665789, -3506304, -15516643, 4600447, 12889197, 374199, 15542413, -14709726, -27882390, 2253784, 12452184, -18918258, 17480516, 9071508, 8272644, 6688875, -18960670, -5509370, -834834, 14221174, 22397718, --7729331, 4789426, -8233453, 5263483, 3595425, 13615583, 21182242, -8201777, -9245454, -1889249, -11616813, 14842870, 20876226, 465467, -22510998, -21301964, -3445101, 2702608, 90731, -9792525, -243739, -25675852, -16518981, -15193447, -17216914, 7299297, 2667175, 20598664, 16522739, 6172405, --9850507, -9904195, -9156333, -8383240, -14300630, 6705518, 4505958, 2600066, 9650255, 10657961, -79994, 9085466, 1895691, 9705015, -3375844, 8040179, -2568927, -785442, 2419677, -3026878, -13553306, 6045167, 8053064, 3580929, 9654013, 2105071, 4636954, 13771276, 12002286, 6366752, --758599, -5356361, -4532801, -9833864, -5480379, -6474663, -3821984, -5975374, -7167764, -4205847, -4187056, 9159555, 2565169, -2215130, 344134, -1420024, 5761699, 6751689, 5651640, -654983, -2542621, 12390444, -27371826, 2492155, -5495948, 15001247, -8060043, -1233729, 4600984, 11364483, --15300821, -25682294, -4502200, -10058277, 679679, -11586211, 6786049, 6749541, 629750, -13856101, -8610873, 871342, 23111756, -3695283, 12634183, -10700374, 23867670, 6898255, 14874545, 10024991, -16231218, 23947664, -5893769, 9292162, -16813724, 17666812, 17116518, -399969, 5520644, 17299054, --11138461, -10702522, -1830730, 34827888, 5596880, -9746355, 17229262, 2257005, 13196287, 19064286, -5490042, -1299228, 1722819, 2965675, 12510703, -4415764, 13420162, -9330280, 13096429, -7307350, -29655138, -4336843, 25487946, -23210004, -25553982, 35423816, -29761976, -15900506, 1104880, -9579925, --18513456, 16170015, -2258079, -22859426, -10907069, -11754789, -33695628, -12486007, 4036733, 7520488, --26026964, -6650757, 15610059, -3172907, 8914741, 15477988, -11202885, -2564632, 2403571, 10090489, -7143605, 7603166, -2644626, -1503239, 6132140, -585726, -4310537, 3402151, 7084012, 1329292, -4875862, -192737, -4812511, -57445, 6509023, 2471217, -3560528, -8433168, -5233418, 9780714, --4687420, -13261785, 2971581, -7633768, -14564234, -41339, 5236102, 456340, -3913789, -1118839, -3763465, -3068217, -2684, 5119064, -481036, -2462090, -3299072, 9269613, 17690434, 922344, --6514392, -5284958, -3132642, -8503498, -2034204, -3595961, 3519189, -22922240, -15318538, 4492536, --30008400, -17469242, -20848308, -21173116, 25856776, -594316, 901943, 7748121, -7520488, -32934346, --24656334, -24111946, -49260052, 3626563, 5630166, 21368536, 12488691, 7456600, 10673531, 7452842, -2356327, -15472083, -22803056, -13075491, 17830020, -2151779, -13303124, -5297306, 17478370, -20940114, --13500156, -21507048, -10660646, -1730872, -20645908, 7837242, -17121888, 18760954, 13175349, -2761127, -13005698, -12542378, -25947508, 11531987, 15329812, -13309030, -29779692, 22689238, -1803886, 16480863, -13856101, -42621644, -30243012, 455803, -6779069, 28031104, -15810311, -18293340, -4786204, 10458782, -1755031, -2387465, -9513353, 37184216, -17951890, -29926796, -40531068, 29415158, -6766184, -33333242, -15848429, 16124918, 9663676, 33935072, 36308044, 37260988, 16095927, -8177081, -3149822, -5510980, -12560095, -23468776, 15511811, 3152506, 3260417, 11807402, 11468100, -9529996, 14614163, -10975252, -5089000, -15687905, -8775692, -5927592, -7943005, -3020973, -8571144, -1937030, 6472516, 17023102, -19832012, 1103270, 15647103, -8844411, 2594697, 9328669, 1604707, -16646756, 2482491, 4466229, --4283693, -12276627, -7637526, -7423314, 20648056, 12918188, 6994891, 9859097, 17519172, -2341831, --19836306, -12412455, -11183021, -14226542, -18364206, 3695819, -15301895, -27330488, -6254010, -5621039, -4532264, -27398134, -10439455, 12259984, 20846160, 41420128, 7179575, 21497386, 10918881, 10194105, --9203041, -3411278, -7800198, -23272818, -26600344, -38160784, -13441637, -34416108, -13071196, -18191870, --6344741, 17930952, 4809827, 12082817, 21829708, -340913, 14845554, 3856881, 1044751, -868657, --2541010, -29105382, 10756209, -3964792, -32166620, -20478404, 9774272, -21211232, -7703561, 7201587, -23853174, 28212030, 10233833, -6330782, 4218195, 18756122, 10524280, 3648038, -289373, -57013544, --11146514, 12136504, 14642617, 5342403, -1898376, -19487340, 13506062, -17429514, -12576738, -3750580, -3736085, -9872519, -29987462, 15763067, -3619584, 37219648, 14559939, 12451110, 14705431, 27250494, -62286152, 537945, 1298154, -3019362, -18240726, 10611254, -12586939, 44697724, -3786014, -16603270, --14334453, 18644990, -24252070, -16950626, -3004867, 38165080, 1504849, 17984638, 28719372, 5327907, -23286776, 17065516, -2988760, 15609522, 17591650, 141734, -11690901, -13246216, 3774740, 3965329, -14777372, 8928700, -446677, -2631204, 2768107, 5487895, -10652056, -2712809, -2488934, -1875290, --16815334, 10239739, -12165495, 3852586, -2349347, -7828115, 2196876, 20214264, 18220326, -426276, --1085553, -13619341, -5252208, -13542032, -1835562, -15685757, -21585968, 5892695, 15132780, 561030, -946503, 31472446, -4080219, 5537824, -34466576, -11952894, 40824200, -27289686, -7191923, -23662586, --69057168, -10056129, 21425982, 17309792, 3543885, 4817880, -3568581, 38585988, -41646152, -258235, --11871290, -28178744, -23507966, -3747896, 8105140, 6742562, 9516574, 24826522, 16412144, -17971754, --17894444, 49604188, 40869836, -3508452, 4918275, -5703717, 13421236, -435402, 29207388, 10339597, -15592342, 4106526, 2392834, -51775832, 21502754, -2464238, -29548302, -15364172, 3077344, -8250096, --29410862, 28192702, -4889821, -21287468, -4271882, 2850248, 25336012, 27980102, 21592412, 8029978, -25263534, 26610544, -20061792, -22312356, -13987098, -3862249, 26166014, 34578244, 6083285, 12300249, -33509872, 19811610, -31208306, 22886270, 8527658, -7153268, 1341640, 63988032, -42436424, 32481764, -37592776, -38001332, -2111513, -24793236, -7820599, -54481660, 15692200, 23710904, -32556388, 19426138, --28161564, -20681878, 24780888, -15662672, -2201708, -9532680, 1271310, -13859859, 4248260, 5967857, --10223633, -14838038, -1082332, -16094853, 20747376, 3412889, -19389092, 3940096, -3225521, -10875394, --10168335, 6362994, 13223131, 16232829, 6812355, -15231565, 38132332, -7387344, 3803194, -2813204, --20175608, 7357279, 10996727, -10588705, 16242493, 3789772, 12120398, -3202435, -19552838, 6213207, -29246580, -18847390, -27409944, -44365400, 8761196, -8487929, -14178761, -17938468, 9793599, -10883447, --5180805, 29199336, -9170292, -1628330, -22961432, 1880122, 14544907, -32065688, -20323786, -19179714, --9517648, 11681237, -43335684, -24050206, -62508956, 10874857, -714575, -15844671, -7042673, -9204115, -13256417, 20061792, -22261352, 850940, -7829189, -7490423, -39089572, 8596914, 29849486, 7937637, -22559316, 28452548, 25382720, -34176128, -10552198, -10306848, -16108275, 28792388, -29496762, -16930224, -937914, 41802380, 9345312, -14642617, 42004780, -23645406, -22328462, 50244140, 47998408, 4668630, -12161200, -13638132, -45650672, -13987635, 45816564, -22214644, 41518912, -14969035, -65569120, -17223892, --30703648, 34971236, 244813, 7879118, 31230318, -4940286, 25740276, -33620468, -39762808, 30604864, --8021925, -66823248, 41259604, -21223044, 11220065, 13641890, -23446226, 44467944, -30351998, 16190953, --508417, 11915850, 44913008, -11316165, -14239964, 1865090, -9393630, -12077985, -10188736, 5259188, -10079751, 2660195, -6473590, 5862631, -21432960, 19489488, 13474386, 11075110, 4270808, 366683, --10030359, -10641318, -10433012, 9343164, 17544942, -16927540, 15214922, 35762044, 11903502, -30087856, -2934000, 11403675, -11293617, -19754702, 18884434, -16676284, -389231, -1162862, -18163954, -23050552, --243203, 13660680, -7761006, 30894774, -10246181, -19816980, 14103062, 11967926, 23112292, 1726577, --41636488, 24561844, 28305446, -34397320, 18802830, -181999, -12460237, -14710263, -49646600, -21885006, -17423608, 3156264, 45530948, -36558224, -20701206, 8586176, -5047661, 29232622, -40605696, 80531, -4154307, -34264176, 34295312, 18854906, 10462003, -16037945, 23487028, -27753542, 15366856, 12010339, -7229504, -1913408, -15530065, 6512781, 31207232, -16335908, -5966784, 6180458, -24422794, 25005300, -991064, 6615860, -33461554, 18149994, 4457103, 6229313, -78541528, 10870025, -22298934, 36817532, -30452392, 32373852, 16550120, -63805496, -11159936, 13799193, 1430224, 4348118, 45081052, -6604049, --27020176, -32392106, 1396401, -36037460, -31635118, -27986544, 13626857, -52617108, 37579892, 71818832, --18693846, -8470749, -55852828, -12068321, 21565030, 13375065, -18486076, -3674882, -67579160, -23629836, -68140728, 29120416, -20946018, 20077362, -38248296, -28191092, 7669738, 1715839, 4777614, -25815974, --8843338, -5231807, 176094, -37504728, 8331700, -4600447, -11614128, 5280126, 15820512, -20344186, --10087268, -2954401, 7675644, -15549929, -3975529, -2430952, -14707042, 528281, -27450210, 36527088, -11970611, -9165460, -3368328, -10313827, -1195612, 23582592, 7271380, -3935801, 12468827, -7170448, --34172372, 1965484, 1930588, 7673496, 15671799, -8644159, -6120866, 15454366, 18568218, 8178692, --16225850, -51269024, 13932874, -22482544, -15300284, 15573551, -12560095, -18030810, 14267344, -23707146, --1460826, -27023934, 39017632, 684510, -28536300, -8425652, 644245, -2869575, 9061844, -19058380, --13218299, 4278325, 7841537, 4578972, 3801046, 14810121, -17191144, -6587406, -39505648, 14650670, -3647501, -12054363, 28458990, 15598784, -11754789, 43650288, 9596031, -27425514, 20622822, 3593277, -13379897, 28829432, -2798708, -7044283, 4373888, 23770496, 13276281, 563178, -2578591, 25432112, --2420751, -29466696, -5280663, 5488432, 23118198, -10285910, 39927088, 44373456, -28347322, 23198728, -49606872, -13389024, 75428216, 42773580, -19173808, -17149268, -28744068, -32179506, -18481244, 10164040, --5895917, -5645735, -1256815, -4824322, -53134116, -20391968, -52467320, 12322261, 46523624, -17413408, --3112241, -25356950, 12398497, 3265249, 8737037, 13161390, 38980048, -1834488, 17553532, 18352932, --29777008, 1365263, -353798, 6544994, 12612171, -1564442, -7271917, 12371653, -2110440, -6678138, -1254131, -12104828, -3237332, 9106941, 1380832, -5131949, -28533078, 1564442, -13321378, -945430, --11281268, 23716272, -8244727, 11630771, 13871134, -11126113, 16802448, 11114302, -170188, -5961952, --11134166, 2790655, -1584306, -6040872, -1454383, 11865384, -9432285, 5233955, -3658775, 8594230, -66728224, 17685602, -23957864, 2723546, -31445066, -4060355, 10974178, -12981539, -16725676, -18547280, --7087233, 7221988, -4138738, -5913633, 8457327, 4961761, 11476153, -11799886, -7473780, 8632884, --3095598, 1604170, -17368848, 11851962, -20327006, 9831180, 6699612, -4295504, -916439, 830002, --11796128, 2066416, 2402497, -9311489, 16989280, -9047349, 4115653, 188442, 596464, 8683887, --8374113, -12932147, -3905199, 19734300, -14555644, 9721122, -26697516, -15782394, 5089000, -5669894, --403190, -1656784, -16057272, 17170206, 13654775, 1355599, -11744051, -467615, -7125888, 3628711, --8898098, -163746, -8535711, 6548215, -2323041, 1799591, 21659520, -18155364, -1506997, 3374234, -1380295, -3834869, 579821, -8540006, 565862, -7134478, 4523138, 8667244, -13011603, -10731513, -6354941, 954557, -3012920, -10215580, 4567698, 1530082, -340913, -2211371, 199179, -2232846, -7327751, -4657355, -1218697, 3506304, -2299955, -238908, 5909875, -3717831, -2411087, -1330903, -1369558, 6129992, -1893007, -6564321, 555661, -4168266, 15710990, -6117644, 2075006, 3722663, --3783329, 12579422, -1607392, -10585484, 4040491, -5967857, 7840463, 3944928, -1509681, -471910, --2654827, -2743410, 7767985, -4806606, -2065342, -616865, -6382322, 8702141, -32014150, -47329464, -32984276, 151562960, 66400732, 69463576, -443992, -140291888, -101536248, -52824876, -110555680, 53674208, -65971772, 34287260, 142995568, 64288680, -6190122, 47411072, -92502320, -117978456, -67315024, -82653960, --17791366, 63887100, 65465504, 27396522, 109962976, 54550916, -7610145, 52865140, -48622252, -83513488, --47840032, -62832688, -98535136, 36286032, -793495, -35416300, 106236016, 63903208, 36060008, 108657304, -26369488, -55233816, 53630184, -78741248, -89627912, -18407156, -94270240, -95809984, 38001872, -15889232, -23294828, 120698784, 82862808, 86045376, 81384800, 9805410, -45368276, -52679384, -87928184, -115650584, --60450056, -32998770, -23736674, 44084080, 69021736, 64581276, 91729768, 82614768, -12550968, -14678588, --14654965, -84959824, -25242596, -41880228, -62860604, 14037027, 26101054, 4112431, 59032176, 26160646, -782221, 36742372, -28080496, -31283468, 1120987, -20360292, -6120866, 15292231, -2895882, 16987132, -23080080, -12629351, 18223546, 7231651, -27258546, 2546379, -12837120, -52391620, -428960, -13360570, --22001506, 50452980, 15469398, 18919330, 66676684, 26255136, 19824496, 14560476, -32525788, -48153564, --44212932, -74928928, -60845728, -27301496, 2984466, 33668248, 77463496, 81564112, 75357888, 66368520, -41458784, -16333761, -46511812, -93714040, -118250648, -91647088, -54499912, -19357954, 50539416, 92627416, -106973136, 109150152, 53195856, -12895102, -35276712, -44001404, -56310244, -40934260, -41545756, -33894808, --4146254, 10802916, 17840758, 29476360, 32159104, 29174640, 27214524, 15092515, 5302674, -2956011, --12589623, -20225000, -17219060, -10948409, -3455301, -1072668, 845035, -561567, }, +-1191317, 726386, 7012071, -891743, -344134, -2033667, 7650411, 461709, 3710315, 2278480, +2238215, -3151969, 1571421, -4888747, -552977, 3810173, 750546, 2235531, 3557307, -6040872, +-4247186, 1449552, -322123, 4499515, 2712272, -224412, -2514703, -1560147, -3106335, -483184, +-434865, -455267, 830539, 1181116, -2707440, 4507568, -1059246, -695785, 1513439, -5731097, +-1349694, 2488397, 852014, 5667210, -47782, -409096, 1079111, 390842, 2329483, 3924526, +4956929, -284005, -542240, 93952, -2895882, -3635690, 1980517, 3253975, -2311229, -2186138, +-1508607, 4147865, 2411624, -568546, 615791, -4886599, -1438814, 2542621, 2076080, 3615826, +-5287105, 1194001, 1956358, -1095754, 3674882, -238908, 3198677, 1537061, 1006096, 4097936, +2000918, 1032940, -537, 481036, -1011465, 341450, 535260, -326418, -1491427, 716186, +673773, -1082332, -186831, -732292, 725313, 1173600, 11274, -156766, -103079, -1099512, +499290, -393526, 870805, 420907, 241055, 185757, -526670, 286689, 95563, 456340, +-907312, -424665, -231391, 107374, 11616813, 3238405, -2698850, 5969468, -2916283, 6212670, +-2084133, -2784213, 3114925, 5812702, -205085, -2823404, 1516660, 1248762, -263067, -8192113, +1902671, 2447058, 635655, 5176510, 6895033, 3751654, 6790344, 4670777, 4129611, -1068373, +4589173, 2261300, -3515431, 1350230, 2110440, -4460324, -5735392, -835908, 2235531, 132607, +-2079838, -2720325, -2708514, -1290638, 3069291, 6227703, 5222680, 2023467, 4009352, -6444599, +397284, -1607928, 51540, -7402376, 2752537, -666257, -1766842, -238908, -2031520, -3631932, +-2596308, 2665564, 618475, 2057826, -2722473, 5137318, 1301912, -5832029, 2428267, 803159, +1633698, 3282429, 976568, 5976984, -1889249, 707596, -6912213, 1373853, 667867, 258235, +165893, -1240709, 4920959, -1442035, -2281702, 3793530, -3859565, -1822140, -1589675, -654446, +-1794760, 1312113, 338229, 716723, -40802, -103616, 74625, -637803, 435939, 716186, +-236760, -233002, -19327, -1208496, -2071248, 840740, 271657, -1574642, -200790, -108985, +-340376, -1920387, 531502, 65498, -42413, 212601, 370441, 293132, -732292, 48855, +-1349157, 647466, -2427194, -2303713, -836982, 2230699, -4057134, 1230508, -7945690, 1542430, +1418950, -853088, 5560372, 420907, -694711, 570157, 2913062, -4765803, 622233, 1542430, +3016678, -6806450, -3546569, -2529199, 2452426, 1093606, -2222646, -6878927, 1617055, -6842420, +-489089, 2804077, -1345399, 2150705, -1258962, 4715337, 6833830, 3708704, -3636764, 732292, +5163625, 3293166, -3299072, 2778844, 744103, -5318780, 1826972, 7460358, 3404299, 2543695, +8185671, 803159, -3196530, -6250788, -340913, -3481071, -4315906, -1950989, 4472135, -4243428, +1438277, -2507187, -2469606, 5351530, -757525, 940598, 4150549, 5807333, -2615098, -5208722, +6644852, 5213017, 3221226, 376883, -4096862, 709207, 5237713, -5311801, 1573032, -3438658, +-181462, 3347927, -3144453, -106837, -5992016, -1497870, -586263, 966905, -380105, -2176475, +-332323, 1200443, -1815161, -386010, 747324, 746251, 443992, 556198, -155693, -364535, +-2403571, 1325534, -193810, 1363652, -970663, -1471026, 479963, 1297617, -872415, 1154809, +-250719, -1074, -163209, -171262, 1234803, -686658, 439697, -693637, -15617575, -5695664, +-2417530, 8552354, -3254512, -1267552, -5058398, -4252018, -743029, -11236708, 6293738, 2100776, +-332860, -4140349, 6197101, -1730872, 3141232, -2497524, 1979980, 3977677, -4959077, 541166, +5448703, 3104725, 2188286, 5858873, 5212480, -3257196, -4189204, -5193153, -96100, -6833830, +1627256, -9032316, -1742146, 6689949, 3498251, -2274185, -712965, -6788733, 3086471, -2889439, +5996848, -3435437, -6169721, -1242319, -2546916, -5039071, 1955284, -1135482, -3229279, -3259343, +-10922639, 1517734, -3279745, -8064338, -2157684, 5015448, 2553895, -4157528, 3452080, 4472672, +4289062, 1622961, -5585068, -901943, -1242856, 3894999, -3925600, -1478006, 2033130, 2098629, +-6111739, -7245610, -13069049, -2204392, -7591355, 2529736, -295279, -1780801, 3841312, -779000, +-1749662, 1708860, 2619930, 2552284, 1957968, 4583267, -1942399, -1564979, -1228898, 704375, +229244, -997506, 1254131, 1842541, -401043, 462246, -796180, -994822, -192200, -631897, +188979, 436476, 54761, -1105417, 178778, -731218, -295279, 695248, 1467268, -608275, +1757715, 2184528, 338229, -574452, -1857573, -328565, 1251983, 879395, -13560285, -5450314, +-2414845, -4041027, 4637491, 6020471, 5710696, -11357504, -8449811, 3240553, 13828184, 8145943, +7516, 1945083, 3948686, -4986994, 3289945, -4625680, 3335579, 4883915, 768799, 3914326, +1239098, -299574, 2052994, 1187559, -3694209, -4715337, 6489159, 2602213, -4725001, 4615479, +-2574833, -505196, 11147051, -5345087, 6312528, 12428562, 5087389, -738734, 483184, -4520453, +5826660, -5977521, -3250753, -10028749, 1885491, 7682623, -193274, -7108171, -2523293, -10065793, +-5097590, -1894081, -14276471, -7798587, -1414655, 1481764, -6254010, 3134789, -1661616, -4966593, +5337034, 15745887, 1460289, 8009577, 5448703, 4695473, -5004711, 2066416, -8521752, 874026, +2435783, 1873143, -3318936, 41339, -8655433, -3046743, -3046743, -650688, 4184372, 4464619, +-218506, 1715303, 2430415, -1273995, -963683, -834297, 788663, 62277, 584116, 433792, +1357747, -770410, -70330, -2112587, -280784, -361851, 1454920, 806917, -936840, -1292248, +-1236414, -1216550, -425202, -1485522, 487479, 2619930, -2137820, -316217, 878321, 1471026, +21109228, 13502840, -7392713, 2820183, 6726993, -2718178, 3807489, -1227824, 6267968, 3288871, +1938104, 5874979, 3166465, 2955474, -1901597, -14095009, 6694781, -2320356, -3331284, 11200201, +6771553, 3933653, 5019743, 3898757, 2724083, -2076080, 1543504, 547608, -3735011, 3031173, +4700842, -7909719, 1430761, -5085778, 3727495, 4527970, -12618077, -110595, -14996952, 351114, +1757715, 1358820, 3962107, 10255308, -1346472, -5172215, -2685428, -2733210, -4021163, 3018825, +3045132, 1076963, -1758252, -1733556, 9769440, -3183108, -2081985, -5298916, 8665097, -1240172, +7264401, -3377992, 7770133, -7495792, -16062104, -4650913, 889595, 3320547, 5283347, -5280126, +-4112431, 2277943, 1327682, -2399276, -4272956, 10064719, -4016331, 9578851, 2393371, 6794639, +2525978, 4974646, 4002910, -1626182, -761820, 2008971, -399969, 5265093, 15032, -1625645, +352724, -5712844, -1270237, -1254667, 281320, -1851131, -865973, -565325, -261993, -581431, +-3168075, -2381559, 613643, 297963, -3542811, -118112, 375273, 590558, 1264331, 679679, +3229279, 236760, -1266479, -49392, -590021, -1470489, -1971927, -639950, 9893457, -3760781, +-6628745, -274341, 1014149, -9398999, -7407208, -2323577, 2527588, -1381906, 12202002, 7368017, +283468, 11708618, 4173635, 3438658, -10061498, 9415642, -1803886, -2343442, -8496519, -3803731, +7452305, 7419019, -2162516, 4923107, -10212895, -1419487, 6770479, 5146445, -3854733, -7208566, +-4110284, -4453881, -5626407, -4628901, 1048509, -7581154, -796716, 10481868, -5112622, 1210644, +-464930, -2413235, 4016331, -1673964, 6776922, 5369, 9585293, -2485176, -6162741, 3487514, +-4887136, -4773320, -4889284, -13723494, 1510755, 5667210, 8082592, 5874979, 10646150, -1113470, +-4214437, 6187974, -7714835, 1757715, 1087701, -1162862, 6860674, 6469832, -1765768, -8304320, +1559610, -4300336, -7988639, -7333657, 3929895, 7059853, 4336843, -15348603, 3350611, 1606855, +-868657, 7202124, 3794604, 5887327, 2128693, -603443, 7650948, 1013075, 3413425, 2788508, +498753, -3518115, 451508, -1977296, -4387309, 777389, 1175747, 1990181, -634045, 513785, +353798, 338229, 1392643, 949725, 919123, -202400, -2827699, 1865090, -1224066, -1255204, +-1151051, -1964948, 3380676, 3933116, 3236258, 1314797, 228170, 529892, -958315, 2574296, +-12070469, -7066295, 1275068, -6895033, -17866528, 13540958, -295816, -887448, 1716376, 1072668, +-11815992, 8268349, -12318503, 1102196, 5639292, -1616518, 2057826, 1992865, -13251585, -4457639, +-5900212, -1220845, 2729452, -4349728, -2755222, -530428, -768262, 1222992, 5560909, 2979634, +11944304, -4320200, 16390669, -1137093, 462246, -10697690, -1570347, 7968775, -1560684, -16458315, +6671695, 7667054, -4878009, 4061429, -6128919, 11424076, 6339909, -313533, -645856, -7313793, +-4645544, -8004746, 7536057, 7419019, 3287798, 855772, 3413425, -6451041, -16962436, -6204081, +5993627, 2622078, -12568148, 329639, 1531156, 1737314, -6003291, 4348118, 9001715, 4635344, +235686, 3637301, 6213744, -3468186, 9229348, 154082, -184684, -9081708, -11548630, 7468412, +-3474629, 3707631, 3839701, -627602, -2417530, -2541010, -1868848, 1183800, -2780991, 3763465, +952409, -1049583, 1043140, -1348620, 238908, -4756677, 1280974, 355945, -731218, -2660732, +986769, -2358474, -25770, 731218, -377957, -1557463, 81604, -1564442, 5850819, 4332549, +1747515, -704375, -369904, -1697049, 158377, -696322, 3795141, -1278827, -358093, 3451543, +956167, 1410897, 2702608, -1851668, -827318, 2559264, 1724429, -796716, -257698, -18791556, +10087804, -2531346, 3687230, -5536213, -3088618, 7958038, -9207873, 8944269, -5586679, -10648298, +4794257, -5721434, 22731652, 3419331, -8012262, -11034308, -2037962, -13692893, -6359773, -14751065, +-923955, 9916006, -7063611, 6128919, 9920838, -9217000, -26307, -10763725, 5996311, 2159832, +-457414, 6390375, -6793565, -9651328, -8239895, 588411, 1760400, 8158827, -11775727, 8363375, +1565516, -17267916, -9583146, -13932874, -5801964, 5330055, -4776004, -4633196, -26640072, -528818, +-5906654, -2408403, -17115982, -5909338, -2328946, 1344325, 13821742, 12690018, 10640781, 6190659, +13319230, -14397267, 11162083, 1585917, 5163088, 3802657, -10380399, 16044924, 9853192, 6342593, +-7121056, -9433359, -6886980, 9324374, 989990, 64425, 4956929, 2455111, 5215701, -4640712, +13996225, 7420093, -1591822, -2273648, 3075734, 2865817, 1635309, -818728, -942745, 1332514, +-306016, -222801, -5918465, 368830, -3456912, 236223, 1770063, 671626, -440234, 54761, +1068373, 1043140, -5639292, -1445257, 1876364, -1581085, -2259153, -105227, 653909, 943282, +984621, -777389, -1243930, 993748, -2517388, -4086125, -1138166, -988379, -1443646, 797253, +-421444, 3712999, 1621350, -1440962, 1515587, -820876, 7124814, 13223131, 14324253, 5861020, +10020696, 8119099, 4846334, -2623151, 1069984, -3912178, 330176, -1351841, -8662412, 11023034, +17486422, 6968585, -4791036, 7836705, 7447474, -310311, 4622996, -8257612, -15911780, -10589779, +-7247221, 4594542, -1933272, -8320426, 6205154, -2867428, -7443715, -104690, 12879533, 6482180, +9540196, 3330747, 7021198, 7793218, -1795833, 7135552, -2789581, -8192650, 3442416, -9485972, +3526168, 3749507, -13933411, -9066676, 5702643, 14409615, -7487739, 10034654, 14026826, -11624866, +471373, 12774843, 1376000, -4701916, -1086090, -6590628, -11482058, 111669, -3492345, -6048925, +7873212, 364535, -13143674, 16796006, -6968585, 13614509, -16164109, -11077794, 7870528, -9968082, +5465346, -6717866, -4895726, -9368934, -5738613, -7636989, -19086298, 3095598, 11610907, -5424544, +-903017, 8025147, 8573292, 6063957, -1249299, -755377, -4990752, -1609539, -2225867, -2649458, +1988570, -592169, -1877438, 2720862, 2455648, -1270774, -326954, -3496104, 1414118, -3089692, +-5549635, -475131, 5013838, -52613, -2949569, -858993, 8333847, 4115116, 191663, -2638184, +-3159485, -2347200, 409096, 464930, -2674154, -1080721, -11811, 872415, 3245385, 678068, +5182952, 3053185, 3676492, 1315334, 1577327, -921271, 420907, -12042015, 7776039, -5239860, +-12796855, 18496814, 9699647, -13150653, 9432822, 8324184, 2611877, 15580531, -31925028, 2246268, +13374528, 4464082, 1372779, 13937169, 738198, 7598334, -18377092, -2576444, 5250598, 163746, +-9099962, 3552475, 7669201, 3541738, 3737695, 9824201, 8434242, 13079786, 10538776, -4132296, +-4025458, 10103911, -6058052, 7064685, -11323144, -6339372, -14542759, -6796786, 8342437, 2763812, +-3195456, 12048457, -14177687, -19510962, -31252866, 9687299, 11077794, 8435853, 6863358, -7504919, +5213554, -4391604, 12095165, 31657130, -4734128, -6782290, -13601625, -4473209, 12097312, -8193724, +7022272, 11612518, 2119566, -355409, -9012989, -2765422, 4580583, -22092774, -20109036, 1941862, +2956548, -7908646, 11359115, 8417062, 16259672, 25884694, 10559714, -6147709, -2960306, 5374078, +60666, -14452565, 7020661, 5899138, 5325760, 1578937, 6884296, -397821, 3903589, 2949569, +2267743, -3394098, 474057, -474057, -243203, 5175436, 1784022, -233002, 2985002, -5849746, +1836635, 862752, -510027, 5447629, 1322313, -1808718, -743029, -3641596, 10169409, 486942, +1922535, 4000762, -1252520, -1670205, 5822365, -6262599, 5792837, -4633733, 4840428, -505196, +-172872, -1270774, 2104534, -1130650, 4998268, -4128001, -1389959, 1261647, -651224, -1555852, +-2774549, 3268470, 47640316, 26867168, 17199734, -4437775, -4800700, -636192, -4005057, -4940823, +-7332583, -8938901, -15220290, 632971, -1028108, 3688303, 6710887, 12645457, 19242528, -2605972, +-24914032, -9801115, 21481278, -3380676, 8083666, -2814814, -307090, 14236206, 4997195, 10801306, +6431177, -486405, -590021, -239981, 7262253, 9170292, -3519189, -14101988, 18471580, 13159780, +9431748, 3412889, 4832375, -7515119, -13881334, 19160922, 10769630, 4904853, -8851391, -9946607, +-13849122, -8600672, -2415382, -8736500, 4876936, -17826798, 2518462, 13090523, -8482024, 4592931, +853625, 1886028, -20245938, 7157026, -8659728, 14775761, -32551020, 5557151, -8462696, -11050951, +2760053, -6684043, 6768332, 6319508, -21184926, 192200, 14914274, 2182380, 4417374, 9303973, +3874597, 15457587, 6383395, 3239479, 1100049, -2285996, 10043244, -19756850, -313533, -1189706, +-1748052, 738198, -505196, -188442, -1654099, -2939368, -3730716, 6097780, 5199595, -2735357, +-379031, -9479530, 988379, -627065, -9258339, -80531, -13762149, -10540387, 4719096, 1723356, +7337415, -8250096, 3591667, 7118909, 1640141, -343597, 1916629, 3800509, 384400, -2095407, +7638063, 19864, 2525978, -4482872, -3279745, 3118146, 4603131, 769336, -29209536, -15059766, +2196339, -25735980, 5928666, 18619220, -8943733, 22640920, 26633630, 3349001, 13322989, 16370268, +7389491, -15777025, 10304163, 12482786, -584116, 3128347, 8863739, 7773891, 18804978, 3167002, +-7205882, 11949136, 4329327, -1901597, 303869, 7997766, -10943040, -5001490, -4613869, 6665789, +3506304, -15516643, 4600447, 12889197, 374199, 15542413, -14709726, -27882390, 2253784, 12452184, +18918258, 17480516, 9071508, 8272644, 6688875, -18960670, -5509370, -834834, 14221174, 22397718, +-7729331, 4789426, -8233453, 5263483, 3595425, 13615583, 21182242, -8201777, -9245454, -1889249, +11616813, 14842870, 20876226, 465467, -22510998, -21301964, -3445101, 2702608, 90731, -9792525, +243739, -25675852, -16518981, -15193447, -17216914, 7299297, 2667175, 20598664, 16522739, 6172405, +-9850507, -9904195, -9156333, -8383240, -14300630, 6705518, 4505958, 2600066, 9650255, 10657961, +79994, 9085466, 1895691, 9705015, -3375844, 8040179, -2568927, -785442, 2419677, -3026878, +13553306, 6045167, 8053064, 3580929, 9654013, 2105071, 4636954, 13771276, 12002286, 6366752, +-758599, -5356361, -4532801, -9833864, -5480379, -6474663, -3821984, -5975374, -7167764, -4205847, +4187056, 9159555, 2565169, -2215130, 344134, -1420024, 5761699, 6751689, 5651640, -654983, +2542621, 12390444, -27371826, 2492155, -5495948, 15001247, -8060043, -1233729, 4600984, 11364483, +-15300821, -25682294, -4502200, -10058277, 679679, -11586211, 6786049, 6749541, 629750, -13856101, +8610873, 871342, 23111756, -3695283, 12634183, -10700374, 23867670, 6898255, 14874545, 10024991, +16231218, 23947664, -5893769, 9292162, -16813724, 17666812, 17116518, -399969, 5520644, 17299054, +-11138461, -10702522, -1830730, 34827888, 5596880, -9746355, 17229262, 2257005, 13196287, 19064286, +5490042, -1299228, 1722819, 2965675, 12510703, -4415764, 13420162, -9330280, 13096429, -7307350, +29655138, -4336843, 25487946, -23210004, -25553982, 35423816, -29761976, -15900506, 1104880, -9579925, +-18513456, 16170015, -2258079, -22859426, -10907069, -11754789, -33695628, -12486007, 4036733, 7520488, +-26026964, -6650757, 15610059, -3172907, 8914741, 15477988, -11202885, -2564632, 2403571, 10090489, +7143605, 7603166, -2644626, -1503239, 6132140, -585726, -4310537, 3402151, 7084012, 1329292, +4875862, -192737, -4812511, -57445, 6509023, 2471217, -3560528, -8433168, -5233418, 9780714, +-4687420, -13261785, 2971581, -7633768, -14564234, -41339, 5236102, 456340, -3913789, -1118839, +3763465, -3068217, -2684, 5119064, -481036, -2462090, -3299072, 9269613, 17690434, 922344, +-6514392, -5284958, -3132642, -8503498, -2034204, -3595961, 3519189, -22922240, -15318538, 4492536, +-30008400, -17469242, -20848308, -21173116, 25856776, -594316, 901943, 7748121, -7520488, -32934346, +-24656334, -24111946, -49260052, 3626563, 5630166, 21368536, 12488691, 7456600, 10673531, 7452842, +2356327, -15472083, -22803056, -13075491, 17830020, -2151779, -13303124, -5297306, 17478370, -20940114, +-13500156, -21507048, -10660646, -1730872, -20645908, 7837242, -17121888, 18760954, 13175349, -2761127, +13005698, -12542378, -25947508, 11531987, 15329812, -13309030, -29779692, 22689238, -1803886, 16480863, +13856101, -42621644, -30243012, 455803, -6779069, 28031104, -15810311, -18293340, -4786204, 10458782, +1755031, -2387465, -9513353, 37184216, -17951890, -29926796, -40531068, 29415158, -6766184, -33333242, +15848429, 16124918, 9663676, 33935072, 36308044, 37260988, 16095927, -8177081, -3149822, -5510980, +12560095, -23468776, 15511811, 3152506, 3260417, 11807402, 11468100, -9529996, 14614163, -10975252, +5089000, -15687905, -8775692, -5927592, -7943005, -3020973, -8571144, -1937030, 6472516, 17023102, +19832012, 1103270, 15647103, -8844411, 2594697, 9328669, 1604707, -16646756, 2482491, 4466229, +-4283693, -12276627, -7637526, -7423314, 20648056, 12918188, 6994891, 9859097, 17519172, -2341831, +-19836306, -12412455, -11183021, -14226542, -18364206, 3695819, -15301895, -27330488, -6254010, -5621039, +4532264, -27398134, -10439455, 12259984, 20846160, 41420128, 7179575, 21497386, 10918881, 10194105, +-9203041, -3411278, -7800198, -23272818, -26600344, -38160784, -13441637, -34416108, -13071196, -18191870, +-6344741, 17930952, 4809827, 12082817, 21829708, -340913, 14845554, 3856881, 1044751, -868657, +-2541010, -29105382, 10756209, -3964792, -32166620, -20478404, 9774272, -21211232, -7703561, 7201587, +23853174, 28212030, 10233833, -6330782, 4218195, 18756122, 10524280, 3648038, -289373, -57013544, +-11146514, 12136504, 14642617, 5342403, -1898376, -19487340, 13506062, -17429514, -12576738, -3750580, +3736085, -9872519, -29987462, 15763067, -3619584, 37219648, 14559939, 12451110, 14705431, 27250494, +62286152, 537945, 1298154, -3019362, -18240726, 10611254, -12586939, 44697724, -3786014, -16603270, +-14334453, 18644990, -24252070, -16950626, -3004867, 38165080, 1504849, 17984638, 28719372, 5327907, +23286776, 17065516, -2988760, 15609522, 17591650, 141734, -11690901, -13246216, 3774740, 3965329, +14777372, 8928700, -446677, -2631204, 2768107, 5487895, -10652056, -2712809, -2488934, -1875290, +-16815334, 10239739, -12165495, 3852586, -2349347, -7828115, 2196876, 20214264, 18220326, -426276, +-1085553, -13619341, -5252208, -13542032, -1835562, -15685757, -21585968, 5892695, 15132780, 561030, +946503, 31472446, -4080219, 5537824, -34466576, -11952894, 40824200, -27289686, -7191923, -23662586, +-69057168, -10056129, 21425982, 17309792, 3543885, 4817880, -3568581, 38585988, -41646152, -258235, +-11871290, -28178744, -23507966, -3747896, 8105140, 6742562, 9516574, 24826522, 16412144, -17971754, +-17894444, 49604188, 40869836, -3508452, 4918275, -5703717, 13421236, -435402, 29207388, 10339597, +15592342, 4106526, 2392834, -51775832, 21502754, -2464238, -29548302, -15364172, 3077344, -8250096, +-29410862, 28192702, -4889821, -21287468, -4271882, 2850248, 25336012, 27980102, 21592412, 8029978, +25263534, 26610544, -20061792, -22312356, -13987098, -3862249, 26166014, 34578244, 6083285, 12300249, +33509872, 19811610, -31208306, 22886270, 8527658, -7153268, 1341640, 63988032, -42436424, 32481764, +37592776, -38001332, -2111513, -24793236, -7820599, -54481660, 15692200, 23710904, -32556388, 19426138, +-28161564, -20681878, 24780888, -15662672, -2201708, -9532680, 1271310, -13859859, 4248260, 5967857, +-10223633, -14838038, -1082332, -16094853, 20747376, 3412889, -19389092, 3940096, -3225521, -10875394, +-10168335, 6362994, 13223131, 16232829, 6812355, -15231565, 38132332, -7387344, 3803194, -2813204, +-20175608, 7357279, 10996727, -10588705, 16242493, 3789772, 12120398, -3202435, -19552838, 6213207, +29246580, -18847390, -27409944, -44365400, 8761196, -8487929, -14178761, -17938468, 9793599, -10883447, +-5180805, 29199336, -9170292, -1628330, -22961432, 1880122, 14544907, -32065688, -20323786, -19179714, +-9517648, 11681237, -43335684, -24050206, -62508956, 10874857, -714575, -15844671, -7042673, -9204115, +13256417, 20061792, -22261352, 850940, -7829189, -7490423, -39089572, 8596914, 29849486, 7937637, +22559316, 28452548, 25382720, -34176128, -10552198, -10306848, -16108275, 28792388, -29496762, -16930224, +937914, 41802380, 9345312, -14642617, 42004780, -23645406, -22328462, 50244140, 47998408, 4668630, +12161200, -13638132, -45650672, -13987635, 45816564, -22214644, 41518912, -14969035, -65569120, -17223892, +-30703648, 34971236, 244813, 7879118, 31230318, -4940286, 25740276, -33620468, -39762808, 30604864, +-8021925, -66823248, 41259604, -21223044, 11220065, 13641890, -23446226, 44467944, -30351998, 16190953, +-508417, 11915850, 44913008, -11316165, -14239964, 1865090, -9393630, -12077985, -10188736, 5259188, +10079751, 2660195, -6473590, 5862631, -21432960, 19489488, 13474386, 11075110, 4270808, 366683, +-10030359, -10641318, -10433012, 9343164, 17544942, -16927540, 15214922, 35762044, 11903502, -30087856, +2934000, 11403675, -11293617, -19754702, 18884434, -16676284, -389231, -1162862, -18163954, -23050552, +-243203, 13660680, -7761006, 30894774, -10246181, -19816980, 14103062, 11967926, 23112292, 1726577, +-41636488, 24561844, 28305446, -34397320, 18802830, -181999, -12460237, -14710263, -49646600, -21885006, +17423608, 3156264, 45530948, -36558224, -20701206, 8586176, -5047661, 29232622, -40605696, 80531, +4154307, -34264176, 34295312, 18854906, 10462003, -16037945, 23487028, -27753542, 15366856, 12010339, +7229504, -1913408, -15530065, 6512781, 31207232, -16335908, -5966784, 6180458, -24422794, 25005300, +991064, 6615860, -33461554, 18149994, 4457103, 6229313, -78541528, 10870025, -22298934, 36817532, +30452392, 32373852, 16550120, -63805496, -11159936, 13799193, 1430224, 4348118, 45081052, -6604049, +-27020176, -32392106, 1396401, -36037460, -31635118, -27986544, 13626857, -52617108, 37579892, 71818832, +-18693846, -8470749, -55852828, -12068321, 21565030, 13375065, -18486076, -3674882, -67579160, -23629836, +68140728, 29120416, -20946018, 20077362, -38248296, -28191092, 7669738, 1715839, 4777614, -25815974, +-8843338, -5231807, 176094, -37504728, 8331700, -4600447, -11614128, 5280126, 15820512, -20344186, +-10087268, -2954401, 7675644, -15549929, -3975529, -2430952, -14707042, 528281, -27450210, 36527088, +11970611, -9165460, -3368328, -10313827, -1195612, 23582592, 7271380, -3935801, 12468827, -7170448, +-34172372, 1965484, 1930588, 7673496, 15671799, -8644159, -6120866, 15454366, 18568218, 8178692, +-16225850, -51269024, 13932874, -22482544, -15300284, 15573551, -12560095, -18030810, 14267344, -23707146, +-1460826, -27023934, 39017632, 684510, -28536300, -8425652, 644245, -2869575, 9061844, -19058380, +-13218299, 4278325, 7841537, 4578972, 3801046, 14810121, -17191144, -6587406, -39505648, 14650670, +3647501, -12054363, 28458990, 15598784, -11754789, 43650288, 9596031, -27425514, 20622822, 3593277, +13379897, 28829432, -2798708, -7044283, 4373888, 23770496, 13276281, 563178, -2578591, 25432112, +-2420751, -29466696, -5280663, 5488432, 23118198, -10285910, 39927088, 44373456, -28347322, 23198728, +49606872, -13389024, 75428216, 42773580, -19173808, -17149268, -28744068, -32179506, -18481244, 10164040, +-5895917, -5645735, -1256815, -4824322, -53134116, -20391968, -52467320, 12322261, 46523624, -17413408, +-3112241, -25356950, 12398497, 3265249, 8737037, 13161390, 38980048, -1834488, 17553532, 18352932, +-29777008, 1365263, -353798, 6544994, 12612171, -1564442, -7271917, 12371653, -2110440, -6678138, +1254131, -12104828, -3237332, 9106941, 1380832, -5131949, -28533078, 1564442, -13321378, -945430, +-11281268, 23716272, -8244727, 11630771, 13871134, -11126113, 16802448, 11114302, -170188, -5961952, +-11134166, 2790655, -1584306, -6040872, -1454383, 11865384, -9432285, 5233955, -3658775, 8594230, +66728224, 17685602, -23957864, 2723546, -31445066, -4060355, 10974178, -12981539, -16725676, -18547280, +-7087233, 7221988, -4138738, -5913633, 8457327, 4961761, 11476153, -11799886, -7473780, 8632884, +-3095598, 1604170, -17368848, 11851962, -20327006, 9831180, 6699612, -4295504, -916439, 830002, +-11796128, 2066416, 2402497, -9311489, 16989280, -9047349, 4115653, 188442, 596464, 8683887, +-8374113, -12932147, -3905199, 19734300, -14555644, 9721122, -26697516, -15782394, 5089000, -5669894, +-403190, -1656784, -16057272, 17170206, 13654775, 1355599, -11744051, -467615, -7125888, 3628711, +-8898098, -163746, -8535711, 6548215, -2323041, 1799591, 21659520, -18155364, -1506997, 3374234, +1380295, -3834869, 579821, -8540006, 565862, -7134478, 4523138, 8667244, -13011603, -10731513, +6354941, 954557, -3012920, -10215580, 4567698, 1530082, -340913, -2211371, 199179, -2232846, +7327751, -4657355, -1218697, 3506304, -2299955, -238908, 5909875, -3717831, -2411087, -1330903, +1369558, 6129992, -1893007, -6564321, 555661, -4168266, 15710990, -6117644, 2075006, 3722663, +-3783329, 12579422, -1607392, -10585484, 4040491, -5967857, 7840463, 3944928, -1509681, -471910, +-2654827, -2743410, 7767985, -4806606, -2065342, -616865, -6382322, 8702141, -32014150, -47329464, +32984276, 151562960, 66400732, 69463576, -443992, -140291888, -101536248, -52824876, -110555680, 53674208, +65971772, 34287260, 142995568, 64288680, -6190122, 47411072, -92502320, -117978456, -67315024, -82653960, +-17791366, 63887100, 65465504, 27396522, 109962976, 54550916, -7610145, 52865140, -48622252, -83513488, +-47840032, -62832688, -98535136, 36286032, -793495, -35416300, 106236016, 63903208, 36060008, 108657304, +26369488, -55233816, 53630184, -78741248, -89627912, -18407156, -94270240, -95809984, 38001872, -15889232, +23294828, 120698784, 82862808, 86045376, 81384800, 9805410, -45368276, -52679384, -87928184, -115650584, +-60450056, -32998770, -23736674, 44084080, 69021736, 64581276, 91729768, 82614768, -12550968, -14678588, +-14654965, -84959824, -25242596, -41880228, -62860604, 14037027, 26101054, 4112431, 59032176, 26160646, +782221, 36742372, -28080496, -31283468, 1120987, -20360292, -6120866, 15292231, -2895882, 16987132, +23080080, -12629351, 18223546, 7231651, -27258546, 2546379, -12837120, -52391620, -428960, -13360570, +-22001506, 50452980, 15469398, 18919330, 66676684, 26255136, 19824496, 14560476, -32525788, -48153564, +-44212932, -74928928, -60845728, -27301496, 2984466, 33668248, 77463496, 81564112, 75357888, 66368520, +41458784, -16333761, -46511812, -93714040, -118250648, -91647088, -54499912, -19357954, 50539416, 92627416, +106973136, 109150152, 53195856, -12895102, -35276712, -44001404, -56310244, -40934260, -41545756, -33894808, +-4146254, 10802916, 17840758, 29476360, 32159104, 29174640, 27214524, 15092515, 5302674, -2956011, +-12589623, -20225000, -17219060, -10948409, -3455301, -1072668, 845035, -561567, }, }, { { 4808753, -2767033, -4361540, -995359, -1613297, -139586, 6528887, 375273, -2796024, 3442416, 699543, -352187, 1146756, 723702, 55835, 4913443, 2767033, -3324305, -1284195, -381178, -1170916, -1378685, 2094333, 1409286, -1427003, -2123325, 813896, -4277788, -1948841, 3213709, 279173, -2587718, 1320703, -2086817, 1577864, 28454, -1846299, 4512400, -3022583, -1418950, 572304, -1552631, -2068027, -542240, -2968359, -5867462, 5485210, -1100585, -3064459, 323733, 5042292, -5369, 1948305, -2508261, -1471563, -1034550, 1546188, -1983738, 4031364, 637803, 3636764, --5286568, 2231773, -1373853, 878858, 2245731, -916976, -588947, -3911642, 27380, 2106682, -479426, -1094143, -184147, 1874216, -994822, -1046898, 2962991, -1357747, 940598, -569620, --177704, -3652870, -1498407, -1001264, 1330903, -280247, -1625645, -287763, -331249, -1032940, -970126, -1234803, 80531, 266288, 623844, 980326, -433255, -892816, 928250, 177167, --668941, 111132, 1581622, -223875, -153008, 621697, 54761, 199716, 256624, -496606, --856846, -504122, 676994, -174483, 76236, 317828, -459025, 425202, 10737, -295279, -13784161, 4725538, -1090922, 3732327, 190589, 6801081, 4273493, -954020, 3496640, 6106907, -7987566, -4714801, -4614406, 1962800, -1861868, -1542967, 5711770, 4616553, 4396973, 3139084, -591095, -179852, -1994476, 2179696, 1522029, 7276749, 736050, -157303, -3218541, 1515050, -2130841, -414464, -992137, -1138166, 1973001, -288300, -1173600, -2664490, 2825552, -948114, --956704, 4018479, 5700496, -1469953, -699543, 3296924, 2949569, 5223217, 3235184, 1435593, -536871, 4447439, 2515777, -6131066, 5369, 1882269, -3533684, 92342, 576599, -4373888, -2226404, -2123861, 3278671, -707059, -567473, 1764695, 566399, -3017215, -270583, 1675574, --594316, -746787, -877247, 325344, 3488587, 615791, -3515968, -835908, 824634, -1048509, --448824, 5163088, -1047972, 627602, -607201, -1321239, 1165547, 1920387, -499827, 872415, -938450, -957241, 454193, 858993, 198642, -637266, -1815697, -564251, -1093606, -508417, --134218, 574989, -339302, 692027, 377420, -158377, 4769025, -371515, -9002251, -4190814, --1746441, -1948305, -4900021, -4501126, -2826089, 4879083, -5360656, -2503429, -2545305, 981400, -8140037, -1221918, -645319, 1990717, 4659503, -7123204, -1160715, 1453846, -3143379, 2515240, -3984119, -4392141, -269509, 566399, -2552284, -6465000, 1126892, -2721936, 878858, -2506114, -3702799, -4463545, -4164508, -10260677, -2763275, 3528853, -569620, -3936875, -1937030, -494995, --4123706, 208306, -692027, 2835752, 2246268, -1062468, 132607, -1049583, -4352950, 5320928, -931471, 3596498, -1315871, 13422, 940598, 1556389, 4126390, -1320166, -990527, 1219234, --111132, 4499515, 2410014, -3889630, -1538135, -970126, -6153078, -692027, -576063, 3664144, --2354179, 3339337, 580357, -116501, -336081, -587874, -658204, 712428, -2478196, 1154809, --1425929, 1255204, 1078037, 483184, 315143, 3586835, 2639794, -658741, 3273302, -443455, --1091459, -1037235, 647466, -233539, 2243584, -578210, 1404454, 1133335, -189515, 950262, -8590, 995359, 993748, 288300, 347892, 1077500, 728534, -1473711, -801011, -155156, -1825361, 2021319, 16643, -214748, 1108638, -19805168, -6204081, -1748589, -1602560, -1653562, -7642895, -7051800, 3391951, -1642825, 1549410, -2011655, -1642825, -5675800, 926102, -2065879, -423054, -8240432, 158377, -836445, -1484985, -125628, 1541356, 1258962, -790274, -554588, --3316252, 1031329, -2664490, 1758252, -13422, 1503775, 5140002, -1335198, -5912560, -2510409, --6921877, 971200, 1234266, -610959, 1184874, -2397666, 2303176, 1207423, -3073049, 282394, --8319352, -1752347, -5568425, 3060164, 5481452, -4819490, -391916, 1597191, 830539, -7902740, -1309965, 4097399, -3817689, -1787243, -9055939, 3094524, -1320703, 3764539, 6686727, 3846680, --5397700, 1169842, 1260573, 325881, -6000070, 1577864, -2565169, 4019016, -1624035, -158914, -1858647, 1661079, 4699768, 5397164, 3654480, -233539, 1344325, 3233037, 1603633, -3117073, --661962, -2064269, -2128156, 1009317, -101469, 562641, 42413, -579821, -186831, 1979980, --643708, -581968, 47245, -493921, -1427003, 1804960, 60130, 885837, 2114735, -205085, -229781, -1608465, 1070521, 803159, 165893, -1614371, 549756, 89657, -12217571, 1311576, -2234457, -4431333, -502511, 11948062, 9351754, 5016522, -1297617, -2211371, 6005438, 3704946, -1952063, 2224256, -4767951, 1611687, 507343, 5602248, -5337571, -2492692, -985158, 676457, --1059246, -6240051, -4167192, -4400731, -5121212, 2827162, 3503620, 2194728, 1576790, 81604, -1541893, -810675, -629213, 363998, -1837172, -566399, 2760053, 2092723, -4179003, -4734128, --399432, -4748087, 2865280, -1459752, -7943005, 938450, 4096862, 5725729, 4016868, 199179, -3797288, -5718749, -1793149, -2566780, -362925, 379031, 2589865, -1983738, -5181341, 6331319, --5730560, -2782065, 3962107, 9164386, 2203855, 1797444, -8935143, 9681930, 1191317, 6743099, -10442676, -2315524, 1140851, 1196685, -4233227, 8608188, 2047626, -2843805, 2407866, -1222455, -4283693, -7109245, -3754338, -7264401, -1381369, -3230352, 2932389, -1853815, 1262184, -3413425, --845572, -679142, -2157147, -162672, -796180, 875636, -134755, -964757, -479963, -444529, -1737851, 447213, -1284195, -2966749, 1672353, 1621887, 322123, -18254, -27917, -1240709, -542240, -835371, 1810329, 318364, 1027571, -1043677, -1168231, -2359548, 18537078, 13058848, --4655745, -6803765, 10293963, 6711960, 10834592, 15912317, -8016557, 5521718, 2668785, 4628364, -2090039, 2785823, 6597607, 1649268, 6737193, 234076, -4274566, 1817308, -1365800, 2278480, --779000, 12356621, 2105071, 2732136, 1693291, 499290, 4340065, 1846299, 272730, -784368, -3111704, -2378338, 5925981, -4597226, 7130720, -3352759, 4320200, 2257542, 2647847, 2092723, -10459319, 7986492, 519691, -2243047, -5641977, 6190659, -6881612, 1736241, -3000035, 3047279, -6553583, 789737, -10923712, -8877161, 934155, -5522791, -5974837, -3454764, -6892349, 2465311, -11989938, 6009196, -4395899, 277025, 1395328, -3139084, -3517578, -585189, 5892695, 6538014, --6928319, 3285650, 7686381, 1525250, 2534568, 3701725, 5989869, -1035624, -4078072, 1585380, --1752884, -355409, -3913789, 3615826, 5660230, 857920, 1016297, 774168, -3963718, -584116, --65498, -452045, 402116, -635655, 652835, 474057, 1938104, 190589, -35970, 165356, -1243930, 2123861, 1112933, 2248952, 1234803, 398358, 662499, -501437, -3697967, -3850438, -773631, 2797634, 717260, -863825, 681826, -518617, 1774358, -1446867, -1316408, -2425583, -1039382, 8117488, 1600949, 11772505, -994822, -185757, -3876745, -3211025, 4012036, 8899172, --2560874, 2327872, 690416, 9646497, 4060355, -4553202, -4112968, 593779, 2086817, 8763881, -8688719, 13102871, 2447058, 3619047, -2246268, 5320928, 6153615, -2401424, -2952790, 4686883, --3558381, -5068599, 4797479, 1393180, -5759551, -7181722, 10941966, 5418638, -290984, 6903086, -1432372, -4898947, 10400263, -2448131, 397821, -279710, 2763812, -3787088, 2765422, -3791919, -2695629, -3523484, 3251290, -2885144, 4393752, -3630858, -3569655, 9589588, -11940546, 655519, -1527398, -4155381, 906238, -13545790, -6545530, 6447283, -5289252, 3955665, -1332514, 2664490, -1284732, 2283849, 1534914, -6146635, 3411815, -3577171, -295279, -7802345, -4106526, -1960116, --1744831, 2212445, 7464117, 4245039, -5794985, 2279017, 1280974, 48318, -2717641, 401579, --410169, 1440962, 816581, -1502702, -1869385, -783832, -416612, -1138166, 4391604, 792421, --1479616, -908386, 1167157, -1736241, 337155, 863288, 214212, 244276, -4325569, -1803886, --954020, 693637, -1080184, -162672, 3011846, -9571335, -8298414, -1074, 3562139, 6760816, --7859254, 2289218, -7064148, 5851356, 4433480, -9641128, -2027761, 1077500, -11369315, -6416681, -6889128, -855235, -511101, 1676111, -733903, -11840688, 10846940, 742493, -7713762, -3702262, -1428077, -951872, -7413651, -2171106, -4267050, 1276142, -386010, -2309619, 2357400, -10253161, --4592931, 2712809, 13458280, -2201708, -7929584, -5546951, -4421132, 9223979, -9780714, -1899449, --689342, -10384694, -13019656, 3257196, -9026948, -1376537, 1338956, 6917582, 3828963, 621697, -1480690, 8250096, -3541738, -2495913, 12138114, -8047695, 6322192, -2719788, -3035468, -1171452, --1465658, 13023415, 303332, 5105106, -13334263, -9609452, 328028, -1865090, 14908368, 551903, -10168335, 4350802, 12715788, 7781407, -1917166, -8773008, -3315178, 6019397, 2603287, 4089346, --4897337, -5459977, -1519345, -1788854, 2646237, -1291711, -3562139, -573378, -855772, 39728, --425202, 555125, -1444183, -1903207, 2442763, -103079, 171262, -606127, -1058173, -769873, -679142, 2138894, -2150168, 561030, -1310502, -1901060, 1420024, -516470, -1814624, -2079301, --393526, 2088965, 236223, 328028, 790811, 3714610, -3055332, -2498060, -1539746, 361851, -1504849, -15947214, 1510218, -1562831, 10891500, 1270774, -11601244, 13816373, 4418985, -8105140, --17808546, -7403987, 17537962, 876710, -2259690, -2936684, 1780264, 583579, 5389110, 2873870, -5776194, -1256278, 10339060, -5348845, -12247636, 521839, 539555, -2905546, -470299, 4583804, --3163244, -1864553, -1089311, 9775882, 7562901, 3932043, -743029, -13301514, -277025, -689342, --573915, -2206003, -233002, -5816997, -10869488, -1694365, 7449621, 7269232, -2747169, 7809861, --2531346, 3378529, 8564165, 8212515, -18125836, 6222334, 6525129, 2720862, -4425964, -15874736, -9628243, 5701032, 3072512, -5654325, -3175055, -6403796, 3554622, -7104950, -1326608, 142808, -6480032, -4006131, 3298535, 1812476, -11618423, -1581085, -7765838, 12750147, 5905043, -14935212, --3171297, 11876658, 5908802, -6135361, -3073586, -6778532, -2295123, 3570192, -2073932, -789200, --2593087, -3235184, -5682242, 1138166, 454730, -1789391, -572304, 2955474, 1973538, -3550327, --1264331, 2682744, -689342, 2063732, -2357400, -1598265, -450972, 581431, 3063386, -3190624, --2288681, 1686848, -3663607, -235686, -2578591, 1629403, -2042794, 3586835, -1227824, -573378, --1796370, 2310156, 1539746, 4082367, 1271310, 9846213, 12270185, 12350715, 9648644, 12106976, --15260019, -10167798, -5196374, -5106179, -7253663, -5760088, -12229383, -4305168, 933619, 7230041, -93416, -7184407, -231391, 7221988, 456877, -6220187, -2762201, 16586627, 1717987, 6153078, -2021319, 6775848, 1499481, 2107755, -10193031, 5599564, 472446, 2236604, -10691784, 3587908, --16468515, -151398, -5154498, 3956739, -1436667, -12241731, -216359, -12186970, 2280091, -10154376, -9204115, -5337571, 14426258, 290984, -196495, 7075422, 1621350, -2435783, -2047626, 2765422, --4844186, 3226057, 8919573, 4365835, -6531572, -3616899, 19042812, 1286343, 15199352, -14207752, --2898566, -1657857, 11068668, -12421582, 1780801, 5696737, -12137041, 8338142, -7607461, 2054605, -11889006, 1104344, 6714645, 2981244, 15517717, 6522982, -6385006, -5236639, -6152541, 753767, -621697, 6325950, -3843996, -922881, 4274030, 111669, 3299609, 4269198, 638876, -3780645, -4302484, 3091840, -404264, 1135482, 1449015, -1781338, -1278827, -5284958, 3398930, -2639794, --2280628, -1205812, -2647311, 2277943, -1808718, -826244, -2843268, -914828, -656056, 3356517, -2532957, -345208, -601832, -443992, 1999844, 2218351, 2119566, 4357781, -569083, -4679904, --15323370, 2284386, 15000710, 11165841, 12264279, -4098473, -3110093, 3028489, -2088965, 15106474, -5102421, 7178501, 12792560, -958851, 4811437, -8701067, 12741020, 6313065, -3162170, -7830799, --7211787, 8486319, -14709726, 5717675, 8524973, -6206228, -8197482, -4749160, 7952669, 2910914, --2954938, -5457293, 141197, -9148280, -13630616, 2424509, -13082470, -19616726, -2425046, 683974, -19841138, -8621610, -6721624, 8740258, 14624901, 14523969, 7810935, -978179, 3417183, -6393059, -1155883, -6700149, 16342887, 14292577, 9358734, -770947, -16658031, -215822, -14224932, 15602542, -12235288, 7465190, -11807402, 9630927, 5576478, 6622840, -2193655, -10166724, -7272990, -8166344, -2739652, -11424613, -20628728, 3891777, 14011794, 7235946, 13755707, -4365835, -3776350, 13701483, -4634270, 1684164, 9235790, 2856690, 271657, 7748658, 5004711, -947040, 3631932, 3235721, -2087891, -2852395, -4562329, -6249715, 1607392, 3654480, 2248952, 7786776, 197032, 5476620, --1816771, 2098629, 4514011, 371515, -2092723, -1495186, -6678674, -5978595, 1988570, 1182190, -2632278, 6693170, 1005559, 5017596, -2029372, -1444183, 886374, -5393942, -4050154, -1775969, --4345970, 1746978, -1465658, 1352915, 3847754, 5149129, 7653095, 12665859, 26687316, 12115566, -9191230, 8915815, -16829292, -2442763, -6279242, 21429202, -21798570, -20322174, 5674726, 14042932, --590558, 17136382, 15193984, -574989, 5720897, -10024454, -7554311, 16294569, -6571837, 11244224, -3713536, -7024419, -3962644, -3029026, -3770981, -7337952, 6052683, 6845104, 5380521, 672162, --8598525, -10627360, 13728863, -13574244, 10580652, 1140314, -17131550, 8665097, 15897821, -186831, --4599910, -1906429, 1086627, 1065152, 10773925, -442919, -8491150, -3314641, 9132711, -16919486, -3890704, -2728378, 13638132, 14756434, 9538049, 11577084, 14845554, 10959146, 3710315, -9674414, --11275363, 5461051, 7123204, -409096, 6138582, 8807904, 22741852, -12847858, 14304389, -8501888, --5741298, 15921444, 2174864, -9326521, -8462696, -8597451, -14408542, -4729296, -7164543, 11453604, -42413, -8959302, 4731980, 3258270, -2171643, 5430450, -11046119, 7167227, 224949, -906775, --1399086, 6103686, 799401, 1682554, 6023692, -2503966, 784368, 4674535, -7160784, 4978404, -40802, 1914482, -3335579, 3985730, -1624571, 549756, 5099737, 110059, -1532767, 1451699, -3358665, 4631049, 7341173, 6266894, 2008434, -3432216, -3170760, -10712185, 2134599, -8911520, --2913062, -3841312, -3954591, 4327717, -17890686, -3190624, 10407243, -12841415, 405874, -8077760, --14133127, 20557324, 17569100, 14694694, 6962142, 3833258, 5779952, 15093589, 8333847, 15474230, --5730560, 12961674, -9764071, 15697032, 21075942, 13220983, 10534481, 5369783, 10881300, 10968273, --3259343, 21821118, 5237176, -13153874, 6241125, -13317620, -9163313, -2726231, -20720532, 359704, --4418448, -5614596, -10073846, -5235029, -2894271, -643171, -2044404, 903017, 865973, -11889006, --7854959, 2467996, -6280853, 4942971, 20405926, -10284836, -830539, -1935957, 754304, -9751186, -5257040, -4682588, 15796353, 3365107, 9435506, 14775224, 2522757, -977642, -9742060, -21686900, -2864743, 16149077, 11720966, -3052111, -14454176, 12182675, 1284732, 7340099, -18504866, -13283797, --12184822, -18350248, -11360725, -13424994, 6256694, 1988033, 4700842, 6127845, 8475581, -4141959, -8627516, 9808632, 312996, 5273683, -3143916, -6511171, -6699075, -7049652, -2816962, -5140539, --308164, 1548873, -673236, 463320, 1314260, -5967320, -5508296, -9447854, -3228205, -2195265, --5245229, 2070711, 792958, -2797098, -8533026, -3938485, -3142306, -2214056, 7138236, 2167348, --3100967, -3952981, -1424319, -10266582, 2810519, -2104534, 5310727, 587874, -3214783, -6065031, -6321118, 8983998, -30671436, -19676856, -9319005, 21912386, 16006269, -11907260, 13722957, 12337294, -10573136, 10302553, -10260140, 1035624, 5991480, -10253698, -30890478, -5658083, -8540542, -18973018, -1759326, -6477348, -4806606, 5793911, 3498251, -4223027, 961536, 14496051, 15558519, -28512678, -6834367, 1454383, 13247827, 4494684, 777926, -17751636, 5480915, -4546223, -4871030, -12203076, --9019968, 22856206, -10307385, -398358, 2787434, -6024766, 25333864, 12014634, -11182484, -6786049, --19704236, -2831994, 18968724, 5571110, 5789079, -6179921, 11618960, -2691871, -4907000, 10661183, --6218039, 17658758, -4061429, 13166759, -26681410, -9025874, 15420006, 3811784, -2374580, 4358318, --29521458, -13955422, 4593468, -11765526, 4619774, 1257352, 3386582, 18220862, -6697465, 7390565, --1335735, -14695231, -2459943, 11244224, 16287053, -447750, -6673306, -12438762, 455267, -17393006, --5572720, 1592896, 20669530, 18424336, 2622615, 7792145, 2429341, -2983392, 10311143, 7785165, --3910568, 8538932, 6514392, 3480534, -6939057, -396211, -3526168, 6264210, 4456029, 5586142, --302258, -8272644, 8050916, 466541, -3735548, -8048232, -220117, -548682, -7522635, 5513665, --5413270, -8783745, 10242960, -3901978, -3200288, -4377646, 2452426, 1555315, 8275865, 1898376, --1142998, 3468186, 5227512, -8885750, 2738579, 5987722, -13793287, -38021196, -3682935, -4229469, --4591320, 6287296, -15767899, 30518964, -5935645, 1722819, 32788318, -38732016, -4512400, -7282117, --4176856, -44426604, 2047089, -6577743, -9115531, 15538118, -15839303, 2700998, 2473364, 7578470, --1875827, -15993921, 10697690, -10397042, 22804128, -3689914, -26868778, -1634235, -1371168, -13013214, --27074936, 12242267, 13049721, -21968758, 17687750, -19844360, -16156056, -9351218, 1256278, 1896765, -2494839, 13129715, -2947421, -11992086, -29504814, 6174016, -39710192, -20575578, -13995688, -31163746, --19127636, -8812736, -2456185, -14508936, 21921514, 23331336, 4598300, -6734509, 24968256, 11725261, --3453691, -5535676, 17819282, 13756780, -6816113, 24496882, -20942260, -10248866, 26002806, 12693776, -36693516, -20147154, -23460186, 6123550, -17979806, 18949396, 1446867, 6720013, 34835404, -19327352, --21496312, -7511898, 6778532, 8271570, 8334921, 9255655, 9670656, -10705206, 3723200, 1863479, --1370632, -1066226, -7904351, -5628555, 9724343, -10985453, -1174137, 2455648, -6022618, 1588064, --6168110, -209917, -1231045, 2511482, -9592273, 4755066, 10529649, 3490735, 2036351, 12527883, -8411693, -689879, -12588549, 11090679, 2083596, -3959423, -9580998, 11497627, 981937, 512175, -6174016, 8938901, -12052215, 6021544, 2923799, -7960185, -4131222, -12829604, 8270497, -1736241, --14047764, -7316477, 3735548, 29721174, 17149804, -2957085, 40585832, -4849555, 16740172, -19288162, -23742042, 22069690, -1899986, -18049064, 2010582, 6272263, -9853192, 10376104, -14435922, -419833, --4351876, -4961224, -16421271, -12280922, -7405598, -1191317, -5236102, -13175886, 19427748, 13071733, -3704409, -5570573, 3414499, 18415210, 8875550, 13489955, 8719320, -10334228, -15610596, 31616864, --4038880, -17531520, -7118909, -7618735, -4028679, 22844932, 1114007, -17877802, -6645388, -44214540, --10725607, -5310727, 27277874, 18606872, -53429392, -23207318, -12899934, -407485, 2818572, -21514564, -15874736, 8290361, 13833553, 26735634, -35001836, 34250752, 24816858, -11289858, -23461258, 1385664, --5752035, 9037148, 31429496, -16324634, -18009334, 25411174, -29921426, -33743412, -13414793, 3344706, --9504763, -36961416, -14779519, -12011413, 694174, 1933809, -10427107, -826244, 1712081, 365072, -3262565, -23379118, -8069170, -7791071, 1617592, 6446209, -1613834, -7514582, -4224101, 2419677, -12006044, 12656195, -1657321, -11087458, -2761127, 16125992, 1069447, -4250407, 3479997, -21978958, --6354404, -10383083, 1555315, 3767223, -21180632, -21712670, 5509906, 18851686, -8004746, 12337830, -3910568, -6082748, -1674500, 5013838, 3884261, -1777043, 3858491, 27977416, 3863323, 10465225, --21819508, -34675956, 50068044, 24947318, 2355253, 3195993, -11161546, -29512330, 10408853, -2374043, -25318832, 5559835, 9448928, 27584964, 15385110, -397284, -2869575, 4591320, -16787954, -13960791, --17855252, -10097468, 16684874, -4634807, 1128503, 20676510, -3489661, 9020505, -28765544, -26004416, --17505750, 14891188, 6171868, -1051730, 6938520, -9265318, -25861072, 32651416, -31030602, 14238353, -14863808, 11549167, 5272073, 19728932, -12716861, -31918586, 23596014, 66597228, -11687143, 32161252, --38742216, -21049098, 24061480, 13933948, -35964984, -10266046, -2972654, 31170726, -7713762, -3510062, --48928804, -31615254, -11190000, -36106716, 30146912, 31929860, 50657528, -44937704, 19326280, 5475547, --24850144, -1574106, -1117765, -51903608, 36981280, -15518254, 17495012, -5462125, 2937758, 69902200, --18858128, 24147380, 16127065, -17131550, 30602178, -210453, -5810017, 1692217, 7952669, 19551764, -12153147, 7666517, -614180, 18488224, -17426292, -8820789, 1561758, 4471598, 8760660, -5005785, -15181636, 1817308, 6803228, -3162707, 11535745, -1193464, -16642998, 9392557, -20463372, -12402792, --4662724, 8566312, -2068564, 10268193, 24206972, 36911484, 26975616, 7109245, 17413944, -10252624, -8943196, -926639, -580894, -1887101, 3783866, -8018704, 10390063, -9882183, -44627396, -25302726, --922344, -6758668, -14957760, 5422933, 14388677, 1493038, -15808701, -793495, -15154792, 41043780, --12607876, 944356, 31110058, -1744294, -31919124, -22201222, -21817896, -9659918, -11617350, 34195992, -3541201, 5645198, 17040282, -9365176, -9545028, -5738613, -9730248, -20845624, -4901632, 39198556, -12645457, 9322763, -26047902, 9617506, 2039573, -18543522, -2166811, -9287867, 42526620, -33627984, --29038810, -10223633, 5303748, -10011032, 1295470, 11492796, -22141094, -5936182, 36025112, -29018410, -5098126, -7262253, -17649094, -30778272, -23528904, 1154809, -42876660, -51833276, 12305081, 10634339, -8324184, -46315316, 35775468, 43476344, -14759655, -12572980, 2709051, -1797444, -9800578, -24057722, -17437030, 65597572, 17022566, -16193637, 314606, 10424959, 21876416, 5936182, -38816840, -34603476, -37494528, -7171522, -15351287, -22603340, 7779260, 42874512, 13121662, -13547401, 7895224, -1658394, --7642358, -3744675, -2302639, 18973018, 10477036, -6444599, -10503343, 8589398, 4968741, -1591285, --4354023, 6943889, -10160282, 6306086, 16425029, -1510755, -9108015, -2731599, -5870147, -9949292, --18422726, 2685428, 14031658, -9397925, -11627550, 5735392, -14509473, 85899, -23591718, 11317776, -14674830, 37556804, -11977590, -5115843, -15573551, -15952582, 4483409, 8275328, 15600395, -1881733, --3405372, -15748571, 6308233, 3877819, 4699768, 9933722, 11427834, -14187888, -37455872, 10375030, -14631343, -55451784, 30376694, 1328756, -15811385, 5341329, 20236276, -28643674, 17701170, -26594974, -7184407, -1514513, -13422310, -7424925, -3636764, -19568944, 14039711, 12323872, -573915, 6813429, -852014, 10908143, 14179835, 13755707, 20338280, 17516488, -10814191, 2764348, -22193170, 23571318, --18194556, 5806259, -3506304, 4842576, 1154273, -16761647, 15289010, -8471823, -16243566, 34129420, --27267136, 8240432, -7859254, -13501767, 13761075, -3497177, 4089346, 21289080, -25661892, 1093606, --31442918, -61914636, -1568737, 19801946, -7429757, 79709760, 16232292, -31072478, 8768176, -43371652, -15099494, 31124554, 36719824, -12563316, -7219303, -48223356, -55319716, -4600984, -34478924, 8229694, --2153389, -30059940, -7025493, -14857366, -32937030, 27064736, 53167400, -14858439, 3780645, 11519102, --14062797, 16495896, 20984674, -14500883, 2469606, 105764, -26421028, 13268765, 2270964, 8087424, -9720585, -18641232, 7361037, -9865540, -14958297, -16939888, 14492830, -10492068, 5988258, -16374026, --5876589, -1068373, -19983946, 19676318, -12646531, 3977140, 6046777, -18619220, -2983392, 14444512, --1641751, 2101313, 3269544, -5404680, 8910983, 18629420, -2153389, 10841034, 12794171, -15829639, --30061012, 10241886, 4296578, 17448842, 20932596, -27201102, -26673358, 4728222, -39508332, 8123394, --2848100, -23068806, 10400800, -14986215, -10074383, -18621368, 9517648, -20275466, 25973278, -2777233, -9639517, -5998459, 34878892, -9484898, 19173270, -329102, 22852984, -6382859, -11480448, 7436736, --12997108, -13789529, 1915555, 25948582, 16738024, -17681844, 18924162, -13263396, -20252382, 5718749, -27814746, -10685342, -11265162, 14848776, 6716255, -13833553, 1603633, 18893024, -7821673, -18174690, -9960029, 7579007, 11668889, 21279416, 4522064, -12833899, -4161287, 46743204, 49159120, -13562970, --40596032, 31192736, -13530221, 8807904, 4490389, 52641804, 7305203, -27300960, -9910637, -6602439, -1556389, 8164733, 12780749, 17126718, -20240034, 6553047, 4704600, 30539902, -7526394, 21528524, -23217520, 12838194, 11121818, 6703370, 18511846, -17615272, 19915764, 25262460, 18294414, 3123515, --35633196, -5288179, -22942104, 1125818, 15584289, 5260798, -7766375, -12493523, -7236483, -1937567, --794032, 6620155, -7285339, 2080375, -649077, -5532992, 11009612, 4318053, -9631464, -4527433, --2376191, 13377213, 125628, 2808372, -12666932, -9076877, -16844324, -7904888, -896038, -1523640, -374199, -2868501, -15074261, 4020626, -5050882, -2395518, 2414845, -4146791, -57445, -13085692, --2979634, 664109, 372588, 394600, -3195456, -3207804, -981400, -5108327, -7243463, 55684252, -23128398, -24858196, 5847598, -25978110, -14406931, -1596117, 9269076, -3980361, 20126754, -24008330, --956704, 9751723, -1017907, 10134512, -1647657, 3687766, 2120103, -17146046, -5652714, 4764730, --16393353, -16099685, 1167694, 4405026, -11716671, 8451422, 7757785, -4642323, -8341900, -1087701, -1561221, -2636036, 6637335, 1972464, 5185636, -6931004, -3234110, 12908524, -193274, 874026, -5928129, -3875134, 6580964, -6252399, -12225624, -7583302, 12212740, -9639517, -7454990, 999654, --9982041, -10332081, 14902463, -14796699, 23674934, 5472862, -10787347, 10695542, 1457605, -17456894, -1345935, -2924873, -3304977, 8649527, -472983, -10138270, 20111184, -11935714, -4931160, 10769094, -3178276, -4172561, 321049, 3509525, -539555, -597000, -2302103, 4932233, 8237748, -63351, --14280229, 10342818, -7463580, -824097, 11844446, -528281, -3888556, -226560, -10612864, 5304822, -3400540, -889595, 27380, 4517769, -10339597, 1009854, -3677029, 1294396, 3990562, 1349694, --4512400, 10213432, -15316390, 2254321, 1582696, -799401, 1668058, -1949378, -8737037, 9687299, --4571993, 6999723, -90731, -822486, 8664560, 3589519, -7626788, 3081102, -3946001, -2953864, -1500017, 5893769, 5513128, -1962263, -7530689, 4030290, -4372277, -33574832, -40375912, 34054796, -137916768, 53965728, 63273460, 869194, -129125504, -95083600, -49707804, -75767520, 34001644, 65270080, -26913876, 115376784, 65284576, -4322885, 27121108, -58306864, -117659016, -46937012, -81719808, -13043279, -56630756, 47723528, 43191800, 71928888, 44377748, 12225624, 19767050, -5328444, -83713744, -36973764, --30141006, -115656488, 21472688, 15196668, -51357072, 83361560, 82481088, -2780455, 104355360, 51337208, --48446696, 32411970, -48163228, -100250440, -7935489, -60540784, -87738664, 15548318, 9411347, -5200132, -81851336, 78947408, 47149616, 70283920, 42714524, -27271432, -30760018, -54695336, -93787056, -69177424, --33005214, -30909270, 16856136, 53028352, 36238788, 58257472, 87923888, 34253436, -11530377, -10939819, --60773252, -49038864, 4533338, -56297356, -25558814, 30642444, 7570417, 38345468, 30822832, -15623480, -10299332, -3092913, -20959978, 4721243, -9336185, -9412958, 19477140, 6826851, 8272644, 25963078, --14822469, -5679558, 14105209, -19196894, -15781320, 7432978, -46141372, -7581154, 15913391, -37124624, -18300318, 23379118, 2555506, 58543088, 55650428, 12910135, 22645216, -16091095, -49568216, -24765318, --65993784, -74876848, -42454676, -17945448, 14334990, 71711456, 83000776, 87012280, 77242304, 44232796, --9462350, -48297980, -76620608, -106884016, -91475824, -50193672, -12891881, 43451648, 77698104, 77627240, -69367480, 45273252, -8191040, -13551159, -21918828, -33120104, -23543936, -20556250, -24495272, -12923020, --6561637, -5403606, 5477157, 15188078, 19863150, 25978110, 23922430, 19169512, 8951249, 2305324, --7988639, -10641318, -11562052, -6452652, -3611531, 23085, -782758, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +2767033, -4361540, -995359, -1613297, -139586, 6528887, 375273, -2796024, 3442416, 699543, +352187, 1146756, 723702, 55835, 4913443, 2767033, -3324305, -1284195, -381178, -1170916, +1378685, 2094333, 1409286, -1427003, -2123325, 813896, -4277788, -1948841, 3213709, 279173, +2587718, 1320703, -2086817, 1577864, 28454, -1846299, 4512400, -3022583, -1418950, 572304, +1552631, -2068027, -542240, -2968359, -5867462, 5485210, -1100585, -3064459, 323733, 5042292, +5369, 1948305, -2508261, -1471563, -1034550, 1546188, -1983738, 4031364, 637803, 3636764, +-5286568, 2231773, -1373853, 878858, 2245731, -916976, -588947, -3911642, 27380, 2106682, +479426, -1094143, -184147, 1874216, -994822, -1046898, 2962991, -1357747, 940598, -569620, +-177704, -3652870, -1498407, -1001264, 1330903, -280247, -1625645, -287763, -331249, -1032940, +970126, -1234803, 80531, 266288, 623844, 980326, -433255, -892816, 928250, 177167, +-668941, 111132, 1581622, -223875, -153008, 621697, 54761, 199716, 256624, -496606, +-856846, -504122, 676994, -174483, 76236, 317828, -459025, 425202, 10737, -295279, +13784161, 4725538, -1090922, 3732327, 190589, 6801081, 4273493, -954020, 3496640, 6106907, +7987566, -4714801, -4614406, 1962800, -1861868, -1542967, 5711770, 4616553, 4396973, 3139084, +591095, -179852, -1994476, 2179696, 1522029, 7276749, 736050, -157303, -3218541, 1515050, +2130841, -414464, -992137, -1138166, 1973001, -288300, -1173600, -2664490, 2825552, -948114, +-956704, 4018479, 5700496, -1469953, -699543, 3296924, 2949569, 5223217, 3235184, 1435593, +536871, 4447439, 2515777, -6131066, 5369, 1882269, -3533684, 92342, 576599, -4373888, +2226404, -2123861, 3278671, -707059, -567473, 1764695, 566399, -3017215, -270583, 1675574, +-594316, -746787, -877247, 325344, 3488587, 615791, -3515968, -835908, 824634, -1048509, +-448824, 5163088, -1047972, 627602, -607201, -1321239, 1165547, 1920387, -499827, 872415, +938450, -957241, 454193, 858993, 198642, -637266, -1815697, -564251, -1093606, -508417, +-134218, 574989, -339302, 692027, 377420, -158377, 4769025, -371515, -9002251, -4190814, +-1746441, -1948305, -4900021, -4501126, -2826089, 4879083, -5360656, -2503429, -2545305, 981400, +8140037, -1221918, -645319, 1990717, 4659503, -7123204, -1160715, 1453846, -3143379, 2515240, +3984119, -4392141, -269509, 566399, -2552284, -6465000, 1126892, -2721936, 878858, -2506114, +3702799, -4463545, -4164508, -10260677, -2763275, 3528853, -569620, -3936875, -1937030, -494995, +-4123706, 208306, -692027, 2835752, 2246268, -1062468, 132607, -1049583, -4352950, 5320928, +931471, 3596498, -1315871, 13422, 940598, 1556389, 4126390, -1320166, -990527, 1219234, +-111132, 4499515, 2410014, -3889630, -1538135, -970126, -6153078, -692027, -576063, 3664144, +-2354179, 3339337, 580357, -116501, -336081, -587874, -658204, 712428, -2478196, 1154809, +-1425929, 1255204, 1078037, 483184, 315143, 3586835, 2639794, -658741, 3273302, -443455, +-1091459, -1037235, 647466, -233539, 2243584, -578210, 1404454, 1133335, -189515, 950262, +8590, 995359, 993748, 288300, 347892, 1077500, 728534, -1473711, -801011, -155156, +1825361, 2021319, 16643, -214748, 1108638, -19805168, -6204081, -1748589, -1602560, -1653562, +7642895, -7051800, 3391951, -1642825, 1549410, -2011655, -1642825, -5675800, 926102, -2065879, +423054, -8240432, 158377, -836445, -1484985, -125628, 1541356, 1258962, -790274, -554588, +-3316252, 1031329, -2664490, 1758252, -13422, 1503775, 5140002, -1335198, -5912560, -2510409, +-6921877, 971200, 1234266, -610959, 1184874, -2397666, 2303176, 1207423, -3073049, 282394, +-8319352, -1752347, -5568425, 3060164, 5481452, -4819490, -391916, 1597191, 830539, -7902740, +1309965, 4097399, -3817689, -1787243, -9055939, 3094524, -1320703, 3764539, 6686727, 3846680, +-5397700, 1169842, 1260573, 325881, -6000070, 1577864, -2565169, 4019016, -1624035, -158914, +1858647, 1661079, 4699768, 5397164, 3654480, -233539, 1344325, 3233037, 1603633, -3117073, +-661962, -2064269, -2128156, 1009317, -101469, 562641, 42413, -579821, -186831, 1979980, +-643708, -581968, 47245, -493921, -1427003, 1804960, 60130, 885837, 2114735, -205085, +229781, -1608465, 1070521, 803159, 165893, -1614371, 549756, 89657, -12217571, 1311576, +2234457, -4431333, -502511, 11948062, 9351754, 5016522, -1297617, -2211371, 6005438, 3704946, +1952063, 2224256, -4767951, 1611687, 507343, 5602248, -5337571, -2492692, -985158, 676457, +-1059246, -6240051, -4167192, -4400731, -5121212, 2827162, 3503620, 2194728, 1576790, 81604, +1541893, -810675, -629213, 363998, -1837172, -566399, 2760053, 2092723, -4179003, -4734128, +-399432, -4748087, 2865280, -1459752, -7943005, 938450, 4096862, 5725729, 4016868, 199179, +3797288, -5718749, -1793149, -2566780, -362925, 379031, 2589865, -1983738, -5181341, 6331319, +-5730560, -2782065, 3962107, 9164386, 2203855, 1797444, -8935143, 9681930, 1191317, 6743099, +10442676, -2315524, 1140851, 1196685, -4233227, 8608188, 2047626, -2843805, 2407866, -1222455, +4283693, -7109245, -3754338, -7264401, -1381369, -3230352, 2932389, -1853815, 1262184, -3413425, +-845572, -679142, -2157147, -162672, -796180, 875636, -134755, -964757, -479963, -444529, +1737851, 447213, -1284195, -2966749, 1672353, 1621887, 322123, -18254, -27917, -1240709, +542240, -835371, 1810329, 318364, 1027571, -1043677, -1168231, -2359548, 18537078, 13058848, +-4655745, -6803765, 10293963, 6711960, 10834592, 15912317, -8016557, 5521718, 2668785, 4628364, +2090039, 2785823, 6597607, 1649268, 6737193, 234076, -4274566, 1817308, -1365800, 2278480, +-779000, 12356621, 2105071, 2732136, 1693291, 499290, 4340065, 1846299, 272730, -784368, +3111704, -2378338, 5925981, -4597226, 7130720, -3352759, 4320200, 2257542, 2647847, 2092723, +10459319, 7986492, 519691, -2243047, -5641977, 6190659, -6881612, 1736241, -3000035, 3047279, +6553583, 789737, -10923712, -8877161, 934155, -5522791, -5974837, -3454764, -6892349, 2465311, +11989938, 6009196, -4395899, 277025, 1395328, -3139084, -3517578, -585189, 5892695, 6538014, +-6928319, 3285650, 7686381, 1525250, 2534568, 3701725, 5989869, -1035624, -4078072, 1585380, +-1752884, -355409, -3913789, 3615826, 5660230, 857920, 1016297, 774168, -3963718, -584116, +-65498, -452045, 402116, -635655, 652835, 474057, 1938104, 190589, -35970, 165356, +1243930, 2123861, 1112933, 2248952, 1234803, 398358, 662499, -501437, -3697967, -3850438, +773631, 2797634, 717260, -863825, 681826, -518617, 1774358, -1446867, -1316408, -2425583, +1039382, 8117488, 1600949, 11772505, -994822, -185757, -3876745, -3211025, 4012036, 8899172, +-2560874, 2327872, 690416, 9646497, 4060355, -4553202, -4112968, 593779, 2086817, 8763881, +8688719, 13102871, 2447058, 3619047, -2246268, 5320928, 6153615, -2401424, -2952790, 4686883, +-3558381, -5068599, 4797479, 1393180, -5759551, -7181722, 10941966, 5418638, -290984, 6903086, +1432372, -4898947, 10400263, -2448131, 397821, -279710, 2763812, -3787088, 2765422, -3791919, +2695629, -3523484, 3251290, -2885144, 4393752, -3630858, -3569655, 9589588, -11940546, 655519, +1527398, -4155381, 906238, -13545790, -6545530, 6447283, -5289252, 3955665, -1332514, 2664490, +1284732, 2283849, 1534914, -6146635, 3411815, -3577171, -295279, -7802345, -4106526, -1960116, +-1744831, 2212445, 7464117, 4245039, -5794985, 2279017, 1280974, 48318, -2717641, 401579, +-410169, 1440962, 816581, -1502702, -1869385, -783832, -416612, -1138166, 4391604, 792421, +-1479616, -908386, 1167157, -1736241, 337155, 863288, 214212, 244276, -4325569, -1803886, +-954020, 693637, -1080184, -162672, 3011846, -9571335, -8298414, -1074, 3562139, 6760816, +-7859254, 2289218, -7064148, 5851356, 4433480, -9641128, -2027761, 1077500, -11369315, -6416681, +6889128, -855235, -511101, 1676111, -733903, -11840688, 10846940, 742493, -7713762, -3702262, +1428077, -951872, -7413651, -2171106, -4267050, 1276142, -386010, -2309619, 2357400, -10253161, +-4592931, 2712809, 13458280, -2201708, -7929584, -5546951, -4421132, 9223979, -9780714, -1899449, +-689342, -10384694, -13019656, 3257196, -9026948, -1376537, 1338956, 6917582, 3828963, 621697, +1480690, 8250096, -3541738, -2495913, 12138114, -8047695, 6322192, -2719788, -3035468, -1171452, +-1465658, 13023415, 303332, 5105106, -13334263, -9609452, 328028, -1865090, 14908368, 551903, +10168335, 4350802, 12715788, 7781407, -1917166, -8773008, -3315178, 6019397, 2603287, 4089346, +-4897337, -5459977, -1519345, -1788854, 2646237, -1291711, -3562139, -573378, -855772, 39728, +-425202, 555125, -1444183, -1903207, 2442763, -103079, 171262, -606127, -1058173, -769873, +679142, 2138894, -2150168, 561030, -1310502, -1901060, 1420024, -516470, -1814624, -2079301, +-393526, 2088965, 236223, 328028, 790811, 3714610, -3055332, -2498060, -1539746, 361851, +1504849, -15947214, 1510218, -1562831, 10891500, 1270774, -11601244, 13816373, 4418985, -8105140, +-17808546, -7403987, 17537962, 876710, -2259690, -2936684, 1780264, 583579, 5389110, 2873870, +5776194, -1256278, 10339060, -5348845, -12247636, 521839, 539555, -2905546, -470299, 4583804, +-3163244, -1864553, -1089311, 9775882, 7562901, 3932043, -743029, -13301514, -277025, -689342, +-573915, -2206003, -233002, -5816997, -10869488, -1694365, 7449621, 7269232, -2747169, 7809861, +-2531346, 3378529, 8564165, 8212515, -18125836, 6222334, 6525129, 2720862, -4425964, -15874736, +9628243, 5701032, 3072512, -5654325, -3175055, -6403796, 3554622, -7104950, -1326608, 142808, +6480032, -4006131, 3298535, 1812476, -11618423, -1581085, -7765838, 12750147, 5905043, -14935212, +-3171297, 11876658, 5908802, -6135361, -3073586, -6778532, -2295123, 3570192, -2073932, -789200, +-2593087, -3235184, -5682242, 1138166, 454730, -1789391, -572304, 2955474, 1973538, -3550327, +-1264331, 2682744, -689342, 2063732, -2357400, -1598265, -450972, 581431, 3063386, -3190624, +-2288681, 1686848, -3663607, -235686, -2578591, 1629403, -2042794, 3586835, -1227824, -573378, +-1796370, 2310156, 1539746, 4082367, 1271310, 9846213, 12270185, 12350715, 9648644, 12106976, +-15260019, -10167798, -5196374, -5106179, -7253663, -5760088, -12229383, -4305168, 933619, 7230041, +93416, -7184407, -231391, 7221988, 456877, -6220187, -2762201, 16586627, 1717987, 6153078, +2021319, 6775848, 1499481, 2107755, -10193031, 5599564, 472446, 2236604, -10691784, 3587908, +-16468515, -151398, -5154498, 3956739, -1436667, -12241731, -216359, -12186970, 2280091, -10154376, +9204115, -5337571, 14426258, 290984, -196495, 7075422, 1621350, -2435783, -2047626, 2765422, +-4844186, 3226057, 8919573, 4365835, -6531572, -3616899, 19042812, 1286343, 15199352, -14207752, +-2898566, -1657857, 11068668, -12421582, 1780801, 5696737, -12137041, 8338142, -7607461, 2054605, +11889006, 1104344, 6714645, 2981244, 15517717, 6522982, -6385006, -5236639, -6152541, 753767, +621697, 6325950, -3843996, -922881, 4274030, 111669, 3299609, 4269198, 638876, -3780645, +4302484, 3091840, -404264, 1135482, 1449015, -1781338, -1278827, -5284958, 3398930, -2639794, +-2280628, -1205812, -2647311, 2277943, -1808718, -826244, -2843268, -914828, -656056, 3356517, +2532957, -345208, -601832, -443992, 1999844, 2218351, 2119566, 4357781, -569083, -4679904, +-15323370, 2284386, 15000710, 11165841, 12264279, -4098473, -3110093, 3028489, -2088965, 15106474, +5102421, 7178501, 12792560, -958851, 4811437, -8701067, 12741020, 6313065, -3162170, -7830799, +-7211787, 8486319, -14709726, 5717675, 8524973, -6206228, -8197482, -4749160, 7952669, 2910914, +-2954938, -5457293, 141197, -9148280, -13630616, 2424509, -13082470, -19616726, -2425046, 683974, +19841138, -8621610, -6721624, 8740258, 14624901, 14523969, 7810935, -978179, 3417183, -6393059, +1155883, -6700149, 16342887, 14292577, 9358734, -770947, -16658031, -215822, -14224932, 15602542, +12235288, 7465190, -11807402, 9630927, 5576478, 6622840, -2193655, -10166724, -7272990, -8166344, +2739652, -11424613, -20628728, 3891777, 14011794, 7235946, 13755707, -4365835, -3776350, 13701483, +4634270, 1684164, 9235790, 2856690, 271657, 7748658, 5004711, -947040, 3631932, 3235721, +2087891, -2852395, -4562329, -6249715, 1607392, 3654480, 2248952, 7786776, 197032, 5476620, +-1816771, 2098629, 4514011, 371515, -2092723, -1495186, -6678674, -5978595, 1988570, 1182190, +2632278, 6693170, 1005559, 5017596, -2029372, -1444183, 886374, -5393942, -4050154, -1775969, +-4345970, 1746978, -1465658, 1352915, 3847754, 5149129, 7653095, 12665859, 26687316, 12115566, +9191230, 8915815, -16829292, -2442763, -6279242, 21429202, -21798570, -20322174, 5674726, 14042932, +-590558, 17136382, 15193984, -574989, 5720897, -10024454, -7554311, 16294569, -6571837, 11244224, +3713536, -7024419, -3962644, -3029026, -3770981, -7337952, 6052683, 6845104, 5380521, 672162, +-8598525, -10627360, 13728863, -13574244, 10580652, 1140314, -17131550, 8665097, 15897821, -186831, +-4599910, -1906429, 1086627, 1065152, 10773925, -442919, -8491150, -3314641, 9132711, -16919486, +3890704, -2728378, 13638132, 14756434, 9538049, 11577084, 14845554, 10959146, 3710315, -9674414, +-11275363, 5461051, 7123204, -409096, 6138582, 8807904, 22741852, -12847858, 14304389, -8501888, +-5741298, 15921444, 2174864, -9326521, -8462696, -8597451, -14408542, -4729296, -7164543, 11453604, +42413, -8959302, 4731980, 3258270, -2171643, 5430450, -11046119, 7167227, 224949, -906775, +-1399086, 6103686, 799401, 1682554, 6023692, -2503966, 784368, 4674535, -7160784, 4978404, +40802, 1914482, -3335579, 3985730, -1624571, 549756, 5099737, 110059, -1532767, 1451699, +3358665, 4631049, 7341173, 6266894, 2008434, -3432216, -3170760, -10712185, 2134599, -8911520, +-2913062, -3841312, -3954591, 4327717, -17890686, -3190624, 10407243, -12841415, 405874, -8077760, +-14133127, 20557324, 17569100, 14694694, 6962142, 3833258, 5779952, 15093589, 8333847, 15474230, +-5730560, 12961674, -9764071, 15697032, 21075942, 13220983, 10534481, 5369783, 10881300, 10968273, +-3259343, 21821118, 5237176, -13153874, 6241125, -13317620, -9163313, -2726231, -20720532, 359704, +-4418448, -5614596, -10073846, -5235029, -2894271, -643171, -2044404, 903017, 865973, -11889006, +-7854959, 2467996, -6280853, 4942971, 20405926, -10284836, -830539, -1935957, 754304, -9751186, +5257040, -4682588, 15796353, 3365107, 9435506, 14775224, 2522757, -977642, -9742060, -21686900, +2864743, 16149077, 11720966, -3052111, -14454176, 12182675, 1284732, 7340099, -18504866, -13283797, +-12184822, -18350248, -11360725, -13424994, 6256694, 1988033, 4700842, 6127845, 8475581, -4141959, +8627516, 9808632, 312996, 5273683, -3143916, -6511171, -6699075, -7049652, -2816962, -5140539, +-308164, 1548873, -673236, 463320, 1314260, -5967320, -5508296, -9447854, -3228205, -2195265, +-5245229, 2070711, 792958, -2797098, -8533026, -3938485, -3142306, -2214056, 7138236, 2167348, +-3100967, -3952981, -1424319, -10266582, 2810519, -2104534, 5310727, 587874, -3214783, -6065031, +6321118, 8983998, -30671436, -19676856, -9319005, 21912386, 16006269, -11907260, 13722957, 12337294, +10573136, 10302553, -10260140, 1035624, 5991480, -10253698, -30890478, -5658083, -8540542, -18973018, +1759326, -6477348, -4806606, 5793911, 3498251, -4223027, 961536, 14496051, 15558519, -28512678, +6834367, 1454383, 13247827, 4494684, 777926, -17751636, 5480915, -4546223, -4871030, -12203076, +-9019968, 22856206, -10307385, -398358, 2787434, -6024766, 25333864, 12014634, -11182484, -6786049, +-19704236, -2831994, 18968724, 5571110, 5789079, -6179921, 11618960, -2691871, -4907000, 10661183, +-6218039, 17658758, -4061429, 13166759, -26681410, -9025874, 15420006, 3811784, -2374580, 4358318, +-29521458, -13955422, 4593468, -11765526, 4619774, 1257352, 3386582, 18220862, -6697465, 7390565, +-1335735, -14695231, -2459943, 11244224, 16287053, -447750, -6673306, -12438762, 455267, -17393006, +-5572720, 1592896, 20669530, 18424336, 2622615, 7792145, 2429341, -2983392, 10311143, 7785165, +-3910568, 8538932, 6514392, 3480534, -6939057, -396211, -3526168, 6264210, 4456029, 5586142, +-302258, -8272644, 8050916, 466541, -3735548, -8048232, -220117, -548682, -7522635, 5513665, +-5413270, -8783745, 10242960, -3901978, -3200288, -4377646, 2452426, 1555315, 8275865, 1898376, +-1142998, 3468186, 5227512, -8885750, 2738579, 5987722, -13793287, -38021196, -3682935, -4229469, +-4591320, 6287296, -15767899, 30518964, -5935645, 1722819, 32788318, -38732016, -4512400, -7282117, +-4176856, -44426604, 2047089, -6577743, -9115531, 15538118, -15839303, 2700998, 2473364, 7578470, +-1875827, -15993921, 10697690, -10397042, 22804128, -3689914, -26868778, -1634235, -1371168, -13013214, +-27074936, 12242267, 13049721, -21968758, 17687750, -19844360, -16156056, -9351218, 1256278, 1896765, +2494839, 13129715, -2947421, -11992086, -29504814, 6174016, -39710192, -20575578, -13995688, -31163746, +-19127636, -8812736, -2456185, -14508936, 21921514, 23331336, 4598300, -6734509, 24968256, 11725261, +-3453691, -5535676, 17819282, 13756780, -6816113, 24496882, -20942260, -10248866, 26002806, 12693776, +36693516, -20147154, -23460186, 6123550, -17979806, 18949396, 1446867, 6720013, 34835404, -19327352, +-21496312, -7511898, 6778532, 8271570, 8334921, 9255655, 9670656, -10705206, 3723200, 1863479, +-1370632, -1066226, -7904351, -5628555, 9724343, -10985453, -1174137, 2455648, -6022618, 1588064, +-6168110, -209917, -1231045, 2511482, -9592273, 4755066, 10529649, 3490735, 2036351, 12527883, +8411693, -689879, -12588549, 11090679, 2083596, -3959423, -9580998, 11497627, 981937, 512175, +6174016, 8938901, -12052215, 6021544, 2923799, -7960185, -4131222, -12829604, 8270497, -1736241, +-14047764, -7316477, 3735548, 29721174, 17149804, -2957085, 40585832, -4849555, 16740172, -19288162, +23742042, 22069690, -1899986, -18049064, 2010582, 6272263, -9853192, 10376104, -14435922, -419833, +-4351876, -4961224, -16421271, -12280922, -7405598, -1191317, -5236102, -13175886, 19427748, 13071733, +3704409, -5570573, 3414499, 18415210, 8875550, 13489955, 8719320, -10334228, -15610596, 31616864, +-4038880, -17531520, -7118909, -7618735, -4028679, 22844932, 1114007, -17877802, -6645388, -44214540, +-10725607, -5310727, 27277874, 18606872, -53429392, -23207318, -12899934, -407485, 2818572, -21514564, +15874736, 8290361, 13833553, 26735634, -35001836, 34250752, 24816858, -11289858, -23461258, 1385664, +-5752035, 9037148, 31429496, -16324634, -18009334, 25411174, -29921426, -33743412, -13414793, 3344706, +-9504763, -36961416, -14779519, -12011413, 694174, 1933809, -10427107, -826244, 1712081, 365072, +3262565, -23379118, -8069170, -7791071, 1617592, 6446209, -1613834, -7514582, -4224101, 2419677, +12006044, 12656195, -1657321, -11087458, -2761127, 16125992, 1069447, -4250407, 3479997, -21978958, +-6354404, -10383083, 1555315, 3767223, -21180632, -21712670, 5509906, 18851686, -8004746, 12337830, +3910568, -6082748, -1674500, 5013838, 3884261, -1777043, 3858491, 27977416, 3863323, 10465225, +-21819508, -34675956, 50068044, 24947318, 2355253, 3195993, -11161546, -29512330, 10408853, -2374043, +25318832, 5559835, 9448928, 27584964, 15385110, -397284, -2869575, 4591320, -16787954, -13960791, +-17855252, -10097468, 16684874, -4634807, 1128503, 20676510, -3489661, 9020505, -28765544, -26004416, +-17505750, 14891188, 6171868, -1051730, 6938520, -9265318, -25861072, 32651416, -31030602, 14238353, +14863808, 11549167, 5272073, 19728932, -12716861, -31918586, 23596014, 66597228, -11687143, 32161252, +-38742216, -21049098, 24061480, 13933948, -35964984, -10266046, -2972654, 31170726, -7713762, -3510062, +-48928804, -31615254, -11190000, -36106716, 30146912, 31929860, 50657528, -44937704, 19326280, 5475547, +-24850144, -1574106, -1117765, -51903608, 36981280, -15518254, 17495012, -5462125, 2937758, 69902200, +-18858128, 24147380, 16127065, -17131550, 30602178, -210453, -5810017, 1692217, 7952669, 19551764, +12153147, 7666517, -614180, 18488224, -17426292, -8820789, 1561758, 4471598, 8760660, -5005785, +15181636, 1817308, 6803228, -3162707, 11535745, -1193464, -16642998, 9392557, -20463372, -12402792, +-4662724, 8566312, -2068564, 10268193, 24206972, 36911484, 26975616, 7109245, 17413944, -10252624, +8943196, -926639, -580894, -1887101, 3783866, -8018704, 10390063, -9882183, -44627396, -25302726, +-922344, -6758668, -14957760, 5422933, 14388677, 1493038, -15808701, -793495, -15154792, 41043780, +-12607876, 944356, 31110058, -1744294, -31919124, -22201222, -21817896, -9659918, -11617350, 34195992, +3541201, 5645198, 17040282, -9365176, -9545028, -5738613, -9730248, -20845624, -4901632, 39198556, +12645457, 9322763, -26047902, 9617506, 2039573, -18543522, -2166811, -9287867, 42526620, -33627984, +-29038810, -10223633, 5303748, -10011032, 1295470, 11492796, -22141094, -5936182, 36025112, -29018410, +5098126, -7262253, -17649094, -30778272, -23528904, 1154809, -42876660, -51833276, 12305081, 10634339, +8324184, -46315316, 35775468, 43476344, -14759655, -12572980, 2709051, -1797444, -9800578, -24057722, +17437030, 65597572, 17022566, -16193637, 314606, 10424959, 21876416, 5936182, -38816840, -34603476, +37494528, -7171522, -15351287, -22603340, 7779260, 42874512, 13121662, -13547401, 7895224, -1658394, +-7642358, -3744675, -2302639, 18973018, 10477036, -6444599, -10503343, 8589398, 4968741, -1591285, +-4354023, 6943889, -10160282, 6306086, 16425029, -1510755, -9108015, -2731599, -5870147, -9949292, +-18422726, 2685428, 14031658, -9397925, -11627550, 5735392, -14509473, 85899, -23591718, 11317776, +14674830, 37556804, -11977590, -5115843, -15573551, -15952582, 4483409, 8275328, 15600395, -1881733, +-3405372, -15748571, 6308233, 3877819, 4699768, 9933722, 11427834, -14187888, -37455872, 10375030, +14631343, -55451784, 30376694, 1328756, -15811385, 5341329, 20236276, -28643674, 17701170, -26594974, +7184407, -1514513, -13422310, -7424925, -3636764, -19568944, 14039711, 12323872, -573915, 6813429, +852014, 10908143, 14179835, 13755707, 20338280, 17516488, -10814191, 2764348, -22193170, 23571318, +-18194556, 5806259, -3506304, 4842576, 1154273, -16761647, 15289010, -8471823, -16243566, 34129420, +-27267136, 8240432, -7859254, -13501767, 13761075, -3497177, 4089346, 21289080, -25661892, 1093606, +-31442918, -61914636, -1568737, 19801946, -7429757, 79709760, 16232292, -31072478, 8768176, -43371652, +15099494, 31124554, 36719824, -12563316, -7219303, -48223356, -55319716, -4600984, -34478924, 8229694, +-2153389, -30059940, -7025493, -14857366, -32937030, 27064736, 53167400, -14858439, 3780645, 11519102, +-14062797, 16495896, 20984674, -14500883, 2469606, 105764, -26421028, 13268765, 2270964, 8087424, +9720585, -18641232, 7361037, -9865540, -14958297, -16939888, 14492830, -10492068, 5988258, -16374026, +-5876589, -1068373, -19983946, 19676318, -12646531, 3977140, 6046777, -18619220, -2983392, 14444512, +-1641751, 2101313, 3269544, -5404680, 8910983, 18629420, -2153389, 10841034, 12794171, -15829639, +-30061012, 10241886, 4296578, 17448842, 20932596, -27201102, -26673358, 4728222, -39508332, 8123394, +-2848100, -23068806, 10400800, -14986215, -10074383, -18621368, 9517648, -20275466, 25973278, -2777233, +9639517, -5998459, 34878892, -9484898, 19173270, -329102, 22852984, -6382859, -11480448, 7436736, +-12997108, -13789529, 1915555, 25948582, 16738024, -17681844, 18924162, -13263396, -20252382, 5718749, +27814746, -10685342, -11265162, 14848776, 6716255, -13833553, 1603633, 18893024, -7821673, -18174690, +9960029, 7579007, 11668889, 21279416, 4522064, -12833899, -4161287, 46743204, 49159120, -13562970, +-40596032, 31192736, -13530221, 8807904, 4490389, 52641804, 7305203, -27300960, -9910637, -6602439, +1556389, 8164733, 12780749, 17126718, -20240034, 6553047, 4704600, 30539902, -7526394, 21528524, +23217520, 12838194, 11121818, 6703370, 18511846, -17615272, 19915764, 25262460, 18294414, 3123515, +-35633196, -5288179, -22942104, 1125818, 15584289, 5260798, -7766375, -12493523, -7236483, -1937567, +-794032, 6620155, -7285339, 2080375, -649077, -5532992, 11009612, 4318053, -9631464, -4527433, +-2376191, 13377213, 125628, 2808372, -12666932, -9076877, -16844324, -7904888, -896038, -1523640, +374199, -2868501, -15074261, 4020626, -5050882, -2395518, 2414845, -4146791, -57445, -13085692, +-2979634, 664109, 372588, 394600, -3195456, -3207804, -981400, -5108327, -7243463, 55684252, +23128398, -24858196, 5847598, -25978110, -14406931, -1596117, 9269076, -3980361, 20126754, -24008330, +-956704, 9751723, -1017907, 10134512, -1647657, 3687766, 2120103, -17146046, -5652714, 4764730, +-16393353, -16099685, 1167694, 4405026, -11716671, 8451422, 7757785, -4642323, -8341900, -1087701, +1561221, -2636036, 6637335, 1972464, 5185636, -6931004, -3234110, 12908524, -193274, 874026, +5928129, -3875134, 6580964, -6252399, -12225624, -7583302, 12212740, -9639517, -7454990, 999654, +-9982041, -10332081, 14902463, -14796699, 23674934, 5472862, -10787347, 10695542, 1457605, -17456894, +1345935, -2924873, -3304977, 8649527, -472983, -10138270, 20111184, -11935714, -4931160, 10769094, +3178276, -4172561, 321049, 3509525, -539555, -597000, -2302103, 4932233, 8237748, -63351, +-14280229, 10342818, -7463580, -824097, 11844446, -528281, -3888556, -226560, -10612864, 5304822, +3400540, -889595, 27380, 4517769, -10339597, 1009854, -3677029, 1294396, 3990562, 1349694, +-4512400, 10213432, -15316390, 2254321, 1582696, -799401, 1668058, -1949378, -8737037, 9687299, +-4571993, 6999723, -90731, -822486, 8664560, 3589519, -7626788, 3081102, -3946001, -2953864, +1500017, 5893769, 5513128, -1962263, -7530689, 4030290, -4372277, -33574832, -40375912, 34054796, +137916768, 53965728, 63273460, 869194, -129125504, -95083600, -49707804, -75767520, 34001644, 65270080, +26913876, 115376784, 65284576, -4322885, 27121108, -58306864, -117659016, -46937012, -81719808, -13043279, +56630756, 47723528, 43191800, 71928888, 44377748, 12225624, 19767050, -5328444, -83713744, -36973764, +-30141006, -115656488, 21472688, 15196668, -51357072, 83361560, 82481088, -2780455, 104355360, 51337208, +-48446696, 32411970, -48163228, -100250440, -7935489, -60540784, -87738664, 15548318, 9411347, -5200132, +81851336, 78947408, 47149616, 70283920, 42714524, -27271432, -30760018, -54695336, -93787056, -69177424, +-33005214, -30909270, 16856136, 53028352, 36238788, 58257472, 87923888, 34253436, -11530377, -10939819, +-60773252, -49038864, 4533338, -56297356, -25558814, 30642444, 7570417, 38345468, 30822832, -15623480, +10299332, -3092913, -20959978, 4721243, -9336185, -9412958, 19477140, 6826851, 8272644, 25963078, +-14822469, -5679558, 14105209, -19196894, -15781320, 7432978, -46141372, -7581154, 15913391, -37124624, +18300318, 23379118, 2555506, 58543088, 55650428, 12910135, 22645216, -16091095, -49568216, -24765318, +-65993784, -74876848, -42454676, -17945448, 14334990, 71711456, 83000776, 87012280, 77242304, 44232796, +-9462350, -48297980, -76620608, -106884016, -91475824, -50193672, -12891881, 43451648, 77698104, 77627240, +69367480, 45273252, -8191040, -13551159, -21918828, -33120104, -23543936, -20556250, -24495272, -12923020, +-6561637, -5403606, 5477157, 15188078, 19863150, 25978110, 23922430, 19169512, 8951249, 2305324, +-7988639, -10641318, -11562052, -6452652, -3611531, 23085, -782758, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 536871, -3439732, -4676683, -3805878, -653372, 3687230, 5433134, -2558190, 3172907, -1756642, -4524748, --1240172, -2529199, 1487669, -622770, -2186138, 2004676, 3043521, 681826, 3679176, -6740951, --7283191, -4679904, 678605, -18254, -1244467, 351114, 2224256, -728534, 3003256, 2480344, --3180960, 1210644, -237297, 3888019, 3586835, 1351841, -3809099, 2497524, -2268817, 1269700, -2501282, -6088653, 6653441, 9768366, 1280437, 4425964, -3595425, -727997, -3375308, -1756105, -3028489, -1013075, -3490735, -927713, -2196876, 1681480, -2142652, -1951526, 198105, 1784022, --1775969, -2009508, -867583, 3468723, 3127810, -2643552, -969052, -3123515, 721555, 4121021, -1148904, -1512365, -1967095, 1548873, -550830, -2812130, -1022739, -1899986, -269509, -1020055, -1633698, 1523640, 823560, -905701, -1241782, 2776696, -373125, 753230, 1446330, -417149, --34897, -579284, 852014, 109522, 217433, -816581, 119185, -260919, -803696, 36507, --120796, 597000, 1468879, -817118, 345745, -161598, 717796, 869194, -206158, -362925, --177704, -48855, -775778, -331786, 355945, -303332, 154619, -21475, 657667, 137439, -15028627, 6916508, -521839, 3146064, 2856153, -3605625, -1768990, 4166655, 1894081, 4534412, --3299609, 6594386, 2475512, -6512781, 5163625, 271120, -120796, -3439732, 3776887, -7042673, --6043556, -1299765, -2151779, -1175210, -2161979, 807991, -1314797, -2934000, -2121177, 2440078, --2678449, 1700807, 1073742, 675384, -2956548, 4129074, -8671539, -1536525, -55298, -1532230, --1097364, 732292, 1608465, -2794950, 2200634, -3384434, 3212636, 1002875, 694711, 3305514, --2356327, -584116, 1334661, 5181341, 1275068, 2160906, -1212791, -4535486, -6318434, 1137093, -3408057, 4445291, -1847373, -7073811, 1032403, -2907156, -1983201, -1656784, 1937030, 180389, -6874632, -231928, 2301566, 1324461, -1063004, -1822677, -1942936, -7230041, -2136746, -1206349, --1001264, -1408212, 1317481, 3577708, 984621, 3391951, -61740, -354872, -1118302, 909459, -1222992, -376347, -1420560, 1181116, -744640, 444529, -636192, 597537, -1061931, -673236, -949725, 282394, 522912, -409096, 309775, -696322, 8085813, 1894618, -6847252, -7743289, -2115272, -2348273, -6435472, 7310571, -3591667, -1174137, -1005559, 5738613, 1194001, -3293703, -4003983, -3089692, 6056978, -8361765, -5540508, 6701223, -6976638, -7011534, -2833068, 5731634, -2492692, 2756832, -678605, 5138929, 3088618, -507880, -6763500, 1850057, -1887101, 2454037, -2134599, 1864016, 5854041, 1595580, -5785858, 555661, 4012036, 5930813, 1981591, -3209414, --773631, -4745402, 2031520, -8437463, -339302, 9167608, 482110, 1007707, -4696547, -5775658, -883690, 1296006, 6716255, -1433982, 572304, 738198, -1000191, 722628, 2229088, 432181, -4724464, -1249836, 3136937, 499290, 845572, 603980, 5545340, 267899, -776315, 1062468, --1185411, -3714073, -1999307, -3829500, -89121, 7025493, 1466195, -2245731, -783295, -3946001, -2270964, -3079492, -2189360, 802085, 120796, 279173, -1794760, -2502892, -520228, 678068, --848793, 1510218, -154082, 46171, 1440962, 945430, 1452236, 1242856, -3758, 526134, --1156420, 119185, -1023813, -1059783, 798327, 993748, 1669669, 1257889, -783295, -146566, -893890, -581968, -1243393, 776852, 202400, -18589692, -12195023, -2648921, 1991254, 3027415, -280784, 6442, -7144141, -407485, -1583769, -1158031, 121333, -1777043, -854699, -5225902, -2694018, -11031087, -4080756, 1026497, -2257542, -3346853, -1973001, -6260452, -3228742, -2579665, --3024731, 1429687, -4911295, -2643552, 6004365, 3976066, 373125, 2939905, 2097018, -1938641, --4081830, 2442226, 8984535, 1063541, 1097364, -3513820, -3210488, 2694018, -7756174, -4068408, -8529805, -7783555, 2334315, -1822677, -3976603, 1853815, 548145, -2132988, 479426, 1359357, --2736968, 70867, -563178, 5327370, 4659503, 738198, 1237488, 2336999, -179315, -983011, --1845762, -10817412, 5238787, 3329137, -2980707, -70867, -4568235, -1189706, 627065, -3277060, -1489280, -3985730, -2262911, -4647692, -6984154, 4632122, -1342177, 255551, -5904507, -1420560, -746787, 1027034, -1566053, -220654, -338229, -1573569, -3060164, 539018, -1576790, 1364726, --253940, -715649, -637803, -265751, 1480690, 313533, -2266669, 482110, -688805, -132070, -716186, 394063, -596464, 589484, -1780264, 1007170, -1618666, -444529, -16087337, 2477123, -3774740, -1016834, -1409286, -8910983, -3644280, 2439005, -7953743, -7627325, 1557999, -7256347, --3732864, -191126, -4377109, 2463701, -3450469, 5432597, -2870649, -1893544, 1717450, 3795677, -7038378, 4388920, -7844758, -437013, -582505, 3855270, 5799817, 9842454, -4380330, -3888019, -5107790, -5398774, 1248762, 1530082, 8326331, 3036005, 4647155, -6214281, -2740189, -8478802, -6692633, 6989523, 8055748, -147640, -1733556, -5420249, -1132798, 5393942, -2513093, -3500935, --3204583, -4262755, 915902, 971200, 1270774, -5826660, -77846, -5710159, -307627, -878858, -2315524, 1971927, -1744294, -2609730, -7202660, -453119, -577136, 4405563, -2782065, 7342247, --4205310, 884226, 3419331, 6665789, -5184026, 1513976, 3512210, -6060736, 3017215, -39192, -7416872, 2434710, 1660005, 4519916, -462246, 1207960, 3506304, 1377074, 37044, -1338956, -56908, 1435056, -479963, 1833951, 2871723, 2305324, -1088774, 1257889, 180926, -826781, -1148367, 1465658, -2684, 644245, 1837172, 1302449, 1481227, 660888, -724239, -1247688, -1415729, -1336272, 1409286, -794569, 102005, 1717987, 1346472, -476741, 19902878, 17075180, --620086, 513785, 8873402, 1217086, 4342212, -2657511, 4867272, -3750580, 8957691, 3074123, -6442, 1835025, 617938, 11353209, 7655243, -7435126, -6204081, 2416993, 1190780, -2379949, --1625108, 1443646, 5432060, 4044786, 2473901, 587337, 2862059, -1891396, -161061, 6256157, --6881075, 2761664, 8337069, 6266894, 11338714, -1113470, -1739999, -986232, 702227, -3620121, -12322261, 11311333, 8064875, -3757560, -1140851, 4811974, 3901978, -3448859, 753767, 6475200, --2437394, -3027415, 4099546, -11989938, -1413044, 666257, 1744294, -4056597, -7860864, 3204046, -5341329, -6375342, -2397129, -6933151, 2561948, 489626, -1482838, -1489280, -6075231, 10139881, --2695092, 1365800, -10339060, -2446521, -4952634, 12057584, -2158221, -1654099, 5337571, 2484102, --66572, -3845606, 3534221, -2529736, -3628711, 5591511, 5168993, -76773, 3213173, 119722, --1524177, 2967823, -503048, 1159641, -1005022, -1306744, -376883, 2309619, -1759326, -1305670, --124554, -1747515, 574452, -1575179, -963146, 152471, -340913, 2295123, 16106, 675384, -1405528, 1473711, 329639, 763967, 1148367, 3058554, 517544, 2882997, 421981, 1429687, -2029909, 13103408, -499290, 8278013, 11330661, -5987185, -13932874, 578210, 10613938, -8215199, -7455527, -2223183, -10081362, -4664335, 10171019, -9934796, -8756365, 6377490, -10126996, 3369939, -4840428, 3969624, -2869038, 6132140, 1736241, 1146756, 3954054, -6479495, 8827232, 4336307, -3835406, -1827509, -980863, 16440061, -5755793, 1015223, 4283156, 8269960, -11245298, -9265318, --8623757, 326418, 638340, -583579, 5233955, 1622424, 9342091, 3753802, 5474473, -886374, -731755, -4625143, 8348343, -3787624, 8233989, -4498442, -7106024, 12246026, 9949292, -14097156, --12439836, -8182450, -6397891, 4429185, 698469, -2860448, 6478958, 7143605, -8586176, 5045513, --700617, -17185774, -5682242, -8668855, -7864622, 2968359, -2682207, 5635534, -1307818, 841277, -10268193, 10460393, -980863, 2746632, -921271, 1622424, 1469416, -3547106, 2936147, 853625, --145492, 8825621, 2642479, -69793, 252329, -1584306, 2597382, -295816, 1705102, -1918240, --118648, -2022930, 523986, 2291902, 710817, -13959, -290447, 2004139, 1280974, -1277753, -159451, -62814, 287763, 1014149, 434865, -7471633, -10411538, 6240051, -5972689, -4431870, --3697430, -12159052, -1241782, 5394479, -3247532, -754304, -4396436, 9980967, 1583769, 6350646, -4904316, -8078297, 8320426, 12377022, -3754338, -5079873, 1379221, -2168959, 5399311, -15343771, -5921150, 13262322, -1714766, -4358318, -3732327, 5761699, 11945378, -2832531, 3057480, -5316633, -8202851, -9826885, -3704946, 1900523, -1476395, -7625715, 14086419, 9883257, 7469485, -3129421, --10505490, -1306207, -14949171, 2589329, -1026497, -483184, -246424, -2266669, 8206072, 6889128, --10361609, 5830418, -6175089, 8628052, -719944, -1748589, -643171, -9137543, -1671279, -8335458, --18382996, -836445, 2237141, 1460289, -7007776, -236760, -1947768, -13783624, 360777, 11979201, --7483981, 3140158, 3992172, -1511829, 935229, -3536906, -2010582, 2819646, 3496104, 3764002, --864899, -2394981, -827318, -2574296, 2204929, 1047972, -2084670, -617938, -1908576, -2168422, --194347, -1947231, -2879239, 1844689, -522912, -2266669, 1905355, -1583232, 1589675, 2291365, -1062468, 2203318, 1651415, -9127, 1567663, 4959077, 2487860, -2441152, -1582159, -2804614, -118648, -3633542, 2042257, -194884, 2937758, -730144, 2316061, -357556, -1438814, 4687420, -2364916, -19313932, 1288490, 11377368, 6099391, -8761733, -7255811, 14244259, 3201898, 3257733, --2865280, 3739843, -217433, -9405442, -2543695, -9882183, 4636954, -5857799, -978179, -9626632, --10808285, -14360760, 8959839, 6169721, -4701916, -5072893, 3984119, -13181255, -1281511, 1072131, -3130494, 5899675, 2774012, 446677, -4657892, 2003065, -4283156, 3572339, -4111358, 2384781, -1156420, -4123706, -5523865, -10313290, -6924561, 2702608, -17798344, -4758287, 9656160, 5250061, --2208687, 23217520, -3420942, 10795400, 10534481, -16793858, 1029718, -2167348, -14317273, -7379291, --7910793, 322123, 1599339, 16067473, -2643016, 1611150, 10772852, 8114804, -1959579, 10870562, --5187784, -3889630, -7282654, -9496173, -14001593, -5221070, 7883950, -15102716, -7807714, 11803107, -8486319, -5039608, 10656351, -4698694, -804770, -401579, 5093831, -3278671, 5076652, -3136400, -4334696, -1194538, 1755031, -1986422, 3496640, 3491272, 1418950, -520765, 3955665, -2515240, --3001645, 3218541, -936840, 3505767, 2437394, 1782411, 2251100, 1491964, 599148, -5764920, --1138703, 32212, 1576253, -1468342, -2529199, -1975685, -5657546, 2215666, -170188, 3627100, -1941325, 3534221, 2565169, 825707, 1140851, 13302051, -2288681, 4273493, -6478422, 3818763, -5623186, -3432216, 4816269, -7400766, -8069707, 12345883, 6780680, 7969849, 9904195, -54224, --8067559, 10665478, -9299678, -12563853, 229781, 11776800, -1640678, -10207527, 1448478, 13862007, --1942936, 3806415, 1399623, 19449222, 1288490, 4163434, 9657234, -1219234, -4904316, -9315247, -1381906, -1289564, -8887898, 295279, -5207111, 3575560, 13257490, 136365, -7879655, -2353105, --7299297, -3919158, -1071058, -3105798, 1864016, -9825811, 10640245, -5569499, 17920214, -4488778, --12873628, 751619, 717796, 6340446, 2792803, 3437048, -13201656, -10763725, 7882339, -11208254, --15532749, 4500052, 3202435, -3535832, 16997870, -13732621, -18951544, 7147363, -12905840, 1269163, -1904818, 392990, -12402255, -7595113, -16160888, 5603859, -1522029, -872952, -2394444, -7220377, --3138011, -5470178, -2592013, -2105071, 6338835, -4722854, 4901095, 1768990, 5058398, 857383, -773631, -6608344, -2283849, 1837709, -1995549, -7213398, 1575716, -1139240, -2679523, -2514167, -2460480, -2874407, 3271691, -1628866, 3942243, -687195, 2090039, -3740917, -3545496, -81068, -450435, -1305133, 5885179, -4950487, -4579509, -3086471, 2950106, 3051574, -3670587, 883153, --10432476, 5819144, 519154, 14220637, 14780056, 21497922, 9718974, 4625143, 2914135, 7143605, --7338489, 8246337, -12965433, 6369974, -1322313, -1009317, -24800752, -9489193, -4118874, 8510478, --1114544, 2128693, 2626373, 2328409, -12702366, 13168370, -550830, 5409512, 380105, 12295418, --13178033, 9203578, -6505802, -232465, 9840307, -11155104, -5075578, -12163884, -4927938, -13554917, -12363063, 9205726, 16627966, -741956, 3892314, -15119359, 3405909, -15678241, 15252503, 4406100, --2543695, 14572287, 14738180, 7634305, -8872329, -13089450, -19013284, -769873, -6768332, -9484898, -10230075, -2762738, 23896124, -17677548, -6528351, 13761075, -14343580, -5615133, 3234110, 315143, --2141578, -13651017, 6202470, 2392834, -7519951, 6847252, 14379014, -12351789, 13877039, 17410724, --5255966, -9133248, 7087770, -6998113, 6543920, 4277788, -7325604, -5604396, -1502165, -2209224, -10116259, 3483755, -1787780, -4891968, -8140574, -4522601, 2498060, -5122822, 2415382, 4946192, -3084324, -3433290, 2601140, -2804077, 3824669, 2564096, 4274566, 2661806, 144418, -4525285, -2929168, 4584878, -4656282, 217970, 1534914, 1723893, 3875134, 385473, -561567, 4355634, -5267241, 1063004, -2480344, -4132832, -154082, 3704409, 4491462, 3149285, 22266184, -5068062, -3116536, -1168768, -7377143, 10021769, -3693135, 3726421, 1166084, 14344117, -4543539, 16722455, -242666, 8334384, 7344931, -1298691, -5453535, -16248935, 7683697, 16951700, 847719, -97711, -11709155, 9984725, -766652, 1855426, 20113332, 12642773, -3700114, 4402879, 13205414, -3329674, --14731738, 360777, -10712722, -1671816, -6812355, 630286, -20361904, -6058052, -7457137, 347355, -4189204, 4277788, 19689204, 21828634, 11448772, -15103252, -8973797, 12265353, 17147120, 3635153, --15788300, -2590939, -3793530, -16404091, -10424422, -12424267, 15101105, -5683316, 2007360, -15446313, -22378928, 16556025, -1939715, 6834904, 37192808, -1903207, -7720741, -14347875, -949725, 9884330, -7759396, -5790153, 11149735, 22277458, -9644349, 14198625, -6571300, 4628901, -9047349, -4890894, --7821673, -10152229, -5302137, 6591164, -127775, -2262374, 1511292, 2710124, 11922829, -1376537, -1088237, -187905, -5674726, -652298, -2105608, 1062468, 4745939, -3207804, -1618666, -3964255, --1982127, 1305133, 1348620, -1478006, -8082592, -7487202, -2684892, -9208410, -8126615, -1527935, -6934762, 6191196, 5260261, 1132798, -1411971, 236760, 2854006, 2433636, -1152125, 1643899, -1071594, 11319386, 907849, -7062537, -9737228, -15964930, 20779588, -12985834, 15634218, -11394011, --17415556, 973884, 21526376, 14078903, -16189342, -10588705, 3543348, 3321620, 7172059, -1141388, -14296872, 7825968, 18889804, -6829535, -3359738, -556735, -3860639, -18246632, -13708462, -4127464, -18986440, 4097936, 1329292, 755914, -18032420, -20223928, -15892453, 8222178, 9097278, -6851547, --4769561, 1874753, 2020245, -10744398, 2939368, 20301774, 3358128, 12750684, 12254615, 9033390, -21499532, 31222802, 10033580, 627065, 4289599, 12378633, -6693707, -3375308, 8073465, -2725157, -4224637, -2799245, 13245142, 4845260, 9321153, -2570001, -3783866, 6905771, 17759690, -1235340, --14940044, 9499931, -23264228, -26670674, -9371082, 13901735, -9148280, -26378078, -16388521, -6663642, -9433896, 6657200, -14526653, 25725780, -8477729, -17932026, 4467303, 7080791, -6150930, 8974871, --9519795, -3599720, 3086471, 2463164, -5123359, 4584878, 605054, 8145406, -4738423, -9638980, --5898064, 1659468, -2407866, -1918240, -1042066, 107374, -1057636, 6606197, -1410897, 1123671, --2949032, 3059627, 5137855, 1086090, 4910222, 1641214, -8389682, -3555159, -270583, -6976101, --8570070, 3992709, 5497022, -4520990, -9128953, -9683541, 3644280, 1619740, -750009, 6258841, --3956739, 8410083, -37284076, 1984812, 18926310, -3520263, -4414690, 22918482, -12287901, -12752295, --16187732, -5417028, -5458367, -10845329, 3219078, 5213017, 8863202, 6200859, -5168457, -4142496, --1814087, -4637491, 1552094, 4267587, 18700824, -8067559, -24195162, 12883291, 114354, -776315, --20122996, 8911520, 3918621, -2152852, 22944790, -6635188, 2502892, -2197413, 10122701, 12127377, --13412646, -1395864, -7522635, -952409, 6866579, -5155572, 10510859, -16462610, -13674102, -8734890, --14610405, -2623688, 1331440, 2182917, -20437066, -13518946, 9730248, 16400333, -7827578, -9306120, -8666170, -18791556, -16957604, -16500727, 18034568, -30531312, 9880572, -1737314, -17966386, -5828271, -15151571, 38597796, -5197984, -10791105, 12741020, 29569240, 10644540, -6805376, -7215545, -1472100, -8104067, -671626, 3767760, 17551384, 1134945, -6724845, -12509092, 10232760, -14754286, -10165114, --7365332, 5081483, -6110128, -10791105, -6794102, -6615324, -137439, -7995082, 2653216, -6225018, --597537, -2125472, 7436199, -5794985, -4514548, -11742977, -3528853, -2194728, -3984119, 10902238, --8211441, -10572062, -748398, -9295383, -8463233, -3965866, 1153736, 8134668, -1176821, -3673808, --1692754, -5613523, 3764002, -11187316, -1061394, 11281268, 5322538, 7332583, -3000035, 2691871, -3539590, -2889439, -4466229, -6381248, 2088428, 5355288, -2363306, -20855288, -33608656, -1828046, -38245612, -6031208, -2888366, -25264608, -2058900, -1589138, 2498060, 8498130, 1009317, 7079717, -353261, -319975, -18228914, 2668249, 16302085, -11019275, 20253456, -8513699, -1415192, -18006650, -11435887, -8931384, -6009733, -20796768, -28453622, 14529874, -13968307, -13528610, 4809827, 2972117, --6249715, 1455994, 15869904, -4693326, -15446850, -9439264, -19736986, -2346126, 5444945, 13607530, -2626909, -3945464, -3508988, -8068633, 4546223, 14123463, 2180233, -8778376, 15870441, -15310485, -1495722, -26410828, -7937100, -5154498, 32444720, -20578262, 6512244, -6672769, 4134980, -3779571, --3786551, 644782, 13109851, 4030827, -24197846, 26455388, 7934952, 9451612, 3271691, -10535555, --8200703, -3016678, 3196530, -585726, 5134634, -14302241, -15049029, -2433636, 7109782, 16067473, --10107669, 13625784, -3509525, 5305895, -10930155, 6131066, -17717276, 19633906, 696858, 2176475, -6281927, 8845485, 691490, -12277701, -6089727, 3285113, -11806865, 3132105, 5287105, 4886599, --7099044, -4328254, 11587822, 2116345, -12141336, -1764695, 10019085, -3893388, -14899242, 16600049, --4723391, 6379100, -3012920, -4843113, -8041253, 5050882, 1206886, 5251672, 595927, 8861591, -848256, 6342593, -3336653, 341987, 3808026, -2379949, -3759707, -16653736, -9628243, 35494684, --4250944, 2941516, -18313740, 16556562, -9396315, 12187507, -9483288, 21437256, 2342905, 2174864, --10222559, -8544837, 12714177, 27788976, -11357504, -16951162, 8214125, -6678674, 18563922, 23156316, -11661373, -3483755, 14573898, -9523553, -8605504, 19454592, 27043798, -29982092, 2719788, 4472135, -5344013, -10146323, -436476, 12105902, -30030948, 9107478, 17983028, 6664716, -13205414, -3727495, -22022444, 17811766, 6201396, -10236518, -13087302, -26226680, 37697464, 6774774, 19521700, -2798708, --7680476, 4190814, 11485279, 353261, -314069, -30481920, 5012764, 28751584, -4844723, 27551142, --16236587, -7426536, -11230803, 6423124, 26217018, -8169028, -449898, 23440858, 28932510, -9345312, --20619602, -18671296, -15966004, -7584912, -6564858, 16464220, -19856708, 10977400, 12735115, -4593468, -1743220, 12897787, -2178622, -7452842, 8089571, 5472325, 4467303, 11853036, 2939368, -2152852, -11087995, 3805878, 4883915, 5413807, -1513439, 600759, -2110977, 4605279, -19433116, -5555004, -1180042, -3925600, 8053601, -14926622, -1329829, 96100, 5624260, -448287, 8732742, 5732171, --3637301, 11772505, 6422587, -4241280, 8939974, 9171366, 462783, -6118181, 4898410, 8914741, -5869610, -1478543, -8334384, -4376035, 2674691, 1234803, 1797444, 14156749, 10413685, 24984362, --7557532, 18095234, -9577240, -3819300, 16817482, -566399, 22923314, -27668716, 17335024, 3160022, -7698192, -11130945, 8389682, 20640002, 40135932, -9243306, 10189273, -567473, -26646514, 24414204, -2459406, 9538049, -4884452, -12480638, -4653060, -1036161, -10358924, -6514929, 34055332, 2362232, -13077102, -9777493, 24124294, 106300, 11682848, 4920959, -14172855, -3048890, -8761733, 222265, -4318053, 28519120, 14483167, 1159104, 3331821, -1063004, -2435247, 4627291, 2781528, 17829482, -14490146, 7268696, -8589398, 12353400, 26036628, -24747064, 22804128, 3592203, 6785512, -24879672, --11880953, -31245350, -25252798, -5065914, 16640851, 13873281, -43314208, -438087, -19616190, 10104447, -42959872, 21498996, -27885612, 15013058, -11572789, -14458471, 23578834, 11838540, -12392591, -6977175, -20713016, 16938814, 9159555, 26406532, -7381975, 16116865, 14140643, -17163764, 23517094, 6305012, -27323508, 8176544, -2807298, 16000901, -1946157, 3994320, -19633370, 14323179, -9721658, 7330973, --7313793, 3088618, 8680129, 21689048, 5441724, 13071196, 3049427, 3980361, -7551090, -1920924, --2930242, 1495186, 10654740, 9105331, 16191490, 5810554, -2386391, 2325188, -4290673, -2515240, --17064442, -3139621, 3710852, 4918812, 13845364, 12390981, 11230803, 14028974, -36266704, -55672976, --14601815, -6265284, -13826573, 3097208, 18711562, -19624780, 28263032, 10372883, -40940704, -31345746, --6376953, 22349400, 709207, 1876364, -4374961, -12944495, -39646844, 1632625, -33329484, -27519466, -13385266, 10718091, 9652939, -4646081, -13001940, 29971892, 17843442, -12710956, -26036092, 19792284, -9875204, 4668630, -12320114, -30335354, 11406359, -14236206, 4417374, -25837450, 31279710, 792421, --12729746, 3080029, 7760469, 25929792, 16048682, -6622840, -1453310, 9092446, 8818642, 10002979, --6065568, -40517648, -32048510, 6467147, -4561256, 23746338, -4728222, -10159208, -28782724, 33246268, -12563853, -23128936, -24078660, 34105260, 31752156, -310848, 23238994, -3105798, 607201, -9659918, --6091874, -18280992, 22381074, -4150012, -5337571, -9756555, 9101573, -28778428, 13374528, -8406325, --5638755, 20491826, -673773, 3265249, 4910758, 18813568, 9372692, -7633231, 13706851, -4128537, -16594680, 6680822, -19146964, 4726612, -9844602, 9002251, -8035884, 223338, -12805445, -6426345, -6658810, -12408161, 5043366, 4279935, 5187784, -11090679, -8196408, -14279693, -12773233, 16699370, --6258841, 10786810, 6535867, -10205379, -1683090, -8924405, 122943, -5659157, 20859046, 17796734, -11814918, 16623134, -4318590, -18449032, -21365852, -3026341, 6160057, 30745524, 18547816, -7099044, --5978058, -8286603, -15546708, -949725, 6721624, 3106335, 19530290, 1913408, -13764833, -35365296, -55763708, 1405528, -43133820, -3264712, -16057272, 7294465, 21401286, 19439558, -23997592, -38509212, -6577743, -18431316, 5873905, -3755412, 16979080, -5574331, 2429341, 10087268, -15731928, -19291382, -2038499, 5063767, 16811576, -385473, -26896696, 17691508, -15001247, 13903883, -13038447, -8876624, --1468342, -4268661, -28916404, 5432060, 8079371, -27958090, 11826192, -10988674, 5601174, -9329206, -27011050, 21031918, -27236536, -14457397, 18602578, 23309324, -27870580, 36792836, 2386928, 29625610, -21525840, 34959960, -10814728, -14838575, 7850664, -29011430, 4430796, 3664681, 50939924, -15794742, --47884052, 80834504, -38193532, -29381872, 46605228, 21049098, -27193048, 45282912, 5039608, -36888400, -45871860, 5535139, 4106526, -8021925, 6738267, 30434676, -7448010, -10620917, -15850040, 22657026, --8259759, -5822902, -3191161, -9165997, -9780177, -14234058, 13598403, -2057289, -1282048, -5182415, --3519189, 1681480, -6152541, -10718091, 1343251, -8686571, -16030965, -16715476, 20686710, -9062918, -1902671, 19047644, -9222369, -8839043, 1321776, 9400610, 4053376, 3949223, 18358838, -11449846, -2629594, -8471286, -5254356, -3795677, 30378840, 14976551, -4977867, 4199405, -16155519, 5033165, --14789720, -9302899, 7093139, -4054986, -30488900, 18610094, 7627325, -5825587, -50255948, 7009387, -14988362, -37600292, 17184164, 10033044, -13254806, -3691525, -706522, -9159555, -3071975, -5334350, --16829292, 548682, -8410620, -1767916, -4155381, 8262444, 29965986, 25195352, -23167590, -2467996, -31541702, -5439039, -5942624, -32192390, 3719979, 10694469, -5288716, 27610198, 65951908, -22087406, --27797566, 47060492, -3132642, -25216290, 29308320, 19398220, -15191836, -22637162, -28101434, 8683887, -15095736, -12409771, 44265008, 28985124, -55169928, -52842592, 30900142, -24806120, -32256278, 41998336, -6767795, 56181932, 26934276, -6671158, -7508677, -40316860, -31507344, 92204896, 25456808, -19618874, --44518948, 1379221, -18116172, -39654360, -6163815, 46761992, 19870666, 738734, 38416336, 33695092, --10590316, -42572788, 6669548, 25769804, -10561861, -9832791, 53525492, 30911416, 5362804, -5451924, --27449136, -26787174, -6909529, 25637734, 10315975, -10165651, -4851166, -11788611, 10070088, -7510287, --10251013, -6453725, -1221918, 7847979, 10348724, 9337796, 3881577, -24255828, -8494908, -4575751, -9285182, -9288404, 1745904, -2299418, 22552336, -14277008, -10036802, 23481124, 6548215, -11498164, -18370648, -6118718, 5415417, 1722819, 4238059, -13741211, -3722126, 19410568, 18800146, 8082592, --7354595, 5324149, -8453033, -6541235, -5168993, 10370735, -15610596, -2952790, 12537546, 49995568, -41503880, -11044508, 29477972, 3130494, -22994718, 14770929, 25171192, 8516383, 10851772, -32958506, --6788196, 3963718, 6626598, -4773856, -28797756, -10257993, 10302553, -6903086, -3116536, -24217174, -37261524, 4772783, -30863098, 17546552, 43755516, -22512608, -13250511, 6518687, 14380624, -14026826, --27674084, 23781770, 39779452, -3081102, -15757698, 5291937, 11199664, 18274548, 25448754, 1799591, -46395848, -920197, -51864952, 525597, -5924371, 17010218, -5515275, -42149200, -1267015, -18132816, --17929878, 25502978, 13242458, 14601815, 18130130, -37758132, -19916300, -6523519, -606127, 15430207, -434865, -7612830, 966368, -12837657, -25922812, 2639794, 40061308, -20511154, 3725884, -15908022, --11586748, 27603754, -33881388, -237297, 14743012, -11807939, 5442261, 4355634, 8305930, 9878962, --17947058, -21231098, 35851704, -7331509, -11772505, 18668612, -18564460, 11707544, 2201708, -7440494, -5550709, 15709380, -3073586, 2250563, -7788387, 3891240, 850404, -884226, -6971269, 8652748, -4128537, -703838, -857383, 7283728, 5796595, -6486475, -12097312, 6694244, -862752, 3484829, -550293, -2947958, 6021008, 328028, 4967130, -1825898, -1126355, -3319473, 812823, 5936719, --1456531, 14567992, -6018323, -4210142, 486942, -6113886, 3826816, -43223476, -62003760, -54831164, -110295832, 105287368, 105076376, 296649088, 105393664, -12213276, 19523310, -205112608, -249850064, -83937080, --140196864, -194280704, 24983824, -10773925, -32512902, 213981712, 130604584, 54570244, 334143072, 157770784, -29167122, 152371488, -36135172, -181773760, -174100256, -165839424, -229861824, -225025152, -52853868, -81204408, --132513696, 154775584, 71257800, -55684788, 223462320, 72227392, -26243860, 252712112, 230200048, 53080964, -238889296, 242449824, -9298604, 60250876, 27439472, -233230688, -270818624, -201627232, -381252448, -360993088, --216846992, -289538784, -217855776, 24761024, 179109792, 203320528, 436755232, 397176576, 350167616, 377354208, -278284352, 141373680, 43154756, -30522722, -212568672, -256203920, -274342112, -309107712, -293347872, -249975680, --161589024, -117308440, -114790520, 22028350, 69610144, 136782368, 325055488, 337662272, 230827648, 288598720, -121995328, -39716100, -95506648, -147853168, -202782048, -146757424, -98203888, -97641248, -33684356, -9064528, -838592, 52167748, 66122632, 63123136, 96505768, 60898880, 39327940, 48821432, -28745680, -26458610, -8225936, -78065328, -55330452, -20219632, -75537200, -46500000, -5207648, -75889384, -80305152, -53165252, --78797080, -51562692, 59413356, 111162344, 176562352, 260577280, 243059184, 208193168, 195572416, 105966504, --32239636, -162426544, -287866976, -341674304, -308279872, -249395872, -188383712, -88151520, 28366648, 112104552, -157007904, 169647456, 149630224, 133777496, 124294744, 125515048, 87298432, 41714868, 19335406, -10277320, --35206920, -31514322, -57379152, -61457224, -43352328, -31918586, -42579768, -40274984, -51890184, -58089968, --54074712, -36619428, -17319992, 7194070, 10759430, 7631083, 514859, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +3439732, -4676683, -3805878, -653372, 3687230, 5433134, -2558190, 3172907, -1756642, -4524748, +-1240172, -2529199, 1487669, -622770, -2186138, 2004676, 3043521, 681826, 3679176, -6740951, +-7283191, -4679904, 678605, -18254, -1244467, 351114, 2224256, -728534, 3003256, 2480344, +-3180960, 1210644, -237297, 3888019, 3586835, 1351841, -3809099, 2497524, -2268817, 1269700, +2501282, -6088653, 6653441, 9768366, 1280437, 4425964, -3595425, -727997, -3375308, -1756105, +3028489, -1013075, -3490735, -927713, -2196876, 1681480, -2142652, -1951526, 198105, 1784022, +-1775969, -2009508, -867583, 3468723, 3127810, -2643552, -969052, -3123515, 721555, 4121021, +1148904, -1512365, -1967095, 1548873, -550830, -2812130, -1022739, -1899986, -269509, -1020055, +1633698, 1523640, 823560, -905701, -1241782, 2776696, -373125, 753230, 1446330, -417149, +-34897, -579284, 852014, 109522, 217433, -816581, 119185, -260919, -803696, 36507, +-120796, 597000, 1468879, -817118, 345745, -161598, 717796, 869194, -206158, -362925, +-177704, -48855, -775778, -331786, 355945, -303332, 154619, -21475, 657667, 137439, +15028627, 6916508, -521839, 3146064, 2856153, -3605625, -1768990, 4166655, 1894081, 4534412, +-3299609, 6594386, 2475512, -6512781, 5163625, 271120, -120796, -3439732, 3776887, -7042673, +-6043556, -1299765, -2151779, -1175210, -2161979, 807991, -1314797, -2934000, -2121177, 2440078, +-2678449, 1700807, 1073742, 675384, -2956548, 4129074, -8671539, -1536525, -55298, -1532230, +-1097364, 732292, 1608465, -2794950, 2200634, -3384434, 3212636, 1002875, 694711, 3305514, +-2356327, -584116, 1334661, 5181341, 1275068, 2160906, -1212791, -4535486, -6318434, 1137093, +3408057, 4445291, -1847373, -7073811, 1032403, -2907156, -1983201, -1656784, 1937030, 180389, +6874632, -231928, 2301566, 1324461, -1063004, -1822677, -1942936, -7230041, -2136746, -1206349, +-1001264, -1408212, 1317481, 3577708, 984621, 3391951, -61740, -354872, -1118302, 909459, +1222992, -376347, -1420560, 1181116, -744640, 444529, -636192, 597537, -1061931, -673236, +949725, 282394, 522912, -409096, 309775, -696322, 8085813, 1894618, -6847252, -7743289, +2115272, -2348273, -6435472, 7310571, -3591667, -1174137, -1005559, 5738613, 1194001, -3293703, +4003983, -3089692, 6056978, -8361765, -5540508, 6701223, -6976638, -7011534, -2833068, 5731634, +2492692, 2756832, -678605, 5138929, 3088618, -507880, -6763500, 1850057, -1887101, 2454037, +2134599, 1864016, 5854041, 1595580, -5785858, 555661, 4012036, 5930813, 1981591, -3209414, +-773631, -4745402, 2031520, -8437463, -339302, 9167608, 482110, 1007707, -4696547, -5775658, +883690, 1296006, 6716255, -1433982, 572304, 738198, -1000191, 722628, 2229088, 432181, +4724464, -1249836, 3136937, 499290, 845572, 603980, 5545340, 267899, -776315, 1062468, +-1185411, -3714073, -1999307, -3829500, -89121, 7025493, 1466195, -2245731, -783295, -3946001, +2270964, -3079492, -2189360, 802085, 120796, 279173, -1794760, -2502892, -520228, 678068, +-848793, 1510218, -154082, 46171, 1440962, 945430, 1452236, 1242856, -3758, 526134, +-1156420, 119185, -1023813, -1059783, 798327, 993748, 1669669, 1257889, -783295, -146566, +893890, -581968, -1243393, 776852, 202400, -18589692, -12195023, -2648921, 1991254, 3027415, +280784, 6442, -7144141, -407485, -1583769, -1158031, 121333, -1777043, -854699, -5225902, +2694018, -11031087, -4080756, 1026497, -2257542, -3346853, -1973001, -6260452, -3228742, -2579665, +-3024731, 1429687, -4911295, -2643552, 6004365, 3976066, 373125, 2939905, 2097018, -1938641, +-4081830, 2442226, 8984535, 1063541, 1097364, -3513820, -3210488, 2694018, -7756174, -4068408, +8529805, -7783555, 2334315, -1822677, -3976603, 1853815, 548145, -2132988, 479426, 1359357, +-2736968, 70867, -563178, 5327370, 4659503, 738198, 1237488, 2336999, -179315, -983011, +-1845762, -10817412, 5238787, 3329137, -2980707, -70867, -4568235, -1189706, 627065, -3277060, +1489280, -3985730, -2262911, -4647692, -6984154, 4632122, -1342177, 255551, -5904507, -1420560, +746787, 1027034, -1566053, -220654, -338229, -1573569, -3060164, 539018, -1576790, 1364726, +-253940, -715649, -637803, -265751, 1480690, 313533, -2266669, 482110, -688805, -132070, +716186, 394063, -596464, 589484, -1780264, 1007170, -1618666, -444529, -16087337, 2477123, +3774740, -1016834, -1409286, -8910983, -3644280, 2439005, -7953743, -7627325, 1557999, -7256347, +-3732864, -191126, -4377109, 2463701, -3450469, 5432597, -2870649, -1893544, 1717450, 3795677, +7038378, 4388920, -7844758, -437013, -582505, 3855270, 5799817, 9842454, -4380330, -3888019, +5107790, -5398774, 1248762, 1530082, 8326331, 3036005, 4647155, -6214281, -2740189, -8478802, +6692633, 6989523, 8055748, -147640, -1733556, -5420249, -1132798, 5393942, -2513093, -3500935, +-3204583, -4262755, 915902, 971200, 1270774, -5826660, -77846, -5710159, -307627, -878858, +2315524, 1971927, -1744294, -2609730, -7202660, -453119, -577136, 4405563, -2782065, 7342247, +-4205310, 884226, 3419331, 6665789, -5184026, 1513976, 3512210, -6060736, 3017215, -39192, +7416872, 2434710, 1660005, 4519916, -462246, 1207960, 3506304, 1377074, 37044, -1338956, +56908, 1435056, -479963, 1833951, 2871723, 2305324, -1088774, 1257889, 180926, -826781, +1148367, 1465658, -2684, 644245, 1837172, 1302449, 1481227, 660888, -724239, -1247688, +1415729, -1336272, 1409286, -794569, 102005, 1717987, 1346472, -476741, 19902878, 17075180, +-620086, 513785, 8873402, 1217086, 4342212, -2657511, 4867272, -3750580, 8957691, 3074123, +6442, 1835025, 617938, 11353209, 7655243, -7435126, -6204081, 2416993, 1190780, -2379949, +-1625108, 1443646, 5432060, 4044786, 2473901, 587337, 2862059, -1891396, -161061, 6256157, +-6881075, 2761664, 8337069, 6266894, 11338714, -1113470, -1739999, -986232, 702227, -3620121, +12322261, 11311333, 8064875, -3757560, -1140851, 4811974, 3901978, -3448859, 753767, 6475200, +-2437394, -3027415, 4099546, -11989938, -1413044, 666257, 1744294, -4056597, -7860864, 3204046, +5341329, -6375342, -2397129, -6933151, 2561948, 489626, -1482838, -1489280, -6075231, 10139881, +-2695092, 1365800, -10339060, -2446521, -4952634, 12057584, -2158221, -1654099, 5337571, 2484102, +-66572, -3845606, 3534221, -2529736, -3628711, 5591511, 5168993, -76773, 3213173, 119722, +-1524177, 2967823, -503048, 1159641, -1005022, -1306744, -376883, 2309619, -1759326, -1305670, +-124554, -1747515, 574452, -1575179, -963146, 152471, -340913, 2295123, 16106, 675384, +1405528, 1473711, 329639, 763967, 1148367, 3058554, 517544, 2882997, 421981, 1429687, +2029909, 13103408, -499290, 8278013, 11330661, -5987185, -13932874, 578210, 10613938, -8215199, +7455527, -2223183, -10081362, -4664335, 10171019, -9934796, -8756365, 6377490, -10126996, 3369939, +4840428, 3969624, -2869038, 6132140, 1736241, 1146756, 3954054, -6479495, 8827232, 4336307, +3835406, -1827509, -980863, 16440061, -5755793, 1015223, 4283156, 8269960, -11245298, -9265318, +-8623757, 326418, 638340, -583579, 5233955, 1622424, 9342091, 3753802, 5474473, -886374, +731755, -4625143, 8348343, -3787624, 8233989, -4498442, -7106024, 12246026, 9949292, -14097156, +-12439836, -8182450, -6397891, 4429185, 698469, -2860448, 6478958, 7143605, -8586176, 5045513, +-700617, -17185774, -5682242, -8668855, -7864622, 2968359, -2682207, 5635534, -1307818, 841277, +10268193, 10460393, -980863, 2746632, -921271, 1622424, 1469416, -3547106, 2936147, 853625, +-145492, 8825621, 2642479, -69793, 252329, -1584306, 2597382, -295816, 1705102, -1918240, +-118648, -2022930, 523986, 2291902, 710817, -13959, -290447, 2004139, 1280974, -1277753, +159451, -62814, 287763, 1014149, 434865, -7471633, -10411538, 6240051, -5972689, -4431870, +-3697430, -12159052, -1241782, 5394479, -3247532, -754304, -4396436, 9980967, 1583769, 6350646, +4904316, -8078297, 8320426, 12377022, -3754338, -5079873, 1379221, -2168959, 5399311, -15343771, +5921150, 13262322, -1714766, -4358318, -3732327, 5761699, 11945378, -2832531, 3057480, -5316633, +8202851, -9826885, -3704946, 1900523, -1476395, -7625715, 14086419, 9883257, 7469485, -3129421, +-10505490, -1306207, -14949171, 2589329, -1026497, -483184, -246424, -2266669, 8206072, 6889128, +-10361609, 5830418, -6175089, 8628052, -719944, -1748589, -643171, -9137543, -1671279, -8335458, +-18382996, -836445, 2237141, 1460289, -7007776, -236760, -1947768, -13783624, 360777, 11979201, +-7483981, 3140158, 3992172, -1511829, 935229, -3536906, -2010582, 2819646, 3496104, 3764002, +-864899, -2394981, -827318, -2574296, 2204929, 1047972, -2084670, -617938, -1908576, -2168422, +-194347, -1947231, -2879239, 1844689, -522912, -2266669, 1905355, -1583232, 1589675, 2291365, +1062468, 2203318, 1651415, -9127, 1567663, 4959077, 2487860, -2441152, -1582159, -2804614, +118648, -3633542, 2042257, -194884, 2937758, -730144, 2316061, -357556, -1438814, 4687420, +2364916, -19313932, 1288490, 11377368, 6099391, -8761733, -7255811, 14244259, 3201898, 3257733, +-2865280, 3739843, -217433, -9405442, -2543695, -9882183, 4636954, -5857799, -978179, -9626632, +-10808285, -14360760, 8959839, 6169721, -4701916, -5072893, 3984119, -13181255, -1281511, 1072131, +3130494, 5899675, 2774012, 446677, -4657892, 2003065, -4283156, 3572339, -4111358, 2384781, +1156420, -4123706, -5523865, -10313290, -6924561, 2702608, -17798344, -4758287, 9656160, 5250061, +-2208687, 23217520, -3420942, 10795400, 10534481, -16793858, 1029718, -2167348, -14317273, -7379291, +-7910793, 322123, 1599339, 16067473, -2643016, 1611150, 10772852, 8114804, -1959579, 10870562, +-5187784, -3889630, -7282654, -9496173, -14001593, -5221070, 7883950, -15102716, -7807714, 11803107, +8486319, -5039608, 10656351, -4698694, -804770, -401579, 5093831, -3278671, 5076652, -3136400, +4334696, -1194538, 1755031, -1986422, 3496640, 3491272, 1418950, -520765, 3955665, -2515240, +-3001645, 3218541, -936840, 3505767, 2437394, 1782411, 2251100, 1491964, 599148, -5764920, +-1138703, 32212, 1576253, -1468342, -2529199, -1975685, -5657546, 2215666, -170188, 3627100, +1941325, 3534221, 2565169, 825707, 1140851, 13302051, -2288681, 4273493, -6478422, 3818763, +5623186, -3432216, 4816269, -7400766, -8069707, 12345883, 6780680, 7969849, 9904195, -54224, +-8067559, 10665478, -9299678, -12563853, 229781, 11776800, -1640678, -10207527, 1448478, 13862007, +-1942936, 3806415, 1399623, 19449222, 1288490, 4163434, 9657234, -1219234, -4904316, -9315247, +1381906, -1289564, -8887898, 295279, -5207111, 3575560, 13257490, 136365, -7879655, -2353105, +-7299297, -3919158, -1071058, -3105798, 1864016, -9825811, 10640245, -5569499, 17920214, -4488778, +-12873628, 751619, 717796, 6340446, 2792803, 3437048, -13201656, -10763725, 7882339, -11208254, +-15532749, 4500052, 3202435, -3535832, 16997870, -13732621, -18951544, 7147363, -12905840, 1269163, +1904818, 392990, -12402255, -7595113, -16160888, 5603859, -1522029, -872952, -2394444, -7220377, +-3138011, -5470178, -2592013, -2105071, 6338835, -4722854, 4901095, 1768990, 5058398, 857383, +773631, -6608344, -2283849, 1837709, -1995549, -7213398, 1575716, -1139240, -2679523, -2514167, +2460480, -2874407, 3271691, -1628866, 3942243, -687195, 2090039, -3740917, -3545496, -81068, +450435, -1305133, 5885179, -4950487, -4579509, -3086471, 2950106, 3051574, -3670587, 883153, +-10432476, 5819144, 519154, 14220637, 14780056, 21497922, 9718974, 4625143, 2914135, 7143605, +-7338489, 8246337, -12965433, 6369974, -1322313, -1009317, -24800752, -9489193, -4118874, 8510478, +-1114544, 2128693, 2626373, 2328409, -12702366, 13168370, -550830, 5409512, 380105, 12295418, +-13178033, 9203578, -6505802, -232465, 9840307, -11155104, -5075578, -12163884, -4927938, -13554917, +12363063, 9205726, 16627966, -741956, 3892314, -15119359, 3405909, -15678241, 15252503, 4406100, +-2543695, 14572287, 14738180, 7634305, -8872329, -13089450, -19013284, -769873, -6768332, -9484898, +10230075, -2762738, 23896124, -17677548, -6528351, 13761075, -14343580, -5615133, 3234110, 315143, +-2141578, -13651017, 6202470, 2392834, -7519951, 6847252, 14379014, -12351789, 13877039, 17410724, +-5255966, -9133248, 7087770, -6998113, 6543920, 4277788, -7325604, -5604396, -1502165, -2209224, +10116259, 3483755, -1787780, -4891968, -8140574, -4522601, 2498060, -5122822, 2415382, 4946192, +3084324, -3433290, 2601140, -2804077, 3824669, 2564096, 4274566, 2661806, 144418, -4525285, +2929168, 4584878, -4656282, 217970, 1534914, 1723893, 3875134, 385473, -561567, 4355634, +5267241, 1063004, -2480344, -4132832, -154082, 3704409, 4491462, 3149285, 22266184, -5068062, +3116536, -1168768, -7377143, 10021769, -3693135, 3726421, 1166084, 14344117, -4543539, 16722455, +242666, 8334384, 7344931, -1298691, -5453535, -16248935, 7683697, 16951700, 847719, -97711, +11709155, 9984725, -766652, 1855426, 20113332, 12642773, -3700114, 4402879, 13205414, -3329674, +-14731738, 360777, -10712722, -1671816, -6812355, 630286, -20361904, -6058052, -7457137, 347355, +4189204, 4277788, 19689204, 21828634, 11448772, -15103252, -8973797, 12265353, 17147120, 3635153, +-15788300, -2590939, -3793530, -16404091, -10424422, -12424267, 15101105, -5683316, 2007360, -15446313, +22378928, 16556025, -1939715, 6834904, 37192808, -1903207, -7720741, -14347875, -949725, 9884330, +7759396, -5790153, 11149735, 22277458, -9644349, 14198625, -6571300, 4628901, -9047349, -4890894, +-7821673, -10152229, -5302137, 6591164, -127775, -2262374, 1511292, 2710124, 11922829, -1376537, +1088237, -187905, -5674726, -652298, -2105608, 1062468, 4745939, -3207804, -1618666, -3964255, +-1982127, 1305133, 1348620, -1478006, -8082592, -7487202, -2684892, -9208410, -8126615, -1527935, +6934762, 6191196, 5260261, 1132798, -1411971, 236760, 2854006, 2433636, -1152125, 1643899, +1071594, 11319386, 907849, -7062537, -9737228, -15964930, 20779588, -12985834, 15634218, -11394011, +-17415556, 973884, 21526376, 14078903, -16189342, -10588705, 3543348, 3321620, 7172059, -1141388, +14296872, 7825968, 18889804, -6829535, -3359738, -556735, -3860639, -18246632, -13708462, -4127464, +18986440, 4097936, 1329292, 755914, -18032420, -20223928, -15892453, 8222178, 9097278, -6851547, +-4769561, 1874753, 2020245, -10744398, 2939368, 20301774, 3358128, 12750684, 12254615, 9033390, +21499532, 31222802, 10033580, 627065, 4289599, 12378633, -6693707, -3375308, 8073465, -2725157, +4224637, -2799245, 13245142, 4845260, 9321153, -2570001, -3783866, 6905771, 17759690, -1235340, +-14940044, 9499931, -23264228, -26670674, -9371082, 13901735, -9148280, -26378078, -16388521, -6663642, +9433896, 6657200, -14526653, 25725780, -8477729, -17932026, 4467303, 7080791, -6150930, 8974871, +-9519795, -3599720, 3086471, 2463164, -5123359, 4584878, 605054, 8145406, -4738423, -9638980, +-5898064, 1659468, -2407866, -1918240, -1042066, 107374, -1057636, 6606197, -1410897, 1123671, +-2949032, 3059627, 5137855, 1086090, 4910222, 1641214, -8389682, -3555159, -270583, -6976101, +-8570070, 3992709, 5497022, -4520990, -9128953, -9683541, 3644280, 1619740, -750009, 6258841, +-3956739, 8410083, -37284076, 1984812, 18926310, -3520263, -4414690, 22918482, -12287901, -12752295, +-16187732, -5417028, -5458367, -10845329, 3219078, 5213017, 8863202, 6200859, -5168457, -4142496, +-1814087, -4637491, 1552094, 4267587, 18700824, -8067559, -24195162, 12883291, 114354, -776315, +-20122996, 8911520, 3918621, -2152852, 22944790, -6635188, 2502892, -2197413, 10122701, 12127377, +-13412646, -1395864, -7522635, -952409, 6866579, -5155572, 10510859, -16462610, -13674102, -8734890, +-14610405, -2623688, 1331440, 2182917, -20437066, -13518946, 9730248, 16400333, -7827578, -9306120, +8666170, -18791556, -16957604, -16500727, 18034568, -30531312, 9880572, -1737314, -17966386, -5828271, +15151571, 38597796, -5197984, -10791105, 12741020, 29569240, 10644540, -6805376, -7215545, -1472100, +8104067, -671626, 3767760, 17551384, 1134945, -6724845, -12509092, 10232760, -14754286, -10165114, +-7365332, 5081483, -6110128, -10791105, -6794102, -6615324, -137439, -7995082, 2653216, -6225018, +-597537, -2125472, 7436199, -5794985, -4514548, -11742977, -3528853, -2194728, -3984119, 10902238, +-8211441, -10572062, -748398, -9295383, -8463233, -3965866, 1153736, 8134668, -1176821, -3673808, +-1692754, -5613523, 3764002, -11187316, -1061394, 11281268, 5322538, 7332583, -3000035, 2691871, +3539590, -2889439, -4466229, -6381248, 2088428, 5355288, -2363306, -20855288, -33608656, -1828046, +38245612, -6031208, -2888366, -25264608, -2058900, -1589138, 2498060, 8498130, 1009317, 7079717, +353261, -319975, -18228914, 2668249, 16302085, -11019275, 20253456, -8513699, -1415192, -18006650, +11435887, -8931384, -6009733, -20796768, -28453622, 14529874, -13968307, -13528610, 4809827, 2972117, +-6249715, 1455994, 15869904, -4693326, -15446850, -9439264, -19736986, -2346126, 5444945, 13607530, +2626909, -3945464, -3508988, -8068633, 4546223, 14123463, 2180233, -8778376, 15870441, -15310485, +1495722, -26410828, -7937100, -5154498, 32444720, -20578262, 6512244, -6672769, 4134980, -3779571, +-3786551, 644782, 13109851, 4030827, -24197846, 26455388, 7934952, 9451612, 3271691, -10535555, +-8200703, -3016678, 3196530, -585726, 5134634, -14302241, -15049029, -2433636, 7109782, 16067473, +-10107669, 13625784, -3509525, 5305895, -10930155, 6131066, -17717276, 19633906, 696858, 2176475, +6281927, 8845485, 691490, -12277701, -6089727, 3285113, -11806865, 3132105, 5287105, 4886599, +-7099044, -4328254, 11587822, 2116345, -12141336, -1764695, 10019085, -3893388, -14899242, 16600049, +-4723391, 6379100, -3012920, -4843113, -8041253, 5050882, 1206886, 5251672, 595927, 8861591, +848256, 6342593, -3336653, 341987, 3808026, -2379949, -3759707, -16653736, -9628243, 35494684, +-4250944, 2941516, -18313740, 16556562, -9396315, 12187507, -9483288, 21437256, 2342905, 2174864, +-10222559, -8544837, 12714177, 27788976, -11357504, -16951162, 8214125, -6678674, 18563922, 23156316, +11661373, -3483755, 14573898, -9523553, -8605504, 19454592, 27043798, -29982092, 2719788, 4472135, +5344013, -10146323, -436476, 12105902, -30030948, 9107478, 17983028, 6664716, -13205414, -3727495, +22022444, 17811766, 6201396, -10236518, -13087302, -26226680, 37697464, 6774774, 19521700, -2798708, +-7680476, 4190814, 11485279, 353261, -314069, -30481920, 5012764, 28751584, -4844723, 27551142, +-16236587, -7426536, -11230803, 6423124, 26217018, -8169028, -449898, 23440858, 28932510, -9345312, +-20619602, -18671296, -15966004, -7584912, -6564858, 16464220, -19856708, 10977400, 12735115, -4593468, +1743220, 12897787, -2178622, -7452842, 8089571, 5472325, 4467303, 11853036, 2939368, -2152852, +11087995, 3805878, 4883915, 5413807, -1513439, 600759, -2110977, 4605279, -19433116, -5555004, +1180042, -3925600, 8053601, -14926622, -1329829, 96100, 5624260, -448287, 8732742, 5732171, +-3637301, 11772505, 6422587, -4241280, 8939974, 9171366, 462783, -6118181, 4898410, 8914741, +5869610, -1478543, -8334384, -4376035, 2674691, 1234803, 1797444, 14156749, 10413685, 24984362, +-7557532, 18095234, -9577240, -3819300, 16817482, -566399, 22923314, -27668716, 17335024, 3160022, +7698192, -11130945, 8389682, 20640002, 40135932, -9243306, 10189273, -567473, -26646514, 24414204, +2459406, 9538049, -4884452, -12480638, -4653060, -1036161, -10358924, -6514929, 34055332, 2362232, +13077102, -9777493, 24124294, 106300, 11682848, 4920959, -14172855, -3048890, -8761733, 222265, +4318053, 28519120, 14483167, 1159104, 3331821, -1063004, -2435247, 4627291, 2781528, 17829482, +14490146, 7268696, -8589398, 12353400, 26036628, -24747064, 22804128, 3592203, 6785512, -24879672, +-11880953, -31245350, -25252798, -5065914, 16640851, 13873281, -43314208, -438087, -19616190, 10104447, +42959872, 21498996, -27885612, 15013058, -11572789, -14458471, 23578834, 11838540, -12392591, -6977175, +20713016, 16938814, 9159555, 26406532, -7381975, 16116865, 14140643, -17163764, 23517094, 6305012, +27323508, 8176544, -2807298, 16000901, -1946157, 3994320, -19633370, 14323179, -9721658, 7330973, +-7313793, 3088618, 8680129, 21689048, 5441724, 13071196, 3049427, 3980361, -7551090, -1920924, +-2930242, 1495186, 10654740, 9105331, 16191490, 5810554, -2386391, 2325188, -4290673, -2515240, +-17064442, -3139621, 3710852, 4918812, 13845364, 12390981, 11230803, 14028974, -36266704, -55672976, +-14601815, -6265284, -13826573, 3097208, 18711562, -19624780, 28263032, 10372883, -40940704, -31345746, +-6376953, 22349400, 709207, 1876364, -4374961, -12944495, -39646844, 1632625, -33329484, -27519466, +13385266, 10718091, 9652939, -4646081, -13001940, 29971892, 17843442, -12710956, -26036092, 19792284, +9875204, 4668630, -12320114, -30335354, 11406359, -14236206, 4417374, -25837450, 31279710, 792421, +-12729746, 3080029, 7760469, 25929792, 16048682, -6622840, -1453310, 9092446, 8818642, 10002979, +-6065568, -40517648, -32048510, 6467147, -4561256, 23746338, -4728222, -10159208, -28782724, 33246268, +12563853, -23128936, -24078660, 34105260, 31752156, -310848, 23238994, -3105798, 607201, -9659918, +-6091874, -18280992, 22381074, -4150012, -5337571, -9756555, 9101573, -28778428, 13374528, -8406325, +-5638755, 20491826, -673773, 3265249, 4910758, 18813568, 9372692, -7633231, 13706851, -4128537, +16594680, 6680822, -19146964, 4726612, -9844602, 9002251, -8035884, 223338, -12805445, -6426345, +6658810, -12408161, 5043366, 4279935, 5187784, -11090679, -8196408, -14279693, -12773233, 16699370, +-6258841, 10786810, 6535867, -10205379, -1683090, -8924405, 122943, -5659157, 20859046, 17796734, +11814918, 16623134, -4318590, -18449032, -21365852, -3026341, 6160057, 30745524, 18547816, -7099044, +-5978058, -8286603, -15546708, -949725, 6721624, 3106335, 19530290, 1913408, -13764833, -35365296, +55763708, 1405528, -43133820, -3264712, -16057272, 7294465, 21401286, 19439558, -23997592, -38509212, +6577743, -18431316, 5873905, -3755412, 16979080, -5574331, 2429341, 10087268, -15731928, -19291382, +2038499, 5063767, 16811576, -385473, -26896696, 17691508, -15001247, 13903883, -13038447, -8876624, +-1468342, -4268661, -28916404, 5432060, 8079371, -27958090, 11826192, -10988674, 5601174, -9329206, +27011050, 21031918, -27236536, -14457397, 18602578, 23309324, -27870580, 36792836, 2386928, 29625610, +21525840, 34959960, -10814728, -14838575, 7850664, -29011430, 4430796, 3664681, 50939924, -15794742, +-47884052, 80834504, -38193532, -29381872, 46605228, 21049098, -27193048, 45282912, 5039608, -36888400, +45871860, 5535139, 4106526, -8021925, 6738267, 30434676, -7448010, -10620917, -15850040, 22657026, +-8259759, -5822902, -3191161, -9165997, -9780177, -14234058, 13598403, -2057289, -1282048, -5182415, +-3519189, 1681480, -6152541, -10718091, 1343251, -8686571, -16030965, -16715476, 20686710, -9062918, +1902671, 19047644, -9222369, -8839043, 1321776, 9400610, 4053376, 3949223, 18358838, -11449846, +2629594, -8471286, -5254356, -3795677, 30378840, 14976551, -4977867, 4199405, -16155519, 5033165, +-14789720, -9302899, 7093139, -4054986, -30488900, 18610094, 7627325, -5825587, -50255948, 7009387, +14988362, -37600292, 17184164, 10033044, -13254806, -3691525, -706522, -9159555, -3071975, -5334350, +-16829292, 548682, -8410620, -1767916, -4155381, 8262444, 29965986, 25195352, -23167590, -2467996, +31541702, -5439039, -5942624, -32192390, 3719979, 10694469, -5288716, 27610198, 65951908, -22087406, +-27797566, 47060492, -3132642, -25216290, 29308320, 19398220, -15191836, -22637162, -28101434, 8683887, +15095736, -12409771, 44265008, 28985124, -55169928, -52842592, 30900142, -24806120, -32256278, 41998336, +6767795, 56181932, 26934276, -6671158, -7508677, -40316860, -31507344, 92204896, 25456808, -19618874, +-44518948, 1379221, -18116172, -39654360, -6163815, 46761992, 19870666, 738734, 38416336, 33695092, +-10590316, -42572788, 6669548, 25769804, -10561861, -9832791, 53525492, 30911416, 5362804, -5451924, +-27449136, -26787174, -6909529, 25637734, 10315975, -10165651, -4851166, -11788611, 10070088, -7510287, +-10251013, -6453725, -1221918, 7847979, 10348724, 9337796, 3881577, -24255828, -8494908, -4575751, +9285182, -9288404, 1745904, -2299418, 22552336, -14277008, -10036802, 23481124, 6548215, -11498164, +18370648, -6118718, 5415417, 1722819, 4238059, -13741211, -3722126, 19410568, 18800146, 8082592, +-7354595, 5324149, -8453033, -6541235, -5168993, 10370735, -15610596, -2952790, 12537546, 49995568, +41503880, -11044508, 29477972, 3130494, -22994718, 14770929, 25171192, 8516383, 10851772, -32958506, +-6788196, 3963718, 6626598, -4773856, -28797756, -10257993, 10302553, -6903086, -3116536, -24217174, +37261524, 4772783, -30863098, 17546552, 43755516, -22512608, -13250511, 6518687, 14380624, -14026826, +-27674084, 23781770, 39779452, -3081102, -15757698, 5291937, 11199664, 18274548, 25448754, 1799591, +46395848, -920197, -51864952, 525597, -5924371, 17010218, -5515275, -42149200, -1267015, -18132816, +-17929878, 25502978, 13242458, 14601815, 18130130, -37758132, -19916300, -6523519, -606127, 15430207, +434865, -7612830, 966368, -12837657, -25922812, 2639794, 40061308, -20511154, 3725884, -15908022, +-11586748, 27603754, -33881388, -237297, 14743012, -11807939, 5442261, 4355634, 8305930, 9878962, +-17947058, -21231098, 35851704, -7331509, -11772505, 18668612, -18564460, 11707544, 2201708, -7440494, +5550709, 15709380, -3073586, 2250563, -7788387, 3891240, 850404, -884226, -6971269, 8652748, +4128537, -703838, -857383, 7283728, 5796595, -6486475, -12097312, 6694244, -862752, 3484829, +550293, -2947958, 6021008, 328028, 4967130, -1825898, -1126355, -3319473, 812823, 5936719, +-1456531, 14567992, -6018323, -4210142, 486942, -6113886, 3826816, -43223476, -62003760, -54831164, +110295832, 105287368, 105076376, 296649088, 105393664, -12213276, 19523310, -205112608, -249850064, -83937080, +-140196864, -194280704, 24983824, -10773925, -32512902, 213981712, 130604584, 54570244, 334143072, 157770784, +29167122, 152371488, -36135172, -181773760, -174100256, -165839424, -229861824, -225025152, -52853868, -81204408, +-132513696, 154775584, 71257800, -55684788, 223462320, 72227392, -26243860, 252712112, 230200048, 53080964, +238889296, 242449824, -9298604, 60250876, 27439472, -233230688, -270818624, -201627232, -381252448, -360993088, +-216846992, -289538784, -217855776, 24761024, 179109792, 203320528, 436755232, 397176576, 350167616, 377354208, +278284352, 141373680, 43154756, -30522722, -212568672, -256203920, -274342112, -309107712, -293347872, -249975680, +-161589024, -117308440, -114790520, 22028350, 69610144, 136782368, 325055488, 337662272, 230827648, 288598720, +121995328, -39716100, -95506648, -147853168, -202782048, -146757424, -98203888, -97641248, -33684356, -9064528, +838592, 52167748, 66122632, 63123136, 96505768, 60898880, 39327940, 48821432, -28745680, -26458610, +8225936, -78065328, -55330452, -20219632, -75537200, -46500000, -5207648, -75889384, -80305152, -53165252, +-78797080, -51562692, 59413356, 111162344, 176562352, 260577280, 243059184, 208193168, 195572416, 105966504, +-32239636, -162426544, -287866976, -341674304, -308279872, -249395872, -188383712, -88151520, 28366648, 112104552, +157007904, 169647456, 149630224, 133777496, 124294744, 125515048, 87298432, 41714868, 19335406, -10277320, +-35206920, -31514322, -57379152, -61457224, -43352328, -31918586, -42579768, -40274984, -51890184, -58089968, +-54074712, -36619428, -17319992, 7194070, 10759430, 7631083, 514859, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -3671660, -13821205, 7314330, 6095633, 3394635, -1464584, -435402, -1415729, -2878702, -3990562, -2825552, --4078072, -1725503, 3882651, 1322313, -202937, -5369, 2545305, 1183264, -1610613, -1734630, --1305670, -7206419, 2986613, 754304, 69793, -1487669, 935229, 126165, -1991791, 1038845, -2637110, -11274, -3290482, -838592, -1422708, -1532230, 405338, 3169686, -821413, 747861, --3767223, 2417530, -4654671, 2965138, 656593, 175020, 35433, 2949569, -3573413, -2653753, --4869956, 1290638, 874563, 237834, 2778307, -3005940, 647466, -413927, 78920, -2193655, -1927367, 877247, -1616518, 2997350, -4789426, 2188823, -2615098, 4873178, 2219424, 852014, -345745, -982474, -5975910, 4542465, -1437203, -157840, 776852, 1261110, 1080721, 1192927, -1434519, -446140, 413391, -677531, 1399623, -117038, 793495, -1826435, 609885, -299574, -387084, 707596, 1937030, -127775, -341450, 639950, 760209, -807454, 995896, -1209570, -971736, 188442, 863825, 44560, 553514, -333397, 210990, 739271, 365072, -153008, -568009, -154082, 13207561, 6292664, 8622684, 2362769, 2932926, -500364, 3374234, 354872, -2998961, -2210298, 5847061, -1482838, -6682432, -1830730, 135828, 368293, -2122788, 5125507, -281857, 2003065, 4949950, 2425583, 54761, -4832, 1177895, -4515085, -2990371, 1797444, -2152316, -1641214, 469225, 2211371, -4483946, 6321118, -651761, 933619, -1006096, 2348810, -3256122, 165893, -3430068, -3492882, 6851010, 155156, -2007897, -288300, 3943854, 2921115, --2044941, -2749853, -6052146, -1875827, -2486249, 252866, -2246268, 541166, -5880884, -2399813, -674847, -2393908, 1286343, 2369748, -1197759, -157840, 1105417, -1492501, 2305861, -169651, -2902861, 35970, -1008780, -3380139, 375273, -4192425, 1311039, 76773, 2365990, 42950, -2429878, 3141232, 2668249, 102005, -1746441, -132607, -644245, 3467112, -943282, 444529, -2208687, 2319282, -170725, 1307818, 459025, 1195075, -498216, 1446867, -557272, 2132988, -479426, 408022, -185220, 191126, 207232, 2793339, -8916352, -2873333, -2039036, 1555315, -1746978, -6087043, -2743947, -1202591, 1449015, 3243774, 1006633, 4445828, -3678103, -5292474, -1521492, 185757, -964220, -3622805, 11758547, -607201, 3118683, 709743, 353798, -257698, --1826972, -4468377, -3526168, -1092532, 2994666, -2492692, 6150393, -2079301, -587874, -5043902, --6025302, -510027, -3847754, -2124398, 8185671, -4473209, -1255204, -4342212, 1581622, 216359, --1590749, -4562866, -884226, 47782, -5202816, 622233, -2806224, 4162360, 2717641, -2379412, --1284732, -1309965, 1259499, -215285, 3285113, -1693828, -2179696, -2212982, 7464117, 6764574, --2330020, -6490233, 869194, 2026151, -221191, 1925756, -2713883, 547071, -3145527, 2251637, -158377, 7195681, 4414153, 6842420, -6228240, 2708514, 4146791, 177704, 3143379, 2292976, -456877, 4714801, -877247, -479426, 1189169, 673236, -1942936, 1894618, -1491964, -1243930, --147103, 500364, -225486, 735513, -1118839, 574452, -156229, 171799, 593242, 890132, -396748, 1028108, 922881, -688269, -962610, 772557, 257698, -1659468, -707059, 1388885, --845572, -29295972, -4744328, -8441758, -9577777, 2577517, -3241627, -8327405, -6903086, 1159104, --6800544, 969589, 10140955, -2516314, 4353486, 3303904, 8551280, 2228551, -5954972, 1372779, -9294846, -4330401, 4628364, -6848326, -6248104, 2059974, 2668249, 7315940, 431644, -4467303, -4243965, -2991982, 3257733, -361851, 4612795, -3891240, -2531883, -4341675, 60666, 812286, --1704028, 3370476, -7689602, 1013075, 7764227, 1704565, -2195802, 3013457, -3962644, -1985349, --9708774, -2850785, -317291, 1548873, 169651, 5248987, -7793755, 788663, -1064615, 3961034, -2107218, -1475321, 5563057, -4839892, -649614, -3876208, -7488276, -3120831, -1717450, -2080912, -5643587, -5007932, -8090108, 360240, 2660195, -769336, -2327872, 2828236, 3104188, -2220498, --1818382, -3102040, -1290638, 6564858, -3017215, 3642669, -1066763, -62814, -589484, -166967, --3366718, 881005, -2011118, -41876, -228170, -430034, 91805, -719407, -1045825, -977642, --272194, 391379, -639950, 1145683, 494995, -14551349, 8291971, 9394167, -530965, 5283347, -2369211, 11092827, 14688251, 1917166, 1904281, 4249334, 1807108, 2474438, -2111513, 2939905, --2445447, 3894999, 4480725, -12573517, 6510634, -1353989, -2356327, -3871376, -5124433, 2087354, -3561065, 5763846, 1099512, 1002338, -7379828, 346819, -2168959, -2433636, -1111323, 1007170, -403190, -540629, 7212861, -354872, -2422899, 2411087, -2833605, 3728032, 4865661, 5486821, -2818572, 618475, -3067144, 6125160, 1916629, 839666, 615254, 820876, 416075, -3517578, --5003100, 4535486, -4665945, 4344897, 3925600, 2916283, -668941, -3265786, 2930242, 3859565, -8504035, 3951370, 3190624, 2010582, -8379481, -2558190, 992674, -1355599, 3558381, -7223062, -328565, 2395518, -6801081, -631360, 2232309, -1635309, 828929, -3962644, 1457605, 511101, --1732482, 3119757, 1794223, 122943, 3379603, -1552094, -1550483, -347892, 667867, 1393180, -5142687, 840740, 1726577, 1215476, -91268, 1123134, -899259, -995359, -1438814, 902480, --812286, -677531, 537408, 535797, -682363, 1742146, -1077500, 1211718, 1084479, -536871, -1654099, 469225, 675384, 826781, 62814, 157840, 1927904, -170725, 27029840, 8152385, -1998234, 5288716, 13511967, 5446556, 16292958, 3992709, -3595425, -1168231, -1367947, -1554778, -4420058, 6984154, -3246995, 1500554, 4866198, -1809255, -6774774, 5382131, -639950, 2559264, --2309619, -3398393, 5534602, 1292248, -511638, -1574642, -6172942, -3050501, 3338263, 839666, --2126009, -1080721, 930934, 2324651, 6203544, 1963874, -5724655, -1310502, 365609, -1794760, -2054068, 2945811, -5769752, -6957310, -409096, 1749125, -743566, 5382668, -9927817, -2102387, --4506495, -5579163, -619012, -426276, 1459752, 5320391, -59056, 805843, 1710471, -853088, -7079717, 4529043, -5825587, -5097590, 3876745, 8591545, -751082, -4010426, 8458938, 4484483, -1953136, -3716757, -4049081, 4191888, 205622, 3172370, -1928440, -6143414, -3402151, -4179540, --2665564, 2435247, -3443490, 478352, 1452236, -1227824, 1407676, 1039382, 1196148, 718333, --2234457, 1236951, -717260, -1163936, -556198, 1660542, 1277753, 224949, -1924145, 1699733, --773631, 2931315, -480499, 407485, -2812130, -3584687, 1171989, -3374234, -680752, -518080, --1935420, -914828, 384936, -3029563, -1292248, -307090, 307627, -632434, 2105608, 302795, --839666, 13263396, 6443525, 11942693, -4029216, 95563, -3037616, 12031814, -12379706, -1760937, -3170760, -2374580, -2451890, 4025995, -1391569, -3819837, 10558103, 5964099, 1216013, 17835388, --4875325, -1191853, -3776887, 131533, 2945811, -4609574, -593242, -2394981, 6807523, -5761699, -1531693, 395137, -1809792, 615791, 4001299, 2723009, -5417565, -9453223, 221728, 1938641, -7821673, 9174587, 9136469, 827318, -5269388, 6568616, -15948824, -2630131, -6264747, -9287867, -6491843, -2141578, -3007551, 5056250, -1839320, -2725157, 13915157, 159451, -4108136, 4840428, -372588, 3681861, 2716030, 1808718, 8429947, -5061619, -3102577, 488553, -7239704, -64961, -1368484, -1844152, 2481954, 4160213, 8864276, -3352222, 2955474, 7649337, 4649302, 2260764, -1445793, -2646774, -5597416, 2855080, 4270808, -941135, 428423, -896038, -714575, -3198140, -625455, -988379, 548145, -2988224, -1498407, -2684, -520765, 2745021, 1200980, -2684, --3832722, -1752884, 1905355, -2252710, -38655, 1460826, 1505923, -2606508, 2410551, 1860795, -620086, 2463701, 2238752, -4460861, -789737, -1730872, 1207423, 2379949, 2932389, -638340, --1632625, 354872, -886374, -20679730, -31088048, -5237176, 1534377, -535797, 853625, -1451162, --6239514, -3508988, -4974646, -1333587, 5048197, 6032819, -5478768, -8069170, 6898791, 1433982, --4436701, 364535, -739808, -4918812, -4132832, 11470247, 5834176, -6160057, 3131031, 1301912, -4904853, -5975910, 6657200, -6646999, 4575751, 2995740, -1407676, -3097745, 2956011, -12396886, --6154688, 7603703, 12237436, 6797323, -8563091, 207232, -6071473, 8142721, 1684701, 2116882, -580357, -6698539, 3258270, 9961640, 1127429, 7533373, 5332202, 3454764, 5760625, 12219182, --3384434, -12285754, 5965173, 43487, -2907156, 635655, 10573673, -4307852, -7340099, 3613141, --1939715, -1240709, -2775086, -1640141, -3299609, -5735392, -2882997, 7099044, -9652402, -6047314, --3556233, -6923488, -6743099, -388158, 4199405, -6345278, -107911, -2335389, -2678986, -5713380, --3616363, -6562710, -344134, -5039071, -383326, -99858, 4638028, 3320547, -2337536, -2478733, --3354370, -983548, -2369748, -2236604, 2817499, -4445828, 1707786, 434865, -2843268, 360777, --1855963, 1136019, -954020, -3615289, -4476967, 18254, 1194538, 1926830, -836982, 856846, -1435056, 68719, -2329483, -246424, -2988224, 389231, 1411434, 1374926, -11956652, -7790534, -2020782, 1915555, 15943992, -13936095, -9534291, -5381594, -2633352, -1727114, 5158256, 4984310, --7377143, 7585449, -1755031, 3440806, -5312338, 11307575, -2195265, -4256313, 7311108, 5274220, -4254702, -7685307, -7230041, 9572945, -5007932, 2828236, 2342905, -3462281, 8136816, 2480881, --4832, 1815161, 5973763, 7670812, 2364380, -6804302, 1588601, -9713069, 5805185, 2546379, --10882910, 7730405, 1799054, -5648419, 9972914, 3185255, -2698313, 5830418, -900333, 11026792, --2515240, -2739652, -2331630, -1423782, 14328011, 3044595, 248034, 3918621, -12036109, -7498476, --8178692, 919123, 7623567, 1038308, 9454834, -12194486, -5024575, -7728257, -7186017, 17856326, --1814624, 6398965, 4570919, -3794604, -894964, -2451353, 1349694, 973347, 4866735, 3003256, -9748502, -5221607, 807991, -1630477, 2116882, -31139, -193274, 7516, -2081985, -9167071, -3424163, 2186138, 1361505, -2406256, -870805, -1142998, -5142150, -287763, -1844689, -3299609, -1864016, -2777770, 1195075, 1685775, 1285806, 2151779, -3582540, -1903207, -2430415, -2157147, -1275068, 2601140, 1491964, -799938, -493921, -589484, -1124208, 3762391, -1289027, 2692945, -1642288, -959388, 1105417, -682900, -11274, 979789, 982474, -16135118, 5031018, -6924561, -3919695, -4840428, 13032005, 2208687, -9150965, 1448478, -9328669, 7570954, 14405857, -12282533, -8108899, 3018288, -372588, 5956583, 15356656, -5864241, -27380, 4713190, -16791174, 997506, -7622493, -4650376, 5461051, 5973226, -3071975, 15074261, -7515656, -13605920, -5868536, 1657321, -355409, -2770791, -5881958, 4123169, 3794604, 24696, -9598715, -2232309, -2436857, 6428493, --4206921, 25274272, -3181497, 3636227, -1166621, -1052267, -12257837, 1279900, 9084393, 7374459, -24627880, -2625836, -2386928, -5078262, -973347, -6910603, -526670, 9900973, -5259725, -996969, -1788317, 2354716, 9710384, 7926362, 2234994, 19092204, -3606162, -17634598, -17678622, -12443057, --2566780, 5603859, -1742146, -4615479, 8413841, -485868, 7471633, -4577362, -872952, 6092948, -5149666, -1843078, -1803349, 646929, 1579474, -1934346, -4125316, -5906117, -1997697, -2493229, --744640, -4202089, 3167002, -1242856, 954557, -2113124, -3038689, 4106526, 1831804, -2052458, --559420, -1676648, -1811403, 1809255, -1126355, -1988033, -4012573, 3204583, 1262720, -1693828, --3037616, -4013647, -752156, -2749316, -2805151, 3447785, -2015413, 712428, 145492, -1438277, -1474784, 701690, -546535, -718870, -887448, 28727426, -20703890, -15705622, -5025112, -9923522, --11349451, 13935558, 5653788, 2794950, -4378719, -2778307, 16908750, -4905390, -7103876, -20219632, --2916820, -486405, 9553618, 3537443, -4102768, 1261110, 8378408, 3800509, 5243618, 12964359, -16266115, 4523138, -6046777, 4201015, -9753871, 6706055, 5492727, -3481071, 338229, -7553774, -3063386, 212601, -14657650, 14299557, -1279363, -6645925, 8827232, -13561896, -3133179, 14930917, -8517994, -186831, 561567, -18791556, 6599218, 10501732, 5992553, 3489661, -1028108, -13871134, --40761388, -3252901, 8309688, 11454141, -1046361, -11956652, 20137492, -9329743, 9190693, 15244450, -12562242, 2334852, 15196668, 1727114, 5415954, 3214246, 9221295, 1811403, 2924873, 19354734, --6494528, -4232154, 16363825, 8529268, 4433480, -6767795, 1637456, 13308493, -1454383, 10661719, -2441689, 2315524, 6706055, -3624953, -342524, 700080, -718333, -3027415, 5218922, 2414309, --7303592, 3980361, 2698313, 3830037, 1875290, -2119030, -34897, -2350958, -2698850, 3191698, -4066797, 1671279, 2447595, -2210835, -2158221, -1487132, -2647847, -3472481, -5180268, 700080, --3344706, 2392834, -1265942, 1363652, -4800700, -3188476, -1066763, -1624571, -1478543, -2240899, -534187, 4474819, 4675609, 1695438, 290447, -2761127, 3668976, 14352170, 13651017, -3611531, --6997576, -1360968, -4129611, 15703474, 10207527, -27426588, -3009162, 2195802, -12865575, 5060009, --18765786, 14208289, 3446175, -2261837, 7784092, 3815005, -3951907, -6363531, -4606890, 20073604, -802622, -226023, 4449049, -2799245, 8063801, 23653996, 9663676, -3546032, -4196720, -3570192, -13741748, 4798552, 13914083, 9536975, 6941741, 3914863, -6063420, -6766721, 6206228, -14191646, -2406792, -7590281, -6259915, 368830, 9729175, 1251446, 782758, 3371549, -3061238, 16159278, -21114596, 24038932, -113817, 10902238, -14342506, 5411122, 8311836, -6709276, 12295418, -9971840, --19643570, 2471754, -10292889, -1682017, 930397, -10582799, 2631204, 14132590, -8667244, -8613557, -7200513, 13077102, -579821, -5020280, 12175159, 926102, 2737505, -8515310, -1711545, -734976, -10055592, -5256503, 836445, -2525441, 2223719, -364535, 1971390, 2371359, 1814087, -163209, -1020592, 2006287, 2857227, -2477123, -4515621, -1012539, -643708, -4422743, -5115306, -599685, --2329483, 3477850, -3442416, 2586107, 4919348, -567473, -8003135, -1103270, 1638530, -3114925, --3739306, 259846, 2305861, 12246562, 4258997, 3553012, -308701, -33286, -1000727, 3331821, --809064, 3562675, 10612864, 9237401, -1141924, -920734, -1699733, 108985, -17106318, 31129386, -1944010, 8109972, 23763518, -8768713, 2409477, -4516158, 6250788, -6836514, 6843494, -16718160, --19870666, -584116, -11775727, -876710, -1115618, -1309965, -3371549, 1293859, -5520644, 4984310, --15796353, -6284074, -21304112, -1051730, 4871567, 10236518, 22982906, 12775380, 3966402, 2962454, -6595459, 5124970, 3874061, 9315784, 9729175, -3060701, -19456202, -19254876, -13228499, -7871602, -1930051, 6535330, -7127498, -11271068, -19734838, 606127, -7538742, 18047452, -8031052, 4563940, --13692893, -6568616, -2397666, -5590437, -26459682, -27529130, 7566659, 2863670, 722091, 14179835, -8075613, 11391864, 9155260, -17131550, -3726958, 32266478, -5956046, -12142946, 4750234, -7043747, -3307662, -19839528, 8075076, -9074192, 1377611, -1257889, 13095355, 826781, 5267241, -11261941, -2172180, -6325950, -2845416, -7706245, -5844914, 4115116, 4582730, -10286447, -3436511, 810138, -1995549, 2636036, 1411434, -3947612, 4573604, 1933272, 1607392, -470836, -231928, 1492501, -4645007, -4850092, 4696547, -1157494, -85362, -1677722, 3019899, -2818572, -1606855, 4149475, --7580081, -76773, 1595044, -4591320, -1504312, -10672457, 7846369, 9214315, -504122, 2241973, -2554432, 3202435, -4663261, 5180268, 3391951, 4066260, -3345780, 2266669, 3221226, 4711579, -18467822, 14069776, 1833951, 14949171, -2799245, -6077379, 8180302, -11372537, -22275848, -33263448, -2788508, 739808, 12869870, 9441412, -12411382, -6315750, -32526324, -2149094, -15149960, 3569655, --7625715, -3604551, -6260989, -2377801, -2537252, -11264625, -5085242, -13134010, 10501732, -2612951, -8986682, 23332410, -12309376, 6733972, -1913945, -5757941, 6002217, -12441447, -21205328, 10203232, -4980015, 10147934, 6332393, -44394392, -20163798, 5939403, -14785962, -1235877, -12633109, 18604724, -22389128, -1082869, 24748676, 3504693, 11242077, -3256659, -819802, -13833016, 8767639, 17901960, -3876745, 29801704, 703838, 4109210, -8748848, -13089987, 17634598, 27966142, 9759776, 5435281, -2755222, 10579041, 912681, 2025614, -26167626, -19189378, -1987496, 1398549, 3468186, 19678466, -21160230, -3894999, 1389959, -7262253, 4406100, -13551696, 346819, -14341970, -12151536, 6274411, --354335, 1580011, -8067559, 5179194, 6334540, 4261145, 6415071, 7575786, 657130, -4300336, -3323768, -5874442, -1433982, -3625489, -8609799, -2473364, -4762582, -3834332, 7145215, 3946001, --2546379, -5662378, -8527121, -5585068, 5754183, -5667746, -560493, 455267, 3938485, -8047158, --6426345, 2849711, 9991705, 6367289, 2571612, -16106, -6010270, -736050, -3653944, -6968585, -11900281, -17418776, -8582955, -32544578, -40553620, -30071214, -13728863, 9196599, -259846, -7132330, --14812805, 32212, 26769458, 13107703, -23404350, -3851512, -4832375, -16542067, -2942590, 1225139, -11275900, 8302172, -17456358, 12555263, -9856950, 5332739, -9181029, 2789045, -13369696, -4996658, -6642167, -24172076, -4606890, -9110163, 7956964, -6012418, -22321482, 26286810, 25361782, 350040, --10218801, 14322642, -34212100, -10719701, 10222022, -11514270, -7248294, -878321, -11038066, 2199560, --2820720, -22944790, 9880572, -2918967, -7022272, -7845832, -6027987, -1430761, -6249178, -9725417, -19080392, -9061307, -8963597, 9063992, -201863, 31256088, -6212134, -19367082, 11121818, -10111427, --8550206, -15108621, 10528575, 19279572, -37556268, 2957622, 31794032, -5158256, -1915555, -12553116, -21694416, -1525250, -11708081, -1560147, -10987063, -8860518, 15736223, -9411884, -731755, -5221607, --6491843, -10998338, 4716948, 3684545, 5799817, -1306744, -8804683, -6080600, 390305, 1561758, --13441100, -3867618, -8620536, 13448616, -4421669, 965294, 1986959, 1669132, 1503239, -10924786, -7454990, 374736, -4095788, 9812927, 1599875, 12838194, -2190433, 14833206, 3524558, 5992016, -7349226, -9590125, -6238440, 4696010, -7801271, -6153615, 2442226, 45097, -5449777, -12963822, -6444599, -25663504, 51269024, 36568964, -695785, -9774272, 8138963, -30735322, 516470, 38264400, --6737193, -13292387, 636729, 43370044, -6196564, 9531606, -9208410, -19594714, -15841987, -3993783, --7227356, 8010651, 11107322, 625455, -16294032, -22821308, -20992726, -3365107, -4591320, -11303280, -10649908, 8629126, -9152575, -11170673, -12195023, 6926709, 2440078, 8507256, 21721260, -78383, --18444738, 12623446, 5018133, 4303021, 1386738, -284542, -8846559, 16104517, 8291971, -6352794, --7576859, -5010616, -20936892, 5876589, 15504295, 4758824, -14625437, 17315160, 12738336, 7215545, -2030983, -8960912, 4855461, -29882772, 4807142, -1768453, 26869316, -9508521, -13108777, 5778342, --6772627, -455267, -19184008, -3394098, -5035313, 26080116, -16732119, -31376884, -20374252, -40804336, -8190503, -8210367, -2550137, -21720724, -13770739, -36042292, -15847892, -12521440, -1692217, 8998493, --11494943, -1911261, -2021319, -1705639, -3026878, 7893076, -13370770, 6035503, -5128728, -10412611, -1845762, -2896956, 9934259, 5178657, 423591, -5141076, 12777528, 11870216, 7310035, -4371740, --6008123, -6034966, -5465883, 13333189, 21788906, 2698850, 20052666, 21923660, 7532836, 567473, --19151796, -1897302, 3930969, 3038153, -1512902, -5148055, -16139413, -175557, 11391864, 1978906, --12014097, -2931852, -8935143, 48922900, 1705102, 8294119, -8356933, -15773267, -21721798, -6904697, -5847061, 14470819, 11584601, -10122701, -290984, -21301964, -8092792, 7900056, -18345416, -9520332, --7100118, 26478474, 13485124, 14658187, 13436268, -15051176, 2564096, 5712844, 5972689, -1288490, -17498770, -3726958, 7569880, 13936095, 5031554, 3996467, 11384885, 16140487, -9654550, -18603650, -12302934, -1872069, -191663, -19677930, -18719614, 4406100, -9492951, -7031399, 15967078, -16564615, -21197274, 13998909, -9785546, 11442867, -12838194, -12534325, -15612206, 22298934, -15800648, 7117298, -6499360, -25266218, 2141041, 3064996, -20316270, -34429532, -31160524, 22613002, -23490786, -322123, --21151640, -4723927, -15204721, -1166084, 9375914, 5990943, -15472620, 15821586, 18003966, 38289632, -9725417, -25648470, 8788040, -15771657, 8290361, -22565758, 11857868, -9646497, 1428614, -4614406, -8983461, -2775623, -9462887, -21683142, -21900038, 2413235, 1817308, 13695577, -10030896, -937377, -21100100, 6043019, 14543833, 4479651, -4144107, -1653026, -5354751, -14330158, 4857608, -17288854, --10467372, 3671660, 14025753, -18884434, 10220948, 1916092, 13245679, -4645007, 7292855, 13589277, -14748918, 15046344, -7164006, 7296076, 11500849, 12632036, 2205466, 7496329, 3686156, -5911486, -23159538, 10746545, 11536819, -9826885, 880468, -21431886, -340376, 3600256, 4188130, -18901614, --19663970, -31130460, 21627844, 2209761, 7450158, -5129265, 11475079, -8534100, -8360154, 6424734, -16484084, 3845606, 10852845, 33501282, -4815732, -20244866, -42945916, -6134824, -16568373, -8186745, --10193568, -19981798, -14017700, -29841432, -3414499, -476205, 10495826, 30917322, -25691958, -9926743, --4176856, 10121627, 11017128, 30635464, 4234301, -35003448, -7968775, 7177427, 27447526, 7184944, --42315628, -16995722, 38448012, 3498251, 38357816, -22513144, 1326071, 3005940, 23259396, -2143189, -21176874, 31780074, 4594542, 26967562, 19006304, 4594005, 37427956, 31917512, 10457172, 49760416, -38312184, 23988466, -40176736, -2575370, 15910169, 9215389, -345208, -29161218, -34794604, -18010946, --49856516, -7836168, -37038724, -14111652, -9419400, -53446036, -50636592, -35252016, 17604534, 634581, --11583527, -535260, -3697967, -978179, -9718437, -5126581, 12617540, 5082557, 2328946, -1560147, -2155000, -2296734, 7894150, -1149441, -13177497, 23388244, 3943854, 5763309, -6706592, 1307281, --617402, 12365211, -425739, 7300371, -3980361, -12495134, 5308043, 10061498, 25926034, 23079006, -1742146, 21475, 16642998, 8432095, 19407346, 16210817, -4842039, 18665928, 10539850, 4020090, -11808476, 7799124, -6280853, -2631741, -14421963, 9358734, -12836584, -5459441, 7301982, -27711666, -29579976, -12831215, 19377818, 9430138, -24779814, 3600793, 15479599, -9846749, -25884158, 17084306, --6971806, 14597520, -8644159, 3650185, 6061810, -16077673, -1821603, -7146826, -269509, -26244398, --20474646, 25314538, 1243930, 10173704, -19980724, 20677046, 18659486, -14092861, 11922292, -20409148, --4269735, -11483669, 14832670, 36033164, -533113, 43744780, -10989211, -2219424, 2218351, 4361003, --2868501, -24874304, 43179452, 27931246, -3205656, 23437100, 18599356, 24332600, -9119289, -708133, --43549356, 19622632, 20780662, -5842230, -7279970, 27213986, 14668387, 14273787, 34269544, 5533529, --17277042, -21264384, 6617471, -6794639, -24918864, 20643760, -28898688, 1067836, 6713034, -20900922, --32118840, -22202296, -7990250, 2117419, 26391500, 17324288, 8607651, -49827528, -13680008, 29696478, --2097555, -11009075, 9109089, -27100170, -16485158, 22416508, 178241, 115964, -9268539, -66035, -14057428, -4481262, -9848360, 7602629, -3208341, -19347218, -10095321, 1666984, -1127429, -1389422, -614180, -8611946, 327491, -13357885, -17358110, 2164127, -1327682, -29286308, -2953864, -17823578, --9846749, -3449396, 4715337, 5088463, 16259672, -14921790, -9690520, 2999498, 15852724, -16493211, --17097728, 24289114, -3507915, -1600412, -4366371, -375810, -9960029, 4149475, 11796665, 6092411, -10307385, 495532, 4062502, 34897, 1740536, -36783172, 20883742, 32648730, -714038, 37613712, -11264625, -32523640, -20172388, -2490544, -11437498, -19752018, 20875152, 24609088, -2461553, 17153026, -22902914, -18080202, 16125455, 27657442, -1775432, -37152004, 14527727, -971736, -7487739, 10364293, -28021440, -8890045, -14264123, 6993281, -12430172, -16052440, -1228361, 24811490, 20998632, -34998076, -11059004, 15128485, -23672786, -14951855, 28349468, -7629473, -41477572, -5163625, 34693672, -11225971, --59882580, 62836984, -17936320, -7092602, -31008054, 40657772, 13106093, -13806172, 29381334, -17171816, --13044353, -7398618, 75343928, 25352656, -31668404, -27764280, 28846074, -6519224, 42032160, 967978, -31526670, -43321188, 34687228, 60143500, 5578089, -6244346, -10645613, -10253698, -24007256, 56767120, -37934224, -33618320, 9412421, -35344360, -6174553, 4061965, 7328825, 5226439, 10409390, 1224066, --39068096, 18479096, 2291365, -3803194, -929860, 18171470, -7861938, 4222490, -5782637, 9549323, --3782793, 2659122, -6321655, 11967926, 377420, -2088428, 6570226, 9672803, -21433498, 2854006, -13349832, 5394479, -15472620, 8494908, 24077586, -23397908, -36866388, 7511898, 4472135, 14687714, -14019310, -1645509, -33310692, -10942503, 8993125, 4895726, 9254044, -4709432, 1301375, -1031866, --11179263, 9983651, -8766565, 27043262, 61847528, 11956652, -23916526, -5699422, -5866389, 10845866, -9306657, -19313932, -27538256, 7344394, -23304492, 4632659, -14507326, -16687559, -3628174, 2821794, -7904351, -18599356, -7512972, -7377680, -23145042, 19406272, -7281580, 1246077, -3435437, -15444166, -6124087, 4339528, 536334, -3339874, 171262, -569620, -9129490, -19646254, 8399345, -9754408, -8519068, 5986111, -19634442, -15898358, -1806571, -2287070, -2238215, -4221416, 16004659, -11075647, -1637993, -20853676, 17804250, -20431160, -10813117, 10158671, 288300, -16373489, 13020193, -22014392, -1680943, 6631967, -578210, 2413235, 10557030, 5013301, -22680112, 11488501, 1620276, -13681618, -19471234, 7675644, -21520470, -2346126, -17155174, -2248952, 7007776, 5768678, -21906480, 27939836, --14744623, -8094940, 15566035, 10335839, 2571612, 10401874, -833761, 14549202, -6430640, 3002182, --1762547, 7059853, 5531918, -4137127, -4996121, 5624797, -6924024, 780610, 1260036, 967441, --4041027, 736050, -3762928, -6250788, -3355980, -6802692, -290447, 5200669, 9046275, 3394635, -1147293, 4807679, 5959804, -8101382, 12674448, 3369939, -298500, -8214125, -4606353, 4018479, -10060961, -1859721, -88047, -4808753, 1760937, 1515587, -3972845, -5482526, -4810364, -12868259, --4586488, -37123548, -46348064, -16995186, 140025600, 112070728, 74327096, 135528224, -53813792, -128220344, --41096932, -207234864, -80744312, 5864241, -48556216, 95051384, 129866928, 21242908, 82568600, 141779024, -3122441, 39082056, -9192304, -166630768, -137820672, -104167992, -103435160, -50987168, 79103096, 42489036, -61226908, 174037440, 73867528, 10805064, 104263552, 48442936, -59626496, 20330228, -50007376, -168875968, --40581000, -88238496, -173916112, -28923384, 4083440, -42518564, 117759952, 135847664, 53641996, 159742176, -161722704, 30163018, 62375812, 28030030, -102149888, -114591872, -107188424, -192924032, -170415712, -64983928, --79121352, 16672526, 103380400, 141463344, 116963232, 180706448, 134122168, 71931576, 9993852, -22582402, --104210400, -127000576, -93730144, -111598816, -93020400, -4106526, -5240934, 21129628, 100411504, 48358648, -61341260, 96148752, -2008434, -30012694, -15902116, -60358248, -34495568, -20273320, -22270480, 24645596, -50837380, 19662898, 28128814, 31978716, -23396834, -8398272, -9985262, -61582852, 8438000, 25622702, --66715336, -888521, -6235756, -67350456, 24927990, 11272679, -76272712, 48027936, 71595496, 16767552, -144330224, 89754616, -1946694, 76768784, 13698261, -97773320, -81282256, -127298536, -180623232, -135613600, --88377544, -47559784, 61372936, 133379672, 156292784, 194695168, 190727152, 135007472, 29628832, -14517526, --97274032, -177209808, -172392464, -153183760, -128762584, -27935004, 13528610, 22120692, 88153128, 93741960, -64961380, 66937064, 51891256, 22429392, 31666258, 22938346, -5954972, -11979201, -28184112, -56296820, --61058864, -60413548, -61165704, -45817100, -9196599, 4551592, 16142098, 19381040, 10968273, 4398047, -1093069, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +13821205, 7314330, 6095633, 3394635, -1464584, -435402, -1415729, -2878702, -3990562, -2825552, +-4078072, -1725503, 3882651, 1322313, -202937, -5369, 2545305, 1183264, -1610613, -1734630, +-1305670, -7206419, 2986613, 754304, 69793, -1487669, 935229, 126165, -1991791, 1038845, +2637110, -11274, -3290482, -838592, -1422708, -1532230, 405338, 3169686, -821413, 747861, +-3767223, 2417530, -4654671, 2965138, 656593, 175020, 35433, 2949569, -3573413, -2653753, +-4869956, 1290638, 874563, 237834, 2778307, -3005940, 647466, -413927, 78920, -2193655, +1927367, 877247, -1616518, 2997350, -4789426, 2188823, -2615098, 4873178, 2219424, 852014, +345745, -982474, -5975910, 4542465, -1437203, -157840, 776852, 1261110, 1080721, 1192927, +1434519, -446140, 413391, -677531, 1399623, -117038, 793495, -1826435, 609885, -299574, +387084, 707596, 1937030, -127775, -341450, 639950, 760209, -807454, 995896, -1209570, +971736, 188442, 863825, 44560, 553514, -333397, 210990, 739271, 365072, -153008, +568009, -154082, 13207561, 6292664, 8622684, 2362769, 2932926, -500364, 3374234, 354872, +2998961, -2210298, 5847061, -1482838, -6682432, -1830730, 135828, 368293, -2122788, 5125507, +281857, 2003065, 4949950, 2425583, 54761, -4832, 1177895, -4515085, -2990371, 1797444, +2152316, -1641214, 469225, 2211371, -4483946, 6321118, -651761, 933619, -1006096, 2348810, +3256122, 165893, -3430068, -3492882, 6851010, 155156, -2007897, -288300, 3943854, 2921115, +-2044941, -2749853, -6052146, -1875827, -2486249, 252866, -2246268, 541166, -5880884, -2399813, +674847, -2393908, 1286343, 2369748, -1197759, -157840, 1105417, -1492501, 2305861, -169651, +2902861, 35970, -1008780, -3380139, 375273, -4192425, 1311039, 76773, 2365990, 42950, +2429878, 3141232, 2668249, 102005, -1746441, -132607, -644245, 3467112, -943282, 444529, +2208687, 2319282, -170725, 1307818, 459025, 1195075, -498216, 1446867, -557272, 2132988, +479426, 408022, -185220, 191126, 207232, 2793339, -8916352, -2873333, -2039036, 1555315, +1746978, -6087043, -2743947, -1202591, 1449015, 3243774, 1006633, 4445828, -3678103, -5292474, +1521492, 185757, -964220, -3622805, 11758547, -607201, 3118683, 709743, 353798, -257698, +-1826972, -4468377, -3526168, -1092532, 2994666, -2492692, 6150393, -2079301, -587874, -5043902, +-6025302, -510027, -3847754, -2124398, 8185671, -4473209, -1255204, -4342212, 1581622, 216359, +-1590749, -4562866, -884226, 47782, -5202816, 622233, -2806224, 4162360, 2717641, -2379412, +-1284732, -1309965, 1259499, -215285, 3285113, -1693828, -2179696, -2212982, 7464117, 6764574, +-2330020, -6490233, 869194, 2026151, -221191, 1925756, -2713883, 547071, -3145527, 2251637, +158377, 7195681, 4414153, 6842420, -6228240, 2708514, 4146791, 177704, 3143379, 2292976, +456877, 4714801, -877247, -479426, 1189169, 673236, -1942936, 1894618, -1491964, -1243930, +-147103, 500364, -225486, 735513, -1118839, 574452, -156229, 171799, 593242, 890132, +396748, 1028108, 922881, -688269, -962610, 772557, 257698, -1659468, -707059, 1388885, +-845572, -29295972, -4744328, -8441758, -9577777, 2577517, -3241627, -8327405, -6903086, 1159104, +-6800544, 969589, 10140955, -2516314, 4353486, 3303904, 8551280, 2228551, -5954972, 1372779, +9294846, -4330401, 4628364, -6848326, -6248104, 2059974, 2668249, 7315940, 431644, -4467303, +4243965, -2991982, 3257733, -361851, 4612795, -3891240, -2531883, -4341675, 60666, 812286, +-1704028, 3370476, -7689602, 1013075, 7764227, 1704565, -2195802, 3013457, -3962644, -1985349, +-9708774, -2850785, -317291, 1548873, 169651, 5248987, -7793755, 788663, -1064615, 3961034, +2107218, -1475321, 5563057, -4839892, -649614, -3876208, -7488276, -3120831, -1717450, -2080912, +5643587, -5007932, -8090108, 360240, 2660195, -769336, -2327872, 2828236, 3104188, -2220498, +-1818382, -3102040, -1290638, 6564858, -3017215, 3642669, -1066763, -62814, -589484, -166967, +-3366718, 881005, -2011118, -41876, -228170, -430034, 91805, -719407, -1045825, -977642, +-272194, 391379, -639950, 1145683, 494995, -14551349, 8291971, 9394167, -530965, 5283347, +2369211, 11092827, 14688251, 1917166, 1904281, 4249334, 1807108, 2474438, -2111513, 2939905, +-2445447, 3894999, 4480725, -12573517, 6510634, -1353989, -2356327, -3871376, -5124433, 2087354, +3561065, 5763846, 1099512, 1002338, -7379828, 346819, -2168959, -2433636, -1111323, 1007170, +403190, -540629, 7212861, -354872, -2422899, 2411087, -2833605, 3728032, 4865661, 5486821, +2818572, 618475, -3067144, 6125160, 1916629, 839666, 615254, 820876, 416075, -3517578, +-5003100, 4535486, -4665945, 4344897, 3925600, 2916283, -668941, -3265786, 2930242, 3859565, +8504035, 3951370, 3190624, 2010582, -8379481, -2558190, 992674, -1355599, 3558381, -7223062, +328565, 2395518, -6801081, -631360, 2232309, -1635309, 828929, -3962644, 1457605, 511101, +-1732482, 3119757, 1794223, 122943, 3379603, -1552094, -1550483, -347892, 667867, 1393180, +5142687, 840740, 1726577, 1215476, -91268, 1123134, -899259, -995359, -1438814, 902480, +-812286, -677531, 537408, 535797, -682363, 1742146, -1077500, 1211718, 1084479, -536871, +1654099, 469225, 675384, 826781, 62814, 157840, 1927904, -170725, 27029840, 8152385, +1998234, 5288716, 13511967, 5446556, 16292958, 3992709, -3595425, -1168231, -1367947, -1554778, +4420058, 6984154, -3246995, 1500554, 4866198, -1809255, -6774774, 5382131, -639950, 2559264, +-2309619, -3398393, 5534602, 1292248, -511638, -1574642, -6172942, -3050501, 3338263, 839666, +-2126009, -1080721, 930934, 2324651, 6203544, 1963874, -5724655, -1310502, 365609, -1794760, +2054068, 2945811, -5769752, -6957310, -409096, 1749125, -743566, 5382668, -9927817, -2102387, +-4506495, -5579163, -619012, -426276, 1459752, 5320391, -59056, 805843, 1710471, -853088, +7079717, 4529043, -5825587, -5097590, 3876745, 8591545, -751082, -4010426, 8458938, 4484483, +1953136, -3716757, -4049081, 4191888, 205622, 3172370, -1928440, -6143414, -3402151, -4179540, +-2665564, 2435247, -3443490, 478352, 1452236, -1227824, 1407676, 1039382, 1196148, 718333, +-2234457, 1236951, -717260, -1163936, -556198, 1660542, 1277753, 224949, -1924145, 1699733, +-773631, 2931315, -480499, 407485, -2812130, -3584687, 1171989, -3374234, -680752, -518080, +-1935420, -914828, 384936, -3029563, -1292248, -307090, 307627, -632434, 2105608, 302795, +-839666, 13263396, 6443525, 11942693, -4029216, 95563, -3037616, 12031814, -12379706, -1760937, +3170760, -2374580, -2451890, 4025995, -1391569, -3819837, 10558103, 5964099, 1216013, 17835388, +-4875325, -1191853, -3776887, 131533, 2945811, -4609574, -593242, -2394981, 6807523, -5761699, +1531693, 395137, -1809792, 615791, 4001299, 2723009, -5417565, -9453223, 221728, 1938641, +7821673, 9174587, 9136469, 827318, -5269388, 6568616, -15948824, -2630131, -6264747, -9287867, +6491843, -2141578, -3007551, 5056250, -1839320, -2725157, 13915157, 159451, -4108136, 4840428, +372588, 3681861, 2716030, 1808718, 8429947, -5061619, -3102577, 488553, -7239704, -64961, +1368484, -1844152, 2481954, 4160213, 8864276, -3352222, 2955474, 7649337, 4649302, 2260764, +1445793, -2646774, -5597416, 2855080, 4270808, -941135, 428423, -896038, -714575, -3198140, +625455, -988379, 548145, -2988224, -1498407, -2684, -520765, 2745021, 1200980, -2684, +-3832722, -1752884, 1905355, -2252710, -38655, 1460826, 1505923, -2606508, 2410551, 1860795, +620086, 2463701, 2238752, -4460861, -789737, -1730872, 1207423, 2379949, 2932389, -638340, +-1632625, 354872, -886374, -20679730, -31088048, -5237176, 1534377, -535797, 853625, -1451162, +-6239514, -3508988, -4974646, -1333587, 5048197, 6032819, -5478768, -8069170, 6898791, 1433982, +-4436701, 364535, -739808, -4918812, -4132832, 11470247, 5834176, -6160057, 3131031, 1301912, +4904853, -5975910, 6657200, -6646999, 4575751, 2995740, -1407676, -3097745, 2956011, -12396886, +-6154688, 7603703, 12237436, 6797323, -8563091, 207232, -6071473, 8142721, 1684701, 2116882, +580357, -6698539, 3258270, 9961640, 1127429, 7533373, 5332202, 3454764, 5760625, 12219182, +-3384434, -12285754, 5965173, 43487, -2907156, 635655, 10573673, -4307852, -7340099, 3613141, +-1939715, -1240709, -2775086, -1640141, -3299609, -5735392, -2882997, 7099044, -9652402, -6047314, +-3556233, -6923488, -6743099, -388158, 4199405, -6345278, -107911, -2335389, -2678986, -5713380, +-3616363, -6562710, -344134, -5039071, -383326, -99858, 4638028, 3320547, -2337536, -2478733, +-3354370, -983548, -2369748, -2236604, 2817499, -4445828, 1707786, 434865, -2843268, 360777, +-1855963, 1136019, -954020, -3615289, -4476967, 18254, 1194538, 1926830, -836982, 856846, +1435056, 68719, -2329483, -246424, -2988224, 389231, 1411434, 1374926, -11956652, -7790534, +2020782, 1915555, 15943992, -13936095, -9534291, -5381594, -2633352, -1727114, 5158256, 4984310, +-7377143, 7585449, -1755031, 3440806, -5312338, 11307575, -2195265, -4256313, 7311108, 5274220, +4254702, -7685307, -7230041, 9572945, -5007932, 2828236, 2342905, -3462281, 8136816, 2480881, +-4832, 1815161, 5973763, 7670812, 2364380, -6804302, 1588601, -9713069, 5805185, 2546379, +-10882910, 7730405, 1799054, -5648419, 9972914, 3185255, -2698313, 5830418, -900333, 11026792, +-2515240, -2739652, -2331630, -1423782, 14328011, 3044595, 248034, 3918621, -12036109, -7498476, +-8178692, 919123, 7623567, 1038308, 9454834, -12194486, -5024575, -7728257, -7186017, 17856326, +-1814624, 6398965, 4570919, -3794604, -894964, -2451353, 1349694, 973347, 4866735, 3003256, +9748502, -5221607, 807991, -1630477, 2116882, -31139, -193274, 7516, -2081985, -9167071, +3424163, 2186138, 1361505, -2406256, -870805, -1142998, -5142150, -287763, -1844689, -3299609, +1864016, -2777770, 1195075, 1685775, 1285806, 2151779, -3582540, -1903207, -2430415, -2157147, +1275068, 2601140, 1491964, -799938, -493921, -589484, -1124208, 3762391, -1289027, 2692945, +1642288, -959388, 1105417, -682900, -11274, 979789, 982474, -16135118, 5031018, -6924561, +3919695, -4840428, 13032005, 2208687, -9150965, 1448478, -9328669, 7570954, 14405857, -12282533, +8108899, 3018288, -372588, 5956583, 15356656, -5864241, -27380, 4713190, -16791174, 997506, +7622493, -4650376, 5461051, 5973226, -3071975, 15074261, -7515656, -13605920, -5868536, 1657321, +355409, -2770791, -5881958, 4123169, 3794604, 24696, -9598715, -2232309, -2436857, 6428493, +-4206921, 25274272, -3181497, 3636227, -1166621, -1052267, -12257837, 1279900, 9084393, 7374459, +24627880, -2625836, -2386928, -5078262, -973347, -6910603, -526670, 9900973, -5259725, -996969, +1788317, 2354716, 9710384, 7926362, 2234994, 19092204, -3606162, -17634598, -17678622, -12443057, +-2566780, 5603859, -1742146, -4615479, 8413841, -485868, 7471633, -4577362, -872952, 6092948, +5149666, -1843078, -1803349, 646929, 1579474, -1934346, -4125316, -5906117, -1997697, -2493229, +-744640, -4202089, 3167002, -1242856, 954557, -2113124, -3038689, 4106526, 1831804, -2052458, +-559420, -1676648, -1811403, 1809255, -1126355, -1988033, -4012573, 3204583, 1262720, -1693828, +-3037616, -4013647, -752156, -2749316, -2805151, 3447785, -2015413, 712428, 145492, -1438277, +1474784, 701690, -546535, -718870, -887448, 28727426, -20703890, -15705622, -5025112, -9923522, +-11349451, 13935558, 5653788, 2794950, -4378719, -2778307, 16908750, -4905390, -7103876, -20219632, +-2916820, -486405, 9553618, 3537443, -4102768, 1261110, 8378408, 3800509, 5243618, 12964359, +16266115, 4523138, -6046777, 4201015, -9753871, 6706055, 5492727, -3481071, 338229, -7553774, +3063386, 212601, -14657650, 14299557, -1279363, -6645925, 8827232, -13561896, -3133179, 14930917, +8517994, -186831, 561567, -18791556, 6599218, 10501732, 5992553, 3489661, -1028108, -13871134, +-40761388, -3252901, 8309688, 11454141, -1046361, -11956652, 20137492, -9329743, 9190693, 15244450, +12562242, 2334852, 15196668, 1727114, 5415954, 3214246, 9221295, 1811403, 2924873, 19354734, +-6494528, -4232154, 16363825, 8529268, 4433480, -6767795, 1637456, 13308493, -1454383, 10661719, +2441689, 2315524, 6706055, -3624953, -342524, 700080, -718333, -3027415, 5218922, 2414309, +-7303592, 3980361, 2698313, 3830037, 1875290, -2119030, -34897, -2350958, -2698850, 3191698, +4066797, 1671279, 2447595, -2210835, -2158221, -1487132, -2647847, -3472481, -5180268, 700080, +-3344706, 2392834, -1265942, 1363652, -4800700, -3188476, -1066763, -1624571, -1478543, -2240899, +534187, 4474819, 4675609, 1695438, 290447, -2761127, 3668976, 14352170, 13651017, -3611531, +-6997576, -1360968, -4129611, 15703474, 10207527, -27426588, -3009162, 2195802, -12865575, 5060009, +-18765786, 14208289, 3446175, -2261837, 7784092, 3815005, -3951907, -6363531, -4606890, 20073604, +802622, -226023, 4449049, -2799245, 8063801, 23653996, 9663676, -3546032, -4196720, -3570192, +13741748, 4798552, 13914083, 9536975, 6941741, 3914863, -6063420, -6766721, 6206228, -14191646, +2406792, -7590281, -6259915, 368830, 9729175, 1251446, 782758, 3371549, -3061238, 16159278, +21114596, 24038932, -113817, 10902238, -14342506, 5411122, 8311836, -6709276, 12295418, -9971840, +-19643570, 2471754, -10292889, -1682017, 930397, -10582799, 2631204, 14132590, -8667244, -8613557, +7200513, 13077102, -579821, -5020280, 12175159, 926102, 2737505, -8515310, -1711545, -734976, +10055592, -5256503, 836445, -2525441, 2223719, -364535, 1971390, 2371359, 1814087, -163209, +1020592, 2006287, 2857227, -2477123, -4515621, -1012539, -643708, -4422743, -5115306, -599685, +-2329483, 3477850, -3442416, 2586107, 4919348, -567473, -8003135, -1103270, 1638530, -3114925, +-3739306, 259846, 2305861, 12246562, 4258997, 3553012, -308701, -33286, -1000727, 3331821, +-809064, 3562675, 10612864, 9237401, -1141924, -920734, -1699733, 108985, -17106318, 31129386, +1944010, 8109972, 23763518, -8768713, 2409477, -4516158, 6250788, -6836514, 6843494, -16718160, +-19870666, -584116, -11775727, -876710, -1115618, -1309965, -3371549, 1293859, -5520644, 4984310, +-15796353, -6284074, -21304112, -1051730, 4871567, 10236518, 22982906, 12775380, 3966402, 2962454, +6595459, 5124970, 3874061, 9315784, 9729175, -3060701, -19456202, -19254876, -13228499, -7871602, +1930051, 6535330, -7127498, -11271068, -19734838, 606127, -7538742, 18047452, -8031052, 4563940, +-13692893, -6568616, -2397666, -5590437, -26459682, -27529130, 7566659, 2863670, 722091, 14179835, +8075613, 11391864, 9155260, -17131550, -3726958, 32266478, -5956046, -12142946, 4750234, -7043747, +3307662, -19839528, 8075076, -9074192, 1377611, -1257889, 13095355, 826781, 5267241, -11261941, +2172180, -6325950, -2845416, -7706245, -5844914, 4115116, 4582730, -10286447, -3436511, 810138, +1995549, 2636036, 1411434, -3947612, 4573604, 1933272, 1607392, -470836, -231928, 1492501, +4645007, -4850092, 4696547, -1157494, -85362, -1677722, 3019899, -2818572, -1606855, 4149475, +-7580081, -76773, 1595044, -4591320, -1504312, -10672457, 7846369, 9214315, -504122, 2241973, +2554432, 3202435, -4663261, 5180268, 3391951, 4066260, -3345780, 2266669, 3221226, 4711579, +18467822, 14069776, 1833951, 14949171, -2799245, -6077379, 8180302, -11372537, -22275848, -33263448, +2788508, 739808, 12869870, 9441412, -12411382, -6315750, -32526324, -2149094, -15149960, 3569655, +-7625715, -3604551, -6260989, -2377801, -2537252, -11264625, -5085242, -13134010, 10501732, -2612951, +8986682, 23332410, -12309376, 6733972, -1913945, -5757941, 6002217, -12441447, -21205328, 10203232, +4980015, 10147934, 6332393, -44394392, -20163798, 5939403, -14785962, -1235877, -12633109, 18604724, +22389128, -1082869, 24748676, 3504693, 11242077, -3256659, -819802, -13833016, 8767639, 17901960, +3876745, 29801704, 703838, 4109210, -8748848, -13089987, 17634598, 27966142, 9759776, 5435281, +2755222, 10579041, 912681, 2025614, -26167626, -19189378, -1987496, 1398549, 3468186, 19678466, +21160230, -3894999, 1389959, -7262253, 4406100, -13551696, 346819, -14341970, -12151536, 6274411, +-354335, 1580011, -8067559, 5179194, 6334540, 4261145, 6415071, 7575786, 657130, -4300336, +3323768, -5874442, -1433982, -3625489, -8609799, -2473364, -4762582, -3834332, 7145215, 3946001, +-2546379, -5662378, -8527121, -5585068, 5754183, -5667746, -560493, 455267, 3938485, -8047158, +-6426345, 2849711, 9991705, 6367289, 2571612, -16106, -6010270, -736050, -3653944, -6968585, +11900281, -17418776, -8582955, -32544578, -40553620, -30071214, -13728863, 9196599, -259846, -7132330, +-14812805, 32212, 26769458, 13107703, -23404350, -3851512, -4832375, -16542067, -2942590, 1225139, +11275900, 8302172, -17456358, 12555263, -9856950, 5332739, -9181029, 2789045, -13369696, -4996658, +6642167, -24172076, -4606890, -9110163, 7956964, -6012418, -22321482, 26286810, 25361782, 350040, +-10218801, 14322642, -34212100, -10719701, 10222022, -11514270, -7248294, -878321, -11038066, 2199560, +-2820720, -22944790, 9880572, -2918967, -7022272, -7845832, -6027987, -1430761, -6249178, -9725417, +19080392, -9061307, -8963597, 9063992, -201863, 31256088, -6212134, -19367082, 11121818, -10111427, +-8550206, -15108621, 10528575, 19279572, -37556268, 2957622, 31794032, -5158256, -1915555, -12553116, +21694416, -1525250, -11708081, -1560147, -10987063, -8860518, 15736223, -9411884, -731755, -5221607, +-6491843, -10998338, 4716948, 3684545, 5799817, -1306744, -8804683, -6080600, 390305, 1561758, +-13441100, -3867618, -8620536, 13448616, -4421669, 965294, 1986959, 1669132, 1503239, -10924786, +7454990, 374736, -4095788, 9812927, 1599875, 12838194, -2190433, 14833206, 3524558, 5992016, +7349226, -9590125, -6238440, 4696010, -7801271, -6153615, 2442226, 45097, -5449777, -12963822, +6444599, -25663504, 51269024, 36568964, -695785, -9774272, 8138963, -30735322, 516470, 38264400, +-6737193, -13292387, 636729, 43370044, -6196564, 9531606, -9208410, -19594714, -15841987, -3993783, +-7227356, 8010651, 11107322, 625455, -16294032, -22821308, -20992726, -3365107, -4591320, -11303280, +10649908, 8629126, -9152575, -11170673, -12195023, 6926709, 2440078, 8507256, 21721260, -78383, +-18444738, 12623446, 5018133, 4303021, 1386738, -284542, -8846559, 16104517, 8291971, -6352794, +-7576859, -5010616, -20936892, 5876589, 15504295, 4758824, -14625437, 17315160, 12738336, 7215545, +2030983, -8960912, 4855461, -29882772, 4807142, -1768453, 26869316, -9508521, -13108777, 5778342, +-6772627, -455267, -19184008, -3394098, -5035313, 26080116, -16732119, -31376884, -20374252, -40804336, +8190503, -8210367, -2550137, -21720724, -13770739, -36042292, -15847892, -12521440, -1692217, 8998493, +-11494943, -1911261, -2021319, -1705639, -3026878, 7893076, -13370770, 6035503, -5128728, -10412611, +1845762, -2896956, 9934259, 5178657, 423591, -5141076, 12777528, 11870216, 7310035, -4371740, +-6008123, -6034966, -5465883, 13333189, 21788906, 2698850, 20052666, 21923660, 7532836, 567473, +-19151796, -1897302, 3930969, 3038153, -1512902, -5148055, -16139413, -175557, 11391864, 1978906, +-12014097, -2931852, -8935143, 48922900, 1705102, 8294119, -8356933, -15773267, -21721798, -6904697, +5847061, 14470819, 11584601, -10122701, -290984, -21301964, -8092792, 7900056, -18345416, -9520332, +-7100118, 26478474, 13485124, 14658187, 13436268, -15051176, 2564096, 5712844, 5972689, -1288490, +17498770, -3726958, 7569880, 13936095, 5031554, 3996467, 11384885, 16140487, -9654550, -18603650, +12302934, -1872069, -191663, -19677930, -18719614, 4406100, -9492951, -7031399, 15967078, -16564615, +21197274, 13998909, -9785546, 11442867, -12838194, -12534325, -15612206, 22298934, -15800648, 7117298, +6499360, -25266218, 2141041, 3064996, -20316270, -34429532, -31160524, 22613002, -23490786, -322123, +-21151640, -4723927, -15204721, -1166084, 9375914, 5990943, -15472620, 15821586, 18003966, 38289632, +9725417, -25648470, 8788040, -15771657, 8290361, -22565758, 11857868, -9646497, 1428614, -4614406, +8983461, -2775623, -9462887, -21683142, -21900038, 2413235, 1817308, 13695577, -10030896, -937377, +21100100, 6043019, 14543833, 4479651, -4144107, -1653026, -5354751, -14330158, 4857608, -17288854, +-10467372, 3671660, 14025753, -18884434, 10220948, 1916092, 13245679, -4645007, 7292855, 13589277, +14748918, 15046344, -7164006, 7296076, 11500849, 12632036, 2205466, 7496329, 3686156, -5911486, +23159538, 10746545, 11536819, -9826885, 880468, -21431886, -340376, 3600256, 4188130, -18901614, +-19663970, -31130460, 21627844, 2209761, 7450158, -5129265, 11475079, -8534100, -8360154, 6424734, +16484084, 3845606, 10852845, 33501282, -4815732, -20244866, -42945916, -6134824, -16568373, -8186745, +-10193568, -19981798, -14017700, -29841432, -3414499, -476205, 10495826, 30917322, -25691958, -9926743, +-4176856, 10121627, 11017128, 30635464, 4234301, -35003448, -7968775, 7177427, 27447526, 7184944, +-42315628, -16995722, 38448012, 3498251, 38357816, -22513144, 1326071, 3005940, 23259396, -2143189, +21176874, 31780074, 4594542, 26967562, 19006304, 4594005, 37427956, 31917512, 10457172, 49760416, +38312184, 23988466, -40176736, -2575370, 15910169, 9215389, -345208, -29161218, -34794604, -18010946, +-49856516, -7836168, -37038724, -14111652, -9419400, -53446036, -50636592, -35252016, 17604534, 634581, +-11583527, -535260, -3697967, -978179, -9718437, -5126581, 12617540, 5082557, 2328946, -1560147, +2155000, -2296734, 7894150, -1149441, -13177497, 23388244, 3943854, 5763309, -6706592, 1307281, +-617402, 12365211, -425739, 7300371, -3980361, -12495134, 5308043, 10061498, 25926034, 23079006, +1742146, 21475, 16642998, 8432095, 19407346, 16210817, -4842039, 18665928, 10539850, 4020090, +11808476, 7799124, -6280853, -2631741, -14421963, 9358734, -12836584, -5459441, 7301982, -27711666, +29579976, -12831215, 19377818, 9430138, -24779814, 3600793, 15479599, -9846749, -25884158, 17084306, +-6971806, 14597520, -8644159, 3650185, 6061810, -16077673, -1821603, -7146826, -269509, -26244398, +-20474646, 25314538, 1243930, 10173704, -19980724, 20677046, 18659486, -14092861, 11922292, -20409148, +-4269735, -11483669, 14832670, 36033164, -533113, 43744780, -10989211, -2219424, 2218351, 4361003, +-2868501, -24874304, 43179452, 27931246, -3205656, 23437100, 18599356, 24332600, -9119289, -708133, +-43549356, 19622632, 20780662, -5842230, -7279970, 27213986, 14668387, 14273787, 34269544, 5533529, +-17277042, -21264384, 6617471, -6794639, -24918864, 20643760, -28898688, 1067836, 6713034, -20900922, +-32118840, -22202296, -7990250, 2117419, 26391500, 17324288, 8607651, -49827528, -13680008, 29696478, +-2097555, -11009075, 9109089, -27100170, -16485158, 22416508, 178241, 115964, -9268539, -66035, +14057428, -4481262, -9848360, 7602629, -3208341, -19347218, -10095321, 1666984, -1127429, -1389422, +614180, -8611946, 327491, -13357885, -17358110, 2164127, -1327682, -29286308, -2953864, -17823578, +-9846749, -3449396, 4715337, 5088463, 16259672, -14921790, -9690520, 2999498, 15852724, -16493211, +-17097728, 24289114, -3507915, -1600412, -4366371, -375810, -9960029, 4149475, 11796665, 6092411, +10307385, 495532, 4062502, 34897, 1740536, -36783172, 20883742, 32648730, -714038, 37613712, +11264625, -32523640, -20172388, -2490544, -11437498, -19752018, 20875152, 24609088, -2461553, 17153026, +22902914, -18080202, 16125455, 27657442, -1775432, -37152004, 14527727, -971736, -7487739, 10364293, +28021440, -8890045, -14264123, 6993281, -12430172, -16052440, -1228361, 24811490, 20998632, -34998076, +11059004, 15128485, -23672786, -14951855, 28349468, -7629473, -41477572, -5163625, 34693672, -11225971, +-59882580, 62836984, -17936320, -7092602, -31008054, 40657772, 13106093, -13806172, 29381334, -17171816, +-13044353, -7398618, 75343928, 25352656, -31668404, -27764280, 28846074, -6519224, 42032160, 967978, +31526670, -43321188, 34687228, 60143500, 5578089, -6244346, -10645613, -10253698, -24007256, 56767120, +37934224, -33618320, 9412421, -35344360, -6174553, 4061965, 7328825, 5226439, 10409390, 1224066, +-39068096, 18479096, 2291365, -3803194, -929860, 18171470, -7861938, 4222490, -5782637, 9549323, +-3782793, 2659122, -6321655, 11967926, 377420, -2088428, 6570226, 9672803, -21433498, 2854006, +13349832, 5394479, -15472620, 8494908, 24077586, -23397908, -36866388, 7511898, 4472135, 14687714, +14019310, -1645509, -33310692, -10942503, 8993125, 4895726, 9254044, -4709432, 1301375, -1031866, +-11179263, 9983651, -8766565, 27043262, 61847528, 11956652, -23916526, -5699422, -5866389, 10845866, +9306657, -19313932, -27538256, 7344394, -23304492, 4632659, -14507326, -16687559, -3628174, 2821794, +7904351, -18599356, -7512972, -7377680, -23145042, 19406272, -7281580, 1246077, -3435437, -15444166, +6124087, 4339528, 536334, -3339874, 171262, -569620, -9129490, -19646254, 8399345, -9754408, +8519068, 5986111, -19634442, -15898358, -1806571, -2287070, -2238215, -4221416, 16004659, -11075647, +1637993, -20853676, 17804250, -20431160, -10813117, 10158671, 288300, -16373489, 13020193, -22014392, +1680943, 6631967, -578210, 2413235, 10557030, 5013301, -22680112, 11488501, 1620276, -13681618, +19471234, 7675644, -21520470, -2346126, -17155174, -2248952, 7007776, 5768678, -21906480, 27939836, +-14744623, -8094940, 15566035, 10335839, 2571612, 10401874, -833761, 14549202, -6430640, 3002182, +-1762547, 7059853, 5531918, -4137127, -4996121, 5624797, -6924024, 780610, 1260036, 967441, +-4041027, 736050, -3762928, -6250788, -3355980, -6802692, -290447, 5200669, 9046275, 3394635, +1147293, 4807679, 5959804, -8101382, 12674448, 3369939, -298500, -8214125, -4606353, 4018479, +10060961, -1859721, -88047, -4808753, 1760937, 1515587, -3972845, -5482526, -4810364, -12868259, +-4586488, -37123548, -46348064, -16995186, 140025600, 112070728, 74327096, 135528224, -53813792, -128220344, +-41096932, -207234864, -80744312, 5864241, -48556216, 95051384, 129866928, 21242908, 82568600, 141779024, +3122441, 39082056, -9192304, -166630768, -137820672, -104167992, -103435160, -50987168, 79103096, 42489036, +61226908, 174037440, 73867528, 10805064, 104263552, 48442936, -59626496, 20330228, -50007376, -168875968, +-40581000, -88238496, -173916112, -28923384, 4083440, -42518564, 117759952, 135847664, 53641996, 159742176, +161722704, 30163018, 62375812, 28030030, -102149888, -114591872, -107188424, -192924032, -170415712, -64983928, +-79121352, 16672526, 103380400, 141463344, 116963232, 180706448, 134122168, 71931576, 9993852, -22582402, +-104210400, -127000576, -93730144, -111598816, -93020400, -4106526, -5240934, 21129628, 100411504, 48358648, +61341260, 96148752, -2008434, -30012694, -15902116, -60358248, -34495568, -20273320, -22270480, 24645596, +50837380, 19662898, 28128814, 31978716, -23396834, -8398272, -9985262, -61582852, 8438000, 25622702, +-66715336, -888521, -6235756, -67350456, 24927990, 11272679, -76272712, 48027936, 71595496, 16767552, +144330224, 89754616, -1946694, 76768784, 13698261, -97773320, -81282256, -127298536, -180623232, -135613600, +-88377544, -47559784, 61372936, 133379672, 156292784, 194695168, 190727152, 135007472, 29628832, -14517526, +-97274032, -177209808, -172392464, -153183760, -128762584, -27935004, 13528610, 22120692, 88153128, 93741960, +64961380, 66937064, 51891256, 22429392, 31666258, 22938346, -5954972, -11979201, -28184112, -56296820, +-61058864, -60413548, -61165704, -45817100, -9196599, 4551592, 16142098, 19381040, 10968273, 4398047, +1093069, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -5063230, -15737834, 6034966, 3824132, 1245541, -3338263, 45634, 3016678, 5682779, 75699, 554588, -329639, -2076080, 550293, 1931662, -391379, 1886564, 2901251, 3874597, 1621887, 1592896, -2035278, 1813550, -3562675, 3613141, 6772090, -3209414, 1919850, 1068910, 1884954, 354335, -4005594, -2609193, -940598, -2347737, 2306934, 6725919, -1142461, 3266323, -101469, -1513976, --5550709, 2077690, -2881923, 2558190, 1280974, 2857227, -331786, -1710471, 886911, -1176821, -3834332, 501974, -3064996, 3911105, -871878, 3053722, 2335389, -118648, 2240362, 4408247, --1258425, -1538672, -1269700, 2195802, -1821066, -2370822, 2719788, 36507, 1818382, -2929168, -4310537, 260919, -1243930, -504122, -503585, 1729261, -1647120, -2595771, 1511829, 2330020, -2178085, -2058363, -3105261, 1242319, -134755, -364535, -1213865, -1123134, 1514513, -399969, --255014, -952946, -1161252, 226560, -843961, 353261, 207769, 1143535, 762357, -338229, -377957, 651761, -721555, -285078, 10201, -312996, -561030, 397821, 1071594, 633508, -791348, 16106, 12225624, 9594420, 4808753, 707059, -1816771, 5563594, -3260417, -3485903, --812286, -6094559, 3677029, 255551, -2541547, 1453310, 3533148, 6098317, -2836826, 3521873, -7898982, -2247342, 41339, 1823751, 4098473, -1024887, 4466229, 3184182, 4518306, 1057099, -3446711, -3510062, 6026913, -707596, 5814312, 2906619, -659814, 740882, -983548, -118112, --2126546, -978179, -2623151, -1902134, 2013266, -528818, -5667746, -1249299, 577136, -139050, --3172907, -3236258, -1675037, -1388885, 4393752, -1749125, -4874788, -6460168, -7158100, -2441689, --3167002, -236760, 1074279, 3464965, -4691715, -2099702, 519691, -453119, -2117956, 538482, --4937602, -444529, -5814849, 3111704, -3179350, -1516660, 3984119, -565325, 2725694, 813896, -973884, 3126736, 745177, -2483028, -1176821, 266825, -2471217, 1316944, 2453500, 1224603, --1942936, 1454383, 2046552, 423591, 1094680, -592706, -1155346, -768262, -1155346, 817118, --148176, 750546, -970663, -679679, 766115, 6478958, -14046691, -3777961, -7113540, -1328219, -1611, 7731478, -3757023, -12601434, -4430796, -327491, 4803384, 1489817, -4664872, -10940892, --2805688, 2991982, -1217086, 6154152, 251256, 2694018, -599148, -4858145, -5270462, 3178276, -3894462, 451508, 1272384, -195958, 2386928, 548145, -6483253, 343597, 9163850, 1229971, --2258079, -845572, -2414309, 559956, -2079838, -3975529, 6142877, -1904281, -2532420, 5560909, --2889439, -4934381, 246424, 34897, 181462, -7116761, 5809480, -2203318, -115427, 5342940, -4879083, -7629473, -1912334, 1482301, 1877975, -670552, 4206921, 1158031, 2102923, 2905009, -460098, 2323041, 3530463, 770410, 48855, 3275450, -8679055, -1920387, 248571, 4445828, -2491618, -1063004, -849867, 3236258, 3037079, -3462818, -463856, -1226750, 139050, 1919850, -2465311, 496606, 3039226, -292595, -2120103, -1007170, 277025, 235149, 321586, -797790, -2129767, -417686, 789737, -306553, -915365, 629750, 9127, -402116, -742493, 187368, --695785, -106837, -1278827, -1003412, 311922, -185220, -990527, -2017561, -703301, 460635, -1762010, -27909772, -11086384, -5578626, -7984881, 2561948, -2791729, -2610803, -379031, 3599183, --3250753, -3754875, -5600638, 1182727, 4944581, 1181116, -3853660, -4662724, 1367947, 4231617, -3809099, -5309654, -7968775, 667331, -7452842, 4018479, -93416, 2825552, -252866, 2728915, --2959769, -1154809, 7705172, -9306120, 4270808, 2258079, 1005559, -3255048, 2028835, 4689568, -1188095, -5641440, 1109175, -3552475, 2750927, -7726110, -338766, -6992207, 5395553, -504659, --1444183, -1932735, 2951716, -11782706, 5425618, -3345243, -7219303, 2943663, 5733782, 6605123, -3808562, 1469416, -504122, 852014, -632434, 4290673, -2443837, 1270774, 3277060, 8240432, -1264331, 239981, -5899675, 3817152, -2951180, 747324, 128312, 4424890, -3889630, 307627, -3956739, -273804, -4769025, -6439767, 5357435, 535260, 978179, 2801393, -592706, 1406065, -1131187, 44023, 942208, -370978, 132070, 1532767, 1312113, 1512365, -2396592, 1017370, --1806571, -685047, -1526324, 1487132, -1727651, -15913928, 7796977, 12402255, 2424509, 967978, -6912750, 2316598, 2122788, 3760781, 530428, 3935264, 3983045, -3218004, -576599, 524523, --3889630, -2432562, -39192, 1904818, -2289755, 12896176, 6870874, -1898376, 934692, 4085051, -5173288, 5878200, -2456185, 4134980, 4843650, 257161, 1420560, 1378148, 2762738, 1979980, -1224603, 2713883, 2616709, -5601174, -4307316, -8615704, 940598, -3061775, -4289599, 4409321, --1248225, 2770254, -10645613, 11718818, -842350, -5595269, -1026497, 9286793, 6740951, -1497870, -250182, 4489315, -2132988, 1922535, -3420942, -7337952, 871342, 670552, -5876589, -2342905, --5792837, 1021665, 2152316, 1297617, -2812130, -5141076, -7805566, -9323837, -6686727, -2622615, -542777, -2278480, 914291, 3078955, 2751464, -3883187, -408559, -4233764, 1547262, -1483911, -1218697, -68719, -1717987, 1220845, 1415729, -1254667, -580357, -1629940, 2187749, -2599529, -569083, 817118, 772557, -273804, -596464, 541166, 1165547, 1147830, 955093, 717796, -983548, 310311, 1865626, -438624, 2066953, -1295470, 657130, -392453, -523449, -1489817, --1139240, -994285, -1335198, 519691, -1071058, -153008, 987306, 318901, 29315300, 7773891, -2174327, -1086627, 17668958, 2073932, 8395050, 1733019, 5583458, 9203578, 3246995, -5108327, -5429913, 6326487, 996969, -461709, 1348620, 11580842, 799938, -3957812, -7044820, -2068564, --216896, -8044474, 1344862, 2386928, 4611185, 1966558, 3252901, 8869107, -2776160, -1411434, -5442798, -854162, -2411087, -462246, -7940858, 5128191, 3351685, 178778, 5094905, -2554969, --6957310, -15022185, -5509370, 5541582, 6120866, 187368, 4292283, -4248797, -4618701, 12211666, --7083475, 5529234, -6239514, 1291711, -9090835, -9541270, 10331007, -3962644, -3733400, 14259291, -1060857, -1616518, -6719477, 5217849, 8228084, 387084, -4458713, -8422968, -1336809, 6092948, --1973538, 2052458, -3732864, 2988760, -1433445, 952409, 6490770, -7047505, 2175401, -2012729, -412317, 783295, -833224, 7496329, 2329483, 1078037, -2262911, 46708, -1800128, 3138547, --1566053, 2480881, 2490007, -2677912, -19864, -459562, -1751273, 3537979, 562641, 1633161, -92879, -1303523, 681289, -27380, 19864, 978716, 1537598, 544387, 2029372, 606664, --210990, 1118302, 738734, -860604, 195421, -402653, 396211, 1801202, 1999307, 277025, --252866, 14890115, 5004711, 12335146, -7537131, 2456721, 6964290, -9446781, -3172907, -3701725, -1033477, -4782446, -2851858, 7305203, -2173254, -1396938, -463320, 9146133, -3291019, -4265440, -9844065, 1567126, -6863358, 2901251, -1459215, 1547799, 3758097, -5631239, -1236414, -4236985, --7509751, 900869, 250719, 1417876, -7387881, -7779260, 3062312, -695785, 2982318, -337692, -4310537, 1225139, -134218, -4980552, -4738423, 1301912, 4841502, 2294050, -1337346, 14015552, -3395709, 2370822, 6444599, 2330020, 4808216, 4799089, 3222836, 1905892, 2484102, -2077154, --1049046, 1030255, -5901822, 1537598, -9548249, 2583960, -6301254, 4937602, -3519189, 2692945, --1184874, -4701379, 1624035, -1275068, 5070209, -4411469, 13469017, 11260331, 5272073, -9710921, -3092377, 4250944, -4072166, 1739462, 1249836, 6531035, 6305549, 2574296, -88047, -947040, --1291711, -3872450, 5879274, -493384, -652298, -37044, -1624035, 579821, 1995012, -1658931, -3085934, -1213328, -2449742, -2674154, -44023, 1726040, 1782411, -541166, -577673, -2127083, --844498, 1025960, -2433099, 2699924, 2904472, -1884417, 558346, -2368675, -714575, 320512, -975494, -1824287, 3074123, -18502720, -35604204, -1518271, -7135552, 6176700, -1835562, -9856413, --955630, -7981123, -8804146, -7545184, 11644193, 6047851, -7776575, -4468377, 8862665, 5135171, -7909719, -5437966, 5116380, -4822175, -4873714, -1497870, -2128156, -15052250, 4116189, 8608188, -3706020, -8944269, -2054605, 1597728, 2297808, -7976291, -1775969, -11451457, 2534031, -5421860, --503048, -3980361, 2199023, 12281459, -1315871, -2262911, 6153615, 8984535, -5416491, 2465311, -3397856, -7542500, 4059818, 3796751, -8871792, 1419487, 5758478, -1333587, -9341017, -5867999, --6020471, 8521215, 3305514, 8346195, -4907000, -9582072, 2295660, 4826470, -2027225, -6847789, -4591320, 6758668, 6393059, -7853348, -4080756, -1599875, 12769475, -2668249, 7632157, 2280628, --8947491, -7264401, -1371168, 5050345, -8475581, -454193, -1554778, 4727149, -994285, 10594611, -1350767, -2358474, -3117610, -2613488, -3005403, -1909650, -996432, 1031329, 9127, -1174137, --3827890, -307627, -3719979, -1575716, 1582696, -1242856, 652835, -1017907, -2799782, 1791538, --417149, 4593468, -836445, -3585224, -2534568, 1525250, -643708, 250182, -977105, -2267743, -850940, 2624762, -2200097, -612033, 3499325, 1698123, -2076080, 2858838, -18214420, -17180, -504122, 10504416, 2544231, -4188130, 6212134, -2985002, 2717641, -9865003, -2905009, -6248641, --3470871, -12473122, -4738960, -7446400, 17204028, 9895068, 10484015, -12234751, -10484552, -5007932, -5859946, -551903, -144418, 366683, 3515431, -824097, 4991826, -7112466, -6127308, -103616, --1748589, -8776229, -8858907, -7058779, -5140539, -3799436, -3536906, -11121281, 5096516, 13673565, --2977486, 6422050, 8759586, -6405407, 7578470, 4835597, 1788854, 12491912, -614717, 10467372, -3855270, 1379221, -9822590, 3964255, 4820027, -2538863, 14338748, 11496017, 2208150, -4217658, --7183870, 4202089, -7063074, 2907156, -166967, 8555038, -48855, -12590697, 882616, -4919885, --2046015, -9414568, 11052561, 5821828, 3985193, 2710661, 12337830, -3485903, -12999792, -1954210, -8115341, 303869, -6715718, -1638530, 888521, -2804614, 1540283, 4005057, -80531, 208843, --877247, 1359894, -260382, 4809290, 1395328, 1495186, -1160715, 1916092, 2444910, 4376572, --3651259, 2463164, 2428267, 59056, 726386, 4408784, 2334852, 1209570, -2678986, 3761318, --1135482, -2037425, -2537789, -70867, -6501507, 4165582, 2011655, 832687, -3110093, 3685082, -3536906, 6477885, 3926674, 1182190, 1045825, 424128, 5235029, -16489453, 7431367, 5449240, -7049652, -7704635, -13674102, 3952444, 4100083, 675921, -11532524, 11011222, 3155190, -5894306, --10158135, 4568235, -4498442, 17633526, 20541754, 3019362, -3299072, -7685307, 11659762, -13298292, --4764730, 16371342, 4064650, -3207267, -8875550, -8189429, -4630512, 267899, -10852845, 2420214, -11537356, -1494649, 4326106, -8491150, -7745437, -2647847, -6406481, 16757889, -6175626, 7509751, -6185290, 6782827, 1782948, 3316789, -11655467, -11703786, -11207717, -2527588, 8383240, 19320374, --7814693, -14015015, -3248606, -6477348, 3564286, 2967286, 10758893, -6620155, -155693, -8760660, --1679332, 15462419, -1999307, -8479876, 11072426, 3595425, 1775432, 5784247, -12455405, 1859184, --4230006, 1161789, 5674726, 13585518, 3793530, -15880105, 5770826, 1342177, -2474975, -6645388, -290984, -1734093, -883153, -473520, 2217814, 3602404, 4370666, 1405528, 281320, -2606508, -810675, -844498, 3132642, -5428302, 1993939, 2038499, -133681, 418759, 884226, -4125316, --127775, -2757369, 4414690, 4057134, 1004486, 4882841, -1949378, 621697, 3753265, -859530, -2969970, 668941, 2747705, 863825, -6274411, -452045, -2256469, -426276, 828392, 295816, --2226941, 136365, -2619930, -76236, -1286343, 26761404, -11611981, -9166534, -2755759, 5607080, --15641197, 6234682, -4198331, 7872675, -7003481, -3251827, 9754944, 7164006, 2776160, -4941360, --1745367, 13261248, 13120588, -2770791, 11458436, -3370476, 16835198, -7912941, -4108136, 2962454, -17632988, 12808129, 4276714, -9497783, -644245, -19621558, -2940979, 2996814, 9012452, 10423886, -18575196, 4801237, -328565, -962610, -7116761, -12267500, -868657, -10650445, 7659001, 2331094, -11838540, 6516003, -4039417, 11658689, -13965086, 6241125, -3114925, 937377, -2430415, 14856292, -8747238, 4198331, 2658048, -27180164, -4318590, 15996606, 8108362, 919123, -512712, 736587, -12952011, 5420249, -20508468, -6766184, -7922067, 1838783, 426276, -20446192, 780073, -19118510, --12640626, -1734093, -8200703, -8948564, 11880416, 14943265, -1635846, -7383586, -823023, 4533338, --1862942, 3856344, 6132140, -577673, 6814503, 9929964, -3219615, -5655398, 908922, -2457795, -3012920, 1893544, -1595044, -1476932, 115964, 71404, 2813204, -383326, -3459596, 624918, -3394098, 1190780, 3014530, -2709051, 4579509, -76236, -1702955, 1054951, -2916820, 1091459, --5834176, -3803731, -4567161, 2280091, 213138, -4400731, -872415, 3635690, 2429878, 3146064, --2139431, 1701344, 26844, -788127, -5575405, -2929705, -5909875, 9710384, 18914500, -4787815, --7692824, 1058710, 7319161, 4167192, -11563663, -754841, -9367324, -549756, -12751221, -1444183, --10958609, 465467, 11362336, 841814, 25077240, -10576357, -5024038, -9001178, 10247792, 16641388, --13345537, -4534949, -20709258, 3838627, -140660, 5605469, 5146445, -11677479, -6849936, 9007620, --3358665, -2631741, -11241540, 22687090, -2988224, -24419574, 6903086, -6484327, -7177427, 8695161, -6887517, -7106024, -7690139, -2422899, -14002667, -8526047, 4770635, 3080565, 4976257, -4361540, --10088341, -11877195, -11747272, 9704479, -17292076, 203474, 4305168, -5439576, 573915, -185757, --2236604, -13880797, -2427730, -5686537, 8918500, 11165304, -1950452, 17398912, -858457, -255014, --5217312, -1192390, 25271050, 2359011, -11203959, -4609574, 9917079, 7201587, -13805636, 205085, -2135136, -9538049, 8032126, 1773822, 8973797, 1286880, 1488743, 1276679, 834834, 3772055, -5461051, 392453, 2808909, 8469139, 811212, -3133716, 1635309, 4022237, -3102040, -1013612, -634581, -4100620, 3861176, 3342558, 4439923, 757525, -4511327, 983548, -1447404, 679142, --830002, -956167, 559956, -2711198, 3864934, -2019172, -2416993, -3214783, 7661148, -24696, --7991861, 5850819, 4812511, 1913945, -382252, 4450660, 3592740, -9165460, -12147241, 30758946, --7871065, -2763275, 2792266, 13078175, 9492951, -20071456, -8112657, -19072876, 4220879, 1027571, --5833640, -20990042, 914828, -9836012, 4392678, 4539244, 10608569, 465467, 7733089, 36134632, -7912404, 8963060, -5644661, -2087891, 15849503, -1458141, 1281511, 4113505, 1069984, -2402497, --8228084, 14505715, -15446313, 6362994, -22980222, -7089381, -10736881, -14292041, -12178380, -111132, --25114822, -8646306, 3478387, 14307610, 8307541, -24793236, 14034879, 9229885, 10233296, -15779173, -11553462, -7452305, -17966386, -6213744, -17877264, 8650601, 21412022, 5319317, -2036351, -14055280, -11327976, -14964203, 22356916, -4217658, -2399276, -13530758, -14707042, 2118493, 17458506, 5705327, --12006044, -4909685, 2926483, -2515777, -4806069, 11412802, 5903433, -5353140, 14774151, -1219234, --20975010, 26278220, 13993003, 10817412, 4961761, -3553549, -1297080, -2201171, 7851737, 1777043, -1151588, 17295296, 6753299, 303869, 824097, 2453500, 9031779, -7246147, 5091147, 493384, -1699733, 1652489, 5815923, 2843268, 358093, 9746355, 7456063, 648003, -3411815, -3467112, --1282048, 7977365, 3990025, 4476967, 4300873, 5305895, -6602976, 6598681, -1756105, -1764158, -6112812, 9586904, -1398012, -2670933, -64425, 9124121, 10510859, 4021163, 6475200, 4962835, -16905528, 3151969, -10803453, 4893042, -3116536, 5042292, 18542984, -26087094, -11802033, -20976084, -11942157, -4229469, 2090575, -6925635, 15139760, -14873472, -14963666, -6830609, -3461744, -10712185, --18527416, -8962523, 3515968, 12185896, -17045652, 11263015, -6393059, 1348083, 22168474, 16938814, --245350, 8927090, 4318053, -3523484, -2637110, -30048128, 4205310, -3049427, 2998424, 5852967, --2324114, 819265, 30396558, -27254788, 2601140, 32886028, 4325569, 9082782, -12862890, -3521336, -17224966, 30189862, 1560684, 26773216, -10409390, 24220932, -8483097, 17928268, 18209588, -4500052, -35460324, -5897527, -1476395, -10524817, -15991774, -16969416, -7765838, -10186052, -24635932, -11508902, --5214627, 9118752, 9035537, 1156420, -12649216, -2115808, -3563749, 15857556, 4931696, -8268349, -13594645, 3058017, -1673427, -1916629, -9884330, -1522029, -3928285, 4138201, -10009421, -4786741, --6981470, -6947110, 12637941, 4879620, -4195646, 3816615, -3230352, 2414845, -7607998, 11325292, -531502, 3176128, -302258, -7637526, 6986301, -930397, 2559801, 8044474, 5567888, 3426847, -617402, -11883101, 5661304, -4558034, -565325, 10218801, -244276, 3783866, 2424509, 4879083, -6845104, -2483565, -5574868, -3677566, -4474282, 2126009, 6133750, 10519449, 6042482, -12297565, --1602560, -13472239, -11390253, -39062728, -27616102, -19650550, -1852742, 26421566, -17279190, -2256469, --13274670, -19374598, -15896211, -19792284, -20485384, -8195335, -24194624, -26494042, -22897544, 6461779, --15784005, -8344585, -19697794, 18815178, 30975304, 2633889, -3481608, -10931229, 2612414, -1969779, --736587, -2524367, 9810242, 2008971, 21146808, -18411452, 1684701, -15668041, 32101660, 7817378, --18711562, 14720464, -13389561, 11951820, -18003430, 10561325, 1623498, -10853382, 9782325, -17148730, --5645198, 5398774, 17576616, 7623567, 31142270, -6995965, -19968914, 1859184, -5650030, 2344515, --13209709, -11523397, -21316996, 2688113, -22667764, -4584878, -3490198, -19945828, 13381507, 16850768, --9747428, -1085016, -29248728, 33687040, 40939092, 6535867, -16063178, 5569499, 36034776, -16893180, --7599408, -19265612, -11152419, -21146272, 8745627, -1025960, -11857331, 9217000, -11877732, 4958540, --7367480, -3425773, 4953171, 2556579, -28454, -7930120, -1516124, 6931541, 4110821, -13216151, -10495289, -9211631, 4871567, 6024229, -4094715, -7781944, 4239670, -6297496, 5208722, 3696356, --8147553, 2991445, -1050656, 3151969, -4830228, -13332652, 3693135, 2309082, -5408975, 3426310, --4839892, 9459665, -88047, 3851512, 1150514, 12298102, 1694365, -16558173, 9373229, 6108517, -2873870, -31477278, 57612156, 21807160, -4732517, -17359184, -4849555, -18436684, 19824496, 49993956, -1082332, -33157684, -15183246, 18039936, 6702834, -6594386, 23820426, -4601521, 2988224, 13667123, --1440425, -13746580, -4483946, 11257646, -14413910, -13096966, -5323075, 4686883, 711354, -2492155, --6052683, 10608032, 1101659, 15699179, 12392591, -16169478, 7947837, 19295140, 10794327, -14943265, -5776731, 3209414, 13012677, 336081, 4537096, 3511673, 5367099, 27202176, 25743498, 15955804, -34891776, -17187386, 17987324, -20707648, 13220983, -228707, 12082817, 15152108, 4886062, 3941169, -18397492, 8551817, -4896263, 11678016, 71941, 15663746, -16608639, -9497783, 1450625, 37759740, --26046830, 2519535, -32753420, -3892851, 3810173, 12905303, -15931644, -3151969, -16419123, 4250407, -20267414, -12424804, -29283624, -6246493, -2870649, -7959112, 7123740, 5091147, -8279087, 2923262, --7080791, -6940131, 6582575, -1060857, -3941706, -13243532, 7197292, -576063, -8368744, -6726456, -6269042, 17814988, 1743757, -5129802, -2357400, 6478958, 16019154, 3178813, 1402844, 13323525, --377957, 3613678, -1231582, -2642479, -602369, 4820027, 7589207, 4535486, -2134062, -2850785, -6762963, 4793184, -10033580, 9525164, 2592013, 18525268, -4606890, 4690641, 11173894, -7674570, --4686346, 6270653, -10528575, 48233020, 3953518, 3496104, -10618770, -6762426, 7975755, 7368554, -4398047, 18611168, 7754564, -7845832, 9827959, 19858318, -832150, 21771190, -2155537, 10574209, --22204980, 40162776, -6026376, -4704063, 6685117, -30396020, -7873212, -14632417, 21369072, 11771968, -12073690, -14198088, 5115843, 5128728, -18963892, 5246840, 16124381, 13764296, 4675609, -4677220, -1879048, -9102646, 30465276, 4620311, 13735305, 11253351, 16406775, -27169964, -2236604, -8182450, -4999879, -10080288, -11982422, 22514756, -21532282, 16502875, -13694503, 17372606, -3991635, -18184354, --1810866, -27328876, 16844862, 15691126, 18903762, -56528748, 16218333, 10217727, -17470316, -11629698, --16250009, 29136522, -41735272, 25012816, 58469536, 1130113, -28052042, -11192685, 16899622, 34391412, -9402757, -11716671, -25287694, -42323680, -3500935, -216896, 16736951, -12645994, -5797132, -9681930, -28951838, 1901597, -915902, -8278013, 5975374, 1713692, -89121, 1196685, -373662, 5501853, -18453864, 22672596, 11884711, -3308199, -1869385, 9062918, 2237678, -5502927, 2642479, -8898098, --5453535, -10854456, -15947750, -33374044, -13254269, 5258114, 1626182, 18946174, -13401909, -9406515, -24139326, 9099425, -6262063, -9815611, 7864085, -2285996, -9200894, 24041080, 2816962, -960462, --7470559, 882616, -9490267, -12644921, 7949448, -27215060, 3782256, -16236587, 24575266, 2248416, -6480569, -13654238, 10722386, -3469797, -10337449, 5177583, -10627360, -5588290, -9061307, -21664888, --13099113, 16757352, 13184476, 10899553, 11181410, -26302916, -8094403, 5761699, -8234526, 16186658, -10759967, 1423782, 9143449, 27135604, -8334384, -26908506, 51730732, -22305912, -29455960, 32679332, --15944529, -8760660, 6866042, 16977468, -19724638, -5664525, 1662152, -12324946, 67472864, -162135, --11395622, -3851512, 300111, 17307644, -33502892, -24810952, -14467597, -12840342, -1442035, -28156732, --343597, -2076617, 10231149, 43402256, 43061880, -16310675, 33223720, -32380296, -29569240, 18216566, -26844620, -8764418, 7233799, 3996467, 18318572, 23594940, -228707, 2083596, 30043296, -26508002, --54018876, -5398237, -21676700, 12555263, 25074020, -1897839, -17231946, 35112432, 9992778, 7572564, --9558450, -27692338, -16120623, 3703336, -12505871, 16914654, -1694902, -9519258, -1689533, -10849624, --12067784, 16826608, -5416491, 7212861, -12068858, 17891224, -1715303, -311922, 10808285, 17202418, --2026688, -2694018, -11503533, 2209224, -9919227, -8081518, -7047505, -2089502, -17146046, 785442, --7911330, -2083059, -17190606, 5753109, 19400904, 8291435, -12178917, -23974508, -2040110, -1359357, -13173202, -32568200, -7057705, 8757438, -7013682, 16499117, -438087, 10397579, 2518462, -19599010, -21180632, 201863, 12978317, -13397077, -20365662, 18910742, -20161114, 6187438, -4580046, 17765058, -179315, 3833795, -10668699, 3317325, -7508677, -26492432, -20716774, 8726300, -1513976, -833224, -4443681, 19500762, -8678518, -6172405, -16376710, 6948184, 6207839, -2220498, -3101503, -44423384, -2193118, 12230993, -15643345, 10795400, -24330452, -4833449, 1805497, 15094126, 19573240, 2093797, --9054328, 5899138, 35108672, 30196842, 30501248, -1659468, -2576981, 6176700, 3840238, -14233522, -9218610, 37997040, -27110908, -9225053, -7712151, -267362, 1656784, 4615479, -20109036, -31341450, --11434277, -2232309, 62594852, 31322660, 21386252, -3323768, -5261335, -16312823, 27333708, 3519726, -17565342, -6843494, -8227010, -13025025, -10945724, -46555300, -20242718, -24780350, 19317690, -2243584, --8813273, -1910724, -18751828, -9317932, 20226074, 29706678, -4539781, 26137560, 14502494, 10679973, -1774358, 12138651, 16085189, 12934294, -3240553, -1316408, 344671, 17661442, -14231911, -18988588, --8830990, 9468792, -1606855, -13502840, -8361765, -13526999, 7807714, -3437048, 16611323, 32425930, -6277095, 19810536, 26475252, 12366285, 16454557, 7762080, 5277978, 6805376, -12002286, 16895864, --14248017, -10087268, 3891240, 1001801, -10158135, 4771709, 9457518, 16968878, 7171522, -20476794, -11037529, 7961259, 2189897, 8829379, -5383205, -42719892, 24018530, 20854750, -1084479, 34332356, -15537044, -23579908, -23095650, 9953587, -9451076, -21053392, 1416266, 1958505, 9441412, -5336497, -12301860, -3168612, 11650636, 14671071, -13604846, -55350856, 29714732, -8471823, -17242684, 12446815, -19648938, 559420, -37033892, -4993437, -1440962, -38301444, -23766202, 19975892, -5749888, -15640660, --13062069, 8505646, -37092412, -26496726, 50256488, -4404489, -29055990, 11282879, 27336930, 11565273, --41184440, 58851252, 23922968, -36483600, 20282984, 26536456, 4333622, -24750286, 25638808, 28427852, -17439714, -22821308, 21521008, 39871256, 2231773, 40279276, 50058380, -26874684, -15874736, -18751828, -47301548, 29959008, -20441896, 11402064, -12333535, -30172146, 25936770, 58773408, 8567923, -17822504, --14730127, 35265976, -3246459, -39717712, -28292560, 7096360, -1413044, 32693828, -5793911, 25233470, --49174156, -7647726, 2022393, 8358007, -10197326, 10356777, -413927, 922344, 5694590, 1312649, --12818330, 3823058, -6078453, 7863548, 3156801, -17997524, 15712064, 5037997, -14893336, -10726681, -2876018, -13006772, 2565169, 11774116, 13041668, 1791001, -12210592, -4032438, 4038880, -16822314, -9803800, 12361453, 4044786, 983011, 12412992, 4494684, -5578626, 6005975, -4500589, 992674, --8577587, 5363878, 19854560, 34739844, 55672976, 22512072, -23155780, -8467528, -19429896, 11911555, --9473624, 15336791, 10051297, -25540560, 12978854, -26025354, -8817568, 256087, -9627169, 1516660, -13573170, 10696616, 720481, -20732344, 4658966, 16755204, -6348499, 2543158, -7551090, -24252606, -24583856, -14623827, 17019882, -24975234, -14777909, -3466039, -20574504, -6045704, 20886426, -20310900, -27540940, 1854889, 22461068, 8934069, -11188927, -30059402, 24715926, 15397458, 10295037, 6415608, -25484188, -18805514, -9591736, -10850698, 7971460, 9640054, -2490007, -23710366, -1068373, -3207267, --24013700, -9445707, 3810710, 6589017, 18974628, -2170569, -16862578, 22600654, -4318053, -3810173, -27097486, 12979928, -22188338, 7305203, -13586055, 8732205, -7107634, 10712722, -19154480, 10853919, --6618545, 21368536, 3683471, 8286066, -7169911, 82141, -15532212, 6375342, 1051730, 842350, --364535, 4609037, -6233608, -5679558, -711354, 2682207, -1701881, 4250944, -7877507, -1354525, -6124087, -1296006, -242666, -1099512, 206158, 553514, -12451647, 2561411, 10075993, 402653, --1409823, -2488397, -1176284, -9071508, 722628, -2099702, -1098975, -4595615, -7609609, -1486596, -7577396, -4099010, -2242510, 3772055, 1657857, 6012954, -5660230, -1935957, -794569, -4277251, --6615860, -41258528, -48598092, -26026964, 144189568, 126756296, 76713488, 168197360, -35840964, -126346128, --44422308, -238212304, -124871880, -2457258, -61648888, 85207856, 156161792, 21930640, 91764120, 178922432, -30035244, 62448824, 5979668, -183727968, -153493536, -135514816, -149296816, -90467584, 74131672, 31441844, -74226160, 193390032, 116533200, 30236570, 143471776, 65557844, -87885768, 47815872, -64135672, -168209168, --20748988, -103965592, -191249520, -86223616, -19843286, -100211248, 111897320, 120471688, 57008712, 191822368, -216646736, 82292112, 107134200, 101164736, -112692960, -73342472, -144118704, -225082592, -207087216, -132682280, --133310416, -38168300, 86586544, 112165216, 149781072, 211168512, 189587904, 110932024, 80908056, 14693620, --87850336, -127601328, -93598608, -121483688, -150190704, -50711216, -56702696, -27418534, 93711888, 65073588, -69247760, 145929024, 37215892, -6254010, 24070070, -40108016, -63005024, -34879968, -63667520, -18914500, -40859636, 15763067, 22525492, 51873540, -12111271, 11030013, 28192166, -47307456, -4731444, 60054916, --56549152, 5197984, 9531069, -112512040, -5695127, -1864016, -134712192, 11098195, 47505560, -16942036, -138870256, 126500208, 23171886, 135353216, 66657892, -5469641, 22497038, -35960688, -145471072, -151259616, --187569280, -213129696, -107540616, -16962436, 43333000, 134529120, 222994704, 256076688, 203566960, 151034672, -69009920, -27580670, -84715544, -186134224, -233558176, -171529712, -137841072, -130813968, 8683887, 65208340, -79403208, 130254544, 116043576, 76997488, 75474384, 54920284, 17861696, 22657564, 560493, -39524436, --45617384, -57357676, -73910480, -64209224, -43142408, -24988120, -2066953, 14066018, 8092256, 5173288, -249645, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +15737834, 6034966, 3824132, 1245541, -3338263, 45634, 3016678, 5682779, 75699, 554588, +329639, -2076080, 550293, 1931662, -391379, 1886564, 2901251, 3874597, 1621887, 1592896, +2035278, 1813550, -3562675, 3613141, 6772090, -3209414, 1919850, 1068910, 1884954, 354335, +4005594, -2609193, -940598, -2347737, 2306934, 6725919, -1142461, 3266323, -101469, -1513976, +-5550709, 2077690, -2881923, 2558190, 1280974, 2857227, -331786, -1710471, 886911, -1176821, +3834332, 501974, -3064996, 3911105, -871878, 3053722, 2335389, -118648, 2240362, 4408247, +-1258425, -1538672, -1269700, 2195802, -1821066, -2370822, 2719788, 36507, 1818382, -2929168, +4310537, 260919, -1243930, -504122, -503585, 1729261, -1647120, -2595771, 1511829, 2330020, +2178085, -2058363, -3105261, 1242319, -134755, -364535, -1213865, -1123134, 1514513, -399969, +-255014, -952946, -1161252, 226560, -843961, 353261, 207769, 1143535, 762357, -338229, +377957, 651761, -721555, -285078, 10201, -312996, -561030, 397821, 1071594, 633508, +791348, 16106, 12225624, 9594420, 4808753, 707059, -1816771, 5563594, -3260417, -3485903, +-812286, -6094559, 3677029, 255551, -2541547, 1453310, 3533148, 6098317, -2836826, 3521873, +7898982, -2247342, 41339, 1823751, 4098473, -1024887, 4466229, 3184182, 4518306, 1057099, +3446711, -3510062, 6026913, -707596, 5814312, 2906619, -659814, 740882, -983548, -118112, +-2126546, -978179, -2623151, -1902134, 2013266, -528818, -5667746, -1249299, 577136, -139050, +-3172907, -3236258, -1675037, -1388885, 4393752, -1749125, -4874788, -6460168, -7158100, -2441689, +-3167002, -236760, 1074279, 3464965, -4691715, -2099702, 519691, -453119, -2117956, 538482, +-4937602, -444529, -5814849, 3111704, -3179350, -1516660, 3984119, -565325, 2725694, 813896, +973884, 3126736, 745177, -2483028, -1176821, 266825, -2471217, 1316944, 2453500, 1224603, +-1942936, 1454383, 2046552, 423591, 1094680, -592706, -1155346, -768262, -1155346, 817118, +-148176, 750546, -970663, -679679, 766115, 6478958, -14046691, -3777961, -7113540, -1328219, +1611, 7731478, -3757023, -12601434, -4430796, -327491, 4803384, 1489817, -4664872, -10940892, +-2805688, 2991982, -1217086, 6154152, 251256, 2694018, -599148, -4858145, -5270462, 3178276, +3894462, 451508, 1272384, -195958, 2386928, 548145, -6483253, 343597, 9163850, 1229971, +-2258079, -845572, -2414309, 559956, -2079838, -3975529, 6142877, -1904281, -2532420, 5560909, +-2889439, -4934381, 246424, 34897, 181462, -7116761, 5809480, -2203318, -115427, 5342940, +4879083, -7629473, -1912334, 1482301, 1877975, -670552, 4206921, 1158031, 2102923, 2905009, +460098, 2323041, 3530463, 770410, 48855, 3275450, -8679055, -1920387, 248571, 4445828, +2491618, -1063004, -849867, 3236258, 3037079, -3462818, -463856, -1226750, 139050, 1919850, +2465311, 496606, 3039226, -292595, -2120103, -1007170, 277025, 235149, 321586, -797790, +2129767, -417686, 789737, -306553, -915365, 629750, 9127, -402116, -742493, 187368, +-695785, -106837, -1278827, -1003412, 311922, -185220, -990527, -2017561, -703301, 460635, +1762010, -27909772, -11086384, -5578626, -7984881, 2561948, -2791729, -2610803, -379031, 3599183, +-3250753, -3754875, -5600638, 1182727, 4944581, 1181116, -3853660, -4662724, 1367947, 4231617, +3809099, -5309654, -7968775, 667331, -7452842, 4018479, -93416, 2825552, -252866, 2728915, +-2959769, -1154809, 7705172, -9306120, 4270808, 2258079, 1005559, -3255048, 2028835, 4689568, +1188095, -5641440, 1109175, -3552475, 2750927, -7726110, -338766, -6992207, 5395553, -504659, +-1444183, -1932735, 2951716, -11782706, 5425618, -3345243, -7219303, 2943663, 5733782, 6605123, +3808562, 1469416, -504122, 852014, -632434, 4290673, -2443837, 1270774, 3277060, 8240432, +1264331, 239981, -5899675, 3817152, -2951180, 747324, 128312, 4424890, -3889630, 307627, +3956739, -273804, -4769025, -6439767, 5357435, 535260, 978179, 2801393, -592706, 1406065, +1131187, 44023, 942208, -370978, 132070, 1532767, 1312113, 1512365, -2396592, 1017370, +-1806571, -685047, -1526324, 1487132, -1727651, -15913928, 7796977, 12402255, 2424509, 967978, +6912750, 2316598, 2122788, 3760781, 530428, 3935264, 3983045, -3218004, -576599, 524523, +-3889630, -2432562, -39192, 1904818, -2289755, 12896176, 6870874, -1898376, 934692, 4085051, +5173288, 5878200, -2456185, 4134980, 4843650, 257161, 1420560, 1378148, 2762738, 1979980, +1224603, 2713883, 2616709, -5601174, -4307316, -8615704, 940598, -3061775, -4289599, 4409321, +-1248225, 2770254, -10645613, 11718818, -842350, -5595269, -1026497, 9286793, 6740951, -1497870, +250182, 4489315, -2132988, 1922535, -3420942, -7337952, 871342, 670552, -5876589, -2342905, +-5792837, 1021665, 2152316, 1297617, -2812130, -5141076, -7805566, -9323837, -6686727, -2622615, +542777, -2278480, 914291, 3078955, 2751464, -3883187, -408559, -4233764, 1547262, -1483911, +1218697, -68719, -1717987, 1220845, 1415729, -1254667, -580357, -1629940, 2187749, -2599529, +569083, 817118, 772557, -273804, -596464, 541166, 1165547, 1147830, 955093, 717796, +983548, 310311, 1865626, -438624, 2066953, -1295470, 657130, -392453, -523449, -1489817, +-1139240, -994285, -1335198, 519691, -1071058, -153008, 987306, 318901, 29315300, 7773891, +2174327, -1086627, 17668958, 2073932, 8395050, 1733019, 5583458, 9203578, 3246995, -5108327, +5429913, 6326487, 996969, -461709, 1348620, 11580842, 799938, -3957812, -7044820, -2068564, +-216896, -8044474, 1344862, 2386928, 4611185, 1966558, 3252901, 8869107, -2776160, -1411434, +5442798, -854162, -2411087, -462246, -7940858, 5128191, 3351685, 178778, 5094905, -2554969, +-6957310, -15022185, -5509370, 5541582, 6120866, 187368, 4292283, -4248797, -4618701, 12211666, +-7083475, 5529234, -6239514, 1291711, -9090835, -9541270, 10331007, -3962644, -3733400, 14259291, +1060857, -1616518, -6719477, 5217849, 8228084, 387084, -4458713, -8422968, -1336809, 6092948, +-1973538, 2052458, -3732864, 2988760, -1433445, 952409, 6490770, -7047505, 2175401, -2012729, +412317, 783295, -833224, 7496329, 2329483, 1078037, -2262911, 46708, -1800128, 3138547, +-1566053, 2480881, 2490007, -2677912, -19864, -459562, -1751273, 3537979, 562641, 1633161, +92879, -1303523, 681289, -27380, 19864, 978716, 1537598, 544387, 2029372, 606664, +-210990, 1118302, 738734, -860604, 195421, -402653, 396211, 1801202, 1999307, 277025, +-252866, 14890115, 5004711, 12335146, -7537131, 2456721, 6964290, -9446781, -3172907, -3701725, +1033477, -4782446, -2851858, 7305203, -2173254, -1396938, -463320, 9146133, -3291019, -4265440, +9844065, 1567126, -6863358, 2901251, -1459215, 1547799, 3758097, -5631239, -1236414, -4236985, +-7509751, 900869, 250719, 1417876, -7387881, -7779260, 3062312, -695785, 2982318, -337692, +4310537, 1225139, -134218, -4980552, -4738423, 1301912, 4841502, 2294050, -1337346, 14015552, +3395709, 2370822, 6444599, 2330020, 4808216, 4799089, 3222836, 1905892, 2484102, -2077154, +-1049046, 1030255, -5901822, 1537598, -9548249, 2583960, -6301254, 4937602, -3519189, 2692945, +-1184874, -4701379, 1624035, -1275068, 5070209, -4411469, 13469017, 11260331, 5272073, -9710921, +3092377, 4250944, -4072166, 1739462, 1249836, 6531035, 6305549, 2574296, -88047, -947040, +-1291711, -3872450, 5879274, -493384, -652298, -37044, -1624035, 579821, 1995012, -1658931, +3085934, -1213328, -2449742, -2674154, -44023, 1726040, 1782411, -541166, -577673, -2127083, +-844498, 1025960, -2433099, 2699924, 2904472, -1884417, 558346, -2368675, -714575, 320512, +975494, -1824287, 3074123, -18502720, -35604204, -1518271, -7135552, 6176700, -1835562, -9856413, +-955630, -7981123, -8804146, -7545184, 11644193, 6047851, -7776575, -4468377, 8862665, 5135171, +7909719, -5437966, 5116380, -4822175, -4873714, -1497870, -2128156, -15052250, 4116189, 8608188, +3706020, -8944269, -2054605, 1597728, 2297808, -7976291, -1775969, -11451457, 2534031, -5421860, +-503048, -3980361, 2199023, 12281459, -1315871, -2262911, 6153615, 8984535, -5416491, 2465311, +3397856, -7542500, 4059818, 3796751, -8871792, 1419487, 5758478, -1333587, -9341017, -5867999, +-6020471, 8521215, 3305514, 8346195, -4907000, -9582072, 2295660, 4826470, -2027225, -6847789, +4591320, 6758668, 6393059, -7853348, -4080756, -1599875, 12769475, -2668249, 7632157, 2280628, +-8947491, -7264401, -1371168, 5050345, -8475581, -454193, -1554778, 4727149, -994285, 10594611, +1350767, -2358474, -3117610, -2613488, -3005403, -1909650, -996432, 1031329, 9127, -1174137, +-3827890, -307627, -3719979, -1575716, 1582696, -1242856, 652835, -1017907, -2799782, 1791538, +-417149, 4593468, -836445, -3585224, -2534568, 1525250, -643708, 250182, -977105, -2267743, +850940, 2624762, -2200097, -612033, 3499325, 1698123, -2076080, 2858838, -18214420, -17180, +504122, 10504416, 2544231, -4188130, 6212134, -2985002, 2717641, -9865003, -2905009, -6248641, +-3470871, -12473122, -4738960, -7446400, 17204028, 9895068, 10484015, -12234751, -10484552, -5007932, +5859946, -551903, -144418, 366683, 3515431, -824097, 4991826, -7112466, -6127308, -103616, +-1748589, -8776229, -8858907, -7058779, -5140539, -3799436, -3536906, -11121281, 5096516, 13673565, +-2977486, 6422050, 8759586, -6405407, 7578470, 4835597, 1788854, 12491912, -614717, 10467372, +3855270, 1379221, -9822590, 3964255, 4820027, -2538863, 14338748, 11496017, 2208150, -4217658, +-7183870, 4202089, -7063074, 2907156, -166967, 8555038, -48855, -12590697, 882616, -4919885, +-2046015, -9414568, 11052561, 5821828, 3985193, 2710661, 12337830, -3485903, -12999792, -1954210, +8115341, 303869, -6715718, -1638530, 888521, -2804614, 1540283, 4005057, -80531, 208843, +-877247, 1359894, -260382, 4809290, 1395328, 1495186, -1160715, 1916092, 2444910, 4376572, +-3651259, 2463164, 2428267, 59056, 726386, 4408784, 2334852, 1209570, -2678986, 3761318, +-1135482, -2037425, -2537789, -70867, -6501507, 4165582, 2011655, 832687, -3110093, 3685082, +3536906, 6477885, 3926674, 1182190, 1045825, 424128, 5235029, -16489453, 7431367, 5449240, +7049652, -7704635, -13674102, 3952444, 4100083, 675921, -11532524, 11011222, 3155190, -5894306, +-10158135, 4568235, -4498442, 17633526, 20541754, 3019362, -3299072, -7685307, 11659762, -13298292, +-4764730, 16371342, 4064650, -3207267, -8875550, -8189429, -4630512, 267899, -10852845, 2420214, +11537356, -1494649, 4326106, -8491150, -7745437, -2647847, -6406481, 16757889, -6175626, 7509751, +6185290, 6782827, 1782948, 3316789, -11655467, -11703786, -11207717, -2527588, 8383240, 19320374, +-7814693, -14015015, -3248606, -6477348, 3564286, 2967286, 10758893, -6620155, -155693, -8760660, +-1679332, 15462419, -1999307, -8479876, 11072426, 3595425, 1775432, 5784247, -12455405, 1859184, +-4230006, 1161789, 5674726, 13585518, 3793530, -15880105, 5770826, 1342177, -2474975, -6645388, +290984, -1734093, -883153, -473520, 2217814, 3602404, 4370666, 1405528, 281320, -2606508, +810675, -844498, 3132642, -5428302, 1993939, 2038499, -133681, 418759, 884226, -4125316, +-127775, -2757369, 4414690, 4057134, 1004486, 4882841, -1949378, 621697, 3753265, -859530, +2969970, 668941, 2747705, 863825, -6274411, -452045, -2256469, -426276, 828392, 295816, +-2226941, 136365, -2619930, -76236, -1286343, 26761404, -11611981, -9166534, -2755759, 5607080, +-15641197, 6234682, -4198331, 7872675, -7003481, -3251827, 9754944, 7164006, 2776160, -4941360, +-1745367, 13261248, 13120588, -2770791, 11458436, -3370476, 16835198, -7912941, -4108136, 2962454, +17632988, 12808129, 4276714, -9497783, -644245, -19621558, -2940979, 2996814, 9012452, 10423886, +18575196, 4801237, -328565, -962610, -7116761, -12267500, -868657, -10650445, 7659001, 2331094, +11838540, 6516003, -4039417, 11658689, -13965086, 6241125, -3114925, 937377, -2430415, 14856292, +8747238, 4198331, 2658048, -27180164, -4318590, 15996606, 8108362, 919123, -512712, 736587, +12952011, 5420249, -20508468, -6766184, -7922067, 1838783, 426276, -20446192, 780073, -19118510, +-12640626, -1734093, -8200703, -8948564, 11880416, 14943265, -1635846, -7383586, -823023, 4533338, +-1862942, 3856344, 6132140, -577673, 6814503, 9929964, -3219615, -5655398, 908922, -2457795, +3012920, 1893544, -1595044, -1476932, 115964, 71404, 2813204, -383326, -3459596, 624918, +3394098, 1190780, 3014530, -2709051, 4579509, -76236, -1702955, 1054951, -2916820, 1091459, +-5834176, -3803731, -4567161, 2280091, 213138, -4400731, -872415, 3635690, 2429878, 3146064, +-2139431, 1701344, 26844, -788127, -5575405, -2929705, -5909875, 9710384, 18914500, -4787815, +-7692824, 1058710, 7319161, 4167192, -11563663, -754841, -9367324, -549756, -12751221, -1444183, +-10958609, 465467, 11362336, 841814, 25077240, -10576357, -5024038, -9001178, 10247792, 16641388, +-13345537, -4534949, -20709258, 3838627, -140660, 5605469, 5146445, -11677479, -6849936, 9007620, +-3358665, -2631741, -11241540, 22687090, -2988224, -24419574, 6903086, -6484327, -7177427, 8695161, +6887517, -7106024, -7690139, -2422899, -14002667, -8526047, 4770635, 3080565, 4976257, -4361540, +-10088341, -11877195, -11747272, 9704479, -17292076, 203474, 4305168, -5439576, 573915, -185757, +-2236604, -13880797, -2427730, -5686537, 8918500, 11165304, -1950452, 17398912, -858457, -255014, +-5217312, -1192390, 25271050, 2359011, -11203959, -4609574, 9917079, 7201587, -13805636, 205085, +2135136, -9538049, 8032126, 1773822, 8973797, 1286880, 1488743, 1276679, 834834, 3772055, +5461051, 392453, 2808909, 8469139, 811212, -3133716, 1635309, 4022237, -3102040, -1013612, +634581, -4100620, 3861176, 3342558, 4439923, 757525, -4511327, 983548, -1447404, 679142, +-830002, -956167, 559956, -2711198, 3864934, -2019172, -2416993, -3214783, 7661148, -24696, +-7991861, 5850819, 4812511, 1913945, -382252, 4450660, 3592740, -9165460, -12147241, 30758946, +-7871065, -2763275, 2792266, 13078175, 9492951, -20071456, -8112657, -19072876, 4220879, 1027571, +-5833640, -20990042, 914828, -9836012, 4392678, 4539244, 10608569, 465467, 7733089, 36134632, +7912404, 8963060, -5644661, -2087891, 15849503, -1458141, 1281511, 4113505, 1069984, -2402497, +-8228084, 14505715, -15446313, 6362994, -22980222, -7089381, -10736881, -14292041, -12178380, -111132, +-25114822, -8646306, 3478387, 14307610, 8307541, -24793236, 14034879, 9229885, 10233296, -15779173, +11553462, -7452305, -17966386, -6213744, -17877264, 8650601, 21412022, 5319317, -2036351, -14055280, +11327976, -14964203, 22356916, -4217658, -2399276, -13530758, -14707042, 2118493, 17458506, 5705327, +-12006044, -4909685, 2926483, -2515777, -4806069, 11412802, 5903433, -5353140, 14774151, -1219234, +-20975010, 26278220, 13993003, 10817412, 4961761, -3553549, -1297080, -2201171, 7851737, 1777043, +1151588, 17295296, 6753299, 303869, 824097, 2453500, 9031779, -7246147, 5091147, 493384, +1699733, 1652489, 5815923, 2843268, 358093, 9746355, 7456063, 648003, -3411815, -3467112, +-1282048, 7977365, 3990025, 4476967, 4300873, 5305895, -6602976, 6598681, -1756105, -1764158, +6112812, 9586904, -1398012, -2670933, -64425, 9124121, 10510859, 4021163, 6475200, 4962835, +16905528, 3151969, -10803453, 4893042, -3116536, 5042292, 18542984, -26087094, -11802033, -20976084, +11942157, -4229469, 2090575, -6925635, 15139760, -14873472, -14963666, -6830609, -3461744, -10712185, +-18527416, -8962523, 3515968, 12185896, -17045652, 11263015, -6393059, 1348083, 22168474, 16938814, +-245350, 8927090, 4318053, -3523484, -2637110, -30048128, 4205310, -3049427, 2998424, 5852967, +-2324114, 819265, 30396558, -27254788, 2601140, 32886028, 4325569, 9082782, -12862890, -3521336, +17224966, 30189862, 1560684, 26773216, -10409390, 24220932, -8483097, 17928268, 18209588, -4500052, +35460324, -5897527, -1476395, -10524817, -15991774, -16969416, -7765838, -10186052, -24635932, -11508902, +-5214627, 9118752, 9035537, 1156420, -12649216, -2115808, -3563749, 15857556, 4931696, -8268349, +13594645, 3058017, -1673427, -1916629, -9884330, -1522029, -3928285, 4138201, -10009421, -4786741, +-6981470, -6947110, 12637941, 4879620, -4195646, 3816615, -3230352, 2414845, -7607998, 11325292, +531502, 3176128, -302258, -7637526, 6986301, -930397, 2559801, 8044474, 5567888, 3426847, +617402, -11883101, 5661304, -4558034, -565325, 10218801, -244276, 3783866, 2424509, 4879083, +6845104, -2483565, -5574868, -3677566, -4474282, 2126009, 6133750, 10519449, 6042482, -12297565, +-1602560, -13472239, -11390253, -39062728, -27616102, -19650550, -1852742, 26421566, -17279190, -2256469, +-13274670, -19374598, -15896211, -19792284, -20485384, -8195335, -24194624, -26494042, -22897544, 6461779, +-15784005, -8344585, -19697794, 18815178, 30975304, 2633889, -3481608, -10931229, 2612414, -1969779, +-736587, -2524367, 9810242, 2008971, 21146808, -18411452, 1684701, -15668041, 32101660, 7817378, +-18711562, 14720464, -13389561, 11951820, -18003430, 10561325, 1623498, -10853382, 9782325, -17148730, +-5645198, 5398774, 17576616, 7623567, 31142270, -6995965, -19968914, 1859184, -5650030, 2344515, +-13209709, -11523397, -21316996, 2688113, -22667764, -4584878, -3490198, -19945828, 13381507, 16850768, +-9747428, -1085016, -29248728, 33687040, 40939092, 6535867, -16063178, 5569499, 36034776, -16893180, +-7599408, -19265612, -11152419, -21146272, 8745627, -1025960, -11857331, 9217000, -11877732, 4958540, +-7367480, -3425773, 4953171, 2556579, -28454, -7930120, -1516124, 6931541, 4110821, -13216151, +10495289, -9211631, 4871567, 6024229, -4094715, -7781944, 4239670, -6297496, 5208722, 3696356, +-8147553, 2991445, -1050656, 3151969, -4830228, -13332652, 3693135, 2309082, -5408975, 3426310, +-4839892, 9459665, -88047, 3851512, 1150514, 12298102, 1694365, -16558173, 9373229, 6108517, +2873870, -31477278, 57612156, 21807160, -4732517, -17359184, -4849555, -18436684, 19824496, 49993956, +1082332, -33157684, -15183246, 18039936, 6702834, -6594386, 23820426, -4601521, 2988224, 13667123, +-1440425, -13746580, -4483946, 11257646, -14413910, -13096966, -5323075, 4686883, 711354, -2492155, +-6052683, 10608032, 1101659, 15699179, 12392591, -16169478, 7947837, 19295140, 10794327, -14943265, +5776731, 3209414, 13012677, 336081, 4537096, 3511673, 5367099, 27202176, 25743498, 15955804, +34891776, -17187386, 17987324, -20707648, 13220983, -228707, 12082817, 15152108, 4886062, 3941169, +18397492, 8551817, -4896263, 11678016, 71941, 15663746, -16608639, -9497783, 1450625, 37759740, +-26046830, 2519535, -32753420, -3892851, 3810173, 12905303, -15931644, -3151969, -16419123, 4250407, +20267414, -12424804, -29283624, -6246493, -2870649, -7959112, 7123740, 5091147, -8279087, 2923262, +-7080791, -6940131, 6582575, -1060857, -3941706, -13243532, 7197292, -576063, -8368744, -6726456, +6269042, 17814988, 1743757, -5129802, -2357400, 6478958, 16019154, 3178813, 1402844, 13323525, +-377957, 3613678, -1231582, -2642479, -602369, 4820027, 7589207, 4535486, -2134062, -2850785, +6762963, 4793184, -10033580, 9525164, 2592013, 18525268, -4606890, 4690641, 11173894, -7674570, +-4686346, 6270653, -10528575, 48233020, 3953518, 3496104, -10618770, -6762426, 7975755, 7368554, +4398047, 18611168, 7754564, -7845832, 9827959, 19858318, -832150, 21771190, -2155537, 10574209, +-22204980, 40162776, -6026376, -4704063, 6685117, -30396020, -7873212, -14632417, 21369072, 11771968, +12073690, -14198088, 5115843, 5128728, -18963892, 5246840, 16124381, 13764296, 4675609, -4677220, +1879048, -9102646, 30465276, 4620311, 13735305, 11253351, 16406775, -27169964, -2236604, -8182450, +4999879, -10080288, -11982422, 22514756, -21532282, 16502875, -13694503, 17372606, -3991635, -18184354, +-1810866, -27328876, 16844862, 15691126, 18903762, -56528748, 16218333, 10217727, -17470316, -11629698, +-16250009, 29136522, -41735272, 25012816, 58469536, 1130113, -28052042, -11192685, 16899622, 34391412, +9402757, -11716671, -25287694, -42323680, -3500935, -216896, 16736951, -12645994, -5797132, -9681930, +28951838, 1901597, -915902, -8278013, 5975374, 1713692, -89121, 1196685, -373662, 5501853, +18453864, 22672596, 11884711, -3308199, -1869385, 9062918, 2237678, -5502927, 2642479, -8898098, +-5453535, -10854456, -15947750, -33374044, -13254269, 5258114, 1626182, 18946174, -13401909, -9406515, +24139326, 9099425, -6262063, -9815611, 7864085, -2285996, -9200894, 24041080, 2816962, -960462, +-7470559, 882616, -9490267, -12644921, 7949448, -27215060, 3782256, -16236587, 24575266, 2248416, +6480569, -13654238, 10722386, -3469797, -10337449, 5177583, -10627360, -5588290, -9061307, -21664888, +-13099113, 16757352, 13184476, 10899553, 11181410, -26302916, -8094403, 5761699, -8234526, 16186658, +10759967, 1423782, 9143449, 27135604, -8334384, -26908506, 51730732, -22305912, -29455960, 32679332, +-15944529, -8760660, 6866042, 16977468, -19724638, -5664525, 1662152, -12324946, 67472864, -162135, +-11395622, -3851512, 300111, 17307644, -33502892, -24810952, -14467597, -12840342, -1442035, -28156732, +-343597, -2076617, 10231149, 43402256, 43061880, -16310675, 33223720, -32380296, -29569240, 18216566, +26844620, -8764418, 7233799, 3996467, 18318572, 23594940, -228707, 2083596, 30043296, -26508002, +-54018876, -5398237, -21676700, 12555263, 25074020, -1897839, -17231946, 35112432, 9992778, 7572564, +-9558450, -27692338, -16120623, 3703336, -12505871, 16914654, -1694902, -9519258, -1689533, -10849624, +-12067784, 16826608, -5416491, 7212861, -12068858, 17891224, -1715303, -311922, 10808285, 17202418, +-2026688, -2694018, -11503533, 2209224, -9919227, -8081518, -7047505, -2089502, -17146046, 785442, +-7911330, -2083059, -17190606, 5753109, 19400904, 8291435, -12178917, -23974508, -2040110, -1359357, +13173202, -32568200, -7057705, 8757438, -7013682, 16499117, -438087, 10397579, 2518462, -19599010, +21180632, 201863, 12978317, -13397077, -20365662, 18910742, -20161114, 6187438, -4580046, 17765058, +179315, 3833795, -10668699, 3317325, -7508677, -26492432, -20716774, 8726300, -1513976, -833224, +4443681, 19500762, -8678518, -6172405, -16376710, 6948184, 6207839, -2220498, -3101503, -44423384, +2193118, 12230993, -15643345, 10795400, -24330452, -4833449, 1805497, 15094126, 19573240, 2093797, +-9054328, 5899138, 35108672, 30196842, 30501248, -1659468, -2576981, 6176700, 3840238, -14233522, +9218610, 37997040, -27110908, -9225053, -7712151, -267362, 1656784, 4615479, -20109036, -31341450, +-11434277, -2232309, 62594852, 31322660, 21386252, -3323768, -5261335, -16312823, 27333708, 3519726, +17565342, -6843494, -8227010, -13025025, -10945724, -46555300, -20242718, -24780350, 19317690, -2243584, +-8813273, -1910724, -18751828, -9317932, 20226074, 29706678, -4539781, 26137560, 14502494, 10679973, +1774358, 12138651, 16085189, 12934294, -3240553, -1316408, 344671, 17661442, -14231911, -18988588, +-8830990, 9468792, -1606855, -13502840, -8361765, -13526999, 7807714, -3437048, 16611323, 32425930, +6277095, 19810536, 26475252, 12366285, 16454557, 7762080, 5277978, 6805376, -12002286, 16895864, +-14248017, -10087268, 3891240, 1001801, -10158135, 4771709, 9457518, 16968878, 7171522, -20476794, +11037529, 7961259, 2189897, 8829379, -5383205, -42719892, 24018530, 20854750, -1084479, 34332356, +15537044, -23579908, -23095650, 9953587, -9451076, -21053392, 1416266, 1958505, 9441412, -5336497, +12301860, -3168612, 11650636, 14671071, -13604846, -55350856, 29714732, -8471823, -17242684, 12446815, +19648938, 559420, -37033892, -4993437, -1440962, -38301444, -23766202, 19975892, -5749888, -15640660, +-13062069, 8505646, -37092412, -26496726, 50256488, -4404489, -29055990, 11282879, 27336930, 11565273, +-41184440, 58851252, 23922968, -36483600, 20282984, 26536456, 4333622, -24750286, 25638808, 28427852, +17439714, -22821308, 21521008, 39871256, 2231773, 40279276, 50058380, -26874684, -15874736, -18751828, +47301548, 29959008, -20441896, 11402064, -12333535, -30172146, 25936770, 58773408, 8567923, -17822504, +-14730127, 35265976, -3246459, -39717712, -28292560, 7096360, -1413044, 32693828, -5793911, 25233470, +-49174156, -7647726, 2022393, 8358007, -10197326, 10356777, -413927, 922344, 5694590, 1312649, +-12818330, 3823058, -6078453, 7863548, 3156801, -17997524, 15712064, 5037997, -14893336, -10726681, +2876018, -13006772, 2565169, 11774116, 13041668, 1791001, -12210592, -4032438, 4038880, -16822314, +9803800, 12361453, 4044786, 983011, 12412992, 4494684, -5578626, 6005975, -4500589, 992674, +-8577587, 5363878, 19854560, 34739844, 55672976, 22512072, -23155780, -8467528, -19429896, 11911555, +-9473624, 15336791, 10051297, -25540560, 12978854, -26025354, -8817568, 256087, -9627169, 1516660, +13573170, 10696616, 720481, -20732344, 4658966, 16755204, -6348499, 2543158, -7551090, -24252606, +24583856, -14623827, 17019882, -24975234, -14777909, -3466039, -20574504, -6045704, 20886426, -20310900, +27540940, 1854889, 22461068, 8934069, -11188927, -30059402, 24715926, 15397458, 10295037, 6415608, +25484188, -18805514, -9591736, -10850698, 7971460, 9640054, -2490007, -23710366, -1068373, -3207267, +-24013700, -9445707, 3810710, 6589017, 18974628, -2170569, -16862578, 22600654, -4318053, -3810173, +27097486, 12979928, -22188338, 7305203, -13586055, 8732205, -7107634, 10712722, -19154480, 10853919, +-6618545, 21368536, 3683471, 8286066, -7169911, 82141, -15532212, 6375342, 1051730, 842350, +-364535, 4609037, -6233608, -5679558, -711354, 2682207, -1701881, 4250944, -7877507, -1354525, +6124087, -1296006, -242666, -1099512, 206158, 553514, -12451647, 2561411, 10075993, 402653, +-1409823, -2488397, -1176284, -9071508, 722628, -2099702, -1098975, -4595615, -7609609, -1486596, +7577396, -4099010, -2242510, 3772055, 1657857, 6012954, -5660230, -1935957, -794569, -4277251, +-6615860, -41258528, -48598092, -26026964, 144189568, 126756296, 76713488, 168197360, -35840964, -126346128, +-44422308, -238212304, -124871880, -2457258, -61648888, 85207856, 156161792, 21930640, 91764120, 178922432, +30035244, 62448824, 5979668, -183727968, -153493536, -135514816, -149296816, -90467584, 74131672, 31441844, +74226160, 193390032, 116533200, 30236570, 143471776, 65557844, -87885768, 47815872, -64135672, -168209168, +-20748988, -103965592, -191249520, -86223616, -19843286, -100211248, 111897320, 120471688, 57008712, 191822368, +216646736, 82292112, 107134200, 101164736, -112692960, -73342472, -144118704, -225082592, -207087216, -132682280, +-133310416, -38168300, 86586544, 112165216, 149781072, 211168512, 189587904, 110932024, 80908056, 14693620, +-87850336, -127601328, -93598608, -121483688, -150190704, -50711216, -56702696, -27418534, 93711888, 65073588, +69247760, 145929024, 37215892, -6254010, 24070070, -40108016, -63005024, -34879968, -63667520, -18914500, +40859636, 15763067, 22525492, 51873540, -12111271, 11030013, 28192166, -47307456, -4731444, 60054916, +-56549152, 5197984, 9531069, -112512040, -5695127, -1864016, -134712192, 11098195, 47505560, -16942036, +138870256, 126500208, 23171886, 135353216, 66657892, -5469641, 22497038, -35960688, -145471072, -151259616, +-187569280, -213129696, -107540616, -16962436, 43333000, 134529120, 222994704, 256076688, 203566960, 151034672, +69009920, -27580670, -84715544, -186134224, -233558176, -171529712, -137841072, -130813968, 8683887, 65208340, +79403208, 130254544, 116043576, 76997488, 75474384, 54920284, 17861696, 22657564, 560493, -39524436, +-45617384, -57357676, -73910480, -64209224, -43142408, -24988120, -2066953, 14066018, 8092256, 5173288, +249645, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -527744, -6460705, -673773, 1967632, -1189706, 8621073, -3393561, -827855, -316754, 1074279, -1533303, -3951907, -694174, -2653753, -484258, 5400385, 387621, -2724083, 2516851, 1869921, 3539053, -1460289, -2718178, -1783485, 6015639, 843961, -1557463, -1187559, -1242856, 1189706, 1269163, --773094, -7691750, -1918240, 355409, 5303211, 1879048, -653909, -37581, -3054796, 4204773, --4307852, -5748814, 744640, 39728, -1940252, -1336809, -1599875, 803696, 523449, 489089, --2006287, 4989142, 153545, 6692096, -1080721, -3213709, 1470489, -374199, 958315, 1539746, -3389803, 2288681, -868657, -1860258, -1571421, 4334696, -4434017, 154082, 122407, -797253, --3804267, 3333432, -1919850, 423591, 2907156, -2069637, -2751464, -2304787, 2947421, -292058, --925029, -840203, 91805, -573915, -1204738, 1445257, 1495186, 1075889, 676994, 354335, -2044404, 310311, -51540, 410706, -210453, 52076, -484258, -276489, -256087, 1364189, -323733, -949188, 1178969, -2560874, 2239289, 1325534, -2985002, -1663226, -217970, 265751, --140660, -456340, -1503239, 2703682, 540629, -1183800, -1572495, -93952, 5638219, -799401, --2622078, 3586298, -1380832, -3401077, -323196, 2866891, 2172717, -1868848, 530428, -2332704, -1374390, 1307281, -1085016, 2863133, -761283, -5206037, 989453, 2677375, 2537789, 339302, --358630, -3778498, -1242319, -510564, -1622424, 3383361, 4800163, 2207613, -6482717, 2188286, -7691213, 3154654, -345745, -66572, 3558381, -1761474, 1184874, -3246995, -2893197, 2950106, -3382287, 1600949, 927713, 576599, 703838, 1567126, 331786, -320512, -1124745, 787053, --2246268, -446677, -950798, -4666482, -2294050, 956167, 1759326, 1409286, 3176128, 2463164, -2643016, 3744138, -2370285, -1532767, -667331, 1176284, 1406602, 2201171, -448824, -763967, --393526, 1336272, -959925, 1207423, 332323, -531502, -388158, 385473, -203474, 727460, -331249, 99321, -287226, 392990, 397284, -184684, 624918, 129923, 172336, -513785, -128312, -160524, 34360, 767189, 110059, 312996, 310848, 4453344, -311922, 1835562, --2867965, -4285841, -2674154, 2324651, -1945083, -1992328, -2109903, -2831994, 2725694, 378494, -2000381, -887985, 590021, -5818070, -3733937, -2660732, 3729105, 703301, 831076, 2029909, --2056753, -1054951, -462783, 664109, -4403952, -860067, -2971044, -3249143, 187905, -2867965, -1921461, 1799054, 7681549, -1921461, 3906810, -2609730, 1614908, -1794760, 402116, 6706592, -1077500, 2899640, -3182034, 2036351, -2862596, -1371168, -443455, 4256313, -2106682, -1108638, --3797825, -2028835, -4484483, -613643, 4236985, 1001801, 314069, 723165, 3884261, -3841848, --6720550, 1545651, 2113661, -4398047, -324270, 578210, -1089311, 1760400, 5251672, 1088237, --1336809, 110595, -1873143, 338766, 317291, -1509681, -453656, -485868, -2126546, -507880, --1214939, 442382, -463320, -843424, 1736241, -336081, -1713692, 727460, -1221381, 48318, --1321239, -1925219, 1116155, -352187, -140123, 608275, 816044, 245350, 1779727, -848793, --149787, 297427, -641561, -274341, -202400, -887448, -465467, 1465658, 489626, 2088428, -256087, 937914, -828392, 2471754, -6861747, 1145683, -2402497, -5046050, -3655017, 2059437, --1013075, -226023, 5006858, 1671816, -700617, 446677, 4257923, -1995012, 3143379, -1417339, -938987, -4496831, -796180, 3065533, -1028108, 3805878, 4256313, 1412507, 2681670, 5586679, --1304060, -7839389, 1786170, -3481608, 245350, -9604084, 263067, 3099893, -1927367, 3602941, -510564, -3455838, 1248225, -7218767, -4626217, -1750199, -1775969, -5987722, 3043521, 3342022, -197032, 3111704, 239444, 855772, -1944547, 2823404, 2140504, -1106491, 6624987, -1229434, -5473399, 4704063, -268972, -745177, 14496, 1518808, 2236067, 731218, 2502892, 852014, -850404, 7348152, 2798171, -3182571, -1471563, -25233, -1765768, 1106491, -1277753, 7412577, -1234803, 3492882, -2655901, 3020436, -33286, -1437740, 635118, -2372970, -1559073, -390305, --1718524, -1036698, -1040993, 927176, -1612760, -355945, -1136019, -564788, -553514, 2052994, --866510, 1080721, -292058, -1707250, -288300, 1091459, 428960, 212064, 664646, -1022202, -893890, 609885, 523449, 1025423, -576599, 262530, -1691680, -96637, 1296543, 1188632, -281320, 244276, 161598, 976568, -13087302, 42950, -31675, 3358665, 5753646, 2018098, --2888366, -4784057, -756988, 6223945, -1173600, -1185948, -4604205, -106837, -1911261, 4609037, -5485747, -9402757, 6143951, 3919695, -3557307, -762894, -4922570, 31139, -1479616, 117575, -3240016, 6254010, -2339684, 1445793, -1628866, -2139431, 2329483, 4315906, 2917357, -2711198, --4443681, 3103114, 2161442, -1602560, -802085, 543850, -5729487, 2086280, 1743757, -2296734, --3828427, 1483374, -2907156, 5102958, 2253784, -8960376, 4098473, -3837553, -9860171, -2861522, --729071, 1979980, -4038343, -187905, 2186138, -4358855, -4284767, -4486094, -1363115, 1123134, -9376450, 1472637, 1791001, -2016487, -4885526, 6380711, -1925756, -7494181, 381178, -7563975, -582505, -734439, -2745021, -8286066, 2537789, 110595, -1809255, 2023467, 5038534, 2303713, --941135, -860604, -11274, 2738579, 457414, 667867, 1556389, 2666101, -217433, -1256815, --1584306, -1660542, 656593, -136365, -1287953, -1336809, 1229434, 1162326, 2351495, 482647, --37044, -143345, 890669, -420370, -22012, -383863, 1494649, -181999, 807454, -231391, -8153459, 2177012, 1771137, 3555159, 5131949, -1147830, 12534862, -1838246, 8968429, -10593000, -3641596, 6165963, -2240899, 845572, -2981781, -300648, 4827543, 8799314, -2501282, -4395362, --1296006, 4092030, 867047, 8947491, 4231617, -983548, 1279363, -81604, -4201552, 817654, --945967, -1315334, 3906810, 5130876, -8133595, 9364639, -7152731, -3900904, 1583769, -2908767, -4713190, 105764, -2726231, 6610492, 9277129, -6936372, -1261110, -692564, 2864743, -6568616, --10805601, -5051956, -3312494, 3158949, -7497939, -4339528, -884226, 7736847, 4864051, -5422933, -3850438, 2034741, -2956548, -4460324, -716723, -2752537, -3182571, 302795, -2121714, 5779416, --4401805, -935229, 4897874, -3914326, 5294084, 6324340, 851477, -677531, 544924, -7860864, --6972343, -1760400, 4356171, 166430, -3062312, 2865817, 6427419, -4316442, -2012729, 1730872, --593242, -3074660, -28454, 802622, -2970507, 136365, -827318, 1302449, 380105, 2305861, -311385, 1804423, -1176284, -508417, 73551, 186831, -134218, 1612760, 688805, 1884954, -1811403, 154619, 532039, -302258, 1229971, 1874216, -947577, 4778151, 3884261, 5219459, --5042292, -6671158, -3606699, 4531728, 204548, 18763638, -1434519, -466004, -4539244, -8487392, --12473659, -2758980, 4096325, 6591701, -4136591, -7989713, 1012539, 63888, 7976828, -2685428, --3304441, 9869835, -5409512, 635655, -7645042, 4872641, -1556389, 31139, -1723356, -11609297, --7310571, 609349, 6407018, 4297115, 492311, -12029130, 7951058, -4865661, -4991289, -5194763, --6906845, -1084479, 6502044, -5335960, -5901285, 4026532, -1951526, 2309082, 11996917, -5260261, -226023, 590021, 5074504, -3569118, -3295851, -1670742, 7610682, -1731946, -4068945, -718870, -5926518, 7737921, -7722351, -8750459, -3009162, -1302449, -2963528, 1851131, -6174016, -2177012, --5829881, -11558831, -4600447, -2676302, 1499481, -10630581, -2983392, 158377, 7479149, 219580, --6575595, -128849, -313533, -2005750, -3657165, 159988, 1508070, -695248, 1106491, 1054951, --1484448, 2159832, -934692, -2157147, 2304787, 2873333, -1286880, -2757369, -127775, -542240, -440771, 2301029, 817654, 41876, 1580011, -875636, -1428614, -1108638, -1563368, 2246805, --6123550, 5189931, 6342056, -4664335, -5645735, -4775467, 2587718, -483184, 9190693, 16004122, --8981313, 590558, -369367, -1119913, 1496259, 4627828, -13139379, 11800960, -9257265, -4588636, -11888469, -2754685, -5675263, 3932043, 4398047, 259846, -656593, -9176198, 5732708, -1314260, -1996623, -6076305, 7575786, -701153, -12641162, -13512504, 4523138, -2485176, -6966974, 3416647, --569620, 20914880, 3519726, -3834332, -6220187, -12345347, -4365835, 2387465, -2993055, 9626632, --2029372, -14377403, -1380832, 9871982, -4306242, 1286343, 8548059, 5757404, -4833449, -913754, -6925098, 9227737, -4201015, 1796370, 1331440, -4464082, 2014877, -2061584, -604517, 1366873, --2134599, -2611877, -8887898, -9747965, -8215199, 8199093, 4601521, 5337034, 2278480, 51003, -3293166, -7116761, -3908957, -9955734, 4955856, -1269700, -1353452, -2036351, -1461900, -5086852, --2990371, 1024350, -2040646, 289910, 405338, 340376, 1975148, 236223, 2365990, -274341, -1751273, -2328946, 1349694, -3484292, 317828, -1665911, 2915209, 119722, -1803886, -562104, -940598, -1511829, -1655173, -4072703, -4039954, -2275796, 4167192, 252866, 1490891, 2578054, --10722386, 4066797, -11574937, 448287, 4214437, -1872069, -8661875, -4076998, -1765768, 7756711, -6163278, -4619774, -4780299, 8271034, 3452617, -4792110, -5168457, -4034048, -545998, 7997766, --1356136, 725313, -444529, -98784, 10276783, 5092221, 6889128, -483184, -492311, 3544422, --5301601, -8944806, 7321309, 11761768, -7940858, 10111427, -2949569, -1024350, -4515621, 5210869, -340376, -5660767, 3469260, 9562208, 7504382, 3456375, -7157026, -2943663, -14513768, 2416993, -7601019, -4671851, -1138703, -5754183, 1536525, -3424700, 5674726, -3587908, 1915019, 6738267, -3875134, 12693239, 6673843, 4294968, 8153459, -6806450, 12221329, 3775276, 7446400, -2430415, --8356396, -12946642, -2418067, -2167885, -3336653, -3034395, 4869419, -8897562, 13514115, -2303176, --10842645, 6213207, 10115722, 4185446, 1349694, 2112050, 3831648, 1289564, -2176475, 2597382, --1987496, -23085, 4286378, -3221, -98784, 4638565, 725313, 2548526, -321586, -2157684, -771484, 468688, -1779727, 1458141, 1965484, 518080, -1244467, 1130113, 460635, 3598646, -869194, -636729, 2347737, -3054259, 981400, 718333, -3263102, -4873178, -1281511, -1894618, --1168768, -2404645, -1619203, -999117, -324807, 6007586, -12783433, 9402757, 3255585, -1932198, -13877576, 10739029, -17622788, -11799886, 11119670, 19087908, -1762547, 2820720, -1624571, -2404108, --1906966, -787053, 4831838, 2878702, 11536282, 2845953, 11039677, 3124052, 4804995, -1493575, --6236830, 2683818, 865973, -5085242, 8451959, 875636, 3391414, 1980517, -1745367, -7830799, -1023813, -8884677, -2997350, -10283225, -6880001, -4155381, 8650601, 1241782, 4263829, 10592463, --4574677, -878321, 1247688, 3808562, 1149978, 265751, -2968359, 7843147, 17274358, 8315057, --13746043, -9796284, -10172630, 11933567, -1807108, -11045045, 6454262, -6189048, -674847, -1804423, --767189, -848256, 378494, 10462003, 17291002, 6540699, 14892262, 9552544, 4830228, 1941325, -3752191, -4792110, 15850577, 5131949, -8315594, -11133092, 4917738, 3664144, -3051038, 7943542, -14988362, 3459059, -5788542, 9339406, -876173, -6867653, 1424319, 5237176, 850404, -909459, -593779, 2876018, 5052492, 2243584, 2237141, 574452, 3295314, -1398012, -651224, -1945620, --562641, 6914361, -3677029, 2559264, -1089848, 1649268, 162135, -1843615, 1023813, 2451353, -3003256, -1429687, 1225676, -2791192, -85362, 1389422, -5006858, 2123325, -7150047, 1994476, -17193828, 3285650, 6038187, -5516349, 4406100, -8470212, -14982993, 347355, 7969849, 2392297, -6393596, 9030706, 9903658, 591632, -10875931, -9211631, -14397804, -22244172, -419833, -2677912, -9803800, 7313793, -8383776, -4652524, 5735929, 11638825, -14595909, -9394704, -2833068, -7975755, --5469104, -2979634, 4472672, 9038222, 373662, -5487358, -6776922, 9133248, -7327214, -3069828, --251792, 12855374, -936840, 1056025, -20212116, -1522566, 4891968, 10369125, 13438953, 2905009, --13032541, 6135361, 224412, 6106370, 8447127, 1429687, 4226248, 9749039, 16994112, -11324218, --4514011, -995896, 5178120, 18124226, 7590281, 6055367, 10124312, -3487514, -6029061, -10878615, --13746580, -8132521, -572304, 8796630, 20136418, -12583180, -9290551, -1290101, 19745038, -11075647, --6473053, -9892383, -1860795, -8865886, 2797634, 1694902, 4669703, 10513006, 1901060, 6735583, --4407174, -4329864, -5638755, 456877, -2865280, -6553047, -5919002, -2866354, -1586454, -1357210, -6643241, -5000416, -1549410, -1879585, 4741107, 1208496, 3445638, -2251100, -2318209, 4786204, -1553704, 1270237, -4028143, 6166500, -3144453, -157840, -2205466, 1966558, -2285996, 649614, -4022774, 4904853, 8951786, 5057861, 12610561, -14915348, -10645076, -1661079, 21887154, 8849780, -555661, 11842835, -7371775, 17770428, -4169876, -15599321, -3020973, -15501611, 12607876, 7532836, -4950487, 4909148, 297963, -4970888, 6109054, 9084393, 4582193, -3164317, 8145943, 10880763, -9752260, -1212791, -8446590, 14743549, 3481608, -899796, -2461553, 1774358, -9605694, 9568650, --1796907, -2649458, -12246026, -6669548, -7553774, 17200270, 6147172, 187905, 2286533, 8893267, -12786655, 6521371, -16492138, 15035607, -1752347, 8700530, 3727495, 13214004, -3007014, -17277042, -5446019, -780073, 7178501, -3059091, -7042673, 6441914, -2727841, 4376035, 21794812, -2629594, --9989020, 68183, 2896419, -10545755, 17575544, -7783018, -10541997, 15498389, -8970039, 7916699, -1088774, -11188927, -7925826, -11190537, 3585761, 9429064, -5546951, 5479305, 10471130, -5750961, -7407745, -2354179, 12385612, -4330938, 3744675, 4065187, -3315178, 96100, 556198, -5537287, --643708, 5159867, -7757785, -1453846, 5852967, 3017215, 271657, -4729296, 2495913, -1217623, -2046015, -4944044, -4758287, -2645163, 1146756, 1329292, -5743445, -3570192, 5600638, 816044, -2518998, -5856725, 2857227, 631897, -2567317, 1300838, 981400, 2053531, -3032784, 362925, --1404454, -199716, -6242735, 4671314, -14404783, -3122441, 7761006, 1553168, -14087493, 3477313, --4937602, 10128607, 2518462, 5071283, -23530516, 6954626, 447213, 8893804, 15185931, 558346, --1910724, 1018444, -7648263, 15155866, -14636712, 4517232, 9269076, 6081137, 8535711, -4147328, --7053947, -8448738, -15149423, 5749888, 2309619, 8568460, 16090558, -6332930, 13797046, 7252589, --13311177, -7839926, -208306, 1186485, 707059, -389231, 6823630, 11574937, 10957535, 4362076, --27811524, 6603512, 8254391, 7953743, -18331458, 10808285, -9416179, 9339406, 1138166, 4798552, --2506114, 6929930, -2238215, 23349590, 11335492, -10873247, 1306207, -30019138, 4971425, -9066139, --9019968, 8039105, 5978595, -15246597, -29599840, 18388902, 11502996, -28090696, 10851235, -6604049, -10628433, -2655901, 2558190, 4018479, 303869, -19042812, -6976101, -3048890, 5952288, -518617, --4710506, 7523172, -9981504, -4293894, 10421738, -1251983, -875100, 3260954, 2198487, 3724811, -1899986, -5937256, 2349347, -8704825, 5224291, -4019016, 3007014, 1842004, -2165737, -1644436, --1447404, -3344169, 1589138, -5171141, -701690, -4442607, -2937221, -7081864, 3510599, -2389613, --1701881, -4247723, 1855426, 2935610, 2297271, 1402844, 746787, 576599, 2627446, -581431, -2847027, 1879585, 6504728, -3843996, -3449396, -6016176, 10919954, -8339753, 92342, 1622424, -28033788, -3811247, 20246476, 4985920, 15248745, 969052, 4363687, 4951561, 27030376, 27078158, --13978508, -12780212, 15475304, -19614042, 24159, 5306432, -19547470, 11137924, 1584306, -1560147, --3543348, -5959804, 2371359, 2110440, 3680787, -12015171, 113280, -2930778, -15786689, 8064875, -11023034, -17653390, -13128104, -6453725, 9536438, 9248675, 8868034, -951335, -3564286, 8304320, -28147606, 15166066, -5521718, -3663607, -3817689, 18992346, -15170361, 7017440, 4042101, -23685134, --9800578, -1064615, 3240553, -20074678, 13843753, 9006010, 4045322, 3823595, 9605157, -19010598, --2289218, -15768972, 714038, 9791452, 16480326, 10140955, -10407243, -5537824, -817118, 555125, --11959336, 26775900, -2119566, 3567507, -6306623, 9188009, -2032593, 5375689, -2421288, 3344169, -2522220, 5831492, -679142, 105764, -2182917, 1389422, -415001, -1499481, 7894687, -2348273, --5829345, -327491, -657130, 4049081, -5943161, 1365263, -4931160, -7715909, 4760971, -1422708, --5289252, 442382, -115427, 930934, -4660040, 6186901, 1586454, 7594576, -9385040, -631360, -4375498, -2345052, -7627325, -120259, 8175470, 3722126, -2525441, 12914430, 20024748, -1394791, -1302449, -12402792, 1042066, -546535, -8865886, -14810658, -2843268, -6857989, -11098732, -8113730, -12550431, -10638634, 9101573, -3206730, -2540473, 17577154, -12169790, -6789807, 2684892, 7090454, -1030792, -23255100, -14295799, 2660195, -3752728, 3772592, -3260954, -7299297, 14817637, 3175592, --1289027, -6089190, -33454038, 20084340, -6062347, -364535, -2860448, 1278827, 9573482, -5570036, --9139154, -15608985, -1487132, 6892349, -9651865, -12367895, 5083631, 19638202, -3350611, 18263812, -13430363, -13368086, 24570972, 16254841, -16232292, -25052544, -7223062, -10917807, 1324461, -7937637, --1964948, 12001212, -20966420, 10262824, -3422552, -11769821, -13164075, -13129715, -15930034, 3317325, -9533754, -8547522, 13630616, -1773822, -7983271, -16409459, 250719, -1837709, 6328635, 19588272, --7099044, -14838038, -5196374, 434865, 5019743, 13406740, 3509525, -1657321, -11001022, -79994, -395137, 4989679, 2058900, 31139, 3688840, 5495948, -4131759, 6860674, -3966939, 3144990, -7944616, 7181186, 421981, -11214160, -4626217, 1716376, 2753074, -7793218, 12649216, -7668664, -5773510, 6856379, -5212480, 693637, 1376537, -2954938, -10751914, 2296197, 4805532, 869194, -9005473, 6309844, -6150393, -21228950, 38631084, 54366768, -5245229, 6623914, 3491272, 13167833, -26363584, -25164214, 303332, 4359392, 500901, -9075803, 1362042, -11212549, 13235479, 32386200, --6834904, 695248, 1851668, 9810242, 904091, 3802120, 12460237, -24955370, -1854889, 24482388, -25161530, -29403346, -6233608, 4227322, 4145717, 8748848, 22148072, 6226629, 44668196, 7430831, -13790066, 6576132, -7008313, -9270687, -525597, -31345746, -45076220, -15269682, -14622753, -46976204, -7362648, -1124745, -26223996, -12809740, -43936980, -4815195, -6040335, 29944512, -29339996, 18299782, --20045150, -1644436, -13179107, -10420664, 11793980, 26907434, -20734492, -7795366, -1870458, -6152541, --2190433, 11343009, 21594558, 23032298, -16434155, 46338940, 31102006, 4038343, -17568026, -38151120, --8641474, -14208289, -10399726, 2505040, 12259447, -8017094, 4580583, 14377403, 2347737, -4578972, -14632954, 9723806, 5026723, 6402723, 15362561, 15469935, 134755, 1254131, 6222871, 5791764, --2512019, -4625680, -2635499, 2819646, -363998, -1963337, 985695, -3093450, 2158221, 10084046, --415538, 3550864, 12345883, -3234110, -4396973, -4728222, -500901, -6855305, -1354525, 5833640, --3180423, -1880659, 1207423, 31139, 1078574, -981937, 4878546, -3294240, -3367791, 7974144, -5679558, -6235219, -290447, -3340948, -19413790, 35566088, 59204512, -13906030, -3015067, 10546829, -26513370, 8959839, -15373835, 9681930, -13127031, 3459059, 8405788, -3124052, -17709224, 5393942, -18905910, -4646081, -26976690, 21203716, -6160057, 17322676, -6340983, -4198331, -6614787, -10856067, --384400, 19240380, 10764799, 3248069, 15560667, -7283728, -6081137, 5989332, -8214125, 10813117, -6325413, 16499117, 28195924, 24734716, -17672716, -32952600, -11989938, -1982664, 25937844, -9806484, -4680441, 10525354, -10168872, -15130096, -24276766, -24919938, 19801410, 21124260, -16698296, -60122564, -5075041, -4133906, -8157754, 4786741, -5904507, -24052890, -11177116, -5555004, -16683264, -7070590, -25745108, 9825811, 14890115, -5675800, -8269960, -5322002, 14370961, 2518462, 2792803, 12380780, -35682052, -2974802, -5094905, -17827872, -16853452, -24665998, -2534568, 14166413, 9713605, -9986336, -7560753, -4539244, -5747740, -10205379, -9264781, 8705362, -7136088, 8498130, 4081293, 4862440, --5145371, -7590281, 8880382, 5545877, -2018635, 6736656, -8942659, 3979824, -1063541, 5578089, --2832531, -5057324, -2760590, -2432025, 6320581, 3190624, -88584, -6248641, -1311576, 12971338, --8974871, -79457, -8704825, 11154567, -5708012, -2312303, -8012799, 1340567, -3295314, 1341104, -9553618, 9546639, 2186138, 310311, -3328063, -12590697, -1873143, -10380936, 5513665, -14761266, --24550034, -5179194, -4205310, 4697084, -8458938, 18991272, -11318849, -38155952, -20898238, 13452374, --18187040, 21486648, 18901078, -8221105, -3013993, 2951180, -11809549, 251792, 6112812, -1472637, -3273302, 27168352, 22362820, -5796595, -35850092, -26900990, 1899449, 19132468, -14479408, -5970542, --16994648, -21423296, 1873143, -5901822, -25467008, -27406724, -40615360, 16485695, 5462662, 1089848, -23236846, 31534724, -1352915, -23228256, -17906256, -18752364, -10831908, -6519224, 7005629, 12321187, --10949482, -17062294, -21169356, 11339251, 9694815, -20507396, -19832548, -7745974, -3561065, -11906186, -7343857, 50964620, 30379378, 59490128, 19714436, -31396748, 36840620, -1484448, -19051938, 1956895, --17944374, -38801272, -16226923, 9035537, 18436684, -4283693, 16974248, 9968619, 37655588, 41310608, -33793876, 11332808, -9657234, -5903433, -5720897, 7250979, 9458055, -14268418, -5431523, 2417530, -30681098, -4250407, 2529199, -3318936, 11013370, 11246372, 13039521, -644782, 124554, 236223, -2729452, -1194538, 1728188, -11222750, -3732327, -3841848, -10661183, -10877005, -5165235, 3946538, -12893492, -8429410, 1830193, 4565014, 14669998, 20038706, 13587666, 12805445, 14137959, 3141769, --5494337, -11041287, -16031502, -19791210, -15716359, -9215926, -18910204, -19098646, -7524783, -3382824, -35376036, -20088636, 2306934, 10405095, -4464082, -26219702, 26520886, 25340308, -14579803, -20045150, -2738042, 35087736, -18402324, 10011569, 22471268, 6896107, -8469139, -16741783, -11023034, 7803419, --2678449, 5954436, -9838696, 6573985, -21779780, 31876710, -3094524, 7184407, -1519882, -40111236, -12492449, -11077794, 20683488, 12504797, 22100292, -8599598, -38729868, 27837294, 12495670, -13121662, --24119462, 19969450, 10659572, 21234318, 21376590, -18622442, 8567386, 22407918, -32811402, 30090540, -14768245, -911607, 9535901, -16962974, 37616936, -4202089, 24748138, 11162083, 43683040, -3024731, --7686381, 6194954, 17756468, 11842299, 12351789, 44189308, 2568391, 10831371, 25777856, -17022030, -17681306, 2133525, -29388314, 10970420, -9921374, 33247878, -24487220, -29356638, -30617748, 26167626, -42871828, -13657459, 10892037, -50549080, 4794794, 2473901, -1961726, -23653996, 3930969, 10062035, --7853348, -6476811, -6391448, 16061567, 7480760, -10071698, -10937134, -6256157, -2609193, -3130494, -4561792, -17402670, -10492068, 9307194, 3789235, 3338263, 521302, 8025684, -1401770, -883690, --10286984, 13781476, 17095044, -7283191, -26714160, -17977122, -240518, 77846, 5068599, 1398549, --8458401, -13060459, -7248831, 4996658, 7651484, 21429740, 7175817, 1174137, 301721, -15879031, --3330210, 16620987, 9726490, -64912524, 3564823, -7966628, 2028835, 50225884, 41371808, 59481540, -31433256, -15845745, -12112345, -24675124, -32855962, 11545946, 2891050, 8606578, 10457172, -9598715, -14966887, 25347824, 4671314, -6818261, -8591008, -17995912, -11945378, -10886668, 4963372, 8056285, --25805774, -15292231, -3558381, 17288854, -7815767, 11125576, 13854491, -36697812, -36132488, 6827388, -10472204, 8019241, -27275726, -12568148, -24499568, -11886322, -11218455, 23596014, -31053150, -43262132, --16256988, 8545374, 7347616, -33376728, -26781806, -21077016, -15946140, 17986786, 25393458, 1111323, --8634495, -10588168, -5896990, -5663452, -11484743, -37050536, 12168179, 27769648, 25262460, 7827041, -34507376, 46639048, -4078072, -6047314, 35730368, -8701067, -21767432, -49213344, -16762184, 6650757, --26998702, -18113488, 12623446, -4469451, 17508972, 30611306, -18685792, -29019484, -9611600, -12483859, --7213398, -7917772, -7820062, 3205119, 4423280, 3525631, 6214818, -10465225, 9054865, -14434848, --1752347, 8875550, 11951283, -12907450, -17948668, 10196789, -4113505, 596464, -12539157, 14717779, --8693014, -3185792, -3481071, 13613973, -11619497, 14773614, -6627672, -7006166, 9784472, 2513630, -7784628, -6276558, 653372, 2829310, 15963857, -1957968, 3758097, 42610908, 14971719, 3436511, -15572478, -17681306, 1165010, -9041443, -13186623, 7865159, 3127273, -11043435, -18305688, -10556493, --16990890, -13861470, 5599564, -10703059, -5180805, 7970923, -5254893, 1782411, -5849746, 21161304, --16540993, 17342004, 6344741, 1924145, -15996606, -6944425, 12832289, 5149129, -251256, 10182831, --1772211, -4281546, -6524056, -5582921, -4357781, 1868848, -40265, 2098629, -18743238, 9822590, --7811472, -7420093, 6597607, 4437238, 2503966, -3608310, 13231720, 11281805, -16396575, 14650133, --2011655, 9913858, 19902878, -4242891, 10794863, 10157598, -9825811, -7117835, -13111998, 1094143, -2313377, -21188148, 8758512, 3113851, 16479790, -6562710, -37381784, 23375896, 1472100, 585726, -532039, -16621523, -5171678, -4453881, -5539434, -24184960, 13765907, 6795175, 14842870, -10837276, -6559489, -12146168, -10937134, 394063, 9438191, 7470022, 293132, -1497333, -3333968, 716186, --5479842, -1257352, 16005196, -6608344, 3216394, 1608465, 4576825, -9922448, 10668699, -522375, --1979980, 2359011, -1015223, 2298881, 3601330, -9046812, -1187022, 16106, -1633161, -1777580, -4909148, -5839008, 7144678, 10176925, 3932580, -6592775, -287226, -1501091, -5971079, 7374459, --2056753, 3955665, -21979496, -62221192, -92652112, 19484656, 72727216, 3061775, 199157632, 183672128, -126109904, 217009664, 166875584, 22737556, 3547643, -22484154, -159137664, -162250448, -123415888, -212531088, --198250864, -56649008, -66169340, -66847408, 15864535, 40253508, -33210298, -11047730, 63720136, 40621800, --2214056, 47418048, 32847910, 2487860, 39664024, 93978176, 61793840, 21552146, 96267400, 71271760, -5556614, 82744152, 112146968, 26933204, 12138114, 114417392, 31335544, -44549012, 57605712, 88132728, --45041860, 20586852, 123179128, 11701102, 20353314, 148707344, 116867136, 9869835, 92727808, 122989608, --42707544, -25306484, 34996468, -100618736, -168106096, -113456392, -185379376, -275375040, -252932768, -282906816, --360331104, -380201248, -336338880, -355431616, -334764256, -251346320, -200756976, -104570104, -26079042, 59113784, -206190640, 239972704, 260528960, 404256832, 395223968, 265348448, 341647456, 266976784, 106180720, 117365888, -165971488, 81170048, 52882860, 124010200, 88442504, -566936, 42354820, 96364032, 23981486, 6656663, -71806488, 16535087, -74924096, 24137180, 58799712, -17300666, 52645024, 140332144, 55506548, 31452582, -123509840, 67342400, -24438364, 14312442, -32136020, -148364816, -181694304, -180536272, -227627360, -257132176, --212735632, -204527424, -233190960, -210472192, -174064816, -200471360, -183533616, -123744448, -98538896, -94358824, --38999912, 21944062, 26232050, 83369072, 141111680, 148402400, 146712320, 165781440, 153117728, 109302624, -92571040, 82350096, 56575992, 46007688, 56799332, 50285476, 33621004, 34934728, 38308960, 31956704, -31077310, 40149356, 34928820, 23197118, 17160542, 12417287, -5382668, -11112154, -11217381, -10800232, --5050882, -1528472, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +6460705, -673773, 1967632, -1189706, 8621073, -3393561, -827855, -316754, 1074279, -1533303, +3951907, -694174, -2653753, -484258, 5400385, 387621, -2724083, 2516851, 1869921, 3539053, +1460289, -2718178, -1783485, 6015639, 843961, -1557463, -1187559, -1242856, 1189706, 1269163, +-773094, -7691750, -1918240, 355409, 5303211, 1879048, -653909, -37581, -3054796, 4204773, +-4307852, -5748814, 744640, 39728, -1940252, -1336809, -1599875, 803696, 523449, 489089, +-2006287, 4989142, 153545, 6692096, -1080721, -3213709, 1470489, -374199, 958315, 1539746, +3389803, 2288681, -868657, -1860258, -1571421, 4334696, -4434017, 154082, 122407, -797253, +-3804267, 3333432, -1919850, 423591, 2907156, -2069637, -2751464, -2304787, 2947421, -292058, +-925029, -840203, 91805, -573915, -1204738, 1445257, 1495186, 1075889, 676994, 354335, +2044404, 310311, -51540, 410706, -210453, 52076, -484258, -276489, -256087, 1364189, +323733, -949188, 1178969, -2560874, 2239289, 1325534, -2985002, -1663226, -217970, 265751, +-140660, -456340, -1503239, 2703682, 540629, -1183800, -1572495, -93952, 5638219, -799401, +-2622078, 3586298, -1380832, -3401077, -323196, 2866891, 2172717, -1868848, 530428, -2332704, +1374390, 1307281, -1085016, 2863133, -761283, -5206037, 989453, 2677375, 2537789, 339302, +-358630, -3778498, -1242319, -510564, -1622424, 3383361, 4800163, 2207613, -6482717, 2188286, +7691213, 3154654, -345745, -66572, 3558381, -1761474, 1184874, -3246995, -2893197, 2950106, +3382287, 1600949, 927713, 576599, 703838, 1567126, 331786, -320512, -1124745, 787053, +-2246268, -446677, -950798, -4666482, -2294050, 956167, 1759326, 1409286, 3176128, 2463164, +2643016, 3744138, -2370285, -1532767, -667331, 1176284, 1406602, 2201171, -448824, -763967, +-393526, 1336272, -959925, 1207423, 332323, -531502, -388158, 385473, -203474, 727460, +331249, 99321, -287226, 392990, 397284, -184684, 624918, 129923, 172336, -513785, +128312, -160524, 34360, 767189, 110059, 312996, 310848, 4453344, -311922, 1835562, +-2867965, -4285841, -2674154, 2324651, -1945083, -1992328, -2109903, -2831994, 2725694, 378494, +2000381, -887985, 590021, -5818070, -3733937, -2660732, 3729105, 703301, 831076, 2029909, +-2056753, -1054951, -462783, 664109, -4403952, -860067, -2971044, -3249143, 187905, -2867965, +1921461, 1799054, 7681549, -1921461, 3906810, -2609730, 1614908, -1794760, 402116, 6706592, +1077500, 2899640, -3182034, 2036351, -2862596, -1371168, -443455, 4256313, -2106682, -1108638, +-3797825, -2028835, -4484483, -613643, 4236985, 1001801, 314069, 723165, 3884261, -3841848, +-6720550, 1545651, 2113661, -4398047, -324270, 578210, -1089311, 1760400, 5251672, 1088237, +-1336809, 110595, -1873143, 338766, 317291, -1509681, -453656, -485868, -2126546, -507880, +-1214939, 442382, -463320, -843424, 1736241, -336081, -1713692, 727460, -1221381, 48318, +-1321239, -1925219, 1116155, -352187, -140123, 608275, 816044, 245350, 1779727, -848793, +-149787, 297427, -641561, -274341, -202400, -887448, -465467, 1465658, 489626, 2088428, +256087, 937914, -828392, 2471754, -6861747, 1145683, -2402497, -5046050, -3655017, 2059437, +-1013075, -226023, 5006858, 1671816, -700617, 446677, 4257923, -1995012, 3143379, -1417339, +938987, -4496831, -796180, 3065533, -1028108, 3805878, 4256313, 1412507, 2681670, 5586679, +-1304060, -7839389, 1786170, -3481608, 245350, -9604084, 263067, 3099893, -1927367, 3602941, +510564, -3455838, 1248225, -7218767, -4626217, -1750199, -1775969, -5987722, 3043521, 3342022, +197032, 3111704, 239444, 855772, -1944547, 2823404, 2140504, -1106491, 6624987, -1229434, +5473399, 4704063, -268972, -745177, 14496, 1518808, 2236067, 731218, 2502892, 852014, +850404, 7348152, 2798171, -3182571, -1471563, -25233, -1765768, 1106491, -1277753, 7412577, +1234803, 3492882, -2655901, 3020436, -33286, -1437740, 635118, -2372970, -1559073, -390305, +-1718524, -1036698, -1040993, 927176, -1612760, -355945, -1136019, -564788, -553514, 2052994, +-866510, 1080721, -292058, -1707250, -288300, 1091459, 428960, 212064, 664646, -1022202, +893890, 609885, 523449, 1025423, -576599, 262530, -1691680, -96637, 1296543, 1188632, +281320, 244276, 161598, 976568, -13087302, 42950, -31675, 3358665, 5753646, 2018098, +-2888366, -4784057, -756988, 6223945, -1173600, -1185948, -4604205, -106837, -1911261, 4609037, +5485747, -9402757, 6143951, 3919695, -3557307, -762894, -4922570, 31139, -1479616, 117575, +3240016, 6254010, -2339684, 1445793, -1628866, -2139431, 2329483, 4315906, 2917357, -2711198, +-4443681, 3103114, 2161442, -1602560, -802085, 543850, -5729487, 2086280, 1743757, -2296734, +-3828427, 1483374, -2907156, 5102958, 2253784, -8960376, 4098473, -3837553, -9860171, -2861522, +-729071, 1979980, -4038343, -187905, 2186138, -4358855, -4284767, -4486094, -1363115, 1123134, +9376450, 1472637, 1791001, -2016487, -4885526, 6380711, -1925756, -7494181, 381178, -7563975, +582505, -734439, -2745021, -8286066, 2537789, 110595, -1809255, 2023467, 5038534, 2303713, +-941135, -860604, -11274, 2738579, 457414, 667867, 1556389, 2666101, -217433, -1256815, +-1584306, -1660542, 656593, -136365, -1287953, -1336809, 1229434, 1162326, 2351495, 482647, +-37044, -143345, 890669, -420370, -22012, -383863, 1494649, -181999, 807454, -231391, +8153459, 2177012, 1771137, 3555159, 5131949, -1147830, 12534862, -1838246, 8968429, -10593000, +3641596, 6165963, -2240899, 845572, -2981781, -300648, 4827543, 8799314, -2501282, -4395362, +-1296006, 4092030, 867047, 8947491, 4231617, -983548, 1279363, -81604, -4201552, 817654, +-945967, -1315334, 3906810, 5130876, -8133595, 9364639, -7152731, -3900904, 1583769, -2908767, +4713190, 105764, -2726231, 6610492, 9277129, -6936372, -1261110, -692564, 2864743, -6568616, +-10805601, -5051956, -3312494, 3158949, -7497939, -4339528, -884226, 7736847, 4864051, -5422933, +3850438, 2034741, -2956548, -4460324, -716723, -2752537, -3182571, 302795, -2121714, 5779416, +-4401805, -935229, 4897874, -3914326, 5294084, 6324340, 851477, -677531, 544924, -7860864, +-6972343, -1760400, 4356171, 166430, -3062312, 2865817, 6427419, -4316442, -2012729, 1730872, +-593242, -3074660, -28454, 802622, -2970507, 136365, -827318, 1302449, 380105, 2305861, +311385, 1804423, -1176284, -508417, 73551, 186831, -134218, 1612760, 688805, 1884954, +1811403, 154619, 532039, -302258, 1229971, 1874216, -947577, 4778151, 3884261, 5219459, +-5042292, -6671158, -3606699, 4531728, 204548, 18763638, -1434519, -466004, -4539244, -8487392, +-12473659, -2758980, 4096325, 6591701, -4136591, -7989713, 1012539, 63888, 7976828, -2685428, +-3304441, 9869835, -5409512, 635655, -7645042, 4872641, -1556389, 31139, -1723356, -11609297, +-7310571, 609349, 6407018, 4297115, 492311, -12029130, 7951058, -4865661, -4991289, -5194763, +-6906845, -1084479, 6502044, -5335960, -5901285, 4026532, -1951526, 2309082, 11996917, -5260261, +226023, 590021, 5074504, -3569118, -3295851, -1670742, 7610682, -1731946, -4068945, -718870, +5926518, 7737921, -7722351, -8750459, -3009162, -1302449, -2963528, 1851131, -6174016, -2177012, +-5829881, -11558831, -4600447, -2676302, 1499481, -10630581, -2983392, 158377, 7479149, 219580, +-6575595, -128849, -313533, -2005750, -3657165, 159988, 1508070, -695248, 1106491, 1054951, +-1484448, 2159832, -934692, -2157147, 2304787, 2873333, -1286880, -2757369, -127775, -542240, +440771, 2301029, 817654, 41876, 1580011, -875636, -1428614, -1108638, -1563368, 2246805, +-6123550, 5189931, 6342056, -4664335, -5645735, -4775467, 2587718, -483184, 9190693, 16004122, +-8981313, 590558, -369367, -1119913, 1496259, 4627828, -13139379, 11800960, -9257265, -4588636, +11888469, -2754685, -5675263, 3932043, 4398047, 259846, -656593, -9176198, 5732708, -1314260, +1996623, -6076305, 7575786, -701153, -12641162, -13512504, 4523138, -2485176, -6966974, 3416647, +-569620, 20914880, 3519726, -3834332, -6220187, -12345347, -4365835, 2387465, -2993055, 9626632, +-2029372, -14377403, -1380832, 9871982, -4306242, 1286343, 8548059, 5757404, -4833449, -913754, +6925098, 9227737, -4201015, 1796370, 1331440, -4464082, 2014877, -2061584, -604517, 1366873, +-2134599, -2611877, -8887898, -9747965, -8215199, 8199093, 4601521, 5337034, 2278480, 51003, +3293166, -7116761, -3908957, -9955734, 4955856, -1269700, -1353452, -2036351, -1461900, -5086852, +-2990371, 1024350, -2040646, 289910, 405338, 340376, 1975148, 236223, 2365990, -274341, +1751273, -2328946, 1349694, -3484292, 317828, -1665911, 2915209, 119722, -1803886, -562104, +940598, -1511829, -1655173, -4072703, -4039954, -2275796, 4167192, 252866, 1490891, 2578054, +-10722386, 4066797, -11574937, 448287, 4214437, -1872069, -8661875, -4076998, -1765768, 7756711, +6163278, -4619774, -4780299, 8271034, 3452617, -4792110, -5168457, -4034048, -545998, 7997766, +-1356136, 725313, -444529, -98784, 10276783, 5092221, 6889128, -483184, -492311, 3544422, +-5301601, -8944806, 7321309, 11761768, -7940858, 10111427, -2949569, -1024350, -4515621, 5210869, +340376, -5660767, 3469260, 9562208, 7504382, 3456375, -7157026, -2943663, -14513768, 2416993, +7601019, -4671851, -1138703, -5754183, 1536525, -3424700, 5674726, -3587908, 1915019, 6738267, +3875134, 12693239, 6673843, 4294968, 8153459, -6806450, 12221329, 3775276, 7446400, -2430415, +-8356396, -12946642, -2418067, -2167885, -3336653, -3034395, 4869419, -8897562, 13514115, -2303176, +-10842645, 6213207, 10115722, 4185446, 1349694, 2112050, 3831648, 1289564, -2176475, 2597382, +-1987496, -23085, 4286378, -3221, -98784, 4638565, 725313, 2548526, -321586, -2157684, +771484, 468688, -1779727, 1458141, 1965484, 518080, -1244467, 1130113, 460635, 3598646, +869194, -636729, 2347737, -3054259, 981400, 718333, -3263102, -4873178, -1281511, -1894618, +-1168768, -2404645, -1619203, -999117, -324807, 6007586, -12783433, 9402757, 3255585, -1932198, +13877576, 10739029, -17622788, -11799886, 11119670, 19087908, -1762547, 2820720, -1624571, -2404108, +-1906966, -787053, 4831838, 2878702, 11536282, 2845953, 11039677, 3124052, 4804995, -1493575, +-6236830, 2683818, 865973, -5085242, 8451959, 875636, 3391414, 1980517, -1745367, -7830799, +1023813, -8884677, -2997350, -10283225, -6880001, -4155381, 8650601, 1241782, 4263829, 10592463, +-4574677, -878321, 1247688, 3808562, 1149978, 265751, -2968359, 7843147, 17274358, 8315057, +-13746043, -9796284, -10172630, 11933567, -1807108, -11045045, 6454262, -6189048, -674847, -1804423, +-767189, -848256, 378494, 10462003, 17291002, 6540699, 14892262, 9552544, 4830228, 1941325, +3752191, -4792110, 15850577, 5131949, -8315594, -11133092, 4917738, 3664144, -3051038, 7943542, +14988362, 3459059, -5788542, 9339406, -876173, -6867653, 1424319, 5237176, 850404, -909459, +593779, 2876018, 5052492, 2243584, 2237141, 574452, 3295314, -1398012, -651224, -1945620, +-562641, 6914361, -3677029, 2559264, -1089848, 1649268, 162135, -1843615, 1023813, 2451353, +3003256, -1429687, 1225676, -2791192, -85362, 1389422, -5006858, 2123325, -7150047, 1994476, +17193828, 3285650, 6038187, -5516349, 4406100, -8470212, -14982993, 347355, 7969849, 2392297, +6393596, 9030706, 9903658, 591632, -10875931, -9211631, -14397804, -22244172, -419833, -2677912, +9803800, 7313793, -8383776, -4652524, 5735929, 11638825, -14595909, -9394704, -2833068, -7975755, +-5469104, -2979634, 4472672, 9038222, 373662, -5487358, -6776922, 9133248, -7327214, -3069828, +-251792, 12855374, -936840, 1056025, -20212116, -1522566, 4891968, 10369125, 13438953, 2905009, +-13032541, 6135361, 224412, 6106370, 8447127, 1429687, 4226248, 9749039, 16994112, -11324218, +-4514011, -995896, 5178120, 18124226, 7590281, 6055367, 10124312, -3487514, -6029061, -10878615, +-13746580, -8132521, -572304, 8796630, 20136418, -12583180, -9290551, -1290101, 19745038, -11075647, +-6473053, -9892383, -1860795, -8865886, 2797634, 1694902, 4669703, 10513006, 1901060, 6735583, +-4407174, -4329864, -5638755, 456877, -2865280, -6553047, -5919002, -2866354, -1586454, -1357210, +6643241, -5000416, -1549410, -1879585, 4741107, 1208496, 3445638, -2251100, -2318209, 4786204, +1553704, 1270237, -4028143, 6166500, -3144453, -157840, -2205466, 1966558, -2285996, 649614, +4022774, 4904853, 8951786, 5057861, 12610561, -14915348, -10645076, -1661079, 21887154, 8849780, +555661, 11842835, -7371775, 17770428, -4169876, -15599321, -3020973, -15501611, 12607876, 7532836, +4950487, 4909148, 297963, -4970888, 6109054, 9084393, 4582193, -3164317, 8145943, 10880763, +9752260, -1212791, -8446590, 14743549, 3481608, -899796, -2461553, 1774358, -9605694, 9568650, +-1796907, -2649458, -12246026, -6669548, -7553774, 17200270, 6147172, 187905, 2286533, 8893267, +12786655, 6521371, -16492138, 15035607, -1752347, 8700530, 3727495, 13214004, -3007014, -17277042, +5446019, -780073, 7178501, -3059091, -7042673, 6441914, -2727841, 4376035, 21794812, -2629594, +-9989020, 68183, 2896419, -10545755, 17575544, -7783018, -10541997, 15498389, -8970039, 7916699, +1088774, -11188927, -7925826, -11190537, 3585761, 9429064, -5546951, 5479305, 10471130, -5750961, +7407745, -2354179, 12385612, -4330938, 3744675, 4065187, -3315178, 96100, 556198, -5537287, +-643708, 5159867, -7757785, -1453846, 5852967, 3017215, 271657, -4729296, 2495913, -1217623, +2046015, -4944044, -4758287, -2645163, 1146756, 1329292, -5743445, -3570192, 5600638, 816044, +2518998, -5856725, 2857227, 631897, -2567317, 1300838, 981400, 2053531, -3032784, 362925, +-1404454, -199716, -6242735, 4671314, -14404783, -3122441, 7761006, 1553168, -14087493, 3477313, +-4937602, 10128607, 2518462, 5071283, -23530516, 6954626, 447213, 8893804, 15185931, 558346, +-1910724, 1018444, -7648263, 15155866, -14636712, 4517232, 9269076, 6081137, 8535711, -4147328, +-7053947, -8448738, -15149423, 5749888, 2309619, 8568460, 16090558, -6332930, 13797046, 7252589, +-13311177, -7839926, -208306, 1186485, 707059, -389231, 6823630, 11574937, 10957535, 4362076, +-27811524, 6603512, 8254391, 7953743, -18331458, 10808285, -9416179, 9339406, 1138166, 4798552, +-2506114, 6929930, -2238215, 23349590, 11335492, -10873247, 1306207, -30019138, 4971425, -9066139, +-9019968, 8039105, 5978595, -15246597, -29599840, 18388902, 11502996, -28090696, 10851235, -6604049, +10628433, -2655901, 2558190, 4018479, 303869, -19042812, -6976101, -3048890, 5952288, -518617, +-4710506, 7523172, -9981504, -4293894, 10421738, -1251983, -875100, 3260954, 2198487, 3724811, +1899986, -5937256, 2349347, -8704825, 5224291, -4019016, 3007014, 1842004, -2165737, -1644436, +-1447404, -3344169, 1589138, -5171141, -701690, -4442607, -2937221, -7081864, 3510599, -2389613, +-1701881, -4247723, 1855426, 2935610, 2297271, 1402844, 746787, 576599, 2627446, -581431, +2847027, 1879585, 6504728, -3843996, -3449396, -6016176, 10919954, -8339753, 92342, 1622424, +28033788, -3811247, 20246476, 4985920, 15248745, 969052, 4363687, 4951561, 27030376, 27078158, +-13978508, -12780212, 15475304, -19614042, 24159, 5306432, -19547470, 11137924, 1584306, -1560147, +-3543348, -5959804, 2371359, 2110440, 3680787, -12015171, 113280, -2930778, -15786689, 8064875, +11023034, -17653390, -13128104, -6453725, 9536438, 9248675, 8868034, -951335, -3564286, 8304320, +28147606, 15166066, -5521718, -3663607, -3817689, 18992346, -15170361, 7017440, 4042101, -23685134, +-9800578, -1064615, 3240553, -20074678, 13843753, 9006010, 4045322, 3823595, 9605157, -19010598, +-2289218, -15768972, 714038, 9791452, 16480326, 10140955, -10407243, -5537824, -817118, 555125, +-11959336, 26775900, -2119566, 3567507, -6306623, 9188009, -2032593, 5375689, -2421288, 3344169, +2522220, 5831492, -679142, 105764, -2182917, 1389422, -415001, -1499481, 7894687, -2348273, +-5829345, -327491, -657130, 4049081, -5943161, 1365263, -4931160, -7715909, 4760971, -1422708, +-5289252, 442382, -115427, 930934, -4660040, 6186901, 1586454, 7594576, -9385040, -631360, +4375498, -2345052, -7627325, -120259, 8175470, 3722126, -2525441, 12914430, 20024748, -1394791, +1302449, -12402792, 1042066, -546535, -8865886, -14810658, -2843268, -6857989, -11098732, -8113730, +12550431, -10638634, 9101573, -3206730, -2540473, 17577154, -12169790, -6789807, 2684892, 7090454, +1030792, -23255100, -14295799, 2660195, -3752728, 3772592, -3260954, -7299297, 14817637, 3175592, +-1289027, -6089190, -33454038, 20084340, -6062347, -364535, -2860448, 1278827, 9573482, -5570036, +-9139154, -15608985, -1487132, 6892349, -9651865, -12367895, 5083631, 19638202, -3350611, 18263812, +13430363, -13368086, 24570972, 16254841, -16232292, -25052544, -7223062, -10917807, 1324461, -7937637, +-1964948, 12001212, -20966420, 10262824, -3422552, -11769821, -13164075, -13129715, -15930034, 3317325, +9533754, -8547522, 13630616, -1773822, -7983271, -16409459, 250719, -1837709, 6328635, 19588272, +-7099044, -14838038, -5196374, 434865, 5019743, 13406740, 3509525, -1657321, -11001022, -79994, +395137, 4989679, 2058900, 31139, 3688840, 5495948, -4131759, 6860674, -3966939, 3144990, +7944616, 7181186, 421981, -11214160, -4626217, 1716376, 2753074, -7793218, 12649216, -7668664, +5773510, 6856379, -5212480, 693637, 1376537, -2954938, -10751914, 2296197, 4805532, 869194, +9005473, 6309844, -6150393, -21228950, 38631084, 54366768, -5245229, 6623914, 3491272, 13167833, +26363584, -25164214, 303332, 4359392, 500901, -9075803, 1362042, -11212549, 13235479, 32386200, +-6834904, 695248, 1851668, 9810242, 904091, 3802120, 12460237, -24955370, -1854889, 24482388, +25161530, -29403346, -6233608, 4227322, 4145717, 8748848, 22148072, 6226629, 44668196, 7430831, +13790066, 6576132, -7008313, -9270687, -525597, -31345746, -45076220, -15269682, -14622753, -46976204, +7362648, -1124745, -26223996, -12809740, -43936980, -4815195, -6040335, 29944512, -29339996, 18299782, +-20045150, -1644436, -13179107, -10420664, 11793980, 26907434, -20734492, -7795366, -1870458, -6152541, +-2190433, 11343009, 21594558, 23032298, -16434155, 46338940, 31102006, 4038343, -17568026, -38151120, +-8641474, -14208289, -10399726, 2505040, 12259447, -8017094, 4580583, 14377403, 2347737, -4578972, +14632954, 9723806, 5026723, 6402723, 15362561, 15469935, 134755, 1254131, 6222871, 5791764, +-2512019, -4625680, -2635499, 2819646, -363998, -1963337, 985695, -3093450, 2158221, 10084046, +-415538, 3550864, 12345883, -3234110, -4396973, -4728222, -500901, -6855305, -1354525, 5833640, +-3180423, -1880659, 1207423, 31139, 1078574, -981937, 4878546, -3294240, -3367791, 7974144, +5679558, -6235219, -290447, -3340948, -19413790, 35566088, 59204512, -13906030, -3015067, 10546829, +26513370, 8959839, -15373835, 9681930, -13127031, 3459059, 8405788, -3124052, -17709224, 5393942, +18905910, -4646081, -26976690, 21203716, -6160057, 17322676, -6340983, -4198331, -6614787, -10856067, +-384400, 19240380, 10764799, 3248069, 15560667, -7283728, -6081137, 5989332, -8214125, 10813117, +6325413, 16499117, 28195924, 24734716, -17672716, -32952600, -11989938, -1982664, 25937844, -9806484, +4680441, 10525354, -10168872, -15130096, -24276766, -24919938, 19801410, 21124260, -16698296, -60122564, +5075041, -4133906, -8157754, 4786741, -5904507, -24052890, -11177116, -5555004, -16683264, -7070590, +25745108, 9825811, 14890115, -5675800, -8269960, -5322002, 14370961, 2518462, 2792803, 12380780, +35682052, -2974802, -5094905, -17827872, -16853452, -24665998, -2534568, 14166413, 9713605, -9986336, +7560753, -4539244, -5747740, -10205379, -9264781, 8705362, -7136088, 8498130, 4081293, 4862440, +-5145371, -7590281, 8880382, 5545877, -2018635, 6736656, -8942659, 3979824, -1063541, 5578089, +-2832531, -5057324, -2760590, -2432025, 6320581, 3190624, -88584, -6248641, -1311576, 12971338, +-8974871, -79457, -8704825, 11154567, -5708012, -2312303, -8012799, 1340567, -3295314, 1341104, +9553618, 9546639, 2186138, 310311, -3328063, -12590697, -1873143, -10380936, 5513665, -14761266, +-24550034, -5179194, -4205310, 4697084, -8458938, 18991272, -11318849, -38155952, -20898238, 13452374, +-18187040, 21486648, 18901078, -8221105, -3013993, 2951180, -11809549, 251792, 6112812, -1472637, +3273302, 27168352, 22362820, -5796595, -35850092, -26900990, 1899449, 19132468, -14479408, -5970542, +-16994648, -21423296, 1873143, -5901822, -25467008, -27406724, -40615360, 16485695, 5462662, 1089848, +23236846, 31534724, -1352915, -23228256, -17906256, -18752364, -10831908, -6519224, 7005629, 12321187, +-10949482, -17062294, -21169356, 11339251, 9694815, -20507396, -19832548, -7745974, -3561065, -11906186, +7343857, 50964620, 30379378, 59490128, 19714436, -31396748, 36840620, -1484448, -19051938, 1956895, +-17944374, -38801272, -16226923, 9035537, 18436684, -4283693, 16974248, 9968619, 37655588, 41310608, +33793876, 11332808, -9657234, -5903433, -5720897, 7250979, 9458055, -14268418, -5431523, 2417530, +30681098, -4250407, 2529199, -3318936, 11013370, 11246372, 13039521, -644782, 124554, 236223, +2729452, -1194538, 1728188, -11222750, -3732327, -3841848, -10661183, -10877005, -5165235, 3946538, +12893492, -8429410, 1830193, 4565014, 14669998, 20038706, 13587666, 12805445, 14137959, 3141769, +-5494337, -11041287, -16031502, -19791210, -15716359, -9215926, -18910204, -19098646, -7524783, -3382824, +35376036, -20088636, 2306934, 10405095, -4464082, -26219702, 26520886, 25340308, -14579803, -20045150, +2738042, 35087736, -18402324, 10011569, 22471268, 6896107, -8469139, -16741783, -11023034, 7803419, +-2678449, 5954436, -9838696, 6573985, -21779780, 31876710, -3094524, 7184407, -1519882, -40111236, +12492449, -11077794, 20683488, 12504797, 22100292, -8599598, -38729868, 27837294, 12495670, -13121662, +-24119462, 19969450, 10659572, 21234318, 21376590, -18622442, 8567386, 22407918, -32811402, 30090540, +14768245, -911607, 9535901, -16962974, 37616936, -4202089, 24748138, 11162083, 43683040, -3024731, +-7686381, 6194954, 17756468, 11842299, 12351789, 44189308, 2568391, 10831371, 25777856, -17022030, +17681306, 2133525, -29388314, 10970420, -9921374, 33247878, -24487220, -29356638, -30617748, 26167626, +42871828, -13657459, 10892037, -50549080, 4794794, 2473901, -1961726, -23653996, 3930969, 10062035, +-7853348, -6476811, -6391448, 16061567, 7480760, -10071698, -10937134, -6256157, -2609193, -3130494, +4561792, -17402670, -10492068, 9307194, 3789235, 3338263, 521302, 8025684, -1401770, -883690, +-10286984, 13781476, 17095044, -7283191, -26714160, -17977122, -240518, 77846, 5068599, 1398549, +-8458401, -13060459, -7248831, 4996658, 7651484, 21429740, 7175817, 1174137, 301721, -15879031, +-3330210, 16620987, 9726490, -64912524, 3564823, -7966628, 2028835, 50225884, 41371808, 59481540, +31433256, -15845745, -12112345, -24675124, -32855962, 11545946, 2891050, 8606578, 10457172, -9598715, +14966887, 25347824, 4671314, -6818261, -8591008, -17995912, -11945378, -10886668, 4963372, 8056285, +-25805774, -15292231, -3558381, 17288854, -7815767, 11125576, 13854491, -36697812, -36132488, 6827388, +10472204, 8019241, -27275726, -12568148, -24499568, -11886322, -11218455, 23596014, -31053150, -43262132, +-16256988, 8545374, 7347616, -33376728, -26781806, -21077016, -15946140, 17986786, 25393458, 1111323, +-8634495, -10588168, -5896990, -5663452, -11484743, -37050536, 12168179, 27769648, 25262460, 7827041, +34507376, 46639048, -4078072, -6047314, 35730368, -8701067, -21767432, -49213344, -16762184, 6650757, +-26998702, -18113488, 12623446, -4469451, 17508972, 30611306, -18685792, -29019484, -9611600, -12483859, +-7213398, -7917772, -7820062, 3205119, 4423280, 3525631, 6214818, -10465225, 9054865, -14434848, +-1752347, 8875550, 11951283, -12907450, -17948668, 10196789, -4113505, 596464, -12539157, 14717779, +-8693014, -3185792, -3481071, 13613973, -11619497, 14773614, -6627672, -7006166, 9784472, 2513630, +7784628, -6276558, 653372, 2829310, 15963857, -1957968, 3758097, 42610908, 14971719, 3436511, +15572478, -17681306, 1165010, -9041443, -13186623, 7865159, 3127273, -11043435, -18305688, -10556493, +-16990890, -13861470, 5599564, -10703059, -5180805, 7970923, -5254893, 1782411, -5849746, 21161304, +-16540993, 17342004, 6344741, 1924145, -15996606, -6944425, 12832289, 5149129, -251256, 10182831, +-1772211, -4281546, -6524056, -5582921, -4357781, 1868848, -40265, 2098629, -18743238, 9822590, +-7811472, -7420093, 6597607, 4437238, 2503966, -3608310, 13231720, 11281805, -16396575, 14650133, +-2011655, 9913858, 19902878, -4242891, 10794863, 10157598, -9825811, -7117835, -13111998, 1094143, +2313377, -21188148, 8758512, 3113851, 16479790, -6562710, -37381784, 23375896, 1472100, 585726, +532039, -16621523, -5171678, -4453881, -5539434, -24184960, 13765907, 6795175, 14842870, -10837276, +6559489, -12146168, -10937134, 394063, 9438191, 7470022, 293132, -1497333, -3333968, 716186, +-5479842, -1257352, 16005196, -6608344, 3216394, 1608465, 4576825, -9922448, 10668699, -522375, +-1979980, 2359011, -1015223, 2298881, 3601330, -9046812, -1187022, 16106, -1633161, -1777580, +4909148, -5839008, 7144678, 10176925, 3932580, -6592775, -287226, -1501091, -5971079, 7374459, +-2056753, 3955665, -21979496, -62221192, -92652112, 19484656, 72727216, 3061775, 199157632, 183672128, +126109904, 217009664, 166875584, 22737556, 3547643, -22484154, -159137664, -162250448, -123415888, -212531088, +-198250864, -56649008, -66169340, -66847408, 15864535, 40253508, -33210298, -11047730, 63720136, 40621800, +-2214056, 47418048, 32847910, 2487860, 39664024, 93978176, 61793840, 21552146, 96267400, 71271760, +5556614, 82744152, 112146968, 26933204, 12138114, 114417392, 31335544, -44549012, 57605712, 88132728, +-45041860, 20586852, 123179128, 11701102, 20353314, 148707344, 116867136, 9869835, 92727808, 122989608, +-42707544, -25306484, 34996468, -100618736, -168106096, -113456392, -185379376, -275375040, -252932768, -282906816, +-360331104, -380201248, -336338880, -355431616, -334764256, -251346320, -200756976, -104570104, -26079042, 59113784, +206190640, 239972704, 260528960, 404256832, 395223968, 265348448, 341647456, 266976784, 106180720, 117365888, +165971488, 81170048, 52882860, 124010200, 88442504, -566936, 42354820, 96364032, 23981486, 6656663, +71806488, 16535087, -74924096, 24137180, 58799712, -17300666, 52645024, 140332144, 55506548, 31452582, +123509840, 67342400, -24438364, 14312442, -32136020, -148364816, -181694304, -180536272, -227627360, -257132176, +-212735632, -204527424, -233190960, -210472192, -174064816, -200471360, -183533616, -123744448, -98538896, -94358824, +-38999912, 21944062, 26232050, 83369072, 141111680, 148402400, 146712320, 165781440, 153117728, 109302624, +92571040, 82350096, 56575992, 46007688, 56799332, 50285476, 33621004, 34934728, 38308960, 31956704, +31077310, 40149356, 34928820, 23197118, 17160542, 12417287, -5382668, -11112154, -11217381, -10800232, +-5050882, -1528472, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 3755412, -5177583, -3042448, 206695, 171262, -3719979, 4968204, -1986959, -1937567, 1413044, -5119601, --2303176, 5493263, 1240709, -2234994, 3896072, 1211181, 828929, -801011, 1896765, -30065, --6574521, -310848, -2443837, -292058, -149250, -6285685, 91268, -4039954, 213675, 637803, -2801929, 3360275, 1102196, 836445, 610959, 2903398, -1593970, 994285, 179852, 457951, -600759, -868657, 2587181, 3878892, -7452305, 3462818, -1952063, -4476967, -2869038, 5717139, -2861522, -1927367, 3241627, 947040, -2051921, 2016487, 40265, 0, 296890, 393526, --779000, 46708, 420370, -326954, 2454037, -1524177, -3442416, -3330210, -22012, 1124208, --212601, 163209, 1877438, -737124, 3296924, -3481071, -1040456, 2685965, 2895345, -1988033, -3264175, 1151588, -845035, -2199560, -1021129, -937377, -877247, -868657, -433792, -121333, --478889, -915365, 281320, 662499, -1309965, -339302, -420370, 684510, -1138703, -256624, -164283, 2767570, 198642, -2206003, 1379221, -1188095, -1768990, 435402, -3721589, -444529, --2790655, 977105, 1734093, 1672890, 1323924, -2901787, -211527, -2404645, 2567317, -4961224, --2822867, 2502892, -5444945, -615254, -367220, 1385664, 1184874, 2670933, 5633924, 2601140, --712965, -21475, -2029372, -1576253, -9976672, -9179419, -624918, 6787659, -1698123, 5420786, -463320, 1546725, -1698660, -7719667, 3978214, 1216550, -2333241, 1895691, -4101694, -837519, -2304787, 1015760, 7221988, -4969277, 4377109, -2280628, -5710159, -2652142, -1566053, -1570884, -2005750, 1696512, -4605816, -2055142, -2627983, -983011, 4424353, 4728222, 5081483, -3738769, -627065, -2347200, -316754, -1975148, -2520609, -3056406, -3432753, 1884954, 531502, -533113, --1250909, 447213, 1921998, -1968169, -1728724, -885300, 2202781, -770947, -424128, -967978, --1120450, -282394, 480499, -32212, -187905, 364535, 482647, -147103, -214748, 1409286, --1116155, -708670, 541166, -687732, 1090385, -689342, -758599, -155156, -139050, 681289, --359167, -347892, 408559, 85899, -1111323, 357019, 259309, 3708704, -3513820, -4534949, --3939022, 117575, -1560147, -1253594, -3118146, 678068, -3482682, -248571, -1437203, 5337571, --3439195, -3758633, -8400956, -10890963, -2643552, -4852776, -4474282, -1062468, 2248416, -2761664, --6545530, 4059281, -9490267, 2855080, -1600949, -1698123, 6123013, 4330401, 2259690, 855772, --1065152, -968515, -2314987, 1000727, 4152160, -3339874, 3936875, 3655554, 1050656, 551903, -1633161, 2804614, -6175626, -2660732, 5869610, -4543002, 374736, -75699, 3586835, -433255, --1379221, 699006, 6090264, 3397319, 2114198, 1988570, 3390340, -5364414, 4151623, -4373888, -3843996, 2561411, -1151051, -747861, -1841467, -2388002, -3930432, -173409, -1232656, -3099356, --3468723, -1920924, -2020782, -323196, -240518, -921807, 4624069, -1884417, -874563, -3119757, -3203509, 46171, -716723, 711354, -1356136, -2239826, 44023, 1309965, -158914, -191126, --1479079, 454730, -492311, -1295470, 81068, 326418, 724776, -136365, 474057, 434865, -1082332, 408559, -1191853, 82678, 608812, -140660, -1045825, -620086, 1521492, 821949, --827855, -328028, -331249, 2185602, -5772973, -137976, -2709051, -5302137, -2465848, -986769, --3696893, -1248762, -3410741, -1330903, 2685965, 3613678, -5990406, -3408057, 1962263, -1193464, --6544994, 4353486, 7795903, 1634235, -1836635, -3644817, 862215, 3765076, 7052337, -3586298, --1494112, -4521527, -3625489, 3897683, 3912715, -5487895, 3223373, -1754494, -3500935, 5544803, --14496, 3023657, -7596187, 522375, -4871030, 1101122, -6051609, -3801046, -988916, -1414118, -12621835, 4005057, 3272765, 2462090, -9397388, 5253282, 3656091, -2077154, -236223, 4095788, --581968, 4327717, 5011690, 4982699, -2891050, 363462, -1613834, 2651069, -2369211, -2507724, -1650341, -2355790, 1112933, 1557999, 86436, 2933463, 1164473, -5575405, -673773, -712965, -1751810, -6319508, -2030446, -1606318, 4454418, -1359894, -740345, -3417720, -903017, 219043, --321049, -1594507, 46171, -1036698, 1152125, 403190, 10201, 180926, 425202, -821949, --2349884, 1240709, 526134, -1357210, 652835, -744640, 281320, 285078, 843424, -194347, --281857, -595927, 540092, -978179, 918586, -1112397, -56371, -97174, 733366, -740882, --284005, -1073742, -615791, -991601, -7810398, -4358855, 3197603, -3422552, 9165997, 4029753, -8973797, -139586, -4384088, -4676683, -6294812, 9576166, -2345052, 4373351, 4894652, 1009317, -3446711, 3122441, 3048890, 1209570, -6323803, -365072, -2442763, -951872, 4339528, -397821, --386010, 3018288, 1911261, 3126199, -2747169, -9982578, -5950677, -3784940, 7348689, -6644315, --2007360, 4494147, -505196, 831076, -5566815, 9654550, 528818, -3769371, 7631083, -4693863, -11820287, 6100464, -2665564, 1361505, -3365107, -2308545, -10885595, 3852049, -4957466, -777389, --423054, -2389613, 4669167, -1826435, -4750234, -4638565, 1082332, -4238596, -4658429, 2657511, -417149, 3355443, -1816234, -9943386, 3438658, 4315906, 5561446, -5351530, -6011881, 780610, -9859097, 1583232, -5085778, -2336462, -855235, 2699924, 501974, 2875481, -2888903, -1100585, --559420, -3565360, -2908230, 4379256, -717796, 1717987, -367757, -1247151, -2774012, -267362, -124554, 1089848, -504659, 1013612, -705448, -2266132, -891743, -311922, -33286, -408022, -1726040, 99321, 1867774, -620086, -109522, -284005, -1987496, -2684, 1066763, 1044751, -7885023, -7255274, 3623342, 9255118, -6672769, 1830730, -3749507, -7276749, 10769094, 4022774, -10008884, 9215389, 1359894, -7356742, -4494147, 3813931, -468688, 1588601, -7945153, 829466, --14125611, -5944772, -11016054, 6795712, -6253473, -230854, 2042794, -1828046, -2842195, 3340411, -3368865, 9771587, -1347546, -2175401, -7472170, -6401112, 6260989, 1337882, 2170032, 11687680, --3520800, 75699, 6241661, -2799782, 2895882, 2137820, 6247030, 5598490, -3862786, -614717, --7919383, 8252243, -5401995, -7171522, -6871411, 4355634, -2535641, -3783329, 8151848, -2539400, -8449274, -5194226, -3924526, -1084479, 5542119, 7152195, -520228, -7737921, 2816962, -4948876, -10087804, 2079301, 5936719, -8104604, -3551401, 2161979, -2051921, 4872104, 745714, -2764348, -2945274, 6459631, 9148280, 7031399, 132607, -1657857, -83215, 1514513, 168577, -1589138, -1097901, -1339493, -195421, 2594697, 164819, -1286880, 2813204, -899796, -1457068, 721018, -1001801, -58519, -1725503, 637266, -1180579, 243739, -2357400, -2947958, 759672, 1104344, --61203, 2276870, -802622, 1027571, 4663798, -12346420, 4294968, 3688840, 2447595, -9330280, -7118909, 11783243, -11493869, 4388920, -7074885, 4643397, 606127, 4173635, -3420405, -241055, -2692945, -7796440, -3893388, -3351148, 6166500, 6513855, -2151242, 3068754, -1607392, 4817880, -6110128, 2405182, 1833414, -6197638, -2349884, -7743826, -8613557, -5996848, 559420, -2863133, --419833, -3578782, -8577587, -2887292, 1724966, 789200, -539555, 12967580, -10505490, 3878892, --5243082, -1500017, -3275450, -3289408, 5485210, -3274913, 399432, -3969624, -2677912, -4824859, -6587943, -6068789, 5400385, -1403381, 5394479, -483184, 797790, -552977, 5213017, 3034395, --175020, 11246372, 423591, -5623186, 2936684, -5057324, -6243809, -7489886, 7267085, 2586107, -6470905, 6629282, 7740068, 4570382, -959388, -1385664, -1427540, 7476465, -1122597, 8381629, -1760937, -352724, -1304060, 2878165, 4240207, 1120450, 1727114, 592706, -593779, 838592, --1433982, 2256469, 75699, 1935957, -600759, 1837172, -224412, -2922725, 1423245, 2017561, --30602, 1641751, -545461, 95563, -1721745, 1417876, -434329, 695248, 3076807, 3102040, --12988518, -1032403, 1680943, -3008088, -10230612, 11696807, -762357, 426276, 9935870, -2787434, --10240276, 3601867, 6699612, 12686797, -822486, 5355824, 1091459, -11184095, -3290482, -5820218, -5682779, 3230889, 2965675, -4194036, -770947, -483721, 1015760, -3791383, 5291937, 1457068, --4504347, 6544457, 917512, -7353521, -6171331, 1700807, 7928510, 7108708, -9953587, 19442780, --972810, 352187, 5345624, -788127, -2562485, -188979, 12498892, -6273337, 6178311, -1523103, -8650601, 2595771, 7752953, -2962991, -6109591, 4294431, 6628745, -3304441, -7425462, -8077760, --7110319, -3226057, -1439888, 7387881, 178778, 6420439, -776315, -2130841, 6377490, -5577552, --10764262, -2869575, -6874095, -6476274, -11969000, 8921184, 7785165, 3196530, -18559628, 4358855, -3907883, -1392106, -545461, -6476811, 8866960, 4538707, 3510599, 2166811, 8143258, -710280, --583579, 600222, -83752, 1891396, 923418, 36507, 2495913, -1504312, -337692, -1921461, -557272, 645319, 2749853, -1924682, -302258, -756988, 2118493, -982474, 787590, 1253057, -1695438, -1472100, 4068945, -11274, -125091, -1499481, 1588064, -2550674, 898185, 104153, --3725884, -874563, -618475, -7399692, -499827, 576599, 5389647, -7787313, 395137, -1194001, --3250753, -16176457, -1960116, 7652558, 5905580, 7841537, 906238, -8687108, 22981834, 9681930, -15629923, 1647657, -6844568, -2714956, -2221035, -9736691, -615791, -3809099, 4897337, 47782, -505732, -3103651, -4172561, -8227010, 2779918, 838056, 405874, 4283156, -352187, 1834488, --823023, -7141457, -5566278, 4366908, 26307, 10471667, -13195750, 10593537, 6480032, -4625680, --9540196, -14868640, 3153043, 11797738, -6018860, 11421929, -891743, -470836, 2619393, -3304441, --13225815, 1627256, 6257231, 2829847, -5742372, -1462436, -3600793, 2968359, 6419366, -292058, -1642825, -825707, 6181532, -2720325, -2103997, 4261145, -3649112, 9767829, -2592013, -4875862, -3620121, -8751533, -4483946, 124554, 3489124, -3763465, 1643362, -1335735, 1945620, 118648, -2310693, 2054068, -779000, 1250372, -4165582, 2318209, -564251, -5575942, -1954210, -1537598, --3388192, 59056, 985695, -2574296, -1883343, -61740, -3569655, 320512, 915902, -714038, --3778498, 402653, -56371, -2790118, 1176821, 2180770, -2323577, -80531, 679679, 299037, -1101122, 3410204, 2776160, -2789045, -2298344, 2561411, -17788144, 12727599, 11475079, 13552232, --4380867, -12084964, 4214974, 4859756, -18100602, -16432008, 15892990, 1742146, -7815230, 6028524, --11324755, -12836584, 1792612, 33440616, 15489800, 6207839, -9124121, 150861, -3280281, 264141, --3854196, -1858647, -4276177, 1204738, 9479530, 1888712, 11696807, -4649302, -3930969, 2149631, -8161512, -1567663, -1224066, -17485348, -784905, -9847823, -566936, 13558138, 9631464, -3584687, -9413495, 18814104, -8999030, 5434208, 15545634, -11446088, 16433619, -1373316, 6738267, -3906273, -658204, -2226941, 2251100, 3818226, 16303159, -6262599, -2095944, 4248260, -7648263, 4803921, -2491081, -4383551, -7451769, 16094316, -1097364, -8838506, -2952790, 9980430, -4227322, 6774774, --72478, 487479, -10644003, -11559904, -5586142, -9860171, -8936216, -9660455, -610959, -2302103, -4680978, -606664, 831613, -881005, 5898064, 3765613, 410706, -7322919, 258235, -1370632, --5458904, -1556389, -2814814, 2862596, 1082869, -3722663, -1253057, -2854543, -2245194, -262530, -2040110, 1997697, 2087354, 3585224, -2206003, 455803, 2248416, -1558536, -2148021, 2633889, --3708168, -1458678, -1139240, 1661079, 710817, 2667712, 466004, 273804, -1047435, -2679523, -21697638, 3886946, 3074660, -11292006, -6532109, 562641, 2510409, 4384625, 5044439, -21524766, -984084, 1351841, 15555835, 2479807, 3968013, -1484985, 14153528, -23113904, 725313, 11829414, --13748727, 3436511, 2714956, 11139535, 2208150, 1180579, -3766686, 352724, -11800423, 3997541, --2932926, 2088428, 3233574, -2029909, -8944806, 3275986, -7056095, -12317429, 6971806, -6966974, -4594005, -11581379, -7276212, -1230508, -3568044, 2758443, -4896263, 12683575, -122943, 12093554, --12749074, -10802916, -3439195, 171799, -187368, -3760781, 10915659, 8887361, 22739168, -3651796, -14555644, -8517457, -1429687, 4373888, -17209934, 19669340, -497142, 12244952, -453656, -17180942, --10322954, 7226820, -22958210, 11967389, 3336116, 17470316, 22057342, 2862596, -16296180, -12355010, --5059472, 12543452, -1500017, -3040300, 724776, -4600447, 698469, -3367254, -4918812, -1711545, --7931731, -391379, 386010, -3693672, -3294777, -4507568, -3187403, -1546188, 2025077, 3831111, -1447941, -635655, 3521873, -2400887, -1314797, 816581, 1872606, 2237141, -2215666, 2830920, --2893734, -1366337, -4233764, -7431367, 4617627, 797790, -4206384, -4254165, -799938, -5898601, -820876, 62814, 4397510, 11016054, 17063368, 5839545, -7018514, 16094853, -17290464, -1884954, --5290326, 2063195, 13864691, -12594455, 31208842, 4052302, 7753490, -9268003, -12547210, 4265440, -135291, 26402774, -3770981, -9257802, -15111306, -10289131, 7409893, 4652524, 4345970, -1994476, --14874009, -23065048, 1752884, -13937169, 18462990, 2323577, 15000173, -9330816, 6291054, -6062347, -7789460, 21539260, -3556233, -2365990, -3231426, 5567352, 7223062, 3621194, 1619740, 2157684, -9419937, 8364449, -4824322, -7493108, -6640020, -7503308, 24757802, 9691057, -14461692, 11109470, --3259880, -11931419, -8475581, 4298726, 9088151, -16977468, -22028888, 2398739, -9814537, 28923384, -15101642, -5042292, -3253975, 6076842, 13117367, 3282966, -2174327, -3916473, -19966230, -1001264, --4854387, -21787832, 8276402, 13619878, -2172717, 6791417, 3841848, 13893682, -7618735, -2121714, -5063767, -2237678, -6245956, -7174743, -137439, -4356171, -10544682, -2244657, -4828617, 4555350, --2000918, -5913096, 4117263, 1562294, 644782, -3685619, 4109210, 1057099, -6593849, 2257005, -2707440, -3163244, -9177808, -4606890, -1627793, -1053341, -50466, -3541201, -397284, -2640868, -1347546, 1041530, -1746978, 369904, -71404, -2816425, -5657009, -807454, 1297080, 3278134, -1755568, -4373351, -2739116, 1029182, -8122857, -13793287, 7967701, -4635344, 12035035, 5354214, --12809203, -5536213, -6425808, 2692408, -17292612, 11699491, 16588774, -6796786, 10391673, -2587718, --4416300, 7927973, -12076911, 7500624, 13499082, 3604551, 23196582, 11130408, -9545028, 9789304, -4311611, 8593693, 525597, 12340515, 10917270, 16558173, 6393596, -6595459, -7676181, -10386305, --854699, 25728464, 679142, 10832981, -16122770, 33636036, -9875740, -26519276, -12367358, 21203180, -1814087, -3056943, -2789581, -1653562, 15996606, -11748346, 9319005, -2463701, 20109036, 30422864, -15840913, 14617921, -10715943, 17258252, 10623602, 10210748, 11933567, 17256642, -3478387, -30403536, --19306414, -22115860, 5848135, 7742216, 6421513, -5210869, 10388452, 26656178, 2014877, 1976222, -6662031, -1602560, -23333484, -25352656, -8497056, 4915053, 2834142, -1178432, -14295262, 3571265, -859530, 1088774, 7727720, -1774895, 4967667, 1549410, 9506373, -2457795, 6399502, -5049808, -1271847, 879931, 11011222, 4884452, 10992969, 1119913, 5675263, -2042257, 1376537, 4544613, --2844342, -7158100, 1785633, -4308926, -7789460, -6371047, -1572495, -1823214, 10735271, 2110440, -136902, -3315715, 1818919, -45634, -3645354, -4426501, -2997350, 2294050, 6925098, -955630, -796716, 753767, 3204583, 2034741, -6931541, 4402879, 11159399, 13067438, 4746476, 6127845, -10206453, -8047158, 23714126, 9331353, 4596689, -6779606, -18163416, -7350837, 9932112, -1005022, --25746718, 34674344, -12167642, -6815576, 10705206, 507880, -3447785, 2496450, -6720550, -8162586, --1763621, -18893024, 4682051, -20302310, 574452, -16098611, -18094160, -3651259, -3840238, -3990562, --13234405, 5791764, 14190572, 3782793, 10867878, -18846316, 18574122, 33805688, 3511136, -13604309, -21141976, -17355426, -27452894, 45698988, -4682051, 3223373, -3175055, -20467130, 15780784, -18556944, -8029978, 27913530, -551903, 38346540, -29936996, 28880970, 8429947, -19011136, -9944460, 3598646, --18240726, -9117679, 20332376, -19959250, 13242458, -13430363, 7350300, 21210696, -46618648, -20574504, -21475374, -40040368, 14146549, 12382391, 22894324, 20214800, 9117679, -1653562, 13440026, 20050518, --21796960, 21758304, -401043, 7511361, -1143535, 6808597, 1771137, -4170413, 1508607, -6353331, --2071248, 1607928, -1122597, -10996190, 6912750, -1962800, 9002251, 5359583, -7762080, 6107444, -7513509, 5428839, 2265059, 3878356, 2360622, 4949950, -15229417, 8519605, -1988570, -4179540, -10829760, -8714489, -7062000, 3620658, -8993662, -7354058, -8862665, 4904316, -13435731, -40099964, --10435697, 13137231, 30958662, -9863392, 15632607, 424665, 7385197, 16031502, 10386842, 27766964, --7177964, 1169842, 7635915, -24616068, -15817291, -7348689, -7951058, 5645735, 427886, 2069637, --12814572, -2138894, -16967806, -13822279, 6649683, 34289408, 19749334, -9037148, -10968810, 16333224, -19602768, -11685532, 5184563, 15056545, -5956046, 32796370, 11181410, 4802311, -25298968, 15600932, -3227131, 12289512, -2580739, 3158412, -4159676, -5473936, -39898636, 10562398, 27625766, 13618804, -3715147, -793495, 13942538, -22473954, -41447508, 3063922, 55005108, 13210246, 43642236, 41334228, -574989, 3587372, -26277146, -23582054, -2487860, -20233590, 27564026, -60043104, 11368778, -22510460, --47904992, 10624138, 22468048, 47896400, 4329864, 2367601, -30507152, 9948218, 14462229, -21379810, --1959042, 1480153, 22429930, -6036040, -14249628, 33867428, 7215545, -12150999, -394600, -19659676, -2632278, -18611168, -3704409, -678068, -9031779, 2784213, -7285875, -7829189, -4207994, -127238, --3655554, 6231461, 17624936, -1041530, 260919, 6499896, -15846819, -9665824, -1853278, 4760435, -5091147, -13907641, -7776039, 10942503, 6549825, 3769908, 2718178, 11555073, -373662, 134755, -1263794, -7912941, 1489817, -10405632, 29235842, 51306068, 1251983, 14089103, 9154723, -26816166, --7710003, 26946088, 8385387, 11936788, -6811818, 7903277, 4500589, -9418326, 348966, 14031658, -14693083, 18103824, -8029442, -2115808, -39858908, -37226092, 5074504, -22979148, 725850, 20117090, -4772246, 2480881, -6985228, -4362613, 12769475, 31428424, -22832046, -12970264, -3046206, -22025666, --1688459, -21224654, -6705518, -22538378, 19923280, -27332636, -2310693, 5036386, 13211319, 48063368, -63883880, 16662326, -16896938, -34024732, -3091303, -23241678, -9241696, -36193688, 5350993, 35095788, -25736518, 21102784, 2445447, 5191005, 35778152, 34927748, 25508884, -1991254, 16071231, 6069863, -7900056, -41179608, 12370043, 4676146, -9604621, 25001542, 33718716, -4591320, -657130, -16492674, --70618928, -1257352, 20776904, -10139344, 48740900, 34793532, -16208670, 3337190, -18061948, 12254079, -3283503, -6435472, -10844792, -4802311, -1087164, 7693360, 9350144, 14553497, 318364, -8590471, --18896246, 1202054, -8959839, 7289097, -8460012, -11360188, -2944737, -2866891, 8427800, 3677029, --3315715, 4591857, 2379412, 3667902, 750546, -6408091, -10478110, -5150740, 3835406, 8819715, --842350, 7214472, -176094, -10298258, -10921565, 3134789, -13346074, -7348689, -57445, -5709086, --1709934, 3852049, 5348845, -4824859, -12460774, 31922344, 22778896, -15224585, 15429133, 23709830, -2685965, -29725468, -35461936, 33123324, 11289858, 7655243, 26097296, 569083, -11348377, 27988154, -7391102, -21254182, -10766409, -7714298, 9463960, 575526, -12706661, 4902705, -14057965, -1430761, --6334003, -6865505, 19091130, 35537632, -12088185, 7356205, 16775069, -8350490, -7135552, 6851010, -20265266, 6454262, -15520938, -19696720, -23655606, 12681965, 13368623, 32251984, -15267535, -14518600, -11359652, 19204410, 30114164, -882079, -55706264, -11959873, 17999672, 17893908, 8096550, -10917270, --386010, -22321482, 3380139, -9667435, 23199266, 33174864, -10011569, 694711, -19423452, -21111912, --8109435, -42719356, -8563628, -21737904, 18951544, -17405354, 19658066, 24317568, -49372260, -4161287, --20877300, 21122112, -8684424, 7423851, -15343771, 2469606, -13067975, 14536854, 16253230, 27989228, -27075474, 13365401, 26050050, 12041478, 1563905, 13729937, 8871255, -3927748, 11603391, -12917651, -6219650, -6627672, 5385889, -16273094, 9629854, 35433, 7627862, -11997454, -6787659, 7708930, --3119757, -4056060, 13975824, -11054709, -2528662, 11264089, 5590437, -7658464, -2405182, 4555350, -25790204, 13793287, 11241003, 15139760, 1028645, 16462610, 5565204, 4987531, 8638253, -65498, -13865765, 3767223, -23866596, -11230803, -6379637, -11727408, -16201690, -26793616, -6073621, -14905684, --27178554, -41064720, 20088098, 21264384, 12539694, -27438936, -37344740, -28675886, -16259136, 6732898, --1219234, -36371932, -21703544, -24924232, 35325568, 10997264, 15406048, -11102490, -20062866, 44762148, -11103027, 13969381, -8525510, 2662343, 13270912, -9141301, 10560251, -3283503, 21398600, 30171608, -1388348, -24319716, -19468550, 23906324, 16443819, 20944944, 6128919, 5270462, -10697690, -4705674, -3556770, 14646912, 31692564, -239444, -58819576, -54595476, 910533, -13316546, 35492536, 36011152, --39887900, -27003534, -16684874, 49859200, 44536664, -24002424, 7254200, -31443456, -30176978, 18546206, --13781476, 251256, -4470524, -21792664, 15809238, 16101296, 12960601, 50525460, -36764384, -9868224, --3204046, 13019656, 4336307, 20846698, -73593192, -42818140, 15701327, 23270132, 23138600, 6601365, --24103894, -24806658, 718870, 14849313, 42973832, 10496900, -13895830, 4499515, -27314918, 17274358, -15255187, 1000727, 24236500, 51366200, 12643310, -37459632, -19364396, -2522757, 4685273, 24887724, -21879100, 10344966, -10943577, -4458713, -7410429, -8723615, 22683870, -2455111, 2460480, -8698919, -22028888, -9836012, -3727495, -367757, 19194746, 8426189, 7126962, -3750043, -23118736, -8212515, -8144332, 19062676, 3740380, -25916906, -35806604, -29993368, -206158, 4699768, 6138582, 3969087, -49425948, -32813014, 30838402, 30768072, 19640886, -71599256, -28770912, 24052354, -19480898, 13940927, --5122822, -29703994, 19053012, 5794985, 5676336, -13095892, -47438452, -4435628, -1449552, 242666, --6773701, -34497716, 25834766, -21293374, 44123808, -4594542, -3859028, 21559126, 16003585, -21032992, --1957968, -15905338, 23576150, 37204080, 28266790, -31259846, 7022809, -20896626, 18900540, -18141942, --7475928, 3165928, -1595580, 20252918, -18543522, -43428024, 11187316, -15488726, 16243566, 17032230, --55048060, -9271224, -10499584, 2080375, 60956860, -16363825, -44362180, -11716134, 38743288, 18673980, --24024974, -7812009, 24034100, -27380, 29672318, -44557064, -23574002, 26931592, -28016608, -67973224, --20074678, -9201431, 77653544, -21111912, -40119828, 21420612, -46283640, 122176784, 11562589, -113368880, --30205968, -19958176, 80524192, 43666932, -50622096, -26645978, -657667, 59585692, 47456168, -7325604, --37314140, 14698452, -12623983, 53746684, -5196374, -26884884, -22321482, 35233764, -28139552, 18292802, --53884124, -171262, -2064269, -3068217, -3163780, 11397233, -29831232, 28958280, 2397129, 21258478, -855772, -33960844, -26140244, 19452980, 22935126, 36099200, 13449690, -3606699, -23523536, 3204583, -5853504, -6144488, 1542430, 23682986, 3676492, -1054415, -26909580, 5241471, 19115288, 7125888, -788127, -7808788, -19353122, -65553012, 18389976, -1058173, 22408454, 54184232, 17386028, 7450158, --30533996, -12688944, -30515206, -36579164, -12230993, 7173133, 20915954, 27640262, -3083787, 16069083, -19501300, -16987670, -34390876, 18209588, 6564321, -27980102, -9489730, 26543434, -9025874, -2994666, -24320252, 13603772, 10818486, 3361886, 13830868, -13249974, -31948114, -13922673, 9118752, -13120588, --7542500, 11682311, 795643, -22538378, 23476828, 5040681, -20839718, 2646237, -5022965, 20169166, -11251204, -8176544, 9495099, -12475269, -28009092, 3728569, 6826851, -2573222, 74088, 5901822, --12232067, 3843996, -10473278, 6265821, 19996294, -2145873, 8744017, 9217537, -7723425, 474594, --19071802, 6503118, 11258183, -34692060, 20131586, -21646636, 6823630, 979253, -96100, 9528385, -3872987, 22602802, 4132832, 6373195, -3266860, 11551315, -12162811, -8035347, 2805688, 1912871, --10642929, 3807489, -948651, -3124589, -6147172, 2166811, -1211718, 12216498, -3136937, 1430224, -8770860, -6188511, 6094022, -3826279, 2138894, -6194417, -5371394, -6187438, -1617055, -2804614, -4632122, 3265249, -14354318, -3966939, -4194036, 9951976, -5923834, 3692598, 1716913, -16037408, -5320391, 10331007, 681289, -3947075, 1730335, -4752918, -2369211, 53062712, -1931662, -1765768, --14733885, -14492293, 10923176, -644245, 9456444, 162672, -5185636, -7016903, 3596498, -9820980, -9954660, -9249749, 14504105, -11741904, 8451959, -9940702, -2211908, -1613297, -9245454, -7082401, -2091112, -4188130, -2919504, -85899, -6951942, 904628, -1380832, 2201171, -1634772, 4039417, --13937706, 12680354, -4771709, -4175782, 9622337, -7738458, 515396, -9660992, -8449274, 6135361, -5418101, -6792491, -4381404, 2717641, -438624, -11811160, 3019362, 2063195, -11274, 7736310, --2876018, -3339874, -3184182, -8067559, -2194728, 8443369, -8993662, 2307471, -4362613, -1114544, -572304, -2741800, 1978906, 42950, 5905043, -8595840, -746251, 5540508, -11094437, 6456410, --4999879, 69256, 5063767, -2463164, -5057861, 2282775, -900333, -1453846, -379031, -3613678, --95026, 3743064, -249645, -1765232, 650688, -3131568, 2158221, 1576253, 916976, -2529199, --761820, 3243237, -4155381, 4138738, -1902671, 1798518, 4600984, -5548561, 1319092, 370441, --7000797, 1269700, -2234457, 2878702, -998043, 207769, 4233227, -2798708, 808528, -4506495, -768262, 646393, -1130113, -1090385, -547071, -1627256, 311922, -824634, 178241, 3115999, --4567698, 1991791, -24917790, -42071352, 15599858, 134742784, 33703684, 74294344, -2939905, -72384696, --23528368, -71231496, -60878476, -21531208, -14697915, -4994510, 40325448, 54178864, 71619120, 90486368, -39031588, -23211078, -41968272, -88926224, -84546968, -34493956, -28285044, -18869938, 36458368, 49733036, -29701310, 46104328, 55294484, 18677740, 15121506, 10293426, -28742994, -13253195, -20601348, -44813688, --24767466, -33312304, -49348100, -26882200, 6044630, 5217849, 27468464, 66728224, 45624364, 37962680, -36983428, 11339251, 2673617, -3862786, -19291920, -27497992, -34785476, -49700824, -43947716, -24603720, --7763691, -16833588, 13779329, 25659746, 21796960, 37652904, 41984916, 26928908, 24391120, 23833848, --3791383, -11799886, -5958731, -34308736, -28424094, -7332046, -28135258, -30109332, -19083076, -27092654, --13190918, 7634841, 17203492, 31152472, 50001472, 30964030, 28713466, 31755914, 11715597, -3879966, --5873368, -17193828, -28355374, -29469918, -28071906, -30815854, -21428666, -19755238, -16398722, -6837051, -7608535, 18880140, 29344290, 44281648, 46665892, 45452028, 38643968, 12141873, -10161893, -20864952, --33481418, -44344464, -50033684, -50003084, -39577588, -22399866, -5398774, 13573170, 40905804, 45449880, -45578192, 47685412, 39457864, 20635170, 6519224, -11373610, -31998044, -44806172, -39498128, -37031208, --29146722, -13701483, 1115081, 10712185, 21919366, 24741696, 24450176, 19325742, 8734353, 3875134, -1481764, -3832185, -4310537, -4444218, -5719286, -7172059, -5539971, -7909719, -5350993, -4576825, --3178276, -4049617, -1530619, -928787, 1657321, 1683090, 3795141, 3054259, 2889976, 344671, -848793, -466541, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +5177583, -3042448, 206695, 171262, -3719979, 4968204, -1986959, -1937567, 1413044, -5119601, +-2303176, 5493263, 1240709, -2234994, 3896072, 1211181, 828929, -801011, 1896765, -30065, +-6574521, -310848, -2443837, -292058, -149250, -6285685, 91268, -4039954, 213675, 637803, +2801929, 3360275, 1102196, 836445, 610959, 2903398, -1593970, 994285, 179852, 457951, +600759, -868657, 2587181, 3878892, -7452305, 3462818, -1952063, -4476967, -2869038, 5717139, +2861522, -1927367, 3241627, 947040, -2051921, 2016487, 40265, 0, 296890, 393526, +-779000, 46708, 420370, -326954, 2454037, -1524177, -3442416, -3330210, -22012, 1124208, +-212601, 163209, 1877438, -737124, 3296924, -3481071, -1040456, 2685965, 2895345, -1988033, +3264175, 1151588, -845035, -2199560, -1021129, -937377, -877247, -868657, -433792, -121333, +-478889, -915365, 281320, 662499, -1309965, -339302, -420370, 684510, -1138703, -256624, +164283, 2767570, 198642, -2206003, 1379221, -1188095, -1768990, 435402, -3721589, -444529, +-2790655, 977105, 1734093, 1672890, 1323924, -2901787, -211527, -2404645, 2567317, -4961224, +-2822867, 2502892, -5444945, -615254, -367220, 1385664, 1184874, 2670933, 5633924, 2601140, +-712965, -21475, -2029372, -1576253, -9976672, -9179419, -624918, 6787659, -1698123, 5420786, +463320, 1546725, -1698660, -7719667, 3978214, 1216550, -2333241, 1895691, -4101694, -837519, +2304787, 1015760, 7221988, -4969277, 4377109, -2280628, -5710159, -2652142, -1566053, -1570884, +2005750, 1696512, -4605816, -2055142, -2627983, -983011, 4424353, 4728222, 5081483, -3738769, +627065, -2347200, -316754, -1975148, -2520609, -3056406, -3432753, 1884954, 531502, -533113, +-1250909, 447213, 1921998, -1968169, -1728724, -885300, 2202781, -770947, -424128, -967978, +-1120450, -282394, 480499, -32212, -187905, 364535, 482647, -147103, -214748, 1409286, +-1116155, -708670, 541166, -687732, 1090385, -689342, -758599, -155156, -139050, 681289, +-359167, -347892, 408559, 85899, -1111323, 357019, 259309, 3708704, -3513820, -4534949, +-3939022, 117575, -1560147, -1253594, -3118146, 678068, -3482682, -248571, -1437203, 5337571, +-3439195, -3758633, -8400956, -10890963, -2643552, -4852776, -4474282, -1062468, 2248416, -2761664, +-6545530, 4059281, -9490267, 2855080, -1600949, -1698123, 6123013, 4330401, 2259690, 855772, +-1065152, -968515, -2314987, 1000727, 4152160, -3339874, 3936875, 3655554, 1050656, 551903, +1633161, 2804614, -6175626, -2660732, 5869610, -4543002, 374736, -75699, 3586835, -433255, +-1379221, 699006, 6090264, 3397319, 2114198, 1988570, 3390340, -5364414, 4151623, -4373888, +3843996, 2561411, -1151051, -747861, -1841467, -2388002, -3930432, -173409, -1232656, -3099356, +-3468723, -1920924, -2020782, -323196, -240518, -921807, 4624069, -1884417, -874563, -3119757, +3203509, 46171, -716723, 711354, -1356136, -2239826, 44023, 1309965, -158914, -191126, +-1479079, 454730, -492311, -1295470, 81068, 326418, 724776, -136365, 474057, 434865, +1082332, 408559, -1191853, 82678, 608812, -140660, -1045825, -620086, 1521492, 821949, +-827855, -328028, -331249, 2185602, -5772973, -137976, -2709051, -5302137, -2465848, -986769, +-3696893, -1248762, -3410741, -1330903, 2685965, 3613678, -5990406, -3408057, 1962263, -1193464, +-6544994, 4353486, 7795903, 1634235, -1836635, -3644817, 862215, 3765076, 7052337, -3586298, +-1494112, -4521527, -3625489, 3897683, 3912715, -5487895, 3223373, -1754494, -3500935, 5544803, +-14496, 3023657, -7596187, 522375, -4871030, 1101122, -6051609, -3801046, -988916, -1414118, +12621835, 4005057, 3272765, 2462090, -9397388, 5253282, 3656091, -2077154, -236223, 4095788, +-581968, 4327717, 5011690, 4982699, -2891050, 363462, -1613834, 2651069, -2369211, -2507724, +1650341, -2355790, 1112933, 1557999, 86436, 2933463, 1164473, -5575405, -673773, -712965, +1751810, -6319508, -2030446, -1606318, 4454418, -1359894, -740345, -3417720, -903017, 219043, +-321049, -1594507, 46171, -1036698, 1152125, 403190, 10201, 180926, 425202, -821949, +-2349884, 1240709, 526134, -1357210, 652835, -744640, 281320, 285078, 843424, -194347, +-281857, -595927, 540092, -978179, 918586, -1112397, -56371, -97174, 733366, -740882, +-284005, -1073742, -615791, -991601, -7810398, -4358855, 3197603, -3422552, 9165997, 4029753, +8973797, -139586, -4384088, -4676683, -6294812, 9576166, -2345052, 4373351, 4894652, 1009317, +3446711, 3122441, 3048890, 1209570, -6323803, -365072, -2442763, -951872, 4339528, -397821, +-386010, 3018288, 1911261, 3126199, -2747169, -9982578, -5950677, -3784940, 7348689, -6644315, +-2007360, 4494147, -505196, 831076, -5566815, 9654550, 528818, -3769371, 7631083, -4693863, +11820287, 6100464, -2665564, 1361505, -3365107, -2308545, -10885595, 3852049, -4957466, -777389, +-423054, -2389613, 4669167, -1826435, -4750234, -4638565, 1082332, -4238596, -4658429, 2657511, +417149, 3355443, -1816234, -9943386, 3438658, 4315906, 5561446, -5351530, -6011881, 780610, +9859097, 1583232, -5085778, -2336462, -855235, 2699924, 501974, 2875481, -2888903, -1100585, +-559420, -3565360, -2908230, 4379256, -717796, 1717987, -367757, -1247151, -2774012, -267362, +124554, 1089848, -504659, 1013612, -705448, -2266132, -891743, -311922, -33286, -408022, +1726040, 99321, 1867774, -620086, -109522, -284005, -1987496, -2684, 1066763, 1044751, +7885023, -7255274, 3623342, 9255118, -6672769, 1830730, -3749507, -7276749, 10769094, 4022774, +10008884, 9215389, 1359894, -7356742, -4494147, 3813931, -468688, 1588601, -7945153, 829466, +-14125611, -5944772, -11016054, 6795712, -6253473, -230854, 2042794, -1828046, -2842195, 3340411, +3368865, 9771587, -1347546, -2175401, -7472170, -6401112, 6260989, 1337882, 2170032, 11687680, +-3520800, 75699, 6241661, -2799782, 2895882, 2137820, 6247030, 5598490, -3862786, -614717, +-7919383, 8252243, -5401995, -7171522, -6871411, 4355634, -2535641, -3783329, 8151848, -2539400, +8449274, -5194226, -3924526, -1084479, 5542119, 7152195, -520228, -7737921, 2816962, -4948876, +10087804, 2079301, 5936719, -8104604, -3551401, 2161979, -2051921, 4872104, 745714, -2764348, +2945274, 6459631, 9148280, 7031399, 132607, -1657857, -83215, 1514513, 168577, -1589138, +1097901, -1339493, -195421, 2594697, 164819, -1286880, 2813204, -899796, -1457068, 721018, +1001801, -58519, -1725503, 637266, -1180579, 243739, -2357400, -2947958, 759672, 1104344, +-61203, 2276870, -802622, 1027571, 4663798, -12346420, 4294968, 3688840, 2447595, -9330280, +7118909, 11783243, -11493869, 4388920, -7074885, 4643397, 606127, 4173635, -3420405, -241055, +2692945, -7796440, -3893388, -3351148, 6166500, 6513855, -2151242, 3068754, -1607392, 4817880, +6110128, 2405182, 1833414, -6197638, -2349884, -7743826, -8613557, -5996848, 559420, -2863133, +-419833, -3578782, -8577587, -2887292, 1724966, 789200, -539555, 12967580, -10505490, 3878892, +-5243082, -1500017, -3275450, -3289408, 5485210, -3274913, 399432, -3969624, -2677912, -4824859, +6587943, -6068789, 5400385, -1403381, 5394479, -483184, 797790, -552977, 5213017, 3034395, +-175020, 11246372, 423591, -5623186, 2936684, -5057324, -6243809, -7489886, 7267085, 2586107, +6470905, 6629282, 7740068, 4570382, -959388, -1385664, -1427540, 7476465, -1122597, 8381629, +1760937, -352724, -1304060, 2878165, 4240207, 1120450, 1727114, 592706, -593779, 838592, +-1433982, 2256469, 75699, 1935957, -600759, 1837172, -224412, -2922725, 1423245, 2017561, +-30602, 1641751, -545461, 95563, -1721745, 1417876, -434329, 695248, 3076807, 3102040, +-12988518, -1032403, 1680943, -3008088, -10230612, 11696807, -762357, 426276, 9935870, -2787434, +-10240276, 3601867, 6699612, 12686797, -822486, 5355824, 1091459, -11184095, -3290482, -5820218, +5682779, 3230889, 2965675, -4194036, -770947, -483721, 1015760, -3791383, 5291937, 1457068, +-4504347, 6544457, 917512, -7353521, -6171331, 1700807, 7928510, 7108708, -9953587, 19442780, +-972810, 352187, 5345624, -788127, -2562485, -188979, 12498892, -6273337, 6178311, -1523103, +8650601, 2595771, 7752953, -2962991, -6109591, 4294431, 6628745, -3304441, -7425462, -8077760, +-7110319, -3226057, -1439888, 7387881, 178778, 6420439, -776315, -2130841, 6377490, -5577552, +-10764262, -2869575, -6874095, -6476274, -11969000, 8921184, 7785165, 3196530, -18559628, 4358855, +3907883, -1392106, -545461, -6476811, 8866960, 4538707, 3510599, 2166811, 8143258, -710280, +-583579, 600222, -83752, 1891396, 923418, 36507, 2495913, -1504312, -337692, -1921461, +557272, 645319, 2749853, -1924682, -302258, -756988, 2118493, -982474, 787590, 1253057, +1695438, -1472100, 4068945, -11274, -125091, -1499481, 1588064, -2550674, 898185, 104153, +-3725884, -874563, -618475, -7399692, -499827, 576599, 5389647, -7787313, 395137, -1194001, +-3250753, -16176457, -1960116, 7652558, 5905580, 7841537, 906238, -8687108, 22981834, 9681930, +15629923, 1647657, -6844568, -2714956, -2221035, -9736691, -615791, -3809099, 4897337, 47782, +505732, -3103651, -4172561, -8227010, 2779918, 838056, 405874, 4283156, -352187, 1834488, +-823023, -7141457, -5566278, 4366908, 26307, 10471667, -13195750, 10593537, 6480032, -4625680, +-9540196, -14868640, 3153043, 11797738, -6018860, 11421929, -891743, -470836, 2619393, -3304441, +-13225815, 1627256, 6257231, 2829847, -5742372, -1462436, -3600793, 2968359, 6419366, -292058, +1642825, -825707, 6181532, -2720325, -2103997, 4261145, -3649112, 9767829, -2592013, -4875862, +3620121, -8751533, -4483946, 124554, 3489124, -3763465, 1643362, -1335735, 1945620, 118648, +2310693, 2054068, -779000, 1250372, -4165582, 2318209, -564251, -5575942, -1954210, -1537598, +-3388192, 59056, 985695, -2574296, -1883343, -61740, -3569655, 320512, 915902, -714038, +-3778498, 402653, -56371, -2790118, 1176821, 2180770, -2323577, -80531, 679679, 299037, +1101122, 3410204, 2776160, -2789045, -2298344, 2561411, -17788144, 12727599, 11475079, 13552232, +-4380867, -12084964, 4214974, 4859756, -18100602, -16432008, 15892990, 1742146, -7815230, 6028524, +-11324755, -12836584, 1792612, 33440616, 15489800, 6207839, -9124121, 150861, -3280281, 264141, +-3854196, -1858647, -4276177, 1204738, 9479530, 1888712, 11696807, -4649302, -3930969, 2149631, +8161512, -1567663, -1224066, -17485348, -784905, -9847823, -566936, 13558138, 9631464, -3584687, +9413495, 18814104, -8999030, 5434208, 15545634, -11446088, 16433619, -1373316, 6738267, -3906273, +658204, -2226941, 2251100, 3818226, 16303159, -6262599, -2095944, 4248260, -7648263, 4803921, +2491081, -4383551, -7451769, 16094316, -1097364, -8838506, -2952790, 9980430, -4227322, 6774774, +-72478, 487479, -10644003, -11559904, -5586142, -9860171, -8936216, -9660455, -610959, -2302103, +4680978, -606664, 831613, -881005, 5898064, 3765613, 410706, -7322919, 258235, -1370632, +-5458904, -1556389, -2814814, 2862596, 1082869, -3722663, -1253057, -2854543, -2245194, -262530, +2040110, 1997697, 2087354, 3585224, -2206003, 455803, 2248416, -1558536, -2148021, 2633889, +-3708168, -1458678, -1139240, 1661079, 710817, 2667712, 466004, 273804, -1047435, -2679523, +21697638, 3886946, 3074660, -11292006, -6532109, 562641, 2510409, 4384625, 5044439, -21524766, +984084, 1351841, 15555835, 2479807, 3968013, -1484985, 14153528, -23113904, 725313, 11829414, +-13748727, 3436511, 2714956, 11139535, 2208150, 1180579, -3766686, 352724, -11800423, 3997541, +-2932926, 2088428, 3233574, -2029909, -8944806, 3275986, -7056095, -12317429, 6971806, -6966974, +4594005, -11581379, -7276212, -1230508, -3568044, 2758443, -4896263, 12683575, -122943, 12093554, +-12749074, -10802916, -3439195, 171799, -187368, -3760781, 10915659, 8887361, 22739168, -3651796, +14555644, -8517457, -1429687, 4373888, -17209934, 19669340, -497142, 12244952, -453656, -17180942, +-10322954, 7226820, -22958210, 11967389, 3336116, 17470316, 22057342, 2862596, -16296180, -12355010, +-5059472, 12543452, -1500017, -3040300, 724776, -4600447, 698469, -3367254, -4918812, -1711545, +-7931731, -391379, 386010, -3693672, -3294777, -4507568, -3187403, -1546188, 2025077, 3831111, +1447941, -635655, 3521873, -2400887, -1314797, 816581, 1872606, 2237141, -2215666, 2830920, +-2893734, -1366337, -4233764, -7431367, 4617627, 797790, -4206384, -4254165, -799938, -5898601, +820876, 62814, 4397510, 11016054, 17063368, 5839545, -7018514, 16094853, -17290464, -1884954, +-5290326, 2063195, 13864691, -12594455, 31208842, 4052302, 7753490, -9268003, -12547210, 4265440, +135291, 26402774, -3770981, -9257802, -15111306, -10289131, 7409893, 4652524, 4345970, -1994476, +-14874009, -23065048, 1752884, -13937169, 18462990, 2323577, 15000173, -9330816, 6291054, -6062347, +7789460, 21539260, -3556233, -2365990, -3231426, 5567352, 7223062, 3621194, 1619740, 2157684, +9419937, 8364449, -4824322, -7493108, -6640020, -7503308, 24757802, 9691057, -14461692, 11109470, +-3259880, -11931419, -8475581, 4298726, 9088151, -16977468, -22028888, 2398739, -9814537, 28923384, +15101642, -5042292, -3253975, 6076842, 13117367, 3282966, -2174327, -3916473, -19966230, -1001264, +-4854387, -21787832, 8276402, 13619878, -2172717, 6791417, 3841848, 13893682, -7618735, -2121714, +5063767, -2237678, -6245956, -7174743, -137439, -4356171, -10544682, -2244657, -4828617, 4555350, +-2000918, -5913096, 4117263, 1562294, 644782, -3685619, 4109210, 1057099, -6593849, 2257005, +2707440, -3163244, -9177808, -4606890, -1627793, -1053341, -50466, -3541201, -397284, -2640868, +1347546, 1041530, -1746978, 369904, -71404, -2816425, -5657009, -807454, 1297080, 3278134, +1755568, -4373351, -2739116, 1029182, -8122857, -13793287, 7967701, -4635344, 12035035, 5354214, +-12809203, -5536213, -6425808, 2692408, -17292612, 11699491, 16588774, -6796786, 10391673, -2587718, +-4416300, 7927973, -12076911, 7500624, 13499082, 3604551, 23196582, 11130408, -9545028, 9789304, +4311611, 8593693, 525597, 12340515, 10917270, 16558173, 6393596, -6595459, -7676181, -10386305, +-854699, 25728464, 679142, 10832981, -16122770, 33636036, -9875740, -26519276, -12367358, 21203180, +1814087, -3056943, -2789581, -1653562, 15996606, -11748346, 9319005, -2463701, 20109036, 30422864, +15840913, 14617921, -10715943, 17258252, 10623602, 10210748, 11933567, 17256642, -3478387, -30403536, +-19306414, -22115860, 5848135, 7742216, 6421513, -5210869, 10388452, 26656178, 2014877, 1976222, +6662031, -1602560, -23333484, -25352656, -8497056, 4915053, 2834142, -1178432, -14295262, 3571265, +859530, 1088774, 7727720, -1774895, 4967667, 1549410, 9506373, -2457795, 6399502, -5049808, +1271847, 879931, 11011222, 4884452, 10992969, 1119913, 5675263, -2042257, 1376537, 4544613, +-2844342, -7158100, 1785633, -4308926, -7789460, -6371047, -1572495, -1823214, 10735271, 2110440, +136902, -3315715, 1818919, -45634, -3645354, -4426501, -2997350, 2294050, 6925098, -955630, +796716, 753767, 3204583, 2034741, -6931541, 4402879, 11159399, 13067438, 4746476, 6127845, +10206453, -8047158, 23714126, 9331353, 4596689, -6779606, -18163416, -7350837, 9932112, -1005022, +-25746718, 34674344, -12167642, -6815576, 10705206, 507880, -3447785, 2496450, -6720550, -8162586, +-1763621, -18893024, 4682051, -20302310, 574452, -16098611, -18094160, -3651259, -3840238, -3990562, +-13234405, 5791764, 14190572, 3782793, 10867878, -18846316, 18574122, 33805688, 3511136, -13604309, +21141976, -17355426, -27452894, 45698988, -4682051, 3223373, -3175055, -20467130, 15780784, -18556944, +8029978, 27913530, -551903, 38346540, -29936996, 28880970, 8429947, -19011136, -9944460, 3598646, +-18240726, -9117679, 20332376, -19959250, 13242458, -13430363, 7350300, 21210696, -46618648, -20574504, +21475374, -40040368, 14146549, 12382391, 22894324, 20214800, 9117679, -1653562, 13440026, 20050518, +-21796960, 21758304, -401043, 7511361, -1143535, 6808597, 1771137, -4170413, 1508607, -6353331, +-2071248, 1607928, -1122597, -10996190, 6912750, -1962800, 9002251, 5359583, -7762080, 6107444, +7513509, 5428839, 2265059, 3878356, 2360622, 4949950, -15229417, 8519605, -1988570, -4179540, +10829760, -8714489, -7062000, 3620658, -8993662, -7354058, -8862665, 4904316, -13435731, -40099964, +-10435697, 13137231, 30958662, -9863392, 15632607, 424665, 7385197, 16031502, 10386842, 27766964, +-7177964, 1169842, 7635915, -24616068, -15817291, -7348689, -7951058, 5645735, 427886, 2069637, +-12814572, -2138894, -16967806, -13822279, 6649683, 34289408, 19749334, -9037148, -10968810, 16333224, +19602768, -11685532, 5184563, 15056545, -5956046, 32796370, 11181410, 4802311, -25298968, 15600932, +3227131, 12289512, -2580739, 3158412, -4159676, -5473936, -39898636, 10562398, 27625766, 13618804, +3715147, -793495, 13942538, -22473954, -41447508, 3063922, 55005108, 13210246, 43642236, 41334228, +574989, 3587372, -26277146, -23582054, -2487860, -20233590, 27564026, -60043104, 11368778, -22510460, +-47904992, 10624138, 22468048, 47896400, 4329864, 2367601, -30507152, 9948218, 14462229, -21379810, +-1959042, 1480153, 22429930, -6036040, -14249628, 33867428, 7215545, -12150999, -394600, -19659676, +2632278, -18611168, -3704409, -678068, -9031779, 2784213, -7285875, -7829189, -4207994, -127238, +-3655554, 6231461, 17624936, -1041530, 260919, 6499896, -15846819, -9665824, -1853278, 4760435, +5091147, -13907641, -7776039, 10942503, 6549825, 3769908, 2718178, 11555073, -373662, 134755, +1263794, -7912941, 1489817, -10405632, 29235842, 51306068, 1251983, 14089103, 9154723, -26816166, +-7710003, 26946088, 8385387, 11936788, -6811818, 7903277, 4500589, -9418326, 348966, 14031658, +14693083, 18103824, -8029442, -2115808, -39858908, -37226092, 5074504, -22979148, 725850, 20117090, +4772246, 2480881, -6985228, -4362613, 12769475, 31428424, -22832046, -12970264, -3046206, -22025666, +-1688459, -21224654, -6705518, -22538378, 19923280, -27332636, -2310693, 5036386, 13211319, 48063368, +63883880, 16662326, -16896938, -34024732, -3091303, -23241678, -9241696, -36193688, 5350993, 35095788, +25736518, 21102784, 2445447, 5191005, 35778152, 34927748, 25508884, -1991254, 16071231, 6069863, +7900056, -41179608, 12370043, 4676146, -9604621, 25001542, 33718716, -4591320, -657130, -16492674, +-70618928, -1257352, 20776904, -10139344, 48740900, 34793532, -16208670, 3337190, -18061948, 12254079, +3283503, -6435472, -10844792, -4802311, -1087164, 7693360, 9350144, 14553497, 318364, -8590471, +-18896246, 1202054, -8959839, 7289097, -8460012, -11360188, -2944737, -2866891, 8427800, 3677029, +-3315715, 4591857, 2379412, 3667902, 750546, -6408091, -10478110, -5150740, 3835406, 8819715, +-842350, 7214472, -176094, -10298258, -10921565, 3134789, -13346074, -7348689, -57445, -5709086, +-1709934, 3852049, 5348845, -4824859, -12460774, 31922344, 22778896, -15224585, 15429133, 23709830, +2685965, -29725468, -35461936, 33123324, 11289858, 7655243, 26097296, 569083, -11348377, 27988154, +7391102, -21254182, -10766409, -7714298, 9463960, 575526, -12706661, 4902705, -14057965, -1430761, +-6334003, -6865505, 19091130, 35537632, -12088185, 7356205, 16775069, -8350490, -7135552, 6851010, +20265266, 6454262, -15520938, -19696720, -23655606, 12681965, 13368623, 32251984, -15267535, -14518600, +11359652, 19204410, 30114164, -882079, -55706264, -11959873, 17999672, 17893908, 8096550, -10917270, +-386010, -22321482, 3380139, -9667435, 23199266, 33174864, -10011569, 694711, -19423452, -21111912, +-8109435, -42719356, -8563628, -21737904, 18951544, -17405354, 19658066, 24317568, -49372260, -4161287, +-20877300, 21122112, -8684424, 7423851, -15343771, 2469606, -13067975, 14536854, 16253230, 27989228, +27075474, 13365401, 26050050, 12041478, 1563905, 13729937, 8871255, -3927748, 11603391, -12917651, +6219650, -6627672, 5385889, -16273094, 9629854, 35433, 7627862, -11997454, -6787659, 7708930, +-3119757, -4056060, 13975824, -11054709, -2528662, 11264089, 5590437, -7658464, -2405182, 4555350, +25790204, 13793287, 11241003, 15139760, 1028645, 16462610, 5565204, 4987531, 8638253, -65498, +13865765, 3767223, -23866596, -11230803, -6379637, -11727408, -16201690, -26793616, -6073621, -14905684, +-27178554, -41064720, 20088098, 21264384, 12539694, -27438936, -37344740, -28675886, -16259136, 6732898, +-1219234, -36371932, -21703544, -24924232, 35325568, 10997264, 15406048, -11102490, -20062866, 44762148, +11103027, 13969381, -8525510, 2662343, 13270912, -9141301, 10560251, -3283503, 21398600, 30171608, +1388348, -24319716, -19468550, 23906324, 16443819, 20944944, 6128919, 5270462, -10697690, -4705674, +3556770, 14646912, 31692564, -239444, -58819576, -54595476, 910533, -13316546, 35492536, 36011152, +-39887900, -27003534, -16684874, 49859200, 44536664, -24002424, 7254200, -31443456, -30176978, 18546206, +-13781476, 251256, -4470524, -21792664, 15809238, 16101296, 12960601, 50525460, -36764384, -9868224, +-3204046, 13019656, 4336307, 20846698, -73593192, -42818140, 15701327, 23270132, 23138600, 6601365, +-24103894, -24806658, 718870, 14849313, 42973832, 10496900, -13895830, 4499515, -27314918, 17274358, +15255187, 1000727, 24236500, 51366200, 12643310, -37459632, -19364396, -2522757, 4685273, 24887724, +21879100, 10344966, -10943577, -4458713, -7410429, -8723615, 22683870, -2455111, 2460480, -8698919, +22028888, -9836012, -3727495, -367757, 19194746, 8426189, 7126962, -3750043, -23118736, -8212515, +8144332, 19062676, 3740380, -25916906, -35806604, -29993368, -206158, 4699768, 6138582, 3969087, +49425948, -32813014, 30838402, 30768072, 19640886, -71599256, -28770912, 24052354, -19480898, 13940927, +-5122822, -29703994, 19053012, 5794985, 5676336, -13095892, -47438452, -4435628, -1449552, 242666, +-6773701, -34497716, 25834766, -21293374, 44123808, -4594542, -3859028, 21559126, 16003585, -21032992, +-1957968, -15905338, 23576150, 37204080, 28266790, -31259846, 7022809, -20896626, 18900540, -18141942, +-7475928, 3165928, -1595580, 20252918, -18543522, -43428024, 11187316, -15488726, 16243566, 17032230, +-55048060, -9271224, -10499584, 2080375, 60956860, -16363825, -44362180, -11716134, 38743288, 18673980, +-24024974, -7812009, 24034100, -27380, 29672318, -44557064, -23574002, 26931592, -28016608, -67973224, +-20074678, -9201431, 77653544, -21111912, -40119828, 21420612, -46283640, 122176784, 11562589, -113368880, +-30205968, -19958176, 80524192, 43666932, -50622096, -26645978, -657667, 59585692, 47456168, -7325604, +-37314140, 14698452, -12623983, 53746684, -5196374, -26884884, -22321482, 35233764, -28139552, 18292802, +-53884124, -171262, -2064269, -3068217, -3163780, 11397233, -29831232, 28958280, 2397129, 21258478, +855772, -33960844, -26140244, 19452980, 22935126, 36099200, 13449690, -3606699, -23523536, 3204583, +5853504, -6144488, 1542430, 23682986, 3676492, -1054415, -26909580, 5241471, 19115288, 7125888, +788127, -7808788, -19353122, -65553012, 18389976, -1058173, 22408454, 54184232, 17386028, 7450158, +-30533996, -12688944, -30515206, -36579164, -12230993, 7173133, 20915954, 27640262, -3083787, 16069083, +19501300, -16987670, -34390876, 18209588, 6564321, -27980102, -9489730, 26543434, -9025874, -2994666, +24320252, 13603772, 10818486, 3361886, 13830868, -13249974, -31948114, -13922673, 9118752, -13120588, +-7542500, 11682311, 795643, -22538378, 23476828, 5040681, -20839718, 2646237, -5022965, 20169166, +11251204, -8176544, 9495099, -12475269, -28009092, 3728569, 6826851, -2573222, 74088, 5901822, +-12232067, 3843996, -10473278, 6265821, 19996294, -2145873, 8744017, 9217537, -7723425, 474594, +-19071802, 6503118, 11258183, -34692060, 20131586, -21646636, 6823630, 979253, -96100, 9528385, +3872987, 22602802, 4132832, 6373195, -3266860, 11551315, -12162811, -8035347, 2805688, 1912871, +-10642929, 3807489, -948651, -3124589, -6147172, 2166811, -1211718, 12216498, -3136937, 1430224, +8770860, -6188511, 6094022, -3826279, 2138894, -6194417, -5371394, -6187438, -1617055, -2804614, +4632122, 3265249, -14354318, -3966939, -4194036, 9951976, -5923834, 3692598, 1716913, -16037408, +5320391, 10331007, 681289, -3947075, 1730335, -4752918, -2369211, 53062712, -1931662, -1765768, +-14733885, -14492293, 10923176, -644245, 9456444, 162672, -5185636, -7016903, 3596498, -9820980, +9954660, -9249749, 14504105, -11741904, 8451959, -9940702, -2211908, -1613297, -9245454, -7082401, +2091112, -4188130, -2919504, -85899, -6951942, 904628, -1380832, 2201171, -1634772, 4039417, +-13937706, 12680354, -4771709, -4175782, 9622337, -7738458, 515396, -9660992, -8449274, 6135361, +5418101, -6792491, -4381404, 2717641, -438624, -11811160, 3019362, 2063195, -11274, 7736310, +-2876018, -3339874, -3184182, -8067559, -2194728, 8443369, -8993662, 2307471, -4362613, -1114544, +572304, -2741800, 1978906, 42950, 5905043, -8595840, -746251, 5540508, -11094437, 6456410, +-4999879, 69256, 5063767, -2463164, -5057861, 2282775, -900333, -1453846, -379031, -3613678, +-95026, 3743064, -249645, -1765232, 650688, -3131568, 2158221, 1576253, 916976, -2529199, +-761820, 3243237, -4155381, 4138738, -1902671, 1798518, 4600984, -5548561, 1319092, 370441, +-7000797, 1269700, -2234457, 2878702, -998043, 207769, 4233227, -2798708, 808528, -4506495, +768262, 646393, -1130113, -1090385, -547071, -1627256, 311922, -824634, 178241, 3115999, +-4567698, 1991791, -24917790, -42071352, 15599858, 134742784, 33703684, 74294344, -2939905, -72384696, +-23528368, -71231496, -60878476, -21531208, -14697915, -4994510, 40325448, 54178864, 71619120, 90486368, +39031588, -23211078, -41968272, -88926224, -84546968, -34493956, -28285044, -18869938, 36458368, 49733036, +29701310, 46104328, 55294484, 18677740, 15121506, 10293426, -28742994, -13253195, -20601348, -44813688, +-24767466, -33312304, -49348100, -26882200, 6044630, 5217849, 27468464, 66728224, 45624364, 37962680, +36983428, 11339251, 2673617, -3862786, -19291920, -27497992, -34785476, -49700824, -43947716, -24603720, +-7763691, -16833588, 13779329, 25659746, 21796960, 37652904, 41984916, 26928908, 24391120, 23833848, +-3791383, -11799886, -5958731, -34308736, -28424094, -7332046, -28135258, -30109332, -19083076, -27092654, +-13190918, 7634841, 17203492, 31152472, 50001472, 30964030, 28713466, 31755914, 11715597, -3879966, +-5873368, -17193828, -28355374, -29469918, -28071906, -30815854, -21428666, -19755238, -16398722, -6837051, +7608535, 18880140, 29344290, 44281648, 46665892, 45452028, 38643968, 12141873, -10161893, -20864952, +-33481418, -44344464, -50033684, -50003084, -39577588, -22399866, -5398774, 13573170, 40905804, 45449880, +45578192, 47685412, 39457864, 20635170, 6519224, -11373610, -31998044, -44806172, -39498128, -37031208, +-29146722, -13701483, 1115081, 10712185, 21919366, 24741696, 24450176, 19325742, 8734353, 3875134, +1481764, -3832185, -4310537, -4444218, -5719286, -7172059, -5539971, -7909719, -5350993, -4576825, +-3178276, -4049617, -1530619, -928787, 1657321, 1683090, 3795141, 3054259, 2889976, 344671, +848793, -466541, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 3117610, -3112241, -2801929, -496069, 4461398, 1465121, -2306934, 481036, -2548526, -2270427, -1824287, --3999152, -1387811, 2437931, -195421, 1350230, -672699, -1133871, -1107028, -485868, 3362423, --2123861, 211527, -151934, 148713, 2667712, -85899, 1835025, 5850819, 4560719, 4588636, -2376728, 1043140, -740345, -5404680, 2219961, -2015413, 3468186, 1233193, -1835562, 1635309, --2414309, -4684199, -1444720, -1808718, -4438849, 192200, -545461, -631360, -2079301, 286152, -4632659, 2057826, 3148748, -45634, 1936493, -1807108, -130460, 2426657, -2001455, 1626719, --2481417, -2637110, 268972, 5457830, 3593277, 2098092, -1060857, 915902, 585189, 319975, --984084, -2090039, -3202435, -2318209, 73014, -1984275, -993748, -2136746, 709743, 330712, -1108102, -627065, 911607, 1292785, 1059783, 142808, 665720, -487479, -533650, -12885, --1333051, 1409286, 1153736, -130460, 1457605, 433792, 293668, -653909, -414464, -836982, -280247, 475668, -15032, -260919, 503585, -318364, -1236951, -345745, -827855, -45634, -242666, 309775, -1295470, 236223, 1999844, 1028108, -3454764, 8158827, -177167, 491774, --865436, -4310537, 3183645, -2250026, -2155537, -5023501, -3871913, -1630477, 3114388, 4479651, --911070, 2647847, -1035624, 4859219, 5042829, -10080288, 1840394, 42950, -992137, 3403762, -5356898, -1660542, -787590, 102542, -336081, -2566780, 2101313, -2587718, -2046552, -215822, -2679523, -1527398, -5674726, -2526515, -3860639, 443455, 333934, -5039071, -606664, -2203855, -1034013, -158377, -769873, 1227824, -1687922, 1698123, -2708514, 2636573, 3860639, 5937793, -2457258, -2608119, 2118493, 2485712, -948114, -6742025, 425739, 3496104, -2719251, 2011655, --3918621, -54224, -2506650, -6849936, -2099702, -3587372, 1717450, 2531346, -2324651, 1079111, --1102733, 3216931, 235686, 1879585, 2686502, -1164473, 1097364, 536334, 1122060, 2316598, --566399, 775778, 2889439, 1642825, 369367, 1725503, 287226, 739271, -147640, -51540, --1607928, 830539, 971736, 1307281, 872952, 284005, 395674, 28991, 471373, -221728, --474594, -137976, 1038308, 887448, 243203, 793495, 156229, 919660, 766652, 6669548, -1837172, -9086540, 3231426, 4647155, 1708860, -798327, 2374043, -5713917, 811212, 2516851, --1272384, 2433099, -384936, 2966749, 722628, -3862249, 2422362, 3506304, 3479461, -1024350, -1663226, 1888175, 1321239, -10289131, 1443646, -4387309, -1294396, -1468342, 2399813, 1097901, --8386461, -3034931, -1879585, -1606855, 3409130, -3138011, -5869610, 1432909, 2718714, 1679869, --5840619, -2761127, 1868848, -5527623, -447213, -6106370, 892279, 2971044, -3124589, -966368, -3482145, 4422206, -10355166, -782221, -2878702, 3118683, 1280974, 499290, 892279, -2932389, -2633352, 2262911, -8042863, 6157910, -831613, 1501628, -4105989, -1734093, -3473555, -451508, -899796, -3238405, -4472135, 3946538, -1444720, 1614371, -226560, -828392, 1145146, 1326071, --1635309, -4154307, 2296734, 2064806, 525597, 945967, -135291, 289910, 684510, -55298, -681826, 456877, -98784, 1566053, 220654, 1193464, 1441498, 57982, 2034741, -80531, -392453, 524523, 907849, 708670, 1008780, -1553168, 686121, -720481, 300648, 650688, -488016, 1173600, -421444, -389768, -4362076, -4093104, -3404299, -2157147, 6780680, -2368675, -921271, -5509370, 5839545, 392453, -3964792, -1041530, 3381213, -7055021, 2390686, -2080912, -1585917, 1140851, -3235184, -2291365, -8397735, -2257542, -9457518, 1225676, 2126009, -1012539, --1290101, -862215, 1422708, -3697967, -6743099, -3129958, -2483565, -1038845, 2469606, -1551020, -4007205, 1783485, 3069828, -4175245, -240518, -205622, -3498251, 971200, 2747169, -272194, --1747515, -4093104, -3792456, 2551211, 3808562, -122943, 7546795, 5990943, -5415954, -1376537, -8053, -5708549, -6538014, 9872519, -167504, 271657, 3089692, -6273337, -2070711, -4064113, -9742060, 2634426, 499290, -7762617, -6171331, 828929, -2547453, 5037997, -2592013, -55298, -1374390, -3046743, 1098438, 3040837, -4574677, 50466, -7290707, 795106, 2734821, -2103997, -1057099, 875100, 3564823, -512175, 566936, -705448, -144955, 1546188, 1582159, 1484448, --1106491, 474594, -77846, 666257, 42950, 652835, -1069984, 2298881, 13959, 659278, -341987, 725850, 534187, 664109, -619012, -596464, -525060, 506806, 1537061, 1817308, -317291, 824097, -1504312, -11388643, 5701569, 3231426, 5813775, -3117073, 3187940, 3334505, -5974837, 1418413, -11367168, 2843805, 493384, 4523675, 8256538, 438087, 3587908, 3144453, --6805913, 2396055, 634045, 947040, -1847373, -942208, 4228932, 2804614, 175020, -4161823, --47245, -1983738, -2153389, 6816113, 3150359, -281857, -909459, -8228084, -7058779, -8083129, -2154463, 2189897, -8380018, 599148, 570157, -8302709, 524523, 1286880, -1108638, 9551470, --1175210, -4688494, -1178969, 5486821, -452045, -8501888, 9243843, 4792110, -5879274, 4501663, -897111, 867583, -151934, 521839, -2283312, -4268124, -4041564, 7391102, -490163, -2154463, --343061, 5316633, -4922033, -8691940, 311922, 1983201, 1631014, -7597261, -3935801, 2929168, --683437, 4251481, 1619740, -1347009, -1270237, -1158567, -603980, 150324, 6752763, 3937411, -2441689, 2163053, 2610266, 3934190, -1878511, -625992, -2129767, -646929, 748398, 195958, --1178969, -1900523, 1984812, 304406, 894964, -31139, -1214402, 435402, 1048509, -2401424, --408559, 1924145, 415538, 114354, -883153, -264141, -574452, -1042603, 257161, 975494, -777926, -703301, 793495, 68719, 3410204, 13167296, 3894462, 10564009, -11620571, 463320, --5748277, 202400, 3829500, 4457639, -5981816, 2621004, -3474629, -3038689, -4165045, -6720550, --1010928, -15852187, -173409, 5257040, -722091, -1064078, 1722819, -8309688, 2908230, -7924215, --2528662, 8192650, 1634772, 2837900, 172336, 2421825, 6951942, 6324340, 12128451, 6326487, --9210020, -751082, 10214506, -1418413, -7511898, -1124208, 928787, -3408057, 6837588, 5097590, --5912560, -1706176, 6556805, 7015829, -2513093, -4434554, 11077794, -4558034, -14979235, -10093710, -3277597, -15032922, -318901, -4489315, 55298, -1381369, -4224637, 5652714, 1593970, -1456531, --4936528, 4320200, -2964601, 7995619, 5434744, -2164127, -5307506, 1152662, 2069637, 759136, -282394, 1903207, -1118302, -5849746, -1715839, 8185134, -961536, -3304977, -899259, -1698660, --4237522, -4083977, -2289755, -1953136, 469762, -20401, 4076998, -339302, -1490354, 592169, -1449015, -965294, 840203, -1389959, 2767570, -71404, 1694365, 273267, -2690260, -253403, --304406, -2793339, -772557, -1692754, 1267015, 101469, -446677, 984084, 420370, -263604, -488553, -3126199, 670552, 915365, -12826920, 6088653, -1129040, 3261491, 4254165, 6956774, -1559073, -6072010, 8287140, -3058017, 3690451, -3678103, 3075734, -534187, -15067819, -3092377, --2575370, -1743757, 1035087, -3588982, -2485176, 2045478, 3310883, 1172526, 8144869, 3788161, --7866233, -547608, 20938, -4399121, 9370008, -5567888, -5410585, 9895605, 10391137, -1256278, --117575, -6430103, 2336462, 1442035, -3367791, 1760937, 6437619, 4010426, 7740605, -1887101, --6070937, 3816615, 907312, 1896228, -7237020, -3714073, -4250407, 1744831, 4148402, 1555315, -1112933, 7471633, 8913131, 1367947, -4231080, 5109401, 4157528, -6242735, 880468, 1127429, --715112, 771484, -140123, 5357435, -578210, -4117263, 2121714, 7050189, 3120294, 4154844, -8691940, -5887327, 1061394, -1978906, 8248485, 4759898, 8834211, -4214974, -1127429, 1505386, --3135863, 496069, 872415, -965294, 10737, 2083059, 2366527, -849867, 1294933, 954020, -3068217, 2739652, -359167, -192200, -1374390, 428423, -1384053, 768262, -2440078, 2459406, --35433, -901406, -31675, -167504, 102542, -824634, -1897839, 2733210, -330712, 484794, --3004867, -2432562, -658741, 2627983, -267362, -237297, 260919, -259309, 5373004, -11148124, --6640557, 4408247, -2584497, -10414222, 5309654, -5457830, -4728222, 6688338, -2012729, -2238752, --1641751, 1711545, 4989679, 2560874, 2695092, 2729452, -4113505, -2492155, -838592, 6024229, -3135863, -10641855, 3406983, 3294777, -4431333, 9976672, 9194988, 4917201, 380105, -3648038, --2326799, 519691, -3091303, -3754338, -6128919, 877247, -7000797, 5084168, 1987496, 45634, -1139777, 2675228, 2356863, 5443871, 8549669, -3246995, -13471165, -2370822, -9164386, 3151969, -1304060, -12239583, 4466229, -5148592, 15381888, 5077188, -9635222, -349503, 9799505, 5073430, --7970923, -4786204, 10251550, 5848672, -7057705, 8708046, -7243999, -9621264, 1523103, -14558329, -8813273, 9420474, -2126546, -8771397, -1530082, 3419868, 1819992, 1445793, 923418, 6744710, --9464497, 3039763, 10632192, 156766, 409633, -9349607, 4687420, 2585034, -8566849, -2171106, --4301947, -2082522, 386547, 2671470, 2204392, 281857, -2544231, 239981, -2728915, 1126355, -1703491, -379031, -1293859, -953483, 1747515, 512712, -493384, -1480153, -2721399, -344134, --2655364, 5375689, -5012227, -43487, -483184, 2041720, 1452236, -2949569, 944893, -936303, -4651987, -610959, 1356136, 101469, -2585034, -296353, 2948495, -31675, -8721468, -6441914, -206158, -10472204, 31139, -24622510, -7750269, -2830920, -13455059, -4712116, -2818036, -5899675, --4560719, 3211562, -6485938, -12313134, 3278671, 7727720, -12577812, -3476776, 3875671, 6314139, -10849087, 6927246, 6390375, 7011534, 2534031, 12426414, -7395397, -3164317, 2630131, -6148246, -2338610, 3522410, 6503654, 855772, 10635413, 2235531, 2621004, 7344931, -3246995, -6296959, -111132, -9654013, -6176163, -11143293, -469225, -512175, -14653355, 5283347, -6640557, 2998961, --13841069, 1656784, -10475962, 15626165, 781147, -13928042, 16709570, 20473572, 5743445, -6862821, --5090610, 5312338, -1789391, -676457, 6041945, -9778030, 6362457, -10099079, 5338645, -4027606, --5698885, 2405182, 5361193, -2921652, -321586, 6299644, 1640678, -3115999, 3535295, -1563905, --5791764, 752693, 5383742, -1045288, -2148021, 2136746, 1554778, 4388920, 864899, 141197, -1879048, -1485522, 3049964, 764504, 2522757, 867583, 2000381, 1619740, 1628330, 1311576, --1900523, 2105071, -2550674, -2362769, 210453, 1376000, 436476, 681826, 1501628, 991064, -97711, -835908, -1924682, 6979, -2022930, 5326297, -2674691, 4798016, 7240241, 1066226, -6681896, -3778498, 10444824, -8122320, -7565585, -19903952, -4425427, -10321343, -24285356, 6091338, --14005888, -8505109, -11294153, 3097745, -21879638, 5848672, 1773822, -4203163, -500364, -6293738, --2237141, 5241471, -7469485, -5316633, 270046, 3994320, -6537477, -509491, 7459285, -12006044, --2798708, 7000260, -6685117, -411243, 39192, -1902134, 10120554, -8875013, 6000606, -4039417, -8227547, 8702141, -8883066, -11833709, 11045582, -1199370, 2386928, 2891587, 970663, -2541547, -6209449, -3380676, -13707925, 3568581, 2762201, -11855183, -1349694, -4243965, 7099581, 8672613, -4269198, 1462436, -3437585, -8421894, 8593156, 5330055, 7683160, -528818, -12164958, -2837363, --1856500, -5296769, -3018288, -1413044, 3482145, 5412196, -4714264, -3980898, -12087112, -5721434, -2303176, 4983773, 1320166, -1015223, 5500780, 5217312, 3092377, 6404870, -1989107, 5026186, -2251100, 3442953, 554588, 57982, -3350075, -2523830, -633508, 1633698, -814970, -2808909, --3570729, -92342, -607738, 772020, -2436320, 599148, -2900714, 935229, 4786741, 1123671, --2780455, -2794413, 6098854, 3526705, -781147, -326954, -7769059, -831613, -114354, -6511171, -144418, -2611340, -2056753, 1610613, 2017024, 545998, -776315, -5984500, 29561186, 17069810, -1137630, -9383967, -22384296, -2729452, 10408316, -4902169, -9043591, -16783658, -980863, -3622805, -542240, -5758478, 5382668, -95026, 14612016, 5792301, -6157910, -435939, -2657511, 1105954, --3063922, 3025268, 9041980, -10644003, 2019708, -6416145, 4189204, -4571993, -7797513, -15166066, --1264331, 8673150, 2869575, -1899449, 3162170, -1129576, 8237748, 13089450, -4609037, -2989834, --15209553, -16451335, 4507032, 2435247, -6995428, -6019397, -13700409, -9394167, 5370857, -1776506, --15569, 690953, -1098975, 6237903, 3529926, -11249593, 429497, -10252624, -933082, -5532455, --3224447, 10880226, 22396106, 36958732, 1351304, 11886859, -11194295, -14207752, -20002200, -1054415, --110059, 4044786, 4188130, -2731599, -25273736, 10472741, -4330938, -3484292, 1546188, -6616934, -719944, -3598109, -10321343, 128849, -4155918, 97174, 984621, 394063, 7257958, 1060320, -791348, -392453, 261456, -304943, 3093987, 6882685, 1995012, -242666, 1431835, 6241125, -130997, 80531, 2309082, -2064269, 736050, -5702106, 1912871, 2988760, -5400385, 5487895, -293132, 481036, -1625108, -5961952, -1959579, 2678986, -8590, -599685, -1525787, 214748, -10821707, 18009872, -8901320, 22549, 3475702, -14709726, 148176, -9501541, -9184788, 13834627, --4063576, -3488050, -7430831, 15889232, 13985487, -16643, 22969486, 2570001, 7181186, 5039608, --6389838, -7511898, -11940009, -6308233, 2809446, 96637, 10298795, 785442, -1112933, -1890323, -7279970, -10524817, -25669946, -9019968, 7582765, 2357400, -2100776, -7669201, 464930, -12373264, --1847910, -11274826, -769873, -1429150, -7923141, 7582228, 3784403, 14419816, -11920145, 22348862, -6012954, -4373351, -7909719, -4087198, 3531537, 12882218, -3964255, 7361037, -11395085, 9191230, --10347650, -11676405, 11497627, -16689706, 10930155, 9153649, 17735530, -18076444, 13725642, -1737314, -12236899, 4751308, -18965502, -3345243, -4452271, 5264020, -10061498, 29840360, -1465121, -10572062, -4240744, 13775571, 9380209, 6437082, 7131793, -971736, 3399467, -1251983, -3955128, -2550137, -1056025, -163746, -3923453, 1095754, -1150514, -6090801, -1255741, -2347200, 2551748, 3161096, -1743757, -871342, 5900212, -993211, 3267396, 1269163, 4176319, 1531156, -2103460, -2662880, -719944, -352724, 2881386, -1206349, 280784, 2400887, -1473174, 4140885, -1971927, -2352032, -1174137, -1775432, 4374961, 1535988, -1273458, 1286343, -12487617, -16750909, -34305516, -10536629, --20145544, 5608154, -920734, -6870337, -9979893, -9505836, -8588324, -9312026, -9118752, 943819, --7436199, -1351304, -16156593, -24792162, 30344480, -9476308, 16436303, -3162170, 4233227, 5221607, -8852464, 5827734, -1565516, -520228, -13124883, -2988224, -3138547, -8839043, -13766444, 5341866, --1574106, 19401978, -13478681, 327491, 26851598, -6509023, -22362284, -7237020, 856309, -10156524, -15695421, 7192997, -8670465, 6344204, 8414378, -5245766, -209380, 4208531, 10476499, -432181, --10397042, -10236518, 12543452, 8955544, -6656663, -14388140, 9108552, 10546829, -9501541, -12954158, -8996883, -16416439, 31271120, 6686727, -2611340, 1225139, 7607998, 1675037, -5570573, 452045, -2193655, 11191611, -7439420, 2194192, -22317724, -20106352, -2304250, 1135482, -2252174, -9792525, -7016903, 16489990, -530428, 4176856, -1624571, 3470871, 4933844, 5903433, -6473590, 7110319, --3393024, -1981054, 4680978, 8766565, -2688113, -8948027, 2449742, -896038, 1399623, -886911, --4841502, -1403381, -5003637, -3131031, -6157373, 6165426, 6309844, -3923990, -99321, 7603166, -2346663, -3347390, 1515587, 9543417, 6239514, 6855305, 6903086, 6092948, 2197950, 8734890, -4558034, 3582003, 3173444, 8264591, -12912819, 27917, 4774393, 3672197, -8462696, 20390358, -14376866, 29351270, 16209743, 10930155, 4247186, -25670482, -2120103, 3500935, -15137612, -4026532, -29021094, 2232309, -16850768, -16598975, 15022185, -22873922, -5960878, 1009854, 6100464, 2633352, --4394826, 7433515, -10364830, -13422, -2128156, -6504191, -1474784, -4526896, -14984067, 7875360, --12996034, 7596724, 6717329, 8841727, 1547262, 5860483, -5473936, 24154896, 3175592, -25650618, --22624278, 2070174, 10047002, 19632832, -6554657, -15409269, -6914361, -2041720, 2124935, 11528766, -2413772, -9096204, 26466126, -32569810, -5527086, 6164889, -22767084, -11737609, -6074695, 3346853, --36829344, -17388712, 26169772, -9970230, 7552163, -8551280, -29772714, -11227581, 14141180, -4387846, -5424544, 9069897, 18606336, -8950175, 1921461, -5622649, 11589969, 5298916, 4901632, 721018, --624381, 274341, 10065793, 5209259, 5884642, -1628866, -399432, 3738232, -7030862, -6334540, -2553895, 11783243, 5375152, 4539244, -11745662, 6739878, 21447456, -177704, -431107, -8381629, -5661304, 882616, -5242008, -6828998, 695248, 6319508, 7296613, 5337571, -6922951, 4398584, --4725001, 5002027, -8868571, -4871567, -1991254, -4671314, -5870684, -1844152, -14313515, -13485124, -1920387, -1107028, -2488934, 4602595, -456340, -1453846, -176094, 4552129, 15224585, -6714645, --47055124, -12598213, 2956548, 12864501, 13244069, 11370389, 12129525, 20935818, 38648264, -22345642, -16353088, -5941551, -416612, -6021544, -31228708, -23920820, -4211753, -1797444, 7027640, 11979738, -16422881, -5454609, -279173, -8690329, 322123, -1857573, 90194, 16304233, 9166534, 5197448, -13064754, 14814953, -26378078, 12836047, -15230491, -19996294, -5570036, 12315819, 3882651, -13622026, -4612258, 1249299, 9717364, -1263257, -25640954, -18891950, -21227876, -21712134, 3016678, 17328046, --3098282, 63722284, -41689100, -31935766, 19498614, -5999533, -12657269, -4683662, -3318399, 350040, --39058968, 3789772, -2707440, 5043366, 30169998, -2446521, 10650982, 11247982, 14461155, 48959944, --18165564, 62001612, 17482128, -2039573, 8341364, 3234110, -25482040, -23046258, -281857, -5914707, -3328600, 9288404, 7787850, -4787278, -21836150, -18455474, 7372312, -12568685, 8079371, 8329552, -19583440, 18516140, 17441862, 2996277, 6175626, -635118, -708670, 12379169, -1960653, -1504312, -4236449, -18851148, -4238596, 7406134, 147103, -2260764, 11930882, 4058744, -17029546, 11461120, --9448928, -13822279, -7318625, -4562329, 3507915, 5179194, 6029061, -7575249, 8638253, 3150896, -5626944, 1960116, 7354595, -3380139, 4527970, -11554536, -2121177, -28176060, 10267119, 44988708, -1320703, 46948288, 24839944, -2930242, -18136036, 52952116, 7986492, -9029632, 6885907, -12190728, --3537443, -1934346, -3238942, 6570763, 14823543, 10177999, 1971927, 6665253, -10634339, -10448582, -3232500, -3299072, 17450988, 18747532, 12048994, -5033702, 1203128, -23171348, -14421426, -4457103, --15774878, -25062744, -14805289, 11646878, -14442364, -44069584, -20282446, 13182328, -17721572, -12729209, -627602, -3457449, 20635708, 30104500, 39873404, -21364242, 11336029, -555125, 1308891, -8840116, --26374320, -52894668, -34653408, 17996450, -35115116, -18692234, 9578851, 17561048, -13007845, 19835770, -57707716, 11862163, 11181410, -43912820, -58496380, -12962748, -18212272, -31508954, -8913668, -26374858, -18611704, 10294500, 52310016, 21264384, -6063957, -10886668, -18177912, 12063489, 23766202, 47082504, -33141042, -23123568, -47892108, -23701240, -15288473, -28656558, -5301064, 23827942, 11563126, 29544544, -1261647, 20906290, 8438000, -7248831, -8973260, -10606422, 5742372, 12631499, 3195993, 16531866, -21023328, 12371116, 14974940, 6548215, 22702660, 19623168, 771484, -806917, 9917616, 22185654, --2281702, -6441914, -3455301, 18853296, 5843840, 502511, -5806259, 11621645, 9162776, -3387656, -7587597, 9096741, 4638028, -2535641, 2007897, 6371047, 750546, -11464341, 24106040, 47805132, --25517474, 36192080, 29050622, -4895726, -7565048, -16487306, 4835060, 32249298, 23928874, 37853696, --16711181, -7744900, -7932268, -2594697, -10410464, 9717900, -12748537, 27700928, 11687143, -46186468, --20023674, 124017, 6699612, 19556060, -9680319, -17644800, 4948876, 5144834, -7592429, -8851391, -4945655, -13326747, -20222854, -9348533, 43060804, 17655536, 7111392, -22226992, -7319698, -18900004, -10671920, 20727512, 6845104, 1131187, 12182138, -7618198, 27401354, 15426449, 1425929, 8919036, --1226213, 54475216, 11096585, -23549306, 8697846, 9216463, 5246303, 12151536, 519691, -22478786, -26173530, 5580773, 4327180, 10118406, 4609037, -260919, -16540993, 18640694, 21296596, 10900627, -61481920, 43639016, -23853174, -47808356, -33501282, -3474629, 3970161, -5061082, -40652940, -20271172, --14524506, -16847010, -16764331, 14871324, 11636140, -4423280, 2367601, -3791919, -22822920, 6388227, --4312684, -1391033, -23375896, -22503482, -4140349, 9360344, 10995653, 1252520, 11734388, 4954245, -14834817, 2059974, 2894271, -25469156, -15162308, 10714870, 2871723, -7107634, 13238700, 5574868, -2313377, -12271795, 11760157, 16168404, 11371463, 11730093, 14843944, -3320010, 16457241, 32993402, -26022134, 5866926, 3605088, -4228396, -5755256, -16967806, -21448530, 5641977, -2357937, -8938901, --55867324, -7334731, 13858786, 15622407, -12870943, 19532438, 5946919, -8077223, -21052320, 4483946, --5286031, -31256624, -10151692, -11220602, 2017561, -42992084, -33784212, -5919002, 20724290, -3045669, --6823093, -26112328, 161061, 21940840, 683437, -15621870, -9255118, -3562139, -9094056, 5252745, -6961068, -22181896, -24854438, 3543885, -1261110, 4990215, 39902932, -24944096, -2987687, -1846299, --39735964, -12149926, -29194504, -4817880, -2856153, 27504970, 30911954, 38056632, 10560251, 6167036, --15010911, -33942052, 918049, 13297219, -12096239, 46783468, 109790640, 105502112, 15014669, -68137512, --62648540, -24790014, -39560408, 129475008, 79903032, 50057308, 65168612, -1476395, -35230008, -92965640, --59742460, -23409182, -5399848, 36839544, 74978856, 66718560, -8426726, -55988120, -34078956, -50755776, --39982388, 6535330, 54178328, 79152488, 30423938, -4829691, 4016331, -31077310, -36588828, -36477156, -12129525, 5071283, 8957691, 31439160, 16670379, -3815005, -20917028, -18349174, -12128451, -28679644, --5996848, 11814918, -10852845, 123480, -4227859, 18875844, 14304389, -26737246, -16609712, -53397180, --42813308, -38366944, 23790898, 42049340, 15903190, 10401337, -15835544, -28012314, -83099024, -61882964, --37087580, 6427956, 22641456, 14055280, 3091303, -31093416, -25740812, -48826260, -80191872, -32101122, -8966818, 22689776, 40568112, 18256296, -338229, -23165442, -8599598, -15602542, 28831578, -28202366, -32521492, 6686191, 3249680, -51775292, -17261474, 46268072, -31066572, 13106630, -320512, -9896678, -13778255, 5738613, 24099062, 39135204, -23012972, -29812978, 7601019, -17955648, 23886460, -31166968, --16982838, -19520626, 2020245, -4911295, -18684718, 8830453, 36524400, -28394028, -32298154, -23124104, --7723425, -6424198, 49148384, 3512210, -1753957, -48176112, -12821551, 5047124, 41252088, 18508624, --7625178, -69670272, -50451908, 48051556, 51667384, 50630148, -23201414, -116545552, -23204634, 52867288, -43682500, 6990060, -13635984, 7711614, -47302084, -27880780, 15904264, -13654775, 14395657, -8419747, -1917703, 49733036, -36817532, -19163608, 41056668, 32525788, 61951684, 26458610, -82691544, 26069378, -89352496, 19387482, 45256072, 11579232, -25060598, -566399, 56872884, 39257612, 75527000, -99027984, -13606456, -472983, -11203959, 39507256, 538482, -51380156, 4413079, -2063732, -10769630, 7809861, --413391, -31352724, 27399206, -12828530, -992137, 1617055, -7721278, 1600412, 3895535, -8533026, --11737072, -16968342, -25524454, 25059524, -1545115, 9383967, 20816632, -23858544, 11145440, -627602, --44217764, 463856, 13217225, 47602196, -12948790, -65412888, -8260833, 31721554, 7872138, 28103044, --22303766, -17915382, -24532854, 11478837, -4873714, 17412334, -25961466, 13110925, 5688684, 8169565, --28858960, 3510062, 5194226, 20543366, -8775155, 4934381, -17972828, 7087770, -11120744, 17869748, --4068945, 14529874, -5345087, 6612639, -58281096, 6585796, 10422812, 5555004, 57461832, 9678709, --4313221, -36686536, -6272263, -3611531, -8596377, -368830, -6944425, 14698452, 6860137, -10818486, --1853815, 22813792, 70330, -1289027, 2423435, -5717675, -9794673, 12799003, 11320460, 8586713, --14267881, 7493108, 21346524, 8364986, -1227287, 13762686, -2508261, -16346646, 4319664, 4133369, --13163001, -14312979, 14249091, 13868449, -13700946, 8770323, 8475044, -129923, -4991826, 92879, -10832444, -607738, -12103218, 6288906, 7379291, -22486302, 5745593, 16611323, 5434208, -14623290, -2273648, 10306311, -18937048, 5134097, 8869107, 3736622, -4928475, -18061948, 21246130, -23011362, --2035815, 22126060, 355409, -3826816, 483184, -20813412, 9203041, -316217, 11878269, 22002580, --9967008, -1594507, -12728672, 16825534, -3534221, -1891933, 17254494, -22550726, -9918690, 12503724, -10204305, 4470524, -18335216, 6325413, -4035659, -1162862, 8781061, 6670084, 1250372, -4677220, --2355253, 839666, 4964446, -16011638, 11648488, 2367601, -2232846, 4505421, -2106682, 10110890, --15060303, -2738579, 301185, 874563, 1492501, 6955163, 4602058, -25573310, 13508209, -2741263, --2981781, -1074279, 5192079, 6979859, -6344741, -2567317, 11883638, -10184978, -1315871, -7793755, -5645735, 53852448, 4723391, -6572374, -18009334, -11969537, 6309307, -8026220, 6944962, -10712722, --853088, 8532489, -4827543, 4011500, 3929358, -14929843, 4122095, -4890894, -3252901, -12305081, -3469797, -3486440, -7762617, -3620121, 5943161, -5372467, -5320928, 7589744, -8436390, 4266513, -7215545, -14959908, 14740865, -3736085, -17600240, 9335111, 9284109, -8208756, 2848637, 5322538, --7437810, -6660421, 39728, 990527, 4787815, -2421825, -911607, -7405061, 6783901, -5801427, --1882269, 8519605, -10300942, 2967286, -1877438, 26307, -4857071, -6641093, -2717104, 11583527, --7933879, -3018288, 1859184, 2461553, 319438, -7020661, 5331665, -3146601, -6074695, -172872, --11123965, 16242493, -7189239, 3292093, 3571802, -3339874, 5619428, -9660455, -7893613, 9891310, --4871567, -6700149, 6611566, -439697, 1835562, -4464082, 1166621, -984621, 3017215, -3559454, --2800319, 3754338, -2188286, -2592013, -709743, 2373506, -1551557, -209380, -1261110, 638876, -2245194, -3157875, -3199214, 9313637, -2747705, -3318399, 2907156, -1054951, 2702608, -7451232, -497679, -1227287, -232465, -1962263, 8722542, 132607, -7676181, 2534031, 849330, -309775, -67646, 3416647, -2188286, -2183991, -970126, -1966021, -994822, 989990, -2396055, -27917, -728534, -301721, -26739392, -43719544, 19992536, 150777504, 23133230, 75307960, -17661980, -76678048, --27823872, -74729208, -49151068, -15658377, -8187819, 3504157, 44393320, 53282828, 74076376, 73485280, -23393076, -29124174, -47028820, -86385216, -66111356, -34844532, -13527536, -8881455, 26677116, 44685376, -34590592, 47084652, 45702212, 16784732, 14826764, 5535139, -33415920, -12473659, -28729574, -49810348, --30063160, -29122026, -43118788, -9237938, 20173998, 15265924, 44015900, 57611616, 30034706, 38356744, -28922310, -4117800, -1243930, -2764348, -31003758, -38262788, -34055332, -51375324, -43698072, -15517180, --2554432, 6142877, 35617628, 32708324, 31599686, 39724152, 29722784, 10146860, 18787798, 10229538, --11570105, -5587753, -21398600, -45119704, -27084064, -25632364, -35471600, -17167522, -11361799, -20021526, -16876538, 31833224, 36849744, 58693948, 55381992, 23298586, 13754633, -849330, -20066088, -23904178, --24569898, -35863512, -32764158, -30173756, -27583354, -17323750, -6845104, -140123, 13436268, 31406948, -39256000, 36418100, 44050260, 30415348, 14788109, 6150393, -5115843, -22700512, -25531970, -35694400, --46444704, -46923592, -37205692, -31182536, -4738960, 18469970, 41553272, 55597276, 60287920, 46454904, -30328374, 13320841, -3651259, -23476828, -34227132, -46366320, -45914812, -32997160, -21588116, -6720550, -8288213, 16398722, 21910238, 27285928, 23644868, 14607184, 12456479, 4246112, -368830, -4604205, --5756867, -7623030, -7311645, -10666014, -8605504, -6968048, -5687611, -5888400, -3838090, -3960497, --1025960, 1182190, 5236102, 6003291, 8458401, 8270497, 7847979, 2549600, 786516, -1102196, -179852, -684510, 0, 0, 0, 0, 0, 0, }, +3112241, -2801929, -496069, 4461398, 1465121, -2306934, 481036, -2548526, -2270427, -1824287, +-3999152, -1387811, 2437931, -195421, 1350230, -672699, -1133871, -1107028, -485868, 3362423, +-2123861, 211527, -151934, 148713, 2667712, -85899, 1835025, 5850819, 4560719, 4588636, +2376728, 1043140, -740345, -5404680, 2219961, -2015413, 3468186, 1233193, -1835562, 1635309, +-2414309, -4684199, -1444720, -1808718, -4438849, 192200, -545461, -631360, -2079301, 286152, +4632659, 2057826, 3148748, -45634, 1936493, -1807108, -130460, 2426657, -2001455, 1626719, +-2481417, -2637110, 268972, 5457830, 3593277, 2098092, -1060857, 915902, 585189, 319975, +-984084, -2090039, -3202435, -2318209, 73014, -1984275, -993748, -2136746, 709743, 330712, +1108102, -627065, 911607, 1292785, 1059783, 142808, 665720, -487479, -533650, -12885, +-1333051, 1409286, 1153736, -130460, 1457605, 433792, 293668, -653909, -414464, -836982, +280247, 475668, -15032, -260919, 503585, -318364, -1236951, -345745, -827855, -45634, +242666, 309775, -1295470, 236223, 1999844, 1028108, -3454764, 8158827, -177167, 491774, +-865436, -4310537, 3183645, -2250026, -2155537, -5023501, -3871913, -1630477, 3114388, 4479651, +-911070, 2647847, -1035624, 4859219, 5042829, -10080288, 1840394, 42950, -992137, 3403762, +5356898, -1660542, -787590, 102542, -336081, -2566780, 2101313, -2587718, -2046552, -215822, +2679523, -1527398, -5674726, -2526515, -3860639, 443455, 333934, -5039071, -606664, -2203855, +1034013, -158377, -769873, 1227824, -1687922, 1698123, -2708514, 2636573, 3860639, 5937793, +2457258, -2608119, 2118493, 2485712, -948114, -6742025, 425739, 3496104, -2719251, 2011655, +-3918621, -54224, -2506650, -6849936, -2099702, -3587372, 1717450, 2531346, -2324651, 1079111, +-1102733, 3216931, 235686, 1879585, 2686502, -1164473, 1097364, 536334, 1122060, 2316598, +-566399, 775778, 2889439, 1642825, 369367, 1725503, 287226, 739271, -147640, -51540, +-1607928, 830539, 971736, 1307281, 872952, 284005, 395674, 28991, 471373, -221728, +-474594, -137976, 1038308, 887448, 243203, 793495, 156229, 919660, 766652, 6669548, +1837172, -9086540, 3231426, 4647155, 1708860, -798327, 2374043, -5713917, 811212, 2516851, +-1272384, 2433099, -384936, 2966749, 722628, -3862249, 2422362, 3506304, 3479461, -1024350, +1663226, 1888175, 1321239, -10289131, 1443646, -4387309, -1294396, -1468342, 2399813, 1097901, +-8386461, -3034931, -1879585, -1606855, 3409130, -3138011, -5869610, 1432909, 2718714, 1679869, +-5840619, -2761127, 1868848, -5527623, -447213, -6106370, 892279, 2971044, -3124589, -966368, +3482145, 4422206, -10355166, -782221, -2878702, 3118683, 1280974, 499290, 892279, -2932389, +2633352, 2262911, -8042863, 6157910, -831613, 1501628, -4105989, -1734093, -3473555, -451508, +899796, -3238405, -4472135, 3946538, -1444720, 1614371, -226560, -828392, 1145146, 1326071, +-1635309, -4154307, 2296734, 2064806, 525597, 945967, -135291, 289910, 684510, -55298, +681826, 456877, -98784, 1566053, 220654, 1193464, 1441498, 57982, 2034741, -80531, +392453, 524523, 907849, 708670, 1008780, -1553168, 686121, -720481, 300648, 650688, +488016, 1173600, -421444, -389768, -4362076, -4093104, -3404299, -2157147, 6780680, -2368675, +921271, -5509370, 5839545, 392453, -3964792, -1041530, 3381213, -7055021, 2390686, -2080912, +1585917, 1140851, -3235184, -2291365, -8397735, -2257542, -9457518, 1225676, 2126009, -1012539, +-1290101, -862215, 1422708, -3697967, -6743099, -3129958, -2483565, -1038845, 2469606, -1551020, +4007205, 1783485, 3069828, -4175245, -240518, -205622, -3498251, 971200, 2747169, -272194, +-1747515, -4093104, -3792456, 2551211, 3808562, -122943, 7546795, 5990943, -5415954, -1376537, +8053, -5708549, -6538014, 9872519, -167504, 271657, 3089692, -6273337, -2070711, -4064113, +9742060, 2634426, 499290, -7762617, -6171331, 828929, -2547453, 5037997, -2592013, -55298, +1374390, -3046743, 1098438, 3040837, -4574677, 50466, -7290707, 795106, 2734821, -2103997, +1057099, 875100, 3564823, -512175, 566936, -705448, -144955, 1546188, 1582159, 1484448, +-1106491, 474594, -77846, 666257, 42950, 652835, -1069984, 2298881, 13959, 659278, +341987, 725850, 534187, 664109, -619012, -596464, -525060, 506806, 1537061, 1817308, +317291, 824097, -1504312, -11388643, 5701569, 3231426, 5813775, -3117073, 3187940, 3334505, +5974837, 1418413, -11367168, 2843805, 493384, 4523675, 8256538, 438087, 3587908, 3144453, +-6805913, 2396055, 634045, 947040, -1847373, -942208, 4228932, 2804614, 175020, -4161823, +-47245, -1983738, -2153389, 6816113, 3150359, -281857, -909459, -8228084, -7058779, -8083129, +2154463, 2189897, -8380018, 599148, 570157, -8302709, 524523, 1286880, -1108638, 9551470, +-1175210, -4688494, -1178969, 5486821, -452045, -8501888, 9243843, 4792110, -5879274, 4501663, +897111, 867583, -151934, 521839, -2283312, -4268124, -4041564, 7391102, -490163, -2154463, +-343061, 5316633, -4922033, -8691940, 311922, 1983201, 1631014, -7597261, -3935801, 2929168, +-683437, 4251481, 1619740, -1347009, -1270237, -1158567, -603980, 150324, 6752763, 3937411, +2441689, 2163053, 2610266, 3934190, -1878511, -625992, -2129767, -646929, 748398, 195958, +-1178969, -1900523, 1984812, 304406, 894964, -31139, -1214402, 435402, 1048509, -2401424, +-408559, 1924145, 415538, 114354, -883153, -264141, -574452, -1042603, 257161, 975494, +777926, -703301, 793495, 68719, 3410204, 13167296, 3894462, 10564009, -11620571, 463320, +-5748277, 202400, 3829500, 4457639, -5981816, 2621004, -3474629, -3038689, -4165045, -6720550, +-1010928, -15852187, -173409, 5257040, -722091, -1064078, 1722819, -8309688, 2908230, -7924215, +-2528662, 8192650, 1634772, 2837900, 172336, 2421825, 6951942, 6324340, 12128451, 6326487, +-9210020, -751082, 10214506, -1418413, -7511898, -1124208, 928787, -3408057, 6837588, 5097590, +-5912560, -1706176, 6556805, 7015829, -2513093, -4434554, 11077794, -4558034, -14979235, -10093710, +3277597, -15032922, -318901, -4489315, 55298, -1381369, -4224637, 5652714, 1593970, -1456531, +-4936528, 4320200, -2964601, 7995619, 5434744, -2164127, -5307506, 1152662, 2069637, 759136, +282394, 1903207, -1118302, -5849746, -1715839, 8185134, -961536, -3304977, -899259, -1698660, +-4237522, -4083977, -2289755, -1953136, 469762, -20401, 4076998, -339302, -1490354, 592169, +1449015, -965294, 840203, -1389959, 2767570, -71404, 1694365, 273267, -2690260, -253403, +-304406, -2793339, -772557, -1692754, 1267015, 101469, -446677, 984084, 420370, -263604, +488553, -3126199, 670552, 915365, -12826920, 6088653, -1129040, 3261491, 4254165, 6956774, +1559073, -6072010, 8287140, -3058017, 3690451, -3678103, 3075734, -534187, -15067819, -3092377, +-2575370, -1743757, 1035087, -3588982, -2485176, 2045478, 3310883, 1172526, 8144869, 3788161, +-7866233, -547608, 20938, -4399121, 9370008, -5567888, -5410585, 9895605, 10391137, -1256278, +-117575, -6430103, 2336462, 1442035, -3367791, 1760937, 6437619, 4010426, 7740605, -1887101, +-6070937, 3816615, 907312, 1896228, -7237020, -3714073, -4250407, 1744831, 4148402, 1555315, +1112933, 7471633, 8913131, 1367947, -4231080, 5109401, 4157528, -6242735, 880468, 1127429, +-715112, 771484, -140123, 5357435, -578210, -4117263, 2121714, 7050189, 3120294, 4154844, +8691940, -5887327, 1061394, -1978906, 8248485, 4759898, 8834211, -4214974, -1127429, 1505386, +-3135863, 496069, 872415, -965294, 10737, 2083059, 2366527, -849867, 1294933, 954020, +3068217, 2739652, -359167, -192200, -1374390, 428423, -1384053, 768262, -2440078, 2459406, +-35433, -901406, -31675, -167504, 102542, -824634, -1897839, 2733210, -330712, 484794, +-3004867, -2432562, -658741, 2627983, -267362, -237297, 260919, -259309, 5373004, -11148124, +-6640557, 4408247, -2584497, -10414222, 5309654, -5457830, -4728222, 6688338, -2012729, -2238752, +-1641751, 1711545, 4989679, 2560874, 2695092, 2729452, -4113505, -2492155, -838592, 6024229, +3135863, -10641855, 3406983, 3294777, -4431333, 9976672, 9194988, 4917201, 380105, -3648038, +-2326799, 519691, -3091303, -3754338, -6128919, 877247, -7000797, 5084168, 1987496, 45634, +1139777, 2675228, 2356863, 5443871, 8549669, -3246995, -13471165, -2370822, -9164386, 3151969, +1304060, -12239583, 4466229, -5148592, 15381888, 5077188, -9635222, -349503, 9799505, 5073430, +-7970923, -4786204, 10251550, 5848672, -7057705, 8708046, -7243999, -9621264, 1523103, -14558329, +8813273, 9420474, -2126546, -8771397, -1530082, 3419868, 1819992, 1445793, 923418, 6744710, +-9464497, 3039763, 10632192, 156766, 409633, -9349607, 4687420, 2585034, -8566849, -2171106, +-4301947, -2082522, 386547, 2671470, 2204392, 281857, -2544231, 239981, -2728915, 1126355, +1703491, -379031, -1293859, -953483, 1747515, 512712, -493384, -1480153, -2721399, -344134, +-2655364, 5375689, -5012227, -43487, -483184, 2041720, 1452236, -2949569, 944893, -936303, +4651987, -610959, 1356136, 101469, -2585034, -296353, 2948495, -31675, -8721468, -6441914, +206158, -10472204, 31139, -24622510, -7750269, -2830920, -13455059, -4712116, -2818036, -5899675, +-4560719, 3211562, -6485938, -12313134, 3278671, 7727720, -12577812, -3476776, 3875671, 6314139, +10849087, 6927246, 6390375, 7011534, 2534031, 12426414, -7395397, -3164317, 2630131, -6148246, +2338610, 3522410, 6503654, 855772, 10635413, 2235531, 2621004, 7344931, -3246995, -6296959, +111132, -9654013, -6176163, -11143293, -469225, -512175, -14653355, 5283347, -6640557, 2998961, +-13841069, 1656784, -10475962, 15626165, 781147, -13928042, 16709570, 20473572, 5743445, -6862821, +-5090610, 5312338, -1789391, -676457, 6041945, -9778030, 6362457, -10099079, 5338645, -4027606, +-5698885, 2405182, 5361193, -2921652, -321586, 6299644, 1640678, -3115999, 3535295, -1563905, +-5791764, 752693, 5383742, -1045288, -2148021, 2136746, 1554778, 4388920, 864899, 141197, +1879048, -1485522, 3049964, 764504, 2522757, 867583, 2000381, 1619740, 1628330, 1311576, +-1900523, 2105071, -2550674, -2362769, 210453, 1376000, 436476, 681826, 1501628, 991064, +97711, -835908, -1924682, 6979, -2022930, 5326297, -2674691, 4798016, 7240241, 1066226, +6681896, -3778498, 10444824, -8122320, -7565585, -19903952, -4425427, -10321343, -24285356, 6091338, +-14005888, -8505109, -11294153, 3097745, -21879638, 5848672, 1773822, -4203163, -500364, -6293738, +-2237141, 5241471, -7469485, -5316633, 270046, 3994320, -6537477, -509491, 7459285, -12006044, +-2798708, 7000260, -6685117, -411243, 39192, -1902134, 10120554, -8875013, 6000606, -4039417, +8227547, 8702141, -8883066, -11833709, 11045582, -1199370, 2386928, 2891587, 970663, -2541547, +6209449, -3380676, -13707925, 3568581, 2762201, -11855183, -1349694, -4243965, 7099581, 8672613, +4269198, 1462436, -3437585, -8421894, 8593156, 5330055, 7683160, -528818, -12164958, -2837363, +-1856500, -5296769, -3018288, -1413044, 3482145, 5412196, -4714264, -3980898, -12087112, -5721434, +2303176, 4983773, 1320166, -1015223, 5500780, 5217312, 3092377, 6404870, -1989107, 5026186, +2251100, 3442953, 554588, 57982, -3350075, -2523830, -633508, 1633698, -814970, -2808909, +-3570729, -92342, -607738, 772020, -2436320, 599148, -2900714, 935229, 4786741, 1123671, +-2780455, -2794413, 6098854, 3526705, -781147, -326954, -7769059, -831613, -114354, -6511171, +144418, -2611340, -2056753, 1610613, 2017024, 545998, -776315, -5984500, 29561186, 17069810, +1137630, -9383967, -22384296, -2729452, 10408316, -4902169, -9043591, -16783658, -980863, -3622805, +542240, -5758478, 5382668, -95026, 14612016, 5792301, -6157910, -435939, -2657511, 1105954, +-3063922, 3025268, 9041980, -10644003, 2019708, -6416145, 4189204, -4571993, -7797513, -15166066, +-1264331, 8673150, 2869575, -1899449, 3162170, -1129576, 8237748, 13089450, -4609037, -2989834, +-15209553, -16451335, 4507032, 2435247, -6995428, -6019397, -13700409, -9394167, 5370857, -1776506, +-15569, 690953, -1098975, 6237903, 3529926, -11249593, 429497, -10252624, -933082, -5532455, +-3224447, 10880226, 22396106, 36958732, 1351304, 11886859, -11194295, -14207752, -20002200, -1054415, +-110059, 4044786, 4188130, -2731599, -25273736, 10472741, -4330938, -3484292, 1546188, -6616934, +719944, -3598109, -10321343, 128849, -4155918, 97174, 984621, 394063, 7257958, 1060320, +791348, -392453, 261456, -304943, 3093987, 6882685, 1995012, -242666, 1431835, 6241125, +130997, 80531, 2309082, -2064269, 736050, -5702106, 1912871, 2988760, -5400385, 5487895, +293132, 481036, -1625108, -5961952, -1959579, 2678986, -8590, -599685, -1525787, 214748, +10821707, 18009872, -8901320, 22549, 3475702, -14709726, 148176, -9501541, -9184788, 13834627, +-4063576, -3488050, -7430831, 15889232, 13985487, -16643, 22969486, 2570001, 7181186, 5039608, +-6389838, -7511898, -11940009, -6308233, 2809446, 96637, 10298795, 785442, -1112933, -1890323, +7279970, -10524817, -25669946, -9019968, 7582765, 2357400, -2100776, -7669201, 464930, -12373264, +-1847910, -11274826, -769873, -1429150, -7923141, 7582228, 3784403, 14419816, -11920145, 22348862, +6012954, -4373351, -7909719, -4087198, 3531537, 12882218, -3964255, 7361037, -11395085, 9191230, +-10347650, -11676405, 11497627, -16689706, 10930155, 9153649, 17735530, -18076444, 13725642, -1737314, +12236899, 4751308, -18965502, -3345243, -4452271, 5264020, -10061498, 29840360, -1465121, -10572062, +4240744, 13775571, 9380209, 6437082, 7131793, -971736, 3399467, -1251983, -3955128, -2550137, +1056025, -163746, -3923453, 1095754, -1150514, -6090801, -1255741, -2347200, 2551748, 3161096, +1743757, -871342, 5900212, -993211, 3267396, 1269163, 4176319, 1531156, -2103460, -2662880, +719944, -352724, 2881386, -1206349, 280784, 2400887, -1473174, 4140885, -1971927, -2352032, +1174137, -1775432, 4374961, 1535988, -1273458, 1286343, -12487617, -16750909, -34305516, -10536629, +-20145544, 5608154, -920734, -6870337, -9979893, -9505836, -8588324, -9312026, -9118752, 943819, +-7436199, -1351304, -16156593, -24792162, 30344480, -9476308, 16436303, -3162170, 4233227, 5221607, +8852464, 5827734, -1565516, -520228, -13124883, -2988224, -3138547, -8839043, -13766444, 5341866, +-1574106, 19401978, -13478681, 327491, 26851598, -6509023, -22362284, -7237020, 856309, -10156524, +15695421, 7192997, -8670465, 6344204, 8414378, -5245766, -209380, 4208531, 10476499, -432181, +-10397042, -10236518, 12543452, 8955544, -6656663, -14388140, 9108552, 10546829, -9501541, -12954158, +8996883, -16416439, 31271120, 6686727, -2611340, 1225139, 7607998, 1675037, -5570573, 452045, +2193655, 11191611, -7439420, 2194192, -22317724, -20106352, -2304250, 1135482, -2252174, -9792525, +7016903, 16489990, -530428, 4176856, -1624571, 3470871, 4933844, 5903433, -6473590, 7110319, +-3393024, -1981054, 4680978, 8766565, -2688113, -8948027, 2449742, -896038, 1399623, -886911, +-4841502, -1403381, -5003637, -3131031, -6157373, 6165426, 6309844, -3923990, -99321, 7603166, +2346663, -3347390, 1515587, 9543417, 6239514, 6855305, 6903086, 6092948, 2197950, 8734890, +4558034, 3582003, 3173444, 8264591, -12912819, 27917, 4774393, 3672197, -8462696, 20390358, +14376866, 29351270, 16209743, 10930155, 4247186, -25670482, -2120103, 3500935, -15137612, -4026532, +29021094, 2232309, -16850768, -16598975, 15022185, -22873922, -5960878, 1009854, 6100464, 2633352, +-4394826, 7433515, -10364830, -13422, -2128156, -6504191, -1474784, -4526896, -14984067, 7875360, +-12996034, 7596724, 6717329, 8841727, 1547262, 5860483, -5473936, 24154896, 3175592, -25650618, +-22624278, 2070174, 10047002, 19632832, -6554657, -15409269, -6914361, -2041720, 2124935, 11528766, +2413772, -9096204, 26466126, -32569810, -5527086, 6164889, -22767084, -11737609, -6074695, 3346853, +-36829344, -17388712, 26169772, -9970230, 7552163, -8551280, -29772714, -11227581, 14141180, -4387846, +5424544, 9069897, 18606336, -8950175, 1921461, -5622649, 11589969, 5298916, 4901632, 721018, +-624381, 274341, 10065793, 5209259, 5884642, -1628866, -399432, 3738232, -7030862, -6334540, +2553895, 11783243, 5375152, 4539244, -11745662, 6739878, 21447456, -177704, -431107, -8381629, +5661304, 882616, -5242008, -6828998, 695248, 6319508, 7296613, 5337571, -6922951, 4398584, +-4725001, 5002027, -8868571, -4871567, -1991254, -4671314, -5870684, -1844152, -14313515, -13485124, +1920387, -1107028, -2488934, 4602595, -456340, -1453846, -176094, 4552129, 15224585, -6714645, +-47055124, -12598213, 2956548, 12864501, 13244069, 11370389, 12129525, 20935818, 38648264, -22345642, +16353088, -5941551, -416612, -6021544, -31228708, -23920820, -4211753, -1797444, 7027640, 11979738, +16422881, -5454609, -279173, -8690329, 322123, -1857573, 90194, 16304233, 9166534, 5197448, +13064754, 14814953, -26378078, 12836047, -15230491, -19996294, -5570036, 12315819, 3882651, -13622026, +4612258, 1249299, 9717364, -1263257, -25640954, -18891950, -21227876, -21712134, 3016678, 17328046, +-3098282, 63722284, -41689100, -31935766, 19498614, -5999533, -12657269, -4683662, -3318399, 350040, +-39058968, 3789772, -2707440, 5043366, 30169998, -2446521, 10650982, 11247982, 14461155, 48959944, +-18165564, 62001612, 17482128, -2039573, 8341364, 3234110, -25482040, -23046258, -281857, -5914707, +3328600, 9288404, 7787850, -4787278, -21836150, -18455474, 7372312, -12568685, 8079371, 8329552, +19583440, 18516140, 17441862, 2996277, 6175626, -635118, -708670, 12379169, -1960653, -1504312, +4236449, -18851148, -4238596, 7406134, 147103, -2260764, 11930882, 4058744, -17029546, 11461120, +-9448928, -13822279, -7318625, -4562329, 3507915, 5179194, 6029061, -7575249, 8638253, 3150896, +5626944, 1960116, 7354595, -3380139, 4527970, -11554536, -2121177, -28176060, 10267119, 44988708, +1320703, 46948288, 24839944, -2930242, -18136036, 52952116, 7986492, -9029632, 6885907, -12190728, +-3537443, -1934346, -3238942, 6570763, 14823543, 10177999, 1971927, 6665253, -10634339, -10448582, +3232500, -3299072, 17450988, 18747532, 12048994, -5033702, 1203128, -23171348, -14421426, -4457103, +-15774878, -25062744, -14805289, 11646878, -14442364, -44069584, -20282446, 13182328, -17721572, -12729209, +627602, -3457449, 20635708, 30104500, 39873404, -21364242, 11336029, -555125, 1308891, -8840116, +-26374320, -52894668, -34653408, 17996450, -35115116, -18692234, 9578851, 17561048, -13007845, 19835770, +57707716, 11862163, 11181410, -43912820, -58496380, -12962748, -18212272, -31508954, -8913668, -26374858, +18611704, 10294500, 52310016, 21264384, -6063957, -10886668, -18177912, 12063489, 23766202, 47082504, +33141042, -23123568, -47892108, -23701240, -15288473, -28656558, -5301064, 23827942, 11563126, 29544544, +1261647, 20906290, 8438000, -7248831, -8973260, -10606422, 5742372, 12631499, 3195993, 16531866, +21023328, 12371116, 14974940, 6548215, 22702660, 19623168, 771484, -806917, 9917616, 22185654, +-2281702, -6441914, -3455301, 18853296, 5843840, 502511, -5806259, 11621645, 9162776, -3387656, +7587597, 9096741, 4638028, -2535641, 2007897, 6371047, 750546, -11464341, 24106040, 47805132, +-25517474, 36192080, 29050622, -4895726, -7565048, -16487306, 4835060, 32249298, 23928874, 37853696, +-16711181, -7744900, -7932268, -2594697, -10410464, 9717900, -12748537, 27700928, 11687143, -46186468, +-20023674, 124017, 6699612, 19556060, -9680319, -17644800, 4948876, 5144834, -7592429, -8851391, +4945655, -13326747, -20222854, -9348533, 43060804, 17655536, 7111392, -22226992, -7319698, -18900004, +10671920, 20727512, 6845104, 1131187, 12182138, -7618198, 27401354, 15426449, 1425929, 8919036, +-1226213, 54475216, 11096585, -23549306, 8697846, 9216463, 5246303, 12151536, 519691, -22478786, +26173530, 5580773, 4327180, 10118406, 4609037, -260919, -16540993, 18640694, 21296596, 10900627, +61481920, 43639016, -23853174, -47808356, -33501282, -3474629, 3970161, -5061082, -40652940, -20271172, +-14524506, -16847010, -16764331, 14871324, 11636140, -4423280, 2367601, -3791919, -22822920, 6388227, +-4312684, -1391033, -23375896, -22503482, -4140349, 9360344, 10995653, 1252520, 11734388, 4954245, +14834817, 2059974, 2894271, -25469156, -15162308, 10714870, 2871723, -7107634, 13238700, 5574868, +2313377, -12271795, 11760157, 16168404, 11371463, 11730093, 14843944, -3320010, 16457241, 32993402, +26022134, 5866926, 3605088, -4228396, -5755256, -16967806, -21448530, 5641977, -2357937, -8938901, +-55867324, -7334731, 13858786, 15622407, -12870943, 19532438, 5946919, -8077223, -21052320, 4483946, +-5286031, -31256624, -10151692, -11220602, 2017561, -42992084, -33784212, -5919002, 20724290, -3045669, +-6823093, -26112328, 161061, 21940840, 683437, -15621870, -9255118, -3562139, -9094056, 5252745, +6961068, -22181896, -24854438, 3543885, -1261110, 4990215, 39902932, -24944096, -2987687, -1846299, +-39735964, -12149926, -29194504, -4817880, -2856153, 27504970, 30911954, 38056632, 10560251, 6167036, +-15010911, -33942052, 918049, 13297219, -12096239, 46783468, 109790640, 105502112, 15014669, -68137512, +-62648540, -24790014, -39560408, 129475008, 79903032, 50057308, 65168612, -1476395, -35230008, -92965640, +-59742460, -23409182, -5399848, 36839544, 74978856, 66718560, -8426726, -55988120, -34078956, -50755776, +-39982388, 6535330, 54178328, 79152488, 30423938, -4829691, 4016331, -31077310, -36588828, -36477156, +12129525, 5071283, 8957691, 31439160, 16670379, -3815005, -20917028, -18349174, -12128451, -28679644, +-5996848, 11814918, -10852845, 123480, -4227859, 18875844, 14304389, -26737246, -16609712, -53397180, +-42813308, -38366944, 23790898, 42049340, 15903190, 10401337, -15835544, -28012314, -83099024, -61882964, +-37087580, 6427956, 22641456, 14055280, 3091303, -31093416, -25740812, -48826260, -80191872, -32101122, +8966818, 22689776, 40568112, 18256296, -338229, -23165442, -8599598, -15602542, 28831578, -28202366, +32521492, 6686191, 3249680, -51775292, -17261474, 46268072, -31066572, 13106630, -320512, -9896678, +13778255, 5738613, 24099062, 39135204, -23012972, -29812978, 7601019, -17955648, 23886460, -31166968, +-16982838, -19520626, 2020245, -4911295, -18684718, 8830453, 36524400, -28394028, -32298154, -23124104, +-7723425, -6424198, 49148384, 3512210, -1753957, -48176112, -12821551, 5047124, 41252088, 18508624, +-7625178, -69670272, -50451908, 48051556, 51667384, 50630148, -23201414, -116545552, -23204634, 52867288, +43682500, 6990060, -13635984, 7711614, -47302084, -27880780, 15904264, -13654775, 14395657, -8419747, +1917703, 49733036, -36817532, -19163608, 41056668, 32525788, 61951684, 26458610, -82691544, 26069378, +89352496, 19387482, 45256072, 11579232, -25060598, -566399, 56872884, 39257612, 75527000, -99027984, +13606456, -472983, -11203959, 39507256, 538482, -51380156, 4413079, -2063732, -10769630, 7809861, +-413391, -31352724, 27399206, -12828530, -992137, 1617055, -7721278, 1600412, 3895535, -8533026, +-11737072, -16968342, -25524454, 25059524, -1545115, 9383967, 20816632, -23858544, 11145440, -627602, +-44217764, 463856, 13217225, 47602196, -12948790, -65412888, -8260833, 31721554, 7872138, 28103044, +-22303766, -17915382, -24532854, 11478837, -4873714, 17412334, -25961466, 13110925, 5688684, 8169565, +-28858960, 3510062, 5194226, 20543366, -8775155, 4934381, -17972828, 7087770, -11120744, 17869748, +-4068945, 14529874, -5345087, 6612639, -58281096, 6585796, 10422812, 5555004, 57461832, 9678709, +-4313221, -36686536, -6272263, -3611531, -8596377, -368830, -6944425, 14698452, 6860137, -10818486, +-1853815, 22813792, 70330, -1289027, 2423435, -5717675, -9794673, 12799003, 11320460, 8586713, +-14267881, 7493108, 21346524, 8364986, -1227287, 13762686, -2508261, -16346646, 4319664, 4133369, +-13163001, -14312979, 14249091, 13868449, -13700946, 8770323, 8475044, -129923, -4991826, 92879, +10832444, -607738, -12103218, 6288906, 7379291, -22486302, 5745593, 16611323, 5434208, -14623290, +2273648, 10306311, -18937048, 5134097, 8869107, 3736622, -4928475, -18061948, 21246130, -23011362, +-2035815, 22126060, 355409, -3826816, 483184, -20813412, 9203041, -316217, 11878269, 22002580, +-9967008, -1594507, -12728672, 16825534, -3534221, -1891933, 17254494, -22550726, -9918690, 12503724, +10204305, 4470524, -18335216, 6325413, -4035659, -1162862, 8781061, 6670084, 1250372, -4677220, +-2355253, 839666, 4964446, -16011638, 11648488, 2367601, -2232846, 4505421, -2106682, 10110890, +-15060303, -2738579, 301185, 874563, 1492501, 6955163, 4602058, -25573310, 13508209, -2741263, +-2981781, -1074279, 5192079, 6979859, -6344741, -2567317, 11883638, -10184978, -1315871, -7793755, +5645735, 53852448, 4723391, -6572374, -18009334, -11969537, 6309307, -8026220, 6944962, -10712722, +-853088, 8532489, -4827543, 4011500, 3929358, -14929843, 4122095, -4890894, -3252901, -12305081, +3469797, -3486440, -7762617, -3620121, 5943161, -5372467, -5320928, 7589744, -8436390, 4266513, +7215545, -14959908, 14740865, -3736085, -17600240, 9335111, 9284109, -8208756, 2848637, 5322538, +-7437810, -6660421, 39728, 990527, 4787815, -2421825, -911607, -7405061, 6783901, -5801427, +-1882269, 8519605, -10300942, 2967286, -1877438, 26307, -4857071, -6641093, -2717104, 11583527, +-7933879, -3018288, 1859184, 2461553, 319438, -7020661, 5331665, -3146601, -6074695, -172872, +-11123965, 16242493, -7189239, 3292093, 3571802, -3339874, 5619428, -9660455, -7893613, 9891310, +-4871567, -6700149, 6611566, -439697, 1835562, -4464082, 1166621, -984621, 3017215, -3559454, +-2800319, 3754338, -2188286, -2592013, -709743, 2373506, -1551557, -209380, -1261110, 638876, +2245194, -3157875, -3199214, 9313637, -2747705, -3318399, 2907156, -1054951, 2702608, -7451232, +497679, -1227287, -232465, -1962263, 8722542, 132607, -7676181, 2534031, 849330, -309775, +67646, 3416647, -2188286, -2183991, -970126, -1966021, -994822, 989990, -2396055, -27917, +728534, -301721, -26739392, -43719544, 19992536, 150777504, 23133230, 75307960, -17661980, -76678048, +-27823872, -74729208, -49151068, -15658377, -8187819, 3504157, 44393320, 53282828, 74076376, 73485280, +23393076, -29124174, -47028820, -86385216, -66111356, -34844532, -13527536, -8881455, 26677116, 44685376, +34590592, 47084652, 45702212, 16784732, 14826764, 5535139, -33415920, -12473659, -28729574, -49810348, +-30063160, -29122026, -43118788, -9237938, 20173998, 15265924, 44015900, 57611616, 30034706, 38356744, +28922310, -4117800, -1243930, -2764348, -31003758, -38262788, -34055332, -51375324, -43698072, -15517180, +-2554432, 6142877, 35617628, 32708324, 31599686, 39724152, 29722784, 10146860, 18787798, 10229538, +-11570105, -5587753, -21398600, -45119704, -27084064, -25632364, -35471600, -17167522, -11361799, -20021526, +16876538, 31833224, 36849744, 58693948, 55381992, 23298586, 13754633, -849330, -20066088, -23904178, +-24569898, -35863512, -32764158, -30173756, -27583354, -17323750, -6845104, -140123, 13436268, 31406948, +39256000, 36418100, 44050260, 30415348, 14788109, 6150393, -5115843, -22700512, -25531970, -35694400, +-46444704, -46923592, -37205692, -31182536, -4738960, 18469970, 41553272, 55597276, 60287920, 46454904, +30328374, 13320841, -3651259, -23476828, -34227132, -46366320, -45914812, -32997160, -21588116, -6720550, +8288213, 16398722, 21910238, 27285928, 23644868, 14607184, 12456479, 4246112, -368830, -4604205, +-5756867, -7623030, -7311645, -10666014, -8605504, -6968048, -5687611, -5888400, -3838090, -3960497, +-1025960, 1182190, 5236102, 6003291, 8458401, 8270497, 7847979, 2549600, 786516, -1102196, +179852, -684510, 0, 0, 0, 0, 0, 0, }, { -1141388, -6170258, -3467112, 1032940, -5153961, 1443109, 580357, 7864622, -4709432, 15569, -2477123, -3941706, 4025458, -2567317, -488016, -2206540, -1264868, -2579128, -3210488, 2369748, 775778, --2099702, 4391604, 3998078, 6833830, -201863, 2589329, 1359357, -112206, -6172405, 1607928, -2572149, -2434710, 1545115, -1794223, -2091649, -3385508, 1760937, 4363687, 453656, 5091684, --2073932, -430034, 5135171, 2688650, 418759, -59593, 4878546, 7326141, -5439039, 1224603, --1874216, -839129, -8468602, -3003256, 3433290, -2627446, 2381559, 1102196, -1236951, -2050310, -1207960, -697932, 2652679, 1440425, 1241246, 1360431, -4389994, 173946, -2105071, 2714419, -4500052, 3156801, -628139, 4871567, 43487, 2071785, -632434, -1071058, 273267, 2448668, -2824478, -908922, -1904818, -3950296, -496606, -1736241, -1859721, -1045288, -1579474, -1129576, --1862405, -972810, -29528, -13422, 61203, 1574642, -1063004, 829466, -371515, -747861, -62814, 728534, 282931, 583042, 22012, -511101, 32212, 744640, 265214, -1062468, --811749, -27380, 35433, 450972, 89657, 815507, -1052804, 3673271, -4502737, -4709969, -178241, -6343130, 1164473, -1997160, 3082713, -1699196, -5031554, 572304, 4932770, -753767, -170188, 6868190, 8632884, -3725347, -3961034, -1125818, -6417218, 2741800, 586263, 1599875, --2256469, 3426310, -4471061, -814433, 3062312, -2516314, -916976, 469225, 5563057, 358093, -4025458, -5304822, 5212480, -568009, 754304, 3374234, -2910914, 2815351, -1321239, -1347009, -2425583, 3199751, -541166, 1830193, -7035157, 4255239, 4130685, -7458211, -6564321, -1854352, --5443871, -1525787, 2077690, 1354525, 1983738, 114354, -1813550, 4589710, -1535988, 168041, --1833414, 1081258, -2777770, 3905199, 958851, -3004867, -1678259, -1189706, -1739999, -1541356, -3956739, 5181878, -244813, -1056562, 203474, 1659468, -1075889, 3620121, 2057826, -1479616, --275952, -924492, 1576253, -1517734, -40265, -400506, 242666, 573378, -86436, -445066, -984621, -760209, -249645, 203474, 658204, 51540, -1311039, -907312, 257161, -865973, --722091, 868657, -456877, -1606855, -1030792, -1292785, -339302, 204548, 1549410, 11094974, -2119566, -4102768, 5143760, 654983, -3492345, 10134512, -6800544, -9741523, -5709086, -5906654, --1988570, 2882460, 3555159, -3366718, 5116380, -6419366, -3500398, -776315, 2128156, 1601486, --1955821, -2522757, 5724118, 1102196, -390305, -3208878, 4272956, -3125126, -723165, -6442, --362388, -448824, 1663763, 889058, -881542, 3568044, -1682554, 2175401, -153545, -5820218, --2283849, -2324651, 6189585, -3431142, -4172561, -7558606, -8832063, -1613834, 449361, -3526705, -6702297, 905164, 3600256, -2706903, 5801427, 2474438, -3364033, 9355513, -4239133, -4529580, -724239, 5864241, 8596377, 6087580, 2015413, -2994129, -6765647, 2695629, -83215, 6667400, -2681133, -1905355, -230854, 3400004, 2731062, 49929, -637266, 280247, -1331977, -2808372, --265751, 884226, 695785, 2427730, -86436, 1472100, -515396, 1161789, -295816, 221728, --250182, -1643362, 154082, -299574, -2107755, 1693291, -389231, 1037235, -572841, -1132798, -156766, 201327, -82141, -740882, 780610, 313533, -557272, -170188, -1621887, 210453, --915365, 817654, -304943, 1753420, -792421, -10478110, 1628330, -3794604, 2422362, 723702, -7532299, -9689446, -5557151, -7104413, 3806415, 3199751, 4571456, -5058935, 1738925, -1481227, -635655, -7895761, -6772627, -4929549, -4925791, 8039105, -3236795, -928787, -156766, 2762738, --1287417, -8390219, 3540664, -3315715, -1112397, 3934727, 2917357, 4511863, 277562, 2430415, --5914707, -2403034, 5283347, 8831527, 5148592, -343061, -6726456, 4828080, -2174864, -5760088, -8002598, 2420214, 2746632, -4888747, -2884071, 2792266, -1822140, -2702608, 4219269, -3288871, -1462436, 255014, -5593121, -1139777, -3703873, 5912560, 2980171, -768262, 993748, -2651606, -3468723, 629213, -106300, 1079111, -6691559, -3435437, 3766686, 1868311, -1096827, -813896, --4759361, 7843147, 9642202, 5376762, -4428648, 4005057, 676457, 3425773, -1476395, 2824478, --2126009, 1845762, 3520263, 1949378, 1685775, 1329292, 63888, -1138703, -401043, 3504693, -175557, 278099, -1302449, -199716, 720481, 2126546, -264141, 2490544, 397284, 110595, --94489, 2030446, 2433099, -1016834, -469762, -226560, 375810, 1789928, -103079, 517544, -127775, 464930, -877784, -15846819, 5287105, 804233, 3941706, 4268661, -3094524, -11207180, -8637179, 3669513, 8498667, -1562294, 4505421, -88047, -3058554, -209917, -7921531, 9693741, -2213519, 919123, -4989142, -2865817, -3379066, 2896419, -4449049, 7424388, 326418, 2556579, -4136054, 2286533, -476205, 2398202, 2290828, -1733556, 1927904, -8252780, 2146410, 3764002, -3850975, 7413651, 2574296, -4948876, 2481954, -2492692, 5041755, 979253, 3668976, 5645198, -925029, -1232119, 4422743, -3039763, -4805532, -1772748, 3085397, 7823820, -1853815, 497142, -140123, 940598, 1535988, 3281892, 1112933, -2050847, -368830, -2768107, 2014340, 656056, --4955856, -4356171, 1741609, 2759517, 2760053, 4920959, -7568269, -4063576, -5516886, 6500433, --2862596, -4019016, 2103997, -3703336, -5394479, -1938641, 150861, 5787469, -2041720, 1880122, --2299418, -1336272, -335544, 1773822, 764504, -1031329, -876710, 1123671, 2869038, 988379, -1654099, -779000, -545461, 1964948, -77309, 153008, 731218, -1336272, 2563022, -779537, --178778, -1177358, -3268470, -484794, -719944, -218506, -36507, -1204202, 128849, 2953864, --731218, -256624, -558883, -1056025, 3910031, 16094316, 8539469, 7646653, 11149198, 3034395, -2036888, -6818261, -223338, -12751221, -2297271, 4859756, 3526705, 2268280, 2950643, 3512210, --2752537, -1862942, 7311645, 6594923, 5656472, -425739, 794032, -9104794, -7888781, -2983929, -5765994, 1869921, -1196148, 3135863, -5305359, 506806, -2736968, 6346888, 4981625, 11143830, --1105417, 4207458, 3501472, -1787243, -5841156, 10485089, -6093485, -1377074, 4745939, 233002, -2697776, 7561290, -2412698, 2823941, -7305740, -15611669, -8661875, -5175973, -2097555, 730144, --623307, -4020626, -8394514, -1742683, -6027450, 1858110, -139050, 751082, -9466645, -4303021, -6138045, 2126546, -368293, -10487773, -9496173, 5659693, 1016834, 3448322, -6957310, -5545340, -374199, -2825552, -5935108, -4212289, 3336116, -1280437, 1537598, 446677, 4172024, 3063386, -1433445, -2113661, 1130113, -372052, -2525441, -2487323, 2402497, -1019518, 713501, -1606318, --2436857, -418759, -191663, 2174327, -236223, -2104534, 576599, 818728, 2403034, 476741, -584652, -1008244, 3007551, -1133335, 3423626, -1876901, 2542084, -2233920, 401579, 1333587, -128312, -157303, 559956, -507880, -891206, -8137890, 6157373, -3616899, -305480, -21188148, --5009543, -7829726, -5187247, 867047, 6991133, -1387274, 9245991, 4906464, -553514, -9108015, --3780645, 13570486, 2261300, -8111583, -5941014, -2673617, 6351720, -4950487, 68183, 4381404, -6911140, 7814693, -8567923, 5768141, 772020, 1637456, 2436857, 3171297, 2744484, 7835094, -206695, 2383707, -6868727, 9600863, -4829691, -2253247, 1602560, -7958038, 9842454, -1553704, --19267760, -6360847, -15473157, 951335, -236760, -4666482, 20956756, -3661997, -10394358, -3516505, --2565706, 9641665, -1333051, 4602595, 5636608, -3928285, 7182259, 9936944, -5060009, 3786551, --8841190, 4311074, -3179350, -2488934, 10183367, -3726958, -988916, -4527970, 258235, 179315, -3877282, 5763309, 6089727, -1621350, -1742683, 246424, 7892003, 3753802, 4097936, 164283, --6463926, 2598455, -3143916, -3505767, -1938104, -57982, -188442, 425739, 1427540, 1513439, --386010, 4301410, 689879, 1884417, 741956, 856846, -1205812, 1146219, 431107, -1261647, --1883880, -1213328, -3236795, -2520609, 2226404, 1804423, -2739116, 756988, -149250, 780610, -3092913, 668941, -1208496, 348966, 999117, 82141, -2498060, 1121523, 9632538, -13450764, -2685965, 2753074, -4261145, 1809255, 10137197, 10870025, 4029753, 3890167, 5182415, -8404177, --1464047, -8973260, -190052, 5739687, 3629784, -1885491, -7103339, -2295660, 4798552, -9301289, -315680, -658204, 4294431, 8870718, 838592, -4770098, -3641059, 9492415, -6096169, -2934537, -5458904, -3387119, -11212012, -4051765, 2552284, 1908039, -4482335, 1061931, 5841693, 4043712, -5634997, -648003, 4249334, 8076149, -3550864, 4031901, 3469797, -5495411, 11963631, -11477226, -6859063, 3037079, -15972447, 15313169, -9888088, 2194728, -1759326, 12226698, -5172215, -8627516, --1832340, 101469, 2223183, 9401683, -7958575, -363998, 580894, 577136, -1421634, 2805151, --6467684, -920197, -4607963, -8597451, -9546102, 5185100, 4191888, 4019016, 111132, 6087580, --2771865, -6959458, 1840394, -12351789, -10308995, -1907502, 3052111, -68183, -1886564, -1561758, -1512365, -6742562, -2232846, -1388885, -1069447, 3189013, -290984, 561030, 296890, -2186138, -1158567, -2461553, 235149, 1235340, -2665027, -535797, 2352032, -1748589, 69256, -1213328, --45097, 894427, 144418, -3675955, -520765, -4832, -114890, -597000, -2201708, -3784403, --841814, -193810, -449361, 3153580, 2391223, -10718628, 8497056, -24561844, 13445932, -9778030, --6720013, -12010339, 1316408, -1445793, 2076080, 8567923, -7242389, -2776696, 6791417, 6235219, --2101850, 2421288, -3363496, -11259257, -1140851, 2825552, -5840619, 9070434, 1450088, -1066763, --5479305, -5315559, 1142461, 13980655, 484794, -1972464, 3723200, -12098386, -2202245, 4411469, --8310762, 11746736, 7345468, -427886, -3722663, -3943317, -4656282, -8043937, -10062035, 8347806, -490163, 14833743, 1217623, -773094, -6799470, 1231582, -2744484, 3330210, -338766, -9351754, --7444789, -9529459, -16184511, -2235531, 14019310, -13531831, -964757, -14169097, 2130841, 3993783, -3163244, 10115722, -1243393, -14565308, 10324565, -1009317, -7182259, -5874979, -12721156, -4306779, --9703942, 5253819, -14831059, -2445984, 5650030, -107374, 991601, 7037304, 3454228, 8451422, --92342, -4563940, -1931662, -3125126, -281857, 3124589, -986769, 553514, 303869, 345745, --2578054, -3571802, 2133525, -2498597, 970126, 461709, -634581, 1130113, 252866, 481036, -4951561, 929860, -421981, 979789, 1482301, 1138703, -2676838, -370978, -5499706, 2035815, -2660195, 4228932, 1391033, 1469416, -207232, -2702071, 1512902, -100395, 10517301, -3825742, -9349070, -9119289, -4887136, 6454799, 2026151, -12318503, 772020, 16117939, -18545668, 1136019, -8625905, 20857434, -8922795, -5248987, -2302639, 16163573, 15802795, -16678969, -805843, -12801150, --6171868, 8420283, 8400956, 11074573, 6243272, -2135136, 7734699, -9531606, -5182952, -907849, --1487132, -13818520, 1216550, -261456, 18343268, -2781528, 9036611, 2241436, 5354751, 12347494, --7445326, -3258807, -18132278, 12546673, -15979963, -2780991, 3667365, -2101313, -9228811, -2258616, -2621541, -6505265, 1800665, -1013075, -1395328, -20313584, -14427869, 1069447, -10458782, -14243722, -2644626, -13163538, 4219806, 8669928, -7758859, 14846628, 3113851, 9552007, 10190347, 2677375, --7538205, -8887898, -11127187, 5792837, -11545409, 7022272, 8375723, 11597485, 2056216, -8142721, --5254356, 299574, 1139240, -15227807, -352187, -9834938, -1659468, -2729452, 644782, -7179038, -981400, -1584306, -76236, -4633196, -3405372, 1207423, 7665443, 888521, -697932, 1120987, --1054415, -2741800, -2747705, -2972117, -1309428, -3541738, 3976066, 2973728, -233539, -2910914, -4719632, 7110319, -1520418, -1116155, -1618129, -612033, -194884, 1834488, -2620467, 2899103, -2630668, 1890323, -2490007, -263067, 1505923, 2165737, 4877472, -9814537, 25395068, 10645613, -4378183, 13121125, -5030481, 2793339, -13533442, -17352204, 10937134, 22402550, 6634114, -63888, --22119082, 26709864, 3835943, 3324305, 3806952, 1029182, 4803384, 1562831, -3839164, -124554, -6716792, -4094715, 8445516, 1664837, -6680822, -9206262, -2541010, 8484708, -2330020, 2794950, --3835406, -3352759, 127775, 23965380, 3857418, 3497714, 3219078, 2055142, 14329085, -5309117, -4114579, -9233643, 17075716, 23835994, 6193343, -1339493, -8482560, 24903830, 11680164, 396748, --9633075, 3666828, -5781563, -863825, -11049340, -4121558, -7374996, -10099616, 16364899, -4886062, -12059194, 2554969, -9412421, -116501, -20136954, 19160386, -1390496, -9134322, -7153268, -11648488, --14381698, -7846369, 22269942, -6924024, 8022462, 10133975, -9000641, -8548596, -16068010, 2437394, -10834055, 3733400, 10359998, -2375654, -2044941, 477278, 2947421, -4408247, 1241782, -7992934, -2605435, -363998, 9091372, 6416681, -4907537, 500901, -262530, 5410585, -1829656, -7195681, -1605244, -222265, -576063, 2676838, 505196, -1128503, -3599183, -4039417, -766652, -965831, -4286914, -165356, 4300336, -5888400, 1435593, 4437238, -8335458, -6088116, 2212445, -2656974, -6269579, 7528541, -5606006, -5959267, 23675470, 23209466, 28672128, 17252884, 5694053, -7293392, --7569343, 4287988, 8330089, 10188199, -15234786, -453119, -1813550, 7640747, 6038187, -10576357, --13036299, -53150, -4937602, 12426951, 14629732, -8590, 7756711, 2550137, 3102577, 16889422, --10313290, -13676250, 10787347, -17909476, 1551020, -5521181, 9887552, 5041755, 185757, 11557757, -10615549, -9650255, 12027519, -28454, -5141613, 2842732, 13065827, -5051956, 5591511, 9683541, -4386772, -20875152, -12065637, 2054605, 1106491, -14193256, -9693204, 4712116, 6756521, 5738077, --19332184, -13507672, -13452374, -1069447, 8384850, 12221329, -30712774, -22577032, 3760244, 4718559, -17745732, 6254546, 6510097, 12916577, -1387274, -3316789, -4685810, 31712964, 10967199, -5005785, --16592532, 15160698, 9908490, -4960687, -4505421, 2339147, -4564477, 8097087, -2922188, -1736241, -4771172, -1183264, -1899449, -2501819, 5010616, 12998719, 93416, 922881, 457414, 5651103, -7262790, -1853815, -4568772, 1961190, -424665, 1458678, 853088, 1109175, -6164352, -3370476, -4371203, 438087, -2507724, 2126546, 6082748, 4728222, -8156680, -1839320, -5422396, -5230197, -3872987, -6243809, 2447058, -3371549, 6059662, -7225209, -10075456, -19494856, -18979460, -15596100, -6016713, -2006824, 8800925, -17195976, -2838437, 805306, -6639483, -8046085, 13977971, -5354214, -2827162, -210453, 969052, -14020384, -5164162, -11988864, 1591285, 1585380, 3111704, 33153390, --12918725, 9158481, 13951664, -7080791, -6687801, -10028212, -2030983, 15488189, -15804943, 10821170, --1040456, -2630668, 1448478, 1590212, 8485782, 956704, -16767015, 12825309, -10446434, -24054502, --19478214, -9752260, 32561220, 27635968, -15024869, -4319127, -20624970, -17204028, -6800007, 20123532, -518617, 13881871, 7248294, -9458055, 10573136, -7199439, -21467320, -1812476, -13019120, -2646774, --6979322, 42372000, 382252, -35062504, 27528056, -11104101, -7824357, 27825482, 28267864, 100932, --12386686, 5523865, 6908992, -38074348, -16391206, 1018981, -5604933, 19947438, 8434242, -28880970, --4329864, -2309619, 13091060, 8341900, 5695664, 5189394, -6022618, 1040456, 2291902, 12099460, --1503239, 1673427, 2368138, 2076080, 7102266, 3380676, 157840, -8244727, 10445897, -935229, --52076, 497142, 10737, -4449586, -6960532, -4757213, 944893, -1709934, 3039226, -462246, --3085397, 3333968, 7707856, -10245644, -3336653, -3118146, -1472100, 2935610, -199716, -2920041, --5783174, -2156074, -1494649, 5223754, -16862578, -10484552, 5126044, 4002373, 9173513, 28868086, -4981625, -731755, 6759205, 1515587, -11996917, -7365332, 6473053, 1494649, 23574002, 5575405, --1460826, 8536784, 12661027, 12836047, 13813689, 757525, -9674414, -2675228, -22111028, -2994129, --24967182, 13944685, -15190226, -5871757, 84826, 20237350, -11712913, 11267310, -8222178, 6833293, --10314364, 12921946, 19520626, 1343788, -4111358, -10482941, -15121506, 8484171, 9715753, 24752970, --3337727, 1255741, 10916196, 39637716, -9230958, 5953899, -6397354, -22054120, 15511274, -3145527, -11035382, -1354525, 2749316, -13281649, 36702108, -55004572, 40520332, -63114008, 27235998, -32552094, -10140955, -25522306, 9218074, 16940962, -4023311, 12590697, -6448357, 46057620, -27906550, 30583926, --47353088, 23912768, -18556944, 23005992, -15430744, -16719771, -8165270, -4228932, 11632382, -3177739, --2030446, 1162862, 727997, -5911486, 8279087, -8919573, 8748848, -6445672, 2689187, -10258529, --5731097, -7579007, 1371168, -6968585, 8638790, 9205726, -8711267, -138513, 3499325, 8448738, --1267015, 3030100, 6930467, -6487011, 11454141, -3184182, 15146202, -9023189, 18141942, -12936441, -4671314, -1063541, 10120554, 8395587, -1603633, 4915590, -13973139, 15932181, -10944650, 3871913, --11121281, 8053601, -14836428, 5098126, -1249299, -5439039, 5609228, 14039711, 11213623, 44458816, --30917322, 12972949, 8119636, -26612692, -748398, -5189394, -7585986, -13648332, -742493, 1627256, -17670570, 6646462, 9244380, 13340705, 10749229, 458488, 14733348, -16940424, -2455648, 20540682, -2275796, -28049358, -6468221, -36723044, -6882685, 6475737, -6823093, -8513699, -1607928, 32940252, -8304856, 2580739, 4009352, 8293045, -2486786, -18797998, -5782100, -2030446, 3497177, -4285841, --8817568, 23872502, 12811351, -4858145, -1138166, -5052492, -21534966, -17608292, -12917114, -10667625, -24024436, 5853504, 8864276, -14416595, -14068702, 4589173, 9776419, 9087077, -4074313, -2781528, --16335371, -10724533, 14254996, 710817, -39533028, 13970992, 21561272, 6968585, -17231946, -10530186, --8588324, 2899640, -12408697, 6190659, -29100550, -38823284, 16089484, 14093398, -7780334, -14232985, -10903848, -6337224, 2818036, 3441880, -5736466, 6287832, -3556770, -3595425, -2114735, 9410810, --6659347, -1903207, -7284802, -42950, 603443, 6310381, 6468221, -670015, 3809099, -4538707, -7559680, -5216775, 6174553, -14251775, -6519224, -1919850, 4126390, -4625143, -9338870, -7108171, -3405372, 7421167, -281320, 9573482, 2672544, 3813931, 581968, 6247030, -3512210, 5971079, --1433445, -11744051, -9069360, -3432753, 5365488, -6588480, 3899830, -36660232, 32088774, 39051452, --3675418, 28391882, 1136556, 4335233, 12350178, -25087440, 9102109, 18559090, 18297634, 7679939, -5654325, -18142478, 13248363, 7799124, -11023570, 5851356, -2207613, 21625160, 5944772, 5524402, -12765717, -5138929, -14752676, 4247723, 27538794, -9884330, -5383205, 24879134, -9165460, -11149198, --9088151, 8559333, 31995896, 44511968, -2789581, -28896004, 43656196, 15028627, -28782724, 32561220, -12457016, -8090645, -8370355, -12227772, -20285130, -1162862, 10632192, -17399450, -11398306, -36742372, --5000416, 21374442, -44508748, -24111410, 7019587, 7167764, 8772471, 26990112, 23884850, -39553964, -321586, 1511292, -27992986, 7812009, 13316009, -14364518, -10252624, -12128988, 8109972, 31078384, -9725953, 16161962, -21253646, 10829760, -24064702, 2104534, -16183974, -65751116, 50287088, 12923020, --18352396, 34039228, -11744051, -15510738, 9156870, 6956237, 8757975, 13310104, 5383205, -13371307, --4246649, 13058311, -429497, 5024575, 2105608, -2144263, 3205656, -5865315, 4343286, 12200391, -4404489, -7199439, -5326297, 3724811, -3267396, -6532109, 2489471, 7611219, 4423280, -22741314, --6877854, -16748225, -8689793, 9761387, -7467338, -9361418, 8909910, 5756867, -9816685, 12469364, --9210020, -4030290, 4478577, -7228967, 8196945, -3646427, -13492103, -20862266, 24039468, 79703856, --25447144, 702227, 6124624, 35986996, 31905164, -10442676, -13852880, -20099910, 855772, 15243376, --507880, -10276246, -10569378, 14384919, -7849590, -19335406, -17285632, -3491809, 29287918, 20542828, --23291608, 1564979, 423591, -10155450, 11545409, 4271882, -8312373, -2743947, -6538014, -3123515, -37387152, -13923210, -24831354, -17380658, -14113799, 33064268, 913754, -7667591, 30445950, 20928838, -8318278, 15493021, 29938070, -18210662, 4614406, 29127932, 17029546, 22251688, -25282324, -7129646, --948114, 10656351, 10038949, -23933168, 2279554, -31442918, -47288664, -2498597, -12514461, 21951578, -24413130, -6411850, -1944547, 4950487, -17199196, -45808512, 30817464, -22203908, 4758287, -8556649, --15496242, -8997956, -17969070, -36318780, 21432424, 19068582, 23142894, 4453344, -28864864, -50706920, --15063524, -14042932, -6214818, 16002511, -10384157, -2558727, 3045669, 2125472, -8080444, -3715147, --6495065, 754841, -2904472, 5326833, -3200288, -3969624, 5859946, 7611756, 6037651, -12306155, -3993783, 653909, -1132261, 99858, -26972394, 1254667, 3700651, 3911105, -17783312, 11500312, --2576444, -14846628, -12127377, 7115150, 9474161, -1849520, 5611375, -9193377, -6449431, -6296959, -683437, 10924786, 2749316, 10423886, -302258, 4771172, -15706695, -2544768, 3780108, 2078764, --12459163, -3775813, -39140036, -22436910, -18248242, -46079092, 53204444, -1219771, 28021978, -6394670, -1392643, -32116154, -17566416, -16571058, 3707094, 25164750, -1159104, -26201984, -19602230, -37455872, --41704132, 35763656, 13187160, -32457604, -10082436, 16014322, 29773788, 4172561, -36970004, -22473416, -7275675, 10340134, 9165460, 21577378, -22991496, -21808234, -3361349, -7739531, 3032247, 6426345, --44427140, -8185671, -30991410, -19839528, -41329396, -15661598, 56581364, 9760313, 1773285, 13883482, -14017163, 4435091, 42041288, 33298344, -11026255, 11313481, 56810068, -14885820, -13293998, -13571560, --42355892, -1631014, -23201414, -52585432, -55175296, -28913182, -28494960, 12885976, -21347062, 1866700, -11161009, -37470904, -13758391, 238908, -187905, 9674951, 24477018, 16295643, 29520384, 40018356, -29003378, -3574487, -21162914, -30655866, -2637110, 12688407, 3710315, -4313221, -409633, 8692477, -6993818, 18849000, -2148558, 3005403, 307627, -6280853, 6134824, 974421, -3063922, 16107201, -6939057, 3656628, -15127412, 10159208, -5449777, 7661685, -14359149, -39756900, -1898376, 15698105, --3002719, -21103322, -13581760, -15444702, -11686069, 5036386, 6892886, 7883413, 2110977, -1413044, -5873905, 15557982, 25927106, 24531242, 30456686, 26115012, -2550137, 17559436, 39727372, 2822867, --17523466, -24922622, -25156698, -34163244, -27809376, -13284871, -14970109, -2090039, 35221952, -23026394, -6957847, -26669062, -9042517, -29083908, 3735548, 35279400, -811212, 21805012, -43616468, 38343320, -12850005, -7857106, 30392262, 4261682, 13826573, -12155294, -14347338, -272730, 9312563, 7137162, --30455076, 27960238, -33749852, 4135517, 9446781, -11457362, 19894826, -20977694, -11916387, -2316061, --7484518, -10619307, -2342905, 4502200, -15583752, -18369038, -5950677, -3214246, -4508642, 11162620, -6067178, 4548907, -22282828, 5930813, 27114128, 35941360, -26511760, -13357885, 30561914, 41794864, --25338160, -15671262, 17627082, 7398081, -20122996, 16709570, -47270948, -9309342, 19267224, 37790880, -4920959, -23442468, -21195126, 5736466, 45296336, 3948686, 6794639, 1359357, 15035070, -2901251, -33666100, -368293, -37234144, 23502598, -24291798, -7450695, 10314364, -14219026, 3409130, -30316026, --11288248, 28111634, 12958990, -12594455, -17993766, -9851044, 2366527, -14615237, -4395362, -3222299, --8940511, -5491653, -4305168, -18975702, 12040941, -7092065, -8397735, -27485644, -6906308, 20219096, --13961865, -7721278, -7261716, -15697032, 30262340, 12410845, 1201517, -992674, -16749836, -25160456, -1660005, 22507240, 18526878, 6199249, -18866180, -11057930, -8391292, 10980621, 2075006, -16828756, --4099010, 1093606, 6710350, -14968498, -9996536, -8829379, 23551454, 12037720, 1604170, -14539001, --12512313, 13161390, 28309740, -282931, -12048994, -17365626, -5794985, 7849053, 716186, -4001836, -1104880, -3464428, -2565706, 2673080, -56834764, -15902653, 9708774, -19330574, 56313464, 41024992, -27085138, 14196478, 38018512, 26644366, 9004399, 18095770, -44542032, -60117732, -8256001, 404801, --15349676, 7850664, -2784750, -15832323, -19582904, -16209743, 31150324, 26865558, -21567178, -2957622, --2936684, -5614059, -7615514, -11460046, -16304770, -23124104, -4299799, 40349072, -12874701, -22687090, --10665478, 37860672, -17678086, -17655000, 58954332, 20772610, 10003516, -14487998, -32240172, -22748832, --33257006, 8855149, 27630062, 74175696, -65212636, -27864674, 38434588, 52910776, 9373229, -3277060, -68245960, 32516124, -21383568, 21586506, -7730405, 145492, -47068008, -23906324, -16372415, -77454368, --32689532, -12564390, 41769632, -22608170, -12914967, 30988190, -1947231, -4196720, 7556458, 21793200, --21012590, 15391015, 23779624, 493384, -4380867, -43728672, 20276004, 15615427, -50363324, -3686693, -5590437, 3246995, -4172024, -22436372, 6094022, 3790309, 6429029, -3561602, -6354404, 16134582, -3571802, -3379066, 11258183, 4607426, 29799020, -4069482, 9859634, 1869921, -23438710, -20536386, -14541149, -11433740, 8890582, 11078868, 7002944, 6840273, 324807, 19609210, -6130529, -4912369, --7608535, 5627481, 15408732, -23007066, -8429410, 11049340, 5266167, -13034689, -23336168, -5998996, -6577206, 49292264, 18099530, -4116189, 12794171, -2502355, -4552666, -18168786, 8727374, 7524246, --14321568, -6982006, -52141440, -2122251, 21483964, -5037460, -21738976, 9519795, -4878009, 23463944, -4696010, -11365020, -174483, 25119116, -14292577, 4042638, 9079561, -7641284, -215822, -13587666, -27741194, -1664837, 4132832, 445066, 13408888, -6068789, -5216238, -8669391, 5548561, 10425496, --4564477, 12385075, -5358509, 7632157, -13007845, -10248866, 15799574, 20259898, -26170310, 1224603, -39192, 2454574, 8253854, -16466368, 25266756, -22626424, 20337208, 2848100, -35321812, -1924682, -27576374, -35955856, 17162690, 158377, 4652524, -8631811, -5379984, 7268159, -10424959, 36826660, --27236536, 4074313, -7304666, -3302830, 9088151, 517544, -4464619, -843961, 11141682, -345745, --12773770, 3602941, 6491843, -21392158, 16648904, 7515119, 789200, 15346455, -5612449, -4745939, -7229504, 3353833, 4587025, 2609730, -4229469, 8664023, 3733937, 642635, -9356049, -1545115, -4575214, 8304320, -14202920, 7434052, 8853001, -12554726, 5958194, 1842541, 2139968, 6626061, --3733937, 1480153, -2340220, -18211198, -273804, -4403952, 7955353, -5130339, 3037616, 1997160, --751082, 2428267, 4609037, -3018825, 4295, 819265, -130997, 1315871, 5534066, -5647345, -5185100, -4125316, -26274462, -74187504, -105962208, 35633196, 94238560, 20808042, 261197360, 215122032, -145350288, 245979760, 128133368, -8739185, -30689152, -97119408, -224258496, -185192016, -180112672, -250465312, --185173216, -54378580, -40103184, -6555731, 87158312, 40580460, -10827076, 55288040, 91443608, 44781476, -42848204, 83224120, 49582712, 38241316, 75406744, 118406880, 49300320, 69510288, 111144624, 19077708, -7546258, 98209792, 58076012, -37649684, 47359532, 61028800, -63678260, -18997178, 70382168, -14176076, --42127724, 90914256, 48194364, -56398828, 48798344, 64725156, -86312200, -80798000, -34509524, -208447648, --276600736, -173480704, -244529136, -325952576, -227131296, -232436656, -300528000, -237652896, -164791456, -178677088, --106789528, 10205916, 66716412, 145021184, 237282992, 295772384, 364217536, 404668608, 442085824, 468772608, -420947072, 331012064, 305788800, 196009952, 59263568, 46551540, -31323196, -150494576, -118199648, -50157700, --111970336, -115118008, -24298240, -81093816, -155436480, -93868656, -68067712, -139036688, -118374664, -41826004, --105197704, -124978176, -9959492, -6238977, -56297356, 22367652, 13051332, -90618440, -67170064, -38986492, --129012768, -177761712, -145357264, -198545056, -246279872, -182703072, -146731120, -139179488, -60919816, 28548110, -74086576, 109913584, 151769648, 171272560, 153622384, 200292048, 256780528, 266178992, 248589488, 253168992, -244185536, 198255152, 223857984, 202116336, 86896312, 11434814, -49597208, -109308528, -115546968, -95266672, --112528144, -110007536, -95225864, -93947576, -100153808, -82252384, -73451456, -70123928, -66205848, -51005420, --48302812, -50069656, -39617852, -25890600, -23276038, -14841796, -1594507, 6151467, 6395743, 7705708, -2896419, 1775969, 0, 0, 0, 0, 0, 0, }, +6170258, -3467112, 1032940, -5153961, 1443109, 580357, 7864622, -4709432, 15569, -2477123, +3941706, 4025458, -2567317, -488016, -2206540, -1264868, -2579128, -3210488, 2369748, 775778, +-2099702, 4391604, 3998078, 6833830, -201863, 2589329, 1359357, -112206, -6172405, 1607928, +2572149, -2434710, 1545115, -1794223, -2091649, -3385508, 1760937, 4363687, 453656, 5091684, +-2073932, -430034, 5135171, 2688650, 418759, -59593, 4878546, 7326141, -5439039, 1224603, +-1874216, -839129, -8468602, -3003256, 3433290, -2627446, 2381559, 1102196, -1236951, -2050310, +1207960, -697932, 2652679, 1440425, 1241246, 1360431, -4389994, 173946, -2105071, 2714419, +4500052, 3156801, -628139, 4871567, 43487, 2071785, -632434, -1071058, 273267, 2448668, +2824478, -908922, -1904818, -3950296, -496606, -1736241, -1859721, -1045288, -1579474, -1129576, +-1862405, -972810, -29528, -13422, 61203, 1574642, -1063004, 829466, -371515, -747861, +62814, 728534, 282931, 583042, 22012, -511101, 32212, 744640, 265214, -1062468, +-811749, -27380, 35433, 450972, 89657, 815507, -1052804, 3673271, -4502737, -4709969, +178241, -6343130, 1164473, -1997160, 3082713, -1699196, -5031554, 572304, 4932770, -753767, +170188, 6868190, 8632884, -3725347, -3961034, -1125818, -6417218, 2741800, 586263, 1599875, +-2256469, 3426310, -4471061, -814433, 3062312, -2516314, -916976, 469225, 5563057, 358093, +4025458, -5304822, 5212480, -568009, 754304, 3374234, -2910914, 2815351, -1321239, -1347009, +2425583, 3199751, -541166, 1830193, -7035157, 4255239, 4130685, -7458211, -6564321, -1854352, +-5443871, -1525787, 2077690, 1354525, 1983738, 114354, -1813550, 4589710, -1535988, 168041, +-1833414, 1081258, -2777770, 3905199, 958851, -3004867, -1678259, -1189706, -1739999, -1541356, +3956739, 5181878, -244813, -1056562, 203474, 1659468, -1075889, 3620121, 2057826, -1479616, +-275952, -924492, 1576253, -1517734, -40265, -400506, 242666, 573378, -86436, -445066, +984621, -760209, -249645, 203474, 658204, 51540, -1311039, -907312, 257161, -865973, +-722091, 868657, -456877, -1606855, -1030792, -1292785, -339302, 204548, 1549410, 11094974, +2119566, -4102768, 5143760, 654983, -3492345, 10134512, -6800544, -9741523, -5709086, -5906654, +-1988570, 2882460, 3555159, -3366718, 5116380, -6419366, -3500398, -776315, 2128156, 1601486, +-1955821, -2522757, 5724118, 1102196, -390305, -3208878, 4272956, -3125126, -723165, -6442, +-362388, -448824, 1663763, 889058, -881542, 3568044, -1682554, 2175401, -153545, -5820218, +-2283849, -2324651, 6189585, -3431142, -4172561, -7558606, -8832063, -1613834, 449361, -3526705, +6702297, 905164, 3600256, -2706903, 5801427, 2474438, -3364033, 9355513, -4239133, -4529580, +724239, 5864241, 8596377, 6087580, 2015413, -2994129, -6765647, 2695629, -83215, 6667400, +2681133, -1905355, -230854, 3400004, 2731062, 49929, -637266, 280247, -1331977, -2808372, +-265751, 884226, 695785, 2427730, -86436, 1472100, -515396, 1161789, -295816, 221728, +-250182, -1643362, 154082, -299574, -2107755, 1693291, -389231, 1037235, -572841, -1132798, +156766, 201327, -82141, -740882, 780610, 313533, -557272, -170188, -1621887, 210453, +-915365, 817654, -304943, 1753420, -792421, -10478110, 1628330, -3794604, 2422362, 723702, +7532299, -9689446, -5557151, -7104413, 3806415, 3199751, 4571456, -5058935, 1738925, -1481227, +635655, -7895761, -6772627, -4929549, -4925791, 8039105, -3236795, -928787, -156766, 2762738, +-1287417, -8390219, 3540664, -3315715, -1112397, 3934727, 2917357, 4511863, 277562, 2430415, +-5914707, -2403034, 5283347, 8831527, 5148592, -343061, -6726456, 4828080, -2174864, -5760088, +8002598, 2420214, 2746632, -4888747, -2884071, 2792266, -1822140, -2702608, 4219269, -3288871, +1462436, 255014, -5593121, -1139777, -3703873, 5912560, 2980171, -768262, 993748, -2651606, +3468723, 629213, -106300, 1079111, -6691559, -3435437, 3766686, 1868311, -1096827, -813896, +-4759361, 7843147, 9642202, 5376762, -4428648, 4005057, 676457, 3425773, -1476395, 2824478, +-2126009, 1845762, 3520263, 1949378, 1685775, 1329292, 63888, -1138703, -401043, 3504693, +175557, 278099, -1302449, -199716, 720481, 2126546, -264141, 2490544, 397284, 110595, +-94489, 2030446, 2433099, -1016834, -469762, -226560, 375810, 1789928, -103079, 517544, +127775, 464930, -877784, -15846819, 5287105, 804233, 3941706, 4268661, -3094524, -11207180, +8637179, 3669513, 8498667, -1562294, 4505421, -88047, -3058554, -209917, -7921531, 9693741, +2213519, 919123, -4989142, -2865817, -3379066, 2896419, -4449049, 7424388, 326418, 2556579, +4136054, 2286533, -476205, 2398202, 2290828, -1733556, 1927904, -8252780, 2146410, 3764002, +3850975, 7413651, 2574296, -4948876, 2481954, -2492692, 5041755, 979253, 3668976, 5645198, +925029, -1232119, 4422743, -3039763, -4805532, -1772748, 3085397, 7823820, -1853815, 497142, +140123, 940598, 1535988, 3281892, 1112933, -2050847, -368830, -2768107, 2014340, 656056, +-4955856, -4356171, 1741609, 2759517, 2760053, 4920959, -7568269, -4063576, -5516886, 6500433, +-2862596, -4019016, 2103997, -3703336, -5394479, -1938641, 150861, 5787469, -2041720, 1880122, +-2299418, -1336272, -335544, 1773822, 764504, -1031329, -876710, 1123671, 2869038, 988379, +1654099, -779000, -545461, 1964948, -77309, 153008, 731218, -1336272, 2563022, -779537, +-178778, -1177358, -3268470, -484794, -719944, -218506, -36507, -1204202, 128849, 2953864, +-731218, -256624, -558883, -1056025, 3910031, 16094316, 8539469, 7646653, 11149198, 3034395, +2036888, -6818261, -223338, -12751221, -2297271, 4859756, 3526705, 2268280, 2950643, 3512210, +-2752537, -1862942, 7311645, 6594923, 5656472, -425739, 794032, -9104794, -7888781, -2983929, +5765994, 1869921, -1196148, 3135863, -5305359, 506806, -2736968, 6346888, 4981625, 11143830, +-1105417, 4207458, 3501472, -1787243, -5841156, 10485089, -6093485, -1377074, 4745939, 233002, +2697776, 7561290, -2412698, 2823941, -7305740, -15611669, -8661875, -5175973, -2097555, 730144, +-623307, -4020626, -8394514, -1742683, -6027450, 1858110, -139050, 751082, -9466645, -4303021, +6138045, 2126546, -368293, -10487773, -9496173, 5659693, 1016834, 3448322, -6957310, -5545340, +374199, -2825552, -5935108, -4212289, 3336116, -1280437, 1537598, 446677, 4172024, 3063386, +1433445, -2113661, 1130113, -372052, -2525441, -2487323, 2402497, -1019518, 713501, -1606318, +-2436857, -418759, -191663, 2174327, -236223, -2104534, 576599, 818728, 2403034, 476741, +584652, -1008244, 3007551, -1133335, 3423626, -1876901, 2542084, -2233920, 401579, 1333587, +128312, -157303, 559956, -507880, -891206, -8137890, 6157373, -3616899, -305480, -21188148, +-5009543, -7829726, -5187247, 867047, 6991133, -1387274, 9245991, 4906464, -553514, -9108015, +-3780645, 13570486, 2261300, -8111583, -5941014, -2673617, 6351720, -4950487, 68183, 4381404, +6911140, 7814693, -8567923, 5768141, 772020, 1637456, 2436857, 3171297, 2744484, 7835094, +206695, 2383707, -6868727, 9600863, -4829691, -2253247, 1602560, -7958038, 9842454, -1553704, +-19267760, -6360847, -15473157, 951335, -236760, -4666482, 20956756, -3661997, -10394358, -3516505, +-2565706, 9641665, -1333051, 4602595, 5636608, -3928285, 7182259, 9936944, -5060009, 3786551, +-8841190, 4311074, -3179350, -2488934, 10183367, -3726958, -988916, -4527970, 258235, 179315, +3877282, 5763309, 6089727, -1621350, -1742683, 246424, 7892003, 3753802, 4097936, 164283, +-6463926, 2598455, -3143916, -3505767, -1938104, -57982, -188442, 425739, 1427540, 1513439, +-386010, 4301410, 689879, 1884417, 741956, 856846, -1205812, 1146219, 431107, -1261647, +-1883880, -1213328, -3236795, -2520609, 2226404, 1804423, -2739116, 756988, -149250, 780610, +3092913, 668941, -1208496, 348966, 999117, 82141, -2498060, 1121523, 9632538, -13450764, +2685965, 2753074, -4261145, 1809255, 10137197, 10870025, 4029753, 3890167, 5182415, -8404177, +-1464047, -8973260, -190052, 5739687, 3629784, -1885491, -7103339, -2295660, 4798552, -9301289, +315680, -658204, 4294431, 8870718, 838592, -4770098, -3641059, 9492415, -6096169, -2934537, +5458904, -3387119, -11212012, -4051765, 2552284, 1908039, -4482335, 1061931, 5841693, 4043712, +5634997, -648003, 4249334, 8076149, -3550864, 4031901, 3469797, -5495411, 11963631, -11477226, +6859063, 3037079, -15972447, 15313169, -9888088, 2194728, -1759326, 12226698, -5172215, -8627516, +-1832340, 101469, 2223183, 9401683, -7958575, -363998, 580894, 577136, -1421634, 2805151, +-6467684, -920197, -4607963, -8597451, -9546102, 5185100, 4191888, 4019016, 111132, 6087580, +-2771865, -6959458, 1840394, -12351789, -10308995, -1907502, 3052111, -68183, -1886564, -1561758, +1512365, -6742562, -2232846, -1388885, -1069447, 3189013, -290984, 561030, 296890, -2186138, +1158567, -2461553, 235149, 1235340, -2665027, -535797, 2352032, -1748589, 69256, -1213328, +-45097, 894427, 144418, -3675955, -520765, -4832, -114890, -597000, -2201708, -3784403, +-841814, -193810, -449361, 3153580, 2391223, -10718628, 8497056, -24561844, 13445932, -9778030, +-6720013, -12010339, 1316408, -1445793, 2076080, 8567923, -7242389, -2776696, 6791417, 6235219, +-2101850, 2421288, -3363496, -11259257, -1140851, 2825552, -5840619, 9070434, 1450088, -1066763, +-5479305, -5315559, 1142461, 13980655, 484794, -1972464, 3723200, -12098386, -2202245, 4411469, +-8310762, 11746736, 7345468, -427886, -3722663, -3943317, -4656282, -8043937, -10062035, 8347806, +490163, 14833743, 1217623, -773094, -6799470, 1231582, -2744484, 3330210, -338766, -9351754, +-7444789, -9529459, -16184511, -2235531, 14019310, -13531831, -964757, -14169097, 2130841, 3993783, +3163244, 10115722, -1243393, -14565308, 10324565, -1009317, -7182259, -5874979, -12721156, -4306779, +-9703942, 5253819, -14831059, -2445984, 5650030, -107374, 991601, 7037304, 3454228, 8451422, +-92342, -4563940, -1931662, -3125126, -281857, 3124589, -986769, 553514, 303869, 345745, +-2578054, -3571802, 2133525, -2498597, 970126, 461709, -634581, 1130113, 252866, 481036, +4951561, 929860, -421981, 979789, 1482301, 1138703, -2676838, -370978, -5499706, 2035815, +2660195, 4228932, 1391033, 1469416, -207232, -2702071, 1512902, -100395, 10517301, -3825742, +9349070, -9119289, -4887136, 6454799, 2026151, -12318503, 772020, 16117939, -18545668, 1136019, +8625905, 20857434, -8922795, -5248987, -2302639, 16163573, 15802795, -16678969, -805843, -12801150, +-6171868, 8420283, 8400956, 11074573, 6243272, -2135136, 7734699, -9531606, -5182952, -907849, +-1487132, -13818520, 1216550, -261456, 18343268, -2781528, 9036611, 2241436, 5354751, 12347494, +-7445326, -3258807, -18132278, 12546673, -15979963, -2780991, 3667365, -2101313, -9228811, -2258616, +2621541, -6505265, 1800665, -1013075, -1395328, -20313584, -14427869, 1069447, -10458782, -14243722, +2644626, -13163538, 4219806, 8669928, -7758859, 14846628, 3113851, 9552007, 10190347, 2677375, +-7538205, -8887898, -11127187, 5792837, -11545409, 7022272, 8375723, 11597485, 2056216, -8142721, +-5254356, 299574, 1139240, -15227807, -352187, -9834938, -1659468, -2729452, 644782, -7179038, +981400, -1584306, -76236, -4633196, -3405372, 1207423, 7665443, 888521, -697932, 1120987, +-1054415, -2741800, -2747705, -2972117, -1309428, -3541738, 3976066, 2973728, -233539, -2910914, +4719632, 7110319, -1520418, -1116155, -1618129, -612033, -194884, 1834488, -2620467, 2899103, +2630668, 1890323, -2490007, -263067, 1505923, 2165737, 4877472, -9814537, 25395068, 10645613, +4378183, 13121125, -5030481, 2793339, -13533442, -17352204, 10937134, 22402550, 6634114, -63888, +-22119082, 26709864, 3835943, 3324305, 3806952, 1029182, 4803384, 1562831, -3839164, -124554, +6716792, -4094715, 8445516, 1664837, -6680822, -9206262, -2541010, 8484708, -2330020, 2794950, +-3835406, -3352759, 127775, 23965380, 3857418, 3497714, 3219078, 2055142, 14329085, -5309117, +4114579, -9233643, 17075716, 23835994, 6193343, -1339493, -8482560, 24903830, 11680164, 396748, +-9633075, 3666828, -5781563, -863825, -11049340, -4121558, -7374996, -10099616, 16364899, -4886062, +12059194, 2554969, -9412421, -116501, -20136954, 19160386, -1390496, -9134322, -7153268, -11648488, +-14381698, -7846369, 22269942, -6924024, 8022462, 10133975, -9000641, -8548596, -16068010, 2437394, +10834055, 3733400, 10359998, -2375654, -2044941, 477278, 2947421, -4408247, 1241782, -7992934, +2605435, -363998, 9091372, 6416681, -4907537, 500901, -262530, 5410585, -1829656, -7195681, +1605244, -222265, -576063, 2676838, 505196, -1128503, -3599183, -4039417, -766652, -965831, +4286914, -165356, 4300336, -5888400, 1435593, 4437238, -8335458, -6088116, 2212445, -2656974, +6269579, 7528541, -5606006, -5959267, 23675470, 23209466, 28672128, 17252884, 5694053, -7293392, +-7569343, 4287988, 8330089, 10188199, -15234786, -453119, -1813550, 7640747, 6038187, -10576357, +-13036299, -53150, -4937602, 12426951, 14629732, -8590, 7756711, 2550137, 3102577, 16889422, +-10313290, -13676250, 10787347, -17909476, 1551020, -5521181, 9887552, 5041755, 185757, 11557757, +10615549, -9650255, 12027519, -28454, -5141613, 2842732, 13065827, -5051956, 5591511, 9683541, +4386772, -20875152, -12065637, 2054605, 1106491, -14193256, -9693204, 4712116, 6756521, 5738077, +-19332184, -13507672, -13452374, -1069447, 8384850, 12221329, -30712774, -22577032, 3760244, 4718559, +17745732, 6254546, 6510097, 12916577, -1387274, -3316789, -4685810, 31712964, 10967199, -5005785, +-16592532, 15160698, 9908490, -4960687, -4505421, 2339147, -4564477, 8097087, -2922188, -1736241, +4771172, -1183264, -1899449, -2501819, 5010616, 12998719, 93416, 922881, 457414, 5651103, +7262790, -1853815, -4568772, 1961190, -424665, 1458678, 853088, 1109175, -6164352, -3370476, +4371203, 438087, -2507724, 2126546, 6082748, 4728222, -8156680, -1839320, -5422396, -5230197, +3872987, -6243809, 2447058, -3371549, 6059662, -7225209, -10075456, -19494856, -18979460, -15596100, +6016713, -2006824, 8800925, -17195976, -2838437, 805306, -6639483, -8046085, 13977971, -5354214, +2827162, -210453, 969052, -14020384, -5164162, -11988864, 1591285, 1585380, 3111704, 33153390, +-12918725, 9158481, 13951664, -7080791, -6687801, -10028212, -2030983, 15488189, -15804943, 10821170, +-1040456, -2630668, 1448478, 1590212, 8485782, 956704, -16767015, 12825309, -10446434, -24054502, +-19478214, -9752260, 32561220, 27635968, -15024869, -4319127, -20624970, -17204028, -6800007, 20123532, +518617, 13881871, 7248294, -9458055, 10573136, -7199439, -21467320, -1812476, -13019120, -2646774, +-6979322, 42372000, 382252, -35062504, 27528056, -11104101, -7824357, 27825482, 28267864, 100932, +-12386686, 5523865, 6908992, -38074348, -16391206, 1018981, -5604933, 19947438, 8434242, -28880970, +-4329864, -2309619, 13091060, 8341900, 5695664, 5189394, -6022618, 1040456, 2291902, 12099460, +-1503239, 1673427, 2368138, 2076080, 7102266, 3380676, 157840, -8244727, 10445897, -935229, +-52076, 497142, 10737, -4449586, -6960532, -4757213, 944893, -1709934, 3039226, -462246, +-3085397, 3333968, 7707856, -10245644, -3336653, -3118146, -1472100, 2935610, -199716, -2920041, +-5783174, -2156074, -1494649, 5223754, -16862578, -10484552, 5126044, 4002373, 9173513, 28868086, +4981625, -731755, 6759205, 1515587, -11996917, -7365332, 6473053, 1494649, 23574002, 5575405, +-1460826, 8536784, 12661027, 12836047, 13813689, 757525, -9674414, -2675228, -22111028, -2994129, +-24967182, 13944685, -15190226, -5871757, 84826, 20237350, -11712913, 11267310, -8222178, 6833293, +-10314364, 12921946, 19520626, 1343788, -4111358, -10482941, -15121506, 8484171, 9715753, 24752970, +-3337727, 1255741, 10916196, 39637716, -9230958, 5953899, -6397354, -22054120, 15511274, -3145527, +11035382, -1354525, 2749316, -13281649, 36702108, -55004572, 40520332, -63114008, 27235998, -32552094, +10140955, -25522306, 9218074, 16940962, -4023311, 12590697, -6448357, 46057620, -27906550, 30583926, +-47353088, 23912768, -18556944, 23005992, -15430744, -16719771, -8165270, -4228932, 11632382, -3177739, +-2030446, 1162862, 727997, -5911486, 8279087, -8919573, 8748848, -6445672, 2689187, -10258529, +-5731097, -7579007, 1371168, -6968585, 8638790, 9205726, -8711267, -138513, 3499325, 8448738, +-1267015, 3030100, 6930467, -6487011, 11454141, -3184182, 15146202, -9023189, 18141942, -12936441, +4671314, -1063541, 10120554, 8395587, -1603633, 4915590, -13973139, 15932181, -10944650, 3871913, +-11121281, 8053601, -14836428, 5098126, -1249299, -5439039, 5609228, 14039711, 11213623, 44458816, +-30917322, 12972949, 8119636, -26612692, -748398, -5189394, -7585986, -13648332, -742493, 1627256, +17670570, 6646462, 9244380, 13340705, 10749229, 458488, 14733348, -16940424, -2455648, 20540682, +2275796, -28049358, -6468221, -36723044, -6882685, 6475737, -6823093, -8513699, -1607928, 32940252, +8304856, 2580739, 4009352, 8293045, -2486786, -18797998, -5782100, -2030446, 3497177, -4285841, +-8817568, 23872502, 12811351, -4858145, -1138166, -5052492, -21534966, -17608292, -12917114, -10667625, +24024436, 5853504, 8864276, -14416595, -14068702, 4589173, 9776419, 9087077, -4074313, -2781528, +-16335371, -10724533, 14254996, 710817, -39533028, 13970992, 21561272, 6968585, -17231946, -10530186, +-8588324, 2899640, -12408697, 6190659, -29100550, -38823284, 16089484, 14093398, -7780334, -14232985, +10903848, -6337224, 2818036, 3441880, -5736466, 6287832, -3556770, -3595425, -2114735, 9410810, +-6659347, -1903207, -7284802, -42950, 603443, 6310381, 6468221, -670015, 3809099, -4538707, +7559680, -5216775, 6174553, -14251775, -6519224, -1919850, 4126390, -4625143, -9338870, -7108171, +3405372, 7421167, -281320, 9573482, 2672544, 3813931, 581968, 6247030, -3512210, 5971079, +-1433445, -11744051, -9069360, -3432753, 5365488, -6588480, 3899830, -36660232, 32088774, 39051452, +-3675418, 28391882, 1136556, 4335233, 12350178, -25087440, 9102109, 18559090, 18297634, 7679939, +5654325, -18142478, 13248363, 7799124, -11023570, 5851356, -2207613, 21625160, 5944772, 5524402, +12765717, -5138929, -14752676, 4247723, 27538794, -9884330, -5383205, 24879134, -9165460, -11149198, +-9088151, 8559333, 31995896, 44511968, -2789581, -28896004, 43656196, 15028627, -28782724, 32561220, +12457016, -8090645, -8370355, -12227772, -20285130, -1162862, 10632192, -17399450, -11398306, -36742372, +-5000416, 21374442, -44508748, -24111410, 7019587, 7167764, 8772471, 26990112, 23884850, -39553964, +321586, 1511292, -27992986, 7812009, 13316009, -14364518, -10252624, -12128988, 8109972, 31078384, +9725953, 16161962, -21253646, 10829760, -24064702, 2104534, -16183974, -65751116, 50287088, 12923020, +-18352396, 34039228, -11744051, -15510738, 9156870, 6956237, 8757975, 13310104, 5383205, -13371307, +-4246649, 13058311, -429497, 5024575, 2105608, -2144263, 3205656, -5865315, 4343286, 12200391, +4404489, -7199439, -5326297, 3724811, -3267396, -6532109, 2489471, 7611219, 4423280, -22741314, +-6877854, -16748225, -8689793, 9761387, -7467338, -9361418, 8909910, 5756867, -9816685, 12469364, +-9210020, -4030290, 4478577, -7228967, 8196945, -3646427, -13492103, -20862266, 24039468, 79703856, +-25447144, 702227, 6124624, 35986996, 31905164, -10442676, -13852880, -20099910, 855772, 15243376, +-507880, -10276246, -10569378, 14384919, -7849590, -19335406, -17285632, -3491809, 29287918, 20542828, +-23291608, 1564979, 423591, -10155450, 11545409, 4271882, -8312373, -2743947, -6538014, -3123515, +37387152, -13923210, -24831354, -17380658, -14113799, 33064268, 913754, -7667591, 30445950, 20928838, +8318278, 15493021, 29938070, -18210662, 4614406, 29127932, 17029546, 22251688, -25282324, -7129646, +-948114, 10656351, 10038949, -23933168, 2279554, -31442918, -47288664, -2498597, -12514461, 21951578, +24413130, -6411850, -1944547, 4950487, -17199196, -45808512, 30817464, -22203908, 4758287, -8556649, +-15496242, -8997956, -17969070, -36318780, 21432424, 19068582, 23142894, 4453344, -28864864, -50706920, +-15063524, -14042932, -6214818, 16002511, -10384157, -2558727, 3045669, 2125472, -8080444, -3715147, +-6495065, 754841, -2904472, 5326833, -3200288, -3969624, 5859946, 7611756, 6037651, -12306155, +3993783, 653909, -1132261, 99858, -26972394, 1254667, 3700651, 3911105, -17783312, 11500312, +-2576444, -14846628, -12127377, 7115150, 9474161, -1849520, 5611375, -9193377, -6449431, -6296959, +683437, 10924786, 2749316, 10423886, -302258, 4771172, -15706695, -2544768, 3780108, 2078764, +-12459163, -3775813, -39140036, -22436910, -18248242, -46079092, 53204444, -1219771, 28021978, -6394670, +1392643, -32116154, -17566416, -16571058, 3707094, 25164750, -1159104, -26201984, -19602230, -37455872, +-41704132, 35763656, 13187160, -32457604, -10082436, 16014322, 29773788, 4172561, -36970004, -22473416, +7275675, 10340134, 9165460, 21577378, -22991496, -21808234, -3361349, -7739531, 3032247, 6426345, +-44427140, -8185671, -30991410, -19839528, -41329396, -15661598, 56581364, 9760313, 1773285, 13883482, +14017163, 4435091, 42041288, 33298344, -11026255, 11313481, 56810068, -14885820, -13293998, -13571560, +-42355892, -1631014, -23201414, -52585432, -55175296, -28913182, -28494960, 12885976, -21347062, 1866700, +11161009, -37470904, -13758391, 238908, -187905, 9674951, 24477018, 16295643, 29520384, 40018356, +29003378, -3574487, -21162914, -30655866, -2637110, 12688407, 3710315, -4313221, -409633, 8692477, +6993818, 18849000, -2148558, 3005403, 307627, -6280853, 6134824, 974421, -3063922, 16107201, +6939057, 3656628, -15127412, 10159208, -5449777, 7661685, -14359149, -39756900, -1898376, 15698105, +-3002719, -21103322, -13581760, -15444702, -11686069, 5036386, 6892886, 7883413, 2110977, -1413044, +5873905, 15557982, 25927106, 24531242, 30456686, 26115012, -2550137, 17559436, 39727372, 2822867, +-17523466, -24922622, -25156698, -34163244, -27809376, -13284871, -14970109, -2090039, 35221952, -23026394, +6957847, -26669062, -9042517, -29083908, 3735548, 35279400, -811212, 21805012, -43616468, 38343320, +12850005, -7857106, 30392262, 4261682, 13826573, -12155294, -14347338, -272730, 9312563, 7137162, +-30455076, 27960238, -33749852, 4135517, 9446781, -11457362, 19894826, -20977694, -11916387, -2316061, +-7484518, -10619307, -2342905, 4502200, -15583752, -18369038, -5950677, -3214246, -4508642, 11162620, +6067178, 4548907, -22282828, 5930813, 27114128, 35941360, -26511760, -13357885, 30561914, 41794864, +-25338160, -15671262, 17627082, 7398081, -20122996, 16709570, -47270948, -9309342, 19267224, 37790880, +4920959, -23442468, -21195126, 5736466, 45296336, 3948686, 6794639, 1359357, 15035070, -2901251, +33666100, -368293, -37234144, 23502598, -24291798, -7450695, 10314364, -14219026, 3409130, -30316026, +-11288248, 28111634, 12958990, -12594455, -17993766, -9851044, 2366527, -14615237, -4395362, -3222299, +-8940511, -5491653, -4305168, -18975702, 12040941, -7092065, -8397735, -27485644, -6906308, 20219096, +-13961865, -7721278, -7261716, -15697032, 30262340, 12410845, 1201517, -992674, -16749836, -25160456, +1660005, 22507240, 18526878, 6199249, -18866180, -11057930, -8391292, 10980621, 2075006, -16828756, +-4099010, 1093606, 6710350, -14968498, -9996536, -8829379, 23551454, 12037720, 1604170, -14539001, +-12512313, 13161390, 28309740, -282931, -12048994, -17365626, -5794985, 7849053, 716186, -4001836, +1104880, -3464428, -2565706, 2673080, -56834764, -15902653, 9708774, -19330574, 56313464, 41024992, +27085138, 14196478, 38018512, 26644366, 9004399, 18095770, -44542032, -60117732, -8256001, 404801, +-15349676, 7850664, -2784750, -15832323, -19582904, -16209743, 31150324, 26865558, -21567178, -2957622, +-2936684, -5614059, -7615514, -11460046, -16304770, -23124104, -4299799, 40349072, -12874701, -22687090, +-10665478, 37860672, -17678086, -17655000, 58954332, 20772610, 10003516, -14487998, -32240172, -22748832, +-33257006, 8855149, 27630062, 74175696, -65212636, -27864674, 38434588, 52910776, 9373229, -3277060, +68245960, 32516124, -21383568, 21586506, -7730405, 145492, -47068008, -23906324, -16372415, -77454368, +-32689532, -12564390, 41769632, -22608170, -12914967, 30988190, -1947231, -4196720, 7556458, 21793200, +-21012590, 15391015, 23779624, 493384, -4380867, -43728672, 20276004, 15615427, -50363324, -3686693, +5590437, 3246995, -4172024, -22436372, 6094022, 3790309, 6429029, -3561602, -6354404, 16134582, +3571802, -3379066, 11258183, 4607426, 29799020, -4069482, 9859634, 1869921, -23438710, -20536386, +14541149, -11433740, 8890582, 11078868, 7002944, 6840273, 324807, 19609210, -6130529, -4912369, +-7608535, 5627481, 15408732, -23007066, -8429410, 11049340, 5266167, -13034689, -23336168, -5998996, +6577206, 49292264, 18099530, -4116189, 12794171, -2502355, -4552666, -18168786, 8727374, 7524246, +-14321568, -6982006, -52141440, -2122251, 21483964, -5037460, -21738976, 9519795, -4878009, 23463944, +4696010, -11365020, -174483, 25119116, -14292577, 4042638, 9079561, -7641284, -215822, -13587666, +27741194, -1664837, 4132832, 445066, 13408888, -6068789, -5216238, -8669391, 5548561, 10425496, +-4564477, 12385075, -5358509, 7632157, -13007845, -10248866, 15799574, 20259898, -26170310, 1224603, +39192, 2454574, 8253854, -16466368, 25266756, -22626424, 20337208, 2848100, -35321812, -1924682, +27576374, -35955856, 17162690, 158377, 4652524, -8631811, -5379984, 7268159, -10424959, 36826660, +-27236536, 4074313, -7304666, -3302830, 9088151, 517544, -4464619, -843961, 11141682, -345745, +-12773770, 3602941, 6491843, -21392158, 16648904, 7515119, 789200, 15346455, -5612449, -4745939, +7229504, 3353833, 4587025, 2609730, -4229469, 8664023, 3733937, 642635, -9356049, -1545115, +4575214, 8304320, -14202920, 7434052, 8853001, -12554726, 5958194, 1842541, 2139968, 6626061, +-3733937, 1480153, -2340220, -18211198, -273804, -4403952, 7955353, -5130339, 3037616, 1997160, +-751082, 2428267, 4609037, -3018825, 4295, 819265, -130997, 1315871, 5534066, -5647345, +5185100, -4125316, -26274462, -74187504, -105962208, 35633196, 94238560, 20808042, 261197360, 215122032, +145350288, 245979760, 128133368, -8739185, -30689152, -97119408, -224258496, -185192016, -180112672, -250465312, +-185173216, -54378580, -40103184, -6555731, 87158312, 40580460, -10827076, 55288040, 91443608, 44781476, +42848204, 83224120, 49582712, 38241316, 75406744, 118406880, 49300320, 69510288, 111144624, 19077708, +7546258, 98209792, 58076012, -37649684, 47359532, 61028800, -63678260, -18997178, 70382168, -14176076, +-42127724, 90914256, 48194364, -56398828, 48798344, 64725156, -86312200, -80798000, -34509524, -208447648, +-276600736, -173480704, -244529136, -325952576, -227131296, -232436656, -300528000, -237652896, -164791456, -178677088, +-106789528, 10205916, 66716412, 145021184, 237282992, 295772384, 364217536, 404668608, 442085824, 468772608, +420947072, 331012064, 305788800, 196009952, 59263568, 46551540, -31323196, -150494576, -118199648, -50157700, +-111970336, -115118008, -24298240, -81093816, -155436480, -93868656, -68067712, -139036688, -118374664, -41826004, +-105197704, -124978176, -9959492, -6238977, -56297356, 22367652, 13051332, -90618440, -67170064, -38986492, +-129012768, -177761712, -145357264, -198545056, -246279872, -182703072, -146731120, -139179488, -60919816, 28548110, +74086576, 109913584, 151769648, 171272560, 153622384, 200292048, 256780528, 266178992, 248589488, 253168992, +244185536, 198255152, 223857984, 202116336, 86896312, 11434814, -49597208, -109308528, -115546968, -95266672, +-112528144, -110007536, -95225864, -93947576, -100153808, -82252384, -73451456, -70123928, -66205848, -51005420, +-48302812, -50069656, -39617852, -25890600, -23276038, -14841796, -1594507, 6151467, 6395743, 7705708, +2896419, 1775969, 0, 0, 0, 0, 0, 0, }, }, { { 4054449, -9705015, 164283, 397821, -4638028, -3712999, 2798171, 1709934, 250719, 3958349, -5982890, --2035815, 9687299, 654446, 1883343, -2555506, -3277597, 4550518, 3805341, -1604707, 3745212, -151934, 605054, -3704409, 1323387, -3373697, -2634426, -3314104, 1117228, 125628, -1085016, --380105, 1123671, 2874407, -1386738, -5276904, 81604, -3764002, -4810900, -1267015, 2155537, --746251, 1923072, 1219771, 1762010, -764504, -685584, -910533, -787053, 1614908, -66035, -3328063, -458488, 4122632, 676994, 927713, 3919158, 1393717, 996432, 5076652, -2076617, -1675037, -1777043, -3600256, 3288871, -1197759, -1074, 1212255, -613643, -2990371, -931471, -2143189, -1402844, -81068, -2909304, 1394791, 181999, -1938641, 222265, -3090229, 451508, --2964064, -278636, -44560, -410169, 1708323, 812823, 446140, 928250, -325881, 1714229, -1251446, -156229, 383326, 370441, -64961, 46708, 572841, -740882, 396211, -942745, -791348, 69256, -146029, -57445, 655519, 151398, -605054, 191663, -31675, -367757, --913754, -12736726, -6614250, -2976412, -2764885, -13422, 31675, 945430, 179315, -715649, --5219459, -2368675, -5348845, -8376797, -6998113, 3947612, 4869419, 4925791, -1943473, -585726, --557272, -1102733, 1812476, 755914, -1784022, -3797825, 2732136, 2331630, 3413962, 891206, --1151588, -2080912, 967441, 1628866, -390842, 3467649, -1690070, -100395, 3370476, -2583960, --4097936, 323196, 5663988, 1298691, 1251983, 789737, 47782, 722628, -878321, 1004486, --4478041, 726386, 4643934, -1067836, 67109, 456877, -1586990, -891206, -645856, -759672, --1244467, 2837900, -2668785, 2785286, 2374580, 5213017, -363462, 2928631, 6659347, -1233193, --5369783, -6021544, -291521, -790811, 322659, -5111548, 1479616, -3589519, -2669322, 1222992, -3725347, -1538135, -2846490, -3409130, -667331, -377957, 936303, 296890, 2139968, 1263257, --121333, 1077500, 309238, 2109903, 1596654, 1001264, 456877, 457414, -373662, 1410360, -64961, 420370, -176631, 26307, -1069984, -4295, -209380, 8849780, 6982543, 2968359, -3580392, -2310693, 1621350, 6119255, 3008088, 6590628, -2557653, 2656974, 3788161, -191126, -4854387, -2507187, 3039763, 551366, -3084860, -788127, -571768, -194347, -865436, 361314, --1541356, 485868, -1124208, 6027987, -1373853, -333397, -2684, -2720862, -7652021, 4360466, --1805497, 1683090, -3031173, -2881386, -3243774, -2159832, 2004676, 5782637, 4575214, 1920387, --316754, -1243393, 1847373, 4155918, -911607, -1365800, 5160403, -2282238, 2476586, -2567317, --2001455, -1231045, 1927367, 2038499, -3607236, -2490544, 108985, 3868155, 5021891, 2719251, -3915937, -538482, 3668976, 1438277, 3852586, -2164664, 1549946, 8792335, 4105989, 3731253, --894964, -2473364, -5989332, 3480534, 1505923, -2474438, -2477659, -815507, 1836099, -1821603, --834834, -1639604, 61203, 1258425, -528818, -2468533, 719944, 851477, 1422708, 1462973, -205085, 2071785, 1025423, 861141, 645319, -678605, 1466195, 135828, 0, -710280, --1077500, -1185948, 293668, 851477, 356482, 54761, 267362, -71404, 1317481, -1795296, --423054, 543313, -712965, 717796, 2754685, 10166188, 1449015, 3689377, 7364795, 139586, --4208531, -1805497, -1262720, 290447, -2651069, -7227356, 2902324, 243739, 157840, 3020973, --4792647, -2215130, 7550553, -1850057, -2849174, -4472672, 155156, -4226248, -703838, -1410360, --1269700, 542240, 6101538, -196495, -1912334, 1789391, -4847408, 6505265, -827318, -1462973, -8135205, -4685810, 388695, -5537287, -2529736, 471373, 260382, 2128693, 2569464, -4940823, -1473711, 2070711, 1687385, 474057, 2335389, 1693291, 3409130, -3127810, -1668058, 6418292, --2667175, 2452963, 615254, 1844152, 1661079, -545998, -2171643, -336618, 4537633, -2698850, --296353, -1434519, 1054415, 4047470, -2270427, -5048734, -9748502, 609349, -397821, -839666, -42950, -3750580, -2623151, -5439576, -2138357, 2707977, -86436, 1685238, -642098, 3388729, -2352568, -31139, 1764695, -135828, -205085, 1176821, -2110977, -1129576, -1712081, -10737, --2044941, 1224066, -68183, 584652, -755377, -656593, -79994, -736050, 478889, 775242, --1892470, 909996, 776852, 450972, -1803886, 964757, 650688, 1717450, 1813550, -158377, --615791, -940061, 909996, -471373, -324270, 344671, -4330938, -10963978, 5577552, -3653407, --6138582, 209917, -11588359, 2443837, 3634079, -1358283, 8585103, -3333968, -10186052, 2385854, -3961034, -3644817, -7186554, 12322261, -710280, -817654, 3218541, -2818572, -1520418, 1189169, --6001680, 3480534, -577136, 1674500, -1204738, 5720360, -1400159, 3172370, 2923262, -5805722, --2743410, -3306588, 6020471, -3042984, -1714229, 4446365, -1513976, -3445101, 2688113, 8221105, --4152697, 3966939, -4292283, 5378373, -2947958, 2798171, 613107, -3012383, -8434242, 4674535, -6179384, -648540, -1893007, 3442416, 4348655, 4089346, -5788006, -740882, -5099737, -548145, -1872606, -3673271, 1442572, 3974992, -4251481, -163209, 882616, -4190814, -2952790, 3791919, --2707977, 2983929, -1745367, -5361193, 1126355, -5199595, 1379758, -2007360, 1841467, -5718749, -5259725, -4325032, 576599, -4024921, -93952, -303869, 1107565, -476741, 9664, -1296543, -1409286, -3888019, 1376537, -3193845, -2494839, 19327, 2337536, 1044214, 456877, 668404, -176094, 1326071, 2965138, -2515777, 2469069, -1641751, -305480, 1509681, 1263794, -1796907, -6979, -4398584, 5557151, -6121939, -6093485, -10421201, 4381404, 11029476, 1666447, -1970316, --964220, -1848983, 9587441, -5750425, -5257040, -1233193, -5794448, -1770063, -6294275, -2706366, --4421132, -8721468, -2460480, -1917166, -316754, -950798, 2255395, 5216238, 1850594, 2587718, --8028905, 1003412, -139050, -2501819, 2774549, 1494649, -2346663, -1022739, -5717139, -6319508, --932008, 7031935, -2064269, -3597035, -779537, -2327872, -4937065, 97711, -5154498, 10547903, -8879308, 2314451, -2718178, -2450279, 926102, 1602560, 1816234, 1752884, -643708, 3938485, --3721052, 1752884, -3273302, 120259, -39192, 2220498, 1539209, 4962835, -2142115, -3016141, --2769717, -11418707, 357019, 2405182, -1155346, 4169340, 1794760, -3419331, 996432, -5981816, --2231236, 521839, 4600447, 1983738, 6294812, 1289027, -752693, 61740, 2334315, -2580739, --328028, 627065, -1079111, 1636383, -2255395, 1212255, -1717450, -1378148, -278099, -1900523, --1886564, -2331094, -1239635, -660351, 1773285, 1501628, -1744831, -2469069, -755914, -1881196, -1330366, -2101313, 1052804, -1209033, -345208, 2159295, 155693, 1811939, -10768557, 1743757, -10979010, 10347650, -11121281, -10151155, 2622615, -8078297, -4290673, 1155346, -567473, -3306588, -8331163, 3680787, -11748346, -966368, 696322, -125091, 7501698, 2773475, -5460514, 7883950, -2942053, 1019518, -4239133, -4532801, 3377992, -2916820, -7959112, -1475321, -1040456, -3581466, --4750771, -6445136, 6830609, 452582, 1008780, -4474282, 109522, 4817343, -3820910, -8103530, --8184597, 8560407, 1930051, 8078834, -1291711, 2292976, 5973226, 12124693, 3924526, -1558536, --6204081, -2698313, -3092377, 1813013, 658741, -4874251, -1964948, 7034083, 4993437, 9568650, -4497368, -6678138, -6353867, 7909719, 4226785, -4214437, 49392, 8147553, 641024, -498753, --6356552, 6985765, 5266167, -1291175, 9780714, -1504849, -2816425, -10263361, -1347546, 466541, -5444945, -7099044, -433792, 3101503, -1720134, -5121749, -4759361, -690416, -471373, -977642, --5950141, -5314485, -3117610, 1850594, -108448, -2473901, -809064, -380105, 530428, 442382, -891206, -559420, 2012729, -1704565, -410169, -5369, -1177358, -3992172, 270583, 2231236, --705985, -3533148, 307627, -894427, 1248762, 147103, -429497, -367757, 1153736, -593242, -2126546, 1036698, -55835, -1982127, 1441498, -1575716, 1456531, 1793149, -4409321, 1745367, --1649804, -889058, 5393942, -8987756, 5403606, -5893232, 1062468, 4711579, -62277, -2396592, -1760937, -6171868, 245350, -4807679, -13950591, -4270808, 5899138, 3813931, 2146410, -3398393, -2841658, 1268626, 14886894, 2550137, -5051419, 5531381, 1081258, 1169305, 9892383, -2866891, --2800856, 3430068, -6997576, 8382703, 7740068, -202400, 4371203, -1654099, -4291209, -581431, --5389110, 425739, -5277441, 2028835, -91805, 1493038, 589484, -9051107, -1875827, -1190780, -483721, -4575214, 1951526, 1975685, -1751273, 11876121, -5217312, -10609106, 6298570, 10382010, -2345589, 2663417, -4613869, 8904004, -3064996, 1474784, 3995393, 1144609, -4065724, 4234301, -1828582, 484794, -44560, -8185671, -2898566, 3978750, 7231651, -2834679, -5377299, -7449621, --2435783, 2474438, 1355062, 3689914, -9172440, 1701344, 6155225, 790274, -367757, 2341831, --1921998, -1061394, -265751, -517544, 3226057, -929860, 1020055, -981937, -678605, -725313, --2349347, -1336809, 1104344, -1659468, 2221572, -370978, -406411, -1094143, -1321239, -6969658, -651224, 3702262, -190052, 1281511, -671626, 2289755, 774168, -1376537, -1605781, 1276142, -30389042, -8327405, 183073, -3066607, -1944010, -6772090, -153545, -17808008, 9247065, -6402723, --452582, 10300942, 5086852, -6842957, -7342247, -2752537, -6279242, 5659693, -14732812, 2712809, -6095096, 8419747, 1650878, 2503966, 332323, 1364189, -1955821, -4640176, -13470091, -1999844, -1694902, 6179384, -4862440, 5957657, 2314451, -2464774, -881005, 4609574, -4892505, -4625680, --2672544, -3540127, -544924, -11934104, -5596880, -2863670, -357019, 9421011, 2087354, 8986145, -3076270, -434865, -5684389, 667331, 533113, 1349157, 3089155, 12602508, 1447404, -11846057, -3022583, -4661114, -360240, -4485020, -5022428, -2365990, 4804458, 3102577, -20969640, -7886097, --6263136, 3936875, -935766, -4526359, -2920041, 11787538, -4890357, 9048959, -8593156, -6465537, --9302899, -5087926, -9887015, -1576790, 13116830, 3041374, -1627793, 1534377, 5551245, -153545, -6852084, -3923453, 2614025, 3812857, 4633196, 1803886, -871878, -9171366, -3431679, -4734128, -18790, 2908767, 2503966, -1896228, -708133, 3798899, 1548873, -3064459, -1316408, -2166274, --985695, 112743, 1931125, -1657321, -1622424, 4840428, 4076461, 1246077, -637803, 1713692, -3323231, 188979, -3059627, -358093, -3121904, 719944, -2809982, 1559073, -4690641, -5100811, -3808562, -9479530, 557809, -22160420, 5369246, -7236483, 2138894, -7522099, -16397648, -2490007, --3836480, 11651709, 4900021, 4218195, -417149, 15455440, -11613055, 2868501, 4356708, 11951820, --13748190, -7791608, -2740726, 1175210, -941135, -3854196, -1296543, 4160750, -7411503, 1556389, -4351876, -799401, 577136, -5916318, -6849936, -4179540, 18420040, 219043, -4499515, 7224672, --4444218, -9222369, -7614440, -4972499, -1345935, 3326989, 670552, 695785, 10226854, 9417790, --1699733, 3395709, 2249489, -11764989, -8126078, -450972, -953483, -3032784, -8074002, 9976135, -11966316, -9749039, 6459631, 6136435, -1921998, -9312563, -15145128, -14609868, -11322608, -6598681, --13069049, 1261647, -10698227, 6486475, 5773510, 1026497, 129386, -18187040, 1196148, 415001, -1347546, -9284109, 3147137, 10453950, 1400159, 2710661, -8266202, -5046587, -1009854, -8636642, -2035815, 5505075, -2566780, -3155727, -3997541, 3470334, 5534602, -9592809, -5288179, -393526, -6465537, 2477659, -2805151, 2352568, -328028, -17180, 2916283, -1772211, 3755949, -4203699, --1498407, 3224984, 2744484, -974421, 7267085, 558346, -4529043, -3766686, -632971, -3084324, --2856690, 487479, 2065879, -1250909, -9032853, -7677791, -5236102, -6020471, -1839320, -13604846, -635655, 14735496, -5182415, 7730941, -3085934, 14689862, 12526809, 5092758, -15308874, -4013647, -20509006, -5378910, 15208479, 2291902, -14539538, -7470022, 17179332, 277025, -11523934, 177167, --9823664, -1447941, 3496640, 1314797, -1955821, -17202954, -15184857, 4101157, 11007464, -9867150, --850940, 4193499, -724776, 1587527, 18276696, 3271155, 2669859, 1490891, 6047314, -8178155, --5723044, -4240744, -19245748, -6622303, -7218767, -5071820, 5087389, 3310883, -1212255, -2000918, --7611756, -11622718, 15069430, -3325915, -13233331, -6280316, 2695629, 10014790, -7994545, -2580202, --8485782, -1668595, -10139881, -2026151, -2159295, -20454782, 1872069, -6935836, 14121852, -3706020, --11474005, -21687974, -14256607, -2761127, 1795296, 7531762, -5592585, -5173288, -11780558, 10733123, -18228378, 1880122, -2160906, 6158446, -4761508, 6817187, -5141076, -2524904, 2346663, 5208185, -3783329, -6402723, 221728, 1296543, -84289, -484258, -1600412, 1696512, 6471442, -2736968, --5690295, -268972, -1276679, 2946885, -47245, 6277095, 435939, 2288681, 221191, -3867618, -1009854, -1552631, 6754373, 387084, -4308389, -818728, -1049046, 4519380, 442919, -4949413, --767189, 3487514, -1618666, 855235, 7036230, -24910810, -12749610, -8559333, -13653701, -7281044, --5600638, -14122389, 14839649, -4289599, 22408992, -11310260, -16947404, -3283503, -11385421, 19313394, --6666863, -10172093, -4737349, 5184026, 9791989, 8435853, -2061584, -2259153, -4448513, 2134062, -15889768, -418222, 1493575, -5119064, -2034741, -8329552, -2749853, 3701188, 2714419, -6885907, -304406, -10191957, 2019172, -3042448, -3078955, 4168803, 1911797, -4744328, -1931662, 8718247, -3246459, -7212861, -9526774, 15856482, -785979, -25239376, 13100187, -2796024, -10759430, 5090610, --1593970, 1162326, -2498060, 8785356, 3353833, 904628, 24206972, 23944442, -8494908, 2619393, --18044232, -3818763, -3510062, 7649337, -2807298, 1248225, 7336341, -5439576, 13794898, -5848672, -1464584, -18754512, 7732015, -4876936, -13192529, 6600828, -3101503, 26420492, 6224482, 5041755, -9705552, 1100049, -9290014, -727997, -3873524, -2260764, 2574833, -3263638, 5306969, 3307125, --4112968, 6739878, 3738232, -4408247, -1238561, 412317, 599685, -1802813, 1355062, 2370822, --720481, -1969243, 373662, 2109903, 1153736, 1601486, -4338454, 4324495, -8599061, 7570417, --5094368, -2910914, -674847, 3954591, 5529771, 1521492, -6562173, 78383, -2713883, -1534914, -1440962, -6193343, -11389716, 3335579, 29972966, -22464290, -7180112, -14201309, -9440875, 11394548, --12914967, 27544700, -3206730, 8453033, 1547799, 6733972, -17073032, 3189550, 4511863, -1208496, --2547453, -1446330, 5077188, -10448582, -6345278, -1434519, -2949569, -12928388, -11506754, -3039763, --5308043, 15735150, -4060355, -7383586, -5347235, 5442261, -8029978, -3361349, -13917305, 6577206, --5302674, 5801427, -4911295, 7363185, -3710852, -24004572, -12228846, 3594888, -1853278, -1429687, --7480223, -14281303, -802622, 6349036, 4262755, -3218541, 4741644, 7403987, 22825066, -9747428, -10823854, -25632364, 1636383, 3801046, -3031173, -7342784, 5223217, 993211, 1206886, 5791227, -18145700, 12327093, 9306657, -4836670, -5834176, 8995272, -10911901, 2711735, 9188009, -6477885, -22694608, -329639, 7053410, -6169184, 13094282, -12432320, -12250320, 416612, 4602595, -5609764, --1363115, 14180908, 139586, 12911745, 4722854, -1982127, -2032593, -7349226, -587874, -379568, -3644817, -469225, -5912023, 1035624, 2663954, 7320235, -10674067, 1847910, -5417028, 2260227, -6098854, -2083596, -165893, -5571647, 1837709, 2083059, -3611531, -12855374, -8049843, -5080947, -2495376, -6794102, -3859565, -4556961, -4082903, 2585570, 4967667, -142271, 4121558, 1582696, -2195802, 752693, -9295383, 7886097, -6860674, 12038256, 35474820, 25130390, -6750615, -15731928, --10660109, 21538724, -25599078, 1370632, -6489696, -6278169, 10467372, -18764712, 2501819, -9599789, --237297, -13057237, -10073309, 1522029, 683437, 524523, -12608950, 20099910, 4072703, -8993662, -3645354, -2656974, 1766842, 29968134, 9469866, -8367670, -7361574, 1453846, 9300215, 2507187, --22405234, -5517959, -15487652, -5174362, -7248294, 7568269, -4173635, -2129767, -143881, -773094, --10981158, -12758737, 8316668, -4833986, 2256469, -600759, 11162620, -9061307, -6470905, 2837363, -4669167, -11995844, 13396540, -8391829, -19522774, -18213346, -6500970, -5229660, -7888781, -4083440, --27757300, 9800042, -13166222, -4183298, -10989748, 15391552, 5010080, 7363185, 4295, -2365990, --13418015, -4064650, 18139794, -14931991, 21980032, 16769700, 5909875, -3960497, 776852, -3106872, -3176665, -9712532, -7786776, -4849018, 1360968, -1333587, 1417876, 4096325, -7026567, -1759863, -7125888, 7392176, -2881386, 4592394, -3900904, -6346888, -2765959, -2002529, 4734128, 1246077, -1806034, -6280853, -4066260, 2139968, -2278480, 1987496, 2656974, 4424890, 8847096, 3473018, -4991826, -5950677, -3346317, -2065342, 2655901, -2918430, 1258425, -2706903, 1316408, 8888972, -4296041, 2375117, -1628330, 5569499, 1872069, -2394981, -34999688, -4329864, 23318988, -28592134, --11374147, -688805, -8740258, 10372346, -5928666, 32329830, -3222299, -7023346, -5320391, -1424319, -9505299, -6419366, -6197638, 26382374, -19281182, -2346663, 6192269, -4268661, 16560320, 9310952, --1091459, -2068564, 7067906, 9379672, 10271414, 8369281, 17525078, 5564667, 7580618, 4544076, --5594732, 29214904, 3751654, 5452998, 7459822, 4344897, 21167746, -1512902, 5283347, 7263327, -6175089, 3438121, 13993540, -8248485, -6567542, 13841069, -2469069, -13997298, -3515431, -24464670, --8240432, -4708895, 23222888, -21925808, -2760053, 935766, -679142, -1277216, 13722421, 37376952, --6456410, 4672925, 4345433, 5653788, 17908404, -19351512, -19783694, -18060338, 31908922, 2339684, --11913702, 29220810, -11086384, 25473452, -13660680, 9763534, 1140314, -33916284, -4866198, -8492761, -9771587, -718870, -2861522, 201863, 6163278, -926639, -10223633, 5524402, 208843, -4814122, --39192, -9038759, 12187507, -1322313, 4410932, -5775658, -5147519, -5165235, -6834904, -665183, -249108, 11558294, -471910, 1267015, -4583804, 1277753, -10923712, 3481071, -10528039, -1970853, --2240362, -9457518, 5051419, -7489886, -7476465, 1644973, -10446434, 3216394, 8427263, 7821673, --3908957, -3698504, 2059974, 3170760, 7330436, 9298067, 20734492, 1889249, -20896626, -61448096, -12311524, -14756971, -23753854, 26623428, -15943992, -8203388, -23392002, 6077916, -4626754, -22852448, --7398081, -13566191, 6416681, -12562779, 645319, 4909685, 10313827, 5245229, 17447230, 2758443, --89121, -1792075, -14623290, -11238319, -10401337, 8463233, 13054016, 6071473, 4665945, -355945, -5066988, 10226854, 23836532, -11249056, -6227166, 4193499, -10770704, 11471858, 2530810, -10394895, -24260122, 8863202, -20342038, 8075076, -19566260, 2343442, 3790309, 10347113, -5529234, -6602439, -30835718, 11986180, -13195750, 8062728, 16334297, -12608413, -26801670, 14936286, -2111513, -277562, -2253247, 6568079, 41712184, -3842922, 5260798, 8017630, -82678, 9612674, 5647882, -22069152, -4744328, -11722576, -10229001, -6149857, 5092758, -35662188, -4292820, 11191074, 1820529, 17795660, --12991739, 12620761, -8468065, -3685619, -4744328, 5681168, 2524904, -4319664, 88047, 46708, --6273337, 5105106, -7933342, 8457327, 1178432, 5909338, 5035849, -3551401, -2915746, 1531693, --2172180, 1280974, 2001992, -3446175, -1214939, -3968550, -2774549, -2583960, -7106561, 194884, -1048509, 4225711, -2257542, 4072703, 9767293, -5033165, 1639604, -5050345, 2615635, 3144990, --8137353, 144955, 2674691, -7676181, -3799436, 6787122, 110059, 1395864, 1535988, 310848, --19010062, -21875880, 46920372, 10037339, -3032784, -5647882, 10582263, 42406360, 19449760, 5079336, --1229434, 14221710, 35408784, 8818642, 12206834, 11050414, 25244744, -16267726, 16350404, 7277822, --48476760, 14369350, -6857452, 14382235, -15097347, 11411728, 7567196, 15069430, -122407, 6399502, -2357937, -13744432, 6855842, 13651554, -11446625, 6868190, -11115375, -6671158, 34750580, 3565360, -30767536, -21883396, 9579388, -1107565, -4408247, -675384, -2678986, 4795331, 11274826, 7837779, --861678, 17596482, -28032178, -26405996, 19160922, -15023796, -3879966, -3507915, -18130668, 9148817, --4783520, 5168457, 2804614, 29795798, 14457934, 15706159, 5887864, 4221416, -27097486, -6228777, -13318694, -248034, 331786, -20938, -8700530, -23563264, 4502200, 2180233, -17651242, 2493766, --8486855, -6973417, 7396471, 4984310, 26723286, -3835406, 6787122, 6382859, -5159330, -6913287, --764504, -6572911, -2545305, 15739981, 6565932, 2838437, 770410, -306016, 358630, -215285, --957241, -10709501, -3288871, 6513855, -1891396, 638876, -3988951, -5420249, -2228551, 1714766, -12754979, -8540542, -8263517, 7495792, 3657165, -9592809, 6721624, 4048007, -6818261, 8513699, -673773, -5145908, -2420751, -3575560, -1644436, -1670742, 4203699, 2107755, 2081449, 4829154, -7025493, 5214627, -1414655, 12181064, -42531988, 36284956, -15293842, 7169374, 23478438, -34000036, --887985, -2732136, 8287140, 12954158, 14776835, 25667798, 4304094, -16168941, 9039296, 27325118, --38501696, -22428320, 25861072, 1556389, -199179, 1452773, 2215130, -464930, -665183, 13451838, -8108362, -18258980, 1174137, -4968741, 32160178, 19684908, -6576669, 2180233, 3864397, 4236449, --215822, 11924977, 1168768, 9217000, 32822140, 4768488, 3452617, -4727686, 8422968, -30983358, --13526999, -12888123, -1405528, 3536906, -27557584, 11044508, -24460912, 8450348, 25334402, -5383742, --22834194, -12093017, 9426379, -4337380, -46627776, 12857521, -32548872, -6999186, -4061429, 1149978, --13059922, 3375844, 16409459, -13438416, -30931818, -46416784, 36294084, 11078331, -5702106, 10386305, --10996190, 11097122, 20125680, -20912732, 36080948, 4978941, -3846143, 16765942, 9511742, -5814312, -9315247, 682363, 10055592, -9786083, -5213554, 2716030, 7265474, 12521440, 3721052, 11286637, --7473780, 6406481, 11726334, 10407243, -1745904, 9474161, -10183904, 4032974, 960462, 4359392, -19551764, -13064754, 7770670, 1063541, -745714, 15260019, 4166118, 19895362, -2624762, 9827422, -2599529, 7752416, 2216203, -4092567, 5951751, -10282152, 8870718, -3810710, 7344394, -1763084, -1967095, -834297, 1474784, -148176, 7689602, -1758252, -1918777, -1045825, 3274913, -383863, --862215, 359704, 1599875, 1101659, 1327682, -964220, 1326608, -1131724, 1253594, 881005, -1402844, -2665564, 51849920, -55794848, 22557706, 28368258, -34955664, -10785200, -18817862, -10368051, -51481624, -23176180, 36536212, -17150342, -4916664, -9289477, 11978127, 4466766, -44513040, -8513699, --11778948, 19084150, 1006633, 7926899, 15503758, -21889300, -4005594, -14048301, 7834557, 17969070, -11332271, -28268402, -4829154, 5411122, 3838627, -1978369, -13139916, -5692979, -25238302, -4868883, --3417183, 23096724, -20577726, 50705848, 11340324, -15112379, 22601728, 576063, 29320132, 15714212, -27836756, 6585259, 25446608, 20431696, 24902220, 25905096, 4122095, 25062744, -32196148, -5788006, -6958384, -21525302, -3532611, 13222057, -24932286, -36954436, 14950244, 23682450, 940061, 5331665, --25549686, -7089381, -21339546, -993748, 24780888, 1891933, 46139224, 20700668, -11410654, 48364016, -25862146, -14409078, -5339718, -10323491, -15190762, -9879499, 12099460, -7003481, -23635206, 3832185, -16938278, 549219, -7600482, -6337761, -4739497, -8083129, -14220637, 2483565, -3103651, -1959042, --10909217, -1071594, -3673808, 4863514, 8227547, -2456721, 1862405, -3238942, -8432095, 5634460, --2040110, -6771016, -16175921, 7628936, -22397718, -3192235, -15422691, -9616432, -12474733, -3329674, --1677185, -4666482, -8614631, -4429722, -9868224, -1910724, -814433, -785979, -6485401, 10416369, --7896834, 4930623, -72444824, 66055524, -14985141, -21896818, -19305342, 45788648, -34743600, -5507759, --9978283, -303332, 24504936, -27210766, -2507724, 10947335, -8248485, -3500398, 621697, -15336791, -21906480, 1441498, -35865124, -8838506, -8728447, 2416456, -39306468, -127775, 4617627, -7586523, -275952, 10936597, 24162412, -9818832, -6183143, 5389647, -16285442, -50299436, 4307852, 40317396, --20524038, -30874910, 2071785, 32571422, -15166603, -9434969, -41966124, -6585796, 788127, 30090004, -13792214, 4017942, -31664110, -17869748, 24807732, -29637958, 10474888, 49550500, 27864138, 38466264, --18524194, 22498650, 14165339, -42717208, -15808164, -22869628, -5694053, 25404194, -1215476, 27458262, -22151830, -42450384, 47469052, -28755880, -137976, 2567317, -21830782, 47036872, -3188476, -10773925, -37654516, -30516280, -5308580, -43592308, -14920716, 20081120, -6245956, 18177376, 19390704, -4416837, --7683697, 3409130, -10741713, -12288438, -3507378, -9024263, -5515812, -7294465, 3102577, -9094593, -1775969, -11497627, -11453067, -10056666, 8476655, -5900748, -1047972, 5995238, 1407676, -2010045, --12504260, -19389092, -12584791, -25303262, 18629958, 7809861, 16122770, 5878200, -13807783, -13962402, --7364795, -1902671, 20476794, -4225711, -141734, 2792803, -3307662, -3311957, -1770600, -7652558, -14258755, -8950175, 18296024, -94489, 43173548, 30640296, 4515621, -8260833, -22429392, 13139379, --1762010, -2000918, -1424855, -736050, 95026, -8570070, 10871636, -206158, -38528004, 9684614, -3453154, -13310104, 508954, 16663936, -5613523, 1134408, -27860380, 20307680, -9913858, -2983929, --2809446, 11570642, -15098958, -536334, 3433826, 481573, 3190624, -7138773, 20634096, -10790032, -36373004, -22355304, -23862838, 22515830, -25214680, 1355062, 18797998, -17377974, -7771207, 10054518, -11703786, 15535434, -55486144, 17707076, -527744, -12652437, 35184372, -17615808, 2158758, 224412, --29878476, 38338488, -1826972, -1625108, -20132122, -3584687, 31584116, -7317014, -1189706, 1305133, -9105868, 5301064, -39005820, 19284404, 34756484, -18206366, 13925358, -27152784, 45565308, 2103997, --42527692, 628676, 23722714, -2342368, -26419418, -5892159, 62081604, -9614284, -25572236, 4354023, -27387396, -7030325, -8560407, -3169686, -1214939, 1662152, 1235877, -6905771, 18079664, -2877091, --4247723, 1066226, 6175626, 15202037, -4522601, -7346542, 8346195, 1934883, -14010720, -5067525, -7520488, 1773285, -5852967, -3095598, 12079059, -10929618, -2209224, 1933272, 1738925, -10318659, --4187056, 13474386, -725850, -9607305, -4088272, 9780714, -2858301, -7201050, -6155225, 8553964, --24212342, -80252536, -121662464, 8208756, 105224552, 1657321, 275283776, 249527392, 149385936, 288067744, -189007552, -31211528, 10933913, -36941552, -226762464, -128756680, -99783904, -221475360, -182144192, -53716620, --106925360, -122781840, -10005663, 7328288, -51941724, 11409044, 46994460, -59993712, -51007568, 80447424, -16457241, -19468014, 56136296, 75351440, -95026, 77290624, 130810208, 46902652, 35880156, 133387728, -90148680, 10921565, 97915056, 144494512, 63469952, 73898136, 164641136, 62550828, 22469658, 157276864, -154773440, 47864728, 186415536, 265127264, 98820216, 108856480, 184854320, 56422448, -59852516, 10631118, --61479236, -222722512, -212468816, -226881648, -364529440, -393987552, -421357760, -498292448, -521311872, -509161408, --495585536, -436274176, -391560352, -320140960, -211549680, -150965952, -52153252, 143920592, 233397648, 230576928, -426933696, 455305728, 354357344, 431855200, 452352928, 242871808, 253343472, 310701152, 150802208, 122003376, -201604160, 146323632, 68690488, 95245192, 127449400, 54249196, 44214004, 128094176, 67640904, -11609297, -70111584, 54817740, -40045740, 5582921, 50444928, -33292438, -14607184, 94714232, 37373732, 3594888, -91035592, 59886340, -9008157, 4949950, -39962524, -134073848, -182550064, -201753936, -264710112, -283097408, --282916480, -306338528, -309315488, -323811552, -324899776, -296906784, -295007872, -247531312, -191290320, -151409952, --63475860, 55115168, 118241520, 197481520, 246926800, 261653696, 249303520, 227543616, 193117840, 156853824, -136414608, 119386136, 97623000, 88011400, 85248656, 77701864, 72557032, 75857712, 70376264, 58717036, -49600428, 38540352, 20977158, 8018704, -12636868, -28193776, -28339804, -18241262, -8790187, -2099165, -0, 0, 0, 0, 0, 0, 0, 0, }, +9705015, 164283, 397821, -4638028, -3712999, 2798171, 1709934, 250719, 3958349, -5982890, +-2035815, 9687299, 654446, 1883343, -2555506, -3277597, 4550518, 3805341, -1604707, 3745212, +151934, 605054, -3704409, 1323387, -3373697, -2634426, -3314104, 1117228, 125628, -1085016, +-380105, 1123671, 2874407, -1386738, -5276904, 81604, -3764002, -4810900, -1267015, 2155537, +-746251, 1923072, 1219771, 1762010, -764504, -685584, -910533, -787053, 1614908, -66035, +3328063, -458488, 4122632, 676994, 927713, 3919158, 1393717, 996432, 5076652, -2076617, +1675037, -1777043, -3600256, 3288871, -1197759, -1074, 1212255, -613643, -2990371, -931471, +2143189, -1402844, -81068, -2909304, 1394791, 181999, -1938641, 222265, -3090229, 451508, +-2964064, -278636, -44560, -410169, 1708323, 812823, 446140, 928250, -325881, 1714229, +1251446, -156229, 383326, 370441, -64961, 46708, 572841, -740882, 396211, -942745, +791348, 69256, -146029, -57445, 655519, 151398, -605054, 191663, -31675, -367757, +-913754, -12736726, -6614250, -2976412, -2764885, -13422, 31675, 945430, 179315, -715649, +-5219459, -2368675, -5348845, -8376797, -6998113, 3947612, 4869419, 4925791, -1943473, -585726, +-557272, -1102733, 1812476, 755914, -1784022, -3797825, 2732136, 2331630, 3413962, 891206, +-1151588, -2080912, 967441, 1628866, -390842, 3467649, -1690070, -100395, 3370476, -2583960, +-4097936, 323196, 5663988, 1298691, 1251983, 789737, 47782, 722628, -878321, 1004486, +-4478041, 726386, 4643934, -1067836, 67109, 456877, -1586990, -891206, -645856, -759672, +-1244467, 2837900, -2668785, 2785286, 2374580, 5213017, -363462, 2928631, 6659347, -1233193, +-5369783, -6021544, -291521, -790811, 322659, -5111548, 1479616, -3589519, -2669322, 1222992, +3725347, -1538135, -2846490, -3409130, -667331, -377957, 936303, 296890, 2139968, 1263257, +-121333, 1077500, 309238, 2109903, 1596654, 1001264, 456877, 457414, -373662, 1410360, +64961, 420370, -176631, 26307, -1069984, -4295, -209380, 8849780, 6982543, 2968359, +3580392, -2310693, 1621350, 6119255, 3008088, 6590628, -2557653, 2656974, 3788161, -191126, +4854387, -2507187, 3039763, 551366, -3084860, -788127, -571768, -194347, -865436, 361314, +-1541356, 485868, -1124208, 6027987, -1373853, -333397, -2684, -2720862, -7652021, 4360466, +-1805497, 1683090, -3031173, -2881386, -3243774, -2159832, 2004676, 5782637, 4575214, 1920387, +-316754, -1243393, 1847373, 4155918, -911607, -1365800, 5160403, -2282238, 2476586, -2567317, +-2001455, -1231045, 1927367, 2038499, -3607236, -2490544, 108985, 3868155, 5021891, 2719251, +3915937, -538482, 3668976, 1438277, 3852586, -2164664, 1549946, 8792335, 4105989, 3731253, +-894964, -2473364, -5989332, 3480534, 1505923, -2474438, -2477659, -815507, 1836099, -1821603, +-834834, -1639604, 61203, 1258425, -528818, -2468533, 719944, 851477, 1422708, 1462973, +205085, 2071785, 1025423, 861141, 645319, -678605, 1466195, 135828, 0, -710280, +-1077500, -1185948, 293668, 851477, 356482, 54761, 267362, -71404, 1317481, -1795296, +-423054, 543313, -712965, 717796, 2754685, 10166188, 1449015, 3689377, 7364795, 139586, +-4208531, -1805497, -1262720, 290447, -2651069, -7227356, 2902324, 243739, 157840, 3020973, +-4792647, -2215130, 7550553, -1850057, -2849174, -4472672, 155156, -4226248, -703838, -1410360, +-1269700, 542240, 6101538, -196495, -1912334, 1789391, -4847408, 6505265, -827318, -1462973, +8135205, -4685810, 388695, -5537287, -2529736, 471373, 260382, 2128693, 2569464, -4940823, +1473711, 2070711, 1687385, 474057, 2335389, 1693291, 3409130, -3127810, -1668058, 6418292, +-2667175, 2452963, 615254, 1844152, 1661079, -545998, -2171643, -336618, 4537633, -2698850, +-296353, -1434519, 1054415, 4047470, -2270427, -5048734, -9748502, 609349, -397821, -839666, +42950, -3750580, -2623151, -5439576, -2138357, 2707977, -86436, 1685238, -642098, 3388729, +2352568, -31139, 1764695, -135828, -205085, 1176821, -2110977, -1129576, -1712081, -10737, +-2044941, 1224066, -68183, 584652, -755377, -656593, -79994, -736050, 478889, 775242, +-1892470, 909996, 776852, 450972, -1803886, 964757, 650688, 1717450, 1813550, -158377, +-615791, -940061, 909996, -471373, -324270, 344671, -4330938, -10963978, 5577552, -3653407, +-6138582, 209917, -11588359, 2443837, 3634079, -1358283, 8585103, -3333968, -10186052, 2385854, +3961034, -3644817, -7186554, 12322261, -710280, -817654, 3218541, -2818572, -1520418, 1189169, +-6001680, 3480534, -577136, 1674500, -1204738, 5720360, -1400159, 3172370, 2923262, -5805722, +-2743410, -3306588, 6020471, -3042984, -1714229, 4446365, -1513976, -3445101, 2688113, 8221105, +-4152697, 3966939, -4292283, 5378373, -2947958, 2798171, 613107, -3012383, -8434242, 4674535, +6179384, -648540, -1893007, 3442416, 4348655, 4089346, -5788006, -740882, -5099737, -548145, +1872606, -3673271, 1442572, 3974992, -4251481, -163209, 882616, -4190814, -2952790, 3791919, +-2707977, 2983929, -1745367, -5361193, 1126355, -5199595, 1379758, -2007360, 1841467, -5718749, +5259725, -4325032, 576599, -4024921, -93952, -303869, 1107565, -476741, 9664, -1296543, +1409286, -3888019, 1376537, -3193845, -2494839, 19327, 2337536, 1044214, 456877, 668404, +176094, 1326071, 2965138, -2515777, 2469069, -1641751, -305480, 1509681, 1263794, -1796907, +6979, -4398584, 5557151, -6121939, -6093485, -10421201, 4381404, 11029476, 1666447, -1970316, +-964220, -1848983, 9587441, -5750425, -5257040, -1233193, -5794448, -1770063, -6294275, -2706366, +-4421132, -8721468, -2460480, -1917166, -316754, -950798, 2255395, 5216238, 1850594, 2587718, +-8028905, 1003412, -139050, -2501819, 2774549, 1494649, -2346663, -1022739, -5717139, -6319508, +-932008, 7031935, -2064269, -3597035, -779537, -2327872, -4937065, 97711, -5154498, 10547903, +8879308, 2314451, -2718178, -2450279, 926102, 1602560, 1816234, 1752884, -643708, 3938485, +-3721052, 1752884, -3273302, 120259, -39192, 2220498, 1539209, 4962835, -2142115, -3016141, +-2769717, -11418707, 357019, 2405182, -1155346, 4169340, 1794760, -3419331, 996432, -5981816, +-2231236, 521839, 4600447, 1983738, 6294812, 1289027, -752693, 61740, 2334315, -2580739, +-328028, 627065, -1079111, 1636383, -2255395, 1212255, -1717450, -1378148, -278099, -1900523, +-1886564, -2331094, -1239635, -660351, 1773285, 1501628, -1744831, -2469069, -755914, -1881196, +1330366, -2101313, 1052804, -1209033, -345208, 2159295, 155693, 1811939, -10768557, 1743757, +10979010, 10347650, -11121281, -10151155, 2622615, -8078297, -4290673, 1155346, -567473, -3306588, +8331163, 3680787, -11748346, -966368, 696322, -125091, 7501698, 2773475, -5460514, 7883950, +2942053, 1019518, -4239133, -4532801, 3377992, -2916820, -7959112, -1475321, -1040456, -3581466, +-4750771, -6445136, 6830609, 452582, 1008780, -4474282, 109522, 4817343, -3820910, -8103530, +-8184597, 8560407, 1930051, 8078834, -1291711, 2292976, 5973226, 12124693, 3924526, -1558536, +-6204081, -2698313, -3092377, 1813013, 658741, -4874251, -1964948, 7034083, 4993437, 9568650, +4497368, -6678138, -6353867, 7909719, 4226785, -4214437, 49392, 8147553, 641024, -498753, +-6356552, 6985765, 5266167, -1291175, 9780714, -1504849, -2816425, -10263361, -1347546, 466541, +5444945, -7099044, -433792, 3101503, -1720134, -5121749, -4759361, -690416, -471373, -977642, +-5950141, -5314485, -3117610, 1850594, -108448, -2473901, -809064, -380105, 530428, 442382, +891206, -559420, 2012729, -1704565, -410169, -5369, -1177358, -3992172, 270583, 2231236, +-705985, -3533148, 307627, -894427, 1248762, 147103, -429497, -367757, 1153736, -593242, +2126546, 1036698, -55835, -1982127, 1441498, -1575716, 1456531, 1793149, -4409321, 1745367, +-1649804, -889058, 5393942, -8987756, 5403606, -5893232, 1062468, 4711579, -62277, -2396592, +1760937, -6171868, 245350, -4807679, -13950591, -4270808, 5899138, 3813931, 2146410, -3398393, +2841658, 1268626, 14886894, 2550137, -5051419, 5531381, 1081258, 1169305, 9892383, -2866891, +-2800856, 3430068, -6997576, 8382703, 7740068, -202400, 4371203, -1654099, -4291209, -581431, +-5389110, 425739, -5277441, 2028835, -91805, 1493038, 589484, -9051107, -1875827, -1190780, +483721, -4575214, 1951526, 1975685, -1751273, 11876121, -5217312, -10609106, 6298570, 10382010, +2345589, 2663417, -4613869, 8904004, -3064996, 1474784, 3995393, 1144609, -4065724, 4234301, +1828582, 484794, -44560, -8185671, -2898566, 3978750, 7231651, -2834679, -5377299, -7449621, +-2435783, 2474438, 1355062, 3689914, -9172440, 1701344, 6155225, 790274, -367757, 2341831, +-1921998, -1061394, -265751, -517544, 3226057, -929860, 1020055, -981937, -678605, -725313, +-2349347, -1336809, 1104344, -1659468, 2221572, -370978, -406411, -1094143, -1321239, -6969658, +651224, 3702262, -190052, 1281511, -671626, 2289755, 774168, -1376537, -1605781, 1276142, +30389042, -8327405, 183073, -3066607, -1944010, -6772090, -153545, -17808008, 9247065, -6402723, +-452582, 10300942, 5086852, -6842957, -7342247, -2752537, -6279242, 5659693, -14732812, 2712809, +6095096, 8419747, 1650878, 2503966, 332323, 1364189, -1955821, -4640176, -13470091, -1999844, +1694902, 6179384, -4862440, 5957657, 2314451, -2464774, -881005, 4609574, -4892505, -4625680, +-2672544, -3540127, -544924, -11934104, -5596880, -2863670, -357019, 9421011, 2087354, 8986145, +3076270, -434865, -5684389, 667331, 533113, 1349157, 3089155, 12602508, 1447404, -11846057, +3022583, -4661114, -360240, -4485020, -5022428, -2365990, 4804458, 3102577, -20969640, -7886097, +-6263136, 3936875, -935766, -4526359, -2920041, 11787538, -4890357, 9048959, -8593156, -6465537, +-9302899, -5087926, -9887015, -1576790, 13116830, 3041374, -1627793, 1534377, 5551245, -153545, +6852084, -3923453, 2614025, 3812857, 4633196, 1803886, -871878, -9171366, -3431679, -4734128, +18790, 2908767, 2503966, -1896228, -708133, 3798899, 1548873, -3064459, -1316408, -2166274, +-985695, 112743, 1931125, -1657321, -1622424, 4840428, 4076461, 1246077, -637803, 1713692, +3323231, 188979, -3059627, -358093, -3121904, 719944, -2809982, 1559073, -4690641, -5100811, +3808562, -9479530, 557809, -22160420, 5369246, -7236483, 2138894, -7522099, -16397648, -2490007, +-3836480, 11651709, 4900021, 4218195, -417149, 15455440, -11613055, 2868501, 4356708, 11951820, +-13748190, -7791608, -2740726, 1175210, -941135, -3854196, -1296543, 4160750, -7411503, 1556389, +4351876, -799401, 577136, -5916318, -6849936, -4179540, 18420040, 219043, -4499515, 7224672, +-4444218, -9222369, -7614440, -4972499, -1345935, 3326989, 670552, 695785, 10226854, 9417790, +-1699733, 3395709, 2249489, -11764989, -8126078, -450972, -953483, -3032784, -8074002, 9976135, +11966316, -9749039, 6459631, 6136435, -1921998, -9312563, -15145128, -14609868, -11322608, -6598681, +-13069049, 1261647, -10698227, 6486475, 5773510, 1026497, 129386, -18187040, 1196148, 415001, +1347546, -9284109, 3147137, 10453950, 1400159, 2710661, -8266202, -5046587, -1009854, -8636642, +2035815, 5505075, -2566780, -3155727, -3997541, 3470334, 5534602, -9592809, -5288179, -393526, +6465537, 2477659, -2805151, 2352568, -328028, -17180, 2916283, -1772211, 3755949, -4203699, +-1498407, 3224984, 2744484, -974421, 7267085, 558346, -4529043, -3766686, -632971, -3084324, +-2856690, 487479, 2065879, -1250909, -9032853, -7677791, -5236102, -6020471, -1839320, -13604846, +635655, 14735496, -5182415, 7730941, -3085934, 14689862, 12526809, 5092758, -15308874, -4013647, +20509006, -5378910, 15208479, 2291902, -14539538, -7470022, 17179332, 277025, -11523934, 177167, +-9823664, -1447941, 3496640, 1314797, -1955821, -17202954, -15184857, 4101157, 11007464, -9867150, +-850940, 4193499, -724776, 1587527, 18276696, 3271155, 2669859, 1490891, 6047314, -8178155, +-5723044, -4240744, -19245748, -6622303, -7218767, -5071820, 5087389, 3310883, -1212255, -2000918, +-7611756, -11622718, 15069430, -3325915, -13233331, -6280316, 2695629, 10014790, -7994545, -2580202, +-8485782, -1668595, -10139881, -2026151, -2159295, -20454782, 1872069, -6935836, 14121852, -3706020, +-11474005, -21687974, -14256607, -2761127, 1795296, 7531762, -5592585, -5173288, -11780558, 10733123, +18228378, 1880122, -2160906, 6158446, -4761508, 6817187, -5141076, -2524904, 2346663, 5208185, +3783329, -6402723, 221728, 1296543, -84289, -484258, -1600412, 1696512, 6471442, -2736968, +-5690295, -268972, -1276679, 2946885, -47245, 6277095, 435939, 2288681, 221191, -3867618, +1009854, -1552631, 6754373, 387084, -4308389, -818728, -1049046, 4519380, 442919, -4949413, +-767189, 3487514, -1618666, 855235, 7036230, -24910810, -12749610, -8559333, -13653701, -7281044, +-5600638, -14122389, 14839649, -4289599, 22408992, -11310260, -16947404, -3283503, -11385421, 19313394, +-6666863, -10172093, -4737349, 5184026, 9791989, 8435853, -2061584, -2259153, -4448513, 2134062, +15889768, -418222, 1493575, -5119064, -2034741, -8329552, -2749853, 3701188, 2714419, -6885907, +304406, -10191957, 2019172, -3042448, -3078955, 4168803, 1911797, -4744328, -1931662, 8718247, +3246459, -7212861, -9526774, 15856482, -785979, -25239376, 13100187, -2796024, -10759430, 5090610, +-1593970, 1162326, -2498060, 8785356, 3353833, 904628, 24206972, 23944442, -8494908, 2619393, +-18044232, -3818763, -3510062, 7649337, -2807298, 1248225, 7336341, -5439576, 13794898, -5848672, +1464584, -18754512, 7732015, -4876936, -13192529, 6600828, -3101503, 26420492, 6224482, 5041755, +9705552, 1100049, -9290014, -727997, -3873524, -2260764, 2574833, -3263638, 5306969, 3307125, +-4112968, 6739878, 3738232, -4408247, -1238561, 412317, 599685, -1802813, 1355062, 2370822, +-720481, -1969243, 373662, 2109903, 1153736, 1601486, -4338454, 4324495, -8599061, 7570417, +-5094368, -2910914, -674847, 3954591, 5529771, 1521492, -6562173, 78383, -2713883, -1534914, +1440962, -6193343, -11389716, 3335579, 29972966, -22464290, -7180112, -14201309, -9440875, 11394548, +-12914967, 27544700, -3206730, 8453033, 1547799, 6733972, -17073032, 3189550, 4511863, -1208496, +-2547453, -1446330, 5077188, -10448582, -6345278, -1434519, -2949569, -12928388, -11506754, -3039763, +-5308043, 15735150, -4060355, -7383586, -5347235, 5442261, -8029978, -3361349, -13917305, 6577206, +-5302674, 5801427, -4911295, 7363185, -3710852, -24004572, -12228846, 3594888, -1853278, -1429687, +-7480223, -14281303, -802622, 6349036, 4262755, -3218541, 4741644, 7403987, 22825066, -9747428, +10823854, -25632364, 1636383, 3801046, -3031173, -7342784, 5223217, 993211, 1206886, 5791227, +18145700, 12327093, 9306657, -4836670, -5834176, 8995272, -10911901, 2711735, 9188009, -6477885, +22694608, -329639, 7053410, -6169184, 13094282, -12432320, -12250320, 416612, 4602595, -5609764, +-1363115, 14180908, 139586, 12911745, 4722854, -1982127, -2032593, -7349226, -587874, -379568, +3644817, -469225, -5912023, 1035624, 2663954, 7320235, -10674067, 1847910, -5417028, 2260227, +6098854, -2083596, -165893, -5571647, 1837709, 2083059, -3611531, -12855374, -8049843, -5080947, +2495376, -6794102, -3859565, -4556961, -4082903, 2585570, 4967667, -142271, 4121558, 1582696, +2195802, 752693, -9295383, 7886097, -6860674, 12038256, 35474820, 25130390, -6750615, -15731928, +-10660109, 21538724, -25599078, 1370632, -6489696, -6278169, 10467372, -18764712, 2501819, -9599789, +-237297, -13057237, -10073309, 1522029, 683437, 524523, -12608950, 20099910, 4072703, -8993662, +3645354, -2656974, 1766842, 29968134, 9469866, -8367670, -7361574, 1453846, 9300215, 2507187, +-22405234, -5517959, -15487652, -5174362, -7248294, 7568269, -4173635, -2129767, -143881, -773094, +-10981158, -12758737, 8316668, -4833986, 2256469, -600759, 11162620, -9061307, -6470905, 2837363, +4669167, -11995844, 13396540, -8391829, -19522774, -18213346, -6500970, -5229660, -7888781, -4083440, +-27757300, 9800042, -13166222, -4183298, -10989748, 15391552, 5010080, 7363185, 4295, -2365990, +-13418015, -4064650, 18139794, -14931991, 21980032, 16769700, 5909875, -3960497, 776852, -3106872, +3176665, -9712532, -7786776, -4849018, 1360968, -1333587, 1417876, 4096325, -7026567, -1759863, +7125888, 7392176, -2881386, 4592394, -3900904, -6346888, -2765959, -2002529, 4734128, 1246077, +1806034, -6280853, -4066260, 2139968, -2278480, 1987496, 2656974, 4424890, 8847096, 3473018, +4991826, -5950677, -3346317, -2065342, 2655901, -2918430, 1258425, -2706903, 1316408, 8888972, +4296041, 2375117, -1628330, 5569499, 1872069, -2394981, -34999688, -4329864, 23318988, -28592134, +-11374147, -688805, -8740258, 10372346, -5928666, 32329830, -3222299, -7023346, -5320391, -1424319, +9505299, -6419366, -6197638, 26382374, -19281182, -2346663, 6192269, -4268661, 16560320, 9310952, +-1091459, -2068564, 7067906, 9379672, 10271414, 8369281, 17525078, 5564667, 7580618, 4544076, +-5594732, 29214904, 3751654, 5452998, 7459822, 4344897, 21167746, -1512902, 5283347, 7263327, +6175089, 3438121, 13993540, -8248485, -6567542, 13841069, -2469069, -13997298, -3515431, -24464670, +-8240432, -4708895, 23222888, -21925808, -2760053, 935766, -679142, -1277216, 13722421, 37376952, +-6456410, 4672925, 4345433, 5653788, 17908404, -19351512, -19783694, -18060338, 31908922, 2339684, +-11913702, 29220810, -11086384, 25473452, -13660680, 9763534, 1140314, -33916284, -4866198, -8492761, +9771587, -718870, -2861522, 201863, 6163278, -926639, -10223633, 5524402, 208843, -4814122, +-39192, -9038759, 12187507, -1322313, 4410932, -5775658, -5147519, -5165235, -6834904, -665183, +249108, 11558294, -471910, 1267015, -4583804, 1277753, -10923712, 3481071, -10528039, -1970853, +-2240362, -9457518, 5051419, -7489886, -7476465, 1644973, -10446434, 3216394, 8427263, 7821673, +-3908957, -3698504, 2059974, 3170760, 7330436, 9298067, 20734492, 1889249, -20896626, -61448096, +12311524, -14756971, -23753854, 26623428, -15943992, -8203388, -23392002, 6077916, -4626754, -22852448, +-7398081, -13566191, 6416681, -12562779, 645319, 4909685, 10313827, 5245229, 17447230, 2758443, +-89121, -1792075, -14623290, -11238319, -10401337, 8463233, 13054016, 6071473, 4665945, -355945, +5066988, 10226854, 23836532, -11249056, -6227166, 4193499, -10770704, 11471858, 2530810, -10394895, +24260122, 8863202, -20342038, 8075076, -19566260, 2343442, 3790309, 10347113, -5529234, -6602439, +30835718, 11986180, -13195750, 8062728, 16334297, -12608413, -26801670, 14936286, -2111513, -277562, +2253247, 6568079, 41712184, -3842922, 5260798, 8017630, -82678, 9612674, 5647882, -22069152, +4744328, -11722576, -10229001, -6149857, 5092758, -35662188, -4292820, 11191074, 1820529, 17795660, +-12991739, 12620761, -8468065, -3685619, -4744328, 5681168, 2524904, -4319664, 88047, 46708, +-6273337, 5105106, -7933342, 8457327, 1178432, 5909338, 5035849, -3551401, -2915746, 1531693, +-2172180, 1280974, 2001992, -3446175, -1214939, -3968550, -2774549, -2583960, -7106561, 194884, +1048509, 4225711, -2257542, 4072703, 9767293, -5033165, 1639604, -5050345, 2615635, 3144990, +-8137353, 144955, 2674691, -7676181, -3799436, 6787122, 110059, 1395864, 1535988, 310848, +-19010062, -21875880, 46920372, 10037339, -3032784, -5647882, 10582263, 42406360, 19449760, 5079336, +-1229434, 14221710, 35408784, 8818642, 12206834, 11050414, 25244744, -16267726, 16350404, 7277822, +-48476760, 14369350, -6857452, 14382235, -15097347, 11411728, 7567196, 15069430, -122407, 6399502, +2357937, -13744432, 6855842, 13651554, -11446625, 6868190, -11115375, -6671158, 34750580, 3565360, +30767536, -21883396, 9579388, -1107565, -4408247, -675384, -2678986, 4795331, 11274826, 7837779, +-861678, 17596482, -28032178, -26405996, 19160922, -15023796, -3879966, -3507915, -18130668, 9148817, +-4783520, 5168457, 2804614, 29795798, 14457934, 15706159, 5887864, 4221416, -27097486, -6228777, +13318694, -248034, 331786, -20938, -8700530, -23563264, 4502200, 2180233, -17651242, 2493766, +-8486855, -6973417, 7396471, 4984310, 26723286, -3835406, 6787122, 6382859, -5159330, -6913287, +-764504, -6572911, -2545305, 15739981, 6565932, 2838437, 770410, -306016, 358630, -215285, +-957241, -10709501, -3288871, 6513855, -1891396, 638876, -3988951, -5420249, -2228551, 1714766, +12754979, -8540542, -8263517, 7495792, 3657165, -9592809, 6721624, 4048007, -6818261, 8513699, +673773, -5145908, -2420751, -3575560, -1644436, -1670742, 4203699, 2107755, 2081449, 4829154, +7025493, 5214627, -1414655, 12181064, -42531988, 36284956, -15293842, 7169374, 23478438, -34000036, +-887985, -2732136, 8287140, 12954158, 14776835, 25667798, 4304094, -16168941, 9039296, 27325118, +-38501696, -22428320, 25861072, 1556389, -199179, 1452773, 2215130, -464930, -665183, 13451838, +8108362, -18258980, 1174137, -4968741, 32160178, 19684908, -6576669, 2180233, 3864397, 4236449, +-215822, 11924977, 1168768, 9217000, 32822140, 4768488, 3452617, -4727686, 8422968, -30983358, +-13526999, -12888123, -1405528, 3536906, -27557584, 11044508, -24460912, 8450348, 25334402, -5383742, +-22834194, -12093017, 9426379, -4337380, -46627776, 12857521, -32548872, -6999186, -4061429, 1149978, +-13059922, 3375844, 16409459, -13438416, -30931818, -46416784, 36294084, 11078331, -5702106, 10386305, +-10996190, 11097122, 20125680, -20912732, 36080948, 4978941, -3846143, 16765942, 9511742, -5814312, +9315247, 682363, 10055592, -9786083, -5213554, 2716030, 7265474, 12521440, 3721052, 11286637, +-7473780, 6406481, 11726334, 10407243, -1745904, 9474161, -10183904, 4032974, 960462, 4359392, +19551764, -13064754, 7770670, 1063541, -745714, 15260019, 4166118, 19895362, -2624762, 9827422, +2599529, 7752416, 2216203, -4092567, 5951751, -10282152, 8870718, -3810710, 7344394, -1763084, +1967095, -834297, 1474784, -148176, 7689602, -1758252, -1918777, -1045825, 3274913, -383863, +-862215, 359704, 1599875, 1101659, 1327682, -964220, 1326608, -1131724, 1253594, 881005, +1402844, -2665564, 51849920, -55794848, 22557706, 28368258, -34955664, -10785200, -18817862, -10368051, +51481624, -23176180, 36536212, -17150342, -4916664, -9289477, 11978127, 4466766, -44513040, -8513699, +-11778948, 19084150, 1006633, 7926899, 15503758, -21889300, -4005594, -14048301, 7834557, 17969070, +11332271, -28268402, -4829154, 5411122, 3838627, -1978369, -13139916, -5692979, -25238302, -4868883, +-3417183, 23096724, -20577726, 50705848, 11340324, -15112379, 22601728, 576063, 29320132, 15714212, +27836756, 6585259, 25446608, 20431696, 24902220, 25905096, 4122095, 25062744, -32196148, -5788006, +6958384, -21525302, -3532611, 13222057, -24932286, -36954436, 14950244, 23682450, 940061, 5331665, +-25549686, -7089381, -21339546, -993748, 24780888, 1891933, 46139224, 20700668, -11410654, 48364016, +25862146, -14409078, -5339718, -10323491, -15190762, -9879499, 12099460, -7003481, -23635206, 3832185, +16938278, 549219, -7600482, -6337761, -4739497, -8083129, -14220637, 2483565, -3103651, -1959042, +-10909217, -1071594, -3673808, 4863514, 8227547, -2456721, 1862405, -3238942, -8432095, 5634460, +-2040110, -6771016, -16175921, 7628936, -22397718, -3192235, -15422691, -9616432, -12474733, -3329674, +-1677185, -4666482, -8614631, -4429722, -9868224, -1910724, -814433, -785979, -6485401, 10416369, +-7896834, 4930623, -72444824, 66055524, -14985141, -21896818, -19305342, 45788648, -34743600, -5507759, +-9978283, -303332, 24504936, -27210766, -2507724, 10947335, -8248485, -3500398, 621697, -15336791, +21906480, 1441498, -35865124, -8838506, -8728447, 2416456, -39306468, -127775, 4617627, -7586523, +275952, 10936597, 24162412, -9818832, -6183143, 5389647, -16285442, -50299436, 4307852, 40317396, +-20524038, -30874910, 2071785, 32571422, -15166603, -9434969, -41966124, -6585796, 788127, 30090004, +13792214, 4017942, -31664110, -17869748, 24807732, -29637958, 10474888, 49550500, 27864138, 38466264, +-18524194, 22498650, 14165339, -42717208, -15808164, -22869628, -5694053, 25404194, -1215476, 27458262, +22151830, -42450384, 47469052, -28755880, -137976, 2567317, -21830782, 47036872, -3188476, -10773925, +37654516, -30516280, -5308580, -43592308, -14920716, 20081120, -6245956, 18177376, 19390704, -4416837, +-7683697, 3409130, -10741713, -12288438, -3507378, -9024263, -5515812, -7294465, 3102577, -9094593, +1775969, -11497627, -11453067, -10056666, 8476655, -5900748, -1047972, 5995238, 1407676, -2010045, +-12504260, -19389092, -12584791, -25303262, 18629958, 7809861, 16122770, 5878200, -13807783, -13962402, +-7364795, -1902671, 20476794, -4225711, -141734, 2792803, -3307662, -3311957, -1770600, -7652558, +14258755, -8950175, 18296024, -94489, 43173548, 30640296, 4515621, -8260833, -22429392, 13139379, +-1762010, -2000918, -1424855, -736050, 95026, -8570070, 10871636, -206158, -38528004, 9684614, +3453154, -13310104, 508954, 16663936, -5613523, 1134408, -27860380, 20307680, -9913858, -2983929, +-2809446, 11570642, -15098958, -536334, 3433826, 481573, 3190624, -7138773, 20634096, -10790032, +36373004, -22355304, -23862838, 22515830, -25214680, 1355062, 18797998, -17377974, -7771207, 10054518, +11703786, 15535434, -55486144, 17707076, -527744, -12652437, 35184372, -17615808, 2158758, 224412, +-29878476, 38338488, -1826972, -1625108, -20132122, -3584687, 31584116, -7317014, -1189706, 1305133, +9105868, 5301064, -39005820, 19284404, 34756484, -18206366, 13925358, -27152784, 45565308, 2103997, +-42527692, 628676, 23722714, -2342368, -26419418, -5892159, 62081604, -9614284, -25572236, 4354023, +27387396, -7030325, -8560407, -3169686, -1214939, 1662152, 1235877, -6905771, 18079664, -2877091, +-4247723, 1066226, 6175626, 15202037, -4522601, -7346542, 8346195, 1934883, -14010720, -5067525, +7520488, 1773285, -5852967, -3095598, 12079059, -10929618, -2209224, 1933272, 1738925, -10318659, +-4187056, 13474386, -725850, -9607305, -4088272, 9780714, -2858301, -7201050, -6155225, 8553964, +-24212342, -80252536, -121662464, 8208756, 105224552, 1657321, 275283776, 249527392, 149385936, 288067744, +189007552, -31211528, 10933913, -36941552, -226762464, -128756680, -99783904, -221475360, -182144192, -53716620, +-106925360, -122781840, -10005663, 7328288, -51941724, 11409044, 46994460, -59993712, -51007568, 80447424, +16457241, -19468014, 56136296, 75351440, -95026, 77290624, 130810208, 46902652, 35880156, 133387728, +90148680, 10921565, 97915056, 144494512, 63469952, 73898136, 164641136, 62550828, 22469658, 157276864, +154773440, 47864728, 186415536, 265127264, 98820216, 108856480, 184854320, 56422448, -59852516, 10631118, +-61479236, -222722512, -212468816, -226881648, -364529440, -393987552, -421357760, -498292448, -521311872, -509161408, +-495585536, -436274176, -391560352, -320140960, -211549680, -150965952, -52153252, 143920592, 233397648, 230576928, +426933696, 455305728, 354357344, 431855200, 452352928, 242871808, 253343472, 310701152, 150802208, 122003376, +201604160, 146323632, 68690488, 95245192, 127449400, 54249196, 44214004, 128094176, 67640904, -11609297, +70111584, 54817740, -40045740, 5582921, 50444928, -33292438, -14607184, 94714232, 37373732, 3594888, +91035592, 59886340, -9008157, 4949950, -39962524, -134073848, -182550064, -201753936, -264710112, -283097408, +-282916480, -306338528, -309315488, -323811552, -324899776, -296906784, -295007872, -247531312, -191290320, -151409952, +-63475860, 55115168, 118241520, 197481520, 246926800, 261653696, 249303520, 227543616, 193117840, 156853824, +136414608, 119386136, 97623000, 88011400, 85248656, 77701864, 72557032, 75857712, 70376264, 58717036, +49600428, 38540352, 20977158, 8018704, -12636868, -28193776, -28339804, -18241262, -8790187, -2099165, +0, 0, 0, 0, 0, 0, 0, 0, }, { 2938295, -9543417, 2138357, 1384590, -2166274, -790274, -4711043, -202937, -1203128, 3533148, 3134253, --3160022, -2272038, -1909650, -1809255, -2250563, 246961, 2811593, -2234457, -2403034, -7866770, --5793374, -4255776, -199716, 423591, 5768678, -3178813, 2858838, 1768990, 1469416, 346819, --4310000, 1104880, -9188546, 1120987, 283468, 433792, -630823, -5666136, -2583423, -4884452, -299574, 314606, -2954401, -7584912, 5214091, -366146, -4439923, -20938, 2958696, 644245, --1531693, 1078037, -2528662, -1090385, -2386391, 1837172, -2539936, 3576097, 2891587, -573915, --5054103, 264141, 697395, -449361, -1852742, 1279900, 898185, -1152662, 2730526, 2974802, -2052458, 196495, 12885, 951335, -2745021, 380641, 4224637, 493921, 807454, 782221, -3121904, 1199907, 981400, 2801929, -692027, 2206003, -862752, 1439888, 1010928, -384400, -598074, 813359, -249108, 1029182, 1577327, 376883, 33823, 1118302, 1486596, 1187559, --178778, 451508, 487479, 580357, 170725, 93952, -114890, -370978, -1174674, 765578, -85899, -10144713, -11386495, -808528, -4500589, 3477850, -5578089, 1401770, 2582886, -3804267, -3113315, 11394548, 643171, -1048509, 6249715, 846645, 6275484, 97174, 2867428, -4484483, --5938329, -321586, 2261300, -4132832, -1324461, -419296, -1159641, 1131724, -1207960, -2182917, -2072322, -1029182, -858457, 4476430, 6391985, -1990717, -3423626, 1270774, 5117991, 1939178, -6557342, 273804, -910533, -168577, 5853504, 375273, -4168803, -2296197, 4598836, 3326989, -3580929, 970663, -2263448, -4721780, 947577, 2221572, 2772402, -1017907, -2458332, 5103495, -3445101, -847719, -2838974, 170188, -1969779, 5319317, 1651415, 974958, 1720671, 593779, -1126892, 3267933, 602369, 3282966, -610959, 5233418, 667867, -5180268, -2020245, -1805497, -2602750, 3197603, -483721, 853625, -3591667, -1319092, -3342558, -1027034, -2166811, -1876901, --759672, 1097901, 83752, 28991, 178241, 1447404, 266288, 328565, -143881, -1555315, --402653, 80531, -114890, 627065, 276489, 267899, -552977, 5978595, 4192962, 6295349, -6554657, -1571421, 3285113, -1404991, -3711926, -346282, 9709310, 4249334, 2170569, 3453691, --4043175, 6919729, 2972117, 4636417, -1362578, -7682086, 3234647, -11986180, 2438468, -3061775, -2416456, 1888712, -218506, -4126390, 1002875, 2691871, -1596117, 2524367, 6085432, -436476, --5029944, -6867653, 1081258, 3069291, -6312528, 3514894, -5931887, -3876745, 4322885, -2507187, --5012764, -2448668, -3533684, 5548024, 7627862, 4314295, -2731062, 32749, 4078608, 2430415, --336081, -3114388, -1469953, -2733210, 2909304, 9422085, -66572, -5111011, -4027069, 2185602, -775242, -1915555, -5571110, -103616, -4771172, -1877438, 759672, -819265, 3799436, 708133, -4769025, 5541582, -4854924, -1789928, 278636, -3794604, -4547834, -728534, 28454, -2787434, -2676838, -2532957, -309775, 2108829, 430034, 151398, 2089502, -2561948, -880468, 606664, -968515, -1160178, 835908, 454730, 943819, -142808, -16106, 960999, -1304596, 1675574, --1306744, 820339, 260382, -372052, -99858, 745714, -535797, -872415, -1476932, 925565, --1083942, 406948, 1414655, -194347, -900333, 13376139, -3593814, 1304060, 1909650, -8822937, --7517804, 195958, 8742406, 6670084, 10567767, 3485903, -2982855, -4547297, 779000, -2610266, -2083059, 1009854, 3570729, 6564858, 2091112, 4840428, -136365, 2870112, -2913062, -6114960, --3205119, -4680441, 63351, -1306744, 1427003, -7449621, -3719442, -996969, 2756295, -3682398, -7719130, -8698383, 1866163, -5477694, -4443144, 2529199, 2216203, 7447474, -827318, 1882269, --2126546, 5216238, 5512591, 1532767, -1188632, -5604933, -777926, 1934346, -4297652, 4307316, --4730907, 2029372, 7820062, 6554657, 96100, -2525978, 1224603, 7818451, -977642, 1921998, -1214402, 6388764, 62814, -1706176, -3968550, 2785823, -5980205, 2175938, 12436615, 3056943, -5855651, 579821, -8229694, 2974265, 1527398, -3248069, 3356517, -1043677, -897111, -4105452, -1714229, 4036733, 1801739, 775242, -1876901, -4041027, 932008, -805843, -631360, 258772, --206695, -765578, 1299765, -1379221, -1255204, -1188632, 1829656, 731218, 1439351, -814970, -1327145, 72478, -1313723, 1404991, 765041, -1166621, -2226941, -813896, 1827509, 111669, --484794, 917512, 828392, 1986422, -96637, -782221, -4876936, -8341900, 4207994, -5947993, --6132140, 1263794, -2972117, -19624242, 1901597, 3032247, 17962626, 5820218, 1329829, -8154533, -7485055, 3246459, -3260954, 3926137, -682900, 6531572, -3942780, -2018635, -1329292, -1730335, --2708514, -1168768, 4634807, 4062502, 7014219, 2514703, 3439195, -64425, -4571993, -4932770, -6643241, -3633006, 1472637, -591095, -4699768, 6752226, -1132261, -2913062, 1169305, 4918275, --3272765, 7463043, -9454297, -7807714, -9588514, 2330020, -5405217, -8191577, -1896228, 7674570, --3258270, 2309082, 4537633, -3288334, -4336307, 357019, 695248, 2572686, 456877, -2384244, --288300, 9885941, 4177393, -4020626, -12447889, -9927817, 3617973, 11758547, 9867687, -7704098, -181462, -5025112, 2210298, 1956358, -8442832, -667867, 1651952, 986232, -2305324, 504122, -485868, 256624, 2837900, 2614561, -1703491, -2055142, 1380295, -999654, 634045, -2940979, -1183800, 877247, -4714801, -1058173, 984621, 710280, 361851, 919660, -315143, 339302, -321049, 463856, -1739999, -243203, 574452, -549756, -2109903, -1045825, 251256, 320512, -2234457, -3506304, 5814312, -9774809, -1626719, -12113418, -3509525, 1795833, 4269735, -11041824, --2705293, 7562901, -867583, -11052025, 5772973, -3537979, -6276021, 3462281, 5844914, 1312113, -1260573, 1998234, 7622493, -3596498, -3102040, 1980517, -3710315, -1915019, 145492, -426812, -296890, 6073621, 3160022, -706522, -488016, 3549254, 1532230, 4359392, -337155, 4921496, -5251135, 2076617, -5646809, 821949, -757525, -4045859, 5514738, -3104725, 2332167, -3758633, --1343788, -13534516, 1275605, 10987063, 1006633, 11680164, -2120103, -2625299, -11992622, 14113263, -6683506, 8041790, 1350230, 6591701, -42413, -51540, 5532455, -3215320, 2021856, -22549, --13455059, 3094524, -3133716, 3563749, -2002529, 3216394, 12546136, 3775276, 3326989, -151934, --7574175, 5705327, -3059627, 1144609, 2889439, 3761855, -4160750, -1105954, -1708323, -2265595, -2467459, -1424855, -1069447, -1779727, 310848, 456877, 207232, -3501472, 1422708, 607201, --768262, 1010391, 505732, 881005, 746251, 1663763, 30602, 354335, -198642, -804770, -2110977, -394600, 2968896, 459025, 1243393, -910533, 1639067, 545461, -15541339, -512712, -11682848, -2560874, 6914361, -7457137, -5145371, -13425531, 7663833, 3978750, 8898635, 4160213, --4393752, 7503308, -1903744, 7179038, -4734665, -4372814, 536871, -1605244, 6210523, 1304596, -5235565, 5864241, -3523484, -2997350, -2085207, 3862249, -806917, -2492692, 783832, -5280663, -2715493, 1870458, -2792803, 3907883, 6849399, -2746095, -3130494, -827318, -5201206, -2517925, -7873749, 1073742, -4903242, 9592809, -10563472, 1671816, 5631776, -2413235, -3490198, -773631, -4486094, -8043937, 4013647, -3263102, -6929930, -5174362, -4195646, 157840, -1993939, -4397510, -1879585, 11915313, 6549289, -1606855, -4115116, -11503533, 1195075, 6417218, -3780108, -12713640, -314069, -1977296, 611496, 1628330, 5812165, -317291, -3000572, -1103807, -4679367, -2716567, --2229625, 3535295, -2917894, 3283503, -6818798, 604517, -3148211, -2040110, 4096862, -1932198, --1982664, -2335389, 810675, -4298189, -1767379, -957778, -204011, 969052, -3113315, 912681, --2477123, 1391033, 1577864, 3608310, 633508, 1332514, 1842004, 1481227, -1057636, 623307, -188442, 2697776, 1501091, -226023, 1555852, -86436, 106300, -1043677, 130460, 55298, --1912334, 603980, -1330366, -947577, 102005, 1455457, -428423, 5170604, -2277407, 1315334, -7642895, 496606, 8953933, 9706089, 21658984, 14770393, 9057549, -2302639, -11473468, -4002910, -10510859, 4544076, -11082626, 8267812, -1934883, -5501316, -6782827, 1008780, 18724984, -12695923, -13540421, 5281199, -2919504, 4443681, -3663070, 9686225, -3723200, 5113696, 1016834, -6731288, --4713727, -6558415, 248571, 5536750, -1604707, -3701188, 3568044, 454730, -1122597, -12674448, -3831111, -7103876, -5374078, 3487514, 8346732, -6174553, -8885214, 307627, 7534983, 614180, --5066988, -1895691, -3017752, 3429532, 2502892, -2922188, -4789426, -7198902, 4444755, 11527692, -7065221, 3636227, -6696391, 3462818, 7299297, -8202314, -10703595, 1865626, -8837969, -4233227, --17324824, 217433, -11897596, -6203544, 3198140, -1500554, -1145683, 5261335, 895501, -9711995, --6733972, 4371203, -1344862, 524523, -3022046, 280784, 2833605, -427886, 1877975, 1885491, -388158, 173409, 1393717, 1626182, 1082332, 122943, 335544, -984084, 2563559, 62814, -2359548, -426276, -1570884, 759672, 2196339, -2760053, -4049617, -2070174, -586263, -1273458, -4604742, 1728188, -1449015, 2041720, -1166621, 302795, -3710852, -338766, 269509, -1705102, -23699092, 530428, -9276592, 10445897, -11426224, 13224204, 1072668, -8055748, -13795435, -3344169, -6769942, -10969883, 9735617, -1555315, 6277095, 7473243, -6415071, -2672007, -3860102, -5113696, --1985886, -4777614, 798327, -5839008, 6075231, 3833258, 5099737, 10337986, 5325760, -1544578, -12336757, 6284074, 2282238, -6622303, -7215008, 3696893, -5522254, 1268089, 3901978, -8239358, -7056095, 18787798, 1437203, 13361106, 6331319, 6462852, 9546639, 552977, 5062156, 5337571, --12158516, -8253317, 8397735, 558346, 7926362, 1407139, 8321499, -1346472, 2997887, 2066416, --17418776, -1150514, 4485020, 11656541, 2611340, 10223096, 1047972, -2413235, 3364033, 4585952, --9772124, -16542603, -8719320, 2273112, 4082903, 551903, 12152610, 4279398, -19016504, 4842576, --2747705, 100395, 5489505, -7638063, -245887, -4115653, 3518652, 4920422, 316217, 1062468, -3578245, 144955, -13959, -1648731, -1804960, 647466, 380641, 122407, 2994666, 2158221, -772020, 1791538, 1178969, 85362, -2889976, 2334315, 1935420, -1141388, -226560, -396748, -173946, 1711008, 1447404, 4519916, -3753265, -1065689, 1729261, -913217, 2406256, -1867237, -3999152, -923955, -1162326, 580357, 2312303, 1631014, -507343, -232465, -11432129, -1044214, --10172093, -4860293, 4369593, -5224291, 2365990, 3445638, -6068252, -15291157, 4963909, -15149423, --17293686, 3725347, -8462159, 7620346, 11013907, -2844342, 12839805, -3134789, 12687333, 17131014, -112206, 967441, -17256642, -3326452, 1978369, 2922725, -1928440, -11476153, 898185, -9725417, -1336272, -2655901, 2739652, -3763465, -6308233, 1409823, -1038308, -3579855, 4174708, 360777, --2541010, 12365211, 4713727, 9272834, -5781563, 1673964, -4858145, 3506841, -1003412, 4838818, --1531156, -3722663, -4653597, -11021960, -6373195, 17671642, 7277285, 11706470, -13489419, 2822331, -10159208, -8606041, 184147, 6528351, -3452617, 6551436, 1047972, -11911555, -2979634, -18314814, --2153926, 7332583, 3917547, 12229383, 1495722, 8110509, 8799314, 2980707, -437013, 15856482, -1454383, 375273, -2616709, -1610613, 8527658, 4890894, 8162586, -998043, -1544041, -2103460, -5995775, 1152662, -1108638, 1544578, 4153770, -1012539, -2253247, -4726612, 289910, -3783866, --1527398, -3237332, 2811056, -441845, -5332739, -1079647, 544387, 329639, -126165, -2660732, -3864397, -3093987, 1096827, 1323387, -3977140, -854162, -2605972, 472446, 3456375, -3031173, --2240362, -1922535, -1637993, 1750199, -11148661, -10152229, -10554345, -15652471, 10706280, 6755447, -1047435, -10572599, 9551470, -203474, -13103408, -10914586, -3675418, -2811056, -8360154, -3452617, --4922570, -4373351, -3039226, -12332999, 6196027, 7024419, -552440, -1263794, -2146947, -4640176, --14420890, -15947750, 562641, 6733972, -4100083, -9875204, -5396627, 7282654, 5529771, 224412, --2973728, -4323959, -4167192, 9241159, -4703526, 6453189, -4447439, 52076, -15699179, -3579855, --1173063, 11759620, 3341485, -2935073, -8799314, -6314139, -12344273, 19880866, -9146133, 18872086, -2488934, -8351564, 12613782, 12203076, 21417928, -21100100, 8732205, 3325915, 2883534, -4319127, --5960878, 9096741, 4850092, -1758252, -9773735, 10757819, -5684389, 11576011, 9751723, 9018358, --8269423, 17966386, -13343927, 7282654, 11744588, -6914898, 1511829, 153545, 10209137, -2886755, -4563403, -5488432, 10904385, -535797, 1952063, -6426345, 5003100, -540629, 5158793, -1683627, -6936909, 3168612, 2218888, -4275640, 1347009, -3616363, 241055, -3113315, -3870839, -1001801, --3414499, -2523293, -326954, -1978369, -3403225, 2138894, 2910377, 3994320, 1024350, -4175782, -413391, -2897492, 2711735, 879931, -1896765, 280247, 1907502, 878321, -4400194, 623307, -4496294, 1499481, -660888, 1028645, 16922172, -28350542, -30653182, -19094888, -3302830, -13282723, -8122857, -10908143, 1043140, 5580237, -909996, 20215874, 14413910, 5230734, -5988258, -4390531, -13995688, -2261300, 2092723, -5673115, -12660490, 132607, 5000953, 3467649, -7000260, 6189048, -781684, -723165, 11843909, 16528108, 1089848, -10409390, -4613869, -20056960, -7900593, -5115306, --6141803, 1002338, 3435437, -7233799, -3022046, -10155987, 10951093, 13342316, 10951630, 12463995, -9634149, 16282221, 1890859, 5646809, 3748970, -2850785, 6145025, 9739375, -9780714, -33382634, --7890929, 11206107, -17442400, 8927090, 10833518, 4038880, -5378373, 923418, -4271882, -13357885, --3765613, 8830453, -10858751, -9016210, 3120831, -7306276, 21679922, 22242026, -8321499, 14348949, -3653944, -2020782, -9820443, 6897718, -13208098, -10751377, 11787538, 9067750, 6184216, -772020, --1272384, -15883863, -11593727, -2039036, -3754875, -2910377, -2514167, -4659503, -4037806, -4341675, --2333241, 632971, 3634616, 3027415, 4858682, -373125, -2509335, -2345052, -1762547, 7239704, -6549825, 3497177, -755914, -420907, -1675037, -2658048, -4325569, -1817308, 617938, -1210644, -2769180, -1518271, 952409, 1409823, 1089311, 2768643, -3349001, -43487, 502511, 2343442, --4009352, 6646999, -2901251, -1676111, 27279484, -22953378, -476205, 3941169, -22059488, -6452115, --9345312, 3360275, -6775848, 19145354, 2395518, -191126, 23776938, -1304060, -21210696, -16901234, --10453950, 8213051, -1320166, -20443508, 5155572, 5750961, 10667625, -12144020, 6084358, 10412074, -8910983, 7293392, -2615098, 12434467, 13264470, 4570919, -29956324, 21853868, -10828149, 8450885, --2309082, -3045132, 5575942, -13163538, -7697119, 14076218, -6561637, -1774358, 12527883, -14131516, -12597676, -4874251, 11682311, -15571941, 20690468, -9217000, 32097364, -4165582, 1853815, 8361765, --7320235, -5237713, -4108673, 2693481, -1845225, -16175921, -20600274, -5568425, 11644193, -6043019, --7619272, -20715164, 9366250, 2222109, -28627568, -329639, 156229, 4282083, 14387067, -9837086, -4334159, -12658342, -11391864, -16818556, -17110612, -2901787, -10115185, 12301323, -2287070, 12018392, --6073084, 6888054, -1221918, -7537668, -10888816, -1124208, 990527, 5288179, -2807835, 2383170, -758062, 4345970, -715649, -5540508, -1114544, -8433168, -696858, 1482301, 1583769, 580894, --3546569, -4038880, 4376572, 2273112, -1733556, 5437429, -7038915, -8840653, -498753, 8044474, --155156, 2404108, 2795487, 5535676, -28454, 6183143, -5310727, 2058900, 848256, 5047661, -8003135, -5104032, 971200, -1118839, 984084, 10377178, 31868658, 15681462, -9511742, 21720724, -7348152, -14096083, 5531918, 13991930, -2028835, -4939750, -19324132, -5408975, 12177843, 7727720, -5880347, 3414499, -3350075, -7938710, -18226230, 9671729, -6103686, 4762045, -13953812, -7758322, --183610, -2287070, 18255222, 5341329, 3054796, 13739600, 6821482, -21055540, -2275259, 7558069, --3752191, 333397, 18045842, 5780489, 20923470, -12176769, -7438884, -3502009, -7560753, 8044474, --7887171, 15531139, 15738371, -6934762, -15015743, 25368224, -12916577, -5380521, -2865817, 7494718, -4067334, -14288819, -4048007, 9002788, -6562710, 11443403, -5261335, 16250009, -8290898, 3605625, -25170656, -584116, 17792438, 30387430, 4054449, 14882062, -7527467, -36728412, -24632712, -4836133, --1359357, 20749524, -468151, 6888591, 1983201, -5255966, -16764868, -37898256, 28840706, 1903744, -1066763, 9288941, 4684199, -9296994, 21382494, 988916, 4693863, -332860, 1653562, -18723374, --6699075, -12366285, -7189239, -668941, -6700149, -7010997, 4569845, -1575179, -4534412, 13586055, --2301029, -13943611, -9679246, 3426310, 932008, -4085051, 21386790, 6323803, -6815040, -8225936, -2454574, -1953136, -4118337, 638876, 2210835, -4807679, 5286031, -207769, 7517804, 9357660, -2119030, -926102, -2556043, 6265821, 6394670, 5472325, -41344964, -9958419, 43298640, -16637093, --18471044, 38144680, -24419574, 21488258, 28833726, 11345156, 4041564, -21846888, 8454643, -38307352, --18767396, 8386461, 20025822, 2264522, 4712116, 14536854, 38871600, 26219164, 8319352, 1480153, -96100, 4353486, 3348464, -14986215, 475668, 9646497, 12284143, 51773684, 29315300, 19999516, -37515464, 15338402, -5164698, 11307575, -514859, 35871568, 13145284, -2817499, -5762236, 15060840, --2092186, 17285096, -53121768, 2432025, 18589692, -965831, 22459994, -8170639, 6111739, 11996381, --49417356, -19031000, -3642132, -15734613, -20316270, -24071682, 22957674, -14649060, 4797479, -4345970, -23051626, -37110664, -9961103, -5049271, 12001212, 44560, -3142842, 27737436, 48275968, -3758, -15230491, -8844948, 4347581, 33814276, -35388384, -20961052, -29563334, -37444060, -2978560, -1242319, --14536854, -15720654, -14799920, -14103062, -18198850, -26615376, -11402601, -17160004, -10342281, 4976794, -23983634, 7850664, 3921305, 3850438, -2005213, 5567888, 2640331, -16502875, -14788646, -4052302, --20975546, -8167954, -9055402, -7017977, -8054675, 10067940, -7415798, 921271, 1793149, 4534412, -12084427, 18238578, 136365, -4186519, 13348221, -6267968, 8631274, 3515431, 2151779, -3157875, -2710124, 1993402, -7307887, -9766756, -10598906, -1165547, 22807886, 19432580, -18272402, -66247188, --11587285, 26682484, 6460168, -7683160, -4984847, 1720671, -8887898, -12417824, 14754286, 10521596, -30190936, 10588168, 18238042, -7074348, 40101572, 6896107, 25505126, -3863323, 37011880, -14265197, -24192478, -23638964, 434865, 2294586, 17352204, -7028177, -12541305, -31165894, 17437030, 1986959, -3765613, -15207942, -27460410, -1973001, 3462818, -3685082, 8741332, 17571248, 2949569, 12490302, -45825152, -19441170, 4827007, -15273977, 23795192, 20164872, -22600654, 21338472, 24907052, -17856864, -6524056, 5557688, 17343078, 8196945, 34964792, 10697690, -12039330, 1851668, 45113800, 13984950, --51002736, 14908368, 9453223, -44346612, -11994770, -14348412, -30900142, 2041183, 19517942, 20890720, --12241731, 37736656, -9488656, -16668768, -8216273, 19870666, -74187504, -9277129, 1358283, 59880972, -8234526, 50750408, 24738474, 35571992, -730681, 12102144, -6573985, 30127584, 30999464, 27420682, --6400038, -18519898, -7237557, 30114700, -3284039, -19906636, -8315594, 35716948, 5276904, -22427782, --7349226, 32220844, 9526774, 13355738, -156766, 12112882, -8961986, -735513, -418759, 5202816, --581968, 5639292, -4213363, -10570451, -12143483, -15256798, -1721745, -11147588, 275952, -2028835, --4048544, 10689637, -11941083, -5032091, -11836930, -4512937, -21958020, -16586090, 22749368, 398895, --40840308, 33114198, 71446784, 4757750, -39609800, 61536680, -13791677, -920197, 8865886, 34893388, --19991462, 1476395, 69994008, -34677564, 16739098, 23535884, 22692460, -31015570, -3030636, 5539971, --15093052, 2635499, 7387344, -12615393, 12510703, -21381958, -5957120, -8567386, -1511829, -12840342, --11123428, -4153234, 6841346, -23315230, -21675626, 32747516, 6058052, -20523502, -5262946, 19477140, -47405164, -4127464, -22941030, 24669218, 36386428, -10540387, -2572686, 940598, 13253195, 98247, -158377, 16491064, -39934604, 27484032, -22983980, 295279, -32631014, 18387292, -2434710, -48932564, -24282672, -3492882, -18803904, 33022392, 4013647, 32652488, -27485644, -10576894, -11024107, -25546466, --39508332, -52441012, 44644576, 18196702, 32902134, 30215632, 18835042, 7294465, -18719614, 28611462, --14081050, -12040941, 38872676, 12935905, -7150047, -3474092, 11950747, -27456116, 7220377, -10850161, -18327162, -6984154, -11588359, 17346836, 3100430, -20409684, 1802276, -9671729, -5525476, 4317516, --4291746, 3733400, -949725, -14703284, -7262790, 6356552, -4720169, -9274982, 9365176, 14460618, -14386530, -11428371, -4494147, 16622597, -28021978, 8455717, 10524817, -12098923, -27838368, 14089103, -1958505, -12658342, 8968429, -13551159, -21616570, 5718749, 19788524, -16227460, -6780680, 6904697, -17307108, -4716411, -1907502, 931471, -11731703, 38742216, -15791521, 11476689, 8929774, -40184788, -36098664, 12632036, -10366440, 31018790, 2551748, 2064806, 15120969, -13485124, 39537860, -31793496, --17067126, 14745160, 13575318, 6720550, -29616484, -18015240, -32998234, 18177912, 4304094, 16598975, --47782, 17826262, 7125888, 5943698, 632434, 15185931, -6956774, 8339216, -15149960, 11243151, --14015552, -174483, -18475876, -13113072, 658741, -16406775, 7538742, 38893612, 9190156, -29275570, -15106474, 11645804, 20526722, 501437, 34216932, -29613800, 4367982, 13618804, -28646358, -6742562, -57328688, 32266478, -76258752, -32412508, 40296456, -11162620, -36288180, 14119705, -3890704, -27978490, -20229296, 34475704, -47119548, 9141838, 41442676, -28371480, -25560960, 33915748, 4333085, -28191628, -4738960, 21981106, -24755654, -3578782, 26604102, -4128537, -12243878, -19432042, 24300388, -6693707, -13417478, 2983392, 13624710, -9758703, 8704825, 24582246, 9471477, -18505940, 1165547, -13313862, --9193914, -18656802, -2018098, -5166309, -1667521, -12636331, 12279311, 10626823, -4703526, 28074590, --7570954, -30427158, 35878008, -4599373, -7315940, 6385543, 12280385, 1391033, -3806952, 30302068, -16383153, -21845278, 1359357, 8370355, -16087337, -13253732, 21665426, -11776800, -42505680, 40105868, -4654671, -41328860, -1723356, 21170430, -15918759, -34840776, 19323058, 26102126, -43011948, 5812702, -31408022, -19193672, -3855807, 34529928, -3174518, -14786499, 7616588, 14272713, -19772418, -5788006, -19931332, -5268851, 33157148, -72130752, -5623723, -12389370, -81151800, -13991393, -25345138, 8368207, -13424994, 24332064, -11101954, -31029528, -12344273, -44976896, 5639829, 16714402, 8964670, 7669738, --36980744, 22878218, 3121368, -43457016, 31644782, -46764140, -19746112, -17252346, 12393128, 34638376, -39209832, -2781528, -9341554, -75953272, 32403918, 77858096, 27797028, 2253784, -42926588, -61822832, --25999048, -4781909, 32136020, -38539816, -23717346, -39603356, -13175349, 72769632, 77541880, -13099113, --36334888, -30481382, -16888886, -7749195, 38865160, -18177376, 11354820, 8668855, 25726318, -6694781, --17989470, -45035416, -20135344, 69836704, 29317446, 46643880, -42712376, -22981296, -19984482, 47656956, -591095, -76229760, -74381856, 41947872, 70997424, 120196272, 20579872, -101145408, 16658031, -26336740, -34223372, 33849712, -124907312, -39190504, 23990076, 66180076, 15621333, -62846644, -14542759, -5777805, -36518496, 32032940, 8072928, -50202264, -8281234, 11745125, 22308060, 11884711, -13574781, 2806224, --28432684, -2916283, -809601, 27828166, -18935438, 36907728, -23460186, 11027865, 20699594, -7972533, -17114370, 16158204, 28114320, 2200097, -14136885, -15641197, 2236604, 2158221, 4481262, 3762928, --1279363, -1107565, -10631118, -10041634, -2498060, 18811420, -4959614, 1353989, -4088272, 6882685, -1021129, 10911364, -36348308, 30974230, -32389958, -7456063, 1527398, 7938174, -5862094, 7082938, -13024488, -21441014, -17808546, -758599, 5088463, 13176960, -14957760, 1789928, 11957726, -9413495, -7567733, -5064840, 35979476, -876710, -5102958, 20144470, 11517492, 17859010, -8941048, 11268384, --3427921, -864362, 15310485, 10314901, 2778844, 4111894, 20549272, -19287624, -5435281, 1648194, -27628988, -816044, -5884105, 25061672, -6190122, -11436961, -10730439, 20698522, -4720706, 8825084, -5920076, 2825552, -7118909, 3403225, 8505109, 2517925, 24095840, 11428908, 7060390, -10700374, --1248762, 8689256, -16676284, 5728950, 6781217, 17146584, 561030, -2479807, 10251013, 1792075, --19397682, 21800718, 7118909, -5585068, 18773838, -12922483, -1211718, -9749576, -7830799, 17736068, -13625247, -1671816, 6995965, -11259794, 2881386, -15037217, -1033477, -13809930, 3349001, 8210367, -3512210, 1175747, -2532957, -2292439, 2927557, -8443369, 2703145, -3918621, 4170950, -5727339, --1475858, -5339718, -5834176, 2541547, -693637, -891206, -1904281, 8117488, 3718905, -11382737, --10979010, -8255464, 2798708, 3064459, 8712341, 4428112, -10073846, -2057826, -3532074, 9123047, --1991254, 9874667, 4731980, -9017821, 493384, 4095251, -4414690, 6109591, -3456375, 6971806, --4823249, -2212982, 2877091, -4758824, 57496192, 4593468, -21199958, -17617418, 2882460, 12959527, --766115, 11827803, -4487167, -3211562, -15910169, -3538516, -11134166, 17706540, -11072963, -937377, --6982006, -3338800, -4086662, 1912334, -11766600, 1779727, -5056787, -8337606, 2464774, -1350230, -693100, -2275259, 4179540, 1978906, -9835475, -6359236, 20938, -6709813, -5790690, 4871567, --1568737, -10099616, 699006, -5623723, 4327717, -14907295, 7472170, -6488085, -11270531, 3420942, --5149129, -5872294, 1559610, -109522, 733903, -2488934, 2530810, -4564477, 5068599, -3135326, -565325, 8294656, -5961952, 2779381, -1546188, -886374, 2297808, -6870337, 6279779, -7221451, -6270653, -1511829, -265214, -4624606, 5931887, -6936372, 496606, 2446521, -9072582, 9088151, --5506685, 3855807, -4158602, 3684008, -3192771, -4028679, 6805913, -4242891, -785442, 6642167, --4237522, -63888, 606664, 1049583, -4687420, 376347, -363462, -2075543, -1267552, 1138166, --1423782, -2559264, -1199907, 2893734, -2575370, 2167885, -675384, -306553, -772020, -1966558, -1928977, -1329829, -1462436, 1986422, -1995012, 1570347, 820876, -1257889, 401579, -328028, -645319, -4016331, 3944391, -4131222, 813896, -613643, -2058900, 547608, -1085016, 2806224, --27634356, -44680008, 47362752, 164437648, 31579820, 49323940, -101259224, -140924864, -58798640, -73826728, -57007100, 132004208, 75981728, 50914152, 5156645, -72858752, -64381024, -64512020, -26299696, 36478232, -31237298, 33237678, 30000346, -1081258, -4791573, -7725573, -10326175, -15362024, -2006287, 20110648, --1735167, -11823508, -4540318, -17042968, -9474161, -3043521, -4154844, 32319628, 30198988, 17730162, -19196356, 883690, -23344758, -23968064, -43723304, -29271812, 4088272, 3470871, 9012989, 25737592, -36881420, 21985938, 18615462, -954557, -20762408, -29111826, -24955370, -21117280, 3092377, 7377680, -13568875, 9201431, 6281390, 1228361, -7501698, 2859911, 827318, 3054796, 18387828, -1835562, -8199093, 8196408, -13504988, -25853018, -26385594, -24012626, 6450504, 19454592, 14305462, 21297670, -19002546, -6471979, 4860829, 11548630, -7419019, -7198365, -16355772, -21368536, -8130910, -5158256, --2088428, 8843875, 4320200, 4707284, 14433238, 13460964, 14211510, 7890392, 3720516, -7206955, --8615704, -21964462, -23791434, -17112224, -12306155, 5242545, 15757161, 19505594, 26515518, 18693308, -12176232, 22012, -8036958, -13057774, -27117886, -29067802, -10052371, 5010080, 13991930, 10882910, -9791989, 10893648, 8153459, -693637, -1879585, 1011465, 482110, -4954782, -4115653, -14765024, --9398462, -560493, 5490042, 7046431, 5912560, -2326799, -29528, 5161477, 4407174, 176094, -3142842, 2426657, -1449015, -7011534, -5933498, -6081137, -1101659, -1687385, 172872, 1158567, -6395207, 6658273, 6322192, 2576981, 1786706, -2451353, -1755568, -1751810, 297963, -704912, -0, 0, 0, 0, 0, 0, 0, 0, }, +9543417, 2138357, 1384590, -2166274, -790274, -4711043, -202937, -1203128, 3533148, 3134253, +-3160022, -2272038, -1909650, -1809255, -2250563, 246961, 2811593, -2234457, -2403034, -7866770, +-5793374, -4255776, -199716, 423591, 5768678, -3178813, 2858838, 1768990, 1469416, 346819, +-4310000, 1104880, -9188546, 1120987, 283468, 433792, -630823, -5666136, -2583423, -4884452, +299574, 314606, -2954401, -7584912, 5214091, -366146, -4439923, -20938, 2958696, 644245, +-1531693, 1078037, -2528662, -1090385, -2386391, 1837172, -2539936, 3576097, 2891587, -573915, +-5054103, 264141, 697395, -449361, -1852742, 1279900, 898185, -1152662, 2730526, 2974802, +2052458, 196495, 12885, 951335, -2745021, 380641, 4224637, 493921, 807454, 782221, +3121904, 1199907, 981400, 2801929, -692027, 2206003, -862752, 1439888, 1010928, -384400, +598074, 813359, -249108, 1029182, 1577327, 376883, 33823, 1118302, 1486596, 1187559, +-178778, 451508, 487479, 580357, 170725, 93952, -114890, -370978, -1174674, 765578, +85899, -10144713, -11386495, -808528, -4500589, 3477850, -5578089, 1401770, 2582886, -3804267, +3113315, 11394548, 643171, -1048509, 6249715, 846645, 6275484, 97174, 2867428, -4484483, +-5938329, -321586, 2261300, -4132832, -1324461, -419296, -1159641, 1131724, -1207960, -2182917, +2072322, -1029182, -858457, 4476430, 6391985, -1990717, -3423626, 1270774, 5117991, 1939178, +6557342, 273804, -910533, -168577, 5853504, 375273, -4168803, -2296197, 4598836, 3326989, +3580929, 970663, -2263448, -4721780, 947577, 2221572, 2772402, -1017907, -2458332, 5103495, +3445101, -847719, -2838974, 170188, -1969779, 5319317, 1651415, 974958, 1720671, 593779, +1126892, 3267933, 602369, 3282966, -610959, 5233418, 667867, -5180268, -2020245, -1805497, +2602750, 3197603, -483721, 853625, -3591667, -1319092, -3342558, -1027034, -2166811, -1876901, +-759672, 1097901, 83752, 28991, 178241, 1447404, 266288, 328565, -143881, -1555315, +-402653, 80531, -114890, 627065, 276489, 267899, -552977, 5978595, 4192962, 6295349, +6554657, -1571421, 3285113, -1404991, -3711926, -346282, 9709310, 4249334, 2170569, 3453691, +-4043175, 6919729, 2972117, 4636417, -1362578, -7682086, 3234647, -11986180, 2438468, -3061775, +2416456, 1888712, -218506, -4126390, 1002875, 2691871, -1596117, 2524367, 6085432, -436476, +-5029944, -6867653, 1081258, 3069291, -6312528, 3514894, -5931887, -3876745, 4322885, -2507187, +-5012764, -2448668, -3533684, 5548024, 7627862, 4314295, -2731062, 32749, 4078608, 2430415, +-336081, -3114388, -1469953, -2733210, 2909304, 9422085, -66572, -5111011, -4027069, 2185602, +775242, -1915555, -5571110, -103616, -4771172, -1877438, 759672, -819265, 3799436, 708133, +4769025, 5541582, -4854924, -1789928, 278636, -3794604, -4547834, -728534, 28454, -2787434, +2676838, -2532957, -309775, 2108829, 430034, 151398, 2089502, -2561948, -880468, 606664, +968515, -1160178, 835908, 454730, 943819, -142808, -16106, 960999, -1304596, 1675574, +-1306744, 820339, 260382, -372052, -99858, 745714, -535797, -872415, -1476932, 925565, +-1083942, 406948, 1414655, -194347, -900333, 13376139, -3593814, 1304060, 1909650, -8822937, +-7517804, 195958, 8742406, 6670084, 10567767, 3485903, -2982855, -4547297, 779000, -2610266, +2083059, 1009854, 3570729, 6564858, 2091112, 4840428, -136365, 2870112, -2913062, -6114960, +-3205119, -4680441, 63351, -1306744, 1427003, -7449621, -3719442, -996969, 2756295, -3682398, +7719130, -8698383, 1866163, -5477694, -4443144, 2529199, 2216203, 7447474, -827318, 1882269, +-2126546, 5216238, 5512591, 1532767, -1188632, -5604933, -777926, 1934346, -4297652, 4307316, +-4730907, 2029372, 7820062, 6554657, 96100, -2525978, 1224603, 7818451, -977642, 1921998, +1214402, 6388764, 62814, -1706176, -3968550, 2785823, -5980205, 2175938, 12436615, 3056943, +5855651, 579821, -8229694, 2974265, 1527398, -3248069, 3356517, -1043677, -897111, -4105452, +1714229, 4036733, 1801739, 775242, -1876901, -4041027, 932008, -805843, -631360, 258772, +-206695, -765578, 1299765, -1379221, -1255204, -1188632, 1829656, 731218, 1439351, -814970, +1327145, 72478, -1313723, 1404991, 765041, -1166621, -2226941, -813896, 1827509, 111669, +-484794, 917512, 828392, 1986422, -96637, -782221, -4876936, -8341900, 4207994, -5947993, +-6132140, 1263794, -2972117, -19624242, 1901597, 3032247, 17962626, 5820218, 1329829, -8154533, +7485055, 3246459, -3260954, 3926137, -682900, 6531572, -3942780, -2018635, -1329292, -1730335, +-2708514, -1168768, 4634807, 4062502, 7014219, 2514703, 3439195, -64425, -4571993, -4932770, +6643241, -3633006, 1472637, -591095, -4699768, 6752226, -1132261, -2913062, 1169305, 4918275, +-3272765, 7463043, -9454297, -7807714, -9588514, 2330020, -5405217, -8191577, -1896228, 7674570, +-3258270, 2309082, 4537633, -3288334, -4336307, 357019, 695248, 2572686, 456877, -2384244, +-288300, 9885941, 4177393, -4020626, -12447889, -9927817, 3617973, 11758547, 9867687, -7704098, +181462, -5025112, 2210298, 1956358, -8442832, -667867, 1651952, 986232, -2305324, 504122, +485868, 256624, 2837900, 2614561, -1703491, -2055142, 1380295, -999654, 634045, -2940979, +1183800, 877247, -4714801, -1058173, 984621, 710280, 361851, 919660, -315143, 339302, +321049, 463856, -1739999, -243203, 574452, -549756, -2109903, -1045825, 251256, 320512, +2234457, -3506304, 5814312, -9774809, -1626719, -12113418, -3509525, 1795833, 4269735, -11041824, +-2705293, 7562901, -867583, -11052025, 5772973, -3537979, -6276021, 3462281, 5844914, 1312113, +1260573, 1998234, 7622493, -3596498, -3102040, 1980517, -3710315, -1915019, 145492, -426812, +296890, 6073621, 3160022, -706522, -488016, 3549254, 1532230, 4359392, -337155, 4921496, +5251135, 2076617, -5646809, 821949, -757525, -4045859, 5514738, -3104725, 2332167, -3758633, +-1343788, -13534516, 1275605, 10987063, 1006633, 11680164, -2120103, -2625299, -11992622, 14113263, +6683506, 8041790, 1350230, 6591701, -42413, -51540, 5532455, -3215320, 2021856, -22549, +-13455059, 3094524, -3133716, 3563749, -2002529, 3216394, 12546136, 3775276, 3326989, -151934, +-7574175, 5705327, -3059627, 1144609, 2889439, 3761855, -4160750, -1105954, -1708323, -2265595, +2467459, -1424855, -1069447, -1779727, 310848, 456877, 207232, -3501472, 1422708, 607201, +-768262, 1010391, 505732, 881005, 746251, 1663763, 30602, 354335, -198642, -804770, +2110977, -394600, 2968896, 459025, 1243393, -910533, 1639067, 545461, -15541339, -512712, +11682848, -2560874, 6914361, -7457137, -5145371, -13425531, 7663833, 3978750, 8898635, 4160213, +-4393752, 7503308, -1903744, 7179038, -4734665, -4372814, 536871, -1605244, 6210523, 1304596, +5235565, 5864241, -3523484, -2997350, -2085207, 3862249, -806917, -2492692, 783832, -5280663, +2715493, 1870458, -2792803, 3907883, 6849399, -2746095, -3130494, -827318, -5201206, -2517925, +7873749, 1073742, -4903242, 9592809, -10563472, 1671816, 5631776, -2413235, -3490198, -773631, +4486094, -8043937, 4013647, -3263102, -6929930, -5174362, -4195646, 157840, -1993939, -4397510, +1879585, 11915313, 6549289, -1606855, -4115116, -11503533, 1195075, 6417218, -3780108, -12713640, +314069, -1977296, 611496, 1628330, 5812165, -317291, -3000572, -1103807, -4679367, -2716567, +-2229625, 3535295, -2917894, 3283503, -6818798, 604517, -3148211, -2040110, 4096862, -1932198, +-1982664, -2335389, 810675, -4298189, -1767379, -957778, -204011, 969052, -3113315, 912681, +-2477123, 1391033, 1577864, 3608310, 633508, 1332514, 1842004, 1481227, -1057636, 623307, +188442, 2697776, 1501091, -226023, 1555852, -86436, 106300, -1043677, 130460, 55298, +-1912334, 603980, -1330366, -947577, 102005, 1455457, -428423, 5170604, -2277407, 1315334, +7642895, 496606, 8953933, 9706089, 21658984, 14770393, 9057549, -2302639, -11473468, -4002910, +10510859, 4544076, -11082626, 8267812, -1934883, -5501316, -6782827, 1008780, 18724984, -12695923, +13540421, 5281199, -2919504, 4443681, -3663070, 9686225, -3723200, 5113696, 1016834, -6731288, +-4713727, -6558415, 248571, 5536750, -1604707, -3701188, 3568044, 454730, -1122597, -12674448, +3831111, -7103876, -5374078, 3487514, 8346732, -6174553, -8885214, 307627, 7534983, 614180, +-5066988, -1895691, -3017752, 3429532, 2502892, -2922188, -4789426, -7198902, 4444755, 11527692, +7065221, 3636227, -6696391, 3462818, 7299297, -8202314, -10703595, 1865626, -8837969, -4233227, +-17324824, 217433, -11897596, -6203544, 3198140, -1500554, -1145683, 5261335, 895501, -9711995, +-6733972, 4371203, -1344862, 524523, -3022046, 280784, 2833605, -427886, 1877975, 1885491, +388158, 173409, 1393717, 1626182, 1082332, 122943, 335544, -984084, 2563559, 62814, +2359548, -426276, -1570884, 759672, 2196339, -2760053, -4049617, -2070174, -586263, -1273458, +4604742, 1728188, -1449015, 2041720, -1166621, 302795, -3710852, -338766, 269509, -1705102, +23699092, 530428, -9276592, 10445897, -11426224, 13224204, 1072668, -8055748, -13795435, -3344169, +6769942, -10969883, 9735617, -1555315, 6277095, 7473243, -6415071, -2672007, -3860102, -5113696, +-1985886, -4777614, 798327, -5839008, 6075231, 3833258, 5099737, 10337986, 5325760, -1544578, +12336757, 6284074, 2282238, -6622303, -7215008, 3696893, -5522254, 1268089, 3901978, -8239358, +7056095, 18787798, 1437203, 13361106, 6331319, 6462852, 9546639, 552977, 5062156, 5337571, +-12158516, -8253317, 8397735, 558346, 7926362, 1407139, 8321499, -1346472, 2997887, 2066416, +-17418776, -1150514, 4485020, 11656541, 2611340, 10223096, 1047972, -2413235, 3364033, 4585952, +-9772124, -16542603, -8719320, 2273112, 4082903, 551903, 12152610, 4279398, -19016504, 4842576, +-2747705, 100395, 5489505, -7638063, -245887, -4115653, 3518652, 4920422, 316217, 1062468, +3578245, 144955, -13959, -1648731, -1804960, 647466, 380641, 122407, 2994666, 2158221, +772020, 1791538, 1178969, 85362, -2889976, 2334315, 1935420, -1141388, -226560, -396748, +173946, 1711008, 1447404, 4519916, -3753265, -1065689, 1729261, -913217, 2406256, -1867237, +3999152, -923955, -1162326, 580357, 2312303, 1631014, -507343, -232465, -11432129, -1044214, +-10172093, -4860293, 4369593, -5224291, 2365990, 3445638, -6068252, -15291157, 4963909, -15149423, +-17293686, 3725347, -8462159, 7620346, 11013907, -2844342, 12839805, -3134789, 12687333, 17131014, +112206, 967441, -17256642, -3326452, 1978369, 2922725, -1928440, -11476153, 898185, -9725417, +1336272, -2655901, 2739652, -3763465, -6308233, 1409823, -1038308, -3579855, 4174708, 360777, +-2541010, 12365211, 4713727, 9272834, -5781563, 1673964, -4858145, 3506841, -1003412, 4838818, +-1531156, -3722663, -4653597, -11021960, -6373195, 17671642, 7277285, 11706470, -13489419, 2822331, +10159208, -8606041, 184147, 6528351, -3452617, 6551436, 1047972, -11911555, -2979634, -18314814, +-2153926, 7332583, 3917547, 12229383, 1495722, 8110509, 8799314, 2980707, -437013, 15856482, +1454383, 375273, -2616709, -1610613, 8527658, 4890894, 8162586, -998043, -1544041, -2103460, +5995775, 1152662, -1108638, 1544578, 4153770, -1012539, -2253247, -4726612, 289910, -3783866, +-1527398, -3237332, 2811056, -441845, -5332739, -1079647, 544387, 329639, -126165, -2660732, +3864397, -3093987, 1096827, 1323387, -3977140, -854162, -2605972, 472446, 3456375, -3031173, +-2240362, -1922535, -1637993, 1750199, -11148661, -10152229, -10554345, -15652471, 10706280, 6755447, +1047435, -10572599, 9551470, -203474, -13103408, -10914586, -3675418, -2811056, -8360154, -3452617, +-4922570, -4373351, -3039226, -12332999, 6196027, 7024419, -552440, -1263794, -2146947, -4640176, +-14420890, -15947750, 562641, 6733972, -4100083, -9875204, -5396627, 7282654, 5529771, 224412, +-2973728, -4323959, -4167192, 9241159, -4703526, 6453189, -4447439, 52076, -15699179, -3579855, +-1173063, 11759620, 3341485, -2935073, -8799314, -6314139, -12344273, 19880866, -9146133, 18872086, +2488934, -8351564, 12613782, 12203076, 21417928, -21100100, 8732205, 3325915, 2883534, -4319127, +-5960878, 9096741, 4850092, -1758252, -9773735, 10757819, -5684389, 11576011, 9751723, 9018358, +-8269423, 17966386, -13343927, 7282654, 11744588, -6914898, 1511829, 153545, 10209137, -2886755, +4563403, -5488432, 10904385, -535797, 1952063, -6426345, 5003100, -540629, 5158793, -1683627, +6936909, 3168612, 2218888, -4275640, 1347009, -3616363, 241055, -3113315, -3870839, -1001801, +-3414499, -2523293, -326954, -1978369, -3403225, 2138894, 2910377, 3994320, 1024350, -4175782, +413391, -2897492, 2711735, 879931, -1896765, 280247, 1907502, 878321, -4400194, 623307, +4496294, 1499481, -660888, 1028645, 16922172, -28350542, -30653182, -19094888, -3302830, -13282723, +8122857, -10908143, 1043140, 5580237, -909996, 20215874, 14413910, 5230734, -5988258, -4390531, +13995688, -2261300, 2092723, -5673115, -12660490, 132607, 5000953, 3467649, -7000260, 6189048, +781684, -723165, 11843909, 16528108, 1089848, -10409390, -4613869, -20056960, -7900593, -5115306, +-6141803, 1002338, 3435437, -7233799, -3022046, -10155987, 10951093, 13342316, 10951630, 12463995, +9634149, 16282221, 1890859, 5646809, 3748970, -2850785, 6145025, 9739375, -9780714, -33382634, +-7890929, 11206107, -17442400, 8927090, 10833518, 4038880, -5378373, 923418, -4271882, -13357885, +-3765613, 8830453, -10858751, -9016210, 3120831, -7306276, 21679922, 22242026, -8321499, 14348949, +3653944, -2020782, -9820443, 6897718, -13208098, -10751377, 11787538, 9067750, 6184216, -772020, +-1272384, -15883863, -11593727, -2039036, -3754875, -2910377, -2514167, -4659503, -4037806, -4341675, +-2333241, 632971, 3634616, 3027415, 4858682, -373125, -2509335, -2345052, -1762547, 7239704, +6549825, 3497177, -755914, -420907, -1675037, -2658048, -4325569, -1817308, 617938, -1210644, +2769180, -1518271, 952409, 1409823, 1089311, 2768643, -3349001, -43487, 502511, 2343442, +-4009352, 6646999, -2901251, -1676111, 27279484, -22953378, -476205, 3941169, -22059488, -6452115, +-9345312, 3360275, -6775848, 19145354, 2395518, -191126, 23776938, -1304060, -21210696, -16901234, +-10453950, 8213051, -1320166, -20443508, 5155572, 5750961, 10667625, -12144020, 6084358, 10412074, +8910983, 7293392, -2615098, 12434467, 13264470, 4570919, -29956324, 21853868, -10828149, 8450885, +-2309082, -3045132, 5575942, -13163538, -7697119, 14076218, -6561637, -1774358, 12527883, -14131516, +12597676, -4874251, 11682311, -15571941, 20690468, -9217000, 32097364, -4165582, 1853815, 8361765, +-7320235, -5237713, -4108673, 2693481, -1845225, -16175921, -20600274, -5568425, 11644193, -6043019, +-7619272, -20715164, 9366250, 2222109, -28627568, -329639, 156229, 4282083, 14387067, -9837086, +4334159, -12658342, -11391864, -16818556, -17110612, -2901787, -10115185, 12301323, -2287070, 12018392, +-6073084, 6888054, -1221918, -7537668, -10888816, -1124208, 990527, 5288179, -2807835, 2383170, +758062, 4345970, -715649, -5540508, -1114544, -8433168, -696858, 1482301, 1583769, 580894, +-3546569, -4038880, 4376572, 2273112, -1733556, 5437429, -7038915, -8840653, -498753, 8044474, +-155156, 2404108, 2795487, 5535676, -28454, 6183143, -5310727, 2058900, 848256, 5047661, +8003135, -5104032, 971200, -1118839, 984084, 10377178, 31868658, 15681462, -9511742, 21720724, +7348152, -14096083, 5531918, 13991930, -2028835, -4939750, -19324132, -5408975, 12177843, 7727720, +5880347, 3414499, -3350075, -7938710, -18226230, 9671729, -6103686, 4762045, -13953812, -7758322, +-183610, -2287070, 18255222, 5341329, 3054796, 13739600, 6821482, -21055540, -2275259, 7558069, +-3752191, 333397, 18045842, 5780489, 20923470, -12176769, -7438884, -3502009, -7560753, 8044474, +-7887171, 15531139, 15738371, -6934762, -15015743, 25368224, -12916577, -5380521, -2865817, 7494718, +4067334, -14288819, -4048007, 9002788, -6562710, 11443403, -5261335, 16250009, -8290898, 3605625, +25170656, -584116, 17792438, 30387430, 4054449, 14882062, -7527467, -36728412, -24632712, -4836133, +-1359357, 20749524, -468151, 6888591, 1983201, -5255966, -16764868, -37898256, 28840706, 1903744, +1066763, 9288941, 4684199, -9296994, 21382494, 988916, 4693863, -332860, 1653562, -18723374, +-6699075, -12366285, -7189239, -668941, -6700149, -7010997, 4569845, -1575179, -4534412, 13586055, +-2301029, -13943611, -9679246, 3426310, 932008, -4085051, 21386790, 6323803, -6815040, -8225936, +2454574, -1953136, -4118337, 638876, 2210835, -4807679, 5286031, -207769, 7517804, 9357660, +2119030, -926102, -2556043, 6265821, 6394670, 5472325, -41344964, -9958419, 43298640, -16637093, +-18471044, 38144680, -24419574, 21488258, 28833726, 11345156, 4041564, -21846888, 8454643, -38307352, +-18767396, 8386461, 20025822, 2264522, 4712116, 14536854, 38871600, 26219164, 8319352, 1480153, +96100, 4353486, 3348464, -14986215, 475668, 9646497, 12284143, 51773684, 29315300, 19999516, +37515464, 15338402, -5164698, 11307575, -514859, 35871568, 13145284, -2817499, -5762236, 15060840, +-2092186, 17285096, -53121768, 2432025, 18589692, -965831, 22459994, -8170639, 6111739, 11996381, +-49417356, -19031000, -3642132, -15734613, -20316270, -24071682, 22957674, -14649060, 4797479, -4345970, +23051626, -37110664, -9961103, -5049271, 12001212, 44560, -3142842, 27737436, 48275968, -3758, +15230491, -8844948, 4347581, 33814276, -35388384, -20961052, -29563334, -37444060, -2978560, -1242319, +-14536854, -15720654, -14799920, -14103062, -18198850, -26615376, -11402601, -17160004, -10342281, 4976794, +23983634, 7850664, 3921305, 3850438, -2005213, 5567888, 2640331, -16502875, -14788646, -4052302, +-20975546, -8167954, -9055402, -7017977, -8054675, 10067940, -7415798, 921271, 1793149, 4534412, +12084427, 18238578, 136365, -4186519, 13348221, -6267968, 8631274, 3515431, 2151779, -3157875, +2710124, 1993402, -7307887, -9766756, -10598906, -1165547, 22807886, 19432580, -18272402, -66247188, +-11587285, 26682484, 6460168, -7683160, -4984847, 1720671, -8887898, -12417824, 14754286, 10521596, +30190936, 10588168, 18238042, -7074348, 40101572, 6896107, 25505126, -3863323, 37011880, -14265197, +24192478, -23638964, 434865, 2294586, 17352204, -7028177, -12541305, -31165894, 17437030, 1986959, +3765613, -15207942, -27460410, -1973001, 3462818, -3685082, 8741332, 17571248, 2949569, 12490302, +45825152, -19441170, 4827007, -15273977, 23795192, 20164872, -22600654, 21338472, 24907052, -17856864, +6524056, 5557688, 17343078, 8196945, 34964792, 10697690, -12039330, 1851668, 45113800, 13984950, +-51002736, 14908368, 9453223, -44346612, -11994770, -14348412, -30900142, 2041183, 19517942, 20890720, +-12241731, 37736656, -9488656, -16668768, -8216273, 19870666, -74187504, -9277129, 1358283, 59880972, +8234526, 50750408, 24738474, 35571992, -730681, 12102144, -6573985, 30127584, 30999464, 27420682, +-6400038, -18519898, -7237557, 30114700, -3284039, -19906636, -8315594, 35716948, 5276904, -22427782, +-7349226, 32220844, 9526774, 13355738, -156766, 12112882, -8961986, -735513, -418759, 5202816, +-581968, 5639292, -4213363, -10570451, -12143483, -15256798, -1721745, -11147588, 275952, -2028835, +-4048544, 10689637, -11941083, -5032091, -11836930, -4512937, -21958020, -16586090, 22749368, 398895, +-40840308, 33114198, 71446784, 4757750, -39609800, 61536680, -13791677, -920197, 8865886, 34893388, +-19991462, 1476395, 69994008, -34677564, 16739098, 23535884, 22692460, -31015570, -3030636, 5539971, +-15093052, 2635499, 7387344, -12615393, 12510703, -21381958, -5957120, -8567386, -1511829, -12840342, +-11123428, -4153234, 6841346, -23315230, -21675626, 32747516, 6058052, -20523502, -5262946, 19477140, +47405164, -4127464, -22941030, 24669218, 36386428, -10540387, -2572686, 940598, 13253195, 98247, +158377, 16491064, -39934604, 27484032, -22983980, 295279, -32631014, 18387292, -2434710, -48932564, +24282672, -3492882, -18803904, 33022392, 4013647, 32652488, -27485644, -10576894, -11024107, -25546466, +-39508332, -52441012, 44644576, 18196702, 32902134, 30215632, 18835042, 7294465, -18719614, 28611462, +-14081050, -12040941, 38872676, 12935905, -7150047, -3474092, 11950747, -27456116, 7220377, -10850161, +18327162, -6984154, -11588359, 17346836, 3100430, -20409684, 1802276, -9671729, -5525476, 4317516, +-4291746, 3733400, -949725, -14703284, -7262790, 6356552, -4720169, -9274982, 9365176, 14460618, +14386530, -11428371, -4494147, 16622597, -28021978, 8455717, 10524817, -12098923, -27838368, 14089103, +1958505, -12658342, 8968429, -13551159, -21616570, 5718749, 19788524, -16227460, -6780680, 6904697, +17307108, -4716411, -1907502, 931471, -11731703, 38742216, -15791521, 11476689, 8929774, -40184788, +36098664, 12632036, -10366440, 31018790, 2551748, 2064806, 15120969, -13485124, 39537860, -31793496, +-17067126, 14745160, 13575318, 6720550, -29616484, -18015240, -32998234, 18177912, 4304094, 16598975, +-47782, 17826262, 7125888, 5943698, 632434, 15185931, -6956774, 8339216, -15149960, 11243151, +-14015552, -174483, -18475876, -13113072, 658741, -16406775, 7538742, 38893612, 9190156, -29275570, +15106474, 11645804, 20526722, 501437, 34216932, -29613800, 4367982, 13618804, -28646358, -6742562, +57328688, 32266478, -76258752, -32412508, 40296456, -11162620, -36288180, 14119705, -3890704, -27978490, +20229296, 34475704, -47119548, 9141838, 41442676, -28371480, -25560960, 33915748, 4333085, -28191628, +4738960, 21981106, -24755654, -3578782, 26604102, -4128537, -12243878, -19432042, 24300388, -6693707, +13417478, 2983392, 13624710, -9758703, 8704825, 24582246, 9471477, -18505940, 1165547, -13313862, +-9193914, -18656802, -2018098, -5166309, -1667521, -12636331, 12279311, 10626823, -4703526, 28074590, +-7570954, -30427158, 35878008, -4599373, -7315940, 6385543, 12280385, 1391033, -3806952, 30302068, +16383153, -21845278, 1359357, 8370355, -16087337, -13253732, 21665426, -11776800, -42505680, 40105868, +4654671, -41328860, -1723356, 21170430, -15918759, -34840776, 19323058, 26102126, -43011948, 5812702, +31408022, -19193672, -3855807, 34529928, -3174518, -14786499, 7616588, 14272713, -19772418, -5788006, +19931332, -5268851, 33157148, -72130752, -5623723, -12389370, -81151800, -13991393, -25345138, 8368207, +13424994, 24332064, -11101954, -31029528, -12344273, -44976896, 5639829, 16714402, 8964670, 7669738, +-36980744, 22878218, 3121368, -43457016, 31644782, -46764140, -19746112, -17252346, 12393128, 34638376, +39209832, -2781528, -9341554, -75953272, 32403918, 77858096, 27797028, 2253784, -42926588, -61822832, +-25999048, -4781909, 32136020, -38539816, -23717346, -39603356, -13175349, 72769632, 77541880, -13099113, +-36334888, -30481382, -16888886, -7749195, 38865160, -18177376, 11354820, 8668855, 25726318, -6694781, +-17989470, -45035416, -20135344, 69836704, 29317446, 46643880, -42712376, -22981296, -19984482, 47656956, +591095, -76229760, -74381856, 41947872, 70997424, 120196272, 20579872, -101145408, 16658031, -26336740, +34223372, 33849712, -124907312, -39190504, 23990076, 66180076, 15621333, -62846644, -14542759, -5777805, +36518496, 32032940, 8072928, -50202264, -8281234, 11745125, 22308060, 11884711, -13574781, 2806224, +-28432684, -2916283, -809601, 27828166, -18935438, 36907728, -23460186, 11027865, 20699594, -7972533, +17114370, 16158204, 28114320, 2200097, -14136885, -15641197, 2236604, 2158221, 4481262, 3762928, +-1279363, -1107565, -10631118, -10041634, -2498060, 18811420, -4959614, 1353989, -4088272, 6882685, +1021129, 10911364, -36348308, 30974230, -32389958, -7456063, 1527398, 7938174, -5862094, 7082938, +13024488, -21441014, -17808546, -758599, 5088463, 13176960, -14957760, 1789928, 11957726, -9413495, +7567733, -5064840, 35979476, -876710, -5102958, 20144470, 11517492, 17859010, -8941048, 11268384, +-3427921, -864362, 15310485, 10314901, 2778844, 4111894, 20549272, -19287624, -5435281, 1648194, +27628988, -816044, -5884105, 25061672, -6190122, -11436961, -10730439, 20698522, -4720706, 8825084, +5920076, 2825552, -7118909, 3403225, 8505109, 2517925, 24095840, 11428908, 7060390, -10700374, +-1248762, 8689256, -16676284, 5728950, 6781217, 17146584, 561030, -2479807, 10251013, 1792075, +-19397682, 21800718, 7118909, -5585068, 18773838, -12922483, -1211718, -9749576, -7830799, 17736068, +13625247, -1671816, 6995965, -11259794, 2881386, -15037217, -1033477, -13809930, 3349001, 8210367, +3512210, 1175747, -2532957, -2292439, 2927557, -8443369, 2703145, -3918621, 4170950, -5727339, +-1475858, -5339718, -5834176, 2541547, -693637, -891206, -1904281, 8117488, 3718905, -11382737, +-10979010, -8255464, 2798708, 3064459, 8712341, 4428112, -10073846, -2057826, -3532074, 9123047, +-1991254, 9874667, 4731980, -9017821, 493384, 4095251, -4414690, 6109591, -3456375, 6971806, +-4823249, -2212982, 2877091, -4758824, 57496192, 4593468, -21199958, -17617418, 2882460, 12959527, +-766115, 11827803, -4487167, -3211562, -15910169, -3538516, -11134166, 17706540, -11072963, -937377, +-6982006, -3338800, -4086662, 1912334, -11766600, 1779727, -5056787, -8337606, 2464774, -1350230, +693100, -2275259, 4179540, 1978906, -9835475, -6359236, 20938, -6709813, -5790690, 4871567, +-1568737, -10099616, 699006, -5623723, 4327717, -14907295, 7472170, -6488085, -11270531, 3420942, +-5149129, -5872294, 1559610, -109522, 733903, -2488934, 2530810, -4564477, 5068599, -3135326, +565325, 8294656, -5961952, 2779381, -1546188, -886374, 2297808, -6870337, 6279779, -7221451, +6270653, -1511829, -265214, -4624606, 5931887, -6936372, 496606, 2446521, -9072582, 9088151, +-5506685, 3855807, -4158602, 3684008, -3192771, -4028679, 6805913, -4242891, -785442, 6642167, +-4237522, -63888, 606664, 1049583, -4687420, 376347, -363462, -2075543, -1267552, 1138166, +-1423782, -2559264, -1199907, 2893734, -2575370, 2167885, -675384, -306553, -772020, -1966558, +1928977, -1329829, -1462436, 1986422, -1995012, 1570347, 820876, -1257889, 401579, -328028, +645319, -4016331, 3944391, -4131222, 813896, -613643, -2058900, 547608, -1085016, 2806224, +-27634356, -44680008, 47362752, 164437648, 31579820, 49323940, -101259224, -140924864, -58798640, -73826728, +57007100, 132004208, 75981728, 50914152, 5156645, -72858752, -64381024, -64512020, -26299696, 36478232, +31237298, 33237678, 30000346, -1081258, -4791573, -7725573, -10326175, -15362024, -2006287, 20110648, +-1735167, -11823508, -4540318, -17042968, -9474161, -3043521, -4154844, 32319628, 30198988, 17730162, +19196356, 883690, -23344758, -23968064, -43723304, -29271812, 4088272, 3470871, 9012989, 25737592, +36881420, 21985938, 18615462, -954557, -20762408, -29111826, -24955370, -21117280, 3092377, 7377680, +13568875, 9201431, 6281390, 1228361, -7501698, 2859911, 827318, 3054796, 18387828, -1835562, +8199093, 8196408, -13504988, -25853018, -26385594, -24012626, 6450504, 19454592, 14305462, 21297670, +19002546, -6471979, 4860829, 11548630, -7419019, -7198365, -16355772, -21368536, -8130910, -5158256, +-2088428, 8843875, 4320200, 4707284, 14433238, 13460964, 14211510, 7890392, 3720516, -7206955, +-8615704, -21964462, -23791434, -17112224, -12306155, 5242545, 15757161, 19505594, 26515518, 18693308, +12176232, 22012, -8036958, -13057774, -27117886, -29067802, -10052371, 5010080, 13991930, 10882910, +9791989, 10893648, 8153459, -693637, -1879585, 1011465, 482110, -4954782, -4115653, -14765024, +-9398462, -560493, 5490042, 7046431, 5912560, -2326799, -29528, 5161477, 4407174, 176094, +3142842, 2426657, -1449015, -7011534, -5933498, -6081137, -1101659, -1687385, 172872, 1158567, +6395207, 6658273, 6322192, 2576981, 1786706, -2451353, -1755568, -1751810, 297963, -704912, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 2178622, -6312528, 533113, 4223564, -972273, -621697, -2283312, 4503273, 2844342, -2654827, -3499862, -2265595, -896574, -5377836, -6229850, 1469953, 302795, -2107218, -2129767, -4195646, 2667175, --4934381, 1252520, -492848, 1107565, 398358, 1046898, -2221572, -332323, 866510, 1406602, --513249, 1722819, 1257352, -2197413, 1640141, -1334124, -4209605, 5954972, -1154809, 259846, -1413044, -760209, 3281892, 4194573, -911607, 1566053, 3153043, 252866, -3366181, -2583423, -832687, 1986959, -1028108, 1079647, 3871376, -3431679, -3089692, 3210488, 603980, -1294396, --2091112, -106300, 726386, 2430952, -3926674, 1909113, 986769, -3072512, -3315178, 2802466, --1808718, -4066797, -1740536, -399432, 6102612, 7040525, -619549, 1151588, -889058, 1064615, --1174137, 1854352, 1131187, -1187022, -401043, -1259499, 594853, -1672353, 1547262, 1364726, -307627, -1955821, 221728, -116501, 834834, -525060, 1299765, -704375, 226023, 57982, -804770, -207769, 275415, 209380, 831613, -69256, -7766912, -3353296, -5359583, 3512747, --2601677, -3635690, -2468533, -3260417, -652835, 1204738, 5868536, 1014686, -3142842, 4958540, -188979, 5111011, -4916664, 7915088, 3667365, 8586176, -1546188, -2923262, -595927, -4725538, --408022, -338229, -1717987, 1604170, 152471, -3753265, -916439, -15569, 1155346, 3723200, -852551, -5611912, -4679367, -1774895, 3143916, 206695, 147640, -2846490, 4663798, -130460, -334471, -2018098, 587337, -1220845, 2443300, -798864, 7779260, 61740, -1034013, 2946885, --1975685, -3508988, -1459752, 2632815, 4690105, 774168, 2868501, 702764, 475668, -2479807, --2426657, -3969087, -187905, -4114579, 1009317, 3338263, 3559454, 2502355, -1283658, -1828582, -3193845, -2283849, -963146, 1993939, -1843615, -330712, -965294, 2063732, 3673808, 1893544, -1067836, -941672, -427886, 656056, -381715, 2459943, 405338, -1214402, -728534, -562641, --180926, 336618, 292595, 30065, -397284, 1134945, 712428, 46171, 428960, -903017, --583042, -723165, -847719, -306553, -948114, -927176, -213675, 1161789, 5428302, 5872831, -3100430, 9664, 4788352, -2580202, -4074313, 3976603, 4126390, 5244692, 7707856, 751619, --4910758, 2876554, -4683662, -282931, 1567126, 1158567, 8584566, 716186, -6912213, -278099, -1233729, 2947958, -499290, -2301029, -7610145, -1447404, 6458557, 2282775, 4247723, 5026186, -4134980, 1204202, -719944, 4473746, -5653251, -120796, -3843459, 10366440, -559420, 340913, -4591320, -3773666, -601832, 1664837, -578747, 6203007, -950262, 1909113, 5886790, -1095217, -1845762, 538482, -285078, -9664, -774705, -1653562, 2544231, 3464428, -827318, 3448322, -1239635, 6776385, 7691213, -363998, 2056216, 1317481, -3884798, 3856881, -951335, -3195456, -1356136, 3798362, 1060320, -937914, 6815576, -927176, 1850594, 2086280, 1009317, -3420942, --200790, -667331, 549756, -1788854, -377420, 245350, 723702, 767725, 1254131, -404801, -613107, -1662152, -1153199, -2070174, 1603633, 565862, -313533, 672699, -290447, -1694365, -1086627, 199716, 787053, -496606, -605054, 334471, 2026151, -2071248, 8581345, 8387535, --3295314, -4818954, -4190814, -2895882, 2171106, -9192304, -876173, 1260573, -4374424, -8144332, -7918309, -1718524, -1962263, 1251446, 3666292, 3229816, -4000225, -1615445, -131533, -452045, -1933272, 2767033, -1493575, 3406446, -2522220, 5230197, -586263, 201327, -2639258, 2757906, -1067836, -808528, -2626909, 1260573, -1469416, -2349884, -1915019, 460635, 1779190, -4964982, -479963, -9361955, -5353677, 3360812, -1352378, 1114544, 2147484, 6158446, -1924682, -3105261, --155693, 194884, 2653753, 2493766, -2821794, -1266479, 6868727, 263067, 1103807, 582505, -3093987, -5670968, 258772, 2879776, 5356361, 1114544, 2341831, 8047695, -1908576, -751082, --4283156, 63888, 1395328, 2822867, 64425, -1727114, 2529736, -203474, 4538170, 52076, --105764, 558346, -5578089, -2901787, -3272228, 3159485, -477815, -898722, 9664, 428423, --162135, 1666984, -461172, -926102, -1180042, -595390, -1696512, -1124208, 1372242, 98784, --426812, -870805, 461709, 366683, 166430, -761820, 1506997, 644245, 966905, -193810, --41876, -995896, -1067299, 761283, -488016, 1021665, 1355062, -5434208, -8507256, 3651796, --2777770, 174483, -4379793, 3411815, -9820443, -8048232, -9261023, -3103651, -1960653, -6449967, -3305514, 8871255, -6513855, 1384590, 10402411, -2387465, -2829847, -4765266, 852551, -9127, -4614943, 1524713, 3320010, 2339684, -3375308, -6586869, -3134789, 3963181, -2230699, -4022237, -1029718, 1686312, 1308891, 856309, 9059160, -4254702, 4936528, -2340220, 2483565, -2617246, -7539278, -5587753, 3083250, -445066, -4465156, 4187593, -1651415, -1464584, 4498978, 2404645, --377420, -1966558, 4089883, 2027761, -4190278, -5015448, 3452617, 5579700, 3140695, 142808, --2414845, 295816, 3556770, -1517734, 4297115, -997506, -8730595, 287226, -3831111, 12451647, -4349728, -7068980, -3982509, -1386738, -3200825, 3218541, 3115999, 2367601, -1521492, 2736968, -2200634, 781147, -520765, -3646964, 726386, 1265405, -1042066, 849330, 1274532, -481573, --152471, 811212, -230854, -1078574, -906238, 94489, 956167, -984084, 904628, 1072131, --1368484, -1741072, -2202245, 77309, 1309965, -592706, 1163399, -940598, -90194, 890132, --625992, 376883, 3262565, -7239704, -8828842, 7606924, -1585380, -7203734, 652298, -1853278, -7438347, 3678640, -1824824, 1378685, -309775, -1096827, -1257889, 8589935, 1744831, 469762, --5793374, -2668785, -1304060, 3018825, 3839164, 11564199, 358630, 391916, -284542, 798864, --5010080, 242129, 2169495, -6303938, -4390531, -4078072, -448824, 8456791, -6799470, 1182727, -3925063, 1683627, -3142842, 3528316, -8504572, 7022272, -1449552, 11811, 3874061, -4325032, --5013301, -7866770, 1736777, -2567317, 7528541, 2603287, 249645, 1430761, 2334852, 5862631, --2524367, -1280437, 6177237, -1248762, -3424700, -121333, 6180995, 6207302, 5716602, 3067681, --3705483, 3637301, 5175973, -6038187, 7793755, -4723927, -4363687, 7016903, 791885, 10121627, --75699, -5675263, 2550137, -2526515, 6754373, 3201898, 1896765, 454730, 2347200, -1180579, -4261682, 1469953, 1721208, 1273458, 2513630, -197032, -164283, 1930588, -30065, 1417339, --715112, 2336462, 4817880, -2780991, -1236414, 841277, 638340, 306016, 1254131, -242129, -421444, 980863, 2379949, 169651, 4437238, 1046898, 549756, -1978369, 536334, 1453846, --1941325, 429497, 899796, -120259, 599685, -15849503, -10442139, 2807835, 5091684, 10837276, --6604586, 5815386, 1083406, 6124624, -312459, -2859911, -3722663, 3781182, 11228118, 947040, --983011, -10714333, -8960376, 54761, -6585796, -3878892, 384936, 1346472, -6749541, -2025077, -1640678, 3960497, 2118493, -4372277, -9664, 5034776, 4108673, 847182, -4136591, 760209, --2528125, 1215476, 1420560, 2305861, -3182571, 3995930, 9786620, -1000727, -720481, 1891396, --5442798, 2567854, 7885023, -7769059, -9146133, -4743255, 769336, -11862700, 307090, 332860, -1668595, 108985, -159451, -5635534, -3018288, -3662533, -482647, 8060580, 11926050, 331249, -802085, 5804649, -2415919, -1001801, 2716030, 13392782, 1713692, 4810364, 9430138, 1713692, --6084358, 2527588, 2834679, -2824478, 2917357, 2415382, -605590, -2920578, 1397475, 850940, --607201, -4985920, 2221572, 4564477, 1736777, 3324305, 1886564, 4013110, -841277, -1514513, -3728569, 3067681, -923418, -210453, -1075352, 2640868, 2901787, -2320356, 2883534, 762894, -384936, 712965, 1582159, 2137820, 312996, 1867774, -1232656, -680215, 25770, -337692, -801548, -1249299, 225486, -376883, 586263, -1682554, 8201240, 5070746, -7483981, -372052, -16224776, 14247480, 3077881, 8575976, 10722386, 2648921, -91805, 6959995, -3103114, 37581, --6289980, 5154498, -371515, 218506, 2403571, 2725694, 8859444, -7457137, -6706055, 6685654, -1436667, 3030636, -5222680, 912144, -1789391, 3418257, 107911, 4814122, 4828080, -4901095, -4096862, 3329674, -5531918, 14292041, 2561948, 2743947, -11068668, -3618510, -839666, 9244380, -8718247, -936840, -9494025, 6181532, -8248485, -2636573, 7326678, -270046, -5834176, 7042136, -8980777, -2334315, 3063386, -3654480, -12460774, 10201, 8078297, -3752728, -4226785, 5214627, --5949067, -9181029, 2319282, 6115497, 11317776, 5838471, -8386461, 3467649, -9861782, -11753715, -10837813, 5003100, 3999688, -7329899, -7785165, -1247151, 8182450, 2642479, 11667279, 5082557, -2983929, -12412992, 2047626, -3508452, 521302, -2951180, 2620467, 705985, 3161096, 5144834, -2772938, 394600, 2350421, -2124935, -967441, -2164127, 17180, -2030983, -537945, 701690, -3936875, 609885, -1578401, -767725, 1287417, 102542, -306016, -4041027, 258772, -2101850, -792421, -2895345, -3070902, 1998234, 2489471, 3810173, -3779571, 16782584, 10765872, -7274601, --1992865, -277025, 2934537, 2367064, -1063004, -6561100, 1586454, -4498442, 6977175, 217433, -2685965, -2283849, -1043677, -6847789, -3650722, 14426258, 4763119, -8798777, 4157528, -8595303, --6077379, -13444321, 5836861, 222801, 200253, 3183108, -382252, -6097780, 10125385, 5796595, --2248952, -10215580, 10214506, -7014219, 2684892, -266288, 3336116, 2017024, 6484864, 7494718, --1765768, 4149475, 11863773, 1522029, -3744138, -3401614, -2119566, 1843615, 7913477, -2181307, -3206193, 622770, -7282654, 277562, -1806571, 3542811, -10945187, -184684, -18234820, -11044508, --10182294, -2572686, -10062035, 6752763, -2528662, -8313446, -2254858, -934155, -6752226, -2924336, --258235, 676457, -4058207, -8734353, -8768176, 471910, -1919850, 2137820, 4886599, -781147, -2435247, 1223529, -59593, -142808, -4785131, -202937, -117575, -3825205, -334471, 3607773, -6912213, -1197222, -3335042, 2600066, -4311611, 3633542, -3602941, -1333587, 671626, -2605972, --3240016, -16643, -2029909, 505732, -769336, -3235184, 1575716, -126165, 4024384, 2729452, --2872796, 2448131, -1613834, 2277943, -1328219, 1551020, 1401770, 1111323, 62277, 1628866, --1908039, -1001801, -2118493, -4217658, 537408, 1548336, -462783, 933619, -3342022, -11431592, --14370961, -6723235, -9565966, 24769614, -11993159, 5669357, -11326366, -3177202, 1190243, -1760400, --16876538, -281320, -8021389, 671089, 19868518, -6287296, 8334921, 11009612, 3949223, 4518843, -11948062, 3629247, -4656819, 3469260, 4682051, 5115306, 2136746, -2413235, 13905493, 601832, --1122597, -2259690, 3767223, -1118302, -4846871, 4777078, -1797444, 3446175, -13479755, 631360, --2610266, 12259447, -4817343, 4001299, 18271864, -1525250, 376347, -4394826, -7560753, -367757, --1246077, -7664906, 9702868, -2027761, 7038378, 811212, 6646462, -3799436, -724776, 14671608, -7141457, -11287711, -5947456, 3150896, 3505230, 1794760, 3107409, -3260417, 4127464, 5412733, -12130061, -15538655, 930397, -6617471, 3171297, -237297, 1775432, 5783174, 8330089, -5525476, -5883032, -3991098, -2744484, -2213519, -2086280, 4735202, -10615012, -2051384, -4903779, 6115497, -4913443, 2128156, 2528125, -3527242, 4058207, 1889249, 2920578, -392453, 2315524, -3129958, --1773822, -3932580, -336081, -629213, -3552475, -46708, -369904, -943282, -49392, 4210142, -2579665, -2317135, -3799436, 1982127, 1439351, 4824859, -3723737, 290447, -1343251, 2164127, -2461016, -2024540, -3831111, -8199630, -7264937, -7932805, 8596377, -16594143, -4827007, -10411538, -5215701, 17124034, -9286256, 468688, 545998, -3397856, 6678138, -5559835, 2721399, -1749125, --7005092, 15276125, 825171, -5024575, 282394, -2269890, -6710887, 5313949, -5126581, 4987531, --9629854, -4531728, 6600291, 4776004, -16131360, -2930778, -13727252, 4088809, -2247879, -13282723, -16231218, -4540854, -255551, -12287365, -13397077, 768799, -12072616, -1597728, -10422275, -8960912, -10646687, 1160178, -13574781, 4466766, -12144020, 10872173, 3991635, -5279052, 475668, 3493956, -11487964, -8846022, -12452721, 12656732, -8781598, -5042829, 6692633, 9555765, -17672716, -8722542, -10139881, 7496329, 3968013, -928787, 1305670, -12736726, 4432406, 4247723, 7083475, -2241973, --13420162, -9769977, 4825933, -11627013, -10125385, 4291746, -618475, 159988, 4301410, 9821516, -68719, -411243, 9200894, 850940, -1434519, 1568200, -1192927, -1859184, 2024540, -2404108, --1644436, -4615479, -4365835, -3150896, 865436, -2621541, 91805, 1870458, 1542430, -255014, --2147, 2001992, -2261837, -3660923, 1156420, -119185, 3554086, -3372623, -909459, -3823595, -4495757, 4690641, 1066763, -232465, -2838974, -1172526, -4014721, 350577, 714575, -2279554, -765578, 928250, 8433705, -13015898, -21220896, -17139604, 7722351, -20492362, -991064, 15512885, --1374926, 1102733, 11139535, -7407745, -6301254, 24660628, -9772124, 5759015, 9388799, -1757715, --22368726, -1876901, 2359548, -5640903, -3100430, -5222680, 20871394, 182536, 236760, -1045825, --15034533, 2733210, -8656507, -4369056, 936303, 2494302, 4455492, 12099460, 2692408, -3144990, -23847806, 2488397, -5898064, -21829172, -3182571, 15973520, -3471944, -10030896, -13420699, -11844983, --10094247, -6376416, 16963510, 6570763, 975494, 9402220, 14172318, 7877507, -3087008, -2513630, -14649060, -2919504, -4492536, 4227859, 11202348, 1567663, -11511586, 2618320, -1161789, -17236778, --1300301, 13663902, -6782290, -7941395, -1925756, 18379238, -14652281, -2968359, -8176007, 8377871, -4879620, 3865471, 5887864, -2444910, -3157875, 6202470, 4975720, 3411278, -1005559, 737661, -3915937, -10848551, -1999844, 1386201, -5601174, 113280, 5913633, -629750, 1091459, -2356327, --674847, 3211025, 4176856, 6240051, 3520800, -1080721, 2228551, -3614752, -4573604, 1281511, --897648, -3746822, 4136054, 2173790, 3128347, 638876, 1513976, 3191161, 1778653, -954557, --2303176, -629750, 1301912, -16106, 1319629, 248034, 1636919, 973347, 2802466, 337692, --2698313, 5935645, 4871567, -4604742, -1555315, -2215130, 17365090, 1741072, -15501074, -578210, -4657355, -564251, -7062537, 6725919, -5223217, 13800804, -10613401, 9482751, 20744692, -5614059, --5515812, -4890894, -4305705, 18510772, -13710609, -15081241, -11495480, 4198868, -5992016, -9708774, --4454418, 6649146, -9293235, 5146445, 1232656, 7262790, 10798085, 1327145, -1364189, -2070711, -10644540, -2739116, 3771518, -13029320, -100395, -4640176, 10380399, -13845901, 11387032, -4782983, --7120519, 11449309, 19853486, -11149198, 5662915, -2461016, 4041564, -29782376, -23597624, -14324253, -2083596, -9086003, 3943317, 974421, -11046656, -8736500, 980326, 23745800, 5616207, -14790257, --22100292, -11666205, -8147016, 14555644, -10064719, -14402636, 3471944, 3170223, -13303124, -830002, --194884, -6600828, -1491427, -340913, -527207, 6533182, 1637993, -7648800, -6765647, -3723200, --9767293, -5323075, 1666984, 11054172, 1897302, 2086817, -3150896, -9038759, -1353989, 7440494, --301185, -4191351, 6875706, -10306848, -5020280, 1579474, 1697049, -143345, 1209033, 757525, --3427384, -7204271, -2535641, 5551782, -3142306, -2542084, -2822331, -6423124, -7072201, 2709051, --2491081, -1525250, -6653978, 1701881, 4499515, 5383742, -145492, -3173444, -3666828, 3892851, -3546569, 29823716, 19563576, -5156108, 2012729, 19283866, -7577933, 629750, 8342437, 20875688, -12313671, -3680787, -4611721, -7269232, 1931662, -4024384, 376347, 484794, 22073448, 36377300, --2079838, 25076704, 15924128, 3198140, 3995393, -17964774, -17710834, -2078227, 4762045, -1341104, -4413079, -6746857, -13247290, -22508850, -1876364, -14508400, -12162274, -8158827, -12591770, -9154186, --444529, 20770998, -609349, -15894600, -1278827, 4427038, 15525770, -4935991, -3875134, -9526774, -7074348, -28451474, -25440702, -12350178, -12665322, -13714904, -8217883, 8956081, -11417634, -15987479, --13321378, -23869280, 12243341, 6433324, -21082920, 10740639, 21400212, 41756208, 23139674, -363998, -7691750, -24190866, -9805410, 12861280, 11008538, -6280316, -16247324, 2010045, 3468186, 14702210, --1836635, -15325517, -2612414, 24141474, 15542413, 17445620, 14016626, 24349244, 23086522, 6793565, -6311992, -5511517, -9632001, -2820183, -795106, -8406325, 20938, -9697499, -7088844, 10982768, -4984847, -3149822, -9597104, -3806952, -1103270, -282931, -10688563, 10577431, 187905, -9114457, -5431523, -5669894, -4601521, -1506997, 3402688, 14639933, 7282117, 17541720, 129923, -3615289, -2072859, 6611566, 4551592, -2406256, 9382893, 319438, -2953864, 1251446, 7779260, -3932580, --3201898, 2747169, -590558, -31003222, -2796561, 49465676, -3496640, 1637456, 12520367, -18285286, -10293963, 35012572, 32605782, -32986960, -31322122, -199716, -33994128, -13112535, 59056, 3734474, -12548284, 18523658, 16630650, 29001766, 6998113, 11285027, 11733314, -5166309, -1996086, 2948495, -3941169, 8391292, -15590194, 34874596, 15145665, 16146930, -2983392, 35410396, 4495220, 21238614, -8977019, 6461242, -8335995, -5724118, 18245558, 6716255, 8510478, -19450296, -10200547, -16294032, --9296994, -11935714, -11274, -23503134, -25164214, -1779190, -9672266, -47854524, -35356708, -32360432, -9167608, 34331820, 44903348, -25120726, 30962420, 47779900, 8227547, 3723737, -3050501, 32764694, -2537252, 29603062, 12891344, 13669270, -19962472, -66432944, -52325048, -12187507, -1786706, 1024887, -2312840, 24037322, 23067196, 19705310, -12541305, 1209033, -6565932, -34473020, 3403762, 2292976, -17078938, 2225867, 25132002, 22320408, 5577015, 19350976, -8448738, 12952548, -11972221, -13846975, --5027259, 4842576, 21791590, -5410048, -6272800, 2734284, -10948409, -5807333, 10954851, -3664144, -7520488, -14319421, 18639084, 5152350, 32749, -1844689, 14281303, -4115653, 827855, 1785633, --483721, 9236327, -7304666, -4225174, -320512, 8829916, -14291504, 1252520, 4769025, -7499013, -792421, 1910187, 1473174, -3758633, 24251532, -5446556, -43361988, -3970161, 69448008, 12526809, --12780749, 17726404, -5531381, 11488501, -5347771, -7655779, -22613002, -8726837, -2280628, -3964792, --10718628, 16238198, -14595909, -16052977, -882079, 2392297, 14726906, 6376953, 4208531, 6042482, --5704791, -20938, 21889300, -11218991, -25601764, -5320928, 2492155, -8871255, 18260590, -9578851, --5847598, 15045270, 4502737, 11324218, -26452704, -30204358, 10231686, -5950677, -9982578, -13022341, --15634755, -33244658, 338766, -3052648, 11300059, -21340082, -43934832, 32950990, 9367861, 30963492, -3726958, -10189810, -9101573, 7949448, -16371342, 25647934, 5403606, 30814242, 21880710, 45824616, --4275103, -44306884, -34053184, -19672024, 25675314, 25373056, -19136764, 20114942, 40477920, -23854248, --3384971, 43067784, 6989523, 33042258, -4667019, -17141752, -44713832, -17660906, 5333813, 28525026, -25286620, -14960982, 12826383, 11638288, 23991688, 8005282, -23420994, -28189480, -10799695, 19166292, -41342280, -1229971, -3481071, 21195126, 11496554, 1752347, -3335579, -9197136, -10909217, -9165997, -7212861, 4103841, 13218299, -5658620, -1324997, 1041530, 8061117, 9955197, -12842489, 30602, -14906221, -1871532, -4125853, -16543140, 12030740, -225486, -6869264, -5217849, 16590385, -973347, --10396505, -5843303, -36529772, 37874096, 51391432, 8949101, 2333241, 11412802, -7844758, 22418656, -12541305, 23427972, -4752918, -24757802, 54984172, 306553, -20675436, 2532420, 37176164, 17012902, -7283728, -23573464, 2545842, -12629351, -9221295, 3670050, -17539036, 1462436, 4702453, 21115132, --30026116, -5130339, -3615289, 17826798, -6808060, -11113228, -10572062, -171262, 11358041, -23369990, -1677722, 6114960, -47771848, 6543920, -12969727, -33693480, 22094922, -24916716, -43661028, 57560076, --488553, 3284576, -4588636, -16077136, 34715148, -24650964, -2363306, 5114233, -15925739, -1365800, -43873092, 22644678, -38815232, -42008000, 41295036, -19821274, 24028194, 39621072, -35710504, -61422328, --42539504, 70717712, -4291209, -55629492, 50675244, -37131068, -70527120, -1231582, 60632052, -2753611, --73196440, -1180579, -24715926, 527207, 89997280, -13901199, -66475356, 9475772, 35182760, 590558, -41161892, 2239289, 678605, -13237626, 1535988, 9271224, 33190970, -7152195, -9148280, 32819456, --4571993, 7679402, 22959284, -4159676, -33833068, 21764210, 15755014, 25520158, -8158827, -818728, -8969502, -7634305, -24965034, -11152419, 10037339, 538482, -5070209, 32411970, -1177358, -36580236, -8287677, 29433410, 17010218, -12904766, 1423782, -14757508, -8286603, 35733592, 29991220, -8152385, --34840776, -11387032, 13991930, 11285027, 9206799, -6838662, -1504312, -24237038, 37248640, -7216619, -10973641, 24420110, 16769163, 18585934, 43892956, 19528142, -11373073, 7343857, 10446434, 14806363, --16566763, 42999600, 39825620, 5930813, 13459354, -9546102, -532039, -43249784, 19513110, -22687628, -15011984, -1460289, -16524350, 23928336, -9910100, -17307108, 8941585, -24570972, 16006806, 1024350, --5247377, 7193534, 9805410, 15770046, 15305116, 15375446, 44661216, -4116189, 4403415, 14605573, -29918742, -2667712, 7569880, 441845, 23284628, 28586228, -9732933, 7136088, -1781875, -4271345, --52151640, 4478041, 21482352, -11996917, -13158169, 11788075, -22038014, -31656594, 2327872, 18521510, -37613712, -48637284, 18224620, -2146410, -1901060, 585726, 18632642, 41437844, 200790, -29599304, -9410273, 33698852, -18586470, -25992606, 2019708, 14993731, -14664629, 26766774, -5669357, 20660940, -1232656, -19856170, 24350854, 20385526, 2866354, 16161962, -9436580, 10235444, -5377836, 5592048, -7602092, 24425480, -5645735, -28770376, -4297115, 34153044, 2069637, -3912178, 29470454, 6652368, --682900, 7606387, 20283520, 31353262, -20419886, 8023536, 3698504, -1086090, 14673219, -4036733, --23088134, 7806640, 20969104, -8805757, 5082020, 7719667, -7515656, 8773008, -14872398, 10624138, -8661338, -12093554, -27531814, 11938935, 14842333, -6706592, -10367514, 14760729, -1603633, -8295730, -23213224, -44100724, -34886944, -323733, -53669912, -18033494, -20048908, 41394896, -1491964, -14921253, -18613314, -9409736, 10184978, 2971044, -20671678, 24616068, -55305220, -4940823, 3047279, -13476534, -9851044, 2732673, -11025181, -1682554, 1329292, 14134737, 547608, -15854872, -53661860, -38655244, --29939680, -14476724, 32810328, -6431177, 969589, -53178136, 3732864, -3452080, -7509214, 1957431, --51944944, 27945742, -25352656, 13004624, -10529649, 35464620, -19473382, -33812668, -16648367, -22549, -25275346, 46810848, 48644800, -60065116, -44897440, -30531848, 20558934, 49848464, 59755344, -10188199, --15299747, -52538188, -19823422, 47291348, 28496572, -287763, -213138, -842350, -44847512, 30137248, --9181566, 29099478, 69561288, -77671264, 94272384, 26979910, -51383916, 14605573, -102807560, -99976104, -73813848, 31872416, 7108171, 22371948, -38160248, -17941690, 68790880, -2323041, 46209552, -4247186, --37461240, -11857868, 40810780, -13320304, -1060320, 13615046, -3444564, -23565948, 13162464, -19069118, -8829916, 26455388, -27300960, 26066694, 8518531, -3111704, 9626632, -1232656, -6219650, 4630512, --9524090, 5199595, -19385334, 17479980, 17775796, 4010426, 536334, -5569499, 9097814, 3725884, -3615826, 9238475, 17131550, -20895016, -7220377, -19360102, -15096273, 1969243, 768799, 17391396, --22034256, -16466905, -21221970, -12992276, -5665062, -44542568, 36820756, -22075596, 22588306, 12036109, -14204531, 8458938, -28632400, 31212602, -4771709, -11070815, -10366977, -12286828, 9398999, -6426882, -13431973, 8134131, -1929514, -3204583, -23998666, 13913547, 5495411, -6068789, 5155572, 12635257, --3741454, 7195144, -12276627, 14372571, -5494337, 1895154, 5658083, 6146098, -6537477, 22126060, --1025960, -20678120, -1543504, 9628780, 4551055, -15803869, 7544647, 18536542, -3643743, -8911520, --8933532, -1151588, 4916127, -2177549, 21527986, -14534706, -5757941, -5124433, -11070278, -864362, --3494493, 8013335, 5587753, -8910983, -1516660, 8400956, -8934606, -4452808, -2779918, 13474923, --8455180, 5812165, 8859444, -20735028, -8528731, 6717866, -21837224, 32952600, 8650064, 10525354, -15037217, -9570798, -392990, -2791729, -15074798, 3055869, 4802847, 12065637, -2507187, -4999879, -7202124, -7539278, -3240016, 7253663, -33823, -1719598, 5974300, 1907502, -3995930, -127775, --4398047, 9648107, -9184788, 14615237, 550830, 3254512, -6170258, -500901, -2301029, -4511863, --2482491, 3510062, 1673964, 4236449, -162672, -3389803, -2374043, -11241540, 11328513, -9018894, -5098663, -2110977, 6596533, -3684545, -10583336, 743029, 5419712, -8594230, 12919262, -10251550, -5636608, -3889093, 51510616, 6703370, -17445620, -13565654, -10151692, -998043, -1649268, 1114007, --1395328, -2008971, -29116658, 615254, -5791227, -6744710, 3705483, -11457362, -5180268, 5282273, --7964480, 2248416, 9048959, -12240657, 7712151, -4545149, -6471979, -1058173, -6472516, 3010235, --6005438, -3230352, -7077569, -1406065, -88047, -186294, -4242354, -4447439, 1361505, 2302103, --5073430, 6874632, -8465917, -772557, -3361886, -1101122, -1568200, -6756521, 9262634, 5648419, --9233106, 11252277, -1113470, 2388002, -5057324, 10797548, -10770167, 798327, 966368, 2844879, --1745904, -2811056, 8111583, -5364951, 1243930, 418222, -1596654, 2571612, -3463891, -495532, -4556961, -2273648, -2007360, 5101885, -1937030, -2234994, -4689031, 2462627, 2380486, -10519986, -12650289, -7110319, 2908230, 863825, 234076, -4076998, 1803886, 5177583, -3777961, -1949378, -2840584, -3872987, -181462, 3171297, -1239098, 1263257, 759672, -2870112, 569620, 370978, -2649458, -4660577, 454730, -525597, -1766305, 1948305, -2221035, 1122060, -1413044, -4076461, -2355253, -3533684, -1960116, 1312113, -2140504, 820339, 2127620, 228707, -3010772, 3278134, --554051, -2017024, -25169582, -40950364, 45730128, 153798480, 15653545, 35328252, -83669720, -127949760, --32150514, -66827544, 52081312, 107227080, 56507276, 35751308, -8010114, -41578504, -40898288, -30758946, --28565290, 10227391, 18294950, 10596221, 19691888, 2628520, 1580548, 7796977, 2236604, 8848706, -7039989, -5222144, -19582904, -14465987, -17258790, -23287850, -12305081, 13168370, 16972100, 31524524, -44500156, 16151225, 6449967, -14752139, -35255776, -34103116, -23822572, -16515223, 3403762, 13167296, -18895172, 20172388, 16996796, 11483132, 1347546, -1309428, -11193222, -7715372, -4930623, -5577552, --2168422, -6307160, -1806034, -7484518, -7322383, 2747169, -572304, 9772124, 16033113, 9547175, -23838142, 21247740, -10186589, -20888574, -20937966, -31170726, -8763344, -7478075, -1657321, 19235548, -17143362, -2988760, 14911590, 18602578, 6324876, 13007308, -1140314, -14951318, -10835666, -25690346, --16171089, -6067715, -1570884, -1874753, 4672388, 12171937, 19283330, 24317568, 20585778, 6887517, --11181947, -18344880, -17546552, -19585588, -8764955, -4963909, -1989107, 4359392, 9715216, 7704098, -13575318, 7413114, 8934606, 8097624, 118112, -6673306, -8691403, -10926397, -10706817, -9567040, --5032628, -5268851, 3118146, 5536213, 11178726, 16149614, 15633681, 5940477, 1159104, -8870718, --10735271, -12714177, -12694313, -3730716, -497679, -2449742, 3126199, 9918153, 13003013, 6391448, -1512365, -696858, 283468, -2609730, -2826625, -4890894, -2901787, -3724811, -2519535, -1631551, -183073, 1611, 3009162, 5558225, 5997385, 2678986, 1183264, -1540820, -776852, -1169842, -238908, -545461, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +6312528, 533113, 4223564, -972273, -621697, -2283312, 4503273, 2844342, -2654827, -3499862, +2265595, -896574, -5377836, -6229850, 1469953, 302795, -2107218, -2129767, -4195646, 2667175, +-4934381, 1252520, -492848, 1107565, 398358, 1046898, -2221572, -332323, 866510, 1406602, +-513249, 1722819, 1257352, -2197413, 1640141, -1334124, -4209605, 5954972, -1154809, 259846, +1413044, -760209, 3281892, 4194573, -911607, 1566053, 3153043, 252866, -3366181, -2583423, +832687, 1986959, -1028108, 1079647, 3871376, -3431679, -3089692, 3210488, 603980, -1294396, +-2091112, -106300, 726386, 2430952, -3926674, 1909113, 986769, -3072512, -3315178, 2802466, +-1808718, -4066797, -1740536, -399432, 6102612, 7040525, -619549, 1151588, -889058, 1064615, +-1174137, 1854352, 1131187, -1187022, -401043, -1259499, 594853, -1672353, 1547262, 1364726, +307627, -1955821, 221728, -116501, 834834, -525060, 1299765, -704375, 226023, 57982, +804770, -207769, 275415, 209380, 831613, -69256, -7766912, -3353296, -5359583, 3512747, +-2601677, -3635690, -2468533, -3260417, -652835, 1204738, 5868536, 1014686, -3142842, 4958540, +188979, 5111011, -4916664, 7915088, 3667365, 8586176, -1546188, -2923262, -595927, -4725538, +-408022, -338229, -1717987, 1604170, 152471, -3753265, -916439, -15569, 1155346, 3723200, +852551, -5611912, -4679367, -1774895, 3143916, 206695, 147640, -2846490, 4663798, -130460, +334471, -2018098, 587337, -1220845, 2443300, -798864, 7779260, 61740, -1034013, 2946885, +-1975685, -3508988, -1459752, 2632815, 4690105, 774168, 2868501, 702764, 475668, -2479807, +-2426657, -3969087, -187905, -4114579, 1009317, 3338263, 3559454, 2502355, -1283658, -1828582, +3193845, -2283849, -963146, 1993939, -1843615, -330712, -965294, 2063732, 3673808, 1893544, +1067836, -941672, -427886, 656056, -381715, 2459943, 405338, -1214402, -728534, -562641, +-180926, 336618, 292595, 30065, -397284, 1134945, 712428, 46171, 428960, -903017, +-583042, -723165, -847719, -306553, -948114, -927176, -213675, 1161789, 5428302, 5872831, +3100430, 9664, 4788352, -2580202, -4074313, 3976603, 4126390, 5244692, 7707856, 751619, +-4910758, 2876554, -4683662, -282931, 1567126, 1158567, 8584566, 716186, -6912213, -278099, +1233729, 2947958, -499290, -2301029, -7610145, -1447404, 6458557, 2282775, 4247723, 5026186, +4134980, 1204202, -719944, 4473746, -5653251, -120796, -3843459, 10366440, -559420, 340913, +4591320, -3773666, -601832, 1664837, -578747, 6203007, -950262, 1909113, 5886790, -1095217, +1845762, 538482, -285078, -9664, -774705, -1653562, 2544231, 3464428, -827318, 3448322, +1239635, 6776385, 7691213, -363998, 2056216, 1317481, -3884798, 3856881, -951335, -3195456, +1356136, 3798362, 1060320, -937914, 6815576, -927176, 1850594, 2086280, 1009317, -3420942, +-200790, -667331, 549756, -1788854, -377420, 245350, 723702, 767725, 1254131, -404801, +613107, -1662152, -1153199, -2070174, 1603633, 565862, -313533, 672699, -290447, -1694365, +1086627, 199716, 787053, -496606, -605054, 334471, 2026151, -2071248, 8581345, 8387535, +-3295314, -4818954, -4190814, -2895882, 2171106, -9192304, -876173, 1260573, -4374424, -8144332, +7918309, -1718524, -1962263, 1251446, 3666292, 3229816, -4000225, -1615445, -131533, -452045, +1933272, 2767033, -1493575, 3406446, -2522220, 5230197, -586263, 201327, -2639258, 2757906, +1067836, -808528, -2626909, 1260573, -1469416, -2349884, -1915019, 460635, 1779190, -4964982, +479963, -9361955, -5353677, 3360812, -1352378, 1114544, 2147484, 6158446, -1924682, -3105261, +-155693, 194884, 2653753, 2493766, -2821794, -1266479, 6868727, 263067, 1103807, 582505, +3093987, -5670968, 258772, 2879776, 5356361, 1114544, 2341831, 8047695, -1908576, -751082, +-4283156, 63888, 1395328, 2822867, 64425, -1727114, 2529736, -203474, 4538170, 52076, +-105764, 558346, -5578089, -2901787, -3272228, 3159485, -477815, -898722, 9664, 428423, +-162135, 1666984, -461172, -926102, -1180042, -595390, -1696512, -1124208, 1372242, 98784, +-426812, -870805, 461709, 366683, 166430, -761820, 1506997, 644245, 966905, -193810, +-41876, -995896, -1067299, 761283, -488016, 1021665, 1355062, -5434208, -8507256, 3651796, +-2777770, 174483, -4379793, 3411815, -9820443, -8048232, -9261023, -3103651, -1960653, -6449967, +3305514, 8871255, -6513855, 1384590, 10402411, -2387465, -2829847, -4765266, 852551, -9127, +4614943, 1524713, 3320010, 2339684, -3375308, -6586869, -3134789, 3963181, -2230699, -4022237, +1029718, 1686312, 1308891, 856309, 9059160, -4254702, 4936528, -2340220, 2483565, -2617246, +7539278, -5587753, 3083250, -445066, -4465156, 4187593, -1651415, -1464584, 4498978, 2404645, +-377420, -1966558, 4089883, 2027761, -4190278, -5015448, 3452617, 5579700, 3140695, 142808, +-2414845, 295816, 3556770, -1517734, 4297115, -997506, -8730595, 287226, -3831111, 12451647, +4349728, -7068980, -3982509, -1386738, -3200825, 3218541, 3115999, 2367601, -1521492, 2736968, +2200634, 781147, -520765, -3646964, 726386, 1265405, -1042066, 849330, 1274532, -481573, +-152471, 811212, -230854, -1078574, -906238, 94489, 956167, -984084, 904628, 1072131, +-1368484, -1741072, -2202245, 77309, 1309965, -592706, 1163399, -940598, -90194, 890132, +-625992, 376883, 3262565, -7239704, -8828842, 7606924, -1585380, -7203734, 652298, -1853278, +7438347, 3678640, -1824824, 1378685, -309775, -1096827, -1257889, 8589935, 1744831, 469762, +-5793374, -2668785, -1304060, 3018825, 3839164, 11564199, 358630, 391916, -284542, 798864, +-5010080, 242129, 2169495, -6303938, -4390531, -4078072, -448824, 8456791, -6799470, 1182727, +3925063, 1683627, -3142842, 3528316, -8504572, 7022272, -1449552, 11811, 3874061, -4325032, +-5013301, -7866770, 1736777, -2567317, 7528541, 2603287, 249645, 1430761, 2334852, 5862631, +-2524367, -1280437, 6177237, -1248762, -3424700, -121333, 6180995, 6207302, 5716602, 3067681, +-3705483, 3637301, 5175973, -6038187, 7793755, -4723927, -4363687, 7016903, 791885, 10121627, +-75699, -5675263, 2550137, -2526515, 6754373, 3201898, 1896765, 454730, 2347200, -1180579, +4261682, 1469953, 1721208, 1273458, 2513630, -197032, -164283, 1930588, -30065, 1417339, +-715112, 2336462, 4817880, -2780991, -1236414, 841277, 638340, 306016, 1254131, -242129, +421444, 980863, 2379949, 169651, 4437238, 1046898, 549756, -1978369, 536334, 1453846, +-1941325, 429497, 899796, -120259, 599685, -15849503, -10442139, 2807835, 5091684, 10837276, +-6604586, 5815386, 1083406, 6124624, -312459, -2859911, -3722663, 3781182, 11228118, 947040, +-983011, -10714333, -8960376, 54761, -6585796, -3878892, 384936, 1346472, -6749541, -2025077, +1640678, 3960497, 2118493, -4372277, -9664, 5034776, 4108673, 847182, -4136591, 760209, +-2528125, 1215476, 1420560, 2305861, -3182571, 3995930, 9786620, -1000727, -720481, 1891396, +-5442798, 2567854, 7885023, -7769059, -9146133, -4743255, 769336, -11862700, 307090, 332860, +1668595, 108985, -159451, -5635534, -3018288, -3662533, -482647, 8060580, 11926050, 331249, +802085, 5804649, -2415919, -1001801, 2716030, 13392782, 1713692, 4810364, 9430138, 1713692, +-6084358, 2527588, 2834679, -2824478, 2917357, 2415382, -605590, -2920578, 1397475, 850940, +-607201, -4985920, 2221572, 4564477, 1736777, 3324305, 1886564, 4013110, -841277, -1514513, +3728569, 3067681, -923418, -210453, -1075352, 2640868, 2901787, -2320356, 2883534, 762894, +384936, 712965, 1582159, 2137820, 312996, 1867774, -1232656, -680215, 25770, -337692, +801548, -1249299, 225486, -376883, 586263, -1682554, 8201240, 5070746, -7483981, -372052, +16224776, 14247480, 3077881, 8575976, 10722386, 2648921, -91805, 6959995, -3103114, 37581, +-6289980, 5154498, -371515, 218506, 2403571, 2725694, 8859444, -7457137, -6706055, 6685654, +1436667, 3030636, -5222680, 912144, -1789391, 3418257, 107911, 4814122, 4828080, -4901095, +4096862, 3329674, -5531918, 14292041, 2561948, 2743947, -11068668, -3618510, -839666, 9244380, +8718247, -936840, -9494025, 6181532, -8248485, -2636573, 7326678, -270046, -5834176, 7042136, +8980777, -2334315, 3063386, -3654480, -12460774, 10201, 8078297, -3752728, -4226785, 5214627, +-5949067, -9181029, 2319282, 6115497, 11317776, 5838471, -8386461, 3467649, -9861782, -11753715, +10837813, 5003100, 3999688, -7329899, -7785165, -1247151, 8182450, 2642479, 11667279, 5082557, +2983929, -12412992, 2047626, -3508452, 521302, -2951180, 2620467, 705985, 3161096, 5144834, +2772938, 394600, 2350421, -2124935, -967441, -2164127, 17180, -2030983, -537945, 701690, +3936875, 609885, -1578401, -767725, 1287417, 102542, -306016, -4041027, 258772, -2101850, +792421, -2895345, -3070902, 1998234, 2489471, 3810173, -3779571, 16782584, 10765872, -7274601, +-1992865, -277025, 2934537, 2367064, -1063004, -6561100, 1586454, -4498442, 6977175, 217433, +2685965, -2283849, -1043677, -6847789, -3650722, 14426258, 4763119, -8798777, 4157528, -8595303, +-6077379, -13444321, 5836861, 222801, 200253, 3183108, -382252, -6097780, 10125385, 5796595, +-2248952, -10215580, 10214506, -7014219, 2684892, -266288, 3336116, 2017024, 6484864, 7494718, +-1765768, 4149475, 11863773, 1522029, -3744138, -3401614, -2119566, 1843615, 7913477, -2181307, +3206193, 622770, -7282654, 277562, -1806571, 3542811, -10945187, -184684, -18234820, -11044508, +-10182294, -2572686, -10062035, 6752763, -2528662, -8313446, -2254858, -934155, -6752226, -2924336, +-258235, 676457, -4058207, -8734353, -8768176, 471910, -1919850, 2137820, 4886599, -781147, +2435247, 1223529, -59593, -142808, -4785131, -202937, -117575, -3825205, -334471, 3607773, +6912213, -1197222, -3335042, 2600066, -4311611, 3633542, -3602941, -1333587, 671626, -2605972, +-3240016, -16643, -2029909, 505732, -769336, -3235184, 1575716, -126165, 4024384, 2729452, +-2872796, 2448131, -1613834, 2277943, -1328219, 1551020, 1401770, 1111323, 62277, 1628866, +-1908039, -1001801, -2118493, -4217658, 537408, 1548336, -462783, 933619, -3342022, -11431592, +-14370961, -6723235, -9565966, 24769614, -11993159, 5669357, -11326366, -3177202, 1190243, -1760400, +-16876538, -281320, -8021389, 671089, 19868518, -6287296, 8334921, 11009612, 3949223, 4518843, +11948062, 3629247, -4656819, 3469260, 4682051, 5115306, 2136746, -2413235, 13905493, 601832, +-1122597, -2259690, 3767223, -1118302, -4846871, 4777078, -1797444, 3446175, -13479755, 631360, +-2610266, 12259447, -4817343, 4001299, 18271864, -1525250, 376347, -4394826, -7560753, -367757, +-1246077, -7664906, 9702868, -2027761, 7038378, 811212, 6646462, -3799436, -724776, 14671608, +7141457, -11287711, -5947456, 3150896, 3505230, 1794760, 3107409, -3260417, 4127464, 5412733, +12130061, -15538655, 930397, -6617471, 3171297, -237297, 1775432, 5783174, 8330089, -5525476, +5883032, -3991098, -2744484, -2213519, -2086280, 4735202, -10615012, -2051384, -4903779, 6115497, +4913443, 2128156, 2528125, -3527242, 4058207, 1889249, 2920578, -392453, 2315524, -3129958, +-1773822, -3932580, -336081, -629213, -3552475, -46708, -369904, -943282, -49392, 4210142, +2579665, -2317135, -3799436, 1982127, 1439351, 4824859, -3723737, 290447, -1343251, 2164127, +2461016, -2024540, -3831111, -8199630, -7264937, -7932805, 8596377, -16594143, -4827007, -10411538, +5215701, 17124034, -9286256, 468688, 545998, -3397856, 6678138, -5559835, 2721399, -1749125, +-7005092, 15276125, 825171, -5024575, 282394, -2269890, -6710887, 5313949, -5126581, 4987531, +-9629854, -4531728, 6600291, 4776004, -16131360, -2930778, -13727252, 4088809, -2247879, -13282723, +16231218, -4540854, -255551, -12287365, -13397077, 768799, -12072616, -1597728, -10422275, -8960912, +10646687, 1160178, -13574781, 4466766, -12144020, 10872173, 3991635, -5279052, 475668, 3493956, +11487964, -8846022, -12452721, 12656732, -8781598, -5042829, 6692633, 9555765, -17672716, -8722542, +10139881, 7496329, 3968013, -928787, 1305670, -12736726, 4432406, 4247723, 7083475, -2241973, +-13420162, -9769977, 4825933, -11627013, -10125385, 4291746, -618475, 159988, 4301410, 9821516, +68719, -411243, 9200894, 850940, -1434519, 1568200, -1192927, -1859184, 2024540, -2404108, +-1644436, -4615479, -4365835, -3150896, 865436, -2621541, 91805, 1870458, 1542430, -255014, +-2147, 2001992, -2261837, -3660923, 1156420, -119185, 3554086, -3372623, -909459, -3823595, +4495757, 4690641, 1066763, -232465, -2838974, -1172526, -4014721, 350577, 714575, -2279554, +765578, 928250, 8433705, -13015898, -21220896, -17139604, 7722351, -20492362, -991064, 15512885, +-1374926, 1102733, 11139535, -7407745, -6301254, 24660628, -9772124, 5759015, 9388799, -1757715, +-22368726, -1876901, 2359548, -5640903, -3100430, -5222680, 20871394, 182536, 236760, -1045825, +-15034533, 2733210, -8656507, -4369056, 936303, 2494302, 4455492, 12099460, 2692408, -3144990, +23847806, 2488397, -5898064, -21829172, -3182571, 15973520, -3471944, -10030896, -13420699, -11844983, +-10094247, -6376416, 16963510, 6570763, 975494, 9402220, 14172318, 7877507, -3087008, -2513630, +14649060, -2919504, -4492536, 4227859, 11202348, 1567663, -11511586, 2618320, -1161789, -17236778, +-1300301, 13663902, -6782290, -7941395, -1925756, 18379238, -14652281, -2968359, -8176007, 8377871, +4879620, 3865471, 5887864, -2444910, -3157875, 6202470, 4975720, 3411278, -1005559, 737661, +3915937, -10848551, -1999844, 1386201, -5601174, 113280, 5913633, -629750, 1091459, -2356327, +-674847, 3211025, 4176856, 6240051, 3520800, -1080721, 2228551, -3614752, -4573604, 1281511, +-897648, -3746822, 4136054, 2173790, 3128347, 638876, 1513976, 3191161, 1778653, -954557, +-2303176, -629750, 1301912, -16106, 1319629, 248034, 1636919, 973347, 2802466, 337692, +-2698313, 5935645, 4871567, -4604742, -1555315, -2215130, 17365090, 1741072, -15501074, -578210, +4657355, -564251, -7062537, 6725919, -5223217, 13800804, -10613401, 9482751, 20744692, -5614059, +-5515812, -4890894, -4305705, 18510772, -13710609, -15081241, -11495480, 4198868, -5992016, -9708774, +-4454418, 6649146, -9293235, 5146445, 1232656, 7262790, 10798085, 1327145, -1364189, -2070711, +10644540, -2739116, 3771518, -13029320, -100395, -4640176, 10380399, -13845901, 11387032, -4782983, +-7120519, 11449309, 19853486, -11149198, 5662915, -2461016, 4041564, -29782376, -23597624, -14324253, +2083596, -9086003, 3943317, 974421, -11046656, -8736500, 980326, 23745800, 5616207, -14790257, +-22100292, -11666205, -8147016, 14555644, -10064719, -14402636, 3471944, 3170223, -13303124, -830002, +-194884, -6600828, -1491427, -340913, -527207, 6533182, 1637993, -7648800, -6765647, -3723200, +-9767293, -5323075, 1666984, 11054172, 1897302, 2086817, -3150896, -9038759, -1353989, 7440494, +-301185, -4191351, 6875706, -10306848, -5020280, 1579474, 1697049, -143345, 1209033, 757525, +-3427384, -7204271, -2535641, 5551782, -3142306, -2542084, -2822331, -6423124, -7072201, 2709051, +-2491081, -1525250, -6653978, 1701881, 4499515, 5383742, -145492, -3173444, -3666828, 3892851, +3546569, 29823716, 19563576, -5156108, 2012729, 19283866, -7577933, 629750, 8342437, 20875688, +12313671, -3680787, -4611721, -7269232, 1931662, -4024384, 376347, 484794, 22073448, 36377300, +-2079838, 25076704, 15924128, 3198140, 3995393, -17964774, -17710834, -2078227, 4762045, -1341104, +4413079, -6746857, -13247290, -22508850, -1876364, -14508400, -12162274, -8158827, -12591770, -9154186, +-444529, 20770998, -609349, -15894600, -1278827, 4427038, 15525770, -4935991, -3875134, -9526774, +7074348, -28451474, -25440702, -12350178, -12665322, -13714904, -8217883, 8956081, -11417634, -15987479, +-13321378, -23869280, 12243341, 6433324, -21082920, 10740639, 21400212, 41756208, 23139674, -363998, +7691750, -24190866, -9805410, 12861280, 11008538, -6280316, -16247324, 2010045, 3468186, 14702210, +-1836635, -15325517, -2612414, 24141474, 15542413, 17445620, 14016626, 24349244, 23086522, 6793565, +6311992, -5511517, -9632001, -2820183, -795106, -8406325, 20938, -9697499, -7088844, 10982768, +4984847, -3149822, -9597104, -3806952, -1103270, -282931, -10688563, 10577431, 187905, -9114457, +5431523, -5669894, -4601521, -1506997, 3402688, 14639933, 7282117, 17541720, 129923, -3615289, +2072859, 6611566, 4551592, -2406256, 9382893, 319438, -2953864, 1251446, 7779260, -3932580, +-3201898, 2747169, -590558, -31003222, -2796561, 49465676, -3496640, 1637456, 12520367, -18285286, +10293963, 35012572, 32605782, -32986960, -31322122, -199716, -33994128, -13112535, 59056, 3734474, +12548284, 18523658, 16630650, 29001766, 6998113, 11285027, 11733314, -5166309, -1996086, 2948495, +3941169, 8391292, -15590194, 34874596, 15145665, 16146930, -2983392, 35410396, 4495220, 21238614, +8977019, 6461242, -8335995, -5724118, 18245558, 6716255, 8510478, -19450296, -10200547, -16294032, +-9296994, -11935714, -11274, -23503134, -25164214, -1779190, -9672266, -47854524, -35356708, -32360432, +9167608, 34331820, 44903348, -25120726, 30962420, 47779900, 8227547, 3723737, -3050501, 32764694, +2537252, 29603062, 12891344, 13669270, -19962472, -66432944, -52325048, -12187507, -1786706, 1024887, +2312840, 24037322, 23067196, 19705310, -12541305, 1209033, -6565932, -34473020, 3403762, 2292976, +17078938, 2225867, 25132002, 22320408, 5577015, 19350976, -8448738, 12952548, -11972221, -13846975, +-5027259, 4842576, 21791590, -5410048, -6272800, 2734284, -10948409, -5807333, 10954851, -3664144, +7520488, -14319421, 18639084, 5152350, 32749, -1844689, 14281303, -4115653, 827855, 1785633, +-483721, 9236327, -7304666, -4225174, -320512, 8829916, -14291504, 1252520, 4769025, -7499013, +792421, 1910187, 1473174, -3758633, 24251532, -5446556, -43361988, -3970161, 69448008, 12526809, +-12780749, 17726404, -5531381, 11488501, -5347771, -7655779, -22613002, -8726837, -2280628, -3964792, +-10718628, 16238198, -14595909, -16052977, -882079, 2392297, 14726906, 6376953, 4208531, 6042482, +-5704791, -20938, 21889300, -11218991, -25601764, -5320928, 2492155, -8871255, 18260590, -9578851, +-5847598, 15045270, 4502737, 11324218, -26452704, -30204358, 10231686, -5950677, -9982578, -13022341, +-15634755, -33244658, 338766, -3052648, 11300059, -21340082, -43934832, 32950990, 9367861, 30963492, +3726958, -10189810, -9101573, 7949448, -16371342, 25647934, 5403606, 30814242, 21880710, 45824616, +-4275103, -44306884, -34053184, -19672024, 25675314, 25373056, -19136764, 20114942, 40477920, -23854248, +-3384971, 43067784, 6989523, 33042258, -4667019, -17141752, -44713832, -17660906, 5333813, 28525026, +25286620, -14960982, 12826383, 11638288, 23991688, 8005282, -23420994, -28189480, -10799695, 19166292, +41342280, -1229971, -3481071, 21195126, 11496554, 1752347, -3335579, -9197136, -10909217, -9165997, +7212861, 4103841, 13218299, -5658620, -1324997, 1041530, 8061117, 9955197, -12842489, 30602, +14906221, -1871532, -4125853, -16543140, 12030740, -225486, -6869264, -5217849, 16590385, -973347, +-10396505, -5843303, -36529772, 37874096, 51391432, 8949101, 2333241, 11412802, -7844758, 22418656, +12541305, 23427972, -4752918, -24757802, 54984172, 306553, -20675436, 2532420, 37176164, 17012902, +7283728, -23573464, 2545842, -12629351, -9221295, 3670050, -17539036, 1462436, 4702453, 21115132, +-30026116, -5130339, -3615289, 17826798, -6808060, -11113228, -10572062, -171262, 11358041, -23369990, +1677722, 6114960, -47771848, 6543920, -12969727, -33693480, 22094922, -24916716, -43661028, 57560076, +-488553, 3284576, -4588636, -16077136, 34715148, -24650964, -2363306, 5114233, -15925739, -1365800, +43873092, 22644678, -38815232, -42008000, 41295036, -19821274, 24028194, 39621072, -35710504, -61422328, +-42539504, 70717712, -4291209, -55629492, 50675244, -37131068, -70527120, -1231582, 60632052, -2753611, +-73196440, -1180579, -24715926, 527207, 89997280, -13901199, -66475356, 9475772, 35182760, 590558, +41161892, 2239289, 678605, -13237626, 1535988, 9271224, 33190970, -7152195, -9148280, 32819456, +-4571993, 7679402, 22959284, -4159676, -33833068, 21764210, 15755014, 25520158, -8158827, -818728, +8969502, -7634305, -24965034, -11152419, 10037339, 538482, -5070209, 32411970, -1177358, -36580236, +8287677, 29433410, 17010218, -12904766, 1423782, -14757508, -8286603, 35733592, 29991220, -8152385, +-34840776, -11387032, 13991930, 11285027, 9206799, -6838662, -1504312, -24237038, 37248640, -7216619, +10973641, 24420110, 16769163, 18585934, 43892956, 19528142, -11373073, 7343857, 10446434, 14806363, +-16566763, 42999600, 39825620, 5930813, 13459354, -9546102, -532039, -43249784, 19513110, -22687628, +15011984, -1460289, -16524350, 23928336, -9910100, -17307108, 8941585, -24570972, 16006806, 1024350, +-5247377, 7193534, 9805410, 15770046, 15305116, 15375446, 44661216, -4116189, 4403415, 14605573, +29918742, -2667712, 7569880, 441845, 23284628, 28586228, -9732933, 7136088, -1781875, -4271345, +-52151640, 4478041, 21482352, -11996917, -13158169, 11788075, -22038014, -31656594, 2327872, 18521510, +37613712, -48637284, 18224620, -2146410, -1901060, 585726, 18632642, 41437844, 200790, -29599304, +9410273, 33698852, -18586470, -25992606, 2019708, 14993731, -14664629, 26766774, -5669357, 20660940, +1232656, -19856170, 24350854, 20385526, 2866354, 16161962, -9436580, 10235444, -5377836, 5592048, +7602092, 24425480, -5645735, -28770376, -4297115, 34153044, 2069637, -3912178, 29470454, 6652368, +-682900, 7606387, 20283520, 31353262, -20419886, 8023536, 3698504, -1086090, 14673219, -4036733, +-23088134, 7806640, 20969104, -8805757, 5082020, 7719667, -7515656, 8773008, -14872398, 10624138, +8661338, -12093554, -27531814, 11938935, 14842333, -6706592, -10367514, 14760729, -1603633, -8295730, +23213224, -44100724, -34886944, -323733, -53669912, -18033494, -20048908, 41394896, -1491964, -14921253, +18613314, -9409736, 10184978, 2971044, -20671678, 24616068, -55305220, -4940823, 3047279, -13476534, +9851044, 2732673, -11025181, -1682554, 1329292, 14134737, 547608, -15854872, -53661860, -38655244, +-29939680, -14476724, 32810328, -6431177, 969589, -53178136, 3732864, -3452080, -7509214, 1957431, +-51944944, 27945742, -25352656, 13004624, -10529649, 35464620, -19473382, -33812668, -16648367, -22549, +25275346, 46810848, 48644800, -60065116, -44897440, -30531848, 20558934, 49848464, 59755344, -10188199, +-15299747, -52538188, -19823422, 47291348, 28496572, -287763, -213138, -842350, -44847512, 30137248, +-9181566, 29099478, 69561288, -77671264, 94272384, 26979910, -51383916, 14605573, -102807560, -99976104, +73813848, 31872416, 7108171, 22371948, -38160248, -17941690, 68790880, -2323041, 46209552, -4247186, +-37461240, -11857868, 40810780, -13320304, -1060320, 13615046, -3444564, -23565948, 13162464, -19069118, +8829916, 26455388, -27300960, 26066694, 8518531, -3111704, 9626632, -1232656, -6219650, 4630512, +-9524090, 5199595, -19385334, 17479980, 17775796, 4010426, 536334, -5569499, 9097814, 3725884, +3615826, 9238475, 17131550, -20895016, -7220377, -19360102, -15096273, 1969243, 768799, 17391396, +-22034256, -16466905, -21221970, -12992276, -5665062, -44542568, 36820756, -22075596, 22588306, 12036109, +14204531, 8458938, -28632400, 31212602, -4771709, -11070815, -10366977, -12286828, 9398999, -6426882, +13431973, 8134131, -1929514, -3204583, -23998666, 13913547, 5495411, -6068789, 5155572, 12635257, +-3741454, 7195144, -12276627, 14372571, -5494337, 1895154, 5658083, 6146098, -6537477, 22126060, +-1025960, -20678120, -1543504, 9628780, 4551055, -15803869, 7544647, 18536542, -3643743, -8911520, +-8933532, -1151588, 4916127, -2177549, 21527986, -14534706, -5757941, -5124433, -11070278, -864362, +-3494493, 8013335, 5587753, -8910983, -1516660, 8400956, -8934606, -4452808, -2779918, 13474923, +-8455180, 5812165, 8859444, -20735028, -8528731, 6717866, -21837224, 32952600, 8650064, 10525354, +15037217, -9570798, -392990, -2791729, -15074798, 3055869, 4802847, 12065637, -2507187, -4999879, +7202124, -7539278, -3240016, 7253663, -33823, -1719598, 5974300, 1907502, -3995930, -127775, +-4398047, 9648107, -9184788, 14615237, 550830, 3254512, -6170258, -500901, -2301029, -4511863, +-2482491, 3510062, 1673964, 4236449, -162672, -3389803, -2374043, -11241540, 11328513, -9018894, +5098663, -2110977, 6596533, -3684545, -10583336, 743029, 5419712, -8594230, 12919262, -10251550, +5636608, -3889093, 51510616, 6703370, -17445620, -13565654, -10151692, -998043, -1649268, 1114007, +-1395328, -2008971, -29116658, 615254, -5791227, -6744710, 3705483, -11457362, -5180268, 5282273, +-7964480, 2248416, 9048959, -12240657, 7712151, -4545149, -6471979, -1058173, -6472516, 3010235, +-6005438, -3230352, -7077569, -1406065, -88047, -186294, -4242354, -4447439, 1361505, 2302103, +-5073430, 6874632, -8465917, -772557, -3361886, -1101122, -1568200, -6756521, 9262634, 5648419, +-9233106, 11252277, -1113470, 2388002, -5057324, 10797548, -10770167, 798327, 966368, 2844879, +-1745904, -2811056, 8111583, -5364951, 1243930, 418222, -1596654, 2571612, -3463891, -495532, +4556961, -2273648, -2007360, 5101885, -1937030, -2234994, -4689031, 2462627, 2380486, -10519986, +12650289, -7110319, 2908230, 863825, 234076, -4076998, 1803886, 5177583, -3777961, -1949378, +2840584, -3872987, -181462, 3171297, -1239098, 1263257, 759672, -2870112, 569620, 370978, +2649458, -4660577, 454730, -525597, -1766305, 1948305, -2221035, 1122060, -1413044, -4076461, +2355253, -3533684, -1960116, 1312113, -2140504, 820339, 2127620, 228707, -3010772, 3278134, +-554051, -2017024, -25169582, -40950364, 45730128, 153798480, 15653545, 35328252, -83669720, -127949760, +-32150514, -66827544, 52081312, 107227080, 56507276, 35751308, -8010114, -41578504, -40898288, -30758946, +-28565290, 10227391, 18294950, 10596221, 19691888, 2628520, 1580548, 7796977, 2236604, 8848706, +7039989, -5222144, -19582904, -14465987, -17258790, -23287850, -12305081, 13168370, 16972100, 31524524, +44500156, 16151225, 6449967, -14752139, -35255776, -34103116, -23822572, -16515223, 3403762, 13167296, +18895172, 20172388, 16996796, 11483132, 1347546, -1309428, -11193222, -7715372, -4930623, -5577552, +-2168422, -6307160, -1806034, -7484518, -7322383, 2747169, -572304, 9772124, 16033113, 9547175, +23838142, 21247740, -10186589, -20888574, -20937966, -31170726, -8763344, -7478075, -1657321, 19235548, +17143362, -2988760, 14911590, 18602578, 6324876, 13007308, -1140314, -14951318, -10835666, -25690346, +-16171089, -6067715, -1570884, -1874753, 4672388, 12171937, 19283330, 24317568, 20585778, 6887517, +-11181947, -18344880, -17546552, -19585588, -8764955, -4963909, -1989107, 4359392, 9715216, 7704098, +13575318, 7413114, 8934606, 8097624, 118112, -6673306, -8691403, -10926397, -10706817, -9567040, +-5032628, -5268851, 3118146, 5536213, 11178726, 16149614, 15633681, 5940477, 1159104, -8870718, +-10735271, -12714177, -12694313, -3730716, -497679, -2449742, 3126199, 9918153, 13003013, 6391448, +1512365, -696858, 283468, -2609730, -2826625, -4890894, -2901787, -3724811, -2519535, -1631551, +183073, 1611, 3009162, 5558225, 5997385, 2678986, 1183264, -1540820, -776852, -1169842, +238908, -545461, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 3988414, -6492380, 1704565, 5732708, 98784, -5909875, -4076461, -4303557, -669478, -2954401, 6932077, --5181341, -1316944, -2350958, -828392, -4154844, 3998615, -2448668, -1918777, 3365644, 5577552, -6313602, 973884, -448287, 1314260, 338229, 892816, -2851322, -3071975, 1507534, -2784750, --2786897, -3737695, -3927748, 1202054, -2599529, 3482682, -4335770, -587337, 1920924, 1825361, -1612223, -6729140, -1202591, -3730716, -643171, -1563368, -4099546, -79994, 4909685, 1496796, -2389076, 2260227, 2658585, 343061, 3333432, 2097555, 3719442, -2093797, 2486249, -1212255, -1720671, 203474, -3415036, 4013647, 4540854, -2420214, -3029563, 1345399, 4174708, 1001801, -1123671, -1385664, -261993, 2266669, 1423245, 373125, -812286, 285078, 1918777, 2330020, --268435, -3613141, -2204392, -1211718, -1529545, 849330, -333397, -321586, 1734093, -1260573, --411780, 537, 316217, -852014, -233539, 135828, -1359894, -150324, 1699733, -242129, -905701, -1213328, 718870, 366683, -69793, -795106, -10142565, -2664490, -4575214, 3356517, --9508521, 2083059, -4191888, -2215130, 1347009, 186831, 1061394, 1419487, 1069984, 4123706, --1836635, 428960, -419296, -5023501, 3698504, 6179921, -5034776, -4726612, 3586835, 919660, -4428648, 1401233, 5950141, -830002, 2003065, -3155190, -963146, 6066105, 481573, -3963181, --4888210, -5280126, 220117, 4366908, 2215130, -32212, 4969814, 3961034, 152471, -4070019, -6356552, 1620276, 4901632, 4983236, -876173, 3173981, 3751117, -458488, 2215130, 2570538, --2477123, 507880, -770410, 2442763, -5591511, -3580392, 1801202, -3461744, -1336809, 4789426, --1942399, 2630668, -1125818, -7523709, 1266479, -38118, 3950833, -6196564, -3333432, 2798708, -706522, -597000, 1596654, -2921652, 847182, 743566, -894964, -1842004, 2532420, 2302103, -1592359, 288300, -954557, 611496, -707059, -1116155, 833761, 716186, -1511292, 1089311, --845035, -642635, 1359894, -978179, -2011118, -30602, -750009, -246424, -952946, -1047435, -420907, -78383, 612570, -5369, 601295, -1482301, 430570, -431644, 6379100, 6734509, -2962991, 4981089, 3890167, 6744710, 7687455, -2860448, -825707, 2587181, -7681012, -258235, --2532957, -1466731, 3515968, -4472672, -523986, 5681705, 1049583, 3641596, -1802813, -1318555, --1915019, -7224135, -1184337, 489626, 3819300, -1163399, 6572911, 2588792, -1136556, 2626373, -1361505, 3376381, -2443837, -512175, 7675107, -1029182, 7250979, 3401614, -3183645, 759136, -6385006, 3322694, -4214437, 5819144, -1599339, 390842, 300648, -1178969, 1115081, 643171, --5266704, 3354906, 2452426, -458488, 188442, -1179505, -4758287, 0, 2670396, -550293, --563714, -3208341, -6995965, -2410014, 2600066, 5862631, -8920110, -4762582, 1664300, -3900367, -2281702, -189515, -44023, -5376226, -4075387, -2394981, -3488050, -1730872, 194884, 591632, --1252520, 2010045, 1606855, 317291, 1480690, -1644973, -606664, 26307, -2405719, -540629, -235686, -3064996, 1277216, 719944, -586800, 71404, 634045, 1446867, 162672, 187368, -23085, -1504312, -190589, -470836, 1085553, 731755, 1486059, -1079111, 9400073, 10040560, --2024540, -4172561, -4608500, 9628780, -8355322, 253940, -1381906, -3858491, -5297842, 1902671, --1471563, -7159174, -8764955, 359167, -678605, -4540854, 1633161, 2451353, -3235184, -4816269, --4539781, 6414534, -6913287, -804770, -8075076, 122407, 4467303, 1556926, 750009, -4489852, --4363687, 3983045, -3069828, -4589173, 557272, -1651415, 2810519, 86436, 1126892, -4575214, --1717450, -1269163, 4407174, 3061238, 3060701, -9087614, 1429150, 2571612, 2069637, 2600603, --2612414, -1630477, 315143, 1879048, 3595961, -594316, 2372433, -2607582, 7030325, -12740484, -4477504, 395674, -6804839, -260382, 7503308, -2241436, -3531537, -6816113, -2318746, 564788, --1910187, 24159, 3073586, 3952981, 3269007, -938450, -547608, -3996467, -827318, -1000191, --2033667, 588947, -828929, -767189, 1633161, -2006287, -946503, 1997160, -985158, 1300301, --303332, -781147, -710817, -512712, -2951716, -1813013, 1282048, 1476932, -1401770, -1102196, --954020, 1115618, -697395, -393526, -1159104, 785979, 804770, -1351304, 551903, -168041, --1256815, -271657, -711891, 836982, -417686, 1232119, 1705639, -4459787, -14147085, 2587718, --6456410, 1421097, 1170379, -810138, 10019622, 562641, -6430640, 8577587, 4116726, 2949569, --1302449, 1782411, -2624225, 6724845, -1130650, 770410, 10105521, 9884330, 4211753, 4529043, -4335233, 4922033, 3265786, -9759776, -3067681, -133681, -2586107, -8308078, -935229, -1969779, --2216203, -4464082, -107374, -1311576, 7126962, -2296734, 12512313, -78920, 1033477, -2326799, --1838783, 90194, -385473, -1009854, -2217277, -1476395, -6168647, 1487132, 979789, -742493, --3202972, 4279398, 3149285, 3707094, -1333051, -2702608, 44560, 3227131, 3480534, -2837900, --8053064, -4113505, 837519, 6673843, -954557, 5452461, -4374424, -6327561, 4681515, -2225867, --5213017, 2990908, 3110093, -5829881, -4626754, -6414534, -2158221, -2225330, 3636764, -2024003, -1082869, -436476, 2412161, 1487669, 1319092, -1235340, -719944, -3356517, -1709397, -919660, --78920, 1443646, -323196, 67646, 2725157, 1044751, -176631, -9127, 1735167, -1207423, -438624, 472446, -981400, 1029718, -876173, 662499, 506806, 743566, -548682, -2115272, -1962800, -3532611, 5196374, -6154152, -6729677, 3238942, -1927904, -563178, -3533148, -2019708, -3450469, 4904316, 2556579, -1102733, 751082, -552440, -1117765, -4620848, 1576790, -12507482, --3628711, -3958886, 3476239, 4341138, 375273, 2175938, -7794829, 2173254, 1220845, 2164127, --7024956, 13342853, -581431, 2514703, 1764695, -6244346, 1012002, -8971650, 5810554, -1877975, --7525857, 1566589, 598611, -3740917, 432718, 869731, 5983427, 10772852, 4667019, -2127620, -3497177, 4450660, -9962177, -3626563, -4552129, 2821794, 2307471, -1617055, 1604170, 3519726, -2237678, 4520990, 8391829, 236760, -3092913, -817654, -335544, 6614787, -4706748, 66035, -3053722, 8905615, 52613, -5858336, -5736466, -471373, -7050189, -922344, 2695629, 10896332, -9366787, -1052804, -4949950, 4037269, 311385, 1202591, 1025423, -342524, 1382980, -348966, --1361505, 1213865, 1569811, -1506460, 2194192, 2051384, 1981054, -545998, -1596654, 1285269, -1763084, -267362, 526134, -1340567, 217970, -281320, 2555506, 941135, 1595580, 1236951, -398895, 830002, -11274, 1003412, 2284923, 479963, 938450, 1631014, 2222109, -1065689, --558346, 530428, 660888, 1673427, 2609730, -13028783, -3544422, -4843113, 5573794, 159988, --2673617, -16741783, -2201708, -2273648, 6928319, 16506633, -4760971, 11076184, 1915555, -9822590, --9991168, 1698123, 2543695, -5726265, 6269042, -4534412, 5052492, -6263673, 3015604, 2108292, --5914170, -5018133, -3797288, 1928440, 6476274, -8477192, 316754, -8911520, -493384, -3412352, -2165737, 6441914, 682900, -2839510, -2478733, 6976101, -19864, 10653130, 3284576, -4065724, --3876745, -3130494, 1531693, 6672232, -137439, 11083163, -19796042, -14634027, -11813308, -2767570, --10075993, 620086, -3792456, 3550864, 8992051, 1581085, 3722126, 5732708, 9518184, 4860829, -1457068, -6598144, -16386911, -17302812, 9268539, 593779, 11765526, -8413841, -6032282, 5122822, --12129525, 208306, -4332549, -489626, -7822746, 276489, 2610266, 7036230, 1277753, 1112933, --2255395, 2517388, -516470, 812823, 1974074, 3170760, 4120484, -1146756, -1730335, 2972117, -1519345, -1169842, -2172717, 430034, -362388, -288837, -920197, 439160, 31675, -1203665, --401043, 1207960, 2228551, 1765232, 1531156, 777389, -5024038, -2786360, -1921461, -1806034, -2699387, -437550, -832150, 5369, 769873, 181999, 7848516, 3428995, -6251862, -170725, -14944876, 12669617, -1170916, -10951093, -18478024, -2108292, -6486475, 6609955, -5537287, -5450851, --20925080, -8978629, -18742164, 6917582, -612570, -4567161, 4995047, -656056, 115427, 1358283, --6014565, 532039, -6908992, -1226750, 4201552, 3125663, -7046968, 2541547, 7199439, 11715597, --1768990, -1636919, -3892851, 668404, 6086506, 8637179, -1234266, 1279363, -1855963, -1492501, -10293426, 7490423, 308701, 7726110, 2244121, -9458592, 1794760, -947040, 12251931, 4791573, -1551557, 5915244, 7953206, 2194192, -6978785, -11961484, -2752537, 2505040, 6431714, 3287798, -411780, 2516314, 9506373, 2101313, 3099893, 4383551, 2566780, -6092948, -6886443, -5984500, --6802155, -6228240, 10568304, 1497870, 8164733, -7156490, -6313065, -1206349, 6826314, -4254165, -3642669, 2096481, 1098438, -3611531, -2289218, -3336116, -2278480, -3803731, 1531693, 1241782, --1031329, 2517925, -1641751, 1191853, -656056, 285615, 1155883, -3365644, -2086817, -3377455, --2182917, -4116726, -1175747, -3411815, -1628330, -1973538, -2594697, -160524, 3002719, 987306, -1258425, -1062468, -281320, -364535, -702764, 2341294, -1093069, 26212186, 5743982, -8078297, -4683662, -4700305, -15537044, -3135326, -15240691, -8339753, 7893613, 10533944, 4070019, 2194728, -897648, 1982664, 9982041, -7036230, 14120242, -9069360, -9274445, 11325292, 5015985, -18104360, -7965554, 4721780, 5779416, 12070469, 5927055, 9007620, -588411, 4937065, -2828773, 7715909, -2016487, 1747515, 5095979, -10120017, -5516349, -3011846, 6586869, 2991445, 2378338, 5361730, -1544578, 1998234, -9233643, 244276, 10050223, -1643899, 1266479, 1425929, 1326608, 12150999, -4655745, 16293495, 3761855, -2127083, 15372225, -13016435, -1670205, -1909113, -5217312, -1023276, -3262565, 15380278, 1511292, -3037616, -5850283, 3332895, -6153078, -2461553, -3938485, -8122320, --1275605, 2427194, 13060996, -876710, -12495670, -3271155, -7474854, -3572876, 9142912, 7534983, -8570070, -6555194, 1472637, -7314866, -1068373, -2335925, -4468914, -2320356, -6153615, -3403225, --1093069, -2435247, -8096550, -3002719, -2266669, -1433445, -1769527, -2635499, 445603, -1144609, --6347962, -95563, -3009162, -1618666, -448824, 161598, 1229971, 27917, 2985539, 3073049, -591095, 747861, -1963337, -1564442, -378494, -1937030, 3062312, 2004139, 2884071, 2875481, -1239635, 3932580, 2553358, 1176821, 1828046, -248571, -1392643, 2864206, 3848828, -9395778, --14583025, -5211943, -14358613, 10322954, -12256763, -8952859, -7234336, 6539625, 16345572, -16584479, --5939403, -18695456, 5328444, 2654827, 1719061, -5342403, 1423782, 21133386, -11076184, -1813013, -7948374, 5495948, 4138738, 7460895, 4902169, -6898255, -11764452, -2150168, -6534256, -8809515, --10865194, 213675, -2566780, 2705830, 13897977, 8865886, -7870528, -4189741, -918049, -4003983, -3370476, 26549340, -9041443, 18532248, 5749351, 3148211, -1255741, -2957622, 3083787, -10114111, -4815195, 14433238, 564251, 2338610, 11474542, 7515119, 4412542, -9673340, 8078297, -5752572, --8699456, -23373748, -7414188, 15250355, -8695161, 3981972, -16524350, 11831561, -6249715, -6454799, -10257456, -16390669, -12190728, 18650896, -13309030, -12453795, 7425999, -8531416, 1692217, 67646, -5289789, -13438416, 4203163, 390842, 13405130, -9965935, 3304441, -1382980, -7634305, 10000294, -1989644, -8256538, -6041409, -5677410, 851477, 14496, -4199941, 147103, 5176510, -400506, -3663070, 4179540, 3269544, -7432978, 4132832, 3837553, 5978058, -118112, 427349, -5397700, --2183454, -2640868, -2828773, 1286343, -637803, 3505767, -4949950, -3085397, 1853815, -4749697, --4037269, 1730335, -10584947, -7891466, -1073742, 12032351, -5703180, 21150566, 19701014, 3858491, -6306086, -11460583, 1410897, -9285719, 14783277, -2986076, 4347581, -7093139, -4585415, 2487323, -1979443, -6817187, 11318313, -3242164, 2382633, 4191888, -7452842, 2771328, -9505299, -1611, -5359583, 6412923, 117038, 8490077, 10736881, -856309, -20221242, -3448859, -6015639, 14391899, --12239046, -15204721, -10855530, -7290707, 2050847, -8644159, -6796786, -4381941, -1298154, 2595771, --29641180, 18615462, 14501957, 21230560, -6832756, 3351685, 14206141, -13712220, -12707734, 2430952, -9255118, 6053757, -1676648, 2800856, -7547332, -8982924, -11445551, -3420405, 39268884, 3080565, --21886616, -3987877, -12029667, 7415798, 5798206, -13611825, 2812667, -4245039, 1030255, -6770479, -8329552, 8480413, -1369558, -4460324, -5254893, -17241610, 5070746, 2653216, -785442, 6964290, --3515968, 1015223, 2648921, -8248485, 3015067, 4734128, 11126113, 5842766, 597537, -9790378, --34897, 8676371, 409633, -142808, 6484864, -9127, 2141578, 6347962, 5394479, -1161789, -2900177, 5340255, 4966056, -2592550, 2105071, 6434398, 7976828, 5807333, -304943, -4435091, --1100049, 537, 4939213, -206695, -1591822, 143345, 1720671, -3383897, 1728188, 2939368, --3244848, 1798518, -5686537, -11259794, -21733072, 1755568, -18155900, 8551280, 2927557, -14614163, -8242579, 9483288, 13219909, 3823058, 5224291, -15167140, -310311, -3025268, 14119168, 6571837, -616328, 13206488, 14709189, -1773822, -7057168, 1680406, 18139794, -11819213, -9372156, 9350144, -5097053, -12023224, -2682744, -11125576, 20745228, -17720498, 4901095, 11036992, -6703907, 10143639, -3630858, -5069135, -5412196, -5455682, -8485245, 11613055, 15625628, 3116536, -12050068, 1236414, --13306882, -5068062, 8588324, -1655173, -6639483, -4855998, 2159832, -17663590, 471910, -1868311, --10242423, 13763223, -13642964, -935766, -3205119, -10062035, 10558103, -863288, 6069326, -5128728, --1139777, -625455, -6528887, 4931696, -6025839, -1122060, -5936719, 15915538, 6743636, -18949932, --4268124, -31210454, 17885318, -73551, -14181982, 12584254, 1234803, 1846836, 4480188, 204011, -7091528, 8813810, 1853278, -2310156, 4721780, 9480067, -5577015, -3365107, 3702799, 1358283, -2184528, 2782065, 4658966, 6457484, -4387846, 3365644, 1881196, -5126044, -4848481, 4099010, -686658, -537408, -3593814, -3112778, -5760625, 5526549, 5531918, 958315, -3911105, -11769821, -71941, 1058710, 3649649, -7559680, 647466, 5975374, -3461207, 6914361, 2936684, -456877, -1729261, 3760781, 137976, 1367410, 1891396, 4622459, 19021336, 716723, -14482630, -6225555, -8553964, 13855028, 14849313, 533650, -3494493, 20877836, 9081171, 23204634, 2818572, 1967632, --11189464, -4602058, -6641093, 6190122, 3344169, 12549894, -14399952, 971736, -8579197, 7697655, --12486007, 4735202, 13787382, -2080912, -440771, -7218230, 1931662, -7265474, -24820616, 3401077, --3839701, 1719061, -11104638, -2440615, 9651328, 18714784, -1973001, -6805913, 10865730, 5115306, -2626373, 12880070, 4458713, -6889665, -3318936, 8312373, -1173063, 7586523, -9090298, -8088497, -2779918, -7601555, -14565308, -6731288, -16585016, -3707094, 5565741, -13023415, -1883343, -14956687, --6550362, -114890, 5870684, -17822504, 7785702, 1315871, -10605885, 13269838, -4737349, 3510599, -23527294, 26637388, 1709934, 9364639, 19481972, 23296440, 23125178, -2283849, -15418396, -23638964, --8591545, -15673409, 14799384, -3190087, -6978785, 3784403, -379568, 1612223, -276489, -7008313, -7522099, 2120640, 2825015, 542240, 10170483, -5690832, -99321, -3125663, 7061463, -6548215, --2773475, -697932, 10049687, -2619393, 6078990, 8274255, -7577396, -1629940, -3187940, -8603893, --3451006, -1974611, 3741990, 294205, 11780022, 3187403, 7985955, -756451, -7530689, 2114735, -234613, 31835908, 36827196, 1775432, 11893301, 11099806, -1406602, -26541288, -559956, -1209033, --9872519, 7294465, 7040525, -14515379, 7963943, 9909026, 1797444, -3973382, 5599027, -3817152, -18817326, -3355980, -8617852, -26844, 4370666, -1907502, -1110249, -482647, -29667486, 8454106, --560493, -20723218, -8417599, 3415573, -1821066, -14166950, 4984310, -16693464, -1385127, 1486059, --26452704, -4892505, 11509439, -8666170, 1348083, 16618302, 10379325, 12681428, 4099546, -7354595, --12298102, 12621835, -6475737, 7013145, -11679090, -6289443, 8575976, 14194867, 2210298, 17030620, --11392401, 14717242, -12452721, -15259482, -10695542, 14669461, 15602006, -14433774, 7521562, -39634496, --3492882, 11489574, 3790846, -6323266, -15627775, 7129646, -22135724, 3469797, -11353209, 10432476, --17064978, -11087458, 17361868, 270046, 8792335, 1841467, 7682623, -3994857, 3253438, -2069101, --12745852, -2447058, -5869610, 3894462, -4013110, 2175401, 657667, 2029372, 1182190, -2951180, --3765613, 432718, -8002598, 2797098, 2471754, 4571456, -5066451, 4539781, 4490389, 2742874, -3888019, 2630668, -5444408, 484258, 2897492, -4253628, 7671886, -785979, -2729452, -4396973, -139586, 560493, 3751654, -2838437, 3570729, -2745558, 8074002, 3358128, -6456410, -1838246, --1460289, -3241090, -2604361, -28981902, 2132988, 35885524, -24260660, -2269890, -2106682, 1917166, --9600863, 4592394, -15306190, -15658914, -5173825, -4269735, 3784403, -3932043, 8159901, -11735998, -383863, 23087596, -18918794, -16681653, -4053912, 20204600, 2815351, -25275346, 10757819, -9372156, --10824391, 2523830, 34748432, -19543174, -10910828, 24753508, 18315888, 1604707, -10244034, 689879, --3817152, -7847442, 7067906, 6473590, -4226248, -20040318, 25672630, 12074764, 4846871, -27285390, --4194036, 8490613, 9430138, -3384971, 14338748, -2306934, 4866198, -6248641, -16457241, 10724533, --11747272, 7047505, 3635153, -14399415, 27199492, 4195110, 19583978, 19659676, 3491809, -29554744, --5684926, 288300, -11753178, -5947993, 1108638, -936303, 12831752, 24142548, -6982543, -2355253, --10657424, -4752382, 10023380, -6764037, 5823439, 17950816, -15693810, 17842368, -3507378, 5365488, --6784975, -3634079, -5695664, 774705, 3330210, 3940096, -2985002, 99858, 4071629, 2321430, -9430674, 4427038, -4759361, 405874, 860604, 8603893, -4766340, 2504503, 3974992, 1342714, --335007, 304943, -11218991, 5514738, -4129074, 5399311, 7040525, 946503, -1136556, 3581466, --367220, 2741800, 933082, -1167694, -4142496, -4214437, 8367133, 1431298, -1955821, 2349347, --5204964, -979253, 8530879, 11190537, 1545115, -10300405, -51554640, 3386582, -13435195, 1777580, -25844966, 2466385, -4955856, 4704600, 1023813, -17515414, -18874770, -17029546, -16316581, 21271362, --4229469, 25389162, 2286533, -23987392, -809601, 2645163, 20584168, 4045859, -3285650, -4085588, -5906117, -12917114, -4911832, 22726282, -4596152, -29515016, -22505092, 13471165, -2891050, -6135361, -6824703, -2118493, -15163919, 4584341, 8973797, 20463372, -4079682, -16988206, 277562, -21425982, -8289824, 24255290, -3835943, -29769492, 9419937, -340913, 1723893, 7175817, -9327058, 18321794, -1425929, -12359842, 9663676, -6691559, -4084514, 26181046, -13357885, -4502200, -4348655, 16496433, -6682969, -28956132, 14746770, -23333484, -5513128, -12588012, 3065533, -7675644, -7020124, -2405719, -13356275, -4318053, -8138963, 15744813, -9119826, 16163573, -26844, -8528194, -5077725, 4028679, -4507568, 3212099, -9651328, -3202435, 2448668, -530965, -6291054, 156229, 6056978, 9240085, -3908420, 4763119, 818728, 9086540, -5066988, 2966749, 7237557, -2699924, 968515, 2950106, --1723893, 1459752, 2910377, -8853001, 7575786, 3232500, -8866960, -7290707, 591632, -10475425, -988916, -7706245, 10108742, -18097918, 34897, -3788698, 1985886, -4667019, 5738613, -2962991, -2713883, 2098629, -25188372, 5157182, 41580116, 27087822, 12387223, -20632486, 15458124, 19551228, -28922846, 13972602, 3415573, 1029182, 18118856, 31284004, -7062537, -3808562, 17712446, -35019016, -12742631, 31251256, -6481643, -10817949, 8108899, 24267638, 19538344, -13056701, -22383222, -1307281, -11257109, -3782793, 2711198, 372052, 26249766, -14976551, 16816408, 25409564, -10163503, -3053722, -17927730, -2667175, 62862216, -26339424, 11319923, 43051140, -24775518, 8147016, 2881923, -34854196, --1079647, 6544994, -15380278, 34155728, 2585570, -4648229, 2658585, -14150843, 46786152, 12947716, --37491308, 36229660, -15117211, 1394791, 11108396, 13494250, 24017994, 11767137, -6479495, -23376970, --31523986, -11770895, -12631499, -2097018, -9667971, 19896972, -12048457, -20826834, 2350421, 5852967, -4268661, 7694434, -11818139, -11446625, -6984691, -7539815, -24842090, -10415296, -8446590, -17077326, --8235600, 6241661, -7283191, -16002511, -750546, 6360847, 10835666, -2442763, 5110474, 11885248, --653372, -7885023, -471373, -4735739, 6582038, 9511205, -13146895, 11711302, -6797860, 270583, -1768453, -5983963, 12205223, 4834523, -17074106, 10669773, 1628866, -5933498, 12664785, -14224932, -5799817, -2534568, 6208912, -3267396, -3962644, 2566243, -2315524, -1284195, 4482335, -2418604, --9765145, 4739497, -873489, 3188476, -390842, 8412230, 10298258, -48389248, 28187870, 1261110, -17042968, 28054190, -46380816, 10584410, 23885386, 5386963, 17825188, -17889076, 19622094, 5695664, --18176302, 244276, -11451993, -33996276, 18654654, 10555419, 31073552, -17213156, -22744536, -7987029, -7298760, -4764730, -38502236, -19044422, 11853573, -2913062, 5776194, -16298327, -5024575, 12771085, --10843719, -5466957, -16427713, -3898220, 6006512, -18269180, 1939178, -39844412, -32726040, 10066330, --34041912, 2907693, -35615480, -25041270, -17169668, 16702591, 33290292, 40888088, -9666898, 18131204, -22231824, 10678899, 9657771, -15968688, 45629196, 46405512, -31554050, 31601832, -24815784, 15860240, -32753420, 30988726, 37948720, 45122928, 32112396, -36063768, -25489020, -355409, 960999, 13517336, --8501351, -7004555, -21487722, -12038256, -31907312, 6937983, 26929444, -10935524, 6662031, 27944130, -13294534, -19289772, 21626770, -1416802, 7706245, -2197950, -3712462, 6127308, -6680822, 9443559, -8151311, -7242389, -8548596, 8136816, -5790153, 197569, 367757, -771484, 2463164, 720481, --11411728, 10636487, -4774393, 5035313, 6286759, -4377109, 6764037, -8330089, -5909875, 5357972, --6478422, -8601746, -3627637, 3279208, -3199751, 1999844, -7555921, 164283, 2966212, 6969658, -10746008, -2629057, 6117107, -7133941, 148176, -1418950, 3359738, 2330557, -486405, -5550172, -59872916, -43826384, -22296248, 23605678, -14051522, 22549116, -17580374, -19614578, 6621766, -46351824, --2098092, 31156766, -7524246, 16010564, -26585848, -6540699, -10499048, 1049583, 33238216, 10045929, -7384123, -5940477, 18242874, 5862631, 45413372, 11164767, 26511222, 1879585, -20739324, -19616190, -26422638, -12861280, 12215424, -265751, -34114924, 24581172, -30397094, 59008020, -44004088, 26845156, -24035174, -25272662, -21241834, -15696495, 21785148, -1678795, 22798224, -302795, 2962454, -40373228, --21701932, 9373229, -19852412, 6549825, -12113418, 11834782, 6714645, 30974768, -18438832, -6366216, --7875897, -15217606, 42003168, 7755101, 3933653, -39165808, -12701292, 21024938, 12400644, 13380434, -36375152, 23267448, 32162326, 37119256, -1112397, 16420197, -15480673, 49381388, 3688840, -8191577, -17975512, -4257387, 37888592, 651224, -7670275, -7871065, 4508105, 26625040, -20262582, 13734232, --6476274, -2233383, 7872138, 5255966, 10337986, -6568079, 6713571, 12396886, -3315178, -4792110, -8381092, -1432909, -1372779, -1013075, 2212982, 1310502, 4000225, -9122511, 11803107, -7066832, --3934727, -1996623, 7187091, -10326712, 964220, -7418483, 9844065, 17871896, -6090801, -5068599, --2471754, 12234751, 5980205, 12779675, -1127966, -7602092, 5797669, 6072547, -1946157, 6009733, -4682588, -17632988, 2605972, 19901804, -2794950, -90372552, 62827856, -38934952, -27227946, 699006, -12917114, 16255377, 2952790, -14426258, 48926656, 24847996, 6867116, -24415816, 16079821, -767189, -18277234, -23302882, -16105590, 12582644, 36602784, -41836740, 1767916, 13668197, 4512400, -10227928, --6140730, -5187784, 1744831, -2033130, 9529459, 46183248, 3036005, -20723754, 31061740, -7129109, --29888678, -38544648, 36886252, 12153147, -5039071, 13828184, 8587250, 30749282, -41489920, -4281009, --21061982, -5879810, 23841900, -17388176, 9341017, -20066624, 9831717, 63661616, 4889284, -36219996, --40731324, -2376728, 19520626, 19225884, -16280610, 4101694, 30993558, -12826920, -59771988, 34280820, --20561082, -33881924, 15017353, 56917980, -39143260, 28763396, 39644160, 13812615, -34206192, -28436442, --17549236, 14451491, 12444131, -11654931, 35587564, 17534204, -2160369, -812286, 2202781, -29438780, --11257109, -20764020, 10873783, 9816685, 7120519, 9924596, 7341710, 22114250, -10866804, -5063230, -4250407, 368830, -16818018, 14876156, -587337, 9452686, -4166655, 7215545, -10816875, -2981244, --6506876, 10641855, 1994476, 2501282, 331249, 6592238, 16075526, -5916855, -30582314, 2959769, --15087683, -2482491, 9171903, -12463458, -8405788, 17911624, -16258062, -3084324, 141197, 8915815, --17415018, 1831267, 52217140, 16742319, 3774740, -4136591, 8558259, 14265734, -4318053, 6478422, --7524783, -405874, -5877663, 24035174, -27014270, -3403225, 16677895, -38312720, 12621298, -9599789, -3190624, -4776541, -10304163, 6460705, -2610266, -15797963, 41941428, -32089848, -8613557, 29220810, --18617610, -3223373, -5653251, 6176700, 29553134, 1951526, -28200756, 38769596, -20803210, 13608604, -24676198, 10533944, -8785356, 1839857, -21163452, 4932233, -12695923, -10545755, 52665964, -12481712, --20564304, 6506339, -9440875, 12120398, -7831873, 13339632, 33995204, -18838800, 11457362, 25425132, --29952028, 13549548, 16768626, 7220914, 20911122, -23798950, -5885716, 35683664, -24538222, -5787469, -10581726, -10384694, 34644816, -34427384, 6103686, 11985106, -15458661, 11649562, 13430363, -32801738, -11870216, 27377196, 5906, -8646306, -1000727, 17497160, -3374234, -30822832, 25107306, 11441256, --13094282, 4761508, -7076496, 10678899, -3979824, -13975287, 16386911, 571768, -3183108, -12192338, -11485279, 1798518, -15500000, 5331128, 10922102, -2513630, -4854924, 1993402, 10124312, -1772748, --9852655, 10084583, 7139847, 950262, -184684, 8380555, 2008434, 2733210, -11763915, 15057082, --8130373, 16080894, -29304024, -78957072, -124177704, 11333882, 118946968, 9832254, 269277792, 278022368, -138430016, 291076928, 194143264, -40121436, -4071092, -63851668, -233445968, -204847936, -126589328, -238421152, --186597536, -54069880, -116843512, -97733592, 34941168, 58971512, -28166396, 15653545, 52679384, -40058088, --23347442, 74197168, 65900904, 7896834, 73643120, 125495184, 42152956, 90908352, 171538304, 82629800, -43786116, 153811904, 128603672, 17562658, 92493728, 180210928, 36024576, 42825120, 145635360, 63077500, --15236396, 103179608, 97373352, -8501888, 86041080, 110995376, -1336809, -80329312, -37193344, -189463888, --313381760, -278604320, -297155904, -454059648, -407854400, -381576160, -464255904, -451000032, -369962048, -333497760, --300032992, -173482848, -66462472, 59311888, 125695976, 240323280, 358060160, 390899456, 435348608, 567958976, -560492160, 441139328, 482507904, 426700704, 176867824, 192731824, 163821856, -6374805, -26262114, 47860968, --6117107, -72679440, 9965935, 49776524, -47006808, -18303540, 44027708, -22453552, -92481384, -30144228, --24634858, -134018552, -94858112, -25123412, -105031816, -118967912, -7724499, -41801844, -120361088, -57508000, --54153096, -169387072, -160614064, -145444240, -262729584, -284023488, -236774560, -252527440, -272568832, -195046816, --166292000, -144168096, -104231880, -55759948, -24739012, -6111739, 22801444, 94352376, 128515624, 197865392, -322125216, 364261536, 402918944, 470593120, 459937312, 405423968, 345721792, 243185344, 106091064, 28623810, --21842056, -74117712, -87450368, -85623392, -86521040, -88280904, -81964080, -73420320, -79135312, -80620832, --75550088, -80783504, -88265872, -82670608, -77054400, -70557184, -50822348, -23611582, -5479842, 1469416, -2094870, 474057, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +6492380, 1704565, 5732708, 98784, -5909875, -4076461, -4303557, -669478, -2954401, 6932077, +-5181341, -1316944, -2350958, -828392, -4154844, 3998615, -2448668, -1918777, 3365644, 5577552, +6313602, 973884, -448287, 1314260, 338229, 892816, -2851322, -3071975, 1507534, -2784750, +-2786897, -3737695, -3927748, 1202054, -2599529, 3482682, -4335770, -587337, 1920924, 1825361, +1612223, -6729140, -1202591, -3730716, -643171, -1563368, -4099546, -79994, 4909685, 1496796, +2389076, 2260227, 2658585, 343061, 3333432, 2097555, 3719442, -2093797, 2486249, -1212255, +1720671, 203474, -3415036, 4013647, 4540854, -2420214, -3029563, 1345399, 4174708, 1001801, +1123671, -1385664, -261993, 2266669, 1423245, 373125, -812286, 285078, 1918777, 2330020, +-268435, -3613141, -2204392, -1211718, -1529545, 849330, -333397, -321586, 1734093, -1260573, +-411780, 537, 316217, -852014, -233539, 135828, -1359894, -150324, 1699733, -242129, +905701, -1213328, 718870, 366683, -69793, -795106, -10142565, -2664490, -4575214, 3356517, +-9508521, 2083059, -4191888, -2215130, 1347009, 186831, 1061394, 1419487, 1069984, 4123706, +-1836635, 428960, -419296, -5023501, 3698504, 6179921, -5034776, -4726612, 3586835, 919660, +4428648, 1401233, 5950141, -830002, 2003065, -3155190, -963146, 6066105, 481573, -3963181, +-4888210, -5280126, 220117, 4366908, 2215130, -32212, 4969814, 3961034, 152471, -4070019, +6356552, 1620276, 4901632, 4983236, -876173, 3173981, 3751117, -458488, 2215130, 2570538, +-2477123, 507880, -770410, 2442763, -5591511, -3580392, 1801202, -3461744, -1336809, 4789426, +-1942399, 2630668, -1125818, -7523709, 1266479, -38118, 3950833, -6196564, -3333432, 2798708, +706522, -597000, 1596654, -2921652, 847182, 743566, -894964, -1842004, 2532420, 2302103, +1592359, 288300, -954557, 611496, -707059, -1116155, 833761, 716186, -1511292, 1089311, +-845035, -642635, 1359894, -978179, -2011118, -30602, -750009, -246424, -952946, -1047435, +420907, -78383, 612570, -5369, 601295, -1482301, 430570, -431644, 6379100, 6734509, +2962991, 4981089, 3890167, 6744710, 7687455, -2860448, -825707, 2587181, -7681012, -258235, +-2532957, -1466731, 3515968, -4472672, -523986, 5681705, 1049583, 3641596, -1802813, -1318555, +-1915019, -7224135, -1184337, 489626, 3819300, -1163399, 6572911, 2588792, -1136556, 2626373, +1361505, 3376381, -2443837, -512175, 7675107, -1029182, 7250979, 3401614, -3183645, 759136, +6385006, 3322694, -4214437, 5819144, -1599339, 390842, 300648, -1178969, 1115081, 643171, +-5266704, 3354906, 2452426, -458488, 188442, -1179505, -4758287, 0, 2670396, -550293, +-563714, -3208341, -6995965, -2410014, 2600066, 5862631, -8920110, -4762582, 1664300, -3900367, +2281702, -189515, -44023, -5376226, -4075387, -2394981, -3488050, -1730872, 194884, 591632, +-1252520, 2010045, 1606855, 317291, 1480690, -1644973, -606664, 26307, -2405719, -540629, +235686, -3064996, 1277216, 719944, -586800, 71404, 634045, 1446867, 162672, 187368, +23085, -1504312, -190589, -470836, 1085553, 731755, 1486059, -1079111, 9400073, 10040560, +-2024540, -4172561, -4608500, 9628780, -8355322, 253940, -1381906, -3858491, -5297842, 1902671, +-1471563, -7159174, -8764955, 359167, -678605, -4540854, 1633161, 2451353, -3235184, -4816269, +-4539781, 6414534, -6913287, -804770, -8075076, 122407, 4467303, 1556926, 750009, -4489852, +-4363687, 3983045, -3069828, -4589173, 557272, -1651415, 2810519, 86436, 1126892, -4575214, +-1717450, -1269163, 4407174, 3061238, 3060701, -9087614, 1429150, 2571612, 2069637, 2600603, +-2612414, -1630477, 315143, 1879048, 3595961, -594316, 2372433, -2607582, 7030325, -12740484, +4477504, 395674, -6804839, -260382, 7503308, -2241436, -3531537, -6816113, -2318746, 564788, +-1910187, 24159, 3073586, 3952981, 3269007, -938450, -547608, -3996467, -827318, -1000191, +-2033667, 588947, -828929, -767189, 1633161, -2006287, -946503, 1997160, -985158, 1300301, +-303332, -781147, -710817, -512712, -2951716, -1813013, 1282048, 1476932, -1401770, -1102196, +-954020, 1115618, -697395, -393526, -1159104, 785979, 804770, -1351304, 551903, -168041, +-1256815, -271657, -711891, 836982, -417686, 1232119, 1705639, -4459787, -14147085, 2587718, +-6456410, 1421097, 1170379, -810138, 10019622, 562641, -6430640, 8577587, 4116726, 2949569, +-1302449, 1782411, -2624225, 6724845, -1130650, 770410, 10105521, 9884330, 4211753, 4529043, +4335233, 4922033, 3265786, -9759776, -3067681, -133681, -2586107, -8308078, -935229, -1969779, +-2216203, -4464082, -107374, -1311576, 7126962, -2296734, 12512313, -78920, 1033477, -2326799, +-1838783, 90194, -385473, -1009854, -2217277, -1476395, -6168647, 1487132, 979789, -742493, +-3202972, 4279398, 3149285, 3707094, -1333051, -2702608, 44560, 3227131, 3480534, -2837900, +-8053064, -4113505, 837519, 6673843, -954557, 5452461, -4374424, -6327561, 4681515, -2225867, +-5213017, 2990908, 3110093, -5829881, -4626754, -6414534, -2158221, -2225330, 3636764, -2024003, +1082869, -436476, 2412161, 1487669, 1319092, -1235340, -719944, -3356517, -1709397, -919660, +-78920, 1443646, -323196, 67646, 2725157, 1044751, -176631, -9127, 1735167, -1207423, +438624, 472446, -981400, 1029718, -876173, 662499, 506806, 743566, -548682, -2115272, +1962800, -3532611, 5196374, -6154152, -6729677, 3238942, -1927904, -563178, -3533148, -2019708, +3450469, 4904316, 2556579, -1102733, 751082, -552440, -1117765, -4620848, 1576790, -12507482, +-3628711, -3958886, 3476239, 4341138, 375273, 2175938, -7794829, 2173254, 1220845, 2164127, +-7024956, 13342853, -581431, 2514703, 1764695, -6244346, 1012002, -8971650, 5810554, -1877975, +-7525857, 1566589, 598611, -3740917, 432718, 869731, 5983427, 10772852, 4667019, -2127620, +3497177, 4450660, -9962177, -3626563, -4552129, 2821794, 2307471, -1617055, 1604170, 3519726, +2237678, 4520990, 8391829, 236760, -3092913, -817654, -335544, 6614787, -4706748, 66035, +3053722, 8905615, 52613, -5858336, -5736466, -471373, -7050189, -922344, 2695629, 10896332, +9366787, -1052804, -4949950, 4037269, 311385, 1202591, 1025423, -342524, 1382980, -348966, +-1361505, 1213865, 1569811, -1506460, 2194192, 2051384, 1981054, -545998, -1596654, 1285269, +1763084, -267362, 526134, -1340567, 217970, -281320, 2555506, 941135, 1595580, 1236951, +398895, 830002, -11274, 1003412, 2284923, 479963, 938450, 1631014, 2222109, -1065689, +-558346, 530428, 660888, 1673427, 2609730, -13028783, -3544422, -4843113, 5573794, 159988, +-2673617, -16741783, -2201708, -2273648, 6928319, 16506633, -4760971, 11076184, 1915555, -9822590, +-9991168, 1698123, 2543695, -5726265, 6269042, -4534412, 5052492, -6263673, 3015604, 2108292, +-5914170, -5018133, -3797288, 1928440, 6476274, -8477192, 316754, -8911520, -493384, -3412352, +2165737, 6441914, 682900, -2839510, -2478733, 6976101, -19864, 10653130, 3284576, -4065724, +-3876745, -3130494, 1531693, 6672232, -137439, 11083163, -19796042, -14634027, -11813308, -2767570, +-10075993, 620086, -3792456, 3550864, 8992051, 1581085, 3722126, 5732708, 9518184, 4860829, +1457068, -6598144, -16386911, -17302812, 9268539, 593779, 11765526, -8413841, -6032282, 5122822, +-12129525, 208306, -4332549, -489626, -7822746, 276489, 2610266, 7036230, 1277753, 1112933, +-2255395, 2517388, -516470, 812823, 1974074, 3170760, 4120484, -1146756, -1730335, 2972117, +1519345, -1169842, -2172717, 430034, -362388, -288837, -920197, 439160, 31675, -1203665, +-401043, 1207960, 2228551, 1765232, 1531156, 777389, -5024038, -2786360, -1921461, -1806034, +2699387, -437550, -832150, 5369, 769873, 181999, 7848516, 3428995, -6251862, -170725, +14944876, 12669617, -1170916, -10951093, -18478024, -2108292, -6486475, 6609955, -5537287, -5450851, +-20925080, -8978629, -18742164, 6917582, -612570, -4567161, 4995047, -656056, 115427, 1358283, +-6014565, 532039, -6908992, -1226750, 4201552, 3125663, -7046968, 2541547, 7199439, 11715597, +-1768990, -1636919, -3892851, 668404, 6086506, 8637179, -1234266, 1279363, -1855963, -1492501, +10293426, 7490423, 308701, 7726110, 2244121, -9458592, 1794760, -947040, 12251931, 4791573, +1551557, 5915244, 7953206, 2194192, -6978785, -11961484, -2752537, 2505040, 6431714, 3287798, +411780, 2516314, 9506373, 2101313, 3099893, 4383551, 2566780, -6092948, -6886443, -5984500, +-6802155, -6228240, 10568304, 1497870, 8164733, -7156490, -6313065, -1206349, 6826314, -4254165, +3642669, 2096481, 1098438, -3611531, -2289218, -3336116, -2278480, -3803731, 1531693, 1241782, +-1031329, 2517925, -1641751, 1191853, -656056, 285615, 1155883, -3365644, -2086817, -3377455, +-2182917, -4116726, -1175747, -3411815, -1628330, -1973538, -2594697, -160524, 3002719, 987306, +1258425, -1062468, -281320, -364535, -702764, 2341294, -1093069, 26212186, 5743982, -8078297, +4683662, -4700305, -15537044, -3135326, -15240691, -8339753, 7893613, 10533944, 4070019, 2194728, +897648, 1982664, 9982041, -7036230, 14120242, -9069360, -9274445, 11325292, 5015985, -18104360, +7965554, 4721780, 5779416, 12070469, 5927055, 9007620, -588411, 4937065, -2828773, 7715909, +2016487, 1747515, 5095979, -10120017, -5516349, -3011846, 6586869, 2991445, 2378338, 5361730, +1544578, 1998234, -9233643, 244276, 10050223, -1643899, 1266479, 1425929, 1326608, 12150999, +4655745, 16293495, 3761855, -2127083, 15372225, -13016435, -1670205, -1909113, -5217312, -1023276, +3262565, 15380278, 1511292, -3037616, -5850283, 3332895, -6153078, -2461553, -3938485, -8122320, +-1275605, 2427194, 13060996, -876710, -12495670, -3271155, -7474854, -3572876, 9142912, 7534983, +8570070, -6555194, 1472637, -7314866, -1068373, -2335925, -4468914, -2320356, -6153615, -3403225, +-1093069, -2435247, -8096550, -3002719, -2266669, -1433445, -1769527, -2635499, 445603, -1144609, +-6347962, -95563, -3009162, -1618666, -448824, 161598, 1229971, 27917, 2985539, 3073049, +591095, 747861, -1963337, -1564442, -378494, -1937030, 3062312, 2004139, 2884071, 2875481, +1239635, 3932580, 2553358, 1176821, 1828046, -248571, -1392643, 2864206, 3848828, -9395778, +-14583025, -5211943, -14358613, 10322954, -12256763, -8952859, -7234336, 6539625, 16345572, -16584479, +-5939403, -18695456, 5328444, 2654827, 1719061, -5342403, 1423782, 21133386, -11076184, -1813013, +7948374, 5495948, 4138738, 7460895, 4902169, -6898255, -11764452, -2150168, -6534256, -8809515, +-10865194, 213675, -2566780, 2705830, 13897977, 8865886, -7870528, -4189741, -918049, -4003983, +3370476, 26549340, -9041443, 18532248, 5749351, 3148211, -1255741, -2957622, 3083787, -10114111, +4815195, 14433238, 564251, 2338610, 11474542, 7515119, 4412542, -9673340, 8078297, -5752572, +-8699456, -23373748, -7414188, 15250355, -8695161, 3981972, -16524350, 11831561, -6249715, -6454799, +10257456, -16390669, -12190728, 18650896, -13309030, -12453795, 7425999, -8531416, 1692217, 67646, +5289789, -13438416, 4203163, 390842, 13405130, -9965935, 3304441, -1382980, -7634305, 10000294, +1989644, -8256538, -6041409, -5677410, 851477, 14496, -4199941, 147103, 5176510, -400506, +3663070, 4179540, 3269544, -7432978, 4132832, 3837553, 5978058, -118112, 427349, -5397700, +-2183454, -2640868, -2828773, 1286343, -637803, 3505767, -4949950, -3085397, 1853815, -4749697, +-4037269, 1730335, -10584947, -7891466, -1073742, 12032351, -5703180, 21150566, 19701014, 3858491, +6306086, -11460583, 1410897, -9285719, 14783277, -2986076, 4347581, -7093139, -4585415, 2487323, +1979443, -6817187, 11318313, -3242164, 2382633, 4191888, -7452842, 2771328, -9505299, -1611, +5359583, 6412923, 117038, 8490077, 10736881, -856309, -20221242, -3448859, -6015639, 14391899, +-12239046, -15204721, -10855530, -7290707, 2050847, -8644159, -6796786, -4381941, -1298154, 2595771, +-29641180, 18615462, 14501957, 21230560, -6832756, 3351685, 14206141, -13712220, -12707734, 2430952, +9255118, 6053757, -1676648, 2800856, -7547332, -8982924, -11445551, -3420405, 39268884, 3080565, +-21886616, -3987877, -12029667, 7415798, 5798206, -13611825, 2812667, -4245039, 1030255, -6770479, +8329552, 8480413, -1369558, -4460324, -5254893, -17241610, 5070746, 2653216, -785442, 6964290, +-3515968, 1015223, 2648921, -8248485, 3015067, 4734128, 11126113, 5842766, 597537, -9790378, +-34897, 8676371, 409633, -142808, 6484864, -9127, 2141578, 6347962, 5394479, -1161789, +2900177, 5340255, 4966056, -2592550, 2105071, 6434398, 7976828, 5807333, -304943, -4435091, +-1100049, 537, 4939213, -206695, -1591822, 143345, 1720671, -3383897, 1728188, 2939368, +-3244848, 1798518, -5686537, -11259794, -21733072, 1755568, -18155900, 8551280, 2927557, -14614163, +8242579, 9483288, 13219909, 3823058, 5224291, -15167140, -310311, -3025268, 14119168, 6571837, +616328, 13206488, 14709189, -1773822, -7057168, 1680406, 18139794, -11819213, -9372156, 9350144, +5097053, -12023224, -2682744, -11125576, 20745228, -17720498, 4901095, 11036992, -6703907, 10143639, +3630858, -5069135, -5412196, -5455682, -8485245, 11613055, 15625628, 3116536, -12050068, 1236414, +-13306882, -5068062, 8588324, -1655173, -6639483, -4855998, 2159832, -17663590, 471910, -1868311, +-10242423, 13763223, -13642964, -935766, -3205119, -10062035, 10558103, -863288, 6069326, -5128728, +-1139777, -625455, -6528887, 4931696, -6025839, -1122060, -5936719, 15915538, 6743636, -18949932, +-4268124, -31210454, 17885318, -73551, -14181982, 12584254, 1234803, 1846836, 4480188, 204011, +7091528, 8813810, 1853278, -2310156, 4721780, 9480067, -5577015, -3365107, 3702799, 1358283, +2184528, 2782065, 4658966, 6457484, -4387846, 3365644, 1881196, -5126044, -4848481, 4099010, +686658, -537408, -3593814, -3112778, -5760625, 5526549, 5531918, 958315, -3911105, -11769821, +71941, 1058710, 3649649, -7559680, 647466, 5975374, -3461207, 6914361, 2936684, -456877, +1729261, 3760781, 137976, 1367410, 1891396, 4622459, 19021336, 716723, -14482630, -6225555, +8553964, 13855028, 14849313, 533650, -3494493, 20877836, 9081171, 23204634, 2818572, 1967632, +-11189464, -4602058, -6641093, 6190122, 3344169, 12549894, -14399952, 971736, -8579197, 7697655, +-12486007, 4735202, 13787382, -2080912, -440771, -7218230, 1931662, -7265474, -24820616, 3401077, +-3839701, 1719061, -11104638, -2440615, 9651328, 18714784, -1973001, -6805913, 10865730, 5115306, +2626373, 12880070, 4458713, -6889665, -3318936, 8312373, -1173063, 7586523, -9090298, -8088497, +2779918, -7601555, -14565308, -6731288, -16585016, -3707094, 5565741, -13023415, -1883343, -14956687, +-6550362, -114890, 5870684, -17822504, 7785702, 1315871, -10605885, 13269838, -4737349, 3510599, +23527294, 26637388, 1709934, 9364639, 19481972, 23296440, 23125178, -2283849, -15418396, -23638964, +-8591545, -15673409, 14799384, -3190087, -6978785, 3784403, -379568, 1612223, -276489, -7008313, +7522099, 2120640, 2825015, 542240, 10170483, -5690832, -99321, -3125663, 7061463, -6548215, +-2773475, -697932, 10049687, -2619393, 6078990, 8274255, -7577396, -1629940, -3187940, -8603893, +-3451006, -1974611, 3741990, 294205, 11780022, 3187403, 7985955, -756451, -7530689, 2114735, +234613, 31835908, 36827196, 1775432, 11893301, 11099806, -1406602, -26541288, -559956, -1209033, +-9872519, 7294465, 7040525, -14515379, 7963943, 9909026, 1797444, -3973382, 5599027, -3817152, +18817326, -3355980, -8617852, -26844, 4370666, -1907502, -1110249, -482647, -29667486, 8454106, +-560493, -20723218, -8417599, 3415573, -1821066, -14166950, 4984310, -16693464, -1385127, 1486059, +-26452704, -4892505, 11509439, -8666170, 1348083, 16618302, 10379325, 12681428, 4099546, -7354595, +-12298102, 12621835, -6475737, 7013145, -11679090, -6289443, 8575976, 14194867, 2210298, 17030620, +-11392401, 14717242, -12452721, -15259482, -10695542, 14669461, 15602006, -14433774, 7521562, -39634496, +-3492882, 11489574, 3790846, -6323266, -15627775, 7129646, -22135724, 3469797, -11353209, 10432476, +-17064978, -11087458, 17361868, 270046, 8792335, 1841467, 7682623, -3994857, 3253438, -2069101, +-12745852, -2447058, -5869610, 3894462, -4013110, 2175401, 657667, 2029372, 1182190, -2951180, +-3765613, 432718, -8002598, 2797098, 2471754, 4571456, -5066451, 4539781, 4490389, 2742874, +3888019, 2630668, -5444408, 484258, 2897492, -4253628, 7671886, -785979, -2729452, -4396973, +139586, 560493, 3751654, -2838437, 3570729, -2745558, 8074002, 3358128, -6456410, -1838246, +-1460289, -3241090, -2604361, -28981902, 2132988, 35885524, -24260660, -2269890, -2106682, 1917166, +-9600863, 4592394, -15306190, -15658914, -5173825, -4269735, 3784403, -3932043, 8159901, -11735998, +383863, 23087596, -18918794, -16681653, -4053912, 20204600, 2815351, -25275346, 10757819, -9372156, +-10824391, 2523830, 34748432, -19543174, -10910828, 24753508, 18315888, 1604707, -10244034, 689879, +-3817152, -7847442, 7067906, 6473590, -4226248, -20040318, 25672630, 12074764, 4846871, -27285390, +-4194036, 8490613, 9430138, -3384971, 14338748, -2306934, 4866198, -6248641, -16457241, 10724533, +-11747272, 7047505, 3635153, -14399415, 27199492, 4195110, 19583978, 19659676, 3491809, -29554744, +-5684926, 288300, -11753178, -5947993, 1108638, -936303, 12831752, 24142548, -6982543, -2355253, +-10657424, -4752382, 10023380, -6764037, 5823439, 17950816, -15693810, 17842368, -3507378, 5365488, +-6784975, -3634079, -5695664, 774705, 3330210, 3940096, -2985002, 99858, 4071629, 2321430, +9430674, 4427038, -4759361, 405874, 860604, 8603893, -4766340, 2504503, 3974992, 1342714, +-335007, 304943, -11218991, 5514738, -4129074, 5399311, 7040525, 946503, -1136556, 3581466, +-367220, 2741800, 933082, -1167694, -4142496, -4214437, 8367133, 1431298, -1955821, 2349347, +-5204964, -979253, 8530879, 11190537, 1545115, -10300405, -51554640, 3386582, -13435195, 1777580, +25844966, 2466385, -4955856, 4704600, 1023813, -17515414, -18874770, -17029546, -16316581, 21271362, +-4229469, 25389162, 2286533, -23987392, -809601, 2645163, 20584168, 4045859, -3285650, -4085588, +5906117, -12917114, -4911832, 22726282, -4596152, -29515016, -22505092, 13471165, -2891050, -6135361, +6824703, -2118493, -15163919, 4584341, 8973797, 20463372, -4079682, -16988206, 277562, -21425982, +8289824, 24255290, -3835943, -29769492, 9419937, -340913, 1723893, 7175817, -9327058, 18321794, +1425929, -12359842, 9663676, -6691559, -4084514, 26181046, -13357885, -4502200, -4348655, 16496433, +6682969, -28956132, 14746770, -23333484, -5513128, -12588012, 3065533, -7675644, -7020124, -2405719, +13356275, -4318053, -8138963, 15744813, -9119826, 16163573, -26844, -8528194, -5077725, 4028679, +4507568, 3212099, -9651328, -3202435, 2448668, -530965, -6291054, 156229, 6056978, 9240085, +3908420, 4763119, 818728, 9086540, -5066988, 2966749, 7237557, -2699924, 968515, 2950106, +-1723893, 1459752, 2910377, -8853001, 7575786, 3232500, -8866960, -7290707, 591632, -10475425, +988916, -7706245, 10108742, -18097918, 34897, -3788698, 1985886, -4667019, 5738613, -2962991, +2713883, 2098629, -25188372, 5157182, 41580116, 27087822, 12387223, -20632486, 15458124, 19551228, +28922846, 13972602, 3415573, 1029182, 18118856, 31284004, -7062537, -3808562, 17712446, -35019016, +12742631, 31251256, -6481643, -10817949, 8108899, 24267638, 19538344, -13056701, -22383222, -1307281, +11257109, -3782793, 2711198, 372052, 26249766, -14976551, 16816408, 25409564, -10163503, -3053722, +17927730, -2667175, 62862216, -26339424, 11319923, 43051140, -24775518, 8147016, 2881923, -34854196, +-1079647, 6544994, -15380278, 34155728, 2585570, -4648229, 2658585, -14150843, 46786152, 12947716, +-37491308, 36229660, -15117211, 1394791, 11108396, 13494250, 24017994, 11767137, -6479495, -23376970, +-31523986, -11770895, -12631499, -2097018, -9667971, 19896972, -12048457, -20826834, 2350421, 5852967, +4268661, 7694434, -11818139, -11446625, -6984691, -7539815, -24842090, -10415296, -8446590, -17077326, +-8235600, 6241661, -7283191, -16002511, -750546, 6360847, 10835666, -2442763, 5110474, 11885248, +-653372, -7885023, -471373, -4735739, 6582038, 9511205, -13146895, 11711302, -6797860, 270583, +1768453, -5983963, 12205223, 4834523, -17074106, 10669773, 1628866, -5933498, 12664785, -14224932, +5799817, -2534568, 6208912, -3267396, -3962644, 2566243, -2315524, -1284195, 4482335, -2418604, +-9765145, 4739497, -873489, 3188476, -390842, 8412230, 10298258, -48389248, 28187870, 1261110, +17042968, 28054190, -46380816, 10584410, 23885386, 5386963, 17825188, -17889076, 19622094, 5695664, +-18176302, 244276, -11451993, -33996276, 18654654, 10555419, 31073552, -17213156, -22744536, -7987029, +7298760, -4764730, -38502236, -19044422, 11853573, -2913062, 5776194, -16298327, -5024575, 12771085, +-10843719, -5466957, -16427713, -3898220, 6006512, -18269180, 1939178, -39844412, -32726040, 10066330, +-34041912, 2907693, -35615480, -25041270, -17169668, 16702591, 33290292, 40888088, -9666898, 18131204, +22231824, 10678899, 9657771, -15968688, 45629196, 46405512, -31554050, 31601832, -24815784, 15860240, +32753420, 30988726, 37948720, 45122928, 32112396, -36063768, -25489020, -355409, 960999, 13517336, +-8501351, -7004555, -21487722, -12038256, -31907312, 6937983, 26929444, -10935524, 6662031, 27944130, +13294534, -19289772, 21626770, -1416802, 7706245, -2197950, -3712462, 6127308, -6680822, 9443559, +8151311, -7242389, -8548596, 8136816, -5790153, 197569, 367757, -771484, 2463164, 720481, +-11411728, 10636487, -4774393, 5035313, 6286759, -4377109, 6764037, -8330089, -5909875, 5357972, +-6478422, -8601746, -3627637, 3279208, -3199751, 1999844, -7555921, 164283, 2966212, 6969658, +10746008, -2629057, 6117107, -7133941, 148176, -1418950, 3359738, 2330557, -486405, -5550172, +59872916, -43826384, -22296248, 23605678, -14051522, 22549116, -17580374, -19614578, 6621766, -46351824, +-2098092, 31156766, -7524246, 16010564, -26585848, -6540699, -10499048, 1049583, 33238216, 10045929, +7384123, -5940477, 18242874, 5862631, 45413372, 11164767, 26511222, 1879585, -20739324, -19616190, +26422638, -12861280, 12215424, -265751, -34114924, 24581172, -30397094, 59008020, -44004088, 26845156, +24035174, -25272662, -21241834, -15696495, 21785148, -1678795, 22798224, -302795, 2962454, -40373228, +-21701932, 9373229, -19852412, 6549825, -12113418, 11834782, 6714645, 30974768, -18438832, -6366216, +-7875897, -15217606, 42003168, 7755101, 3933653, -39165808, -12701292, 21024938, 12400644, 13380434, +36375152, 23267448, 32162326, 37119256, -1112397, 16420197, -15480673, 49381388, 3688840, -8191577, +17975512, -4257387, 37888592, 651224, -7670275, -7871065, 4508105, 26625040, -20262582, 13734232, +-6476274, -2233383, 7872138, 5255966, 10337986, -6568079, 6713571, 12396886, -3315178, -4792110, +8381092, -1432909, -1372779, -1013075, 2212982, 1310502, 4000225, -9122511, 11803107, -7066832, +-3934727, -1996623, 7187091, -10326712, 964220, -7418483, 9844065, 17871896, -6090801, -5068599, +-2471754, 12234751, 5980205, 12779675, -1127966, -7602092, 5797669, 6072547, -1946157, 6009733, +4682588, -17632988, 2605972, 19901804, -2794950, -90372552, 62827856, -38934952, -27227946, 699006, +12917114, 16255377, 2952790, -14426258, 48926656, 24847996, 6867116, -24415816, 16079821, -767189, +18277234, -23302882, -16105590, 12582644, 36602784, -41836740, 1767916, 13668197, 4512400, -10227928, +-6140730, -5187784, 1744831, -2033130, 9529459, 46183248, 3036005, -20723754, 31061740, -7129109, +-29888678, -38544648, 36886252, 12153147, -5039071, 13828184, 8587250, 30749282, -41489920, -4281009, +-21061982, -5879810, 23841900, -17388176, 9341017, -20066624, 9831717, 63661616, 4889284, -36219996, +-40731324, -2376728, 19520626, 19225884, -16280610, 4101694, 30993558, -12826920, -59771988, 34280820, +-20561082, -33881924, 15017353, 56917980, -39143260, 28763396, 39644160, 13812615, -34206192, -28436442, +-17549236, 14451491, 12444131, -11654931, 35587564, 17534204, -2160369, -812286, 2202781, -29438780, +-11257109, -20764020, 10873783, 9816685, 7120519, 9924596, 7341710, 22114250, -10866804, -5063230, +4250407, 368830, -16818018, 14876156, -587337, 9452686, -4166655, 7215545, -10816875, -2981244, +-6506876, 10641855, 1994476, 2501282, 331249, 6592238, 16075526, -5916855, -30582314, 2959769, +-15087683, -2482491, 9171903, -12463458, -8405788, 17911624, -16258062, -3084324, 141197, 8915815, +-17415018, 1831267, 52217140, 16742319, 3774740, -4136591, 8558259, 14265734, -4318053, 6478422, +-7524783, -405874, -5877663, 24035174, -27014270, -3403225, 16677895, -38312720, 12621298, -9599789, +3190624, -4776541, -10304163, 6460705, -2610266, -15797963, 41941428, -32089848, -8613557, 29220810, +-18617610, -3223373, -5653251, 6176700, 29553134, 1951526, -28200756, 38769596, -20803210, 13608604, +24676198, 10533944, -8785356, 1839857, -21163452, 4932233, -12695923, -10545755, 52665964, -12481712, +-20564304, 6506339, -9440875, 12120398, -7831873, 13339632, 33995204, -18838800, 11457362, 25425132, +-29952028, 13549548, 16768626, 7220914, 20911122, -23798950, -5885716, 35683664, -24538222, -5787469, +10581726, -10384694, 34644816, -34427384, 6103686, 11985106, -15458661, 11649562, 13430363, -32801738, +11870216, 27377196, 5906, -8646306, -1000727, 17497160, -3374234, -30822832, 25107306, 11441256, +-13094282, 4761508, -7076496, 10678899, -3979824, -13975287, 16386911, 571768, -3183108, -12192338, +11485279, 1798518, -15500000, 5331128, 10922102, -2513630, -4854924, 1993402, 10124312, -1772748, +-9852655, 10084583, 7139847, 950262, -184684, 8380555, 2008434, 2733210, -11763915, 15057082, +-8130373, 16080894, -29304024, -78957072, -124177704, 11333882, 118946968, 9832254, 269277792, 278022368, +138430016, 291076928, 194143264, -40121436, -4071092, -63851668, -233445968, -204847936, -126589328, -238421152, +-186597536, -54069880, -116843512, -97733592, 34941168, 58971512, -28166396, 15653545, 52679384, -40058088, +-23347442, 74197168, 65900904, 7896834, 73643120, 125495184, 42152956, 90908352, 171538304, 82629800, +43786116, 153811904, 128603672, 17562658, 92493728, 180210928, 36024576, 42825120, 145635360, 63077500, +-15236396, 103179608, 97373352, -8501888, 86041080, 110995376, -1336809, -80329312, -37193344, -189463888, +-313381760, -278604320, -297155904, -454059648, -407854400, -381576160, -464255904, -451000032, -369962048, -333497760, +-300032992, -173482848, -66462472, 59311888, 125695976, 240323280, 358060160, 390899456, 435348608, 567958976, +560492160, 441139328, 482507904, 426700704, 176867824, 192731824, 163821856, -6374805, -26262114, 47860968, +-6117107, -72679440, 9965935, 49776524, -47006808, -18303540, 44027708, -22453552, -92481384, -30144228, +-24634858, -134018552, -94858112, -25123412, -105031816, -118967912, -7724499, -41801844, -120361088, -57508000, +-54153096, -169387072, -160614064, -145444240, -262729584, -284023488, -236774560, -252527440, -272568832, -195046816, +-166292000, -144168096, -104231880, -55759948, -24739012, -6111739, 22801444, 94352376, 128515624, 197865392, +322125216, 364261536, 402918944, 470593120, 459937312, 405423968, 345721792, 243185344, 106091064, 28623810, +-21842056, -74117712, -87450368, -85623392, -86521040, -88280904, -81964080, -73420320, -79135312, -80620832, +-75550088, -80783504, -88265872, -82670608, -77054400, -70557184, -50822348, -23611582, -5479842, 1469416, +2094870, 474057, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 1627256, -6451578, -3213709, 1780801, -667331, 367220, 302258, -2611877, -2961380, 1931125, -542240, --2381559, -3036542, -1876364, 2673617, -286152, 3588982, 747324, -4556424, -4711579, -3341485, -1365263, 1162326, 2431488, -365609, 2783676, -2135136, -402653, -4927401, -765578, -919660, -1008780, 1852742, 1851668, 3637837, -1819992, -2436857, 1960116, 1110249, -2383707, -2423435, -104690, 1692217, 802085, 4039417, -1546725, -1280974, 4569309, 1399623, 8574365, 3648575, --2420214, -82678, -5295695, 98784, -6034966, -397284, -2265059, 4161823, 427349, 2233920, -3036542, 1649804, 2910914, 1944547, 402653, -5053566, -574452, -2532957, 3471407, 5085778, --3579855, -2539400, -1546725, -2058900, -2705293, -4332549, -996969, 1299228, -2566780, -2111513, --912681, -3561602, 400506, -716186, -2417530, 768262, 115427, -13959, -1196685, 212601, -210990, 1324461, -380641, 854699, -452582, 618475, -184684, -799938, 205622, 1040993, -163209, -933082, -973347, -98247, 1760937, 411780, -356482, 286152, -534187, -10131828, --10831371, -860604, -3106335, 417149, -2350421, -638340, 6026913, -1077500, 3240016, -1489280, --2896956, -4003983, 735513, -827855, -4782446, 5513128, 1656247, 379031, 2938831, 2804077, -4545686, 3202435, -301721, -3382287, 3157875, 736050, -4559645, -2014340, -2056216, -1365800, -4075924, -1395864, -6953552, -2354716, -795106, 1452236, -2161442, -4524211, 147640, -441308, -5255966, 779000, -42413, 1920387, -120796, 7092065, -1223529, 652835, -1567663, -2813741, -2684, 3045669, 1377074, 831076, 2878165, -2640331, -4400194, -3147137, -633508, 579284, --1026497, 126165, -3302830, -731218, 1730872, -1053341, 3445101, 1797981, -194347, 639413, --3230352, -2750927, 5346161, 1214939, 2277407, 1551020, -950262, -314069, -4060355, 286689, --2319819, 996969, -790811, 1034013, 1102196, 3143916, -326418, -1098975, 185757, 673773, -421444, 112743, 111669, -947040, -744640, 381715, -341450, -816044, 1278290, -646393, -657130, 972273, -919660, -274341, 736050, -277562, 1319092, -792958, 655519, -631897, --458488, -1647657, 1516660, 7004555, -387621, 3594351, 2110977, 4793184, 5873368, -1335198, -477815, 3622268, 3569655, 2395518, 6719477, 1369021, -2206540, 297963, 5877126, 2076617, -2770254, 5108864, 6852621, 4533875, -1569274, -4698158, 3296924, 2260764, -2734821, -4538170, -230318, -2648921, 1192390, 1742683, -1677722, -2263985, 2262374, 1807108, 4031364, -2710661, --5551245, -2771865, -2418604, -3684545, -1306744, -4209068, 2491081, -5762236, 2443300, 490700, -1298154, -2563022, 5466957, 4195646, -3928821, 4833986, 1778117, -716723, 1551557, -3506304, --1162862, 3304441, 1131187, 1383516, 820876, 3946538, 1553704, 4879620, -2444373, -296890, --366146, 1892470, 2777233, -1129576, 1830193, -2565706, 1244467, 1712081, 1489817, 5353677, -144955, 3994320, 4425427, 2511482, -4135517, -787053, -692027, -1071058, 307627, 2266132, --998580, 67109, -226560, 256087, 766115, -670015, 909996, 1560684, -1153736, -588411, -1428614, 48318, -45634, -79994, -908386, 367757, -472983, 118112, 1090922, 1879048, -19864, -260382, 888521, 723702, 236223, 432181, 300648, 456877, -133681, -266288, -773631, 1016834, -1009854, 532039, -405338, 19370302, 161598, 17151416, 1381369, 10863046, --2330557, -1870458, 2977486, -8108899, 8868571, -5040681, 5951751, 4385162, -3237869, 2588255, --229781, 328565, -1489817, 2465311, 3513283, 4343286, 7173133, 1744831, 2298344, -281857, -8435853, -9675488, 250719, -744103, 2337536, 4100083, -5071283, 1941862, 2315524, 1175747, -3387656, 1816234, -3907347, 1862942, 7557532, -1422171, 2327872, -1282585, -1149978, -372588, --5389110, 8331700, -105227, 797253, 6265821, -893890, 507880, 7722888, -11331197, 3096672, --185220, 3375844, 9220758, 2719251, 2251637, 3160022, -965831, -2597918, -1707786, 2217277, -871878, 4904316, -1751273, 4023848, 1927367, -1418950, 869731, -3281355, -2067490, 392453, --912681, -4517769, -2806224, -4621922, 2753074, 4002910, -1047972, 1202054, -905701, -3090766, --82678, 1627256, 1735704, -5509906, -176094, 457951, -787590, 256087, -1071058, 58519, --1153736, -2682207, 5369, -1793686, -1343788, -2226404, 154619, -2178622, -598074, -2114735, --1506997, -119185, -682363, -1150514, -52076, 224949, 1065689, -1157494, -7730405, -9527311, --3762928, -1442035, -3550327, 7602092, 3266860, -6092411, 6789807, -963683, -4930086, 1461363, -2964064, -2767570, -4504884, -4084514, -8576513, -4351339, 3720516, -5461051, -8709120, 2442226, -3541201, 683974, -3196530, 6517076, 819802, 6024229, -366683, -1410897, 3463891, 5705327, --8130910, -3900904, 2231773, -1848447, 2007897, -5349382, -375273, 1410897, 1941862, -4570919, --8257612, -2355790, 2426657, -1428077, -1029182, 473520, 2687039, -848256, 1497870, -2818036, -4810900, -6328098, -4694400, -1679332, -4598300, -1416266, -1232119, 1803886, -3369402, 2522220, -5223217, -486942, 1238561, 1367410, 2514703, 5049808, -1918240, -1014686, -948114, -2149631, -5311801, -2193655, -9204652, -5929203, -3878892, 8818642, 172336, 5040681, 2350958, 726386, -1392643, -657130, -178241, 4220879, -1396938, -1017907, 1402307, -794032, 708133, -1957968, --1136556, 929324, -235686, 1026497, -252329, 584652, 1623498, 1097364, 1519345, -41876, -1065689, -284005, 1556926, 1628330, 2757369, 1656247, 2194192, 459562, 1473174, 1189706, -923418, 1239635, 1823214, -870268, 166430, -408559, -739271, 686121, 1088774, -2210835, --8369818, -19458886, -1811403, 1348083, 212601, -6308770, -2788508, -7159711, -1839857, -8444443, --9666898, -7558606, -1745904, -5006858, -10894185, -6820945, 2265595, 3374234, -3002719, 6560026, -3638911, -2425583, 8099235, 1733556, 679679, 1301912, -11060078, -405338, 1855426, 4170950, --3468186, -3081639, 6609418, 12836584, -9589051, 3456912, -2811593, -493921, -8449274, -743566, --82678, -4313758, -5461588, -3974455, -4643934, -2477659, 2784213, 9426379, -4387846, 3537443, -6382859, 5767604, -1931125, 656056, -2048163, -1825898, -8672613, -4296578, 4939213, -3128347, -1083942, -2986076, 2498060, 1323387, -942745, -323196, -4037806, -3337190, 778463, -1200980, -1801202, -10274099, -10858214, -1162862, -1573032, -4664335, -6979, 3458523, -5328444, -4105989, --4540318, -7903277, 5614059, -563714, -1166084, 2159295, -289373, 1939178, 3712462, 1293322, -2072859, 1185948, 2734284, -798327, 510027, 454193, 642635, 913217, -682363, -657130, -177167, 854699, 1075352, -650688, 886911, -954020, -1832877, 1032940, 760746, -713501, -2458332, 1124745, 191663, 963146, -1443646, -1566053, -387621, -817118, -633508, -12083890, --2380486, -14550812, -3263638, -10307922, -1232119, 1946157, 2623688, 11195369, -6984154, 2507724, -3020436, -6067178, -2742337, 9009768, 954020, -2624225, 1130113, -7409356, 6727530, -9495636, --3139621, 4243965, 2635499, -981937, 1621887, -1869385, 3111704, -4047470, -7138773, 494458, -3452617, 2834679, -5709086, 1590749, 6414534, -6589017, -8363375, 6673843, -5703717, 4360466, --4105452, 2436857, -170188, -5925445, -7723425, -4746476, 2102387, -299574, 2883534, -4024921, --3936338, -9848360, 5137855, -7056632, -3232500, 3847217, 8746701, -1125818, -1817845, -12894566, --10168872, -3379603, -3626026, 4861903, -1377074, -7550016, -1213865, 408559, -4207458, -1024350, --9032316, 6026376, 2335925, 7597261, 9264244, 4893579, 376883, 4045859, 8263517, -678605, --1909650, -556198, -2531883, -8208220, 454193, 616865, 1766305, 4413079, -1794760, 983011, --8590, -3222836, -1755031, 3015604, 2886755, 2745558, -2110440, 835371, 1133871, 1054415, -1007170, 1214402, 391916, 2298344, 2267206, 1557463, -466004, 1065689, -394600, 915902, -1634772, 593779, 656056, 51540, -571768, -500901, -38118, -1415192, -667867, 7177427, -3761855, 20844014, 10084046, 13503914, -4178466, -513785, -225486, -20558398, 1077500, 8884140, --4076461, -1584843, 703838, 12976170, -2200097, 7522635, -1541893, 7204808, 3948149, 8895414, -12484396, 1617592, 8333847, -2571612, 7211787, -966905, 13360033, 7121593, -230318, 7614977, -6134824, -2241973, 5855651, 3537443, 5055177, -3992709, -3216931, -10794327, -668941, 7665980, -1465658, 981937, -2522757, -4034048, -3234110, -3556233, 18799608, -12091944, 4785668, 5719823, -3230352, 1630477, -7232188, -9599252, -2469069, -1427540, -458488, -16636019, -8267812, -8551280, -393526, -391916, 4930623, -545461, 4377646, 5897527, 10638097, 1956358, -2763812, 3583077, --6728603, 1832340, -4941897, 1789391, 4100620, 2327336, 6764574, -4590247, -5236102, 24410984, -3317862, 4423280, 3062312, 8278550, -5895380, -3044595, 5186173, -618475, -175557, 946503, -1682554, 4771172, -2412698, -381715, 864899, 2738042, 589484, -2543695, 4594542, 151934, --1138703, 84289, -583042, -2505577, -2373506, -1113470, -2636036, -32212, -1065689, 1101122, -3267933, -336618, -382252, -3686693, -828929, 1776506, -464930, 186294, 274341, 2845416, --1557463, -466541, 859530, 1049583, -3259880, 31934156, 3443490, 4751308, 3615826, -2004139, --12931073, 8730058, 9251896, -5184563, 4067871, 4141959, -7735773, -1098975, 7636452, 4356708, --13642427, 3469797, -3661997, -7016366, -73551, 4008815, 1182190, -140123, -156229, 5902359, --1741609, 3326452, -10578504, 4279935, -981937, 4203163, 2537789, -1949915, 7742216, -10390600, --4345970, -10260677, 9063992, 4230006, 14705431, 7208029, 96100, 3133716, -11668352, -97711, -3599720, 3771518, 3750580, 792421, 2238752, -3122978, 3526705, 10470057, 14256070, 6104223, --6247567, -3531537, -1277753, -2779381, 5421860, 7129109, -4759898, 4220342, 8058970, 2423972, --10671920, -21437792, -10392747, 4311074, 9585830, -4035659, 3023657, -804770, -1757715, -68719, -10009958, 1802813, -7853348, 13258027, 6230387, -15355582, 955093, -1839320, -4693326, -1713692, --2078764, -1074, 5589363, 2250563, -3873524, -2189360, 3428458, 5739687, -2263985, 4371203, -1416802, -3554086, -625455, 588947, 448287, -648003, 620623, -1748589, -974421, 1298154, -687195, -1546188, -1359894, 133681, -748935, -2580739, 1976759, -874563, -1009317, 783295, -3093450, -2885681, -4261145, 12885, -293132, -6749541, -783295, 1750199, 397821, -4048007, --77846, -1455457, 1737314, 1032940, 2574296, 1761474, -19536196, 5826660, 9364102, -10545755, -6846178, 11384885, -27827630, 5965710, 1265942, 6063420, -10331007, 15700253, -21937620, -254477, --1496796, -1864553, -2176475, -6471442, -8239895, -1428614, 7974681, 745177, 304943, -4264366, -5641440, -932008, -2629057, 4123169, 9829033, -6522445, 7116761, -1342714, 4360466, 2072322, -6694244, 10049150, -2235531, 2595771, -12996034, -6627672, -2597918, -5027259, -11822971, 1219234, --4232154, -7829189, 11576547, -10806138, -3460670, -5130876, -5683853, 7764227, -8764418, 4913980, --2979097, 7980049, -4110821, 8745627, -11493869, -3371549, 1646046, 10604811, -18638010, -7151658, -855235, -75162, -3177739, 7407208, -9579388, -19187230, 4320737, -16859894, 8686034, -6084358, -237834, -17625472, -6673843, 18800682, 10881300, -14329622, -11703786, -10184978, 786516, 5616207, --2282238, -6486475, 12492986, 4264903, -1960116, -2808909, -4413079, -1097364, 5029407, -4651450, -5393405, -758599, -3379066, 502511, -2530810, 1741609, 4595078, -2772938, 2159295, 3040837, -2494839, -558346, 5311801, -5015985, 5029944, -1541893, 4454418, -5811091, -2684892, 645856, -605590, 5632313, 2201708, 3303904, -1727114, -3547106, 2173790, -6643778, -379031, -14475114, --6213744, 18236432, 767189, -15037754, 14155138, -6626061, 937377, -15680926, 2406792, 6220187, --13841069, -3376918, -12371116, -85362, 779537, -4165582, -3441343, 12073690, 1848447, -8175470, -2041183, -17518634, 10519449, 16696148, -5409512, 6973417, 11832098, -883153, -2429878, 1458141, -1427003, 6938520, 1172526, 1604707, 3630858, -9793599, -717260, -11258720, -11516418, -4719096, -4824322, 6831683, -372588, -13546327, 2658048, 3551938, 6653978, 14482630, -14861124, 21734146, --18035104, 794032, -3642669, -3125663, -8727374, -16727287, -22575422, -8754754, -2594160, 5744519, --1722819, 932545, 3309809, -169114, 15881178, 7513509, -16314970, -2549600, -343597, 10398653, --11279658, 745714, -22721988, 4247723, 17732846, -15868294, -6238440, 2238752, -184147, 4429722, -24852828, 363462, -3292629, 1284732, 12647068, -8606041, 3377992, 4617090, -1891396, -930934, --179852, -346282, 5622112, -1856500, -1307818, -4892505, 8192113, -1793149, 2401424, 810138, -1430224, 2033130, 5952288, -4171487, -1082869, 6305549, -4604742, -6487548, 5319317, 238371, -2587718, 3576634, 2011118, 6519761, -5106179, 3021510, 3597572, -2289218, 9235790, 3150896, -5641977, 2048163, -5595269, -2064269, -966905, -999654, -1010391, -9310415, -18886044, 22574348, -9644886, -11063299, 14656039, 14664092, 20829518, -7683697, -7190849, 15202037, -2234994, -3010235, -5301601, 6758131, 2700998, 3231426, -20717312, -2202781, 66572, 170725, 1149441, -2346126, -8792335, 17037598, 1731946, 1161252, -283468, 810675, 15703474, 4165045, -1098975, -3433290, -4026532, 3466576, -2455111, 1795296, -8949638, -1876901, 13656922, -13553843, -6577206, -11690364, -15258408, -13985487, 7012071, -5732708, 4493073, -3048353, 3624416, -11241003, 2576981, 16938814, --11151346, 874026, -29584808, -1329829, -10451803, 785979, -27614492, -1238024, -1360968, -8535711, --5935645, 22523882, -24197308, 4016331, -6545530, -9048422, 6501507, -8209293, -18906446, -13280576, -1824824, 972273, 3890704, -9390946, -12737262, 7218767, 597537, 1386738, 8460012, -14141717, -10557566, -10297184, -4838281, -4446902, 2492155, 329639, 2994129, -1861868, -3628711, 840740, --2078227, 2930778, 6552510, 3792456, 2388539, 1814624, 1744294, 1695975, -751619, 7110319, -1310502, -1429150, 5294084, 5431523, 1999844, -3110630, -365072, -4511327, 7075422, 2465311, -5674189, -2881386, 5821828, 5176510, 7638600, 3714073, -2258616, -4110284, 6401112, 1232656, -5521718, 1184337, 1419487, 1384590, 1574106, 18934900, 6665789, -2500745, 4099010, -9484898, --9987410, -8194261, 18454400, -16483011, -20480552, 9823127, -19053548, 7082401, 762357, 5208722, --8501351, -2048163, -10352482, -4393752, -7983271, 3871913, 9516037, 6554120, -15372225, 17921824, -2207076, 6269042, 1672353, 8636105, -1816771, 8296266, 2071785, -3688840, 5328981, 1938641, -7050189, 4834523, -11651709, 4705674, -3386582, 3307125, -2340220, -4349192, -3575024, -8198019, -7691750, 8198019, 8606041, -1593970, 15709380, 18726058, 7533910, 2458332, 8540542, 19408958, -9621800, 21172042, 13642964, 15783468, -16914118, -17068200, 3516505, -3462818, -4552129, 1333051, --8501888, 7099581, 5352603, 3337727, 16161962, -3787624, -10386305, -8739722, -7669738, 1874753, --3636227, -34615824, -15017890, -13474923, -4855461, -6999186, -3595425, -5254356, -9787157, 357019, --5866926, -5662915, 2336999, -5681705, -1741609, -8732205, 558883, 448824, -1332514, -12441983, -5182952, -43487, 648540, -9362492, 2886218, 3313031, 3670587, 1010928, 10924786, -7030325, --2604898, 2203855, 1266479, -806380, 4556424, -4984310, -4133369, -921807, 7789997, -808528, -5695664, 6361921, -1271847, -8043400, -7084549, -892279, 8137353, 595390, -5642514, 788127, --1152662, -3939022, -2806761, -1271847, 576599, -6024229, -4969277, 15397458, 10457708, -33719788, --24904904, -7755101, -325344, 11113765, -4636954, -790811, -26848378, 3801583, -14069776, 10042707, --1969243, 13305272, -11425687, -2835752, -13557601, 2353105, 11004780, -5276368, 3183108, -7740605, -536871, -18116708, -5076652, -865973, 1246077, 13448616, 17425756, 617938, -16125455, -11287711, --5262946, 1660005, -4321811, 5123359, -18535468, -5715528, -2618856, -4776541, -10459856, -2415919, --4877472, 12581570, 18131742, 12320651, 4387846, 7535520, 7530689, -8770323, 30346092, 18496276, --24145770, -20752746, 22252762, -17571784, -10292889, 3481071, 2336999, -17054242, 16409996, 1111860, --51740936, 13845901, 32219770, -22373558, 22145926, 29894046, -10120017, -3055869, 15768436, -18604724, --12537010, 6260989, -10348187, -11621108, 13332652, -22580254, -7085623, 2944737, 308164, 1323387, --2398202, 8326868, -6146098, 3580392, 991601, -5973763, 11740293, 6150393, -629213, -7604240, -8997420, -5770289, 6885370, -6145562, 8426189, 927176, 1547262, 8812199, -7063074, -7621957, -2050310, -7031399, -4602595, -315680, 493384, -4678830, -8723615, 4024384, -20127828, -537, -8876087, -7326678, 5113159, -2243584, 2428804, -8318815, -82678, 4556961, -4181151, 2983392, -17542258, -7943005, -7765838, 17537426, -12981539, -2133525, 14445586, -10521059, -6655052, 11059004, -6828998, 7252589, -1789391, -10857140, -8667781, 10208064, -8152385, -775778, 3042448, -15352897, -9979893, 8121783, -6207302, -5050882, -11969537, 289373, -7406134, 10311143, -16807818, 1243393, -6440304, -933082, -7998303, -17460652, -3923453, -7621420, -1699196, -13524315, 18379238, -17999672, -3138011, -6575595, 4616553, -25475598, 26200374, 4932233, 2611877, -10539313, 5966247, 4216048, -1136019, 2328409, -4691715, -20120848, -3489661, -8745090, -12881144, -17299054, -6236830, -4409321, --17141752, -6621229, -820339, 11768210, 5433134, -15575162, -13575318, 8279087, -3585761, -19756312, --8521752, 4762045, 16168941, 16025060, 16334297, 26052734, -5062693, -17801566, -16977468, -1158567, -11434277, 20267414, 9102646, 4285841, -20806970, 11594801, 4298189, 19759534, 13734769, 8899172, -6743099, -96637, 1700270, 11581916, -2842195, 709207, 1999307, 3263638, 3943854, 3641059, -5569499, 13906567, 4332549, 889058, 4742718, -483721, 4414690, 1144609, 736050, 8556112, --10678899, -7692824, -2901787, 3760781, -5463199, 3287798, -2450279, 10778220, 295816, 1622961, --5850283, -7342247, 498216, 6170258, -6165426, -919123, 7287486, -6365679, -490700, 3224447, --10759967, 12696460, 6824703, -2592013, 2962454, -780610, -286152, -3422015, 7191923, 12145631, -32870996, -28993176, -838056, -11569031, -15337328, -9206799, 15042586, -8256001, -8928163, 7676717, -19372450, 12160663, -14533632, 9360881, -15250355, 11184632, 636729, -1754494, -7370164, -11418171, --9160092, 1890323, 2108292, -18037788, 11442867, 1845225, -1599339, -6875706, -7609609, 12739410, --17438640, -870268, 19044422, 22307524, -20000052, -1387811, -3941169, -13027710, -16741246, 18312130, -4227859, 11622182, -3549254, 1374390, -1532230, 11569031, -4469987, 574452, -14333916, 20588462, -17279728, -25224880, -30697742, -6579353, 441845, -10186052, 1110249, -7586523, 2438468, -15677704, -16642461, -20139638, -17493938, -6623377, 3002182, 13792214, -7134478, 20013474, 2229625, -7237557, --6745246, -5337034, -12515535, 12167105, 9268539, -3393024, 7864085, 6000070, -9753334, -9957882, --8238284, 15493558, 4270808, -11207717, 1642288, 4318590, 5476620, -16680579, 8797167, 6565395, -3464965, -244276, -4318590, 2142652, -4748087, -14849313, 3445638, -2037425, -2291902, -1801739, -1859721, -4551055, -5234492, -378494, -1627793, 7313793, -3508988, -2121714, 4706211, -2044941, --6513318, 5762773, -6483790, -2332167, -11624329, 6399502, 1771674, -1787780, 2639258, -5483600, -11263015, -741419, 2350421, 12093017, 9239012, -3418794, -3415573, 5799280, 3830574, -4210142, -2910377, -3862786, -2947421, -771484, 3321084, -44487808, 65910032, -45283988, -11583527, 11925514, -35582732, 28926604, -10704132, -11583527, 1859184, 1651952, 18330384, 6769406, -24335284, 7292855, --5297842, -8535174, 2335389, 9943386, -191663, -18210662, -16117939, 8503498, 6881612, 11260867, --6225555, 13939316, 3180423, 16348793, -1767916, -5570036, 12022687, -1457068, -13005698, 2261300, -14944876, -635655, -17224430, 8521752, 19888382, -18391586, 7182259, -19756312, 7741142, -24966108, --16401406, 27518930, 25563646, 12066174, 33314988, -6398428, 39786968, 14841259, 15288473, 21437256, --36197984, 30474404, 10312753, 12344273, 13968307, 3391951, -17719424, 2906619, 33554968, 38358352, --551366, -43346420, 21227338, 1219234, 8972724, -1454920, 925029, -9401683, -32810866, 6657736, --5544803, 7425999, -6208375, 16258599, -18500572, -19649476, -13990319, 2934537, -6103686, -8795556, -10425496, 4240207, -14249091, -14860050, -11952894, -8704825, -1721745, -2237678, 7649874, -96637, --12250320, 9693741, 1730335, -2846490, 360777, 4863514, -6206228, -2809446, 5822365, -10435160, --4696010, -7067369, 6026913, 8005819, -9100499, 2896419, -24083492, 752156, 973347, 1609539, --4870493, -4161287, -10986526, -7761006, 5260261, 3884798, 5032628, 8742406, -8174397, 1064615, -3016678, 2564096, -8021389, 498216, 1724966, 194884, -6631430, -440234, 43660492, -1674500, --51773684, -26273388, -30448096, -11724187, 346282, 17040282, -44117368, -9965935, 7031935, -20669530, --23643794, -21674016, -23603530, -3889093, 26223996, 13351980, -10283225, 12484933, 5230734, -12058121, -13569412, -15212237, -3270618, 6221260, 9006010, -30137786, 15174656, -14877230, 8682813, -6011344, --24058796, 6598681, 7574175, 3619584, 4041564, -10140955, -34187404, 1265942, 7143605, 7333657, -410169, 4139275, -14158897, -309238, -1153736, 30964566, -4732517, -51310900, -23064512, -5712844, --42456824, 9519258, -12943958, -11011759, -20448876, -9341554, -30565134, -30165166, -36766532, -3841848, -38754564, 5135707, -24492052, 11098195, 355409, -2915209, -13776108, -19579146, 8142185, 15740518, -12146704, 6382322, -7341710, -31598074, -22388590, -31814970, 4636954, 3216931, -1117228, 10981695, --16655346, -20382842, -2858301, -7743826, -20583094, 4176856, 11811160, 1312649, 4302484, 19429896, --3593277, -4456566, -3418257, 927713, -7132867, -4320200, 8786966, 13111998, 14717242, 9539122, --4140349, 244276, 2247879, -6601902, 13612899, -6046777, 19889456, -7474854, 9298067, -9989557, --2728915, 19783156, 6640020, 2288144, -181462, -8433705, 7893076, 1226213, -9955197, 3942243, --8535711, -11383811, 3039226, 2703145, -6805913, -7073275, 6805376, -194347, 9606768, 1519882, -6505802, -4193499, 2804077, 2143726, 28492276, -3134253, 22783190, 29993904, -25400974, -31233002, --33435246, 8996883, 11348377, -45185204, -26546656, 1204738, 1027034, 13995688, -53173844, 5957120, -11950747, 36988260, -42651172, 5324686, 6670621, -4973036, 23090282, -13143674, 40672804, -1939715, -3330747, 12664785, 15627775, -15161771, -33355252, 19593104, 23075786, 5706401, 29271812, 6057515, --4033511, -10725607, -25273198, 39018168, -17585744, 37000068, 14210973, -2375654, 10579041, -15164456, -19557134, 19945828, -13947369, 14927159, 7181186, -38088308, 27761594, 28876676, -3850975, -19238232, -3466576, -576063, 1007707, -6541235, 52697100, -600222, -30955440, -16820166, 5775658, -43937516, --58299348, 8358007, 72428184, 16472810, -5347771, -45977624, -11989401, -7276212, 49299784, -33428804, --21903796, -81117976, -12016245, -14475114, -19416474, -14832670, 29773788, 32474784, -32077500, -11895986, -10327249, 4932233, -6018323, 13652627, -5792837, -9546639, -10212895, 11859478, 4342212, 4226785, --4235912, 11661910, -11633456, -3316252, 9618579, 5111011, -816581, 163209, -8715562, 4767951, --5835250, 21785148, -5944235, -10838887, -9580461, -17416630, -6291590, 14646375, 15615964, 43717936, -16223702, -4153234, -32942400, -44612900, -21376590, 1448478, 18425410, 15804406, -12229383, -17253420, --9297530, -6571300, 11128797, 20369956, 4200478, 1975685, -2561948, -6069326, -6003828, -72405096, -21020644, 35044248, -46631532, -3986267, 26137560, -11042898, -20983062, 18959060, -20246476, -10854456, -1534914, -14998563, 24581708, -8058970, -11237245, -4058207, 12984223, 44719736, -6937446, -20252382, --22891102, 8486319, 21253646, 12956306, -20234664, -2943663, 24188718, 895501, -18343806, 6318434, --16376173, 41375568, -18626200, -44332116, 15363098, -7260642, 21240760, -29622390, -29407104, 29727080, --2412698, -37983080, -20357608, -36282272, 47240884, 23035520, 12704513, -49579492, 8804683, 20799452, --34988416, 2297808, -25154012, -18785650, 19448148, -16677358, 22323630, -13734769, -30419642, -6607271, --7594039, -4246649, 10355166, 3885335, -19044422, 59170152, -7350837, 26392574, 26679264, 16578574, --8144332, 6471979, -13501767, 33399814, 8027831, -8089571, 3817152, 14345728, 22842246, -5449240, --50164680, -3126199, 15417859, -4705674, 26228292, -10921565, 8924405, -3754338, 491774, 11142219, -2430415, 6884296, 13262322, 8244190, 15425375, -3502009, 4857071, 8525510, 852551, -15822660, -19016504, -7752953, -130997, 3215320, -9880572, 5187784, 732292, -2335389, 13128104, -5828271, -714038, 19566798, -480499, 10988674, -9745818, -5898601, 10154913, -2259690, -7495792, -9943923, -223875, 1555315, 2112050, -3216931, 2162516, 6194954, -2508798, 52382496, 10928007, 22605486, --1787243, 5345624, 8466454, -19258096, 8559333, 18182744, 324270, -22136798, -11613055, -16463683, --6534793, -22185654, -21120502, 2501282, -16804596, 24718610, 8207146, -5958731, -17864380, -8804683, --5774047, 13240310, -3983045, -20992190, -17041894, 4192962, 4631586, 11774116, 4689568, -4764730, -5705864, -18329310, -55143084, 2139968, 67267776, -2141578, -48619028, -8103530, 32105954, 8719320, -5382131, -1079111, -21020106, -26584236, -15620259, 5834176, -1446867, -24604258, 9199283, -49304076, --8607651, 45316736, 13576392, 58346056, -7508677, -23278186, -6780680, -5337034, 15867757, 3224984, --239444, -32105954, -15857556, -15451682, -1950989, 36863168, -4774930, -9246528, 12399034, 14820858, -2614561, -19905562, -30562450, -2413772, 12688407, -1558536, -15056545, -4103305, 8825621, -6666863, --5522791, -10268730, 18811420, 19423990, -9629317, -5361730, -8826695, 7784092, 11809013, -5560909, -1912871, -2252174, -1371168, -3862786, -14472429, 1422708, 8650064, -9120363, 2450816, -2345589, -914291, -8186745, -2437394, -3560528, -4984847, -6259915, -5970542, -1966558, 26540214, -13244069, -415001, -5334887, 1706176, 14345728, -9557376, -1572495, -2547453, 4392141, -413927, 3980361, --7275675, -23177254, -77510736, -119378616, 28063854, 107094472, 33621004, 261784160, 246326576, 109751448, -253993632, 107470816, -46210628, -639950, -76565848, -208953920, -114287472, -109355776, -214424624, -155889056, --89741192, -134854464, -90902984, 19876572, -8020315, -43067248, 51022600, 47952236, -354872, 51397872, -139037216, 58558656, 26063472, 133361416, 119061328, 40173512, 141861696, 173888736, -437013, 103062032, -175019920, 66469988, 69870528, 178709296, 106525928, -14016626, 139211696, 97948880, -38175280, 54832772, -110692048, -49526880, -88164944, -19764366, -186136896, -312066944, -302403808, -335934080, -537761024, -465206176, --384055968, -497368480, -426716800, -273993152, -325097888, -248219040, -68926712, -22103512, 104955040, 195820448, -322470976, 432388864, 471352256, 550111232, 597182976, 558135296, 528369024, 560839488, 426398976, 338322080, -401059744, 218930048, 34744136, 50596324, -81301048, -296434880, -249188640, -184152624, -266078592, -271801088, --169854688, -193007248, -243695904, -178406496, -162540352, -228993168, -205757920, -134005664, -170757168, -183092304, --60250876, -57679264, -108396384, -11425150, 40776420, -31009128, 5458367, 40754944, -58700928, -75530224, --72015864, -157022400, -173702432, -121460064, -91613800, -66606352, 22042310, 106140456, 144018304, 204564464, -261873280, 273772480, 290104640, 321181952, 304293056, 276854656, 288044128, 261059920, 193701952, 132891120, -34321084, -52053928, -133230424, -193299296, -216880272, -228179264, -204051744, -156315872, -137408896, -115732192, --95217816, -82114408, -72873248, -54766200, -43184284, -39674760, -39241504, -27759984, -21966610, -17820894, --8230768, 5494874, 16648367, 31831614, 31901406, 30655330, 27302034, 17678086, 6714645, 3770981, -200253, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +6451578, -3213709, 1780801, -667331, 367220, 302258, -2611877, -2961380, 1931125, -542240, +-2381559, -3036542, -1876364, 2673617, -286152, 3588982, 747324, -4556424, -4711579, -3341485, +1365263, 1162326, 2431488, -365609, 2783676, -2135136, -402653, -4927401, -765578, -919660, +1008780, 1852742, 1851668, 3637837, -1819992, -2436857, 1960116, 1110249, -2383707, -2423435, +104690, 1692217, 802085, 4039417, -1546725, -1280974, 4569309, 1399623, 8574365, 3648575, +-2420214, -82678, -5295695, 98784, -6034966, -397284, -2265059, 4161823, 427349, 2233920, +3036542, 1649804, 2910914, 1944547, 402653, -5053566, -574452, -2532957, 3471407, 5085778, +-3579855, -2539400, -1546725, -2058900, -2705293, -4332549, -996969, 1299228, -2566780, -2111513, +-912681, -3561602, 400506, -716186, -2417530, 768262, 115427, -13959, -1196685, 212601, +210990, 1324461, -380641, 854699, -452582, 618475, -184684, -799938, 205622, 1040993, +163209, -933082, -973347, -98247, 1760937, 411780, -356482, 286152, -534187, -10131828, +-10831371, -860604, -3106335, 417149, -2350421, -638340, 6026913, -1077500, 3240016, -1489280, +-2896956, -4003983, 735513, -827855, -4782446, 5513128, 1656247, 379031, 2938831, 2804077, +4545686, 3202435, -301721, -3382287, 3157875, 736050, -4559645, -2014340, -2056216, -1365800, +4075924, -1395864, -6953552, -2354716, -795106, 1452236, -2161442, -4524211, 147640, -441308, +5255966, 779000, -42413, 1920387, -120796, 7092065, -1223529, 652835, -1567663, -2813741, +2684, 3045669, 1377074, 831076, 2878165, -2640331, -4400194, -3147137, -633508, 579284, +-1026497, 126165, -3302830, -731218, 1730872, -1053341, 3445101, 1797981, -194347, 639413, +-3230352, -2750927, 5346161, 1214939, 2277407, 1551020, -950262, -314069, -4060355, 286689, +-2319819, 996969, -790811, 1034013, 1102196, 3143916, -326418, -1098975, 185757, 673773, +421444, 112743, 111669, -947040, -744640, 381715, -341450, -816044, 1278290, -646393, +657130, 972273, -919660, -274341, 736050, -277562, 1319092, -792958, 655519, -631897, +-458488, -1647657, 1516660, 7004555, -387621, 3594351, 2110977, 4793184, 5873368, -1335198, +477815, 3622268, 3569655, 2395518, 6719477, 1369021, -2206540, 297963, 5877126, 2076617, +2770254, 5108864, 6852621, 4533875, -1569274, -4698158, 3296924, 2260764, -2734821, -4538170, +230318, -2648921, 1192390, 1742683, -1677722, -2263985, 2262374, 1807108, 4031364, -2710661, +-5551245, -2771865, -2418604, -3684545, -1306744, -4209068, 2491081, -5762236, 2443300, 490700, +1298154, -2563022, 5466957, 4195646, -3928821, 4833986, 1778117, -716723, 1551557, -3506304, +-1162862, 3304441, 1131187, 1383516, 820876, 3946538, 1553704, 4879620, -2444373, -296890, +-366146, 1892470, 2777233, -1129576, 1830193, -2565706, 1244467, 1712081, 1489817, 5353677, +144955, 3994320, 4425427, 2511482, -4135517, -787053, -692027, -1071058, 307627, 2266132, +-998580, 67109, -226560, 256087, 766115, -670015, 909996, 1560684, -1153736, -588411, +1428614, 48318, -45634, -79994, -908386, 367757, -472983, 118112, 1090922, 1879048, +19864, -260382, 888521, 723702, 236223, 432181, 300648, 456877, -133681, -266288, +773631, 1016834, -1009854, 532039, -405338, 19370302, 161598, 17151416, 1381369, 10863046, +-2330557, -1870458, 2977486, -8108899, 8868571, -5040681, 5951751, 4385162, -3237869, 2588255, +-229781, 328565, -1489817, 2465311, 3513283, 4343286, 7173133, 1744831, 2298344, -281857, +8435853, -9675488, 250719, -744103, 2337536, 4100083, -5071283, 1941862, 2315524, 1175747, +3387656, 1816234, -3907347, 1862942, 7557532, -1422171, 2327872, -1282585, -1149978, -372588, +-5389110, 8331700, -105227, 797253, 6265821, -893890, 507880, 7722888, -11331197, 3096672, +-185220, 3375844, 9220758, 2719251, 2251637, 3160022, -965831, -2597918, -1707786, 2217277, +871878, 4904316, -1751273, 4023848, 1927367, -1418950, 869731, -3281355, -2067490, 392453, +-912681, -4517769, -2806224, -4621922, 2753074, 4002910, -1047972, 1202054, -905701, -3090766, +-82678, 1627256, 1735704, -5509906, -176094, 457951, -787590, 256087, -1071058, 58519, +-1153736, -2682207, 5369, -1793686, -1343788, -2226404, 154619, -2178622, -598074, -2114735, +-1506997, -119185, -682363, -1150514, -52076, 224949, 1065689, -1157494, -7730405, -9527311, +-3762928, -1442035, -3550327, 7602092, 3266860, -6092411, 6789807, -963683, -4930086, 1461363, +2964064, -2767570, -4504884, -4084514, -8576513, -4351339, 3720516, -5461051, -8709120, 2442226, +3541201, 683974, -3196530, 6517076, 819802, 6024229, -366683, -1410897, 3463891, 5705327, +-8130910, -3900904, 2231773, -1848447, 2007897, -5349382, -375273, 1410897, 1941862, -4570919, +-8257612, -2355790, 2426657, -1428077, -1029182, 473520, 2687039, -848256, 1497870, -2818036, +4810900, -6328098, -4694400, -1679332, -4598300, -1416266, -1232119, 1803886, -3369402, 2522220, +5223217, -486942, 1238561, 1367410, 2514703, 5049808, -1918240, -1014686, -948114, -2149631, +5311801, -2193655, -9204652, -5929203, -3878892, 8818642, 172336, 5040681, 2350958, 726386, +1392643, -657130, -178241, 4220879, -1396938, -1017907, 1402307, -794032, 708133, -1957968, +-1136556, 929324, -235686, 1026497, -252329, 584652, 1623498, 1097364, 1519345, -41876, +1065689, -284005, 1556926, 1628330, 2757369, 1656247, 2194192, 459562, 1473174, 1189706, +923418, 1239635, 1823214, -870268, 166430, -408559, -739271, 686121, 1088774, -2210835, +-8369818, -19458886, -1811403, 1348083, 212601, -6308770, -2788508, -7159711, -1839857, -8444443, +-9666898, -7558606, -1745904, -5006858, -10894185, -6820945, 2265595, 3374234, -3002719, 6560026, +3638911, -2425583, 8099235, 1733556, 679679, 1301912, -11060078, -405338, 1855426, 4170950, +-3468186, -3081639, 6609418, 12836584, -9589051, 3456912, -2811593, -493921, -8449274, -743566, +-82678, -4313758, -5461588, -3974455, -4643934, -2477659, 2784213, 9426379, -4387846, 3537443, +6382859, 5767604, -1931125, 656056, -2048163, -1825898, -8672613, -4296578, 4939213, -3128347, +1083942, -2986076, 2498060, 1323387, -942745, -323196, -4037806, -3337190, 778463, -1200980, +1801202, -10274099, -10858214, -1162862, -1573032, -4664335, -6979, 3458523, -5328444, -4105989, +-4540318, -7903277, 5614059, -563714, -1166084, 2159295, -289373, 1939178, 3712462, 1293322, +2072859, 1185948, 2734284, -798327, 510027, 454193, 642635, 913217, -682363, -657130, +177167, 854699, 1075352, -650688, 886911, -954020, -1832877, 1032940, 760746, -713501, +2458332, 1124745, 191663, 963146, -1443646, -1566053, -387621, -817118, -633508, -12083890, +-2380486, -14550812, -3263638, -10307922, -1232119, 1946157, 2623688, 11195369, -6984154, 2507724, +3020436, -6067178, -2742337, 9009768, 954020, -2624225, 1130113, -7409356, 6727530, -9495636, +-3139621, 4243965, 2635499, -981937, 1621887, -1869385, 3111704, -4047470, -7138773, 494458, +3452617, 2834679, -5709086, 1590749, 6414534, -6589017, -8363375, 6673843, -5703717, 4360466, +-4105452, 2436857, -170188, -5925445, -7723425, -4746476, 2102387, -299574, 2883534, -4024921, +-3936338, -9848360, 5137855, -7056632, -3232500, 3847217, 8746701, -1125818, -1817845, -12894566, +-10168872, -3379603, -3626026, 4861903, -1377074, -7550016, -1213865, 408559, -4207458, -1024350, +-9032316, 6026376, 2335925, 7597261, 9264244, 4893579, 376883, 4045859, 8263517, -678605, +-1909650, -556198, -2531883, -8208220, 454193, 616865, 1766305, 4413079, -1794760, 983011, +-8590, -3222836, -1755031, 3015604, 2886755, 2745558, -2110440, 835371, 1133871, 1054415, +1007170, 1214402, 391916, 2298344, 2267206, 1557463, -466004, 1065689, -394600, 915902, +1634772, 593779, 656056, 51540, -571768, -500901, -38118, -1415192, -667867, 7177427, +3761855, 20844014, 10084046, 13503914, -4178466, -513785, -225486, -20558398, 1077500, 8884140, +-4076461, -1584843, 703838, 12976170, -2200097, 7522635, -1541893, 7204808, 3948149, 8895414, +12484396, 1617592, 8333847, -2571612, 7211787, -966905, 13360033, 7121593, -230318, 7614977, +6134824, -2241973, 5855651, 3537443, 5055177, -3992709, -3216931, -10794327, -668941, 7665980, +1465658, 981937, -2522757, -4034048, -3234110, -3556233, 18799608, -12091944, 4785668, 5719823, +3230352, 1630477, -7232188, -9599252, -2469069, -1427540, -458488, -16636019, -8267812, -8551280, +393526, -391916, 4930623, -545461, 4377646, 5897527, 10638097, 1956358, -2763812, 3583077, +-6728603, 1832340, -4941897, 1789391, 4100620, 2327336, 6764574, -4590247, -5236102, 24410984, +3317862, 4423280, 3062312, 8278550, -5895380, -3044595, 5186173, -618475, -175557, 946503, +1682554, 4771172, -2412698, -381715, 864899, 2738042, 589484, -2543695, 4594542, 151934, +-1138703, 84289, -583042, -2505577, -2373506, -1113470, -2636036, -32212, -1065689, 1101122, +3267933, -336618, -382252, -3686693, -828929, 1776506, -464930, 186294, 274341, 2845416, +-1557463, -466541, 859530, 1049583, -3259880, 31934156, 3443490, 4751308, 3615826, -2004139, +-12931073, 8730058, 9251896, -5184563, 4067871, 4141959, -7735773, -1098975, 7636452, 4356708, +-13642427, 3469797, -3661997, -7016366, -73551, 4008815, 1182190, -140123, -156229, 5902359, +-1741609, 3326452, -10578504, 4279935, -981937, 4203163, 2537789, -1949915, 7742216, -10390600, +-4345970, -10260677, 9063992, 4230006, 14705431, 7208029, 96100, 3133716, -11668352, -97711, +3599720, 3771518, 3750580, 792421, 2238752, -3122978, 3526705, 10470057, 14256070, 6104223, +-6247567, -3531537, -1277753, -2779381, 5421860, 7129109, -4759898, 4220342, 8058970, 2423972, +-10671920, -21437792, -10392747, 4311074, 9585830, -4035659, 3023657, -804770, -1757715, -68719, +10009958, 1802813, -7853348, 13258027, 6230387, -15355582, 955093, -1839320, -4693326, -1713692, +-2078764, -1074, 5589363, 2250563, -3873524, -2189360, 3428458, 5739687, -2263985, 4371203, +1416802, -3554086, -625455, 588947, 448287, -648003, 620623, -1748589, -974421, 1298154, +687195, -1546188, -1359894, 133681, -748935, -2580739, 1976759, -874563, -1009317, 783295, +3093450, -2885681, -4261145, 12885, -293132, -6749541, -783295, 1750199, 397821, -4048007, +-77846, -1455457, 1737314, 1032940, 2574296, 1761474, -19536196, 5826660, 9364102, -10545755, +6846178, 11384885, -27827630, 5965710, 1265942, 6063420, -10331007, 15700253, -21937620, -254477, +-1496796, -1864553, -2176475, -6471442, -8239895, -1428614, 7974681, 745177, 304943, -4264366, +5641440, -932008, -2629057, 4123169, 9829033, -6522445, 7116761, -1342714, 4360466, 2072322, +6694244, 10049150, -2235531, 2595771, -12996034, -6627672, -2597918, -5027259, -11822971, 1219234, +-4232154, -7829189, 11576547, -10806138, -3460670, -5130876, -5683853, 7764227, -8764418, 4913980, +-2979097, 7980049, -4110821, 8745627, -11493869, -3371549, 1646046, 10604811, -18638010, -7151658, +855235, -75162, -3177739, 7407208, -9579388, -19187230, 4320737, -16859894, 8686034, -6084358, +237834, -17625472, -6673843, 18800682, 10881300, -14329622, -11703786, -10184978, 786516, 5616207, +-2282238, -6486475, 12492986, 4264903, -1960116, -2808909, -4413079, -1097364, 5029407, -4651450, +5393405, -758599, -3379066, 502511, -2530810, 1741609, 4595078, -2772938, 2159295, 3040837, +2494839, -558346, 5311801, -5015985, 5029944, -1541893, 4454418, -5811091, -2684892, 645856, +605590, 5632313, 2201708, 3303904, -1727114, -3547106, 2173790, -6643778, -379031, -14475114, +-6213744, 18236432, 767189, -15037754, 14155138, -6626061, 937377, -15680926, 2406792, 6220187, +-13841069, -3376918, -12371116, -85362, 779537, -4165582, -3441343, 12073690, 1848447, -8175470, +2041183, -17518634, 10519449, 16696148, -5409512, 6973417, 11832098, -883153, -2429878, 1458141, +1427003, 6938520, 1172526, 1604707, 3630858, -9793599, -717260, -11258720, -11516418, -4719096, +4824322, 6831683, -372588, -13546327, 2658048, 3551938, 6653978, 14482630, -14861124, 21734146, +-18035104, 794032, -3642669, -3125663, -8727374, -16727287, -22575422, -8754754, -2594160, 5744519, +-1722819, 932545, 3309809, -169114, 15881178, 7513509, -16314970, -2549600, -343597, 10398653, +-11279658, 745714, -22721988, 4247723, 17732846, -15868294, -6238440, 2238752, -184147, 4429722, +24852828, 363462, -3292629, 1284732, 12647068, -8606041, 3377992, 4617090, -1891396, -930934, +-179852, -346282, 5622112, -1856500, -1307818, -4892505, 8192113, -1793149, 2401424, 810138, +1430224, 2033130, 5952288, -4171487, -1082869, 6305549, -4604742, -6487548, 5319317, 238371, +2587718, 3576634, 2011118, 6519761, -5106179, 3021510, 3597572, -2289218, 9235790, 3150896, +5641977, 2048163, -5595269, -2064269, -966905, -999654, -1010391, -9310415, -18886044, 22574348, +9644886, -11063299, 14656039, 14664092, 20829518, -7683697, -7190849, 15202037, -2234994, -3010235, +5301601, 6758131, 2700998, 3231426, -20717312, -2202781, 66572, 170725, 1149441, -2346126, +8792335, 17037598, 1731946, 1161252, -283468, 810675, 15703474, 4165045, -1098975, -3433290, +4026532, 3466576, -2455111, 1795296, -8949638, -1876901, 13656922, -13553843, -6577206, -11690364, +15258408, -13985487, 7012071, -5732708, 4493073, -3048353, 3624416, -11241003, 2576981, 16938814, +-11151346, 874026, -29584808, -1329829, -10451803, 785979, -27614492, -1238024, -1360968, -8535711, +-5935645, 22523882, -24197308, 4016331, -6545530, -9048422, 6501507, -8209293, -18906446, -13280576, +1824824, 972273, 3890704, -9390946, -12737262, 7218767, 597537, 1386738, 8460012, -14141717, +10557566, -10297184, -4838281, -4446902, 2492155, 329639, 2994129, -1861868, -3628711, 840740, +-2078227, 2930778, 6552510, 3792456, 2388539, 1814624, 1744294, 1695975, -751619, 7110319, +1310502, -1429150, 5294084, 5431523, 1999844, -3110630, -365072, -4511327, 7075422, 2465311, +5674189, -2881386, 5821828, 5176510, 7638600, 3714073, -2258616, -4110284, 6401112, 1232656, +5521718, 1184337, 1419487, 1384590, 1574106, 18934900, 6665789, -2500745, 4099010, -9484898, +-9987410, -8194261, 18454400, -16483011, -20480552, 9823127, -19053548, 7082401, 762357, 5208722, +-8501351, -2048163, -10352482, -4393752, -7983271, 3871913, 9516037, 6554120, -15372225, 17921824, +2207076, 6269042, 1672353, 8636105, -1816771, 8296266, 2071785, -3688840, 5328981, 1938641, +7050189, 4834523, -11651709, 4705674, -3386582, 3307125, -2340220, -4349192, -3575024, -8198019, +7691750, 8198019, 8606041, -1593970, 15709380, 18726058, 7533910, 2458332, 8540542, 19408958, +9621800, 21172042, 13642964, 15783468, -16914118, -17068200, 3516505, -3462818, -4552129, 1333051, +-8501888, 7099581, 5352603, 3337727, 16161962, -3787624, -10386305, -8739722, -7669738, 1874753, +-3636227, -34615824, -15017890, -13474923, -4855461, -6999186, -3595425, -5254356, -9787157, 357019, +-5866926, -5662915, 2336999, -5681705, -1741609, -8732205, 558883, 448824, -1332514, -12441983, +5182952, -43487, 648540, -9362492, 2886218, 3313031, 3670587, 1010928, 10924786, -7030325, +-2604898, 2203855, 1266479, -806380, 4556424, -4984310, -4133369, -921807, 7789997, -808528, +5695664, 6361921, -1271847, -8043400, -7084549, -892279, 8137353, 595390, -5642514, 788127, +-1152662, -3939022, -2806761, -1271847, 576599, -6024229, -4969277, 15397458, 10457708, -33719788, +-24904904, -7755101, -325344, 11113765, -4636954, -790811, -26848378, 3801583, -14069776, 10042707, +-1969243, 13305272, -11425687, -2835752, -13557601, 2353105, 11004780, -5276368, 3183108, -7740605, +536871, -18116708, -5076652, -865973, 1246077, 13448616, 17425756, 617938, -16125455, -11287711, +-5262946, 1660005, -4321811, 5123359, -18535468, -5715528, -2618856, -4776541, -10459856, -2415919, +-4877472, 12581570, 18131742, 12320651, 4387846, 7535520, 7530689, -8770323, 30346092, 18496276, +-24145770, -20752746, 22252762, -17571784, -10292889, 3481071, 2336999, -17054242, 16409996, 1111860, +-51740936, 13845901, 32219770, -22373558, 22145926, 29894046, -10120017, -3055869, 15768436, -18604724, +-12537010, 6260989, -10348187, -11621108, 13332652, -22580254, -7085623, 2944737, 308164, 1323387, +-2398202, 8326868, -6146098, 3580392, 991601, -5973763, 11740293, 6150393, -629213, -7604240, +8997420, -5770289, 6885370, -6145562, 8426189, 927176, 1547262, 8812199, -7063074, -7621957, +2050310, -7031399, -4602595, -315680, 493384, -4678830, -8723615, 4024384, -20127828, -537, +8876087, -7326678, 5113159, -2243584, 2428804, -8318815, -82678, 4556961, -4181151, 2983392, +17542258, -7943005, -7765838, 17537426, -12981539, -2133525, 14445586, -10521059, -6655052, 11059004, +6828998, 7252589, -1789391, -10857140, -8667781, 10208064, -8152385, -775778, 3042448, -15352897, +9979893, 8121783, -6207302, -5050882, -11969537, 289373, -7406134, 10311143, -16807818, 1243393, +6440304, -933082, -7998303, -17460652, -3923453, -7621420, -1699196, -13524315, 18379238, -17999672, +3138011, -6575595, 4616553, -25475598, 26200374, 4932233, 2611877, -10539313, 5966247, 4216048, +1136019, 2328409, -4691715, -20120848, -3489661, -8745090, -12881144, -17299054, -6236830, -4409321, +-17141752, -6621229, -820339, 11768210, 5433134, -15575162, -13575318, 8279087, -3585761, -19756312, +-8521752, 4762045, 16168941, 16025060, 16334297, 26052734, -5062693, -17801566, -16977468, -1158567, +11434277, 20267414, 9102646, 4285841, -20806970, 11594801, 4298189, 19759534, 13734769, 8899172, +6743099, -96637, 1700270, 11581916, -2842195, 709207, 1999307, 3263638, 3943854, 3641059, +5569499, 13906567, 4332549, 889058, 4742718, -483721, 4414690, 1144609, 736050, 8556112, +-10678899, -7692824, -2901787, 3760781, -5463199, 3287798, -2450279, 10778220, 295816, 1622961, +-5850283, -7342247, 498216, 6170258, -6165426, -919123, 7287486, -6365679, -490700, 3224447, +-10759967, 12696460, 6824703, -2592013, 2962454, -780610, -286152, -3422015, 7191923, 12145631, +32870996, -28993176, -838056, -11569031, -15337328, -9206799, 15042586, -8256001, -8928163, 7676717, +19372450, 12160663, -14533632, 9360881, -15250355, 11184632, 636729, -1754494, -7370164, -11418171, +-9160092, 1890323, 2108292, -18037788, 11442867, 1845225, -1599339, -6875706, -7609609, 12739410, +-17438640, -870268, 19044422, 22307524, -20000052, -1387811, -3941169, -13027710, -16741246, 18312130, +4227859, 11622182, -3549254, 1374390, -1532230, 11569031, -4469987, 574452, -14333916, 20588462, +17279728, -25224880, -30697742, -6579353, 441845, -10186052, 1110249, -7586523, 2438468, -15677704, +16642461, -20139638, -17493938, -6623377, 3002182, 13792214, -7134478, 20013474, 2229625, -7237557, +-6745246, -5337034, -12515535, 12167105, 9268539, -3393024, 7864085, 6000070, -9753334, -9957882, +-8238284, 15493558, 4270808, -11207717, 1642288, 4318590, 5476620, -16680579, 8797167, 6565395, +3464965, -244276, -4318590, 2142652, -4748087, -14849313, 3445638, -2037425, -2291902, -1801739, +1859721, -4551055, -5234492, -378494, -1627793, 7313793, -3508988, -2121714, 4706211, -2044941, +-6513318, 5762773, -6483790, -2332167, -11624329, 6399502, 1771674, -1787780, 2639258, -5483600, +11263015, -741419, 2350421, 12093017, 9239012, -3418794, -3415573, 5799280, 3830574, -4210142, +2910377, -3862786, -2947421, -771484, 3321084, -44487808, 65910032, -45283988, -11583527, 11925514, +35582732, 28926604, -10704132, -11583527, 1859184, 1651952, 18330384, 6769406, -24335284, 7292855, +-5297842, -8535174, 2335389, 9943386, -191663, -18210662, -16117939, 8503498, 6881612, 11260867, +-6225555, 13939316, 3180423, 16348793, -1767916, -5570036, 12022687, -1457068, -13005698, 2261300, +14944876, -635655, -17224430, 8521752, 19888382, -18391586, 7182259, -19756312, 7741142, -24966108, +-16401406, 27518930, 25563646, 12066174, 33314988, -6398428, 39786968, 14841259, 15288473, 21437256, +-36197984, 30474404, 10312753, 12344273, 13968307, 3391951, -17719424, 2906619, 33554968, 38358352, +-551366, -43346420, 21227338, 1219234, 8972724, -1454920, 925029, -9401683, -32810866, 6657736, +-5544803, 7425999, -6208375, 16258599, -18500572, -19649476, -13990319, 2934537, -6103686, -8795556, +10425496, 4240207, -14249091, -14860050, -11952894, -8704825, -1721745, -2237678, 7649874, -96637, +-12250320, 9693741, 1730335, -2846490, 360777, 4863514, -6206228, -2809446, 5822365, -10435160, +-4696010, -7067369, 6026913, 8005819, -9100499, 2896419, -24083492, 752156, 973347, 1609539, +-4870493, -4161287, -10986526, -7761006, 5260261, 3884798, 5032628, 8742406, -8174397, 1064615, +3016678, 2564096, -8021389, 498216, 1724966, 194884, -6631430, -440234, 43660492, -1674500, +-51773684, -26273388, -30448096, -11724187, 346282, 17040282, -44117368, -9965935, 7031935, -20669530, +-23643794, -21674016, -23603530, -3889093, 26223996, 13351980, -10283225, 12484933, 5230734, -12058121, +13569412, -15212237, -3270618, 6221260, 9006010, -30137786, 15174656, -14877230, 8682813, -6011344, +-24058796, 6598681, 7574175, 3619584, 4041564, -10140955, -34187404, 1265942, 7143605, 7333657, +410169, 4139275, -14158897, -309238, -1153736, 30964566, -4732517, -51310900, -23064512, -5712844, +-42456824, 9519258, -12943958, -11011759, -20448876, -9341554, -30565134, -30165166, -36766532, -3841848, +38754564, 5135707, -24492052, 11098195, 355409, -2915209, -13776108, -19579146, 8142185, 15740518, +12146704, 6382322, -7341710, -31598074, -22388590, -31814970, 4636954, 3216931, -1117228, 10981695, +-16655346, -20382842, -2858301, -7743826, -20583094, 4176856, 11811160, 1312649, 4302484, 19429896, +-3593277, -4456566, -3418257, 927713, -7132867, -4320200, 8786966, 13111998, 14717242, 9539122, +-4140349, 244276, 2247879, -6601902, 13612899, -6046777, 19889456, -7474854, 9298067, -9989557, +-2728915, 19783156, 6640020, 2288144, -181462, -8433705, 7893076, 1226213, -9955197, 3942243, +-8535711, -11383811, 3039226, 2703145, -6805913, -7073275, 6805376, -194347, 9606768, 1519882, +6505802, -4193499, 2804077, 2143726, 28492276, -3134253, 22783190, 29993904, -25400974, -31233002, +-33435246, 8996883, 11348377, -45185204, -26546656, 1204738, 1027034, 13995688, -53173844, 5957120, +11950747, 36988260, -42651172, 5324686, 6670621, -4973036, 23090282, -13143674, 40672804, -1939715, +3330747, 12664785, 15627775, -15161771, -33355252, 19593104, 23075786, 5706401, 29271812, 6057515, +-4033511, -10725607, -25273198, 39018168, -17585744, 37000068, 14210973, -2375654, 10579041, -15164456, +19557134, 19945828, -13947369, 14927159, 7181186, -38088308, 27761594, 28876676, -3850975, -19238232, +3466576, -576063, 1007707, -6541235, 52697100, -600222, -30955440, -16820166, 5775658, -43937516, +-58299348, 8358007, 72428184, 16472810, -5347771, -45977624, -11989401, -7276212, 49299784, -33428804, +-21903796, -81117976, -12016245, -14475114, -19416474, -14832670, 29773788, 32474784, -32077500, -11895986, +10327249, 4932233, -6018323, 13652627, -5792837, -9546639, -10212895, 11859478, 4342212, 4226785, +-4235912, 11661910, -11633456, -3316252, 9618579, 5111011, -816581, 163209, -8715562, 4767951, +-5835250, 21785148, -5944235, -10838887, -9580461, -17416630, -6291590, 14646375, 15615964, 43717936, +16223702, -4153234, -32942400, -44612900, -21376590, 1448478, 18425410, 15804406, -12229383, -17253420, +-9297530, -6571300, 11128797, 20369956, 4200478, 1975685, -2561948, -6069326, -6003828, -72405096, +21020644, 35044248, -46631532, -3986267, 26137560, -11042898, -20983062, 18959060, -20246476, -10854456, +1534914, -14998563, 24581708, -8058970, -11237245, -4058207, 12984223, 44719736, -6937446, -20252382, +-22891102, 8486319, 21253646, 12956306, -20234664, -2943663, 24188718, 895501, -18343806, 6318434, +-16376173, 41375568, -18626200, -44332116, 15363098, -7260642, 21240760, -29622390, -29407104, 29727080, +-2412698, -37983080, -20357608, -36282272, 47240884, 23035520, 12704513, -49579492, 8804683, 20799452, +-34988416, 2297808, -25154012, -18785650, 19448148, -16677358, 22323630, -13734769, -30419642, -6607271, +-7594039, -4246649, 10355166, 3885335, -19044422, 59170152, -7350837, 26392574, 26679264, 16578574, +-8144332, 6471979, -13501767, 33399814, 8027831, -8089571, 3817152, 14345728, 22842246, -5449240, +-50164680, -3126199, 15417859, -4705674, 26228292, -10921565, 8924405, -3754338, 491774, 11142219, +2430415, 6884296, 13262322, 8244190, 15425375, -3502009, 4857071, 8525510, 852551, -15822660, +19016504, -7752953, -130997, 3215320, -9880572, 5187784, 732292, -2335389, 13128104, -5828271, +714038, 19566798, -480499, 10988674, -9745818, -5898601, 10154913, -2259690, -7495792, -9943923, +223875, 1555315, 2112050, -3216931, 2162516, 6194954, -2508798, 52382496, 10928007, 22605486, +-1787243, 5345624, 8466454, -19258096, 8559333, 18182744, 324270, -22136798, -11613055, -16463683, +-6534793, -22185654, -21120502, 2501282, -16804596, 24718610, 8207146, -5958731, -17864380, -8804683, +-5774047, 13240310, -3983045, -20992190, -17041894, 4192962, 4631586, 11774116, 4689568, -4764730, +5705864, -18329310, -55143084, 2139968, 67267776, -2141578, -48619028, -8103530, 32105954, 8719320, +5382131, -1079111, -21020106, -26584236, -15620259, 5834176, -1446867, -24604258, 9199283, -49304076, +-8607651, 45316736, 13576392, 58346056, -7508677, -23278186, -6780680, -5337034, 15867757, 3224984, +-239444, -32105954, -15857556, -15451682, -1950989, 36863168, -4774930, -9246528, 12399034, 14820858, +2614561, -19905562, -30562450, -2413772, 12688407, -1558536, -15056545, -4103305, 8825621, -6666863, +-5522791, -10268730, 18811420, 19423990, -9629317, -5361730, -8826695, 7784092, 11809013, -5560909, +1912871, -2252174, -1371168, -3862786, -14472429, 1422708, 8650064, -9120363, 2450816, -2345589, +914291, -8186745, -2437394, -3560528, -4984847, -6259915, -5970542, -1966558, 26540214, -13244069, +415001, -5334887, 1706176, 14345728, -9557376, -1572495, -2547453, 4392141, -413927, 3980361, +-7275675, -23177254, -77510736, -119378616, 28063854, 107094472, 33621004, 261784160, 246326576, 109751448, +253993632, 107470816, -46210628, -639950, -76565848, -208953920, -114287472, -109355776, -214424624, -155889056, +-89741192, -134854464, -90902984, 19876572, -8020315, -43067248, 51022600, 47952236, -354872, 51397872, +139037216, 58558656, 26063472, 133361416, 119061328, 40173512, 141861696, 173888736, -437013, 103062032, +175019920, 66469988, 69870528, 178709296, 106525928, -14016626, 139211696, 97948880, -38175280, 54832772, +110692048, -49526880, -88164944, -19764366, -186136896, -312066944, -302403808, -335934080, -537761024, -465206176, +-384055968, -497368480, -426716800, -273993152, -325097888, -248219040, -68926712, -22103512, 104955040, 195820448, +322470976, 432388864, 471352256, 550111232, 597182976, 558135296, 528369024, 560839488, 426398976, 338322080, +401059744, 218930048, 34744136, 50596324, -81301048, -296434880, -249188640, -184152624, -266078592, -271801088, +-169854688, -193007248, -243695904, -178406496, -162540352, -228993168, -205757920, -134005664, -170757168, -183092304, +-60250876, -57679264, -108396384, -11425150, 40776420, -31009128, 5458367, 40754944, -58700928, -75530224, +-72015864, -157022400, -173702432, -121460064, -91613800, -66606352, 22042310, 106140456, 144018304, 204564464, +261873280, 273772480, 290104640, 321181952, 304293056, 276854656, 288044128, 261059920, 193701952, 132891120, +34321084, -52053928, -133230424, -193299296, -216880272, -228179264, -204051744, -156315872, -137408896, -115732192, +-95217816, -82114408, -72873248, -54766200, -43184284, -39674760, -39241504, -27759984, -21966610, -17820894, +-8230768, 5494874, 16648367, 31831614, 31901406, 30655330, 27302034, 17678086, 6714645, 3770981, +200253, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -553514, -11153493, -5529771, 440234, -3299072, -253403, 4714264, 2237141, 2957622, -2580202, 3663607, --3787624, 4112968, 2056216, 4956929, 2093797, -943819, -5597416, 6019397, 4151086, 1525250, -708670, 557272, -2378338, -2726767, 3114388, 1904818, 2035278, 2986076, -3037079, -237297, -2806224, 3318399, -432181, -2484639, -4712116, 11274, 881542, -2855617, 1067299, 751082, --4247186, -2305324, -322123, 2150168, 49929, -2079301, 3968550, 730144, -1340030, -2947421, --651761, 336618, -5545877, 2549063, 3478387, -1942399, 4453881, 3631932, -574989, 3001109, -1785633, 5879274, 1860258, 1086627, -912681, 2203318, -4737349, 592706, 2279554, -2368675, -2609193, 3119757, 3454764, 2131378, 4538707, -994285, -2746095, -1451162, -1157494, 578747, --1041530, -3544959, 1677185, -1685775, -1846299, -2160906, 821413, -27380, -1074816, -879395, -1411971, 78383, -153008, -403727, -129386, 634581, 951335, -179852, -45634, -826244, -234076, -1465658, 148176, 933619, 1284732, -936840, -953483, 192200, 841814, -10582263, --7401303, -1053878, -4765266, -4078608, 2007360, -6026913, -5810554, 1671816, -2631741, -2362232, -2419677, -1903744, -4115653, -450435, -310311, -1165547, -1882269, -1114007, -4720169, -296890, --3403762, -2465848, -128312, 4218732, -936303, 6097780, -3169686, 3661997, 4212289, -4732517, -1650341, -1202054, 918586, -3352222, 1661079, 2160369, 3250753, -1673964, -3966402, -1387811, --2173790, 1264331, 1544041, -4820027, -601832, -3312494, -2651606, 896038, -3938485, -6322729, --1177895, 6192269, 1378148, 2161442, 344671, 1416266, 855772, 2273112, 2459406, 6944962, -530428, -3100430, -3981435, -868120, -1890323, -525060, -8060580, 1662152, -562104, 2565169, --1066763, 704375, -1913408, -957778, 7913477, 1571958, 7257958, -2471754, -1306744, 540092, -2075543, 688805, 2471754, -2423972, 2683281, -2823941, -1725503, 1425392, 1058710, -120259, -144418, 42950, -590021, 181999, -1053341, -115964, -349503, -192737, 489626, 531502, --573378, -1040456, -613643, 49392, 61740, 155693, 361314, -443992, -444529, -452045, -134218, -185220, 585189, 8590471, 9932649, 7619272, 5680094, 8010114, 3267933, 3473018, --718333, 2265059, 8458401, 886374, 2588792, -3153580, -2079301, 6456947, -4329864, -7933342, -2408403, -6630893, 5721970, 1330903, 6863358, -2197413, -418759, -1705102, 2262911, 2727304, --85899, -6755447, -1379758, 5757941, -3832722, 2587181, 1538135, -1318018, -1651415, 6400038, -4847408, 11176579, 4489315, 912681, 2689187, -963146, 688269, 3508988, 2109903, 9523016, --4078608, -2739652, 671626, 2439542, -1495722, 4404489, -4136054, 841277, -266825, -3198677, -994822, 939524, -4305705, -5850819, -3605088, 4599910, 2241973, 537, -371515, 3466576, -266825, 1136556, 6047851, 2963528, -1438814, -981937, 5376226, -4679904, 619012, -4220879, --1889786, -5449777, 1480153, -1149978, -3218541, -2129230, 3150896, 1922535, 563178, 1830730, --3015604, -526670, -257161, 2316061, 67646, 146029, 431644, 676994, 1718524, 1907502, -1520955, 97174, 812823, 1724429, 98247, -1607392, 1468342, -826244, -314069, 336618, --267362, 1261110, 1165547, 563178, -2684, -466541, -462246, 529892, 733903, 246961, -1120450, -2288144, -1449015, 1114007, -79994, 18690088, -331786, 9156333, -1661079, -1432372, -9819906, -9614284, -3331821, -750009, 4849018, 3368865, -2062121, 1869385, 904628, -8710194, -2198487, 4656282, 4132296, -9763534, -3438121, 1096827, -7005629, -1930588, 527744, 309238, -943819, -1083406, 4449049, -3161633, 3535295, 7308424, 7298760, -2134599, -4205847, -760746, -8221641, -483721, -457951, 47782, 793495, -4293357, 713501, 3449933, 500364, 805843, -3296924, -2215130, 2211908, 1278827, -929324, 5770826, 544924, 4583267, 883690, -1564442, -1982127, 3054796, 2625836, -157840, -4558571, -4147328, -5484137, -2455111, -225486, -22012, --672699, 4027606, 3449933, -2666638, -5385352, 140660, 2736431, 3308736, -3313031, -642098, -3115462, -317291, -482647, 4163434, 1919314, 1953136, -1614371, -1388348, -301185, 1770600, -2646237, 19864, 1988570, 693100, 112743, 350577, 621160, 2465848, 1825361, 2779381, --1496259, 1284195, 125628, 306016, -479426, 242666, 348966, 70867, 294742, -518617, -1275605, 1268089, -1308891, 266825, 673773, 771484, -487479, 2552821, -5022965, -13935558, --3653944, -4718022, 877247, 2324651, -2402497, -2791192, -26329224, 526670, 8410083, -6139119, --9884330, 7365332, -11182484, -1689533, -5032628, -5861557, -3692061, -3684008, 339302, 4461934, --878321, 2484102, -2907156, 3362423, -2647311, -3993783, 1687922, -1502165, -6357626, -8040179, -3768297, 374736, 3718905, 1152662, 8408472, 1190780, 2868501, -4082903, -7135552, -2056753, --3580929, 7045357, -3369402, 176094, 1755568, -3510599, 9787694, 6527814, 63351, -7866233, --10048613, -3391414, 3240016, -9002251, -304406, -4382478, -8640400, 788663, -13485124, -2971581, --1506460, -4991826, 8933532, -562641, -1500017, -152471, 5566278, 7200513, 2085744, -7217693, --2413235, -1829656, 3805341, 1816771, 2150705, -4055523, -5246840, 4050691, 2682207, 1016834, -1283658, -254477, 2236604, 643708, 3410204, 990527, 734976, -294205, -179852, 558346, -2172717, 3207804, 1892470, -781684, 1202591, -4005594, 1998234, 2390149, -745177, -331786, -664109, -900333, -323196, -217433, -1304596, -1291175, -776852, -376347, 686121, 1597728, --316217, -1842541, -77846, -2604898, 825707, 3589519, 1474248, 2123325, 1436130, 5578626, --15049029, -22181896, 2692408, -5082557, 4913980, -6227703, -11041287, 250182, 10096931, 2045478, -6184753, 4935991, 3816615, 2438468, -3576097, 2688113, 6703370, -10564009, -4959614, -3529926, --2385318, 3839164, -889595, 1306207, 6960532, 6059125, -2488397, -5966784, 1380295, -3350611, --2550674, -5783174, -4013647, -8795556, 2105071, -3299072, -75699, 7778723, -1560147, 1478543, -2060511, -5606006, 4700842, 4631586, 6500433, -5711233, 10263898, -1680943, -7503845, -6349573, --8208220, 7644505, -2887829, -8728447, 2653753, -1346472, -6145025, 6545530, 8798777, -3036542, --7341173, 5452998, 1732482, 4276714, -634581, 11834782, 6957847, -6897718, -3422015, -3250217, --2687576, 3958886, 5418638, 7030862, -9127, 941672, 2698313, -2773475, 2566780, -752156, -4539781, 6462852, -8741332, -3885872, -4406100, -2727841, -4501663, -325344, -3190624, 1500017, --193274, -253403, -392990, 1202054, -2172180, 5503464, -704375, 2368138, 803159, 1175747, --1090922, 256087, 125091, 369367, -1871532, 436476, -1227287, -1864016, -2911988, -795643, --201863, -418759, 77846, 406411, -616328, -322123, -1116155, -934692, 1684701, -20713554, --13959, -3762391, 1373316, -37581, 7816304, 5732708, 8096014, -1312649, 11043435, -5131949, -7510287, 9193377, 1695975, 9163313, 1980517, 2383170, -2566780, -935229, -3849901, 7265474, --446140, -824634, 10234907, 6183143, 100395, 2759517, -865973, -340913, 6658273, -3801583, --6577206, -3758, -907849, 3381750, -18609020, 11196980, 12080132, 4769025, 2355253, 322659, --5913633, -12410845, 8205535, -5000416, -5640366, -3777424, 7365332, -5180805, 4545686, 4612258, --4405563, -2917894, -10717554, 4938676, -6970732, 4140885, 694174, 3708168, 6519224, 10406706, -4465156, -4798016, -11443940, -2015950, 7004018, 11467563, 8608188, -1737314, -2275796, -7371238, --12257300, -1297617, 8477192, 3783866, 2672007, -2720325, 11250130, -383863, 3781182, 1088774, --2185602, 1063004, -5753646, -2799245, -2915746, 1911797, -1455457, -4106526, -2434710, -2838437, --3081639, 1225139, -4380330, -1820529, 825171, 749472, 3359738, 175557, 461709, 575526, --934692, 2750927, -889058, 3128884, 1112397, -904628, -2430415, -133144, 3001109, 2143189, --405874, -2954938, -803159, 2596308, 2308008, 322659, -562641, -366683, -1816234, 1995549, -7925289, 27070642, 14795089, -1302986, 2630668, 2419140, 6029597, 10715407, -1428077, 2122788, -18177912, 1872606, -719407, 10947335, 7693360, -7514046, 4570919, 1121523, 7361574, 5042292, --12503187, 9601936, -5748277, -800475, 1153199, 7523172, 1418413, 2059974, 5775121, 6568616, --6162741, 6746857, 20080582, -3499325, 9180493, 9372692, -4903242, 7357816, 2011655, -4783520, --5140002, 3584150, -4587562, -12414066, -1541356, -555125, 1347009, -15899432, -3822521, 4920422, --10010495, -6761353, -16531329, 5508833, 7697655, -11329050, -3987877, -5456756, 12071006, 305480, --6816650, -4799089, -7599408, 3856881, 10106058, -7135552, 3925063, -3030636, 4896263, 11373073, -4821638, 8959302, 9147743, 11354283, 1779190, -6363531, -6312528, 4550518, 7230578, 1036698, -4868346, -5093831, 2068027, -629213, -1549946, -5350456, 762357, -2380486, 332860, 4335233, -1864016, 1819992, 1492501, 4786204, -2959233, 156766, -787053, 1411434, -549219, 145492, -2063732, 521839, -1680943, 2548526, -554588, -3714610, 2302639, -2662880, -2108829, -2761664, --5537287, 2964601, -1269700, 2501282, -295279, -558883, 738198, 4083440, 2769717, 3637301, -1705102, -92342, 1498944, 4193499, -1735704, 27827630, 7488276, 1127966, -1559073, -4036733, -221728, 5203890, -3329137, -6440841, -9475772, 710280, 6854231, -8483097, 4221416, 5564667, --2335389, 18779208, 6696928, -4686346, -3153043, -1422708, 6804302, -2792803, -6209449, -6908992, -4377109, -15066208, 590558, -4263829, -5439576, 4797479, 1126355, -5538897, -3345243, -5324686, -7573638, -2502892, -11855720, -1474248, 338766, 860604, -6847789, -9755481, 985695, -1851131, --1253057, 3269544, -1993402, 9073655, 1950989, 5396627, -5746130, 13223667, 3922916, -6664716, -8850854, 16737488, -4742718, -4172024, 8670465, 7888245, 3382287, 4780836, -10276783, -2810519, --11116449, 3242164, 10580115, 4698694, -13044353, -2723546, 4242891, -13025562, -20258824, -1819992, -756451, 5721434, 18564460, 1416266, -2013803, -5830955, -4281546, 2833068, 4775467, 3870303, --192737, 2019172, 272194, -4145717, 2623688, 3122441, -5107253, -5040144, 5703180, -1947231, -3391951, 2433636, 1758252, -1483911, 1301912, -213138, 2039036, 397821, 3048353, 2684, -2705293, 1745904, 684510, -2481417, 5527086, 1646583, 5055714, -1124208, -1553704, 1723893, --3216394, -650151, 2461553, -3207267, 908922, 1714229, 1208496, 1090922, 2758980, -1133335, --4726075, -153545, -399969, -5216238, 861678, -2240899, -21597244, 10154376, 28708098, -11808476, -20148228, -4558034, -4341675, -6311992, -10407780, 7714835, 296353, 5264020, 5217849, -18865106, -251256, 8759049, -7642895, -4059281, -11874511, 20998632, -13105556, 10351945, 9787157, -12527883, --5151277, -4384088, 8820789, -10026064, -4078608, 10170483, -1770063, -2743947, -4956929, 12409234, -2196339, -2025614, -5102421, 314069, -9446781, 10229001, -1207960, 4698694, 25551834, 17132624, --14700062, -10416906, 4021163, -1336272, 10695005, -5883032, -8615704, -3071975, -16022375, -6193880, --1894618, -12315282, -7027104, 27303644, 6523519, 94489, -1331977, -302795, 8047158, 9620190, --2019172, 9503689, 774168, -5217312, 1040456, -14565845, -1084479, -13495861, -7276749, 8141111, -11933567, -17895518, 7279433, -4580583, -5667210, 8681203, -1254667, -8231305, -452045, -3219615, --6437619, 3321620, 2416456, -4493610, -11087995, -5339718, -1087164, -863825, 8812199, 2622078, -2229625, -4765803, 119185, -1952600, 4750234, 5285494, -2768643, 2269890, 4023848, 4352413, -3459059, 4947803, -1893007, 365609, -3325379, 293132, -3879966, -2077690, 1580011, -1067836, --3109020, -729071, 1772211, -5243082, -2506650, -2831457, -1489280, -1985349, -2296734, -22871238, -3881040, 21264920, -5629629, -5392869, 4541391, -6566468, -5428302, 6019397, -852551, -1168768, --315680, -14387067, 24401320, -25975962, -2564632, -570157, 8846022, 5385889, 254477, -9845676, --7162395, 3136400, 19036368, -1527398, -8491150, -5733782, -13627394, -898185, -8033737, -6310381, --2864206, 4277251, -525060, 662499, -9255118, 1872606, 2531883, 5896453, 4808753, 5937256, --12537010, 83752, -2620467, 8217883, 1997160, 16645146, 3513283, -3819300, 1389959, -9009231, --147640, 7287486, 9286256, -14233522, -11143830, -1006096, 14803142, -23251880, 6035503, 26917096, -14701136, -7150584, 2406256, -14409078, 6016713, 13321915, -22809498, 5127654, -11153493, -3082713, --30894774, 207232, -13060459, 12065100, 752156, -14267344, 9445170, -861678, -18546206, -2408940, --11755325, 7678328, -6582038, -9590125, 13063680, -2478196, 2257005, -4315906, -5767068, -1495186, -5543729, 4261682, -3224984, -732829, 169114, -3187403, 1974074, 3256122, 4577899, -4629975, -1786706, 2556579, -5640903, 418222, 2388002, -3929895, 321586, -2519535, 6107444, 3375844, -7446937, -3488050, -2867428, 2585034, -7217693, -689879, -2117419, -1052267, -436476, 1591285, --4077535, 330712, -599148, 1477469, 1316944, 326418, -4115116, -6231998, -17362406, 27469000, -8078297, 14367202, -16182363, -18261664, -3241090, 4803921, -4947266, -2471217, 9358734, 2500745, -3004867, 8118025, -20089172, -2248416, 411780, 5108327, -13927505, 1814087, 2538863, -9825811, --5260261, -13523241, -9994926, -110059, 4475356, -10953240, 958851, -4987531, -9561671, 3728569, -114354, 7705172, -21306796, -22435836, 4776004, -1971390, 8532489, 18728204, 2208150, -11868605, -16889422, -8422431, -15678241, -12209518, -5102421, 1286343, -16660715, -6533719, 16535087, 22278532, -9491878, 6191732, 4719096, -2648921, 14287746, 7978439, -16574816, -9138080, 130460, 1586990, -15625628, 9945534, 2529199, -2474975, -1904281, -7730941, 10374494, 8040716, 18020610, 4032974, -5260261, 2103997, 32339494, 3578782, 12532715, -13469017, 1158031, 12198781, -29294362, 2308008, -3873524, 8156680, -3043521, 4289599, -3835406, -1095217, 5017059, -2537252, 15516106, -6343130, -9063455, -2509872, -5529234, -3069828, -5981816, 49392, 2408403, 2924336, -1265942, -3128347, -6446209, -2074469, 4301947, -2442763, -2515240, -4866735, 4826470, 5165235, 1089311, 356482, --4020090, -7016903, 3146064, -761283, 156229, 7984881, -2365990, 6969122, -1177895, 3994857, -2749853, 5316096, 1157494, -5282810, -1056025, 18524730, 1234266, 23019414, -827855, -10707890, --11653320, -21792128, 3919695, -9266392, -668404, 1728188, 7727720, 11229729, 19123878, 19760070, --3147674, 17575006, -1388348, -1675037, 6625524, 14788109, 6425271, 4039954, -23823646, -12331388, --19385872, 9651328, 19278498, 3621194, -8428336, 13373991, 19339164, -2762201, 2945274, -4678830, -16249472, 13655312, 11637214, -7062000, -12373801, -2092723, -3259343, -27525908, 4714801, 3614215, -2377801, -7097971, -3699041, -30680026, -10873247, -27857694, -4915053, -20894480, -10823318, 19896972, -5254356, 20970178, 1344862, -17402134, -8460012, -18101676, -34395708, 4724464, -21274046, -6315750, -20208894, 8330626, 7925826, 1549946, -3888556, -1600949, 3951907, -14904073, 11832635, -25341380, --26026964, -1559073, -2232846, -3362960, -19116362, -4457639, 25270514, -1491964, 1586454, -6848862, --21834004, 11005854, -14667313, -5887327, -14598594, -9166534, -6795175, -4781909, -5224291, -3364033, -405874, 2492155, -13645111, -6009733, 2717641, 2354179, 7746511, 3488050, -4479651, -5879274, -5093295, -9366787, -1316408, 2772402, -7009924, 2156074, 2253784, 5070209, -4755603, -1781875, --2490544, -468151, 3534221, -2121177, -201327, -2813741, 5561983, 7453379, -2379412, -1302986, -2144263, 2445984, 4849018, 6596533, 1337882, -1222992, -1499481, 10827613, 21814676, 18986976, -20456930, -11790222, -20521890, 15783468, -9327058, 16312823, 4903779, -26205206, 6609955, 4881767, --29501594, 15863999, -13431436, -13735842, 8075613, 8979166, 1436667, 10658498, 835371, 532576, --6892886, -3997004, 6512244, -4098473, -10088341, 680215, -18984292, 6874632, -24141474, -14697915, -938987, 9596031, -3259343, -9995463, 3792993, 7569880, 5675263, 447213, 19519552, -44758392, --10118406, -12255152, -14819785, 19423990, -15608448, -2136746, -36056252, -10095858, -4237522, 1887638, -24129664, -5804112, 3099356, -14533632, 12267500, -18084496, -11659762, 9408126, -41864120, 6108517, -22467510, 29111826, 22291954, 14082661, 32792076, 18082886, -326954, -8089034, -8336532, -12651900, --28152974, -3052648, 2707977, -39905616, -15721191, -12059194, -8934606, 12784507, 33514166, 39072392, -25952876, -13100724, 10756209, -8442295, -1747515, 8854075, 6099391, -3397856, 2202781, 2920041, --685584, 1354525, -6046777, 3524558, 11067057, -5151277, 1566589, -9665824, 2483565, -4523675, --550293, -468688, 8583492, 15027017, -5273146, 948651, 3773129, 6124087, -8965744, -14054207, -391916, 10954314, 3310883, -8962523, 8534100, 4427038, -8978092, 6394670, 4222490, -3500935, --2651606, -966368, -1552631, 1657857, 3568044, -3190624, 6295349, -38429756, 52076, 6413460, -26948772, -8773544, 12455405, 11333345, 5961952, 6186901, -42038068, 33146410, 18051748, 41068476, -15065672, -1792612, -15291157, -9704479, -9589588, -14897094, 10586558, 7789997, -15150497, -17205638, -9038759, 12295418, 21408802, 5978058, -13383655, -19946902, 4159139, 3326989, 1311039, 2338073, -38035692, 12839268, 7208566, 12482786, 13706314, 15442555, 271657, -24254218, 16926466, 53067544, --5529234, -14900315, -32452236, -7056095, 42749956, 4901632, 17620104, 5822902, -59381144, 12102681, -10508174, 1116155, 5954972, -4282083, 766652, 11948062, -32051194, -13390634, 26916024, 9888625, -3547643, -24182814, 16994648, 6198712, -21823802, -23673322, -15955804, 21332028, 44552232, 41450728, -45671608, 46326056, 1651952, -20921860, -17251274, -40886480, -13553306, 12647068, -33231236, -514859, --27127014, 137976, 35919348, 13861470, 14653355, 17716740, 10958609, -11272142, -3921842, -13850733, -19391778, -12147241, -10763188, 3281355, -2560338, -7346005, -13286481, -4059818, 13094818, 12326019, --6194417, 19210852, -1219771, 190052, -9166534, 2565169, 9743670, -2869575, -8008504, -7776575, -4676146, -4461934, 10642392, 6590628, 8537858, 12638478, -13640816, 3003793, 757525, 5577552, --3161633, -6071473, 11278047, 2397129, 9115531, -5568962, 3042448, -8232379, -3031710, 18506478, -39304320, -79104704, -27183922, 5612449, -45367204, -42624328, -17676474, -26087632, 3467649, -19345070, -50361176, -5814312, -17083232, -7665443, -37550364, -11076721, -30185030, -13320304, 5966784, -40184252, --6053220, 30222612, -25134148, -7914551, 9473087, -655519, 13443248, 2189360, 670552, 10962367, -4882841, -20211042, -3058017, 17053168, -8230231, -25048250, -7421167, -30268246, -14009646, -52650392, -5749888, -36020280, 17826262, 5860483, -12355010, -46495704, 4943508, -5384279, 57388280, 22052510, -1742683, 30289720, 14041859, -191126, 25724706, -29986924, -13324599, 1733556, 22841172, -24916716, --14130979, 81717656, -7146826, 42104100, -32479080, -543850, -22997402, 17404818, -7701950, 27411556, -44479756, 705985, -30342334, 26135950, -32370094, -15459735, 11788075, -34744136, -22270480, -11383274, -25565792, 47102368, -55925844, 47225312, 10195715, 13495861, 5923297, 6254010, 5742372, -7475928, -9284646, 24259586, -11813308, 3903589, -1746441, 2797098, -26115012, -5238250, -7522635, 7659001, -8961986, 25959856, -15778099, -9969693, -12139725, 17890150, -22679038, 5218386, 9333501, 7531225, -9414568, -38922604, -8448738, 13487271, -5898601, -16860430, -1423245, 4148939, 1722819, 15931644, -9024263, 12569759, -12210592, -11953968, 13918378, 3483219, 9623948, -9053791, 9692131, 5696201, -2499134, 2945811, -2809446, -4368519, 1028108, -29680908, 61337500, -35249332, 22557706, 20098300, --31913754, 17479444, 9641665, 6868727, -5671505, 24203214, 12526272, -30871152, 21869436, 25410638, -4945655, 4269735, 15387257, -452582, -30671436, 39799852, -22766012, 8959302, -16937204, -3965866, -4992900, -7532836, 32456530, 7228430, -4317516, -7886097, -1728188, 6283001, -33088428, 10395431, --17173426, -11668889, -7974144, -170188, -16263967, -7813620, 3891777, 34215320, 316217, -7301982, --21922050, 9025337, 5979132, 902480, 26571888, -6596533, -2839510, 31562104, 9898289, 1718524, --30642444, -16131360, 19659140, 10899016, -28714004, 772557, -65161096, -32382980, 58272504, -13823889, -31484258, 41191956, 11683385, 6874095, 18635864, -8151848, -22938884, 12104292, 3764002, -1663226, -26243324, 16935592, -19002546, -45628120, -9494562, 18320720, 5811091, -1301912, 14642617, -17374216, -25400436, -12702366, 9448928, 11681774, 5123359, 17268990, 13179644, 20976620, 2316061, -5744519, -7584912, 20320028, -5480379, 17758080, 10705743, -11890617, 3539590, 9319542, 6350646, 3694746, -12824235, 10557566, 4645544, 21310554, -6926172, 2226941, -3199214, -1634772, -5570036, 18888730, -15734076, 12454331, -6069863, 2189897, 22462142, -6106907, 16445430, 14614163, -44560, 25635586, --23467164, 3084860, 35392680, 4341138, 9975598, -7570954, 24894168, 4635344, 34817152, -10747082, --58195732, 9895605, -7023882, 20044612, 6117107, -19729470, 10212895, 12011413, -22508312, -24697136, --16550120, -41238664, -41522672, 28557238, -6638409, -42649024, -13100724, 4364761, 14085882, 13500693, --26151518, -28333900, 2755759, 39402568, -18881214, 15198279, -26550414, 9408663, -29949880, 19463718, -20532628, -14691473, -30823370, -21211232, -3466039, 12053826, -13250511, -8746701, -11037529, -39209292, --33886756, 17708150, -28455232, -5858873, 10095858, -23521388, -37936908, 14419279, 19859392, -2597382, --45664092, 20352776, 17879948, 57647588, 239444, 15086073, 11271605, -24718074, 9415105, -7732015, --49902688, -7713225, 30466350, 7181186, -25256556, -62668940, 39507256, 50442244, -15044734, 40782324, -47543140, 2365453, 2130304, 37502580, -24372328, 1798518, 62941136, -46510200, 26975078, -39855684, --10936597, -3330210, 27095338, -9299141, 3921842, 15114527, -491774, -35291208, 38757248, -7132330, --4560182, 5862631, 16180752, -26554172, 11578158, 6713571, -3997004, 7969312, 9423695, -24617142, --3323768, 5623723, 12886513, 26679264, -2258079, -23589572, 11948062, 27384174, -21862458, 26707718, --12692702, -2950106, -9419400, 30129196, -20893942, 7066832, 18897320, -13168370, 4753992, 3227668, --17411798, 3704946, 7532836, -3423089, -13214541, 8490613, 10998338, -6270116, 21855478, -32947768, -8114804, 9451612, 479963, 1843078, 22563610, -5069672, 12657269, -26199300, -82958368, 22434224, --9587978, 61962956, -21329882, -13605383, -24897388, -70965208, 32439352, -41350872, -24209120, 1274532, --116501, 54758148, -39202852, -27409408, 36019208, 21478058, 18760418, -6782827, 17922362, -12677133, --18096308, -16605954, 42241540, 35188668, 54930484, -17467632, -20617990, 998580, -3673271, 20211580, --33140504, 7125888, -34831112, 18615998, 34078420, 11746199, -28144384, 19184546, -24816322, 55819544, -28362890, 7931194, 7473780, -8582955, -43789340, 24760486, -59385440, 12433930, 11016054, 29033442, -22980222, -51228224, 15430207, -32255742, -19198504, 14000520, -5116380, 19171660, 12230993, -46832860, -19138912, 43101608, 56913148, -16477642, 16809428, -23204098, 39943732, -56719340, -3005403, -10296110, -17919678, 37389300, 53625888, -42883636, 10692858, -57398480, 36928664, 75728328, -19220516, -51527796, --4144644, -38849588, 49700288, 12663711, -25367150, -7126962, 2895882, -8446590, 35501124, 13418552, --20044612, 19153406, -28385438, 1903744, 26653494, -5506685, -32715840, 36341864, -52207476, 15192910, --7863548, 20931524, -1293322, 13023951, -12016782, -6388227, 5339181, 4643397, 5568962, 24828670, --25310242, -21232170, 1212791, 5774047, -5821292, -26372172, -19295140, 38765836, 10475962, -17149804, --19804094, -44125956, 52938692, 41467372, -16082505, -14120779, -30808338, 1226750, 39571144, -65168076, -46535972, -6029597, -1832340, 15484968, 12962748, 18437758, 5099200, 9034464, -22964116, 21797496, -5909875, -23331336, 15726560, -9244917, -431107, 21314848, 12249784, -33216204, 18631032, -15684147, -27653146, -20119238, 6947110, -10245644, 12831215, -9760850, 5859409, -14568529, 31811750, -2743410, -794569, 9570798, 10612327, -16065325, -3444027, 7380365, 10554882, 9806484, -11294153, 4141959, -381715, -32292786, -2780455, 8512088, 11829951, 5298916, 7549479, -29033442, 4549981, -1575179, -2847563, 6830609, -5864241, 6468221, 4767414, 2878165, -7144678, -6452115, -2346663, 33879240, --11963095, 6852084, 12443057, -6927246, 11834782, -13424457, 11401528, 6113349, -9184788, -13504988, -8478802, -8243116, 6627135, -12131135, -10700911, -4716411, 15403900, -3862786, 1388885, 3237869, --1226213, 3828427, -12387223, 9426379, -8029978, 20545512, -19097036, 8999030, -11435350, 10276783, --9358197, 8242042, 125091, 13912473, -12050604, 6555194, -6215892, 801548, 2338610, 8239895, --8681740, 2103997, -9360344, 13187697, -11085311, -2977486, 6534256, 2785823, -5459441, -1520955, -7393786, 5019206, -18207976, 10189810, 802085, 170188, -2005750, 3723737, -2354179, 1992865, --1494649, 2407866, 514859, 4782446, -5214627, 13001940, -16545825, 51849920, -3747896, -16776679, --25608742, -11626476, -14381161, 18817862, 10864120, -13663902, 1125818, 1620813, 6129455, 852014, -13008382, 4502737, 10241886, -3510599, -384936, -3071439, 4792110, 11125039, -10340671, -60666, --5126581, 367757, 13538274, -7685307, 1303523, -3470871, 5323075, 2760590, -7456063, -2753611, -7960722, -2448668, 12991202, 9256728, -13595182, 4354023, 2859375, 7124277, 2991982, -12830141, -8665633, -2401961, 8426726, 6757594, -15337865, 4202626, 24696, 3448322, -1730335, -6729677, -10900627, -2685965, 4935991, 259846, -3301756, 5054103, -6542846, -918049, 9086540, -6260989, --7532836, 15180562, -9826885, 14161581, -1498944, -11477226, 23453206, -21559126, 18716930, -6649146, --11257109, 11868605, -11060615, 3266860, 3799972, -10804527, 9069360, -1949915, -722628, 5802501, --7536594, 9821516, -3211562, -762357, 2394444, -1683627, 3424163, -1653026, 527207, 2859375, --2796561, 4575214, -565862, -2619393, 5607080, -8749922, 4613869, -3897146, -1826972, 5440113, -423054, -1654099, 2795487, -2086817, 2774549, 1420024, -4085588, 2700461, 515396, -933619, --726923, 2436857, 490700, 4511327, -3606162, 1271847, 542777, -2574296, 4977330, -1470489, --835908, -25397216, -43562780, 54951424, 157414304, 24879672, 15255724, -115089016, -142278304, -45605572, --27970438, 96225520, 146793936, 75520024, 21888228, -49427556, -106209176, -96898224, -81145352, 6397354, -121610392, 101683352, 58327268, 19775640, -52042656, -67532992, -53611392, -51851528, -18273476, 24542516, -33777232, 69821672, 50016504, 12097849, -16935056, -10004589, -56225416, -27357868, -28411208, -38532300, -22922240, 43156904, 24987582, 62845036, 16710644, -14973867, -24150064, -41849088, -33033668, -5214627, --10208064, 12797929, 26032870, 23144506, 16578574, 11244224, -5708012, -22995254, -16218870, -19131394, -6162741, 22230750, 7362111, 5432060, -9651328, -20007032, -3718368, -86436, -273267, 16134045, -14504641, 16172162, 6418829, -5624260, -17357574, -25213068, -25744034, -16796006, 17878876, 26396332, -32813550, 22639310, -5685463, -12861816, -13588203, -27021250, -11897596, 9809705, 5207648, 4850092, -7888245, 3741454, 3037616, -4217121, -5394479, 4221953, 9392557, -233539, -790274, -6490233, --8856759, -4651450, -5372467, -3205119, 6969122, -1260573, 14554570, 17908404, 10395431, -6248641, --10171556, -11458973, -14414447, -10586021, -14265197, 7611756, 19707458, 17926656, 10654203, 11185169, -4268661, -11062762, -21550536, -22101902, -11191611, -2306934, 7006166, 15702937, 23120882, 18925236, -3592203, -12224014, -20303384, -14921253, -4921496, 124017, 5583995, 3523484, 8735963, 11130408, -3325379, -4839355, -6562173, -3712462, -2729452, -2689723, -744640, 784905, 5194763, 3124589, -372052, -63888, -309238, -997506, -2262911, -2369748, 716186, 729608, 443992, -177704, -214748, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +11153493, -5529771, 440234, -3299072, -253403, 4714264, 2237141, 2957622, -2580202, 3663607, +-3787624, 4112968, 2056216, 4956929, 2093797, -943819, -5597416, 6019397, 4151086, 1525250, +708670, 557272, -2378338, -2726767, 3114388, 1904818, 2035278, 2986076, -3037079, -237297, +2806224, 3318399, -432181, -2484639, -4712116, 11274, 881542, -2855617, 1067299, 751082, +-4247186, -2305324, -322123, 2150168, 49929, -2079301, 3968550, 730144, -1340030, -2947421, +-651761, 336618, -5545877, 2549063, 3478387, -1942399, 4453881, 3631932, -574989, 3001109, +1785633, 5879274, 1860258, 1086627, -912681, 2203318, -4737349, 592706, 2279554, -2368675, +2609193, 3119757, 3454764, 2131378, 4538707, -994285, -2746095, -1451162, -1157494, 578747, +-1041530, -3544959, 1677185, -1685775, -1846299, -2160906, 821413, -27380, -1074816, -879395, +1411971, 78383, -153008, -403727, -129386, 634581, 951335, -179852, -45634, -826244, +234076, -1465658, 148176, 933619, 1284732, -936840, -953483, 192200, 841814, -10582263, +-7401303, -1053878, -4765266, -4078608, 2007360, -6026913, -5810554, 1671816, -2631741, -2362232, +2419677, -1903744, -4115653, -450435, -310311, -1165547, -1882269, -1114007, -4720169, -296890, +-3403762, -2465848, -128312, 4218732, -936303, 6097780, -3169686, 3661997, 4212289, -4732517, +1650341, -1202054, 918586, -3352222, 1661079, 2160369, 3250753, -1673964, -3966402, -1387811, +-2173790, 1264331, 1544041, -4820027, -601832, -3312494, -2651606, 896038, -3938485, -6322729, +-1177895, 6192269, 1378148, 2161442, 344671, 1416266, 855772, 2273112, 2459406, 6944962, +530428, -3100430, -3981435, -868120, -1890323, -525060, -8060580, 1662152, -562104, 2565169, +-1066763, 704375, -1913408, -957778, 7913477, 1571958, 7257958, -2471754, -1306744, 540092, +2075543, 688805, 2471754, -2423972, 2683281, -2823941, -1725503, 1425392, 1058710, -120259, +144418, 42950, -590021, 181999, -1053341, -115964, -349503, -192737, 489626, 531502, +-573378, -1040456, -613643, 49392, 61740, 155693, 361314, -443992, -444529, -452045, +134218, -185220, 585189, 8590471, 9932649, 7619272, 5680094, 8010114, 3267933, 3473018, +-718333, 2265059, 8458401, 886374, 2588792, -3153580, -2079301, 6456947, -4329864, -7933342, +2408403, -6630893, 5721970, 1330903, 6863358, -2197413, -418759, -1705102, 2262911, 2727304, +-85899, -6755447, -1379758, 5757941, -3832722, 2587181, 1538135, -1318018, -1651415, 6400038, +4847408, 11176579, 4489315, 912681, 2689187, -963146, 688269, 3508988, 2109903, 9523016, +-4078608, -2739652, 671626, 2439542, -1495722, 4404489, -4136054, 841277, -266825, -3198677, +994822, 939524, -4305705, -5850819, -3605088, 4599910, 2241973, 537, -371515, 3466576, +266825, 1136556, 6047851, 2963528, -1438814, -981937, 5376226, -4679904, 619012, -4220879, +-1889786, -5449777, 1480153, -1149978, -3218541, -2129230, 3150896, 1922535, 563178, 1830730, +-3015604, -526670, -257161, 2316061, 67646, 146029, 431644, 676994, 1718524, 1907502, +1520955, 97174, 812823, 1724429, 98247, -1607392, 1468342, -826244, -314069, 336618, +-267362, 1261110, 1165547, 563178, -2684, -466541, -462246, 529892, 733903, 246961, +1120450, -2288144, -1449015, 1114007, -79994, 18690088, -331786, 9156333, -1661079, -1432372, +9819906, -9614284, -3331821, -750009, 4849018, 3368865, -2062121, 1869385, 904628, -8710194, +2198487, 4656282, 4132296, -9763534, -3438121, 1096827, -7005629, -1930588, 527744, 309238, +943819, -1083406, 4449049, -3161633, 3535295, 7308424, 7298760, -2134599, -4205847, -760746, +8221641, -483721, -457951, 47782, 793495, -4293357, 713501, 3449933, 500364, 805843, +3296924, -2215130, 2211908, 1278827, -929324, 5770826, 544924, 4583267, 883690, -1564442, +1982127, 3054796, 2625836, -157840, -4558571, -4147328, -5484137, -2455111, -225486, -22012, +-672699, 4027606, 3449933, -2666638, -5385352, 140660, 2736431, 3308736, -3313031, -642098, +3115462, -317291, -482647, 4163434, 1919314, 1953136, -1614371, -1388348, -301185, 1770600, +2646237, 19864, 1988570, 693100, 112743, 350577, 621160, 2465848, 1825361, 2779381, +-1496259, 1284195, 125628, 306016, -479426, 242666, 348966, 70867, 294742, -518617, +1275605, 1268089, -1308891, 266825, 673773, 771484, -487479, 2552821, -5022965, -13935558, +-3653944, -4718022, 877247, 2324651, -2402497, -2791192, -26329224, 526670, 8410083, -6139119, +-9884330, 7365332, -11182484, -1689533, -5032628, -5861557, -3692061, -3684008, 339302, 4461934, +-878321, 2484102, -2907156, 3362423, -2647311, -3993783, 1687922, -1502165, -6357626, -8040179, +3768297, 374736, 3718905, 1152662, 8408472, 1190780, 2868501, -4082903, -7135552, -2056753, +-3580929, 7045357, -3369402, 176094, 1755568, -3510599, 9787694, 6527814, 63351, -7866233, +-10048613, -3391414, 3240016, -9002251, -304406, -4382478, -8640400, 788663, -13485124, -2971581, +-1506460, -4991826, 8933532, -562641, -1500017, -152471, 5566278, 7200513, 2085744, -7217693, +-2413235, -1829656, 3805341, 1816771, 2150705, -4055523, -5246840, 4050691, 2682207, 1016834, +1283658, -254477, 2236604, 643708, 3410204, 990527, 734976, -294205, -179852, 558346, +2172717, 3207804, 1892470, -781684, 1202591, -4005594, 1998234, 2390149, -745177, -331786, +664109, -900333, -323196, -217433, -1304596, -1291175, -776852, -376347, 686121, 1597728, +-316217, -1842541, -77846, -2604898, 825707, 3589519, 1474248, 2123325, 1436130, 5578626, +-15049029, -22181896, 2692408, -5082557, 4913980, -6227703, -11041287, 250182, 10096931, 2045478, +6184753, 4935991, 3816615, 2438468, -3576097, 2688113, 6703370, -10564009, -4959614, -3529926, +-2385318, 3839164, -889595, 1306207, 6960532, 6059125, -2488397, -5966784, 1380295, -3350611, +-2550674, -5783174, -4013647, -8795556, 2105071, -3299072, -75699, 7778723, -1560147, 1478543, +2060511, -5606006, 4700842, 4631586, 6500433, -5711233, 10263898, -1680943, -7503845, -6349573, +-8208220, 7644505, -2887829, -8728447, 2653753, -1346472, -6145025, 6545530, 8798777, -3036542, +-7341173, 5452998, 1732482, 4276714, -634581, 11834782, 6957847, -6897718, -3422015, -3250217, +-2687576, 3958886, 5418638, 7030862, -9127, 941672, 2698313, -2773475, 2566780, -752156, +4539781, 6462852, -8741332, -3885872, -4406100, -2727841, -4501663, -325344, -3190624, 1500017, +-193274, -253403, -392990, 1202054, -2172180, 5503464, -704375, 2368138, 803159, 1175747, +-1090922, 256087, 125091, 369367, -1871532, 436476, -1227287, -1864016, -2911988, -795643, +-201863, -418759, 77846, 406411, -616328, -322123, -1116155, -934692, 1684701, -20713554, +-13959, -3762391, 1373316, -37581, 7816304, 5732708, 8096014, -1312649, 11043435, -5131949, +7510287, 9193377, 1695975, 9163313, 1980517, 2383170, -2566780, -935229, -3849901, 7265474, +-446140, -824634, 10234907, 6183143, 100395, 2759517, -865973, -340913, 6658273, -3801583, +-6577206, -3758, -907849, 3381750, -18609020, 11196980, 12080132, 4769025, 2355253, 322659, +-5913633, -12410845, 8205535, -5000416, -5640366, -3777424, 7365332, -5180805, 4545686, 4612258, +-4405563, -2917894, -10717554, 4938676, -6970732, 4140885, 694174, 3708168, 6519224, 10406706, +4465156, -4798016, -11443940, -2015950, 7004018, 11467563, 8608188, -1737314, -2275796, -7371238, +-12257300, -1297617, 8477192, 3783866, 2672007, -2720325, 11250130, -383863, 3781182, 1088774, +-2185602, 1063004, -5753646, -2799245, -2915746, 1911797, -1455457, -4106526, -2434710, -2838437, +-3081639, 1225139, -4380330, -1820529, 825171, 749472, 3359738, 175557, 461709, 575526, +-934692, 2750927, -889058, 3128884, 1112397, -904628, -2430415, -133144, 3001109, 2143189, +-405874, -2954938, -803159, 2596308, 2308008, 322659, -562641, -366683, -1816234, 1995549, +7925289, 27070642, 14795089, -1302986, 2630668, 2419140, 6029597, 10715407, -1428077, 2122788, +18177912, 1872606, -719407, 10947335, 7693360, -7514046, 4570919, 1121523, 7361574, 5042292, +-12503187, 9601936, -5748277, -800475, 1153199, 7523172, 1418413, 2059974, 5775121, 6568616, +-6162741, 6746857, 20080582, -3499325, 9180493, 9372692, -4903242, 7357816, 2011655, -4783520, +-5140002, 3584150, -4587562, -12414066, -1541356, -555125, 1347009, -15899432, -3822521, 4920422, +-10010495, -6761353, -16531329, 5508833, 7697655, -11329050, -3987877, -5456756, 12071006, 305480, +-6816650, -4799089, -7599408, 3856881, 10106058, -7135552, 3925063, -3030636, 4896263, 11373073, +4821638, 8959302, 9147743, 11354283, 1779190, -6363531, -6312528, 4550518, 7230578, 1036698, +4868346, -5093831, 2068027, -629213, -1549946, -5350456, 762357, -2380486, 332860, 4335233, +1864016, 1819992, 1492501, 4786204, -2959233, 156766, -787053, 1411434, -549219, 145492, +2063732, 521839, -1680943, 2548526, -554588, -3714610, 2302639, -2662880, -2108829, -2761664, +-5537287, 2964601, -1269700, 2501282, -295279, -558883, 738198, 4083440, 2769717, 3637301, +1705102, -92342, 1498944, 4193499, -1735704, 27827630, 7488276, 1127966, -1559073, -4036733, +221728, 5203890, -3329137, -6440841, -9475772, 710280, 6854231, -8483097, 4221416, 5564667, +-2335389, 18779208, 6696928, -4686346, -3153043, -1422708, 6804302, -2792803, -6209449, -6908992, +4377109, -15066208, 590558, -4263829, -5439576, 4797479, 1126355, -5538897, -3345243, -5324686, +7573638, -2502892, -11855720, -1474248, 338766, 860604, -6847789, -9755481, 985695, -1851131, +-1253057, 3269544, -1993402, 9073655, 1950989, 5396627, -5746130, 13223667, 3922916, -6664716, +8850854, 16737488, -4742718, -4172024, 8670465, 7888245, 3382287, 4780836, -10276783, -2810519, +-11116449, 3242164, 10580115, 4698694, -13044353, -2723546, 4242891, -13025562, -20258824, -1819992, +756451, 5721434, 18564460, 1416266, -2013803, -5830955, -4281546, 2833068, 4775467, 3870303, +-192737, 2019172, 272194, -4145717, 2623688, 3122441, -5107253, -5040144, 5703180, -1947231, +3391951, 2433636, 1758252, -1483911, 1301912, -213138, 2039036, 397821, 3048353, 2684, +2705293, 1745904, 684510, -2481417, 5527086, 1646583, 5055714, -1124208, -1553704, 1723893, +-3216394, -650151, 2461553, -3207267, 908922, 1714229, 1208496, 1090922, 2758980, -1133335, +-4726075, -153545, -399969, -5216238, 861678, -2240899, -21597244, 10154376, 28708098, -11808476, +20148228, -4558034, -4341675, -6311992, -10407780, 7714835, 296353, 5264020, 5217849, -18865106, +251256, 8759049, -7642895, -4059281, -11874511, 20998632, -13105556, 10351945, 9787157, -12527883, +-5151277, -4384088, 8820789, -10026064, -4078608, 10170483, -1770063, -2743947, -4956929, 12409234, +2196339, -2025614, -5102421, 314069, -9446781, 10229001, -1207960, 4698694, 25551834, 17132624, +-14700062, -10416906, 4021163, -1336272, 10695005, -5883032, -8615704, -3071975, -16022375, -6193880, +-1894618, -12315282, -7027104, 27303644, 6523519, 94489, -1331977, -302795, 8047158, 9620190, +-2019172, 9503689, 774168, -5217312, 1040456, -14565845, -1084479, -13495861, -7276749, 8141111, +11933567, -17895518, 7279433, -4580583, -5667210, 8681203, -1254667, -8231305, -452045, -3219615, +-6437619, 3321620, 2416456, -4493610, -11087995, -5339718, -1087164, -863825, 8812199, 2622078, +2229625, -4765803, 119185, -1952600, 4750234, 5285494, -2768643, 2269890, 4023848, 4352413, +3459059, 4947803, -1893007, 365609, -3325379, 293132, -3879966, -2077690, 1580011, -1067836, +-3109020, -729071, 1772211, -5243082, -2506650, -2831457, -1489280, -1985349, -2296734, -22871238, +3881040, 21264920, -5629629, -5392869, 4541391, -6566468, -5428302, 6019397, -852551, -1168768, +-315680, -14387067, 24401320, -25975962, -2564632, -570157, 8846022, 5385889, 254477, -9845676, +-7162395, 3136400, 19036368, -1527398, -8491150, -5733782, -13627394, -898185, -8033737, -6310381, +-2864206, 4277251, -525060, 662499, -9255118, 1872606, 2531883, 5896453, 4808753, 5937256, +-12537010, 83752, -2620467, 8217883, 1997160, 16645146, 3513283, -3819300, 1389959, -9009231, +-147640, 7287486, 9286256, -14233522, -11143830, -1006096, 14803142, -23251880, 6035503, 26917096, +14701136, -7150584, 2406256, -14409078, 6016713, 13321915, -22809498, 5127654, -11153493, -3082713, +-30894774, 207232, -13060459, 12065100, 752156, -14267344, 9445170, -861678, -18546206, -2408940, +-11755325, 7678328, -6582038, -9590125, 13063680, -2478196, 2257005, -4315906, -5767068, -1495186, +5543729, 4261682, -3224984, -732829, 169114, -3187403, 1974074, 3256122, 4577899, -4629975, +1786706, 2556579, -5640903, 418222, 2388002, -3929895, 321586, -2519535, 6107444, 3375844, +7446937, -3488050, -2867428, 2585034, -7217693, -689879, -2117419, -1052267, -436476, 1591285, +-4077535, 330712, -599148, 1477469, 1316944, 326418, -4115116, -6231998, -17362406, 27469000, +8078297, 14367202, -16182363, -18261664, -3241090, 4803921, -4947266, -2471217, 9358734, 2500745, +3004867, 8118025, -20089172, -2248416, 411780, 5108327, -13927505, 1814087, 2538863, -9825811, +-5260261, -13523241, -9994926, -110059, 4475356, -10953240, 958851, -4987531, -9561671, 3728569, +114354, 7705172, -21306796, -22435836, 4776004, -1971390, 8532489, 18728204, 2208150, -11868605, +16889422, -8422431, -15678241, -12209518, -5102421, 1286343, -16660715, -6533719, 16535087, 22278532, +9491878, 6191732, 4719096, -2648921, 14287746, 7978439, -16574816, -9138080, 130460, 1586990, +15625628, 9945534, 2529199, -2474975, -1904281, -7730941, 10374494, 8040716, 18020610, 4032974, +5260261, 2103997, 32339494, 3578782, 12532715, -13469017, 1158031, 12198781, -29294362, 2308008, +3873524, 8156680, -3043521, 4289599, -3835406, -1095217, 5017059, -2537252, 15516106, -6343130, +9063455, -2509872, -5529234, -3069828, -5981816, 49392, 2408403, 2924336, -1265942, -3128347, +6446209, -2074469, 4301947, -2442763, -2515240, -4866735, 4826470, 5165235, 1089311, 356482, +-4020090, -7016903, 3146064, -761283, 156229, 7984881, -2365990, 6969122, -1177895, 3994857, +2749853, 5316096, 1157494, -5282810, -1056025, 18524730, 1234266, 23019414, -827855, -10707890, +-11653320, -21792128, 3919695, -9266392, -668404, 1728188, 7727720, 11229729, 19123878, 19760070, +-3147674, 17575006, -1388348, -1675037, 6625524, 14788109, 6425271, 4039954, -23823646, -12331388, +-19385872, 9651328, 19278498, 3621194, -8428336, 13373991, 19339164, -2762201, 2945274, -4678830, +16249472, 13655312, 11637214, -7062000, -12373801, -2092723, -3259343, -27525908, 4714801, 3614215, +2377801, -7097971, -3699041, -30680026, -10873247, -27857694, -4915053, -20894480, -10823318, 19896972, +5254356, 20970178, 1344862, -17402134, -8460012, -18101676, -34395708, 4724464, -21274046, -6315750, +20208894, 8330626, 7925826, 1549946, -3888556, -1600949, 3951907, -14904073, 11832635, -25341380, +-26026964, -1559073, -2232846, -3362960, -19116362, -4457639, 25270514, -1491964, 1586454, -6848862, +-21834004, 11005854, -14667313, -5887327, -14598594, -9166534, -6795175, -4781909, -5224291, -3364033, +405874, 2492155, -13645111, -6009733, 2717641, 2354179, 7746511, 3488050, -4479651, -5879274, +5093295, -9366787, -1316408, 2772402, -7009924, 2156074, 2253784, 5070209, -4755603, -1781875, +-2490544, -468151, 3534221, -2121177, -201327, -2813741, 5561983, 7453379, -2379412, -1302986, +2144263, 2445984, 4849018, 6596533, 1337882, -1222992, -1499481, 10827613, 21814676, 18986976, +20456930, -11790222, -20521890, 15783468, -9327058, 16312823, 4903779, -26205206, 6609955, 4881767, +-29501594, 15863999, -13431436, -13735842, 8075613, 8979166, 1436667, 10658498, 835371, 532576, +-6892886, -3997004, 6512244, -4098473, -10088341, 680215, -18984292, 6874632, -24141474, -14697915, +938987, 9596031, -3259343, -9995463, 3792993, 7569880, 5675263, 447213, 19519552, -44758392, +-10118406, -12255152, -14819785, 19423990, -15608448, -2136746, -36056252, -10095858, -4237522, 1887638, +24129664, -5804112, 3099356, -14533632, 12267500, -18084496, -11659762, 9408126, -41864120, 6108517, +22467510, 29111826, 22291954, 14082661, 32792076, 18082886, -326954, -8089034, -8336532, -12651900, +-28152974, -3052648, 2707977, -39905616, -15721191, -12059194, -8934606, 12784507, 33514166, 39072392, +25952876, -13100724, 10756209, -8442295, -1747515, 8854075, 6099391, -3397856, 2202781, 2920041, +-685584, 1354525, -6046777, 3524558, 11067057, -5151277, 1566589, -9665824, 2483565, -4523675, +-550293, -468688, 8583492, 15027017, -5273146, 948651, 3773129, 6124087, -8965744, -14054207, +391916, 10954314, 3310883, -8962523, 8534100, 4427038, -8978092, 6394670, 4222490, -3500935, +-2651606, -966368, -1552631, 1657857, 3568044, -3190624, 6295349, -38429756, 52076, 6413460, +26948772, -8773544, 12455405, 11333345, 5961952, 6186901, -42038068, 33146410, 18051748, 41068476, +15065672, -1792612, -15291157, -9704479, -9589588, -14897094, 10586558, 7789997, -15150497, -17205638, +9038759, 12295418, 21408802, 5978058, -13383655, -19946902, 4159139, 3326989, 1311039, 2338073, +38035692, 12839268, 7208566, 12482786, 13706314, 15442555, 271657, -24254218, 16926466, 53067544, +-5529234, -14900315, -32452236, -7056095, 42749956, 4901632, 17620104, 5822902, -59381144, 12102681, +10508174, 1116155, 5954972, -4282083, 766652, 11948062, -32051194, -13390634, 26916024, 9888625, +3547643, -24182814, 16994648, 6198712, -21823802, -23673322, -15955804, 21332028, 44552232, 41450728, +45671608, 46326056, 1651952, -20921860, -17251274, -40886480, -13553306, 12647068, -33231236, -514859, +-27127014, 137976, 35919348, 13861470, 14653355, 17716740, 10958609, -11272142, -3921842, -13850733, +19391778, -12147241, -10763188, 3281355, -2560338, -7346005, -13286481, -4059818, 13094818, 12326019, +-6194417, 19210852, -1219771, 190052, -9166534, 2565169, 9743670, -2869575, -8008504, -7776575, +4676146, -4461934, 10642392, 6590628, 8537858, 12638478, -13640816, 3003793, 757525, 5577552, +-3161633, -6071473, 11278047, 2397129, 9115531, -5568962, 3042448, -8232379, -3031710, 18506478, +39304320, -79104704, -27183922, 5612449, -45367204, -42624328, -17676474, -26087632, 3467649, -19345070, +50361176, -5814312, -17083232, -7665443, -37550364, -11076721, -30185030, -13320304, 5966784, -40184252, +-6053220, 30222612, -25134148, -7914551, 9473087, -655519, 13443248, 2189360, 670552, 10962367, +4882841, -20211042, -3058017, 17053168, -8230231, -25048250, -7421167, -30268246, -14009646, -52650392, +5749888, -36020280, 17826262, 5860483, -12355010, -46495704, 4943508, -5384279, 57388280, 22052510, +1742683, 30289720, 14041859, -191126, 25724706, -29986924, -13324599, 1733556, 22841172, -24916716, +-14130979, 81717656, -7146826, 42104100, -32479080, -543850, -22997402, 17404818, -7701950, 27411556, +44479756, 705985, -30342334, 26135950, -32370094, -15459735, 11788075, -34744136, -22270480, -11383274, +25565792, 47102368, -55925844, 47225312, 10195715, 13495861, 5923297, 6254010, 5742372, -7475928, +9284646, 24259586, -11813308, 3903589, -1746441, 2797098, -26115012, -5238250, -7522635, 7659001, +8961986, 25959856, -15778099, -9969693, -12139725, 17890150, -22679038, 5218386, 9333501, 7531225, +9414568, -38922604, -8448738, 13487271, -5898601, -16860430, -1423245, 4148939, 1722819, 15931644, +9024263, 12569759, -12210592, -11953968, 13918378, 3483219, 9623948, -9053791, 9692131, 5696201, +2499134, 2945811, -2809446, -4368519, 1028108, -29680908, 61337500, -35249332, 22557706, 20098300, +-31913754, 17479444, 9641665, 6868727, -5671505, 24203214, 12526272, -30871152, 21869436, 25410638, +4945655, 4269735, 15387257, -452582, -30671436, 39799852, -22766012, 8959302, -16937204, -3965866, +4992900, -7532836, 32456530, 7228430, -4317516, -7886097, -1728188, 6283001, -33088428, 10395431, +-17173426, -11668889, -7974144, -170188, -16263967, -7813620, 3891777, 34215320, 316217, -7301982, +-21922050, 9025337, 5979132, 902480, 26571888, -6596533, -2839510, 31562104, 9898289, 1718524, +-30642444, -16131360, 19659140, 10899016, -28714004, 772557, -65161096, -32382980, 58272504, -13823889, +31484258, 41191956, 11683385, 6874095, 18635864, -8151848, -22938884, 12104292, 3764002, -1663226, +26243324, 16935592, -19002546, -45628120, -9494562, 18320720, 5811091, -1301912, 14642617, -17374216, +25400436, -12702366, 9448928, 11681774, 5123359, 17268990, 13179644, 20976620, 2316061, -5744519, +7584912, 20320028, -5480379, 17758080, 10705743, -11890617, 3539590, 9319542, 6350646, 3694746, +12824235, 10557566, 4645544, 21310554, -6926172, 2226941, -3199214, -1634772, -5570036, 18888730, +15734076, 12454331, -6069863, 2189897, 22462142, -6106907, 16445430, 14614163, -44560, 25635586, +-23467164, 3084860, 35392680, 4341138, 9975598, -7570954, 24894168, 4635344, 34817152, -10747082, +-58195732, 9895605, -7023882, 20044612, 6117107, -19729470, 10212895, 12011413, -22508312, -24697136, +-16550120, -41238664, -41522672, 28557238, -6638409, -42649024, -13100724, 4364761, 14085882, 13500693, +-26151518, -28333900, 2755759, 39402568, -18881214, 15198279, -26550414, 9408663, -29949880, 19463718, +20532628, -14691473, -30823370, -21211232, -3466039, 12053826, -13250511, -8746701, -11037529, -39209292, +-33886756, 17708150, -28455232, -5858873, 10095858, -23521388, -37936908, 14419279, 19859392, -2597382, +-45664092, 20352776, 17879948, 57647588, 239444, 15086073, 11271605, -24718074, 9415105, -7732015, +-49902688, -7713225, 30466350, 7181186, -25256556, -62668940, 39507256, 50442244, -15044734, 40782324, +47543140, 2365453, 2130304, 37502580, -24372328, 1798518, 62941136, -46510200, 26975078, -39855684, +-10936597, -3330210, 27095338, -9299141, 3921842, 15114527, -491774, -35291208, 38757248, -7132330, +-4560182, 5862631, 16180752, -26554172, 11578158, 6713571, -3997004, 7969312, 9423695, -24617142, +-3323768, 5623723, 12886513, 26679264, -2258079, -23589572, 11948062, 27384174, -21862458, 26707718, +-12692702, -2950106, -9419400, 30129196, -20893942, 7066832, 18897320, -13168370, 4753992, 3227668, +-17411798, 3704946, 7532836, -3423089, -13214541, 8490613, 10998338, -6270116, 21855478, -32947768, +8114804, 9451612, 479963, 1843078, 22563610, -5069672, 12657269, -26199300, -82958368, 22434224, +-9587978, 61962956, -21329882, -13605383, -24897388, -70965208, 32439352, -41350872, -24209120, 1274532, +-116501, 54758148, -39202852, -27409408, 36019208, 21478058, 18760418, -6782827, 17922362, -12677133, +-18096308, -16605954, 42241540, 35188668, 54930484, -17467632, -20617990, 998580, -3673271, 20211580, +-33140504, 7125888, -34831112, 18615998, 34078420, 11746199, -28144384, 19184546, -24816322, 55819544, +28362890, 7931194, 7473780, -8582955, -43789340, 24760486, -59385440, 12433930, 11016054, 29033442, +22980222, -51228224, 15430207, -32255742, -19198504, 14000520, -5116380, 19171660, 12230993, -46832860, +19138912, 43101608, 56913148, -16477642, 16809428, -23204098, 39943732, -56719340, -3005403, -10296110, +17919678, 37389300, 53625888, -42883636, 10692858, -57398480, 36928664, 75728328, -19220516, -51527796, +-4144644, -38849588, 49700288, 12663711, -25367150, -7126962, 2895882, -8446590, 35501124, 13418552, +-20044612, 19153406, -28385438, 1903744, 26653494, -5506685, -32715840, 36341864, -52207476, 15192910, +-7863548, 20931524, -1293322, 13023951, -12016782, -6388227, 5339181, 4643397, 5568962, 24828670, +-25310242, -21232170, 1212791, 5774047, -5821292, -26372172, -19295140, 38765836, 10475962, -17149804, +-19804094, -44125956, 52938692, 41467372, -16082505, -14120779, -30808338, 1226750, 39571144, -65168076, +46535972, -6029597, -1832340, 15484968, 12962748, 18437758, 5099200, 9034464, -22964116, 21797496, +5909875, -23331336, 15726560, -9244917, -431107, 21314848, 12249784, -33216204, 18631032, -15684147, +27653146, -20119238, 6947110, -10245644, 12831215, -9760850, 5859409, -14568529, 31811750, -2743410, +794569, 9570798, 10612327, -16065325, -3444027, 7380365, 10554882, 9806484, -11294153, 4141959, +381715, -32292786, -2780455, 8512088, 11829951, 5298916, 7549479, -29033442, 4549981, -1575179, +2847563, 6830609, -5864241, 6468221, 4767414, 2878165, -7144678, -6452115, -2346663, 33879240, +-11963095, 6852084, 12443057, -6927246, 11834782, -13424457, 11401528, 6113349, -9184788, -13504988, +8478802, -8243116, 6627135, -12131135, -10700911, -4716411, 15403900, -3862786, 1388885, 3237869, +-1226213, 3828427, -12387223, 9426379, -8029978, 20545512, -19097036, 8999030, -11435350, 10276783, +-9358197, 8242042, 125091, 13912473, -12050604, 6555194, -6215892, 801548, 2338610, 8239895, +-8681740, 2103997, -9360344, 13187697, -11085311, -2977486, 6534256, 2785823, -5459441, -1520955, +7393786, 5019206, -18207976, 10189810, 802085, 170188, -2005750, 3723737, -2354179, 1992865, +-1494649, 2407866, 514859, 4782446, -5214627, 13001940, -16545825, 51849920, -3747896, -16776679, +-25608742, -11626476, -14381161, 18817862, 10864120, -13663902, 1125818, 1620813, 6129455, 852014, +13008382, 4502737, 10241886, -3510599, -384936, -3071439, 4792110, 11125039, -10340671, -60666, +-5126581, 367757, 13538274, -7685307, 1303523, -3470871, 5323075, 2760590, -7456063, -2753611, +7960722, -2448668, 12991202, 9256728, -13595182, 4354023, 2859375, 7124277, 2991982, -12830141, +8665633, -2401961, 8426726, 6757594, -15337865, 4202626, 24696, 3448322, -1730335, -6729677, +10900627, -2685965, 4935991, 259846, -3301756, 5054103, -6542846, -918049, 9086540, -6260989, +-7532836, 15180562, -9826885, 14161581, -1498944, -11477226, 23453206, -21559126, 18716930, -6649146, +-11257109, 11868605, -11060615, 3266860, 3799972, -10804527, 9069360, -1949915, -722628, 5802501, +-7536594, 9821516, -3211562, -762357, 2394444, -1683627, 3424163, -1653026, 527207, 2859375, +-2796561, 4575214, -565862, -2619393, 5607080, -8749922, 4613869, -3897146, -1826972, 5440113, +423054, -1654099, 2795487, -2086817, 2774549, 1420024, -4085588, 2700461, 515396, -933619, +-726923, 2436857, 490700, 4511327, -3606162, 1271847, 542777, -2574296, 4977330, -1470489, +-835908, -25397216, -43562780, 54951424, 157414304, 24879672, 15255724, -115089016, -142278304, -45605572, +-27970438, 96225520, 146793936, 75520024, 21888228, -49427556, -106209176, -96898224, -81145352, 6397354, +121610392, 101683352, 58327268, 19775640, -52042656, -67532992, -53611392, -51851528, -18273476, 24542516, +33777232, 69821672, 50016504, 12097849, -16935056, -10004589, -56225416, -27357868, -28411208, -38532300, +22922240, 43156904, 24987582, 62845036, 16710644, -14973867, -24150064, -41849088, -33033668, -5214627, +-10208064, 12797929, 26032870, 23144506, 16578574, 11244224, -5708012, -22995254, -16218870, -19131394, +6162741, 22230750, 7362111, 5432060, -9651328, -20007032, -3718368, -86436, -273267, 16134045, +14504641, 16172162, 6418829, -5624260, -17357574, -25213068, -25744034, -16796006, 17878876, 26396332, +32813550, 22639310, -5685463, -12861816, -13588203, -27021250, -11897596, 9809705, 5207648, 4850092, +7888245, 3741454, 3037616, -4217121, -5394479, 4221953, 9392557, -233539, -790274, -6490233, +-8856759, -4651450, -5372467, -3205119, 6969122, -1260573, 14554570, 17908404, 10395431, -6248641, +-10171556, -11458973, -14414447, -10586021, -14265197, 7611756, 19707458, 17926656, 10654203, 11185169, +4268661, -11062762, -21550536, -22101902, -11191611, -2306934, 7006166, 15702937, 23120882, 18925236, +3592203, -12224014, -20303384, -14921253, -4921496, 124017, 5583995, 3523484, 8735963, 11130408, +3325379, -4839355, -6562173, -3712462, -2729452, -2689723, -744640, 784905, 5194763, 3124589, +372052, -63888, -309238, -997506, -2262911, -2369748, 716186, 729608, 443992, -177704, +214748, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -2868501, -10933913, 1274532, 2968359, 1044751, 1568737, -2637647, -6599754, -1277753, 3503083, 1244467, --3261491, -461709, 2681670, -691490, -3928821, 1185948, -4530117, -2815888, -130460, 1247151, --1280974, -1028108, 2824478, -3917547, -83215, 494458, 1903744, 1498944, 1451162, 4781373, -2170032, -5949604, -1506997, -2706903, 762357, -157840, -440771, -3748433, -4872104, 6461779, --2976412, 1576790, 1890323, 1615982, -6127845, -3492345, -1599339, 672162, -472983, -196495, --556198, 1029182, 2347200, -3213709, -1074, 1714766, 2008971, 2384244, 886374, 38655, -2319282, 815507, -998580, -300648, 3761318, -2793339, -2944200, -1597191, -1178969, 3202972, -1900523, 758062, -1195075, 3085934, -1376000, 1596117, -3653407, -355409, 282931, 753230, -759672, -2958696, 799401, 2081985, 1051730, 346282, -265751, 2725694, 1301912, -283468, -1751810, 1033477, 454730, -408559, 587337, 462783, 380105, -529892, 665183, 179852, --550830, -445603, 946503, 199716, -93416, 2684, 36507, 149787, -883690, 622770, --248571, 486942, -695785, -6215355, -3741990, 2647847, -6080063, -8597451, 1672353, 738734, -1060857, 1256815, 1210644, -7391102, -1206886, 2146410, -4686346, 4924717, 4787815, 4108136, --1661079, 377420, 1112397, 3146064, 717796, -106837, 619549, -2138894, 1985886, -772557, --778463, -1005559, 6073084, -3623342, 2102387, -2287070, -1969243, -2054068, 1611687, 3321084, --3543885, -1767379, -1919850, 2430415, 2289218, 3692598, 2510409, 492848, 3236258, -2756295, -1945620, 739271, 845572, 6776922, 1603633, 3350611, -5561446, -1502165, 2294050, -2783139, -2639258, -1203128, -2046552, 724239, 4067334, 2742337, 1876364, -995359, 833224, 3030636, --3667365, 4837744, -659278, 3964792, -1610613, 3271155, 3906273, 3288871, -1836635, -4880157, --7202660, -4866198, 470299, -2553358, 4758824, 788663, 745714, 1272384, -3395709, -1052267, --1527398, 1708323, -918586, -654446, 2096481, -2560338, -903554, 1013075, -1420560, 117575, --1585380, -1267552, -1003949, -285078, -1690607, 10443750, 7504382, 6148783, 5117454, 5767068, -2436320, -454730, -127238, -2141578, -638340, 7587597, -3311420, -3413425, 5236102, 3886946, -5034239, -3518652, 1524713, -1330366, 1138166, 2243047, 3143379, 460098, -2293513, -1704565, --2951180, -1054415, -1823214, -5381594, -651761, 4531728, -3526168, -613643, 1676648, -2772402, --2510409, 2563559, -1382980, -3594351, -1924682, 2048699, -3069828, -3954054, -1801202, -1173600, -1336809, -2758443, -5714991, 406411, -938987, -799401, 1660005, -4691715, -2281165, 88047, --1953673, 2589329, -651224, 1118839, -8416525, -2551211, 4778688, -1875290, -4628364, 1385664, -834297, 1311039, -1713692, -6677601, -3019362, 7523172, 526670, 2776160, 1606318, -1074816, -2308545, 3138547, 1334661, -1549946, -3579318, -1074, 916439, -2718178, 1253057, -3524558, --340376, -2245194, -1079111, -2974265, -544387, -1697049, -2139968, -1662689, 355409, -735513, -410706, -806917, 324270, -1495722, 1104344, 586800, -383326, -267899, 1429687, -24159, --471373, -1328219, -653909, -597537, -67109, 136902, 68183, 14810121, 9098351, 8611946, -158377, 865973, 693100, -3520800, -7835631, -2953327, 5924371, -4465156, 2684892, 8012799, -650151, -2524904, -996969, -1608465, -844498, 3249143, 4604742, 178778, 1359357, 1893007, -3002182, 196495, -4210142, 1315334, -6786049, -2028298, -857383, -1870458, -1233729, 864362, --1625108, -3543885, -2778307, -1263257, 290984, -1509144, -4119948, 4914517, -1841467, 377420, --1278290, -3186866, 4010426, 11205570, 2684355, -3867081, 6599754, 1536525, -2054605, 2039036, --1163936, -4283156, -2147, -1781338, 1646583, -3707094, -6485938, 279173, 1047972, -7812009, -2313914, 1645509, 4350265, 2511482, 5757941, -1936493, -3935801, -2269890, -1246077, 2842195, --1062468, -5014911, 3404299, -2434173, -4615479, 3151969, -4610648, -2484102, 1414655, -1634235, -1553168, -1070521, -1923072, 1540283, 3852586, -877784, -1946694, -675384, -36507, 1381906, -2697776, 804770, -830539, -999654, -1034013, -314606, 614180, -1959579, -726386, -565862, -2960843, 1538672, 2085207, -340913, 131533, 1654636, 1068373, 806380, -125628, 290447, --7620883, -12045773, -3698504, -6026913, 8631274, -1969779, -1056562, 3232500, -7967701, -5613523, -4781909, -3860102, -3585224, -198105, -325881, 849867, 3150359, -1324461, 1433445, -2076617, --1545115, -147103, -1367410, -3490735, -314069, -749472, 3645890, 3692598, 3237869, -4323959, -2007360, 1465658, 6047851, -3047279, -226023, -2072322, -4628364, 6592238, -6252936, -3067681, --2435247, 1557463, 5468567, -5059472, 5657009, -609885, 3049427, 4719096, 765041, 3639448, --6735583, 1489817, -2540473, 354335, -7133941, 141197, -2458869, -6380174, -4907537, 391379, -4713727, 256624, -3434900, 5375152, -1843078, 3115462, -421981, -6620692, 9280887, -5782100, --1147293, -3284576, 2320893, 3777961, 2496987, 3486440, 7516193, 5746130, -955630, 1210644, -3551401, 2248416, -2670933, 3828963, 2977486, -549219, 1694902, -3731253, -5158793, -539018, --1658931, 2914135, -3021510, -616328, -2903935, -659278, -1330366, -419833, 878858, 1091995, -601295, -114890, -724239, 1757179, 893890, -1787780, 1311039, 98784, -4463008, -385473, --1599875, 2571075, -673773, -288300, 942745, -476205, 899796, 2019708, -123480, 1315334, -1399623, -255014, 529892, 2842732, 3246995, -8528731, -12162811, 1367947, 1023813, 688805, -7844758, -2533494, -8531953, 910533, 999654, -2245194, -484258, -7499013, -1474784, 945430, -1124745, 8412767, -1460826, 7540889, -1809255, -1930588, 641024, -7458748, 3201361, -2802466, -4564477, -1245004, -1909113, -2761127, -1342714, 282394, -5571647, 9677635, -6680285, -10846940, -3264175, 516470, -7612830, -2237141, -14624901, 271120, -5196911, -52076, -5643587, -4573604, -813359, 539555, 2542084, -4610648, 3717294, -5204964, -10089952, 1226213, 2820183, -3042448, -3334505, -1711545, -5588826, -4919348, -6799470, -3215320, -704375, 1141388, -2018635, 6354404, -42950, -1952600, 573378, 406948, 1341104, 1009854, 767725, -6048925, -5654862, 1229434, -4049617, 2403034, 691490, -1314797, 5025112, 2775086, -2304250, -1694365, -5569499, -2286533, -2523830, 1201517, -3023120, 1253594, -822486, -879931, -1402307, -1745367, -581968, -2310156, --1738925, 981400, 492848, 1415729, 2434710, 208306, 2140504, 122407, -1358820, 2014340, -1283658, -387621, 325881, -1126892, -1108102, -16643, 137976, -1264868, 94489, -377420, --22549, 0, -240518, 1313723, -2052458, -321586, -584116, 118112, 763967, 1344862, --18781356, -4739497, 763967, -4818954, -3489124, -6023692, 1564979, 2085207, 4292820, -3253975, --3995393, -4561792, 2280628, 5031018, -2505040, -2188823, -1274532, -802622, 2411087, -10507637, --2576444, 5898064, 1942936, -3095061, 1133335, 5222144, -504122, -1362578, 1846836, -354335, -12878459, -5559835, 3158949, 1012539, -5407901, 1760400, 1221381, -6186901, 4363687, -8781598, --840740, 7730941, 1714766, -245887, -1621350, -6008659, -5160940, 1362042, 3343632, -2273112, -1633698, 6404870, 3193845, -2684892, 3969624, -5718212, -13400835, -1791001, -5880347, 3714610, --3763465, 9510131, 4779225, -452582, -1553704, -12363600, 3905199, 4707821, -3778498, 7535520, --5854041, 2291902, -9817221, 4549981, 3457986, -11201275, -7111392, -2304250, 2776160, 3709778, -8168491, -1138703, -381178, 5288716, 1241246, 22549, -2349347, 1208496, 1241782, 1587527, -1751273, 431107, -201327, -1019518, -1142461, -3019362, -2491618, 2010045, 1443109, 1035624, -2512556, -1009854, 1222992, 1272384, -616328, 2149631, -267899, -17180, -492311, -2426120, --511101, 2800319, 649614, 2081449, -751082, 768799, -1078574, 3330747, 338766, 2795487, -1254131, -1359894, 751082, 4720706, 7927436, 18341658, 19556596, 3929358, 5861020, 63888, -2795487, 184147, 2064269, -5224291, 2431488, -3245922, 4336307, 4109747, 10071698, 1559610, --2032593, 6317897, 4555887, 7597261, 379031, 4728759, 2749853, -2335925, 2366527, 11304354, -1801202, -4873714, -2627446, 8366597, 5173825, 4027069, 7777649, -5976447, 2336462, 9270687, --9230422, -11031087, 3649649, 5919539, 9624485, -4167192, -7179575, 5827197, 2113661, -870268, -3619584, -1457068, -878321, -52613, 13696651, -4951561, 2777233, -3302830, -2122251, -1612760, -7141457, -944893, 15939697, 7645042, -7654169, 8909373, 1941862, 4153234, 1914482, 1935957, -2171643, -2917894, 5376762, -12609487, -3333432, 5770826, -12845173, 4398047, -10380399, 2437931, -11452530, 2832531, -79994, 3148211, 1087701, -3083787, 769336, -3277597, 373125, 2639794, --7723425, 4423280, -1409286, -1837172, 513785, 2394444, -2031520, -3077881, 1030792, 2781528, --1479079, -2604361, -2571612, -1506460, 1061394, -1840394, -1657857, 1731946, 2410551, 1130113, --1292785, 1576790, -1155346, -3980361, -1813013, -64961, -2038499, 1131724, 808528, 1661616, -2692945, 3967476, -1897302, 5597416, -1981054, -3280281, -1135482, 1980517, 408022, -3335579, --2182917, 30239790, 5273146, 4748623, -8848170, 13032005, -4322348, -580357, -3419331, 715112, --8469139, -654446, 4021700, 941672, -6896644, 8595303, -2058363, -4480188, 1262184, 2684892, --8880919, -12520903, 5211406, -5179731, -7364795, 1438277, -13959, -3811247, 6543920, -6581501, -2193655, 6326487, -1094680, 9225053, 2940979, -11724724, -12208981, -5249524, 824634, 2212445, --9640054, 3481608, 3553012, 1824824, 3147137, 4254702, -10019622, -5032091, 2952253, -11226508, --4019016, -282931, -11573326, -6235219, -3932580, 2337536, -5908802, -12635794, -5945309, -6758668, -14664092, 7050189, -1152662, 1988033, -3876745, 11614128, 13996762, 1555315, 9396315, 6808060, -2738042, 1669669, -5354214, -1184337, -4723927, 6765647, -8877697, 290984, -2105071, -13700409, --4106526, -1983201, 7473243, -6784438, 3767760, 3190087, 1434519, 707059, 3263638, -3280281, -2612414, -1980517, 2895882, -730681, 4264366, 1230508, 401043, -2222109, -784368, -5353677, -2904472, -746787, 4582730, -4369056, 28454, -455267, 2746632, -479963, 2457795, 1025423, -1354525, 1288490, 719944, -2927557, 3419331, 4303557, -2153926, -3103651, -3599183, -1508070, --201863, -1307281, 405338, -20629802, 13928042, 22355304, -16768626, -9987410, 4606353, 4010963, --3401614, 7346005, 1998234, -6250251, -7636989, -156229, -2452963, -5452998, 2793339, -2506114, -359704, 6184753, -8315057, 1753957, 1119376, -4936528, 712965, -7841537, 1537598, 11520713, -5880884, -1148904, -3693672, -938987, -6566468, -6992744, 3452080, 5831492, -1828046, -3215857, --2283849, 3491809, 5815386, 2794950, 10646150, -5713917, 4389994, -2748242, 1062468, 6645925, --2370285, -2087354, -12639552, -1927367, -9782325, 4940823, 3383361, 12618077, -10783589, -3968013, --10436234, -17194902, -2870649, 7195681, -11865384, 2652679, -1294933, -8657043, -10203769, -12873628, -17330730, 670015, 10303090, 7574175, 8756901, -3935801, -11488501, -8697846, -10749229, 3782793, -8471286, -8049843, 3835943, 9028021, -6069863, 1051730, 7333120, 8414378, 2047089, -2987150, -3629247, -1484448, 1952600, -8928163, -787053, 3455301, -3003256, 1167694, 591095, 404801, -2037962, 3393561, -3504157, -1244467, 2092186, 3025805, 883153, 1480690, 2976412, -612570, -3213709, -2652679, 2215130, 3229816, 3621731, 416612, -1312113, 2814814, -2233383, 711891, --471373, -1920387, -914828, -1894081, -473520, 916439, -2318209, -6519761, 2353105, 3587908, --16137803, 11657078, -1468342, -6052146, 9983115, 3525631, -9722195, -13922136, -5378910, 35970, -284005, 666257, -4963372, 15816754, 6555194, 4773856, 3651259, 4968204, -4816269, 1189706, -3142842, 2304250, 14212047, 1471563, -21182242, 2597918, 8813273, -7912404, -11909944, -2533494, --6467684, -3833258, 990527, 14963666, 8968965, -1531693, -344671, -4530117, -13116830, -4450660, --10834592, 7719667, 10581189, 120259, -5877663, -2157147, -2429878, 4836133, 6737730, 7132330, --16522202, 3171833, 572841, 1444183, 11492259, -6719477, 4708358, -6133214, -4405026, 1197759, -7523172, 13517873, -2141578, -8766565, 2840047, -15769509, 12591770, 6780143, -1551557, -6521908, -3409667, -3652333, -7770133, -6481106, -7042673, -3376918, -1470489, 468151, 6676527, -5101348, -18344880, 762357, -2771865, 1050656, 5484673, 246424, -192737, 5945309, 4109747, 3067144, -246424, -2883534, -2211908, -685584, -384936, -2659659, -7415798, 3940096, 3768297, -2808909, -1064615, -4125853, -3051038, -1423245, -767725, -103079, 6602439, -1345399, -2010582, -1058173, --333397, 4036733, 7355132, -2376728, 4149475, -1097364, -4508642, 5291400, -4885526, -3986804, --2577517, -4023311, 926639, 3124052, 1656247, 3203509, 119185, -1179505, -222265, -3251290, -2036888, -1855426, -6988986, -1709934, 7741142, -13870060, -3935801, 8979703, -11275363, -1156957, --1119376, -1501628, -13132399, 13056701, 5661841, -9087077, -1561758, -3894462, -3328063, -19956566, --2797634, -9115531, -22526030, 4818954, 3489661, -10242960, -8470749, -12071542, -13744432, 11724187, -6617471, 12342662, 442382, 25894358, 1222992, 13528610, 18614388, -2150168, 5695127, 19177566, --12908524, 5919539, -7776039, 13195213, -4136591, 25691420, 11676942, -7989176, -12070469, 2012192, -5960878, 10720238, 2886218, -9283572, -2136209, 8511015, 19092740, -7965554, 12806519, -4656819, -7817914, -14937896, 5905043, -8118562, 5915244, 983011, 1973538, -2705293, 11802570, 16478716, --29925184, 9090298, 6238977, 4456029, -5456219, 3948686, -21468930, 1840930, 385473, -3337727, --8200167, -7119445, -7092602, -2056753, 15321222, -8813273, -5178120, -12402255, 456340, 11018202, --5510980, -6148246, 8530879, -303332, 6196564, 1381369, -1510755, 156766, 2736968, -5922223, -3008088, 1201517, -5093295, -4263829, -2488397, 1498944, 3457986, 3558917, 10385768, -1095217, -7867843, 3870303, 2567317, -5182415, -1609002, -7828652, -3532074, -1300301, -2619930, -3714073, -4358318, 2529199, 5206037, 6671158, 1256278, -1500554, -841277, -4257923, 2596845, 14920180, -15857019, -3458523, 16487306, -846109, -3438658, 1302986, 9270687, -3470871, -4198868, -1925219, --11718818, 1924682, -3358128, 18461916, 12152610, -8798777, -9322763, -17526150, -6416681, 12729209, -22930294, -10434623, 7083475, 1537061, 3017752, 12492986, 8940511, -17955110, 3566970, -6409165, --3649112, -7406134, -4048544, -7816304, -17307644, 3034931, 11573863, 4439923, 27108760, -6586869, --3739306, 18837726, -6867653, -1046898, -4204236, 4993437, -20686710, -13272523, 7186554, 15477988, -22548578, 26919782, -19782082, -10257993, -1040456, 9008694, -890132, 30544734, 8497056, 4570382, --23698018, 1650341, 170725, 11464341, 14950244, -11136850, -3696893, 4679904, -4860293, 5906, -16986596, 6135898, -16797618, 4389994, 8857833, -8057896, 26418344, -9129490, -14128832, -19824496, -14658723, -3165928, -16646756, -13186623, -3023120, -606127, -6624450, 404264, -7211787, 1414118, --10040560, 714038, 4904853, -3450469, 3862786, 781147, -6072547, 693637, -96100, -1149978, -647466, -4107063, 4987531, 68719, -2546379, 5723581, 5791227, 282394, -1598265, 2572686, --5458367, -2245194, -4385699, -800475, 4504884, -3520800, 1971390, 4470524, -8209830, -2905546, --1692754, 1385664, -1552094, 3572339, 7949448, -2210298, -4752382, -2279554, 5133560, 1496796, -483184, 4156455, -2386391, -1664837, -1498407, 3672734, 31316218, 14855218, -8227010, -2637647, --28894392, 2261300, 7649337, 2028298, 43103220, -5435281, -3260954, -18917184, -16356846, 6732361, --13373991, -8152385, -8968429, -6015639, 10710575, -6972880, -12295418, -10586021, 963146, 10829223, --13904957, 3158412, 6291590, 1422171, 15554224, -1776506, 1224066, -15776489, -22244172, -9131100, -10198400, -12242267, 2981781, -10273025, -38836704, -20879984, 11647414, 866510, -22252226, 3466576, -31008054, -1396401, -799938, -12069395, 6788733, -13321915, -23939610, 641024, 3644817, -9253507, -4603668, 9051644, -2212445, -7790534, 6468221, 8422431, 15564425, -8909373, 11700028, 15025943, -6324340, 26102664, 2937221, -16159814, 19017042, 1193464, 3196530, -3416647, -3809099, 11791833, --11602317, -1616518, 28933584, 22732188, -14013941, 14572287, -4168803, 26892400, 11330124, -9242770, --21404506, -868657, -7809325, -9236864, 6074158, -8313983, -222265, -2073932, -7457674, -12474733, --2422362, 10699837, -11393474, 142808, -7060926, 1173063, 4515085, -4538170, -13332115, -2267743, --6288369, 8237211, 4975183, -3163244, -8804683, -3576634, -9474698, 5834713, -4628364, 3219078, -3791919, 5571110, 4414690, -7291781, -5191542, -8202851, 2517388, 5456756, 757525, 10748693, -11335492, 6245956, 4645544, -22498650, -23877870, -28525026, 39322036, -21771726, 5166309, -1205812, --12511240, 19969450, -23490250, 10159208, 41813656, 25741350, 5959267, -33907156, -1919850, -22371948, --11365020, -20429548, -1957431, 5806796, -3695283, 16065325, -7740068, 2672007, 7924215, 22451942, -3105261, 3099893, 27156542, -17889612, -2554969, 11985106, -5262409, -13874892, -9241159, 13692356, --11958263, 5742372, 23240068, -6474663, -41962368, -2563559, 10473815, -51515984, 31060130, 23970212, --19569482, 31947578, 21626234, 14256070, 33112588, 712428, 16997334, 1962800, 1974074, 11938398, --21103858, 21019034, 28515362, 21973052, -22719304, -4438849, 31341450, -15235860, 24840480, 22814866, -53289808, 32174674, 1782948, 3689377, -6950331, 6690486, 9235253, -30920006, -44302588, -15411953, -3787088, 1650341, -6423124, 34622268, 16256451, 6522445, -15293305, 13728863, -10859825, -13677323, --7059853, 15673946, 18185428, 3521873, -3365107, -3517578, 466541, -21451214, -5162551, -5540508, -6853694, 3985730, -11218991, -8480950, -611496, 16909824, -4807142, -6518150, 351650, -6750615, --17235704, 8575976, -3798362, -6704981, -10154913, 59056, 5581847, 1119376, -30578020, -1727651, -14895483, -2280628, 481573, 2506650, 4229469, 12776991, 10040023, 446140, -271120, -4907537, --1715839, 24009940, 29700236, -58271968, -53360672, 23273354, -15335181, -16805134, -6995428, -20308752, -7216082, -32898912, 41539848, 15617038, -17307108, -372052, -16929688, -12733504, -13645648, -15623480, --10123775, -39684424, -35655208, -6651831, -8095477, 2268280, 3390340, 6899328, -2501282, 5061619, -6649683, 17656610, 19559818, -7377680, -9875740, -11581916, -9816685, -22458920, 33427730, -11805791, -8158827, 24814710, 23466628, -8907225, -10043244, -18701362, -12270722, -15357192, 25693568, 2731599, -3176128, -31793496, -11268920, 45938972, -4451197, 42768212, -8637179, -16035260, -10104984, -18126372, --18551574, -3413962, 207232, -25523380, 2145336, 12183748, -1031866, 9573482, -58887224, -23810224, --16486232, 31259846, -7472706, 5135171, 10683194, 49080740, 13928042, -4537633, -5001490, 42261404, -25534118, 6222871, 8247411, -2177012, 33564632, -14004815, -19142132, 10334765, 15775415, 28003186, -26064546, -15289547, 17688286, 13217762, 14253923, 4227322, -10193568, -20143934, -17093970, 10632728, -14751602, 7866770, 5302137, 17407502, -1721208, -4836670, -1001264, -1469416, 9069360, 5432060, -11836393, 20682416, 14607721, 23660974, 6387153, -21314312, 6752763, 5668820, 18501108, -369904, -14496051, 6167036, 13939853, 301185, -26785564, -3482682, -5893232, -1820529, -30786862, 63946696, --20648592, -12836047, 37896644, -24022826, -36273148, 33646236, -48828408, -14120242, 11511586, 8386461, --34059628, -13357348, 29237452, 190589, -5761162, -19013284, 22948548, -22762252, 1509681, 18067854, --6027450, 16589848, 119185, -8189966, 5557688, 3943317, -9889699, 15774878, -8677445, -3514894, -4712116, -308701, 982474, -2960306, 4684736, 10012106, 16183974, 23295902, 11427834, -9619116, --2682207, -14773614, 13659607, -4912369, -21345988, 5015448, 91805, -12160663, -29180544, 20550882, -1560147, -13503914, 32991254, 1899449, -10205379, -5949604, 48863308, -45703284, -49195628, 30003568, -46837156, -86405616, 428423, -31983548, -29031832, -12853227, 31449362, -24286430, 41618232, -5889474, --1019518, 55919400, -15781857, -43290584, 53761180, 63311040, -61478700, 68732360, -23152022, 1693828, -56829396, -19017042, -21735756, 15581068, 15282031, -7307887, -2860985, 10545218, 2111513, 1345399, --13512504, 18687402, 121870, -1222992, 372052, 2507724, 8458401, 5106716, -6801081, -7454453, -7878581, 18633178, -16115254, -14958834, -3998078, 19510962, -659814, 10421201, -2801929, 4342749, -108985, 4444218, -2192581, -3431679, -23021024, -9687836, 5816997, -8335458, -2281165, -8201777, --12412455, 19476066, 12228309, -33921116, 13589813, 17575006, -3391414, -148713, -11884711, 17394618, -38050188, -17785460, -24105504, -6626598, 6039798, 38674032, 28889024, -10097468, -3077344, 12076911, -31471372, -10482941, -1763084, 19302120, -24736328, -21269752, 16958142, -11293617, -8426189, -10400800, --935766, -17135846, 1374926, 11746736, -7198902, 9070971, -8058433, -5069135, -5075041, -23701778, -3547643, -9602473, 14549202, 31022548, 1734630, 15457050, 12850005, 1176821, 5889474, 9702331, -32948304, -23301272, 15936476, 13982266, -16833050, 11272679, 11014444, 3494493, -14936286, -29933238, --30234422, 9970230, 10878615, -11437498, -50545860, 41115720, -13824426, -22165790, -12774843, 41359460, --19437412, 45229764, 24159, 15187004, -42562052, 40240084, -18420040, 17823040, -5429913, -58272504, --18344880, 11468100, -35974648, 36999532, 3990025, -53426172, -60051696, -30914638, 41766408, 10306311, --37273872, 45449880, -48877264, -2412698, 88286808, 13205414, 5028333, 8773544, 6701760, -23175106, -24138254, 1786170, 12338904, -15555835, 23202488, -12817793, -12207371, -10239202, -1293322, -641561, -7033009, -2332167, -3403762, 4549981, -8077223, -16724066, 15217069, -5619428, -2609730, -19845434, -9072045, 4403415, 8610336, 2354179, 9934259, -7368017, 2345589, 27445914, -3192235, 285615, -14552423, -15604153, -3285113, 802085, -1561221, 10673531, -11041287, 11983496, -4191888, -31039728, -2005750, -8117488, 9125195, -10331544, 12004970, -19273666, -36839544, 155156, -39133056, 10743861, --3497177, -6998649, 13070659, 21617108, -13874355, 3105798, 23742042, -18612240, 32206350, -4294431, --35455492, 30411590, -14638859, -6500433, 27066348, -34686156, 9135932, 594316, 12579422, -5443871, --12743705, -52939232, 12135430, -21845814, -53192096, 64297272, -43289512, -18022220, -8601209, -14628122, --32676112, 18341120, 44362180, -27451820, 12446278, -39824548, -22540526, -22686554, 20045150, 3621194, -58214524, -10005663, -4864051, -17358648, -50228568, 68719, 24410984, -18551038, 20490216, 24661702, --20807506, 2090039, -17744658, -74177840, -38924752, -22820234, -77961176, 49844168, 65639448, 30890478, --66104380, -53117472, -118581896, 17160542, 140966192, 65222300, 24903830, -37044092, -130065032, -29527900, -30109868, 88916024, 89147952, -60568704, -51250772, -23785528, 11633993, 6155762, 96846680, 1641751, --11803644, 7897371, -9600863, -23633594, 34070364, 6129992, -7305740, 18867254, -15446850, -26361436, -18700288, 16195248, -44914084, 30264488, -6719477, -9883257, -23929948, 25419764, -24179056, 29092498, --14308684, 29777008, -35100084, 14052596, -9810242, 472446, 25376814, 41511396, 11761231, -15420543, --10966125, -2581275, 22942104, -3663607, 32989106, -25796648, -20305532, 9495099, 32703492, 3846680, -19938848, -55810952, 40487048, -7945690, -8863202, 1005022, 18234284, 345745, -3493956, 13492640, -4639102, 4494147, 21510270, -13631689, -151934, 11170136, -3894999, -2030446, 13562433, -12593381, --3056943, 3814468, 21319144, -14095546, -10006737, 11934640, -566936, 6699075, -21124796, 27702540, --6608344, 9347459, -6060199, 3567507, 15090904, 6642167, -3554622, 12986370, -4957466, 13125420, --10358387, -776852, 13534516, -3125126, -5653251, -27354110, 2752537, 21137144, 2189360, 9904731, --13872207, -4398047, -8319889, -8702141, -3599720, 15289547, -5617817, 9315784, -12087649, -14403710, --6218039, 3419331, 27925878, -10732586, 12676059, 835371, 2739116, -13676250, 7425999, 14512694, -735513, -13222057, 10167261, -8812199, 6798933, -5378373, -3940096, -5145908, 1844152, 10178536, --5181878, -2617246, 4656282, -613643, -7789997, -1660542, 7543037, 6443525, -6763500, 1134408, -6887517, 281857, -4278861, 1114544, -6807523, 5050882, -475131, 2579128, -3121904, 1312113, -4365835, -2214056, 5124970, 984084, 4669703, 3597572, -7684770, -7755101, -2675765, 13538811, --8674760, 9403294, 7482907, -5510980, -14035953, 10593537, -9028558, 11970074, -1165547, -1999307, --4974646, 1984812, 1949378, -740882, -1642825, 1003412, 53126060, 10568304, -28496034, -20215338, --31471910, -9958419, 6036577, 16723529, -5236639, -6734509, -5835250, -5586679, -5319317, 7654706, --3896609, -1047972, -1703491, -5514738, -1343251, 8413841, 1180042, -2405719, -8410620, 9654013, --12513924, 7366943, -4484483, -12235288, 27917, 5614596, 6261526, 4946192, -7268696, 1642288, --2348810, -3937411, 14738180, -13117904, -2427194, -503585, -936840, 1416802, -2228551, -7689602, -6471979, -12205223, 11643656, -1673964, -8229158, 2869575, -4260071, 10423886, -6104223, -3631932, -11181947, -10006737, 3465502, -4766877, -1135482, 8644159, -6171868, -2395518, 7678865, -5243618, -1998770, 842350, -6288906, 15275051, -13326747, -1083942, 5832566, -3330747, 9701794, -4360466, --2173790, 2598992, 3185792, -995359, 2131915, -806917, -4335770, 3921842, -26307, 433255, -2098629, -221191, 3016141, -3008625, 871342, 666794, 663572, -321049, -1913408, 2541010, --375810, -598611, -1815161, 2253247, 3561602, -1156957, -1849520, 1173063, 2075543, -2580202, -2166811, -1932735, -1730335, 5786395, -891743, 2171106, 3005940, -3908420, 9734007, -3145527, --523449, -436476, -5637145, 5876052, -3646427, -5775658, -25152402, -37796784, 49539764, 154542592, -13232794, 13455059, -105353400, -133264784, -27765890, -28225452, 78500728, 133611600, 68563784, 13200045, --48343080, -94068376, -66399120, -47472812, -2462627, 65096136, 95122792, 51408076, 11780558, -33348810, --59278064, -33192044, -31935230, -29908542, 18905372, 38758320, 38200512, 38485056, 9254044, -16681116, --6844568, -25353728, -39690328, -4395899, -11834246, -8008504, 35840964, 20709796, 29942902, 18161806, --13572634, -32659468, -7864085, -21226802, -3277060, 14849313, 4552666, 8024073, 16199006, -8208756, --11488501, -2643552, -6749004, 6538551, 10460393, 569083, 12912819, 7662222, -13550085, -13035763, --20772072, -17764522, 792421, 21435644, 32492502, 15651935, 4112968, -7550553, -21744346, -3730179, --24518358, -15043660, 11550241, 9060234, 27470074, 9254581, -6986301, 8094403, -14235669, -24707874, -4353486, 6267431, 8288750, 7658464, -1542430, -3087545, -2360085, -10273562, -7870528, 5388574, -8386461, 8431558, 8557722, -2370822, -8266739, -5481452, -3172907, 218506, -170188, -9354439, -2397129, 11777874, 6357626, 7328825, -2181844, -11855183, -6885907, -7000260, 2737505, 8310225, -5484137, 5132486, 2222646, -1700807, -8991514, -11849278, -5422933, 719407, 7320772, 11674795, -7150584, 7191923, 4540854, -7441031, -13795972, -17713518, -11482595, 4935991, 9909026, 12851079, -17835926, 5404143, -5371394, -9043591, -7332583, -5459441, -5149666, -5248450, -1543504, 3941169, -7832947, 6881612, 5398774, 3718905, 799938, -5079336, -8754754, -8478265, -4339528, -273267, -3159485, 3179350, 1852742, 339302, 267362, -92879, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +10933913, 1274532, 2968359, 1044751, 1568737, -2637647, -6599754, -1277753, 3503083, 1244467, +-3261491, -461709, 2681670, -691490, -3928821, 1185948, -4530117, -2815888, -130460, 1247151, +-1280974, -1028108, 2824478, -3917547, -83215, 494458, 1903744, 1498944, 1451162, 4781373, +2170032, -5949604, -1506997, -2706903, 762357, -157840, -440771, -3748433, -4872104, 6461779, +-2976412, 1576790, 1890323, 1615982, -6127845, -3492345, -1599339, 672162, -472983, -196495, +-556198, 1029182, 2347200, -3213709, -1074, 1714766, 2008971, 2384244, 886374, 38655, +2319282, 815507, -998580, -300648, 3761318, -2793339, -2944200, -1597191, -1178969, 3202972, +1900523, 758062, -1195075, 3085934, -1376000, 1596117, -3653407, -355409, 282931, 753230, +759672, -2958696, 799401, 2081985, 1051730, 346282, -265751, 2725694, 1301912, -283468, +1751810, 1033477, 454730, -408559, 587337, 462783, 380105, -529892, 665183, 179852, +-550830, -445603, 946503, 199716, -93416, 2684, 36507, 149787, -883690, 622770, +-248571, 486942, -695785, -6215355, -3741990, 2647847, -6080063, -8597451, 1672353, 738734, +1060857, 1256815, 1210644, -7391102, -1206886, 2146410, -4686346, 4924717, 4787815, 4108136, +-1661079, 377420, 1112397, 3146064, 717796, -106837, 619549, -2138894, 1985886, -772557, +-778463, -1005559, 6073084, -3623342, 2102387, -2287070, -1969243, -2054068, 1611687, 3321084, +-3543885, -1767379, -1919850, 2430415, 2289218, 3692598, 2510409, 492848, 3236258, -2756295, +1945620, 739271, 845572, 6776922, 1603633, 3350611, -5561446, -1502165, 2294050, -2783139, +2639258, -1203128, -2046552, 724239, 4067334, 2742337, 1876364, -995359, 833224, 3030636, +-3667365, 4837744, -659278, 3964792, -1610613, 3271155, 3906273, 3288871, -1836635, -4880157, +-7202660, -4866198, 470299, -2553358, 4758824, 788663, 745714, 1272384, -3395709, -1052267, +-1527398, 1708323, -918586, -654446, 2096481, -2560338, -903554, 1013075, -1420560, 117575, +-1585380, -1267552, -1003949, -285078, -1690607, 10443750, 7504382, 6148783, 5117454, 5767068, +2436320, -454730, -127238, -2141578, -638340, 7587597, -3311420, -3413425, 5236102, 3886946, +5034239, -3518652, 1524713, -1330366, 1138166, 2243047, 3143379, 460098, -2293513, -1704565, +-2951180, -1054415, -1823214, -5381594, -651761, 4531728, -3526168, -613643, 1676648, -2772402, +-2510409, 2563559, -1382980, -3594351, -1924682, 2048699, -3069828, -3954054, -1801202, -1173600, +1336809, -2758443, -5714991, 406411, -938987, -799401, 1660005, -4691715, -2281165, 88047, +-1953673, 2589329, -651224, 1118839, -8416525, -2551211, 4778688, -1875290, -4628364, 1385664, +834297, 1311039, -1713692, -6677601, -3019362, 7523172, 526670, 2776160, 1606318, -1074816, +2308545, 3138547, 1334661, -1549946, -3579318, -1074, 916439, -2718178, 1253057, -3524558, +-340376, -2245194, -1079111, -2974265, -544387, -1697049, -2139968, -1662689, 355409, -735513, +410706, -806917, 324270, -1495722, 1104344, 586800, -383326, -267899, 1429687, -24159, +-471373, -1328219, -653909, -597537, -67109, 136902, 68183, 14810121, 9098351, 8611946, +158377, 865973, 693100, -3520800, -7835631, -2953327, 5924371, -4465156, 2684892, 8012799, +650151, -2524904, -996969, -1608465, -844498, 3249143, 4604742, 178778, 1359357, 1893007, +3002182, 196495, -4210142, 1315334, -6786049, -2028298, -857383, -1870458, -1233729, 864362, +-1625108, -3543885, -2778307, -1263257, 290984, -1509144, -4119948, 4914517, -1841467, 377420, +-1278290, -3186866, 4010426, 11205570, 2684355, -3867081, 6599754, 1536525, -2054605, 2039036, +-1163936, -4283156, -2147, -1781338, 1646583, -3707094, -6485938, 279173, 1047972, -7812009, +2313914, 1645509, 4350265, 2511482, 5757941, -1936493, -3935801, -2269890, -1246077, 2842195, +-1062468, -5014911, 3404299, -2434173, -4615479, 3151969, -4610648, -2484102, 1414655, -1634235, +1553168, -1070521, -1923072, 1540283, 3852586, -877784, -1946694, -675384, -36507, 1381906, +2697776, 804770, -830539, -999654, -1034013, -314606, 614180, -1959579, -726386, -565862, +2960843, 1538672, 2085207, -340913, 131533, 1654636, 1068373, 806380, -125628, 290447, +-7620883, -12045773, -3698504, -6026913, 8631274, -1969779, -1056562, 3232500, -7967701, -5613523, +4781909, -3860102, -3585224, -198105, -325881, 849867, 3150359, -1324461, 1433445, -2076617, +-1545115, -147103, -1367410, -3490735, -314069, -749472, 3645890, 3692598, 3237869, -4323959, +2007360, 1465658, 6047851, -3047279, -226023, -2072322, -4628364, 6592238, -6252936, -3067681, +-2435247, 1557463, 5468567, -5059472, 5657009, -609885, 3049427, 4719096, 765041, 3639448, +-6735583, 1489817, -2540473, 354335, -7133941, 141197, -2458869, -6380174, -4907537, 391379, +4713727, 256624, -3434900, 5375152, -1843078, 3115462, -421981, -6620692, 9280887, -5782100, +-1147293, -3284576, 2320893, 3777961, 2496987, 3486440, 7516193, 5746130, -955630, 1210644, +3551401, 2248416, -2670933, 3828963, 2977486, -549219, 1694902, -3731253, -5158793, -539018, +-1658931, 2914135, -3021510, -616328, -2903935, -659278, -1330366, -419833, 878858, 1091995, +601295, -114890, -724239, 1757179, 893890, -1787780, 1311039, 98784, -4463008, -385473, +-1599875, 2571075, -673773, -288300, 942745, -476205, 899796, 2019708, -123480, 1315334, +1399623, -255014, 529892, 2842732, 3246995, -8528731, -12162811, 1367947, 1023813, 688805, +7844758, -2533494, -8531953, 910533, 999654, -2245194, -484258, -7499013, -1474784, 945430, +1124745, 8412767, -1460826, 7540889, -1809255, -1930588, 641024, -7458748, 3201361, -2802466, +4564477, -1245004, -1909113, -2761127, -1342714, 282394, -5571647, 9677635, -6680285, -10846940, +3264175, 516470, -7612830, -2237141, -14624901, 271120, -5196911, -52076, -5643587, -4573604, +813359, 539555, 2542084, -4610648, 3717294, -5204964, -10089952, 1226213, 2820183, -3042448, +3334505, -1711545, -5588826, -4919348, -6799470, -3215320, -704375, 1141388, -2018635, 6354404, +42950, -1952600, 573378, 406948, 1341104, 1009854, 767725, -6048925, -5654862, 1229434, +4049617, 2403034, 691490, -1314797, 5025112, 2775086, -2304250, -1694365, -5569499, -2286533, +2523830, 1201517, -3023120, 1253594, -822486, -879931, -1402307, -1745367, -581968, -2310156, +-1738925, 981400, 492848, 1415729, 2434710, 208306, 2140504, 122407, -1358820, 2014340, +1283658, -387621, 325881, -1126892, -1108102, -16643, 137976, -1264868, 94489, -377420, +-22549, 0, -240518, 1313723, -2052458, -321586, -584116, 118112, 763967, 1344862, +-18781356, -4739497, 763967, -4818954, -3489124, -6023692, 1564979, 2085207, 4292820, -3253975, +-3995393, -4561792, 2280628, 5031018, -2505040, -2188823, -1274532, -802622, 2411087, -10507637, +-2576444, 5898064, 1942936, -3095061, 1133335, 5222144, -504122, -1362578, 1846836, -354335, +12878459, -5559835, 3158949, 1012539, -5407901, 1760400, 1221381, -6186901, 4363687, -8781598, +-840740, 7730941, 1714766, -245887, -1621350, -6008659, -5160940, 1362042, 3343632, -2273112, +1633698, 6404870, 3193845, -2684892, 3969624, -5718212, -13400835, -1791001, -5880347, 3714610, +-3763465, 9510131, 4779225, -452582, -1553704, -12363600, 3905199, 4707821, -3778498, 7535520, +-5854041, 2291902, -9817221, 4549981, 3457986, -11201275, -7111392, -2304250, 2776160, 3709778, +8168491, -1138703, -381178, 5288716, 1241246, 22549, -2349347, 1208496, 1241782, 1587527, +1751273, 431107, -201327, -1019518, -1142461, -3019362, -2491618, 2010045, 1443109, 1035624, +2512556, -1009854, 1222992, 1272384, -616328, 2149631, -267899, -17180, -492311, -2426120, +-511101, 2800319, 649614, 2081449, -751082, 768799, -1078574, 3330747, 338766, 2795487, +1254131, -1359894, 751082, 4720706, 7927436, 18341658, 19556596, 3929358, 5861020, 63888, +2795487, 184147, 2064269, -5224291, 2431488, -3245922, 4336307, 4109747, 10071698, 1559610, +-2032593, 6317897, 4555887, 7597261, 379031, 4728759, 2749853, -2335925, 2366527, 11304354, +1801202, -4873714, -2627446, 8366597, 5173825, 4027069, 7777649, -5976447, 2336462, 9270687, +-9230422, -11031087, 3649649, 5919539, 9624485, -4167192, -7179575, 5827197, 2113661, -870268, +3619584, -1457068, -878321, -52613, 13696651, -4951561, 2777233, -3302830, -2122251, -1612760, +7141457, -944893, 15939697, 7645042, -7654169, 8909373, 1941862, 4153234, 1914482, 1935957, +2171643, -2917894, 5376762, -12609487, -3333432, 5770826, -12845173, 4398047, -10380399, 2437931, +11452530, 2832531, -79994, 3148211, 1087701, -3083787, 769336, -3277597, 373125, 2639794, +-7723425, 4423280, -1409286, -1837172, 513785, 2394444, -2031520, -3077881, 1030792, 2781528, +-1479079, -2604361, -2571612, -1506460, 1061394, -1840394, -1657857, 1731946, 2410551, 1130113, +-1292785, 1576790, -1155346, -3980361, -1813013, -64961, -2038499, 1131724, 808528, 1661616, +2692945, 3967476, -1897302, 5597416, -1981054, -3280281, -1135482, 1980517, 408022, -3335579, +-2182917, 30239790, 5273146, 4748623, -8848170, 13032005, -4322348, -580357, -3419331, 715112, +-8469139, -654446, 4021700, 941672, -6896644, 8595303, -2058363, -4480188, 1262184, 2684892, +-8880919, -12520903, 5211406, -5179731, -7364795, 1438277, -13959, -3811247, 6543920, -6581501, +2193655, 6326487, -1094680, 9225053, 2940979, -11724724, -12208981, -5249524, 824634, 2212445, +-9640054, 3481608, 3553012, 1824824, 3147137, 4254702, -10019622, -5032091, 2952253, -11226508, +-4019016, -282931, -11573326, -6235219, -3932580, 2337536, -5908802, -12635794, -5945309, -6758668, +14664092, 7050189, -1152662, 1988033, -3876745, 11614128, 13996762, 1555315, 9396315, 6808060, +2738042, 1669669, -5354214, -1184337, -4723927, 6765647, -8877697, 290984, -2105071, -13700409, +-4106526, -1983201, 7473243, -6784438, 3767760, 3190087, 1434519, 707059, 3263638, -3280281, +2612414, -1980517, 2895882, -730681, 4264366, 1230508, 401043, -2222109, -784368, -5353677, +2904472, -746787, 4582730, -4369056, 28454, -455267, 2746632, -479963, 2457795, 1025423, +1354525, 1288490, 719944, -2927557, 3419331, 4303557, -2153926, -3103651, -3599183, -1508070, +-201863, -1307281, 405338, -20629802, 13928042, 22355304, -16768626, -9987410, 4606353, 4010963, +-3401614, 7346005, 1998234, -6250251, -7636989, -156229, -2452963, -5452998, 2793339, -2506114, +359704, 6184753, -8315057, 1753957, 1119376, -4936528, 712965, -7841537, 1537598, 11520713, +5880884, -1148904, -3693672, -938987, -6566468, -6992744, 3452080, 5831492, -1828046, -3215857, +-2283849, 3491809, 5815386, 2794950, 10646150, -5713917, 4389994, -2748242, 1062468, 6645925, +-2370285, -2087354, -12639552, -1927367, -9782325, 4940823, 3383361, 12618077, -10783589, -3968013, +-10436234, -17194902, -2870649, 7195681, -11865384, 2652679, -1294933, -8657043, -10203769, -12873628, +17330730, 670015, 10303090, 7574175, 8756901, -3935801, -11488501, -8697846, -10749229, 3782793, +8471286, -8049843, 3835943, 9028021, -6069863, 1051730, 7333120, 8414378, 2047089, -2987150, +3629247, -1484448, 1952600, -8928163, -787053, 3455301, -3003256, 1167694, 591095, 404801, +2037962, 3393561, -3504157, -1244467, 2092186, 3025805, 883153, 1480690, 2976412, -612570, +3213709, -2652679, 2215130, 3229816, 3621731, 416612, -1312113, 2814814, -2233383, 711891, +-471373, -1920387, -914828, -1894081, -473520, 916439, -2318209, -6519761, 2353105, 3587908, +-16137803, 11657078, -1468342, -6052146, 9983115, 3525631, -9722195, -13922136, -5378910, 35970, +284005, 666257, -4963372, 15816754, 6555194, 4773856, 3651259, 4968204, -4816269, 1189706, +3142842, 2304250, 14212047, 1471563, -21182242, 2597918, 8813273, -7912404, -11909944, -2533494, +-6467684, -3833258, 990527, 14963666, 8968965, -1531693, -344671, -4530117, -13116830, -4450660, +-10834592, 7719667, 10581189, 120259, -5877663, -2157147, -2429878, 4836133, 6737730, 7132330, +-16522202, 3171833, 572841, 1444183, 11492259, -6719477, 4708358, -6133214, -4405026, 1197759, +7523172, 13517873, -2141578, -8766565, 2840047, -15769509, 12591770, 6780143, -1551557, -6521908, +3409667, -3652333, -7770133, -6481106, -7042673, -3376918, -1470489, 468151, 6676527, -5101348, +18344880, 762357, -2771865, 1050656, 5484673, 246424, -192737, 5945309, 4109747, 3067144, +246424, -2883534, -2211908, -685584, -384936, -2659659, -7415798, 3940096, 3768297, -2808909, +1064615, -4125853, -3051038, -1423245, -767725, -103079, 6602439, -1345399, -2010582, -1058173, +-333397, 4036733, 7355132, -2376728, 4149475, -1097364, -4508642, 5291400, -4885526, -3986804, +-2577517, -4023311, 926639, 3124052, 1656247, 3203509, 119185, -1179505, -222265, -3251290, +2036888, -1855426, -6988986, -1709934, 7741142, -13870060, -3935801, 8979703, -11275363, -1156957, +-1119376, -1501628, -13132399, 13056701, 5661841, -9087077, -1561758, -3894462, -3328063, -19956566, +-2797634, -9115531, -22526030, 4818954, 3489661, -10242960, -8470749, -12071542, -13744432, 11724187, +6617471, 12342662, 442382, 25894358, 1222992, 13528610, 18614388, -2150168, 5695127, 19177566, +-12908524, 5919539, -7776039, 13195213, -4136591, 25691420, 11676942, -7989176, -12070469, 2012192, +5960878, 10720238, 2886218, -9283572, -2136209, 8511015, 19092740, -7965554, 12806519, -4656819, +7817914, -14937896, 5905043, -8118562, 5915244, 983011, 1973538, -2705293, 11802570, 16478716, +-29925184, 9090298, 6238977, 4456029, -5456219, 3948686, -21468930, 1840930, 385473, -3337727, +-8200167, -7119445, -7092602, -2056753, 15321222, -8813273, -5178120, -12402255, 456340, 11018202, +-5510980, -6148246, 8530879, -303332, 6196564, 1381369, -1510755, 156766, 2736968, -5922223, +3008088, 1201517, -5093295, -4263829, -2488397, 1498944, 3457986, 3558917, 10385768, -1095217, +7867843, 3870303, 2567317, -5182415, -1609002, -7828652, -3532074, -1300301, -2619930, -3714073, +4358318, 2529199, 5206037, 6671158, 1256278, -1500554, -841277, -4257923, 2596845, 14920180, +15857019, -3458523, 16487306, -846109, -3438658, 1302986, 9270687, -3470871, -4198868, -1925219, +-11718818, 1924682, -3358128, 18461916, 12152610, -8798777, -9322763, -17526150, -6416681, 12729209, +22930294, -10434623, 7083475, 1537061, 3017752, 12492986, 8940511, -17955110, 3566970, -6409165, +-3649112, -7406134, -4048544, -7816304, -17307644, 3034931, 11573863, 4439923, 27108760, -6586869, +-3739306, 18837726, -6867653, -1046898, -4204236, 4993437, -20686710, -13272523, 7186554, 15477988, +22548578, 26919782, -19782082, -10257993, -1040456, 9008694, -890132, 30544734, 8497056, 4570382, +-23698018, 1650341, 170725, 11464341, 14950244, -11136850, -3696893, 4679904, -4860293, 5906, +16986596, 6135898, -16797618, 4389994, 8857833, -8057896, 26418344, -9129490, -14128832, -19824496, +14658723, -3165928, -16646756, -13186623, -3023120, -606127, -6624450, 404264, -7211787, 1414118, +-10040560, 714038, 4904853, -3450469, 3862786, 781147, -6072547, 693637, -96100, -1149978, +647466, -4107063, 4987531, 68719, -2546379, 5723581, 5791227, 282394, -1598265, 2572686, +-5458367, -2245194, -4385699, -800475, 4504884, -3520800, 1971390, 4470524, -8209830, -2905546, +-1692754, 1385664, -1552094, 3572339, 7949448, -2210298, -4752382, -2279554, 5133560, 1496796, +483184, 4156455, -2386391, -1664837, -1498407, 3672734, 31316218, 14855218, -8227010, -2637647, +-28894392, 2261300, 7649337, 2028298, 43103220, -5435281, -3260954, -18917184, -16356846, 6732361, +-13373991, -8152385, -8968429, -6015639, 10710575, -6972880, -12295418, -10586021, 963146, 10829223, +-13904957, 3158412, 6291590, 1422171, 15554224, -1776506, 1224066, -15776489, -22244172, -9131100, +10198400, -12242267, 2981781, -10273025, -38836704, -20879984, 11647414, 866510, -22252226, 3466576, +31008054, -1396401, -799938, -12069395, 6788733, -13321915, -23939610, 641024, 3644817, -9253507, +4603668, 9051644, -2212445, -7790534, 6468221, 8422431, 15564425, -8909373, 11700028, 15025943, +6324340, 26102664, 2937221, -16159814, 19017042, 1193464, 3196530, -3416647, -3809099, 11791833, +-11602317, -1616518, 28933584, 22732188, -14013941, 14572287, -4168803, 26892400, 11330124, -9242770, +-21404506, -868657, -7809325, -9236864, 6074158, -8313983, -222265, -2073932, -7457674, -12474733, +-2422362, 10699837, -11393474, 142808, -7060926, 1173063, 4515085, -4538170, -13332115, -2267743, +-6288369, 8237211, 4975183, -3163244, -8804683, -3576634, -9474698, 5834713, -4628364, 3219078, +3791919, 5571110, 4414690, -7291781, -5191542, -8202851, 2517388, 5456756, 757525, 10748693, +11335492, 6245956, 4645544, -22498650, -23877870, -28525026, 39322036, -21771726, 5166309, -1205812, +-12511240, 19969450, -23490250, 10159208, 41813656, 25741350, 5959267, -33907156, -1919850, -22371948, +-11365020, -20429548, -1957431, 5806796, -3695283, 16065325, -7740068, 2672007, 7924215, 22451942, +3105261, 3099893, 27156542, -17889612, -2554969, 11985106, -5262409, -13874892, -9241159, 13692356, +-11958263, 5742372, 23240068, -6474663, -41962368, -2563559, 10473815, -51515984, 31060130, 23970212, +-19569482, 31947578, 21626234, 14256070, 33112588, 712428, 16997334, 1962800, 1974074, 11938398, +-21103858, 21019034, 28515362, 21973052, -22719304, -4438849, 31341450, -15235860, 24840480, 22814866, +53289808, 32174674, 1782948, 3689377, -6950331, 6690486, 9235253, -30920006, -44302588, -15411953, +3787088, 1650341, -6423124, 34622268, 16256451, 6522445, -15293305, 13728863, -10859825, -13677323, +-7059853, 15673946, 18185428, 3521873, -3365107, -3517578, 466541, -21451214, -5162551, -5540508, +6853694, 3985730, -11218991, -8480950, -611496, 16909824, -4807142, -6518150, 351650, -6750615, +-17235704, 8575976, -3798362, -6704981, -10154913, 59056, 5581847, 1119376, -30578020, -1727651, +14895483, -2280628, 481573, 2506650, 4229469, 12776991, 10040023, 446140, -271120, -4907537, +-1715839, 24009940, 29700236, -58271968, -53360672, 23273354, -15335181, -16805134, -6995428, -20308752, +7216082, -32898912, 41539848, 15617038, -17307108, -372052, -16929688, -12733504, -13645648, -15623480, +-10123775, -39684424, -35655208, -6651831, -8095477, 2268280, 3390340, 6899328, -2501282, 5061619, +6649683, 17656610, 19559818, -7377680, -9875740, -11581916, -9816685, -22458920, 33427730, -11805791, +8158827, 24814710, 23466628, -8907225, -10043244, -18701362, -12270722, -15357192, 25693568, 2731599, +3176128, -31793496, -11268920, 45938972, -4451197, 42768212, -8637179, -16035260, -10104984, -18126372, +-18551574, -3413962, 207232, -25523380, 2145336, 12183748, -1031866, 9573482, -58887224, -23810224, +-16486232, 31259846, -7472706, 5135171, 10683194, 49080740, 13928042, -4537633, -5001490, 42261404, +25534118, 6222871, 8247411, -2177012, 33564632, -14004815, -19142132, 10334765, 15775415, 28003186, +26064546, -15289547, 17688286, 13217762, 14253923, 4227322, -10193568, -20143934, -17093970, 10632728, +14751602, 7866770, 5302137, 17407502, -1721208, -4836670, -1001264, -1469416, 9069360, 5432060, +11836393, 20682416, 14607721, 23660974, 6387153, -21314312, 6752763, 5668820, 18501108, -369904, +14496051, 6167036, 13939853, 301185, -26785564, -3482682, -5893232, -1820529, -30786862, 63946696, +-20648592, -12836047, 37896644, -24022826, -36273148, 33646236, -48828408, -14120242, 11511586, 8386461, +-34059628, -13357348, 29237452, 190589, -5761162, -19013284, 22948548, -22762252, 1509681, 18067854, +-6027450, 16589848, 119185, -8189966, 5557688, 3943317, -9889699, 15774878, -8677445, -3514894, +4712116, -308701, 982474, -2960306, 4684736, 10012106, 16183974, 23295902, 11427834, -9619116, +-2682207, -14773614, 13659607, -4912369, -21345988, 5015448, 91805, -12160663, -29180544, 20550882, +1560147, -13503914, 32991254, 1899449, -10205379, -5949604, 48863308, -45703284, -49195628, 30003568, +46837156, -86405616, 428423, -31983548, -29031832, -12853227, 31449362, -24286430, 41618232, -5889474, +-1019518, 55919400, -15781857, -43290584, 53761180, 63311040, -61478700, 68732360, -23152022, 1693828, +56829396, -19017042, -21735756, 15581068, 15282031, -7307887, -2860985, 10545218, 2111513, 1345399, +-13512504, 18687402, 121870, -1222992, 372052, 2507724, 8458401, 5106716, -6801081, -7454453, +7878581, 18633178, -16115254, -14958834, -3998078, 19510962, -659814, 10421201, -2801929, 4342749, +108985, 4444218, -2192581, -3431679, -23021024, -9687836, 5816997, -8335458, -2281165, -8201777, +-12412455, 19476066, 12228309, -33921116, 13589813, 17575006, -3391414, -148713, -11884711, 17394618, +38050188, -17785460, -24105504, -6626598, 6039798, 38674032, 28889024, -10097468, -3077344, 12076911, +31471372, -10482941, -1763084, 19302120, -24736328, -21269752, 16958142, -11293617, -8426189, -10400800, +-935766, -17135846, 1374926, 11746736, -7198902, 9070971, -8058433, -5069135, -5075041, -23701778, +3547643, -9602473, 14549202, 31022548, 1734630, 15457050, 12850005, 1176821, 5889474, 9702331, +32948304, -23301272, 15936476, 13982266, -16833050, 11272679, 11014444, 3494493, -14936286, -29933238, +-30234422, 9970230, 10878615, -11437498, -50545860, 41115720, -13824426, -22165790, -12774843, 41359460, +-19437412, 45229764, 24159, 15187004, -42562052, 40240084, -18420040, 17823040, -5429913, -58272504, +-18344880, 11468100, -35974648, 36999532, 3990025, -53426172, -60051696, -30914638, 41766408, 10306311, +-37273872, 45449880, -48877264, -2412698, 88286808, 13205414, 5028333, 8773544, 6701760, -23175106, +24138254, 1786170, 12338904, -15555835, 23202488, -12817793, -12207371, -10239202, -1293322, -641561, +7033009, -2332167, -3403762, 4549981, -8077223, -16724066, 15217069, -5619428, -2609730, -19845434, +9072045, 4403415, 8610336, 2354179, 9934259, -7368017, 2345589, 27445914, -3192235, 285615, +14552423, -15604153, -3285113, 802085, -1561221, 10673531, -11041287, 11983496, -4191888, -31039728, +2005750, -8117488, 9125195, -10331544, 12004970, -19273666, -36839544, 155156, -39133056, 10743861, +-3497177, -6998649, 13070659, 21617108, -13874355, 3105798, 23742042, -18612240, 32206350, -4294431, +-35455492, 30411590, -14638859, -6500433, 27066348, -34686156, 9135932, 594316, 12579422, -5443871, +-12743705, -52939232, 12135430, -21845814, -53192096, 64297272, -43289512, -18022220, -8601209, -14628122, +-32676112, 18341120, 44362180, -27451820, 12446278, -39824548, -22540526, -22686554, 20045150, 3621194, +58214524, -10005663, -4864051, -17358648, -50228568, 68719, 24410984, -18551038, 20490216, 24661702, +-20807506, 2090039, -17744658, -74177840, -38924752, -22820234, -77961176, 49844168, 65639448, 30890478, +-66104380, -53117472, -118581896, 17160542, 140966192, 65222300, 24903830, -37044092, -130065032, -29527900, +30109868, 88916024, 89147952, -60568704, -51250772, -23785528, 11633993, 6155762, 96846680, 1641751, +-11803644, 7897371, -9600863, -23633594, 34070364, 6129992, -7305740, 18867254, -15446850, -26361436, +18700288, 16195248, -44914084, 30264488, -6719477, -9883257, -23929948, 25419764, -24179056, 29092498, +-14308684, 29777008, -35100084, 14052596, -9810242, 472446, 25376814, 41511396, 11761231, -15420543, +-10966125, -2581275, 22942104, -3663607, 32989106, -25796648, -20305532, 9495099, 32703492, 3846680, +19938848, -55810952, 40487048, -7945690, -8863202, 1005022, 18234284, 345745, -3493956, 13492640, +4639102, 4494147, 21510270, -13631689, -151934, 11170136, -3894999, -2030446, 13562433, -12593381, +-3056943, 3814468, 21319144, -14095546, -10006737, 11934640, -566936, 6699075, -21124796, 27702540, +-6608344, 9347459, -6060199, 3567507, 15090904, 6642167, -3554622, 12986370, -4957466, 13125420, +-10358387, -776852, 13534516, -3125126, -5653251, -27354110, 2752537, 21137144, 2189360, 9904731, +-13872207, -4398047, -8319889, -8702141, -3599720, 15289547, -5617817, 9315784, -12087649, -14403710, +-6218039, 3419331, 27925878, -10732586, 12676059, 835371, 2739116, -13676250, 7425999, 14512694, +735513, -13222057, 10167261, -8812199, 6798933, -5378373, -3940096, -5145908, 1844152, 10178536, +-5181878, -2617246, 4656282, -613643, -7789997, -1660542, 7543037, 6443525, -6763500, 1134408, +6887517, 281857, -4278861, 1114544, -6807523, 5050882, -475131, 2579128, -3121904, 1312113, +4365835, -2214056, 5124970, 984084, 4669703, 3597572, -7684770, -7755101, -2675765, 13538811, +-8674760, 9403294, 7482907, -5510980, -14035953, 10593537, -9028558, 11970074, -1165547, -1999307, +-4974646, 1984812, 1949378, -740882, -1642825, 1003412, 53126060, 10568304, -28496034, -20215338, +-31471910, -9958419, 6036577, 16723529, -5236639, -6734509, -5835250, -5586679, -5319317, 7654706, +-3896609, -1047972, -1703491, -5514738, -1343251, 8413841, 1180042, -2405719, -8410620, 9654013, +-12513924, 7366943, -4484483, -12235288, 27917, 5614596, 6261526, 4946192, -7268696, 1642288, +-2348810, -3937411, 14738180, -13117904, -2427194, -503585, -936840, 1416802, -2228551, -7689602, +6471979, -12205223, 11643656, -1673964, -8229158, 2869575, -4260071, 10423886, -6104223, -3631932, +11181947, -10006737, 3465502, -4766877, -1135482, 8644159, -6171868, -2395518, 7678865, -5243618, +1998770, 842350, -6288906, 15275051, -13326747, -1083942, 5832566, -3330747, 9701794, -4360466, +-2173790, 2598992, 3185792, -995359, 2131915, -806917, -4335770, 3921842, -26307, 433255, +2098629, -221191, 3016141, -3008625, 871342, 666794, 663572, -321049, -1913408, 2541010, +-375810, -598611, -1815161, 2253247, 3561602, -1156957, -1849520, 1173063, 2075543, -2580202, +2166811, -1932735, -1730335, 5786395, -891743, 2171106, 3005940, -3908420, 9734007, -3145527, +-523449, -436476, -5637145, 5876052, -3646427, -5775658, -25152402, -37796784, 49539764, 154542592, +13232794, 13455059, -105353400, -133264784, -27765890, -28225452, 78500728, 133611600, 68563784, 13200045, +-48343080, -94068376, -66399120, -47472812, -2462627, 65096136, 95122792, 51408076, 11780558, -33348810, +-59278064, -33192044, -31935230, -29908542, 18905372, 38758320, 38200512, 38485056, 9254044, -16681116, +-6844568, -25353728, -39690328, -4395899, -11834246, -8008504, 35840964, 20709796, 29942902, 18161806, +-13572634, -32659468, -7864085, -21226802, -3277060, 14849313, 4552666, 8024073, 16199006, -8208756, +-11488501, -2643552, -6749004, 6538551, 10460393, 569083, 12912819, 7662222, -13550085, -13035763, +-20772072, -17764522, 792421, 21435644, 32492502, 15651935, 4112968, -7550553, -21744346, -3730179, +-24518358, -15043660, 11550241, 9060234, 27470074, 9254581, -6986301, 8094403, -14235669, -24707874, +4353486, 6267431, 8288750, 7658464, -1542430, -3087545, -2360085, -10273562, -7870528, 5388574, +8386461, 8431558, 8557722, -2370822, -8266739, -5481452, -3172907, 218506, -170188, -9354439, +2397129, 11777874, 6357626, 7328825, -2181844, -11855183, -6885907, -7000260, 2737505, 8310225, +5484137, 5132486, 2222646, -1700807, -8991514, -11849278, -5422933, 719407, 7320772, 11674795, +7150584, 7191923, 4540854, -7441031, -13795972, -17713518, -11482595, 4935991, 9909026, 12851079, +17835926, 5404143, -5371394, -9043591, -7332583, -5459441, -5149666, -5248450, -1543504, 3941169, +7832947, 6881612, 5398774, 3718905, 799938, -5079336, -8754754, -8478265, -4339528, -273267, +3159485, 3179350, 1852742, 339302, 267362, -92879, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 1260573, -3418794, 2694018, -905701, 2068027, 963146, 5925981, -1047972, -141734, 727997, 4341675, --872415, -4496294, -2115808, -4315369, 1037235, -1525787, -380641, -530965, 1027034, 434329, -860067, 2525978, 4592931, -2033667, -1154273, 937377, -2197413, -284005, 3578245, -1938104, -4427575, 475131, -1617592, 2971044, -4054449, -1016297, -2831457, 3960497, -139586, -1438814, --1094680, 64961, 3642669, 165893, 4388920, 1712618, -3648575, 2954938, -1607928, -2690260, --2235531, 3036542, -651761, 9637907, 998580, 2436857, 1728188, -4465156, 44560, -643171, -1151588, -2527588, -1742683, 5031018, 4085588, 389768, 1685775, -441308, 2535105, -4118337, -401579, 3123515, 1937567, 333397, -338766, 2230699, -3527779, -1600412, 3717294, -2439542, -776852, 1835025, 2191507, 694711, -2822867, -1854889, 1461900, 341450, 1449552, -430570, -405874, -1386738, -95026, -683974, -427886, 812286, 1522566, 660351, -908386, -334471, --619012, 374736, 926639, -544924, 680752, 520765, 965294, -128312, 1161252, -466004, -281857, 730144, 907849, -7336341, -6628209, -4118337, -3757023, -3248606, 1245004, 4636417, -9438728, 1816234, 2433099, -13422, -6740415, -2814277, -2503966, -6047314, 9420474, 2511482, -3741990, 2594697, -2083059, 967978, 9020505, 3609383, -2121177, -164283, -2186675, 199716, --4173098, 2522220, -1314260, -1859184, 360240, 4805532, 510564, 1685238, 3008088, 4169340, --7441031, 111132, 1897302, 4348655, 6665789, -3688840, -744103, -1777580, 5562520, 3026341, -3590593, -573915, 1670742, 11127723, -7006166, 1428077, 665720, -4669167, 2010582, -6531035, --868657, 1705639, -1404454, -9856950, 2785823, 709207, -2656437, -2711735, -441308, -1458141, -3353833, -3105261, -1371168, 1003412, -86973, -3018825, -129386, 2531346, -4119411, 400506, --1110249, -957778, -1269163, -693637, 650688, -2376191, -1797981, 395674, -1424319, -1869921, --1943473, -632971, -1283658, 2441152, -2094870, -555661, 360777, 1249836, -118112, 126702, --715649, 191663, -1246077, 1000727, -1787780, 9912785, 914291, 3528853, -375810, -2715493, -251792, 6950868, 3616899, 4468914, 7267085, -3239479, 109522, 6973953, 2280628, 3037079, -435402, 816044, 4149475, -3772055, -1061931, 5171678, -3518652, 1990717, 3006477, -2275796, -2218888, 6949257, -3283503, 2533494, 590558, 219580, 124554, -1511292, -4742181, -1534377, --3968013, -477278, 1709397, 3295851, 3579318, -695785, -5958194, -608275, 8785356, -3305514, -1802276, -1633698, -9170292, 5312875, 1387811, 3926674, -631897, 4479651, 4468377, -7902740, -3165928, 165356, 2974265, -655519, -5454072, -339302, -734976, -1088237, -995359, 3425237, -24696, 602906, 7153805, 1294933, 5696737, 98247, 593242, 998043, -3056943, -4970351, -3389803, -3783329, 2244657, 1284195, -144955, 2240899, -2420214, -1493575, 1612223, -9127, --4669167, 1429687, 606127, 519691, -905701, 1954210, 244276, -909996, 2328409, -614180, --147640, -1992328, 727997, -1042603, 377420, -82141, -230854, 357556, -671626, 1132798, -333934, -583579, 405874, -390305, 184147, -157303, -707059, 16291885, 9166534, 13938243, -4534412, -5795522, 2971044, -2603287, 401579, 1340030, -11883101, -3185792, -3266323, 3054259, -4680978, -1943473, -266288, 1552631, 383863, 8492224, -932008, -8944269, 2913062, -5180268, -3971234, 4503273, 3614752, 5248987, -1263257, -1844152, 2142115, -1601486, -2072322, 1495722, --1383516, 3140695, 4532264, -1979443, -6870874, 2192044, -6683506, -4328254, -841814, -13927505, -135291, -2370822, 5450851, 5178120, 2511482, 8494372, 8568460, 3773666, 1905355, -644782, -412854, 459025, -3892314, 7931194, -1067299, 2741800, -2529736, -3058017, -1101659, -4570919, -4002373, -2127620, -1691143, 7777112, -6508486, -2019172, 1642825, -3005403, -913217, -264677, -2723546, 3202972, 2156074, 5531381, -1831267, -1535988, -819265, -3520263, 1835025, 3544959, -4886062, -111669, -754304, -1060857, 46708, 1037772, 1019518, -1489280, 1615445, -38118, -1160715, 981400, -213138, -402653, 2090039, -622770, 1048509, 850404, 963146, 855772, --617402, 774705, 3539590, -277562, 161598, 404801, 2608656, 457951, -603443, -1879585, --6206228, -14286135, -5110474, -1483911, 2021856, -1764158, 4315369, -939524, 6973417, -6280853, -3680250, -1541356, 12836584, 5408975, -2844879, -5489505, 2938831, -7817914, -4234838, 3046206, --2807835, -4652524, 8858907, 3738769, -564251, -4083440, -5617817, 3804804, 2847563, 2849711, --302795, -1350767, -3497177, 5276368, -6903086, -2896419, -383326, 4902169, 3654480, -308701, -5293547, 718870, -2578591, 1134945, -2568927, -2557116, -3090766, 3823058, -2843268, -41339, -4918812, 7505456, 7556995, 3178813, 2628520, -441308, 4246112, -1679332, 6139656, -1020055, -3886409, 3118146, -2638721, 383326, -2883534, 3089692, 2559801, 1125281, -1040456, -5158793, -3612604, -5619428, -761283, -6085432, 2188286, -381715, -663036, 1247151, -5299990, 319438, -1291711, 8571144, 2687576, 1511829, 1946694, 3396782, 1394254, 1806034, -2596308, 1993939, -1379221, -3389266, -359704, 280784, 675921, 1583232, -1783485, 1200443, -1178432, 337692, --277562, 2245731, 158914, 372052, 191663, 825707, -513249, 2049236, -1129576, 835371, -689342, 1980517, 826244, 2708514, -1948305, 1076426, -510027, 3107409, 1085553, 1178432, --453656, -310848, 169651, -474594, -2021856, -6649146, -14017163, -11288785, 688805, -9644349, --4773856, -13665512, -7299834, -8326331, 3299609, -4445291, -5943698, -2021856, 306016, -3511136, --13302587, 3572876, -2369748, 1339493, -6033892, 5998996, 2199560, 139586, -5371931, -2379412, -6774774, 4638028, 277562, -1010391, -4585415, 2845416, 1449552, 2945811, -5486284, -507880, --4462471, -3980361, -4366908, 449898, 8778913, -7185481, 125628, -6846178, 671089, 3183108, -3964792, -7220377, 7227356, 8807367, -2937758, -2101850, -1571958, -354335, 2767033, 3549254, -845572, 2411624, -4332012, -844498, -1632625, 7572028, -2413235, 8380018, -254477, -2588255, -6654515, -712965, -4046396, 1416266, 7211787, 8337606, -670552, -2632815, -4594542, 2858838, --6118718, -623307, 4018479, -3133716, 1783485, -238908, -86436, -2526515, 4832, -1966021, --3090229, -338766, 2518462, 1328756, 2507724, -1178969, -883153, -2084133, 746251, -1692754, -2610803, 1318018, 3668976, 311922, -926102, -374199, -717796, -1364189, 1648731, -1214402, --731218, 650151, 513249, -1887638, -700080, 437013, -3758, -1069984, -1838246, -170188, --1700807, -1194538, -749472, 2080912, -220654, 674310, 579821, 19864, -1347009, -459025, --10846403, -10730439, -12461311, 3687230, -10097468, -4160213, 9649718, 4751308, -10956462, -702227, -79457, 4835597, 7118909, 12240657, -3329137, -4354023, -12027519, -14696304, -8730595, -2928631, -5979668, -5940477, 2863670, -8451959, 8796630, -6332930, 7058779, -3249680, 965831, 1887101, --1452236, -6244346, 9926743, -8555038, -464393, -4545149, 1187022, -5301601, 1197222, -21484500, -315680, 10064182, -12847321, 2973728, 8719320, 3192771, -6709276, -691490, 10501732, -12934831, --82141, 5370320, 5060545, 5052492, -1915019, -1822677, -8440148, -4109747, 3401077, 5791227, -9084393, 11191074, -16432545, 6297496, -4989142, 1263794, -11599096, -4635344, 9473624, 2388539, -1264331, -6282464, -36507, 6204617, 4423280, 2805688, -5766531, -3630858, 5912560, -1513976, --2568927, -1219771, -4257923, 3660923, -741956, -3259343, -1322313, -1071594, 811749, -2080912, --2338073, 863825, 765041, 989990, -1354525, -1828582, 1574106, -1141924, -4403952, -308701, --1349694, 2713346, -2074469, 213138, 153008, 1132261, -2781528, -1452236, -1043677, 368830, -2830384, -258772, -751082, 1862405, -30602, 1833414, -892279, -1855963, -797253, -3202972, -675384, 56371, -2355253, 1309965, 12831752, 21485038, 11905649, 14014478, 2099165, 4993973, -18786724, -562104, 532576, 12907450, -6327561, 57982, 3673808, 6448357, 10595684, -8619999, --12359842, 6824703, 3746285, -7131793, 1506997, 4425427, -2774549, 2554969, -6666326, -1472637, --7780870, 2413772, 8423505, 2655901, 7376070, 5751498, 5997922, -14635101, 744103, 17098264, --2055142, -274878, 15883863, -2066416, -585189, 2386928, -2119030, -436476, 8783745, 13862007, --13608067, -2183991, 2692408, -4139812, 6396280, -2128693, 613107, 1038845, -2979097, 12207908, --1575716, -4403952, 4548371, -4567698, -7610682, 2651606, 8284455, 3168075, -934155, 1712618, -7927973, 4179003, 7102266, 2177549, 876173, -49392, -6984691, -1412507, -5472862, -1219234, --2301029, -12396886, -5386963, 833224, 8012262, -3262565, 3096672, -2099165, -6573448, 2947958, -713501, -2058900, 1032403, -3971771, 201863, 1026497, 2458332, 3528316, -834297, 2284386, --3013457, -4438849, -5345087, -535797, 4844186, -843424, -376883, 1647657, 268972, 564788, -2610803, -1232656, -477815, -1392643, 3753802, 117575, -552440, 470836, -943819, -1968706, --2396592, 1022739, 2135136, 2682744, 1468879, 1081795, -462246, -140660, 46171, -835908, --3684545, 36210332, 5020280, -772557, -219043, -17377974, -5083631, 1678259, -4053376, 7668664, -3373697, 12429635, -1582159, 20401, -2681133, -5253282, 8338679, 1568737, 3190624, 4683125, -6528351, -6138045, -6182069, -7144678, -4972499, -4092567, -1793686, -9815611, -1925756, 15853798, -7474317, -3015067, -1071058, -1862942, 1323924, 5616207, -2745558, 22655416, -3937411, -616328, --10282152, 4109747, 9884330, -1699196, -7565585, -981400, 3808026, 7587597, 3278134, 10666014, -15932181, 5190468, -338229, 9463960, 7732552, 2891050, 5976984, -19857782, 4610648, 525060, --17569638, 6454799, -409633, -7570417, 4954782, -8028368, -7810398, 9319542, 7334731, -4139275, --15544024, -7035694, 3739306, -8936216, -1817308, 3909494, 15278809, -2475512, 3094524, -7959648, --16772384, -9009231, -8032663, -3641059, 8025147, 1098438, -5558225, -1685775, -3460670, -3383897, -5139465, 4270271, 1660542, 3647501, 4340065, -3637837, -2658585, -2702071, 599685, -2963528, --4389994, -4274566, 1879048, -1447404, -610422, 610422, 1607392, -3629247, 2087354, -778463, --412317, -1605781, -561567, -2280628, 5754720, -3532074, -1204202, 1021129, -3646427, -3537979, --2665027, 224412, 2945811, -19191524, 12086575, -2223719, -12400107, -491237, 11242614, -12862890, --2732673, -10370735, 6854768, 2230162, -3841312, -4415764, -1615445, 6905771, 5253819, 2966212, -7153805, 6307160, 610422, 7616588, 8703751, 3615289, 4799089, -8907225, -4399657, -6201933, -5468030, 7185481, 2520609, 2222646, -4275103, -3098282, -2641405, -2298344, -7618198, 6925098, -1534377, 449898, -8152385, -2418604, 12799539, -9259949, -9943923, -15155866, 5228049, -11367705, -16429324, 19085760, 13080323, 7696582, 662499, 14918032, -7964480, 11724187, -1606318, -8366060, -535260, 682363, -18034030, -7990787, 6648073, 1024350, -3130494, 2707977, 14961519, 10291279, --17396766, -4382478, -359167, -465467, 4884989, 7357279, -456877, -13884019, 5471789, -8061654, --25848724, -7500087, -5352066, 7976828, 12879533, 4377109, 528818, 652298, 272194, 1147830, -9135932, 21475, 1254131, 1179505, 4553202, -8201240, -558883, 2503429, 5982890, 7344931, -2480344, 4356171, 6389838, 8579734, 10953240, 4218732, 5357972, 5402532, 145492, -517007, --2137820, -1378685, -73551, 2248416, -6609955, -1614371, 3644817, 6062347, -784368, 1693828, --965294, 2540473, -93416, 3885335, -765041, 3725347, -2918967, 4773856, -44560, 4508642, --16095390, 1604170, 1789928, 10067403, 2168422, 25721486, 4093641, -10616085, -3435974, -8938901, -16252693, -20852066, -1864553, 14412837, -31498216, -12431246, -10631118, -11012296, -20892868, 1974074, --3664681, -8960912, -1144609, 9881109, 1240709, 1309428, -6165426, 2448668, -2088428, 2433636, -9127, 1561221, 8054138, -1959042, -502511, 16389058, -10604811, -2136746, 2828236, 14115947, --7415798, 20156282, -6106370, -8144869, -17261474, -22457848, -6555731, -16716013, 8149701, -5073430, --12553653, 1712081, 2024003, 9244380, 7816841, 3266860, -1592359, 28526636, 15785079, -1803349, -2779381, 9767829, 7300371, 4743255, -3866544, -558883, -5122822, -6652905, -6156299, 4298189, -22245784, -15557445, -3813394, -8861054, 16030429, -4226785, 4965519, -2290291, 7525320, -17621178, --13181255, -4553202, 7485591, 2370822, 6463389, -3900904, 3986267, 6028524, 5294084, 2508798, --1053878, -7519951, 4730370, 1762547, -6381248, -4480725, 3991098, -4201552, -3180423, -139586, -4297652, -4003447, 5179194, -3251290, 7399155, -4128001, 827855, 2573222, 1345935, -3577171, --6761353, 5230197, -2030983, -1531693, -528281, -716723, -2137283, 4958540, 6204081, 4292283, -3796214, -753230, 2189897, 7104413, -3838090, 2797634, 1236951, -185757, 1568737, -479426, -385473, -2594160, -12823162, -12326556, 6950331, -5527086, -23089208, 11432666, -6877854, 9128953, --6635188, 11490648, 7839389, 9552007, 15322296, 2470143, 12968117, 5194763, 3364033, 8779450, -3055869, 2395518, 650688, -384936, -8205535, 7312719, -16683800, 7291244, 1772748, -4807142, --8977019, -257161, 6488622, -7482370, -3085934, -11178189, -4290136, -13755707, 903554, 7536594, --102005, -1802813, -8678518, -15185931, -10972568, 11829951, 3998615, -4962298, -8667781, -2156611, --651224, -14847165, 12600897, 11403138, -14553497, -14212584, -23203560, -3561065, -27770722, 7475928, -10893648, 5681168, -1675037, -3573413, -2811593, 11399380, 11610907, 13300977, -8608725, -6920266, -8979703, -3868155, -4083440, -16337519, 7322383, 13310641, 15344308, -3617973, 8442295, -4716411, -2595771, 8330089, 4395362, -5904507, 2853469, -10093710, -6039261, -4198868, 1592896, 4232691, -3746822, -4011500, -3557844, -1508070, -4410932, -911070, -6113349, -7767449, -3956739, -3249143, --2262374, -1052267, -2137820, -3100430, 797253, -162135, 4614943, -1574106, 5863704, -1530619, -4711043, 289910, -2452963, 1149441, 11735998, 3571802, 6055904, -2692945, -4541928, 935229, -4369056, -4071092, 8562017, 8433705, 2576981, 3949759, 1922535, -9691057, -4928475, 22184580, -25709674, -10188199, -537408, 6895033, -20735028, -3888019, 25865366, 868120, -28098750, 3055869, -8685498, -705985, 9812927, 23078470, -9441412, 20857434, 11355357, 17799418, 5034776, -13676786, --14507863, 11633456, -13161390, -20750060, -5983963, -24648280, 5456756, -1677185, 8781598, 7499013, -5413807, 2763812, -956167, 678605, 12552042, 6096169, -24108726, -2837900, 8123931, 15512348, -8687108, 19221590, 17383344, 13578002, -6386617, -2326262, 3631395, 35006132, -14624364, 2561948, -7458211, 13730474, -5622649, -19464254, -4046933, -4908611, -11681774, -21526376, -23469848, 6454799, --13147432, -9951976, 6120866, 18512920, 22844394, 433255, -1251983, -274878, 17556752, -11880416, --6033356, 20738250, -22563074, 2510945, -17816598, -11973832, 1372242, 24049132, -3860102, -16443819, -21488258, -21949430, 936840, -26497800, -2292976, -3323231, 7851737, 14746770, -10864120, -6198175, --7665980, 1990181, 594316, -8203388, 4714264, -2421825, -2265595, -3494493, -2774549, -9713605, -2245731, -4673998, 3505767, 2632815, -648003, -2139431, 5968394, 14496, 153545, -11454678, -1785096, -964757, -311922, 10709501, 1145683, 3034931, -4393215, 1743220, -2502892, -6216429, -2809982, -12685186, 4318053, -4363687, 9597641, -7541963, -942208, 1771674, -971736, -1960116, --3864397, 7081864, -4575214, 7710003, -2633352, 4552129, 12068321, -14183593, -31756452, -7492571, --11081016, -10463077, -6570226, 1474784, -10888816, -9210020, 3029563, 7074885, -6841346, 16811576, --1834488, 11263015, -5700496, -671089, 9687299, -13858786, -8689793, -4718559, 14456860, -3490735, --15904801, -6003828, 2385854, -7708930, 6584185, -10656888, -10729365, 15569793, 4508642, -12342662, -7477538, -1490891, -9741523, -947040, -16141561, -13870060, 2734821, 24174760, 9731859, 7530689, --19394462, 14923938, -1731946, 11433203, -6770479, -13493714, 6542846, -24887188, 20769388, -33694556, --21370146, 7800735, 18532784, 1433445, 22194244, -9719511, 5808944, -15416248, 20818780, 6695854, -15479599, 7131793, 3623879, -4893042, -5206574, -10176925, -3568044, -612033, -17969606, -10722923, -1556926, -27217208, 1517197, 30562450, 9097278, 11005854, 2929168, -13866839, -10451266, -2828773, --3360275, -986232, -5403606, -7295539, 6074695, 3996467, 5510980, 8633958, -8735963, 5667210, --3326989, -4712653, -3570192, 7688529, -2613488, -8390219, -12720619, -88584, -7664369, -3604015, --7857106, -2180233, -5155572, -3092377, 11950747, -6534793, 2723546, 3706557, -9610526, 10948409, -90194, 6546067, 8612483, -4011500, 4253628, 1931662, -398358, 2663954, 7206419, -4184372, --4100083, 6644852, 558883, 5282810, -23865522, -22257058, 2196876, 9173513, -11253888, -50353124, --10525354, -257161, 6581501, -17031692, 1472637, -9496710, -1979980, -13568875, -15151571, 13460428, --14734422, -18078054, -3057480, -12652974, -13916231, 4793184, -20215874, -6689949, 12197707, 27935542, -22562000, -1075889, -13764833, 4830228, 20308216, -936303, 13506062, -3874597, 17013440, 9568650, --17476222, 27816356, -21199958, -11193222, 18721762, -20627118, 6226092, -4736812, -15527381, 1834488, -23533736, -4878546, -13833016, 8817568, 11548093, -325881, 4779762, -33839512, 8172786, 1422708, -17076254, 8276402, -14846091, 14754286, -7909719, -1275068, -13758928, 7321846, 19832548, -4074313, --3923990, -20315732, -28749438, 16368657, -2079838, 13191455, -15722802, 11978664, 9560597, -20447802, -1180579, 18234284, 10407780, -9538049, -16450798, 14916958, 2429878, -12767327, 12133819, 2021856, -5410048, 1461363, 5027796, 963683, 13557601, 210453, 4668630, -894964, 563714, 12061342, --3878892, 322659, 2739116, -3131568, 2197950, 1102196, 8316131, -403727, -9252970, -1115081, -1178969, -5481452, -1638530, 617402, -3694746, 12489228, -2939905, -7128035, 792958, 7954280, -3730179, -402116, 4522064, 657667, -5187247, -631360, 13100187, 8962523, -8857833, -6469295, -1893007, 18979460, 19041738, -51345796, 19358492, 26025354, -6622840, 18103824, -183073, 9381819, --4168266, -10560251, -6820408, 10918881, 2576444, -14834280, -9635222, -1373853, -6956774, -3800509, --1593970, 31758598, 6385543, 7030325, -19649476, 13673028, -13991930, 204011, 2461016, -21474836, -10027675, -7963406, 1119376, -8696772, -15523622, 419296, 10304700, 29427506, 10584947, 3055332, -18204756, 7703024, -2197413, 2987687, 459025, 5134634, 2982855, 19959250, 8737574, 6030134, -3294240, -2564096, -6205154, -19658602, -16500727, 2287070, -2359011, -12131135, 1722819, 14737107, --22487912, 21721260, 5599027, -8007430, -903017, -5822902, -1802813, 13154411, 5754183, 4281546, --15280957, -3113851, -20885890, -6449967, 5816460, 7628936, 7609609, -9051644, -7260642, 16179142, --1908576, -26244398, 3769908, -488016, -286152, -15501611, 5078799, 11575474, -1599875, 16665547, -11243688, -5619965, -308701, -7245610, 9006546, -791885, 2968359, 1352915, -3791919, -3184718, --695248, -3301219, 3652870, -7203197, -704912, 405874, 3885335, -3723200, -4310537, -5151277, -280247, -1273458, 2861522, 1625645, -151934, -3228742, 3473555, 2603824, 512712, 3777961, -692564, 2693481, 2516851, 3582540, -999117, -13187160, -498216, -3781182, -45634028, 70723080, --69924216, -31622770, -15978889, -4773320, 40907952, 12021077, 45795624, 11434814, -9364102, 36082020, -15612743, -12218108, 16915192, 15308337, 8560407, 14322105, 13890461, -12385612, -19997904, -14241038, -2304250, -13096966, 6906308, 4101157, 8955007, -1402844, 6186901, 2084133, 22480932, 5323612, -2108829, 6911676, -5251672, -327491, 7927436, -14121852, -20074140, -13654775, -11684459, 1981591, -5939403, -14161581, -2315524, -8528731, -34795676, 17500918, -6301254, 8848170, -18309982, -6234145, --16961900, -23244900, 8759586, 6138582, 22585622, -994822, 19897510, -8451422, 16664473, 1945083, -23790898, -16884054, 14714558, 17673254, 9774809, 10242960, 853625, -7252589, 27860380, 18631568, --1866163, 33606508, 8038568, 3914863, 14380624, 21654688, 245350, 9943923, 12498892, 5696201, -5447629, -2538326, 1083942, -19681688, -5051956, -2677375, 3100430, 4098473, 3861713, 13042205, -5750425, 6635188, -5150203, -744640, 5104569, 514859, 396211, -4702453, 5338108, 4526896, -2548526, -3678103, 6790344, -1071058, 1175210, -5330592, -4963909, -2008971, 493921, 574452, --3270081, -10844792, 2455648, 2313377, -2983392, -574989, -2829847, 783832, -4019016, 2631741, --3874597, 132607, 9631464, -2787971, -9673340, 6207839, 4451197, 3765613, -2384244, -1313186, -43176768, 3740917, -26011396, -38210176, -20270636, -15940234, 5127117, 31641560, -524523, -13367549, -28294708, 2341294, -22870164, 20582558, 22315040, -4076998, -422517, -2152852, -20245402, 22509924, -1264868, 12788802, -7140383, -17992692, -31481574, 5750425, 3972845, 4884452, -4444755, 9911711, --10469520, -108985, -20177220, -25124484, 8828305, -3165391, 8002061, -3615289, -9327058, -22747758, --35334160, 18138720, -19746112, 8122320, 16995186, -1170916, -9096204, -17330730, -12501039, 40705016, -9247601, -1835562, 5289252, -5355288, -16445967, -5377836, 23594402, -22792854, -38379292, -13389024, --12181064, -53763328, -42018200, -22608708, -23365696, 5793911, -242129, -18698676, -35874788, -14179298, --16952772, -12161200, -9810779, -7211787, -21456046, -20556788, 16276315, -18254684, 1162326, 2785823, --22479858, -3924526, -16401406, -20548198, -4982699, -3335579, 9555765, 4025458, 12847321, -13121662, -3399467, 7568806, -32212, -17655000, -9972377, -11840151, -1120987, 5784784, -5975374, -8582418, -15358803, 9143449, 11068131, -18047990, 3120831, -8772471, -954020, 784368, 1859184, -2143726, -18315352, 1460289, -3146064, 2331094, 6467684, 9238475, 7654169, -1182727, 10895795, -7765301, --4068408, -3330210, -14057428, -378494, -4226248, -18161270, -15120432, 2655364, 865973, -278099, --4551592, -3978750, 29667486, -3526705, 28262496, 41829224, -7705708, -45412836, -43940200, -9514963, -21079162, 2825552, -34482680, 27012660, -5892159, -22675280, 27796492, -52298744, -10961830, 164819, --9233106, -8119099, 63356672, -26667988, 59373628, -3065533, 12510166, -4527433, -23421530, 37877852, -10117869, 39386996, -27057220, -26843546, 8662412, -43211128, -12869333, -7079180, -29908004, 62126164, --5390184, -64796024, -946503, -28986734, 8456254, 15732465, 25948044, 20856362, -25486872, -16166257, --39677444, -11831024, -18355616, 16821776, 11289858, -2359011, 11749420, -8155606, -28134184, -11749420, --32838784, 33506650, -25380036, -17787070, 30313342, 6942815, 51216412, 24589762, 4531728, 26792542, --36134632, -13727789, -37309844, -36532456, -5535139, -5504001, -45528264, 46784540, -8202314, -36696200, --54235236, 3339874, -10698227, 39573292, -2456185, 1850057, 5426691, -7346542, 7631620, 8739722, -18767934, -12723841, -12517145, -8276402, 656593, -2499671, -2527588, -12028593, 13280039, 7946763, -15823733, -3907347, -8420283, -7493108, -2696166, 2747169, 21161840, 22189412, -3561065, 1034550, -12255689, -3586835, -27967216, -13815299, 1837709, 3667902, -2119030, -18070538, 6349573, -2306934, --4173098, -20661478, 8105677, 6760816, 24481314, 3828963, 6089190, -1363115, 10113574, 1606855, --5742372, -84701584, 43760348, 10011032, -18227842, -13848585, 27057758, 14794015, -16292422, -4533875, --39785356, -16750372, 17002164, -34524020, 1388885, 6097243, -10455024, -23058606, -15606301, 30844308, -12497281, -6305012, -44392244, 14963129, 28057948, 16056198, -34354368, -23036594, 224412, 37376416, -3422015, -9166534, 5989332, 1108638, 19235548, -50039052, -43112344, 53368188, 8385924, 22268332, --50765976, 10979547, -2195265, 37182604, -33331094, -6489159, -50886236, 17739288, 36852432, 8523899, --22545358, 14516989, 53444964, -23992224, -25325812, -20046760, 7700340, 2139431, 46905876, -14055817, -3714073, -25308632, 8408472, -27743342, -773094, 17681306, -34418796, 32968706, 10174241, -24076512, --37237368, -22768696, -1734630, 33266132, -60151016, -13204877, 54744728, 7126962, -24447490, -11637214, --17186312, 51347944, -5512591, -53940496, -6067178, -80531, -13085692, 21912924, -3561065, -7610682, -16882980, -1556926, -10831371, -14177687, -1249299, -12505334, 4022774, 9102109, 12350715, -10885058, --7725036, 11163157, -7086159, 10572062, -5359046, -10848014, 15093052, -8169565, 13627931, 18333068, -1477469, -26656178, -1513976, -15899969, 6913287, 9802726, 6735583, -18629958, 512175, -14071923, -13465259, -3969087, -7714835, -5381594, 3192771, 4492536, 55988120, 28586766, 13028246, 12884365, -13590350, -8952322, -8645769, -18926848, 2538863, 6014028, 5102421, -1181653, -31994822, 15328201, -6483790, -22429930, -18797998, -9766219, -10916196, 8247411, -8107825, -9565966, 2943663, -868657, --16888886, 21805548, -15516643, -5167920, -16128139, -14894410, 10853919, -6397891, -1939715, 5420249, -7162932, -1873680, -21519396, 5094905, 34121368, 7152731, -52947820, -3449933, -11313481, -16614544, -11433740, 11910481, 27762132, 13169443, -34445100, 37535328, -9075803, -26156888, 78588240, -15868294, --6454262, -25918518, -62027916, 28447716, 31889596, 10364293, 12199855, -53314504, 15737834, -4229469, --12643847, -9439264, 2392834, -5120675, 8595303, 10082973, 2464238, -7947837, -14976551, 16107738, -20553566, 28214714, -13707388, -2900714, 6272263, -4189741, 15079093, -36574332, 3808562, 6443525, --16858820, 2815351, -13999983, 5581310, 528818, 4478041, -2090039, 1005022, 1677722, -738198, --222265, -4863514, -3520263, 9769977, -5129265, -355945, 7492571, 1619203, 599148, 11957726, --9575093, 7337952, 8847096, -502511, -1444720, -10074920, 8460012, -18860812, -5029407, 12380780, -3839701, -5104569, -12507482, 3927748, -2692945, 15414638, -31584652, -76201848, -128408784, 10289668, -130941208, 12390444, 278156576, 280774912, 102083856, 281765408, 163556656, -47663936, -4332549, -25672094, --213511952, -177250080, -124206696, -221905920, -211710752, -60574072, -133194456, -116287848, 26462368, 36965708, --28595892, 41084048, 60687352, -244813, 4424353, 120390616, 80583248, 30535070, 89302568, 166571712, -78663936, 91740504, 206434912, 81456736, 37279244, 178235232, 172160544, 7387881, 110191680, 194452496, -573915, 49251464, 115574352, -4691178, -94101120, 46541340, -19474992, -181646512, -169031120, -155659280, --302008672, -446889728, -310791360, -434803712, -578893440, -408809472, -331022272, -447922688, -285800000, -137820672, --132487392, -25393458, 133590128, 268937440, 304902400, 407628352, 555155648, 545121024, 516071456, 580908288, -580420288, 473622144, 381617504, 408232896, 271632512, 96346856, 129574328, 31514860, -238117280, -153473136, --161822016, -332800384, -280714752, -202219408, -236321456, -273893824, -170152640, -149067584, -206835424, -171030960, --88569208, -142349168, -186926640, -112752016, -79222280, -148663856, -83610664, 19250580, -46332496, -53366580, -59635620, -2390686, -75184480, -9943386, -47316580, -170468864, -118286080, -89816896, -157783680, -70967352, -39364448, 75255880, 139774880, 232244448, 270479328, 283416288, 318271584, 338409600, 333651840, 307201280, -286277824, 242683376, 193212320, 118089592, 88774824, 9987410, -76047768, -133461280, -212672288, -306159232, --297311584, -253665056, -229517680, -199735312, -136616464, -115801448, -103142032, -75254808, -49491444, -45008036, --19389092, -13026636, -9327058, -2040646, 16123844, 27232778, 36182952, 42131480, 49587544, 45695768, -41121092, 24771224, 17101486, 3621194, 4120484, -1491427, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +3418794, 2694018, -905701, 2068027, 963146, 5925981, -1047972, -141734, 727997, 4341675, +-872415, -4496294, -2115808, -4315369, 1037235, -1525787, -380641, -530965, 1027034, 434329, +860067, 2525978, 4592931, -2033667, -1154273, 937377, -2197413, -284005, 3578245, -1938104, +4427575, 475131, -1617592, 2971044, -4054449, -1016297, -2831457, 3960497, -139586, -1438814, +-1094680, 64961, 3642669, 165893, 4388920, 1712618, -3648575, 2954938, -1607928, -2690260, +-2235531, 3036542, -651761, 9637907, 998580, 2436857, 1728188, -4465156, 44560, -643171, +1151588, -2527588, -1742683, 5031018, 4085588, 389768, 1685775, -441308, 2535105, -4118337, +401579, 3123515, 1937567, 333397, -338766, 2230699, -3527779, -1600412, 3717294, -2439542, +776852, 1835025, 2191507, 694711, -2822867, -1854889, 1461900, 341450, 1449552, -430570, +405874, -1386738, -95026, -683974, -427886, 812286, 1522566, 660351, -908386, -334471, +-619012, 374736, 926639, -544924, 680752, 520765, 965294, -128312, 1161252, -466004, +281857, 730144, 907849, -7336341, -6628209, -4118337, -3757023, -3248606, 1245004, 4636417, +9438728, 1816234, 2433099, -13422, -6740415, -2814277, -2503966, -6047314, 9420474, 2511482, +3741990, 2594697, -2083059, 967978, 9020505, 3609383, -2121177, -164283, -2186675, 199716, +-4173098, 2522220, -1314260, -1859184, 360240, 4805532, 510564, 1685238, 3008088, 4169340, +-7441031, 111132, 1897302, 4348655, 6665789, -3688840, -744103, -1777580, 5562520, 3026341, +3590593, -573915, 1670742, 11127723, -7006166, 1428077, 665720, -4669167, 2010582, -6531035, +-868657, 1705639, -1404454, -9856950, 2785823, 709207, -2656437, -2711735, -441308, -1458141, +3353833, -3105261, -1371168, 1003412, -86973, -3018825, -129386, 2531346, -4119411, 400506, +-1110249, -957778, -1269163, -693637, 650688, -2376191, -1797981, 395674, -1424319, -1869921, +-1943473, -632971, -1283658, 2441152, -2094870, -555661, 360777, 1249836, -118112, 126702, +-715649, 191663, -1246077, 1000727, -1787780, 9912785, 914291, 3528853, -375810, -2715493, +251792, 6950868, 3616899, 4468914, 7267085, -3239479, 109522, 6973953, 2280628, 3037079, +435402, 816044, 4149475, -3772055, -1061931, 5171678, -3518652, 1990717, 3006477, -2275796, +2218888, 6949257, -3283503, 2533494, 590558, 219580, 124554, -1511292, -4742181, -1534377, +-3968013, -477278, 1709397, 3295851, 3579318, -695785, -5958194, -608275, 8785356, -3305514, +1802276, -1633698, -9170292, 5312875, 1387811, 3926674, -631897, 4479651, 4468377, -7902740, +3165928, 165356, 2974265, -655519, -5454072, -339302, -734976, -1088237, -995359, 3425237, +24696, 602906, 7153805, 1294933, 5696737, 98247, 593242, 998043, -3056943, -4970351, +3389803, -3783329, 2244657, 1284195, -144955, 2240899, -2420214, -1493575, 1612223, -9127, +-4669167, 1429687, 606127, 519691, -905701, 1954210, 244276, -909996, 2328409, -614180, +-147640, -1992328, 727997, -1042603, 377420, -82141, -230854, 357556, -671626, 1132798, +333934, -583579, 405874, -390305, 184147, -157303, -707059, 16291885, 9166534, 13938243, +4534412, -5795522, 2971044, -2603287, 401579, 1340030, -11883101, -3185792, -3266323, 3054259, +4680978, -1943473, -266288, 1552631, 383863, 8492224, -932008, -8944269, 2913062, -5180268, +3971234, 4503273, 3614752, 5248987, -1263257, -1844152, 2142115, -1601486, -2072322, 1495722, +-1383516, 3140695, 4532264, -1979443, -6870874, 2192044, -6683506, -4328254, -841814, -13927505, +135291, -2370822, 5450851, 5178120, 2511482, 8494372, 8568460, 3773666, 1905355, -644782, +412854, 459025, -3892314, 7931194, -1067299, 2741800, -2529736, -3058017, -1101659, -4570919, +4002373, -2127620, -1691143, 7777112, -6508486, -2019172, 1642825, -3005403, -913217, -264677, +2723546, 3202972, 2156074, 5531381, -1831267, -1535988, -819265, -3520263, 1835025, 3544959, +4886062, -111669, -754304, -1060857, 46708, 1037772, 1019518, -1489280, 1615445, -38118, +1160715, 981400, -213138, -402653, 2090039, -622770, 1048509, 850404, 963146, 855772, +-617402, 774705, 3539590, -277562, 161598, 404801, 2608656, 457951, -603443, -1879585, +-6206228, -14286135, -5110474, -1483911, 2021856, -1764158, 4315369, -939524, 6973417, -6280853, +3680250, -1541356, 12836584, 5408975, -2844879, -5489505, 2938831, -7817914, -4234838, 3046206, +-2807835, -4652524, 8858907, 3738769, -564251, -4083440, -5617817, 3804804, 2847563, 2849711, +-302795, -1350767, -3497177, 5276368, -6903086, -2896419, -383326, 4902169, 3654480, -308701, +5293547, 718870, -2578591, 1134945, -2568927, -2557116, -3090766, 3823058, -2843268, -41339, +4918812, 7505456, 7556995, 3178813, 2628520, -441308, 4246112, -1679332, 6139656, -1020055, +3886409, 3118146, -2638721, 383326, -2883534, 3089692, 2559801, 1125281, -1040456, -5158793, +3612604, -5619428, -761283, -6085432, 2188286, -381715, -663036, 1247151, -5299990, 319438, +1291711, 8571144, 2687576, 1511829, 1946694, 3396782, 1394254, 1806034, -2596308, 1993939, +1379221, -3389266, -359704, 280784, 675921, 1583232, -1783485, 1200443, -1178432, 337692, +-277562, 2245731, 158914, 372052, 191663, 825707, -513249, 2049236, -1129576, 835371, +689342, 1980517, 826244, 2708514, -1948305, 1076426, -510027, 3107409, 1085553, 1178432, +-453656, -310848, 169651, -474594, -2021856, -6649146, -14017163, -11288785, 688805, -9644349, +-4773856, -13665512, -7299834, -8326331, 3299609, -4445291, -5943698, -2021856, 306016, -3511136, +-13302587, 3572876, -2369748, 1339493, -6033892, 5998996, 2199560, 139586, -5371931, -2379412, +6774774, 4638028, 277562, -1010391, -4585415, 2845416, 1449552, 2945811, -5486284, -507880, +-4462471, -3980361, -4366908, 449898, 8778913, -7185481, 125628, -6846178, 671089, 3183108, +3964792, -7220377, 7227356, 8807367, -2937758, -2101850, -1571958, -354335, 2767033, 3549254, +845572, 2411624, -4332012, -844498, -1632625, 7572028, -2413235, 8380018, -254477, -2588255, +6654515, -712965, -4046396, 1416266, 7211787, 8337606, -670552, -2632815, -4594542, 2858838, +-6118718, -623307, 4018479, -3133716, 1783485, -238908, -86436, -2526515, 4832, -1966021, +-3090229, -338766, 2518462, 1328756, 2507724, -1178969, -883153, -2084133, 746251, -1692754, +2610803, 1318018, 3668976, 311922, -926102, -374199, -717796, -1364189, 1648731, -1214402, +-731218, 650151, 513249, -1887638, -700080, 437013, -3758, -1069984, -1838246, -170188, +-1700807, -1194538, -749472, 2080912, -220654, 674310, 579821, 19864, -1347009, -459025, +-10846403, -10730439, -12461311, 3687230, -10097468, -4160213, 9649718, 4751308, -10956462, -702227, +79457, 4835597, 7118909, 12240657, -3329137, -4354023, -12027519, -14696304, -8730595, -2928631, +5979668, -5940477, 2863670, -8451959, 8796630, -6332930, 7058779, -3249680, 965831, 1887101, +-1452236, -6244346, 9926743, -8555038, -464393, -4545149, 1187022, -5301601, 1197222, -21484500, +315680, 10064182, -12847321, 2973728, 8719320, 3192771, -6709276, -691490, 10501732, -12934831, +-82141, 5370320, 5060545, 5052492, -1915019, -1822677, -8440148, -4109747, 3401077, 5791227, +9084393, 11191074, -16432545, 6297496, -4989142, 1263794, -11599096, -4635344, 9473624, 2388539, +1264331, -6282464, -36507, 6204617, 4423280, 2805688, -5766531, -3630858, 5912560, -1513976, +-2568927, -1219771, -4257923, 3660923, -741956, -3259343, -1322313, -1071594, 811749, -2080912, +-2338073, 863825, 765041, 989990, -1354525, -1828582, 1574106, -1141924, -4403952, -308701, +-1349694, 2713346, -2074469, 213138, 153008, 1132261, -2781528, -1452236, -1043677, 368830, +2830384, -258772, -751082, 1862405, -30602, 1833414, -892279, -1855963, -797253, -3202972, +675384, 56371, -2355253, 1309965, 12831752, 21485038, 11905649, 14014478, 2099165, 4993973, +18786724, -562104, 532576, 12907450, -6327561, 57982, 3673808, 6448357, 10595684, -8619999, +-12359842, 6824703, 3746285, -7131793, 1506997, 4425427, -2774549, 2554969, -6666326, -1472637, +-7780870, 2413772, 8423505, 2655901, 7376070, 5751498, 5997922, -14635101, 744103, 17098264, +-2055142, -274878, 15883863, -2066416, -585189, 2386928, -2119030, -436476, 8783745, 13862007, +-13608067, -2183991, 2692408, -4139812, 6396280, -2128693, 613107, 1038845, -2979097, 12207908, +-1575716, -4403952, 4548371, -4567698, -7610682, 2651606, 8284455, 3168075, -934155, 1712618, +7927973, 4179003, 7102266, 2177549, 876173, -49392, -6984691, -1412507, -5472862, -1219234, +-2301029, -12396886, -5386963, 833224, 8012262, -3262565, 3096672, -2099165, -6573448, 2947958, +713501, -2058900, 1032403, -3971771, 201863, 1026497, 2458332, 3528316, -834297, 2284386, +-3013457, -4438849, -5345087, -535797, 4844186, -843424, -376883, 1647657, 268972, 564788, +2610803, -1232656, -477815, -1392643, 3753802, 117575, -552440, 470836, -943819, -1968706, +-2396592, 1022739, 2135136, 2682744, 1468879, 1081795, -462246, -140660, 46171, -835908, +-3684545, 36210332, 5020280, -772557, -219043, -17377974, -5083631, 1678259, -4053376, 7668664, +3373697, 12429635, -1582159, 20401, -2681133, -5253282, 8338679, 1568737, 3190624, 4683125, +6528351, -6138045, -6182069, -7144678, -4972499, -4092567, -1793686, -9815611, -1925756, 15853798, +7474317, -3015067, -1071058, -1862942, 1323924, 5616207, -2745558, 22655416, -3937411, -616328, +-10282152, 4109747, 9884330, -1699196, -7565585, -981400, 3808026, 7587597, 3278134, 10666014, +15932181, 5190468, -338229, 9463960, 7732552, 2891050, 5976984, -19857782, 4610648, 525060, +-17569638, 6454799, -409633, -7570417, 4954782, -8028368, -7810398, 9319542, 7334731, -4139275, +-15544024, -7035694, 3739306, -8936216, -1817308, 3909494, 15278809, -2475512, 3094524, -7959648, +-16772384, -9009231, -8032663, -3641059, 8025147, 1098438, -5558225, -1685775, -3460670, -3383897, +5139465, 4270271, 1660542, 3647501, 4340065, -3637837, -2658585, -2702071, 599685, -2963528, +-4389994, -4274566, 1879048, -1447404, -610422, 610422, 1607392, -3629247, 2087354, -778463, +-412317, -1605781, -561567, -2280628, 5754720, -3532074, -1204202, 1021129, -3646427, -3537979, +-2665027, 224412, 2945811, -19191524, 12086575, -2223719, -12400107, -491237, 11242614, -12862890, +-2732673, -10370735, 6854768, 2230162, -3841312, -4415764, -1615445, 6905771, 5253819, 2966212, +7153805, 6307160, 610422, 7616588, 8703751, 3615289, 4799089, -8907225, -4399657, -6201933, +5468030, 7185481, 2520609, 2222646, -4275103, -3098282, -2641405, -2298344, -7618198, 6925098, +1534377, 449898, -8152385, -2418604, 12799539, -9259949, -9943923, -15155866, 5228049, -11367705, +16429324, 19085760, 13080323, 7696582, 662499, 14918032, -7964480, 11724187, -1606318, -8366060, +535260, 682363, -18034030, -7990787, 6648073, 1024350, -3130494, 2707977, 14961519, 10291279, +-17396766, -4382478, -359167, -465467, 4884989, 7357279, -456877, -13884019, 5471789, -8061654, +-25848724, -7500087, -5352066, 7976828, 12879533, 4377109, 528818, 652298, 272194, 1147830, +9135932, 21475, 1254131, 1179505, 4553202, -8201240, -558883, 2503429, 5982890, 7344931, +2480344, 4356171, 6389838, 8579734, 10953240, 4218732, 5357972, 5402532, 145492, -517007, +-2137820, -1378685, -73551, 2248416, -6609955, -1614371, 3644817, 6062347, -784368, 1693828, +-965294, 2540473, -93416, 3885335, -765041, 3725347, -2918967, 4773856, -44560, 4508642, +-16095390, 1604170, 1789928, 10067403, 2168422, 25721486, 4093641, -10616085, -3435974, -8938901, +16252693, -20852066, -1864553, 14412837, -31498216, -12431246, -10631118, -11012296, -20892868, 1974074, +-3664681, -8960912, -1144609, 9881109, 1240709, 1309428, -6165426, 2448668, -2088428, 2433636, +9127, 1561221, 8054138, -1959042, -502511, 16389058, -10604811, -2136746, 2828236, 14115947, +-7415798, 20156282, -6106370, -8144869, -17261474, -22457848, -6555731, -16716013, 8149701, -5073430, +-12553653, 1712081, 2024003, 9244380, 7816841, 3266860, -1592359, 28526636, 15785079, -1803349, +2779381, 9767829, 7300371, 4743255, -3866544, -558883, -5122822, -6652905, -6156299, 4298189, +22245784, -15557445, -3813394, -8861054, 16030429, -4226785, 4965519, -2290291, 7525320, -17621178, +-13181255, -4553202, 7485591, 2370822, 6463389, -3900904, 3986267, 6028524, 5294084, 2508798, +-1053878, -7519951, 4730370, 1762547, -6381248, -4480725, 3991098, -4201552, -3180423, -139586, +4297652, -4003447, 5179194, -3251290, 7399155, -4128001, 827855, 2573222, 1345935, -3577171, +-6761353, 5230197, -2030983, -1531693, -528281, -716723, -2137283, 4958540, 6204081, 4292283, +3796214, -753230, 2189897, 7104413, -3838090, 2797634, 1236951, -185757, 1568737, -479426, +385473, -2594160, -12823162, -12326556, 6950331, -5527086, -23089208, 11432666, -6877854, 9128953, +-6635188, 11490648, 7839389, 9552007, 15322296, 2470143, 12968117, 5194763, 3364033, 8779450, +3055869, 2395518, 650688, -384936, -8205535, 7312719, -16683800, 7291244, 1772748, -4807142, +-8977019, -257161, 6488622, -7482370, -3085934, -11178189, -4290136, -13755707, 903554, 7536594, +-102005, -1802813, -8678518, -15185931, -10972568, 11829951, 3998615, -4962298, -8667781, -2156611, +-651224, -14847165, 12600897, 11403138, -14553497, -14212584, -23203560, -3561065, -27770722, 7475928, +10893648, 5681168, -1675037, -3573413, -2811593, 11399380, 11610907, 13300977, -8608725, -6920266, +8979703, -3868155, -4083440, -16337519, 7322383, 13310641, 15344308, -3617973, 8442295, -4716411, +2595771, 8330089, 4395362, -5904507, 2853469, -10093710, -6039261, -4198868, 1592896, 4232691, +3746822, -4011500, -3557844, -1508070, -4410932, -911070, -6113349, -7767449, -3956739, -3249143, +-2262374, -1052267, -2137820, -3100430, 797253, -162135, 4614943, -1574106, 5863704, -1530619, +4711043, 289910, -2452963, 1149441, 11735998, 3571802, 6055904, -2692945, -4541928, 935229, +4369056, -4071092, 8562017, 8433705, 2576981, 3949759, 1922535, -9691057, -4928475, 22184580, +25709674, -10188199, -537408, 6895033, -20735028, -3888019, 25865366, 868120, -28098750, 3055869, +8685498, -705985, 9812927, 23078470, -9441412, 20857434, 11355357, 17799418, 5034776, -13676786, +-14507863, 11633456, -13161390, -20750060, -5983963, -24648280, 5456756, -1677185, 8781598, 7499013, +5413807, 2763812, -956167, 678605, 12552042, 6096169, -24108726, -2837900, 8123931, 15512348, +8687108, 19221590, 17383344, 13578002, -6386617, -2326262, 3631395, 35006132, -14624364, 2561948, +7458211, 13730474, -5622649, -19464254, -4046933, -4908611, -11681774, -21526376, -23469848, 6454799, +-13147432, -9951976, 6120866, 18512920, 22844394, 433255, -1251983, -274878, 17556752, -11880416, +-6033356, 20738250, -22563074, 2510945, -17816598, -11973832, 1372242, 24049132, -3860102, -16443819, +21488258, -21949430, 936840, -26497800, -2292976, -3323231, 7851737, 14746770, -10864120, -6198175, +-7665980, 1990181, 594316, -8203388, 4714264, -2421825, -2265595, -3494493, -2774549, -9713605, +2245731, -4673998, 3505767, 2632815, -648003, -2139431, 5968394, 14496, 153545, -11454678, +1785096, -964757, -311922, 10709501, 1145683, 3034931, -4393215, 1743220, -2502892, -6216429, +2809982, -12685186, 4318053, -4363687, 9597641, -7541963, -942208, 1771674, -971736, -1960116, +-3864397, 7081864, -4575214, 7710003, -2633352, 4552129, 12068321, -14183593, -31756452, -7492571, +-11081016, -10463077, -6570226, 1474784, -10888816, -9210020, 3029563, 7074885, -6841346, 16811576, +-1834488, 11263015, -5700496, -671089, 9687299, -13858786, -8689793, -4718559, 14456860, -3490735, +-15904801, -6003828, 2385854, -7708930, 6584185, -10656888, -10729365, 15569793, 4508642, -12342662, +7477538, -1490891, -9741523, -947040, -16141561, -13870060, 2734821, 24174760, 9731859, 7530689, +-19394462, 14923938, -1731946, 11433203, -6770479, -13493714, 6542846, -24887188, 20769388, -33694556, +-21370146, 7800735, 18532784, 1433445, 22194244, -9719511, 5808944, -15416248, 20818780, 6695854, +15479599, 7131793, 3623879, -4893042, -5206574, -10176925, -3568044, -612033, -17969606, -10722923, +1556926, -27217208, 1517197, 30562450, 9097278, 11005854, 2929168, -13866839, -10451266, -2828773, +-3360275, -986232, -5403606, -7295539, 6074695, 3996467, 5510980, 8633958, -8735963, 5667210, +-3326989, -4712653, -3570192, 7688529, -2613488, -8390219, -12720619, -88584, -7664369, -3604015, +-7857106, -2180233, -5155572, -3092377, 11950747, -6534793, 2723546, 3706557, -9610526, 10948409, +90194, 6546067, 8612483, -4011500, 4253628, 1931662, -398358, 2663954, 7206419, -4184372, +-4100083, 6644852, 558883, 5282810, -23865522, -22257058, 2196876, 9173513, -11253888, -50353124, +-10525354, -257161, 6581501, -17031692, 1472637, -9496710, -1979980, -13568875, -15151571, 13460428, +-14734422, -18078054, -3057480, -12652974, -13916231, 4793184, -20215874, -6689949, 12197707, 27935542, +22562000, -1075889, -13764833, 4830228, 20308216, -936303, 13506062, -3874597, 17013440, 9568650, +-17476222, 27816356, -21199958, -11193222, 18721762, -20627118, 6226092, -4736812, -15527381, 1834488, +23533736, -4878546, -13833016, 8817568, 11548093, -325881, 4779762, -33839512, 8172786, 1422708, +17076254, 8276402, -14846091, 14754286, -7909719, -1275068, -13758928, 7321846, 19832548, -4074313, +-3923990, -20315732, -28749438, 16368657, -2079838, 13191455, -15722802, 11978664, 9560597, -20447802, +1180579, 18234284, 10407780, -9538049, -16450798, 14916958, 2429878, -12767327, 12133819, 2021856, +5410048, 1461363, 5027796, 963683, 13557601, 210453, 4668630, -894964, 563714, 12061342, +-3878892, 322659, 2739116, -3131568, 2197950, 1102196, 8316131, -403727, -9252970, -1115081, +1178969, -5481452, -1638530, 617402, -3694746, 12489228, -2939905, -7128035, 792958, 7954280, +3730179, -402116, 4522064, 657667, -5187247, -631360, 13100187, 8962523, -8857833, -6469295, +1893007, 18979460, 19041738, -51345796, 19358492, 26025354, -6622840, 18103824, -183073, 9381819, +-4168266, -10560251, -6820408, 10918881, 2576444, -14834280, -9635222, -1373853, -6956774, -3800509, +-1593970, 31758598, 6385543, 7030325, -19649476, 13673028, -13991930, 204011, 2461016, -21474836, +10027675, -7963406, 1119376, -8696772, -15523622, 419296, 10304700, 29427506, 10584947, 3055332, +18204756, 7703024, -2197413, 2987687, 459025, 5134634, 2982855, 19959250, 8737574, 6030134, +3294240, -2564096, -6205154, -19658602, -16500727, 2287070, -2359011, -12131135, 1722819, 14737107, +-22487912, 21721260, 5599027, -8007430, -903017, -5822902, -1802813, 13154411, 5754183, 4281546, +-15280957, -3113851, -20885890, -6449967, 5816460, 7628936, 7609609, -9051644, -7260642, 16179142, +-1908576, -26244398, 3769908, -488016, -286152, -15501611, 5078799, 11575474, -1599875, 16665547, +11243688, -5619965, -308701, -7245610, 9006546, -791885, 2968359, 1352915, -3791919, -3184718, +-695248, -3301219, 3652870, -7203197, -704912, 405874, 3885335, -3723200, -4310537, -5151277, +280247, -1273458, 2861522, 1625645, -151934, -3228742, 3473555, 2603824, 512712, 3777961, +692564, 2693481, 2516851, 3582540, -999117, -13187160, -498216, -3781182, -45634028, 70723080, +-69924216, -31622770, -15978889, -4773320, 40907952, 12021077, 45795624, 11434814, -9364102, 36082020, +15612743, -12218108, 16915192, 15308337, 8560407, 14322105, 13890461, -12385612, -19997904, -14241038, +2304250, -13096966, 6906308, 4101157, 8955007, -1402844, 6186901, 2084133, 22480932, 5323612, +2108829, 6911676, -5251672, -327491, 7927436, -14121852, -20074140, -13654775, -11684459, 1981591, +5939403, -14161581, -2315524, -8528731, -34795676, 17500918, -6301254, 8848170, -18309982, -6234145, +-16961900, -23244900, 8759586, 6138582, 22585622, -994822, 19897510, -8451422, 16664473, 1945083, +23790898, -16884054, 14714558, 17673254, 9774809, 10242960, 853625, -7252589, 27860380, 18631568, +-1866163, 33606508, 8038568, 3914863, 14380624, 21654688, 245350, 9943923, 12498892, 5696201, +5447629, -2538326, 1083942, -19681688, -5051956, -2677375, 3100430, 4098473, 3861713, 13042205, +5750425, 6635188, -5150203, -744640, 5104569, 514859, 396211, -4702453, 5338108, 4526896, +2548526, -3678103, 6790344, -1071058, 1175210, -5330592, -4963909, -2008971, 493921, 574452, +-3270081, -10844792, 2455648, 2313377, -2983392, -574989, -2829847, 783832, -4019016, 2631741, +-3874597, 132607, 9631464, -2787971, -9673340, 6207839, 4451197, 3765613, -2384244, -1313186, +43176768, 3740917, -26011396, -38210176, -20270636, -15940234, 5127117, 31641560, -524523, -13367549, +28294708, 2341294, -22870164, 20582558, 22315040, -4076998, -422517, -2152852, -20245402, 22509924, +1264868, 12788802, -7140383, -17992692, -31481574, 5750425, 3972845, 4884452, -4444755, 9911711, +-10469520, -108985, -20177220, -25124484, 8828305, -3165391, 8002061, -3615289, -9327058, -22747758, +-35334160, 18138720, -19746112, 8122320, 16995186, -1170916, -9096204, -17330730, -12501039, 40705016, +9247601, -1835562, 5289252, -5355288, -16445967, -5377836, 23594402, -22792854, -38379292, -13389024, +-12181064, -53763328, -42018200, -22608708, -23365696, 5793911, -242129, -18698676, -35874788, -14179298, +-16952772, -12161200, -9810779, -7211787, -21456046, -20556788, 16276315, -18254684, 1162326, 2785823, +-22479858, -3924526, -16401406, -20548198, -4982699, -3335579, 9555765, 4025458, 12847321, -13121662, +3399467, 7568806, -32212, -17655000, -9972377, -11840151, -1120987, 5784784, -5975374, -8582418, +15358803, 9143449, 11068131, -18047990, 3120831, -8772471, -954020, 784368, 1859184, -2143726, +18315352, 1460289, -3146064, 2331094, 6467684, 9238475, 7654169, -1182727, 10895795, -7765301, +-4068408, -3330210, -14057428, -378494, -4226248, -18161270, -15120432, 2655364, 865973, -278099, +-4551592, -3978750, 29667486, -3526705, 28262496, 41829224, -7705708, -45412836, -43940200, -9514963, +21079162, 2825552, -34482680, 27012660, -5892159, -22675280, 27796492, -52298744, -10961830, 164819, +-9233106, -8119099, 63356672, -26667988, 59373628, -3065533, 12510166, -4527433, -23421530, 37877852, +10117869, 39386996, -27057220, -26843546, 8662412, -43211128, -12869333, -7079180, -29908004, 62126164, +-5390184, -64796024, -946503, -28986734, 8456254, 15732465, 25948044, 20856362, -25486872, -16166257, +-39677444, -11831024, -18355616, 16821776, 11289858, -2359011, 11749420, -8155606, -28134184, -11749420, +-32838784, 33506650, -25380036, -17787070, 30313342, 6942815, 51216412, 24589762, 4531728, 26792542, +-36134632, -13727789, -37309844, -36532456, -5535139, -5504001, -45528264, 46784540, -8202314, -36696200, +-54235236, 3339874, -10698227, 39573292, -2456185, 1850057, 5426691, -7346542, 7631620, 8739722, +18767934, -12723841, -12517145, -8276402, 656593, -2499671, -2527588, -12028593, 13280039, 7946763, +15823733, -3907347, -8420283, -7493108, -2696166, 2747169, 21161840, 22189412, -3561065, 1034550, +12255689, -3586835, -27967216, -13815299, 1837709, 3667902, -2119030, -18070538, 6349573, -2306934, +-4173098, -20661478, 8105677, 6760816, 24481314, 3828963, 6089190, -1363115, 10113574, 1606855, +-5742372, -84701584, 43760348, 10011032, -18227842, -13848585, 27057758, 14794015, -16292422, -4533875, +-39785356, -16750372, 17002164, -34524020, 1388885, 6097243, -10455024, -23058606, -15606301, 30844308, +12497281, -6305012, -44392244, 14963129, 28057948, 16056198, -34354368, -23036594, 224412, 37376416, +3422015, -9166534, 5989332, 1108638, 19235548, -50039052, -43112344, 53368188, 8385924, 22268332, +-50765976, 10979547, -2195265, 37182604, -33331094, -6489159, -50886236, 17739288, 36852432, 8523899, +-22545358, 14516989, 53444964, -23992224, -25325812, -20046760, 7700340, 2139431, 46905876, -14055817, +3714073, -25308632, 8408472, -27743342, -773094, 17681306, -34418796, 32968706, 10174241, -24076512, +-37237368, -22768696, -1734630, 33266132, -60151016, -13204877, 54744728, 7126962, -24447490, -11637214, +-17186312, 51347944, -5512591, -53940496, -6067178, -80531, -13085692, 21912924, -3561065, -7610682, +16882980, -1556926, -10831371, -14177687, -1249299, -12505334, 4022774, 9102109, 12350715, -10885058, +-7725036, 11163157, -7086159, 10572062, -5359046, -10848014, 15093052, -8169565, 13627931, 18333068, +1477469, -26656178, -1513976, -15899969, 6913287, 9802726, 6735583, -18629958, 512175, -14071923, +13465259, -3969087, -7714835, -5381594, 3192771, 4492536, 55988120, 28586766, 13028246, 12884365, +13590350, -8952322, -8645769, -18926848, 2538863, 6014028, 5102421, -1181653, -31994822, 15328201, +6483790, -22429930, -18797998, -9766219, -10916196, 8247411, -8107825, -9565966, 2943663, -868657, +-16888886, 21805548, -15516643, -5167920, -16128139, -14894410, 10853919, -6397891, -1939715, 5420249, +7162932, -1873680, -21519396, 5094905, 34121368, 7152731, -52947820, -3449933, -11313481, -16614544, +11433740, 11910481, 27762132, 13169443, -34445100, 37535328, -9075803, -26156888, 78588240, -15868294, +-6454262, -25918518, -62027916, 28447716, 31889596, 10364293, 12199855, -53314504, 15737834, -4229469, +-12643847, -9439264, 2392834, -5120675, 8595303, 10082973, 2464238, -7947837, -14976551, 16107738, +20553566, 28214714, -13707388, -2900714, 6272263, -4189741, 15079093, -36574332, 3808562, 6443525, +-16858820, 2815351, -13999983, 5581310, 528818, 4478041, -2090039, 1005022, 1677722, -738198, +-222265, -4863514, -3520263, 9769977, -5129265, -355945, 7492571, 1619203, 599148, 11957726, +-9575093, 7337952, 8847096, -502511, -1444720, -10074920, 8460012, -18860812, -5029407, 12380780, +3839701, -5104569, -12507482, 3927748, -2692945, 15414638, -31584652, -76201848, -128408784, 10289668, +130941208, 12390444, 278156576, 280774912, 102083856, 281765408, 163556656, -47663936, -4332549, -25672094, +-213511952, -177250080, -124206696, -221905920, -211710752, -60574072, -133194456, -116287848, 26462368, 36965708, +-28595892, 41084048, 60687352, -244813, 4424353, 120390616, 80583248, 30535070, 89302568, 166571712, +78663936, 91740504, 206434912, 81456736, 37279244, 178235232, 172160544, 7387881, 110191680, 194452496, +573915, 49251464, 115574352, -4691178, -94101120, 46541340, -19474992, -181646512, -169031120, -155659280, +-302008672, -446889728, -310791360, -434803712, -578893440, -408809472, -331022272, -447922688, -285800000, -137820672, +-132487392, -25393458, 133590128, 268937440, 304902400, 407628352, 555155648, 545121024, 516071456, 580908288, +580420288, 473622144, 381617504, 408232896, 271632512, 96346856, 129574328, 31514860, -238117280, -153473136, +-161822016, -332800384, -280714752, -202219408, -236321456, -273893824, -170152640, -149067584, -206835424, -171030960, +-88569208, -142349168, -186926640, -112752016, -79222280, -148663856, -83610664, 19250580, -46332496, -53366580, +59635620, -2390686, -75184480, -9943386, -47316580, -170468864, -118286080, -89816896, -157783680, -70967352, +39364448, 75255880, 139774880, 232244448, 270479328, 283416288, 318271584, 338409600, 333651840, 307201280, +286277824, 242683376, 193212320, 118089592, 88774824, 9987410, -76047768, -133461280, -212672288, -306159232, +-297311584, -253665056, -229517680, -199735312, -136616464, -115801448, -103142032, -75254808, -49491444, -45008036, +-19389092, -13026636, -9327058, -2040646, 16123844, 27232778, 36182952, 42131480, 49587544, 45695768, +41121092, 24771224, 17101486, 3621194, 4120484, -1491427, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 10251550, --424128, -542777, 3265786, -1328219, 3730179, -1974074, -4786741, 1686848, 4809290, 712965, --746251, 6389301, 217433, 266825, -2178622, -1212255, 9953587, 1387274, -6755447, -4993973, -7020661, -637266, 7280507, 513249, -1382980, -682900, 5499169, 1090385, 11543798, 5085242, -3178813, -619549, 2565169, 5223754, -1283122, -3890167, -4887673, -935229, 4408784, 3791919, -5881958, 1653562, -3287261, -3418794, -1422708, 2457795, -786516, 1352378, -668404, -5232881, --4038880, 1603097, 3823058, 2353105, -1891933, -2158758, -144418, 5708012, 2905009, -625455, --1275605, 2646774, 1787243, 1136019, -2909304, 1464047, 2737505, -351114, 4180614, 4932770, --8614631, 3164854, 1762010, 5624260, 1698123, 447750, 2567854, -1139777, -4015795, -1492501, --2419140, -807454, -497679, 2445984, -122943, -1957968, 30602, 288300, 1461363, -1271847, -237834, -246424, 522912, 747324, 523449, 964757, 97711, 595927, 2881923, 4487167, -9698036, -7882876, 1774895, -1730335, 110059, -10129143, 1016297, 6094022, -9011378, -1867237, -6018860, 15976741, 2288681, -107374, 1134945, -10005126, -323733, 7377680, 6546067, 181462, --209380, 609349, 3435437, 5756330, 6063420, 6557878, -2929705, 1420024, -399969, 2530810, -707596, 1633161, -10154913, -2779381, 1582696, 833224, -5616744, -176094, 3830574, -4463008, -3526705, 3260417, 6010270, 2819646, -2299418, 3005403, 6717329, -3757023, -6067715, 2041183, -1406602, 1190780, 3183645, -2683818, -4906464, -7306276, 5905043, -1081258, -1383516, -2372433, -2591476, -83752, 3829500, 7579007, 1532230, 522375, -408022, -1820529, -5906654, 9193377, -2260227, -1088237, 4747550, -737661, -5444945, -4778688, -1063541, 1816234, -7940858, 663572, --4707821, -879395, 2422899, -128312, 1273995, -1410897, -2596845, -541166, 1312113, 1809792, -1333051, -265751, -796716, -35970, 1297617, -673236, -1322313, -976568, -4754529, -4126927, --5158256, -7329899, 4102768, -95563, -3502009, -1394791, -1789928, 1590212, -2909304, -5033165, -1145146, -3273302, 8596914, 11426760, 9037685, -6254010, -240518, -413391, 2417530, -3471944, -7090454, 4445291, -1011465, 3432753, 5377836, 434329, 1304060, 1875827, 5225365, -500364, -1944547, 6251862, 637803, -71941, -2729989, 4498442, -6793565, 2744484, -949725, -1396938, -4530117, -4375498, -550830, 154082, -5904507, 2454037, -1189169, 2735894, -188442, -2552821, -1796370, 1879585, -308701, 5247913, -372052, 6054294, -87510, -4023848, -1787780, 233002, --2744484, 5399311, 2820720, 4635344, 5259725, -2296734, -5199595, -3398930, -2147, -964220, --1104880, 4285304, 5410048, -806917, -2957085, 1882806, 1480153, -2069101, -2821257, 972273, --4054449, 992137, -72478, -125091, -1081258, -3841312, 875100, -1511292, 165356, 1722819, -6442, -1961190, 992674, -2690260, -40265, 175557, -609885, 228707, 525597, -1469953, -35433, 182536, -1735167, 372588, -514322, -104690, -906775, -22012, 498753, -15112916, --3567507, -4704600, -8178155, 2790118, 2137820, -970663, 3798362, -522375, 3205119, 4535486, --1995012, -5282273, -6665789, -2537252, -6207839, 490700, 683437, -2698850, 3520263, -3033321, -1887101, -1384053, -3542811, -9405978, -3664144, 841814, 1477469, 2476049, -3500935, 2501282, -3780645, 1254667, 8582418, 2138357, -221728, 6649146, -4699768, 3841312, 629750, -2233920, --3183108, 4288525, 574452, 1356673, -10136123, -1867237, -3351148, 10183367, 4362076, 3668439, -4130148, 4675072, 3696893, 5184026, -2745021, -1111323, 3175055, 5092221, -687732, 5946919, --3204046, 1300838, -1293322, 5036923, 7540889, -11785927, 3085397, -2916820, 373125, -5561446, --2862596, 927713, -1692217, -2390686, -4722317, -2129767, 2216203, -117575, 5040144, -535260, -1939715, 4369056, 6944425, -265214, 1829656, -819265, 3228742, 512712, 1567126, -2164127, --766115, 223338, 1471026, -971200, -1584306, 68719, 78920, -1228898, 176631, 697395, -19864, 2017024, -900333, -957241, 220654, 1755568, -725313, 28454, -652298, 1040456, -1615982, -239444, 1545115, 1689533, -424665, -746251, 5900212, 3622805, 2138894, -1119913, -485331, 644245, 7620883, -6049999, 7645042, -1012002, 4166655, 7838852, -4904316, 6074695, --3794604, 3119757, 1188632, 9215926, 4075387, -5124433, -8441221, 1928440, -6328098, 5212480, --1296006, 6791417, -5054103, -816581, -4046396, 2346126, 1510755, 1947231, -503048, -715112, --7366406, -3226057, 6065031, -4822712, -976568, 3947612, 191663, -3773666, 1239098, 348429, --841814, -3270081, 6631430, 2121714, -9426916, -4248260, -7608535, -1323387, -6725919, -11602317, --2636573, 5078799, 14316200, 3139621, 1191853, 6753836, -166967, -5265093, -4601521, 3777424, -1480690, 2555506, 4143033, -10107132, -2473364, -9294846, -2028835, 2627446, -3672197, -8588861, -890132, 3744138, -1821066, -3180423, -1495186, 1517197, -1256278, -339302, 1910187, -1158031, --1247688, -1712618, -1236414, -3917547, 1441498, -1002338, 1847910, -641561, 1096827, 2516851, -386547, -644782, -193810, -2073932, -1353452, -3300682, -2983929, 492848, 409096, 31675, -1234803, 1982127, 1413581, 33823, 1293859, 1084479, -855235, 799401, 850940, -1700807, -16449725, 3915400, 11910481, -5584531, -774705, -3973382, -916976, 12654047, -10794863, 3622268, -1225676, 16571594, 8824547, 10996727, 2009508, -2736431, 5191005, -3619047, -13740137, 2612414, -781684, 1610613, 10829223, 1028108, -6362457, -562641, 285078, 3432753, 3748433, -326954, --1417876, 4418448, -5176510, -1428614, -2621004, -1330903, 1336809, 195958, 9539659, 1371168, -7490960, 8631811, 2390686, 7612830, -564251, 2517388, 4630512, -5002027, -7464117, 932545, -7518877, -12014634, 3576097, -9220758, -8610873, -5287105, -2386391, -8114267, -7853348, -8319889, --4262755, -2075006, 5582384, 129923, 6688338, 1006633, -5507222, 8427263, -8767102, -3332358, --3628711, -3608310, -4647155, -6128382, 8753680, 6802692, -3825205, 3337190, 2756295, 6911676, -28454, 4990215, -2454574, 6274411, 3175055, -3714073, 216896, -3356517, 4002910, -3828963, -427349, 3084860, 238908, 2358474, -670015, 373662, 1649268, -558883, -1676111, 1552631, --446140, 263604, -3226057, -2687576, -2572686, -2024540, -333397, -1134408, -2226941, -110595, -475668, -1058173, 271120, -83752, -8826695, -8984535, -5206037, -5535139, -2872796, -2308008, --10597832, -8609262, -7184407, -1155346, -572304, -1387274, 7440494, 697932, 3866544, 5624797, -6684580, 998580, 13018583, 16191490, -286689, 4656819, 3712999, -2017561, 7150584, 3805341, --14544907, -533113, -5000953, 798864, 11333345, 4444755, -11621645, -3146064, 5240397, 5105643, -761283, 14893336, -6142877, 5977521, 6143414, 6607807, 3941169, 7704635, -13101798, 4769561, --5085242, 7763691, 337155, 3317325, -9825275, 7199976, 5296232, -1322850, 5129802, -901406, -1465121, -146029, -5102958, 1289564, -3245922, 3173444, -4015258, 5004174, 1635846, 12606803, -9510668, -3034931, 3427921, -10489921, 9134859, -2908230, 5621039, 9761924, 9692667, 396211, -9899363, 6746857, 4707284, 4938676, 9100499, 835908, 2003065, -7455527, -1234266, -2186675, -1746978, -5397700, 848256, -3952444, 1260573, -3937948, 1235340, -1491964, -2370822, -2353642, -1650341, 95563, -1169842, -986232, -3090229, -1090385, 607201, -989453, -2213519, 261456, -2401961, -5471789, -3285113, -3054796, 2231236, -3386582, 2088428, -54761, 1222992, -2819646, --3984656, -989453, 799938, 8543764, -7612830, -2025077, 6843494, -3664144, 11708081, -3759707, --8244190, 15507516, 21132850, 4663798, -8323110, 5801427, -4383551, 8642548, 5058935, -1924682, --8829916, -5818070, -15023796, 3901978, 6419366, -13298829, -1570884, 7672959, 2018635, -680752, -322123, -1663763, -7175817, 1706713, 8912594, 324270, 1931125, 3183108, 12621298, -8353175, --221728, 9124658, -8374650, 12269111, 652835, 17259862, -14384382, -13018583, 7153805, 597537, --1712081, 3675955, -1174674, 4773320, 2974802, 9577777, 9185861, -7621957, 1404991, -4997195, --2969433, 5713380, -696322, -3009162, -1261110, 227633, 8629663, -16489453, 12553116, -3973382, --5575405, 9250286, -7482370, 7406134, -10074920, -5720897, -1849520, -7548942, -2568391, -5345087, --8372502, -5705864, 1860795, -1964411, -1991791, -173409, -3884261, -1301912, -554051, 5153424, --239981, 702227, 2124935, -2248416, -827855, -1912871, 1292785, 2491081, 727460, -1105417, -6148783, -23085, 4570382, -4988605, -3154117, -2987150, -2075006, 2274185, 1168231, 105764, -3592203, -2712272, 2750927, 1012002, 2561948, 1367410, 391379, -3192235, -10470057, -7973070, --3517578, -7476465, -11413339, -2385318, 4136591, 14014478, 2263448, -8439074, -15668578, -3255048, -4844723, -2725694, 16799764, 5302674, -5959267, -11877195, -14872935, -28135258, -2311229, -3092377, -10771241, 7992398, -5778879, 746251, -4474282, -2421825, 10108206, -252329, 525597, -1218697, -11469710, 1959579, -3457449, -555661, -437013, 3122441, -10460930, -3275986, -4121558, 16547972, -3843459, -17372068, 4473209, -9008157, -5090610, 2576981, -16193637, 5051956, 11654394, 10362682, -8056822, 1987496, 3248069, -505732, 1707250, -10187126, 3696356, -15959025, -3077881, 9169218, -3333432, 9393630, 9235790, 7664369, -5243618, -11772505, -10326175, -7956427, 2580202, 3213709, -5447629, 5449240, 1165547, 3650185, 11521787, 16175384, -3888019, 5781563, -4034048, -4318053, -4923643, -7060926, -2523293, 319975, -4511327, 4233227, -3922916, -3369402, -1893544, 1041530, --1046361, 2321967, 18254, 3346317, -806917, -1976222, -952946, -1933272, -5129265, 1401770, -2717641, -209917, 1777043, -455803, 2440078, 4742181, 4481799, 3548717, -3639985, -1791001, -3440269, -1014686, -1416802, 369367, -612570, 3530463, -818191, -155693, -568546, 8240969, -14570140, 16887812, 12199855, 20875152, -9774809, 14837501, -12718472, -9959492, 10975252, 14049912, -16574279, -17112760, -113280, 4318590, -12695923, 6010807, -5591511, -8980240, 10226854, -13324599, -14443975, -13697188, 13529147, -9830643, -3644280, -897111, -17942226, -2484639, 19735912, -5050345, --14145475, 3024194, 9149354, -10294500, 5075041, 21368000, 11461120, 4327717, 9423158, -11299522, -7516730, -6787122, -19495930, -5902896, -5124970, 1445793, 8790724, 10905459, -4867272, -8533563, -7731478, 54224, 5907191, 3713536, -3214246, 1062468, -7786776, 1175747, 2415382, -107374, -2492155, 17571784, -2228014, 1733019, 4975183, 1041530, 2108829, -8948027, -9837623, 6787659, --11701638, -15832860, -16654273, 12896713, 8300561, 2473901, -956167, -1934346, 6105833, -992137, --4715874, 5898601, 16195785, 10970420, -4359929, -2783139, 4971962, 2889439, -1204738, -2598992, -1773285, 2268280, -748935, 639950, 8757438, 2084670, 1192927, 3429532, -2941516, 614180, -2736968, 5851893, -639950, 389231, -5827197, 1830193, -3070902, -2222646, 5931350, 4787815, -233002, 3743064, -3345243, -1615445, 1721208, -6979, -1817845, -3358128, -3668976, 2245194, -939524, -1603097, 1964948, -13536663, -21455510, 7627862, 27899034, 13638132, -5213554, -21576842, --7478075, 1364189, 3024731, -4201015, 10602127, 7133404, -7820062, -4062502, -1036161, -14277545, -19840064, -9038222, 7077569, -1662152, -4658429, -17391396, 5712307, 3606162, -2151779, 2097555, -7804493, -2843268, 19405200, -4344360, -2939905, 16168941, -1786170, -11609833, -10361072, -20054812, -2778307, -4452271, -6208375, -4371740, -14689325, -6160594, -13754096, 1473174, -12102144, 10962367, --6827925, -222265, 3436511, 1365263, 6359236, -5819144, -14858439, 6487548, -1683627, 3711926, --3296924, -1493575, 475131, 14351633, 21494164, 5842766, -6700149, 7431367, 7828652, 8541616, --3466576, -7155416, 10983305, 5202279, 14665703, 3425773, 3949759, 441308, 4442607, 13196287, -18026514, 8878234, 3084860, 6789270, 2893197, -3721589, -12265890, -7772817, 1452773, 6009196, -993748, -266288, -4559645, -1664837, 2582349, 1764695, -9680856, -1795296, 2254321, -353261, --4792110, -3996467, -5362804, 1088237, -897648, 3759707, 6956774, 4124242, 286152, -2228014, -4280472, 5148055, 399969, 1770063, -6735583, -175020, -2240362, -6890202, 1530082, 1348620, --6161668, -559420, -1394254, 2431488, -2354179, 5942624, 96100, 8131447, 41477572, 1202054, --11297911, 34826816, 17395154, 15510201, 29985852, 30183956, 8435316, 9746891, 7388418, 32788854, -1520418, -11274826, 13911936, 3227668, -12885976, -14097693, 12368969, 12373801, 23246510, -2065879, -1530619, 545461, 3036005, -13678934, 15482820, 11124502, 4633196, -10571525, 16394964, -4788889, --1056025, -21772262, -4985920, -1429687, -1580548, -11371463, 7416872, -10560251, -6362994, -6087580, -2952790, -7242389, -10324028, -13810467, 14653892, -10454487, 15596100, 7218767, 12773770, 4241817, --13385266, -430034, -21403432, -9592273, -11758010, 4664335, -14927696, -7809861, -2879239, 317828, -15073188, 1788854, -2599529, -24262270, 9482751, 8464844, -789200, -55298, -12589623, 9651865, -816581, -10464688, 28735478, 6663105, -3991635, -201863, -11891154, 2080375, 14281840, -3694209, --1429687, -15953656, -9764608, 5983963, -2489471, -7505992, 9157944, 5886790, -9824738, 8673150, --3561602, 2843805, -3453691, 8493835, 1555315, -1174674, -16106, 2163590, -11797201, 265751, --4518843, 3564286, 3702799, 5788006, -4998805, 4261682, 2841121, 2618856, 3978750, 5140002, --625992, 3994857, -5823439, 9906879, -4686883, 8405788, -5986648, 3803731, -12678743, -23251880, -7140920, 7002944, -7194607, 15134928, -16735340, 18178450, -13114146, -7638063, 5851356, 4206921, -46916612, 18331994, 7028177, -29278256, -779000, -6949257, -15518254, -4509179, -5672041, -5136781, --1737314, -24347632, -468688, -9212168, 301721, 11853036, -12915504, 15381352, -5042829, -17023640, --15188078, 12185359, 9347459, -3807489, -8385924, 15542413, -8386998, -7920994, 12215961, -348966, -3758633, -12586402, -425202, -7400229, 15668578, -2362232, 22476638, -8407398, 3376918, 6773701, --643708, 860067, 6855842, -14492830, -2325725, 18471580, 1496259, 5070746, -173946, -14977625, -6400038, -10455024, 5322002, 16149077, 20946556, 22848152, 24050206, -5188321, 8438000, -191663, -12903692, 29154238, -32022740, 24894704, -14807437, 6692633, 20006494, -12624519, 1282585, 6287296, -5450851, -1490891, 13922136, -5393405, -4412542, 5895380, -3349001, 13424994, -1999307, 5093295, --10825465, -1750736, -333397, -8704825, -3675955, -10981695, 103616, 3188476, 1056025, 12214887, --4041564, 836445, 1302449, 5201743, 1260573, 5247913, -7249368, 5459977, 1655173, -288300, -3860102, 5356361, -6101538, 5565204, -11716134, -10311680, 7191386, -3439195, -8320426, -1165010, -3371013, -5301601, 9389872, -11156178, -24824374, -4734128, 4915590, 418222, 5713380, -18303540, --2580739, -3693672, -26239566, -20177756, 10313290, 10924249, 4936528, 7550016, -13475997, -6507949, --9577240, 28653874, 6782827, 845572, 21339008, 12379169, 10689637, 9745281, 8341900, -15049565, -10777684, 4446902, -4719096, 8571144, -7692287, -7483444, 14860587, -6458557, 9336722, 19752554, -615254, 3805878, -423054, 1304596, -4365835, -11548630, -14689325, -23737748, 9664750, -20105816, -7485055, 7847979, 10056129, 82678, 545461, -2806224, -15555298, -7339562, 7795903, -5360656, -8046621, 19743964, -6138045, 15104326, 6847789, 1681480, -932008, -5381057, -14412837, -602369, --19452444, -6730751, 20691542, -11095511, 3221226, -34255584, 16183437, -6346351, 5162551, -26434450, --23590108, 2219424, 6228777, 12089796, -27365920, -2893734, 263067, 18591840, 15153181, 17206176, --5571647, 358630, 2529199, 8994198, 2057826, 4943508, 14138495, 8070781, -5513128, 5153961, -1297080, 1009854, -401579, -3031173, -11839077, 4117800, -5783711, 1748052, 4557497, -157840, -947040, -166967, 4565550, -2907156, 19080392, 5202279, -860604, 10691247, 6374805, 882616, -3102577, -335007, -8674223, 11238856, -3799436, 1505386, 13330505, 7464117, -4316979, 45634, --5481989, 8850854, 6011881, 7396471, 6784975, 20326470, -48289392, -12014097, -28639916, 9594957, --25709674, -8761196, -29151016, 7722888, -15151034, -11806865, -2393908, -24950002, -8930311, -26723824, --13339632, -30925376, 6754910, -28618440, -11170136, -14914811, -8196945, -7928510, -6554120, -27318676, --15459735, -20804284, -10520522, -6072547, 11865921, -1791538, 8885750, -17031156, -2647847, 892279, --19413252, 3692061, -1256815, 1574642, 5225902, -19842212, -1004486, 7212861, -2331094, 8142185, -16524887, 29660508, -24585466, 1447941, 33164664, 91268, 16338056, -11651173, 20596516, 3678640, --4773856, -27542552, -16064251, 22756884, 14204531, 22223234, 933619, -15600395, 5796059, 7996692, -16054051, -29933774, 333934, 5610301, -16374563, -5545340, -7009924, -10049150, -23826332, 36990944, --6683506, -11940009, -7479149, 7639673, 9014063, -20966956, -19333796, -805843, 6320045, 940061, -186831, -4110821, -6946573, -115964, 18783502, 11539503, 1611, -15388331, -10512469, 1709397, --5805722, 4057670, 5049271, 2500745, -1497333, -7934952, 3364570, 3925063, -2071248, 5948530, --3339337, -13644574, -6362994, -773094, 4082903, -1003949, -4271882, -19954954, -7867307, -4555350, -1624571, 2528125, -8517457, -15441481, 6170258, 9321690, -8097624, 407485, -7108171, 7865159, --2482491, -13771813, 20636780, -34804804, -321049, -6941204, 15067819, -7705708, -21376590, 18653580, --37557340, -32478542, -26720602, 15285789, -7923141, 802085, -14557255, -13874892, -16104517, 9009231, -7889855, 26153666, 12373264, 5244155, 24441586, -6550899, 8883603, -8862665, 7663833, 4354560, -14573361, 23447838, 12309913, -4953171, -14350023, -8642011, -2909304, 13138842, -4329327, 3617973, -523986, -6134824, 12510703, -858993, 10273562, 7540889, -19997904, 16440598, 30353608, 4654134, -25392384, 24489904, 11156178, 8058433, 72478, 12903155, -8070244, -29579440, -9594957, 21832930, -224412, -10928544, 11294153, 31036508, -7098507, 2299955, -22513144, 22099754, 19892678, -1530619, -6403260, -10249403, 51063940, -32131188, -27821188, -26346404, 2226404, 843424, -7729331, 22674206, --31971736, -638340, -20437066, 7719667, 9055402, -1532230, 22183506, 5019743, -1880659, -12108050, --149787, 5505611, 16161962, -11177116, -14265734, 5851893, -8502962, -2334315, 1973001, 3779571, -1316408, -6442, -1073742, -13513041, 1269163, 3119220, 9208410, -8039105, -4511327, 5098126, -2438468, 3515431, 307627, -8869107, -1011465, -10054518, -7602629, 9912785, 5054103, 5537287, -3889093, -443992, 1910724, -2817499, 6030134, 729071, -2767033, -693100, -8791261, -3391414, --5859409, 3425237, 55830280, -12306692, 31096636, 53647900, -18298172, 25722022, 11345693, -33786896, -30842160, 4692252, -14806900, 22763864, 9660992, 21388938, -219580, -18034568, 17028472, 5879810, -51003, 5385352, -5204427, -19075560, -11420318, -9127342, -16558173, -12248710, -3166465, 12709882, --11410117, -6816650, -16308528, 3460670, 1358283, 2621004, 22299470, -13353053, 5349382, -12386149, --7042136, 12838194, -10271951, -22900228, -29481730, 33932924, 15035070, -8392366, 23349590, -21481816, --18869402, -11426224, -1918777, 3462281, 127775, -19990388, -14754286, -15624017, -34454228, -21472688, --18577344, 6682969, 11516955, -911070, 19954954, 3838627, -20626580, -17723182, 26934276, -23079006, -3212636, 23676544, -3152506, -40632000, 28368796, -14948634, 4459250, 1890859, 23454280, -5592048, --9139154, -1128503, -13598940, 7131793, -23374822, 7984881, -30025042, -19073412, 11442867, -12599823, --3794604, -1553168, -17889076, 5912560, -10510859, 8602283, -2857764, -221728, 756988, 11176579, --8144869, -6248104, 1792075, -11104638, -5115843, 1831267, -7490960, -7733626, -5568425, -3210488, --8714489, -4640176, 11906186, -9675488, 4493073, 7436199, -1937030, 7947300, -10561861, 1311039, --7477538, 15351824, 2669859, 5636608, -10806138, 13515188, 8988293, 10394895, 4131222, 1501628, -3084860, 7626252, -7476465, 1007707, -26993332, 16175921, -7554311, 27379342, 18999862, -43814036, --5378373, 4625143, -26528940, -4364224, -4235375, 32318556, 23466628, 21583822, 27042724, -1025960, --18742700, -14629732, -14896557, 687732, -41671384, 4990752, 35899484, -32649268, -58775016, 5967857, --21926344, 43412456, -183610, 1392106, 29231548, -13383118, 6085969, -1387811, -7814156, 25255482, --7202660, 12754442, 42620572, -31343060, -17769354, -28573344, 14288819, 2314987, 28557238, -16383153, -11300059, 1459215, 26011932, 15213311, -12604118, -8506183, 9885404, -4760435, -1083942, -18392660, --17999672, 9405978, -3968013, -5408438, -10211822, 23396298, -8848706, -9522479, 39442296, 42013908, -27328340, -35878008, -3125663, -11345156, 13950591, 52334176, -6589017, -40063992, -2576981, -16568373, -23578834, 10424422, -26747446, 13996762, 10433012, 13648869, -25813290, -9426916, 1944010, 22771916, -1434519, -3803731, 3773666, -7968775, 1820529, 22750978, 11123428, -9655623, -11438572, -2733747, -7215008, 9016747, 12087649, -11559904, -4342212, -21077552, -4399657, 13116830, -13160854, -2208687, --8138426, -7672422, -12372727, -2733210, 8383776, -2030446, -927176, 1957431, 5322002, -5706938, --15801185, -16497506, 9814537, 7433515, 13727252, -7039989, 10052908, 29454348, 1484448, -17878876, --2927020, 1446867, -1674500, -11247446, -25740276, 3888019, -21129092, 19460496, 11157788, -20614770, -35159676, 53355840, 1484448, -2455648, -18278844, -18434000, 3076807, 3106335, -9026948, 48265232, --4383551, 36006860, 28797756, -36313412, -1182190, -12155294, -38916160, 9834938, 8970039, 21265456, -36339180, -1073742, -10437307, 11995307, 13145821, 28668370, 11947525, 2653753, 23526220, 24839944, -8487392, -5683853, 21568788, 9659918, 25929254, 5585068, 7438347, 16275779, 27464168, -4574140, --21873194, -25201794, -8288213, -8754217, 43229384, 23736136, 66759360, -3104725, -33742872, 29662118, --10238128, -11531987, -10160282, -22726282, 3294777, 12773233, -555125, -12731357, 47412144, -9476308, -55959664, -15341623, 30084636, 2637647, -9524090, -30573188, -43716324, 40931040, -4023848, -6993281, --12606803, 38037840, -79994, -39920648, 73123968, 23007066, 7905424, -8405251, -30790084, 15386183, -756988, 15486578, -14353244, 11044508, 5490042, -6912750, -10628970, 1887638, -12833899, -5994164, --14570140, 1685238, -2632815, -202400, 4713190, 11943767, -12258910, 4665945, -6038724, -379031, -15963857, 10691784, -5853504, -20131048, -753767, -1219234, 2561411, 18334678, -12029667, -7074885, -4491462, 11486353, -16847010, 1072131, 10895795, -304406, -1419487, -17519708, 8920647, -615791, -8108362, -18314278, 1925756, 7664369, 5969468, 8950175, -17655000, -18492518, 11992086, 49593452, --29471528, -18967650, 4029216, 8934069, -5608691, 35086124, 27346056, 27593554, 9336185, 13608067, -23240604, 14317273, -8401493, -13874892, -31182536, -5084168, 17157320, 5829345, 3720516, -11659226, --29489782, -8653822, -4119411, 30049202, 437550, -3636227, 22843858, -3666828, 6337761, 4827543, --50794432, 12992276, 13755707, -8920647, -21698712, 4090420, -28631862, -14630806, -43868796, 13232794, --36621576, -72698760, 8466991, -1036161, 51198156, -1800128, 17412872, 42205032, -6890738, -10993506, -18803366, -414464, -36831492, -12922483, 4876936, 6098854, 27229556, 11281268, 24251532, 20942798, --15057082, -11330661, 10351408, 30838402, -12827457, -6515466, -28320478, -19615652, 7557532, -38313792, -11129334, -43028592, 8199630, -11376295, 30546344, -13367549, 21660594, -46112380, -9357660, 6252399, --27388470, 6885907, 4887673, 4694936, -20651814, 10817412, -20221780, 5733782, -1520418, -8670465, --3672734, -2075543, 6505802, -7105487, -3200288, -5708549, 13211319, -8626442, 7733089, -19502910, -10277857, -1176284, -1532767, 2740726, 18879066, 6504191, 8086887, -22601728, 2969970, -9298604, --27820650, 11135240, -8891656, -7141457, -10259603, 10324565, -4986457, 4949413, 5872294, -2750927, -1254131, -6890202, 1989644, 5639292, -1306744, -907849, -10611254, 38970924, 41536092, 97071096, -11441793, -54326504, -40790380, -30024506, -34657700, 67949600, 90689848, 30753040, -8650601, -28513214, -1010928, -34508452, 37988984, 35920960, 10660109, 5207648, -22495428, -3251827, 41803452, 9752797, -16798154, 14157286, 43865576, 36909876, -14221710, -32611150, -43116104, -29058674, -4319127, 12022150, -39436388, 23655070, -8226473, 21375516, -29925722, -10186052, -67299456, -10628433, 66248796, 51200844, --10305237, 134233296, 42111616, 3938485, -73592120, -12541305, -6310381, -17264694, 18801756, 10436234, -15931644, 28171764, -60050624, -64691872, -32500554, -43643312, -6225555, 14779519, 54339388, -32500554, -19883014, 84688704, 42344084, 14741938, 23748484, 17279190, -51151988, -84672592, 43312060, -20951388, -18652506, 45334452, 50169512, 4419522, -30332132, -39986144, -32586454, 35038344, 20272246, 6094559, -34993784, -34892852, -6055367, -5605469, -15433965, -18072148, -1537061, -542240, 11353746, 3497714, --5004174, 68183, -439697, 548682, 2995740, 6448357, 10106595, -10149008, -13808857, -47424492, --25933012, -23468238, 27966680, 16504486, 9993315, -38849588, -37995428, -61266636, -16708497, 23989540, -30746598, 39954472, 15688979, 11625940, 4655745, 3787624, -1163936, 8892193, -2167348, 28573344, -20281910, 3965866, 201327, 86436, -4956393, -187368, -20646444, -88874144, -21176874, 49544596, -94871536, 83583824, 200390288, 104882568, 71168144, 62617940, 28500866, -11206107, -101227544, -127078952, --189579312, -145178480, -148927456, -56657060, 753767, 57038240, 106115224, 87538952, 90471872, 62354872, -85127328, 66636416, 94253592, 44887240, 35160748, 16816408, -24217710, -37271728, -57085484, -34511672, --124022552, -52383568, -117383064, -84693536, -134352480, -79866528, -125057096, -44408888, -61977988, -20175072, -9610526, 63513440, 166544336, 158587376, 222207648, 150402240, 102614288, 133222904, 181965952, 160133568, -134514080, 93855776, 11358041, -90945936, -90268400, -111922016, -213010512, -235181664, -256151312, -255803952, --280874208, -242930336, -204622448, -180476144, -117492592, 13542032, 133772128, 232641200, 307534688, 383323680, -426546624, 297359904, 283619232, 184056528, 111552112, 105392592, -6248104, -34780644, -163318272, -313109568, --337186080, -273754240, -211555600, -124652832, -100818448, -102707704, -56598544, -88200912, -35631584, -9789304, -67833640, 128674000, 105763568, 137546320, 147887536, 157692944, 139343232, 185904432, 138229760, 113206744, -58567784, 12033425, -31302796, -143992000, -127455840, -170948832, -226579920, -205357952, -235316432, -241932816, --70449272, 7923141, 123055104, 150504240, 160395024, 186043488, 194426720, 164846752, 143498608, 109957608, -83495240, 30157112, -21370684, -64116344, -115519048, -169909440, -159030832, -142096304, -106151728, -50050864, --21888228, -10467909, -6097243, 15657840, 32884954, 39683888, 42875584, 35240744, 28387050, 30558692, -25065966, 18533858, 34237868, 38134476, 29416768, 13982803, 7261179, 11187316, 14527190, 3441880, --623307, -1331977, -4027069, -6428493, -2675228, -1762547, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-424128, -542777, 3265786, -1328219, 3730179, -1974074, -4786741, 1686848, 4809290, 712965, +-746251, 6389301, 217433, 266825, -2178622, -1212255, 9953587, 1387274, -6755447, -4993973, +7020661, -637266, 7280507, 513249, -1382980, -682900, 5499169, 1090385, 11543798, 5085242, +3178813, -619549, 2565169, 5223754, -1283122, -3890167, -4887673, -935229, 4408784, 3791919, +5881958, 1653562, -3287261, -3418794, -1422708, 2457795, -786516, 1352378, -668404, -5232881, +-4038880, 1603097, 3823058, 2353105, -1891933, -2158758, -144418, 5708012, 2905009, -625455, +-1275605, 2646774, 1787243, 1136019, -2909304, 1464047, 2737505, -351114, 4180614, 4932770, +-8614631, 3164854, 1762010, 5624260, 1698123, 447750, 2567854, -1139777, -4015795, -1492501, +-2419140, -807454, -497679, 2445984, -122943, -1957968, 30602, 288300, 1461363, -1271847, +237834, -246424, 522912, 747324, 523449, 964757, 97711, 595927, 2881923, 4487167, +9698036, -7882876, 1774895, -1730335, 110059, -10129143, 1016297, 6094022, -9011378, -1867237, +6018860, 15976741, 2288681, -107374, 1134945, -10005126, -323733, 7377680, 6546067, 181462, +-209380, 609349, 3435437, 5756330, 6063420, 6557878, -2929705, 1420024, -399969, 2530810, +707596, 1633161, -10154913, -2779381, 1582696, 833224, -5616744, -176094, 3830574, -4463008, +3526705, 3260417, 6010270, 2819646, -2299418, 3005403, 6717329, -3757023, -6067715, 2041183, +1406602, 1190780, 3183645, -2683818, -4906464, -7306276, 5905043, -1081258, -1383516, -2372433, +2591476, -83752, 3829500, 7579007, 1532230, 522375, -408022, -1820529, -5906654, 9193377, +2260227, -1088237, 4747550, -737661, -5444945, -4778688, -1063541, 1816234, -7940858, 663572, +-4707821, -879395, 2422899, -128312, 1273995, -1410897, -2596845, -541166, 1312113, 1809792, +1333051, -265751, -796716, -35970, 1297617, -673236, -1322313, -976568, -4754529, -4126927, +-5158256, -7329899, 4102768, -95563, -3502009, -1394791, -1789928, 1590212, -2909304, -5033165, +1145146, -3273302, 8596914, 11426760, 9037685, -6254010, -240518, -413391, 2417530, -3471944, +7090454, 4445291, -1011465, 3432753, 5377836, 434329, 1304060, 1875827, 5225365, -500364, +1944547, 6251862, 637803, -71941, -2729989, 4498442, -6793565, 2744484, -949725, -1396938, +4530117, -4375498, -550830, 154082, -5904507, 2454037, -1189169, 2735894, -188442, -2552821, +1796370, 1879585, -308701, 5247913, -372052, 6054294, -87510, -4023848, -1787780, 233002, +-2744484, 5399311, 2820720, 4635344, 5259725, -2296734, -5199595, -3398930, -2147, -964220, +-1104880, 4285304, 5410048, -806917, -2957085, 1882806, 1480153, -2069101, -2821257, 972273, +-4054449, 992137, -72478, -125091, -1081258, -3841312, 875100, -1511292, 165356, 1722819, +6442, -1961190, 992674, -2690260, -40265, 175557, -609885, 228707, 525597, -1469953, +35433, 182536, -1735167, 372588, -514322, -104690, -906775, -22012, 498753, -15112916, +-3567507, -4704600, -8178155, 2790118, 2137820, -970663, 3798362, -522375, 3205119, 4535486, +-1995012, -5282273, -6665789, -2537252, -6207839, 490700, 683437, -2698850, 3520263, -3033321, +1887101, -1384053, -3542811, -9405978, -3664144, 841814, 1477469, 2476049, -3500935, 2501282, +3780645, 1254667, 8582418, 2138357, -221728, 6649146, -4699768, 3841312, 629750, -2233920, +-3183108, 4288525, 574452, 1356673, -10136123, -1867237, -3351148, 10183367, 4362076, 3668439, +4130148, 4675072, 3696893, 5184026, -2745021, -1111323, 3175055, 5092221, -687732, 5946919, +-3204046, 1300838, -1293322, 5036923, 7540889, -11785927, 3085397, -2916820, 373125, -5561446, +-2862596, 927713, -1692217, -2390686, -4722317, -2129767, 2216203, -117575, 5040144, -535260, +1939715, 4369056, 6944425, -265214, 1829656, -819265, 3228742, 512712, 1567126, -2164127, +-766115, 223338, 1471026, -971200, -1584306, 68719, 78920, -1228898, 176631, 697395, +19864, 2017024, -900333, -957241, 220654, 1755568, -725313, 28454, -652298, 1040456, +1615982, -239444, 1545115, 1689533, -424665, -746251, 5900212, 3622805, 2138894, -1119913, +485331, 644245, 7620883, -6049999, 7645042, -1012002, 4166655, 7838852, -4904316, 6074695, +-3794604, 3119757, 1188632, 9215926, 4075387, -5124433, -8441221, 1928440, -6328098, 5212480, +-1296006, 6791417, -5054103, -816581, -4046396, 2346126, 1510755, 1947231, -503048, -715112, +-7366406, -3226057, 6065031, -4822712, -976568, 3947612, 191663, -3773666, 1239098, 348429, +-841814, -3270081, 6631430, 2121714, -9426916, -4248260, -7608535, -1323387, -6725919, -11602317, +-2636573, 5078799, 14316200, 3139621, 1191853, 6753836, -166967, -5265093, -4601521, 3777424, +1480690, 2555506, 4143033, -10107132, -2473364, -9294846, -2028835, 2627446, -3672197, -8588861, +890132, 3744138, -1821066, -3180423, -1495186, 1517197, -1256278, -339302, 1910187, -1158031, +-1247688, -1712618, -1236414, -3917547, 1441498, -1002338, 1847910, -641561, 1096827, 2516851, +386547, -644782, -193810, -2073932, -1353452, -3300682, -2983929, 492848, 409096, 31675, +1234803, 1982127, 1413581, 33823, 1293859, 1084479, -855235, 799401, 850940, -1700807, +16449725, 3915400, 11910481, -5584531, -774705, -3973382, -916976, 12654047, -10794863, 3622268, +1225676, 16571594, 8824547, 10996727, 2009508, -2736431, 5191005, -3619047, -13740137, 2612414, +781684, 1610613, 10829223, 1028108, -6362457, -562641, 285078, 3432753, 3748433, -326954, +-1417876, 4418448, -5176510, -1428614, -2621004, -1330903, 1336809, 195958, 9539659, 1371168, +7490960, 8631811, 2390686, 7612830, -564251, 2517388, 4630512, -5002027, -7464117, 932545, +7518877, -12014634, 3576097, -9220758, -8610873, -5287105, -2386391, -8114267, -7853348, -8319889, +-4262755, -2075006, 5582384, 129923, 6688338, 1006633, -5507222, 8427263, -8767102, -3332358, +-3628711, -3608310, -4647155, -6128382, 8753680, 6802692, -3825205, 3337190, 2756295, 6911676, +28454, 4990215, -2454574, 6274411, 3175055, -3714073, 216896, -3356517, 4002910, -3828963, +427349, 3084860, 238908, 2358474, -670015, 373662, 1649268, -558883, -1676111, 1552631, +-446140, 263604, -3226057, -2687576, -2572686, -2024540, -333397, -1134408, -2226941, -110595, +475668, -1058173, 271120, -83752, -8826695, -8984535, -5206037, -5535139, -2872796, -2308008, +-10597832, -8609262, -7184407, -1155346, -572304, -1387274, 7440494, 697932, 3866544, 5624797, +6684580, 998580, 13018583, 16191490, -286689, 4656819, 3712999, -2017561, 7150584, 3805341, +-14544907, -533113, -5000953, 798864, 11333345, 4444755, -11621645, -3146064, 5240397, 5105643, +761283, 14893336, -6142877, 5977521, 6143414, 6607807, 3941169, 7704635, -13101798, 4769561, +-5085242, 7763691, 337155, 3317325, -9825275, 7199976, 5296232, -1322850, 5129802, -901406, +1465121, -146029, -5102958, 1289564, -3245922, 3173444, -4015258, 5004174, 1635846, 12606803, +9510668, -3034931, 3427921, -10489921, 9134859, -2908230, 5621039, 9761924, 9692667, 396211, +9899363, 6746857, 4707284, 4938676, 9100499, 835908, 2003065, -7455527, -1234266, -2186675, +1746978, -5397700, 848256, -3952444, 1260573, -3937948, 1235340, -1491964, -2370822, -2353642, +1650341, 95563, -1169842, -986232, -3090229, -1090385, 607201, -989453, -2213519, 261456, +2401961, -5471789, -3285113, -3054796, 2231236, -3386582, 2088428, -54761, 1222992, -2819646, +-3984656, -989453, 799938, 8543764, -7612830, -2025077, 6843494, -3664144, 11708081, -3759707, +-8244190, 15507516, 21132850, 4663798, -8323110, 5801427, -4383551, 8642548, 5058935, -1924682, +-8829916, -5818070, -15023796, 3901978, 6419366, -13298829, -1570884, 7672959, 2018635, -680752, +322123, -1663763, -7175817, 1706713, 8912594, 324270, 1931125, 3183108, 12621298, -8353175, +-221728, 9124658, -8374650, 12269111, 652835, 17259862, -14384382, -13018583, 7153805, 597537, +-1712081, 3675955, -1174674, 4773320, 2974802, 9577777, 9185861, -7621957, 1404991, -4997195, +-2969433, 5713380, -696322, -3009162, -1261110, 227633, 8629663, -16489453, 12553116, -3973382, +-5575405, 9250286, -7482370, 7406134, -10074920, -5720897, -1849520, -7548942, -2568391, -5345087, +-8372502, -5705864, 1860795, -1964411, -1991791, -173409, -3884261, -1301912, -554051, 5153424, +-239981, 702227, 2124935, -2248416, -827855, -1912871, 1292785, 2491081, 727460, -1105417, +6148783, -23085, 4570382, -4988605, -3154117, -2987150, -2075006, 2274185, 1168231, 105764, +3592203, -2712272, 2750927, 1012002, 2561948, 1367410, 391379, -3192235, -10470057, -7973070, +-3517578, -7476465, -11413339, -2385318, 4136591, 14014478, 2263448, -8439074, -15668578, -3255048, +4844723, -2725694, 16799764, 5302674, -5959267, -11877195, -14872935, -28135258, -2311229, -3092377, +10771241, 7992398, -5778879, 746251, -4474282, -2421825, 10108206, -252329, 525597, -1218697, +11469710, 1959579, -3457449, -555661, -437013, 3122441, -10460930, -3275986, -4121558, 16547972, +3843459, -17372068, 4473209, -9008157, -5090610, 2576981, -16193637, 5051956, 11654394, 10362682, +8056822, 1987496, 3248069, -505732, 1707250, -10187126, 3696356, -15959025, -3077881, 9169218, +3333432, 9393630, 9235790, 7664369, -5243618, -11772505, -10326175, -7956427, 2580202, 3213709, +5447629, 5449240, 1165547, 3650185, 11521787, 16175384, -3888019, 5781563, -4034048, -4318053, +4923643, -7060926, -2523293, 319975, -4511327, 4233227, -3922916, -3369402, -1893544, 1041530, +-1046361, 2321967, 18254, 3346317, -806917, -1976222, -952946, -1933272, -5129265, 1401770, +2717641, -209917, 1777043, -455803, 2440078, 4742181, 4481799, 3548717, -3639985, -1791001, +3440269, -1014686, -1416802, 369367, -612570, 3530463, -818191, -155693, -568546, 8240969, +14570140, 16887812, 12199855, 20875152, -9774809, 14837501, -12718472, -9959492, 10975252, 14049912, +16574279, -17112760, -113280, 4318590, -12695923, 6010807, -5591511, -8980240, 10226854, -13324599, +14443975, -13697188, 13529147, -9830643, -3644280, -897111, -17942226, -2484639, 19735912, -5050345, +-14145475, 3024194, 9149354, -10294500, 5075041, 21368000, 11461120, 4327717, 9423158, -11299522, +7516730, -6787122, -19495930, -5902896, -5124970, 1445793, 8790724, 10905459, -4867272, -8533563, +7731478, 54224, 5907191, 3713536, -3214246, 1062468, -7786776, 1175747, 2415382, -107374, +2492155, 17571784, -2228014, 1733019, 4975183, 1041530, 2108829, -8948027, -9837623, 6787659, +-11701638, -15832860, -16654273, 12896713, 8300561, 2473901, -956167, -1934346, 6105833, -992137, +-4715874, 5898601, 16195785, 10970420, -4359929, -2783139, 4971962, 2889439, -1204738, -2598992, +1773285, 2268280, -748935, 639950, 8757438, 2084670, 1192927, 3429532, -2941516, 614180, +2736968, 5851893, -639950, 389231, -5827197, 1830193, -3070902, -2222646, 5931350, 4787815, +233002, 3743064, -3345243, -1615445, 1721208, -6979, -1817845, -3358128, -3668976, 2245194, +939524, -1603097, 1964948, -13536663, -21455510, 7627862, 27899034, 13638132, -5213554, -21576842, +-7478075, 1364189, 3024731, -4201015, 10602127, 7133404, -7820062, -4062502, -1036161, -14277545, +19840064, -9038222, 7077569, -1662152, -4658429, -17391396, 5712307, 3606162, -2151779, 2097555, +7804493, -2843268, 19405200, -4344360, -2939905, 16168941, -1786170, -11609833, -10361072, -20054812, +2778307, -4452271, -6208375, -4371740, -14689325, -6160594, -13754096, 1473174, -12102144, 10962367, +-6827925, -222265, 3436511, 1365263, 6359236, -5819144, -14858439, 6487548, -1683627, 3711926, +-3296924, -1493575, 475131, 14351633, 21494164, 5842766, -6700149, 7431367, 7828652, 8541616, +-3466576, -7155416, 10983305, 5202279, 14665703, 3425773, 3949759, 441308, 4442607, 13196287, +18026514, 8878234, 3084860, 6789270, 2893197, -3721589, -12265890, -7772817, 1452773, 6009196, +993748, -266288, -4559645, -1664837, 2582349, 1764695, -9680856, -1795296, 2254321, -353261, +-4792110, -3996467, -5362804, 1088237, -897648, 3759707, 6956774, 4124242, 286152, -2228014, +4280472, 5148055, 399969, 1770063, -6735583, -175020, -2240362, -6890202, 1530082, 1348620, +-6161668, -559420, -1394254, 2431488, -2354179, 5942624, 96100, 8131447, 41477572, 1202054, +-11297911, 34826816, 17395154, 15510201, 29985852, 30183956, 8435316, 9746891, 7388418, 32788854, +1520418, -11274826, 13911936, 3227668, -12885976, -14097693, 12368969, 12373801, 23246510, -2065879, +1530619, 545461, 3036005, -13678934, 15482820, 11124502, 4633196, -10571525, 16394964, -4788889, +-1056025, -21772262, -4985920, -1429687, -1580548, -11371463, 7416872, -10560251, -6362994, -6087580, +2952790, -7242389, -10324028, -13810467, 14653892, -10454487, 15596100, 7218767, 12773770, 4241817, +-13385266, -430034, -21403432, -9592273, -11758010, 4664335, -14927696, -7809861, -2879239, 317828, +15073188, 1788854, -2599529, -24262270, 9482751, 8464844, -789200, -55298, -12589623, 9651865, +816581, -10464688, 28735478, 6663105, -3991635, -201863, -11891154, 2080375, 14281840, -3694209, +-1429687, -15953656, -9764608, 5983963, -2489471, -7505992, 9157944, 5886790, -9824738, 8673150, +-3561602, 2843805, -3453691, 8493835, 1555315, -1174674, -16106, 2163590, -11797201, 265751, +-4518843, 3564286, 3702799, 5788006, -4998805, 4261682, 2841121, 2618856, 3978750, 5140002, +-625992, 3994857, -5823439, 9906879, -4686883, 8405788, -5986648, 3803731, -12678743, -23251880, +7140920, 7002944, -7194607, 15134928, -16735340, 18178450, -13114146, -7638063, 5851356, 4206921, +46916612, 18331994, 7028177, -29278256, -779000, -6949257, -15518254, -4509179, -5672041, -5136781, +-1737314, -24347632, -468688, -9212168, 301721, 11853036, -12915504, 15381352, -5042829, -17023640, +-15188078, 12185359, 9347459, -3807489, -8385924, 15542413, -8386998, -7920994, 12215961, -348966, +3758633, -12586402, -425202, -7400229, 15668578, -2362232, 22476638, -8407398, 3376918, 6773701, +-643708, 860067, 6855842, -14492830, -2325725, 18471580, 1496259, 5070746, -173946, -14977625, +6400038, -10455024, 5322002, 16149077, 20946556, 22848152, 24050206, -5188321, 8438000, -191663, +12903692, 29154238, -32022740, 24894704, -14807437, 6692633, 20006494, -12624519, 1282585, 6287296, +5450851, -1490891, 13922136, -5393405, -4412542, 5895380, -3349001, 13424994, -1999307, 5093295, +-10825465, -1750736, -333397, -8704825, -3675955, -10981695, 103616, 3188476, 1056025, 12214887, +-4041564, 836445, 1302449, 5201743, 1260573, 5247913, -7249368, 5459977, 1655173, -288300, +3860102, 5356361, -6101538, 5565204, -11716134, -10311680, 7191386, -3439195, -8320426, -1165010, +3371013, -5301601, 9389872, -11156178, -24824374, -4734128, 4915590, 418222, 5713380, -18303540, +-2580739, -3693672, -26239566, -20177756, 10313290, 10924249, 4936528, 7550016, -13475997, -6507949, +-9577240, 28653874, 6782827, 845572, 21339008, 12379169, 10689637, 9745281, 8341900, -15049565, +10777684, 4446902, -4719096, 8571144, -7692287, -7483444, 14860587, -6458557, 9336722, 19752554, +615254, 3805878, -423054, 1304596, -4365835, -11548630, -14689325, -23737748, 9664750, -20105816, +7485055, 7847979, 10056129, 82678, 545461, -2806224, -15555298, -7339562, 7795903, -5360656, +8046621, 19743964, -6138045, 15104326, 6847789, 1681480, -932008, -5381057, -14412837, -602369, +-19452444, -6730751, 20691542, -11095511, 3221226, -34255584, 16183437, -6346351, 5162551, -26434450, +-23590108, 2219424, 6228777, 12089796, -27365920, -2893734, 263067, 18591840, 15153181, 17206176, +-5571647, 358630, 2529199, 8994198, 2057826, 4943508, 14138495, 8070781, -5513128, 5153961, +1297080, 1009854, -401579, -3031173, -11839077, 4117800, -5783711, 1748052, 4557497, -157840, +947040, -166967, 4565550, -2907156, 19080392, 5202279, -860604, 10691247, 6374805, 882616, +3102577, -335007, -8674223, 11238856, -3799436, 1505386, 13330505, 7464117, -4316979, 45634, +-5481989, 8850854, 6011881, 7396471, 6784975, 20326470, -48289392, -12014097, -28639916, 9594957, +-25709674, -8761196, -29151016, 7722888, -15151034, -11806865, -2393908, -24950002, -8930311, -26723824, +-13339632, -30925376, 6754910, -28618440, -11170136, -14914811, -8196945, -7928510, -6554120, -27318676, +-15459735, -20804284, -10520522, -6072547, 11865921, -1791538, 8885750, -17031156, -2647847, 892279, +-19413252, 3692061, -1256815, 1574642, 5225902, -19842212, -1004486, 7212861, -2331094, 8142185, +16524887, 29660508, -24585466, 1447941, 33164664, 91268, 16338056, -11651173, 20596516, 3678640, +-4773856, -27542552, -16064251, 22756884, 14204531, 22223234, 933619, -15600395, 5796059, 7996692, +16054051, -29933774, 333934, 5610301, -16374563, -5545340, -7009924, -10049150, -23826332, 36990944, +-6683506, -11940009, -7479149, 7639673, 9014063, -20966956, -19333796, -805843, 6320045, 940061, +186831, -4110821, -6946573, -115964, 18783502, 11539503, 1611, -15388331, -10512469, 1709397, +-5805722, 4057670, 5049271, 2500745, -1497333, -7934952, 3364570, 3925063, -2071248, 5948530, +-3339337, -13644574, -6362994, -773094, 4082903, -1003949, -4271882, -19954954, -7867307, -4555350, +1624571, 2528125, -8517457, -15441481, 6170258, 9321690, -8097624, 407485, -7108171, 7865159, +-2482491, -13771813, 20636780, -34804804, -321049, -6941204, 15067819, -7705708, -21376590, 18653580, +-37557340, -32478542, -26720602, 15285789, -7923141, 802085, -14557255, -13874892, -16104517, 9009231, +7889855, 26153666, 12373264, 5244155, 24441586, -6550899, 8883603, -8862665, 7663833, 4354560, +14573361, 23447838, 12309913, -4953171, -14350023, -8642011, -2909304, 13138842, -4329327, 3617973, +523986, -6134824, 12510703, -858993, 10273562, 7540889, -19997904, 16440598, 30353608, 4654134, +25392384, 24489904, 11156178, 8058433, 72478, 12903155, -8070244, -29579440, -9594957, 21832930, +224412, -10928544, 11294153, 31036508, -7098507, 2299955, -22513144, 22099754, 19892678, -1530619, +6403260, -10249403, 51063940, -32131188, -27821188, -26346404, 2226404, 843424, -7729331, 22674206, +-31971736, -638340, -20437066, 7719667, 9055402, -1532230, 22183506, 5019743, -1880659, -12108050, +-149787, 5505611, 16161962, -11177116, -14265734, 5851893, -8502962, -2334315, 1973001, 3779571, +1316408, -6442, -1073742, -13513041, 1269163, 3119220, 9208410, -8039105, -4511327, 5098126, +2438468, 3515431, 307627, -8869107, -1011465, -10054518, -7602629, 9912785, 5054103, 5537287, +3889093, -443992, 1910724, -2817499, 6030134, 729071, -2767033, -693100, -8791261, -3391414, +-5859409, 3425237, 55830280, -12306692, 31096636, 53647900, -18298172, 25722022, 11345693, -33786896, +30842160, 4692252, -14806900, 22763864, 9660992, 21388938, -219580, -18034568, 17028472, 5879810, +51003, 5385352, -5204427, -19075560, -11420318, -9127342, -16558173, -12248710, -3166465, 12709882, +-11410117, -6816650, -16308528, 3460670, 1358283, 2621004, 22299470, -13353053, 5349382, -12386149, +-7042136, 12838194, -10271951, -22900228, -29481730, 33932924, 15035070, -8392366, 23349590, -21481816, +-18869402, -11426224, -1918777, 3462281, 127775, -19990388, -14754286, -15624017, -34454228, -21472688, +-18577344, 6682969, 11516955, -911070, 19954954, 3838627, -20626580, -17723182, 26934276, -23079006, +3212636, 23676544, -3152506, -40632000, 28368796, -14948634, 4459250, 1890859, 23454280, -5592048, +-9139154, -1128503, -13598940, 7131793, -23374822, 7984881, -30025042, -19073412, 11442867, -12599823, +-3794604, -1553168, -17889076, 5912560, -10510859, 8602283, -2857764, -221728, 756988, 11176579, +-8144869, -6248104, 1792075, -11104638, -5115843, 1831267, -7490960, -7733626, -5568425, -3210488, +-8714489, -4640176, 11906186, -9675488, 4493073, 7436199, -1937030, 7947300, -10561861, 1311039, +-7477538, 15351824, 2669859, 5636608, -10806138, 13515188, 8988293, 10394895, 4131222, 1501628, +3084860, 7626252, -7476465, 1007707, -26993332, 16175921, -7554311, 27379342, 18999862, -43814036, +-5378373, 4625143, -26528940, -4364224, -4235375, 32318556, 23466628, 21583822, 27042724, -1025960, +-18742700, -14629732, -14896557, 687732, -41671384, 4990752, 35899484, -32649268, -58775016, 5967857, +-21926344, 43412456, -183610, 1392106, 29231548, -13383118, 6085969, -1387811, -7814156, 25255482, +-7202660, 12754442, 42620572, -31343060, -17769354, -28573344, 14288819, 2314987, 28557238, -16383153, +11300059, 1459215, 26011932, 15213311, -12604118, -8506183, 9885404, -4760435, -1083942, -18392660, +-17999672, 9405978, -3968013, -5408438, -10211822, 23396298, -8848706, -9522479, 39442296, 42013908, +27328340, -35878008, -3125663, -11345156, 13950591, 52334176, -6589017, -40063992, -2576981, -16568373, +23578834, 10424422, -26747446, 13996762, 10433012, 13648869, -25813290, -9426916, 1944010, 22771916, +1434519, -3803731, 3773666, -7968775, 1820529, 22750978, 11123428, -9655623, -11438572, -2733747, +7215008, 9016747, 12087649, -11559904, -4342212, -21077552, -4399657, 13116830, -13160854, -2208687, +-8138426, -7672422, -12372727, -2733210, 8383776, -2030446, -927176, 1957431, 5322002, -5706938, +-15801185, -16497506, 9814537, 7433515, 13727252, -7039989, 10052908, 29454348, 1484448, -17878876, +-2927020, 1446867, -1674500, -11247446, -25740276, 3888019, -21129092, 19460496, 11157788, -20614770, +35159676, 53355840, 1484448, -2455648, -18278844, -18434000, 3076807, 3106335, -9026948, 48265232, +-4383551, 36006860, 28797756, -36313412, -1182190, -12155294, -38916160, 9834938, 8970039, 21265456, +36339180, -1073742, -10437307, 11995307, 13145821, 28668370, 11947525, 2653753, 23526220, 24839944, +8487392, -5683853, 21568788, 9659918, 25929254, 5585068, 7438347, 16275779, 27464168, -4574140, +-21873194, -25201794, -8288213, -8754217, 43229384, 23736136, 66759360, -3104725, -33742872, 29662118, +-10238128, -11531987, -10160282, -22726282, 3294777, 12773233, -555125, -12731357, 47412144, -9476308, +55959664, -15341623, 30084636, 2637647, -9524090, -30573188, -43716324, 40931040, -4023848, -6993281, +-12606803, 38037840, -79994, -39920648, 73123968, 23007066, 7905424, -8405251, -30790084, 15386183, +756988, 15486578, -14353244, 11044508, 5490042, -6912750, -10628970, 1887638, -12833899, -5994164, +-14570140, 1685238, -2632815, -202400, 4713190, 11943767, -12258910, 4665945, -6038724, -379031, +15963857, 10691784, -5853504, -20131048, -753767, -1219234, 2561411, 18334678, -12029667, -7074885, +4491462, 11486353, -16847010, 1072131, 10895795, -304406, -1419487, -17519708, 8920647, -615791, +8108362, -18314278, 1925756, 7664369, 5969468, 8950175, -17655000, -18492518, 11992086, 49593452, +-29471528, -18967650, 4029216, 8934069, -5608691, 35086124, 27346056, 27593554, 9336185, 13608067, +23240604, 14317273, -8401493, -13874892, -31182536, -5084168, 17157320, 5829345, 3720516, -11659226, +-29489782, -8653822, -4119411, 30049202, 437550, -3636227, 22843858, -3666828, 6337761, 4827543, +-50794432, 12992276, 13755707, -8920647, -21698712, 4090420, -28631862, -14630806, -43868796, 13232794, +-36621576, -72698760, 8466991, -1036161, 51198156, -1800128, 17412872, 42205032, -6890738, -10993506, +18803366, -414464, -36831492, -12922483, 4876936, 6098854, 27229556, 11281268, 24251532, 20942798, +-15057082, -11330661, 10351408, 30838402, -12827457, -6515466, -28320478, -19615652, 7557532, -38313792, +11129334, -43028592, 8199630, -11376295, 30546344, -13367549, 21660594, -46112380, -9357660, 6252399, +-27388470, 6885907, 4887673, 4694936, -20651814, 10817412, -20221780, 5733782, -1520418, -8670465, +-3672734, -2075543, 6505802, -7105487, -3200288, -5708549, 13211319, -8626442, 7733089, -19502910, +10277857, -1176284, -1532767, 2740726, 18879066, 6504191, 8086887, -22601728, 2969970, -9298604, +-27820650, 11135240, -8891656, -7141457, -10259603, 10324565, -4986457, 4949413, 5872294, -2750927, +1254131, -6890202, 1989644, 5639292, -1306744, -907849, -10611254, 38970924, 41536092, 97071096, +11441793, -54326504, -40790380, -30024506, -34657700, 67949600, 90689848, 30753040, -8650601, -28513214, +1010928, -34508452, 37988984, 35920960, 10660109, 5207648, -22495428, -3251827, 41803452, 9752797, +16798154, 14157286, 43865576, 36909876, -14221710, -32611150, -43116104, -29058674, -4319127, 12022150, +39436388, 23655070, -8226473, 21375516, -29925722, -10186052, -67299456, -10628433, 66248796, 51200844, +-10305237, 134233296, 42111616, 3938485, -73592120, -12541305, -6310381, -17264694, 18801756, 10436234, +15931644, 28171764, -60050624, -64691872, -32500554, -43643312, -6225555, 14779519, 54339388, -32500554, +19883014, 84688704, 42344084, 14741938, 23748484, 17279190, -51151988, -84672592, 43312060, -20951388, +18652506, 45334452, 50169512, 4419522, -30332132, -39986144, -32586454, 35038344, 20272246, 6094559, +34993784, -34892852, -6055367, -5605469, -15433965, -18072148, -1537061, -542240, 11353746, 3497714, +-5004174, 68183, -439697, 548682, 2995740, 6448357, 10106595, -10149008, -13808857, -47424492, +-25933012, -23468238, 27966680, 16504486, 9993315, -38849588, -37995428, -61266636, -16708497, 23989540, +30746598, 39954472, 15688979, 11625940, 4655745, 3787624, -1163936, 8892193, -2167348, 28573344, +20281910, 3965866, 201327, 86436, -4956393, -187368, -20646444, -88874144, -21176874, 49544596, +94871536, 83583824, 200390288, 104882568, 71168144, 62617940, 28500866, -11206107, -101227544, -127078952, +-189579312, -145178480, -148927456, -56657060, 753767, 57038240, 106115224, 87538952, 90471872, 62354872, +85127328, 66636416, 94253592, 44887240, 35160748, 16816408, -24217710, -37271728, -57085484, -34511672, +-124022552, -52383568, -117383064, -84693536, -134352480, -79866528, -125057096, -44408888, -61977988, -20175072, +9610526, 63513440, 166544336, 158587376, 222207648, 150402240, 102614288, 133222904, 181965952, 160133568, +134514080, 93855776, 11358041, -90945936, -90268400, -111922016, -213010512, -235181664, -256151312, -255803952, +-280874208, -242930336, -204622448, -180476144, -117492592, 13542032, 133772128, 232641200, 307534688, 383323680, +426546624, 297359904, 283619232, 184056528, 111552112, 105392592, -6248104, -34780644, -163318272, -313109568, +-337186080, -273754240, -211555600, -124652832, -100818448, -102707704, -56598544, -88200912, -35631584, -9789304, +67833640, 128674000, 105763568, 137546320, 147887536, 157692944, 139343232, 185904432, 138229760, 113206744, +58567784, 12033425, -31302796, -143992000, -127455840, -170948832, -226579920, -205357952, -235316432, -241932816, +-70449272, 7923141, 123055104, 150504240, 160395024, 186043488, 194426720, 164846752, 143498608, 109957608, +83495240, 30157112, -21370684, -64116344, -115519048, -169909440, -159030832, -142096304, -106151728, -50050864, +-21888228, -10467909, -6097243, 15657840, 32884954, 39683888, 42875584, 35240744, 28387050, 30558692, +25065966, 18533858, 34237868, 38134476, 29416768, 13982803, 7261179, 11187316, 14527190, 3441880, +-623307, -1331977, -4027069, -6428493, -2675228, -1762547, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 12924630, -582505, 2175938, 1815161, -5267241, -2720325, 7160784, 12469364, 2010045, 6646999, -2693481, -1263794, -342524, 5630166, -4454418, -10153840, 4110821, 4764730, -5923834, 6877854, 3383897, -6274947, 1984275, 1498407, -2736431, -869194, 328028, 4184909, 377957, -6283537, 277562, --502511, 1361505, -869731, 1121523, 1515587, 3749507, 2726767, 895501, 1178969, 372052, -1844689, -1937567, -3132642, -6969658, 1351304, 1531156, 568546, 5337034, -1886564, 4146791, -1150514, -1658931, -3287798, -2134062, 7480760, 1597191, 4175245, 690953, 1647657, -1440425, -257161, 494995, 2150705, -652298, -2785286, -1514513, -5799280, 637266, 1132798, 4952098, --1594507, 3782793, -661962, 2472828, 41876, 2225867, 1733019, 1031866, -933082, 2559801, -3543348, 2465311, 2311766, -93952, 495532, 565325, -1965484, 807991, 434329, 1708323, -880468, 693637, 907849, 1216013, -705985, 726923, -542240, -89121, 4791036, 4626754, -2111513, 1891933, 2525978, 3058554, 4522601, -1974074, 4692789, 51003, 5014375, -1101659, -8928700, 3033321, 2947421, -6089727, -857920, -1382980, -7924752, 4326106, 3642132, -2503966, --10380399, -4727686, -1565516, 5052492, 6947647, 4382478, -2789045, 1480690, -4457103, 207232, -376347, -3626026, -1812476, -9389872, 764504, -1182727, -3939559, 402653, 530428, -1278827, --308701, 8975945, -2171106, 7309498, 1412507, -5663452, 407485, 541166, 4102231, -1856500, -1154809, 965294, 302795, 5592048, 1931662, 5740761, 4217121, -2963528, 5230734, 2541547, -3815542, 347355, 1236951, -1356673, -2509872, -4750234, -5847061, 6060199, -6074695, -4690641, --5027796, 2792803, 2521683, 1100049, 1083942, 3542811, -2311766, 2661806, -1750199, -2444910, -3869229, -3597572, 584652, 1800128, -3033321, 709207, 417686, -490163, -492311, -287226, -2019708, -691490, 739808, -927713, 1545651, -461172, 855772, -1108638, -8093866, -7525320, -1620813, 150324, -1632088, 4510253, -594316, -784368, 4679367, -5152887, 1008244, -4497905, --2914672, -1623498, 48318, 7648800, 8685498, -4034585, 3402688, -6256694, -599685, -2449205, -8438537, -2495376, -479426, 883690, -11885785, -2066953, -5870147, -1934346, -1457605, 4427575, -5880884, 2410014, 7948911, -1017370, -3620121, -3672734, 4590783, 11930345, 8339753, -4651987, --5440113, 5969468, -5353140, 1021129, 1904818, 9776956, -3596498, -4813585, 1066763, -2984466, -1870995, 2495376, 6215355, -6800007, -4412005, 3996467, 7508677, -683437, -3482682, -4415227, --10611254, 4037806, -17180, 3174518, 498216, 287763, -1666984, 1961190, -2707977, 1695438, -2295123, 2327336, -3765613, 2782602, -688269, -2629594, 256624, -5557688, 3496104, 543850, -445066, -2197413, -758599, -1855963, -3884261, -2932389, 2070174, 213138, 839666, -704375, -275952, -197569, -1108638, -854699, -1620813, 193274, -928787, -671626, -224949, 391379, --284005, 559420, -296353, 1981591, 759136, -1105417, 1332514, 832150, -1523640, -19680614, --6484864, -1042603, 3353833, 2253784, 4891431, -9403831, -2821794, -432718, -9756018, -6972343, -2439005, 5887327, 3449396, 6496675, -843961, 3725884, 8650601, 7633768, 7170448, 4128537, --2785823, -2218351, -4469451, -1986959, -4490925, 9231495, 4280472, -1437203, -4119948, -2516851, --4207458, -6113349, -6599218, -8280160, 4954782, 3547643, -9196062, 2140504, -513249, 6307160, -929860, 3093450, 4061965, -8688182, -1394254, -342524, 1100049, 4522601, 6854231, -2790655, --1052804, -2053531, -5510443, 1650878, 1032940, -601832, -1547799, 5208722, 225486, -2920578, --1041530, 2455111, 3284039, -1378685, -215285, 847719, -4809827, 3491809, -434329, -7157026, -751082, -8729521, 1312649, 6438693, -2230699, -291521, -9844602, -4801237, -7334731, -4438312, --678605, -783295, 4432943, 846645, 5216238, -3209951, 1703491, 2841658, 876173, 2795487, -243203, -1933809, 1009854, -882079, 820876, 52613, 287226, -388695, -1435056, -526134, -1098975, -1323387, 791885, 2209224, 1044751, 548145, -45097, 43487, -579284, -900869, --1556926, 1046898, 1320166, -879931, 827318, -928250, 10799695, 4080219, 1822140, -2691871, -7955890, 3094524, 4495220, 12621298, 13654775, 532576, -2220498, -4831838, -7426536, 2738042, -5395553, -2780991, -555661, 784368, -1301375, -4347044, 5120138, -4995584, 2362769, -14441828, --2087354, -3504157, -3511673, -7128035, -1489817, -908386, 111132, -3644817, -5229123, -4103841, -573915, -2712809, -5546951, 3336116, 4769025, 408022, -4549981, -5090073, 1879048, -3914863, -4497905, -5603859, 3627637, 1331440, -66572, -7992398, -7415798, 1739999, -5372467, 8744553, -1561758, 7341173, -3790309, 7389491, 1439351, 4764193, 1618129, 4515085, -4135517, -5901822, --117038, 9496173, -922344, -6365679, -3381213, 4149475, -2646237, -3630858, 965294, -10160282, -6879464, 8297877, -511101, -7046431, -8908299, -257698, 7502771, 5431523, -4241280, 5769215, -604517, -823560, -1116155, -581431, -477278, 1597728, -2509872, -2162516, 198105, 871878, --1884954, 702227, -880468, -252866, 1995549, -787590, -427349, 333934, -3136937, 1676111, -420907, 299574, 731755, 1007170, -131533, 279173, -612033, -597000, -467615, -350577, -15533286, 3183645, 8539469, -3347927, 6401112, 4764193, 9961103, -7358890, -5244692, -1675574, -593242, 7084549, -3306588, 10749766, -780610, 6114960, 5289252, -2990908, 2187212, 6196027, -5738077, 1476932, 1600412, 5645735, -11623792, 1916092, 9026411, 7050189, -6274411, 7870528, --9263171, 5650030, -8168491, -4122095, -2134599, 8537321, -1729261, 8938901, 1994476, 1931662, -450972, -294205, 3541738, 5248450, 11640435, 1835025, 10046465, -4934381, 7344931, 9669582, --299574, -1728724, -3482145, 3741990, -13805099, -1142461, 1365263, -5167383, -8190503, -456877, --517007, -1103807, 3621194, -8433168, 4271882, 3724811, 5367099, -13299903, 4584878, 3202972, --7859790, -920734, 4341138, 9795210, -12399571, -1533840, 958315, -11721503, -1025423, 1726040, --3246995, 7709467, -1714229, 673236, 2178622, -1347009, -374736, -523449, 1388885, -3032784, -469762, -1572495, 949725, 279173, -1708860, -186831, 2152316, -943819, -405874, 54761, --2456721, -940061, 508417, -950262, -1104344, -354335, 501974, -1372779, -550830, 1734093, -2365990, -3003793, -46171, 491774, -13803488, -16917876, -13545790, -12233141, -420370, 8618389, --17856864, 12711493, 8214125, -20049444, 12620761, 5358509, 4311611, 1992865, 1932198, 4543539, --3161633, -3266323, -6601365, -188979, 7681549, 6511171, 3777961, -11412265, 7791071, -8154533, -209917, -7169911, 8943196, -4738960, -3718905, 2835752, -13443785, 1348620, -4464082, -4007741, --1447941, 969052, 13191992, -6221797, -2039036, -5020280, 10028212, -6102612, -3310883, 3102577, -3002719, 2838974, 3536369, -4162897, 4825933, 1241246, -11035918, 15149423, 6003828, 2451890, -1557999, -72478, -7078643, 8672076, 7239704, 3038153, 9693741, 1038308, 4252018, 9771051, -4948339, 2103997, -6760816, 8050916, -3563212, 15378130, -1707786, 409633, -4230543, -16130823, -2071785, -3912178, -1957431, 8278013, -744640, -8751533, -5027796, 7114614, 5908802, 927713, -6852621, 1816771, -5118528, 2404645, -539018, -1698660, -1462973, 558883, 4028679, -1933272, -447213, 722628, 2238215, 869194, -1918240, 2982318, 371515, 792421, -242666, 769336, -301721, -1170916, 1639067, -1183264, 1335735, 1098438, -944893, 3359738, -533650, 826244, --1222455, -765041, 9861245, 6709276, -1136556, -6189585, 16200617, 25745108, -3397856, -3584687, -12455942, 3019899, 4109210, 3293703, -18547816, 2032056, -11993696, 9583683, 13681618, -3603478, --6610492, 2222646, 8664023, -5215701, 10465762, -4123706, 20200842, -5923834, 3905199, -1007707, -5478231, 14375792, -5440650, 1399086, -1277216, 4143570, -5345087, -2597918, 8185134, 17635672, -1466731, 12904229, -4795868, 1759326, -2441689, 4285304, 9438191, 14064944, 10973641, 10409390, -10838350, 6836514, -1995012, 1646046, -1507534, 243739, 2141041, -7079180, -2046015, 11322071, --9989557, 3942780, -4402342, -2661269, -5201206, -20586316, 2280628, 11110544, 7035694, -2570001, --9766219, -23725400, -3835406, 9604621, -2012192, 3767760, -7403987, 5473399, -6830072, 6218576, -13413183, -5936719, -7283728, -13444858, 4024384, 1614371, 2181844, -10640245, 745714, 20938, --3229279, 566399, 4981089, 175020, 3418257, 1478543, 2207076, 2674691, -489626, 4232691, -1003949, 384400, -908386, -1442572, -1199907, 4027069, 1357210, -196495, 2720862, 1382443, -1959042, -439160, 2249489, 2702071, 3724811, -1627256, 382252, -1588601, -17794050, -13981729, -1735704, 8384850, -8049843, -5126044, 943282, -4191888, -26593364, -22773528, 9879499, 9278203, -1607392, 1446867, -9788767, 15302968, 18396956, 11491185, -9609452, 8994735, 12052752, -1791538, --15466177, -6843494, 21192980, -6218576, 2058363, 1394791, 11875048, -9485435, -17155710, 3809636, -7777649, -4099010, 4952098, 11171210, -5442261, -4148402, -573378, -23757074, -6980933, 8313446, --4603131, -15838766, 2817499, -317291, -5085778, 3275986, -1575179, -15010374, -12883291, -22520124, --18053358, 3617436, 7860864, 849330, -5451924, -7442105, 118648, -5053566, 4760435, -10759967, -303332, -3738232, -3205119, -3569118, -1048509, 4362076, -5007932, -21592948, 3194382, -3008625, -5296769, 6069326, 344671, 4254165, 4967130, 1719598, -1304596, 2767570, -3149285, 1343788, --6831146, -3459059, -3098819, -3593277, 1478543, 6110128, -3192235, 1075352, -7755101, 1020592, --831613, -5564130, 2428267, -1677185, 1379221, 2475512, 1279363, 1183264, 4788352, 1202054, -570694, 1762010, -47782, 811212, 610959, -1237488, -3729105, -579821, -3774203, 1905892, --2885681, 4316979, -15569, 6121402, 2689723, -3437048, -2433099, -1800665, -279710, 8654359, -27779848, 24691230, 19286550, -2054068, 18855444, 6122476, 26316338, 11154567, -543313, 32117766, --6687264, -1675574, -20452098, -5388574, -420907, -14416058, 8626979, 12892955, -4196183, -176631, --11616813, -19907710, -11757473, -15177878, -4439386, -9168681, -2898029, -1442035, 9110699, 2315524, --1911797, -8204998, -2849174, -5477694, 2896419, 214212, -8149701, 4295504, 5385889, 2134062, --6306086, -8258149, 2732673, 7626788, -1112933, -288300, -14622753, 26174068, 4364224, -4982699, --744103, 2317672, 11173894, 9508521, -9880035, 5544266, -3885872, 1182727, -1699196, -2495913, --15002321, -13366475, -17959406, 2699924, -795106, -3799972, 11201275, -3597035, 31706522, -3150359, --1765232, -7845832, -3549254, 4095788, 5406290, 3810710, -325344, 13637595, 9737765, -2053531, --6673843, 1777043, -4007205, -53150, 1219234, -4438849, -1522029, 77309, -1548873, 2107218, --5484137, 3178813, 5973226, -1896228, 3096672, -1915019, -1569811, -2492692, 915902, 3297998, --1506997, 4441533, 767189, 1527935, 6128382, 2613488, -914291, 6457484, 2852932, 4453881, -5794985, 4461934, 409096, -95026, 4264366, -4090420, 38655, 2570538, 1358820, 2951180, -2717641, 1424855, 3513820, -17089674, -23978802, -13571023, 18076980, 13961865, -12192875, -12916040, -19373524, 11450920, -12047920, -16793858, -2621004, 2641942, 1938641, 2161979, -9599789, 9946607, --7140920, 19655918, -3007014, -14155138, 3321620, 4881767, -52613, 1321776, -6083821, -9273908, --442919, 7873749, -4888210, 5949067, -9702868, -26267484, -21098490, 13195213, -16424492, 13008382, -3902515, 1343251, -5463199, 7558606, 2530273, -2266132, -3738232, 3432753, 7981123, -7368017, -22102976, -5771363, 7461432, -6857452, 1980517, -2073396, -8613020, 21097416, -16635482, 22968412, --805306, -11729019, -17486422, 8748848, 3171833, 2698850, 1061931, 9212168, 6346351, 8328479, --18003430, -5676873, 514859, 36507, 4583804, -13877576, -6590628, -4726612, -2309082, -17322140, --3459596, -5974837, -19207630, -1289564, -10877542, 2541010, -5086315, 1190243, 2516851, 8155606, -5021354, -3496104, -503048, -7353521, 3936338, -785979, 3420942, -8588861, 491237, -3624416, -2043868, -7945690, 1540283, 1432372, 418222, -2014340, 2711735, -4806069, 3461207, -7323993, -2718178, -5345087, 2483028, 996969, 3468186, -2939368, 8830453, 3120831, 163209, -5648419, --4344897, -1184874, 5903433, -1564442, -2848100, -3100430, 4051228, 3535295, 41260140, 13748190, --9190693, 21177946, 19744502, -10225243, -13001940, 31846646, -2854543, 6985765, -18902152, 46363636, -1614908, -13018046, 6726993, 2289755, 22515292, 357556, 28435368, -20479478, 425202, -22369800, -1705639, 15660525, 711891, -13725105, 19370302, 10320806, 5687611, 4622459, -6803228, -6586333, -1736777, -9736154, 12665859, -11375758, -15127949, 13269301, 5012227, -17569638, 9468792, 1088237, --12773233, -7207492, -4301410, 6622840, -1554241, -7744900, 9295920, -11397233, -4547834, -3964792, -15589658, -10362682, 7499013, 11930882, 5496485, -7203734, -14695767, 9174050, -12580496, 16810502, --21381958, 27996744, -8399882, -4060355, -4080219, 12683038, -1012539, 4526896, 7556995, 4486094, -10776073, -10736881, -20310900, 1290638, 17072496, -11593190, -5535139, -12115029, -7299297, 3020973, --1299765, -3588445, 7312719, 5202279, 3806952, -2037425, 11202885, 6783901, -5389110, -2928631, -2101850, 444529, 9456444, 5916318, -918049, -3289945, -2575907, 10301479, 824097, -5545340, -6483253, 1808181, 122943, 5348845, 2353642, -1164473, -5807333, 1383516, 6719477, -5306432, --1443109, 7642895, -679679, -1827509, -2151779, 4419522, 716186, -84289, -2253247, -24482924, --3240016, 22750978, -6772090, -13877576, 6058052, -6412386, -1386738, 10423349, -24675124, -14199699, -9305047, 12807056, 17027398, -1017370, -3409667, 7129646, -1819992, -24024436, -16750372, 28700582, --2320356, -24760486, -14650133, -9840307, -8411157, 2527052, 8231842, 663572, -4318053, -12248710, --19205484, 2778307, 2390149, -454193, 15440944, -10421738, -30037928, 12340515, 8655970, -34701188, -20714090, -5430986, -17769890, -14311368, -1447404, 20092930, 4619774, -6361921, -7329362, 5896990, -10316511, -14483167, 11130408, 2036888, 8167954, -6143951, -15420543, 13794898, -77846, 15444166, --47379932, 6233072, 7181186, -6764574, 13019656, 15481746, 44815836, 1500554, -29777546, -13449690, --7858717, -28605020, -28411746, 1698123, -16178068, 437550, -10782515, 10818486, -10968810, -10454487, -18864034, 4884989, -733903, -812823, 11038603, -2121177, -1196685, 6674379, 5210332, -3861713, -3538516, -9908490, -2308008, 3056406, -1985886, -2714956, -4952634, -4967667, -2730526, -6179921, -2509872, -7916162, 1706713, -1178969, 7585986, -1569811, -4041564, -3159485, -4645544, -4687420, --1362578, -3206193, -6026913, -4191351, 4344897, -5692443, -3088082, -10363756, 3240553, 4494684, -10918881, 2706903, -1427003, 589484, -20609400, 3279208, 12723304, 11319923, -18289582, 32553704, -22706418, -10468983, 13582834, -26394722, -5847061, -8861054, 41643468, 26652956, -9907416, -15910169, --19428822, -4342749, 1113470, 7626252, 27941984, 5919002, 4757750, 6019934, 784368, -9234180, -1137093, -1766305, 12885976, 17350058, 22040698, 14314589, 9358734, -2186138, -4049617, 3482145, -19987168, 3142842, 3566970, -20314658, -10292889, 34264712, 13941464, 10294500, 284005, 20528334, -11001022, 43269648, -2391760, 44613972, 3203509, -13845901, 14478335, -12052752, -8975945, -1575179, --8198019, 498753, 8323647, 17858474, 3146601, -3790846, -19505594, 6320581, 1663226, 12911745, --15285252, 4106526, -6721624, 2331630, -19451370, 9925669, -17106854, -2061584, -23302882, -32105418, --5298379, -4993973, 26521960, 7156490, -755377, 4986457, 8324184, 10341744, 1821066, -363462, -506269, -18588618, 5983427, 299037, 17441326, -7012608, -756988, -4606353, 12428025, 2492692, -11365557, -97174, -12985834, 6420439, -569083, 4369593, -9836012, -4465156, 2510945, 2785286, --7271917, 748935, 6916508, 4261682, -6371047, -7194070, 12895102, -12798466, 5499706, -3922916, --10311143, 3354906, 2559801, 3382287, 4525285, -4758824, -428423, 6158446, 680215, 4297115, --1614908, -4865124, -4792647, -10887742, -16693464, 5105643, -19147502, -10201, 23054848, 7271917, -19644644, -22833120, -10597295, 11225434, 2243047, 32730872, -16683800, 19581830, -7463043, -9879499, --24442122, -9449465, -13171054, 16369194, 3754338, -21698712, 27143120, -14046154, -13161927, 2661806, -10530186, -7934415, 18748606, -9111236, -13158706, -6723772, 6174016, -2283312, -3671660, 2054068, -18684182, -12701829, 34262564, -13319230, -524523, 31832686, -6471442, 5613523, -43482784, 1939178, -7675644, -9787157, 19061602, -34812856, -42681236, 16176457, -7645579, 23564874, -17674328, -16601122, -1808181, -5457830, 36122284, -4403415, -1749662, 8072928, -33731600, 1919314, -34086472, -13615583, -1865626, 8126615, -42533600, -18943490, -5304285, -2070711, 13643500, -18206904, 21635898, -8923868, -2347737, -27884538, -1506460, -24636470, 9214852, 5334887, 18243410, 23374286, -8801999, 15330349, -1980517, -5012764, 7742753, 4905390, -7618735, -7615514, -13568339, -478352, -8109972, -8373039, -2811056, -1966021, 11522324, -15585899, -2812667, -9791989, 3774740, 5702106, -5514738, -703301, --8398809, -8265128, 9217537, 15308337, 17101486, 3563749, 1015223, -4590783, 3165928, 2882460, --6599218, -10314364, 3447248, -5410585, -7690676, 11677479, 8005282, 6842957, -10739029, -12244415, --26271242, 21422224, -18779744, -5392332, 17201344, 39302172, -11093901, 32214402, 11571716, 8318815, --14846091, 35689032, 5738613, 16661252, 1708860, -20908974, 7771207, -20995948, -20759188, 13083007, --20678656, -4468914, -4713190, 21163452, 1982664, -7072201, 7021735, 9429601, -4182761, -19912006, --4501663, 15359877, 37317896, 8581882, -20745766, 2324114, -3839701, 8924405, 11454678, 18850612, --8145943, 448287, 12371653, 2823941, -459562, 24857124, 22618372, 26732414, 9396315, 22461068, -3251290, 13469554, -10391673, -1894081, 3160022, -20900384, 1753957, 35316980, -4311611, -7766912, -7613367, -560493, 9678172, -21081846, 28024662, -17516488, -7630010, -4829154, 1600949, 3229279, -3755412, -30660160, 38785164, -8432095, -12184822, -4640176, 32959042, -3802657, 6995428, -26006026, --17879412, 452582, 13813689, 12465069, 21133386, -33774012, -10383083, 32170378, -11419244, 3474092, -27770722, 6484864, 6204081, -1891396, 1113470, -10638097, -658204, 2536715, 8039105, -4871030, -6717329, -12266427, -6678674, 551366, -3281355, -2205466, -28149216, -22039624, 1942936, 14123463, --13215077, -22987738, -9203578, -18909130, 5405217, 679679, -7056095, 17848274, -5054103, 7196218, -8368207, -9965935, -6790344, -1810329, 2332167, -904628, 13711683, -389768, 977105, -6769942, --1369558, -10551124, 63107564, -3704409, 12639552, -526670, -6502581, 1784022, -29207926, -12459700, --8989903, 11353209, 8086887, 14286135, 1620813, -15358266, 16084116, -13043816, 18545668, 13662828, --15034533, -16090558, 1899986, 22708566, -23295902, 9754408, 10714333, -13297219, 5908265, -1715839, -8114267, -1030255, -33955476, 19039054, 11683922, -28597502, 34493420, -18287434, -4406100, -11319923, -27843200, -5519033, -23704462, -39728, 350577, 23028540, 23406498, 1561221, -18059800, 26261578, --4240744, 4648765, -33300492, 26237956, 10696079, 1601486, -19100256, -14454176, -2024540, 9147743, --15343234, -27422830, -11668889, 21715354, 13460428, -3175592, 35228932, 2136209, -5688684, -25352656, -31099322, -28827284, -9277666, 31766652, 10072772, 4161287, -11878269, 4980552, 31333398, 6999186, -13778255, 19862614, -51099912, -11147051, -8423505, -4170413, -21138218, -3690988, -2423435, 31163208, -8523899, 2181307, 15908559, 22297322, 15670188, -10917807, 6048925, 13387950, -2506650, 5242008, -5869073, 7205345, 4733591, 22189412, 12101607, 1493575, -6269579, -9820443, -18956912, 2920041, -193274, 5306969, 6457484, 3133716, 33421824, -4405026, 12216498, 7367480, -8842801, -26209502, --4055523, -9589588, -16210817, -17529910, 3286724, -2731599, -21150030, 272730, 8398809, -1901060, --1834488, 7693360, -5003637, -16127602, -25305410, 802622, -28329604, 26497800, 41407244, 19223736, -23553064, -36156108, -32230508, -25332254, 2415919, 44800804, -8317741, 16643535, 29115046, 14665703, --16121160, 940061, 21246666, -27473832, -22971096, -19712290, 22262426, 15514496, -28816546, -40666360, -55066848, 33957084, -39348344, 17758080, -4647692, 16265578, 1688996, -11926050, -27350352, 24890410, --727997, -20271708, -30350924, 7715909, 7023882, -7692824, 745177, -2841121, -15008763, -6606734, --7935489, 14021994, -26607322, 29251948, -20091320, 1045825, 46021112, -44488344, -10791642, 41929080, -3004330, 9781251, -6288906, -13175886, 13115220, -4919348, -18554796, 2359011, -42246372, 71503688, --7087233, -78959216, 29817274, 77783472, 45880452, -96259880, -28030030, 18143552, 6914898, -14713484, --22223234, 11939472, 29365766, -36266704, -10026601, -63227288, -10925860, 21740050, 7931731, -19375134, --31634582, 12360379, 27683212, -667867, -8558259, -15228343, 22002580, 13011603, 8938364, -1935957, --6657736, 2540473, 12288975, 9475772, -2253784, -25393994, -15776489, 26249230, 11273752, -13657996, --9212705, 18806052, 6311992, -2729452, -38398620, -17692044, -19151260, 21461414, 5905043, 4620311, --3988951, 452582, 20963736, -4356708, -3725884, -18394808, 3629247, -6015102, 29271812, 6116034, --6548752, 3463354, 29552596, -3943854, -19952270, 4591857, 19639274, 45867028, -19213000, 14944876, --24252070, -64328408, 34746824, -16205985, -35156456, -24392730, -35939748, 17241072, 12030740, -48404820, -31118648, -16879222, -1165547, -602906, -24783036, 19145890, 19148574, 16819628, -1529008, 22006876, -11577084, -13372918, 1288490, -27612882, -9920301, -24501714, -16998944, -1223529, 39875012, -33261838, --7014219, -7189239, -29697014, 17437030, -33506650, 17379586, 15184857, -22832046, 18073222, -36688148, -10628433, -31903554, 20782274, -11973295, -16746614, -17506286, -25875568, -7042136, 13188771, 22610318, --26262652, 17584670, 9982578, 27540940, 34029024, 19619948, -28075128, -13136694, -52896280, -13446469, --15277199, 17580374, -61750892, -11790222, -36678484, -3250217, 37033356, 33914136, 22448720, 7847442, -49826988, 54377508, 48583060, -16714402, -21659520, 18355080, 47561932, 87650616, 6463926, 20468204, -10823318, -4767414, 16341814, -15884400, 9689446, -4185446, -102542, -10266046, 16580184, 18954228, --6512244, -15817828, -11809013, 14336601, 6507949, 16267189, -8835285, 6255083, -3115462, -7334194, --4544076, 16151761, 32224066, 15247671, -16520055, 8375186, -5625871, 11400454, 5273683, 5588290, -15827491, -10210211, -21001854, 1657857, 16378321, 12642773, 4506495, -3257733, -7149510, -29131690, -28651190, 7871065, -6589017, -30285426, -6928856, -20841866, 10472204, -10135049, 7466264, 57370564, --33879240, 21373368, 26214332, -12205223, 2467459, 9884330, -3114925, 27758910, 1516124, 20060718, --25731686, -3781182, 22526030, 3565897, -34950832, 22541062, -13916231, -11539503, -13305809, -3615826, --12979391, 13141526, 18622442, 8896488, -3182034, -9890773, 16158741, -5394479, -25676926, 20924006, --43389908, -11089606, -8901857, -9692131, 24823300, 26980448, 48690972, -14419816, 20847234, -920197, -9411884, 31751082, -2302103, 3262028, -21250962, -67168456, 33202782, 6243809, -32341104, -22322556, -3287798, 17373680, -3074660, -19138374, 9859634, -19621022, 25617870, 14136885, -11158862, -23506356, -46427524, 4955319, 2467996, -4410395, 6438693, 3126199, 2026151, -15763604, -32995012, 8968965, --4833986, -11898670, -30411590, -7637526, -905164, 26963804, 11180337, -34328064, 19913616, 3393024, --1308354, -3949759, 11101954, 14079977, -2834142, -6546604, -2438468, -6205154, 5243082, 8301098, --392453, 4691178, 9478993, -3669513, 13692893, 5667746, 4189204, 7042673, -3888019, 17009144, -2873333, -3802657, 11184632, -13724031, 4334696, 7634305, -3243774, -5965173, 15436112, 22123914, --19987168, -3862249, -7067906, -7005629, 7931731, 6739878, -12575664, 6773701, 5531381, 4803921, -5789616, -11421392, 7997229, -1029182, 4694936, -3716757, 3206193, 63839856, 32560148, 64239288, --59319404, 5129265, 30833570, -11959873, 35119948, 67781024, 37195492, 2161442, -18263812, -18833432, -3513820, 29375966, 31457414, 7147363, -78920, -46780784, -9642202, 46133856, 15262703, -12868259, -25479356, -21677236, -30323006, -8329552, -2024540, 35668628, 46585900, 41851236, 15857556, -16225313, --24941948, -46271832, -46010376, 40074728, 16806744, 3284039, 61892628, 3749507, -18951544, -25327960, --25733834, 12517682, 26443040, 21044802, 40598716, 2882997, 29212756, -1915555, -5250598, 14798847, -27047556, 19786378, 17188996, -15428059, -5844377, -12168716, -27435178, -21980568, -39983460, -13383118, -10719701, -6564321, 29088740, 34969088, -569620, 331786, -14317273, -25561498, 5273683, 33790120, --1946694, 18702972, 8203388, -2452963, -10584947, -4866735, 3092913, 11798812, 9199283, -9029095, --18913962, -23381266, -21939766, -8500277, 8915815, -2281702, -13786308, -7052873, -9564892, -8085813, -4529580, -1219234, 12958453, 18538690, 4167729, -22535156, -11579769, -13498545, -3058017, 15210627, -3679713, 3745212, -18423262, -17454210, -19886236, -10210748, 17382270, 11839614, 15007689, 8062191, --7240241, -8974871, 6381248, 5761699, -1534377, 3908420, -7587597, -6115497, 4542465, 3183108, -6285148, -3657702, -7537131, -3480534, -5768678, -1090385, -33910916, -66134444, 26095148, 107843408, -109653200, 92815320, 67252744, -41511932, -47341276, -51159504, -68038184, -104120208, -83875880, -72855528, -33817500, 78255912, 58200564, 125858112, 97275640, 50713900, -18721762, -33934536, -84619984, -66070556, --65416648, -13388487, -40088152, -32566052, 9695889, 17690970, 35639640, 35762584, 49079128, 48673792, -62807992, 36617280, 16100759, -9165460, -10624138, -27668180, -41843720, -50535660, -61763240, -40470940, --75856104, -50557672, -37941740, 37927784, 71951440, 77581072, 53672060, 36550172, 57283052, 43812424, -54974508, 43184824, 15129022, -20452634, -96331288, -68146632, -69452304, -107778984, -67620504, -58540404, --56804164, 20594906, 57084948, 90651728, 74645992, 106577464, 95655368, 93523448, 66672388, -36457828, --32996086, -74947176, -99089192, -109189880, -89558120, -43022688, -12247099, -22676890, 29482266, 78036336, -55006720, 37131604, 62583044, 52578452, 18759344, -12465069, -12555800, -4138738, -15393163, -42106248, --26477400, -30112016, -16299401, -13556527, -31383326, -11688753, 10714870, -10591389, 34605088, 45687176, -50202264, 53104048, 3228742, 15780247, 15439334, -4645007, -72967736, -58252640, -45535780, -40685152, --32058172, -30416958, 33442226, 49999324, 54350664, 52010980, 42861628, 29352880, 26404386, -529355, --7988639, -42276972, -57024280, -51077900, -42633456, -27248346, -17794586, 1903207, 25476672, 51852068, -38766376, 24608016, 17751100, 4735739, -548682, -166430, -10603201, -13758928, -11458436, -13467407, -2892124, -5226975, -18506478, 2125472, 8365523, -3543885, -4925254, -4093104, 1682017, 3077344, --4189204, 799938, 4656282, 1343251, 504659, 18254, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +582505, 2175938, 1815161, -5267241, -2720325, 7160784, 12469364, 2010045, 6646999, -2693481, +1263794, -342524, 5630166, -4454418, -10153840, 4110821, 4764730, -5923834, 6877854, 3383897, +6274947, 1984275, 1498407, -2736431, -869194, 328028, 4184909, 377957, -6283537, 277562, +-502511, 1361505, -869731, 1121523, 1515587, 3749507, 2726767, 895501, 1178969, 372052, +1844689, -1937567, -3132642, -6969658, 1351304, 1531156, 568546, 5337034, -1886564, 4146791, +1150514, -1658931, -3287798, -2134062, 7480760, 1597191, 4175245, 690953, 1647657, -1440425, +257161, 494995, 2150705, -652298, -2785286, -1514513, -5799280, 637266, 1132798, 4952098, +-1594507, 3782793, -661962, 2472828, 41876, 2225867, 1733019, 1031866, -933082, 2559801, +3543348, 2465311, 2311766, -93952, 495532, 565325, -1965484, 807991, 434329, 1708323, +880468, 693637, 907849, 1216013, -705985, 726923, -542240, -89121, 4791036, 4626754, +2111513, 1891933, 2525978, 3058554, 4522601, -1974074, 4692789, 51003, 5014375, -1101659, +8928700, 3033321, 2947421, -6089727, -857920, -1382980, -7924752, 4326106, 3642132, -2503966, +-10380399, -4727686, -1565516, 5052492, 6947647, 4382478, -2789045, 1480690, -4457103, 207232, +376347, -3626026, -1812476, -9389872, 764504, -1182727, -3939559, 402653, 530428, -1278827, +-308701, 8975945, -2171106, 7309498, 1412507, -5663452, 407485, 541166, 4102231, -1856500, +1154809, 965294, 302795, 5592048, 1931662, 5740761, 4217121, -2963528, 5230734, 2541547, +3815542, 347355, 1236951, -1356673, -2509872, -4750234, -5847061, 6060199, -6074695, -4690641, +-5027796, 2792803, 2521683, 1100049, 1083942, 3542811, -2311766, 2661806, -1750199, -2444910, +3869229, -3597572, 584652, 1800128, -3033321, 709207, 417686, -490163, -492311, -287226, +2019708, -691490, 739808, -927713, 1545651, -461172, 855772, -1108638, -8093866, -7525320, +1620813, 150324, -1632088, 4510253, -594316, -784368, 4679367, -5152887, 1008244, -4497905, +-2914672, -1623498, 48318, 7648800, 8685498, -4034585, 3402688, -6256694, -599685, -2449205, +8438537, -2495376, -479426, 883690, -11885785, -2066953, -5870147, -1934346, -1457605, 4427575, +5880884, 2410014, 7948911, -1017370, -3620121, -3672734, 4590783, 11930345, 8339753, -4651987, +-5440113, 5969468, -5353140, 1021129, 1904818, 9776956, -3596498, -4813585, 1066763, -2984466, +1870995, 2495376, 6215355, -6800007, -4412005, 3996467, 7508677, -683437, -3482682, -4415227, +-10611254, 4037806, -17180, 3174518, 498216, 287763, -1666984, 1961190, -2707977, 1695438, +2295123, 2327336, -3765613, 2782602, -688269, -2629594, 256624, -5557688, 3496104, 543850, +445066, -2197413, -758599, -1855963, -3884261, -2932389, 2070174, 213138, 839666, -704375, +275952, -197569, -1108638, -854699, -1620813, 193274, -928787, -671626, -224949, 391379, +-284005, 559420, -296353, 1981591, 759136, -1105417, 1332514, 832150, -1523640, -19680614, +-6484864, -1042603, 3353833, 2253784, 4891431, -9403831, -2821794, -432718, -9756018, -6972343, +2439005, 5887327, 3449396, 6496675, -843961, 3725884, 8650601, 7633768, 7170448, 4128537, +-2785823, -2218351, -4469451, -1986959, -4490925, 9231495, 4280472, -1437203, -4119948, -2516851, +-4207458, -6113349, -6599218, -8280160, 4954782, 3547643, -9196062, 2140504, -513249, 6307160, +929860, 3093450, 4061965, -8688182, -1394254, -342524, 1100049, 4522601, 6854231, -2790655, +-1052804, -2053531, -5510443, 1650878, 1032940, -601832, -1547799, 5208722, 225486, -2920578, +-1041530, 2455111, 3284039, -1378685, -215285, 847719, -4809827, 3491809, -434329, -7157026, +751082, -8729521, 1312649, 6438693, -2230699, -291521, -9844602, -4801237, -7334731, -4438312, +-678605, -783295, 4432943, 846645, 5216238, -3209951, 1703491, 2841658, 876173, 2795487, +243203, -1933809, 1009854, -882079, 820876, 52613, 287226, -388695, -1435056, -526134, +1098975, -1323387, 791885, 2209224, 1044751, 548145, -45097, 43487, -579284, -900869, +-1556926, 1046898, 1320166, -879931, 827318, -928250, 10799695, 4080219, 1822140, -2691871, +7955890, 3094524, 4495220, 12621298, 13654775, 532576, -2220498, -4831838, -7426536, 2738042, +5395553, -2780991, -555661, 784368, -1301375, -4347044, 5120138, -4995584, 2362769, -14441828, +-2087354, -3504157, -3511673, -7128035, -1489817, -908386, 111132, -3644817, -5229123, -4103841, +573915, -2712809, -5546951, 3336116, 4769025, 408022, -4549981, -5090073, 1879048, -3914863, +4497905, -5603859, 3627637, 1331440, -66572, -7992398, -7415798, 1739999, -5372467, 8744553, +1561758, 7341173, -3790309, 7389491, 1439351, 4764193, 1618129, 4515085, -4135517, -5901822, +-117038, 9496173, -922344, -6365679, -3381213, 4149475, -2646237, -3630858, 965294, -10160282, +6879464, 8297877, -511101, -7046431, -8908299, -257698, 7502771, 5431523, -4241280, 5769215, +604517, -823560, -1116155, -581431, -477278, 1597728, -2509872, -2162516, 198105, 871878, +-1884954, 702227, -880468, -252866, 1995549, -787590, -427349, 333934, -3136937, 1676111, +420907, 299574, 731755, 1007170, -131533, 279173, -612033, -597000, -467615, -350577, +15533286, 3183645, 8539469, -3347927, 6401112, 4764193, 9961103, -7358890, -5244692, -1675574, +593242, 7084549, -3306588, 10749766, -780610, 6114960, 5289252, -2990908, 2187212, 6196027, +5738077, 1476932, 1600412, 5645735, -11623792, 1916092, 9026411, 7050189, -6274411, 7870528, +-9263171, 5650030, -8168491, -4122095, -2134599, 8537321, -1729261, 8938901, 1994476, 1931662, +450972, -294205, 3541738, 5248450, 11640435, 1835025, 10046465, -4934381, 7344931, 9669582, +-299574, -1728724, -3482145, 3741990, -13805099, -1142461, 1365263, -5167383, -8190503, -456877, +-517007, -1103807, 3621194, -8433168, 4271882, 3724811, 5367099, -13299903, 4584878, 3202972, +-7859790, -920734, 4341138, 9795210, -12399571, -1533840, 958315, -11721503, -1025423, 1726040, +-3246995, 7709467, -1714229, 673236, 2178622, -1347009, -374736, -523449, 1388885, -3032784, +469762, -1572495, 949725, 279173, -1708860, -186831, 2152316, -943819, -405874, 54761, +-2456721, -940061, 508417, -950262, -1104344, -354335, 501974, -1372779, -550830, 1734093, +2365990, -3003793, -46171, 491774, -13803488, -16917876, -13545790, -12233141, -420370, 8618389, +-17856864, 12711493, 8214125, -20049444, 12620761, 5358509, 4311611, 1992865, 1932198, 4543539, +-3161633, -3266323, -6601365, -188979, 7681549, 6511171, 3777961, -11412265, 7791071, -8154533, +209917, -7169911, 8943196, -4738960, -3718905, 2835752, -13443785, 1348620, -4464082, -4007741, +-1447941, 969052, 13191992, -6221797, -2039036, -5020280, 10028212, -6102612, -3310883, 3102577, +3002719, 2838974, 3536369, -4162897, 4825933, 1241246, -11035918, 15149423, 6003828, 2451890, +1557999, -72478, -7078643, 8672076, 7239704, 3038153, 9693741, 1038308, 4252018, 9771051, +4948339, 2103997, -6760816, 8050916, -3563212, 15378130, -1707786, 409633, -4230543, -16130823, +2071785, -3912178, -1957431, 8278013, -744640, -8751533, -5027796, 7114614, 5908802, 927713, +6852621, 1816771, -5118528, 2404645, -539018, -1698660, -1462973, 558883, 4028679, -1933272, +447213, 722628, 2238215, 869194, -1918240, 2982318, 371515, 792421, -242666, 769336, +301721, -1170916, 1639067, -1183264, 1335735, 1098438, -944893, 3359738, -533650, 826244, +-1222455, -765041, 9861245, 6709276, -1136556, -6189585, 16200617, 25745108, -3397856, -3584687, +12455942, 3019899, 4109210, 3293703, -18547816, 2032056, -11993696, 9583683, 13681618, -3603478, +-6610492, 2222646, 8664023, -5215701, 10465762, -4123706, 20200842, -5923834, 3905199, -1007707, +5478231, 14375792, -5440650, 1399086, -1277216, 4143570, -5345087, -2597918, 8185134, 17635672, +1466731, 12904229, -4795868, 1759326, -2441689, 4285304, 9438191, 14064944, 10973641, 10409390, +10838350, 6836514, -1995012, 1646046, -1507534, 243739, 2141041, -7079180, -2046015, 11322071, +-9989557, 3942780, -4402342, -2661269, -5201206, -20586316, 2280628, 11110544, 7035694, -2570001, +-9766219, -23725400, -3835406, 9604621, -2012192, 3767760, -7403987, 5473399, -6830072, 6218576, +13413183, -5936719, -7283728, -13444858, 4024384, 1614371, 2181844, -10640245, 745714, 20938, +-3229279, 566399, 4981089, 175020, 3418257, 1478543, 2207076, 2674691, -489626, 4232691, +1003949, 384400, -908386, -1442572, -1199907, 4027069, 1357210, -196495, 2720862, 1382443, +1959042, -439160, 2249489, 2702071, 3724811, -1627256, 382252, -1588601, -17794050, -13981729, +1735704, 8384850, -8049843, -5126044, 943282, -4191888, -26593364, -22773528, 9879499, 9278203, +1607392, 1446867, -9788767, 15302968, 18396956, 11491185, -9609452, 8994735, 12052752, -1791538, +-15466177, -6843494, 21192980, -6218576, 2058363, 1394791, 11875048, -9485435, -17155710, 3809636, +7777649, -4099010, 4952098, 11171210, -5442261, -4148402, -573378, -23757074, -6980933, 8313446, +-4603131, -15838766, 2817499, -317291, -5085778, 3275986, -1575179, -15010374, -12883291, -22520124, +-18053358, 3617436, 7860864, 849330, -5451924, -7442105, 118648, -5053566, 4760435, -10759967, +303332, -3738232, -3205119, -3569118, -1048509, 4362076, -5007932, -21592948, 3194382, -3008625, +5296769, 6069326, 344671, 4254165, 4967130, 1719598, -1304596, 2767570, -3149285, 1343788, +-6831146, -3459059, -3098819, -3593277, 1478543, 6110128, -3192235, 1075352, -7755101, 1020592, +-831613, -5564130, 2428267, -1677185, 1379221, 2475512, 1279363, 1183264, 4788352, 1202054, +570694, 1762010, -47782, 811212, 610959, -1237488, -3729105, -579821, -3774203, 1905892, +-2885681, 4316979, -15569, 6121402, 2689723, -3437048, -2433099, -1800665, -279710, 8654359, +27779848, 24691230, 19286550, -2054068, 18855444, 6122476, 26316338, 11154567, -543313, 32117766, +-6687264, -1675574, -20452098, -5388574, -420907, -14416058, 8626979, 12892955, -4196183, -176631, +-11616813, -19907710, -11757473, -15177878, -4439386, -9168681, -2898029, -1442035, 9110699, 2315524, +-1911797, -8204998, -2849174, -5477694, 2896419, 214212, -8149701, 4295504, 5385889, 2134062, +-6306086, -8258149, 2732673, 7626788, -1112933, -288300, -14622753, 26174068, 4364224, -4982699, +-744103, 2317672, 11173894, 9508521, -9880035, 5544266, -3885872, 1182727, -1699196, -2495913, +-15002321, -13366475, -17959406, 2699924, -795106, -3799972, 11201275, -3597035, 31706522, -3150359, +-1765232, -7845832, -3549254, 4095788, 5406290, 3810710, -325344, 13637595, 9737765, -2053531, +-6673843, 1777043, -4007205, -53150, 1219234, -4438849, -1522029, 77309, -1548873, 2107218, +-5484137, 3178813, 5973226, -1896228, 3096672, -1915019, -1569811, -2492692, 915902, 3297998, +-1506997, 4441533, 767189, 1527935, 6128382, 2613488, -914291, 6457484, 2852932, 4453881, +5794985, 4461934, 409096, -95026, 4264366, -4090420, 38655, 2570538, 1358820, 2951180, +2717641, 1424855, 3513820, -17089674, -23978802, -13571023, 18076980, 13961865, -12192875, -12916040, +19373524, 11450920, -12047920, -16793858, -2621004, 2641942, 1938641, 2161979, -9599789, 9946607, +-7140920, 19655918, -3007014, -14155138, 3321620, 4881767, -52613, 1321776, -6083821, -9273908, +-442919, 7873749, -4888210, 5949067, -9702868, -26267484, -21098490, 13195213, -16424492, 13008382, +3902515, 1343251, -5463199, 7558606, 2530273, -2266132, -3738232, 3432753, 7981123, -7368017, +22102976, -5771363, 7461432, -6857452, 1980517, -2073396, -8613020, 21097416, -16635482, 22968412, +-805306, -11729019, -17486422, 8748848, 3171833, 2698850, 1061931, 9212168, 6346351, 8328479, +-18003430, -5676873, 514859, 36507, 4583804, -13877576, -6590628, -4726612, -2309082, -17322140, +-3459596, -5974837, -19207630, -1289564, -10877542, 2541010, -5086315, 1190243, 2516851, 8155606, +5021354, -3496104, -503048, -7353521, 3936338, -785979, 3420942, -8588861, 491237, -3624416, +2043868, -7945690, 1540283, 1432372, 418222, -2014340, 2711735, -4806069, 3461207, -7323993, +2718178, -5345087, 2483028, 996969, 3468186, -2939368, 8830453, 3120831, 163209, -5648419, +-4344897, -1184874, 5903433, -1564442, -2848100, -3100430, 4051228, 3535295, 41260140, 13748190, +-9190693, 21177946, 19744502, -10225243, -13001940, 31846646, -2854543, 6985765, -18902152, 46363636, +1614908, -13018046, 6726993, 2289755, 22515292, 357556, 28435368, -20479478, 425202, -22369800, +1705639, 15660525, 711891, -13725105, 19370302, 10320806, 5687611, 4622459, -6803228, -6586333, +1736777, -9736154, 12665859, -11375758, -15127949, 13269301, 5012227, -17569638, 9468792, 1088237, +-12773233, -7207492, -4301410, 6622840, -1554241, -7744900, 9295920, -11397233, -4547834, -3964792, +15589658, -10362682, 7499013, 11930882, 5496485, -7203734, -14695767, 9174050, -12580496, 16810502, +-21381958, 27996744, -8399882, -4060355, -4080219, 12683038, -1012539, 4526896, 7556995, 4486094, +10776073, -10736881, -20310900, 1290638, 17072496, -11593190, -5535139, -12115029, -7299297, 3020973, +-1299765, -3588445, 7312719, 5202279, 3806952, -2037425, 11202885, 6783901, -5389110, -2928631, +2101850, 444529, 9456444, 5916318, -918049, -3289945, -2575907, 10301479, 824097, -5545340, +6483253, 1808181, 122943, 5348845, 2353642, -1164473, -5807333, 1383516, 6719477, -5306432, +-1443109, 7642895, -679679, -1827509, -2151779, 4419522, 716186, -84289, -2253247, -24482924, +-3240016, 22750978, -6772090, -13877576, 6058052, -6412386, -1386738, 10423349, -24675124, -14199699, +9305047, 12807056, 17027398, -1017370, -3409667, 7129646, -1819992, -24024436, -16750372, 28700582, +-2320356, -24760486, -14650133, -9840307, -8411157, 2527052, 8231842, 663572, -4318053, -12248710, +-19205484, 2778307, 2390149, -454193, 15440944, -10421738, -30037928, 12340515, 8655970, -34701188, +20714090, -5430986, -17769890, -14311368, -1447404, 20092930, 4619774, -6361921, -7329362, 5896990, +10316511, -14483167, 11130408, 2036888, 8167954, -6143951, -15420543, 13794898, -77846, 15444166, +-47379932, 6233072, 7181186, -6764574, 13019656, 15481746, 44815836, 1500554, -29777546, -13449690, +-7858717, -28605020, -28411746, 1698123, -16178068, 437550, -10782515, 10818486, -10968810, -10454487, +18864034, 4884989, -733903, -812823, 11038603, -2121177, -1196685, 6674379, 5210332, -3861713, +3538516, -9908490, -2308008, 3056406, -1985886, -2714956, -4952634, -4967667, -2730526, -6179921, +2509872, -7916162, 1706713, -1178969, 7585986, -1569811, -4041564, -3159485, -4645544, -4687420, +-1362578, -3206193, -6026913, -4191351, 4344897, -5692443, -3088082, -10363756, 3240553, 4494684, +10918881, 2706903, -1427003, 589484, -20609400, 3279208, 12723304, 11319923, -18289582, 32553704, +22706418, -10468983, 13582834, -26394722, -5847061, -8861054, 41643468, 26652956, -9907416, -15910169, +-19428822, -4342749, 1113470, 7626252, 27941984, 5919002, 4757750, 6019934, 784368, -9234180, +1137093, -1766305, 12885976, 17350058, 22040698, 14314589, 9358734, -2186138, -4049617, 3482145, +19987168, 3142842, 3566970, -20314658, -10292889, 34264712, 13941464, 10294500, 284005, 20528334, +11001022, 43269648, -2391760, 44613972, 3203509, -13845901, 14478335, -12052752, -8975945, -1575179, +-8198019, 498753, 8323647, 17858474, 3146601, -3790846, -19505594, 6320581, 1663226, 12911745, +-15285252, 4106526, -6721624, 2331630, -19451370, 9925669, -17106854, -2061584, -23302882, -32105418, +-5298379, -4993973, 26521960, 7156490, -755377, 4986457, 8324184, 10341744, 1821066, -363462, +506269, -18588618, 5983427, 299037, 17441326, -7012608, -756988, -4606353, 12428025, 2492692, +11365557, -97174, -12985834, 6420439, -569083, 4369593, -9836012, -4465156, 2510945, 2785286, +-7271917, 748935, 6916508, 4261682, -6371047, -7194070, 12895102, -12798466, 5499706, -3922916, +-10311143, 3354906, 2559801, 3382287, 4525285, -4758824, -428423, 6158446, 680215, 4297115, +-1614908, -4865124, -4792647, -10887742, -16693464, 5105643, -19147502, -10201, 23054848, 7271917, +19644644, -22833120, -10597295, 11225434, 2243047, 32730872, -16683800, 19581830, -7463043, -9879499, +-24442122, -9449465, -13171054, 16369194, 3754338, -21698712, 27143120, -14046154, -13161927, 2661806, +10530186, -7934415, 18748606, -9111236, -13158706, -6723772, 6174016, -2283312, -3671660, 2054068, +18684182, -12701829, 34262564, -13319230, -524523, 31832686, -6471442, 5613523, -43482784, 1939178, +7675644, -9787157, 19061602, -34812856, -42681236, 16176457, -7645579, 23564874, -17674328, -16601122, +1808181, -5457830, 36122284, -4403415, -1749662, 8072928, -33731600, 1919314, -34086472, -13615583, +1865626, 8126615, -42533600, -18943490, -5304285, -2070711, 13643500, -18206904, 21635898, -8923868, +2347737, -27884538, -1506460, -24636470, 9214852, 5334887, 18243410, 23374286, -8801999, 15330349, +1980517, -5012764, 7742753, 4905390, -7618735, -7615514, -13568339, -478352, -8109972, -8373039, +2811056, -1966021, 11522324, -15585899, -2812667, -9791989, 3774740, 5702106, -5514738, -703301, +-8398809, -8265128, 9217537, 15308337, 17101486, 3563749, 1015223, -4590783, 3165928, 2882460, +-6599218, -10314364, 3447248, -5410585, -7690676, 11677479, 8005282, 6842957, -10739029, -12244415, +-26271242, 21422224, -18779744, -5392332, 17201344, 39302172, -11093901, 32214402, 11571716, 8318815, +-14846091, 35689032, 5738613, 16661252, 1708860, -20908974, 7771207, -20995948, -20759188, 13083007, +-20678656, -4468914, -4713190, 21163452, 1982664, -7072201, 7021735, 9429601, -4182761, -19912006, +-4501663, 15359877, 37317896, 8581882, -20745766, 2324114, -3839701, 8924405, 11454678, 18850612, +-8145943, 448287, 12371653, 2823941, -459562, 24857124, 22618372, 26732414, 9396315, 22461068, +3251290, 13469554, -10391673, -1894081, 3160022, -20900384, 1753957, 35316980, -4311611, -7766912, +7613367, -560493, 9678172, -21081846, 28024662, -17516488, -7630010, -4829154, 1600949, 3229279, +3755412, -30660160, 38785164, -8432095, -12184822, -4640176, 32959042, -3802657, 6995428, -26006026, +-17879412, 452582, 13813689, 12465069, 21133386, -33774012, -10383083, 32170378, -11419244, 3474092, +27770722, 6484864, 6204081, -1891396, 1113470, -10638097, -658204, 2536715, 8039105, -4871030, +6717329, -12266427, -6678674, 551366, -3281355, -2205466, -28149216, -22039624, 1942936, 14123463, +-13215077, -22987738, -9203578, -18909130, 5405217, 679679, -7056095, 17848274, -5054103, 7196218, +8368207, -9965935, -6790344, -1810329, 2332167, -904628, 13711683, -389768, 977105, -6769942, +-1369558, -10551124, 63107564, -3704409, 12639552, -526670, -6502581, 1784022, -29207926, -12459700, +-8989903, 11353209, 8086887, 14286135, 1620813, -15358266, 16084116, -13043816, 18545668, 13662828, +-15034533, -16090558, 1899986, 22708566, -23295902, 9754408, 10714333, -13297219, 5908265, -1715839, +8114267, -1030255, -33955476, 19039054, 11683922, -28597502, 34493420, -18287434, -4406100, -11319923, +27843200, -5519033, -23704462, -39728, 350577, 23028540, 23406498, 1561221, -18059800, 26261578, +-4240744, 4648765, -33300492, 26237956, 10696079, 1601486, -19100256, -14454176, -2024540, 9147743, +-15343234, -27422830, -11668889, 21715354, 13460428, -3175592, 35228932, 2136209, -5688684, -25352656, +31099322, -28827284, -9277666, 31766652, 10072772, 4161287, -11878269, 4980552, 31333398, 6999186, +13778255, 19862614, -51099912, -11147051, -8423505, -4170413, -21138218, -3690988, -2423435, 31163208, +8523899, 2181307, 15908559, 22297322, 15670188, -10917807, 6048925, 13387950, -2506650, 5242008, +5869073, 7205345, 4733591, 22189412, 12101607, 1493575, -6269579, -9820443, -18956912, 2920041, +193274, 5306969, 6457484, 3133716, 33421824, -4405026, 12216498, 7367480, -8842801, -26209502, +-4055523, -9589588, -16210817, -17529910, 3286724, -2731599, -21150030, 272730, 8398809, -1901060, +-1834488, 7693360, -5003637, -16127602, -25305410, 802622, -28329604, 26497800, 41407244, 19223736, +23553064, -36156108, -32230508, -25332254, 2415919, 44800804, -8317741, 16643535, 29115046, 14665703, +-16121160, 940061, 21246666, -27473832, -22971096, -19712290, 22262426, 15514496, -28816546, -40666360, +55066848, 33957084, -39348344, 17758080, -4647692, 16265578, 1688996, -11926050, -27350352, 24890410, +-727997, -20271708, -30350924, 7715909, 7023882, -7692824, 745177, -2841121, -15008763, -6606734, +-7935489, 14021994, -26607322, 29251948, -20091320, 1045825, 46021112, -44488344, -10791642, 41929080, +3004330, 9781251, -6288906, -13175886, 13115220, -4919348, -18554796, 2359011, -42246372, 71503688, +-7087233, -78959216, 29817274, 77783472, 45880452, -96259880, -28030030, 18143552, 6914898, -14713484, +-22223234, 11939472, 29365766, -36266704, -10026601, -63227288, -10925860, 21740050, 7931731, -19375134, +-31634582, 12360379, 27683212, -667867, -8558259, -15228343, 22002580, 13011603, 8938364, -1935957, +-6657736, 2540473, 12288975, 9475772, -2253784, -25393994, -15776489, 26249230, 11273752, -13657996, +-9212705, 18806052, 6311992, -2729452, -38398620, -17692044, -19151260, 21461414, 5905043, 4620311, +-3988951, 452582, 20963736, -4356708, -3725884, -18394808, 3629247, -6015102, 29271812, 6116034, +-6548752, 3463354, 29552596, -3943854, -19952270, 4591857, 19639274, 45867028, -19213000, 14944876, +-24252070, -64328408, 34746824, -16205985, -35156456, -24392730, -35939748, 17241072, 12030740, -48404820, +31118648, -16879222, -1165547, -602906, -24783036, 19145890, 19148574, 16819628, -1529008, 22006876, +11577084, -13372918, 1288490, -27612882, -9920301, -24501714, -16998944, -1223529, 39875012, -33261838, +-7014219, -7189239, -29697014, 17437030, -33506650, 17379586, 15184857, -22832046, 18073222, -36688148, +10628433, -31903554, 20782274, -11973295, -16746614, -17506286, -25875568, -7042136, 13188771, 22610318, +-26262652, 17584670, 9982578, 27540940, 34029024, 19619948, -28075128, -13136694, -52896280, -13446469, +-15277199, 17580374, -61750892, -11790222, -36678484, -3250217, 37033356, 33914136, 22448720, 7847442, +49826988, 54377508, 48583060, -16714402, -21659520, 18355080, 47561932, 87650616, 6463926, 20468204, +10823318, -4767414, 16341814, -15884400, 9689446, -4185446, -102542, -10266046, 16580184, 18954228, +-6512244, -15817828, -11809013, 14336601, 6507949, 16267189, -8835285, 6255083, -3115462, -7334194, +-4544076, 16151761, 32224066, 15247671, -16520055, 8375186, -5625871, 11400454, 5273683, 5588290, +15827491, -10210211, -21001854, 1657857, 16378321, 12642773, 4506495, -3257733, -7149510, -29131690, +28651190, 7871065, -6589017, -30285426, -6928856, -20841866, 10472204, -10135049, 7466264, 57370564, +-33879240, 21373368, 26214332, -12205223, 2467459, 9884330, -3114925, 27758910, 1516124, 20060718, +-25731686, -3781182, 22526030, 3565897, -34950832, 22541062, -13916231, -11539503, -13305809, -3615826, +-12979391, 13141526, 18622442, 8896488, -3182034, -9890773, 16158741, -5394479, -25676926, 20924006, +-43389908, -11089606, -8901857, -9692131, 24823300, 26980448, 48690972, -14419816, 20847234, -920197, +9411884, 31751082, -2302103, 3262028, -21250962, -67168456, 33202782, 6243809, -32341104, -22322556, +3287798, 17373680, -3074660, -19138374, 9859634, -19621022, 25617870, 14136885, -11158862, -23506356, +46427524, 4955319, 2467996, -4410395, 6438693, 3126199, 2026151, -15763604, -32995012, 8968965, +-4833986, -11898670, -30411590, -7637526, -905164, 26963804, 11180337, -34328064, 19913616, 3393024, +-1308354, -3949759, 11101954, 14079977, -2834142, -6546604, -2438468, -6205154, 5243082, 8301098, +-392453, 4691178, 9478993, -3669513, 13692893, 5667746, 4189204, 7042673, -3888019, 17009144, +2873333, -3802657, 11184632, -13724031, 4334696, 7634305, -3243774, -5965173, 15436112, 22123914, +-19987168, -3862249, -7067906, -7005629, 7931731, 6739878, -12575664, 6773701, 5531381, 4803921, +5789616, -11421392, 7997229, -1029182, 4694936, -3716757, 3206193, 63839856, 32560148, 64239288, +-59319404, 5129265, 30833570, -11959873, 35119948, 67781024, 37195492, 2161442, -18263812, -18833432, +3513820, 29375966, 31457414, 7147363, -78920, -46780784, -9642202, 46133856, 15262703, -12868259, +25479356, -21677236, -30323006, -8329552, -2024540, 35668628, 46585900, 41851236, 15857556, -16225313, +-24941948, -46271832, -46010376, 40074728, 16806744, 3284039, 61892628, 3749507, -18951544, -25327960, +-25733834, 12517682, 26443040, 21044802, 40598716, 2882997, 29212756, -1915555, -5250598, 14798847, +27047556, 19786378, 17188996, -15428059, -5844377, -12168716, -27435178, -21980568, -39983460, -13383118, +10719701, -6564321, 29088740, 34969088, -569620, 331786, -14317273, -25561498, 5273683, 33790120, +-1946694, 18702972, 8203388, -2452963, -10584947, -4866735, 3092913, 11798812, 9199283, -9029095, +-18913962, -23381266, -21939766, -8500277, 8915815, -2281702, -13786308, -7052873, -9564892, -8085813, +4529580, -1219234, 12958453, 18538690, 4167729, -22535156, -11579769, -13498545, -3058017, 15210627, +3679713, 3745212, -18423262, -17454210, -19886236, -10210748, 17382270, 11839614, 15007689, 8062191, +-7240241, -8974871, 6381248, 5761699, -1534377, 3908420, -7587597, -6115497, 4542465, 3183108, +6285148, -3657702, -7537131, -3480534, -5768678, -1090385, -33910916, -66134444, 26095148, 107843408, +109653200, 92815320, 67252744, -41511932, -47341276, -51159504, -68038184, -104120208, -83875880, -72855528, +33817500, 78255912, 58200564, 125858112, 97275640, 50713900, -18721762, -33934536, -84619984, -66070556, +-65416648, -13388487, -40088152, -32566052, 9695889, 17690970, 35639640, 35762584, 49079128, 48673792, +62807992, 36617280, 16100759, -9165460, -10624138, -27668180, -41843720, -50535660, -61763240, -40470940, +-75856104, -50557672, -37941740, 37927784, 71951440, 77581072, 53672060, 36550172, 57283052, 43812424, +54974508, 43184824, 15129022, -20452634, -96331288, -68146632, -69452304, -107778984, -67620504, -58540404, +-56804164, 20594906, 57084948, 90651728, 74645992, 106577464, 95655368, 93523448, 66672388, -36457828, +-32996086, -74947176, -99089192, -109189880, -89558120, -43022688, -12247099, -22676890, 29482266, 78036336, +55006720, 37131604, 62583044, 52578452, 18759344, -12465069, -12555800, -4138738, -15393163, -42106248, +-26477400, -30112016, -16299401, -13556527, -31383326, -11688753, 10714870, -10591389, 34605088, 45687176, +50202264, 53104048, 3228742, 15780247, 15439334, -4645007, -72967736, -58252640, -45535780, -40685152, +-32058172, -30416958, 33442226, 49999324, 54350664, 52010980, 42861628, 29352880, 26404386, -529355, +-7988639, -42276972, -57024280, -51077900, -42633456, -27248346, -17794586, 1903207, 25476672, 51852068, +38766376, 24608016, 17751100, 4735739, -548682, -166430, -10603201, -13758928, -11458436, -13467407, +2892124, -5226975, -18506478, 2125472, 8365523, -3543885, -4925254, -4093104, 1682017, 3077344, +-4189204, 799938, 4656282, 1343251, 504659, 18254, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -3324305, -3346317, 2889976, 6421513, -8774618, 1864016, 5806796, 10568304, -1130650, 5942088, -237834, -5392332, 1321776, 8284992, -155693, -2724620, 5610838, 7937637, 7559680, 4425427, 1229971, --3105261, -2411624, 716186, 3863860, -1990181, 1802813, 441308, 4391067, -2152852, -108985, -1056562, -5212480, -3074123, -1523103, -5494337, 1320703, -1579474, -31675, -782221, -4527433, -3495567, 5431523, -1161789, 450972, 455803, -848793, 5704254, -6957310, -66035, 2902861, -727460, 938450, -1722282, -5759015, -1524177, 2264522, 2608119, 2971581, -574989, 120259, --12885, 1189706, -1033477, 6068252, 115964, -512712, -4019016, 556198, -2894808, -2169495, -2330557, 2620467, 6179384, 241055, 6074158, 717796, 605590, 433792, -3300146, 221728, --1212791, -1626719, 602369, 1984275, -1300301, 814433, -1343788, 1580011, -1688996, -482110, --898722, 923955, -583579, 864362, -791348, 1014686, 1678795, 892279, -917512, -205622, --504122, -401579, 432181, 395674, 6939594, 11257109, 1504312, 5604396, -2035815, 3329137, -4342749, -1335735, -3485903, 5902896, 10177462, -1995549, 1127966, 3939022, -4875862, 3034931, -4343823, -8898635, 2501282, 870268, -2004139, 2147, -9269076, 378494, 2594160, -4404489, -813359, 156766, 5934571, 4241817, -2230699, -632971, -565862, -6308233, -4244502, 695248, -2546916, 571768, 2829847, -4167192, 627602, 2083059, 428423, -3857954, -2827699, -854162, -1341104, 3123515, 3227668, 2155537, 3768297, 3691525, -4144107, -1266479, 165893, 5246840, --800475, 3765076, -2477659, -2560874, -795106, -4712653, -2177549, 967441, 2748779, -4022237, -3936338, -1112933, -1177895, -784905, -1597191, -2033667, 812286, 3064459, 1140314, 5114769, --7095823, -5717675, -1261647, 2120640, -77846, -1165010, 1082332, 160524, 1313186, 2159295, -3612604, 66035, -215285, 857383, -337692, -51003, 555125, -1649804, -889058, -3424163, -1351304, 6541772, 9217000, 5365488, -2332704, 3974455, -2429878, -1613297, -7904888, -6270653, -2834142, 6054830, 5900748, 6172405, 1364189, 344134, 3806415, -5076652, 5108864, 4157528, -373125, 3572876, 9138080, 6234145, 1734630, -6562173, 181999, 2221035, 1409286, 1095754, --7211250, 1735704, 1316408, 4831302, 5311801, -1661079, 3408057, -2580202, -2885144, 3884798, -2188823, -6884296, -6534256, -2848637, -3675955, -2719251, -2922188, -7955353, -7217693, -643708, -2592013, -37581, -770947, -5358509, 704912, 6378027, -1797981, -2004676, 2389076, -5369, -4596689, 2323041, 2343442, -2965138, -3679713, 6847252, 3118683, -2731599, 4495220, -593779, -3501472, -2965138, 541703, 5055714, -1930051, -1631014, 3628711, 451508, 1437740, 2172717, --2525441, 2837363, -1194001, 2325188, 2323577, 1811939, -1625645, 594853, -817654, -1366337, --1768990, 101469, 193274, 1144609, 963146, 268435, -106837, 898722, 261993, 625992, --12756590, -7500624, -2357400, 2422362, -5263483, 1607928, -1446867, 3673808, -899796, -7135015, --5687074, 4942971, 4032974, 10218801, 9011915, -1368484, 6517076, -9818832, -1608465, 7635915, -2289755, 1772211, -1017370, -3207804, -1507534, 1056025, -887985, -298500, 3852049, -4816269, -1061931, 1748589, -128312, 3038153, -3322694, -2714956, 1735704, -2112587, 2704219, -5385889, -878858, -3237332, -1286343, -3605625, -2710124, -4095788, -6081674, 3713536, -54761, 6334540, --5945846, -5083631, -58519, 1207423, -713501, -1226750, 401579, 3811247, 1811403, 813359, --2626909, -2526515, -1446330, -4746476, 733903, -1238024, 535797, -234613, -5119064, -440234, --425202, -5412196, 127775, -1031866, 605590, -924492, -6034966, 528818, 2679523, -1209570, -3949223, 1083406, -2148558, 1657857, 4144107, 1355599, 694711, 926639, -908386, 500901, -3235721, -272730, -543313, 1182190, 1313723, 499290, 1053878, 212601, 426276, -2201708, -214748, -194884, -1097364, -806380, -816044, -1134945, 141734, -936840, 4430796, -6810745, -2770254, -7617125, -1333587, 414464, -5653788, 5357435, 4054986, -11330124, -1152662, 1947231, --1053341, -4938139, -6669548, 1409286, -3359201, -5513665, -2740189, 3321084, 2911988, 8093866, -10481331, -880468, 9365176, -5717139, 3679176, 4112968, -840740, 4051228, -2314451, 117038, --621160, -1901060, -1013075, -2132451, 7795903, -409096, -5833103, -1362042, 3896609, 2458869, -3112241, 651761, -2736431, 5733245, 11608223, 752156, 1154809, 708133, -883690, 1867237, --800475, 6668474, -5099737, 6379100, 4383551, -4013110, 2048163, 4161823, 2810519, -4816269, --5264556, -10335302, -1717987, -958315, 1289027, 4023311, -1000191, 2625836, -907312, -2734284, --2769717, 5365488, -1248225, 5689221, -8398272, -3287798, 1895154, -5293547, 1350767, 5720360, -512175, -27917, 389231, 1229971, 753767, -3204046, -1060857, -512712, 436476, -560493, -1014686, 1474248, 721555, -921807, -2195802, 2375654, 877784, 929860, 582505, 695785, -134755, 67646, -1082332, 993748, 425739, 391916, 130997, 1042066, 652835, 1247151, --1485522, -874563, -1737314, -1570884, -464393, 1247151, -1035087, 117038, 3010235, 1332514, -153008, 4044786, 11738682, 13835700, -3592203, -321586, 2917357, -2094870, 8964134, 8744017, --5505611, 8571144, 6741488, 2592550, 3910568, 3490198, 1788317, -757525, 625992, 1145683, --4729833, -5796059, 1520418, -1627793, -70867, 993211, -5116380, 5155035, 10367514, -332860, --6220187, 10126996, 1232119, 300111, 3978750, -1792075, -3041374, 1462436, -3814468, 1508070, -10349261, 4420595, -78920, 3685082, 5622649, 14593225, -2393908, 6286222, -1259499, -6371047, -4168803, 358093, -2119030, 2851858, 8950712, 2275796, 1584306, -156766, 3579318, 12905840, -5790153, 1588064, 1302986, 3374234, -3739306, 6584722, -1716913, -12834436, 1549410, -1408749, -7701950, 9046275, 3919158, -3923453, -3541201, -3354370, -468688, 2783139, 252329, 1868311, -1290638, 1958505, 5777805, 2456721, -4610648, -2046552, 620086, 1547262, 277562, -171799, -154082, -2581275, 2648921, 567473, 520228, 226023, 518617, 180389, 1974074, -882616, -1431298, -1526861, -455803, -2371359, 434865, -958315, -155156, 773094, -15583752, -1796907, --6591164, -7866233, -2035815, -5622112, 304406, 4756677, -7298223, 7558069, -16190416, 2263448, --4765266, -8690866, -11567958, 12070469, 6088116, 735513, -10245108, -6771553, 3881577, -13401909, --9298067, 3125663, 2878165, 13521631, -1719061, 1085016, 10094247, -6023692, 9916543, 3343095, -3661460, -1968706, -5902896, -739808, 8266202, -4478041, 744103, 10284299, -3724811, -3085934, --4952098, -6174016, -5257577, -4015258, -8294119, -1058173, 2551748, -2893734, 1880659, -2768107, --4221953, 5769215, -7399155, 4493073, -6282464, -8010114, 433255, 6534793, 474594, -2005213, -2652142, -5350456, -2636573, -7483981, -13248363, -6306086, 1938641, -4053376, 15234249, 6019934, --10553272, -5363878, -1525250, -3841312, 4924180, 10280541, 6813966, -5000416, 4813048, -5925445, -3604551, 521839, 4825396, -5245229, -1192927, 456340, -2256469, -4472135, -3688840, 690416, --195958, -1040993, 2393908, 899259, 414464, -1475858, 1452773, -286152, -1098975, -3243237, --22012, -1660542, 336081, 1459215, -1018444, -3599183, -367220, -1517197, 16913044, 11003169, -11574400, -3393024, -16451872, -1330903, -8431558, 2089502, 3640522, 8825084, -4163434, 3855270, --6772090, 1127966, -5974837, -15316390, -8260296, 5823439, -5594195, -12142946, -11408507, -10619307, --16559783, 2032056, -5810017, -12619688, -11347304, 1962800, 15914464, -2156074, -2673080, -5352603, --9673877, 1967632, -3858491, 1031866, -12064026, 743566, -12565464, 1726577, -1033477, 6719477, -5214627, 5588826, 2874944, -500901, 4651450, -3105798, 9160628, 2554432, 4633733, 2759517, --3005940, 3241090, 9232569, -1230508, 5155572, -1335735, 14525043, 1847910, 5456219, 687732, --8148090, -6256157, 286689, -2909840, 1879048, -2129767, 4816269, 4272419, 5599027, -2593624, -3195993, -11165841, 5936719, 16276852, -7852811, -1672890, 4338991, -9401147, -633508, 5854578, --3674345, -598074, -1938104, 5092221, -5228049, -1261647, 1433982, -2938831, 1434519, -1026497, -2171106, -2718714, -2687039, 3000572, -1338956, -2984466, 2123861, -1182190, 83752, -4211216, -3235721, 1072668, -675921, -700080, 1854352, 649077, 1799054, 1293322, 341450, -1802813, --3153580, -927176, -8148090, -23716272, -3899294, -8296803, -12445205, 6684043, -23773718, -3117073, --8443369, -4640712, 6891812, -7607461, 10084583, 8645769, 1402307, 7792682, 712428, 4103841, --6184216, -10980084, -12034498, -6777459, -11027865, 8575976, 11299522, -520228, -5927055, 3221762, -3269544, -4190278, 846109, -18855980, -9936944, 8715026, -4782446, 216896, 8603356, -853625, -5327907, 4507568, -2435247, 5163088, -47245, -10071161, 11183021, -7891466, 551903, 577136, --6149320, 4065187, 6672769, -3966939, 7621957, 817118, -580894, -6994354, 8608725, -85899, --6951405, -2343979, -13938779, -5889474, -7952669, -1044214, 9605694, 2733747, -900333, 124554, --9016747, 1996623, 6956237, -9141838, 535797, 13914083, -5729487, 1336272, 1069447, -9947144, --5952825, 6313602, 5326833, -16164646, 3263102, 12036109, -47782, 1410897, 84289, 2879776, --908386, 7588671, -1731409, -343061, 988379, 1436667, -3441880, 850404, 2696166, 802085, -4540318, 1639067, -83215, -1686312, -3551938, -1053878, 1708323, -2230699, 1616518, -2286533, --50466, 3115462, 1699733, -2231236, -2983392, 136902, 118112, 6656126, -2676302, 528818, -3671123, 1459752, 3586835, 42191612, 9388799, -5535139, -8465381, -829466, -2677375, 7467875, --1666984, 6309844, 11965242, -4841502, 601832, -7935489, -5422396, 2527588, -1306744, 6130529, --11828877, -6953015, 5583458, 11833172, 7826504, -391379, 2808909, -2930242, -7123204, 5123359, -9266929, 9690520, 11727945, -9741523, -2300492, -5601174, -12046310, -1553168, 626528, -2671470, -5538361, 7273527, -15569, 3572876, -2160369, -12834436, -6964827, -17154636, -17370458, -5106179, -5822902, -2576444, -7691213, 14524506, 5511517, -630823, -13650480, -662499, -4200478, -9804873, -128849, -4507568, -6320045, -13563507, -1725503, -5036386, -14859513, -44560, 11385958, -7684770, --3613678, 4159676, -6382859, 2502355, -6323266, 9222369, -2950106, -8995809, -13881871, -22871238, -4530654, 3815542, 17471390, 6980933, 6069863, -127238, 5326833, -4150012, 5645198, -561567, -2014340, 2750390, 6694244, 3004330, 310311, -1262184, -287226, 2593624, 1693291, 6873559, -5476620, 3587372, 1232656, -1452236, -3602404, 1952600, 4542465, 357019, 345208, -885837, --3173444, -601832, -415538, -1595044, -1085553, -2541547, 2151242, 3008625, -2787434, -2956548, --87510, -425202, 1678795, 9491878, -33430952, -19048716, 17723182, -4604742, 1139777, -9182640, -7733089, -3167539, -12898324, 6202470, 17916992, 2303713, -15675020, 4428648, -3411815, -3580392, -10317048, 10704132, -1440962, -2169495, 22561464, 5048734, -3241090, -13856638, 6142877, -19876034, --16361678, -15073725, 6123013, -2844342, -1613297, 12970264, 5173825, -13156022, -10997801, 2873870, -12805982, 4392678, -1457068, 737661, 8540006, -6157910, -13899588, 18154290, -5327370, 1893007, -7331509, 1141388, 2519535, 18669150, 329639, 11895449, 542777, -12495670, 1815697, 2679523, --2586107, 2391760, 8497593, -6316287, -1915019, 2177549, -24712704, 6562173, 5058398, -138513, -5935108, 4625680, -9168145, 4349728, 33949568, 14594299, 8389145, 2462090, 8246874, -26099980, --12371116, 13208098, 529355, -121870, -10014253, 8825621, 10684268, 8944806, 1490891, 1873143, --3584687, 141197, -6211060, -2259690, 4900558, -1109712, -3133716, 2543695, 197032, 2440078, --3624953, -1541356, 1210644, -667867, 2468533, -4340065, -1504849, 3074123, -3465502, 2483028, -894964, 308164, 83752, 15032, -2814814, 1383516, 2571612, -1316408, -1319629, -3020973, -1297617, -205085, -22415972, 15753940, 16830366, 5448703, 9277666, -6209449, 26872536, -3142306, -10241350, 7035157, -12416750, -5064840, -5738077, 15647103, -9306120, -2866891, 9826348, 8304856, --9147207, -2449205, -26415660, 4966056, -2944200, -7720204, 2268817, 746251, 1932198, 2459943, -8921184, 398358, 9773735, 1198833, 4755066, -2495376, -8523363, -9035537, 17041356, -6042482, --12371116, -10364293, -4732517, -5686537, 7383049, 4626754, 5681705, 7579544, 2244121, -9314710, -5339718, -15212237, -5009006, -13288092, 9148280, -16045998, -11560978, -3378529, -5435281, 4838281, -10798622, -8562017, 10193568, 16848082, 8329552, 16231218, -6812892, 21776558, 1970853, 18454400, -10427644, 2327872, -9839233, -24668682, -16704202, -13536126, -7722351, -7572564, -2434710, -11469173, -8658654, 14479945, -5568425, -11042361, -10111964, -7960722, -15040439, 9499931, 6838662, -3962107, --3882114, -5805722, 765041, -3275986, 8095477, 53150, 2072322, -4288525, -3710852, -6059125, --1125281, -7263864, -7006703, 7209103, -507880, 906238, 177167, 2661269, -2865280, -242666, --4304094, 172872, 25233, -160524, 2216203, 262530, -3522410, -2287070, -2527588, 734439, --3784940, -4095788, -5204964, 1433982, 12482249, 6362994, -7102266, 21017422, 2376728, -20511690, -25618406, 1719598, -10910291, 9044127, -21038360, -4024921, -13393856, -4179540, -2369748, -4107063, --9572945, 2687039, -18175228, -7027104, -6550899, -24526410, 2984466, -17785460, -12640626, -19953882, -4010426, -15053860, -4540318, -4984310, 169651, 7597261, -6113886, 10692858, 560493, 14187351, --3294777, 12341052, 15551540, -18648212, -270046, 5011153, 11419781, 452582, 13729937, 4602058, -13239237, -270046, -10096931, -6347425, -960999, 8568997, -1959042, -3929895, -847182, 15862925, -10022306, -3761318, -13054553, 4388383, 7191923, 5113159, 14071923, -18821084, -13915694, -3970697, -1341104, -5293011, 165893, -5397164, -11758547, 33042794, -16301548, -18927384, 14150843, 8150238, -12295954, 3776887, 4531728, 2549600, 7196755, -6776922, 18992882, -3310346, 4672388, -3660386, -2558727, 1146756, -1021129, 12105902, 1534377, 1066763, -11907797, 5408975, 1803886, -1743220, --9693741, -987306, -1989107, 264141, -3073049, 8723079, 2036351, 2443300, -6999723, 4802311, --3315715, 983548, 4223564, -167504, -2055679, -2247342, -6226092, 3640522, 6405944, -3031173, --686658, -2247879, 969589, -3617436, -8388071, -2535105, -263604, -5751498, 5989869, -510027, --794032, 2026688, -5635534, -6391448, 2623688, -4400731, -5602785, 16653736, 12264279, 19691888, --6556268, -4876399, -27045410, 31403190, 14394046, -41827612, -22386444, 13401372, 18618146, 18728742, --12031277, -9767293, 22662394, 5373541, 5201206, 15709917, 12700218, -23130010, 7087233, 9743670, --1731946, 10911901, 2099165, -2975339, 2261837, -7534983, 38612292, 10104984, 5029944, -1067299, --4774930, -2602213, -21901648, 4192425, 6437082, -5164698, -7180649, -35464080, -16939352, 7412577, -6182606, -11646341, -11381663, -1617592, -16879758, 6971269, 6267431, -2469606, 7051263, 13966697, -702764, -742493, -4477504, -7487739, -2441152, 1238024, -26132192, -3496640, 6140193, 15916612, --28283434, 6264747, 10139881, -2244657, -13314935, -12041478, 21358872, 21089900, -3087008, -13200582, --25006374, 5244692, 10030896, 5228586, 417149, -27287000, 11503533, 24794310, -8400956, 2778844, -7798050, -10235444, -16289200, -8638790, 2486249, -5080947, -1293322, -7707856, -6616934, -5638755, --2376728, -2239826, 3317862, -628676, -496606, -7030325, 2886218, -3322157, 1504849, 16106, -2263448, 4203163, 4944044, -7854422, 3140695, -6080600, -10166188, -5383742, 1460289, -1072668, -4443681, -1032403, 2894271, 5956046, 301721, -325881, -5270462, -2991982, 7950522, 3981972, --3326452, -2085744, 12441983, -9162776, 3395172, -7635915, -6732898, 1169305, 8434779, 16833588, --31005906, -40464496, -28118078, -36200668, 31436476, -20968568, 12662100, -3545496, -25420838, 4548907, --6891812, -9450539, -33003602, -30245160, -22572738, -8619462, 1193464, -17500382, -5052492, 4622996, -14236206, 1127429, -8825621, 35970, -9438191, 13643500, -17140140, 23721104, 20461224, -4887673, --6480569, -28125594, -16380468, -17103096, 2084133, 3784940, -4557497, 22990960, 6577743, 18638548, -3702262, -2190433, -8424578, 16770774, 11608223, 5269925, -16804596, 9026948, -28439126, -3167539, --2989297, -18888730, -3076270, 249108, 21809308, 14443438, 452582, 10088878, -360777, -21446920, -10976326, 3056943, 17947594, -10116795, -20614770, 12345883, -37077916, -8491687, 13182328, -5548024, --5865852, 9119826, -2374580, -7291781, 6921877, -3066607, -23772644, -20914344, -3417183, 9836549, -15895674, 22328998, 22383222, -9431211, -7541963, 4436165, 8149164, 7345468, 3105261, -9880572, -8781061, 213138, -1788854, 1176821, 5470178, 9111236, -2585034, 1585917, 8628052, -1926830, --105764, -8580808, 4385699, -1818919, -529355, 7195681, -1323387, -3112241, 3274376, -9751723, --3557844, 10072235, 2942590, 3323768, -3449933, -2244121, -1391033, -7745974, -944356, -4272419, -6039261, -16936666, -40449464, -3780645, -25750476, 1571958, -18962818, 17254494, -13540958, -1455457, -3408057, 6429566, 20827908, 6963753, -9412958, 22462678, 7016903, -38289096, 6332930, -22985054, --1603097, 4346507, -3174518, 18862960, -5566815, 3404835, 4816806, 1634772, -12236899, 19142132, --11063836, -1087701, -22388054, -53150, 3842922, -3584150, -7850127, -10327786, -11676942, 29027000, -1204738, 15008763, -25846040, 2876018, -284542, 8838506, 15491410, -17853642, 31659814, 45471356, --2039573, 4333622, -15854335, 7221988, 10635413, -8864276, 2307471, 8498130, 17706540, -657130, -1077500, -5564667, -15335181, -23180476, 11798812, -17411798, -7284265, -11443403, 5046050, 15444702, -13977971, -2872260, 5268315, -31452046, 20735028, -3979287, 4534412, -9330280, 20257750, -28254980, -33574296, 24274082, 27975270, -11441793, -649614, -27713814, -14928769, -10410464, 9074192, 7492571, --22807350, -16913044, 645319, -6002754, -16642461, -257698, -11519639, -13892609, -5119064, -2274722, -1051730, -9273908, 1612223, 2807298, 13817984, 12122545, -1932735, 11406359, -5755793, -14835891, --8075076, -3401614, -7361037, -1411971, -5477694, 7943005, 2476049, 31513786, 4188667, -11283953, --3785477, 2517388, -16654809, -10732586, 3936875, 307090, -4334696, 1289564, -14496, -18547816, --1931662, 11759620, -8990977, 50797116, 14543296, 36935108, 11821897, -38556460, 15507516, 10678899, --12800076, 2581275, 24916180, 1061394, 23849416, 21053392, -24706262, 13572097, -24716464, -16770774, --2314987, 49706192, 15328201, -22518514, 21242372, 13600014, -27356794, -12149389, -1838783, 27788438, -4149475, -25546466, -14297409, -863288, -6942278, 15394773, 22345642, -8135742, 19659676, -12709345, --17064978, -661425, 40460740, 3688840, -23167054, 13131326, -1046898, -2382096, 11358578, -26417270, --22718766, -21690658, 15887621, -14231911, 5157719, 6665789, 24215026, 11879343, 24893630, 2570538, --1021129, 20182588, 37248104, 22028350, -36734320, 685047, 3634079, -6311455, 7157026, 10125385, --28351080, -4365835, 5690832, 4837744, -33776696, -32161252, -17918066, -19577534, 33670396, 12338904, -1630477, 14731201, -27341762, 11220602, 7667591, 4912369, -2346663, -6378564, 23295366, 13844290, --9205189, 3856344, -6919193, 15037217, -4283693, 942208, 3273302, 2120640, 11389180, -1921998, --18252000, -909459, 3539590, 4670240, 9540196, -2709588, 949188, 6908992, -14116484, -8591545, --1210644, -26045756, -3855270, 6995428, -1798518, 2619930, 14930917, -2307471, -10205379, 2007897, -3716757, 9413495, 11613055, -11294690, -6705518, -964757, -9278203, -6369974, -17904108, -21727702, -6105296, 82678, -9534827, -8381629, -9730248, -19330574, 14476187, -38626788, 27954332, 31219044, -8655433, 33997352, -34842924, -17059074, -9424232, -50085224, 28221156, 2811593, 17473538, 22952842, -22468584, 1716913, -696322, 22816476, -3604015, -27134530, -28142236, 17022030, -31798328, 31022548, --8899172, 6783901, 30764850, 27713814, -13948980, 42212548, -24475944, 2710661, -25450902, 4090420, --8693014, 16601659, 5659693, -18090940, 16212428, 24601572, 36191004, -20950314, 7748121, 22181358, --30511984, 1374926, -12258374, -44168368, -18981608, 11747272, -24233816, 8597451, -20343650, -528818, -29726006, -14143327, 12595528, 34203508, 24461450, 9121974, 45536316, -70967352, -13362717, 23635206, --2729989, 13754096, -21962316, -38376068, 46562276, -717796, -23455890, 9998684, 29465624, 73065448, -27689118, -55350316, -30186104, 18786186, 20447266, 8812199, -38626788, -3425237, 8465917, -11996381, -26074746, 9269613, 16641925, 19753628, 14859513, -10208064, 11471321, -30752502, 4404489, 16320876, --1989107, -16358457, 9491878, -10022306, 16251619, 17901424, -7722888, -15073725, -4064650, 33111514, --5975374, -4000762, -13048648, 14905147, -12960064, -8087961, 9558987, -6328098, 31243740, -2524367, --7798050, 31323196, -2864743, 7196218, 19217294, -1628866, -1703491, 1674500, 2803540, -14984067, -6666326, 620086, -21532818, 14392972, -6725382, 27464168, -15079093, 8664560, 2580739, 37442988, --32917704, -2981244, -15734613, -19508278, 30005178, -11678553, 39397200, -3911105, -30403000, 47262356, -68317896, -9756018, -21829172, -33013802, 7836705, 36290864, 7128035, -7660074, -22656490, 5366025, -5332202, -5029407, 5580773, -3249143, -11147588, -11377368, 10439455, 14894410, -1171989, 20138028, --19471234, 41326712, 31128850, 17928268, -1538672, 2418067, 5855114, -21929030, -19192062, -21261162, --11191074, -5862094, 13209172, 11586748, 22399866, -10894721, -2721399, -9664750, 25485262, 49776524, --11815455, -32129040, -20691004, -1378685, -43453256, 33669324, -59005872, 16925930, 24930674, 25577068, --25752624, 5902896, 25959856, -59794536, -28281822, 12147778, -6379100, -30027726, -26471494, -3541201, --13903346, 44267692, 18973554, -16394964, -15033996, -24790014, 67938864, 14469745, 35458176, -2707440, -10303090, 12692165, 15174119, -22420266, -2927557, 28063854, 19388020, 11457899, -9416179, -12322798, --83752, 8593693, 12937515, 8612483, -17641042, 2266669, 86436, 4293894, 12542378, 12414066, --18478024, 8276402, -11432666, -14186814, 1345935, 14058502, 5723581, -8988830, 1854889, -1597728, --2753074, -7771744, 27026618, -8442295, -62814, -16681116, 3672734, -6467147, 17758080, 5313412, --3992709, -10077604, 10020159, 7922067, -12671227, 312459, -20527260, -8594766, 4628364, 7771207, -11290932, -758599, -25681220, 7734699, 39410084, 1304060, -13455059, 33083596, 23506892, -6737193, --21288006, -31996432, 6028524, 63225676, 13766981, 32468342, -2951180, 2930778, -2666638, -7316477, --118112, 3002182, 15167140, 5157719, -12389370, 10612327, -10864120, -11700565, -13492640, 440771, -12524662, 2856690, 9980430, 10976863, 8627516, -8766028, -15822123, 5078799, -11018739, -27027156, --8211441, 6272800, -9647033, 31826782, -32912872, 26757110, -8640937, 317291, 39217884, -6064494, --1286880, 51604568, -8122320, -20834350, 3562675, -17834852, -4304094, -16831976, 57111252, -16100222, -13591424, -13657996, -6426345, -7738994, 9270150, -14310294, -35415228, 15640660, -4301410, -38873212, -20132122, -10094784, 21430276, 49104896, -24826522, -401043, -2806224, -7118909, -26699128, -4475356, -23887534, 9840307, 14540075, -22091164, 6294275, 4093641, -21790516, -5698885, 4476967, 11206107, -13475997, 1294933, 2320356, 9160628, -2469069, -10526428, 15226196, -5972152, -5038534, 14313515, -1584306, -3736085, 20746302, -1241246, -1937030, 344134, 6540699, -6160057, 10295037, -8046085, --4464619, -6322729, 5185100, -6979, -1130650, 3228742, 9426916, -11468100, 2163053, -1395864, -6658273, 2258616, -2609730, 12181064, -7688529, 6649683, -2441152, 3722126, 459562, 9160628, --13980119, 40265, 65739308, 33405182, 68971272, -38569880, -10020696, 22825604, -21573084, 16539919, -70950176, 16891570, 10260677, -18645526, -17644800, 20414516, -10750840, 28834262, -4720169, -6471979, --8341900, -40686764, 9823127, 49148920, -25905632, 29765198, 25873420, -16495359, -4999342, 20518132, --32588064, 16372952, -2304787, 24693914, 8329016, -20277614, -6564858, -40904732, -21032454, 19338628, -14471892, 31982474, 49737868, 5417028, 793495, -42960948, -26312044, -25612500, -21176874, 11380590, --17568564, -4925254, -4034048, 12998182, -32895154, -5214091, 17035988, 8889509, 27123256, -3536906, --12991739, 27073326, -4890357, 16629040, -20780662, -12451647, -3220152, -6851547, 13226889, 19717122, -27740656, 7923141, 2277943, -19082002, -5405753, -9756555, 23224498, 333934, 34809636, 6128382, -26214332, -25442312, -9165460, -111669, -646393, 19059454, -3044595, -9381282, -5163625, 4725001, -1289027, 4995584, 8752070, 7907035, -4857608, -5631239, 326418, -3313031, 7368554, 7954280, -1814087, -6578816, 245887, -8642011, -3682935, -1868848, 14921790, 5395016, -2004139, 3926137, --10071698, -11809013, -8062191, 3770445, 8157217, -7031935, -759672, 138513, 6062347, 3417720, --1004486, 6538551, 953483, -329639, -6519761, 3097745, 1813550, -2632815, -18079664, -67524936, -1752347, 108659992, 97988608, 92165168, 39050916, -39142184, -54268524, -53801444, -48118668, -88320096, --63079648, -61475476, 47531328, 73056856, 59576028, 95081984, 79076792, 16786880, -3704946, -34017752, --66315904, -39555040, -69683160, -37821484, -23352810, 384400, -9350681, 17483738, 29851634, 50814832, -31916976, 53389664, 40582608, 42422464, 3244311, -34907348, -15963857, 1229434, -38211788, -50378892, --65593816, -64403572, -45761264, -6416681, 31907848, 12654047, 46452220, 32930588, 52988084, 47267188, -51376936, 59711320, 32040456, -4565014, -9720585, -38954280, -31981400, -105214352, -84272088, -67448704, --52822728, 6162741, -23112292, 1515050, 71785008, 88787712, 121346248, 76819784, 46072116, 31439160, -7233262, -46508052, -42750492, -64845952, -83967144, -71009232, -66367984, -31074088, 4648765, 33590404, -55068460, 54523000, 46261092, 29273960, 31002684, 13387950, 8255464, -1484448, -25905096, -22432614, --20644298, -22826678, -12303471, -25514254, -18409840, 6337224, 2033130, -14825690, 7912941, 21053930, -11791833, 24020142, 37248640, 38939784, 17005386, -24040006, -10578504, -3348464, -49256832, -51750060, --45331232, -18820010, 13822279, 22193706, 18297098, 31113816, 34957276, 43404404, 28573880, 17772038, --6861747, -29052770, -29781840, -32909114, -44574244, -31455266, -17709760, 15184857, 23820426, 15628312, -9210020, 28147068, 18712636, 11580306, 2381559, -4144107, -9283572, 970663, -11103027, -12775917, --5059472, 4378719, -7834021, -5544803, 814970, 5854578, 321586, -2796561, -4303021, 4425964, --463320, -1953673, -4393752, 1906429, 1319629, 2702071, -1252520, 1613297, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +3346317, 2889976, 6421513, -8774618, 1864016, 5806796, 10568304, -1130650, 5942088, -237834, +5392332, 1321776, 8284992, -155693, -2724620, 5610838, 7937637, 7559680, 4425427, 1229971, +-3105261, -2411624, 716186, 3863860, -1990181, 1802813, 441308, 4391067, -2152852, -108985, +1056562, -5212480, -3074123, -1523103, -5494337, 1320703, -1579474, -31675, -782221, -4527433, +3495567, 5431523, -1161789, 450972, 455803, -848793, 5704254, -6957310, -66035, 2902861, +727460, 938450, -1722282, -5759015, -1524177, 2264522, 2608119, 2971581, -574989, 120259, +-12885, 1189706, -1033477, 6068252, 115964, -512712, -4019016, 556198, -2894808, -2169495, +2330557, 2620467, 6179384, 241055, 6074158, 717796, 605590, 433792, -3300146, 221728, +-1212791, -1626719, 602369, 1984275, -1300301, 814433, -1343788, 1580011, -1688996, -482110, +-898722, 923955, -583579, 864362, -791348, 1014686, 1678795, 892279, -917512, -205622, +-504122, -401579, 432181, 395674, 6939594, 11257109, 1504312, 5604396, -2035815, 3329137, +4342749, -1335735, -3485903, 5902896, 10177462, -1995549, 1127966, 3939022, -4875862, 3034931, +4343823, -8898635, 2501282, 870268, -2004139, 2147, -9269076, 378494, 2594160, -4404489, +813359, 156766, 5934571, 4241817, -2230699, -632971, -565862, -6308233, -4244502, 695248, +2546916, 571768, 2829847, -4167192, 627602, 2083059, 428423, -3857954, -2827699, -854162, +1341104, 3123515, 3227668, 2155537, 3768297, 3691525, -4144107, -1266479, 165893, 5246840, +-800475, 3765076, -2477659, -2560874, -795106, -4712653, -2177549, 967441, 2748779, -4022237, +3936338, -1112933, -1177895, -784905, -1597191, -2033667, 812286, 3064459, 1140314, 5114769, +-7095823, -5717675, -1261647, 2120640, -77846, -1165010, 1082332, 160524, 1313186, 2159295, +3612604, 66035, -215285, 857383, -337692, -51003, 555125, -1649804, -889058, -3424163, +1351304, 6541772, 9217000, 5365488, -2332704, 3974455, -2429878, -1613297, -7904888, -6270653, +2834142, 6054830, 5900748, 6172405, 1364189, 344134, 3806415, -5076652, 5108864, 4157528, +373125, 3572876, 9138080, 6234145, 1734630, -6562173, 181999, 2221035, 1409286, 1095754, +-7211250, 1735704, 1316408, 4831302, 5311801, -1661079, 3408057, -2580202, -2885144, 3884798, +2188823, -6884296, -6534256, -2848637, -3675955, -2719251, -2922188, -7955353, -7217693, -643708, +2592013, -37581, -770947, -5358509, 704912, 6378027, -1797981, -2004676, 2389076, -5369, +4596689, 2323041, 2343442, -2965138, -3679713, 6847252, 3118683, -2731599, 4495220, -593779, +3501472, -2965138, 541703, 5055714, -1930051, -1631014, 3628711, 451508, 1437740, 2172717, +-2525441, 2837363, -1194001, 2325188, 2323577, 1811939, -1625645, 594853, -817654, -1366337, +-1768990, 101469, 193274, 1144609, 963146, 268435, -106837, 898722, 261993, 625992, +-12756590, -7500624, -2357400, 2422362, -5263483, 1607928, -1446867, 3673808, -899796, -7135015, +-5687074, 4942971, 4032974, 10218801, 9011915, -1368484, 6517076, -9818832, -1608465, 7635915, +2289755, 1772211, -1017370, -3207804, -1507534, 1056025, -887985, -298500, 3852049, -4816269, +1061931, 1748589, -128312, 3038153, -3322694, -2714956, 1735704, -2112587, 2704219, -5385889, +878858, -3237332, -1286343, -3605625, -2710124, -4095788, -6081674, 3713536, -54761, 6334540, +-5945846, -5083631, -58519, 1207423, -713501, -1226750, 401579, 3811247, 1811403, 813359, +-2626909, -2526515, -1446330, -4746476, 733903, -1238024, 535797, -234613, -5119064, -440234, +-425202, -5412196, 127775, -1031866, 605590, -924492, -6034966, 528818, 2679523, -1209570, +3949223, 1083406, -2148558, 1657857, 4144107, 1355599, 694711, 926639, -908386, 500901, +3235721, -272730, -543313, 1182190, 1313723, 499290, 1053878, 212601, 426276, -2201708, +214748, -194884, -1097364, -806380, -816044, -1134945, 141734, -936840, 4430796, -6810745, +2770254, -7617125, -1333587, 414464, -5653788, 5357435, 4054986, -11330124, -1152662, 1947231, +-1053341, -4938139, -6669548, 1409286, -3359201, -5513665, -2740189, 3321084, 2911988, 8093866, +10481331, -880468, 9365176, -5717139, 3679176, 4112968, -840740, 4051228, -2314451, 117038, +-621160, -1901060, -1013075, -2132451, 7795903, -409096, -5833103, -1362042, 3896609, 2458869, +3112241, 651761, -2736431, 5733245, 11608223, 752156, 1154809, 708133, -883690, 1867237, +-800475, 6668474, -5099737, 6379100, 4383551, -4013110, 2048163, 4161823, 2810519, -4816269, +-5264556, -10335302, -1717987, -958315, 1289027, 4023311, -1000191, 2625836, -907312, -2734284, +-2769717, 5365488, -1248225, 5689221, -8398272, -3287798, 1895154, -5293547, 1350767, 5720360, +512175, -27917, 389231, 1229971, 753767, -3204046, -1060857, -512712, 436476, -560493, +1014686, 1474248, 721555, -921807, -2195802, 2375654, 877784, 929860, 582505, 695785, +134755, 67646, -1082332, 993748, 425739, 391916, 130997, 1042066, 652835, 1247151, +-1485522, -874563, -1737314, -1570884, -464393, 1247151, -1035087, 117038, 3010235, 1332514, +153008, 4044786, 11738682, 13835700, -3592203, -321586, 2917357, -2094870, 8964134, 8744017, +-5505611, 8571144, 6741488, 2592550, 3910568, 3490198, 1788317, -757525, 625992, 1145683, +-4729833, -5796059, 1520418, -1627793, -70867, 993211, -5116380, 5155035, 10367514, -332860, +-6220187, 10126996, 1232119, 300111, 3978750, -1792075, -3041374, 1462436, -3814468, 1508070, +10349261, 4420595, -78920, 3685082, 5622649, 14593225, -2393908, 6286222, -1259499, -6371047, +4168803, 358093, -2119030, 2851858, 8950712, 2275796, 1584306, -156766, 3579318, 12905840, +5790153, 1588064, 1302986, 3374234, -3739306, 6584722, -1716913, -12834436, 1549410, -1408749, +7701950, 9046275, 3919158, -3923453, -3541201, -3354370, -468688, 2783139, 252329, 1868311, +1290638, 1958505, 5777805, 2456721, -4610648, -2046552, 620086, 1547262, 277562, -171799, +154082, -2581275, 2648921, 567473, 520228, 226023, 518617, 180389, 1974074, -882616, +1431298, -1526861, -455803, -2371359, 434865, -958315, -155156, 773094, -15583752, -1796907, +-6591164, -7866233, -2035815, -5622112, 304406, 4756677, -7298223, 7558069, -16190416, 2263448, +-4765266, -8690866, -11567958, 12070469, 6088116, 735513, -10245108, -6771553, 3881577, -13401909, +-9298067, 3125663, 2878165, 13521631, -1719061, 1085016, 10094247, -6023692, 9916543, 3343095, +3661460, -1968706, -5902896, -739808, 8266202, -4478041, 744103, 10284299, -3724811, -3085934, +-4952098, -6174016, -5257577, -4015258, -8294119, -1058173, 2551748, -2893734, 1880659, -2768107, +-4221953, 5769215, -7399155, 4493073, -6282464, -8010114, 433255, 6534793, 474594, -2005213, +2652142, -5350456, -2636573, -7483981, -13248363, -6306086, 1938641, -4053376, 15234249, 6019934, +-10553272, -5363878, -1525250, -3841312, 4924180, 10280541, 6813966, -5000416, 4813048, -5925445, +3604551, 521839, 4825396, -5245229, -1192927, 456340, -2256469, -4472135, -3688840, 690416, +-195958, -1040993, 2393908, 899259, 414464, -1475858, 1452773, -286152, -1098975, -3243237, +-22012, -1660542, 336081, 1459215, -1018444, -3599183, -367220, -1517197, 16913044, 11003169, +11574400, -3393024, -16451872, -1330903, -8431558, 2089502, 3640522, 8825084, -4163434, 3855270, +-6772090, 1127966, -5974837, -15316390, -8260296, 5823439, -5594195, -12142946, -11408507, -10619307, +-16559783, 2032056, -5810017, -12619688, -11347304, 1962800, 15914464, -2156074, -2673080, -5352603, +-9673877, 1967632, -3858491, 1031866, -12064026, 743566, -12565464, 1726577, -1033477, 6719477, +5214627, 5588826, 2874944, -500901, 4651450, -3105798, 9160628, 2554432, 4633733, 2759517, +-3005940, 3241090, 9232569, -1230508, 5155572, -1335735, 14525043, 1847910, 5456219, 687732, +-8148090, -6256157, 286689, -2909840, 1879048, -2129767, 4816269, 4272419, 5599027, -2593624, +3195993, -11165841, 5936719, 16276852, -7852811, -1672890, 4338991, -9401147, -633508, 5854578, +-3674345, -598074, -1938104, 5092221, -5228049, -1261647, 1433982, -2938831, 1434519, -1026497, +2171106, -2718714, -2687039, 3000572, -1338956, -2984466, 2123861, -1182190, 83752, -4211216, +3235721, 1072668, -675921, -700080, 1854352, 649077, 1799054, 1293322, 341450, -1802813, +-3153580, -927176, -8148090, -23716272, -3899294, -8296803, -12445205, 6684043, -23773718, -3117073, +-8443369, -4640712, 6891812, -7607461, 10084583, 8645769, 1402307, 7792682, 712428, 4103841, +-6184216, -10980084, -12034498, -6777459, -11027865, 8575976, 11299522, -520228, -5927055, 3221762, +3269544, -4190278, 846109, -18855980, -9936944, 8715026, -4782446, 216896, 8603356, -853625, +5327907, 4507568, -2435247, 5163088, -47245, -10071161, 11183021, -7891466, 551903, 577136, +-6149320, 4065187, 6672769, -3966939, 7621957, 817118, -580894, -6994354, 8608725, -85899, +-6951405, -2343979, -13938779, -5889474, -7952669, -1044214, 9605694, 2733747, -900333, 124554, +-9016747, 1996623, 6956237, -9141838, 535797, 13914083, -5729487, 1336272, 1069447, -9947144, +-5952825, 6313602, 5326833, -16164646, 3263102, 12036109, -47782, 1410897, 84289, 2879776, +-908386, 7588671, -1731409, -343061, 988379, 1436667, -3441880, 850404, 2696166, 802085, +4540318, 1639067, -83215, -1686312, -3551938, -1053878, 1708323, -2230699, 1616518, -2286533, +-50466, 3115462, 1699733, -2231236, -2983392, 136902, 118112, 6656126, -2676302, 528818, +3671123, 1459752, 3586835, 42191612, 9388799, -5535139, -8465381, -829466, -2677375, 7467875, +-1666984, 6309844, 11965242, -4841502, 601832, -7935489, -5422396, 2527588, -1306744, 6130529, +-11828877, -6953015, 5583458, 11833172, 7826504, -391379, 2808909, -2930242, -7123204, 5123359, +9266929, 9690520, 11727945, -9741523, -2300492, -5601174, -12046310, -1553168, 626528, -2671470, +5538361, 7273527, -15569, 3572876, -2160369, -12834436, -6964827, -17154636, -17370458, -5106179, +5822902, -2576444, -7691213, 14524506, 5511517, -630823, -13650480, -662499, -4200478, -9804873, +128849, -4507568, -6320045, -13563507, -1725503, -5036386, -14859513, -44560, 11385958, -7684770, +-3613678, 4159676, -6382859, 2502355, -6323266, 9222369, -2950106, -8995809, -13881871, -22871238, +4530654, 3815542, 17471390, 6980933, 6069863, -127238, 5326833, -4150012, 5645198, -561567, +2014340, 2750390, 6694244, 3004330, 310311, -1262184, -287226, 2593624, 1693291, 6873559, +5476620, 3587372, 1232656, -1452236, -3602404, 1952600, 4542465, 357019, 345208, -885837, +-3173444, -601832, -415538, -1595044, -1085553, -2541547, 2151242, 3008625, -2787434, -2956548, +-87510, -425202, 1678795, 9491878, -33430952, -19048716, 17723182, -4604742, 1139777, -9182640, +7733089, -3167539, -12898324, 6202470, 17916992, 2303713, -15675020, 4428648, -3411815, -3580392, +10317048, 10704132, -1440962, -2169495, 22561464, 5048734, -3241090, -13856638, 6142877, -19876034, +-16361678, -15073725, 6123013, -2844342, -1613297, 12970264, 5173825, -13156022, -10997801, 2873870, +12805982, 4392678, -1457068, 737661, 8540006, -6157910, -13899588, 18154290, -5327370, 1893007, +7331509, 1141388, 2519535, 18669150, 329639, 11895449, 542777, -12495670, 1815697, 2679523, +-2586107, 2391760, 8497593, -6316287, -1915019, 2177549, -24712704, 6562173, 5058398, -138513, +5935108, 4625680, -9168145, 4349728, 33949568, 14594299, 8389145, 2462090, 8246874, -26099980, +-12371116, 13208098, 529355, -121870, -10014253, 8825621, 10684268, 8944806, 1490891, 1873143, +-3584687, 141197, -6211060, -2259690, 4900558, -1109712, -3133716, 2543695, 197032, 2440078, +-3624953, -1541356, 1210644, -667867, 2468533, -4340065, -1504849, 3074123, -3465502, 2483028, +894964, 308164, 83752, 15032, -2814814, 1383516, 2571612, -1316408, -1319629, -3020973, +1297617, -205085, -22415972, 15753940, 16830366, 5448703, 9277666, -6209449, 26872536, -3142306, +10241350, 7035157, -12416750, -5064840, -5738077, 15647103, -9306120, -2866891, 9826348, 8304856, +-9147207, -2449205, -26415660, 4966056, -2944200, -7720204, 2268817, 746251, 1932198, 2459943, +8921184, 398358, 9773735, 1198833, 4755066, -2495376, -8523363, -9035537, 17041356, -6042482, +-12371116, -10364293, -4732517, -5686537, 7383049, 4626754, 5681705, 7579544, 2244121, -9314710, +5339718, -15212237, -5009006, -13288092, 9148280, -16045998, -11560978, -3378529, -5435281, 4838281, +10798622, -8562017, 10193568, 16848082, 8329552, 16231218, -6812892, 21776558, 1970853, 18454400, +10427644, 2327872, -9839233, -24668682, -16704202, -13536126, -7722351, -7572564, -2434710, -11469173, +8658654, 14479945, -5568425, -11042361, -10111964, -7960722, -15040439, 9499931, 6838662, -3962107, +-3882114, -5805722, 765041, -3275986, 8095477, 53150, 2072322, -4288525, -3710852, -6059125, +-1125281, -7263864, -7006703, 7209103, -507880, 906238, 177167, 2661269, -2865280, -242666, +-4304094, 172872, 25233, -160524, 2216203, 262530, -3522410, -2287070, -2527588, 734439, +-3784940, -4095788, -5204964, 1433982, 12482249, 6362994, -7102266, 21017422, 2376728, -20511690, +25618406, 1719598, -10910291, 9044127, -21038360, -4024921, -13393856, -4179540, -2369748, -4107063, +-9572945, 2687039, -18175228, -7027104, -6550899, -24526410, 2984466, -17785460, -12640626, -19953882, +4010426, -15053860, -4540318, -4984310, 169651, 7597261, -6113886, 10692858, 560493, 14187351, +-3294777, 12341052, 15551540, -18648212, -270046, 5011153, 11419781, 452582, 13729937, 4602058, +13239237, -270046, -10096931, -6347425, -960999, 8568997, -1959042, -3929895, -847182, 15862925, +10022306, -3761318, -13054553, 4388383, 7191923, 5113159, 14071923, -18821084, -13915694, -3970697, +1341104, -5293011, 165893, -5397164, -11758547, 33042794, -16301548, -18927384, 14150843, 8150238, +12295954, 3776887, 4531728, 2549600, 7196755, -6776922, 18992882, -3310346, 4672388, -3660386, +2558727, 1146756, -1021129, 12105902, 1534377, 1066763, -11907797, 5408975, 1803886, -1743220, +-9693741, -987306, -1989107, 264141, -3073049, 8723079, 2036351, 2443300, -6999723, 4802311, +-3315715, 983548, 4223564, -167504, -2055679, -2247342, -6226092, 3640522, 6405944, -3031173, +-686658, -2247879, 969589, -3617436, -8388071, -2535105, -263604, -5751498, 5989869, -510027, +-794032, 2026688, -5635534, -6391448, 2623688, -4400731, -5602785, 16653736, 12264279, 19691888, +-6556268, -4876399, -27045410, 31403190, 14394046, -41827612, -22386444, 13401372, 18618146, 18728742, +-12031277, -9767293, 22662394, 5373541, 5201206, 15709917, 12700218, -23130010, 7087233, 9743670, +-1731946, 10911901, 2099165, -2975339, 2261837, -7534983, 38612292, 10104984, 5029944, -1067299, +-4774930, -2602213, -21901648, 4192425, 6437082, -5164698, -7180649, -35464080, -16939352, 7412577, +6182606, -11646341, -11381663, -1617592, -16879758, 6971269, 6267431, -2469606, 7051263, 13966697, +702764, -742493, -4477504, -7487739, -2441152, 1238024, -26132192, -3496640, 6140193, 15916612, +-28283434, 6264747, 10139881, -2244657, -13314935, -12041478, 21358872, 21089900, -3087008, -13200582, +-25006374, 5244692, 10030896, 5228586, 417149, -27287000, 11503533, 24794310, -8400956, 2778844, +7798050, -10235444, -16289200, -8638790, 2486249, -5080947, -1293322, -7707856, -6616934, -5638755, +-2376728, -2239826, 3317862, -628676, -496606, -7030325, 2886218, -3322157, 1504849, 16106, +2263448, 4203163, 4944044, -7854422, 3140695, -6080600, -10166188, -5383742, 1460289, -1072668, +4443681, -1032403, 2894271, 5956046, 301721, -325881, -5270462, -2991982, 7950522, 3981972, +-3326452, -2085744, 12441983, -9162776, 3395172, -7635915, -6732898, 1169305, 8434779, 16833588, +-31005906, -40464496, -28118078, -36200668, 31436476, -20968568, 12662100, -3545496, -25420838, 4548907, +-6891812, -9450539, -33003602, -30245160, -22572738, -8619462, 1193464, -17500382, -5052492, 4622996, +14236206, 1127429, -8825621, 35970, -9438191, 13643500, -17140140, 23721104, 20461224, -4887673, +-6480569, -28125594, -16380468, -17103096, 2084133, 3784940, -4557497, 22990960, 6577743, 18638548, +3702262, -2190433, -8424578, 16770774, 11608223, 5269925, -16804596, 9026948, -28439126, -3167539, +-2989297, -18888730, -3076270, 249108, 21809308, 14443438, 452582, 10088878, -360777, -21446920, +10976326, 3056943, 17947594, -10116795, -20614770, 12345883, -37077916, -8491687, 13182328, -5548024, +-5865852, 9119826, -2374580, -7291781, 6921877, -3066607, -23772644, -20914344, -3417183, 9836549, +15895674, 22328998, 22383222, -9431211, -7541963, 4436165, 8149164, 7345468, 3105261, -9880572, +8781061, 213138, -1788854, 1176821, 5470178, 9111236, -2585034, 1585917, 8628052, -1926830, +-105764, -8580808, 4385699, -1818919, -529355, 7195681, -1323387, -3112241, 3274376, -9751723, +-3557844, 10072235, 2942590, 3323768, -3449933, -2244121, -1391033, -7745974, -944356, -4272419, +6039261, -16936666, -40449464, -3780645, -25750476, 1571958, -18962818, 17254494, -13540958, -1455457, +3408057, 6429566, 20827908, 6963753, -9412958, 22462678, 7016903, -38289096, 6332930, -22985054, +-1603097, 4346507, -3174518, 18862960, -5566815, 3404835, 4816806, 1634772, -12236899, 19142132, +-11063836, -1087701, -22388054, -53150, 3842922, -3584150, -7850127, -10327786, -11676942, 29027000, +1204738, 15008763, -25846040, 2876018, -284542, 8838506, 15491410, -17853642, 31659814, 45471356, +-2039573, 4333622, -15854335, 7221988, 10635413, -8864276, 2307471, 8498130, 17706540, -657130, +1077500, -5564667, -15335181, -23180476, 11798812, -17411798, -7284265, -11443403, 5046050, 15444702, +13977971, -2872260, 5268315, -31452046, 20735028, -3979287, 4534412, -9330280, 20257750, -28254980, +33574296, 24274082, 27975270, -11441793, -649614, -27713814, -14928769, -10410464, 9074192, 7492571, +-22807350, -16913044, 645319, -6002754, -16642461, -257698, -11519639, -13892609, -5119064, -2274722, +1051730, -9273908, 1612223, 2807298, 13817984, 12122545, -1932735, 11406359, -5755793, -14835891, +-8075076, -3401614, -7361037, -1411971, -5477694, 7943005, 2476049, 31513786, 4188667, -11283953, +-3785477, 2517388, -16654809, -10732586, 3936875, 307090, -4334696, 1289564, -14496, -18547816, +-1931662, 11759620, -8990977, 50797116, 14543296, 36935108, 11821897, -38556460, 15507516, 10678899, +-12800076, 2581275, 24916180, 1061394, 23849416, 21053392, -24706262, 13572097, -24716464, -16770774, +-2314987, 49706192, 15328201, -22518514, 21242372, 13600014, -27356794, -12149389, -1838783, 27788438, +4149475, -25546466, -14297409, -863288, -6942278, 15394773, 22345642, -8135742, 19659676, -12709345, +-17064978, -661425, 40460740, 3688840, -23167054, 13131326, -1046898, -2382096, 11358578, -26417270, +-22718766, -21690658, 15887621, -14231911, 5157719, 6665789, 24215026, 11879343, 24893630, 2570538, +-1021129, 20182588, 37248104, 22028350, -36734320, 685047, 3634079, -6311455, 7157026, 10125385, +-28351080, -4365835, 5690832, 4837744, -33776696, -32161252, -17918066, -19577534, 33670396, 12338904, +1630477, 14731201, -27341762, 11220602, 7667591, 4912369, -2346663, -6378564, 23295366, 13844290, +-9205189, 3856344, -6919193, 15037217, -4283693, 942208, 3273302, 2120640, 11389180, -1921998, +-18252000, -909459, 3539590, 4670240, 9540196, -2709588, 949188, 6908992, -14116484, -8591545, +-1210644, -26045756, -3855270, 6995428, -1798518, 2619930, 14930917, -2307471, -10205379, 2007897, +3716757, 9413495, 11613055, -11294690, -6705518, -964757, -9278203, -6369974, -17904108, -21727702, +6105296, 82678, -9534827, -8381629, -9730248, -19330574, 14476187, -38626788, 27954332, 31219044, +8655433, 33997352, -34842924, -17059074, -9424232, -50085224, 28221156, 2811593, 17473538, 22952842, +22468584, 1716913, -696322, 22816476, -3604015, -27134530, -28142236, 17022030, -31798328, 31022548, +-8899172, 6783901, 30764850, 27713814, -13948980, 42212548, -24475944, 2710661, -25450902, 4090420, +-8693014, 16601659, 5659693, -18090940, 16212428, 24601572, 36191004, -20950314, 7748121, 22181358, +-30511984, 1374926, -12258374, -44168368, -18981608, 11747272, -24233816, 8597451, -20343650, -528818, +29726006, -14143327, 12595528, 34203508, 24461450, 9121974, 45536316, -70967352, -13362717, 23635206, +-2729989, 13754096, -21962316, -38376068, 46562276, -717796, -23455890, 9998684, 29465624, 73065448, +27689118, -55350316, -30186104, 18786186, 20447266, 8812199, -38626788, -3425237, 8465917, -11996381, +26074746, 9269613, 16641925, 19753628, 14859513, -10208064, 11471321, -30752502, 4404489, 16320876, +-1989107, -16358457, 9491878, -10022306, 16251619, 17901424, -7722888, -15073725, -4064650, 33111514, +-5975374, -4000762, -13048648, 14905147, -12960064, -8087961, 9558987, -6328098, 31243740, -2524367, +-7798050, 31323196, -2864743, 7196218, 19217294, -1628866, -1703491, 1674500, 2803540, -14984067, +6666326, 620086, -21532818, 14392972, -6725382, 27464168, -15079093, 8664560, 2580739, 37442988, +-32917704, -2981244, -15734613, -19508278, 30005178, -11678553, 39397200, -3911105, -30403000, 47262356, +68317896, -9756018, -21829172, -33013802, 7836705, 36290864, 7128035, -7660074, -22656490, 5366025, +5332202, -5029407, 5580773, -3249143, -11147588, -11377368, 10439455, 14894410, -1171989, 20138028, +-19471234, 41326712, 31128850, 17928268, -1538672, 2418067, 5855114, -21929030, -19192062, -21261162, +-11191074, -5862094, 13209172, 11586748, 22399866, -10894721, -2721399, -9664750, 25485262, 49776524, +-11815455, -32129040, -20691004, -1378685, -43453256, 33669324, -59005872, 16925930, 24930674, 25577068, +-25752624, 5902896, 25959856, -59794536, -28281822, 12147778, -6379100, -30027726, -26471494, -3541201, +-13903346, 44267692, 18973554, -16394964, -15033996, -24790014, 67938864, 14469745, 35458176, -2707440, +10303090, 12692165, 15174119, -22420266, -2927557, 28063854, 19388020, 11457899, -9416179, -12322798, +-83752, 8593693, 12937515, 8612483, -17641042, 2266669, 86436, 4293894, 12542378, 12414066, +-18478024, 8276402, -11432666, -14186814, 1345935, 14058502, 5723581, -8988830, 1854889, -1597728, +-2753074, -7771744, 27026618, -8442295, -62814, -16681116, 3672734, -6467147, 17758080, 5313412, +-3992709, -10077604, 10020159, 7922067, -12671227, 312459, -20527260, -8594766, 4628364, 7771207, +11290932, -758599, -25681220, 7734699, 39410084, 1304060, -13455059, 33083596, 23506892, -6737193, +-21288006, -31996432, 6028524, 63225676, 13766981, 32468342, -2951180, 2930778, -2666638, -7316477, +-118112, 3002182, 15167140, 5157719, -12389370, 10612327, -10864120, -11700565, -13492640, 440771, +12524662, 2856690, 9980430, 10976863, 8627516, -8766028, -15822123, 5078799, -11018739, -27027156, +-8211441, 6272800, -9647033, 31826782, -32912872, 26757110, -8640937, 317291, 39217884, -6064494, +-1286880, 51604568, -8122320, -20834350, 3562675, -17834852, -4304094, -16831976, 57111252, -16100222, +13591424, -13657996, -6426345, -7738994, 9270150, -14310294, -35415228, 15640660, -4301410, -38873212, +20132122, -10094784, 21430276, 49104896, -24826522, -401043, -2806224, -7118909, -26699128, -4475356, +23887534, 9840307, 14540075, -22091164, 6294275, 4093641, -21790516, -5698885, 4476967, 11206107, +13475997, 1294933, 2320356, 9160628, -2469069, -10526428, 15226196, -5972152, -5038534, 14313515, +1584306, -3736085, 20746302, -1241246, -1937030, 344134, 6540699, -6160057, 10295037, -8046085, +-4464619, -6322729, 5185100, -6979, -1130650, 3228742, 9426916, -11468100, 2163053, -1395864, +6658273, 2258616, -2609730, 12181064, -7688529, 6649683, -2441152, 3722126, 459562, 9160628, +-13980119, 40265, 65739308, 33405182, 68971272, -38569880, -10020696, 22825604, -21573084, 16539919, +70950176, 16891570, 10260677, -18645526, -17644800, 20414516, -10750840, 28834262, -4720169, -6471979, +-8341900, -40686764, 9823127, 49148920, -25905632, 29765198, 25873420, -16495359, -4999342, 20518132, +-32588064, 16372952, -2304787, 24693914, 8329016, -20277614, -6564858, -40904732, -21032454, 19338628, +14471892, 31982474, 49737868, 5417028, 793495, -42960948, -26312044, -25612500, -21176874, 11380590, +-17568564, -4925254, -4034048, 12998182, -32895154, -5214091, 17035988, 8889509, 27123256, -3536906, +-12991739, 27073326, -4890357, 16629040, -20780662, -12451647, -3220152, -6851547, 13226889, 19717122, +27740656, 7923141, 2277943, -19082002, -5405753, -9756555, 23224498, 333934, 34809636, 6128382, +26214332, -25442312, -9165460, -111669, -646393, 19059454, -3044595, -9381282, -5163625, 4725001, +1289027, 4995584, 8752070, 7907035, -4857608, -5631239, 326418, -3313031, 7368554, 7954280, +1814087, -6578816, 245887, -8642011, -3682935, -1868848, 14921790, 5395016, -2004139, 3926137, +-10071698, -11809013, -8062191, 3770445, 8157217, -7031935, -759672, 138513, 6062347, 3417720, +-1004486, 6538551, 953483, -329639, -6519761, 3097745, 1813550, -2632815, -18079664, -67524936, +1752347, 108659992, 97988608, 92165168, 39050916, -39142184, -54268524, -53801444, -48118668, -88320096, +-63079648, -61475476, 47531328, 73056856, 59576028, 95081984, 79076792, 16786880, -3704946, -34017752, +-66315904, -39555040, -69683160, -37821484, -23352810, 384400, -9350681, 17483738, 29851634, 50814832, +31916976, 53389664, 40582608, 42422464, 3244311, -34907348, -15963857, 1229434, -38211788, -50378892, +-65593816, -64403572, -45761264, -6416681, 31907848, 12654047, 46452220, 32930588, 52988084, 47267188, +51376936, 59711320, 32040456, -4565014, -9720585, -38954280, -31981400, -105214352, -84272088, -67448704, +-52822728, 6162741, -23112292, 1515050, 71785008, 88787712, 121346248, 76819784, 46072116, 31439160, +7233262, -46508052, -42750492, -64845952, -83967144, -71009232, -66367984, -31074088, 4648765, 33590404, +55068460, 54523000, 46261092, 29273960, 31002684, 13387950, 8255464, -1484448, -25905096, -22432614, +-20644298, -22826678, -12303471, -25514254, -18409840, 6337224, 2033130, -14825690, 7912941, 21053930, +11791833, 24020142, 37248640, 38939784, 17005386, -24040006, -10578504, -3348464, -49256832, -51750060, +-45331232, -18820010, 13822279, 22193706, 18297098, 31113816, 34957276, 43404404, 28573880, 17772038, +-6861747, -29052770, -29781840, -32909114, -44574244, -31455266, -17709760, 15184857, 23820426, 15628312, +9210020, 28147068, 18712636, 11580306, 2381559, -4144107, -9283572, 970663, -11103027, -12775917, +-5059472, 4378719, -7834021, -5544803, 814970, 5854578, 321586, -2796561, -4303021, 4425964, +-463320, -1953673, -4393752, 1906429, 1319629, 2702071, -1252520, 1613297, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 1097901, --1261647, 4443144, 4995047, 2682744, -1933272, -7547868, -6924024, 2508798, 3972308, -1468342, -7419019, -1438814, 4425427, -5273683, -4651987, 2025614, 181462, -1371168, 1959042, 4809290, --2097555, 664646, -2753611, -278099, 252866, 1968706, 1832340, 2467996, 406411, 1467805, -5493263, -2124935, -2575370, -2780455, -4983236, 1428614, -1050656, 9104257, 1767379, -689879, -713501, 5521718, -513785, -1209033, -1412507, -3245922, -597537, 4244502, -656593, 1757715, -4293894, -1353452, -312459, -6916508, -4065724, -6307697, -1236414, -1836099, 927713, 338229, -905164, 2242510, -1514513, 1080721, 67109, 550830, 957241, -2306398, 2172180, -751082, --2623688, -339302, -2645700, -811749, 243739, -4124779, 1087701, 179315, 3170760, 326418, --58519, -1899449, 421444, 3156801, 1543504, -796180, 348966, 695785, 766115, 2405719, -285078, 142271, -586800, -371515, 238908, 86973, -251256, 1584843, 865436, 937914, -670015, 488016, 201327, 471910, 5119064, 12112345, 4767951, 2874944, 3352222, -7099044, --846109, 3080029, -973347, 1211718, -6497749, 6389301, 8629663, 1501628, 3849365, -1808181, --5071820, -7830263, -8595840, -5697274, 6795175, -6412923, -4092567, -5425618, 1733019, 4532264, -843424, 623307, 2517388, -245350, 1586454, 5582384, -792958, 4642860, -4422743, 4236985, -2930778, 2697776, -2334852, -7196218, -1544041, 4136054, 2433099, -2004139, -251256, 1437203, --315143, -3467649, -739271, 2958159, -1022202, 336081, -1728188, -371515, 204011, 994285, -5079336, 2137283, -2618320, 448824, 411243, -1719598, 918049, -2508798, -304943, 4137127, -1333587, 4640712, -3318936, -2831994, -1708860, -724239, 2347737, 5259188, -3039226, -3791383, -4510253, -417149, -97174, 164283, 1549946, 1125281, 3789235, -1061931, 1760937, -2309082, --2179696, 178241, 1016834, -152471, 67646, 879931, 940598, 734439, -1966021, 2207613, --461172, 3546569, 1509144, -3982509, -3751654, -4267587, -664109, -3483755, -7330973, -6988449, -7218767, -158377, 1524713, -54224, 4399657, -6499896, 9663676, 8576513, 450435, 457414, -19327, 255014, -947577, 3358665, 2619393, 212601, -5490579, 2382633, -1699196, 2643552, --760209, 5857262, -1358283, -3408594, -1538672, -919123, 2176475, -36507, 3628174, -5815386, -3141769, 1014149, -3221762, 9152038, -1447404, -1310502, -186294, -142808, -2406792, -779000, -4890894, 3998615, -8571144, -4046396, 4366908, 1255741, -2045478, 7463043, 279173, 1672890, -7354595, 3034395, 5775121, 1629940, -2209224, -2996277, -5765994, -5593121, 819265, 2976949, -7157563, 272730, -2909304, -3648575, 1250909, -67109, -1990717, 2320893, -799401, -1835025, -1680406, 3875671, 1263257, -1943473, 1949915, 2018635, 2538326, 1624035, 135291, 241592, --2393908, -504659, -25770, 1230508, 1044751, 1974074, 1916629, 1585917, 609885, -155693, --9784472, -3417183, -4757750, 4440996, -3248069, 2882997, -3512747, -1459752, 8306467, 4052839, --5506148, 2508798, 7922604, 1155346, -2771865, -5565741, -6675990, -4584878, -6713034, 4454418, -1017907, 2448668, -1285806, -3045132, -3204046, -5922223, 310848, -188442, 1408749, -1447941, --5378373, 82678, 5750425, -1278827, 68719, -2869038, -5729487, -8485782, -727997, 6107444, -2223183, 638876, -2874407, 777926, -4600447, -1511829, -3461207, 436476, 783295, -5244692, -5916855, -3335042, 7528541, 2843268, 716186, -3424163, -1794760, 1930588, -430570, 1826435, -4041564, 817654, 1603633, -4476430, 2641405, -2252174, 6920266, 8566849, 3932043, 5756330, -2681670, -882079, -6011344, -3885335, 496069, 4427575, 4465692, -3575560, 469225, 4207458, --5505611, 5434744, 348966, -2792266, 1792612, -1173600, -263604, -3105261, 609349, 877247, -535797, -2491618, 659814, -1761474, -2335925, -818191, 165893, 1029182, -1524177, 374736, --660888, -2167348, 231928, 1782948, 748398, -1552094, 1003412, -1168231, 3275986, -7900593, -1037772, -8448201, -37581, 1298691, 785979, 3816079, 382252, 609885, 14949171, -1869385, --6602976, -7115150, 7509214, 5037460, -5665062, 1376537, -6317897, -2700461, 212064, 7158637, --8864812, 2593087, -345208, 1422171, -674847, 9087614, -4693326, 2570001, -1418413, -2392834, -1382443, -425202, 2724620, -2767033, -2576444, -7670275, 1207960, -2538863, -1649804, 621160, --2716030, 2279017, -4329327, -2565169, -7619809, -215822, -6764574, -2842732, -8046085, 5997922, -1221918, -2453500, 5267241, -6084895, -22549, -11609297, -616865, 4038343, -307627, 3465502, -7408819, -2576981, -1030792, 9278740, 3918621, 3596498, 5665599, -2902861, -8543227, -883690, --5108864, 3764539, 8540006, -1508607, 2517388, 4564477, 3835943, -425202, -697932, 1085553, -183610, -1545651, 2318209, 2090039, -3527242, 1214402, 3022583, -1472100, -1056025, -5237713, --1196148, -2181844, -700080, -2264522, 494995, -519154, 445603, -197032, 393526, 1402844, --1517197, 593779, -600222, -1540283, -173946, -223875, -439697, 164819, 946503, 1544041, --1428077, 566399, -1200443, 271657, -97174, -1603633, -607738, -1076426, 4223027, 4776004, -1727114, -2874944, 2066416, 1255204, 9092983, -1377074, -1955821, -12259447, -3469260, 9233643, -9004399, 5803575, 4562329, 13140452, 807454, -15670188, -4024921, -2602213, -3803194, 8370892, --1330903, -3030100, 9740986, 1534377, -4024384, -1384053, 3885335, -3448859, -1372779, 1200443, --1251983, -5451924, -2483565, -246424, -5285494, -2408403, -2223183, 3695819, -2484639, 7109782, -6895570, 681289, 6558952, 4616553, -2971581, -999117, -2257005, -10180683, 1140314, 2115808, --9701257, -1380832, -2754148, 3484292, 8853538, 1361505, -8989367, 1333051, -3468723, -6041409, -4897874, -1402844, -6439767, 2933463, 2473364, 7128572, -571768, -864362, 5236639, 6214281, -6811818, -6978785, 4937602, -873489, -1191317, 1860795, 7354058, -306553, -1967095, 2352032, -1118302, -6213744, -825707, 8594766, 1887638, -521302, -1077500, -3837553, 2757906, -1388348, --1760937, 325344, -256624, 2018635, -132607, -2621541, -1909650, 3609383, -445066, 1450625, --1612760, 1770600, -1331977, -948114, -1317481, 947040, 1902671, 6259915, -16042240, 6675453, --1748052, -3659312, -3292629, 2753074, -1519882, -9512816, -10129680, 1239098, 15810848, 4358318, --11494943, 2597382, 9383967, -6744710, 1222455, -1701344, 5597953, -33286, 5166309, 13830332, -10074920, 6289980, -229244, -1139240, -6385543, -6843494, 2731599, -17909476, -2826625, 8496519, -956704, -900869, -8573292, -3054259, -359167, -383863, -4162897, -8865886, 9947144, -3430605, --2173254, -1597728, -8212515, -9238475, -284005, -4505958, 648003, 4405563, 3375308, 3729105, --7330436, -1901060, -3598646, -2288681, 11806328, -1240709, -5382131, 383326, 15138686, -8069707, -2549063, 11143293, 352724, -2554432, -5609764, 3393561, 648540, 8026220, -4310000, 6791954, -5515275, 10512469, 5091684, 7874286, 839666, -5150740, 1113470, -209380, -2967823, 4759361, -6778532, -5615670, 3702262, 2029372, -5046050, 665720, 1800128, 1418950, 1842004, -2884071, -1644436, -3161633, -948651, -873489, 227633, 593779, 1366873, 1732482, -352187, 2594697, --187368, -1155883, 904091, 1727114, -579821, 1048509, -2697776, 1074816, 9222369, 13238700, -8085276, 1350767, -2843268, -4953708, -10998874, -3182034, 7249368, -14955613, -6142340, 13626321, --18886044, -3415573, 10546829, 13255343, -1371168, -13310641, 1833951, -5093295, 17792438, 7893076, --12241194, -7873749, -1893544, -7548405, -15402826, -7703561, -6841883, -5574331, -12476343, 6266358, -2199560, 7693360, -4758287, -2305861, -10976863, -1128503, -9526237, 985695, -6337224, 1394791, -3313567, -14694694, -4836670, -5598490, -3911642, 3158949, 3123515, -4696547, 14467597, -945967, --3798899, -2724083, 1386201, -3406983, -1207960, 5379984, 4578435, 6023692, 7934415, 7532299, -585726, 4937065, -2423435, 11288248, 12073153, -6085969, -3171833, 7407745, -223338, -18336290, -832687, -9316321, 5672041, 5788006, 10354629, -7872138, 4402342, -11042898, -1082332, 6297496, --2703682, 9841381, -2575370, -1207960, 1969243, 638340, 1373853, -659814, 571768, 4181151, --3112241, -800475, 4019553, -626528, 3155190, -4719096, -4102768, 2767033, -664646, 863825, -433255, -567473, 721018, -2824478, -741419, -494458, -1230508, -1910187, -666257, 1493038, -1794760, -92342, -10160819, -12294881, -6022081, -11878269, -16950088, 11992086, 1185948, 6710350, --9367861, -9747428, -13442711, -9094056, 4149475, -9970230, -8952859, 12193949, -3053722, 573378, -2948495, 6965900, -5417028, -4109210, 2011118, -3291019, 1905355, -621160, -6020471, -11523934, --18037788, 5957657, -12956306, -11883101, 624381, -3134789, -833224, -6691022, 3023120, 3433290, --14703821, -326418, -3229279, -5761162, -8175470, 4642323, 993748, 14688251, 1752347, -8252780, --513249, 1357747, 6060736, 2529736, 13030394, -1127429, -14179835, 6060736, -3009162, 6396280, --8478802, 1840394, 4811437, -25080998, -11909407, 8854612, -770410, -2700461, 3850975, -1285269, -15833397, -566936, 10027675, 8704288, -12834436, -14904610, 867047, -16510928, -379568, -824634, -333934, 2389076, 10342281, -372052, -6495065, 5919539, 7782481, -7274064, 1275068, 2330020, -7828652, -3836480, 274878, -3890167, 2647847, -224949, 1657857, 2593087, 4218195, 4258997, --129386, -4112431, 183610, 3025268, 952946, 626528, -3747896, 397821, -3753802, -560493, -2032056, -613107, 3688303, 2728915, -157840, 770410, 2986613, -2782065, 5267241, -118648, --2309082, 2355790, 8559870, 35158604, -8695698, -23583128, -2152852, -10304163, 25499220, 1992865, -14262513, 7750269, -4498442, -11282342, -5114769, -12294344, -3213709, 17214766, -19205484, 831076, --15676631, 4262218, 1255204, 7653632, 1721745, -7478612, -12712566, -14747307, -2783676, -14467060, --11384885, 1874753, 3332358, 10790568, -10115185, -20985748, -4440460, -7275138, 2481954, -9856950, --6709276, 3046743, -5294084, -8338142, -606127, 930934, -4308926, 20487530, -4231617, -3340948, -5136781, 5366562, -6106370, -2562485, 15113990, 12721693, 8308614, 15992848, 12482249, 44560, -5214091, 9094056, -6771553, -6324340, 1843615, 6558952, 10606422, 4376572, 21544092, 2384781, -14443438, -4078072, -8359617, -5359583, 30586072, 5456756, -3978214, -3670050, -10991895, -10493679, --7577396, -7352447, -8798777, 3533684, 7049652, -7473243, 2408940, 7625715, 3779571, -6898791, -1403917, 7778186, -1941325, 4313221, -3872987, -1069447, 1737851, -1297080, -869194, -2310156, --4946729, -755377, -4480188, 2391223, 3753265, 1930051, -3735011, 4980015, 3225521, -2732136, --3263102, -5051419, -1505386, -1384053, 1336809, -1091459, 2363843, 1772748, 443992, -478352, -89121, -4026532, 1690607, 6812355, -30944702, -11268920, 15279346, -3518652, -15878494, -14592688, --5120138, 16877074, 8762807, -13286481, 7306813, -17734456, -7480760, -2004139, -11887396, -15917149, -13370770, 7563975, -14442364, -4904316, 30726196, 7302518, -13759465, -18648748, 264141, 10244571, -1666447, 1862942, -21562346, -511101, -2471217, -15336254, -9043591, -6119255, -12403329, -5749888, -3570729, 590558, -13086765, -12960601, 1657321, 8315057, -224412, 11106785, 18422726, -12859669, -11416023, 8710731, 3629247, 2580202, 13889924, 4422206, 8565239, 5817533, 7720204, -2514703, --1671279, 15939161, 24795920, 4186519, -5766531, 3118683, -3564286, -9315247, 15782394, -7637526, --13298292, -20956756, -7225746, -24432996, 12257300, -9923522, -4225711, -1359357, -3520800, -8741332, --1462436, 9824201, -11150809, -919123, 5157719, -3141232, -10872173, 5527623, 901406, 3103114, --711891, -1227824, -3879966, -363998, -2004676, 5895380, 1549410, 1676648, 963146, 1970316, -95563, 3034931, 2030446, 5234492, -7219303, -784905, 616865, 4862977, -1962263, 4064113, --4342749, 1574642, 1087164, -877784, -2392834, 4262755, -1886028, -263067, 2441689, 817118, -261456, -5805185, -13565117, 11527692, 6928319, -2055679, 7719667, 5714454, 16422881, 12638478, --26656714, -8862128, 29672318, -23380192, -6886980, -14168023, 21150566, 9400610, 9758166, 4093104, -3118683, 8450885, 22437446, 10661183, -9848897, -202400, 765578, -634581, 8897025, 9968619, -1236951, 5896990, 5667210, -5149129, 6969122, 4167192, 13874892, -6655052, -13295608, -11443940, --8888435, 2635499, -1135482, 5286031, 6030671, 6036040, 12222403, -5350456, 2598992, -5392869, --9486509, -3853660, 1035624, -10964515, 14031658, 16949552, -18396418, 6277095, -12736726, 10420664, --2062121, 4050154, -1376000, -10198937, -2462090, 11727945, -9154186, -2825015, 2097018, -18808736, --7169374, 3939022, -14529874, -1012002, 23293218, 11573863, -1553168, -5329518, 18588618, 4876399, -13390097, -4208531, -5989332, 19390704, -6571300, 6051609, 2592013, 2753074, -3985193, -2927020, --3562139, -2472291, -6519761, -4032974, -4541928, 650688, 4202626, -1547799, -9160628, -2947958, --1260036, 1032940, -277025, -2285460, 42950, 2583423, 4478577, -3576097, -106837, -9888088, -1675037, -1235877, -1866700, 6665789, -117038, -646393, -3935264, 4075924, 1120450, 6037114, --2063732, -357019, -4051228, -447213, 18521510, -1506997, -4325569, -15394773, 652835, 1467805, --4153770, -325881, -7161321, 2708514, -22139482, 20195474, -4100620, -7141994, -14021458, -15804943, --1655173, 19266686, -3515431, 5342940, -11926587, -6871948, -3345780, -11583527, -14010183, 12790949, --7925289, -6432788, 11310796, 11026792, -15611132, 5436355, 5870684, 13502840, 11125039, -4068408, --9889699, -6219650, -15181099, 16680579, 10945187, 5539971, 11870753, -12314745, 8410083, -1785096, -7707319, 8571144, -8091719, -634581, 27118424, 22754200, -17226040, 6890738, 14067092, -10828149, -3330210, -25365540, 7575249, -13724031, 11320997, -7961796, -8795019, -6199786, 30258044, 1731946, --8846559, 2686502, 10160819, 1339493, 6034966, -16317654, -1880659, 27197344, -915902, -10681047, --16655883, 514322, -12334609, 7686918, 7822746, 9506373, -17011292, -17743584, -4758287, 2987150, -5814312, 1852742, 70867, 435402, 6446746, -4353486, -1767379, -1348083, -2881386, 3187403, -2680060, -5427228, -3759170, -8337069, 5077188, -3058017, 2206540, 3651259, 5345624, 4267587, -1821066, 8375723, 510564, -1952063, 3989488, -6223945, 3454764, 2410551, 1682017, 5543729, -5918465, 1100049, -845572, 3503083, 377420, -537945, -6575058, -8588861, -1648194, -663036, --1087701, -16742856, -868657, -1991791, 4880157, -24310588, -11260331, -13619878, 11486890, -5768141, -17092896, 10424959, 21763136, -10776610, -913754, -17056388, 14504641, 26466126, -8246874, -20946018, -2043868, -4242891, 32416266, -7939247, -12734578, 12412455, 6802155, 5228049, 12202539, 4212289, --40770512, 205622, -2747169, 15976205, 28619514, -26985816, 1060320, 8174397, -12983686, -2566780, --36968932, -8303783, 18838264, -30351998, -18211736, -9271224, -11911018, 12191802, -7377680, -10772315, -16279537, 5018133, 5931350, 16858284, 1840394, -5713380, 11939472, 17686676, -17149268, -12706661, -26209502, 18095770, 6077379, 8396661, 6188511, -11733314, -17044578, 46708, 219580, -3435974, -5361730, -10245644, 7315940, -14215805, 5789079, 33410014, -15524696, -12753369, 18332532, 5354214, --6249178, 11672110, 16112570, 12050068, 14238890, 7128035, -7243463, 5946919, -17581448, 9468792, -3980361, 5039608, -8922258, -2591476, 1864553, -757525, -1783485, -2603824, 5769215, 11367168, --4414153, -10835129, 6919193, 13135621, 6820408, 5211943, -15465640, 9441412, 1005022, 5143224, --2480344, -5218922, -1235877, 7971996, 719407, -1382443, -6673306, -471910, -3891240, -1845225, --3084324, 3590593, 7460895, -4411469, 295279, 4786741, -1844152, -742493, -4076461, 821413, --2731599, -2965675, 9670656, 8733279, 14242112, -32988570, -60928408, -28082644, -4271345, 20737712, -1468342, 22868554, 21125334, -6389838, 3424163, -5175436, -11587822, -19051402, -11087458, -13752485, --7998840, 21725018, -28238336, -4909685, -23535348, -29190746, -5112085, -29460254, -23703388, 2902324, --6201396, -3400004, 5360656, 25853556, 1804960, -18762028, 1069447, -2250563, -5645198, -24363738, --1597191, 29041496, 2686502, -495532, 11766600, 22561464, 15187541, 3946001, -9188009, 7866770, --7718056, -20679730, -37922952, 36074504, -4566624, 30051350, -2530273, 399969, -10799158, -17364552, -31679142, -18000744, -14626511, -1520955, -23082228, -21686364, 18031346, 13224204, 6940667, -2301566, -9185861, -16013786, 6231461, -12995497, -18344880, -20022600, -15614890, -6438156, 15515032, 987843, -5576478, -9262634, 5494337, -12119324, 8833137, 6860674, 6293738, -3946538, -497679, 7817378, --2118493, -9453223, -7124277, -9357123, -799401, -6905234, -1588601, -2423435, -2505040, 2767570, -1147293, -3710852, 1619203, 4923107, -1277753, -3118146, -7314866, -47782, -5018670, -680215, --795106, -3471944, 8587787, -8027831, -7507603, -3543348, 4575751, -7104413, -7137699, 1040993, --5959804, -27380, -1031866, 3370476, -743029, 1145146, -4796405, 1972464, -9982578, -5036386, --1467805, -21164526, -15495705, -23486492, -242129, -22465364, -26086558, -4413616, -11917461, -28652264, --39670464, 4494684, -15010374, 7315940, -2858301, 14875619, 33423972, 1688459, 3463891, -16959216, --18142478, 15108084, 8449274, -12283070, 74088, 9853192, -22597434, -17393544, -1207423, 28680718, --24647744, 320512, 609885, 13198971, -21046950, 21949430, 11552925, 6213744, -548682, -9155260, --24424942, -258235, -5822902, 8833137, -13239774, -32455458, 26767846, -19559282, -8682813, -1372779, -26197690, -19908248, 9214852, -16354162, 10167261, -5929739, -24021752, 11502459, -30616674, -6774237, --8756365, 10703595, 25174950, -14546517, 9351218, 25458956, -20341502, 3360812, 6201933, 5979132, -7577396, -37153076, -11069204, -6292127, 13429826, 2808372, -1074, 6784438, -6470905, 14826227, --2641405, 3375844, -14221174, 12374338, 3245385, -22900228, -10378252, 10784663, 13569949, -1910724, --3356517, -8957154, 12724914, 1596654, 292058, -23818278, 3974992, -11457362, -17942762, -5453535, --3539053, -2320356, -10513006, -13662291, 5012764, -3142842, -6620155, 3936875, -1267552, -1952600, -908386, -3652870, 1415192, 7379828, -13774497, 1410360, 2734821, -4567161, 10136123, 9336185, -10736344, 4275103, 6532109, -6674379, 2911451, 361314, 3177202, -3024731, 272194, -186294, -4576288, -2682744, -6071473, 43771084, 4236449, 18607946, 49758268, -23159000, -13325136, -19375672, --7500624, 23212688, 1309965, 28543816, 7420093, -847182, -10788958, 21608518, -13561359, 5046587, --9130027, 9017284, -14354854, 16500191, -8156680, -3652333, -9537512, 12720083, 8404714, -13676786, --3495030, 13381507, 3793530, -8728447, 682900, -11271068, -37734508, 16422344, -19922206, -28722594, -17638894, 8043400, 19093278, -1680406, -18995566, -6901476, -5233955, 11330661, 14774151, 16771310, -27578522, 27523224, -12359842, 3896072, -29207926, 408022, -21321292, -37629820, -3912715, -30661234, -9783936, -24467354, -16375637, -16171626, -23243826, 2382633, -5659693, 2037962, -7054484, -2816425, --2204392, -39818104, 6184753, 6154688, 8917426, 19245212, -3805341, -31646930, 18194018, -20469278, -11697343, 11791833, 25740812, -13992467, -13059922, -8449811, -5199058, -18351322, 7231115, 4326643, -2183991, -4342212, 6381248, -9129490, 9206799, -1466195, 1813013, 2836826, -11500312, 8590, -4345433, 11335492, -3067144, -6717329, 4846334, 7871065, 9565966, -5971615, -16106, 5471252, --734439, -978179, -3659849, -7104950, 4992900, -74088, 3169686, -3942780, -615791, 6646462, --4420058, -6681359, -3921842, 1120987, -2920578, -11787001, 19014894, -4784594, -3966402, 1709397, -3612068, -3132105, 3470871, 4625680, -1901597, -470836, -2617246, -3830037, 31152472, 58289148, --31998580, -25845502, -45173928, -91829088, -22741852, -9621800, 20497732, 12404402, -7974144, -17723182, -25060598, 30662308, 2624762, -1484448, 141734, -24228448, -14318884, -17184164, -13228499, -25628070, --381715, -6475737, -3129421, 17579838, -24101208, 19286014, 18060338, -5648419, 9281961, -1059246, --42859480, -30514132, -17062832, -15599321, -7218767, 3381213, 16472810, 5349919, 8839043, 41352480, -37568080, 8515310, -27975270, -14535243, -1253594, -14365055, -26530012, -66125852, -55605868, -24996710, --5994164, 2729452, 14439680, -45870788, -26468272, 23790360, 27567784, 33143188, -30238718, -36666136, -11915850, -22365506, 54385024, -27431420, -3157338, -16139413, -8761196, 7524783, 16073378, -8019778, --21530672, 19987704, 19356344, -4378719, 22177064, 19739132, -43123620, 38585448, -25010132, 134218, --7369627, -25753698, -7245073, 13065827, 9715753, -2077690, 5029944, -15697569, 353798, 7919920, -10653666, 16839494, -12637941, 2575907, -3616899, -6838662, -17890686, -2174327, -17235166, 15220827, --2809446, -18289582, 2912525, -20952998, -1409823, 2553895, -4875862, -9050033, 614180, 1704565, -2193118, 6868727, -1301375, -298500, 12233141, 4014721, -12348031, -14127221, 3855807, -9363029, --19967840, -6830072, -18784040, 6199786, 5935108, 14779519, 2004676, -15200963, -10908680, 10790032, -54786064, -18260590, 17663054, -770947, -24383066, 3764002, -49229452, -11090142, 10584410, 966905, --28655484, 16961362, 50190452, 35205848, -15529528, -31428424, -13381507, 3530463, 52741124, 7093676, -1330903, 199716, 24387362, 25071334, 6556805, 19167366, 15547782, 29473676, -8398272, 3363496, -18833432, -17188996, -26161182, 14694157, 43274480, 9375377, 20972326, 2007360, 12875775, -57930520, -10721312, -2268817, 13084081, 56785372, 22915798, 7674033, -5640366, 25445534, -5814849, -11940009, -8992051, 15810311, 33421288, -10780368, 20770998, 3777424, 5759551, 13145284, 16908750, -534723, --22141094, -13745506, 5170067, 42828340, 29335700, 22785876, 24674588, 20656108, -5931350, -53048752, --38113004, -72768560, -1030255, 22178138, 41872172, 6513855, -30569966, 10085657, -18927920, 6062883, -14447196, 4367445, -8880382, -4922033, 128849, -4111358, 11707007, -8053601, -21189222, 396748, -7012071, 9404368, -13721347, -6219113, -25491168, 6302328, 11033771, -9785546, -8825621, 6358162, --5037460, -6297496, -5559835, -19791746, -4306242, 20402706, 12720083, 18472654, -10027675, -20919176, --15575699, 13568875, 10634339, -4930623, -1006096, -1278290, 3717831, -5888937, 12168716, -13958644, --7978976, 969052, 2218888, 8035347, -17350058, 3561065, -12778601, 33640332, -9990631, 7335268, --11106785, 3878892, -20858508, -8732205, 44769128, -1823751, -20946556, 5119064, -4068408, -17020418, --13842680, 2493229, 23553064, 64255396, 28704340, 56952340, 29635274, 25293062, 23938000, -16954920, --14346265, -16224239, 6949257, 46664820, 14841259, -39041788, 16640314, -41975252, 20802674, -26634702, --5847061, -23387708, -25300578, -1243930, 3030636, -411780, -31607202, 40862856, -8514773, 15325517, --39922256, 10584947, -9443559, -12283070, 20379082, -16916802, 40968620, 4799089, -16454020, 2063195, --12450573, -16928614, 11370389, -27965068, -6212134, 35014184, -7881802, 14297946, -2121177, -25472378, -27632208, -15067819, -58098024, 7154342, 4110821, -283468, 6141267, -8029978, -11513734, -3288871, -25956098, -49784576, 29148870, -11778411, -7166153, 32670206, -20382842, 9567040, 11826192, 47452948, -16291885, 20944944, -3620121, 28333900, -22932978, 22462142, 3445638, -8759586, 5778879, 1296006, -681289, -12326556, -3437048, 2128693, -5477694, -9244917, 19054622, 259846, -1636383, -5760088, -6185290, -7643431, 16958678, 9935333, 9002251, 2056753, -334471, -1715303, 14153528, -11623255, --15038828, 5603859, 7301982, -795106, 12681965, -5642514, -2844342, 558346, -4653597, -14486925, --14642617, -1460826, 4576825, -7259032, 2251100, 4492536, 4898410, -3997541, -585726, 9319542, --13623099, -24177444, 39688184, 36976448, 128737352, 52049100, -70138960, -32889786, -34357592, -53830436, -37567544, 115807888, 46342160, 22031034, -29013040, -7915088, -1941862, -1292248, 55576340, 38143068, -24253144, 83699784, -100140384, 6597607, 52366388, -12608413, 10777684, 54943368, 9632001, -15581604, -29603598, -55146308, -110787608, -10485626, 10902238, -42881492, -4858682, 59466508, 10028212, 3588982, -22584012, -46783468, -95454040, -87126096, -39672612, 28950228, 56761752, 125801200, 31594316, -15969762, --15792058, -33964600, -75163000, -22742926, 55020680, 55458764, 58083528, 56726856, 35562328, 29591788, -8554501, 12994424, -48297980, -29582124, 7194607, 13612362, 24776056, 30447560, 74711496, 19653234, -43486544, -28527710, -28229746, -50608672, -11020349, -38687456, -9250823, 77973520, 100024416, 2240362, --4054449, -62228172, -71832256, -40390948, -17080548, 39961448, 21242372, -4318053, 14816563, -5479842, --10284299, -18753438, -17803176, -2348273, 4505421, 3718368, 21965000, -1571958, -496606, -11232950, -356482, -13991393, -4730370, 51540, -20671140, -9294309, 411780, -5637145, -1481764, 12079596, -10704669, 25223270, -11143830, -4583267, -25596394, -20706574, -15734076, 26125750, 16543140, 8188892, -8652748, -8114804, -22742926, -18330384, 789737, -12926778, 22186190, 32952600, -8517457, -91468304, --57002804, 33371896, 86161872, 101055208, 209268528, 128189208, 86421720, 77004472, 59290412, -10017474, --91162832, -99053760, -193261184, -204773840, -194810048, -123944704, -43750148, 43570296, 74320648, 124753232, -121874528, 86133960, 84371408, 108649784, 103573672, 93591632, 58783068, 41459320, 35929548, -3372086, --6679211, -119639000, -85850488, -107017160, -130326488, -54338852, -127279744, -102146136, -187348624, -163325264, --116372136, -77200960, -11916387, 97542464, 117423872, 99558416, 105678744, 98485744, 181598736, 237217488, -211356416, 210297712, 184953632, 179213952, 132652216, 133264784, 28134720, -89485640, -187132800, -178376432, --267623712, -222709088, -324954016, -386380096, -343978016, -326083040, -196828688, -136566544, 24632712, 65036544, -152207200, 227101760, 349377344, 303155424, 436951168, 377958208, 270214112, 266318576, 120735288, 8944269, --24729884, -94681480, -165959680, -197671568, -236801408, -204694928, -186028448, -178929408, -145939760, -149774096, --123605936, -108258408, -33475512, -23013508, 29337310, 69844224, 79685600, 104644728, 148240800, 180031072, -191355296, 200879920, 146976464, 122148872, 117831888, 43910136, 28419262, -66788888, -160451392, -212955216, --218491424, -243868784, -155523984, -176704080, -118485264, -85106928, -24205898, 42155104, 82562160, 126500744, -130667400, 197745120, 202465840, 195067744, 164701792, 148314880, 58227408, 14848776, -37970732, -84294104, --161159520, -189090768, -157872256, -106834088, -95185600, -66264904, -61289720, -32001264, -5160403, 7349763, -4319127, 27973122, 31084826, 50520088, 42119132, 39662948, 36180268, 42039140, 28331752, 27146340, -29990146, 30527016, 11153493, 3393561, -7248831, -1510218, -4686883, 2255932, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-1261647, 4443144, 4995047, 2682744, -1933272, -7547868, -6924024, 2508798, 3972308, -1468342, +7419019, -1438814, 4425427, -5273683, -4651987, 2025614, 181462, -1371168, 1959042, 4809290, +-2097555, 664646, -2753611, -278099, 252866, 1968706, 1832340, 2467996, 406411, 1467805, +5493263, -2124935, -2575370, -2780455, -4983236, 1428614, -1050656, 9104257, 1767379, -689879, +713501, 5521718, -513785, -1209033, -1412507, -3245922, -597537, 4244502, -656593, 1757715, +4293894, -1353452, -312459, -6916508, -4065724, -6307697, -1236414, -1836099, 927713, 338229, +905164, 2242510, -1514513, 1080721, 67109, 550830, 957241, -2306398, 2172180, -751082, +-2623688, -339302, -2645700, -811749, 243739, -4124779, 1087701, 179315, 3170760, 326418, +-58519, -1899449, 421444, 3156801, 1543504, -796180, 348966, 695785, 766115, 2405719, +285078, 142271, -586800, -371515, 238908, 86973, -251256, 1584843, 865436, 937914, +670015, 488016, 201327, 471910, 5119064, 12112345, 4767951, 2874944, 3352222, -7099044, +-846109, 3080029, -973347, 1211718, -6497749, 6389301, 8629663, 1501628, 3849365, -1808181, +-5071820, -7830263, -8595840, -5697274, 6795175, -6412923, -4092567, -5425618, 1733019, 4532264, +843424, 623307, 2517388, -245350, 1586454, 5582384, -792958, 4642860, -4422743, 4236985, +2930778, 2697776, -2334852, -7196218, -1544041, 4136054, 2433099, -2004139, -251256, 1437203, +-315143, -3467649, -739271, 2958159, -1022202, 336081, -1728188, -371515, 204011, 994285, +5079336, 2137283, -2618320, 448824, 411243, -1719598, 918049, -2508798, -304943, 4137127, +1333587, 4640712, -3318936, -2831994, -1708860, -724239, 2347737, 5259188, -3039226, -3791383, +4510253, -417149, -97174, 164283, 1549946, 1125281, 3789235, -1061931, 1760937, -2309082, +-2179696, 178241, 1016834, -152471, 67646, 879931, 940598, 734439, -1966021, 2207613, +-461172, 3546569, 1509144, -3982509, -3751654, -4267587, -664109, -3483755, -7330973, -6988449, +7218767, -158377, 1524713, -54224, 4399657, -6499896, 9663676, 8576513, 450435, 457414, +19327, 255014, -947577, 3358665, 2619393, 212601, -5490579, 2382633, -1699196, 2643552, +-760209, 5857262, -1358283, -3408594, -1538672, -919123, 2176475, -36507, 3628174, -5815386, +3141769, 1014149, -3221762, 9152038, -1447404, -1310502, -186294, -142808, -2406792, -779000, +4890894, 3998615, -8571144, -4046396, 4366908, 1255741, -2045478, 7463043, 279173, 1672890, +7354595, 3034395, 5775121, 1629940, -2209224, -2996277, -5765994, -5593121, 819265, 2976949, +7157563, 272730, -2909304, -3648575, 1250909, -67109, -1990717, 2320893, -799401, -1835025, +1680406, 3875671, 1263257, -1943473, 1949915, 2018635, 2538326, 1624035, 135291, 241592, +-2393908, -504659, -25770, 1230508, 1044751, 1974074, 1916629, 1585917, 609885, -155693, +-9784472, -3417183, -4757750, 4440996, -3248069, 2882997, -3512747, -1459752, 8306467, 4052839, +-5506148, 2508798, 7922604, 1155346, -2771865, -5565741, -6675990, -4584878, -6713034, 4454418, +1017907, 2448668, -1285806, -3045132, -3204046, -5922223, 310848, -188442, 1408749, -1447941, +-5378373, 82678, 5750425, -1278827, 68719, -2869038, -5729487, -8485782, -727997, 6107444, +2223183, 638876, -2874407, 777926, -4600447, -1511829, -3461207, 436476, 783295, -5244692, +5916855, -3335042, 7528541, 2843268, 716186, -3424163, -1794760, 1930588, -430570, 1826435, +4041564, 817654, 1603633, -4476430, 2641405, -2252174, 6920266, 8566849, 3932043, 5756330, +2681670, -882079, -6011344, -3885335, 496069, 4427575, 4465692, -3575560, 469225, 4207458, +-5505611, 5434744, 348966, -2792266, 1792612, -1173600, -263604, -3105261, 609349, 877247, +535797, -2491618, 659814, -1761474, -2335925, -818191, 165893, 1029182, -1524177, 374736, +-660888, -2167348, 231928, 1782948, 748398, -1552094, 1003412, -1168231, 3275986, -7900593, +1037772, -8448201, -37581, 1298691, 785979, 3816079, 382252, 609885, 14949171, -1869385, +-6602976, -7115150, 7509214, 5037460, -5665062, 1376537, -6317897, -2700461, 212064, 7158637, +-8864812, 2593087, -345208, 1422171, -674847, 9087614, -4693326, 2570001, -1418413, -2392834, +1382443, -425202, 2724620, -2767033, -2576444, -7670275, 1207960, -2538863, -1649804, 621160, +-2716030, 2279017, -4329327, -2565169, -7619809, -215822, -6764574, -2842732, -8046085, 5997922, +1221918, -2453500, 5267241, -6084895, -22549, -11609297, -616865, 4038343, -307627, 3465502, +7408819, -2576981, -1030792, 9278740, 3918621, 3596498, 5665599, -2902861, -8543227, -883690, +-5108864, 3764539, 8540006, -1508607, 2517388, 4564477, 3835943, -425202, -697932, 1085553, +183610, -1545651, 2318209, 2090039, -3527242, 1214402, 3022583, -1472100, -1056025, -5237713, +-1196148, -2181844, -700080, -2264522, 494995, -519154, 445603, -197032, 393526, 1402844, +-1517197, 593779, -600222, -1540283, -173946, -223875, -439697, 164819, 946503, 1544041, +-1428077, 566399, -1200443, 271657, -97174, -1603633, -607738, -1076426, 4223027, 4776004, +1727114, -2874944, 2066416, 1255204, 9092983, -1377074, -1955821, -12259447, -3469260, 9233643, +9004399, 5803575, 4562329, 13140452, 807454, -15670188, -4024921, -2602213, -3803194, 8370892, +-1330903, -3030100, 9740986, 1534377, -4024384, -1384053, 3885335, -3448859, -1372779, 1200443, +-1251983, -5451924, -2483565, -246424, -5285494, -2408403, -2223183, 3695819, -2484639, 7109782, +6895570, 681289, 6558952, 4616553, -2971581, -999117, -2257005, -10180683, 1140314, 2115808, +-9701257, -1380832, -2754148, 3484292, 8853538, 1361505, -8989367, 1333051, -3468723, -6041409, +4897874, -1402844, -6439767, 2933463, 2473364, 7128572, -571768, -864362, 5236639, 6214281, +6811818, -6978785, 4937602, -873489, -1191317, 1860795, 7354058, -306553, -1967095, 2352032, +1118302, -6213744, -825707, 8594766, 1887638, -521302, -1077500, -3837553, 2757906, -1388348, +-1760937, 325344, -256624, 2018635, -132607, -2621541, -1909650, 3609383, -445066, 1450625, +-1612760, 1770600, -1331977, -948114, -1317481, 947040, 1902671, 6259915, -16042240, 6675453, +-1748052, -3659312, -3292629, 2753074, -1519882, -9512816, -10129680, 1239098, 15810848, 4358318, +-11494943, 2597382, 9383967, -6744710, 1222455, -1701344, 5597953, -33286, 5166309, 13830332, +10074920, 6289980, -229244, -1139240, -6385543, -6843494, 2731599, -17909476, -2826625, 8496519, +956704, -900869, -8573292, -3054259, -359167, -383863, -4162897, -8865886, 9947144, -3430605, +-2173254, -1597728, -8212515, -9238475, -284005, -4505958, 648003, 4405563, 3375308, 3729105, +-7330436, -1901060, -3598646, -2288681, 11806328, -1240709, -5382131, 383326, 15138686, -8069707, +2549063, 11143293, 352724, -2554432, -5609764, 3393561, 648540, 8026220, -4310000, 6791954, +5515275, 10512469, 5091684, 7874286, 839666, -5150740, 1113470, -209380, -2967823, 4759361, +6778532, -5615670, 3702262, 2029372, -5046050, 665720, 1800128, 1418950, 1842004, -2884071, +1644436, -3161633, -948651, -873489, 227633, 593779, 1366873, 1732482, -352187, 2594697, +-187368, -1155883, 904091, 1727114, -579821, 1048509, -2697776, 1074816, 9222369, 13238700, +8085276, 1350767, -2843268, -4953708, -10998874, -3182034, 7249368, -14955613, -6142340, 13626321, +-18886044, -3415573, 10546829, 13255343, -1371168, -13310641, 1833951, -5093295, 17792438, 7893076, +-12241194, -7873749, -1893544, -7548405, -15402826, -7703561, -6841883, -5574331, -12476343, 6266358, +2199560, 7693360, -4758287, -2305861, -10976863, -1128503, -9526237, 985695, -6337224, 1394791, +3313567, -14694694, -4836670, -5598490, -3911642, 3158949, 3123515, -4696547, 14467597, -945967, +-3798899, -2724083, 1386201, -3406983, -1207960, 5379984, 4578435, 6023692, 7934415, 7532299, +585726, 4937065, -2423435, 11288248, 12073153, -6085969, -3171833, 7407745, -223338, -18336290, +832687, -9316321, 5672041, 5788006, 10354629, -7872138, 4402342, -11042898, -1082332, 6297496, +-2703682, 9841381, -2575370, -1207960, 1969243, 638340, 1373853, -659814, 571768, 4181151, +-3112241, -800475, 4019553, -626528, 3155190, -4719096, -4102768, 2767033, -664646, 863825, +433255, -567473, 721018, -2824478, -741419, -494458, -1230508, -1910187, -666257, 1493038, +1794760, -92342, -10160819, -12294881, -6022081, -11878269, -16950088, 11992086, 1185948, 6710350, +-9367861, -9747428, -13442711, -9094056, 4149475, -9970230, -8952859, 12193949, -3053722, 573378, +2948495, 6965900, -5417028, -4109210, 2011118, -3291019, 1905355, -621160, -6020471, -11523934, +-18037788, 5957657, -12956306, -11883101, 624381, -3134789, -833224, -6691022, 3023120, 3433290, +-14703821, -326418, -3229279, -5761162, -8175470, 4642323, 993748, 14688251, 1752347, -8252780, +-513249, 1357747, 6060736, 2529736, 13030394, -1127429, -14179835, 6060736, -3009162, 6396280, +-8478802, 1840394, 4811437, -25080998, -11909407, 8854612, -770410, -2700461, 3850975, -1285269, +15833397, -566936, 10027675, 8704288, -12834436, -14904610, 867047, -16510928, -379568, -824634, +333934, 2389076, 10342281, -372052, -6495065, 5919539, 7782481, -7274064, 1275068, 2330020, +7828652, -3836480, 274878, -3890167, 2647847, -224949, 1657857, 2593087, 4218195, 4258997, +-129386, -4112431, 183610, 3025268, 952946, 626528, -3747896, 397821, -3753802, -560493, +2032056, -613107, 3688303, 2728915, -157840, 770410, 2986613, -2782065, 5267241, -118648, +-2309082, 2355790, 8559870, 35158604, -8695698, -23583128, -2152852, -10304163, 25499220, 1992865, +14262513, 7750269, -4498442, -11282342, -5114769, -12294344, -3213709, 17214766, -19205484, 831076, +-15676631, 4262218, 1255204, 7653632, 1721745, -7478612, -12712566, -14747307, -2783676, -14467060, +-11384885, 1874753, 3332358, 10790568, -10115185, -20985748, -4440460, -7275138, 2481954, -9856950, +-6709276, 3046743, -5294084, -8338142, -606127, 930934, -4308926, 20487530, -4231617, -3340948, +5136781, 5366562, -6106370, -2562485, 15113990, 12721693, 8308614, 15992848, 12482249, 44560, +5214091, 9094056, -6771553, -6324340, 1843615, 6558952, 10606422, 4376572, 21544092, 2384781, +14443438, -4078072, -8359617, -5359583, 30586072, 5456756, -3978214, -3670050, -10991895, -10493679, +-7577396, -7352447, -8798777, 3533684, 7049652, -7473243, 2408940, 7625715, 3779571, -6898791, +1403917, 7778186, -1941325, 4313221, -3872987, -1069447, 1737851, -1297080, -869194, -2310156, +-4946729, -755377, -4480188, 2391223, 3753265, 1930051, -3735011, 4980015, 3225521, -2732136, +-3263102, -5051419, -1505386, -1384053, 1336809, -1091459, 2363843, 1772748, 443992, -478352, +89121, -4026532, 1690607, 6812355, -30944702, -11268920, 15279346, -3518652, -15878494, -14592688, +-5120138, 16877074, 8762807, -13286481, 7306813, -17734456, -7480760, -2004139, -11887396, -15917149, +13370770, 7563975, -14442364, -4904316, 30726196, 7302518, -13759465, -18648748, 264141, 10244571, +1666447, 1862942, -21562346, -511101, -2471217, -15336254, -9043591, -6119255, -12403329, -5749888, +3570729, 590558, -13086765, -12960601, 1657321, 8315057, -224412, 11106785, 18422726, -12859669, +11416023, 8710731, 3629247, 2580202, 13889924, 4422206, 8565239, 5817533, 7720204, -2514703, +-1671279, 15939161, 24795920, 4186519, -5766531, 3118683, -3564286, -9315247, 15782394, -7637526, +-13298292, -20956756, -7225746, -24432996, 12257300, -9923522, -4225711, -1359357, -3520800, -8741332, +-1462436, 9824201, -11150809, -919123, 5157719, -3141232, -10872173, 5527623, 901406, 3103114, +-711891, -1227824, -3879966, -363998, -2004676, 5895380, 1549410, 1676648, 963146, 1970316, +95563, 3034931, 2030446, 5234492, -7219303, -784905, 616865, 4862977, -1962263, 4064113, +-4342749, 1574642, 1087164, -877784, -2392834, 4262755, -1886028, -263067, 2441689, 817118, +261456, -5805185, -13565117, 11527692, 6928319, -2055679, 7719667, 5714454, 16422881, 12638478, +-26656714, -8862128, 29672318, -23380192, -6886980, -14168023, 21150566, 9400610, 9758166, 4093104, +3118683, 8450885, 22437446, 10661183, -9848897, -202400, 765578, -634581, 8897025, 9968619, +1236951, 5896990, 5667210, -5149129, 6969122, 4167192, 13874892, -6655052, -13295608, -11443940, +-8888435, 2635499, -1135482, 5286031, 6030671, 6036040, 12222403, -5350456, 2598992, -5392869, +-9486509, -3853660, 1035624, -10964515, 14031658, 16949552, -18396418, 6277095, -12736726, 10420664, +-2062121, 4050154, -1376000, -10198937, -2462090, 11727945, -9154186, -2825015, 2097018, -18808736, +-7169374, 3939022, -14529874, -1012002, 23293218, 11573863, -1553168, -5329518, 18588618, 4876399, +13390097, -4208531, -5989332, 19390704, -6571300, 6051609, 2592013, 2753074, -3985193, -2927020, +-3562139, -2472291, -6519761, -4032974, -4541928, 650688, 4202626, -1547799, -9160628, -2947958, +-1260036, 1032940, -277025, -2285460, 42950, 2583423, 4478577, -3576097, -106837, -9888088, +1675037, -1235877, -1866700, 6665789, -117038, -646393, -3935264, 4075924, 1120450, 6037114, +-2063732, -357019, -4051228, -447213, 18521510, -1506997, -4325569, -15394773, 652835, 1467805, +-4153770, -325881, -7161321, 2708514, -22139482, 20195474, -4100620, -7141994, -14021458, -15804943, +-1655173, 19266686, -3515431, 5342940, -11926587, -6871948, -3345780, -11583527, -14010183, 12790949, +-7925289, -6432788, 11310796, 11026792, -15611132, 5436355, 5870684, 13502840, 11125039, -4068408, +-9889699, -6219650, -15181099, 16680579, 10945187, 5539971, 11870753, -12314745, 8410083, -1785096, +7707319, 8571144, -8091719, -634581, 27118424, 22754200, -17226040, 6890738, 14067092, -10828149, +3330210, -25365540, 7575249, -13724031, 11320997, -7961796, -8795019, -6199786, 30258044, 1731946, +-8846559, 2686502, 10160819, 1339493, 6034966, -16317654, -1880659, 27197344, -915902, -10681047, +-16655883, 514322, -12334609, 7686918, 7822746, 9506373, -17011292, -17743584, -4758287, 2987150, +5814312, 1852742, 70867, 435402, 6446746, -4353486, -1767379, -1348083, -2881386, 3187403, +2680060, -5427228, -3759170, -8337069, 5077188, -3058017, 2206540, 3651259, 5345624, 4267587, +1821066, 8375723, 510564, -1952063, 3989488, -6223945, 3454764, 2410551, 1682017, 5543729, +5918465, 1100049, -845572, 3503083, 377420, -537945, -6575058, -8588861, -1648194, -663036, +-1087701, -16742856, -868657, -1991791, 4880157, -24310588, -11260331, -13619878, 11486890, -5768141, +17092896, 10424959, 21763136, -10776610, -913754, -17056388, 14504641, 26466126, -8246874, -20946018, +2043868, -4242891, 32416266, -7939247, -12734578, 12412455, 6802155, 5228049, 12202539, 4212289, +-40770512, 205622, -2747169, 15976205, 28619514, -26985816, 1060320, 8174397, -12983686, -2566780, +-36968932, -8303783, 18838264, -30351998, -18211736, -9271224, -11911018, 12191802, -7377680, -10772315, +16279537, 5018133, 5931350, 16858284, 1840394, -5713380, 11939472, 17686676, -17149268, -12706661, +26209502, 18095770, 6077379, 8396661, 6188511, -11733314, -17044578, 46708, 219580, -3435974, +5361730, -10245644, 7315940, -14215805, 5789079, 33410014, -15524696, -12753369, 18332532, 5354214, +-6249178, 11672110, 16112570, 12050068, 14238890, 7128035, -7243463, 5946919, -17581448, 9468792, +3980361, 5039608, -8922258, -2591476, 1864553, -757525, -1783485, -2603824, 5769215, 11367168, +-4414153, -10835129, 6919193, 13135621, 6820408, 5211943, -15465640, 9441412, 1005022, 5143224, +-2480344, -5218922, -1235877, 7971996, 719407, -1382443, -6673306, -471910, -3891240, -1845225, +-3084324, 3590593, 7460895, -4411469, 295279, 4786741, -1844152, -742493, -4076461, 821413, +-2731599, -2965675, 9670656, 8733279, 14242112, -32988570, -60928408, -28082644, -4271345, 20737712, +1468342, 22868554, 21125334, -6389838, 3424163, -5175436, -11587822, -19051402, -11087458, -13752485, +-7998840, 21725018, -28238336, -4909685, -23535348, -29190746, -5112085, -29460254, -23703388, 2902324, +-6201396, -3400004, 5360656, 25853556, 1804960, -18762028, 1069447, -2250563, -5645198, -24363738, +-1597191, 29041496, 2686502, -495532, 11766600, 22561464, 15187541, 3946001, -9188009, 7866770, +-7718056, -20679730, -37922952, 36074504, -4566624, 30051350, -2530273, 399969, -10799158, -17364552, +31679142, -18000744, -14626511, -1520955, -23082228, -21686364, 18031346, 13224204, 6940667, -2301566, +9185861, -16013786, 6231461, -12995497, -18344880, -20022600, -15614890, -6438156, 15515032, 987843, +5576478, -9262634, 5494337, -12119324, 8833137, 6860674, 6293738, -3946538, -497679, 7817378, +-2118493, -9453223, -7124277, -9357123, -799401, -6905234, -1588601, -2423435, -2505040, 2767570, +1147293, -3710852, 1619203, 4923107, -1277753, -3118146, -7314866, -47782, -5018670, -680215, +-795106, -3471944, 8587787, -8027831, -7507603, -3543348, 4575751, -7104413, -7137699, 1040993, +-5959804, -27380, -1031866, 3370476, -743029, 1145146, -4796405, 1972464, -9982578, -5036386, +-1467805, -21164526, -15495705, -23486492, -242129, -22465364, -26086558, -4413616, -11917461, -28652264, +-39670464, 4494684, -15010374, 7315940, -2858301, 14875619, 33423972, 1688459, 3463891, -16959216, +-18142478, 15108084, 8449274, -12283070, 74088, 9853192, -22597434, -17393544, -1207423, 28680718, +-24647744, 320512, 609885, 13198971, -21046950, 21949430, 11552925, 6213744, -548682, -9155260, +-24424942, -258235, -5822902, 8833137, -13239774, -32455458, 26767846, -19559282, -8682813, -1372779, +26197690, -19908248, 9214852, -16354162, 10167261, -5929739, -24021752, 11502459, -30616674, -6774237, +-8756365, 10703595, 25174950, -14546517, 9351218, 25458956, -20341502, 3360812, 6201933, 5979132, +7577396, -37153076, -11069204, -6292127, 13429826, 2808372, -1074, 6784438, -6470905, 14826227, +-2641405, 3375844, -14221174, 12374338, 3245385, -22900228, -10378252, 10784663, 13569949, -1910724, +-3356517, -8957154, 12724914, 1596654, 292058, -23818278, 3974992, -11457362, -17942762, -5453535, +-3539053, -2320356, -10513006, -13662291, 5012764, -3142842, -6620155, 3936875, -1267552, -1952600, +908386, -3652870, 1415192, 7379828, -13774497, 1410360, 2734821, -4567161, 10136123, 9336185, +10736344, 4275103, 6532109, -6674379, 2911451, 361314, 3177202, -3024731, 272194, -186294, +4576288, -2682744, -6071473, 43771084, 4236449, 18607946, 49758268, -23159000, -13325136, -19375672, +-7500624, 23212688, 1309965, 28543816, 7420093, -847182, -10788958, 21608518, -13561359, 5046587, +-9130027, 9017284, -14354854, 16500191, -8156680, -3652333, -9537512, 12720083, 8404714, -13676786, +-3495030, 13381507, 3793530, -8728447, 682900, -11271068, -37734508, 16422344, -19922206, -28722594, +17638894, 8043400, 19093278, -1680406, -18995566, -6901476, -5233955, 11330661, 14774151, 16771310, +27578522, 27523224, -12359842, 3896072, -29207926, 408022, -21321292, -37629820, -3912715, -30661234, +9783936, -24467354, -16375637, -16171626, -23243826, 2382633, -5659693, 2037962, -7054484, -2816425, +-2204392, -39818104, 6184753, 6154688, 8917426, 19245212, -3805341, -31646930, 18194018, -20469278, +11697343, 11791833, 25740812, -13992467, -13059922, -8449811, -5199058, -18351322, 7231115, 4326643, +2183991, -4342212, 6381248, -9129490, 9206799, -1466195, 1813013, 2836826, -11500312, 8590, +4345433, 11335492, -3067144, -6717329, 4846334, 7871065, 9565966, -5971615, -16106, 5471252, +-734439, -978179, -3659849, -7104950, 4992900, -74088, 3169686, -3942780, -615791, 6646462, +-4420058, -6681359, -3921842, 1120987, -2920578, -11787001, 19014894, -4784594, -3966402, 1709397, +3612068, -3132105, 3470871, 4625680, -1901597, -470836, -2617246, -3830037, 31152472, 58289148, +-31998580, -25845502, -45173928, -91829088, -22741852, -9621800, 20497732, 12404402, -7974144, -17723182, +25060598, 30662308, 2624762, -1484448, 141734, -24228448, -14318884, -17184164, -13228499, -25628070, +-381715, -6475737, -3129421, 17579838, -24101208, 19286014, 18060338, -5648419, 9281961, -1059246, +-42859480, -30514132, -17062832, -15599321, -7218767, 3381213, 16472810, 5349919, 8839043, 41352480, +37568080, 8515310, -27975270, -14535243, -1253594, -14365055, -26530012, -66125852, -55605868, -24996710, +-5994164, 2729452, 14439680, -45870788, -26468272, 23790360, 27567784, 33143188, -30238718, -36666136, +11915850, -22365506, 54385024, -27431420, -3157338, -16139413, -8761196, 7524783, 16073378, -8019778, +-21530672, 19987704, 19356344, -4378719, 22177064, 19739132, -43123620, 38585448, -25010132, 134218, +-7369627, -25753698, -7245073, 13065827, 9715753, -2077690, 5029944, -15697569, 353798, 7919920, +10653666, 16839494, -12637941, 2575907, -3616899, -6838662, -17890686, -2174327, -17235166, 15220827, +-2809446, -18289582, 2912525, -20952998, -1409823, 2553895, -4875862, -9050033, 614180, 1704565, +2193118, 6868727, -1301375, -298500, 12233141, 4014721, -12348031, -14127221, 3855807, -9363029, +-19967840, -6830072, -18784040, 6199786, 5935108, 14779519, 2004676, -15200963, -10908680, 10790032, +54786064, -18260590, 17663054, -770947, -24383066, 3764002, -49229452, -11090142, 10584410, 966905, +-28655484, 16961362, 50190452, 35205848, -15529528, -31428424, -13381507, 3530463, 52741124, 7093676, +1330903, 199716, 24387362, 25071334, 6556805, 19167366, 15547782, 29473676, -8398272, 3363496, +18833432, -17188996, -26161182, 14694157, 43274480, 9375377, 20972326, 2007360, 12875775, -57930520, +10721312, -2268817, 13084081, 56785372, 22915798, 7674033, -5640366, 25445534, -5814849, -11940009, +8992051, 15810311, 33421288, -10780368, 20770998, 3777424, 5759551, 13145284, 16908750, -534723, +-22141094, -13745506, 5170067, 42828340, 29335700, 22785876, 24674588, 20656108, -5931350, -53048752, +-38113004, -72768560, -1030255, 22178138, 41872172, 6513855, -30569966, 10085657, -18927920, 6062883, +14447196, 4367445, -8880382, -4922033, 128849, -4111358, 11707007, -8053601, -21189222, 396748, +7012071, 9404368, -13721347, -6219113, -25491168, 6302328, 11033771, -9785546, -8825621, 6358162, +-5037460, -6297496, -5559835, -19791746, -4306242, 20402706, 12720083, 18472654, -10027675, -20919176, +-15575699, 13568875, 10634339, -4930623, -1006096, -1278290, 3717831, -5888937, 12168716, -13958644, +-7978976, 969052, 2218888, 8035347, -17350058, 3561065, -12778601, 33640332, -9990631, 7335268, +-11106785, 3878892, -20858508, -8732205, 44769128, -1823751, -20946556, 5119064, -4068408, -17020418, +-13842680, 2493229, 23553064, 64255396, 28704340, 56952340, 29635274, 25293062, 23938000, -16954920, +-14346265, -16224239, 6949257, 46664820, 14841259, -39041788, 16640314, -41975252, 20802674, -26634702, +-5847061, -23387708, -25300578, -1243930, 3030636, -411780, -31607202, 40862856, -8514773, 15325517, +-39922256, 10584947, -9443559, -12283070, 20379082, -16916802, 40968620, 4799089, -16454020, 2063195, +-12450573, -16928614, 11370389, -27965068, -6212134, 35014184, -7881802, 14297946, -2121177, -25472378, +27632208, -15067819, -58098024, 7154342, 4110821, -283468, 6141267, -8029978, -11513734, -3288871, +25956098, -49784576, 29148870, -11778411, -7166153, 32670206, -20382842, 9567040, 11826192, 47452948, +16291885, 20944944, -3620121, 28333900, -22932978, 22462142, 3445638, -8759586, 5778879, 1296006, +681289, -12326556, -3437048, 2128693, -5477694, -9244917, 19054622, 259846, -1636383, -5760088, +6185290, -7643431, 16958678, 9935333, 9002251, 2056753, -334471, -1715303, 14153528, -11623255, +-15038828, 5603859, 7301982, -795106, 12681965, -5642514, -2844342, 558346, -4653597, -14486925, +-14642617, -1460826, 4576825, -7259032, 2251100, 4492536, 4898410, -3997541, -585726, 9319542, +-13623099, -24177444, 39688184, 36976448, 128737352, 52049100, -70138960, -32889786, -34357592, -53830436, +37567544, 115807888, 46342160, 22031034, -29013040, -7915088, -1941862, -1292248, 55576340, 38143068, +24253144, 83699784, -100140384, 6597607, 52366388, -12608413, 10777684, 54943368, 9632001, -15581604, +29603598, -55146308, -110787608, -10485626, 10902238, -42881492, -4858682, 59466508, 10028212, 3588982, +22584012, -46783468, -95454040, -87126096, -39672612, 28950228, 56761752, 125801200, 31594316, -15969762, +-15792058, -33964600, -75163000, -22742926, 55020680, 55458764, 58083528, 56726856, 35562328, 29591788, +8554501, 12994424, -48297980, -29582124, 7194607, 13612362, 24776056, 30447560, 74711496, 19653234, +43486544, -28527710, -28229746, -50608672, -11020349, -38687456, -9250823, 77973520, 100024416, 2240362, +-4054449, -62228172, -71832256, -40390948, -17080548, 39961448, 21242372, -4318053, 14816563, -5479842, +-10284299, -18753438, -17803176, -2348273, 4505421, 3718368, 21965000, -1571958, -496606, -11232950, +356482, -13991393, -4730370, 51540, -20671140, -9294309, 411780, -5637145, -1481764, 12079596, +10704669, 25223270, -11143830, -4583267, -25596394, -20706574, -15734076, 26125750, 16543140, 8188892, +8652748, -8114804, -22742926, -18330384, 789737, -12926778, 22186190, 32952600, -8517457, -91468304, +-57002804, 33371896, 86161872, 101055208, 209268528, 128189208, 86421720, 77004472, 59290412, -10017474, +-91162832, -99053760, -193261184, -204773840, -194810048, -123944704, -43750148, 43570296, 74320648, 124753232, +121874528, 86133960, 84371408, 108649784, 103573672, 93591632, 58783068, 41459320, 35929548, -3372086, +-6679211, -119639000, -85850488, -107017160, -130326488, -54338852, -127279744, -102146136, -187348624, -163325264, +-116372136, -77200960, -11916387, 97542464, 117423872, 99558416, 105678744, 98485744, 181598736, 237217488, +211356416, 210297712, 184953632, 179213952, 132652216, 133264784, 28134720, -89485640, -187132800, -178376432, +-267623712, -222709088, -324954016, -386380096, -343978016, -326083040, -196828688, -136566544, 24632712, 65036544, +152207200, 227101760, 349377344, 303155424, 436951168, 377958208, 270214112, 266318576, 120735288, 8944269, +-24729884, -94681480, -165959680, -197671568, -236801408, -204694928, -186028448, -178929408, -145939760, -149774096, +-123605936, -108258408, -33475512, -23013508, 29337310, 69844224, 79685600, 104644728, 148240800, 180031072, +191355296, 200879920, 146976464, 122148872, 117831888, 43910136, 28419262, -66788888, -160451392, -212955216, +-218491424, -243868784, -155523984, -176704080, -118485264, -85106928, -24205898, 42155104, 82562160, 126500744, +130667400, 197745120, 202465840, 195067744, 164701792, 148314880, 58227408, 14848776, -37970732, -84294104, +-161159520, -189090768, -157872256, -106834088, -95185600, -66264904, -61289720, -32001264, -5160403, 7349763, +4319127, 27973122, 31084826, 50520088, 42119132, 39662948, 36180268, 42039140, 28331752, 27146340, +29990146, 30527016, 11153493, 3393561, -7248831, -1510218, -4686883, 2255932, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -5173288, --13850196, -1168231, -2212982, -1891933, 205622, -2310693, 863288, 1357210, 5676336, -1917166, --228170, -5236102, 386010, 5262409, 366683, 3803194, -1122597, 1596117, -2198487, -3307125, -111669, 3615289, -463856, -4532264, -186294, 4386236, 1431298, -1881196, -1564979, -208306, --601832, -1027034, 54761, -744103, -1506997, -194347, 904091, 612033, -196495, -3453691, -5136244, 6989523, 230318, 811749, -2819646, -1607392, 561567, -3653407, -4043712, 2419140, --3282966, 2390686, 3110630, 3086471, 1168768, -470299, 847719, 643708, 2344515, -5027259, -447213, -651224, -3643206, -4951024, 160524, 2469606, -1868311, -264141, -557272, -351114, -3506841, 1727651, 486942, 1364189, -1117765, -4074313, 1604707, 658204, 3510599, -4188667, --3149285, 2361158, -1848983, -873489, -3093450, 705448, -1806571, -1703491, 69793, -1365800, --1457605, 408022, -774705, -376883, -1662152, 1044214, -179852, 98247, -420907, 853088, --129923, 276489, -270046, -266825, -12686797, -2997887, 4943508, -763430, -3901441, 1595580, --9404905, -3697967, -1354525, -1771137, -4859219, -5214627, 2791729, 4199941, 3682398, -4881767, --7074885, 731218, -4137664, -7637526, 1743757, -552440, 2153926, 8432631, -2787971, -969589, --5359046, 7276749, 579821, 3595425, 2544768, 5961952, 3080029, 1794760, -5974837, -749472, --5492727, -1588601, 252329, -2381559, 1861332, 1492501, -2592550, -5178657, 3266323, 5258114, -1510218, -2604898, -3934190, -2514703, 1275068, -4507032, -5614596, -1665374, 2795487, -1617055, -1384053, 3475166, 2245194, -2688113, 5138929, 400506, 4378719, -3716221, -3068754, -1840394, --2139968, 2994666, -1704565, 128312, 5188321, 1790465, 141197, -4949950, 1347009, -2003602, -3643206, 5227512, -897648, 390305, -2395518, 1954747, 4655208, -1690070, 2906082, 1272384, -628139, 2350958, 965831, 78920, 1921461, 687195, -138513, -23622, 858457, 738198, --844498, 609885, 658741, 947577, -2592013, 3271691, 4522601, 1822140, -2815888, 1967095, --1316944, 1361505, 8497593, 5231807, -7159711, 4862977, -3935801, -1950452, -1028108, 139586, -3617973, 132070, 9936407, 2864743, -3801583, -2507187, -2464238, 6987375, 1653026, 6729140, -2216740, 4529043, 7031935, 8051990, 3071975, -914828, -798864, 1210644, -6451041, -6013491, -1925756, -4566624, 2597918, 1240172, -1540820, -679142, 1898912, 6717329, -2198487, -2291365, --3452617, 8582418, -1157494, -10719165, -5339718, -4254702, -3892314, 4417374, 4257387, 3731790, -5602785, 2476586, 3513283, -164819, -332323, -166967, 5634460, 1821066, 3307662, -7464653, -492311, 334471, 408022, 483184, 3248069, 2262911, 944356, -3622268, -3593814, 2081449, -1745367, -1073742, -220654, -2920041, -3694746, -3033321, 2062121, 3570729, 442382, 197032, -1253594, -1047435, -125628, -830539, 653372, 622770, 379031, -505196, 1080184, 1708860, --248034, 160524, 385473, -284542, 460098, -719944, 1260036, -1074, -236760, -820339, -1114007, -2172180, 1224066, 345745, 922881, -169651, 18855980, 4178466, 2876554, -2253247, --1306744, 1875290, 1321239, 5076652, 6655052, -258235, 9797894, 3955665, -3455301, -3186866, --247497, 4736275, -552977, -2508798, 5185100, 778463, 14128832, 3750580, 2796561, 633508, --1365263, 718333, 2137283, 2792803, -642635, 82141, 7580081, 1114544, 8344585, -4143033, --4013647, 2808909, 12530030, 3686693, 3025805, -1029718, -5422396, -2072859, 1692217, 430570, --126702, 518080, -7693897, 603980, -3387119, 3140158, 2423435, -2975876, 1766305, 2759517, -1809792, -3551401, -3715147, 947577, 1309428, 75699, -4775467, 1313186, -1861332, 3127810, --444529, 663036, 1939178, -667331, 1069984, -1633698, 520228, 11070815, 1242319, 3969087, -127775, -2957622, 1803886, 729608, 3404299, -6044630, -4267587, 2167348, -900869, 1333051, --1596654, 2407329, 1951526, 324270, -2712809, -945967, -3689914, -576599, -850940, 2450816, --1703491, -368830, 398895, -242666, -889595, -802622, 686658, -856846, -1241246, 73014, -43487, 753230, -2499134, -880468, 628139, 453119, -2720325, -568009, -185220, -3400004, --397284, 2777233, -4158065, -721555, 4229469, -2142652, -6557878, -42950, 10821170, -752693, -8495982, 4348118, 11752641, 1410897, 1100049, 4266513, -3300146, -7017440, -9210557, 2159295, --4686883, 10821707, 6204617, 7640210, -1428614, -3202435, 970663, 1700270, 3595425, 10123238, -1230508, 4205310, -4619238, 3208878, -3273302, 1362042, -1757715, 3313031, 5823439, 756988, -5564667, 2005213, 2793339, -1637993, -1324997, 7385733, -1717450, -1892470, 5604933, -3382287, --300648, 759136, -2433099, -3285650, 2488397, -3763465, -698469, -4794257, -10122701, -1183264, --1529008, -314069, -10549513, -4083977, -3213173, -2789045, 3979824, 10349797, -2642479, 3286724, -5449777, -1577864, 1030792, 858993, 624381, -3854196, 4144107, -4873714, 1260573, 3388192, -9754944, 2978560, 2890513, 815507, -126165, 2868501, -3524558, -105227, 2012192, 876173, -172872, -4027606, 2354179, 2796024, 2890513, -631360, 2150705, 1087164, 604517, 1874216, -1130113, 144955, 1105417, -364535, 855772, 461709, 719407, 1038308, 1412507, 1580548, -1156420, 1025960, 1253057, -850404, 1131724, -13722957, 1202054, 7348689, 3891777, -7707856, --566399, 340376, 1826435, 2795487, -429497, -6008123, -5720897, 864899, 9724343, 4590783, -5770826, 9745281, -6605660, 6943352, 12911745, -1222455, 2917357, -7357279, 2521146, 2598455, --6270116, -3426310, -1346472, 2922188, -6335614, -8425115, 1612760, 861141, -7170985, 507343, -2278480, -1535451, 15305116, -945967, -10823854, -820339, 3758097, 8526047, 3190624, 3771518, --6934762, 1825361, 2209224, -6296959, -391916, -1159104, 10633802, 6391985, -1748589, -3758633, --8211441, 3430605, 3312494, -4975720, -152471, 1850057, 3233037, 3182034, -4175782, -243203, --900869, 9835475, -8361228, 898722, -2169495, 8840116, -632971, -2328946, -3752191, 987306, --3883724, -9276592, 263604, 6808060, 2089502, 4213363, 1095217, -3436511, -1299765, -1806571, -5925445, 2202781, -1600412, -369367, 5381057, 3867618, -1510218, 424665, 852551, 1005022, --98247, 1998770, 1496796, 1160715, 141197, -909459, -340376, 270046, -768262, 97711, --1072668, -515933, 881005, 5214091, 4747013, 1668058, -3483755, 965831, 2272038, 16044924, -10657961, 7970923, 11303280, 4550518, -981400, 1582159, 4177930, -11433203, 5841156, 132607, -6279779, -4636417, -2338610, -7391639, 2074469, 12901545, -12679817, -8088497, -13480292, 6771553, --3090766, 374736, -6149857, 734439, -2308545, -6190659, 2317135, 2945811, -9598715, -1367947, -1703491, -2171643, 5024575, -13942538, -6753299, 14140106, 1391569, -309238, -1439351, 442382, --7249368, -7719130, 416612, -11203422, -2609193, 1065152, 2949032, -4849555, -1140314, 13778792, --930397, 4800700, 10256919, -9644886, -3370476, 2198487, 2401961, 1793149, -2975876, -6906845, -7824357, -919660, -7348152, 5324149, -1345399, 1210644, 2020245, -3996467, -2415919, -1720134, --3009162, -4326106, -5168457, -4991826, -6331856, -1956358, -2685428, -670015, -828392, -122407, -826781, -2639794, -2066416, 1450088, 1756105, 2850248, -157303, -1212255, -3715684, -1090922, --4293894, -2782602, -567473, 810675, -296890, 552977, -1069447, -666257, 3226057, 1213328, -2248416, -2181844, 598074, 505196, 872952, -4393215, 365072, 1292785, 49392, 2325188, --26616986, -14918569, 12118787, -4723391, -5605469, 7218230, 6423124, -11487427, -15331423, -5024038, --5429376, -5881421, -963683, -10689637, -7559143, 3787088, 500901, -14351096, -15631533, -8902393, --4220879, -891206, 8139500, -677531, -5781563, 4321274, -12994960, 295816, -520765, 456340, -4663261, 2408940, -9440875, -7276212, 5816460, 1898376, 21369610, 5112085, -6986838, 852014, -791348, 102542, 5717675, 957241, 2448668, -2306398, -4571456, 1265405, -12127377, -2410014, --5225365, -6597070, 1521492, -9862856, 11455215, -1589675, 4854924, 7985955, 2522757, 4172561, --412854, -5397164, -104153, -807991, -6427419, 8385924, -3404835, 15025406, -372052, -479426, -835371, -4067334, -8076149, 2425046, -6307160, -2745021, 9016210, -11599633, -11132555, 7421704, -7330436, 6032282, -9408126, 6759742, 3022046, 3886409, -138513, 1627793, 2030446, 5228049, -2445984, 1185948, 4138201, -659814, -81604, -3390340, -2367601, -652298, 2877091, -3630321, -652835, -530428, -1882806, -1395864, 1078037, -4634270, -2570001, -3488587, -404264, 1328756, -166967, 3216931, -926102, 3371549, 501437, 1175747, 754841, 2583960, -1899986, -1826435, -5506148, 19712826, -10964515, 9351218, 3972845, 6951942, -2716567, -10838887, 1632088, -2887292, --9976672, 20339892, -1345399, -5731097, -20018306, 12300786, 3524558, -284542, -7423851, -8759049, -321586, 20654498, 7800198, -867583, -1957431, -8951249, -7152731, 5917928, 2729989, -7016366, --4811974, 7165079, 1887638, -363998, 6292127, 9498320, 1581085, 12559021, 14397267, 8624831, --3229279, 3087545, 1241782, 2294050, 7542500, -10685342, 11235634, -842887, -5611375, -8679592, -116501, 7256347, 5198521, -10232760, 2287607, 7946227, 1293322, -7435662, -15806553, -14513231, -3861713, 6298033, 1129040, -5681705, -690953, 11439645, -5235565, -8787503, -16702054, 1681480, -3303904, -12591770, 4745939, 12402792, -5636608, 9624485, 3426310, -11673721, -8534100, 798864, -11935714, -1337346, 12534862, -2273648, -4334159, 2522220, 6410776, 1586990, -2091649, -3466039, -2180770, 5529771, 4620311, 657667, 7455527, 1254131, 5357435, 1199370, 7312182, 972810, -4526359, -202937, 3621731, 1803349, -1767916, -5455682, 484258, -6359773, -845572, -2687576, -998043, -958315, -218506, -5671505, -499290, 2434710, -2683818, 207232, -639950, 236760, --353798, -4154844, 621160, 23737210, 15847892, 3418794, -4641249, -2713883, -3200288, -16558173, --6491306, -372052, 10610180, -7699803, -4080756, -3687766, 315143, 17112224, -13296145, -3762391, --612033, 7945690, -2677912, -10085657, -16480326, 5777805, -11349451, -5417028, -7034620, -7912404, -2556043, -13175349, -6200322, 11372000, 17399450, 627065, -10703059, -9810242, 16051903, -1946694, --8524973, 16475495, 624918, 858993, 808528, -18312130, 7489886, -6888054, 6701223, 5936719, --12237436, -1508607, -12416750, 4700305, -12040404, -2230699, 5181341, 6737730, -3961571, 4030290, --14637249, 9975062, -1055488, 6752763, 5895917, 4035122, -3184182, -3249680, 14766098, -10320270, -7373922, -2658585, -12422119, -7708393, -756988, 13031468, -7478075, 6019397, 1846836, -4230006, -239981, -14865419, 18658412, 11266773, -2129767, -5218386, 9175124, 3790846, -2619393, -4929012, -1090922, -3338800, 4753455, -1136019, 2525441, 7558069, 2828236, 5951214, 43487, 2012192, -957778, -1292248, 211527, -722628, 5327907, 1928440, 7373385, 1076963, -4065187, 5192616, --2099165, -305480, 4051765, -4013647, -1239098, -2190433, -1611687, 3158949, 2053531, 1568200, -6854768, -2195802, -2332704, 9341554, 1786706, -6183679, -14185740, -775242, -18437220, 3173981, -1642825, 9018894, -7363185, -1758789, 4782446, 3980898, 5260798, -12475806, 17645336, 12517145, -2306398, 9255655, -4170950, -17772038, 4197257, -7481296, -8324721, 8381092, 20451024, 3584687, --5639829, -7409356, -16403017, 41876, 764504, 25231322, -9926743, -387084, 756988, -756988, --15193984, -17136920, 13575318, 545461, 7715909, -2193118, -19420232, -11172284, 1552631, -3234647, --4106526, -5530844, 12712566, -2668249, 8258685, -8891656, 17707076, -20891258, 10352482, 10861972, -6470368, 5754183, 5243082, 16563541, 8501888, -1178969, 3531537, 153008, 16346646, 24588150, --2831994, 1988033, -7218230, 10305237, 16494822, -11254425, 3466576, -28396714, 18578954, 19218368, -12804371, 17882634, -8137353, -14213657, -1023276, -2030983, -4211216, -2950106, -8547522, -5897527, --3160559, -703838, -4780836, 2915209, 5222680, 2083059, -8032126, 1662689, -4462471, -4633196, --2966749, 3416647, 3092377, -1335198, -2000381, -627065, -1394254, 950798, -7772280, 2676838, -1124745, 5128191, 1124745, -235686, -227096, 1209033, 4403415, 1631551, -4023311, 3324305, -2684, 584652, -20667382, -3076270, -26437672, -13589813, 10413685, -10846940, -23511188, 2165737, --12674985, 564788, 463856, -15104326, -14329622, 6463389, 13855028, 4158065, -16093779, 7682086, --18103824, -6371584, -6664716, 5647882, -7434589, -3414499, 8712341, 1465658, -5952825, -12916040, -13660680, 13215077, 17213156, 2223719, -1905892, 585726, 5522254, -1324461, 7064685, -7786776, -9286793, -3677029, 10696616, 8546448, 6461242, -3131031, 454193, -16653199, 5669894, -4212826, -12517145, 2247879, -29060822, 4438312, 14339822, 19246822, -11077258, -15175730, 18139258, 8200703, -12756053, -22736484, 11236708, 28395102, 29950954, 1874753, 721018, 17005924, -11782706, -15745887, -10075456, -17430588, 6541235, -8136816, -6837588, -3877819, -37464464, -21675090, -18241800, 13426605, -5116380, 3747896, -13304198, -5453535, -10049687, -1943473, -5395553, 14674293, 3504157, -5894306, --13067975, -2954401, 8472360, -1395864, -3609920, 2554432, 8868034, -3202435, -5231270, -2559264, --1937567, -652835, 6897181, 6872485, 6021008, -6132140, 7889855, -456340, 2257542, 8957154, --4047470, -4125316, 7862475, 14048301, -3297461, -4670240, -2245194, 1632088, -2542621, -9788230, -1569811, 7028177, 1914482, -9861245, -9375377, 4345433, 3177202, -602906, -602369, -1793149, --6973953, -4754529, -15586973, -29882772, 22846542, 2407329, 7666517, -3862249, 16178605, 440771, --13810467, 10692321, 4341675, -4877472, -8337069, -6519224, 2053531, 3912715, 14331769, -8150238, -11246909, 3595425, 20438138, -29316374, -7873212, -4634807, 3775813, 11988327, 17373680, 3960497, --14110041, 9543417, 13669807, 11522860, -3216931, 4031364, 830002, -4800700, -1970316, 850404, -4425964, 1609539, 10109279, 1684701, -12745852, 11929272, -13215077, -16857210, 2626909, 12220256, --5930276, -4359392, 4439386, 5974837, 10522670, -5986648, 4992363, 23775866, -9474161, -25222196, --32690606, -16502875, -22147536, 10084583, 19234474, 12319577, 4707821, 11589969, 6806450, 12807592, --10936597, 14474577, 7517267, 5886790, 15069430, 19594178, -6080063, -4345970, 5359046, -1261647, -17626008, 6846715, -2678986, 2995203, -21476984, -15005542, 2990908, -824097, 3834869, 1473174, -4530654, -3993783, 11341398, -5960878, -6898255, -6655052, -11286100, -4076998, -2218351, 3737159, -3035468, -1667521, -9689446, -540629, 3235184, 1107565, -3875134, 2325188, 158377, 3779034, --4038343, 1697049, 807991, 4553739, -2134599, 6993818, -4282083, -4935991, 1507534, -814433, --3599720, 1184874, 4849018, 443992, -702764, 29956324, 2857764, 4731980, -6241661, 10905459, --34251292, -15067819, -23417772, -24099598, 9557376, -21024938, 20682416, 23612120, 1010391, 5152350, --3651796, 4355097, -22402550, 9240622, 24748138, -14068702, -28833190, 3853660, -10853919, -9148817, --28122372, 4909148, 10307922, -69256, -3826816, 9080635, -16041703, -2629594, 10417980, -5710696, --14216879, 1759863, -7100118, 14725832, -9736691, -5361730, 13747653, 11973295, 25391310, 3403762, -6127845, -2297271, 6816650, 9085466, 15687905, -4483409, -515396, -9712532, 20699058, -26048976, -28028956, 1038845, -11171210, 13173202, -10184978, -7460358, 25782152, -37174016, 6075231, -7810935, -7286412, -14396194, 6958921, 14805289, -7639673, -1322313, -3921842, -6121402, -3299072, 27475442, --31109522, -10583873, 52319680, -19648938, -23080618, 22689776, 13557601, 15160698, -13164075, 1088774, --13084081, -7282654, -2045478, -14904610, 3285113, 2070711, -3886946, 5439576, 4828080, -6721624, --12710956, -3215857, -1058710, 5058935, -11215770, -7822209, 310311, -1063004, 2848100, 7069516, -16673063, -7512972, -361851, -1757179, -1723893, 4858682, 1899986, -9838159, -7456600, 8032126, --6431177, 3082176, 2077690, -5957120, 2322504, -1304596, -10107132, -8225936, 4997732, 3351148, --1505386, -98247, 6359773, -14866492, -23005456, 2250563, -8738111, -7767449, -12963822, -16190953, -20411832, 8812736, 1268626, 9611600, 24179592, 14326400, -1692754, 4959614, 16243029, 20790862, --18473192, 8630200, 17352742, 7586523, 6335077, 24006720, 11523934, 5024575, -768799, 10813117, --1245004, 12233141, 10053445, 5542119, -11272142, 21237002, -17482128, -2163053, 26519812, 26281442, --6295349, -23265838, 8723079, -338229, 22744536, 39235064, 8719857, -5991480, 2729989, -22486838, --2702608, -5931350, -4882841, 466541, 19968376, -8573828, 8761733, 24096378, 4042638, -22263500, -14692546, -1125281, 9327595, 22640920, 31816580, -8977019, -8500814, -2721399, -25294674, -36949604, -959388, -16798690, -2772938, -20368346, -2144799, 666794, 2724083, 15137612, -477278, -10524280, --17565880, 12807592, -5455146, 10959683, 352724, 20405926, 7512972, 7536594, 24696, -6333466, -11405823, -8733279, -10176388, -3044058, -7664369, -2941516, 532039, 817118, -2786360, 3145527, -4444755, 380105, -1208496, 5945846, -5156108, -7229504, 4372814, 5236639, 993748, -6249715, --7576859, -4383014, 6010807, 8163659, 1017370, -1144609, 8982924, 2481417, 4258460, 3755412, -6407555, 1826972, -1243930, -4765803, 2542621, 5152887, -10643466, 24938728, -46798500, 25739740, --19685982, -46212236, -13635447, -11667816, -1594507, -10681584, 5650567, -12799003, -28562606, -17307108, --8505109, -2633889, 3332358, -11800960, 11569568, 22400402, 889595, -1426466, 6205691, 1362042, --4121021, -8337069, -4629975, 6053757, 6731825, -2000918, 6406481, 27533424, 7652558, -8060580, --27254252, -4369593, 19375672, -23510650, -10980084, -8956617, 357556, -1796370, 14904073, -4892505, -1853815, 20414516, 7364795, 22647900, -3108483, -10683731, -4829691, -5801427, -5791227, 10932302, -1266479, 7397545, 13884019, -24257438, 3649112, -6409165, -15021111, -11377905, 23795192, 17099338, -951872, -11557757, 4885526, 10034654, 1132798, 6953552, -16199543, -40240084, -18556944, -14713484, -14847165, 1528472, -1751810, -6765647, 2996277, -4502737, -12615930, -13154948, -6766184, 16341277, -12428562, -18143552, -22611392, -8833674, 1713155, 13853417, 5718212, -4344897, -5965710, -4616016, -3354370, -10019622, 1648194, -6818798, 726923, 10484552, 11263552, 3022583, -5597416, 3667365, -8166344, -178778, -1560147, 6022081, -7997229, 11458973, 10359998, 4063039, -16643, -367220, --969589, 9637370, -3558917, -4917201, -5561446, -8056822, -7834557, 2704756, -2769717, 3594351, --2106682, 1864553, 6212670, -2811593, -5596343, -8284992, -2132451, 4063576, -5783174, 13517873, --18470506, 22223234, -1764695, -35128000, 7190849, -16930224, -3486440, -2532420, -4134980, -22357990, -7065221, 1187559, 17759690, -38233800, 649614, 18884434, 2303176, -9051644, -19324668, -1476932, -11137924, 16544751, -13677323, -4855998, 8953396, 18908594, 17270600, -16594143, -3355443, -26924614, -12611098, 13737990, 8517994, -7634841, -2068564, -7284802, -2826089, -8934069, 2638184, 19732154, --7249905, -7684770, -6709276, -11090679, 22374632, 19264538, -1832340, 27102854, -1183264, 9680856, --23822572, 19670414, 8750996, -26763014, -8638253, 30812096, 12785581, 8407935, 6019934, -14381161, --11355894, -15424301, 26723286, -13721347, 20651814, 21416318, -24162412, 56078316, -11956115, 34814468, -1554778, -7776575, -14962592, 26179974, 10107669, -20154134, -12335683, -43412456, 17435420, -5883569, -20043538, -26691074, 29967598, -22852448, 8866423, -8804683, -6836514, 19785840, 1872069, 1926830, -10996190, 7773354, -5014375, 13013751, -1564979, 3884261, -8996883, 1852742, -1219234, -5614059, --9044127, 420370, -10040023, 4914517, 4342212, -2254321, 8702677, -3020973, -5214091, -7191386, -5133560, 1170379, -1202054, -14304389, 6540699, -2757906, -17351132, -5406290, 4993437, -4799626, --8974334, 6141267, -4868883, 5095442, -9133248, 4447439, -9307194, -1481764, -1394254, 5190468, --2188823, 1065152, -3018288, -3065533, 13429826, 23036058, 1910187, -19317152, 9359271, -37305548, --9893457, -33889440, -46876884, 1611687, -17996986, 6045167, -3437048, -7343321, -17804786, -12266427, -10537702, 28257126, -23489714, -5039608, -40503688, -35591856, 9868224, 14281303, -22217866, -23297514, -1517734, 5178657, -37624988, 2021856, 858993, 19595788, -16859894, 756988, 16284905, -10564009, --19563576, -21932788, -10556493, -20000588, -16353625, -20880520, 29296508, -37171332, -23007066, 33614024, --1035624, 9478993, -28099286, -4920422, -7985955, 732292, 47422880, -6730751, -899259, 4664872, -22231824, 498216, -20963198, -9324374, -15110769, 5077725, 56725780, 11000485, -19968376, 42703788, -30892626, -27466852, 31860068, 52230560, 457414, -20437602, 35576288, -6224482, 37425808, 33675764, -2834679, -1804960, -10051834, 23490250, 19143206, 10842108, -19981798, -6713034, -12901545, 29756070, --3785477, -20584168, -9993852, -20696910, -8880382, 20319490, 2311229, -10852845, -3664681, -13268228, --2219424, 18141404, -8810589, 4374424, -1835562, -17535278, 18853296, 2154463, 7562901, 9019968, --12161200, 3624953, 17322676, -3234647, 682900, -9440338, -38655, 1275605, -5706401, -5391795, -3273839, 12729746, -8266739, 4947266, -11038066, -5410585, 654446, -3823058, 12655121, -5019206, -542240, 1058173, 4619774, 261993, -6048925, 26369488, -67005784, -40488656, -43492448, -14959371, --28926068, 36040680, 13800267, 29551522, -4242891, -57256744, -8566312, 9225053, 39520140, -1671279, -9317932, 36101884, -13333726, -26197690, 2866354, -1780264, 45870252, 29698626, -14716169, -20748450, -48724256, 3404299, 24486146, 11702175, 45475112, 39106216, 30361660, 3195993, -25347824, -13903883, --19315542, 37842956, -17961016, -25836912, -13903346, 1400696, -879931, 16760573, -16240882, 6049462, --76694160, 8673150, 12119861, 12692165, -31977642, -29755534, 9363029, 27145804, -33015414, 12991739, --18699214, -14639396, -22114786, -1924145, 23810762, -15758235, 26146150, -6522982, 10355166, -47846472, --30633854, -1117228, 25660818, 17903034, -34672196, -37485400, -17251274, 3636227, 40057548, 16523276, --3629784, -27880780, -32091996, -10865730, 6960532, 28314572, -2266669, 9476845, 19107236, -7088844, -7047505, -18548354, 11819750, 6800544, -11320460, -9453223, 1267552, 14643691, -13657459, -383863, -23313620, 3795677, 3633006, 189515, -6305549, -15487115, 4291746, -17215840, 20730196, 17735530, -13617194, 1786170, -1328219, -20182052, 13205951, -3902515, 24152748, -5551245, -26616986, -16370268, --3008625, 26463440, 7730405, -5383742, -2323041, -20879446, -9830106, -8267275, -898185, 12104828, -11802033, -21050708, -11360188, -12792560, -12359305, -4377646, 4414153, -1547262, -6855842, -12727599, --12887586, 2030446, -255014, -6504728, -6391448, 11878806, 86785184, 8770323, -46380816, -104252816, --9488120, 61783640, 15496779, 26940182, -2898029, 37571836, -6378564, 16505559, -8773544, 21280490, -29998200, 16002511, -14622753, -34433828, 40446780, 45948632, -10392747, -45546516, -27751394, 4736275, -26466662, 8786429, 9465571, 1662689, 6742025, 3018825, 6682969, -8975408, -52755620, -333397, -32597728, 25045564, -10384157, 2507724, 20069846, 43918724, 27000848, 21517786, -25890062, -18124762, --4409321, -4807679, -39286604, 27804008, 16556562, 28885802, 59111636, -30421790, -19435800, -2755759, --16315507, -14221174, -25748328, 45765560, -27692876, -29985852, -30709016, -10769094, 58609124, 14935749, -22910966, -1280974, -4778688, -13567802, 36510980, 29362008, -14910516, -34189552, 11982422, -4497905, -14273250, -32056026, -12283070, -18656802, -24071682, 14772540, 24367496, 4493610, 1160715, -12921946, -7431904, -5061619, 22682260, 1780264, -7427072, -4457103, 7745437, 14382235, 16119012, -9209484, -10127533, 5133560, 5402532, -737661, -16557099, -2214593, -13366475, -5457830, 1126355, 2290828, -4971425, 4896800, 6009733, 14708652, 22100828, 19459960, -1381906, -4786741, 2892124, -9522479, -12389907, -13385802, -1174674, 10902238, -207769, -2636036, -21297670, 10901164, -21240224, 7267085, --4399657, 3480534, -1419487, 2529736, -541703, -13433047, 8040179, 6744710, -639413, 4586488, --281857, 3951370, -1297617, -3422015, -172336, -1005022, 1242319, -542777, 1272921, 690953, --4089883, -1752347, -420907, 3235184, 1342714, -843424, -2201171, -1486596, -25388088, 2558727, -66215512, 51577724, 7667591, 4229469, -36512052, -69332048, -61297772, -29513404, 49622980, 54983096, -56402048, 31751620, -8699456, -35864052, -33777772, -21657372, 13908715, 22440130, 38474316, 3819837, --29937532, -24762634, -5844914, -24812026, -12046846, 5711770, 39851392, 57629872, 36811628, 17959942, -15903190, -35756140, -4647692, -72111424, -81236088, -50437412, -24782498, -22001506, 37401112, 59403156, -65227132, 59512140, 50987704, 21476448, 3068217, -24628416, -7226820, -39790724, -71269080, -5693516, -6206765, 7060926, 23130010, 14193256, 23470922, -79211008, -43770012, -28221156, -46375984, -19369228, -33660196, -20173998, 22543746, 3304977, -21337934, 17044578, -17893370, 19143206, 21771190, -16764331, --34448324, -70183520, -68517080, -50746648, 24537686, 8883066, -10122701, 13243532, 3304441, 338766, --32900524, -22767084, -60900488, -19992000, -22686018, -2355790, 43884364, 47406776, 6556268, 24513526, --15031312, -32743220, -59256592, -38735772, -36749352, -1212791, 17635672, 10357314, 14305999, 15848429, --11218455, 9627706, -10601590, 9986336, 2124935, -308701, -2509872, 8258149, 6894497, 15712064, --3922379, -3645354, 14318884, 11638288, -119188024, -60955248, -31728534, 40125732, 9317395, 152951840, -156783488, 118181392, 152860032, 160154496, 145531744, 104460584, 94839856, 105214888, 41909216, -6241125, --65066072, -100603704, -139003936, -135078336, -201327136, -122180544, -79442936, -63131188, -89737440, -47238196, --12901008, -67286568, -52195128, -55180128, -12418898, -33139968, -11743514, -44866304, -22721988, 26733488, -27756226, 8265665, -8217883, 29133836, 23672786, -67884640, 14182519, 45878304, 100553240, 73687680, -95739656, 39223788, 38096896, 159353488, 86382528, 163068640, 54702316, 152937344, 105701832, 133520872, -180215760, 170591808, 138453632, 155343056, 172707616, 187822672, 160545872, 185144224, 126454040, 187798512, -150929984, 133781248, 142798000, 77869368, 159854928, 77257872, 47036872, -58789512, 4012573, -86831888, --97406640, -149234544, -175992192, -270794464, -264223696, -249788320, -233374032, -220191168, -185868464, -227027680, --279189504, -275581760, -228361264, -241985968, -227316512, -228361264, -194655440, -212261040, -203266848, -151865744, --167440368, -128891432, -120099096, -110990008, -70514776, -91454352, -20642686, -34062312, 15850577, 21065740, -66728224, 98288712, 103332616, 118985624, 105979928, 159287984, 180908320, 178919744, 207125872, 215965984, -214331760, 163141648, 146004736, 127811784, 118857848, 115367656, 118808456, 111309984, 85127328, 54579908, -62406948, 47911972, 37671160, 24845848, -18876382, -25119116, -25985090, -32317482, -39075076, -44471700, --30838402, -34409668, -27037892, -28014998, -23817742, -17382270, -20411832, -16988206, -16018617, -20175072, --18025978, -20480552, -15482820, -12837657, -16935056, -19777788, -6792491, -1621350, -1369558, -512175, -1505923, 8590, 653909, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-13850196, -1168231, -2212982, -1891933, 205622, -2310693, 863288, 1357210, 5676336, -1917166, +-228170, -5236102, 386010, 5262409, 366683, 3803194, -1122597, 1596117, -2198487, -3307125, +111669, 3615289, -463856, -4532264, -186294, 4386236, 1431298, -1881196, -1564979, -208306, +-601832, -1027034, 54761, -744103, -1506997, -194347, 904091, 612033, -196495, -3453691, +5136244, 6989523, 230318, 811749, -2819646, -1607392, 561567, -3653407, -4043712, 2419140, +-3282966, 2390686, 3110630, 3086471, 1168768, -470299, 847719, 643708, 2344515, -5027259, +447213, -651224, -3643206, -4951024, 160524, 2469606, -1868311, -264141, -557272, -351114, +3506841, 1727651, 486942, 1364189, -1117765, -4074313, 1604707, 658204, 3510599, -4188667, +-3149285, 2361158, -1848983, -873489, -3093450, 705448, -1806571, -1703491, 69793, -1365800, +-1457605, 408022, -774705, -376883, -1662152, 1044214, -179852, 98247, -420907, 853088, +-129923, 276489, -270046, -266825, -12686797, -2997887, 4943508, -763430, -3901441, 1595580, +-9404905, -3697967, -1354525, -1771137, -4859219, -5214627, 2791729, 4199941, 3682398, -4881767, +-7074885, 731218, -4137664, -7637526, 1743757, -552440, 2153926, 8432631, -2787971, -969589, +-5359046, 7276749, 579821, 3595425, 2544768, 5961952, 3080029, 1794760, -5974837, -749472, +-5492727, -1588601, 252329, -2381559, 1861332, 1492501, -2592550, -5178657, 3266323, 5258114, +1510218, -2604898, -3934190, -2514703, 1275068, -4507032, -5614596, -1665374, 2795487, -1617055, +1384053, 3475166, 2245194, -2688113, 5138929, 400506, 4378719, -3716221, -3068754, -1840394, +-2139968, 2994666, -1704565, 128312, 5188321, 1790465, 141197, -4949950, 1347009, -2003602, +3643206, 5227512, -897648, 390305, -2395518, 1954747, 4655208, -1690070, 2906082, 1272384, +628139, 2350958, 965831, 78920, 1921461, 687195, -138513, -23622, 858457, 738198, +-844498, 609885, 658741, 947577, -2592013, 3271691, 4522601, 1822140, -2815888, 1967095, +-1316944, 1361505, 8497593, 5231807, -7159711, 4862977, -3935801, -1950452, -1028108, 139586, +3617973, 132070, 9936407, 2864743, -3801583, -2507187, -2464238, 6987375, 1653026, 6729140, +2216740, 4529043, 7031935, 8051990, 3071975, -914828, -798864, 1210644, -6451041, -6013491, +1925756, -4566624, 2597918, 1240172, -1540820, -679142, 1898912, 6717329, -2198487, -2291365, +-3452617, 8582418, -1157494, -10719165, -5339718, -4254702, -3892314, 4417374, 4257387, 3731790, +5602785, 2476586, 3513283, -164819, -332323, -166967, 5634460, 1821066, 3307662, -7464653, +492311, 334471, 408022, 483184, 3248069, 2262911, 944356, -3622268, -3593814, 2081449, +1745367, -1073742, -220654, -2920041, -3694746, -3033321, 2062121, 3570729, 442382, 197032, +1253594, -1047435, -125628, -830539, 653372, 622770, 379031, -505196, 1080184, 1708860, +-248034, 160524, 385473, -284542, 460098, -719944, 1260036, -1074, -236760, -820339, +1114007, -2172180, 1224066, 345745, 922881, -169651, 18855980, 4178466, 2876554, -2253247, +-1306744, 1875290, 1321239, 5076652, 6655052, -258235, 9797894, 3955665, -3455301, -3186866, +-247497, 4736275, -552977, -2508798, 5185100, 778463, 14128832, 3750580, 2796561, 633508, +-1365263, 718333, 2137283, 2792803, -642635, 82141, 7580081, 1114544, 8344585, -4143033, +-4013647, 2808909, 12530030, 3686693, 3025805, -1029718, -5422396, -2072859, 1692217, 430570, +-126702, 518080, -7693897, 603980, -3387119, 3140158, 2423435, -2975876, 1766305, 2759517, +1809792, -3551401, -3715147, 947577, 1309428, 75699, -4775467, 1313186, -1861332, 3127810, +-444529, 663036, 1939178, -667331, 1069984, -1633698, 520228, 11070815, 1242319, 3969087, +127775, -2957622, 1803886, 729608, 3404299, -6044630, -4267587, 2167348, -900869, 1333051, +-1596654, 2407329, 1951526, 324270, -2712809, -945967, -3689914, -576599, -850940, 2450816, +-1703491, -368830, 398895, -242666, -889595, -802622, 686658, -856846, -1241246, 73014, +43487, 753230, -2499134, -880468, 628139, 453119, -2720325, -568009, -185220, -3400004, +-397284, 2777233, -4158065, -721555, 4229469, -2142652, -6557878, -42950, 10821170, -752693, +8495982, 4348118, 11752641, 1410897, 1100049, 4266513, -3300146, -7017440, -9210557, 2159295, +-4686883, 10821707, 6204617, 7640210, -1428614, -3202435, 970663, 1700270, 3595425, 10123238, +1230508, 4205310, -4619238, 3208878, -3273302, 1362042, -1757715, 3313031, 5823439, 756988, +5564667, 2005213, 2793339, -1637993, -1324997, 7385733, -1717450, -1892470, 5604933, -3382287, +-300648, 759136, -2433099, -3285650, 2488397, -3763465, -698469, -4794257, -10122701, -1183264, +-1529008, -314069, -10549513, -4083977, -3213173, -2789045, 3979824, 10349797, -2642479, 3286724, +5449777, -1577864, 1030792, 858993, 624381, -3854196, 4144107, -4873714, 1260573, 3388192, +9754944, 2978560, 2890513, 815507, -126165, 2868501, -3524558, -105227, 2012192, 876173, +172872, -4027606, 2354179, 2796024, 2890513, -631360, 2150705, 1087164, 604517, 1874216, +1130113, 144955, 1105417, -364535, 855772, 461709, 719407, 1038308, 1412507, 1580548, +1156420, 1025960, 1253057, -850404, 1131724, -13722957, 1202054, 7348689, 3891777, -7707856, +-566399, 340376, 1826435, 2795487, -429497, -6008123, -5720897, 864899, 9724343, 4590783, +5770826, 9745281, -6605660, 6943352, 12911745, -1222455, 2917357, -7357279, 2521146, 2598455, +-6270116, -3426310, -1346472, 2922188, -6335614, -8425115, 1612760, 861141, -7170985, 507343, +2278480, -1535451, 15305116, -945967, -10823854, -820339, 3758097, 8526047, 3190624, 3771518, +-6934762, 1825361, 2209224, -6296959, -391916, -1159104, 10633802, 6391985, -1748589, -3758633, +-8211441, 3430605, 3312494, -4975720, -152471, 1850057, 3233037, 3182034, -4175782, -243203, +-900869, 9835475, -8361228, 898722, -2169495, 8840116, -632971, -2328946, -3752191, 987306, +-3883724, -9276592, 263604, 6808060, 2089502, 4213363, 1095217, -3436511, -1299765, -1806571, +5925445, 2202781, -1600412, -369367, 5381057, 3867618, -1510218, 424665, 852551, 1005022, +-98247, 1998770, 1496796, 1160715, 141197, -909459, -340376, 270046, -768262, 97711, +-1072668, -515933, 881005, 5214091, 4747013, 1668058, -3483755, 965831, 2272038, 16044924, +10657961, 7970923, 11303280, 4550518, -981400, 1582159, 4177930, -11433203, 5841156, 132607, +6279779, -4636417, -2338610, -7391639, 2074469, 12901545, -12679817, -8088497, -13480292, 6771553, +-3090766, 374736, -6149857, 734439, -2308545, -6190659, 2317135, 2945811, -9598715, -1367947, +1703491, -2171643, 5024575, -13942538, -6753299, 14140106, 1391569, -309238, -1439351, 442382, +-7249368, -7719130, 416612, -11203422, -2609193, 1065152, 2949032, -4849555, -1140314, 13778792, +-930397, 4800700, 10256919, -9644886, -3370476, 2198487, 2401961, 1793149, -2975876, -6906845, +7824357, -919660, -7348152, 5324149, -1345399, 1210644, 2020245, -3996467, -2415919, -1720134, +-3009162, -4326106, -5168457, -4991826, -6331856, -1956358, -2685428, -670015, -828392, -122407, +826781, -2639794, -2066416, 1450088, 1756105, 2850248, -157303, -1212255, -3715684, -1090922, +-4293894, -2782602, -567473, 810675, -296890, 552977, -1069447, -666257, 3226057, 1213328, +2248416, -2181844, 598074, 505196, 872952, -4393215, 365072, 1292785, 49392, 2325188, +-26616986, -14918569, 12118787, -4723391, -5605469, 7218230, 6423124, -11487427, -15331423, -5024038, +-5429376, -5881421, -963683, -10689637, -7559143, 3787088, 500901, -14351096, -15631533, -8902393, +-4220879, -891206, 8139500, -677531, -5781563, 4321274, -12994960, 295816, -520765, 456340, +4663261, 2408940, -9440875, -7276212, 5816460, 1898376, 21369610, 5112085, -6986838, 852014, +791348, 102542, 5717675, 957241, 2448668, -2306398, -4571456, 1265405, -12127377, -2410014, +-5225365, -6597070, 1521492, -9862856, 11455215, -1589675, 4854924, 7985955, 2522757, 4172561, +-412854, -5397164, -104153, -807991, -6427419, 8385924, -3404835, 15025406, -372052, -479426, +835371, -4067334, -8076149, 2425046, -6307160, -2745021, 9016210, -11599633, -11132555, 7421704, +7330436, 6032282, -9408126, 6759742, 3022046, 3886409, -138513, 1627793, 2030446, 5228049, +2445984, 1185948, 4138201, -659814, -81604, -3390340, -2367601, -652298, 2877091, -3630321, +652835, -530428, -1882806, -1395864, 1078037, -4634270, -2570001, -3488587, -404264, 1328756, +166967, 3216931, -926102, 3371549, 501437, 1175747, 754841, 2583960, -1899986, -1826435, +5506148, 19712826, -10964515, 9351218, 3972845, 6951942, -2716567, -10838887, 1632088, -2887292, +-9976672, 20339892, -1345399, -5731097, -20018306, 12300786, 3524558, -284542, -7423851, -8759049, +321586, 20654498, 7800198, -867583, -1957431, -8951249, -7152731, 5917928, 2729989, -7016366, +-4811974, 7165079, 1887638, -363998, 6292127, 9498320, 1581085, 12559021, 14397267, 8624831, +-3229279, 3087545, 1241782, 2294050, 7542500, -10685342, 11235634, -842887, -5611375, -8679592, +116501, 7256347, 5198521, -10232760, 2287607, 7946227, 1293322, -7435662, -15806553, -14513231, +3861713, 6298033, 1129040, -5681705, -690953, 11439645, -5235565, -8787503, -16702054, 1681480, +3303904, -12591770, 4745939, 12402792, -5636608, 9624485, 3426310, -11673721, -8534100, 798864, +11935714, -1337346, 12534862, -2273648, -4334159, 2522220, 6410776, 1586990, -2091649, -3466039, +2180770, 5529771, 4620311, 657667, 7455527, 1254131, 5357435, 1199370, 7312182, 972810, +4526359, -202937, 3621731, 1803349, -1767916, -5455682, 484258, -6359773, -845572, -2687576, +998043, -958315, -218506, -5671505, -499290, 2434710, -2683818, 207232, -639950, 236760, +-353798, -4154844, 621160, 23737210, 15847892, 3418794, -4641249, -2713883, -3200288, -16558173, +-6491306, -372052, 10610180, -7699803, -4080756, -3687766, 315143, 17112224, -13296145, -3762391, +-612033, 7945690, -2677912, -10085657, -16480326, 5777805, -11349451, -5417028, -7034620, -7912404, +2556043, -13175349, -6200322, 11372000, 17399450, 627065, -10703059, -9810242, 16051903, -1946694, +-8524973, 16475495, 624918, 858993, 808528, -18312130, 7489886, -6888054, 6701223, 5936719, +-12237436, -1508607, -12416750, 4700305, -12040404, -2230699, 5181341, 6737730, -3961571, 4030290, +-14637249, 9975062, -1055488, 6752763, 5895917, 4035122, -3184182, -3249680, 14766098, -10320270, +7373922, -2658585, -12422119, -7708393, -756988, 13031468, -7478075, 6019397, 1846836, -4230006, +239981, -14865419, 18658412, 11266773, -2129767, -5218386, 9175124, 3790846, -2619393, -4929012, +1090922, -3338800, 4753455, -1136019, 2525441, 7558069, 2828236, 5951214, 43487, 2012192, +957778, -1292248, 211527, -722628, 5327907, 1928440, 7373385, 1076963, -4065187, 5192616, +-2099165, -305480, 4051765, -4013647, -1239098, -2190433, -1611687, 3158949, 2053531, 1568200, +6854768, -2195802, -2332704, 9341554, 1786706, -6183679, -14185740, -775242, -18437220, 3173981, +1642825, 9018894, -7363185, -1758789, 4782446, 3980898, 5260798, -12475806, 17645336, 12517145, +2306398, 9255655, -4170950, -17772038, 4197257, -7481296, -8324721, 8381092, 20451024, 3584687, +-5639829, -7409356, -16403017, 41876, 764504, 25231322, -9926743, -387084, 756988, -756988, +-15193984, -17136920, 13575318, 545461, 7715909, -2193118, -19420232, -11172284, 1552631, -3234647, +-4106526, -5530844, 12712566, -2668249, 8258685, -8891656, 17707076, -20891258, 10352482, 10861972, +6470368, 5754183, 5243082, 16563541, 8501888, -1178969, 3531537, 153008, 16346646, 24588150, +-2831994, 1988033, -7218230, 10305237, 16494822, -11254425, 3466576, -28396714, 18578954, 19218368, +12804371, 17882634, -8137353, -14213657, -1023276, -2030983, -4211216, -2950106, -8547522, -5897527, +-3160559, -703838, -4780836, 2915209, 5222680, 2083059, -8032126, 1662689, -4462471, -4633196, +-2966749, 3416647, 3092377, -1335198, -2000381, -627065, -1394254, 950798, -7772280, 2676838, +1124745, 5128191, 1124745, -235686, -227096, 1209033, 4403415, 1631551, -4023311, 3324305, +2684, 584652, -20667382, -3076270, -26437672, -13589813, 10413685, -10846940, -23511188, 2165737, +-12674985, 564788, 463856, -15104326, -14329622, 6463389, 13855028, 4158065, -16093779, 7682086, +-18103824, -6371584, -6664716, 5647882, -7434589, -3414499, 8712341, 1465658, -5952825, -12916040, +13660680, 13215077, 17213156, 2223719, -1905892, 585726, 5522254, -1324461, 7064685, -7786776, +9286793, -3677029, 10696616, 8546448, 6461242, -3131031, 454193, -16653199, 5669894, -4212826, +12517145, 2247879, -29060822, 4438312, 14339822, 19246822, -11077258, -15175730, 18139258, 8200703, +12756053, -22736484, 11236708, 28395102, 29950954, 1874753, 721018, 17005924, -11782706, -15745887, +10075456, -17430588, 6541235, -8136816, -6837588, -3877819, -37464464, -21675090, -18241800, 13426605, +5116380, 3747896, -13304198, -5453535, -10049687, -1943473, -5395553, 14674293, 3504157, -5894306, +-13067975, -2954401, 8472360, -1395864, -3609920, 2554432, 8868034, -3202435, -5231270, -2559264, +-1937567, -652835, 6897181, 6872485, 6021008, -6132140, 7889855, -456340, 2257542, 8957154, +-4047470, -4125316, 7862475, 14048301, -3297461, -4670240, -2245194, 1632088, -2542621, -9788230, +1569811, 7028177, 1914482, -9861245, -9375377, 4345433, 3177202, -602906, -602369, -1793149, +-6973953, -4754529, -15586973, -29882772, 22846542, 2407329, 7666517, -3862249, 16178605, 440771, +-13810467, 10692321, 4341675, -4877472, -8337069, -6519224, 2053531, 3912715, 14331769, -8150238, +11246909, 3595425, 20438138, -29316374, -7873212, -4634807, 3775813, 11988327, 17373680, 3960497, +-14110041, 9543417, 13669807, 11522860, -3216931, 4031364, 830002, -4800700, -1970316, 850404, +4425964, 1609539, 10109279, 1684701, -12745852, 11929272, -13215077, -16857210, 2626909, 12220256, +-5930276, -4359392, 4439386, 5974837, 10522670, -5986648, 4992363, 23775866, -9474161, -25222196, +-32690606, -16502875, -22147536, 10084583, 19234474, 12319577, 4707821, 11589969, 6806450, 12807592, +-10936597, 14474577, 7517267, 5886790, 15069430, 19594178, -6080063, -4345970, 5359046, -1261647, +17626008, 6846715, -2678986, 2995203, -21476984, -15005542, 2990908, -824097, 3834869, 1473174, +4530654, -3993783, 11341398, -5960878, -6898255, -6655052, -11286100, -4076998, -2218351, 3737159, +3035468, -1667521, -9689446, -540629, 3235184, 1107565, -3875134, 2325188, 158377, 3779034, +-4038343, 1697049, 807991, 4553739, -2134599, 6993818, -4282083, -4935991, 1507534, -814433, +-3599720, 1184874, 4849018, 443992, -702764, 29956324, 2857764, 4731980, -6241661, 10905459, +-34251292, -15067819, -23417772, -24099598, 9557376, -21024938, 20682416, 23612120, 1010391, 5152350, +-3651796, 4355097, -22402550, 9240622, 24748138, -14068702, -28833190, 3853660, -10853919, -9148817, +-28122372, 4909148, 10307922, -69256, -3826816, 9080635, -16041703, -2629594, 10417980, -5710696, +-14216879, 1759863, -7100118, 14725832, -9736691, -5361730, 13747653, 11973295, 25391310, 3403762, +6127845, -2297271, 6816650, 9085466, 15687905, -4483409, -515396, -9712532, 20699058, -26048976, +28028956, 1038845, -11171210, 13173202, -10184978, -7460358, 25782152, -37174016, 6075231, -7810935, +7286412, -14396194, 6958921, 14805289, -7639673, -1322313, -3921842, -6121402, -3299072, 27475442, +-31109522, -10583873, 52319680, -19648938, -23080618, 22689776, 13557601, 15160698, -13164075, 1088774, +-13084081, -7282654, -2045478, -14904610, 3285113, 2070711, -3886946, 5439576, 4828080, -6721624, +-12710956, -3215857, -1058710, 5058935, -11215770, -7822209, 310311, -1063004, 2848100, 7069516, +16673063, -7512972, -361851, -1757179, -1723893, 4858682, 1899986, -9838159, -7456600, 8032126, +-6431177, 3082176, 2077690, -5957120, 2322504, -1304596, -10107132, -8225936, 4997732, 3351148, +-1505386, -98247, 6359773, -14866492, -23005456, 2250563, -8738111, -7767449, -12963822, -16190953, +20411832, 8812736, 1268626, 9611600, 24179592, 14326400, -1692754, 4959614, 16243029, 20790862, +-18473192, 8630200, 17352742, 7586523, 6335077, 24006720, 11523934, 5024575, -768799, 10813117, +-1245004, 12233141, 10053445, 5542119, -11272142, 21237002, -17482128, -2163053, 26519812, 26281442, +-6295349, -23265838, 8723079, -338229, 22744536, 39235064, 8719857, -5991480, 2729989, -22486838, +-2702608, -5931350, -4882841, 466541, 19968376, -8573828, 8761733, 24096378, 4042638, -22263500, +14692546, -1125281, 9327595, 22640920, 31816580, -8977019, -8500814, -2721399, -25294674, -36949604, +959388, -16798690, -2772938, -20368346, -2144799, 666794, 2724083, 15137612, -477278, -10524280, +-17565880, 12807592, -5455146, 10959683, 352724, 20405926, 7512972, 7536594, 24696, -6333466, +11405823, -8733279, -10176388, -3044058, -7664369, -2941516, 532039, 817118, -2786360, 3145527, +4444755, 380105, -1208496, 5945846, -5156108, -7229504, 4372814, 5236639, 993748, -6249715, +-7576859, -4383014, 6010807, 8163659, 1017370, -1144609, 8982924, 2481417, 4258460, 3755412, +6407555, 1826972, -1243930, -4765803, 2542621, 5152887, -10643466, 24938728, -46798500, 25739740, +-19685982, -46212236, -13635447, -11667816, -1594507, -10681584, 5650567, -12799003, -28562606, -17307108, +-8505109, -2633889, 3332358, -11800960, 11569568, 22400402, 889595, -1426466, 6205691, 1362042, +-4121021, -8337069, -4629975, 6053757, 6731825, -2000918, 6406481, 27533424, 7652558, -8060580, +-27254252, -4369593, 19375672, -23510650, -10980084, -8956617, 357556, -1796370, 14904073, -4892505, +1853815, 20414516, 7364795, 22647900, -3108483, -10683731, -4829691, -5801427, -5791227, 10932302, +1266479, 7397545, 13884019, -24257438, 3649112, -6409165, -15021111, -11377905, 23795192, 17099338, +951872, -11557757, 4885526, 10034654, 1132798, 6953552, -16199543, -40240084, -18556944, -14713484, +14847165, 1528472, -1751810, -6765647, 2996277, -4502737, -12615930, -13154948, -6766184, 16341277, +12428562, -18143552, -22611392, -8833674, 1713155, 13853417, 5718212, -4344897, -5965710, -4616016, +3354370, -10019622, 1648194, -6818798, 726923, 10484552, 11263552, 3022583, -5597416, 3667365, +8166344, -178778, -1560147, 6022081, -7997229, 11458973, 10359998, 4063039, -16643, -367220, +-969589, 9637370, -3558917, -4917201, -5561446, -8056822, -7834557, 2704756, -2769717, 3594351, +-2106682, 1864553, 6212670, -2811593, -5596343, -8284992, -2132451, 4063576, -5783174, 13517873, +-18470506, 22223234, -1764695, -35128000, 7190849, -16930224, -3486440, -2532420, -4134980, -22357990, +7065221, 1187559, 17759690, -38233800, 649614, 18884434, 2303176, -9051644, -19324668, -1476932, +11137924, 16544751, -13677323, -4855998, 8953396, 18908594, 17270600, -16594143, -3355443, -26924614, +12611098, 13737990, 8517994, -7634841, -2068564, -7284802, -2826089, -8934069, 2638184, 19732154, +-7249905, -7684770, -6709276, -11090679, 22374632, 19264538, -1832340, 27102854, -1183264, 9680856, +-23822572, 19670414, 8750996, -26763014, -8638253, 30812096, 12785581, 8407935, 6019934, -14381161, +-11355894, -15424301, 26723286, -13721347, 20651814, 21416318, -24162412, 56078316, -11956115, 34814468, +1554778, -7776575, -14962592, 26179974, 10107669, -20154134, -12335683, -43412456, 17435420, -5883569, +20043538, -26691074, 29967598, -22852448, 8866423, -8804683, -6836514, 19785840, 1872069, 1926830, +10996190, 7773354, -5014375, 13013751, -1564979, 3884261, -8996883, 1852742, -1219234, -5614059, +-9044127, 420370, -10040023, 4914517, 4342212, -2254321, 8702677, -3020973, -5214091, -7191386, +5133560, 1170379, -1202054, -14304389, 6540699, -2757906, -17351132, -5406290, 4993437, -4799626, +-8974334, 6141267, -4868883, 5095442, -9133248, 4447439, -9307194, -1481764, -1394254, 5190468, +-2188823, 1065152, -3018288, -3065533, 13429826, 23036058, 1910187, -19317152, 9359271, -37305548, +-9893457, -33889440, -46876884, 1611687, -17996986, 6045167, -3437048, -7343321, -17804786, -12266427, +10537702, 28257126, -23489714, -5039608, -40503688, -35591856, 9868224, 14281303, -22217866, -23297514, +1517734, 5178657, -37624988, 2021856, 858993, 19595788, -16859894, 756988, 16284905, -10564009, +-19563576, -21932788, -10556493, -20000588, -16353625, -20880520, 29296508, -37171332, -23007066, 33614024, +-1035624, 9478993, -28099286, -4920422, -7985955, 732292, 47422880, -6730751, -899259, 4664872, +22231824, 498216, -20963198, -9324374, -15110769, 5077725, 56725780, 11000485, -19968376, 42703788, +30892626, -27466852, 31860068, 52230560, 457414, -20437602, 35576288, -6224482, 37425808, 33675764, +2834679, -1804960, -10051834, 23490250, 19143206, 10842108, -19981798, -6713034, -12901545, 29756070, +-3785477, -20584168, -9993852, -20696910, -8880382, 20319490, 2311229, -10852845, -3664681, -13268228, +-2219424, 18141404, -8810589, 4374424, -1835562, -17535278, 18853296, 2154463, 7562901, 9019968, +-12161200, 3624953, 17322676, -3234647, 682900, -9440338, -38655, 1275605, -5706401, -5391795, +3273839, 12729746, -8266739, 4947266, -11038066, -5410585, 654446, -3823058, 12655121, -5019206, +542240, 1058173, 4619774, 261993, -6048925, 26369488, -67005784, -40488656, -43492448, -14959371, +-28926068, 36040680, 13800267, 29551522, -4242891, -57256744, -8566312, 9225053, 39520140, -1671279, +9317932, 36101884, -13333726, -26197690, 2866354, -1780264, 45870252, 29698626, -14716169, -20748450, +48724256, 3404299, 24486146, 11702175, 45475112, 39106216, 30361660, 3195993, -25347824, -13903883, +-19315542, 37842956, -17961016, -25836912, -13903346, 1400696, -879931, 16760573, -16240882, 6049462, +-76694160, 8673150, 12119861, 12692165, -31977642, -29755534, 9363029, 27145804, -33015414, 12991739, +-18699214, -14639396, -22114786, -1924145, 23810762, -15758235, 26146150, -6522982, 10355166, -47846472, +-30633854, -1117228, 25660818, 17903034, -34672196, -37485400, -17251274, 3636227, 40057548, 16523276, +-3629784, -27880780, -32091996, -10865730, 6960532, 28314572, -2266669, 9476845, 19107236, -7088844, +7047505, -18548354, 11819750, 6800544, -11320460, -9453223, 1267552, 14643691, -13657459, -383863, +23313620, 3795677, 3633006, 189515, -6305549, -15487115, 4291746, -17215840, 20730196, 17735530, +13617194, 1786170, -1328219, -20182052, 13205951, -3902515, 24152748, -5551245, -26616986, -16370268, +-3008625, 26463440, 7730405, -5383742, -2323041, -20879446, -9830106, -8267275, -898185, 12104828, +11802033, -21050708, -11360188, -12792560, -12359305, -4377646, 4414153, -1547262, -6855842, -12727599, +-12887586, 2030446, -255014, -6504728, -6391448, 11878806, 86785184, 8770323, -46380816, -104252816, +-9488120, 61783640, 15496779, 26940182, -2898029, 37571836, -6378564, 16505559, -8773544, 21280490, +29998200, 16002511, -14622753, -34433828, 40446780, 45948632, -10392747, -45546516, -27751394, 4736275, +26466662, 8786429, 9465571, 1662689, 6742025, 3018825, 6682969, -8975408, -52755620, -333397, +32597728, 25045564, -10384157, 2507724, 20069846, 43918724, 27000848, 21517786, -25890062, -18124762, +-4409321, -4807679, -39286604, 27804008, 16556562, 28885802, 59111636, -30421790, -19435800, -2755759, +-16315507, -14221174, -25748328, 45765560, -27692876, -29985852, -30709016, -10769094, 58609124, 14935749, +22910966, -1280974, -4778688, -13567802, 36510980, 29362008, -14910516, -34189552, 11982422, -4497905, +14273250, -32056026, -12283070, -18656802, -24071682, 14772540, 24367496, 4493610, 1160715, -12921946, +7431904, -5061619, 22682260, 1780264, -7427072, -4457103, 7745437, 14382235, 16119012, -9209484, +10127533, 5133560, 5402532, -737661, -16557099, -2214593, -13366475, -5457830, 1126355, 2290828, +4971425, 4896800, 6009733, 14708652, 22100828, 19459960, -1381906, -4786741, 2892124, -9522479, +12389907, -13385802, -1174674, 10902238, -207769, -2636036, -21297670, 10901164, -21240224, 7267085, +-4399657, 3480534, -1419487, 2529736, -541703, -13433047, 8040179, 6744710, -639413, 4586488, +-281857, 3951370, -1297617, -3422015, -172336, -1005022, 1242319, -542777, 1272921, 690953, +-4089883, -1752347, -420907, 3235184, 1342714, -843424, -2201171, -1486596, -25388088, 2558727, +66215512, 51577724, 7667591, 4229469, -36512052, -69332048, -61297772, -29513404, 49622980, 54983096, +56402048, 31751620, -8699456, -35864052, -33777772, -21657372, 13908715, 22440130, 38474316, 3819837, +-29937532, -24762634, -5844914, -24812026, -12046846, 5711770, 39851392, 57629872, 36811628, 17959942, +15903190, -35756140, -4647692, -72111424, -81236088, -50437412, -24782498, -22001506, 37401112, 59403156, +65227132, 59512140, 50987704, 21476448, 3068217, -24628416, -7226820, -39790724, -71269080, -5693516, +6206765, 7060926, 23130010, 14193256, 23470922, -79211008, -43770012, -28221156, -46375984, -19369228, +33660196, -20173998, 22543746, 3304977, -21337934, 17044578, -17893370, 19143206, 21771190, -16764331, +-34448324, -70183520, -68517080, -50746648, 24537686, 8883066, -10122701, 13243532, 3304441, 338766, +-32900524, -22767084, -60900488, -19992000, -22686018, -2355790, 43884364, 47406776, 6556268, 24513526, +-15031312, -32743220, -59256592, -38735772, -36749352, -1212791, 17635672, 10357314, 14305999, 15848429, +-11218455, 9627706, -10601590, 9986336, 2124935, -308701, -2509872, 8258149, 6894497, 15712064, +-3922379, -3645354, 14318884, 11638288, -119188024, -60955248, -31728534, 40125732, 9317395, 152951840, +156783488, 118181392, 152860032, 160154496, 145531744, 104460584, 94839856, 105214888, 41909216, -6241125, +-65066072, -100603704, -139003936, -135078336, -201327136, -122180544, -79442936, -63131188, -89737440, -47238196, +-12901008, -67286568, -52195128, -55180128, -12418898, -33139968, -11743514, -44866304, -22721988, 26733488, +27756226, 8265665, -8217883, 29133836, 23672786, -67884640, 14182519, 45878304, 100553240, 73687680, +95739656, 39223788, 38096896, 159353488, 86382528, 163068640, 54702316, 152937344, 105701832, 133520872, +180215760, 170591808, 138453632, 155343056, 172707616, 187822672, 160545872, 185144224, 126454040, 187798512, +150929984, 133781248, 142798000, 77869368, 159854928, 77257872, 47036872, -58789512, 4012573, -86831888, +-97406640, -149234544, -175992192, -270794464, -264223696, -249788320, -233374032, -220191168, -185868464, -227027680, +-279189504, -275581760, -228361264, -241985968, -227316512, -228361264, -194655440, -212261040, -203266848, -151865744, +-167440368, -128891432, -120099096, -110990008, -70514776, -91454352, -20642686, -34062312, 15850577, 21065740, +66728224, 98288712, 103332616, 118985624, 105979928, 159287984, 180908320, 178919744, 207125872, 215965984, +214331760, 163141648, 146004736, 127811784, 118857848, 115367656, 118808456, 111309984, 85127328, 54579908, +62406948, 47911972, 37671160, 24845848, -18876382, -25119116, -25985090, -32317482, -39075076, -44471700, +-30838402, -34409668, -27037892, -28014998, -23817742, -17382270, -20411832, -16988206, -16018617, -20175072, +-18025978, -20480552, -15482820, -12837657, -16935056, -19777788, -6792491, -1621350, -1369558, -512175, +1505923, 8590, 653909, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -7687455, --15177341, -2673617, 219043, -3496104, -7132867, -2373506, 5257040, -8422431, -4627828, -2797634, --1629403, 2656974, -1183264, 2959769, 1378148, 2590939, -272194, 3210488, -2793876, 511638, --1215476, 597000, 8129300, -1738925, -480499, -4032974, 5032628, 3099893, 2431488, 6243272, --3178813, -1829656, 2159295, 5589363, -1490891, -384936, -4501126, -4964982, -3292629, 3526168, --4376572, -3781719, -454730, 5027796, -6796786, -1460289, -5674726, -2772938, -1607928, 774705, --490700, -4092567, 5258651, 884763, 4735202, -1913408, -1170916, -5878200, -103616, -2066416, --2189360, 3375844, 1926293, -1058173, 1845762, 3737159, -1040993, 1602560, -2655901, -1553704, --623307, -2534568, 2271501, 776852, 1736241, -4016331, 2906082, 1653562, 6522445, 3859565, --1036698, -4131759, -309238, 896038, 541166, 1280437, -162672, -1401233, 84826, -952946, -36507, -1152125, 439160, -1120450, -45097, 1249836, 452045, 644782, -770410, -563178, -623307, 859530, 421444, -127775, -12489228, -4502200, 3614752, -3322157, -1472100, -1413044, -1713692, -650688, -3281892, 5193153, 4673462, 1541356, -568009, 2399813, -6402723, -953483, --6327024, -3209414, 4696547, -794569, 852014, -653909, -710280, 92879, 9808095, 8950712, -4021163, 4772246, 5689221, -1107565, -635655, -1966021, 5021891, -500364, -1881733, 1394254, --2898566, 1988570, 3619584, -1853815, 4078072, 4576288, 8968965, -3514357, -4206384, 3821984, --2296734, 117038, 1903207, -5215164, 329639, -2733747, -3036542, 6885907, 4069482, 4953708, --2821257, -3752728, 2644626, -4366908, 3075197, 13298292, 767725, 904091, 3005403, 1290638, -1242319, 7566122, -4038880, -1036698, 1404991, 979789, -3759170, -2780455, -3837553, -1837172, --1394791, 3474629, -580357, 3490198, 3597572, -3605625, -3837017, -999654, 2441689, 3365644, --4023848, -792421, -1188095, -2780455, -326954, -2634426, 694711, -181999, 1414655, -810138, -549219, -1026497, -249108, -790274, -3657165, 3959423, 6368363, -3056943, 3149285, 10035191, -3343095, 2297808, -7030325, 5816460, 1515050, -9028558, 3814468, -2533494, -5436355, 2185065, --769336, 2105608, 5230734, -5509906, -5805722, -2575370, 7857106, 222265, 3891240, 8152922, --12140262, -9777493, 1574642, 5975374, -4398047, 388695, 8077760, 2089502, -1060857, -2430952, -9669582, 1189169, -2372433, 1359894, -8800388, 1003412, -4859756, 4480725, 769336, 4759361, --2407329, -1185948, 2135673, 149787, 612033, 280784, 4548907, 3679176, -5017059, 2872796, -4024921, -6862284, 806380, -3088618, 1277753, -1568200, -5322002, 93416, 4566624, 3986267, -8822400, -5464272, 6828998, -4516158, -921271, 4065187, -4438849, -6591164, -2396592, 321049, --427349, -328028, -723702, 1317481, 2805688, -3829500, -59593, 1838246, -362925, 1580011, --3156264, -1795833, -1257352, -2302639, 669478, -490163, -1821603, 1005022, 1018981, -1506460, --2332167, -111669, -549756, 2406792, -128849, -380105, 429497, 526134, -426812, -705985, -1602023, 547608, -1297080, -639413, -995359, 157303, 20176682, 9045201, 12222403, -989453, --3381750, -4407710, -4421132, 2404108, -3713536, 5626944, -639950, 7721815, 464930, 4084514, -5068062, 3919158, 3353296, 4443681, -14992120, -4432943, -1412507, -3160559, -2777233, -4719632, --10681047, 479426, 7311108, -4503810, 4387846, -3617436, -5333276, -4022774, 602369, -3395709, --1265942, -3482145, -248034, 8821863, 464393, 3964792, 5570573, 7252589, -3414499, 1698123, --1629403, -5599027, 6350109, -3558381, -266825, -5542119, 4043175, -55835, 84826, -1531156, --2587718, 1874216, 5671505, -2385318, 3191698, 3028489, 2539400, 9763534, -9836549, -4157528, -228170, -5415417, -7023346, -2786360, -8594230, 1282585, 10051834, -6947647, -3324305, -7933879, -499290, -2502355, -3805878, -9300752, 5448703, 7125888, 2807835, 4977330, -2546379, 795106, --1891933, 2059437, 70867, 4925791, -1294933, 2115272, -118648, -1271847, 1699196, 1171452, -2241436, 1887638, -344134, 444529, 1215476, 490700, 943282, -92342, -966905, -1792612, -862752, 454193, -1245004, 867583, 944893, -313533, 396748, 1160178, -384936, -1072668, --389231, 6270653, 8941585, -4954245, 4647692, -4043712, -1975685, -1604707, -11108933, 8065949, --2365990, -1180579, 12783433, 7963406, 8537858, -3477850, 308701, 1529008, -1991254, 2850785, --6548215, -171262, -4487167, 5228049, -5100811, -3498251, -555125, 892816, -6294275, 1209570, -642098, 8240432, 35433, -11256572, 6463389, 6080063, 8635569, -1374390, 2155537, -6225018, --4720706, -1964411, -4583804, 1791001, 1165547, -1698660, -710280, 4711579, 7311108, -10043781, --2196876, -3758, -4145180, -4290136, 6611029, -5342940, 2479270, -5243618, -6974490, -5171678, --3459059, 2400887, 949188, 12423730, -2128693, -3333432, 3677566, -3730716, -1117228, -3311957, -3437048, -3064459, 4437238, -2230699, -2079301, 3069291, 7436736, 2075543, -7030862, 42950, --3477313, -7103876, 1991791, 5031018, -1695438, 1165547, 1728724, 249645, -789200, 2590939, -28454, -2878702, -2147, -1035624, -561567, -1495722, 2338610, -556735, -1963337, -2075543, -265751, 2187212, -1003949, -146029, -2937221, 274878, 498216, 986232, -552977, -2463164, --1309965, 2166811, -909459, -2658585, 1049583, -15432354, 14843944, 7967701, -8856759, -8931921, -3661997, 11783780, -170725, 3456912, 13722421, 4602058, 4131222, -2318746, 7152195, 6536940, -7533910, -13582834, -8342974, -8240432, 6506876, 5614596, 7156490, 343061, -8291435, 3409667, --1257889, 3752191, -11919071, 4606890, 7220914, -5589900, 3122978, 5843840, 1636383, -173409, -1252520, -1872069, 10434623, 7092602, 5582921, 210990, 3626026, 8055748, -7189776, -3866008, -354872, 10651519, 6813429, 4193499, -8022462, 299574, 5452998, 6362994, -2238215, 1975148, -6211597, 7696045, 2428267, 7116761, 2822867, -790274, -6564321, -36507, -10932302, -4472672, --5244692, 921807, 3604551, -6325950, -2565706, -11555610, 5029407, -3203509, -84289, 6142340, -8943196, 10814728, 1342177, -1115618, -6704981, -1994476, 3424700, 3701188, -7114077, 2243584, --3201361, 2617783, 477278, -2392297, 45634, 1280974, -2254858, 1020055, -595390, -2682207, --1383516, -1684164, 1698123, 2080912, -361851, -1551557, 1117765, -1189706, -861678, -2083596, --288300, -438624, -2437931, 2027225, 13076565, 4100083, -2217814, -5925981, -15495168, -7510287, -9509058, -3320010, -14240501, -3792993, -2247342, 2192044, 7896298, 12056510, -688269, 3561602, --2739652, 6018323, -6700686, -7136088, -7681012, -13664438, 7329899, 4185983, -11411728, 373662, --8327942, -3163780, 7394860, 4198331, 6038724, -1669669, -1563368, -1939178, 13019656, 10145786, -10744934, -4852240, -9152038, 7279433, -1217623, -3223910, 9261023, 1672890, 9111236, -263067, -5100274, -6365142, -320512, 4599910, -19484656, -2914672, 950798, -14246943, 3714610, -3610994, -13331578, 8520678, -8153459, 672699, 12171400, -1232656, 6204617, -4056597, 8367133, -3859028, -1655710, -3198140, 208306, 5884105, -7920457, 8579734, 4385699, 4940286, 1398549, 11393474, --4463008, -12971875, 2250563, 9048422, -4269198, -8043937, -5832566, -4092030, 9325448, 234613, --4001299, 422517, 221728, -1778653, -1792075, 620623, 1790465, -1007170, -1228361, -642635, -1993402, -1007707, -3513283, 1018981, -3889093, 3589519, 2301029, -6979, -405874, 987306, --1139240, 1613834, 143345, 1130113, 197569, 525597, 4112968, 1482301, -2175938, 1207960, --31410706, -6636798, 16843252, -13594645, -4930623, 14319958, 5389647, -4530654, 1512902, -11841762, -10573673, -1331977, -19102404, 1377611, -1001801, 7231651, 7086696, -3784403, -14963129, -6400038, --5712844, 329639, -7977902, -4372277, -10173167, -2911988, 11092827, -9095130, -4571993, -3488587, --5920613, -6241125, -8487392, 5812702, 1182190, 7226283, 1265405, -5305359, -8223252, -8106751, --1667521, 5424544, 7988103, -2802466, -7267085, 7656316, 3185255, -11420318, -12738336, -25972740, --2290828, -8284992, -5015448, 3872987, 3959423, 2399813, 11684995, -1196685, -5566815, -682363, --5999533, 13336410, 7087770, -2567317, 7126962, -7469485, 3744138, 3087008, -7311645, -3193845, --6555731, 4718559, 3313031, -12065637, 7985955, 12253542, -789737, -562104, -12366285, -4795331, -5464272, -3819837, 3614215, 12149926, -4044786, 2694018, 1239098, 969589, -3825205, 741419, --610422, -5034776, -3036542, -432181, 1813550, 324270, 1430761, -5250598, 643708, -2796561, -1356673, -3025805, -2940979, -1766842, -164283, 701690, -2244121, 732829, 1312649, -279173, -557272, 2287070, 1285806, -4158065, -2742874, -1272921, 467078, 1606318, -648003, 1629403, -5607617, 20832738, -9722732, 7917236, -5092758, -48855, 11955041, -3446175, -5306969, -2816425, --1099512, 2101313, 8132521, 27451284, -1497870, 1656784, 7630010, 1778117, 141734, -12841415, --13348221, 2057826, 1842004, -8396124, -4271345, -1936493, 7621420, -3372623, 1490891, -175020, -3335579, -3438121, 16042240, 8900246, -7474317, 8814347, 7997766, -9699647, 1709397, 4126927, -3224447, -2699924, -3272228, 13346611, -11674795, 4942971, 14779519, -5152350, 1851668, 9458592, --1019518, 8223252, 4542465, 116501, 4538170, 7052337, 9731322, 6097780, 804770, -372588, --6684043, -7431367, 293132, 804233, -23284092, 15195594, -3562675, -7227356, -8084202, -17105780, --19286550, -12557411, 2354716, 9528385, -3487514, 1154273, -1548336, 9465034, -3533684, -7714298, -4377646, 2250026, -3194382, 1134945, 6482717, -6296422, 1256815, -7998303, -2661269, -3612604, -1915019, -970126, 4098473, 2498597, 871342, -1197759, 2087891, 2747169, -62277, -5819144, -3236795, -339839, 4926865, 4642860, 2347737, -2427730, 4268661, 863288, -670015, -221728, -254477, -3929895, 4282620, -475668, -2831457, 4034048, 8230768, -1720134, -1754494, 4131222, --1664300, -3042984, -1098975, 28195386, 28336584, -816581, -23424752, 4566087, 4821638, -2705293, -6165426, 3510599, 2075006, -281320, -3937948, 22874458, 4263829, -3691525, -25458956, -14341433, -6059662, -1593433, -8824010, -15297063, 2181307, 2583423, 3974455, -3819837, -16711718, -17890150, -19434728, 18339510, 5779416, 16842178, -14347875, 1953136, 7605314, -3041374, -9073655, -16428250, --8061654, 2898566, -632971, -7711614, 7994008, 144955, 7762080, 6236830, 496606, -17661980, --10195179, -8308614, -1355062, 1813013, 2406256, -3007014, -4925791, 1212255, 2924336, -15793668, --3904662, 2579128, 3624953, -7172596, -19679004, -4614943, -4890894, 14583561, -492311, 6561637, --6529424, -5013838, -8766565, -9883793, -5712307, 1592896, -664109, 12242804, -7200513, 2122251, -14228153, -988916, 7146289, 6331319, 13824963, 3052111, -3915400, -7043210, -6111739, -2426120, -8390755, 1283658, 8458401, 4453344, -577136, -227096, 491237, 676457, -3655017, -4687957, -95563, -1163936, -367220, 1356673, -824634, 1061931, -5357972, -1270774, 3428458, -201863, -2200634, -9322227, -957241, -381715, -1731409, 1897839, 1541893, 1187559, 1713155, 2119030, --4275103, 5094905, -3276523, 12281459, -6314139, 2145873, -4756677, 950798, 3227668, -7728794, --5229123, -13798119, -15256261, -10020159, -3923453, -699006, 382252, -8442295, -7821673, -15820512, -7611756, -15855409, -20403780, 13179644, -12230993, -15570330, 14504641, 2755222, -3269007, 15556372, -8982387, -12087112, 11180337, -30819612, -2079301, -7920457, -3284576, -14489609, 25368762, 11877195, --7421167, 3723737, 8001524, -5309117, 8833137, 133144, 400506, -7247221, 8579197, 9874130, -13357885, -20908438, -716186, -144955, 6202470, -9480067, -3605625, -9649181, -9471477, 16618302, -5385889, -12450036, 6429029, -7702487, -8156143, -13369696, -24285356, 6345278, 16069083, 1088774, -16186658, 21961242, -1294396, -8997956, -20807506, 1621887, -2654827, 1330366, -5184026, 4300336, --9137543, 19661824, 10899553, 17199196, 3498788, -2121714, -5220533, 7021198, 8130910, 3659849, --1471026, -2461016, 781684, 9254581, -1620813, 3880503, -5825050, 2520072, -9634149, 940598, -1201517, -4243428, 9103720, 5262946, -2328946, -5980742, -5223754, -1725503, -476205, 2922725, --6117644, 1584306, 1103807, -447750, -4226248, 1603633, -9176198, -1858647, -2173254, -2562485, -1591285, -166967, -17593796, 2357400, -39244728, -26365730, -18900540, 10227928, 19465328, -27764280, -6441377, 19682762, 12157442, -281320, 7204808, 18558016, -8524973, -1109712, -5406290, 547071, --12059731, 8573292, 177704, 1013612, 3167539, 24875914, -1261110, -10975789, -10691247, 5929739, -18313204, -7397545, -18551038, 5505611, 18583786, 10849624, -2509872, 9024263, 6094022, 8694624, -1930051, 7364795, 12604655, -1574642, -21261162, 1064615, 6551973, -19922206, -14548128, 19486266, -15286325, -15047418, -9862856, 4759361, -1013612, 9557913, 23694260, -5095442, -4592394, 4505421, --1231045, 8773008, 4378183, -8639864, -6792491, -3261491, 6935299, 6305549, -6314139, -17176112, --3037616, -25846576, 24448028, 4123169, -4495757, 2326799, 10125385, -526134, -11368778, 4218195, --4948876, -7369627, 5746130, -1546725, -11251204, -18489834, -6048925, -7540352, 15257871, -2436857, -5027796, 2903935, 1856500, -1438277, -1337882, 2380486, -4110821, 664109, 5517959, -668941, --2904472, -1657857, -12617003, -3894462, -350040, -2369211, -9188546, -8242579, -3470871, -1887638, --836982, -2699387, -497142, 152471, 6902013, 2443300, -1147830, -2810519, 1076426, -2486249, --2103460, 4481799, -2270427, -5364951, -1582696, -4043712, 474594, -4973036, 132070, 3280281, -1027571, -4772246, -1591822, -15162845, -656056, 2622615, -18586470, -4884452, 13973676, 18176302, -12863964, 33918432, 20459614, 30734786, 11473468, 8098698, -15880642, 17249126, -5807870, -1944010, --12717398, -8469139, 16666621, -5459977, 37801080, 17586280, 10907606, -2025614, 8740258, -5952288, --17648020, -8929774, -10954851, 7961796, -10329933, -240518, -11054172, 6462852, 15375983, 13875429, --917512, 20068234, 16767552, 776852, -5844914, -7678865, -13762149, -4740570, 31645320, 12263742, -36429376, -11755862, 178778, -1249836, 8490077, 29227790, 10013716, 685584, 18793166, 21525840, -22746684, -2079838, -13453448, -4963372, -3721052, -3903052, 15076409, 10272488, 14307610, 21824876, --13634911, 33022392, -22205518, -41686416, -6451041, -13026636, 8483097, 20070382, 9831717, -11284490, --1157494, -12253005, -9141301, -6086506, 146029, 16591459, 2797634, -4753455, 2595234, 1198296, -4977330, 5256503, 3610457, 6459631, 1759863, 4041564, 1486596, 4487167, 281320, -13478144, --5193153, -203474, -12532715, 1315871, -13085155, -6942278, -7946763, -7408819, -6205154, -4610648, --1757715, 686658, 3749507, 13699872, 1863479, -8791798, 3986267, 739271, 12447889, -2435783, -5368172, -183073, 152471, -6765111, 1567663, 19730542, 32081258, -15973520, -12649216, 11539503, --9678172, -1759863, -4604205, 4307316, 13931800, 15108084, 22198538, -24516748, 27394376, -9978820, -2238752, -12761958, 11186779, 20806432, 8209293, 3804267, 1101659, 25347824, 5884105, -907312, --8772471, -3947075, -26498874, -3599720, -13099113, -31496606, 2261837, -1967095, 12401181, -32803886, --6856379, 7595650, 11649025, 27161374, -7959112, 7848516, 14397804, 2156074, -4278325, 7612830, --7733089, -1954747, -41375568, 3495030, -17905718, -20571820, -23301808, 9123047, -37110664, 11976516, --14190572, -18493056, -25390236, 22433152, 24042690, 23934778, 4673462, 4292283, 22550188, -31660352, --3110093, -9846749, 12774843, -37597068, -12916577, -3998078, 12001749, 9401147, 7701413, 15008763, --14020384, 5413807, -16923244, -5115843, -10146323, -4095788, -3449933, 339302, -16036334, 7198902, -10072772, -1859184, 708670, -7982734, -2457795, 7590818, -10342818, -330176, 5087926, -12929462, -5879810, -11598022, 161598, 7072201, 1734093, -9529459, -6155762, 3522947, -5207648, 5723581, -4128001, 6620692, -831076, -8361765, 15768972, -7585986, -3729642, -10286447, 7064685, -3578245, -1049583, -9552544, 1315334, -11581379, -1762010, 8296803, -2597382, -4982162, -11967926, 1278827, -1671279, -1708860, -15724949, -29685204, -508954, -10645076, 35097936, 7238631, 24832964, -8207146, -33889440, -21368536, -39864276, 8912057, 6784975, 4458176, -19804632, -22680648, -17671642, 6529961, --17798344, 7742216, -9429064, 26486526, -8644695, -4107063, 19191524, 502511, -47707424, -19927038, --618475, 31363462, -3586835, -9955734, -27341224, 4662724, -6725382, -23638964, -27862526, -3320547, -5139465, -9686762, -10590852, -27994060, 18308908, -7005092, 6600828, -13974750, 645319, 8204462, -5087926, 24563992, 282931, -8551817, -31996432, -11366631, 15516643, -21997212, -11142756, 8054138, -17660906, 13689135, 35170952, 26749594, 545998, 20287278, 20901996, 7049652, 867583, 12153147, --10367514, 52977884, -24337970, -57962196, 15452755, -49343268, -1852205, -38631084, -208843, 47165720, -5975910, -22531936, 7546258, 7988639, -14630269, -12110734, -16559783, 3577708, -4956929, 15097884, --11873437, 10084046, -19931870, 5571110, -594316, -3299072, -4466766, 13688598, 26311506, 8188892, -10746008, 18114562, 5619428, -18118856, 5374078, -6723235, 12215961, -3775813, -5533529, -699006, --1116692, -4869956, -14800457, -9791989, -6487011, -821413, 2255395, -1079647, -9324911, -21337398, --13205951, 3221226, -3616363, -363998, -8010651, 2889439, 15586973, 22196390, -33643016, -22378390, --13894756, -11812234, 13532368, 21005074, -12352326, 1401233, 18748070, -37948184, 2807835, 8895414, --28625420, 14829985, -9529459, 13083544, 4926328, 14744623, 1601486, -18551038, 19217294, -24177982, --5263483, 46826416, -19209778, 17155710, -11143830, 19280646, 17578764, -6142877, -20535312, 21822192, -56761752, -31099858, 8083129, -41275708, 20882668, 12561706, -22362284, 24776592, 2326262, -49561776, -7115150, 2437931, 22624814, -6068789, -3517041, -26039850, -25353192, -13006772, 61872224, -9445170, -31392990, -27589260, 20635708, 10126459, -5737540, -21209086, -3994320, 17467096, 34744136, -12600360, --11752104, -3676492, 6750615, 30302604, -7772280, -7151121, -22580790, 6922414, -33956548, -15060303, -24060406, 29272886, 3183645, -2407866, -16000364, -26006564, -75670880, 47162500, 17790292, 27098022, -2528125, -24554328, 26897232, -15198816, 11291469, 16125455, 15526307, 36418640, -847182, 8532489, -9896678, -4041564, -16102369, -5248987, 26419418, 16446504, -15081241, -3214783, -10317048, -2556579, -12238509, 3727495, -17627620, -11221676, 16503412, 3945464, -5461588, 8711804, -14943265, -8936216, --3258270, 7350837, 11587822, 7709467, 2061047, 9363566, -7693897, -9805410, 1564979, -897648, --13457743, 1679332, -13877576, -437550, -8571681, -1910187, 1918777, -6945499, -13305272, 4551055, --31807990, 22220550, 21751862, -43097312, 4054449, -22642530, 2678986, -47445968, 47571056, 41485624, --4387309, -21644488, -7651484, -8674223, 23008676, -23731304, 29713120, -39672076, -23148264, 11316702, -13903883, 3226057, 13415867, 37796248, 10726144, 17438640, 4473746, 18121540, 12714714, -8483634, -3597572, 15348603, -1249299, -1291175, 29995514, 13561359, 39421356, -3609920, 22382148, 76773, --29171954, 29642790, -15525233, -3309809, 8916889, -27454504, -18797998, 10682121, 42872900, 23561654, -15326054, -55531780, -13184476, -38933880, -643708, 62310848, 40700184, 47144784, 3403225, -45712948, -13918915, 46402288, 9426379, -11597485, 40969692, 4475893, 27273042, -71105328, -59337656, 42417632, --3412889, -19128710, -45552424, -9834938, -17335024, 19345070, 17545478, 21181168, 21359946, -8960376, -6391448, 39303244, 35907536, 37963752, 2749316, 54546084, 26808112, -9649181, -22009560, 356482, --11060615, 3264712, 27307938, -4347581, 783295, 20216412, 21825414, 2170569, -335007, 8651675, -24212878, 8710731, 11110007, 16809428, 5526549, 13085155, -1091459, -7335804, -3681324, -2784750, -560493, 17379048, -7113540, 3092377, -14690399, 21027086, 9691594, 9207873, -744103, 10626286, --492848, 36010616, 8745627, 36971080, -10502806, 32345936, 14306536, 4809290, 13544716, 13940390, -15251429, -4179003, -3431679, 22141630, 7098507, 18557480, -41175316, 24273008, 32386200, 2456721, -11021423, -29346974, 22852448, -13363791, 10912975, 1036698, 19327, 19361176, -6084358, 12590160, --4152160, -23579908, 6185290, -1675037, 26213796, 22939958, 32615444, 10851772, -25177098, -20745766, -21117280, 23796804, 10908143, 2024540, 7403450, -6601902, -20691542, 3406983, -7768522, 28973850, -20142860, 17634598, 22867480, 23528368, -32815698, 35817880, 35139276, 25769266, -17738214, -15741055, --22891102, 31170188, 18099530, 51268488, -31512712, -31134754, -24165096, -45616848, -12074764, 48965312, -7594039, 38413112, -41380400, -44177496, 9360881, 27761058, -38723964, 5842230, -30897458, 12018929, --35630512, -2998961, 16548509, 17570174, -32432372, 12471511, -24741160, -48967460, -1893544, 57471496, -29600378, 23128936, -16416439, -41552196, 62444528, 50470160, 13957033, -56674776, -2509872, -13545253, -39873940, 20218022, 24595130, -29634738, 21718576, -13487271, 14112726, -20644298, 6862821, -23065048, -32503238, -6865505, 5064304, -39576512, 11009612, 4498442, -2161979, -9210557, 7613367, 3672197, -3745212, -24717536, 9851581, 24244016, 1200443, 14372571, 12229383, 9848897, 1277753, 4352413, -145492, 781684, 715112, -8305930, -1256815, 7190849, -510027, 14938433, 12799003, -7672959, --1752884, 6525129, 2703145, 11332271, -22984518, -694174, -79154640, -16244640, -1588064, 929324, -28145458, -73983496, -7981660, 33414308, -54089744, 12233141, -11969537, 63461900, 34058552, -38953744, -10023380, 42640972, 4799089, -17157858, 14532022, 10115185, 6061810, -978716, -3820910, 3113315, -7431904, 14463302, 44455596, 35030292, 38927972, 26049514, 48906792, 23327042, 49993956, 20117626, -44395468, 308701, 27731530, 24234352, 27482958, 20365662, -1562294, 7747584, -33315524, -20480014, -64636036, 454730, -25248502, -7547868, 20571282, 33472828, 69519952, -9709310, -37630356, -19524384, --27636504, 38994544, 45439680, 50070728, 16064788, -2220498, 34537444, -58406724, 53204980, 19619410, --27460948, -916976, -89874872, 1739462, -59278064, -83143584, -20219632, -49039400, -20733418, 93315680, -85899880, 80006648, -62914292, -6905234, -6849399, 62816580, 99470904, -22505628, -27606440, 54484880, -56768732, 48099876, -5412196, -8247948, -27082990, -34965864, 5380521, -13127568, 15557445, 23420994, -21088290, 13959717, 1753420, 8894877, 26866094, 4118337, 478889, -7937637, 1828582, 1387274, -7537131, 5037997, 5732171, 27032524, -2090039, -16770774, 17119202, 19532438, 4969277, 31452046, -7836705, 15003931, 35155380, 46214384, 34398392, 24540906, 10384694, 4293357, 13889924, 31556736, -14361834, 32364726, 24591372, 15343234, 23153632, 8039105, 31336618, 26750666, 22392348, 33341294, -19667728, 5961415, 9709310, -2107755, -22002580, 56847112, 69080256, -57219164, -52486648, 17656610, -60392072, 1500554, -28310276, 198105, 16386374, 18122614, -49956376, 18570364, -6671695, 26362510, --27431420, -13207024, -32142998, 33925408, -4631049, -15008763, -30055108, 22009024, 12994960, -5214091, --25402048, 11867532, 11246372, 5983427, -22446036, -3255048, -1127429, 25933012, -19564112, -4788889, --28610388, -7552163, 9898826, 22755810, -29768418, -11396696, 31729070, 27133992, -8332774, -19236622, --117575, -9833328, 26509612, -15188078, -8351564, 12783433, 9634149, 16147466, -14537391, 4549981, --20034412, 23108534, 27416924, 12940736, 4297652, -21497386, 24371256, -17301738, 37715720, -27625230, -30324616, -47564080, 32136556, 3982509, -2681133, -33478734, -9868761, 10799695, -8426189, 3176128, --8140574, 9375914, -4048544, 10499048, -10262824, -14388677, -8955544, 9967008, 907312, -1335735, --2332167, -8002061, 5114233, 11665668, -5901822, -1598802, 928787, 1498944, -416075, 1983201, --1862405, 8404177, 494458, 10920491, -9787694, 1720671, -4374424, 11011222, -11770358, 10837276, --12136504, 7205882, 3956202, 13742822, -2973728, 12987981, -11793980, -9912248, -1642288, 21188148, --10055055, 16264504, -5548561, 1988570, 2758443, 11350525, -4669703, 5546951, 2703145, -340913, --303869, 3527779, -753230, -7945690, 15497853, -9450002, 3040837, -7713225, 5412733, -7363185, -8406325, -10912438, 12682502, -10239739, 10908143, -13741748, 12432857, -17282948, 16669842, -10912438, -12116103, -12826383, 12898861, -13064217, 13468481, -12328704, 12906377, -1834488, -12327630, 55091544, -58628452, -34500400, -20433844, 11623255, 55989732, 34782256, 20864952, 20065550, -8914205, -23431194, --7089918, 13153874, -201863, -5521718, 16703665, 287763, 11773042, 1440425, -6261526, -20995410, --5571647, -1232119, 1549946, -834834, -17056926, 19036906, 3177202, -7669201, -431107, -593242, -267899, 12286828, 22577032, 9623948, 2281702, -8135742, -11688217, -3038153, 7333657, 15127949, -20376936, -11381663, -11236708, 2535105, 20598126, 9284646, 4589710, -9316858, -18702972, 15938624, --3294777, 439160, 1076963, 5127117, 4919885, -2278480, -689879, -12202539, 1863479, 10739029, --5116380, 6410776, -3613678, -8699993, 5507222, -1663226, 2973728, -677531, 9336185, 6327024, --13952201, 4097936, 652298, -25302190, -33618320, 947577, 1952063, 7640747, 20444582, 2226404, --9027484, -8836358, 8041253, 8783745, 13336947, 9087614, 550830, 3866544, -1452236, -10162966, --4238059, 1527398, -13945759, -13342853, 8559333, 9092983, -239444, 10229538, -14554570, -2658585, --706522, 702764, -4516158, 2281702, 7823283, 10872710, 5285494, 9152575, -5833103, -11419781, -6654515, 1043140, -2829847, -19475530, -72702520, 30869540, 112121728, 103376640, 88251376, 35198332, --83727168, -52414708, -75270376, -84359064, -75414792, -21974664, 16316044, 63572496, 66234300, 79306032, -52545704, 52977348, 1327145, -55736328, -53213036, -65630320, -51317344, -28585692, -1910724, -18420040, -19964618, 24577414, 39879844, 43765716, 44487808, 26479010, 2260227, 11756399, -9773735, 6290517, --30415348, -22144314, -28126130, -46028092, -36479840, -27997818, -19729470, -32735166, 4567698, 55819004, -63122596, 35201552, 66001836, 16328392, 38527468, 19775640, 11336029, -16616155, -35194572, -48300664, --67775656, -52025476, -77321224, -32064616, -34410204, 22165790, 22261352, 64661808, 74585864, 66357780, -59155660, 57766772, 36196372, 4397510, -20207822, -61877056, -38763152, -80816256, -68845640, -95841120, --15478525, -8628052, 23637890, 30262876, 54630372, 64190972, 53781580, 47953308, 35622996, 20949776, -2993055, -17894982, -25680146, -34675420, -53434224, -37612640, -46520940, -32430224, -16580184, -4850092, -10570988, 10211285, 51095616, 47026672, 46680388, 36334348, 26716308, 3124589, 16617228, -18558554, --30644054, -23951958, -66360464, -77450608, -14915885, -5276368, -3333968, 37687264, 30925912, 41136124, -28893318, 37585796, 11504607, 9670119, -2896956, -16013249, -20494510, -26574574, -29343216, -18138184, --3783866, -22975928, -12064026, 18245022, 26132192, 17448842, 22638772, 15371151, 11236171, 2847027, --2025614, -8031052, -11204496, -8782134, -14011257, -7438347, -2748242, -5360119, -7111929, 1508607, -5422396, 1076963, 8237211, 10339597, 7846905, 5226975, 4565014, 1374390, -846109, -2950643, --749472, -1116692, 394063, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-15177341, -2673617, 219043, -3496104, -7132867, -2373506, 5257040, -8422431, -4627828, -2797634, +-1629403, 2656974, -1183264, 2959769, 1378148, 2590939, -272194, 3210488, -2793876, 511638, +-1215476, 597000, 8129300, -1738925, -480499, -4032974, 5032628, 3099893, 2431488, 6243272, +-3178813, -1829656, 2159295, 5589363, -1490891, -384936, -4501126, -4964982, -3292629, 3526168, +-4376572, -3781719, -454730, 5027796, -6796786, -1460289, -5674726, -2772938, -1607928, 774705, +-490700, -4092567, 5258651, 884763, 4735202, -1913408, -1170916, -5878200, -103616, -2066416, +-2189360, 3375844, 1926293, -1058173, 1845762, 3737159, -1040993, 1602560, -2655901, -1553704, +-623307, -2534568, 2271501, 776852, 1736241, -4016331, 2906082, 1653562, 6522445, 3859565, +-1036698, -4131759, -309238, 896038, 541166, 1280437, -162672, -1401233, 84826, -952946, +36507, -1152125, 439160, -1120450, -45097, 1249836, 452045, 644782, -770410, -563178, +623307, 859530, 421444, -127775, -12489228, -4502200, 3614752, -3322157, -1472100, -1413044, +1713692, -650688, -3281892, 5193153, 4673462, 1541356, -568009, 2399813, -6402723, -953483, +-6327024, -3209414, 4696547, -794569, 852014, -653909, -710280, 92879, 9808095, 8950712, +4021163, 4772246, 5689221, -1107565, -635655, -1966021, 5021891, -500364, -1881733, 1394254, +-2898566, 1988570, 3619584, -1853815, 4078072, 4576288, 8968965, -3514357, -4206384, 3821984, +-2296734, 117038, 1903207, -5215164, 329639, -2733747, -3036542, 6885907, 4069482, 4953708, +-2821257, -3752728, 2644626, -4366908, 3075197, 13298292, 767725, 904091, 3005403, 1290638, +1242319, 7566122, -4038880, -1036698, 1404991, 979789, -3759170, -2780455, -3837553, -1837172, +-1394791, 3474629, -580357, 3490198, 3597572, -3605625, -3837017, -999654, 2441689, 3365644, +-4023848, -792421, -1188095, -2780455, -326954, -2634426, 694711, -181999, 1414655, -810138, +549219, -1026497, -249108, -790274, -3657165, 3959423, 6368363, -3056943, 3149285, 10035191, +3343095, 2297808, -7030325, 5816460, 1515050, -9028558, 3814468, -2533494, -5436355, 2185065, +-769336, 2105608, 5230734, -5509906, -5805722, -2575370, 7857106, 222265, 3891240, 8152922, +-12140262, -9777493, 1574642, 5975374, -4398047, 388695, 8077760, 2089502, -1060857, -2430952, +9669582, 1189169, -2372433, 1359894, -8800388, 1003412, -4859756, 4480725, 769336, 4759361, +-2407329, -1185948, 2135673, 149787, 612033, 280784, 4548907, 3679176, -5017059, 2872796, +4024921, -6862284, 806380, -3088618, 1277753, -1568200, -5322002, 93416, 4566624, 3986267, +8822400, -5464272, 6828998, -4516158, -921271, 4065187, -4438849, -6591164, -2396592, 321049, +-427349, -328028, -723702, 1317481, 2805688, -3829500, -59593, 1838246, -362925, 1580011, +-3156264, -1795833, -1257352, -2302639, 669478, -490163, -1821603, 1005022, 1018981, -1506460, +-2332167, -111669, -549756, 2406792, -128849, -380105, 429497, 526134, -426812, -705985, +1602023, 547608, -1297080, -639413, -995359, 157303, 20176682, 9045201, 12222403, -989453, +-3381750, -4407710, -4421132, 2404108, -3713536, 5626944, -639950, 7721815, 464930, 4084514, +5068062, 3919158, 3353296, 4443681, -14992120, -4432943, -1412507, -3160559, -2777233, -4719632, +-10681047, 479426, 7311108, -4503810, 4387846, -3617436, -5333276, -4022774, 602369, -3395709, +-1265942, -3482145, -248034, 8821863, 464393, 3964792, 5570573, 7252589, -3414499, 1698123, +-1629403, -5599027, 6350109, -3558381, -266825, -5542119, 4043175, -55835, 84826, -1531156, +-2587718, 1874216, 5671505, -2385318, 3191698, 3028489, 2539400, 9763534, -9836549, -4157528, +228170, -5415417, -7023346, -2786360, -8594230, 1282585, 10051834, -6947647, -3324305, -7933879, +499290, -2502355, -3805878, -9300752, 5448703, 7125888, 2807835, 4977330, -2546379, 795106, +-1891933, 2059437, 70867, 4925791, -1294933, 2115272, -118648, -1271847, 1699196, 1171452, +2241436, 1887638, -344134, 444529, 1215476, 490700, 943282, -92342, -966905, -1792612, +862752, 454193, -1245004, 867583, 944893, -313533, 396748, 1160178, -384936, -1072668, +-389231, 6270653, 8941585, -4954245, 4647692, -4043712, -1975685, -1604707, -11108933, 8065949, +-2365990, -1180579, 12783433, 7963406, 8537858, -3477850, 308701, 1529008, -1991254, 2850785, +-6548215, -171262, -4487167, 5228049, -5100811, -3498251, -555125, 892816, -6294275, 1209570, +642098, 8240432, 35433, -11256572, 6463389, 6080063, 8635569, -1374390, 2155537, -6225018, +-4720706, -1964411, -4583804, 1791001, 1165547, -1698660, -710280, 4711579, 7311108, -10043781, +-2196876, -3758, -4145180, -4290136, 6611029, -5342940, 2479270, -5243618, -6974490, -5171678, +-3459059, 2400887, 949188, 12423730, -2128693, -3333432, 3677566, -3730716, -1117228, -3311957, +3437048, -3064459, 4437238, -2230699, -2079301, 3069291, 7436736, 2075543, -7030862, 42950, +-3477313, -7103876, 1991791, 5031018, -1695438, 1165547, 1728724, 249645, -789200, 2590939, +28454, -2878702, -2147, -1035624, -561567, -1495722, 2338610, -556735, -1963337, -2075543, +265751, 2187212, -1003949, -146029, -2937221, 274878, 498216, 986232, -552977, -2463164, +-1309965, 2166811, -909459, -2658585, 1049583, -15432354, 14843944, 7967701, -8856759, -8931921, +3661997, 11783780, -170725, 3456912, 13722421, 4602058, 4131222, -2318746, 7152195, 6536940, +7533910, -13582834, -8342974, -8240432, 6506876, 5614596, 7156490, 343061, -8291435, 3409667, +-1257889, 3752191, -11919071, 4606890, 7220914, -5589900, 3122978, 5843840, 1636383, -173409, +1252520, -1872069, 10434623, 7092602, 5582921, 210990, 3626026, 8055748, -7189776, -3866008, +354872, 10651519, 6813429, 4193499, -8022462, 299574, 5452998, 6362994, -2238215, 1975148, +6211597, 7696045, 2428267, 7116761, 2822867, -790274, -6564321, -36507, -10932302, -4472672, +-5244692, 921807, 3604551, -6325950, -2565706, -11555610, 5029407, -3203509, -84289, 6142340, +8943196, 10814728, 1342177, -1115618, -6704981, -1994476, 3424700, 3701188, -7114077, 2243584, +-3201361, 2617783, 477278, -2392297, 45634, 1280974, -2254858, 1020055, -595390, -2682207, +-1383516, -1684164, 1698123, 2080912, -361851, -1551557, 1117765, -1189706, -861678, -2083596, +-288300, -438624, -2437931, 2027225, 13076565, 4100083, -2217814, -5925981, -15495168, -7510287, +9509058, -3320010, -14240501, -3792993, -2247342, 2192044, 7896298, 12056510, -688269, 3561602, +-2739652, 6018323, -6700686, -7136088, -7681012, -13664438, 7329899, 4185983, -11411728, 373662, +-8327942, -3163780, 7394860, 4198331, 6038724, -1669669, -1563368, -1939178, 13019656, 10145786, +10744934, -4852240, -9152038, 7279433, -1217623, -3223910, 9261023, 1672890, 9111236, -263067, +5100274, -6365142, -320512, 4599910, -19484656, -2914672, 950798, -14246943, 3714610, -3610994, +13331578, 8520678, -8153459, 672699, 12171400, -1232656, 6204617, -4056597, 8367133, -3859028, +1655710, -3198140, 208306, 5884105, -7920457, 8579734, 4385699, 4940286, 1398549, 11393474, +-4463008, -12971875, 2250563, 9048422, -4269198, -8043937, -5832566, -4092030, 9325448, 234613, +-4001299, 422517, 221728, -1778653, -1792075, 620623, 1790465, -1007170, -1228361, -642635, +1993402, -1007707, -3513283, 1018981, -3889093, 3589519, 2301029, -6979, -405874, 987306, +-1139240, 1613834, 143345, 1130113, 197569, 525597, 4112968, 1482301, -2175938, 1207960, +-31410706, -6636798, 16843252, -13594645, -4930623, 14319958, 5389647, -4530654, 1512902, -11841762, +10573673, -1331977, -19102404, 1377611, -1001801, 7231651, 7086696, -3784403, -14963129, -6400038, +-5712844, 329639, -7977902, -4372277, -10173167, -2911988, 11092827, -9095130, -4571993, -3488587, +-5920613, -6241125, -8487392, 5812702, 1182190, 7226283, 1265405, -5305359, -8223252, -8106751, +-1667521, 5424544, 7988103, -2802466, -7267085, 7656316, 3185255, -11420318, -12738336, -25972740, +-2290828, -8284992, -5015448, 3872987, 3959423, 2399813, 11684995, -1196685, -5566815, -682363, +-5999533, 13336410, 7087770, -2567317, 7126962, -7469485, 3744138, 3087008, -7311645, -3193845, +-6555731, 4718559, 3313031, -12065637, 7985955, 12253542, -789737, -562104, -12366285, -4795331, +5464272, -3819837, 3614215, 12149926, -4044786, 2694018, 1239098, 969589, -3825205, 741419, +-610422, -5034776, -3036542, -432181, 1813550, 324270, 1430761, -5250598, 643708, -2796561, +1356673, -3025805, -2940979, -1766842, -164283, 701690, -2244121, 732829, 1312649, -279173, +557272, 2287070, 1285806, -4158065, -2742874, -1272921, 467078, 1606318, -648003, 1629403, +5607617, 20832738, -9722732, 7917236, -5092758, -48855, 11955041, -3446175, -5306969, -2816425, +-1099512, 2101313, 8132521, 27451284, -1497870, 1656784, 7630010, 1778117, 141734, -12841415, +-13348221, 2057826, 1842004, -8396124, -4271345, -1936493, 7621420, -3372623, 1490891, -175020, +3335579, -3438121, 16042240, 8900246, -7474317, 8814347, 7997766, -9699647, 1709397, 4126927, +3224447, -2699924, -3272228, 13346611, -11674795, 4942971, 14779519, -5152350, 1851668, 9458592, +-1019518, 8223252, 4542465, 116501, 4538170, 7052337, 9731322, 6097780, 804770, -372588, +-6684043, -7431367, 293132, 804233, -23284092, 15195594, -3562675, -7227356, -8084202, -17105780, +-19286550, -12557411, 2354716, 9528385, -3487514, 1154273, -1548336, 9465034, -3533684, -7714298, +4377646, 2250026, -3194382, 1134945, 6482717, -6296422, 1256815, -7998303, -2661269, -3612604, +1915019, -970126, 4098473, 2498597, 871342, -1197759, 2087891, 2747169, -62277, -5819144, +3236795, -339839, 4926865, 4642860, 2347737, -2427730, 4268661, 863288, -670015, -221728, +254477, -3929895, 4282620, -475668, -2831457, 4034048, 8230768, -1720134, -1754494, 4131222, +-1664300, -3042984, -1098975, 28195386, 28336584, -816581, -23424752, 4566087, 4821638, -2705293, +6165426, 3510599, 2075006, -281320, -3937948, 22874458, 4263829, -3691525, -25458956, -14341433, +6059662, -1593433, -8824010, -15297063, 2181307, 2583423, 3974455, -3819837, -16711718, -17890150, +19434728, 18339510, 5779416, 16842178, -14347875, 1953136, 7605314, -3041374, -9073655, -16428250, +-8061654, 2898566, -632971, -7711614, 7994008, 144955, 7762080, 6236830, 496606, -17661980, +-10195179, -8308614, -1355062, 1813013, 2406256, -3007014, -4925791, 1212255, 2924336, -15793668, +-3904662, 2579128, 3624953, -7172596, -19679004, -4614943, -4890894, 14583561, -492311, 6561637, +-6529424, -5013838, -8766565, -9883793, -5712307, 1592896, -664109, 12242804, -7200513, 2122251, +14228153, -988916, 7146289, 6331319, 13824963, 3052111, -3915400, -7043210, -6111739, -2426120, +8390755, 1283658, 8458401, 4453344, -577136, -227096, 491237, 676457, -3655017, -4687957, +95563, -1163936, -367220, 1356673, -824634, 1061931, -5357972, -1270774, 3428458, -201863, +2200634, -9322227, -957241, -381715, -1731409, 1897839, 1541893, 1187559, 1713155, 2119030, +-4275103, 5094905, -3276523, 12281459, -6314139, 2145873, -4756677, 950798, 3227668, -7728794, +-5229123, -13798119, -15256261, -10020159, -3923453, -699006, 382252, -8442295, -7821673, -15820512, +7611756, -15855409, -20403780, 13179644, -12230993, -15570330, 14504641, 2755222, -3269007, 15556372, +8982387, -12087112, 11180337, -30819612, -2079301, -7920457, -3284576, -14489609, 25368762, 11877195, +-7421167, 3723737, 8001524, -5309117, 8833137, 133144, 400506, -7247221, 8579197, 9874130, +13357885, -20908438, -716186, -144955, 6202470, -9480067, -3605625, -9649181, -9471477, 16618302, +5385889, -12450036, 6429029, -7702487, -8156143, -13369696, -24285356, 6345278, 16069083, 1088774, +16186658, 21961242, -1294396, -8997956, -20807506, 1621887, -2654827, 1330366, -5184026, 4300336, +-9137543, 19661824, 10899553, 17199196, 3498788, -2121714, -5220533, 7021198, 8130910, 3659849, +-1471026, -2461016, 781684, 9254581, -1620813, 3880503, -5825050, 2520072, -9634149, 940598, +1201517, -4243428, 9103720, 5262946, -2328946, -5980742, -5223754, -1725503, -476205, 2922725, +-6117644, 1584306, 1103807, -447750, -4226248, 1603633, -9176198, -1858647, -2173254, -2562485, +1591285, -166967, -17593796, 2357400, -39244728, -26365730, -18900540, 10227928, 19465328, -27764280, +6441377, 19682762, 12157442, -281320, 7204808, 18558016, -8524973, -1109712, -5406290, 547071, +-12059731, 8573292, 177704, 1013612, 3167539, 24875914, -1261110, -10975789, -10691247, 5929739, +18313204, -7397545, -18551038, 5505611, 18583786, 10849624, -2509872, 9024263, 6094022, 8694624, +1930051, 7364795, 12604655, -1574642, -21261162, 1064615, 6551973, -19922206, -14548128, 19486266, +15286325, -15047418, -9862856, 4759361, -1013612, 9557913, 23694260, -5095442, -4592394, 4505421, +-1231045, 8773008, 4378183, -8639864, -6792491, -3261491, 6935299, 6305549, -6314139, -17176112, +-3037616, -25846576, 24448028, 4123169, -4495757, 2326799, 10125385, -526134, -11368778, 4218195, +-4948876, -7369627, 5746130, -1546725, -11251204, -18489834, -6048925, -7540352, 15257871, -2436857, +5027796, 2903935, 1856500, -1438277, -1337882, 2380486, -4110821, 664109, 5517959, -668941, +-2904472, -1657857, -12617003, -3894462, -350040, -2369211, -9188546, -8242579, -3470871, -1887638, +-836982, -2699387, -497142, 152471, 6902013, 2443300, -1147830, -2810519, 1076426, -2486249, +-2103460, 4481799, -2270427, -5364951, -1582696, -4043712, 474594, -4973036, 132070, 3280281, +1027571, -4772246, -1591822, -15162845, -656056, 2622615, -18586470, -4884452, 13973676, 18176302, +12863964, 33918432, 20459614, 30734786, 11473468, 8098698, -15880642, 17249126, -5807870, -1944010, +-12717398, -8469139, 16666621, -5459977, 37801080, 17586280, 10907606, -2025614, 8740258, -5952288, +-17648020, -8929774, -10954851, 7961796, -10329933, -240518, -11054172, 6462852, 15375983, 13875429, +-917512, 20068234, 16767552, 776852, -5844914, -7678865, -13762149, -4740570, 31645320, 12263742, +36429376, -11755862, 178778, -1249836, 8490077, 29227790, 10013716, 685584, 18793166, 21525840, +22746684, -2079838, -13453448, -4963372, -3721052, -3903052, 15076409, 10272488, 14307610, 21824876, +-13634911, 33022392, -22205518, -41686416, -6451041, -13026636, 8483097, 20070382, 9831717, -11284490, +-1157494, -12253005, -9141301, -6086506, 146029, 16591459, 2797634, -4753455, 2595234, 1198296, +4977330, 5256503, 3610457, 6459631, 1759863, 4041564, 1486596, 4487167, 281320, -13478144, +-5193153, -203474, -12532715, 1315871, -13085155, -6942278, -7946763, -7408819, -6205154, -4610648, +-1757715, 686658, 3749507, 13699872, 1863479, -8791798, 3986267, 739271, 12447889, -2435783, +5368172, -183073, 152471, -6765111, 1567663, 19730542, 32081258, -15973520, -12649216, 11539503, +-9678172, -1759863, -4604205, 4307316, 13931800, 15108084, 22198538, -24516748, 27394376, -9978820, +2238752, -12761958, 11186779, 20806432, 8209293, 3804267, 1101659, 25347824, 5884105, -907312, +-8772471, -3947075, -26498874, -3599720, -13099113, -31496606, 2261837, -1967095, 12401181, -32803886, +-6856379, 7595650, 11649025, 27161374, -7959112, 7848516, 14397804, 2156074, -4278325, 7612830, +-7733089, -1954747, -41375568, 3495030, -17905718, -20571820, -23301808, 9123047, -37110664, 11976516, +-14190572, -18493056, -25390236, 22433152, 24042690, 23934778, 4673462, 4292283, 22550188, -31660352, +-3110093, -9846749, 12774843, -37597068, -12916577, -3998078, 12001749, 9401147, 7701413, 15008763, +-14020384, 5413807, -16923244, -5115843, -10146323, -4095788, -3449933, 339302, -16036334, 7198902, +10072772, -1859184, 708670, -7982734, -2457795, 7590818, -10342818, -330176, 5087926, -12929462, +5879810, -11598022, 161598, 7072201, 1734093, -9529459, -6155762, 3522947, -5207648, 5723581, +4128001, 6620692, -831076, -8361765, 15768972, -7585986, -3729642, -10286447, 7064685, -3578245, +1049583, -9552544, 1315334, -11581379, -1762010, 8296803, -2597382, -4982162, -11967926, 1278827, +1671279, -1708860, -15724949, -29685204, -508954, -10645076, 35097936, 7238631, 24832964, -8207146, +33889440, -21368536, -39864276, 8912057, 6784975, 4458176, -19804632, -22680648, -17671642, 6529961, +-17798344, 7742216, -9429064, 26486526, -8644695, -4107063, 19191524, 502511, -47707424, -19927038, +-618475, 31363462, -3586835, -9955734, -27341224, 4662724, -6725382, -23638964, -27862526, -3320547, +5139465, -9686762, -10590852, -27994060, 18308908, -7005092, 6600828, -13974750, 645319, 8204462, +5087926, 24563992, 282931, -8551817, -31996432, -11366631, 15516643, -21997212, -11142756, 8054138, +17660906, 13689135, 35170952, 26749594, 545998, 20287278, 20901996, 7049652, 867583, 12153147, +-10367514, 52977884, -24337970, -57962196, 15452755, -49343268, -1852205, -38631084, -208843, 47165720, +5975910, -22531936, 7546258, 7988639, -14630269, -12110734, -16559783, 3577708, -4956929, 15097884, +-11873437, 10084046, -19931870, 5571110, -594316, -3299072, -4466766, 13688598, 26311506, 8188892, +10746008, 18114562, 5619428, -18118856, 5374078, -6723235, 12215961, -3775813, -5533529, -699006, +-1116692, -4869956, -14800457, -9791989, -6487011, -821413, 2255395, -1079647, -9324911, -21337398, +-13205951, 3221226, -3616363, -363998, -8010651, 2889439, 15586973, 22196390, -33643016, -22378390, +-13894756, -11812234, 13532368, 21005074, -12352326, 1401233, 18748070, -37948184, 2807835, 8895414, +-28625420, 14829985, -9529459, 13083544, 4926328, 14744623, 1601486, -18551038, 19217294, -24177982, +-5263483, 46826416, -19209778, 17155710, -11143830, 19280646, 17578764, -6142877, -20535312, 21822192, +56761752, -31099858, 8083129, -41275708, 20882668, 12561706, -22362284, 24776592, 2326262, -49561776, +7115150, 2437931, 22624814, -6068789, -3517041, -26039850, -25353192, -13006772, 61872224, -9445170, +31392990, -27589260, 20635708, 10126459, -5737540, -21209086, -3994320, 17467096, 34744136, -12600360, +-11752104, -3676492, 6750615, 30302604, -7772280, -7151121, -22580790, 6922414, -33956548, -15060303, +24060406, 29272886, 3183645, -2407866, -16000364, -26006564, -75670880, 47162500, 17790292, 27098022, +2528125, -24554328, 26897232, -15198816, 11291469, 16125455, 15526307, 36418640, -847182, 8532489, +9896678, -4041564, -16102369, -5248987, 26419418, 16446504, -15081241, -3214783, -10317048, -2556579, +12238509, 3727495, -17627620, -11221676, 16503412, 3945464, -5461588, 8711804, -14943265, -8936216, +-3258270, 7350837, 11587822, 7709467, 2061047, 9363566, -7693897, -9805410, 1564979, -897648, +-13457743, 1679332, -13877576, -437550, -8571681, -1910187, 1918777, -6945499, -13305272, 4551055, +-31807990, 22220550, 21751862, -43097312, 4054449, -22642530, 2678986, -47445968, 47571056, 41485624, +-4387309, -21644488, -7651484, -8674223, 23008676, -23731304, 29713120, -39672076, -23148264, 11316702, +13903883, 3226057, 13415867, 37796248, 10726144, 17438640, 4473746, 18121540, 12714714, -8483634, +3597572, 15348603, -1249299, -1291175, 29995514, 13561359, 39421356, -3609920, 22382148, 76773, +-29171954, 29642790, -15525233, -3309809, 8916889, -27454504, -18797998, 10682121, 42872900, 23561654, +15326054, -55531780, -13184476, -38933880, -643708, 62310848, 40700184, 47144784, 3403225, -45712948, +13918915, 46402288, 9426379, -11597485, 40969692, 4475893, 27273042, -71105328, -59337656, 42417632, +-3412889, -19128710, -45552424, -9834938, -17335024, 19345070, 17545478, 21181168, 21359946, -8960376, +6391448, 39303244, 35907536, 37963752, 2749316, 54546084, 26808112, -9649181, -22009560, 356482, +-11060615, 3264712, 27307938, -4347581, 783295, 20216412, 21825414, 2170569, -335007, 8651675, +24212878, 8710731, 11110007, 16809428, 5526549, 13085155, -1091459, -7335804, -3681324, -2784750, +560493, 17379048, -7113540, 3092377, -14690399, 21027086, 9691594, 9207873, -744103, 10626286, +-492848, 36010616, 8745627, 36971080, -10502806, 32345936, 14306536, 4809290, 13544716, 13940390, +15251429, -4179003, -3431679, 22141630, 7098507, 18557480, -41175316, 24273008, 32386200, 2456721, +11021423, -29346974, 22852448, -13363791, 10912975, 1036698, 19327, 19361176, -6084358, 12590160, +-4152160, -23579908, 6185290, -1675037, 26213796, 22939958, 32615444, 10851772, -25177098, -20745766, +21117280, 23796804, 10908143, 2024540, 7403450, -6601902, -20691542, 3406983, -7768522, 28973850, +20142860, 17634598, 22867480, 23528368, -32815698, 35817880, 35139276, 25769266, -17738214, -15741055, +-22891102, 31170188, 18099530, 51268488, -31512712, -31134754, -24165096, -45616848, -12074764, 48965312, +7594039, 38413112, -41380400, -44177496, 9360881, 27761058, -38723964, 5842230, -30897458, 12018929, +-35630512, -2998961, 16548509, 17570174, -32432372, 12471511, -24741160, -48967460, -1893544, 57471496, +29600378, 23128936, -16416439, -41552196, 62444528, 50470160, 13957033, -56674776, -2509872, -13545253, +39873940, 20218022, 24595130, -29634738, 21718576, -13487271, 14112726, -20644298, 6862821, -23065048, +32503238, -6865505, 5064304, -39576512, 11009612, 4498442, -2161979, -9210557, 7613367, 3672197, +3745212, -24717536, 9851581, 24244016, 1200443, 14372571, 12229383, 9848897, 1277753, 4352413, +145492, 781684, 715112, -8305930, -1256815, 7190849, -510027, 14938433, 12799003, -7672959, +-1752884, 6525129, 2703145, 11332271, -22984518, -694174, -79154640, -16244640, -1588064, 929324, +28145458, -73983496, -7981660, 33414308, -54089744, 12233141, -11969537, 63461900, 34058552, -38953744, +10023380, 42640972, 4799089, -17157858, 14532022, 10115185, 6061810, -978716, -3820910, 3113315, +7431904, 14463302, 44455596, 35030292, 38927972, 26049514, 48906792, 23327042, 49993956, 20117626, +44395468, 308701, 27731530, 24234352, 27482958, 20365662, -1562294, 7747584, -33315524, -20480014, +64636036, 454730, -25248502, -7547868, 20571282, 33472828, 69519952, -9709310, -37630356, -19524384, +-27636504, 38994544, 45439680, 50070728, 16064788, -2220498, 34537444, -58406724, 53204980, 19619410, +-27460948, -916976, -89874872, 1739462, -59278064, -83143584, -20219632, -49039400, -20733418, 93315680, +85899880, 80006648, -62914292, -6905234, -6849399, 62816580, 99470904, -22505628, -27606440, 54484880, +56768732, 48099876, -5412196, -8247948, -27082990, -34965864, 5380521, -13127568, 15557445, 23420994, +21088290, 13959717, 1753420, 8894877, 26866094, 4118337, 478889, -7937637, 1828582, 1387274, +7537131, 5037997, 5732171, 27032524, -2090039, -16770774, 17119202, 19532438, 4969277, 31452046, +7836705, 15003931, 35155380, 46214384, 34398392, 24540906, 10384694, 4293357, 13889924, 31556736, +14361834, 32364726, 24591372, 15343234, 23153632, 8039105, 31336618, 26750666, 22392348, 33341294, +19667728, 5961415, 9709310, -2107755, -22002580, 56847112, 69080256, -57219164, -52486648, 17656610, +60392072, 1500554, -28310276, 198105, 16386374, 18122614, -49956376, 18570364, -6671695, 26362510, +-27431420, -13207024, -32142998, 33925408, -4631049, -15008763, -30055108, 22009024, 12994960, -5214091, +-25402048, 11867532, 11246372, 5983427, -22446036, -3255048, -1127429, 25933012, -19564112, -4788889, +-28610388, -7552163, 9898826, 22755810, -29768418, -11396696, 31729070, 27133992, -8332774, -19236622, +-117575, -9833328, 26509612, -15188078, -8351564, 12783433, 9634149, 16147466, -14537391, 4549981, +-20034412, 23108534, 27416924, 12940736, 4297652, -21497386, 24371256, -17301738, 37715720, -27625230, +30324616, -47564080, 32136556, 3982509, -2681133, -33478734, -9868761, 10799695, -8426189, 3176128, +-8140574, 9375914, -4048544, 10499048, -10262824, -14388677, -8955544, 9967008, 907312, -1335735, +-2332167, -8002061, 5114233, 11665668, -5901822, -1598802, 928787, 1498944, -416075, 1983201, +-1862405, 8404177, 494458, 10920491, -9787694, 1720671, -4374424, 11011222, -11770358, 10837276, +-12136504, 7205882, 3956202, 13742822, -2973728, 12987981, -11793980, -9912248, -1642288, 21188148, +-10055055, 16264504, -5548561, 1988570, 2758443, 11350525, -4669703, 5546951, 2703145, -340913, +-303869, 3527779, -753230, -7945690, 15497853, -9450002, 3040837, -7713225, 5412733, -7363185, +8406325, -10912438, 12682502, -10239739, 10908143, -13741748, 12432857, -17282948, 16669842, -10912438, +12116103, -12826383, 12898861, -13064217, 13468481, -12328704, 12906377, -1834488, -12327630, 55091544, +58628452, -34500400, -20433844, 11623255, 55989732, 34782256, 20864952, 20065550, -8914205, -23431194, +-7089918, 13153874, -201863, -5521718, 16703665, 287763, 11773042, 1440425, -6261526, -20995410, +-5571647, -1232119, 1549946, -834834, -17056926, 19036906, 3177202, -7669201, -431107, -593242, +267899, 12286828, 22577032, 9623948, 2281702, -8135742, -11688217, -3038153, 7333657, 15127949, +20376936, -11381663, -11236708, 2535105, 20598126, 9284646, 4589710, -9316858, -18702972, 15938624, +-3294777, 439160, 1076963, 5127117, 4919885, -2278480, -689879, -12202539, 1863479, 10739029, +-5116380, 6410776, -3613678, -8699993, 5507222, -1663226, 2973728, -677531, 9336185, 6327024, +-13952201, 4097936, 652298, -25302190, -33618320, 947577, 1952063, 7640747, 20444582, 2226404, +-9027484, -8836358, 8041253, 8783745, 13336947, 9087614, 550830, 3866544, -1452236, -10162966, +-4238059, 1527398, -13945759, -13342853, 8559333, 9092983, -239444, 10229538, -14554570, -2658585, +-706522, 702764, -4516158, 2281702, 7823283, 10872710, 5285494, 9152575, -5833103, -11419781, +6654515, 1043140, -2829847, -19475530, -72702520, 30869540, 112121728, 103376640, 88251376, 35198332, +-83727168, -52414708, -75270376, -84359064, -75414792, -21974664, 16316044, 63572496, 66234300, 79306032, +52545704, 52977348, 1327145, -55736328, -53213036, -65630320, -51317344, -28585692, -1910724, -18420040, +19964618, 24577414, 39879844, 43765716, 44487808, 26479010, 2260227, 11756399, -9773735, 6290517, +-30415348, -22144314, -28126130, -46028092, -36479840, -27997818, -19729470, -32735166, 4567698, 55819004, +63122596, 35201552, 66001836, 16328392, 38527468, 19775640, 11336029, -16616155, -35194572, -48300664, +-67775656, -52025476, -77321224, -32064616, -34410204, 22165790, 22261352, 64661808, 74585864, 66357780, +59155660, 57766772, 36196372, 4397510, -20207822, -61877056, -38763152, -80816256, -68845640, -95841120, +-15478525, -8628052, 23637890, 30262876, 54630372, 64190972, 53781580, 47953308, 35622996, 20949776, +2993055, -17894982, -25680146, -34675420, -53434224, -37612640, -46520940, -32430224, -16580184, -4850092, +10570988, 10211285, 51095616, 47026672, 46680388, 36334348, 26716308, 3124589, 16617228, -18558554, +-30644054, -23951958, -66360464, -77450608, -14915885, -5276368, -3333968, 37687264, 30925912, 41136124, +28893318, 37585796, 11504607, 9670119, -2896956, -16013249, -20494510, -26574574, -29343216, -18138184, +-3783866, -22975928, -12064026, 18245022, 26132192, 17448842, 22638772, 15371151, 11236171, 2847027, +-2025614, -8031052, -11204496, -8782134, -14011257, -7438347, -2748242, -5360119, -7111929, 1508607, +5422396, 1076963, 8237211, 10339597, 7846905, 5226975, 4565014, 1374390, -846109, -2950643, +-749472, -1116692, 394063, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { -5164698, --5280663, -4364224, 1209033, -2503966, -403727, -715649, 2529199, 10109279, -2704756, 1017907, --9630927, -5260261, 2934537, -4578435, -3572876, -1351304, -4069482, -1078037, 8386998, -3602941, --5373541, 9064528, 7254737, -2560338, -1684164, 8297340, 2359011, 3218004, 1600412, 406411, --2125472, -3496640, 3287261, -2604898, 2456185, 892816, 944893, -1161252, -2853469, -2236604, -2024540, -2574833, -4070019, -1833951, -1820529, -5180805, 5861557, 9061307, -5214091, 2957622, -249108, -2033667, 1434519, -224412, 73014, -3033858, 5602785, -3324305, -4108673, 4664335, -1422171, -243739, -525060, 2563022, 161061, -72478, -1610613, -806917, 4923107, -7191923, -2446521, 1323924, -1751273, -1719061, -2513630, -3659849, 26307, 3533148, 3607236, 1052267, --71404, 818191, -2007897, 2629594, -999117, 1547799, -1121523, -719944, -543850, -654446, --526134, 1214402, -60666, 501974, 730681, 446677, 1257352, 1592896, -529355, -365609, --716723, -491237, -1016297, -297963, -679679, -553514, -1034013, -404264, -120796, -15923591, --2515240, -5817533, -1432372, 1287953, -4342212, -9705552, 7114077, -2382633, 1655710, 4764193, --1515050, -484258, -594853, 2194192, -1686312, 8014409, -334471, 6182606, 9060770, -10877005, -2276870, 7559143, 517007, 1507534, 5228049, 9669045, 1378148, -2173790, 4861903, -1293859, --2525978, 2180770, 1714766, 2157147, -2729452, 9852655, -4554813, 2486249, 3668439, -44560, --489626, -4807679, 774168, -5570573, 4669703, -5690832, -4379256, 3150896, -5315559, 3637837, --3714610, 1527398, -3001645, 2021319, 4275103, 8393977, 2563559, 949188, 4071629, 61203, --7271380, 961536, 2022393, 2759517, -1843078, 378494, -1017907, 1377611, 4027069, 2439005, -5508296, 1905892, 712965, -3372086, -1745367, 3255585, 2514167, -3229279, 3841312, 1887101, -4202089, -1324997, -1045288, -1329292, 164283, -823560, -3426847, -629750, 524523, 561567, -2156074, 239444, -689879, -840740, 887985, 462783, -1699196, -253403, -166430, 9664, -624918, 177167, -814433, -112206, -774705, -5814312, 4338991, 2779918, 909996, 5433134, --250719, 3033858, 7473243, 4580046, 9787694, 1858647, -1396401, -10006200, 1614908, -6145025, --2001992, 744640, 2294586, -3857418, 43487, 9574556, -4866198, -281320, -4858682, 2309082, -92879, 1840394, 3964255, 4598300, -2864743, 3444564, 3626026, 6920803, 309238, -6834904, -705448, 7337952, -680215, -482110, -973884, 4927401, -5719823, 463856, 3823058, 4931696, -5974300, -2253784, -3844533, -517544, 8568460, 777389, 3119757, -6955700, -3063922, 1665911, -1470489, -1204202, 4556961, -328565, -900869, 2520072, -4327180, 261993, -649614, 2965675, -4611721, -6755984, -1479079, 2169495, 4545686, -2900177, -2738579, 1858647, 5379447, -484258, -3623879, 2540473, 3714610, 1539209, 4140349, 6189048, 268435, 1728188, -1686312, 2516314, -1829119, -1189169, -2768107, -532576, -1955284, 644245, -1786706, 780610, -802085, 431644, --1446330, 33286, -122943, 303869, -861678, 1378148, -1296543, -574989, -569083, -708133, -188979, 775778, 824097, 443992, -379031, -293132, -598074, 1865090, 17311940, 8404714, -6822556, -6437619, -1139777, -8984535, -6423661, 9649718, 870268, -6069863, -2829847, 2077690, --5754183, -504659, 9802189, 3937948, -407485, 3163780, 14374719, -9554155, 2294050, -1775969, --4651450, 8284992, 4198868, 4308389, -3220689, 3723200, 4744328, -1439888, 3044058, -948651, --4101694, 875636, 1537598, -690416, 4865661, 1224603, -1761474, 5410048, -2463701, -2514167, --3123515, 1537061, 2062658, 417149, 3864934, 543850, 12164958, 824634, -10737, -2801393, --2543695, 2944737, -9060770, 401579, 5428302, 4342749, -4894115, 7196755, 117038, 3234110, -5724655, -1598802, 4430796, 3469260, -1580011, -5140002, -3949759, 3266860, 8138426, 2349884, --3546569, -1714766, -2012192, 5631239, -4754529, -243203, 4618164, 5389110, 736050, 701690, --1488743, -2218351, 91268, -496606, -1889786, -364535, -863825, -909996, -1454383, -704912, -1898912, 1318018, -386010, 2492155, 724776, 1020055, -323733, 864899, -438624, -192737, --103616, 308701, 302258, 714038, 1339493, 363998, 152471, -387621, 4168266, 1124208, -11323144, 2839510, 6747931, -285615, 1494112, 1918240, 1879048, -1853278, 6899865, -2887292, -7465727, -3646964, -2896419, 1982664, -4941897, -1387811, -1559073, 2131378, 3102040, -1952063, --7233799, 3316789, -8745627, -3498251, -1490891, -170725, -1377074, 1742683, 7825431, 4459250, -524523, -8110509, -7833484, 304943, 5274757, -2754148, 819265, -964220, -3478924, -5196911, -533650, 3579855, 7546258, 6851547, -881542, 2225867, -9480067, 3272765, 6285685, 7184944, --890132, 6554120, 1387811, 9525164, 5606006, 1848447, 4285841, -399432, -2490007, -1656247, --972273, 5987185, -2294586, -3342558, -4163971, 5974300, -1450088, -10421201, 2066416, 3974992, -5840619, 7590281, 12934294, -5417028, -4456029, 7670275, 8082055, 6387690, 2721936, -1342177, --1489817, -5053566, -5680094, -1588601, -2062121, 1684701, -248571, -1664300, -248571, -3152506, -656056, -442919, 1454383, 173409, -2415919, -227096, 233002, -433255, -240518, 1097364, -2097555, 2097018, 1723893, 424128, 413391, -3248606, 122407, 2185065, -1479079, 1174674, -244276, -959388, -792421, -464393, 2178085, 1589138, 307627, -273804, 1178432, 27917, --15039365, 7305740, 10304700, 1391569, 8577050, 1213865, -7689065, -693100, -3589519, -1860795, -7918309, -10275172, -2876554, 3640522, 4048007, 9364102, -1840930, 4071629, -14623290, -7401840, -3741454, 8688719, -5695127, -4047470, -6104759, -7319161, 3848828, -869731, 73551, 2781528, -1335735, 2900714, 11344619, -6832219, 11009612, -573378, 2251637, 2478196, 2393371, -3285650, -3829500, -7754564, -1482301, -4207994, -821949, -5750961, 7014756, 1275605, 19427748, 658204, --1245004, -4881231, 859530, -4081830, 10153303, -6230387, 1345399, -11327976, 8524436, 7881802, --9410810, 5788006, 5840082, 2471754, -5100274, -5148055, 8552890, 2252710, -12378633, 5975910, --5877663, -3145527, 2798171, -3044595, 1105954, 2550674, 3334505, -6396280, -15683610, 2332704, -3517041, -431644, -3372623, 6241125, -2672544, -1954210, -2906082, 4170413, -5077725, -1949378, --2887829, -2078227, 1272384, -1877438, 2687576, 448824, -4516158, 3367791, 430570, -2252174, --143881, 3042984, 965831, 207232, -406948, -754304, -2397666, 266288, 656056, 369904, --248571, 1436130, -2713346, 363998, 504659, -2941516, -2690260, 6612102, 1274532, -119722, --5582384, -9362492, 3314641, -5018133, -2030446, 9084930, -12360379, -5135707, -9107478, -914291, -7807177, -711891, -6442988, -8927090, -10039486, 3926137, 10618770, -3029563, 6634651, 10001905, --2765422, -2290828, 3911642, 5568425, 11857331, -1704565, 6666326, 980863, 14098767, 10380936, -2838974, -3304977, 1425392, -7799661, 13688598, 3195993, -6035503, -6686191, 7895761, 6681896, -4801237, 3433290, 2346126, 7102266, -3060164, 3142306, -4685273, 692564, 386547, -7100655, --9505299, -3357591, -6712497, 4333622, -4095788, -3029026, -10366977, -6509023, 1992328, -3527779, --1238561, 5000953, 10394358, 13119514, 6818261, 5440113, -4825396, -10653130, 191126, -7451232, --17244294, 167504, -1206886, 6452115, 4346507, -4205310, -9605157, -5207111, 4655208, -212064, --1064615, -3961571, 2134062, 2211371, 1743757, -1006096, -5465346, 1172526, 727460, 553514, --1229971, -654983, -732292, 702764, -2670933, -2738042, -281320, 354872, -2218888, 215285, --436476, 2080375, 2761664, -2954401, -98247, 2177549, -355409, -1228361, 513249, 333397, -2995203, -905701, 1930588, 1529008, -1272384, -19889456, -6159520, 1097901, 9682467, -6976101, -4719632, 3107946, -425202, 14606110, -1981591, 13746043, -8120173, 4037269, 4322885, 172336, --12585328, -5190468, -4717485, -14260365, 4838281, -3547106, 2997887, -890669, 5143224, -18254, --5609228, 2976949, -9208410, 6774774, 3934190, 15636365, -694174, 472983, 14251238, -12618614, -11056320, 13591424, -8531416, 8753680, -3686693, -4105452, -7165616, 1801739, 1609002, 9666361, -6178848, -2490544, -4061965, -8215736, 4461934, 5127117, -9469329, -4237522, 8773544, -15460272, -1395328, -11942157, 6694781, 660888, -284542, 3613141, -4109747, 1374390, 14190572, -5872294, -3059091, 6936372, 4316979, 763967, -7569343, 3322157, 2727304, -4369593, -12232067, 133681, --2835752, -9647570, 7261716, -2626909, 2643016, -384400, 1338956, 3073586, 2940979, -5389647, -1317481, -536871, 1190780, -430034, 3598109, 1821603, -941135, -666794, -5297306, -205085, --3633542, 632434, 558346, 3815005, -5597416, 2071248, 2968359, -2103460, -3488050, 1242856, --534723, -2035815, 1637993, -435402, -2189897, 775242, -759672, -2489471, -726386, -1608465, --3372086, 1588601, -1048509, 318901, -1857037, -375810, -1897302, 903554, 3562139, -462246, --8130910, 23639500, -8790724, 4570382, 3400004, 8419210, 2654290, 5099200, 11809549, -9150965, --5607617, -773631, 16428787, -6362457, -6991133, -8174397, 4060892, 2719788, 8990977, -18778670, -177704, 372588, -1273995, 9614821, -2339684, 7408819, 13788456, -10047002, -4498442, 3905199, --7522635, -9483288, 6360310, -8811125, 12965433, -2238215, -13352516, -1788854, -7668127, 4217121, -10574209, -227633, 5346698, -678605, 2052994, 12578349, 383863, 9117142, 3606699, -6868190, -7128035, 6080063, 837519, 5104032, 18076980, -3021510, -8139500, 4275640, -10300942, 784905, -17265232, 5844914, 2717104, -3312494, -4956929, -3350075, -6121402, 10394358, -6852084, -1843615, --4275640, 11798275, -21734682, 7412040, 7646116, 13055090, 3090766, 976568, 11508365, -3277060, --4993973, -6540699, 152471, -5443334, -554051, -4685810, 3768834, 332860, -4172024, -4401805, --3684008, 1382443, 4495220, 3598109, 767725, 248571, -1930588, -4763119, -1593970, -1242319, -1947768, 1985886, -804233, -1186485, 922344, -2862596, -17717, -2778307, -1403381, -3652333, --4912369, -1381369, 1669132, 5435818, 869731, -1530082, -1464047, 2123325, -534187, 5212480, -2355790, 895501, 725313, 34939560, 10427107, -6367826, -8485782, -7148436, 25313464, -21814676, -1736241, 8544837, 1263794, -11826729, -2675228, 5937793, -1267015, 1379758, 10500658, -10865730, --9128416, 4481262, 13687524, 8437463, 3535295, -6630356, -6481106, -6238440, -7269232, 6780680, -2692945, 9716290, 7793218, 4442070, -10310069, -4900021, -10983305, -2176475, -7205345, -16588237, --3091303, 7419019, 1648731, -7692287, -7758859, 200790, 4014721, 10392210, 1321239, 5272609, -1505386, 20076288, -17413944, 11400991, 2137820, -17765058, -3208878, -5350456, -4395362, 2737505, --7778186, 4702989, 3416110, 7965554, -9700184, 3445101, 15538655, 7285875, 24688008, -5513128, --612570, -6058588, -3103114, 680752, -490163, -23398982, 10436234, -974421, -1369021, 6361384, -6286759, -6626598, -9969156, -10900090, -4052839, 7755637, 3302830, -2535105, -6440304, 5695664, --10128070, 5316096, -1657857, -4576288, -5724118, -6206228, -2240362, -2061584, 987306, -2585034, --1751810, 1296006, -1858110, -1729798, 1079111, -5070746, -2312303, -344134, -1725503, -2898566, --1293859, -5149666, 733903, 3871376, 5210869, 6117644, -4432406, -5425618, -3849365, -4905390, -189515, -3221, -3009162, -3422015, 1322313, -449361, 3399467, -1048509, -244276, 2638184, -2640868, -2114735, -11694659, 2843805, 6362994, -243203, -7185481, -4986457, -15532749, -18456548, -3832185, -8178692, -3895535, 2718714, -154082, -1928977, -8236137, -4085051, -78920, 6484864, -6908992, -10136660, -5816460, 6388227, -9084930, -4459250, -14879377, 14408542, -1874753, 12981002, -1136019, 4871567, 13790066, 10425496, -6122476, 3144453, 7012071, -7361574, -2997350, 6833830, --2533494, -16526497, -3071975, -11578695, 16992502, -1793149, -4510253, -9711458, -14173392, 5083094, -3005940, 3346317, 6994891, 165893, -2583423, 7320772, 1869921, -1395864, 2575370, -4088272, -11229729, -2650532, 7085623, 20964272, 4675072, 3940096, 4909685, 7736847, -18246632, -14768245, -5623186, -16119012, 11164231, -2274722, 12790949, 3379603, 24937654, 9793599, 1698123, -7245610, --3214783, -12823162, -864362, 4001836, 2505040, 2726767, 4408247, 11380590, -4733054, -9228811, --3208341, -2564632, 3582003, 10326712, 3652333, -2489471, 2977486, 3029026, -532039, -2386928, --6010807, 404264, 677531, -2933463, -3977677, -758062, -6374269, 4471061, 2538326, -2997350, --971736, -6331856, -3103651, 2927020, 5541582, -2783676, -2572686, -117038, -5087926, 5395016, --255551, 3885872, -5263483, 2147, -5453535, 3192235, -6471442, -1468342, -29772714, -20850456, -7736310, -8304856, -17219060, -26137024, -636729, 2084670, -5068062, -4174708, 24928528, 6541235, --18026514, 3772055, -11000485, -9253507, -8932995, -16099148, -2659122, 1484448, -22169548, -20992726, --7975218, 3473018, 2067490, 12719546, 10765872, 6688875, -5337571, -207232, 4920422, -11369852, --6338298, -3879429, 3765613, -10681584, -6524056, 7300371, 4422743, -289373, -1639067, -1995012, -6086506, -15381888, -8764418, -7573101, 10205379, -11923366, 8106214, 13665512, 18722300, -1245004, -5389110, -4438849, -8930311, -11724724, -3157875, 11559368, 4350802, -20989506, 932545, 21721798, --14421963, 702227, -3074660, 1158031, 5168457, 11077794, -2291365, 3519726, 13302051, 9145596, -5862094, -10174241, -12241194, 8949638, -8856223, -16772384, -16106664, 17553532, 6687801, 9696426, -4167729, -2764348, -3377992, 8375186, 5939403, 1578937, 8072928, -3217468, -10566693, -5459977, --7362111, 2961380, 10699300, 5208722, 1300838, 6330782, 3520263, 5902896, -1120987, -3029026, -3640522, -1319629, -4087198, -3486440, 2825015, -9766756, 2155537, 5728413, -3436511, 7086696, -4866198, -408559, -765041, 6680822, 835371, -1545115, -4248797, -4181151, 1176821, 3521873, -810138, 2835752, -4233764, -17400524, 9601936, -14085882, -25107842, 4529580, -15264851, -8873402, -29669634, 2012192, 22216792, 19985556, -4006668, 21046950, 29132226, 20708184, -26051124, -3484829, --12106439, -12274480, -7500624, 515396, -10737955, 22725208, 6759205, 12466679, -10641318, 11932493, -9197672, 3048353, -13553843, -10558103, 21646098, -3964255, -20181514, -1387811, -23359254, -3383361, -6509560, -8392903, 530965, -19084688, 8774081, 17273284, 9382356, -2563022, -9338870, -3512210, --2334315, -3262565, -8744553, -23447300, 15851651, 8881455, 8294656, 9895605, -13285944, 20645908, -2627983, -6268505, -4575751, -16509854, -7232725, 10650445, 6643778, 17648558, -1871532, -20278688, --35497904, -2130841, -212601, 100932, -12767864, -17945984, -3372086, 11805791, -6208375, -7289633, -4751308, -1646583, 18090940, -3612068, -16012175, -5797132, 16850230, 1021665, 3237869, -16410533, --5769752, -3142306, 6805376, 8696772, -4284230, 2986076, 712428, 6495601, 4323422, -723702, -2961380, 8722005, 2180233, -216359, -2881923, 927713, 5840619, -260919, 2986076, 9979357, -1510755, -3520263, -7405598, -883690, 5425081, -5223754, 2783676, -2385854, -1562831, -3504693, --4445291, -3450469, 93952, 6280316, 4969814, -6806450, -12377559, -3730179, 4645007, 1607392, -1684701, 37877852, 23890218, -3391414, -22062174, 4642323, 11000485, 6338298, 16076599, 24128590, --10647224, 1986422, -21566104, 6106370, 1780264, -8370892, 38863548, 14725295, 33534030, 13840532, -8651675, -29221884, 453119, 16292422, 2973191, -15559056, 6578280, -23782308, -9280351, 1627793, -7168838, -7129109, -4619238, 5145371, 4206384, 1707786, 21058224, 13070659, 3469260, -8439074, -14505178, -9439801, -6766184, -13874355, -4610648, 18073222, -28563680, -449898, 12827457, -14266271, --4476430, 5426691, 4828080, 26370026, -1513976, -310311, -12306692, 25781614, -11483132, 3244311, -2716030, 17848274, -4158065, -6463926, 17011292, -28702192, 7487202, 2734821, -11882564, 22923852, --28660316, -3653944, -9574019, -19267224, -9622874, -1725503, 8173860, 18004502, 29734058, 14484240, -19653234, 29898342, -12160126, 5496485, 7538205, -12801150, 17311940, 325344, -22891638, 11998528, -6367826, -8407935, 818728, 17670032, 13395466, 3924526, 10576357, 3118683, 3469260, 9690520, --1710471, 4107063, 8705899, -2138894, 1941862, -1613834, -450435, 6095096, 1254667, 624918, --5310727, -3214246, -3661997, -7601019, 1700270, -4211216, -12054899, 4617627, 7326678, -2537789, --66035, 3217468, -4123169, -179852, 12861280, -1973001, -3508452, -8126615, -36710696, 10171556, -1933809, 44338020, 10126459, 8335458, -1217086, 21625160, 5837935, -32502702, -4989679, 34774740, --10302553, -7322383, 2934000, -2404645, 790274, -6331856, 36215164, 41199472, -22152904, 10001368, -11093901, 6024229, 11705396, -18133352, -25047176, 19280646, 5299990, -13853954, -23944980, -7188702, --8129836, 21905944, 17905718, 10049687, -20271708, 11151346, -8780524, 7110319, 1222992, 9411884, -20657718, 4754529, -46166604, -14148159, 8488466, -18496276, 5632313, 19593640, 6591701, 34118684, --11280195, -51246476, -1175210, -20428476, 17841832, 15477988, -5579700, -10898480, 15847356, -24609088, --4381941, -13295608, 11635066, 16027744, 13698798, 14891188, -11087458, -20853140, -62065500, -29677150, --36113160, 5710696, -24471114, -11863237, -4971425, -26927298, 14452028, -48480516, 15113453, -34861712, --25249576, 24869472, 29388850, -9023189, -1177895, 15917149, 20725364, -28452548, 632434, 4664872, --4079145, 5025649, 15312632, -1948305, 6779606, -1288490, 5992553, -12577275, -6581501, -5733245, --8267275, -1796907, 12020003, 4991289, 10822781, 409633, -11414949, -10379325, 1824287, 6305012, --2348810, 6695317, 6998649, 16860968, 1670742, 5803575, 1850594, 4022237, -7407745, -2270427, -3103114, -6027987, 324270, -2760590, 727460, 3132642, 17623862, -1617055, -10432476, -11577621, -1161252, -654983, -18408230, -10794863, 7621420, -12106439, -596464, -156229, -48012364, -7062000, -31971736, -37949796, 3831648, 14191646, 513249, 9953587, -2724620, -30061550, -2397666, 16397111, -5628555, 24423868, 16665010, -25784836, -27793270, -3701725, -11957726, -3958349, -45888504, 17212618, -18356690, 32192390, 14751065, 29302414, -12561169, 4027069, 30209190, -9505836, 32866700, 9124658, -17428440, 5860483, -8250096, 16200617, -19801410, 970663, 41504416, -32154810, 3044058, -41823856, --18763102, -30079266, -20387136, -5272073, 2263448, -9893457, -31819266, -5771899, -52893060, 59782188, -21026012, 335544, -8057896, -14475650, 3353296, -26339960, 4893579, -39461624, 925565, 1983738, -8833137, 25245280, 36420784, 1227287, -61062624, -28090696, 26176216, -13350369, -12199318, -14823543, --8126615, 30103962, 6258304, -16962974, 12640089, -28330142, 4910758, -5402532, -12584254, -28603946, --16201690, 18023294, -8630200, -6966974, 9686762, -10672457, -3350075, 17931488, -21079700, -14323179, --6190122, -4446365, 22535694, 10470593, 6077379, 13298829, 5190468, -2282238, 10362682, -307090, -7587060, 10835129, 16944182, -6706055, -202400, -1986959, 12472048, 18976776, 6998649, -4677757, --1449552, -5891085, -13921063, 24271934, -7232188, 12452721, -7285339, 3755412, -7740605, -5648956, -6139656, 11019275, -23813446, 16870632, 27314382, 10059350, -12475806, -16615618, 7963406, -21450678, -33951716, 28268938, 43029668, -30693446, -37789808, -9505299, -860067, -19135690, 25312926, 30682710, --22688702, -96100, -40464496, -11968463, -19153944, -36564668, 11578695, 30144228, 18297634, -23775328, --9181566, 2764885, 20360830, 3022046, -1426466, 7614977, -2244657, -10299868, -32695976, -22230214, -8505646, -3078418, -17753248, 19326816, 17277580, 10951093, -33451352, -30587684, 29000156, 17449378, -21584358, -21837224, -55770688, -10562398, 23620710, 23345832, -5617817, 56500296, -6912213, 56797184, --85290000, -105902080, -43386148, -63807108, 875636, 24849608, 13223667, 68977176, -7704098, -4530654, -12991739, -13806172, -54291608, -48511656, -53821844, 43117176, 35483408, -13383118, -3497177, -90292024, -25307022, -1211181, -40127880, 16687022, 25985090, 39846560, 31456878, 14419816, -2608119, -26865558, -972810, 1273995, -7335804, -11595338, 32024886, 19575388, 12576738, 32408212, -24830280, 5915781, --6824703, -15564425, 20513300, -3256659, -35323960, -305480, 11375758, -12796855, 17024714, -6825240, -4684736, -7913477, 39586176, 30712774, 36688148, -30840550, -6812355, 37755448, 28139552, -26879516, --16406238, -27073326, -15752866, 22012782, 25238302, -8858907, -2379949, 42107324, 1942936, 3870839, --5374078, 7490960, 7435662, 6911676, 12130061, -40904196, 35690640, 27307938, 11113228, 33791192, --19881404, 12508555, -55881284, -26883274, 14597520, 20697984, 9382356, 7291781, 6860137, 14533096, --6864969, 63592360, 5640903, 39638252, 11272142, -18977850, 48298516, -6484327, 18911278, 1105954, -17250200, -1728724, -1136019, 10727755, 24185498, 7176891, 17641578, 1347546, -3755949, 38299832, -4248260, -7952132, 557272, -2905546, -19331110, -5403606, 10657424, 7203734, -43203612, -10433549, -5341866, 10067403, 44964012, 36821292, -44671956, -24469502, 3578245, -9774809, 49524196, 4932233, -45670536, -32140314, 22941568, 4731980, 2440078, 21342230, 46940772, 30606474, 6180995, 41668164, -16247861, -19504520, -42031088, 36837936, -33538862, 22298934, -44137232, 247497, -69940320, 72538240, --18022756, 2537789, -49000744, 44040596, -17169132, 13955959, -35976792, 42534136, -22251152, -19976966, --14627585, -26721140, 8227010, -14974403, 12597139, -13886703, 23209466, -26106958, 23255100, -27489402, -15067282, -32189170, 25649544, -11136313, 28478854, -9993852, 14898168, -12174085, 9595494, -13887240, -450972, -15177341, 17273284, 7036767, 4858682, -6087043, 1629403, -12139188, 9273908, -12473122, -21810380, -18148922, -21587580, -9779641, 8683887, -25661356, 19734300, -6396280, 10830834, -7355132, -6159520, -11854647, 5494337, -6161668, 6586869, -2030446, -69959648, -17481054, -5423470, 7377143, -6280316, -43545600, -25300578, 39353176, -15261629, 14516453, -17413944, 3847217, 49437220, 79685064, -5526013, -2837363, 40025872, 17437568, 16579111, 49334140, 1111860, 29862908, 36239860, 34775812, --13634911, 15024869, 31327492, 43588548, 35692788, 53609780, 30296700, 68462856, 72685344, 52494700, -57957364, 39460548, -4317516, 19306952, 10282152, -15044734, -14824616, 11349988, 33843268, 7661148, -1567126, -246961, 16729971, 50302120, 39168492, 84515832, 17067664, -43992812, 17541720, 770410, -17935784, -22649510, 33627984, -61435212, -79102560, 22014392, 79542256, 34493956, 15892990, -98717672, -569620, 37351720, 59565292, 79878872, -34011848, 4813048, -137941472, -91093568, 36843840, 51518668, --76838576, -65705484, -40889700, 75249976, 50280108, -90382216, -116525144, -23755464, 47414828, -55947316, -26495654, -8759586, -20204600, -30343944, 4111358, 11723650, 19552838, -3762391, -48289928, -41973104, -5063767, -13276281, 20141786, 2452963, -5114769, -18652506, -12259447, 7282654, -1210107, -40427452, --20327006, -30702574, -15854872, 5092221, -15647103, -11768210, -36083632, -48142288, -65935264, -66071092, --55643984, -47536700, -52207476, -52105468, -39735964, -54952496, -58031452, -49638548, -55778204, -36383204, --9934796, -32364190, -46662136, -31232466, 1142461, -17441326, -9554692, -11639361, 23698556, 25040196, -464393, 10836739, 12772159, 6851547, 7050189, -721555, 5334887, 3546569, -26832272, 66924716, -73720968, -83197808, -35548908, 33078228, -24147916, 16941498, -31431108, 28802588, -26725970, 7348689, --761283, -11534135, 5674726, 2480881, -8715026, -4887136, -21520470, -4489852, 3799972, 3595425, --21921514, 21182778, -20176146, -5640903, -17603460, 2993055, -16887812, 33927020, -1552631, 9757629, --9704479, 9730248, -10269267, 10424959, 19203872, 28381680, -8300561, 10233833, 9182103, 25043418, --15888158, 16487843, -14277545, 29874182, -8553964, -15360414, 8411157, -6183143, -9682467, 4290136, --3505767, 13379897, -7570954, -15469398, -16954920, 3473018, 2113661, -27666568, 7727183, -3479461, --3853123, 5896990, -9079561, -3933653, 1909113, -3633542, 2935610, -14471892, 17034914, -50247360, -25985626, -20885352, 33252174, -22040162, 29650844, 562104, 15607911, 10631655, 12477417, 7191386, -1176284, 6870337, -2205466, -20586852, -5639829, 2003065, -9874130, -3063386, -5733782, -1281511, -31675, -7158637, -1869921, 4156455, -1998770, -12339978, 13188234, -1280974, 6449967, -13164075, -5649493, -7670812, 4615479, -9127879, 10597295, -13894219, 20170240, -2819109, 1624035, -20899310, -14015015, 244813, 9783936, -19717658, 3899294, -7415261, 1806034, -2887292, 503585, -12394202, -5332202, -1301375, -10181220, 2428804, 15556372, -17833242, -470299, -5937256, 8320963, -11896523, -11062762, -9127879, 1496796, -5953362, 7838316, -1698660, 3164854, -2026688, 3651796, -5495948, -1864553, -1134408, -4429722, 1763621, 558883, 1500554, -1970316, 5234492, -1410360, 1239098, --4015795, 7402376, -9881109, 3321620, -13566728, 63551556, 38538740, -20952462, -24102820, -2110977, -78964048, 32992328, 11072426, 21859236, -19147502, -24171002, 6736120, 15329812, 3999152, 1391033, --8408472, -6551973, 7430294, 7575786, 18383534, 8181913, -9911174, -4369593, -4900558, -9990094, --111132, 1762547, 4896800, 6233608, 190589, -2652142, 7336878, -21195126, -8055211, 9429064, -13519483, 16762720, -9436043, -5490042, -10031970, 17145510, 11860552, -3246459, 5447093, -19815368, --17149268, 15821586, 12304008, 3881040, -30031486, -15439871, 1232119, 5002563, 19763292, 14129906, --2221572, 5811091, 7019587, -9388262, 8580271, 9309878, -2756832, -5729487, 5529771, -10052371, -937914, -1720671, -7056632, -10769094, 14936823, 3052111, 3304977, 20577188, 25031070, 8860518, -20255602, 18962818, -3000035, -5127654, -5709086, -3663070, 7902740, 12934294, -5031018, 3977677, --11625940, -4230006, -580894, 2756832, -6345814, -7573638, 7818988, 14970645, 6468758, 4148402, -6264747, -7205345, 578210, 7119982, 1388348, -2244657, 1789391, -739808, -8732205, 17752710, -5779952, -14215805, -13427678, 5395553, -2667175, 13997835, 7406671, -1797444, 5226439, 1792612, --2901787, -652835, -4051228, 4097399, 6420439, 991064, -1686312, -5567352, 4757213, -1108638, --22798224, -62870804, 21777632, 115624280, 90913184, 87067040, 27836220, -80922016, -48547088, -71734008, --71970232, -65578780, -22892176, 35391604, 45601280, 71744208, 64250028, 38718592, 6505802, 6344741, --31079994, -49118856, -70338144, -27018566, -19088446, 6362457, -3955665, 35748088, 24126978, 10302553, -47747152, 26851062, 20444582, -4118337, 17942226, -32363652, -24422258, -20158966, -23587960, -31040802, --18719078, -12353400, -31609886, -21826486, 8416525, 46592344, 44944684, 51084340, 40099964, 58400280, -10115722, 14999636, -38766376, -28661390, -24604794, -58137216, -57931056, -51942260, -24558622, -30415348, -7168838, 22622130, 32510218, 65351148, 64165200, 61452392, 55104968, 48260936, 10320806, -28279138, --46134392, -82390896, -70807368, -51601348, -70377336, -32615982, -14673219, 3161096, 69107096, 54202488, -79492328, 78556024, 57380764, 16109885, -15825344, -23417772, -27187142, -24218784, -46749644, -57812408, --40397924, -27568322, -24387362, 3126199, 16289200, 25919590, 22317724, 46600396, 50925428, 38513508, -30630096, 5166309, -10724533, -21898428, -35871028, -30802968, -21850110, -34409132, -46649252, -4879083, -2746632, -7626788, 40273372, 53151832, 34029564, 29905320, 2279017, 8497593, -5473399, -9287867, --23160074, -27224724, -17851494, -20332912, 2971044, -8076149, 2704756, 469762, 18398566, 9927817, -9543954, 17205638, 17582522, 109522, -4488241, -12349105, -12289512, -3447248, -2666638, -5901822, --5779952, 1298154, 1684701, -1341640, 3221226, 3459596, 3337727, 1105417, 11629698, 4390531, -126165, 2072322, 37581, -3620121, -3052111, -3062312, -1673964, -1042603, 250719, -383863, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-5280663, -4364224, 1209033, -2503966, -403727, -715649, 2529199, 10109279, -2704756, 1017907, +-9630927, -5260261, 2934537, -4578435, -3572876, -1351304, -4069482, -1078037, 8386998, -3602941, +-5373541, 9064528, 7254737, -2560338, -1684164, 8297340, 2359011, 3218004, 1600412, 406411, +-2125472, -3496640, 3287261, -2604898, 2456185, 892816, 944893, -1161252, -2853469, -2236604, +2024540, -2574833, -4070019, -1833951, -1820529, -5180805, 5861557, 9061307, -5214091, 2957622, +249108, -2033667, 1434519, -224412, 73014, -3033858, 5602785, -3324305, -4108673, 4664335, +1422171, -243739, -525060, 2563022, 161061, -72478, -1610613, -806917, 4923107, -7191923, +2446521, 1323924, -1751273, -1719061, -2513630, -3659849, 26307, 3533148, 3607236, 1052267, +-71404, 818191, -2007897, 2629594, -999117, 1547799, -1121523, -719944, -543850, -654446, +-526134, 1214402, -60666, 501974, 730681, 446677, 1257352, 1592896, -529355, -365609, +-716723, -491237, -1016297, -297963, -679679, -553514, -1034013, -404264, -120796, -15923591, +-2515240, -5817533, -1432372, 1287953, -4342212, -9705552, 7114077, -2382633, 1655710, 4764193, +-1515050, -484258, -594853, 2194192, -1686312, 8014409, -334471, 6182606, 9060770, -10877005, +2276870, 7559143, 517007, 1507534, 5228049, 9669045, 1378148, -2173790, 4861903, -1293859, +-2525978, 2180770, 1714766, 2157147, -2729452, 9852655, -4554813, 2486249, 3668439, -44560, +-489626, -4807679, 774168, -5570573, 4669703, -5690832, -4379256, 3150896, -5315559, 3637837, +-3714610, 1527398, -3001645, 2021319, 4275103, 8393977, 2563559, 949188, 4071629, 61203, +-7271380, 961536, 2022393, 2759517, -1843078, 378494, -1017907, 1377611, 4027069, 2439005, +5508296, 1905892, 712965, -3372086, -1745367, 3255585, 2514167, -3229279, 3841312, 1887101, +4202089, -1324997, -1045288, -1329292, 164283, -823560, -3426847, -629750, 524523, 561567, +2156074, 239444, -689879, -840740, 887985, 462783, -1699196, -253403, -166430, 9664, +624918, 177167, -814433, -112206, -774705, -5814312, 4338991, 2779918, 909996, 5433134, +-250719, 3033858, 7473243, 4580046, 9787694, 1858647, -1396401, -10006200, 1614908, -6145025, +-2001992, 744640, 2294586, -3857418, 43487, 9574556, -4866198, -281320, -4858682, 2309082, +92879, 1840394, 3964255, 4598300, -2864743, 3444564, 3626026, 6920803, 309238, -6834904, +705448, 7337952, -680215, -482110, -973884, 4927401, -5719823, 463856, 3823058, 4931696, +5974300, -2253784, -3844533, -517544, 8568460, 777389, 3119757, -6955700, -3063922, 1665911, +1470489, -1204202, 4556961, -328565, -900869, 2520072, -4327180, 261993, -649614, 2965675, +4611721, -6755984, -1479079, 2169495, 4545686, -2900177, -2738579, 1858647, 5379447, -484258, +3623879, 2540473, 3714610, 1539209, 4140349, 6189048, 268435, 1728188, -1686312, 2516314, +1829119, -1189169, -2768107, -532576, -1955284, 644245, -1786706, 780610, -802085, 431644, +-1446330, 33286, -122943, 303869, -861678, 1378148, -1296543, -574989, -569083, -708133, +188979, 775778, 824097, 443992, -379031, -293132, -598074, 1865090, 17311940, 8404714, +6822556, -6437619, -1139777, -8984535, -6423661, 9649718, 870268, -6069863, -2829847, 2077690, +-5754183, -504659, 9802189, 3937948, -407485, 3163780, 14374719, -9554155, 2294050, -1775969, +-4651450, 8284992, 4198868, 4308389, -3220689, 3723200, 4744328, -1439888, 3044058, -948651, +-4101694, 875636, 1537598, -690416, 4865661, 1224603, -1761474, 5410048, -2463701, -2514167, +-3123515, 1537061, 2062658, 417149, 3864934, 543850, 12164958, 824634, -10737, -2801393, +-2543695, 2944737, -9060770, 401579, 5428302, 4342749, -4894115, 7196755, 117038, 3234110, +5724655, -1598802, 4430796, 3469260, -1580011, -5140002, -3949759, 3266860, 8138426, 2349884, +-3546569, -1714766, -2012192, 5631239, -4754529, -243203, 4618164, 5389110, 736050, 701690, +-1488743, -2218351, 91268, -496606, -1889786, -364535, -863825, -909996, -1454383, -704912, +1898912, 1318018, -386010, 2492155, 724776, 1020055, -323733, 864899, -438624, -192737, +-103616, 308701, 302258, 714038, 1339493, 363998, 152471, -387621, 4168266, 1124208, +11323144, 2839510, 6747931, -285615, 1494112, 1918240, 1879048, -1853278, 6899865, -2887292, +7465727, -3646964, -2896419, 1982664, -4941897, -1387811, -1559073, 2131378, 3102040, -1952063, +-7233799, 3316789, -8745627, -3498251, -1490891, -170725, -1377074, 1742683, 7825431, 4459250, +524523, -8110509, -7833484, 304943, 5274757, -2754148, 819265, -964220, -3478924, -5196911, +533650, 3579855, 7546258, 6851547, -881542, 2225867, -9480067, 3272765, 6285685, 7184944, +-890132, 6554120, 1387811, 9525164, 5606006, 1848447, 4285841, -399432, -2490007, -1656247, +-972273, 5987185, -2294586, -3342558, -4163971, 5974300, -1450088, -10421201, 2066416, 3974992, +5840619, 7590281, 12934294, -5417028, -4456029, 7670275, 8082055, 6387690, 2721936, -1342177, +-1489817, -5053566, -5680094, -1588601, -2062121, 1684701, -248571, -1664300, -248571, -3152506, +656056, -442919, 1454383, 173409, -2415919, -227096, 233002, -433255, -240518, 1097364, +2097555, 2097018, 1723893, 424128, 413391, -3248606, 122407, 2185065, -1479079, 1174674, +244276, -959388, -792421, -464393, 2178085, 1589138, 307627, -273804, 1178432, 27917, +-15039365, 7305740, 10304700, 1391569, 8577050, 1213865, -7689065, -693100, -3589519, -1860795, +7918309, -10275172, -2876554, 3640522, 4048007, 9364102, -1840930, 4071629, -14623290, -7401840, +3741454, 8688719, -5695127, -4047470, -6104759, -7319161, 3848828, -869731, 73551, 2781528, +1335735, 2900714, 11344619, -6832219, 11009612, -573378, 2251637, 2478196, 2393371, -3285650, +3829500, -7754564, -1482301, -4207994, -821949, -5750961, 7014756, 1275605, 19427748, 658204, +-1245004, -4881231, 859530, -4081830, 10153303, -6230387, 1345399, -11327976, 8524436, 7881802, +-9410810, 5788006, 5840082, 2471754, -5100274, -5148055, 8552890, 2252710, -12378633, 5975910, +-5877663, -3145527, 2798171, -3044595, 1105954, 2550674, 3334505, -6396280, -15683610, 2332704, +3517041, -431644, -3372623, 6241125, -2672544, -1954210, -2906082, 4170413, -5077725, -1949378, +-2887829, -2078227, 1272384, -1877438, 2687576, 448824, -4516158, 3367791, 430570, -2252174, +-143881, 3042984, 965831, 207232, -406948, -754304, -2397666, 266288, 656056, 369904, +-248571, 1436130, -2713346, 363998, 504659, -2941516, -2690260, 6612102, 1274532, -119722, +-5582384, -9362492, 3314641, -5018133, -2030446, 9084930, -12360379, -5135707, -9107478, -914291, +7807177, -711891, -6442988, -8927090, -10039486, 3926137, 10618770, -3029563, 6634651, 10001905, +-2765422, -2290828, 3911642, 5568425, 11857331, -1704565, 6666326, 980863, 14098767, 10380936, +2838974, -3304977, 1425392, -7799661, 13688598, 3195993, -6035503, -6686191, 7895761, 6681896, +4801237, 3433290, 2346126, 7102266, -3060164, 3142306, -4685273, 692564, 386547, -7100655, +-9505299, -3357591, -6712497, 4333622, -4095788, -3029026, -10366977, -6509023, 1992328, -3527779, +-1238561, 5000953, 10394358, 13119514, 6818261, 5440113, -4825396, -10653130, 191126, -7451232, +-17244294, 167504, -1206886, 6452115, 4346507, -4205310, -9605157, -5207111, 4655208, -212064, +-1064615, -3961571, 2134062, 2211371, 1743757, -1006096, -5465346, 1172526, 727460, 553514, +-1229971, -654983, -732292, 702764, -2670933, -2738042, -281320, 354872, -2218888, 215285, +-436476, 2080375, 2761664, -2954401, -98247, 2177549, -355409, -1228361, 513249, 333397, +2995203, -905701, 1930588, 1529008, -1272384, -19889456, -6159520, 1097901, 9682467, -6976101, +4719632, 3107946, -425202, 14606110, -1981591, 13746043, -8120173, 4037269, 4322885, 172336, +-12585328, -5190468, -4717485, -14260365, 4838281, -3547106, 2997887, -890669, 5143224, -18254, +-5609228, 2976949, -9208410, 6774774, 3934190, 15636365, -694174, 472983, 14251238, -12618614, +11056320, 13591424, -8531416, 8753680, -3686693, -4105452, -7165616, 1801739, 1609002, 9666361, +6178848, -2490544, -4061965, -8215736, 4461934, 5127117, -9469329, -4237522, 8773544, -15460272, +1395328, -11942157, 6694781, 660888, -284542, 3613141, -4109747, 1374390, 14190572, -5872294, +3059091, 6936372, 4316979, 763967, -7569343, 3322157, 2727304, -4369593, -12232067, 133681, +-2835752, -9647570, 7261716, -2626909, 2643016, -384400, 1338956, 3073586, 2940979, -5389647, +1317481, -536871, 1190780, -430034, 3598109, 1821603, -941135, -666794, -5297306, -205085, +-3633542, 632434, 558346, 3815005, -5597416, 2071248, 2968359, -2103460, -3488050, 1242856, +-534723, -2035815, 1637993, -435402, -2189897, 775242, -759672, -2489471, -726386, -1608465, +-3372086, 1588601, -1048509, 318901, -1857037, -375810, -1897302, 903554, 3562139, -462246, +-8130910, 23639500, -8790724, 4570382, 3400004, 8419210, 2654290, 5099200, 11809549, -9150965, +-5607617, -773631, 16428787, -6362457, -6991133, -8174397, 4060892, 2719788, 8990977, -18778670, +177704, 372588, -1273995, 9614821, -2339684, 7408819, 13788456, -10047002, -4498442, 3905199, +-7522635, -9483288, 6360310, -8811125, 12965433, -2238215, -13352516, -1788854, -7668127, 4217121, +10574209, -227633, 5346698, -678605, 2052994, 12578349, 383863, 9117142, 3606699, -6868190, +7128035, 6080063, 837519, 5104032, 18076980, -3021510, -8139500, 4275640, -10300942, 784905, +17265232, 5844914, 2717104, -3312494, -4956929, -3350075, -6121402, 10394358, -6852084, -1843615, +-4275640, 11798275, -21734682, 7412040, 7646116, 13055090, 3090766, 976568, 11508365, -3277060, +-4993973, -6540699, 152471, -5443334, -554051, -4685810, 3768834, 332860, -4172024, -4401805, +-3684008, 1382443, 4495220, 3598109, 767725, 248571, -1930588, -4763119, -1593970, -1242319, +1947768, 1985886, -804233, -1186485, 922344, -2862596, -17717, -2778307, -1403381, -3652333, +-4912369, -1381369, 1669132, 5435818, 869731, -1530082, -1464047, 2123325, -534187, 5212480, +2355790, 895501, 725313, 34939560, 10427107, -6367826, -8485782, -7148436, 25313464, -21814676, +1736241, 8544837, 1263794, -11826729, -2675228, 5937793, -1267015, 1379758, 10500658, -10865730, +-9128416, 4481262, 13687524, 8437463, 3535295, -6630356, -6481106, -6238440, -7269232, 6780680, +2692945, 9716290, 7793218, 4442070, -10310069, -4900021, -10983305, -2176475, -7205345, -16588237, +-3091303, 7419019, 1648731, -7692287, -7758859, 200790, 4014721, 10392210, 1321239, 5272609, +1505386, 20076288, -17413944, 11400991, 2137820, -17765058, -3208878, -5350456, -4395362, 2737505, +-7778186, 4702989, 3416110, 7965554, -9700184, 3445101, 15538655, 7285875, 24688008, -5513128, +-612570, -6058588, -3103114, 680752, -490163, -23398982, 10436234, -974421, -1369021, 6361384, +6286759, -6626598, -9969156, -10900090, -4052839, 7755637, 3302830, -2535105, -6440304, 5695664, +-10128070, 5316096, -1657857, -4576288, -5724118, -6206228, -2240362, -2061584, 987306, -2585034, +-1751810, 1296006, -1858110, -1729798, 1079111, -5070746, -2312303, -344134, -1725503, -2898566, +-1293859, -5149666, 733903, 3871376, 5210869, 6117644, -4432406, -5425618, -3849365, -4905390, +189515, -3221, -3009162, -3422015, 1322313, -449361, 3399467, -1048509, -244276, 2638184, +2640868, -2114735, -11694659, 2843805, 6362994, -243203, -7185481, -4986457, -15532749, -18456548, +3832185, -8178692, -3895535, 2718714, -154082, -1928977, -8236137, -4085051, -78920, 6484864, +6908992, -10136660, -5816460, 6388227, -9084930, -4459250, -14879377, 14408542, -1874753, 12981002, +1136019, 4871567, 13790066, 10425496, -6122476, 3144453, 7012071, -7361574, -2997350, 6833830, +-2533494, -16526497, -3071975, -11578695, 16992502, -1793149, -4510253, -9711458, -14173392, 5083094, +3005940, 3346317, 6994891, 165893, -2583423, 7320772, 1869921, -1395864, 2575370, -4088272, +11229729, -2650532, 7085623, 20964272, 4675072, 3940096, 4909685, 7736847, -18246632, -14768245, +5623186, -16119012, 11164231, -2274722, 12790949, 3379603, 24937654, 9793599, 1698123, -7245610, +-3214783, -12823162, -864362, 4001836, 2505040, 2726767, 4408247, 11380590, -4733054, -9228811, +-3208341, -2564632, 3582003, 10326712, 3652333, -2489471, 2977486, 3029026, -532039, -2386928, +-6010807, 404264, 677531, -2933463, -3977677, -758062, -6374269, 4471061, 2538326, -2997350, +-971736, -6331856, -3103651, 2927020, 5541582, -2783676, -2572686, -117038, -5087926, 5395016, +-255551, 3885872, -5263483, 2147, -5453535, 3192235, -6471442, -1468342, -29772714, -20850456, +7736310, -8304856, -17219060, -26137024, -636729, 2084670, -5068062, -4174708, 24928528, 6541235, +-18026514, 3772055, -11000485, -9253507, -8932995, -16099148, -2659122, 1484448, -22169548, -20992726, +-7975218, 3473018, 2067490, 12719546, 10765872, 6688875, -5337571, -207232, 4920422, -11369852, +-6338298, -3879429, 3765613, -10681584, -6524056, 7300371, 4422743, -289373, -1639067, -1995012, +6086506, -15381888, -8764418, -7573101, 10205379, -11923366, 8106214, 13665512, 18722300, -1245004, +5389110, -4438849, -8930311, -11724724, -3157875, 11559368, 4350802, -20989506, 932545, 21721798, +-14421963, 702227, -3074660, 1158031, 5168457, 11077794, -2291365, 3519726, 13302051, 9145596, +5862094, -10174241, -12241194, 8949638, -8856223, -16772384, -16106664, 17553532, 6687801, 9696426, +4167729, -2764348, -3377992, 8375186, 5939403, 1578937, 8072928, -3217468, -10566693, -5459977, +-7362111, 2961380, 10699300, 5208722, 1300838, 6330782, 3520263, 5902896, -1120987, -3029026, +3640522, -1319629, -4087198, -3486440, 2825015, -9766756, 2155537, 5728413, -3436511, 7086696, +4866198, -408559, -765041, 6680822, 835371, -1545115, -4248797, -4181151, 1176821, 3521873, +810138, 2835752, -4233764, -17400524, 9601936, -14085882, -25107842, 4529580, -15264851, -8873402, +29669634, 2012192, 22216792, 19985556, -4006668, 21046950, 29132226, 20708184, -26051124, -3484829, +-12106439, -12274480, -7500624, 515396, -10737955, 22725208, 6759205, 12466679, -10641318, 11932493, +9197672, 3048353, -13553843, -10558103, 21646098, -3964255, -20181514, -1387811, -23359254, -3383361, +6509560, -8392903, 530965, -19084688, 8774081, 17273284, 9382356, -2563022, -9338870, -3512210, +-2334315, -3262565, -8744553, -23447300, 15851651, 8881455, 8294656, 9895605, -13285944, 20645908, +2627983, -6268505, -4575751, -16509854, -7232725, 10650445, 6643778, 17648558, -1871532, -20278688, +-35497904, -2130841, -212601, 100932, -12767864, -17945984, -3372086, 11805791, -6208375, -7289633, +4751308, -1646583, 18090940, -3612068, -16012175, -5797132, 16850230, 1021665, 3237869, -16410533, +-5769752, -3142306, 6805376, 8696772, -4284230, 2986076, 712428, 6495601, 4323422, -723702, +2961380, 8722005, 2180233, -216359, -2881923, 927713, 5840619, -260919, 2986076, 9979357, +1510755, -3520263, -7405598, -883690, 5425081, -5223754, 2783676, -2385854, -1562831, -3504693, +-4445291, -3450469, 93952, 6280316, 4969814, -6806450, -12377559, -3730179, 4645007, 1607392, +1684701, 37877852, 23890218, -3391414, -22062174, 4642323, 11000485, 6338298, 16076599, 24128590, +-10647224, 1986422, -21566104, 6106370, 1780264, -8370892, 38863548, 14725295, 33534030, 13840532, +8651675, -29221884, 453119, 16292422, 2973191, -15559056, 6578280, -23782308, -9280351, 1627793, +7168838, -7129109, -4619238, 5145371, 4206384, 1707786, 21058224, 13070659, 3469260, -8439074, +14505178, -9439801, -6766184, -13874355, -4610648, 18073222, -28563680, -449898, 12827457, -14266271, +-4476430, 5426691, 4828080, 26370026, -1513976, -310311, -12306692, 25781614, -11483132, 3244311, +2716030, 17848274, -4158065, -6463926, 17011292, -28702192, 7487202, 2734821, -11882564, 22923852, +-28660316, -3653944, -9574019, -19267224, -9622874, -1725503, 8173860, 18004502, 29734058, 14484240, +19653234, 29898342, -12160126, 5496485, 7538205, -12801150, 17311940, 325344, -22891638, 11998528, +6367826, -8407935, 818728, 17670032, 13395466, 3924526, 10576357, 3118683, 3469260, 9690520, +-1710471, 4107063, 8705899, -2138894, 1941862, -1613834, -450435, 6095096, 1254667, 624918, +-5310727, -3214246, -3661997, -7601019, 1700270, -4211216, -12054899, 4617627, 7326678, -2537789, +-66035, 3217468, -4123169, -179852, 12861280, -1973001, -3508452, -8126615, -36710696, 10171556, +1933809, 44338020, 10126459, 8335458, -1217086, 21625160, 5837935, -32502702, -4989679, 34774740, +-10302553, -7322383, 2934000, -2404645, 790274, -6331856, 36215164, 41199472, -22152904, 10001368, +11093901, 6024229, 11705396, -18133352, -25047176, 19280646, 5299990, -13853954, -23944980, -7188702, +-8129836, 21905944, 17905718, 10049687, -20271708, 11151346, -8780524, 7110319, 1222992, 9411884, +20657718, 4754529, -46166604, -14148159, 8488466, -18496276, 5632313, 19593640, 6591701, 34118684, +-11280195, -51246476, -1175210, -20428476, 17841832, 15477988, -5579700, -10898480, 15847356, -24609088, +-4381941, -13295608, 11635066, 16027744, 13698798, 14891188, -11087458, -20853140, -62065500, -29677150, +-36113160, 5710696, -24471114, -11863237, -4971425, -26927298, 14452028, -48480516, 15113453, -34861712, +-25249576, 24869472, 29388850, -9023189, -1177895, 15917149, 20725364, -28452548, 632434, 4664872, +-4079145, 5025649, 15312632, -1948305, 6779606, -1288490, 5992553, -12577275, -6581501, -5733245, +-8267275, -1796907, 12020003, 4991289, 10822781, 409633, -11414949, -10379325, 1824287, 6305012, +-2348810, 6695317, 6998649, 16860968, 1670742, 5803575, 1850594, 4022237, -7407745, -2270427, +3103114, -6027987, 324270, -2760590, 727460, 3132642, 17623862, -1617055, -10432476, -11577621, +1161252, -654983, -18408230, -10794863, 7621420, -12106439, -596464, -156229, -48012364, -7062000, +31971736, -37949796, 3831648, 14191646, 513249, 9953587, -2724620, -30061550, -2397666, 16397111, +5628555, 24423868, 16665010, -25784836, -27793270, -3701725, -11957726, -3958349, -45888504, 17212618, +18356690, 32192390, 14751065, 29302414, -12561169, 4027069, 30209190, -9505836, 32866700, 9124658, +17428440, 5860483, -8250096, 16200617, -19801410, 970663, 41504416, -32154810, 3044058, -41823856, +-18763102, -30079266, -20387136, -5272073, 2263448, -9893457, -31819266, -5771899, -52893060, 59782188, +21026012, 335544, -8057896, -14475650, 3353296, -26339960, 4893579, -39461624, 925565, 1983738, +8833137, 25245280, 36420784, 1227287, -61062624, -28090696, 26176216, -13350369, -12199318, -14823543, +-8126615, 30103962, 6258304, -16962974, 12640089, -28330142, 4910758, -5402532, -12584254, -28603946, +-16201690, 18023294, -8630200, -6966974, 9686762, -10672457, -3350075, 17931488, -21079700, -14323179, +-6190122, -4446365, 22535694, 10470593, 6077379, 13298829, 5190468, -2282238, 10362682, -307090, +7587060, 10835129, 16944182, -6706055, -202400, -1986959, 12472048, 18976776, 6998649, -4677757, +-1449552, -5891085, -13921063, 24271934, -7232188, 12452721, -7285339, 3755412, -7740605, -5648956, +6139656, 11019275, -23813446, 16870632, 27314382, 10059350, -12475806, -16615618, 7963406, -21450678, +33951716, 28268938, 43029668, -30693446, -37789808, -9505299, -860067, -19135690, 25312926, 30682710, +-22688702, -96100, -40464496, -11968463, -19153944, -36564668, 11578695, 30144228, 18297634, -23775328, +-9181566, 2764885, 20360830, 3022046, -1426466, 7614977, -2244657, -10299868, -32695976, -22230214, +8505646, -3078418, -17753248, 19326816, 17277580, 10951093, -33451352, -30587684, 29000156, 17449378, +21584358, -21837224, -55770688, -10562398, 23620710, 23345832, -5617817, 56500296, -6912213, 56797184, +-85290000, -105902080, -43386148, -63807108, 875636, 24849608, 13223667, 68977176, -7704098, -4530654, +12991739, -13806172, -54291608, -48511656, -53821844, 43117176, 35483408, -13383118, -3497177, -90292024, +25307022, -1211181, -40127880, 16687022, 25985090, 39846560, 31456878, 14419816, -2608119, -26865558, +972810, 1273995, -7335804, -11595338, 32024886, 19575388, 12576738, 32408212, -24830280, 5915781, +-6824703, -15564425, 20513300, -3256659, -35323960, -305480, 11375758, -12796855, 17024714, -6825240, +4684736, -7913477, 39586176, 30712774, 36688148, -30840550, -6812355, 37755448, 28139552, -26879516, +-16406238, -27073326, -15752866, 22012782, 25238302, -8858907, -2379949, 42107324, 1942936, 3870839, +-5374078, 7490960, 7435662, 6911676, 12130061, -40904196, 35690640, 27307938, 11113228, 33791192, +-19881404, 12508555, -55881284, -26883274, 14597520, 20697984, 9382356, 7291781, 6860137, 14533096, +-6864969, 63592360, 5640903, 39638252, 11272142, -18977850, 48298516, -6484327, 18911278, 1105954, +17250200, -1728724, -1136019, 10727755, 24185498, 7176891, 17641578, 1347546, -3755949, 38299832, +4248260, -7952132, 557272, -2905546, -19331110, -5403606, 10657424, 7203734, -43203612, -10433549, +5341866, 10067403, 44964012, 36821292, -44671956, -24469502, 3578245, -9774809, 49524196, 4932233, +45670536, -32140314, 22941568, 4731980, 2440078, 21342230, 46940772, 30606474, 6180995, 41668164, +16247861, -19504520, -42031088, 36837936, -33538862, 22298934, -44137232, 247497, -69940320, 72538240, +-18022756, 2537789, -49000744, 44040596, -17169132, 13955959, -35976792, 42534136, -22251152, -19976966, +-14627585, -26721140, 8227010, -14974403, 12597139, -13886703, 23209466, -26106958, 23255100, -27489402, +15067282, -32189170, 25649544, -11136313, 28478854, -9993852, 14898168, -12174085, 9595494, -13887240, +450972, -15177341, 17273284, 7036767, 4858682, -6087043, 1629403, -12139188, 9273908, -12473122, +21810380, -18148922, -21587580, -9779641, 8683887, -25661356, 19734300, -6396280, 10830834, -7355132, +6159520, -11854647, 5494337, -6161668, 6586869, -2030446, -69959648, -17481054, -5423470, 7377143, +6280316, -43545600, -25300578, 39353176, -15261629, 14516453, -17413944, 3847217, 49437220, 79685064, +5526013, -2837363, 40025872, 17437568, 16579111, 49334140, 1111860, 29862908, 36239860, 34775812, +-13634911, 15024869, 31327492, 43588548, 35692788, 53609780, 30296700, 68462856, 72685344, 52494700, +57957364, 39460548, -4317516, 19306952, 10282152, -15044734, -14824616, 11349988, 33843268, 7661148, +1567126, -246961, 16729971, 50302120, 39168492, 84515832, 17067664, -43992812, 17541720, 770410, +17935784, -22649510, 33627984, -61435212, -79102560, 22014392, 79542256, 34493956, 15892990, -98717672, +569620, 37351720, 59565292, 79878872, -34011848, 4813048, -137941472, -91093568, 36843840, 51518668, +-76838576, -65705484, -40889700, 75249976, 50280108, -90382216, -116525144, -23755464, 47414828, -55947316, +26495654, -8759586, -20204600, -30343944, 4111358, 11723650, 19552838, -3762391, -48289928, -41973104, +5063767, -13276281, 20141786, 2452963, -5114769, -18652506, -12259447, 7282654, -1210107, -40427452, +-20327006, -30702574, -15854872, 5092221, -15647103, -11768210, -36083632, -48142288, -65935264, -66071092, +-55643984, -47536700, -52207476, -52105468, -39735964, -54952496, -58031452, -49638548, -55778204, -36383204, +-9934796, -32364190, -46662136, -31232466, 1142461, -17441326, -9554692, -11639361, 23698556, 25040196, +464393, 10836739, 12772159, 6851547, 7050189, -721555, 5334887, 3546569, -26832272, 66924716, +73720968, -83197808, -35548908, 33078228, -24147916, 16941498, -31431108, 28802588, -26725970, 7348689, +-761283, -11534135, 5674726, 2480881, -8715026, -4887136, -21520470, -4489852, 3799972, 3595425, +-21921514, 21182778, -20176146, -5640903, -17603460, 2993055, -16887812, 33927020, -1552631, 9757629, +-9704479, 9730248, -10269267, 10424959, 19203872, 28381680, -8300561, 10233833, 9182103, 25043418, +-15888158, 16487843, -14277545, 29874182, -8553964, -15360414, 8411157, -6183143, -9682467, 4290136, +-3505767, 13379897, -7570954, -15469398, -16954920, 3473018, 2113661, -27666568, 7727183, -3479461, +-3853123, 5896990, -9079561, -3933653, 1909113, -3633542, 2935610, -14471892, 17034914, -50247360, +25985626, -20885352, 33252174, -22040162, 29650844, 562104, 15607911, 10631655, 12477417, 7191386, +1176284, 6870337, -2205466, -20586852, -5639829, 2003065, -9874130, -3063386, -5733782, -1281511, +31675, -7158637, -1869921, 4156455, -1998770, -12339978, 13188234, -1280974, 6449967, -13164075, +5649493, -7670812, 4615479, -9127879, 10597295, -13894219, 20170240, -2819109, 1624035, -20899310, +14015015, 244813, 9783936, -19717658, 3899294, -7415261, 1806034, -2887292, 503585, -12394202, +5332202, -1301375, -10181220, 2428804, 15556372, -17833242, -470299, -5937256, 8320963, -11896523, +11062762, -9127879, 1496796, -5953362, 7838316, -1698660, 3164854, -2026688, 3651796, -5495948, +1864553, -1134408, -4429722, 1763621, 558883, 1500554, -1970316, 5234492, -1410360, 1239098, +-4015795, 7402376, -9881109, 3321620, -13566728, 63551556, 38538740, -20952462, -24102820, -2110977, +78964048, 32992328, 11072426, 21859236, -19147502, -24171002, 6736120, 15329812, 3999152, 1391033, +-8408472, -6551973, 7430294, 7575786, 18383534, 8181913, -9911174, -4369593, -4900558, -9990094, +-111132, 1762547, 4896800, 6233608, 190589, -2652142, 7336878, -21195126, -8055211, 9429064, +13519483, 16762720, -9436043, -5490042, -10031970, 17145510, 11860552, -3246459, 5447093, -19815368, +-17149268, 15821586, 12304008, 3881040, -30031486, -15439871, 1232119, 5002563, 19763292, 14129906, +-2221572, 5811091, 7019587, -9388262, 8580271, 9309878, -2756832, -5729487, 5529771, -10052371, +937914, -1720671, -7056632, -10769094, 14936823, 3052111, 3304977, 20577188, 25031070, 8860518, +20255602, 18962818, -3000035, -5127654, -5709086, -3663070, 7902740, 12934294, -5031018, 3977677, +-11625940, -4230006, -580894, 2756832, -6345814, -7573638, 7818988, 14970645, 6468758, 4148402, +6264747, -7205345, 578210, 7119982, 1388348, -2244657, 1789391, -739808, -8732205, 17752710, +5779952, -14215805, -13427678, 5395553, -2667175, 13997835, 7406671, -1797444, 5226439, 1792612, +-2901787, -652835, -4051228, 4097399, 6420439, 991064, -1686312, -5567352, 4757213, -1108638, +-22798224, -62870804, 21777632, 115624280, 90913184, 87067040, 27836220, -80922016, -48547088, -71734008, +-71970232, -65578780, -22892176, 35391604, 45601280, 71744208, 64250028, 38718592, 6505802, 6344741, +-31079994, -49118856, -70338144, -27018566, -19088446, 6362457, -3955665, 35748088, 24126978, 10302553, +47747152, 26851062, 20444582, -4118337, 17942226, -32363652, -24422258, -20158966, -23587960, -31040802, +-18719078, -12353400, -31609886, -21826486, 8416525, 46592344, 44944684, 51084340, 40099964, 58400280, +10115722, 14999636, -38766376, -28661390, -24604794, -58137216, -57931056, -51942260, -24558622, -30415348, +7168838, 22622130, 32510218, 65351148, 64165200, 61452392, 55104968, 48260936, 10320806, -28279138, +-46134392, -82390896, -70807368, -51601348, -70377336, -32615982, -14673219, 3161096, 69107096, 54202488, +79492328, 78556024, 57380764, 16109885, -15825344, -23417772, -27187142, -24218784, -46749644, -57812408, +-40397924, -27568322, -24387362, 3126199, 16289200, 25919590, 22317724, 46600396, 50925428, 38513508, +30630096, 5166309, -10724533, -21898428, -35871028, -30802968, -21850110, -34409132, -46649252, -4879083, +2746632, -7626788, 40273372, 53151832, 34029564, 29905320, 2279017, 8497593, -5473399, -9287867, +-23160074, -27224724, -17851494, -20332912, 2971044, -8076149, 2704756, 469762, 18398566, 9927817, +9543954, 17205638, 17582522, 109522, -4488241, -12349105, -12289512, -3447248, -2666638, -5901822, +-5779952, 1298154, 1684701, -1341640, 3221226, 3459596, 3337727, 1105417, 11629698, 4390531, +126165, 2072322, 37581, -3620121, -3052111, -3062312, -1673964, -1042603, 250719, -383863, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { -3353833, --4174171, -6163278, 2082522, -3011846, -6083821, -3896609, 2767570, -7686381, -4258997, -9400610, -3266860, 4199405, 5347235, 2915209, -3289945, 7120519, -4875325, 1437203, 149250, -1025960, --5151814, -2640331, -5666136, 219580, -2408403, 3170760, 2100776, -2705830, -863825, -620086, --5200669, -219580, -1155883, 2308545, -92342, 4701379, -1673964, 5949067, -2576981, 73014, -958315, -4350265, 3022046, -1337882, -1668595, 486942, -1175747, 2273112, -9109626, 4215511, -5487895, 760746, 3119757, 1662689, -4031364, -573378, -4374961, 5931350, -1574642, -3770981, -3605088, -5532992, 245887, 2059974, -6214281, 675384, -1447941, -2442763, 2155537, 389231, -586263, -3024194, -1861332, -10088341, -1197759, 2073396, -1568737, 390842, 1290101, 5232344, -4606353, 168041, 1570884, 541166, -780610, -845572, -1255741, -816044, -338229, -1125818, --827318, -146029, 1069447, 539555, 754841, -1654636, 98784, -159988, -329639, -216896, -477815, -331786, 163209, -856309, -481573, -776852, 81068, -736587, 1043140, -14274324, --8556112, 1568200, -4616016, 865973, -4762582, -8206609, -5439576, 9281424, 5425081, -1457068, -6311992, 1466195, 1562294, 1750736, -3036542, -846645, 5133560, -4137664, 2339684, 3718368, --3979287, -6334003, 2910914, -5180268, 590558, 2944737, 7602092, -1724966, -3641596, -3215320, -1198296, 4111894, -5587753, -60666, 4628901, 1802276, 503585, -318901, -413391, 5976447, --209917, 5473936, 3625489, -1406602, 3612604, -1278290, -307627, -573915, -9998147, 3454228, -5682242, -3290482, -1847910, 1367410, 1561221, 1595044, 905164, -557809, -1188632, 325881, --2499134, 6846178, -3054796, 784905, 3746822, 2964601, -2430952, 2695629, 878321, 1751810, -3784940, 3308199, -4953708, 5140002, 5732171, -1948841, 119722, -372052, 3752191, -4575751, --2351495, 992137, 676994, 165356, 271120, -980326, -1509144, 909996, -700080, -399432, -292058, 1300838, -943282, -235149, 56908, -1796370, 638876, -1067299, -1071594, -865973, -699006, 92342, -485331, -1074279, 284542, -5602785, 7177427, 4774930, 11129871, -1809255, -1154809, 3468186, -5476620, -1081258, 2120103, -2199560, -7422777, -394600, 750546, 4994510, --6004901, -14516989, -11801496, -7199439, 2754685, 6963216, -7014756, 3959423, -3464428, 5388037, -4108673, 3663607, 6363531, 3608846, -5077188, -4605279, 819802, 3464965, -316754, 327491, -8917963, -36507, 1507534, 4499515, 4658966, 814433, 77309, 11123428, -834834, -4136054, --1312649, 2549063, 3175055, -2123325, 5901285, 1196685, 3138547, -4241280, -3845606, -1431835, --2565169, 1468879, -2049236, 6517613, -7562901, -6669548, 8036421, -829466, -409096, -9402220, -2857227, -4551055, 5011690, -3903052, -10509248, -462783, 5293547, -4452808, 6862821, -4160750, -3117610, 6496138, -1914482, 2724083, 6444062, -416612, -4902169, 413391, 3103114, 1486059, --2419677, 4502200, 209917, 2376191, 802085, 650151, 1609002, 311922, -773094, -45634, -139586, 687732, -1912334, -923955, -1046361, 1724429, 106300, 1756105, 1727651, -1708323, -312996, 439160, -1090385, -738198, -460635, 321049, -1003949, 351650, 17353278, 4138201, -4598836, 2032056, -4012036, 8388608, -3986804, -2322504, 10583336, -758062, 8504572, -860604, --9800578, 3495030, -3346853, 10814728, 5638219, -710817, -9679783, -6705518, 8878771, 10609643, --12370043, 6222871, 4913980, 3757560, -839666, 1238561, 996432, -896574, 12184822, -515396, --2126546, -3329137, -4131222, -5189931, -1757715, -238908, -7074348, -2467996, 1803886, -4866735, -239444, 321049, 7277822, -2703682, 195421, 3439732, 255014, 7027640, 3121904, 7305203, -3560528, 2251100, -7718593, 845572, -5727876, -5287105, 1241246, 7448010, -322123, 6401649, --2700461, -4776004, -1149978, 341450, 1841467, 4406100, -2051921, -4832, -2422362, 2476049, -1640141, -6233608, 1188632, 1334661, 801548, -1731409, 6527277, -663572, -1312113, 734439, -3047279, 1382443, -2183991, -666257, -902480, -1546725, 1258425, -1855426, 3064459, -1837709, --396748, 404264, -1491427, -392453, 1691680, -1998770, -490700, -2154463, 819802, 936840, -1728188, -2356863, 446677, -950798, 1178969, -790274, -2876554, -894427, 4908611, 3436511, -3948686, 11185169, 5856188, -4855461, -4336843, -12039867, -777389, -266825, -6420439, 2443837, -9667971, 1173063, -7606387, 7071664, 6724308, -697395, 2692945, 6811818, 1621350, -6181532, --945967, 14430016, 7105487, 1497333, -9506373, -3400004, 8691940, 2993055, -1285269, 4895189, -4381941, 4584341, -24696, 8961986, -68183, -1139240, 2269890, -4438849, -5814312, -284542, -1000727, 3339337, 1843615, -5435281, 5546951, 9720048, 4999879, -254477, 7226820, -8196408, -4699768, -4877472, 5162551, -1357210, -5888400, -286152, -7676181, -12582644, -4578972, -4990215, --593779, -37044, -6574521, 1296006, -2005750, 3843996, 2546916, 4549981, -700080, 1843078, --6327561, 1120987, 1030255, 8871255, -3394635, -257161, -3047279, 1891933, 7986492, 4114579, --4595615, -7369090, 2365453, -2932389, -985695, 3874061, -514859, 1320166, 935229, -4374961, -241592, -3330747, 987306, -3161633, -2116345, -1131724, -99858, -397821, 616328, -2011118, --176094, -654446, -1593433, -1341104, 529355, -322123, -805843, 256087, 797790, 2487323, --825171, 1472637, -1016834, -2424509, 1872606, -2655364, 2639258, -200253, -1694365, -249645, --11778948, -7809861, 16695612, -3662533, -3646964, 968515, -571231, 17875118, -5214627, -9660455, -249645, -9529996, 2387465, 7582765, 8176544, 2571612, -16586627, 13637595, -10727755, 5698885, --7329362, -5589900, -4096862, 6805913, 7340636, -10991895, 883690, 4790499, -3395172, 2193118, -3238405, -3977140, 521839, -9053254, -6066105, -13969918, 8282845, -1959042, 14090714, -6563247, -3068754, 9395241, -2335389, -2796561, -4148402, 10769630, 7879118, -13232257, 3787088, -7485591, --2499134, -2909304, -7416872, 4459787, 2379412, 11647414, 8211978, -14636175, -2386391, -6287832, -8561480, 2973728, 747324, -8540542, 1290638, -899796, 7196755, -1202054, 911070, -9821516, --213138, 6971806, -6419903, 1078574, -2018635, -1917703, -5186710, 1044751, -673773, 12360916, -5461051, 5653251, -2253784, -1381369, -2138894, -3367791, -1797981, 2757906, -3774740, -1203665, --3702799, 2806224, 2363843, -2018098, -1128503, 2609730, -3486977, 1733556, 538482, -938450, --1103807, 938450, -91268, -315680, -664646, 2283312, -3365644, 450435, 308164, 1710471, -1851131, 1851668, -1707250, 510027, -1204202, 2473364, 578747, 1813550, 4061429, -4477504, -297427, -9448391, -1192927, -10904385, 1695975, -2729452, 6250251, -438624, 5300527, -7470559, --14081050, 2986613, 9452149, 1236951, -1155883, 7382512, 4953708, -11505681, -200253, -4338454, -14548128, -649077, 1679332, 1142461, 131533, -457951, -5243618, 11540040, -999654, -16364899, --3091840, 9912785, -6409165, 1650341, -281857, 1321776, -2070711, 1575179, -3033321, 3906273, --6299644, 5905580, 8267275, -6505802, -1683090, -3853660, -11420318, 4555350, -8116952, 7034083, --7138773, -12302397, -3389266, 7299834, -2313377, -4400194, 4853313, 6749004, 3833258, 7397008, -12636331, 10195715, -692027, 1976759, 1692754, -6808060, 1260036, -7118909, -7783018, 4216048, --5946919, 1911261, -389768, 4444218, 4487167, -5890548, 6788196, -1881733, -2843805, -1272921, -4759361, -896574, -4480725, -3038153, -6327561, 7166153, -3651259, -958315, 1189169, -312996, --2710661, -2281165, 431644, 934692, 261993, -1272384, 1604707, 1202591, -1467268, 111669, -1010928, 635118, -918049, -39192, -1213865, 432181, -1994476, -1800128, 1032940, 534187, -2326799, 2595771, 159451, 1779190, -42413, -16176457, -13372381, 7764227, 14508936, -77309, --745177, 2673080, -6817187, -3430605, -16536698, -8936216, -4606353, -230318, -11996381, 17243220, -3554086, 9562745, -10925323, -13245679, -9793062, -3934190, 2751464, -15025943, -6577743, 6846178, --2848100, -18260054, -6048925, 2371359, 311922, 11199664, 3913252, -3622805, -8500814, 10649908, --6104759, -705448, 8209293, 2314451, -8681203, -4598836, -558883, -14795089, 3832185, 11369315, --4855461, -6391985, 1797444, -7522635, -2622078, 1408212, -4618164, -3700114, 4010426, -5622649, --11608760, 5737540, -6562710, -8822400, -11897059, -6078453, 1334124, -4866735, 2136209, 14739254, -8497056, -1858647, 14246943, 14273250, -6063420, 1940788, 4122095, -7474317, -4674535, -15771120, -1765768, -5082557, -12565464, -172336, 6842957, 11788611, 7431904, 3433826, 1472637, -10723460, --1186485, -2473364, 2955474, -4075387, -311385, 219580, 4295, 2544768, 658204, -994822, -2456185, -974958, -3206193, 2689187, -2094333, -3042984, 624918, 1092532, 1180042, 223875, -3449396, -348429, 2269353, 1218160, 420907, 652298, 153008, -2560338, 748398, -3514894, -989453, -5608691, -1218697, -250182, -3516505, -4392678, -396748, -4341138, -627602, -923955, --10186052, 26036092, -971200, 15943992, -7992398, -22892712, 6580964, 1925219, -845035, -10753524, --991601, -7096360, 18153216, 13214004, 11900281, 8619999, -14131516, -122943, 2006824, 12559021, --21482890, -2483028, -5215701, -6333466, 3292093, -7135015, 2822331, 4758824, 3623879, 3795141, -5049808, -1537061, -2062121, -10514080, -2437394, -1639067, 10345502, -40265, -9358734, -2254321, -11252814, -1343251, 6571837, 8329552, -6008123, -3630321, -13815836, -8104604, 27215598, 7113540, -12145094, 6454799, 1634235, 981937, -17149268, 10161356, 1673964, 2955474, 8847096, 9544491, -14981920, -17213156, -7031399, -9569187, -1142998, 2344515, -2207076, -4851166, -2757369, -14440754, --18041546, -11792906, -16904992, -2238215, -11027865, -19031536, -7968775, 6138582, 10466298, -3991098, --16185584, -610422, -2393371, 3816079, -4407174, 1014149, 9398462, 399432, -627065, -609349, -1247151, 1614371, -2701535, -2509872, -6471442, -7345468, 3955665, -2034741, 3545496, 3131031, --1134945, 2125472, 2932926, 5237176, 3786551, -2309619, 1210107, 6681896, 1344325, -6798933, --5553393, -3080565, -1364726, 492311, -2334852, 3864397, 4330401, -1045825, 6509023, 836982, --1756642, -1399623, 1546188, 35039952, 7927436, -5056250, -7277285, 1125818, -11251741, -21974664, -16168404, 70330, 10402948, -7872675, 7523172, 17985712, -1788317, 2004139, -4539781, 15652471, -13171591, 5109938, -21226266, 1529008, 3109556, 13103945, 19068044, -5641977, -3919695, -2533494, -5101348, 6802155, 5648956, -9662603, 4392678, -11137387, 8491150, 11345693, -5450314, -11267310, -7081864, -12259984, -11223286, -489626, 3228205, 15929497, 1899986, -2208150, 13562433, -2544768, -12177843, 22530324, 11275900, 230318, -14353781, -1391033, -8282845, -6716792, 14377403, 5599564, --14559939, -202400, -11140608, -2849174, 19067508, 8752070, 2746632, 8143258, 11467026, 5927592, --15445776, 7900056, 12810814, 4365298, -10570988, 4298189, 1176821, 2159295, -8284455, 12660490, --3545496, -3100967, 15229417, 16145319, 2338073, 4558571, 17554606, 984084, 8639864, -6227166, --242129, 10087804, 5820755, -4547297, 5179194, 9097278, -2535641, 16106, 11611444, 2351495, -4909685, -3513820, -5891622, -1831267, 3198677, 1633698, 2626373, 2695092, -1968169, -1888175, --1576253, 834834, 3437585, 4161823, -2899103, -920734, 7210713, 999117, 9687836, -1821603, -2593087, -1392106, 1186485, 4322348, 2618856, 286689, -130460, -4198868, -2961380, -2158758, --4479114, 5595269, 5106716, -8550206, -396211, -10910291, -25550224, 8809515, -10152766, 2801929, -949188, 17910014, -12312061, -10954851, -4544076, -5024575, -6555731, 13228499, -11689827, -16595754, -5010080, -30994094, 964757, -5850283, -13043816, 16648904, -1006633, -996969, 7074348, -6613713, -5334887, -1682554, -18432926, -20200842, -132607, 4262218, 11909407, 5718212, -1274532, -2126546, --11558831, -5505611, 11760157, -18261664, 25288230, 14982457, 3451543, 18654654, -12358232, -5314485, --11304891, -11630235, -4948876, 8534637, 23895588, 237834, -12205760, -2042257, 1255204, -1298691, --1176821, -7528541, 6518150, 5934034, 16149077, -254477, 18248242, 9395778, 5091147, -406948, -3977677, -27052388, 14401025, -3394635, -15749645, 11375221, 98247, 14959371, 6725919, -25050396, -19604916, 15284178, -13023951, 21228950, 8262980, 15882789, 6388764, -2116345, -755914, -577673, --2833605, -5441187, -1567126, 2435247, -5403606, -8316668, 210453, -5384279, -9754944, -5793374, --7270306, 4816269, -4413079, 5901285, 1687922, 6025302, 2934000, -510027, -3006477, 1161252, -712965, -293132, 976031, -1581622, -3949223, 2150705, -216896, 2595771, 2774549, 297427, -2372970, 1229434, 3975529, 3482145, -5788542, -3355443, -9680319, -7333120, -47755740, -3896072, -28542742, -5433134, 992137, 24598352, -5611912, 79994, 3178276, 6407018, -7311645, 6391985, --2416993, -8492224, 8145943, 9213779, -27844810, 3093987, -24763708, -890132, -12756590, -14290430, --2936147, -4446365, -13518946, 6633577, 2413235, 8423505, 11937862, -17206712, 21531744, 1260573, --19845434, 1427003, -13649943, -7192997, -14692546, -13741211, -5673115, 13952738, -12042015, 6532646, -14511621, -8820252, -15130633, -14334453, -20517058, -22536230, -12932147, -6576132, 1915019, -3598109, -6327024, 4002910, -13050258, -1193464, 15064061, 8322036, -21807160, 8408472, -1487669, -6351720, --20189568, 13528073, -7123740, 18757196, 24199994, 401579, 23028004, -12795781, 13437342, -10120554, -14436996, 17907330, 1766842, -24103356, -541703, -32810866, 10748693, 6825777, 13138842, 5909338, --12566001, -11331734, -2684, -7676717, 7578470, -8286066, -61203, -734439, -7792682, -6507413, -5725729, -3374771, -8837969, -1098975, 3054796, 6520297, 3860639, 14418742, -1280437, 997506, --4118337, 10042170, -1205275, -2466922, 9273371, -736050, 1608465, 1906429, 12421582, -2194728, --4678293, 1020592, 8669928, 7694434, -7713762, -1017907, 5829881, -9498857, 5462662, -1735704, -6922951, 150861, -7575786, -22575958, 18204218, -43256764, -2794950, -3952981, -3853660, 4215511, --25177636, 1924682, -5150203, -1960116, 11150272, 4648765, 13008919, -10074920, 9131637, -4729833, --22411140, -8778376, -16519518, -9968619, 10473815, -19213000, 2278480, -7031399, -14918032, -2480881, -14072460, -19111530, -18772228, 7705708, 10855530, -498753, -9025337, 10496900, 10695005, 13541495, -11295227, 4907000, 15560130, 18875844, -10362145, 2917357, -9175124, 23646480, -2198487, -16196859, -19347218, 8707509, 4423280, -9242770, -12694313, 2978560, 7171522, 7598334, -973347, -10178536, -7476465, -11869142, 20938, -11716134, 36048196, 5674726, -10790032, 29931090, -3995930, 9190693, --8086887, 15051713, 21961242, -13817984, 20957830, 22655952, 29171418, 22711788, 1750199, 16870632, --13575318, -2583960, 2789581, -7299834, 12651900, 598074, -1236414, -1294933, -4200478, 6356015, -2798171, 17894982, -6287296, 6605660, -4364224, 100932, 2938295, 5260798, -7985955, 2760053, -7041599, -3281355, -8925479, -1676111, -14049912, 4662724, 3755949, 3641059, -4065724, 2202245, -6636262, 3970697, -2226404, 6789270, 2563022, -4520990, -2793876, -1495722, 10657961, 14487462, -7207492, 3288871, 2067490, 4902705, 8088497, -5869610, -2901787, 3824132, -1495186, 705985, -3396782, 44707924, 11780558, -7710540, -6438156, 10326175, 3099356, 4356171, -944893, -17978734, -15176804, -40944460, 4631049, 8897025, -1645509, -7548942, -15502684, -7277285, 2043331, 12037183, -18706194, -11051488, -23617488, -19315004, -2560874, 623844, -13852343, 28754270, -13282723, -8898098, -12077985, -4140885, 2312303, -2674154, 24917790, 4042638, -24645060, 9741523, 3313567, 17082696, --5963562, 1769527, -10095858, 8440148, 3947075, 21558052, -5110474, 9678172, 10434623, -13178570, --14264123, 934692, 13307956, -25577604, -29979408, -8964670, -12218108, -1722282, -4211753, 2903935, -6995428, -6206228, 1192390, -34900904, -29406568, 23416698, 25132538, -30243550, -23015120, -29111826, --15033996, -12110734, 15190762, -15937550, -27828166, 724239, 1355062, -17214228, -3500398, 24270860, --3532611, 1257352, 7976291, -346819, 1530619, -1171452, -8494372, -10799158, -447213, -3134253, -7137699, -1225139, -553514, -7844221, 4002373, -12082280, -170188, 3568581, 4086125, 5669894, -6631967, 1118302, 3797288, -2761127, 712428, -6196564, 2309619, 521839, -6807523, 6973953, -7141994, -11181947, 758062, 8003672, 6753299, 12420509, -2534031, -14635638, 4096862, 4660040, --7130720, 4525285, -7952132, -3855270, -1209570, -2621541, -6766184, 2374043, -24939264, -3034931, --6041409, 7509751, -11818139, -3206193, -38778184, 34339336, 22052510, -3717294, 47071232, -4613869, --25831008, -2369748, 10558103, -15950435, -21071110, -4415764, -14388140, -665720, 3990025, -21625160, -31738198, 1069984, 3399467, -19950124, -5771899, 2163053, -5724655, 5103495, 7211787, 26112328, -4654671, -1323924, 21071110, 17413944, -6190659, 10274099, -13348221, 3767760, 11774653, 11481521, -29485488, -29169808, 17906256, 54130548, 365609, 8893804, 18488760, 2124398, 3651796, 8751533, -6707665, -18080738, -21590800, -7831873, 17301738, 5174362, -22437982, -12130598, -1019518, -10756209, -19880330, 1833414, 15343234, -34166464, -21211232, 9967545, 23393076, 14359149, 9396315, 32494648, -18931678, -13644574, 22332220, -16863652, -3486977, -2423972, 12528420, -2651069, -14024679, 12131135, -5219996, 1160178, -16080358, 11094974, -311922, 215285, -7219303, 9350144, -7703561, -6159520, --5927592, 4456029, -6185290, -11735461, 3853660, 823023, -169114, -6388227, -1332514, -7999914, --6942278, -6398965, -4132296, -2470680, -3106872, -2436857, 1027571, 226560, -15260556, 10179072, -3900367, -4792647, -11326366, -15976205, -506269, -8704288, -5985037, 5767068, -4336307, 9893457, -4807679, -3492882, 1596654, 9252433, -4294431, -1545115, -4582193, 7795903, 1704028, 3235721, --8036958, 15736760, -44826572, 674310, -28991, -1732482, -5452461, 20777442, 1932198, -12411919, --22352084, 22603876, -20075214, 236760, 14943265, 11532524, -15738371, -4573067, -25497610, -407485, -7593502, 8684424, 10638634, 2445447, -16537772, -21184390, 17391396, 8572218, 8763344, 3067681, -8908836, 2310693, 12852690, -22829362, -37933152, 10271414, -5566278, -8424041, 21458730, -4034585, --11154567, 18497888, 17919140, 14420890, -1181116, -9903121, -16227997, -4554276, -21523154, 50678468, --4179540, 18043158, 4108673, -17259326, 14069776, -6804839, -16072841, 15602006, 12806519, -28385438, -19720880, -3326452, 27292370, -27788976, -20562692, 27342836, -980326, -22759568, 23047332, -8749922, -39257612, -16954920, -13289166, -23967528, 15143518, 2415919, -19064286, 7301445, -24823838, -18595598, -1791538, 15826954, -14176613, -9137006, -28219546, -26084948, 30324080, -3860639, 13300977, 20789252, -28780038, -246424, -2743947, -2609193, 7715909, 11103564, 2302103, 4879620, 17785460, 7326141, -9874130, 5362267, 4583267, -3857954, -1472100, 10436234, 8427263, 13801341, -6562710, 8951249, -10060961, -15942382, 4128537, 3475702, -8285529, -4758287, 148713, 3468723, -6699075, 10738492, -790274, -3032784, -3016678, 9035537, 534187, 2499671, 1041530, 2194728, 2328409, -9161165, --4146254, 6160057, -5499706, -12939126, 33475512, -7656316, 22681722, -35447440, -6193343, -844498, --42237244, -9315247, 6155762, 20748988, -10366440, -9931038, 959925, -3275986, 29715268, -2837363, --14875619, 31460636, -3857954, -1628330, 5987722, -12571906, 27250494, 1801739, -5494337, 13037910, -11222750, -14830522, -5025112, -6870874, 21244518, -42309724, -654446, -8184060, -14867029, 7278359, --15113990, 24680492, -6382322, -30465814, -3080565, 46389940, -28023588, 20356534, -31249646, -8970576, -31307628, 22864796, -16729971, 7980586, -20422570, -26917096, 5859409, -11795054, 11882564, 3476239, --1764158, 4673998, -39398808, -15369004, -20019380, -28798830, 13557064, -10870562, -7907035, -15916612, --27941446, -23505820, 18647138, -3580392, 57854820, 10240276, 5481452, 20735028, 36448168, 4882841, --26022134, 31981400, 24259586, -20217484, 5555540, -5010616, -20114406, -15829639, -13533979, -1412507, --12336757, 4868883, 8675834, 3133716, -9566503, 17123498, 2827162, 8005819, -2132451, -2781528, -8223252, 5101885, -7929047, -7118372, -6823630, 7975218, 3908957, 9602473, 10171556, 590558, --5137318, 7777112, -4102231, 16448114, 7908109, -19271518, -3630321, -14150843, 1964411, -4478577, --6722161, 20562156, -857920, -6088653, 5440113, 6622303, -7166153, -1251983, -9943386, 4778688, -7607461, -1163936, -2967286, 9713605, 22195854, -13040594, -17223892, 19311246, -30534534, -3309809, --6471979, 2032593, 21121038, -13726715, 23465016, 10398116, 5162551, 7325067, -38888780, 26517128, -4685273, -26946624, 10427107, -28598040, 4704063, 38954816, -5018670, -22666154, -24600498, 10656888, -17369384, 14444512, 7356742, -25285546, -17696876, -7664906, -4949950, 33309082, -21138218, -12317966, -49032956, -27118960, -2306398, 19755238, -99858, 20797306, -3191698, -16343961, -11300059, -29896730, -15204721, 21664888, -32328756, 48302276, 15827491, -36018668, -33239826, -31299038, -37956236, -30332132, -1408749, 15321222, 2803540, -25239912, -9797357, 17219060, -613643, -15733539, 17401596, -34057480, -2032056, -7677254, -31831076, -29361470, 4978404, -11559368, 22222160, -40800040, -5657546, -14323716, --30165166, 2250026, 48206712, 12592844, -21529598, 10582263, -26474178, 10877005, -10832981, 1115618, -1315334, 13869523, -1596117, 4859756, 17099876, 355409, -9669045, -4221953, 13688061, 9946071, -6240588, 3543348, -27249956, -2600603, 1937030, 15354508, 7485055, -13910325, -376347, 1759863, -23593866, 1467805, 7506529, -7187628, -4772246, 3632469, 7634841, -841814, -7094749, -13176960, -1858110, -4919348, -9291088, 4649839, -6506876, -6461242, 9091372, -7264937, -10698227, -14583561, --13064217, -2308008, 3747896, 136902, -11365020, 23485954, -58794344, -54376972, -47129748, -30462592, -12326556, -12874164, 60627220, 16004659, -6460705, -13909252, -7647190, 17150878, -39416524, 46153180, -61091076, 24266028, -3668439, 48269528, -15299210, 29185376, 55529632, -10148471, 3090766, 10380399, -73896520, -18750216, -4626754, 43879532, 16692927, 14094472, -12064563, -45038636, 3150896, -35699768, -17073568, -44231720, -51726440, -638340, -2913062, -36166844, -1861868, -17599702, -36998460, -29633126, --48290464, -2321430, 49409304, -15764141, -9392020, -45519136, -24320252, -16776679, -15548855, 15380278, --11084774, 82144472, -19377282, -1157494, -29926258, 61991412, 51029044, -36051956, 41518376, -14514842, --60149408, -10787884, -5698348, 12658879, -13906567, -13694503, -7468412, -24445880, 7179038, 30210264, --35611720, -5096516, 10466835, 6251862, -41362684, 26986890, 19204946, 62299036, -26380762, 17095580, -26506390, -1557463, 7477538, -797790, 9366250, -6897718, 20527796, 8585103, 16726213, 13999446, -1637456, 14422500, 5000416, -5335423, 15697032, -853625, 3133716, 1716913, 11188927, 7876433, --10514617, -8660802, -13493714, 21721798, -13923747, 3321084, 14013405, 5703717, 24837260, 20786032, -36672580, 24671902, 21223580, 1553168, 14303852, -18670760, 18236968, 13101261, -3263638, -17913234, --33101850, -13095892, 10963441, -18771692, -6029061, -13547401, -32282584, -28696288, -12540231, -21267068, --11651173, -18241800, -22384832, -24683714, -6502044, -6825777, -9855339, -17978734, -18128520, 24444270, -104953432, 11767674, -65037616, -16661252, -22679574, 4643934, 33114198, 58265528, 17264158, -49568216, --425739, 33724084, 7929584, 421444, -991601, 8582418, -4156992, -6273874, 41044320, 25095494, -23182086, -34687228, -21759914, 23175106, 9645423, 13594108, -11350525, 4088809, 45713484, 851477, -38860864, 19906100, 21485038, 37201932, 6041409, -20019380, 5225365, -22887344, 6340983, 15684684, -4669703, 61005180, -19757924, -39534100, -37337760, 47114180, 22441204, 25057912, 17859010, -27133992, --33286534, -20758650, -492311, 10232223, -6746857, 16629576, 31976568, -2180770, 23379118, 20604032, --31012348, -6279779, 9720048, -14847165, -12721693, -15572478, -51592756, -8804683, 23312008, 2042257, -46339476, 30493194, -21446920, 16227460, 944893, -15087683, -12125766, -25182466, -55802364, -30015916, -3002719, 1165547, -11812234, -3214246, -5180805, 18264348, 19568944, 9977209, -2733210, 1599339, -15002321, -6864432, 9672266, -25213068, -11409581, -3072512, 14328548, -3242700, 6062883, 9237938, -9476308, 1493575, 25068650, -19237696, -17025788, -17425220, 13370233, -11149198, -17823040, -17786534, -13514651, -5600101, -12831752, -6542846, 10294500, 2949569, 14779519, -23283554, -15073725, -2231773, --990527, 5294621, 11579769, -4631586, -8906688, 16627429, -7861938, -9318468, -8329552, 16182363, --3675418, -7420630, 4983236, -156229, -8071318, 1010928, -10945724, -6163815, -4802847, 316217, --3374771, 3669513, -2793339, 2523830, -1095217, 3383897, -6021544, 2586644, -2631741, 3051038, --4184909, 3944391, -6660421, -5881421, -25411174, 2840584, 82349016, 21170968, 34595960, -17229262, --75185016, -38147900, -55374476, -18682034, 37109056, 85262080, 37982008, 9449465, -40638444, -38254200, -26800596, 42398844, 20957830, 51498804, -2276870, -33743948, -49428096, -24045374, -7713762, 38254736, -4591320, 22102976, 19614042, 3311957, 51043540, 35850092, -4056060, -4917738, -47267188, -11503533, --1119376, 957241, 26897232, 48240000, 29415694, 23155242, 45187352, 26154740, -47141024, -37813964, --11926050, -29640106, 31307090, 21340618, 46377592, 36216776, 41010496, 12163884, 7165079, -33779380, --35443680, -33171106, 11596949, 16896402, -191663, -4501663, 73222216, 18569828, -5143224, -6923488, -50109384, -53500796, 11167452, -101871792, -22874458, 25500294, -35729832, 33272038, 18735722, 528281, -73136312, 34744676, -41660108, -82677048, -39875012, -37442988, -20441360, -13904957, -10781442, 36168456, -22868016, 48785996, 5771899, -35888748, -24831354, -37659884, -35161824, -34843996, 15308337, 3282429, -15139223, 20804284, -9903121, 19241990, 10084046, -13412646, -1667521, -14860587, -4883915, -32129040, --34109020, -12729209, -14870251, 587337, -31959926, 16979080, -2374580, 5905580, 8857296, -21290690, --44185012, -39924944, -2216740, 8752606, 9065602, 26242250, 6464463, -13187697, -24899000, 8244727, -5826660, -118897576, -72671920, -39620536, 35030292, 10004589, 162220912, 173107584, 105195024, 191960336, -156860800, 166039136, 114993456, 140487840, 113949240, 2132988, -54354420, -77442016, -74491912, -155588416, --186796720, -195092976, -136268032, -107092328, -42184096, 7495255, -55185496, 33758980, -69548408, -25094958, --4786204, -21454436, 16460462, -63753420, 87706456, 15042049, 79955112, 51446192, 29886530, 20960514, -44235480, 28907814, 45368276, 104502456, 99227704, 79223360, 96973384, 122803312, 111686328, 105432320, -193216080, 67902360, 135947520, 177297328, 121739240, 161067184, 85433344, 114815752, 89635432, 107793480, -116473608, 43298104, 75413184, 57360900, 70583496, 68472520, 18655728, -13179644, -74035576, -27205934, --98775656, -86102816, -146102976, -165154384, -166577088, -351179616, -297622976, -319242240, -317061472, -369621120, --374219968, -230485664, -268580960, -199622032, -236978576, -179799680, -170652480, -148185504, -149100320, -85328112, --37919728, -54152560, -55202676, -44676788, 8507256, 71534288, 37153616, 148728272, 127667904, 187929520, -192691568, 178250800, 222058944, 206208896, 238320224, 186738736, 228009072, 242057920, 270083648, 236674704, -141070352, 141555680, 140898016, 143583440, 132002600, 93261992, 86850144, 36521716, 25468620, -2702071, -4138738, 18002356, -48973900, -71785544, -78185048, -47844324, -42722576, -80002896, -93439160, -108674480, --79120280, -100603704, -93316752, -78420200, -84495432, -85924040, -86137176, -22252226, -20294794, -10461467, --19361176, 11321534, -2672007, -1993402, -18178986, -6362994, 6412386, 11666205, 4030290, 16151225, -11121818, 19476602, 642098, 3317325, -2473364, 8277476, -2481954, 4155918, -3249143, 3853123, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +-4174171, -6163278, 2082522, -3011846, -6083821, -3896609, 2767570, -7686381, -4258997, -9400610, +3266860, 4199405, 5347235, 2915209, -3289945, 7120519, -4875325, 1437203, 149250, -1025960, +-5151814, -2640331, -5666136, 219580, -2408403, 3170760, 2100776, -2705830, -863825, -620086, +-5200669, -219580, -1155883, 2308545, -92342, 4701379, -1673964, 5949067, -2576981, 73014, +958315, -4350265, 3022046, -1337882, -1668595, 486942, -1175747, 2273112, -9109626, 4215511, +5487895, 760746, 3119757, 1662689, -4031364, -573378, -4374961, 5931350, -1574642, -3770981, +3605088, -5532992, 245887, 2059974, -6214281, 675384, -1447941, -2442763, 2155537, 389231, +586263, -3024194, -1861332, -10088341, -1197759, 2073396, -1568737, 390842, 1290101, 5232344, +4606353, 168041, 1570884, 541166, -780610, -845572, -1255741, -816044, -338229, -1125818, +-827318, -146029, 1069447, 539555, 754841, -1654636, 98784, -159988, -329639, -216896, +477815, -331786, 163209, -856309, -481573, -776852, 81068, -736587, 1043140, -14274324, +-8556112, 1568200, -4616016, 865973, -4762582, -8206609, -5439576, 9281424, 5425081, -1457068, +6311992, 1466195, 1562294, 1750736, -3036542, -846645, 5133560, -4137664, 2339684, 3718368, +-3979287, -6334003, 2910914, -5180268, 590558, 2944737, 7602092, -1724966, -3641596, -3215320, +1198296, 4111894, -5587753, -60666, 4628901, 1802276, 503585, -318901, -413391, 5976447, +-209917, 5473936, 3625489, -1406602, 3612604, -1278290, -307627, -573915, -9998147, 3454228, +5682242, -3290482, -1847910, 1367410, 1561221, 1595044, 905164, -557809, -1188632, 325881, +-2499134, 6846178, -3054796, 784905, 3746822, 2964601, -2430952, 2695629, 878321, 1751810, +3784940, 3308199, -4953708, 5140002, 5732171, -1948841, 119722, -372052, 3752191, -4575751, +-2351495, 992137, 676994, 165356, 271120, -980326, -1509144, 909996, -700080, -399432, +292058, 1300838, -943282, -235149, 56908, -1796370, 638876, -1067299, -1071594, -865973, +699006, 92342, -485331, -1074279, 284542, -5602785, 7177427, 4774930, 11129871, -1809255, +1154809, 3468186, -5476620, -1081258, 2120103, -2199560, -7422777, -394600, 750546, 4994510, +-6004901, -14516989, -11801496, -7199439, 2754685, 6963216, -7014756, 3959423, -3464428, 5388037, +4108673, 3663607, 6363531, 3608846, -5077188, -4605279, 819802, 3464965, -316754, 327491, +8917963, -36507, 1507534, 4499515, 4658966, 814433, 77309, 11123428, -834834, -4136054, +-1312649, 2549063, 3175055, -2123325, 5901285, 1196685, 3138547, -4241280, -3845606, -1431835, +-2565169, 1468879, -2049236, 6517613, -7562901, -6669548, 8036421, -829466, -409096, -9402220, +2857227, -4551055, 5011690, -3903052, -10509248, -462783, 5293547, -4452808, 6862821, -4160750, +3117610, 6496138, -1914482, 2724083, 6444062, -416612, -4902169, 413391, 3103114, 1486059, +-2419677, 4502200, 209917, 2376191, 802085, 650151, 1609002, 311922, -773094, -45634, +139586, 687732, -1912334, -923955, -1046361, 1724429, 106300, 1756105, 1727651, -1708323, +312996, 439160, -1090385, -738198, -460635, 321049, -1003949, 351650, 17353278, 4138201, +4598836, 2032056, -4012036, 8388608, -3986804, -2322504, 10583336, -758062, 8504572, -860604, +-9800578, 3495030, -3346853, 10814728, 5638219, -710817, -9679783, -6705518, 8878771, 10609643, +-12370043, 6222871, 4913980, 3757560, -839666, 1238561, 996432, -896574, 12184822, -515396, +-2126546, -3329137, -4131222, -5189931, -1757715, -238908, -7074348, -2467996, 1803886, -4866735, +239444, 321049, 7277822, -2703682, 195421, 3439732, 255014, 7027640, 3121904, 7305203, +3560528, 2251100, -7718593, 845572, -5727876, -5287105, 1241246, 7448010, -322123, 6401649, +-2700461, -4776004, -1149978, 341450, 1841467, 4406100, -2051921, -4832, -2422362, 2476049, +1640141, -6233608, 1188632, 1334661, 801548, -1731409, 6527277, -663572, -1312113, 734439, +3047279, 1382443, -2183991, -666257, -902480, -1546725, 1258425, -1855426, 3064459, -1837709, +-396748, 404264, -1491427, -392453, 1691680, -1998770, -490700, -2154463, 819802, 936840, +1728188, -2356863, 446677, -950798, 1178969, -790274, -2876554, -894427, 4908611, 3436511, +3948686, 11185169, 5856188, -4855461, -4336843, -12039867, -777389, -266825, -6420439, 2443837, +9667971, 1173063, -7606387, 7071664, 6724308, -697395, 2692945, 6811818, 1621350, -6181532, +-945967, 14430016, 7105487, 1497333, -9506373, -3400004, 8691940, 2993055, -1285269, 4895189, +4381941, 4584341, -24696, 8961986, -68183, -1139240, 2269890, -4438849, -5814312, -284542, +1000727, 3339337, 1843615, -5435281, 5546951, 9720048, 4999879, -254477, 7226820, -8196408, +4699768, -4877472, 5162551, -1357210, -5888400, -286152, -7676181, -12582644, -4578972, -4990215, +-593779, -37044, -6574521, 1296006, -2005750, 3843996, 2546916, 4549981, -700080, 1843078, +-6327561, 1120987, 1030255, 8871255, -3394635, -257161, -3047279, 1891933, 7986492, 4114579, +-4595615, -7369090, 2365453, -2932389, -985695, 3874061, -514859, 1320166, 935229, -4374961, +241592, -3330747, 987306, -3161633, -2116345, -1131724, -99858, -397821, 616328, -2011118, +-176094, -654446, -1593433, -1341104, 529355, -322123, -805843, 256087, 797790, 2487323, +-825171, 1472637, -1016834, -2424509, 1872606, -2655364, 2639258, -200253, -1694365, -249645, +-11778948, -7809861, 16695612, -3662533, -3646964, 968515, -571231, 17875118, -5214627, -9660455, +249645, -9529996, 2387465, 7582765, 8176544, 2571612, -16586627, 13637595, -10727755, 5698885, +-7329362, -5589900, -4096862, 6805913, 7340636, -10991895, 883690, 4790499, -3395172, 2193118, +3238405, -3977140, 521839, -9053254, -6066105, -13969918, 8282845, -1959042, 14090714, -6563247, +3068754, 9395241, -2335389, -2796561, -4148402, 10769630, 7879118, -13232257, 3787088, -7485591, +-2499134, -2909304, -7416872, 4459787, 2379412, 11647414, 8211978, -14636175, -2386391, -6287832, +8561480, 2973728, 747324, -8540542, 1290638, -899796, 7196755, -1202054, 911070, -9821516, +-213138, 6971806, -6419903, 1078574, -2018635, -1917703, -5186710, 1044751, -673773, 12360916, +5461051, 5653251, -2253784, -1381369, -2138894, -3367791, -1797981, 2757906, -3774740, -1203665, +-3702799, 2806224, 2363843, -2018098, -1128503, 2609730, -3486977, 1733556, 538482, -938450, +-1103807, 938450, -91268, -315680, -664646, 2283312, -3365644, 450435, 308164, 1710471, +1851131, 1851668, -1707250, 510027, -1204202, 2473364, 578747, 1813550, 4061429, -4477504, +297427, -9448391, -1192927, -10904385, 1695975, -2729452, 6250251, -438624, 5300527, -7470559, +-14081050, 2986613, 9452149, 1236951, -1155883, 7382512, 4953708, -11505681, -200253, -4338454, +14548128, -649077, 1679332, 1142461, 131533, -457951, -5243618, 11540040, -999654, -16364899, +-3091840, 9912785, -6409165, 1650341, -281857, 1321776, -2070711, 1575179, -3033321, 3906273, +-6299644, 5905580, 8267275, -6505802, -1683090, -3853660, -11420318, 4555350, -8116952, 7034083, +-7138773, -12302397, -3389266, 7299834, -2313377, -4400194, 4853313, 6749004, 3833258, 7397008, +12636331, 10195715, -692027, 1976759, 1692754, -6808060, 1260036, -7118909, -7783018, 4216048, +-5946919, 1911261, -389768, 4444218, 4487167, -5890548, 6788196, -1881733, -2843805, -1272921, +4759361, -896574, -4480725, -3038153, -6327561, 7166153, -3651259, -958315, 1189169, -312996, +-2710661, -2281165, 431644, 934692, 261993, -1272384, 1604707, 1202591, -1467268, 111669, +1010928, 635118, -918049, -39192, -1213865, 432181, -1994476, -1800128, 1032940, 534187, +2326799, 2595771, 159451, 1779190, -42413, -16176457, -13372381, 7764227, 14508936, -77309, +-745177, 2673080, -6817187, -3430605, -16536698, -8936216, -4606353, -230318, -11996381, 17243220, +3554086, 9562745, -10925323, -13245679, -9793062, -3934190, 2751464, -15025943, -6577743, 6846178, +-2848100, -18260054, -6048925, 2371359, 311922, 11199664, 3913252, -3622805, -8500814, 10649908, +-6104759, -705448, 8209293, 2314451, -8681203, -4598836, -558883, -14795089, 3832185, 11369315, +-4855461, -6391985, 1797444, -7522635, -2622078, 1408212, -4618164, -3700114, 4010426, -5622649, +-11608760, 5737540, -6562710, -8822400, -11897059, -6078453, 1334124, -4866735, 2136209, 14739254, +8497056, -1858647, 14246943, 14273250, -6063420, 1940788, 4122095, -7474317, -4674535, -15771120, +1765768, -5082557, -12565464, -172336, 6842957, 11788611, 7431904, 3433826, 1472637, -10723460, +-1186485, -2473364, 2955474, -4075387, -311385, 219580, 4295, 2544768, 658204, -994822, +2456185, -974958, -3206193, 2689187, -2094333, -3042984, 624918, 1092532, 1180042, 223875, +3449396, -348429, 2269353, 1218160, 420907, 652298, 153008, -2560338, 748398, -3514894, +989453, -5608691, -1218697, -250182, -3516505, -4392678, -396748, -4341138, -627602, -923955, +-10186052, 26036092, -971200, 15943992, -7992398, -22892712, 6580964, 1925219, -845035, -10753524, +-991601, -7096360, 18153216, 13214004, 11900281, 8619999, -14131516, -122943, 2006824, 12559021, +-21482890, -2483028, -5215701, -6333466, 3292093, -7135015, 2822331, 4758824, 3623879, 3795141, +5049808, -1537061, -2062121, -10514080, -2437394, -1639067, 10345502, -40265, -9358734, -2254321, +11252814, -1343251, 6571837, 8329552, -6008123, -3630321, -13815836, -8104604, 27215598, 7113540, +12145094, 6454799, 1634235, 981937, -17149268, 10161356, 1673964, 2955474, 8847096, 9544491, +14981920, -17213156, -7031399, -9569187, -1142998, 2344515, -2207076, -4851166, -2757369, -14440754, +-18041546, -11792906, -16904992, -2238215, -11027865, -19031536, -7968775, 6138582, 10466298, -3991098, +-16185584, -610422, -2393371, 3816079, -4407174, 1014149, 9398462, 399432, -627065, -609349, +1247151, 1614371, -2701535, -2509872, -6471442, -7345468, 3955665, -2034741, 3545496, 3131031, +-1134945, 2125472, 2932926, 5237176, 3786551, -2309619, 1210107, 6681896, 1344325, -6798933, +-5553393, -3080565, -1364726, 492311, -2334852, 3864397, 4330401, -1045825, 6509023, 836982, +-1756642, -1399623, 1546188, 35039952, 7927436, -5056250, -7277285, 1125818, -11251741, -21974664, +16168404, 70330, 10402948, -7872675, 7523172, 17985712, -1788317, 2004139, -4539781, 15652471, +13171591, 5109938, -21226266, 1529008, 3109556, 13103945, 19068044, -5641977, -3919695, -2533494, +5101348, 6802155, 5648956, -9662603, 4392678, -11137387, 8491150, 11345693, -5450314, -11267310, +7081864, -12259984, -11223286, -489626, 3228205, 15929497, 1899986, -2208150, 13562433, -2544768, +12177843, 22530324, 11275900, 230318, -14353781, -1391033, -8282845, -6716792, 14377403, 5599564, +-14559939, -202400, -11140608, -2849174, 19067508, 8752070, 2746632, 8143258, 11467026, 5927592, +-15445776, 7900056, 12810814, 4365298, -10570988, 4298189, 1176821, 2159295, -8284455, 12660490, +-3545496, -3100967, 15229417, 16145319, 2338073, 4558571, 17554606, 984084, 8639864, -6227166, +-242129, 10087804, 5820755, -4547297, 5179194, 9097278, -2535641, 16106, 11611444, 2351495, +4909685, -3513820, -5891622, -1831267, 3198677, 1633698, 2626373, 2695092, -1968169, -1888175, +-1576253, 834834, 3437585, 4161823, -2899103, -920734, 7210713, 999117, 9687836, -1821603, +2593087, -1392106, 1186485, 4322348, 2618856, 286689, -130460, -4198868, -2961380, -2158758, +-4479114, 5595269, 5106716, -8550206, -396211, -10910291, -25550224, 8809515, -10152766, 2801929, +949188, 17910014, -12312061, -10954851, -4544076, -5024575, -6555731, 13228499, -11689827, -16595754, +5010080, -30994094, 964757, -5850283, -13043816, 16648904, -1006633, -996969, 7074348, -6613713, +5334887, -1682554, -18432926, -20200842, -132607, 4262218, 11909407, 5718212, -1274532, -2126546, +-11558831, -5505611, 11760157, -18261664, 25288230, 14982457, 3451543, 18654654, -12358232, -5314485, +-11304891, -11630235, -4948876, 8534637, 23895588, 237834, -12205760, -2042257, 1255204, -1298691, +-1176821, -7528541, 6518150, 5934034, 16149077, -254477, 18248242, 9395778, 5091147, -406948, +3977677, -27052388, 14401025, -3394635, -15749645, 11375221, 98247, 14959371, 6725919, -25050396, +19604916, 15284178, -13023951, 21228950, 8262980, 15882789, 6388764, -2116345, -755914, -577673, +-2833605, -5441187, -1567126, 2435247, -5403606, -8316668, 210453, -5384279, -9754944, -5793374, +-7270306, 4816269, -4413079, 5901285, 1687922, 6025302, 2934000, -510027, -3006477, 1161252, +712965, -293132, 976031, -1581622, -3949223, 2150705, -216896, 2595771, 2774549, 297427, +2372970, 1229434, 3975529, 3482145, -5788542, -3355443, -9680319, -7333120, -47755740, -3896072, +28542742, -5433134, 992137, 24598352, -5611912, 79994, 3178276, 6407018, -7311645, 6391985, +-2416993, -8492224, 8145943, 9213779, -27844810, 3093987, -24763708, -890132, -12756590, -14290430, +-2936147, -4446365, -13518946, 6633577, 2413235, 8423505, 11937862, -17206712, 21531744, 1260573, +-19845434, 1427003, -13649943, -7192997, -14692546, -13741211, -5673115, 13952738, -12042015, 6532646, +14511621, -8820252, -15130633, -14334453, -20517058, -22536230, -12932147, -6576132, 1915019, -3598109, +6327024, 4002910, -13050258, -1193464, 15064061, 8322036, -21807160, 8408472, -1487669, -6351720, +-20189568, 13528073, -7123740, 18757196, 24199994, 401579, 23028004, -12795781, 13437342, -10120554, +14436996, 17907330, 1766842, -24103356, -541703, -32810866, 10748693, 6825777, 13138842, 5909338, +-12566001, -11331734, -2684, -7676717, 7578470, -8286066, -61203, -734439, -7792682, -6507413, +5725729, -3374771, -8837969, -1098975, 3054796, 6520297, 3860639, 14418742, -1280437, 997506, +-4118337, 10042170, -1205275, -2466922, 9273371, -736050, 1608465, 1906429, 12421582, -2194728, +-4678293, 1020592, 8669928, 7694434, -7713762, -1017907, 5829881, -9498857, 5462662, -1735704, +6922951, 150861, -7575786, -22575958, 18204218, -43256764, -2794950, -3952981, -3853660, 4215511, +-25177636, 1924682, -5150203, -1960116, 11150272, 4648765, 13008919, -10074920, 9131637, -4729833, +-22411140, -8778376, -16519518, -9968619, 10473815, -19213000, 2278480, -7031399, -14918032, -2480881, +14072460, -19111530, -18772228, 7705708, 10855530, -498753, -9025337, 10496900, 10695005, 13541495, +11295227, 4907000, 15560130, 18875844, -10362145, 2917357, -9175124, 23646480, -2198487, -16196859, +19347218, 8707509, 4423280, -9242770, -12694313, 2978560, 7171522, 7598334, -973347, -10178536, +7476465, -11869142, 20938, -11716134, 36048196, 5674726, -10790032, 29931090, -3995930, 9190693, +-8086887, 15051713, 21961242, -13817984, 20957830, 22655952, 29171418, 22711788, 1750199, 16870632, +-13575318, -2583960, 2789581, -7299834, 12651900, 598074, -1236414, -1294933, -4200478, 6356015, +2798171, 17894982, -6287296, 6605660, -4364224, 100932, 2938295, 5260798, -7985955, 2760053, +7041599, -3281355, -8925479, -1676111, -14049912, 4662724, 3755949, 3641059, -4065724, 2202245, +6636262, 3970697, -2226404, 6789270, 2563022, -4520990, -2793876, -1495722, 10657961, 14487462, +7207492, 3288871, 2067490, 4902705, 8088497, -5869610, -2901787, 3824132, -1495186, 705985, +3396782, 44707924, 11780558, -7710540, -6438156, 10326175, 3099356, 4356171, -944893, -17978734, +15176804, -40944460, 4631049, 8897025, -1645509, -7548942, -15502684, -7277285, 2043331, 12037183, +18706194, -11051488, -23617488, -19315004, -2560874, 623844, -13852343, 28754270, -13282723, -8898098, +12077985, -4140885, 2312303, -2674154, 24917790, 4042638, -24645060, 9741523, 3313567, 17082696, +-5963562, 1769527, -10095858, 8440148, 3947075, 21558052, -5110474, 9678172, 10434623, -13178570, +-14264123, 934692, 13307956, -25577604, -29979408, -8964670, -12218108, -1722282, -4211753, 2903935, +6995428, -6206228, 1192390, -34900904, -29406568, 23416698, 25132538, -30243550, -23015120, -29111826, +-15033996, -12110734, 15190762, -15937550, -27828166, 724239, 1355062, -17214228, -3500398, 24270860, +-3532611, 1257352, 7976291, -346819, 1530619, -1171452, -8494372, -10799158, -447213, -3134253, +7137699, -1225139, -553514, -7844221, 4002373, -12082280, -170188, 3568581, 4086125, 5669894, +6631967, 1118302, 3797288, -2761127, 712428, -6196564, 2309619, 521839, -6807523, 6973953, +7141994, -11181947, 758062, 8003672, 6753299, 12420509, -2534031, -14635638, 4096862, 4660040, +-7130720, 4525285, -7952132, -3855270, -1209570, -2621541, -6766184, 2374043, -24939264, -3034931, +-6041409, 7509751, -11818139, -3206193, -38778184, 34339336, 22052510, -3717294, 47071232, -4613869, +-25831008, -2369748, 10558103, -15950435, -21071110, -4415764, -14388140, -665720, 3990025, -21625160, +31738198, 1069984, 3399467, -19950124, -5771899, 2163053, -5724655, 5103495, 7211787, 26112328, +4654671, -1323924, 21071110, 17413944, -6190659, 10274099, -13348221, 3767760, 11774653, 11481521, +29485488, -29169808, 17906256, 54130548, 365609, 8893804, 18488760, 2124398, 3651796, 8751533, +6707665, -18080738, -21590800, -7831873, 17301738, 5174362, -22437982, -12130598, -1019518, -10756209, +19880330, 1833414, 15343234, -34166464, -21211232, 9967545, 23393076, 14359149, 9396315, 32494648, +18931678, -13644574, 22332220, -16863652, -3486977, -2423972, 12528420, -2651069, -14024679, 12131135, +5219996, 1160178, -16080358, 11094974, -311922, 215285, -7219303, 9350144, -7703561, -6159520, +-5927592, 4456029, -6185290, -11735461, 3853660, 823023, -169114, -6388227, -1332514, -7999914, +-6942278, -6398965, -4132296, -2470680, -3106872, -2436857, 1027571, 226560, -15260556, 10179072, +3900367, -4792647, -11326366, -15976205, -506269, -8704288, -5985037, 5767068, -4336307, 9893457, +4807679, -3492882, 1596654, 9252433, -4294431, -1545115, -4582193, 7795903, 1704028, 3235721, +-8036958, 15736760, -44826572, 674310, -28991, -1732482, -5452461, 20777442, 1932198, -12411919, +-22352084, 22603876, -20075214, 236760, 14943265, 11532524, -15738371, -4573067, -25497610, -407485, +7593502, 8684424, 10638634, 2445447, -16537772, -21184390, 17391396, 8572218, 8763344, 3067681, +8908836, 2310693, 12852690, -22829362, -37933152, 10271414, -5566278, -8424041, 21458730, -4034585, +-11154567, 18497888, 17919140, 14420890, -1181116, -9903121, -16227997, -4554276, -21523154, 50678468, +-4179540, 18043158, 4108673, -17259326, 14069776, -6804839, -16072841, 15602006, 12806519, -28385438, +19720880, -3326452, 27292370, -27788976, -20562692, 27342836, -980326, -22759568, 23047332, -8749922, +39257612, -16954920, -13289166, -23967528, 15143518, 2415919, -19064286, 7301445, -24823838, -18595598, +1791538, 15826954, -14176613, -9137006, -28219546, -26084948, 30324080, -3860639, 13300977, 20789252, +28780038, -246424, -2743947, -2609193, 7715909, 11103564, 2302103, 4879620, 17785460, 7326141, +9874130, 5362267, 4583267, -3857954, -1472100, 10436234, 8427263, 13801341, -6562710, 8951249, +10060961, -15942382, 4128537, 3475702, -8285529, -4758287, 148713, 3468723, -6699075, 10738492, +790274, -3032784, -3016678, 9035537, 534187, 2499671, 1041530, 2194728, 2328409, -9161165, +-4146254, 6160057, -5499706, -12939126, 33475512, -7656316, 22681722, -35447440, -6193343, -844498, +-42237244, -9315247, 6155762, 20748988, -10366440, -9931038, 959925, -3275986, 29715268, -2837363, +-14875619, 31460636, -3857954, -1628330, 5987722, -12571906, 27250494, 1801739, -5494337, 13037910, +11222750, -14830522, -5025112, -6870874, 21244518, -42309724, -654446, -8184060, -14867029, 7278359, +-15113990, 24680492, -6382322, -30465814, -3080565, 46389940, -28023588, 20356534, -31249646, -8970576, +31307628, 22864796, -16729971, 7980586, -20422570, -26917096, 5859409, -11795054, 11882564, 3476239, +-1764158, 4673998, -39398808, -15369004, -20019380, -28798830, 13557064, -10870562, -7907035, -15916612, +-27941446, -23505820, 18647138, -3580392, 57854820, 10240276, 5481452, 20735028, 36448168, 4882841, +-26022134, 31981400, 24259586, -20217484, 5555540, -5010616, -20114406, -15829639, -13533979, -1412507, +-12336757, 4868883, 8675834, 3133716, -9566503, 17123498, 2827162, 8005819, -2132451, -2781528, +8223252, 5101885, -7929047, -7118372, -6823630, 7975218, 3908957, 9602473, 10171556, 590558, +-5137318, 7777112, -4102231, 16448114, 7908109, -19271518, -3630321, -14150843, 1964411, -4478577, +-6722161, 20562156, -857920, -6088653, 5440113, 6622303, -7166153, -1251983, -9943386, 4778688, +7607461, -1163936, -2967286, 9713605, 22195854, -13040594, -17223892, 19311246, -30534534, -3309809, +-6471979, 2032593, 21121038, -13726715, 23465016, 10398116, 5162551, 7325067, -38888780, 26517128, +4685273, -26946624, 10427107, -28598040, 4704063, 38954816, -5018670, -22666154, -24600498, 10656888, +17369384, 14444512, 7356742, -25285546, -17696876, -7664906, -4949950, 33309082, -21138218, -12317966, +49032956, -27118960, -2306398, 19755238, -99858, 20797306, -3191698, -16343961, -11300059, -29896730, +15204721, 21664888, -32328756, 48302276, 15827491, -36018668, -33239826, -31299038, -37956236, -30332132, +1408749, 15321222, 2803540, -25239912, -9797357, 17219060, -613643, -15733539, 17401596, -34057480, +2032056, -7677254, -31831076, -29361470, 4978404, -11559368, 22222160, -40800040, -5657546, -14323716, +-30165166, 2250026, 48206712, 12592844, -21529598, 10582263, -26474178, 10877005, -10832981, 1115618, +1315334, 13869523, -1596117, 4859756, 17099876, 355409, -9669045, -4221953, 13688061, 9946071, +6240588, 3543348, -27249956, -2600603, 1937030, 15354508, 7485055, -13910325, -376347, 1759863, +23593866, 1467805, 7506529, -7187628, -4772246, 3632469, 7634841, -841814, -7094749, -13176960, +1858110, -4919348, -9291088, 4649839, -6506876, -6461242, 9091372, -7264937, -10698227, -14583561, +-13064217, -2308008, 3747896, 136902, -11365020, 23485954, -58794344, -54376972, -47129748, -30462592, +12326556, -12874164, 60627220, 16004659, -6460705, -13909252, -7647190, 17150878, -39416524, 46153180, +61091076, 24266028, -3668439, 48269528, -15299210, 29185376, 55529632, -10148471, 3090766, 10380399, +73896520, -18750216, -4626754, 43879532, 16692927, 14094472, -12064563, -45038636, 3150896, -35699768, +17073568, -44231720, -51726440, -638340, -2913062, -36166844, -1861868, -17599702, -36998460, -29633126, +-48290464, -2321430, 49409304, -15764141, -9392020, -45519136, -24320252, -16776679, -15548855, 15380278, +-11084774, 82144472, -19377282, -1157494, -29926258, 61991412, 51029044, -36051956, 41518376, -14514842, +-60149408, -10787884, -5698348, 12658879, -13906567, -13694503, -7468412, -24445880, 7179038, 30210264, +-35611720, -5096516, 10466835, 6251862, -41362684, 26986890, 19204946, 62299036, -26380762, 17095580, +26506390, -1557463, 7477538, -797790, 9366250, -6897718, 20527796, 8585103, 16726213, 13999446, +1637456, 14422500, 5000416, -5335423, 15697032, -853625, 3133716, 1716913, 11188927, 7876433, +-10514617, -8660802, -13493714, 21721798, -13923747, 3321084, 14013405, 5703717, 24837260, 20786032, +36672580, 24671902, 21223580, 1553168, 14303852, -18670760, 18236968, 13101261, -3263638, -17913234, +-33101850, -13095892, 10963441, -18771692, -6029061, -13547401, -32282584, -28696288, -12540231, -21267068, +-11651173, -18241800, -22384832, -24683714, -6502044, -6825777, -9855339, -17978734, -18128520, 24444270, +104953432, 11767674, -65037616, -16661252, -22679574, 4643934, 33114198, 58265528, 17264158, -49568216, +-425739, 33724084, 7929584, 421444, -991601, 8582418, -4156992, -6273874, 41044320, 25095494, +23182086, -34687228, -21759914, 23175106, 9645423, 13594108, -11350525, 4088809, 45713484, 851477, +38860864, 19906100, 21485038, 37201932, 6041409, -20019380, 5225365, -22887344, 6340983, 15684684, +4669703, 61005180, -19757924, -39534100, -37337760, 47114180, 22441204, 25057912, 17859010, -27133992, +-33286534, -20758650, -492311, 10232223, -6746857, 16629576, 31976568, -2180770, 23379118, 20604032, +-31012348, -6279779, 9720048, -14847165, -12721693, -15572478, -51592756, -8804683, 23312008, 2042257, +46339476, 30493194, -21446920, 16227460, 944893, -15087683, -12125766, -25182466, -55802364, -30015916, +3002719, 1165547, -11812234, -3214246, -5180805, 18264348, 19568944, 9977209, -2733210, 1599339, +15002321, -6864432, 9672266, -25213068, -11409581, -3072512, 14328548, -3242700, 6062883, 9237938, +9476308, 1493575, 25068650, -19237696, -17025788, -17425220, 13370233, -11149198, -17823040, -17786534, +13514651, -5600101, -12831752, -6542846, 10294500, 2949569, 14779519, -23283554, -15073725, -2231773, +-990527, 5294621, 11579769, -4631586, -8906688, 16627429, -7861938, -9318468, -8329552, 16182363, +-3675418, -7420630, 4983236, -156229, -8071318, 1010928, -10945724, -6163815, -4802847, 316217, +-3374771, 3669513, -2793339, 2523830, -1095217, 3383897, -6021544, 2586644, -2631741, 3051038, +-4184909, 3944391, -6660421, -5881421, -25411174, 2840584, 82349016, 21170968, 34595960, -17229262, +-75185016, -38147900, -55374476, -18682034, 37109056, 85262080, 37982008, 9449465, -40638444, -38254200, +26800596, 42398844, 20957830, 51498804, -2276870, -33743948, -49428096, -24045374, -7713762, 38254736, +4591320, 22102976, 19614042, 3311957, 51043540, 35850092, -4056060, -4917738, -47267188, -11503533, +-1119376, 957241, 26897232, 48240000, 29415694, 23155242, 45187352, 26154740, -47141024, -37813964, +-11926050, -29640106, 31307090, 21340618, 46377592, 36216776, 41010496, 12163884, 7165079, -33779380, +-35443680, -33171106, 11596949, 16896402, -191663, -4501663, 73222216, 18569828, -5143224, -6923488, +50109384, -53500796, 11167452, -101871792, -22874458, 25500294, -35729832, 33272038, 18735722, 528281, +73136312, 34744676, -41660108, -82677048, -39875012, -37442988, -20441360, -13904957, -10781442, 36168456, +22868016, 48785996, 5771899, -35888748, -24831354, -37659884, -35161824, -34843996, 15308337, 3282429, +15139223, 20804284, -9903121, 19241990, 10084046, -13412646, -1667521, -14860587, -4883915, -32129040, +-34109020, -12729209, -14870251, 587337, -31959926, 16979080, -2374580, 5905580, 8857296, -21290690, +-44185012, -39924944, -2216740, 8752606, 9065602, 26242250, 6464463, -13187697, -24899000, 8244727, +5826660, -118897576, -72671920, -39620536, 35030292, 10004589, 162220912, 173107584, 105195024, 191960336, +156860800, 166039136, 114993456, 140487840, 113949240, 2132988, -54354420, -77442016, -74491912, -155588416, +-186796720, -195092976, -136268032, -107092328, -42184096, 7495255, -55185496, 33758980, -69548408, -25094958, +-4786204, -21454436, 16460462, -63753420, 87706456, 15042049, 79955112, 51446192, 29886530, 20960514, +44235480, 28907814, 45368276, 104502456, 99227704, 79223360, 96973384, 122803312, 111686328, 105432320, +193216080, 67902360, 135947520, 177297328, 121739240, 161067184, 85433344, 114815752, 89635432, 107793480, +116473608, 43298104, 75413184, 57360900, 70583496, 68472520, 18655728, -13179644, -74035576, -27205934, +-98775656, -86102816, -146102976, -165154384, -166577088, -351179616, -297622976, -319242240, -317061472, -369621120, +-374219968, -230485664, -268580960, -199622032, -236978576, -179799680, -170652480, -148185504, -149100320, -85328112, +-37919728, -54152560, -55202676, -44676788, 8507256, 71534288, 37153616, 148728272, 127667904, 187929520, +192691568, 178250800, 222058944, 206208896, 238320224, 186738736, 228009072, 242057920, 270083648, 236674704, +141070352, 141555680, 140898016, 143583440, 132002600, 93261992, 86850144, 36521716, 25468620, -2702071, +4138738, 18002356, -48973900, -71785544, -78185048, -47844324, -42722576, -80002896, -93439160, -108674480, +-79120280, -100603704, -93316752, -78420200, -84495432, -85924040, -86137176, -22252226, -20294794, -10461467, +-19361176, 11321534, -2672007, -1993402, -18178986, -6362994, 6412386, 11666205, 4030290, 16151225, +11121818, 19476602, 642098, 3317325, -2473364, 8277476, -2481954, 4155918, -3249143, 3853123, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 5507222, -95026, -2029909, -478889, -4906464, -3393561, 2198487, 179852, -3085397, 3838627, 2594697, --850940, 245350, -538482, 3112778, -4320200, 1626719, 3208878, 2856690, -6210523, -4330401, --3093987, 4172024, 991064, 1369558, -1742146, 4449049, 1650341, -1090922, 100395, -1254131, -853625, 1672890, -1003412, -1266479, -3747359, 3979287, 6593312, 791348, 4181151, -769873, -827318, 1516660, 1807644, -5006858, 334471, -5231270, -1221918, -735513, 1629403, -2636036, --106837, 1153199, 506806, -3049427, 99321, 351114, 2478733, -3243237, -4096325, -545461, -5507222, 8872866, -4295, 1454920, 593779, -1899986, -5353140, -1356673, 3695283, -1701881, -3680787, 1434519, 3748433, -206158, 1443646, 1333587, -3206193, -4307316, -476205, 1623498, -2449205, 1195612, 1082332, 736050, 808528, -1480153, -2374580, -1606855, -1303523, -620086, -20938, -891206, -144955, 781684, 1246614, 1115618, -201863, 71941, 729071, -25233, --956167, 2522220, -5564130, -1262720, -5277441, 3051038, 341450, -2432562, 11248519, -4396973, --8061654, 613643, 3732327, -681826, -6067178, -1729261, -2637647, -994822, -2878165, -948114, -4170950, -294742, -2724083, 4784594, 701690, 4647692, -1239098, -1145146, 1786706, 117575, -2081449, -875100, 4386236, 7167227, -1978369, -4825933, -3535295, 2953864, -11274, -11047193, --1051730, -4405026, -1641214, 5401995, -3776887, -2872260, 3725884, -2442226, -535797, 4953708, -1707786, -3914326, 1749125, -2820720, -6525666, 2081449, 2556579, -4956929, -2869038, -1435593, --2084670, -49392, 2120640, 3379066, 5119064, 5724118, -1370095, 583579, -2263448, 2467459, -1570347, -1275068, 2394981, 3676492, -3517041, -1794760, 590558, 68719, 1414118, 4224101, --536334, -1133871, 3828427, 560493, -2660195, -1665374, -204548, -1633161, 1169842, -679142, --1472100, 599685, -1669669, -1315334, 825171, -1677185, -1136556, 46708, 1108638, -2075006, -236223, -505732, -725313, -1001264, -96100, -1619203, -462783, -1550483, -9055939, -4599373, -2782065, 4012036, 1562831, 4352413, -3724274, 4555350, 5587753, -1570347, 6183679, -843961, -4554276, -2165737, 137439, -1942399, 5824513, 2274722, -239444, 5206574, -2775623, -2201708, -3806952, -9043591, -1578401, 495532, -1928977, -8059506, -4927938, 3345243, -3162707, -2100776, -111132, 6307697, -1519882, -4413079, -353261, 1624035, 3561065, -541166, -5724118, -3685619, --1057636, -2929168, 944893, -4977330, 2465848, -4683125, -6890738, 221191, 2407866, 2800856, --2209224, -1581085, -4525285, 5845988, 3373160, 816581, 52613, -162135, -1991791, -1063004, -1969779, 2496987, 8812736, -992674, 2212982, 580357, -272194, -4317516, -3289408, 5979668, --2578591, 588947, 1476395, 866510, -947040, 4519916, 231391, 165893, -4912369, 4740034, -2649995, -1831267, -1099512, -530965, -1433445, 655519, 3408594, -46708, 1348083, 1035087, --489626, 792958, 1756105, -184147, -8053, 543313, 812286, 707596, 998580, 1826972, -673236, -1341104, 1394254, 651224, -998043, -773631, -171262, 208843, 2193118, 2699387, -2410551, 5767068, -3825742, -5709086, -4613332, 2891050, 6372658, -1191317, 4880157, -4350802, --5291937, 4364761, -2206540, 445066, 1624035, 5471789, 2026688, 8692477, -3797288, -4645007, -2024540, -2576444, -2430952, 4924180, -7699803, -4750771, 765041, -1493575, 3498788, -2617783, -959388, 6180458, -5765457, 4296041, -3481071, 2781528, -3261491, -930934, -530428, 6405944, -1202054, 223875, -4696547, 227096, -5587216, 2091112, 1375463, -3734474, -92342, -1547799, -9669582, 1299228, 617402, -8396124, -4923107, -7081328, 5527623, -3608846, -399432, 2913062, -12337830, 8709657, -3483219, -7592429, -3161633, -6591701, 6970732, -1337882, -1925756, -3050501, --2023467, -571768, -3183108, -2110440, -526134, -2583423, 1861868, -1807108, 2609730, -9595494, -662499, -791348, -3023120, -1421634, -3209951, -644782, -5024575, 412317, -2073932, -168041, -3074123, -966905, -1060320, -2150705, -2374043, -670552, 705985, -133681, -181999, -855772, --344671, -1012539, -136902, 246961, 624918, -716723, -817654, -1140851, -1007707, -872952, --1531156, -4867272, 3497714, -5036386, -8943733, 9124121, 4140885, -9587978, 9588514, -1545115, --548682, -13470091, 8027294, 5336497, -10875931, 3232500, -1783485, 4118337, 967978, 4747013, -3063922, 1206349, -5049271, 466004, 1881196, -6702297, -2836289, -7907572, -1336809, -4918275, --2610266, 891206, -6167573, -2285996, -9097278, 3441880, 927713, 780610, 824097, -3927748, --7915625, -2484639, 2816425, -1291711, -663036, 8308078, -12305618, 5177046, 6324340, -918049, -421981, -2403571, -949188, -4001299, -6065568, -4158602, -4773320, -3214783, 3087545, 1688459, -2752000, 4156992, -964757, -2222109, 5964636, 11337103, 8027831, -174483, -9626632, 2649458, --1453310, 1416266, 10255845, -70330, 10331007, 9190693, -1233729, -3087008, -2443837, 716186, -916439, 3423089, 10475425, 2781528, 443992, -1079111, -6448357, 764504, 2026688, -2199023, --290447, 324807, -55835, 1197759, 938450, 732292, -784368, 1258425, 1188632, 1124208, -1316408, -3514894, -533113, -2527052, 1031866, -1975685, 858457, -568546, -875636, -2114198, -428423, 519691, -3043521, -985695, 748935, 14532022, 3717294, -2581275, -703301, 4471061, --1526324, 14077292, -1494112, -2161979, 17838072, 112206, 9019968, -3352759, 248571, -777389, -1468879, -2281165, 1239098, -278636, -509491, -9678172, -925565, -2305861, -1731946, -4032974, -6195491, 2898029, 3686693, -5428839, -601832, -8579734, -3434900, 1612223, -698469, -5215701, --1607392, 2867965, 6473053, 3918084, -2052994, -7976828, -280247, 2271501, -1340567, 4226785, -2807835, 5730023, 7897908, -2568391, -52613, -8518531, -10356777, 9774272, 5246840, -353261, --435939, -323733, -3778498, -4141422, -82678, 7824357, 4520453, 1420560, 9545565, -7318088, -2144263, -6002217, -4633196, 4107599, 4217658, 3475166, 14378477, -518617, -6500433, 1129576, --6372658, 2886218, 1675037, 5252745, -2838974, 83752, 645319, -4830228, -865973, 3380676, --508417, 876710, -2101850, -1069447, -318901, 2341831, -1240172, 1479616, -2229625, 210453, --2882460, 922881, -1533303, -985158, 455803, 1455994, -1786170, 1929514, 1227824, 2354716, -139050, 1398012, -606664, 855772, 421981, 865973, -900333, -13422, -843424, -114354, -417686, 1221918, -7977902, -10713259, 4159676, -10012643, 3221, 11145440, -11661910, 4268124, -5235565, -3129421, -14394046, 189515, 8420820, -9314173, 5792837, -652835, -4127464, -12077985, --338766, -8714489, 1544578, -4425427, -6788733, -8477729, 3486440, -1203665, -494458, 8056285, --4874251, 6796249, -5160403, -2067490, 10417980, 3568044, -5554467, 4274566, 2517925, -4821101, -2544768, 2618320, -1844689, -2059974, 420907, -2324651, -2741800, 1704028, 1911797, 14172855, --13340705, 2156611, 857383, -4785131, 9601399, 5459441, -3287261, -10349261, 927176, -1050120, --3117073, -6532646, -7643431, 9331890, 6059662, 772020, -926102, 4970351, 2530810, -2262374, -3985193, 2856153, -2581812, 9928891, -3680250, 6073084, -4059281, 3020436, 3130494, 2236604, --293132, -5528160, 5288716, -4304631, -4470524, -3075734, 1546725, -11811, 663572, -5243618, -2856690, 2201171, -3309809, 339839, -121333, -1660005, 321586, -1100585, 2544231, -733366, -397821, 2119030, -952946, -1613297, 1418950, -1838783, 1494649, -331786, -9664, -2116882, --935766, -74088, -2298881, 2276870, 1302986, 512712, 1524713, -491774, 1042603, 4728222, --10803990, 7928510, -4522064, -1981591, -6202470, -4449049, 3775276, -3547106, 3087545, 12111271, -4141959, 6659884, -15439334, -10204305, -5503464, -3681861, 1668058, -60130, 2659659, -12945031, -6931541, 2900177, 1728724, 12370580, 205085, -6996502, 11599633, 4575214, -5181878, 2379949, --6659347, 6107444, 2870649, 8136279, -6971806, -4938676, 2054605, -7036230, 8879845, -8139500, --147103, 7902740, 7268159, -15031312, -430034, 741419, 1744831, 2492692, 16423955, 3798362, -1022739, -5023501, -4158065, -8877161, -4814122, 12148852, 289910, -14494441, 215285, 3360275, --8238284, -9059160, 1072668, -5874979, 2406792, 13313325, 6527814, 5604396, -5465346, -14221710, -1142461, -2432562, 6524056, -1277216, -11917997, -1447404, 3103651, 3283503, 3212099, -1004486, -10082436, 1905355, -6421513, 8323110, -619549, 4981089, -171262, -1242319, -4335770, 6150393, -4225711, 2405182, -3148748, -1228361, -831613, -2076617, 1163399, -13422, -2677375, 1330366, -805306, -1503239, -1993939, -829466, -1508070, -220117, 1865626, -1913408, 959388, 2352032, -2812667, -725313, 1197222, -1500017, -19041738, -5662915, 5376226, 14719927, 2092186, 7642895, -26109644, 4358318, 4450660, -4019553, -12525198, 7116224, -6076842, 6558952, -1580011, 17297444, -12586402, -6643778, -14149233, -11225434, 8528731, -7469485, 10456098, 4620848, 3403762, -3591667, --1383516, 12455942, -2458332, 10995653, 10977936, 5698885, 7699266, -8516920, 8338142, 4520990, --4476967, 12174622, -5359583, 11063299, 826244, 1272384, -16203301, 9788230, 889058, -3020436, -7999377, -11265699, -4483946, 6791954, 5526549, -10377178, 1672890, -6628209, -3828963, 10331544, -1381369, 3137474, -1092532, -11839614, 7963406, 7591892, 514859, 6008659, 2680597, -5228049, --5524939, -417149, 6327024, -10717017, -390305, 721018, 464393, -69793, 4704063, 6213207, -12693239, 7157563, 419833, -17805860, -5866389, -6645388, -598074, 1354525, -5011690, -10539850, --3331284, -4729296, 2789581, 446140, -3013457, 1167694, -3089692, 4954782, -1767379, -2067490, --2914135, 93416, 1421634, -6320045, 3991098, -4050691, 1660005, -1011465, -2345589, 152471, --3915400, 1307818, -3531537, -2533494, -502511, -1998770, -1877975, 2226941, 3762928, 2296734, -3623342, 4755603, -973347, 745177, 23540716, 6939594, 3105261, -8698919, -21263846, 15403900, -4763656, -14039711, 4180077, -1479079, 3591667, 3031710, -10200010, -21719112, -17062294, 5800890, -13326210, -2596845, 13993540, -6443525, 10916196, 13395466, 18065706, -3934727, 13348758, -11806865, -4514548, -6415071, 1601486, 7261179, -316754, -3796214, 3248606, 9105868, -6453189, -11966853, --12175159, 25556666, 44023, -1206886, -11504607, 11888469, 3844533, -23458574, -13625784, 5346698, --3310883, -4095788, 9188009, 3181497, 22767622, 12645457, -806917, -13156559, -12983686, -7296613, --5336497, -14934138, 13879187, -10188736, 10984379, 9516037, -9499394, -12173548, -11838004, -17206712, -4214974, -207769, -6208375, -7740605, -12677133, -4460324, -12485470, 2713883, 1519345, -4167729, -1710471, 10324565, -26134340, -10068477, -21325050, 10858751, 7514046, -9071508, -3078418, 4472135, --4014184, -43487, 5068062, -3869229, -8530342, -862752, -2450279, -2603287, -95563, -1020592, --3619047, 233002, 767725, 4652524, -6286759, 1762010, 3470871, -297963, -2595234, -3942243, --1163399, -522375, 908386, -1297080, -331786, -2351495, 1216550, -884226, -4008815, 7256884, -754304, 2261837, -12658879, -24401856, -5420249, -6332393, 1352915, -5662915, 1061394, 2580202, --2621004, 10487236, -13511430, -4091493, -12822625, -620086, -6380711, 14863808, 16616155, 13282723, --18524194, 13149042, -6686727, 9989020, -3827353, 7377680, -6146098, -7912404, 2858838, -10223633, -6586869, 7937100, -979789, 4769025, -9372156, -1175747, 15876347, -12618077, 606664, -3742527, --5173825, -10173167, -566399, 15683610, 20667382, -13037910, 6249178, -1636919, -12538083, -12822625, --13771813, -6305012, 26161720, 15792595, -4889821, 8396124, -5552856, 7270843, -14314589, 8403104, --431107, -7835631, 19913616, 10253161, 4065724, 6496138, 5698885, 18628884, 2469606, -15844671, -6437619, 12049531, 9454834, -27642946, 16859358, -11751567, -10430328, -5190468, 1714766, -10869488, -11928198, 26433914, -4603131, 3750043, 13523241, 2261837, -2220498, 3180423, 1376537, 7678328, -6931004, 4133369, 12684112, 6465537, -3541738, 8592619, 5359583, -3862786, -7732552, 4310000, --1078574, 4668093, -2224793, 1359357, 3827353, 1457605, -1115081, -1007170, 1721208, 5887327, -1283122, -1460289, 1299765, 4505421, -2027761, 180926, 7677791, 2907156, -2068027, 4144107, -1302986, 1051193, 3144453, -151934, 2588255, -1282585, -4932233, -4532801, 3793530, 16977468, -11176579, 46139224, 12991202, -7795903, 3042448, 7739531, 269509, 15349676, 11525008, 10623602, --13657459, -22973244, 23023710, -13027173, 2261837, 7906498, 25258166, 10067940, -15163919, 13725105, --13707388, -2892124, -18877456, -24937116, -2704756, 6676527, 6793565, 4964982, 6431177, -2017024, --17006460, -6364605, 5572720, 5724118, -8967892, 18919330, 12113418, -11418171, 6370510, 9394704, -3780645, 528818, -10412611, -1351304, -7280507, -4391604, 1152125, 11750494, 29443612, -8023536, -2745558, 4278861, 11024644, -10561325, 37299108, -3269544, 3673808, 3060164, -16831440, -16619913, --26676578, -11411191, 14701673, -5179731, 7422777, 5874979, 25679072, 4044249, 4655745, 1302449, -20245938, 9697499, -8388071, 18475876, -16815870, 2653216, 17125646, 21967684, 20311974, 7938174, --11506754, -18894634, -8092256, -6076305, -13721347, -7715372, -7792145, -2226941, -11519639, 2866354, --3944928, -1948841, -10043244, -1239098, -6254546, 9902584, 1051193, 2122251, -8939438, -1783485, --12286828, 799401, 5273683, -450435, 9007620, 5620502, 27380, 3664144, -1861868, -5606006, --3255585, -2550137, -10541460, 915902, 2105608, 2454574, 3141769, -5270462, 7437810, 8005282, -3548180, -6314139, -4217658, -2149631, 1799054, 4394826, 2401961, -4252018, -2174864, -4858145, --19223736, 10827613, 5136244, 13291313, -3578245, -29396904, 2333778, -19725712, -17494476, 5167920, -4169876, 8166881, -5120138, 5867999, -1051193, -10082973, 16002511, -2618856, -5317170, -6452115, --11253351, -9673877, 5815386, -12184285, 2954938, -7814156, -5352603, -3403225, 15704548, -3137474, -16858820, 10492068, -4434017, 5543192, 5829345, 11924440, -8283382, -11369315, 1695438, 6998113, -9199283, 15761993, -17463874, -17002702, 7260642, 5582384, 19516868, -9670656, -1395864, 9644349, -57445, 2673617, -3605088, 12733504, 16048145, 7329362, -2040646, 10043781, 33658584, -7466801, --9822053, 12476880, -1381906, 19640886, 4726612, 9157944, 11080479, -3610994, 7756174, 22736484, --6208912, -27338540, 19226958, 5611375, -9006546, 2619393, -41653668, 27780386, -277025, 17222818, --10938745, 8986145, 1269700, -16607565, -15830176, -2178085, 3072512, -12272869, 65498, 1885491, --2254858, -4082903, -2557653, -13423920, -2230162, -8058433, 115427, -4213363, -1217623, -4825933, -8078297, -5994164, -4576288, -8660802, -4187593, -9882183, -1823214, 2216203, -5499169, -621697, --4503810, -4912906, -5321465, -325344, -4405563, -3282429, 1589675, -1413581, 4298726, -3063922, --6313065, -6908992, 45097, 1198833, -4349728, -886911, -1957968, 2122788, -9286256, -17807472, --879395, 27736362, 13615046, -35723392, 5468567, -6445672, 2980707, 5841693, -1865626, -18416282, -2440615, -2849711, 15864535, 31029528, -5266167, 9992778, 20310900, -912681, -5884642, -5247377, -7947300, 30990336, -781684, -2144799, 25328496, -10363219, 6714645, 71941, -580357, -6640557, -9426379, -28428926, 725850, 9013526, 20617454, 22106734, -18347564, 784368, 19805168, -1189169, -37005440, -13469554, -18368502, 2521683, 26844620, 4793721, -20875688, -9690520, 6003291, -42413, -11613592, -30155502, 3557844, 1399623, -6442988, -21857088, -19547470, 5211406, -6025302, -1291711, -970126, -22743462, -24043226, 5153424, 3637837, -24104430, -8294656, -15638513, 13974213, -38141992, --14564234, 12628278, -23298050, 12793634, -6357089, -9235253, 12580496, -3823595, 18947786, 18152142, -3985730, 11296301, -5162014, 2359548, -13554917, 14662481, -10525891, 8759586, -14191646, 10520522, -648003, 4736275, -1280437, 148713, -8173860, 9735080, -10696079, 1923072, 1166621, 5513128, --11727408, 6152004, -4769025, -3188476, 3645354, -2398202, -5519570, 7945153, 3279208, 8486855, -3676492, -781147, -3983045, -3923990, -1087164, 1659468, -5575942, 2052458, -4071092, 2058363, --11215770, -5761162, -4597226, 5840619, 6630356, -3590056, 1491964, -1568737, -9321153, 20170778, -24159, 11156178, -21056614, -1587527, -19929186, 20900384, 9290014, 27347668, 19311246, -9713069, -3728569, 21600464, 11138998, 10991895, 7093139, -18364744, -5206037, 9016210, 1500554, 10650445, --23360864, -17381732, 10635413, 35049080, 4830765, -11604465, 22207128, 6300180, 13902272, 3650185, -2768107, -19798726, -20092394, 342524, 395674, -34660924, 2863670, -7134478, -1721208, 10945724, --13458280, 8268886, 27276264, 2840047, -44303660, -31919660, -5139465, -9838696, -10971494, -351114, -8137890, 7009924, -10817412, 12273943, 11718281, 10544682, -6802155, 9072582, -4946192, -11566347, --2669322, 10132902, -33050848, -7584912, -14889578, -17289390, -6811282, 4635344, -8732205, -934692, -36527088, 20714628, -13952201, 97711, 474057, -6314139, -6436009, 3176665, 24521578, 8913668, -3770981, -7612293, -5439039, -12718472, -14562087, -15622407, -3506304, 1974074, 4910222, -5489505, -4395362, -1325534, -3489661, -1377611, -4107599, -13721884, -3340948, -151398, -3389803, -11872900, -1575179, -4316442, 12988518, -6551973, 4451197, -1339493, 5409512, -88047, -10368051, 868120, -12613245, 1893544, 11355357, -3128347, 5855651, -3628174, 3750043, -796180, -7668664, -3462281, --737124, -1405528, -1443109, -71404, 7482370, 14288282, -19891604, -5077725, -8443369, 5253819, -41523744, 6526203, -20464982, 5366562, 18330920, -3980898, 17126182, 21787832, -11292006, 5116917, -11001022, 7477538, 468688, -3260954, -6773701, 3210488, 12930536, 6630356, 12075837, -18174154, --27954332, -3018288, 12449500, 10945187, 8934606, -3224447, -25788058, 8258685, 5703180, 38562900, -40577776, 9602473, -30213484, 21805012, -11513197, -30909270, -7226283, -36572184, -27841052, -12327630, --13419088, -28369870, 4927938, -11457899, -32447404, -29721710, 8568997, 19233400, -3187403, -25096030, -7439420, 679142, 8010114, 15735150, 15365246, -19425600, 25016038, 17154100, 2179696, 6874632, -17406428, -947577, 45532024, -32506996, -15527917, -1126355, -37047852, 30367566, 2215666, 38182796, -11797201, 8514773, -1935957, 7536594, 16196322, 599685, -15083388, -279173, -8052527, 6027450, -5833640, 10894185, -4585952, -13991930, -93952, 12934831, 6135898, -8311836, -4141959, 6788196, --9299678, -73014, 200253, 11882027, 4660040, -6519761, -2825015, -7402913, -11944304, -10364830, --573915, 2245194, -5921686, -4363687, 1389422, -5980742, 9357123, 4554813, -112206, 5616207, -18898392, -7196755, -3597035, 2127620, 5075041, -10196789, 11076721, -3732864, -341987, 1890859, -8283382, 13939316, -20240570, 5311264, -40421012, -10954314, -2504503, -9948755, 44377212, 13982803, --11787538, -27884002, -14134201, -11480984, -17661442, -12967043, 6787659, -40705552, -8760660, 29867740, --3534221, -3362960, -31095026, 29655138, 14704357, 660888, -11791296, 12633646, 6274411, -7092065, -13543106, -21024938, -5572720, -10743324, 6030671, -4918275, -13237626, 15024869, -11290932, 6260452, -438087, -20429012, -12710956, -3198140, -25550760, -25103546, -33590940, -8685498, 15413564, -11294153, --6150393, 19369766, -23638426, -19452980, 20959978, -184147, -1207960, 18855444, 282394, -16164646, --9269613, 6352257, 13656385, -20881058, -6546067, 25373594, 10982231, 24482924, 12709345, -5034239, -12915504, -1005022, -33172716, 10405632, -25092272, 18175228, 3194382, 6652905, -10552198, -28722594, -6056441, -4303021, -24893630, -10006200, 11196443, -12664248, 541166, 3904125, 8159364, -8134131, -459562, 1187022, -2124935, 5178657, -3711926, 2890513, 10241886, -1911797, 3526168, 2661269, --6600828, 2066416, 4929549, 2768643, -4922570, 6703370, 4693863, -516470, -6901476, -14190572, -2945811, -11234024, 9137006, -11469710, 7538742, 9346923, 475131, 518617, 304406, 5302137, -863288, -4902169, 11060078, 8794482, -4332549, -6929930, -11546483, 30285962, 10573673, 1117765, -3697967, -7909719, 12008192, 18662706, 47278464, 41293964, 3570729, -18179522, 8410083, 23943906, -6843494, 18540836, 13372381, 8978629, -14013405, -17995376, -21626770, -1507534, 8034810, 15232102, -30713848, 16253767, 19697794, 11454141, 18262738, 9215389, 17592186, -11748883, 3316789, 33205466, --892816, 25545928, 6771016, 20659866, -32779728, -5331128, -9662603, -9658845, 7645042, 12767327, -23741506, 38408280, 32172526, -11404212, 5713380, -42652248, 10361072, 9821516, 37580428, -29875256, -23767812, -7756711, -20943334, 16049219, 4952634, 13394392, 23541252, -7659538, -30149060, 15604690, --19382650, -26578868, -12633646, 35560720, -30868466, -43815644, -22111566, -7260106, 23110682, -2412698, --15756624, -30240864, -22830972, 14461155, -2065879, -565862, 19588272, -21336860, 6101001, 21908628, -8533563, 14666776, 21220360, -14371497, -7241315, -12146168, 16230145, 3603478, 8356933, 5915781, --14605036, 18138184, 4482872, 2874407, -7154879, -26519812, -25333864, 2524904, -12057047, -5004174, --11436424, -9946607, -4365835, 4672925, -151934, -11186242, 14283987, 11970611, -1611150, -12698071, -2081449, 7646653, -9074192, -4111358, -5211406, 105764, 6172942, -2850785, -6272800, -5078799, -4340602, 3631395, 6963216, 8684961, -4553739, 4962298, 5374078, 29707752, -9371082, -32829120, -2303713, -13711683, -46932720, -23738284, 61550640, 8608188, -27799176, -30521648, 3434900, 544924, -12710419, 15979963, -21530672, -14294725, -34346852, 7996692, -12463458, -8244727, 52476448, 11270531, --7266011, -54169740, -3506304, -28924458, 28660316, 35413080, 3704946, 27551678, -32466194, -12768938, --20516522, -4842576, 53586160, 66748624, 10649908, -17814988, -23848880, -48189532, 648003, 6236830, -58254252, 32518808, -8527658, -95784752, -49629420, 8249559, -9208410, 84136800, 28187870, -40377524, --16813186, -72086192, -22827214, 2542084, 47140488, 48652852, 54608360, 2605972, 12931073, -5740224, -4707821, 67189928, -24802900, 49356152, -11960410, -50673096, -15181099, -53717156, -17264158, 70350488, -31978716, 50233400, -16654273, 39395052, -44109316, -7026030, 10481331, 21001316, 41777684, -14097156, --912144, 2639794, -3962644, 6460168, 11143293, -11950747, 1816771, -12566537, -22738630, 10226317, -18471044, 10305237, -2400887, -13648869, -30422328, -29955250, -15804406, 10142028, 27996208, 15780784, -21655762, -29446832, -38612292, -29778618, 3344169, 33823940, 37554656, 28855738, -17244294, -73536816, --47265580, 1433982, 37015100, 79915920, 30961346, 6571300, -36389648, -47936128, -16660715, -15253576, -41878616, 46286324, 17299592, -2743410, -40172440, -30128122, 9175124, 13839995, 34061240, 16557099, --17607218, -12319577, -21082384, -10031970, 9893994, 9047885, -42673720, 47327856, 79994, -12333535, --73531984, -19794430, -19857244, -33175938, 71185328, 762894, 31891742, -48657148, 27015882, 22687090, --21895744, 14247480, -4211216, 12736726, -11274, 36422396, 12858058, -35328792, 21334176, 17614734, --125628, 24596740, -18190260, -9327058, 30848602, 21643950, 20540144, 10279467, 17868674, -53243636, -46468324, -26714160, -17028472, 10190884, -37363532, 54575612, -15540802, 5504538, 39363912, 1418950, --6029597, 21474836, 21863532, 38676716, -9465571, -35785132, -36576480, 4131222, -13237089, 17001628, --22143778, -10671383, -15008763, 11014444, -68702832, 1200443, 50918448, 14187351, 20697984, -1837172, --5666136, 13513578, -18181670, -20659866, 12731357, 7177427, -22406308, -24761560, 94551024, -10151155, --30826590, 8679592, 44281648, -1154809, -35003448, 14464913, -6626061, -13152264, 28478318, 36318780, --26598732, -43331388, 9740449, 10521059, -10088341, -25891136, 1218160, 13160317, -4068945, -4154307, --1796907, -4415764, 6888054, 7795366, -8993662, 1037772, 3818226, 2001455, -5440650, 2049773, --375273, -11969537, 8580808, 3749507, 16675747, 8359617, -6437082, 6887517, -3389803, 9914395, --782221, -2523830, 13587129, -3347927, 9285719, -2698313, -10821170, -893353, 12223477, -3416647, -13924821, -13224204, 17503066, 4168803, -12706661, 5348308, 207232, 6502044, -2196339, -5051419, --1344862, 13749801, -36681168, 13063680, 57882200, 91163904, -40308268, 29716342, -60186988, -17737142, --36666136, -4995584, 56018720, 59456308, 47245712, -1477469, -37729676, -22809498, 20542292, 1552094, -10303627, 31079994, -570694, 15476378, -39549668, -10077604, -22877144, -27851790, 15291157, 12749074, -862752, 27875948, -23661512, -837519, 6276558, -33347736, -921271, 2350958, -21088290, -7948374, -7907572, -14076755, 31412318, -10264435, 47582868, 35996120, -23460186, -6575058, -32610612, -37262600, --48400524, 15486041, 22308598, 64698852, 49334680, 23060216, 31351650, 6012954, -35638564, -23551990, --19966766, -24257976, -5161477, 13584445, -1313723, -16669305, 4335770, -16819092, 10569915, 24103356, -4692252, -25144886, 19643032, -12057047, -12808666, -25164750, 13012140, 11156714, 5700496, 3081639, -57028040, 43589088, 35642860, 6047851, -8293045, -48324824, -10136123, -5061082, 47498580, 27214524, -12364137, 14347338, 41133440, -6578816, -16415902, -22254910, -18644990, -8791261, -4198331, 3717831, -470836, 261993, 21325050, -2521683, -12791486, -7861401, -4416300, 405338, 10522670, 18998250, -8295730, -2470680, 11745125, -19793356, 7657390, 18059264, 7340099, 35661112, -14717779, 151398, -6039798, -15005005, 3818226, -23820426, -1304596, 8193724, 202400, 9552007, -6873559, -98972152, --57332444, -33006824, 56899728, 26718454, 151434640, 142380848, 147048400, 148809872, 159362080, 112170048, -58497456, 84954456, 50984484, -25337086, -47205448, -72698224, -141491248, -127397856, -132189968, -95741264, --97126392, -71905808, -59697360, -31661962, 3192235, -55934968, -28683940, -11565273, -8892193, -30245696, -7758322, 37929928, 42469172, 15897285, 50184544, 64004140, 15795279, 12648679, 12600360, 62896576, -65410204, 82695304, 92433600, 81021872, 91796336, 139584288, 56501904, 109003584, 148580640, 95664488, -112772960, 88794152, 44378288, 53079892, 58562416, 52206940, 70757976, 69860328, 43251932, 8553964, -21483426, 41210212, -2618856, 4862977, -19811074, -22673132, -70164200, -31477278, -121568512, -152609312, --122353952, -139229424, -189642128, -182987616, -108608448, -204403936, -185615072, -169261984, -191619968, -161540704, --123368640, -154789552, -114045880, -31465468, -75756240, -93522376, -37067716, -36899136, -30486214, -33470680, --14964740, 9385577, 19228032, 37520836, 48399988, 55624120, 62513248, 64763812, 91183232, 56041272, -107426792, 120423904, 57272316, 111874768, 106249976, 67575408, 81439024, 118371448, 80400176, 133591736, -100753488, 126689184, 88607320, 80711024, 83516712, 78212432, 61304216, 70387536, 61072824, 48525076, -36436356, 35748624, 28918552, 12790949, -8905078, -6702297, -5021891, -41681048, -68319504, -65333968, --67308576, -73023568, -67900208, -75548472, -54877336, -56453052, -46395312, -33914672, -26711476, -30027726, --29898342, -22257058, -15744813, -16895328, -22944790, -11113765, -5379447, -12097849, -19443854, -9938017, --6550362, -8323110, -9280351, 1234803, 3693672, 5188321, 603980, 1806571, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +95026, -2029909, -478889, -4906464, -3393561, 2198487, 179852, -3085397, 3838627, 2594697, +-850940, 245350, -538482, 3112778, -4320200, 1626719, 3208878, 2856690, -6210523, -4330401, +-3093987, 4172024, 991064, 1369558, -1742146, 4449049, 1650341, -1090922, 100395, -1254131, +853625, 1672890, -1003412, -1266479, -3747359, 3979287, 6593312, 791348, 4181151, -769873, +827318, 1516660, 1807644, -5006858, 334471, -5231270, -1221918, -735513, 1629403, -2636036, +-106837, 1153199, 506806, -3049427, 99321, 351114, 2478733, -3243237, -4096325, -545461, +5507222, 8872866, -4295, 1454920, 593779, -1899986, -5353140, -1356673, 3695283, -1701881, +3680787, 1434519, 3748433, -206158, 1443646, 1333587, -3206193, -4307316, -476205, 1623498, +2449205, 1195612, 1082332, 736050, 808528, -1480153, -2374580, -1606855, -1303523, -620086, +20938, -891206, -144955, 781684, 1246614, 1115618, -201863, 71941, 729071, -25233, +-956167, 2522220, -5564130, -1262720, -5277441, 3051038, 341450, -2432562, 11248519, -4396973, +-8061654, 613643, 3732327, -681826, -6067178, -1729261, -2637647, -994822, -2878165, -948114, +4170950, -294742, -2724083, 4784594, 701690, 4647692, -1239098, -1145146, 1786706, 117575, +2081449, -875100, 4386236, 7167227, -1978369, -4825933, -3535295, 2953864, -11274, -11047193, +-1051730, -4405026, -1641214, 5401995, -3776887, -2872260, 3725884, -2442226, -535797, 4953708, +1707786, -3914326, 1749125, -2820720, -6525666, 2081449, 2556579, -4956929, -2869038, -1435593, +-2084670, -49392, 2120640, 3379066, 5119064, 5724118, -1370095, 583579, -2263448, 2467459, +1570347, -1275068, 2394981, 3676492, -3517041, -1794760, 590558, 68719, 1414118, 4224101, +-536334, -1133871, 3828427, 560493, -2660195, -1665374, -204548, -1633161, 1169842, -679142, +-1472100, 599685, -1669669, -1315334, 825171, -1677185, -1136556, 46708, 1108638, -2075006, +236223, -505732, -725313, -1001264, -96100, -1619203, -462783, -1550483, -9055939, -4599373, +2782065, 4012036, 1562831, 4352413, -3724274, 4555350, 5587753, -1570347, 6183679, -843961, +4554276, -2165737, 137439, -1942399, 5824513, 2274722, -239444, 5206574, -2775623, -2201708, +3806952, -9043591, -1578401, 495532, -1928977, -8059506, -4927938, 3345243, -3162707, -2100776, +111132, 6307697, -1519882, -4413079, -353261, 1624035, 3561065, -541166, -5724118, -3685619, +-1057636, -2929168, 944893, -4977330, 2465848, -4683125, -6890738, 221191, 2407866, 2800856, +-2209224, -1581085, -4525285, 5845988, 3373160, 816581, 52613, -162135, -1991791, -1063004, +1969779, 2496987, 8812736, -992674, 2212982, 580357, -272194, -4317516, -3289408, 5979668, +-2578591, 588947, 1476395, 866510, -947040, 4519916, 231391, 165893, -4912369, 4740034, +2649995, -1831267, -1099512, -530965, -1433445, 655519, 3408594, -46708, 1348083, 1035087, +-489626, 792958, 1756105, -184147, -8053, 543313, 812286, 707596, 998580, 1826972, +673236, -1341104, 1394254, 651224, -998043, -773631, -171262, 208843, 2193118, 2699387, +2410551, 5767068, -3825742, -5709086, -4613332, 2891050, 6372658, -1191317, 4880157, -4350802, +-5291937, 4364761, -2206540, 445066, 1624035, 5471789, 2026688, 8692477, -3797288, -4645007, +2024540, -2576444, -2430952, 4924180, -7699803, -4750771, 765041, -1493575, 3498788, -2617783, +959388, 6180458, -5765457, 4296041, -3481071, 2781528, -3261491, -930934, -530428, 6405944, +1202054, 223875, -4696547, 227096, -5587216, 2091112, 1375463, -3734474, -92342, -1547799, +9669582, 1299228, 617402, -8396124, -4923107, -7081328, 5527623, -3608846, -399432, 2913062, +12337830, 8709657, -3483219, -7592429, -3161633, -6591701, 6970732, -1337882, -1925756, -3050501, +-2023467, -571768, -3183108, -2110440, -526134, -2583423, 1861868, -1807108, 2609730, -9595494, +662499, -791348, -3023120, -1421634, -3209951, -644782, -5024575, 412317, -2073932, -168041, +3074123, -966905, -1060320, -2150705, -2374043, -670552, 705985, -133681, -181999, -855772, +-344671, -1012539, -136902, 246961, 624918, -716723, -817654, -1140851, -1007707, -872952, +-1531156, -4867272, 3497714, -5036386, -8943733, 9124121, 4140885, -9587978, 9588514, -1545115, +-548682, -13470091, 8027294, 5336497, -10875931, 3232500, -1783485, 4118337, 967978, 4747013, +3063922, 1206349, -5049271, 466004, 1881196, -6702297, -2836289, -7907572, -1336809, -4918275, +-2610266, 891206, -6167573, -2285996, -9097278, 3441880, 927713, 780610, 824097, -3927748, +-7915625, -2484639, 2816425, -1291711, -663036, 8308078, -12305618, 5177046, 6324340, -918049, +421981, -2403571, -949188, -4001299, -6065568, -4158602, -4773320, -3214783, 3087545, 1688459, +2752000, 4156992, -964757, -2222109, 5964636, 11337103, 8027831, -174483, -9626632, 2649458, +-1453310, 1416266, 10255845, -70330, 10331007, 9190693, -1233729, -3087008, -2443837, 716186, +916439, 3423089, 10475425, 2781528, 443992, -1079111, -6448357, 764504, 2026688, -2199023, +-290447, 324807, -55835, 1197759, 938450, 732292, -784368, 1258425, 1188632, 1124208, +1316408, -3514894, -533113, -2527052, 1031866, -1975685, 858457, -568546, -875636, -2114198, +428423, 519691, -3043521, -985695, 748935, 14532022, 3717294, -2581275, -703301, 4471061, +-1526324, 14077292, -1494112, -2161979, 17838072, 112206, 9019968, -3352759, 248571, -777389, +1468879, -2281165, 1239098, -278636, -509491, -9678172, -925565, -2305861, -1731946, -4032974, +6195491, 2898029, 3686693, -5428839, -601832, -8579734, -3434900, 1612223, -698469, -5215701, +-1607392, 2867965, 6473053, 3918084, -2052994, -7976828, -280247, 2271501, -1340567, 4226785, +2807835, 5730023, 7897908, -2568391, -52613, -8518531, -10356777, 9774272, 5246840, -353261, +-435939, -323733, -3778498, -4141422, -82678, 7824357, 4520453, 1420560, 9545565, -7318088, +2144263, -6002217, -4633196, 4107599, 4217658, 3475166, 14378477, -518617, -6500433, 1129576, +-6372658, 2886218, 1675037, 5252745, -2838974, 83752, 645319, -4830228, -865973, 3380676, +-508417, 876710, -2101850, -1069447, -318901, 2341831, -1240172, 1479616, -2229625, 210453, +-2882460, 922881, -1533303, -985158, 455803, 1455994, -1786170, 1929514, 1227824, 2354716, +139050, 1398012, -606664, 855772, 421981, 865973, -900333, -13422, -843424, -114354, +417686, 1221918, -7977902, -10713259, 4159676, -10012643, 3221, 11145440, -11661910, 4268124, +5235565, -3129421, -14394046, 189515, 8420820, -9314173, 5792837, -652835, -4127464, -12077985, +-338766, -8714489, 1544578, -4425427, -6788733, -8477729, 3486440, -1203665, -494458, 8056285, +-4874251, 6796249, -5160403, -2067490, 10417980, 3568044, -5554467, 4274566, 2517925, -4821101, +2544768, 2618320, -1844689, -2059974, 420907, -2324651, -2741800, 1704028, 1911797, 14172855, +-13340705, 2156611, 857383, -4785131, 9601399, 5459441, -3287261, -10349261, 927176, -1050120, +-3117073, -6532646, -7643431, 9331890, 6059662, 772020, -926102, 4970351, 2530810, -2262374, +3985193, 2856153, -2581812, 9928891, -3680250, 6073084, -4059281, 3020436, 3130494, 2236604, +-293132, -5528160, 5288716, -4304631, -4470524, -3075734, 1546725, -11811, 663572, -5243618, +2856690, 2201171, -3309809, 339839, -121333, -1660005, 321586, -1100585, 2544231, -733366, +397821, 2119030, -952946, -1613297, 1418950, -1838783, 1494649, -331786, -9664, -2116882, +-935766, -74088, -2298881, 2276870, 1302986, 512712, 1524713, -491774, 1042603, 4728222, +-10803990, 7928510, -4522064, -1981591, -6202470, -4449049, 3775276, -3547106, 3087545, 12111271, +4141959, 6659884, -15439334, -10204305, -5503464, -3681861, 1668058, -60130, 2659659, -12945031, +6931541, 2900177, 1728724, 12370580, 205085, -6996502, 11599633, 4575214, -5181878, 2379949, +-6659347, 6107444, 2870649, 8136279, -6971806, -4938676, 2054605, -7036230, 8879845, -8139500, +-147103, 7902740, 7268159, -15031312, -430034, 741419, 1744831, 2492692, 16423955, 3798362, +1022739, -5023501, -4158065, -8877161, -4814122, 12148852, 289910, -14494441, 215285, 3360275, +-8238284, -9059160, 1072668, -5874979, 2406792, 13313325, 6527814, 5604396, -5465346, -14221710, +1142461, -2432562, 6524056, -1277216, -11917997, -1447404, 3103651, 3283503, 3212099, -1004486, +10082436, 1905355, -6421513, 8323110, -619549, 4981089, -171262, -1242319, -4335770, 6150393, +4225711, 2405182, -3148748, -1228361, -831613, -2076617, 1163399, -13422, -2677375, 1330366, +805306, -1503239, -1993939, -829466, -1508070, -220117, 1865626, -1913408, 959388, 2352032, +2812667, -725313, 1197222, -1500017, -19041738, -5662915, 5376226, 14719927, 2092186, 7642895, +26109644, 4358318, 4450660, -4019553, -12525198, 7116224, -6076842, 6558952, -1580011, 17297444, +12586402, -6643778, -14149233, -11225434, 8528731, -7469485, 10456098, 4620848, 3403762, -3591667, +-1383516, 12455942, -2458332, 10995653, 10977936, 5698885, 7699266, -8516920, 8338142, 4520990, +-4476967, 12174622, -5359583, 11063299, 826244, 1272384, -16203301, 9788230, 889058, -3020436, +7999377, -11265699, -4483946, 6791954, 5526549, -10377178, 1672890, -6628209, -3828963, 10331544, +1381369, 3137474, -1092532, -11839614, 7963406, 7591892, 514859, 6008659, 2680597, -5228049, +-5524939, -417149, 6327024, -10717017, -390305, 721018, 464393, -69793, 4704063, 6213207, +12693239, 7157563, 419833, -17805860, -5866389, -6645388, -598074, 1354525, -5011690, -10539850, +-3331284, -4729296, 2789581, 446140, -3013457, 1167694, -3089692, 4954782, -1767379, -2067490, +-2914135, 93416, 1421634, -6320045, 3991098, -4050691, 1660005, -1011465, -2345589, 152471, +-3915400, 1307818, -3531537, -2533494, -502511, -1998770, -1877975, 2226941, 3762928, 2296734, +3623342, 4755603, -973347, 745177, 23540716, 6939594, 3105261, -8698919, -21263846, 15403900, +4763656, -14039711, 4180077, -1479079, 3591667, 3031710, -10200010, -21719112, -17062294, 5800890, +13326210, -2596845, 13993540, -6443525, 10916196, 13395466, 18065706, -3934727, 13348758, -11806865, +4514548, -6415071, 1601486, 7261179, -316754, -3796214, 3248606, 9105868, -6453189, -11966853, +-12175159, 25556666, 44023, -1206886, -11504607, 11888469, 3844533, -23458574, -13625784, 5346698, +-3310883, -4095788, 9188009, 3181497, 22767622, 12645457, -806917, -13156559, -12983686, -7296613, +-5336497, -14934138, 13879187, -10188736, 10984379, 9516037, -9499394, -12173548, -11838004, -17206712, +4214974, -207769, -6208375, -7740605, -12677133, -4460324, -12485470, 2713883, 1519345, -4167729, +1710471, 10324565, -26134340, -10068477, -21325050, 10858751, 7514046, -9071508, -3078418, 4472135, +-4014184, -43487, 5068062, -3869229, -8530342, -862752, -2450279, -2603287, -95563, -1020592, +-3619047, 233002, 767725, 4652524, -6286759, 1762010, 3470871, -297963, -2595234, -3942243, +-1163399, -522375, 908386, -1297080, -331786, -2351495, 1216550, -884226, -4008815, 7256884, +754304, 2261837, -12658879, -24401856, -5420249, -6332393, 1352915, -5662915, 1061394, 2580202, +-2621004, 10487236, -13511430, -4091493, -12822625, -620086, -6380711, 14863808, 16616155, 13282723, +-18524194, 13149042, -6686727, 9989020, -3827353, 7377680, -6146098, -7912404, 2858838, -10223633, +6586869, 7937100, -979789, 4769025, -9372156, -1175747, 15876347, -12618077, 606664, -3742527, +-5173825, -10173167, -566399, 15683610, 20667382, -13037910, 6249178, -1636919, -12538083, -12822625, +-13771813, -6305012, 26161720, 15792595, -4889821, 8396124, -5552856, 7270843, -14314589, 8403104, +-431107, -7835631, 19913616, 10253161, 4065724, 6496138, 5698885, 18628884, 2469606, -15844671, +6437619, 12049531, 9454834, -27642946, 16859358, -11751567, -10430328, -5190468, 1714766, -10869488, +11928198, 26433914, -4603131, 3750043, 13523241, 2261837, -2220498, 3180423, 1376537, 7678328, +6931004, 4133369, 12684112, 6465537, -3541738, 8592619, 5359583, -3862786, -7732552, 4310000, +-1078574, 4668093, -2224793, 1359357, 3827353, 1457605, -1115081, -1007170, 1721208, 5887327, +1283122, -1460289, 1299765, 4505421, -2027761, 180926, 7677791, 2907156, -2068027, 4144107, +1302986, 1051193, 3144453, -151934, 2588255, -1282585, -4932233, -4532801, 3793530, 16977468, +11176579, 46139224, 12991202, -7795903, 3042448, 7739531, 269509, 15349676, 11525008, 10623602, +-13657459, -22973244, 23023710, -13027173, 2261837, 7906498, 25258166, 10067940, -15163919, 13725105, +-13707388, -2892124, -18877456, -24937116, -2704756, 6676527, 6793565, 4964982, 6431177, -2017024, +-17006460, -6364605, 5572720, 5724118, -8967892, 18919330, 12113418, -11418171, 6370510, 9394704, +3780645, 528818, -10412611, -1351304, -7280507, -4391604, 1152125, 11750494, 29443612, -8023536, +2745558, 4278861, 11024644, -10561325, 37299108, -3269544, 3673808, 3060164, -16831440, -16619913, +-26676578, -11411191, 14701673, -5179731, 7422777, 5874979, 25679072, 4044249, 4655745, 1302449, +20245938, 9697499, -8388071, 18475876, -16815870, 2653216, 17125646, 21967684, 20311974, 7938174, +-11506754, -18894634, -8092256, -6076305, -13721347, -7715372, -7792145, -2226941, -11519639, 2866354, +-3944928, -1948841, -10043244, -1239098, -6254546, 9902584, 1051193, 2122251, -8939438, -1783485, +-12286828, 799401, 5273683, -450435, 9007620, 5620502, 27380, 3664144, -1861868, -5606006, +-3255585, -2550137, -10541460, 915902, 2105608, 2454574, 3141769, -5270462, 7437810, 8005282, +3548180, -6314139, -4217658, -2149631, 1799054, 4394826, 2401961, -4252018, -2174864, -4858145, +-19223736, 10827613, 5136244, 13291313, -3578245, -29396904, 2333778, -19725712, -17494476, 5167920, +4169876, 8166881, -5120138, 5867999, -1051193, -10082973, 16002511, -2618856, -5317170, -6452115, +-11253351, -9673877, 5815386, -12184285, 2954938, -7814156, -5352603, -3403225, 15704548, -3137474, +16858820, 10492068, -4434017, 5543192, 5829345, 11924440, -8283382, -11369315, 1695438, 6998113, +9199283, 15761993, -17463874, -17002702, 7260642, 5582384, 19516868, -9670656, -1395864, 9644349, +57445, 2673617, -3605088, 12733504, 16048145, 7329362, -2040646, 10043781, 33658584, -7466801, +-9822053, 12476880, -1381906, 19640886, 4726612, 9157944, 11080479, -3610994, 7756174, 22736484, +-6208912, -27338540, 19226958, 5611375, -9006546, 2619393, -41653668, 27780386, -277025, 17222818, +-10938745, 8986145, 1269700, -16607565, -15830176, -2178085, 3072512, -12272869, 65498, 1885491, +-2254858, -4082903, -2557653, -13423920, -2230162, -8058433, 115427, -4213363, -1217623, -4825933, +8078297, -5994164, -4576288, -8660802, -4187593, -9882183, -1823214, 2216203, -5499169, -621697, +-4503810, -4912906, -5321465, -325344, -4405563, -3282429, 1589675, -1413581, 4298726, -3063922, +-6313065, -6908992, 45097, 1198833, -4349728, -886911, -1957968, 2122788, -9286256, -17807472, +-879395, 27736362, 13615046, -35723392, 5468567, -6445672, 2980707, 5841693, -1865626, -18416282, +2440615, -2849711, 15864535, 31029528, -5266167, 9992778, 20310900, -912681, -5884642, -5247377, +7947300, 30990336, -781684, -2144799, 25328496, -10363219, 6714645, 71941, -580357, -6640557, +9426379, -28428926, 725850, 9013526, 20617454, 22106734, -18347564, 784368, 19805168, -1189169, +37005440, -13469554, -18368502, 2521683, 26844620, 4793721, -20875688, -9690520, 6003291, -42413, +11613592, -30155502, 3557844, 1399623, -6442988, -21857088, -19547470, 5211406, -6025302, -1291711, +970126, -22743462, -24043226, 5153424, 3637837, -24104430, -8294656, -15638513, 13974213, -38141992, +-14564234, 12628278, -23298050, 12793634, -6357089, -9235253, 12580496, -3823595, 18947786, 18152142, +3985730, 11296301, -5162014, 2359548, -13554917, 14662481, -10525891, 8759586, -14191646, 10520522, +648003, 4736275, -1280437, 148713, -8173860, 9735080, -10696079, 1923072, 1166621, 5513128, +-11727408, 6152004, -4769025, -3188476, 3645354, -2398202, -5519570, 7945153, 3279208, 8486855, +3676492, -781147, -3983045, -3923990, -1087164, 1659468, -5575942, 2052458, -4071092, 2058363, +-11215770, -5761162, -4597226, 5840619, 6630356, -3590056, 1491964, -1568737, -9321153, 20170778, +24159, 11156178, -21056614, -1587527, -19929186, 20900384, 9290014, 27347668, 19311246, -9713069, +3728569, 21600464, 11138998, 10991895, 7093139, -18364744, -5206037, 9016210, 1500554, 10650445, +-23360864, -17381732, 10635413, 35049080, 4830765, -11604465, 22207128, 6300180, 13902272, 3650185, +2768107, -19798726, -20092394, 342524, 395674, -34660924, 2863670, -7134478, -1721208, 10945724, +-13458280, 8268886, 27276264, 2840047, -44303660, -31919660, -5139465, -9838696, -10971494, -351114, +8137890, 7009924, -10817412, 12273943, 11718281, 10544682, -6802155, 9072582, -4946192, -11566347, +-2669322, 10132902, -33050848, -7584912, -14889578, -17289390, -6811282, 4635344, -8732205, -934692, +36527088, 20714628, -13952201, 97711, 474057, -6314139, -6436009, 3176665, 24521578, 8913668, +3770981, -7612293, -5439039, -12718472, -14562087, -15622407, -3506304, 1974074, 4910222, -5489505, +4395362, -1325534, -3489661, -1377611, -4107599, -13721884, -3340948, -151398, -3389803, -11872900, +1575179, -4316442, 12988518, -6551973, 4451197, -1339493, 5409512, -88047, -10368051, 868120, +12613245, 1893544, 11355357, -3128347, 5855651, -3628174, 3750043, -796180, -7668664, -3462281, +-737124, -1405528, -1443109, -71404, 7482370, 14288282, -19891604, -5077725, -8443369, 5253819, +41523744, 6526203, -20464982, 5366562, 18330920, -3980898, 17126182, 21787832, -11292006, 5116917, +11001022, 7477538, 468688, -3260954, -6773701, 3210488, 12930536, 6630356, 12075837, -18174154, +-27954332, -3018288, 12449500, 10945187, 8934606, -3224447, -25788058, 8258685, 5703180, 38562900, +40577776, 9602473, -30213484, 21805012, -11513197, -30909270, -7226283, -36572184, -27841052, -12327630, +-13419088, -28369870, 4927938, -11457899, -32447404, -29721710, 8568997, 19233400, -3187403, -25096030, +7439420, 679142, 8010114, 15735150, 15365246, -19425600, 25016038, 17154100, 2179696, 6874632, +17406428, -947577, 45532024, -32506996, -15527917, -1126355, -37047852, 30367566, 2215666, 38182796, +11797201, 8514773, -1935957, 7536594, 16196322, 599685, -15083388, -279173, -8052527, 6027450, +5833640, 10894185, -4585952, -13991930, -93952, 12934831, 6135898, -8311836, -4141959, 6788196, +-9299678, -73014, 200253, 11882027, 4660040, -6519761, -2825015, -7402913, -11944304, -10364830, +-573915, 2245194, -5921686, -4363687, 1389422, -5980742, 9357123, 4554813, -112206, 5616207, +18898392, -7196755, -3597035, 2127620, 5075041, -10196789, 11076721, -3732864, -341987, 1890859, +8283382, 13939316, -20240570, 5311264, -40421012, -10954314, -2504503, -9948755, 44377212, 13982803, +-11787538, -27884002, -14134201, -11480984, -17661442, -12967043, 6787659, -40705552, -8760660, 29867740, +-3534221, -3362960, -31095026, 29655138, 14704357, 660888, -11791296, 12633646, 6274411, -7092065, +13543106, -21024938, -5572720, -10743324, 6030671, -4918275, -13237626, 15024869, -11290932, 6260452, +438087, -20429012, -12710956, -3198140, -25550760, -25103546, -33590940, -8685498, 15413564, -11294153, +-6150393, 19369766, -23638426, -19452980, 20959978, -184147, -1207960, 18855444, 282394, -16164646, +-9269613, 6352257, 13656385, -20881058, -6546067, 25373594, 10982231, 24482924, 12709345, -5034239, +12915504, -1005022, -33172716, 10405632, -25092272, 18175228, 3194382, 6652905, -10552198, -28722594, +6056441, -4303021, -24893630, -10006200, 11196443, -12664248, 541166, 3904125, 8159364, -8134131, +459562, 1187022, -2124935, 5178657, -3711926, 2890513, 10241886, -1911797, 3526168, 2661269, +-6600828, 2066416, 4929549, 2768643, -4922570, 6703370, 4693863, -516470, -6901476, -14190572, +2945811, -11234024, 9137006, -11469710, 7538742, 9346923, 475131, 518617, 304406, 5302137, +863288, -4902169, 11060078, 8794482, -4332549, -6929930, -11546483, 30285962, 10573673, 1117765, +3697967, -7909719, 12008192, 18662706, 47278464, 41293964, 3570729, -18179522, 8410083, 23943906, +6843494, 18540836, 13372381, 8978629, -14013405, -17995376, -21626770, -1507534, 8034810, 15232102, +30713848, 16253767, 19697794, 11454141, 18262738, 9215389, 17592186, -11748883, 3316789, 33205466, +-892816, 25545928, 6771016, 20659866, -32779728, -5331128, -9662603, -9658845, 7645042, 12767327, +23741506, 38408280, 32172526, -11404212, 5713380, -42652248, 10361072, 9821516, 37580428, -29875256, +23767812, -7756711, -20943334, 16049219, 4952634, 13394392, 23541252, -7659538, -30149060, 15604690, +-19382650, -26578868, -12633646, 35560720, -30868466, -43815644, -22111566, -7260106, 23110682, -2412698, +-15756624, -30240864, -22830972, 14461155, -2065879, -565862, 19588272, -21336860, 6101001, 21908628, +8533563, 14666776, 21220360, -14371497, -7241315, -12146168, 16230145, 3603478, 8356933, 5915781, +-14605036, 18138184, 4482872, 2874407, -7154879, -26519812, -25333864, 2524904, -12057047, -5004174, +-11436424, -9946607, -4365835, 4672925, -151934, -11186242, 14283987, 11970611, -1611150, -12698071, +2081449, 7646653, -9074192, -4111358, -5211406, 105764, 6172942, -2850785, -6272800, -5078799, +4340602, 3631395, 6963216, 8684961, -4553739, 4962298, 5374078, 29707752, -9371082, -32829120, +2303713, -13711683, -46932720, -23738284, 61550640, 8608188, -27799176, -30521648, 3434900, 544924, +12710419, 15979963, -21530672, -14294725, -34346852, 7996692, -12463458, -8244727, 52476448, 11270531, +-7266011, -54169740, -3506304, -28924458, 28660316, 35413080, 3704946, 27551678, -32466194, -12768938, +-20516522, -4842576, 53586160, 66748624, 10649908, -17814988, -23848880, -48189532, 648003, 6236830, +58254252, 32518808, -8527658, -95784752, -49629420, 8249559, -9208410, 84136800, 28187870, -40377524, +-16813186, -72086192, -22827214, 2542084, 47140488, 48652852, 54608360, 2605972, 12931073, -5740224, +4707821, 67189928, -24802900, 49356152, -11960410, -50673096, -15181099, -53717156, -17264158, 70350488, +31978716, 50233400, -16654273, 39395052, -44109316, -7026030, 10481331, 21001316, 41777684, -14097156, +-912144, 2639794, -3962644, 6460168, 11143293, -11950747, 1816771, -12566537, -22738630, 10226317, +18471044, 10305237, -2400887, -13648869, -30422328, -29955250, -15804406, 10142028, 27996208, 15780784, +21655762, -29446832, -38612292, -29778618, 3344169, 33823940, 37554656, 28855738, -17244294, -73536816, +-47265580, 1433982, 37015100, 79915920, 30961346, 6571300, -36389648, -47936128, -16660715, -15253576, +41878616, 46286324, 17299592, -2743410, -40172440, -30128122, 9175124, 13839995, 34061240, 16557099, +-17607218, -12319577, -21082384, -10031970, 9893994, 9047885, -42673720, 47327856, 79994, -12333535, +-73531984, -19794430, -19857244, -33175938, 71185328, 762894, 31891742, -48657148, 27015882, 22687090, +-21895744, 14247480, -4211216, 12736726, -11274, 36422396, 12858058, -35328792, 21334176, 17614734, +-125628, 24596740, -18190260, -9327058, 30848602, 21643950, 20540144, 10279467, 17868674, -53243636, +46468324, -26714160, -17028472, 10190884, -37363532, 54575612, -15540802, 5504538, 39363912, 1418950, +-6029597, 21474836, 21863532, 38676716, -9465571, -35785132, -36576480, 4131222, -13237089, 17001628, +-22143778, -10671383, -15008763, 11014444, -68702832, 1200443, 50918448, 14187351, 20697984, -1837172, +-5666136, 13513578, -18181670, -20659866, 12731357, 7177427, -22406308, -24761560, 94551024, -10151155, +-30826590, 8679592, 44281648, -1154809, -35003448, 14464913, -6626061, -13152264, 28478318, 36318780, +-26598732, -43331388, 9740449, 10521059, -10088341, -25891136, 1218160, 13160317, -4068945, -4154307, +-1796907, -4415764, 6888054, 7795366, -8993662, 1037772, 3818226, 2001455, -5440650, 2049773, +-375273, -11969537, 8580808, 3749507, 16675747, 8359617, -6437082, 6887517, -3389803, 9914395, +-782221, -2523830, 13587129, -3347927, 9285719, -2698313, -10821170, -893353, 12223477, -3416647, +13924821, -13224204, 17503066, 4168803, -12706661, 5348308, 207232, 6502044, -2196339, -5051419, +-1344862, 13749801, -36681168, 13063680, 57882200, 91163904, -40308268, 29716342, -60186988, -17737142, +-36666136, -4995584, 56018720, 59456308, 47245712, -1477469, -37729676, -22809498, 20542292, 1552094, +10303627, 31079994, -570694, 15476378, -39549668, -10077604, -22877144, -27851790, 15291157, 12749074, +862752, 27875948, -23661512, -837519, 6276558, -33347736, -921271, 2350958, -21088290, -7948374, +7907572, -14076755, 31412318, -10264435, 47582868, 35996120, -23460186, -6575058, -32610612, -37262600, +-48400524, 15486041, 22308598, 64698852, 49334680, 23060216, 31351650, 6012954, -35638564, -23551990, +-19966766, -24257976, -5161477, 13584445, -1313723, -16669305, 4335770, -16819092, 10569915, 24103356, +4692252, -25144886, 19643032, -12057047, -12808666, -25164750, 13012140, 11156714, 5700496, 3081639, +57028040, 43589088, 35642860, 6047851, -8293045, -48324824, -10136123, -5061082, 47498580, 27214524, +12364137, 14347338, 41133440, -6578816, -16415902, -22254910, -18644990, -8791261, -4198331, 3717831, +470836, 261993, 21325050, -2521683, -12791486, -7861401, -4416300, 405338, 10522670, 18998250, +8295730, -2470680, 11745125, -19793356, 7657390, 18059264, 7340099, 35661112, -14717779, 151398, +6039798, -15005005, 3818226, -23820426, -1304596, 8193724, 202400, 9552007, -6873559, -98972152, +-57332444, -33006824, 56899728, 26718454, 151434640, 142380848, 147048400, 148809872, 159362080, 112170048, +58497456, 84954456, 50984484, -25337086, -47205448, -72698224, -141491248, -127397856, -132189968, -95741264, +-97126392, -71905808, -59697360, -31661962, 3192235, -55934968, -28683940, -11565273, -8892193, -30245696, +7758322, 37929928, 42469172, 15897285, 50184544, 64004140, 15795279, 12648679, 12600360, 62896576, +65410204, 82695304, 92433600, 81021872, 91796336, 139584288, 56501904, 109003584, 148580640, 95664488, +112772960, 88794152, 44378288, 53079892, 58562416, 52206940, 70757976, 69860328, 43251932, 8553964, +21483426, 41210212, -2618856, 4862977, -19811074, -22673132, -70164200, -31477278, -121568512, -152609312, +-122353952, -139229424, -189642128, -182987616, -108608448, -204403936, -185615072, -169261984, -191619968, -161540704, +-123368640, -154789552, -114045880, -31465468, -75756240, -93522376, -37067716, -36899136, -30486214, -33470680, +-14964740, 9385577, 19228032, 37520836, 48399988, 55624120, 62513248, 64763812, 91183232, 56041272, +107426792, 120423904, 57272316, 111874768, 106249976, 67575408, 81439024, 118371448, 80400176, 133591736, +100753488, 126689184, 88607320, 80711024, 83516712, 78212432, 61304216, 70387536, 61072824, 48525076, +36436356, 35748624, 28918552, 12790949, -8905078, -6702297, -5021891, -41681048, -68319504, -65333968, +-67308576, -73023568, -67900208, -75548472, -54877336, -56453052, -46395312, -33914672, -26711476, -30027726, +-29898342, -22257058, -15744813, -16895328, -22944790, -11113765, -5379447, -12097849, -19443854, -9938017, +-6550362, -8323110, -9280351, 1234803, 3693672, 5188321, 603980, 1806571, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 10777147, -565325, -710817, -370978, -846109, -5516886, -5599027, 5360656, 1287417, -3201898, -4889821, --2353642, -3695283, -6370510, 8149701, 987843, 2952253, 4065187, 11740830, -299574, 1874753, --2827699, -1044214, -2174864, -7653632, 1708860, -2341831, 756988, 5318780, -2099702, -523449, -1158567, 562104, -1263794, 248034, -7070053, 1466195, -169651, -2538863, 2211908, 1013075, --4758824, 7509751, 263604, 1077500, 6990060, -2716567, -3019362, -6895033, -3491809, 4756140, -298500, 5069672, -2485712, -5641440, 2451890, -5259188, -2351495, -10147397, 4169340, 3542274, -2161979, 3045669, 6957847, 1796907, -3055869, 3746285, 5778879, -3791383, 2860985, -32212, --1220845, -1973001, -1557999, 3882114, -789200, 4308926, -2186138, 1720671, -1349694, 1554241, -3149285, -1726040, 1147293, -1198296, 2544768, 2047626, 1743220, -897111, 603443, 46171, --1419487, 685047, 2486249, 415001, 842887, -1496259, 976568, -828929, 578210, -1155883, -246961, 1439351, -4263292, 1148904, -2638721, -5406827, -526670, -6386617, -7740605, -4894652, --3707094, -8543764, 345745, -3088082, -1716376, 2624225, 9100499, 829466, -2160369, -1046898, -1464584, -180926, 3781182, 6455336, -544924, 7248831, -833761, -477815, -867583, 4127464, --5459441, 847182, 662499, -1343788, -310848, -3264175, -5425618, 7451769, -2536178, -557809, --1328756, 3286187, -3546032, -3055332, 1299228, 1102733, 5207648, -3575024, 4289062, -2509335, --4294431, -341450, -1774358, 1162326, 2336999, -96637, 3032784, 1439888, 2210835, -2877628, --3377455, -5599564, -4112431, 521302, 6681896, 840203, 5427228, 1404991, -2794413, 3728032, -1772211, -4035659, 7071127, 1175210, -6658810, 1731409, 3018288, 594853, 2004676, 1728188, --4717485, 1716376, 1652489, 1159641, -271120, 3469260, 1168231, -892279, -1139240, -27917, -1389422, -43487, 1886564, -62814, 91805, 1084479, -450972, -1038845, -666257, 184147, --921271, -988379, 1214402, -119185, 1165547, 1020592, -284005, -105227, -7925826, -7044283, -1493575, 792421, 5896990, -4567161, 6066105, -3098282, -1376000, -9556302, -635118, 608812, --3299609, -598611, 5092221, 4796405, 7220914, -1804423, -1134945, 4485557, 2093797, 4023311, --9865003, 9699647, -2131915, -180389, 1511292, -1237488, -110595, -921807, -708133, 5994164, --212601, 7884486, -1402307, -3304441, -6638946, 715112, -3027415, -2676302, 4524748, 3469797, -4732517, 100395, 551903, -7090991, -5110474, -136902, 6361921, 2152316, -864362, 2080375, --2708514, 6755447, -405338, -5951751, -7515656, -2733210, 8337069, 6265821, 6430103, 2943663, -204548, -7072738, -3171833, -1051730, -4138738, 4261145, -774168, -2022393, 3659849, -10044855, -2955474, -1336272, 2339684, -823023, -2889439, 4495757, 1690607, -4779225, -5060009, 2518462, --1334661, 2944200, 783832, -2180770, 1529008, 1863479, -104690, 701690, -15569, 191663, --858457, -38655, -1403381, -8053, -1224066, 1960653, 1071058, -1527935, 744640, -406411, -515933, 512175, 682363, -1140314, -983548, 336618, 729071, -2079301, 1998770, -2255932, --4347044, -718333, -3367791, 1539746, 5449240, 2134062, 191663, -2223183, -12671227, -8353712, --275415, 3665755, 4435091, 253403, 893890, -1790465, 4396973, 1946694, 3522410, -5526013, -5233955, 3003793, -5957120, 2228014, 5456756, -302795, 1762010, 885837, 4947803, -3852586, -2935073, -506269, -671626, -4738960, 285615, 5064840, -3237332, -2345589, -4439386, 5945309, --585726, 1154273, -4670240, -13304735, -3882651, 1950452, 1222455, 4910758, -3543885, -2189360, --2022930, -892816, -4280472, 129923, -3865471, 8712341, 3061238, 7106561, -7205882, -1422171, --2992519, 6658810, -2034204, -1232119, -5551245, 3438658, -120796, -3711389, 5666673, 1753957, -686658, 6502581, 1386201, -5708549, -804233, 687195, -1557999, -1929514, 34897, -4849018, -9607305, 3958349, 1390496, 5988258, 2593087, 2364380, 4395362, -1264331, 3718368, -2139968, -634581, 381178, 216359, -1116155, 665720, 284542, -360777, -654446, -629750, 457951, --499290, 38655, 3181497, 330712, -100932, -57982, -49929, -434329, 2523293, 650151, -3537443, -2817499, 2245194, 212601, -1456531, 6012954, 4573604, -463320, -8202314, -10941966, --8458938, 3131568, 2147, -4726075, -1237488, 554588, -1080721, 12313671, 2121177, -8896488, --2370822, -2659122, 442382, -4187593, 6958921, -5204964, -6828461, 6375879, -2687039, 1750736, -1686848, -2916283, -8038568, 1070521, -4287451, -3781719, -3941169, -490700, 6245420, -864899, --1425392, 9240085, 1687385, 1414655, -11931956, -1331440, 6349573, 7443179, -4126927, 2018635, -1008244, -11766600, -1585380, -723165, -1211181, 2961380, 120796, -6602976, 846645, -5281199, -5046587, -1800128, 6498823, 1294396, -7490423, 3306588, 14011794, -5455682, 105764, -10463077, -2514167, 8785356, -15782931, 2240362, -1142461, -1377074, 3896072, -2556579, -4139275, 7384123, -7047505, -6127845, -768799, 4617090, -2088965, 1077500, 2153926, 1355062, 418222, -1801739, -3913252, -121870, 2546379, 90731, 3491272, 2381023, 2188823, -206695, 724239, 3904125, -386010, -828929, 1340030, 1198833, 426276, 3237869, -1850594, 1012539, 478352, -751082, -192737, 1150514, 773631, 368293, -357556, 10545755, 1312113, 4729296, 7472706, -9213779, --2827699, -7031399, 3537443, 4080219, 8115341, 15709380, 2473364, -11980811, -1119913, -3011846, --1242856, -5181341, 19327, -579821, 5938866, 4727686, 1721208, -424665, 237834, -1845225, --1370632, 6804302, -2219424, -911607, 5085242, -638876, 2996277, -507880, 6472516, -4941897, --9785009, 12170864, -717260, 2889439, -9159555, 674847, -2786897, 13503914, 2127620, 6112812, --1278827, 5420786, 3648038, -12222403, -1926830, -6863358, -5900748, 823560, 8613020, 1080721, --1730872, 13370233, -1416802, -7556458, -5770289, -3954054, 6562173, 20201378, -41876, 5605469, -1449015, -6439767, -1414118, 110595, 5994164, 9183177, 844498, 7380902, 6585259, -12097312, -400506, -2161979, -308164, 6061273, -2705830, 1574642, 2862596, -933082, -6212134, -4313221, --9073655, 2170032, 3616899, -457951, 1396401, 1334124, 1102733, -111669, -2817499, 595390, -1336809, -161061, 1238024, -1473711, 2416993, -210453, 1214402, -670552, -434865, -1170379, -307090, -629750, 425202, 1995549, 3209414, 2651069, 402116, 690953, 1966021, 1089848, -61740, 1107028, -3595961, -15602006, 3535832, -1578937, 5350456, 3427384, 14518600, 2919504, --2752000, 3476776, 11107859, 12294881, 5073967, 8657580, 8855686, -6877854, -5345624, -11141682, --12038793, 1308354, 5182952, -10187126, -7247758, -562104, -11782706, -9769977, 4940823, 1574642, --5240934, -3494493, -7734699, 6403260, 4674535, 10535555, 20037634, -2236604, -5697811, -2153926, --9894531, -130460, -7713225, -8533563, 10260140, 1158031, 1399086, -13215614, 13617731, 2695092, --8506183, -2742337, 7001871, 456340, 1504312, -246424, 1125281, 3974992, -6519761, 7614440, -151934, -5370857, -1512902, -9192841, 1410897, -9438191, -8380018, 7211787, 7444789, -7509751, --11927661, 3016678, -5761162, -876173, -3193845, 3989488, -3428995, 5269925, 1673964, 6383395, --1469416, 4763119, 2445447, -10707890, -3758633, 2610803, 1387274, 173409, -5303748, -3001645, --1598265, 3514894, -2059974, -1792612, 139586, 2811593, 2184528, -141734, -168577, -3084324, --1665374, 570157, -738198, -328028, 2500208, 255551, -187905, -2270964, 2157684, 675384, --832687, -454730, -1526324, -306016, -1687922, 2272038, -574989, 1036698, -671089, -5950141, --6492917, 7844758, -2418604, -1865090, 4541391, -6562173, -6891812, 7908109, 10597295, 156229, --647466, 3563212, -9122511, 15533823, -9554155, 1101122, 7441568, -3567507, 6942278, 8364986, -2761664, -8844411, 9496173, -1446330, 3564823, -6941741, -1299228, -13173202, 4515085, -7838316, -3003256, -13557064, 7932805, -9918153, -6914361, 5629092, 7830263, 2609730, 857383, 300648, --8515846, -7917236, -5054640, 20558398, 11280195, -3259880, -19086834, -2710661, 5343476, 11081016, --6300717, 886911, -13201656, -4544613, -1656247, 3415573, 1904281, -2968359, -267362, 5774584, --6553583, -365609, -7466801, 4042638, 4829154, 14220100, 6005438, -6909529, 2899103, -3844533, --10779831, -1352915, 6178311, 890669, 17669496, -10124312, -4980015, 2747705, -9261023, 4723391, -1441498, -1725503, 8959302, 2243584, 3937948, 88047, 292058, -1381906, 4413079, 6648610, -1566053, -1886028, 4827007, -2508261, 1494112, -4545686, -1559610, 18790, -6048925, -74625, --2371896, -1037235, -2367064, -3873524, -1835025, 1373316, 1493038, 1085016, -1296543, -157303, -2632278, -4362613, 431644, 417149, -13570486, -1995012, 2784750, 8011188, 3901978, 10459319, -1907502, -12502650, 7962870, -10576894, -11319386, 316754, -1024887, 8618389, 10716480, 9855339, -14375256, 3517041, -14821395, 16237661, 8883603, -6554120, 12497818, -1608465, 1533840, -10947872, --3779034, -3151432, -4844186, 10478646, -17576080, -3969087, -8249559, -7847979, 1469416, 8490077, --3997541, -10140955, -10750303, -14012331, -14158360, -7192460, -2392297, 6127845, -11108933, -14416058, --8506720, -3622805, -7059316, -4721243, 12593381, -7055021, 1205812, 6684580, -11381126, -6763500, --7662222, 12394739, -5257577, 8077760, 17764522, -1710471, 4006131, 1747515, -5410048, -7113540, --4846871, 8394514, -1222992, 9609452, 603443, 7258495, 1714229, -12169253, 15118285, -6496138, --1899449, -12928388, 7967701, 16992502, 2893734, -2309082, 4532264, 1982127, -10844256, -5055714, -667331, -2554969, -1145146, -4667556, -4559645, -740345, 833224, 694174, 7915625, -897648, -1025423, -3894462, 3021510, 339302, 5953899, 2591476, 2698313, 1137093, -692027, -2538863, --2133525, -3531537, -752693, -2656437, 1797981, 926102, -41339, -1846836, -1559073, -1349694, --525597, 632434, -620086, 3264712, 25151866, 15858093, 11541114, -8339753, -18103824, -4887136, -11023570, -17148730, -9342628, 330712, 13471165, 9654013, 7827578, -9936407, 7499013, -2677375, -7496866, -1966021, 19477140, 11673721, -960462, -17914308, -1842541, 13576392, 11553999, 478889, -23611046, 10676752, -4741107, -11274, 1634235, -2794413, -6589017, -9094593, -1425392, -25530896, -7237557, -8759586, 1218160, -900869, 6671695, 9496710, 244276, 2526515, -11388643, 8116952, --4136054, 16902306, 390842, 2413235, -41176924, -1771674, 10990821, 5671505, 11689827, -4008278, --11527692, 6405944, 2239289, -9446244, 8995809, 1823214, -9052180, 132607, 390842, 3158949, --3324842, -15074798, -15101105, -620086, -5431523, 5064304, 5326833, 2240362, 5669357, -18458158, --6325950, 951335, 4095788, 4457639, -7348689, 5798743, 1354525, -2641405, 1953136, 5231270, --3476239, 703301, -1121523, 2164127, -3536906, -5531918, -1867237, 6581501, -4975183, 702227, --3717831, 2637110, -1538135, 2334852, 3792993, -456340, -3773666, 3089155, -638876, -4412542, --2815888, 1587527, 2040110, 243739, -1784022, 879395, -360240, 2723546, -1286880, 5278515, --1805497, -338766, -17376900, -27957016, 4509179, 9677098, 10051834, 234613, 23232014, -16529719, -5446556, 3175592, -4715337, -14674293, -6182606, -8348880, 9849971, -4332012, -9039296, -14936286, --1385127, -5524939, -2858301, -11268384, 5998459, -715112, -5276904, 6056441, 7714298, 9128953, --11872363, 21665426, 1310502, -3126736, -13320841, -12525735, -2552821, -1655173, -12993887, -13547401, --10397579, 8717173, -6026376, 14463302, 4626217, 24142012, 8279623, 9154723, -3110630, 12936978, --2264522, 3099893, 18344880, -5612986, 6648610, -22091164, -28115392, 6105296, -1340030, -17862232, -1100585, 416075, -24268712, 6801081, -7158100, -4825933, -9486509, 9125195, -8864812, 475668, --991064, 4383551, 10201, -13307419, 7777649, -1945620, 3088618, -16776679, -23128936, -20609938, -1129576, -4911832, -23419382, -4959077, 22472342, 11819213, 5201743, 4257387, -10406706, 313533, --2399813, 975494, -3435974, -2799782, -134218, -285078, 882616, -62277, -7270306, -1775969, -1901060, -1392106, 3484829, 5705327, 4792647, -81068, -818191, -2521683, 7605314, 4359392, -5002563, 4150549, 3061775, -592706, -2911988, -2636036, 5932961, -4625143, 3535832, 4973572, -1946157, 2441152, 398895, 1452773, -4019553, 342524, -1163399, -3464428, 1655173, 4502200, -17013440, 22207666, -609885, 5915244, 14047227, 11515344, -1154273, -28256590, 19372986, -1897839, -5290863, -5753109, 9942312, -688269, -12208981, 3455301, 22258132, 3417183, -14577656, 12876312, -9211094, 6034966, -10961830, 11849815, 8789651, 1059246, 14148159, -5618354, 3795141, 22789634, -16604344, 692027, 5258114, 11207180, -21488258, -4309463, -1371168, -3334505, -18830748, 4853850, -5690295, 1117765, -14606110, -193810, -25002078, 1371705, -17870286, -3498251, 9190156, -7589207, --10824928, -8662412, 5292474, 4399121, -9991168, 3986804, -3618510, 12357158, -6432788, -7212324, -6405944, 11547020, -1131724, 5045513, 4429185, -27272506, -653372, -1990717, -13942001, 1463510, -17747342, 5434208, -5013838, -2178622, 12960601, 9126269, 5649493, -3660386, 20578798, 215285, --17133162, 2302103, 20594368, 10698227, 10449119, 6193343, 1111860, -5087926, -5848135, 3718905, -3339337, 4894652, 7726646, -1924145, 6099391, 3716221, 595390, -1059783, -640487, 2727841, --2798171, -1088237, -2775086, -79994, -1316408, 3003256, -6227703, 1049046, 2109366, 649614, -4734665, -8426189, -3519189, 1399623, 1598802, -867583, 4845260, -1814624, -1625645, -2360622, -545998, 3094524, 3670587, -4711043, 680215, 2130304, -4300336, -2760053, -2381023, 10858214, --24999930, 10623602, -25888990, -30714922, -19870130, 1301912, -16953846, 16509317, -5198521, -20650202, --718870, -5247377, 2784213, 3854196, -4838281, -2660732, 13602698, -4061429, 5177046, -7419019, --7413651, 21684216, -7320235, -2482491, -671089, 4947803, 13340705, -27210228, -1862405, 14588393, -14052596, 13207024, 1721208, -4919348, 27983860, 9512279, 8803609, 10951093, 4952634, -3930432, -173409, 16513612, 5310190, -11636677, 6145562, 30393872, -16061567, 21014202, 7673496, -32036698, -7738994, 21563420, -2359011, 9717900, -139050, -24270324, 12265890, 30292942, 1695975, 20613696, --12475806, 18243410, 15049565, -448824, -2733210, 16751983, 8845485, -21932250, 21966610, -5388574, --5021354, 13378823, -6460168, -7856032, -9805410, 3475702, 1141388, 3710852, -921807, -4400194, -16507707, -14699526, 2546379, -3001645, -4816269, -12002823, -11434277, 6792491, -865436, -7376607, --10200010, -8520678, -14532022, -10282152, -565862, -7103876, -4271345, -1016834, -7528541, 3219078, --6624987, -6803228, -1839320, 1730872, 2432025, -3401077, -414464, -10677289, 4288525, -11201812, -8606578, -2839510, -696322, -4888747, -2665564, -511101, 12885439, 6487011, -1297080, 3105798, -8879308, 4852240, -4823249, -2263985, 3504157, -4363687, 7255811, 1659468, -2751464, -9733470, --17276506, 41490456, 20529406, -48380660, -19943680, 5135171, -8019778, 13976897, 16455093, 17657148, -20198158, -12408697, 38267084, -5759015, 966905, -12525198, 14421426, 19216758, -13847511, -15796353, --3321620, -9097278, 1703491, 7664369, 1187022, -9943923, -3753802, 15758772, -1251446, 7963406, -1928440, 18963354, 28427852, 10781979, -13657996, -32020054, -2677912, -5435818, 3614752, -7410966, -10574746, 17748416, 1617055, -6579353, -14616847, 35007204, 30626874, -4062502, 14962592, -8333311, --11172821, -33723008, 18655728, -15736223, -3610994, -1009317, -10524280, 5906654, 20729122, 3166465, --9123047, 9830106, -4212289, -13922136, 21197274, 4300336, -29335164, 37610492, -25462176, -13650480, -14563160, 14927159, 12528956, 211527, -31333934, -2699387, 2771865, -1823214, -10283225, 6072010, --5368709, 2219424, 3911642, -13015362, 15054934, 10473815, 5058398, 2019708, -6152004, -4570919, --287763, 5305895, 479426, 4092567, -2443837, -10081899, 3063386, -14777372, -4672388, 4699768, --4357245, 8082055, -6839199, -1012539, -5810554, 6439767, 570157, 7920457, 9215389, 6330782, -272730, -6976101, 5067525, 8566849, -1691680, -1002338, -9176734, -4050691, 10659035, -3643743, -7198902, -625455, -4006668, 3777424, 3577708, -220117, -6046240, 11009612, -13350369, 1488743, -19088446, 5660767, -25897580, -20773146, -4972499, 32402308, 3388729, -15560667, -41794328, -11627013, --1897302, 9924059, 28767690, 22038550, -3075734, 273267, 18925774, 15400679, 718870, 4223027, --56398288, -35560180, -17326972, -27866284, 2423435, -15544024, 24958592, -5713380, -1955821, -121870, --10050760, -11476689, 18085034, 11269457, 6401649, -2557116, -8611409, -7713225, 9009768, -20211042, --7572564, 3575560, -7006703, -9842991, 8429947, -29213294, -40877352, 9722195, 12773233, 15865072, --23870354, -12692702, 13218299, 5018670, -39848708, -34999152, 2127083, -16938278, -17521320, 6517613, --32193464, 16337519, -12453258, 13426605, 12884365, -7986492, -18144626, -41929080, -14698989, -12596602, -23536420, -20343112, -13267691, 7176354, 24059870, 14025216, 134755, -8189429, -2694555, 7198902, --7215008, 24314346, -15066208, -11809013, -5706938, -2113124, 6685117, -17911624, 10549513, 8086887, --7503308, -12542378, 2917894, -726923, 12212203, -15664819, -20432770, -5183489, 3233574, -11303817, --1701881, -13669270, 591632, 3334505, -6150930, 9537512, -2569464, -6759205, 2962454, -4568772, -2782602, -3892851, -14200236, -624381, 1042603, 13556527, 10633265, -6525129, 48855, -730681, --8017094, -10256919, 4974646, -2605972, 16578574, 22886270, -3692061, -30660160, 13882408, -4548907, --12843026, -26422102, 7880728, 11391327, -39294120, 14899778, 13943611, 35492536, 3193308, -8806294, -2186675, -43276092, -12596602, -5193153, 561567, 8008504, -14820322, 26643830, 10639171, 32916092, --6595996, 28962576, 18548890, 11494406, 26331370, 13402982, 17376900, 22443352, 979789, -29222958, --27638114, 5697811, 31644246, 22919556, -42161008, -1154809, -7140920, -5870147, -4425427, -29152628, -7481833, -20750598, 18728204, -13863081, 42258720, -11057930, -60625612, -6389301, -20892332, 12115566, -9003325, 17330194, 39346196, 8854075, -5344013, 21606906, -12717398, 44028248, 7401840, 29479044, -13830868, 2748779, -11143293, -10016937, 72156528, 499827, -49803904, -9943386, 39811124, -23718956, -5226439, -10902238, 17481590, 36625332, 21109228, -42098196, -2716567, -41441604, 5776731, -5648956, --24572044, -2823404, -6636798, -10808822, -51540, -21182242, -23331872, 8162049, 8832600, -1073742, --26111790, 18964428, -23133230, -35760436, -15251429, 9017821, -8870181, -15883863, -20550344, 3874061, -8719320, -18568218, -14231374, 7015292, -8236137, -14959908, 12331388, 9922448, -863288, -1781875, -733366, -3338263, -6132140, -6456410, 2426657, -13791677, 8188355, -4853850, 3129421, -17563196, -19862614, 8601746, -41219340, -15463493, -46809236, 7136088, 41261212, -30403000, -28509992, 27263378, -12817793, -46663208, -44222056, 14179298, 2340757, 6492917, 15054934, -1842004, -13276818, -6750615, -28258738, -20231444, 34893924, 5688148, -8170639, 7460358, 20160040, -66035, -6035503, -37338836, --16387448, 4151623, -20010790, 17273284, 25791816, 1869385, 4271345, -26709864, 31865436, -11181410, --14242112, 25995826, -9982041, 63888, -18635326, -1882806, -13100187, -45913736, 15767899, -5132486, -34142304, 43797392, -636192, -7803956, -27747636, -8760123, -7719667, 41678900, -39604432, -27948962, --65650724, 1553168, -27175868, 7553237, 22786948, -12267500, -3419868, 44805100, 28895466, 20443508, -3535832, 2065342, 34000036, -36841692, -1599339, 10486700, -4348655, 20357608, 9764608, 86453400, -13671955, -23593330, -1321776, -16160351, -42596412, -16866336, 1589675, 7254737, -8201777, -8815957, --8061654, -30419642, -380641, -2487860, -16158204, 4329864, 10854456, -26075820, 1714229, -17685064, -6940131, -1188632, -6142877, -3491809, 1520418, 15397995, 8981313, 712428, 17038672, -10439455, --2198487, -4952634, 16037945, 10751914, 7636989, 16508244, 7682086, -11731703, -5632313, -1896228, -8182450, -14766098, -3795677, 511101, -16674137, -5153424, 3046743, 39967356, -29358786, 10187126, --10080288, -14249628, -13894756, 60410864, -8102993, 29662118, -23952496, 41220948, -14300094, 619012, -22200686, 23814520, 56834764, 2729989, 9287867, 8366060, -24148990, 29367376, 9083856, -17220672, -28592672, -11921219, 36013300, 27555974, -8522289, 23985244, 1105417, 22402550, 4494147, 37963752, --23156316, 18978386, -38318088, -9519258, 12867722, 41161356, -1799591, 3412352, 17701170, -33823, --13842680, -49345952, -30565672, 8572218, -21226802, -814433, 15631533, -42968464, 26382910, -1753957, -31374200, -14782204, -29316374, -4968741, 81069656, 18556406, -73726872, 13147969, 18796388, 4758824, -80268640, -4679904, -59086400, 61500712, -20658256, -3779034, 67184024, -7036767, 44205952, 7305203, --39879844, 1889249, 68692096, -55832964, 29460792, -34133716, -38674568, 28916404, 17336636, -35212828, --12924093, -21783538, -11882564, -12636331, 6479495, -21457656, -4380867, 8898098, -22167400, -15715822, -11656004, -25834766, -6252399, 9485972, 3726421, -5734855, 19696720, -8184597, -6503118, -9164923, --17583596, 8910983, -11285027, -12857521, -2964064, 2612414, 26276610, 448824, 7557532, -21226266, -2385854, 28039158, -4991289, -2930242, -2004139, 1730335, 2128693, 19714436, -10024454, -11496017, --5719286, -18080202, -21735218, 6255083, -10706280, 4831302, 7155416, -2831457, -59272160, -4502737, -9341017, -22149684, -6276558, -62209380, 39604968, 60552060, -26386132, 8626442, -45832668, -134351408, --25496536, 6305012, 68467144, 57360900, -55874304, -49930068, -50170048, -41327784, -28981366, 35647692, --5895380, 78442208, 53333292, -15690052, -64530272, -161987920, -104619496, 7413651, 180211456, 137005696, -25395604, -70498664, -176747024, -181269088, -12873091, 105720080, 163697312, 179224160, 18813568, -57812944, --72967736, -97120488, -87207704, 5997922, 60911228, 112878184, 78005736, 62162672, -80438296, -98913096, --115971096, -139978352, 16073915, 168083008, 165907600, 33821256, -59391880, -157364912, -206188496, -69681016, -16271484, 76959912, 188817504, 69573640, -120796, -103770704, -84727896, -35640712, 43162812, 73891688, -129699960, 34027952, 67864776, -5279052, -86502248, -71621800, 4298726, 83715888, 91382408, -41357852, --79054240, -97001840, -24165634, 16066399, 23223426, 15007153, -48373680, -41856068, -17251810, 31224412, -122943, 667867, 7054484, 25016574, 20189568, 15680389, -8432631, -58986008, -39224864, 4601521, -30595736, 56680684, 27466852, -15790984, -37396280, -49383532, -30944702, -19737522, -25875568, 56848188, -59322088, 65154116, 54059680, -24903294, -103533944, -87678000, -47266116, 40143984, 131068984, 127107408, -7181186, -80014704, -125314800, -112710680, -7301982, 62820876, 59038620, 28792388, 25959320, 1650341, --33602212, -40205724, -50968376, -7521562, 47725676, 58698780, -15966541, 28918014, 22234508, -50995756, -556735, 26229366, -21069498, 28992102, -1177358, -5317170, -2079838, 5842766, 22042310, -8664023, -25974888, 17655536, 10581726, 11747272, 8925479, -2257005, -14860050, 24277302, -318901, 14809584, --8828305, 13185013, -4528506, -1902134, 8979703, -12024835, -12657805, 1853278, -5434208, 19648938, -19447076, -17819820, 8906688, -10619844, 12240120, 242666, 8045011, 3038153, 10436771, -12695386, -8816494, -14608794, -6305012, -2041720, -1619203, 11767674, -22232898, -4416300, -9158481, -19836844, --1723893, -7810398, 4771172, 18854370, -5638755, -26197690, 4243428, 16218333, 31729608, -1415192, -2827162, -17111150, -12948253, 14730664, 1374926, -5624797, 479426, 25844966, 11486890, 8135742, -14006962, 23812372, -26989574, 10754061, -4582730, -40346924, -4668093, 31160524, -5753646, 27719182, --1212255, 17201344, -20373714, 12578349, -13850733, -4159139, 27357868, -7894150, 2544768, 536334, --95026, 9953587, -19327, -4132832, -2304250, -796180, -1913408, 4961224, 7856569, 11409044, -1311576, -9845139, -4406100, -12717398, 4774930, -13185013, 7102266, 5351530, -4054986, 7299297, -2342905, -13675176, 213675, -76236, 4335233, -23445690, 8156143, 5124970, 2024540, -702764, --6482180, 7585986, -11853573, 11857868, -962610, -1513976, 3175055, -5789079, 10041097, -11388106, -3120294, 5666673, -18602578, 47546360, 81918984, 7001334, -53594748, 17987324, -4036196, 66428648, -31203474, 65299072, -6147172, -31010200, -8445516, 14497662, 27434640, 21486648, -12107513, 2127083, -11644193, 8481487, 25916370, -18101676, 4362076, -24417962, -3969624, 375810, 6269579, 12771085, -2782602, -10392747, 19841676, -1796907, -17564806, 23981486, -4110821, -8528194, 6340983, -3521873, -18622978, 29777008, 711891, 7809325, -10021769, -6200859, 17184702, 12502113, 14227616, 2869575, --9052717, -18654654, -19214074, -20816096, 16675747, 18391586, 17963700, 26867168, 28713466, 12473122, -1501628, -25042880, 15365782, -2641405, -22793928, 28186260, -2081985, 18554258, 9683004, -28148678, -7787850, -8326868, 6015102, 19123342, 3551938, -23519778, -16756278, -13851270, -24720758, 15097884, --1529545, 26015690, -278636, 4284767, 506806, -13981729, -9044127, 4971962, -21210160, 6448894, --230854, -4076998, 7630547, -11741904, 7159174, 4694400, -964757, -9938554, 13069585, -3272765, -11591580, -19562502, -14445049, -8491150, -7606924, 9283035, -3913252, -2398739, -2508261, -9782862, --5340255, -6004901, 5369, 18176838, 2413235, -4599910, -304406, -10551661, 7688529, -5866926, --1044751, -4017405, 8615704, -741419, 1133871, -1828046, -6256157, -4242891, -28952374, -64612416, -4344360, 89608584, 118366616, 101700528, 70055208, -2914672, 4304094, -51729660, -61686468, -103484552, --78303160, -83074328, -26999776, 7085086, 27022860, 45565844, 112878720, 94036160, 63225140, 20563230, --10024991, -40764072, -30468498, -42386496, -54056460, -29969208, -30943628, -37946036, -17762374, -24944634, -5234492, 17736604, 14780593, 48179332, 44348220, 39479340, 25711284, 29920352, 18719078, 35820564, -8548596, 31002684, 1305133, -8011188, -54050016, -23408646, -65131568, -75568872, -84667224, -66250944, --49894100, -17588428, 12695923, 48693656, 51729124, 40917080, 83977888, 68207840, 72732584, 67517424, -62844500, 25343528, 40615360, -16246788, -40565428, -42363948, -100017440, -99781216, -96569120, -102589048, --84755272, -28858960, -14339822, 22893786, 57223460, 62527744, 76206680, 91983704, 81889992, 63985884, -57964880, 42847668, 15886010, -1489280, -34487512, -50524384, -51147692, -58143656, -48959404, -54687820, --57213260, -48105780, -37660420, -18705656, 2109903, 24988656, 47800840, 44987100, 44140988, 52310016, -57549876, 44773960, 44595720, 20092930, -21121038, -15204184, -37029596, -46794204, -39329552, -32074278, --22808960, -28344636, -20791400, 2631204, 5814849, 10131291, 25145960, 22437982, 13969381, 3660923, -9356586, 9878962, 2691334, 12460237, -7876433, -8296803, -7046968, 4810900, -1621350, 408022, --920197, -1432909, -9473087, -6236293, -2992519, 9042517, -363462, 4274030, 986232, -4624069, --6285148, -2857227, -4555350, 1460826, -666794, 1704565, 460635, 2238752, -2809982, 2257542, --2128693, 613643, 453656, 4232691, -520765, 2398739, -1600412, 1698660, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +565325, -710817, -370978, -846109, -5516886, -5599027, 5360656, 1287417, -3201898, -4889821, +-2353642, -3695283, -6370510, 8149701, 987843, 2952253, 4065187, 11740830, -299574, 1874753, +-2827699, -1044214, -2174864, -7653632, 1708860, -2341831, 756988, 5318780, -2099702, -523449, +1158567, 562104, -1263794, 248034, -7070053, 1466195, -169651, -2538863, 2211908, 1013075, +-4758824, 7509751, 263604, 1077500, 6990060, -2716567, -3019362, -6895033, -3491809, 4756140, +298500, 5069672, -2485712, -5641440, 2451890, -5259188, -2351495, -10147397, 4169340, 3542274, +2161979, 3045669, 6957847, 1796907, -3055869, 3746285, 5778879, -3791383, 2860985, -32212, +-1220845, -1973001, -1557999, 3882114, -789200, 4308926, -2186138, 1720671, -1349694, 1554241, +3149285, -1726040, 1147293, -1198296, 2544768, 2047626, 1743220, -897111, 603443, 46171, +-1419487, 685047, 2486249, 415001, 842887, -1496259, 976568, -828929, 578210, -1155883, +246961, 1439351, -4263292, 1148904, -2638721, -5406827, -526670, -6386617, -7740605, -4894652, +-3707094, -8543764, 345745, -3088082, -1716376, 2624225, 9100499, 829466, -2160369, -1046898, +1464584, -180926, 3781182, 6455336, -544924, 7248831, -833761, -477815, -867583, 4127464, +-5459441, 847182, 662499, -1343788, -310848, -3264175, -5425618, 7451769, -2536178, -557809, +-1328756, 3286187, -3546032, -3055332, 1299228, 1102733, 5207648, -3575024, 4289062, -2509335, +-4294431, -341450, -1774358, 1162326, 2336999, -96637, 3032784, 1439888, 2210835, -2877628, +-3377455, -5599564, -4112431, 521302, 6681896, 840203, 5427228, 1404991, -2794413, 3728032, +1772211, -4035659, 7071127, 1175210, -6658810, 1731409, 3018288, 594853, 2004676, 1728188, +-4717485, 1716376, 1652489, 1159641, -271120, 3469260, 1168231, -892279, -1139240, -27917, +1389422, -43487, 1886564, -62814, 91805, 1084479, -450972, -1038845, -666257, 184147, +-921271, -988379, 1214402, -119185, 1165547, 1020592, -284005, -105227, -7925826, -7044283, +1493575, 792421, 5896990, -4567161, 6066105, -3098282, -1376000, -9556302, -635118, 608812, +-3299609, -598611, 5092221, 4796405, 7220914, -1804423, -1134945, 4485557, 2093797, 4023311, +-9865003, 9699647, -2131915, -180389, 1511292, -1237488, -110595, -921807, -708133, 5994164, +-212601, 7884486, -1402307, -3304441, -6638946, 715112, -3027415, -2676302, 4524748, 3469797, +4732517, 100395, 551903, -7090991, -5110474, -136902, 6361921, 2152316, -864362, 2080375, +-2708514, 6755447, -405338, -5951751, -7515656, -2733210, 8337069, 6265821, 6430103, 2943663, +204548, -7072738, -3171833, -1051730, -4138738, 4261145, -774168, -2022393, 3659849, -10044855, +2955474, -1336272, 2339684, -823023, -2889439, 4495757, 1690607, -4779225, -5060009, 2518462, +-1334661, 2944200, 783832, -2180770, 1529008, 1863479, -104690, 701690, -15569, 191663, +-858457, -38655, -1403381, -8053, -1224066, 1960653, 1071058, -1527935, 744640, -406411, +515933, 512175, 682363, -1140314, -983548, 336618, 729071, -2079301, 1998770, -2255932, +-4347044, -718333, -3367791, 1539746, 5449240, 2134062, 191663, -2223183, -12671227, -8353712, +-275415, 3665755, 4435091, 253403, 893890, -1790465, 4396973, 1946694, 3522410, -5526013, +5233955, 3003793, -5957120, 2228014, 5456756, -302795, 1762010, 885837, 4947803, -3852586, +2935073, -506269, -671626, -4738960, 285615, 5064840, -3237332, -2345589, -4439386, 5945309, +-585726, 1154273, -4670240, -13304735, -3882651, 1950452, 1222455, 4910758, -3543885, -2189360, +-2022930, -892816, -4280472, 129923, -3865471, 8712341, 3061238, 7106561, -7205882, -1422171, +-2992519, 6658810, -2034204, -1232119, -5551245, 3438658, -120796, -3711389, 5666673, 1753957, +686658, 6502581, 1386201, -5708549, -804233, 687195, -1557999, -1929514, 34897, -4849018, +9607305, 3958349, 1390496, 5988258, 2593087, 2364380, 4395362, -1264331, 3718368, -2139968, +634581, 381178, 216359, -1116155, 665720, 284542, -360777, -654446, -629750, 457951, +-499290, 38655, 3181497, 330712, -100932, -57982, -49929, -434329, 2523293, 650151, +3537443, -2817499, 2245194, 212601, -1456531, 6012954, 4573604, -463320, -8202314, -10941966, +-8458938, 3131568, 2147, -4726075, -1237488, 554588, -1080721, 12313671, 2121177, -8896488, +-2370822, -2659122, 442382, -4187593, 6958921, -5204964, -6828461, 6375879, -2687039, 1750736, +1686848, -2916283, -8038568, 1070521, -4287451, -3781719, -3941169, -490700, 6245420, -864899, +-1425392, 9240085, 1687385, 1414655, -11931956, -1331440, 6349573, 7443179, -4126927, 2018635, +1008244, -11766600, -1585380, -723165, -1211181, 2961380, 120796, -6602976, 846645, -5281199, +5046587, -1800128, 6498823, 1294396, -7490423, 3306588, 14011794, -5455682, 105764, -10463077, +2514167, 8785356, -15782931, 2240362, -1142461, -1377074, 3896072, -2556579, -4139275, 7384123, +7047505, -6127845, -768799, 4617090, -2088965, 1077500, 2153926, 1355062, 418222, -1801739, +3913252, -121870, 2546379, 90731, 3491272, 2381023, 2188823, -206695, 724239, 3904125, +386010, -828929, 1340030, 1198833, 426276, 3237869, -1850594, 1012539, 478352, -751082, +192737, 1150514, 773631, 368293, -357556, 10545755, 1312113, 4729296, 7472706, -9213779, +-2827699, -7031399, 3537443, 4080219, 8115341, 15709380, 2473364, -11980811, -1119913, -3011846, +-1242856, -5181341, 19327, -579821, 5938866, 4727686, 1721208, -424665, 237834, -1845225, +-1370632, 6804302, -2219424, -911607, 5085242, -638876, 2996277, -507880, 6472516, -4941897, +-9785009, 12170864, -717260, 2889439, -9159555, 674847, -2786897, 13503914, 2127620, 6112812, +-1278827, 5420786, 3648038, -12222403, -1926830, -6863358, -5900748, 823560, 8613020, 1080721, +-1730872, 13370233, -1416802, -7556458, -5770289, -3954054, 6562173, 20201378, -41876, 5605469, +1449015, -6439767, -1414118, 110595, 5994164, 9183177, 844498, 7380902, 6585259, -12097312, +400506, -2161979, -308164, 6061273, -2705830, 1574642, 2862596, -933082, -6212134, -4313221, +-9073655, 2170032, 3616899, -457951, 1396401, 1334124, 1102733, -111669, -2817499, 595390, +1336809, -161061, 1238024, -1473711, 2416993, -210453, 1214402, -670552, -434865, -1170379, +307090, -629750, 425202, 1995549, 3209414, 2651069, 402116, 690953, 1966021, 1089848, +61740, 1107028, -3595961, -15602006, 3535832, -1578937, 5350456, 3427384, 14518600, 2919504, +-2752000, 3476776, 11107859, 12294881, 5073967, 8657580, 8855686, -6877854, -5345624, -11141682, +-12038793, 1308354, 5182952, -10187126, -7247758, -562104, -11782706, -9769977, 4940823, 1574642, +-5240934, -3494493, -7734699, 6403260, 4674535, 10535555, 20037634, -2236604, -5697811, -2153926, +-9894531, -130460, -7713225, -8533563, 10260140, 1158031, 1399086, -13215614, 13617731, 2695092, +-8506183, -2742337, 7001871, 456340, 1504312, -246424, 1125281, 3974992, -6519761, 7614440, +151934, -5370857, -1512902, -9192841, 1410897, -9438191, -8380018, 7211787, 7444789, -7509751, +-11927661, 3016678, -5761162, -876173, -3193845, 3989488, -3428995, 5269925, 1673964, 6383395, +-1469416, 4763119, 2445447, -10707890, -3758633, 2610803, 1387274, 173409, -5303748, -3001645, +-1598265, 3514894, -2059974, -1792612, 139586, 2811593, 2184528, -141734, -168577, -3084324, +-1665374, 570157, -738198, -328028, 2500208, 255551, -187905, -2270964, 2157684, 675384, +-832687, -454730, -1526324, -306016, -1687922, 2272038, -574989, 1036698, -671089, -5950141, +-6492917, 7844758, -2418604, -1865090, 4541391, -6562173, -6891812, 7908109, 10597295, 156229, +-647466, 3563212, -9122511, 15533823, -9554155, 1101122, 7441568, -3567507, 6942278, 8364986, +2761664, -8844411, 9496173, -1446330, 3564823, -6941741, -1299228, -13173202, 4515085, -7838316, +3003256, -13557064, 7932805, -9918153, -6914361, 5629092, 7830263, 2609730, 857383, 300648, +-8515846, -7917236, -5054640, 20558398, 11280195, -3259880, -19086834, -2710661, 5343476, 11081016, +-6300717, 886911, -13201656, -4544613, -1656247, 3415573, 1904281, -2968359, -267362, 5774584, +-6553583, -365609, -7466801, 4042638, 4829154, 14220100, 6005438, -6909529, 2899103, -3844533, +-10779831, -1352915, 6178311, 890669, 17669496, -10124312, -4980015, 2747705, -9261023, 4723391, +1441498, -1725503, 8959302, 2243584, 3937948, 88047, 292058, -1381906, 4413079, 6648610, +1566053, -1886028, 4827007, -2508261, 1494112, -4545686, -1559610, 18790, -6048925, -74625, +-2371896, -1037235, -2367064, -3873524, -1835025, 1373316, 1493038, 1085016, -1296543, -157303, +2632278, -4362613, 431644, 417149, -13570486, -1995012, 2784750, 8011188, 3901978, 10459319, +1907502, -12502650, 7962870, -10576894, -11319386, 316754, -1024887, 8618389, 10716480, 9855339, +14375256, 3517041, -14821395, 16237661, 8883603, -6554120, 12497818, -1608465, 1533840, -10947872, +-3779034, -3151432, -4844186, 10478646, -17576080, -3969087, -8249559, -7847979, 1469416, 8490077, +-3997541, -10140955, -10750303, -14012331, -14158360, -7192460, -2392297, 6127845, -11108933, -14416058, +-8506720, -3622805, -7059316, -4721243, 12593381, -7055021, 1205812, 6684580, -11381126, -6763500, +-7662222, 12394739, -5257577, 8077760, 17764522, -1710471, 4006131, 1747515, -5410048, -7113540, +-4846871, 8394514, -1222992, 9609452, 603443, 7258495, 1714229, -12169253, 15118285, -6496138, +-1899449, -12928388, 7967701, 16992502, 2893734, -2309082, 4532264, 1982127, -10844256, -5055714, +667331, -2554969, -1145146, -4667556, -4559645, -740345, 833224, 694174, 7915625, -897648, +1025423, -3894462, 3021510, 339302, 5953899, 2591476, 2698313, 1137093, -692027, -2538863, +-2133525, -3531537, -752693, -2656437, 1797981, 926102, -41339, -1846836, -1559073, -1349694, +-525597, 632434, -620086, 3264712, 25151866, 15858093, 11541114, -8339753, -18103824, -4887136, +11023570, -17148730, -9342628, 330712, 13471165, 9654013, 7827578, -9936407, 7499013, -2677375, +7496866, -1966021, 19477140, 11673721, -960462, -17914308, -1842541, 13576392, 11553999, 478889, +23611046, 10676752, -4741107, -11274, 1634235, -2794413, -6589017, -9094593, -1425392, -25530896, +7237557, -8759586, 1218160, -900869, 6671695, 9496710, 244276, 2526515, -11388643, 8116952, +-4136054, 16902306, 390842, 2413235, -41176924, -1771674, 10990821, 5671505, 11689827, -4008278, +-11527692, 6405944, 2239289, -9446244, 8995809, 1823214, -9052180, 132607, 390842, 3158949, +-3324842, -15074798, -15101105, -620086, -5431523, 5064304, 5326833, 2240362, 5669357, -18458158, +-6325950, 951335, 4095788, 4457639, -7348689, 5798743, 1354525, -2641405, 1953136, 5231270, +-3476239, 703301, -1121523, 2164127, -3536906, -5531918, -1867237, 6581501, -4975183, 702227, +-3717831, 2637110, -1538135, 2334852, 3792993, -456340, -3773666, 3089155, -638876, -4412542, +-2815888, 1587527, 2040110, 243739, -1784022, 879395, -360240, 2723546, -1286880, 5278515, +-1805497, -338766, -17376900, -27957016, 4509179, 9677098, 10051834, 234613, 23232014, -16529719, +5446556, 3175592, -4715337, -14674293, -6182606, -8348880, 9849971, -4332012, -9039296, -14936286, +-1385127, -5524939, -2858301, -11268384, 5998459, -715112, -5276904, 6056441, 7714298, 9128953, +-11872363, 21665426, 1310502, -3126736, -13320841, -12525735, -2552821, -1655173, -12993887, -13547401, +-10397579, 8717173, -6026376, 14463302, 4626217, 24142012, 8279623, 9154723, -3110630, 12936978, +-2264522, 3099893, 18344880, -5612986, 6648610, -22091164, -28115392, 6105296, -1340030, -17862232, +1100585, 416075, -24268712, 6801081, -7158100, -4825933, -9486509, 9125195, -8864812, 475668, +-991064, 4383551, 10201, -13307419, 7777649, -1945620, 3088618, -16776679, -23128936, -20609938, +1129576, -4911832, -23419382, -4959077, 22472342, 11819213, 5201743, 4257387, -10406706, 313533, +-2399813, 975494, -3435974, -2799782, -134218, -285078, 882616, -62277, -7270306, -1775969, +1901060, -1392106, 3484829, 5705327, 4792647, -81068, -818191, -2521683, 7605314, 4359392, +5002563, 4150549, 3061775, -592706, -2911988, -2636036, 5932961, -4625143, 3535832, 4973572, +1946157, 2441152, 398895, 1452773, -4019553, 342524, -1163399, -3464428, 1655173, 4502200, +17013440, 22207666, -609885, 5915244, 14047227, 11515344, -1154273, -28256590, 19372986, -1897839, +5290863, -5753109, 9942312, -688269, -12208981, 3455301, 22258132, 3417183, -14577656, 12876312, +9211094, 6034966, -10961830, 11849815, 8789651, 1059246, 14148159, -5618354, 3795141, 22789634, +16604344, 692027, 5258114, 11207180, -21488258, -4309463, -1371168, -3334505, -18830748, 4853850, +5690295, 1117765, -14606110, -193810, -25002078, 1371705, -17870286, -3498251, 9190156, -7589207, +-10824928, -8662412, 5292474, 4399121, -9991168, 3986804, -3618510, 12357158, -6432788, -7212324, +6405944, 11547020, -1131724, 5045513, 4429185, -27272506, -653372, -1990717, -13942001, 1463510, +17747342, 5434208, -5013838, -2178622, 12960601, 9126269, 5649493, -3660386, 20578798, 215285, +-17133162, 2302103, 20594368, 10698227, 10449119, 6193343, 1111860, -5087926, -5848135, 3718905, +3339337, 4894652, 7726646, -1924145, 6099391, 3716221, 595390, -1059783, -640487, 2727841, +-2798171, -1088237, -2775086, -79994, -1316408, 3003256, -6227703, 1049046, 2109366, 649614, +4734665, -8426189, -3519189, 1399623, 1598802, -867583, 4845260, -1814624, -1625645, -2360622, +545998, 3094524, 3670587, -4711043, 680215, 2130304, -4300336, -2760053, -2381023, 10858214, +-24999930, 10623602, -25888990, -30714922, -19870130, 1301912, -16953846, 16509317, -5198521, -20650202, +-718870, -5247377, 2784213, 3854196, -4838281, -2660732, 13602698, -4061429, 5177046, -7419019, +-7413651, 21684216, -7320235, -2482491, -671089, 4947803, 13340705, -27210228, -1862405, 14588393, +14052596, 13207024, 1721208, -4919348, 27983860, 9512279, 8803609, 10951093, 4952634, -3930432, +173409, 16513612, 5310190, -11636677, 6145562, 30393872, -16061567, 21014202, 7673496, -32036698, +7738994, 21563420, -2359011, 9717900, -139050, -24270324, 12265890, 30292942, 1695975, 20613696, +-12475806, 18243410, 15049565, -448824, -2733210, 16751983, 8845485, -21932250, 21966610, -5388574, +-5021354, 13378823, -6460168, -7856032, -9805410, 3475702, 1141388, 3710852, -921807, -4400194, +16507707, -14699526, 2546379, -3001645, -4816269, -12002823, -11434277, 6792491, -865436, -7376607, +-10200010, -8520678, -14532022, -10282152, -565862, -7103876, -4271345, -1016834, -7528541, 3219078, +-6624987, -6803228, -1839320, 1730872, 2432025, -3401077, -414464, -10677289, 4288525, -11201812, +8606578, -2839510, -696322, -4888747, -2665564, -511101, 12885439, 6487011, -1297080, 3105798, +8879308, 4852240, -4823249, -2263985, 3504157, -4363687, 7255811, 1659468, -2751464, -9733470, +-17276506, 41490456, 20529406, -48380660, -19943680, 5135171, -8019778, 13976897, 16455093, 17657148, +20198158, -12408697, 38267084, -5759015, 966905, -12525198, 14421426, 19216758, -13847511, -15796353, +-3321620, -9097278, 1703491, 7664369, 1187022, -9943923, -3753802, 15758772, -1251446, 7963406, +1928440, 18963354, 28427852, 10781979, -13657996, -32020054, -2677912, -5435818, 3614752, -7410966, +10574746, 17748416, 1617055, -6579353, -14616847, 35007204, 30626874, -4062502, 14962592, -8333311, +-11172821, -33723008, 18655728, -15736223, -3610994, -1009317, -10524280, 5906654, 20729122, 3166465, +-9123047, 9830106, -4212289, -13922136, 21197274, 4300336, -29335164, 37610492, -25462176, -13650480, +14563160, 14927159, 12528956, 211527, -31333934, -2699387, 2771865, -1823214, -10283225, 6072010, +-5368709, 2219424, 3911642, -13015362, 15054934, 10473815, 5058398, 2019708, -6152004, -4570919, +-287763, 5305895, 479426, 4092567, -2443837, -10081899, 3063386, -14777372, -4672388, 4699768, +-4357245, 8082055, -6839199, -1012539, -5810554, 6439767, 570157, 7920457, 9215389, 6330782, +272730, -6976101, 5067525, 8566849, -1691680, -1002338, -9176734, -4050691, 10659035, -3643743, +7198902, -625455, -4006668, 3777424, 3577708, -220117, -6046240, 11009612, -13350369, 1488743, +19088446, 5660767, -25897580, -20773146, -4972499, 32402308, 3388729, -15560667, -41794328, -11627013, +-1897302, 9924059, 28767690, 22038550, -3075734, 273267, 18925774, 15400679, 718870, 4223027, +-56398288, -35560180, -17326972, -27866284, 2423435, -15544024, 24958592, -5713380, -1955821, -121870, +-10050760, -11476689, 18085034, 11269457, 6401649, -2557116, -8611409, -7713225, 9009768, -20211042, +-7572564, 3575560, -7006703, -9842991, 8429947, -29213294, -40877352, 9722195, 12773233, 15865072, +-23870354, -12692702, 13218299, 5018670, -39848708, -34999152, 2127083, -16938278, -17521320, 6517613, +-32193464, 16337519, -12453258, 13426605, 12884365, -7986492, -18144626, -41929080, -14698989, -12596602, +23536420, -20343112, -13267691, 7176354, 24059870, 14025216, 134755, -8189429, -2694555, 7198902, +-7215008, 24314346, -15066208, -11809013, -5706938, -2113124, 6685117, -17911624, 10549513, 8086887, +-7503308, -12542378, 2917894, -726923, 12212203, -15664819, -20432770, -5183489, 3233574, -11303817, +-1701881, -13669270, 591632, 3334505, -6150930, 9537512, -2569464, -6759205, 2962454, -4568772, +2782602, -3892851, -14200236, -624381, 1042603, 13556527, 10633265, -6525129, 48855, -730681, +-8017094, -10256919, 4974646, -2605972, 16578574, 22886270, -3692061, -30660160, 13882408, -4548907, +-12843026, -26422102, 7880728, 11391327, -39294120, 14899778, 13943611, 35492536, 3193308, -8806294, +2186675, -43276092, -12596602, -5193153, 561567, 8008504, -14820322, 26643830, 10639171, 32916092, +-6595996, 28962576, 18548890, 11494406, 26331370, 13402982, 17376900, 22443352, 979789, -29222958, +-27638114, 5697811, 31644246, 22919556, -42161008, -1154809, -7140920, -5870147, -4425427, -29152628, +7481833, -20750598, 18728204, -13863081, 42258720, -11057930, -60625612, -6389301, -20892332, 12115566, +9003325, 17330194, 39346196, 8854075, -5344013, 21606906, -12717398, 44028248, 7401840, 29479044, +13830868, 2748779, -11143293, -10016937, 72156528, 499827, -49803904, -9943386, 39811124, -23718956, +5226439, -10902238, 17481590, 36625332, 21109228, -42098196, -2716567, -41441604, 5776731, -5648956, +-24572044, -2823404, -6636798, -10808822, -51540, -21182242, -23331872, 8162049, 8832600, -1073742, +-26111790, 18964428, -23133230, -35760436, -15251429, 9017821, -8870181, -15883863, -20550344, 3874061, +8719320, -18568218, -14231374, 7015292, -8236137, -14959908, 12331388, 9922448, -863288, -1781875, +733366, -3338263, -6132140, -6456410, 2426657, -13791677, 8188355, -4853850, 3129421, -17563196, +19862614, 8601746, -41219340, -15463493, -46809236, 7136088, 41261212, -30403000, -28509992, 27263378, +12817793, -46663208, -44222056, 14179298, 2340757, 6492917, 15054934, -1842004, -13276818, -6750615, +28258738, -20231444, 34893924, 5688148, -8170639, 7460358, 20160040, -66035, -6035503, -37338836, +-16387448, 4151623, -20010790, 17273284, 25791816, 1869385, 4271345, -26709864, 31865436, -11181410, +-14242112, 25995826, -9982041, 63888, -18635326, -1882806, -13100187, -45913736, 15767899, -5132486, +34142304, 43797392, -636192, -7803956, -27747636, -8760123, -7719667, 41678900, -39604432, -27948962, +-65650724, 1553168, -27175868, 7553237, 22786948, -12267500, -3419868, 44805100, 28895466, 20443508, +3535832, 2065342, 34000036, -36841692, -1599339, 10486700, -4348655, 20357608, 9764608, 86453400, +13671955, -23593330, -1321776, -16160351, -42596412, -16866336, 1589675, 7254737, -8201777, -8815957, +-8061654, -30419642, -380641, -2487860, -16158204, 4329864, 10854456, -26075820, 1714229, -17685064, +6940131, -1188632, -6142877, -3491809, 1520418, 15397995, 8981313, 712428, 17038672, -10439455, +-2198487, -4952634, 16037945, 10751914, 7636989, 16508244, 7682086, -11731703, -5632313, -1896228, +8182450, -14766098, -3795677, 511101, -16674137, -5153424, 3046743, 39967356, -29358786, 10187126, +-10080288, -14249628, -13894756, 60410864, -8102993, 29662118, -23952496, 41220948, -14300094, 619012, +22200686, 23814520, 56834764, 2729989, 9287867, 8366060, -24148990, 29367376, 9083856, -17220672, +28592672, -11921219, 36013300, 27555974, -8522289, 23985244, 1105417, 22402550, 4494147, 37963752, +-23156316, 18978386, -38318088, -9519258, 12867722, 41161356, -1799591, 3412352, 17701170, -33823, +-13842680, -49345952, -30565672, 8572218, -21226802, -814433, 15631533, -42968464, 26382910, -1753957, +31374200, -14782204, -29316374, -4968741, 81069656, 18556406, -73726872, 13147969, 18796388, 4758824, +80268640, -4679904, -59086400, 61500712, -20658256, -3779034, 67184024, -7036767, 44205952, 7305203, +-39879844, 1889249, 68692096, -55832964, 29460792, -34133716, -38674568, 28916404, 17336636, -35212828, +-12924093, -21783538, -11882564, -12636331, 6479495, -21457656, -4380867, 8898098, -22167400, -15715822, +11656004, -25834766, -6252399, 9485972, 3726421, -5734855, 19696720, -8184597, -6503118, -9164923, +-17583596, 8910983, -11285027, -12857521, -2964064, 2612414, 26276610, 448824, 7557532, -21226266, +2385854, 28039158, -4991289, -2930242, -2004139, 1730335, 2128693, 19714436, -10024454, -11496017, +-5719286, -18080202, -21735218, 6255083, -10706280, 4831302, 7155416, -2831457, -59272160, -4502737, +9341017, -22149684, -6276558, -62209380, 39604968, 60552060, -26386132, 8626442, -45832668, -134351408, +-25496536, 6305012, 68467144, 57360900, -55874304, -49930068, -50170048, -41327784, -28981366, 35647692, +-5895380, 78442208, 53333292, -15690052, -64530272, -161987920, -104619496, 7413651, 180211456, 137005696, +25395604, -70498664, -176747024, -181269088, -12873091, 105720080, 163697312, 179224160, 18813568, -57812944, +-72967736, -97120488, -87207704, 5997922, 60911228, 112878184, 78005736, 62162672, -80438296, -98913096, +-115971096, -139978352, 16073915, 168083008, 165907600, 33821256, -59391880, -157364912, -206188496, -69681016, +16271484, 76959912, 188817504, 69573640, -120796, -103770704, -84727896, -35640712, 43162812, 73891688, +129699960, 34027952, 67864776, -5279052, -86502248, -71621800, 4298726, 83715888, 91382408, -41357852, +-79054240, -97001840, -24165634, 16066399, 23223426, 15007153, -48373680, -41856068, -17251810, 31224412, +122943, 667867, 7054484, 25016574, 20189568, 15680389, -8432631, -58986008, -39224864, 4601521, +30595736, 56680684, 27466852, -15790984, -37396280, -49383532, -30944702, -19737522, -25875568, 56848188, +59322088, 65154116, 54059680, -24903294, -103533944, -87678000, -47266116, 40143984, 131068984, 127107408, +7181186, -80014704, -125314800, -112710680, -7301982, 62820876, 59038620, 28792388, 25959320, 1650341, +-33602212, -40205724, -50968376, -7521562, 47725676, 58698780, -15966541, 28918014, 22234508, -50995756, +556735, 26229366, -21069498, 28992102, -1177358, -5317170, -2079838, 5842766, 22042310, -8664023, +25974888, 17655536, 10581726, 11747272, 8925479, -2257005, -14860050, 24277302, -318901, 14809584, +-8828305, 13185013, -4528506, -1902134, 8979703, -12024835, -12657805, 1853278, -5434208, 19648938, +19447076, -17819820, 8906688, -10619844, 12240120, 242666, 8045011, 3038153, 10436771, -12695386, +8816494, -14608794, -6305012, -2041720, -1619203, 11767674, -22232898, -4416300, -9158481, -19836844, +-1723893, -7810398, 4771172, 18854370, -5638755, -26197690, 4243428, 16218333, 31729608, -1415192, +2827162, -17111150, -12948253, 14730664, 1374926, -5624797, 479426, 25844966, 11486890, 8135742, +14006962, 23812372, -26989574, 10754061, -4582730, -40346924, -4668093, 31160524, -5753646, 27719182, +-1212255, 17201344, -20373714, 12578349, -13850733, -4159139, 27357868, -7894150, 2544768, 536334, +-95026, 9953587, -19327, -4132832, -2304250, -796180, -1913408, 4961224, 7856569, 11409044, +1311576, -9845139, -4406100, -12717398, 4774930, -13185013, 7102266, 5351530, -4054986, 7299297, +2342905, -13675176, 213675, -76236, 4335233, -23445690, 8156143, 5124970, 2024540, -702764, +-6482180, 7585986, -11853573, 11857868, -962610, -1513976, 3175055, -5789079, 10041097, -11388106, +3120294, 5666673, -18602578, 47546360, 81918984, 7001334, -53594748, 17987324, -4036196, 66428648, +31203474, 65299072, -6147172, -31010200, -8445516, 14497662, 27434640, 21486648, -12107513, 2127083, +11644193, 8481487, 25916370, -18101676, 4362076, -24417962, -3969624, 375810, 6269579, 12771085, +2782602, -10392747, 19841676, -1796907, -17564806, 23981486, -4110821, -8528194, 6340983, -3521873, +18622978, 29777008, 711891, 7809325, -10021769, -6200859, 17184702, 12502113, 14227616, 2869575, +-9052717, -18654654, -19214074, -20816096, 16675747, 18391586, 17963700, 26867168, 28713466, 12473122, +1501628, -25042880, 15365782, -2641405, -22793928, 28186260, -2081985, 18554258, 9683004, -28148678, +7787850, -8326868, 6015102, 19123342, 3551938, -23519778, -16756278, -13851270, -24720758, 15097884, +-1529545, 26015690, -278636, 4284767, 506806, -13981729, -9044127, 4971962, -21210160, 6448894, +-230854, -4076998, 7630547, -11741904, 7159174, 4694400, -964757, -9938554, 13069585, -3272765, +11591580, -19562502, -14445049, -8491150, -7606924, 9283035, -3913252, -2398739, -2508261, -9782862, +-5340255, -6004901, 5369, 18176838, 2413235, -4599910, -304406, -10551661, 7688529, -5866926, +-1044751, -4017405, 8615704, -741419, 1133871, -1828046, -6256157, -4242891, -28952374, -64612416, +4344360, 89608584, 118366616, 101700528, 70055208, -2914672, 4304094, -51729660, -61686468, -103484552, +-78303160, -83074328, -26999776, 7085086, 27022860, 45565844, 112878720, 94036160, 63225140, 20563230, +-10024991, -40764072, -30468498, -42386496, -54056460, -29969208, -30943628, -37946036, -17762374, -24944634, +5234492, 17736604, 14780593, 48179332, 44348220, 39479340, 25711284, 29920352, 18719078, 35820564, +8548596, 31002684, 1305133, -8011188, -54050016, -23408646, -65131568, -75568872, -84667224, -66250944, +-49894100, -17588428, 12695923, 48693656, 51729124, 40917080, 83977888, 68207840, 72732584, 67517424, +62844500, 25343528, 40615360, -16246788, -40565428, -42363948, -100017440, -99781216, -96569120, -102589048, +-84755272, -28858960, -14339822, 22893786, 57223460, 62527744, 76206680, 91983704, 81889992, 63985884, +57964880, 42847668, 15886010, -1489280, -34487512, -50524384, -51147692, -58143656, -48959404, -54687820, +-57213260, -48105780, -37660420, -18705656, 2109903, 24988656, 47800840, 44987100, 44140988, 52310016, +57549876, 44773960, 44595720, 20092930, -21121038, -15204184, -37029596, -46794204, -39329552, -32074278, +-22808960, -28344636, -20791400, 2631204, 5814849, 10131291, 25145960, 22437982, 13969381, 3660923, +9356586, 9878962, 2691334, 12460237, -7876433, -8296803, -7046968, 4810900, -1621350, 408022, +-920197, -1432909, -9473087, -6236293, -2992519, 9042517, -363462, 4274030, 986232, -4624069, +-6285148, -2857227, -4555350, 1460826, -666794, 1704565, 460635, 2238752, -2809982, 2257542, +-2128693, 613643, 453656, 4232691, -520765, 2398739, -1600412, 1698660, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, { { 10392210, -5522254, -621697, 3624953, 906775, 827318, -11378442, -4951561, -5636071, 4433480, -609885, --3697430, 4030827, 4161287, 273267, 3995393, -1669132, -137439, -234613, -2466922, -1284195, --5468567, 2826089, -8085276, 3376381, -4217658, 3442416, 6427956, 2934537, -1225139, -1817845, -4749697, -766115, 219580, 4495757, -4817343, -140660, -1630477, -2774012, 588947, -674847, -994822, 4607963, 7593502, -2413235, 135828, 6307160, 478352, 1658931, -2324114, -3534758, --520765, 1059783, -5959267, -1564442, 3112778, 404801, 1123671, 1848983, -856309, -1862405, --1762547, -2088965, 2303713, 1887638, -1099512, -3414499, -4198868, 2074469, 36507, -3484829, -3675955, -803159, -245350, 560493, 1037235, -1738925, 2198487, -2341294, -792421, 2876554, --1988033, 1146219, -3364570, -2572686, -1239635, -833224, -216359, 454730, -1357747, -1698660, --171799, -967441, 378494, -358630, -309238, -463320, 358093, 99858, -357019, -693637, --419833, -258235, -65498, -375810, -242129, -530428, 484794, -777389, -482647, -3735011, --1026497, 29528, -3537979, -3579318, -2147484, 8588861, -6032819, -2480344, -4212826, -7670812, -2864743, 1315334, 298500, 6585259, 6234682, 6248104, 2017561, -1168768, 966368, 4709969, --2014877, 2031520, 2379412, -5556614, 7911867, 1534914, 2460480, 5851356, -2251100, -5838471, -393526, 3965329, -2795487, -1268089, -3726958, 3946538, -102542, -402116, -6477348, -280784, --788127, 3987877, 2035815, -3551938, 7084012, 2614561, 1473174, 2481954, -1156957, 3972308, --1548873, 195958, -4946192, -5907191, 4734128, 3708168, 6558952, 640487, 1768453, -5080947, --7865696, -3861176, -2361158, -2291365, -3635153, -3130494, 1619740, -911070, 2384781, -2952790, --1132798, 1296006, 1466195, -887985, 4000762, 1215476, -3007551, 6041409, -2371359, 1858110, -7621957, 1625645, 1044214, -2364380, 104690, -2596308, -3103114, -500364, 1752884, -35970, -223875, 94489, -842350, -270046, 74625, -762357, 1786170, 1145146, -670552, -165356, -49929, 468688, 251792, -1188632, -643171, -286689, 130460, 528818, -554588, -855235, -733903, -440234, 562641, -306553, -474594, -594853, -7397545, -6890738, 4037806, 923418, -5655935, -8740795, -1234803, -3472481, 938450, 10416906, 5942624, -9100499, 3445101, 869731, --3796751, -4218195, -5163625, -8378408, 299037, 1012002, -3108483, 1497333, -1791538, 328565, -2529199, 1962263, 5405753, -4719632, 8511015, -5179731, 4942971, 3930432, -3186866, 2304250, -413391, 3547106, -1415192, 1859184, 3246459, 1095217, 506269, -1288490, 2530810, 771484, --1128503, 6067178, -7913477, 557809, -4792647, 9545565, 3368865, -8307004, 3237332, 10912438, --10240276, -4869956, 1237488, -826781, -3880503, 3263638, -1356673, 7271917, -6100464, -593242, --2014340, -408559, -365072, 7027640, -6501507, -2147484, -700080, -6708202, 3629784, 2815351, -7256347, 2964064, 6179384, 5575942, 922344, -2234457, 1755031, -185220, -766652, -1662689, --151398, -2552284, -1016834, -568546, -3579855, 2290291, 199179, -2493229, -415001, -2019708, -197569, -78383, 1389422, -474594, -802085, 179852, -1145146, -31675, 1200980, 447213, --251792, -802085, 3296388, -5092758, 646929, -3200288, 3375308, 1202591, -5126044, 14813342, --9423695, 2960843, 16047072, -11346767, 5281199, -311385, 5247913, -1407676, -9698573, -2138357, -8009041, 7163469, 1985886, -83752, 4054986, 1973001, 146566, 3340948, 3372086, -2800319, -4296578, -1207423, 6772090, -5470715, -8420820, 1783485, -7351374, 2523830, 137976, -2116345, --2353105, -3370476, -5003100, 958315, 1763621, 165356, 1272384, 1444183, -3084860, -6468221, -5076115, 1124745, 832687, -328028, 7459285, 1489817, 3123515, 7870528, -4842039, 1898912, -315143, 2367601, 5519033, 4314832, -7193534, -6312528, -1625108, -3610994, -828929, 247497, --3098282, 1636383, -5752572, 273267, -5535139, 2728378, 2709588, -3211562, -4210679, 461709, -2310156, 423054, -4866735, 680752, -2786360, 2087891, 1733556, 775242, -913217, -1369021, -967441, -144418, -523986, -34360, -1255204, -1057636, -3339874, -828929, 3043521, 1330903, --873489, -605590, 2124935, -732292, 638340, -942208, 38118, -236760, 113817, -1210107, --803696, -461709, -345745, -436476, -503585, 101469, -332323, -763967, -627065, 402653, -4677220, -1999844, 4235375, -798864, 2111513, -2433636, 289910, -1598265, 1406602, -769336, --9246528, 7022272, 4505958, 11582453, -7600482, 4742718, -9403294, -1615982, 5735929, 6206765, --6599754, 1888175, -7645579, 564788, -8964670, 2935610, -6715718, -8334384, -7456600, 3742527, --6024766, 259309, -7065758, 916976, 1037772, -1066763, -5172751, 3245922, 4540318, 2703145, -2114198, -5530308, 3007014, -5799817, -1833951, 3555696, 114890, -806380, -1561758, -226560, -3678103, -4279398, -8246337, -1745904, 2537789, -1745367, -6114423, -6185290, -8768713, 2093260, --2529199, -8213051, 5869610, -5265630, -5160403, 9916543, -3586298, -1962800, 811212, -1802276, --3236258, 796180, -5443871, -2702608, -4580046, -3617436, -1503239, 2949569, 7511361, 375273, -4514548, 370441, 3368865, 2333778, 6068252, -450972, -136365, 615791, 2243584, -1245004, -259846, -605054, 4437775, -185220, 2143726, 307627, 855235, -772557, 992137, -2736968, -2974802, 54224, 59056, -2241973, -564788, -3023657, 1427540, -1555315, 1022739, -424665, -3001109, -1482838, 594316, -2636036, -2096481, -218506, -911607, 704912, 7662222, -11038066, -1987496, 9656160, -3582003, 10575283, 2946348, 666794, -3067144, -7385733, -4858682, 12589623, --6763500, -59056, -2337536, 983548, 7577933, 6807523, -4125853, 9834401, 9819906, -4629975, --2421288, 5980742, -5053566, -4424353, -317291, -6795712, -153008, -2006287, 876710, 11798812, -4028143, 636192, -5408975, -15696495, -1912871, 8818105, 2164664, -5883569, 4512400, 7167764, -6263136, 7573101, -12403329, 2506114, 602906, -6156299, 3337190, -5541045, 3946001, -3126736, -4894115, 11000485, 14541149, 9177271, 4217121, -6033356, -1664837, -7201050, -7568806, -1594507, -8526047, 2096481, 134218, 2006287, -8345659, 2167348, 1038308, -76773, -4224101, 2259690, -4567161, -4829154, -9100499, 20725364, 2677912, -3713536, 1278827, 2230162, 9443559, -1902671, -2598455, 3218541, 4687420, -3262028, -1599339, -3521873, 1672353, -976031, 1844152, 1718524, --1223529, -1928440, 3514894, 467615, 929324, -671089, 2124398, -3646964, -2601140, -1755568, --646929, 4050691, 1491964, 2707977, 2066953, 2122788, 150324, 470299, -901943, -2555506, -2498597, 601832, 1056562, -1781338, -5709622, -1603633, -3503083, -1331977, 2653753, -3595425, -16345572, -1606318, 4605279, 11740830, 1534377, -1739462, -7679402, 4325569, -4147865, -5170604, --15518254, -6922414, 3117073, -805843, -3007014, -11180874, 3907883, 6199249, -8824010, -4583267, --2374580, -9203578, 3673271, 686121, -4889284, -3980361, -1687922, -12443057, -4451734, 6219650, -10365904, -7819525, -9823664, -2812667, -579821, -7936563, -6560563, 2538863, 4364224, -8696772, -17497696, 131533, 7113003, -3935264, 6683506, -4480188, 2010582, -12372727, -2621004, 5124433, --12430172, 3467112, -2812667, -6271726, -14114336, -251256, 7825968, 178778, -14887430, -2181844, -2702071, 6056441, 10912975, -3946538, 4881231, 12824772, 4252555, 1634772, -5806259, -1022202, --3624953, 839129, -4319664, 1072668, -8154533, -993748, 6239514, 1872606, 1209570, -3456912, --6323266, 3601867, -1171989, 3715684, -1349157, 570694, -824097, -1727651, -1684701, 2451353, -912144, -369904, -837519, 179315, -2458869, 1253057, -2510945, -3029563, -1975685, 1211718, -147103, 120259, -2370285, 1968169, -299037, -1114007, -3349001, -942745, 208843, 554051, -1357210, 3671123, 1127966, 940061, 1791001, 4835060, -1583769, -4825933, 5883032, 1079111, --9099962, -14207215, -11664057, -14704894, 12655658, -7672959, -1937567, 4207458, -13989245, -5749888, --9747428, -4282083, -3149822, 6350646, -12265353, -6480032, 3840238, 4878546, 6993818, -69256, -181999, -2140504, -78920, -2830384, 1692754, -9647570, -5268851, -8479876, 5855651, 2975876, -4522601, 5977521, -11837467, -809601, -1329292, 10755672, -4087735, 3412889, 5776731, -2157684, -6189048, -4055523, 6907381, 9814000, -3882651, -637266, 8327942, -7135015, 11538967, -4931696, --18510236, 2903935, 9494025, -3615289, 1039382, -284542, 7269769, 9222905, -9383967, -4031364, -2117956, 6359773, -11027329, -8295193, -6719477, 13318694, -375273, -15211164, -3366718, -6313065, -5149129, 712965, 3874597, -5696201, 9361955, 425202, 1629940, 2741263, -8771397, -2942053, -591632, -1067836, -2252174, -2511482, 2382096, -2391760, -2410551, 1866163, 2723009, 1448478, --5175973, -440234, -2097018, -1475321, 2067490, 1906966, 4244502, -571768, -2169495, 1665374, --4863514, -549219, -92342, -3119757, 375810, 314069, -1243393, 615254, -5520644, -978179, --708133, 633508, 648003, 2311766, -340913, 2593624, 1415729, 1344325, 125628, -8558796, --3464428, 5878737, 2176475, 8422431, 2888903, 4120484, -16540993, -6481643, 6454262, -4357781, --3120831, -5510980, 1694365, 8617852, 2260764, 2053531, -11082089, -3747896, -2022930, 4108136, -9731322, -11819750, 5572183, -9635222, -2562485, -8863739, 1137093, 1227824, -452045, 3702262, --8276402, -2384781, -7756174, -3189550, 139050, -358630, -9740449, 5581847, 6250788, -2330020, -7417946, 14590541, 1494649, 11052025, 14175003, 1114544, 456877, 3418794, -2982318, 4698158, -959388, -3104725, -4780299, 17806398, -1854352, 10405095, 4599910, -5251672, -6096169, -4244502, -4973572, -4069482, 6464463, 15683610, 7947300, -2085744, 249645, -13155485, -9067213, -8026757, -12341589, 19376208, -8511015, -78383, -7875360, -1301912, 11845520, -3752191, -726386, -18698140, --2507187, -3411278, -1989644, 7089381, 496069, 1467805, 2154463, -3758633, 2968896, 1578401, -2644626, -2247879, 3836480, -1858647, -435402, -4745402, -1129576, 4111358, -1529545, -134218, --817654, 3946001, -1016834, -2881923, 1663226, 1745367, 995896, 1370632, 1446867, -1568737, -387621, 2779381, 4824322, 4175782, 2703682, 1454383, 285078, 351114, -3033321, -290447, -1896765, -1871532, 1998234, -700617, 685584, 2609193, -1150514, 11188927, 31024160, 13522168, --4216584, -1076963, -5763846, 14298483, -14324790, -8140574, -21900576, -252329, 10799158, 13434658, -2419677, -5334350, -13129715, -9608379, 9675488, -1966558, 15367393, -46171, -4935991, 7250979, -2642479, -134218, -3821984, 10029286, -1865626, 8663486, -138513, -4727686, 18906446, -4525822, -7668127, 18582176, 6534256, -789200, -9085466, -1716376, -14798310, -17340930, 3773129, 11096585, --2666101, 1549946, -18923090, -7201587, 10959146, 5931350, -4905927, 3615289, -5615670, -2732136, --8631274, -14511621, 872952, -3433290, -10244034, -16748762, -14438606, -4712653, -13263396, 6088653, --5940477, 2089502, 1712618, -116501, 315680, -2163053, -2974265, 8569533, 17062832, -11521787, -2081449, -4853313, 6168110, -6440841, -256624, -4656819, -2098092, 15682536, 11409044, 2551748, --1770063, 137976, -6424198, 2198487, 6393596, -1239635, -5556614, -3195993, 5535676, -6732361, -611496, 2837363, 2683281, -2383707, -2143726, 2375117, 3016141, -2336462, 3592740, 2051921, -2979634, -345745, 3934727, -447213, 2488397, 1196148, 1463510, 875636, -870268, 4598836, --4552129, -707059, 991064, -1400159, -1158031, -2176475, 2059974, 149250, -3925063, -1511292, -2561948, -2858301, -12782360, -14460081, 3753802, 5553393, 17353816, -14662481, 4687957, 4510790, --24423332, -1123134, 182536, -20402706, -11110007, -7208029, 5222144, -1619203, 1249299, -5746666, -8617315, 13543642, 7148436, -1907502, -20707112, -9010305, -11247982, 4225174, 1293322, -9074729, --682900, 7158100, -6010807, 12354473, -11093364, -311385, -6456947, -20699594, 3558917, -8800925, --9921911, 7734163, 11467563, -12821551, 4992363, 15171972, -4926328, 6658810, 5219996, -3534221, -2085744, -16804060, 25485262, 10043244, 6051072, 24338506, -29659970, -2207076, -4088272, 3167002, -12130598, 12599287, 4850092, 6017786, 15569256, -1467268, -10554345, -18343806, 7124277, -6928856, -699543, 4981625, -3658775, 7518877, 19937776, -12281996, 9296994, -5948530, -5701032, 15079630, -1147830, 4710506, 14619532, 12072079, -5304822, -6099928, -12861280, -3237869, 63888, 6714108, -7032472, 25233, 1667521, 1020055, -257698, 1411971, 1616518, 551903, 3969087, -1975148, -592706, 2867428, 1582159, 843424, -1787780, 3855807, 2499671, 595927, -2197413, -3064459, --7295539, 4365298, -300111, -647466, 2197413, -3484292, -430570, 2449742, 3333968, 5054640, -2823941, 1405528, 1377611, -31675, 3642669, 15959562, 18682034, 4722854, 11509439, -7474854, -5399311, 5340792, -30771830, 8739185, 9921374, 2146410, -9830106, -179852, -19006304, 22367652, -13410499, -6964290, -7545184, -11044508, -5829881, 16203838, -16381005, -9309878, -2484102, -2670933, --3555159, 2413235, -10855530, -10982768, -6535867, -8442832, -2327872, -10999411, -1551020, -7356742, --24317568, -15431281, -6017249, -3780645, 3380139, 4139812, -146566, 796716, 7031399, 3473555, -3599183, 17192218, 3571802, 5872831, 10672457, 23066122, 19641422, 1135482, -7761006, -14969572, -13733695, -3269544, 37093484, 7594576, 16639777, -1702955, 2135673, -14618995, -563178, 12982612, -7462506, 9872519, -11106785, -7239168, -14278619, -27031988, 15714212, -23839216, -2888366, 31737660, -2151242, 12801150, 6081674, 9454297, 332323, -16924318, 16644609, -140660, -14932528, -13265543, -551903, 5371931, 11223286, 3146064, -13077102, 845572, -2540473, 2823941, -5103495, -4149475, -2401424, 2280628, -3994857, 564788, -1234266, -206158, -5280663, -1795833, -1624035, 2668249, --1338956, -3106335, 4396973, -2469606, -957778, -7415261, -7951595, 206695, 296890, -3133716, --2001455, 2829310, 2088965, -3181497, -5271536, -134755, 3604015, -22033720, 6556268, 8189966, --14646375, -11459510, 302258, 8992588, 21531744, -1176821, -16472810, -16777216, -806917, -9528922, -2871186, 2961917, -18401788, -16016470, -30109868, -8997420, -8685498, -20628728, -13856101, -219043, --9489730, -6086506, -5344550, -1763621, -20244328, -10982231, -12422119, -6267431, 6318971, -17360258, -1348083, 14296872, 17174500, -4101694, 4736812, 9709847, -16886200, 9488656, -7285875, 14977088, --7242926, 1289564, -7810398, -1796370, 29952028, -6231461, 11301133, -21941378, -3574487, -98784, --20698522, 19277424, 777926, -7175280, 13931800, -5775121, 3608310, 27377196, -10862509, -15115064, -10382010, -2948495, -30819612, 12457553, -40867152, -22031034, 16432545, 12728136, 2653216, 8591008, -71941, -297427, -30827664, -16663399, -7245073, 2743410, -17514876, 4238596, 2451890, 7156490, --11432666, 605590, 8864812, 6645925, 5103495, 510564, 4202089, -10125385, -6416681, -6860674, --1884954, -1477469, -882079, 8021389, -4153770, 4168803, 8099772, -4069482, 2506114, -6524056, --4898410, -392990, 2087354, -5873368, 2537789, -7340636, 6358162, -2646237, -1277753, 181462, -5703717, -1894618, 2277943, -5189394, 4565550, 3362960, 10537165, 2383170, 8653822, -8647380, --2870112, -10269804, -5290863, -5088463, 41455024, 22702124, 32212, -21343304, 10965052, -22256520, --18108118, 3293703, 18411988, 36403068, -5731634, 18405546, -6585259, 13065827, 22059488, 12342125, -14096620, 7565585, -4139812, -18056042, -18693846, -5653251, -17667884, -5193153, -3253975, -3973382, -14105209, -2404108, -36287104, 2130304, 8735963, 8380555, 21681532, -2238752, -43305080, 24617678, --19390704, 6338835, -4259534, 14565845, 21189222, -23602456, -1676648, -11793443, -20605106, 14898705, --10261751, -25345676, 9919764, 14803679, 24335822, 6452115, -3828963, 2664490, 19916838, -16052440, -31457414, -9900436, -8808978, -2834679, 19154480, -19963008, 1802813, 2435783, -55599964, -8240969, -17162690, -8000987, 2845953, 7714835, 3995393, -2728378, 4482335, 19055160, 22721450, -18025978, -6460168, -13205951, -2294586, 22526030, -523986, -2348273, 788127, -1526861, -11724724, 3213173, -734976, -6823630, -17345762, 227096, -4182225, 5282810, -8039105, -7474317, -9449465, 7959112, -1787780, 4876936, 3871913, 325344, 2843268, -3839164, -7978439, 12108050, -1274532, -5879810, --243739, -4241280, -2710661, -4896263, 561030, 1484448, -773631, 3349001, 8764418, -341987, --2211371, -3615289, 738734, -4494147, -2608656, 5037997, -3929895, -3227668, -4796405, -11689827, --6605660, 1611150, 7490960, -6149320, -1620813, 23759222, 15761456, -44174276, -25113748, 30255360, -35066260, -18848464, -6386617, -49708340, -27475442, 7159711, -2254858, 6610492, -26422638, -16558173, --18108656, 26825292, 39862128, -1940788, 10762114, -6491306, -3491272, -508954, 9155797, 17271138, -4204773, -6154688, -3304977, -4059818, -23810762, -13509283, -24207510, -3224984, 7485055, -10183904, -14939507, -11068668, -4140885, 23173496, -11233487, 13019656, 9057012, -4259534, -22323630, -16172699, --13307419, 4012573, 41748692, 7336878, 22450868, 26443040, 20712480, 15316390, 13727252, -23044110, -557272, -3783866, 30906048, 14667850, 18079128, 32246078, -15833397, -21718576, 7973070, 27270358, --46231028, -850940, 3696356, 21490406, -37384468, -56369300, -10014790, 15775952, 3955128, 6372121, -17681306, 1113470, -12483859, -18513994, 629750, 2525978, 3675418, 17046726, 25308632, 11949136, -1895154, 75162, -257161, 2072322, 2562485, -6398428, 9350144, 1152125, -8513162, -15032922, -1881196, -6413997, 3245385, 1628866, -1334661, 943282, -6201933, 6460168, -3319473, 4334696, --6669011, -4336307, -11913702, -11782706, 580894, 6192806, -5259725, 12406013, 354872, 3690988, --3721052, 13260175, 1130650, 6075231, -6542846, -3592203, -2071785, -8256538, -1600412, 8939438, --15462419, 11917997, -596464, -11344619, -20089710, 7569880, -9793062, -19589882, 14097156, 27195196, -8301635, -10292352, 16095390, 27361626, 10059887, 5752035, 1898912, -2889439, 12796318, -22608708, -1321776, -32577326, 17467096, -26257282, -2249489, 14390825, 7828115, -14896020, 3157338, -17259326, -35744864, 4825933, 11580306, 18846854, 39439076, -16088411, 12796318, -18672908, 6804302, 14410689, -31707596, 7711077, -6462852, 32742146, 4380867, -2047089, -18720152, 1480153, 20369956, -6652368, -19581292, -23859618, 37152540, 38789996, -46324980, -949725, -2922725, 10384157, -7890929, -5810554, -19931870, -16546362, -49412524, 863288, 43948788, -34395172, 17418240, -7738994, -4385699, -20841328, -48520244, -2856690, 8043937, 4738960, -32610076, 42531988, 3323231, 37859064, -74320648, 7368554, --6967511, -22133040, -5995775, 13345000, -17284560, 11923366, -15574625, -10101763, -20505784, 26207890, --9925669, 2060511, -21864604, 1236414, -16052977, -5199595, 7510824, -10808822, 5219996, 979253, --14808510, 13704167, -6047314, 2209761, -6309844, 12466679, -9116605, 2202245, 891206, -3102577, -16174847, -9028021, -11249593, -6249715, -12612171, -17340394, -8805757, 1996623, 1151588, -12404402, --7154879, -8236137, -12230456, -9430138, 4307852, 3156801, -322659, 31423592, 3623879, -23854786, -2324651, -48631376, -11252814, 2573222, -9577777, -38744364, -4443144, -25395604, -6479495, 23511188, -5282273, 30788474, 12581570, 11690364, 7039452, -10356777, 24448028, -12377022, -411243, 11735461, -5184563, -14969035, 12046846, 5113696, 28954522, 12102144, -5416491, 17726940, -14194330, 23897198, -7969312, -26008174, -27096948, 14028437, 17266842, 7389491, 2630668, -12566001, -17427904, 5389647, --17155174, -25451440, -8080981, -4191351, -23746874, -8613020, 8559333, -15958488, -26758184, 7614977, -9582609, 1063541, -3504157, -1409286, -4762582, 9658845, 44889924, 9344775, -1739999, -1575179, --16224776, -25622702, -11704860, 37314140, 39652212, 20608864, 3513283, 36392868, 17147120, -8051453, --50709068, -38298760, -31942208, -60081760, -35391604, 8677445, 48642116, -21529598, 16255914, -24089934, -7627862, -1827509, 16510391, -7698729, -3147137, -21474836, -12730820, -5105106, -19609746, 24811490, --4160213, -12663711, -6416145, 2726767, -14281840, 10199474, 7051263, 16135655, 3339874, 4707284, --16000364, -18096844, -2454574, -13309030, -8860518, -15546171, -23046258, 1415729, -6273337, 1647120, -1299228, 17631378, 17052094, -6250788, -3804804, -7474317, 16457778, 11368242, 6960532, 2846490, --3774203, 9842454, -13647795, -5070746, -2519535, -14995878, -29844118, 15709380, -903017, -9256728, --4327180, 11241540, 20809654, -8856759, 26845156, -30748208, 24797530, -3078955, 33138358, -21462488, -19086298, -31688268, 27536110, -25590488, -10979547, 38607996, 8742406, 31031676, 44069048, 4640176, --3712999, -18345416, -1623498, 28175522, 6924024, -9837623, -31235686, 2772938, 5998996, 14811732, -8836358, 12355010, 7494718, -18010946, -29070486, -12142946, 27879706, 10874857, 89247808, -28248536, --24012088, 29298120, 45759120, 9785009, -907312, 12234214, 2916820, 14903537, -13605383, 5497558, -21339008, 23886998, 15714212, 69562904, -8913131, -8756901, -4610648, 36002028, 21299816, -17926120, -18656802, -164819, 6026913, -14702747, 31681290, -31439698, 2128156, 49242872, -36148592, 105441448, --48360260, 50614044, 46093052, -45030584, -41500660, 47106128, 1951526, -26674968, -11483132, 26190710, --71077416, 11497091, -8406862, -45336064, 29875256, -35396972, 2793876, 3105798, -14466524, -34901976, -9557913, -2261837, -1618666, 7305203, -7329362, -11155104, 6315213, 15366319, -5650567, 2806224, -11512123, -10246718, 16031502, 12949863, -25584046, 4266513, -14373108, 7132867, -1023276, 2709051, --13089987, 6082211, 3422015, 591095, -6563247, 20447802, 4465692, -23622, 18881214, -12627741, --12181064, 2760590, 8159364, 2802466, 9092983, 5477157, -26304528, -12828530, 6803765, -14626511, -22668838, -8334921, 17365626, 23416698, -54388244, -22512608, 32749126, -69270304, -43543988, -28705950, -48386564, 104359656, 28368796, -81051400, -18752364, -82812336, -43826920, 68365144, 40215928, 64305324, -34746824, -47802988, -76973864, -57917096, -14361834, 35061964, 38951060, 24137180, 12911745, -19762218, --84104048, -100249368, -22148610, 77622944, 137204880, 93750544, -17912162, -64039572, -92938264, -68208912, --55897924, 536871, 21867826, 75608064, 79867064, -42942692, -27513024, -100368016, -94087704, -33239826, -8920647, 97843112, 143433648, 64282776, -42763916, -150174064, -112003624, -81438488, 39250632, 86288040, -53218404, 34382824, 28488518, -89395448, -16840566, -50761680, 18729278, -6604586, 52916680, 84186728, -66115116, -77612744, -157918432, -117950000, 12825309, 92641368, -2596845, 128265976, 4997195, -32371168, --38754028, -27695560, 46171, 92826592, 79344152, 15161771, -32029718, -10801843, -6158446, 48981416, -53142704, 6958921, 2012729, -7789460, -1727651, -9720048, -13347685, -8048232, -5052492, 19104552, -28598576, 24233816, -35183836, -38967164, -15545097, -15812459, -15970299, 36617280, 29138668, 38483444, -10830297, -15658377, -28761248, -54448376, -35383552, 23714126, 48309256, 74257304, 50142668, 4832912, --113850992, -99198712, -34306588, 41661720, 63581084, 86042688, 64103460, -4369593, -64869576, -94489280, --92136176, -16065862, 99686192, 104180336, 52334712, -24212878, -69352984, -47449724, -32668058, 3652870, --18343268, 36658084, 11662447, -30030412, -27979028, -99858, -45192184, -5798743, 6902013, 5000953, --3766686, 943819, -15080704, -2094333, -1615982, 7636989, -5088463, 20720532, -5377299, -4220342, --5665599, -6762963, 13211856, 3533684, -6116571, 20057498, 1454383, -36208184, -17809082, 9718974, -17793512, -6199249, 2317672, 24473260, -438624, 3164317, -20016158, -9221295, 6383395, -4594542, --4318053, -2887292, 16492674, 5701569, -6226092, -19527068, -7526930, -1345399, -17450988, 1473174, --19955492, -13680008, -9200357, -18097382, 28196998, -5268851, -12523051, 11640435, -32749, -27776090, --1451162, 27304718, 22485228, -13013751, 17446158, 2683818, 16651588, -18631568, -26987964, 10184441, -12127377, 10320270, 9292699, -10477573, 10240813, -20478404, 13871134, -27852862, -24160264, 17733920, --14071923, 12028056, 16976932, 992137, -12853763, 3950833, 4910222, -1331440, -913217, -680752, -11112691, -9436043, 7269769, -9853192, 12998719, -11491185, -5982353, 4486094, -3740917, -654446, -5227512, 977642, 3542811, 9652939, -7752416, -4944044, 5823976, 3157875, 11465952, -9443559, -3294240, -1365800, -6926709, -7369627, 3058017, 1559073, -6849399, -10676752, 3155190, -129386, --1799591, 6377490, -9803263, 11251741, 3605625, -10240276, -10946261, 8999567, -15444166, 10402411, --1590749, 7114077, -632971, 2251100, 13797582, -22073984, 44296684, 67837400, -8949101, -24950538, --21620866, 62552976, 28133110, 60542932, 32499480, 199179, -28156732, -6153078, 15327128, 28496572, -13487808, -13035763, -3334505, 13675176, 19892142, 2587718, 4388920, -13870597, 2452426, -6640020, -9009768, 10327786, 26342108, 22887880, -12205223, 2087891, -13688598, 3648575, 11959336, 18133888, -1224603, -8468602, -144418, -15389405, 12819941, -3466039, 5218922, 12183748, 132070, 16193637, --8045011, -4307316, -3893388, -16443282, -10045929, -25135222, -4910758, -28676960, 1831804, -9796284, -23547158, 3626026, 6833293, -22149684, 9259413, 265751, -10052371, 16422344, -8956081, -4475356, -3896072, 10896332, -1460289, -5806796, 36522792, 12045236, 8316131, 13886703, -10104984, -379568, --3487514, 19290308, 26477400, 25719874, -15460809, -16596291, -2464238, -6533719, 6511708, 17372068, -17740362, 904628, 9855339, -1091995, -2941516, 5982890, 11231876, -977642, 8777839, -7410429, -1414118, 246961, 2918430, -2467996, 9841918, 5963025, -1290101, -2698313, 2815351, 1898376, -10707353, 734976, -6713034, -6908992, -4284767, 3206193, 3473555, 7137162, -8770860, 1311576, --2596845, 5763846, -4447439, 8083666, -2964601, 3103651, -4753455, -3578245, 2235531, -6794639, --257698, 7823820, 1622424, -3014530, 407485, -25323128, -54880020, -7439420, 72568840, 111815176, -93918584, 74171400, -4971962, 8696772, -54465556, -61829812, -100730944, -58034136, -63427540, -20010790, -8018704, 43852688, 31273268, 95498600, 83205864, 27451284, 5848672, -14845554, -32417340, -51346872, --18752900, -52631604, -13973139, -25620016, -16510928, -12295418, 2820183, 884226, 17891760, 25799332, -39293044, 42504608, 51103132, 44050796, -5253819, 4270271, -492848, 8262980, -25221122, 10198400, --26960584, -67563592, -33109902, -50574312, -84902376, -24919400, -7330973, -34438660, 11716134, 26110716, -59379532, 69900056, 103255848, 65157340, 53180284, 52785148, 32907502, -10234907, 5427765, -52074332, --44785772, -75412112, -89569392, -103521600, -75307960, -58087824, -5986111, -2818036, 8280697, 30244086, -51274392, 92231736, 91291680, 90814400, 72895792, 31228708, 47057808, 7371775, -23517094, -35527432, --83923128, -76384920, -67572720, -58339616, -46645492, -28248000, -17079474, -5851893, 4276714, 28294170, -33622076, 44224204, 36689220, 52422224, 47517908, 31071940, 35840428, 24063628, -6462315, -19399294, --22342420, -53430468, -46277736, -41712184, -31204012, -17013976, -563714, -2029909, 13735305, 21064668, -16441672, 19546934, 12535936, 3952444, -333397, 5696737, 1409823, -6507413, 7129646, 8545911, -682363, 4620848, -1197759, -1849520, 878858, 3223910, -33286, -7184944, -9549323, -9382356, --10842108, -7331509, -2103460, -2444373, 3313031, 1362578, 1064078, 3798362, 4400194, 3513820, -4752382, 7309498, 6298570, 3618510, 4395362, 1596654, -1280437, -325881, -1672353, -2568391, --923418, -1391033, -412854, -525597, 149787, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +5522254, -621697, 3624953, 906775, 827318, -11378442, -4951561, -5636071, 4433480, -609885, +-3697430, 4030827, 4161287, 273267, 3995393, -1669132, -137439, -234613, -2466922, -1284195, +-5468567, 2826089, -8085276, 3376381, -4217658, 3442416, 6427956, 2934537, -1225139, -1817845, +4749697, -766115, 219580, 4495757, -4817343, -140660, -1630477, -2774012, 588947, -674847, +994822, 4607963, 7593502, -2413235, 135828, 6307160, 478352, 1658931, -2324114, -3534758, +-520765, 1059783, -5959267, -1564442, 3112778, 404801, 1123671, 1848983, -856309, -1862405, +-1762547, -2088965, 2303713, 1887638, -1099512, -3414499, -4198868, 2074469, 36507, -3484829, +3675955, -803159, -245350, 560493, 1037235, -1738925, 2198487, -2341294, -792421, 2876554, +-1988033, 1146219, -3364570, -2572686, -1239635, -833224, -216359, 454730, -1357747, -1698660, +-171799, -967441, 378494, -358630, -309238, -463320, 358093, 99858, -357019, -693637, +-419833, -258235, -65498, -375810, -242129, -530428, 484794, -777389, -482647, -3735011, +-1026497, 29528, -3537979, -3579318, -2147484, 8588861, -6032819, -2480344, -4212826, -7670812, +2864743, 1315334, 298500, 6585259, 6234682, 6248104, 2017561, -1168768, 966368, 4709969, +-2014877, 2031520, 2379412, -5556614, 7911867, 1534914, 2460480, 5851356, -2251100, -5838471, +393526, 3965329, -2795487, -1268089, -3726958, 3946538, -102542, -402116, -6477348, -280784, +-788127, 3987877, 2035815, -3551938, 7084012, 2614561, 1473174, 2481954, -1156957, 3972308, +-1548873, 195958, -4946192, -5907191, 4734128, 3708168, 6558952, 640487, 1768453, -5080947, +-7865696, -3861176, -2361158, -2291365, -3635153, -3130494, 1619740, -911070, 2384781, -2952790, +-1132798, 1296006, 1466195, -887985, 4000762, 1215476, -3007551, 6041409, -2371359, 1858110, +7621957, 1625645, 1044214, -2364380, 104690, -2596308, -3103114, -500364, 1752884, -35970, +223875, 94489, -842350, -270046, 74625, -762357, 1786170, 1145146, -670552, -165356, +49929, 468688, 251792, -1188632, -643171, -286689, 130460, 528818, -554588, -855235, +733903, -440234, 562641, -306553, -474594, -594853, -7397545, -6890738, 4037806, 923418, +5655935, -8740795, -1234803, -3472481, 938450, 10416906, 5942624, -9100499, 3445101, 869731, +-3796751, -4218195, -5163625, -8378408, 299037, 1012002, -3108483, 1497333, -1791538, 328565, +2529199, 1962263, 5405753, -4719632, 8511015, -5179731, 4942971, 3930432, -3186866, 2304250, +413391, 3547106, -1415192, 1859184, 3246459, 1095217, 506269, -1288490, 2530810, 771484, +-1128503, 6067178, -7913477, 557809, -4792647, 9545565, 3368865, -8307004, 3237332, 10912438, +-10240276, -4869956, 1237488, -826781, -3880503, 3263638, -1356673, 7271917, -6100464, -593242, +-2014340, -408559, -365072, 7027640, -6501507, -2147484, -700080, -6708202, 3629784, 2815351, +7256347, 2964064, 6179384, 5575942, 922344, -2234457, 1755031, -185220, -766652, -1662689, +-151398, -2552284, -1016834, -568546, -3579855, 2290291, 199179, -2493229, -415001, -2019708, +197569, -78383, 1389422, -474594, -802085, 179852, -1145146, -31675, 1200980, 447213, +-251792, -802085, 3296388, -5092758, 646929, -3200288, 3375308, 1202591, -5126044, 14813342, +-9423695, 2960843, 16047072, -11346767, 5281199, -311385, 5247913, -1407676, -9698573, -2138357, +8009041, 7163469, 1985886, -83752, 4054986, 1973001, 146566, 3340948, 3372086, -2800319, +4296578, -1207423, 6772090, -5470715, -8420820, 1783485, -7351374, 2523830, 137976, -2116345, +-2353105, -3370476, -5003100, 958315, 1763621, 165356, 1272384, 1444183, -3084860, -6468221, +5076115, 1124745, 832687, -328028, 7459285, 1489817, 3123515, 7870528, -4842039, 1898912, +315143, 2367601, 5519033, 4314832, -7193534, -6312528, -1625108, -3610994, -828929, 247497, +-3098282, 1636383, -5752572, 273267, -5535139, 2728378, 2709588, -3211562, -4210679, 461709, +2310156, 423054, -4866735, 680752, -2786360, 2087891, 1733556, 775242, -913217, -1369021, +967441, -144418, -523986, -34360, -1255204, -1057636, -3339874, -828929, 3043521, 1330903, +-873489, -605590, 2124935, -732292, 638340, -942208, 38118, -236760, 113817, -1210107, +-803696, -461709, -345745, -436476, -503585, 101469, -332323, -763967, -627065, 402653, +4677220, -1999844, 4235375, -798864, 2111513, -2433636, 289910, -1598265, 1406602, -769336, +-9246528, 7022272, 4505958, 11582453, -7600482, 4742718, -9403294, -1615982, 5735929, 6206765, +-6599754, 1888175, -7645579, 564788, -8964670, 2935610, -6715718, -8334384, -7456600, 3742527, +-6024766, 259309, -7065758, 916976, 1037772, -1066763, -5172751, 3245922, 4540318, 2703145, +2114198, -5530308, 3007014, -5799817, -1833951, 3555696, 114890, -806380, -1561758, -226560, +3678103, -4279398, -8246337, -1745904, 2537789, -1745367, -6114423, -6185290, -8768713, 2093260, +-2529199, -8213051, 5869610, -5265630, -5160403, 9916543, -3586298, -1962800, 811212, -1802276, +-3236258, 796180, -5443871, -2702608, -4580046, -3617436, -1503239, 2949569, 7511361, 375273, +4514548, 370441, 3368865, 2333778, 6068252, -450972, -136365, 615791, 2243584, -1245004, +259846, -605054, 4437775, -185220, 2143726, 307627, 855235, -772557, 992137, -2736968, +2974802, 54224, 59056, -2241973, -564788, -3023657, 1427540, -1555315, 1022739, -424665, +3001109, -1482838, 594316, -2636036, -2096481, -218506, -911607, 704912, 7662222, -11038066, +1987496, 9656160, -3582003, 10575283, 2946348, 666794, -3067144, -7385733, -4858682, 12589623, +-6763500, -59056, -2337536, 983548, 7577933, 6807523, -4125853, 9834401, 9819906, -4629975, +-2421288, 5980742, -5053566, -4424353, -317291, -6795712, -153008, -2006287, 876710, 11798812, +4028143, 636192, -5408975, -15696495, -1912871, 8818105, 2164664, -5883569, 4512400, 7167764, +6263136, 7573101, -12403329, 2506114, 602906, -6156299, 3337190, -5541045, 3946001, -3126736, +4894115, 11000485, 14541149, 9177271, 4217121, -6033356, -1664837, -7201050, -7568806, -1594507, +8526047, 2096481, 134218, 2006287, -8345659, 2167348, 1038308, -76773, -4224101, 2259690, +4567161, -4829154, -9100499, 20725364, 2677912, -3713536, 1278827, 2230162, 9443559, -1902671, +2598455, 3218541, 4687420, -3262028, -1599339, -3521873, 1672353, -976031, 1844152, 1718524, +-1223529, -1928440, 3514894, 467615, 929324, -671089, 2124398, -3646964, -2601140, -1755568, +-646929, 4050691, 1491964, 2707977, 2066953, 2122788, 150324, 470299, -901943, -2555506, +2498597, 601832, 1056562, -1781338, -5709622, -1603633, -3503083, -1331977, 2653753, -3595425, +16345572, -1606318, 4605279, 11740830, 1534377, -1739462, -7679402, 4325569, -4147865, -5170604, +-15518254, -6922414, 3117073, -805843, -3007014, -11180874, 3907883, 6199249, -8824010, -4583267, +-2374580, -9203578, 3673271, 686121, -4889284, -3980361, -1687922, -12443057, -4451734, 6219650, +10365904, -7819525, -9823664, -2812667, -579821, -7936563, -6560563, 2538863, 4364224, -8696772, +17497696, 131533, 7113003, -3935264, 6683506, -4480188, 2010582, -12372727, -2621004, 5124433, +-12430172, 3467112, -2812667, -6271726, -14114336, -251256, 7825968, 178778, -14887430, -2181844, +2702071, 6056441, 10912975, -3946538, 4881231, 12824772, 4252555, 1634772, -5806259, -1022202, +-3624953, 839129, -4319664, 1072668, -8154533, -993748, 6239514, 1872606, 1209570, -3456912, +-6323266, 3601867, -1171989, 3715684, -1349157, 570694, -824097, -1727651, -1684701, 2451353, +912144, -369904, -837519, 179315, -2458869, 1253057, -2510945, -3029563, -1975685, 1211718, +147103, 120259, -2370285, 1968169, -299037, -1114007, -3349001, -942745, 208843, 554051, +1357210, 3671123, 1127966, 940061, 1791001, 4835060, -1583769, -4825933, 5883032, 1079111, +-9099962, -14207215, -11664057, -14704894, 12655658, -7672959, -1937567, 4207458, -13989245, -5749888, +-9747428, -4282083, -3149822, 6350646, -12265353, -6480032, 3840238, 4878546, 6993818, -69256, +181999, -2140504, -78920, -2830384, 1692754, -9647570, -5268851, -8479876, 5855651, 2975876, +4522601, 5977521, -11837467, -809601, -1329292, 10755672, -4087735, 3412889, 5776731, -2157684, +6189048, -4055523, 6907381, 9814000, -3882651, -637266, 8327942, -7135015, 11538967, -4931696, +-18510236, 2903935, 9494025, -3615289, 1039382, -284542, 7269769, 9222905, -9383967, -4031364, +2117956, 6359773, -11027329, -8295193, -6719477, 13318694, -375273, -15211164, -3366718, -6313065, +5149129, 712965, 3874597, -5696201, 9361955, 425202, 1629940, 2741263, -8771397, -2942053, +591632, -1067836, -2252174, -2511482, 2382096, -2391760, -2410551, 1866163, 2723009, 1448478, +-5175973, -440234, -2097018, -1475321, 2067490, 1906966, 4244502, -571768, -2169495, 1665374, +-4863514, -549219, -92342, -3119757, 375810, 314069, -1243393, 615254, -5520644, -978179, +-708133, 633508, 648003, 2311766, -340913, 2593624, 1415729, 1344325, 125628, -8558796, +-3464428, 5878737, 2176475, 8422431, 2888903, 4120484, -16540993, -6481643, 6454262, -4357781, +-3120831, -5510980, 1694365, 8617852, 2260764, 2053531, -11082089, -3747896, -2022930, 4108136, +9731322, -11819750, 5572183, -9635222, -2562485, -8863739, 1137093, 1227824, -452045, 3702262, +-8276402, -2384781, -7756174, -3189550, 139050, -358630, -9740449, 5581847, 6250788, -2330020, +7417946, 14590541, 1494649, 11052025, 14175003, 1114544, 456877, 3418794, -2982318, 4698158, +959388, -3104725, -4780299, 17806398, -1854352, 10405095, 4599910, -5251672, -6096169, -4244502, +4973572, -4069482, 6464463, 15683610, 7947300, -2085744, 249645, -13155485, -9067213, -8026757, +12341589, 19376208, -8511015, -78383, -7875360, -1301912, 11845520, -3752191, -726386, -18698140, +-2507187, -3411278, -1989644, 7089381, 496069, 1467805, 2154463, -3758633, 2968896, 1578401, +2644626, -2247879, 3836480, -1858647, -435402, -4745402, -1129576, 4111358, -1529545, -134218, +-817654, 3946001, -1016834, -2881923, 1663226, 1745367, 995896, 1370632, 1446867, -1568737, +387621, 2779381, 4824322, 4175782, 2703682, 1454383, 285078, 351114, -3033321, -290447, +1896765, -1871532, 1998234, -700617, 685584, 2609193, -1150514, 11188927, 31024160, 13522168, +-4216584, -1076963, -5763846, 14298483, -14324790, -8140574, -21900576, -252329, 10799158, 13434658, +2419677, -5334350, -13129715, -9608379, 9675488, -1966558, 15367393, -46171, -4935991, 7250979, +2642479, -134218, -3821984, 10029286, -1865626, 8663486, -138513, -4727686, 18906446, -4525822, +7668127, 18582176, 6534256, -789200, -9085466, -1716376, -14798310, -17340930, 3773129, 11096585, +-2666101, 1549946, -18923090, -7201587, 10959146, 5931350, -4905927, 3615289, -5615670, -2732136, +-8631274, -14511621, 872952, -3433290, -10244034, -16748762, -14438606, -4712653, -13263396, 6088653, +-5940477, 2089502, 1712618, -116501, 315680, -2163053, -2974265, 8569533, 17062832, -11521787, +2081449, -4853313, 6168110, -6440841, -256624, -4656819, -2098092, 15682536, 11409044, 2551748, +-1770063, 137976, -6424198, 2198487, 6393596, -1239635, -5556614, -3195993, 5535676, -6732361, +611496, 2837363, 2683281, -2383707, -2143726, 2375117, 3016141, -2336462, 3592740, 2051921, +2979634, -345745, 3934727, -447213, 2488397, 1196148, 1463510, 875636, -870268, 4598836, +-4552129, -707059, 991064, -1400159, -1158031, -2176475, 2059974, 149250, -3925063, -1511292, +2561948, -2858301, -12782360, -14460081, 3753802, 5553393, 17353816, -14662481, 4687957, 4510790, +-24423332, -1123134, 182536, -20402706, -11110007, -7208029, 5222144, -1619203, 1249299, -5746666, +8617315, 13543642, 7148436, -1907502, -20707112, -9010305, -11247982, 4225174, 1293322, -9074729, +-682900, 7158100, -6010807, 12354473, -11093364, -311385, -6456947, -20699594, 3558917, -8800925, +-9921911, 7734163, 11467563, -12821551, 4992363, 15171972, -4926328, 6658810, 5219996, -3534221, +2085744, -16804060, 25485262, 10043244, 6051072, 24338506, -29659970, -2207076, -4088272, 3167002, +12130598, 12599287, 4850092, 6017786, 15569256, -1467268, -10554345, -18343806, 7124277, -6928856, +699543, 4981625, -3658775, 7518877, 19937776, -12281996, 9296994, -5948530, -5701032, 15079630, +1147830, 4710506, 14619532, 12072079, -5304822, -6099928, -12861280, -3237869, 63888, 6714108, +7032472, 25233, 1667521, 1020055, -257698, 1411971, 1616518, 551903, 3969087, -1975148, +592706, 2867428, 1582159, 843424, -1787780, 3855807, 2499671, 595927, -2197413, -3064459, +-7295539, 4365298, -300111, -647466, 2197413, -3484292, -430570, 2449742, 3333968, 5054640, +2823941, 1405528, 1377611, -31675, 3642669, 15959562, 18682034, 4722854, 11509439, -7474854, +5399311, 5340792, -30771830, 8739185, 9921374, 2146410, -9830106, -179852, -19006304, 22367652, +13410499, -6964290, -7545184, -11044508, -5829881, 16203838, -16381005, -9309878, -2484102, -2670933, +-3555159, 2413235, -10855530, -10982768, -6535867, -8442832, -2327872, -10999411, -1551020, -7356742, +-24317568, -15431281, -6017249, -3780645, 3380139, 4139812, -146566, 796716, 7031399, 3473555, +3599183, 17192218, 3571802, 5872831, 10672457, 23066122, 19641422, 1135482, -7761006, -14969572, +13733695, -3269544, 37093484, 7594576, 16639777, -1702955, 2135673, -14618995, -563178, 12982612, +7462506, 9872519, -11106785, -7239168, -14278619, -27031988, 15714212, -23839216, -2888366, 31737660, +2151242, 12801150, 6081674, 9454297, 332323, -16924318, 16644609, -140660, -14932528, -13265543, +551903, 5371931, 11223286, 3146064, -13077102, 845572, -2540473, 2823941, -5103495, -4149475, +2401424, 2280628, -3994857, 564788, -1234266, -206158, -5280663, -1795833, -1624035, 2668249, +-1338956, -3106335, 4396973, -2469606, -957778, -7415261, -7951595, 206695, 296890, -3133716, +-2001455, 2829310, 2088965, -3181497, -5271536, -134755, 3604015, -22033720, 6556268, 8189966, +-14646375, -11459510, 302258, 8992588, 21531744, -1176821, -16472810, -16777216, -806917, -9528922, +2871186, 2961917, -18401788, -16016470, -30109868, -8997420, -8685498, -20628728, -13856101, -219043, +-9489730, -6086506, -5344550, -1763621, -20244328, -10982231, -12422119, -6267431, 6318971, -17360258, +1348083, 14296872, 17174500, -4101694, 4736812, 9709847, -16886200, 9488656, -7285875, 14977088, +-7242926, 1289564, -7810398, -1796370, 29952028, -6231461, 11301133, -21941378, -3574487, -98784, +-20698522, 19277424, 777926, -7175280, 13931800, -5775121, 3608310, 27377196, -10862509, -15115064, +10382010, -2948495, -30819612, 12457553, -40867152, -22031034, 16432545, 12728136, 2653216, 8591008, +71941, -297427, -30827664, -16663399, -7245073, 2743410, -17514876, 4238596, 2451890, 7156490, +-11432666, 605590, 8864812, 6645925, 5103495, 510564, 4202089, -10125385, -6416681, -6860674, +-1884954, -1477469, -882079, 8021389, -4153770, 4168803, 8099772, -4069482, 2506114, -6524056, +-4898410, -392990, 2087354, -5873368, 2537789, -7340636, 6358162, -2646237, -1277753, 181462, +5703717, -1894618, 2277943, -5189394, 4565550, 3362960, 10537165, 2383170, 8653822, -8647380, +-2870112, -10269804, -5290863, -5088463, 41455024, 22702124, 32212, -21343304, 10965052, -22256520, +-18108118, 3293703, 18411988, 36403068, -5731634, 18405546, -6585259, 13065827, 22059488, 12342125, +14096620, 7565585, -4139812, -18056042, -18693846, -5653251, -17667884, -5193153, -3253975, -3973382, +14105209, -2404108, -36287104, 2130304, 8735963, 8380555, 21681532, -2238752, -43305080, 24617678, +-19390704, 6338835, -4259534, 14565845, 21189222, -23602456, -1676648, -11793443, -20605106, 14898705, +-10261751, -25345676, 9919764, 14803679, 24335822, 6452115, -3828963, 2664490, 19916838, -16052440, +31457414, -9900436, -8808978, -2834679, 19154480, -19963008, 1802813, 2435783, -55599964, -8240969, +17162690, -8000987, 2845953, 7714835, 3995393, -2728378, 4482335, 19055160, 22721450, -18025978, +6460168, -13205951, -2294586, 22526030, -523986, -2348273, 788127, -1526861, -11724724, 3213173, +734976, -6823630, -17345762, 227096, -4182225, 5282810, -8039105, -7474317, -9449465, 7959112, +1787780, 4876936, 3871913, 325344, 2843268, -3839164, -7978439, 12108050, -1274532, -5879810, +-243739, -4241280, -2710661, -4896263, 561030, 1484448, -773631, 3349001, 8764418, -341987, +-2211371, -3615289, 738734, -4494147, -2608656, 5037997, -3929895, -3227668, -4796405, -11689827, +-6605660, 1611150, 7490960, -6149320, -1620813, 23759222, 15761456, -44174276, -25113748, 30255360, +35066260, -18848464, -6386617, -49708340, -27475442, 7159711, -2254858, 6610492, -26422638, -16558173, +-18108656, 26825292, 39862128, -1940788, 10762114, -6491306, -3491272, -508954, 9155797, 17271138, +4204773, -6154688, -3304977, -4059818, -23810762, -13509283, -24207510, -3224984, 7485055, -10183904, +14939507, -11068668, -4140885, 23173496, -11233487, 13019656, 9057012, -4259534, -22323630, -16172699, +-13307419, 4012573, 41748692, 7336878, 22450868, 26443040, 20712480, 15316390, 13727252, -23044110, +557272, -3783866, 30906048, 14667850, 18079128, 32246078, -15833397, -21718576, 7973070, 27270358, +-46231028, -850940, 3696356, 21490406, -37384468, -56369300, -10014790, 15775952, 3955128, 6372121, +17681306, 1113470, -12483859, -18513994, 629750, 2525978, 3675418, 17046726, 25308632, 11949136, +1895154, 75162, -257161, 2072322, 2562485, -6398428, 9350144, 1152125, -8513162, -15032922, +1881196, -6413997, 3245385, 1628866, -1334661, 943282, -6201933, 6460168, -3319473, 4334696, +-6669011, -4336307, -11913702, -11782706, 580894, 6192806, -5259725, 12406013, 354872, 3690988, +-3721052, 13260175, 1130650, 6075231, -6542846, -3592203, -2071785, -8256538, -1600412, 8939438, +-15462419, 11917997, -596464, -11344619, -20089710, 7569880, -9793062, -19589882, 14097156, 27195196, +8301635, -10292352, 16095390, 27361626, 10059887, 5752035, 1898912, -2889439, 12796318, -22608708, +1321776, -32577326, 17467096, -26257282, -2249489, 14390825, 7828115, -14896020, 3157338, -17259326, +35744864, 4825933, 11580306, 18846854, 39439076, -16088411, 12796318, -18672908, 6804302, 14410689, +31707596, 7711077, -6462852, 32742146, 4380867, -2047089, -18720152, 1480153, 20369956, -6652368, +19581292, -23859618, 37152540, 38789996, -46324980, -949725, -2922725, 10384157, -7890929, -5810554, +19931870, -16546362, -49412524, 863288, 43948788, -34395172, 17418240, -7738994, -4385699, -20841328, +48520244, -2856690, 8043937, 4738960, -32610076, 42531988, 3323231, 37859064, -74320648, 7368554, +-6967511, -22133040, -5995775, 13345000, -17284560, 11923366, -15574625, -10101763, -20505784, 26207890, +-9925669, 2060511, -21864604, 1236414, -16052977, -5199595, 7510824, -10808822, 5219996, 979253, +-14808510, 13704167, -6047314, 2209761, -6309844, 12466679, -9116605, 2202245, 891206, -3102577, +16174847, -9028021, -11249593, -6249715, -12612171, -17340394, -8805757, 1996623, 1151588, -12404402, +-7154879, -8236137, -12230456, -9430138, 4307852, 3156801, -322659, 31423592, 3623879, -23854786, +2324651, -48631376, -11252814, 2573222, -9577777, -38744364, -4443144, -25395604, -6479495, 23511188, +5282273, 30788474, 12581570, 11690364, 7039452, -10356777, 24448028, -12377022, -411243, 11735461, +5184563, -14969035, 12046846, 5113696, 28954522, 12102144, -5416491, 17726940, -14194330, 23897198, +7969312, -26008174, -27096948, 14028437, 17266842, 7389491, 2630668, -12566001, -17427904, 5389647, +-17155174, -25451440, -8080981, -4191351, -23746874, -8613020, 8559333, -15958488, -26758184, 7614977, +9582609, 1063541, -3504157, -1409286, -4762582, 9658845, 44889924, 9344775, -1739999, -1575179, +-16224776, -25622702, -11704860, 37314140, 39652212, 20608864, 3513283, 36392868, 17147120, -8051453, +-50709068, -38298760, -31942208, -60081760, -35391604, 8677445, 48642116, -21529598, 16255914, -24089934, +7627862, -1827509, 16510391, -7698729, -3147137, -21474836, -12730820, -5105106, -19609746, 24811490, +-4160213, -12663711, -6416145, 2726767, -14281840, 10199474, 7051263, 16135655, 3339874, 4707284, +-16000364, -18096844, -2454574, -13309030, -8860518, -15546171, -23046258, 1415729, -6273337, 1647120, +1299228, 17631378, 17052094, -6250788, -3804804, -7474317, 16457778, 11368242, 6960532, 2846490, +-3774203, 9842454, -13647795, -5070746, -2519535, -14995878, -29844118, 15709380, -903017, -9256728, +-4327180, 11241540, 20809654, -8856759, 26845156, -30748208, 24797530, -3078955, 33138358, -21462488, +19086298, -31688268, 27536110, -25590488, -10979547, 38607996, 8742406, 31031676, 44069048, 4640176, +-3712999, -18345416, -1623498, 28175522, 6924024, -9837623, -31235686, 2772938, 5998996, 14811732, +8836358, 12355010, 7494718, -18010946, -29070486, -12142946, 27879706, 10874857, 89247808, -28248536, +-24012088, 29298120, 45759120, 9785009, -907312, 12234214, 2916820, 14903537, -13605383, 5497558, +21339008, 23886998, 15714212, 69562904, -8913131, -8756901, -4610648, 36002028, 21299816, -17926120, +18656802, -164819, 6026913, -14702747, 31681290, -31439698, 2128156, 49242872, -36148592, 105441448, +-48360260, 50614044, 46093052, -45030584, -41500660, 47106128, 1951526, -26674968, -11483132, 26190710, +-71077416, 11497091, -8406862, -45336064, 29875256, -35396972, 2793876, 3105798, -14466524, -34901976, +9557913, -2261837, -1618666, 7305203, -7329362, -11155104, 6315213, 15366319, -5650567, 2806224, +11512123, -10246718, 16031502, 12949863, -25584046, 4266513, -14373108, 7132867, -1023276, 2709051, +-13089987, 6082211, 3422015, 591095, -6563247, 20447802, 4465692, -23622, 18881214, -12627741, +-12181064, 2760590, 8159364, 2802466, 9092983, 5477157, -26304528, -12828530, 6803765, -14626511, +22668838, -8334921, 17365626, 23416698, -54388244, -22512608, 32749126, -69270304, -43543988, -28705950, +48386564, 104359656, 28368796, -81051400, -18752364, -82812336, -43826920, 68365144, 40215928, 64305324, +34746824, -47802988, -76973864, -57917096, -14361834, 35061964, 38951060, 24137180, 12911745, -19762218, +-84104048, -100249368, -22148610, 77622944, 137204880, 93750544, -17912162, -64039572, -92938264, -68208912, +-55897924, 536871, 21867826, 75608064, 79867064, -42942692, -27513024, -100368016, -94087704, -33239826, +8920647, 97843112, 143433648, 64282776, -42763916, -150174064, -112003624, -81438488, 39250632, 86288040, +53218404, 34382824, 28488518, -89395448, -16840566, -50761680, 18729278, -6604586, 52916680, 84186728, +66115116, -77612744, -157918432, -117950000, 12825309, 92641368, -2596845, 128265976, 4997195, -32371168, +-38754028, -27695560, 46171, 92826592, 79344152, 15161771, -32029718, -10801843, -6158446, 48981416, +53142704, 6958921, 2012729, -7789460, -1727651, -9720048, -13347685, -8048232, -5052492, 19104552, +28598576, 24233816, -35183836, -38967164, -15545097, -15812459, -15970299, 36617280, 29138668, 38483444, +10830297, -15658377, -28761248, -54448376, -35383552, 23714126, 48309256, 74257304, 50142668, 4832912, +-113850992, -99198712, -34306588, 41661720, 63581084, 86042688, 64103460, -4369593, -64869576, -94489280, +-92136176, -16065862, 99686192, 104180336, 52334712, -24212878, -69352984, -47449724, -32668058, 3652870, +-18343268, 36658084, 11662447, -30030412, -27979028, -99858, -45192184, -5798743, 6902013, 5000953, +-3766686, 943819, -15080704, -2094333, -1615982, 7636989, -5088463, 20720532, -5377299, -4220342, +-5665599, -6762963, 13211856, 3533684, -6116571, 20057498, 1454383, -36208184, -17809082, 9718974, +17793512, -6199249, 2317672, 24473260, -438624, 3164317, -20016158, -9221295, 6383395, -4594542, +-4318053, -2887292, 16492674, 5701569, -6226092, -19527068, -7526930, -1345399, -17450988, 1473174, +-19955492, -13680008, -9200357, -18097382, 28196998, -5268851, -12523051, 11640435, -32749, -27776090, +-1451162, 27304718, 22485228, -13013751, 17446158, 2683818, 16651588, -18631568, -26987964, 10184441, +12127377, 10320270, 9292699, -10477573, 10240813, -20478404, 13871134, -27852862, -24160264, 17733920, +-14071923, 12028056, 16976932, 992137, -12853763, 3950833, 4910222, -1331440, -913217, -680752, +11112691, -9436043, 7269769, -9853192, 12998719, -11491185, -5982353, 4486094, -3740917, -654446, +5227512, 977642, 3542811, 9652939, -7752416, -4944044, 5823976, 3157875, 11465952, -9443559, +3294240, -1365800, -6926709, -7369627, 3058017, 1559073, -6849399, -10676752, 3155190, -129386, +-1799591, 6377490, -9803263, 11251741, 3605625, -10240276, -10946261, 8999567, -15444166, 10402411, +-1590749, 7114077, -632971, 2251100, 13797582, -22073984, 44296684, 67837400, -8949101, -24950538, +-21620866, 62552976, 28133110, 60542932, 32499480, 199179, -28156732, -6153078, 15327128, 28496572, +13487808, -13035763, -3334505, 13675176, 19892142, 2587718, 4388920, -13870597, 2452426, -6640020, +9009768, 10327786, 26342108, 22887880, -12205223, 2087891, -13688598, 3648575, 11959336, 18133888, +1224603, -8468602, -144418, -15389405, 12819941, -3466039, 5218922, 12183748, 132070, 16193637, +-8045011, -4307316, -3893388, -16443282, -10045929, -25135222, -4910758, -28676960, 1831804, -9796284, +23547158, 3626026, 6833293, -22149684, 9259413, 265751, -10052371, 16422344, -8956081, -4475356, +3896072, 10896332, -1460289, -5806796, 36522792, 12045236, 8316131, 13886703, -10104984, -379568, +-3487514, 19290308, 26477400, 25719874, -15460809, -16596291, -2464238, -6533719, 6511708, 17372068, +17740362, 904628, 9855339, -1091995, -2941516, 5982890, 11231876, -977642, 8777839, -7410429, +1414118, 246961, 2918430, -2467996, 9841918, 5963025, -1290101, -2698313, 2815351, 1898376, +10707353, 734976, -6713034, -6908992, -4284767, 3206193, 3473555, 7137162, -8770860, 1311576, +-2596845, 5763846, -4447439, 8083666, -2964601, 3103651, -4753455, -3578245, 2235531, -6794639, +-257698, 7823820, 1622424, -3014530, 407485, -25323128, -54880020, -7439420, 72568840, 111815176, +93918584, 74171400, -4971962, 8696772, -54465556, -61829812, -100730944, -58034136, -63427540, -20010790, +8018704, 43852688, 31273268, 95498600, 83205864, 27451284, 5848672, -14845554, -32417340, -51346872, +-18752900, -52631604, -13973139, -25620016, -16510928, -12295418, 2820183, 884226, 17891760, 25799332, +39293044, 42504608, 51103132, 44050796, -5253819, 4270271, -492848, 8262980, -25221122, 10198400, +-26960584, -67563592, -33109902, -50574312, -84902376, -24919400, -7330973, -34438660, 11716134, 26110716, +59379532, 69900056, 103255848, 65157340, 53180284, 52785148, 32907502, -10234907, 5427765, -52074332, +-44785772, -75412112, -89569392, -103521600, -75307960, -58087824, -5986111, -2818036, 8280697, 30244086, +51274392, 92231736, 91291680, 90814400, 72895792, 31228708, 47057808, 7371775, -23517094, -35527432, +-83923128, -76384920, -67572720, -58339616, -46645492, -28248000, -17079474, -5851893, 4276714, 28294170, +33622076, 44224204, 36689220, 52422224, 47517908, 31071940, 35840428, 24063628, -6462315, -19399294, +-22342420, -53430468, -46277736, -41712184, -31204012, -17013976, -563714, -2029909, 13735305, 21064668, +16441672, 19546934, 12535936, 3952444, -333397, 5696737, 1409823, -6507413, 7129646, 8545911, +682363, 4620848, -1197759, -1849520, 878858, 3223910, -33286, -7184944, -9549323, -9382356, +-10842108, -7331509, -2103460, -2444373, 3313031, 1362578, 1064078, 3798362, 4400194, 3513820, +4752382, 7309498, 6298570, 3618510, 4395362, 1596654, -1280437, -325881, -1672353, -2568391, +-923418, -1391033, -412854, -525597, 149787, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, { 7398618, -2813204, -3714073, -630286, 2575907, -455267, 2740726, -6771016, -4831838, -1181653, -5706938, -2391760, -1274532, -627602, -3857418, -1717450, 3578782, 3580929, -1407676, -1089311, -2382633, --5472325, 6096706, 3630858, 150861, 643171, -341450, 178778, 4908074, -2490544, 894964, --7861401, -6454262, -1612760, 576063, -5478231, -1026497, 1949378, 462246, 99858, -2760590, --2114735, 5132486, -2380486, -2204392, -721555, -737124, 2267206, -1200443, -3367254, -130997, -2955474, -4220879, 183073, -4520990, 317828, -3315178, 5005785, -299037, -5273146, -782221, --511638, 613107, -7530689, -927176, 627065, -5051956, 2318209, 91268, -5801964, 2622078, -3568044, -3114925, -3554086, -6396280, 3340411, 1908039, 5917928, 2898566, -879931, 1127966, --821413, 1771137, 1881733, 4059281, 1039382, -1803349, -63351, 453119, -133681, 2307471, -604517, -831076, -1134408, 1107565, 907312, 1720671, 873489, 650688, 1046898, 920734, -391916, 558346, -111132, -332860, 373125, 215822, 443992, -279710, 523986, -54224, --5474473, 2469606, -6828998, -1914482, -948651, -3466039, 3300682, 7637526, -3120294, -1031866, -369367, -3177202, 2207613, -490700, -2563559, -4384088, -2313914, 6886980, 6673306, 3731253, -7750806, 4542465, 2473901, 7275138, -4518843, 1589675, 3128347, -159451, 1268626, -2181307, -1409823, -10103374, 228170, -602906, 3656091, -2300492, -1268626, -721018, 2804614, -3210488, --501437, 891206, 1979980, 1896228, -522375, -3442416, 663572, 1181653, 2486249, 1848447, -2889439, -3237332, -1896228, -606664, -5696737, -693100, 1534377, 4894115, 5500780, -768262, -3041374, 2235531, -391379, 2020245, 2445447, 3528316, -1402307, -63351, -2637110, 443992, --2269353, 1560147, -3369402, -3216931, 1941862, -34360, -6310381, -607738, -4720169, -1300301, --652298, -813896, -6272263, 594316, 2243047, -1868311, -1773822, 1075352, 817118, 446140, --1224066, -3392487, -151934, -1490891, 1308354, 38655, 113280, -385473, -1375463, -1559073, --1733556, 119185, -736587, 757525, -1076963, 431107, 289373, -1008244, 3221, -1121523, --378494, 62277, 31675, -996969, -215285, -170188, -6911676, -6536404, 2436320, -779000, -5430450, 5437966, 459562, 115427, 10492068, -2851322, -238908, 8788040, 374736, -5109938, --7445326, 5390721, -2171643, 13422, -4607963, 1410360, -3288334, 3652870, 16378321, -5999533, --4799626, -5927592, -6377490, 1142461, -5199058, -12923557, -315143, 1266479, 41339, -5156108, --1069447, 4161823, -5258114, -3136400, 7660074, 2488934, -1938641, -1854352, 4935991, -2474975, -3536369, 3190624, -6974490, -4664872, -4125853, 4534949, -3533148, -2141041, -1916092, -2360085, --357019, -4745402, 48318, -1458678, 1173600, -689342, -10219875, 4705674, -5710696, 4473209, -853088, -8447664, 1716913, 5576478, 1742683, 9313637, -3948149, 467615, 1103270, 2142652, -3359201, -3740380, 1408749, 1184337, -5430450, 7405598, 545461, -1111323, 3174518, -1126355, -1427540, -1419487, -2834142, -256087, -1822140, 2390149, -630286, 404264, 2914672, 944893, -1112397, -710280, 1586990, 216896, -423591, 979253, 2118493, -1597191, 139050, -1682554, -1009317, -595390, 3058554, -4300873, 2004139, 2246268, -2377801, 1107028, -1190243, -9346923, -2860985, 8866960, 7308424, 8319352, 1417876, -1732482, -7130183, -3670050, -3367254, -2624762, -7308424, 10249403, 702764, -636729, 7237557, -11733851, 199179, -887985, -244813, -3778498, --3999688, 4365298, 5270999, 242129, -1213865, 2191507, -5770289, -4268124, 4354560, -4711579, -9117679, 8373039, 1347546, 5185636, 4275103, 951335, -3790846, 1377074, -246961, -6389838, -6229850, -478889, 2888903, 5182415, -6117644, -2278480, -7261179, -1552094, 1602023, 6849399, --6998649, -2680597, 5022965, -987843, -4496294, 7507066, -6237367, -12916577, 2137820, -7239704, --3323768, 3618510, -3195456, 708133, 721555, -3090766, 5494874, -4997732, -5817533, -6842957, --821413, -2922188, 402116, 1922535, -4289599, 1202054, 1158567, 394600, -2073932, 1203128, -848256, 2979634, 379031, -849330, -2042794, -1196685, -938987, -436476, -759672, -1150514, -318901, 647466, 782221, 345745, -443992, -903554, -450972, 1523640, -1527398, -1452236, --512712, 41339, -192200, 1185948, 1248225, 1305133, -818191, 513785, 207232, 566936, -2841121, -1412507, 181999, -11762842, 2518998, 11068131, 907312, 1724429, 3380676, 10368051, -1440425, -9990094, 11094437, 4859219, 4020626, 6736120, 5871757, 40802, -2050310, 6354404, -4887673, 1658931, -4551592, 5527086, 2629594, 8185134, 9579925, 3631932, -2328946, 216359, --41339, 3980898, 12155831, 7204808, -6700149, 11737609, 501437, -1444720, 1583232, -8654359, -9651865, -1279900, 207232, -1147830, 2487323, -1297617, 5002027, -6977711, 9862319, 8382703, --276489, -1561758, -5426691, -10408853, -3534758, 4135517, -2385318, -3901978, 5562520, 6486475, --4350802, -3905199, -13313862, -4627828, -1611150, -646393, -14901926, 7614440, 878321, -8894340, --7272990, 2458869, -3427384, 913754, -2166274, 485331, -3889630, -861141, -3464428, 2541547, -5034776, -1403917, 3841848, 457414, -1534377, 4477504, 1602560, 233002, 3729105, -418222, --1635309, -2308008, -2567854, -2717641, -2546379, -3178276, -2285460, 175020, -1241246, -2981244, --1432909, 314606, -592706, -1100049, 687732, 1228361, 632434, -1351841, -1903207, -2405182, -307627, -2280091, 2167348, -1245004, -1276142, -1228361, 91805, -871342, 5510980, -6960532, --55835, 71941, 258235, 11242614, 6184753, -97711, 14018773, 6475200, 12658342, 3018825, -4289062, 13502840, -5328981, -8999567, -5679021, 12625593, 3105798, -7122667, 9648644, -2635499, --5602785, 8607651, 20452634, -5272609, 1051193, 3264712, 3933653, -5313412, 703838, 11249056, -1238561, 13832479, -2978560, 14854144, 10544682, 3559454, 8847633, 5580237, -5247377, 3694746, --1315871, -1321776, 1463510, 1009854, -914291, 3919695, 2764348, 9598178, 6519761, -8021925, -2855617, 3614215, -5865852, 354335, -13913010, -18104898, 7311108, -4637491, -11766600, -2537789, --6302328, 7799661, 1782411, -3675955, -8859444, 6997039, -6388227, 4269198, -7176354, 1067299, --2840047, 10972031, 2128693, -4281546, 4310000, -9354439, 8608188, 1389422, -7955890, 368830, --740345, -2308008, -872415, 1147830, 2474438, -2339684, 4021163, -869194, -1444720, -1781338, --1285269, -3463891, -179852, -1229971, -3255048, -1240172, 1313186, -2081985, 2254858, 332323, --1086627, 571768, -2122251, -413927, -1446867, -192200, 44560, 107911, 1218697, 1344325, -1615982, 71941, 879931, -70867, -7922604, 1064078, 321049, 2102387, -4827007, 5466420, -6038724, -651224, -4014721, -13911399, -11913702, -9175661, 4292283, 1243930, 2233920, -11404212, -7247221, 5103495, 9015136, -9776419, 9297530, 7135552, -5594732, -4655745, -2815351, 9450002, -6540699, -4150549, 959388, 14297946, 7268159, 3695283, 8308614, 5698348, 2254321, -4725538, -1098438, 665183, -1985886, -5245766, 12724914, 5937256, -11786464, 7996692, 7975755, 7920457, -6233072, 1682554, -7333120, 236223, -948651, 11083700, 1505386, 4962835, 10088878, -1787243, --10938208, 2454574, 5947993, 11201275, -14872935, -8392366, 4127464, 176094, 1417876, -8813273, --2139968, -8545374, -1146756, 4093104, -2773475, -4662187, -5649493, 2439005, -1365263, -2820183, --6995428, 285078, -9381282, -148176, -865973, -4750771, -5264020, 6082748, -2032593, -1480690, --2959233, -5779952, 2108829, 2829847, 1992865, 2222109, 1644973, -3179350, -1689533, -947040, --734439, -2986076, -5604396, -2481417, -87510, -1890323, -111669, -3002182, 321586, -1614908, --1098975, -2173254, -2417530, -1268089, 2536178, -1758789, -803159, 404264, 1063004, 686658, --1144609, 1914482, 2885144, 2882460, -724776, 5284958, 686658, -9248138, 9418863, 6054294, --2816962, 3745748, 5673652, -6251325, -2115808, 24105504, -789737, 9405978, 6573985, -20106890, --10696616, -1123671, -848793, -225486, 11422466, 2575370, -5562520, 11818139, 7251516, -1465658, --1941325, 3781182, -1924145, -4159139, -8966818, -10610180, 5876589, -2314451, -5007932, -503048, --16554415, -3060164, 1091459, 9152575, -10938208, -3143916, 1415192, 755914, 2384781, 837519, -11672647, -13580150, -4529580, 3051038, -443455, -8002598, -1695438, 10617159, 9104794, 7903277, --2171643, -13518410, -6183679, 4934918, -1544041, 9131100, -532039, -142808, -6755984, -4150549, -7943542, -9679246, 6652905, 5239860, -7006166, -3436511, -1629403, 1167157, -7543037, 3717831, -2612414, -3656628, -1154809, -10241886, 3730716, 8013872, 11384348, 1053341, 3061775, 5451924, -1673964, -8934606, 6178848, -2095944, 1027034, 89121, -2879776, -3037616, -1654099, 4250944, -758599, 3564823, -368830, 642098, -4985920, -1635309, -2283849, 3848828, -364535, -1555315, -2633889, -1851131, 2069101, -1151051, 357556, -4060355, 991601, -888521, -835371, -2576444, -974958, -343597, -2309082, -4196720, -930934, 502511, -1692754, 1810329, -419833, -18180596, --1197759, 2569464, 12206834, 1600412, -567473, 7492571, -5442798, 16170552, -16139413, -1471026, --3506841, 2764348, -847719, -1242319, 4068408, -2954401, -5526549, -3578782, -3290482, -9576703, --1585917, 6928319, -1634235, -4216048, 10147934, -87510, 12218645, -11936251, -6935299, 15265388, --1601486, -854162, 850940, -9494025, -1163936, -11870216, 3447248, -14262513, -410706, 10726681, --3526705, 7333657, 9503689, 5623186, 7474317, -9621800, 9616969, 1146756, -25310242, -4173635, -3636227, -1990181, -2851322, -10758356, 8505109, -9157944, -1853278, -10395431, -9862319, -15130633, -13530221, 174483, 15776489, -7794829, 11884711, 15880642, -10414222, 12956306, -15870441, -13090523, --14368276, -4904853, -10131828, 3325379, 4738423, -470299, -1892470, 4295, -11365557, 976031, -104153, 6640557, 2570001, 2656437, 4640712, 2728378, -2485712, -4832, -4634807, -2656437, -106300, 1984275, 67109, 2231773, -1530082, 2392834, -705985, 1315334, -7039989, 531502, -2676302, 2148021, 3904662, -2115808, -3106335, -4014184, -99321, -241592, -3290482, -3471407, -374199, -467078, 606127, 137439, -1041530, 1984275, 5607617, -1252520, -1299228, -590021, --1517197, 5153961, 215285, 729608, -1724966, 3114388, -3245922, 11993696, 20028506, 2945811, --5415954, -10795400, 6681359, 18581640, 106300, 5370857, 886374, 7451769, 5025649, 5732708, -10017474, -12103755, -1040993, -4459787, 15827491, 11863773, -657667, 18370648, 9598178, 1700807, --17302812, -8478802, -13214541, -6011344, 1249299, 5012764, -4796405, 763967, 18533320, -3420405, --72478, 1022202, 19043884, -11623255, -4800163, -4691715, -1969779, -11372000, 13087302, 955093, -8746164, -13656922, 1775432, -1423245, -8272107, -3179350, -15247671, 4823785, 188979, 3260954, --1960653, -849330, -17687750, -5908802, 6769942, 11247982, -3345780, 2993592, 23278186, -1450625, -1251446, 4361540, 10435697, -9841381, 2168422, 11912629, -7131793, 8676908, 2420214, 9039832, --12039867, -6008659, 1512902, 2794950, 5938866, 6905771, 6445672, -4436165, 1791001, 4098473, -7820599, 12406550, 5616207, -5819144, -2843268, -4570919, 1884954, 2653753, 5273683, 4935455, -2847027, 5210332, -5680094, -1081258, -5791227, 4926865, -6619082, 6626598, 4633733, -4909685, -2808372, -573378, -3126199, 760209, 884763, -1753420, 1393180, 8210904, -363998, 4295, --5146982, 2596845, -333934, -147640, -4683662, 4702989, -4000225, 1476395, 1912334, 3726421, --521839, -1767379, -10999948, -16581795, 4552129, -1715303, -16881906, 4677220, 1620813, 15308337, -13403519, -12427488, -15064598, 3427921, -11517492, -5960878, 405338, 22770842, 256624, -2822867, --20361366, -10101226, -1819456, -15075335, -23065584, 15842524, -5993090, -7202124, -1382980, 17176112, --5414343, 1933272, -3488587, -3375844, -10000294, -5243618, 1616518, -23967528, -15505906, -4381941, --8819715, -8077760, -2858301, -9368934, 8121783, 3799972, 2573222, -5690295, 4088809, -34624952, -32208496, 18988050, -3309809, -4342749, 18103824, 1151588, -10894185, -15399605, -2005213, -5366562, --6471979, -9242770, -9533754, 11924977, 11041824, -4961761, 24297166, -13474386, -11141682, -9973988, -32749, 8002061, -28521804, 8476118, -9035001, 14947023, -16170015, 7137162, -1485522, -5415954, -11130945, -20936354, 19710142, 1171989, -277025, -4396436, 570157, -239981, -9972914, 2005213, --2764348, 5252208, 6631967, -6043019, 3032247, 4286378, 9312563, 382252, -3040837, -473520, --832150, -3656628, 2730526, -1400696, -2230699, 2428267, -3695819, -1129040, 906775, 2727841, -3200288, -7396471, -5692979, -4888210, 848256, 3095061, 4832, 2057826, 1742146, 5035313, -2610266, -3996467, 3762928, 794032, 16538845, 1338956, 38529076, 12519830, -760746, 1628866, --14881525, -19330038, 24067386, -7153268, 2741800, 31899796, -8306467, -1573569, -6818798, 24867324, -4799089, -10327249, 14707579, -5379984, 21840982, 11426224, 5444408, 3198140, -2415382, -8396661, --2724083, -2306398, -23408646, -5920613, -3773666, 12909061, -7254200, 2400887, 4300873, -16813186, --24991878, -934692, 21563958, -1484985, 19153944, -3364033, -26796300, -10417980, 1206349, 6024229, -4831302, -21835076, 168577, -6285685, 15806017, -16216723, 19984482, 29532732, 19161460, -6071473, -3554622, 11883638, -4280472, 23127862, 26796300, 23600308, 7701950, 25882546, -914291, -10501732, -3321084, -13615046, -17154636, 9290551, -7383049, 21140366, 10915123, 5566278, -7318088, -26153130, --23701778, 16550656, -10518912, -21174188, 14054207, 28098750, 16879222, -9087077, 13391171, 8195872, --2977486, -6713571, 7924752, -10069014, -3096135, -1133871, -6956237, 853625, -1549410, 5735929, -3447248, -1406065, -9246528, 5060009, 4594005, 3152506, -2057289, 237297, -8654896, 630286, --164283, 2165201, 1935957, 159451, 5028870, -1846836, 6987375, 7923141, 1977833, 6422050, -500901, -5196374, -12269648, 2691334, 195958, 2556579, -8739185, -19440632, 11376831, 14249628, --226560, 6978785, 4683125, 6906845, 5720897, 2640868, -1551557, 3381213, -4082903, 7413114, --13218836, -36822904, -14781130, 20212652, 1165547, -5989869, -12335146, -48855, 16984448, 21711060, -4622459, -13285944, -2347737, 17376364, -20996484, 2033130, -2616172, 15556372, 17717276, -14171245, -26881126, 5252208, 1070521, 38012072, 186831, -11866995, 13296145, -6294275, 1896228, -8061654, -2820720, 25285010, 2910377, 32197760, 13566191, -28009630, -30719754, -6656126, 7989713, 17226576, --23819888, -8364986, -3442953, 28999082, 26505316, -22632868, -875100, -13785771, 8751533, -4716411, -30305290, 457414, -6654515, 19951734, -4038880, -23456428, -11859478, -3790309, 24443196, -21597780, -13128641, 38024420, 17992154, 25543782, -6802155, 10424959, -6852084, -15698642, -15131707, 8032663, --10749766, -658204, -3843996, 6997576, -150861, 15489800, -3435974, -7026567, -2491618, -3019362, -3823595, -2374043, 5970542, -10502806, 7847442, -6919729, -3157875, 2257542, -2741263, -3217468, -4976257, -4563403, -1717987, -1297080, -3787088, -12921409, -7282654, -1177358, -1467805, -3754875, --5036386, -1109175, 3937948, -2175938, 2349347, -1911261, -48855, 3045132, -9907416, 1202591, --1323924, -7447474, -17706540, 13146895, 19843822, 16188805, -28328530, -13806709, 18223010, 54374284, -3524558, 11644730, -15629386, 4714801, -564251, -2777233, -14659797, 4283156, -5008469, 25975962, -21001854, -27604292, -11901891, 28723668, 14928769, 10177999, 3313031, 15414638, 18474802, 5581310, -11147588, 9820443, -12970264, 1717987, -12693776, -6036040, 3821984, -2775623, 2462627, -11403675, --9755481, 7524783, -1789391, 10465225, 8708583, -25547540, 19199040, 3548180, 15517717, -17320530, -10096931, 15140833, -11615739, -19748260, -19352586, -21846888, -21328270, -18146236, 6762426, 31751620, -8811125, 9626632, 15506979, 832150, 80531, -12704513, 21788906, -27391154, -54125716, 18441516, --12057584, 2142652, -45846628, 11192685, 15124727, 2291902, 9683541, 7556995, -6382859, -12055973, --17862768, 5582384, 4575214, -14222784, 10740103, -5556077, -23147190, -13154948, 270583, -4474282, -3052648, 1358820, 7583302, 3033858, 1840930, -702227, 6148246, -3668439, -6978785, -13674102, --7472170, -8926553, -2421825, -5041755, 5560909, 7340099, 6284611, -10956462, -269509, -4762045, -690416, 5903433, 2501282, -9721658, -16885128, -1766305, 1374926, 1189169, -5597953, -2913062, --5875516, -1598802, -7871065, -9251360, 6471442, -9050570, 4286378, 1190243, -3856344, -2076617, -6243809, -5339718, 2815351, -6425808, 12955232, 9335111, 12373801, -17663590, -9186935, -2483028, -11310796, -23572928, 39220032, 18641232, -3214246, 21401286, 12845710, 20395190, -10735808, -13726179, --13350369, 24702504, 8761196, 4461934, 22265648, -19505058, -63164472, -4206921, 4205310, 7514046, --35561256, 27550068, 20020990, -38170448, -29395830, 941672, 15718507, 1335735, 8924405, 20235738, --5377836, 12564927, -18450106, -21112448, -16843252, -21932250, -34155192, 9514963, 3531000, -22924924, -30259118, 11765526, -7399692, -7213935, -17869212, -13380434, -31133144, -16909286, 11068668, 27624156, --10525354, 2771328, 11363410, -24500640, 17680232, 23939074, 3529390, -6134824, 20459614, 5603322, -2304787, -14666240, -17151952, -1257889, 30589830, -9407052, -28225452, -496069, -35967128, -37468220, --39023000, -18714246, -20589000, -13150653, 16783122, -2357937, 15087683, -3118683, -4981625, -14121852, --3795677, -4162897, 8103530, -6207839, -9025337, -1788317, -3542274, 1322313, -13158706, 2486249, --6066642, -5273683, 6960532, -6310381, -2102387, 2272038, -4685810, 10243497, -6499896, 1526861, -16632798, 2032056, 9716827, -3725884, -5842766, 16851304, 2524904, -8943196, 325881, 159451, -1309428, 2381023, -4785668, 10519449, 638876, -810138, -5092221, -5299990, -13875429, -23840290, --12567074, -12778065, 15522012, 30690226, 11274289, -13899051, -29560112, 31750546, 17027934, -15205795, --8256538, -8075076, 1763621, 7540352, -9771051, 16550656, 15305116, 949725, -10292889, -9657771, --9183177, -1079111, 5959267, -4523138, -10158135, -24086714, 7467338, 21381420, -12200928, 18919868, -591632, 12738873, -10528575, 14154065, 40736156, -15138686, 17794050, 35489316, 6168110, -6068252, --9789841, 10383083, 797253, 18179522, -13775571, 48664128, -14984604, -32457068, 7524783, -14716705, -38448548, 12723841, -11969000, 2341294, -23126252, -31649078, 39046084, 4596152, -10449119, 38668664, --19907174, 5161477, -11220602, 22471806, -28434294, -31832686, -22764938, 7237020, 13805636, 25717190, -10983842, 27173184, 42429980, -5071820, 8588861, -5450851, 5419712, -1207423, 1775432, -30998926, -1231582, -42861088, -14289356, -8331700, 7686381, -1306744, 9491341, -3260417, -12789339, -13367549, --3021510, -8786966, -9838159, -16993574, 71404, -1640141, 13100187, 5711770, -10484015, 9805410, -4594005, 8121247, 10595684, -13542569, 3916473, -5526013, -2513630, 13915157, -4498978, 7023882, -9374303, -5369783, -14806363, -7420093, 5553393, -24347632, -7553774, 745714, -3357591, -5348845, -11200201, -11392938, -12699681, 9190693, 15025943, -6623914, 12574591, 29877940, -4532264, 991601, -35536024, 4003447, -19628000, -22526566, -20145008, 36733780, -24728274, 14656576, 17016660, -11629698, -3352222, -19990926, -4752918, 16481937, -14785425, 11943767, -5097053, -25145422, -55720220, -4811437, -49689012, 21070036, 4876399, -9701794, -15259482, -2533494, -19949050, 6592775, -28023050, 33472828, -2208150, 4249334, 2476049, -10977936, -33741264, -12559021, 26640608, -21705154, -5879274, -14934138, -11766600, -10619307, 36964636, -5727876, 7432978, -13288092, -34977140, 7981123, -26759256, -5687074, --2563559, -48351668, -41267120, -38490424, 12656732, -6849399, -21226802, -13350906, -13655849, -12075301, --18961744, -12327093, -3463891, -43352864, 11997991, 5214091, 15904801, -9352291, 37757596, -3638374, -7130720, -12834436, -5415417, 20799452, -40695888, 17546552, 26377542, -26908506, -17811230, 1986422, -4131759, -6863895, -13260175, -20995948, -1468342, 830539, -13012140, 11280195, -9633075, -16652662, --9534827, -6959995, 10626823, 41339, 228170, -46708, 7908109, -20578262, -6120329, -2177549, --4191351, -1109175, 236760, -24732032, 678605, -7779260, -6727530, -1816234, -11340861, 3418794, --3296924, 2597918, 356482, -1842541, -2891587, -5918465, -1125818, -4799626, -1291175, 3838090, --5774584, -8848706, 193810, -1879048, -2137820, -5409512, -10257993, -6585259, -2696166, -959388, --7306276, -8523899, 15101642, 9137006, 18274012, -6885370, -37983616, 10957535, 547071, 63074280, -64555504, 7809861, 638340, 15210090, 7630547, 16247861, 27861990, 10386305, 28930900, 43713640, --10875931, 5745056, -35893580, -5079336, 4712653, -4630512, -10671383, -21758842, -18297098, 10155450, -10094247, -47696148, 34062848, 9213779, 48064980, -2913062, -9487583, 15726023, -3299609, 50594176, -12910135, -2574833, 9759239, 10023380, -13534516, -30871152, -24184424, -12126303, 37795712, 520765, -41540924, 5119064, 40614820, -11687143, -55794308, -20871394, -16171089, 28922310, 3556770, -27109834, --39269960, -27438398, -5438503, 33962992, -29502668, -25703232, -16914654, 30313880, -14892262, -8810052, --39094940, -38916160, 12319577, 6593849, 52465172, 13494250, -5510443, -14170708, 16480863, 17037062, -56013352, 1029718, -18096844, -24230594, -1519882, -2484102, 1318018, 8719320, 8097624, -13026636, --2909304, 4235912, 11705396, -12509629, -10132365, 15741055, 23200876, 10779831, 7122667, 9018358, --9742596, -4151086, -6127308, -1267552, -1287953, 5097053, 85899, 30245160, 6361921, -1289027, --9226127, -15870441, 15187541, 24546274, -8871255, 406411, 972273, 3073049, 14066018, 6128382, -10452340, 10663867, 2725157, 8301098, 2735894, -521839, 2747169, -7472706, -2521146, 1833951, --4502737, 3000035, 834297, 38602092, 14665166, -18761490, 36384280, -2258616, -71459128, -21762600, -45081052, 50075560, -35225176, -35275104, -35851164, 20013474, 30675194, 61288648, 18563386, 7913477, --34941168, -3547106, -2142115, 13787382, 30690226, 22279070, 1821066, -37072012, -72007272, -19088982, --36420248, 54196580, 57408680, 100153272, -29974576, -96321624, -20967494, -33091650, 74884904, 25467008, -75950592, 19563576, -25353192, -73385960, -49598820, 2676302, 9162239, 82287280, 33450816, -2855080, --67693520, -118132536, -30859340, 2531883, 54611584, 124311384, 27124866, 37490768, -80071072, -122729224, -5336497, 28198070, 97774392, 57475252, 41108204, -22666154, -79050480, -64680060, -586800, 18269718, --1653562, 49363132, -40691592, -38103340, -9395778, -87188376, 13684303, 4220879, 23860154, -17491254, --35190816, -18927920, -14832670, -39857832, 9250823, 11718818, -12674448, -1951526, -37356016, 5402532, -10960757, 12402255, 17563196, 5640366, -19050328, 6805913, -5920076, -3223373, 2971581, 30514668, -5404680, -855772, -7584912, -23023172, -4338991, -9116068, 9148817, -4061965, 10135049, 6593312, --20958366, -47856672, -23409720, -35104916, 29070486, 29211146, 34749508, 19983410, -44502840, -40161704, --62154084, -14856829, 50918984, 56259240, 54912768, 2928631, -59928752, -44844292, -34774740, -459025, -90200216, 62625456, 25804700, -47888884, -55661164, -41700912, 21055540, 21694954, 31549756, 16687022, --40980968, 54459648, -1176821, 7904351, -22922240, -51873004, 30904974, -52236464, 55338508, 7938174, -4949950, 11547020, -33254322, 32855426, 3244848, 22789634, -31886374, 11112691, 288300, 39460012, --15760919, 9568113, 26436598, -30236032, -17331266, 2706903, -27411556, 44295072, -9966472, -18569292, -40039832, 45774688, -12285217, -34279744, -8369818, -30247844, -5507759, 18283676, -2859911, -37618008, -4498978, 19845434, -13111998, 22414360, -18752900, 8483097, 24357834, -10032507, 16071231, -42824044, --42765528, 43270184, 24326158, 66935456, -2711198, -17383344, 57126288, -32897838, -28928752, 19666656, -19335406, 32005560, -29309930, -14392972, 8774618, -6622840, 32405528, -26225070, -79995376, 20433844, -44885092, 198642, -37009732, 6621229, 22899692, -9356586, -9599252, -30296162, -9541270, -25084220, -24934432, 5625871, -17315698, -5140002, 29758218, -21465710, -7372312, -19445464, -2120103, 13947369, --20779588, 10721312, 31092878, 11436424, -318364, -9274982, -1622961, -11913166, -14329622, 22974854, --9671729, 10188736, -3175055, -12416214, 15569, 2090039, 2326799, 8078297, 10429791, -18347564, --5348845, 8441758, 7560216, 17296908, -2259153, -15844134, 6171331, -18377628, 8650601, -16787416, --9089761, -167504, -3445101, -11410117, 25222196, -11448772, 5239323, 10506027, 2426120, 8137890, -16754131, -773094, -2921652, 352187, -1607392, -21079700, -13284871, 81321448, 22005264, 22775138, --68911680, -16933446, -54024784, -45222784, 40838696, 43418900, 85287848, 39750460, -11553999, -16203838, --10047539, 27310086, 18688476, 923418, 41450192, 8454643, -16617228, -19274740, -15882252, 30211874, -537, 26470420, 12175695, 16123307, 3930969, -6199249, 3040300, 184684, 3921842, -6441377, --1726577, 8913131, 7199439, 56337624, 45061188, 37189584, -3230352, 10423886, -22807350, -3418794, --14185203, -25347824, -26795764, 8446053, 14618995, 21635360, 26090316, 21866216, -13463112, -34010772, -52285320, -36996312, -16338056, -9218074, 17958332, 2678986, 25611964, 27006754, 23386634, -31127776, --11247446, 4600984, -12330851, -50409496, 33964600, -11593190, -9107478, 19479288, 39417064, 44989244, -32638530, 32206350, 27600534, -29097866, 3864397, -7241852, -9100499, 17056388, 13354127, 18152680, -8719857, -7904888, -14619532, -20953534, -22922778, -45823008, -18379776, 7046431, -2600066, 28324236, --15569, -12572980, -4249870, -18112414, 6997039, 2361158, -1322313, -25233, 11963095, 26539140, --3195456, 1519882, 14541149, 1259499, 206695, -5070746, -1683090, -6060736, -5986648, 1770600, --12498892, 5774047, 7218767, -9040369, -13606456, 3961571, 2796024, -4775467, 13439490, 18158048, --2401424, 2889976, -5794985, -17967996, -7601019, 3164854, -104804720, -52287468, -71967544, 51963200, -11526618, 148824912, 153889216, 153271808, 175218560, 172485344, 123980136, 77103792, 96706024, 42728484, -9036611, -81594712, -70970040, -178185840, -155754848, -139895136, -82375328, -104020888, -79207784, -6532109, --25288768, -10247255, -12466143, 610959, -164283, 4695473, 20350092, 21786222, 20860656, 61398704, -63075888, 66788352, 47769164, 133620192, 34977676, 56150792, 93598608, 104272144, 38807176, 104938400, -126357400, 99567008, 86523192, 87900264, 9714679, 52613888, 106351984, 105009264, 67740760, 88117696, -77115064, -1087164, -28503550, -20133732, -52526376, -64896420, -8314520, -72931768, -111143016, -86681032, --103520520, -153177856, -70061120, -103588168, -114740592, -162576864, -132140040, -149934080, -171213504, -114138752, --193598336, -229101072, -229861280, -125153200, -155537952, -196093168, -38527468, -87366616, -40964324, -22058416, -64251636, 28524488, 94267552, 49984292, 89045944, 84693536, 55737940, 43862352, 69034616, 127794064, -130100464, 130478424, 133336720, 138471888, 168346608, 150315264, 124852016, 153456496, 173228384, 138369888, -104129872, 124190056, 104545944, 67436352, 85270672, 57565448, 28636158, 12200928, 26324392, 7577933, --10816875, -7602629, -13939316, -33470144, -50770272, -50589884, -55022288, -47156592, -58822260, -92619360, --83197272, -95718712, -107834816, -125735704, -125299232, -103914048, -104274824, -85602992, -54360328, -61403000, --41811508, -29585882, 2995740, -794569, 15032, 4616553, 18418968, 21089900, 6938520, 16508781, -26843008, 21064130, 9148280, 10420128, 19699404, 11069741, 4416300, 7269769, 10666551, 8989367, -5246840, 4539244, 3424163, 1444720, 352724, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, }, +2813204, -3714073, -630286, 2575907, -455267, 2740726, -6771016, -4831838, -1181653, -5706938, +2391760, -1274532, -627602, -3857418, -1717450, 3578782, 3580929, -1407676, -1089311, -2382633, +-5472325, 6096706, 3630858, 150861, 643171, -341450, 178778, 4908074, -2490544, 894964, +-7861401, -6454262, -1612760, 576063, -5478231, -1026497, 1949378, 462246, 99858, -2760590, +-2114735, 5132486, -2380486, -2204392, -721555, -737124, 2267206, -1200443, -3367254, -130997, +2955474, -4220879, 183073, -4520990, 317828, -3315178, 5005785, -299037, -5273146, -782221, +-511638, 613107, -7530689, -927176, 627065, -5051956, 2318209, 91268, -5801964, 2622078, +3568044, -3114925, -3554086, -6396280, 3340411, 1908039, 5917928, 2898566, -879931, 1127966, +-821413, 1771137, 1881733, 4059281, 1039382, -1803349, -63351, 453119, -133681, 2307471, +604517, -831076, -1134408, 1107565, 907312, 1720671, 873489, 650688, 1046898, 920734, +391916, 558346, -111132, -332860, 373125, 215822, 443992, -279710, 523986, -54224, +-5474473, 2469606, -6828998, -1914482, -948651, -3466039, 3300682, 7637526, -3120294, -1031866, +369367, -3177202, 2207613, -490700, -2563559, -4384088, -2313914, 6886980, 6673306, 3731253, +7750806, 4542465, 2473901, 7275138, -4518843, 1589675, 3128347, -159451, 1268626, -2181307, +1409823, -10103374, 228170, -602906, 3656091, -2300492, -1268626, -721018, 2804614, -3210488, +-501437, 891206, 1979980, 1896228, -522375, -3442416, 663572, 1181653, 2486249, 1848447, +2889439, -3237332, -1896228, -606664, -5696737, -693100, 1534377, 4894115, 5500780, -768262, +3041374, 2235531, -391379, 2020245, 2445447, 3528316, -1402307, -63351, -2637110, 443992, +-2269353, 1560147, -3369402, -3216931, 1941862, -34360, -6310381, -607738, -4720169, -1300301, +-652298, -813896, -6272263, 594316, 2243047, -1868311, -1773822, 1075352, 817118, 446140, +-1224066, -3392487, -151934, -1490891, 1308354, 38655, 113280, -385473, -1375463, -1559073, +-1733556, 119185, -736587, 757525, -1076963, 431107, 289373, -1008244, 3221, -1121523, +-378494, 62277, 31675, -996969, -215285, -170188, -6911676, -6536404, 2436320, -779000, +5430450, 5437966, 459562, 115427, 10492068, -2851322, -238908, 8788040, 374736, -5109938, +-7445326, 5390721, -2171643, 13422, -4607963, 1410360, -3288334, 3652870, 16378321, -5999533, +-4799626, -5927592, -6377490, 1142461, -5199058, -12923557, -315143, 1266479, 41339, -5156108, +-1069447, 4161823, -5258114, -3136400, 7660074, 2488934, -1938641, -1854352, 4935991, -2474975, +3536369, 3190624, -6974490, -4664872, -4125853, 4534949, -3533148, -2141041, -1916092, -2360085, +-357019, -4745402, 48318, -1458678, 1173600, -689342, -10219875, 4705674, -5710696, 4473209, +853088, -8447664, 1716913, 5576478, 1742683, 9313637, -3948149, 467615, 1103270, 2142652, +3359201, -3740380, 1408749, 1184337, -5430450, 7405598, 545461, -1111323, 3174518, -1126355, +1427540, -1419487, -2834142, -256087, -1822140, 2390149, -630286, 404264, 2914672, 944893, +1112397, -710280, 1586990, 216896, -423591, 979253, 2118493, -1597191, 139050, -1682554, +1009317, -595390, 3058554, -4300873, 2004139, 2246268, -2377801, 1107028, -1190243, -9346923, +2860985, 8866960, 7308424, 8319352, 1417876, -1732482, -7130183, -3670050, -3367254, -2624762, +7308424, 10249403, 702764, -636729, 7237557, -11733851, 199179, -887985, -244813, -3778498, +-3999688, 4365298, 5270999, 242129, -1213865, 2191507, -5770289, -4268124, 4354560, -4711579, +9117679, 8373039, 1347546, 5185636, 4275103, 951335, -3790846, 1377074, -246961, -6389838, +6229850, -478889, 2888903, 5182415, -6117644, -2278480, -7261179, -1552094, 1602023, 6849399, +-6998649, -2680597, 5022965, -987843, -4496294, 7507066, -6237367, -12916577, 2137820, -7239704, +-3323768, 3618510, -3195456, 708133, 721555, -3090766, 5494874, -4997732, -5817533, -6842957, +-821413, -2922188, 402116, 1922535, -4289599, 1202054, 1158567, 394600, -2073932, 1203128, +848256, 2979634, 379031, -849330, -2042794, -1196685, -938987, -436476, -759672, -1150514, +318901, 647466, 782221, 345745, -443992, -903554, -450972, 1523640, -1527398, -1452236, +-512712, 41339, -192200, 1185948, 1248225, 1305133, -818191, 513785, 207232, 566936, +2841121, -1412507, 181999, -11762842, 2518998, 11068131, 907312, 1724429, 3380676, 10368051, +1440425, -9990094, 11094437, 4859219, 4020626, 6736120, 5871757, 40802, -2050310, 6354404, +4887673, 1658931, -4551592, 5527086, 2629594, 8185134, 9579925, 3631932, -2328946, 216359, +-41339, 3980898, 12155831, 7204808, -6700149, 11737609, 501437, -1444720, 1583232, -8654359, +9651865, -1279900, 207232, -1147830, 2487323, -1297617, 5002027, -6977711, 9862319, 8382703, +-276489, -1561758, -5426691, -10408853, -3534758, 4135517, -2385318, -3901978, 5562520, 6486475, +-4350802, -3905199, -13313862, -4627828, -1611150, -646393, -14901926, 7614440, 878321, -8894340, +-7272990, 2458869, -3427384, 913754, -2166274, 485331, -3889630, -861141, -3464428, 2541547, +5034776, -1403917, 3841848, 457414, -1534377, 4477504, 1602560, 233002, 3729105, -418222, +-1635309, -2308008, -2567854, -2717641, -2546379, -3178276, -2285460, 175020, -1241246, -2981244, +-1432909, 314606, -592706, -1100049, 687732, 1228361, 632434, -1351841, -1903207, -2405182, +307627, -2280091, 2167348, -1245004, -1276142, -1228361, 91805, -871342, 5510980, -6960532, +-55835, 71941, 258235, 11242614, 6184753, -97711, 14018773, 6475200, 12658342, 3018825, +4289062, 13502840, -5328981, -8999567, -5679021, 12625593, 3105798, -7122667, 9648644, -2635499, +-5602785, 8607651, 20452634, -5272609, 1051193, 3264712, 3933653, -5313412, 703838, 11249056, +1238561, 13832479, -2978560, 14854144, 10544682, 3559454, 8847633, 5580237, -5247377, 3694746, +-1315871, -1321776, 1463510, 1009854, -914291, 3919695, 2764348, 9598178, 6519761, -8021925, +2855617, 3614215, -5865852, 354335, -13913010, -18104898, 7311108, -4637491, -11766600, -2537789, +-6302328, 7799661, 1782411, -3675955, -8859444, 6997039, -6388227, 4269198, -7176354, 1067299, +-2840047, 10972031, 2128693, -4281546, 4310000, -9354439, 8608188, 1389422, -7955890, 368830, +-740345, -2308008, -872415, 1147830, 2474438, -2339684, 4021163, -869194, -1444720, -1781338, +-1285269, -3463891, -179852, -1229971, -3255048, -1240172, 1313186, -2081985, 2254858, 332323, +-1086627, 571768, -2122251, -413927, -1446867, -192200, 44560, 107911, 1218697, 1344325, +1615982, 71941, 879931, -70867, -7922604, 1064078, 321049, 2102387, -4827007, 5466420, +6038724, -651224, -4014721, -13911399, -11913702, -9175661, 4292283, 1243930, 2233920, -11404212, +7247221, 5103495, 9015136, -9776419, 9297530, 7135552, -5594732, -4655745, -2815351, 9450002, +6540699, -4150549, 959388, 14297946, 7268159, 3695283, 8308614, 5698348, 2254321, -4725538, +1098438, 665183, -1985886, -5245766, 12724914, 5937256, -11786464, 7996692, 7975755, 7920457, +6233072, 1682554, -7333120, 236223, -948651, 11083700, 1505386, 4962835, 10088878, -1787243, +-10938208, 2454574, 5947993, 11201275, -14872935, -8392366, 4127464, 176094, 1417876, -8813273, +-2139968, -8545374, -1146756, 4093104, -2773475, -4662187, -5649493, 2439005, -1365263, -2820183, +-6995428, 285078, -9381282, -148176, -865973, -4750771, -5264020, 6082748, -2032593, -1480690, +-2959233, -5779952, 2108829, 2829847, 1992865, 2222109, 1644973, -3179350, -1689533, -947040, +-734439, -2986076, -5604396, -2481417, -87510, -1890323, -111669, -3002182, 321586, -1614908, +-1098975, -2173254, -2417530, -1268089, 2536178, -1758789, -803159, 404264, 1063004, 686658, +-1144609, 1914482, 2885144, 2882460, -724776, 5284958, 686658, -9248138, 9418863, 6054294, +-2816962, 3745748, 5673652, -6251325, -2115808, 24105504, -789737, 9405978, 6573985, -20106890, +-10696616, -1123671, -848793, -225486, 11422466, 2575370, -5562520, 11818139, 7251516, -1465658, +-1941325, 3781182, -1924145, -4159139, -8966818, -10610180, 5876589, -2314451, -5007932, -503048, +-16554415, -3060164, 1091459, 9152575, -10938208, -3143916, 1415192, 755914, 2384781, 837519, +11672647, -13580150, -4529580, 3051038, -443455, -8002598, -1695438, 10617159, 9104794, 7903277, +-2171643, -13518410, -6183679, 4934918, -1544041, 9131100, -532039, -142808, -6755984, -4150549, +7943542, -9679246, 6652905, 5239860, -7006166, -3436511, -1629403, 1167157, -7543037, 3717831, +2612414, -3656628, -1154809, -10241886, 3730716, 8013872, 11384348, 1053341, 3061775, 5451924, +1673964, -8934606, 6178848, -2095944, 1027034, 89121, -2879776, -3037616, -1654099, 4250944, +758599, 3564823, -368830, 642098, -4985920, -1635309, -2283849, 3848828, -364535, -1555315, +2633889, -1851131, 2069101, -1151051, 357556, -4060355, 991601, -888521, -835371, -2576444, +974958, -343597, -2309082, -4196720, -930934, 502511, -1692754, 1810329, -419833, -18180596, +-1197759, 2569464, 12206834, 1600412, -567473, 7492571, -5442798, 16170552, -16139413, -1471026, +-3506841, 2764348, -847719, -1242319, 4068408, -2954401, -5526549, -3578782, -3290482, -9576703, +-1585917, 6928319, -1634235, -4216048, 10147934, -87510, 12218645, -11936251, -6935299, 15265388, +-1601486, -854162, 850940, -9494025, -1163936, -11870216, 3447248, -14262513, -410706, 10726681, +-3526705, 7333657, 9503689, 5623186, 7474317, -9621800, 9616969, 1146756, -25310242, -4173635, +3636227, -1990181, -2851322, -10758356, 8505109, -9157944, -1853278, -10395431, -9862319, -15130633, +13530221, 174483, 15776489, -7794829, 11884711, 15880642, -10414222, 12956306, -15870441, -13090523, +-14368276, -4904853, -10131828, 3325379, 4738423, -470299, -1892470, 4295, -11365557, 976031, +104153, 6640557, 2570001, 2656437, 4640712, 2728378, -2485712, -4832, -4634807, -2656437, +106300, 1984275, 67109, 2231773, -1530082, 2392834, -705985, 1315334, -7039989, 531502, +2676302, 2148021, 3904662, -2115808, -3106335, -4014184, -99321, -241592, -3290482, -3471407, +374199, -467078, 606127, 137439, -1041530, 1984275, 5607617, -1252520, -1299228, -590021, +-1517197, 5153961, 215285, 729608, -1724966, 3114388, -3245922, 11993696, 20028506, 2945811, +-5415954, -10795400, 6681359, 18581640, 106300, 5370857, 886374, 7451769, 5025649, 5732708, +10017474, -12103755, -1040993, -4459787, 15827491, 11863773, -657667, 18370648, 9598178, 1700807, +-17302812, -8478802, -13214541, -6011344, 1249299, 5012764, -4796405, 763967, 18533320, -3420405, +-72478, 1022202, 19043884, -11623255, -4800163, -4691715, -1969779, -11372000, 13087302, 955093, +8746164, -13656922, 1775432, -1423245, -8272107, -3179350, -15247671, 4823785, 188979, 3260954, +-1960653, -849330, -17687750, -5908802, 6769942, 11247982, -3345780, 2993592, 23278186, -1450625, +1251446, 4361540, 10435697, -9841381, 2168422, 11912629, -7131793, 8676908, 2420214, 9039832, +-12039867, -6008659, 1512902, 2794950, 5938866, 6905771, 6445672, -4436165, 1791001, 4098473, +7820599, 12406550, 5616207, -5819144, -2843268, -4570919, 1884954, 2653753, 5273683, 4935455, +2847027, 5210332, -5680094, -1081258, -5791227, 4926865, -6619082, 6626598, 4633733, -4909685, +2808372, -573378, -3126199, 760209, 884763, -1753420, 1393180, 8210904, -363998, 4295, +-5146982, 2596845, -333934, -147640, -4683662, 4702989, -4000225, 1476395, 1912334, 3726421, +-521839, -1767379, -10999948, -16581795, 4552129, -1715303, -16881906, 4677220, 1620813, 15308337, +13403519, -12427488, -15064598, 3427921, -11517492, -5960878, 405338, 22770842, 256624, -2822867, +-20361366, -10101226, -1819456, -15075335, -23065584, 15842524, -5993090, -7202124, -1382980, 17176112, +-5414343, 1933272, -3488587, -3375844, -10000294, -5243618, 1616518, -23967528, -15505906, -4381941, +-8819715, -8077760, -2858301, -9368934, 8121783, 3799972, 2573222, -5690295, 4088809, -34624952, +32208496, 18988050, -3309809, -4342749, 18103824, 1151588, -10894185, -15399605, -2005213, -5366562, +-6471979, -9242770, -9533754, 11924977, 11041824, -4961761, 24297166, -13474386, -11141682, -9973988, +32749, 8002061, -28521804, 8476118, -9035001, 14947023, -16170015, 7137162, -1485522, -5415954, +11130945, -20936354, 19710142, 1171989, -277025, -4396436, 570157, -239981, -9972914, 2005213, +-2764348, 5252208, 6631967, -6043019, 3032247, 4286378, 9312563, 382252, -3040837, -473520, +-832150, -3656628, 2730526, -1400696, -2230699, 2428267, -3695819, -1129040, 906775, 2727841, +3200288, -7396471, -5692979, -4888210, 848256, 3095061, 4832, 2057826, 1742146, 5035313, +2610266, -3996467, 3762928, 794032, 16538845, 1338956, 38529076, 12519830, -760746, 1628866, +-14881525, -19330038, 24067386, -7153268, 2741800, 31899796, -8306467, -1573569, -6818798, 24867324, +4799089, -10327249, 14707579, -5379984, 21840982, 11426224, 5444408, 3198140, -2415382, -8396661, +-2724083, -2306398, -23408646, -5920613, -3773666, 12909061, -7254200, 2400887, 4300873, -16813186, +-24991878, -934692, 21563958, -1484985, 19153944, -3364033, -26796300, -10417980, 1206349, 6024229, +4831302, -21835076, 168577, -6285685, 15806017, -16216723, 19984482, 29532732, 19161460, -6071473, +3554622, 11883638, -4280472, 23127862, 26796300, 23600308, 7701950, 25882546, -914291, -10501732, +3321084, -13615046, -17154636, 9290551, -7383049, 21140366, 10915123, 5566278, -7318088, -26153130, +-23701778, 16550656, -10518912, -21174188, 14054207, 28098750, 16879222, -9087077, 13391171, 8195872, +-2977486, -6713571, 7924752, -10069014, -3096135, -1133871, -6956237, 853625, -1549410, 5735929, +3447248, -1406065, -9246528, 5060009, 4594005, 3152506, -2057289, 237297, -8654896, 630286, +-164283, 2165201, 1935957, 159451, 5028870, -1846836, 6987375, 7923141, 1977833, 6422050, +500901, -5196374, -12269648, 2691334, 195958, 2556579, -8739185, -19440632, 11376831, 14249628, +-226560, 6978785, 4683125, 6906845, 5720897, 2640868, -1551557, 3381213, -4082903, 7413114, +-13218836, -36822904, -14781130, 20212652, 1165547, -5989869, -12335146, -48855, 16984448, 21711060, +4622459, -13285944, -2347737, 17376364, -20996484, 2033130, -2616172, 15556372, 17717276, -14171245, +26881126, 5252208, 1070521, 38012072, 186831, -11866995, 13296145, -6294275, 1896228, -8061654, +2820720, 25285010, 2910377, 32197760, 13566191, -28009630, -30719754, -6656126, 7989713, 17226576, +-23819888, -8364986, -3442953, 28999082, 26505316, -22632868, -875100, -13785771, 8751533, -4716411, +30305290, 457414, -6654515, 19951734, -4038880, -23456428, -11859478, -3790309, 24443196, -21597780, +13128641, 38024420, 17992154, 25543782, -6802155, 10424959, -6852084, -15698642, -15131707, 8032663, +-10749766, -658204, -3843996, 6997576, -150861, 15489800, -3435974, -7026567, -2491618, -3019362, +3823595, -2374043, 5970542, -10502806, 7847442, -6919729, -3157875, 2257542, -2741263, -3217468, +4976257, -4563403, -1717987, -1297080, -3787088, -12921409, -7282654, -1177358, -1467805, -3754875, +-5036386, -1109175, 3937948, -2175938, 2349347, -1911261, -48855, 3045132, -9907416, 1202591, +-1323924, -7447474, -17706540, 13146895, 19843822, 16188805, -28328530, -13806709, 18223010, 54374284, +3524558, 11644730, -15629386, 4714801, -564251, -2777233, -14659797, 4283156, -5008469, 25975962, +21001854, -27604292, -11901891, 28723668, 14928769, 10177999, 3313031, 15414638, 18474802, 5581310, +11147588, 9820443, -12970264, 1717987, -12693776, -6036040, 3821984, -2775623, 2462627, -11403675, +-9755481, 7524783, -1789391, 10465225, 8708583, -25547540, 19199040, 3548180, 15517717, -17320530, +10096931, 15140833, -11615739, -19748260, -19352586, -21846888, -21328270, -18146236, 6762426, 31751620, +8811125, 9626632, 15506979, 832150, 80531, -12704513, 21788906, -27391154, -54125716, 18441516, +-12057584, 2142652, -45846628, 11192685, 15124727, 2291902, 9683541, 7556995, -6382859, -12055973, +-17862768, 5582384, 4575214, -14222784, 10740103, -5556077, -23147190, -13154948, 270583, -4474282, +3052648, 1358820, 7583302, 3033858, 1840930, -702227, 6148246, -3668439, -6978785, -13674102, +-7472170, -8926553, -2421825, -5041755, 5560909, 7340099, 6284611, -10956462, -269509, -4762045, +690416, 5903433, 2501282, -9721658, -16885128, -1766305, 1374926, 1189169, -5597953, -2913062, +-5875516, -1598802, -7871065, -9251360, 6471442, -9050570, 4286378, 1190243, -3856344, -2076617, +6243809, -5339718, 2815351, -6425808, 12955232, 9335111, 12373801, -17663590, -9186935, -2483028, +11310796, -23572928, 39220032, 18641232, -3214246, 21401286, 12845710, 20395190, -10735808, -13726179, +-13350369, 24702504, 8761196, 4461934, 22265648, -19505058, -63164472, -4206921, 4205310, 7514046, +-35561256, 27550068, 20020990, -38170448, -29395830, 941672, 15718507, 1335735, 8924405, 20235738, +-5377836, 12564927, -18450106, -21112448, -16843252, -21932250, -34155192, 9514963, 3531000, -22924924, +30259118, 11765526, -7399692, -7213935, -17869212, -13380434, -31133144, -16909286, 11068668, 27624156, +-10525354, 2771328, 11363410, -24500640, 17680232, 23939074, 3529390, -6134824, 20459614, 5603322, +2304787, -14666240, -17151952, -1257889, 30589830, -9407052, -28225452, -496069, -35967128, -37468220, +-39023000, -18714246, -20589000, -13150653, 16783122, -2357937, 15087683, -3118683, -4981625, -14121852, +-3795677, -4162897, 8103530, -6207839, -9025337, -1788317, -3542274, 1322313, -13158706, 2486249, +-6066642, -5273683, 6960532, -6310381, -2102387, 2272038, -4685810, 10243497, -6499896, 1526861, +16632798, 2032056, 9716827, -3725884, -5842766, 16851304, 2524904, -8943196, 325881, 159451, +1309428, 2381023, -4785668, 10519449, 638876, -810138, -5092221, -5299990, -13875429, -23840290, +-12567074, -12778065, 15522012, 30690226, 11274289, -13899051, -29560112, 31750546, 17027934, -15205795, +-8256538, -8075076, 1763621, 7540352, -9771051, 16550656, 15305116, 949725, -10292889, -9657771, +-9183177, -1079111, 5959267, -4523138, -10158135, -24086714, 7467338, 21381420, -12200928, 18919868, +591632, 12738873, -10528575, 14154065, 40736156, -15138686, 17794050, 35489316, 6168110, -6068252, +-9789841, 10383083, 797253, 18179522, -13775571, 48664128, -14984604, -32457068, 7524783, -14716705, +38448548, 12723841, -11969000, 2341294, -23126252, -31649078, 39046084, 4596152, -10449119, 38668664, +-19907174, 5161477, -11220602, 22471806, -28434294, -31832686, -22764938, 7237020, 13805636, 25717190, +10983842, 27173184, 42429980, -5071820, 8588861, -5450851, 5419712, -1207423, 1775432, -30998926, +1231582, -42861088, -14289356, -8331700, 7686381, -1306744, 9491341, -3260417, -12789339, -13367549, +-3021510, -8786966, -9838159, -16993574, 71404, -1640141, 13100187, 5711770, -10484015, 9805410, +4594005, 8121247, 10595684, -13542569, 3916473, -5526013, -2513630, 13915157, -4498978, 7023882, +9374303, -5369783, -14806363, -7420093, 5553393, -24347632, -7553774, 745714, -3357591, -5348845, +11200201, -11392938, -12699681, 9190693, 15025943, -6623914, 12574591, 29877940, -4532264, 991601, +35536024, 4003447, -19628000, -22526566, -20145008, 36733780, -24728274, 14656576, 17016660, -11629698, +3352222, -19990926, -4752918, 16481937, -14785425, 11943767, -5097053, -25145422, -55720220, -4811437, +49689012, 21070036, 4876399, -9701794, -15259482, -2533494, -19949050, 6592775, -28023050, 33472828, +2208150, 4249334, 2476049, -10977936, -33741264, -12559021, 26640608, -21705154, -5879274, -14934138, +11766600, -10619307, 36964636, -5727876, 7432978, -13288092, -34977140, 7981123, -26759256, -5687074, +-2563559, -48351668, -41267120, -38490424, 12656732, -6849399, -21226802, -13350906, -13655849, -12075301, +-18961744, -12327093, -3463891, -43352864, 11997991, 5214091, 15904801, -9352291, 37757596, -3638374, +7130720, -12834436, -5415417, 20799452, -40695888, 17546552, 26377542, -26908506, -17811230, 1986422, +4131759, -6863895, -13260175, -20995948, -1468342, 830539, -13012140, 11280195, -9633075, -16652662, +-9534827, -6959995, 10626823, 41339, 228170, -46708, 7908109, -20578262, -6120329, -2177549, +-4191351, -1109175, 236760, -24732032, 678605, -7779260, -6727530, -1816234, -11340861, 3418794, +-3296924, 2597918, 356482, -1842541, -2891587, -5918465, -1125818, -4799626, -1291175, 3838090, +-5774584, -8848706, 193810, -1879048, -2137820, -5409512, -10257993, -6585259, -2696166, -959388, +-7306276, -8523899, 15101642, 9137006, 18274012, -6885370, -37983616, 10957535, 547071, 63074280, +64555504, 7809861, 638340, 15210090, 7630547, 16247861, 27861990, 10386305, 28930900, 43713640, +-10875931, 5745056, -35893580, -5079336, 4712653, -4630512, -10671383, -21758842, -18297098, 10155450, +10094247, -47696148, 34062848, 9213779, 48064980, -2913062, -9487583, 15726023, -3299609, 50594176, +12910135, -2574833, 9759239, 10023380, -13534516, -30871152, -24184424, -12126303, 37795712, 520765, +41540924, 5119064, 40614820, -11687143, -55794308, -20871394, -16171089, 28922310, 3556770, -27109834, +-39269960, -27438398, -5438503, 33962992, -29502668, -25703232, -16914654, 30313880, -14892262, -8810052, +-39094940, -38916160, 12319577, 6593849, 52465172, 13494250, -5510443, -14170708, 16480863, 17037062, +56013352, 1029718, -18096844, -24230594, -1519882, -2484102, 1318018, 8719320, 8097624, -13026636, +-2909304, 4235912, 11705396, -12509629, -10132365, 15741055, 23200876, 10779831, 7122667, 9018358, +-9742596, -4151086, -6127308, -1267552, -1287953, 5097053, 85899, 30245160, 6361921, -1289027, +-9226127, -15870441, 15187541, 24546274, -8871255, 406411, 972273, 3073049, 14066018, 6128382, +10452340, 10663867, 2725157, 8301098, 2735894, -521839, 2747169, -7472706, -2521146, 1833951, +-4502737, 3000035, 834297, 38602092, 14665166, -18761490, 36384280, -2258616, -71459128, -21762600, +45081052, 50075560, -35225176, -35275104, -35851164, 20013474, 30675194, 61288648, 18563386, 7913477, +-34941168, -3547106, -2142115, 13787382, 30690226, 22279070, 1821066, -37072012, -72007272, -19088982, +-36420248, 54196580, 57408680, 100153272, -29974576, -96321624, -20967494, -33091650, 74884904, 25467008, +75950592, 19563576, -25353192, -73385960, -49598820, 2676302, 9162239, 82287280, 33450816, -2855080, +-67693520, -118132536, -30859340, 2531883, 54611584, 124311384, 27124866, 37490768, -80071072, -122729224, +5336497, 28198070, 97774392, 57475252, 41108204, -22666154, -79050480, -64680060, -586800, 18269718, +-1653562, 49363132, -40691592, -38103340, -9395778, -87188376, 13684303, 4220879, 23860154, -17491254, +-35190816, -18927920, -14832670, -39857832, 9250823, 11718818, -12674448, -1951526, -37356016, 5402532, +10960757, 12402255, 17563196, 5640366, -19050328, 6805913, -5920076, -3223373, 2971581, 30514668, +5404680, -855772, -7584912, -23023172, -4338991, -9116068, 9148817, -4061965, 10135049, 6593312, +-20958366, -47856672, -23409720, -35104916, 29070486, 29211146, 34749508, 19983410, -44502840, -40161704, +-62154084, -14856829, 50918984, 56259240, 54912768, 2928631, -59928752, -44844292, -34774740, -459025, +90200216, 62625456, 25804700, -47888884, -55661164, -41700912, 21055540, 21694954, 31549756, 16687022, +-40980968, 54459648, -1176821, 7904351, -22922240, -51873004, 30904974, -52236464, 55338508, 7938174, +4949950, 11547020, -33254322, 32855426, 3244848, 22789634, -31886374, 11112691, 288300, 39460012, +-15760919, 9568113, 26436598, -30236032, -17331266, 2706903, -27411556, 44295072, -9966472, -18569292, +40039832, 45774688, -12285217, -34279744, -8369818, -30247844, -5507759, 18283676, -2859911, -37618008, +4498978, 19845434, -13111998, 22414360, -18752900, 8483097, 24357834, -10032507, 16071231, -42824044, +-42765528, 43270184, 24326158, 66935456, -2711198, -17383344, 57126288, -32897838, -28928752, 19666656, +19335406, 32005560, -29309930, -14392972, 8774618, -6622840, 32405528, -26225070, -79995376, 20433844, +44885092, 198642, -37009732, 6621229, 22899692, -9356586, -9599252, -30296162, -9541270, -25084220, +24934432, 5625871, -17315698, -5140002, 29758218, -21465710, -7372312, -19445464, -2120103, 13947369, +-20779588, 10721312, 31092878, 11436424, -318364, -9274982, -1622961, -11913166, -14329622, 22974854, +-9671729, 10188736, -3175055, -12416214, 15569, 2090039, 2326799, 8078297, 10429791, -18347564, +-5348845, 8441758, 7560216, 17296908, -2259153, -15844134, 6171331, -18377628, 8650601, -16787416, +-9089761, -167504, -3445101, -11410117, 25222196, -11448772, 5239323, 10506027, 2426120, 8137890, +16754131, -773094, -2921652, 352187, -1607392, -21079700, -13284871, 81321448, 22005264, 22775138, +-68911680, -16933446, -54024784, -45222784, 40838696, 43418900, 85287848, 39750460, -11553999, -16203838, +-10047539, 27310086, 18688476, 923418, 41450192, 8454643, -16617228, -19274740, -15882252, 30211874, +537, 26470420, 12175695, 16123307, 3930969, -6199249, 3040300, 184684, 3921842, -6441377, +-1726577, 8913131, 7199439, 56337624, 45061188, 37189584, -3230352, 10423886, -22807350, -3418794, +-14185203, -25347824, -26795764, 8446053, 14618995, 21635360, 26090316, 21866216, -13463112, -34010772, +52285320, -36996312, -16338056, -9218074, 17958332, 2678986, 25611964, 27006754, 23386634, -31127776, +-11247446, 4600984, -12330851, -50409496, 33964600, -11593190, -9107478, 19479288, 39417064, 44989244, +32638530, 32206350, 27600534, -29097866, 3864397, -7241852, -9100499, 17056388, 13354127, 18152680, +8719857, -7904888, -14619532, -20953534, -22922778, -45823008, -18379776, 7046431, -2600066, 28324236, +-15569, -12572980, -4249870, -18112414, 6997039, 2361158, -1322313, -25233, 11963095, 26539140, +-3195456, 1519882, 14541149, 1259499, 206695, -5070746, -1683090, -6060736, -5986648, 1770600, +-12498892, 5774047, 7218767, -9040369, -13606456, 3961571, 2796024, -4775467, 13439490, 18158048, +-2401424, 2889976, -5794985, -17967996, -7601019, 3164854, -104804720, -52287468, -71967544, 51963200, +11526618, 148824912, 153889216, 153271808, 175218560, 172485344, 123980136, 77103792, 96706024, 42728484, +9036611, -81594712, -70970040, -178185840, -155754848, -139895136, -82375328, -104020888, -79207784, -6532109, +-25288768, -10247255, -12466143, 610959, -164283, 4695473, 20350092, 21786222, 20860656, 61398704, +63075888, 66788352, 47769164, 133620192, 34977676, 56150792, 93598608, 104272144, 38807176, 104938400, +126357400, 99567008, 86523192, 87900264, 9714679, 52613888, 106351984, 105009264, 67740760, 88117696, +77115064, -1087164, -28503550, -20133732, -52526376, -64896420, -8314520, -72931768, -111143016, -86681032, +-103520520, -153177856, -70061120, -103588168, -114740592, -162576864, -132140040, -149934080, -171213504, -114138752, +-193598336, -229101072, -229861280, -125153200, -155537952, -196093168, -38527468, -87366616, -40964324, -22058416, +64251636, 28524488, 94267552, 49984292, 89045944, 84693536, 55737940, 43862352, 69034616, 127794064, +130100464, 130478424, 133336720, 138471888, 168346608, 150315264, 124852016, 153456496, 173228384, 138369888, +104129872, 124190056, 104545944, 67436352, 85270672, 57565448, 28636158, 12200928, 26324392, 7577933, +-10816875, -7602629, -13939316, -33470144, -50770272, -50589884, -55022288, -47156592, -58822260, -92619360, +-83197272, -95718712, -107834816, -125735704, -125299232, -103914048, -104274824, -85602992, -54360328, -61403000, +-41811508, -29585882, 2995740, -794569, 15032, 4616553, 18418968, 21089900, 6938520, 16508781, +26843008, 21064130, 9148280, 10420128, 19699404, 11069741, 4416300, 7269769, 10666551, 8989367, +5246840, 4539244, 3424163, 1444720, 352724, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, }, }, }; const Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774] ={ { { 5815386, -1455994, -2240362, 100932, -1137093, 1463510, 5843840, -490700, -3820374, -5774584, 630286, --4339528, -1251983, -1309965, 1000727, 3101503, -4463008, -2168959, -1370632, 244276, -2636036, --4633733, -1809792, -3896609, -2077154, 841814, -190052, -1798518, -345208, -493921, 500901, --4146791, -1033477, 1678259, 3571265, 1837172, -529355, -505196, 171799, -3932043, -2672544, -870805, 260919, 1046898, -1050120, 864899, -852551, 1567126, -818728, 2932389, 2979634, --273804, -67109, 2286533, 889595, -158914, 220654, -4801237, -3017752, -729071, 1796907, --1975148, -4236985, -2667175, -2019172, -2979634, 1803349, -5478231, 1680406, 5598490, -2954938, --1404991, -2715493, 3122441, -1240172, -3447248, 913217, -4941897, 4958003, -1909113, -63888, -4645544, -2752000, 1786706, -420907, 616328, -3272765, -6712497, -1464047, 2591476, -1807644, -1569274, 2216740, 1942936, -1569811, 1095217, -4239133, -771484, 921271, 1699733, -258235, --98784, 389768, 1019518, -3588445, -2868501, 1076963, 2401961, -1335735, 2518998, 4634807, --6406481, 761820, -3049964, -2241436, 1464584, -963683, 3983582, -1395328, 3597035, 1690607, -628676, -440234, 1953673, -79457, -329639, -2204929, 5829345, -4211216, -1141924, 1807644, -2317135, -329102, -1862942, 869194, -2062121, 1985886, 531502, 551903, 63888, -1039919, --594316, 2697776, -7567733, 1501091, -855772, -4786204, -613643, 3422552, 1972464, 1978369, --3203509, 2334315, -9340480, 6575058, -3736085, 1165010, 910533, -175020, -2306398, -542777, --5420249, -6655589, 1323924, -1591822, 1567663, 1584843, 5257040, -5009543, 283468, 3449933, -3328600, -4142496, -4392141, -2514703, -3867081, -74625, -1559073, -3098819, -2480881, -383863, --6739341, -6452115, -1682554, 801011, -956704, 93952, -1136556, 962073, -3745212, 3424163, --1775969, 1761474, -903017, 1112397, -3469260, 588947, 1668595, 2089502, 654446, 25233, -454193, -1562294, -2983392, 4632659, 3393561, 1120450, -2406792, 5829345, 3792993, -2347200, -3518652, -887985, -3705483, -1369558, -1709934, -3446711, 1239635, 1450088, 384400, -2881386, -3810173, -3746822, 1896765, 2922725, -1532767, -616865, -6481106, -3740380, -6877317, 200253, -7478612, 3416647, -2929705, 1264868, 934155, 11962558, -3585224, 3423089, 5779952, -1132261, -5247913, 2166811, 3544422, -4735739, -1833951, -5545340, -2653753, 3759707, -198105, -2622615, -536334, -3869766, -409633, -2520072, 3446175, -1526324, -610959, -1366337, 1762010, 876710, --97174, -406948, 1404991, -5799280, -4669703, 2072859, 367220, -504659, -3149285, 7039989, -1808181, -824634, 2097555, 2839510, -214748, 1450088, 420370, -3355980, 2872796, -4006131, --3369402, 3779034, -4663261, 3884261, 1386201, -3193845, 5352066, 3189013, 1827509, -1422171, -4764193, 1336809, -1123134, -1351304, 1109175, 758062, -1408749, -5905580, -1451162, -998043, -1201517, -3354906, 4038880, -1420024, 2953327, -3744138, 12374338, -10511932, -9244380, -3066607, -9443559, -1466195, -5321465, 6428493, -4500589, 2970507, -370978, -7262790, -4985384, 5894843, --4029216, 2860448, -4197794, 3857954, -1898376, -1219234, -578747, -4048007, 1954747, 2771865, --4074850, 863288, -2127620, 713501, 1693828, -675921, 2481417, 689879, 2014340, 3269007, --4411469, -3253438, 3797288, 122407, 2932926, 2878165, -2818572, -4136591, -1697049, 647466, -5291400, -5837398, 2332167, -6504191, -7924752, -1883880, -4541391, -774168, -5361193, -10161356, --5388574, 4715874, 4408784, 2873870, -3356517, 9750650, -2944200, 1686848, -5301601, -5004174, -1439888, 84826, -350577, -6291054, -1898376, -233539, -1034550, -1082332, -3091840, -2585570, -1214402, -682900, -1133871, 16124381, -5162551, 7605314, -1914482, 10193031, -1878511, -1435056, -1771137, 2165737, -1643899, -11446088, 1195075, -972273, -3037616, -22549, -517007, 4285304, --1294396, 10033580, -1284195, 1297617, -696858, 5774047, -1096827, 2131915, -4621385, 42413, --3188476, -3075197, -976031, -714575, -2147, 3833258, -6385543, -1610613, 2080912, -455267, -4297652, 1294933, -1204738, -2601677, -2997350, -2764348, -5917391, 2521683, 2309619, 2525441, --10255308, -1100585, 6943352, 4408784, -1820529, 117575, -3352759, -6465000, -7602629, 7832947, --2546379, -4384088, -3064459, 4569309, 2823404, 1001801, 3166465, 2172717, 3000572, -924492, --7703024, -1591822, -3815005, -2698313, 4642860, 4633733, -1371705, 7234873, 7857643, -24428700, -12734578, 4349192, -1551020, -1519882, -377420, -4106526, -7119982, -1908039, 2829310, 9692667, -6388764, -9713069, -2195265, -5966784, 3339874, -933082, -12918725, -4151623, 7255274, 4274566, -2212445, 6039261, 3534758, -1130650, -1222455, 1454920, -5152350, -3278134, 707596, 5206574, --2771328, -5238787, -7281580, -3944928, 3082176, 10710575, 417686, -2422899, 2019172, -2767570, --8628052, 154619, -6180995, -5064840, -5779416, 2942053, -641024, -8228084, 1156420, 2487860, -2758443, -8859981, -4927938, -3581466, -2332704, -1363652, -3331284, -1946157, -4214974, -8597451, --1120450, -7362111, -8451422, -5581310, -1558536, 1016297, -4984310, -7720204, 2194192, 5464272, --177704, -1474248, -443992, 3861176, -5959804, 4266513, -10272488, 3375844, -5246840, -1225676, -966368, 2536178, -725850, 4724464, -177167, -1449552, -14203994, 6019397, -2863670, -3398930, -4727149, -8520678, -11340861, 4055523, -4124242, -5682779, -1867237, 9513889, 6083821, -4175782, --2359011, 4130685, -1570884, -1042066, 1178969, 3988414, 8189429, 4737886, 6612102, -1626719, --415001, -444529, -4554813, 508954, -1963337, 10713796, -8756901, -5699959, -4646618, -4989679, -2699924, 828392, 4057134, -1413581, -5728950, -8447664, -2191507, -10359998, -13271449, -3500935, -440234, 9485972, 2158221, -9117679, -1973538, 6801618, -3126199, 1580548, 2533494, 3263638, --5935645, -10434623, -3820374, -6015639, 15242839, 186831, -4425964, 1502702, 2903398, -3316789, -2341294, 117038, 8715026, 2856153, -527207, 6051072, -929324, -7220914, -1166621, -528818, -7458211, -3978214, -751619, -2112050, 1410360, -2151242, 700080, 2451890, 3690451, 5016522, -3518652, 1631014, 13007308, 5068599, 4492536, -494995, -9692131, 696858, -7999377, 2579128, --5291937, 1406065, 412854, 3239479, 16045461, 4443681, -1995012, 5616207, -3962107, 4775467, --2258616, 8128763, -3940096, -77309, -5585605, 3685619, 6782827, -7324530, 15313706, -3670050, -1738925, -2331630, -3245385, 1499481, -3653407, -12686260, 2951716, -3254512, 182536, -7882876, -2800319, -2862059, -11937862, -5986648, -2498060, -11584601, 7739531, 16404628, 21383032, -19204946, --13064754, -8198556, 2504503, 4645007, -3965329, 2648384, -4486094, 1752347, 11400454, 8051453, --12760885, 20572894, 1232119, 12402255, 4996658, -3201361, -3386045, 11567421, -5510980, 7631620, -9129490, -201327, -5083631, 1214939, 9401147, 5749888, 5200669, 4749697, -12885, 2292976, -3649649, 11851962, 8446053, -4925791, -4257923, 35970, -1808718, -277025, -5030481, -2885144, -6193880, 10601053, 3153043, 15517180, -3386045, 16888348, 1384590, 8478802, 18178986, 13412646, -4612258, 4593468, 8537321, -707596, -6491306, 996432, 8031052, -3242164, -7579007, 1379758, --767189, 17126182, 13372381, 965294, 18581102, -454730, 10164577, 6337224, 8084202, 227633, --5925445, 9420474, -1371168, 10867878, 6706592, 21545704, -11141145, -382252, -22719840, 6534256, --11348914, 419833, 9997610, -1948305, 3317325, -12981539, -9463424, 4895726, -7592429, 4598836, --4480188, 1406065, 12342125, -1970316, -11155641, 3157875, -4516158, 11697343, -11900818, -8489003, -5283347, 5621576, 8842264, 288300, -489089, 5456756, -2966749, -8397198, 5578089, -3505767, --6241125, 1898912, 6955163, -4896263, 12714177, 4826470, 34360, 1452236, 6505802, 2447058, --20405926, 8354785, -1595580, -2433099, -3037616, 10892574, 666794, 11593190, 1124208, 754841, -1964411, -3438658, -583042, 5432597, -5979668, 1242319, 19790136, 1305133, 14795625, 694174, --1998234, -1946157, -8526047, -20003810, -13300440, 6020471, 10001368, -4346507, 16072841, 5918465, --9507984, -6722161, 15022185, 9261023, 10558640, 2334852, -2513630, -239981, 1331440, -8548596, -228707, -4151086, 6726993, 13425531, 5674189, 5107253, 15273977, 12926778, 10930692, 1309428, -4633196, 1690070, -1434519, -1889249, 3253438, -229781, -7713762, 2797634, 9339406, 814433, --1542967, 3526168, -20147692, 7916162, -7492034, 6135898, 8013872, 7347616, -7016366, 5175436, -68719, 745177, 13338021, 10029822, 1002875, 5801964, 4491999, -763967, -6235219, 2661806, -6959995, 1049583, 9753871, 3592203, 8907762, 16760573, 1708323, 7326141, 7661685, 9427453, -531502, -4489315, 14566918, -4342749, 11940009, -12049531, -9780177, 15942382, 172336, 5915244, -9778030, 14045617, 17878876, 8109972, 3327526, -7265474, 4766877, -682363, -14012868, 13866839, -9190693, -11300059, 597537, 1914482, -13960791, 6484864, 14217415, 8896488, 2310156, -35291748, --22091702, 6622840, 7020661, 13841606, 23310398, -7024956, -4065187, -8071854, -7329899, -9451612, --9855876, 200253, 3519189, 2399276, 14660871, 27917, 14398341, -1392643, 4795331, 6110665, -4980015, 10210748, 7562901, -182536, 9411884, -884226, -1324461, -6332393, 6334540, -1700807, --14475114, -13241921, 7634841, -2685428, 16954384, 9271224, 10873247, 3100967, -21581136, 4176856, -13429826, -3114388, 3863860, -4375498, 2627983, 15843597, -630286, 13050258, 23680840, 112743, --8963060, -1524713, 246961, -16204912, 20135344, 8210904, -2651069, -2583423, 14614163, 5378373, --17629768, -15945066, 5723044, -7874823, 8508867, 4432943, 2743947, -8699456, -12484396, -2310693, -3249143, 737661, 13630616, -19542102, 2581812, -1220845, 24898462, -29229936, -8048769, -14150307, --424665, 4856535, 955630, 19918984, -20178830, 9824201, -2605972, 4134980, -2292976, 11039140, --5801964, -9865003, -673236, -2718714, 7824357, -413927, 5344013, 11703249, -2220498, -8364986, --983011, 13144747, -7424388, 3324305, 3071439, 767189, -1002875, 13078175, -314069, -3035468, --21233782, 7165079, -5123359, -13231184, -11587285, -2826089, -12861816, -7374459, -11143293, 5691906, --13179644, 13666049, -12077985, 8612483, -6146635, 16525424, -15463493, -8721468, -2157684, 9758703, -4064113, 489626, -6230387, -12401181, 1526861, 5465883, 18551574, 10079215, 4240744, -9978820, -6486475, -8769786, -10217727, 9699110, -9900436, 5428839, 12154757, 10510859, -2364380, -3162707, --8329016, 14904073, 1592359, 11919608, 17426830, 23727010, -22931368, 18688476, 13334263, 1664300, -9887015, 31188978, -7437810, -7606924, 3886946, 9935333, 13529684, 5191542, -10743324, 14375792, --3882651, 27681064, 297963, -3326452, 9601399, 8058970, 7902740, 776852, 25952876, -19695646, -6023692, 678068, 7805030, -7606924, -16346109, 9642202, 7693897, 8051453, -5150203, -3566970, -21760452, 8857833, 27099096, 3415573, -8876624, -37044, 6635725, -1287953, 28013388, -2447058, -15568720, -1675037, 25137906, 9862319, 7241852, -5000416, -780610, 14365055, 782221, 15291157, -11332271, 13584445, -16542067, 3529390, 12340515, 15298137, 10975252, 9032853, 19515258, 24637544, --18552648, -1647657, 35944044, -8357470, -10785737, 23809152, 30368104, 447213, -2609730, -18178450, -11432129, 23976654, 15569, 8515846, -17878876, 19846508, -8425115, -4458176, -15545634, -9335648, -35792648, 2102923, -23075786, -9182640, 482110, 1795296, -2030983, 28438590, 13620415, -498216, --10025527, 764504, 8120710, -1435593, 36638756, 9478993, 16689169, 7359964, -6980396, -18117246, -5745593, 1845762, 4146791, -13468481, -678605, -8341900, 12951474, 2333241, 2913062, 14778982, --10336376, -5856725, 3384434, 3031710, 4621385, -14660871, -12617003, -26860726, -14518600, 4032974, --15925202, 5134097, -11281805, -4335770, 22903450, 10020696, -9645423, 9842991, 3556233, 3357054, -22231288, 30065, 26787712, 13652090, -9627706, -27029840, 6990060, 9477382, 19083614, -4373888, --20215338, -2391760, 9272298, 7687992, -1566053, -7640210, 15752329, -18369576, -1542967, 26866094, --6353867, 7685307, 2331094, 3244311, -26084948, 20879984, -2668785, -20788178, -12563853, 10420664, --3665755, 5079336, -762357, -8757975, -6985228, 3425773, -7021735, -1717450, -1075889, -29879014, --8501888, -20092930, 3621194, 6873559, -986769, -8933532, 2679523, -4354023, 10758893, -26394184, -850940, 4437238, 14070850, -11551851, 13005698, -11367705, 7876433, 2282775, 9814537, -17220672, -4128001, -8563091, -19385872, 11777874, -15967078, -29672856, 3064459, -2817499, 22001506, -11301133, -1838783, 10716480, 13982266, 17536352, 280247, -6009733, -12767327, 361851, 6505265, 11571716, --25095494, 25890600, -2410014, -17439178, -15524696, -23212688, 6637872, 5666673, 5884105, 4134980, -20292646, -8492224, 19376208, -23054310, -1165547, 11023034, -5890011, -24896314, -4858145, -35883916, -15782394, -39550208, 21883932, -27699854, -24239722, 5467494, 18855980, 13714904, -14253386, 12783970, -24001888, 3273839, 2704756, 4701379, 1226750, -15962246, 16936666, -31369904, -19753628, 454730, --2884608, -3192771, -5020280, -8790724, 3017215, 26445724, 6173479, 2530810, 1604170, -14408542, -15122580, -4298189, -28900298, -5718212, -376347, -857920, -20067698, -14995878, 13734232, -6340983, -24264418, 3068754, -925029, -22195318, -12182675, 5813775, 2334852, -7434589, 20695300, -19045496, --11286100, -2818036, -2147484, 18165564, 790811, 21437792, -842887, -22149146, 4024384, -19586662, -11856257, -5718749, 16476568, 28665686, -50982336, 12237972, 6263136, 2739652, 18357764, -5946382, -2934000, 39476656, 33937220, -11823508, -15308337, -2493766, -28572806, 14081587, -3064459, 4229469, -605054, -15412490, 39538932, -19393924, -73793984, -12382928, 13010530, -50520088, -9749039, 13399761, --42633992, 3858491, 25505664, -20854750, 25467008, -27646168, 21717502, 26621282, -19522236, 5811628, --3884798, -1372779, -8955007, -13321378, -3282429, 15531675, -12502650, -20939040, -11446088, -17296370, --2720862, -14060649, -3031173, 4128001, -3888556, 14966887, -16172162, -20855288, 13848048, -21969294, --30165166, -39776764, -13967234, -3255048, 6405944, 18460844, -9559523, 6890738, 8978092, -9395778, --3989488, 31801548, -23458574, -3549254, 22866942, 4533875, 17882634, -7505992, 6169184, 23088134, -12898324, -4646081, -3658775, -19620484, 6164889, 22186190, -25219512, -11884711, -8573828, 36042292, -24260660, -34878892, -7301982, 31105226, -9793599, -19226422, -13973139, -19251118, -11831024, 31525596, -18679886, -2377801, 13727252, -3237869, 16793322, -10704132, -6721624, 35169340, -15236396, 6614787, --10874857, -3427384, -1238024, 9928354, 27485644, 11362873, -20227686, -5185636, -1944547, -2418604, -14846628, 2672007, 27373438, -7854959, 3632469, -2338073, 6945499, -23319524, 12903155, -21421150, -13364328, -441845, 20252918, -4961761, 14448807, -6702834, 3150359, 10204842, -11614665, 10586021, -19896972, 28651726, -17144972, 29382946, 9266929, 34724812, -12568148, 7447474, -4415227, -2992519, --9918690, -1105417, -14973867, -53919556, -39025148, -9308805, -5517959, 9340480, -1683627, 14415521, -14084272, -28534152, -10628433, -10430328, 26574036, -40381820, 36454072, -11653857, -11957726, 8833674, -16506633, -31753766, -7066295, -189515, 5322002, 949188, -1773285, 14847702, -10339060, 1303523, -7256884, 8375186, 12038256, 10069014, 2637110, -17667348, -4394826, 22505092, -23463944, -19847044, -22983444, 7580081, 15928423, 25623774, 39618388, -9799505, -26906896, 33826088, -14957760, -6354404, -34760244, 10731513, -14258755, -37918120, -25812754, -4253092, -14951318, 17117592, 34173444, 17648558, --13296145, 35851704, 11020349, -13559749, 8807904, 40107480, 10502806, 7488813, -9772124, -32769526, --44790604, -34909496, -3743064, 25995826, 6779606, 16383690, 60844116, 30455614, -38375532, -25087440, -15298674, -51392504, -24726126, 44559212, 14910516, -56735444, -48324288, -21364242, -36389648, -33055678, --17236778, -54029076, 39786968, 17926656, 13775571, 16906066, -4630512, 20441896, 16841640, 23738284, --2960306, 32017908, -17915382, 24697672, -7226820, -16065862, -4457103, -27361626, 4138738, -8958765, -11349988, -5629092, -10182831, 29620242, -30967788, 22457310, -110059, -12077985, -4636954, 14241575, -14861661, 12029667, 27229556, 23250806, -14431627, -1127966, -12864501, 13960254, -11355357, 11418171, -13400298, 8061117, 7779797, 7044820, -6910066, 31501974, -2177012, 11145440, 3395709, 16003048, -7865696, -32088238, 2614561, -17984638, 5594195, 18331458, -2644089, -11605539, -13391171, 35745404, --34253976, -24177982, 50784768, -17817672, 12967580, 9184251, 15957414, -3152506, 7978976, -30367030, -1617055, 40157944, -19539416, -7102802, 28102508, 6546067, -26805428, 12505334, -37677600, -137980112, --148366960, -10197863, -87148648, 67864240, 258684272, 109803520, 154139936, 195629856, -80527416, -58699856, --26026428, -185362736, -130713568, -46006080, -202247328, -91289528, -22140556, -85962160, 14756434, 180355344, -164109632, 177214112, 232043120, 137261792, -17148194, 47930760, -57269092, -215591248, -118496536, -89798640, --178929408, -125079648, 2631741, -139810320, -48264160, 24486146, -138337680, -74164424, 96845072, 33843268, -105463992, 266627808, 217437552, 173556944, 318101920, 228274832, -7155416, 28579786, -63073744, -292923744, --278069056, -288776416, -444851776, -304239904, -187310496, -185640304, 514322, 139642816, 160726800, 223222880, -343002528, 314833440, 268950848, 262911056, 153861296, 52892524, 12884365, -14259291, -112143208, -200613088, --239049824, -256209824, -335403136, -255880736, -100100120, 29174102, 28749974, 0, 0, 0, -0, 0, 0, }, +1455994, -2240362, 100932, -1137093, 1463510, 5843840, -490700, -3820374, -5774584, 630286, +-4339528, -1251983, -1309965, 1000727, 3101503, -4463008, -2168959, -1370632, 244276, -2636036, +-4633733, -1809792, -3896609, -2077154, 841814, -190052, -1798518, -345208, -493921, 500901, +-4146791, -1033477, 1678259, 3571265, 1837172, -529355, -505196, 171799, -3932043, -2672544, +870805, 260919, 1046898, -1050120, 864899, -852551, 1567126, -818728, 2932389, 2979634, +-273804, -67109, 2286533, 889595, -158914, 220654, -4801237, -3017752, -729071, 1796907, +-1975148, -4236985, -2667175, -2019172, -2979634, 1803349, -5478231, 1680406, 5598490, -2954938, +-1404991, -2715493, 3122441, -1240172, -3447248, 913217, -4941897, 4958003, -1909113, -63888, +4645544, -2752000, 1786706, -420907, 616328, -3272765, -6712497, -1464047, 2591476, -1807644, +1569274, 2216740, 1942936, -1569811, 1095217, -4239133, -771484, 921271, 1699733, -258235, +-98784, 389768, 1019518, -3588445, -2868501, 1076963, 2401961, -1335735, 2518998, 4634807, +-6406481, 761820, -3049964, -2241436, 1464584, -963683, 3983582, -1395328, 3597035, 1690607, +628676, -440234, 1953673, -79457, -329639, -2204929, 5829345, -4211216, -1141924, 1807644, +2317135, -329102, -1862942, 869194, -2062121, 1985886, 531502, 551903, 63888, -1039919, +-594316, 2697776, -7567733, 1501091, -855772, -4786204, -613643, 3422552, 1972464, 1978369, +-3203509, 2334315, -9340480, 6575058, -3736085, 1165010, 910533, -175020, -2306398, -542777, +-5420249, -6655589, 1323924, -1591822, 1567663, 1584843, 5257040, -5009543, 283468, 3449933, +3328600, -4142496, -4392141, -2514703, -3867081, -74625, -1559073, -3098819, -2480881, -383863, +-6739341, -6452115, -1682554, 801011, -956704, 93952, -1136556, 962073, -3745212, 3424163, +-1775969, 1761474, -903017, 1112397, -3469260, 588947, 1668595, 2089502, 654446, 25233, +454193, -1562294, -2983392, 4632659, 3393561, 1120450, -2406792, 5829345, 3792993, -2347200, +3518652, -887985, -3705483, -1369558, -1709934, -3446711, 1239635, 1450088, 384400, -2881386, +3810173, -3746822, 1896765, 2922725, -1532767, -616865, -6481106, -3740380, -6877317, 200253, +7478612, 3416647, -2929705, 1264868, 934155, 11962558, -3585224, 3423089, 5779952, -1132261, +5247913, 2166811, 3544422, -4735739, -1833951, -5545340, -2653753, 3759707, -198105, -2622615, +536334, -3869766, -409633, -2520072, 3446175, -1526324, -610959, -1366337, 1762010, 876710, +-97174, -406948, 1404991, -5799280, -4669703, 2072859, 367220, -504659, -3149285, 7039989, +1808181, -824634, 2097555, 2839510, -214748, 1450088, 420370, -3355980, 2872796, -4006131, +-3369402, 3779034, -4663261, 3884261, 1386201, -3193845, 5352066, 3189013, 1827509, -1422171, +4764193, 1336809, -1123134, -1351304, 1109175, 758062, -1408749, -5905580, -1451162, -998043, +1201517, -3354906, 4038880, -1420024, 2953327, -3744138, 12374338, -10511932, -9244380, -3066607, +9443559, -1466195, -5321465, 6428493, -4500589, 2970507, -370978, -7262790, -4985384, 5894843, +-4029216, 2860448, -4197794, 3857954, -1898376, -1219234, -578747, -4048007, 1954747, 2771865, +-4074850, 863288, -2127620, 713501, 1693828, -675921, 2481417, 689879, 2014340, 3269007, +-4411469, -3253438, 3797288, 122407, 2932926, 2878165, -2818572, -4136591, -1697049, 647466, +5291400, -5837398, 2332167, -6504191, -7924752, -1883880, -4541391, -774168, -5361193, -10161356, +-5388574, 4715874, 4408784, 2873870, -3356517, 9750650, -2944200, 1686848, -5301601, -5004174, +1439888, 84826, -350577, -6291054, -1898376, -233539, -1034550, -1082332, -3091840, -2585570, +1214402, -682900, -1133871, 16124381, -5162551, 7605314, -1914482, 10193031, -1878511, -1435056, +1771137, 2165737, -1643899, -11446088, 1195075, -972273, -3037616, -22549, -517007, 4285304, +-1294396, 10033580, -1284195, 1297617, -696858, 5774047, -1096827, 2131915, -4621385, 42413, +-3188476, -3075197, -976031, -714575, -2147, 3833258, -6385543, -1610613, 2080912, -455267, +4297652, 1294933, -1204738, -2601677, -2997350, -2764348, -5917391, 2521683, 2309619, 2525441, +-10255308, -1100585, 6943352, 4408784, -1820529, 117575, -3352759, -6465000, -7602629, 7832947, +-2546379, -4384088, -3064459, 4569309, 2823404, 1001801, 3166465, 2172717, 3000572, -924492, +-7703024, -1591822, -3815005, -2698313, 4642860, 4633733, -1371705, 7234873, 7857643, -24428700, +12734578, 4349192, -1551020, -1519882, -377420, -4106526, -7119982, -1908039, 2829310, 9692667, +6388764, -9713069, -2195265, -5966784, 3339874, -933082, -12918725, -4151623, 7255274, 4274566, +2212445, 6039261, 3534758, -1130650, -1222455, 1454920, -5152350, -3278134, 707596, 5206574, +-2771328, -5238787, -7281580, -3944928, 3082176, 10710575, 417686, -2422899, 2019172, -2767570, +-8628052, 154619, -6180995, -5064840, -5779416, 2942053, -641024, -8228084, 1156420, 2487860, +2758443, -8859981, -4927938, -3581466, -2332704, -1363652, -3331284, -1946157, -4214974, -8597451, +-1120450, -7362111, -8451422, -5581310, -1558536, 1016297, -4984310, -7720204, 2194192, 5464272, +-177704, -1474248, -443992, 3861176, -5959804, 4266513, -10272488, 3375844, -5246840, -1225676, +966368, 2536178, -725850, 4724464, -177167, -1449552, -14203994, 6019397, -2863670, -3398930, +4727149, -8520678, -11340861, 4055523, -4124242, -5682779, -1867237, 9513889, 6083821, -4175782, +-2359011, 4130685, -1570884, -1042066, 1178969, 3988414, 8189429, 4737886, 6612102, -1626719, +-415001, -444529, -4554813, 508954, -1963337, 10713796, -8756901, -5699959, -4646618, -4989679, +2699924, 828392, 4057134, -1413581, -5728950, -8447664, -2191507, -10359998, -13271449, -3500935, +440234, 9485972, 2158221, -9117679, -1973538, 6801618, -3126199, 1580548, 2533494, 3263638, +-5935645, -10434623, -3820374, -6015639, 15242839, 186831, -4425964, 1502702, 2903398, -3316789, +2341294, 117038, 8715026, 2856153, -527207, 6051072, -929324, -7220914, -1166621, -528818, +7458211, -3978214, -751619, -2112050, 1410360, -2151242, 700080, 2451890, 3690451, 5016522, +3518652, 1631014, 13007308, 5068599, 4492536, -494995, -9692131, 696858, -7999377, 2579128, +-5291937, 1406065, 412854, 3239479, 16045461, 4443681, -1995012, 5616207, -3962107, 4775467, +-2258616, 8128763, -3940096, -77309, -5585605, 3685619, 6782827, -7324530, 15313706, -3670050, +1738925, -2331630, -3245385, 1499481, -3653407, -12686260, 2951716, -3254512, 182536, -7882876, +2800319, -2862059, -11937862, -5986648, -2498060, -11584601, 7739531, 16404628, 21383032, -19204946, +-13064754, -8198556, 2504503, 4645007, -3965329, 2648384, -4486094, 1752347, 11400454, 8051453, +-12760885, 20572894, 1232119, 12402255, 4996658, -3201361, -3386045, 11567421, -5510980, 7631620, +9129490, -201327, -5083631, 1214939, 9401147, 5749888, 5200669, 4749697, -12885, 2292976, +3649649, 11851962, 8446053, -4925791, -4257923, 35970, -1808718, -277025, -5030481, -2885144, +6193880, 10601053, 3153043, 15517180, -3386045, 16888348, 1384590, 8478802, 18178986, 13412646, +4612258, 4593468, 8537321, -707596, -6491306, 996432, 8031052, -3242164, -7579007, 1379758, +-767189, 17126182, 13372381, 965294, 18581102, -454730, 10164577, 6337224, 8084202, 227633, +-5925445, 9420474, -1371168, 10867878, 6706592, 21545704, -11141145, -382252, -22719840, 6534256, +-11348914, 419833, 9997610, -1948305, 3317325, -12981539, -9463424, 4895726, -7592429, 4598836, +-4480188, 1406065, 12342125, -1970316, -11155641, 3157875, -4516158, 11697343, -11900818, -8489003, +5283347, 5621576, 8842264, 288300, -489089, 5456756, -2966749, -8397198, 5578089, -3505767, +-6241125, 1898912, 6955163, -4896263, 12714177, 4826470, 34360, 1452236, 6505802, 2447058, +-20405926, 8354785, -1595580, -2433099, -3037616, 10892574, 666794, 11593190, 1124208, 754841, +1964411, -3438658, -583042, 5432597, -5979668, 1242319, 19790136, 1305133, 14795625, 694174, +-1998234, -1946157, -8526047, -20003810, -13300440, 6020471, 10001368, -4346507, 16072841, 5918465, +-9507984, -6722161, 15022185, 9261023, 10558640, 2334852, -2513630, -239981, 1331440, -8548596, +228707, -4151086, 6726993, 13425531, 5674189, 5107253, 15273977, 12926778, 10930692, 1309428, +4633196, 1690070, -1434519, -1889249, 3253438, -229781, -7713762, 2797634, 9339406, 814433, +-1542967, 3526168, -20147692, 7916162, -7492034, 6135898, 8013872, 7347616, -7016366, 5175436, +68719, 745177, 13338021, 10029822, 1002875, 5801964, 4491999, -763967, -6235219, 2661806, +6959995, 1049583, 9753871, 3592203, 8907762, 16760573, 1708323, 7326141, 7661685, 9427453, +531502, -4489315, 14566918, -4342749, 11940009, -12049531, -9780177, 15942382, 172336, 5915244, +9778030, 14045617, 17878876, 8109972, 3327526, -7265474, 4766877, -682363, -14012868, 13866839, +9190693, -11300059, 597537, 1914482, -13960791, 6484864, 14217415, 8896488, 2310156, -35291748, +-22091702, 6622840, 7020661, 13841606, 23310398, -7024956, -4065187, -8071854, -7329899, -9451612, +-9855876, 200253, 3519189, 2399276, 14660871, 27917, 14398341, -1392643, 4795331, 6110665, +4980015, 10210748, 7562901, -182536, 9411884, -884226, -1324461, -6332393, 6334540, -1700807, +-14475114, -13241921, 7634841, -2685428, 16954384, 9271224, 10873247, 3100967, -21581136, 4176856, +13429826, -3114388, 3863860, -4375498, 2627983, 15843597, -630286, 13050258, 23680840, 112743, +-8963060, -1524713, 246961, -16204912, 20135344, 8210904, -2651069, -2583423, 14614163, 5378373, +-17629768, -15945066, 5723044, -7874823, 8508867, 4432943, 2743947, -8699456, -12484396, -2310693, +3249143, 737661, 13630616, -19542102, 2581812, -1220845, 24898462, -29229936, -8048769, -14150307, +-424665, 4856535, 955630, 19918984, -20178830, 9824201, -2605972, 4134980, -2292976, 11039140, +-5801964, -9865003, -673236, -2718714, 7824357, -413927, 5344013, 11703249, -2220498, -8364986, +-983011, 13144747, -7424388, 3324305, 3071439, 767189, -1002875, 13078175, -314069, -3035468, +-21233782, 7165079, -5123359, -13231184, -11587285, -2826089, -12861816, -7374459, -11143293, 5691906, +-13179644, 13666049, -12077985, 8612483, -6146635, 16525424, -15463493, -8721468, -2157684, 9758703, +4064113, 489626, -6230387, -12401181, 1526861, 5465883, 18551574, 10079215, 4240744, -9978820, +6486475, -8769786, -10217727, 9699110, -9900436, 5428839, 12154757, 10510859, -2364380, -3162707, +-8329016, 14904073, 1592359, 11919608, 17426830, 23727010, -22931368, 18688476, 13334263, 1664300, +9887015, 31188978, -7437810, -7606924, 3886946, 9935333, 13529684, 5191542, -10743324, 14375792, +-3882651, 27681064, 297963, -3326452, 9601399, 8058970, 7902740, 776852, 25952876, -19695646, +6023692, 678068, 7805030, -7606924, -16346109, 9642202, 7693897, 8051453, -5150203, -3566970, +21760452, 8857833, 27099096, 3415573, -8876624, -37044, 6635725, -1287953, 28013388, -2447058, +15568720, -1675037, 25137906, 9862319, 7241852, -5000416, -780610, 14365055, 782221, 15291157, +11332271, 13584445, -16542067, 3529390, 12340515, 15298137, 10975252, 9032853, 19515258, 24637544, +-18552648, -1647657, 35944044, -8357470, -10785737, 23809152, 30368104, 447213, -2609730, -18178450, +11432129, 23976654, 15569, 8515846, -17878876, 19846508, -8425115, -4458176, -15545634, -9335648, +35792648, 2102923, -23075786, -9182640, 482110, 1795296, -2030983, 28438590, 13620415, -498216, +-10025527, 764504, 8120710, -1435593, 36638756, 9478993, 16689169, 7359964, -6980396, -18117246, +5745593, 1845762, 4146791, -13468481, -678605, -8341900, 12951474, 2333241, 2913062, 14778982, +-10336376, -5856725, 3384434, 3031710, 4621385, -14660871, -12617003, -26860726, -14518600, 4032974, +-15925202, 5134097, -11281805, -4335770, 22903450, 10020696, -9645423, 9842991, 3556233, 3357054, +22231288, 30065, 26787712, 13652090, -9627706, -27029840, 6990060, 9477382, 19083614, -4373888, +-20215338, -2391760, 9272298, 7687992, -1566053, -7640210, 15752329, -18369576, -1542967, 26866094, +-6353867, 7685307, 2331094, 3244311, -26084948, 20879984, -2668785, -20788178, -12563853, 10420664, +-3665755, 5079336, -762357, -8757975, -6985228, 3425773, -7021735, -1717450, -1075889, -29879014, +-8501888, -20092930, 3621194, 6873559, -986769, -8933532, 2679523, -4354023, 10758893, -26394184, +850940, 4437238, 14070850, -11551851, 13005698, -11367705, 7876433, 2282775, 9814537, -17220672, +4128001, -8563091, -19385872, 11777874, -15967078, -29672856, 3064459, -2817499, 22001506, -11301133, +1838783, 10716480, 13982266, 17536352, 280247, -6009733, -12767327, 361851, 6505265, 11571716, +-25095494, 25890600, -2410014, -17439178, -15524696, -23212688, 6637872, 5666673, 5884105, 4134980, +20292646, -8492224, 19376208, -23054310, -1165547, 11023034, -5890011, -24896314, -4858145, -35883916, +15782394, -39550208, 21883932, -27699854, -24239722, 5467494, 18855980, 13714904, -14253386, 12783970, +24001888, 3273839, 2704756, 4701379, 1226750, -15962246, 16936666, -31369904, -19753628, 454730, +-2884608, -3192771, -5020280, -8790724, 3017215, 26445724, 6173479, 2530810, 1604170, -14408542, +15122580, -4298189, -28900298, -5718212, -376347, -857920, -20067698, -14995878, 13734232, -6340983, +24264418, 3068754, -925029, -22195318, -12182675, 5813775, 2334852, -7434589, 20695300, -19045496, +-11286100, -2818036, -2147484, 18165564, 790811, 21437792, -842887, -22149146, 4024384, -19586662, +11856257, -5718749, 16476568, 28665686, -50982336, 12237972, 6263136, 2739652, 18357764, -5946382, +2934000, 39476656, 33937220, -11823508, -15308337, -2493766, -28572806, 14081587, -3064459, 4229469, +605054, -15412490, 39538932, -19393924, -73793984, -12382928, 13010530, -50520088, -9749039, 13399761, +-42633992, 3858491, 25505664, -20854750, 25467008, -27646168, 21717502, 26621282, -19522236, 5811628, +-3884798, -1372779, -8955007, -13321378, -3282429, 15531675, -12502650, -20939040, -11446088, -17296370, +-2720862, -14060649, -3031173, 4128001, -3888556, 14966887, -16172162, -20855288, 13848048, -21969294, +-30165166, -39776764, -13967234, -3255048, 6405944, 18460844, -9559523, 6890738, 8978092, -9395778, +-3989488, 31801548, -23458574, -3549254, 22866942, 4533875, 17882634, -7505992, 6169184, 23088134, +12898324, -4646081, -3658775, -19620484, 6164889, 22186190, -25219512, -11884711, -8573828, 36042292, +24260660, -34878892, -7301982, 31105226, -9793599, -19226422, -13973139, -19251118, -11831024, 31525596, +18679886, -2377801, 13727252, -3237869, 16793322, -10704132, -6721624, 35169340, -15236396, 6614787, +-10874857, -3427384, -1238024, 9928354, 27485644, 11362873, -20227686, -5185636, -1944547, -2418604, +14846628, 2672007, 27373438, -7854959, 3632469, -2338073, 6945499, -23319524, 12903155, -21421150, +13364328, -441845, 20252918, -4961761, 14448807, -6702834, 3150359, 10204842, -11614665, 10586021, +19896972, 28651726, -17144972, 29382946, 9266929, 34724812, -12568148, 7447474, -4415227, -2992519, +-9918690, -1105417, -14973867, -53919556, -39025148, -9308805, -5517959, 9340480, -1683627, 14415521, +14084272, -28534152, -10628433, -10430328, 26574036, -40381820, 36454072, -11653857, -11957726, 8833674, +16506633, -31753766, -7066295, -189515, 5322002, 949188, -1773285, 14847702, -10339060, 1303523, +7256884, 8375186, 12038256, 10069014, 2637110, -17667348, -4394826, 22505092, -23463944, -19847044, +22983444, 7580081, 15928423, 25623774, 39618388, -9799505, -26906896, 33826088, -14957760, -6354404, +34760244, 10731513, -14258755, -37918120, -25812754, -4253092, -14951318, 17117592, 34173444, 17648558, +-13296145, 35851704, 11020349, -13559749, 8807904, 40107480, 10502806, 7488813, -9772124, -32769526, +-44790604, -34909496, -3743064, 25995826, 6779606, 16383690, 60844116, 30455614, -38375532, -25087440, +15298674, -51392504, -24726126, 44559212, 14910516, -56735444, -48324288, -21364242, -36389648, -33055678, +-17236778, -54029076, 39786968, 17926656, 13775571, 16906066, -4630512, 20441896, 16841640, 23738284, +-2960306, 32017908, -17915382, 24697672, -7226820, -16065862, -4457103, -27361626, 4138738, -8958765, +11349988, -5629092, -10182831, 29620242, -30967788, 22457310, -110059, -12077985, -4636954, 14241575, +14861661, 12029667, 27229556, 23250806, -14431627, -1127966, -12864501, 13960254, -11355357, 11418171, +13400298, 8061117, 7779797, 7044820, -6910066, 31501974, -2177012, 11145440, 3395709, 16003048, +7865696, -32088238, 2614561, -17984638, 5594195, 18331458, -2644089, -11605539, -13391171, 35745404, +-34253976, -24177982, 50784768, -17817672, 12967580, 9184251, 15957414, -3152506, 7978976, -30367030, +1617055, 40157944, -19539416, -7102802, 28102508, 6546067, -26805428, 12505334, -37677600, -137980112, +-148366960, -10197863, -87148648, 67864240, 258684272, 109803520, 154139936, 195629856, -80527416, -58699856, +-26026428, -185362736, -130713568, -46006080, -202247328, -91289528, -22140556, -85962160, 14756434, 180355344, +164109632, 177214112, 232043120, 137261792, -17148194, 47930760, -57269092, -215591248, -118496536, -89798640, +-178929408, -125079648, 2631741, -139810320, -48264160, 24486146, -138337680, -74164424, 96845072, 33843268, +105463992, 266627808, 217437552, 173556944, 318101920, 228274832, -7155416, 28579786, -63073744, -292923744, +-278069056, -288776416, -444851776, -304239904, -187310496, -185640304, 514322, 139642816, 160726800, 223222880, +343002528, 314833440, 268950848, 262911056, 153861296, 52892524, 12884365, -14259291, -112143208, -200613088, +-239049824, -256209824, -335403136, -255880736, -100100120, 29174102, 28749974, 0, 0, 0, +0, 0, 0, }, { 8801462, -1883343, -196495, -1462973, -2813204, -2139431, 2573222, 3369939, 1700270, 2755222, 520228, --1939715, -264141, 151398, -2012192, -2039573, -3981435, 5708549, -2593624, 4967130, -3507378, --4341138, 590021, 6983080, -468688, 2850248, -793495, 1972464, 2929168, 2231236, 3717294, -2377801, -6961605, 403727, -3833795, 1169305, -1810329, -858993, -1358820, 253403, -590558, --1314797, 52076, -687732, 3553549, 1048509, 379031, 2974265, 2844879, 546535, -1574642, --1372242, -1493575, 1649804, -103079, 222801, -2730526, 7178501, 3269544, 1732482, -1275605, --1525787, 3157875, 827318, -269509, 975494, -1576790, 907312, -2250026, 74088, 1873680, --3071439, -2076617, -1116155, 148176, 403190, 1709934, -7948374, 3591667, -9015673, 1557463, -460635, 381178, -6212670, -2307471, 1474248, -1489817, 1777580, 2974265, 1707250, -245350, -2284386, -6976101, -26844, -424128, -361314, 3588445, 5501316, -6128382, -1537061, -3775276, --1379221, 1978906, 3709778, 488016, 769336, -1613834, -2148021, -1723893, -1411434, -2854543, -1283122, -2872260, -2056216, 2993055, -2870112, 2116882, 163209, -6862284, -2493766, -3829500, --1099512, 2758980, -2203318, -690416, -2170569, -2122251, -1627793, 2715493, 4051228, 707596, -2160369, 1814624, -2469069, -4345433, 2097018, 1852742, -1140314, -3717831, -3279208, 2772402, -367220, 2095944, 801011, -5626944, -2056216, -2022930, 2958696, 1415729, -5865852, 1745904, --3164317, -505732, -10730439, 7495255, -4997732, 955630, -447750, -1778653, 5821292, -4675609, --2989834, 209917, 6150930, -1974611, -60666, -428423, 5148055, -2736431, -7503308, -1538672, --3710315, -5260261, 510564, -250182, 1216550, 3330210, 5513665, 3410741, 833224, 8107825, -3430605, 433255, 6010270, 6098854, -119722, -3044595, 592706, 2774012, 2474438, 99858, --757525, -4467840, -3665755, -1859721, 4952634, 2012729, 8246337, 4556961, 85899, 2741263, -3637837, 1184337, -4398047, 5378910, -1605244, 2862596, 293132, 1772748, -5273683, -823023, --1293859, 2151242, -1192390, -2090575, 6663642, -319975, -3892314, 1897302, -2757369, 2933463, --1188632, 4659503, 4754529, 4507568, 2428267, -3955665, 3458523, -165893, 3766686, 2091112, -2367064, 19864, -2226941, 2187749, 810138, 579821, 1006096, -8803609, 2734821, -5660767, -843424, 1657321, 1814087, -2678449, 4544076, 584652, -1768990, -948114, 5323612, 3703336, --2396592, -3178813, -2521683, 1909113, 3773129, -2488934, -2564096, 558883, -9877351, -219580, --4231080, -1861868, -4204236, -5689758, -694711, 4766340, 1357747, -4692789, -1196148, 4031901, -1286343, -2986613, 4831302, -2359011, -6730751, -2274185, 3795677, -1949378, 4495757, 8266202, -6946573, 656056, -61740, 2103997, -1008244, -5378373, 103616, 1559073, -3556770, 2688113, --7102266, -1451162, 528818, -3442416, -2245194, 2707977, 6368363, -5337034, -4981625, 2726231, -3362423, 5428302, 2097018, -3860102, 4960151, 3913789, 14904073, -5622649, -2410014, -825707, -10777147, -938987, 8178692, -5739687, 7219840, -6908992, -6053757, 1605244, 3477313, -4029753, --908386, 2241973, -433255, 2885681, -4173098, 5061082, 1891396, -5178120, -99321, 2245731, -1758252, 1066226, 10122701, 8109972, 6344204, 117038, 4145717, 497142, 1253594, 3118683, --9175661, -1300301, 5711770, 3783329, 4443144, 8590, -1580548, 2153926, -312996, 11420318, --1668595, 2017024, 1169842, 662499, -3321084, 6891812, -757525, 7161321, -3884261, -3963718, -2909304, -2602213, -9441412, -4221953, 1850594, -775242, -6797860, 2005213, -67109, 8897025, -656056, 909459, -2818036, 3360275, 3063922, -516470, -716723, 7948374, 5420249, 5954436, --3954591, -4792110, -4576825, 10654203, -8818105, -441308, -9205726, -6151467, -3699041, 7571491, -4402879, -11134703, -15051176, -5988258, 5084168, 3462818, -2387465, 4815732, -100395, -1559073, -437550, -8125005, 2222109, -1343788, 527744, 2147484, 411780, -364535, 3177202, 2536178, --5297842, -5543729, 5825050, -2248952, -2993592, 3235184, -10250476, 2022393, 2060511, -9796284, -3358128, 9270687, 5834713, 6209449, 1332514, 3205119, 9192841, 1239098, 1745367, -11083163, -5583995, 7434052, 6535330, 692564, 6652905, -8120710, 7462506, -2844879, -7348689, -12071006, --32212, -7952669, -5757941, -3243774, -6834904, -18136574, 907849, 70867, -391916, 1804423, -8773008, 2237678, 3736085, 1210107, -5828808, -280247, 3403762, 1128503, 2962991, -23587960, -11426760, 1363652, -9243843, 2090575, -1132798, -2814277, -1992328, -5287642, 2640868, -2770791, -411243, 3258807, 2983392, 10043781, -4243965, -9833328, 5149129, -12436078, -5447093, 1891933, -1557463, 1287953, 3852586, 4827543, 4121021, -204011, 5498632, 253940, -2376191, 7373922, -4502200, -2390686, 4316979, -7852274, 14496588, 445066, 2589865, -1478543, -12690555, -2280091, --4801774, -4503810, 1826972, 10366977, 178778, 338766, -1461900, -2987150, -6884296, 2048163, --1214939, 3652870, -8628589, 2788508, 4479651, 1911261, -6385006, -2337536, 1633698, 729608, -5120675, 922881, 17815524, -5158793, -7507066, -8693014, -2467996, 114890, 6582575, -8632347, --737661, -3690451, 4545149, -12437152, 601832, -2719788, -3322694, 10277320, -3720516, -2855617, -1973538, 2794413, -8853001, -8965207, -8189966, -7761006, -12426414, 7295002, -7390565, 1788317, -2658585, 10661719, -2107218, -2991445, 8356396, 1623498, 1533840, -10524280, -6914898, 4594005, -1898912, 3565360, 5701569, -11087458, -137976, 4146254, 9942849, -527207, 717796, -1967095, --233539, -7409356, -1554778, -2616172, -13191455, -1500017, 3740917, -7909183, 2971581, -8573292, --252866, -6091338, -1349694, -2251100, 542240, 9937481, -3228205, -391916, 5188858, -3541738, -2981244, -9237401, -15606837, -8979166, -4816269, -2786360, 1535451, 9700184, -4942434, 2131378, -2445984, -8077760, 2472291, -6389301, -2010045, 3092377, 10515154, -2285996, -449361, 2723009, --30602, -10191421, 10588705, 11098195, -3041911, 1269163, 11639361, -11297911, -10002442, 8950175, --1796370, 1440962, 8184060, -1310502, -1865090, 8131984, -14308684, 6467147, -355409, 2713346, -7418483, 7570954, -7866770, 1786170, -10921028, 3690451, -3060164, -972810, -7493644, -171799, --10878615, 1313186, -9380209, 7030862, -3067144, 1512365, 12474196, 5849209, 5781563, -9457518, -2140504, 11467563, -2297808, -15754477, 8943196, -1725503, 1935957, -2916820, -7034083, 10786273, -4174708, 8835285, 2531883, 1484448, -6711424, -8966281, 3703336, 4562329, 5005248, 6387153, -14521821, -199179, -10594074, -6854231, 8872329, -926639, -9088688, -2158221, -275415, -2225330, --11676942, 562104, 1795296, 3381213, -4308926, 7288560, -635655, 1068373, 8588324, 8034810, --10187126, 11531450, -2817499, 12206297, -10300405, 8983998, 834297, -1162326, 15266461, -8260296, -754304, -8025147, -2499671, 23332410, 11192148, 4796405, 3244311, 6491306, -3917547, -234076, --20047834, 3491272, -981937, -8808441, 9390946, 6949794, -442382, 1491964, -11637214, 9922448, --5506685, 10550050, 6914898, 5535676, -8378408, -1659468, -7061463, 10122701, 2257005, -3968550, -18192408, 8546448, -2178085, 758599, -15276662, 2375117, 601832, 11852499, -5508296, -15619722, --2743947, -4453344, -3081639, -21981642, -10940355, -23390392, -11895986, -8451422, 2681670, -5971615, -10927471, 1260573, -12561706, 7492034, -8390755, 11830487, -10546292, -8537858, 6244346, 10697153, -10526965, 329639, -9549860, -7174206, 5122822, -15169824, -17877264, -12092480, -2405719, -963683, --3003256, 3329674, 5397164, 3565897, -806917, 1577327, -6246493, 2840584, -11851425, -16088411, --358093, 11064909, 1207960, -4864588, 8558259, 4866198, 8239358, 14648523, 1090385, -5457293, --10712722, -8552354, 3546032, -9700184, -7195681, 1595044, -8099235, -16394427, -9606231, -1591822, --2860448, 2935073, -4595615, 7945690, 1419487, 2550137, 10879152, -2678449, 250182, 2022393, --10807748, 10537702, 599685, -11253351, -18433462, 3549254, 168041, -13267691, 11732777, 7697119, --13037373, 3023657, 9482214, 5312338, 1289564, 8234526, -5990943, -4717485, -1214402, -6165963, --10208600, 12787728, -14677514, -2659122, 2732673, -234076, 18907520, -20478940, 2547989, -4450123, --3968550, 3050501, -1646046, 2463701, -4757213, -11759620, 9257265, -20785494, -14919106, 10040560, --1072131, -18988588, 8858370, -11361262, 20248086, 3559991, -27966680, -4093104, 1927367, -7530152, -1501091, 4166118, 9168145, 7716983, -16470126, -1308354, 938450, -3911642, -15133317, -2865280, --3571265, -5618891, -4990215, -817654, 541703, 11810623, 13066364, -4816806, 6792491, 5731097, -5653788, 12964896, -357556, 3062312, -16142635, -5941551, 4975720, -3652333, 7012071, 18054432, -2214056, -16824460, -36824512, -603980, -11722576, 9804873, -7398081, -4174708, -7676181, -20055350, -7980586, 25799868, 969052, 6503118, -21145198, 3948686, -2935610, -9494025, 1730335, 9921911, -4564477, 8125005, -9552544, 13238700, 6906308, -14565308, -23190140, -118648, -16962436, -39697844, --25130390, 17860622, 14298483, 23447838, -262530, 9220758, 2095407, 7401840, -522375, 4788889, --10665478, -12466143, -8023536, -11134703, -7508677, -7895224, 9251896, 22701050, 4597763, -27461484, --6916508, 4981089, -7714298, 6911676, -16182363, -1076963, -973884, 1144609, 7218767, 6083821, -583579, -1613834, -4048544, 6736120, 11921755, -9652939, -16103443, 10703595, 4293894, 13955959, -5526013, 20136418, -14309220, -4286378, 11835856, 19302120, 15533823, 10233296, 3773129, -3397319, -372052, -1684701, -841814, 7241315, -25487410, 13981192, -2956548, 4440996, -2705830, 19567872, --6832756, 759136, -5304822, 12947179, 8731132, -19661824, 13638669, -16393353, -2338610, -7445863, --10431402, 9924596, 60130, -25675852, -3426847, -143345, 22280680, -24150602, -248034, -13606993, --38875896, -4353486, -14135274, -30666604, 6525666, 66035, -5660767, 2203855, 16991428, -824097, --17201880, 6276558, 1096290, -5411122, -3830037, -2903935, 1300301, 19385334, -3875134, -489626, -9140764, 6638946, -2303176, 9480067, 8963060, -3899294, -3534758, -7513509, 11171747, -2371896, --17832168, 2971581, -665720, 6467684, 24634858, -15912317, -25161530, -16110959, -6896644, 3686156, -9251896, 4677757, 19006304, 9247601, -12179990, -7376070, -16837882, 15300821, 10193031, 1730335, -4101694, -10094247, 1986422, -10712185, 19450296, 18053896, 2356863, -8546985, -3540127, 1626719, -18067854, 33313914, 22035866, -3488050, -5932961, 47782, 12462384, 4094715, 11966316, 12914967, --10797548, -1349157, -21802328, -14087493, 8704288, 10142565, -17408040, -501974, -8182987, 16160351, --14177687, 4843113, 3119757, 29945048, -15707232, -3331284, -16205985, -2093260, -15988016, -13087302, --9022116, 7356205, -17329120, -12002823, -18993956, -3462818, -1400696, -4498442, -7641821, -21227876, -7751342, -14446123, 8313983, -15232102, 22821308, 5153961, 11182484, -2148558, -18172544, 12607876, -7908646, -4729296, 12397960, 16906066, -6311455, -19419694, -9729175, 30800284, -10517301, 1154809, -2516314, -2744484, 8106751, 20804822, 5106716, 10149008, -4182225, 15608985, 2022393, 12843563, -5056250, 5982353, 1556926, 3580392, 24703578, 9512816, 56512644, -30579630, 23255638, 32778116, --5852967, 3747896, 17541184, -7857106, -1067299, 28723130, 12241194, 113280, 15738908, -82141, -29037738, 32646046, -871878, 23256712, 22988812, -2528662, 9546639, -25665114, -9070434, 20626580, -557809, 20395190, 28451474, 23710366, -6563247, 15167677, -26779658, -40115532, -18464064, -15533286, -7712151, -751619, 8323110, 10162966, 21790516, 17568026, 4490925, -19362250, -4211753, 18075370, -4021700, -9735080, 9975062, 25271050, -5014911, 8528194, -23208930, 9690520, -18847928, -4813048, --12856985, -22049826, 10982768, 1349694, 4051765, 26035018, -16678432, -15862388, 6779069, 27171036, --24004036, -14003741, 5952288, -6521371, 35265976, 28773596, -29964376, -9520869, -24458766, 1951526, -19981798, -9802726, -19681150, -6120329, -2214056, 7181186, -23200340, 6586333, 34968548, 5262946, --30212410, -36642512, 27807766, -34165392, -36450852, -12618077, 4695473, -8589935, 4379793, 1587527, --37418828, -22740778, -28578712, 4802847, 12928388, 2904472, 20892868, 18038326, 27038966, 6532109, -29741038, 11582990, 18640158, -12501576, -5540508, -12602508, -25795036, -20031728, -38995080, -24939264, --8644159, -24604794, 3454764, -3650722, -1874753, 6101001, 6134824, 481573, 16995722, -7553237, --16137266, 18669686, 1004486, -31889596, -13316546, -6326487, -35377644, -29528438, -26217018, -1039382, -11699491, -158914, -13775034, -5287105, 14061186, 5159867, 34141768, 2539400, -46352896, -19443854, --7937100, 3180423, 7462506, -9724343, -11824582, 12495134, -24945170, -9677098, -19604916, 10299332, --39129300, -30706332, -31328566, -32706712, 3276523, -21937082, -9004399, -34676492, 16458852, 37723772, -2510409, 17250736, -13398687, -9883257, 25905096, 10404558, 26076358, -43882756, 18227842, 32416266, --3899294, 37442988, -20746840, -57641144, -30587146, -504659, -6640557, 6305012, -21559662, 19891068, -27047020, -25190520, 21205328, -13689135, -18118320, -39900248, -17621178, -22757422, -16532940, -18066780, -16727287, 3158412, -37410240, -45509472, 33260764, 8490613, 10867341, -10059350, 1104344, -11664057, --1437740, 11472931, 14194330, 15541339, 36998460, 2348273, -30001420, 38989712, -6153615, -8487929, --19807316, 17398376, -33463700, -19283866, 15122580, -14430016, -26860188, -28489054, -29424820, -3620121, -585189, 5136244, -11381126, 35229468, 24511916, 18254, -19517406, -24411520, -35344360, 11059004, -2391223, -2512556, -7721815, 49095236, -2127620, -8439074, 13621489, 14622216, -36165772, 27870042, -18311594, 54825256, 24395952, 1727114, -17644800, 26397406, 140123, 2294586, -11869142, 24082956, --26867168, 20435992, 19921668, 20669530, 10492068, -7117298, 27622008, 34089156, -6182606, 14239427, --20210506, 34245384, 15263777, 11609297, -20891258, -47169480, 10251550, -14335527, -9987410, -19069118, --23361938, 14766634, 7464653, -11677479, 3634079, 1203128, -11846057, -57884348, -2626373, -12310450, --4919885, -948114, 41869488, 27759984, -12517682, 10361072, -25759066, 2788508, 21298206, -31005368, --27288612, -23784456, 38212860, -26986354, 9006010, 29141890, -38611220, -37782292, 35667020, 26466126, -30249454, 37476276, 15805480, -50180788, 12792560, 13221520, -2498060, 78604344, -6289443, -14182519, --34020436, -33870112, 18698676, -32354526, 21883932, 1163936, 25046638, -7883950, 13600551, 41763724, -4947266, -32806570, 50597400, 13395466, -1646583, 36403068, 18945638, 29713658, 12208445, -40563280, --7574175, -14282377, 21451214, 50349900, -29329794, 9292162, -13181255, 23161148, 26774290, -31685584, -29309394, -25211458, -22107808, 13430363, 24465744, 2230699, 9323837, 18909130, -24931212, 24808804, -3681324, 29976188, -3264175, -6480569, 11259257, 43746928, -17268990, 35506496, -14776835, 7938174, -10936597, 35377644, -81604, -1364726, 13816373, 52719648, 5407901, -39852464, -1287953, -48213156, -31376884, 653909, 82158432, 17585206, -21324512, -6800544, 19834158, -17570174, 30296700, 52240224, -38001872, 531502, 17479980, 22108344, -234613, -25222196, -900869, -6915434, -81031000, 50061064, -41704668, 32771674, 11785390, -40563820, 32202592, -18741090, 32720134, -28560458, 5573257, 16143708, --14481019, 2996277, 6586333, -7140920, -15214385, -28748364, 45683956, -9172976, -8442295, -14081587, --2103460, -5189931, 15086073, -29313152, -8399882, -17899276, 6862284, -17956184, 18657874, 1081258, -9734007, -19832012, -38165616, 3110630, -27856622, -27990838, 13484587, -21111374, -18871012, 38565584, --13590887, -20221780, 2908230, -20784420, 10581726, 15608448, -3996467, -16593069, -5247913, 12319577, -9415105, -6547141, -734439, 34533148, -5789616, -18357228, -25618944, -1793149, -11200201, -36684928, -36315024, 14530948, -44270376, 29351806, -1842541, -16530792, 85505280, 50136764, 39565240, 22942642, -12405476, -18194556, 3776350, 11351062, 10992969, 5586142, 38842612, 9705552, -8486855, -18103824, --68838128, -38284800, 66773856, 9198209, 22436910, 12569759, -15531675, 13040058, 19417010, 5396627, --1045288, -15187541, -1938641, 5248450, -6587943, -4923107, 3644280, 8137353, 20080582, -12570832, -8972187, 1493038, 16227460, -4708358, 3957276, 5737003, -16660715, 14986752, 3263102, 4210142, -6095633, 5941551, -10177462, 12530030, -8625368, 3062849, 12386149, -5588290, 12178380, -4224637, -15101105, 11491722, 7395397, -16889422, 14114873, 10448582, 9026948, 22260278, -19799800, -1339493, -938450, -3984119, 7549479, -10370199, -16145319, 12283606, 14643154, 7102266, -424128, 3175055, --599148, 7263864, -4778151, 3056406, -11528766, 11865921, -18596134, 18937048, 11943767, -6340446, -1195075, 7719667, 2094870, 6803228, 1759863, 552977, 1149441, 12639552, -52721796, -122738352, --19666118, 71656696, 65118684, 160322544, 83769576, -43326556, -13273060, -89010512, -150811872, -10590852, --68512784, -9746355, 109944720, 46716896, 84972168, 130108520, -15077483, -19344532, -66100084, -112850800, --89385248, -6057515, -33487324, -13050795, 93700080, 29335164, 61030948, 110219064, 18326626, -818191, -11682311, -67638752, -101563088, 17085380, -104933568, -69267088, 23667418, -11036455, 17445620, 134941968, -15909096, 51410760, 110976584, -22559852, 3867618, 24100136, -106128640, -89481888, -30991410, -121936272, --46433964, 14818174, 23050016, 82888040, 118359632, 83191904, 59947544, 50856172, -18800146, -71845136, --57461292, -88676576, -91294896, -40419400, -22210886, -261456, 78885664, 91531120, 30698278, 71353368, -23435490, -23566486, 18785650, -49638012, -52439404, -7990787, -8610336, 0, 0, 0, -0, 0, 0, }, +1883343, -196495, -1462973, -2813204, -2139431, 2573222, 3369939, 1700270, 2755222, 520228, +-1939715, -264141, 151398, -2012192, -2039573, -3981435, 5708549, -2593624, 4967130, -3507378, +-4341138, 590021, 6983080, -468688, 2850248, -793495, 1972464, 2929168, 2231236, 3717294, +2377801, -6961605, 403727, -3833795, 1169305, -1810329, -858993, -1358820, 253403, -590558, +-1314797, 52076, -687732, 3553549, 1048509, 379031, 2974265, 2844879, 546535, -1574642, +-1372242, -1493575, 1649804, -103079, 222801, -2730526, 7178501, 3269544, 1732482, -1275605, +-1525787, 3157875, 827318, -269509, 975494, -1576790, 907312, -2250026, 74088, 1873680, +-3071439, -2076617, -1116155, 148176, 403190, 1709934, -7948374, 3591667, -9015673, 1557463, +460635, 381178, -6212670, -2307471, 1474248, -1489817, 1777580, 2974265, 1707250, -245350, +2284386, -6976101, -26844, -424128, -361314, 3588445, 5501316, -6128382, -1537061, -3775276, +-1379221, 1978906, 3709778, 488016, 769336, -1613834, -2148021, -1723893, -1411434, -2854543, +1283122, -2872260, -2056216, 2993055, -2870112, 2116882, 163209, -6862284, -2493766, -3829500, +-1099512, 2758980, -2203318, -690416, -2170569, -2122251, -1627793, 2715493, 4051228, 707596, +2160369, 1814624, -2469069, -4345433, 2097018, 1852742, -1140314, -3717831, -3279208, 2772402, +367220, 2095944, 801011, -5626944, -2056216, -2022930, 2958696, 1415729, -5865852, 1745904, +-3164317, -505732, -10730439, 7495255, -4997732, 955630, -447750, -1778653, 5821292, -4675609, +-2989834, 209917, 6150930, -1974611, -60666, -428423, 5148055, -2736431, -7503308, -1538672, +-3710315, -5260261, 510564, -250182, 1216550, 3330210, 5513665, 3410741, 833224, 8107825, +3430605, 433255, 6010270, 6098854, -119722, -3044595, 592706, 2774012, 2474438, 99858, +-757525, -4467840, -3665755, -1859721, 4952634, 2012729, 8246337, 4556961, 85899, 2741263, +3637837, 1184337, -4398047, 5378910, -1605244, 2862596, 293132, 1772748, -5273683, -823023, +-1293859, 2151242, -1192390, -2090575, 6663642, -319975, -3892314, 1897302, -2757369, 2933463, +-1188632, 4659503, 4754529, 4507568, 2428267, -3955665, 3458523, -165893, 3766686, 2091112, +2367064, 19864, -2226941, 2187749, 810138, 579821, 1006096, -8803609, 2734821, -5660767, +843424, 1657321, 1814087, -2678449, 4544076, 584652, -1768990, -948114, 5323612, 3703336, +-2396592, -3178813, -2521683, 1909113, 3773129, -2488934, -2564096, 558883, -9877351, -219580, +-4231080, -1861868, -4204236, -5689758, -694711, 4766340, 1357747, -4692789, -1196148, 4031901, +1286343, -2986613, 4831302, -2359011, -6730751, -2274185, 3795677, -1949378, 4495757, 8266202, +6946573, 656056, -61740, 2103997, -1008244, -5378373, 103616, 1559073, -3556770, 2688113, +-7102266, -1451162, 528818, -3442416, -2245194, 2707977, 6368363, -5337034, -4981625, 2726231, +3362423, 5428302, 2097018, -3860102, 4960151, 3913789, 14904073, -5622649, -2410014, -825707, +10777147, -938987, 8178692, -5739687, 7219840, -6908992, -6053757, 1605244, 3477313, -4029753, +-908386, 2241973, -433255, 2885681, -4173098, 5061082, 1891396, -5178120, -99321, 2245731, +1758252, 1066226, 10122701, 8109972, 6344204, 117038, 4145717, 497142, 1253594, 3118683, +-9175661, -1300301, 5711770, 3783329, 4443144, 8590, -1580548, 2153926, -312996, 11420318, +-1668595, 2017024, 1169842, 662499, -3321084, 6891812, -757525, 7161321, -3884261, -3963718, +2909304, -2602213, -9441412, -4221953, 1850594, -775242, -6797860, 2005213, -67109, 8897025, +656056, 909459, -2818036, 3360275, 3063922, -516470, -716723, 7948374, 5420249, 5954436, +-3954591, -4792110, -4576825, 10654203, -8818105, -441308, -9205726, -6151467, -3699041, 7571491, +4402879, -11134703, -15051176, -5988258, 5084168, 3462818, -2387465, 4815732, -100395, -1559073, +437550, -8125005, 2222109, -1343788, 527744, 2147484, 411780, -364535, 3177202, 2536178, +-5297842, -5543729, 5825050, -2248952, -2993592, 3235184, -10250476, 2022393, 2060511, -9796284, +3358128, 9270687, 5834713, 6209449, 1332514, 3205119, 9192841, 1239098, 1745367, -11083163, +5583995, 7434052, 6535330, 692564, 6652905, -8120710, 7462506, -2844879, -7348689, -12071006, +-32212, -7952669, -5757941, -3243774, -6834904, -18136574, 907849, 70867, -391916, 1804423, +8773008, 2237678, 3736085, 1210107, -5828808, -280247, 3403762, 1128503, 2962991, -23587960, +11426760, 1363652, -9243843, 2090575, -1132798, -2814277, -1992328, -5287642, 2640868, -2770791, +411243, 3258807, 2983392, 10043781, -4243965, -9833328, 5149129, -12436078, -5447093, 1891933, +1557463, 1287953, 3852586, 4827543, 4121021, -204011, 5498632, 253940, -2376191, 7373922, +4502200, -2390686, 4316979, -7852274, 14496588, 445066, 2589865, -1478543, -12690555, -2280091, +-4801774, -4503810, 1826972, 10366977, 178778, 338766, -1461900, -2987150, -6884296, 2048163, +-1214939, 3652870, -8628589, 2788508, 4479651, 1911261, -6385006, -2337536, 1633698, 729608, +5120675, 922881, 17815524, -5158793, -7507066, -8693014, -2467996, 114890, 6582575, -8632347, +-737661, -3690451, 4545149, -12437152, 601832, -2719788, -3322694, 10277320, -3720516, -2855617, +1973538, 2794413, -8853001, -8965207, -8189966, -7761006, -12426414, 7295002, -7390565, 1788317, +2658585, 10661719, -2107218, -2991445, 8356396, 1623498, 1533840, -10524280, -6914898, 4594005, +1898912, 3565360, 5701569, -11087458, -137976, 4146254, 9942849, -527207, 717796, -1967095, +-233539, -7409356, -1554778, -2616172, -13191455, -1500017, 3740917, -7909183, 2971581, -8573292, +-252866, -6091338, -1349694, -2251100, 542240, 9937481, -3228205, -391916, 5188858, -3541738, +2981244, -9237401, -15606837, -8979166, -4816269, -2786360, 1535451, 9700184, -4942434, 2131378, +2445984, -8077760, 2472291, -6389301, -2010045, 3092377, 10515154, -2285996, -449361, 2723009, +-30602, -10191421, 10588705, 11098195, -3041911, 1269163, 11639361, -11297911, -10002442, 8950175, +-1796370, 1440962, 8184060, -1310502, -1865090, 8131984, -14308684, 6467147, -355409, 2713346, +7418483, 7570954, -7866770, 1786170, -10921028, 3690451, -3060164, -972810, -7493644, -171799, +-10878615, 1313186, -9380209, 7030862, -3067144, 1512365, 12474196, 5849209, 5781563, -9457518, +2140504, 11467563, -2297808, -15754477, 8943196, -1725503, 1935957, -2916820, -7034083, 10786273, +4174708, 8835285, 2531883, 1484448, -6711424, -8966281, 3703336, 4562329, 5005248, 6387153, +14521821, -199179, -10594074, -6854231, 8872329, -926639, -9088688, -2158221, -275415, -2225330, +-11676942, 562104, 1795296, 3381213, -4308926, 7288560, -635655, 1068373, 8588324, 8034810, +-10187126, 11531450, -2817499, 12206297, -10300405, 8983998, 834297, -1162326, 15266461, -8260296, +754304, -8025147, -2499671, 23332410, 11192148, 4796405, 3244311, 6491306, -3917547, -234076, +-20047834, 3491272, -981937, -8808441, 9390946, 6949794, -442382, 1491964, -11637214, 9922448, +-5506685, 10550050, 6914898, 5535676, -8378408, -1659468, -7061463, 10122701, 2257005, -3968550, +18192408, 8546448, -2178085, 758599, -15276662, 2375117, 601832, 11852499, -5508296, -15619722, +-2743947, -4453344, -3081639, -21981642, -10940355, -23390392, -11895986, -8451422, 2681670, -5971615, +10927471, 1260573, -12561706, 7492034, -8390755, 11830487, -10546292, -8537858, 6244346, 10697153, +10526965, 329639, -9549860, -7174206, 5122822, -15169824, -17877264, -12092480, -2405719, -963683, +-3003256, 3329674, 5397164, 3565897, -806917, 1577327, -6246493, 2840584, -11851425, -16088411, +-358093, 11064909, 1207960, -4864588, 8558259, 4866198, 8239358, 14648523, 1090385, -5457293, +-10712722, -8552354, 3546032, -9700184, -7195681, 1595044, -8099235, -16394427, -9606231, -1591822, +-2860448, 2935073, -4595615, 7945690, 1419487, 2550137, 10879152, -2678449, 250182, 2022393, +-10807748, 10537702, 599685, -11253351, -18433462, 3549254, 168041, -13267691, 11732777, 7697119, +-13037373, 3023657, 9482214, 5312338, 1289564, 8234526, -5990943, -4717485, -1214402, -6165963, +-10208600, 12787728, -14677514, -2659122, 2732673, -234076, 18907520, -20478940, 2547989, -4450123, +-3968550, 3050501, -1646046, 2463701, -4757213, -11759620, 9257265, -20785494, -14919106, 10040560, +-1072131, -18988588, 8858370, -11361262, 20248086, 3559991, -27966680, -4093104, 1927367, -7530152, +1501091, 4166118, 9168145, 7716983, -16470126, -1308354, 938450, -3911642, -15133317, -2865280, +-3571265, -5618891, -4990215, -817654, 541703, 11810623, 13066364, -4816806, 6792491, 5731097, +5653788, 12964896, -357556, 3062312, -16142635, -5941551, 4975720, -3652333, 7012071, 18054432, +2214056, -16824460, -36824512, -603980, -11722576, 9804873, -7398081, -4174708, -7676181, -20055350, +7980586, 25799868, 969052, 6503118, -21145198, 3948686, -2935610, -9494025, 1730335, 9921911, +4564477, 8125005, -9552544, 13238700, 6906308, -14565308, -23190140, -118648, -16962436, -39697844, +-25130390, 17860622, 14298483, 23447838, -262530, 9220758, 2095407, 7401840, -522375, 4788889, +-10665478, -12466143, -8023536, -11134703, -7508677, -7895224, 9251896, 22701050, 4597763, -27461484, +-6916508, 4981089, -7714298, 6911676, -16182363, -1076963, -973884, 1144609, 7218767, 6083821, +583579, -1613834, -4048544, 6736120, 11921755, -9652939, -16103443, 10703595, 4293894, 13955959, +5526013, 20136418, -14309220, -4286378, 11835856, 19302120, 15533823, 10233296, 3773129, -3397319, +372052, -1684701, -841814, 7241315, -25487410, 13981192, -2956548, 4440996, -2705830, 19567872, +-6832756, 759136, -5304822, 12947179, 8731132, -19661824, 13638669, -16393353, -2338610, -7445863, +-10431402, 9924596, 60130, -25675852, -3426847, -143345, 22280680, -24150602, -248034, -13606993, +-38875896, -4353486, -14135274, -30666604, 6525666, 66035, -5660767, 2203855, 16991428, -824097, +-17201880, 6276558, 1096290, -5411122, -3830037, -2903935, 1300301, 19385334, -3875134, -489626, +9140764, 6638946, -2303176, 9480067, 8963060, -3899294, -3534758, -7513509, 11171747, -2371896, +-17832168, 2971581, -665720, 6467684, 24634858, -15912317, -25161530, -16110959, -6896644, 3686156, +9251896, 4677757, 19006304, 9247601, -12179990, -7376070, -16837882, 15300821, 10193031, 1730335, +4101694, -10094247, 1986422, -10712185, 19450296, 18053896, 2356863, -8546985, -3540127, 1626719, +18067854, 33313914, 22035866, -3488050, -5932961, 47782, 12462384, 4094715, 11966316, 12914967, +-10797548, -1349157, -21802328, -14087493, 8704288, 10142565, -17408040, -501974, -8182987, 16160351, +-14177687, 4843113, 3119757, 29945048, -15707232, -3331284, -16205985, -2093260, -15988016, -13087302, +-9022116, 7356205, -17329120, -12002823, -18993956, -3462818, -1400696, -4498442, -7641821, -21227876, +7751342, -14446123, 8313983, -15232102, 22821308, 5153961, 11182484, -2148558, -18172544, 12607876, +7908646, -4729296, 12397960, 16906066, -6311455, -19419694, -9729175, 30800284, -10517301, 1154809, +2516314, -2744484, 8106751, 20804822, 5106716, 10149008, -4182225, 15608985, 2022393, 12843563, +5056250, 5982353, 1556926, 3580392, 24703578, 9512816, 56512644, -30579630, 23255638, 32778116, +-5852967, 3747896, 17541184, -7857106, -1067299, 28723130, 12241194, 113280, 15738908, -82141, +29037738, 32646046, -871878, 23256712, 22988812, -2528662, 9546639, -25665114, -9070434, 20626580, +557809, 20395190, 28451474, 23710366, -6563247, 15167677, -26779658, -40115532, -18464064, -15533286, +7712151, -751619, 8323110, 10162966, 21790516, 17568026, 4490925, -19362250, -4211753, 18075370, +4021700, -9735080, 9975062, 25271050, -5014911, 8528194, -23208930, 9690520, -18847928, -4813048, +-12856985, -22049826, 10982768, 1349694, 4051765, 26035018, -16678432, -15862388, 6779069, 27171036, +-24004036, -14003741, 5952288, -6521371, 35265976, 28773596, -29964376, -9520869, -24458766, 1951526, +19981798, -9802726, -19681150, -6120329, -2214056, 7181186, -23200340, 6586333, 34968548, 5262946, +-30212410, -36642512, 27807766, -34165392, -36450852, -12618077, 4695473, -8589935, 4379793, 1587527, +-37418828, -22740778, -28578712, 4802847, 12928388, 2904472, 20892868, 18038326, 27038966, 6532109, +29741038, 11582990, 18640158, -12501576, -5540508, -12602508, -25795036, -20031728, -38995080, -24939264, +-8644159, -24604794, 3454764, -3650722, -1874753, 6101001, 6134824, 481573, 16995722, -7553237, +-16137266, 18669686, 1004486, -31889596, -13316546, -6326487, -35377644, -29528438, -26217018, -1039382, +11699491, -158914, -13775034, -5287105, 14061186, 5159867, 34141768, 2539400, -46352896, -19443854, +-7937100, 3180423, 7462506, -9724343, -11824582, 12495134, -24945170, -9677098, -19604916, 10299332, +-39129300, -30706332, -31328566, -32706712, 3276523, -21937082, -9004399, -34676492, 16458852, 37723772, +2510409, 17250736, -13398687, -9883257, 25905096, 10404558, 26076358, -43882756, 18227842, 32416266, +-3899294, 37442988, -20746840, -57641144, -30587146, -504659, -6640557, 6305012, -21559662, 19891068, +27047020, -25190520, 21205328, -13689135, -18118320, -39900248, -17621178, -22757422, -16532940, -18066780, +16727287, 3158412, -37410240, -45509472, 33260764, 8490613, 10867341, -10059350, 1104344, -11664057, +-1437740, 11472931, 14194330, 15541339, 36998460, 2348273, -30001420, 38989712, -6153615, -8487929, +-19807316, 17398376, -33463700, -19283866, 15122580, -14430016, -26860188, -28489054, -29424820, -3620121, +585189, 5136244, -11381126, 35229468, 24511916, 18254, -19517406, -24411520, -35344360, 11059004, +2391223, -2512556, -7721815, 49095236, -2127620, -8439074, 13621489, 14622216, -36165772, 27870042, +18311594, 54825256, 24395952, 1727114, -17644800, 26397406, 140123, 2294586, -11869142, 24082956, +-26867168, 20435992, 19921668, 20669530, 10492068, -7117298, 27622008, 34089156, -6182606, 14239427, +-20210506, 34245384, 15263777, 11609297, -20891258, -47169480, 10251550, -14335527, -9987410, -19069118, +-23361938, 14766634, 7464653, -11677479, 3634079, 1203128, -11846057, -57884348, -2626373, -12310450, +-4919885, -948114, 41869488, 27759984, -12517682, 10361072, -25759066, 2788508, 21298206, -31005368, +-27288612, -23784456, 38212860, -26986354, 9006010, 29141890, -38611220, -37782292, 35667020, 26466126, +30249454, 37476276, 15805480, -50180788, 12792560, 13221520, -2498060, 78604344, -6289443, -14182519, +-34020436, -33870112, 18698676, -32354526, 21883932, 1163936, 25046638, -7883950, 13600551, 41763724, +4947266, -32806570, 50597400, 13395466, -1646583, 36403068, 18945638, 29713658, 12208445, -40563280, +-7574175, -14282377, 21451214, 50349900, -29329794, 9292162, -13181255, 23161148, 26774290, -31685584, +29309394, -25211458, -22107808, 13430363, 24465744, 2230699, 9323837, 18909130, -24931212, 24808804, +3681324, 29976188, -3264175, -6480569, 11259257, 43746928, -17268990, 35506496, -14776835, 7938174, +10936597, 35377644, -81604, -1364726, 13816373, 52719648, 5407901, -39852464, -1287953, -48213156, +31376884, 653909, 82158432, 17585206, -21324512, -6800544, 19834158, -17570174, 30296700, 52240224, +38001872, 531502, 17479980, 22108344, -234613, -25222196, -900869, -6915434, -81031000, 50061064, +41704668, 32771674, 11785390, -40563820, 32202592, -18741090, 32720134, -28560458, 5573257, 16143708, +-14481019, 2996277, 6586333, -7140920, -15214385, -28748364, 45683956, -9172976, -8442295, -14081587, +-2103460, -5189931, 15086073, -29313152, -8399882, -17899276, 6862284, -17956184, 18657874, 1081258, +9734007, -19832012, -38165616, 3110630, -27856622, -27990838, 13484587, -21111374, -18871012, 38565584, +-13590887, -20221780, 2908230, -20784420, 10581726, 15608448, -3996467, -16593069, -5247913, 12319577, +9415105, -6547141, -734439, 34533148, -5789616, -18357228, -25618944, -1793149, -11200201, -36684928, +36315024, 14530948, -44270376, 29351806, -1842541, -16530792, 85505280, 50136764, 39565240, 22942642, +12405476, -18194556, 3776350, 11351062, 10992969, 5586142, 38842612, 9705552, -8486855, -18103824, +-68838128, -38284800, 66773856, 9198209, 22436910, 12569759, -15531675, 13040058, 19417010, 5396627, +-1045288, -15187541, -1938641, 5248450, -6587943, -4923107, 3644280, 8137353, 20080582, -12570832, +8972187, 1493038, 16227460, -4708358, 3957276, 5737003, -16660715, 14986752, 3263102, 4210142, +6095633, 5941551, -10177462, 12530030, -8625368, 3062849, 12386149, -5588290, 12178380, -4224637, +15101105, 11491722, 7395397, -16889422, 14114873, 10448582, 9026948, 22260278, -19799800, -1339493, +938450, -3984119, 7549479, -10370199, -16145319, 12283606, 14643154, 7102266, -424128, 3175055, +-599148, 7263864, -4778151, 3056406, -11528766, 11865921, -18596134, 18937048, 11943767, -6340446, +1195075, 7719667, 2094870, 6803228, 1759863, 552977, 1149441, 12639552, -52721796, -122738352, +-19666118, 71656696, 65118684, 160322544, 83769576, -43326556, -13273060, -89010512, -150811872, -10590852, +-68512784, -9746355, 109944720, 46716896, 84972168, 130108520, -15077483, -19344532, -66100084, -112850800, +-89385248, -6057515, -33487324, -13050795, 93700080, 29335164, 61030948, 110219064, 18326626, -818191, +11682311, -67638752, -101563088, 17085380, -104933568, -69267088, 23667418, -11036455, 17445620, 134941968, +15909096, 51410760, 110976584, -22559852, 3867618, 24100136, -106128640, -89481888, -30991410, -121936272, +-46433964, 14818174, 23050016, 82888040, 118359632, 83191904, 59947544, 50856172, -18800146, -71845136, +-57461292, -88676576, -91294896, -40419400, -22210886, -261456, 78885664, 91531120, 30698278, 71353368, +23435490, -23566486, 18785650, -49638012, -52439404, -7990787, -8610336, 0, 0, 0, +0, 0, 0, }, }, { { 7561827, -1618666, -2086280, -746787, -6973417, -3740917, 1630477, -356482, -369367, 6088116, 5115306, -1120987, -1479616, -1249299, -3369402, 3058017, 338766, -2038499, -1047972, -1949915, -907312, --500901, -4602595, -4224101, 3770981, 3504693, 1509681, -4344897, -2013266, -1016297, 1904281, --1606855, -2148558, -381715, 188442, 901406, 2044404, 410706, 2925410, -3751654, -3474629, --4669703, -3411815, -1887101, 437550, -613107, -647466, -1973538, 718333, -550293, 396748, -3310346, 2478196, -1255204, -2485712, -1812476, 970663, 764504, 326418, -275952, 6504728, -3992172, 630823, -1284732, 319975, -3777961, 233539, -250182, 1034013, -593779, -2095944, -3583613, -4563403, 215822, 440234, -448824, -4526359, 4527433, 1053878, -2632815, -1228361, --5730023, -1608465, 4591857, -2592550, -1927904, 1347009, -849330, -278636, 180926, -1602023, --1324461, 5603322, 2654827, -794032, 158377, -947577, -1825898, 686658, 1913408, 3040300, --928250, 1102196, 1319629, -5147519, -1680406, -108448, -1137093, 2997887, 143881, -1161789, -2646237, -2225867, 797253, 4225174, -2548526, 172336, 426812, 3180423, -1423245, 4424353, --6585796, -2452426, 2626909, -1385127, -5618354, 274878, 912681, 1693291, 1674500, -712965, --2542084, 71404, -2334315, -1584306, 417149, 2550137, 2252174, -3784940, 2949569, -4139812, -3285113, 17180, 2826625, -1417339, -2887829, -1375463, 1741609, -676994, -935766, -955093, -2390686, -3439195, -15290084, 5016522, -5557151, -2218888, -4547834, -4678293, 2660195, -1566589, --3939022, -2129230, 5374615, 7964480, -4351339, -1635846, -374736, -5757941, -5382131, 389768, --527744, 3492882, 1203128, 2596308, -2279017, -1460289, -2957085, 820876, 5177046, 2214056, -1033477, -3340948, 2552821, 738198, 1580548, -2190433, 235149, 736050, 1204202, -2968896, --2101313, 779537, -4006668, -4181151, 1844152, 3124052, -3475166, -1810329, -1292248, 226560, -3221762, 2504503, 1183800, 448824, 8220568, 3161633, -2461016, 3134789, 2369211, -2285996, -3965866, -1458141, -821949, -48855, -1516124, 3384434, -1743757, 870805, 2257005, 1624571, --2805151, 1174674, 838592, 594853, -733366, -1524177, -216359, 4741107, 894964, 2075543, -11718818, 4722317, -727460, 611496, 2749316, 1478006, -703838, -4943508, 245887, 4546223, --4493610, -426276, -8506183, 2340220, 3581466, 319975, -1962800, 6366216, 4497905, -3958886, -2040110, 325881, -3463891, 5691906, 3173981, -275415, 2348810, 5428839, -1568737, -1012539, -444529, 122943, 216359, 1373853, 6645925, 1413044, 1069447, -10507101, -468151, 576063, -1360968, -4702989, 1206349, -3775276, -2871723, -3998615, -2573759, 117575, 1334124, -2407866, -2605435, -5997922, -3389803, -281320, 31139, 2042257, -2325188, -482110, -2091112, 1404991, -3420942, -1917703, 481036, -1657857, -183610, 5172215, 4139275, -1571958, 3889093, -1778117, --3066070, -4014184, -172336, -453119, 18713710, -7641284, 1861332, -322123, -3035468, 3266323, -5501853, -2994129, 5890548, 44560, 6260989, 1985349, 2444373, -2194728, 3709241, 1643899, -3791919, -6874632, 4239670, -3920768, 1709934, -3234647, 4909685, -882616, 4946729, -2327336, -2066416, -1400159, -5906, 159451, -64425, 2159832, 9892920, 787590, 3195993, -2254858, --3980898, 561567, 512175, 566936, 1881733, -2661806, 6673306, -2147, 5679021, 763967, --1781875, -2445447, -7337952, 4264903, 3059091, -3229816, 938450, 3581466, 2221572, -8657580, -6028524, 173409, 4487704, -4971962, -5240397, -2327336, -5038534, -480499, 7406134, 2006287, --1698660, 1091459, 4705674, -468151, -1916092, -617402, -2055679, 3634616, -3393024, 885837, --1075352, 4844186, -11213623, 2333241, -3497714, -10256382, -7873212, 4244502, 4765266, 6212134, --2994666, -1573569, 4334696, 2050310, 6446746, 2083059, -624918, 656593, 4155381, 7918846, --1930051, 2304250, 6979, 6407555, 1585917, -404801, -1170379, -4913443, -7320772, 59056, --939524, 2211908, -283468, 1722819, 1450088, 419833, 631897, 1443646, -2379412, 242129, -3711926, 5491116, -2529736, 606664, -2197950, -3237869, 4777078, -3571802, -8533026, -3502546, --2016487, 4134443, 587337, 4564477, 4489315, -2322504, 452582, -3708704, -222801, -1641214, -5729487, -6925098, 122407, 2215130, -6898791, -8243116, 495532, 2425583, 5562520, -3691525, --8185134, 4412542, -7472170, 9227737, 5803038, 1502165, 4613869, 186294, -1809792, -25173878, -4872104, 1001801, -12775380, -16048145, -2804077, -12446815, 9645960, 2585034, -7616588, 208306, --3688303, 853088, -5287105, 395674, -556735, -186294, 6716255, -2739652, -1901060, -3153580, --2843805, -6826314, -4691178, 6378564, -3004330, 3951370, -3956739, 1583232, -164283, 3555696, --4121021, 2644089, -4138738, 1472637, -1755568, -2617246, 2114198, -6361384, 2089502, -3330210, --1405528, -4664335, 10543071, 4974109, 9209484, -4212826, 3722126, 3064459, -2163590, 1545115, --4773856, 4639102, 10123238, 8114267, -6010807, -1626719, 2155537, -4215511, -3069291, -7301982, --13875429, -4613332, 6684580, 2549063, -3641059, 1479616, 426276, -3524558, -6747394, -6225555, -4340602, 1005559, -10281615, 1839320, 712965, 1120450, -9660455, -3973919, -2429878, 7460358, --1833951, 1832877, -7484518, -7860864, 524523, 2372433, -4508642, -2597918, -4215511, 9090298, -2145336, -2975876, -6430640, -6458557, -6191732, -1730872, 3230889, 9102109, 3125663, 5149666, --3882651, 9675488, 5713380, 1787243, 312996, 9934796, -5593121, 940061, 3364570, 6710350, --10654740, -5558225, 4978941, 1883343, -1262184, 11303817, -4710506, 3163780, 7094749, 2072859, -1412507, 4933307, 2301029, 2412698, 2823404, 999654, 3219078, -263604, 4614943, -1111323, -10897943, -7827041, 9030169, 6795175, -5719823, 6712497, 1596654, 5667210, 6241125, -13139916, -8590, -720481, -3533684, 1853278, -3129421, 3354906, -1048509, 8008504, -419296, 1034013, -3986804, 2057289, 13139916, -3268470, -1861332, -3013993, 9392557, 5029407, 1129576, 3708704, --6117644, 14014478, 4711579, -897648, 5345624, 6880538, -11167989, -548682, 2788508, 1537061, -96637, 9778030, -4486630, -5567888, 13249974, 2229088, -835371, -1055488, 6963753, 788127, --908922, -1017370, -3107409, 3710315, -1898912, 4866198, 3291556, -7973607, -7778186, 1308354, -15586973, 155693, 3231426, -9216463, 4785668, 6749004, -3906810, 5121212, 5914707, -9288404, --5879810, -776315, -12392591, -6128919, -7384123, 2685428, -2510409, -2219424, -1335735, 9325985, --11964705, 5927055, 2627983, -3202972, 7339026, -3929358, 718333, -9228274, -199179, 7042673, -5480915, 12561706, -13538811, -2065879, -15029701, -1614908, -282394, -1399086, 1862942, 9161165, --9638980, 635655, -5794448, 17329120, -6899865, -3816079, 15040975, 11441256, 2346663, -20249160, --4734128, 9793062, 1045288, -656593, -2655901, -1285269, -1335198, 1777043, 3450469, 3249680, -3023120, 18575734, -3551401, -2293513, 261456, 2735894, -5193689, 3563749, 2167885, -316217, --5756330, -3389803, 6798933, 7424388, 13551159, 3792456, -5297842, 3759170, 10737, 3811247, -417686, 7806103, -6016176, -8795556, -9351218, 6630356, -2588792, 1726577, 2564096, -2951716, --562641, 16292958, 5444945, -12894029, 9502615, 3522410, 15994995, -7835094, -7959648, 5172215, -8473970, 6527814, 3086471, -875636, 163209, 4776004, -5699959, -786516, -484258, 7618735, --5862094, 14638859, -1859184, 1047435, -9335648, -5848135, -12484396, -10629507, -4317516, 3514357, -3590056, 18570902, 17982492, -2382633, 1168231, 561567, -175020, -447750, -4100083, -12505871, --9738301, -5087926, 4015258, -3640522, -11011759, -3234647, 1689533, -993748, -16711718, -5004174, -3277597, -1858110, 1199370, 955630, 4566087, 7042136, 810138, -5376762, 4955319, 5393405, -3532074, -348429, 6811282, -14473503, 4448513, -12824235, 15490873, -11341398, 3970697, -12012487, --2338073, -13396540, -7403987, -8355322, -9345312, 6141267, -8254391, -1533303, 2444910, -84289, --4544076, -2995740, -1698660, -12974559, 129923, 954020, 6193343, -20223390, 231391, -345745, -9284646, 11657078, -7917772, -4449586, 334471, 9185324, -16833588, 11353209, -7406671, -4189741, -1294933, -15042049, 2277943, -10454487, -25972204, -10862509, -5549635, 3589519, 6068252, -9085466, --3862249, -11229192, -9902047, 4005057, -8777303, 7461969, 2681670, 5109938, -1688996, -9054328, -13615583, 4798016, 7334194, -11120207, 3671123, 957778, -15554224, 8289824, 4871567, -387084, --10777684, -4851703, 4378183, 4348655, -858457, 857920, 6621766, -8063801, -5821292, 7510287, --17545478, -17751100, -22555020, -5972152, 6516003, -20354924, -16646219, -10842108, -200253, 5858336, -1709934, 853088, -151934, -6711424, -8167417, -19374598, 9176734, 1544041, 21675090, -6481643, -186294, -14906758, -16726750, 818728, 10229538, -570157, -10626823, 5469641, 2491081, 13666586, -1246077, 428423, -7485055, -2943126, 6231461, -16471736, -27733678, -9644886, -6885907, -23087060, --17648558, -7806640, 12925167, -523986, 21775484, 4803921, -1429150, -11360188, 4656282, 22622666, --22640920, -20047834, -6498823, -2747705, -14110041, 14397804, 4301410, 8163659, 9121437, -13669807, --1475858, 6618545, -8888435, 17903034, 443455, 4720706, -4798016, 5129802, -11129871, -5471252, --3761855, 7409356, 3128884, 11403675, -16937204, 2600603, -105764, -11538430, 13819057, -7095286, --20253456, 5215701, 7215545, 2742874, -6142877, -141197, -8560407, 2776160, 6709813, 4379256, --14038637, 6931541, -3413425, -13758391, -9384504, -17187386, 55298, -1178969, -925029, 4299799, -11080479, 16336982, 11395622, -4046396, -11090679, 5651103, -3422015, 584652, -8971650, 17460116, -11272679, 537, 21613886, -11873437, 5832566, 16989280, 8714489, -20347944, 2677375, 348429, --12851616, 1999307, -28695214, -24756192, -5895917, -90731, 1122597, -492311, -10187126, -219043, --2896419, 9345312, 1811403, -430034, 1730335, -21576306, 7502771, 4214437, 12037720, 5170604, -5184026, 14339285, 7000260, 2224793, 35376572, 7761006, 13544716, 18993420, 763430, 13452374, -3185255, -7180112, 8450348, 801548, 3955665, -7022272, 316754, -4486094, 2752000, -4468914, -9680856, 1401770, -6536940, -7552163, 689342, -20833812, 11798812, 8454106, -1560684, -1701881, -4250407, -5390184, -5274220, -6702834, -9058086, 7149510, -7482370, 11680164, 12405476, 13282186, -12807592, -3077881, -22462142, 463856, 7304129, 21374442, -6929930, -823560, 7550553, 14596983, -18445810, -3862249, 3992172, 18296560, 23477364, -15819975, -16567836, -22237730, 21878564, -1250372, --7409356, 8191577, 8053601, 20476794, 17342542, 2010045, 18928458, 26304528, 8331700, -11957189, -13291313, -10999948, -5523328, -1522029, -7171522, -9089225, 6420439, -4117800, -3747359, -11170136, -28841780, 4398584, -13399224, 944356, -681826, 13300977, 14396194, 6099391, -7232188, 14120242, --2185602, 9076340, -23810224, 2267206, 11943767, -9883793, 5115843, -10823854, -8067023, 26993332, -12386149, 8798241, -213138, -22142168, -3955128, 7620346, 6677601, 4672388, -3713536, 19301584, --11089069, 11138461, -4173635, 7679402, 9415105, 15472083, 21734146, -21926344, 1590749, 12632036, -8036421, 17362942, 18522584, -21965536, 2854006, -5594732, -8576513, -227633, -8148090, 5378910, -17432198, 34793532, 1430224, -16668231, 4629975, -11143293, 7121593, -9673340, -10524280, 31636730, --24113558, 39731668, 24199994, -5812702, 7876433, 19248432, 2644626, -29851096, 11609833, -24142548, -5613523, 2277943, -12144557, 649077, -1814624, 17470854, -8859981, -697395, -876710, -5081483, -36364952, -1894618, -5737003, 4941360, 12069395, -12224014, -26599270, 21043730, -3610457, -1302449, -23382876, -13621489, -4174171, -16254304, 4097399, -11237782, 13019656, 12714714, 24828670, -6822556, -6646462, 17271138, -24321326, 3389266, -15676094, -23560580, -31218506, -15650324, -33748244, -36825048, --5775658, 3019362, -18181670, -18286898, 11083163, -631897, -11330661, -19653770, 13920526, -10073846, -2887829, 19439558, -36078264, -9011378, -8042327, 16811038, 38653632, 1810329, -10536092, 10860899, --5412733, -16538845, -24306294, -18519362, 19733228, -16807280, 7743289, 18775450, 7792682, 11922829, --23223962, 32455458, 20244328, 17523466, -13627931, 23136988, -3016141, 15157476, 9772124, 3044595, -8012799, 10992969, 6466610, -4281546, -6365679, -5701569, 1834488, -16298327, -19214610, 9989557, -4043175, 5562520, -15964393, 3624416, 4015258, 10903311, 16433619, 25143276, -15285789, 3241627, -35876936, 7206419, 3107946, 2798708, -8429947, 1894618, 35567160, 9735080, 22650046, 5821292, --26351772, -11527692, -19548006, 51921324, 20329154, -21652004, -14114336, -19548006, 1720134, -13396003, --30251602, 5052492, -23347442, 30703648, -3887482, -28841242, 33724084, 26395796, 2516314, -10481331, -3589519, -19653770, 21769042, -25654376, 9453223, -4006668, 24412594, -52680460, -36208720, 20001662, -9419937, 6826851, 17084844, -18429704, -23560044, -13435731, -19446002, 10083509, -20809654, 5250061, -13291313, 21589190, 467078, 17949742, 10658498, 2286533, -6181532, -20395190, -13993540, 10572599, --24086714, 11327439, 2713883, 19509888, 15498926, -8542153, -29826938, -20316270, -1780264, -2455648, --7813083, 19406272, -35910760, -3817152, 1430224, -38784092, -500901, -5733782, -2720862, 2916820, -22448184, -22682796, -58875412, 20942260, 24678346, 13168907, 46857556, -39365524, -4192425, 24369108, -20465520, -25284472, -10177462, -8031589, 37507412, 5675263, 36011152, -51874080, 8757975, -61641908, --34314640, -36467492, 43143484, 11381663, -24443732, 22612466, 5265093, -24522116, 26060788, -33004140, -18403934, 45081052, 16787954, -16028281, -10353019, 6267968, -11237782, -13363254, -1387811, 20946018, --3405909, 3906273, -22000434, -4628901, 31005368, -22477712, 17293148, 40066676, 20384452, -1800665, --7326141, -13318694, -25314000, -19019726, 22495428, -12770012, 21153788, 14766634, 7543037, 761820, -8544837, -6644315, -32182726, -11595338, 23844048, 18214420, 19922742, -20978768, 36177584, -9528385, -14416595, -26728656, 24713242, 41128068, -7754027, -15233175, -904628, 1056025, -8584029, 8579197, -18843096, -34607236, 23070416, 21146272, -4591857, 24575266, 14079440, 10249939, -15192910, 2669322, -23287312, -48164300, -41529648, -18274012, 12016245, -22508312, -63534916, 26371100, 18426484, -8842264, --10205916, 179315, -3206730, -21945136, -58888296, -2376191, -1149441, 21820044, 28942174, 588411, --32752884, 43236900, -12222403, -30290256, 27023398, -4417911, -16508781, 20859582, 5535139, -4460861, -17585744, -24297704, 22884660, -8300561, 687732, -7144678, -6105296, -33867964, 13267154, -13012140, -5210869, -13672492, -1231582, -10244571, 9539659, -6083821, 36342404, 6253473, 23716810, -9499394, -5807333, 14847702, -6579890, 10161893, -2256469, 17927730, -1120987, -6449967, 28584618, -26103738, -14120242, 19283330, -11818139, 21832392, -13926968, -1058173, 11154030, -9280351, 25855704, 22826140, -4508642, 38326140, -24457154, -55904904, -9717900, -34971236, -23033910, 79471928, -2592013, 23533736, --4365835, -35304632, -1569811, 32258962, 47074988, 27271968, 47252156, -28194312, -9041980, -14494978, --29418916, 14117021, 25186226, -25196426, 31679142, -18055506, 4887136, 647466, 3818226, -23130010, --3109556, -20826834, -17288854, 844498, -6484864, -15474230, -5953362, 12776454, -13371844, 11870216, --6046777, 34283504, -14949707, 10905459, 2530810, -7330973, -26307212, -8826158, 20913270, 4737349, --6193343, 27859306, -19320374, -18859202, -2244121, 26747446, -22766012, -2012192, 5042292, 8232379, --25406880, 9149891, 9479530, -7832947, -26580478, 1983201, -20522428, 10483478, 5292474, 9727564, --40855876, -15928960, 24145770, 65531000, -28259274, -1995549, 5721434, -8625368, -17352204, 1920924, -53852448, 14709189, -4702453, -2014340, -13277355, -361314, -9905268, 23835994, 2042794, -9590125, --13058311, 4814122, 10789495, -16441672, 18015240, 10768020, 19731616, 8785356, 24208046, -39771936, -54405424, 8107288, 12904766, 13585518, -11740293, -13606456, 1178969, -4809290, 8300561, 18407692, --24201066, 8943733, -4591320, 7184944, 6695854, 4940286, 14808510, 11822971, -9960029, 10712185, -9298604, -7844221, -14211510, 5301601, -4639639, -11536282, 7997766, 6840809, -421444, -7251516, -844498, -5057324, -2238752, 1392106, 3810173, 6492917, -10494753, -796180, 9493488, -3097745, -8578660, 2416456, 6352794, 12581033, 4044786, -10984379, 1836099, 12096239, -5737540, 404801, -5976984, -17924510, -577136, -3625489, -17092896, 25527674, -5652177, 135291, 15046881, 3704409, --10359461, 5596343, -9892383, -714575, 8569533, -8256001, -3053185, 19728396, -18737332, 3947075, -2107755, 8807367, -8213588, 8681740, -2601677, 10290205, -3661997, 12674985, -53131968, -108212240, --13854491, 67985040, 52344912, 150028032, 72284296, -34963720, -30429844, -71128416, -124426280, -15766288, --48140676, -15018427, 88115016, 56022480, 60028612, 114415784, -3816615, -25409026, -42969000, -113292112, --62266824, -20202990, -20795694, 3040300, 51791936, 39788576, 42639900, 79759152, 47040628, -29529510, -42902428, -44923212, -104092288, 13175886, -69734160, -97704064, 38394324, -8592619, -17680232, 119651344, -39683888, 31613644, 103768560, -11369315, -19867982, 31153008, -68764576, -86369104, -22625350, -74026448, --65298536, 13583371, 14863271, 29368986, 90790776, 79415552, 49054968, 56803088, 11821361, -45678588, --47828756, -60763588, -81847048, -39247412, -19972134, -28785944, 26220776, 79008072, 53544820, 50583976, -44249436, -30819612, 2747705, 6346351, -50838456, -14061723, -7513509, 0, 0, 0, -0, 0, 0, }, +1618666, -2086280, -746787, -6973417, -3740917, 1630477, -356482, -369367, 6088116, 5115306, +1120987, -1479616, -1249299, -3369402, 3058017, 338766, -2038499, -1047972, -1949915, -907312, +-500901, -4602595, -4224101, 3770981, 3504693, 1509681, -4344897, -2013266, -1016297, 1904281, +-1606855, -2148558, -381715, 188442, 901406, 2044404, 410706, 2925410, -3751654, -3474629, +-4669703, -3411815, -1887101, 437550, -613107, -647466, -1973538, 718333, -550293, 396748, +3310346, 2478196, -1255204, -2485712, -1812476, 970663, 764504, 326418, -275952, 6504728, +3992172, 630823, -1284732, 319975, -3777961, 233539, -250182, 1034013, -593779, -2095944, +3583613, -4563403, 215822, 440234, -448824, -4526359, 4527433, 1053878, -2632815, -1228361, +-5730023, -1608465, 4591857, -2592550, -1927904, 1347009, -849330, -278636, 180926, -1602023, +-1324461, 5603322, 2654827, -794032, 158377, -947577, -1825898, 686658, 1913408, 3040300, +-928250, 1102196, 1319629, -5147519, -1680406, -108448, -1137093, 2997887, 143881, -1161789, +2646237, -2225867, 797253, 4225174, -2548526, 172336, 426812, 3180423, -1423245, 4424353, +-6585796, -2452426, 2626909, -1385127, -5618354, 274878, 912681, 1693291, 1674500, -712965, +-2542084, 71404, -2334315, -1584306, 417149, 2550137, 2252174, -3784940, 2949569, -4139812, +3285113, 17180, 2826625, -1417339, -2887829, -1375463, 1741609, -676994, -935766, -955093, +2390686, -3439195, -15290084, 5016522, -5557151, -2218888, -4547834, -4678293, 2660195, -1566589, +-3939022, -2129230, 5374615, 7964480, -4351339, -1635846, -374736, -5757941, -5382131, 389768, +-527744, 3492882, 1203128, 2596308, -2279017, -1460289, -2957085, 820876, 5177046, 2214056, +1033477, -3340948, 2552821, 738198, 1580548, -2190433, 235149, 736050, 1204202, -2968896, +-2101313, 779537, -4006668, -4181151, 1844152, 3124052, -3475166, -1810329, -1292248, 226560, +3221762, 2504503, 1183800, 448824, 8220568, 3161633, -2461016, 3134789, 2369211, -2285996, +3965866, -1458141, -821949, -48855, -1516124, 3384434, -1743757, 870805, 2257005, 1624571, +-2805151, 1174674, 838592, 594853, -733366, -1524177, -216359, 4741107, 894964, 2075543, +11718818, 4722317, -727460, 611496, 2749316, 1478006, -703838, -4943508, 245887, 4546223, +-4493610, -426276, -8506183, 2340220, 3581466, 319975, -1962800, 6366216, 4497905, -3958886, +2040110, 325881, -3463891, 5691906, 3173981, -275415, 2348810, 5428839, -1568737, -1012539, +444529, 122943, 216359, 1373853, 6645925, 1413044, 1069447, -10507101, -468151, 576063, +1360968, -4702989, 1206349, -3775276, -2871723, -3998615, -2573759, 117575, 1334124, -2407866, +2605435, -5997922, -3389803, -281320, 31139, 2042257, -2325188, -482110, -2091112, 1404991, +3420942, -1917703, 481036, -1657857, -183610, 5172215, 4139275, -1571958, 3889093, -1778117, +-3066070, -4014184, -172336, -453119, 18713710, -7641284, 1861332, -322123, -3035468, 3266323, +5501853, -2994129, 5890548, 44560, 6260989, 1985349, 2444373, -2194728, 3709241, 1643899, +3791919, -6874632, 4239670, -3920768, 1709934, -3234647, 4909685, -882616, 4946729, -2327336, +2066416, -1400159, -5906, 159451, -64425, 2159832, 9892920, 787590, 3195993, -2254858, +-3980898, 561567, 512175, 566936, 1881733, -2661806, 6673306, -2147, 5679021, 763967, +-1781875, -2445447, -7337952, 4264903, 3059091, -3229816, 938450, 3581466, 2221572, -8657580, +6028524, 173409, 4487704, -4971962, -5240397, -2327336, -5038534, -480499, 7406134, 2006287, +-1698660, 1091459, 4705674, -468151, -1916092, -617402, -2055679, 3634616, -3393024, 885837, +-1075352, 4844186, -11213623, 2333241, -3497714, -10256382, -7873212, 4244502, 4765266, 6212134, +-2994666, -1573569, 4334696, 2050310, 6446746, 2083059, -624918, 656593, 4155381, 7918846, +-1930051, 2304250, 6979, 6407555, 1585917, -404801, -1170379, -4913443, -7320772, 59056, +-939524, 2211908, -283468, 1722819, 1450088, 419833, 631897, 1443646, -2379412, 242129, +3711926, 5491116, -2529736, 606664, -2197950, -3237869, 4777078, -3571802, -8533026, -3502546, +-2016487, 4134443, 587337, 4564477, 4489315, -2322504, 452582, -3708704, -222801, -1641214, +5729487, -6925098, 122407, 2215130, -6898791, -8243116, 495532, 2425583, 5562520, -3691525, +-8185134, 4412542, -7472170, 9227737, 5803038, 1502165, 4613869, 186294, -1809792, -25173878, +4872104, 1001801, -12775380, -16048145, -2804077, -12446815, 9645960, 2585034, -7616588, 208306, +-3688303, 853088, -5287105, 395674, -556735, -186294, 6716255, -2739652, -1901060, -3153580, +-2843805, -6826314, -4691178, 6378564, -3004330, 3951370, -3956739, 1583232, -164283, 3555696, +-4121021, 2644089, -4138738, 1472637, -1755568, -2617246, 2114198, -6361384, 2089502, -3330210, +-1405528, -4664335, 10543071, 4974109, 9209484, -4212826, 3722126, 3064459, -2163590, 1545115, +-4773856, 4639102, 10123238, 8114267, -6010807, -1626719, 2155537, -4215511, -3069291, -7301982, +-13875429, -4613332, 6684580, 2549063, -3641059, 1479616, 426276, -3524558, -6747394, -6225555, +4340602, 1005559, -10281615, 1839320, 712965, 1120450, -9660455, -3973919, -2429878, 7460358, +-1833951, 1832877, -7484518, -7860864, 524523, 2372433, -4508642, -2597918, -4215511, 9090298, +2145336, -2975876, -6430640, -6458557, -6191732, -1730872, 3230889, 9102109, 3125663, 5149666, +-3882651, 9675488, 5713380, 1787243, 312996, 9934796, -5593121, 940061, 3364570, 6710350, +-10654740, -5558225, 4978941, 1883343, -1262184, 11303817, -4710506, 3163780, 7094749, 2072859, +1412507, 4933307, 2301029, 2412698, 2823404, 999654, 3219078, -263604, 4614943, -1111323, +10897943, -7827041, 9030169, 6795175, -5719823, 6712497, 1596654, 5667210, 6241125, -13139916, +8590, -720481, -3533684, 1853278, -3129421, 3354906, -1048509, 8008504, -419296, 1034013, +3986804, 2057289, 13139916, -3268470, -1861332, -3013993, 9392557, 5029407, 1129576, 3708704, +-6117644, 14014478, 4711579, -897648, 5345624, 6880538, -11167989, -548682, 2788508, 1537061, +96637, 9778030, -4486630, -5567888, 13249974, 2229088, -835371, -1055488, 6963753, 788127, +-908922, -1017370, -3107409, 3710315, -1898912, 4866198, 3291556, -7973607, -7778186, 1308354, +15586973, 155693, 3231426, -9216463, 4785668, 6749004, -3906810, 5121212, 5914707, -9288404, +-5879810, -776315, -12392591, -6128919, -7384123, 2685428, -2510409, -2219424, -1335735, 9325985, +-11964705, 5927055, 2627983, -3202972, 7339026, -3929358, 718333, -9228274, -199179, 7042673, +5480915, 12561706, -13538811, -2065879, -15029701, -1614908, -282394, -1399086, 1862942, 9161165, +-9638980, 635655, -5794448, 17329120, -6899865, -3816079, 15040975, 11441256, 2346663, -20249160, +-4734128, 9793062, 1045288, -656593, -2655901, -1285269, -1335198, 1777043, 3450469, 3249680, +3023120, 18575734, -3551401, -2293513, 261456, 2735894, -5193689, 3563749, 2167885, -316217, +-5756330, -3389803, 6798933, 7424388, 13551159, 3792456, -5297842, 3759170, 10737, 3811247, +417686, 7806103, -6016176, -8795556, -9351218, 6630356, -2588792, 1726577, 2564096, -2951716, +-562641, 16292958, 5444945, -12894029, 9502615, 3522410, 15994995, -7835094, -7959648, 5172215, +8473970, 6527814, 3086471, -875636, 163209, 4776004, -5699959, -786516, -484258, 7618735, +-5862094, 14638859, -1859184, 1047435, -9335648, -5848135, -12484396, -10629507, -4317516, 3514357, +3590056, 18570902, 17982492, -2382633, 1168231, 561567, -175020, -447750, -4100083, -12505871, +-9738301, -5087926, 4015258, -3640522, -11011759, -3234647, 1689533, -993748, -16711718, -5004174, +3277597, -1858110, 1199370, 955630, 4566087, 7042136, 810138, -5376762, 4955319, 5393405, +3532074, -348429, 6811282, -14473503, 4448513, -12824235, 15490873, -11341398, 3970697, -12012487, +-2338073, -13396540, -7403987, -8355322, -9345312, 6141267, -8254391, -1533303, 2444910, -84289, +-4544076, -2995740, -1698660, -12974559, 129923, 954020, 6193343, -20223390, 231391, -345745, +9284646, 11657078, -7917772, -4449586, 334471, 9185324, -16833588, 11353209, -7406671, -4189741, +1294933, -15042049, 2277943, -10454487, -25972204, -10862509, -5549635, 3589519, 6068252, -9085466, +-3862249, -11229192, -9902047, 4005057, -8777303, 7461969, 2681670, 5109938, -1688996, -9054328, +13615583, 4798016, 7334194, -11120207, 3671123, 957778, -15554224, 8289824, 4871567, -387084, +-10777684, -4851703, 4378183, 4348655, -858457, 857920, 6621766, -8063801, -5821292, 7510287, +-17545478, -17751100, -22555020, -5972152, 6516003, -20354924, -16646219, -10842108, -200253, 5858336, +1709934, 853088, -151934, -6711424, -8167417, -19374598, 9176734, 1544041, 21675090, -6481643, +186294, -14906758, -16726750, 818728, 10229538, -570157, -10626823, 5469641, 2491081, 13666586, +1246077, 428423, -7485055, -2943126, 6231461, -16471736, -27733678, -9644886, -6885907, -23087060, +-17648558, -7806640, 12925167, -523986, 21775484, 4803921, -1429150, -11360188, 4656282, 22622666, +-22640920, -20047834, -6498823, -2747705, -14110041, 14397804, 4301410, 8163659, 9121437, -13669807, +-1475858, 6618545, -8888435, 17903034, 443455, 4720706, -4798016, 5129802, -11129871, -5471252, +-3761855, 7409356, 3128884, 11403675, -16937204, 2600603, -105764, -11538430, 13819057, -7095286, +-20253456, 5215701, 7215545, 2742874, -6142877, -141197, -8560407, 2776160, 6709813, 4379256, +-14038637, 6931541, -3413425, -13758391, -9384504, -17187386, 55298, -1178969, -925029, 4299799, +11080479, 16336982, 11395622, -4046396, -11090679, 5651103, -3422015, 584652, -8971650, 17460116, +11272679, 537, 21613886, -11873437, 5832566, 16989280, 8714489, -20347944, 2677375, 348429, +-12851616, 1999307, -28695214, -24756192, -5895917, -90731, 1122597, -492311, -10187126, -219043, +-2896419, 9345312, 1811403, -430034, 1730335, -21576306, 7502771, 4214437, 12037720, 5170604, +5184026, 14339285, 7000260, 2224793, 35376572, 7761006, 13544716, 18993420, 763430, 13452374, +3185255, -7180112, 8450348, 801548, 3955665, -7022272, 316754, -4486094, 2752000, -4468914, +9680856, 1401770, -6536940, -7552163, 689342, -20833812, 11798812, 8454106, -1560684, -1701881, +4250407, -5390184, -5274220, -6702834, -9058086, 7149510, -7482370, 11680164, 12405476, 13282186, +12807592, -3077881, -22462142, 463856, 7304129, 21374442, -6929930, -823560, 7550553, 14596983, +18445810, -3862249, 3992172, 18296560, 23477364, -15819975, -16567836, -22237730, 21878564, -1250372, +-7409356, 8191577, 8053601, 20476794, 17342542, 2010045, 18928458, 26304528, 8331700, -11957189, +13291313, -10999948, -5523328, -1522029, -7171522, -9089225, 6420439, -4117800, -3747359, -11170136, +28841780, 4398584, -13399224, 944356, -681826, 13300977, 14396194, 6099391, -7232188, 14120242, +-2185602, 9076340, -23810224, 2267206, 11943767, -9883793, 5115843, -10823854, -8067023, 26993332, +12386149, 8798241, -213138, -22142168, -3955128, 7620346, 6677601, 4672388, -3713536, 19301584, +-11089069, 11138461, -4173635, 7679402, 9415105, 15472083, 21734146, -21926344, 1590749, 12632036, +8036421, 17362942, 18522584, -21965536, 2854006, -5594732, -8576513, -227633, -8148090, 5378910, +17432198, 34793532, 1430224, -16668231, 4629975, -11143293, 7121593, -9673340, -10524280, 31636730, +-24113558, 39731668, 24199994, -5812702, 7876433, 19248432, 2644626, -29851096, 11609833, -24142548, +5613523, 2277943, -12144557, 649077, -1814624, 17470854, -8859981, -697395, -876710, -5081483, +36364952, -1894618, -5737003, 4941360, 12069395, -12224014, -26599270, 21043730, -3610457, -1302449, +23382876, -13621489, -4174171, -16254304, 4097399, -11237782, 13019656, 12714714, 24828670, -6822556, +6646462, 17271138, -24321326, 3389266, -15676094, -23560580, -31218506, -15650324, -33748244, -36825048, +-5775658, 3019362, -18181670, -18286898, 11083163, -631897, -11330661, -19653770, 13920526, -10073846, +2887829, 19439558, -36078264, -9011378, -8042327, 16811038, 38653632, 1810329, -10536092, 10860899, +-5412733, -16538845, -24306294, -18519362, 19733228, -16807280, 7743289, 18775450, 7792682, 11922829, +-23223962, 32455458, 20244328, 17523466, -13627931, 23136988, -3016141, 15157476, 9772124, 3044595, +8012799, 10992969, 6466610, -4281546, -6365679, -5701569, 1834488, -16298327, -19214610, 9989557, +4043175, 5562520, -15964393, 3624416, 4015258, 10903311, 16433619, 25143276, -15285789, 3241627, +35876936, 7206419, 3107946, 2798708, -8429947, 1894618, 35567160, 9735080, 22650046, 5821292, +-26351772, -11527692, -19548006, 51921324, 20329154, -21652004, -14114336, -19548006, 1720134, -13396003, +-30251602, 5052492, -23347442, 30703648, -3887482, -28841242, 33724084, 26395796, 2516314, -10481331, +3589519, -19653770, 21769042, -25654376, 9453223, -4006668, 24412594, -52680460, -36208720, 20001662, +9419937, 6826851, 17084844, -18429704, -23560044, -13435731, -19446002, 10083509, -20809654, 5250061, +13291313, 21589190, 467078, 17949742, 10658498, 2286533, -6181532, -20395190, -13993540, 10572599, +-24086714, 11327439, 2713883, 19509888, 15498926, -8542153, -29826938, -20316270, -1780264, -2455648, +-7813083, 19406272, -35910760, -3817152, 1430224, -38784092, -500901, -5733782, -2720862, 2916820, +22448184, -22682796, -58875412, 20942260, 24678346, 13168907, 46857556, -39365524, -4192425, 24369108, +20465520, -25284472, -10177462, -8031589, 37507412, 5675263, 36011152, -51874080, 8757975, -61641908, +-34314640, -36467492, 43143484, 11381663, -24443732, 22612466, 5265093, -24522116, 26060788, -33004140, +18403934, 45081052, 16787954, -16028281, -10353019, 6267968, -11237782, -13363254, -1387811, 20946018, +-3405909, 3906273, -22000434, -4628901, 31005368, -22477712, 17293148, 40066676, 20384452, -1800665, +-7326141, -13318694, -25314000, -19019726, 22495428, -12770012, 21153788, 14766634, 7543037, 761820, +8544837, -6644315, -32182726, -11595338, 23844048, 18214420, 19922742, -20978768, 36177584, -9528385, +14416595, -26728656, 24713242, 41128068, -7754027, -15233175, -904628, 1056025, -8584029, 8579197, +18843096, -34607236, 23070416, 21146272, -4591857, 24575266, 14079440, 10249939, -15192910, 2669322, +23287312, -48164300, -41529648, -18274012, 12016245, -22508312, -63534916, 26371100, 18426484, -8842264, +-10205916, 179315, -3206730, -21945136, -58888296, -2376191, -1149441, 21820044, 28942174, 588411, +-32752884, 43236900, -12222403, -30290256, 27023398, -4417911, -16508781, 20859582, 5535139, -4460861, +17585744, -24297704, 22884660, -8300561, 687732, -7144678, -6105296, -33867964, 13267154, -13012140, +5210869, -13672492, -1231582, -10244571, 9539659, -6083821, 36342404, 6253473, 23716810, -9499394, +5807333, 14847702, -6579890, 10161893, -2256469, 17927730, -1120987, -6449967, 28584618, -26103738, +14120242, 19283330, -11818139, 21832392, -13926968, -1058173, 11154030, -9280351, 25855704, 22826140, +4508642, 38326140, -24457154, -55904904, -9717900, -34971236, -23033910, 79471928, -2592013, 23533736, +-4365835, -35304632, -1569811, 32258962, 47074988, 27271968, 47252156, -28194312, -9041980, -14494978, +-29418916, 14117021, 25186226, -25196426, 31679142, -18055506, 4887136, 647466, 3818226, -23130010, +-3109556, -20826834, -17288854, 844498, -6484864, -15474230, -5953362, 12776454, -13371844, 11870216, +-6046777, 34283504, -14949707, 10905459, 2530810, -7330973, -26307212, -8826158, 20913270, 4737349, +-6193343, 27859306, -19320374, -18859202, -2244121, 26747446, -22766012, -2012192, 5042292, 8232379, +-25406880, 9149891, 9479530, -7832947, -26580478, 1983201, -20522428, 10483478, 5292474, 9727564, +-40855876, -15928960, 24145770, 65531000, -28259274, -1995549, 5721434, -8625368, -17352204, 1920924, +53852448, 14709189, -4702453, -2014340, -13277355, -361314, -9905268, 23835994, 2042794, -9590125, +-13058311, 4814122, 10789495, -16441672, 18015240, 10768020, 19731616, 8785356, 24208046, -39771936, +54405424, 8107288, 12904766, 13585518, -11740293, -13606456, 1178969, -4809290, 8300561, 18407692, +-24201066, 8943733, -4591320, 7184944, 6695854, 4940286, 14808510, 11822971, -9960029, 10712185, +9298604, -7844221, -14211510, 5301601, -4639639, -11536282, 7997766, 6840809, -421444, -7251516, +844498, -5057324, -2238752, 1392106, 3810173, 6492917, -10494753, -796180, 9493488, -3097745, +8578660, 2416456, 6352794, 12581033, 4044786, -10984379, 1836099, 12096239, -5737540, 404801, +5976984, -17924510, -577136, -3625489, -17092896, 25527674, -5652177, 135291, 15046881, 3704409, +-10359461, 5596343, -9892383, -714575, 8569533, -8256001, -3053185, 19728396, -18737332, 3947075, +2107755, 8807367, -8213588, 8681740, -2601677, 10290205, -3661997, 12674985, -53131968, -108212240, +-13854491, 67985040, 52344912, 150028032, 72284296, -34963720, -30429844, -71128416, -124426280, -15766288, +-48140676, -15018427, 88115016, 56022480, 60028612, 114415784, -3816615, -25409026, -42969000, -113292112, +-62266824, -20202990, -20795694, 3040300, 51791936, 39788576, 42639900, 79759152, 47040628, -29529510, +42902428, -44923212, -104092288, 13175886, -69734160, -97704064, 38394324, -8592619, -17680232, 119651344, +39683888, 31613644, 103768560, -11369315, -19867982, 31153008, -68764576, -86369104, -22625350, -74026448, +-65298536, 13583371, 14863271, 29368986, 90790776, 79415552, 49054968, 56803088, 11821361, -45678588, +-47828756, -60763588, -81847048, -39247412, -19972134, -28785944, 26220776, 79008072, 53544820, 50583976, +44249436, -30819612, 2747705, 6346351, -50838456, -14061723, -7513509, 0, 0, 0, +0, 0, 0, }, { 5649493, -661962, -4917201, -1250372, -1280437, -550293, -1284195, 2446521, 5765994, 878858, 4686346, -1743757, -1127429, -2554969, 2191507, -775778, 4634270, 3273302, -1581622, -2910914, -3406983, -1711545, -1139777, 398358, -2471217, -1035624, -631360, 1984275, -2419140, 1961726, -776852, --2707977, 3482145, 3521336, 576063, 1317481, 699543, -690416, -2273112, -7385197, 2042794, --2382633, 2250026, -2359011, -2858838, 2126546, -2518998, 1229434, 1348620, -5202279, 216359, -781147, 1294396, -2047089, 2754685, -2732673, -1758789, -915902, -1242856, 1814624, -301721, -876710, 1561221, 2297271, -404801, -2460480, -2486786, 162135, -5215164, -2262374, -481573, -4718022, 1422708, 1893544, 1471563, 2643016, -1112933, 2631741, 4597226, -3535832, -3068217, --4711043, 4155918, 2042794, 307627, 6177237, -683974, -135828, -1968169, -1600949, 1291711, --1725503, -3311420, 1770063, 464930, 5149129, 7052873, -1911261, -4251481, -5217312, -390305, --3008625, -2909304, -2009508, -464393, -4168803, 3888019, -1532230, -1623498, -2778844, -2076617, -696858, 4371740, -525597, -1359894, 1280437, -4447439, 3213173, -2806761, -9860708, 4773320, -3162707, 5308043, 5530844, 972810, 2878702, -3020973, 759672, 4138738, 257698, -161598, --1097364, -682363, 2197413, -2198487, -1576253, -35433, 2076080, -1953673, -2331094, -3453691, -4088809, 1460826, 401043, -1261110, -4330938, -435939, 2967286, 1578401, -829466, -1297617, -2745558, -1151051, -14701136, 7648800, -734976, 202937, 2653753, 3738769, -5483063, -712965, --992674, 3104188, 1177895, -3368328, 10437844, -1141388, -656593, 4625143, 3807489, 1222992, -2639794, 8501351, -4229469, 239981, -2159832, 824634, -2632815, 181999, 258772, 925565, --4742181, 372052, -1144609, -1818919, -210990, 2935610, -1648731, 2724083, 4019016, -6995428, -927176, -2874944, -779000, -4332549, 2122788, -2597382, -448824, -1496259, -4362076, 1593433, --2934000, 1909650, 1070521, -2230699, -3187940, 13959, 2911988, 2115808, 5309117, 2363843, --2347737, -6675453, -487479, 1026497, 8213588, -2711198, -1328756, -257698, -1704565, -4502737, --2178622, -4238059, -709207, 3059091, -1001801, 3621194, 2133525, 1560684, 1803886, -2474438, -11052025, 5917391, -1407139, -3996467, 6468221, -6846715, -864899, 4306779, -2627983, -1815161, --2753074, 7401840, -2161442, 2506114, 929324, 2479807, 10012643, -9402757, 3232500, 5186173, --2898029, -8678518, -4346507, -297427, 911070, -957778, -1276142, 4089346, 5836861, -131533, --3525631, 615254, -4558034, 1790465, -2721399, 2063732, 6231461, 2473901, -5499706, 175020, -751082, 9099425, 2039573, 4724464, -851477, 2286533, 1957431, -10253161, 605054, 5370857, -2774012, 5970005, -4508642, -2695629, -4469451, 1710471, 3680250, -639413, 1611150, 654983, --1926293, 1333051, -1271310, 2087354, 2236067, 47782, 3296388, 959925, 398358, 1591822, -7204808, 1635309, 4384625, 4638565, 22447646, -5383742, -1750736, -3020436, 4835060, 3363496, -7830799, 3337190, -817654, 3963181, 126165, 4396973, 1839320, 5976984, 386547, 5080947, -6384469, -6415071, 1468879, 2142115, 1374390, 1461900, 1749125, -3642132, 210990, -4248260, --461709, 241592, -7681549, -4939750, 2161979, 388158, -99858, 3566434, 3240553, -1168231, --6644315, 2479807, 6263136, 4483409, 5835787, -1082869, 3194382, 6132677, -9353902, 3466576, -4223564, -4187593, 5893232, -3581466, -826781, 1073205, 1155883, -2638184, 2741800, -313533, --1116155, -2744484, -2755759, 3812320, 3167539, 2035278, 3073586, 5605469, 2545842, 7590281, --1748589, -7269769, 7281044, 1890859, 3304977, 2277407, -1858647, 2762738, 728534, 1277753, -4260071, 9385040, -11660299, 7050726, 1185948, 7218767, 1392643, -4774393, 1045825, 5435281, --7412040, -1974611, 462246, -8448201, -1905892, -6620155, -4062502, -4974646, -5193689, 1540283, --7891466, -5265630, -6334003, -2106145, 5579163, 1531693, -7534983, -3428458, -7854959, -2491081, -1438277, 10311143, -9015136, 2970507, -2433636, -3887482, -6738804, -370441, 962610, 6314139, -3547106, 165893, -6069863, -11071352, -248571, 2269353, 8042863, 2046015, 2554969, -6810208, -2167348, 4250944, 402653, -72478, -3168612, -4078608, -993211, 2032593, 654983, -3025805, -237297, -7602092, -709207, -6607807, 3812857, -2261837, 3900904, -6596533, -4102768, -8709657, --206695, -6098854, -1194538, 577673, -6053757, -4538707, 2715493, 2735357, -4769561, -27430346, -4311611, 3038689, -7995082, -1832340, -142271, 205622, -1627256, -2684892, -2143189, -8180302, -6125697, -3984119, 727460, -6808597, -2548526, 9757629, 8723615, -5653788, -3552475, 264141, --319975, -4630512, -5555540, -3823058, 464930, 422517, -18790, -545461, 2094870, -6653978, -1888712, 253940, -11971684, -1380832, -3729642, 5422396, 7649874, 1276679, -1603097, 431644, --7122667, -8575976, 4402342, 8617852, 9283035, -2488934, 1497333, 5637682, 5486821, -2875481, -5040144, 8711267, -608275, 7354595, 5897527, -7115150, 2117956, 531502, 7525320, -4649302, --5318244, 4592394, 5659157, -1701344, 310311, -8412230, 5798206, -4677757, 6165426, -10530723, -1040993, 2530810, 5027259, 296890, -4336307, -8930311, -10832444, 3515968, -9597104, 11605539, -11164231, 103616, -15663746, 6142877, 651224, -3131568, 10430865, -209917, -9416179, -1237488, -11365557, -14788109, 248034, -3899830, -11673184, -3457449, 3758, -2529199, -6073621, 3105261, --5062693, 3675418, -4338991, -8050916, 3948686, -868120, 5761162, -11857331, 4534949, 8806294, --3841312, 448287, 8971650, 13075491, -3733400, -3041911, -11446625, 345208, -9469866, -1079111, --6638946, -3221, 747861, 5075041, 2436320, 4603131, -3715684, 564788, 2916820, -937914, -12210055, -8556649, -4182225, 15880105, 16193637, -3598646, -1147293, -10630044, -5343476, 120796, --2937221, -7191386, 9779104, 2611877, -2622615, 14022531, 2783676, -7394860, -156229, -13743358, --6533182, -7968238, 13070122, -3550864, -193810, 8971650, -2198487, 5270462, -2961917, -11546483, --768262, -70867, -2375654, -6887517, -7595113, 3848828, -6012954, 10509785, -3264712, -7820062, -6575058, 13200045, -3301756, 3599720, -3568581, 7553774, 190052, -16353625, 5793911, 8828305, -927713, -2877628, -9383430, 7704635, 5325760, 4878546, 1081258, 2983929, 10620917, -7700877, -1374390, 1813013, -5823439, -11661910, 10910291, 5738613, 20254528, -1347009, 8976482, -3310346, --6269579, 707596, -915902, -687195, -1727651, -7012608, 14576045, -137439, 1212255, 1535451, --1943473, 11360725, 1591285, 9360881, 4239670, 985695, 10736881, -5815386, -11924977, -3244848, -2228551, 537408, -4980552, 4670777, -3659849, -18155364, 1220845, 1617592, -9954124, 11162620, --17095580, 3428995, 8421894, 12290049, -11819213, -1237488, 8891656, 6377490, 7662222, 1810329, -15593953, 3347390, 6767795, -1316944, 1407676, 6782290, 3925063, 7747584, 1081795, -9396852, --14034343, 8292508, 4243965, -2184528, 2219424, 4930623, -13101798, 726386, -8081518, 4625680, -38118, 9536975, -2354716, 4611185, -1556926, 2947421, 1723356, 270046, 5524939, 7366406, -2903398, 4558571, -10162429, 5104569, -1379758, -17884780, -11855720, 3896609, -13081397, -183073, -11718281, -7410966, 22788022, 8866423, -3997541, 12940200, 1057636, -3081639, -8509404, -7984881, --11893301, -941135, 7721815, -7805030, -616328, 9170829, 4153770, 5783174, 16828756, 3408594, -11193759, 1674500, 2667712, -15646566, 5601174, 3483219, -9258339, -329639, 5708012, -125091, -3974992, -9458055, 7230578, -607201, 2027761, 6799470, -12831215, -8759586, 2181307, -183610, -6836514, 14387067, -1490891, 3587908, 15289547, -5740224, -10662256, -597537, 11125576, -2447058, --13261785, 1055488, 4582193, -2554969, -4335233, -950262, 16491064, -3184718, 14136348, 10907606, -12849468, 728534, 734439, 7690676, 2215666, -2677375, 2319819, -10437844, 7435662, 13164075, -7820599, 1099512, 6868190, -5829881, 5122822, -5688148, 7694434, -7531225, -473520, -695248, --1248225, 23329188, -4234838, -1469953, -2831457, 3063386, 5606543, 12107513, 13157095, -8007430, -2337536, 13662291, -9029632, -10242960, 4578435, -4852776, 4577362, 26015690, -14399415, 760209, -350577, -8509404, -1814087, -9332964, -14591078, -11262478, -15183783, -5968931, 1377611, 11711302, -8530342, 2994666, 12244415, 3582003, 7344394, 6879464, -3748433, 10722923, 11456825, 8179229, --16304770, -9082245, -9608916, 3340948, -6755447, 318901, 4138201, -4743792, -11662984, 7179575, --5760625, 2499134, 1978906, 11406359, -12421582, 18552112, -18848464, 18968186, -526670, 9511742, --9724343, 3346853, -21062520, -11434277, -10531797, 9081708, 3617436, 13174275, -1880122, 15032, --7260106, -16388521, 10136660, -8891119, -5316633, 7961259, 18015240, 18226768, 7783555, -1030255, --12957379, 7398081, -19542102, -1231582, -11458436, 6311992, 19444390, -19166828, 6231461, 9349607, --12996571, -857383, -2989834, 7133941, -8939438, -11251741, 1498407, -4706748, -16996796, -14662481, --16968342, -5482526, 9286793, -13189308, 7067369, -17746804, -4035122, -7394860, -6967511, -14240501, --2250026, -5878200, -9078487, 5516886, -10006737, 8724152, 927713, 6635725, -12901545, -22896470, --2962454, 3711926, -10377715, -7580081, 2443837, 2071248, -11977053, -5913096, 14163728, 6686727, --3240016, 7650411, 20824686, 49929, 1540820, 1545651, -2954401, -1056025, 1948841, 2283312, --18281528, -6811818, -22072374, -7169374, -20707112, -9700721, -369904, 22009560, 9076877, -11699491, --14618995, 7925289, 16281147, 10823318, -9574019, 13266080, -6860674, -1373316, -25659208, -7395397, --4891968, -3152506, -18272938, -26332982, 6386617, -46708, -21360482, 5058935, 27655294, 4296041, -758599, -18272402, -4772783, 938987, 292058, -18730352, 12074227, -18465138, -3807489, 4240207, --8869644, 20973400, -17463338, -18152680, -14599131, 20226074, 9164923, -12097312, -10630581, -7403450, --2151779, -6726993, -6508486, 672699, 7758859, 19837918, -2087891, 8212515, 7669738, 6857452, --13289166, -17294760, -11871826, 13630616, -2196876, 16632798, 5978058, -2465311, -23163296, -19742354, --1641751, 912681, -13244069, -9203578, -5993627, -7265474, -30353608, -7469485, -7049115, -11924977, --4926328, -8138963, -13583371, 8997420, 19801946, 9680856, 1168231, 10281078, 15112916, -6278706, -5313949, 2452963, 2227478, -1906429, -2806224, 8710194, 5022965, 15443092, -2910914, 8053, -7194607, 31586264, 882616, 15721191, 23930484, -4278325, -17892296, -1008780, 21613886, -418759, --13877039, -19387482, -14272176, 20463372, 15347529, -30067456, 11651709, 14211510, -3930432, 10749766, -31708670, 4045859, 8332237, -8941048, 8618926, -9542880, -5439039, -4359392, 3877819, 9294309, -12502650, -2147, 6154152, -1727651, -135828, -4263829, 9686225, 29935386, -7536594, -7615514, -11935714, 8717710, 2799245, -19114752, 15178951, -14928233, 11260331, 13386339, 3155190, 4547297, --1546188, 21072184, 16676284, 1714766, 11868068, -6271189, 14497662, 3651259, 16156593, 22243636, -1575716, 6812892, -615791, -6049462, 1610076, 10605885, 12365748, -18156438, -9737228, 6258841, -23818814, -8749922, 16696148, 11232950, 5328981, -21292300, 5492727, 5379984, -24601572, 18064632, --12301860, -16285979, -31422518, 10622528, 24793772, -7137699, -15175193, 6852084, 28440736, 18253612, -7455527, 21554294, 15493558, -5696201, -42977592, 4807142, 20947630, 10009421, 4219269, -18839338, --563178, -13022341, 2518462, -1332514, 3017752, 6359236, 8386461, 3782793, -23757612, 13420162, --3845606, 4091493, 16941498, 6833293, 2597382, -6218039, 21098490, -660888, 20927766, -26222386, --8562017, 8575439, -16214575, -13079786, 35970, -3245922, -12961674, 1658394, 18192408, -361314, -244813, -9772124, -22034792, -13027173, -7114077, 9046275, -3484829, 2411087, -11538967, -10794327, --6785512, 17117592, -12814035, 10075456, 5047661, 5905043, 388158, -16723529, -26134340, -1451162, -14850923, -19859928, 8183524, -17001628, 9251360, -17904644, -2788508, -17643188, 23928874, -23029078, --16152298, 6645388, 2102923, 12294344, 7648263, -5876052, -4972499, 7158637, -35811436, -4606890, -11433203, 3208341, -8112657, -12432320, 1755031, -11791296, -591632, -18504330, 18400714, -6584185, -11733851, -24221468, -13479218, 38655, 30941482, -24295556, -1569811, -18894098, -14878304, -4169340, -19628538, -3860102, 9060234, 9468792, -9470940, -20999706, 31038118, 13812078, -16736414, 3956739, -2907693, 8980777, -16230681, 15778099, -630823, -31173410, 4096862, 6987375, 8959302, -25700548, --5516886, 3970697, 24022826, 5079336, 13784698, -33298344, -19758460, 11118060, 942208, 22886270, --4949950, -3015604, 2747705, 12017855, 11439645, 4704063, -42013908, 12949326, -3755949, 10676752, -24401320, -6489696, -553514, -25526602, 10179072, 12657805, -12017318, -7534447, 25885232, 38136088, -12220793, 6192806, -7803419, -31644246, -20854750, -7474854, -773094, -18214956, 13661217, -37307696, -1345935, -23070416, 11297375, -8825621, -25598006, -2655364, -7217693, -9286256, -29088202, -21328270, -5553393, 22179212, -15595026, 27483496, -24186572, -16021839, 4678830, -2711735, 12252468, -8280697, --8691403, -11900281, -3616363, -39505648, -11650636, 789737, -2073932, -6853694, -15770583, 11983496, --13981729, 20618528, -6808060, -2876018, -15136538, -13897440, -26222922, -11505681, 9310952, 3760781, --1803349, 1557463, -9535364, -7150584, -12200928, -10155450, 5141613, 7682623, 3511673, -22490596, -25698400, 3583077, -11210402, 20781736, 14763950, 24820080, -4596152, 14681272, -33538862, -17748952, --31607738, 32980516, -10158135, -21795348, -21348134, -45093400, -18815714, 33240900, -1534914, -14906758, -7975218, 39975408, 51306068, -5216238, -23150410, -5790153, -8883603, -23505820, 9761924, 265751, --16958678, 48888004, 16933446, -12094628, -34322696, -3501472, 8110509, 8531416, 9898826, 23094040, --6877854, -12160663, 10997801, -43294880, -28639378, -11720966, -3111167, 4016868, -22863722, -21457656, -21988622, 16874390, -13445932, -26531086, 16451872, -186294, 29020020, -24286430, -5365488, -8766028, --1401770, -19396072, -27707908, 22571664, -17139604, -11685532, -21133386, -5577552, 14140106, 12327093, --8442832, 976031, 2593087, 16709570, 27099096, 18934900, -34444564, -17561048, -20396262, -6102612, -11886322, 3331284, -23570244, -34959960, 28814398, 849330, -28289338, -47790636, 23449984, -6961605, -12355010, 11056320, 11768210, 1340567, 7939784, -17758616, -9484898, 4880157, 18388902, 22695144, --27498528, -23041426, 66575216, -5064840, -6174016, -9669045, -20603494, -2006824, 24234890, 38694436, --17361868, -10417443, -3555696, -17210470, -3998615, -9584220, 15636902, -15524159, 17858474, 8613020, --5611912, -21754546, -1212791, -8791261, 33493228, -17879412, -10737, 354335, -2846490, 15271830, --9061844, -929860, 7366406, -4196720, -31791884, 16824460, -14207215, -16697222, -3375844, -17811766, --9995463, -32654100, 32244466, 1899986, -20447802, -38268696, 23223962, -22334366, -21625160, 875100, --16654809, 8474507, 15078020, 44776644, -11723650, 18045306, -2858838, -20422032, -17208324, -4271882, -67260264, -57307212, -3272765, 62278100, -54654532, -19481434, 32498406, -2608119, -24012626, 61428232, --27926414, -8799314, 32470490, -38736848, 37004364, -4942434, -21082384, 20439750, 7950522, -2398739, -5228049, 3800509, -3110093, 8212515, -6503654, -8791261, -3333968, -12631499, -10304163, -24769614, --8713952, 23570780, 22315576, -31069256, 12064563, 18393198, 15641197, -4292820, -30602716, -1610076, --14477261, -36048736, 24887188, 61125976, -32974612, -2383707, 43885440, -10710575, -13744432, 35905388, -27074936, 14064407, -12444668, -26361972, 10801843, -9842454, -16012175, 64085744, 47651052, -36160404, --26116086, 35416836, -59885264, -19991462, -15644955, -8875550, 44969920, 30479772, 20822538, 22611392, --70308616, -23236846, 71208408, 42119672, 10552735, -16117939, 26330298, -21817360, -46394236, -30084636, -27100170, -14926622, -336618, 31337692, 55737400, -1968169, -23890756, 9678172, 27738510, -60724932, -27099634, 878858, -5710159, 31989990, -4772246, -23130010, 12492986, 11455752, 31281320, 17993766, --16042777, 1487132, 5315022, 21641804, 5446019, -23619636, -367220, -777926, 5506148, -21918292, --24009404, 36230196, -12268037, -36610840, 19719806, 33689724, -18034030, -5683853, 2732673, 23313620, --26477400, -34844532, 10304163, 30663920, -5944235, -12095702, -6859600, -6605660, 13597330, 6281927, -8340827, 76328008, 4716411, -8895951, 1564979, 3163780, 41350336, 2110977, -13995151, 10050760, --31409632, -17850420, 8764418, 1101659, 35554812, 28849296, -17583060, -4217121, -16628503, 1951526, -12955769, 4433480, 4227859, 13951128, -8781061, -35633196, 9623411, 26826366, -11825119, 24178518, --34562140, 18680960, 9935870, -26993332, 4298189, 4563403, -11828877, 19072876, -41609108, -132249024, --156103808, -15899432, -108874200, 39936216, 258542528, 138103056, 209625536, 220959968, -26219164, -66328792, -17098264, -164495104, -200507856, -63406604, -220512752, -177529248, 42584064, -128276176, -36294084, 249559072, -89212376, 175844016, 305456992, 180872880, 79977656, 60243360, 19978040, -138905152, -172205632, -58226872, --234518096, -234904640, 28994788, -176140368, -144628736, 84031032, -148201072, -152600192, 112219976, 44402984, --22305912, 266836656, 250093792, 158907888, 339659968, 319740448, 108533824, 126389616, 98557152, -163208224, --163197488, -206366736, -406961024, -480461888, -345406112, -344069824, -253527088, 8209830, 23448374, 167160672, -289638112, 356904256, 325891904, 378216416, 325039360, 193135552, 131750272, 47417512, -57416732, -134692864, --192677600, -159542464, -232629392, -248321056, -149541104, -71778568, -35441532, 0, 0, 0, -0, 0, 0, }, +661962, -4917201, -1250372, -1280437, -550293, -1284195, 2446521, 5765994, 878858, 4686346, +1743757, -1127429, -2554969, 2191507, -775778, 4634270, 3273302, -1581622, -2910914, -3406983, +1711545, -1139777, 398358, -2471217, -1035624, -631360, 1984275, -2419140, 1961726, -776852, +-2707977, 3482145, 3521336, 576063, 1317481, 699543, -690416, -2273112, -7385197, 2042794, +-2382633, 2250026, -2359011, -2858838, 2126546, -2518998, 1229434, 1348620, -5202279, 216359, +781147, 1294396, -2047089, 2754685, -2732673, -1758789, -915902, -1242856, 1814624, -301721, +876710, 1561221, 2297271, -404801, -2460480, -2486786, 162135, -5215164, -2262374, -481573, +4718022, 1422708, 1893544, 1471563, 2643016, -1112933, 2631741, 4597226, -3535832, -3068217, +-4711043, 4155918, 2042794, 307627, 6177237, -683974, -135828, -1968169, -1600949, 1291711, +-1725503, -3311420, 1770063, 464930, 5149129, 7052873, -1911261, -4251481, -5217312, -390305, +-3008625, -2909304, -2009508, -464393, -4168803, 3888019, -1532230, -1623498, -2778844, -2076617, +696858, 4371740, -525597, -1359894, 1280437, -4447439, 3213173, -2806761, -9860708, 4773320, +3162707, 5308043, 5530844, 972810, 2878702, -3020973, 759672, 4138738, 257698, -161598, +-1097364, -682363, 2197413, -2198487, -1576253, -35433, 2076080, -1953673, -2331094, -3453691, +4088809, 1460826, 401043, -1261110, -4330938, -435939, 2967286, 1578401, -829466, -1297617, +2745558, -1151051, -14701136, 7648800, -734976, 202937, 2653753, 3738769, -5483063, -712965, +-992674, 3104188, 1177895, -3368328, 10437844, -1141388, -656593, 4625143, 3807489, 1222992, +2639794, 8501351, -4229469, 239981, -2159832, 824634, -2632815, 181999, 258772, 925565, +-4742181, 372052, -1144609, -1818919, -210990, 2935610, -1648731, 2724083, 4019016, -6995428, +927176, -2874944, -779000, -4332549, 2122788, -2597382, -448824, -1496259, -4362076, 1593433, +-2934000, 1909650, 1070521, -2230699, -3187940, 13959, 2911988, 2115808, 5309117, 2363843, +-2347737, -6675453, -487479, 1026497, 8213588, -2711198, -1328756, -257698, -1704565, -4502737, +-2178622, -4238059, -709207, 3059091, -1001801, 3621194, 2133525, 1560684, 1803886, -2474438, +11052025, 5917391, -1407139, -3996467, 6468221, -6846715, -864899, 4306779, -2627983, -1815161, +-2753074, 7401840, -2161442, 2506114, 929324, 2479807, 10012643, -9402757, 3232500, 5186173, +-2898029, -8678518, -4346507, -297427, 911070, -957778, -1276142, 4089346, 5836861, -131533, +-3525631, 615254, -4558034, 1790465, -2721399, 2063732, 6231461, 2473901, -5499706, 175020, +751082, 9099425, 2039573, 4724464, -851477, 2286533, 1957431, -10253161, 605054, 5370857, +2774012, 5970005, -4508642, -2695629, -4469451, 1710471, 3680250, -639413, 1611150, 654983, +-1926293, 1333051, -1271310, 2087354, 2236067, 47782, 3296388, 959925, 398358, 1591822, +7204808, 1635309, 4384625, 4638565, 22447646, -5383742, -1750736, -3020436, 4835060, 3363496, +7830799, 3337190, -817654, 3963181, 126165, 4396973, 1839320, 5976984, 386547, 5080947, +6384469, -6415071, 1468879, 2142115, 1374390, 1461900, 1749125, -3642132, 210990, -4248260, +-461709, 241592, -7681549, -4939750, 2161979, 388158, -99858, 3566434, 3240553, -1168231, +-6644315, 2479807, 6263136, 4483409, 5835787, -1082869, 3194382, 6132677, -9353902, 3466576, +4223564, -4187593, 5893232, -3581466, -826781, 1073205, 1155883, -2638184, 2741800, -313533, +-1116155, -2744484, -2755759, 3812320, 3167539, 2035278, 3073586, 5605469, 2545842, 7590281, +-1748589, -7269769, 7281044, 1890859, 3304977, 2277407, -1858647, 2762738, 728534, 1277753, +4260071, 9385040, -11660299, 7050726, 1185948, 7218767, 1392643, -4774393, 1045825, 5435281, +-7412040, -1974611, 462246, -8448201, -1905892, -6620155, -4062502, -4974646, -5193689, 1540283, +-7891466, -5265630, -6334003, -2106145, 5579163, 1531693, -7534983, -3428458, -7854959, -2491081, +1438277, 10311143, -9015136, 2970507, -2433636, -3887482, -6738804, -370441, 962610, 6314139, +3547106, 165893, -6069863, -11071352, -248571, 2269353, 8042863, 2046015, 2554969, -6810208, +2167348, 4250944, 402653, -72478, -3168612, -4078608, -993211, 2032593, 654983, -3025805, +237297, -7602092, -709207, -6607807, 3812857, -2261837, 3900904, -6596533, -4102768, -8709657, +-206695, -6098854, -1194538, 577673, -6053757, -4538707, 2715493, 2735357, -4769561, -27430346, +4311611, 3038689, -7995082, -1832340, -142271, 205622, -1627256, -2684892, -2143189, -8180302, +6125697, -3984119, 727460, -6808597, -2548526, 9757629, 8723615, -5653788, -3552475, 264141, +-319975, -4630512, -5555540, -3823058, 464930, 422517, -18790, -545461, 2094870, -6653978, +1888712, 253940, -11971684, -1380832, -3729642, 5422396, 7649874, 1276679, -1603097, 431644, +-7122667, -8575976, 4402342, 8617852, 9283035, -2488934, 1497333, 5637682, 5486821, -2875481, +5040144, 8711267, -608275, 7354595, 5897527, -7115150, 2117956, 531502, 7525320, -4649302, +-5318244, 4592394, 5659157, -1701344, 310311, -8412230, 5798206, -4677757, 6165426, -10530723, +1040993, 2530810, 5027259, 296890, -4336307, -8930311, -10832444, 3515968, -9597104, 11605539, +11164231, 103616, -15663746, 6142877, 651224, -3131568, 10430865, -209917, -9416179, -1237488, +11365557, -14788109, 248034, -3899830, -11673184, -3457449, 3758, -2529199, -6073621, 3105261, +-5062693, 3675418, -4338991, -8050916, 3948686, -868120, 5761162, -11857331, 4534949, 8806294, +-3841312, 448287, 8971650, 13075491, -3733400, -3041911, -11446625, 345208, -9469866, -1079111, +-6638946, -3221, 747861, 5075041, 2436320, 4603131, -3715684, 564788, 2916820, -937914, +12210055, -8556649, -4182225, 15880105, 16193637, -3598646, -1147293, -10630044, -5343476, 120796, +-2937221, -7191386, 9779104, 2611877, -2622615, 14022531, 2783676, -7394860, -156229, -13743358, +-6533182, -7968238, 13070122, -3550864, -193810, 8971650, -2198487, 5270462, -2961917, -11546483, +-768262, -70867, -2375654, -6887517, -7595113, 3848828, -6012954, 10509785, -3264712, -7820062, +6575058, 13200045, -3301756, 3599720, -3568581, 7553774, 190052, -16353625, 5793911, 8828305, +927713, -2877628, -9383430, 7704635, 5325760, 4878546, 1081258, 2983929, 10620917, -7700877, +1374390, 1813013, -5823439, -11661910, 10910291, 5738613, 20254528, -1347009, 8976482, -3310346, +-6269579, 707596, -915902, -687195, -1727651, -7012608, 14576045, -137439, 1212255, 1535451, +-1943473, 11360725, 1591285, 9360881, 4239670, 985695, 10736881, -5815386, -11924977, -3244848, +2228551, 537408, -4980552, 4670777, -3659849, -18155364, 1220845, 1617592, -9954124, 11162620, +-17095580, 3428995, 8421894, 12290049, -11819213, -1237488, 8891656, 6377490, 7662222, 1810329, +15593953, 3347390, 6767795, -1316944, 1407676, 6782290, 3925063, 7747584, 1081795, -9396852, +-14034343, 8292508, 4243965, -2184528, 2219424, 4930623, -13101798, 726386, -8081518, 4625680, +38118, 9536975, -2354716, 4611185, -1556926, 2947421, 1723356, 270046, 5524939, 7366406, +2903398, 4558571, -10162429, 5104569, -1379758, -17884780, -11855720, 3896609, -13081397, -183073, +11718281, -7410966, 22788022, 8866423, -3997541, 12940200, 1057636, -3081639, -8509404, -7984881, +-11893301, -941135, 7721815, -7805030, -616328, 9170829, 4153770, 5783174, 16828756, 3408594, +11193759, 1674500, 2667712, -15646566, 5601174, 3483219, -9258339, -329639, 5708012, -125091, +3974992, -9458055, 7230578, -607201, 2027761, 6799470, -12831215, -8759586, 2181307, -183610, +6836514, 14387067, -1490891, 3587908, 15289547, -5740224, -10662256, -597537, 11125576, -2447058, +-13261785, 1055488, 4582193, -2554969, -4335233, -950262, 16491064, -3184718, 14136348, 10907606, +12849468, 728534, 734439, 7690676, 2215666, -2677375, 2319819, -10437844, 7435662, 13164075, +7820599, 1099512, 6868190, -5829881, 5122822, -5688148, 7694434, -7531225, -473520, -695248, +-1248225, 23329188, -4234838, -1469953, -2831457, 3063386, 5606543, 12107513, 13157095, -8007430, +2337536, 13662291, -9029632, -10242960, 4578435, -4852776, 4577362, 26015690, -14399415, 760209, +350577, -8509404, -1814087, -9332964, -14591078, -11262478, -15183783, -5968931, 1377611, 11711302, +8530342, 2994666, 12244415, 3582003, 7344394, 6879464, -3748433, 10722923, 11456825, 8179229, +-16304770, -9082245, -9608916, 3340948, -6755447, 318901, 4138201, -4743792, -11662984, 7179575, +-5760625, 2499134, 1978906, 11406359, -12421582, 18552112, -18848464, 18968186, -526670, 9511742, +-9724343, 3346853, -21062520, -11434277, -10531797, 9081708, 3617436, 13174275, -1880122, 15032, +-7260106, -16388521, 10136660, -8891119, -5316633, 7961259, 18015240, 18226768, 7783555, -1030255, +-12957379, 7398081, -19542102, -1231582, -11458436, 6311992, 19444390, -19166828, 6231461, 9349607, +-12996571, -857383, -2989834, 7133941, -8939438, -11251741, 1498407, -4706748, -16996796, -14662481, +-16968342, -5482526, 9286793, -13189308, 7067369, -17746804, -4035122, -7394860, -6967511, -14240501, +-2250026, -5878200, -9078487, 5516886, -10006737, 8724152, 927713, 6635725, -12901545, -22896470, +-2962454, 3711926, -10377715, -7580081, 2443837, 2071248, -11977053, -5913096, 14163728, 6686727, +-3240016, 7650411, 20824686, 49929, 1540820, 1545651, -2954401, -1056025, 1948841, 2283312, +-18281528, -6811818, -22072374, -7169374, -20707112, -9700721, -369904, 22009560, 9076877, -11699491, +-14618995, 7925289, 16281147, 10823318, -9574019, 13266080, -6860674, -1373316, -25659208, -7395397, +-4891968, -3152506, -18272938, -26332982, 6386617, -46708, -21360482, 5058935, 27655294, 4296041, +758599, -18272402, -4772783, 938987, 292058, -18730352, 12074227, -18465138, -3807489, 4240207, +-8869644, 20973400, -17463338, -18152680, -14599131, 20226074, 9164923, -12097312, -10630581, -7403450, +-2151779, -6726993, -6508486, 672699, 7758859, 19837918, -2087891, 8212515, 7669738, 6857452, +-13289166, -17294760, -11871826, 13630616, -2196876, 16632798, 5978058, -2465311, -23163296, -19742354, +-1641751, 912681, -13244069, -9203578, -5993627, -7265474, -30353608, -7469485, -7049115, -11924977, +-4926328, -8138963, -13583371, 8997420, 19801946, 9680856, 1168231, 10281078, 15112916, -6278706, +5313949, 2452963, 2227478, -1906429, -2806224, 8710194, 5022965, 15443092, -2910914, 8053, +7194607, 31586264, 882616, 15721191, 23930484, -4278325, -17892296, -1008780, 21613886, -418759, +-13877039, -19387482, -14272176, 20463372, 15347529, -30067456, 11651709, 14211510, -3930432, 10749766, +31708670, 4045859, 8332237, -8941048, 8618926, -9542880, -5439039, -4359392, 3877819, 9294309, +12502650, -2147, 6154152, -1727651, -135828, -4263829, 9686225, 29935386, -7536594, -7615514, +11935714, 8717710, 2799245, -19114752, 15178951, -14928233, 11260331, 13386339, 3155190, 4547297, +-1546188, 21072184, 16676284, 1714766, 11868068, -6271189, 14497662, 3651259, 16156593, 22243636, +1575716, 6812892, -615791, -6049462, 1610076, 10605885, 12365748, -18156438, -9737228, 6258841, +23818814, -8749922, 16696148, 11232950, 5328981, -21292300, 5492727, 5379984, -24601572, 18064632, +-12301860, -16285979, -31422518, 10622528, 24793772, -7137699, -15175193, 6852084, 28440736, 18253612, +7455527, 21554294, 15493558, -5696201, -42977592, 4807142, 20947630, 10009421, 4219269, -18839338, +-563178, -13022341, 2518462, -1332514, 3017752, 6359236, 8386461, 3782793, -23757612, 13420162, +-3845606, 4091493, 16941498, 6833293, 2597382, -6218039, 21098490, -660888, 20927766, -26222386, +-8562017, 8575439, -16214575, -13079786, 35970, -3245922, -12961674, 1658394, 18192408, -361314, +244813, -9772124, -22034792, -13027173, -7114077, 9046275, -3484829, 2411087, -11538967, -10794327, +-6785512, 17117592, -12814035, 10075456, 5047661, 5905043, 388158, -16723529, -26134340, -1451162, +14850923, -19859928, 8183524, -17001628, 9251360, -17904644, -2788508, -17643188, 23928874, -23029078, +-16152298, 6645388, 2102923, 12294344, 7648263, -5876052, -4972499, 7158637, -35811436, -4606890, +11433203, 3208341, -8112657, -12432320, 1755031, -11791296, -591632, -18504330, 18400714, -6584185, +11733851, -24221468, -13479218, 38655, 30941482, -24295556, -1569811, -18894098, -14878304, -4169340, +19628538, -3860102, 9060234, 9468792, -9470940, -20999706, 31038118, 13812078, -16736414, 3956739, +2907693, 8980777, -16230681, 15778099, -630823, -31173410, 4096862, 6987375, 8959302, -25700548, +-5516886, 3970697, 24022826, 5079336, 13784698, -33298344, -19758460, 11118060, 942208, 22886270, +-4949950, -3015604, 2747705, 12017855, 11439645, 4704063, -42013908, 12949326, -3755949, 10676752, +24401320, -6489696, -553514, -25526602, 10179072, 12657805, -12017318, -7534447, 25885232, 38136088, +12220793, 6192806, -7803419, -31644246, -20854750, -7474854, -773094, -18214956, 13661217, -37307696, +1345935, -23070416, 11297375, -8825621, -25598006, -2655364, -7217693, -9286256, -29088202, -21328270, +5553393, 22179212, -15595026, 27483496, -24186572, -16021839, 4678830, -2711735, 12252468, -8280697, +-8691403, -11900281, -3616363, -39505648, -11650636, 789737, -2073932, -6853694, -15770583, 11983496, +-13981729, 20618528, -6808060, -2876018, -15136538, -13897440, -26222922, -11505681, 9310952, 3760781, +-1803349, 1557463, -9535364, -7150584, -12200928, -10155450, 5141613, 7682623, 3511673, -22490596, +25698400, 3583077, -11210402, 20781736, 14763950, 24820080, -4596152, 14681272, -33538862, -17748952, +-31607738, 32980516, -10158135, -21795348, -21348134, -45093400, -18815714, 33240900, -1534914, -14906758, +7975218, 39975408, 51306068, -5216238, -23150410, -5790153, -8883603, -23505820, 9761924, 265751, +-16958678, 48888004, 16933446, -12094628, -34322696, -3501472, 8110509, 8531416, 9898826, 23094040, +-6877854, -12160663, 10997801, -43294880, -28639378, -11720966, -3111167, 4016868, -22863722, -21457656, +21988622, 16874390, -13445932, -26531086, 16451872, -186294, 29020020, -24286430, -5365488, -8766028, +-1401770, -19396072, -27707908, 22571664, -17139604, -11685532, -21133386, -5577552, 14140106, 12327093, +-8442832, 976031, 2593087, 16709570, 27099096, 18934900, -34444564, -17561048, -20396262, -6102612, +11886322, 3331284, -23570244, -34959960, 28814398, 849330, -28289338, -47790636, 23449984, -6961605, +12355010, 11056320, 11768210, 1340567, 7939784, -17758616, -9484898, 4880157, 18388902, 22695144, +-27498528, -23041426, 66575216, -5064840, -6174016, -9669045, -20603494, -2006824, 24234890, 38694436, +-17361868, -10417443, -3555696, -17210470, -3998615, -9584220, 15636902, -15524159, 17858474, 8613020, +-5611912, -21754546, -1212791, -8791261, 33493228, -17879412, -10737, 354335, -2846490, 15271830, +-9061844, -929860, 7366406, -4196720, -31791884, 16824460, -14207215, -16697222, -3375844, -17811766, +-9995463, -32654100, 32244466, 1899986, -20447802, -38268696, 23223962, -22334366, -21625160, 875100, +-16654809, 8474507, 15078020, 44776644, -11723650, 18045306, -2858838, -20422032, -17208324, -4271882, +67260264, -57307212, -3272765, 62278100, -54654532, -19481434, 32498406, -2608119, -24012626, 61428232, +-27926414, -8799314, 32470490, -38736848, 37004364, -4942434, -21082384, 20439750, 7950522, -2398739, +5228049, 3800509, -3110093, 8212515, -6503654, -8791261, -3333968, -12631499, -10304163, -24769614, +-8713952, 23570780, 22315576, -31069256, 12064563, 18393198, 15641197, -4292820, -30602716, -1610076, +-14477261, -36048736, 24887188, 61125976, -32974612, -2383707, 43885440, -10710575, -13744432, 35905388, +27074936, 14064407, -12444668, -26361972, 10801843, -9842454, -16012175, 64085744, 47651052, -36160404, +-26116086, 35416836, -59885264, -19991462, -15644955, -8875550, 44969920, 30479772, 20822538, 22611392, +-70308616, -23236846, 71208408, 42119672, 10552735, -16117939, 26330298, -21817360, -46394236, -30084636, +27100170, -14926622, -336618, 31337692, 55737400, -1968169, -23890756, 9678172, 27738510, -60724932, +27099634, 878858, -5710159, 31989990, -4772246, -23130010, 12492986, 11455752, 31281320, 17993766, +-16042777, 1487132, 5315022, 21641804, 5446019, -23619636, -367220, -777926, 5506148, -21918292, +-24009404, 36230196, -12268037, -36610840, 19719806, 33689724, -18034030, -5683853, 2732673, 23313620, +-26477400, -34844532, 10304163, 30663920, -5944235, -12095702, -6859600, -6605660, 13597330, 6281927, +8340827, 76328008, 4716411, -8895951, 1564979, 3163780, 41350336, 2110977, -13995151, 10050760, +-31409632, -17850420, 8764418, 1101659, 35554812, 28849296, -17583060, -4217121, -16628503, 1951526, +12955769, 4433480, 4227859, 13951128, -8781061, -35633196, 9623411, 26826366, -11825119, 24178518, +-34562140, 18680960, 9935870, -26993332, 4298189, 4563403, -11828877, 19072876, -41609108, -132249024, +-156103808, -15899432, -108874200, 39936216, 258542528, 138103056, 209625536, 220959968, -26219164, -66328792, +17098264, -164495104, -200507856, -63406604, -220512752, -177529248, 42584064, -128276176, -36294084, 249559072, +89212376, 175844016, 305456992, 180872880, 79977656, 60243360, 19978040, -138905152, -172205632, -58226872, +-234518096, -234904640, 28994788, -176140368, -144628736, 84031032, -148201072, -152600192, 112219976, 44402984, +-22305912, 266836656, 250093792, 158907888, 339659968, 319740448, 108533824, 126389616, 98557152, -163208224, +-163197488, -206366736, -406961024, -480461888, -345406112, -344069824, -253527088, 8209830, 23448374, 167160672, +289638112, 356904256, 325891904, 378216416, 325039360, 193135552, 131750272, 47417512, -57416732, -134692864, +-192677600, -159542464, -232629392, -248321056, -149541104, -71778568, -35441532, 0, 0, 0, +0, 0, 0, }, }, { { -207769, -2129230, 2378338, 6924561, -845035, 1109712, 818191, -422517, 3914863, 2948495, -5400922, --3054796, -4917201, -2898566, -550830, -3492345, 56371, 377957, 250182, -486942, -312459, --4798016, -762894, 1109175, 1853278, -2304787, 2971581, 912144, -2384244, -1576790, 545461, -2966749, -988379, -1027571, -1480153, -3993783, 802085, -5181878, -431644, -2572149, -2367064, --1709397, 1088774, -1753420, -2943126, -2068027, -301721, -1503239, -4112431, -1752347, -1159104, --1043140, -3055332, 427886, -1483374, 3561602, 711354, -4119411, -2372433, 5035849, -1497870, -1408212, -2736431, 1346472, 2304250, 2122251, -3716757, 1923072, 2672544, 1945620, -186831, --2221572, -1426466, -2022393, 1388348, -625992, 1056562, -9175124, -10882910, 5218922, 67109, -8002598, 2720862, 3404835, 2065342, 3117610, -373662, -333934, -2141041, -5625334, -3409667, -1220308, -565862, -1209570, -944356, 2666101, 1928440, -171799, 2277943, -2623151, -6467147, -1763084, -1758252, 498216, -3469260, 2273648, -2908230, -1466195, -1364189, 4228932, -1396938, --222801, -2204929, -675384, -5349919, 1512365, -1225139, 2527588, -2757906, 162135, -1519882, --4145717, 855235, -543850, -1503239, 1636919, 2849711, -816581, -2461016, -5972689, 71404, --3598109, 1136556, -61740, -2742337, -205085, -1475858, -925029, -4744328, 2622615, -4289599, -1965484, -2049773, -2591476, -2734284, -4584878, 1826972, 128312, 539555, 2581275, -3627637, --4775467, 2138357, -15545097, 0, -1905355, 4300336, 266288, 1751273, -1105417, 2211908, -601832, 1949915, -1610613, 10295037, -1991791, -1286880, -4134443, 1597191, -5031018, -1555852, -632434, -2428804, 211527, 3848291, 2388539, 1535451, 2773475, 3733400, -4129074, -1568737, -198105, 2407329, -3860639, 4155918, -3171833, -1653026, 3561602, -518080, 1078574, -2487323, -3339337, 3227668, 3721589, -5082557, -1207423, 5670431, 312459, -761283, -848793, 6167573, -4393215, 4786204, 526670, -1030792, -944893, -266288, 360777, 758062, 2336999, -5823439, -12348, -2680060, -2902324, -394063, 1618666, -2993055, 1475858, -2271501, -143881, -876173, -702227, 2115808, 2738579, -969052, 253403, -1190780, -3687766, -844498, 5527623, 6513318, --4220342, 752693, -3573950, 5986111, 1245004, -2208150, -3219078, -2815351, -450435, 928787, -1716376, 7911330, -4410395, -531502, -1643899, 3224984, -8437463, -804233, 5675263, 55835, -4799089, 2253784, 3886946, 4070555, 1861868, -532576, -3857954, 1561758, -941135, 745714, -6620692, 1858647, 5712844, -2651606, -1304060, 673773, -7209103, 1130113, 5757941, -1358283, -739271, -4355634, 3732327, 214748, 1794760, -5182952, 3479997, -3366718, -1793149, -3514894, --4246649, 2961380, 1178969, -1090922, -2003065, -1791001, -1275068, -666257, 2924336, -2073932, --4198868, -6573448, 6988449, 5587753, 761283, -6452115, 2707440, -2669322, 3432216, -1425392, -1270774, -3233574, -1790465, -4048544, -1263794, 2767570, 26732414, -9929428, 11976516, -9518184, -816581, 2838437, 2811056, -7860864, -2667175, -2645700, -13152800, -80531, 695785, -4751308, --767189, -70330, 9403831, 1722819, -6560563, 4771172, 5228049, 1145683, 9532143, -7114077, --2596845, -3817152, 2010045, 7604240, -558346, 444529, 2836289, -1407676, 3406446, 1494649, -8718247, -1369558, 3411278, -5774584, 5205501, -4067871, 5811091, -177704, -6103149, -996432, -8780524, -480499, 5933498, 3470871, 5703180, 395674, -4553739, -3812857, 68183, -2881923, -4669167, 2956011, -4684736, 461172, -3672197, 5999533, -1730335, 4745402, 5893232, 775778, -6069863, -588411, -3033858, -1367410, -3859028, -252866, 7962333, -5571110, -5273683, -2634426, -2152316, -2723546, -22313428, 2387465, -6603512, -4740034, -7236483, -8768713, 3393024, 7741142, --1218697, 2976949, 1191853, 3947612, 866510, 237834, 2376191, -4828080, 11023570, -632434, --6477348, 7202660, -2255395, 3023657, -7293928, -4575751, -5177046, 2168422, 1320166, 5622112, -142271, -3588982, 565325, -3211025, -3491809, -3903052, -1361505, -5410585, -2736431, 4929012, --4664872, -386547, -3652870, -5735929, -2549600, 655519, 1802276, 3550864, -2876554, -2675228, -3548180, 571231, 1327145, 897648, 2192581, 3297461, -5449777, -1862942, -566399, -7657927, -2003602, -570157, 4443144, -4494684, -3436511, -4195110, 687732, 4716411, 3613678, 8340290, -5531918, -5133560, 1999307, -2292439, 3800509, 2547453, -5811091, -28714004, 7418483, -8818642, --7410966, -5429913, 587874, -1837172, 16330539, 1283122, 3624953, -2223183, -308701, -7221988, -6437619, 1627256, -1370632, 1005559, 8513699, -4820027, -1923609, 1687922, 228170, 4097936, --4278861, -2117956, 4511327, 1429687, 4120484, 165356, -5203353, -3521336, 2295660, -850940, --2044941, -3384434, -2151242, -591095, 8003672, 1729261, -1957968, -229781, 184147, -2972654, -5628555, 4225711, -1900523, -6815040, 1137093, -3824132, 5311264, 4029753, -4980552, 1283122, --6317360, -5690832, -5065914, -6249715, -2488397, 726923, -3966939, -283468, -4337917, -3832722, -6116034, 3585224, -6193343, -8319889, 288300, 5710696, -5590974, -4590247, 4879083, 3294240, -5625871, -15015743, -1568737, 2431488, 7168301, -1492501, -3900367, 1627793, 10570451, -13507672, -3012920, -2792803, -2600066, -6110665, 3527242, -10825465, -7121056, 3650185, -5743982, 3358665, -15226196, -2756832, 6083285, -7252053, 7288560, -1956895, 2087891, -6497212, 2898029, 1817845, --3593277, 1511292, -825707, -3336116, -348966, 4212826, 6477348, -5166309, -8376797, -6524056, --6183143, 804233, 4715874, 12857521, -273267, 8675297, 8899172, -8352638, 6332393, -12296491, --4635344, 842887, -5609764, -5049271, 3311957, -11878806, -2471217, 8409546, -3691525, -3029563, -1003949, -3543348, 3315178, -3503620, 5759015, 7670812, -2153389, 2487323, 261456, -7475391, -618475, -4767414, -3433290, -5835250, 3400004, 2873333, -5888937, 1001264, 3106872, 35542464, --1558536, -13825500, -1609002, -438087, 1476395, 4640712, 1945083, -1430761, -1335198, -6849399, --3229279, 4154844, 8744017, -6873559, -4368519, 5989869, 547071, -1853278, 2379412, -333397, --8146479, -8114804, 11408507, -816044, -694711, -1650341, 5852967, -198105, 615254, 3977140, --6243809, 6871411, 2712809, 1347546, 2468533, 6878390, -15955267, -6828461, -3961034, 14918569, -1766305, 1384053, -4656819, -4673462, 4199941, -363998, 4864051, -1509681, -10401337, 1388885, -945430, -1235340, 4589173, 2516851, 926639, 8413841, 19313932, -1266479, -2208150, 7825431, -1663226, -2049236, 4441533, 15663746, -2593624, 3202972, 4537096, 4709969, 2744484, 4278861, -2999498, 3644280, -6125697, 6131066, 8011188, -2915746, 6999186, 7818451, -10280541, -3066070, --8758512, 8397735, 15787226, -7750806, -1968169, -8868034, -3993783, -10700911, 7370164, -6561637, --2833068, -763967, -132607, -4291209, -5412733, 9462887, -8868571, -3245922, 755377, 6455873, -6697465, -9997073, -3179350, 3807489, -8829379, 4854387, -7066832, -2774012, 2227478, 207232, --4007205, -1017370, 1750736, 11161546, 1068910, 2554432, -315680, -9466645, 10070625, -5037460, --8139500, 6318434, -5912023, -6199786, 7832410, -3604015, 671089, -1694365, 709743, 10908680, --2250026, 2565169, -9842991, -573378, 10530186, 2637647, 10412074, 9507447, -3535295, -2157684, --13131863, 2187212, -2635499, 8649527, 9739375, -5610301, 2011118, -18250926, -5636071, 6489696, --6970732, 9936407, 6554657, -7991861, 2947421, -7468948, -663572, -10144713, 17063368, -4840428, -1328219, -5206574, -15220827, 9002788, 3303367, -11382737, 7318625, -5070209, -3607236, 4126390, -16201154, -7880728, 15665356, -210453, -10626823, 544387, 3845070, -9469329, 10788421, -5454609, -8060580, 17041894, 1922535, -7861938, -1946157, -845035, 4173098, -6688875, -3389266, -862752, -8669928, -2945274, -3042984, -11074573, -47245, -13106630, -2077154, 14905147, -2979634, 8490077, -1181653, 2268817, -19110456, 268972, -12064563, 10048613, 17920752, 5379984, 4860829, 1065152, -3119220, -10222022, 4129611, 5412733, -3962107, -1311039, -3393561, -2607582, 8577050, 136902, -10341208, 29250338, 11601780, 2914135, -8968429, -9295383, -4631586, 5975910, -7492034, -4449586, -29820494, -17353278, -1225139, -9020505, -16296180, -21516176, 4976257, -7442105, 5319854, -20413980, -3092377, 6185290, 5539434, -9048422, -18748606, -14991583, -12645457, -670015, -7661148, -13962402, --9773735, -5425618, -11453604, -8316131, 1061394, 12714714, -1084479, 1092532, -1209033, -12765717, -6623914, -1927367, 1444183, -3503083, -8587250, 5872831, -10522670, -14591078, 11643656, -14250701, -1989107, -952946, -19449760, -12057047, 6720550, -1153736, 8431558, -6815040, -20551418, -876710, -133144, 6669548, 7428146, 17894982, -11309186, -39182988, -13902809, -13827110, 8191577, -25728464, --8833137, -4819490, -23254026, -8241506, -617402, -4893042, -4442607, 4581657, -6213207, -845572, --5681168, 5296769, -13160317, 5131949, 11555610, -12300786, -17294760, 7419019, 9229348, -2547453, --2919504, -8489003, -9225590, 22854594, 8769249, -20735028, 7874286, -11188927, -463320, -10168335, --20941724, 6562710, -10560251, -4522064, 1629940, 797790, -4727149, -18136574, -10519449, 9080098, --10352482, -221191, -9018358, -15147276, -4985384, 16925392, 3689377, 3017752, -13697724, -4954245, --1938641, -1962800, 7114077, 7332583, 10725607, 11713986, -4526896, 6530498, 3627637, -6979322, -5552856, -11652783, -8558796, -8853538, 5228586, -10226854, 2063732, -15285789, -11490111, -7099581, -17311940, 11789148, 13677323, 12639015, -10032507, 15892990, 2638721, 7032472, 24696598, -5167383, --1741072, 3043521, -8236674, 3769371, -2281702, -14751065, 4893579, 10508174, -10067403, -10691247, -2306398, 10951093, -5041218, -8860518, -20164872, 22266722, -18059800, 23069344, 12751221, 8551280, -4647155, 8830990, 9633075, 8866423, 24823838, -9210557, 1400159, -2078227, -4727686, -1163936, -2741800, -2745558, 4461934, -2045478, 7491497, 6194417, -1814624, -4789963, -25516400, -9381282, --18624588, -1283658, 9192304, 9237938, 2662343, 4473746, 6812892, 5508296, 6581501, 17500918, -26382374, 17498234, 3171297, -3930432, -5654862, -8238821, 8902393, 9006546, 10219875, -8548596, --6801081, -10488310, -2171106, 12450036, -431644, 15014669, -10083509, 7707319, 4445291, 13339095, --30034170, -21813066, -9299678, -12625593, -12806519, 2759517, -5706401, 17566416, 4657355, -21640192, --2609193, 32263258, -12252468, 9167608, -6157373, 12302397, -7639136, -5838471, -862752, -14925548, --7694971, 11576547, 4799626, 8429947, 22657026, 1550483, 14985141, 22151830, 15215459, -10634339, --23426362, -1187022, -11013370, 24349780, 6649146, 18939732, -3248606, -10766946, -4312684, -11706470, -3968013, -9092446, 545998, -10077067, 4536023, -7458211, -3499862, -15938087, -15957414, -1888712, --22640384, 11757473, 7800198, -6955163, 10770704, -5718212, 3843459, 12283606, -14545980, -18626200, -2678449, -4294431, 30166240, 12790949, -34357592, -9372692, -10198937, -17653926, -19065896, -37921340, -5998996, -13702556, -4203699, 5242545, 686121, 7634305, -2203855, -4550518, -29310468, 3357591, --13754096, 3528316, 15960098, 3615826, 10399726, -16849156, -23488102, 4860293, 13065827, 9880035, -4239133, 9624485, 13442711, 19195820, 17467632, 40411884, 26544508, 37056440, 2005213, -7800735, --25876642, -7872138, 3805341, 5545877, -6529961, -20009178, -7585986, 32011464, 12881681, -4807679, -9396315, -1055488, -12416214, -3790309, -8303783, 21747030, -2261300, 988916, 8935143, 325881, -10197863, -407485, 14665703, -14363981, 16971026, 3281892, -8882529, -5248450, -9791989, 15629386, --22771916, -24082418, 14296872, 24618752, 380105, 16909824, 22813256, -26889716, 8000451, 5160403, --2356863, -522375, 3015067, -10272488, 17575544, -11550241, -9982041, 7202124, -139050, -2315524, --5459977, -5861557, 1467268, -17904644, -6548752, 13814762, -18710488, -4357781, -13181255, 51540, -33508262, -11446088, 529892, 8923868, -1731946, -8610873, -24067386, 20780662, 7484518, -45023068, -7757248, 9016747, -18375480, -43844636, 38738456, 23026394, 12186433, 8513699, 19065360, -44261784, -17963700, 20193326, 8574365, -28413894, 15556372, 28346784, 13068512, 31262530, 11311333, 312996, --1427540, -1230508, -5550709, 13070659, 22155588, 21008296, 7224672, -6857989, -11345156, 2312303, --10370199, -12215961, 12176232, 8152922, 2067490, -12318503, -11877732, -3034395, -10400263, 4571993, -25301652, -5173288, -8744553, 8006893, 4179003, 6876243, 8448738, -2784213, -5766531, 19739670, -13020730, 5739150, 8402567, -2794413, -21306796, 3492345, 12783970, 343061, -16253767, 18820010, -4226248, 26585848, -191126, 23439784, 1312649, -10829760, -4353486, 3249680, 34479460, -8033200, -10829223, 4770098, 14468134, 3712462, -3342022, -8158827, 6584185, 41151156, -5718212, -5542119, --27847494, 31870804, 143881, 28300076, 1284732, 2560874, -24501714, -7009924, -10718091, 19890530, -5432060, 9235253, 5605469, -18509162, 2430415, 2319819, -16411607, -23426362, -24256902, 9193914, --8726837, 23374286, 1753957, -6302328, -5412196, 5730023, -8306467, 2341831, 7014219, -8579734, -5714991, 8523363, 2959769, 3114925, 17403208, 29632054, -5284958, 751082, 14717779, 12793097, -17546552, -11784853, -4746476, 6232535, -16906066, 2726231, 1720134, -21715354, 29575682, -355409, -15006079, 13896367, 9133248, -16218333, 1774895, 15939161, -11946988, 27498528, 7315940, -8498667, -21841520, 17572322, 11471858, -35582732, -7515119, 8392366, -12618614, 2994129, -20613696, -4229469, --31238370, -8213051, -5055177, -8382166, -34825204, -4414690, -9382356, 37820408, 18111340, 16165720, -12542915, -5589900, 8589398, 19696184, 19024020, 9568650, -18556406, -21756156, 12586939, -1174137, -9645423, -2269353, 22216256, -12970264, -1155346, -3066070, 19609746, -11111617, 32894618, 40212168, -40741524, 4567161, -5270999, 8487929, -3126736, 11691975, 249108, 1990717, -9478993, -28932510, --8496519, -27608050, 18966038, 18323942, -16531866, -11526082, -16593069, -6376416, -843424, 42908872, -2277943, -18509698, -20512764, 890669, 30195768, 15817828, -55268712, -9413495, -8371965, 9697499, -23099944, -22582938, -6204617, -12605192, 8068096, -31694174, 18339510, -3613678, 704912, 11304891, -2772938, -14742475, 34609384, -1715303, 16966732, 37078988, 74048456, 44902272, -557809, 25115358, -37250788, 47551732, 50864224, 12671227, 27404038, 10897943, -5196911, -14398341, 20973400, -21842594, -41923712, -2866354, -5033702, 2497524, 33960844, -19430968, -1347009, 718333, 2880313, 13060996, --5669894, 18074832, 8338679, -1662152, 6506876, 3289408, 15744276, -38491496, -9743133, 37044, -7104950, -2752000, -26040924, 24925842, 1738388, 4297652, 11770895, -17965848, -5387500, -43039332, -14977088, -9489730, 11862163, 32789928, -5245229, 7350837, -461709, 15823196, -22429392, -34661996, -34678104, -2566243, 6729677, 5413807, 35171488, 22617834, 31266826, -511101, -31295280, 21123722, -14857902, -8835821, -7612293, 19857782, 1648731, 25055766, 48322140, 32212792, 11722576, 1731409, -37968584, -7631620, 16725140, 24136106, -9872519, 27827630, 26933740, 8189429, -11311333, -13280576, --16461536, -2871186, -1857573, -55399172, 12306155, -9322227, -2541010, 42928736, 18095234, -13602698, --10924249, -211527, -28372554, -34132640, 2332167, 348966, -19805168, 20484846, 1827509, -19545860, -11764989, 37260452, -5696201, -21083458, 12629351, -12250857, -14522895, 7293392, 29225104, -9359807, -3493419, 8752070, -10241350, -21839908, -15707232, 30346628, 9400073, -28599650, 23957864, 10600516, --21233782, -9649718, 40066676, -12502113, -32934346, -15271293, 53544820, -53066468, -26470420, 33317136, --15970836, -16139413, -53092240, 41636488, -34591128, 13315472, 104153, -4600447, -59955060, -15509127, -48132088, 33295660, -41248328, -8823473, -18971944, -5971079, 6105296, 13074417, 10922639, -66486092, -35508104, 31317828, 28064926, 2888903, 13547937, -31603980, -32279900, 59446104, 22142704, -45158896, -8211978, 57163868, 18069464, 6461779, 1851668, 4643934, 24647206, 33743412, -7360500, 6630893, -8881992, -5331665, 20360830, -10184441, -2622078, -7591892, 15670725, 11926587, -6116571, 11013907, --14971719, -11878269, 15606301, -9439801, 17118130, -10811506, -4882304, 179315, 9398462, -55835, -7010461, 3331821, 17372606, -11810623, -2392297, 869194, -6809134, 17262548, 14521821, -11361262, --4208531, -6737193, 3854733, -14797773, 8326331, 5402532, 7628399, -5502927, -4703526, 19670414, --22861038, -3249680, 9576166, -5473936, -4216048, 10674604, -28123982, 7535520, -10237055, 2469069, --10030896, 25077240, -7984344, -9614821, 9881109, -4596689, -15949361, 31830540, -848793, 4256313, --6781217, -10576894, -13658533, 17329120, -16597364, -5357435, 14087493, -43122008, -120503360, -99128384, -51227684, 14159433, 118231856, 211882544, 30799748, 66290136, 23603530, -170343232, -54419384, -115794464, --139828032, 3170760, 21411486, -58730456, 83249888, 109271488, 60945584, 174712288, 100379288, -23290534, --42439108, -82122992, -159248256, -125839320, -37679748, -112284944, -16345572, 95580736, 15283641, 21722334, -144758656, 73570640, 45144400, 151080304, 22599582, -42555608, 58552216, -80128520, -158189008, -66517232, --133572944, -166848736, -3173981, -35321812, -44481904, 110115448, 121291488, 77071040, 183387056, 147987392, -69406672, 62867048, 36066452, -123453464, -113726440, -143680080, -189709248, -152004256, -64444912, -44166760, -3559991, 108737832, 132098696, 138666784, 132798240, 123593592, 26701812, 3552475, -19709604, -91211144, --99941744, -53811108, -97657896, -22536768, 11902965, 1081258, 0, 0, 0, 0, -0, 0, 0, }, +2129230, 2378338, 6924561, -845035, 1109712, 818191, -422517, 3914863, 2948495, -5400922, +-3054796, -4917201, -2898566, -550830, -3492345, 56371, 377957, 250182, -486942, -312459, +-4798016, -762894, 1109175, 1853278, -2304787, 2971581, 912144, -2384244, -1576790, 545461, +2966749, -988379, -1027571, -1480153, -3993783, 802085, -5181878, -431644, -2572149, -2367064, +-1709397, 1088774, -1753420, -2943126, -2068027, -301721, -1503239, -4112431, -1752347, -1159104, +-1043140, -3055332, 427886, -1483374, 3561602, 711354, -4119411, -2372433, 5035849, -1497870, +1408212, -2736431, 1346472, 2304250, 2122251, -3716757, 1923072, 2672544, 1945620, -186831, +-2221572, -1426466, -2022393, 1388348, -625992, 1056562, -9175124, -10882910, 5218922, 67109, +8002598, 2720862, 3404835, 2065342, 3117610, -373662, -333934, -2141041, -5625334, -3409667, +1220308, -565862, -1209570, -944356, 2666101, 1928440, -171799, 2277943, -2623151, -6467147, +1763084, -1758252, 498216, -3469260, 2273648, -2908230, -1466195, -1364189, 4228932, -1396938, +-222801, -2204929, -675384, -5349919, 1512365, -1225139, 2527588, -2757906, 162135, -1519882, +-4145717, 855235, -543850, -1503239, 1636919, 2849711, -816581, -2461016, -5972689, 71404, +-3598109, 1136556, -61740, -2742337, -205085, -1475858, -925029, -4744328, 2622615, -4289599, +1965484, -2049773, -2591476, -2734284, -4584878, 1826972, 128312, 539555, 2581275, -3627637, +-4775467, 2138357, -15545097, 0, -1905355, 4300336, 266288, 1751273, -1105417, 2211908, +601832, 1949915, -1610613, 10295037, -1991791, -1286880, -4134443, 1597191, -5031018, -1555852, +632434, -2428804, 211527, 3848291, 2388539, 1535451, 2773475, 3733400, -4129074, -1568737, +198105, 2407329, -3860639, 4155918, -3171833, -1653026, 3561602, -518080, 1078574, -2487323, +3339337, 3227668, 3721589, -5082557, -1207423, 5670431, 312459, -761283, -848793, 6167573, +4393215, 4786204, 526670, -1030792, -944893, -266288, 360777, 758062, 2336999, -5823439, +12348, -2680060, -2902324, -394063, 1618666, -2993055, 1475858, -2271501, -143881, -876173, +702227, 2115808, 2738579, -969052, 253403, -1190780, -3687766, -844498, 5527623, 6513318, +-4220342, 752693, -3573950, 5986111, 1245004, -2208150, -3219078, -2815351, -450435, 928787, +1716376, 7911330, -4410395, -531502, -1643899, 3224984, -8437463, -804233, 5675263, 55835, +4799089, 2253784, 3886946, 4070555, 1861868, -532576, -3857954, 1561758, -941135, 745714, +6620692, 1858647, 5712844, -2651606, -1304060, 673773, -7209103, 1130113, 5757941, -1358283, +739271, -4355634, 3732327, 214748, 1794760, -5182952, 3479997, -3366718, -1793149, -3514894, +-4246649, 2961380, 1178969, -1090922, -2003065, -1791001, -1275068, -666257, 2924336, -2073932, +-4198868, -6573448, 6988449, 5587753, 761283, -6452115, 2707440, -2669322, 3432216, -1425392, +1270774, -3233574, -1790465, -4048544, -1263794, 2767570, 26732414, -9929428, 11976516, -9518184, +816581, 2838437, 2811056, -7860864, -2667175, -2645700, -13152800, -80531, 695785, -4751308, +-767189, -70330, 9403831, 1722819, -6560563, 4771172, 5228049, 1145683, 9532143, -7114077, +-2596845, -3817152, 2010045, 7604240, -558346, 444529, 2836289, -1407676, 3406446, 1494649, +8718247, -1369558, 3411278, -5774584, 5205501, -4067871, 5811091, -177704, -6103149, -996432, +8780524, -480499, 5933498, 3470871, 5703180, 395674, -4553739, -3812857, 68183, -2881923, +4669167, 2956011, -4684736, 461172, -3672197, 5999533, -1730335, 4745402, 5893232, 775778, +6069863, -588411, -3033858, -1367410, -3859028, -252866, 7962333, -5571110, -5273683, -2634426, +2152316, -2723546, -22313428, 2387465, -6603512, -4740034, -7236483, -8768713, 3393024, 7741142, +-1218697, 2976949, 1191853, 3947612, 866510, 237834, 2376191, -4828080, 11023570, -632434, +-6477348, 7202660, -2255395, 3023657, -7293928, -4575751, -5177046, 2168422, 1320166, 5622112, +142271, -3588982, 565325, -3211025, -3491809, -3903052, -1361505, -5410585, -2736431, 4929012, +-4664872, -386547, -3652870, -5735929, -2549600, 655519, 1802276, 3550864, -2876554, -2675228, +3548180, 571231, 1327145, 897648, 2192581, 3297461, -5449777, -1862942, -566399, -7657927, +2003602, -570157, 4443144, -4494684, -3436511, -4195110, 687732, 4716411, 3613678, 8340290, +5531918, -5133560, 1999307, -2292439, 3800509, 2547453, -5811091, -28714004, 7418483, -8818642, +-7410966, -5429913, 587874, -1837172, 16330539, 1283122, 3624953, -2223183, -308701, -7221988, +6437619, 1627256, -1370632, 1005559, 8513699, -4820027, -1923609, 1687922, 228170, 4097936, +-4278861, -2117956, 4511327, 1429687, 4120484, 165356, -5203353, -3521336, 2295660, -850940, +-2044941, -3384434, -2151242, -591095, 8003672, 1729261, -1957968, -229781, 184147, -2972654, +5628555, 4225711, -1900523, -6815040, 1137093, -3824132, 5311264, 4029753, -4980552, 1283122, +-6317360, -5690832, -5065914, -6249715, -2488397, 726923, -3966939, -283468, -4337917, -3832722, +6116034, 3585224, -6193343, -8319889, 288300, 5710696, -5590974, -4590247, 4879083, 3294240, +5625871, -15015743, -1568737, 2431488, 7168301, -1492501, -3900367, 1627793, 10570451, -13507672, +3012920, -2792803, -2600066, -6110665, 3527242, -10825465, -7121056, 3650185, -5743982, 3358665, +15226196, -2756832, 6083285, -7252053, 7288560, -1956895, 2087891, -6497212, 2898029, 1817845, +-3593277, 1511292, -825707, -3336116, -348966, 4212826, 6477348, -5166309, -8376797, -6524056, +-6183143, 804233, 4715874, 12857521, -273267, 8675297, 8899172, -8352638, 6332393, -12296491, +-4635344, 842887, -5609764, -5049271, 3311957, -11878806, -2471217, 8409546, -3691525, -3029563, +1003949, -3543348, 3315178, -3503620, 5759015, 7670812, -2153389, 2487323, 261456, -7475391, +618475, -4767414, -3433290, -5835250, 3400004, 2873333, -5888937, 1001264, 3106872, 35542464, +-1558536, -13825500, -1609002, -438087, 1476395, 4640712, 1945083, -1430761, -1335198, -6849399, +-3229279, 4154844, 8744017, -6873559, -4368519, 5989869, 547071, -1853278, 2379412, -333397, +-8146479, -8114804, 11408507, -816044, -694711, -1650341, 5852967, -198105, 615254, 3977140, +-6243809, 6871411, 2712809, 1347546, 2468533, 6878390, -15955267, -6828461, -3961034, 14918569, +1766305, 1384053, -4656819, -4673462, 4199941, -363998, 4864051, -1509681, -10401337, 1388885, +945430, -1235340, 4589173, 2516851, 926639, 8413841, 19313932, -1266479, -2208150, 7825431, +1663226, -2049236, 4441533, 15663746, -2593624, 3202972, 4537096, 4709969, 2744484, 4278861, +2999498, 3644280, -6125697, 6131066, 8011188, -2915746, 6999186, 7818451, -10280541, -3066070, +-8758512, 8397735, 15787226, -7750806, -1968169, -8868034, -3993783, -10700911, 7370164, -6561637, +-2833068, -763967, -132607, -4291209, -5412733, 9462887, -8868571, -3245922, 755377, 6455873, +6697465, -9997073, -3179350, 3807489, -8829379, 4854387, -7066832, -2774012, 2227478, 207232, +-4007205, -1017370, 1750736, 11161546, 1068910, 2554432, -315680, -9466645, 10070625, -5037460, +-8139500, 6318434, -5912023, -6199786, 7832410, -3604015, 671089, -1694365, 709743, 10908680, +-2250026, 2565169, -9842991, -573378, 10530186, 2637647, 10412074, 9507447, -3535295, -2157684, +-13131863, 2187212, -2635499, 8649527, 9739375, -5610301, 2011118, -18250926, -5636071, 6489696, +-6970732, 9936407, 6554657, -7991861, 2947421, -7468948, -663572, -10144713, 17063368, -4840428, +1328219, -5206574, -15220827, 9002788, 3303367, -11382737, 7318625, -5070209, -3607236, 4126390, +16201154, -7880728, 15665356, -210453, -10626823, 544387, 3845070, -9469329, 10788421, -5454609, +8060580, 17041894, 1922535, -7861938, -1946157, -845035, 4173098, -6688875, -3389266, -862752, +8669928, -2945274, -3042984, -11074573, -47245, -13106630, -2077154, 14905147, -2979634, 8490077, +1181653, 2268817, -19110456, 268972, -12064563, 10048613, 17920752, 5379984, 4860829, 1065152, +3119220, -10222022, 4129611, 5412733, -3962107, -1311039, -3393561, -2607582, 8577050, 136902, +10341208, 29250338, 11601780, 2914135, -8968429, -9295383, -4631586, 5975910, -7492034, -4449586, +29820494, -17353278, -1225139, -9020505, -16296180, -21516176, 4976257, -7442105, 5319854, -20413980, +3092377, 6185290, 5539434, -9048422, -18748606, -14991583, -12645457, -670015, -7661148, -13962402, +-9773735, -5425618, -11453604, -8316131, 1061394, 12714714, -1084479, 1092532, -1209033, -12765717, +6623914, -1927367, 1444183, -3503083, -8587250, 5872831, -10522670, -14591078, 11643656, -14250701, +1989107, -952946, -19449760, -12057047, 6720550, -1153736, 8431558, -6815040, -20551418, -876710, +133144, 6669548, 7428146, 17894982, -11309186, -39182988, -13902809, -13827110, 8191577, -25728464, +-8833137, -4819490, -23254026, -8241506, -617402, -4893042, -4442607, 4581657, -6213207, -845572, +-5681168, 5296769, -13160317, 5131949, 11555610, -12300786, -17294760, 7419019, 9229348, -2547453, +-2919504, -8489003, -9225590, 22854594, 8769249, -20735028, 7874286, -11188927, -463320, -10168335, +-20941724, 6562710, -10560251, -4522064, 1629940, 797790, -4727149, -18136574, -10519449, 9080098, +-10352482, -221191, -9018358, -15147276, -4985384, 16925392, 3689377, 3017752, -13697724, -4954245, +-1938641, -1962800, 7114077, 7332583, 10725607, 11713986, -4526896, 6530498, 3627637, -6979322, +5552856, -11652783, -8558796, -8853538, 5228586, -10226854, 2063732, -15285789, -11490111, -7099581, +17311940, 11789148, 13677323, 12639015, -10032507, 15892990, 2638721, 7032472, 24696598, -5167383, +-1741072, 3043521, -8236674, 3769371, -2281702, -14751065, 4893579, 10508174, -10067403, -10691247, +2306398, 10951093, -5041218, -8860518, -20164872, 22266722, -18059800, 23069344, 12751221, 8551280, +4647155, 8830990, 9633075, 8866423, 24823838, -9210557, 1400159, -2078227, -4727686, -1163936, +2741800, -2745558, 4461934, -2045478, 7491497, 6194417, -1814624, -4789963, -25516400, -9381282, +-18624588, -1283658, 9192304, 9237938, 2662343, 4473746, 6812892, 5508296, 6581501, 17500918, +26382374, 17498234, 3171297, -3930432, -5654862, -8238821, 8902393, 9006546, 10219875, -8548596, +-6801081, -10488310, -2171106, 12450036, -431644, 15014669, -10083509, 7707319, 4445291, 13339095, +-30034170, -21813066, -9299678, -12625593, -12806519, 2759517, -5706401, 17566416, 4657355, -21640192, +-2609193, 32263258, -12252468, 9167608, -6157373, 12302397, -7639136, -5838471, -862752, -14925548, +-7694971, 11576547, 4799626, 8429947, 22657026, 1550483, 14985141, 22151830, 15215459, -10634339, +-23426362, -1187022, -11013370, 24349780, 6649146, 18939732, -3248606, -10766946, -4312684, -11706470, +3968013, -9092446, 545998, -10077067, 4536023, -7458211, -3499862, -15938087, -15957414, -1888712, +-22640384, 11757473, 7800198, -6955163, 10770704, -5718212, 3843459, 12283606, -14545980, -18626200, +2678449, -4294431, 30166240, 12790949, -34357592, -9372692, -10198937, -17653926, -19065896, -37921340, +5998996, -13702556, -4203699, 5242545, 686121, 7634305, -2203855, -4550518, -29310468, 3357591, +-13754096, 3528316, 15960098, 3615826, 10399726, -16849156, -23488102, 4860293, 13065827, 9880035, +4239133, 9624485, 13442711, 19195820, 17467632, 40411884, 26544508, 37056440, 2005213, -7800735, +-25876642, -7872138, 3805341, 5545877, -6529961, -20009178, -7585986, 32011464, 12881681, -4807679, +9396315, -1055488, -12416214, -3790309, -8303783, 21747030, -2261300, 988916, 8935143, 325881, +10197863, -407485, 14665703, -14363981, 16971026, 3281892, -8882529, -5248450, -9791989, 15629386, +-22771916, -24082418, 14296872, 24618752, 380105, 16909824, 22813256, -26889716, 8000451, 5160403, +-2356863, -522375, 3015067, -10272488, 17575544, -11550241, -9982041, 7202124, -139050, -2315524, +-5459977, -5861557, 1467268, -17904644, -6548752, 13814762, -18710488, -4357781, -13181255, 51540, +33508262, -11446088, 529892, 8923868, -1731946, -8610873, -24067386, 20780662, 7484518, -45023068, +7757248, 9016747, -18375480, -43844636, 38738456, 23026394, 12186433, 8513699, 19065360, -44261784, +17963700, 20193326, 8574365, -28413894, 15556372, 28346784, 13068512, 31262530, 11311333, 312996, +-1427540, -1230508, -5550709, 13070659, 22155588, 21008296, 7224672, -6857989, -11345156, 2312303, +-10370199, -12215961, 12176232, 8152922, 2067490, -12318503, -11877732, -3034395, -10400263, 4571993, +25301652, -5173288, -8744553, 8006893, 4179003, 6876243, 8448738, -2784213, -5766531, 19739670, +13020730, 5739150, 8402567, -2794413, -21306796, 3492345, 12783970, 343061, -16253767, 18820010, +4226248, 26585848, -191126, 23439784, 1312649, -10829760, -4353486, 3249680, 34479460, -8033200, +10829223, 4770098, 14468134, 3712462, -3342022, -8158827, 6584185, 41151156, -5718212, -5542119, +-27847494, 31870804, 143881, 28300076, 1284732, 2560874, -24501714, -7009924, -10718091, 19890530, +5432060, 9235253, 5605469, -18509162, 2430415, 2319819, -16411607, -23426362, -24256902, 9193914, +-8726837, 23374286, 1753957, -6302328, -5412196, 5730023, -8306467, 2341831, 7014219, -8579734, +5714991, 8523363, 2959769, 3114925, 17403208, 29632054, -5284958, 751082, 14717779, 12793097, +17546552, -11784853, -4746476, 6232535, -16906066, 2726231, 1720134, -21715354, 29575682, -355409, +15006079, 13896367, 9133248, -16218333, 1774895, 15939161, -11946988, 27498528, 7315940, -8498667, +21841520, 17572322, 11471858, -35582732, -7515119, 8392366, -12618614, 2994129, -20613696, -4229469, +-31238370, -8213051, -5055177, -8382166, -34825204, -4414690, -9382356, 37820408, 18111340, 16165720, +12542915, -5589900, 8589398, 19696184, 19024020, 9568650, -18556406, -21756156, 12586939, -1174137, +9645423, -2269353, 22216256, -12970264, -1155346, -3066070, 19609746, -11111617, 32894618, 40212168, +40741524, 4567161, -5270999, 8487929, -3126736, 11691975, 249108, 1990717, -9478993, -28932510, +-8496519, -27608050, 18966038, 18323942, -16531866, -11526082, -16593069, -6376416, -843424, 42908872, +2277943, -18509698, -20512764, 890669, 30195768, 15817828, -55268712, -9413495, -8371965, 9697499, +23099944, -22582938, -6204617, -12605192, 8068096, -31694174, 18339510, -3613678, 704912, 11304891, +2772938, -14742475, 34609384, -1715303, 16966732, 37078988, 74048456, 44902272, -557809, 25115358, +37250788, 47551732, 50864224, 12671227, 27404038, 10897943, -5196911, -14398341, 20973400, -21842594, +41923712, -2866354, -5033702, 2497524, 33960844, -19430968, -1347009, 718333, 2880313, 13060996, +-5669894, 18074832, 8338679, -1662152, 6506876, 3289408, 15744276, -38491496, -9743133, 37044, +7104950, -2752000, -26040924, 24925842, 1738388, 4297652, 11770895, -17965848, -5387500, -43039332, +14977088, -9489730, 11862163, 32789928, -5245229, 7350837, -461709, 15823196, -22429392, -34661996, +34678104, -2566243, 6729677, 5413807, 35171488, 22617834, 31266826, -511101, -31295280, 21123722, +14857902, -8835821, -7612293, 19857782, 1648731, 25055766, 48322140, 32212792, 11722576, 1731409, +37968584, -7631620, 16725140, 24136106, -9872519, 27827630, 26933740, 8189429, -11311333, -13280576, +-16461536, -2871186, -1857573, -55399172, 12306155, -9322227, -2541010, 42928736, 18095234, -13602698, +-10924249, -211527, -28372554, -34132640, 2332167, 348966, -19805168, 20484846, 1827509, -19545860, +11764989, 37260452, -5696201, -21083458, 12629351, -12250857, -14522895, 7293392, 29225104, -9359807, +3493419, 8752070, -10241350, -21839908, -15707232, 30346628, 9400073, -28599650, 23957864, 10600516, +-21233782, -9649718, 40066676, -12502113, -32934346, -15271293, 53544820, -53066468, -26470420, 33317136, +-15970836, -16139413, -53092240, 41636488, -34591128, 13315472, 104153, -4600447, -59955060, -15509127, +48132088, 33295660, -41248328, -8823473, -18971944, -5971079, 6105296, 13074417, 10922639, -66486092, +35508104, 31317828, 28064926, 2888903, 13547937, -31603980, -32279900, 59446104, 22142704, -45158896, +8211978, 57163868, 18069464, 6461779, 1851668, 4643934, 24647206, 33743412, -7360500, 6630893, +8881992, -5331665, 20360830, -10184441, -2622078, -7591892, 15670725, 11926587, -6116571, 11013907, +-14971719, -11878269, 15606301, -9439801, 17118130, -10811506, -4882304, 179315, 9398462, -55835, +7010461, 3331821, 17372606, -11810623, -2392297, 869194, -6809134, 17262548, 14521821, -11361262, +-4208531, -6737193, 3854733, -14797773, 8326331, 5402532, 7628399, -5502927, -4703526, 19670414, +-22861038, -3249680, 9576166, -5473936, -4216048, 10674604, -28123982, 7535520, -10237055, 2469069, +-10030896, 25077240, -7984344, -9614821, 9881109, -4596689, -15949361, 31830540, -848793, 4256313, +-6781217, -10576894, -13658533, 17329120, -16597364, -5357435, 14087493, -43122008, -120503360, -99128384, +51227684, 14159433, 118231856, 211882544, 30799748, 66290136, 23603530, -170343232, -54419384, -115794464, +-139828032, 3170760, 21411486, -58730456, 83249888, 109271488, 60945584, 174712288, 100379288, -23290534, +-42439108, -82122992, -159248256, -125839320, -37679748, -112284944, -16345572, 95580736, 15283641, 21722334, +144758656, 73570640, 45144400, 151080304, 22599582, -42555608, 58552216, -80128520, -158189008, -66517232, +-133572944, -166848736, -3173981, -35321812, -44481904, 110115448, 121291488, 77071040, 183387056, 147987392, +69406672, 62867048, 36066452, -123453464, -113726440, -143680080, -189709248, -152004256, -64444912, -44166760, +3559991, 108737832, 132098696, 138666784, 132798240, 123593592, 26701812, 3552475, -19709604, -91211144, +-99941744, -53811108, -97657896, -22536768, 11902965, 1081258, 0, 0, 0, 0, +0, 0, 0, }, { -713501, -1232656, 3558381, 4639639, 60666, -2546379, 3241627, 1820529, 3834869, 4727686, -1896765, --543850, -3818226, 2133525, 667331, -1609002, -4565014, 1530082, 2323577, 3124589, 180389, --4326643, -2462627, 2504503, -2974265, 2615635, -644245, 876173, 1027034, 984084, -4387846, -1372779, 1608465, -3016141, -5083094, -4860829, 263604, 388158, 1000191, -291521, 37581, --1410360, 2350958, -417149, 2052458, -3111704, -389768, 3265786, 6025302, 472446, -126702, -781684, 3526705, 2279017, -4315369, 1129576, 2113661, 1340567, 10737, 2299955, 2078227, -1320166, 1343788, 825171, -1111323, -2521146, 3261491, 1413044, -2014877, -386547, -1651415, -2185065, -43487, -1498944, 1830193, 1222455, 899259, -10684268, -12977781, 6375879, -2462627, -5558762, -2923262, -3002719, -5858336, 1235340, 1121523, -381715, -3221, -772020, -4497368, --641024, -2609730, -3027952, -2833605, -240518, 244813, -357019, -579284, 2043868, -687195, --6805376, 4066797, 1914482, -2344515, 516470, -136902, -81068, 866510, 4127464, -2452963, -94489, -7612830, 3600793, 683437, 1533840, 2553895, 4071092, -2422899, -1975685, -906238, --3973382, 259846, -752156, 3241090, -1949915, -260919, -2027225, -2136746, 3802120, -3038689, --1656247, 353798, -2939368, 2266669, -312996, -1294396, 2253784, 4530654, 59056, -173409, --870268, 3886409, -4095788, 51003, -857383, 2052458, -1218697, -1736777, 3925600, -49392, -560493, -1182190, -15477452, 2473364, 1681480, 5240934, -2238215, 1490354, 6124624, -2563559, -1582159, -3937411, -5692979, 1890859, -3914863, -4474282, -4464082, 1154809, 1532230, -7558606, -4230543, 2728378, -1381369, -2871723, 1611150, -837519, -1807108, 369367, 2333778, 1644973, -3799972, 582505, -1314797, 3857954, -2151242, 8621073, 1860258, 5237713, 1967632, 4568235, -1995012, 3085397, 1650341, 193274, 55835, 6457484, 1000727, -1277753, 309238, 3303904, -2470680, 163746, -436476, -1594507, 600222, 7894687, 2183454, 3517041, -4079682, -2266669, --4300873, -2872796, -4187593, 2756295, 1729261, -2842195, -2019172, 1525250, -2117956, 1722819, --1120987, -922344, -3021510, -5020280, 1749125, -7973070, -1385664, -2021856, 8812736, 12074227, --3468186, 3373160, -5732171, -140660, 534723, 15375983, -1371168, -3845606, -6366752, 324807, -4551592, 7165079, -1385127, -9006010, -2445447, -3327526, -2308545, 3291019, -471910, 6011344, -856846, -3131031, -7213398, 2399813, -481573, 1898376, -676457, 1012539, 3862249, 1509681, --9110163, 1300838, 6244883, 3132642, 981937, 1617055, -1250372, 4343286, -5264020, -357556, -4822712, -2959233, 277562, 7585986, -3131568, -163209, -2209224, 4742181, -4476967, -3363496, -2543158, -4773856, -2105071, 6656663, 4161287, -5579163, -1746978, -670552, -1026497, -2435783, -2509335, -2063732, 2845953, 121333, 857920, 1227287, 5425081, -383863, 7322919, 3621194, --4508105, -2283849, -1812476, 4027606, 1824287, -49929, 28144920, -10735271, 5516886, -8257612, --1074816, 34897, -825171, -4495220, 2085207, 3017752, 554588, -3339337, -6816113, -498216, -3780645, 2602213, -3129421, -5206574, -635655, 4177930, 7863012, -4627291, -822486, -3558917, --7322919, 530965, -3799436, 1886564, -2872796, 5246840, -9910637, 6265284, -659278, -6036577, -1174674, 2149094, -910533, -3333432, -37044, 7285339, -510027, 955630, -1292248, 2601140, -1116155, -2091649, -3060164, -6536940, 3822521, -1624035, -2041720, 2062658, -163209, -10807748, -7841000, -11620571, -6693170, -8352101, 1533840, -1332514, 4604205, -3034931, 2377265, -5257040, -2157147, -1751810, -2099702, -5845988, 3129958, 3110093, 6288369, -2270964, -665720, 856309, --1959579, -371515, -22382686, 2310156, 243739, -1868848, -3454228, 3958349, -3045132, 2653216, --818728, 12348, 3599183, 4771709, -2928631, 3535295, -1049583, -1845762, -6328098, -233539, --8542690, -6152541, 7409356, 2752537, -2965138, -966905, -957778, 5282273, 2645163, -2565169, -4626754, 3252364, 1741609, 1747515, 1888712, 3718368, 2963528, 3180960, 8205535, 7645579, -3085397, 964757, -5368709, 5917391, -7906498, 1666447, -2357400, 6407555, -4946192, -5989869, -10309532, -2303713, -5920076, -4883378, 7566659, 4986457, -24696, 4206384, 5361193, 2787434, -8850854, -374736, -1859721, 5411122, 2757369, 490163, -277562, -4609574, 2344515, 3186866, -6856916, 3236795, 3988414, -2626909, -4527970, -7818451, -2563559, -30273614, 7591892, -6803228, --9833864, -9754408, 5376226, -7359964, 4708358, -9138617, 4391067, 3626026, 2126009, -9611063, -5885179, -585726, 3419331, -8058970, 3852586, 8472360, 6490770, -251256, -3564823, 752693, --2283849, -10180146, -2298344, -5170604, 1877438, -6614787, 4892505, 4572530, -2342368, -782758, -6870337, -2144263, 4568772, -4502737, -6557342, 2668249, -396748, 2767570, 8556112, 4754529, --599685, -16043313, -7646116, -2794950, 1888712, -3044595, 8246337, -14077829, 4010963, 1100585, --346819, 3455301, -1930588, 5733782, -14209362, -7345468, 5276368, -14930917, -2750927, 5712844, -2247879, -4026532, -9480603, 2529736, 6038187, 3430068, -1650341, -10967736, -730144, -1124208, --840203, -13679471, 1863479, 2704756, 11337103, -10011569, 12341052, 3786014, -641561, -2428804, --974958, 1515587, -8465917, -1268626, 3121368, -2461016, -4851166, -957778, 8601209, -8131984, --1575179, 9054328, 325881, -2934537, 3313567, -3693135, 6604049, 3282429, 195421, 3680250, --3397856, -5245766, -142271, 992674, 5002027, -9565429, -5196374, -3883724, -2862596, -2392834, --2802466, 2153389, 768262, 1500017, -7289097, -7084012, -5888400, 935229, -9431211, -4625143, -6111202, -3160559, 1588064, 1431298, 132070, 3280281, 3782793, 4185983, 4259534, 6680822, --636729, 7208566, 12348, 4209605, -67109, -2829310, 268435, -5173825, 4544076, -6147709, -7688529, -6861211, 670552, -6902550, 1801739, -6589017, -7117298, 6898791, 11481521, 39616240, -1055488, -10672994, 2364916, -5531381, 16155519, -1970316, 4975720, 1712618, 1355062, -13103408, --6404870, 8153459, 7272454, -10208064, -1281511, 238371, 10205916, 5280126, 4269198, 9965398, -2103997, 1177358, 8791798, -2295660, -11797738, 2396592, 10145250, 6184216, -2954938, 745177, -7278896, 4596689, 2469069, 199179, -6311455, 3946538, -6915434, 1307281, -13604309, 4296041, -5085778, -605054, -5876052, 9618042, 5476084, -1329292, 7771207, 3802120, -5214627, 11436961, -1919850, -3309272, 3289408, 11713986, 2517388, 262530, -8514236, -4882304, 2129230, 4335233, -13573170, -3644817, -4160750, 1651952, 7864085, -3941706, -4552129, 42413, 10266046, 7147900, --1222455, -6595459, 776315, 8530879, -2079838, 16925930, 8275328, 4159676, -14418205, -1947768, --7571491, 13447006, -5801427, 6011344, 664109, 8254927, 2853469, 826781, -1321239, 3091840, --4603668, -6369974, -17041356, -12579959, 3375844, 10385768, 13852343, -5747203, -7749732, -6631967, -2559801, -3802657, -1429150, -959388, 1251446, 1848983, 8969502, -5506685, 180926, 2053531, -3987877, -5002563, -4233764, -8033737, -6009196, -5678484, -9986336, -23622320, -1073205, -3387656, --10851772, 2008434, -1967632, -12890271, 3401077, -10948409, 1882269, -1496259, -1771137, 5274757, -6144488, -356482, -11407970, 2950643, -7533910, -7364795, 9092983, 9017284, 9135932, -3376381, -592169, 1311039, -6273337, 794569, -3626563, 15923591, -3816079, -1589675, -2821794, -47245, --11008538, -12022687, 4591320, -15224585, 5720897, 1897302, 16225313, -10836739, -6038187, -3601867, -8739185, -8234526, -7758322, 7109245, 4962298, -8359617, -8213588, -8271570, -18188112, 11993696, -11538967, 11924977, -4944044, 3695283, 12168716, -17395154, 290984, 11206107, 10801843, 4620311, -280247, -5698348, 1484448, -2848637, -14596983, 1693291, 4469451, 1974074, 10311680, -8977019, -1364189, -16589311, -1622961, 2949032, -8494908, 3168612, 3264175, 6980933, 9469866, 12074764, --1966558, -5252745, -14384919, -11107322, 5279052, 21598316, -6139119, -1385127, -9407589, -5886790, --7252589, 4196720, 5749351, -2294050, 1664300, -16784196, -1095754, 10181757, -7573638, -8376260, -7747584, -3858491, 10923176, 1213865, -5264020, -309775, -8433168, -5105106, 81068, -9881646, -21577916, -11212549, -5960878, -826781, -1114544, -15979963, 614717, -11870216, 7908646, -21968758, --3536369, -7288023, 6973953, -7813620, -7864085, -18651432, 11908334, -7900056, 4657892, -6268505, -3278134, 9326521, -7468412, -12373264, -4431333, 7791071, 16589848, 5056787, 6701760, 430570, --17546016, -9587441, -9659381, -5171678, 2559801, 15091978, 6248641, 8600672, 8028368, -2824478, --4075924, -5683316, -14784351, 303869, -10471130, 15009837, -7582228, 10170483, 1776506, -6106907, -3052111, -4259534, -5399311, -9004936, 12164421, 2745558, 20917564, 4089883, -23775328, -6428493, -6765111, 5326297, 2686502, -2055142, 1300838, 23423142, 11298985, -4974109, 1701344, -7490423, -16528645, -1748052, -1918240, 5626944, -17147656, -7981660, -13616120, 7778723, 17666274, -1989107, --1006633, -644245, 16402480, 4922033, 3754875, 2610266, 1732482, 2596845, -6789270, 986769, --20847234, 2721936, -10169946, 8373576, 20839182, -2978023, 1294396, -16871168, 21978422, 10536629, -9196062, -3009698, -12466679, 1227824, -4419522, 11031623, 7834021, -10346576, 282394, 5704791, -3944391, -8063801, -7208566, 32312112, -7821673, -5919002, 6586333, -8531416, -6329171, 10111427, -9849434, 162135, 3601330, 3450469, -12913356, -6501507, -862752, 4065187, 10692321, 2504503, -2247879, -14448807, -1722819, 3994320, -19831474, 4066260, -5838471, -2139968, -4056060, 5557151, --6300717, -10675678, -11860015, -17934710, 1582696, -7265474, -4284230, 11487427, -4875325, 3936338, --21514564, 617938, 15771120, -10256919, -10306311, 24613384, -14685030, 3886409, -9386114, 29026462, -6163278, 5426691, -9257265, -10876468, 1052804, 8366060, -8888972, -14059039, -8429410, -20478404, --8040179, -11964168, -41876, -27536110, 1915019, 15146202, 9205189, 12422656, -8581882, 3380676, -13274133, -1340030, 9615358, 3807489, 15002321, -7304129, 12505871, 10232223, 7096897, 16576426, --9157944, 10012643, -5017059, -5462662, -3874061, 3961571, -31620086, -9714679, -19660212, 23154168, --14341970, -15716359, -3469797, 13322452, 357556, -5244692, 17890150, -5809480, -5647345, -12345347, --31919660, 2239826, 3027952, 14070313, -13318157, 861141, -8056285, -9879499, 17246442, -2462627, -8773008, -17498234, -17805860, -10088341, 14650670, -151934, -8436926, -8146479, 548145, -12429635, --640487, 15389942, 1523640, -5348845, 7641284, -13464722, 25177098, 15659988, -752693, -12288438, --13937706, 5064304, -3977677, -1693291, -1335198, 23024246, -12181064, -34360, -8680666, 8190503, --15266461, -13838385, -27022324, 5666136, -11394548, -15244450, -2506114, -25476136, -13020193, 6661495, -4618701, -3838627, 12308303, 826244, 15061377, -7361037, -22555558, -3681324, -16744467, -3403225, --5592048, -21242908, 1918777, 16687559, -48766132, 5747203, -732829, 11576547, -3252901, -15220290, --29340532, 11052025, -4413079, 10322954, 5397700, -3728569, 15621333, -20897700, 27936614, -7497939, -15101642, 33553896, 12429635, 23822572, 8321499, 6109054, -4451734, 12367358, -5878200, -13306882, --18930606, -11583527, -1763084, 9822053, -2447595, 41070624, 33576980, 30345018, -6126771, 758599, --24574192, 19525996, 23966454, 8654896, 23159000, 9730248, 8253854, 8654359, -3416110, 3868155, -6800544, -4993973, -23730768, -13964549, -367757, -15341086, -18279380, -43342124, 10201084, 8442832, -11994233, -7624641, -2546379, -5031554, 768262, -12948253, 44560, -9646497, 12643847, 11060078, --5900212, -7654706, -22891638, 40126804, -11878269, 8679055, 326418, 3479997, 6576669, -15233712, -19843822, -8868571, 6947647, 5393942, -14376866, -14024679, -2590402, -265751, 9240085, 42453604, --3346317, 7248294, 1429150, 13596793, 8874476, 10435160, -7399155, -1023276, 3389803, -18823768, -3745748, -15924665, -27828166, 10721849, 121870, 3357591, -21136608, -46938624, 19027778, 22792318, -11884175, -25841208, -23998666, -47596828, 38950520, 6023692, 6659347, -16041166, -11658689, -50603304, -13594645, 35717484, 10714333, -32140314, -16273094, 4915590, -12737799, -8133058, 14416058, -16844862, -8930311, 8021389, 6499360, -18715856, 6255620, 5477694, -9016210, -17524540, -10358387, -6889665, --4827007, -16724603, -14578193, -8056285, -17361332, 13178033, -6706055, -22180822, -7937637, 13226889, --3143379, -15460272, -8735963, -8015483, -410169, -12321187, -7631083, -20259898, -19345070, 7801808, --7105487, 24631638, 16048682, 1268626, 14547054, -22172768, 13767518, -21110302, 17071422, -3452080, -8585640, -9775882, 30604864, -8347269, 17020418, -5194763, 25148644, 9302899, 5930276, -27404576, -28223304, 21281562, 9706626, 8581882, -20646444, -6754373, 8263517, 9386651, -3826279, -6298570, --30620970, 30246770, -1010391, 15669114, -15841450, -3632469, -2194192, -1972464, -1894618, 18583786, -2838437, -11363410, 13329968, 4119411, 10302553, 16080894, 16396038, 2962991, -9626632, 51760800, --11115912, 40321152, 2798708, 4512937, -19033684, -7197292, 6149857, 20685636, 11725261, -3745212, -17741436, 5344013, -18168786, 5760088, 5767604, 23739894, 1964948, 15144055, -13015898, 2323577, -17359720, 9557376, 15036681, 34576096, 28752658, -1647120, 16383690, 389231, 28399934, -17896592, -20057498, 9345849, 2290291, 17706540, -4721243, 42010684, -3432216, 21660594, -10871636, -10118943, -4245575, 44746580, 17413408, -36246840, 38470024, 2158221, 16178605, -26481158, 14268418, 6416681, --54393612, 27832462, 49884436, 20417738, -13502303, -8763344, 15642808, 42370388, 10035191, 11850889, -7774428, -8734353, -4330938, -15661061, 20325396, 3478387, 13525926, -10449119, 27028230, -8996346, -12565464, 4702453, 5551245, 4518306, 2257542, -27659590, -16523813, 822486, 2356327, 20007568, -15700790, -22320408, 2048163, -11922292, -11895449, 6511171, 1005022, -7028714, 9062381, 38224672, --25263534, -1003949, 56544320, -33761664, 3426847, 21470542, -11205570, -7290707, 11031623, 20023138, --21418466, 11353209, -38213396, -2716030, 54508504, 3796214, 14594836, -4451197, 29118268, 32015760, --9788767, 1038845, -15899969, 5156645, -12277164, -25388088, -19193136, -30552250, -25807384, 37820944, -12312061, 12554726, 45458472, -31952410, -22764400, 8109972, 14875619, -11324755, 5186710, -12378096, -22287660, 17451526, 3881577, 19770808, 61022360, 6657736, -6986838, -15814070, 14712410, -3089155, -32337882, -27515172, 8199093, -1100049, -8118562, -7333120, -3091840, 10560788, 6950331, 7481296, --463856, 18486612, 4127464, -21977884, -16994112, -1532230, -9532143, -12229919, 4105452, 15462419, --926102, -2324651, -19897510, 11329050, -2228014, 22494354, -6157373, -40399000, 6246493, -11278584, --5035313, 1061931, -32343788, -16649978, -27588722, 1535451, -827318, -7067369, -36879272, -14493904, --2012729, 21003464, 23420994, 2827699, 3074660, 11815992, 3868155, -25154550, 24466282, 32407138, --12083354, 5836324, -12060805, 6765647, 1506460, 24974698, -25103546, -18325552, -59506772, -20638928, -17296908, 25746718, 19535122, 16916802, -12971338, -4198331, 14558329, 12192875, 29236380, 12205760, -14436996, 16616692, 6793028, -48041892, 21561272, -13609141, 2771865, 35948340, 30102352, -10468983, --4006668, 19092204, -10333691, -10624138, -8977555, 3606162, -2566243, -90731, 4951561, -2580739, -17947594, 42275364, -16571594, -30767536, 32763622, -23492934, -6038187, 1656247, 40660456, 4559645, --11485279, 13291850, 11746736, -40291624, -11743514, 8532489, -1096290, -18191334, -1002338, 9620727, --61027728, -26622892, 30878130, -28425168, -33389076, -18854370, 25208774, -30206504, -50285476, 53121228, --14765561, -29538638, -1694365, 22344568, -19411642, -31595390, -852014, 18343268, -1868311, -41035728, -10129143, 2535105, -20069308, 49692236, 43031276, 413927, -18513456, -30275224, 52041044, 11858942, -7892003, 23300734, -15159087, -45977624, 20185272, 45679124, 26869852, -12450573, 3253975, -49767932, -6580427, 48853104, 27060442, 7685307, 386010, -7677254, 13442711, -15894600, 40757628, -2055142, -11609297, 15659451, -12662637, 1506997, -702764, -14176076, 972273, 6715182, 23341000, 888521, --12788802, 7845832, 19005768, -2004676, 29514478, -21125870, 5699422, 7374996, 8521215, 25623238, --12394202, 3137474, 197032, -31212602, 5715528, -9555228, -16418049, 8489003, -5507222, 26257282, -19427748, -12294881, -27624156, 14681272, 4052302, 6755984, 17412872, 36078800, -4656282, 8258149, --12884365, 21134998, 15837155, 16058883, -15252503, 24080808, -6372658, -9052717, -18556406, -771484, --6237903, 30931818, -20397336, 2698313, 9429064, -5682779, -11326903, 42908332, 762357, 11212549, --759136, 6574521, 435939, 13864691, 4226785, -321586, 15974057, -45090716, -125306744, -119127896, -50711752, 4373351, 113089712, 240564336, 52023864, 96584152, 51048908, -179543056, -80914496, -120932856, --177569520, -12421045, 20023674, -84041232, 73319920, 125690608, 76395656, 216861488, 132497056, 739808, --21040508, -77377592, -192943360, -155971200, -67986648, -147741504, -44455596, 83851720, 24038396, 20968568, -198094624, 76493904, 47467440, 183994256, 7677791, -9571871, 83896816, -42530912, -153009280, -73740832, --152907808, -221903248, -25665114, -100833488, -83349208, 70953400, 136555808, 63708860, 242152944, 193902736, -111284752, 147360864, 48788144, -71893992, -112257560, -147853168, -238436720, -189816080, -128677224, -108103792, --34723200, 83632144, 124881544, 141281344, 187714768, 160256512, 74254080, 29701310, 41678900, -59262496, --94543504, -61268244, -134350864, -72863048, -1661616, -9522479, 0, 0, 0, 0, -0, 0, 0, }, +1232656, 3558381, 4639639, 60666, -2546379, 3241627, 1820529, 3834869, 4727686, -1896765, +-543850, -3818226, 2133525, 667331, -1609002, -4565014, 1530082, 2323577, 3124589, 180389, +-4326643, -2462627, 2504503, -2974265, 2615635, -644245, 876173, 1027034, 984084, -4387846, +1372779, 1608465, -3016141, -5083094, -4860829, 263604, 388158, 1000191, -291521, 37581, +-1410360, 2350958, -417149, 2052458, -3111704, -389768, 3265786, 6025302, 472446, -126702, +781684, 3526705, 2279017, -4315369, 1129576, 2113661, 1340567, 10737, 2299955, 2078227, +1320166, 1343788, 825171, -1111323, -2521146, 3261491, 1413044, -2014877, -386547, -1651415, +2185065, -43487, -1498944, 1830193, 1222455, 899259, -10684268, -12977781, 6375879, -2462627, +5558762, -2923262, -3002719, -5858336, 1235340, 1121523, -381715, -3221, -772020, -4497368, +-641024, -2609730, -3027952, -2833605, -240518, 244813, -357019, -579284, 2043868, -687195, +-6805376, 4066797, 1914482, -2344515, 516470, -136902, -81068, 866510, 4127464, -2452963, +94489, -7612830, 3600793, 683437, 1533840, 2553895, 4071092, -2422899, -1975685, -906238, +-3973382, 259846, -752156, 3241090, -1949915, -260919, -2027225, -2136746, 3802120, -3038689, +-1656247, 353798, -2939368, 2266669, -312996, -1294396, 2253784, 4530654, 59056, -173409, +-870268, 3886409, -4095788, 51003, -857383, 2052458, -1218697, -1736777, 3925600, -49392, +560493, -1182190, -15477452, 2473364, 1681480, 5240934, -2238215, 1490354, 6124624, -2563559, +1582159, -3937411, -5692979, 1890859, -3914863, -4474282, -4464082, 1154809, 1532230, -7558606, +4230543, 2728378, -1381369, -2871723, 1611150, -837519, -1807108, 369367, 2333778, 1644973, +3799972, 582505, -1314797, 3857954, -2151242, 8621073, 1860258, 5237713, 1967632, 4568235, +1995012, 3085397, 1650341, 193274, 55835, 6457484, 1000727, -1277753, 309238, 3303904, +2470680, 163746, -436476, -1594507, 600222, 7894687, 2183454, 3517041, -4079682, -2266669, +-4300873, -2872796, -4187593, 2756295, 1729261, -2842195, -2019172, 1525250, -2117956, 1722819, +-1120987, -922344, -3021510, -5020280, 1749125, -7973070, -1385664, -2021856, 8812736, 12074227, +-3468186, 3373160, -5732171, -140660, 534723, 15375983, -1371168, -3845606, -6366752, 324807, +4551592, 7165079, -1385127, -9006010, -2445447, -3327526, -2308545, 3291019, -471910, 6011344, +856846, -3131031, -7213398, 2399813, -481573, 1898376, -676457, 1012539, 3862249, 1509681, +-9110163, 1300838, 6244883, 3132642, 981937, 1617055, -1250372, 4343286, -5264020, -357556, +4822712, -2959233, 277562, 7585986, -3131568, -163209, -2209224, 4742181, -4476967, -3363496, +2543158, -4773856, -2105071, 6656663, 4161287, -5579163, -1746978, -670552, -1026497, -2435783, +2509335, -2063732, 2845953, 121333, 857920, 1227287, 5425081, -383863, 7322919, 3621194, +-4508105, -2283849, -1812476, 4027606, 1824287, -49929, 28144920, -10735271, 5516886, -8257612, +-1074816, 34897, -825171, -4495220, 2085207, 3017752, 554588, -3339337, -6816113, -498216, +3780645, 2602213, -3129421, -5206574, -635655, 4177930, 7863012, -4627291, -822486, -3558917, +-7322919, 530965, -3799436, 1886564, -2872796, 5246840, -9910637, 6265284, -659278, -6036577, +1174674, 2149094, -910533, -3333432, -37044, 7285339, -510027, 955630, -1292248, 2601140, +1116155, -2091649, -3060164, -6536940, 3822521, -1624035, -2041720, 2062658, -163209, -10807748, +7841000, -11620571, -6693170, -8352101, 1533840, -1332514, 4604205, -3034931, 2377265, -5257040, +2157147, -1751810, -2099702, -5845988, 3129958, 3110093, 6288369, -2270964, -665720, 856309, +-1959579, -371515, -22382686, 2310156, 243739, -1868848, -3454228, 3958349, -3045132, 2653216, +-818728, 12348, 3599183, 4771709, -2928631, 3535295, -1049583, -1845762, -6328098, -233539, +-8542690, -6152541, 7409356, 2752537, -2965138, -966905, -957778, 5282273, 2645163, -2565169, +4626754, 3252364, 1741609, 1747515, 1888712, 3718368, 2963528, 3180960, 8205535, 7645579, +3085397, 964757, -5368709, 5917391, -7906498, 1666447, -2357400, 6407555, -4946192, -5989869, +10309532, -2303713, -5920076, -4883378, 7566659, 4986457, -24696, 4206384, 5361193, 2787434, +8850854, -374736, -1859721, 5411122, 2757369, 490163, -277562, -4609574, 2344515, 3186866, +6856916, 3236795, 3988414, -2626909, -4527970, -7818451, -2563559, -30273614, 7591892, -6803228, +-9833864, -9754408, 5376226, -7359964, 4708358, -9138617, 4391067, 3626026, 2126009, -9611063, +5885179, -585726, 3419331, -8058970, 3852586, 8472360, 6490770, -251256, -3564823, 752693, +-2283849, -10180146, -2298344, -5170604, 1877438, -6614787, 4892505, 4572530, -2342368, -782758, +6870337, -2144263, 4568772, -4502737, -6557342, 2668249, -396748, 2767570, 8556112, 4754529, +-599685, -16043313, -7646116, -2794950, 1888712, -3044595, 8246337, -14077829, 4010963, 1100585, +-346819, 3455301, -1930588, 5733782, -14209362, -7345468, 5276368, -14930917, -2750927, 5712844, +2247879, -4026532, -9480603, 2529736, 6038187, 3430068, -1650341, -10967736, -730144, -1124208, +-840203, -13679471, 1863479, 2704756, 11337103, -10011569, 12341052, 3786014, -641561, -2428804, +-974958, 1515587, -8465917, -1268626, 3121368, -2461016, -4851166, -957778, 8601209, -8131984, +-1575179, 9054328, 325881, -2934537, 3313567, -3693135, 6604049, 3282429, 195421, 3680250, +-3397856, -5245766, -142271, 992674, 5002027, -9565429, -5196374, -3883724, -2862596, -2392834, +-2802466, 2153389, 768262, 1500017, -7289097, -7084012, -5888400, 935229, -9431211, -4625143, +6111202, -3160559, 1588064, 1431298, 132070, 3280281, 3782793, 4185983, 4259534, 6680822, +-636729, 7208566, 12348, 4209605, -67109, -2829310, 268435, -5173825, 4544076, -6147709, +7688529, -6861211, 670552, -6902550, 1801739, -6589017, -7117298, 6898791, 11481521, 39616240, +1055488, -10672994, 2364916, -5531381, 16155519, -1970316, 4975720, 1712618, 1355062, -13103408, +-6404870, 8153459, 7272454, -10208064, -1281511, 238371, 10205916, 5280126, 4269198, 9965398, +2103997, 1177358, 8791798, -2295660, -11797738, 2396592, 10145250, 6184216, -2954938, 745177, +7278896, 4596689, 2469069, 199179, -6311455, 3946538, -6915434, 1307281, -13604309, 4296041, +5085778, -605054, -5876052, 9618042, 5476084, -1329292, 7771207, 3802120, -5214627, 11436961, +1919850, -3309272, 3289408, 11713986, 2517388, 262530, -8514236, -4882304, 2129230, 4335233, +13573170, -3644817, -4160750, 1651952, 7864085, -3941706, -4552129, 42413, 10266046, 7147900, +-1222455, -6595459, 776315, 8530879, -2079838, 16925930, 8275328, 4159676, -14418205, -1947768, +-7571491, 13447006, -5801427, 6011344, 664109, 8254927, 2853469, 826781, -1321239, 3091840, +-4603668, -6369974, -17041356, -12579959, 3375844, 10385768, 13852343, -5747203, -7749732, -6631967, +2559801, -3802657, -1429150, -959388, 1251446, 1848983, 8969502, -5506685, 180926, 2053531, +3987877, -5002563, -4233764, -8033737, -6009196, -5678484, -9986336, -23622320, -1073205, -3387656, +-10851772, 2008434, -1967632, -12890271, 3401077, -10948409, 1882269, -1496259, -1771137, 5274757, +6144488, -356482, -11407970, 2950643, -7533910, -7364795, 9092983, 9017284, 9135932, -3376381, +592169, 1311039, -6273337, 794569, -3626563, 15923591, -3816079, -1589675, -2821794, -47245, +-11008538, -12022687, 4591320, -15224585, 5720897, 1897302, 16225313, -10836739, -6038187, -3601867, +8739185, -8234526, -7758322, 7109245, 4962298, -8359617, -8213588, -8271570, -18188112, 11993696, +11538967, 11924977, -4944044, 3695283, 12168716, -17395154, 290984, 11206107, 10801843, 4620311, +280247, -5698348, 1484448, -2848637, -14596983, 1693291, 4469451, 1974074, 10311680, -8977019, +1364189, -16589311, -1622961, 2949032, -8494908, 3168612, 3264175, 6980933, 9469866, 12074764, +-1966558, -5252745, -14384919, -11107322, 5279052, 21598316, -6139119, -1385127, -9407589, -5886790, +-7252589, 4196720, 5749351, -2294050, 1664300, -16784196, -1095754, 10181757, -7573638, -8376260, +7747584, -3858491, 10923176, 1213865, -5264020, -309775, -8433168, -5105106, 81068, -9881646, +21577916, -11212549, -5960878, -826781, -1114544, -15979963, 614717, -11870216, 7908646, -21968758, +-3536369, -7288023, 6973953, -7813620, -7864085, -18651432, 11908334, -7900056, 4657892, -6268505, +3278134, 9326521, -7468412, -12373264, -4431333, 7791071, 16589848, 5056787, 6701760, 430570, +-17546016, -9587441, -9659381, -5171678, 2559801, 15091978, 6248641, 8600672, 8028368, -2824478, +-4075924, -5683316, -14784351, 303869, -10471130, 15009837, -7582228, 10170483, 1776506, -6106907, +3052111, -4259534, -5399311, -9004936, 12164421, 2745558, 20917564, 4089883, -23775328, -6428493, +6765111, 5326297, 2686502, -2055142, 1300838, 23423142, 11298985, -4974109, 1701344, -7490423, +16528645, -1748052, -1918240, 5626944, -17147656, -7981660, -13616120, 7778723, 17666274, -1989107, +-1006633, -644245, 16402480, 4922033, 3754875, 2610266, 1732482, 2596845, -6789270, 986769, +-20847234, 2721936, -10169946, 8373576, 20839182, -2978023, 1294396, -16871168, 21978422, 10536629, +9196062, -3009698, -12466679, 1227824, -4419522, 11031623, 7834021, -10346576, 282394, 5704791, +3944391, -8063801, -7208566, 32312112, -7821673, -5919002, 6586333, -8531416, -6329171, 10111427, +9849434, 162135, 3601330, 3450469, -12913356, -6501507, -862752, 4065187, 10692321, 2504503, +2247879, -14448807, -1722819, 3994320, -19831474, 4066260, -5838471, -2139968, -4056060, 5557151, +-6300717, -10675678, -11860015, -17934710, 1582696, -7265474, -4284230, 11487427, -4875325, 3936338, +-21514564, 617938, 15771120, -10256919, -10306311, 24613384, -14685030, 3886409, -9386114, 29026462, +6163278, 5426691, -9257265, -10876468, 1052804, 8366060, -8888972, -14059039, -8429410, -20478404, +-8040179, -11964168, -41876, -27536110, 1915019, 15146202, 9205189, 12422656, -8581882, 3380676, +13274133, -1340030, 9615358, 3807489, 15002321, -7304129, 12505871, 10232223, 7096897, 16576426, +-9157944, 10012643, -5017059, -5462662, -3874061, 3961571, -31620086, -9714679, -19660212, 23154168, +-14341970, -15716359, -3469797, 13322452, 357556, -5244692, 17890150, -5809480, -5647345, -12345347, +-31919660, 2239826, 3027952, 14070313, -13318157, 861141, -8056285, -9879499, 17246442, -2462627, +8773008, -17498234, -17805860, -10088341, 14650670, -151934, -8436926, -8146479, 548145, -12429635, +-640487, 15389942, 1523640, -5348845, 7641284, -13464722, 25177098, 15659988, -752693, -12288438, +-13937706, 5064304, -3977677, -1693291, -1335198, 23024246, -12181064, -34360, -8680666, 8190503, +-15266461, -13838385, -27022324, 5666136, -11394548, -15244450, -2506114, -25476136, -13020193, 6661495, +4618701, -3838627, 12308303, 826244, 15061377, -7361037, -22555558, -3681324, -16744467, -3403225, +-5592048, -21242908, 1918777, 16687559, -48766132, 5747203, -732829, 11576547, -3252901, -15220290, +-29340532, 11052025, -4413079, 10322954, 5397700, -3728569, 15621333, -20897700, 27936614, -7497939, +15101642, 33553896, 12429635, 23822572, 8321499, 6109054, -4451734, 12367358, -5878200, -13306882, +-18930606, -11583527, -1763084, 9822053, -2447595, 41070624, 33576980, 30345018, -6126771, 758599, +-24574192, 19525996, 23966454, 8654896, 23159000, 9730248, 8253854, 8654359, -3416110, 3868155, +6800544, -4993973, -23730768, -13964549, -367757, -15341086, -18279380, -43342124, 10201084, 8442832, +11994233, -7624641, -2546379, -5031554, 768262, -12948253, 44560, -9646497, 12643847, 11060078, +-5900212, -7654706, -22891638, 40126804, -11878269, 8679055, 326418, 3479997, 6576669, -15233712, +19843822, -8868571, 6947647, 5393942, -14376866, -14024679, -2590402, -265751, 9240085, 42453604, +-3346317, 7248294, 1429150, 13596793, 8874476, 10435160, -7399155, -1023276, 3389803, -18823768, +3745748, -15924665, -27828166, 10721849, 121870, 3357591, -21136608, -46938624, 19027778, 22792318, +11884175, -25841208, -23998666, -47596828, 38950520, 6023692, 6659347, -16041166, -11658689, -50603304, +13594645, 35717484, 10714333, -32140314, -16273094, 4915590, -12737799, -8133058, 14416058, -16844862, +8930311, 8021389, 6499360, -18715856, 6255620, 5477694, -9016210, -17524540, -10358387, -6889665, +-4827007, -16724603, -14578193, -8056285, -17361332, 13178033, -6706055, -22180822, -7937637, 13226889, +-3143379, -15460272, -8735963, -8015483, -410169, -12321187, -7631083, -20259898, -19345070, 7801808, +-7105487, 24631638, 16048682, 1268626, 14547054, -22172768, 13767518, -21110302, 17071422, -3452080, +8585640, -9775882, 30604864, -8347269, 17020418, -5194763, 25148644, 9302899, 5930276, -27404576, +28223304, 21281562, 9706626, 8581882, -20646444, -6754373, 8263517, 9386651, -3826279, -6298570, +-30620970, 30246770, -1010391, 15669114, -15841450, -3632469, -2194192, -1972464, -1894618, 18583786, +2838437, -11363410, 13329968, 4119411, 10302553, 16080894, 16396038, 2962991, -9626632, 51760800, +-11115912, 40321152, 2798708, 4512937, -19033684, -7197292, 6149857, 20685636, 11725261, -3745212, +17741436, 5344013, -18168786, 5760088, 5767604, 23739894, 1964948, 15144055, -13015898, 2323577, +17359720, 9557376, 15036681, 34576096, 28752658, -1647120, 16383690, 389231, 28399934, -17896592, +20057498, 9345849, 2290291, 17706540, -4721243, 42010684, -3432216, 21660594, -10871636, -10118943, +4245575, 44746580, 17413408, -36246840, 38470024, 2158221, 16178605, -26481158, 14268418, 6416681, +-54393612, 27832462, 49884436, 20417738, -13502303, -8763344, 15642808, 42370388, 10035191, 11850889, +7774428, -8734353, -4330938, -15661061, 20325396, 3478387, 13525926, -10449119, 27028230, -8996346, +12565464, 4702453, 5551245, 4518306, 2257542, -27659590, -16523813, 822486, 2356327, 20007568, +15700790, -22320408, 2048163, -11922292, -11895449, 6511171, 1005022, -7028714, 9062381, 38224672, +-25263534, -1003949, 56544320, -33761664, 3426847, 21470542, -11205570, -7290707, 11031623, 20023138, +-21418466, 11353209, -38213396, -2716030, 54508504, 3796214, 14594836, -4451197, 29118268, 32015760, +-9788767, 1038845, -15899969, 5156645, -12277164, -25388088, -19193136, -30552250, -25807384, 37820944, +12312061, 12554726, 45458472, -31952410, -22764400, 8109972, 14875619, -11324755, 5186710, -12378096, +22287660, 17451526, 3881577, 19770808, 61022360, 6657736, -6986838, -15814070, 14712410, -3089155, +32337882, -27515172, 8199093, -1100049, -8118562, -7333120, -3091840, 10560788, 6950331, 7481296, +-463856, 18486612, 4127464, -21977884, -16994112, -1532230, -9532143, -12229919, 4105452, 15462419, +-926102, -2324651, -19897510, 11329050, -2228014, 22494354, -6157373, -40399000, 6246493, -11278584, +-5035313, 1061931, -32343788, -16649978, -27588722, 1535451, -827318, -7067369, -36879272, -14493904, +-2012729, 21003464, 23420994, 2827699, 3074660, 11815992, 3868155, -25154550, 24466282, 32407138, +-12083354, 5836324, -12060805, 6765647, 1506460, 24974698, -25103546, -18325552, -59506772, -20638928, +17296908, 25746718, 19535122, 16916802, -12971338, -4198331, 14558329, 12192875, 29236380, 12205760, +14436996, 16616692, 6793028, -48041892, 21561272, -13609141, 2771865, 35948340, 30102352, -10468983, +-4006668, 19092204, -10333691, -10624138, -8977555, 3606162, -2566243, -90731, 4951561, -2580739, +17947594, 42275364, -16571594, -30767536, 32763622, -23492934, -6038187, 1656247, 40660456, 4559645, +-11485279, 13291850, 11746736, -40291624, -11743514, 8532489, -1096290, -18191334, -1002338, 9620727, +-61027728, -26622892, 30878130, -28425168, -33389076, -18854370, 25208774, -30206504, -50285476, 53121228, +-14765561, -29538638, -1694365, 22344568, -19411642, -31595390, -852014, 18343268, -1868311, -41035728, +10129143, 2535105, -20069308, 49692236, 43031276, 413927, -18513456, -30275224, 52041044, 11858942, +7892003, 23300734, -15159087, -45977624, 20185272, 45679124, 26869852, -12450573, 3253975, -49767932, +6580427, 48853104, 27060442, 7685307, 386010, -7677254, 13442711, -15894600, 40757628, -2055142, +11609297, 15659451, -12662637, 1506997, -702764, -14176076, 972273, 6715182, 23341000, 888521, +-12788802, 7845832, 19005768, -2004676, 29514478, -21125870, 5699422, 7374996, 8521215, 25623238, +-12394202, 3137474, 197032, -31212602, 5715528, -9555228, -16418049, 8489003, -5507222, 26257282, +19427748, -12294881, -27624156, 14681272, 4052302, 6755984, 17412872, 36078800, -4656282, 8258149, +-12884365, 21134998, 15837155, 16058883, -15252503, 24080808, -6372658, -9052717, -18556406, -771484, +-6237903, 30931818, -20397336, 2698313, 9429064, -5682779, -11326903, 42908332, 762357, 11212549, +-759136, 6574521, 435939, 13864691, 4226785, -321586, 15974057, -45090716, -125306744, -119127896, +50711752, 4373351, 113089712, 240564336, 52023864, 96584152, 51048908, -179543056, -80914496, -120932856, +-177569520, -12421045, 20023674, -84041232, 73319920, 125690608, 76395656, 216861488, 132497056, 739808, +-21040508, -77377592, -192943360, -155971200, -67986648, -147741504, -44455596, 83851720, 24038396, 20968568, +198094624, 76493904, 47467440, 183994256, 7677791, -9571871, 83896816, -42530912, -153009280, -73740832, +-152907808, -221903248, -25665114, -100833488, -83349208, 70953400, 136555808, 63708860, 242152944, 193902736, +111284752, 147360864, 48788144, -71893992, -112257560, -147853168, -238436720, -189816080, -128677224, -108103792, +-34723200, 83632144, 124881544, 141281344, 187714768, 160256512, 74254080, 29701310, 41678900, -59262496, +-94543504, -61268244, -134350864, -72863048, -1661616, -9522479, 0, 0, 0, 0, +0, 0, 0, }, }, { { -1440962, -20401, 2159295, -4076998, -1202054, -2580739, -3591130, -315143, 4429185, 767725, -2393908, --2267206, 6123013, -2767033, 584652, -1990717, -2043331, -3163780, -776852, 7668664, 504122, --382252, 1437203, 1978369, 652298, -2481417, 4250407, 131533, -148713, -1906429, 536334, --1441498, 634581, 2820183, 207769, -115964, -159988, -200253, -666794, -3753802, 876710, -3172370, -945967, -1850594, 2961380, -3440269, -263604, -1462436, 2172180, -5546414, 2048163, --421444, 833761, -1253594, -1153736, -153008, -1565516, 224949, 1675574, 1235340, -340913, -1093606, 4946729, -3124589, -2483028, 253403, -1171989, -2353105, 652835, -2532957, 1389422, --3048890, 315143, -1552631, -2566780, -373125, -4971425, -1869921, 1250909, -870268, -2827699, --147640, 6809671, -3394098, 868657, -1399086, 10737, -2518462, 4932233, -2459943, -2585034, --2974802, 5866389, -3383897, -799401, -1576790, 1725503, 2705830, 3483219, -4725538, 98784, -4597226, 2131915, 813896, -133681, -539555, 2182380, 4677757, 1249299, -5947456, -2946885, --3192235, 5350456, -516470, 4120484, -2486786, 1991791, 5226975, -2388002, -3923453, 1557463, --1468879, -95026, -3519189, -1243393, -2636036, 1184337, -4781373, -1378148, -1240172, 53150, -6424734, -1887638, -1005022, 2147, -1734630, -420907, -662499, 4171487, 1955821, 2682744, --3435437, 2775623, 2490007, -1940788, 951872, 1919314, -1873680, -1903207, 2556043, -3585761, -2644089, -440771, -54224, -217433, -3240553, 3271691, 322659, -1527935, -2230162, -674310, --1165010, -81604, -2741800, -2144799, 1454920, -512712, -1088774, -4769561, -756988, 4259534, --2988760, -827318, 3226594, -1986422, -3559454, -2775623, 2190433, -79457, -383863, -775242, --3403762, 1031866, -1532230, -893353, 3777424, -2197950, -5181341, -1643362, 267899, 1438277, -1343251, 333934, -3923453, -1014686, -4771172, -4449049, -1158567, 4431333, -767725, -9097278, --375273, 2908767, 2667175, -1972464, 1820529, 1811939, 248571, 2549063, -4753992, -3549791, --350040, 1277216, 350577, 870805, -363462, 1132261, 1342714, 1731409, -41876, 1010928, -1399086, -1048509, 2247879, -606664, -4185446, -4003447, -1699733, -500364, 4276714, 2470680, -6319508, 584652, -1058173, -581431, 4509179, -1007170, 2484102, -3806952, -283468, 81604, -2425583, 1785096, 4043175, 2949032, -1883880, -3739843, -3095061, 2403571, -1254131, 3213173, -2002529, 613107, -86973, 2714956, 1862405, -1597191, 2156611, -4014721, -497679, -3700651, --3279208, -4494684, 1460826, 2937758, -425739, 3998078, -2848100, 3728032, -6977175, 2964601, -1256278, 5471252, 1576253, 2141578, 2851858, 152471, -1760937, 2231236, 4571993, 1839857, -2219424, -431644, -71941, -6133750, -431644, 1347546, 1225139, -613107, 3408057, 6804839, --2208687, -4291209, 3026341, 1057099, -3390877, 334471, -1661079, -2913062, 222265, 5069135, -896574, 2124398, 373125, 3518652, 3393561, -3028489, 5112085, -1646046, -3162707, -4765266, -1280437, -6344204, -253403, 784368, 1942936, -4009889, 2823404, 41339, 758599, 1830193, -1231582, 1562294, -5384279, -273267, -1075889, -3530463, 2310156, 1163399, 1029182, 3207267, -11158325, -715112, 773094, 1652489, 2924873, 1161252, -8766565, 1956895, -1259499, -945430, -5168993, 231928, 2704219, 3639448, -4173098, -2390149, -1005559, -4218732, -8943733, 522375, --3180960, -468688, -492848, -100932, -1813550, -4425964, 1624571, -4228932, -1013612, 1070521, --4440996, 5088463, 2120640, 1523103, -1603097, -258235, -340376, 1110249, -1075352, 2688650, --3438658, 1452236, 6568079, 5132486, -1125281, 2705830, -1667521, 1280974, -3615289, 175557, -7297687, -9322227, 366146, -5753646, 2901251, 4190278, 5124970, -835371, -4917738, 86436, -5049808, 1040993, 947040, -3859565, -534187, -6727530, 8857296, -520765, -6859600, 7350300, -1831804, 2137820, -504659, -2730526, -895501, -3590593, -3501472, 2667175, 3859028, -864362, -3639448, -3097745, -1910724, -83752, 5087389, 4749697, -1384053, -2825015, 3952981, 2435783, -344671, 3257733, 772020, -4081293, 4134443, 2469069, -346819, -1518271, 1114007, -4423280, -11332808, -757525, -448824, 8289287, -816044, -5386963, -2861522, -835371, 2011118, -5635534, -3627637, 836982, 61740, -5203353, -4196183, -8999567, -847719, 3626563, 1910724, 4414153, --2826089, -2494839, 10100152, -3569655, 1523103, -2423435, -4486094, -9607842, 62277, -3948686, --4475356, 1566589, -5406827, 309775, 4001836, 2229088, 8188892, -13206488, 8761733, -1283122, -3941706, -2423972, -1715839, -6886443, 6449431, 5636071, 1591285, -6117107, -134218, -3493419, --216896, 6601902, 4739497, 1098438, 6411313, 8590, 547071, 697932, 18254, -4245575, -9490804, -849867, 331786, 10820633, -6684580, 2634426, -3049964, -643171, 3662533, -1420560, --5198521, 10385231, 8347269, -262530, 2908767, 4354560, 11475616, -1442572, -1705102, -6073084, -1384053, 2099702, -6083821, -6885907, -5672578, 7158100, 531502, -3047816, 5345087, 3412889, -472983, -1866163, 2051384, -4095251, -524523, -4500589, -437550, 3667902, -7262790, 1388348, --980863, -6117644, 4146791, -2192581, 1226750, -1936493, -987306, 1247688, 7147363, 7568269, -1093069, -6958384, -1121523, -6628209, 2467996, 16542067, 3952444, 11376831, 4084514, -120259, --11045582, -2944200, 1597728, 10222559, -4838818, -2612951, -4239670, 699006, 8254927, -6505802, -3940633, 6976101, 1425929, 2340757, -4986994, 8668855, -2143726, 11383811, -324807, -4000225, --11263015, 930934, -187905, 12725451, -4212826, -1542967, 8102993, -434865, 843961, -3241627, --8912057, 366146, 4678830, -6797860, -5203890, 652298, -10693395, 4996658, 5383205, -2488397, --1072131, 2115808, 5425081, -1377074, -4094178, -1106491, 8065412, -2177549, -1942399, -4470524, -10431402, 9896142, -82141, -3675955, 723165, -2456185, 1600412, 2674691, -2408403, 3568044, --6753836, 1582696, 366683, -7248294, 7678865, 5865852, 616865, -4764730, -5338645, -2257542, --10778757, 12870406, 9762998, -1918240, 3740380, 1278290, -1896765, 9777493, -576063, -4370666, -14491757, -15370614, 4205310, 6777459, 156766, -6231461, 7023882, 1146219, 10065256, -3723200, --837519, 2704756, 4159676, 737124, -1117228, 14390288, 6413460, -6495601, -9655623, 6926172, --9656160, -2838437, -11149735, -1453846, 17303886, 6988449, 8495982, 56371, -8796093, -1525250, --4166118, -2001992, 13015898, -2042257, -13797582, -1211181, 3022583, -9045738, -1220308, 5638219, -4803384, -6176700, -2878165, 5954972, 8413841, -2626909, 8748312, -170725, 2381023, 2771865, -950798, 2813204, 5304285, 4235375, 4978941, -3505230, -10022843, -12599287, 6366752, -699006, -5944235, -11599096, 4286378, 3425773, 1810329, -7557532, -6317897, -8054675, 6452115, 3418794, --5740761, -5708012, 8088497, 2716030, -549756, -4779762, -8002061, -3180423, 3383897, -5055714, -711891, -9586904, -2624762, 1269163, 3426847, 6487011, -923418, 4193499, 5637682, -5496485, --13395466, 9445170, 542240, -1992328, 8971113, -1210644, 482647, -5801964, 7917236, -4802311, --6163278, -2293513, 6540699, 9859097, 8309688, 2717641, 1835562, -16882442, 7981123, -830539, -3507378, -5684389, -845572, -6375342, -1990181, -1378148, -8431558, -4164508, -3204046, -4531728, -9548249, -2634426, 12356084, -1096290, -46708, 7771207, 9207873, 14659260, 10692321, 264141, --3479461, 56371, 1538672, -5838471, 3715147, -3512210, -4891968, -18486612, 3705483, -12822088, --7797513, 11507291, 8887361, -21061982, -19327352, 323196, 7810935, -5142687, 4706748, -7164006, --1067836, -12356621, -3440806, -11183558, -1068910, -3286724, 63351, 3868155, 3144453, 6462852, --1112397, -6073084, 4751308, -7180112, -3015604, 1917703, 188442, 3223373, 6946036, -1439888, -680752, 1380832, -3127810, -1025960, -10720775, -12717935, -12248173, -233002, -12303471, 3833258, -1450625, -5018670, -5770826, -2638184, -2121714, -1238561, -7299297, -11592654, -690953, 17957796, -9977746, -2697776, -10791642, -11300596, 12587475, -11836393, -3736622, -2156074, -7632157, -5979668, --7700877, -9343701, -12618077, -17545478, -2012729, -2730526, -1819992, 6070400, 6496138, 1728724, -6161668, -3299072, 1609539, -14516453, 2133525, 7900593, 8609262, 7941395, 3654480, 15291157, --5430986, -10543608, -2363306, 2234994, -1705639, 5057861, 10457172, 20365124, 13156559, 7635915, -9897752, -7492034, -14260902, -4845260, -10525354, 12817793, 3446711, -2452426, -8392903, 14485851, -12910135, -4376035, -263604, 95026, -6743636, -6039261, -10459319, 3435437, 4547297, 6454262, --9806484, 1057636, 3757560, -4716411, -9459129, 365609, 6754373, 7911867, 2160369, -20003274, --6300180, -9869835, 4993437, 11944304, 915365, -11258183, 3637837, -10882910, 7010997, -2682207, -2001992, -7757785, 17246442, 12687870, -2865817, -3824132, -8136279, -723702, 14174466, 2873870, -17206176, 15216532, 14177687, 7428683, 4151623, -10251013, -3981972, -13513578, 17565880, -8533563, --1107028, 8607114, 14026289, -11905649, -14690936, -12569222, 16707423, -5025112, 11651173, 1153199, -1609002, 25912612, -1509144, 3102040, -9417790, -15699716, 5739687, -1254667, 6101538, 4261145, -180926, -8446590, 4316442, 4898410, 3294777, -7909719, 7691750, 5684389, 19598472, -7017440, -2901787, 11076721, 11739756, 1654099, 11870216, -1293859, 2173254, 10325101, 9456444, 3322694, --2110440, -13174812, -9074729, 9760850, 1692754, -2020245, -892279, 3445638, 21441550, 105764, --4689568, 11196443, -2611340, 10664941, 4471598, 29335700, -3196530, 443992, 2308545, 5520644, -12037720, -496069, -675384, 7610145, -10428181, 12109123, 22564684, 7230041, -1106491, 12377022, --970126, 755377, 25729538, -11637751, 8521215, 10087268, 592169, 1417339, 1874753, 3898757, --14902463, -4975183, 8707509, -5628555, -8177081, -7518877, -7546258, 193274, 8803609, -2253784, --22228066, -1031329, -17075180, 5261872, 6199786, -951335, 2523293, -8262980, -1687922, 7515656, --21267068, 4060892, -5225365, 10264435, 7188702, 3939559, 170725, -9413495, -19233400, -2252174, --16893180, 8706972, -565325, -6220724, 16350404, 7473780, -7487202, -6800007, -4233764, -4045322, --5444408, -10669773, 976031, 1099512, 23966454, -2415919, -18311594, -1649804, 11348914, -809601, --9776956, 3966402, -14405857, 7314330, -6518150, 4152697, -8728984, 1692217, -14790794, 34782256, -567473, 23279260, -3342022, -9298604, 5675800, -10670846, -9092446, 11588896, 12689481, -14874009, --33315524, 27598386, -12037720, -11470784, -5828271, -1981591, -15940771, -5762236, -4994510, -13699335, --24059334, -6032819, 149250, -12800613, 5954972, -5543729, 10350871, -9250286, -4083440, -13120051, -30760018, 26162256, -6174553, 5779416, 17736068, -19022410, 18919868, -8046085, -8329016, 6895033, -2211371, 3265786, -3165391, -4184909, 194347, 6234145, 5019743, -8403640, 9291088, -9041443, --15491410, 11027329, 9264781, -12509629, -16035797, -17980880, -3056943, -2877628, 4641249, -11667816, --15221901, -7393786, 24319178, 8851391, 7973070, -10392747, 9089225, 13271986, -10642929, 24598352, -4031364, -8395050, -11904039, 6859063, -10091026, -20409148, 4541391, 206695, -73551, 11876121, -10031433, -8562554, 1157494, -25985626, -3920768, -9709847, 21413096, 2317672, 2386928, -11496554, -9536975, -19882478, -4589173, -11622182, 14543296, 15302432, 13872207, 9293772, -175020, 12647068, -11525545, 1808181, -2233383, 5005248, -1074, -13164075, -1578401, 4778151, -10198400, 14356465, --15170898, 11944304, 13201119, -4006668, -2990371, 5381594, 17627620, 12973486, -15938087, -3733937, --4263292, -1545115, 3987877, -7728257, -7778186, 16983374, 442382, 24503326, -16214038, -15751256, -12516608, -8678518, 4520453, -10172630, 8358007, 9074729, 6295349, -4384088, -14252849, 879931, -4740034, -12432320, -21787832, -1378148, 1970316, -13538274, 23505282, -3431679, -6710350, 30443266, -29387776, 2034741, -4173635, -2105608, -6395207, 5960341, -15591805, 13197361, 1711545, -9860171, -17211544, 1104344, 3167539, -7014756, -10029286, -25979720, 4348655, -11266236, -5459977, -26071526, --60029684, 19758998, 18711562, -6955163, 3970161, -14663555, 25521232, 16216186, -14886357, 3888556, -3243237, 90731, -6844568, -5024038, -31085900, 12753369, 14951318, -3802120, -274878, -2016487, -9973988, -8018704, 19275276, 5498095, -23496156, -13459891, 29228326, 19066434, -19495930, -4825396, --7108171, -12077985, 1561221, -5011690, 3925600, 38008848, 10161893, 39835284, 22647900, 25555056, -23287850, 45921252, -3337190, -4624606, 10751377, -3605625, -39115876, 31106838, -13960791, 17683454, --25992068, -20754356, -38667592, 7233799, -3914863, -13245679, 8932458, -18408230, -375810, -26146688, --26171920, 6749541, 14470819, -21371220, -6134824, -15028627, -20782274, -23209466, -17024176, 11560978, --10799695, -29199336, 39106752, 23843510, 38533908, -8257612, -22469658, -57770532, 24003498, 28791850, --14060649, -6550899, -2175938, 32684164, 387621, 6400575, 6366216, -8615704, 5959804, 14803142, --3802657, -15750719, 3051574, 27637578, -15745887, -10227391, 5546951, -4784594, 20596516, -6158446, -8906152, -11813308, -13864154, -14018773, 13253195, -5080947, 11680700, 13538274, -4440460, 983011, --631897, -12736189, 3178276, -11663521, 11886322, 29947734, 50054084, -1649804, -2228551, -22564148, -10826539, 15549392, -1326071, 17562122, 25851946, 10080825, 14296872, -24618752, -14997489, 18230526, -49793168, -10581726, -30842160, 6263673, -11017665, -1925219, 12565464, -1188632, -14907295, -8013872, --8475581, -36115308, -16087874, -1433982, 3804267, 10300942, -4303557, -15112916, -10598369, 1326608, --9477919, -15312095, 6870874, 18088254, 5978595, 9475772, 3666828, 27303108, -8676371, -3429532, --10807748, 6345814, -6748468, 6028524, 30907122, 6154688, -32935420, -7968775, -9682467, -28035936, -17744658, 8504572, -3367254, 4058744, 1632088, -12509629, -238908, -772557, -12652974, -3615289, -26924076, 39929776, 18630494, -13681081, -22056268, 10554882, 18039400, 2265059, 14405320, -9857487, --7141994, 15231565, 4591857, 543313, -33498060, -43141872, -1522566, -25029996, -14882062, 9571871, -36316096, 8420283, 1728188, -9960029, -12657805, -17580912, -16086800, 3741990, 10972568, -3041911, --18059264, -28148142, 11645267, 1879585, -16081431, -25855704, -18173080, -28372018, -53609244, -30754114, --4416837, -4295504, 65461744, -5238250, -1524177, 40843528, 5704254, 7010997, 24382530, -5043902, --15404437, 20564304, -28987272, 7413651, 4706748, -12592307, -40674416, 27802398, 8334384, -2559801, --41174776, 11045045, 6518150, -21740588, 3763465, 19177566, 11876658, 5623186, -18555332, -3754875, --6835441, 3348464, -6889128, 1786170, -14321032, -20764020, 23001160, -15712064, 34877280, -21347062, --19216220, -13066364, -24194624, 2222109, -279173, 36545340, -26818312, -28394566, 14892262, 9495636, --23378580, -31245888, -3267396, -17536352, 20542828, 4488241, -25753160, 17041894, -4219806, -39711268, -26425324, -17561048, 17314086, -29416232, -7080254, -489089, -12321724, -4721780, 3560528, 37970196, --10027138, -2940979, -10750303, 11396159, -17814450, 14723148, 29095182, -757525, 29043642, 24459302, --4276177, 48936856, -4109210, 7759932, -3929895, 16563005, 40672804, 349503, 27348742, -54434416, -1473174, -61190936, -20896626, -10887205, 17852568, 55363204, 46967616, 16916802, 27481348, -18855980, --15981573, 2091649, -4741644, 12329240, 3482682, -13286481, 18140332, 26999238, 22327924, 16515760, -13859323, -1145146, 1914482, -10093710, 25470230, 11509975, -5721434, -16854526, 4662187, 9995463, --3613141, 33478196, 34978212, -21470542, -16113107, -46708, 26935350, 16486232, 3565897, 2541010, --7567196, -13426068, 5945309, 41786812, -18329846, -22115860, -24102282, 21310018, 7963943, -13865228, --21135534, -33009508, -39093868, 2980707, 6861747, 5589900, -9865540, -4095251, -12062953, 6070937, --31962072, -50990924, -24343338, -5053566, -10685879, -21085606, 22201222, 39454108, -12293270, 19144816, -42146516, 27191438, 6037114, -34978752, -2248952, -33930780, 27925878, -3202435, 24041080, 14690936, -869194, 16029355, -6576669, -1475858, 13877576, 16892644, 2892124, 366683, -208306, -14841796, --9481140, 4313221, -20730196, 833761, -7575249, 772557, -17517560, 3300682, 1350767, -16010027, -13932874, 6015639, 9549323, -20182588, -5148055, 4078072, -703301, 1698660, 12081743, 2804614, -3652333, -2139431, -4151623, -3001109, -1298691, 7747584, -3042448, -12859132, 10940892, -17760226, --5246840, -5994701, 2534568, -8632347, -10013179, 13779329, -1354525, -13579076, 8754754, -19000398, -15681999, 4833986, 1102196, 15806553, 17912698, 2457258, 5366025, -13179644, 17366700, -8381629, --11299522, -1118839, 2824478, 31963146, -14192719, -24057722, 20518670, -8238284, 20342576, -4262755, -1098975, -9961640, 9313637, 14603963, -9563818, -91423208, -172334496, -62763432, -135378976, -154059408, -35110820, -7331509, 48903036, 194666704, 211407424, 148510848, 212960592, 174477680, 56670484, 59675888, -43840340, -120837296, -124071944, -70152920, -120445376, -130364072, -44746044, -39942660, -109801912, -83541944, --14896557, -50335408, -60606820, -16726750, -46683072, -81887848, -46926276, 12902619, -33386392, -41407780, -45697380, -9824201, -45521284, 38705708, 73985104, -19010062, 17943836, 114594560, 15403363, -38654704, -76701136, 66092568, -66883380, 37200324, 85140208, -27284854, 9844065, 146701056, 113302848, 56461104, -208277456, 230522176, 119902600, 212926224, 276783808, 173523120, 166246368, 227798624, 150298624, 96195992, -109529720, 59180892, -51406464, -110622792, -147495088, -263307808, -314878560, -359921472, -394814336, -381344256, --317797504, -149840128, -94480152, }, +20401, 2159295, -4076998, -1202054, -2580739, -3591130, -315143, 4429185, 767725, -2393908, +-2267206, 6123013, -2767033, 584652, -1990717, -2043331, -3163780, -776852, 7668664, 504122, +-382252, 1437203, 1978369, 652298, -2481417, 4250407, 131533, -148713, -1906429, 536334, +-1441498, 634581, 2820183, 207769, -115964, -159988, -200253, -666794, -3753802, 876710, +3172370, -945967, -1850594, 2961380, -3440269, -263604, -1462436, 2172180, -5546414, 2048163, +-421444, 833761, -1253594, -1153736, -153008, -1565516, 224949, 1675574, 1235340, -340913, +1093606, 4946729, -3124589, -2483028, 253403, -1171989, -2353105, 652835, -2532957, 1389422, +-3048890, 315143, -1552631, -2566780, -373125, -4971425, -1869921, 1250909, -870268, -2827699, +-147640, 6809671, -3394098, 868657, -1399086, 10737, -2518462, 4932233, -2459943, -2585034, +-2974802, 5866389, -3383897, -799401, -1576790, 1725503, 2705830, 3483219, -4725538, 98784, +4597226, 2131915, 813896, -133681, -539555, 2182380, 4677757, 1249299, -5947456, -2946885, +-3192235, 5350456, -516470, 4120484, -2486786, 1991791, 5226975, -2388002, -3923453, 1557463, +-1468879, -95026, -3519189, -1243393, -2636036, 1184337, -4781373, -1378148, -1240172, 53150, +6424734, -1887638, -1005022, 2147, -1734630, -420907, -662499, 4171487, 1955821, 2682744, +-3435437, 2775623, 2490007, -1940788, 951872, 1919314, -1873680, -1903207, 2556043, -3585761, +2644089, -440771, -54224, -217433, -3240553, 3271691, 322659, -1527935, -2230162, -674310, +-1165010, -81604, -2741800, -2144799, 1454920, -512712, -1088774, -4769561, -756988, 4259534, +-2988760, -827318, 3226594, -1986422, -3559454, -2775623, 2190433, -79457, -383863, -775242, +-3403762, 1031866, -1532230, -893353, 3777424, -2197950, -5181341, -1643362, 267899, 1438277, +1343251, 333934, -3923453, -1014686, -4771172, -4449049, -1158567, 4431333, -767725, -9097278, +-375273, 2908767, 2667175, -1972464, 1820529, 1811939, 248571, 2549063, -4753992, -3549791, +-350040, 1277216, 350577, 870805, -363462, 1132261, 1342714, 1731409, -41876, 1010928, +1399086, -1048509, 2247879, -606664, -4185446, -4003447, -1699733, -500364, 4276714, 2470680, +6319508, 584652, -1058173, -581431, 4509179, -1007170, 2484102, -3806952, -283468, 81604, +2425583, 1785096, 4043175, 2949032, -1883880, -3739843, -3095061, 2403571, -1254131, 3213173, +2002529, 613107, -86973, 2714956, 1862405, -1597191, 2156611, -4014721, -497679, -3700651, +-3279208, -4494684, 1460826, 2937758, -425739, 3998078, -2848100, 3728032, -6977175, 2964601, +1256278, 5471252, 1576253, 2141578, 2851858, 152471, -1760937, 2231236, 4571993, 1839857, +2219424, -431644, -71941, -6133750, -431644, 1347546, 1225139, -613107, 3408057, 6804839, +-2208687, -4291209, 3026341, 1057099, -3390877, 334471, -1661079, -2913062, 222265, 5069135, +896574, 2124398, 373125, 3518652, 3393561, -3028489, 5112085, -1646046, -3162707, -4765266, +1280437, -6344204, -253403, 784368, 1942936, -4009889, 2823404, 41339, 758599, 1830193, +1231582, 1562294, -5384279, -273267, -1075889, -3530463, 2310156, 1163399, 1029182, 3207267, +11158325, -715112, 773094, 1652489, 2924873, 1161252, -8766565, 1956895, -1259499, -945430, +5168993, 231928, 2704219, 3639448, -4173098, -2390149, -1005559, -4218732, -8943733, 522375, +-3180960, -468688, -492848, -100932, -1813550, -4425964, 1624571, -4228932, -1013612, 1070521, +-4440996, 5088463, 2120640, 1523103, -1603097, -258235, -340376, 1110249, -1075352, 2688650, +-3438658, 1452236, 6568079, 5132486, -1125281, 2705830, -1667521, 1280974, -3615289, 175557, +7297687, -9322227, 366146, -5753646, 2901251, 4190278, 5124970, -835371, -4917738, 86436, +5049808, 1040993, 947040, -3859565, -534187, -6727530, 8857296, -520765, -6859600, 7350300, +1831804, 2137820, -504659, -2730526, -895501, -3590593, -3501472, 2667175, 3859028, -864362, +3639448, -3097745, -1910724, -83752, 5087389, 4749697, -1384053, -2825015, 3952981, 2435783, +344671, 3257733, 772020, -4081293, 4134443, 2469069, -346819, -1518271, 1114007, -4423280, +11332808, -757525, -448824, 8289287, -816044, -5386963, -2861522, -835371, 2011118, -5635534, +3627637, 836982, 61740, -5203353, -4196183, -8999567, -847719, 3626563, 1910724, 4414153, +-2826089, -2494839, 10100152, -3569655, 1523103, -2423435, -4486094, -9607842, 62277, -3948686, +-4475356, 1566589, -5406827, 309775, 4001836, 2229088, 8188892, -13206488, 8761733, -1283122, +3941706, -2423972, -1715839, -6886443, 6449431, 5636071, 1591285, -6117107, -134218, -3493419, +-216896, 6601902, 4739497, 1098438, 6411313, 8590, 547071, 697932, 18254, -4245575, +9490804, -849867, 331786, 10820633, -6684580, 2634426, -3049964, -643171, 3662533, -1420560, +-5198521, 10385231, 8347269, -262530, 2908767, 4354560, 11475616, -1442572, -1705102, -6073084, +1384053, 2099702, -6083821, -6885907, -5672578, 7158100, 531502, -3047816, 5345087, 3412889, +472983, -1866163, 2051384, -4095251, -524523, -4500589, -437550, 3667902, -7262790, 1388348, +-980863, -6117644, 4146791, -2192581, 1226750, -1936493, -987306, 1247688, 7147363, 7568269, +1093069, -6958384, -1121523, -6628209, 2467996, 16542067, 3952444, 11376831, 4084514, -120259, +-11045582, -2944200, 1597728, 10222559, -4838818, -2612951, -4239670, 699006, 8254927, -6505802, +3940633, 6976101, 1425929, 2340757, -4986994, 8668855, -2143726, 11383811, -324807, -4000225, +-11263015, 930934, -187905, 12725451, -4212826, -1542967, 8102993, -434865, 843961, -3241627, +-8912057, 366146, 4678830, -6797860, -5203890, 652298, -10693395, 4996658, 5383205, -2488397, +-1072131, 2115808, 5425081, -1377074, -4094178, -1106491, 8065412, -2177549, -1942399, -4470524, +10431402, 9896142, -82141, -3675955, 723165, -2456185, 1600412, 2674691, -2408403, 3568044, +-6753836, 1582696, 366683, -7248294, 7678865, 5865852, 616865, -4764730, -5338645, -2257542, +-10778757, 12870406, 9762998, -1918240, 3740380, 1278290, -1896765, 9777493, -576063, -4370666, +14491757, -15370614, 4205310, 6777459, 156766, -6231461, 7023882, 1146219, 10065256, -3723200, +-837519, 2704756, 4159676, 737124, -1117228, 14390288, 6413460, -6495601, -9655623, 6926172, +-9656160, -2838437, -11149735, -1453846, 17303886, 6988449, 8495982, 56371, -8796093, -1525250, +-4166118, -2001992, 13015898, -2042257, -13797582, -1211181, 3022583, -9045738, -1220308, 5638219, +4803384, -6176700, -2878165, 5954972, 8413841, -2626909, 8748312, -170725, 2381023, 2771865, +950798, 2813204, 5304285, 4235375, 4978941, -3505230, -10022843, -12599287, 6366752, -699006, +5944235, -11599096, 4286378, 3425773, 1810329, -7557532, -6317897, -8054675, 6452115, 3418794, +-5740761, -5708012, 8088497, 2716030, -549756, -4779762, -8002061, -3180423, 3383897, -5055714, +711891, -9586904, -2624762, 1269163, 3426847, 6487011, -923418, 4193499, 5637682, -5496485, +-13395466, 9445170, 542240, -1992328, 8971113, -1210644, 482647, -5801964, 7917236, -4802311, +-6163278, -2293513, 6540699, 9859097, 8309688, 2717641, 1835562, -16882442, 7981123, -830539, +3507378, -5684389, -845572, -6375342, -1990181, -1378148, -8431558, -4164508, -3204046, -4531728, +9548249, -2634426, 12356084, -1096290, -46708, 7771207, 9207873, 14659260, 10692321, 264141, +-3479461, 56371, 1538672, -5838471, 3715147, -3512210, -4891968, -18486612, 3705483, -12822088, +-7797513, 11507291, 8887361, -21061982, -19327352, 323196, 7810935, -5142687, 4706748, -7164006, +-1067836, -12356621, -3440806, -11183558, -1068910, -3286724, 63351, 3868155, 3144453, 6462852, +-1112397, -6073084, 4751308, -7180112, -3015604, 1917703, 188442, 3223373, 6946036, -1439888, +680752, 1380832, -3127810, -1025960, -10720775, -12717935, -12248173, -233002, -12303471, 3833258, +1450625, -5018670, -5770826, -2638184, -2121714, -1238561, -7299297, -11592654, -690953, 17957796, +9977746, -2697776, -10791642, -11300596, 12587475, -11836393, -3736622, -2156074, -7632157, -5979668, +-7700877, -9343701, -12618077, -17545478, -2012729, -2730526, -1819992, 6070400, 6496138, 1728724, +6161668, -3299072, 1609539, -14516453, 2133525, 7900593, 8609262, 7941395, 3654480, 15291157, +-5430986, -10543608, -2363306, 2234994, -1705639, 5057861, 10457172, 20365124, 13156559, 7635915, +9897752, -7492034, -14260902, -4845260, -10525354, 12817793, 3446711, -2452426, -8392903, 14485851, +12910135, -4376035, -263604, 95026, -6743636, -6039261, -10459319, 3435437, 4547297, 6454262, +-9806484, 1057636, 3757560, -4716411, -9459129, 365609, 6754373, 7911867, 2160369, -20003274, +-6300180, -9869835, 4993437, 11944304, 915365, -11258183, 3637837, -10882910, 7010997, -2682207, +2001992, -7757785, 17246442, 12687870, -2865817, -3824132, -8136279, -723702, 14174466, 2873870, +17206176, 15216532, 14177687, 7428683, 4151623, -10251013, -3981972, -13513578, 17565880, -8533563, +-1107028, 8607114, 14026289, -11905649, -14690936, -12569222, 16707423, -5025112, 11651173, 1153199, +1609002, 25912612, -1509144, 3102040, -9417790, -15699716, 5739687, -1254667, 6101538, 4261145, +180926, -8446590, 4316442, 4898410, 3294777, -7909719, 7691750, 5684389, 19598472, -7017440, +2901787, 11076721, 11739756, 1654099, 11870216, -1293859, 2173254, 10325101, 9456444, 3322694, +-2110440, -13174812, -9074729, 9760850, 1692754, -2020245, -892279, 3445638, 21441550, 105764, +-4689568, 11196443, -2611340, 10664941, 4471598, 29335700, -3196530, 443992, 2308545, 5520644, +12037720, -496069, -675384, 7610145, -10428181, 12109123, 22564684, 7230041, -1106491, 12377022, +-970126, 755377, 25729538, -11637751, 8521215, 10087268, 592169, 1417339, 1874753, 3898757, +-14902463, -4975183, 8707509, -5628555, -8177081, -7518877, -7546258, 193274, 8803609, -2253784, +-22228066, -1031329, -17075180, 5261872, 6199786, -951335, 2523293, -8262980, -1687922, 7515656, +-21267068, 4060892, -5225365, 10264435, 7188702, 3939559, 170725, -9413495, -19233400, -2252174, +-16893180, 8706972, -565325, -6220724, 16350404, 7473780, -7487202, -6800007, -4233764, -4045322, +-5444408, -10669773, 976031, 1099512, 23966454, -2415919, -18311594, -1649804, 11348914, -809601, +-9776956, 3966402, -14405857, 7314330, -6518150, 4152697, -8728984, 1692217, -14790794, 34782256, +567473, 23279260, -3342022, -9298604, 5675800, -10670846, -9092446, 11588896, 12689481, -14874009, +-33315524, 27598386, -12037720, -11470784, -5828271, -1981591, -15940771, -5762236, -4994510, -13699335, +-24059334, -6032819, 149250, -12800613, 5954972, -5543729, 10350871, -9250286, -4083440, -13120051, +30760018, 26162256, -6174553, 5779416, 17736068, -19022410, 18919868, -8046085, -8329016, 6895033, +2211371, 3265786, -3165391, -4184909, 194347, 6234145, 5019743, -8403640, 9291088, -9041443, +-15491410, 11027329, 9264781, -12509629, -16035797, -17980880, -3056943, -2877628, 4641249, -11667816, +-15221901, -7393786, 24319178, 8851391, 7973070, -10392747, 9089225, 13271986, -10642929, 24598352, +4031364, -8395050, -11904039, 6859063, -10091026, -20409148, 4541391, 206695, -73551, 11876121, +10031433, -8562554, 1157494, -25985626, -3920768, -9709847, 21413096, 2317672, 2386928, -11496554, +9536975, -19882478, -4589173, -11622182, 14543296, 15302432, 13872207, 9293772, -175020, 12647068, +11525545, 1808181, -2233383, 5005248, -1074, -13164075, -1578401, 4778151, -10198400, 14356465, +-15170898, 11944304, 13201119, -4006668, -2990371, 5381594, 17627620, 12973486, -15938087, -3733937, +-4263292, -1545115, 3987877, -7728257, -7778186, 16983374, 442382, 24503326, -16214038, -15751256, +12516608, -8678518, 4520453, -10172630, 8358007, 9074729, 6295349, -4384088, -14252849, 879931, +4740034, -12432320, -21787832, -1378148, 1970316, -13538274, 23505282, -3431679, -6710350, 30443266, +29387776, 2034741, -4173635, -2105608, -6395207, 5960341, -15591805, 13197361, 1711545, -9860171, +17211544, 1104344, 3167539, -7014756, -10029286, -25979720, 4348655, -11266236, -5459977, -26071526, +-60029684, 19758998, 18711562, -6955163, 3970161, -14663555, 25521232, 16216186, -14886357, 3888556, +3243237, 90731, -6844568, -5024038, -31085900, 12753369, 14951318, -3802120, -274878, -2016487, +9973988, -8018704, 19275276, 5498095, -23496156, -13459891, 29228326, 19066434, -19495930, -4825396, +-7108171, -12077985, 1561221, -5011690, 3925600, 38008848, 10161893, 39835284, 22647900, 25555056, +23287850, 45921252, -3337190, -4624606, 10751377, -3605625, -39115876, 31106838, -13960791, 17683454, +-25992068, -20754356, -38667592, 7233799, -3914863, -13245679, 8932458, -18408230, -375810, -26146688, +-26171920, 6749541, 14470819, -21371220, -6134824, -15028627, -20782274, -23209466, -17024176, 11560978, +-10799695, -29199336, 39106752, 23843510, 38533908, -8257612, -22469658, -57770532, 24003498, 28791850, +-14060649, -6550899, -2175938, 32684164, 387621, 6400575, 6366216, -8615704, 5959804, 14803142, +-3802657, -15750719, 3051574, 27637578, -15745887, -10227391, 5546951, -4784594, 20596516, -6158446, +8906152, -11813308, -13864154, -14018773, 13253195, -5080947, 11680700, 13538274, -4440460, 983011, +-631897, -12736189, 3178276, -11663521, 11886322, 29947734, 50054084, -1649804, -2228551, -22564148, +10826539, 15549392, -1326071, 17562122, 25851946, 10080825, 14296872, -24618752, -14997489, 18230526, +49793168, -10581726, -30842160, 6263673, -11017665, -1925219, 12565464, -1188632, -14907295, -8013872, +-8475581, -36115308, -16087874, -1433982, 3804267, 10300942, -4303557, -15112916, -10598369, 1326608, +-9477919, -15312095, 6870874, 18088254, 5978595, 9475772, 3666828, 27303108, -8676371, -3429532, +-10807748, 6345814, -6748468, 6028524, 30907122, 6154688, -32935420, -7968775, -9682467, -28035936, +17744658, 8504572, -3367254, 4058744, 1632088, -12509629, -238908, -772557, -12652974, -3615289, +26924076, 39929776, 18630494, -13681081, -22056268, 10554882, 18039400, 2265059, 14405320, -9857487, +-7141994, 15231565, 4591857, 543313, -33498060, -43141872, -1522566, -25029996, -14882062, 9571871, +36316096, 8420283, 1728188, -9960029, -12657805, -17580912, -16086800, 3741990, 10972568, -3041911, +-18059264, -28148142, 11645267, 1879585, -16081431, -25855704, -18173080, -28372018, -53609244, -30754114, +-4416837, -4295504, 65461744, -5238250, -1524177, 40843528, 5704254, 7010997, 24382530, -5043902, +-15404437, 20564304, -28987272, 7413651, 4706748, -12592307, -40674416, 27802398, 8334384, -2559801, +-41174776, 11045045, 6518150, -21740588, 3763465, 19177566, 11876658, 5623186, -18555332, -3754875, +-6835441, 3348464, -6889128, 1786170, -14321032, -20764020, 23001160, -15712064, 34877280, -21347062, +-19216220, -13066364, -24194624, 2222109, -279173, 36545340, -26818312, -28394566, 14892262, 9495636, +-23378580, -31245888, -3267396, -17536352, 20542828, 4488241, -25753160, 17041894, -4219806, -39711268, +26425324, -17561048, 17314086, -29416232, -7080254, -489089, -12321724, -4721780, 3560528, 37970196, +-10027138, -2940979, -10750303, 11396159, -17814450, 14723148, 29095182, -757525, 29043642, 24459302, +-4276177, 48936856, -4109210, 7759932, -3929895, 16563005, 40672804, 349503, 27348742, -54434416, +1473174, -61190936, -20896626, -10887205, 17852568, 55363204, 46967616, 16916802, 27481348, -18855980, +-15981573, 2091649, -4741644, 12329240, 3482682, -13286481, 18140332, 26999238, 22327924, 16515760, +13859323, -1145146, 1914482, -10093710, 25470230, 11509975, -5721434, -16854526, 4662187, 9995463, +-3613141, 33478196, 34978212, -21470542, -16113107, -46708, 26935350, 16486232, 3565897, 2541010, +-7567196, -13426068, 5945309, 41786812, -18329846, -22115860, -24102282, 21310018, 7963943, -13865228, +-21135534, -33009508, -39093868, 2980707, 6861747, 5589900, -9865540, -4095251, -12062953, 6070937, +-31962072, -50990924, -24343338, -5053566, -10685879, -21085606, 22201222, 39454108, -12293270, 19144816, +42146516, 27191438, 6037114, -34978752, -2248952, -33930780, 27925878, -3202435, 24041080, 14690936, +869194, 16029355, -6576669, -1475858, 13877576, 16892644, 2892124, 366683, -208306, -14841796, +-9481140, 4313221, -20730196, 833761, -7575249, 772557, -17517560, 3300682, 1350767, -16010027, +13932874, 6015639, 9549323, -20182588, -5148055, 4078072, -703301, 1698660, 12081743, 2804614, +3652333, -2139431, -4151623, -3001109, -1298691, 7747584, -3042448, -12859132, 10940892, -17760226, +-5246840, -5994701, 2534568, -8632347, -10013179, 13779329, -1354525, -13579076, 8754754, -19000398, +15681999, 4833986, 1102196, 15806553, 17912698, 2457258, 5366025, -13179644, 17366700, -8381629, +-11299522, -1118839, 2824478, 31963146, -14192719, -24057722, 20518670, -8238284, 20342576, -4262755, +1098975, -9961640, 9313637, 14603963, -9563818, -91423208, -172334496, -62763432, -135378976, -154059408, +35110820, -7331509, 48903036, 194666704, 211407424, 148510848, 212960592, 174477680, 56670484, 59675888, +43840340, -120837296, -124071944, -70152920, -120445376, -130364072, -44746044, -39942660, -109801912, -83541944, +-14896557, -50335408, -60606820, -16726750, -46683072, -81887848, -46926276, 12902619, -33386392, -41407780, +45697380, -9824201, -45521284, 38705708, 73985104, -19010062, 17943836, 114594560, 15403363, -38654704, +76701136, 66092568, -66883380, 37200324, 85140208, -27284854, 9844065, 146701056, 113302848, 56461104, +208277456, 230522176, 119902600, 212926224, 276783808, 173523120, 166246368, 227798624, 150298624, 96195992, +109529720, 59180892, -51406464, -110622792, -147495088, -263307808, -314878560, -359921472, -394814336, -381344256, +-317797504, -149840128, -94480152, }, { 976031, -1103807, 2146947, 2560874, 2877091, 2073932, 436476, -99321, -2056753, 2018635, -3248606, --2457795, 1020592, 904628, -3114925, 5828808, -1801739, 1736241, -1864553, -1691680, 1253594, --514859, -1008780, -564251, 361314, -1848983, -861141, -3647501, 2195802, 1664300, -2878702, --1264868, -1255204, -3185792, 1018444, 560493, -125628, 726923, 1198833, 242129, 1040993, -3312494, -4687957, 895501, -739271, 3169686, 2712272, -2182917, 6245956, -3831648, -4067871, -1019518, 2785823, 1735704, -712428, -912144, -646393, 904091, 1036698, -353798, -2431488, --2031520, -1283122, -3136937, 408022, 1988570, 609349, -724776, -475131, 3759707, 1663226, -1451699, 2830920, 1035624, 1073205, 1397475, -4356171, 3650722, 3905736, -1825898, 3918621, --2334315, -499827, 5216238, -2112587, 2493766, 1522029, -5734318, -2583960, 4349728, -1671279, --798864, 2733210, 1828582, 1950452, 548145, 6668474, 1166621, -1700807, 1523640, -2291902, -4156992, -1178969, -2235531, -978179, -5356898, -1819456, -3936338, 1308891, -32212, 1462973, --1553704, 2264522, 1106491, -244813, 732292, 363998, 563714, 729608, -2807298, 7117835, -1096290, -2597918, 5322538, -1273995, -4502737, -4999342, 4922570, -978716, -332323, 3210488, -422517, -852551, 2583960, -286689, 1529008, 402116, 1930588, -986769, 2102387, -932008, -2491081, 3463891, 1998234, -2082522, -2001455, -1058173, 1073205, -2208150, 1718524, -1061394, -2148558, -16643, 4582730, 914291, 1056562, 3847754, 65498, 2780991, 1334124, -296890, -312459, -2977486, 1417876, 255014, 4712653, 1676111, 1558536, 224412, 1406602, 5162014, --4842039, 2762738, 745714, -3198140, -1418950, -1979443, -632434, -1837172, 1321239, 5952825, -3758633, 4446365, 3542811, 6065031, 4429722, -5497022, -9963250, -1262184, 478889, -2433636, -5266167, -226023, 7880728, -3681324, -3683471, 3387119, 187905, 272730, 3115462, -5763846, -1471563, -4133369, 5439576, 3192771, -34897, 8257612, 347355, -816044, -1054415, -1481764, --2091649, 3889093, 2046015, -2050847, -723165, -5801427, -2614025, -802085, 5940477, 4081293, -607201, 2992519, -61740, 3183108, -237297, 1261647, -3822521, 3396246, 8018704, 2186675, -136902, 21475, 2100776, 1928977, 271120, 1060857, 1648194, -371515, -391916, 2110440, -9116068, 2870112, 7066295, -4382478, -3580392, -1626182, -4585415, -5384279, -2255932, 3520263, --6526740, -1156957, -952409, -10213432, 1789928, -10320270, -3544422, -1626182, 2177549, -262530, -1886028, -2260227, -307627, -7081864, 2281702, -2560338, -3995393, 392990, 1692217, -645319, -281320, 2559801, 4918275, -8998493, 2142652, 229781, -2786360, -3124052, -796180, 814970, --1403381, -5597416, -1481764, 1010391, 2443837, -779000, 6173479, 132607, -16643, 2184528, --4464082, 5640366, 1591822, 3138547, 1223529, 2522757, -1089311, -1122597, 1282585, 501974, --1490891, -2411087, -2338073, 4915590, 5369783, -173946, 5922223, 373125, -783832, 730681, -483721, -1093069, -71941, -4131222, -2378338, 3707094, 4329864, -5077188, -1235340, 2131915, --3417183, -9722195, 2398202, 3623342, 4205310, -2214593, -2614025, -3448322, 5277441, 6084895, -999654, 2419677, -4799626, -3820374, 4454418, 1734093, -3616363, 6287832, -6324340, 1078037, -538482, 5900748, 2089502, -1259499, 885837, -1993402, 3140695, -7610145, -2350958, -10981158, --4903242, 5619965, -566936, 8596377, -1277216, -7106561, 4402342, 1031866, -3055332, -305480, -197569, -2863133, 1730872, 5149666, 5585605, 175020, 2543695, -260382, 6318971, -3357054, -2544231, -653372, -477278, 140123, 1815161, -807991, 7597261, 569083, -234076, -1893007, -6259915, -7926899, -884226, -5293547, -5506148, 2305861, 1360968, 12144557, 867047, 4626754, --9683541, -2127620, 2441152, -4910758, 3658775, 1244467, 1090385, 3152506, 3609383, 8056285, -3726421, -983548, 2721936, -3637837, 1386738, 3402688, 37044, 906775, 3715147, 4729296, -11052561, 2367064, -1352378, -7133941, -56908, 5866926, -8490613, 1224603, -386547, 3007014, --4126927, -4909685, 9611063, -5718212, 2189897, -119185, -5595269, 13772350, 3752728, 7341710, -4083977, 8002598, -1155883, -2663954, 5210332, -4304094, 4070019, -3384434, 2342368, 5579700, -3229279, -2164664, -125091, 2948495, -4439923, -3294240, 566399, -376347, 8295193, -4243428, --7177427, -1014149, 4476967, 6765111, -3811784, -7213398, -962610, -3491809, 3252901, -13280039, -7000260, 1808181, -3222299, 3584150, -10897406, -9177808, 824634, -4714264, 9691594, 8529805, -9138617, -6672769, 3366181, -227096, 9116605, 295816, 6359773, 2294050, -3115462, -8857296, --7980586, 2072322, -10533407, -537945, -2704756, -5364951, -7123204, -4409858, -217433, 7848516, --243203, 2816962, -11988864, -6944962, -1511292, -7749732, 249645, 6949794, -8213588, 2878702, --352187, -3129958, -991064, -2117956, 7850664, 3932580, 3791919, -2360085, -2707440, 10734734, --3611531, -3461744, -9431748, 6294275, -13288629, 1365800, -4526359, 1617055, 4404489, -3565897, --7201587, -4728759, 237297, 9044127, -5001490, -1464047, -6399502, -5363341, 2782065, 2872260, -7151121, -9145059, -542777, 2067490, 1105417, -12633109, 2629594, 555125, 1404991, -17154636, -14218489, -228170, -965294, -814433, -6043556, 1236414, -471373, 4819490, -5328444, 5476620, -1015223, -4183298, -7094749, -8455717, 3300682, 266825, -1417876, 119722, -5353140, 4568235, -2968359, 8795019, 4697084, 3251827, 4290673, -1567126, -5874442, -4154844, -510564, -3007014, -3144990, -4804458, -7643968, -7745974, -432181, -10466298, 3764539, 5078799, -7001334, 5985037, --8287677, 3490198, -11807402, 1283658, -2971581, 644782, -3888556, -280247, -11126113, -1772211, --4534412, -6447820, -2808372, -5001490, 467615, -4456029, -3760244, -6361384, 1660542, -6008659, --1699196, 10193031, -2980171, 667867, 1895154, -1695975, -11418707, -10777684, -3117073, -6785512, -792958, 4662724, 3144453, -10423886, -490700, 1737851, -9777493, -11007464, 5779416, -10791642, -1870995, 7102266, -5426691, -12360379, -5523328, 277562, 7878581, -3299609, 14078366, -968515, --1421097, -8246337, -6192806, -923418, 2573759, 881005, -3306588, -2399813, -1034013, -2982855, --6533182, 5190468, -5500243, -2978023, 4958540, 1759326, -9127342, -9050570, -8967892, 7551626, --8398272, -8304320, 13400298, -8489003, 5594195, -944893, 3179350, -12260521, 5137855, 1048509, --2685428, -261993, -3129958, 4446365, 2261300, 12255152, -3736622, -1791538, 4823249, 11934104, -2309082, 2845416, -6300180, -2988760, -10362682, -1359894, -1226750, 607738, 5790690, -1367410, -2556579, 12854300, -2986613, 556198, -2547453, 936303, -13152800, -12253005, 5003637, -957241, -5944235, -1023276, -2663417, -3799436, 5025649, 3067681, -2962991, 2232309, 5114233, -2835752, --17869212, -7825431, -3595961, -2074469, 7819525, -14021994, -10334765, 8446590, 5184026, 21406118, -5943698, 4859756, 5791227, 2629594, -3978750, 333397, -4188667, 6754373, 173409, 6820408, -70330, -291521, -9584220, 4801774, -6555194, 4879620, -1142998, 5123896, 1898376, 6910603, --11099806, 1191317, -7765838, 9029095, 356482, -9226663, 11872900, 8862128, 5510443, -5551782, --18659486, 5234492, -2270964, -2343979, 8722005, -924492, 3845070, 8675297, -2294050, -11094437, --506806, 4935455, 2753611, -2983929, -1780801, -8110509, 2363843, 1111323, 926639, -1219771, -159451, 6931004, -5650030, 2931852, -2962991, 4899484, -4757750, -19732154, 4403415, 5201206, -20626580, -3935801, -2960843, 9944460, 12927315, -20250234, -11442867, 11582990, -5546951, 717260, -4904853, -12768401, -28432684, -10930155, 16608639, 13330505, 11262478, -2983392, 6431714, -2995740, -5939403, -5625334, 2259153, -14127758, 3805878, -4747013, 7676717, 7591892, 492848, -6466610, -6994891, 4642323, 11899207, -825707, -7038915, -3221762, -18200460, -9014599, 4696547, -834297, --12155294, 8768176, 11617887, -15842524, 15847356, -1086090, -1620813, 10304700, 2115272, 9773735, --1177895, 3780645, -3542274, -1450625, 4700305, 19237696, -6874095, 12430709, -1153736, 1611150, -4264903, 10924786, -9967008, 1658931, 14762339, 5126044, -7706782, 4686346, 4960151, 2098092, -10259066, 9404368, -1133335, -13254806, -3548180, 13314399, 8334921, 10011032, -6844031, -3468723, --1322850, -1548873, 14166413, 1755031, -15157476, -6721624, -4858145, 9452686, 1530619, 1986422, -7748121, 17678086, -26574036, 17346300, -3840238, -3118146, -7182796, 5171141, 4917738, 10231686, -1137093, 9770514, -1483374, -2544768, 2522220, -1553704, 4450123, 9047349, 508954, -556198, -11191611, -8611409, -2237678, 3040837, -1668595, 10571525, -12926778, 1341640, -11196980, 1962263, --11868068, -1276142, -455803, 6426882, 14205067, -8404714, -5737003, -8676908, -1486596, -12822625, --9666361, -8199630, 4814122, 11496017, -1032940, 22255446, -14916958, 20078436, -14931454, -2196876, -4464082, 5544803, 17482128, 12434467, -15990700, 9331353, -7671349, -17027934, -858457, -12211129, --7330973, 1112397, 17885854, -1812476, 8666170, 16729971, -11635066, 6978248, -19419694, 13922673, --11404212, -4855998, 21435108, 8199093, 23002234, -7887171, 1465658, -8436926, 7585986, 29198798, -8458401, 10822781, -12737799, -1292785, 2005213, 12114492, 10766409, 19222126, -13168370, -3600256, --14446123, -11922292, 2302639, 2549600, 10640245, -7650411, 7843147, -19903952, 14724222, 11689827, -6143414, -2101850, -1224066, 2936147, 7673496, 3674882, 3101503, 1487132, 15858093, 14093935, -6696928, 2777770, -9707163, -9148280, 31334470, 2856153, 5053029, 18532248, 8709657, -2885681, --2243047, 12571906, 22902914, -13662828, -5266704, -15549929, -15183246, 23389856, 10636487, 2620467, --3084324, 9639517, 16954920, 13224741, 16982838, 8070781, -6343667, 568546, -905701, 6248104, --14203994, -10743324, -4272419, -13335337, 14527190, -1979443, -3864934, -12754979, -2164127, -11920682, --28686086, 4579509, -3572339, -9438728, 6445672, -15608448, -916976, -8748312, -22907208, -5732708, --9893457, -11366094, 18417894, -5428839, -6504728, -3879429, -279710, -5220533, -6302865, -1632088, -5040681, 14897631, 11927661, -1085553, -634045, -26702886, 1894081, 2860985, 11011759, -6733435, --5035849, 38748660, -6374805, -20092394, -18313740, 15569793, -10482405, 3882114, -21708912, 4650913, --5668283, -12822625, -9675488, -26263188, 4719096, 6243809, 18685256, 4212289, -9004399, 13021267, -2449742, 12087649, 15622407, 41336376, 12266963, 1431835, -15810848, -20386600, -4283693, -182536, --1865090, -19729470, 7500624, 15076409, 3588445, -5522791, -17055852, -7242389, -2492155, 5554467, --6139119, 10507101, -5172751, -6795175, 20061256, 10640781, 22782654, 590558, -6460705, -8621073, -24125906, -20290500, -7597797, 28384366, -16821240, 5980205, 5914707, 7670275, 1718524, 16170015, --4851166, 14616847, -5323075, 3565897, 3433826, -6800544, 10568304, -15440944, -11079405, -9811853, --4737349, -13611825, -26125212, -4158065, -7817914, 4792647, -6731825, -34068756, 9657771, 22527104, --1262184, -3896609, 34147676, -41518376, -9162239, 24437828, -5790690, 19205484, -13458280, -7399692, -6354941, -39362840, 13066901, -12659416, 20205136, 16014322, -21444234, 43655120, 6294275, 3649649, --2108292, 18251464, -30564062, 14300094, -1298154, -2857227, 8438537, -17430588, 28413894, 28423556, --46390480, 9864466, 9279814, 2321430, 26962194, -10606422, -32422708, -32560148, 3700651, 5167383, --13709536, 9764071, -17616882, 6995428, -7398081, 18271328, 23206246, 1721745, 22498650, 20475182, --9721658, 726923, -12730820, -2473364, -2119030, 8525510, -210990, -1127966, -1155883, -21415244, --32732482, -12618077, 18905910, 14709726, -13326747, -15711527, 11026792, 10945187, -20783884, 12177843, --13373991, -1673964, 18401788, 24773372, 1535451, -12956843, 10476499, 2915209, 16213502, 3688303, -13811004, 13874355, -2058363, -47423420, 7094749, 2484639, 21312164, -5914707, 21767432, 21166672, --11512660, -64521148, -6963216, 4097399, -5948530, 41086196, 43632036, 30560840, 43493524, -8990977, -21760988, -14436459, 30107184, 21431886, -29839286, 43540232, -39639864, -33030446, -30161408, -24848534, --48029544, 11589432, 19429896, -1436130, 26249766, 10771241, -29796336, -6645925, 7914551, 8838506, -9878962, -5100811, 15747498, 2403034, -7917236, -3083250, 6509023, 21664888, 28147068, 21378736, -33499134, -29685204, -7118909, -6845641, -30084636, -6407555, 6924024, 2767570, 5034239, -11412265, --12676596, 17209934, 37633576, -15890842, 20225000, -10997801, 6490233, -10040560, -238371, -26898306, --8508867, -386547, -37164352, -21525840, -36290328, -30906048, 23177254, 51532092, 41997800, 2501819, --562641, 1502165, -7019587, -15858630, -58846956, -18882824, -6601902, 6529961, 4811974, -19843286, --12750147, 9674414, 29155848, 17920214, 11057930, 19659676, 32549410, 14172318, -27572616, 25807384, --15298674, -6001680, 20260972, 44328356, 10619844, 55238648, -21123186, -34502548, 21144660, -3439732, --20921860, 9935870, 22405234, 19468550, -40354976, -34770980, 8471286, -16176457, 3903589, 19607062, --10905996, -7903277, 32240708, 8803609, -4775467, -10327249, -9483825, 12209518, -7586523, -1397475, --1250909, -13168370, -5419175, -21930104, -29613800, 10547366, 15649787, -18391050, 13165685, 9375914, --6763500, -12684649, 1585917, 23323820, 12922483, 4366908, -23596550, -25692494, -13076565, 7253663, -28543278, -21463562, -12008729, -9572408, 16804596, 47095928, 11820287, -45329620, -10746545, -4948876, -22852448, 1007170, 11489038, -5441724, -11571179, -9541270, -26680874, 24782498, 24689620, 11032160, -26050050, -7640747, 16367583, -7167227, -20804284, -20520816, -24646670, 5339718, -45193256, 46868832, --4808753, -15064598, -28314572, 31556198, 22803056, 6562710, 1676111, 13005698, 11414949, -27292906, --37852620, 8179229, 23229330, 34841312, -3370476, -12080132, -27548458, -17577690, 12481175, -3975529, --24088860, -44742820, -44883480, 5150203, -16091632, 19566798, -51208360, -19248432, 5471252, 3251827, -5242008, -18631032, 3064459, -4904853, -12788802, -5426691, -26192858, 16867948, 21402358, 15123117, --34004868, -19801410, -4774930, 6363531, 10974715, 12290586, 8779450, -7314330, -6377490, -8053064, -17150878, 55479704, 33216204, -35156992, -34973380, -23642184, -43859668, 41914584, 20009178, -18845242, --45552424, -43709884, 39484708, 22473416, 880468, 29104310, -40723808, -9264244, -3195456, -14816027, --2110977, -19317690, -41648836, 2286533, -33273648, 29356102, 29090888, -21547850, -10274636, -9168145, --12032351, 23686744, -37677064, 33557116, 49495740, 53464288, -59426780, 11253888, -1311039, -4955856, -25993678, -10678362, -17164836, 17680232, 9638443, 36510444, -3000035, -28846610, 1628330, -13200582, -22333830, -33237142, -10906533, -15705622, -21218212, 30109868, -21226266, -3359738, 21809844, 11847667, --6352794, -11887396, -29994978, 3661997, 41959148, 24502788, -640487, 11717208, -8065949, 32905892, --21313776, 14893873, -11192685, 20167556, 35737348, -8277476, -21092048, 10394895, -29205240, 49876920, -7289633, -27576374, -7808251, -42644192, 6740951, 59192164, -9512279, -36099736, -23240604, 35964984, -12380780, -20103668, 382252, 8724152, 21936008, 49866180, -40036076, 17827872, 42462196, -6597070, --48194364, -47374564, -27380416, 83682608, -60834992, 22150756, -60921964, -22340272, 21578452, -56521232, -9662603, -50788524, 22124450, 23774254, 47029892, 20772610, 10588168, 12231530, -14998026, -36259724, --25417080, -23840290, 9842454, 5792837, -6464463, 21528524, 33017562, -14986215, -21275658, 23097798, -3768297, -30881888, -7457137, 13941464, -25820270, -4507568, 5229660, 12956306, 6498286, 18338436, -30985504, 5581310, -20462298, -2262374, 5600638, -15838766, -7575786, 14770393, -11634530, -20034948, -27519466, -6633040, -7449621, -11001022, -11536819, 18329846, 4086125, 4344360, 23621784, -11337103, --19249506, -838056, 1213865, -7646653, 5583995, -1008244, -7262790, -861141, -24174224, 5633387, -3989488, -3585224, 12073153, 9039296, 3835406, 6193880, -24883966, 29377040, -11242614, -9805410, -8602819, -25726854, 8969502, -19304804, 4638565, -25692494, 42807404, -1687385, 24432458, -21230024, -3155727, -3414499, 8020315, 7373385, 13283260, -6015102, 9880572, -5323612, 5626407, -382252, -4527433, 10780905, -869194, 16415365, -5978595, 12556337, 999117, 98247, -4118874, 8276939, --5755256, 7548942, -3743064, 1126355, -3062849, 4444755, -2457258, 9674414, -2523293, -5624260, -14704357, -9282498, 7800198, 6793028, 2455111, 7732015, -8633421, -5388037, 6818261, 6972880, --3723737, -31139, 7208566, 191663, -9731322, 5185636, -4920422, 5949067, 6908455, 4150549, -2357400, 3178276, -10636487, 6181532, 2896419, -2149631, 3726421, -3879966, 2192581, -1301375, --799938, -67646, 3269007, 8511551, -10464688, 10337986, -2522757, -1793686, 4008278, -4977867, -1751810, 6673843, -1817308, 10722923, -35477504, -111029200, -16143171, 54188528, 28155658, 131448008, -24639154, 28388124, 17997524, -35213364, -49570364, -35344360, -63605244, -54742580, -30872762, -12642236, -36810556, 99817728, 79352208, 68219648, 38998840, -30584462, -49636400, -36647884, -68507416, -65093452, --19681150, -9077413, -14899242, 25327960, 39834212, 26189100, 48518100, 37283000, 11733851, 34287796, -7329899, -5072893, 3514357, -20641612, -53967876, -46189152, -38873212, -55089400, -22679574, 16072304, -11462731, 35243964, 40349608, 34869764, 36253284, 36542656, 23630910, 22622130, 2943663, -20382304, --37493452, -25983478, -35247184, -47312284, -22750442, -21736830, -17103634, 6636262, 18506478, 17113834, -34025268, 41733660, 20869782, 29452738, 25858388, -6898255, 3727495, 11418707, -13035226, -13003013, --19846508, -18107046, -9757629, }, +1103807, 2146947, 2560874, 2877091, 2073932, 436476, -99321, -2056753, 2018635, -3248606, +-2457795, 1020592, 904628, -3114925, 5828808, -1801739, 1736241, -1864553, -1691680, 1253594, +-514859, -1008780, -564251, 361314, -1848983, -861141, -3647501, 2195802, 1664300, -2878702, +-1264868, -1255204, -3185792, 1018444, 560493, -125628, 726923, 1198833, 242129, 1040993, +3312494, -4687957, 895501, -739271, 3169686, 2712272, -2182917, 6245956, -3831648, -4067871, +1019518, 2785823, 1735704, -712428, -912144, -646393, 904091, 1036698, -353798, -2431488, +-2031520, -1283122, -3136937, 408022, 1988570, 609349, -724776, -475131, 3759707, 1663226, +1451699, 2830920, 1035624, 1073205, 1397475, -4356171, 3650722, 3905736, -1825898, 3918621, +-2334315, -499827, 5216238, -2112587, 2493766, 1522029, -5734318, -2583960, 4349728, -1671279, +-798864, 2733210, 1828582, 1950452, 548145, 6668474, 1166621, -1700807, 1523640, -2291902, +4156992, -1178969, -2235531, -978179, -5356898, -1819456, -3936338, 1308891, -32212, 1462973, +-1553704, 2264522, 1106491, -244813, 732292, 363998, 563714, 729608, -2807298, 7117835, +1096290, -2597918, 5322538, -1273995, -4502737, -4999342, 4922570, -978716, -332323, 3210488, +422517, -852551, 2583960, -286689, 1529008, 402116, 1930588, -986769, 2102387, -932008, +2491081, 3463891, 1998234, -2082522, -2001455, -1058173, 1073205, -2208150, 1718524, -1061394, +2148558, -16643, 4582730, 914291, 1056562, 3847754, 65498, 2780991, 1334124, -296890, +312459, -2977486, 1417876, 255014, 4712653, 1676111, 1558536, 224412, 1406602, 5162014, +-4842039, 2762738, 745714, -3198140, -1418950, -1979443, -632434, -1837172, 1321239, 5952825, +3758633, 4446365, 3542811, 6065031, 4429722, -5497022, -9963250, -1262184, 478889, -2433636, +5266167, -226023, 7880728, -3681324, -3683471, 3387119, 187905, 272730, 3115462, -5763846, +1471563, -4133369, 5439576, 3192771, -34897, 8257612, 347355, -816044, -1054415, -1481764, +-2091649, 3889093, 2046015, -2050847, -723165, -5801427, -2614025, -802085, 5940477, 4081293, +607201, 2992519, -61740, 3183108, -237297, 1261647, -3822521, 3396246, 8018704, 2186675, +136902, 21475, 2100776, 1928977, 271120, 1060857, 1648194, -371515, -391916, 2110440, +9116068, 2870112, 7066295, -4382478, -3580392, -1626182, -4585415, -5384279, -2255932, 3520263, +-6526740, -1156957, -952409, -10213432, 1789928, -10320270, -3544422, -1626182, 2177549, -262530, +1886028, -2260227, -307627, -7081864, 2281702, -2560338, -3995393, 392990, 1692217, -645319, +281320, 2559801, 4918275, -8998493, 2142652, 229781, -2786360, -3124052, -796180, 814970, +-1403381, -5597416, -1481764, 1010391, 2443837, -779000, 6173479, 132607, -16643, 2184528, +-4464082, 5640366, 1591822, 3138547, 1223529, 2522757, -1089311, -1122597, 1282585, 501974, +-1490891, -2411087, -2338073, 4915590, 5369783, -173946, 5922223, 373125, -783832, 730681, +483721, -1093069, -71941, -4131222, -2378338, 3707094, 4329864, -5077188, -1235340, 2131915, +-3417183, -9722195, 2398202, 3623342, 4205310, -2214593, -2614025, -3448322, 5277441, 6084895, +999654, 2419677, -4799626, -3820374, 4454418, 1734093, -3616363, 6287832, -6324340, 1078037, +538482, 5900748, 2089502, -1259499, 885837, -1993402, 3140695, -7610145, -2350958, -10981158, +-4903242, 5619965, -566936, 8596377, -1277216, -7106561, 4402342, 1031866, -3055332, -305480, +197569, -2863133, 1730872, 5149666, 5585605, 175020, 2543695, -260382, 6318971, -3357054, +2544231, -653372, -477278, 140123, 1815161, -807991, 7597261, 569083, -234076, -1893007, +6259915, -7926899, -884226, -5293547, -5506148, 2305861, 1360968, 12144557, 867047, 4626754, +-9683541, -2127620, 2441152, -4910758, 3658775, 1244467, 1090385, 3152506, 3609383, 8056285, +3726421, -983548, 2721936, -3637837, 1386738, 3402688, 37044, 906775, 3715147, 4729296, +11052561, 2367064, -1352378, -7133941, -56908, 5866926, -8490613, 1224603, -386547, 3007014, +-4126927, -4909685, 9611063, -5718212, 2189897, -119185, -5595269, 13772350, 3752728, 7341710, +4083977, 8002598, -1155883, -2663954, 5210332, -4304094, 4070019, -3384434, 2342368, 5579700, +3229279, -2164664, -125091, 2948495, -4439923, -3294240, 566399, -376347, 8295193, -4243428, +-7177427, -1014149, 4476967, 6765111, -3811784, -7213398, -962610, -3491809, 3252901, -13280039, +7000260, 1808181, -3222299, 3584150, -10897406, -9177808, 824634, -4714264, 9691594, 8529805, +9138617, -6672769, 3366181, -227096, 9116605, 295816, 6359773, 2294050, -3115462, -8857296, +-7980586, 2072322, -10533407, -537945, -2704756, -5364951, -7123204, -4409858, -217433, 7848516, +-243203, 2816962, -11988864, -6944962, -1511292, -7749732, 249645, 6949794, -8213588, 2878702, +-352187, -3129958, -991064, -2117956, 7850664, 3932580, 3791919, -2360085, -2707440, 10734734, +-3611531, -3461744, -9431748, 6294275, -13288629, 1365800, -4526359, 1617055, 4404489, -3565897, +-7201587, -4728759, 237297, 9044127, -5001490, -1464047, -6399502, -5363341, 2782065, 2872260, +7151121, -9145059, -542777, 2067490, 1105417, -12633109, 2629594, 555125, 1404991, -17154636, +14218489, -228170, -965294, -814433, -6043556, 1236414, -471373, 4819490, -5328444, 5476620, +1015223, -4183298, -7094749, -8455717, 3300682, 266825, -1417876, 119722, -5353140, 4568235, +2968359, 8795019, 4697084, 3251827, 4290673, -1567126, -5874442, -4154844, -510564, -3007014, +3144990, -4804458, -7643968, -7745974, -432181, -10466298, 3764539, 5078799, -7001334, 5985037, +-8287677, 3490198, -11807402, 1283658, -2971581, 644782, -3888556, -280247, -11126113, -1772211, +-4534412, -6447820, -2808372, -5001490, 467615, -4456029, -3760244, -6361384, 1660542, -6008659, +-1699196, 10193031, -2980171, 667867, 1895154, -1695975, -11418707, -10777684, -3117073, -6785512, +792958, 4662724, 3144453, -10423886, -490700, 1737851, -9777493, -11007464, 5779416, -10791642, +1870995, 7102266, -5426691, -12360379, -5523328, 277562, 7878581, -3299609, 14078366, -968515, +-1421097, -8246337, -6192806, -923418, 2573759, 881005, -3306588, -2399813, -1034013, -2982855, +-6533182, 5190468, -5500243, -2978023, 4958540, 1759326, -9127342, -9050570, -8967892, 7551626, +-8398272, -8304320, 13400298, -8489003, 5594195, -944893, 3179350, -12260521, 5137855, 1048509, +-2685428, -261993, -3129958, 4446365, 2261300, 12255152, -3736622, -1791538, 4823249, 11934104, +2309082, 2845416, -6300180, -2988760, -10362682, -1359894, -1226750, 607738, 5790690, -1367410, +2556579, 12854300, -2986613, 556198, -2547453, 936303, -13152800, -12253005, 5003637, -957241, +5944235, -1023276, -2663417, -3799436, 5025649, 3067681, -2962991, 2232309, 5114233, -2835752, +-17869212, -7825431, -3595961, -2074469, 7819525, -14021994, -10334765, 8446590, 5184026, 21406118, +5943698, 4859756, 5791227, 2629594, -3978750, 333397, -4188667, 6754373, 173409, 6820408, +70330, -291521, -9584220, 4801774, -6555194, 4879620, -1142998, 5123896, 1898376, 6910603, +-11099806, 1191317, -7765838, 9029095, 356482, -9226663, 11872900, 8862128, 5510443, -5551782, +-18659486, 5234492, -2270964, -2343979, 8722005, -924492, 3845070, 8675297, -2294050, -11094437, +-506806, 4935455, 2753611, -2983929, -1780801, -8110509, 2363843, 1111323, 926639, -1219771, +159451, 6931004, -5650030, 2931852, -2962991, 4899484, -4757750, -19732154, 4403415, 5201206, +20626580, -3935801, -2960843, 9944460, 12927315, -20250234, -11442867, 11582990, -5546951, 717260, +4904853, -12768401, -28432684, -10930155, 16608639, 13330505, 11262478, -2983392, 6431714, -2995740, +5939403, -5625334, 2259153, -14127758, 3805878, -4747013, 7676717, 7591892, 492848, -6466610, +6994891, 4642323, 11899207, -825707, -7038915, -3221762, -18200460, -9014599, 4696547, -834297, +-12155294, 8768176, 11617887, -15842524, 15847356, -1086090, -1620813, 10304700, 2115272, 9773735, +-1177895, 3780645, -3542274, -1450625, 4700305, 19237696, -6874095, 12430709, -1153736, 1611150, +4264903, 10924786, -9967008, 1658931, 14762339, 5126044, -7706782, 4686346, 4960151, 2098092, +10259066, 9404368, -1133335, -13254806, -3548180, 13314399, 8334921, 10011032, -6844031, -3468723, +-1322850, -1548873, 14166413, 1755031, -15157476, -6721624, -4858145, 9452686, 1530619, 1986422, +7748121, 17678086, -26574036, 17346300, -3840238, -3118146, -7182796, 5171141, 4917738, 10231686, +1137093, 9770514, -1483374, -2544768, 2522220, -1553704, 4450123, 9047349, 508954, -556198, +11191611, -8611409, -2237678, 3040837, -1668595, 10571525, -12926778, 1341640, -11196980, 1962263, +-11868068, -1276142, -455803, 6426882, 14205067, -8404714, -5737003, -8676908, -1486596, -12822625, +-9666361, -8199630, 4814122, 11496017, -1032940, 22255446, -14916958, 20078436, -14931454, -2196876, +4464082, 5544803, 17482128, 12434467, -15990700, 9331353, -7671349, -17027934, -858457, -12211129, +-7330973, 1112397, 17885854, -1812476, 8666170, 16729971, -11635066, 6978248, -19419694, 13922673, +-11404212, -4855998, 21435108, 8199093, 23002234, -7887171, 1465658, -8436926, 7585986, 29198798, +8458401, 10822781, -12737799, -1292785, 2005213, 12114492, 10766409, 19222126, -13168370, -3600256, +-14446123, -11922292, 2302639, 2549600, 10640245, -7650411, 7843147, -19903952, 14724222, 11689827, +6143414, -2101850, -1224066, 2936147, 7673496, 3674882, 3101503, 1487132, 15858093, 14093935, +6696928, 2777770, -9707163, -9148280, 31334470, 2856153, 5053029, 18532248, 8709657, -2885681, +-2243047, 12571906, 22902914, -13662828, -5266704, -15549929, -15183246, 23389856, 10636487, 2620467, +-3084324, 9639517, 16954920, 13224741, 16982838, 8070781, -6343667, 568546, -905701, 6248104, +-14203994, -10743324, -4272419, -13335337, 14527190, -1979443, -3864934, -12754979, -2164127, -11920682, +-28686086, 4579509, -3572339, -9438728, 6445672, -15608448, -916976, -8748312, -22907208, -5732708, +-9893457, -11366094, 18417894, -5428839, -6504728, -3879429, -279710, -5220533, -6302865, -1632088, +5040681, 14897631, 11927661, -1085553, -634045, -26702886, 1894081, 2860985, 11011759, -6733435, +-5035849, 38748660, -6374805, -20092394, -18313740, 15569793, -10482405, 3882114, -21708912, 4650913, +-5668283, -12822625, -9675488, -26263188, 4719096, 6243809, 18685256, 4212289, -9004399, 13021267, +2449742, 12087649, 15622407, 41336376, 12266963, 1431835, -15810848, -20386600, -4283693, -182536, +-1865090, -19729470, 7500624, 15076409, 3588445, -5522791, -17055852, -7242389, -2492155, 5554467, +-6139119, 10507101, -5172751, -6795175, 20061256, 10640781, 22782654, 590558, -6460705, -8621073, +24125906, -20290500, -7597797, 28384366, -16821240, 5980205, 5914707, 7670275, 1718524, 16170015, +-4851166, 14616847, -5323075, 3565897, 3433826, -6800544, 10568304, -15440944, -11079405, -9811853, +-4737349, -13611825, -26125212, -4158065, -7817914, 4792647, -6731825, -34068756, 9657771, 22527104, +-1262184, -3896609, 34147676, -41518376, -9162239, 24437828, -5790690, 19205484, -13458280, -7399692, +6354941, -39362840, 13066901, -12659416, 20205136, 16014322, -21444234, 43655120, 6294275, 3649649, +-2108292, 18251464, -30564062, 14300094, -1298154, -2857227, 8438537, -17430588, 28413894, 28423556, +-46390480, 9864466, 9279814, 2321430, 26962194, -10606422, -32422708, -32560148, 3700651, 5167383, +-13709536, 9764071, -17616882, 6995428, -7398081, 18271328, 23206246, 1721745, 22498650, 20475182, +-9721658, 726923, -12730820, -2473364, -2119030, 8525510, -210990, -1127966, -1155883, -21415244, +-32732482, -12618077, 18905910, 14709726, -13326747, -15711527, 11026792, 10945187, -20783884, 12177843, +-13373991, -1673964, 18401788, 24773372, 1535451, -12956843, 10476499, 2915209, 16213502, 3688303, +13811004, 13874355, -2058363, -47423420, 7094749, 2484639, 21312164, -5914707, 21767432, 21166672, +-11512660, -64521148, -6963216, 4097399, -5948530, 41086196, 43632036, 30560840, 43493524, -8990977, +21760988, -14436459, 30107184, 21431886, -29839286, 43540232, -39639864, -33030446, -30161408, -24848534, +-48029544, 11589432, 19429896, -1436130, 26249766, 10771241, -29796336, -6645925, 7914551, 8838506, +9878962, -5100811, 15747498, 2403034, -7917236, -3083250, 6509023, 21664888, 28147068, 21378736, +33499134, -29685204, -7118909, -6845641, -30084636, -6407555, 6924024, 2767570, 5034239, -11412265, +-12676596, 17209934, 37633576, -15890842, 20225000, -10997801, 6490233, -10040560, -238371, -26898306, +-8508867, -386547, -37164352, -21525840, -36290328, -30906048, 23177254, 51532092, 41997800, 2501819, +-562641, 1502165, -7019587, -15858630, -58846956, -18882824, -6601902, 6529961, 4811974, -19843286, +-12750147, 9674414, 29155848, 17920214, 11057930, 19659676, 32549410, 14172318, -27572616, 25807384, +-15298674, -6001680, 20260972, 44328356, 10619844, 55238648, -21123186, -34502548, 21144660, -3439732, +-20921860, 9935870, 22405234, 19468550, -40354976, -34770980, 8471286, -16176457, 3903589, 19607062, +-10905996, -7903277, 32240708, 8803609, -4775467, -10327249, -9483825, 12209518, -7586523, -1397475, +-1250909, -13168370, -5419175, -21930104, -29613800, 10547366, 15649787, -18391050, 13165685, 9375914, +-6763500, -12684649, 1585917, 23323820, 12922483, 4366908, -23596550, -25692494, -13076565, 7253663, +28543278, -21463562, -12008729, -9572408, 16804596, 47095928, 11820287, -45329620, -10746545, -4948876, +22852448, 1007170, 11489038, -5441724, -11571179, -9541270, -26680874, 24782498, 24689620, 11032160, +26050050, -7640747, 16367583, -7167227, -20804284, -20520816, -24646670, 5339718, -45193256, 46868832, +-4808753, -15064598, -28314572, 31556198, 22803056, 6562710, 1676111, 13005698, 11414949, -27292906, +-37852620, 8179229, 23229330, 34841312, -3370476, -12080132, -27548458, -17577690, 12481175, -3975529, +-24088860, -44742820, -44883480, 5150203, -16091632, 19566798, -51208360, -19248432, 5471252, 3251827, +5242008, -18631032, 3064459, -4904853, -12788802, -5426691, -26192858, 16867948, 21402358, 15123117, +-34004868, -19801410, -4774930, 6363531, 10974715, 12290586, 8779450, -7314330, -6377490, -8053064, +17150878, 55479704, 33216204, -35156992, -34973380, -23642184, -43859668, 41914584, 20009178, -18845242, +-45552424, -43709884, 39484708, 22473416, 880468, 29104310, -40723808, -9264244, -3195456, -14816027, +-2110977, -19317690, -41648836, 2286533, -33273648, 29356102, 29090888, -21547850, -10274636, -9168145, +-12032351, 23686744, -37677064, 33557116, 49495740, 53464288, -59426780, 11253888, -1311039, -4955856, +25993678, -10678362, -17164836, 17680232, 9638443, 36510444, -3000035, -28846610, 1628330, -13200582, +22333830, -33237142, -10906533, -15705622, -21218212, 30109868, -21226266, -3359738, 21809844, 11847667, +-6352794, -11887396, -29994978, 3661997, 41959148, 24502788, -640487, 11717208, -8065949, 32905892, +-21313776, 14893873, -11192685, 20167556, 35737348, -8277476, -21092048, 10394895, -29205240, 49876920, +7289633, -27576374, -7808251, -42644192, 6740951, 59192164, -9512279, -36099736, -23240604, 35964984, +12380780, -20103668, 382252, 8724152, 21936008, 49866180, -40036076, 17827872, 42462196, -6597070, +-48194364, -47374564, -27380416, 83682608, -60834992, 22150756, -60921964, -22340272, 21578452, -56521232, +9662603, -50788524, 22124450, 23774254, 47029892, 20772610, 10588168, 12231530, -14998026, -36259724, +-25417080, -23840290, 9842454, 5792837, -6464463, 21528524, 33017562, -14986215, -21275658, 23097798, +3768297, -30881888, -7457137, 13941464, -25820270, -4507568, 5229660, 12956306, 6498286, 18338436, +30985504, 5581310, -20462298, -2262374, 5600638, -15838766, -7575786, 14770393, -11634530, -20034948, +27519466, -6633040, -7449621, -11001022, -11536819, 18329846, 4086125, 4344360, 23621784, -11337103, +-19249506, -838056, 1213865, -7646653, 5583995, -1008244, -7262790, -861141, -24174224, 5633387, +3989488, -3585224, 12073153, 9039296, 3835406, 6193880, -24883966, 29377040, -11242614, -9805410, +8602819, -25726854, 8969502, -19304804, 4638565, -25692494, 42807404, -1687385, 24432458, -21230024, +3155727, -3414499, 8020315, 7373385, 13283260, -6015102, 9880572, -5323612, 5626407, -382252, +4527433, 10780905, -869194, 16415365, -5978595, 12556337, 999117, 98247, -4118874, 8276939, +-5755256, 7548942, -3743064, 1126355, -3062849, 4444755, -2457258, 9674414, -2523293, -5624260, +14704357, -9282498, 7800198, 6793028, 2455111, 7732015, -8633421, -5388037, 6818261, 6972880, +-3723737, -31139, 7208566, 191663, -9731322, 5185636, -4920422, 5949067, 6908455, 4150549, +2357400, 3178276, -10636487, 6181532, 2896419, -2149631, 3726421, -3879966, 2192581, -1301375, +-799938, -67646, 3269007, 8511551, -10464688, 10337986, -2522757, -1793686, 4008278, -4977867, +1751810, 6673843, -1817308, 10722923, -35477504, -111029200, -16143171, 54188528, 28155658, 131448008, +24639154, 28388124, 17997524, -35213364, -49570364, -35344360, -63605244, -54742580, -30872762, -12642236, +36810556, 99817728, 79352208, 68219648, 38998840, -30584462, -49636400, -36647884, -68507416, -65093452, +-19681150, -9077413, -14899242, 25327960, 39834212, 26189100, 48518100, 37283000, 11733851, 34287796, +7329899, -5072893, 3514357, -20641612, -53967876, -46189152, -38873212, -55089400, -22679574, 16072304, +11462731, 35243964, 40349608, 34869764, 36253284, 36542656, 23630910, 22622130, 2943663, -20382304, +-37493452, -25983478, -35247184, -47312284, -22750442, -21736830, -17103634, 6636262, 18506478, 17113834, +34025268, 41733660, 20869782, 29452738, 25858388, -6898255, 3727495, 11418707, -13035226, -13003013, +-19846508, -18107046, -9757629, }, }, { { 1566589, -2699924, 383326, 1531693, 3398393, -1061931, 3617436, 936840, 667331, -4192425, -1037235, --4155381, -501437, 4171487, 3026878, -299037, 1903207, -598074, 1583232, -520765, 1980517, -1675574, 2143189, 5126581, 2151779, -3779571, -343061, -4280472, 2205466, 1586990, -646929, -434329, 476205, -927713, -1342177, 2562485, -1171452, 828392, 2291365, -2279554, 3849901, --901943, -1611, 1830730, -824634, 601832, 433792, 1934883, 3019899, 59056, 462246, --1103807, -146029, 181999, -1702418, -1613297, 1910724, 5183489, -474594, -2897492, -2598992, -1632088, 2559801, 2950643, 1667521, 4212289, 246424, 3053722, -2422362, -1606855, 1927367, --621160, 2571612, -158377, -846109, 1377074, -3542811, 2703145, 1701881, -3491272, -608812, -4500052, 1336809, 1127966, 2476049, -561030, 679142, -1139777, -4684199, -1814087, -233539, --1003949, 1343788, -1418413, -459562, -3935264, -12348, 719944, -2812130, -572304, -3549791, --1218697, -1141924, -4240207, -1983738, 1407676, 1846299, 4845797, 2818572, 6179921, -691490, --949725, 869194, -2063195, 5299453, 368293, 2483565, 4283156, 703838, -1653562, 1688996, --2198487, -3047816, -693100, -1345935, -1599875, -5597953, -1730335, -27380, 932545, 1598802, -530965, 2761127, -3078418, 2426657, 49929, 554588, 1831804, -2256469, -4832375, -2180770, -2160369, 2998961, 2395518, 133681, 2436857, 1744831, 3281355, 1589675, 1429687, -2101850, -146029, -129386, -2658048, 2359548, -4042638, -2514703, 6279779, -1114544, 5540508, -2961380, -456340, 2704756, 1147293, 107911, -3872987, -5438503, -5687611, 527207, 48855, -1657321, -663036, -5023501, 9764608, 1044751, -5583995, 1391033, -2973728, -3195993, 2840584, 4116726, --165356, 878321, 1892470, -362925, -84826, 3225521, -1908039, -857383, 86436, 5926518, --230854, -748398, -2374580, -3578245, 1724429, -913754, -3746822, -1676648, -4489852, 551366, --4088272, 60130, -3131568, -1014686, -2775623, -5506685, -2394981, -357019, 5028870, 758062, --1660542, 2829310, 4572530, 730681, -6646462, 3002182, -219043, 1248762, 1899986, -1443646, -3844533, -1961190, -3946538, -3699041, -7096897, 789200, -2737505, -2171106, -3601330, -5191005, -8047158, -2310693, -7765301, 352187, 2326262, 19327, 2120640, 1718524, -6211060, 1918777, --1643899, -446677, -17717, -1290638, 4284767, -1603097, -3226057, -452582, 3359738, 2099165, -1067836, 1951526, 8526047, 2143189, -3321084, 3801583, -3995930, 1045825, -3291019, 8113730, -971736, -2869575, -1954210, -2873333, -1277216, 5332739, -4739497, -3863860, -1488743, 4393752, -2237678, -4370666, 804233, 794569, -2866891, -31139, -9443022, 2853469, -2512556, -1872069, --6174553, 8530879, 12885, -4667019, -4051765, -4579509, -180926, -1095754, -66035, -161061, --5788006, 6739341, -4501663, -3687766, 2056753, 609349, 1986959, -2053531, -1182727, -4357781, --474057, 778463, -6339372, -4210679, -739271, 7188165, 214212, 1552631, -5963025, 1829119, -3404835, 2496987, -266825, -2980707, 7716446, 1350767, -1564979, 3719442, 3005403, -3606162, -4711043, -3174518, 7784628, 1123671, 6941204, -744103, 1190243, -2717104, -7945153, 876173, -113280, 294205, -1418413, 1650878, 4114042, -1020592, -4119948, -2658048, -5839008, -1566053, --2914672, -3021510, 453119, 2021319, 3049964, -3677029, 2498597, -2448668, -3184182, -381178, -2544231, 533113, 544387, -5733782, -5689221, -1018444, -1782411, -4182761, 9053791, 4304094, --735513, 1807644, 3528316, -9244380, -4875862, 6251862, -3668976, 5861020, 1103270, -1197759, --6471979, -4587025, 7125351, 3915937, 6681896, -7381438, -883153, -5166309, -858993, 1668595, --3288871, 437550, 714575, -12092480, 667867, -1532767, 3302830, -7307350, 2366527, -2448131, -12268574, -3223910, -6325950, -2297808, -5303748, 1685775, 4566624, -1423782, 8580271, 904091, --2507187, 2091649, 1062468, 2259153, -3014530, -504659, 3205656, 5056250, 2008434, -971200, -2431488, -4454418, -1380295, 6354404, 4538707, 7457137, 5287105, -86973, -3754875, -7875897, -5485210, -824097, -5749888, 3040837, -1501628, -8819178, 256624, -7341710, -560493, 6735046, --1107028, -4913980, -2259690, 6442988, -5499706, -8986682, 9223979, -1659468, -2195802, 2233383, -1208496, 1176284, 2257005, 2312840, 1276679, -6560026, -2473364, 5282810, -624918, -1828046, -1644436, 9030706, -4383014, -4681515, -2110440, 3936875, 2016487, -7468412, -3278671, -10549513, --150324, 2915209, 10304700, 10642929, -3329674, 5335423, -6722161, 2307471, 4573604, 6859063, --1901060, 10252087, -1837172, 8704825, -4642860, 7302518, -3559454, -11974369, -2654827, 3068217, --4075924, 4707821, -2527588, -2833605, 1381906, -13138842, -4187056, -218506, -2215130, -741956, --6299107, -2153926, -2197413, 2144799, 13529684, 7796977, -7744900, 4318053, 10835129, 2705293, --3696356, 2715493, -2762201, -3172907, 7820599, 5415417, -5309117, -701153, 5597416, 11557757, --3638374, 6290517, 17206712, 7379291, -7820599, 3191698, 2064806, -9551470, 1501628, -7903277, -3594351, -8621610, -1957968, 317291, 4129074, -5665599, -1493038, -2858838, -5047124, 6482717, -5704254, -467078, -3714073, 770410, 4417911, -2561948, -11000485, 2237141, -8887898, 1153736, --3114388, 10929618, -5923834, 1340567, 2682744, 875636, 3797825, -1870458, 11966853, 732829, --8184597, -1697049, -6103149, -1154809, -2159832, -5686537, -7128572, -1973538, -4682051, -2296197, -7565585, 2707977, -6866042, 2385318, -8148627, -1686312, 5495411, -10961293, -9761387, 5236639, -4842576, 2464774, -564788, -6711424, 2356863, -3387119, -6413460, -3009698, 109522, 1811939, -10017474, -4172561, -1366873, 413391, 4574677, 2393908, -3731253, -4686883, -8376797, -2605435, --1970853, -4605816, -5393942, 3273302, 6736656, -104690, -4440460, 7510824, 1429150, -3791919, -957778, -1158031, -884763, -2662343, -1278290, 4840965, -3563212, -6005438, -2776696, 2692945, --3177202, 5653788, 10692321, -7812546, -208843, 7341710, -3402151, -5061082, 6690486, -10347650, --608275, 2088965, -1343251, -3749507, -4606890, -2045478, 1811939, -376347, 5005248, 2728915, --1706713, -3782793, -2957085, 8488466, 269509, -9862319, 4643397, -6136972, -6344204, 4106526, -7181722, 7699803, 5521181, 118648, 3681324, 2902324, 3453154, -2981244, -322659, -2638184, --7445326, 3424163, -2066953, -12885, -1811403, 1114007, -1428614, 8462696, 14701136, 2914135, --2859911, 433792, -10967736, 10867341, -7595113, -4188130, -7346542, -8013872, 14162118, 1403381, --8473970, -2273112, 9596031, 5872294, -8064875, -4916664, 10988674, 1765232, 642098, 15789910, --7686918, 5138392, -5966247, -13506598, 6250251, 8656507, 469225, -6111202, 4640712, 6040872, -11522860, 10525891, -827318, 8920110, 3786014, 9105331, 8768176, -15612206, 5120138, -5304285, --6991670, -5181341, -1843615, -10087268, -2442763, 2006287, -8716636, -17419314, 3486440, -1566053, --15777562, -11639898, -10482405, -5986111, 125091, -3248069, 3222836, -2389613, 5677947, 11551851, --7253663, 3692061, -3118683, -5817533, -4413616, 367220, -1614908, -853088, 8423505, -727460, -8489540, 11231339, 3001109, 4628901, 7205882, -1369558, 1078574, -11813308, 10218801, -9705015, --3776350, -3347390, 448824, -2957622, -9417790, -8232379, -17731772, 15205795, -18115636, -17439178, -2332704, 15947214, 5236102, -2533494, -4700305, 7084549, -8864276, 8947491, -3386045, 704375, -297963, -6784975, 5846524, -8007430, -6767258, 1772748, 7544110, 9722195, 9692667, 10550050, -24237574, 11155641, 14012868, -6280853, 22447646, -12139188, 974421, 5339718, 259309, -7818988, -3107409, -1801739, -18473728, 7633768, -4406100, 2534031, -1438277, -5711233, 327491, 6129992, --7291781, -3400540, -887448, 4980015, -11190537, 7838852, 3023120, -9943923, -555125, 4879083, --9276592, 4172561, -11187853, 5890011, -747324, -3073586, -223875, -6830609, 9812390, 12002286, --10628970, -5519570, 5086315, -3175592, 3180960, 3431679, 869194, 1071594, 13218299, -2581812, --8658117, 8846559, -263604, -6142877, -5750425, -10121090, 2098629, 3739843, 5394479, 6002217, --5136244, -7680476, 4545686, 3125126, 16073915, 2444910, -2496987, 1039919, 338229, -4416837, --3503083, -12709882, -14299020, 24309514, 17018272, 21742736, 1562831, -13707388, 5071820, 11407970, -8216273, -3401614, -8566849, -2453500, -3018288, -4135517, -7338489, -2917357, -6126234, 16201690, -2790118, 2752537, 342524, 1023813, 1933809, -5875516, 10882910, 6083821, -405874, 3932043, --1285806, 11014981, 2255932, -935229, -17708688, -1302986, 1364726, 1722819, -3122978, 2245194, --8262980, 14553497, 12036109, 11361262, 10175314, -7857643, -10588705, 8245801, 2788508, 3984656, --488016, -12693239, -8895414, 611496, -6896107, -56371, -5769752, -2763275, 7740068, 2206003, --5231807, 1695438, -13788993, 145492, -23505820, -12337830, -22243636, 18852222, 17373142, 18019536, -22393422, 10214506, -3894999, -10871099, -3373160, -1940252, 2604898, 14784351, -8440148, -11391327, -10280541, 13333189, -6369437, 12400107, 1826972, -5033702, 5015985, -17570712, -5423470, 5194763, --5579163, -10683194, -20445118, 10292352, -8753143, 2600066, 13343390, 3430605, 15542950, 12109660, -6780680, 2815888, -9114457, -2396592, -4759898, 1145146, 8654359, 4823785, 1801202, 7712688, -21081310, -732829, -17906792, -7477538, 2901251, 4716948, -1023813, 886911, 1695438, -7170985, -467615, -16360067, 3787624, -17102560, -6440304, -13082470, 6717866, -6192806, -11217918, 17776332, -4789963, 2120640, -7704098, -9472550, 2560338, 4929012, 1510218, 6520297, -8736500, 20277614, --23330262, 7242926, -9700721, -12854300, -7893076, 13749801, 3754875, -11519639, 9472014, -8447127, -26030186, 308164, -2809982, -8651138, 1082332, 24345486, 25051470, 23629836, 4998268, -6396280, --4016868, -15299747, 12328704, 321586, 7208029, -4605816, 2273648, -5617281, -4356708, -8858370, -4698694, -9220758, 15013595, -39399884, -11533598, 250182, -11985643, 8430484, -12320651, 2489471, --4810900, 12353400, 2120640, 11892228, 778463, -2837363, -279710, 4339528, -13882945, -9929964, --10823318, -1539209, 13324062, -26497264, 9084393, 23008676, 2723009, -16959216, -780610, -14286135, --13798119, 9455371, -1917703, -11673721, 6347425, 951872, -4487167, -6605123, 3617973, 9552007, -5652714, -13564044, -10062035, 7715372, 11479911, -9570261, -12812424, 6159520, 12836584, -15974057, --829466, -14297409, -19819126, 23038742, -4260071, 3350075, -4858682, 13969381, -4068945, 2717641, --8647380, 10086731, -6092948, -1946157, -20402706, -10338523, -5896453, -17535814, -24515136, -5845988, --9239548, 20058572, 4919348, 30583388, 4226785, -10800232, 2659659, 4530117, -27868970, -69256, -21466246, 13073880, -16918414, 514859, 9911711, -22696754, -5013838, -12164421, 7329899, -9876277, -4260608, -185220, -5833640, -483721, -1730872, -8429410, 5498095, -15997143, -7315940, -7831873, --19741280, -5473936, -4134443, -1427540, -494458, -6645925, -7491497, 31074088, 8023536, -14545444, --25136832, -10252087, 419833, 21874806, -7742753, -4991289, -15314780, -5486821, -11449309, 17460652, --18014166, 15299747, 19732690, -24381992, 12308839, 3325915, -11944304, -10736881, 2738579, 7837242, --51364052, -9071508, -3122441, -9548786, 9506373, -9813463, -39820252, -18052284, -13959717, -6905234, -5454609, 32274532, -1041530, -37574520, -21149492, -23206246, -4493073, -12771622, -700617, -18963892, -31144956, 18799072, -3567507, 24851754, 488553, 26814554, 6107444, -15052787, -21199958, -12858595, --17187922, -7177964, 3776887, 11861626, -4111358, 4195646, -14337675, 2871186, -20533702, -1284732, --1611150, 7487202, -8039642, 32840394, 3641596, -154082, 20826296, -7558606, -15732465, -8091719, -12496744, -136365, -9239548, 4523138, -781147, 28410134, 6072547, 1172526, -11354820, -15362561, --42533060, 3980898, -33973728, 18198314, 56129852, -39190504, -9543417, 10858214, -7877507, -5381057, --12293807, 11482595, -12616466, -37208376, -11388643, -36865316, -9140227, 1505386, -25518548, -510027, --36265092, 18716930, -4244502, -18692234, 55031416, 8337606, 23633058, -12176232, -66677756, -7355132, --17381196, -18975702, 23667418, 18690624, -23667418, -18788872, 45025752, -5593658, 14296872, 1909113, --2838974, -5680631, -5408438, -15204721, -628676, 4821638, 7679402, 5071283, 15793132, -13201119, --779000, -12874701, -7887171, 4617627, 22601192, 14409615, 19902342, 17855790, -4572530, 6195491, -10493142, -389231, -19170050, -3820374, 25439092, -5050882, -37471980, -16719771, 3593814, -31774168, --14024679, -32552094, -22541062, -20500416, 29245506, 19893752, -6897181, 19910394, 7385197, 28256052, -18848464, 8798241, -50861540, -11695196, 1889786, -44781476, -32789390, -12898861, -8937290, -52386788, -10935524, 28271086, 38316476, 45683956, -15627775, -30528090, -323733, -30780420, -22414360, -42522324, --46538120, -33319820, -27537720, 31556736, -18921478, -48002164, 20943872, 3990025, -32111860, 33107218, -17287244, 11308112, -5706938, -28562070, -5909875, 2501819, 31078384, 40662068, 4010426, 12170327, -4270271, 2833605, -81068, 6894497, -14566918, 56599080, 14999636, -16336445, -16150688, -6376416, -4253092, 28493886, -11164231, -2457795, 1869921, 15226196, -11175505, 8795019, 2821794, -1400696, --43484932, -12588012, 16510928, 25184078, 10330470, -3407520, -11106249, -28308666, -1259499, 6586333, --5089000, 2224256, -5764920, -17605608, 21547850, -2749853, 9064528, -18897320, -2212445, 54663124, -6111202, -4033511, 8326331, 8769786, 7143068, 28537910, -7602092, -10069551, 21998286, -211527, -13882945, 9473087, 19342922, -4454418, -17739826, 12330851, -7396471, 4205310, 75893144, 75022344, -31416612, 16039555, 32433446, 664109, -42848204, -14467597, 4421132, 1435056, -13404056, 24828132, -10405632, 6952479, -13747117, 29712046, -6120329, -3641596, -13232794, 13683229, 8043937, -30734786, --42200740, -15311022, 2415919, -2468533, -11276974, -39831528, -7464653, 7742753, -1097901, -16670379, --8777839, -15480673, -17394080, 3251827, 6114960, -27592480, -29084444, -13935021, -35133368, 3239479, -23622320, -29433410, 22578644, -17875118, -18343268, -32603096, -41390064, -48071960, -43801688, -26484916, --3744138, 9188009, 3312494, 8964670, -24814174, -53564148, -22272090, -51920248, -83198888, -37067180, -60530048, 102837624, 60830696, -34172372, -25126096, -105145096, -91063504, 53070228, 7310571, 71790376, -79722112, 77495168, 25962004, -43654584, -45555644, -57359288, -56828860, -15223512, -4490389, 6665789, --25883084, 33961380, 15939161, 30010010, -69111928, 14395120, 8439074, -22118008, 14555107, -16860430, --8465917, -5871221, -10433549, 28195386, 53560928, -16985522, 10306311, -8820252, 12444131, 26257282, --8923868, -6354404, -15450071, 6567542, -9917079, -31268436, 21479132, 35456564, -5143760, -20721606, --17918604, -40269076, -10864657, 27972048, 19883014, 8777839, -42803108, -26308286, -18621368, 36333276, -32935420, 27289686, -83308408, -57068304, -6505802, 39777840, 88476864, -1127429, -105567072, -40386652, -4064650, 34331284, -2292976, 18259516, 15571404, -47584480, -19414326, -13998909, -26765162, 858457, --50975356, 7262253, 21984864, -63672892, -38771744, -19998978, -6215355, 69831336, 1835025, -106290240, -13180181, 16836272, 20555176, 45490148, 27966142, 23477902, -56667260, 7907035, -41712724, 7496866, -34891240, 31112206, 9835475, -20131048, 3633542, -11893301, -3424700, -14729053, -11502459, 7841537, -1495186, -21401822, -3110630, 11574937, -3077881, 1636383, 3352222, -13390634, -14468671, 124017, -8207146, 1746441, -22928146, 2444910, 10321343, 4221416, 1586454, 23780160, -3647501, -5325760, -7076496, 9713069, -16840030, -16304770, 11471321, 3536906, -14694157, 10056666, 2339147, 5560909, --10899553, 5087389, 8717173, 2719788, -14901926, 19301046, -4119411, -18150532, -1507534, 17404818, -2584497, -10976863, 9392020, 6125697, -20759188, 9865540, -1931662, 21157008, -19905026, 4441533, -9294846, -26103200, -2913062, 16355235, -4844723, 12985297, -9917616, -13906030, -3516505, -14002130, -11109470, -27322972, 46426448, 7099581, 21332028, -17185238, 8528731, -3211562, 6148246, 5667210, --7037841, 3746822, 9000641, -4151623, 18869402, 1512365, 1202591, 6910066, 6576132, 28454, --4052302, 8513699, -611496, -4658429, -511638, 8568460, -7864622, 2555506, 4413079, -10001368, -14027900, -1905355, -5897527, 21422224, -7922604, -11361799, 10052908, 6050535, -5134634, 9772661, -7723962, -1654636, -2352032, -758062, 3237332, 6011344, 3554086, 843961, -3032247, 11523397, --10798622, 11099806, 2108829, -318901, 3350611, 4169876, 3803194, 1418413, -9593883, 3803194, -9160628, -5193153, 430570, 1014149, 7062537, 355409, -2142115, 11029476, -4668630, 6404870, --9966472, -2809982, 10405095, -8578660, 10001368, -1716376, 6728067, 10613938, -37866580, -120941984, --6208912, 65025268, 29184840, 138629200, 11800960, 29175712, 1199907, -40593348, -50971600, -34666292, --62102004, -43610560, -27310086, 820339, 47453484, 93237832, 68794104, 59644748, 19547470, -32721208, --47693464, -43154756, -50528144, -56356412, -22650584, -10997264, -4786741, 27149026, 36492188, 27165132, -50979652, 32555316, 12344273, 33831456, 984084, -15103252, -9592273, -30913564, -62561568, -38471096, --36509908, -37791416, 2233383, 17144436, 12367358, 45823008, 38167228, 25755308, 37575596, 39251708, -11606075, 11541114, -3787088, -34405908, -46904264, -36512052, -46960636, -34056408, -11204496, -8611946, -3595425, 25649544, 21011516, 18137646, 37420440, 30168388, 23301272, 37890740, 11773042, -7218230, -449361, -14010720, -29520384, -16951700, -28831042, -18379238, -7886634, 0, 0, 0, -0, 0, 0, }, +2699924, 383326, 1531693, 3398393, -1061931, 3617436, 936840, 667331, -4192425, -1037235, +-4155381, -501437, 4171487, 3026878, -299037, 1903207, -598074, 1583232, -520765, 1980517, +1675574, 2143189, 5126581, 2151779, -3779571, -343061, -4280472, 2205466, 1586990, -646929, +434329, 476205, -927713, -1342177, 2562485, -1171452, 828392, 2291365, -2279554, 3849901, +-901943, -1611, 1830730, -824634, 601832, 433792, 1934883, 3019899, 59056, 462246, +-1103807, -146029, 181999, -1702418, -1613297, 1910724, 5183489, -474594, -2897492, -2598992, +1632088, 2559801, 2950643, 1667521, 4212289, 246424, 3053722, -2422362, -1606855, 1927367, +-621160, 2571612, -158377, -846109, 1377074, -3542811, 2703145, 1701881, -3491272, -608812, +4500052, 1336809, 1127966, 2476049, -561030, 679142, -1139777, -4684199, -1814087, -233539, +-1003949, 1343788, -1418413, -459562, -3935264, -12348, 719944, -2812130, -572304, -3549791, +-1218697, -1141924, -4240207, -1983738, 1407676, 1846299, 4845797, 2818572, 6179921, -691490, +-949725, 869194, -2063195, 5299453, 368293, 2483565, 4283156, 703838, -1653562, 1688996, +-2198487, -3047816, -693100, -1345935, -1599875, -5597953, -1730335, -27380, 932545, 1598802, +530965, 2761127, -3078418, 2426657, 49929, 554588, 1831804, -2256469, -4832375, -2180770, +2160369, 2998961, 2395518, 133681, 2436857, 1744831, 3281355, 1589675, 1429687, -2101850, +146029, -129386, -2658048, 2359548, -4042638, -2514703, 6279779, -1114544, 5540508, -2961380, +456340, 2704756, 1147293, 107911, -3872987, -5438503, -5687611, 527207, 48855, -1657321, +663036, -5023501, 9764608, 1044751, -5583995, 1391033, -2973728, -3195993, 2840584, 4116726, +-165356, 878321, 1892470, -362925, -84826, 3225521, -1908039, -857383, 86436, 5926518, +-230854, -748398, -2374580, -3578245, 1724429, -913754, -3746822, -1676648, -4489852, 551366, +-4088272, 60130, -3131568, -1014686, -2775623, -5506685, -2394981, -357019, 5028870, 758062, +-1660542, 2829310, 4572530, 730681, -6646462, 3002182, -219043, 1248762, 1899986, -1443646, +3844533, -1961190, -3946538, -3699041, -7096897, 789200, -2737505, -2171106, -3601330, -5191005, +8047158, -2310693, -7765301, 352187, 2326262, 19327, 2120640, 1718524, -6211060, 1918777, +-1643899, -446677, -17717, -1290638, 4284767, -1603097, -3226057, -452582, 3359738, 2099165, +1067836, 1951526, 8526047, 2143189, -3321084, 3801583, -3995930, 1045825, -3291019, 8113730, +971736, -2869575, -1954210, -2873333, -1277216, 5332739, -4739497, -3863860, -1488743, 4393752, +2237678, -4370666, 804233, 794569, -2866891, -31139, -9443022, 2853469, -2512556, -1872069, +-6174553, 8530879, 12885, -4667019, -4051765, -4579509, -180926, -1095754, -66035, -161061, +-5788006, 6739341, -4501663, -3687766, 2056753, 609349, 1986959, -2053531, -1182727, -4357781, +-474057, 778463, -6339372, -4210679, -739271, 7188165, 214212, 1552631, -5963025, 1829119, +3404835, 2496987, -266825, -2980707, 7716446, 1350767, -1564979, 3719442, 3005403, -3606162, +4711043, -3174518, 7784628, 1123671, 6941204, -744103, 1190243, -2717104, -7945153, 876173, +113280, 294205, -1418413, 1650878, 4114042, -1020592, -4119948, -2658048, -5839008, -1566053, +-2914672, -3021510, 453119, 2021319, 3049964, -3677029, 2498597, -2448668, -3184182, -381178, +2544231, 533113, 544387, -5733782, -5689221, -1018444, -1782411, -4182761, 9053791, 4304094, +-735513, 1807644, 3528316, -9244380, -4875862, 6251862, -3668976, 5861020, 1103270, -1197759, +-6471979, -4587025, 7125351, 3915937, 6681896, -7381438, -883153, -5166309, -858993, 1668595, +-3288871, 437550, 714575, -12092480, 667867, -1532767, 3302830, -7307350, 2366527, -2448131, +12268574, -3223910, -6325950, -2297808, -5303748, 1685775, 4566624, -1423782, 8580271, 904091, +-2507187, 2091649, 1062468, 2259153, -3014530, -504659, 3205656, 5056250, 2008434, -971200, +2431488, -4454418, -1380295, 6354404, 4538707, 7457137, 5287105, -86973, -3754875, -7875897, +5485210, -824097, -5749888, 3040837, -1501628, -8819178, 256624, -7341710, -560493, 6735046, +-1107028, -4913980, -2259690, 6442988, -5499706, -8986682, 9223979, -1659468, -2195802, 2233383, +1208496, 1176284, 2257005, 2312840, 1276679, -6560026, -2473364, 5282810, -624918, -1828046, +1644436, 9030706, -4383014, -4681515, -2110440, 3936875, 2016487, -7468412, -3278671, -10549513, +-150324, 2915209, 10304700, 10642929, -3329674, 5335423, -6722161, 2307471, 4573604, 6859063, +-1901060, 10252087, -1837172, 8704825, -4642860, 7302518, -3559454, -11974369, -2654827, 3068217, +-4075924, 4707821, -2527588, -2833605, 1381906, -13138842, -4187056, -218506, -2215130, -741956, +-6299107, -2153926, -2197413, 2144799, 13529684, 7796977, -7744900, 4318053, 10835129, 2705293, +-3696356, 2715493, -2762201, -3172907, 7820599, 5415417, -5309117, -701153, 5597416, 11557757, +-3638374, 6290517, 17206712, 7379291, -7820599, 3191698, 2064806, -9551470, 1501628, -7903277, +3594351, -8621610, -1957968, 317291, 4129074, -5665599, -1493038, -2858838, -5047124, 6482717, +5704254, -467078, -3714073, 770410, 4417911, -2561948, -11000485, 2237141, -8887898, 1153736, +-3114388, 10929618, -5923834, 1340567, 2682744, 875636, 3797825, -1870458, 11966853, 732829, +-8184597, -1697049, -6103149, -1154809, -2159832, -5686537, -7128572, -1973538, -4682051, -2296197, +7565585, 2707977, -6866042, 2385318, -8148627, -1686312, 5495411, -10961293, -9761387, 5236639, +4842576, 2464774, -564788, -6711424, 2356863, -3387119, -6413460, -3009698, 109522, 1811939, +10017474, -4172561, -1366873, 413391, 4574677, 2393908, -3731253, -4686883, -8376797, -2605435, +-1970853, -4605816, -5393942, 3273302, 6736656, -104690, -4440460, 7510824, 1429150, -3791919, +957778, -1158031, -884763, -2662343, -1278290, 4840965, -3563212, -6005438, -2776696, 2692945, +-3177202, 5653788, 10692321, -7812546, -208843, 7341710, -3402151, -5061082, 6690486, -10347650, +-608275, 2088965, -1343251, -3749507, -4606890, -2045478, 1811939, -376347, 5005248, 2728915, +-1706713, -3782793, -2957085, 8488466, 269509, -9862319, 4643397, -6136972, -6344204, 4106526, +7181722, 7699803, 5521181, 118648, 3681324, 2902324, 3453154, -2981244, -322659, -2638184, +-7445326, 3424163, -2066953, -12885, -1811403, 1114007, -1428614, 8462696, 14701136, 2914135, +-2859911, 433792, -10967736, 10867341, -7595113, -4188130, -7346542, -8013872, 14162118, 1403381, +-8473970, -2273112, 9596031, 5872294, -8064875, -4916664, 10988674, 1765232, 642098, 15789910, +-7686918, 5138392, -5966247, -13506598, 6250251, 8656507, 469225, -6111202, 4640712, 6040872, +11522860, 10525891, -827318, 8920110, 3786014, 9105331, 8768176, -15612206, 5120138, -5304285, +-6991670, -5181341, -1843615, -10087268, -2442763, 2006287, -8716636, -17419314, 3486440, -1566053, +-15777562, -11639898, -10482405, -5986111, 125091, -3248069, 3222836, -2389613, 5677947, 11551851, +-7253663, 3692061, -3118683, -5817533, -4413616, 367220, -1614908, -853088, 8423505, -727460, +8489540, 11231339, 3001109, 4628901, 7205882, -1369558, 1078574, -11813308, 10218801, -9705015, +-3776350, -3347390, 448824, -2957622, -9417790, -8232379, -17731772, 15205795, -18115636, -17439178, +2332704, 15947214, 5236102, -2533494, -4700305, 7084549, -8864276, 8947491, -3386045, 704375, +297963, -6784975, 5846524, -8007430, -6767258, 1772748, 7544110, 9722195, 9692667, 10550050, +24237574, 11155641, 14012868, -6280853, 22447646, -12139188, 974421, 5339718, 259309, -7818988, +3107409, -1801739, -18473728, 7633768, -4406100, 2534031, -1438277, -5711233, 327491, 6129992, +-7291781, -3400540, -887448, 4980015, -11190537, 7838852, 3023120, -9943923, -555125, 4879083, +-9276592, 4172561, -11187853, 5890011, -747324, -3073586, -223875, -6830609, 9812390, 12002286, +-10628970, -5519570, 5086315, -3175592, 3180960, 3431679, 869194, 1071594, 13218299, -2581812, +-8658117, 8846559, -263604, -6142877, -5750425, -10121090, 2098629, 3739843, 5394479, 6002217, +-5136244, -7680476, 4545686, 3125126, 16073915, 2444910, -2496987, 1039919, 338229, -4416837, +-3503083, -12709882, -14299020, 24309514, 17018272, 21742736, 1562831, -13707388, 5071820, 11407970, +8216273, -3401614, -8566849, -2453500, -3018288, -4135517, -7338489, -2917357, -6126234, 16201690, +2790118, 2752537, 342524, 1023813, 1933809, -5875516, 10882910, 6083821, -405874, 3932043, +-1285806, 11014981, 2255932, -935229, -17708688, -1302986, 1364726, 1722819, -3122978, 2245194, +-8262980, 14553497, 12036109, 11361262, 10175314, -7857643, -10588705, 8245801, 2788508, 3984656, +-488016, -12693239, -8895414, 611496, -6896107, -56371, -5769752, -2763275, 7740068, 2206003, +-5231807, 1695438, -13788993, 145492, -23505820, -12337830, -22243636, 18852222, 17373142, 18019536, +22393422, 10214506, -3894999, -10871099, -3373160, -1940252, 2604898, 14784351, -8440148, -11391327, +10280541, 13333189, -6369437, 12400107, 1826972, -5033702, 5015985, -17570712, -5423470, 5194763, +-5579163, -10683194, -20445118, 10292352, -8753143, 2600066, 13343390, 3430605, 15542950, 12109660, +6780680, 2815888, -9114457, -2396592, -4759898, 1145146, 8654359, 4823785, 1801202, 7712688, +21081310, -732829, -17906792, -7477538, 2901251, 4716948, -1023813, 886911, 1695438, -7170985, +467615, -16360067, 3787624, -17102560, -6440304, -13082470, 6717866, -6192806, -11217918, 17776332, +4789963, 2120640, -7704098, -9472550, 2560338, 4929012, 1510218, 6520297, -8736500, 20277614, +-23330262, 7242926, -9700721, -12854300, -7893076, 13749801, 3754875, -11519639, 9472014, -8447127, +26030186, 308164, -2809982, -8651138, 1082332, 24345486, 25051470, 23629836, 4998268, -6396280, +-4016868, -15299747, 12328704, 321586, 7208029, -4605816, 2273648, -5617281, -4356708, -8858370, +4698694, -9220758, 15013595, -39399884, -11533598, 250182, -11985643, 8430484, -12320651, 2489471, +-4810900, 12353400, 2120640, 11892228, 778463, -2837363, -279710, 4339528, -13882945, -9929964, +-10823318, -1539209, 13324062, -26497264, 9084393, 23008676, 2723009, -16959216, -780610, -14286135, +-13798119, 9455371, -1917703, -11673721, 6347425, 951872, -4487167, -6605123, 3617973, 9552007, +5652714, -13564044, -10062035, 7715372, 11479911, -9570261, -12812424, 6159520, 12836584, -15974057, +-829466, -14297409, -19819126, 23038742, -4260071, 3350075, -4858682, 13969381, -4068945, 2717641, +-8647380, 10086731, -6092948, -1946157, -20402706, -10338523, -5896453, -17535814, -24515136, -5845988, +-9239548, 20058572, 4919348, 30583388, 4226785, -10800232, 2659659, 4530117, -27868970, -69256, +21466246, 13073880, -16918414, 514859, 9911711, -22696754, -5013838, -12164421, 7329899, -9876277, +4260608, -185220, -5833640, -483721, -1730872, -8429410, 5498095, -15997143, -7315940, -7831873, +-19741280, -5473936, -4134443, -1427540, -494458, -6645925, -7491497, 31074088, 8023536, -14545444, +-25136832, -10252087, 419833, 21874806, -7742753, -4991289, -15314780, -5486821, -11449309, 17460652, +-18014166, 15299747, 19732690, -24381992, 12308839, 3325915, -11944304, -10736881, 2738579, 7837242, +-51364052, -9071508, -3122441, -9548786, 9506373, -9813463, -39820252, -18052284, -13959717, -6905234, +5454609, 32274532, -1041530, -37574520, -21149492, -23206246, -4493073, -12771622, -700617, -18963892, +31144956, 18799072, -3567507, 24851754, 488553, 26814554, 6107444, -15052787, -21199958, -12858595, +-17187922, -7177964, 3776887, 11861626, -4111358, 4195646, -14337675, 2871186, -20533702, -1284732, +-1611150, 7487202, -8039642, 32840394, 3641596, -154082, 20826296, -7558606, -15732465, -8091719, +12496744, -136365, -9239548, 4523138, -781147, 28410134, 6072547, 1172526, -11354820, -15362561, +-42533060, 3980898, -33973728, 18198314, 56129852, -39190504, -9543417, 10858214, -7877507, -5381057, +-12293807, 11482595, -12616466, -37208376, -11388643, -36865316, -9140227, 1505386, -25518548, -510027, +-36265092, 18716930, -4244502, -18692234, 55031416, 8337606, 23633058, -12176232, -66677756, -7355132, +-17381196, -18975702, 23667418, 18690624, -23667418, -18788872, 45025752, -5593658, 14296872, 1909113, +-2838974, -5680631, -5408438, -15204721, -628676, 4821638, 7679402, 5071283, 15793132, -13201119, +-779000, -12874701, -7887171, 4617627, 22601192, 14409615, 19902342, 17855790, -4572530, 6195491, +10493142, -389231, -19170050, -3820374, 25439092, -5050882, -37471980, -16719771, 3593814, -31774168, +-14024679, -32552094, -22541062, -20500416, 29245506, 19893752, -6897181, 19910394, 7385197, 28256052, +18848464, 8798241, -50861540, -11695196, 1889786, -44781476, -32789390, -12898861, -8937290, -52386788, +10935524, 28271086, 38316476, 45683956, -15627775, -30528090, -323733, -30780420, -22414360, -42522324, +-46538120, -33319820, -27537720, 31556736, -18921478, -48002164, 20943872, 3990025, -32111860, 33107218, +17287244, 11308112, -5706938, -28562070, -5909875, 2501819, 31078384, 40662068, 4010426, 12170327, +4270271, 2833605, -81068, 6894497, -14566918, 56599080, 14999636, -16336445, -16150688, -6376416, +4253092, 28493886, -11164231, -2457795, 1869921, 15226196, -11175505, 8795019, 2821794, -1400696, +-43484932, -12588012, 16510928, 25184078, 10330470, -3407520, -11106249, -28308666, -1259499, 6586333, +-5089000, 2224256, -5764920, -17605608, 21547850, -2749853, 9064528, -18897320, -2212445, 54663124, +6111202, -4033511, 8326331, 8769786, 7143068, 28537910, -7602092, -10069551, 21998286, -211527, +13882945, 9473087, 19342922, -4454418, -17739826, 12330851, -7396471, 4205310, 75893144, 75022344, +31416612, 16039555, 32433446, 664109, -42848204, -14467597, 4421132, 1435056, -13404056, 24828132, +10405632, 6952479, -13747117, 29712046, -6120329, -3641596, -13232794, 13683229, 8043937, -30734786, +-42200740, -15311022, 2415919, -2468533, -11276974, -39831528, -7464653, 7742753, -1097901, -16670379, +-8777839, -15480673, -17394080, 3251827, 6114960, -27592480, -29084444, -13935021, -35133368, 3239479, +23622320, -29433410, 22578644, -17875118, -18343268, -32603096, -41390064, -48071960, -43801688, -26484916, +-3744138, 9188009, 3312494, 8964670, -24814174, -53564148, -22272090, -51920248, -83198888, -37067180, +60530048, 102837624, 60830696, -34172372, -25126096, -105145096, -91063504, 53070228, 7310571, 71790376, +79722112, 77495168, 25962004, -43654584, -45555644, -57359288, -56828860, -15223512, -4490389, 6665789, +-25883084, 33961380, 15939161, 30010010, -69111928, 14395120, 8439074, -22118008, 14555107, -16860430, +-8465917, -5871221, -10433549, 28195386, 53560928, -16985522, 10306311, -8820252, 12444131, 26257282, +-8923868, -6354404, -15450071, 6567542, -9917079, -31268436, 21479132, 35456564, -5143760, -20721606, +-17918604, -40269076, -10864657, 27972048, 19883014, 8777839, -42803108, -26308286, -18621368, 36333276, +32935420, 27289686, -83308408, -57068304, -6505802, 39777840, 88476864, -1127429, -105567072, -40386652, +4064650, 34331284, -2292976, 18259516, 15571404, -47584480, -19414326, -13998909, -26765162, 858457, +-50975356, 7262253, 21984864, -63672892, -38771744, -19998978, -6215355, 69831336, 1835025, -106290240, +13180181, 16836272, 20555176, 45490148, 27966142, 23477902, -56667260, 7907035, -41712724, 7496866, +34891240, 31112206, 9835475, -20131048, 3633542, -11893301, -3424700, -14729053, -11502459, 7841537, +1495186, -21401822, -3110630, 11574937, -3077881, 1636383, 3352222, -13390634, -14468671, 124017, +8207146, 1746441, -22928146, 2444910, 10321343, 4221416, 1586454, 23780160, -3647501, -5325760, +7076496, 9713069, -16840030, -16304770, 11471321, 3536906, -14694157, 10056666, 2339147, 5560909, +-10899553, 5087389, 8717173, 2719788, -14901926, 19301046, -4119411, -18150532, -1507534, 17404818, +2584497, -10976863, 9392020, 6125697, -20759188, 9865540, -1931662, 21157008, -19905026, 4441533, +9294846, -26103200, -2913062, 16355235, -4844723, 12985297, -9917616, -13906030, -3516505, -14002130, +11109470, -27322972, 46426448, 7099581, 21332028, -17185238, 8528731, -3211562, 6148246, 5667210, +-7037841, 3746822, 9000641, -4151623, 18869402, 1512365, 1202591, 6910066, 6576132, 28454, +-4052302, 8513699, -611496, -4658429, -511638, 8568460, -7864622, 2555506, 4413079, -10001368, +14027900, -1905355, -5897527, 21422224, -7922604, -11361799, 10052908, 6050535, -5134634, 9772661, +7723962, -1654636, -2352032, -758062, 3237332, 6011344, 3554086, 843961, -3032247, 11523397, +-10798622, 11099806, 2108829, -318901, 3350611, 4169876, 3803194, 1418413, -9593883, 3803194, +9160628, -5193153, 430570, 1014149, 7062537, 355409, -2142115, 11029476, -4668630, 6404870, +-9966472, -2809982, 10405095, -8578660, 10001368, -1716376, 6728067, 10613938, -37866580, -120941984, +-6208912, 65025268, 29184840, 138629200, 11800960, 29175712, 1199907, -40593348, -50971600, -34666292, +-62102004, -43610560, -27310086, 820339, 47453484, 93237832, 68794104, 59644748, 19547470, -32721208, +-47693464, -43154756, -50528144, -56356412, -22650584, -10997264, -4786741, 27149026, 36492188, 27165132, +50979652, 32555316, 12344273, 33831456, 984084, -15103252, -9592273, -30913564, -62561568, -38471096, +-36509908, -37791416, 2233383, 17144436, 12367358, 45823008, 38167228, 25755308, 37575596, 39251708, +11606075, 11541114, -3787088, -34405908, -46904264, -36512052, -46960636, -34056408, -11204496, -8611946, +3595425, 25649544, 21011516, 18137646, 37420440, 30168388, 23301272, 37890740, 11773042, -7218230, +449361, -14010720, -29520384, -16951700, -28831042, -18379238, -7886634, 0, 0, 0, +0, 0, 0, }, { -522912, --292058, -565325, 4009352, 2597918, 440771, -1506997, 2077154, 3594888, -1101659, 3978214, --2531346, -810675, 2589865, 882616, -4480725, 1421097, 2778844, -6218576, -113280, 5133023, --3015067, -4310000, 4304631, -3466576, 875636, -2539936, 370978, 334471, 381178, -228170, --3140158, 4502737, -2037425, -1030792, -2770254, -2889976, 176631, -618475, -2095944, -3569118, --2871723, 5473399, -601295, 2137283, 1509144, -349503, 4178466, 1117228, 2911988, -325881, --2171106, 2853469, -4024384, -2179159, 36507, -428960, 409096, 973884, 3021510, -1032403, --602369, -1225139, 843424, -418222, -747324, 1876901, -62814, 2343979, -440234, -1940788, --1645509, -7516, 475131, -737124, 981937, -2665027, 764504, 3340411, -183073, 392453, --4699231, -2312303, 811749, 6468758, -4001836, 1433445, -6507949, 6890738, 551903, 2593087, --674847, 1182190, -1167694, -2222109, -5640903, 2543158, -5654325, -2582349, -3141232, 3384971, -2712809, 1367947, 2823941, 5230734, 450435, -4521527, 3171297, 621160, -97711, 2627446, --799401, -1555315, -6659347, 1233193, -1815697, 1620276, 2982318, -3541738, -1330903, 3496640, -1191853, 547608, -3313031, 8869107, 5398774, 1015223, 4368519, 3634616, 3520263, -7787313, -661962, -586263, -1937030, 2151779, 1501628, -1066763, -1297617, -200790, -2182380, 2596308, --685047, 4904316, 59593, -884763, -1948841, -3714610, -466004, 3523484, 171799, 1216550, -4008815, 1739999, 527744, 1751273, 494995, 2195265, 7337952, -3376918, 2528662, -1867237, --3012383, -1158031, -2050847, 4071092, -3141769, -5915244, -1429150, 1723356, -4923643, -2911451, -5803575, 9965398, -1543504, 3894462, -3258270, -3410204, -44023, 1178432, -319438, 42950, -3761855, -6085969, 2147484, -309775, -1191853, -5101885, 572304, 279173, 3076270, 1045825, --3995393, 5586679, -4198868, 5227512, -449361, 1089311, 2178622, -419833, -2408940, 4137127, -1097901, 5472325, 933619, -4471598, 8586713, 6917582, -2206540, -486405, -1486059, -5666136, --3027952, -750009, -853625, 2598992, -3064996, 495532, 2501819, 255014, 115427, -119185, --323196, -2941516, 5385889, 442382, 229781, -1329292, -99321, -4422743, -3206193, -7954817, -8840116, -2449742, -1516124, 6191196, -3015067, 2983392, 14289356, -2199023, 12885, -6063957, --4971962, -7449084, 3639448, -3333968, 1560147, 3425773, -4842576, -4212826, -3192771, -125628, -1023813, -5896453, -2564632, 1937567, 1616518, -2609730, -1316408, 2882460, -3868155, 86436, --2139431, -1073205, -2826625, 1588601, -2630668, 451508, 1518271, -1357747, 5748277, -198105, --1279900, -5033702, 102005, 6152004, 467078, 1768453, -6504728, -9110163, -3596498, -7904888, --7029251, -643708, -3301756, -731218, -8442295, 6339909, -7860327, 607738, 4560719, -5043902, --8215199, -5962489, -2142652, 4636954, 3998615, 6367826, -4603131, -4024921, -3442953, -2915209, -4297115, 787053, -2790118, -1589675, 1473174, 8005819, 810675, -3233574, 424665, -2669859, --631897, 5621576, 9372156, -3203509, -3345243, -8519605, 1024350, 2178622, 4798016, -3179350, -5172215, 882616, 7997229, -6415608, 956704, -12159589, -1434519, 1545115, -3082713, -2656974, --1178969, 4614406, -3796214, -6311992, 1715839, -9302899, -2170569, -4387309, 1963337, -845035, -3069291, 594853, -7318625, -7577933, 83752, 4345970, 7559143, -1301375, -3265249, 6688338, --7241852, -3597035, 3289408, 3352759, 4951024, -4544076, 41339, 2310693, -3204046, -660888, -2870112, -4006131, 5613523, -2058363, -1195075, -5648419, -5214091, 2993592, -118112, 702764, --954020, -3109556, 3496640, -1629403, 4400731, 767189, -5822902, -5148592, 2374043, -1852742, -1401770, -6833293, 5281199, -12599823, 3514894, -5215164, 5294084, 5945846, -5680631, -11009075, -2115808, -1088237, 7772817, -3925600, 11034308, -3998615, 7486128, -8181913, -2650532, 4010963, -5719286, 1859721, 519154, -4874251, -127238, -3755412, -4615479, 3270618, -3843996, 2119030, -1615982, 2515777, -1908576, 5265630, -295279, 4577362, -313533, -7701950, -694174, -2225867, -1481227, 8396124, 1190243, -353798, 281857, -2931852, 3505767, -2753074, 4992363, 4914517, -2435247, 2075006, 8900783, -1712618, -648003, -6204081, 5470178, 4350265, 1742146, 1309428, -1777043, 584116, 3343095, 5168457, 4323959, 2089502, 2884071, -1080184, 7603166, 2343979, --78383, -4851703, 3883724, -1430224, 10936060, 5295158, 2933463, -4505421, 310848, -16558710, --8857296, 3651259, -2989834, 7030325, 7065221, 10445360, 4537096, 4361540, 2842732, -12047383, --2410551, -1484985, 1445793, -1029182, 4173098, 2900177, -4353486, -3592203, 3524558, 6136972, -7920457, 6646999, 8954470, -4560182, -4283156, -6105296, 7013145, -3716221, 5876052, -1294933, -146566, -5759015, -3051574, -3282966, 5406290, 6140193, 1539746, 6118718, 9212168, -3482145, -2693481, 10225243, -4663261, 3273839, 3985730, 303332, 8232379, 9774272, 8048232, 17002164, -3731253, -2606508, -2612951, -3147674, 390305, 2767570, 5790153, -1242856, -1069447, -2159295, --3965866, 1525787, 3130494, 3971771, -10031433, -2018098, 3398930, 6454262, 5666673, -9904731, --6034966, 806917, 2451890, 6264210, 4179540, 8259759, -945430, 1797444, 7052337, 10355703, -5839545, -11111617, 118648, -11821897, -8429410, -4971962, -931471, -7146826, 8814884, 3439732, -5232344, -14701673, -1029182, 9978820, 4993973, -4139275, -6244346, -3578782, 3821447, -11145440, --655519, -7053410, 11230266, -1185411, -3287261, 1506460, -412317, -1598265, 1963874, -2622078, -5188858, 4071629, 7462506, -171799, 344671, 11972758, -3703336, 8171712, -1306744, -906238, -20323248, 2909840, -2243047, -4089346, -15823733, 2207613, -16218333, -2135673, 16944720, -4175245, --3371549, -11147051, -3528316, 1149978, -6410239, 4211753, -664646, -7789997, 9174587, 4263292, -2990908, 3625489, -6378564, 8286066, -10895795, 4661114, 4412542, 2303713, -1063541, -1924145, --2460480, 1271847, 6999186, -13029320, 6131066, -4367445, -6409165, -6097243, 5446556, 6853694, -4149475, 11623792, 8675297, 2032593, 3752728, -8485245, 2152852, 4326643, 9102109, 2037962, --3833258, 3537979, 4444218, -7577396, 1516660, -7783555, 6698539, 6114960, 7795903, -6894497, -4776541, 8296803, -3243237, 2383170, 10928007, -537, -6189048, -4890357, 2711198, -1433982, --6299107, -2425583, 476741, 1856500, 3961571, -4285304, 7723962, 4778151, -1343788, 9190156, --760209, 3654480, 12007118, -12137041, 23222888, -10278930, 3469797, 7150047, -2075543, -1043140, -3202435, 15724949, -554588, -1945620, -187905, -3500398, 7787850, 8609262, -2480344, 3745212, -3191161, 2850785, 5303748, 6707665, 586263, 7187091, 1408212, -6274411, 7902740, 10320270, -6445672, -10333154, 20680268, -6099391, 4137664, -14644765, 6210523, -12906377, 10504953, 1401770, --2606508, -7144678, 9926206, 1650341, 6407018, 6747394, 3488050, -10785200, 5902359, -6378564, --1046898, 5408438, 5652177, 1656784, -1905355, -10784663, 1715303, 10686416, 1297080, 7062000, -7587060, -11264089, 6549825, -5524402, -5746130, 9021579, 9635759, 5371394, 5452998, 1906966, -5217849, -11602854, -5305359, -3415573, 392453, 13228499, 6178311, 5500243, -925565, 6056441, --278636, 14529337, 5201743, 5775121, 2143189, -363462, -20884816, 8156680, 4905927, -1513439, --1505386, -15167140, 123480, -5550172, 3721589, 13965623, -2243047, -7377143, 15927886, -325881, -9169755, -4878546, 520228, -9349070, -260382, -3968013, 3854733, -533113, 12984760, -11951820, -1319092, 4398047, 5701032, -20455856, 12930536, 3205656, -14514842, -9602473, 7450695, 17258790, --6552510, -3798899, -12566001, 24897388, 9642202, 975494, 4001836, -14017700, -8894340, -1225139, -895501, 12528420, 2663954, 9470940, 11266773, -1250372, 534187, 7196218, -2266669, -9329743, --8289824, -2925947, 11205033, -7022272, 14224932, -7592429, 20960514, 8388608, 16899086, -5633387, -2668785, 12554726, -10682121, 5216775, 6105296, 4581120, -6112276, 5990406, 1744831, 967978, -6207302, 11535745, 10935524, -12593918, -2530273, 4063039, -10703059, -8615168, -2718714, -23989540, -6096169, -12984223, -6590091, -129923, -2374043, 5065914, 14618458, 6244346, 6559489, -10711112, --122407, -15686831, -23258858, 12936441, -9334575, 10648298, 3637837, 5272609, 6400038, -15550466, --28476170, 2771328, 4383551, 16404628, -15717433, -17257716, 15323370, -5798206, 7096897, -3068754, -3826816, 2623151, 4212826, -7734163, 4080756, -918049, -2259690, 10202695, 3958886, -1202054, --12715788, -1535451, -135291, -2151779, -381715, -6773701, -16941498, -7399155, 12847321, -5133023, -6455336, -9498857, 7452842, 3959423, 108448, -4659503, -21069498, 12025908, 11671037, 14951318, --10044855, -4104378, 20217484, 17918066, 8394514, 4058207, 11525008, 4421132, 10376641, -5175436, -9039296, -16570521, -850404, 4982699, -4173098, 20337744, 985695, 11257109, -6345278, -10478110, -23350664, -91268, 9360881, -2774012, 486942, -26982596, -2013803, 6190122, -12296491, -15942382, --5006322, -4123706, -26949310, -25283398, -7031399, -376883, 18107046, 14681809, 14465450, -6291054, --2969970, -4235375, 15472083, 6419903, -7293928, -1651952, -5928666, 11142219, 8422968, -7139310, --9957345, -9040906, -18161806, 6911140, -104153, 78920, 3236258, -3037079, 6059125, 24314346, --14678588, 7063611, 857920, -9900973, -6077379, -11673184, 3660386, -5376226, -6316287, 12461848, -931471, -4587562, 12275017, -2058900, -6356552, 4214437, 8769249, -5450314, 9467719, 17960480, -16881368, -12206297, -841277, 4205847, 9211631, -15335181, -3847754, -4295504, 18246632, 8018167, --2723009, -11498164, -13452374, -11263015, 16436303, 14363981, -27714888, -22236120, -17710834, -11469710, -3626026, -9863929, 6387153, 3762928, 2738579, 21510270, 16865800, 10372883, 1294396, -14557792, --7795903, -2478196, 5464809, 8811125, -13049721, 3045669, 340376, -11006927, -5569499, 8485245, --6899865, 6718940, 2461016, 7952132, -10606959, -197032, -23049478, 3230889, -29030758, 11578695, -10950019, -11155104, 12414603, 15480673, -214748, 4360466, -19043348, 10761577, 341987, -7649337, -9169218, -2365990, -666794, -177704, 369367, 19182934, -3055332, 7516, 22576496, -178778, --11846594, -30983894, -26586384, 28491740, 16576963, 7121056, 5978595, -11728482, -25178708, -11585674, -2468533, -8994198, 17301202, -777389, 959925, 20446728, -5804649, -6001143, -6360310, -12433393, --23629300, -16863652, 46551540, -23444078, -13401372, 14220100, -27962922, -17790828, 13520020, 24373402, -1933272, -6425271, 2197950, 5615133, -20404316, -15137612, -10683194, -18685256, -2013803, 17059074, --1625645, 3251827, 8187819, 5360656, -15150497, -7468412, -12592307, -6849399, 15268072, -5092758, --2105071, -2452426, 9089761, 9167071, 27846420, 4204773, 20380156, -1509144, 6588480, -11620571, --8975408, 7168838, -14871861, -16311749, 59056, 4772783, -8707509, 6308770, -10127533, 2670933, --25856776, 13884019, 7386270, 11312407, 889595, -10559177, -21810918, -7821673, -2496450, 17264694, --13969381, -8128763, 4221953, 39807904, -11776263, 40480068, -25726318, 9647033, -10020696, 17657684, --7965554, 30688616, -30010010, 44045428, -5251135, 8930848, 17940078, -32943472, 27866284, -35154308, -22024056, -57171920, 28965260, -29384018, 23427436, -38238632, 29894046, 1304060, 13910325, -17215302, --15572478, 18901078, 32309428, -26106422, 40856952, -1967632, 315143, -1165010, 7347079, -11660299, --8562017, -17661442, -3754338, 989453, 313533, 319975, 16189342, 3146064, 17709224, 17517560, --10644540, 6716792, 36637144, 12329777, 7996692, 5894843, -31419296, 2042257, -4966593, -3526168, --28843926, -5695127, 16761110, 5137318, 5619428, 8807367, 21151640, 5935108, -6487548, -1735167, --1830730, 8336532, -14409078, -8418673, 21692806, 13930726, 10004053, 17241610, 12246026, -6938520, --3930432, -24743306, -11360188, 10583336, 7657390, 19313394, -14171781, -6491306, -5408438, 14230837, -7412577, 12763032, 4247723, -9724343, -10340671, 31477278, -11025181, -30480310, 5204964, 21867290, -12645994, -898722, -6175626, 1525250, -869194, -686658, 8924405, -11874511, -63551020, 18248242, --7231651, -3557307, 16325171, -10371809, 17491254, -1793149, -27153856, -4604205, 3348464, 10199474, -13072807, 3315715, -19008452, 19898046, -6945499, -1379221, -11383811, -5066451, 11184632, -1730872, -10074920, 16053514, -2865280, -19969988, 5294084, 22572738, -19923280, 7913477, 18118856, -2878165, --12862353, -25343528, -16392816, 18279918, 47162500, -14038101, -17536352, 52315388, -2461553, -7338489, -38486128, 21989696, 19638202, 15189689, 7208029, -10925323, 20115480, 17835388, 13320304, 5724655, --33372970, 21585432, 20231980, -36401996, -19859392, -13089987, -8951249, -10059887, 41043244, 19795504, --21364778, 21174188, -6985765, -21337398, 10761577, 10700374, -7781407, -9145596, -31597000, 3553549, -7638063, 24029268, 14090714, 1838246, -17193828, -69881800, 21294448, 39254928, -24582246, -5161477, --19182934, 40428528, 26991722, 17049946, -3495030, -14191109, 2615098, 16305843, 7275138, -7044283, --1904281, 22341884, -1857573, -8198019, -30341260, -14143327, 24778204, 14726369, -16419123, 12818330, --12068858, -3577171, 6986301, 7192997, -7576859, 4686883, -26910118, 7617125, 34720516, -4388383, --7703561, -34718904, -21800718, 17037062, -28408524, -14790794, 5291400, 7139847, -9577240, 22992570, -20390894, -22032646, 7029788, 12539694, 34367792, 32905892, -6653978, 10888279, -2480881, 37607272, -14510547, 15367393, 33539400, -15637439, -25274808, -11665131, -31983010, 25219512, 9215389, 12440373, -3611531, 42681776, -31345208, -6285148, 14442901, -9677635, 15910706, -474057, -2389076, 10248329, --28508920, 17644262, 29002840, 25465934, 26246008, 33292976, -16879222, 26502632, -47598976, -20095616, -20100984, 5757404, 37395744, 17697950, 32137092, -11996917, 5624260, -25252798, 19615116, 31023622, -28675350, 3990025, 20817706, -45906220, -29042032, 30503932, 10213969, -28172838, -13468481, 4798552, -44989784, 14543296, -15830176, -21035676, 6203544, -5323612, 28433220, 29866128, -972810, -3535832, -7606387, -7029251, 36346696, 10996190, -6177237, 8028368, -14345728, -8630200, -75011600, -25123948, -15878494, -10982231, -9339943, 700617, -11640435, -12842489, 37680820, 24740622, -15359340, 33345052, -69337416, 14893336, 50244676, 7795903, 12488154, 36211944, 26062398, -17352204, -18072686, -35865660, --19745576, -448287, -32948304, 16356309, 462783, -32020054, -18836116, -18626200, 1216013, 32364190, --1497333, 27800786, -14949171, 8833137, -55649892, 18138184, -6966974, 31508416, -5608691, -32337346, -36251136, -10937671, 6976638, 21731460, 16368657, 33721936, -3182571, 6949257, -4396973, 38211252, --6060736, 9042517, 26678726, -26697516, 26306674, -4973572, 16674137, 26312580, -4953171, 7732552, -5507759, 4860829, -6276021, 13119514, 11828877, -1764695, -12681428, -94489, -15039902, -2831457, --1741609, 16052977, -5539434, -23541790, -15881715, 30254824, 29226178, -23631446, -20748988, 35794796, -40145596, -12186433, -2549600, 30850750, 2417530, 17326434, 21634288, -44014288, -12637404, -124017, -46803868, 7328288, -1997697, -41554884, 10125385, 20964272, 12753905, 5124433, 13248900, 8426726, -7350300, 61419108, -822486, 8718247, 33249490, 32693828, -56260852, -4246112, -47610248, -44300976, -10797011, 8791798, 7843684, 600759, 41590316, 23246510, 53629648, 58236000, -6547141, -29553670, -6107444, -8525510, -5371931, 12029667, 5738613, -5477157, -26993870, -30421790, 32214940, 13972602, --3484829, 4008815, 5426691, 1986959, 6162205, -4048007, -7388955, -44851268, 1298691, 23991688, --6983617, -34940096, -10640245, 26439282, -50921668, -19010062, 33027224, 18265422, 39390756, -2601677, -3463354, -37348500, -35451196, -47167332, 39076688, 52550000, -70683888, -37448892, -2872260, 34379604, --27426050, -6659347, 66566088, 24510842, 17712446, 41104984, 32869922, 45201308, -15953119, 44762688, --5862631, -39945880, -53173844, -15823196, 22535156, -46552076, -6692096, 5758478, -7087233, -19094350, -11799349, -41660644, 31770410, -2887292, 9583683, 12192875, 11785390, 220654, -14175003, 22494892, -5484673, 21709986, -4908611, -46568720, -4420595, 13238700, -15466714, -17146046, -10613938, -15812996, -18689550, -5008469, -16714939, -1083942, 17365090, -23781770, 16333761, -8340290, 8582418, -23420994, --6033356, 9310415, -2231773, -2269353, 2638721, 12955769, -2555506, -2223719, -16517907, 8011725, --4716411, 2527588, 4780299, 1632625, 11803644, -17728552, -13756780, 18440978, 15674483, -22218940, -10290742, -17949206, 20375324, -17325362, 7487739, 5349382, -14988362, 32530082, 2814277, -36083092, -16295643, 4485557, -28355910, 15848429, -10693932, 16936130, -24713242, 12760885, -26203596, 12242804, -17681306, -15879568, 8820252, -16553878, -111132, 2373506, 1103270, 7594039, -22601192, -124107912, --213919440, -79428440, -168589808, -166905648, 70738112, 4860829, 103264432, 249003952, 223143952, 180752096, -223514928, 132008504, 19923816, 33092186, -45854680, -187386736, -185332672, -141735536, -180371440, -127469264, --36002028, -89917288, -119440360, -58614492, -25385942, -67730560, -38420628, -12904766, -39664560, -61377232, --1182190, 31345746, -26019448, 48134772, 77632072, -9063455, 6043019, 109237128, 48708152, -10100152, -102061848, 81604912, -31990528, 33381560, 95217280, -11922292, -1014686, 139039360, 70638792, 24177444, -171037952, 189527248, 89452896, 179970400, 226323840, 54425824, 25365004, 89392232, -42613056, -117115168, --68761352, -149234544, -261180176, -259831568, -292604832, -389377440, -388820704, -370920896, -374593632, -330299616, --272114080, -205460496, -105280920, 922881, 173103824, 205873344, 138525040, 0, 0, 0, -0, 0, 0, }, +-292058, -565325, 4009352, 2597918, 440771, -1506997, 2077154, 3594888, -1101659, 3978214, +-2531346, -810675, 2589865, 882616, -4480725, 1421097, 2778844, -6218576, -113280, 5133023, +-3015067, -4310000, 4304631, -3466576, 875636, -2539936, 370978, 334471, 381178, -228170, +-3140158, 4502737, -2037425, -1030792, -2770254, -2889976, 176631, -618475, -2095944, -3569118, +-2871723, 5473399, -601295, 2137283, 1509144, -349503, 4178466, 1117228, 2911988, -325881, +-2171106, 2853469, -4024384, -2179159, 36507, -428960, 409096, 973884, 3021510, -1032403, +-602369, -1225139, 843424, -418222, -747324, 1876901, -62814, 2343979, -440234, -1940788, +-1645509, -7516, 475131, -737124, 981937, -2665027, 764504, 3340411, -183073, 392453, +-4699231, -2312303, 811749, 6468758, -4001836, 1433445, -6507949, 6890738, 551903, 2593087, +-674847, 1182190, -1167694, -2222109, -5640903, 2543158, -5654325, -2582349, -3141232, 3384971, +2712809, 1367947, 2823941, 5230734, 450435, -4521527, 3171297, 621160, -97711, 2627446, +-799401, -1555315, -6659347, 1233193, -1815697, 1620276, 2982318, -3541738, -1330903, 3496640, +1191853, 547608, -3313031, 8869107, 5398774, 1015223, 4368519, 3634616, 3520263, -7787313, +661962, -586263, -1937030, 2151779, 1501628, -1066763, -1297617, -200790, -2182380, 2596308, +-685047, 4904316, 59593, -884763, -1948841, -3714610, -466004, 3523484, 171799, 1216550, +4008815, 1739999, 527744, 1751273, 494995, 2195265, 7337952, -3376918, 2528662, -1867237, +-3012383, -1158031, -2050847, 4071092, -3141769, -5915244, -1429150, 1723356, -4923643, -2911451, +5803575, 9965398, -1543504, 3894462, -3258270, -3410204, -44023, 1178432, -319438, 42950, +3761855, -6085969, 2147484, -309775, -1191853, -5101885, 572304, 279173, 3076270, 1045825, +-3995393, 5586679, -4198868, 5227512, -449361, 1089311, 2178622, -419833, -2408940, 4137127, +1097901, 5472325, 933619, -4471598, 8586713, 6917582, -2206540, -486405, -1486059, -5666136, +-3027952, -750009, -853625, 2598992, -3064996, 495532, 2501819, 255014, 115427, -119185, +-323196, -2941516, 5385889, 442382, 229781, -1329292, -99321, -4422743, -3206193, -7954817, +8840116, -2449742, -1516124, 6191196, -3015067, 2983392, 14289356, -2199023, 12885, -6063957, +-4971962, -7449084, 3639448, -3333968, 1560147, 3425773, -4842576, -4212826, -3192771, -125628, +1023813, -5896453, -2564632, 1937567, 1616518, -2609730, -1316408, 2882460, -3868155, 86436, +-2139431, -1073205, -2826625, 1588601, -2630668, 451508, 1518271, -1357747, 5748277, -198105, +-1279900, -5033702, 102005, 6152004, 467078, 1768453, -6504728, -9110163, -3596498, -7904888, +-7029251, -643708, -3301756, -731218, -8442295, 6339909, -7860327, 607738, 4560719, -5043902, +-8215199, -5962489, -2142652, 4636954, 3998615, 6367826, -4603131, -4024921, -3442953, -2915209, +4297115, 787053, -2790118, -1589675, 1473174, 8005819, 810675, -3233574, 424665, -2669859, +-631897, 5621576, 9372156, -3203509, -3345243, -8519605, 1024350, 2178622, 4798016, -3179350, +5172215, 882616, 7997229, -6415608, 956704, -12159589, -1434519, 1545115, -3082713, -2656974, +-1178969, 4614406, -3796214, -6311992, 1715839, -9302899, -2170569, -4387309, 1963337, -845035, +3069291, 594853, -7318625, -7577933, 83752, 4345970, 7559143, -1301375, -3265249, 6688338, +-7241852, -3597035, 3289408, 3352759, 4951024, -4544076, 41339, 2310693, -3204046, -660888, +2870112, -4006131, 5613523, -2058363, -1195075, -5648419, -5214091, 2993592, -118112, 702764, +-954020, -3109556, 3496640, -1629403, 4400731, 767189, -5822902, -5148592, 2374043, -1852742, +1401770, -6833293, 5281199, -12599823, 3514894, -5215164, 5294084, 5945846, -5680631, -11009075, +2115808, -1088237, 7772817, -3925600, 11034308, -3998615, 7486128, -8181913, -2650532, 4010963, +5719286, 1859721, 519154, -4874251, -127238, -3755412, -4615479, 3270618, -3843996, 2119030, +1615982, 2515777, -1908576, 5265630, -295279, 4577362, -313533, -7701950, -694174, -2225867, +1481227, 8396124, 1190243, -353798, 281857, -2931852, 3505767, -2753074, 4992363, 4914517, +2435247, 2075006, 8900783, -1712618, -648003, -6204081, 5470178, 4350265, 1742146, 1309428, +1777043, 584116, 3343095, 5168457, 4323959, 2089502, 2884071, -1080184, 7603166, 2343979, +-78383, -4851703, 3883724, -1430224, 10936060, 5295158, 2933463, -4505421, 310848, -16558710, +-8857296, 3651259, -2989834, 7030325, 7065221, 10445360, 4537096, 4361540, 2842732, -12047383, +-2410551, -1484985, 1445793, -1029182, 4173098, 2900177, -4353486, -3592203, 3524558, 6136972, +7920457, 6646999, 8954470, -4560182, -4283156, -6105296, 7013145, -3716221, 5876052, -1294933, +146566, -5759015, -3051574, -3282966, 5406290, 6140193, 1539746, 6118718, 9212168, -3482145, +2693481, 10225243, -4663261, 3273839, 3985730, 303332, 8232379, 9774272, 8048232, 17002164, +3731253, -2606508, -2612951, -3147674, 390305, 2767570, 5790153, -1242856, -1069447, -2159295, +-3965866, 1525787, 3130494, 3971771, -10031433, -2018098, 3398930, 6454262, 5666673, -9904731, +-6034966, 806917, 2451890, 6264210, 4179540, 8259759, -945430, 1797444, 7052337, 10355703, +5839545, -11111617, 118648, -11821897, -8429410, -4971962, -931471, -7146826, 8814884, 3439732, +5232344, -14701673, -1029182, 9978820, 4993973, -4139275, -6244346, -3578782, 3821447, -11145440, +-655519, -7053410, 11230266, -1185411, -3287261, 1506460, -412317, -1598265, 1963874, -2622078, +5188858, 4071629, 7462506, -171799, 344671, 11972758, -3703336, 8171712, -1306744, -906238, +20323248, 2909840, -2243047, -4089346, -15823733, 2207613, -16218333, -2135673, 16944720, -4175245, +-3371549, -11147051, -3528316, 1149978, -6410239, 4211753, -664646, -7789997, 9174587, 4263292, +2990908, 3625489, -6378564, 8286066, -10895795, 4661114, 4412542, 2303713, -1063541, -1924145, +-2460480, 1271847, 6999186, -13029320, 6131066, -4367445, -6409165, -6097243, 5446556, 6853694, +4149475, 11623792, 8675297, 2032593, 3752728, -8485245, 2152852, 4326643, 9102109, 2037962, +-3833258, 3537979, 4444218, -7577396, 1516660, -7783555, 6698539, 6114960, 7795903, -6894497, +4776541, 8296803, -3243237, 2383170, 10928007, -537, -6189048, -4890357, 2711198, -1433982, +-6299107, -2425583, 476741, 1856500, 3961571, -4285304, 7723962, 4778151, -1343788, 9190156, +-760209, 3654480, 12007118, -12137041, 23222888, -10278930, 3469797, 7150047, -2075543, -1043140, +3202435, 15724949, -554588, -1945620, -187905, -3500398, 7787850, 8609262, -2480344, 3745212, +3191161, 2850785, 5303748, 6707665, 586263, 7187091, 1408212, -6274411, 7902740, 10320270, +6445672, -10333154, 20680268, -6099391, 4137664, -14644765, 6210523, -12906377, 10504953, 1401770, +-2606508, -7144678, 9926206, 1650341, 6407018, 6747394, 3488050, -10785200, 5902359, -6378564, +-1046898, 5408438, 5652177, 1656784, -1905355, -10784663, 1715303, 10686416, 1297080, 7062000, +7587060, -11264089, 6549825, -5524402, -5746130, 9021579, 9635759, 5371394, 5452998, 1906966, +5217849, -11602854, -5305359, -3415573, 392453, 13228499, 6178311, 5500243, -925565, 6056441, +-278636, 14529337, 5201743, 5775121, 2143189, -363462, -20884816, 8156680, 4905927, -1513439, +-1505386, -15167140, 123480, -5550172, 3721589, 13965623, -2243047, -7377143, 15927886, -325881, +9169755, -4878546, 520228, -9349070, -260382, -3968013, 3854733, -533113, 12984760, -11951820, +1319092, 4398047, 5701032, -20455856, 12930536, 3205656, -14514842, -9602473, 7450695, 17258790, +-6552510, -3798899, -12566001, 24897388, 9642202, 975494, 4001836, -14017700, -8894340, -1225139, +895501, 12528420, 2663954, 9470940, 11266773, -1250372, 534187, 7196218, -2266669, -9329743, +-8289824, -2925947, 11205033, -7022272, 14224932, -7592429, 20960514, 8388608, 16899086, -5633387, +2668785, 12554726, -10682121, 5216775, 6105296, 4581120, -6112276, 5990406, 1744831, 967978, +6207302, 11535745, 10935524, -12593918, -2530273, 4063039, -10703059, -8615168, -2718714, -23989540, +6096169, -12984223, -6590091, -129923, -2374043, 5065914, 14618458, 6244346, 6559489, -10711112, +-122407, -15686831, -23258858, 12936441, -9334575, 10648298, 3637837, 5272609, 6400038, -15550466, +-28476170, 2771328, 4383551, 16404628, -15717433, -17257716, 15323370, -5798206, 7096897, -3068754, +3826816, 2623151, 4212826, -7734163, 4080756, -918049, -2259690, 10202695, 3958886, -1202054, +-12715788, -1535451, -135291, -2151779, -381715, -6773701, -16941498, -7399155, 12847321, -5133023, +6455336, -9498857, 7452842, 3959423, 108448, -4659503, -21069498, 12025908, 11671037, 14951318, +-10044855, -4104378, 20217484, 17918066, 8394514, 4058207, 11525008, 4421132, 10376641, -5175436, +9039296, -16570521, -850404, 4982699, -4173098, 20337744, 985695, 11257109, -6345278, -10478110, +23350664, -91268, 9360881, -2774012, 486942, -26982596, -2013803, 6190122, -12296491, -15942382, +-5006322, -4123706, -26949310, -25283398, -7031399, -376883, 18107046, 14681809, 14465450, -6291054, +-2969970, -4235375, 15472083, 6419903, -7293928, -1651952, -5928666, 11142219, 8422968, -7139310, +-9957345, -9040906, -18161806, 6911140, -104153, 78920, 3236258, -3037079, 6059125, 24314346, +-14678588, 7063611, 857920, -9900973, -6077379, -11673184, 3660386, -5376226, -6316287, 12461848, +931471, -4587562, 12275017, -2058900, -6356552, 4214437, 8769249, -5450314, 9467719, 17960480, +16881368, -12206297, -841277, 4205847, 9211631, -15335181, -3847754, -4295504, 18246632, 8018167, +-2723009, -11498164, -13452374, -11263015, 16436303, 14363981, -27714888, -22236120, -17710834, -11469710, +3626026, -9863929, 6387153, 3762928, 2738579, 21510270, 16865800, 10372883, 1294396, -14557792, +-7795903, -2478196, 5464809, 8811125, -13049721, 3045669, 340376, -11006927, -5569499, 8485245, +-6899865, 6718940, 2461016, 7952132, -10606959, -197032, -23049478, 3230889, -29030758, 11578695, +10950019, -11155104, 12414603, 15480673, -214748, 4360466, -19043348, 10761577, 341987, -7649337, +9169218, -2365990, -666794, -177704, 369367, 19182934, -3055332, 7516, 22576496, -178778, +-11846594, -30983894, -26586384, 28491740, 16576963, 7121056, 5978595, -11728482, -25178708, -11585674, +2468533, -8994198, 17301202, -777389, 959925, 20446728, -5804649, -6001143, -6360310, -12433393, +-23629300, -16863652, 46551540, -23444078, -13401372, 14220100, -27962922, -17790828, 13520020, 24373402, +1933272, -6425271, 2197950, 5615133, -20404316, -15137612, -10683194, -18685256, -2013803, 17059074, +-1625645, 3251827, 8187819, 5360656, -15150497, -7468412, -12592307, -6849399, 15268072, -5092758, +-2105071, -2452426, 9089761, 9167071, 27846420, 4204773, 20380156, -1509144, 6588480, -11620571, +-8975408, 7168838, -14871861, -16311749, 59056, 4772783, -8707509, 6308770, -10127533, 2670933, +-25856776, 13884019, 7386270, 11312407, 889595, -10559177, -21810918, -7821673, -2496450, 17264694, +-13969381, -8128763, 4221953, 39807904, -11776263, 40480068, -25726318, 9647033, -10020696, 17657684, +-7965554, 30688616, -30010010, 44045428, -5251135, 8930848, 17940078, -32943472, 27866284, -35154308, +22024056, -57171920, 28965260, -29384018, 23427436, -38238632, 29894046, 1304060, 13910325, -17215302, +-15572478, 18901078, 32309428, -26106422, 40856952, -1967632, 315143, -1165010, 7347079, -11660299, +-8562017, -17661442, -3754338, 989453, 313533, 319975, 16189342, 3146064, 17709224, 17517560, +-10644540, 6716792, 36637144, 12329777, 7996692, 5894843, -31419296, 2042257, -4966593, -3526168, +-28843926, -5695127, 16761110, 5137318, 5619428, 8807367, 21151640, 5935108, -6487548, -1735167, +-1830730, 8336532, -14409078, -8418673, 21692806, 13930726, 10004053, 17241610, 12246026, -6938520, +-3930432, -24743306, -11360188, 10583336, 7657390, 19313394, -14171781, -6491306, -5408438, 14230837, +7412577, 12763032, 4247723, -9724343, -10340671, 31477278, -11025181, -30480310, 5204964, 21867290, +12645994, -898722, -6175626, 1525250, -869194, -686658, 8924405, -11874511, -63551020, 18248242, +-7231651, -3557307, 16325171, -10371809, 17491254, -1793149, -27153856, -4604205, 3348464, 10199474, +13072807, 3315715, -19008452, 19898046, -6945499, -1379221, -11383811, -5066451, 11184632, -1730872, +10074920, 16053514, -2865280, -19969988, 5294084, 22572738, -19923280, 7913477, 18118856, -2878165, +-12862353, -25343528, -16392816, 18279918, 47162500, -14038101, -17536352, 52315388, -2461553, -7338489, +38486128, 21989696, 19638202, 15189689, 7208029, -10925323, 20115480, 17835388, 13320304, 5724655, +-33372970, 21585432, 20231980, -36401996, -19859392, -13089987, -8951249, -10059887, 41043244, 19795504, +-21364778, 21174188, -6985765, -21337398, 10761577, 10700374, -7781407, -9145596, -31597000, 3553549, +7638063, 24029268, 14090714, 1838246, -17193828, -69881800, 21294448, 39254928, -24582246, -5161477, +-19182934, 40428528, 26991722, 17049946, -3495030, -14191109, 2615098, 16305843, 7275138, -7044283, +-1904281, 22341884, -1857573, -8198019, -30341260, -14143327, 24778204, 14726369, -16419123, 12818330, +-12068858, -3577171, 6986301, 7192997, -7576859, 4686883, -26910118, 7617125, 34720516, -4388383, +-7703561, -34718904, -21800718, 17037062, -28408524, -14790794, 5291400, 7139847, -9577240, 22992570, +20390894, -22032646, 7029788, 12539694, 34367792, 32905892, -6653978, 10888279, -2480881, 37607272, +14510547, 15367393, 33539400, -15637439, -25274808, -11665131, -31983010, 25219512, 9215389, 12440373, +3611531, 42681776, -31345208, -6285148, 14442901, -9677635, 15910706, -474057, -2389076, 10248329, +-28508920, 17644262, 29002840, 25465934, 26246008, 33292976, -16879222, 26502632, -47598976, -20095616, +20100984, 5757404, 37395744, 17697950, 32137092, -11996917, 5624260, -25252798, 19615116, 31023622, +28675350, 3990025, 20817706, -45906220, -29042032, 30503932, 10213969, -28172838, -13468481, 4798552, +44989784, 14543296, -15830176, -21035676, 6203544, -5323612, 28433220, 29866128, -972810, -3535832, +7606387, -7029251, 36346696, 10996190, -6177237, 8028368, -14345728, -8630200, -75011600, -25123948, +15878494, -10982231, -9339943, 700617, -11640435, -12842489, 37680820, 24740622, -15359340, 33345052, +69337416, 14893336, 50244676, 7795903, 12488154, 36211944, 26062398, -17352204, -18072686, -35865660, +-19745576, -448287, -32948304, 16356309, 462783, -32020054, -18836116, -18626200, 1216013, 32364190, +-1497333, 27800786, -14949171, 8833137, -55649892, 18138184, -6966974, 31508416, -5608691, -32337346, +36251136, -10937671, 6976638, 21731460, 16368657, 33721936, -3182571, 6949257, -4396973, 38211252, +-6060736, 9042517, 26678726, -26697516, 26306674, -4973572, 16674137, 26312580, -4953171, 7732552, +5507759, 4860829, -6276021, 13119514, 11828877, -1764695, -12681428, -94489, -15039902, -2831457, +-1741609, 16052977, -5539434, -23541790, -15881715, 30254824, 29226178, -23631446, -20748988, 35794796, +40145596, -12186433, -2549600, 30850750, 2417530, 17326434, 21634288, -44014288, -12637404, -124017, +46803868, 7328288, -1997697, -41554884, 10125385, 20964272, 12753905, 5124433, 13248900, 8426726, +7350300, 61419108, -822486, 8718247, 33249490, 32693828, -56260852, -4246112, -47610248, -44300976, +10797011, 8791798, 7843684, 600759, 41590316, 23246510, 53629648, 58236000, -6547141, -29553670, +6107444, -8525510, -5371931, 12029667, 5738613, -5477157, -26993870, -30421790, 32214940, 13972602, +-3484829, 4008815, 5426691, 1986959, 6162205, -4048007, -7388955, -44851268, 1298691, 23991688, +-6983617, -34940096, -10640245, 26439282, -50921668, -19010062, 33027224, 18265422, 39390756, -2601677, +3463354, -37348500, -35451196, -47167332, 39076688, 52550000, -70683888, -37448892, -2872260, 34379604, +-27426050, -6659347, 66566088, 24510842, 17712446, 41104984, 32869922, 45201308, -15953119, 44762688, +-5862631, -39945880, -53173844, -15823196, 22535156, -46552076, -6692096, 5758478, -7087233, -19094350, +11799349, -41660644, 31770410, -2887292, 9583683, 12192875, 11785390, 220654, -14175003, 22494892, +5484673, 21709986, -4908611, -46568720, -4420595, 13238700, -15466714, -17146046, -10613938, -15812996, +18689550, -5008469, -16714939, -1083942, 17365090, -23781770, 16333761, -8340290, 8582418, -23420994, +-6033356, 9310415, -2231773, -2269353, 2638721, 12955769, -2555506, -2223719, -16517907, 8011725, +-4716411, 2527588, 4780299, 1632625, 11803644, -17728552, -13756780, 18440978, 15674483, -22218940, +10290742, -17949206, 20375324, -17325362, 7487739, 5349382, -14988362, 32530082, 2814277, -36083092, +16295643, 4485557, -28355910, 15848429, -10693932, 16936130, -24713242, 12760885, -26203596, 12242804, +17681306, -15879568, 8820252, -16553878, -111132, 2373506, 1103270, 7594039, -22601192, -124107912, +-213919440, -79428440, -168589808, -166905648, 70738112, 4860829, 103264432, 249003952, 223143952, 180752096, +223514928, 132008504, 19923816, 33092186, -45854680, -187386736, -185332672, -141735536, -180371440, -127469264, +-36002028, -89917288, -119440360, -58614492, -25385942, -67730560, -38420628, -12904766, -39664560, -61377232, +-1182190, 31345746, -26019448, 48134772, 77632072, -9063455, 6043019, 109237128, 48708152, -10100152, +102061848, 81604912, -31990528, 33381560, 95217280, -11922292, -1014686, 139039360, 70638792, 24177444, +171037952, 189527248, 89452896, 179970400, 226323840, 54425824, 25365004, 89392232, -42613056, -117115168, +-68761352, -149234544, -261180176, -259831568, -292604832, -389377440, -388820704, -370920896, -374593632, -330299616, +-272114080, -205460496, -105280920, 922881, 173103824, 205873344, 138525040, 0, 0, 0, +0, 0, 0, }, }, { { 7273527, --3756486, 1766305, -492311, 683437, -1034013, 3728032, 5650567, -2708514, 1975148, -641024, -1970316, -2550674, -298500, 1482838, -3415036, -3418257, 1109175, 1793686, -4001836, 1832877, --2221035, -3002182, 195958, -1574106, -2990371, -3769371, -674310, 3165391, -683437, 1203665, -2091649, 1171452, 1504312, 1778117, 1533303, 3668439, -5411122, 1407676, -3522947, 1968706, -3813931, 230318, -816044, -3289408, 1298691, -556198, 578210, 1159641, 636192, -1294933, --2845416, -2114735, -3673808, 779000, 3758, 449898, 1728724, 2381559, 707059, 4234301, -242129, -2643016, 2880849, -812823, -537408, -900869, -3913252, 3384971, 1664300, 2967823, --3499325, -5673115, -1708323, 2509335, 1876364, -2925947, -8451959, 966368, 5605469, 1938641, -3659849, -5272073, -2886218, 274878, -920734, 1458678, 4436701, -10589779, -60130, 3535295, -2110977, 3263638, -3067144, -4250407, 4653060, -30602, 1300301, 2945811, 3846680, 1469953, -802622, 3512210, -513249, -1050120, -2992519, 1669132, -848793, -424128, -1562294, 2052458, -5042829, 89121, -1068373, 2450279, -3256122, -4765803, -2700461, -903554, -3168612, 363998, --760209, 2117419, -1998234, 653909, -3972308, -284005, -3280818, -55298, -1537061, -1171452, -1578937, -1753420, -264141, 2775623, -1482301, 3294777, 3745748, 412317, 5082557, -2513630, --305480, 2637110, -1048509, 1842541, 2181844, 1458141, -2949569, 1276679, 974958, 1101659, --205622, -2037962, 13946833, -4137127, 1202591, -3228742, -409633, -1437740, 1464584, 942745, -4673998, 1334124, 682363, 1721208, -1335735, -9896678, -9494562, -3064459, 1076426, 2705293, --2538863, 382252, -3206730, -1231045, -25233, 1503775, -4318053, -4653597, -1516124, -435939, -2242510, 651224, -1203665, -3400004, 378494, -1939178, -107911, 2128693, -3503620, 1437203, -2721936, -2437394, -6271189, -1728724, 1980517, -508417, 1560147, -443992, 1313186, -430034, -1458141, 182536, -5903970, 963146, 2050310, -1043677, 1293859, 114354, -614180, -1272921, --244813, -3484292, -616865, -1071594, -4545149, -869731, -499290, 3567507, -4092030, 5967857, -6703907, 5436355, -2929705, -1345399, -1864553, 2485712, -1716913, -1867774, 717796, -13207024, -12885, -1949915, 1016834, -355409, -6793028, -1212255, -1358820, 2261300, 3443490, -4502737, -3778498, -1061931, 2631741, 2663954, -1293859, 5658083, 428960, 366146, -870805, 1085553, --1284732, 1148904, -1454383, 336618, -3527779, 522375, 4083977, 137439, 1774895, 4345433, --4037806, -4210142, 1915019, -1828046, 3462281, -3245922, -925565, -6951942, -5379984, -4586488, -2181844, 785442, 2639258, -2405182, -1724966, -351114, 4583267, -4744865, 2164127, 1063004, -498753, 2714419, -1585380, -2042257, -2825552, 2046015, 1121523, -4126927, -4648765, -5345087, -16106, -934155, 2018098, 30065, -847182, 826781, 983548, 2827699, -6438693, 1174137, -4095251, 6026913, 6130529, 5196911, -448287, -3111704, -7060926, 5536750, -3408057, 6462315, -8199630, 5380521, 631897, 2935610, 1224603, 6846715, -2629057, -2643016, 2474975, -216359, -3231426, 5437966, -6022618, 2865280, 6775848, 3578245, 286152, 675384, 1459215, -2085744, -683437, -1927904, -2978023, -233539, 6469295, -1415192, 3401077, -1246614, -2764885, 7616588, --5246303, 5363878, 5790690, 1756105, 3948686, -3672734, -459025, -985695, -640487, 3981972, -1734093, -3983045, 1549410, 336618, 1684164, -219580, 2506114, 2473364, 6518687, -5149666, -3689914, 3132642, 213138, 3138011, 1461900, 4420595, 4139812, 3016141, -1072131, 3767223, -5838471, 877247, 3813931, -1044214, 6818798, 7180649, 7645579, -710817, -3600793, 2819109, -532576, 3830037, 3271155, 10885058, -999654, -3437585, 10386305, -4145717, 4692252, -2559264, --9855339, 1684164, -2780455, 213138, 11964168, -4717485, -5519033, 319975, 6365679, -10200547, --3588982, 7362648, -2492155, 2241436, 3738232, -2903935, 3435974, -2338073, -3269007, 442382, --750546, -1502702, -1039919, 3895535, -3098819, 7850127, 2326262, -179315, -4383551, -1774358, -5328981, -6151467, 1570884, 1546188, -524523, -8478265, 5869073, 946503, 1765232, 162672, --658741, 3542811, -1981591, 5016522, 3714610, -2875481, -9224516, 3607236, 3178813, -1034550, --2165201, 1497333, 6933688, 5460514, -19864, 2761127, -5021354, 3053722, -232465, -3235184, -3341485, 3541738, -2538326, 3289945, 1920387, -3957276, -533650, 1670205, -1899449, 6131066, -4050154, 3677566, 10673531, 1795833, -2146410, -12639552, 4481799, 7874286, 4878009, 3355980, --669478, 4233227, 14674293, -1272921, 7013682, 1105417, 4114042, 1867237, 693637, 3323231, --759136, -5612986, -1268626, -4048544, -745177, -5901285, 2733210, 670015, 7903277, 1952063, --3044058, 2962454, -628139, -1328756, 5221070, 2222646, 4012036, 2600066, -1634235, -7818988, -950798, 5372467, 105764, -1066763, 2614025, -3864397, -1432909, -7216082, -9176734, 5545877, -5996848, 4907000, -909459, -994822, 527744, 437013, 3300146, 124554, 3577171, 3418794, -383863, 3524021, -2186138, 1449552, -911070, 2405719, 2604898, 9770514, 561567, 8164196, --2212445, -6795175, -85362, -175557, -2225867, 6908992, 360777, 4758287, -11557220, -345208, -11887396, 16284905, -6685654, 1843615, 2659122, -5639829, -3208878, 637803, -4617090, -4920959, -11483669, 1570884, -7438347, -1234266, -4808216, -2848100, 7530152, -2378875, -3146064, 6656663, -4294968, 6715182, -2730526, 1314260, 6786585, 197569, -3807489, 1708323, -396211, 708133, --8199630, -5849746, 2706903, -741956, 2206540, -7883950, 3846680, 2651606, 2036888, -13807246, --7731478, -3658239, -1449552, 1711545, -5690295, -4227322, 1611150, 10172093, 7166690, 3409667, --1546725, -1457605, -3630858, 2674691, -813359, -8092256, -5553930, -1120450, 243203, 10486700, -6437619, -5914170, -5652177, 7000260, 1930051, -5199595, 485331, 6036040, 3034395, -711354, --8351564, 8531953, -2938831, 4633733, 2043868, 2436320, -2947421, 5022428, -5953362, 7236483, --442919, -1695438, 3940633, -6889128, 2625299, 4075924, 978716, 2913062, 3551401, -1706713, -8036421, -3471944, -13166222, -7736847, -1554778, 743029, -2627446, -5490579, -6041409, -4015795, -13339632, -3418794, -827318, 2124935, -2517925, 1800128, 10987063, -4947803, 5330055, -3120831, --6706592, 6448357, 4705137, 3110093, 9882720, 469225, 4779762, -164819, 1391033, -114354, --2926483, 2397129, -482110, 7271380, 1660005, -4533875, -966905, -1095754, -44560, -7550016, -3459596, -7425999, 2203318, 10754598, -6451041, -12674448, 3398393, 2181844, 6387153, -2234994, -343597, 6541235, -3223910, 3485903, 5140002, 1837172, -1909113, 6714645, 2476049, 8625905, --10002442, 24328842, -5224828, 11145977, 1373316, 4883378, 3604015, 335007, -13074954, 11825656, --16393353, 5823976, 4347044, 15496779, -6744710, 7216082, -10328323, 7377143, -3135326, -11034845, --5193689, 3135326, 3227668, 4629975, 2413772, 6470905, 4217121, 9584756, -2568927, -7019051, --6487548, 3091303, 158377, -3222299, 6338835, 3146064, -1038308, 4129611, 7766912, -204548, -2145873, -630286, 3913252, 2710124, -9529459, -3696356, -12552042, -2396055, -2035815, 242129, -6190659, 5967857, 883153, -2947958, -18790, -1341104, -2990908, 2275796, 17847200, 2201171, --433792, 6285685, -510564, 7129646, -2919504, 725313, -4419522, 18572512, 3984656, -6689949, --8734890, -4947803, 321586, 297963, -11883101, 1261110, 2308008, 1001801, 12365748, 935229, -10252624, 6194954, 10036265, 3306588, -10555956, 10041097, -6845641, 17463338, -11588896, -3444027, --15955267, -3390877, -1940252, 6915434, -7596724, 10188199, 7946763, -5020280, 246424, 11676405, -16128139, -5281199, 33823, -2174327, 4760435, 64425, -2361695, 2384244, 4057134, -7858180, -5433671, 1133335, 6270116, 2605972, 479426, -13400835, -2763275, 15593953, -2497524, 5238787, -11259794, 3476776, -1650878, -4132296, -6273337, -3256122, -284005, -5079873, -3962644, 9064528, -7384660, 2656437, 12821551, 9241696, -4025995, -1353452, 674310, 3233574, -5574868, -11038066, -12935905, 6337224, -4597763, 13157632, 11949136, 15302432, 4565014, 2197950, -8018704, 179315, --10734197, -6633040, -7694434, -16207059, 13504451, 589484, 2282775, -2279554, 904628, -1977833, --21032992, 2194728, -440771, -3954591, -1796907, -10438381, 11476689, 11812234, 13190381, -22045530, -6779069, 4291209, 270046, 21300890, 8551817, -10938745, -1545115, 21016886, 2201708, 3549254, -4018479, -6495065, 3217468, 4121558, 12851079, 6428493, -10453414, -16882980, 5902896, 3639985, --8762807, -1885491, 392990, -10536629, 726923, 12109660, 4847408, 6609955, 9636833, 15991774, -1037772, 14006425, 2309082, -6201933, -1412507, -9055939, -5089000, 3018288, 4230543, 3126199, -6550899, -10958609, -5407364, 17637284, -2190433, -4821101, -11190000, 7737384, 6906845, 1590212, -2185065, -1502165, 3797825, -9650792, 11643656, -8699993, -9689446, -9177271, -6898255, 13562970, -244276, -5158256, 19280646, 22716082, -6007049, 6292664, -1830730, -6801081, 1149978, -15418933, --9638980, -773631, -3271155, 30560302, -13990856, 3844533, -19682224, -2930242, 11669963, -5054103, --11066520, -11421392, -4394826, 4652524, 5811091, -787590, -1229971, -12797929, 2749853, 8946954, -4243428, 5497022, 1349694, 2024540, -7762080, -2406792, 4693326, 1887101, -337155, 631360, --9342091, 4092567, -9829033, -1438814, -620623, 2870649, -10908680, -950798, 4749160, 7701950, --12415677, -6115497, 20831666, -7984881, -17258790, 14319421, -14161044, -4061429, -6582575, -2181307, --11062762, -6969658, -2830384, -10224707, -15757161, 24675660, 12653511, 11249056, 6563784, -8970039, --4664872, -5830955, 5667210, -10809359, 6633040, -5323075, 1385664, -1897839, 31182536, -15318001, -13023415, -29631516, 6951942, -19169512, -4370666, 9259949, -1863479, 5609228, 9699647, 7593502, --13488345, 8427800, 954557, 5994164, -3670050, 8672076, 7897371, -2864206, 874563, 4853850, -5500243, -10124849, -4168266, -14349486, -2674154, 10948945, -698469, -6536940, 196495, 3481071, --204011, -5796059, -10627897, 1535988, -7533373, 5296232, -7184944, 21945136, -3215857, -13328357, --15103252, 2257542, -8792335, 6288906, -16829292, -13212930, -17091286, 2767570, -14620606, -4129074, --20503100, 12921946, 1683627, 8388071, 4576825, -21816286, 424665, -2813741, -9007083, -12636331, --4381941, -10931229, -13720810, -7948374, 4642860, 7169374, 10893111, -8118025, 639413, 3856881, --18398566, 6375342, -12400107, -26419954, -7409356, 30431454, 26906360, 15344308, -12572443, 13595182, -20161650, -12716861, 17820894, -13700409, 16451335, 4314832, -879395, 5857799, -164283, 9071508, --12655658, -3085934, -5646809, 7082938, -12041478, -10313290, 17170742, -1018981, -3505767, 2267206, --16486769, 311385, 26564372, 15191836, 2989834, 480499, 5597953, 25896506, 10632192, 1175747, -4106526, -6131603, -3150896, -5129265, 10595684, -4705674, 6969658, 2292976, 12613782, -14310294, --650688, 99321, 16643, -3240016, 6771016, 12708808, -3212099, -2109903, 11151346, 2599529, -846645, 27834072, 3497177, 1800128, -12882754, 6918656, -9851044, 13977434, -15093589, -10667625, -931471, -10214506, -14322105, -17657148, 4248260, -3559454, 9203041, 972810, 4636417, -21522618, -21570400, -35108672, 13651017, 14286135, -25199646, -3225521, -21712134, -7633231, -19581292, -9218074, -20692078, -8071318, -2384244, -15821049, -3753802, 2770791, -23234700, -1567663, 13469017, -28351616, -162135, -19571092, -11062225, -298500, 1160178, -13181792, -10937671, -11149198, -3923990, -9674414, --1496259, 4141959, -3649649, 6363531, -14439143, -9255655, 17068200, -9083319, 8786966, -11374684, -9163313, 8650601, 573915, 1836099, 8428336, -197032, 12428025, 16415365, -4296041, 1875827, -24245090, 848793, 11891691, -1581085, -11258720, -20664698, 2149094, 13187697, -23307176, -425202, --14274861, -7559143, -29969208, 11572789, 17420388, -5772973, 7540889, -5548561, 18838264, 21684754, --3689914, -23689966, -23969138, 29687888, -26732414, 7064148, 1132261, 6497749, 37493992, 42267312, --2321967, -31483184, 31470300, -34423628, 5013838, 14972256, 3753802, -3425773, -15906948, 18319110, --7991324, -6132677, -16236050, -9134322, -5042292, -19975356, -11170673, -8709120, -5086315, -2940979, -14103599, 214748, 12168716, 533650, -5334887, -17349520, -19594178, -4442070, -812286, 248034, --3084860, -6761889, -8575439, 9896678, 22310208, -11628087, 7550016, -7012608, -8077223, 9571335, --8951786, -13433047, 31283468, -2780991, 2598455, 2287070, -17967458, -3102577, -4069482, 9752797, --23187454, -9231495, 23643258, 4777078, -10743324, 14047764, 23935852, -12921409, -17861696, 10030359, --15307263, 1375463, -28137404, 10049150, 22386980, -1081258, 11114838, 8478802, 2854543, 28176060, -6862821, 1413581, 13268765, 615254, -51831128, -36516348, 14307073, -15867220, -14953466, -44219372, --13195750, 8592619, 2973728, -9274982, -24824910, -1020592, 11666742, -1615445, 1068910, 11988864, -21990232, -20323248, 50825032, -13979045, -17645336, -5954972, -3456375, -537408, -20906290, -318901, --4133906, 10062572, -7415261, 14558865, -6900402, -13907104, 4835060, 5493263, -12202002, 11888469, --39669928, -570694, -3637301, 14724759, 18400714, -14616847, 17135308, -7719667, 4562866, -9409200, --3292629, -6198712, 13642427, -2942053, 18116708, 27904402, -25678536, -8201777, 13183939, -18207976, -9874667, -20585778, -11074036, -10961293, -11724724, -21158082, -10523207, 7638600, 7087770, 13429826, -19187766, 12375411, -24283746, 823560, 3765613, 3122441, 3843459, 12010339, -9385040, 5934571, --11864847, -36053568, 25066502, -45804216, 30103962, -5673652, -21222508, -18194018, -20287814, -14026826, --11315091, -186294, 21679384, -2996277, -20596516, 19349364, 27673012, -45639396, -13247827, 2003065, --5057324, -8038568, -3620121, -7260106, -9321690, -14016089, 15093589, -6855842, -13805636, -22238804, --22521198, 19705310, 3920232, -4830765, -3798362, -1004486, -6169721, -6663642, 3026341, -19641422, -8586713, 20217484, 14244259, 8894340, 18638548, 22593138, -15187541, 4060892, -21165598, 20134270, --13760001, -4406637, -1840930, -31678606, 8232916, 24415816, 2534568, -11297375, -10266046, 32243930, --15159087, -15127949, 7441031, -34559456, -5809480, -17480516, -1136019, -33659120, 11967389, 5244692, -11779485, -53813792, -47462072, 7801808, -16821776, -9199820, 5233955, 41652056, -52712132, 58042188, -18653580, 252329, 6871948, -38226284, 10620380, 21065204, -4784594, 49703508, -11225434, 22678502, --14391362, 54520316, 517544, -5000416, -17615272, -5282273, 10130754, -3238942, 23780160, 18556944, --3030636, 3457449, -18045842, 9905268, 23685670, 23368918, -20580410, 11766063, -1897839, 24821152, --3434363, 16856672, -10974715, -8741869, -28162638, 4150549, -16756278, -26947162, 44121124, -16182363, --639413, -5747203, -6828461, 7700877, 6532109, 16724066, -3688303, 24574730, 5371394, 42855184, -18945638, 47259672, 41634340, -1422171, 29073170, 21990770, -3086471, 25551834, 34964792, -10658498, --27287000, 20685100, 15526307, 28709708, 17276506, 1046898, 4046933, -29217052, 1421634, -4750234, --7139847, 51606716, 2075543, 18502182, 17965312, -37463924, 74563320, -9068823, -7329899, -3758097, -54459112, -31962072, 27726698, -35070020, 34974992, 7898982, -5850819, 1875827, 20797842, -7576859, -19430432, -7632694, 599685, 38704096, 12299713, -8579734, 588411, 10479183, 8105677, -35432944, -10441065, -12195560, -2638721, -18124762, 19274202, 18836116, 3398930, 9545565, 32063542, -9261560, --49435612, 13152800, 33364380, -11501922, -32327682, 9956808, 24032490, 9170829, 566399, -38176892, --18373334, -22090090, 22431540, 10146323, 23089208, -46190764, 3554622, -7483981, -51921324, -12324409, -8244190, 25017648, 33578592, -16326781, 62272732, 13238700, 1688459, -11528766, -24222542, -16088411, -12397960, -27533962, 59062244, -17681306, 3477850, 35187592, -21274584, 21521008, -20163260, -12465069, -51504176, -17483738, -43212204, 24842090, 15902116, 24866250, -9806484, -6869800, 10059887, 244813, -2877091, 1117228, 4896263, 1379221, -6824703, 32221918, -7496866, -21807696, 9277666, -310311, --19493246, 7052873, 4399121, 13514115, -9070434, -14365055, 15672873, -12353400, -1886564, -3409130, -12801150, -21974664, 7445326, -13457743, 11127187, -19262392, 6772090, -6138045, 3138547, 43698608, --29986924, 6155762, 9210020, -26226680, 9398999, 12925167, -20182052, -3522410, -7959112, 36575940, -2647311, -40878960, 24484534, -32877974, 5694053, 18148384, -16556025, 20693152, -24518894, -19001472, -26866632, -3745748, 11148661, -39985608, 7205882, 9882720, -2626373, -5202279, -765578, 17835926, -262530, -53099216, 32746978, -1871532, 12699145, -12367358, -15867757, 55006720, 2809982, 18293876, --9295920, -109274704, -229992816, -93104152, -173680432, -211110528, 71850504, -3059091, 73774120, 286434048, -249981056, 141203488, 274163328, 151832992, 15359877, 93270048, 56729000, -106656920, -75816912, -23904178, --117736328, -142184352, -48491256, -73019272, -112675248, -29928406, -6787122, -143178096, -98934032, -16718160, --87383792, -112985560, -33870112, -56360708, -122130080, -24956444, 11028402, -69390032, -52749716, 49488760, --19320910, -74051144, 14484777, 46786152, -36357972, 28368258, 105465608, -16425029, -28170690, 104006392, -56266220, -26467200, 174636592, 236275808, 148412064, 249600416, 374640864, 287713952, 275608064, 400419264, -349428352, 257099424, 317266560, 287695168, 187473712, 165366448, 95411624, -21500606, -111418968, -210987584, --297894624, -359043168, -444289664, -476471872, -485214272, -545162880, -419987136, -176518320, -128365832, 0, -0, 0, 0, }, +-3756486, 1766305, -492311, 683437, -1034013, 3728032, 5650567, -2708514, 1975148, -641024, +1970316, -2550674, -298500, 1482838, -3415036, -3418257, 1109175, 1793686, -4001836, 1832877, +-2221035, -3002182, 195958, -1574106, -2990371, -3769371, -674310, 3165391, -683437, 1203665, +2091649, 1171452, 1504312, 1778117, 1533303, 3668439, -5411122, 1407676, -3522947, 1968706, +3813931, 230318, -816044, -3289408, 1298691, -556198, 578210, 1159641, 636192, -1294933, +-2845416, -2114735, -3673808, 779000, 3758, 449898, 1728724, 2381559, 707059, 4234301, +242129, -2643016, 2880849, -812823, -537408, -900869, -3913252, 3384971, 1664300, 2967823, +-3499325, -5673115, -1708323, 2509335, 1876364, -2925947, -8451959, 966368, 5605469, 1938641, +3659849, -5272073, -2886218, 274878, -920734, 1458678, 4436701, -10589779, -60130, 3535295, +2110977, 3263638, -3067144, -4250407, 4653060, -30602, 1300301, 2945811, 3846680, 1469953, +802622, 3512210, -513249, -1050120, -2992519, 1669132, -848793, -424128, -1562294, 2052458, +5042829, 89121, -1068373, 2450279, -3256122, -4765803, -2700461, -903554, -3168612, 363998, +-760209, 2117419, -1998234, 653909, -3972308, -284005, -3280818, -55298, -1537061, -1171452, +1578937, -1753420, -264141, 2775623, -1482301, 3294777, 3745748, 412317, 5082557, -2513630, +-305480, 2637110, -1048509, 1842541, 2181844, 1458141, -2949569, 1276679, 974958, 1101659, +-205622, -2037962, 13946833, -4137127, 1202591, -3228742, -409633, -1437740, 1464584, 942745, +4673998, 1334124, 682363, 1721208, -1335735, -9896678, -9494562, -3064459, 1076426, 2705293, +-2538863, 382252, -3206730, -1231045, -25233, 1503775, -4318053, -4653597, -1516124, -435939, +2242510, 651224, -1203665, -3400004, 378494, -1939178, -107911, 2128693, -3503620, 1437203, +2721936, -2437394, -6271189, -1728724, 1980517, -508417, 1560147, -443992, 1313186, -430034, +1458141, 182536, -5903970, 963146, 2050310, -1043677, 1293859, 114354, -614180, -1272921, +-244813, -3484292, -616865, -1071594, -4545149, -869731, -499290, 3567507, -4092030, 5967857, +6703907, 5436355, -2929705, -1345399, -1864553, 2485712, -1716913, -1867774, 717796, -13207024, +12885, -1949915, 1016834, -355409, -6793028, -1212255, -1358820, 2261300, 3443490, -4502737, +3778498, -1061931, 2631741, 2663954, -1293859, 5658083, 428960, 366146, -870805, 1085553, +-1284732, 1148904, -1454383, 336618, -3527779, 522375, 4083977, 137439, 1774895, 4345433, +-4037806, -4210142, 1915019, -1828046, 3462281, -3245922, -925565, -6951942, -5379984, -4586488, +2181844, 785442, 2639258, -2405182, -1724966, -351114, 4583267, -4744865, 2164127, 1063004, +498753, 2714419, -1585380, -2042257, -2825552, 2046015, 1121523, -4126927, -4648765, -5345087, +16106, -934155, 2018098, 30065, -847182, 826781, 983548, 2827699, -6438693, 1174137, +4095251, 6026913, 6130529, 5196911, -448287, -3111704, -7060926, 5536750, -3408057, 6462315, +8199630, 5380521, 631897, 2935610, 1224603, 6846715, -2629057, -2643016, 2474975, -216359, +3231426, 5437966, -6022618, 2865280, 6775848, 3578245, 286152, 675384, 1459215, -2085744, +683437, -1927904, -2978023, -233539, 6469295, -1415192, 3401077, -1246614, -2764885, 7616588, +-5246303, 5363878, 5790690, 1756105, 3948686, -3672734, -459025, -985695, -640487, 3981972, +1734093, -3983045, 1549410, 336618, 1684164, -219580, 2506114, 2473364, 6518687, -5149666, +3689914, 3132642, 213138, 3138011, 1461900, 4420595, 4139812, 3016141, -1072131, 3767223, +5838471, 877247, 3813931, -1044214, 6818798, 7180649, 7645579, -710817, -3600793, 2819109, +532576, 3830037, 3271155, 10885058, -999654, -3437585, 10386305, -4145717, 4692252, -2559264, +-9855339, 1684164, -2780455, 213138, 11964168, -4717485, -5519033, 319975, 6365679, -10200547, +-3588982, 7362648, -2492155, 2241436, 3738232, -2903935, 3435974, -2338073, -3269007, 442382, +-750546, -1502702, -1039919, 3895535, -3098819, 7850127, 2326262, -179315, -4383551, -1774358, +5328981, -6151467, 1570884, 1546188, -524523, -8478265, 5869073, 946503, 1765232, 162672, +-658741, 3542811, -1981591, 5016522, 3714610, -2875481, -9224516, 3607236, 3178813, -1034550, +-2165201, 1497333, 6933688, 5460514, -19864, 2761127, -5021354, 3053722, -232465, -3235184, +3341485, 3541738, -2538326, 3289945, 1920387, -3957276, -533650, 1670205, -1899449, 6131066, +4050154, 3677566, 10673531, 1795833, -2146410, -12639552, 4481799, 7874286, 4878009, 3355980, +-669478, 4233227, 14674293, -1272921, 7013682, 1105417, 4114042, 1867237, 693637, 3323231, +-759136, -5612986, -1268626, -4048544, -745177, -5901285, 2733210, 670015, 7903277, 1952063, +-3044058, 2962454, -628139, -1328756, 5221070, 2222646, 4012036, 2600066, -1634235, -7818988, +950798, 5372467, 105764, -1066763, 2614025, -3864397, -1432909, -7216082, -9176734, 5545877, +5996848, 4907000, -909459, -994822, 527744, 437013, 3300146, 124554, 3577171, 3418794, +383863, 3524021, -2186138, 1449552, -911070, 2405719, 2604898, 9770514, 561567, 8164196, +-2212445, -6795175, -85362, -175557, -2225867, 6908992, 360777, 4758287, -11557220, -345208, +11887396, 16284905, -6685654, 1843615, 2659122, -5639829, -3208878, 637803, -4617090, -4920959, +11483669, 1570884, -7438347, -1234266, -4808216, -2848100, 7530152, -2378875, -3146064, 6656663, +4294968, 6715182, -2730526, 1314260, 6786585, 197569, -3807489, 1708323, -396211, 708133, +-8199630, -5849746, 2706903, -741956, 2206540, -7883950, 3846680, 2651606, 2036888, -13807246, +-7731478, -3658239, -1449552, 1711545, -5690295, -4227322, 1611150, 10172093, 7166690, 3409667, +-1546725, -1457605, -3630858, 2674691, -813359, -8092256, -5553930, -1120450, 243203, 10486700, +6437619, -5914170, -5652177, 7000260, 1930051, -5199595, 485331, 6036040, 3034395, -711354, +-8351564, 8531953, -2938831, 4633733, 2043868, 2436320, -2947421, 5022428, -5953362, 7236483, +-442919, -1695438, 3940633, -6889128, 2625299, 4075924, 978716, 2913062, 3551401, -1706713, +8036421, -3471944, -13166222, -7736847, -1554778, 743029, -2627446, -5490579, -6041409, -4015795, +13339632, -3418794, -827318, 2124935, -2517925, 1800128, 10987063, -4947803, 5330055, -3120831, +-6706592, 6448357, 4705137, 3110093, 9882720, 469225, 4779762, -164819, 1391033, -114354, +-2926483, 2397129, -482110, 7271380, 1660005, -4533875, -966905, -1095754, -44560, -7550016, +3459596, -7425999, 2203318, 10754598, -6451041, -12674448, 3398393, 2181844, 6387153, -2234994, +343597, 6541235, -3223910, 3485903, 5140002, 1837172, -1909113, 6714645, 2476049, 8625905, +-10002442, 24328842, -5224828, 11145977, 1373316, 4883378, 3604015, 335007, -13074954, 11825656, +-16393353, 5823976, 4347044, 15496779, -6744710, 7216082, -10328323, 7377143, -3135326, -11034845, +-5193689, 3135326, 3227668, 4629975, 2413772, 6470905, 4217121, 9584756, -2568927, -7019051, +-6487548, 3091303, 158377, -3222299, 6338835, 3146064, -1038308, 4129611, 7766912, -204548, +2145873, -630286, 3913252, 2710124, -9529459, -3696356, -12552042, -2396055, -2035815, 242129, +6190659, 5967857, 883153, -2947958, -18790, -1341104, -2990908, 2275796, 17847200, 2201171, +-433792, 6285685, -510564, 7129646, -2919504, 725313, -4419522, 18572512, 3984656, -6689949, +-8734890, -4947803, 321586, 297963, -11883101, 1261110, 2308008, 1001801, 12365748, 935229, +10252624, 6194954, 10036265, 3306588, -10555956, 10041097, -6845641, 17463338, -11588896, -3444027, +-15955267, -3390877, -1940252, 6915434, -7596724, 10188199, 7946763, -5020280, 246424, 11676405, +16128139, -5281199, 33823, -2174327, 4760435, 64425, -2361695, 2384244, 4057134, -7858180, +5433671, 1133335, 6270116, 2605972, 479426, -13400835, -2763275, 15593953, -2497524, 5238787, +11259794, 3476776, -1650878, -4132296, -6273337, -3256122, -284005, -5079873, -3962644, 9064528, +7384660, 2656437, 12821551, 9241696, -4025995, -1353452, 674310, 3233574, -5574868, -11038066, +12935905, 6337224, -4597763, 13157632, 11949136, 15302432, 4565014, 2197950, -8018704, 179315, +-10734197, -6633040, -7694434, -16207059, 13504451, 589484, 2282775, -2279554, 904628, -1977833, +-21032992, 2194728, -440771, -3954591, -1796907, -10438381, 11476689, 11812234, 13190381, -22045530, +6779069, 4291209, 270046, 21300890, 8551817, -10938745, -1545115, 21016886, 2201708, 3549254, +4018479, -6495065, 3217468, 4121558, 12851079, 6428493, -10453414, -16882980, 5902896, 3639985, +-8762807, -1885491, 392990, -10536629, 726923, 12109660, 4847408, 6609955, 9636833, 15991774, +1037772, 14006425, 2309082, -6201933, -1412507, -9055939, -5089000, 3018288, 4230543, 3126199, +6550899, -10958609, -5407364, 17637284, -2190433, -4821101, -11190000, 7737384, 6906845, 1590212, +2185065, -1502165, 3797825, -9650792, 11643656, -8699993, -9689446, -9177271, -6898255, 13562970, +244276, -5158256, 19280646, 22716082, -6007049, 6292664, -1830730, -6801081, 1149978, -15418933, +-9638980, -773631, -3271155, 30560302, -13990856, 3844533, -19682224, -2930242, 11669963, -5054103, +-11066520, -11421392, -4394826, 4652524, 5811091, -787590, -1229971, -12797929, 2749853, 8946954, +4243428, 5497022, 1349694, 2024540, -7762080, -2406792, 4693326, 1887101, -337155, 631360, +-9342091, 4092567, -9829033, -1438814, -620623, 2870649, -10908680, -950798, 4749160, 7701950, +-12415677, -6115497, 20831666, -7984881, -17258790, 14319421, -14161044, -4061429, -6582575, -2181307, +-11062762, -6969658, -2830384, -10224707, -15757161, 24675660, 12653511, 11249056, 6563784, -8970039, +-4664872, -5830955, 5667210, -10809359, 6633040, -5323075, 1385664, -1897839, 31182536, -15318001, +13023415, -29631516, 6951942, -19169512, -4370666, 9259949, -1863479, 5609228, 9699647, 7593502, +-13488345, 8427800, 954557, 5994164, -3670050, 8672076, 7897371, -2864206, 874563, 4853850, +5500243, -10124849, -4168266, -14349486, -2674154, 10948945, -698469, -6536940, 196495, 3481071, +-204011, -5796059, -10627897, 1535988, -7533373, 5296232, -7184944, 21945136, -3215857, -13328357, +-15103252, 2257542, -8792335, 6288906, -16829292, -13212930, -17091286, 2767570, -14620606, -4129074, +-20503100, 12921946, 1683627, 8388071, 4576825, -21816286, 424665, -2813741, -9007083, -12636331, +-4381941, -10931229, -13720810, -7948374, 4642860, 7169374, 10893111, -8118025, 639413, 3856881, +-18398566, 6375342, -12400107, -26419954, -7409356, 30431454, 26906360, 15344308, -12572443, 13595182, +20161650, -12716861, 17820894, -13700409, 16451335, 4314832, -879395, 5857799, -164283, 9071508, +-12655658, -3085934, -5646809, 7082938, -12041478, -10313290, 17170742, -1018981, -3505767, 2267206, +-16486769, 311385, 26564372, 15191836, 2989834, 480499, 5597953, 25896506, 10632192, 1175747, +4106526, -6131603, -3150896, -5129265, 10595684, -4705674, 6969658, 2292976, 12613782, -14310294, +-650688, 99321, 16643, -3240016, 6771016, 12708808, -3212099, -2109903, 11151346, 2599529, +846645, 27834072, 3497177, 1800128, -12882754, 6918656, -9851044, 13977434, -15093589, -10667625, +931471, -10214506, -14322105, -17657148, 4248260, -3559454, 9203041, 972810, 4636417, -21522618, +21570400, -35108672, 13651017, 14286135, -25199646, -3225521, -21712134, -7633231, -19581292, -9218074, +20692078, -8071318, -2384244, -15821049, -3753802, 2770791, -23234700, -1567663, 13469017, -28351616, +162135, -19571092, -11062225, -298500, 1160178, -13181792, -10937671, -11149198, -3923990, -9674414, +-1496259, 4141959, -3649649, 6363531, -14439143, -9255655, 17068200, -9083319, 8786966, -11374684, +9163313, 8650601, 573915, 1836099, 8428336, -197032, 12428025, 16415365, -4296041, 1875827, +24245090, 848793, 11891691, -1581085, -11258720, -20664698, 2149094, 13187697, -23307176, -425202, +-14274861, -7559143, -29969208, 11572789, 17420388, -5772973, 7540889, -5548561, 18838264, 21684754, +-3689914, -23689966, -23969138, 29687888, -26732414, 7064148, 1132261, 6497749, 37493992, 42267312, +-2321967, -31483184, 31470300, -34423628, 5013838, 14972256, 3753802, -3425773, -15906948, 18319110, +-7991324, -6132677, -16236050, -9134322, -5042292, -19975356, -11170673, -8709120, -5086315, -2940979, +14103599, 214748, 12168716, 533650, -5334887, -17349520, -19594178, -4442070, -812286, 248034, +-3084860, -6761889, -8575439, 9896678, 22310208, -11628087, 7550016, -7012608, -8077223, 9571335, +-8951786, -13433047, 31283468, -2780991, 2598455, 2287070, -17967458, -3102577, -4069482, 9752797, +-23187454, -9231495, 23643258, 4777078, -10743324, 14047764, 23935852, -12921409, -17861696, 10030359, +-15307263, 1375463, -28137404, 10049150, 22386980, -1081258, 11114838, 8478802, 2854543, 28176060, +6862821, 1413581, 13268765, 615254, -51831128, -36516348, 14307073, -15867220, -14953466, -44219372, +-13195750, 8592619, 2973728, -9274982, -24824910, -1020592, 11666742, -1615445, 1068910, 11988864, +21990232, -20323248, 50825032, -13979045, -17645336, -5954972, -3456375, -537408, -20906290, -318901, +-4133906, 10062572, -7415261, 14558865, -6900402, -13907104, 4835060, 5493263, -12202002, 11888469, +-39669928, -570694, -3637301, 14724759, 18400714, -14616847, 17135308, -7719667, 4562866, -9409200, +-3292629, -6198712, 13642427, -2942053, 18116708, 27904402, -25678536, -8201777, 13183939, -18207976, +9874667, -20585778, -11074036, -10961293, -11724724, -21158082, -10523207, 7638600, 7087770, 13429826, +19187766, 12375411, -24283746, 823560, 3765613, 3122441, 3843459, 12010339, -9385040, 5934571, +-11864847, -36053568, 25066502, -45804216, 30103962, -5673652, -21222508, -18194018, -20287814, -14026826, +-11315091, -186294, 21679384, -2996277, -20596516, 19349364, 27673012, -45639396, -13247827, 2003065, +-5057324, -8038568, -3620121, -7260106, -9321690, -14016089, 15093589, -6855842, -13805636, -22238804, +-22521198, 19705310, 3920232, -4830765, -3798362, -1004486, -6169721, -6663642, 3026341, -19641422, +8586713, 20217484, 14244259, 8894340, 18638548, 22593138, -15187541, 4060892, -21165598, 20134270, +-13760001, -4406637, -1840930, -31678606, 8232916, 24415816, 2534568, -11297375, -10266046, 32243930, +-15159087, -15127949, 7441031, -34559456, -5809480, -17480516, -1136019, -33659120, 11967389, 5244692, +11779485, -53813792, -47462072, 7801808, -16821776, -9199820, 5233955, 41652056, -52712132, 58042188, +18653580, 252329, 6871948, -38226284, 10620380, 21065204, -4784594, 49703508, -11225434, 22678502, +-14391362, 54520316, 517544, -5000416, -17615272, -5282273, 10130754, -3238942, 23780160, 18556944, +-3030636, 3457449, -18045842, 9905268, 23685670, 23368918, -20580410, 11766063, -1897839, 24821152, +-3434363, 16856672, -10974715, -8741869, -28162638, 4150549, -16756278, -26947162, 44121124, -16182363, +-639413, -5747203, -6828461, 7700877, 6532109, 16724066, -3688303, 24574730, 5371394, 42855184, +18945638, 47259672, 41634340, -1422171, 29073170, 21990770, -3086471, 25551834, 34964792, -10658498, +-27287000, 20685100, 15526307, 28709708, 17276506, 1046898, 4046933, -29217052, 1421634, -4750234, +-7139847, 51606716, 2075543, 18502182, 17965312, -37463924, 74563320, -9068823, -7329899, -3758097, +54459112, -31962072, 27726698, -35070020, 34974992, 7898982, -5850819, 1875827, 20797842, -7576859, +19430432, -7632694, 599685, 38704096, 12299713, -8579734, 588411, 10479183, 8105677, -35432944, +10441065, -12195560, -2638721, -18124762, 19274202, 18836116, 3398930, 9545565, 32063542, -9261560, +-49435612, 13152800, 33364380, -11501922, -32327682, 9956808, 24032490, 9170829, 566399, -38176892, +-18373334, -22090090, 22431540, 10146323, 23089208, -46190764, 3554622, -7483981, -51921324, -12324409, +8244190, 25017648, 33578592, -16326781, 62272732, 13238700, 1688459, -11528766, -24222542, -16088411, +12397960, -27533962, 59062244, -17681306, 3477850, 35187592, -21274584, 21521008, -20163260, -12465069, +51504176, -17483738, -43212204, 24842090, 15902116, 24866250, -9806484, -6869800, 10059887, 244813, +2877091, 1117228, 4896263, 1379221, -6824703, 32221918, -7496866, -21807696, 9277666, -310311, +-19493246, 7052873, 4399121, 13514115, -9070434, -14365055, 15672873, -12353400, -1886564, -3409130, +12801150, -21974664, 7445326, -13457743, 11127187, -19262392, 6772090, -6138045, 3138547, 43698608, +-29986924, 6155762, 9210020, -26226680, 9398999, 12925167, -20182052, -3522410, -7959112, 36575940, +2647311, -40878960, 24484534, -32877974, 5694053, 18148384, -16556025, 20693152, -24518894, -19001472, +26866632, -3745748, 11148661, -39985608, 7205882, 9882720, -2626373, -5202279, -765578, 17835926, +262530, -53099216, 32746978, -1871532, 12699145, -12367358, -15867757, 55006720, 2809982, 18293876, +-9295920, -109274704, -229992816, -93104152, -173680432, -211110528, 71850504, -3059091, 73774120, 286434048, +249981056, 141203488, 274163328, 151832992, 15359877, 93270048, 56729000, -106656920, -75816912, -23904178, +-117736328, -142184352, -48491256, -73019272, -112675248, -29928406, -6787122, -143178096, -98934032, -16718160, +-87383792, -112985560, -33870112, -56360708, -122130080, -24956444, 11028402, -69390032, -52749716, 49488760, +-19320910, -74051144, 14484777, 46786152, -36357972, 28368258, 105465608, -16425029, -28170690, 104006392, +56266220, -26467200, 174636592, 236275808, 148412064, 249600416, 374640864, 287713952, 275608064, 400419264, +349428352, 257099424, 317266560, 287695168, 187473712, 165366448, 95411624, -21500606, -111418968, -210987584, +-297894624, -359043168, -444289664, -476471872, -485214272, -545162880, -419987136, -176518320, -128365832, 0, +0, 0, 0, }, { 8273718, --2595771, 1931662, 1451162, -2772402, 3333968, 2580739, -845035, 4555887, -33286, 1936493, --6468221, 2427730, 2448668, -3367791, 6817187, 846645, 3335579, -469225, -832150, 406411, -4708895, 5187247, -5184026, -1624035, -2317135, 3388192, -1610613, -1233729, 746251, -2787434, --4301410, 2321967, -4068945, 2324114, 2290291, 2280628, -90194, 1279900, -45634, 3339337, --1170379, 514859, -3358665, -835371, -6404333, -3007014, 807454, 2289755, -277562, 3205119, --303332, 1631014, -3988951, 1114007, 1969243, 2333778, 587874, -1815161, 158914, -874563, -1504849, 1756642, 754304, -155156, -1414655, -818728, 3273839, -850940, 1464047, 2817499, -1774895, -1525250, 3287798, 69793, 1025960, -1014686, -7168301, 204548, 5684389, 3911642, -3922916, 2477659, 1548336, -2237678, 68183, -2544768, 6071473, 3741454, 1439888, 898722, -854699, -55298, -1954747, 3015604, 4161287, 4056597, 2435783, -3036005, -4459250, -4807679, --4634807, -442919, 2362769, -4689568, 3911105, -902480, 6864969, -1096290, 4344360, 119185, --5773510, 1706713, -783295, 4707821, 272730, -460635, -2385854, -3834332, 304406, 2312840, --5079873, -6771016, 4753992, -3867081, -3721052, -3337727, 2658048, -2593624, 1103807, -1068910, --385473, -3881577, -1267015, -2569464, -4067334, 1533303, 3091303, -930934, -4457639, -607201, --921271, -1932198, -3832722, 36507, -3097208, -3284576, -613107, 706522, 970663, -695785, -763967, 4295, 13517336, -4686883, -3054259, -4177930, -2852932, 336618, -8988830, 1543504, --4438312, -8818105, -1845225, 7589207, -5400922, 1490354, -594316, 2552821, 3878356, 4102768, -6671158, -1409286, -3731790, 1692754, 1660542, -3035468, -372052, -2051921, -1265405, 812823, --3397319, -2173790, -425202, -4377109, -5047124, 2615635, 4057134, -2362232, -5802501, -1045288, --1282048, 821413, 4871567, 299574, -1860795, -335544, 6498823, 774168, -3776350, -3787624, -1786706, 1181116, 5235029, 2860985, -181462, -4895726, 433792, -324807, 4350802, -4518306, --1320166, 2408403, 5050882, -1425392, 637803, -3743064, -1846836, 2180770, 372588, 389231, -1564442, -1532230, 2025614, 401579, 2427194, 1177895, 1090922, 8232916, 2658585, -9942849, --2370285, -4713190, 4488241, 1108638, 63888, 3186866, -1961190, -7689602, -4084514, 5051956, --328028, 5207111, -441308, -2997350, 5753646, 2151779, 12674448, -2425583, 5468567, 778463, --6059125, 1482838, -5158793, 3272228, 1101122, 1271310, -5515275, 2697776, -1022739, -1950989, -2156074, 8639864, 3139621, -76773, -7042136, 6003291, -1363652, -1611, 4168803, -6356552, --1287417, 4331475, -2699387, -2291365, -7260106, -7835631, -721555, 4683125, 2643552, -3172907, --235686, 3027415, 3693135, 1479616, -969052, -1566589, -7036767, 3144453, 8297877, 3784940, --2696166, -1304060, 2422362, 3936875, -631897, -1422708, 648540, -5827734, -1481764, -4204773, --2390686, -724776, -3149822, 5934571, 4565014, -2663954, -7636452, 8121247, -7358353, 7399155, --263067, -6248104, -14470819, -5816997, -4289062, 1946694, 7296613, 5667210, -1990717, -1339493, --1927367, -4287451, -1365263, -4793721, 1394791, 1504849, 2654290, 4518843, 2610803, 8817568, --150324, 1632625, -3348464, -927176, -2322504, 3125126, 829466, -4371740, -6227703, 68183, --4515621, 366683, 3955665, -7033546, 4673462, -11711839, -3328600, -8731132, 1316944, -697395, -4295, -3521873, -4658429, 1435056, 3960497, 2769717, 959388, -7035157, 1983738, -4903779, --1915555, -1512365, -9470403, -3802120, 2719251, 3488587, -399432, -6585796, 1046361, 2330020, --1301375, -1395328, 736050, 5520644, 1993939, -1349694, -1815697, 917512, -13364328, 903554, -3357054, 3118683, 8958765, 9590662, -2385854, 185757, 6331319, -3193845, -3007551, 9477919, --7153268, -16910896, -11126113, -6492380, 10210211, 4417374, 1416802, -9751723, 10405632, -4402342, -2909304, -2602213, 4072703, 5107253, -434865, 230318, -121870, -1584843, -5418101, -4228396, --1366337, 682900, 4672925, 2800319, 7320235, 3652333, -3291019, -1586990, 6491306, -4594005, -7973607, -6307160, 1635309, 3686693, 2176475, -5078799, 6985765, -536871, 7502771, 10224707, -1396401, -3854733, -4058744, 4424353, -5015985, -10050760, -2829847, 2326262, -6774774, 3928285, -2804077, -1992328, -4339528, -1550483, -1847910, 2162516, -1109175, -5559835, -2552821, 10144713, -7584376, 4508642, -12319040, -11424076, -6917045, 11390253, 4972499, -609885, 640487, -4931160, -1258425, 4396436, 6654515, -782221, 2319282, -11482595, -4146254, 1429687, 3391951, -14142254, --1929514, 5541582, -4553739, -9330280, 5166846, -10787884, -8051990, -4502200, 494995, -4151623, --2988224, -707059, 7318088, -6940667, 1293859, -2448131, -3159485, -5894306, -1956895, -8435316, --2838437, -593242, 1108102, -5998459, -1629403, -3910031, 73014, -2160369, -2949569, 1145683, -5920613, 1285806, -3768834, 2837363, -5316633, -1530082, 1403917, -2166811, 2707977, -1344862, --828929, -22712860, 1009854, -8061654, 3306588, 2957085, 4454418, -12608950, -13093745, 1436130, --86436, 2690797, -464930, 6474663, -3295851, 3433290, 3899830, -2340220, 9859097, -3452617, --7613904, -1580548, -6572374, -266825, -12381854, 129923, 3819300, 8800388, -17391934, 4819490, -844498, 5002563, 7130720, 1432372, -6715718, -14742475, 1123134, -5849746, 11371463, -4422206, -2371359, 1023276, 2440615, 8754754, -3766150, -39192, -3971234, -1999844, 2209761, -1910724, -7978976, 6227166, 1660005, -1432909, 41339, 5645735, -638340, 2881923, -227633, -4121021, -3788161, -822486, -3455301, 5066451, 7865159, 361314, 2953864, 913754, -5535676, -2958159, -9514963, -4332012, 4402879, 7491497, -9710384, 7124814, 3273302, 3830037, -4538170, 7324530, -1591285, -744103, 8379481, 788663, -592169, -3652333, -2891587, 491237, -4459250, -8915815, --3157875, 10163503, 6498823, 8476655, -1758789, -7780870, 2455111, 10704669, -3087008, -6520297, --1843078, -4364761, -3263638, 1611, -8160438, -2297808, -13252658, -3759707, -7631083, -9002251, --8553964, -2912525, 11818139, 12887586, 17648558, 4089883, -6569153, -3940633, 14617384, 122407, --3278134, 11292543, -1066226, 666257, -17272748, 8035884, 4451197, -11401528, 16131360, -2050847, -7280507, -1762010, 3830574, 7325604, 66035, 12806519, 4879620, 3769371, -1429687, -4285841, -1232656, 7832410, -2039036, 2457258, 3581466, 10309532, -485331, -2882460, 6503118, -7488813, --4854387, 3642132, 11124502, -4785131, -6055904, -1728724, 9127342, 238371, 1203128, -3296388, --1691143, 3436511, 4719632, 547608, -4133906, -12637941, 1326071, 3829500, 11914776, 3572876, --1219234, 9327058, 16369731, -3460670, 5523328, 3831648, 6554120, -1536525, -6218576, 2997350, --14797773, 21623550, -10346039, 5213017, -431107, -6927782, 16539919, 4221416, 2349884, -16695612, -4775467, -6396817, -7464117, 2341831, -7284265, 9110699, 5552856, -992137, 2041720, -3717294, --1593433, -5731097, -3704946, -6968048, -11246372, -2325725, -7788387, -1635846, 4669703, -2715493, --4071629, 9697499, 6008659, 9748502, -7253126, -249645, -1250372, -7640210, 337155, -3752191, --20304458, 2459943, 620623, -2495913, 7379291, -37581, 8113193, 7400766, 2703145, 13130789, -11245835, -10073846, -2737505, 916439, -159988, 4728759, 1722819, 11414412, -1999844, 17736068, -228170, -8920110, -7780870, 2318746, 3299609, 4519380, 12491912, 4343286, 3361886, 12662100, -15622407, 1847373, -8980240, -7669738, -337155, -1943473, -1361505, 16207059, 13205951, 1444720, -9046275, -8927090, 4657892, 1232119, -248571, 6158446, 13922673, -3224447, -781147, 12908524, --15967615, -8636642, -6726993, -18277770, 4130685, -5432597, -2210835, 2797098, -12391518, 14609331, -11039677, 15497316, 7138236, -8716636, 1319092, 1191317, 11615202, -1453846, 85362, 195421, --6487548, 1207960, -3624416, 6919193, -6897718, -2086817, -2012192, -2457795, -8139500, 4809290, --12149926, -1142461, -384936, 8766565, 5223754, 1924682, 678605, -1301375, 1490891, 1087164, -7186554, 2553358, 2540473, 43487, -19120658, -8024073, 3017752, 9478993, 10621454, -14114336, -11243688, 4611185, -5132486, 3200825, 4472135, -1738925, 16333224, 2381023, 4482335, -867583, --18861886, -3827890, -6599754, 2095944, 18852222, 2544231, 7288560, -12229919, -11138998, 5545340, -9509058, 643708, -4128001, 18089328, 5290326, -454193, -5728950, 3529926, -2018098, -2579665, --1270774, -3716757, 288837, -6705518, -15352361, 4363687, 933619, 4005594, 879931, 7719130, -1910724, -9320079, -18571976, -5906, 753230, -1911261, -16329466, -8136279, -2962454, 3960497, --4031364, 1326608, -14359686, 245887, -3671123, -323196, 784905, 3423089, -2078227, -13333726, --12504260, -7788387, 4415764, 3352759, -3758097, -3013457, -21343304, -12051141, -988379, -20522964, -18082350, -19359566, -5795522, -12582644, 19468550, 6252936, -14581414, 6978248, -2095944, 7518341, --12410845, -3934727, 185220, 8270497, -11618423, -4294431, -3912715, -11179800, 1148904, 8171712, -62814, -2117419, 16080358, 36358508, -6022081, -12695923, -11906723, -10695542, -14806900, 1217086, --24514062, -1292785, -19158238, -9521942, 4671851, 10306848, 5624797, -9335648, -2044941, 9711995, --1656247, 11368242, -8378945, -8752606, -7553237, 4694936, -5273146, -6975564, 1136019, -8138426, --7863548, 7211250, 19229642, 6256694, 7738994, 2452426, -12677133, -4188130, -10441602, -10489921, --2279017, -3094524, -8377871, -13566728, -25096030, -3796214, -9640054, 1572495, -5313412, 7472706, -7595650, 3116536, 7984344, 4483946, -1777580, 15209016, 23390928, 3944928, -29263760, 3850438, --5977521, -18646064, 1398549, 6005438, 3082176, -1520955, 6796786, -2861522, -14602889, -1756105, -5242008, -16392280, -8437463, -15894063, -25093346, 14771466, 617938, -856846, 26884884, -21044802, -23127862, -2617246, -3574487, -12731357, -5216775, -12636331, -10997264, 12152610, -12102144, 6020471, -27761594, 10078678, -5065914, -13424457, -11683922, 12226161, -11306501, -18138184, -8182450, 1313186, -732292, -20615844, 442382, -6583648, 9477382, -6827388, -1356136, 1873143, 28934120, -7718056, --10742787, 14122389, -12794708, 17059074, -11484206, 12373801, 844498, -9701794, -9839770, 15826418, --22449258, 15559593, -10567767, 1185948, -6623377, 8280697, -8951249, -4190278, -2071785, -6970195, -28735478, -9330280, 18874770, 7558606, 7405598, -741956, 5554467, 12765717, 12465069, -4843113, --17389248, -734439, 9293772, 4057134, -5717675, -19462108, 20500416, -6535330, -20952998, -6350109, --15785615, 4963372, 2663417, -31549220, -13641890, 18881214, -4089883, -8140574, 21984326, 1851668, --11879880, 8172249, 11827803, 10012643, 1302986, -19502910, -8250096, 2668249, 2532420, 9785546, -6342056, 11075110, -10134512, -8016020, 3493419, -2923262, 8977555, -18333604, -3380139, -19807852, --6646462, 3295314, -3023120, -2698850, 20593294, 4119948, -15845208, -2588792, 901943, -16078747, --2497524, 547608, 9167608, 23834922, -8904004, 7819525, -13804025, 1800665, -8286066, -10392747, -9412421, 20824148, -17085916, 1394254, 18324478, -8684424, -2168959, -7255274, 11814918, 2740726, --15717970, -409096, -5826123, -5172751, -2044941, -7719130, 10796474, -27188216, 5109938, 2011118, --11978127, 14838575, 22457310, 16073378, 43353400, 13094282, -12107513, -15927349, -13743358, -7311645, -19598472, -53734336, -4365835, 26951994, -41360000, -4142496, 5371931, -42715060, 15752866, 2522757, -30021284, -5644124, 9118216, 7096360, -37799472, -31848794, -13755707, -5333276, -20083268, -24360518, --13883482, 17641042, 11816529, 9650255, -1046898, -343061, 4010963, -1407139, -28153510, -12350715, --35486092, -13322452, 16065325, 2696703, 10036802, 38735772, 8329016, 12791486, -3182571, 5324686, -34071976, 24474872, 5069135, 14912663, 13928042, 33296198, 27308476, -43201464, 22151294, -5714991, -21000242, 20677046, 7160248, 40111772, 35706748, -25316684, 16001438, -4425964, 14956687, -36455144, --373662, -1207423, -2505577, -12276090, 16366510, 16551730, -25588342, -13220983, -17203492, 981400, --22906672, -29774324, 14598594, 25603910, 5660230, 23516556, -19508816, -16047608, 24192478, 43322800, --5545340, -58223112, -18435610, 6421513, -4304631, -9252433, -12616466, 707596, -33306398, -19567334, --27633282, -3910031, -7936026, 9914395, -19697256, -5046050, 5531918, 10031970, -74625, 11126650, -20409148, 4999879, 29368986, -17973364, 7164006, 2092723, 27999428, 8291435, -5374615, -27062052, -18758270, -3736085, 25520158, -20196010, -16902844, -14937896, -8573292, -24559160, -3512747, -3054259, --24330990, 14950781, 27790586, -11792906, 4146254, -34285112, 34673808, -9045738, -18845242, 17852032, -13852880, -18411988, 1806034, -10461467, 4532264, -6811282, 43350180, 1247688, -3764002, -7550016, -76472968, 5449777, -10540387, 36725728, 26072598, -23349590, 21264384, -28882582, -19768660, -29365228, -25589416, -16546898, 9281424, -17470316, -79812304, 4688494, 49704044, -31556736, -21400748, 39766028, --30598958, -2843805, -9408663, 38145216, -68088120, 36592584, 21239688, -19830400, 5976984, 35741644, -25125558, -13717052, 13925895, 5838471, -11274289, 16352551, -1434519, 9574019, 14782741, -7631620, -2747169, -2575370, 6469295, -10568304, -8920110, -1480153, 12494060, -40634684, -20817170, 18928458, --5604933, -27230092, -32298154, 4537096, 37601364, -17675402, -25930866, 18194556, 27732604, -7194607, -6080063, -5988795, 25730076, -15515569, 39170640, -6366752, -1141388, 21202106, -756451, 4145717, --29913374, 44094280, -24537686, -29246580, 20164872, -30959198, -11118060, 3919158, 13673565, 40430676, --15999827, 24646670, -6497749, 12137041, -71725416, -55576876, -11108933, -22818088, 9442486, -8220568, --28844464, -14833206, 16718697, -35268124, 29520920, -30371862, -37665788, 17396766, -19605988, -13846975, -17547626, -17590576, 14175003, -14319958, 5086852, 37127308, -38141456, -4882841, -8260296, 30944166, -1583769, 838592, -34565360, -31955630, -13550622, -10933376, -7665443, -11815992, 2764885, -496606, --6392522, 2712272, 3915937, 1226213, 2260764, -8278550, 12207908, -12248710, 11469710, -30253750, --2482491, -24895778, -33088428, -19515258, 35622460, -19005768, -21009906, -14902463, 5188858, -9868761, -13529147, 23434952, -30779884, 21913460, 76773, -38904888, -22852984, 74364136, 35057672, -59796684, --15623480, 34827352, -23602456, -23036058, 9556839, -20174536, -45554572, 26752278, 7093139, -56418692, -15808164, 25257628, -39423504, -24079198, 23270670, -13219909, 49299244, 69224672, -25769804, 77299744, --4572530, -19575388, -14631880, -24543054, -663572, 13931263, 46388332, 2667712, 15393700, -10302553, --37060736, 1780264, 3080565, 26506928, 6549825, -28266254, 56116432, -22290344, 11951283, 25324738, --25252260, -21144660, -36774584, -16127602, 25827786, 30535070, 38766912, -13160317, -87936768, 20630876, -49086108, 60865056, 53932980, -215822, -23539642, -31385474, 13171591, 31204548, -17243220, -9934259, --77296528, -48467096, 45354316, 72424960, 17375828, -1719061, -14830522, -31347892, -4625143, 20137492, --25046638, 11004780, -980863, 45574436, 1162862, 17685064, -85895584, -11518565, 4518306, 54460184, -46052788, -1582159, -22860500, -7961796, 69280504, 28643136, -71961104, -95806224, -31981938, 17599702, -152848224, 14198088, -18853296, 19127100, 7221451, -12622372, 31053150, -36381056, 791885, -14755897, -7996692, -22572738, 20631412, 5643050, -12320114, -22716618, -11513197, -4399121, 6128919, -30897994, -6641630, -15152108, -6361921, -24159192, -11871826, 19549080, -21110838, -7252589, -3386045, 9612674, -5887327, -7931194, 10473815, -17540646, -2030983, 367757, 8828842, -11381126, 16101296, 12749610, --13466333, -14513768, -6378564, 24164560, -17940078, 7880728, 16940962, 4342749, -18099530, -6181532, -6586869, -10361609, 7168301, 1327145, 2974802, -15363098, 2394444, -12320114, -1566589, 12793634, -14189498, 12662637, -9913858, 12200391, 278099, -13215077, -3322694, 1044214, 15666430, -3452617, -2211371, 16083579, -4624606, -17676474, 25289304, -9154186, 14285061, 13673565, 1257889, 6251325, --11555073, -8796630, -28560996, 55121612, 5561983, 3552475, -21407728, 13210246, -1218697, 14859513, -11560978, 17284560, 2515240, 4787278, -8744553, 3220152, 16048145, -1014149, 9111773, -858457, -3400540, 3860102, 6969122, -6058052, 12379706, -7481833, 1843615, -857383, 4734128, -635655, -3147137, 9224516, 10522670, -4313221, 5124433, 2244121, -1303523, -3828427, 13796509, -3651259, -3638374, -3373697, 7679939, 238908, -5235565, 13236552, -7092602, -2554432, 4441533, -5890011, --2667712, -1705639, 1595044, -2173254, 1309428, -1109712, -2229625, 4514548, -7190849, 5337571, -4778688, -2828773, 6793028, -4223564, 7870528, -3448322, 2639258, 1151051, -2487323, 6245956, -1573032, 574989, -330176, 8217346, -8399882, 10279467, -5480379, 104690, 5028870, 10259603, --49938660, -124109520, 19110994, 94195072, 87552368, 151929632, -38958576, -40933724, -103700376, -141643184, --29268592, 50913616, 54628764, 102832256, 55902220, 4169876, -26845156, -72219336, -51225000, -9104257, --8065949, 25362318, 23738822, 13461501, 8740795, 6614787, -3820910, -17991082, -1386738, 20107964, -151934, 3970697, -1162326, -15654082, -11708081, -26396870, -25491168, 11218991, 10723996, 23310398, -36058396, 26603028, 13247827, 4388383, -38781944, -27874874, -21170968, -21701396, -23657216, 4565550, -15283641, 25951804, 33807300, 27448062, 6231461, -3692061, -22148072, -23193360, -13343390, -6988986, -2418067, 3384971, 7813083, 320512, -6987912, 2171106, -11278047, 5841693, 10340671, 1020055, -20393042, 24049670, 8260296, -3959960, -24847460, -32131724, -8114804, -99858, -733366, 0, -0, 0, 0, }, +-2595771, 1931662, 1451162, -2772402, 3333968, 2580739, -845035, 4555887, -33286, 1936493, +-6468221, 2427730, 2448668, -3367791, 6817187, 846645, 3335579, -469225, -832150, 406411, +4708895, 5187247, -5184026, -1624035, -2317135, 3388192, -1610613, -1233729, 746251, -2787434, +-4301410, 2321967, -4068945, 2324114, 2290291, 2280628, -90194, 1279900, -45634, 3339337, +-1170379, 514859, -3358665, -835371, -6404333, -3007014, 807454, 2289755, -277562, 3205119, +-303332, 1631014, -3988951, 1114007, 1969243, 2333778, 587874, -1815161, 158914, -874563, +1504849, 1756642, 754304, -155156, -1414655, -818728, 3273839, -850940, 1464047, 2817499, +1774895, -1525250, 3287798, 69793, 1025960, -1014686, -7168301, 204548, 5684389, 3911642, +3922916, 2477659, 1548336, -2237678, 68183, -2544768, 6071473, 3741454, 1439888, 898722, +854699, -55298, -1954747, 3015604, 4161287, 4056597, 2435783, -3036005, -4459250, -4807679, +-4634807, -442919, 2362769, -4689568, 3911105, -902480, 6864969, -1096290, 4344360, 119185, +-5773510, 1706713, -783295, 4707821, 272730, -460635, -2385854, -3834332, 304406, 2312840, +-5079873, -6771016, 4753992, -3867081, -3721052, -3337727, 2658048, -2593624, 1103807, -1068910, +-385473, -3881577, -1267015, -2569464, -4067334, 1533303, 3091303, -930934, -4457639, -607201, +-921271, -1932198, -3832722, 36507, -3097208, -3284576, -613107, 706522, 970663, -695785, +763967, 4295, 13517336, -4686883, -3054259, -4177930, -2852932, 336618, -8988830, 1543504, +-4438312, -8818105, -1845225, 7589207, -5400922, 1490354, -594316, 2552821, 3878356, 4102768, +6671158, -1409286, -3731790, 1692754, 1660542, -3035468, -372052, -2051921, -1265405, 812823, +-3397319, -2173790, -425202, -4377109, -5047124, 2615635, 4057134, -2362232, -5802501, -1045288, +-1282048, 821413, 4871567, 299574, -1860795, -335544, 6498823, 774168, -3776350, -3787624, +1786706, 1181116, 5235029, 2860985, -181462, -4895726, 433792, -324807, 4350802, -4518306, +-1320166, 2408403, 5050882, -1425392, 637803, -3743064, -1846836, 2180770, 372588, 389231, +1564442, -1532230, 2025614, 401579, 2427194, 1177895, 1090922, 8232916, 2658585, -9942849, +-2370285, -4713190, 4488241, 1108638, 63888, 3186866, -1961190, -7689602, -4084514, 5051956, +-328028, 5207111, -441308, -2997350, 5753646, 2151779, 12674448, -2425583, 5468567, 778463, +-6059125, 1482838, -5158793, 3272228, 1101122, 1271310, -5515275, 2697776, -1022739, -1950989, +2156074, 8639864, 3139621, -76773, -7042136, 6003291, -1363652, -1611, 4168803, -6356552, +-1287417, 4331475, -2699387, -2291365, -7260106, -7835631, -721555, 4683125, 2643552, -3172907, +-235686, 3027415, 3693135, 1479616, -969052, -1566589, -7036767, 3144453, 8297877, 3784940, +-2696166, -1304060, 2422362, 3936875, -631897, -1422708, 648540, -5827734, -1481764, -4204773, +-2390686, -724776, -3149822, 5934571, 4565014, -2663954, -7636452, 8121247, -7358353, 7399155, +-263067, -6248104, -14470819, -5816997, -4289062, 1946694, 7296613, 5667210, -1990717, -1339493, +-1927367, -4287451, -1365263, -4793721, 1394791, 1504849, 2654290, 4518843, 2610803, 8817568, +-150324, 1632625, -3348464, -927176, -2322504, 3125126, 829466, -4371740, -6227703, 68183, +-4515621, 366683, 3955665, -7033546, 4673462, -11711839, -3328600, -8731132, 1316944, -697395, +4295, -3521873, -4658429, 1435056, 3960497, 2769717, 959388, -7035157, 1983738, -4903779, +-1915555, -1512365, -9470403, -3802120, 2719251, 3488587, -399432, -6585796, 1046361, 2330020, +-1301375, -1395328, 736050, 5520644, 1993939, -1349694, -1815697, 917512, -13364328, 903554, +3357054, 3118683, 8958765, 9590662, -2385854, 185757, 6331319, -3193845, -3007551, 9477919, +-7153268, -16910896, -11126113, -6492380, 10210211, 4417374, 1416802, -9751723, 10405632, -4402342, +2909304, -2602213, 4072703, 5107253, -434865, 230318, -121870, -1584843, -5418101, -4228396, +-1366337, 682900, 4672925, 2800319, 7320235, 3652333, -3291019, -1586990, 6491306, -4594005, +7973607, -6307160, 1635309, 3686693, 2176475, -5078799, 6985765, -536871, 7502771, 10224707, +1396401, -3854733, -4058744, 4424353, -5015985, -10050760, -2829847, 2326262, -6774774, 3928285, +2804077, -1992328, -4339528, -1550483, -1847910, 2162516, -1109175, -5559835, -2552821, 10144713, +7584376, 4508642, -12319040, -11424076, -6917045, 11390253, 4972499, -609885, 640487, -4931160, +1258425, 4396436, 6654515, -782221, 2319282, -11482595, -4146254, 1429687, 3391951, -14142254, +-1929514, 5541582, -4553739, -9330280, 5166846, -10787884, -8051990, -4502200, 494995, -4151623, +-2988224, -707059, 7318088, -6940667, 1293859, -2448131, -3159485, -5894306, -1956895, -8435316, +-2838437, -593242, 1108102, -5998459, -1629403, -3910031, 73014, -2160369, -2949569, 1145683, +5920613, 1285806, -3768834, 2837363, -5316633, -1530082, 1403917, -2166811, 2707977, -1344862, +-828929, -22712860, 1009854, -8061654, 3306588, 2957085, 4454418, -12608950, -13093745, 1436130, +-86436, 2690797, -464930, 6474663, -3295851, 3433290, 3899830, -2340220, 9859097, -3452617, +-7613904, -1580548, -6572374, -266825, -12381854, 129923, 3819300, 8800388, -17391934, 4819490, +844498, 5002563, 7130720, 1432372, -6715718, -14742475, 1123134, -5849746, 11371463, -4422206, +2371359, 1023276, 2440615, 8754754, -3766150, -39192, -3971234, -1999844, 2209761, -1910724, +7978976, 6227166, 1660005, -1432909, 41339, 5645735, -638340, 2881923, -227633, -4121021, +3788161, -822486, -3455301, 5066451, 7865159, 361314, 2953864, 913754, -5535676, -2958159, +9514963, -4332012, 4402879, 7491497, -9710384, 7124814, 3273302, 3830037, -4538170, 7324530, +1591285, -744103, 8379481, 788663, -592169, -3652333, -2891587, 491237, -4459250, -8915815, +-3157875, 10163503, 6498823, 8476655, -1758789, -7780870, 2455111, 10704669, -3087008, -6520297, +-1843078, -4364761, -3263638, 1611, -8160438, -2297808, -13252658, -3759707, -7631083, -9002251, +-8553964, -2912525, 11818139, 12887586, 17648558, 4089883, -6569153, -3940633, 14617384, 122407, +-3278134, 11292543, -1066226, 666257, -17272748, 8035884, 4451197, -11401528, 16131360, -2050847, +7280507, -1762010, 3830574, 7325604, 66035, 12806519, 4879620, 3769371, -1429687, -4285841, +1232656, 7832410, -2039036, 2457258, 3581466, 10309532, -485331, -2882460, 6503118, -7488813, +-4854387, 3642132, 11124502, -4785131, -6055904, -1728724, 9127342, 238371, 1203128, -3296388, +-1691143, 3436511, 4719632, 547608, -4133906, -12637941, 1326071, 3829500, 11914776, 3572876, +-1219234, 9327058, 16369731, -3460670, 5523328, 3831648, 6554120, -1536525, -6218576, 2997350, +-14797773, 21623550, -10346039, 5213017, -431107, -6927782, 16539919, 4221416, 2349884, -16695612, +4775467, -6396817, -7464117, 2341831, -7284265, 9110699, 5552856, -992137, 2041720, -3717294, +-1593433, -5731097, -3704946, -6968048, -11246372, -2325725, -7788387, -1635846, 4669703, -2715493, +-4071629, 9697499, 6008659, 9748502, -7253126, -249645, -1250372, -7640210, 337155, -3752191, +-20304458, 2459943, 620623, -2495913, 7379291, -37581, 8113193, 7400766, 2703145, 13130789, +11245835, -10073846, -2737505, 916439, -159988, 4728759, 1722819, 11414412, -1999844, 17736068, +228170, -8920110, -7780870, 2318746, 3299609, 4519380, 12491912, 4343286, 3361886, 12662100, +15622407, 1847373, -8980240, -7669738, -337155, -1943473, -1361505, 16207059, 13205951, 1444720, +9046275, -8927090, 4657892, 1232119, -248571, 6158446, 13922673, -3224447, -781147, 12908524, +-15967615, -8636642, -6726993, -18277770, 4130685, -5432597, -2210835, 2797098, -12391518, 14609331, +11039677, 15497316, 7138236, -8716636, 1319092, 1191317, 11615202, -1453846, 85362, 195421, +-6487548, 1207960, -3624416, 6919193, -6897718, -2086817, -2012192, -2457795, -8139500, 4809290, +-12149926, -1142461, -384936, 8766565, 5223754, 1924682, 678605, -1301375, 1490891, 1087164, +7186554, 2553358, 2540473, 43487, -19120658, -8024073, 3017752, 9478993, 10621454, -14114336, +11243688, 4611185, -5132486, 3200825, 4472135, -1738925, 16333224, 2381023, 4482335, -867583, +-18861886, -3827890, -6599754, 2095944, 18852222, 2544231, 7288560, -12229919, -11138998, 5545340, +9509058, 643708, -4128001, 18089328, 5290326, -454193, -5728950, 3529926, -2018098, -2579665, +-1270774, -3716757, 288837, -6705518, -15352361, 4363687, 933619, 4005594, 879931, 7719130, +1910724, -9320079, -18571976, -5906, 753230, -1911261, -16329466, -8136279, -2962454, 3960497, +-4031364, 1326608, -14359686, 245887, -3671123, -323196, 784905, 3423089, -2078227, -13333726, +-12504260, -7788387, 4415764, 3352759, -3758097, -3013457, -21343304, -12051141, -988379, -20522964, +18082350, -19359566, -5795522, -12582644, 19468550, 6252936, -14581414, 6978248, -2095944, 7518341, +-12410845, -3934727, 185220, 8270497, -11618423, -4294431, -3912715, -11179800, 1148904, 8171712, +62814, -2117419, 16080358, 36358508, -6022081, -12695923, -11906723, -10695542, -14806900, 1217086, +-24514062, -1292785, -19158238, -9521942, 4671851, 10306848, 5624797, -9335648, -2044941, 9711995, +-1656247, 11368242, -8378945, -8752606, -7553237, 4694936, -5273146, -6975564, 1136019, -8138426, +-7863548, 7211250, 19229642, 6256694, 7738994, 2452426, -12677133, -4188130, -10441602, -10489921, +-2279017, -3094524, -8377871, -13566728, -25096030, -3796214, -9640054, 1572495, -5313412, 7472706, +7595650, 3116536, 7984344, 4483946, -1777580, 15209016, 23390928, 3944928, -29263760, 3850438, +-5977521, -18646064, 1398549, 6005438, 3082176, -1520955, 6796786, -2861522, -14602889, -1756105, +5242008, -16392280, -8437463, -15894063, -25093346, 14771466, 617938, -856846, 26884884, -21044802, +23127862, -2617246, -3574487, -12731357, -5216775, -12636331, -10997264, 12152610, -12102144, 6020471, +27761594, 10078678, -5065914, -13424457, -11683922, 12226161, -11306501, -18138184, -8182450, 1313186, +732292, -20615844, 442382, -6583648, 9477382, -6827388, -1356136, 1873143, 28934120, -7718056, +-10742787, 14122389, -12794708, 17059074, -11484206, 12373801, 844498, -9701794, -9839770, 15826418, +-22449258, 15559593, -10567767, 1185948, -6623377, 8280697, -8951249, -4190278, -2071785, -6970195, +28735478, -9330280, 18874770, 7558606, 7405598, -741956, 5554467, 12765717, 12465069, -4843113, +-17389248, -734439, 9293772, 4057134, -5717675, -19462108, 20500416, -6535330, -20952998, -6350109, +-15785615, 4963372, 2663417, -31549220, -13641890, 18881214, -4089883, -8140574, 21984326, 1851668, +-11879880, 8172249, 11827803, 10012643, 1302986, -19502910, -8250096, 2668249, 2532420, 9785546, +6342056, 11075110, -10134512, -8016020, 3493419, -2923262, 8977555, -18333604, -3380139, -19807852, +-6646462, 3295314, -3023120, -2698850, 20593294, 4119948, -15845208, -2588792, 901943, -16078747, +-2497524, 547608, 9167608, 23834922, -8904004, 7819525, -13804025, 1800665, -8286066, -10392747, +9412421, 20824148, -17085916, 1394254, 18324478, -8684424, -2168959, -7255274, 11814918, 2740726, +-15717970, -409096, -5826123, -5172751, -2044941, -7719130, 10796474, -27188216, 5109938, 2011118, +-11978127, 14838575, 22457310, 16073378, 43353400, 13094282, -12107513, -15927349, -13743358, -7311645, +19598472, -53734336, -4365835, 26951994, -41360000, -4142496, 5371931, -42715060, 15752866, 2522757, +30021284, -5644124, 9118216, 7096360, -37799472, -31848794, -13755707, -5333276, -20083268, -24360518, +-13883482, 17641042, 11816529, 9650255, -1046898, -343061, 4010963, -1407139, -28153510, -12350715, +-35486092, -13322452, 16065325, 2696703, 10036802, 38735772, 8329016, 12791486, -3182571, 5324686, +34071976, 24474872, 5069135, 14912663, 13928042, 33296198, 27308476, -43201464, 22151294, -5714991, +21000242, 20677046, 7160248, 40111772, 35706748, -25316684, 16001438, -4425964, 14956687, -36455144, +-373662, -1207423, -2505577, -12276090, 16366510, 16551730, -25588342, -13220983, -17203492, 981400, +-22906672, -29774324, 14598594, 25603910, 5660230, 23516556, -19508816, -16047608, 24192478, 43322800, +-5545340, -58223112, -18435610, 6421513, -4304631, -9252433, -12616466, 707596, -33306398, -19567334, +-27633282, -3910031, -7936026, 9914395, -19697256, -5046050, 5531918, 10031970, -74625, 11126650, +20409148, 4999879, 29368986, -17973364, 7164006, 2092723, 27999428, 8291435, -5374615, -27062052, +18758270, -3736085, 25520158, -20196010, -16902844, -14937896, -8573292, -24559160, -3512747, -3054259, +-24330990, 14950781, 27790586, -11792906, 4146254, -34285112, 34673808, -9045738, -18845242, 17852032, +13852880, -18411988, 1806034, -10461467, 4532264, -6811282, 43350180, 1247688, -3764002, -7550016, +76472968, 5449777, -10540387, 36725728, 26072598, -23349590, 21264384, -28882582, -19768660, -29365228, +25589416, -16546898, 9281424, -17470316, -79812304, 4688494, 49704044, -31556736, -21400748, 39766028, +-30598958, -2843805, -9408663, 38145216, -68088120, 36592584, 21239688, -19830400, 5976984, 35741644, +25125558, -13717052, 13925895, 5838471, -11274289, 16352551, -1434519, 9574019, 14782741, -7631620, +2747169, -2575370, 6469295, -10568304, -8920110, -1480153, 12494060, -40634684, -20817170, 18928458, +-5604933, -27230092, -32298154, 4537096, 37601364, -17675402, -25930866, 18194556, 27732604, -7194607, +6080063, -5988795, 25730076, -15515569, 39170640, -6366752, -1141388, 21202106, -756451, 4145717, +-29913374, 44094280, -24537686, -29246580, 20164872, -30959198, -11118060, 3919158, 13673565, 40430676, +-15999827, 24646670, -6497749, 12137041, -71725416, -55576876, -11108933, -22818088, 9442486, -8220568, +-28844464, -14833206, 16718697, -35268124, 29520920, -30371862, -37665788, 17396766, -19605988, -13846975, +17547626, -17590576, 14175003, -14319958, 5086852, 37127308, -38141456, -4882841, -8260296, 30944166, +1583769, 838592, -34565360, -31955630, -13550622, -10933376, -7665443, -11815992, 2764885, -496606, +-6392522, 2712272, 3915937, 1226213, 2260764, -8278550, 12207908, -12248710, 11469710, -30253750, +-2482491, -24895778, -33088428, -19515258, 35622460, -19005768, -21009906, -14902463, 5188858, -9868761, +13529147, 23434952, -30779884, 21913460, 76773, -38904888, -22852984, 74364136, 35057672, -59796684, +-15623480, 34827352, -23602456, -23036058, 9556839, -20174536, -45554572, 26752278, 7093139, -56418692, +15808164, 25257628, -39423504, -24079198, 23270670, -13219909, 49299244, 69224672, -25769804, 77299744, +-4572530, -19575388, -14631880, -24543054, -663572, 13931263, 46388332, 2667712, 15393700, -10302553, +-37060736, 1780264, 3080565, 26506928, 6549825, -28266254, 56116432, -22290344, 11951283, 25324738, +-25252260, -21144660, -36774584, -16127602, 25827786, 30535070, 38766912, -13160317, -87936768, 20630876, +49086108, 60865056, 53932980, -215822, -23539642, -31385474, 13171591, 31204548, -17243220, -9934259, +-77296528, -48467096, 45354316, 72424960, 17375828, -1719061, -14830522, -31347892, -4625143, 20137492, +-25046638, 11004780, -980863, 45574436, 1162862, 17685064, -85895584, -11518565, 4518306, 54460184, +46052788, -1582159, -22860500, -7961796, 69280504, 28643136, -71961104, -95806224, -31981938, 17599702, +152848224, 14198088, -18853296, 19127100, 7221451, -12622372, 31053150, -36381056, 791885, -14755897, +7996692, -22572738, 20631412, 5643050, -12320114, -22716618, -11513197, -4399121, 6128919, -30897994, +6641630, -15152108, -6361921, -24159192, -11871826, 19549080, -21110838, -7252589, -3386045, 9612674, +5887327, -7931194, 10473815, -17540646, -2030983, 367757, 8828842, -11381126, 16101296, 12749610, +-13466333, -14513768, -6378564, 24164560, -17940078, 7880728, 16940962, 4342749, -18099530, -6181532, +6586869, -10361609, 7168301, 1327145, 2974802, -15363098, 2394444, -12320114, -1566589, 12793634, +14189498, 12662637, -9913858, 12200391, 278099, -13215077, -3322694, 1044214, 15666430, -3452617, +2211371, 16083579, -4624606, -17676474, 25289304, -9154186, 14285061, 13673565, 1257889, 6251325, +-11555073, -8796630, -28560996, 55121612, 5561983, 3552475, -21407728, 13210246, -1218697, 14859513, +11560978, 17284560, 2515240, 4787278, -8744553, 3220152, 16048145, -1014149, 9111773, -858457, +3400540, 3860102, 6969122, -6058052, 12379706, -7481833, 1843615, -857383, 4734128, -635655, +3147137, 9224516, 10522670, -4313221, 5124433, 2244121, -1303523, -3828427, 13796509, -3651259, +3638374, -3373697, 7679939, 238908, -5235565, 13236552, -7092602, -2554432, 4441533, -5890011, +-2667712, -1705639, 1595044, -2173254, 1309428, -1109712, -2229625, 4514548, -7190849, 5337571, +4778688, -2828773, 6793028, -4223564, 7870528, -3448322, 2639258, 1151051, -2487323, 6245956, +1573032, 574989, -330176, 8217346, -8399882, 10279467, -5480379, 104690, 5028870, 10259603, +-49938660, -124109520, 19110994, 94195072, 87552368, 151929632, -38958576, -40933724, -103700376, -141643184, +-29268592, 50913616, 54628764, 102832256, 55902220, 4169876, -26845156, -72219336, -51225000, -9104257, +-8065949, 25362318, 23738822, 13461501, 8740795, 6614787, -3820910, -17991082, -1386738, 20107964, +151934, 3970697, -1162326, -15654082, -11708081, -26396870, -25491168, 11218991, 10723996, 23310398, +36058396, 26603028, 13247827, 4388383, -38781944, -27874874, -21170968, -21701396, -23657216, 4565550, +15283641, 25951804, 33807300, 27448062, 6231461, -3692061, -22148072, -23193360, -13343390, -6988986, +2418067, 3384971, 7813083, 320512, -6987912, 2171106, -11278047, 5841693, 10340671, 1020055, +20393042, 24049670, 8260296, -3959960, -24847460, -32131724, -8114804, -99858, -733366, 0, +0, 0, 0, }, }, { { 7204808, --112206, 2781528, 3014530, 1069447, 1095217, 1584306, 2418604, 4501663, 2129230, -317828, --1715839, 302258, -2369211, -2297808, 426812, -415538, 963146, -445066, -933619, -2509872, -3289408, 670015, -118648, -4460861, 390305, 3133179, 4474282, -2950643, -650151, -817118, -2281165, -329102, -152471, 1020055, 359167, -621697, 1668058, -1816771, 807991, -4531191, --3287798, 1495186, 1793149, 6454799, -2423435, -2421825, -1366873, 2668785, -2049773, -3800509, --2625836, -4480725, 494458, -2971581, 2694018, 3472481, 849867, 1490891, -2051384, 1344862, --309775, -5009006, 5896990, 3970161, 2848100, 1022739, -1912334, -848256, 2512019, -1515050, -765578, 284542, 177167, -436476, -1467805, -4156992, -5884105, -124554, 1229434, 925565, -4115116, 505196, -562104, -2726767, 6068252, 3742527, 144418, -791348, 6024766, 2028835, --2000381, -5366562, 3344706, -1568200, 2582886, -5105643, 265751, -1241782, -3834332, -1048509, --1962263, -725850, 222801, 3221, -2816962, -1707786, -505732, -546535, -1780264, 1817308, --247497, -1841467, 3187403, -5433134, -2648384, 2584497, -3333968, 446677, -2100776, -2976412, -1944547, 1844152, -1680943, 2046552, 3839164, 2224256, -2123861, -2362769, 337692, 796716, --2494839, 2631741, 4230006, -3653407, -1283658, 2177549, 1484448, -822486, -1247151, -1734093, -2259153, 810138, -2997887, 3355980, 1426466, -2538326, -2185602, 3593814, -2806224, -3047279, --6527277, -4979478, 2285460, 7984881, -558883, -1377611, -3003793, 5187784, -2471754, -79457, --3871913, -4116189, -5260798, -2346663, 4438849, -4197794, -1478543, -1331977, 1647120, -873489, --5892159, 3387656, 1681480, 12014097, -1041530, 5752035, -940061, -44023, -376347, 862215, --2328946, 4821638, -1045288, -651761, -2602750, -229244, -835908, 7351911, 1458678, -423591, --6480569, -375810, -1131724, 2310156, -4069482, -843424, 1278827, 1284195, -1027034, -363462, --2480344, -623307, -3010235, -1037772, 6235756, -1401233, 2063195, 3821984, -695248, -2880849, --4225174, 1592359, 1147830, 1804960, 2830384, 3731253, 2763275, 2090575, -1090385, -562104, --1284732, -5459441, -1357747, 119722, 3063922, 3373160, -1449552, 838592, -10471667, -2663954, --354872, -2349884, -1682554, 3474629, -7407208, -6216965, -3716221, -2509872, 872415, 8017094, --1931662, -149250, 816581, -5973226, -1694902, -5006322, -922881, 8512088, -835371, -4319127, --2901787, -5906, 1590749, 1619203, -2594697, -11043435, -5407901, -1565516, -4394826, 292058, -25233, 4338454, -3032247, 3848828, 787590, -2104534, -6030671, -4978941, 6610492, -5672041, -3555159, 1031329, -3764539, -1398012, -3378529, -2345589, 3026878, -6053220, 2949032, 1036698, --258772, 998580, 263067, -598611, -20938, -3036005, -4336307, 330712, -1422171, -3041911, --1390496, -4710506, 5419175, 3893925, 832150, 4664872, 419833, -1783485, 5534602, -2784213, --1966558, -1656784, 4214974, -3796751, -6864432, 8580808, 9738838, 2712272, 2688650, -2701535, -4601521, 2313914, -5536213, 1818382, 3747896, -6696928, -5765994, 5962489, -5029407, -712428, --3188476, 5998459, 1449015, -656593, -2042257, -23085, -3706020, 3608846, -1760937, 2187212, --752693, -24159, 4069482, 1528472, 742493, -1506460, 4008815, 2408403, 1347009, -339302, -4158602, -324270, 953483, -2505040, 5040681, 1051193, 2167885, 3479461, -9367861, -3165928, --1621350, -3490735, -3063386, 932545, 5680094, -2370822, -1115618, -2998424, -983011, 1102196, -2716030, -6694781, -29528, 2248416, 659278, -598611, 3292629, 1799591, -5780489, -1821603, --889058, 3760244, -3593814, 5342940, 6411850, 2982318, 1792075, -2840584, 494995, 374199, -10348187, -2325725, -493384, 3561602, 2187212, 1549410, 3264712, 9150428, -2988760, -1214939, --9487583, -163209, -8200703, -10316511, 14496, 3902515, -13219372, 4024384, 3870839, 1961190, --4252555, -3441343, -4607963, -1969779, -95563, -81604, 3751117, 5054640, -1086090, -5682779, --3577708, 3644817, -6070400, -3210488, -5185636, 678068, -8167417, 3526705, 267362, -901943, -904628, -629213, -2142652, -375273, 4677757, -6197101, 6679211, -5737003, -982474, 897111, --3906273, -3304977, 2389076, 938987, -1489280, -3144453, 4880694, 1750736, -4034048, -7786776, -472446, 1227287, 3909494, -668404, -2285460, -144418, 1879048, -2291902, 9795747, -4000225, --2075543, -7917772, -5262946, 10783589, 4173635, -3410204, -1358820, -1163399, 2556579, 6507949, --9584756, -5798743, 6031208, -5178657, -5533529, -5987185, -7141994, 4491462, -2115808, -541703, --1968706, -80531, -7915625, -1821603, 2997887, 3429532, 417149, -4265440, -6188511, -5072357, --6510097, 937377, 6787659, 691490, 1888712, 2206540, 1957431, -4516695, 3998615, 2522220, --3649649, -2804077, -10289668, 1282048, 1720671, -7930120, -1087164, 2170032, -1926293, 765578, --1176821, -8448738, 6556268, -7865696, 5579163, 189515, 2570538, -8796093, -5340792, -7867307, --6612102, 1058710, -2668785, -2807835, -3934190, -42950, 3390340, -7175280, -592706, 2138357, --2783139, -7923141, -5467494, -1535451, 1083406, 4090956, 1293322, -6332930, 6700686, -1920387, --1786170, 7441031, -9164923, -2641942, 14674830, -12155831, -6152004, -7948911, 6607271, 2749853, --3760781, 3303367, 486942, 8870181, 1100585, 507880, -7552700, 6157910, 9917616, 10172093, -8744553, -4139812, -56371, 1635309, -4537633, -3183645, 2042257, 952409, -6787122, -3315715, --2434173, 4003447, 177704, -5318244, -1832877, 2189360, 5293547, 878858, -745714, 388695, --3123515, 199716, 635655, 918586, -7646653, 5302674, 6845641, 1515050, 4028143, 3808026, --5901822, 10217190, 10012106, 1951526, -5047661, 3847217, -1006096, -8861591, -1093606, -2580739, -1165010, 884226, 1206886, -5210332, -3483219, -11050414, -7937100, 496069, 7432441, -4833986, -4235912, 1160178, -1550483, -8831527, 1263794, 5935645, -1134945, 5447629, 12472048, 3576097, --278636, -13079249, 1865090, -4615479, -17659294, -13497472, 3926137, 552977, -2672007, 3647501, -9160092, -964757, 5675800, 5040681, 3150896, -971200, -4241817, 4263292, -3537443, 900869, --2964064, 5856725, 10444824, -8539469, -2083596, 971200, 4122095, 1382443, -2277943, -1211181, --2816425, 159451, -3600793, 5682779, 1695975, -5875516, 7554848, -6600291, -1687922, 9025874, -8149701, 6822556, -6721087, -4362076, -5947993, 8019241, 10888816, 286152, -1508070, 8599598, --11375758, 1926830, 3874597, -705448, -9420474, 9543417, 3877282, 5083631, 9243306, 929324, --11436424, 3681324, 5771363, -2625836, -104153, 8895951, -7864622, -7659001, -6172405, 1368484, -11740830, 6368363, -599685, 12899934, -15493021, -5612449, 1128503, 8115878, -14280229, 14985678, -6248641, -79994, -1228898, 1518808, 2790118, 8253317, -1253057, 1166084, -2294586, -1552094, -4746476, 2607045, 5465346, 2588792, 3255048, -9648644, -3884798, 16973710, 1919314, 5251672, -7232725, 2925947, -5436355, -10193031, 3475702, -4081830, 598074, 3981972, -5024575, -5847061, -7667054, 9069360, -4395362, -2961380, 6969122, -8069707, 3818226, -6147709, 3043521, -5943698, -9171366, 1535451, -1072131, 3451006, 15634218, 4549444, 6110665, -1490354, 871342, 2902324, -11528229, -744103, 16476568, 730681, 7832410, -48855, 14835891, 5477157, 11048266, 8619999, --1916092, -4749697, -1421097, -5460514, -6376953, 8904004, -1927367, -3180960, 1112933, 371515, --4783520, -1852742, 831076, 4374424, -16106, 16619376, -4907537, -607738, -21442088, -1221381, -10838350, -6373195, 9379672, -13880797, 1570884, 823023, -744103, -18274012, -1141924, -30107184, -1066763, -3828963, -12690555, -2745558, 1360968, -7089918, 842887, 6849399, 883153, -7405598, -1007170, -2753611, 6321118, -7952132, 207232, 8779987, 1937567, 66572, -1593433, 6524056, --4836133, 537, -169114, 4790499, 958851, -10783052, -5409512, -7869454, 8173323, -19543712, -8993662, 6546604, 6364605, 2648384, 1398012, -9129490, 5862094, -13096966, -2801393, -3569118, --2410014, -1599875, 908386, 2781528, -9131100, -4815732, 15946677, 5374078, -5440650, -7932268, -2064269, -4106526, 5224828, -4610648, -431644, -6588480, 14927696, 5657009, -3983045, -817654, --5860483, -163746, 11052025, 11154567, 6585796, 5876052, -5074504, 6503118, 10771241, -7629473, --16106, -20104206, 11890080, 8088497, -2607045, 4845797, -1014149, 1757715, 7532836, -4415764, -11623255, -10090489, 1301912, 12840342, 5906654, 870268, 10168872, -3405909, 4861366, 2651069, -5621039, 8748848, -4782983, -1014149, 16425029, 8040179, 26307, 2212982, -10492605, 14754823, --12046310, -823023, 13341242, 3958886, 14340896, -8820252, 2652679, -663572, -2982318, 1749125, --13021267, -9582072, 13127568, -6484864, -2264522, -4482872, -13849122, 9942312, -2903398, -2619930, --5859946, 5970542, 15031849, -11778948, -1831267, 9451612, -10252087, -5091147, 9292699, 11783780, --19648938, -5878200, -1148367, 8074539, 329102, 9459129, -1703491, 10324028, 22167936, 4070555, --13470091, -4991826, 4184909, -29671244, 725850, -114890, -4791036, -1748589, 13398150, -22498112, -4712653, 10038949, -8310225, 8847633, 17002164, 3896609, -15967615, 3922379, -4102768, -665720, --15628312, -5081483, 14077292, -1995549, 12914967, -3835943, -4609574, 1693828, -11032160, -6624987, --7937637, -6328098, -4333085, 10122164, -11700565, 1412507, 20482700, 13303124, 4658429, -21320218, -3521873, 13101261, 5797132, 249108, -7306813, -9612674, -22065932, -15941845, 3332895, -8217346, --7398618, -1090385, 9708774, 6038187, -6415071, -418222, 13795435, -5937256, -1938104, -163746, -18142478, -140123, -429497, 8167417, 3365107, -21092048, 6296422, 4910222, 651224, -17679696, -7956427, 8913131, -6301254, -5398237, -6444062, 23307714, 1445257, -4518843, -137439, 10375030, --4744865, 2955474, -2295123, 2542621, 8975945, -15881715, 17105780, 19245748, 5599564, 8195335, --6268505, 10937671, 25425132, 891743, -2660732, -4581657, 10958072, -3754338, -5866926, -2093260, -4038343, -12533788, 5820755, -11055246, 12883828, 2859375, 12972412, -8027831, 11843372, 3401614, -15427523, 2439542, 3429532, -5541582, 9688372, 2241973, -2780455, 13492640, -5104032, -9915469, -19516868, 15178414, 5888937, 14296336, 21314848, 25301652, -7789997, -8377871, -8878771, 2800856, --11621645, 13415867, -1599875, -1791001, -19598472, 3976066, 22400402, 22069690, -857920, -3765076, --15638513, -657667, 14753213, -8621073, -9395778, 7161321, 1089311, -9547175, 2527588, -3046206, --31339302, -22196390, 10095321, 3317325, -16943110, 645319, 5959267, -15472083, -10194105, -7221988, -16181826, 6779069, 4418985, -6444599, -5335960, -5306432, -11887933, -15283641, -26422638, 12253005, -10126996, -6269042, 27384712, 12824772, 26235808, 17933636, 566399, -9645423, 6065568, 2514703, -11256036, 13482976, 14605036, -3103651, -4020090, 5930813, -8404714, -2460480, -7568806, -12627741, --20730196, -6450504, 18523120, -5674726, -9211631, -11968463, 6568079, 11254962, 6658273, 60130, -10337449, 22043382, -14924474, -6895570, -11808476, -8271034, -23296440, -6040335, 4172561, -10642929, --9183714, -25906706, -37340444, 3303367, -25065430, -37917580, -28335510, -11971684, 22811646, 7727183, -13450227, 10420664, -26060250, -11148661, 1091459, 11742977, 2432025, -58782532, -10126459, 17395154, --20685636, 6897718, -8684424, -32466732, -10762651, 32293322, 41192496, -23629300, -193274, -8970576, --35380868, -28691456, -26844620, -28949690, -15702400, -19383188, -2393908, 4551592, -5697811, 5665599, -5632313, -12730283, -3948686, -16972638, 5688684, -25923886, -22842784, 3779034, 3001645, -8201777, --8856759, 17606682, -6412386, 25026774, 5142687, 23044648, -17442936, 9068287, 6266894, 28183038, -15288473, 8718784, 2181844, 2714956, -4204773, 6928856, 11676942, -11581379, -14123463, 18973018, --3506304, -28286654, -50997368, -62699008, -44290776, 5106716, -644245, -58655832, 17779554, 7332583, -13578539, -21587580, 1890859, 4254165, 1957431, 26559540, 28943248, 56655988, 19008452, -33475512, --40960568, -25614648, -10871636, -5327370, 31766652, -9302899, -61653720, -18134426, 49786188, -7658464, -10725607, 6459631, 8926016, 16891570, 13987635, 4288525, -10381473, -4466766, 2115272, -11659762, --2886218, 17681844, -16866874, -10664941, -16877074, -4802311, 2593087, 1284195, 4165582, 7786776, --12807056, 10376104, 27387396, -1372779, -16197395, 584652, -10602127, -4517232, 16294569, -18131742, -1947231, 4548907, 20019916, 28038620, -18318572, -11399917, 11340861, 651224, 3343632, 2473364, --11975979, -32054952, -5287642, -15369540, 28714004, -54707684, -35020628, -15380815, -5404680, 14812268, -3797825, -19715510, -2593624, -22529788, -22975390, -8983461, -16332687, 2760053, 14925011, 64623688, -12985834, -9461276, -40586368, -33590404, 11337103, 519691, -38021196, 24607478, 20038706, -23132694, --74254080, 8606578, 9416179, -4109747, -3031710, -7264401, -22758494, 6530498, -6534256, 35327180, --40123048, -9394704, 36915244, -3383897, -28401008, -4803921, 20856362, 26397942, 14991583, -6546067, -17772574, -16627429, 11229192, -7629473, -7518341, -14551349, 19512036, 13460964, -16777216, -8021389, --4630512, 20810190, -4714801, 955630, -16973174, 13589813, 6950331, -17846662, 27004606, -31675, --29830696, 22373558, -32254668, -16743393, 23396834, -58061516, -39458940, 29514478, -23032836, 21544630, --39556112, 6704444, 9432822, -21086678, -3194919, -2872796, -41288056, -9933186, 33911452, 39131984, --50754164, -16629040, 8971650, -38284800, 42135776, 46309412, 747324, -69804496, -42710764, 71041984, --46331424, -9471477, 49183280, -36859408, -83799104, -19746112, -10308458, -39837432, -37553584, -932545, --47378320, -13984414, -20122458, -19001472, -14273250, 30843770, -3306588, -9846749, -12911745, 6040872, --16521665, -39528196, 30778272, 9649181, 26636850, 8296266, 27571542, -10879689, -16662862, 6070937, --28336046, 22232898, -25603374, -5479305, 17432198, -19659676, -3761318, -11932493, -30949534, 4745939, --23220740, -17073568, -20156282, -15283641, -8884677, -20991116, 4329864, 23400056, -15112379, -5528697, -3609920, 21619254, -9008157, 7768522, -21194590, 35997732, 12121471, 15592879, 10801843, 34637836, --946503, -39997956, 10060424, 15105937, -9970230, 420907, 22597434, -27394912, -26382910, -31738734, -29728154, 9398462, -38343856, 16963510, -24541444, -3422015, -35264904, 18900540, 29030220, 8841190, --38408820, 28485834, 35479116, 66463008, -15730855, 33053532, 6616934, -15467251, -29387776, -17082158, -38776040, -12458626, 7397545, 15124190, -3650722, 35686884, -4978941, 28033788, 29393682, -35623532, -18690088, -9228274, 1127966, 13252122, 11148661, -1093606, 6075768, 10739566, 35940288, 36798208, -28566902, -20607790, -6802692, -48661444, -1209033, 11615739, 22267258, 5171141, -40094056, 17766132, --23972896, 31391916, -28039158, -19689740, 2263448, -23577760, -3854733, -13576928, 48371532, -26250304, --12738336, -50415400, -16307454, -26419418, 71393632, 43459700, -15000173, -47925928, -51549808, -30478162, -35352948, 46446312, 23240068, 7007239, -62186296, -28488518, 19750408, 17598092, 1856500, 22650584, --14041859, -40368936, 17459042, -68720016, 72318656, -6886980, -53119080, 112036904, 7449084, 2794413, --28978144, 20222316, -41081900, 26015154, -16655346, 42458972, -18571438, -1648731, 24453396, 4565014, -2574833, -10580652, -8916889, 1362578, -15629386, 18030272, -1544041, 19115826, -14253386, -14373645, -5539434, 949188, -14413910, 9648107, -1272921, 8427263, -3962644, -3903589, 8562017, -7393786, -89121, 5997922, -2325725, -3498788, 30663920, -1981591, -9206799, -5306432, 15040439, -1274532, --15396921, 8638253, 18429168, 3498251, 1406602, -10428181, 4723391, -8499203, 9132711, 21097954, --6359773, 9508521, -6742025, -2660732, -7408282, -4496294, 7092602, 6444062, -10799158, 6948720, -4009352, -2250026, -10431402, 1290638, 6757594, -10270341, 15916612, 9829033, -19437412, 3928285, --16994648, -25865366, 20564304, -11812234, 25107306, -23795192, 52173652, 10334228, 13291850, -5957120, -5348308, -908922, 10407243, 3665755, 22619446, 2089502, -11266236, 7808251, -7116761, 3954591, -5170604, -9522479, 1213328, 2990908, -10212895, 10490994, 3246459, -3926137, 14071387, -4235375, -5996848, -3550864, 3213709, 3082176, 1955821, -1152125, -3207804, -1300838, 2626373, 849867, --1459752, -5986648, 5633387, -3856881, 3215320, 4773320, -3639448, 1444183, -3330747, 1685775, --5749351, -10195179, 11891154, -5443334, -1980517, 5158256, 3053722, -1414118, 2179159, 9946607, --9505299, 4978941, -2959233, 8660802, -7770133, 5434744, 3524558, -1129040, 3035468, 611496, -1294933, 4402879, -4298189, 3483755, 4128537, -1196685, 1000191, 7425999, 730144, 2587718, --5856725, 11105175, 9595494, -45953464, -113883744, 24428700, 94386736, 63797980, 133190696, -43737800, --37487548, -76841256, -122850560, -12215961, 38009924, 50306952, 65538516, 33083060, 3400004, -10813654, --28681792, -40606768, -6401649, -10872710, 3726421, 9281424, -760209, 2323041, 4616016, 2171643, -15763067, 19079318, 11543798, -2165737, 1884417, -14078903, -29942902, -31509490, -15815680, -20636244, -16694001, 31496068, 32983738, 36703716, 19690278, -5812702, -14844481, -26782880, -28825674, -19608674, --11524471, -1114007, 6757594, 13990856, 14387604, 12676059, 10297721, -1607392, 2433636, -2910914, -961536, -2086817, -1940252, -512712, -10555956, -10171556, -8129836, -15466714, -452045, -2456185, -1549946, 27749784, 35264364, 12904766, 11763379, -8578660, -19718732, -11546483, -22576496, -11243151, -2200634, -286152, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-112206, 2781528, 3014530, 1069447, 1095217, 1584306, 2418604, 4501663, 2129230, -317828, +-1715839, 302258, -2369211, -2297808, 426812, -415538, 963146, -445066, -933619, -2509872, +3289408, 670015, -118648, -4460861, 390305, 3133179, 4474282, -2950643, -650151, -817118, +2281165, -329102, -152471, 1020055, 359167, -621697, 1668058, -1816771, 807991, -4531191, +-3287798, 1495186, 1793149, 6454799, -2423435, -2421825, -1366873, 2668785, -2049773, -3800509, +-2625836, -4480725, 494458, -2971581, 2694018, 3472481, 849867, 1490891, -2051384, 1344862, +-309775, -5009006, 5896990, 3970161, 2848100, 1022739, -1912334, -848256, 2512019, -1515050, +765578, 284542, 177167, -436476, -1467805, -4156992, -5884105, -124554, 1229434, 925565, +4115116, 505196, -562104, -2726767, 6068252, 3742527, 144418, -791348, 6024766, 2028835, +-2000381, -5366562, 3344706, -1568200, 2582886, -5105643, 265751, -1241782, -3834332, -1048509, +-1962263, -725850, 222801, 3221, -2816962, -1707786, -505732, -546535, -1780264, 1817308, +-247497, -1841467, 3187403, -5433134, -2648384, 2584497, -3333968, 446677, -2100776, -2976412, +1944547, 1844152, -1680943, 2046552, 3839164, 2224256, -2123861, -2362769, 337692, 796716, +-2494839, 2631741, 4230006, -3653407, -1283658, 2177549, 1484448, -822486, -1247151, -1734093, +2259153, 810138, -2997887, 3355980, 1426466, -2538326, -2185602, 3593814, -2806224, -3047279, +-6527277, -4979478, 2285460, 7984881, -558883, -1377611, -3003793, 5187784, -2471754, -79457, +-3871913, -4116189, -5260798, -2346663, 4438849, -4197794, -1478543, -1331977, 1647120, -873489, +-5892159, 3387656, 1681480, 12014097, -1041530, 5752035, -940061, -44023, -376347, 862215, +-2328946, 4821638, -1045288, -651761, -2602750, -229244, -835908, 7351911, 1458678, -423591, +-6480569, -375810, -1131724, 2310156, -4069482, -843424, 1278827, 1284195, -1027034, -363462, +-2480344, -623307, -3010235, -1037772, 6235756, -1401233, 2063195, 3821984, -695248, -2880849, +-4225174, 1592359, 1147830, 1804960, 2830384, 3731253, 2763275, 2090575, -1090385, -562104, +-1284732, -5459441, -1357747, 119722, 3063922, 3373160, -1449552, 838592, -10471667, -2663954, +-354872, -2349884, -1682554, 3474629, -7407208, -6216965, -3716221, -2509872, 872415, 8017094, +-1931662, -149250, 816581, -5973226, -1694902, -5006322, -922881, 8512088, -835371, -4319127, +-2901787, -5906, 1590749, 1619203, -2594697, -11043435, -5407901, -1565516, -4394826, 292058, +25233, 4338454, -3032247, 3848828, 787590, -2104534, -6030671, -4978941, 6610492, -5672041, +3555159, 1031329, -3764539, -1398012, -3378529, -2345589, 3026878, -6053220, 2949032, 1036698, +-258772, 998580, 263067, -598611, -20938, -3036005, -4336307, 330712, -1422171, -3041911, +-1390496, -4710506, 5419175, 3893925, 832150, 4664872, 419833, -1783485, 5534602, -2784213, +-1966558, -1656784, 4214974, -3796751, -6864432, 8580808, 9738838, 2712272, 2688650, -2701535, +4601521, 2313914, -5536213, 1818382, 3747896, -6696928, -5765994, 5962489, -5029407, -712428, +-3188476, 5998459, 1449015, -656593, -2042257, -23085, -3706020, 3608846, -1760937, 2187212, +-752693, -24159, 4069482, 1528472, 742493, -1506460, 4008815, 2408403, 1347009, -339302, +4158602, -324270, 953483, -2505040, 5040681, 1051193, 2167885, 3479461, -9367861, -3165928, +-1621350, -3490735, -3063386, 932545, 5680094, -2370822, -1115618, -2998424, -983011, 1102196, +2716030, -6694781, -29528, 2248416, 659278, -598611, 3292629, 1799591, -5780489, -1821603, +-889058, 3760244, -3593814, 5342940, 6411850, 2982318, 1792075, -2840584, 494995, 374199, +10348187, -2325725, -493384, 3561602, 2187212, 1549410, 3264712, 9150428, -2988760, -1214939, +-9487583, -163209, -8200703, -10316511, 14496, 3902515, -13219372, 4024384, 3870839, 1961190, +-4252555, -3441343, -4607963, -1969779, -95563, -81604, 3751117, 5054640, -1086090, -5682779, +-3577708, 3644817, -6070400, -3210488, -5185636, 678068, -8167417, 3526705, 267362, -901943, +904628, -629213, -2142652, -375273, 4677757, -6197101, 6679211, -5737003, -982474, 897111, +-3906273, -3304977, 2389076, 938987, -1489280, -3144453, 4880694, 1750736, -4034048, -7786776, +472446, 1227287, 3909494, -668404, -2285460, -144418, 1879048, -2291902, 9795747, -4000225, +-2075543, -7917772, -5262946, 10783589, 4173635, -3410204, -1358820, -1163399, 2556579, 6507949, +-9584756, -5798743, 6031208, -5178657, -5533529, -5987185, -7141994, 4491462, -2115808, -541703, +-1968706, -80531, -7915625, -1821603, 2997887, 3429532, 417149, -4265440, -6188511, -5072357, +-6510097, 937377, 6787659, 691490, 1888712, 2206540, 1957431, -4516695, 3998615, 2522220, +-3649649, -2804077, -10289668, 1282048, 1720671, -7930120, -1087164, 2170032, -1926293, 765578, +-1176821, -8448738, 6556268, -7865696, 5579163, 189515, 2570538, -8796093, -5340792, -7867307, +-6612102, 1058710, -2668785, -2807835, -3934190, -42950, 3390340, -7175280, -592706, 2138357, +-2783139, -7923141, -5467494, -1535451, 1083406, 4090956, 1293322, -6332930, 6700686, -1920387, +-1786170, 7441031, -9164923, -2641942, 14674830, -12155831, -6152004, -7948911, 6607271, 2749853, +-3760781, 3303367, 486942, 8870181, 1100585, 507880, -7552700, 6157910, 9917616, 10172093, +8744553, -4139812, -56371, 1635309, -4537633, -3183645, 2042257, 952409, -6787122, -3315715, +-2434173, 4003447, 177704, -5318244, -1832877, 2189360, 5293547, 878858, -745714, 388695, +-3123515, 199716, 635655, 918586, -7646653, 5302674, 6845641, 1515050, 4028143, 3808026, +-5901822, 10217190, 10012106, 1951526, -5047661, 3847217, -1006096, -8861591, -1093606, -2580739, +1165010, 884226, 1206886, -5210332, -3483219, -11050414, -7937100, 496069, 7432441, -4833986, +4235912, 1160178, -1550483, -8831527, 1263794, 5935645, -1134945, 5447629, 12472048, 3576097, +-278636, -13079249, 1865090, -4615479, -17659294, -13497472, 3926137, 552977, -2672007, 3647501, +9160092, -964757, 5675800, 5040681, 3150896, -971200, -4241817, 4263292, -3537443, 900869, +-2964064, 5856725, 10444824, -8539469, -2083596, 971200, 4122095, 1382443, -2277943, -1211181, +-2816425, 159451, -3600793, 5682779, 1695975, -5875516, 7554848, -6600291, -1687922, 9025874, +8149701, 6822556, -6721087, -4362076, -5947993, 8019241, 10888816, 286152, -1508070, 8599598, +-11375758, 1926830, 3874597, -705448, -9420474, 9543417, 3877282, 5083631, 9243306, 929324, +-11436424, 3681324, 5771363, -2625836, -104153, 8895951, -7864622, -7659001, -6172405, 1368484, +11740830, 6368363, -599685, 12899934, -15493021, -5612449, 1128503, 8115878, -14280229, 14985678, +6248641, -79994, -1228898, 1518808, 2790118, 8253317, -1253057, 1166084, -2294586, -1552094, +4746476, 2607045, 5465346, 2588792, 3255048, -9648644, -3884798, 16973710, 1919314, 5251672, +7232725, 2925947, -5436355, -10193031, 3475702, -4081830, 598074, 3981972, -5024575, -5847061, +7667054, 9069360, -4395362, -2961380, 6969122, -8069707, 3818226, -6147709, 3043521, -5943698, +9171366, 1535451, -1072131, 3451006, 15634218, 4549444, 6110665, -1490354, 871342, 2902324, +11528229, -744103, 16476568, 730681, 7832410, -48855, 14835891, 5477157, 11048266, 8619999, +-1916092, -4749697, -1421097, -5460514, -6376953, 8904004, -1927367, -3180960, 1112933, 371515, +-4783520, -1852742, 831076, 4374424, -16106, 16619376, -4907537, -607738, -21442088, -1221381, +10838350, -6373195, 9379672, -13880797, 1570884, 823023, -744103, -18274012, -1141924, -30107184, +1066763, -3828963, -12690555, -2745558, 1360968, -7089918, 842887, 6849399, 883153, -7405598, +1007170, -2753611, 6321118, -7952132, 207232, 8779987, 1937567, 66572, -1593433, 6524056, +-4836133, 537, -169114, 4790499, 958851, -10783052, -5409512, -7869454, 8173323, -19543712, +8993662, 6546604, 6364605, 2648384, 1398012, -9129490, 5862094, -13096966, -2801393, -3569118, +-2410014, -1599875, 908386, 2781528, -9131100, -4815732, 15946677, 5374078, -5440650, -7932268, +2064269, -4106526, 5224828, -4610648, -431644, -6588480, 14927696, 5657009, -3983045, -817654, +-5860483, -163746, 11052025, 11154567, 6585796, 5876052, -5074504, 6503118, 10771241, -7629473, +-16106, -20104206, 11890080, 8088497, -2607045, 4845797, -1014149, 1757715, 7532836, -4415764, +11623255, -10090489, 1301912, 12840342, 5906654, 870268, 10168872, -3405909, 4861366, 2651069, +5621039, 8748848, -4782983, -1014149, 16425029, 8040179, 26307, 2212982, -10492605, 14754823, +-12046310, -823023, 13341242, 3958886, 14340896, -8820252, 2652679, -663572, -2982318, 1749125, +-13021267, -9582072, 13127568, -6484864, -2264522, -4482872, -13849122, 9942312, -2903398, -2619930, +-5859946, 5970542, 15031849, -11778948, -1831267, 9451612, -10252087, -5091147, 9292699, 11783780, +-19648938, -5878200, -1148367, 8074539, 329102, 9459129, -1703491, 10324028, 22167936, 4070555, +-13470091, -4991826, 4184909, -29671244, 725850, -114890, -4791036, -1748589, 13398150, -22498112, +4712653, 10038949, -8310225, 8847633, 17002164, 3896609, -15967615, 3922379, -4102768, -665720, +-15628312, -5081483, 14077292, -1995549, 12914967, -3835943, -4609574, 1693828, -11032160, -6624987, +-7937637, -6328098, -4333085, 10122164, -11700565, 1412507, 20482700, 13303124, 4658429, -21320218, +3521873, 13101261, 5797132, 249108, -7306813, -9612674, -22065932, -15941845, 3332895, -8217346, +-7398618, -1090385, 9708774, 6038187, -6415071, -418222, 13795435, -5937256, -1938104, -163746, +18142478, -140123, -429497, 8167417, 3365107, -21092048, 6296422, 4910222, 651224, -17679696, +7956427, 8913131, -6301254, -5398237, -6444062, 23307714, 1445257, -4518843, -137439, 10375030, +-4744865, 2955474, -2295123, 2542621, 8975945, -15881715, 17105780, 19245748, 5599564, 8195335, +-6268505, 10937671, 25425132, 891743, -2660732, -4581657, 10958072, -3754338, -5866926, -2093260, +4038343, -12533788, 5820755, -11055246, 12883828, 2859375, 12972412, -8027831, 11843372, 3401614, +15427523, 2439542, 3429532, -5541582, 9688372, 2241973, -2780455, 13492640, -5104032, -9915469, +19516868, 15178414, 5888937, 14296336, 21314848, 25301652, -7789997, -8377871, -8878771, 2800856, +-11621645, 13415867, -1599875, -1791001, -19598472, 3976066, 22400402, 22069690, -857920, -3765076, +-15638513, -657667, 14753213, -8621073, -9395778, 7161321, 1089311, -9547175, 2527588, -3046206, +-31339302, -22196390, 10095321, 3317325, -16943110, 645319, 5959267, -15472083, -10194105, -7221988, +16181826, 6779069, 4418985, -6444599, -5335960, -5306432, -11887933, -15283641, -26422638, 12253005, +10126996, -6269042, 27384712, 12824772, 26235808, 17933636, 566399, -9645423, 6065568, 2514703, +11256036, 13482976, 14605036, -3103651, -4020090, 5930813, -8404714, -2460480, -7568806, -12627741, +-20730196, -6450504, 18523120, -5674726, -9211631, -11968463, 6568079, 11254962, 6658273, 60130, +10337449, 22043382, -14924474, -6895570, -11808476, -8271034, -23296440, -6040335, 4172561, -10642929, +-9183714, -25906706, -37340444, 3303367, -25065430, -37917580, -28335510, -11971684, 22811646, 7727183, +13450227, 10420664, -26060250, -11148661, 1091459, 11742977, 2432025, -58782532, -10126459, 17395154, +-20685636, 6897718, -8684424, -32466732, -10762651, 32293322, 41192496, -23629300, -193274, -8970576, +-35380868, -28691456, -26844620, -28949690, -15702400, -19383188, -2393908, 4551592, -5697811, 5665599, +5632313, -12730283, -3948686, -16972638, 5688684, -25923886, -22842784, 3779034, 3001645, -8201777, +-8856759, 17606682, -6412386, 25026774, 5142687, 23044648, -17442936, 9068287, 6266894, 28183038, +15288473, 8718784, 2181844, 2714956, -4204773, 6928856, 11676942, -11581379, -14123463, 18973018, +-3506304, -28286654, -50997368, -62699008, -44290776, 5106716, -644245, -58655832, 17779554, 7332583, +13578539, -21587580, 1890859, 4254165, 1957431, 26559540, 28943248, 56655988, 19008452, -33475512, +-40960568, -25614648, -10871636, -5327370, 31766652, -9302899, -61653720, -18134426, 49786188, -7658464, +10725607, 6459631, 8926016, 16891570, 13987635, 4288525, -10381473, -4466766, 2115272, -11659762, +-2886218, 17681844, -16866874, -10664941, -16877074, -4802311, 2593087, 1284195, 4165582, 7786776, +-12807056, 10376104, 27387396, -1372779, -16197395, 584652, -10602127, -4517232, 16294569, -18131742, +1947231, 4548907, 20019916, 28038620, -18318572, -11399917, 11340861, 651224, 3343632, 2473364, +-11975979, -32054952, -5287642, -15369540, 28714004, -54707684, -35020628, -15380815, -5404680, 14812268, +3797825, -19715510, -2593624, -22529788, -22975390, -8983461, -16332687, 2760053, 14925011, 64623688, +12985834, -9461276, -40586368, -33590404, 11337103, 519691, -38021196, 24607478, 20038706, -23132694, +-74254080, 8606578, 9416179, -4109747, -3031710, -7264401, -22758494, 6530498, -6534256, 35327180, +-40123048, -9394704, 36915244, -3383897, -28401008, -4803921, 20856362, 26397942, 14991583, -6546067, +17772574, -16627429, 11229192, -7629473, -7518341, -14551349, 19512036, 13460964, -16777216, -8021389, +-4630512, 20810190, -4714801, 955630, -16973174, 13589813, 6950331, -17846662, 27004606, -31675, +-29830696, 22373558, -32254668, -16743393, 23396834, -58061516, -39458940, 29514478, -23032836, 21544630, +-39556112, 6704444, 9432822, -21086678, -3194919, -2872796, -41288056, -9933186, 33911452, 39131984, +-50754164, -16629040, 8971650, -38284800, 42135776, 46309412, 747324, -69804496, -42710764, 71041984, +-46331424, -9471477, 49183280, -36859408, -83799104, -19746112, -10308458, -39837432, -37553584, -932545, +-47378320, -13984414, -20122458, -19001472, -14273250, 30843770, -3306588, -9846749, -12911745, 6040872, +-16521665, -39528196, 30778272, 9649181, 26636850, 8296266, 27571542, -10879689, -16662862, 6070937, +-28336046, 22232898, -25603374, -5479305, 17432198, -19659676, -3761318, -11932493, -30949534, 4745939, +-23220740, -17073568, -20156282, -15283641, -8884677, -20991116, 4329864, 23400056, -15112379, -5528697, +3609920, 21619254, -9008157, 7768522, -21194590, 35997732, 12121471, 15592879, 10801843, 34637836, +-946503, -39997956, 10060424, 15105937, -9970230, 420907, 22597434, -27394912, -26382910, -31738734, +29728154, 9398462, -38343856, 16963510, -24541444, -3422015, -35264904, 18900540, 29030220, 8841190, +-38408820, 28485834, 35479116, 66463008, -15730855, 33053532, 6616934, -15467251, -29387776, -17082158, +38776040, -12458626, 7397545, 15124190, -3650722, 35686884, -4978941, 28033788, 29393682, -35623532, +18690088, -9228274, 1127966, 13252122, 11148661, -1093606, 6075768, 10739566, 35940288, 36798208, +28566902, -20607790, -6802692, -48661444, -1209033, 11615739, 22267258, 5171141, -40094056, 17766132, +-23972896, 31391916, -28039158, -19689740, 2263448, -23577760, -3854733, -13576928, 48371532, -26250304, +-12738336, -50415400, -16307454, -26419418, 71393632, 43459700, -15000173, -47925928, -51549808, -30478162, +35352948, 46446312, 23240068, 7007239, -62186296, -28488518, 19750408, 17598092, 1856500, 22650584, +-14041859, -40368936, 17459042, -68720016, 72318656, -6886980, -53119080, 112036904, 7449084, 2794413, +-28978144, 20222316, -41081900, 26015154, -16655346, 42458972, -18571438, -1648731, 24453396, 4565014, +2574833, -10580652, -8916889, 1362578, -15629386, 18030272, -1544041, 19115826, -14253386, -14373645, +5539434, 949188, -14413910, 9648107, -1272921, 8427263, -3962644, -3903589, 8562017, -7393786, +89121, 5997922, -2325725, -3498788, 30663920, -1981591, -9206799, -5306432, 15040439, -1274532, +-15396921, 8638253, 18429168, 3498251, 1406602, -10428181, 4723391, -8499203, 9132711, 21097954, +-6359773, 9508521, -6742025, -2660732, -7408282, -4496294, 7092602, 6444062, -10799158, 6948720, +4009352, -2250026, -10431402, 1290638, 6757594, -10270341, 15916612, 9829033, -19437412, 3928285, +-16994648, -25865366, 20564304, -11812234, 25107306, -23795192, 52173652, 10334228, 13291850, -5957120, +5348308, -908922, 10407243, 3665755, 22619446, 2089502, -11266236, 7808251, -7116761, 3954591, +5170604, -9522479, 1213328, 2990908, -10212895, 10490994, 3246459, -3926137, 14071387, -4235375, +5996848, -3550864, 3213709, 3082176, 1955821, -1152125, -3207804, -1300838, 2626373, 849867, +-1459752, -5986648, 5633387, -3856881, 3215320, 4773320, -3639448, 1444183, -3330747, 1685775, +-5749351, -10195179, 11891154, -5443334, -1980517, 5158256, 3053722, -1414118, 2179159, 9946607, +-9505299, 4978941, -2959233, 8660802, -7770133, 5434744, 3524558, -1129040, 3035468, 611496, +1294933, 4402879, -4298189, 3483755, 4128537, -1196685, 1000191, 7425999, 730144, 2587718, +-5856725, 11105175, 9595494, -45953464, -113883744, 24428700, 94386736, 63797980, 133190696, -43737800, +-37487548, -76841256, -122850560, -12215961, 38009924, 50306952, 65538516, 33083060, 3400004, -10813654, +-28681792, -40606768, -6401649, -10872710, 3726421, 9281424, -760209, 2323041, 4616016, 2171643, +15763067, 19079318, 11543798, -2165737, 1884417, -14078903, -29942902, -31509490, -15815680, -20636244, +16694001, 31496068, 32983738, 36703716, 19690278, -5812702, -14844481, -26782880, -28825674, -19608674, +-11524471, -1114007, 6757594, 13990856, 14387604, 12676059, 10297721, -1607392, 2433636, -2910914, +961536, -2086817, -1940252, -512712, -10555956, -10171556, -8129836, -15466714, -452045, -2456185, +1549946, 27749784, 35264364, 12904766, 11763379, -8578660, -19718732, -11546483, -22576496, -11243151, +2200634, -286152, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, { 6260452, -49392, 8157217, 379568, -2594160, -643708, 55835, 751619, 3802657, -1575716, 1945083, --3844533, 1293859, -403727, 2646774, -1793149, 3823595, 978179, -1950452, 274878, -3888556, -4334696, -404264, -886911, -2147, 639413, 909996, 661425, 3200288, -5628555, 420907, -3550327, 702764, -279710, -625455, -325344, -130460, -465467, -5762236, -478352, 1702955, --2002529, 1939715, -4516158, 22549, 2531883, -2654827, 5084705, 4920959, 3670050, 3128347, -4027069, 497679, 2022393, -1910187, -810138, -3316252, -1329829, -183610, -2893197, -971736, --4112968, 578747, -3486977, -4562329, 864899, -3337727, 2522757, 367757, -3713536, 2554969, -1621887, -4126390, 1232656, 89121, 4827543, 1418950, -6394133, 849867, 2075543, 2015950, -10150618, 2787971, 2167885, -2957085, 417149, -5089536, 1232656, 4756677, -2363306, 270583, --968515, -2478196, -4041564, 3189550, -6779069, -3382287, -3391414, 3742527, 4063576, 2185602, -988379, 2985002, 2436857, 4894652, -1661079, 1756105, 3025268, 704375, 1007707, -3456375, --1503239, -1401770, -1312113, 3344169, -6243272, 1126355, -2155000, 6641630, 169114, -1093069, --1633698, -2610803, -890669, -2724083, -8244727, -2509335, -1609539, -1224603, -1846299, 969052, --1544041, -266288, -532039, 3020436, 1289027, -234076, 1838246, -1467268, 3529926, -2160369, --3862786, 3886946, 3860102, -1489280, -3736622, 568009, 1951526, 1767916, 1647120, -1461900, --169651, 1793686, 1486059, 9223979, -1644436, -805306, 1050120, 2597918, -6679748, 4274566, --7941932, -286689, -3811784, -493921, -2499134, -527207, -561567, 4103841, -3330747, 4439923, --4483946, -4881231, 2163590, 6747394, -7794829, -2094870, -3740917, 144418, -1919314, 2214593, -2873333, 1518271, 2924873, -4467840, 220654, 6504728, 2569464, 918049, -4597763, -6538014, --3946538, 1127966, -3348464, -1806571, 1347009, 4430259, -3840775, -3709778, 1598802, -2675765, -4998805, 1789391, -467078, 3629247, 3358665, 137439, 5607080, 2903398, 1779727, 1632088, -3683471, 5912560, -3755412, 1273995, 1604707, -3855270, 379568, 3482682, -1263794, 8516383, --2558727, -1968169, -1734630, 3319473, 4202089, -5095979, -2239289, 1787243, -11702175, -1845762, --2565706, -2036888, -998580, -1379221, 6308770, 7538742, -1656784, 6162741, 2377801, -3312494, -1637993, -5050882, 947040, 1142998, -6829535, -956167, 1108102, 1262184, 4791036, -854699, -4163971, -2707440, -5240397, -5507222, -1564442, -2758980, -4197794, 4427038, -1692754, -790274, --749472, 965831, 2390149, -6692633, 32212, 988379, -3195993, 8080444, 623307, -1941325, --1755031, 8616778, -634045, 1121523, 5046050, 176094, 3062849, 1226213, 237297, 4744865, --89121, -3313031, 4173635, 2268817, 2637647, 3826816, 1161789, -3171297, 2092723, 3096135, -2907693, 4650913, -166967, -4518843, -3748433, 5390721, 7450695, -7297687, 1056025, -2189360, --1713692, 1167694, 2313377, 2127620, -8694088, 9193914, 8508867, 6413997, -4538707, 5010080, -9051107, -2313914, 7059316, 2653216, 1015223, -1127429, 7781407, 3687230, -1895691, -5637682, -3195993, -2343442, -3075197, 3163780, 3677029, 1635309, -5659693, 897648, 4927938, -2451353, -1610613, -10982768, 1487132, -886911, 5188858, 1291711, -2384244, -3310883, 6655589, -5826660, -351114, -4704600, 421444, -1439351, 3643743, -784905, -1379221, -5762773, -1540283, -1012539, -6992744, 361851, -6730751, -236760, -556198, 2244657, 3214783, -2908767, -213675, -3713536, -3723737, -865436, 4529043, -2583960, 6847789, 3551938, -8210904, 8357470, -1570884, -5769215, -567473, 7636452, 1072131, 1177895, -6742025, -398358, -3095061, -3324842, -4173098, 331249, -9855339, -3541738, -7328288, -486942, -10934987, -123480, -9413495, -3345243, 6277632, -6746320, --7437273, 2079838, 489626, 542240, -1835562, -2513630, -5420786, 3470334, -10493142, -3306588, -925029, 6308770, 249645, 6400575, 2187749, 14206141, 5355288, -276489, 493384, 6695854, --1771137, -2175401, -1427003, 994822, -4665408, -2384781, -7768522, -679142, -3656628, -2249489, -9215926, -6979, 5698348, -2518462, 2216740, -768799, 3317325, -1358283, 3067681, -3422015, --4191888, -856309, 917512, -4258997, -4250944, 105227, 1836099, 4085051, -879395, -2341294, --1157494, 3797825, 6760816, 5906, -5119601, -7308961, -250719, 1374390, 328565, 8761733, --6325950, -1083406, 3664681, -2563022, -5597416, 5082557, 1992865, 1185411, 630286, 8918500, --6827388, -1385127, 581968, -525060, -237297, -5625334, -4316442, -603443, 3758633, 1363652, -1524713, 1578401, 3955128, -801011, 3623342, 2917894, -9231495, -3553012, -10835666, 2829310, --3786551, 5481989, -3475702, -4792110, -3467649, 2856153, -7187628, -6012418, 8489540, -4584878, -9205726, -2142115, 2829310, -3196530, -6059662, 6798933, -5116380, -5832566, -475668, -3157338, --6759205, -5267778, -8541616, 395674, 5730560, 3253438, -3204046, 9686762, 3722663, -3490198, --4268661, -6915971, 540629, -2547453, -4612795, -2386391, -1767379, -3353296, 2181844, 7806103, --68183, 612033, -4759361, 2574833, 3163244, -4406637, -2937758, 2006287, 10220412, 3933653, --1196148, -977105, -253940, -9035537, 13316009, -1905892, 501974, -1587527, 8857833, 8404714, -3261491, -12656732, -1649804, -15483894, 10008884, 4495757, 814970, 17002164, 8364986, -958851, --6835441, 7292318, -2597918, 2173254, 2883534, 1554778, 5987722, -4329327, 9831717, 3993246, -1490354, -2330020, -4108673, 6738267, 5890011, -556735, 4046933, -7414724, 2091649, -10059350, -4908611, 1041530, 5990943, -8188355, 2426120, -2380486, 2549600, 10255845, 8971113, 821413, -3063922, -5682242, 8686571, 643708, 17745732, 18458158, -1717450, -4413079, -4230543, -3514357, --9769977, -2543158, -12963822, 1200980, -432181, -399432, -2069101, 5147519, 8804146, 12989592, -12496744, 9369471, -14175540, -10353556, 251792, 987306, 16317654, -10821707, 8970039, -434865, --3186866, -4583804, 9241696, 2007897, -6717329, -3726421, 17328582, 16976932, 19101868, -1864016, --700080, -3244848, 3313031, 9283035, 10827613, 3078418, -4458713, -9192304, -18464602, 5470178, --10849624, -2477123, -946503, -2455648, 1447404, -639413, -3211562, -506269, -10572599, -4383551, -882079, -2117419, -11812771, -5220533, 1296543, 8617852, -2197413, 92879, -9307194, -3413425, -428423, 6170795, -3567507, 3704946, -10386305, -3210488, 2862596, 3833258, -2556043, 14155138, --2557116, -2106682, -7079180, -2777233, 6253473, 1649268, -184684, 7166153, 10915123, 11764452, --1612760, -6504191, -6336688, -366683, 2035278, 2333778, -4258460, 3337190, 5858336, 3684008, -4992900, 11360725, 9027484, 4452808, 303869, 1431835, -10864120, -4221953, -18210662, 21363704, --1195075, 2646237, 11422466, -367220, -4786204, 47782, -21985400, -13610751, -6700686, 2835215, --4796942, 1858110, -10593000, 6339909, -4081293, -687732, 12622372, -13479218, -9159018, 11755862, --4466766, -18720688, 687732, -11783243, 1706713, -1551557, 6178311, 2289218, 2809446, 738734, --2803540, 7399155, -1520418, 9680856, 5692443, -4352413, -6843494, -6506876, 2169495, -3563749, -2177012, 1278827, 5421860, 1035624, -12109660, -89121, 3190624, -4741107, -223338, -8703214, --2477659, -158377, -231928, 17205638, -3932580, 11919608, 14592688, -5232344, 7407745, -3600793, --1323387, -9713605, 4519916, 11834246, 8171176, 638876, 2539400, 6533182, -1692754, 4877472, --4059281, -6026376, -8141111, 482110, 13915157, 20851530, 2864743, 5068062, -5181878, -2690260, -14071387, -9591199, -2406256, -18712636, 17148730, 8940511, 1002338, -6440841, -17782238, 1646583, --4936528, 2027225, -19932944, 6896107, 10074920, -11520176, -3046206, 1611687, 878321, 3709778, -10916196, 13776108, -318364, -106300, 2217277, 458488, -8799851, -9673340, -6784975, -12721693, --6669548, 10736344, 4561792, -4083977, -5832029, -3580929, -22767622, 4795868, 4805532, -10455024, -16481937, 579284, 12114492, -4610648, 7608535, -2750927, -11689290, 967978, 9404905, -5613523, -4784057, 6481106, 17276506, 4992363, 4789426, 17337172, 8931384, 6547141, -25089052, 4941897, -2501819, 4624606, -815507, -9842454, 15940234, -12976170, 8240969, 10372883, -17675402, -3414499, -18864570, -18540836, 948114, 691490, -11790222, -17394618, -8098161, -7694434, -23102092, 14468134, -1621350, 15496242, 164283, 1602560, -8499203, -4751845, 7140920, -1321776, 7406134, -8840653, --3367254, 743566, -4452808, -7366943, 8966818, -10653666, 10827076, -4779762, 2986613, -3221762, --8686034, -7803419, 2583960, -3285113, -901406, 5266167, 22425634, 947040, -3805341, -8569533, -2502892, 18037788, -4300873, -3796751, -11784317, -4507032, 699543, -11074036, -4660040, -15490336, -8590471, -18803904, -33558728, -4175782, 117038, 14806363, -17066590, 14175003, 8764955, -8441221, --16217797, -3233037, 1471563, 3633006, -517544, 8612483, -7427072, -3228742, -33387466, -5207111, -32042604, 2313914, -6900402, -5417565, -18656802, 11901891, -7059853, 16885664, 15234249, -2999498, --4242891, 54761, -20777442, 16050293, -12621298, -10135586, -7565048, 6936909, 3641059, 14996952, -3051574, -5976984, -7290707, -7539815, 8381092, -2009508, -3427384, 13848585, 15236933, 6166500, --7923678, 12886513, 19815368, -5572183, -2629594, 17416092, 5507222, 4665408, -8982924, 1460826, -16577500, -20878910, 16825534, -1860258, 3524021, 10729365, 12589623, 1410360, 7027104, -9024263, --7125888, 7306276, 22680112, 7202124, 6682432, 9552544, -9153112, 3782256, 10971494, 6982543, --162672, 9116605, 6345278, -11159936, 12008729, -10837276, 4526359, 10599442, -8032663, 9026411, --10116795, -3265249, 4197257, 1923072, 9811316, -3489124, 8905615, -3700651, 3513820, 3586298, -766115, -4262218, -5886790, 24777130, -14712947, 15366856, -5829881, -15343234, -19984482, -5575405, --2208687, 11639361, -17663590, -2781528, -2295123, 9228274, 17059074, 14445049, 8639327, 1487132, --4765266, -2522757, -2130304, 12385075, 9644349, -2135136, 1185948, -2396592, 7423314, -18651970, -10854993, 6572374, 8372502, 3387119, 1534377, 16760036, -6971269, -13431436, -483184, -4056060, -363998, -18713172, -11290395, -507343, 15475841, -10206990, -4116189, 3400540, -1353989, 1285806, -15109158, 7271380, -3222836, 2370285, 6955163, 6182606, 17629768, -4265440, 7570417, 10668699, -4126927, -1584843, 2093797, -18538152, 7630010, -2026688, -77309, -2669322, -12075301, -12661564, -1988570, -4552666, -21225192, 7831336, -18156438, -9000641, -3853660, -21241298, -16200617, 10368588, --25184078, -27985470, 18312666, 16521665, 6270116, 17803714, 29224032, 8990977, -9637370, 10055592, --3166465, -6984691, 13991930, 1871532, -10388989, 8005819, 10415833, 3055332, 4426501, 1607392, -2612951, 26656714, 644245, 6387690, 3618510, 16845936, 2177012, 26401164, 1133335, -10432476, -21722334, 4981625, -7748121, -2412698, 12144557, -1482301, 1151588, 9214315, -14179298, 16231218, --1882269, -22029424, -4938139, 2897492, -21257940, -1907502, -878321, 10598369, 11190000, 17664126, --10406169, 3148211, 4348118, 4054449, 8988830, -10428717, -10515154, 6832756, 1523103, 13403519, -12535936, 3551938, 29306710, -4367445, -2044404, -18577344, 30152282, 4858145, 21839372, 11580306, --28265716, 3937411, 6034966, 18087718, -6254010, 6262063, 16757352, -36595804, 21087216, 21545704, --9791989, 4890357, 2563022, 5638755, -357556, 17169668, -13241921, -2969970, -14195941, -310311, --8299488, 1060857, 3035468, -20010252, 8282845, 21488258, -15547245, -14310831, -15256798, 28709708, --13313325, -7063611, 1890323, -9822590, -30609158, 5301601, 20777978, -29596082, -14339822, 10399190, -15014132, 4502737, -5471252, 7095286, -11528229, -4676146, -1580548, 15013058, -21276732, -15714748, -10297184, 18876382, 6121402, -22619446, -8666707, 1091995, -2311229, -3429532, 10762651, -2929705, -16852914, -14078366, -4617090, 785442, -18390514, 11651709, -21225728, -12554726, 4748623, -7682086, -17579838, 29032906, 14715095, -16874926, 8024073, -3688840, -7220914, -10928544, -5732171, -18617610, -14576582, 15217606, 6123013, 20490216, 34523484, -801011, -27090506, 5072357, -32219770, 4871567, -13843753, 6205154, 1366873, 18484466, 13538274, -1416266, -3450469, -26756036, -14663555, -184147, --12809740, 34897148, -7028177, -8624294, -15876883, 1323924, 12775917, 8745090, -1058710, 6263136, -9813463, -16335908, 4796405, 29831770, 10179609, -21498458, -15336254, 9270150, -10952703, -2029909, -6777459, -5252208, -17894444, -4743255, 1420024, 28373090, -6971806, 5812702, -8435853, -24064702, -3353833, 28791850, -8693014, -18264886, 4324495, -11422466, 6343667, -6783901, -8088497, 19622632, --6139119, -2882997, 8854075, -17971754, 5168993, 20892868, -10079215, 1394254, -13895830, 37264212, --8364449, 4250407, 10471130, -8785892, -4145180, -9787157, 2757906, -10563472, -12625593, -9796820, --57626648, -19915764, -635118, 18972482, -9319005, -28627568, -10531797, -3830574, 14641007, 4130685, --3471407, -13940390, 15579457, 27371290, -11829414, 20796232, 5508833, -38144680, 14785425, 18532248, --5961952, -15257871, -2550674, 24196772, 25754772, -1677185, -18855444, 1766305, -1818919, -2067490, --15658914, 4381404, 7683160, -25021406, 17921288, 15335718, -17581448, 3732864, -19774566, 7532299, -49536004, -43551504, 45817636, 20968030, 2388002, 28201292, 14150307, -28072444, 17420388, -21023864, --4489852, 23735064, 1393180, 7046431, -11661373, -20500416, 63652488, -14570140, 1177358, 25275346, --11818139, 5160403, 2135136, 15697032, 35910760, 34178812, 32300838, 2245731, -453119, -4911295, -1803349, -8362838, 2631741, 27770722, -6749004, -8085276, 15330886, -3433826, -42374684, 19969988, --30683246, 44292388, 5571647, -37482716, 8969502, 927713, 18232136, 9043591, -8863202, 33017024, -8230231, 2314987, 21927956, -16585016, -23745264, 1514513, 12856448, 44392244, -5884105, 906775, --4333085, 32273994, 3644280, -24111946, -14561013, 5632313, -2580202, 14865956, -24103894, 12648679, -4112431, 8223252, -2035815, -8401493, 5641440, 10892037, 200253, 30407294, -47022912, 5371394, --16547435, -9008157, -6026913, -33055142, -50016504, -50343460, -37643240, 5549635, 198642, -28406376, --248034, -3727495, 3226594, -16785806, -48242684, 49512920, -872415, -4881767, 9669045, -44841608, --3230889, -9246528, 8898635, 16559783, 64865816, 51219632, -5124433, 2696166, -932545, 16392816, -20871394, 16013786, -11276974, 59825672, -55239720, 10600516, -9881109, 3167002, 24712168, -16342351, -6879464, 1925219, -59853592, 2549063, -5879810, 4016331, 7972533, -26069914, -9175124, -43844100, --10630044, -1046898, 3427921, -15837692, -11811697, -18366890, -7170448, 20689932, 5245229, 40549324, -10638097, -11920682, -12875775, 25522306, -25756382, 47630652, -34978212, 12035572, -27981176, 2201708, -28924994, -48771500, 48715128, 10162429, 6715182, -32780802, -5666136, -4599910, 1304596, 18719078, -17943300, 23154706, -38601556, 1367410, -14276471, -11079405, -13888314, -18820010, -13343927, 3722663, -24550034, -21240224, 8297877, -41517300, -13296145, 15294915, 15268609, 6782827, -49335216, -22836342, --16284369, -20500952, -19611894, 8385387, -15037754, 35208532, 10089415, 23722714, -7073275, 25072946, --47991428, 72500656, -55070072, -5950677, -33396592, 6362994, 304943, -20076288, -28696824, 32975686, -21721798, 10344966, -14946486, 14585709, 3959423, 31249108, -25304336, -16236587, 18742700, 32566590, --42087996, 16878684, -2231236, 19880330, -15720117, 6002217, -19194208, 4065187, -35270272, 11612518, -35902168, -843961, -3843996, 46244448, 6906308, -20621212, -45876692, 38826504, -21427054, 17886928, --17697412, 46444164, 18831820, -4252018, 3269007, -25615184, 2012192, 12343736, -14412837, 13835163, --57087096, 22891102, 48354888, 40553080, -23716272, -21109228, -24800214, 27009438, -258235, -6268505, --459025, 66842040, -34389268, -12510703, 22067542, -19027778, -61940408, 27824408, 9234717, -38381976, -18993420, 44681080, 30317100, -5679021, -23199802, -47500728, 24456618, -3321084, 5922760, -17755932, -14388677, -233002, 7596187, 1961190, 2077690, -10298795, 6808597, 24881820, -33091650, 27365920, --5450851, -17597554, 5024038, -12111271, 6823630, -12381317, -10536092, 7802345, -26601416, -3080029, -33673080, -50131396, 13247290, 1977296, -9114457, -15658914, -18889266, -12114492, 35304632, -30092688, --5108327, 11365020, -31097174, 7380902, 15709917, 10833518, 4777078, 4991289, -17983028, 13219909, --45427868, 447750, 37960532, -16422344, -5382668, -8836895, -12023224, -365609, -32552630, 16681116, -11541114, -25975426, 23270670, 6925098, -30872224, 12408697, -7013145, 21823266, 17452600, -27181774, -8264591, 31229244, -30321396, 16936130, -22070764, 17263622, 17223356, -27784680, 15125264, 326954, --15935402, 26377004, 7494718, -24980604, -122997664, -251165936, -108801720, -172081088, -228745120, 65336116, -13429289, 54343148, 302281952, 249196144, 159163440, 257382896, 170131168, 6822019, 30957050, 18137110, --160544272, -109034728, -79650704, -181531632, -184757680, -62083752, -62337692, -120524296, -46225124, -37615860, --141715664, -124048320, -49999324, -74748000, -134336384, -43758736, -34285652, -108287400, -24822226, 51373176, --42058468, -36701032, 83191904, 45777908, -52475372, 72443752, 128463008, 3049427, 67160944, 160996320, -73006928, 32131188, 175762416, 125666448, 91253560, 216750896, 297444192, 233663408, 273540576, 357499648, -231496048, 149834224, 199367008, 127576632, -40175124, -10940355, -91579976, -223825248, -315535136, -336593888, --450576416, -509102880, -538365568, -513171296, -487514752, -472316480, -378379104, -252343280, -194695696, 20937428, -161597072, 105515000, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +49392, 8157217, 379568, -2594160, -643708, 55835, 751619, 3802657, -1575716, 1945083, +-3844533, 1293859, -403727, 2646774, -1793149, 3823595, 978179, -1950452, 274878, -3888556, +4334696, -404264, -886911, -2147, 639413, 909996, 661425, 3200288, -5628555, 420907, +3550327, 702764, -279710, -625455, -325344, -130460, -465467, -5762236, -478352, 1702955, +-2002529, 1939715, -4516158, 22549, 2531883, -2654827, 5084705, 4920959, 3670050, 3128347, +4027069, 497679, 2022393, -1910187, -810138, -3316252, -1329829, -183610, -2893197, -971736, +-4112968, 578747, -3486977, -4562329, 864899, -3337727, 2522757, 367757, -3713536, 2554969, +1621887, -4126390, 1232656, 89121, 4827543, 1418950, -6394133, 849867, 2075543, 2015950, +10150618, 2787971, 2167885, -2957085, 417149, -5089536, 1232656, 4756677, -2363306, 270583, +-968515, -2478196, -4041564, 3189550, -6779069, -3382287, -3391414, 3742527, 4063576, 2185602, +988379, 2985002, 2436857, 4894652, -1661079, 1756105, 3025268, 704375, 1007707, -3456375, +-1503239, -1401770, -1312113, 3344169, -6243272, 1126355, -2155000, 6641630, 169114, -1093069, +-1633698, -2610803, -890669, -2724083, -8244727, -2509335, -1609539, -1224603, -1846299, 969052, +-1544041, -266288, -532039, 3020436, 1289027, -234076, 1838246, -1467268, 3529926, -2160369, +-3862786, 3886946, 3860102, -1489280, -3736622, 568009, 1951526, 1767916, 1647120, -1461900, +-169651, 1793686, 1486059, 9223979, -1644436, -805306, 1050120, 2597918, -6679748, 4274566, +-7941932, -286689, -3811784, -493921, -2499134, -527207, -561567, 4103841, -3330747, 4439923, +-4483946, -4881231, 2163590, 6747394, -7794829, -2094870, -3740917, 144418, -1919314, 2214593, +2873333, 1518271, 2924873, -4467840, 220654, 6504728, 2569464, 918049, -4597763, -6538014, +-3946538, 1127966, -3348464, -1806571, 1347009, 4430259, -3840775, -3709778, 1598802, -2675765, +4998805, 1789391, -467078, 3629247, 3358665, 137439, 5607080, 2903398, 1779727, 1632088, +3683471, 5912560, -3755412, 1273995, 1604707, -3855270, 379568, 3482682, -1263794, 8516383, +-2558727, -1968169, -1734630, 3319473, 4202089, -5095979, -2239289, 1787243, -11702175, -1845762, +-2565706, -2036888, -998580, -1379221, 6308770, 7538742, -1656784, 6162741, 2377801, -3312494, +1637993, -5050882, 947040, 1142998, -6829535, -956167, 1108102, 1262184, 4791036, -854699, +4163971, -2707440, -5240397, -5507222, -1564442, -2758980, -4197794, 4427038, -1692754, -790274, +-749472, 965831, 2390149, -6692633, 32212, 988379, -3195993, 8080444, 623307, -1941325, +-1755031, 8616778, -634045, 1121523, 5046050, 176094, 3062849, 1226213, 237297, 4744865, +-89121, -3313031, 4173635, 2268817, 2637647, 3826816, 1161789, -3171297, 2092723, 3096135, +2907693, 4650913, -166967, -4518843, -3748433, 5390721, 7450695, -7297687, 1056025, -2189360, +-1713692, 1167694, 2313377, 2127620, -8694088, 9193914, 8508867, 6413997, -4538707, 5010080, +9051107, -2313914, 7059316, 2653216, 1015223, -1127429, 7781407, 3687230, -1895691, -5637682, +3195993, -2343442, -3075197, 3163780, 3677029, 1635309, -5659693, 897648, 4927938, -2451353, +1610613, -10982768, 1487132, -886911, 5188858, 1291711, -2384244, -3310883, 6655589, -5826660, +351114, -4704600, 421444, -1439351, 3643743, -784905, -1379221, -5762773, -1540283, -1012539, +6992744, 361851, -6730751, -236760, -556198, 2244657, 3214783, -2908767, -213675, -3713536, +3723737, -865436, 4529043, -2583960, 6847789, 3551938, -8210904, 8357470, -1570884, -5769215, +567473, 7636452, 1072131, 1177895, -6742025, -398358, -3095061, -3324842, -4173098, 331249, +9855339, -3541738, -7328288, -486942, -10934987, -123480, -9413495, -3345243, 6277632, -6746320, +-7437273, 2079838, 489626, 542240, -1835562, -2513630, -5420786, 3470334, -10493142, -3306588, +925029, 6308770, 249645, 6400575, 2187749, 14206141, 5355288, -276489, 493384, 6695854, +-1771137, -2175401, -1427003, 994822, -4665408, -2384781, -7768522, -679142, -3656628, -2249489, +9215926, -6979, 5698348, -2518462, 2216740, -768799, 3317325, -1358283, 3067681, -3422015, +-4191888, -856309, 917512, -4258997, -4250944, 105227, 1836099, 4085051, -879395, -2341294, +-1157494, 3797825, 6760816, 5906, -5119601, -7308961, -250719, 1374390, 328565, 8761733, +-6325950, -1083406, 3664681, -2563022, -5597416, 5082557, 1992865, 1185411, 630286, 8918500, +-6827388, -1385127, 581968, -525060, -237297, -5625334, -4316442, -603443, 3758633, 1363652, +1524713, 1578401, 3955128, -801011, 3623342, 2917894, -9231495, -3553012, -10835666, 2829310, +-3786551, 5481989, -3475702, -4792110, -3467649, 2856153, -7187628, -6012418, 8489540, -4584878, +9205726, -2142115, 2829310, -3196530, -6059662, 6798933, -5116380, -5832566, -475668, -3157338, +-6759205, -5267778, -8541616, 395674, 5730560, 3253438, -3204046, 9686762, 3722663, -3490198, +-4268661, -6915971, 540629, -2547453, -4612795, -2386391, -1767379, -3353296, 2181844, 7806103, +-68183, 612033, -4759361, 2574833, 3163244, -4406637, -2937758, 2006287, 10220412, 3933653, +-1196148, -977105, -253940, -9035537, 13316009, -1905892, 501974, -1587527, 8857833, 8404714, +3261491, -12656732, -1649804, -15483894, 10008884, 4495757, 814970, 17002164, 8364986, -958851, +-6835441, 7292318, -2597918, 2173254, 2883534, 1554778, 5987722, -4329327, 9831717, 3993246, +1490354, -2330020, -4108673, 6738267, 5890011, -556735, 4046933, -7414724, 2091649, -10059350, +4908611, 1041530, 5990943, -8188355, 2426120, -2380486, 2549600, 10255845, 8971113, 821413, +3063922, -5682242, 8686571, 643708, 17745732, 18458158, -1717450, -4413079, -4230543, -3514357, +-9769977, -2543158, -12963822, 1200980, -432181, -399432, -2069101, 5147519, 8804146, 12989592, +12496744, 9369471, -14175540, -10353556, 251792, 987306, 16317654, -10821707, 8970039, -434865, +-3186866, -4583804, 9241696, 2007897, -6717329, -3726421, 17328582, 16976932, 19101868, -1864016, +-700080, -3244848, 3313031, 9283035, 10827613, 3078418, -4458713, -9192304, -18464602, 5470178, +-10849624, -2477123, -946503, -2455648, 1447404, -639413, -3211562, -506269, -10572599, -4383551, +882079, -2117419, -11812771, -5220533, 1296543, 8617852, -2197413, 92879, -9307194, -3413425, +428423, 6170795, -3567507, 3704946, -10386305, -3210488, 2862596, 3833258, -2556043, 14155138, +-2557116, -2106682, -7079180, -2777233, 6253473, 1649268, -184684, 7166153, 10915123, 11764452, +-1612760, -6504191, -6336688, -366683, 2035278, 2333778, -4258460, 3337190, 5858336, 3684008, +4992900, 11360725, 9027484, 4452808, 303869, 1431835, -10864120, -4221953, -18210662, 21363704, +-1195075, 2646237, 11422466, -367220, -4786204, 47782, -21985400, -13610751, -6700686, 2835215, +-4796942, 1858110, -10593000, 6339909, -4081293, -687732, 12622372, -13479218, -9159018, 11755862, +-4466766, -18720688, 687732, -11783243, 1706713, -1551557, 6178311, 2289218, 2809446, 738734, +-2803540, 7399155, -1520418, 9680856, 5692443, -4352413, -6843494, -6506876, 2169495, -3563749, +2177012, 1278827, 5421860, 1035624, -12109660, -89121, 3190624, -4741107, -223338, -8703214, +-2477659, -158377, -231928, 17205638, -3932580, 11919608, 14592688, -5232344, 7407745, -3600793, +-1323387, -9713605, 4519916, 11834246, 8171176, 638876, 2539400, 6533182, -1692754, 4877472, +-4059281, -6026376, -8141111, 482110, 13915157, 20851530, 2864743, 5068062, -5181878, -2690260, +14071387, -9591199, -2406256, -18712636, 17148730, 8940511, 1002338, -6440841, -17782238, 1646583, +-4936528, 2027225, -19932944, 6896107, 10074920, -11520176, -3046206, 1611687, 878321, 3709778, +10916196, 13776108, -318364, -106300, 2217277, 458488, -8799851, -9673340, -6784975, -12721693, +-6669548, 10736344, 4561792, -4083977, -5832029, -3580929, -22767622, 4795868, 4805532, -10455024, +16481937, 579284, 12114492, -4610648, 7608535, -2750927, -11689290, 967978, 9404905, -5613523, +4784057, 6481106, 17276506, 4992363, 4789426, 17337172, 8931384, 6547141, -25089052, 4941897, +2501819, 4624606, -815507, -9842454, 15940234, -12976170, 8240969, 10372883, -17675402, -3414499, +18864570, -18540836, 948114, 691490, -11790222, -17394618, -8098161, -7694434, -23102092, 14468134, +1621350, 15496242, 164283, 1602560, -8499203, -4751845, 7140920, -1321776, 7406134, -8840653, +-3367254, 743566, -4452808, -7366943, 8966818, -10653666, 10827076, -4779762, 2986613, -3221762, +-8686034, -7803419, 2583960, -3285113, -901406, 5266167, 22425634, 947040, -3805341, -8569533, +2502892, 18037788, -4300873, -3796751, -11784317, -4507032, 699543, -11074036, -4660040, -15490336, +8590471, -18803904, -33558728, -4175782, 117038, 14806363, -17066590, 14175003, 8764955, -8441221, +-16217797, -3233037, 1471563, 3633006, -517544, 8612483, -7427072, -3228742, -33387466, -5207111, +32042604, 2313914, -6900402, -5417565, -18656802, 11901891, -7059853, 16885664, 15234249, -2999498, +-4242891, 54761, -20777442, 16050293, -12621298, -10135586, -7565048, 6936909, 3641059, 14996952, +3051574, -5976984, -7290707, -7539815, 8381092, -2009508, -3427384, 13848585, 15236933, 6166500, +-7923678, 12886513, 19815368, -5572183, -2629594, 17416092, 5507222, 4665408, -8982924, 1460826, +16577500, -20878910, 16825534, -1860258, 3524021, 10729365, 12589623, 1410360, 7027104, -9024263, +-7125888, 7306276, 22680112, 7202124, 6682432, 9552544, -9153112, 3782256, 10971494, 6982543, +-162672, 9116605, 6345278, -11159936, 12008729, -10837276, 4526359, 10599442, -8032663, 9026411, +-10116795, -3265249, 4197257, 1923072, 9811316, -3489124, 8905615, -3700651, 3513820, 3586298, +766115, -4262218, -5886790, 24777130, -14712947, 15366856, -5829881, -15343234, -19984482, -5575405, +-2208687, 11639361, -17663590, -2781528, -2295123, 9228274, 17059074, 14445049, 8639327, 1487132, +-4765266, -2522757, -2130304, 12385075, 9644349, -2135136, 1185948, -2396592, 7423314, -18651970, +10854993, 6572374, 8372502, 3387119, 1534377, 16760036, -6971269, -13431436, -483184, -4056060, +363998, -18713172, -11290395, -507343, 15475841, -10206990, -4116189, 3400540, -1353989, 1285806, +15109158, 7271380, -3222836, 2370285, 6955163, 6182606, 17629768, -4265440, 7570417, 10668699, +4126927, -1584843, 2093797, -18538152, 7630010, -2026688, -77309, -2669322, -12075301, -12661564, +1988570, -4552666, -21225192, 7831336, -18156438, -9000641, -3853660, -21241298, -16200617, 10368588, +-25184078, -27985470, 18312666, 16521665, 6270116, 17803714, 29224032, 8990977, -9637370, 10055592, +-3166465, -6984691, 13991930, 1871532, -10388989, 8005819, 10415833, 3055332, 4426501, 1607392, +2612951, 26656714, 644245, 6387690, 3618510, 16845936, 2177012, 26401164, 1133335, -10432476, +21722334, 4981625, -7748121, -2412698, 12144557, -1482301, 1151588, 9214315, -14179298, 16231218, +-1882269, -22029424, -4938139, 2897492, -21257940, -1907502, -878321, 10598369, 11190000, 17664126, +-10406169, 3148211, 4348118, 4054449, 8988830, -10428717, -10515154, 6832756, 1523103, 13403519, +12535936, 3551938, 29306710, -4367445, -2044404, -18577344, 30152282, 4858145, 21839372, 11580306, +-28265716, 3937411, 6034966, 18087718, -6254010, 6262063, 16757352, -36595804, 21087216, 21545704, +-9791989, 4890357, 2563022, 5638755, -357556, 17169668, -13241921, -2969970, -14195941, -310311, +-8299488, 1060857, 3035468, -20010252, 8282845, 21488258, -15547245, -14310831, -15256798, 28709708, +-13313325, -7063611, 1890323, -9822590, -30609158, 5301601, 20777978, -29596082, -14339822, 10399190, +15014132, 4502737, -5471252, 7095286, -11528229, -4676146, -1580548, 15013058, -21276732, -15714748, +10297184, 18876382, 6121402, -22619446, -8666707, 1091995, -2311229, -3429532, 10762651, -2929705, +16852914, -14078366, -4617090, 785442, -18390514, 11651709, -21225728, -12554726, 4748623, -7682086, +17579838, 29032906, 14715095, -16874926, 8024073, -3688840, -7220914, -10928544, -5732171, -18617610, +14576582, 15217606, 6123013, 20490216, 34523484, -801011, -27090506, 5072357, -32219770, 4871567, +13843753, 6205154, 1366873, 18484466, 13538274, -1416266, -3450469, -26756036, -14663555, -184147, +-12809740, 34897148, -7028177, -8624294, -15876883, 1323924, 12775917, 8745090, -1058710, 6263136, +9813463, -16335908, 4796405, 29831770, 10179609, -21498458, -15336254, 9270150, -10952703, -2029909, +6777459, -5252208, -17894444, -4743255, 1420024, 28373090, -6971806, 5812702, -8435853, -24064702, +3353833, 28791850, -8693014, -18264886, 4324495, -11422466, 6343667, -6783901, -8088497, 19622632, +-6139119, -2882997, 8854075, -17971754, 5168993, 20892868, -10079215, 1394254, -13895830, 37264212, +-8364449, 4250407, 10471130, -8785892, -4145180, -9787157, 2757906, -10563472, -12625593, -9796820, +-57626648, -19915764, -635118, 18972482, -9319005, -28627568, -10531797, -3830574, 14641007, 4130685, +-3471407, -13940390, 15579457, 27371290, -11829414, 20796232, 5508833, -38144680, 14785425, 18532248, +-5961952, -15257871, -2550674, 24196772, 25754772, -1677185, -18855444, 1766305, -1818919, -2067490, +-15658914, 4381404, 7683160, -25021406, 17921288, 15335718, -17581448, 3732864, -19774566, 7532299, +49536004, -43551504, 45817636, 20968030, 2388002, 28201292, 14150307, -28072444, 17420388, -21023864, +-4489852, 23735064, 1393180, 7046431, -11661373, -20500416, 63652488, -14570140, 1177358, 25275346, +-11818139, 5160403, 2135136, 15697032, 35910760, 34178812, 32300838, 2245731, -453119, -4911295, +1803349, -8362838, 2631741, 27770722, -6749004, -8085276, 15330886, -3433826, -42374684, 19969988, +-30683246, 44292388, 5571647, -37482716, 8969502, 927713, 18232136, 9043591, -8863202, 33017024, +8230231, 2314987, 21927956, -16585016, -23745264, 1514513, 12856448, 44392244, -5884105, 906775, +-4333085, 32273994, 3644280, -24111946, -14561013, 5632313, -2580202, 14865956, -24103894, 12648679, +4112431, 8223252, -2035815, -8401493, 5641440, 10892037, 200253, 30407294, -47022912, 5371394, +-16547435, -9008157, -6026913, -33055142, -50016504, -50343460, -37643240, 5549635, 198642, -28406376, +-248034, -3727495, 3226594, -16785806, -48242684, 49512920, -872415, -4881767, 9669045, -44841608, +-3230889, -9246528, 8898635, 16559783, 64865816, 51219632, -5124433, 2696166, -932545, 16392816, +20871394, 16013786, -11276974, 59825672, -55239720, 10600516, -9881109, 3167002, 24712168, -16342351, +6879464, 1925219, -59853592, 2549063, -5879810, 4016331, 7972533, -26069914, -9175124, -43844100, +-10630044, -1046898, 3427921, -15837692, -11811697, -18366890, -7170448, 20689932, 5245229, 40549324, +10638097, -11920682, -12875775, 25522306, -25756382, 47630652, -34978212, 12035572, -27981176, 2201708, +28924994, -48771500, 48715128, 10162429, 6715182, -32780802, -5666136, -4599910, 1304596, 18719078, +17943300, 23154706, -38601556, 1367410, -14276471, -11079405, -13888314, -18820010, -13343927, 3722663, +24550034, -21240224, 8297877, -41517300, -13296145, 15294915, 15268609, 6782827, -49335216, -22836342, +-16284369, -20500952, -19611894, 8385387, -15037754, 35208532, 10089415, 23722714, -7073275, 25072946, +-47991428, 72500656, -55070072, -5950677, -33396592, 6362994, 304943, -20076288, -28696824, 32975686, +21721798, 10344966, -14946486, 14585709, 3959423, 31249108, -25304336, -16236587, 18742700, 32566590, +-42087996, 16878684, -2231236, 19880330, -15720117, 6002217, -19194208, 4065187, -35270272, 11612518, +35902168, -843961, -3843996, 46244448, 6906308, -20621212, -45876692, 38826504, -21427054, 17886928, +-17697412, 46444164, 18831820, -4252018, 3269007, -25615184, 2012192, 12343736, -14412837, 13835163, +-57087096, 22891102, 48354888, 40553080, -23716272, -21109228, -24800214, 27009438, -258235, -6268505, +-459025, 66842040, -34389268, -12510703, 22067542, -19027778, -61940408, 27824408, 9234717, -38381976, +18993420, 44681080, 30317100, -5679021, -23199802, -47500728, 24456618, -3321084, 5922760, -17755932, +14388677, -233002, 7596187, 1961190, 2077690, -10298795, 6808597, 24881820, -33091650, 27365920, +-5450851, -17597554, 5024038, -12111271, 6823630, -12381317, -10536092, 7802345, -26601416, -3080029, +33673080, -50131396, 13247290, 1977296, -9114457, -15658914, -18889266, -12114492, 35304632, -30092688, +-5108327, 11365020, -31097174, 7380902, 15709917, 10833518, 4777078, 4991289, -17983028, 13219909, +-45427868, 447750, 37960532, -16422344, -5382668, -8836895, -12023224, -365609, -32552630, 16681116, +11541114, -25975426, 23270670, 6925098, -30872224, 12408697, -7013145, 21823266, 17452600, -27181774, +8264591, 31229244, -30321396, 16936130, -22070764, 17263622, 17223356, -27784680, 15125264, 326954, +-15935402, 26377004, 7494718, -24980604, -122997664, -251165936, -108801720, -172081088, -228745120, 65336116, +13429289, 54343148, 302281952, 249196144, 159163440, 257382896, 170131168, 6822019, 30957050, 18137110, +-160544272, -109034728, -79650704, -181531632, -184757680, -62083752, -62337692, -120524296, -46225124, -37615860, +-141715664, -124048320, -49999324, -74748000, -134336384, -43758736, -34285652, -108287400, -24822226, 51373176, +-42058468, -36701032, 83191904, 45777908, -52475372, 72443752, 128463008, 3049427, 67160944, 160996320, +73006928, 32131188, 175762416, 125666448, 91253560, 216750896, 297444192, 233663408, 273540576, 357499648, +231496048, 149834224, 199367008, 127576632, -40175124, -10940355, -91579976, -223825248, -315535136, -336593888, +-450576416, -509102880, -538365568, -513171296, -487514752, -472316480, -378379104, -252343280, -194695696, 20937428, +161597072, 105515000, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, }, { { 11677479, --721555, -141734, 1270774, -1389959, -1471563, -1053341, 2721399, -7006703, 2644089, -1918777, -4832, 372052, -279173, -894964, 426276, 1571958, 2938295, -1367947, 3275450, -2646237, --2936147, -2094333, 1474784, -2743947, -1764158, 2119030, 412854, -886374, 2610266, -599148, -3758, 1705639, 921807, -1284732, -1789928, -1931662, -2195802, -4995584, 1326071, -1185411, --395137, 7590818, 661962, -1540283, 4350802, -1591822, 75162, -1959579, -3619584, 4491999, --1444183, -741419, 51003, -3106335, 995896, -136365, 2281165, -457414, 2287070, 889595, --629213, 2748779, -356482, 1005559, 1341104, -80531, -6255083, -71941, -914291, -2363306, -1582696, -525597, -1345935, -744640, -3873524, 2535641, 3999152, -1262720, 3567507, -455267, -3760244, 1938641, -685584, -1325534, 3809636, 412317, 854699, -4099546, -554051, -205622, --67646, 5834176, 2925410, -117575, -4184372, -3042448, -1729798, 612033, 24696, 1326608, -2762738, 883690, 1097901, -4269198, -543850, -4156992, 295816, -2269890, 2895882, 2830920, --977105, -2222109, 3022583, 674847, -959925, -3861176, -404264, -2464774, 828929, 2428804, --3841312, -1907502, -537408, -1531156, 10253161, 2425046, 5971615, 427349, 2041183, -53687, --2804614, -2738042, -3335579, 1593433, -2733747, 1994476, 177167, 2426120, 2668785, 6116571, -1977296, -648003, -224412, -3862249, 6098317, 5329518, 1020592, 1445793, 1575716, 1413044, -13799730, -3500935, -3128884, -1321776, -2978023, 462246, -6865505, 344134, 1107565, 168041, -4299263, 352187, -1162862, -4155918, 2323577, -5788006, -5097053, 1602560, -2615635, -1278290, --1093606, 798327, 3535295, 5060009, 122407, -936303, 5900212, 2101313, -642635, 105227, --2816425, -36507, 6478958, -105764, -3460670, -2651606, -1051193, 2203318, -3467112, -3957812, --4290673, -3316252, 2741263, -3118146, 791885, -3764539, 921271, 4410395, -102005, 3124052, --1762010, -2567854, -1676648, 2169495, -583042, 3387119, 4519916, 718333, -2006824, -2582349, --655519, -367220, -331249, 190589, -5000953, -412854, -2705293, -2163053, 1423245, 556198, -580357, 1759863, -6134287, -2735357, 1100049, -738734, 2367601, -10449655, -5397700, -2619930, --7298760, -2833068, -7028714, 1458678, -1064615, -4540854, -5193153, -1162326, -4335770, -552977, -2692408, -697932, -6343667, -2623151, -419833, -2736968, -2402497, 1241246, 4990752, 6607807, --1653026, -2326262, 3442416, 4065724, -1927904, -1481227, -1424319, -3614215, 438624, 1039382, --3401077, -2572686, -1205275, 2298881, 5479842, -23622, -2574833, -410169, -3586835, -1528472, --5382668, -2676838, -2701535, -8034810, -1376000, -3861176, -2975339, -8772471, 4629438, -4033511, --3815542, 1112933, -1106491, -974421, 507343, -7327214, -2405719, -2849711, -1154273, -4364224, --1157494, -2223183, 1232119, 2106682, -2887292, -1498407, -3953518, 928250, -1123671, -872415, --614717, -5223217, -748398, -4232154, -18380312, -1363115, -8993125, 8270497, -4613332, 14806363, --9281961, 9350144, -8198019, -449898, 45097, -6398428, 5191005, 213675, -2204392, 1526324, --1893007, -837519, -6052146, -63888, -4499515, 3731253, 1557463, 4559645, -2430952, 6804302, -6436009, -6036040, 1971927, -5153424, 5716602, -30602, -3464428, 222801, -198642, -304406, -4321811, 459562, -5538361, 2298344, 4632659, -434865, 5419175, -2504503, 4510790, -6310381, --2677375, 3810173, -3063386, 791348, 5883032, -5163088, 8485782, 2890513, -7359964, 1626719, --7044820, 2416993, 4814659, 2519535, 4687957, 5492190, 2622615, -1129040, 206695, -57445, -2581275, 3725884, -682363, 7423851, 2382096, 4852776, 3884798, 897648, 1433982, 11991549, --150861, -3548180, -1331440, -4781909, -5653788, 8689793, -1943473, -1530082, 7975218, -868657, --1788317, 3382824, 6164352, 1576790, 2961380, -406411, -7151658, -2088965, 5028333, -8174397, --8041790, -3197066, 1527935, -5845451, -3547106, -151398, -969589, 5223217, -2301029, -1475321, -5608154, 7776575, -7156490, 1543504, -1838783, 2652142, 630823, -3388729, -843424, 3051574, -4969277, -1683090, -7408819, -1942399, -797790, -2231236, -3771518, 199716, -610959, 986232, --1144609, 664109, 6630893, -5361730, 512712, -4179003, -3221762, -5619428, -1703491, -3418794, --7362111, -663036, 392453, -3240553, -647466, -3422015, 2720862, 3070365, -607738, 582505, --2632278, -1194538, 8783208, -1584306, -3485903, -11769284, 16247861, 18202608, 3806415, -6064494, -4478577, 7417946, 7466264, 4369056, 5749888, 2774549, 9141301, -491774, -620623, -3162707, -5910949, -2821257, -7205882, -10180146, 1675037, -4692252, -3892314, 4099010, -639950, -2448131, -9360344, -284005, 11518565, 464930, -3877282, -2642479, 4363687, 2906619, -1679332, -8412230, -13105019, 7607998, 577673, 7145752, 4589710, 4747550, -3619584, 5311801, 3078418, 1294933, --1000727, -1974611, -5032628, -7579007, 2748242, 4049617, -5578089, 2692945, 5816460, 8099772, -2624225, 7322383, 3842922, 6250251, -8367133, 2815351, 1358820, 1933272, 758062, -494995, -4306779, 3516505, 3848828, 4893579, -1125281, 2339147, 1828582, 6895033, 8905615, -4520453, --4910758, 14810658, 4880157, 6683506, -5022965, 2361695, -12853763, 953483, -9189083, 7437810, -5178120, -3781182, 6407555, 3660923, -6082748, -1392643, 9680856, -108448, 6794639, -1570347, -1685238, 7602629, -8826158, -545461, 1937030, 2871723, 1057099, 3133716, 842887, 9145059, --3706020, -2460480, -2236604, 6929393, 1366873, -3089692, 4654134, 11585674, -7483981, 1510755, -2100239, -614717, 5210332, -2248416, 9368397, 3015604, 2837363, -7135552, -73014, -1855426, -4734128, 3105261, 5087389, -4900558, -2503429, 4217658, -7861938, -4789963, 2747705, 9305584, -6451041, 8239358, -8057359, -2775086, -8148090, -2277943, 3755949, -666794, -7488276, 1287417, --4063576, 179315, -8039642, -10948409, -3060164, -7453379, 2560338, -17775260, -16087337, -11763379, -2750390, 2772938, 12191265, -6334003, 11551315, -5650567, -20725902, -2470143, -2492155, -8463233, --13621489, -5441724, -898185, -8715562, -678068, -13038447, 297963, -13712220, 6846715, -3990562, -4830765, -3273839, -819802, -4770635, -5276368, 7293928, 996432, -3081102, 8536248, 271120, -899796, 2373506, 7822746, 6602439, 5061082, -625455, -10469520, -1809255, 4228396, 665720, -5551245, -3702262, 2187749, -15362561, 4094178, 7990250, -11538967, 5692443, 1778117, 9587978, -7471633, -837519, -3213709, -1079647, 6604049, 2652679, -9735080, -8396124, -13273596, -7055558, --9022116, -2785823, -11038603, -3099893, -3903589, 10066330, -5349382, 4574140, -3028489, -2380486, --3670050, -8304856, -4064650, -21606370, 18331994, -3872450, 11227045, 6995428, 539555, -13909252, -12724377, 2662343, -107374, 8515310, 6192269, -5085778, 796716, 13795972, 5098663, -4609037, -9881646, -3789235, -3100967, -1560147, 3741990, 1240172, -804233, 2421825, 4692252, 4675609, -4371203, -8098698, 6583648, -6493991, 11363410, -5276368, 11304891, 4704063, 1784559, -8964134, --9707163, -2097018, -2726767, 13644037, 4217121, 11228655, 4855461, -7262253, 1079647, -471910, -4937065, 1798518, 4431870, 511638, -5148055, -1790465, 6942815, 17211544, 11911555, 3021510, -4575751, 703838, -1435593, 9855339, 7420093, -868120, 10579041, 15932181, 20146080, 2602213, --10293426, -11055246, 5523865, 4908611, 386547, 6056441, 1198833, -1299228, 1158567, 14964740, -10210211, -15610596, 12621298, 5057861, -10782515, 24293946, 3372086, -12752832, 2573222, 6618545, -310848, 4732517, 17248052, -17030620, 10617159, -6990596, 9358197, -3885335, 1673964, -15758772, -2226941, -1843078, 5826660, -6121402, 408559, 1064615, -322123, -9283572, 8280160, 806917, --1484985, 4028679, -2311766, 3972308, -2764885, 12284680, 9162776, 12161200, 11556683, -2073396, -3586298, 5186710, -170725, -6511171, 7879655, -10336376, 2369748, 10035191, -6867653, 5255966, --12218108, 3490198, -1923072, -2845953, -1973001, 699543, 2444910, 3174518, 10810433, -8067559, --1596117, 7623567, 15705622, -15425375, 2445447, -4127464, 3618510, -3301756, 23135378, -15969225, -3539590, -9400073, -6910603, 1046898, 71404, -244276, -24182814, 10991358, -15600395, -3695819, -20865488, -6901476, -927713, 10958609, 2185065, 6577743, -16449188, 14812805, 486405, 660888, --4560719, -10072235, -1838246, -1963874, -10795400, -6677601, 10865194, -4099010, 1655173, -6068789, --25586730, 8005819, 593779, -8211441, 4232154, 9229348, -1468879, 600759, -2527588, 1969779, -5997385, 1623498, 9977209, 6767258, 1053878, 8769249, -8055748, -7796977, -11066520, 3477850, -5389647, 1291175, -17220672, 4232691, -14831059, 20038170, -5567352, 6826851, 16754667, -7349226, -10346576, 2320356, 11296838, 4422206, -6681896, -18398566, -13780403, -10484552, -2338073, -10977936, --3133716, -9643812, -7103339, 17638894, 2675765, -8105677, -8231305, 3249143, 5087389, -1949378, -651224, -33215666, 10614475, 1520955, 6424198, -21045340, -25613038, 14247480, -12948790, -15002858, --4789963, 8630737, 18702436, -13596256, 325881, 8420283, -3492345, -4870493, 4294431, 2391223, -13903346, 4010426, -14741938, -1429150, -7818451, -1399086, -9036611, -11938398, 1005559, 10050223, --1494649, 3927748, -9817221, 1669669, 10200547, 7401303, 590558, -206695, 6114423, 5356361, -3422552, 8826158, -13297756, 12642236, 9237401, 2188286, -11124502, -490700, 7311645, -9540733, -8600672, -7896298, 9825275, -4231080, 13039521, -23153632, 22239340, 3850438, 20906828, -221191, --5414343, -3221762, 6986838, -1285269, -19009526, -1196685, -2222109, -20825760, 4946192, 11198053, --18909668, 12552579, -16873316, 2410014, 4754529, 594316, -21175262, -12306692, -11578695, -857383, --1846299, -11474005, -11162083, 17796734, 3873524, 11831561, 11479911, 3473555, -8238821, 2241436, -29795262, -19907710, 5221607, -3222299, -10712185, 994285, 4298189, 5085242, 200790, 401043, --5464809, -8181376, -12905840, -6372658, 10328859, -8075613, -12979928, 7956964, -4452271, 3235184, --1452773, 6237903, -5364414, 12814035, -4231080, 1633161, -6979, 1592896, 11809013, 4185446, --5109401, 6401649, -4671314, 9692667, -5475010, 4099546, -13345000, -9692131, -7082938, 2551211, --6624450, -11643119, 5081483, 8898098, 2638721, -6162741, 4071092, 6273874, 7002944, 18983218, -26031260, 35505420, -3754875, 5631239, 8344585, 4937065, 4456566, 5559299, -7727183, 13857175, --2640331, 18059800, 21776022, 16192564, 5461051, 8754754, 1198833, 30881352, 5191542, -7800198, -448287, 36171140, 29051696, -11610907, -5035313, -13971529, 9128416, 4948876, 17956722, -2225867, --6946573, -2546379, -10703595, 3416647, 950262, 17279728, -5638755, 7039452, -21573084, 13105019, --1291175, 9537512, 301185, 8765491, 1700807, -11491722, -6123550, -9677098, -7852274, 10181220, -22138408, 10670309, -2343979, -5588290, -75699, -612033, 5633924, 8647917, -13828184, 1030255, --4767414, -3324842, -15112379, -10320270, -24575266, 1900523, -1271310, 10364293, -7461432, 17322676, --12124156, -3649112, 31336618, 32937568, -21895206, 6593849, 17752174, -8666707, -5478768, 11260331, --4049081, -11166915, 34404300, -6583648, -54148800, 20017768, -1700270, -25064892, 19788524, 25018184, --9495099, 18440978, 18037788, -6605660, -1843078, 15366319, -16749299, 6757594, -14143864, -7499013, -1608465, 5268851, 10915123, 4754529, -10384157, -2768107, 7881802, -11034845, 9205726, -6036040, --13627931, 10466298, 5161477, 4650913, -3987877, -4344360, -5302674, -1768990, 8960376, -21219822, -9243306, -1605781, 16027207, -11764989, -649614, -14354318, 5055177, -22613002, 1723356, -311922, --9113921, -7724499, 2838974, -15691663, -25418690, 13736916, -1929514, 3183645, -15205795, 7647190, --2852932, 8297877, 9942312, 3742527, -10768020, 7140383, -5331128, -3729105, -19523310, 1286880, --13934485, -16501801, -22087944, -10514617, 3367791, 4510253, -22651120, -12751758, 1246077, -9705552, --30201674, -25706454, -24466282, -6810208, -14353244, 11384885, 19112068, 3300682, -17313550, -23021562, --23261542, -4231617, 587337, 10867878, -14171781, 28211492, 31251792, -5813238, 21561272, -4367982, --6393059, -6500970, 21082384, -15756088, -2371359, -6831683, 32607392, 2451890, 12956843, 5340255, --1269163, 16726750, 10337986, 13901199, 5701032, -761820, -3693135, 13315472, -249108, -10718628, -16647830, 748935, 14837501, -13398150, 12008729, 4712116, -12869870, -10317048, 28928752, 18587008, -333397, 10720238, 10114648, -16130287, -9175124, 6675453, 6437619, 12971875, 3664144, 3585761, -6902550, 15566572, 8297877, 4660577, -12264279, 41225780, 29470992, 3966402, -15708843, 9857487, --3603478, 5832029, -1584843, 9426379, -3300146, 2126546, 24976308, -14679124, -4655745, -19996294, -8651675, -4908074, -718333, 19710678, 8929237, 3234110, 4566087, -6803228, -12749610, 12780212, --8927626, -20243254, 55493124, -60555280, -6344204, -31446140, 40416180, 11589969, 7716983, -14502494, -4413079, -11639361, 36219996, -5287105, -1626182, 4664872, -1126892, -12852153, 5928666, 9154723, -11344619, -22890028, -12024298, -11224897, 5477694, -6103149, -5927055, 419833, 289910, 16966732, --7632694, 2031520, 12367895, -201327, -15378130, 3303904, 12950400, -155156, -24543054, 20025286, -2629057, 1749662, 327491, -9092446, 8572755, -44700408, -31914828, -2994666, -11244761, 3635690, -3808562, -20053202, 34251828, -11863773, 47063716, -4975720, -16200617, 17707076, 2850785, 16009491, -21824340, 8594230, -22183506, -4445828, 25089052, 59854128, 1918240, -13146895, 24126442, 3761855, -28344636, 6179921, 38237556, -8643085, -2405719, -129923, 7118372, 1540283, 79226040, 23972896, -8027831, -3417183, -9417790, -12415140, 25333864, 23032298, -28423020, 15426986, 11653320, 1829119, --9125732, -15710990, -38454452, -15200963, 11272679, 2805151, -12892418, 21601538, -8165807, 8022462, -8331163, -6727530, -6112812, 22475564, -166967, -10356240, 14027363, -14300630, 28326920, -15706159, --9509594, -3064459, 10514080, 4493610, 28601260, -10672994, -18534932, -7945690, 6856379, 267362, -14818711, 2494302, 366146, -8359617, 11654394, 53294640, 22386980, -22721988, 16544214, -13072807, --18096844, 11221676, -2013803, 1386738, -2646237, 7052337, -16352551, -25303262, -60999808, -18822158, -18965502, -11382737, -22731652, 4919885, -7584912, 4402879, -27114128, -25826712, -14067092, 2918430, -3751117, 20696374, -3451006, -13291313, -32837172, -11796128, 18494666, -13482976, 49625124, 41770704, -19971598, -10469520, -16445430, 30064234, 25892748, -32210108, -5921686, -19453518, 29080686, -4064113, --39419208, -16776679, 15080704, 25859462, -45700064, 19369766, -31413928, 12635794, -18249316, -4203699, -23092428, -6828998, 4128537, 14974940, 30499636, -18818400, -32020592, 7991861, -1904818, 4212826, -31186294, 8327405, 23411330, -28267864, -4742181, 9855876, -25213606, 42668888, -4399657, 25764436, --3053722, -5417565, 21114596, 21150030, -11543798, 46786688, -10573136, -19825570, 22582402, 40139152, -2374043, 7434589, 1932198, 17695266, -18883360, 14099841, 60180544, 27671938, -2391760, 26073136, -31795106, -24723980, -75068512, 4616016, 43123620, 48872968, 11725798, -7392176, -24698210, 21677774, -51570748, 14193256, 4184372, 32744294, -68387152, 50054624, 9512279, -32097902, -674310, 27369142, --20165408, -548682, 14891188, -21407728, 715112, -19418084, -12366821, 17521856, -17225504, -10794327, --35137128, 13277355, 32467268, 7762617, -15768972, -27067958, -4813585, 17412872, 9628780, -23447300, --1238024, 24380382, -4076998, -44023, -9488656, -8278013, 60950956, -31428424, -7991861, -8834211, -9922448, 26515518, -30698278, -19130322, 40157408, -6935299, -2815888, -50624244, -40164388, 14456860, -27127550, 12501039, -49555332, 31539018, -806917, -10110890, 7305740, -38057704, -9505836, -7311645, --17121888, 29061360, -24302536, -16772921, -26004416, -18548890, -34328600, 7395934, -53971096, -18925236, -7989176, -31182000, 8714489, 11236708, 9208410, -4934918, -6504191, -25176024, 34280820, -12871480, -3645354, -38524784, 23554138, -552440, 30428232, -6062883, 31442918, 4151623, -3987877, 14282914, -36416492, 17715666, 9299141, 7575786, 4585952, 14651207, -18433462, -1139240, -13881871, -14065481, -22235046, 14340896, 8370892, -6019397, -5869073, -2201708, 23153632, 4068408, -10687489, -16433619, --1128503, -3472481, 17223892, 3242700, 14295262, 28272160, -8203388, -69504920, 4068408, 57638996, -5356361, -41126460, -6059662, 16810502, 11940009, 23128398, 19588272, -892279, -14060112, -12754979, -16914118, -10000831, 1011465, 7106561, -73883640, -11721503, -15156940, 12501039, 55979528, -74088, -3236258, -12273406, 2408940, 12848395, 22393422, 13622026, -15965467, -6348499, -37314676, -994822, -22119082, -9550934, -7529615, 10129143, 21772262, 21088826, -9261560, 5425618, -16581258, -129274224, --230552768, -101205000, -160648416, -182510880, 90360744, 22304838, 81888384, 274791456, 174985552, 138440224, -214620048, 100026568, -6750615, 76334992, 8448738, -105668544, -78368656, -87021408, -181626112, -150184800, --72756208, -135877728, -148222000, -69413112, -96462280, -152519664, -85368920, -2920041, -100809328, -93402656, -4201552, -30700964, -92856120, 75932336, 45098232, -79912696, 53222696, 87503520, 2485712, 44757856, -189183648, 83421152, 48255568, 225193184, 154351456, 84588848, 222359584, 302291616, 183049888, 270444960, -353622912, 250164672, 162716448, 218194000, 110683992, -124140664, -84353160, -160112624, -363330080, -363053600, --367307200, -550160640, -542817856, -543141568, -565110336, -530449920, -514880672, -400015008, -316757600, -230056160, --81302656, 63319628, 121521264, 280087168, 421957440, 299317888, 219650000, 0, 0, 0, -0, 0, 0, }, +-721555, -141734, 1270774, -1389959, -1471563, -1053341, 2721399, -7006703, 2644089, -1918777, +4832, 372052, -279173, -894964, 426276, 1571958, 2938295, -1367947, 3275450, -2646237, +-2936147, -2094333, 1474784, -2743947, -1764158, 2119030, 412854, -886374, 2610266, -599148, +3758, 1705639, 921807, -1284732, -1789928, -1931662, -2195802, -4995584, 1326071, -1185411, +-395137, 7590818, 661962, -1540283, 4350802, -1591822, 75162, -1959579, -3619584, 4491999, +-1444183, -741419, 51003, -3106335, 995896, -136365, 2281165, -457414, 2287070, 889595, +-629213, 2748779, -356482, 1005559, 1341104, -80531, -6255083, -71941, -914291, -2363306, +1582696, -525597, -1345935, -744640, -3873524, 2535641, 3999152, -1262720, 3567507, -455267, +3760244, 1938641, -685584, -1325534, 3809636, 412317, 854699, -4099546, -554051, -205622, +-67646, 5834176, 2925410, -117575, -4184372, -3042448, -1729798, 612033, 24696, 1326608, +2762738, 883690, 1097901, -4269198, -543850, -4156992, 295816, -2269890, 2895882, 2830920, +-977105, -2222109, 3022583, 674847, -959925, -3861176, -404264, -2464774, 828929, 2428804, +-3841312, -1907502, -537408, -1531156, 10253161, 2425046, 5971615, 427349, 2041183, -53687, +-2804614, -2738042, -3335579, 1593433, -2733747, 1994476, 177167, 2426120, 2668785, 6116571, +1977296, -648003, -224412, -3862249, 6098317, 5329518, 1020592, 1445793, 1575716, 1413044, +13799730, -3500935, -3128884, -1321776, -2978023, 462246, -6865505, 344134, 1107565, 168041, +4299263, 352187, -1162862, -4155918, 2323577, -5788006, -5097053, 1602560, -2615635, -1278290, +-1093606, 798327, 3535295, 5060009, 122407, -936303, 5900212, 2101313, -642635, 105227, +-2816425, -36507, 6478958, -105764, -3460670, -2651606, -1051193, 2203318, -3467112, -3957812, +-4290673, -3316252, 2741263, -3118146, 791885, -3764539, 921271, 4410395, -102005, 3124052, +-1762010, -2567854, -1676648, 2169495, -583042, 3387119, 4519916, 718333, -2006824, -2582349, +-655519, -367220, -331249, 190589, -5000953, -412854, -2705293, -2163053, 1423245, 556198, +580357, 1759863, -6134287, -2735357, 1100049, -738734, 2367601, -10449655, -5397700, -2619930, +-7298760, -2833068, -7028714, 1458678, -1064615, -4540854, -5193153, -1162326, -4335770, -552977, +2692408, -697932, -6343667, -2623151, -419833, -2736968, -2402497, 1241246, 4990752, 6607807, +-1653026, -2326262, 3442416, 4065724, -1927904, -1481227, -1424319, -3614215, 438624, 1039382, +-3401077, -2572686, -1205275, 2298881, 5479842, -23622, -2574833, -410169, -3586835, -1528472, +-5382668, -2676838, -2701535, -8034810, -1376000, -3861176, -2975339, -8772471, 4629438, -4033511, +-3815542, 1112933, -1106491, -974421, 507343, -7327214, -2405719, -2849711, -1154273, -4364224, +-1157494, -2223183, 1232119, 2106682, -2887292, -1498407, -3953518, 928250, -1123671, -872415, +-614717, -5223217, -748398, -4232154, -18380312, -1363115, -8993125, 8270497, -4613332, 14806363, +-9281961, 9350144, -8198019, -449898, 45097, -6398428, 5191005, 213675, -2204392, 1526324, +-1893007, -837519, -6052146, -63888, -4499515, 3731253, 1557463, 4559645, -2430952, 6804302, +6436009, -6036040, 1971927, -5153424, 5716602, -30602, -3464428, 222801, -198642, -304406, +4321811, 459562, -5538361, 2298344, 4632659, -434865, 5419175, -2504503, 4510790, -6310381, +-2677375, 3810173, -3063386, 791348, 5883032, -5163088, 8485782, 2890513, -7359964, 1626719, +-7044820, 2416993, 4814659, 2519535, 4687957, 5492190, 2622615, -1129040, 206695, -57445, +2581275, 3725884, -682363, 7423851, 2382096, 4852776, 3884798, 897648, 1433982, 11991549, +-150861, -3548180, -1331440, -4781909, -5653788, 8689793, -1943473, -1530082, 7975218, -868657, +-1788317, 3382824, 6164352, 1576790, 2961380, -406411, -7151658, -2088965, 5028333, -8174397, +-8041790, -3197066, 1527935, -5845451, -3547106, -151398, -969589, 5223217, -2301029, -1475321, +5608154, 7776575, -7156490, 1543504, -1838783, 2652142, 630823, -3388729, -843424, 3051574, +4969277, -1683090, -7408819, -1942399, -797790, -2231236, -3771518, 199716, -610959, 986232, +-1144609, 664109, 6630893, -5361730, 512712, -4179003, -3221762, -5619428, -1703491, -3418794, +-7362111, -663036, 392453, -3240553, -647466, -3422015, 2720862, 3070365, -607738, 582505, +-2632278, -1194538, 8783208, -1584306, -3485903, -11769284, 16247861, 18202608, 3806415, -6064494, +4478577, 7417946, 7466264, 4369056, 5749888, 2774549, 9141301, -491774, -620623, -3162707, +5910949, -2821257, -7205882, -10180146, 1675037, -4692252, -3892314, 4099010, -639950, -2448131, +9360344, -284005, 11518565, 464930, -3877282, -2642479, 4363687, 2906619, -1679332, -8412230, +13105019, 7607998, 577673, 7145752, 4589710, 4747550, -3619584, 5311801, 3078418, 1294933, +-1000727, -1974611, -5032628, -7579007, 2748242, 4049617, -5578089, 2692945, 5816460, 8099772, +2624225, 7322383, 3842922, 6250251, -8367133, 2815351, 1358820, 1933272, 758062, -494995, +4306779, 3516505, 3848828, 4893579, -1125281, 2339147, 1828582, 6895033, 8905615, -4520453, +-4910758, 14810658, 4880157, 6683506, -5022965, 2361695, -12853763, 953483, -9189083, 7437810, +5178120, -3781182, 6407555, 3660923, -6082748, -1392643, 9680856, -108448, 6794639, -1570347, +1685238, 7602629, -8826158, -545461, 1937030, 2871723, 1057099, 3133716, 842887, 9145059, +-3706020, -2460480, -2236604, 6929393, 1366873, -3089692, 4654134, 11585674, -7483981, 1510755, +2100239, -614717, 5210332, -2248416, 9368397, 3015604, 2837363, -7135552, -73014, -1855426, +4734128, 3105261, 5087389, -4900558, -2503429, 4217658, -7861938, -4789963, 2747705, 9305584, +6451041, 8239358, -8057359, -2775086, -8148090, -2277943, 3755949, -666794, -7488276, 1287417, +-4063576, 179315, -8039642, -10948409, -3060164, -7453379, 2560338, -17775260, -16087337, -11763379, +2750390, 2772938, 12191265, -6334003, 11551315, -5650567, -20725902, -2470143, -2492155, -8463233, +-13621489, -5441724, -898185, -8715562, -678068, -13038447, 297963, -13712220, 6846715, -3990562, +4830765, -3273839, -819802, -4770635, -5276368, 7293928, 996432, -3081102, 8536248, 271120, +899796, 2373506, 7822746, 6602439, 5061082, -625455, -10469520, -1809255, 4228396, 665720, +5551245, -3702262, 2187749, -15362561, 4094178, 7990250, -11538967, 5692443, 1778117, 9587978, +7471633, -837519, -3213709, -1079647, 6604049, 2652679, -9735080, -8396124, -13273596, -7055558, +-9022116, -2785823, -11038603, -3099893, -3903589, 10066330, -5349382, 4574140, -3028489, -2380486, +-3670050, -8304856, -4064650, -21606370, 18331994, -3872450, 11227045, 6995428, 539555, -13909252, +12724377, 2662343, -107374, 8515310, 6192269, -5085778, 796716, 13795972, 5098663, -4609037, +9881646, -3789235, -3100967, -1560147, 3741990, 1240172, -804233, 2421825, 4692252, 4675609, +4371203, -8098698, 6583648, -6493991, 11363410, -5276368, 11304891, 4704063, 1784559, -8964134, +-9707163, -2097018, -2726767, 13644037, 4217121, 11228655, 4855461, -7262253, 1079647, -471910, +4937065, 1798518, 4431870, 511638, -5148055, -1790465, 6942815, 17211544, 11911555, 3021510, +4575751, 703838, -1435593, 9855339, 7420093, -868120, 10579041, 15932181, 20146080, 2602213, +-10293426, -11055246, 5523865, 4908611, 386547, 6056441, 1198833, -1299228, 1158567, 14964740, +10210211, -15610596, 12621298, 5057861, -10782515, 24293946, 3372086, -12752832, 2573222, 6618545, +310848, 4732517, 17248052, -17030620, 10617159, -6990596, 9358197, -3885335, 1673964, -15758772, +2226941, -1843078, 5826660, -6121402, 408559, 1064615, -322123, -9283572, 8280160, 806917, +-1484985, 4028679, -2311766, 3972308, -2764885, 12284680, 9162776, 12161200, 11556683, -2073396, +3586298, 5186710, -170725, -6511171, 7879655, -10336376, 2369748, 10035191, -6867653, 5255966, +-12218108, 3490198, -1923072, -2845953, -1973001, 699543, 2444910, 3174518, 10810433, -8067559, +-1596117, 7623567, 15705622, -15425375, 2445447, -4127464, 3618510, -3301756, 23135378, -15969225, +3539590, -9400073, -6910603, 1046898, 71404, -244276, -24182814, 10991358, -15600395, -3695819, +20865488, -6901476, -927713, 10958609, 2185065, 6577743, -16449188, 14812805, 486405, 660888, +-4560719, -10072235, -1838246, -1963874, -10795400, -6677601, 10865194, -4099010, 1655173, -6068789, +-25586730, 8005819, 593779, -8211441, 4232154, 9229348, -1468879, 600759, -2527588, 1969779, +5997385, 1623498, 9977209, 6767258, 1053878, 8769249, -8055748, -7796977, -11066520, 3477850, +5389647, 1291175, -17220672, 4232691, -14831059, 20038170, -5567352, 6826851, 16754667, -7349226, +10346576, 2320356, 11296838, 4422206, -6681896, -18398566, -13780403, -10484552, -2338073, -10977936, +-3133716, -9643812, -7103339, 17638894, 2675765, -8105677, -8231305, 3249143, 5087389, -1949378, +651224, -33215666, 10614475, 1520955, 6424198, -21045340, -25613038, 14247480, -12948790, -15002858, +-4789963, 8630737, 18702436, -13596256, 325881, 8420283, -3492345, -4870493, 4294431, 2391223, +13903346, 4010426, -14741938, -1429150, -7818451, -1399086, -9036611, -11938398, 1005559, 10050223, +-1494649, 3927748, -9817221, 1669669, 10200547, 7401303, 590558, -206695, 6114423, 5356361, +3422552, 8826158, -13297756, 12642236, 9237401, 2188286, -11124502, -490700, 7311645, -9540733, +8600672, -7896298, 9825275, -4231080, 13039521, -23153632, 22239340, 3850438, 20906828, -221191, +-5414343, -3221762, 6986838, -1285269, -19009526, -1196685, -2222109, -20825760, 4946192, 11198053, +-18909668, 12552579, -16873316, 2410014, 4754529, 594316, -21175262, -12306692, -11578695, -857383, +-1846299, -11474005, -11162083, 17796734, 3873524, 11831561, 11479911, 3473555, -8238821, 2241436, +29795262, -19907710, 5221607, -3222299, -10712185, 994285, 4298189, 5085242, 200790, 401043, +-5464809, -8181376, -12905840, -6372658, 10328859, -8075613, -12979928, 7956964, -4452271, 3235184, +-1452773, 6237903, -5364414, 12814035, -4231080, 1633161, -6979, 1592896, 11809013, 4185446, +-5109401, 6401649, -4671314, 9692667, -5475010, 4099546, -13345000, -9692131, -7082938, 2551211, +-6624450, -11643119, 5081483, 8898098, 2638721, -6162741, 4071092, 6273874, 7002944, 18983218, +26031260, 35505420, -3754875, 5631239, 8344585, 4937065, 4456566, 5559299, -7727183, 13857175, +-2640331, 18059800, 21776022, 16192564, 5461051, 8754754, 1198833, 30881352, 5191542, -7800198, +448287, 36171140, 29051696, -11610907, -5035313, -13971529, 9128416, 4948876, 17956722, -2225867, +-6946573, -2546379, -10703595, 3416647, 950262, 17279728, -5638755, 7039452, -21573084, 13105019, +-1291175, 9537512, 301185, 8765491, 1700807, -11491722, -6123550, -9677098, -7852274, 10181220, +22138408, 10670309, -2343979, -5588290, -75699, -612033, 5633924, 8647917, -13828184, 1030255, +-4767414, -3324842, -15112379, -10320270, -24575266, 1900523, -1271310, 10364293, -7461432, 17322676, +-12124156, -3649112, 31336618, 32937568, -21895206, 6593849, 17752174, -8666707, -5478768, 11260331, +-4049081, -11166915, 34404300, -6583648, -54148800, 20017768, -1700270, -25064892, 19788524, 25018184, +-9495099, 18440978, 18037788, -6605660, -1843078, 15366319, -16749299, 6757594, -14143864, -7499013, +1608465, 5268851, 10915123, 4754529, -10384157, -2768107, 7881802, -11034845, 9205726, -6036040, +-13627931, 10466298, 5161477, 4650913, -3987877, -4344360, -5302674, -1768990, 8960376, -21219822, +9243306, -1605781, 16027207, -11764989, -649614, -14354318, 5055177, -22613002, 1723356, -311922, +-9113921, -7724499, 2838974, -15691663, -25418690, 13736916, -1929514, 3183645, -15205795, 7647190, +-2852932, 8297877, 9942312, 3742527, -10768020, 7140383, -5331128, -3729105, -19523310, 1286880, +-13934485, -16501801, -22087944, -10514617, 3367791, 4510253, -22651120, -12751758, 1246077, -9705552, +-30201674, -25706454, -24466282, -6810208, -14353244, 11384885, 19112068, 3300682, -17313550, -23021562, +-23261542, -4231617, 587337, 10867878, -14171781, 28211492, 31251792, -5813238, 21561272, -4367982, +-6393059, -6500970, 21082384, -15756088, -2371359, -6831683, 32607392, 2451890, 12956843, 5340255, +-1269163, 16726750, 10337986, 13901199, 5701032, -761820, -3693135, 13315472, -249108, -10718628, +16647830, 748935, 14837501, -13398150, 12008729, 4712116, -12869870, -10317048, 28928752, 18587008, +333397, 10720238, 10114648, -16130287, -9175124, 6675453, 6437619, 12971875, 3664144, 3585761, +6902550, 15566572, 8297877, 4660577, -12264279, 41225780, 29470992, 3966402, -15708843, 9857487, +-3603478, 5832029, -1584843, 9426379, -3300146, 2126546, 24976308, -14679124, -4655745, -19996294, +8651675, -4908074, -718333, 19710678, 8929237, 3234110, 4566087, -6803228, -12749610, 12780212, +-8927626, -20243254, 55493124, -60555280, -6344204, -31446140, 40416180, 11589969, 7716983, -14502494, +4413079, -11639361, 36219996, -5287105, -1626182, 4664872, -1126892, -12852153, 5928666, 9154723, +11344619, -22890028, -12024298, -11224897, 5477694, -6103149, -5927055, 419833, 289910, 16966732, +-7632694, 2031520, 12367895, -201327, -15378130, 3303904, 12950400, -155156, -24543054, 20025286, +2629057, 1749662, 327491, -9092446, 8572755, -44700408, -31914828, -2994666, -11244761, 3635690, +3808562, -20053202, 34251828, -11863773, 47063716, -4975720, -16200617, 17707076, 2850785, 16009491, +21824340, 8594230, -22183506, -4445828, 25089052, 59854128, 1918240, -13146895, 24126442, 3761855, +28344636, 6179921, 38237556, -8643085, -2405719, -129923, 7118372, 1540283, 79226040, 23972896, +8027831, -3417183, -9417790, -12415140, 25333864, 23032298, -28423020, 15426986, 11653320, 1829119, +-9125732, -15710990, -38454452, -15200963, 11272679, 2805151, -12892418, 21601538, -8165807, 8022462, +8331163, -6727530, -6112812, 22475564, -166967, -10356240, 14027363, -14300630, 28326920, -15706159, +-9509594, -3064459, 10514080, 4493610, 28601260, -10672994, -18534932, -7945690, 6856379, 267362, +14818711, 2494302, 366146, -8359617, 11654394, 53294640, 22386980, -22721988, 16544214, -13072807, +-18096844, 11221676, -2013803, 1386738, -2646237, 7052337, -16352551, -25303262, -60999808, -18822158, +18965502, -11382737, -22731652, 4919885, -7584912, 4402879, -27114128, -25826712, -14067092, 2918430, +3751117, 20696374, -3451006, -13291313, -32837172, -11796128, 18494666, -13482976, 49625124, 41770704, +19971598, -10469520, -16445430, 30064234, 25892748, -32210108, -5921686, -19453518, 29080686, -4064113, +-39419208, -16776679, 15080704, 25859462, -45700064, 19369766, -31413928, 12635794, -18249316, -4203699, +23092428, -6828998, 4128537, 14974940, 30499636, -18818400, -32020592, 7991861, -1904818, 4212826, +31186294, 8327405, 23411330, -28267864, -4742181, 9855876, -25213606, 42668888, -4399657, 25764436, +-3053722, -5417565, 21114596, 21150030, -11543798, 46786688, -10573136, -19825570, 22582402, 40139152, +2374043, 7434589, 1932198, 17695266, -18883360, 14099841, 60180544, 27671938, -2391760, 26073136, +31795106, -24723980, -75068512, 4616016, 43123620, 48872968, 11725798, -7392176, -24698210, 21677774, +51570748, 14193256, 4184372, 32744294, -68387152, 50054624, 9512279, -32097902, -674310, 27369142, +-20165408, -548682, 14891188, -21407728, 715112, -19418084, -12366821, 17521856, -17225504, -10794327, +-35137128, 13277355, 32467268, 7762617, -15768972, -27067958, -4813585, 17412872, 9628780, -23447300, +-1238024, 24380382, -4076998, -44023, -9488656, -8278013, 60950956, -31428424, -7991861, -8834211, +9922448, 26515518, -30698278, -19130322, 40157408, -6935299, -2815888, -50624244, -40164388, 14456860, +27127550, 12501039, -49555332, 31539018, -806917, -10110890, 7305740, -38057704, -9505836, -7311645, +-17121888, 29061360, -24302536, -16772921, -26004416, -18548890, -34328600, 7395934, -53971096, -18925236, +7989176, -31182000, 8714489, 11236708, 9208410, -4934918, -6504191, -25176024, 34280820, -12871480, +3645354, -38524784, 23554138, -552440, 30428232, -6062883, 31442918, 4151623, -3987877, 14282914, +36416492, 17715666, 9299141, 7575786, 4585952, 14651207, -18433462, -1139240, -13881871, -14065481, +22235046, 14340896, 8370892, -6019397, -5869073, -2201708, 23153632, 4068408, -10687489, -16433619, +-1128503, -3472481, 17223892, 3242700, 14295262, 28272160, -8203388, -69504920, 4068408, 57638996, +5356361, -41126460, -6059662, 16810502, 11940009, 23128398, 19588272, -892279, -14060112, -12754979, +16914118, -10000831, 1011465, 7106561, -73883640, -11721503, -15156940, 12501039, 55979528, -74088, +3236258, -12273406, 2408940, 12848395, 22393422, 13622026, -15965467, -6348499, -37314676, -994822, +22119082, -9550934, -7529615, 10129143, 21772262, 21088826, -9261560, 5425618, -16581258, -129274224, +-230552768, -101205000, -160648416, -182510880, 90360744, 22304838, 81888384, 274791456, 174985552, 138440224, +214620048, 100026568, -6750615, 76334992, 8448738, -105668544, -78368656, -87021408, -181626112, -150184800, +-72756208, -135877728, -148222000, -69413112, -96462280, -152519664, -85368920, -2920041, -100809328, -93402656, +4201552, -30700964, -92856120, 75932336, 45098232, -79912696, 53222696, 87503520, 2485712, 44757856, +189183648, 83421152, 48255568, 225193184, 154351456, 84588848, 222359584, 302291616, 183049888, 270444960, +353622912, 250164672, 162716448, 218194000, 110683992, -124140664, -84353160, -160112624, -363330080, -363053600, +-367307200, -550160640, -542817856, -543141568, -565110336, -530449920, -514880672, -400015008, -316757600, -230056160, +-81302656, 63319628, 121521264, 280087168, 421957440, 299317888, 219650000, 0, 0, 0, +0, 0, 0, }, { 12633646, -1332514, 2347737, 4104378, -5537287, -1505923, -3160022, -670552, -1440425, -3429532, -386010, --508417, -3372086, 4203699, -2761664, -1741072, -284542, -1544578, 3635690, -1651415, -2587718, -1075889, 1333587, 3838627, -387621, 816044, -2459406, -484258, 279710, 1143535, 260382, --103079, 3945464, -2310156, 889058, 238908, -2445447, -5657546, -2268280, 1213328, 1976222, -2039036, -5528160, 4306242, -2130304, -2319819, 2320893, 932545, -4861903, 1867774, -4975183, --1459752, 2103997, -3885872, -1548336, 3351685, -1257352, -2206540, -2840584, -5541045, 4292283, -1531156, -1764695, -1698123, -3736622, -4242891, -4867272, -1057636, -3209951, -52076, -222801, --271120, 305480, -307627, -3107409, -7095286, -796716, 6358699, -5968931, 2101850, -9950365, --36507, -3712999, 3800509, -3482682, 766115, -2423972, -4217121, -1240172, -510564, 2777233, -3604551, -3727495, -6260989, 3018825, 994822, 2043331, 1258425, 2331630, -3658775, -2898566, -549219, -908386, 3122978, 2075006, -2804614, -829466, 2371359, 4285304, 2724083, -222265, --3620658, 1648194, -666794, -2168422, 2452963, 801011, -3311957, -3026341, -2255932, 1525787, --3231963, -2033667, 2667175, 714038, -112743, -3687230, 1225676, -3230889, -7430294, 369367, --2520609, -5175973, 2220498, -1764695, -1342714, -2065342, 140123, 3208341, 2248416, 756988, -1722819, 2249489, -5530844, 2364380, -2153389, -2753074, -1161789, 1183800, 421444, 3149822, -14850923, -1255741, 2726767, 3262565, -1512365, 1530082, 5927592, -4626217, -800475, 1675037, --2275259, -471910, 4369056, -1427003, -952409, -328565, 1715839, -861141, 2128693, -1502165, --1404454, -702227, -3326989, -5798206, -1036161, -1890859, -718870, 3343632, -6040872, 7446400, -108448, 76236, 326418, 1357747, -107374, -2943126, 533113, 2246268, 5742908, 214212, -50466, -933082, -1809255, 3686693, 1891396, -1452236, 2187749, -3827890, 759672, 1110786, --2705830, -9828496, -2911451, -334471, -425202, -557809, -698469, -1337346, -535260, -1950989, -2571075, 7075959, 4266513, 211527, 203474, -296353, 2745558, -1573569, -6283537, -333934, --3115462, 2033130, -3528316, 2058363, -9019968, -262530, -487479, -12950937, -12485470, -4618164, --1744831, -1670205, 132070, 3320547, 881005, 2724620, -5803038, 3064459, 3806952, 3703873, -4297652, -3093987, 1013612, 9983115, -5972689, -68719, -4223027, -6138582, -641024, -294205, -5561983, -2488934, 682900, -4537633, 3119220, 2043331, 2470680, -10362145, 1729261, -1754494, --3588445, -818728, 52076, -7631083, -4956393, -4176856, -251256, 6717866, 2362769, 2359548, -3232500, -2716030, 1940252, -2408403, 5672041, 8804683, -715649, -562104, 2526515, 838056, -2301029, 5071283, -2188286, 5249524, -712965, 117038, 3012920, 4326643, -1482301, -5541582, --5339718, 2389613, -721555, -671626, -2382633, 3000035, -4528506, 2028298, 3238942, 6041409, --3512210, 5796059, 3122978, 1990717, -14343043, 6150930, -6445136, 11455752, -10744934, 8373039, -4240744, -4476430, -5603322, -3121904, 2144799, 1950452, -3049427, 6754910, -2487323, -6495601, --1371168, 6994354, 4754529, -7101192, 1083942, -894964, -7477538, -3078955, -4828080, -1114544, --5737003, -1503775, -2422362, -7821136, -2843805, 3997541, 5657546, -1075352, -6764574, -1324461, -4711043, -1421097, 117575, 375273, 60130, -6616934, -244813, -729071, -1740536, -231391, -1132798, -4687420, 2685428, -5011153, -157840, 89121, 60130, 3940633, 32212, -1604170, -1501628, 2818572, 6230387, 3077344, 1377611, -1577327, -3946538, -3391951, -1584306, -3686156, --2942053, 2738579, 4037806, -2579128, -5151277, -2925947, 1496796, 1556389, -4905390, 17923436, -7387344, -730681, 4389457, -2363843, 10223633, 4596152, 18073760, 792421, -16671989, 4846334, -10770704, -5689221, 2220498, 7611756, -5082557, 5515812, -4049081, -472446, -5089000, -4721780, --1263794, 1958505, -182536, 2881923, -1968169, 8096014, -4150012, 2672544, 1770600, 5468030, --8658117, -4155381, -3192771, -506269, -2833068, 1423782, 5871757, 4517232, 9109626, -685047, --295279, -4378719, -1287417, 6146098, -5040681, 5199595, -4694936, -1465658, 8379481, 12272869, -8659728, 2150705, -5777268, 5006322, 3533148, -2521146, 7097434, -3690451, 1676648, 1865090, --11993159, 726923, -11346767, -3829500, 2221035, -2161979, -5218922, -3769908, 1352378, 9120900, -2398739, -2084133, -3663070, -2237141, 1246614, 2705293, 11054172, 22185116, -9373229, -6897181, --1736777, -2362769, 7844221, -7090991, -13152264, -4390531, 1103807, -3028489, 3993783, 2052994, -6802692, 3034395, -2506650, 9812927, 9105868, -3865471, 792958, -5893769, -911070, 617938, --3665755, -450435, 6810745, 9888625, 504659, 1882806, 4061429, 2836826, 1653026, 978179, --3526168, -6560563, 893890, -9571871, 453119, 2631204, -3068754, 4259534, -2425583, -5104032, --345745, 5726802, 2439542, -1987496, 16267189, 372052, 5295158, -9203578, -2080375, 7067369, --3032247, -6663105, 4263829, -7866770, -7436199, 2232309, 9251360, -6963753, -4159139, -1631551, -455803, -2770254, -3306588, 13084081, 7351374, -355945, 823560, -4959077, -3990025, -1323924, -4037269, 8571144, -15732465, -2232846, -11847130, -6809134, -10741713, -2838974, -1754494, -1733556, --4203163, 4604742, -15078020, 7552163, -5218922, 4433480, 1884954, 6101001, 238371, 2447595, --6139656, -2700998, 2687576, -6149320, -4463545, 7208029, 1926830, 3184718, 2856153, -897648, -1882806, 10798085, -4014721, 907849, -5021891, 8654359, -5399311, -19696720, 5972689, 2930778, -8151848, 4303557, 11267310, -7804493, -3104188, 6701223, -2909840, -6693170, -3154654, 3419331, --9555765, 9247601, -379568, 6118181, -8066486, -3658775, -2951716, -8831527, -1803886, -7045894, --3178813, 608275, 9992778, 7941932, -925565, -12394739, -7010997, -2364380, 9719511, 7958038, -5852967, 5358509, -3463354, -14231374, -3690451, -317828, 3140695, -21105470, -25367150, -14604499, -9495636, 188979, -5266167, -5862094, -8555575, -1453846, 2018635, -14405320, -1983738, 8105140, --5993090, -4388920, 9059160, 1964411, -7093676, 1862942, -6891275, 13852880, -5349382, -4013110, -3980898, -8083666, -5402532, -4972499, 1743757, -5777268, -2658585, 1861332, 1033477, -17503602, -6863895, 6844568, -5606543, 12591770, 4316442, 724776, 11853573, 6666863, 1504849, 1253057, -12859132, -1857573, -3082713, -1408212, 7592966, 4199941, -13116293, 4313758, 3070902, -545461, --7377680, -20343112, 7960722, -1731409, -5742372, -12883291, -7906498, 7293392, -2513093, -3980898, --9227737, -16495896, 687732, -2497524, -9590125, -3804267, -16362215, -2532420, -4576825, -2824478, --1898912, 5829345, 10361609, -21072720, 17119740, 1070521, 8778913, -1424855, -649077, 1747515, -9450539, 1092532, -1136019, -12612708, 4573604, -1210107, -9874667, 2794413, -6462852, -4736812, -18324478, 5459441, 5616744, -3695819, 6525129, 8211978, 7608535, -4150012, 6622303, 3793530, --7807177, 5370320, -7609072, -2234994, 4685810, 2654290, -903017, -3764539, -4056597, 12624519, --3704409, -4907000, -3599720, 2967823, 2465311, -5327370, -10041634, -187905, -10777147, -688269, --9756018, -3003793, -2515240, 2494302, -5126044, -7584912, 10115722, -3609383, -11782706, 8067023, -11897059, -5148055, -4286378, 7015829, 4104378, 13002477, 7424925, 2152852, -571231, -11489574, -2519535, 12990129, 9074729, -7388955, 8569533, 11078331, -7309498, -17315698, -6791417, -15087146, -4434017, -33394444, 16539919, 4936528, -1217086, 23119272, -970663, 11873437, -9798431, -2037962, -2178622, 486405, 13400835, 8614094, -17284560, 11369315, 1226213, 6954626, -15523086, -300111, -9599789, -15311022, 19957102, 5607617, 198105, -6682432, 1580011, 8764955, -13605383, 1580548, -4000762, 2758443, -8221641, -2932389, 8607651, 4887136, -447213, 1464047, -5248450, -9491878, -4466229, -16222091, -234076, 23759222, 23449984, -7175817, 3310883, -847719, 7049652, 16689706, -1868311, 8027294, 3112241, -8617315, -160524, -1621350, -24474872, -11287711, 15977815, 653909, -5299453, -6158446, -981400, 5293547, 8060580, -986232, 19849192, -156766, 15660525, 1262720, -3885335, 1115081, -8983998, -13539884, 16300475, 1772748, -6173479, 11644193, -24252606, 10215043, -15849503, -1821066, 4967130, 7290170, -3398393, -2073932, 9932649, -3303367, 14887430, -13523778, -7928510, 18223546, -18844170, 1050120, -8756901, 11594801, 5174899, 9650792, -9334038, -7360500, -287763, 24475408, 681826, 12483859, -5036923, 945430, -1261110, -1965484, -10353019, -241592, --2608119, 5098663, -4392141, -6839199, -5450314, -318901, -1628330, 11062225, 2299418, -5969468, --5077725, -5509370, -1626182, -2611877, 18295486, 799401, 9392557, 609349, -3885872, -3947075, -15278809, 11032160, -3878892, -14108968, 8312909, 5309117, -30491584, 1619203, 17821966, 16777216, -4356708, 13246216, -18239652, 30209190, 3086471, 5455146, 6477885, 14110041, -638340, -13577465, --3306588, -15958488, 18637474, -7713225, 9160092, -18491444, -14874009, 12814572, 10667625, 26596048, --9783399, -7273527, -5118528, 4890894, -11738682, -1509681, 4068408, -915365, 14003741, 9188546, --11957189, 977642, 2934537, 8284455, -13596256, 13784698, -711354, 6128919, -2827699, -6248641, --14295799, 4942971, -2924336, -5703180, 2216203, -8311836, -8798241, -1662689, 3726421, 16940962, --25503516, -14794015, -14060649, -14772003, -4935991, 17696876, -10933376, -63351, 16367047, -2037425, --8424578, -14267881, -4745402, -5776194, -31384400, -23081154, -7507066, 6129455, -3753802, 6209986, --7658464, -3934727, 13646722, 9867687, -16229071, -6673306, -18089866, -5411659, 405874, 8450348, --4112431, 3668439, -15707769, -9570261, -11819213, 2185602, 1299228, 3857418, -15034533, 3892314, -17846662, 9912785, -13196824, 2417530, -1511829, 30107184, 3231963, 14433238, -12656195, -8690866, --3148748, -14375256, -9083319, -13905493, -6436009, -9085466, 16353088, 3923990, 4099010, 16679505, --487479, -1199370, 7594576, 14944876, 23727546, 17098802, -3613141, -6754910, -27416386, 7212861, -8526047, 2981244, -17128330, 19342922, 7799124, 11170673, -3318936, 638340, 11116986, 24150602, -23890218, 13302051, 2771865, 25042344, 510027, -8284992, 8139500, 14851997, 12415677, 22302692, -11934640, -296890, 2491618, -14795089, 5702106, -35730908, -6344204, -4545686, 7262790, 26175142, -14856829, 2764348, 19250044, -15817291, -13783624, 1262184, -34578780, -9792525, 410169, 4528506, -6648610, 6708739, -3432753, 12237972, 147640, 4574677, 25263534, -20795694, -11012833, -10520522, --22996866, -7028177, 4505958, 17940616, 32600412, -12652974, 803696, 5717675, -5718749, 30372934, -5509906, -14358076, 26444114, -4984310, -8660265, 19257022, -16928076, -9503152, 1262720, 2145873, -2436857, 12836584, 6662568, 10538776, -3005940, 5869073, 15093052, 1511292, 10280004, 2500745, -384936, 17283486, -21766894, -7230578, -7425999, 15181099, -11157788, -2155537, -6629282, 15100568, --6213744, 32701344, 23190140, -20926692, 10479720, -25274808, 3550327, 10331007, 4858682, 6578280, --33553358, -5488432, -32397476, 5279589, 2339684, 4985920, -5412196, -4696547, 14992120, -26547730, -9137543, -10750840, -52679384, -18223010, -17565880, 10035191, -8109435, 9502078, 25618406, 29578366, -15230491, 16564615, 13021804, 6135898, -21429740, 24367496, -1233729, 9028558, -40540196, -18375480, --13487271, 8523899, -30695058, 12186433, -17972828, 27758910, -30496416, -39002600, -7687455, -4889821, -32220308, 16120086, 14898168, -7169911, 4635344, -18470506, -14524506, 4467303, 7585449, -24052890, --22116934, -15388331, -995359, 13421773, 10143102, -16625818, -20939576, -11926050, -11871826, -29040958, --16086800, 14123463, -7108708, 697395, -2858838, 10614475, 16733729, -3153580, -43466144, 19830938, -38885560, 14905684, 635655, -44033616, -9208947, 20568062, -4006131, 51221244, -3699041, -39555576, -8443369, -5857799, 5208722, 2093260, -6141803, 11858942, 15563351, -41778220, -9174587, 3304441, -17563196, -7021198, -19145890, 20267414, 4846334, -13748190, -39363376, -48870284, -21741124, -3010772, -7992398, 38835096, 61212948, 24683714, 2781528, 74553120, 68386616, -29767882, 35132832, 31135292, --9640054, -5965173, -17219060, -9494562, -20130512, -14183593, 56532508, -3660923, 32597192, -122943, -823560, -67646, -23433878, 4898410, 3843996, -50178640, 6542846, 11576011, -27033598, -5909338, --8966818, -3990025, 6427956, -1887638, 564251, 21507048, 7898982, -11016054, 5741835, 34557308, --457414, 15767362, -1927904, 12836584, -20342038, -23489714, -14147085, -42878804, 10229538, 4589710, --20189030, -51981452, -35143032, -48564268, 33962992, -25218974, 4107063, 8738111, 6545530, 6790880, -36112084, -36119064, -1444183, -20111722, 38103340, -89159224, 16441672, 7312182, 26527866, 26561688, --2176475, -7590818, -16292422, -3129421, -29004988, 20080582, 49082888, -2922725, 6314139, 33849712, --23132156, -21792128, 33530810, -59344636, 45911052, -22762790, -14958297, -8376260, 6920266, -15120432, --11007464, 22434224, -2942590, -39681740, 17771500, 301721, 10642392, -6673843, 40999220, -27970438, -4480725, 18653042, -7525857, 14853608, -21974126, 5041218, -18415746, -8004746, 26917634, 6036040, -12825846, -10371272, 26230440, -3504693, -7166690, 11846594, -10430328, -8489003, -3861713, -4503810, --19877646, -28310814, -5031554, 20796232, 4108673, -6525129, -27572616, 4634807, -20873004, 1842541, -14154065, -21038898, -1816234, 21827024, 22787486, 17178796, -26045218, -10524817, 25760676, 10965588, -4283693, 21364778, -95249488, -18698676, -5862631, -40796284, 10095321, 17645874, 3272765, 13963476, -27880780, -6278706, -14401025, 12369506, -11563663, 2427194, 31143344, 168577, 66728224, -9290014, --19255950, 1758789, -8058433, 32530082, 5779416, -3735011, 31248034, 31205622, 10157598, 11435350, -17285632, -40706628, -22231288, 31771484, -4749697, -33714420, -16672526, -15996069, 22282828, 10732050, --12031814, -48342540, 14589467, 5968394, 6275484, 6245956, -5563594, 3232500, -35074312, 29912836, -22137872, 9945534, -17331804, -16759499, 346819, 13937706, -2946885, 14477798, 7754564, -39205000, --15829639, 3744675, -36603860, -24696, 8104067, -35297116, -45301704, -9004936, 15250892, -29633126, --54905788, -27513024, -13119514, 33524368, -20350628, 37986300, -6368363, -1614371, 20097762, -1473711, --60268592, -8507256, 5985037, 24670292, -52204792, -83146272, 10457172, -11485279, -43425876, 20185810, -21221970, -11664057, 11894912, 32464584, -30597884, 6584185, 34684008, 15504295, 77468328, -27990838, --29451128, -10270341, 1821066, 73888472, -6681359, 61789548, -37895572, -12758737, 27836220, -41231688, --11623255, -38555920, 10027675, 46145128, -55581172, -17987860, -1921461, 21362630, 2626909, 10145786, -19384798, -468688, -34080028, -30631706, 4872104, 28075664, 68379640, -10613401, 20859046, -14820858, -35385700, 5119064, 6975564, -4905390, -35265976, 5485210, 38765300, -1782948, 1218697, -8817031, --30246234, 48791364, 20228760, 34207268, 42968464, 2905009, 5836324, 29557964, -59546500, 27027156, --28185722, 80160192, -3242164, 13011067, 15181636, -15882789, -17875118, 13747117, -27421218, 54026932, --23063438, -27918898, -30291330, 57149908, 22454626, 36957120, 103616, 37818796, 37060200, -19238770, -2490544, -13561896, 10941966, 6487548, -55586004, 37833832, -39520140, 4619774, -18200460, 14448270, --1508607, 20642686, -3302293, -18340584, 31208306, -11235098, -4226785, 4444755, -12901008, -11726871, -36119064, -8885750, -4701916, -4650376, -1576790, 16004659, -12264279, 3369939, -8856223, 7680476, --7651484, -6703370, -18852758, 27562952, -16951700, 8690866, 5015448, 18833432, -21401822, 4180077, --8395050, 21382494, 3525631, 956167, 18186502, 4379256, -28346784, -5177583, -4233227, 7150584, -13511430, 9672803, -25572236, 10311143, -19067508, 13073344, -10444287, 1926830, -5551245, 12822625, --4431333, 2898566, -28480466, 5818607, 15457050, -14722074, 14571750, 651224, 6104759, 7206419, --10741713, 19319836, 9198746, -2109366, -5400385, 9268003, -5496485, 18591302, -15675557, -2433099, --14768245, -23328114, 46493020, 3688840, 5657546, -18888192, -13980119, -29866128, 19661824, -8528731, --6283001, -13095892, -737124, -11696270, -1664837, -1722282, 4975720, 5626407, -1155883, -1581622, --8676908, 7657927, 7098507, -7192460, 3045132, -16073915, 6073084, 2889976, -3037616, -2661269, --5559299, 4862440, 849867, -11497091, -3303367, -3505767, -9652402, 15203110, 1342714, -10017474, -1229434, -4037806, 13132936, -4834523, -6551436, 2421288, -8284992, 15475841, 163746, -8829379, -2187212, -3699578, 7359964, -10041097, -2258616, 3090229, -3894999, 6714645, -4230006, 1833414, -2797634, -9058623, 913217, 8704288, -13877039, -1025423, 3739306, -12679280, 22483616, -21028160, -10012106, 3730179, -12458090, 23684598, -16716013, 4035122, 2153389, 10735808, -50200652, -115650584, -30124364, 106738528, 90195384, 121121296, -59973848, -77625088, -116703928, -119228296, 7996156, 88647592, -97827544, 107252312, 35510788, -23493472, -85400592, -141167520, -77484432, 35767952, 55377696, 93963680, -71091912, 19382114, -12856448, -29807610, -70875016, -45867028, -43787728, -8065949, 37002752, 57000660, -29815662, 38035692, 19042274, -21526912, -3582003, -45959372, -64139432, -10979010, -15140297, 11234024, -60054916, 34714072, 29691646, 8822400, -22819698, -23263154, -20272246, -33094870, -8902393, 1478006, -13968844, 17339320, 28616830, 8258685, -1225139, -14507326, -27043798, -2225867, 9494025, 10016401, -16771310, -4188667, -13572634, -6306086, -13514115, -10366440, 2985002, 7934952, 21983790, 18887118, -18289044, 1978906, -7678328, -32321240, -22062174, -2129767, -1344325, 0, 0, 0, -0, 0, 0, }, +1332514, 2347737, 4104378, -5537287, -1505923, -3160022, -670552, -1440425, -3429532, -386010, +-508417, -3372086, 4203699, -2761664, -1741072, -284542, -1544578, 3635690, -1651415, -2587718, +1075889, 1333587, 3838627, -387621, 816044, -2459406, -484258, 279710, 1143535, 260382, +-103079, 3945464, -2310156, 889058, 238908, -2445447, -5657546, -2268280, 1213328, 1976222, +2039036, -5528160, 4306242, -2130304, -2319819, 2320893, 932545, -4861903, 1867774, -4975183, +-1459752, 2103997, -3885872, -1548336, 3351685, -1257352, -2206540, -2840584, -5541045, 4292283, +1531156, -1764695, -1698123, -3736622, -4242891, -4867272, -1057636, -3209951, -52076, -222801, +-271120, 305480, -307627, -3107409, -7095286, -796716, 6358699, -5968931, 2101850, -9950365, +-36507, -3712999, 3800509, -3482682, 766115, -2423972, -4217121, -1240172, -510564, 2777233, +3604551, -3727495, -6260989, 3018825, 994822, 2043331, 1258425, 2331630, -3658775, -2898566, +549219, -908386, 3122978, 2075006, -2804614, -829466, 2371359, 4285304, 2724083, -222265, +-3620658, 1648194, -666794, -2168422, 2452963, 801011, -3311957, -3026341, -2255932, 1525787, +-3231963, -2033667, 2667175, 714038, -112743, -3687230, 1225676, -3230889, -7430294, 369367, +-2520609, -5175973, 2220498, -1764695, -1342714, -2065342, 140123, 3208341, 2248416, 756988, +1722819, 2249489, -5530844, 2364380, -2153389, -2753074, -1161789, 1183800, 421444, 3149822, +14850923, -1255741, 2726767, 3262565, -1512365, 1530082, 5927592, -4626217, -800475, 1675037, +-2275259, -471910, 4369056, -1427003, -952409, -328565, 1715839, -861141, 2128693, -1502165, +-1404454, -702227, -3326989, -5798206, -1036161, -1890859, -718870, 3343632, -6040872, 7446400, +108448, 76236, 326418, 1357747, -107374, -2943126, 533113, 2246268, 5742908, 214212, +50466, -933082, -1809255, 3686693, 1891396, -1452236, 2187749, -3827890, 759672, 1110786, +-2705830, -9828496, -2911451, -334471, -425202, -557809, -698469, -1337346, -535260, -1950989, +2571075, 7075959, 4266513, 211527, 203474, -296353, 2745558, -1573569, -6283537, -333934, +-3115462, 2033130, -3528316, 2058363, -9019968, -262530, -487479, -12950937, -12485470, -4618164, +-1744831, -1670205, 132070, 3320547, 881005, 2724620, -5803038, 3064459, 3806952, 3703873, +4297652, -3093987, 1013612, 9983115, -5972689, -68719, -4223027, -6138582, -641024, -294205, +5561983, -2488934, 682900, -4537633, 3119220, 2043331, 2470680, -10362145, 1729261, -1754494, +-3588445, -818728, 52076, -7631083, -4956393, -4176856, -251256, 6717866, 2362769, 2359548, +3232500, -2716030, 1940252, -2408403, 5672041, 8804683, -715649, -562104, 2526515, 838056, +2301029, 5071283, -2188286, 5249524, -712965, 117038, 3012920, 4326643, -1482301, -5541582, +-5339718, 2389613, -721555, -671626, -2382633, 3000035, -4528506, 2028298, 3238942, 6041409, +-3512210, 5796059, 3122978, 1990717, -14343043, 6150930, -6445136, 11455752, -10744934, 8373039, +4240744, -4476430, -5603322, -3121904, 2144799, 1950452, -3049427, 6754910, -2487323, -6495601, +-1371168, 6994354, 4754529, -7101192, 1083942, -894964, -7477538, -3078955, -4828080, -1114544, +-5737003, -1503775, -2422362, -7821136, -2843805, 3997541, 5657546, -1075352, -6764574, -1324461, +4711043, -1421097, 117575, 375273, 60130, -6616934, -244813, -729071, -1740536, -231391, +1132798, -4687420, 2685428, -5011153, -157840, 89121, 60130, 3940633, 32212, -1604170, +1501628, 2818572, 6230387, 3077344, 1377611, -1577327, -3946538, -3391951, -1584306, -3686156, +-2942053, 2738579, 4037806, -2579128, -5151277, -2925947, 1496796, 1556389, -4905390, 17923436, +7387344, -730681, 4389457, -2363843, 10223633, 4596152, 18073760, 792421, -16671989, 4846334, +10770704, -5689221, 2220498, 7611756, -5082557, 5515812, -4049081, -472446, -5089000, -4721780, +-1263794, 1958505, -182536, 2881923, -1968169, 8096014, -4150012, 2672544, 1770600, 5468030, +-8658117, -4155381, -3192771, -506269, -2833068, 1423782, 5871757, 4517232, 9109626, -685047, +-295279, -4378719, -1287417, 6146098, -5040681, 5199595, -4694936, -1465658, 8379481, 12272869, +8659728, 2150705, -5777268, 5006322, 3533148, -2521146, 7097434, -3690451, 1676648, 1865090, +-11993159, 726923, -11346767, -3829500, 2221035, -2161979, -5218922, -3769908, 1352378, 9120900, +2398739, -2084133, -3663070, -2237141, 1246614, 2705293, 11054172, 22185116, -9373229, -6897181, +-1736777, -2362769, 7844221, -7090991, -13152264, -4390531, 1103807, -3028489, 3993783, 2052994, +6802692, 3034395, -2506650, 9812927, 9105868, -3865471, 792958, -5893769, -911070, 617938, +-3665755, -450435, 6810745, 9888625, 504659, 1882806, 4061429, 2836826, 1653026, 978179, +-3526168, -6560563, 893890, -9571871, 453119, 2631204, -3068754, 4259534, -2425583, -5104032, +-345745, 5726802, 2439542, -1987496, 16267189, 372052, 5295158, -9203578, -2080375, 7067369, +-3032247, -6663105, 4263829, -7866770, -7436199, 2232309, 9251360, -6963753, -4159139, -1631551, +455803, -2770254, -3306588, 13084081, 7351374, -355945, 823560, -4959077, -3990025, -1323924, +4037269, 8571144, -15732465, -2232846, -11847130, -6809134, -10741713, -2838974, -1754494, -1733556, +-4203163, 4604742, -15078020, 7552163, -5218922, 4433480, 1884954, 6101001, 238371, 2447595, +-6139656, -2700998, 2687576, -6149320, -4463545, 7208029, 1926830, 3184718, 2856153, -897648, +1882806, 10798085, -4014721, 907849, -5021891, 8654359, -5399311, -19696720, 5972689, 2930778, +8151848, 4303557, 11267310, -7804493, -3104188, 6701223, -2909840, -6693170, -3154654, 3419331, +-9555765, 9247601, -379568, 6118181, -8066486, -3658775, -2951716, -8831527, -1803886, -7045894, +-3178813, 608275, 9992778, 7941932, -925565, -12394739, -7010997, -2364380, 9719511, 7958038, +5852967, 5358509, -3463354, -14231374, -3690451, -317828, 3140695, -21105470, -25367150, -14604499, +9495636, 188979, -5266167, -5862094, -8555575, -1453846, 2018635, -14405320, -1983738, 8105140, +-5993090, -4388920, 9059160, 1964411, -7093676, 1862942, -6891275, 13852880, -5349382, -4013110, +3980898, -8083666, -5402532, -4972499, 1743757, -5777268, -2658585, 1861332, 1033477, -17503602, +6863895, 6844568, -5606543, 12591770, 4316442, 724776, 11853573, 6666863, 1504849, 1253057, +12859132, -1857573, -3082713, -1408212, 7592966, 4199941, -13116293, 4313758, 3070902, -545461, +-7377680, -20343112, 7960722, -1731409, -5742372, -12883291, -7906498, 7293392, -2513093, -3980898, +-9227737, -16495896, 687732, -2497524, -9590125, -3804267, -16362215, -2532420, -4576825, -2824478, +-1898912, 5829345, 10361609, -21072720, 17119740, 1070521, 8778913, -1424855, -649077, 1747515, +9450539, 1092532, -1136019, -12612708, 4573604, -1210107, -9874667, 2794413, -6462852, -4736812, +18324478, 5459441, 5616744, -3695819, 6525129, 8211978, 7608535, -4150012, 6622303, 3793530, +-7807177, 5370320, -7609072, -2234994, 4685810, 2654290, -903017, -3764539, -4056597, 12624519, +-3704409, -4907000, -3599720, 2967823, 2465311, -5327370, -10041634, -187905, -10777147, -688269, +-9756018, -3003793, -2515240, 2494302, -5126044, -7584912, 10115722, -3609383, -11782706, 8067023, +11897059, -5148055, -4286378, 7015829, 4104378, 13002477, 7424925, 2152852, -571231, -11489574, +2519535, 12990129, 9074729, -7388955, 8569533, 11078331, -7309498, -17315698, -6791417, -15087146, +4434017, -33394444, 16539919, 4936528, -1217086, 23119272, -970663, 11873437, -9798431, -2037962, +2178622, 486405, 13400835, 8614094, -17284560, 11369315, 1226213, 6954626, -15523086, -300111, +9599789, -15311022, 19957102, 5607617, 198105, -6682432, 1580011, 8764955, -13605383, 1580548, +4000762, 2758443, -8221641, -2932389, 8607651, 4887136, -447213, 1464047, -5248450, -9491878, +4466229, -16222091, -234076, 23759222, 23449984, -7175817, 3310883, -847719, 7049652, 16689706, +1868311, 8027294, 3112241, -8617315, -160524, -1621350, -24474872, -11287711, 15977815, 653909, +5299453, -6158446, -981400, 5293547, 8060580, -986232, 19849192, -156766, 15660525, 1262720, +3885335, 1115081, -8983998, -13539884, 16300475, 1772748, -6173479, 11644193, -24252606, 10215043, +15849503, -1821066, 4967130, 7290170, -3398393, -2073932, 9932649, -3303367, 14887430, -13523778, +7928510, 18223546, -18844170, 1050120, -8756901, 11594801, 5174899, 9650792, -9334038, -7360500, +287763, 24475408, 681826, 12483859, -5036923, 945430, -1261110, -1965484, -10353019, -241592, +-2608119, 5098663, -4392141, -6839199, -5450314, -318901, -1628330, 11062225, 2299418, -5969468, +-5077725, -5509370, -1626182, -2611877, 18295486, 799401, 9392557, 609349, -3885872, -3947075, +15278809, 11032160, -3878892, -14108968, 8312909, 5309117, -30491584, 1619203, 17821966, 16777216, +4356708, 13246216, -18239652, 30209190, 3086471, 5455146, 6477885, 14110041, -638340, -13577465, +-3306588, -15958488, 18637474, -7713225, 9160092, -18491444, -14874009, 12814572, 10667625, 26596048, +-9783399, -7273527, -5118528, 4890894, -11738682, -1509681, 4068408, -915365, 14003741, 9188546, +-11957189, 977642, 2934537, 8284455, -13596256, 13784698, -711354, 6128919, -2827699, -6248641, +-14295799, 4942971, -2924336, -5703180, 2216203, -8311836, -8798241, -1662689, 3726421, 16940962, +-25503516, -14794015, -14060649, -14772003, -4935991, 17696876, -10933376, -63351, 16367047, -2037425, +-8424578, -14267881, -4745402, -5776194, -31384400, -23081154, -7507066, 6129455, -3753802, 6209986, +-7658464, -3934727, 13646722, 9867687, -16229071, -6673306, -18089866, -5411659, 405874, 8450348, +-4112431, 3668439, -15707769, -9570261, -11819213, 2185602, 1299228, 3857418, -15034533, 3892314, +17846662, 9912785, -13196824, 2417530, -1511829, 30107184, 3231963, 14433238, -12656195, -8690866, +-3148748, -14375256, -9083319, -13905493, -6436009, -9085466, 16353088, 3923990, 4099010, 16679505, +-487479, -1199370, 7594576, 14944876, 23727546, 17098802, -3613141, -6754910, -27416386, 7212861, +8526047, 2981244, -17128330, 19342922, 7799124, 11170673, -3318936, 638340, 11116986, 24150602, +23890218, 13302051, 2771865, 25042344, 510027, -8284992, 8139500, 14851997, 12415677, 22302692, +11934640, -296890, 2491618, -14795089, 5702106, -35730908, -6344204, -4545686, 7262790, 26175142, +14856829, 2764348, 19250044, -15817291, -13783624, 1262184, -34578780, -9792525, 410169, 4528506, +6648610, 6708739, -3432753, 12237972, 147640, 4574677, 25263534, -20795694, -11012833, -10520522, +-22996866, -7028177, 4505958, 17940616, 32600412, -12652974, 803696, 5717675, -5718749, 30372934, +5509906, -14358076, 26444114, -4984310, -8660265, 19257022, -16928076, -9503152, 1262720, 2145873, +2436857, 12836584, 6662568, 10538776, -3005940, 5869073, 15093052, 1511292, 10280004, 2500745, +384936, 17283486, -21766894, -7230578, -7425999, 15181099, -11157788, -2155537, -6629282, 15100568, +-6213744, 32701344, 23190140, -20926692, 10479720, -25274808, 3550327, 10331007, 4858682, 6578280, +-33553358, -5488432, -32397476, 5279589, 2339684, 4985920, -5412196, -4696547, 14992120, -26547730, +9137543, -10750840, -52679384, -18223010, -17565880, 10035191, -8109435, 9502078, 25618406, 29578366, +15230491, 16564615, 13021804, 6135898, -21429740, 24367496, -1233729, 9028558, -40540196, -18375480, +-13487271, 8523899, -30695058, 12186433, -17972828, 27758910, -30496416, -39002600, -7687455, -4889821, +32220308, 16120086, 14898168, -7169911, 4635344, -18470506, -14524506, 4467303, 7585449, -24052890, +-22116934, -15388331, -995359, 13421773, 10143102, -16625818, -20939576, -11926050, -11871826, -29040958, +-16086800, 14123463, -7108708, 697395, -2858838, 10614475, 16733729, -3153580, -43466144, 19830938, +38885560, 14905684, 635655, -44033616, -9208947, 20568062, -4006131, 51221244, -3699041, -39555576, +8443369, -5857799, 5208722, 2093260, -6141803, 11858942, 15563351, -41778220, -9174587, 3304441, +17563196, -7021198, -19145890, 20267414, 4846334, -13748190, -39363376, -48870284, -21741124, -3010772, +7992398, 38835096, 61212948, 24683714, 2781528, 74553120, 68386616, -29767882, 35132832, 31135292, +-9640054, -5965173, -17219060, -9494562, -20130512, -14183593, 56532508, -3660923, 32597192, -122943, +823560, -67646, -23433878, 4898410, 3843996, -50178640, 6542846, 11576011, -27033598, -5909338, +-8966818, -3990025, 6427956, -1887638, 564251, 21507048, 7898982, -11016054, 5741835, 34557308, +-457414, 15767362, -1927904, 12836584, -20342038, -23489714, -14147085, -42878804, 10229538, 4589710, +-20189030, -51981452, -35143032, -48564268, 33962992, -25218974, 4107063, 8738111, 6545530, 6790880, +36112084, -36119064, -1444183, -20111722, 38103340, -89159224, 16441672, 7312182, 26527866, 26561688, +-2176475, -7590818, -16292422, -3129421, -29004988, 20080582, 49082888, -2922725, 6314139, 33849712, +-23132156, -21792128, 33530810, -59344636, 45911052, -22762790, -14958297, -8376260, 6920266, -15120432, +-11007464, 22434224, -2942590, -39681740, 17771500, 301721, 10642392, -6673843, 40999220, -27970438, +4480725, 18653042, -7525857, 14853608, -21974126, 5041218, -18415746, -8004746, 26917634, 6036040, +12825846, -10371272, 26230440, -3504693, -7166690, 11846594, -10430328, -8489003, -3861713, -4503810, +-19877646, -28310814, -5031554, 20796232, 4108673, -6525129, -27572616, 4634807, -20873004, 1842541, +14154065, -21038898, -1816234, 21827024, 22787486, 17178796, -26045218, -10524817, 25760676, 10965588, +4283693, 21364778, -95249488, -18698676, -5862631, -40796284, 10095321, 17645874, 3272765, 13963476, +27880780, -6278706, -14401025, 12369506, -11563663, 2427194, 31143344, 168577, 66728224, -9290014, +-19255950, 1758789, -8058433, 32530082, 5779416, -3735011, 31248034, 31205622, 10157598, 11435350, +17285632, -40706628, -22231288, 31771484, -4749697, -33714420, -16672526, -15996069, 22282828, 10732050, +-12031814, -48342540, 14589467, 5968394, 6275484, 6245956, -5563594, 3232500, -35074312, 29912836, +22137872, 9945534, -17331804, -16759499, 346819, 13937706, -2946885, 14477798, 7754564, -39205000, +-15829639, 3744675, -36603860, -24696, 8104067, -35297116, -45301704, -9004936, 15250892, -29633126, +-54905788, -27513024, -13119514, 33524368, -20350628, 37986300, -6368363, -1614371, 20097762, -1473711, +-60268592, -8507256, 5985037, 24670292, -52204792, -83146272, 10457172, -11485279, -43425876, 20185810, +21221970, -11664057, 11894912, 32464584, -30597884, 6584185, 34684008, 15504295, 77468328, -27990838, +-29451128, -10270341, 1821066, 73888472, -6681359, 61789548, -37895572, -12758737, 27836220, -41231688, +-11623255, -38555920, 10027675, 46145128, -55581172, -17987860, -1921461, 21362630, 2626909, 10145786, +19384798, -468688, -34080028, -30631706, 4872104, 28075664, 68379640, -10613401, 20859046, -14820858, +35385700, 5119064, 6975564, -4905390, -35265976, 5485210, 38765300, -1782948, 1218697, -8817031, +-30246234, 48791364, 20228760, 34207268, 42968464, 2905009, 5836324, 29557964, -59546500, 27027156, +-28185722, 80160192, -3242164, 13011067, 15181636, -15882789, -17875118, 13747117, -27421218, 54026932, +-23063438, -27918898, -30291330, 57149908, 22454626, 36957120, 103616, 37818796, 37060200, -19238770, +2490544, -13561896, 10941966, 6487548, -55586004, 37833832, -39520140, 4619774, -18200460, 14448270, +-1508607, 20642686, -3302293, -18340584, 31208306, -11235098, -4226785, 4444755, -12901008, -11726871, +36119064, -8885750, -4701916, -4650376, -1576790, 16004659, -12264279, 3369939, -8856223, 7680476, +-7651484, -6703370, -18852758, 27562952, -16951700, 8690866, 5015448, 18833432, -21401822, 4180077, +-8395050, 21382494, 3525631, 956167, 18186502, 4379256, -28346784, -5177583, -4233227, 7150584, +13511430, 9672803, -25572236, 10311143, -19067508, 13073344, -10444287, 1926830, -5551245, 12822625, +-4431333, 2898566, -28480466, 5818607, 15457050, -14722074, 14571750, 651224, 6104759, 7206419, +-10741713, 19319836, 9198746, -2109366, -5400385, 9268003, -5496485, 18591302, -15675557, -2433099, +-14768245, -23328114, 46493020, 3688840, 5657546, -18888192, -13980119, -29866128, 19661824, -8528731, +-6283001, -13095892, -737124, -11696270, -1664837, -1722282, 4975720, 5626407, -1155883, -1581622, +-8676908, 7657927, 7098507, -7192460, 3045132, -16073915, 6073084, 2889976, -3037616, -2661269, +-5559299, 4862440, 849867, -11497091, -3303367, -3505767, -9652402, 15203110, 1342714, -10017474, +1229434, -4037806, 13132936, -4834523, -6551436, 2421288, -8284992, 15475841, 163746, -8829379, +2187212, -3699578, 7359964, -10041097, -2258616, 3090229, -3894999, 6714645, -4230006, 1833414, +2797634, -9058623, 913217, 8704288, -13877039, -1025423, 3739306, -12679280, 22483616, -21028160, +10012106, 3730179, -12458090, 23684598, -16716013, 4035122, 2153389, 10735808, -50200652, -115650584, +30124364, 106738528, 90195384, 121121296, -59973848, -77625088, -116703928, -119228296, 7996156, 88647592, +97827544, 107252312, 35510788, -23493472, -85400592, -141167520, -77484432, 35767952, 55377696, 93963680, +71091912, 19382114, -12856448, -29807610, -70875016, -45867028, -43787728, -8065949, 37002752, 57000660, +29815662, 38035692, 19042274, -21526912, -3582003, -45959372, -64139432, -10979010, -15140297, 11234024, +60054916, 34714072, 29691646, 8822400, -22819698, -23263154, -20272246, -33094870, -8902393, 1478006, +13968844, 17339320, 28616830, 8258685, -1225139, -14507326, -27043798, -2225867, 9494025, 10016401, +16771310, -4188667, -13572634, -6306086, -13514115, -10366440, 2985002, 7934952, 21983790, 18887118, +18289044, 1978906, -7678328, -32321240, -22062174, -2129767, -1344325, 0, 0, 0, +0, 0, 0, }, }, { { 10871099, -4711579, 5091684, 39192, -2043331, -4964446, -1811403, -3577171, -3725884, 773094, -3032784, --1884954, -511101, 3035468, -222801, 1024887, -3275450, -1678795, -3889093, -6316823, 3422015, -2469606, -2666638, 1373853, -1632625, -334471, 3979824, -2336462, -464393, -3007014, -1876364, -1577327, 2162516, 3046206, 2671470, -4293894, 592169, 2261300, 68183, 3236258, 416075, -1008244, -3397856, -1817308, 586263, -960999, 813896, 270046, -2039573, 3583613, 2485176, --4343286, -184684, -236760, 1103807, 3747896, 1523103, -4109747, 595927, 1422171, -3065533, -1148904, 1420560, -567473, 1628330, -434329, -827855, -345208, -2459406, -520765, -998580, --1880122, -345208, 35433, -302258, -652298, -1038845, -5580237, -4926865, 6039798, -1286343, -4816269, 1370632, 7182259, -1729261, -3767760, -2620467, 4377646, 73014, -1635309, -478889, -4958003, -1380295, 878321, 1695438, -3375308, -2605972, -1115081, 862215, -3498251, 824634, -687195, -4090420, -1327682, -2473901, 324807, -1826972, 631360, 6503118, 3358128, -1991791, -304406, -3193308, 2389613, -914828, 3881577, -8136279, -883690, 1165547, -2863133, 431644, -3914863, 2893734, -3614215, -2774549, -2897492, -637803, -2287070, -1273995, -3510599, 1245004, --277562, -4207458, -2079301, -1773822, -157303, 714575, -835908, -566399, 1830193, 542240, --1852205, 840203, 4454418, -2434710, -472983, -4917738, -1672890, -638340, 2055679, -2327336, -630286, 328028, 299574, 7813620, -2538326, 2734821, 6574521, -4822712, -5488968, -556735, --1168231, 224412, 3477313, 2085207, -7744363, 1553168, -4332012, -6018860, -145492, 2627983, -2768643, -1750736, -9664, -359704, 3698504, -392990, 3085397, -998043, 582505, 950798, -1113470, -3670050, 1934883, 3437048, -1203665, 4293357, -1939178, -79994, -4687957, 3864397, -1130113, -940061, -3582003, -3421478, -1478006, -917512, 2158221, -32749, 1895691, 2030446, --3152506, 2517925, -4318590, 2044941, 2895882, 5457830, 5087926, -3741454, 2311229, 181999, --864362, 3411278, -2008434, -2203318, -1778653, 2902324, 1437740, 3652333, -2873333, 5260798, --1289027, 332860, 1659468, 1383516, 3000035, -1460826, 4159676, 5626407, 8862665, 4472135, --9212705, -9908490, 1138703, -788127, 2361158, 2236604, 6550362, 3005403, 3118146, 1633161, --3228205, 1289564, 8255464, -5476620, -656593, 321586, 6606197, 4072166, 875100, 3027415, --586263, 2363306, 2995740, 6905771, 3697967, 3924526, 1968706, 1744831, 3223373, 1315871, --4859219, 3034931, 3802657, -1270237, 2720325, 3898757, -1458678, 1326071, 4544613, 1887101, --1306744, 1847373, 4610648, -79457, -258235, -770947, 1093069, 4682051, -1573032, -2340757, -1033477, -1351841, 2086817, 3041374, -3664681, 951335, -2509872, 421444, 990527, 4049617, -2695629, -7677254, -479426, 4209605, -2541010, -2979634, -127775, 986232, 3271155, 96637, --9240622, -3223910, 1880122, -1773285, 2956548, -339839, -17015050, 2141041, 1515050, 7624641, --525597, 5909875, 2913599, 1352378, -10073846, -190589, -382789, -7840463, 987306, 5509370, -845035, -309238, -965294, -3244848, -3743064, 1362578, 1999844, -466004, 1245004, 1561221, -6596533, 592706, 2769180, 3009698, -3874597, 584116, -1130113, -1186485, -748398, 2333241, --687195, -1914482, -3053185, -1842541, 569083, -5082557, -3790309, 1858110, -4214974, 1067299, --6722161, -7851200, -2298881, 9241696, -2859911, -775242, 5207648, 1644973, 26307, 5735392, --1245541, 423054, -1173063, 1493038, 3402151, -1774358, -6422587, 3520263, -3956739, -6942815, --3143379, -2204392, -543850, 2040646, 6597607, -405874, -698469, -3346853, -963146, 3560528, --2812667, -3106872, 3905199, 15028627, 556198, -838592, -5610301, -3192771, 7958038, -3122441, -6225555, 5380521, -5962489, -902480, 4682051, -3289945, -1568200, -1491427, -2124935, 1079647, -1717450, 374736, 2945274, -1218697, 512175, 1187559, -1150514, -2728915, -2892661, -3229279, -326954, 4006131, 1757715, -3177202, 371515, 1659468, 7496866, -2071785, 6720013, -5921686, -2813741, 4938676, -3090229, -1781338, -6101538, 3075197, 20401, -4170950, 4384625, -5202816, -6123550, -144418, 8634495, 2158221, 1037235, 2272575, 3670050, 2117419, -2633352, 4446902, --645856, -4242354, -6880001, -1642825, 3154654, -3229816, -2093797, 3067681, -3711926, 8070781, --7162395, 363998, 5269388, -3779034, -1304596, -7242389, -96100, -2365990, -1017907, -1217623, -7192460, 12750684, -3760244, -5596880, 1443646, -2306934, 3506304, 11596412, 56371, -2718714, -3678640, 1957968, 3433290, 2041183, -6341519, 185757, -5658620, 3094524, 2727841, 1605244, -10633265, -573915, 7928510, -278636, -195958, 2338073, -65498, 8264054, 1106491, 5166309, --1937567, 7023346, -3204583, 3692061, 14111115, -2420214, -3552475, 9820980, 2102923, 6345278, --146566, -6327561, 1941325, -3723737, 4278861, -7619272, -977642, -4056060, 4224101, -832687, -892279, 7464653, -3703336, -7961259, 2199560, -926102, -321049, 5964099, 1260573, 578210, --2753611, -5423470, -5305895, -2179696, -4346507, -3780108, 4732517, -2787971, -271120, -2210835, -767189, -574452, 4429722, 1884954, -4211753, -7595650, 17916992, -8825621, 6529424, 624918, -3405909, -3848291, -2950106, -1538135, 4180614, 5307506, 1407676, -2292439, -4737349, 3069828, -5208722, -540092, 1880122, -2181844, 5641977, 2377265, -9580998, -2839510, 3550327, -150861, --3872450, 235149, 4869419, -2876554, 1882806, -6012418, 4117800, 8623757, -3034395, 9102646, -641024, -1105954, 6104223, 227633, 792421, 5691369, -10896332, 2182380, 3760244, 5287105, -3586835, 4250407, -4690641, -3389266, 182536, 2328409, -5101885, 2354716, 5681168, 5331665, -2142652, 15139760, -4202626, -1230508, -6197638, -2210298, -3914326, -5424007, 7927436, 3793530, -7772280, -452045, -11258720, 7559143, -3636227, 4531728, 3915400, 2483028, 2646774, -8315594, -11716671, 3533148, -21971442, -18640694, -17271138, 2702071, 2390149, 432718, -235149, -2093260, --2244657, -486942, -3764002, -6839736, -5103495, -11278584, -5573794, -5941551, 5191005, -8873402, --4537633, -5412733, 317828, -809601, -3095061, 1427003, -1728724, -9164923, -1214402, 6698002, --76236, -8267275, -7589207, 1963337, -3716221, 5484137, 3388192, -7855495, 5778342, 9979357, --10223096, -10211822, -6119255, 2542621, 7489349, -7037304, -7524246, 2380486, -4853850, -217970, --2018098, -1686848, -11127723, 992674, 4753455, -3986267, 2164127, -5842766, -7156490, -6743099, --4210142, -10961293, 15788837, -4599910, -2570538, 2010045, 402116, 2637647, 809601, 4295504, -837519, 3536906, 8907225, -14886894, 7727183, -4540854, -4721243, -1845762, -20683488, 15814606, -4207994, 3403225, -3798362, 15437723, -2392297, 7215008, 47245, 6461242, -9142375, 3519189, -3730179, 1255741, -4413079, 13627394, -3594351, 4007205, 3345780, 14104136, -9478456, -877247, -4196720, -2763812, -6862284, 3984119, -6419903, 1402844, 2101850, -8185671, 3330210, 264677, -714038, 15353971, 10197326, -1755568, -6081674, -5507222, 3909494, -1338419, -9033390, 2148021, --386547, 2212445, 7589744, 9873056, -6696391, 6476811, 4102768, -5421860, 3973382, 1997160, --6843494, -4826470, -4028143, 6648610, -7432441, -7813620, -17869748, -14622216, 4555350, -3639448, --1839320, -8341900, -13526999, 4239670, 2092186, -1867237, 8144869, 4392141, 9697499, 3161633, -3411278, -2524367, 2935073, 6583648, -5362804, 5995775, -24565066, 23534810, 17033304, -6360310, --5288716, 6652905, 489626, 975494, 11470247, 8213588, 762357, -1222992, 4888747, -2165201, --1146756, 3510062, -4490925, 6605660, 4716411, -4770635, 7160784, -330712, 2275796, -99858, --10537165, -229244, 8498130, 8691403, 3749507, 3939022, 4949950, -4753992, -5988258, 3176665, -5503464, 162672, -1987496, -5291400, 2879239, -1296006, 7616588, 8694624, -382789, 9964324, --4438312, 11059004, 6374805, 13251585, 1519345, 2224793, -3111704, -4939750, -377420, 10230612, -16818018, 1297617, 12996034, -5009006, -11130945, 1876901, 5195837, -10059887, 11547020, -3301756, -4631586, -22538914, -8908836, 63351, -4499515, 4589173, 8626442, 15968152, 4568235, 281857, --6193880, -12885439, 7154342, -8702141, 17670032, -6138582, 2993592, 13488882, 13883482, 79994, --6433861, -2934000, -2957622, 2007360, -8612483, -6539625, 8990440, 3088618, 6121402, 7371775, -8391292, -2228551, 5777805, -715112, 6727530, 25169582, 6617471, -10457708, 12211129, 14079977, -1515587, -967441, 1636383, -5213554, -7863012, -3413962, 14142790, 10076530, 8261907, 12456479, -3237869, -667867, -4185983, -12955769, 7577933, 8828305, 5156108, -913754, -768799, -3538516, -2988760, 13006772, 9012452, -11836930, 9816148, -9707700, 12870406, 4066260, 5506148, 6883759, --861678, -4660040, -775778, 6507949, 21629456, -1401233, 11457899, -2561948, -7920457, 12990129, -11178726, 4840965, 3768297, 12528420, 5150203, 3801046, 861141, 8639327, -4141422, 8762270, -11209865, -12562779, 8712878, 5021891, -2862059, 859530, 6084358, -5246840, -10955925, 16843252, -3881577, 3237869, 3406446, 9978820, 3189550, -10053982, 11025181, -14429480, -16502875, 1445257, -2357400, -9356586, -2692408, -27596238, -19108310, -14775224, -4567698, -15217606, -7023882, 5577015, --13139916, 9351754, 9203041, -11241003, 14733885, 7397545, -2304787, -1673964, -6875706, 56371, --12655658, 28643136, 9012989, 4188130, -13867376, 3165928, -3860639, 18802294, -3236795, -922344, --16864190, 16675211, 1820529, 6204617, 6262599, 9438191, 6393059, -4494147, 6487011, -9212705, -9448928, -3886946, 5921686, -14507326, 31786516, 3761318, -13469017, 6684580, 9941239, 5772973, -11461120, 7420630, -12974559, -21304648, 7340636, -2004676, -1105954, 14334453, -1367410, -1210107, -2368675, 12939126, -2010582, 7982734, -4714801, -5796595, -7650948, -10044318, 20368346, 11089606, -8100845, -5007932, -16525960, -20607790, 11551315, 8225936, -6547141, 6203007, -4075924, 1559073, -20328080, 9418863, -4267050, 11385958, -2311229, 6411850, -5193689, 7537131, -12952011, -19763828, --6865505, -8233453, -339302, 25409026, -18569828, 12520367, 7864085, 6036577, -3083787, 10649908, -5602785, -17969606, -22865870, -7546258, -9667435, 28493350, 21284248, -5558225, -10783052, 69793, --11063299, -1554241, 21488796, 19590420, 12070469, -15187004, 5167383, -11603391, 21726092, 10657424, --311385, 1257889, 8647380, -10571525, 4704063, 19031000, 11821361, -14217952, 19884088, -4958540, -11633456, -17007534, -6172405, 30506616, 14593762, 17872970, 5023501, -24029806, 8506720, -19385334, -14086419, 37856916, 14143864, 23976654, -9561134, 7356742, 11818139, -521839, 3804804, -8964670, -3470871, 15188078, 1844152, -3359738, -12100533, 7793218, 6598681, -12953621, 8201777, -4625143, -11520713, 15171972, 16895864, 19284404, 3201361, -14173392, 5310190, 9314710, 1245004, 26041998, -3721052, -29093034, -16972638, 8753680, -5914707, -34435436, 2916820, 15163919, 7201050, 1877438, --1354525, 18633178, -12495670, -17552458, -1445793, -6102612, -15260556, -682900, 3514894, -9841918, --12569759, -8881455, 3302293, 2458332, -18842558, 6771016, -5991480, 5616207, 28281822, -2966212, --4933844, 17973902, 1278290, 15353971, -8559870, 10927471, 7288560, -11236171, -3642669, 24768540, -2874407, -34876744, -15984258, 20980916, -31217432, 17109540, -29557964, 1957968, -5034239, -42616276, --5928666, 18577344, 38478612, 11950747, -5996311, 9008694, -15243376, -5417028, -34221764, -2306934, --23344220, -3735548, -5361730, -16326244, -17191144, -6023692, 9393630, -15702937, 10237591, 18984830, --20279762, 6839199, 6177237, 3027952, -21545166, -3648038, -480499, -22680648, 5561446, 28002650, --2397666, -41591928, 14363444, -25261924, -63774896, 17563732, -26500486, -33029372, 1529008, -15300284, -4328254, 10914586, -6469832, 16428787, -14197014, 14327474, -11757473, -28715078, -62814, 20092930, -19257560, -37199784, 5146982, -4650376, -27860380, -7582228, -7255811, 47645684, 23318452, 27828704, -11977590, 11887933, 28394566, 42065448, -11802033, -21050708, -8188355, 54160076, 58725624, -36939404, --15489263, 25288230, -13654775, 9220758, -18207440, 3370476, -18639622, -33964600, 42631308, 4722854, -12479027, 9602473, 2812667, 4045322, 46708, 7161321, 9691594, -33024004, -26968636, -24365350, --22478786, -17777944, -11192148, -10173167, -17845052, -11345156, -15247671, 14273250, 11271605, 4316442, --8782671, 1370632, -33972116, -18540836, 8138426, -31994286, -3577708, 12661564, 25201258, 1820529, -4351876, -13096966, -20010252, -24902220, 17855252, -4519380, 17753784, -66216584, 3648575, -9520869, -7126962, 37166500, 4668630, 4469451, 4400194, -13577465, -13103408, -1721745, -2332704, -38096896, -8197482, -15254113, 33012192, 173409, -34430604, -50066972, -28617368, -7737921, -32061930, -34342020, --18248242, 23234700, -4818417, -8994198, -14936286, 64441688, -34896608, 25589952, 45885820, -19471772, -7682086, 37452652, -43634184, 3819300, 6318434, 23990076, -49221400, 4999879, 4556424, 18869938, --20913806, 2655364, 10074383, -27197344, 5392869, 315680, -4628901, 19007914, -4052302, -1695438, -7697655, -994285, -4315906, 19039054, -14302241, 7561827, -5563057, 7374459, -9049496, -1891396, --11220065, 3747896, 2690260, 35101156, 10772315, 19164680, -2889976, 4479651, 23450522, 3353296, --8651138, 17603460, 9673877, -5646809, -30429306, 32995012, -30404610, 10398116, 14395120, 24912958, --30085710, 38092064, 50903416, -21319144, -52492552, 76946488, 24116242, -26492432, 15290620, -24385750, --41890428, -10728291, -8433705, -31832686, 33646772, -46858632, 16428250, 44674104, -26287884, -56195352, -59880972, -14544370, 35530652, -22362284, -17701708, -36091684, -16199543, 22408454, 17646410, -9218074, --11480984, 12174622, 29671244, -11892764, 22584548, 26640072, -17757542, -2167885, 16756815, -3659312, -717260, -4824859, 2206540, -26256746, 8139500, -5510443, 1745367, 6815576, -4510790, 5870147, --10201621, -22012244, -9687299, -38602628, 5775658, 208843, -4882841, 7489349, 4650376, -2291902, --7912404, 15865609, 25697326, -25783762, 38978976, -4113505, 6083821, 5648956, 34607236, 15527917, -25618944, -30738008, -6578280, -5710696, 44857176, -40793600, -12846247, 20003810, -343597, -47143172, -4347044, -9707163, -6890202, 21570936, 24806658, 1729261, -16473347, 38257420, -14766634, 63839856, -2206003, -28962576, 1466195, -4123169, -31549756, 65850440, 15600932, -4965519, -54742044, 15275588, -20387672, 12794171, 49112416, -8256538, 12026982, -3643206, -23578296, 13329431, -14561013, -8011725, -11157788, 22375706, -21407728, 25617870, 4185983, -472983, 51948704, -9531069, -4204773, 38611756, --22779970, 34154116, 15951509, -7308961, 14902463, 14694157, 32838246, 33030982, 11083163, -25872346, -56894896, -54916524, 3621194, 50799800, -25307558, 11520713, -4101157, -6220724, -56426208, 39895952, -12514461, 17792976, 20704964, -11996381, -26854284, -21786758, -15400142, 2755222, 57892936, 285078, -46060840, -14652281, -30783642, 1567126, 15384036, -27885076, 47719236, 17658222, 25248502, 43453796, -32146756, -47973176, 21944062, -68647000, -79207248, 561030, 75374528, 42701100, 11471858, -51566452, --170944528, -34881040, 63880124, 60076392, 101814888, -9392557, 7224672, -43581032, 36612984, -27366994, --4781909, -17678086, 16962974, -19844360, -932545, -1971927, -5518496, 4242891, 18626200, -19638202, -8564702, 1754494, -4763656, 500901, 13027173, -16497506, -4804995, -2178085, 27224188, -27516244, -7106561, -11861626, 17907866, -19951734, -6098854, 7351911, -4280472, 4272956, -13511967, -1876364, -11482595, -3129421, 4163971, 4282620, 2032056, 15410880, -14253386, 9910100, 10204842, 13890998, --2408403, -30120606, 3365107, 4366371, 11924977, 12207371, -2894271, 3874597, -5879810, -13139916, --3120831, 7331509, -3424700, 19677392, -16063715, -3988951, -31278636, 10203769, 2307471, -3559991, -5721434, 7278359, -1619740, -14181445, 3546032, 17060146, -4576825, -151934, 3992172, -3416647, -8390219, -2328946, -24713778, 60436632, 16589848, 15042586, -7813083, -19157164, -18405008, 5411659, -11872363, 1984275, -517007, 69793, -8631811, -1471026, 4413079, -2206003, 2006287, -817118, --8635032, -336618, 4562866, 7006166, -5944235, 1808181, 4613332, -8678518, 14638322, -8650064, --7434052, -7486128, 2189360, 4327180, 6918119, -7203197, 9569724, -13357348, 9153112, 8055748, --5687074, -513785, -182536, -1451162, 7204808, -7391102, 2443300, -2299955, -9416716, 13813689, --7391102, -170188, -5395553, -1688996, 9861245, -12402792, 5388574, 3546569, -5138392, 4670777, --10326175, 3172370, 4776541, -7837242, 550830, 4329327, -6942815, 7423314, -9706626, 2872260, -10782515, -15102179, 4816269, -5751498, 1529008, 5965710, -4029216, -2348810, 8896488, -46728708, --109448648, 30798674, 106858784, 73448776, 116210544, -64918432, -69098504, -94162864, -108986408, 2201171, -83832392, 86625736, 90436440, 17648558, -30079266, -59530396, -85397912, -72388992, 5481989, 55999932, -66432944, 59776816, 14186277, -16683264, -10487236, -46905876, -52469468, -22199612, -1574106, 20000588, -43970800, 21426518, 15854872, 21975738, -11183558, -26363046, -4444755, -42072424, -19828254, 343597, -6512244, 31857384, 37083820, 3189550, -5785858, -3609383, -27617176, -7552700, -525597, -5822365, -9373766, 18295486, -4056597, -1555852, -7349226, -11577084, 2234994, 1053878, -1366337, 20688320, -13952738, 5138929, -611496, -19605988, -28362354, -22376780, 1596654, 21132850, 18128520, 23909546, -3385508, 1022202, 5804112, -28398860, -15374372, -7304666, 374736, 1276679, 0, 0, -0, 0, 0, }, +4711579, 5091684, 39192, -2043331, -4964446, -1811403, -3577171, -3725884, 773094, -3032784, +-1884954, -511101, 3035468, -222801, 1024887, -3275450, -1678795, -3889093, -6316823, 3422015, +2469606, -2666638, 1373853, -1632625, -334471, 3979824, -2336462, -464393, -3007014, -1876364, +1577327, 2162516, 3046206, 2671470, -4293894, 592169, 2261300, 68183, 3236258, 416075, +1008244, -3397856, -1817308, 586263, -960999, 813896, 270046, -2039573, 3583613, 2485176, +-4343286, -184684, -236760, 1103807, 3747896, 1523103, -4109747, 595927, 1422171, -3065533, +1148904, 1420560, -567473, 1628330, -434329, -827855, -345208, -2459406, -520765, -998580, +-1880122, -345208, 35433, -302258, -652298, -1038845, -5580237, -4926865, 6039798, -1286343, +4816269, 1370632, 7182259, -1729261, -3767760, -2620467, 4377646, 73014, -1635309, -478889, +4958003, -1380295, 878321, 1695438, -3375308, -2605972, -1115081, 862215, -3498251, 824634, +687195, -4090420, -1327682, -2473901, 324807, -1826972, 631360, 6503118, 3358128, -1991791, +304406, -3193308, 2389613, -914828, 3881577, -8136279, -883690, 1165547, -2863133, 431644, +3914863, 2893734, -3614215, -2774549, -2897492, -637803, -2287070, -1273995, -3510599, 1245004, +-277562, -4207458, -2079301, -1773822, -157303, 714575, -835908, -566399, 1830193, 542240, +-1852205, 840203, 4454418, -2434710, -472983, -4917738, -1672890, -638340, 2055679, -2327336, +630286, 328028, 299574, 7813620, -2538326, 2734821, 6574521, -4822712, -5488968, -556735, +-1168231, 224412, 3477313, 2085207, -7744363, 1553168, -4332012, -6018860, -145492, 2627983, +2768643, -1750736, -9664, -359704, 3698504, -392990, 3085397, -998043, 582505, 950798, +1113470, -3670050, 1934883, 3437048, -1203665, 4293357, -1939178, -79994, -4687957, 3864397, +1130113, -940061, -3582003, -3421478, -1478006, -917512, 2158221, -32749, 1895691, 2030446, +-3152506, 2517925, -4318590, 2044941, 2895882, 5457830, 5087926, -3741454, 2311229, 181999, +-864362, 3411278, -2008434, -2203318, -1778653, 2902324, 1437740, 3652333, -2873333, 5260798, +-1289027, 332860, 1659468, 1383516, 3000035, -1460826, 4159676, 5626407, 8862665, 4472135, +-9212705, -9908490, 1138703, -788127, 2361158, 2236604, 6550362, 3005403, 3118146, 1633161, +-3228205, 1289564, 8255464, -5476620, -656593, 321586, 6606197, 4072166, 875100, 3027415, +-586263, 2363306, 2995740, 6905771, 3697967, 3924526, 1968706, 1744831, 3223373, 1315871, +-4859219, 3034931, 3802657, -1270237, 2720325, 3898757, -1458678, 1326071, 4544613, 1887101, +-1306744, 1847373, 4610648, -79457, -258235, -770947, 1093069, 4682051, -1573032, -2340757, +1033477, -1351841, 2086817, 3041374, -3664681, 951335, -2509872, 421444, 990527, 4049617, +2695629, -7677254, -479426, 4209605, -2541010, -2979634, -127775, 986232, 3271155, 96637, +-9240622, -3223910, 1880122, -1773285, 2956548, -339839, -17015050, 2141041, 1515050, 7624641, +-525597, 5909875, 2913599, 1352378, -10073846, -190589, -382789, -7840463, 987306, 5509370, +845035, -309238, -965294, -3244848, -3743064, 1362578, 1999844, -466004, 1245004, 1561221, +6596533, 592706, 2769180, 3009698, -3874597, 584116, -1130113, -1186485, -748398, 2333241, +-687195, -1914482, -3053185, -1842541, 569083, -5082557, -3790309, 1858110, -4214974, 1067299, +-6722161, -7851200, -2298881, 9241696, -2859911, -775242, 5207648, 1644973, 26307, 5735392, +-1245541, 423054, -1173063, 1493038, 3402151, -1774358, -6422587, 3520263, -3956739, -6942815, +-3143379, -2204392, -543850, 2040646, 6597607, -405874, -698469, -3346853, -963146, 3560528, +-2812667, -3106872, 3905199, 15028627, 556198, -838592, -5610301, -3192771, 7958038, -3122441, +6225555, 5380521, -5962489, -902480, 4682051, -3289945, -1568200, -1491427, -2124935, 1079647, +1717450, 374736, 2945274, -1218697, 512175, 1187559, -1150514, -2728915, -2892661, -3229279, +326954, 4006131, 1757715, -3177202, 371515, 1659468, 7496866, -2071785, 6720013, -5921686, +2813741, 4938676, -3090229, -1781338, -6101538, 3075197, 20401, -4170950, 4384625, -5202816, +6123550, -144418, 8634495, 2158221, 1037235, 2272575, 3670050, 2117419, -2633352, 4446902, +-645856, -4242354, -6880001, -1642825, 3154654, -3229816, -2093797, 3067681, -3711926, 8070781, +-7162395, 363998, 5269388, -3779034, -1304596, -7242389, -96100, -2365990, -1017907, -1217623, +7192460, 12750684, -3760244, -5596880, 1443646, -2306934, 3506304, 11596412, 56371, -2718714, +3678640, 1957968, 3433290, 2041183, -6341519, 185757, -5658620, 3094524, 2727841, 1605244, +10633265, -573915, 7928510, -278636, -195958, 2338073, -65498, 8264054, 1106491, 5166309, +-1937567, 7023346, -3204583, 3692061, 14111115, -2420214, -3552475, 9820980, 2102923, 6345278, +-146566, -6327561, 1941325, -3723737, 4278861, -7619272, -977642, -4056060, 4224101, -832687, +892279, 7464653, -3703336, -7961259, 2199560, -926102, -321049, 5964099, 1260573, 578210, +-2753611, -5423470, -5305895, -2179696, -4346507, -3780108, 4732517, -2787971, -271120, -2210835, +767189, -574452, 4429722, 1884954, -4211753, -7595650, 17916992, -8825621, 6529424, 624918, +3405909, -3848291, -2950106, -1538135, 4180614, 5307506, 1407676, -2292439, -4737349, 3069828, +5208722, -540092, 1880122, -2181844, 5641977, 2377265, -9580998, -2839510, 3550327, -150861, +-3872450, 235149, 4869419, -2876554, 1882806, -6012418, 4117800, 8623757, -3034395, 9102646, +641024, -1105954, 6104223, 227633, 792421, 5691369, -10896332, 2182380, 3760244, 5287105, +3586835, 4250407, -4690641, -3389266, 182536, 2328409, -5101885, 2354716, 5681168, 5331665, +2142652, 15139760, -4202626, -1230508, -6197638, -2210298, -3914326, -5424007, 7927436, 3793530, +7772280, -452045, -11258720, 7559143, -3636227, 4531728, 3915400, 2483028, 2646774, -8315594, +11716671, 3533148, -21971442, -18640694, -17271138, 2702071, 2390149, 432718, -235149, -2093260, +-2244657, -486942, -3764002, -6839736, -5103495, -11278584, -5573794, -5941551, 5191005, -8873402, +-4537633, -5412733, 317828, -809601, -3095061, 1427003, -1728724, -9164923, -1214402, 6698002, +-76236, -8267275, -7589207, 1963337, -3716221, 5484137, 3388192, -7855495, 5778342, 9979357, +-10223096, -10211822, -6119255, 2542621, 7489349, -7037304, -7524246, 2380486, -4853850, -217970, +-2018098, -1686848, -11127723, 992674, 4753455, -3986267, 2164127, -5842766, -7156490, -6743099, +-4210142, -10961293, 15788837, -4599910, -2570538, 2010045, 402116, 2637647, 809601, 4295504, +837519, 3536906, 8907225, -14886894, 7727183, -4540854, -4721243, -1845762, -20683488, 15814606, +4207994, 3403225, -3798362, 15437723, -2392297, 7215008, 47245, 6461242, -9142375, 3519189, +3730179, 1255741, -4413079, 13627394, -3594351, 4007205, 3345780, 14104136, -9478456, -877247, +4196720, -2763812, -6862284, 3984119, -6419903, 1402844, 2101850, -8185671, 3330210, 264677, +714038, 15353971, 10197326, -1755568, -6081674, -5507222, 3909494, -1338419, -9033390, 2148021, +-386547, 2212445, 7589744, 9873056, -6696391, 6476811, 4102768, -5421860, 3973382, 1997160, +-6843494, -4826470, -4028143, 6648610, -7432441, -7813620, -17869748, -14622216, 4555350, -3639448, +-1839320, -8341900, -13526999, 4239670, 2092186, -1867237, 8144869, 4392141, 9697499, 3161633, +3411278, -2524367, 2935073, 6583648, -5362804, 5995775, -24565066, 23534810, 17033304, -6360310, +-5288716, 6652905, 489626, 975494, 11470247, 8213588, 762357, -1222992, 4888747, -2165201, +-1146756, 3510062, -4490925, 6605660, 4716411, -4770635, 7160784, -330712, 2275796, -99858, +-10537165, -229244, 8498130, 8691403, 3749507, 3939022, 4949950, -4753992, -5988258, 3176665, +5503464, 162672, -1987496, -5291400, 2879239, -1296006, 7616588, 8694624, -382789, 9964324, +-4438312, 11059004, 6374805, 13251585, 1519345, 2224793, -3111704, -4939750, -377420, 10230612, +16818018, 1297617, 12996034, -5009006, -11130945, 1876901, 5195837, -10059887, 11547020, -3301756, +4631586, -22538914, -8908836, 63351, -4499515, 4589173, 8626442, 15968152, 4568235, 281857, +-6193880, -12885439, 7154342, -8702141, 17670032, -6138582, 2993592, 13488882, 13883482, 79994, +-6433861, -2934000, -2957622, 2007360, -8612483, -6539625, 8990440, 3088618, 6121402, 7371775, +8391292, -2228551, 5777805, -715112, 6727530, 25169582, 6617471, -10457708, 12211129, 14079977, +1515587, -967441, 1636383, -5213554, -7863012, -3413962, 14142790, 10076530, 8261907, 12456479, +3237869, -667867, -4185983, -12955769, 7577933, 8828305, 5156108, -913754, -768799, -3538516, +2988760, 13006772, 9012452, -11836930, 9816148, -9707700, 12870406, 4066260, 5506148, 6883759, +-861678, -4660040, -775778, 6507949, 21629456, -1401233, 11457899, -2561948, -7920457, 12990129, +11178726, 4840965, 3768297, 12528420, 5150203, 3801046, 861141, 8639327, -4141422, 8762270, +11209865, -12562779, 8712878, 5021891, -2862059, 859530, 6084358, -5246840, -10955925, 16843252, +3881577, 3237869, 3406446, 9978820, 3189550, -10053982, 11025181, -14429480, -16502875, 1445257, +2357400, -9356586, -2692408, -27596238, -19108310, -14775224, -4567698, -15217606, -7023882, 5577015, +-13139916, 9351754, 9203041, -11241003, 14733885, 7397545, -2304787, -1673964, -6875706, 56371, +-12655658, 28643136, 9012989, 4188130, -13867376, 3165928, -3860639, 18802294, -3236795, -922344, +-16864190, 16675211, 1820529, 6204617, 6262599, 9438191, 6393059, -4494147, 6487011, -9212705, +9448928, -3886946, 5921686, -14507326, 31786516, 3761318, -13469017, 6684580, 9941239, 5772973, +11461120, 7420630, -12974559, -21304648, 7340636, -2004676, -1105954, 14334453, -1367410, -1210107, +2368675, 12939126, -2010582, 7982734, -4714801, -5796595, -7650948, -10044318, 20368346, 11089606, +8100845, -5007932, -16525960, -20607790, 11551315, 8225936, -6547141, 6203007, -4075924, 1559073, +20328080, 9418863, -4267050, 11385958, -2311229, 6411850, -5193689, 7537131, -12952011, -19763828, +-6865505, -8233453, -339302, 25409026, -18569828, 12520367, 7864085, 6036577, -3083787, 10649908, +5602785, -17969606, -22865870, -7546258, -9667435, 28493350, 21284248, -5558225, -10783052, 69793, +-11063299, -1554241, 21488796, 19590420, 12070469, -15187004, 5167383, -11603391, 21726092, 10657424, +-311385, 1257889, 8647380, -10571525, 4704063, 19031000, 11821361, -14217952, 19884088, -4958540, +11633456, -17007534, -6172405, 30506616, 14593762, 17872970, 5023501, -24029806, 8506720, -19385334, +14086419, 37856916, 14143864, 23976654, -9561134, 7356742, 11818139, -521839, 3804804, -8964670, +3470871, 15188078, 1844152, -3359738, -12100533, 7793218, 6598681, -12953621, 8201777, -4625143, +11520713, 15171972, 16895864, 19284404, 3201361, -14173392, 5310190, 9314710, 1245004, 26041998, +3721052, -29093034, -16972638, 8753680, -5914707, -34435436, 2916820, 15163919, 7201050, 1877438, +-1354525, 18633178, -12495670, -17552458, -1445793, -6102612, -15260556, -682900, 3514894, -9841918, +-12569759, -8881455, 3302293, 2458332, -18842558, 6771016, -5991480, 5616207, 28281822, -2966212, +-4933844, 17973902, 1278290, 15353971, -8559870, 10927471, 7288560, -11236171, -3642669, 24768540, +2874407, -34876744, -15984258, 20980916, -31217432, 17109540, -29557964, 1957968, -5034239, -42616276, +-5928666, 18577344, 38478612, 11950747, -5996311, 9008694, -15243376, -5417028, -34221764, -2306934, +-23344220, -3735548, -5361730, -16326244, -17191144, -6023692, 9393630, -15702937, 10237591, 18984830, +-20279762, 6839199, 6177237, 3027952, -21545166, -3648038, -480499, -22680648, 5561446, 28002650, +-2397666, -41591928, 14363444, -25261924, -63774896, 17563732, -26500486, -33029372, 1529008, -15300284, +4328254, 10914586, -6469832, 16428787, -14197014, 14327474, -11757473, -28715078, -62814, 20092930, +19257560, -37199784, 5146982, -4650376, -27860380, -7582228, -7255811, 47645684, 23318452, 27828704, +11977590, 11887933, 28394566, 42065448, -11802033, -21050708, -8188355, 54160076, 58725624, -36939404, +-15489263, 25288230, -13654775, 9220758, -18207440, 3370476, -18639622, -33964600, 42631308, 4722854, +12479027, 9602473, 2812667, 4045322, 46708, 7161321, 9691594, -33024004, -26968636, -24365350, +-22478786, -17777944, -11192148, -10173167, -17845052, -11345156, -15247671, 14273250, 11271605, 4316442, +-8782671, 1370632, -33972116, -18540836, 8138426, -31994286, -3577708, 12661564, 25201258, 1820529, +4351876, -13096966, -20010252, -24902220, 17855252, -4519380, 17753784, -66216584, 3648575, -9520869, +7126962, 37166500, 4668630, 4469451, 4400194, -13577465, -13103408, -1721745, -2332704, -38096896, +8197482, -15254113, 33012192, 173409, -34430604, -50066972, -28617368, -7737921, -32061930, -34342020, +-18248242, 23234700, -4818417, -8994198, -14936286, 64441688, -34896608, 25589952, 45885820, -19471772, +7682086, 37452652, -43634184, 3819300, 6318434, 23990076, -49221400, 4999879, 4556424, 18869938, +-20913806, 2655364, 10074383, -27197344, 5392869, 315680, -4628901, 19007914, -4052302, -1695438, +7697655, -994285, -4315906, 19039054, -14302241, 7561827, -5563057, 7374459, -9049496, -1891396, +-11220065, 3747896, 2690260, 35101156, 10772315, 19164680, -2889976, 4479651, 23450522, 3353296, +-8651138, 17603460, 9673877, -5646809, -30429306, 32995012, -30404610, 10398116, 14395120, 24912958, +-30085710, 38092064, 50903416, -21319144, -52492552, 76946488, 24116242, -26492432, 15290620, -24385750, +-41890428, -10728291, -8433705, -31832686, 33646772, -46858632, 16428250, 44674104, -26287884, -56195352, +59880972, -14544370, 35530652, -22362284, -17701708, -36091684, -16199543, 22408454, 17646410, -9218074, +-11480984, 12174622, 29671244, -11892764, 22584548, 26640072, -17757542, -2167885, 16756815, -3659312, +717260, -4824859, 2206540, -26256746, 8139500, -5510443, 1745367, 6815576, -4510790, 5870147, +-10201621, -22012244, -9687299, -38602628, 5775658, 208843, -4882841, 7489349, 4650376, -2291902, +-7912404, 15865609, 25697326, -25783762, 38978976, -4113505, 6083821, 5648956, 34607236, 15527917, +25618944, -30738008, -6578280, -5710696, 44857176, -40793600, -12846247, 20003810, -343597, -47143172, +4347044, -9707163, -6890202, 21570936, 24806658, 1729261, -16473347, 38257420, -14766634, 63839856, +2206003, -28962576, 1466195, -4123169, -31549756, 65850440, 15600932, -4965519, -54742044, 15275588, +20387672, 12794171, 49112416, -8256538, 12026982, -3643206, -23578296, 13329431, -14561013, -8011725, +11157788, 22375706, -21407728, 25617870, 4185983, -472983, 51948704, -9531069, -4204773, 38611756, +-22779970, 34154116, 15951509, -7308961, 14902463, 14694157, 32838246, 33030982, 11083163, -25872346, +56894896, -54916524, 3621194, 50799800, -25307558, 11520713, -4101157, -6220724, -56426208, 39895952, +12514461, 17792976, 20704964, -11996381, -26854284, -21786758, -15400142, 2755222, 57892936, 285078, +46060840, -14652281, -30783642, 1567126, 15384036, -27885076, 47719236, 17658222, 25248502, 43453796, +32146756, -47973176, 21944062, -68647000, -79207248, 561030, 75374528, 42701100, 11471858, -51566452, +-170944528, -34881040, 63880124, 60076392, 101814888, -9392557, 7224672, -43581032, 36612984, -27366994, +-4781909, -17678086, 16962974, -19844360, -932545, -1971927, -5518496, 4242891, 18626200, -19638202, +8564702, 1754494, -4763656, 500901, 13027173, -16497506, -4804995, -2178085, 27224188, -27516244, +7106561, -11861626, 17907866, -19951734, -6098854, 7351911, -4280472, 4272956, -13511967, -1876364, +11482595, -3129421, 4163971, 4282620, 2032056, 15410880, -14253386, 9910100, 10204842, 13890998, +-2408403, -30120606, 3365107, 4366371, 11924977, 12207371, -2894271, 3874597, -5879810, -13139916, +-3120831, 7331509, -3424700, 19677392, -16063715, -3988951, -31278636, 10203769, 2307471, -3559991, +5721434, 7278359, -1619740, -14181445, 3546032, 17060146, -4576825, -151934, 3992172, -3416647, +8390219, -2328946, -24713778, 60436632, 16589848, 15042586, -7813083, -19157164, -18405008, 5411659, +11872363, 1984275, -517007, 69793, -8631811, -1471026, 4413079, -2206003, 2006287, -817118, +-8635032, -336618, 4562866, 7006166, -5944235, 1808181, 4613332, -8678518, 14638322, -8650064, +-7434052, -7486128, 2189360, 4327180, 6918119, -7203197, 9569724, -13357348, 9153112, 8055748, +-5687074, -513785, -182536, -1451162, 7204808, -7391102, 2443300, -2299955, -9416716, 13813689, +-7391102, -170188, -5395553, -1688996, 9861245, -12402792, 5388574, 3546569, -5138392, 4670777, +-10326175, 3172370, 4776541, -7837242, 550830, 4329327, -6942815, 7423314, -9706626, 2872260, +10782515, -15102179, 4816269, -5751498, 1529008, 5965710, -4029216, -2348810, 8896488, -46728708, +-109448648, 30798674, 106858784, 73448776, 116210544, -64918432, -69098504, -94162864, -108986408, 2201171, +83832392, 86625736, 90436440, 17648558, -30079266, -59530396, -85397912, -72388992, 5481989, 55999932, +66432944, 59776816, 14186277, -16683264, -10487236, -46905876, -52469468, -22199612, -1574106, 20000588, +43970800, 21426518, 15854872, 21975738, -11183558, -26363046, -4444755, -42072424, -19828254, 343597, +6512244, 31857384, 37083820, 3189550, -5785858, -3609383, -27617176, -7552700, -525597, -5822365, +9373766, 18295486, -4056597, -1555852, -7349226, -11577084, 2234994, 1053878, -1366337, 20688320, +13952738, 5138929, -611496, -19605988, -28362354, -22376780, 1596654, 21132850, 18128520, 23909546, +3385508, 1022202, 5804112, -28398860, -15374372, -7304666, 374736, 1276679, 0, 0, +0, 0, 0, }, { 10924786, -6826851, 2576981, -311922, 5572183, 409096, 82141, -1086090, 2179159, 4372277, 619012, --2878702, 3926674, 2895882, -1643899, 409096, 923955, -2917357, -1707250, 1961190, 632971, -3770445, -2250563, 2246805, -3097208, -137439, 827855, -3096135, 965831, -1439888, 2833068, --3769908, 5240397, -729071, -2787434, -5018133, 1829656, 4124779, -1475858, 904091, -2236604, -1057099, 2969433, -147640, -1038845, -1052267, -1012002, 2515777, -2498060, -2246268, 671626, -1196685, 1803886, 217970, -1911261, 5364951, 634581, 682363, 3292629, -1029718, 1573032, --31139, -943282, -509491, -445603, 1829656, 3636764, -610422, 921271, 622233, 4495220, --869731, -1659468, -938450, -1498407, -2046552, -388158, -4283156, -2802466, 1347546, -1003412, --1276142, -2016487, 633508, 4391067, -1258425, 151398, 542240, 7432978, -38655, 1538135, --2897492, -1939178, -644245, -1813550, -2010582, -1825898, -1247688, -1722819, -2388539, 2254858, -3562675, -1735704, 622233, 315680, -3841312, 292058, 5369, -2605972, 5360656, -2499134, -3088082, 1342177, -716186, -2816425, -2700998, 2925410, -1318018, -797790, -4069482, -828392, --292058, -1722282, 5652714, -962073, -251256, 2585570, -304406, -4355634, -2275259, -3793530, --2633889, 6638409, -1666984, 7364795, 90194, 46171, -1150514, 1178432, 432718, -3808026, --4317516, 3659849, 533113, 2648921, -118112, 3048353, 1785633, -3546032, 208843, 1910187, -2459943, 588411, 2073932, 9867687, -512175, -925565, -2226404, -5027796, -6255083, -5706401, -903554, 5531381, 2095944, 7305203, 2673080, -2975876, 1098438, -8185134, -6885907, 3543348, --2260764, 4895726, -192737, -3512747, -1619203, 9494025, 2313914, 4143570, 66035, 3223373, --1137630, -917512, 2080375, -1057636, -3802657, -81068, 1727114, -257161, 2147, 6107444, -3891777, -6127845, 389768, -3814468, 6923488, 4151623, 523449, -2174327, -2195802, 3267396, -1956895, 5172215, -4387309, 8093329, 9946071, -2499134, 9694278, 153008, 5190468, 3236795, --1519345, 1782948, 7804493, -758062, -4898947, 4491462, 1620813, 30602, -395674, -843961, -497142, 4438849, -2699924, 1562294, 1279900, 2204929, -3658775, 3866008, 788663, -1063004, --8578123, -6753299, 1810866, -3918084, 2390149, -4835597, -6806987, -6274947, 590021, -4736812, -3884261, 2833605, -6083285, -1396938, 2098092, 360777, 2637647, -1904818, 2733210, 3527779, --5449777, 1473174, 1410360, -4323422, 2142652, 256087, -5194226, 3467112, 3197603, -1901060, -3516505, 393526, 2807298, 2677375, 858993, -1988033, -787053, -6010807, -2105071, -3055869, -2747169, 3118146, 934692, -9532680, 1440425, 3833795, -2487860, 6484864, -5775121, -7292318, -168577, -2247342, 1907502, -5238250, 8942122, -609349, -3527242, 795643, -295816, 5194763, --725313, -3226594, -639950, -2239289, -3315178, -3778498, 1248762, -6730751, 198105, 46171, -1430761, 4147865, 913754, 2803003, 4241280, -3783329, -20647518, -995896, -3097745, 13405130, --345208, 169651, 2354716, -2649458, 6448357, 1057099, -8223252, -4777614, -9532143, 873489, --1255741, -3767223, -3202972, -3979287, -2702071, 10227928, -5660767, -3223910, -3470871, -9089761, --969052, -2800319, 2240899, 3383897, -1961190, -823023, 1838783, -3335579, -1295470, -1874753, --3616363, 2552284, 6160594, -1614371, -1702418, 4519380, -7642895, 3757560, -6215892, -12214350, --7780870, -12181601, -2293513, -7326678, -4903242, 309238, 3960497, 1394254, 2675228, -2587718, -3366718, -5749351, -1633698, 3147137, -559956, 4717485, -2920041, 744103, -4536023, -4067871, -2426120, -8011725, 1315871, 4058744, -7293392, -499827, -2345589, -4419522, -5014911, -5415417, --1988570, -3425773, 28454, 12932147, 204548, -6997039, -6754910, -2196876, -4909685, -1760937, --3679176, 1160178, 692564, -5451924, -3259880, -5993627, 11809013, 5209259, 1125281, -428960, -6405407, -9263708, -131533, 66035, -6004901, -7723962, 7165079, 445066, 5100811, -7715372, --3537979, -2464238, 2756832, 67109, 3387119, -5168993, 1618666, 2661269, -6063420, -5356361, --5295158, 1685238, -1806571, -1154809, 4969277, -1000191, 453119, 604517, -1118302, -5187784, --3619584, -89121, -8744017, -5020817, -4681515, 3033858, 1491427, 4117263, -1015223, 2224256, --270046, -115427, 3824669, -2291365, 6790344, 1856500, 1921461, 27380, -2495913, 3804804, -1968169, 6637872, -1844152, 2116345, 3204046, -563714, -53687, -5586142, 3385508, -3192235, -14835354, 14030584, 10398653, -3890167, 3628174, 5129265, 2885681, 2776160, -5600638, -4910758, --7244536, 5916855, -6818798, -1075352, -5044439, 7941932, -9415642, -7075422, -3702262, -1742146, --5330055, -7815230, 1836099, 126165, 120259, -9415642, -5366562, 2120640, 1585380, 2329483, --2817499, -3899830, -55835, 2486786, 3163244, -2837363, 2983929, -5115843, -1655710, -12142946, -3981435, 1175747, -2432025, -2505577, -9162239, -4254165, 695248, -2370822, -12732431, 6404333, -2303176, -248034, -3780645, -2809982, -5684389, 1375463, -2347737, 3342022, -1300838, -1960653, --7558606, -1528472, -1298691, -4009352, 7044820, -5698348, -598074, 4482335, -2696703, -6055367, --4275640, 5245229, 6473590, 3914326, -1875290, 267899, 18212272, 6053220, -2749316, -2219424, -6349036, -12447352, -2397129, 9915469, 4949950, -7073275, -220117, -4834523, 1869921, 7591892, -18843632, 6131066, 14665703, -5331128, -1151051, -14446123, 4808216, -4304094, 3980361, -6404870, --382252, 470299, -2284386, 5002563, -2354179, 2309619, 6280853, -5003637, 2807835, 7925289, --2253247, 2537789, -40265, 3076270, 4377109, 4369593, -24357834, 8698919, -2863670, -11579769, --2046552, 6745246, 2065879, -9007620, 4678830, 6707665, -14385456, 915902, -4118337, 8178692, -1837709, 6703370, -1796370, -5275294, -10160282, 338229, -6203544, 18686328, 3365107, -3423626, -6159520, 476741, 5924371, -15268609, -2204392, 1951526, 4332012, 730144, -7371775, -1482301, -1998770, 6279242, -21910776, -24011014, -8354249, -2060511, 235149, 4855998, -10370735, 3004867, -11784853, -7081864, 6177774, 8093329, -5986111, -27917, -3019899, 9941776, 13953275, -6991133, --8197482, 6908455, 479426, -7009924, 3012383, -101469, 1568200, 1807108, -3841848, -2867965, --15336791, -1001801, -4536559, -575526, -658741, 10053445, 2841658, -18699750, 96637, 8660802, --10312216, 2410551, 10645076, -2644626, 3606162, -43487, -3068217, -7289633, 13741748, 11465952, --9157944, 4382478, -3548180, -773094, 4117800, -3426847, 3414499, -5874442, -863288, 11427297, --3586298, 2100239, 5332202, -4456566, -9936944, -884226, 3084860, 1202054, -4905390, 27917, -2366527, 3515968, 8382166, 4528506, 9259949, 3999152, 1637456, 3001109, -22655416, 26811870, --788663, 17511656, 2005750, -9004399, -2193118, -4904316, -6111739, -152471, 1188632, 12877923, --1199370, 9083319, -7669738, 303332, 2792803, 2676302, 1676111, 11301133, 11238319, 4604205, -2397129, -564788, -1328756, 164819, -1032403, -16797080, -5271536, 8874476, 5948530, -1176284, -1607928, -7528541, 4922033, -9404905, 2939368, 17002164, 2465848, 4322885, -12778065, 8009041, -6969122, 2549600, -8361228, -3128884, -3546032, 1576790, -7461432, 9140764, 10773925, 6972880, --277562, 16056198, 5982353, 23110146, 9255655, -5053566, 19051402, 1325534, -6271726, 14330695, --1761474, 5364951, 8795556, -5147519, -4983773, 13369159, 13428215, 8850317, -10929081, 5072357, --537408, -4098473, -9859097, 7228967, 9886478, 6553583, -11737072, 17482128, -3988951, -10198400, -4522601, 8017094, -6411313, -2948495, -14486925, 7166153, -4733054, -1141924, -13169980, -5494874, --3838090, -1724429, -5393405, 3999152, -1869921, -2810519, 4318590, 5305895, 9232032, 8680666, --2431488, -2281165, -10285373, 5091147, 1313723, 8080444, 3173981, 2596845, -1426466, 3575024, --5924371, -5440650, 4545149, 2266132, 4626754, -13300440, 5903433, 9605157, 1269700, -11668352, --11404749, -9405978, -28004798, 4666482, -1971390, 14723148, -5504538, 12307766, 5292474, 1288490, -16780438, 2793339, -158914, 11408507, 5707475, -14479408, -5708012, 2217277, -2988224, -8058970, --3317325, 19633906, 10751377, -8705899, 855235, -4792110, -497142, 3009698, 15548318, 234076, --2014877, 17043504, 8029978, -11319923, -2308008, -2469069, -868120, -59593, 32775432, 6046240, -12416214, -4881231, 10919417, 21492016, -17047262, 27690192, 16572668, -6326487, 885300, 2501819, --9021042, -15302432, 1737314, -8479339, -13837311, -5548024, 1884954, 973347, -1185948, -5524402, --507880, -5330055, 127238, -6293201, 23085, 6055367, -10810970, 7311108, 10095858, -6342056, --6400038, 6070400, 4236449, 520228, 29291676, 3747359, 19675246, -12555263, -878321, -15443629, --11842835, 4298726, -11899744, -15524696, -10881300, -11397233, -2429878, -1903207, -13927505, -13914083, -20542292, 4858145, 1532230, -963146, 10685879, 7717520, 12772696, 783832, 11977590, -4471061, -2602213, -19925964, 17925582, 11579232, 712965, -9071508, -2393908, 14218489, -7774965, -6616397, -16054588, -16109885, -12579422, -4182225, -10282152, -2873333, -18853296, 2457795, -12129525, 6784438, --195421, 1325534, 8638253, 1366337, 5701032, 8169028, 7849590, 6058052, 11543261, -27917, -7415261, 6278169, -10756746, 14681272, 2638184, 5904507, -10135049, 11060615, 4372277, 7252053, -900869, 1486596, -3013457, -13444858, 1611687, 4870493, 6433861, 6745783, 445603, -16076599, --10414759, 8388608, 4160750, 427349, -6851547, 5145908, -6636798, -16284905, 19493246, 10750840, -7856032, -10189273, -5513128, -12827994, -34740380, -3269544, -6259915, 1925756, -9436043, -10785200, --16387448, 2147, 2830384, 15824270, -16620450, 3013457, -1882806, 5374615, -15293305, -19331648, --12448963, 6170795, -493384, -25748866, 16405164, 17445084, -7150047, 15059766, 5773510, -21473762, --3049427, 30845382, -3304441, -18577344, -2192044, -694174, -16292422, 13251048, 3343632, -7393786, -13773960, 9886478, 31421444, 19272592, 1247151, 3607773, 29635812, -6023692, 8029978, -10383083, --16298327, -3610994, -10879689, 4090956, -210990, 7351911, -281857, -504659, -4318590, 24382530, -1640678, -16293495, -13736379, -1543504, -3227131, 1107028, 7864085, 22585622, 13672492, 6249715, --12269111, 18087182, 29846802, -4263292, 13671418, 14620069, 35800164, 8914205, 6928319, 13000866, -15251429, 10751914, -12216498, -9296457, 8120710, -19236622, -13309567, -12887586, 14575508, 15937550, -8696235, -343061, 10433549, 26377004, -13671418, 22183506, 17384418, 2270964, 17292076, -10133438, --2823404, 6198175, 20744156, 36719824, 4234301, -3556233, 4209068, -1763621, -5631776, 1254667, -4211216, -8761733, -11440719, 4148939, -5707475, -3268470, 9778030, -394600, 18770080, -9565429, -18440442, 8809515, 2333241, -10404558, 3982509, 17811230, 5801964, -9140227, 4193499, -2259153, -1200980, 10354092, -13797582, -7849053, 16976932, 146029, -3207804, 13845364, 137976, 4712653, -4070019, -13782013, -23654532, -5548561, 9468255, 15353971, 4392141, -12514461, 16752520, -5631776, -32968706, -16678969, 22582938, -13123809, 8852464, 17765596, -25972740, -28812788, 1090385, -8726300, -8605504, 8121783, 2698313, -5060545, -15153181, 10202158, -853625, 18854370, 10666551, 17381196, -6827388, 9514426, -2626909, 12883828, 7318625, -9920838, 4572530, -1271847, -28319940, 22484154, -29471528, -8048769, -2510409, 9529996, 39416524, -194884, -25409564, -10981695, 3586835, 3289408, --8931384, 6436546, -6814503, 11266773, -21747030, -287226, 11415486, -9900436, -10532870, 403190, --21515638, -7605314, -7899519, -33546916, -28478318, -17131550, 10525891, 12545599, -3779034, -24297704, -1237488, -607738, -2156074, 3157338, -12847858, 26036628, -9210020, 2051921, 29061360, -28105730, -11454678, 3037616, -10706280, 9591736, -8631274, -23097260, -1005559, 17190070, -9844602, -15089294, -6274411, 992137, 16275242, -1406065, -29061896, 643708, -17882096, 25496000, -11519102, 2505577, -4882304, 1640678, -5748277, -19196894, 5368172, 16783658, 3249680, 17340930, -30133490, -17049946, --7095286, -2033667, 209917, -23445152, 16226923, -5410048, -20845086, 31319976, 1197222, -52970904, -21649856, -7108708, 4511863, 5606006, 7535520, 13210246, 5180805, -9509594, -1879585, 13247827, -9367861, -10496363, -62277, -8342437, -3813931, -26121992, -2774012, 12557948, 16209207, 3461744, --5578626, 17222282, -17172352, 19603842, -10676752, -6523519, 3063922, -6293738, 6003291, -15937550, --20451560, -24007794, -6789270, 12022150, -3899294, -200253, 15362561, 3658239, 3459059, -856846, -1462973, -5451924, 1209033, 15103252, 10661183, 15916612, 15067819, 15916612, 12395276, -10470593, --5048734, 3342558, 218506, -19755238, 14092861, -4286914, -16525960, 21571474, 1222992, 2636036, -935229, -9306120, -1045288, 8220568, 15458661, 10035191, 2247879, 5494337, -20904680, -4845797, --5947456, 11025181, 6238440, -6113349, -8010651, 72411536, -71111240, -3572339, -77308336, -11978127, --29384556, -3590593, 18898392, -9596568, -21366926, 33728916, -9082782, -5883032, 1173063, 10398116, --1135482, 28044526, 18649822, 11138461, -16449725, 1123671, -11170673, -11458973, -7537131, 459562, --3367254, -3044058, -9156333, -2012729, 15720654, 1995549, 10509785, 10348187, -539555, 13801341, -20244866, 1223529, -3719979, -10214506, -12013024, 5180805, 5899138, -10052371, 17398376, -22020298, --21997748, 2828773, -7255274, 12466143, -20205136, 9387725, -39434780, -20925080, -31307628, -2190433, --14876693, -744103, -8548596, -11296301, -9218074, -22549, 4223027, -30379378, 5300527, -5600101, -5587753, 1682554, -12250857, -23751706, 20419348, -13118978, 485331, 18792092, 2291365, -424128, -14294725, -5675263, 60202020, 31048856, 15763604, -12590160, -5862631, -29003378, 8204998, 26203596, --3369939, -4182761, 41622528, -5535139, -7586523, 21602612, 30774514, 6797323, 31322122, -5802501, -5617281, 19463182, 21229486, 33363842, 26726508, 393526, -10314364, 11258720, 12570832, 12651900, -14539538, 25422986, 12502113, 31857920, -10807748, 973884, 9590662, 9942312, 26198764, 16589848, -27950574, -17908940, -5632850, 12676059, -20741470, 18911278, 17779554, 18443664, 7374996, -19614578, --7650948, 42318848, 10479183, 29099478, 22585622, 26621818, -5353677, 34708168, 51199768, 19510426, -3947612, 37936908, 24197308, -12218645, -9650792, -15809775, -15375983, 16969416, 16013786, 3287261, --17054242, 2105608, -16027207, 1265942, -9424769, 10783052, -36165772, -1588601, -4840428, -19029390, -8815957, -22909356, 38852276, 55040544, 32122060, -14947023, -30783104, -12004970, 27368606, -8967355, --22879290, 40585292, -28777354, 23802708, 14008036, -33624764, -13419625, -4547834, -53633940, 927713, -6380174, -27230092, 53238804, -19586662, 49520972, -38339024, 5840619, 795643, 36404144, 51323784, --3880503, 16225850, 25562572, -31178242, 20257750, -41652056, -10289131, 73251208, -3543348, -23026394, --3320010, -44542568, 2625836, -15786689, 48005388, 15274514, 22848152, -10044855, -11519639, -26462904, --20739324, 2297271, 4022774, -3250217, 32436666, -11213623, 7049115, -36407900, -15826418, 17670032, --47478716, -23521926, -13583908, -21320218, 46250892, -1819992, 49758268, 29524678, 16168941, 12641699, --10846403, -32729262, 21230560, -43116640, -24174224, 32753420, 35794796, -58097484, 62792960, -1045825, -5231270, -19436874, 50746112, 12372190, 32800666, 12821551, -20892332, 7834021, 18336290, -30206504, -21858700, 1002875, 14576045, -40490804, -2965138, 10735808, 38075420, -15127949, -31057982, -687732, -37799472, 20572356, -14285061, -31752694, -1538672, 27923194, 3578245, 2644089, 7512972, 20535850, -49838264, -69575784, -11731703, 7604777, 38953204, 9586367, -21565030, -4435091, 14598594, 36687072, --4001299, 2635499, -67946384, 20456392, 9992778, 19355806, -49619756, 44281648, 36516348, 15054397, --23051626, -1195075, -25559888, 19426674, 30708480, 14563697, 13513041, -1548873, 22529250, -33949568, -31465468, -8450885, -14289356, 40936408, 29545616, 3963718, -15771120, -30055644, 19159312, 28877212, --75369696, -1035087, -50801948, 27045410, 6389838, 17796196, 21051246, 30077656, 11542725, 10765336, --12181601, 16326781, 4099010, 35484484, -2518998, -8407398, 27936614, 22128208, -3136400, 3517578, --10051834, 2143189, 9716290, -797253, -5514201, 17023102, -10821170, 3459059, 21767432, -2499671, -13067438, -18953154, -3068754, 4811974, -7439957, -1276679, 3554622, 17069274, -2669859, -22876070, -2101313, 52113524, 11442330, -24781424, 9162239, -25252260, -17823040, -11848204, -2825015, 34312492, --2442226, -22835268, 52503292, -53099216, 10443213, 59602872, 6979322, 42807940, -29615410, -54086524, -19327352, 5016522, 46345920, 5618891, -24733642, 24495272, -4866198, -1102733, -10034654, 2090039, --15080167, 12267500, 3116536, 17034378, -18460844, -10870562, -5263483, 28085864, 11039677, -21225728, --117632176, -255214480, -108173584, -158138544, -226404368, 104097120, 20326470, 55109800, 294330880, 224537136, -125950456, 240619104, 176296064, 20933134, 50495392, 40572944, -130976104, -113184200, -61652108, -193517808, --186158912, -77745352, -101275328, -137444320, -64509336, -56203944, -140421264, -118189448, -20431160, -71780712, --115947472, -46265388, 21941378, -86136640, 11537893, 102900976, -19838990, -26097832, 142307296, 112828792, --16371342, 169779520, 196864656, 75127568, 184477440, 264907136, 152902976, 133325448, 318408480, 254056448, -187261648, 226001712, 300491488, 103623064, 34864396, 123229592, -110948672, -299609408, -220846688, -329764896, --533160608, -474892928, -505987936, -583672128, -597064320, -511007168, -447137248, -443189088, -312575904, -131227360, --87682296, 1000191, 168455056, 310556736, 328255776, 392185824, 330019392, 215854848, 0, 0, -0, 0, 0, }, +6826851, 2576981, -311922, 5572183, 409096, 82141, -1086090, 2179159, 4372277, 619012, +-2878702, 3926674, 2895882, -1643899, 409096, 923955, -2917357, -1707250, 1961190, 632971, +3770445, -2250563, 2246805, -3097208, -137439, 827855, -3096135, 965831, -1439888, 2833068, +-3769908, 5240397, -729071, -2787434, -5018133, 1829656, 4124779, -1475858, 904091, -2236604, +1057099, 2969433, -147640, -1038845, -1052267, -1012002, 2515777, -2498060, -2246268, 671626, +1196685, 1803886, 217970, -1911261, 5364951, 634581, 682363, 3292629, -1029718, 1573032, +-31139, -943282, -509491, -445603, 1829656, 3636764, -610422, 921271, 622233, 4495220, +-869731, -1659468, -938450, -1498407, -2046552, -388158, -4283156, -2802466, 1347546, -1003412, +-1276142, -2016487, 633508, 4391067, -1258425, 151398, 542240, 7432978, -38655, 1538135, +-2897492, -1939178, -644245, -1813550, -2010582, -1825898, -1247688, -1722819, -2388539, 2254858, +3562675, -1735704, 622233, 315680, -3841312, 292058, 5369, -2605972, 5360656, -2499134, +3088082, 1342177, -716186, -2816425, -2700998, 2925410, -1318018, -797790, -4069482, -828392, +-292058, -1722282, 5652714, -962073, -251256, 2585570, -304406, -4355634, -2275259, -3793530, +-2633889, 6638409, -1666984, 7364795, 90194, 46171, -1150514, 1178432, 432718, -3808026, +-4317516, 3659849, 533113, 2648921, -118112, 3048353, 1785633, -3546032, 208843, 1910187, +2459943, 588411, 2073932, 9867687, -512175, -925565, -2226404, -5027796, -6255083, -5706401, +903554, 5531381, 2095944, 7305203, 2673080, -2975876, 1098438, -8185134, -6885907, 3543348, +-2260764, 4895726, -192737, -3512747, -1619203, 9494025, 2313914, 4143570, 66035, 3223373, +-1137630, -917512, 2080375, -1057636, -3802657, -81068, 1727114, -257161, 2147, 6107444, +3891777, -6127845, 389768, -3814468, 6923488, 4151623, 523449, -2174327, -2195802, 3267396, +1956895, 5172215, -4387309, 8093329, 9946071, -2499134, 9694278, 153008, 5190468, 3236795, +-1519345, 1782948, 7804493, -758062, -4898947, 4491462, 1620813, 30602, -395674, -843961, +497142, 4438849, -2699924, 1562294, 1279900, 2204929, -3658775, 3866008, 788663, -1063004, +-8578123, -6753299, 1810866, -3918084, 2390149, -4835597, -6806987, -6274947, 590021, -4736812, +3884261, 2833605, -6083285, -1396938, 2098092, 360777, 2637647, -1904818, 2733210, 3527779, +-5449777, 1473174, 1410360, -4323422, 2142652, 256087, -5194226, 3467112, 3197603, -1901060, +3516505, 393526, 2807298, 2677375, 858993, -1988033, -787053, -6010807, -2105071, -3055869, +2747169, 3118146, 934692, -9532680, 1440425, 3833795, -2487860, 6484864, -5775121, -7292318, +168577, -2247342, 1907502, -5238250, 8942122, -609349, -3527242, 795643, -295816, 5194763, +-725313, -3226594, -639950, -2239289, -3315178, -3778498, 1248762, -6730751, 198105, 46171, +1430761, 4147865, 913754, 2803003, 4241280, -3783329, -20647518, -995896, -3097745, 13405130, +-345208, 169651, 2354716, -2649458, 6448357, 1057099, -8223252, -4777614, -9532143, 873489, +-1255741, -3767223, -3202972, -3979287, -2702071, 10227928, -5660767, -3223910, -3470871, -9089761, +-969052, -2800319, 2240899, 3383897, -1961190, -823023, 1838783, -3335579, -1295470, -1874753, +-3616363, 2552284, 6160594, -1614371, -1702418, 4519380, -7642895, 3757560, -6215892, -12214350, +-7780870, -12181601, -2293513, -7326678, -4903242, 309238, 3960497, 1394254, 2675228, -2587718, +3366718, -5749351, -1633698, 3147137, -559956, 4717485, -2920041, 744103, -4536023, -4067871, +2426120, -8011725, 1315871, 4058744, -7293392, -499827, -2345589, -4419522, -5014911, -5415417, +-1988570, -3425773, 28454, 12932147, 204548, -6997039, -6754910, -2196876, -4909685, -1760937, +-3679176, 1160178, 692564, -5451924, -3259880, -5993627, 11809013, 5209259, 1125281, -428960, +6405407, -9263708, -131533, 66035, -6004901, -7723962, 7165079, 445066, 5100811, -7715372, +-3537979, -2464238, 2756832, 67109, 3387119, -5168993, 1618666, 2661269, -6063420, -5356361, +-5295158, 1685238, -1806571, -1154809, 4969277, -1000191, 453119, 604517, -1118302, -5187784, +-3619584, -89121, -8744017, -5020817, -4681515, 3033858, 1491427, 4117263, -1015223, 2224256, +-270046, -115427, 3824669, -2291365, 6790344, 1856500, 1921461, 27380, -2495913, 3804804, +1968169, 6637872, -1844152, 2116345, 3204046, -563714, -53687, -5586142, 3385508, -3192235, +14835354, 14030584, 10398653, -3890167, 3628174, 5129265, 2885681, 2776160, -5600638, -4910758, +-7244536, 5916855, -6818798, -1075352, -5044439, 7941932, -9415642, -7075422, -3702262, -1742146, +-5330055, -7815230, 1836099, 126165, 120259, -9415642, -5366562, 2120640, 1585380, 2329483, +-2817499, -3899830, -55835, 2486786, 3163244, -2837363, 2983929, -5115843, -1655710, -12142946, +3981435, 1175747, -2432025, -2505577, -9162239, -4254165, 695248, -2370822, -12732431, 6404333, +2303176, -248034, -3780645, -2809982, -5684389, 1375463, -2347737, 3342022, -1300838, -1960653, +-7558606, -1528472, -1298691, -4009352, 7044820, -5698348, -598074, 4482335, -2696703, -6055367, +-4275640, 5245229, 6473590, 3914326, -1875290, 267899, 18212272, 6053220, -2749316, -2219424, +6349036, -12447352, -2397129, 9915469, 4949950, -7073275, -220117, -4834523, 1869921, 7591892, +18843632, 6131066, 14665703, -5331128, -1151051, -14446123, 4808216, -4304094, 3980361, -6404870, +-382252, 470299, -2284386, 5002563, -2354179, 2309619, 6280853, -5003637, 2807835, 7925289, +-2253247, 2537789, -40265, 3076270, 4377109, 4369593, -24357834, 8698919, -2863670, -11579769, +-2046552, 6745246, 2065879, -9007620, 4678830, 6707665, -14385456, 915902, -4118337, 8178692, +1837709, 6703370, -1796370, -5275294, -10160282, 338229, -6203544, 18686328, 3365107, -3423626, +6159520, 476741, 5924371, -15268609, -2204392, 1951526, 4332012, 730144, -7371775, -1482301, +1998770, 6279242, -21910776, -24011014, -8354249, -2060511, 235149, 4855998, -10370735, 3004867, +11784853, -7081864, 6177774, 8093329, -5986111, -27917, -3019899, 9941776, 13953275, -6991133, +-8197482, 6908455, 479426, -7009924, 3012383, -101469, 1568200, 1807108, -3841848, -2867965, +-15336791, -1001801, -4536559, -575526, -658741, 10053445, 2841658, -18699750, 96637, 8660802, +-10312216, 2410551, 10645076, -2644626, 3606162, -43487, -3068217, -7289633, 13741748, 11465952, +-9157944, 4382478, -3548180, -773094, 4117800, -3426847, 3414499, -5874442, -863288, 11427297, +-3586298, 2100239, 5332202, -4456566, -9936944, -884226, 3084860, 1202054, -4905390, 27917, +2366527, 3515968, 8382166, 4528506, 9259949, 3999152, 1637456, 3001109, -22655416, 26811870, +-788663, 17511656, 2005750, -9004399, -2193118, -4904316, -6111739, -152471, 1188632, 12877923, +-1199370, 9083319, -7669738, 303332, 2792803, 2676302, 1676111, 11301133, 11238319, 4604205, +2397129, -564788, -1328756, 164819, -1032403, -16797080, -5271536, 8874476, 5948530, -1176284, +1607928, -7528541, 4922033, -9404905, 2939368, 17002164, 2465848, 4322885, -12778065, 8009041, +6969122, 2549600, -8361228, -3128884, -3546032, 1576790, -7461432, 9140764, 10773925, 6972880, +-277562, 16056198, 5982353, 23110146, 9255655, -5053566, 19051402, 1325534, -6271726, 14330695, +-1761474, 5364951, 8795556, -5147519, -4983773, 13369159, 13428215, 8850317, -10929081, 5072357, +-537408, -4098473, -9859097, 7228967, 9886478, 6553583, -11737072, 17482128, -3988951, -10198400, +4522601, 8017094, -6411313, -2948495, -14486925, 7166153, -4733054, -1141924, -13169980, -5494874, +-3838090, -1724429, -5393405, 3999152, -1869921, -2810519, 4318590, 5305895, 9232032, 8680666, +-2431488, -2281165, -10285373, 5091147, 1313723, 8080444, 3173981, 2596845, -1426466, 3575024, +-5924371, -5440650, 4545149, 2266132, 4626754, -13300440, 5903433, 9605157, 1269700, -11668352, +-11404749, -9405978, -28004798, 4666482, -1971390, 14723148, -5504538, 12307766, 5292474, 1288490, +16780438, 2793339, -158914, 11408507, 5707475, -14479408, -5708012, 2217277, -2988224, -8058970, +-3317325, 19633906, 10751377, -8705899, 855235, -4792110, -497142, 3009698, 15548318, 234076, +-2014877, 17043504, 8029978, -11319923, -2308008, -2469069, -868120, -59593, 32775432, 6046240, +12416214, -4881231, 10919417, 21492016, -17047262, 27690192, 16572668, -6326487, 885300, 2501819, +-9021042, -15302432, 1737314, -8479339, -13837311, -5548024, 1884954, 973347, -1185948, -5524402, +-507880, -5330055, 127238, -6293201, 23085, 6055367, -10810970, 7311108, 10095858, -6342056, +-6400038, 6070400, 4236449, 520228, 29291676, 3747359, 19675246, -12555263, -878321, -15443629, +-11842835, 4298726, -11899744, -15524696, -10881300, -11397233, -2429878, -1903207, -13927505, -13914083, +20542292, 4858145, 1532230, -963146, 10685879, 7717520, 12772696, 783832, 11977590, -4471061, +2602213, -19925964, 17925582, 11579232, 712965, -9071508, -2393908, 14218489, -7774965, -6616397, +16054588, -16109885, -12579422, -4182225, -10282152, -2873333, -18853296, 2457795, -12129525, 6784438, +-195421, 1325534, 8638253, 1366337, 5701032, 8169028, 7849590, 6058052, 11543261, -27917, +7415261, 6278169, -10756746, 14681272, 2638184, 5904507, -10135049, 11060615, 4372277, 7252053, +900869, 1486596, -3013457, -13444858, 1611687, 4870493, 6433861, 6745783, 445603, -16076599, +-10414759, 8388608, 4160750, 427349, -6851547, 5145908, -6636798, -16284905, 19493246, 10750840, +7856032, -10189273, -5513128, -12827994, -34740380, -3269544, -6259915, 1925756, -9436043, -10785200, +-16387448, 2147, 2830384, 15824270, -16620450, 3013457, -1882806, 5374615, -15293305, -19331648, +-12448963, 6170795, -493384, -25748866, 16405164, 17445084, -7150047, 15059766, 5773510, -21473762, +-3049427, 30845382, -3304441, -18577344, -2192044, -694174, -16292422, 13251048, 3343632, -7393786, +13773960, 9886478, 31421444, 19272592, 1247151, 3607773, 29635812, -6023692, 8029978, -10383083, +-16298327, -3610994, -10879689, 4090956, -210990, 7351911, -281857, -504659, -4318590, 24382530, +1640678, -16293495, -13736379, -1543504, -3227131, 1107028, 7864085, 22585622, 13672492, 6249715, +-12269111, 18087182, 29846802, -4263292, 13671418, 14620069, 35800164, 8914205, 6928319, 13000866, +15251429, 10751914, -12216498, -9296457, 8120710, -19236622, -13309567, -12887586, 14575508, 15937550, +8696235, -343061, 10433549, 26377004, -13671418, 22183506, 17384418, 2270964, 17292076, -10133438, +-2823404, 6198175, 20744156, 36719824, 4234301, -3556233, 4209068, -1763621, -5631776, 1254667, +4211216, -8761733, -11440719, 4148939, -5707475, -3268470, 9778030, -394600, 18770080, -9565429, +18440442, 8809515, 2333241, -10404558, 3982509, 17811230, 5801964, -9140227, 4193499, -2259153, +1200980, 10354092, -13797582, -7849053, 16976932, 146029, -3207804, 13845364, 137976, 4712653, +4070019, -13782013, -23654532, -5548561, 9468255, 15353971, 4392141, -12514461, 16752520, -5631776, +32968706, -16678969, 22582938, -13123809, 8852464, 17765596, -25972740, -28812788, 1090385, -8726300, +8605504, 8121783, 2698313, -5060545, -15153181, 10202158, -853625, 18854370, 10666551, 17381196, +6827388, 9514426, -2626909, 12883828, 7318625, -9920838, 4572530, -1271847, -28319940, 22484154, +29471528, -8048769, -2510409, 9529996, 39416524, -194884, -25409564, -10981695, 3586835, 3289408, +-8931384, 6436546, -6814503, 11266773, -21747030, -287226, 11415486, -9900436, -10532870, 403190, +-21515638, -7605314, -7899519, -33546916, -28478318, -17131550, 10525891, 12545599, -3779034, -24297704, +1237488, -607738, -2156074, 3157338, -12847858, 26036628, -9210020, 2051921, 29061360, -28105730, +11454678, 3037616, -10706280, 9591736, -8631274, -23097260, -1005559, 17190070, -9844602, -15089294, +6274411, 992137, 16275242, -1406065, -29061896, 643708, -17882096, 25496000, -11519102, 2505577, +4882304, 1640678, -5748277, -19196894, 5368172, 16783658, 3249680, 17340930, -30133490, -17049946, +-7095286, -2033667, 209917, -23445152, 16226923, -5410048, -20845086, 31319976, 1197222, -52970904, +21649856, -7108708, 4511863, 5606006, 7535520, 13210246, 5180805, -9509594, -1879585, 13247827, +9367861, -10496363, -62277, -8342437, -3813931, -26121992, -2774012, 12557948, 16209207, 3461744, +-5578626, 17222282, -17172352, 19603842, -10676752, -6523519, 3063922, -6293738, 6003291, -15937550, +-20451560, -24007794, -6789270, 12022150, -3899294, -200253, 15362561, 3658239, 3459059, -856846, +1462973, -5451924, 1209033, 15103252, 10661183, 15916612, 15067819, 15916612, 12395276, -10470593, +-5048734, 3342558, 218506, -19755238, 14092861, -4286914, -16525960, 21571474, 1222992, 2636036, +935229, -9306120, -1045288, 8220568, 15458661, 10035191, 2247879, 5494337, -20904680, -4845797, +-5947456, 11025181, 6238440, -6113349, -8010651, 72411536, -71111240, -3572339, -77308336, -11978127, +-29384556, -3590593, 18898392, -9596568, -21366926, 33728916, -9082782, -5883032, 1173063, 10398116, +-1135482, 28044526, 18649822, 11138461, -16449725, 1123671, -11170673, -11458973, -7537131, 459562, +-3367254, -3044058, -9156333, -2012729, 15720654, 1995549, 10509785, 10348187, -539555, 13801341, +20244866, 1223529, -3719979, -10214506, -12013024, 5180805, 5899138, -10052371, 17398376, -22020298, +-21997748, 2828773, -7255274, 12466143, -20205136, 9387725, -39434780, -20925080, -31307628, -2190433, +-14876693, -744103, -8548596, -11296301, -9218074, -22549, 4223027, -30379378, 5300527, -5600101, +5587753, 1682554, -12250857, -23751706, 20419348, -13118978, 485331, 18792092, 2291365, -424128, +14294725, -5675263, 60202020, 31048856, 15763604, -12590160, -5862631, -29003378, 8204998, 26203596, +-3369939, -4182761, 41622528, -5535139, -7586523, 21602612, 30774514, 6797323, 31322122, -5802501, +5617281, 19463182, 21229486, 33363842, 26726508, 393526, -10314364, 11258720, 12570832, 12651900, +14539538, 25422986, 12502113, 31857920, -10807748, 973884, 9590662, 9942312, 26198764, 16589848, +27950574, -17908940, -5632850, 12676059, -20741470, 18911278, 17779554, 18443664, 7374996, -19614578, +-7650948, 42318848, 10479183, 29099478, 22585622, 26621818, -5353677, 34708168, 51199768, 19510426, +3947612, 37936908, 24197308, -12218645, -9650792, -15809775, -15375983, 16969416, 16013786, 3287261, +-17054242, 2105608, -16027207, 1265942, -9424769, 10783052, -36165772, -1588601, -4840428, -19029390, +8815957, -22909356, 38852276, 55040544, 32122060, -14947023, -30783104, -12004970, 27368606, -8967355, +-22879290, 40585292, -28777354, 23802708, 14008036, -33624764, -13419625, -4547834, -53633940, 927713, +6380174, -27230092, 53238804, -19586662, 49520972, -38339024, 5840619, 795643, 36404144, 51323784, +-3880503, 16225850, 25562572, -31178242, 20257750, -41652056, -10289131, 73251208, -3543348, -23026394, +-3320010, -44542568, 2625836, -15786689, 48005388, 15274514, 22848152, -10044855, -11519639, -26462904, +-20739324, 2297271, 4022774, -3250217, 32436666, -11213623, 7049115, -36407900, -15826418, 17670032, +-47478716, -23521926, -13583908, -21320218, 46250892, -1819992, 49758268, 29524678, 16168941, 12641699, +-10846403, -32729262, 21230560, -43116640, -24174224, 32753420, 35794796, -58097484, 62792960, -1045825, +5231270, -19436874, 50746112, 12372190, 32800666, 12821551, -20892332, 7834021, 18336290, -30206504, +21858700, 1002875, 14576045, -40490804, -2965138, 10735808, 38075420, -15127949, -31057982, -687732, +37799472, 20572356, -14285061, -31752694, -1538672, 27923194, 3578245, 2644089, 7512972, 20535850, +49838264, -69575784, -11731703, 7604777, 38953204, 9586367, -21565030, -4435091, 14598594, 36687072, +-4001299, 2635499, -67946384, 20456392, 9992778, 19355806, -49619756, 44281648, 36516348, 15054397, +-23051626, -1195075, -25559888, 19426674, 30708480, 14563697, 13513041, -1548873, 22529250, -33949568, +31465468, -8450885, -14289356, 40936408, 29545616, 3963718, -15771120, -30055644, 19159312, 28877212, +-75369696, -1035087, -50801948, 27045410, 6389838, 17796196, 21051246, 30077656, 11542725, 10765336, +-12181601, 16326781, 4099010, 35484484, -2518998, -8407398, 27936614, 22128208, -3136400, 3517578, +-10051834, 2143189, 9716290, -797253, -5514201, 17023102, -10821170, 3459059, 21767432, -2499671, +13067438, -18953154, -3068754, 4811974, -7439957, -1276679, 3554622, 17069274, -2669859, -22876070, +2101313, 52113524, 11442330, -24781424, 9162239, -25252260, -17823040, -11848204, -2825015, 34312492, +-2442226, -22835268, 52503292, -53099216, 10443213, 59602872, 6979322, 42807940, -29615410, -54086524, +19327352, 5016522, 46345920, 5618891, -24733642, 24495272, -4866198, -1102733, -10034654, 2090039, +-15080167, 12267500, 3116536, 17034378, -18460844, -10870562, -5263483, 28085864, 11039677, -21225728, +-117632176, -255214480, -108173584, -158138544, -226404368, 104097120, 20326470, 55109800, 294330880, 224537136, +125950456, 240619104, 176296064, 20933134, 50495392, 40572944, -130976104, -113184200, -61652108, -193517808, +-186158912, -77745352, -101275328, -137444320, -64509336, -56203944, -140421264, -118189448, -20431160, -71780712, +-115947472, -46265388, 21941378, -86136640, 11537893, 102900976, -19838990, -26097832, 142307296, 112828792, +-16371342, 169779520, 196864656, 75127568, 184477440, 264907136, 152902976, 133325448, 318408480, 254056448, +187261648, 226001712, 300491488, 103623064, 34864396, 123229592, -110948672, -299609408, -220846688, -329764896, +-533160608, -474892928, -505987936, -583672128, -597064320, -511007168, -447137248, -443189088, -312575904, -131227360, +-87682296, 1000191, 168455056, 310556736, 328255776, 392185824, 330019392, 215854848, 0, 0, +0, 0, 0, }, }, { { -132070, --67109, 317828, -6643241, 1188632, -184147, 210990, -4071092, 1222455, -7295002, -3908957, -1842004, -1560684, 2344515, 3863860, -2347737, 2735894, -3688303, -402116, 3347927, -998580, -2068564, -5641440, 687732, -12885, 1688459, -1324997, 1964948, -2812130, -1526861, 1977296, --4854387, 1438277, 1396401, -1577864, -2652679, 7001334, -1620276, 1882269, -2807298, -977105, -943819, -5814312, -3759707, -3112241, -2216203, -2803003, -2863670, -52613, 143881, -2734284, -956704, 194884, 2765959, -2286533, -1091459, -261993, 1220308, -1404454, -3934190, 4258997, -3278671, 1841467, -1231045, 1731409, 383326, 2673617, -3260954, -6189048, -5268315, 694711, --3234110, 2296197, 5021354, 1111323, 3317325, -8733816, 4890894, -6681896, 613643, -2925947, --1042066, 2370285, -4221416, -7497939, -2062121, 462783, -4395899, -2580202, 3366718, -2263448, -1452236, -9335648, -986232, 6070400, 3110093, -10420128, -3743601, -2835215, -2937758, 3336116, --1709934, -5485210, -3576097, -3955128, -4111894, 6649683, 1898912, 4242891, -3048890, 5615133, -4983773, 3600793, -2289755, -4969277, -4051765, 302258, 735513, 7698729, 2525978, 1392106, --3913789, 761283, 91805, 811749, 2840584, 1755568, -5546414, -4568772, -2583423, 2786897, -400506, -1053341, -5927055, -1779190, 1945083, 2519535, -2565169, -900333, -164283, 2681670, --886911, -3023657, -311922, 401579, -4194036, 8180302, 156229, -5648419, -415538, -1014149, --5553930, -5021891, 5897527, 5401995, -4195646, 3282429, 431644, 1726040, -14009110, 5534602, --1978906, -9579388, -12451647, 401579, 9225053, 607201, 6032819, 272194, -11233487, -3877819, -1459215, 4021700, -1850057, -935766, -4630512, 667331, -704912, 8067023, 4257923, 1730335, -1619740, 2200097, 2975339, 7340099, 4632659, -6473053, -353261, 1502702, 1770600, -7713225, -2716567, -2308008, -4655208, -1403917, 18790, 5236639, 1588064, -2986613, 5578089, 8267812, --1512902, -3216394, 2270427, -667331, 4816806, 4553739, 3909494, -5659157, -3944928, 3876745, --1382980, -1527935, -3952444, 308164, -6008659, 3591130, 3744138, 4246649, 1510755, 4918275, --5229660, -3879429, 7710540, -106300, 3178276, 7823820, 7046968, 498753, 2638184, -6185290, --5288716, 2813204, -1577864, -2339684, -2968359, -2752000, 2022930, -7121593, -4179540, -8763344, --10558640, -2034741, 8474507, 5468030, -3671123, -1078037, -1384590, -2114198, -7671349, 5293547, --2071785, -2015413, 274341, 3434363, -1890859, 227633, -469762, 5021891, -4934381, 5041755, -2569464, 6064494, -2324651, 4679904, 1870995, -2999498, 4031901, -2961917, 2206540, 4496294, --3700651, 4730370, -3131568, -2345589, -1013075, -1450625, 2101850, -1422171, -3952981, 1436667, --3490735, 674847, 74625, 481573, 6828461, 1398012, -2057826, 47245, -3384434, -4107063, -1665911, -968515, 6372121, 7047505, 2287070, -1904818, -1706176, -2147, -3476239, -3151969, -2698313, 5574868, 13794361, -5727339, 5705864, -6919729, -5794448, 97711, -1541893, -1421097, -2005750, -2877628, 6030134, 5848135, 5061619, -1429150, -538482, -2525978, -6216965, 1044751, --3684008, -650151, 818728, -2068564, 3737159, 1414655, -296353, -10400800, -4218732, -6538014, -397821, -4262218, -6465537, -2857764, -3494493, -4003983, 6768332, -5224291, 4831302, 447213, --1677722, 2647311, 2440615, -4678830, -1079111, 142271, 5319854, -439697, -6721624, -8786966, --8939974, 2439542, -3087545, 250719, -439697, 1380295, 3417183, 5162551, -3199214, -1815697, -2039573, 1814624, 1041530, 6469295, -3164317, 4025995, -6899328, 14497125, 2290291, -1468879, -3389266, 1450088, 3434363, -3947612, 104690, 1142998, 599148, -882616, -5621039, -6550362, -1132798, 1404991, 601295, -898185, -3862249, 2552821, 2065879, -5897527, 7269232, -8712878, -11099806, -909996, 3801046, 1779190, -80531, -1015223, 2393908, 10428717, 11651173, -2043331, -2207613, -1225139, -1503775, 1688459, 2572149, 8056285, -878321, 2552284, -3875671, 4487704, -1076426, 6382322, 3125663, 5986648, -8301098, 3699578, 3164854, -2494302, 7516, 6479495, -116501, 642635, 2007897, 3994320, -1232119, -408559, 12276090, 5944772, 1138703, 1240709, --2505577, 5666136, -7343857, -10698764, -13067438, -700617, 6890202, -117575, 3423089, 9387188, -3651259, -1582696, -3320547, 5007395, -1034550, 11987791, 5279589, 1764695, 1541893, -6584722, -1220308, 4810364, -2719788, -7599945, 1056562, 1917703, -15349139, 2314451, -609885, 11551315, --7598871, 5418638, -16301012, 7270306, -1010391, -7978439, -8876624, -5979668, 5619965, 4583267, -13393319, 2352568, 4842039, 12929999, -1562831, -8259222, 1908576, -6201933, 2248416, 10691247, -2426120, -2108292, -626528, -1207423, 3505767, 4593468, -260919, 3320547, 5719286, -2474975, -2197413, -5293547, 97174, -6801081, -619012, 1818919, -3019899, 6389301, 4390531, 5581310, -10071698, 1445793, 12072616, 9654550, 4845260, -5092758, 13775034, 6576132, 2925410, 12480638, --642635, 1222455, 1602023, 4830228, -1748589, -2335389, -7227893, -6575058, -5532992, 1203665, --4174708, 11329587, -5298379, 5467494, 7206955, -2175938, 1312113, -1394254, -549219, -8244727, --9960029, 7266548, 146566, 13385266, 551366, 188979, -1183800, -2589329, 2458332, 568546, --6743099, -8723079, -11752641, -6199786, -12290049, -7876433, -4116726, -9170829, -5682242, -4021700, --4638565, -12402792, 8630200, 5297842, 463320, 4450123, 2219424, -3469260, 15552077, 912681, --5120138, -2825015, -10213432, -4518843, 11675869, 520765, -9363029, -9639517, 1663763, -9754408, -3400004, 3378529, -7266011, 273267, 2696166, 517007, 11623792, 3362423, -4764730, 1134945, --5759551, 5697274, 1251446, 2542084, -13304735, 9543954, -4223027, 4022237, 872952, 1932198, -2861522, 476205, -3363496, -156766, -4673462, 221191, -10089415, 212064, -10865730, 15803869, --1675574, 10288057, -6152541, -2779918, -304943, -6651831, -2654827, 7176891, 1811939, 1619203, --6932077, -122407, 4966056, -13259101, -66572, -5802501, -4604205, 9187472, -15214922, -14471355, -3703336, 18958522, 467615, 1653026, 1457068, -3090229, 10460930, 9969693, 5876052, 2676838, --2740189, -15754477, 9232569, -157840, -12411919, -4268124, 2928631, -898722, 155693, 984084, --2936684, -12562779, -621160, 172872, -2161979, -5470178, 3765076, 10255845, -13616657, 8133058, --5035313, -3008625, 930397, 6314676, 22407918, -14898705, -3497714, 891206, -1284195, -3200288, -891206, -6131066, 2087891, -5644124, 15496779, 4558034, 3058017, 3454764, -3038153, -1730872, -8322573, -2207076, 3751654, -7778186, 12002823, -638340, -8066486, 15129559, -10202158, 6047851, -2461553, 1924145, 12298639, -7011534, 5471252, -3636764, 248034, 16313896, 1293322, 4261682, -4859756, -2720325, -9353902, -7352984, 1161252, 16304770, 9281424, 2004676, -14535243, 2095944, --7968238, 39192, 16369731, 15677168, 7988103, 10590316, -9497783, -19832548, -10298258, -14301704, -8003672, -164819, -2321430, -80531, -10706280, -3237869, 3453691, -2062658, -3986804, -4029753, -11689827, -784368, 3287261, -3325915, 7733089, 1563368, -4204773, -9238475, -6878927, 20874614, --702764, -4784057, 6900939, -12013560, 3984656, -6904160, -20635170, -4752382, -2439005, 6252936, -2727841, 5478768, 2098629, 8184060, 677531, 484258, 4982162, -20517596, -2776160, -5595269, --957241, 1859721, 12286291, 12814572, 5302674, -3547643, -8210367, -11913702, -3108483, -7103339, -2445447, -3620658, -2542084, -7740068, -23117124, -14952392, -3076270, -5145371, 12565464, 8753680, --1464047, 21232170, -20467130, -4436165, -7388955, 22636088, 11185705, -6842420, 8732205, 3555159, --8068096, 15759309, -16318728, 8800388, -7190312, 1752884, 2447595, -5211943, 15413564, -9972914, -9720585, -3908957, -21112448, -3192771, 15876347, -8789651, -14169634, 615791, -1140314, -21826486, --3422015, 9330280, 4544613, 12264279, 9509058, -2109366, 22206592, -4718022, -5736466, -10121627, --8908299, -9078487, 6797323, 8380018, -5914707, -7377143, 3583613, -6350646, 10045929, -2087891, -6010807, -3264712, -4342749, -3897146, 1183264, -12222403, 4819490, 9432285, -584116, 4268124, -7151121, 6769942, 13521094, -8017094, 5916855, 9319005, 1416266, -19118510, 18173618, -9428527, --25674240, 1376537, 20451024, 25772488, 5835250, -7765838, -5523865, 3796751, -3115999, -2585034, -12033425, 12220793, -4087198, 11848741, -12090333, -316754, 10924249, -3373160, 12965969, 6842420, --322123, -14701673, 7454453, -2378875, -2497524, 2223719, 134218, -290447, 23390392, -9392557, -12615930, 20357608, 14485314, 8391292, 1651415, -10956462, 13917842, -5428839, 13354127, -5114233, -4233227, -11484743, -1010391, -10718628, -6592775, 3613141, -9950365, -1405528, -2383707, 1378148, -11972221, -10183904, -8665097, -1792075, -4163434, -351650, -8429410, -11123428, -14710800, 4037269, -15047418, 1611687, -6006512, 4092567, 5141613, 13243532, -8748312, -3211025, -781684, 3425773, -10911901, 4522064, 5937256, -2174864, 2213519, 13330505, -45433776, -21731460, 14798310, -37137508, --25844428, -1897839, -15331960, -10562398, 10965588, 12632573, 3646964, -2600603, 4358318, 36603320, --4826470, 5666136, 13861470, 15937550, -17125108, -8937290, -8290361, 13382044, 14502494, 7242389, -2381023, 13688598, -4445828, -7180649, 9394704, 18602040, 962073, 5866389, 18750754, 13901735, -11115375, -8808441, 3220152, 5575942, -451508, -542240, 11859478, -4261682, -627602, -1485522, -7760469, 54224, -13888314, -9258339, 2233383, -18525268, 13351980, -4353486, 30061012, 892816, -16266115, 2970507, -1217623, -10232760, -959925, 3489661, -13396540, -7122667, -15556908, -2441689, -7269232, 9903121, -4995584, -25255482, 8552354, -4726612, 8154533, -9784472, -10512469, 6522445, --15413027, -13569412, 25604984, 18931142, -7735236, -20578798, 9709310, -10455561, 5259725, 330712, --9920301, 20114942, -25444460, -460098, -30840550, 1388348, 26094074, 36219996, 17500918, -5483600, -17128330, -613643, -1598265, 2413235, -2092186, 9404905, -368830, -15998753, 1706176, -22479858, -8900783, -6481106, -4393215, 16222628, 476741, -17090748, -19086298, 5342403, 3593277, -9171366, --7388418, 15673409, -20667382, 672699, -3406983, 8428336, -4802847, -3838090, -16224239, -6464463, --6529961, -2314451, 13593035, -13813689, 6533182, -810138, -1258425, 2976949, 6758131, -23889144, --1154273, 4549444, -572841, 10481868, -6080600, -9714142, -3051574, -26524644, -10107132, -10624138, -3123515, 13666049, 20933134, -6553047, 17160004, -21048024, 41865192, 5370320, -460098, 24080272, --7657927, 22936736, 1318018, -16354699, -344671, -2465848, 10655814, 7017977, -9958955, 11541651, -241592, -25756918, -28020366, -2681133, -8413304, 7004555, -1163399, -9905268, -25241522, -22058416, -12080669, -18771154, -4158602, 1184337, 5998459, 1397475, 18092012, 1503239, -9047885, 12068321, --1532230, 1751273, 11232950, -14716705, -879395, 3162170, -14906758, 9065065, 12561706, 5396627, -11196980, 5747203, 17291538, 4634270, 12629888, -17632988, -5348308, -2881386, -23432268, -220117, --2388539, 9759776, -1402844, 11181947, -1694365, -13847511, -9109626, -899259, -21582748, 9330816, -852014, -4520990, 13026636, 7731478, 10892574, 10562398, 3688303, -1864553, 9599789, -30275224, -9337259, 2793339, 13604309, -6525129, -20588462, 11162083, -3233574, 18130130, -29671782, 15650861, -14513231, 53097608, 40128416, 5420249, 11637214, 3349001, 30836254, 823023, 15014132, -14035953, -36524940, -14502494, 33125472, -1532767, 21164526, -2513630, 14940044, -14907831, 3588445, 7390565, --8130373, -2738579, -4364224, -3513283, 9886478, 140660, -8517994, -11849815, -17718350, -22659174, --10836202, -3929895, 136365, 6943352, -18992882, 7882876, -10457708, -16306380, -3364033, -11985643, -5365488, -3100967, -24729348, -6135361, -12589086, -15175730, -15668041, 13881871, 18932216, -40033928, -8953396, 3126736, 11086384, 3483755, -5072357, 23498840, 13421236, 11986180, -33305860, -15517717, --558346, 7428683, 27343372, 143881, -3903589, 279173, 23054310, 19643032, -20134806, 20778514, -1238561, 2878165, -4403415, 9927817, -29248190, -16459925, 12683038, -7663833, 10803990, 17869212, --24232206, 5043902, -14666240, 35345432, -23962696, 19148038, 17469780, -9271224, -36713916, -22137872, --4230006, -11150809, -2978023, -17847200, -27291832, -35618164, -21283710, -24357296, 7720204, -21115132, -6017786, 361851, -4197257, -3916473, -17813376, -6830072, -18257906, 2814814, 12487617, 17044040, --1695975, -7322383, -18732500, -5977521, -414464, -11940009, 738734, -15727096, -11027329, -4037806, --15714748, 8632347, -14151917, -37569152, -869194, -3300682, -13908178, 12830678, 9579388, 14867029, -4318053, 11117523, 25055766, 2089502, -29606284, -8856759, 10391673, -8786966, -25129316, 9655623, -15378667, 2791729, -2791192, -34230352, 24568824, -5405753, 19373524, -23371064, 19414862, 49353468, --8498130, -10142028, -43192340, 15142981, -56737056, 38054484, 13967771, -9494562, 40711460, -3631932, --19969988, 35874788, -13186623, -1788317, 8128763, 12593918, 33600068, 1415192, -2033130, 23314156, -10568304, 19537806, 24654722, 17692580, 2388539, 12299176, 2742874, -1410360, -12297028, 8174934, -13404056, 2765959, 120259, -14478872, 7698729, -13645648, 16893180, 15295452, 3706020, 18085570, --10460930, 11692512, 20322174, 11641509, -24977382, -28732258, 33972656, -4022774, 21685826, 31003222, -1902671, -1000191, -2150705, 5135171, 19651086, 16260209, 3057480, 13154948, 1260036, -18173618, --19463182, -32454384, 1833951, -14413910, 1749662, 15231565, 17623324, -31200254, 3786551, 8329016, --23897198, 916439, 36330592, -19089520, -16325708, 14028974, -19340774, -1767379, -6295885, 3587908, --20526186, 3860102, -23678154, 46930032, 11120744, -26003342, 9130564, -6526740, -23116050, -27274116, --27530204, 7340636, -1823751, 23172422, 34884260, 16309065, 8098161, -4986457, 11284490, 405874, --44956496, 18788334, 45786500, -31012886, -32245004, -28239946, -39309152, 27345520, -38707320, 16441672, --173409, -5594732, -667867, -13255343, -15224585, 18165564, -39795556, 39638252, 22813792, 4515085, --26329224, -20451024, -17585744, 2746095, 6329171, -17655000, -2767033, -13277355, 27415850, 11730629, --5517423, -1753957, 10953240, 1664837, 12539694, -23703388, -9619653, -3081102, -4687957, -22083648, --15645492, 11749957, -41147936, -24591908, 2126546, 46432356, 21641266, -14954002, -2302103, -36203352, -15784542, 54769424, -192737, -10688026, -11108933, -21068962, -903554, -23097260, -16187732, -45213656, -8735427, -33585572, -49640696, 10440529, 26043072, 5611375, 6351183, -21654688, -26662620, -7744900, --39068096, -19834696, 9154186, -33048162, 49580564, 8741332, -13172128, 9758166, -24918864, -48814988, --16758962, -37596532, 5068599, 9569187, -14095009, -27065274, -13846975, -17123498, 13350906, -20154134, --7576859, -3579318, 20967494, -16703128, -3417183, -8397198, 4976257, 7915625, 1141924, -7536594, -21786758, 28018756, 18183818, -15957414, -12586402, -43831216, -24148454, -10792179, 11053098, 70928704, --12512850, -78383, 31844498, -3766686, 13533442, -17134236, -17051558, -14437533, 15247134, -41115720, -461172, -5702643, -250182, 35093104, -15039365, 53563612, 5289789, 41341744, -50523848, -13259101, -16151761, 3177202, -19063212, -3236795, -44744968, 20428476, 31712964, -24036248, -19988240, -7132867, --21917218, -26053272, 6071473, 7062000, 19061602, 401043, 16523813, 30400316, 31343598, 20928838, -6504728, -24027658, 1392643, 11870216, 15316390, 24640764, -747324, -13335337, -19904490, -7488276, -24282672, -10773389, 8833137, 21705154, 969052, 42994232, 3737695, -27999966, 22590992, 23272818, -5434208, 9844065, 20467666, 3162707, 350577, -25730612, 53264572, -58814744, -44633836, -50235012, --18248242, 9938554, -31141734, 14658723, 30786862, -10128607, 1178432, 28382218, 7074885, -31751620, --13115220, -24734180, -5873905, 1196685, -971200, 27216670, 24676734, -7050726, -9871445, 16684337, -39027296, 6403260, 31242666, -30294552, 27001386, -14551886, 5833640, -6892886, -24943560, -12400107, --24815784, -50064824, -50411640, -36417028, 7634841, 94085552, 23852100, -12761422, -28281822, -67652712, --95346128, 21769042, 39628052, 47690244, -9896678, 4363150, -27904940, -48425756, 14117558, 9125732, -15917686, 2593624, -40766756, -12152610, 10042170, -7864622, -1549946, -7357279, 53265648, 47115792, -31561568, -2463701, -22784264, -38340636, -25622702, -22733262, 36397164, -5512591, 26647050, 12572980, -12507482, -15767362, -88356608, -60245508, 30112016, -47227996, -16289737, 102720048, 70194800, 53469660, --39887360, 29692720, -27605366, 2915209, 2092723, 15765214, 43337292, 77292232, -29123636, -1595580, --50206556, -39405252, -66468912, 8545911, -2676302, -70208216, -17100950, 47716548, 17294222, 33906084, -43679280, 80481248, -57353920, -32587528, 4408784, -45462764, 18736258, -42266236, -129439576, -120819040, --71211632, -77146736, -22548042, 115772992, 56724708, 119227216, 105480640, 167622912, 118631832, 101180840, -12719009, -50583440, -108174120, -171073920, -145617648, -147006528, -78655880, -40407052, -12624519, -3526168, --113817, 24652576, 35100084, 94291176, 56014964, 112112608, 72047000, 95407328, 32202592, 92010008, -29635274, 18871012, 18968186, -10587631, -31060130, -70377872, -79441864, -145251504, -99919192, -182777168, --144417200, -220810176, -131583840, -106485664, -27976880, 54411868, 28213104, 395674, 56031068, 121660856, -166094976, 216791152, 261487280, 221213904, 162636448, 201089824, 167722224, 90364504, 40964860, -15470472, --72275712, -168841600, -195497792, -265582528, -336538080, -394280160, -350017280, -314129600, -216494272, -153952560, -55143084, 144438672, 201697040, 252096320, 160200128, 106504992, 0, 0, 0, 0, -0, 0, 0, }, +-67109, 317828, -6643241, 1188632, -184147, 210990, -4071092, 1222455, -7295002, -3908957, +1842004, -1560684, 2344515, 3863860, -2347737, 2735894, -3688303, -402116, 3347927, -998580, +2068564, -5641440, 687732, -12885, 1688459, -1324997, 1964948, -2812130, -1526861, 1977296, +-4854387, 1438277, 1396401, -1577864, -2652679, 7001334, -1620276, 1882269, -2807298, -977105, +943819, -5814312, -3759707, -3112241, -2216203, -2803003, -2863670, -52613, 143881, -2734284, +956704, 194884, 2765959, -2286533, -1091459, -261993, 1220308, -1404454, -3934190, 4258997, +3278671, 1841467, -1231045, 1731409, 383326, 2673617, -3260954, -6189048, -5268315, 694711, +-3234110, 2296197, 5021354, 1111323, 3317325, -8733816, 4890894, -6681896, 613643, -2925947, +-1042066, 2370285, -4221416, -7497939, -2062121, 462783, -4395899, -2580202, 3366718, -2263448, +1452236, -9335648, -986232, 6070400, 3110093, -10420128, -3743601, -2835215, -2937758, 3336116, +-1709934, -5485210, -3576097, -3955128, -4111894, 6649683, 1898912, 4242891, -3048890, 5615133, +4983773, 3600793, -2289755, -4969277, -4051765, 302258, 735513, 7698729, 2525978, 1392106, +-3913789, 761283, 91805, 811749, 2840584, 1755568, -5546414, -4568772, -2583423, 2786897, +400506, -1053341, -5927055, -1779190, 1945083, 2519535, -2565169, -900333, -164283, 2681670, +-886911, -3023657, -311922, 401579, -4194036, 8180302, 156229, -5648419, -415538, -1014149, +-5553930, -5021891, 5897527, 5401995, -4195646, 3282429, 431644, 1726040, -14009110, 5534602, +-1978906, -9579388, -12451647, 401579, 9225053, 607201, 6032819, 272194, -11233487, -3877819, +1459215, 4021700, -1850057, -935766, -4630512, 667331, -704912, 8067023, 4257923, 1730335, +1619740, 2200097, 2975339, 7340099, 4632659, -6473053, -353261, 1502702, 1770600, -7713225, +2716567, -2308008, -4655208, -1403917, 18790, 5236639, 1588064, -2986613, 5578089, 8267812, +-1512902, -3216394, 2270427, -667331, 4816806, 4553739, 3909494, -5659157, -3944928, 3876745, +-1382980, -1527935, -3952444, 308164, -6008659, 3591130, 3744138, 4246649, 1510755, 4918275, +-5229660, -3879429, 7710540, -106300, 3178276, 7823820, 7046968, 498753, 2638184, -6185290, +-5288716, 2813204, -1577864, -2339684, -2968359, -2752000, 2022930, -7121593, -4179540, -8763344, +-10558640, -2034741, 8474507, 5468030, -3671123, -1078037, -1384590, -2114198, -7671349, 5293547, +-2071785, -2015413, 274341, 3434363, -1890859, 227633, -469762, 5021891, -4934381, 5041755, +2569464, 6064494, -2324651, 4679904, 1870995, -2999498, 4031901, -2961917, 2206540, 4496294, +-3700651, 4730370, -3131568, -2345589, -1013075, -1450625, 2101850, -1422171, -3952981, 1436667, +-3490735, 674847, 74625, 481573, 6828461, 1398012, -2057826, 47245, -3384434, -4107063, +1665911, -968515, 6372121, 7047505, 2287070, -1904818, -1706176, -2147, -3476239, -3151969, +2698313, 5574868, 13794361, -5727339, 5705864, -6919729, -5794448, 97711, -1541893, -1421097, +2005750, -2877628, 6030134, 5848135, 5061619, -1429150, -538482, -2525978, -6216965, 1044751, +-3684008, -650151, 818728, -2068564, 3737159, 1414655, -296353, -10400800, -4218732, -6538014, +397821, -4262218, -6465537, -2857764, -3494493, -4003983, 6768332, -5224291, 4831302, 447213, +-1677722, 2647311, 2440615, -4678830, -1079111, 142271, 5319854, -439697, -6721624, -8786966, +-8939974, 2439542, -3087545, 250719, -439697, 1380295, 3417183, 5162551, -3199214, -1815697, +2039573, 1814624, 1041530, 6469295, -3164317, 4025995, -6899328, 14497125, 2290291, -1468879, +3389266, 1450088, 3434363, -3947612, 104690, 1142998, 599148, -882616, -5621039, -6550362, +1132798, 1404991, 601295, -898185, -3862249, 2552821, 2065879, -5897527, 7269232, -8712878, +11099806, -909996, 3801046, 1779190, -80531, -1015223, 2393908, 10428717, 11651173, -2043331, +2207613, -1225139, -1503775, 1688459, 2572149, 8056285, -878321, 2552284, -3875671, 4487704, +1076426, 6382322, 3125663, 5986648, -8301098, 3699578, 3164854, -2494302, 7516, 6479495, +116501, 642635, 2007897, 3994320, -1232119, -408559, 12276090, 5944772, 1138703, 1240709, +-2505577, 5666136, -7343857, -10698764, -13067438, -700617, 6890202, -117575, 3423089, 9387188, +3651259, -1582696, -3320547, 5007395, -1034550, 11987791, 5279589, 1764695, 1541893, -6584722, +1220308, 4810364, -2719788, -7599945, 1056562, 1917703, -15349139, 2314451, -609885, 11551315, +-7598871, 5418638, -16301012, 7270306, -1010391, -7978439, -8876624, -5979668, 5619965, 4583267, +13393319, 2352568, 4842039, 12929999, -1562831, -8259222, 1908576, -6201933, 2248416, 10691247, +2426120, -2108292, -626528, -1207423, 3505767, 4593468, -260919, 3320547, 5719286, -2474975, +2197413, -5293547, 97174, -6801081, -619012, 1818919, -3019899, 6389301, 4390531, 5581310, +10071698, 1445793, 12072616, 9654550, 4845260, -5092758, 13775034, 6576132, 2925410, 12480638, +-642635, 1222455, 1602023, 4830228, -1748589, -2335389, -7227893, -6575058, -5532992, 1203665, +-4174708, 11329587, -5298379, 5467494, 7206955, -2175938, 1312113, -1394254, -549219, -8244727, +-9960029, 7266548, 146566, 13385266, 551366, 188979, -1183800, -2589329, 2458332, 568546, +-6743099, -8723079, -11752641, -6199786, -12290049, -7876433, -4116726, -9170829, -5682242, -4021700, +-4638565, -12402792, 8630200, 5297842, 463320, 4450123, 2219424, -3469260, 15552077, 912681, +-5120138, -2825015, -10213432, -4518843, 11675869, 520765, -9363029, -9639517, 1663763, -9754408, +3400004, 3378529, -7266011, 273267, 2696166, 517007, 11623792, 3362423, -4764730, 1134945, +-5759551, 5697274, 1251446, 2542084, -13304735, 9543954, -4223027, 4022237, 872952, 1932198, +2861522, 476205, -3363496, -156766, -4673462, 221191, -10089415, 212064, -10865730, 15803869, +-1675574, 10288057, -6152541, -2779918, -304943, -6651831, -2654827, 7176891, 1811939, 1619203, +-6932077, -122407, 4966056, -13259101, -66572, -5802501, -4604205, 9187472, -15214922, -14471355, +3703336, 18958522, 467615, 1653026, 1457068, -3090229, 10460930, 9969693, 5876052, 2676838, +-2740189, -15754477, 9232569, -157840, -12411919, -4268124, 2928631, -898722, 155693, 984084, +-2936684, -12562779, -621160, 172872, -2161979, -5470178, 3765076, 10255845, -13616657, 8133058, +-5035313, -3008625, 930397, 6314676, 22407918, -14898705, -3497714, 891206, -1284195, -3200288, +891206, -6131066, 2087891, -5644124, 15496779, 4558034, 3058017, 3454764, -3038153, -1730872, +8322573, -2207076, 3751654, -7778186, 12002823, -638340, -8066486, 15129559, -10202158, 6047851, +2461553, 1924145, 12298639, -7011534, 5471252, -3636764, 248034, 16313896, 1293322, 4261682, +4859756, -2720325, -9353902, -7352984, 1161252, 16304770, 9281424, 2004676, -14535243, 2095944, +-7968238, 39192, 16369731, 15677168, 7988103, 10590316, -9497783, -19832548, -10298258, -14301704, +8003672, -164819, -2321430, -80531, -10706280, -3237869, 3453691, -2062658, -3986804, -4029753, +11689827, -784368, 3287261, -3325915, 7733089, 1563368, -4204773, -9238475, -6878927, 20874614, +-702764, -4784057, 6900939, -12013560, 3984656, -6904160, -20635170, -4752382, -2439005, 6252936, +2727841, 5478768, 2098629, 8184060, 677531, 484258, 4982162, -20517596, -2776160, -5595269, +-957241, 1859721, 12286291, 12814572, 5302674, -3547643, -8210367, -11913702, -3108483, -7103339, +2445447, -3620658, -2542084, -7740068, -23117124, -14952392, -3076270, -5145371, 12565464, 8753680, +-1464047, 21232170, -20467130, -4436165, -7388955, 22636088, 11185705, -6842420, 8732205, 3555159, +-8068096, 15759309, -16318728, 8800388, -7190312, 1752884, 2447595, -5211943, 15413564, -9972914, +9720585, -3908957, -21112448, -3192771, 15876347, -8789651, -14169634, 615791, -1140314, -21826486, +-3422015, 9330280, 4544613, 12264279, 9509058, -2109366, 22206592, -4718022, -5736466, -10121627, +-8908299, -9078487, 6797323, 8380018, -5914707, -7377143, 3583613, -6350646, 10045929, -2087891, +6010807, -3264712, -4342749, -3897146, 1183264, -12222403, 4819490, 9432285, -584116, 4268124, +7151121, 6769942, 13521094, -8017094, 5916855, 9319005, 1416266, -19118510, 18173618, -9428527, +-25674240, 1376537, 20451024, 25772488, 5835250, -7765838, -5523865, 3796751, -3115999, -2585034, +12033425, 12220793, -4087198, 11848741, -12090333, -316754, 10924249, -3373160, 12965969, 6842420, +-322123, -14701673, 7454453, -2378875, -2497524, 2223719, 134218, -290447, 23390392, -9392557, +12615930, 20357608, 14485314, 8391292, 1651415, -10956462, 13917842, -5428839, 13354127, -5114233, +4233227, -11484743, -1010391, -10718628, -6592775, 3613141, -9950365, -1405528, -2383707, 1378148, +11972221, -10183904, -8665097, -1792075, -4163434, -351650, -8429410, -11123428, -14710800, 4037269, +15047418, 1611687, -6006512, 4092567, 5141613, 13243532, -8748312, -3211025, -781684, 3425773, +10911901, 4522064, 5937256, -2174864, 2213519, 13330505, -45433776, -21731460, 14798310, -37137508, +-25844428, -1897839, -15331960, -10562398, 10965588, 12632573, 3646964, -2600603, 4358318, 36603320, +-4826470, 5666136, 13861470, 15937550, -17125108, -8937290, -8290361, 13382044, 14502494, 7242389, +2381023, 13688598, -4445828, -7180649, 9394704, 18602040, 962073, 5866389, 18750754, 13901735, +11115375, -8808441, 3220152, 5575942, -451508, -542240, 11859478, -4261682, -627602, -1485522, +7760469, 54224, -13888314, -9258339, 2233383, -18525268, 13351980, -4353486, 30061012, 892816, +16266115, 2970507, -1217623, -10232760, -959925, 3489661, -13396540, -7122667, -15556908, -2441689, +7269232, 9903121, -4995584, -25255482, 8552354, -4726612, 8154533, -9784472, -10512469, 6522445, +-15413027, -13569412, 25604984, 18931142, -7735236, -20578798, 9709310, -10455561, 5259725, 330712, +-9920301, 20114942, -25444460, -460098, -30840550, 1388348, 26094074, 36219996, 17500918, -5483600, +17128330, -613643, -1598265, 2413235, -2092186, 9404905, -368830, -15998753, 1706176, -22479858, +8900783, -6481106, -4393215, 16222628, 476741, -17090748, -19086298, 5342403, 3593277, -9171366, +-7388418, 15673409, -20667382, 672699, -3406983, 8428336, -4802847, -3838090, -16224239, -6464463, +-6529961, -2314451, 13593035, -13813689, 6533182, -810138, -1258425, 2976949, 6758131, -23889144, +-1154273, 4549444, -572841, 10481868, -6080600, -9714142, -3051574, -26524644, -10107132, -10624138, +3123515, 13666049, 20933134, -6553047, 17160004, -21048024, 41865192, 5370320, -460098, 24080272, +-7657927, 22936736, 1318018, -16354699, -344671, -2465848, 10655814, 7017977, -9958955, 11541651, +241592, -25756918, -28020366, -2681133, -8413304, 7004555, -1163399, -9905268, -25241522, -22058416, +12080669, -18771154, -4158602, 1184337, 5998459, 1397475, 18092012, 1503239, -9047885, 12068321, +-1532230, 1751273, 11232950, -14716705, -879395, 3162170, -14906758, 9065065, 12561706, 5396627, +11196980, 5747203, 17291538, 4634270, 12629888, -17632988, -5348308, -2881386, -23432268, -220117, +-2388539, 9759776, -1402844, 11181947, -1694365, -13847511, -9109626, -899259, -21582748, 9330816, +852014, -4520990, 13026636, 7731478, 10892574, 10562398, 3688303, -1864553, 9599789, -30275224, +9337259, 2793339, 13604309, -6525129, -20588462, 11162083, -3233574, 18130130, -29671782, 15650861, +14513231, 53097608, 40128416, 5420249, 11637214, 3349001, 30836254, 823023, 15014132, -14035953, +36524940, -14502494, 33125472, -1532767, 21164526, -2513630, 14940044, -14907831, 3588445, 7390565, +-8130373, -2738579, -4364224, -3513283, 9886478, 140660, -8517994, -11849815, -17718350, -22659174, +-10836202, -3929895, 136365, 6943352, -18992882, 7882876, -10457708, -16306380, -3364033, -11985643, +5365488, -3100967, -24729348, -6135361, -12589086, -15175730, -15668041, 13881871, 18932216, -40033928, +8953396, 3126736, 11086384, 3483755, -5072357, 23498840, 13421236, 11986180, -33305860, -15517717, +-558346, 7428683, 27343372, 143881, -3903589, 279173, 23054310, 19643032, -20134806, 20778514, +1238561, 2878165, -4403415, 9927817, -29248190, -16459925, 12683038, -7663833, 10803990, 17869212, +-24232206, 5043902, -14666240, 35345432, -23962696, 19148038, 17469780, -9271224, -36713916, -22137872, +-4230006, -11150809, -2978023, -17847200, -27291832, -35618164, -21283710, -24357296, 7720204, -21115132, +6017786, 361851, -4197257, -3916473, -17813376, -6830072, -18257906, 2814814, 12487617, 17044040, +-1695975, -7322383, -18732500, -5977521, -414464, -11940009, 738734, -15727096, -11027329, -4037806, +-15714748, 8632347, -14151917, -37569152, -869194, -3300682, -13908178, 12830678, 9579388, 14867029, +4318053, 11117523, 25055766, 2089502, -29606284, -8856759, 10391673, -8786966, -25129316, 9655623, +15378667, 2791729, -2791192, -34230352, 24568824, -5405753, 19373524, -23371064, 19414862, 49353468, +-8498130, -10142028, -43192340, 15142981, -56737056, 38054484, 13967771, -9494562, 40711460, -3631932, +-19969988, 35874788, -13186623, -1788317, 8128763, 12593918, 33600068, 1415192, -2033130, 23314156, +10568304, 19537806, 24654722, 17692580, 2388539, 12299176, 2742874, -1410360, -12297028, 8174934, +13404056, 2765959, 120259, -14478872, 7698729, -13645648, 16893180, 15295452, 3706020, 18085570, +-10460930, 11692512, 20322174, 11641509, -24977382, -28732258, 33972656, -4022774, 21685826, 31003222, +1902671, -1000191, -2150705, 5135171, 19651086, 16260209, 3057480, 13154948, 1260036, -18173618, +-19463182, -32454384, 1833951, -14413910, 1749662, 15231565, 17623324, -31200254, 3786551, 8329016, +-23897198, 916439, 36330592, -19089520, -16325708, 14028974, -19340774, -1767379, -6295885, 3587908, +-20526186, 3860102, -23678154, 46930032, 11120744, -26003342, 9130564, -6526740, -23116050, -27274116, +-27530204, 7340636, -1823751, 23172422, 34884260, 16309065, 8098161, -4986457, 11284490, 405874, +-44956496, 18788334, 45786500, -31012886, -32245004, -28239946, -39309152, 27345520, -38707320, 16441672, +-173409, -5594732, -667867, -13255343, -15224585, 18165564, -39795556, 39638252, 22813792, 4515085, +-26329224, -20451024, -17585744, 2746095, 6329171, -17655000, -2767033, -13277355, 27415850, 11730629, +-5517423, -1753957, 10953240, 1664837, 12539694, -23703388, -9619653, -3081102, -4687957, -22083648, +-15645492, 11749957, -41147936, -24591908, 2126546, 46432356, 21641266, -14954002, -2302103, -36203352, +15784542, 54769424, -192737, -10688026, -11108933, -21068962, -903554, -23097260, -16187732, -45213656, +8735427, -33585572, -49640696, 10440529, 26043072, 5611375, 6351183, -21654688, -26662620, -7744900, +-39068096, -19834696, 9154186, -33048162, 49580564, 8741332, -13172128, 9758166, -24918864, -48814988, +-16758962, -37596532, 5068599, 9569187, -14095009, -27065274, -13846975, -17123498, 13350906, -20154134, +-7576859, -3579318, 20967494, -16703128, -3417183, -8397198, 4976257, 7915625, 1141924, -7536594, +21786758, 28018756, 18183818, -15957414, -12586402, -43831216, -24148454, -10792179, 11053098, 70928704, +-12512850, -78383, 31844498, -3766686, 13533442, -17134236, -17051558, -14437533, 15247134, -41115720, +461172, -5702643, -250182, 35093104, -15039365, 53563612, 5289789, 41341744, -50523848, -13259101, +16151761, 3177202, -19063212, -3236795, -44744968, 20428476, 31712964, -24036248, -19988240, -7132867, +-21917218, -26053272, 6071473, 7062000, 19061602, 401043, 16523813, 30400316, 31343598, 20928838, +6504728, -24027658, 1392643, 11870216, 15316390, 24640764, -747324, -13335337, -19904490, -7488276, +24282672, -10773389, 8833137, 21705154, 969052, 42994232, 3737695, -27999966, 22590992, 23272818, +5434208, 9844065, 20467666, 3162707, 350577, -25730612, 53264572, -58814744, -44633836, -50235012, +-18248242, 9938554, -31141734, 14658723, 30786862, -10128607, 1178432, 28382218, 7074885, -31751620, +-13115220, -24734180, -5873905, 1196685, -971200, 27216670, 24676734, -7050726, -9871445, 16684337, +39027296, 6403260, 31242666, -30294552, 27001386, -14551886, 5833640, -6892886, -24943560, -12400107, +-24815784, -50064824, -50411640, -36417028, 7634841, 94085552, 23852100, -12761422, -28281822, -67652712, +-95346128, 21769042, 39628052, 47690244, -9896678, 4363150, -27904940, -48425756, 14117558, 9125732, +15917686, 2593624, -40766756, -12152610, 10042170, -7864622, -1549946, -7357279, 53265648, 47115792, +31561568, -2463701, -22784264, -38340636, -25622702, -22733262, 36397164, -5512591, 26647050, 12572980, +12507482, -15767362, -88356608, -60245508, 30112016, -47227996, -16289737, 102720048, 70194800, 53469660, +-39887360, 29692720, -27605366, 2915209, 2092723, 15765214, 43337292, 77292232, -29123636, -1595580, +-50206556, -39405252, -66468912, 8545911, -2676302, -70208216, -17100950, 47716548, 17294222, 33906084, +43679280, 80481248, -57353920, -32587528, 4408784, -45462764, 18736258, -42266236, -129439576, -120819040, +-71211632, -77146736, -22548042, 115772992, 56724708, 119227216, 105480640, 167622912, 118631832, 101180840, +12719009, -50583440, -108174120, -171073920, -145617648, -147006528, -78655880, -40407052, -12624519, -3526168, +-113817, 24652576, 35100084, 94291176, 56014964, 112112608, 72047000, 95407328, 32202592, 92010008, +29635274, 18871012, 18968186, -10587631, -31060130, -70377872, -79441864, -145251504, -99919192, -182777168, +-144417200, -220810176, -131583840, -106485664, -27976880, 54411868, 28213104, 395674, 56031068, 121660856, +166094976, 216791152, 261487280, 221213904, 162636448, 201089824, 167722224, 90364504, 40964860, -15470472, +-72275712, -168841600, -195497792, -265582528, -336538080, -394280160, -350017280, -314129600, -216494272, -153952560, +55143084, 144438672, 201697040, 252096320, 160200128, 106504992, 0, 0, 0, 0, +0, 0, 0, }, { 4442070, --1763621, 2601677, -6839736, -655519, -2604361, 3244848, 589484, -2800856, 4190278, -3695819, --930934, 3333968, -1308891, 1451162, -5663452, -995359, -713501, -5924908, 752156, 81068, --200253, 1653562, -2985002, 703301, -1089311, -380105, 6172405, -674310, -4259534, -2035278, -409633, 1458141, -4109747, 1070521, -3109020, -68719, -1196148, -1873680, 3390340, 3307125, --2367064, 4380867, 4456029, -5549635, -933082, -586263, -5206037, -2241436, -3605088, -4102768, -912144, 989453, -512712, 469225, 1952063, 2110440, -1163399, 671089, 1888712, 5239860, -3013457, 2350421, -2647847, 233002, -1479616, 3271155, -3713536, -2676838, 2877091, -1714229, -3119220, -3618510, -1782411, -1217623, -2197950, -12145094, 4277788, -6987912, 3518115, -4013110, --8071318, -13798119, 2222646, 246961, 3249143, 2863670, -1135482, -1152125, 843961, 8098698, --6042482, -10588705, 3272765, -4459250, -7192460, -9664, -1238561, 4197257, 1346472, 2962991, --3343095, -898185, -2261837, 6912750, -2115808, -2944200, -2703145, -1336272, -1899986, -2910377, --2695629, -1810866, 1185411, 522375, 712965, 175557, 1621887, 2928094, 1307281, -2695629, --8137353, -107911, -5720360, 787053, -579821, -2510945, 3344706, 260919, -176631, -7861401, --3427384, 1122060, -814433, 2852395, 11811, 2581275, -2477123, 1182190, -1169305, 5086315, --1889786, 2837363, -4506495, -3996467, -5609228, 721018, -1381369, -1007707, 27917, -1096290, --8615168, -1817845, -1160715, -2482491, -1127429, -2987150, 2816425, -1222455, -1016297, -313533, -49929, -248034, -2071248, 7518877, 4888747, 7856569, -3712462, 7813620, -4671314, -3384434, -3092377, 8651138, -169114, -5419712, -7807177, -5748277, -1047972, 6118181, 2493766, 1982664, -2817499, -2880849, 4301947, 397284, 3234110, -1699196, -7074885, 1786706, -4868346, -3548180, --3387656, -995359, -8980240, -597000, 521302, -3972845, 8571144, -1797444, -2629057, -3602404, -32212, 730144, -3503620, -86436, -4315906, -1891933, 268435, -2057826, 6246493, -39192, --1471563, 3180423, 2371359, 5406290, 2467459, 6545530, 1890859, 5310190, -6078453, 1414118, -5340255, -1944010, -4175782, -6402186, 337155, -589484, 9738838, -4378183, -3364570, 1005022, --2136209, -1576253, 4896263, -3754875, 4714264, 2187212, 127775, 2430415, -3118146, -2955474, --5488968, -5898601, 7842074, 3738232, 2770254, 4224101, -2719788, -1784559, -1998770, 9921911, --3809636, 10857140, -353798, -2707440, -2595234, -5680631, -6153615, -7425999, -459562, -1834488, -1350767, 7269769, -620623, -3334505, -10080288, 401579, 7985418, 11796128, -5532992, 3084860, -2135673, -2934000, -2692945, 3118146, 11082626, -2599529, 1697049, -897648, -1690607, -984621, -5257577, 7762617, -5930813, -3105798, 2272575, 10161356, 1545115, 7215545, -6015639, -5359583, --504659, -836982, 1792075, 1589675, -450435, 680215, 638340, -2603287, 681289, 3255048, -1724429, -2112050, 15670725, -11256572, -2711735, -4844723, 958851, 3963718, 7374459, -7947837, -4962298, -2287607, -8400956, -13400835, -2983392, -5858873, 632971, -1539746, -5847061, -3121904, -2754148, 2947958, 9945534, 5398774, 4905927, 245350, 1309428, -5607617, -3914863, 7941932, -5986648, 3983045, 1658394, 3649112, 514322, -272194, -7218230, -10046465, 6169721, -2913599, --6902550, -3448322, -4476967, 3150896, -3993783, 7932268, 1534377, -5118528, -2709588, -4013647, --3563212, 3666828, 5666673, -911607, 3671123, -3411815, -3792993, -404801, 360777, -3655554, --1728724, 4294431, -452582, -2490007, -2891587, 2040110, 2319282, -986769, 2873333, -204548, --3184182, 7459285, -1976222, -33286, -559956, -11128797, 2619930, 1434519, 2905546, -10460393, -3233574, 537408, -2796561, -5540508, 2922188, -5277441, -614180, 10267119, 15355045, 7764227, -8638253, -199179, -3704409, 6580427, 5960878, 2742337, 3390340, 7764227, -639413, 5756867, -5635534, 8038032, 7765838, -5585068, 5357435, 17180, 2178085, -5179194, 2161442, -347892, -5464809, -1539209, -946503, -3545496, 4112968, -5717139, -4485557, 883690, 5738613, 3256659, --2673617, -1257889, -475668, -1714766, 3682935, -6974490, 7282117, 339302, 8943733, -11578695, -1385664, -10397579, -2839510, -3076270, 3507378, -781684, -1859721, 2695092, 1502165, 3220152, -5284421, 7930657, -279710, -5845988, 2017561, 10530186, 2838437, -2766496, 33823, 6482180, --2505577, 3891777, -2349347, -11174431, 7175280, 5856188, -16491064, 173409, -3750043, 1409823, --9298604, 1028645, 1382980, 12076911, -9871445, 44560, -13201656, 2902861, -8043400, -1988570, -317291, -4334159, 3603478, 1618129, -7014756, 80531, -292058, 6280316, -4328254, 10146860, --329639, -8853001, -4719632, 10812580, -1267552, 4321274, 2648921, -1799054, 6234145, -7175280, --7041062, -5278515, 474594, -6860674, 7021735, -4009889, 4392678, -6632503, -380105, -8057359, -4992363, 738198, 6029061, 5712844, -5726265, 10718628, 8749922, 8642011, 1324997, 9076340, -7027104, -7613367, 6163278, 3195456, 169651, -7057705, 2816962, -5995238, 5513128, -2541547, --5299990, -519154, 8392903, 3249143, -10928544, 9889162, -1499481, -3428995, -6694244, 10041097, -7636452, -7522635, 5492727, 23822572, 4419522, -490700, -7612830, -14704357, 4318053, -1791001, --21775484, 19941534, -8990440, -13668733, 3443490, -462246, 3094524, -472446, 4252555, 6063957, -552440, 82141, -10877005, -501974, -587874, 13839458, -1949915, 794032, 5435818, -1902671, --1135482, -5000416, 11962021, -8128226, 8798777, -1581622, -6309844, 1744831, -7106024, -3428995, --11874511, 2663954, 6298570, -2887292, -5608154, -4430259, 8141648, -11173894, -2119566, -5252745, -498216, -1163399, 2204392, -9600863, 10572062, -13285944, -8704288, 4292283, 2447595, 35970, -4510253, -6589017, -9445707, 1877438, -1882806, 151934, 6048925, -5508833, 5654862, 3890167, -12538620, -2405182, 2922725, -57982, 1631551, 16701517, 3063922, 16745004, -1469953, -4104378, --17732846, -2819109, -4076461, -14479408, -24554864, 6832219, 11839614, -9329206, -4833449, 6497212, --3203509, 14393509, -2290291, -8500814, -5388574, -22848690, 6904697, 2011118, -2689723, -16188269, -3044595, -9218610, -2974802, -8145406, -4606890, 10670309, -11397769, 4143033, -16553878, 9681930, -1294933, -251256, -5312338, 753230, -2827699, -9291088, -17457432, 2812130, -767725, 3156264, -6175626, -4458176, -2178622, -11124502, -6387153, -3257733, 3646427, 2701535, 6979322, 12272332, -8909373, 4736812, 6525666, 1961190, 6795712, 6754373, -8003135, 7801271, 7963943, -2153926, -10988137, -1526324, 13015898, -6579890, -16916266, -2709588, 8231305, 10700374, 10649908, -2486786, --23612120, -2160369, -3571265, 964757, -3718905, -4843113, -955093, 22950694, -5051419, -5491116, -7635915, 12381854, -914828, 5788542, 14264660, 10384157, -23541252, -21523154, 108985, -2006824, -3084324, -9569187, -17230872, 4154307, 13626321, 9169755, -10073309, 16262894, 12914430, 12367895, --20745766, 5948530, 10619844, 681826, 1447404, 9325448, 20995410, -3957276, -9929428, 6583111, -4552666, -2733210, 11186779, 17278654, 2895882, 17900886, 7425999, -13132936, 1148904, 14886894, --1967095, -5848672, 7207492, 1425392, 2456185, 15634755, 9433896, 5459441, 1318018, -17702782, --18807124, -1303523, 2295123, 4999342, -6279779, -554051, -5421323, 1854889, 1513439, -6570226, -1755031, -3911642, -1983201, -5497558, -361851, 11755325, -7885560, -16064788, -3876745, -13501767, -1552094, -4297115, -2267206, -695248, -39738112, -25316148, -8667781, 5553930, -3790309, -10968810, -263067, -10721849, 25366076, -12263742, 15739445, 25078850, 12871480, 11649025, -11853573, 7986492, --6648610, -13674102, 9170292, 11091753, 6738804, 16443282, -1444720, -2325188, -9450539, -9470403, --8485782, -12513924, -12431246, -8830453, 2535641, 91805, -1734630, -8398272, -5465346, -12190191, -2819646, -10726144, -10153840, -5208722, 2801393, -1488743, -7444789, -17119202, 122407, -6091338, -3898757, -19949050, -16124918, 14740865, -4315906, -4622459, -9373229, -6102075, 10249939, 2421288, --4459250, 5127117, -3801583, 5377836, 3479461, 6334540, -7745974, -10933913, -25631828, 4295, --24976308, -3205656, -21529598, -4463545, 15978352, -3985730, 940061, -14641007, 26851598, 958851, --18617072, -15786152, 17067126, 13370233, -11693585, -11450920, 22754736, 14442901, 1399086, -12859669, -2198487, -5253282, 11155104, -7916162, 1903744, -3233037, -1749125, 23148800, -2549063, -6076842, -4974109, 4047470, 7600482, 7200513, 1539746, -8977019, 7636989, 3515431, 8657580, 17761838, -8948027, -25579752, -6474663, -4227859, -18705120, 7474854, -2519535, 259309, -10009958, 9032853, --3325915, 1533303, -13252658, 9340480, -10609106, 620086, 12339978, -2211908, 12976170, -9820980, -15954193, -19710678, 10573136, -361314, -5937256, 24463596, 7676181, -5966784, -14017163, 5677947, --2141041, 1116155, -1379221, 8111046, 14539538, 17235704, -10955925, 6883759, -4063039, 14863271, -6354941, 384936, -1731946, 7408282, 0, -9709310, -38216620, -24671902, 20824148, -14958297, --14086956, 8177081, 18220862, -29573534, -4836133, 7364795, 2025077, -15287936, -23242216, 44109316, --18814642, 6267968, -21416318, 12174085, -7434589, 20841866, 18234284, 2216740, 3244848, -23935852, --27380, 11927661, -9869835, -14064944, 11511049, 3733937, 12399034, 10378252, -2115808, 4669703, --2802466, -1002338, 18260590, -15014669, -9256191, 15317464, -707059, -11130945, 15452219, 201863, --3555696, -9811316, -4793184, 6497212, -8381092, -146029, 5304822, -9604084, -10891500, -6074695, -7687992, -21722334, 10605885, -35433, 21320754, -19187230, 6488085, -14259828, 5421860, -8016557, --12081206, 20774756, -11044508, -3278671, -10775536, 10004053, -12292196, 8853538, -4393752, 16214575, -14330158, 411243, -22090628, 18528488, 8612483, -22514756, 6648610, 22591528, -2818572, -747861, -10036802, -7805566, 15643882, 14012868, -20364050, -12866648, -4364224, 9507984, 17974976, 2457258, -9200357, 20246476, 15065672, -23132156, -3141769, 34393560, 7963406, -3299072, -4933844, -7616588, --11143293, 2118493, 7879118, 8620536, 8192650, -7371775, -15875810, 2967286, -8647380, 7158637, -23562728, -7647190, -25311852, 28091770, -9681393, -17402134, 22869628, -5594195, -7967701, -26782880, --5488968, 9063455, 4066260, -7037841, -11705396, 8214662, 27917, -13471702, 9031242, -4171487, -22050362, -18985902, 1241246, -5417028, 25288768, 6782290, -39045012, 9349070, -17212618, -9342091, --15086073, 13266080, 52155936, 16267189, 1022739, 8507256, 13100724, -24617678, -12135967, -11542725, --18232674, 1578937, -8247411, -28573344, -12178917, 1953136, -11628624, -35951024, 31143344, -5980742, -14012331, 2668249, -16531329, -28345174, -27383638, 30680562, 18612240, 7067906, -10871099, -20463372, --15428059, -24298778, -6329708, 9136469, -3866008, 2054068, 3802120, -3922379, -12702903, -12044162, --20792474, -7333120, -4076998, 10282689, 6997039, 11306501, -5662915, -9135932, -4002373, 14768245, -1955284, 13106630, -43409236, -10022843, -199716, 9686762, -13958644, -399969, -16143171, 12750684, -10852845, 2356327, 53270480, 1118839, 16506633, 22294102, 739808, 7430831, 102005, -3490198, --6680822, 11480448, 16000901, 21720186, -774168, -3533148, 1141924, 14529337, 12363063, 1074279, -9939628, 9618042, 6571300, -1989107, 20607790, -4970888, 26693758, -25281252, -12634183, 21793200, --2239826, 2401424, 6841346, -26256208, 2659122, 5497022, 18969796, 28177670, -21203180, 6543920, --12821014, 20524574, 18712098, 3703336, 34556768, 11842835, 14647986, -10531797, -467615, -19587198, -34516504, -17679696, 6628209, 21750252, -3352759, -11477226, 11668352, -1445793, 6618008, 23235774, -2009508, -5357435, -557809, 5593658, 751082, -11360725, 10972031, 282931, -2228551, 38570952, --27062052, 28315646, 18726058, 34954056, 15041512, -22179212, 19709604, 1834488, 18405546, 45512156, --30404610, -11747809, -2720862, 2251100, 31316754, -16413754, 2898566, -17770428, 2817499, 35044248, --2514167, 36250596, 11137387, 7099581, 17145510, -20432234, -2407866, 16229608, 22844932, -34877820, --416612, -30194694, 14122926, -16363825, -755914, 4440996, -6881612, -22272090, 5163625, -38339564, --34005404, -265214, -481573, -21741124, 16094316, 4249334, -6741488, -20164872, 25494388, -6814503, -38422240, -6369437, 7385197, 13684840, -20392504, -6959458, 4822712, -23430120, -14146012, -20522428, -15937013, -16505022, -5684389, -5688148, 13550622, -13919989, -24266028, -32246078, -2379949, 26207354, -96637, -14908368, -7763691, -18765786, -7784628, -60130, 9436580, -21034066, -4004520, -4691715, --16586627, -20605106, -788127, 3349538, 11435887, 4502737, 20904680, 6311992, 26814018, -11958263, -21744346, -5983963, -20575578, -4733591, 36468568, -16534550, 15382962, -12055436, 26014080, -14789183, -7136625, 18174154, -3640522, -7195144, 654446, -10043781, 22671522, -23445690, -12475806, 25720412, --7735773, -21833466, -34378528, 40499932, -11716671, 34652868, -5603322, 28063316, 3650722, -7166153, --16910360, -11762305, -964220, 1587527, 21196200, -6336688, 9664, 6801081, -16369194, 30090004, -12419972, 2196876, -22193170, 17452600, 10292889, -17928804, 20330228, 2696166, -1144609, 5753109, -1252520, 25488484, -3717294, -29693794, 35138740, -16103443, -707059, 25692494, -8848170, -4401805, --12642236, 39948028, -15284178, -3845070, -22122840, -3775813, 5302137, 35782448, -13901199, 7495255, -13598403, 21642878, -2842732, -21174188, 26794154, 15524159, 22387518, -8634495, -1703491, 3366718, -24794310, -11119133, -22082574, -27466852, 18627274, -18985366, 8863202, 22039624, 23752242, -13019120, --270046, 29313152, -40489732, -335007, 12022687, 16415365, 4967130, -15828565, 7624641, 14169097, --7047505, -8139500, -49744848, 17650704, 10366440, 45369888, 39897024, -5322002, -13919989, -45749456, -1963337, 15947214, -19176492, 15573551, 27698244, 26780732, -11570105, 32133334, 28985124, 1779190, --16449725, -17918066, 29598768, 25142738, -34495568, -47568372, 64411088, 3678103, -3826279, 8722542, -5415417, 23982560, 24205362, -9134859, -7337415, 33503430, 16505022, -5669894, -21360482, 13638669, -3380676, 2013266, 12556874, 1852742, -307090, -13094818, 8172249, -3845070, -15507516, 29904784, --46731928, 33140504, 28199682, -44969920, -2400887, 22839562, 6506339, 25997438, -5415954, 3439732, -24651502, -3495030, 12913356, -22629646, -34454228, 98229664, -39808980, -57671748, -11855720, 108995536, -48041892, -48391396, -10208064, 17453136, 13739600, -3260954, 5078799, -21767968, -14567455, 22674206, -40689984, 940598, 68997040, -33596844, -14368276, 39323108, -207769, -4291209, -23516556, -44348220, -32974612, -23985244, -26381300, 16472273, -29049548, 11476689, -27682674, -29810832, -7093139, 4454418, -1599875, -8255464, 31341986, 6862284, 18164490, 8339753, -1843078, -958315, -17670032, -33818036, -7921531, 30942556, -28834262, 21265994, -29351270, -4024384, -3935264, -42753716, 27157616, -15483894, -9076340, -155693, -14696304, -160524, -32532766, 30150670, -24210730, 9694278, -37431712, -21786222, --48317308, 17022566, -23803246, -24321862, -21791590, -9997610, -2152852, 49192408, 15426449, 24754580, --8609799, -21960704, -30651034, 8977019, 360777, -47995184, -24179592, -85119808, -41544680, -30404610, --4114579, -35276176, -28342490, -12128451, -50575388, 11518029, 17185238, -43621300, 23469312, 4661650, --13267691, 2541010, -13025562, -1192390, 8513699, 12773770, 21306260, -25968446, 1554778, 30412664, --4424890, -14030584, 25957708, -11490111, 653909, -15544024, -7852274, -31461710, 6932614, 1465658, -16594143, -11867532, -274341, 23406498, -12381317, 1343788, 21416854, -44537736, 1032940, -51033876, --18667002, -33681672, 25763362, 11308112, -4350265, 13276818, -12686797, 14477798, 32920924, 11384885, -52384644, -28727426, -38147900, 34628712, 5750961, -21494164, -25661356, -6600828, 16845936, -16812112, --4509179, -13924284, -25878788, 16092706, 11700028, -28991030, -23645406, 31950262, -5626407, 14265734, --11708618, 20253456, 549219, 33840584, -23523536, -5762773, -941672, 14271103, -17768816, -19808390, --33610268, -68267432, -33965676, -12776454, 30289720, 39353712, -74512848, 13173738, -29392072, -40307196, --7985955, 47108812, 30302604, 25795574, -15786689, -17814450, -21217138, 23867134, 17050484, 36695128, -5146445, -47156056, -18161806, 35827008, -5063767, 10655277, 32313724, -15047418, -21659520, -34455840, --34266324, 408559, 23065048, 49016852, 36618356, 24154896, 10288057, -49778136, -52737904, 18782428, --36223216, 8842801, 47403556, 18820010, 3703336, -23498840, -41911364, -7113003, -17741436, 14406931, -11656541, 8118562, 29978334, -4428112, -5089536, 7880191, 21951040, 34743600, 36472864, 12302397, -32568200, 10880226, 12138651, -6876243, -35048008, -13889387, -14788646, -29164976, 22798224, 20768852, -16071768, 15403363, -6103686, -35037268, 6367826, 10772315, 22659174, -58883464, -119946624, -61222612, -13183402, 48826260, 116933704, 114446384, 48501992, 49521508, 35940824, 3310883, -56119652, -96050504, --145488800, -42412264, -60047936, -9261560, 61351996, 108294376, 91242288, 80778672, 45124000, 457414, --26587458, -36093832, -6642704, -63561220, -50235548, -47605956, -30758946, -24950538, -10870025, -883690, -23743116, 54107460, 55613920, 54740968, 40393092, 52207476, 28286654, 30449708, -8179229, -746787, --22662932, -61596812, -89894736, -108844672, -52094732, -20172388, 18412524, -1558536, 12882754, 26862336, -34716756, 72668160, 83598320, 110351128, 70810592, 8066486, 32920924, -15590194, -59322088, -52022792, --104138464, -122025392, -90854664, -56443924, -23813984, -19519016, 44277356, 48636208, 137714912, 110370456, -80819472, 74236896, 30403000, -27915676, -35465156, -21523692, 0, 0, 0, 0, -0, 0, 0, }, +-1763621, 2601677, -6839736, -655519, -2604361, 3244848, 589484, -2800856, 4190278, -3695819, +-930934, 3333968, -1308891, 1451162, -5663452, -995359, -713501, -5924908, 752156, 81068, +-200253, 1653562, -2985002, 703301, -1089311, -380105, 6172405, -674310, -4259534, -2035278, +409633, 1458141, -4109747, 1070521, -3109020, -68719, -1196148, -1873680, 3390340, 3307125, +-2367064, 4380867, 4456029, -5549635, -933082, -586263, -5206037, -2241436, -3605088, -4102768, +912144, 989453, -512712, 469225, 1952063, 2110440, -1163399, 671089, 1888712, 5239860, +3013457, 2350421, -2647847, 233002, -1479616, 3271155, -3713536, -2676838, 2877091, -1714229, +3119220, -3618510, -1782411, -1217623, -2197950, -12145094, 4277788, -6987912, 3518115, -4013110, +-8071318, -13798119, 2222646, 246961, 3249143, 2863670, -1135482, -1152125, 843961, 8098698, +-6042482, -10588705, 3272765, -4459250, -7192460, -9664, -1238561, 4197257, 1346472, 2962991, +-3343095, -898185, -2261837, 6912750, -2115808, -2944200, -2703145, -1336272, -1899986, -2910377, +-2695629, -1810866, 1185411, 522375, 712965, 175557, 1621887, 2928094, 1307281, -2695629, +-8137353, -107911, -5720360, 787053, -579821, -2510945, 3344706, 260919, -176631, -7861401, +-3427384, 1122060, -814433, 2852395, 11811, 2581275, -2477123, 1182190, -1169305, 5086315, +-1889786, 2837363, -4506495, -3996467, -5609228, 721018, -1381369, -1007707, 27917, -1096290, +-8615168, -1817845, -1160715, -2482491, -1127429, -2987150, 2816425, -1222455, -1016297, -313533, +49929, -248034, -2071248, 7518877, 4888747, 7856569, -3712462, 7813620, -4671314, -3384434, +3092377, 8651138, -169114, -5419712, -7807177, -5748277, -1047972, 6118181, 2493766, 1982664, +2817499, -2880849, 4301947, 397284, 3234110, -1699196, -7074885, 1786706, -4868346, -3548180, +-3387656, -995359, -8980240, -597000, 521302, -3972845, 8571144, -1797444, -2629057, -3602404, +32212, 730144, -3503620, -86436, -4315906, -1891933, 268435, -2057826, 6246493, -39192, +-1471563, 3180423, 2371359, 5406290, 2467459, 6545530, 1890859, 5310190, -6078453, 1414118, +5340255, -1944010, -4175782, -6402186, 337155, -589484, 9738838, -4378183, -3364570, 1005022, +-2136209, -1576253, 4896263, -3754875, 4714264, 2187212, 127775, 2430415, -3118146, -2955474, +-5488968, -5898601, 7842074, 3738232, 2770254, 4224101, -2719788, -1784559, -1998770, 9921911, +-3809636, 10857140, -353798, -2707440, -2595234, -5680631, -6153615, -7425999, -459562, -1834488, +1350767, 7269769, -620623, -3334505, -10080288, 401579, 7985418, 11796128, -5532992, 3084860, +2135673, -2934000, -2692945, 3118146, 11082626, -2599529, 1697049, -897648, -1690607, -984621, +5257577, 7762617, -5930813, -3105798, 2272575, 10161356, 1545115, 7215545, -6015639, -5359583, +-504659, -836982, 1792075, 1589675, -450435, 680215, 638340, -2603287, 681289, 3255048, +1724429, -2112050, 15670725, -11256572, -2711735, -4844723, 958851, 3963718, 7374459, -7947837, +4962298, -2287607, -8400956, -13400835, -2983392, -5858873, 632971, -1539746, -5847061, -3121904, +2754148, 2947958, 9945534, 5398774, 4905927, 245350, 1309428, -5607617, -3914863, 7941932, +5986648, 3983045, 1658394, 3649112, 514322, -272194, -7218230, -10046465, 6169721, -2913599, +-6902550, -3448322, -4476967, 3150896, -3993783, 7932268, 1534377, -5118528, -2709588, -4013647, +-3563212, 3666828, 5666673, -911607, 3671123, -3411815, -3792993, -404801, 360777, -3655554, +-1728724, 4294431, -452582, -2490007, -2891587, 2040110, 2319282, -986769, 2873333, -204548, +-3184182, 7459285, -1976222, -33286, -559956, -11128797, 2619930, 1434519, 2905546, -10460393, +3233574, 537408, -2796561, -5540508, 2922188, -5277441, -614180, 10267119, 15355045, 7764227, +8638253, -199179, -3704409, 6580427, 5960878, 2742337, 3390340, 7764227, -639413, 5756867, +5635534, 8038032, 7765838, -5585068, 5357435, 17180, 2178085, -5179194, 2161442, -347892, +5464809, -1539209, -946503, -3545496, 4112968, -5717139, -4485557, 883690, 5738613, 3256659, +-2673617, -1257889, -475668, -1714766, 3682935, -6974490, 7282117, 339302, 8943733, -11578695, +1385664, -10397579, -2839510, -3076270, 3507378, -781684, -1859721, 2695092, 1502165, 3220152, +5284421, 7930657, -279710, -5845988, 2017561, 10530186, 2838437, -2766496, 33823, 6482180, +-2505577, 3891777, -2349347, -11174431, 7175280, 5856188, -16491064, 173409, -3750043, 1409823, +-9298604, 1028645, 1382980, 12076911, -9871445, 44560, -13201656, 2902861, -8043400, -1988570, +317291, -4334159, 3603478, 1618129, -7014756, 80531, -292058, 6280316, -4328254, 10146860, +-329639, -8853001, -4719632, 10812580, -1267552, 4321274, 2648921, -1799054, 6234145, -7175280, +-7041062, -5278515, 474594, -6860674, 7021735, -4009889, 4392678, -6632503, -380105, -8057359, +4992363, 738198, 6029061, 5712844, -5726265, 10718628, 8749922, 8642011, 1324997, 9076340, +7027104, -7613367, 6163278, 3195456, 169651, -7057705, 2816962, -5995238, 5513128, -2541547, +-5299990, -519154, 8392903, 3249143, -10928544, 9889162, -1499481, -3428995, -6694244, 10041097, +7636452, -7522635, 5492727, 23822572, 4419522, -490700, -7612830, -14704357, 4318053, -1791001, +-21775484, 19941534, -8990440, -13668733, 3443490, -462246, 3094524, -472446, 4252555, 6063957, +552440, 82141, -10877005, -501974, -587874, 13839458, -1949915, 794032, 5435818, -1902671, +-1135482, -5000416, 11962021, -8128226, 8798777, -1581622, -6309844, 1744831, -7106024, -3428995, +-11874511, 2663954, 6298570, -2887292, -5608154, -4430259, 8141648, -11173894, -2119566, -5252745, +498216, -1163399, 2204392, -9600863, 10572062, -13285944, -8704288, 4292283, 2447595, 35970, +4510253, -6589017, -9445707, 1877438, -1882806, 151934, 6048925, -5508833, 5654862, 3890167, +12538620, -2405182, 2922725, -57982, 1631551, 16701517, 3063922, 16745004, -1469953, -4104378, +-17732846, -2819109, -4076461, -14479408, -24554864, 6832219, 11839614, -9329206, -4833449, 6497212, +-3203509, 14393509, -2290291, -8500814, -5388574, -22848690, 6904697, 2011118, -2689723, -16188269, +3044595, -9218610, -2974802, -8145406, -4606890, 10670309, -11397769, 4143033, -16553878, 9681930, +1294933, -251256, -5312338, 753230, -2827699, -9291088, -17457432, 2812130, -767725, 3156264, +6175626, -4458176, -2178622, -11124502, -6387153, -3257733, 3646427, 2701535, 6979322, 12272332, +8909373, 4736812, 6525666, 1961190, 6795712, 6754373, -8003135, 7801271, 7963943, -2153926, +10988137, -1526324, 13015898, -6579890, -16916266, -2709588, 8231305, 10700374, 10649908, -2486786, +-23612120, -2160369, -3571265, 964757, -3718905, -4843113, -955093, 22950694, -5051419, -5491116, +7635915, 12381854, -914828, 5788542, 14264660, 10384157, -23541252, -21523154, 108985, -2006824, +3084324, -9569187, -17230872, 4154307, 13626321, 9169755, -10073309, 16262894, 12914430, 12367895, +-20745766, 5948530, 10619844, 681826, 1447404, 9325448, 20995410, -3957276, -9929428, 6583111, +4552666, -2733210, 11186779, 17278654, 2895882, 17900886, 7425999, -13132936, 1148904, 14886894, +-1967095, -5848672, 7207492, 1425392, 2456185, 15634755, 9433896, 5459441, 1318018, -17702782, +-18807124, -1303523, 2295123, 4999342, -6279779, -554051, -5421323, 1854889, 1513439, -6570226, +1755031, -3911642, -1983201, -5497558, -361851, 11755325, -7885560, -16064788, -3876745, -13501767, +1552094, -4297115, -2267206, -695248, -39738112, -25316148, -8667781, 5553930, -3790309, -10968810, +263067, -10721849, 25366076, -12263742, 15739445, 25078850, 12871480, 11649025, -11853573, 7986492, +-6648610, -13674102, 9170292, 11091753, 6738804, 16443282, -1444720, -2325188, -9450539, -9470403, +-8485782, -12513924, -12431246, -8830453, 2535641, 91805, -1734630, -8398272, -5465346, -12190191, +2819646, -10726144, -10153840, -5208722, 2801393, -1488743, -7444789, -17119202, 122407, -6091338, +3898757, -19949050, -16124918, 14740865, -4315906, -4622459, -9373229, -6102075, 10249939, 2421288, +-4459250, 5127117, -3801583, 5377836, 3479461, 6334540, -7745974, -10933913, -25631828, 4295, +-24976308, -3205656, -21529598, -4463545, 15978352, -3985730, 940061, -14641007, 26851598, 958851, +-18617072, -15786152, 17067126, 13370233, -11693585, -11450920, 22754736, 14442901, 1399086, -12859669, +2198487, -5253282, 11155104, -7916162, 1903744, -3233037, -1749125, 23148800, -2549063, -6076842, +4974109, 4047470, 7600482, 7200513, 1539746, -8977019, 7636989, 3515431, 8657580, 17761838, +8948027, -25579752, -6474663, -4227859, -18705120, 7474854, -2519535, 259309, -10009958, 9032853, +-3325915, 1533303, -13252658, 9340480, -10609106, 620086, 12339978, -2211908, 12976170, -9820980, +15954193, -19710678, 10573136, -361314, -5937256, 24463596, 7676181, -5966784, -14017163, 5677947, +-2141041, 1116155, -1379221, 8111046, 14539538, 17235704, -10955925, 6883759, -4063039, 14863271, +6354941, 384936, -1731946, 7408282, 0, -9709310, -38216620, -24671902, 20824148, -14958297, +-14086956, 8177081, 18220862, -29573534, -4836133, 7364795, 2025077, -15287936, -23242216, 44109316, +-18814642, 6267968, -21416318, 12174085, -7434589, 20841866, 18234284, 2216740, 3244848, -23935852, +-27380, 11927661, -9869835, -14064944, 11511049, 3733937, 12399034, 10378252, -2115808, 4669703, +-2802466, -1002338, 18260590, -15014669, -9256191, 15317464, -707059, -11130945, 15452219, 201863, +-3555696, -9811316, -4793184, 6497212, -8381092, -146029, 5304822, -9604084, -10891500, -6074695, +7687992, -21722334, 10605885, -35433, 21320754, -19187230, 6488085, -14259828, 5421860, -8016557, +-12081206, 20774756, -11044508, -3278671, -10775536, 10004053, -12292196, 8853538, -4393752, 16214575, +14330158, 411243, -22090628, 18528488, 8612483, -22514756, 6648610, 22591528, -2818572, -747861, +10036802, -7805566, 15643882, 14012868, -20364050, -12866648, -4364224, 9507984, 17974976, 2457258, +9200357, 20246476, 15065672, -23132156, -3141769, 34393560, 7963406, -3299072, -4933844, -7616588, +-11143293, 2118493, 7879118, 8620536, 8192650, -7371775, -15875810, 2967286, -8647380, 7158637, +23562728, -7647190, -25311852, 28091770, -9681393, -17402134, 22869628, -5594195, -7967701, -26782880, +-5488968, 9063455, 4066260, -7037841, -11705396, 8214662, 27917, -13471702, 9031242, -4171487, +22050362, -18985902, 1241246, -5417028, 25288768, 6782290, -39045012, 9349070, -17212618, -9342091, +-15086073, 13266080, 52155936, 16267189, 1022739, 8507256, 13100724, -24617678, -12135967, -11542725, +-18232674, 1578937, -8247411, -28573344, -12178917, 1953136, -11628624, -35951024, 31143344, -5980742, +14012331, 2668249, -16531329, -28345174, -27383638, 30680562, 18612240, 7067906, -10871099, -20463372, +-15428059, -24298778, -6329708, 9136469, -3866008, 2054068, 3802120, -3922379, -12702903, -12044162, +-20792474, -7333120, -4076998, 10282689, 6997039, 11306501, -5662915, -9135932, -4002373, 14768245, +1955284, 13106630, -43409236, -10022843, -199716, 9686762, -13958644, -399969, -16143171, 12750684, +10852845, 2356327, 53270480, 1118839, 16506633, 22294102, 739808, 7430831, 102005, -3490198, +-6680822, 11480448, 16000901, 21720186, -774168, -3533148, 1141924, 14529337, 12363063, 1074279, +9939628, 9618042, 6571300, -1989107, 20607790, -4970888, 26693758, -25281252, -12634183, 21793200, +-2239826, 2401424, 6841346, -26256208, 2659122, 5497022, 18969796, 28177670, -21203180, 6543920, +-12821014, 20524574, 18712098, 3703336, 34556768, 11842835, 14647986, -10531797, -467615, -19587198, +34516504, -17679696, 6628209, 21750252, -3352759, -11477226, 11668352, -1445793, 6618008, 23235774, +2009508, -5357435, -557809, 5593658, 751082, -11360725, 10972031, 282931, -2228551, 38570952, +-27062052, 28315646, 18726058, 34954056, 15041512, -22179212, 19709604, 1834488, 18405546, 45512156, +-30404610, -11747809, -2720862, 2251100, 31316754, -16413754, 2898566, -17770428, 2817499, 35044248, +-2514167, 36250596, 11137387, 7099581, 17145510, -20432234, -2407866, 16229608, 22844932, -34877820, +-416612, -30194694, 14122926, -16363825, -755914, 4440996, -6881612, -22272090, 5163625, -38339564, +-34005404, -265214, -481573, -21741124, 16094316, 4249334, -6741488, -20164872, 25494388, -6814503, +38422240, -6369437, 7385197, 13684840, -20392504, -6959458, 4822712, -23430120, -14146012, -20522428, +15937013, -16505022, -5684389, -5688148, 13550622, -13919989, -24266028, -32246078, -2379949, 26207354, +96637, -14908368, -7763691, -18765786, -7784628, -60130, 9436580, -21034066, -4004520, -4691715, +-16586627, -20605106, -788127, 3349538, 11435887, 4502737, 20904680, 6311992, 26814018, -11958263, +21744346, -5983963, -20575578, -4733591, 36468568, -16534550, 15382962, -12055436, 26014080, -14789183, +7136625, 18174154, -3640522, -7195144, 654446, -10043781, 22671522, -23445690, -12475806, 25720412, +-7735773, -21833466, -34378528, 40499932, -11716671, 34652868, -5603322, 28063316, 3650722, -7166153, +-16910360, -11762305, -964220, 1587527, 21196200, -6336688, 9664, 6801081, -16369194, 30090004, +12419972, 2196876, -22193170, 17452600, 10292889, -17928804, 20330228, 2696166, -1144609, 5753109, +1252520, 25488484, -3717294, -29693794, 35138740, -16103443, -707059, 25692494, -8848170, -4401805, +-12642236, 39948028, -15284178, -3845070, -22122840, -3775813, 5302137, 35782448, -13901199, 7495255, +13598403, 21642878, -2842732, -21174188, 26794154, 15524159, 22387518, -8634495, -1703491, 3366718, +24794310, -11119133, -22082574, -27466852, 18627274, -18985366, 8863202, 22039624, 23752242, -13019120, +-270046, 29313152, -40489732, -335007, 12022687, 16415365, 4967130, -15828565, 7624641, 14169097, +-7047505, -8139500, -49744848, 17650704, 10366440, 45369888, 39897024, -5322002, -13919989, -45749456, +1963337, 15947214, -19176492, 15573551, 27698244, 26780732, -11570105, 32133334, 28985124, 1779190, +-16449725, -17918066, 29598768, 25142738, -34495568, -47568372, 64411088, 3678103, -3826279, 8722542, +5415417, 23982560, 24205362, -9134859, -7337415, 33503430, 16505022, -5669894, -21360482, 13638669, +3380676, 2013266, 12556874, 1852742, -307090, -13094818, 8172249, -3845070, -15507516, 29904784, +-46731928, 33140504, 28199682, -44969920, -2400887, 22839562, 6506339, 25997438, -5415954, 3439732, +24651502, -3495030, 12913356, -22629646, -34454228, 98229664, -39808980, -57671748, -11855720, 108995536, +48041892, -48391396, -10208064, 17453136, 13739600, -3260954, 5078799, -21767968, -14567455, 22674206, +40689984, 940598, 68997040, -33596844, -14368276, 39323108, -207769, -4291209, -23516556, -44348220, +32974612, -23985244, -26381300, 16472273, -29049548, 11476689, -27682674, -29810832, -7093139, 4454418, +1599875, -8255464, 31341986, 6862284, 18164490, 8339753, -1843078, -958315, -17670032, -33818036, +7921531, 30942556, -28834262, 21265994, -29351270, -4024384, -3935264, -42753716, 27157616, -15483894, +9076340, -155693, -14696304, -160524, -32532766, 30150670, -24210730, 9694278, -37431712, -21786222, +-48317308, 17022566, -23803246, -24321862, -21791590, -9997610, -2152852, 49192408, 15426449, 24754580, +-8609799, -21960704, -30651034, 8977019, 360777, -47995184, -24179592, -85119808, -41544680, -30404610, +-4114579, -35276176, -28342490, -12128451, -50575388, 11518029, 17185238, -43621300, 23469312, 4661650, +-13267691, 2541010, -13025562, -1192390, 8513699, 12773770, 21306260, -25968446, 1554778, 30412664, +-4424890, -14030584, 25957708, -11490111, 653909, -15544024, -7852274, -31461710, 6932614, 1465658, +16594143, -11867532, -274341, 23406498, -12381317, 1343788, 21416854, -44537736, 1032940, -51033876, +-18667002, -33681672, 25763362, 11308112, -4350265, 13276818, -12686797, 14477798, 32920924, 11384885, +52384644, -28727426, -38147900, 34628712, 5750961, -21494164, -25661356, -6600828, 16845936, -16812112, +-4509179, -13924284, -25878788, 16092706, 11700028, -28991030, -23645406, 31950262, -5626407, 14265734, +-11708618, 20253456, 549219, 33840584, -23523536, -5762773, -941672, 14271103, -17768816, -19808390, +-33610268, -68267432, -33965676, -12776454, 30289720, 39353712, -74512848, 13173738, -29392072, -40307196, +-7985955, 47108812, 30302604, 25795574, -15786689, -17814450, -21217138, 23867134, 17050484, 36695128, +5146445, -47156056, -18161806, 35827008, -5063767, 10655277, 32313724, -15047418, -21659520, -34455840, +-34266324, 408559, 23065048, 49016852, 36618356, 24154896, 10288057, -49778136, -52737904, 18782428, +-36223216, 8842801, 47403556, 18820010, 3703336, -23498840, -41911364, -7113003, -17741436, 14406931, +11656541, 8118562, 29978334, -4428112, -5089536, 7880191, 21951040, 34743600, 36472864, 12302397, +32568200, 10880226, 12138651, -6876243, -35048008, -13889387, -14788646, -29164976, 22798224, 20768852, +16071768, 15403363, -6103686, -35037268, 6367826, 10772315, 22659174, -58883464, -119946624, -61222612, +13183402, 48826260, 116933704, 114446384, 48501992, 49521508, 35940824, 3310883, -56119652, -96050504, +-145488800, -42412264, -60047936, -9261560, 61351996, 108294376, 91242288, 80778672, 45124000, 457414, +-26587458, -36093832, -6642704, -63561220, -50235548, -47605956, -30758946, -24950538, -10870025, -883690, +23743116, 54107460, 55613920, 54740968, 40393092, 52207476, 28286654, 30449708, -8179229, -746787, +-22662932, -61596812, -89894736, -108844672, -52094732, -20172388, 18412524, -1558536, 12882754, 26862336, +34716756, 72668160, 83598320, 110351128, 70810592, 8066486, 32920924, -15590194, -59322088, -52022792, +-104138464, -122025392, -90854664, -56443924, -23813984, -19519016, 44277356, 48636208, 137714912, 110370456, +80819472, 74236896, 30403000, -27915676, -35465156, -21523692, 0, 0, 0, 0, +0, 0, 0, }, }, { { 9789841, --1864016, 2947421, -306553, 3818763, 4725538, 3293166, 5990406, -3674882, 6475200, -2181307, -875636, -6014028, 281320, -6265821, 1365263, 1100049, 522375, 174483, 2330020, -3340948, --3968013, 3262028, -300111, 2494839, 1482838, -551366, -2729989, 521839, 4961761, 3034931, -1607928, 1927367, 1483911, 545998, 1794760, -394063, 240518, -393526, 5630166, -1161252, -2926483, -2091112, 2488934, 6615860, -1755031, 6193343, 947577, -2611877, 1844689, 2766496, --891743, -1075352, 175020, 4693326, -1481764, 1498407, -869731, 2983929, 1248762, 4070019, --1354525, -280784, 1573569, -1611687, -3324305, 630823, -1086627, -423054, -1306744, 2673617, -426276, 1686848, -788127, 3610457, 1846299, -4569845, -7105487, -5182952, 1995012, -814970, --12140262, -6931541, -526134, 1693291, -3725884, 1229971, -4490925, 826781, -3235721, 8457864, --6913287, -3111704, -3018288, 5356898, 3788161, 8596377, 2335389, 1721745, -3911642, 4005057, -583042, 1017370, -415001, 3186329, 4577899, 233002, 4570919, 4151086, -1979443, 2268280, --2431488, -2942053, 426812, -2431488, 1563368, -3749507, -6425271, 1632625, 2480344, -1768453, -1975148, -3277060, 3113851, 3868155, -6749004, 1193464, -194884, 2441152, 2428267, 194347, --6616934, -2224256, -2770254, 2085744, 170725, 500364, -1921998, 1073742, -3210488, -28991, -4124779, 2224256, 610422, -2153926, 1649804, -5806259, -2698850, -4330401, 1250372, 468151, -274341, -13818520, -255014, 932545, 387621, 2494302, -4759361, 3826816, 2222646, -2398739, --8167417, 5690295, 5812165, -1125281, 4865661, 3586298, -4450660, 9401147, 2091112, -3955128, -5116917, 565862, 4791573, 891206, -7838316, 3259880, -1347546, -2746632, -2940442, -2210835, -5414343, 4290673, 498216, 4482335, 1708323, -3788161, -4809290, -217433, -994822, 2383170, -1625108, -3669513, 1104344, 2289218, 2097018, -3186329, -2714419, -4299263, -1427003, -870268, -1090385, -842887, 6300180, 2902861, -767189, -2812130, 1332514, 2848100, 1509681, 6900939, --904628, 3641596, -190589, -1832877, -3795677, 3173981, -687732, -1488743, 4096862, -801548, -1532230, -443992, -541703, -3992172, 1241782, -758599, 5433671, 6923488, -1174137, -2627983, --4140885, -9513353, -5695664, -2055679, 6832219, 898722, 1264331, 4209605, 1113470, 1830193, --10000831, -9133785, -5863704, -1500017, -64961, 4263292, -3027952, 3349001, -1748589, -6111739, -1883880, -849330, -4262218, -9127, 5866389, 8665633, 3847754, -3865471, 2253784, 355945, -6140193, 60666, -4996658, -70867, -2945811, 6203544, 2596845, 2976949, 6097243, -937377, -375273, 8422431, 7157026, -117575, -117575, 738198, -546535, 2388539, 513785, -5830955, --8108899, -2604361, -1120450, 270583, -2763812, -8657043, -1063541, 2772402, -4984310, -2040646, --3295851, -2334852, 810138, 1562294, 2800856, -5746666, -5134634, 5349919, -2197413, -434329, -809064, 434329, 2928094, -4901632, 12635794, -5000416, -3981972, -731755, 112206, -4879083, --62277, -3449933, 6026376, -1617055, -7683697, -10677289, -2813741, -7115687, 9643812, 667331, -6815040, 5699959, -9341554, -649077, 3779034, 2673617, 4812511, 779537, -694711, -976568, -2204392, -3204583, 3428995, 1804423, -3396782, 1890859, 48855, 2229088, 5197448, -3017752, -2002529, -498753, 2924336, 2440615, -1189706, 3421478, -1123671, 2949032, -2495376, 2668785, --7595650, -3367254, -2845953, 1915019, 6358699, -4951561, -3259880, -1957431, 273804, -2381023, --2992519, -1733019, 2493229, 1905355, 3612068, -1465121, 1996623, -2430952, -2466385, -442919, --1544041, 2371359, -187368, -4114042, 2041720, -2450279, -4008278, -1512365, -2538326, 1838783, --2742337, 1909113, 3089692, -1550483, 4817343, -8179765, 3308199, -4989679, -5470715, 7422777, -2619393, -9302362, 708670, -194884, 2496450, -6768332, -4400731, -824634, -5507222, -9880572, --9545565, -6409165, -9526237, 3732327, -1195612, 1145683, 4811437, -8435316, 5157719, -2580739, -2296734, 1382980, -1052804, 562641, -1401770, -1460826, -5543192, -3481071, 6736120, -2863133, --6002754, -5627481, -735513, -2702608, 1950989, -5408438, -8093329, 876173, 7108171, -1454920, -4225174, -2885681, 2207613, -4300873, 2775086, 840203, -5593121, 7515656, 1204202, -2088428, -1647120, 6831683, 6518687, 3051574, -908922, -8638253, -1549410, -7334194, 1787243, -2115272, -993748, 455803, 1797981, -7000260, -52613, -1541356, 3178813, 4478041, -9588514, -9213779, --6179921, -10092636, -11841225, -11330124, 3996467, 4395362, -7472706, -2415919, -6814503, -10807211, -4922033, -3272228, -9409736, 2449205, -1146219, -149250, 361851, 2406256, 452582, -927713, -1752347, 2455111, -5625334, -5514738, -1843615, -6592238, -943819, -6988986, -11534672, -1501091, -6158446, -8607651, -6624987, 3690988, -4714801, -136365, 1194538, -4750234, -3813931, -4127464, --12366821, -5790153, 2057826, -4044786, -4424890, -8134668, 2852932, 6025839, -2902324, 9646497, --6189048, -3342558, -534187, -3139084, -9194988, -1264868, 1501628, -936303, -2332167, -8244727, --1760937, 6844031, 3249143, 1576790, 3335042, 2154463, -2551748, 13700946, -5138392, -6152004, --6036577, -6934225, 1567663, 7526930, 16297790, 11161009, -212601, 10201621, -539555, 1688459, -2217277, -5227512, 9404905, 300648, 8348880, 7867307, -5858873, 10147397, 516470, -7446400, --12170864, 11599633, 5941551, 11509975, -9138617, 6650220, 3958349, -10409390, -9950902, -6065568, --2507724, 11031623, -9993852, 9296457, -431644, -1010928, 7143068, 6292127, 9056475, 3137474, --4179540, 4151623, 8568997, -4933844, 8581345, 12167105, 5750425, 7333120, 3644817, 1981054, -2659659, 174483, -6078990, 2299955, 1279900, 302795, 6236293, -4180614, 3986804, 3515968, --975494, 10423886, -5598490, -4096862, -1726577, 8913668, -972810, 7278896, 4582730, 4780299, -5376762, 497142, -12262132, -2441689, -9635759, -6100464, 14470282, 6711424, -5043902, -507343, --14057965, 8912057, 8549669, 25281788, 1002875, 2214056, -1260036, -3434363, -1647120, 8576513, -7783555, 6819871, 9812927, 4021700, 15495705, 4579509, -6158446, 1526324, 13496398, 5382668, -1349157, 2146947, -6976638, -9949829, 6380174, -4916664, -9826885, -20691004, -366146, 8303246, --673236, 4918812, -7225746, -3749507, -2728915, 1603097, -2321430, -6164889, -3083787, -16650514, --4409858, -14125611, 1146756, -7423314, 5647882, -8086887, 3047816, -7775502, -2763275, -454730, -191663, 1240172, 1544578, -10329933, 4972499, -1544578, 2268280, -5406827, 127238, 8257075, -3323768, 11397769, 6409702, -3539053, -647466, -2437394, -1112933, -2801929, -3553012, -350040, -4812511, 2797634, 3648575, 1912334, -16167331, 10358387, 27681064, 10270341, -4088272, 13901735, --8370892, 9832791, 6700149, -12359305, 3197603, -15665893, 795643, -5023501, -10881837, 6526740, -676457, 5102421, 7129646, 8711804, 13728863, 5988258, -463320, -2965675, -8542690, -15796353, -6252399, 6827388, 2254858, -5213554, 9276592, 1608465, 9776956, 5983963, -16454020, -5971615, -2788508, -12009265, 1152662, -426812, -1854889, 4143033, 3275986, -2467459, 13027710, -6747394, -1029182, 7487202, -5620502, 5295695, -2141041, -7095823, 5641440, 428960, -411780, 7697119, -5345087, 769873, -3147674, 15416248, 1272921, 8904004, 1467805, -4114042, -4526359, -11953431, --4163971, 5775658, 360240, 5027796, -691490, -9141838, 4653060, 3834869, -13462038, 4785131, -8238821, -3202435, -27837830, -8932458, 29995514, 8675834, 5144834, -3969087, -381715, -4052839, -6431177, -9055402, 13313325, 7907035, 6438156, 6750615, -4210142, 87510, -177704, 4702989, -9040906, -12530030, -7438884, -3611531, 10262287, 4174171, 5850819, 6565395, -1075889, -8776766, -3351148, 1353989, 18316962, 14845018, 3979287, 11440719, 816581, -4539244, 2447058, -813359, --2285996, 7652021, 8725226, 7753490, 17624936, 9172976, 6986301, 8427800, -7815767, -12206297, --6003828, 6718403, -11011222, -4648765, 10790568, 12331925, 6292664, -4296578, 10118406, -3064459, -1034550, 3412352, 5717139, -1946694, -6496675, 4740034, -5930276, -16704202, 494458, 7112466, --10124849, 2765422, -2224793, -788663, -2391760, -3629784, 13734232, 1529545, 6779606, 14075682, -22425098, -34235184, -5238787, 1489280, -707059, -4581120, -8845485, 8682813, -11215770, -17728014, --2149094, 16171089, -2786897, -10396505, 2740726, -14321032, -7798050, -86973, 8462159, -15013595, -1278827, 15012521, 15787763, -263604, 5418101, 13353590, -8293582, -13269838, -17785460, 966905, --17707614, -4490389, 7174206, 6153615, -15646029, -15399068, -9019968, 5475547, -4226248, -3565897, --4148939, 13093745, -20786568, -6951942, 3207804, -12095165, -3838090, -905701, -13022341, -369367, -5484137, -1725503, 17302812, -2215130, -6736120, 355409, -593779, -6786049, 3638911, 7222525, --7372848, 10741713, -5403606, -23796266, 1724966, -10260677, -3959423, -2310693, -1334661, -31500900, --3579318, 11191074, 13600551, 4996658, 20577726, 12120398, -1787780, -32168232, 9126269, -5924371, -11128260, -10261214, 32749, 16921634, -5491116, 24007256, 5677410, 4637491, -10132365, 4536559, -12070469, -7337952, -1292248, 15472620, 10197863, 11620571, 1866163, -17993766, 11623792, -11661373, --847719, -7084549, 2017561, -9037148, 5434744, -2472291, 5310727, 4639102, 8840653, 8500814, -9921374, -11662984, 3010772, 18025440, 4184372, -3557844, -3376918, -9483288, -7108708, -377957, -969589, 2915209, 15670725, 914828, 8777303, 7770133, -285615, -4412542, -3451543, 13411572, --16014322, -4139275, -14149770, -12532178, -3081102, -613643, -23958938, 5506148, -7394860, 13957570, --2891050, -303869, 10418517, 1054415, 24920474, 19362250, 29589640, 9918153, 1138166, -4804995, --3313567, -6249715, -8935143, 13275744, -3216394, -2234457, 30227980, -5570573, -6044630, 33627448, -11811, 19396610, 14350559, 1709397, 8250632, -3821984, 6560563, 6369974, 4086662, 5305359, -15711527, -9865540, 18836116, -9454297, 108985, 4474282, -2073932, -12626667, -11516955, 388695, --18956376, -5419175, -20751134, -668404, -12173011, -8582955, -6494528, -5195837, 3534758, -16133508, -20118164, 4006668, -12447889, -8629126, -237297, -1499481, -2769180, 6133750, 3082713, 20486458, -2601677, 906238, -9541270, 2821257, 4405026, 523986, -10188199, -3256659, 12585865, 14697378, --367220, -9770514, 5058935, -589484, 17801028, 21073258, -7020124, -3042448, -2988760, 4364224, --6749541, 10266582, -23224498, 619549, 29392072, -22103512, -11228118, -1165547, -3198677, 2415919, --16920024, -9085466, -2333241, 13786308, 16502875, 11463805, -9907953, -25944824, 45978700, 11891154, --28284508, -28309204, -3962644, 7378754, 19766514, -24566676, -4084514, 5097590, -40802, -3159485, -26458610, 6048925, -15044197, 8638253, 1376000, -287763, 14053133, -2061584, 7802345, -16587164, --5503464, 30401390, 11322071, 24074366, 7701950, 21813066, 3972308, -7373922, 15239618, 14151917, -21660594, 11034308, -24011552, -8705362, 5430450, 12999255, -9548249, 4177930, -9206799, -15169288, -1735167, -1315871, -9231495, 7784628, 10269267, 9315247, 6542846, 6553047, -4525822, 16731045, --52076, -15565498, -11630235, 15131707, 7952132, -24707874, 11038603, 5112085, 8170102, -21409338, --15050639, 15016279, 22067006, 13430363, -4471061, 11529840, 21931176, 8823473, 23131084, 4371740, -10983842, 8269960, 38117836, 51502564, 4686346, 10755135, -31692026, -9749576, 20336670, -15981573, -39298412, -7152731, 6837588, 10888816, 23353348, 13012140, -4589710, -15884937, -18369038, -5870147, --2335925, -23601920, -10562935, -9143449, 16273094, -8540542, 5455146, -15031312, 2929705, -5693516, --21607980, 23730768, 17121350, 19151796, 9208947, -11172284, -10184441, -25901338, 1428614, -23343148, --6212670, -1779190, 4081830, 12281996, 10506027, -7492571, -4446365, 10143639, 23106388, 6035503, -9451612, 16192027, -19569482, 14576045, -10695005, -10849624, -19796042, -9218074, 10429254, 7825968, -2203318, 23970212, -4523675, -9447317, 4367445, 5718749, 33757908, -11894375, 13349832, 11720966, -31660352, -7801808, 4412005, -14493904, -4347044, -19238232, 14842870, -27574764, 979253, -22238804, -4073240, 9236327, 3126736, -13379360, 44891000, -3360275, -6396817, 3925600, -26050588, 1304060, --17718888, 430570, 4536559, -5372467, -951335, 10488310, -9815611, 255014, 13297219, 970663, -3067144, -22277458, 2412698, -2010582, -1798518, -5742908, -27890980, -15416248, 6342056, 2114735, -11734924, -31947040, 2998424, -29739964, 14531485, -20321638, -32807644, 16239271, 29276108, 5015448, -14124537, -22432078, 21553220, -5595269, 2741263, -13799193, 17831630, 7305740, 18523658, 5900748, -22587234, -21092048, 3400540, 1095754, -4221953, -16681653, -14207752, -15614890, 17149804, -4572530, -23552526, -14610942, -12058658, 3615826, 2799782, -11038603, 6558952, -53259740, 6030671, -17324824, -48413944, -9654013, -25128780, 9352828, -1867237, -25047176, -4661650, 3629247, -15258408, 36426692, -4782983, 3070902, 16284905, -21218212, -32391570, -20156282, 44565116, -4071092, -10040560, 29272886, -16312286, -14677514, -14583561, -8440148, 35223564, 4510790, -9196062, -14462229, -7231115, -28392956, -18322330, -3759170, 7129646, 17425220, -6844031, -29404956, -4041027, 36719824, -2105608, -9826885, -17440788, -8702141, 21762600, 14071387, -2408940, -28087476, -14545980, -4348118, -26001732, -15534897, --15203647, 1398549, -4023848, 20896090, -15491410, -5816997, -618475, 54651312, 18695992, -10186589, -10666551, 5828808, -3777424, 27360016, 13135084, -11391864, 3901978, 21880174, 25203942, -16586090, --11462731, -38712152, -29777546, -979253, -4214437, -4119411, -58133992, 22054120, -11239929, 33332168, -33819108, -17126182, 16775605, -30355756, -46455440, 2787971, -32216550, 6069326, -2691334, 27758910, --17847736, 20297478, 17528298, 27876486, -38317552, 6062883, -22840100, -20624970, 3993246, -27103928, --17034378, 27998354, -6045704, 11776800, 32220844, -4207458, 11719892, -23313082, 4569309, -25858388, -27469000, -21058224, -13573707, -14975477, 30511448, 25128780, -14698452, 33652680, 22713934, -4450660, -33166274, 543313, -31118648, -6775848, -1870458, -23321672, 7912404, -51982528, 7669201, -11207717, --23874650, -18341658, 26803818, -11615202, 53118008, 40682468, -53755272, 3352759, 1502165, 6294275, -29391534, -40465572, -27284854, 34830036, -21218750, -26896696, -31493384, 8230231, 81992536, -6060199, --17694728, -16972638, 7233799, 28412282, -30907122, 15931644, -52130164, -7668664, -20045150, -17603998, -28193240, -35678832, -55521044, 32863480, 49682572, 12096775, -9059160, -44558676, 3542811, 17645336, -18038862, -7369627, -17360258, 2356863, -3828427, -5754720, 6328635, -6504191, -14344117, -29212756, -4420058, -17564268, 5118528, -15755014, -32596654, 20777978, 16119549, 25525528, 1803349, 27588722, -16428787, 4132832, -7912941, -14139569, -21880710, -16458852, -8050916, 6453725, 17150878, -10728828, --3787624, -38180112, 37249716, 42179800, 25218974, -21753472, 24427626, -29679298, 1557463, 6523519, --62179852, 4954782, 8941048, 30073898, -35570384, 49158048, 22827214, -36159868, -16223702, 14163728, --1440962, -27154930, -25900800, -36109400, -38504920, -5172751, -49177912, -6669011, 17754322, -23162222, --21577916, 20136418, 20426328, 4051228, -19499152, -66521528, -9871445, 12862353, 7810398, 28667832, --734976, 16610786, -4431333, -552440, -8454643, 1108102, 17488034, 1892470, 632971, 16937204, --4639639, -4264903, -22523346, -2219424, -3679713, -2666638, 3799972, 13468481, 18561238, -3816079, --38118, 14439143, -3338263, -28310814, -1954747, -25158844, 3631395, 3218541, -32743756, 23557896, --45100376, 9899900, 12468827, -20008642, -1320166, 58289684, -16466368, 19506130, -12221329, 10184978, --43658344, 4428112, 25878788, -1020055, 22419192, -5530308, 2660732, -1863479, 28745142, -18721762, --21294984, 24480776, -22442814, -29431800, 638876, -46790984, 31940062, 23889682, -6993818, 7487202, -8075076, -4494684, -25497610, -74591232, -35720708, -12721693, 22726820, 52801792, -50736984, 9583146, --15559593, -51158428, -8215736, 43624520, 10848551, 35720168, -32413044, 8044474, -12016245, 951872, -20599736, 2462090, 10644003, -8288750, -64826088, 17639968, 1925756, -28229210, 26532698, 19948512, --20420422, 18351322, 1163399, -21932250, 5169530, -14011794, 38614440, 3679713, 14941654, -428423, --41996728, -33891588, -12184822, -25417080, 25406342, 36992552, 38085624, 30415884, -12087112, 3246459, --33237678, -5989332, -4378719, -14641544, -18056580, 1608465, 1954210, -45197552, -14058502, -18317498, --2353105, 18705120, -22837952, -6012418, 6490233, -903554, 21563420, -26024818, -2161979, -29253560, --16116865, -21652004, 10449655, 7279433, 21481278, -2794413, -3708704, -25053082, -10319733, 20130512, --29841970, -120640800, -63213864, 14271639, 52133388, 115727896, 88446264, 50498076, 17467632, 26938572, --7336341, -46941844, -92414808, -122707752, -30617212, -34617436, 2576981, 61747136, 86816320, 59153512, -77815144, 19196894, 16952236, -7561827, -38495792, -42719892, -35253092, -36458904, -46524160, -36095444, --15691126, -797253, -209380, 31784368, 39398808, 76432168, 35572528, 13379897, 30887258, 49488760, -15350213, 10948409, -38395932, -50771884, -86069000, -37834368, -45210436, -30672508, -19592030, -13209709, -6142340, 12723841, 35863512, 76292576, 59180356, 67311264, 47605956, 61343944, 43209520, -33127082, --33443836, -79582520, -64638720, -43979928, -105840344, -78230680, -51138564, 6545530, 61172144, 62970128, -68470368, 91634200, 72222024, 42875584, 42804716, -396748, -32700270, -33023466, -18997714, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-1864016, 2947421, -306553, 3818763, 4725538, 3293166, 5990406, -3674882, 6475200, -2181307, +875636, -6014028, 281320, -6265821, 1365263, 1100049, 522375, 174483, 2330020, -3340948, +-3968013, 3262028, -300111, 2494839, 1482838, -551366, -2729989, 521839, 4961761, 3034931, +1607928, 1927367, 1483911, 545998, 1794760, -394063, 240518, -393526, 5630166, -1161252, +2926483, -2091112, 2488934, 6615860, -1755031, 6193343, 947577, -2611877, 1844689, 2766496, +-891743, -1075352, 175020, 4693326, -1481764, 1498407, -869731, 2983929, 1248762, 4070019, +-1354525, -280784, 1573569, -1611687, -3324305, 630823, -1086627, -423054, -1306744, 2673617, +426276, 1686848, -788127, 3610457, 1846299, -4569845, -7105487, -5182952, 1995012, -814970, +-12140262, -6931541, -526134, 1693291, -3725884, 1229971, -4490925, 826781, -3235721, 8457864, +-6913287, -3111704, -3018288, 5356898, 3788161, 8596377, 2335389, 1721745, -3911642, 4005057, +583042, 1017370, -415001, 3186329, 4577899, 233002, 4570919, 4151086, -1979443, 2268280, +-2431488, -2942053, 426812, -2431488, 1563368, -3749507, -6425271, 1632625, 2480344, -1768453, +1975148, -3277060, 3113851, 3868155, -6749004, 1193464, -194884, 2441152, 2428267, 194347, +-6616934, -2224256, -2770254, 2085744, 170725, 500364, -1921998, 1073742, -3210488, -28991, +4124779, 2224256, 610422, -2153926, 1649804, -5806259, -2698850, -4330401, 1250372, 468151, +274341, -13818520, -255014, 932545, 387621, 2494302, -4759361, 3826816, 2222646, -2398739, +-8167417, 5690295, 5812165, -1125281, 4865661, 3586298, -4450660, 9401147, 2091112, -3955128, +5116917, 565862, 4791573, 891206, -7838316, 3259880, -1347546, -2746632, -2940442, -2210835, +5414343, 4290673, 498216, 4482335, 1708323, -3788161, -4809290, -217433, -994822, 2383170, +1625108, -3669513, 1104344, 2289218, 2097018, -3186329, -2714419, -4299263, -1427003, -870268, +1090385, -842887, 6300180, 2902861, -767189, -2812130, 1332514, 2848100, 1509681, 6900939, +-904628, 3641596, -190589, -1832877, -3795677, 3173981, -687732, -1488743, 4096862, -801548, +1532230, -443992, -541703, -3992172, 1241782, -758599, 5433671, 6923488, -1174137, -2627983, +-4140885, -9513353, -5695664, -2055679, 6832219, 898722, 1264331, 4209605, 1113470, 1830193, +-10000831, -9133785, -5863704, -1500017, -64961, 4263292, -3027952, 3349001, -1748589, -6111739, +1883880, -849330, -4262218, -9127, 5866389, 8665633, 3847754, -3865471, 2253784, 355945, +6140193, 60666, -4996658, -70867, -2945811, 6203544, 2596845, 2976949, 6097243, -937377, +375273, 8422431, 7157026, -117575, -117575, 738198, -546535, 2388539, 513785, -5830955, +-8108899, -2604361, -1120450, 270583, -2763812, -8657043, -1063541, 2772402, -4984310, -2040646, +-3295851, -2334852, 810138, 1562294, 2800856, -5746666, -5134634, 5349919, -2197413, -434329, +809064, 434329, 2928094, -4901632, 12635794, -5000416, -3981972, -731755, 112206, -4879083, +-62277, -3449933, 6026376, -1617055, -7683697, -10677289, -2813741, -7115687, 9643812, 667331, +6815040, 5699959, -9341554, -649077, 3779034, 2673617, 4812511, 779537, -694711, -976568, +2204392, -3204583, 3428995, 1804423, -3396782, 1890859, 48855, 2229088, 5197448, -3017752, +2002529, -498753, 2924336, 2440615, -1189706, 3421478, -1123671, 2949032, -2495376, 2668785, +-7595650, -3367254, -2845953, 1915019, 6358699, -4951561, -3259880, -1957431, 273804, -2381023, +-2992519, -1733019, 2493229, 1905355, 3612068, -1465121, 1996623, -2430952, -2466385, -442919, +-1544041, 2371359, -187368, -4114042, 2041720, -2450279, -4008278, -1512365, -2538326, 1838783, +-2742337, 1909113, 3089692, -1550483, 4817343, -8179765, 3308199, -4989679, -5470715, 7422777, +2619393, -9302362, 708670, -194884, 2496450, -6768332, -4400731, -824634, -5507222, -9880572, +-9545565, -6409165, -9526237, 3732327, -1195612, 1145683, 4811437, -8435316, 5157719, -2580739, +2296734, 1382980, -1052804, 562641, -1401770, -1460826, -5543192, -3481071, 6736120, -2863133, +-6002754, -5627481, -735513, -2702608, 1950989, -5408438, -8093329, 876173, 7108171, -1454920, +4225174, -2885681, 2207613, -4300873, 2775086, 840203, -5593121, 7515656, 1204202, -2088428, +1647120, 6831683, 6518687, 3051574, -908922, -8638253, -1549410, -7334194, 1787243, -2115272, +993748, 455803, 1797981, -7000260, -52613, -1541356, 3178813, 4478041, -9588514, -9213779, +-6179921, -10092636, -11841225, -11330124, 3996467, 4395362, -7472706, -2415919, -6814503, -10807211, +4922033, -3272228, -9409736, 2449205, -1146219, -149250, 361851, 2406256, 452582, -927713, +1752347, 2455111, -5625334, -5514738, -1843615, -6592238, -943819, -6988986, -11534672, -1501091, +6158446, -8607651, -6624987, 3690988, -4714801, -136365, 1194538, -4750234, -3813931, -4127464, +-12366821, -5790153, 2057826, -4044786, -4424890, -8134668, 2852932, 6025839, -2902324, 9646497, +-6189048, -3342558, -534187, -3139084, -9194988, -1264868, 1501628, -936303, -2332167, -8244727, +-1760937, 6844031, 3249143, 1576790, 3335042, 2154463, -2551748, 13700946, -5138392, -6152004, +-6036577, -6934225, 1567663, 7526930, 16297790, 11161009, -212601, 10201621, -539555, 1688459, +2217277, -5227512, 9404905, 300648, 8348880, 7867307, -5858873, 10147397, 516470, -7446400, +-12170864, 11599633, 5941551, 11509975, -9138617, 6650220, 3958349, -10409390, -9950902, -6065568, +-2507724, 11031623, -9993852, 9296457, -431644, -1010928, 7143068, 6292127, 9056475, 3137474, +-4179540, 4151623, 8568997, -4933844, 8581345, 12167105, 5750425, 7333120, 3644817, 1981054, +2659659, 174483, -6078990, 2299955, 1279900, 302795, 6236293, -4180614, 3986804, 3515968, +-975494, 10423886, -5598490, -4096862, -1726577, 8913668, -972810, 7278896, 4582730, 4780299, +5376762, 497142, -12262132, -2441689, -9635759, -6100464, 14470282, 6711424, -5043902, -507343, +-14057965, 8912057, 8549669, 25281788, 1002875, 2214056, -1260036, -3434363, -1647120, 8576513, +7783555, 6819871, 9812927, 4021700, 15495705, 4579509, -6158446, 1526324, 13496398, 5382668, +1349157, 2146947, -6976638, -9949829, 6380174, -4916664, -9826885, -20691004, -366146, 8303246, +-673236, 4918812, -7225746, -3749507, -2728915, 1603097, -2321430, -6164889, -3083787, -16650514, +-4409858, -14125611, 1146756, -7423314, 5647882, -8086887, 3047816, -7775502, -2763275, -454730, +191663, 1240172, 1544578, -10329933, 4972499, -1544578, 2268280, -5406827, 127238, 8257075, +3323768, 11397769, 6409702, -3539053, -647466, -2437394, -1112933, -2801929, -3553012, -350040, +4812511, 2797634, 3648575, 1912334, -16167331, 10358387, 27681064, 10270341, -4088272, 13901735, +-8370892, 9832791, 6700149, -12359305, 3197603, -15665893, 795643, -5023501, -10881837, 6526740, +676457, 5102421, 7129646, 8711804, 13728863, 5988258, -463320, -2965675, -8542690, -15796353, +6252399, 6827388, 2254858, -5213554, 9276592, 1608465, 9776956, 5983963, -16454020, -5971615, +2788508, -12009265, 1152662, -426812, -1854889, 4143033, 3275986, -2467459, 13027710, -6747394, +1029182, 7487202, -5620502, 5295695, -2141041, -7095823, 5641440, 428960, -411780, 7697119, +5345087, 769873, -3147674, 15416248, 1272921, 8904004, 1467805, -4114042, -4526359, -11953431, +-4163971, 5775658, 360240, 5027796, -691490, -9141838, 4653060, 3834869, -13462038, 4785131, +8238821, -3202435, -27837830, -8932458, 29995514, 8675834, 5144834, -3969087, -381715, -4052839, +6431177, -9055402, 13313325, 7907035, 6438156, 6750615, -4210142, 87510, -177704, 4702989, +9040906, -12530030, -7438884, -3611531, 10262287, 4174171, 5850819, 6565395, -1075889, -8776766, +3351148, 1353989, 18316962, 14845018, 3979287, 11440719, 816581, -4539244, 2447058, -813359, +-2285996, 7652021, 8725226, 7753490, 17624936, 9172976, 6986301, 8427800, -7815767, -12206297, +-6003828, 6718403, -11011222, -4648765, 10790568, 12331925, 6292664, -4296578, 10118406, -3064459, +1034550, 3412352, 5717139, -1946694, -6496675, 4740034, -5930276, -16704202, 494458, 7112466, +-10124849, 2765422, -2224793, -788663, -2391760, -3629784, 13734232, 1529545, 6779606, 14075682, +22425098, -34235184, -5238787, 1489280, -707059, -4581120, -8845485, 8682813, -11215770, -17728014, +-2149094, 16171089, -2786897, -10396505, 2740726, -14321032, -7798050, -86973, 8462159, -15013595, +1278827, 15012521, 15787763, -263604, 5418101, 13353590, -8293582, -13269838, -17785460, 966905, +-17707614, -4490389, 7174206, 6153615, -15646029, -15399068, -9019968, 5475547, -4226248, -3565897, +-4148939, 13093745, -20786568, -6951942, 3207804, -12095165, -3838090, -905701, -13022341, -369367, +5484137, -1725503, 17302812, -2215130, -6736120, 355409, -593779, -6786049, 3638911, 7222525, +-7372848, 10741713, -5403606, -23796266, 1724966, -10260677, -3959423, -2310693, -1334661, -31500900, +-3579318, 11191074, 13600551, 4996658, 20577726, 12120398, -1787780, -32168232, 9126269, -5924371, +11128260, -10261214, 32749, 16921634, -5491116, 24007256, 5677410, 4637491, -10132365, 4536559, +12070469, -7337952, -1292248, 15472620, 10197863, 11620571, 1866163, -17993766, 11623792, -11661373, +-847719, -7084549, 2017561, -9037148, 5434744, -2472291, 5310727, 4639102, 8840653, 8500814, +9921374, -11662984, 3010772, 18025440, 4184372, -3557844, -3376918, -9483288, -7108708, -377957, +969589, 2915209, 15670725, 914828, 8777303, 7770133, -285615, -4412542, -3451543, 13411572, +-16014322, -4139275, -14149770, -12532178, -3081102, -613643, -23958938, 5506148, -7394860, 13957570, +-2891050, -303869, 10418517, 1054415, 24920474, 19362250, 29589640, 9918153, 1138166, -4804995, +-3313567, -6249715, -8935143, 13275744, -3216394, -2234457, 30227980, -5570573, -6044630, 33627448, +11811, 19396610, 14350559, 1709397, 8250632, -3821984, 6560563, 6369974, 4086662, 5305359, +15711527, -9865540, 18836116, -9454297, 108985, 4474282, -2073932, -12626667, -11516955, 388695, +-18956376, -5419175, -20751134, -668404, -12173011, -8582955, -6494528, -5195837, 3534758, -16133508, +20118164, 4006668, -12447889, -8629126, -237297, -1499481, -2769180, 6133750, 3082713, 20486458, +2601677, 906238, -9541270, 2821257, 4405026, 523986, -10188199, -3256659, 12585865, 14697378, +-367220, -9770514, 5058935, -589484, 17801028, 21073258, -7020124, -3042448, -2988760, 4364224, +-6749541, 10266582, -23224498, 619549, 29392072, -22103512, -11228118, -1165547, -3198677, 2415919, +-16920024, -9085466, -2333241, 13786308, 16502875, 11463805, -9907953, -25944824, 45978700, 11891154, +-28284508, -28309204, -3962644, 7378754, 19766514, -24566676, -4084514, 5097590, -40802, -3159485, +26458610, 6048925, -15044197, 8638253, 1376000, -287763, 14053133, -2061584, 7802345, -16587164, +-5503464, 30401390, 11322071, 24074366, 7701950, 21813066, 3972308, -7373922, 15239618, 14151917, +21660594, 11034308, -24011552, -8705362, 5430450, 12999255, -9548249, 4177930, -9206799, -15169288, +1735167, -1315871, -9231495, 7784628, 10269267, 9315247, 6542846, 6553047, -4525822, 16731045, +-52076, -15565498, -11630235, 15131707, 7952132, -24707874, 11038603, 5112085, 8170102, -21409338, +-15050639, 15016279, 22067006, 13430363, -4471061, 11529840, 21931176, 8823473, 23131084, 4371740, +10983842, 8269960, 38117836, 51502564, 4686346, 10755135, -31692026, -9749576, 20336670, -15981573, +39298412, -7152731, 6837588, 10888816, 23353348, 13012140, -4589710, -15884937, -18369038, -5870147, +-2335925, -23601920, -10562935, -9143449, 16273094, -8540542, 5455146, -15031312, 2929705, -5693516, +-21607980, 23730768, 17121350, 19151796, 9208947, -11172284, -10184441, -25901338, 1428614, -23343148, +-6212670, -1779190, 4081830, 12281996, 10506027, -7492571, -4446365, 10143639, 23106388, 6035503, +9451612, 16192027, -19569482, 14576045, -10695005, -10849624, -19796042, -9218074, 10429254, 7825968, +2203318, 23970212, -4523675, -9447317, 4367445, 5718749, 33757908, -11894375, 13349832, 11720966, +31660352, -7801808, 4412005, -14493904, -4347044, -19238232, 14842870, -27574764, 979253, -22238804, +4073240, 9236327, 3126736, -13379360, 44891000, -3360275, -6396817, 3925600, -26050588, 1304060, +-17718888, 430570, 4536559, -5372467, -951335, 10488310, -9815611, 255014, 13297219, 970663, +3067144, -22277458, 2412698, -2010582, -1798518, -5742908, -27890980, -15416248, 6342056, 2114735, +11734924, -31947040, 2998424, -29739964, 14531485, -20321638, -32807644, 16239271, 29276108, 5015448, +14124537, -22432078, 21553220, -5595269, 2741263, -13799193, 17831630, 7305740, 18523658, 5900748, +22587234, -21092048, 3400540, 1095754, -4221953, -16681653, -14207752, -15614890, 17149804, -4572530, +23552526, -14610942, -12058658, 3615826, 2799782, -11038603, 6558952, -53259740, 6030671, -17324824, +48413944, -9654013, -25128780, 9352828, -1867237, -25047176, -4661650, 3629247, -15258408, 36426692, +4782983, 3070902, 16284905, -21218212, -32391570, -20156282, 44565116, -4071092, -10040560, 29272886, +16312286, -14677514, -14583561, -8440148, 35223564, 4510790, -9196062, -14462229, -7231115, -28392956, +18322330, -3759170, 7129646, 17425220, -6844031, -29404956, -4041027, 36719824, -2105608, -9826885, +17440788, -8702141, 21762600, 14071387, -2408940, -28087476, -14545980, -4348118, -26001732, -15534897, +-15203647, 1398549, -4023848, 20896090, -15491410, -5816997, -618475, 54651312, 18695992, -10186589, +10666551, 5828808, -3777424, 27360016, 13135084, -11391864, 3901978, 21880174, 25203942, -16586090, +-11462731, -38712152, -29777546, -979253, -4214437, -4119411, -58133992, 22054120, -11239929, 33332168, +33819108, -17126182, 16775605, -30355756, -46455440, 2787971, -32216550, 6069326, -2691334, 27758910, +-17847736, 20297478, 17528298, 27876486, -38317552, 6062883, -22840100, -20624970, 3993246, -27103928, +-17034378, 27998354, -6045704, 11776800, 32220844, -4207458, 11719892, -23313082, 4569309, -25858388, +27469000, -21058224, -13573707, -14975477, 30511448, 25128780, -14698452, 33652680, 22713934, -4450660, +33166274, 543313, -31118648, -6775848, -1870458, -23321672, 7912404, -51982528, 7669201, -11207717, +-23874650, -18341658, 26803818, -11615202, 53118008, 40682468, -53755272, 3352759, 1502165, 6294275, +29391534, -40465572, -27284854, 34830036, -21218750, -26896696, -31493384, 8230231, 81992536, -6060199, +-17694728, -16972638, 7233799, 28412282, -30907122, 15931644, -52130164, -7668664, -20045150, -17603998, +28193240, -35678832, -55521044, 32863480, 49682572, 12096775, -9059160, -44558676, 3542811, 17645336, +18038862, -7369627, -17360258, 2356863, -3828427, -5754720, 6328635, -6504191, -14344117, -29212756, +4420058, -17564268, 5118528, -15755014, -32596654, 20777978, 16119549, 25525528, 1803349, 27588722, +16428787, 4132832, -7912941, -14139569, -21880710, -16458852, -8050916, 6453725, 17150878, -10728828, +-3787624, -38180112, 37249716, 42179800, 25218974, -21753472, 24427626, -29679298, 1557463, 6523519, +-62179852, 4954782, 8941048, 30073898, -35570384, 49158048, 22827214, -36159868, -16223702, 14163728, +-1440962, -27154930, -25900800, -36109400, -38504920, -5172751, -49177912, -6669011, 17754322, -23162222, +-21577916, 20136418, 20426328, 4051228, -19499152, -66521528, -9871445, 12862353, 7810398, 28667832, +-734976, 16610786, -4431333, -552440, -8454643, 1108102, 17488034, 1892470, 632971, 16937204, +-4639639, -4264903, -22523346, -2219424, -3679713, -2666638, 3799972, 13468481, 18561238, -3816079, +-38118, 14439143, -3338263, -28310814, -1954747, -25158844, 3631395, 3218541, -32743756, 23557896, +-45100376, 9899900, 12468827, -20008642, -1320166, 58289684, -16466368, 19506130, -12221329, 10184978, +-43658344, 4428112, 25878788, -1020055, 22419192, -5530308, 2660732, -1863479, 28745142, -18721762, +-21294984, 24480776, -22442814, -29431800, 638876, -46790984, 31940062, 23889682, -6993818, 7487202, +8075076, -4494684, -25497610, -74591232, -35720708, -12721693, 22726820, 52801792, -50736984, 9583146, +-15559593, -51158428, -8215736, 43624520, 10848551, 35720168, -32413044, 8044474, -12016245, 951872, +20599736, 2462090, 10644003, -8288750, -64826088, 17639968, 1925756, -28229210, 26532698, 19948512, +-20420422, 18351322, 1163399, -21932250, 5169530, -14011794, 38614440, 3679713, 14941654, -428423, +-41996728, -33891588, -12184822, -25417080, 25406342, 36992552, 38085624, 30415884, -12087112, 3246459, +-33237678, -5989332, -4378719, -14641544, -18056580, 1608465, 1954210, -45197552, -14058502, -18317498, +-2353105, 18705120, -22837952, -6012418, 6490233, -903554, 21563420, -26024818, -2161979, -29253560, +-16116865, -21652004, 10449655, 7279433, 21481278, -2794413, -3708704, -25053082, -10319733, 20130512, +-29841970, -120640800, -63213864, 14271639, 52133388, 115727896, 88446264, 50498076, 17467632, 26938572, +-7336341, -46941844, -92414808, -122707752, -30617212, -34617436, 2576981, 61747136, 86816320, 59153512, +77815144, 19196894, 16952236, -7561827, -38495792, -42719892, -35253092, -36458904, -46524160, -36095444, +-15691126, -797253, -209380, 31784368, 39398808, 76432168, 35572528, 13379897, 30887258, 49488760, +15350213, 10948409, -38395932, -50771884, -86069000, -37834368, -45210436, -30672508, -19592030, -13209709, +6142340, 12723841, 35863512, 76292576, 59180356, 67311264, 47605956, 61343944, 43209520, -33127082, +-33443836, -79582520, -64638720, -43979928, -105840344, -78230680, -51138564, 6545530, 61172144, 62970128, +68470368, 91634200, 72222024, 42875584, 42804716, -396748, -32700270, -33023466, -18997714, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, { 8451959, --1050656, 4005057, -1381906, -127775, 7632694, -4049081, -380105, 2151242, -797790, 2536178, -2909304, -6616397, 2668785, 2490544, 1421634, -319438, -2156074, 4530117, -5764920, -4878546, --1060857, 125628, 2349347, -4952098, -3628174, -526670, -3215320, 5291400, 282394, -2252174, -4214974, -3853660, 467615, -863288, -2269890, -351114, 3287798, 3337190, 1994476, 5168457, -4294431, -389768, 1335198, -2173254, 5496485, 3415573, -2423972, 563178, 770947, 543313, --3294240, 2905546, 1016834, -513249, 5833640, -3114925, -3484829, -482110, 1784022, 363998, --705985, -2178085, -1389422, 1809792, -1567663, -386547, -1182727, 1895691, -774705, 4364761, -2157684, -2896419, -1624571, 2457795, -2684355, -1497333, -2153389, -4194036, 2537789, 4019553, -7099581, 1950452, -4884989, -8747775, 1969779, -4063039, 412317, 2805688, 1138166, 7159711, --5819681, -1408212, -732829, -426276, -4983236, 3151969, 1389959, 687732, 209917, -2430952, --1822677, -1751810, -498753, 281857, 1270237, -1828046, 2793339, 6403796, -118648, 2862059, --4430259, -2592550, -5316633, -2579665, 5836861, 303332, -1075352, 1049046, 6192269, 684510, -3167539, -743029, -2752000, -869731, 3588982, -2962454, 5573794, 3388192, 6274947, 3065533, -517007, -1855426, -3948686, -2231773, -3409130, -514859, -2442763, 1059783, 382789, -1352915, -1067299, -1148904, 2379949, -489626, -412317, 3190624, -94489, -110595, 659814, -2837900, -1650341, -12275553, -2781528, 5029407, 882079, 6856916, 3661460, -5656472, 1491964, -131533, -2252174, -2033130, -9417790, 5428839, 3339874, 6220724, 7799661, 6694244, 2362232, 75162, --9587978, -1006633, 4423280, -4395899, -3781182, -10044855, -653909, -1698123, -1137630, -2573759, -1212791, -6007586, 2757369, -1073742, 2564096, 719944, -3988951, 3078418, 2629594, 6925635, --767189, -5599027, -2830384, 2984466, 1263794, -1425392, 345208, 2186675, 351650, -4103305, -31139, 822486, -357019, 222265, -2484102, -1162862, -3326989, -741956, 4316442, 1467268, --1322313, 1760400, -415001, -256087, 789737, -4925791, -275952, -280247, 2936684, 5255966, --1321239, -565325, -3110630, -2667712, 1753957, 6010270, -4706211, -855235, 445603, -411780, --1437740, 1032940, -1431298, 6769942, 2534031, 2275796, -2288681, 160524, 627602, 631897, --11664594, -6321118, -536334, -2917894, -3614215, -197032, -3041911, -11877732, 7065758, 1609539, -3198677, -1263794, 2435783, -3150359, 153545, 412854, 6117107, -2185602, -1278827, -1032940, --1022202, -987306, -418222, 6614787, -1264868, -105227, -3751654, -215822, -1796907, 2150705, -1117228, -6416145, 5007932, -6491306, -87510, 5702106, -774705, 223338, 479426, -117575, --3929358, -2809446, 6595459, 3805341, -8042863, -4301410, 1349157, -4721780, -3380676, 3513283, --5754720, 1187022, 1494649, 3398930, 7050726, 5413270, 3351685, 2581275, -4668093, -4852240, --4183835, 1473711, 6044093, 2384781, 8946954, -2146410, -2235531, -2638721, 2557653, -2959769, -4405026, -8425652, -1030255, 6290517, 3337727, -6336688, 4762582, 7734699, 7349226, 4658966, -959388, -279710, -4691715, -6136972, 2683281, -586800, 6240051, -482110, 3769371, -3839701, --2462627, -2063732, 706522, 1955284, -246424, -7512435, 1691143, 2587181, 2001992, 3220152, -2105608, -4089346, -9898289, -3248069, 1603633, 1911797, 615254, -454193, 2054068, -4140349, -93416, -7499013, 3662533, -7738458, -1850594, -3300682, -4878009, 3666828, 1843615, 1533840, --4206384, -2190433, -1064078, -4479114, 678605, -415001, 2654290, -1942399, -3433290, -2892124, --8534100, 2782065, 1405528, 3776350, 6047314, 7145215, 3297998, -2857227, -3630858, -2007360, -4552666, 4534412, 4194573, -631897, 2991445, -8531953, 1096290, -4032438, 534723, 1363652, --5331128, 2057826, 15927349, 1814624, -1316944, -8835821, 12838194, 56371, 5441187, 719944, --181462, -6844568, 6817187, 1816771, -3635690, 970663, 595390, -2675765, 2808909, 7189776, --1977296, 7641284, -2145873, 3325379, -31139, 5076115, 4510790, 5058398, 145492, -2594697, -3974992, -2736431, 3513820, -865973, 3543348, 3468723, 3310346, -296353, -886911, 1414655, --2684355, -3898757, -10197326, 6874095, -6550899, 4808216, 712965, 2120103, -1076963, -12121471, --2528662, -3134789, -5843303, 1015223, 3883724, -7672422, -2321430, 3814468, 858457, 5873905, -9985262, 76236, -2349884, -1908039, -9756555, 3675955, 2516851, -1219234, -4633196, -5568962, --663036, 2785286, -1874753, -2760053, -4093104, 1017370, 7065758, 3090229, 1000191, -16507170, --7645042, -2420751, 3218004, -2093260, 5408438, 18541374, 5682779, -6998113, 941135, -8254391, --2753611, 5548561, -6582575, -1780264, 8215199, 1871532, -2201171, 1045288, 4601521, -2974802, -2178085, 2336999, 2343442, -4777614, 2020245, -2312303, -2742874, -6992744, -2754148, -4148939, --7710540, 3191161, 190589, -667867, 7639136, 5475010, 1920387, 6031745, -6979, -7991861, -6565932, -907849, -5384279, -4397510, -7793755, 183073, 9400610, 462783, -4092030, 3800509, --6921877, -4574140, 3715684, -5869610, -7386270, -4189204, -2180233, 3973919, -6387153, -2373506, --2731599, 8142721, 1757179, -3579318, 5452998, 3866008, -10851235, 9821516, -4022237, 670015, --4861903, 8362838, -1437203, -6085432, -19165754, -2807835, 9640054, 2152852, -14972793, 6448357, --194347, -3323231, -4916127, -4143570, -1627793, -9100499, -1641751, 6793028, 9105868, 10692858, -6546604, 9715753, -3420405, 7576859, 3693672, -15954193, -476205, 3716221, 5448703, 2349347, --5467494, -56371, -1195075, 5140002, -9415642, -3744675, 6915971, -2685428, 3886946, 1656247, --6242198, -7333657, -3564823, -10797011, -2922188, -3620658, 4314295, 1097901, -5923834, -1843615, --12713103, -3715147, 5369783, -4252555, -12497818, -722628, 7401303, -15935939, 4705674, 1946694, -5178657, -7955353, -3044595, -7675644, 930934, -2953864, -7409356, -3148211, -882616, 3207267, --11293617, 3095061, 9923522, 12612708, 9561134, 9700184, 4088272, -5977521, 7006703, 11660299, --16084116, 8756901, 8888435, -17399450, -4107599, 4776004, 19784230, -1107565, -629213, -4195646, --4774393, 24132348, 12403329, 3666292, 3609920, 12676059, 428960, -1533840, -3935801, 2173790, --9998147, -9327595, -1494112, 3298535, 7879655, 3546032, 2373506, -3351685, 1465658, -7567733, -4063576, -11361799, 12219182, -1018981, -4824322, -6441377, -6746857, -11500312, 2943663, -11137924, --2867965, 8001524, -821413, -3698504, -2706366, -1642288, -8634495, -6590091, -3247532, -3998615, --1030255, 3692598, 3245922, 689879, 1843078, -8511015, 16184511, 8535174, 1707786, -1082332, -21042118, -2384244, -1640141, -4872641, -8039105, -2890513, 21776558, 7364795, 4509179, 10518375, --12122545, -7321309, 6726456, 7198365, 16112033, 2256469, 4387846, -11032697, -775778, 5312875, --14499810, -4711043, 5604933, -4875862, 28991, 3848291, 10455561, -3678640, 3983045, 2097018, -2162516, 8988830, 7713225, 9586367, -7794292, -5158793, 10268193, -13349295, -4617090, -4474282, --1107028, -3665755, -8712878, 8186745, -533113, -9229885, 185757, -3682398, -9801115, -11962021, --6883759, -7202660, 13765907, -4553739, -3872450, -8405251, -1001801, -4322348, 1846836, 16479790, --3448322, -5513128, 2458332, -1083942, 9176198, -11203422, 18369576, 3643206, -18497350, -13269301, -4301947, -12315819, -298500, -13200045, -482110, 2571075, -2263448, 13807246, 16957068, -8705362, -1364189, -3905736, -17972290, 8464307, 40892920, -5654862, 764504, -16159814, -6083285, 12994960, --486942, 23966992, 14901389, 13842143, 1325534, 10960757, -17379048, 18161806, 10033044, 2024003, -3473555, -9572945, 5958731, 1067836, 18548890, 10868952, 12795244, -2949032, 2418067, 4247723, --10295037, -8112657, -2943126, 6557878, 21483964, -4321274, -5451387, -5586142, -2470680, 3904125, --11425150, -2422899, 559956, -5547487, -12132209, -1541356, -15749645, -4913980, 11607686, -10603201, --3712999, -975494, 2513630, -17981418, -10101226, -1094143, -394063, -2234994, 13909788, 6881612, -2549063, 8923868, 14392972, -6155225, -1342177, -8916352, 6764574, -6585796, 9126806, 9956808, -11922829, 19704774, 7303592, -11287174, 213138, 32093606, 12188580, 19475530, 10287520, 20185810, -22172768, -22948010, 5315559, 16283295, 9824738, -6668474, -12236362, -10801306, 23211078, 1512902, -8652748, 11831024, -7102266, 3002719, 5035313, -14792404, -15279346, 11843909, 4149475, -22681186, --5138929, 28200756, 13791677, -664646, -16399796, 4744328, 4357781, 16821776, 5848135, -9246528, -11541651, 1273995, -4706748, -2457795, -3324305, -14489072, -6287832, 1206349, 2550137, -17229798, --17365626, -11398306, -4794257, -20397336, 11785927, -2318209, -13426605, 1444183, 681826, -7215008, --1272384, 2819646, 323196, 2945811, 5553393, 6265821, -7125888, -10730976, 12575127, 22536230, -11650636, 4691715, 18444200, -5475547, 10443213, 21259552, 15316390, -460098, 3595425, -10480257, --13404593, 10415296, -12586939, 1658931, -4197794, -1895691, -4649839, -21268142, 5929739, -10270341, --4752382, -7945690, -1364726, 18147310, 17976048, -36458368, 11241540, 11529303, -11344619, -18562312, --24189256, 4232691, -7125351, 4444218, -8458938, -6662031, -3947075, 22521734, 5688148, -1988570, --408559, -3615289, -6758131, 5682242, 3735548, -124017, 9033390, 1950452, -1916629, 3209951, -8205535, 23262080, 2340220, 2859375, -11494406, -4924717, -5433134, -5787469, -687195, -1930588, -7733089, 11145977, 561567, 12880607, -2945274, -2149094, -2581812, -1399623, -22490060, 25483114, -738734, 1855426, -1770600, -6548752, 6876780, -1665374, 10481331, 680752, -9687836, 2789581, -11186242, -7647726, 10467372, 2650532, -15173583, -2428267, -2822331, -27984934, -8971650, 7703024, -8301635, -10651519, -6985228, 17437030, 4248260, 4590783, -14682346, 8998493, -6522445, 8508330, --8665633, 11293080, -12411919, -10430865, 16063715, 937914, 3323231, -11413339, -23871428, -3415573, -5624260, 523986, 8753680, -9419400, 233539, -1400696, -18067316, -13594108, 4619774, -20579336, --13626321, 4780299, -929324, -21507048, -3883724, -11438572, 11824582, 6251325, 1318018, -6167036, --13597866, -28297928, 8459475, -13548474, 13677860, -6014565, -5881958, -4119411, -8086887, 2390149, -2864206, -23156854, -10424422, 19272592, 17464410, -20918638, 23771570, -680215, 17251274, -6419366, --5337034, -4459250, -8152385, 7175817, -8046085, -22422950, -11568494, 21100638, -6272800, -7649874, --2279554, 4160213, 3767223, 8360154, -28190018, 3748970, 17729624, 9107478, 12858058, 9977746, --9597104, -16441672, -13732621, -8100309, -15912317, -888521, 7692287, 17566954, -2911451, -859530, --29270202, 17590038, 22109954, -3520800, -11745662, -12174622, -7307350, 32969242, -19888920, -140123, --2127620, 8838506, -1211181, 37966976, 1220308, -20799990, -5134634, -19777250, 26030724, 22235046, --17656610, 20906828, 5662915, 16807280, 6757058, -31873490, 10426033, 16886200, -21505438, -6212670, --24432458, -12581033, 1437740, -23098334, -19010062, -651224, -15240691, -303332, 6298033, -5757941, --15010911, 12903692, 12557948, -25987774, -18966038, 10865730, 5531918, 7028177, 14197551, 17304424, --5206037, -9165460, 694174, -5791227, 1025960, -1545115, -7202124, 4018479, -34339336, 13113609, -19523310, -17299592, -12883828, 13928042, -8058970, 9393093, 21336860, 38994544, 60745868, 3099356, --22794466, -29632590, -6031745, 2560338, -6174016, 30230128, 22857280, 16339129, 26286810, 19640348, -15934866, 2375117, 13049184, -14072460, 22879290, 26559004, 2819109, 27588186, -9682467, 3581466, -7146289, -22963042, -15353971, -4323959, -13480829, -15631533, -1516124, 28389734, 634581, -3675418, -4328254, 7279433, -2690797, -34914328, -4066260, 11108396, -4476430, -9582609, 5377299, 15715285, -25884694, 7812009, 13579613, 19380504, 22611930, -28460064, -20162188, 13574781, -8055748, 40103184, --3314641, 34762928, -25971668, 17557826, 27453430, 2892124, 4893579, 18051748, -28616830, -11525545, -1158567, 18671296, 798864, 21272436, 8010651, 9459665, 19674172, 9458055, -2409477, -5590437, -42235636, 13817984, 14554034, 30732102, -2724620, 6260452, 13064754, 19662360, -22706956, -18105434, --8092792, -19811610, -3972845, -26506928, 12929999, 20733954, 14711337, 20607790, -14659260, -7982197, -15426986, 12321724, -9486509, 20953534, 11962021, -5000953, -26590680, 14223321, 14913200, -13249974, --2801393, 7437273, 2835752, -20915416, 23072028, 6338835, 24792698, 14001593, 9078487, -14050449, -10954851, -7478075, 38156488, -30973694, 2223719, 11830487, -7096360, -19996294, 11475616, 12492986, --3788698, 12291123, -13369159, 32006096, -16301012, 8416525, 5440650, -20369420, -10414759, -28129888, -10275709, 8144869, -22622130, 19390166, 14870787, -14604499, 10088341, -1765232, 30564062, 10329396, --18207440, -12315282, -13548474, 9660992, -8450348, 7858180, -4532264, -36711232, 17929878, -31152472, -34447784, 41177464, -1061931, 8111583, -31522912, 810138, -6211597, 4440996, 20010790, 20517058, --4682051, 11184095, 16815334, 3629247, 7677254, 5683316, 7592966, -2983929, 24030342, -2059974, -6286222, -11658689, 26914412, 6756521, -1347009, 316217, 24337970, 10082973, 12067247, 26895086, --4637491, -14694157, 32668594, -32347010, -13384192, -4601521, 8556112, 23443006, 6291590, -7881802, --8249022, -14943802, 806917, -1677185, 7606924, 36912560, 35777076, 23319524, 32403380, -1487669, -48206712, -14312979, 14326400, -9714142, 2354716, 16297790, -5976447, 3321620, -12820477, -16533477, -1640678, -9648107, 10990821, -13589277, 24669218, -15272904, -26581016, -9090835, -5506685, 600759, -35863512, -16127065, -2071248, 10774462, 9165997, -1466731, -14870251, 56870736, 79799952, 23205708, -61911416, -15641734, -45500884, -32698660, -22987738, 8834211, 10288594, -16600049, -25008520, 18555870, -26280368, 14107894, 26243324, 19163608, 3987340, 6322192, 2929168, -3563749, -19315542, 5743982, --22642530, 12808666, -1023276, -22470732, 22143778, 11625940, 10016401, 37681360, 23613194, -14151917, --8854075, -17184164, -18235358, -23813446, -9354976, -2068027, -17672180, -8162586, 33703144, 49585396, -37790344, 2076617, 25468620, 24894168, 42184096, 16276315, -23925652, -41263900, -24479166, -27828704, -13157632, 7897371, -52451752, -39490612, -10151155, 17193290, 45667312, -39780524, -2535641, -35471060, --5162014, 32793686, -22349936, 8513699, -31977106, -11441256, -10814728, 18580028, -30768072, -2827162, --6183679, -23607288, -45337136, 4906464, 24258512, -21239150, 37920268, -15906948, 14666776, -5639829, --45257144, -23310934, -2863670, -26685168, -60890824, -17318918, 20971788, 32964948, -17052094, -26159036, --54469312, -16335371, 15053860, -11021960, -16377784, -26999238, 5496485, -6315750, -5383205, -5267778, -9965935, 21346524, -17691508, 16488916, 13278428, -17103634, -49970332, 3905199, 2973728, 12598213, -4884452, 32061394, 2174864, -48663592, -781147, -53537304, -1395864, 18804978, 21263846, -3908420, -1720671, 25265682, -14360223, -9076340, -18197776, 16666084, 10265509, -7081864, 17659832, -5220533, -6402186, 9899363, 29651380, 5332739, -13194140, -32343788, -13838921, 19164144, 12700218, 28839632, -36204428, 70160976, 30447560, 19836306, -20942260, 3683471, -43650828, -13222057, 30419106, -14867029, --12541841, -3118146, -9807021, -34893924, -38969312, -56822416, -18020610, 292595, -4454955, 37504728, -10207527, 48947056, 29990146, 15338939, -6883759, -17726404, -3445101, 68624984, 4145180, 20021526, -10993506, -8220568, 33928632, -13816910, 27357332, -29587492, -3108483, -21172042, 25728464, -35945656, --7808788, 11657615, 11335492, 12257300, -31978716, 23266374, -36581312, 8058970, -17991082, -11521250, -36134096, 2908230, 2256469, 13308493, -13886166, 83215, 9367861, -43257836, 1094680, 11260867, --6518150, 29652992, -12815646, -4296041, 47886200, -16738024, -39893268, 1691143, -15042586, 5028870, --2957085, -20401, -31891206, 19564650, -5020280, -40658844, 26588532, -50195820, 11048803, -6836514, --19999516, -23545010, -19953344, -67781560, -69590816, -59609316, -30511984, 119918712, 36913632, -16234976, --16755741, -61025580, -127769912, -15463493, 33113660, 41325640, 17326434, -20732880, -15533823, -38619808, --42073500, 29683056, -30547418, 75022344, 56337088, -90324232, 27922656, 10347650, -19498614, 5549635, -63082332, 7756711, 43291124, 86062552, -19818052, -73271072, 2629057, -13713294, -67652712, -19745576, -31675920, -4460324, 39187820, 62776316, 5165772, -57321708, -109691856, -95320896, -84256520, -10429254, -80771152, 21488258, 21316996, 10518375, -22342420, -111145704, -68651832, -36815924, -13439490, 4904316, -24737938, 22167400, 30989800, 29719564, 39586712, -49110268, -16549046, -40630392, -2661806, -44309032, -27115740, 24116778, 54941760, 57648124, 30118996, -904628, -13580150, -11682848, -68886440, 15736223, --16117939, -128925792, -143614048, -99853696, -102725416, -32651952, 99187440, 64714420, 107572288, 121130424, -187188640, 122314760, 126241440, 79387640, -14328011, -103234904, -174217296, -203526160, -178469856, -141460656, --105233680, -30314952, -12814572, -20751672, -2947421, 35744328, 61795452, 90229208, 76147088, 108240696, -102761928, 136818336, 122899952, 30600032, 79841296, -25115896, 15991237, 11803107, -3085397, -17910550, --135643120, -158732320, -203862768, -235060336, -216877600, -121230280, -111196168, -89771792, -114315384, -127633008, --34331820, 25818122, 69330976, 109303696, 156022208, 192342592, 243605184, 328796928, 314514016, 242500288, -191211408, 164025872, 80542984, 138817632, -62445068, -111236968, -275958624, -305650816, -389216928, -362261696, --340122208, -306928576, -307014464, -165308992, -104239928, -2929705, 216135632, 169441824, 112524920, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-1050656, 4005057, -1381906, -127775, 7632694, -4049081, -380105, 2151242, -797790, 2536178, +2909304, -6616397, 2668785, 2490544, 1421634, -319438, -2156074, 4530117, -5764920, -4878546, +-1060857, 125628, 2349347, -4952098, -3628174, -526670, -3215320, 5291400, 282394, -2252174, +4214974, -3853660, 467615, -863288, -2269890, -351114, 3287798, 3337190, 1994476, 5168457, +4294431, -389768, 1335198, -2173254, 5496485, 3415573, -2423972, 563178, 770947, 543313, +-3294240, 2905546, 1016834, -513249, 5833640, -3114925, -3484829, -482110, 1784022, 363998, +-705985, -2178085, -1389422, 1809792, -1567663, -386547, -1182727, 1895691, -774705, 4364761, +2157684, -2896419, -1624571, 2457795, -2684355, -1497333, -2153389, -4194036, 2537789, 4019553, +7099581, 1950452, -4884989, -8747775, 1969779, -4063039, 412317, 2805688, 1138166, 7159711, +-5819681, -1408212, -732829, -426276, -4983236, 3151969, 1389959, 687732, 209917, -2430952, +-1822677, -1751810, -498753, 281857, 1270237, -1828046, 2793339, 6403796, -118648, 2862059, +-4430259, -2592550, -5316633, -2579665, 5836861, 303332, -1075352, 1049046, 6192269, 684510, +3167539, -743029, -2752000, -869731, 3588982, -2962454, 5573794, 3388192, 6274947, 3065533, +517007, -1855426, -3948686, -2231773, -3409130, -514859, -2442763, 1059783, 382789, -1352915, +1067299, -1148904, 2379949, -489626, -412317, 3190624, -94489, -110595, 659814, -2837900, +1650341, -12275553, -2781528, 5029407, 882079, 6856916, 3661460, -5656472, 1491964, -131533, +2252174, -2033130, -9417790, 5428839, 3339874, 6220724, 7799661, 6694244, 2362232, 75162, +-9587978, -1006633, 4423280, -4395899, -3781182, -10044855, -653909, -1698123, -1137630, -2573759, +1212791, -6007586, 2757369, -1073742, 2564096, 719944, -3988951, 3078418, 2629594, 6925635, +-767189, -5599027, -2830384, 2984466, 1263794, -1425392, 345208, 2186675, 351650, -4103305, +31139, 822486, -357019, 222265, -2484102, -1162862, -3326989, -741956, 4316442, 1467268, +-1322313, 1760400, -415001, -256087, 789737, -4925791, -275952, -280247, 2936684, 5255966, +-1321239, -565325, -3110630, -2667712, 1753957, 6010270, -4706211, -855235, 445603, -411780, +-1437740, 1032940, -1431298, 6769942, 2534031, 2275796, -2288681, 160524, 627602, 631897, +-11664594, -6321118, -536334, -2917894, -3614215, -197032, -3041911, -11877732, 7065758, 1609539, +3198677, -1263794, 2435783, -3150359, 153545, 412854, 6117107, -2185602, -1278827, -1032940, +-1022202, -987306, -418222, 6614787, -1264868, -105227, -3751654, -215822, -1796907, 2150705, +1117228, -6416145, 5007932, -6491306, -87510, 5702106, -774705, 223338, 479426, -117575, +-3929358, -2809446, 6595459, 3805341, -8042863, -4301410, 1349157, -4721780, -3380676, 3513283, +-5754720, 1187022, 1494649, 3398930, 7050726, 5413270, 3351685, 2581275, -4668093, -4852240, +-4183835, 1473711, 6044093, 2384781, 8946954, -2146410, -2235531, -2638721, 2557653, -2959769, +4405026, -8425652, -1030255, 6290517, 3337727, -6336688, 4762582, 7734699, 7349226, 4658966, +959388, -279710, -4691715, -6136972, 2683281, -586800, 6240051, -482110, 3769371, -3839701, +-2462627, -2063732, 706522, 1955284, -246424, -7512435, 1691143, 2587181, 2001992, 3220152, +2105608, -4089346, -9898289, -3248069, 1603633, 1911797, 615254, -454193, 2054068, -4140349, +93416, -7499013, 3662533, -7738458, -1850594, -3300682, -4878009, 3666828, 1843615, 1533840, +-4206384, -2190433, -1064078, -4479114, 678605, -415001, 2654290, -1942399, -3433290, -2892124, +-8534100, 2782065, 1405528, 3776350, 6047314, 7145215, 3297998, -2857227, -3630858, -2007360, +4552666, 4534412, 4194573, -631897, 2991445, -8531953, 1096290, -4032438, 534723, 1363652, +-5331128, 2057826, 15927349, 1814624, -1316944, -8835821, 12838194, 56371, 5441187, 719944, +-181462, -6844568, 6817187, 1816771, -3635690, 970663, 595390, -2675765, 2808909, 7189776, +-1977296, 7641284, -2145873, 3325379, -31139, 5076115, 4510790, 5058398, 145492, -2594697, +3974992, -2736431, 3513820, -865973, 3543348, 3468723, 3310346, -296353, -886911, 1414655, +-2684355, -3898757, -10197326, 6874095, -6550899, 4808216, 712965, 2120103, -1076963, -12121471, +-2528662, -3134789, -5843303, 1015223, 3883724, -7672422, -2321430, 3814468, 858457, 5873905, +9985262, 76236, -2349884, -1908039, -9756555, 3675955, 2516851, -1219234, -4633196, -5568962, +-663036, 2785286, -1874753, -2760053, -4093104, 1017370, 7065758, 3090229, 1000191, -16507170, +-7645042, -2420751, 3218004, -2093260, 5408438, 18541374, 5682779, -6998113, 941135, -8254391, +-2753611, 5548561, -6582575, -1780264, 8215199, 1871532, -2201171, 1045288, 4601521, -2974802, +2178085, 2336999, 2343442, -4777614, 2020245, -2312303, -2742874, -6992744, -2754148, -4148939, +-7710540, 3191161, 190589, -667867, 7639136, 5475010, 1920387, 6031745, -6979, -7991861, +6565932, -907849, -5384279, -4397510, -7793755, 183073, 9400610, 462783, -4092030, 3800509, +-6921877, -4574140, 3715684, -5869610, -7386270, -4189204, -2180233, 3973919, -6387153, -2373506, +-2731599, 8142721, 1757179, -3579318, 5452998, 3866008, -10851235, 9821516, -4022237, 670015, +-4861903, 8362838, -1437203, -6085432, -19165754, -2807835, 9640054, 2152852, -14972793, 6448357, +-194347, -3323231, -4916127, -4143570, -1627793, -9100499, -1641751, 6793028, 9105868, 10692858, +6546604, 9715753, -3420405, 7576859, 3693672, -15954193, -476205, 3716221, 5448703, 2349347, +-5467494, -56371, -1195075, 5140002, -9415642, -3744675, 6915971, -2685428, 3886946, 1656247, +-6242198, -7333657, -3564823, -10797011, -2922188, -3620658, 4314295, 1097901, -5923834, -1843615, +-12713103, -3715147, 5369783, -4252555, -12497818, -722628, 7401303, -15935939, 4705674, 1946694, +5178657, -7955353, -3044595, -7675644, 930934, -2953864, -7409356, -3148211, -882616, 3207267, +-11293617, 3095061, 9923522, 12612708, 9561134, 9700184, 4088272, -5977521, 7006703, 11660299, +-16084116, 8756901, 8888435, -17399450, -4107599, 4776004, 19784230, -1107565, -629213, -4195646, +-4774393, 24132348, 12403329, 3666292, 3609920, 12676059, 428960, -1533840, -3935801, 2173790, +-9998147, -9327595, -1494112, 3298535, 7879655, 3546032, 2373506, -3351685, 1465658, -7567733, +4063576, -11361799, 12219182, -1018981, -4824322, -6441377, -6746857, -11500312, 2943663, -11137924, +-2867965, 8001524, -821413, -3698504, -2706366, -1642288, -8634495, -6590091, -3247532, -3998615, +-1030255, 3692598, 3245922, 689879, 1843078, -8511015, 16184511, 8535174, 1707786, -1082332, +21042118, -2384244, -1640141, -4872641, -8039105, -2890513, 21776558, 7364795, 4509179, 10518375, +-12122545, -7321309, 6726456, 7198365, 16112033, 2256469, 4387846, -11032697, -775778, 5312875, +-14499810, -4711043, 5604933, -4875862, 28991, 3848291, 10455561, -3678640, 3983045, 2097018, +2162516, 8988830, 7713225, 9586367, -7794292, -5158793, 10268193, -13349295, -4617090, -4474282, +-1107028, -3665755, -8712878, 8186745, -533113, -9229885, 185757, -3682398, -9801115, -11962021, +-6883759, -7202660, 13765907, -4553739, -3872450, -8405251, -1001801, -4322348, 1846836, 16479790, +-3448322, -5513128, 2458332, -1083942, 9176198, -11203422, 18369576, 3643206, -18497350, -13269301, +4301947, -12315819, -298500, -13200045, -482110, 2571075, -2263448, 13807246, 16957068, -8705362, +1364189, -3905736, -17972290, 8464307, 40892920, -5654862, 764504, -16159814, -6083285, 12994960, +-486942, 23966992, 14901389, 13842143, 1325534, 10960757, -17379048, 18161806, 10033044, 2024003, +3473555, -9572945, 5958731, 1067836, 18548890, 10868952, 12795244, -2949032, 2418067, 4247723, +-10295037, -8112657, -2943126, 6557878, 21483964, -4321274, -5451387, -5586142, -2470680, 3904125, +-11425150, -2422899, 559956, -5547487, -12132209, -1541356, -15749645, -4913980, 11607686, -10603201, +-3712999, -975494, 2513630, -17981418, -10101226, -1094143, -394063, -2234994, 13909788, 6881612, +2549063, 8923868, 14392972, -6155225, -1342177, -8916352, 6764574, -6585796, 9126806, 9956808, +11922829, 19704774, 7303592, -11287174, 213138, 32093606, 12188580, 19475530, 10287520, 20185810, +22172768, -22948010, 5315559, 16283295, 9824738, -6668474, -12236362, -10801306, 23211078, 1512902, +8652748, 11831024, -7102266, 3002719, 5035313, -14792404, -15279346, 11843909, 4149475, -22681186, +-5138929, 28200756, 13791677, -664646, -16399796, 4744328, 4357781, 16821776, 5848135, -9246528, +11541651, 1273995, -4706748, -2457795, -3324305, -14489072, -6287832, 1206349, 2550137, -17229798, +-17365626, -11398306, -4794257, -20397336, 11785927, -2318209, -13426605, 1444183, 681826, -7215008, +-1272384, 2819646, 323196, 2945811, 5553393, 6265821, -7125888, -10730976, 12575127, 22536230, +11650636, 4691715, 18444200, -5475547, 10443213, 21259552, 15316390, -460098, 3595425, -10480257, +-13404593, 10415296, -12586939, 1658931, -4197794, -1895691, -4649839, -21268142, 5929739, -10270341, +-4752382, -7945690, -1364726, 18147310, 17976048, -36458368, 11241540, 11529303, -11344619, -18562312, +-24189256, 4232691, -7125351, 4444218, -8458938, -6662031, -3947075, 22521734, 5688148, -1988570, +-408559, -3615289, -6758131, 5682242, 3735548, -124017, 9033390, 1950452, -1916629, 3209951, +8205535, 23262080, 2340220, 2859375, -11494406, -4924717, -5433134, -5787469, -687195, -1930588, +7733089, 11145977, 561567, 12880607, -2945274, -2149094, -2581812, -1399623, -22490060, 25483114, +738734, 1855426, -1770600, -6548752, 6876780, -1665374, 10481331, 680752, -9687836, 2789581, +11186242, -7647726, 10467372, 2650532, -15173583, -2428267, -2822331, -27984934, -8971650, 7703024, +8301635, -10651519, -6985228, 17437030, 4248260, 4590783, -14682346, 8998493, -6522445, 8508330, +-8665633, 11293080, -12411919, -10430865, 16063715, 937914, 3323231, -11413339, -23871428, -3415573, +5624260, 523986, 8753680, -9419400, 233539, -1400696, -18067316, -13594108, 4619774, -20579336, +-13626321, 4780299, -929324, -21507048, -3883724, -11438572, 11824582, 6251325, 1318018, -6167036, +-13597866, -28297928, 8459475, -13548474, 13677860, -6014565, -5881958, -4119411, -8086887, 2390149, +2864206, -23156854, -10424422, 19272592, 17464410, -20918638, 23771570, -680215, 17251274, -6419366, +-5337034, -4459250, -8152385, 7175817, -8046085, -22422950, -11568494, 21100638, -6272800, -7649874, +-2279554, 4160213, 3767223, 8360154, -28190018, 3748970, 17729624, 9107478, 12858058, 9977746, +-9597104, -16441672, -13732621, -8100309, -15912317, -888521, 7692287, 17566954, -2911451, -859530, +-29270202, 17590038, 22109954, -3520800, -11745662, -12174622, -7307350, 32969242, -19888920, -140123, +-2127620, 8838506, -1211181, 37966976, 1220308, -20799990, -5134634, -19777250, 26030724, 22235046, +-17656610, 20906828, 5662915, 16807280, 6757058, -31873490, 10426033, 16886200, -21505438, -6212670, +-24432458, -12581033, 1437740, -23098334, -19010062, -651224, -15240691, -303332, 6298033, -5757941, +-15010911, 12903692, 12557948, -25987774, -18966038, 10865730, 5531918, 7028177, 14197551, 17304424, +-5206037, -9165460, 694174, -5791227, 1025960, -1545115, -7202124, 4018479, -34339336, 13113609, +19523310, -17299592, -12883828, 13928042, -8058970, 9393093, 21336860, 38994544, 60745868, 3099356, +-22794466, -29632590, -6031745, 2560338, -6174016, 30230128, 22857280, 16339129, 26286810, 19640348, +15934866, 2375117, 13049184, -14072460, 22879290, 26559004, 2819109, 27588186, -9682467, 3581466, +7146289, -22963042, -15353971, -4323959, -13480829, -15631533, -1516124, 28389734, 634581, -3675418, +4328254, 7279433, -2690797, -34914328, -4066260, 11108396, -4476430, -9582609, 5377299, 15715285, +25884694, 7812009, 13579613, 19380504, 22611930, -28460064, -20162188, 13574781, -8055748, 40103184, +-3314641, 34762928, -25971668, 17557826, 27453430, 2892124, 4893579, 18051748, -28616830, -11525545, +1158567, 18671296, 798864, 21272436, 8010651, 9459665, 19674172, 9458055, -2409477, -5590437, +42235636, 13817984, 14554034, 30732102, -2724620, 6260452, 13064754, 19662360, -22706956, -18105434, +-8092792, -19811610, -3972845, -26506928, 12929999, 20733954, 14711337, 20607790, -14659260, -7982197, +15426986, 12321724, -9486509, 20953534, 11962021, -5000953, -26590680, 14223321, 14913200, -13249974, +-2801393, 7437273, 2835752, -20915416, 23072028, 6338835, 24792698, 14001593, 9078487, -14050449, +10954851, -7478075, 38156488, -30973694, 2223719, 11830487, -7096360, -19996294, 11475616, 12492986, +-3788698, 12291123, -13369159, 32006096, -16301012, 8416525, 5440650, -20369420, -10414759, -28129888, +10275709, 8144869, -22622130, 19390166, 14870787, -14604499, 10088341, -1765232, 30564062, 10329396, +-18207440, -12315282, -13548474, 9660992, -8450348, 7858180, -4532264, -36711232, 17929878, -31152472, +34447784, 41177464, -1061931, 8111583, -31522912, 810138, -6211597, 4440996, 20010790, 20517058, +-4682051, 11184095, 16815334, 3629247, 7677254, 5683316, 7592966, -2983929, 24030342, -2059974, +6286222, -11658689, 26914412, 6756521, -1347009, 316217, 24337970, 10082973, 12067247, 26895086, +-4637491, -14694157, 32668594, -32347010, -13384192, -4601521, 8556112, 23443006, 6291590, -7881802, +-8249022, -14943802, 806917, -1677185, 7606924, 36912560, 35777076, 23319524, 32403380, -1487669, +48206712, -14312979, 14326400, -9714142, 2354716, 16297790, -5976447, 3321620, -12820477, -16533477, +1640678, -9648107, 10990821, -13589277, 24669218, -15272904, -26581016, -9090835, -5506685, 600759, +35863512, -16127065, -2071248, 10774462, 9165997, -1466731, -14870251, 56870736, 79799952, 23205708, +61911416, -15641734, -45500884, -32698660, -22987738, 8834211, 10288594, -16600049, -25008520, 18555870, +26280368, 14107894, 26243324, 19163608, 3987340, 6322192, 2929168, -3563749, -19315542, 5743982, +-22642530, 12808666, -1023276, -22470732, 22143778, 11625940, 10016401, 37681360, 23613194, -14151917, +-8854075, -17184164, -18235358, -23813446, -9354976, -2068027, -17672180, -8162586, 33703144, 49585396, +37790344, 2076617, 25468620, 24894168, 42184096, 16276315, -23925652, -41263900, -24479166, -27828704, +13157632, 7897371, -52451752, -39490612, -10151155, 17193290, 45667312, -39780524, -2535641, -35471060, +-5162014, 32793686, -22349936, 8513699, -31977106, -11441256, -10814728, 18580028, -30768072, -2827162, +-6183679, -23607288, -45337136, 4906464, 24258512, -21239150, 37920268, -15906948, 14666776, -5639829, +-45257144, -23310934, -2863670, -26685168, -60890824, -17318918, 20971788, 32964948, -17052094, -26159036, +-54469312, -16335371, 15053860, -11021960, -16377784, -26999238, 5496485, -6315750, -5383205, -5267778, +9965935, 21346524, -17691508, 16488916, 13278428, -17103634, -49970332, 3905199, 2973728, 12598213, +4884452, 32061394, 2174864, -48663592, -781147, -53537304, -1395864, 18804978, 21263846, -3908420, +1720671, 25265682, -14360223, -9076340, -18197776, 16666084, 10265509, -7081864, 17659832, -5220533, +6402186, 9899363, 29651380, 5332739, -13194140, -32343788, -13838921, 19164144, 12700218, 28839632, +36204428, 70160976, 30447560, 19836306, -20942260, 3683471, -43650828, -13222057, 30419106, -14867029, +-12541841, -3118146, -9807021, -34893924, -38969312, -56822416, -18020610, 292595, -4454955, 37504728, +10207527, 48947056, 29990146, 15338939, -6883759, -17726404, -3445101, 68624984, 4145180, 20021526, +10993506, -8220568, 33928632, -13816910, 27357332, -29587492, -3108483, -21172042, 25728464, -35945656, +-7808788, 11657615, 11335492, 12257300, -31978716, 23266374, -36581312, 8058970, -17991082, -11521250, +36134096, 2908230, 2256469, 13308493, -13886166, 83215, 9367861, -43257836, 1094680, 11260867, +-6518150, 29652992, -12815646, -4296041, 47886200, -16738024, -39893268, 1691143, -15042586, 5028870, +-2957085, -20401, -31891206, 19564650, -5020280, -40658844, 26588532, -50195820, 11048803, -6836514, +-19999516, -23545010, -19953344, -67781560, -69590816, -59609316, -30511984, 119918712, 36913632, -16234976, +-16755741, -61025580, -127769912, -15463493, 33113660, 41325640, 17326434, -20732880, -15533823, -38619808, +-42073500, 29683056, -30547418, 75022344, 56337088, -90324232, 27922656, 10347650, -19498614, 5549635, +63082332, 7756711, 43291124, 86062552, -19818052, -73271072, 2629057, -13713294, -67652712, -19745576, +31675920, -4460324, 39187820, 62776316, 5165772, -57321708, -109691856, -95320896, -84256520, -10429254, +80771152, 21488258, 21316996, 10518375, -22342420, -111145704, -68651832, -36815924, -13439490, 4904316, +24737938, 22167400, 30989800, 29719564, 39586712, -49110268, -16549046, -40630392, -2661806, -44309032, +27115740, 24116778, 54941760, 57648124, 30118996, -904628, -13580150, -11682848, -68886440, 15736223, +-16117939, -128925792, -143614048, -99853696, -102725416, -32651952, 99187440, 64714420, 107572288, 121130424, +187188640, 122314760, 126241440, 79387640, -14328011, -103234904, -174217296, -203526160, -178469856, -141460656, +-105233680, -30314952, -12814572, -20751672, -2947421, 35744328, 61795452, 90229208, 76147088, 108240696, +102761928, 136818336, 122899952, 30600032, 79841296, -25115896, 15991237, 11803107, -3085397, -17910550, +-135643120, -158732320, -203862768, -235060336, -216877600, -121230280, -111196168, -89771792, -114315384, -127633008, +-34331820, 25818122, 69330976, 109303696, 156022208, 192342592, 243605184, 328796928, 314514016, 242500288, +191211408, 164025872, 80542984, 138817632, -62445068, -111236968, -275958624, -305650816, -389216928, -362261696, +-340122208, -306928576, -307014464, -165308992, -104239928, -2929705, 216135632, 169441824, 112524920, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, }, { { -6926172, -11555073, -3087008, 1925219, -3746822, 1478543, -8167954, 453119, -2434710, 2946885, -4432406, --3198677, -853088, 3000572, -613107, -497142, -1694365, -2312840, -5465883, -1149978, -4561792, --2443300, -3861176, 1732482, -814970, 300648, 1947768, 1156420, -2690797, 1243393, -944893, --223875, -1005022, -857383, -2404645, 176094, -4378719, 5513128, -1662689, -1314797, -850404, -348966, -37044, 655519, -5102421, 378494, 2211908, 176094, 957778, -111669, 1155346, -4165045, -1309965, 2567317, 2994666, -4387846, -1378685, -1044214, 4114042, -770410, 1263794, -4692252, 31675, -1297080, 1014149, 1377074, 1369558, 401579, 2407866, 30065, -733903, -1975685, -2028835, 630286, -108448, -3620121, 13587129, 1753957, -5662378, 2247879, -3496640, -1206349, -2197950, -1301375, -3015604, 2529199, 4195646, 1381906, 1464047, -7058779, 1660542, -361314, 2496987, 3016141, 1755031, 4423280, -656056, -2107218, 670015, 5242008, 258235, --3597572, -159451, 4499515, 2541547, 698469, 266825, 1439888, 115964, 567473, 1048509, -107374, -1299228, 64425, 258235, 1919850, -2276870, -5622112, 4548907, 4576288, 3996467, -3793530, 28991, 2186138, 3591130, -3304441, -596464, 164819, -4536023, 1330903, 542777, -4551592, 632971, 2670933, 252866, 5662915, 2908767, -513249, 3947612, 2572686, -1083942, --4116726, 1229971, 1442035, -1056025, 629213, -2418067, -350040, 2311229, 1873680, 1918777, -4709432, 11413876, -7476465, 2639258, 6470905, 1573569, 4592394, 5521181, -4842039, 1116155, --344671, 2192044, -6158983, -4904853, -812823, 4945655, 6727530, -2465311, -2064806, 3234110, --5237176, -7111929, -1191853, -8376260, 3027415, 2860448, 906775, -5183489, -5187247, 1954747, --2952790, 779000, 0, 5618354, 6034429, 5359046, -692564, 3773129, -5633924, 2586644, --3243774, -255014, 496069, 4599373, -4704063, -4287451, 235149, 6036577, 2670396, 2403571, --3397319, 2099165, 1705639, -1676111, -7225209, -1117765, -2286533, -3176128, -2697240, 3535295, --2874407, -885300, 1053341, 2273648, 5645198, -1879048, 173409, -3833795, -1646046, 1089848, --5275294, -32212, 1860795, 4240744, -886911, -2325725, -1169305, -4734665, -4351339, -7599945, --2158221, 890669, -2585034, -4025995, -2381023, -7583302, -4414690, 7270306, -652835, -3751117, -3702799, -6484864, -1745367, -7999914, -1928977, -6386617, -3485366, 6682969, 29528, -1820529, --8308614, -5356361, -2137283, -3804804, 1009854, -4636954, 77846, 2240362, 8111046, 3740380, -2832531, 3249680, 6503118, -6159520, -401579, -2141041, -4763656, 1402844, -1239098, -2157684, --4969277, 1978369, 4542465, 63351, -3872450, -2725694, 12145631, -413391, -3917010, -5471789, --7813620, -10461467, -1576253, -5675263, 864362, -1534914, 2450816, -23085, 1010391, -5145908, -344134, 157840, 5690832, 1415729, -4871567, -412854, -1774895, -2062121, -1470489, 1362578, -2801929, 2262374, -3474629, -17268990, 7063074, -2947421, 3074123, -7039452, -2752000, -5468030, --5017596, 537408, -1481764, -3348464, 9023189, 2499134, -686121, -5185100, -1569811, 2706366, --6040335, -3053722, -5749888, -3051038, 8612483, 1052804, 5779952, -309775, 59056, -1187559, -1717450, 1814087, -4393752, 308164, 1456531, 2798171, 9316858, -4549981, -5480915, -830539, -10290205, 3488050, 10943040, 1248762, 1095217, -1619203, 5452461, -624381, 7992934, -488016, --825171, -1096290, -3191698, 3690451, 1115618, -2476049, 2394444, 3327526, 5586142, -2807835, --171262, -612033, 4996658, -1614371, -703838, -1448478, -1120450, 1574106, -1457605, 971736, -983548, -787053, 1387274, -7691213, 979789, 5633924, 2081985, 7351911, 849867, 889058, -2204929, -3906810, -2015413, -255551, -8791261, -1617592, -89657, -4468377, -15423764, -3877819, --3457449, -6827388, -1462973, -1889786, 9388262, -3495030, 7062000, 3202435, 5050882, -9990094, --4565014, -10093173, -9364102, -190052, 1579474, 5584531, -2931852, -4515085, -2812130, -6885370, -1289027, 2868501, 3366718, 1979980, -2171106, 2317135, -4607963, 302258, -8199630, 2734284, --2209224, 926639, 1653562, 2837900, 3095598, -3257196, 5369, 7641284, -4300336, 3617973, -3867618, -426276, 2277943, 3681324, -1684164, 1355599, 3695283, 54224, 6592238, -3644817, --4704600, -2376191, 2108829, -147640, -8948564, -4621385, -9900973, -10807748, -1882269, 2820720, --8778913, 3847754, -1464584, -145492, -3031173, 3027952, -5224291, -524523, 4747013, -14382772, --854699, 4218732, 2621004, -7735773, -1073205, -5002563, 1085553, 1225676, 890132, -8453033, --11150809, -7740605, 1165547, -6241661, 6454799, 1835025, -10718091, 7413114, 6621229, 5057324, -4671851, -5541045, 8557722, 2004676, -138513, -3648575, 2855617, 4883915, -4799626, -7270843, -2533494, -2940442, -8669928, -1473711, -8357470, -3368328, 15079093, -4365835, -6784438, -8761733, -480499, 1015223, 6027987, 2021319, -5490042, 4647155, -592169, -4735202, -5681705, -6507949, -9379135, 3744138, 5957120, -4858682, -5949067, 2296734, 1638530, -6695317, -161598, -4293357, -6189048, -1635846, 737661, -7859790, 4938676, 3457986, -3939022, -3175055, -2318209, 7914014, -411243, 898185, -2101313, 5722507, -5661304, -7341173, -56371, 2162516, -1639604, -5806796, --8771934, -6955163, 7554848, 1138166, 9197672, 10964515, 10617159, 1865626, 14474577, 3711389, --1335198, 6878927, 5262946, 13447543, 2130841, 7863012, -10143639, 17382806, 12788265, 6381248, --4964446, -3801046, 6382859, 1735704, 4632659, -2226941, 7564511, -1886564, -1718524, 6937446, -5566815, -6431177, 4719632, -1492501, 7341173, 8102456, -15123654, -2509335, 9574556, 3148211, -5272609, 4343286, 9459665, -4209605, 3860639, 466541, -7750806, -3546569, -126702, 1912334, --11462194, -715112, 7347616, -5517423, 12275553, 9403831, -3695819, 90194, 2319819, 4755603, -7081328, -2658585, -2430952, 11623792, -2930242, -312459, 4744328, -26307, 6301791, 4745402, -1386738, 1766842, 30563524, -14653892, 3023657, 13133473, -327491, 1341640, 17048336, 18678812, -2943126, -430570, 4563940, 83215, 4833986, 6055367, -5683853, -1026497, 11294153, 10241886, --3532074, -7452305, -8241506, -8363912, -4278325, 8814347, -5221070, 4457103, 1188095, -9896678, -25770, -6205691, -117038, 4233227, 5559299, -13093208, -5927592, -10177999, -2769180, 18292266, -3211025, -368293, 2261300, -352724, 1583769, 6288906, 3707631, 9810779, 279173, 7677254, -4549981, -4652524, 4530117, -7732015, 1009854, -7736310, -8746701, 5017059, -9687836, 5866389, -670015, 6840809, 5054103, 5406827, -4741644, 8131447, -8603356, 1485522, -3431142, 274878, -12931073, 2257542, 7095286, 7820599, 95563, -282394, 6207302, -7898445, 6050535, -18308372, -2735894, 3687230, -12524662, 4799089, -613643, 11927124, -3831111, -7028177, 4810900, -16178068, --5823976, 12409771, 5270462, -8662949, -19620484, 7817378, -3106872, 3952444, -12651900, -16958678, --11405823, 13249437, 757525, 6942815, -1722819, -8239358, -11377368, 4363150, -3280281, -10446434, --11536819, -67646, -10315438, -8600135, -4488778, -2907693, -11114302, 5122286, 6999723, 8826158, --4922033, 7707856, -7231651, 12755516, -2755222, -1809255, 10344429, 4301410, -2746095, -8212515, --3657702, 8961986, 2257005, -8774081, 3544422, 9497246, 10165114, 3042448, -12448426, -15161771, --1181116, 1192390, 952946, -11475079, 3121368, 9247065, 3385508, -6484864, -17313550, 2690797, --7250979, -19492710, 1095754, -1900523, -9004936, 9513353, -22628572, 13070659, 9945534, 10982768, -1003412, 11636140, 612033, -8642548, -9790378, 651224, 9291625, -7581154, 1702418, -15549392, -9558987, 9997610, -5994701, -3831648, 1926830, 10995116, 8049306, -6889128, -5975374, 7243999, --10191957, 2521146, -13730474, -853625, -4391067, -18578954, -18764712, 2687039, 10100689, 4016331, --16064788, -9320616, 11519102, -14154065, -5907191, 9680319, -3260417, 12314208, -5052492, -10240276, -3115999, -14472966, 15152108, -2674154, 2396055, -8317741, -4032438, -1714766, -14892799, -10008884, -839666, -3519726, 1126892, -5910949, -15772731, 1664300, -13115756, 4413079, -3555159, 7872675, --15761993, 5496485, 2267743, -5934034, 11076184, -3132642, -8394514, -17030620, -2691334, 1117228, --13206488, 6073084, -10030896, -3287798, 6784975, -7310571, 1986422, 8201777, 12173011, -3629784, -965831, -4751845, -17255568, -3854196, -4064113, 7058242, -15246597, -267899, -9018358, 8958765, --10845866, -14265197, 8831527, 4140349, 5540508, 19258096, -3768834, -5677410, 4884989, -12516072, --15096273, 1126355, 17939004, 5604396, 9779641, -7421704, -9771587, -14747307, 2272038, 18887656, --9143449, 9921911, 1548336, 14756434, -23155780, -6993281, -1131187, 2803540, 11995307, 6366752, --17882096, -4381941, -8746701, -389768, -20511154, -2760590, -7940321, 1741609, -11234024, -252329, -1503775, -28228136, 2371896, -8447127, 826244, -10737955, -1570347, 7776575, 2650532, -3060164, --4591320, -14231374, 14310294, 15675557, 4002910, 4839892, -13715441, 21385180, 7199976, 10886131, -27707908, 10084583, 19139984, -17585206, 4740570, 19441706, -5145908, -6394670, 3257733, -11308112, -9552544, 2682744, -13101261, -17554068, -725850, 15600932, 244276, -868120, 10615549, -14532559, --3118146, -11922292, 7565048, -20563230, 1049046, -4180077, 8310225, -21531744, -14316200, -9285182, -7143605, 7226820, 5629092, -6879464, 6088116, -5095442, 7271917, -4177930, -1078574, -1393717, --5270462, 4221416, 10512469, 5783711, 10597295, -794032, -8508867, 1308354, -8448201, 24904368, --5364414, -24700356, -6686191, 6537477, 22335440, -21604222, -7798587, -1700807, 14754286, 491237, --29188060, -4192425, 15016279, 28228672, 2141578, 19342922, 29984240, -3030636, 10382010, 12576738, --2719788, 23295902, -2292439, 28082106, 5662378, -10225243, -24865714, 11411728, 13829258, -23790360, --23114440, 6081137, -5385889, 682363, -9179956, 21511880, -9658845, -6260452, 7536594, 5328981, -261456, -9943386, -7152731, -12090333, 4916664, -791348, -5710696, -1061394, 14450417, 21426518, --23169202, -1605244, -22582938, -2545305, -5717675, 22393422, -9337796, -9227200, -4184372, 13566191, -4763656, 3635153, 5980742, 5333813, -3814468, 115427, -2669859, 3503620, -2384244, 20927766, --5159867, 5438503, 15211700, -7889318, -16643535, 3638911, 6241661, -6141267, -6060199, -1561758, -4025995, 10572599, -14024142, 19458886, 29403882, 19250580, -7374996, -11686069, -25857850, -34372088, --11768210, -57445, -5218922, -1569811, -2758980, 8538932, 651761, -12726525, 8643085, -4927938, -908922, 14365055, 24283746, -11950747, 23438174, 10708427, 13462575, 20063402, 30829812, -11428371, -16096464, -31133144, -3573413, -13796509, -30596274, 12811351, 7612830, 9717364, 4427575, 12556337, -4032974, -21922586, 19019188, 33390150, -4654671, -5008469, 8395587, 3600793, -6614250, -29174640, -2711735, 419833, -2385318, 715649, 10329933, -20764020, 4862440, 6307160, -4036733, -11839077, --5626944, -13230110, 14106283, -29948270, -4082367, -19144816, 11125576, 4705674, 11282879, -3521336, -3308199, -7405598, 18855980, 5916855, 15546171, -13493714, 15297063, 10737, -14278082, 30593052, --4636954, 4070019, 20812338, -19241990, 23303418, 14076218, -17497696, 7989713, -6382322, 10512469, --24334210, 18671834, 3148748, 6972343, -1693291, 6632503, -19476066, 14012868, 23620710, -41516228, -4712653, 18628346, -10965052, -13261785, -220654, -12698071, -5632850, -33837364, -28792388, -3860102, --16410533, -19844896, -14165339, 9000104, -4872104, -9998147, -15972447, 15113453, 1294396, -24441586, --3570729, -47782, -11366094, -3591130, 10290205, 7235946, -1382443, 158914, 825707, -6098317, -5612986, 11513197, -3903052, -2685965, 18003966, -33007360, -4953708, 9338333, 35692252, -14562623, --8670465, -13123273, -17389248, 7820062, 37915436, 6959995, 23709830, 4794257, -3231963, -1948305, --2165201, -18041010, 4590783, 4085051, -14018773, 3256659, 29920890, -4736275, -8252780, 4903242, --9681930, -2394981, 26630944, 38114612, 11213086, 22907208, 27445378, -9315247, -9923522, 3119220, --7486665, 1677722, -24715390, 56371, -18659486, 6697465, 6497212, 12980465, 27364310, 30877056, --11955578, 69464120, -9202504, 1912334, -12500502, 8475044, -5126581, 8374113, 18035104, 5375689, --16291885, -8646843, -17042968, 64425, -11496017, -21081310, 3121368, 14269492, -2116882, 4411469, -6826851, 8523899, 88584, -5813775, -7878044, 4480725, 135828, -10310606, 4369593, 30102352, -21166672, 12324946, -25065430, 18484466, 14271639, -6260989, -7591892, -7325604, -10007274, -3952444, -8219494, -17861696, 1764695, 2660195, 10937134, 28719910, 5419175, 6254010, 1443109, -3015604, --5884105, 12657269, -7661685, 28972238, 8922258, -2423435, 12165495, 2704756, -19758460, -13579613, -15665893, 19010062, 6206228, -4494684, 11496554, 13531831, 17852568, 37344740, 2335389, -10946798, --21522082, -13383118, 6208912, 803159, 7063611, 11259794, -10695005, 49486612, -7305740, 2143189, -5528697, -3687766, -637803, 12445741, -9141838, -10824928, -5651103, 16048682, 14348412, -38160248, -7435662, 6604049, 15703474, -9706089, -15008763, -14294725, 11014444, 9971303, -15325517, -8338679, --6234145, 25810070, 13044353, 7322383, -4877472, -26547192, 7671349, 6805376, 13868986, -3203509, -7445863, -7295539, 2756832, -23055384, 9788230, 9554692, 532039, -5660767, -14304925, -28721520, -18904836, -12075301, 9861245, 9881109, 16785270, 2307471, -17217450, 29169808, 6084358, -28613608, --12830141, 16953310, 4528506, 22157200, 9986336, 3384971, -19740744, -10493142, 12048994, -36010616, -38907572, -28108414, 2481954, 21572010, -5029944, 43401720, 8135742, 5166846, -14798310, 47212964, -7035694, 13622563, -8250632, 15217069, 38650948, 11399917, 23492398, 30487826, -3499862, 35269196, --30929670, -12486007, -12946105, -11700565, 1918240, 3938485, -4553202, -14917495, -26877368, 21606370, -20383378, 7333657, 18213882, -35442608, -30851286, 7494181, 11679627, -17585744, -23644332, 11563663, --8869107, -33219424, -13450227, -8147553, 13270375, -30742840, 13713294, 8438000, 10444824, -15603616, --2838437, -15470472, -7823283, -40246528, -11273752, 16079284, -62151396, -21384642, -4310000, -3691525, -88047, -38537132, -10981158, -56860000, -6503118, 8374650, -17457968, -19457276, -8973797, 13963476, --7432978, -22089554, -24267102, -59310276, -22098680, 24131274, -26942866, -40755480, 30311732, -12563853, --44670344, 10502806, 37302864, -23283554, -10836739, 2204392, -29396904, 32452772, 48059612, 66020088, --9165997, -1157494, -24437290, -24850144, -43113420, 19512036, -6346888, 65737160, -12517682, -27492622, --37902012, 2850248, 13492640, -13956496, 13635984, 42991548, -15453292, -7183333, -28252294, -13179644, -30269318, 33449206, -31871878, -9267466, 18705120, -7081328, 9210557, -9914395, 43466680, 33484102, -72958072, 23133768, 33297270, -14165876, 24443732, 47925392, 17542258, -3377455, 13208098, -2010045, -33427730, 15946677, 47878148, 12337830, -43997644, 15563888, 20074140, 37279244, -18967112, -18979460, -24437290, 22921166, -8904004, 37136972, -10805064, 14448270, -39362300, 25224342, -7093676, 13052406, -17827336, 31810138, 32015224, -25022480, -21045340, -9910637, 38322384, 33093796, -10138270, -22541598, --34566972, -7676181, 29779692, 25742960, 21635360, -13237089, -50087908, 6408628, 83737904, 51058572, --8514236, -115997936, -14163728, -9398462, 12111271, -10867341, 5101348, 15001247, -1654099, 7957501, --22910966, 19094350, 22776748, 39276404, -23550916, -30913028, 37668472, 57490820, 16877610, -21814676, --29430726, -4398584, 11280732, 5662915, 11833709, 2800319, 15278809, 7468412, 39084204, -8838506, --45939508, -18709952, 19172198, 8434242, -13629005, -18888730, 6323266, 25898652, 44754096, 40543956, -2780991, 3372623, 19189378, -11854110, -38731480, 15728170, -22655952, 53879828, 59901908, 1788317, -19869592, 10990284, 15357729, -21671868, 785979, 56353192, -15525233, 3758097, -67561984, -6205154, -13125957, 20274930, 20974472, 18711562, -12288975, -7271380, 38828652, 52158084, -1570347, 2469606, -13111461, 4646081, -7066832, -54323284, -22900766, 41609108, 46235860, 43539696, 59810640, 9229885, --26749056, -81123344, -61284352, -12734578, 16325708, 49241264, 54520316, 24581708, 707596, -28367186, --23695872, -11941083, 16750372, 45530412, 26433914, -8060043, 1338419, -5785321, -26306138, -37554120, --29393682, 3294777, 43219184, 30411052, 65164856, 40149356, 41886668, 56749404, -17513266, -43679280, --46839840, -64775088, -76448808, -31821412, -9192304, 19408958, 41786812, 57178364, 56466472, 42364484, -28944322, 54318452, -11577621, -41014252, -1919850, -13878650, 15210090, 12781823, 69310032, 55484000, --22808424, 5228586, -16065862, -52650932, -13994077, 5593658, -28284508, 35767412, -17621714, 6088116, -3363496, -14231374, 37114424, 41347112, 41303628, 16900160, -21365852, -65760244, 28614682, 8571144, --113195472, -119373784, -124563176, -127673808, -170967616, -12829604, -43992276, -5721434, 22600654, 87104088, -97692792, 101225936, 138636720, 189878352, 181632560, 179155440, 144543904, 106608608, 78473344, 28202366, --78244104, -33931316, -44117368, -24447490, -95349888, -10570988, -36575940, -39815956, -78340200, -58018028, --60381872, -53123912, -57105884, -102511744, -91585880, -51014548, -47166792, -58877024, -85312544, -8396661, --74589624, -142775456, -123586608, -106487808, -56058452, -71206264, -11475616, -148966112, -66236984, -64295124, --30500710, -19963008, -78677896, 5680631, -79725864, -8126078, 10333691, 37372656, 67646, 37189584, -51870320, 86833504, 88219168, 126453504, 76083200, 198264288, 116953032, 228322608, 145057696, 222231264, -251893392, 303824928, 234061760, 232163376, 243998704, 160720368, 68846712, 44360568, 0, 0, -0, 0, 0, }, +11555073, -3087008, 1925219, -3746822, 1478543, -8167954, 453119, -2434710, 2946885, -4432406, +-3198677, -853088, 3000572, -613107, -497142, -1694365, -2312840, -5465883, -1149978, -4561792, +-2443300, -3861176, 1732482, -814970, 300648, 1947768, 1156420, -2690797, 1243393, -944893, +-223875, -1005022, -857383, -2404645, 176094, -4378719, 5513128, -1662689, -1314797, -850404, +348966, -37044, 655519, -5102421, 378494, 2211908, 176094, 957778, -111669, 1155346, +4165045, -1309965, 2567317, 2994666, -4387846, -1378685, -1044214, 4114042, -770410, 1263794, +4692252, 31675, -1297080, 1014149, 1377074, 1369558, 401579, 2407866, 30065, -733903, +1975685, -2028835, 630286, -108448, -3620121, 13587129, 1753957, -5662378, 2247879, -3496640, +1206349, -2197950, -1301375, -3015604, 2529199, 4195646, 1381906, 1464047, -7058779, 1660542, +361314, 2496987, 3016141, 1755031, 4423280, -656056, -2107218, 670015, 5242008, 258235, +-3597572, -159451, 4499515, 2541547, 698469, 266825, 1439888, 115964, 567473, 1048509, +107374, -1299228, 64425, 258235, 1919850, -2276870, -5622112, 4548907, 4576288, 3996467, +3793530, 28991, 2186138, 3591130, -3304441, -596464, 164819, -4536023, 1330903, 542777, +4551592, 632971, 2670933, 252866, 5662915, 2908767, -513249, 3947612, 2572686, -1083942, +-4116726, 1229971, 1442035, -1056025, 629213, -2418067, -350040, 2311229, 1873680, 1918777, +4709432, 11413876, -7476465, 2639258, 6470905, 1573569, 4592394, 5521181, -4842039, 1116155, +-344671, 2192044, -6158983, -4904853, -812823, 4945655, 6727530, -2465311, -2064806, 3234110, +-5237176, -7111929, -1191853, -8376260, 3027415, 2860448, 906775, -5183489, -5187247, 1954747, +-2952790, 779000, 0, 5618354, 6034429, 5359046, -692564, 3773129, -5633924, 2586644, +-3243774, -255014, 496069, 4599373, -4704063, -4287451, 235149, 6036577, 2670396, 2403571, +-3397319, 2099165, 1705639, -1676111, -7225209, -1117765, -2286533, -3176128, -2697240, 3535295, +-2874407, -885300, 1053341, 2273648, 5645198, -1879048, 173409, -3833795, -1646046, 1089848, +-5275294, -32212, 1860795, 4240744, -886911, -2325725, -1169305, -4734665, -4351339, -7599945, +-2158221, 890669, -2585034, -4025995, -2381023, -7583302, -4414690, 7270306, -652835, -3751117, +3702799, -6484864, -1745367, -7999914, -1928977, -6386617, -3485366, 6682969, 29528, -1820529, +-8308614, -5356361, -2137283, -3804804, 1009854, -4636954, 77846, 2240362, 8111046, 3740380, +2832531, 3249680, 6503118, -6159520, -401579, -2141041, -4763656, 1402844, -1239098, -2157684, +-4969277, 1978369, 4542465, 63351, -3872450, -2725694, 12145631, -413391, -3917010, -5471789, +-7813620, -10461467, -1576253, -5675263, 864362, -1534914, 2450816, -23085, 1010391, -5145908, +344134, 157840, 5690832, 1415729, -4871567, -412854, -1774895, -2062121, -1470489, 1362578, +2801929, 2262374, -3474629, -17268990, 7063074, -2947421, 3074123, -7039452, -2752000, -5468030, +-5017596, 537408, -1481764, -3348464, 9023189, 2499134, -686121, -5185100, -1569811, 2706366, +-6040335, -3053722, -5749888, -3051038, 8612483, 1052804, 5779952, -309775, 59056, -1187559, +1717450, 1814087, -4393752, 308164, 1456531, 2798171, 9316858, -4549981, -5480915, -830539, +10290205, 3488050, 10943040, 1248762, 1095217, -1619203, 5452461, -624381, 7992934, -488016, +-825171, -1096290, -3191698, 3690451, 1115618, -2476049, 2394444, 3327526, 5586142, -2807835, +-171262, -612033, 4996658, -1614371, -703838, -1448478, -1120450, 1574106, -1457605, 971736, +983548, -787053, 1387274, -7691213, 979789, 5633924, 2081985, 7351911, 849867, 889058, +2204929, -3906810, -2015413, -255551, -8791261, -1617592, -89657, -4468377, -15423764, -3877819, +-3457449, -6827388, -1462973, -1889786, 9388262, -3495030, 7062000, 3202435, 5050882, -9990094, +-4565014, -10093173, -9364102, -190052, 1579474, 5584531, -2931852, -4515085, -2812130, -6885370, +1289027, 2868501, 3366718, 1979980, -2171106, 2317135, -4607963, 302258, -8199630, 2734284, +-2209224, 926639, 1653562, 2837900, 3095598, -3257196, 5369, 7641284, -4300336, 3617973, +3867618, -426276, 2277943, 3681324, -1684164, 1355599, 3695283, 54224, 6592238, -3644817, +-4704600, -2376191, 2108829, -147640, -8948564, -4621385, -9900973, -10807748, -1882269, 2820720, +-8778913, 3847754, -1464584, -145492, -3031173, 3027952, -5224291, -524523, 4747013, -14382772, +-854699, 4218732, 2621004, -7735773, -1073205, -5002563, 1085553, 1225676, 890132, -8453033, +-11150809, -7740605, 1165547, -6241661, 6454799, 1835025, -10718091, 7413114, 6621229, 5057324, +4671851, -5541045, 8557722, 2004676, -138513, -3648575, 2855617, 4883915, -4799626, -7270843, +2533494, -2940442, -8669928, -1473711, -8357470, -3368328, 15079093, -4365835, -6784438, -8761733, +480499, 1015223, 6027987, 2021319, -5490042, 4647155, -592169, -4735202, -5681705, -6507949, +9379135, 3744138, 5957120, -4858682, -5949067, 2296734, 1638530, -6695317, -161598, -4293357, +6189048, -1635846, 737661, -7859790, 4938676, 3457986, -3939022, -3175055, -2318209, 7914014, +411243, 898185, -2101313, 5722507, -5661304, -7341173, -56371, 2162516, -1639604, -5806796, +-8771934, -6955163, 7554848, 1138166, 9197672, 10964515, 10617159, 1865626, 14474577, 3711389, +-1335198, 6878927, 5262946, 13447543, 2130841, 7863012, -10143639, 17382806, 12788265, 6381248, +-4964446, -3801046, 6382859, 1735704, 4632659, -2226941, 7564511, -1886564, -1718524, 6937446, +5566815, -6431177, 4719632, -1492501, 7341173, 8102456, -15123654, -2509335, 9574556, 3148211, +5272609, 4343286, 9459665, -4209605, 3860639, 466541, -7750806, -3546569, -126702, 1912334, +-11462194, -715112, 7347616, -5517423, 12275553, 9403831, -3695819, 90194, 2319819, 4755603, +7081328, -2658585, -2430952, 11623792, -2930242, -312459, 4744328, -26307, 6301791, 4745402, +1386738, 1766842, 30563524, -14653892, 3023657, 13133473, -327491, 1341640, 17048336, 18678812, +2943126, -430570, 4563940, 83215, 4833986, 6055367, -5683853, -1026497, 11294153, 10241886, +-3532074, -7452305, -8241506, -8363912, -4278325, 8814347, -5221070, 4457103, 1188095, -9896678, +25770, -6205691, -117038, 4233227, 5559299, -13093208, -5927592, -10177999, -2769180, 18292266, +3211025, -368293, 2261300, -352724, 1583769, 6288906, 3707631, 9810779, 279173, 7677254, +4549981, -4652524, 4530117, -7732015, 1009854, -7736310, -8746701, 5017059, -9687836, 5866389, +670015, 6840809, 5054103, 5406827, -4741644, 8131447, -8603356, 1485522, -3431142, 274878, +12931073, 2257542, 7095286, 7820599, 95563, -282394, 6207302, -7898445, 6050535, -18308372, +2735894, 3687230, -12524662, 4799089, -613643, 11927124, -3831111, -7028177, 4810900, -16178068, +-5823976, 12409771, 5270462, -8662949, -19620484, 7817378, -3106872, 3952444, -12651900, -16958678, +-11405823, 13249437, 757525, 6942815, -1722819, -8239358, -11377368, 4363150, -3280281, -10446434, +-11536819, -67646, -10315438, -8600135, -4488778, -2907693, -11114302, 5122286, 6999723, 8826158, +-4922033, 7707856, -7231651, 12755516, -2755222, -1809255, 10344429, 4301410, -2746095, -8212515, +-3657702, 8961986, 2257005, -8774081, 3544422, 9497246, 10165114, 3042448, -12448426, -15161771, +-1181116, 1192390, 952946, -11475079, 3121368, 9247065, 3385508, -6484864, -17313550, 2690797, +-7250979, -19492710, 1095754, -1900523, -9004936, 9513353, -22628572, 13070659, 9945534, 10982768, +1003412, 11636140, 612033, -8642548, -9790378, 651224, 9291625, -7581154, 1702418, -15549392, +9558987, 9997610, -5994701, -3831648, 1926830, 10995116, 8049306, -6889128, -5975374, 7243999, +-10191957, 2521146, -13730474, -853625, -4391067, -18578954, -18764712, 2687039, 10100689, 4016331, +-16064788, -9320616, 11519102, -14154065, -5907191, 9680319, -3260417, 12314208, -5052492, -10240276, +3115999, -14472966, 15152108, -2674154, 2396055, -8317741, -4032438, -1714766, -14892799, -10008884, +839666, -3519726, 1126892, -5910949, -15772731, 1664300, -13115756, 4413079, -3555159, 7872675, +-15761993, 5496485, 2267743, -5934034, 11076184, -3132642, -8394514, -17030620, -2691334, 1117228, +-13206488, 6073084, -10030896, -3287798, 6784975, -7310571, 1986422, 8201777, 12173011, -3629784, +965831, -4751845, -17255568, -3854196, -4064113, 7058242, -15246597, -267899, -9018358, 8958765, +-10845866, -14265197, 8831527, 4140349, 5540508, 19258096, -3768834, -5677410, 4884989, -12516072, +-15096273, 1126355, 17939004, 5604396, 9779641, -7421704, -9771587, -14747307, 2272038, 18887656, +-9143449, 9921911, 1548336, 14756434, -23155780, -6993281, -1131187, 2803540, 11995307, 6366752, +-17882096, -4381941, -8746701, -389768, -20511154, -2760590, -7940321, 1741609, -11234024, -252329, +1503775, -28228136, 2371896, -8447127, 826244, -10737955, -1570347, 7776575, 2650532, -3060164, +-4591320, -14231374, 14310294, 15675557, 4002910, 4839892, -13715441, 21385180, 7199976, 10886131, +27707908, 10084583, 19139984, -17585206, 4740570, 19441706, -5145908, -6394670, 3257733, -11308112, +9552544, 2682744, -13101261, -17554068, -725850, 15600932, 244276, -868120, 10615549, -14532559, +-3118146, -11922292, 7565048, -20563230, 1049046, -4180077, 8310225, -21531744, -14316200, -9285182, +7143605, 7226820, 5629092, -6879464, 6088116, -5095442, 7271917, -4177930, -1078574, -1393717, +-5270462, 4221416, 10512469, 5783711, 10597295, -794032, -8508867, 1308354, -8448201, 24904368, +-5364414, -24700356, -6686191, 6537477, 22335440, -21604222, -7798587, -1700807, 14754286, 491237, +-29188060, -4192425, 15016279, 28228672, 2141578, 19342922, 29984240, -3030636, 10382010, 12576738, +-2719788, 23295902, -2292439, 28082106, 5662378, -10225243, -24865714, 11411728, 13829258, -23790360, +-23114440, 6081137, -5385889, 682363, -9179956, 21511880, -9658845, -6260452, 7536594, 5328981, +261456, -9943386, -7152731, -12090333, 4916664, -791348, -5710696, -1061394, 14450417, 21426518, +-23169202, -1605244, -22582938, -2545305, -5717675, 22393422, -9337796, -9227200, -4184372, 13566191, +4763656, 3635153, 5980742, 5333813, -3814468, 115427, -2669859, 3503620, -2384244, 20927766, +-5159867, 5438503, 15211700, -7889318, -16643535, 3638911, 6241661, -6141267, -6060199, -1561758, +4025995, 10572599, -14024142, 19458886, 29403882, 19250580, -7374996, -11686069, -25857850, -34372088, +-11768210, -57445, -5218922, -1569811, -2758980, 8538932, 651761, -12726525, 8643085, -4927938, +908922, 14365055, 24283746, -11950747, 23438174, 10708427, 13462575, 20063402, 30829812, -11428371, +16096464, -31133144, -3573413, -13796509, -30596274, 12811351, 7612830, 9717364, 4427575, 12556337, +4032974, -21922586, 19019188, 33390150, -4654671, -5008469, 8395587, 3600793, -6614250, -29174640, +2711735, 419833, -2385318, 715649, 10329933, -20764020, 4862440, 6307160, -4036733, -11839077, +-5626944, -13230110, 14106283, -29948270, -4082367, -19144816, 11125576, 4705674, 11282879, -3521336, +3308199, -7405598, 18855980, 5916855, 15546171, -13493714, 15297063, 10737, -14278082, 30593052, +-4636954, 4070019, 20812338, -19241990, 23303418, 14076218, -17497696, 7989713, -6382322, 10512469, +-24334210, 18671834, 3148748, 6972343, -1693291, 6632503, -19476066, 14012868, 23620710, -41516228, +4712653, 18628346, -10965052, -13261785, -220654, -12698071, -5632850, -33837364, -28792388, -3860102, +-16410533, -19844896, -14165339, 9000104, -4872104, -9998147, -15972447, 15113453, 1294396, -24441586, +-3570729, -47782, -11366094, -3591130, 10290205, 7235946, -1382443, 158914, 825707, -6098317, +5612986, 11513197, -3903052, -2685965, 18003966, -33007360, -4953708, 9338333, 35692252, -14562623, +-8670465, -13123273, -17389248, 7820062, 37915436, 6959995, 23709830, 4794257, -3231963, -1948305, +-2165201, -18041010, 4590783, 4085051, -14018773, 3256659, 29920890, -4736275, -8252780, 4903242, +-9681930, -2394981, 26630944, 38114612, 11213086, 22907208, 27445378, -9315247, -9923522, 3119220, +-7486665, 1677722, -24715390, 56371, -18659486, 6697465, 6497212, 12980465, 27364310, 30877056, +-11955578, 69464120, -9202504, 1912334, -12500502, 8475044, -5126581, 8374113, 18035104, 5375689, +-16291885, -8646843, -17042968, 64425, -11496017, -21081310, 3121368, 14269492, -2116882, 4411469, +6826851, 8523899, 88584, -5813775, -7878044, 4480725, 135828, -10310606, 4369593, 30102352, +21166672, 12324946, -25065430, 18484466, 14271639, -6260989, -7591892, -7325604, -10007274, -3952444, +8219494, -17861696, 1764695, 2660195, 10937134, 28719910, 5419175, 6254010, 1443109, -3015604, +-5884105, 12657269, -7661685, 28972238, 8922258, -2423435, 12165495, 2704756, -19758460, -13579613, +15665893, 19010062, 6206228, -4494684, 11496554, 13531831, 17852568, 37344740, 2335389, -10946798, +-21522082, -13383118, 6208912, 803159, 7063611, 11259794, -10695005, 49486612, -7305740, 2143189, +5528697, -3687766, -637803, 12445741, -9141838, -10824928, -5651103, 16048682, 14348412, -38160248, +7435662, 6604049, 15703474, -9706089, -15008763, -14294725, 11014444, 9971303, -15325517, -8338679, +-6234145, 25810070, 13044353, 7322383, -4877472, -26547192, 7671349, 6805376, 13868986, -3203509, +7445863, -7295539, 2756832, -23055384, 9788230, 9554692, 532039, -5660767, -14304925, -28721520, +18904836, -12075301, 9861245, 9881109, 16785270, 2307471, -17217450, 29169808, 6084358, -28613608, +-12830141, 16953310, 4528506, 22157200, 9986336, 3384971, -19740744, -10493142, 12048994, -36010616, +38907572, -28108414, 2481954, 21572010, -5029944, 43401720, 8135742, 5166846, -14798310, 47212964, +7035694, 13622563, -8250632, 15217069, 38650948, 11399917, 23492398, 30487826, -3499862, 35269196, +-30929670, -12486007, -12946105, -11700565, 1918240, 3938485, -4553202, -14917495, -26877368, 21606370, +20383378, 7333657, 18213882, -35442608, -30851286, 7494181, 11679627, -17585744, -23644332, 11563663, +-8869107, -33219424, -13450227, -8147553, 13270375, -30742840, 13713294, 8438000, 10444824, -15603616, +-2838437, -15470472, -7823283, -40246528, -11273752, 16079284, -62151396, -21384642, -4310000, -3691525, +88047, -38537132, -10981158, -56860000, -6503118, 8374650, -17457968, -19457276, -8973797, 13963476, +-7432978, -22089554, -24267102, -59310276, -22098680, 24131274, -26942866, -40755480, 30311732, -12563853, +-44670344, 10502806, 37302864, -23283554, -10836739, 2204392, -29396904, 32452772, 48059612, 66020088, +-9165997, -1157494, -24437290, -24850144, -43113420, 19512036, -6346888, 65737160, -12517682, -27492622, +-37902012, 2850248, 13492640, -13956496, 13635984, 42991548, -15453292, -7183333, -28252294, -13179644, +30269318, 33449206, -31871878, -9267466, 18705120, -7081328, 9210557, -9914395, 43466680, 33484102, +72958072, 23133768, 33297270, -14165876, 24443732, 47925392, 17542258, -3377455, 13208098, -2010045, +33427730, 15946677, 47878148, 12337830, -43997644, 15563888, 20074140, 37279244, -18967112, -18979460, +24437290, 22921166, -8904004, 37136972, -10805064, 14448270, -39362300, 25224342, -7093676, 13052406, +17827336, 31810138, 32015224, -25022480, -21045340, -9910637, 38322384, 33093796, -10138270, -22541598, +-34566972, -7676181, 29779692, 25742960, 21635360, -13237089, -50087908, 6408628, 83737904, 51058572, +-8514236, -115997936, -14163728, -9398462, 12111271, -10867341, 5101348, 15001247, -1654099, 7957501, +-22910966, 19094350, 22776748, 39276404, -23550916, -30913028, 37668472, 57490820, 16877610, -21814676, +-29430726, -4398584, 11280732, 5662915, 11833709, 2800319, 15278809, 7468412, 39084204, -8838506, +-45939508, -18709952, 19172198, 8434242, -13629005, -18888730, 6323266, 25898652, 44754096, 40543956, +2780991, 3372623, 19189378, -11854110, -38731480, 15728170, -22655952, 53879828, 59901908, 1788317, +19869592, 10990284, 15357729, -21671868, 785979, 56353192, -15525233, 3758097, -67561984, -6205154, +13125957, 20274930, 20974472, 18711562, -12288975, -7271380, 38828652, 52158084, -1570347, 2469606, +13111461, 4646081, -7066832, -54323284, -22900766, 41609108, 46235860, 43539696, 59810640, 9229885, +-26749056, -81123344, -61284352, -12734578, 16325708, 49241264, 54520316, 24581708, 707596, -28367186, +-23695872, -11941083, 16750372, 45530412, 26433914, -8060043, 1338419, -5785321, -26306138, -37554120, +-29393682, 3294777, 43219184, 30411052, 65164856, 40149356, 41886668, 56749404, -17513266, -43679280, +-46839840, -64775088, -76448808, -31821412, -9192304, 19408958, 41786812, 57178364, 56466472, 42364484, +28944322, 54318452, -11577621, -41014252, -1919850, -13878650, 15210090, 12781823, 69310032, 55484000, +-22808424, 5228586, -16065862, -52650932, -13994077, 5593658, -28284508, 35767412, -17621714, 6088116, +3363496, -14231374, 37114424, 41347112, 41303628, 16900160, -21365852, -65760244, 28614682, 8571144, +-113195472, -119373784, -124563176, -127673808, -170967616, -12829604, -43992276, -5721434, 22600654, 87104088, +97692792, 101225936, 138636720, 189878352, 181632560, 179155440, 144543904, 106608608, 78473344, 28202366, +-78244104, -33931316, -44117368, -24447490, -95349888, -10570988, -36575940, -39815956, -78340200, -58018028, +-60381872, -53123912, -57105884, -102511744, -91585880, -51014548, -47166792, -58877024, -85312544, -8396661, +-74589624, -142775456, -123586608, -106487808, -56058452, -71206264, -11475616, -148966112, -66236984, -64295124, +-30500710, -19963008, -78677896, 5680631, -79725864, -8126078, 10333691, 37372656, 67646, 37189584, +51870320, 86833504, 88219168, 126453504, 76083200, 198264288, 116953032, 228322608, 145057696, 222231264, +251893392, 303824928, 234061760, 232163376, 243998704, 160720368, 68846712, 44360568, 0, 0, +0, 0, 0, }, { -9471477, -10372883, -6034966, 430034, -5037460, 2355253, 1140314, 1713155, -5577015, -3837553, 120796, --3586298, -407485, 2319282, -438087, -1240709, -635118, 2598455, -1077500, -1749662, 7144141, --17180, -5595269, -2598455, 2393371, 570157, 2228014, -4943508, 539555, -5198521, 784905, -4361540, -545461, 2752537, 2852932, 2631204, -2928094, -1270774, -1711008, 943819, -739808, -1838246, -4839892, -2312840, -2051921, 247497, -1221381, 2700998, 3520800, 5583995, -2215130, --3022046, -1438814, 1378685, 3658775, 4175782, 3382824, -759136, -4900021, 6252936, -4102768, -2231236, -4314832, 3594888, -2860448, 2152852, -2602213, 195421, -2763812, -1953136, -203474, --1003412, 2152316, 1381369, -365072, -4466766, 17122960, 2335925, -5506148, 2735357, 3099893, -1123671, -6992207, 3316252, 5121749, -5334350, -1525250, -6555731, -1358283, -2741800, -2328946, --879931, 471910, -156229, 782221, 2458332, -2844879, 1393180, -6682969, 2410014, 4292820, -958315, -1666984, -5441724, 3724811, -2353105, 5952288, 5036386, -83215, -2246805, 4884452, -5602248, 4593468, 4568772, 1264331, -3388729, 1232656, 4325032, -1631551, -3542811, 3403762, -5202279, -2086280, 2749316, -5668283, -413927, -4941360, 3569655, -6628745, -1770063, -1064615, -2414309, 3623342, 2494302, 41339, -3527779, 699006, -4905390, -3024731, 1028645, -311385, --2887292, 1996086, 1851131, 828929, 3351148, -2340220, 1610076, -3209951, -1157494, -812286, -2650532, 9663676, -9846749, 316754, 120796, -2534568, -2990908, -3186329, 963683, -5575405, --5494337, 712965, 2595771, -259309, 3086471, 2385318, -3040300, 1175747, -10788421, -2686502, --2445447, -2558190, -3430068, -3794067, -9510131, -7414724, 968515, 2157684, -548682, 5066988, -4060892, 1665911, -1861332, -1080721, 4765803, -1912871, 560493, -758599, -5077188, 1629403, --1721208, -3494493, -1359357, 4066260, 9933186, -3857418, 1082869, 2368138, -1872069, 3080029, -1373316, -3539053, 2000918, -8290898, -3841848, 36507, 3337190, 5174362, -3238942, -1542967, --394063, -11989401, 1998234, 6114960, 286689, 841814, 3320547, -1995012, 5202279, 7055021, --984084, 1974074, 4162360, 4021163, 666257, 220117, -2148558, -2725157, -2707440, -8527121, -1809792, 164819, -8244727, 1097901, 4418448, 6544457, 1592896, -4964446, 11217918, -1676111, --2355790, 5174362, -3414499, -3369939, 428960, -4305705, 4939213, 4884989, -2158221, -7802345, --3882651, 3621194, -5023501, 10608569, 9201967, -7628399, -9214852, 135828, 1596654, -8862665, --672699, 3379603, 2325725, -4450123, -2572149, 9733470, -1159641, 6626061, -783295, -2452426, --2416456, -5360119, 788127, -974421, 5262409, -4837207, 1136019, -1468342, 889058, -2978023, --465467, 4233764, 3483755, -5980742, 8713952, 400506, -166967, -492311, -944893, 2018098, --1364726, -8319352, -1285806, -4628364, 6702834, 2379412, -38655, 7882339, -4948876, 4973572, -5217312, -346282, -4622996, -20413442, 4439923, 887985, 14200772, -972273, 5581310, -7939784, -1457605, -5995775, -1603633, -3032247, -1133335, 2461553, -1779190, 2288144, 4629975, 3526705, -13446469, 9259413, -6442988, 2958159, -571768, 2348273, 1370095, -1919850, -13837311, 3267933, --949188, -303869, 4896263, -979789, -4058207, -2805151, -916976, -4387846, -2551211, -11025181, --2838974, 120259, -4136054, -846109, 4191351, 6277632, -2404108, 7796440, -6286759, 1147830, -2374043, 880468, -2207076, -4351339, 2588792, -1213865, 1432909, -3273302, -4843113, 667867, -2144263, -4629975, 3804804, -3212099, 9669045, 10626286, -3802120, 3786014, 3573413, -703838, --2011655, -1583769, -13839458, 5378373, 4612258, 51540, -3034395, -5609764, -315680, -2077154, --6645925, -4148402, -6430640, 6775848, 3930969, -390305, 7793218, -3900367, 7006166, -7511898, --7227893, 3792456, -11636140, -3984656, 3135863, 7380902, 9545028, -1438814, 7161321, -41339, -6824166, 2672544, 1232119, -890669, 508954, 6869800, -3034395, -488016, 1348083, 792958, --6430103, -599148, -3432216, 13789529, -6361921, -6350646, -1476395, 6621229, 6550899, 5755256, -7504382, -1047972, 1463510, -1405528, -3569655, 3036542, -236760, -458488, -4108673, 10887742, -6644315, -3040837, 2102923, 3397319, -5546414, 1447941, 4196183, -787590, 8033737, -2959233, --994285, -8409009, -3242164, -7104950, 351114, 10455561, -3994857, 3155727, 1742683, 635655, --2789045, -661425, 71941, -2224256, 4872104, -4828617, -2319282, -580894, -2021856, -18861886, -14011257, 1658394, -6828461, -16625282, -1496796, 640487, -9783936, -680215, 4809290, 4176856, -532039, -2648384, 3835943, 12268574, 12366285, -4986457, -5580773, -12985834, 2799782, -2128156, -13009456, -4974646, -136365, -2743410, 4985384, -1160715, -13037373, 4619774, -477815, -7510824, -146566, 1544578, -933082, -1009854, -5281736, -7210713, 4720169, 1479616, 6129992, -4854924, -10225780, 5162551, -1953673, -8556649, -1644436, 3635153, 10002442, 3481608, -5451924, -2107755, -4718559, 3420942, -2735894, -918049, 4968204, 4466766, 5238250, 10315975, 11052025, 5900212, -5948530, 7311645, -3795677, 1613834, -7092602, 7911867, 1270237, 4387846, -5040681, -7237557, -1937030, -9428527, -3642132, -3699041, 7433515, -6904160, -455803, 12776454, 7836705, 10794327, -2014877, -11913166, -3959423, 12545063, -3680787, -8027294, -8360691, -8233453, -8707509, 4714264, -4790499, 3058554, 2797634, 2891050, 12069395, -1544578, 5211406, -10452877, -11758010, 7797513, --464393, -6435472, 410169, -16355772, -5375152, -5537287, 1955284, -613643, -1554778, -11515344, --7562364, 1236951, 7875360, 12845173, -5159330, -5084705, 6810208, -8872866, -689342, -477278, -2903398, 5614059, 4537633, 8911520, -4855998, 12932683, 6037114, -13989245, 6913287, -7769059, --9359807, -7701950, -11315628, 10183904, 2279017, -11919608, 1241246, 2584497, 957778, 1979443, --2380486, 8539469, -5126044, 6634114, -10721312, 8112120, -5717675, -4497905, 368293, 3984656, --1597728, 6534793, 27433030, -23126252, 11931956, 12407087, -9924596, -1105954, 16757889, 6604049, -10956462, 3856881, -2643016, 24764244, -100932, -3643743, 838056, 913754, 12353400, 18832894, -7686381, 708133, 1236951, 3534758, 7064685, 746787, 4166118, -11747809, 6846715, 10641318, --1161252, 4836133, 902480, 2659122, -7202660, -5488968, 1371705, 564251, 12030203, 6332393, -5525476, -3828427, -4813048, -4892505, 7343321, 10152766, 1039382, -2121714, 19123878, 10276246, -13115756, -5652714, -12539694, -1682554, -13161390, -8420820, -3232500, -4987531, 248571, 11562589, --2268280, 1380295, -7561827, -8271570, 11739219, 504659, 6143414, 6368900, -4248260, 11311870, -3994320, 2143189, -2075543, -5461588, 9593883, -947577, -12224014, 9831717, 9619653, -18932752, -1954210, 5766531, -9439264, 7224672, -16064788, 3194919, 4536023, -2503966, -6501507, -8463233, --9583146, -16292958, 1802276, 17505750, -6120329, 8167954, 4644471, 12848932, 6947110, -5615133, --11635603, 5340255, -3026341, -4691715, -12015708, -2411624, -1686312, -5409512, -5167383, -3424163, --8417062, -11709155, 12797392, -2004139, -7450695, 9287867, 3564823, -9588514, 1354525, -1489817, -5781026, -12547747, 3364033, 3087008, -17128866, 4788889, 5747740, -9883793, 2695092, -391379, --2619930, 5247377, 781147, -2381023, 977642, 3064996, 11862700, 7926899, 12125230, 6781754, -4516695, -4581120, 17969606, -6116034, -8703751, 17813914, 1670205, 9894531, 2935073, -5953362, --17766132, -19246822, -3759170, -1775432, -6325413, -6454799, -32050120, 14019847, 25552372, 731755, --16228534, 5767604, -3891240, -2193118, 3277060, 1434519, 5771899, -9222369, -155693, 22726282, -17267916, 14879914, -18605262, -1925219, 3222299, 7974681, -9489193, -10620380, -3481608, 1807108, -7220914, 2898566, -23615878, -26815628, 6872485, -2101313, 13326210, 13502303, -10620380, 10940355, -8750459, 11756399, -1985349, -9105868, -9201967, 4900021, -9685151, -4653060, -1114544, -1754494, -6695317, 15191836, 8212515, -5982890, -5050882, -9688909, -3237332, -769336, 3342022, -3308199, --4087198, 6582038, 3966939, -14163728, -1351841, -1156420, 13877039, -9320079, -9860171, -18238578, --6794102, 935229, -118648, 6518687, -3046743, 41876, -8546448, -13144747, -11042361, -12420509, --6737193, 2051921, -20866024, 4255776, 3914863, 3409667, 5444945, 16080894, 1655710, 14041322, --1490891, 18096308, 9101573, 14251775, 8737037, 4570382, -6483790, -81604, -3967476, 10015864, -3021510, 8898635, -7635915, -695248, 14778446, -17244294, -9841918, 14730664, -23510114, -9673877, -1914482, -3723200, -11599096, 24678346, -4159139, 17337172, 6688875, -13453985, -2141041, -4462471, --17323750, -21566104, 18008262, 853088, -6583111, 5515275, 275952, -1882806, 6476274, 3735548, --2436320, -7073811, 1447404, 18289582, 14241575, -10547366, 4503810, 2356863, 13197898, -4617627, -8819715, -17738214, -5027259, 14914274, 4038343, -2590939, 15302432, -3027415, 10527502, -19304268, --25350508, -6533182, -194347, -14851460, 18173080, 16472273, 18356690, -5099200, -7515656, -1816234, -21561272, 15500537, 24295556, -21627308, -16276852, -37030672, 15905875, -4136054, -31674846, -6146635, -2948495, 4648229, -11875585, 12867185, 10814728, 1216013, -212601, 2005750, -5316633, -11016054, -2345052, -6265821, -10396505, -136902, 23881092, 742493, -3744138, -19176492, 7975755, 15138686, --7956427, -23139674, -4329327, 7792145, 2624225, -4918812, 4888747, 1636919, 8157754, -2354179, -13548474, 20957292, 7744900, -13972602, 15603616, 7087233, -18086644, -19049254, 20425790, 9948218, --8306467, -9333501, -739808, -16918950, 12028593, 16170015, -722628, 820876, 3722663, -2193655, -17374754, 5848672, 4164508, -7527467, 2353105, 5829881, 21362094, -5472862, 7707319, -17241610, --20244328, 17037062, -3706020, -1870995, 270046, 16214575, -2189360, -4095788, -5692443, -7866770, --25631828, -2669859, -16967268, -33857764, -34838092, -15426986, -26729192, -12482786, -4786741, 4074313, -14078366, 15693810, 1123671, -9468255, 17041356, -9580461, 8131447, -33472290, -3757560, -23170812, --15635828, 14596446, 10194105, 9757092, 2957622, 21297132, -2720862, -2047626, -16314433, -6163815, --3672197, -11453604, -11353746, -27666568, -11077794, -3677029, -4811974, -17394618, 14303852, 5164162, -8359617, -8069170, -3268470, -41665476, -12230456, -12023224, 9054865, 20229296, -13343927, -2744484, --24262270, -2497524, 11864847, -4699768, -8462159, 4556961, 17194364, 29209536, 5898064, 98784, --2091649, -8942659, -12481712, 7112466, -8427800, 26281442, 4771709, 10705206, 54830088, -12165495, --10501195, -15246597, -21267068, -27149026, 16419660, 26682484, -14769856, 1464584, 6438156, -8300025, --1582696, -18742164, 161598, -10193568, 28794534, 717796, -4804995, 23412940, -5258651, 7337952, --25538412, 14254460, 4486094, 18354542, -7771744, 13873818, 23538032, 25627532, 14335527, 23189602, -11844446, -2761127, 22112102, -9725417, -14009110, -3773666, 9035537, 15584289, -35154844, -1587527, --22658100, 19010062, 8444979, 391916, 6442451, 26297548, 1249299, 23565412, 9830106, 35252556, -3192235, -3059091, 15130096, 5838471, -17506824, 4630512, -2049236, -22670448, 16470126, -13336410, --23041962, -46112916, 3531000, -4947803, 27466852, -14552960, 36769216, 13020193, -854699, -4847408, -14140643, 15991774, -27359478, -10781979, -20351166, 7710540, -9468255, 21002926, 5703717, 7008313, -6076842, 19133006, -10639171, -12115029, -11815455, 18393198, 10268193, 23555212, 7595113, 70351568, --19131932, 1509681, 1966558, 33316062, 14811732, 15995532, -19618874, 10334228, -6790880, 1627256, --8200703, 3151969, 24881820, -5151814, 9022116, 45923400, 15794742, -19455128, -22141630, 3662533, -31083216, 16156056, 7364259, -10522670, 26801670, 5036386, -1831804, -26675506, 10307385, -3628174, -13791677, -24212342, -13188771, 1961726, -4268661, 3904662, -21103858, -213138, -11984569, 7129646, -22843858, 16967806, 7706245, -31413390, 2661269, 3559991, -26247618, -25296820, -14437533, -13728326, --11341398, 22963580, 7962870, -494458, 17714592, 23710366, 9337796, 20447802, 3744675, 13418015, -93765040, -20885352, 18491444, 9992778, -12009265, 2960843, -55941948, 1926293, 16113644, 39275864, --14397267, 1842004, -21961778, -15088757, 8378408, 18818936, -17774722, 27072252, 12687333, -28976534, -22077742, -9992778, -13296145, 1621887, -16618839, 7470022, -6105833, 27639726, -11768210, 1955284, -15944529, -44387412, 9185861, 17928268, -11975443, 14937896, -26361972, 31995896, 5473399, 8301635, --52007224, 52458732, 23338852, 19595788, 3380676, -27413702, 30692374, 1831267, -11789148, 53874996, --7708930, -18200998, -9329206, 9973451, 16780438, 17761300, 5924908, -4319127, -56777320, -2410551, -17037598, 5255966, 23948200, -26449482, 34261492, 7956427, 13094282, -26610544, -6822556, 10168872, -43056512, -11625403, 11809549, -23586350, 28082106, 20379620, 26586384, -3121904, 12918188, 10908143, --30015916, -23292682, 18027052, 21156472, 6707129, -2270964, -43421584, 44522168, -6564858, -7441031, --13902272, -2049773, -33802468, -64847028, 25747792, 22254910, -608275, -11043972, -25198036, -1586990, --6207302, -11617350, 28973850, -57370564, -23527830, -28740848, -7211250, -42776800, -1935957, -3573950, -659278, -4253628, -7022809, 10984379, 1870458, -16705275, -4041564, 3334505, -25528212, -10974178, --5839008, 6101001, 23894514, -6800007, 45499808, -18102750, -709207, 22659710, -16620450, 16430397, -5090610, -24522116, -41407244, -5601174, 14094472, 45736032, 20397336, -25046638, -9968619, -82390896, --26383984, 131533, 22060026, 55037320, 1126892, -43994424, 6830609, 36099736, -5956046, 6472516, -34455300, 41089952, 77020576, -67956048, -9062918, 24137716, 27579596, -9376450, -19865834, -21920440, --25816512, 10727755, -26642220, 5619428, -11205570, -63369560, 13478681, -11314554, 17800492, -17901424, --18636936, 805843, -27059368, 3977140, -27304718, -1001264, -5471789, -10813654, 11850352, -20160576, --26683022, -23895050, -31202938, -5395553, -4281009, 33253784, 6419903, -24728274, -37419904, 4570919, --1837172, 8504035, -8191040, 20221242, -25066502, -9563282, -34781720, -21503828, -10883447, 1181653, --15454366, 35143568, -13552232, -29711510, 7924752, 36629628, 24938728, 11150809, -27190364, -16251083, --4187056, 33589864, 61527552, 143345, 10696079, -11255499, -63657856, -12562779, 3656628, 24509768, -50652160, -27820650, -38046432, 22620520, 7486665, -10519449, -1057099, -17432736, 9092446, -49641768, --9497783, 6085432, 8599061, -27817966, 31307628, -46654084, -64932928, -48282412, 37720012, 11806328, --66121020, -11429445, -45447196, 20867098, 4359929, -91208464, 6803765, -27835146, -58712204, -45823544, --67041756, 42214696, -19956566, -52966072, -23201414, 17627620, -30953292, -27098022, -20521890, -12380780, --22647362, -23095112, -42230804, -30943092, -58233852, -33106144, -29007672, -9585830, -26679800, -5319317, --11711302, -360777, 3740380, 8374113, 18220326, -15857019, 15541876, 2234994, 32307280, 13870597, -21010980, 19852412, -53500260, -13927505, 46983720, -6907381, -25191594, -30379914, -20435454, 18791556, -74991736, -3806952, 2046015, -47298864, -45957760, -9249749, 13865228, 44384728, 1042066, 40696964, -18932216, -45959372, 90575488, 3372086, 72052368, 2108292, -11125039, 38044820, -41412612, -59501404, --32273994, -134386848, -74958992, -23296440, 70308616, -23045720, -56486872, 66381940, 63308892, -39460548, --51641612, 268435, 56703768, -5566278, -3271155, -17005924, 49470508, -4789963, -13324062, -440234, -13503914, 26254062, 446677, -18191334, -22027276, 31520228, 1904281, -12094628, -33107218, 19687056, -9753871, -2536178, -26322244, 9352291, 10444287, 10528039, -16999480, -8368744, 2094333, 26695370, --8274255, 10624675, -38021196, -8664023, -958315, 26166552, -52723408, -7386807, 3833795, 39088496, --19137838, 7792682, -27750858, 5730560, 9447317, -15900506, -15409269, 206158, 4347581, 13808320, --13572634, 3398393, -47938816, 27632208, -9758166, 45973328, -28936268, 22245784, -20556250, 23156854, -1203128, 16719234, 8655970, -30039538, 34978752, 11025181, 18788334, -33425582, 7111392, -6153078, -2836289, -19522236, -43176768, -57362508, 41519448, 27471684, -32780802, -46661060, -22940494, 21315386, -11115912, 28415504, 30642982, 5828808, -15698105, -4741107, 10618233, -10812580, -1024887, 6151467, -1593433, 17019344, 11905649, 4996121, -15671262, -813896, -9758166, 9762998, -16405701, -14340896, -11669963, -4011500, -6757594, -6766721, -11440719, -15773267, 1054951, 12380780, 11425150, 9397388, --3804267, -13079786, -11223823, -8072391, 13689671, 18461380, -8865886, -13455059, -5786932, 15242302, -7945153, 20494510, -14835891, -5972152, 8143258, -4310537, 600222, -2629594, 7320772, 4026532, -5907191, 829466, -14161581, 5397164, 2579128, -976031, 10899016, -6138582, -2786897, 1418413, --1966558, 943282, -3963718, 18085034, 4921496, -1845225, 18312130, 16797618, 20016696, -47216188, --124995896, -45676440, 22888418, 65663608, 138170176, 92634392, 24114094, 35385160, -18035104, -55633784, --92765928, -80581104, -64062660, -18117246, 2836826, 45294188, 49767396, 105676056, 51412908, 34162168, --2306934, -21926882, -50308564, -25785910, -40627168, -46699180, -28766080, -23808614, -1519882, 13699335, -39643084, 24889336, 28523952, 26255136, 26216480, 39634496, 3614215, 27663884, -4788889, -11509975, --32737852, -18971408, -48945984, -71640592, -63031868, 1467268, -10607495, 20594368, 34093988, 19435264, -52497924, 46621868, 66292820, 38622492, 44930728, 3205656, 2160906, -34361884, -57990112, -66472136, --81380504, -52074868, -66624068, -4115116, -628139, 33633352, 33014340, 82209432, 62353260, 92045448, -35477504, 45042932, 16193100, 3987877, -55673512, -70020312, -29356102, -19980188, 0, 0, -0, 0, 0, }, +10372883, -6034966, 430034, -5037460, 2355253, 1140314, 1713155, -5577015, -3837553, 120796, +-3586298, -407485, 2319282, -438087, -1240709, -635118, 2598455, -1077500, -1749662, 7144141, +-17180, -5595269, -2598455, 2393371, 570157, 2228014, -4943508, 539555, -5198521, 784905, +4361540, -545461, 2752537, 2852932, 2631204, -2928094, -1270774, -1711008, 943819, -739808, +1838246, -4839892, -2312840, -2051921, 247497, -1221381, 2700998, 3520800, 5583995, -2215130, +-3022046, -1438814, 1378685, 3658775, 4175782, 3382824, -759136, -4900021, 6252936, -4102768, +2231236, -4314832, 3594888, -2860448, 2152852, -2602213, 195421, -2763812, -1953136, -203474, +-1003412, 2152316, 1381369, -365072, -4466766, 17122960, 2335925, -5506148, 2735357, 3099893, +1123671, -6992207, 3316252, 5121749, -5334350, -1525250, -6555731, -1358283, -2741800, -2328946, +-879931, 471910, -156229, 782221, 2458332, -2844879, 1393180, -6682969, 2410014, 4292820, +958315, -1666984, -5441724, 3724811, -2353105, 5952288, 5036386, -83215, -2246805, 4884452, +5602248, 4593468, 4568772, 1264331, -3388729, 1232656, 4325032, -1631551, -3542811, 3403762, +5202279, -2086280, 2749316, -5668283, -413927, -4941360, 3569655, -6628745, -1770063, -1064615, +2414309, 3623342, 2494302, 41339, -3527779, 699006, -4905390, -3024731, 1028645, -311385, +-2887292, 1996086, 1851131, 828929, 3351148, -2340220, 1610076, -3209951, -1157494, -812286, +2650532, 9663676, -9846749, 316754, 120796, -2534568, -2990908, -3186329, 963683, -5575405, +-5494337, 712965, 2595771, -259309, 3086471, 2385318, -3040300, 1175747, -10788421, -2686502, +-2445447, -2558190, -3430068, -3794067, -9510131, -7414724, 968515, 2157684, -548682, 5066988, +4060892, 1665911, -1861332, -1080721, 4765803, -1912871, 560493, -758599, -5077188, 1629403, +-1721208, -3494493, -1359357, 4066260, 9933186, -3857418, 1082869, 2368138, -1872069, 3080029, +1373316, -3539053, 2000918, -8290898, -3841848, 36507, 3337190, 5174362, -3238942, -1542967, +-394063, -11989401, 1998234, 6114960, 286689, 841814, 3320547, -1995012, 5202279, 7055021, +-984084, 1974074, 4162360, 4021163, 666257, 220117, -2148558, -2725157, -2707440, -8527121, +1809792, 164819, -8244727, 1097901, 4418448, 6544457, 1592896, -4964446, 11217918, -1676111, +-2355790, 5174362, -3414499, -3369939, 428960, -4305705, 4939213, 4884989, -2158221, -7802345, +-3882651, 3621194, -5023501, 10608569, 9201967, -7628399, -9214852, 135828, 1596654, -8862665, +-672699, 3379603, 2325725, -4450123, -2572149, 9733470, -1159641, 6626061, -783295, -2452426, +-2416456, -5360119, 788127, -974421, 5262409, -4837207, 1136019, -1468342, 889058, -2978023, +-465467, 4233764, 3483755, -5980742, 8713952, 400506, -166967, -492311, -944893, 2018098, +-1364726, -8319352, -1285806, -4628364, 6702834, 2379412, -38655, 7882339, -4948876, 4973572, +5217312, -346282, -4622996, -20413442, 4439923, 887985, 14200772, -972273, 5581310, -7939784, +1457605, -5995775, -1603633, -3032247, -1133335, 2461553, -1779190, 2288144, 4629975, 3526705, +13446469, 9259413, -6442988, 2958159, -571768, 2348273, 1370095, -1919850, -13837311, 3267933, +-949188, -303869, 4896263, -979789, -4058207, -2805151, -916976, -4387846, -2551211, -11025181, +-2838974, 120259, -4136054, -846109, 4191351, 6277632, -2404108, 7796440, -6286759, 1147830, +2374043, 880468, -2207076, -4351339, 2588792, -1213865, 1432909, -3273302, -4843113, 667867, +2144263, -4629975, 3804804, -3212099, 9669045, 10626286, -3802120, 3786014, 3573413, -703838, +-2011655, -1583769, -13839458, 5378373, 4612258, 51540, -3034395, -5609764, -315680, -2077154, +-6645925, -4148402, -6430640, 6775848, 3930969, -390305, 7793218, -3900367, 7006166, -7511898, +-7227893, 3792456, -11636140, -3984656, 3135863, 7380902, 9545028, -1438814, 7161321, -41339, +6824166, 2672544, 1232119, -890669, 508954, 6869800, -3034395, -488016, 1348083, 792958, +-6430103, -599148, -3432216, 13789529, -6361921, -6350646, -1476395, 6621229, 6550899, 5755256, +7504382, -1047972, 1463510, -1405528, -3569655, 3036542, -236760, -458488, -4108673, 10887742, +6644315, -3040837, 2102923, 3397319, -5546414, 1447941, 4196183, -787590, 8033737, -2959233, +-994285, -8409009, -3242164, -7104950, 351114, 10455561, -3994857, 3155727, 1742683, 635655, +-2789045, -661425, 71941, -2224256, 4872104, -4828617, -2319282, -580894, -2021856, -18861886, +14011257, 1658394, -6828461, -16625282, -1496796, 640487, -9783936, -680215, 4809290, 4176856, +532039, -2648384, 3835943, 12268574, 12366285, -4986457, -5580773, -12985834, 2799782, -2128156, +13009456, -4974646, -136365, -2743410, 4985384, -1160715, -13037373, 4619774, -477815, -7510824, +146566, 1544578, -933082, -1009854, -5281736, -7210713, 4720169, 1479616, 6129992, -4854924, +10225780, 5162551, -1953673, -8556649, -1644436, 3635153, 10002442, 3481608, -5451924, -2107755, +4718559, 3420942, -2735894, -918049, 4968204, 4466766, 5238250, 10315975, 11052025, 5900212, +5948530, 7311645, -3795677, 1613834, -7092602, 7911867, 1270237, 4387846, -5040681, -7237557, +1937030, -9428527, -3642132, -3699041, 7433515, -6904160, -455803, 12776454, 7836705, 10794327, +2014877, -11913166, -3959423, 12545063, -3680787, -8027294, -8360691, -8233453, -8707509, 4714264, +4790499, 3058554, 2797634, 2891050, 12069395, -1544578, 5211406, -10452877, -11758010, 7797513, +-464393, -6435472, 410169, -16355772, -5375152, -5537287, 1955284, -613643, -1554778, -11515344, +-7562364, 1236951, 7875360, 12845173, -5159330, -5084705, 6810208, -8872866, -689342, -477278, +2903398, 5614059, 4537633, 8911520, -4855998, 12932683, 6037114, -13989245, 6913287, -7769059, +-9359807, -7701950, -11315628, 10183904, 2279017, -11919608, 1241246, 2584497, 957778, 1979443, +-2380486, 8539469, -5126044, 6634114, -10721312, 8112120, -5717675, -4497905, 368293, 3984656, +-1597728, 6534793, 27433030, -23126252, 11931956, 12407087, -9924596, -1105954, 16757889, 6604049, +10956462, 3856881, -2643016, 24764244, -100932, -3643743, 838056, 913754, 12353400, 18832894, +7686381, 708133, 1236951, 3534758, 7064685, 746787, 4166118, -11747809, 6846715, 10641318, +-1161252, 4836133, 902480, 2659122, -7202660, -5488968, 1371705, 564251, 12030203, 6332393, +5525476, -3828427, -4813048, -4892505, 7343321, 10152766, 1039382, -2121714, 19123878, 10276246, +13115756, -5652714, -12539694, -1682554, -13161390, -8420820, -3232500, -4987531, 248571, 11562589, +-2268280, 1380295, -7561827, -8271570, 11739219, 504659, 6143414, 6368900, -4248260, 11311870, +3994320, 2143189, -2075543, -5461588, 9593883, -947577, -12224014, 9831717, 9619653, -18932752, +1954210, 5766531, -9439264, 7224672, -16064788, 3194919, 4536023, -2503966, -6501507, -8463233, +-9583146, -16292958, 1802276, 17505750, -6120329, 8167954, 4644471, 12848932, 6947110, -5615133, +-11635603, 5340255, -3026341, -4691715, -12015708, -2411624, -1686312, -5409512, -5167383, -3424163, +-8417062, -11709155, 12797392, -2004139, -7450695, 9287867, 3564823, -9588514, 1354525, -1489817, +5781026, -12547747, 3364033, 3087008, -17128866, 4788889, 5747740, -9883793, 2695092, -391379, +-2619930, 5247377, 781147, -2381023, 977642, 3064996, 11862700, 7926899, 12125230, 6781754, +4516695, -4581120, 17969606, -6116034, -8703751, 17813914, 1670205, 9894531, 2935073, -5953362, +-17766132, -19246822, -3759170, -1775432, -6325413, -6454799, -32050120, 14019847, 25552372, 731755, +-16228534, 5767604, -3891240, -2193118, 3277060, 1434519, 5771899, -9222369, -155693, 22726282, +17267916, 14879914, -18605262, -1925219, 3222299, 7974681, -9489193, -10620380, -3481608, 1807108, +7220914, 2898566, -23615878, -26815628, 6872485, -2101313, 13326210, 13502303, -10620380, 10940355, +8750459, 11756399, -1985349, -9105868, -9201967, 4900021, -9685151, -4653060, -1114544, -1754494, +6695317, 15191836, 8212515, -5982890, -5050882, -9688909, -3237332, -769336, 3342022, -3308199, +-4087198, 6582038, 3966939, -14163728, -1351841, -1156420, 13877039, -9320079, -9860171, -18238578, +-6794102, 935229, -118648, 6518687, -3046743, 41876, -8546448, -13144747, -11042361, -12420509, +-6737193, 2051921, -20866024, 4255776, 3914863, 3409667, 5444945, 16080894, 1655710, 14041322, +-1490891, 18096308, 9101573, 14251775, 8737037, 4570382, -6483790, -81604, -3967476, 10015864, +3021510, 8898635, -7635915, -695248, 14778446, -17244294, -9841918, 14730664, -23510114, -9673877, +1914482, -3723200, -11599096, 24678346, -4159139, 17337172, 6688875, -13453985, -2141041, -4462471, +-17323750, -21566104, 18008262, 853088, -6583111, 5515275, 275952, -1882806, 6476274, 3735548, +-2436320, -7073811, 1447404, 18289582, 14241575, -10547366, 4503810, 2356863, 13197898, -4617627, +8819715, -17738214, -5027259, 14914274, 4038343, -2590939, 15302432, -3027415, 10527502, -19304268, +-25350508, -6533182, -194347, -14851460, 18173080, 16472273, 18356690, -5099200, -7515656, -1816234, +21561272, 15500537, 24295556, -21627308, -16276852, -37030672, 15905875, -4136054, -31674846, -6146635, +2948495, 4648229, -11875585, 12867185, 10814728, 1216013, -212601, 2005750, -5316633, -11016054, +2345052, -6265821, -10396505, -136902, 23881092, 742493, -3744138, -19176492, 7975755, 15138686, +-7956427, -23139674, -4329327, 7792145, 2624225, -4918812, 4888747, 1636919, 8157754, -2354179, +13548474, 20957292, 7744900, -13972602, 15603616, 7087233, -18086644, -19049254, 20425790, 9948218, +-8306467, -9333501, -739808, -16918950, 12028593, 16170015, -722628, 820876, 3722663, -2193655, +17374754, 5848672, 4164508, -7527467, 2353105, 5829881, 21362094, -5472862, 7707319, -17241610, +-20244328, 17037062, -3706020, -1870995, 270046, 16214575, -2189360, -4095788, -5692443, -7866770, +-25631828, -2669859, -16967268, -33857764, -34838092, -15426986, -26729192, -12482786, -4786741, 4074313, +14078366, 15693810, 1123671, -9468255, 17041356, -9580461, 8131447, -33472290, -3757560, -23170812, +-15635828, 14596446, 10194105, 9757092, 2957622, 21297132, -2720862, -2047626, -16314433, -6163815, +-3672197, -11453604, -11353746, -27666568, -11077794, -3677029, -4811974, -17394618, 14303852, 5164162, +8359617, -8069170, -3268470, -41665476, -12230456, -12023224, 9054865, 20229296, -13343927, -2744484, +-24262270, -2497524, 11864847, -4699768, -8462159, 4556961, 17194364, 29209536, 5898064, 98784, +-2091649, -8942659, -12481712, 7112466, -8427800, 26281442, 4771709, 10705206, 54830088, -12165495, +-10501195, -15246597, -21267068, -27149026, 16419660, 26682484, -14769856, 1464584, 6438156, -8300025, +-1582696, -18742164, 161598, -10193568, 28794534, 717796, -4804995, 23412940, -5258651, 7337952, +-25538412, 14254460, 4486094, 18354542, -7771744, 13873818, 23538032, 25627532, 14335527, 23189602, +11844446, -2761127, 22112102, -9725417, -14009110, -3773666, 9035537, 15584289, -35154844, -1587527, +-22658100, 19010062, 8444979, 391916, 6442451, 26297548, 1249299, 23565412, 9830106, 35252556, +3192235, -3059091, 15130096, 5838471, -17506824, 4630512, -2049236, -22670448, 16470126, -13336410, +-23041962, -46112916, 3531000, -4947803, 27466852, -14552960, 36769216, 13020193, -854699, -4847408, +14140643, 15991774, -27359478, -10781979, -20351166, 7710540, -9468255, 21002926, 5703717, 7008313, +6076842, 19133006, -10639171, -12115029, -11815455, 18393198, 10268193, 23555212, 7595113, 70351568, +-19131932, 1509681, 1966558, 33316062, 14811732, 15995532, -19618874, 10334228, -6790880, 1627256, +-8200703, 3151969, 24881820, -5151814, 9022116, 45923400, 15794742, -19455128, -22141630, 3662533, +31083216, 16156056, 7364259, -10522670, 26801670, 5036386, -1831804, -26675506, 10307385, -3628174, +13791677, -24212342, -13188771, 1961726, -4268661, 3904662, -21103858, -213138, -11984569, 7129646, +22843858, 16967806, 7706245, -31413390, 2661269, 3559991, -26247618, -25296820, -14437533, -13728326, +-11341398, 22963580, 7962870, -494458, 17714592, 23710366, 9337796, 20447802, 3744675, 13418015, +93765040, -20885352, 18491444, 9992778, -12009265, 2960843, -55941948, 1926293, 16113644, 39275864, +-14397267, 1842004, -21961778, -15088757, 8378408, 18818936, -17774722, 27072252, 12687333, -28976534, +22077742, -9992778, -13296145, 1621887, -16618839, 7470022, -6105833, 27639726, -11768210, 1955284, +15944529, -44387412, 9185861, 17928268, -11975443, 14937896, -26361972, 31995896, 5473399, 8301635, +-52007224, 52458732, 23338852, 19595788, 3380676, -27413702, 30692374, 1831267, -11789148, 53874996, +-7708930, -18200998, -9329206, 9973451, 16780438, 17761300, 5924908, -4319127, -56777320, -2410551, +17037598, 5255966, 23948200, -26449482, 34261492, 7956427, 13094282, -26610544, -6822556, 10168872, +43056512, -11625403, 11809549, -23586350, 28082106, 20379620, 26586384, -3121904, 12918188, 10908143, +-30015916, -23292682, 18027052, 21156472, 6707129, -2270964, -43421584, 44522168, -6564858, -7441031, +-13902272, -2049773, -33802468, -64847028, 25747792, 22254910, -608275, -11043972, -25198036, -1586990, +-6207302, -11617350, 28973850, -57370564, -23527830, -28740848, -7211250, -42776800, -1935957, -3573950, +659278, -4253628, -7022809, 10984379, 1870458, -16705275, -4041564, 3334505, -25528212, -10974178, +-5839008, 6101001, 23894514, -6800007, 45499808, -18102750, -709207, 22659710, -16620450, 16430397, +5090610, -24522116, -41407244, -5601174, 14094472, 45736032, 20397336, -25046638, -9968619, -82390896, +-26383984, 131533, 22060026, 55037320, 1126892, -43994424, 6830609, 36099736, -5956046, 6472516, +34455300, 41089952, 77020576, -67956048, -9062918, 24137716, 27579596, -9376450, -19865834, -21920440, +-25816512, 10727755, -26642220, 5619428, -11205570, -63369560, 13478681, -11314554, 17800492, -17901424, +-18636936, 805843, -27059368, 3977140, -27304718, -1001264, -5471789, -10813654, 11850352, -20160576, +-26683022, -23895050, -31202938, -5395553, -4281009, 33253784, 6419903, -24728274, -37419904, 4570919, +-1837172, 8504035, -8191040, 20221242, -25066502, -9563282, -34781720, -21503828, -10883447, 1181653, +-15454366, 35143568, -13552232, -29711510, 7924752, 36629628, 24938728, 11150809, -27190364, -16251083, +-4187056, 33589864, 61527552, 143345, 10696079, -11255499, -63657856, -12562779, 3656628, 24509768, +50652160, -27820650, -38046432, 22620520, 7486665, -10519449, -1057099, -17432736, 9092446, -49641768, +-9497783, 6085432, 8599061, -27817966, 31307628, -46654084, -64932928, -48282412, 37720012, 11806328, +-66121020, -11429445, -45447196, 20867098, 4359929, -91208464, 6803765, -27835146, -58712204, -45823544, +-67041756, 42214696, -19956566, -52966072, -23201414, 17627620, -30953292, -27098022, -20521890, -12380780, +-22647362, -23095112, -42230804, -30943092, -58233852, -33106144, -29007672, -9585830, -26679800, -5319317, +-11711302, -360777, 3740380, 8374113, 18220326, -15857019, 15541876, 2234994, 32307280, 13870597, +21010980, 19852412, -53500260, -13927505, 46983720, -6907381, -25191594, -30379914, -20435454, 18791556, +74991736, -3806952, 2046015, -47298864, -45957760, -9249749, 13865228, 44384728, 1042066, 40696964, +18932216, -45959372, 90575488, 3372086, 72052368, 2108292, -11125039, 38044820, -41412612, -59501404, +-32273994, -134386848, -74958992, -23296440, 70308616, -23045720, -56486872, 66381940, 63308892, -39460548, +-51641612, 268435, 56703768, -5566278, -3271155, -17005924, 49470508, -4789963, -13324062, -440234, +13503914, 26254062, 446677, -18191334, -22027276, 31520228, 1904281, -12094628, -33107218, 19687056, +9753871, -2536178, -26322244, 9352291, 10444287, 10528039, -16999480, -8368744, 2094333, 26695370, +-8274255, 10624675, -38021196, -8664023, -958315, 26166552, -52723408, -7386807, 3833795, 39088496, +-19137838, 7792682, -27750858, 5730560, 9447317, -15900506, -15409269, 206158, 4347581, 13808320, +-13572634, 3398393, -47938816, 27632208, -9758166, 45973328, -28936268, 22245784, -20556250, 23156854, +1203128, 16719234, 8655970, -30039538, 34978752, 11025181, 18788334, -33425582, 7111392, -6153078, +2836289, -19522236, -43176768, -57362508, 41519448, 27471684, -32780802, -46661060, -22940494, 21315386, +11115912, 28415504, 30642982, 5828808, -15698105, -4741107, 10618233, -10812580, -1024887, 6151467, +1593433, 17019344, 11905649, 4996121, -15671262, -813896, -9758166, 9762998, -16405701, -14340896, +11669963, -4011500, -6757594, -6766721, -11440719, -15773267, 1054951, 12380780, 11425150, 9397388, +-3804267, -13079786, -11223823, -8072391, 13689671, 18461380, -8865886, -13455059, -5786932, 15242302, +7945153, 20494510, -14835891, -5972152, 8143258, -4310537, 600222, -2629594, 7320772, 4026532, +5907191, 829466, -14161581, 5397164, 2579128, -976031, 10899016, -6138582, -2786897, 1418413, +-1966558, 943282, -3963718, 18085034, 4921496, -1845225, 18312130, 16797618, 20016696, -47216188, +-124995896, -45676440, 22888418, 65663608, 138170176, 92634392, 24114094, 35385160, -18035104, -55633784, +-92765928, -80581104, -64062660, -18117246, 2836826, 45294188, 49767396, 105676056, 51412908, 34162168, +-2306934, -21926882, -50308564, -25785910, -40627168, -46699180, -28766080, -23808614, -1519882, 13699335, +39643084, 24889336, 28523952, 26255136, 26216480, 39634496, 3614215, 27663884, -4788889, -11509975, +-32737852, -18971408, -48945984, -71640592, -63031868, 1467268, -10607495, 20594368, 34093988, 19435264, +52497924, 46621868, 66292820, 38622492, 44930728, 3205656, 2160906, -34361884, -57990112, -66472136, +-81380504, -52074868, -66624068, -4115116, -628139, 33633352, 33014340, 82209432, 62353260, 92045448, +35477504, 45042932, 16193100, 3987877, -55673512, -70020312, -29356102, -19980188, 0, 0, +0, 0, 0, }, }, { { -6253473, -6058052, -4815732, 7134478, -1403381, -4489315, 1406602, 3631395, -1666447, 892816, 3344706, --4984847, -3398930, -931471, -3041374, 9645960, -3819837, 9485435, 2748242, 3217468, -1248225, --2049236, -3347927, -4402342, 122943, 4133369, 345208, 535260, -2499671, 2736968, 3787088, -324270, -2057826, -4986457, 3352759, -925565, 3842922, -1635846, 697395, 1720134, -2787434, -17717, -4901095, 6687264, -70867, 988916, -612570, -5857262, -1512365, -1727114, 472446, -944893, 3424163, 1539209, -2306934, -3564823, 1728188, -2137283, -1110786, 4239133, -2357937, -3000572, -4167729, 2270427, -4828080, 2415919, -3235184, -1720671, 4893579, 2246268, 2660195, --718870, 383326, 1079111, 1206349, 1720134, 7618198, 784905, -2103460, -2191507, 1294933, --3721589, -94489, -7224672, 5126044, 6533182, 4533875, 6432251, -7781944, 613107, 1721745, --2769180, -2174327, -1894081, -9114457, -1529008, 5332202, -9278740, -7597261, 4389457, 3915937, --5956583, -2143189, 3953518, 439160, 4808216, 1985349, 5011690, -3211562, 974421, 615791, --1305670, 2246268, 1855426, 3307125, 1454383, -1586990, 360777, 3696356, -984621, -1821603, --595927, -4686346, -10063645, 5905043, 2976949, -3280281, 4502737, -1899449, 564251, -285615, -2143726, -2808372, -602369, 5827734, -5524939, -2416993, 2072322, 802622, -737124, -466004, -2774012, 93416, 2500208, -4239670, 4297652, 1845762, -4963372, 3878356, 714575, 1176284, --136902, -1998770, 12009802, -6819871, 2157684, -7545721, 975494, 1828046, -7596187, -9637370, -2486249, -10462003, 2386391, -2694555, -652298, -6400575, -857383, -7194070, -3639985, 72478, --7573101, 8180839, 2954938, -12658879, 1300301, -658204, -2201171, -5395553, 2836289, 6630356, -241592, -444529, 6302328, -3592740, 202400, -2272038, 4230006, -4759361, 1547262, 5825050, --4884989, 5100811, 1935420, 5514738, -302258, 1288490, -648540, -2260764, 7357279, -8842264, -2258616, -3882114, -1487132, -1102733, -2996814, -2332167, -6827925, -4388920, -821949, 4689568, --79457, 1814087, 6806450, -61203, -5215701, -619549, 636192, 1868848, -2240362, 143881, --4937065, 278636, -1564442, 2021319, 3697430, 4476967, 2585034, -1975685, -1489280, -3120831, --10141492, -360777, -6209986, -2125472, -1218160, -7198365, -1199370, -1861868, 3205119, 7871602, -7912404, 730144, -3733937, 3024194, -8149701, -1366873, -3270618, 2519535, -12022687, 3924526, -1750199, -662499, -3632469, -5307506, -2563559, -4417374, -3843996, 1976222, -1027034, -4738960, --1553704, 692027, 7456063, -517007, -8000451, 390842, 3118146, -311385, -2668785, 433792, -2706903, -8650064, -870268, -3874597, 5724655, 3412352, 806380, -7999377, 692027, 2816962, -4605279, 4295504, -5298916, -2588255, 77846, -1771137, -1746441, 4013647, -2706366, 2407329, -607201, -3411815, -802085, -4620311, 5405753, 1949378, -5335423, -3754875, 1003412, 2841121, --4059281, -5290863, -563714, 503048, -2933463, -16972638, 5300527, 4741107, 8003135, -2236067, -4961761, -14634564, -4138201, 4445291, 364535, -7279970, -2054068, -2479807, -12911209, -5236102, -1092532, -656056, -9274445, 5602785, 7838852, -8321499, 6055904, -10871636, -3910031, -1005559, -3492882, -82141, -4632122, 2957622, 1231582, -725313, 4581657, -2331630, -3381213, -950798, --2050847, -3169149, 4480725, -3608846, 1061931, 3626563, -1018981, -2753611, -5618354, -551366, --4102768, -1047435, -4730907, -1064078, 9495636, 351114, 5638755, -5308580, 4669703, -1369558, --8372502, -4511327, 4085588, -2663954, -4446902, 3216931, -5173288, 4321274, 690416, -1104880, -4830228, 5142687, 1678795, -4689568, -6277632, 173946, 7397545, 2254858, 785442, -3532074, -840740, -9888088, -9447854, -6535330, 173409, -2315524, 2614561, -3970697, -893353, -241592, --3460133, -1829119, 1249299, -3388192, 9105868, -7424388, 3719442, -2572686, -1612760, -5509906, --2216740, -1486596, 6366752, -5829345, -292595, 580357, -8120173, -5214627, -5856725, -4991826, --9276056, -3690451, 2013266, 4809827, 2586644, -7455527, -10348724, -2874407, -712965, -5581310, --135291, -4051765, -5899675, -12394739, -6850473, -8928700, 3639985, -2908230, 2752000, -5470178, --12355010, -6793028, -516470, -3104188, -4794257, -2487323, -5550709, 5230734, -579284, 2711735, -3560528, 390842, -1353989, -4714801, -1007707, 4308926, -2088965, -4575751, -6476811, 7614440, --8260833, -10545218, -8198556, -4735739, -6757058, 5386426, 8421357, -8386998, 2489471, -18321256, -5899675, -1174674, 3488050, 10245108, 4216048, -2417530, 3688840, -7556995, 4995584, 5579163, --9765145, -2126546, -4775467, 5679021, 5282273, 7683160, 9300752, -11656541, -5596343, 1845762, -10383083, -3877819, 5068062, -11218991, -2901251, -4037269, -1879585, -6891275, 2165201, -11188927, -8140574, -2384244, -1400696, 5309117, 243739, 984084, 6517076, -158377, 5472325, 2889439, --709207, -2297808, 38118, -8145943, -4933307, -7521562, 313533, 14147622, 4200478, 2274185, -490163, -2661806, 754304, 8090645, -951335, 2006824, -15932181, 14749455, -2740726, -3666828, -1986422, 8544301, 4633733, -2690797, -4543539, 15433965, -1854352, -1613297, 6836514, -5872831, -1654636, 381178, -1802276, 649077, 5502390, 240518, -750546, 8281771, 4795331, 9175661, --3241627, -1847910, 5455146, -7948911, 7726646, 8686034, -3880503, -466541, -12898861, 864362, -4926328, 3919158, -2433099, -8799851, -17910550, 503048, -2716567, -8483634, 2428267, 6025839, --7529078, -3206193, -8238284, 4551055, 933082, -1133335, -2433099, -3611531, 9799505, 11030550, -4710506, 5312875, -1942399, -5366025, 15697032, 3870839, -2076080, -8849243, 7109245, 333397, -9287330, -730144, 11366631, 5423470, 8144869, 6392522, 3869229, 8383240, 11127723, -352187, -2602750, -3432216, 586263, 5609764, 3126736, 2957622, -8507793, -3610457, -1137630, -8339753, --6847789, -5417565, 5279052, 8505646, 12706124, 14734959, 4572530, 666257, 13667123, -5754183, -14341433, -13157095, -6080063, -1560147, 5616744, -12278238, 8119099, -12085501, 6264747, 223338, -6628209, 10471667, -3999688, 9595494, 10359998, 9973988, -5455146, 8465917, -8647380, -6715718, --945430, -5113696, 51003, -4345433, 8135742, -5600638, 1881733, -5515812, -10161893, -4443681, --2061047, 12771622, -10317048, 10145250, 4389994, -14045617, 16616692, 4461398, 1912334, 12014634, -2120640, 932545, -6531035, 389231, -3635153, 13680545, 5624260, 9734007, -3595961, -1727114, -6404333, 11512660, -11528766, 11929809, 2085207, -1342714, -2159832, -10328323, 5223217, -4568235, -2196876, 1066763, -9860171, 3938485, 8337069, -6928856, 5308580, 4149475, 11731166, 1972464, --653372, 7873749, 10488847, 1693291, -5245229, 7820599, -6054294, -11440182, -8185134, 12367358, --15910169, 3956202, -8465917, 9387725, -10093173, 15363098, 5367636, 1416266, -13361106, 6738267, -11374684, 2900177, -6832756, -4580046, -3877819, 10408853, 5797669, -14810658, 2164127, -10524280, --474057, 1045288, -8767639, 11487964, 11812234, -5470715, 2703145, 7752416, -9526237, -1660542, --2809446, -8215736, 17237852, -6407555, -3607236, -8810052, -14116484, -2512019, 511638, -5206574, -2399813, -12134893, 1340030, 557809, -2058900, 9086003, -1605781, -7613367, 4182761, -338766, --5043366, 4332549, 20673826, -4418985, 5322002, 703838, -13163001, -2656974, 12882218, 5070209, -12872554, -1729261, 7841537, -10204305, 5285494, 3730179, 2537252, -8822400, 8959302, 2072322, --19636054, 1034013, -1373316, 13603235, -24564528, 28616830, 3724274, 11533061, -20078972, 11571179, -14947560, -16377247, 6789270, 8690866, 6824166, -10447508, 1823751, 2297808, -3254512, 6710350, -13434658, -10079751, -8302172, -2804077, 11450920, 9932112, 13914620, -274878, 6111202, -9693741, --2233383, -2243584, 2613488, 6720550, 17672716, 10650445, 6681359, 3649112, -170188, 8612483, --2651606, -14458471, -2476586, 4714264, 5133560, -8318278, -6169184, -10388452, 2472291, -504122, -4167729, -6694781, 13003013, 12670154, -10280541, 25719874, 1555315, -1993939, 245350, -4947803, --754304, -1292785, -9875740, 499290, 417686, 7063074, -20968568, 5552856, -7179038, 15826954, -19133542, 8412230, 8199630, 3782256, 1699733, 17152488, -2652679, -12371653, 11396159, -5804112, -4251481, 9862856, 1576790, -7562901, 6280316, 9560597, 8314520, 5034239, 10002979, -13050258, --8369818, 929860, -11714523, -3328600, -2250563, 2006287, -3251827, -7910793, -9578851, -6119792, -4272956, 7255811, -13974213, 2318209, -1705102, -963146, -16748225, -15428059, -2820720, -12119324, -5202279, -13747653, 639413, 6351183, 9899900, -9612137, 11818139, 2364380, -1330366, -3354370, -17649094, -5682242, -981937, -15027017, -8101919, 10874857, -934692, 3621731, -13763223, -15852724, --4105989, -9317932, -1440962, -192200, -5480915, -7989713, 4340065, -7502771, 726386, -10657961, --5078799, -1196685, -15817828, 502511, 10839961, 1010391, 5875516, 10471130, 20091858, -20081120, -3890704, -12814572, -10964515, -7457137, -8268349, -6564858, -5031554, 18670222, 19026168, 20208894, -22310208, -18080738, 437013, 11595875, 9017821, -10953240, -20032264, -3154117, -3653407, -16057809, --9522479, 27770184, 1496796, 1003949, 9993852, -2218351, 3854196, -4948339, -12120398, 6497749, -5555004, -16442209, -22623740, -18023294, -14193256, -13914083, 548682, 2660195, 5844914, -9648107, -7711614, 888521, -4850629, -10189810, -950262, -661425, -14603426, -12125230, 977105, -3740917, -1289564, -9709310, 6234682, 853625, -8567923, -18401250, -7348152, -7115150, -23315766, -8550206, -1548336, 9807558, -1658931, 11828340, -2914672, -2649995, -19931870, -5709622, 7055558, 1968706, --32971390, 7541426, 2246268, -10891500, -6068252, -11415486, -11232413, -2594697, -136365, -12716324, --4004520, 3674345, 8657043, 10965052, -12084427, 7827041, -6871948, 22452478, -19452444, -11975979, --4087198, -36578624, -19244138, -164819, -23461796, 18015240, -8393977, -7581154, 1840394, 41344964, -19720880, 1263257, 8231842, -1928440, -11387032, -1098975, -17482664, -12416750, 5592585, 6032282, -7080254, -11901354, 14930917, 9410273, 16917876, -17526688, 2414845, 25715042, 1961726, 1129576, -4598836, -24506546, 5788542, -6119255, 3526705, -9798431, -23768350, -1309965, 8802535, 11555610, -2345589, -3502009, 1034013, -933082, 7002944, -17399450, -26252450, 4704063, -10094247, 15374909, --6925098, -6199786, 19015430, 4620848, 7616588, 1727114, -17826798, -6767258, -3087545, 9202504, -25093346, 20312510, -7267622, -23104240, -1813013, -2581812, 7161858, -14207215, -19448686, -9972377, -6919729, -17236778, -40375912, 17186312, 14303852, -4936528, -26298622, -4891431, -9425843, -9955734, -13255880, 16139950, -377957, 5281736, -30027726, 12190728, -37868728, -8658117, -2213519, 9010305, -20826834, 32444720, 14143864, -16789028, 5408438, 23082764, 4124242, 7939784, 13065827, -17022030, --5826123, -1538672, 6845641, -11544872, -5656472, -2504503, -8389682, -5959267, 14601278, 14492293, -4721780, 2611877, 23846196, -2644626, 11928735, -23734526, 18314278, 6492917, -21449604, 4095251, -8966281, -19797652, -1131187, -19242528, 8800388, 10893648, 11304354, -12139188, 676457, 16426639, --9837623, 2527588, 222265, 25988848, -11602854, 20024212, 11224897, -18846854, 21891986, -12743705, -15359877, 20080582, -12999255, 13754096, -9944997, -11871826, -21068962, -14080513, -15017890, 12852153, -8156680, -31462782, -14137422, -14760729, 30162482, 2288144, 12147241, -3259880, 42176040, 7858180, --25857850, 3414499, 31344134, -9681930, 8044474, -3533148, 3958886, -16101832, -22278532, 38897908, -28020366, -8859981, 21807160, 9451076, 27954332, 31684510, -7552700, -5763309, 28219008, 21124796, -3457449, -7145752, -12137578, -12687870, 13698261, 25099788, 12372190, -3003793, 17147120, -7084012, -16307454, -5483063, 23220740, 40422620, 30895848, -30629560, 15618112, -4207994, -11984032, 773094, -12062416, 11892764, 72401872, -6098854, 84289, -10564009, -11936788, 14953466, 26500486, -5362267, -20199768, 17663054, -1818919, 1404991, -13647795, 14884746, 11976516, 38625716, 38468412, 47416976, -18901614, -11742441, -10960220, -21525840, 18715856, -31882616, 17228188, -21940840, 14886357, 12424804, --12621298, 3308736, 7092602, -6474663, 21662742, 4629438, -53408992, 11666205, 6012418, -39469676, -1372242, -7019587, 632434, 14062260, -2947421, -36380520, -7532299, -11711302, -3200825, 25451440, -29487634, -17595408, -5717139, -14745696, 6185827, -27725624, -55184424, -19238770, -17760764, 2872796, --734976, 24524264, -38434052, 17631914, -10339597, -3892851, 13191992, 7293392, 23546084, 6069326, -7723962, 27613956, -33459942, 39291972, 28579786, 16495359, 26520350, -10869488, 8368207, -26744762, --8229158, -13205414, 21042118, -20792474, 1938641, -45203992, -60176788, 38477000, -5443871, 25074020, --21220896, 16848082, -15588047, 4214974, -11193222, -36439040, -16980690, -24077586, -17640504, 14275934, -48468168, 20526186, -56511032, -10274099, 1743220, -15333033, 2083059, 1538672, -34004328, 15358266, -15345381, 28545426, -16442745, 9381282, -18651432, -21421686, 7093139, 38433516, 63362580, -5791764, --6026376, -383863, -3168612, -30764314, 43789876, 20078972, 22463216, 16856136, -14957760, 13969918, --27459336, -38811472, -8201240, 25768730, 16143171, -15152108, -10415296, -3805878, 20468204, -1069447, -14362908, 13921063, 24508158, 6719477, -18722836, -18013092, 13056164, -20070920, -15454903, 5531381, -26887032, 24439438, -32973000, -26221850, 13430900, 16267726, 54747948, -16013249, -33763812, -35169340, -24662240, -23703388, 22965190, 25994752, 55841016, 121526096, -31206696, -19656992, -50348292, -78626352, --27602682, -42040212, 86436, 46792060, -12347494, 21650394, 33735356, 18753974, -20907900, -54916524, --83727704, 29606820, -14806900, 15127412, -27528056, 2385854, -25283398, -65756488, 13700409, -28843926, -24068996, 1514513, 12451647, 10509785, -60266444, -43505336, -22592602, -15198816, -15710990, -26150446, --9592273, -41857140, -27306328, 16473884, -27861452, 46328200, -38533372, 1209033, 7864622, -6418829, -2095944, -4680978, 9467719, -13940390, -14410152, -4761508, 6533719, -4221416, 18726058, -22487912, -2231236, 27841052, 7562364, 1785633, 13320841, -918049, -14749991, -10839961, 22519050, 2616172, --41598368, -20414516, -34240016, -17574470, 39760124, 36211408, -43170328, -7720204, -48824652, -14449881, --6548752, 7257958, 20335596, -41379324, 22243636, -35871568, -8704288, -25613574, 45033804, -13758391, -30277908, 27936614, 66721244, -37214280, 23837606, 172872, 20784958, 4807142, 11185705, -41130756, --49798536, 34864932, 8507793, -53399864, -21517250, -31614180, 5564667, -4438312, -73642048, -31173410, --16733193, -37208912, -22157736, -73832096, -62259308, -8004209, 31291522, -38837240, -22323092, -2274722, --33272574, -4378183, 162135, -31219580, -6383932, 11250667, 4690641, -42684460, -23721642, -22573812, --12011950, -12435004, -2044941, -28309204, 29709362, 21808234, 41194104, 60369524, 51335596, 16694538, -54040352, 24940338, 11487964, -18703508, 20263656, 23084376, 16933446, -1707250, -15775415, -3910568, -14715095, 27275726, 119731344, 20318416, 25781614, 21658984, 49550500, 22981834, 43449500, 81487344, --36497020, -71404368, 9871445, 52487720, 86417424, 42343544, -74897248, 14042932, -19487878, 112687592, -78547432, 100952136, 86836720, -74532712, -55001352, 66044784, 70883600, -18937048, -55786792, 89573688, -72593000, -62817656, 14298483, -1698123, 10470057, -2783139, -5715528, 22643604, -22617834, 22012244, --8519605, -544387, 9678172, 6544994, 8904541, -885837, -12190728, -9321690, 15469935, -12867185, --373662, 12791486, -6347425, -9145596, -9705015, -21536576, -18873696, 13451838, -5869073, 4026532, --11130945, 944356, -25351044, -6608881, 9282498, 15626165, -9121974, 1880122, 14038637, 17070348, --2385318, 13671955, -10534481, 48139068, -16283832, 15008226, 4878546, 7359427, -6753836, 10766409, --2534031, 33203856, -2900714, 8307004, -21970368, 30029338, -14070313, -4357245, -1457068, 1702418, --6255083, 16639240, -19080392, 15430207, -17000018, 24053428, -24304146, 31507880, -18596134, -14911053, --9798431, -8932995, 6635725, -22195854, -45638324, -50194208, 42279660, 10522133, -13364864, -67944232, --27434640, 37520296, 7487202, 27041114, 30194156, -11184632, -19298898, 692564, 7011534, 5383205, -4853850, -12183748, -8983998, -6852621, -139050, 18130668, 9738301, -1076963, 3966402, -5462662, --9007620, -5833103, -4773856, 166967, 5290863, -4319127, 6876243, 7196755, -24968256, -11175505, --11084774, 13174812, 9180493, -923418, -11621108, -15722802, 13619878, 2972117, 9148817, 12717398, --23041426, -15331423, 4262218, 18641232, 9463424, -26142392, -16062641, -21167210, -10022843, 5707475, -5007395, -8495982, 9882720, -3593814, -8916889, 4584341, 9138080, -5978058, 2506114, 485868, --7724499, 185220, -2301029, -17433272, -18066780, 421444, -19082002, -12827994, 2241973, 10336376, -3527779, 17151952, -44362716, -120027160, -45952392, 26822070, 57088168, 135442336, 79306568, 21346524, -27883464, -23881628, -44532368, -96532072, -65457448, -50038516, -16882442, 19446538, 52324512, 40898288, -50758460, 49436148, 33005214, -11555610, -39882528, -34117608, -35578436, -28183038, -41150620, 12298639, --26302380, 1790465, 18034030, 34688304, 18826452, 32500018, 42087996, 818728, 11967389, 1003949, --1513439, -23876796, -4045859, -21191906, -42526620, -65543348, -37519224, -19815906, 4373351, 5296232, -38133404, 54597088, 51195472, 62503048, 8067023, 41247792, 15169288, -3067681, -39173324, -36709084, --51768852, -65841848, -46416248, -50662896, -33625300, 1422708, 15202574, 38641284, 59321552, 90254976, -70397736, 66618164, 34821984, -9830643, -11987791, -29533806, -70190504, -47001976, -64996812, -17580374, --9045738, 0, 0, }, +6058052, -4815732, 7134478, -1403381, -4489315, 1406602, 3631395, -1666447, 892816, 3344706, +-4984847, -3398930, -931471, -3041374, 9645960, -3819837, 9485435, 2748242, 3217468, -1248225, +-2049236, -3347927, -4402342, 122943, 4133369, 345208, 535260, -2499671, 2736968, 3787088, +324270, -2057826, -4986457, 3352759, -925565, 3842922, -1635846, 697395, 1720134, -2787434, +17717, -4901095, 6687264, -70867, 988916, -612570, -5857262, -1512365, -1727114, 472446, +944893, 3424163, 1539209, -2306934, -3564823, 1728188, -2137283, -1110786, 4239133, -2357937, +3000572, -4167729, 2270427, -4828080, 2415919, -3235184, -1720671, 4893579, 2246268, 2660195, +-718870, 383326, 1079111, 1206349, 1720134, 7618198, 784905, -2103460, -2191507, 1294933, +-3721589, -94489, -7224672, 5126044, 6533182, 4533875, 6432251, -7781944, 613107, 1721745, +-2769180, -2174327, -1894081, -9114457, -1529008, 5332202, -9278740, -7597261, 4389457, 3915937, +-5956583, -2143189, 3953518, 439160, 4808216, 1985349, 5011690, -3211562, 974421, 615791, +-1305670, 2246268, 1855426, 3307125, 1454383, -1586990, 360777, 3696356, -984621, -1821603, +-595927, -4686346, -10063645, 5905043, 2976949, -3280281, 4502737, -1899449, 564251, -285615, +2143726, -2808372, -602369, 5827734, -5524939, -2416993, 2072322, 802622, -737124, -466004, +2774012, 93416, 2500208, -4239670, 4297652, 1845762, -4963372, 3878356, 714575, 1176284, +-136902, -1998770, 12009802, -6819871, 2157684, -7545721, 975494, 1828046, -7596187, -9637370, +2486249, -10462003, 2386391, -2694555, -652298, -6400575, -857383, -7194070, -3639985, 72478, +-7573101, 8180839, 2954938, -12658879, 1300301, -658204, -2201171, -5395553, 2836289, 6630356, +241592, -444529, 6302328, -3592740, 202400, -2272038, 4230006, -4759361, 1547262, 5825050, +-4884989, 5100811, 1935420, 5514738, -302258, 1288490, -648540, -2260764, 7357279, -8842264, +2258616, -3882114, -1487132, -1102733, -2996814, -2332167, -6827925, -4388920, -821949, 4689568, +-79457, 1814087, 6806450, -61203, -5215701, -619549, 636192, 1868848, -2240362, 143881, +-4937065, 278636, -1564442, 2021319, 3697430, 4476967, 2585034, -1975685, -1489280, -3120831, +-10141492, -360777, -6209986, -2125472, -1218160, -7198365, -1199370, -1861868, 3205119, 7871602, +7912404, 730144, -3733937, 3024194, -8149701, -1366873, -3270618, 2519535, -12022687, 3924526, +1750199, -662499, -3632469, -5307506, -2563559, -4417374, -3843996, 1976222, -1027034, -4738960, +-1553704, 692027, 7456063, -517007, -8000451, 390842, 3118146, -311385, -2668785, 433792, +2706903, -8650064, -870268, -3874597, 5724655, 3412352, 806380, -7999377, 692027, 2816962, +4605279, 4295504, -5298916, -2588255, 77846, -1771137, -1746441, 4013647, -2706366, 2407329, +607201, -3411815, -802085, -4620311, 5405753, 1949378, -5335423, -3754875, 1003412, 2841121, +-4059281, -5290863, -563714, 503048, -2933463, -16972638, 5300527, 4741107, 8003135, -2236067, +4961761, -14634564, -4138201, 4445291, 364535, -7279970, -2054068, -2479807, -12911209, -5236102, +1092532, -656056, -9274445, 5602785, 7838852, -8321499, 6055904, -10871636, -3910031, -1005559, +3492882, -82141, -4632122, 2957622, 1231582, -725313, 4581657, -2331630, -3381213, -950798, +-2050847, -3169149, 4480725, -3608846, 1061931, 3626563, -1018981, -2753611, -5618354, -551366, +-4102768, -1047435, -4730907, -1064078, 9495636, 351114, 5638755, -5308580, 4669703, -1369558, +-8372502, -4511327, 4085588, -2663954, -4446902, 3216931, -5173288, 4321274, 690416, -1104880, +4830228, 5142687, 1678795, -4689568, -6277632, 173946, 7397545, 2254858, 785442, -3532074, +840740, -9888088, -9447854, -6535330, 173409, -2315524, 2614561, -3970697, -893353, -241592, +-3460133, -1829119, 1249299, -3388192, 9105868, -7424388, 3719442, -2572686, -1612760, -5509906, +-2216740, -1486596, 6366752, -5829345, -292595, 580357, -8120173, -5214627, -5856725, -4991826, +-9276056, -3690451, 2013266, 4809827, 2586644, -7455527, -10348724, -2874407, -712965, -5581310, +-135291, -4051765, -5899675, -12394739, -6850473, -8928700, 3639985, -2908230, 2752000, -5470178, +-12355010, -6793028, -516470, -3104188, -4794257, -2487323, -5550709, 5230734, -579284, 2711735, +3560528, 390842, -1353989, -4714801, -1007707, 4308926, -2088965, -4575751, -6476811, 7614440, +-8260833, -10545218, -8198556, -4735739, -6757058, 5386426, 8421357, -8386998, 2489471, -18321256, +5899675, -1174674, 3488050, 10245108, 4216048, -2417530, 3688840, -7556995, 4995584, 5579163, +-9765145, -2126546, -4775467, 5679021, 5282273, 7683160, 9300752, -11656541, -5596343, 1845762, +10383083, -3877819, 5068062, -11218991, -2901251, -4037269, -1879585, -6891275, 2165201, -11188927, +8140574, -2384244, -1400696, 5309117, 243739, 984084, 6517076, -158377, 5472325, 2889439, +-709207, -2297808, 38118, -8145943, -4933307, -7521562, 313533, 14147622, 4200478, 2274185, +490163, -2661806, 754304, 8090645, -951335, 2006824, -15932181, 14749455, -2740726, -3666828, +1986422, 8544301, 4633733, -2690797, -4543539, 15433965, -1854352, -1613297, 6836514, -5872831, +1654636, 381178, -1802276, 649077, 5502390, 240518, -750546, 8281771, 4795331, 9175661, +-3241627, -1847910, 5455146, -7948911, 7726646, 8686034, -3880503, -466541, -12898861, 864362, +4926328, 3919158, -2433099, -8799851, -17910550, 503048, -2716567, -8483634, 2428267, 6025839, +-7529078, -3206193, -8238284, 4551055, 933082, -1133335, -2433099, -3611531, 9799505, 11030550, +4710506, 5312875, -1942399, -5366025, 15697032, 3870839, -2076080, -8849243, 7109245, 333397, +9287330, -730144, 11366631, 5423470, 8144869, 6392522, 3869229, 8383240, 11127723, -352187, +2602750, -3432216, 586263, 5609764, 3126736, 2957622, -8507793, -3610457, -1137630, -8339753, +-6847789, -5417565, 5279052, 8505646, 12706124, 14734959, 4572530, 666257, 13667123, -5754183, +14341433, -13157095, -6080063, -1560147, 5616744, -12278238, 8119099, -12085501, 6264747, 223338, +6628209, 10471667, -3999688, 9595494, 10359998, 9973988, -5455146, 8465917, -8647380, -6715718, +-945430, -5113696, 51003, -4345433, 8135742, -5600638, 1881733, -5515812, -10161893, -4443681, +-2061047, 12771622, -10317048, 10145250, 4389994, -14045617, 16616692, 4461398, 1912334, 12014634, +2120640, 932545, -6531035, 389231, -3635153, 13680545, 5624260, 9734007, -3595961, -1727114, +6404333, 11512660, -11528766, 11929809, 2085207, -1342714, -2159832, -10328323, 5223217, -4568235, +2196876, 1066763, -9860171, 3938485, 8337069, -6928856, 5308580, 4149475, 11731166, 1972464, +-653372, 7873749, 10488847, 1693291, -5245229, 7820599, -6054294, -11440182, -8185134, 12367358, +-15910169, 3956202, -8465917, 9387725, -10093173, 15363098, 5367636, 1416266, -13361106, 6738267, +11374684, 2900177, -6832756, -4580046, -3877819, 10408853, 5797669, -14810658, 2164127, -10524280, +-474057, 1045288, -8767639, 11487964, 11812234, -5470715, 2703145, 7752416, -9526237, -1660542, +-2809446, -8215736, 17237852, -6407555, -3607236, -8810052, -14116484, -2512019, 511638, -5206574, +2399813, -12134893, 1340030, 557809, -2058900, 9086003, -1605781, -7613367, 4182761, -338766, +-5043366, 4332549, 20673826, -4418985, 5322002, 703838, -13163001, -2656974, 12882218, 5070209, +12872554, -1729261, 7841537, -10204305, 5285494, 3730179, 2537252, -8822400, 8959302, 2072322, +-19636054, 1034013, -1373316, 13603235, -24564528, 28616830, 3724274, 11533061, -20078972, 11571179, +14947560, -16377247, 6789270, 8690866, 6824166, -10447508, 1823751, 2297808, -3254512, 6710350, +13434658, -10079751, -8302172, -2804077, 11450920, 9932112, 13914620, -274878, 6111202, -9693741, +-2233383, -2243584, 2613488, 6720550, 17672716, 10650445, 6681359, 3649112, -170188, 8612483, +-2651606, -14458471, -2476586, 4714264, 5133560, -8318278, -6169184, -10388452, 2472291, -504122, +4167729, -6694781, 13003013, 12670154, -10280541, 25719874, 1555315, -1993939, 245350, -4947803, +-754304, -1292785, -9875740, 499290, 417686, 7063074, -20968568, 5552856, -7179038, 15826954, +19133542, 8412230, 8199630, 3782256, 1699733, 17152488, -2652679, -12371653, 11396159, -5804112, +4251481, 9862856, 1576790, -7562901, 6280316, 9560597, 8314520, 5034239, 10002979, -13050258, +-8369818, 929860, -11714523, -3328600, -2250563, 2006287, -3251827, -7910793, -9578851, -6119792, +4272956, 7255811, -13974213, 2318209, -1705102, -963146, -16748225, -15428059, -2820720, -12119324, +5202279, -13747653, 639413, 6351183, 9899900, -9612137, 11818139, 2364380, -1330366, -3354370, +17649094, -5682242, -981937, -15027017, -8101919, 10874857, -934692, 3621731, -13763223, -15852724, +-4105989, -9317932, -1440962, -192200, -5480915, -7989713, 4340065, -7502771, 726386, -10657961, +-5078799, -1196685, -15817828, 502511, 10839961, 1010391, 5875516, 10471130, 20091858, -20081120, +3890704, -12814572, -10964515, -7457137, -8268349, -6564858, -5031554, 18670222, 19026168, 20208894, +22310208, -18080738, 437013, 11595875, 9017821, -10953240, -20032264, -3154117, -3653407, -16057809, +-9522479, 27770184, 1496796, 1003949, 9993852, -2218351, 3854196, -4948339, -12120398, 6497749, +5555004, -16442209, -22623740, -18023294, -14193256, -13914083, 548682, 2660195, 5844914, -9648107, +7711614, 888521, -4850629, -10189810, -950262, -661425, -14603426, -12125230, 977105, -3740917, +1289564, -9709310, 6234682, 853625, -8567923, -18401250, -7348152, -7115150, -23315766, -8550206, +1548336, 9807558, -1658931, 11828340, -2914672, -2649995, -19931870, -5709622, 7055558, 1968706, +-32971390, 7541426, 2246268, -10891500, -6068252, -11415486, -11232413, -2594697, -136365, -12716324, +-4004520, 3674345, 8657043, 10965052, -12084427, 7827041, -6871948, 22452478, -19452444, -11975979, +-4087198, -36578624, -19244138, -164819, -23461796, 18015240, -8393977, -7581154, 1840394, 41344964, +19720880, 1263257, 8231842, -1928440, -11387032, -1098975, -17482664, -12416750, 5592585, 6032282, +7080254, -11901354, 14930917, 9410273, 16917876, -17526688, 2414845, 25715042, 1961726, 1129576, +4598836, -24506546, 5788542, -6119255, 3526705, -9798431, -23768350, -1309965, 8802535, 11555610, +2345589, -3502009, 1034013, -933082, 7002944, -17399450, -26252450, 4704063, -10094247, 15374909, +-6925098, -6199786, 19015430, 4620848, 7616588, 1727114, -17826798, -6767258, -3087545, 9202504, +25093346, 20312510, -7267622, -23104240, -1813013, -2581812, 7161858, -14207215, -19448686, -9972377, +6919729, -17236778, -40375912, 17186312, 14303852, -4936528, -26298622, -4891431, -9425843, -9955734, +13255880, 16139950, -377957, 5281736, -30027726, 12190728, -37868728, -8658117, -2213519, 9010305, +20826834, 32444720, 14143864, -16789028, 5408438, 23082764, 4124242, 7939784, 13065827, -17022030, +-5826123, -1538672, 6845641, -11544872, -5656472, -2504503, -8389682, -5959267, 14601278, 14492293, +4721780, 2611877, 23846196, -2644626, 11928735, -23734526, 18314278, 6492917, -21449604, 4095251, +8966281, -19797652, -1131187, -19242528, 8800388, 10893648, 11304354, -12139188, 676457, 16426639, +-9837623, 2527588, 222265, 25988848, -11602854, 20024212, 11224897, -18846854, 21891986, -12743705, +15359877, 20080582, -12999255, 13754096, -9944997, -11871826, -21068962, -14080513, -15017890, 12852153, +8156680, -31462782, -14137422, -14760729, 30162482, 2288144, 12147241, -3259880, 42176040, 7858180, +-25857850, 3414499, 31344134, -9681930, 8044474, -3533148, 3958886, -16101832, -22278532, 38897908, +28020366, -8859981, 21807160, 9451076, 27954332, 31684510, -7552700, -5763309, 28219008, 21124796, +3457449, -7145752, -12137578, -12687870, 13698261, 25099788, 12372190, -3003793, 17147120, -7084012, +16307454, -5483063, 23220740, 40422620, 30895848, -30629560, 15618112, -4207994, -11984032, 773094, +12062416, 11892764, 72401872, -6098854, 84289, -10564009, -11936788, 14953466, 26500486, -5362267, +20199768, 17663054, -1818919, 1404991, -13647795, 14884746, 11976516, 38625716, 38468412, 47416976, +18901614, -11742441, -10960220, -21525840, 18715856, -31882616, 17228188, -21940840, 14886357, 12424804, +-12621298, 3308736, 7092602, -6474663, 21662742, 4629438, -53408992, 11666205, 6012418, -39469676, +1372242, -7019587, 632434, 14062260, -2947421, -36380520, -7532299, -11711302, -3200825, 25451440, +29487634, -17595408, -5717139, -14745696, 6185827, -27725624, -55184424, -19238770, -17760764, 2872796, +-734976, 24524264, -38434052, 17631914, -10339597, -3892851, 13191992, 7293392, 23546084, 6069326, +7723962, 27613956, -33459942, 39291972, 28579786, 16495359, 26520350, -10869488, 8368207, -26744762, +-8229158, -13205414, 21042118, -20792474, 1938641, -45203992, -60176788, 38477000, -5443871, 25074020, +-21220896, 16848082, -15588047, 4214974, -11193222, -36439040, -16980690, -24077586, -17640504, 14275934, +48468168, 20526186, -56511032, -10274099, 1743220, -15333033, 2083059, 1538672, -34004328, 15358266, +15345381, 28545426, -16442745, 9381282, -18651432, -21421686, 7093139, 38433516, 63362580, -5791764, +-6026376, -383863, -3168612, -30764314, 43789876, 20078972, 22463216, 16856136, -14957760, 13969918, +-27459336, -38811472, -8201240, 25768730, 16143171, -15152108, -10415296, -3805878, 20468204, -1069447, +14362908, 13921063, 24508158, 6719477, -18722836, -18013092, 13056164, -20070920, -15454903, 5531381, +26887032, 24439438, -32973000, -26221850, 13430900, 16267726, 54747948, -16013249, -33763812, -35169340, +24662240, -23703388, 22965190, 25994752, 55841016, 121526096, -31206696, -19656992, -50348292, -78626352, +-27602682, -42040212, 86436, 46792060, -12347494, 21650394, 33735356, 18753974, -20907900, -54916524, +-83727704, 29606820, -14806900, 15127412, -27528056, 2385854, -25283398, -65756488, 13700409, -28843926, +24068996, 1514513, 12451647, 10509785, -60266444, -43505336, -22592602, -15198816, -15710990, -26150446, +-9592273, -41857140, -27306328, 16473884, -27861452, 46328200, -38533372, 1209033, 7864622, -6418829, +2095944, -4680978, 9467719, -13940390, -14410152, -4761508, 6533719, -4221416, 18726058, -22487912, +2231236, 27841052, 7562364, 1785633, 13320841, -918049, -14749991, -10839961, 22519050, 2616172, +-41598368, -20414516, -34240016, -17574470, 39760124, 36211408, -43170328, -7720204, -48824652, -14449881, +-6548752, 7257958, 20335596, -41379324, 22243636, -35871568, -8704288, -25613574, 45033804, -13758391, +30277908, 27936614, 66721244, -37214280, 23837606, 172872, 20784958, 4807142, 11185705, -41130756, +-49798536, 34864932, 8507793, -53399864, -21517250, -31614180, 5564667, -4438312, -73642048, -31173410, +-16733193, -37208912, -22157736, -73832096, -62259308, -8004209, 31291522, -38837240, -22323092, -2274722, +-33272574, -4378183, 162135, -31219580, -6383932, 11250667, 4690641, -42684460, -23721642, -22573812, +-12011950, -12435004, -2044941, -28309204, 29709362, 21808234, 41194104, 60369524, 51335596, 16694538, +54040352, 24940338, 11487964, -18703508, 20263656, 23084376, 16933446, -1707250, -15775415, -3910568, +14715095, 27275726, 119731344, 20318416, 25781614, 21658984, 49550500, 22981834, 43449500, 81487344, +-36497020, -71404368, 9871445, 52487720, 86417424, 42343544, -74897248, 14042932, -19487878, 112687592, +78547432, 100952136, 86836720, -74532712, -55001352, 66044784, 70883600, -18937048, -55786792, 89573688, +72593000, -62817656, 14298483, -1698123, 10470057, -2783139, -5715528, 22643604, -22617834, 22012244, +-8519605, -544387, 9678172, 6544994, 8904541, -885837, -12190728, -9321690, 15469935, -12867185, +-373662, 12791486, -6347425, -9145596, -9705015, -21536576, -18873696, 13451838, -5869073, 4026532, +-11130945, 944356, -25351044, -6608881, 9282498, 15626165, -9121974, 1880122, 14038637, 17070348, +-2385318, 13671955, -10534481, 48139068, -16283832, 15008226, 4878546, 7359427, -6753836, 10766409, +-2534031, 33203856, -2900714, 8307004, -21970368, 30029338, -14070313, -4357245, -1457068, 1702418, +-6255083, 16639240, -19080392, 15430207, -17000018, 24053428, -24304146, 31507880, -18596134, -14911053, +-9798431, -8932995, 6635725, -22195854, -45638324, -50194208, 42279660, 10522133, -13364864, -67944232, +-27434640, 37520296, 7487202, 27041114, 30194156, -11184632, -19298898, 692564, 7011534, 5383205, +4853850, -12183748, -8983998, -6852621, -139050, 18130668, 9738301, -1076963, 3966402, -5462662, +-9007620, -5833103, -4773856, 166967, 5290863, -4319127, 6876243, 7196755, -24968256, -11175505, +-11084774, 13174812, 9180493, -923418, -11621108, -15722802, 13619878, 2972117, 9148817, 12717398, +-23041426, -15331423, 4262218, 18641232, 9463424, -26142392, -16062641, -21167210, -10022843, 5707475, +5007395, -8495982, 9882720, -3593814, -8916889, 4584341, 9138080, -5978058, 2506114, 485868, +-7724499, 185220, -2301029, -17433272, -18066780, 421444, -19082002, -12827994, 2241973, 10336376, +3527779, 17151952, -44362716, -120027160, -45952392, 26822070, 57088168, 135442336, 79306568, 21346524, +27883464, -23881628, -44532368, -96532072, -65457448, -50038516, -16882442, 19446538, 52324512, 40898288, +50758460, 49436148, 33005214, -11555610, -39882528, -34117608, -35578436, -28183038, -41150620, 12298639, +-26302380, 1790465, 18034030, 34688304, 18826452, 32500018, 42087996, 818728, 11967389, 1003949, +-1513439, -23876796, -4045859, -21191906, -42526620, -65543348, -37519224, -19815906, 4373351, 5296232, +38133404, 54597088, 51195472, 62503048, 8067023, 41247792, 15169288, -3067681, -39173324, -36709084, +-51768852, -65841848, -46416248, -50662896, -33625300, 1422708, 15202574, 38641284, 59321552, 90254976, +70397736, 66618164, 34821984, -9830643, -11987791, -29533806, -70190504, -47001976, -64996812, -17580374, +-9045738, 0, 0, }, { -6189585, -5708549, -5827734, 4446902, -2529736, 1142461, -8290898, 4577899, 1128503, -279173, -1499481, -3481071, -4316442, -924492, -1751810, 3629784, -9207336, -2603287, -5244692, -2419677, 1912871, -1406602, 4478041, -7128035, 2143726, 754304, 408559, -2933463, -799938, -3810710, -486942, --5206574, 1706713, -5771363, -512175, -4916664, -3936875, 806917, -4359392, -5549098, -6791417, -1804960, -791348, -1369021, 2682744, 1993402, -2641405, 55835, 7233799, -3696356, -2362232, --5546414, -1621350, 3125126, 1724966, 1770600, -2612414, 2251100, -3163244, 360240, -3856881, --432718, 253403, -4028679, -1493038, 584116, -585726, -4527970, -8455717, -3602941, -3030636, --1060857, -237297, -1986959, -2407866, -574989, 8009041, 5094905, 83215, 188442, 6310381, -1492501, -3209414, 2062121, 4198331, -2253784, -3537979, -12737799, 654446, -4372277, 8416525, --4318053, 4223027, 3259880, -433792, 2597382, 4676683, 1107565, 1111860, -2476586, -2741263, --2334315, -3453691, 2845953, 1861868, -1858110, 2798708, -2117956, -2727841, -3567507, -1536525, --2880313, 305480, -217970, -400506, 5499706, -3240553, 4434017, -1597728, -1505923, 3288334, --2284923, 1118302, -2302103, 3612604, -1382980, -9716290, 2556043, 502511, 812286, 5129265, -2143189, 536334, -1571421, -3073049, 7971996, -4265440, 2782065, 1930588, -4027069, 3778498, -1013075, -3891777, 2664490, -4008815, -408559, -180389, 3025805, 882616, 3149285, -1238024, --9478456, -1779190, 15497853, -7443715, 990527, -324270, -308164, 3628174, -2621541, -10895795, --10021232, 4916127, -3070902, -811212, 2742337, 693100, 2711198, 2988760, -4691178, 2743410, -1957968, -3302830, 4171487, 6176700, -3791383, -1171989, 461172, -6401649, -2787434, 783295, -7967165, -1132798, -267899, -6374805, 4022237, 129923, -5650030, -2363843, 2214056, -755914, -1325534, -4911832, 78383, 477278, -1847373, 5524939, 1581085, 1349157, 5432597, -398358, -6999723, -2124398, -8339216, 3623879, 3632469, -2866354, -1032940, -887448, 1373316, 558883, -2726231, -1783485, 1944010, -4489315, 181999, 3293703, -4051228, -292595, 3118683, 1097901, --1803349, 1837172, -1158031, 828392, 5115843, 2000381, -5203890, 7905424, 3719979, -3568581, --8815420, -930934, 1110786, 10026601, -3619584, 8611409, 2276870, -155693, 680752, 7715372, --1604707, -1944010, -2032593, 5473936, 11021960, 2972117, -7315403, -10030896, -14276471, 2020782, --3595425, -5949067, -3149822, -9294309, 145492, -4246112, 906775, 4649839, 4967667, -5244692, --4600984, -3289945, 821413, -7865696, -647466, 2615098, -3386045, -1187022, 1083406, 3355980, --4237522, 1308354, 10830297, -299574, -236223, -3752728, 4690641, -1814624, 694174, 3508988, -4697621, 6656663, -697395, 1122597, -1596654, 83752, -726386, 1040993, 10563472, -11084774, -694711, 2401961, 6477348, -2265595, -2462627, -407485, -2244121, 8402567, -3831111, -10287520, --18790, -2746095, -3628174, 3215320, -9535364, -16432545, 6243809, -5088463, 6999186, -6145562, --484258, 4863514, -9467182, -1567663, 2994129, -2527588, 13996225, -5766531, -1677722, -5498632, --4569845, 7217693, 8038032, 3146601, -9275519, -11234561, 10544145, 1822140, -10500658, 4026532, -484258, 5082020, -3045669, 4852776, -6240051, 3160559, 10333154, 4298726, 4486630, 2394981, -286152, -2532420, 2247342, 872415, -6869264, 192737, -2097555, -5051956, -4998268, -1864016, -4169340, -7278896, 1136019, -5239323, -409096, -722628, 2573759, 4463008, 9397925, 3367791, -107911, 4084514, -4769025, -7150584, 56908, 1828046, 959925, 8935679, -1773285, -901943, --2555506, -1042066, 1542430, 4507032, -808528, 2081985, -3920768, 7495255, -1267015, -1952063, --664109, -8627516, -2298881, -5733245, -918586, 10581726, 6635188, 4514011, -1202591, -10030896, -977642, -6733972, -10593000, -3783866, 6991670, -6168110, -9433896, 1971927, 410706, -4917201, -601295, 4755066, 1052804, -12494597, -3794067, 7180112, 8575976, 4041564, -10386305, -4059281, -4191888, -2138894, -2530273, 209917, 2976949, 92879, 860604, 9822590, -361851, 5753109, -4434017, -552977, -5016522, -598611, -3123515, 5630702, -3901978, -6356015, -389768, 9089225, -129923, 9009768, 4730907, 366683, 5745593, -1621887, 12825846, 465467, 6113886, 6842420, -232465, -6842420, -1423245, -8092256, 3280818, -6039261, -3488050, -5675800, -3766686, -3195993, -1846299, -104153, 3021510, -1170916, -4934381, -4825933, 500364, 5342940, 9993852, -14965814, --2756832, 12495134, -6210523, 2257005, -9649718, 4216048, 17633526, -2430952, 957241, -801011, --12410845, 940598, -751082, 18617610, -5848672, -995896, 8227547, -5240934, 11649562, -7909183, --1093606, -11916924, 13434121, 66572, -5163625, 42413, 4991826, -6345278, 9392020, -1134408, -8346195, -217433, 4439923, -13076565, -8165807, -6203007, -1781875, 7587597, -11531987, 6047314, -5010080, 1412507, -4650376, -7286412, 16291885, 2947421, -1599339, 5975374, -5439576, 3101503, --7301982, -7729331, -2809446, -5307506, 17683990, 4849018, -3107409, -5523865, -6246493, 5076115, -4933844, 1232119, -5636071, -1183800, -1933272, 6957847, 1303523, 5514201, -13267691, 7123204, --274341, -117575, -244813, 2091112, -3854196, -311385, -1649804, 5861557, 2653753, 4745939, -1081795, -416612, -2447595, -8488466, -2953327, -5649493, 2688650, -790811, 11576011, -10612864, --13496935, -3799436, 3587908, -4578972, -3626026, 9727027, 1581085, -6189585, -7001871, -7299297, -10727218, -6193343, 7093139, -4206384, 7804493, -8829379, 1334661, 12153684, 3867618, -17917530, -3500935, -200790, -2714419, -2144799, 1283122, -2684355, 1183264, -3454228, 885300, -1341104, --8255464, 7110319, 7450158, -3039226, 8304320, -8206072, -1823214, -2867428, -4108136, 8988293, --7517267, -13124346, -7474854, 1560684, -10640245, -10208064, -5251672, -4012573, -7022809, -1417339, -7723962, 7793755, 772557, 8405251, 2379949, 165356, 6583111, -8866960, -1833414, -1488206, -19488414, -9390409, -9020505, 6370510, 15882789, 3193845, 14328011, 8207146, 13035763, 5818070, --2209761, -5716602, 4801774, -9494025, -7100118, 10824391, 9180493, 22500260, -359704, 3202972, --8075613, 8731669, 4151086, -9918690, -2131378, 12749074, 200253, -13931800, -5399848, -7851200, --2423972, 7828652, 7423851, -5283884, -2305324, 9736691, -9154186, 4326643, 8476118, 9781788, --4944044, 8405251, -3271155, -12775917, 4798016, 11636140, -2819646, 3307125, 3169686, -4046933, -1750736, 3402688, -3303904, 1185948, 9805410, -5712307, -2600066, 8579734, -1520418, -1946157, --14125611, -5333813, -8375186, -14610942, -9298604, 6953552, -4314295, -6446209, 12873091, 12116103, --2707977, 13008919, 5837398, 8356933, -1978906, -7428146, 5977521, -9786083, -10461467, 14105209, --2373506, 32260036, -13316546, -6302328, -751619, 7827578, -4509179, -4461398, -13309030, -15467251, -6955163, 1257889, 21259552, 6798397, -2164127, -2524904, 14126684, 14305462, -11902428, 8531416, --11368778, 2858838, -4892505, -6010807, -3485366, 2260764, -1846299, 7311108, 3754338, 8185134, --1046361, -4209068, -7873749, -1752884, 9142912, 569083, -12186970, -1804423, 2929705, -5494337, -9596031, 7817378, 1639604, 2477659, -26636314, -10565083, 9194451, -1048509, 14799384, 3693135, -16669305, -2404645, -9262097, 8402567, -5291400, 5484673, 839666, 23772644, 19942606, 1584843, -5355824, -4256850, 7594039, 7479686, 8671002, 8734890, 15538118, -1804960, 2035278, -8116952, --6539088, 2536178, -8998493, -22841172, -28036472, 22135188, -637266, 2531883, -7772280, 12427488, --26629870, -17035450, -5390721, -6797860, -656056, -23820962, 4661114, 548682, -652298, -10829760, --11103564, 4598300, 15204184, 2454037, -20302848, -4287451, -16619376, 13259101, 8483634, 805843, --7342784, -3316252, -3731253, 11005854, -1505923, -11274, -2293513, -14476187, 7707856, 10567230, --6083285, -3007014, 8121783, -15693274, -11542188, -17313014, -5834713, 4828080, -11085847, -4955319, --265214, -17821430, 5842766, 11799886, 20271708, 3446175, -1632088, 1857037, -12724377, -9604621, -15775952, -316754, -5243082, -2751464, -22737556, -11598559, 5382668, -3863323, -1773285, -598611, -16475495, -1252520, -13138842, 2798708, 13116830, 1642288, -4858145, 2232309, 3840775, -2914135, --6191732, 3593814, 15702937, 14514305, 5795522, 23993834, -9487583, -3905736, 4573604, -5122286, --959925, 8486319, 25559888, -3032784, 5834176, 823023, -721018, 586800, 28084792, -12209518, -14951855, 888521, -17109002, 6987912, -16969416, -9771051, 11039677, -8250632, 8038568, 1517734, -1762547, 13381507, 10577431, -13523241, -15884400, -11315091, -3411278, 6007586, 5603322, 3071975, -4096862, -18717468, 3870839, -9406515, -24409910, 18562848, -4142496, 17580912, 18100602, 2471754, -7301982, -7694434, -10360535, -18284212, 5456219, 19848654, 4132832, -6288369, 2030446, -2244657, -3782793, -8835821, -7714835, -8725226, 2942590, 770410, -2318746, 13928042, 11809549, 8701067, -18459770, 4464082, -16469052, 26023744, -15284715, -2057289, -2369748, -297963, 22138408, 24900610, -6554120, -43995496, 2588792, 13716515, -13888850, 10060424, 18959060, 1909650, 5848672, 12397423, -9693204, 4435628, 17126718, 4727149, -1291711, 31453120, 12256226, 5056250, 14083735, -8943196, -17060146, -10180146, -40265, -149787, -2781528, -15523622, 6527277, -10637023, 22588306, -761820, --3318936, 33003602, 5187247, 5851893, 11526082, 2413772, 7039452, -5909875, -12932683, -331786, -10296110, -15159624, 19997368, 18486612, 13638669, 4628901, 8503498, -10029822, -10845329, -17362406, --7313256, -8728984, -8664560, 5840082, -857920, -16900160, -7162395, 17557290, 690953, -13630616, -9533217, 681826, -9334575, -22972170, 2650532, -35570384, 22513144, -10981158, 20454782, 2709051, -6037651, 2488397, -7384660, 11767137, 30517890, 11869142, 8711804, 23960012, -34206732, 12717935, --20222854, 16234976, -8841727, -14772540, -4504884, -16937204, -7280507, -4288525, 5489505, 6847252, --5136781, 22877144, -1461900, -4750771, -3491809, -22046068, -2665027, -631360, -18231062, 5027259, --15559593, -20045150, -6466074, 10871636, -32154272, -22461068, -14658723, 875636, -22533546, -19813222, --15505906, -8530879, -6300180, -3731253, -15151571, 15398531, 2813741, -2372433, -11218455, -12421582, -22031034, -19847580, -12839805, 4959614, 6086506, 7080791, -10752987, -16172162, -6114960, -3626563, -7631620, -11808476, -3886409, -5259188, -12554189, -23219666, -27697170, 26240640, -28604482, -2279554, -3111704, -5737540, -4267050, -26897770, 11586211, -6780680, -26059714, -998043, -4211216, 25782152, -8640400, 18530636, -30390114, 34283504, 5124970, 3055332, -6364068, 17147656, -107374, 28512140, --8214125, 19372450, 10446971, -29175712, 12141336, 4097936, 13342316, -2969970, -7845832, -12062416, --4401805, 13272523, 30565672, 2511482, -4669167, -20241644, 7186554, -21870510, -3476239, 20375324, --19325206, -881005, 1227287, -4272956, -7356205, -9172976, 33982856, -8425115, -8470212, -5249524, -7637526, 10258529, 4194573, -672699, -7038915, -1404991, 5005785, 19334332, -4857608, 28176596, -17202418, 7295539, -7255274, 24203752, 29194504, -4132832, -7959112, -3359201, -9762998, 984621, --9720585, 12739410, 4706748, 19120658, 16057809, -28489054, -29964914, 32742684, 25543782, 1398549, --5883032, -17019344, -20566450, -10896332, 18257906, -22382686, -22568980, -6995428, -9146133, -31875636, -14430016, -13521094, -5011153, -3581466, 2103460, -448287, -19852950, -55756192, 26537530, -27295590, -9814537, 38193532, 5044976, -17326972, 10361609, 12704513, -6622303, -13335873, -3505230, -27941984, -7988103, -29007672, -17977122, 10332081, 234613, 3918621, -26292716, -6109591, -19236622, -16496969, --23517630, -8841190, 6816650, -14418205, -14578193, 12306155, 917512, -2091649, 3309272, -26974542, --2507187, -21208548, 16404628, 3764539, -50362248, 11436424, 25627532, -6704981, 14943265, 12250857, -8125005, 6123013, 24480776, 18747532, -86436, -19252728, -4622459, 18898930, 12263742, -17999672, -494458, -20870320, -6984691, 15569, 13634911, 17678086, -35505420, -29130078, -15896748, 1385664, --10682121, -5529771, 32423782, 3544959, 7670812, 23548232, -11014444, 5651640, 19289234, 18664854, --29474750, 7497403, -5435818, -6976638, -5938329, 21599390, 12103755, -13935558, -7334194, 16704738, --26927298, 2615635, 11499775, 16706886, -2069637, 4467303, -31568546, 855772, -13240847, 11959873, -5381594, 19195820, -27539330, -13635984, -2816962, 4499515, -1075352, 6568616, 3505767, 16680579, -31180926, -17908940, -22810572, 7299834, -23804856, -6579353, 12160126, -17530982, -16301012, 2367601, -12640626, 16335908, 12632036, -6048925, 139050, -31390842, -20008642, 29483876, -18092012, 39498128, --14562623, 8717173, 7534447, 543850, -26472568, 36435280, -14584098, -2522220, -4341138, 14747307, -28937342, -26255136, -13199508, 32687386, -21234318, 819265, -6449967, 7375533, 39430484, 1083942, -91268, -21912386, 31288836, -8286603, 10663867, 7905961, 1970853, 18016850, -19694036, 6047314, -16967806, 16915728, 37611028, -23201414, 34547644, -5501316, -22177064, -21393232, 5873905, 14907295, --9715753, -3954591, -15268609, -5698348, 29177324, -19787988, -1780264, 24067922, -7453379, 14695231, --9256728, -3641596, 24779814, -31139, 1261110, 24767466, 16517370, 6776922, -3011309, 21147882, -27426050, -27029302, 25730076, -23702314, 12929462, -16750909, 3516505, 22536230, 7027104, -47170552, -21191906, 15105400, -522912, 25996900, -38871600, -5895380, 25680684, 23900956, 3191698, 36748276, --19204946, 2314987, -5140002, -3329674, 14263586, 8474507, 25385942, 24351390, -17299592, 17291538, --31431644, -6260452, 1304060, 2081985, -3611531, -687732, -48980880, -21124260, -38271380, -18468896, -25765508, -8110509, -4491462, 16559246, -11991012, 11466489, 29496224, -16365436, 11338714, 14542759, --21375516, 2684892, -26279294, 9916006, -2893197, -14012868, 20646982, 556198, 32253056, -2043868, --24358370, 40909028, -7509214, 4018479, 5495948, -38533372, 11401528, 33013802, 11610907, -14490146, --25393458, 2509872, 5907728, 28181428, 18000744, -9370545, -5785858, -22214644, -93952, 31847720, --43866112, 13008919, 30072824, -27611808, 9654013, 2583960, 10122164, 31745178, 10232223, 12034498, --6441377, -31833760, 32021666, -6469295, -17253420, 67826120, 32955284, 16887274, 2281702, 939524, --32911798, -27048094, -12789876, 19292456, -1587527, -19548544, -14147622, 24298240, -16531329, 16258062, -8765491, -13889387, 17441862, 6918656, -28275918, -15431817, -17001628, 2150168, 16235513, -36690832, -11680700, 41966664, 69909720, -11537356, -2172717, -57137024, -19027242, -42008540, -27848568, 39034812, -2985002, 10624675, -32145146, 10513006, -28171228, -64019172, 9628243, 30736934, -2214593, 3944928, -33463164, -43943956, 50485728, 24907590, 16052977, -24915106, 34132640, 64856692, -12435004, 19965156, -49844708, 41522672, 74056512, 15826954, 26985280, 19840602, 18537078, 62957780, -15735686, -7687455, -24012626, 13623099, -6059662, 34505768, 2954938, 7086159, -19672024, -56622700, 3192235, 37366216, -6813429, 22520124, -39517996, 2250563, -52832928, -192737, -56757456, 3691525, 42324756, -5508296, --15644955, -55813636, 74512312, 12802761, 6990060, 74778064, 1503775, -17702244, -9910637, 3271691, -18346490, -4945655, 4308389, -7099044, -34540664, 21650930, 16773458, -19714436, -70648456, 5870147, -101004744, 16697759, -17743046, -16714939, -42546484, -27023934, 3744138, 63936492, 13265543, -38787848, --530428, 19127636, 6485938, 3582540, -1595044, 13065291, -26917634, -8672076, 17513802, 36484672, -36936720, -30128658, -9955197, 4847945, 7147900, 11046656, -34790844, 5985574, 8696235, -7452842, -29497298, 2114735, 33656976, 49103824, 25019796, 12093554, 23030688, -24068996, 26806502, -18954764, -38778184, 66123704, 23735600, -31896574, -26855894, 31365610, 13377749, 56795572, 43671764, 15033459, --7248831, -9569724, 4648229, 5455682, -15853261, 23757074, 21552682, 6210523, 52170432, 36295160, --1289027, 26695370, 29963302, 15234249, 30054034, 3949223, -43125768, -2972654, -7610682, -8048232, -56817048, 26955752, 12765717, -3056943, -17034378, -72025528, -17470854, 36042828, 18516678, 81993608, -2257005, -15111842, -40312028, -77270760, -83981104, -16562468, 32985348, 36553928, 23181012, -44372916, --56673168, -3569655, -8781061, 18498424, 54831164, 25610354, -7357279, -37557340, -48256104, -32630478, --37044, -32139240, 9211631, -27598386, -13632226, 34053720, 29554744, 23917062, 9132174, -43095164, --12605729, -41541996, -30374008, -19408958, 20334522, -8727374, 21731460, 52776020, 58409944, -29980482, -5328444, -49459768, -31852552, -26536456, -5380521, 2640331, 33280628, 31222264, 49670224, 30175904, -11542188, -31909996, -24899536, -12560095, 14865419, -49233748, 1383516, 40904196, 37197100, -18855980, -50847044, 37692632, 24301462, 38758320, -96273840, 10248866, -30537218, -42780560, 9419937, -30746060, --15760919, 37589016, 15997143, -105924632, -122119344, -132191576, -133933720, -186293664, 1904818, -57659936, --9482751, 40709848, 80600432, 108095736, 110452064, 212178896, 225792336, 186988912, 141905712, 150296480, -143065360, 64088428, -6324340, -75322456, -76608256, -123379376, -31955630, -60589104, -43015172, 8506720, --104301672, -19936702, -92111480, -14891725, -107905688, -99478960, -40687300, -80014704, 1505923, -34174516, --32833414, -57033944, -35903244, -92840552, -64632816, -27576912, -27099096, -44121124, -25638270, 6895033, --37329708, 25552372, 74017320, -42673184, 85280872, 56556668, 110681848, 114527984, 96151968, 121487984, -98255432, 165320272, 158137472, 130129456, 166019280, 146389136, 215013584, 216574256, 245936272, 194102992, -197500320, 222690832, 184506432, 232209024, 144846704, 237232512, 146835808, 4883915, -65832720, -116003848, --93619016, 0, 0, }, +5708549, -5827734, 4446902, -2529736, 1142461, -8290898, 4577899, 1128503, -279173, -1499481, +3481071, -4316442, -924492, -1751810, 3629784, -9207336, -2603287, -5244692, -2419677, 1912871, +1406602, 4478041, -7128035, 2143726, 754304, 408559, -2933463, -799938, -3810710, -486942, +-5206574, 1706713, -5771363, -512175, -4916664, -3936875, 806917, -4359392, -5549098, -6791417, +1804960, -791348, -1369021, 2682744, 1993402, -2641405, 55835, 7233799, -3696356, -2362232, +-5546414, -1621350, 3125126, 1724966, 1770600, -2612414, 2251100, -3163244, 360240, -3856881, +-432718, 253403, -4028679, -1493038, 584116, -585726, -4527970, -8455717, -3602941, -3030636, +-1060857, -237297, -1986959, -2407866, -574989, 8009041, 5094905, 83215, 188442, 6310381, +1492501, -3209414, 2062121, 4198331, -2253784, -3537979, -12737799, 654446, -4372277, 8416525, +-4318053, 4223027, 3259880, -433792, 2597382, 4676683, 1107565, 1111860, -2476586, -2741263, +-2334315, -3453691, 2845953, 1861868, -1858110, 2798708, -2117956, -2727841, -3567507, -1536525, +-2880313, 305480, -217970, -400506, 5499706, -3240553, 4434017, -1597728, -1505923, 3288334, +-2284923, 1118302, -2302103, 3612604, -1382980, -9716290, 2556043, 502511, 812286, 5129265, +2143189, 536334, -1571421, -3073049, 7971996, -4265440, 2782065, 1930588, -4027069, 3778498, +1013075, -3891777, 2664490, -4008815, -408559, -180389, 3025805, 882616, 3149285, -1238024, +-9478456, -1779190, 15497853, -7443715, 990527, -324270, -308164, 3628174, -2621541, -10895795, +-10021232, 4916127, -3070902, -811212, 2742337, 693100, 2711198, 2988760, -4691178, 2743410, +1957968, -3302830, 4171487, 6176700, -3791383, -1171989, 461172, -6401649, -2787434, 783295, +7967165, -1132798, -267899, -6374805, 4022237, 129923, -5650030, -2363843, 2214056, -755914, +1325534, -4911832, 78383, 477278, -1847373, 5524939, 1581085, 1349157, 5432597, -398358, +6999723, -2124398, -8339216, 3623879, 3632469, -2866354, -1032940, -887448, 1373316, 558883, +2726231, -1783485, 1944010, -4489315, 181999, 3293703, -4051228, -292595, 3118683, 1097901, +-1803349, 1837172, -1158031, 828392, 5115843, 2000381, -5203890, 7905424, 3719979, -3568581, +-8815420, -930934, 1110786, 10026601, -3619584, 8611409, 2276870, -155693, 680752, 7715372, +-1604707, -1944010, -2032593, 5473936, 11021960, 2972117, -7315403, -10030896, -14276471, 2020782, +-3595425, -5949067, -3149822, -9294309, 145492, -4246112, 906775, 4649839, 4967667, -5244692, +-4600984, -3289945, 821413, -7865696, -647466, 2615098, -3386045, -1187022, 1083406, 3355980, +-4237522, 1308354, 10830297, -299574, -236223, -3752728, 4690641, -1814624, 694174, 3508988, +4697621, 6656663, -697395, 1122597, -1596654, 83752, -726386, 1040993, 10563472, -11084774, +694711, 2401961, 6477348, -2265595, -2462627, -407485, -2244121, 8402567, -3831111, -10287520, +-18790, -2746095, -3628174, 3215320, -9535364, -16432545, 6243809, -5088463, 6999186, -6145562, +-484258, 4863514, -9467182, -1567663, 2994129, -2527588, 13996225, -5766531, -1677722, -5498632, +-4569845, 7217693, 8038032, 3146601, -9275519, -11234561, 10544145, 1822140, -10500658, 4026532, +484258, 5082020, -3045669, 4852776, -6240051, 3160559, 10333154, 4298726, 4486630, 2394981, +286152, -2532420, 2247342, 872415, -6869264, 192737, -2097555, -5051956, -4998268, -1864016, +4169340, -7278896, 1136019, -5239323, -409096, -722628, 2573759, 4463008, 9397925, 3367791, +107911, 4084514, -4769025, -7150584, 56908, 1828046, 959925, 8935679, -1773285, -901943, +-2555506, -1042066, 1542430, 4507032, -808528, 2081985, -3920768, 7495255, -1267015, -1952063, +-664109, -8627516, -2298881, -5733245, -918586, 10581726, 6635188, 4514011, -1202591, -10030896, +977642, -6733972, -10593000, -3783866, 6991670, -6168110, -9433896, 1971927, 410706, -4917201, +601295, 4755066, 1052804, -12494597, -3794067, 7180112, 8575976, 4041564, -10386305, -4059281, +4191888, -2138894, -2530273, 209917, 2976949, 92879, 860604, 9822590, -361851, 5753109, +4434017, -552977, -5016522, -598611, -3123515, 5630702, -3901978, -6356015, -389768, 9089225, +129923, 9009768, 4730907, 366683, 5745593, -1621887, 12825846, 465467, 6113886, 6842420, +232465, -6842420, -1423245, -8092256, 3280818, -6039261, -3488050, -5675800, -3766686, -3195993, +1846299, -104153, 3021510, -1170916, -4934381, -4825933, 500364, 5342940, 9993852, -14965814, +-2756832, 12495134, -6210523, 2257005, -9649718, 4216048, 17633526, -2430952, 957241, -801011, +-12410845, 940598, -751082, 18617610, -5848672, -995896, 8227547, -5240934, 11649562, -7909183, +-1093606, -11916924, 13434121, 66572, -5163625, 42413, 4991826, -6345278, 9392020, -1134408, +8346195, -217433, 4439923, -13076565, -8165807, -6203007, -1781875, 7587597, -11531987, 6047314, +5010080, 1412507, -4650376, -7286412, 16291885, 2947421, -1599339, 5975374, -5439576, 3101503, +-7301982, -7729331, -2809446, -5307506, 17683990, 4849018, -3107409, -5523865, -6246493, 5076115, +4933844, 1232119, -5636071, -1183800, -1933272, 6957847, 1303523, 5514201, -13267691, 7123204, +-274341, -117575, -244813, 2091112, -3854196, -311385, -1649804, 5861557, 2653753, 4745939, +1081795, -416612, -2447595, -8488466, -2953327, -5649493, 2688650, -790811, 11576011, -10612864, +-13496935, -3799436, 3587908, -4578972, -3626026, 9727027, 1581085, -6189585, -7001871, -7299297, +10727218, -6193343, 7093139, -4206384, 7804493, -8829379, 1334661, 12153684, 3867618, -17917530, +3500935, -200790, -2714419, -2144799, 1283122, -2684355, 1183264, -3454228, 885300, -1341104, +-8255464, 7110319, 7450158, -3039226, 8304320, -8206072, -1823214, -2867428, -4108136, 8988293, +-7517267, -13124346, -7474854, 1560684, -10640245, -10208064, -5251672, -4012573, -7022809, -1417339, +7723962, 7793755, 772557, 8405251, 2379949, 165356, 6583111, -8866960, -1833414, -1488206, +19488414, -9390409, -9020505, 6370510, 15882789, 3193845, 14328011, 8207146, 13035763, 5818070, +-2209761, -5716602, 4801774, -9494025, -7100118, 10824391, 9180493, 22500260, -359704, 3202972, +-8075613, 8731669, 4151086, -9918690, -2131378, 12749074, 200253, -13931800, -5399848, -7851200, +-2423972, 7828652, 7423851, -5283884, -2305324, 9736691, -9154186, 4326643, 8476118, 9781788, +-4944044, 8405251, -3271155, -12775917, 4798016, 11636140, -2819646, 3307125, 3169686, -4046933, +1750736, 3402688, -3303904, 1185948, 9805410, -5712307, -2600066, 8579734, -1520418, -1946157, +-14125611, -5333813, -8375186, -14610942, -9298604, 6953552, -4314295, -6446209, 12873091, 12116103, +-2707977, 13008919, 5837398, 8356933, -1978906, -7428146, 5977521, -9786083, -10461467, 14105209, +-2373506, 32260036, -13316546, -6302328, -751619, 7827578, -4509179, -4461398, -13309030, -15467251, +6955163, 1257889, 21259552, 6798397, -2164127, -2524904, 14126684, 14305462, -11902428, 8531416, +-11368778, 2858838, -4892505, -6010807, -3485366, 2260764, -1846299, 7311108, 3754338, 8185134, +-1046361, -4209068, -7873749, -1752884, 9142912, 569083, -12186970, -1804423, 2929705, -5494337, +9596031, 7817378, 1639604, 2477659, -26636314, -10565083, 9194451, -1048509, 14799384, 3693135, +16669305, -2404645, -9262097, 8402567, -5291400, 5484673, 839666, 23772644, 19942606, 1584843, +5355824, -4256850, 7594039, 7479686, 8671002, 8734890, 15538118, -1804960, 2035278, -8116952, +-6539088, 2536178, -8998493, -22841172, -28036472, 22135188, -637266, 2531883, -7772280, 12427488, +-26629870, -17035450, -5390721, -6797860, -656056, -23820962, 4661114, 548682, -652298, -10829760, +-11103564, 4598300, 15204184, 2454037, -20302848, -4287451, -16619376, 13259101, 8483634, 805843, +-7342784, -3316252, -3731253, 11005854, -1505923, -11274, -2293513, -14476187, 7707856, 10567230, +-6083285, -3007014, 8121783, -15693274, -11542188, -17313014, -5834713, 4828080, -11085847, -4955319, +-265214, -17821430, 5842766, 11799886, 20271708, 3446175, -1632088, 1857037, -12724377, -9604621, +15775952, -316754, -5243082, -2751464, -22737556, -11598559, 5382668, -3863323, -1773285, -598611, +16475495, -1252520, -13138842, 2798708, 13116830, 1642288, -4858145, 2232309, 3840775, -2914135, +-6191732, 3593814, 15702937, 14514305, 5795522, 23993834, -9487583, -3905736, 4573604, -5122286, +-959925, 8486319, 25559888, -3032784, 5834176, 823023, -721018, 586800, 28084792, -12209518, +14951855, 888521, -17109002, 6987912, -16969416, -9771051, 11039677, -8250632, 8038568, 1517734, +1762547, 13381507, 10577431, -13523241, -15884400, -11315091, -3411278, 6007586, 5603322, 3071975, +4096862, -18717468, 3870839, -9406515, -24409910, 18562848, -4142496, 17580912, 18100602, 2471754, +7301982, -7694434, -10360535, -18284212, 5456219, 19848654, 4132832, -6288369, 2030446, -2244657, +3782793, -8835821, -7714835, -8725226, 2942590, 770410, -2318746, 13928042, 11809549, 8701067, +18459770, 4464082, -16469052, 26023744, -15284715, -2057289, -2369748, -297963, 22138408, 24900610, +6554120, -43995496, 2588792, 13716515, -13888850, 10060424, 18959060, 1909650, 5848672, 12397423, +9693204, 4435628, 17126718, 4727149, -1291711, 31453120, 12256226, 5056250, 14083735, -8943196, +17060146, -10180146, -40265, -149787, -2781528, -15523622, 6527277, -10637023, 22588306, -761820, +-3318936, 33003602, 5187247, 5851893, 11526082, 2413772, 7039452, -5909875, -12932683, -331786, +10296110, -15159624, 19997368, 18486612, 13638669, 4628901, 8503498, -10029822, -10845329, -17362406, +-7313256, -8728984, -8664560, 5840082, -857920, -16900160, -7162395, 17557290, 690953, -13630616, +9533217, 681826, -9334575, -22972170, 2650532, -35570384, 22513144, -10981158, 20454782, 2709051, +6037651, 2488397, -7384660, 11767137, 30517890, 11869142, 8711804, 23960012, -34206732, 12717935, +-20222854, 16234976, -8841727, -14772540, -4504884, -16937204, -7280507, -4288525, 5489505, 6847252, +-5136781, 22877144, -1461900, -4750771, -3491809, -22046068, -2665027, -631360, -18231062, 5027259, +-15559593, -20045150, -6466074, 10871636, -32154272, -22461068, -14658723, 875636, -22533546, -19813222, +-15505906, -8530879, -6300180, -3731253, -15151571, 15398531, 2813741, -2372433, -11218455, -12421582, +22031034, -19847580, -12839805, 4959614, 6086506, 7080791, -10752987, -16172162, -6114960, -3626563, +7631620, -11808476, -3886409, -5259188, -12554189, -23219666, -27697170, 26240640, -28604482, -2279554, +3111704, -5737540, -4267050, -26897770, 11586211, -6780680, -26059714, -998043, -4211216, 25782152, +8640400, 18530636, -30390114, 34283504, 5124970, 3055332, -6364068, 17147656, -107374, 28512140, +-8214125, 19372450, 10446971, -29175712, 12141336, 4097936, 13342316, -2969970, -7845832, -12062416, +-4401805, 13272523, 30565672, 2511482, -4669167, -20241644, 7186554, -21870510, -3476239, 20375324, +-19325206, -881005, 1227287, -4272956, -7356205, -9172976, 33982856, -8425115, -8470212, -5249524, +7637526, 10258529, 4194573, -672699, -7038915, -1404991, 5005785, 19334332, -4857608, 28176596, +17202418, 7295539, -7255274, 24203752, 29194504, -4132832, -7959112, -3359201, -9762998, 984621, +-9720585, 12739410, 4706748, 19120658, 16057809, -28489054, -29964914, 32742684, 25543782, 1398549, +-5883032, -17019344, -20566450, -10896332, 18257906, -22382686, -22568980, -6995428, -9146133, -31875636, +14430016, -13521094, -5011153, -3581466, 2103460, -448287, -19852950, -55756192, 26537530, -27295590, +9814537, 38193532, 5044976, -17326972, 10361609, 12704513, -6622303, -13335873, -3505230, -27941984, +7988103, -29007672, -17977122, 10332081, 234613, 3918621, -26292716, -6109591, -19236622, -16496969, +-23517630, -8841190, 6816650, -14418205, -14578193, 12306155, 917512, -2091649, 3309272, -26974542, +-2507187, -21208548, 16404628, 3764539, -50362248, 11436424, 25627532, -6704981, 14943265, 12250857, +8125005, 6123013, 24480776, 18747532, -86436, -19252728, -4622459, 18898930, 12263742, -17999672, +494458, -20870320, -6984691, 15569, 13634911, 17678086, -35505420, -29130078, -15896748, 1385664, +-10682121, -5529771, 32423782, 3544959, 7670812, 23548232, -11014444, 5651640, 19289234, 18664854, +-29474750, 7497403, -5435818, -6976638, -5938329, 21599390, 12103755, -13935558, -7334194, 16704738, +-26927298, 2615635, 11499775, 16706886, -2069637, 4467303, -31568546, 855772, -13240847, 11959873, +5381594, 19195820, -27539330, -13635984, -2816962, 4499515, -1075352, 6568616, 3505767, 16680579, +31180926, -17908940, -22810572, 7299834, -23804856, -6579353, 12160126, -17530982, -16301012, 2367601, +12640626, 16335908, 12632036, -6048925, 139050, -31390842, -20008642, 29483876, -18092012, 39498128, +-14562623, 8717173, 7534447, 543850, -26472568, 36435280, -14584098, -2522220, -4341138, 14747307, +28937342, -26255136, -13199508, 32687386, -21234318, 819265, -6449967, 7375533, 39430484, 1083942, +91268, -21912386, 31288836, -8286603, 10663867, 7905961, 1970853, 18016850, -19694036, 6047314, +16967806, 16915728, 37611028, -23201414, 34547644, -5501316, -22177064, -21393232, 5873905, 14907295, +-9715753, -3954591, -15268609, -5698348, 29177324, -19787988, -1780264, 24067922, -7453379, 14695231, +-9256728, -3641596, 24779814, -31139, 1261110, 24767466, 16517370, 6776922, -3011309, 21147882, +27426050, -27029302, 25730076, -23702314, 12929462, -16750909, 3516505, 22536230, 7027104, -47170552, +21191906, 15105400, -522912, 25996900, -38871600, -5895380, 25680684, 23900956, 3191698, 36748276, +-19204946, 2314987, -5140002, -3329674, 14263586, 8474507, 25385942, 24351390, -17299592, 17291538, +-31431644, -6260452, 1304060, 2081985, -3611531, -687732, -48980880, -21124260, -38271380, -18468896, +25765508, -8110509, -4491462, 16559246, -11991012, 11466489, 29496224, -16365436, 11338714, 14542759, +-21375516, 2684892, -26279294, 9916006, -2893197, -14012868, 20646982, 556198, 32253056, -2043868, +-24358370, 40909028, -7509214, 4018479, 5495948, -38533372, 11401528, 33013802, 11610907, -14490146, +-25393458, 2509872, 5907728, 28181428, 18000744, -9370545, -5785858, -22214644, -93952, 31847720, +-43866112, 13008919, 30072824, -27611808, 9654013, 2583960, 10122164, 31745178, 10232223, 12034498, +-6441377, -31833760, 32021666, -6469295, -17253420, 67826120, 32955284, 16887274, 2281702, 939524, +-32911798, -27048094, -12789876, 19292456, -1587527, -19548544, -14147622, 24298240, -16531329, 16258062, +8765491, -13889387, 17441862, 6918656, -28275918, -15431817, -17001628, 2150168, 16235513, -36690832, +11680700, 41966664, 69909720, -11537356, -2172717, -57137024, -19027242, -42008540, -27848568, 39034812, +2985002, 10624675, -32145146, 10513006, -28171228, -64019172, 9628243, 30736934, -2214593, 3944928, +33463164, -43943956, 50485728, 24907590, 16052977, -24915106, 34132640, 64856692, -12435004, 19965156, +49844708, 41522672, 74056512, 15826954, 26985280, 19840602, 18537078, 62957780, -15735686, -7687455, +24012626, 13623099, -6059662, 34505768, 2954938, 7086159, -19672024, -56622700, 3192235, 37366216, +6813429, 22520124, -39517996, 2250563, -52832928, -192737, -56757456, 3691525, 42324756, -5508296, +-15644955, -55813636, 74512312, 12802761, 6990060, 74778064, 1503775, -17702244, -9910637, 3271691, +18346490, -4945655, 4308389, -7099044, -34540664, 21650930, 16773458, -19714436, -70648456, 5870147, +101004744, 16697759, -17743046, -16714939, -42546484, -27023934, 3744138, 63936492, 13265543, -38787848, +-530428, 19127636, 6485938, 3582540, -1595044, 13065291, -26917634, -8672076, 17513802, 36484672, +36936720, -30128658, -9955197, 4847945, 7147900, 11046656, -34790844, 5985574, 8696235, -7452842, +29497298, 2114735, 33656976, 49103824, 25019796, 12093554, 23030688, -24068996, 26806502, -18954764, +38778184, 66123704, 23735600, -31896574, -26855894, 31365610, 13377749, 56795572, 43671764, 15033459, +-7248831, -9569724, 4648229, 5455682, -15853261, 23757074, 21552682, 6210523, 52170432, 36295160, +-1289027, 26695370, 29963302, 15234249, 30054034, 3949223, -43125768, -2972654, -7610682, -8048232, +56817048, 26955752, 12765717, -3056943, -17034378, -72025528, -17470854, 36042828, 18516678, 81993608, +2257005, -15111842, -40312028, -77270760, -83981104, -16562468, 32985348, 36553928, 23181012, -44372916, +-56673168, -3569655, -8781061, 18498424, 54831164, 25610354, -7357279, -37557340, -48256104, -32630478, +-37044, -32139240, 9211631, -27598386, -13632226, 34053720, 29554744, 23917062, 9132174, -43095164, +-12605729, -41541996, -30374008, -19408958, 20334522, -8727374, 21731460, 52776020, 58409944, -29980482, +5328444, -49459768, -31852552, -26536456, -5380521, 2640331, 33280628, 31222264, 49670224, 30175904, +11542188, -31909996, -24899536, -12560095, 14865419, -49233748, 1383516, 40904196, 37197100, -18855980, +50847044, 37692632, 24301462, 38758320, -96273840, 10248866, -30537218, -42780560, 9419937, -30746060, +-15760919, 37589016, 15997143, -105924632, -122119344, -132191576, -133933720, -186293664, 1904818, -57659936, +-9482751, 40709848, 80600432, 108095736, 110452064, 212178896, 225792336, 186988912, 141905712, 150296480, +143065360, 64088428, -6324340, -75322456, -76608256, -123379376, -31955630, -60589104, -43015172, 8506720, +-104301672, -19936702, -92111480, -14891725, -107905688, -99478960, -40687300, -80014704, 1505923, -34174516, +-32833414, -57033944, -35903244, -92840552, -64632816, -27576912, -27099096, -44121124, -25638270, 6895033, +-37329708, 25552372, 74017320, -42673184, 85280872, 56556668, 110681848, 114527984, 96151968, 121487984, +98255432, 165320272, 158137472, 130129456, 166019280, 146389136, 215013584, 216574256, 245936272, 194102992, +197500320, 222690832, 184506432, 232209024, 144846704, 237232512, 146835808, 4883915, -65832720, -116003848, +-93619016, 0, 0, }, }, { { -3456375, --2316598, -3061238, -3729642, -3496640, 3483755, -8136279, 923418, -1453310, -2848637, 7288560, --2356863, -2164127, 4657892, 719407, -3473018, 1116155, -1416266, 1225676, 949188, -588411, -3830037, -1297617, -4027069, -345208, 1193464, 1972464, 2501819, 62814, 1534914, -1029718, -5698348, 3857418, -4274030, -2419677, -2046552, 1655710, -3001109, -3505230, 4099546, -1772748, --69256, -380641, 1111323, 3718368, 3384434, -1574642, -996969, 2645163, 1229434, 806917, -283468, 2208687, -3189013, -2115808, 200790, 1901060, -2298344, 1586990, -4053912, -265751, -2793339, 2028298, -1389959, 2391223, 278099, 3365644, 1217086, -1560147, 4572530, 6152004, -2249489, -1038845, -477815, -2959233, 5129265, -333397, 2035815, 711891, -4708895, -3576634, -1081258, -3235721, -4732517, 2507187, -661962, 560493, -2763812, 1818919, 74625, -4219269, --298500, 4589710, 3723737, -3068754, -5286031, -4849555, 584116, -1221918, -1033477, -4150012, -4258460, -1300301, 1123134, -1970853, -1218160, -542777, 1550483, -1332514, -2404645, -8955544, -2891050, -818728, 2742874, 1537061, 1093606, -383863, 5770826, 944893, 1072131, 657130, --3105798, -2087891, -379031, 260919, -3107946, -886911, 1071058, -593779, -2942590, -1682554, -3758, 2586644, -4453881, -6103686, -7419019, 2379949, 4083977, 202400, 3353833, 2306934, -366146, -6961605, -310311, -2038499, -2513630, -209917, 164819, 2367601, -918049, 3085934, -4058744, -1040456, -147103, -6015639, 5197448, -6876243, 2528662, 11365557, -2551748, -4337917, -547071, 5895917, 529892, -1772748, -935229, -1783485, -1193464, -5448703, -2207613, 2583423, --4386772, -2508798, 124554, -301185, 4599373, -2943663, 758599, -1175210, 905701, -657667, --2885144, 5171141, 8758512, 2199023, -639950, -1717450, 9483825, 399969, -4162360, 223338, --7316477, -16643, 3600256, -5546951, -846645, 1144072, -4547834, -1358283, 4914517, 689342, --697932, 4860293, -3408594, -5167383, 2753074, 1907502, -3748433, -1799054, -4002373, -4522064, --5003637, -2694555, -2923799, 3921842, 2651069, 765578, -242129, -2726767, 2420214, -585726, --1925756, 3341485, 3699041, 5826123, -8546448, -5646272, -2054068, -1257352, 261993, 1080721, --8155606, 5630702, -2596845, 1832877, 1132261, 1868848, 3517578, -32749, -1211181, -2710124, -5814849, -465467, 3765613, 7225209, -1607392, 6146098, 5199595, -4538170, 2994129, 3080565, -3252364, -8005819, -842887, 492848, -2567854, -5025112, 28454, 5904507, -1432909, -2495376, --2032593, 1828046, 5399848, 2727304, -2844879, -8590, -2358474, 274878, -794032, -2670396, -5029407, -6529961, -5509370, -4935991, 1473174, -633508, -256087, -6065568, -6568079, 1666984, --223875, 464930, -733366, -234613, -4944581, -2740726, -5407364, 1181653, 4411469, -1247688, -3881577, 950798, 3409667, -7493644, -173409, 1421097, -2843268, -737661, 678605, -2716567, -922344, -379568, 5217849, 8192113, 702227, -2824478, -6595459, 3319473, 2206003, 2098629, -8642548, -5311264, 377957, 1248225, -1353989, -2545842, 1425929, 754304, 5267778, 11469173, --824097, 2170032, 4863514, -1814624, 4350802, 7534983, -4951024, 35970, -1756105, 120796, -3398930, -5467494, 6283537, 1598802, 196495, 3469797, -416612, 4716948, -2325725, -809601, --1164473, 7278359, 3377992, 4715337, -772020, 3922379, -6779069, 8132521, -3008625, 3326989, --7166153, 3118683, 5259725, 9851044, 3552475, 1999844, -6355478, -2241436, 1724966, -4626217, --5767068, -1190243, 11319923, 13346611, 2424509, 3229279, -3906273, -1582159, 7202660, 1482301, -3011309, -477815, 1981054, 1819992, 5907728, 504659, 1027571, 8167954, -6251862, -7376070, -12388833, -2749316, -1620276, 8279087, 5029944, 981400, -13547401, 15367930, -2445984, -1470489, --1282585, -383326, 877784, 1368484, 4955856, 7435126, 4871030, -530965, 8098698, 5451924, -2780991, 2607045, -2619393, 4089883, -5370857, 5027259, -603980, 2431488, -4512400, -6356552, -1139777, -288300, 2790655, 4785668, -1807644, -5997385, -3617973, 2287607, -7703024, 5824513, -1852742, -11975979, 5990406, 1617055, 3542274, 1595580, 2244121, 2963528, -236760, -2727841, --2812667, -7763691, -6051609, -2589865, -4091493, 25233, 872952, -5273683, -8578660, -199179, -6268505, 11275900, -17717, -5366025, 1688996, -9075803, 1416266, 877247, -3269544, 10642929, --13427142, 7191386, -2430952, -4665945, -3673271, -4454418, -6301791, 12630962, -15704548, 3919695, -3991635, 5371394, 7909183, 1457068, 2309619, 3106335, 2255395, 1805497, 2780991, 7015829, -1385664, -3558381, 147103, -457951, -4730370, -4212826, 2415382, 4779762, 5073967, 881005, -3662533, -8046085, -804233, 106300, -296890, -7602629, -4530654, -2584497, 5282273, 4836133, -84826, -8323110, 216896, -4386772, -3149285, -1421097, -2127083, 5657546, 7511361, 2507724, -7814156, -11899744, -8317204, 4364224, 2703145, 737124, 1839320, 1137630, -3710852, -7310035, --5037997, 4451197, -3148211, 6633577, 6439767, -1776506, 6156836, -8724152, -4158602, -2017024, --2638721, 1366873, 17391934, -1532230, 5517423, -1379758, 14082124, -2492155, 555125, 6040872, --13064217, 9287330, 4782446, -7267085, 8446590, 9462350, 3272765, -14088566, 8994198, 590021, --1191853, 7444789, 7968238, -228170, -2157147, 448824, -5398774, 5416491, -2887829, -5053029, --10975789, 2834679, -11944841, 3489124, -2825552, -1100049, 3617973, -9586904, -3915400, 8453569, --587874, -3546032, 5134634, 617938, -4175782, 4003447, 1462436, 671089, -1727651, 3146601, --5882495, -296353, -8644695, 8629663, 8385387, -9944997, 6991133, -6971806, -2678449, 7521562, -10048076, -294742, -4868883, 3463891, -540092, 1921998, -12085501, -9096204, 1997697, 2294586, --2559264, -1879585, 3222299, 311385, -4251481, 5912023, -4914517, 2616709, 3775276, 163746, -5895917, -4629975, 3947075, 1779190, -4967667, 9867150, -3250217, 4858682, -9768903, -586263, --2516851, -8832600, 393526, 6440841, 11314018, 14823006, -8296266, -106300, -10362145, -648003, --6576132, 6070937, -6155762, -12164421, 861141, -7740605, -677531, 10355166, -5990943, -5878737, -11006391, 500901, 1934883, -977105, -6389301, 2908767, 2383707, 13377213, -9060770, 6659347, --7680476, 2119566, 2601677, -7418483, -4655208, 12882218, 3499862, -9206799, -2401961, -3220689, --7538205, -80531, 12448963, 6903623, 8669391, 2237141, 3480534, -11062225, -1617055, 14706505, -1165010, -8654896, 4818417, 5090073, -6549289, -5382668, -3137474, -14443438, -2240899, 4794257, -7382512, 13433584, -3155727, -6643778, -1873680, -3901441, 10936597, -3319473, 5551245, -22728430, --15906948, -10473815, 383863, -19170050, 1974611, 12899397, 3747896, 13303661, -8333847, -4263292, --2310693, -8099235, -3522947, -11770358, 18739480, 10361072, 6994354, -17288854, -3984119, -6105833, --11533598, 2911451, -1934346, 2674691, -14142790, -1729798, -2011655, -10394895, 4745402, 757525, -8952322, 3099893, -9023726, 12045773, -6946573, 4376035, 1853815, -976568, 9328132, 8600672, -1504849, -13196824, 14104673, -8507793, 9841918, 3976603, -6504728, -7141457, 11107859, 799938, --2387465, 2144799, -11200738, -4677757, 4837207, -1909650, 9593346, -7261716, -10766409, 2818572, -1558536, -857383, 9376450, 3330210, 842350, -8081518, 6301791, 1635846, -7485591, -2305861, --2421288, -5013838, -4650376, -4619238, 1335735, -13412109, 19075024, 8190503, 21737366, -9079561, --11030550, 20793010, 1089311, -1596654, 4839355, 2068027, 12260521, 16358457, 2424509, -14181445, --23218594, 3847754, -6178311, 1988570, 973884, -9640591, -364535, 13401372, 10763188, 8826158, -16772921, -3153043, 14226542, -9250823, 12600360, 4672388, 9781788, -5845988, 17072496, 10344429, -12475806, -19014894, -10737, 18451716, 10210748, 3847217, -4222490, 27451820, 11302206, -9920838, --6563247, 7148973, -10365904, -399432, -5097053, 1974611, 22298934, 24190330, 16831440, 6863895, --199179, 9437654, -8328479, -1453310, 9069360, -9524627, 23131084, 15343234, 10810433, 5030481, --2034741, -10921565, 12778601, 782221, 10582799, -5367636, 2441152, -7953743, -7920457, -413927, -683437, -9491878, 22990424, -1362578, -11428908, -5132486, -8986682, -326954, -14392435, 3745212, --12427488, 7033009, 1478543, -3257733, -9827422, -11502996, -17714056, -18118320, -5559299, 15948824, --1340567, -10159745, 4090420, -9657234, 7371775, -8200167, 14630269, -14990510, 3366718, -10539850, --11248519, -1745904, 1677185, -2911988, 6788196, -21560198, 8612483, 2485712, -5487895, -1107028, --1662689, -10394358, -17586818, -18144090, 13202729, 7153268, -7477538, 12172474, 189515, -4221416, --13874892, -28134184, -23867670, 14162655, -4270808, 1092532, -2944737, -497142, -1430224, -18577344, -7410966, -22030498, -12240657, 2171106, -591095, -3705483, -2864206, -1719061, 24142548, -5851356, --7202124, -4757213, 25679072, -2553895, -8802535, 18024904, -10524817, -5110474, -6893960, -4039417, --34293704, -25977036, -14979235, 29360396, -1800665, -5270999, -3907347, -2671470, -10053982, 10165114, -7853348, 26216480, -24770688, -5129802, 7298223, -18288508, -7419019, -6708202, 30360586, -818191, -6826314, 15198279, 1190780, 14607184, -16394427, -20731270, -13815299, -4137664, -3653944, 2029372, -9376450, -874026, -17311402, -12232604, -1044214, -9562208, -19382650, 16740709, -3017752, -10011569, --261993, 5083631, 5319854, 2776160, -8809515, 1318018, -17990008, -8261370, -26616450, 12022150, -7913477, -3572339, -8411693, 9363029, -13289166, -3810173, 28528784, -3442953, 24173150, 10418517, -6438693, -6762963, -30500174, -13062069, -5911486, -16768626, -12312597, -8156143, 13562433, -6513318, -230854, -12406550, 25848724, -9207873, 10539313, 8121783, -17507360, 19730006, 1251446, -7897908, -12957916, 8374650, 38915624, 3442416, 2492692, 15176804, -14532022, -9247065, -1223529, 5264556, -8031052, -2206540, 17648558, -7283728, 4234301, 16958142, 8662412, 7764764, 7495792, -8459475, -4112431, 2065879, -3226594, 4668630, -5784784, -11508902, -5224291, 3599720, -11682311, 20321638, -780073, 4358855, -357556, 14864345, 15896748, 66572, -8093329, 1792612, -1144072, 19073950, -23021562, -12010339, -8079371, -4592931, 7378754, 18524730, -11716671, 7725036, 1581622, 6438693, --5005785, -6383932, 5277978, 13645111, 4185983, -9110163, 13783087, 37355480, -8516383, 10158671, --95563, 6720550, 15515569, 8067023, 17950816, 17539036, -581431, 24799678, 38716444, 7209640, --9721122, 41508712, 3848291, 39932460, 424128, 8360154, -21597780, -6005975, 37648072, 7457137, --15073188, 6356015, -10995116, 6030671, 8591008, -1608465, -17381732, -5891622, -26792006, 13102335, -11579232, -9747965, 12448963, 17767742, 5279052, -3291556, -14758581, 4929549, 28625958, -11665668, -18006650, 16346646, 4463008, 12526809, 12754442, 1492501, 15439334, 9827959, -23203560, -2672007, --7984344, 26850524, 19527068, -17249126, 13511430, -1261110, 16138340, 44071196, -1588601, -6571837, -6903623, 39670464, 18650358, -1720134, 7720204, 7697655, 25315074, 20450486, -10652056, 24394878, -13959717, 22622666, -12493523, 2879239, 7712688, 5181341, 17086454, 20732344, -9589588, -10027675, -19860466, 8500277, -1409823, -5209796, 4403952, 24982214, -41136124, 11710228, -10998338, -10558640, --8827232, -8426189, 6084895, 7978976, 8300561, -9947144, -12093017, -31148176, 1489817, -17239998, -28618978, 3805341, -7421704, -3904662, 17127256, 5312338, 27799712, 11642046, -7323993, 1583232, -5760088, 13137768, 20799990, -22966264, -20489678, -3751654, 35017944, -10324565, 4234301, 10616085, -15140833, 19322520, 26447334, 23758148, 1652489, -4872104, 24593520, 2617246, -16413754, 9183177, --15308874, 11414949, 2099702, -12426414, 11446625, 47841640, 25543244, -15805480, -13310641, -870268, --13839995, -12067784, -12031814, 8979703, -7284802, -10081899, 1465658, 13903883, 6680285, 5277978, -17352742, 5974300, -5698348, 20573430, 15136538, -13034689, 8174934, -14813879, -13958107, -12956306, --1654636, -32869384, -11834782, 25156160, 15643882, -6278706, -11911555, 11500312, 9446244, -15358266, --6065031, -34460672, -1930051, 30441118, 1252520, -20680268, 4380867, 1966021, -13631689, 20633560, -12267500, -6930467, 6495065, 9902584, 13041131, 7750806, 3003256, -7718593, 5662915, 8031589, -19706920, 29146184, -6806450, -17850420, -9046275, 6444599, 6773164, 24229522, -7909183, -16987670, --13167833, -13342853, 28937880, 52461416, 19600620, 3776350, 57253524, 4617090, 24340654, 14577656, --3694209, -10492068, 11071889, -14625974, -9540196, 12794708, 1916092, -32456530, -33914136, -7283728, -15921981, -16751446, -21652540, -11008001, -15603079, -12271795, 13374528, -7914014, -24417962, 13682692, -2821257, -5464809, 8089571, -3530463, 15397995, 55414204, -29703994, 29650844, -33577516, -17144436, --8048769, -3298535, 26949310, 1219234, 29003378, 18789408, 17006996, 24739012, -27954332, 11316165, --29292750, -807991, 39336532, 34949224, 15205795, 901406, 7201050, 4746476, -10668162, 9353365, -11680700, -48654464, 3496104, 7521562, 15395310, -17643188, -27078696, 20527796, 10081362, 5429376, --11275900, 24265492, -2854006, 18907520, 16022912, -1612223, 2892124, -5199595, 19420232, -11006927, -6298033, 11551851, -458488, 24307904, 14512158, -1208496, 12919262, 14195404, -195421, -10803453, --36217312, -6709276, 4449049, -21723944, 2622078, 17366700, -32884954, -14852534, 5618891, -14435385, --1846299, 17492328, 1477469, -12660490, -15847356, 6977175, 7441568, -34120832, -10939282, -3282966, -368830, 20565378, 10482405, 1505386, 36917392, -5874442, -1734093, -293668, -22560390, -8826695, --34178276, -29754460, 6045704, -15102716, -4344897, -22849762, -28470264, -30100742, -19504520, 22181896, -30292404, 1190780, -23885386, 2320893, 1744831, 695785, 11915313, 19318762, 19600084, 807991, --11647951, -30141544, -16804060, -26362510, -5046587, 399432, 2941516, 3018288, 4457103, 7591355, -10241886, 18172006, -27442694, 12571369, 5671505, 6399502, 15874736, 26884884, 30783104, -17160542, -14157286, -23796804, -6671695, -21614422, -1311576, -8417062, 50705848, 17701170, 36761700, 1471026, --18460306, -8373576, 23842438, 24775518, -13822279, 45829984, -18471580, 2603824, 2819109, 7646116, -17675402, 50760608, -2857764, 11972758, 29174102, 5790690, -22033182, 13431973, 52799108, -10776073, --12529493, -32547800, -2878702, 16942036, 10662793, -2404108, -26386132, -4393215, -5581310, 9771051, -46251964, -2764885, -555661, 19390704, 3554086, -64617248, -20458540, 45242112, 14928769, -13778255, --25827248, -3991098, -17125108, 23124104, 12023224, 4009352, -13738527, -30823906, 6366216, -52799644, --6536940, 25198036, 34853660, -4459250, -29778618, -20646444, -61366492, 17574470, -10675678, 23589572, -18147848, -17841832, -12646531, -54817740, -40793064, 20865488, 58081916, 22745610, 27688044, -19705310, --34260416, -33453500, -13613973, 48899276, 66678292, 34257196, -76775224, -28624346, -58678380, -31933618, -73803104, 17566954, 16854526, -10005126, -69876968, -58034672, -57175680, -10993506, 6571837, 36375688, --12461311, 27666568, -54666880, 34691524, 15476378, 4151623, 72258528, 4392141, -4133906, -3676492, --92309048, -30176440, -1595580, 2339684, -29548838, 51047832, 20735028, 22397718, -67610840, 11309186, --93420904, -22014392, -2359011, 11111617, 3113851, -60325500, 29535954, -17999134, -12764106, -12763032, --14715632, -16071231, -20408610, 36639292, -13311714, -34612068, 8129300, -10971494, 1599875, 16870632, --39677980, -14903000, -4822175, 14042396, -978716, 40650792, -6220724, -25627532, 52991308, -48587892, -24786794, -45130980, -17275970, 19931870, -38392712, 1245541, 22769232, -14740865, -6114960, -3908957, -29999810, 49349176, 26014616, -18178986, -10355703, -9012452, -267362, 15197742, -10314901, -11034308, -6065568, 4315906, -95627984, -4496831, -7554848, 12646531, 6978785, 27917, -4574140, 25667262, --33967824, -7632694, -8434779, 19921668, -79947056, -9904195, 59010704, -16047072, -36714992, 1995549, -24655796, -13925358, -24046986, -68793032, -56909392, 46551004, 39276940, 2157147, 42053100, -49677204, --4786204, -94290640, -34936876, -18044768, 42790224, 39238284, 22932442, -38854960, -14959908, -3171833, --19942606, 7300908, 14032732, 19618336, 25914758, -22870164, 13519483, -41441604, -27637040, -7668127, --10832981, -209917, 24187108, -32865090, 24958054, -13400298, -19971062, -8113193, 155693, -40783936, --3317862, -36965172, -15891916, -14906758, -36673116, 46129560, 19069654, 9877351, 8954470, -9810779, --50496468, -71667968, -44097504, -42315092, 25757456, 6347425, 27947890, 42312408, 32498944, -11684459, -5793374, -24562918, -21486648, -22264574, 14950244, -23394686, -3752728, -22050898, -26039850, -13796509, -25132538, -20888574, -8754754, 4268124, -5605469, -29144574, -37287296, -15729244, 31261994, -6642167, --91781840, -127464432, -119808112, -113805360, -137735840, -16505559, -32066762, 33761128, 49643916, 138522896, -92348776, 118535728, 161130528, 175563760, 123045448, 153419984, 91435024, 46099496, 2529199, -20140176, --28879896, -54481124, -52150028, -76576584, -27040040, -23901494, -70369816, -52030844, -48015052, -57438208, --95891048, -64557116, -46489264, -37724844, -72099080, -5319317, -16132971, -27713814, -69819528, -66328792, --51490216, -45528800, -29301340, -10335839, -42168524, 18414672, 32423782, -34920232, 49780820, 63210644, -63860796, 107268952, 90803128, 67314488, 77254648, 73461120, 76421960, 109945792, 127446712, 120297736, -85701776, 128239136, 130627672, 129950680, 136406544, 148163488, 134858752, 134708432, 186687200, 82171312, -86702504, 76345728, 70924944, -44443784, -7704635, -34548180, -97089880, -62141196, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-2316598, -3061238, -3729642, -3496640, 3483755, -8136279, 923418, -1453310, -2848637, 7288560, +-2356863, -2164127, 4657892, 719407, -3473018, 1116155, -1416266, 1225676, 949188, -588411, +3830037, -1297617, -4027069, -345208, 1193464, 1972464, 2501819, 62814, 1534914, -1029718, +5698348, 3857418, -4274030, -2419677, -2046552, 1655710, -3001109, -3505230, 4099546, -1772748, +-69256, -380641, 1111323, 3718368, 3384434, -1574642, -996969, 2645163, 1229434, 806917, +283468, 2208687, -3189013, -2115808, 200790, 1901060, -2298344, 1586990, -4053912, -265751, +2793339, 2028298, -1389959, 2391223, 278099, 3365644, 1217086, -1560147, 4572530, 6152004, +2249489, -1038845, -477815, -2959233, 5129265, -333397, 2035815, 711891, -4708895, -3576634, +1081258, -3235721, -4732517, 2507187, -661962, 560493, -2763812, 1818919, 74625, -4219269, +-298500, 4589710, 3723737, -3068754, -5286031, -4849555, 584116, -1221918, -1033477, -4150012, +4258460, -1300301, 1123134, -1970853, -1218160, -542777, 1550483, -1332514, -2404645, -8955544, +2891050, -818728, 2742874, 1537061, 1093606, -383863, 5770826, 944893, 1072131, 657130, +-3105798, -2087891, -379031, 260919, -3107946, -886911, 1071058, -593779, -2942590, -1682554, +3758, 2586644, -4453881, -6103686, -7419019, 2379949, 4083977, 202400, 3353833, 2306934, +366146, -6961605, -310311, -2038499, -2513630, -209917, 164819, 2367601, -918049, 3085934, +4058744, -1040456, -147103, -6015639, 5197448, -6876243, 2528662, 11365557, -2551748, -4337917, +547071, 5895917, 529892, -1772748, -935229, -1783485, -1193464, -5448703, -2207613, 2583423, +-4386772, -2508798, 124554, -301185, 4599373, -2943663, 758599, -1175210, 905701, -657667, +-2885144, 5171141, 8758512, 2199023, -639950, -1717450, 9483825, 399969, -4162360, 223338, +-7316477, -16643, 3600256, -5546951, -846645, 1144072, -4547834, -1358283, 4914517, 689342, +-697932, 4860293, -3408594, -5167383, 2753074, 1907502, -3748433, -1799054, -4002373, -4522064, +-5003637, -2694555, -2923799, 3921842, 2651069, 765578, -242129, -2726767, 2420214, -585726, +-1925756, 3341485, 3699041, 5826123, -8546448, -5646272, -2054068, -1257352, 261993, 1080721, +-8155606, 5630702, -2596845, 1832877, 1132261, 1868848, 3517578, -32749, -1211181, -2710124, +5814849, -465467, 3765613, 7225209, -1607392, 6146098, 5199595, -4538170, 2994129, 3080565, +3252364, -8005819, -842887, 492848, -2567854, -5025112, 28454, 5904507, -1432909, -2495376, +-2032593, 1828046, 5399848, 2727304, -2844879, -8590, -2358474, 274878, -794032, -2670396, +5029407, -6529961, -5509370, -4935991, 1473174, -633508, -256087, -6065568, -6568079, 1666984, +-223875, 464930, -733366, -234613, -4944581, -2740726, -5407364, 1181653, 4411469, -1247688, +3881577, 950798, 3409667, -7493644, -173409, 1421097, -2843268, -737661, 678605, -2716567, +922344, -379568, 5217849, 8192113, 702227, -2824478, -6595459, 3319473, 2206003, 2098629, +8642548, -5311264, 377957, 1248225, -1353989, -2545842, 1425929, 754304, 5267778, 11469173, +-824097, 2170032, 4863514, -1814624, 4350802, 7534983, -4951024, 35970, -1756105, 120796, +3398930, -5467494, 6283537, 1598802, 196495, 3469797, -416612, 4716948, -2325725, -809601, +-1164473, 7278359, 3377992, 4715337, -772020, 3922379, -6779069, 8132521, -3008625, 3326989, +-7166153, 3118683, 5259725, 9851044, 3552475, 1999844, -6355478, -2241436, 1724966, -4626217, +-5767068, -1190243, 11319923, 13346611, 2424509, 3229279, -3906273, -1582159, 7202660, 1482301, +3011309, -477815, 1981054, 1819992, 5907728, 504659, 1027571, 8167954, -6251862, -7376070, +12388833, -2749316, -1620276, 8279087, 5029944, 981400, -13547401, 15367930, -2445984, -1470489, +-1282585, -383326, 877784, 1368484, 4955856, 7435126, 4871030, -530965, 8098698, 5451924, +2780991, 2607045, -2619393, 4089883, -5370857, 5027259, -603980, 2431488, -4512400, -6356552, +1139777, -288300, 2790655, 4785668, -1807644, -5997385, -3617973, 2287607, -7703024, 5824513, +1852742, -11975979, 5990406, 1617055, 3542274, 1595580, 2244121, 2963528, -236760, -2727841, +-2812667, -7763691, -6051609, -2589865, -4091493, 25233, 872952, -5273683, -8578660, -199179, +6268505, 11275900, -17717, -5366025, 1688996, -9075803, 1416266, 877247, -3269544, 10642929, +-13427142, 7191386, -2430952, -4665945, -3673271, -4454418, -6301791, 12630962, -15704548, 3919695, +3991635, 5371394, 7909183, 1457068, 2309619, 3106335, 2255395, 1805497, 2780991, 7015829, +1385664, -3558381, 147103, -457951, -4730370, -4212826, 2415382, 4779762, 5073967, 881005, +3662533, -8046085, -804233, 106300, -296890, -7602629, -4530654, -2584497, 5282273, 4836133, +84826, -8323110, 216896, -4386772, -3149285, -1421097, -2127083, 5657546, 7511361, 2507724, +7814156, -11899744, -8317204, 4364224, 2703145, 737124, 1839320, 1137630, -3710852, -7310035, +-5037997, 4451197, -3148211, 6633577, 6439767, -1776506, 6156836, -8724152, -4158602, -2017024, +-2638721, 1366873, 17391934, -1532230, 5517423, -1379758, 14082124, -2492155, 555125, 6040872, +-13064217, 9287330, 4782446, -7267085, 8446590, 9462350, 3272765, -14088566, 8994198, 590021, +-1191853, 7444789, 7968238, -228170, -2157147, 448824, -5398774, 5416491, -2887829, -5053029, +-10975789, 2834679, -11944841, 3489124, -2825552, -1100049, 3617973, -9586904, -3915400, 8453569, +-587874, -3546032, 5134634, 617938, -4175782, 4003447, 1462436, 671089, -1727651, 3146601, +-5882495, -296353, -8644695, 8629663, 8385387, -9944997, 6991133, -6971806, -2678449, 7521562, +10048076, -294742, -4868883, 3463891, -540092, 1921998, -12085501, -9096204, 1997697, 2294586, +-2559264, -1879585, 3222299, 311385, -4251481, 5912023, -4914517, 2616709, 3775276, 163746, +5895917, -4629975, 3947075, 1779190, -4967667, 9867150, -3250217, 4858682, -9768903, -586263, +-2516851, -8832600, 393526, 6440841, 11314018, 14823006, -8296266, -106300, -10362145, -648003, +-6576132, 6070937, -6155762, -12164421, 861141, -7740605, -677531, 10355166, -5990943, -5878737, +11006391, 500901, 1934883, -977105, -6389301, 2908767, 2383707, 13377213, -9060770, 6659347, +-7680476, 2119566, 2601677, -7418483, -4655208, 12882218, 3499862, -9206799, -2401961, -3220689, +-7538205, -80531, 12448963, 6903623, 8669391, 2237141, 3480534, -11062225, -1617055, 14706505, +1165010, -8654896, 4818417, 5090073, -6549289, -5382668, -3137474, -14443438, -2240899, 4794257, +7382512, 13433584, -3155727, -6643778, -1873680, -3901441, 10936597, -3319473, 5551245, -22728430, +-15906948, -10473815, 383863, -19170050, 1974611, 12899397, 3747896, 13303661, -8333847, -4263292, +-2310693, -8099235, -3522947, -11770358, 18739480, 10361072, 6994354, -17288854, -3984119, -6105833, +-11533598, 2911451, -1934346, 2674691, -14142790, -1729798, -2011655, -10394895, 4745402, 757525, +8952322, 3099893, -9023726, 12045773, -6946573, 4376035, 1853815, -976568, 9328132, 8600672, +1504849, -13196824, 14104673, -8507793, 9841918, 3976603, -6504728, -7141457, 11107859, 799938, +-2387465, 2144799, -11200738, -4677757, 4837207, -1909650, 9593346, -7261716, -10766409, 2818572, +1558536, -857383, 9376450, 3330210, 842350, -8081518, 6301791, 1635846, -7485591, -2305861, +-2421288, -5013838, -4650376, -4619238, 1335735, -13412109, 19075024, 8190503, 21737366, -9079561, +-11030550, 20793010, 1089311, -1596654, 4839355, 2068027, 12260521, 16358457, 2424509, -14181445, +-23218594, 3847754, -6178311, 1988570, 973884, -9640591, -364535, 13401372, 10763188, 8826158, +16772921, -3153043, 14226542, -9250823, 12600360, 4672388, 9781788, -5845988, 17072496, 10344429, +12475806, -19014894, -10737, 18451716, 10210748, 3847217, -4222490, 27451820, 11302206, -9920838, +-6563247, 7148973, -10365904, -399432, -5097053, 1974611, 22298934, 24190330, 16831440, 6863895, +-199179, 9437654, -8328479, -1453310, 9069360, -9524627, 23131084, 15343234, 10810433, 5030481, +-2034741, -10921565, 12778601, 782221, 10582799, -5367636, 2441152, -7953743, -7920457, -413927, +683437, -9491878, 22990424, -1362578, -11428908, -5132486, -8986682, -326954, -14392435, 3745212, +-12427488, 7033009, 1478543, -3257733, -9827422, -11502996, -17714056, -18118320, -5559299, 15948824, +-1340567, -10159745, 4090420, -9657234, 7371775, -8200167, 14630269, -14990510, 3366718, -10539850, +-11248519, -1745904, 1677185, -2911988, 6788196, -21560198, 8612483, 2485712, -5487895, -1107028, +-1662689, -10394358, -17586818, -18144090, 13202729, 7153268, -7477538, 12172474, 189515, -4221416, +-13874892, -28134184, -23867670, 14162655, -4270808, 1092532, -2944737, -497142, -1430224, -18577344, +7410966, -22030498, -12240657, 2171106, -591095, -3705483, -2864206, -1719061, 24142548, -5851356, +-7202124, -4757213, 25679072, -2553895, -8802535, 18024904, -10524817, -5110474, -6893960, -4039417, +-34293704, -25977036, -14979235, 29360396, -1800665, -5270999, -3907347, -2671470, -10053982, 10165114, +7853348, 26216480, -24770688, -5129802, 7298223, -18288508, -7419019, -6708202, 30360586, -818191, +6826314, 15198279, 1190780, 14607184, -16394427, -20731270, -13815299, -4137664, -3653944, 2029372, +9376450, -874026, -17311402, -12232604, -1044214, -9562208, -19382650, 16740709, -3017752, -10011569, +-261993, 5083631, 5319854, 2776160, -8809515, 1318018, -17990008, -8261370, -26616450, 12022150, +7913477, -3572339, -8411693, 9363029, -13289166, -3810173, 28528784, -3442953, 24173150, 10418517, +6438693, -6762963, -30500174, -13062069, -5911486, -16768626, -12312597, -8156143, 13562433, -6513318, +230854, -12406550, 25848724, -9207873, 10539313, 8121783, -17507360, 19730006, 1251446, -7897908, +12957916, 8374650, 38915624, 3442416, 2492692, 15176804, -14532022, -9247065, -1223529, 5264556, +8031052, -2206540, 17648558, -7283728, 4234301, 16958142, 8662412, 7764764, 7495792, -8459475, +4112431, 2065879, -3226594, 4668630, -5784784, -11508902, -5224291, 3599720, -11682311, 20321638, +780073, 4358855, -357556, 14864345, 15896748, 66572, -8093329, 1792612, -1144072, 19073950, +23021562, -12010339, -8079371, -4592931, 7378754, 18524730, -11716671, 7725036, 1581622, 6438693, +-5005785, -6383932, 5277978, 13645111, 4185983, -9110163, 13783087, 37355480, -8516383, 10158671, +-95563, 6720550, 15515569, 8067023, 17950816, 17539036, -581431, 24799678, 38716444, 7209640, +-9721122, 41508712, 3848291, 39932460, 424128, 8360154, -21597780, -6005975, 37648072, 7457137, +-15073188, 6356015, -10995116, 6030671, 8591008, -1608465, -17381732, -5891622, -26792006, 13102335, +11579232, -9747965, 12448963, 17767742, 5279052, -3291556, -14758581, 4929549, 28625958, -11665668, +18006650, 16346646, 4463008, 12526809, 12754442, 1492501, 15439334, 9827959, -23203560, -2672007, +-7984344, 26850524, 19527068, -17249126, 13511430, -1261110, 16138340, 44071196, -1588601, -6571837, +6903623, 39670464, 18650358, -1720134, 7720204, 7697655, 25315074, 20450486, -10652056, 24394878, +13959717, 22622666, -12493523, 2879239, 7712688, 5181341, 17086454, 20732344, -9589588, -10027675, +19860466, 8500277, -1409823, -5209796, 4403952, 24982214, -41136124, 11710228, -10998338, -10558640, +-8827232, -8426189, 6084895, 7978976, 8300561, -9947144, -12093017, -31148176, 1489817, -17239998, +28618978, 3805341, -7421704, -3904662, 17127256, 5312338, 27799712, 11642046, -7323993, 1583232, +5760088, 13137768, 20799990, -22966264, -20489678, -3751654, 35017944, -10324565, 4234301, 10616085, +15140833, 19322520, 26447334, 23758148, 1652489, -4872104, 24593520, 2617246, -16413754, 9183177, +-15308874, 11414949, 2099702, -12426414, 11446625, 47841640, 25543244, -15805480, -13310641, -870268, +-13839995, -12067784, -12031814, 8979703, -7284802, -10081899, 1465658, 13903883, 6680285, 5277978, +17352742, 5974300, -5698348, 20573430, 15136538, -13034689, 8174934, -14813879, -13958107, -12956306, +-1654636, -32869384, -11834782, 25156160, 15643882, -6278706, -11911555, 11500312, 9446244, -15358266, +-6065031, -34460672, -1930051, 30441118, 1252520, -20680268, 4380867, 1966021, -13631689, 20633560, +12267500, -6930467, 6495065, 9902584, 13041131, 7750806, 3003256, -7718593, 5662915, 8031589, +19706920, 29146184, -6806450, -17850420, -9046275, 6444599, 6773164, 24229522, -7909183, -16987670, +-13167833, -13342853, 28937880, 52461416, 19600620, 3776350, 57253524, 4617090, 24340654, 14577656, +-3694209, -10492068, 11071889, -14625974, -9540196, 12794708, 1916092, -32456530, -33914136, -7283728, +15921981, -16751446, -21652540, -11008001, -15603079, -12271795, 13374528, -7914014, -24417962, 13682692, +2821257, -5464809, 8089571, -3530463, 15397995, 55414204, -29703994, 29650844, -33577516, -17144436, +-8048769, -3298535, 26949310, 1219234, 29003378, 18789408, 17006996, 24739012, -27954332, 11316165, +-29292750, -807991, 39336532, 34949224, 15205795, 901406, 7201050, 4746476, -10668162, 9353365, +11680700, -48654464, 3496104, 7521562, 15395310, -17643188, -27078696, 20527796, 10081362, 5429376, +-11275900, 24265492, -2854006, 18907520, 16022912, -1612223, 2892124, -5199595, 19420232, -11006927, +6298033, 11551851, -458488, 24307904, 14512158, -1208496, 12919262, 14195404, -195421, -10803453, +-36217312, -6709276, 4449049, -21723944, 2622078, 17366700, -32884954, -14852534, 5618891, -14435385, +-1846299, 17492328, 1477469, -12660490, -15847356, 6977175, 7441568, -34120832, -10939282, -3282966, +368830, 20565378, 10482405, 1505386, 36917392, -5874442, -1734093, -293668, -22560390, -8826695, +-34178276, -29754460, 6045704, -15102716, -4344897, -22849762, -28470264, -30100742, -19504520, 22181896, +30292404, 1190780, -23885386, 2320893, 1744831, 695785, 11915313, 19318762, 19600084, 807991, +-11647951, -30141544, -16804060, -26362510, -5046587, 399432, 2941516, 3018288, 4457103, 7591355, +10241886, 18172006, -27442694, 12571369, 5671505, 6399502, 15874736, 26884884, 30783104, -17160542, +14157286, -23796804, -6671695, -21614422, -1311576, -8417062, 50705848, 17701170, 36761700, 1471026, +-18460306, -8373576, 23842438, 24775518, -13822279, 45829984, -18471580, 2603824, 2819109, 7646116, +17675402, 50760608, -2857764, 11972758, 29174102, 5790690, -22033182, 13431973, 52799108, -10776073, +-12529493, -32547800, -2878702, 16942036, 10662793, -2404108, -26386132, -4393215, -5581310, 9771051, +46251964, -2764885, -555661, 19390704, 3554086, -64617248, -20458540, 45242112, 14928769, -13778255, +-25827248, -3991098, -17125108, 23124104, 12023224, 4009352, -13738527, -30823906, 6366216, -52799644, +-6536940, 25198036, 34853660, -4459250, -29778618, -20646444, -61366492, 17574470, -10675678, 23589572, +18147848, -17841832, -12646531, -54817740, -40793064, 20865488, 58081916, 22745610, 27688044, -19705310, +-34260416, -33453500, -13613973, 48899276, 66678292, 34257196, -76775224, -28624346, -58678380, -31933618, +73803104, 17566954, 16854526, -10005126, -69876968, -58034672, -57175680, -10993506, 6571837, 36375688, +-12461311, 27666568, -54666880, 34691524, 15476378, 4151623, 72258528, 4392141, -4133906, -3676492, +-92309048, -30176440, -1595580, 2339684, -29548838, 51047832, 20735028, 22397718, -67610840, 11309186, +-93420904, -22014392, -2359011, 11111617, 3113851, -60325500, 29535954, -17999134, -12764106, -12763032, +-14715632, -16071231, -20408610, 36639292, -13311714, -34612068, 8129300, -10971494, 1599875, 16870632, +-39677980, -14903000, -4822175, 14042396, -978716, 40650792, -6220724, -25627532, 52991308, -48587892, +24786794, -45130980, -17275970, 19931870, -38392712, 1245541, 22769232, -14740865, -6114960, -3908957, +29999810, 49349176, 26014616, -18178986, -10355703, -9012452, -267362, 15197742, -10314901, -11034308, +6065568, 4315906, -95627984, -4496831, -7554848, 12646531, 6978785, 27917, -4574140, 25667262, +-33967824, -7632694, -8434779, 19921668, -79947056, -9904195, 59010704, -16047072, -36714992, 1995549, +24655796, -13925358, -24046986, -68793032, -56909392, 46551004, 39276940, 2157147, 42053100, -49677204, +-4786204, -94290640, -34936876, -18044768, 42790224, 39238284, 22932442, -38854960, -14959908, -3171833, +-19942606, 7300908, 14032732, 19618336, 25914758, -22870164, 13519483, -41441604, -27637040, -7668127, +-10832981, -209917, 24187108, -32865090, 24958054, -13400298, -19971062, -8113193, 155693, -40783936, +-3317862, -36965172, -15891916, -14906758, -36673116, 46129560, 19069654, 9877351, 8954470, -9810779, +-50496468, -71667968, -44097504, -42315092, 25757456, 6347425, 27947890, 42312408, 32498944, -11684459, +5793374, -24562918, -21486648, -22264574, 14950244, -23394686, -3752728, -22050898, -26039850, -13796509, +25132538, -20888574, -8754754, 4268124, -5605469, -29144574, -37287296, -15729244, 31261994, -6642167, +-91781840, -127464432, -119808112, -113805360, -137735840, -16505559, -32066762, 33761128, 49643916, 138522896, +92348776, 118535728, 161130528, 175563760, 123045448, 153419984, 91435024, 46099496, 2529199, -20140176, +-28879896, -54481124, -52150028, -76576584, -27040040, -23901494, -70369816, -52030844, -48015052, -57438208, +-95891048, -64557116, -46489264, -37724844, -72099080, -5319317, -16132971, -27713814, -69819528, -66328792, +-51490216, -45528800, -29301340, -10335839, -42168524, 18414672, 32423782, -34920232, 49780820, 63210644, +63860796, 107268952, 90803128, 67314488, 77254648, 73461120, 76421960, 109945792, 127446712, 120297736, +85701776, 128239136, 130627672, 129950680, 136406544, 148163488, 134858752, 134708432, 186687200, 82171312, +86702504, 76345728, 70924944, -44443784, -7704635, -34548180, -97089880, -62141196, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, { 1824824, -1520418, 1184874, 2761664, -888521, 255551, -1235877, -4140885, -7766375, 1602560, -2968896, --4188130, -5618354, 1364189, 1056025, 4163971, 1150514, 4949950, -716723, -7343321, 2747169, --3877282, -484258, 1573032, -3115999, -4798552, 642635, -3138547, -478352, -1585917, 2860985, -2870112, 916976, -6844568, -1481227, -2626373, 5280126, 1101659, 1585380, 6161668, 2937758, -2764885, -98247, 1667521, 9698573, 4763656, -1661616, 461709, -4668630, 3338263, -275952, -527207, -5748814, -761820, -3052111, -3914326, -1592359, 4333085, 3333432, 49929, 18790, --3757023, -3528853, -1305133, -3597035, -7394323, 3778498, -3084324, -670015, -6961068, -1855963, -4182225, 2106145, -312459, -6386617, 7894150, -692027, 3128347, 1542967, 3696356, -6840809, --3745748, 4275640, 2008971, -20401, -3860102, 706522, -10600516, -6822556, -467078, -4088272, --4663261, 1817308, 8100845, 1326071, 6141267, -1494649, 6065568, -3731253, -3404835, -450435, --5689758, 1072131, 2654290, -2044941, -253940, 1422171, 141197, 2495913, -421981, -5980742, -2010045, -3707094, -2915209, 1671816, -3803194, -5563594, 5408975, -5830418, 5140002, 4940286, -3107409, -239444, -6988449, -3953518, 635655, -1249836, 8683350, -5344550, 2008434, -628139, -1028645, -6592238, -11283953, -1865626, -3482682, -3597572, -1012002, 4858682, -1153199, -4845260, -4283156, 2094870, -2354179, 3959960, -825707, 1460826, -5213554, 61203, -1300838, 4174708, -4161823, 500901, 7590281, -188979, 3212099, 4038880, -165356, -3855807, 275952, -5434744, --6959458, -2688113, -7916162, -8134131, -2744484, 5201743, -2016487, -1916092, -4317516, -1141388, --7454453, 3502009, -2183454, 1733556, 4263829, 1418950, -1677185, 2953327, 2730526, -3641059, -2346126, 267362, 525060, 2620467, -6529424, -2813204, 4386236, -2953864, -352187, -1894081, -4882304, -6482180, -676994, -5432597, 3354906, -357556, -536334, 4837744, -2245194, -2370285, --1821603, -4578435, 189515, -2084133, -494995, 282931, 2968896, 3133179, 935766, -1411434, --5492190, -8803072, -2835215, -622770, -2270427, 4710506, -1988033, -2732673, 3714073, -2467459, --3795141, 8274792, -1778117, 9217537, -5408975, -2396055, -3841848, 3608846, 909459, -105227, -6709813, 1851131, 2148021, -9038222, 1978906, -4045859, -4820027, -6271726, 140123, 564251, -8070244, -6062883, 3200825, -2342905, 9913321, -3143916, -2973728, 7238094, -2403571, 2736431, -1264331, -89121, 1359357, -4241280, 968515, 601832, 2166811, 9488120, 3380676, 1251446, --3676492, 3594351, -6864432, -1538672, -1153736, 4305168, 3505230, 5941551, 3797288, -3660923, --5870684, -2170569, 4816806, -77846, 2587181, -466541, -488553, 9773735, 2359011, -152471, --10861435, -4348655, 461172, 4442607, 6077916, 8946417, 4827007, -1331440, 1664837, -1313186, --2644626, 6743636, -3568044, 6996502, 487479, -4578972, 2243584, -1722819, 5128728, 1082332, -4656819, -1166084, -808528, -1779727, -5502390, 156766, 3930969, 3862249, 7340099, 3296388, --9636833, -8129836, -6977175, 207232, -1163936, 423591, -3779571, -2460480, -556198, 2826089, -5369, -6285148, 6728603, -1067836, -6139119, 1149441, 1537598, -253940, -513249, 2550137, -3627637, -2352568, 5506148, 120796, 3280281, -7522099, 5369246, 1702955, 3162707, -5239860, --403190, 3531000, 3341485, 7862475, -116501, -11303817, -2837900, -5522791, 2823404, 1590749, --221191, -3185255, 1109175, -4784594, -1330366, -8534637, -4573604, -527207, 4960687, 4898410, --3350075, -3456375, -2852395, 5018670, -1356136, -946503, -7465190, 4496294, -7303055, -3051038, -287226, -1995549, -1433982, 8020852, -678068, 2021856, -3103651, 3893925, -3503083, -211527, -5468567, 10100689, 6942278, 1311039, -8273181, -6286759, 1976759, -1614371, -5370857, -1931662, --6861747, -3104188, 13226352, 1312649, -1611150, -2739652, -172872, -3366181, -2336462, 8818642, --9585830, -1363115, 754841, -2270427, 2189360, 5222680, -2690797, -3364033, 1218160, -4124779, --3927748, -9024800, -3405909, 2076080, -7996156, -1599339, 3724811, 5608691, 1938641, -12583717, --3866544, 2165737, 6034966, -5130339, 10530723, -1561758, -5581310, -3349538, -2469606, -4553202, -5653788, -4682051, -1314797, -6081137, -4658966, -2455111, -4736275, 5789616, -2421825, -12673912, -4540854, 7907035, -57982, 2636036, -15142444, 11350525, 32212, -10101763, 812286, -6798397, --11470784, 2103460, -8544837, 8320426, 1837172, -3714610, -6965900, -11937862, -5391795, -8755828, -2513093, 15734076, 2386928, -4592931, -607201, -2614025, -2842195, -7673496, -5136244, -7890929, -1678259, -971200, 1297617, -3030100, 900333, -8323647, -881542, 1394791, -5715528, -2399813, -345745, -3354370, 446140, -3122978, 11587822, -14987288, -2918967, 753230, 3594351, -1933272, --6303938, -9363566, -6655589, 4357781, -1593433, 4880157, -4851166, 13370233, 1493575, -3112778, --450972, -8636105, -10801843, -5729487, 3660386, -9380745, -861141, 10089952, -614717, -5395016, --10307922, -17277042, 365072, 8270497, -2745021, 9574556, -1264868, -3432753, -6624450, -5768678, -537408, 3797825, -3673808, 14464913, 3752728, -4095251, 9564892, -4073777, -10856067, -2917894, --8076686, -4187593, -3442416, 11668889, -2798171, -3827890, -4774393, 7510287, 6832756, 5965173, -16504486, 17186312, 8081518, 10689637, -3869766, -4911832, 7242926, 10531797, -4411469, 4629975, -3409130, -9137543, -8481487, 5094905, -1096290, -132607, -8453569, -10990284, -2428804, -8923868, -10242423, 18751828, 4072166, 7361574, 2355253, -2279554, 6913824, -12920872, -3231963, 2581275, -7359964, -4330401, -10166188, 15031312, 178241, -4777078, -3492882, 6076305, -1648731, 5388574, --3579855, 8529805, -523449, -407485, 10943577, 3144453, 5151814, 1720134, -1447941, 7797513, --12039867, -5142687, 4742718, 13571023, -8252243, -1248225, -1564442, -2225330, -5603322, -1536525, --2747705, -4131222, 7078106, -6485401, -2378338, 6419366, -4590783, 2916283, 4880694, -8924405, --9563282, 3044058, 7722888, -2296197, 7066832, -4721780, -1982664, 13306882, -14571213, 9183714, --3995393, 377957, 613107, 16383690, -3368865, 3463891, 5333276, 9161702, 5401458, 8067023, --1083406, -950798, 2746632, 1556389, 1501091, -7463580, 12291660, -15799574, -3343095, -3917547, -9210020, -1481764, 11179263, -162672, 1241782, -18829136, -5055177, 12052215, 20087562, 188442, --9654013, -7930657, 8379481, 6959995, 5156645, 5090610, -8234526, -3451543, -4668630, 3017752, -593779, -4745402, 3301756, 3140695, -2178085, -2171643, -11319923, -2541010, -3987877, 17076790, -1775432, 3673271, 6519224, 1065689, -12751221, 1200443, -7750269, 6883759, 6176700, -12823162, --5436355, -5325760, 1472637, -1496796, 17062294, -3050501, -197569, 10546829, -10948945, -8155606, --10320806, -10741713, -3247532, -1170916, 3622268, 18318036, -2601140, -11818139, 18949396, -485868, -4677220, 12722230, 8464307, 11815455, -4184909, 9157944, -7334194, 12398497, 10666551, -3968550, -5118528, -6162741, -5860483, 4149475, 14208289, 5962489, 5043902, 1280437, -5783174, -9237401, --9479530, 497142, 9427990, -6954626, -8286603, -9867687, -4413079, -18680960, -5193689, 2459406, --14093935, 5344013, -139050, -6939057, -16411607, -11257646, -1092532, -21368000, 5237713, 3423626, --1612760, 4548371, 2492155, -3145527, -11811697, -7632157, -2452426, -7992398, 4957466, -8392903, -15475304, -12787191, -863288, 5855114, -1379221, -24619290, 8904541, 11547020, 20116016, 166967, --14646912, 4418448, 7286949, -15083925, -15808164, -9703405, -267899, 8790187, -326954, -5958194, --226023, -5164698, -3592203, -9572408, 16581795, 13221520, 4914517, -19903416, -6020471, 3610457, --1121523, -4139812, 25642028, 9772124, 8053064, 7939784, 12148315, 9538585, 2190433, 9982578, --701690, -15465640, 8541079, -15905875, 4913443, -15726023, 13578002, -3790309, 16396038, -8505109, -3863860, -6761889, 5779952, 10219875, 25020332, 5907191, -32306208, -1100585, -4727149, 7511898, -13718126, -2185602, -6565395, 10981695, -2197950, -4342749, 13380434, 1626719, -1093606, 1493575, -5367099, 11882564, 8122320, -8601209, -7773354, -5041218, -10463077, 3259343, -1869385, 11939472, -6746320, -13820668, 27065810, -10198400, -17981418, -5683853, 7059316, -4398047, 13003013, 18853832, --7553237, 17300666, 11087458, 8732742, -2862596, -2005750, -3499325, 16793322, 3019899, 2090575, --9783936, 4314832, -5150203, -347892, -16153909, 10972568, -14845018, 144955, -10514617, 17516488, --9040369, 463320, 17086454, 13169443, 8689793, -988379, -7026567, 8069707, -460635, -1495722, --22239878, -6491306, -13552769, -10765336, -8719320, -3952444, 11120207, 7197829, 6316287, 18254, -16445967, -8949101, 17383344, 15613817, 16326244, 29322278, -11901354, -8986145, 12336757, 2279554, --12065637, 17539036, -6568616, -8828305, 4938139, -2529199, -7074885, -5504001, 6573448, -10832444, -3462818, -7072201, 14882062, -7841537, -1466731, 3534758, 9600863, 14392435, -2989297, -15273977, --26382910, -22468584, -2219424, 3331284, -15754477, -485331, 66572, 22317186, -16521665, -18589692, -4415764, -8457327, -1296006, -13850733, 10888279, -14040248, -18694918, -11566347, 18783502, -14740328, --12538620, -3594351, 6807523, -7008313, -15791521, 3492882, -7231651, -878858, 5149666, -19965156, --2866354, 9605157, 15473157, -3481071, 24397562, 10455561, -4450123, 281857, 10241350, -5692443, --12074227, 1173600, 12437152, 764504, 5119064, -455803, -13120051, 3226057, -26874684, 1584306, --344134, -3883724, -16595754, -14107894, -162135, -6736120, -12037720, -7366406, -10106595, 9161702, --18560702, -9889162, -6820945, 6884296, -11883638, 20109036, -5281736, -17228188, -3822521, -10157061, --29635274, -7892003, -928250, -326418, -20716238, -8477729, -7882876, 19789598, 17717276, 5728413, -35702988, -5942624, -11842299, -10393821, -4730907, -18313204, 26036628, -14666776, -5227512, -11718281, --6066642, -5097053, 3347927, -17260936, 577673, 1022739, -2220498, 5976984, -18832894, -3962107, -13296145, -12068858, 897648, -15851651, 16287590, 1091459, -28533616, -13835700, -5094905, 461172, -8033200, -16287590, -9728101, 13114683, -2045478, 9464497, 7558606, 8752070, -10516227, 2473364, -12567611, 6047851, -23807540, 16670379, 10822244, -11309723, 36100812, 897648, -26363046, 8844411, -7904888, 1118839, 18999862, -4167729, -32854890, 10998874, 4120484, 11660299, 10893648, -12760885, -22744000, 10980621, 6483790, -3297998, 34564824, -320512, -481573, 26774290, -5429913, 13756780, -17640504, 9451076, 1044751, -1650878, 7088307, 7321846, -24896314, -24438900, 50813220, 16531866, --31361314, -15678241, -14254996, -28727426, -1908039, -15067282, 21315386, -11712913, 354872, 26474178, -821413, 4557497, -19092204, 24418500, 18323942, -130460, -5574331, -1707786, -14768782, 1321776, -2194192, 3250217, -20387136, -2835215, -903017, -6049462, -4304094, -14079440, 13807783, 26920318, -32443110, -2444373, -12697534, -5257040, -6331856, -4328790, -19390704, 6885907, 8041790, 7252589, --20209968, -27249420, 29998200, 11385421, 16957604, 21731460, 20551956, -8555575, -13452374, 19698868, --19476602, 10282152, -14489609, -11155104, -6272800, 23439784, -7351374, 4982699, 8289824, -3932580, --18469434, 39102456, -23213224, 2769180, 28237800, -25021942, -11503533, 3446711, 10008348, 29384018, -13582297, -7990787, 8674760, 34136936, 20734492, -2611877, -21169894, 2692408, 34974992, 27952184, -6201396, -26929982, -10139881, -23193360, -1372242, 18910742, 23217520, -1255204, 9052180, 27557048, -29247116, 45231376, 45468672, -22127134, 10154376, -23933706, -4077535, -19337016, -6778532, 15924665, --3190624, 7170985, 6386080, -13663365, -10012643, 11779485, 12991202, 16873316, 11975979, -257161, -12315282, 18553722, -9515500, 9513889, 10904922, 3445101, 10620917, 35167728, -26210038, -22439594, --5069135, 21745956, 20681878, -12192875, -220117, 33248952, 26726508, -18791018, -12710419, 11363410, --23194434, 6284074, -11346767, -21011516, 6362994, -24743306, 24978992, 8973797, 27626840, -12325482, --17123498, -32477468, -7648263, 9535901, -28765544, -25009058, -15302432, 13777718, 34321620, -1678259, --10063645, 22281216, 4875862, -700617, -31871878, 28905666, -13622563, -30050812, -10070625, 2694018, -35649840, 4025995, 25617870, 10928007, -29700772, -5832566, -26300232, 4973036, -26234734, -18307298, --11145440, 2086817, 5769752, -19744502, 20322174, -5699422, 12402792, 13980119, 13166759, 25279640, -44696116, 27023398, -8396124, -21029770, -674847, 47847548, 29312614, -15035607, 23423142, -8032663, -28584082, -13182865, 2804614, -9592809, -5243618, -550830, -8005282, 71606232, -13408888, -18364744, --22497038, -30515206, -12166569, -23229330, -1067836, 28452548, -10819023, 9280351, -9009231, -12643310, -24908126, -5587216, 41952704, 9103720, 33695628, -39382704, 17250736, 73246912, 26783416, -38262252, -24941948, 23925116, 2971044, -1137630, 46691128, 20536922, 3131031, -3903589, -55861956, 22562536, -31298500, -26632556, -19949050, 39119100, 24775518, -35696548, -37620156, -1218697, -22944790, 6503118, -1118839, 6077916, -35486092, 6161668, -8746164, -19063212, 27200028, -4602058, -7201587, 7347616, -22438520, 19636590, 12912282, -31008590, -1676111, -16486232, -32574642, 8385387, 6264210, 15982110, --8710194, -16806208, 36416492, -30521112, 9946607, 10728291, 8597988, 5570573, -7177964, 20132660, --23620172, -39457328, -8569533, -44804024, 34442952, 19864224, 33718716, -5723581, 4612795, -32008244, -27834072, 35560180, 11135240, -19020800, -45635640, -12529493, -59428924, -1695438, -13415330, -40771588, --35591320, 12903155, -740345, 22147536, -21588116, 26565446, 19302120, -30754650, 3064459, -4585415, --32618130, 16088947, 12438762, -14606647, 6680285, -6857452, -49778136, -12071006, 13616120, -4489315, -6607271, -26844620, 37928856, -47130824, 4768488, -34068756, 25651156, 28927678, 9763534, 24526410, -3346317, -21767968, 40860708, -16929150, 4953708, 2464238, -22378928, 39947492, 3286724, 11842835, -8930848, 13920526, 6880538, 30625802, 34100968, 13551159, 39705364, -31811750, -2225330, 2410014, -50525460, -7100655, 40291088, 24945170, 55196236, 13541495, -12331925, -14684493, 21912386, -38122668, -38778184, -20262582, -13952738, -3188476, 7607998, 32925220, -7219303, -49566072, -15286325, 90366648, -5772973, -50050864, 12626667, -31302796, 9672266, 90272160, -24722368, -17465484, 57370564, -57008176, -29979408, 22697828, 16248398, 65965328, 30629022, -31223876, 43523588, 21523692, 29282014, 55790552, -27815282, -26820460, 35735740, 10628970, 32261646, -9368397, -59547576, 60508572, 52727704, 32217086, -99485400, -9417253, -83253112, -43278236, -39203388, 87951264, 64958696, 15454903, -5414880, -16342351, --58088896, -27947890, -18657874, -33780992, 89950040, 72468984, 101441760, 1549410, -115429392, -180585120, --87567944, 100036232, 135862704, 137968848, 56164212, -115144312, -210333136, -129701032, -64778308, 96728032, -165792720, 93353264, 51570748, 13089450, -74022688, -100818992, -74407624, -6302865, 58762132, 117176912, -141568560, 24322936, 28272696, -112610288, -184599840, -99661496, 93188440, 154194160, 147858544, 90866472, --53012244, -181281984, -115792856, -152224912, 1564979, 101556648, 111921480, 54525684, -43077448, -95905008, --83486112, -66998268, 19372450, -13599477, -33390150, 36410584, 4372277, -55133960, 5967320, -15054934, --22742388, 15350750, -17658222, -7562901, -29977798, 759672, -12059731, -22553948, 7694971, -3339337, -6286222, 2629594, 17028472, -18531710, -6921340, 4598836, 996969, 7528541, -8511015, 17322676, --13768591, 11702712, 4938139, -6624450, -14441828, -6523519, -26191248, 26692684, -3510599, 254477, --5812702, -7175817, 441845, -1406602, -384400, 10011569, 5191542, -852551, 14203994, -13783087, -3535832, -13069585, 12552579, 8031589, -11758010, 6986838, -14134201, -14627048, -13101798, -22323630, --4002373, 16539382, -16899622, -30075508, -22522808, 1962800, 16248935, 725313, 11324218, -28036472, --10231686, -2408403, -5792301, -26592826, -10924786, 3082176, -1079647, -6409702, 21068426, 20542828, --23868208, -29835528, -48579300, -75934488, 2131378, 61623652, -24423868, -38719132, -41452876, -39085812, -7386807, 7476465, 70993664, -10878078, -10985989, -32384054, 2860985, 9220758, 21840446, -24439974, -11396696, -17890150, 27302570, 8507256, 8408472, 2948495, -18269180, -9920838, -12204686, -4168266, -9320079, -10929618, -10140418, 19407346, -18960670, -11660299, 15457050, -15949361, -6650757, -13737990, --22763326, 7347616, 13346611, 2270964, 12497818, -20876762, -6238440, -967978, 10863046, 14371497, -17201344, 906775, -2990908, -31236224, -32806034, -12125230, -11398843, -7358890, 13427142, 19495930, -27020714, 2615098, -14006962, 27685896, -21320218, -9645960, 11437498, -9575093, 35989680, 1003949, --7184407, 5176510, -14397267, 9304510, 25143812, 18997714, -7453916, 4184909, 18347026, -49836652, --114763136, -88017304, -11290932, 36240936, 96627640, 81349368, 77650864, 79280264, 51926156, 21086142, --30303678, -52849572, -99597072, -73795592, -72449120, -72326712, -45391360, 41511396, 56517476, 83517248, -63934884, 53245784, 16811038, 35077536, -9375914, -10752987, -12608950, -21235928, -38408280, -31829466, --63881196, -24158118, -50954956, -25035902, -12898324, 15032922, 2167885, 22079354, 4326106, 31450434, -22988276, 38330972, 51550880, 64124400, 40779104, 26913338, 45450956, 2476586, -16720308, -58385784, --68112816, -93472984, -83266528, -77978352, -30285426, -51379084, -27139898, 2455648, 13401372, 32191316, -61901752, 66176856, 74020000, 112215688, 63218160, 86481312, 60106992, 14897094, -7863012, -32706176, --87242064, -93488016, -88557392, -94190240, -63826972, -19724100, -1180042, 2333778, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +1520418, 1184874, 2761664, -888521, 255551, -1235877, -4140885, -7766375, 1602560, -2968896, +-4188130, -5618354, 1364189, 1056025, 4163971, 1150514, 4949950, -716723, -7343321, 2747169, +-3877282, -484258, 1573032, -3115999, -4798552, 642635, -3138547, -478352, -1585917, 2860985, +2870112, 916976, -6844568, -1481227, -2626373, 5280126, 1101659, 1585380, 6161668, 2937758, +2764885, -98247, 1667521, 9698573, 4763656, -1661616, 461709, -4668630, 3338263, -275952, +527207, -5748814, -761820, -3052111, -3914326, -1592359, 4333085, 3333432, 49929, 18790, +-3757023, -3528853, -1305133, -3597035, -7394323, 3778498, -3084324, -670015, -6961068, -1855963, +4182225, 2106145, -312459, -6386617, 7894150, -692027, 3128347, 1542967, 3696356, -6840809, +-3745748, 4275640, 2008971, -20401, -3860102, 706522, -10600516, -6822556, -467078, -4088272, +-4663261, 1817308, 8100845, 1326071, 6141267, -1494649, 6065568, -3731253, -3404835, -450435, +-5689758, 1072131, 2654290, -2044941, -253940, 1422171, 141197, 2495913, -421981, -5980742, +2010045, -3707094, -2915209, 1671816, -3803194, -5563594, 5408975, -5830418, 5140002, 4940286, +3107409, -239444, -6988449, -3953518, 635655, -1249836, 8683350, -5344550, 2008434, -628139, +1028645, -6592238, -11283953, -1865626, -3482682, -3597572, -1012002, 4858682, -1153199, -4845260, +4283156, 2094870, -2354179, 3959960, -825707, 1460826, -5213554, 61203, -1300838, 4174708, +4161823, 500901, 7590281, -188979, 3212099, 4038880, -165356, -3855807, 275952, -5434744, +-6959458, -2688113, -7916162, -8134131, -2744484, 5201743, -2016487, -1916092, -4317516, -1141388, +-7454453, 3502009, -2183454, 1733556, 4263829, 1418950, -1677185, 2953327, 2730526, -3641059, +2346126, 267362, 525060, 2620467, -6529424, -2813204, 4386236, -2953864, -352187, -1894081, +4882304, -6482180, -676994, -5432597, 3354906, -357556, -536334, 4837744, -2245194, -2370285, +-1821603, -4578435, 189515, -2084133, -494995, 282931, 2968896, 3133179, 935766, -1411434, +-5492190, -8803072, -2835215, -622770, -2270427, 4710506, -1988033, -2732673, 3714073, -2467459, +-3795141, 8274792, -1778117, 9217537, -5408975, -2396055, -3841848, 3608846, 909459, -105227, +6709813, 1851131, 2148021, -9038222, 1978906, -4045859, -4820027, -6271726, 140123, 564251, +8070244, -6062883, 3200825, -2342905, 9913321, -3143916, -2973728, 7238094, -2403571, 2736431, +1264331, -89121, 1359357, -4241280, 968515, 601832, 2166811, 9488120, 3380676, 1251446, +-3676492, 3594351, -6864432, -1538672, -1153736, 4305168, 3505230, 5941551, 3797288, -3660923, +-5870684, -2170569, 4816806, -77846, 2587181, -466541, -488553, 9773735, 2359011, -152471, +-10861435, -4348655, 461172, 4442607, 6077916, 8946417, 4827007, -1331440, 1664837, -1313186, +-2644626, 6743636, -3568044, 6996502, 487479, -4578972, 2243584, -1722819, 5128728, 1082332, +4656819, -1166084, -808528, -1779727, -5502390, 156766, 3930969, 3862249, 7340099, 3296388, +-9636833, -8129836, -6977175, 207232, -1163936, 423591, -3779571, -2460480, -556198, 2826089, +5369, -6285148, 6728603, -1067836, -6139119, 1149441, 1537598, -253940, -513249, 2550137, +3627637, -2352568, 5506148, 120796, 3280281, -7522099, 5369246, 1702955, 3162707, -5239860, +-403190, 3531000, 3341485, 7862475, -116501, -11303817, -2837900, -5522791, 2823404, 1590749, +-221191, -3185255, 1109175, -4784594, -1330366, -8534637, -4573604, -527207, 4960687, 4898410, +-3350075, -3456375, -2852395, 5018670, -1356136, -946503, -7465190, 4496294, -7303055, -3051038, +287226, -1995549, -1433982, 8020852, -678068, 2021856, -3103651, 3893925, -3503083, -211527, +5468567, 10100689, 6942278, 1311039, -8273181, -6286759, 1976759, -1614371, -5370857, -1931662, +-6861747, -3104188, 13226352, 1312649, -1611150, -2739652, -172872, -3366181, -2336462, 8818642, +-9585830, -1363115, 754841, -2270427, 2189360, 5222680, -2690797, -3364033, 1218160, -4124779, +-3927748, -9024800, -3405909, 2076080, -7996156, -1599339, 3724811, 5608691, 1938641, -12583717, +-3866544, 2165737, 6034966, -5130339, 10530723, -1561758, -5581310, -3349538, -2469606, -4553202, +5653788, -4682051, -1314797, -6081137, -4658966, -2455111, -4736275, 5789616, -2421825, -12673912, +4540854, 7907035, -57982, 2636036, -15142444, 11350525, 32212, -10101763, 812286, -6798397, +-11470784, 2103460, -8544837, 8320426, 1837172, -3714610, -6965900, -11937862, -5391795, -8755828, +2513093, 15734076, 2386928, -4592931, -607201, -2614025, -2842195, -7673496, -5136244, -7890929, +1678259, -971200, 1297617, -3030100, 900333, -8323647, -881542, 1394791, -5715528, -2399813, +345745, -3354370, 446140, -3122978, 11587822, -14987288, -2918967, 753230, 3594351, -1933272, +-6303938, -9363566, -6655589, 4357781, -1593433, 4880157, -4851166, 13370233, 1493575, -3112778, +-450972, -8636105, -10801843, -5729487, 3660386, -9380745, -861141, 10089952, -614717, -5395016, +-10307922, -17277042, 365072, 8270497, -2745021, 9574556, -1264868, -3432753, -6624450, -5768678, +537408, 3797825, -3673808, 14464913, 3752728, -4095251, 9564892, -4073777, -10856067, -2917894, +-8076686, -4187593, -3442416, 11668889, -2798171, -3827890, -4774393, 7510287, 6832756, 5965173, +16504486, 17186312, 8081518, 10689637, -3869766, -4911832, 7242926, 10531797, -4411469, 4629975, +3409130, -9137543, -8481487, 5094905, -1096290, -132607, -8453569, -10990284, -2428804, -8923868, +10242423, 18751828, 4072166, 7361574, 2355253, -2279554, 6913824, -12920872, -3231963, 2581275, +7359964, -4330401, -10166188, 15031312, 178241, -4777078, -3492882, 6076305, -1648731, 5388574, +-3579855, 8529805, -523449, -407485, 10943577, 3144453, 5151814, 1720134, -1447941, 7797513, +-12039867, -5142687, 4742718, 13571023, -8252243, -1248225, -1564442, -2225330, -5603322, -1536525, +-2747705, -4131222, 7078106, -6485401, -2378338, 6419366, -4590783, 2916283, 4880694, -8924405, +-9563282, 3044058, 7722888, -2296197, 7066832, -4721780, -1982664, 13306882, -14571213, 9183714, +-3995393, 377957, 613107, 16383690, -3368865, 3463891, 5333276, 9161702, 5401458, 8067023, +-1083406, -950798, 2746632, 1556389, 1501091, -7463580, 12291660, -15799574, -3343095, -3917547, +9210020, -1481764, 11179263, -162672, 1241782, -18829136, -5055177, 12052215, 20087562, 188442, +-9654013, -7930657, 8379481, 6959995, 5156645, 5090610, -8234526, -3451543, -4668630, 3017752, +593779, -4745402, 3301756, 3140695, -2178085, -2171643, -11319923, -2541010, -3987877, 17076790, +1775432, 3673271, 6519224, 1065689, -12751221, 1200443, -7750269, 6883759, 6176700, -12823162, +-5436355, -5325760, 1472637, -1496796, 17062294, -3050501, -197569, 10546829, -10948945, -8155606, +-10320806, -10741713, -3247532, -1170916, 3622268, 18318036, -2601140, -11818139, 18949396, -485868, +4677220, 12722230, 8464307, 11815455, -4184909, 9157944, -7334194, 12398497, 10666551, -3968550, +5118528, -6162741, -5860483, 4149475, 14208289, 5962489, 5043902, 1280437, -5783174, -9237401, +-9479530, 497142, 9427990, -6954626, -8286603, -9867687, -4413079, -18680960, -5193689, 2459406, +-14093935, 5344013, -139050, -6939057, -16411607, -11257646, -1092532, -21368000, 5237713, 3423626, +-1612760, 4548371, 2492155, -3145527, -11811697, -7632157, -2452426, -7992398, 4957466, -8392903, +15475304, -12787191, -863288, 5855114, -1379221, -24619290, 8904541, 11547020, 20116016, 166967, +-14646912, 4418448, 7286949, -15083925, -15808164, -9703405, -267899, 8790187, -326954, -5958194, +-226023, -5164698, -3592203, -9572408, 16581795, 13221520, 4914517, -19903416, -6020471, 3610457, +-1121523, -4139812, 25642028, 9772124, 8053064, 7939784, 12148315, 9538585, 2190433, 9982578, +-701690, -15465640, 8541079, -15905875, 4913443, -15726023, 13578002, -3790309, 16396038, -8505109, +3863860, -6761889, 5779952, 10219875, 25020332, 5907191, -32306208, -1100585, -4727149, 7511898, +13718126, -2185602, -6565395, 10981695, -2197950, -4342749, 13380434, 1626719, -1093606, 1493575, +5367099, 11882564, 8122320, -8601209, -7773354, -5041218, -10463077, 3259343, -1869385, 11939472, +6746320, -13820668, 27065810, -10198400, -17981418, -5683853, 7059316, -4398047, 13003013, 18853832, +-7553237, 17300666, 11087458, 8732742, -2862596, -2005750, -3499325, 16793322, 3019899, 2090575, +-9783936, 4314832, -5150203, -347892, -16153909, 10972568, -14845018, 144955, -10514617, 17516488, +-9040369, 463320, 17086454, 13169443, 8689793, -988379, -7026567, 8069707, -460635, -1495722, +-22239878, -6491306, -13552769, -10765336, -8719320, -3952444, 11120207, 7197829, 6316287, 18254, +16445967, -8949101, 17383344, 15613817, 16326244, 29322278, -11901354, -8986145, 12336757, 2279554, +-12065637, 17539036, -6568616, -8828305, 4938139, -2529199, -7074885, -5504001, 6573448, -10832444, +3462818, -7072201, 14882062, -7841537, -1466731, 3534758, 9600863, 14392435, -2989297, -15273977, +-26382910, -22468584, -2219424, 3331284, -15754477, -485331, 66572, 22317186, -16521665, -18589692, +4415764, -8457327, -1296006, -13850733, 10888279, -14040248, -18694918, -11566347, 18783502, -14740328, +-12538620, -3594351, 6807523, -7008313, -15791521, 3492882, -7231651, -878858, 5149666, -19965156, +-2866354, 9605157, 15473157, -3481071, 24397562, 10455561, -4450123, 281857, 10241350, -5692443, +-12074227, 1173600, 12437152, 764504, 5119064, -455803, -13120051, 3226057, -26874684, 1584306, +-344134, -3883724, -16595754, -14107894, -162135, -6736120, -12037720, -7366406, -10106595, 9161702, +-18560702, -9889162, -6820945, 6884296, -11883638, 20109036, -5281736, -17228188, -3822521, -10157061, +-29635274, -7892003, -928250, -326418, -20716238, -8477729, -7882876, 19789598, 17717276, 5728413, +35702988, -5942624, -11842299, -10393821, -4730907, -18313204, 26036628, -14666776, -5227512, -11718281, +-6066642, -5097053, 3347927, -17260936, 577673, 1022739, -2220498, 5976984, -18832894, -3962107, +13296145, -12068858, 897648, -15851651, 16287590, 1091459, -28533616, -13835700, -5094905, 461172, +8033200, -16287590, -9728101, 13114683, -2045478, 9464497, 7558606, 8752070, -10516227, 2473364, +12567611, 6047851, -23807540, 16670379, 10822244, -11309723, 36100812, 897648, -26363046, 8844411, +7904888, 1118839, 18999862, -4167729, -32854890, 10998874, 4120484, 11660299, 10893648, -12760885, +22744000, 10980621, 6483790, -3297998, 34564824, -320512, -481573, 26774290, -5429913, 13756780, +17640504, 9451076, 1044751, -1650878, 7088307, 7321846, -24896314, -24438900, 50813220, 16531866, +-31361314, -15678241, -14254996, -28727426, -1908039, -15067282, 21315386, -11712913, 354872, 26474178, +821413, 4557497, -19092204, 24418500, 18323942, -130460, -5574331, -1707786, -14768782, 1321776, +2194192, 3250217, -20387136, -2835215, -903017, -6049462, -4304094, -14079440, 13807783, 26920318, +32443110, -2444373, -12697534, -5257040, -6331856, -4328790, -19390704, 6885907, 8041790, 7252589, +-20209968, -27249420, 29998200, 11385421, 16957604, 21731460, 20551956, -8555575, -13452374, 19698868, +-19476602, 10282152, -14489609, -11155104, -6272800, 23439784, -7351374, 4982699, 8289824, -3932580, +-18469434, 39102456, -23213224, 2769180, 28237800, -25021942, -11503533, 3446711, 10008348, 29384018, +13582297, -7990787, 8674760, 34136936, 20734492, -2611877, -21169894, 2692408, 34974992, 27952184, +6201396, -26929982, -10139881, -23193360, -1372242, 18910742, 23217520, -1255204, 9052180, 27557048, +29247116, 45231376, 45468672, -22127134, 10154376, -23933706, -4077535, -19337016, -6778532, 15924665, +-3190624, 7170985, 6386080, -13663365, -10012643, 11779485, 12991202, 16873316, 11975979, -257161, +12315282, 18553722, -9515500, 9513889, 10904922, 3445101, 10620917, 35167728, -26210038, -22439594, +-5069135, 21745956, 20681878, -12192875, -220117, 33248952, 26726508, -18791018, -12710419, 11363410, +-23194434, 6284074, -11346767, -21011516, 6362994, -24743306, 24978992, 8973797, 27626840, -12325482, +-17123498, -32477468, -7648263, 9535901, -28765544, -25009058, -15302432, 13777718, 34321620, -1678259, +-10063645, 22281216, 4875862, -700617, -31871878, 28905666, -13622563, -30050812, -10070625, 2694018, +35649840, 4025995, 25617870, 10928007, -29700772, -5832566, -26300232, 4973036, -26234734, -18307298, +-11145440, 2086817, 5769752, -19744502, 20322174, -5699422, 12402792, 13980119, 13166759, 25279640, +44696116, 27023398, -8396124, -21029770, -674847, 47847548, 29312614, -15035607, 23423142, -8032663, +28584082, -13182865, 2804614, -9592809, -5243618, -550830, -8005282, 71606232, -13408888, -18364744, +-22497038, -30515206, -12166569, -23229330, -1067836, 28452548, -10819023, 9280351, -9009231, -12643310, +24908126, -5587216, 41952704, 9103720, 33695628, -39382704, 17250736, 73246912, 26783416, -38262252, +24941948, 23925116, 2971044, -1137630, 46691128, 20536922, 3131031, -3903589, -55861956, 22562536, +31298500, -26632556, -19949050, 39119100, 24775518, -35696548, -37620156, -1218697, -22944790, 6503118, +1118839, 6077916, -35486092, 6161668, -8746164, -19063212, 27200028, -4602058, -7201587, 7347616, +22438520, 19636590, 12912282, -31008590, -1676111, -16486232, -32574642, 8385387, 6264210, 15982110, +-8710194, -16806208, 36416492, -30521112, 9946607, 10728291, 8597988, 5570573, -7177964, 20132660, +-23620172, -39457328, -8569533, -44804024, 34442952, 19864224, 33718716, -5723581, 4612795, -32008244, +27834072, 35560180, 11135240, -19020800, -45635640, -12529493, -59428924, -1695438, -13415330, -40771588, +-35591320, 12903155, -740345, 22147536, -21588116, 26565446, 19302120, -30754650, 3064459, -4585415, +-32618130, 16088947, 12438762, -14606647, 6680285, -6857452, -49778136, -12071006, 13616120, -4489315, +6607271, -26844620, 37928856, -47130824, 4768488, -34068756, 25651156, 28927678, 9763534, 24526410, +3346317, -21767968, 40860708, -16929150, 4953708, 2464238, -22378928, 39947492, 3286724, 11842835, +8930848, 13920526, 6880538, 30625802, 34100968, 13551159, 39705364, -31811750, -2225330, 2410014, +50525460, -7100655, 40291088, 24945170, 55196236, 13541495, -12331925, -14684493, 21912386, -38122668, +38778184, -20262582, -13952738, -3188476, 7607998, 32925220, -7219303, -49566072, -15286325, 90366648, +5772973, -50050864, 12626667, -31302796, 9672266, 90272160, -24722368, -17465484, 57370564, -57008176, +29979408, 22697828, 16248398, 65965328, 30629022, -31223876, 43523588, 21523692, 29282014, 55790552, +27815282, -26820460, 35735740, 10628970, 32261646, -9368397, -59547576, 60508572, 52727704, 32217086, +99485400, -9417253, -83253112, -43278236, -39203388, 87951264, 64958696, 15454903, -5414880, -16342351, +-58088896, -27947890, -18657874, -33780992, 89950040, 72468984, 101441760, 1549410, -115429392, -180585120, +-87567944, 100036232, 135862704, 137968848, 56164212, -115144312, -210333136, -129701032, -64778308, 96728032, +165792720, 93353264, 51570748, 13089450, -74022688, -100818992, -74407624, -6302865, 58762132, 117176912, +141568560, 24322936, 28272696, -112610288, -184599840, -99661496, 93188440, 154194160, 147858544, 90866472, +-53012244, -181281984, -115792856, -152224912, 1564979, 101556648, 111921480, 54525684, -43077448, -95905008, +-83486112, -66998268, 19372450, -13599477, -33390150, 36410584, 4372277, -55133960, 5967320, -15054934, +-22742388, 15350750, -17658222, -7562901, -29977798, 759672, -12059731, -22553948, 7694971, -3339337, +6286222, 2629594, 17028472, -18531710, -6921340, 4598836, 996969, 7528541, -8511015, 17322676, +-13768591, 11702712, 4938139, -6624450, -14441828, -6523519, -26191248, 26692684, -3510599, 254477, +-5812702, -7175817, 441845, -1406602, -384400, 10011569, 5191542, -852551, 14203994, -13783087, +3535832, -13069585, 12552579, 8031589, -11758010, 6986838, -14134201, -14627048, -13101798, -22323630, +-4002373, 16539382, -16899622, -30075508, -22522808, 1962800, 16248935, 725313, 11324218, -28036472, +-10231686, -2408403, -5792301, -26592826, -10924786, 3082176, -1079647, -6409702, 21068426, 20542828, +-23868208, -29835528, -48579300, -75934488, 2131378, 61623652, -24423868, -38719132, -41452876, -39085812, +7386807, 7476465, 70993664, -10878078, -10985989, -32384054, 2860985, 9220758, 21840446, -24439974, +11396696, -17890150, 27302570, 8507256, 8408472, 2948495, -18269180, -9920838, -12204686, -4168266, +9320079, -10929618, -10140418, 19407346, -18960670, -11660299, 15457050, -15949361, -6650757, -13737990, +-22763326, 7347616, 13346611, 2270964, 12497818, -20876762, -6238440, -967978, 10863046, 14371497, +17201344, 906775, -2990908, -31236224, -32806034, -12125230, -11398843, -7358890, 13427142, 19495930, +27020714, 2615098, -14006962, 27685896, -21320218, -9645960, 11437498, -9575093, 35989680, 1003949, +-7184407, 5176510, -14397267, 9304510, 25143812, 18997714, -7453916, 4184909, 18347026, -49836652, +-114763136, -88017304, -11290932, 36240936, 96627640, 81349368, 77650864, 79280264, 51926156, 21086142, +-30303678, -52849572, -99597072, -73795592, -72449120, -72326712, -45391360, 41511396, 56517476, 83517248, +63934884, 53245784, 16811038, 35077536, -9375914, -10752987, -12608950, -21235928, -38408280, -31829466, +-63881196, -24158118, -50954956, -25035902, -12898324, 15032922, 2167885, 22079354, 4326106, 31450434, +22988276, 38330972, 51550880, 64124400, 40779104, 26913338, 45450956, 2476586, -16720308, -58385784, +-68112816, -93472984, -83266528, -77978352, -30285426, -51379084, -27139898, 2455648, 13401372, 32191316, +61901752, 66176856, 74020000, 112215688, 63218160, 86481312, 60106992, 14897094, -7863012, -32706176, +-87242064, -93488016, -88557392, -94190240, -63826972, -19724100, -1180042, 2333778, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, }, { { 2484102, --669478, 1698123, 1275068, 2346663, -433255, -1897839, 3670050, -516470, -5807333, -1687385, --6451041, 4508105, 867583, -973347, 906775, -1239098, 862752, -5407364, 4455492, -544387, -1574106, -5060545, -1840394, -1856500, -7013145, -2695629, -594316, -89121, -454193, 2633889, --999117, -2592013, -2026151, -5426691, -499290, -5418101, -318364, 1212255, 1358283, -1422708, -129923, -987306, -183610, -1873680, -1769527, 1171452, -1134408, -1350230, 2147484, 7158100, -343597, 3140158, 5743982, -535797, -1183264, 5374078, -2950106, -405874, -1194001, 248034, -2247342, 962610, -2411087, -2822331, 3053722, 1730335, 3431142, -2044941, -1890323, -2705830, --1158567, -1047972, -1282585, -1843078, 635118, -9339943, 7177964, 325881, 3278671, 3257196, -9297530, 4361003, -3482145, -4381404, -6109054, 4323422, -5350456, -3890167, 828392, 1309965, -533650, 5447629, -1831804, 5090073, -1355599, 4566087, -4396973, 1986422, -1971390, -4677220, --380105, -8895951, 1275605, 2144799, 3907347, -3271155, -112743, 3425237, -2609730, 3849901, -3591667, -2235531, 2557116, -2985002, -1443646, -2221035, -3257733, -4088809, 3535832, 5291937, --4085588, 2314451, 4206384, 3415036, 5165235, 591632, -891206, 2986613, 2218351, -5647882, --325344, 547071, 234613, 1656784, 3478924, 684510, 1172526, -2073932, -1365263, 2384781, -3430605, 1800128, -2059974, -3560528, 3521873, -3293703, -1158031, 1688459, -817654, -653909, -1379758, -361851, 3693672, -1944010, 2706366, 269509, -223338, -7493108, 1208496, 6408091, --3922916, 2658048, -7969312, -8046621, -2658048, -6538014, -5725192, -839666, 1180579, 4530117, -714038, -2143726, 1016297, 3096135, -3969087, 5525476, -3727495, -3990562, 4648229, -2278480, -5355288, 6855305, 936840, -4871567, 3431679, 2295660, 1370632, -2449742, -1821603, 2918430, -2381559, 547071, -5564667, -1537598, -5140539, 4707284, -4640176, -2943663, 3405909, 245887, -2956548, 940061, 1133335, 5145908, 852551, 5768678, -7293392, -3623879, -1680406, 3750043, -5123359, 5993090, 7968238, 1032403, -2237678, -569083, -1027571, -23622, -5111011, -2006287, --2168422, -322659, 911607, -3810710, -2317135, -442919, -1539209, -2516314, 4241280, 8414378, --6449431, -2496450, -1367947, 5126581, 4617627, -4903779, -554588, -8999030, -2057289, 10640781, -3937948, -4452808, 7611219, 2399276, 2856153, 666257, -2706903, -8594766, 1023813, -3938485, --2528662, -1670742, -5276368, -1950452, -4109210, 2666638, -1920924, -2461553, 4723391, -9240085, -8279623, -3078955, 1083942, -2976949, 2510945, -461172, -944893, -346282, 3465502, 56908, -2153389, -3377992, 6182069, -5005248, 7217693, 1442572, -823560, -4212289, -4903779, 9834938, -1620813, -9434969, 9445707, 8882529, -4968741, -1890859, 2740189, -3777424, -763430, -2357400, -2186138, 5653788, -3550327, 1243393, -2663954, -2438468, 902480, 7690676, -7094749, 4297652, --7280507, -5560909, -5198521, -806917, 350577, 348966, 1670742, 3245385, -2456721, 1199370, --5644124, 7028177, -8260833, 1184874, 10377715, -16456704, 12907450, 5642514, -3720516, 4619774, -531502, 11319386, -206695, -7850127, -5165772, 4355097, 4971962, 1997697, 1201517, 5287105, -2258079, 1563905, 6980933, 3307662, 2673080, 5192079, 4089883, 15783468, -3143379, 4814659, -763967, -1616518, 4871567, 3250217, 2523830, 2739116, -1429687, -3295851, 1309428, 839129, -1265942, 3011309, 5632850, -3803194, -3852049, 2989297, -70867, -1033477, -1821066, 6945499, --3200288, 9659381, 5330055, 1260573, 3299609, 1620276, 3681861, 12055973, 10714870, 1605781, -1921998, 3046743, -777926, 5089536, 648540, 4687957, 2869038, 1171452, 1918777, -3832185, -6835978, 4434554, -795106, 2536178, -723165, 5191005, 394600, 5954436, -1874216, 5338108, --3501472, 10768557, -7699266, -2551211, -3567507, 11124502, 6257768, 4376572, 6977711, -5676336, --1071058, 10349261, 5755793, 5128728, 4930086, 3071975, 3413962, -599148, 9570798, -433255, --4271882, -2669859, 3388729, -2980707, 2221572, -8341900, 3350611, -1083942, 192200, -8964670, -4146254, -1385127, 9009768, -769873, 2818036, 3207804, -3866008, -188442, 4034048, 1353989, -2720325, -1216550, 4886599, 7955353, 754304, -4061965, 1736241, 5928666, 3382824, 1643362, --3605088, -5945846, 5619428, -6675453, -3541201, 5530844, -10579578, -1100585, 6111202, -3390340, -1058173, 1607928, -852551, 346819, 2381023, -3089692, 215285, -5889474, -3869766, -5168993, --3598109, 2274185, -19508816, 2783676, -6535330, -4003447, 3777961, 2768643, 1739999, 307090, --14506789, -1992328, 3749507, -8000987, -2554969, -10748693, -5812702, 1772748, -1825898, -9926743, -9196062, 5421860, -3626026, 562641, 7088844, -5481452, 1435056, -3901441, -6033356, -4156992, --10397042, -4114042, 6684043, 2990371, 8716636, -5219459, -16044924, -7100655, 3063922, -5384279, --10715407, -2139968, -2597382, 8702677, 3935801, -11089606, 6380174, -7965017, -1215476, -5858873, --6021544, -5388574, -12579959, -7363722, 61203, 7220377, 10620917, 6988449, 1294396, 4237522, --6084895, -9049496, -6286759, 5281199, -3582540, 5757404, -2733210, -5732708, -1231582, 416075, --3678103, -6259915, -652835, 4908611, -16480326, -9588514, 12553653, 7547868, 86436, 3983045, --4692789, 3974455, -6527277, -134755, 12042015, -5199595, 11375758, 11669426, 14147622, 3870839, -5781563, 12412455, 9597104, 7336878, -9130564, 1643362, 3111704, 8500277, -1432909, -6447820, -9081708, 9543954, -2448668, 6533182, -2901251, -2652142, 5780489, 5434208, -611496, 6366752, -575526, -8971650, -7572028, 8813273, 11981885, -348429, -4129611, 3135326, 359704, -5069135, --10711648, 6227166, -10150081, -4248797, 7658464, 2327336, 6745783, 1006096, 10832444, 2258616, -11883101, -13214541, 12521977, -1670742, -665183, 4643397, 6490233, -4521527, -11812234, -2390686, -10334228, -1131724, -12692165, -6335077, -7936026, 3087008, 4088272, -9683541, 5007932, 7421167, -10689637, 4731444, 2889976, 3564286, 11861089, 1345935, 4852776, 14115947, 15264314, 4387846, -3719442, -11630235, -5915781, 12378096, -9509594, 12647605, 3498251, -300111, -2699387, -4762582, --7572564, 1099512, 5591511, -14137959, -6388764, -6181532, 2971581, 2488934, 2939368, 122407, -2262374, -823560, 4090956, 3067681, -3760244, -6841883, -12065100, 1760400, -6550362, 10455561, -363462, -6387153, -7609072, -2699387, 4961224, -9819906, 5828808, -3572876, 1882269, -549219, --6763500, 6199249, 8367670, -6255083, 7030325, 1526861, -606664, 19693498, -5149666, -13652090, -2414309, 4363150, -3356517, 500364, -5794985, 13100724, 7879118, -2018635, -3059091, 9055939, -9161165, -2676838, -8133595, -6529961, 18836116, -2545305, -2997887, -8465381, 4498442, -11009612, --3452080, -3794067, 408559, 4002910, 9918690, 8591545, -14968498, -153545, 1243393, -1958505, --4788889, -10485089, -1481227, 2873870, 5481452, 4328790, -9629317, -2104534, -12083354, 10388452, -24696, -1597191, 4786741, -5702106, -1399086, -12913893, 1628330, -7929047, 4656282, -1509681, --2524367, -4738423, -8671539, -8553427, -1398012, -10429254, -16527034, -3567507, -7776575, -16042777, --1705102, -1931125, -8905615, 4922570, 8039642, -1686312, 3598109, -1719598, -1790465, 1633161, -2062121, -13205951, -4132296, 6148246, -6469295, 14224395, 2270964, 3214246, -10086731, -914291, --4779225, -10728291, -1454920, 12963285, 6060736, 9548249, 5510443, -5715528, -11509975, -18769008, -11541651, 10588168, -1447404, 4433480, -12719546, -27453968, -7132330, 21216064, 6849936, 8457327, --5977521, 8549669, 14663018, 779537, -2904472, -25358560, -6222334, -1493575, 13966697, 3725347, -5360119, -19068582, -5452461, -7283728, -4875325, 11355357, -6998113, -2587181, 1598265, 3037079, --6356015, -2890513, 2572686, -5541045, 11017128, -13152800, 936840, 8170639, -11480448, 8739722, -14895483, 17593796, 8111583, 8453569, 11255499, -8363375, -15273977, 5583995, 5910949, 9450539, -7250979, -17022030, -5281199, 8440148, 4530654, 2845953, 9929964, 1995549, 11647951, -4914517, --3197603, 6591164, 5880884, 1531156, -11335492, -6192269, -12139188, -13706314, -1360968, -14987288, -175557, -8994198, 11811, -8295193, -5106179, -19295140, 12253542, 2579128, -3322157, -4225174, --2710661, 1493038, 16714402, -8579734, -7372312, -6583648, 11429982, 14556181, -9603010, 23539106, -4742181, -10517301, 11949136, 3154654, -10191957, -12009802, -9674414, -1099512, -5302674, -3813931, --15793132, 5892159, 6258304, 21163452, 2699387, -4030290, -9917079, -10536629, 2381023, -1571421, --13794361, 2041720, -5221070, 278099, 10348187, -8509404, 13751412, -12582644, -10386842, -1078037, --16080358, -19485730, 2997887, -2579665, -22123914, 1132261, 190052, -10884521, 5464272, -5493263, -2763275, -15294915, -24312736, 15567109, -14844481, 24336358, 13573170, -18083422, -2162516, -18318036, --4686346, -2671470, 7628936, -6848862, 11597485, 13923210, 13901199, -10178536, -7597797, 927713, --11528766, -1415729, -3286724, -16065862, 10322954, 7048578, -7274064, 13069049, -16226386, -13933948, --10488310, 7738994, 9219684, 10200547, 16793858, -5449777, 30487826, -341987, -15089294, 7396471, -15240155, 4687420, 8207146, -5926518, -16230681, 25712358, 14309757, 10958072, 5257577, -7948911, -8449811, 21594022, -7290170, 5240397, 156229, 5184026, 3946538, 15675557, -3933653, 5900212, --4908611, 5395553, -1087164, 110059, 9543417, 2901787, -18107582, -11382737, -16957604, -10816338, --8859444, -3502009, -12924630, -6389301, -6204617, -10325101, -7681549, 6240588, -11684995, -2889976, --9010841, 23505282, 11574400, 20695300, -17237852, -214748, -15721191, -1871532, 18231600, 11471321, -21443162, 11786464, 13414793, -12060805, 6649683, 8145406, 19996830, 22032646, 6462852, 20374788, --14837501, -4680441, 12409771, -37403260, 2119566, 17664664, 11545946, -11294690, 22542136, 13430363, --950262, -5433134, -2628520, 13571023, 33221036, 17783848, 4936528, 1503775, 11040750, -2538326, -26854820, 15180562, 16843252, 772020, -8306467, 5734855, 2188286, -14111652, -3319473, -838056, --3180960, -3998615, 5577552, 2981244, -11479374, -5561983, -20413442, -2108292, -6257768, -26467736, --11760157, 772020, 10003516, -13663902, 17110612, -4784594, -4002910, -2409477, -4118337, 12269648, --8324721, 8516383, -27146878, 8225399, 11768747, 8929774, 17963164, -18080738, 15311558, -16292422, --12196633, 13079249, -8156680, -2743410, 10832981, -18584860, 15584826, 25350508, -1209033, -4307852, -32072668, -7741142, 5194763, 17822504, -41137732, -21180632, -744103, 95026, 2351495, 8061117, -14353244, 8967355, -21549462, -5966784, -31390842, -18896782, 23164906, 22983980, 2518998, -5468030, -19562502, -31549220, -16845398, -34146064, 14995341, 4072703, 1609539, 6532646, -15405511, 7764764, -10910291, 14043469, 24107114, 24523190, 20842940, -967978, 4836670, 125091, -8840653, -2022393, --7341173, -4060355, 28765006, -6863895, -26064010, -6847252, -5185636, 2125472, 41399728, -15124727, --14511084, 13671418, -22033182, 7429757, -24463060, 32017370, 9421548, -1226750, 8595840, -12815109, --15459198, 21772800, -26591216, -21910238, -18996640, 4939750, 8465381, 9616969, -17558900, 17926656, --5270999, 853088, 28826746, -2520072, -4351876, 7719130, 23415088, -15532749, 38540888, 617938, --43161736, -6234145, -989453, -15695421, -3392487, -1365263, -3027415, -13857175, -8345659, 17492864, -8007967, -6314676, -1478543, 44339632, 27329414, -31111132, -24633784, 36193688, 34637300, 22630182, -25628070, -37520836, -6199249, -8470212, 13191992, 6484327, -13564044, -27020176, -42226508, 15732465, -14492293, 6097243, 15007689, -3497714, 433792, -8004209, 11614665, 18187576, 16668231, 6317897, -21274046, 8634495, 684510, -4836133, -24457692, 1270237, -8625905, -6747394, 12372190, -26467200, -5550709, 4001836, -10674604, 14805289, 13982803, 8309151, -16596827, -15376520, -45103064, -9296457, -3578245, -12418361, 6048388, 13302051, 13580150, 30167850, 16786342, -8659728, -4679367, -14570677, -26542362, -6062347, 43328704, 36456756, 13378286, -17177184, 47956532, 23987392, -12608413, 7022809, -27282706, 55225764, -14609331, -33152316, -12372190, 7245610, -2193118, 18779208, 7837242, -9129490, -10143639, 922344, -7731478, 17211008, 6162205, -5242545, -16037408, 14207752, -27340152, -24675660, --9091909, 20437066, -11289858, -13607530, -205085, 23549306, 2275259, 24365886, -8013335, 29280402, -3026878, 16223165, -10206990, -5482526, 8585640, -27943058, -8552354, 12286828, -5683316, -2556579, --24020142, -20721070, 9668508, -11995307, -10409390, 19793894, 24149528, -1963337, 15528991, -27692876, -841814, -6109054, 37241660, -13790066, 11589969, 25591562, 21065204, 8784282, -16987132, 12319040, -5593121, 9323300, 10675141, -35030828, 67766528, 25137906, -8174934, 6744173, 5524402, 22641456, --7925289, 18447958, 37724308, 1553168, -53472880, 25216290, 13695040, -13142063, 19138374, 86973, --15933255, -20787104, 45022532, -19213536, 46641196, -20296942, -8302709, 47775604, 5717675, 25935696, -13239237, -26289494, 1649268, 15581068, -4686346, -22907744, -4379793, -49945100, -13973139, -18632106, --10768020, 10851235, -1469416, 17809618, -8771934, 1866163, 17385490, -15595563, 1650878, 9825275, --1013075, -17137456, -71404, -11828877, 34391952, -6197638, 19902342, 3051038, -405338, 35109748, -25363930, -15788300, -18342732, 8684961, 15890842, 19077708, 23431194, -783295, 8189966, 21927418, --1333051, -9426379, 6864432, 277562, -19912542, -1020592, 12908524, -20111722, -26350162, -3209414, --1698660, -3636227, -8894877, -10410464, -31310848, -1082869, 30666066, 8231305, 17122960, 8679592, --3961571, -42021960, -29311542, 6034966, 26676042, 6226092, 14101451, 50219440, 56551296, 42986716, --1324461, 18129594, -11250667, -41430328, -12513924, -28809030, 11126650, -16311212, 11366631, -5713917, --19774030, -4362076, 2051384, 13386876, -7128035, 8079907, -30145838, 32791538, -65553012, -4138738, --14818711, -11181410, 11136850, 41466836, 8269423, 16846472, -31307628, 10322954, 14287746, 29533268, --11873974, -18569292, -13003550, -4262755, 912681, 2544231, 18008262, 14915348, -7609072, -45600740, --21350282, -36384816, 6452652, 73555608, -47777752, -16087874, -5836861, 44174276, -11787538, 20905216, --11216844, 23425826, -6032282, -7796977, -23500988, 17160542, -27540940, 31323196, 50310712, 10770704, --7458748, -4416837, 41884520, 15625091, 1028645, 26492968, 8315594, 13099650, -6593312, 52376588, --72422272, 59130424, -43932148, 27502824, 53038552, -35573604, 85165440, 64849712, -22929756, -483184, -52582212, 10427644, -1819456, 49515604, 47280612, -40470940, 39404716, 36080948, -33980708, -51576116, --75854488, 17479980, 114150032, 46601468, 357556, 23259396, -108829104, -45330696, -3646427, 16282758, -82269024, 79885320, 14143327, -31326418, -60071024, -35826468, 4464082, 25467008, 39623220, 62625992, -38553236, -51353852, -119683560, -98488968, -9075266, 108454368, 119198224, 74342128, 23548768, -25802552, --47702056, -73814920, -40949292, -45182520, 88082800, 71890240, 46770048, 39872864, -60738352, -87229176, --99286760, -90647432, 35748088, 120885072, 151079232, 49818400, -44083544, -107556720, -126545304, -35707820, -22132504, 12317966, 81728392, 30499636, -28472948, -18853296, -59732256, -14364518, -68441912, 29630442, -85649168, 155424128, -7383586, -84310208, -179678352, -7825968, -60879552, 709207, -10483478, 51368884, -29966524, -4529043, 10808285, 5589363, -36745056, -3774740, -3145527, 4064650, 944893, 3024731, --13609141, -5235029, -5191005, -3227131, -6372121, 22072374, -8183524, 9603010, -16834124, -1443646, -6428493, -537408, -5424007, 38103340, 4785131, -21122112, -25380572, 5560372, 4700842, -14271639, -3482682, 19392314, 9247065, 18308372, -18980534, 5998996, -1376000, 4792647, -13673565, 2987150, -13449153, 20824686, 4206921, -4646081, 4942434, 2966212, -5792837, 14537391, -21561810, 5400385, --34487512, -9536975, 12334609, -10332081, -14865419, 19091130, -13183402, -29874182, -25834766, 22508850, --4685810, -2826625, 2615635, 12326019, 24374476, -15803869, -25809532, 2990908, -6576132, 20608326, --4078608, 13589277, -1009854, 2337536, -30821222, -33906620, -79672720, 22098144, 21817896, -2318746, --67296768, -43715252, -7096360, -11606075, 43687332, 29312078, 13646722, -30123290, -12941810, -8461086, -27052388, 2416993, -8724152, -17913772, 10622528, 4461398, 13054553, -1350767, -6455336, -7647726, --16724603, -8502962, -10436234, 26067768, 13419088, 2628520, 3191698, -17989470, -1731946, 1682554, -23490250, -2168959, 10531797, -9402220, -7068443, 4609037, -10780368, 6318971, 2141041, 6868190, -22931904, -2263985, 20044612, -403190, 12621835, -10382547, 169114, -15159624, -20343650, -20562692, --18363132, 6059662, 2438468, 1881733, -26664230, 13395466, -23241142, -1854352, 682363, -13266080, --15824807, -6873022, -63888, -25426206, -18562848, 19097036, -8240432, 18857590, 2741800, 16105590, --39820252, -96227672, -92380448, -15345381, 25716654, 89699320, 77120968, 72816336, 78090560, 42960948, -8966818, -41781980, -42320460, -85619096, -67212480, -58720792, -38221988, -47107200, 61097520, 50477676, -66293892, 38030860, 53811108, -3291019, 12722230, -10189273, -23733990, -13634374, -28012850, -31404264, --32165546, -30837866, -37244344, -26830660, -23001698, -3396782, 3440269, 48476224, 39378408, 20952462, -21359410, 31758062, 28112172, 13780939, 68213744, 8424578, -1277216, 12552042, -28508382, -81340240, --25330106, -65220688, -71667432, -73731704, -54124104, -46457052, 95563, 38241852, 36912024, 47859896, -84735944, 62863824, 74178384, 75566728, 45872936, 52449068, 15830176, -16471736, -60059748, -74523048, --88713088, -53304304, -78396040, -59574956, -71856952, -28498718, 16186658, 28952912, 19346680, 0, -0, 0, 0, }, +-669478, 1698123, 1275068, 2346663, -433255, -1897839, 3670050, -516470, -5807333, -1687385, +-6451041, 4508105, 867583, -973347, 906775, -1239098, 862752, -5407364, 4455492, -544387, +1574106, -5060545, -1840394, -1856500, -7013145, -2695629, -594316, -89121, -454193, 2633889, +-999117, -2592013, -2026151, -5426691, -499290, -5418101, -318364, 1212255, 1358283, -1422708, +129923, -987306, -183610, -1873680, -1769527, 1171452, -1134408, -1350230, 2147484, 7158100, +343597, 3140158, 5743982, -535797, -1183264, 5374078, -2950106, -405874, -1194001, 248034, +2247342, 962610, -2411087, -2822331, 3053722, 1730335, 3431142, -2044941, -1890323, -2705830, +-1158567, -1047972, -1282585, -1843078, 635118, -9339943, 7177964, 325881, 3278671, 3257196, +9297530, 4361003, -3482145, -4381404, -6109054, 4323422, -5350456, -3890167, 828392, 1309965, +533650, 5447629, -1831804, 5090073, -1355599, 4566087, -4396973, 1986422, -1971390, -4677220, +-380105, -8895951, 1275605, 2144799, 3907347, -3271155, -112743, 3425237, -2609730, 3849901, +3591667, -2235531, 2557116, -2985002, -1443646, -2221035, -3257733, -4088809, 3535832, 5291937, +-4085588, 2314451, 4206384, 3415036, 5165235, 591632, -891206, 2986613, 2218351, -5647882, +-325344, 547071, 234613, 1656784, 3478924, 684510, 1172526, -2073932, -1365263, 2384781, +3430605, 1800128, -2059974, -3560528, 3521873, -3293703, -1158031, 1688459, -817654, -653909, +1379758, -361851, 3693672, -1944010, 2706366, 269509, -223338, -7493108, 1208496, 6408091, +-3922916, 2658048, -7969312, -8046621, -2658048, -6538014, -5725192, -839666, 1180579, 4530117, +714038, -2143726, 1016297, 3096135, -3969087, 5525476, -3727495, -3990562, 4648229, -2278480, +5355288, 6855305, 936840, -4871567, 3431679, 2295660, 1370632, -2449742, -1821603, 2918430, +2381559, 547071, -5564667, -1537598, -5140539, 4707284, -4640176, -2943663, 3405909, 245887, +2956548, 940061, 1133335, 5145908, 852551, 5768678, -7293392, -3623879, -1680406, 3750043, +5123359, 5993090, 7968238, 1032403, -2237678, -569083, -1027571, -23622, -5111011, -2006287, +-2168422, -322659, 911607, -3810710, -2317135, -442919, -1539209, -2516314, 4241280, 8414378, +-6449431, -2496450, -1367947, 5126581, 4617627, -4903779, -554588, -8999030, -2057289, 10640781, +3937948, -4452808, 7611219, 2399276, 2856153, 666257, -2706903, -8594766, 1023813, -3938485, +-2528662, -1670742, -5276368, -1950452, -4109210, 2666638, -1920924, -2461553, 4723391, -9240085, +8279623, -3078955, 1083942, -2976949, 2510945, -461172, -944893, -346282, 3465502, 56908, +2153389, -3377992, 6182069, -5005248, 7217693, 1442572, -823560, -4212289, -4903779, 9834938, +1620813, -9434969, 9445707, 8882529, -4968741, -1890859, 2740189, -3777424, -763430, -2357400, +2186138, 5653788, -3550327, 1243393, -2663954, -2438468, 902480, 7690676, -7094749, 4297652, +-7280507, -5560909, -5198521, -806917, 350577, 348966, 1670742, 3245385, -2456721, 1199370, +-5644124, 7028177, -8260833, 1184874, 10377715, -16456704, 12907450, 5642514, -3720516, 4619774, +531502, 11319386, -206695, -7850127, -5165772, 4355097, 4971962, 1997697, 1201517, 5287105, +2258079, 1563905, 6980933, 3307662, 2673080, 5192079, 4089883, 15783468, -3143379, 4814659, +763967, -1616518, 4871567, 3250217, 2523830, 2739116, -1429687, -3295851, 1309428, 839129, +1265942, 3011309, 5632850, -3803194, -3852049, 2989297, -70867, -1033477, -1821066, 6945499, +-3200288, 9659381, 5330055, 1260573, 3299609, 1620276, 3681861, 12055973, 10714870, 1605781, +1921998, 3046743, -777926, 5089536, 648540, 4687957, 2869038, 1171452, 1918777, -3832185, +6835978, 4434554, -795106, 2536178, -723165, 5191005, 394600, 5954436, -1874216, 5338108, +-3501472, 10768557, -7699266, -2551211, -3567507, 11124502, 6257768, 4376572, 6977711, -5676336, +-1071058, 10349261, 5755793, 5128728, 4930086, 3071975, 3413962, -599148, 9570798, -433255, +-4271882, -2669859, 3388729, -2980707, 2221572, -8341900, 3350611, -1083942, 192200, -8964670, +4146254, -1385127, 9009768, -769873, 2818036, 3207804, -3866008, -188442, 4034048, 1353989, +2720325, -1216550, 4886599, 7955353, 754304, -4061965, 1736241, 5928666, 3382824, 1643362, +-3605088, -5945846, 5619428, -6675453, -3541201, 5530844, -10579578, -1100585, 6111202, -3390340, +1058173, 1607928, -852551, 346819, 2381023, -3089692, 215285, -5889474, -3869766, -5168993, +-3598109, 2274185, -19508816, 2783676, -6535330, -4003447, 3777961, 2768643, 1739999, 307090, +-14506789, -1992328, 3749507, -8000987, -2554969, -10748693, -5812702, 1772748, -1825898, -9926743, +9196062, 5421860, -3626026, 562641, 7088844, -5481452, 1435056, -3901441, -6033356, -4156992, +-10397042, -4114042, 6684043, 2990371, 8716636, -5219459, -16044924, -7100655, 3063922, -5384279, +-10715407, -2139968, -2597382, 8702677, 3935801, -11089606, 6380174, -7965017, -1215476, -5858873, +-6021544, -5388574, -12579959, -7363722, 61203, 7220377, 10620917, 6988449, 1294396, 4237522, +-6084895, -9049496, -6286759, 5281199, -3582540, 5757404, -2733210, -5732708, -1231582, 416075, +-3678103, -6259915, -652835, 4908611, -16480326, -9588514, 12553653, 7547868, 86436, 3983045, +-4692789, 3974455, -6527277, -134755, 12042015, -5199595, 11375758, 11669426, 14147622, 3870839, +5781563, 12412455, 9597104, 7336878, -9130564, 1643362, 3111704, 8500277, -1432909, -6447820, +9081708, 9543954, -2448668, 6533182, -2901251, -2652142, 5780489, 5434208, -611496, 6366752, +575526, -8971650, -7572028, 8813273, 11981885, -348429, -4129611, 3135326, 359704, -5069135, +-10711648, 6227166, -10150081, -4248797, 7658464, 2327336, 6745783, 1006096, 10832444, 2258616, +11883101, -13214541, 12521977, -1670742, -665183, 4643397, 6490233, -4521527, -11812234, -2390686, +10334228, -1131724, -12692165, -6335077, -7936026, 3087008, 4088272, -9683541, 5007932, 7421167, +10689637, 4731444, 2889976, 3564286, 11861089, 1345935, 4852776, 14115947, 15264314, 4387846, +3719442, -11630235, -5915781, 12378096, -9509594, 12647605, 3498251, -300111, -2699387, -4762582, +-7572564, 1099512, 5591511, -14137959, -6388764, -6181532, 2971581, 2488934, 2939368, 122407, +2262374, -823560, 4090956, 3067681, -3760244, -6841883, -12065100, 1760400, -6550362, 10455561, +363462, -6387153, -7609072, -2699387, 4961224, -9819906, 5828808, -3572876, 1882269, -549219, +-6763500, 6199249, 8367670, -6255083, 7030325, 1526861, -606664, 19693498, -5149666, -13652090, +2414309, 4363150, -3356517, 500364, -5794985, 13100724, 7879118, -2018635, -3059091, 9055939, +9161165, -2676838, -8133595, -6529961, 18836116, -2545305, -2997887, -8465381, 4498442, -11009612, +-3452080, -3794067, 408559, 4002910, 9918690, 8591545, -14968498, -153545, 1243393, -1958505, +-4788889, -10485089, -1481227, 2873870, 5481452, 4328790, -9629317, -2104534, -12083354, 10388452, +24696, -1597191, 4786741, -5702106, -1399086, -12913893, 1628330, -7929047, 4656282, -1509681, +-2524367, -4738423, -8671539, -8553427, -1398012, -10429254, -16527034, -3567507, -7776575, -16042777, +-1705102, -1931125, -8905615, 4922570, 8039642, -1686312, 3598109, -1719598, -1790465, 1633161, +2062121, -13205951, -4132296, 6148246, -6469295, 14224395, 2270964, 3214246, -10086731, -914291, +-4779225, -10728291, -1454920, 12963285, 6060736, 9548249, 5510443, -5715528, -11509975, -18769008, +11541651, 10588168, -1447404, 4433480, -12719546, -27453968, -7132330, 21216064, 6849936, 8457327, +-5977521, 8549669, 14663018, 779537, -2904472, -25358560, -6222334, -1493575, 13966697, 3725347, +5360119, -19068582, -5452461, -7283728, -4875325, 11355357, -6998113, -2587181, 1598265, 3037079, +-6356015, -2890513, 2572686, -5541045, 11017128, -13152800, 936840, 8170639, -11480448, 8739722, +14895483, 17593796, 8111583, 8453569, 11255499, -8363375, -15273977, 5583995, 5910949, 9450539, +7250979, -17022030, -5281199, 8440148, 4530654, 2845953, 9929964, 1995549, 11647951, -4914517, +-3197603, 6591164, 5880884, 1531156, -11335492, -6192269, -12139188, -13706314, -1360968, -14987288, +175557, -8994198, 11811, -8295193, -5106179, -19295140, 12253542, 2579128, -3322157, -4225174, +-2710661, 1493038, 16714402, -8579734, -7372312, -6583648, 11429982, 14556181, -9603010, 23539106, +4742181, -10517301, 11949136, 3154654, -10191957, -12009802, -9674414, -1099512, -5302674, -3813931, +-15793132, 5892159, 6258304, 21163452, 2699387, -4030290, -9917079, -10536629, 2381023, -1571421, +-13794361, 2041720, -5221070, 278099, 10348187, -8509404, 13751412, -12582644, -10386842, -1078037, +-16080358, -19485730, 2997887, -2579665, -22123914, 1132261, 190052, -10884521, 5464272, -5493263, +2763275, -15294915, -24312736, 15567109, -14844481, 24336358, 13573170, -18083422, -2162516, -18318036, +-4686346, -2671470, 7628936, -6848862, 11597485, 13923210, 13901199, -10178536, -7597797, 927713, +-11528766, -1415729, -3286724, -16065862, 10322954, 7048578, -7274064, 13069049, -16226386, -13933948, +-10488310, 7738994, 9219684, 10200547, 16793858, -5449777, 30487826, -341987, -15089294, 7396471, +15240155, 4687420, 8207146, -5926518, -16230681, 25712358, 14309757, 10958072, 5257577, -7948911, +8449811, 21594022, -7290170, 5240397, 156229, 5184026, 3946538, 15675557, -3933653, 5900212, +-4908611, 5395553, -1087164, 110059, 9543417, 2901787, -18107582, -11382737, -16957604, -10816338, +-8859444, -3502009, -12924630, -6389301, -6204617, -10325101, -7681549, 6240588, -11684995, -2889976, +-9010841, 23505282, 11574400, 20695300, -17237852, -214748, -15721191, -1871532, 18231600, 11471321, +21443162, 11786464, 13414793, -12060805, 6649683, 8145406, 19996830, 22032646, 6462852, 20374788, +-14837501, -4680441, 12409771, -37403260, 2119566, 17664664, 11545946, -11294690, 22542136, 13430363, +-950262, -5433134, -2628520, 13571023, 33221036, 17783848, 4936528, 1503775, 11040750, -2538326, +26854820, 15180562, 16843252, 772020, -8306467, 5734855, 2188286, -14111652, -3319473, -838056, +-3180960, -3998615, 5577552, 2981244, -11479374, -5561983, -20413442, -2108292, -6257768, -26467736, +-11760157, 772020, 10003516, -13663902, 17110612, -4784594, -4002910, -2409477, -4118337, 12269648, +-8324721, 8516383, -27146878, 8225399, 11768747, 8929774, 17963164, -18080738, 15311558, -16292422, +-12196633, 13079249, -8156680, -2743410, 10832981, -18584860, 15584826, 25350508, -1209033, -4307852, +32072668, -7741142, 5194763, 17822504, -41137732, -21180632, -744103, 95026, 2351495, 8061117, +14353244, 8967355, -21549462, -5966784, -31390842, -18896782, 23164906, 22983980, 2518998, -5468030, +19562502, -31549220, -16845398, -34146064, 14995341, 4072703, 1609539, 6532646, -15405511, 7764764, +10910291, 14043469, 24107114, 24523190, 20842940, -967978, 4836670, 125091, -8840653, -2022393, +-7341173, -4060355, 28765006, -6863895, -26064010, -6847252, -5185636, 2125472, 41399728, -15124727, +-14511084, 13671418, -22033182, 7429757, -24463060, 32017370, 9421548, -1226750, 8595840, -12815109, +-15459198, 21772800, -26591216, -21910238, -18996640, 4939750, 8465381, 9616969, -17558900, 17926656, +-5270999, 853088, 28826746, -2520072, -4351876, 7719130, 23415088, -15532749, 38540888, 617938, +-43161736, -6234145, -989453, -15695421, -3392487, -1365263, -3027415, -13857175, -8345659, 17492864, +8007967, -6314676, -1478543, 44339632, 27329414, -31111132, -24633784, 36193688, 34637300, 22630182, +25628070, -37520836, -6199249, -8470212, 13191992, 6484327, -13564044, -27020176, -42226508, 15732465, +14492293, 6097243, 15007689, -3497714, 433792, -8004209, 11614665, 18187576, 16668231, 6317897, +21274046, 8634495, 684510, -4836133, -24457692, 1270237, -8625905, -6747394, 12372190, -26467200, +5550709, 4001836, -10674604, 14805289, 13982803, 8309151, -16596827, -15376520, -45103064, -9296457, +3578245, -12418361, 6048388, 13302051, 13580150, 30167850, 16786342, -8659728, -4679367, -14570677, +26542362, -6062347, 43328704, 36456756, 13378286, -17177184, 47956532, 23987392, -12608413, 7022809, +27282706, 55225764, -14609331, -33152316, -12372190, 7245610, -2193118, 18779208, 7837242, -9129490, +10143639, 922344, -7731478, 17211008, 6162205, -5242545, -16037408, 14207752, -27340152, -24675660, +-9091909, 20437066, -11289858, -13607530, -205085, 23549306, 2275259, 24365886, -8013335, 29280402, +3026878, 16223165, -10206990, -5482526, 8585640, -27943058, -8552354, 12286828, -5683316, -2556579, +-24020142, -20721070, 9668508, -11995307, -10409390, 19793894, 24149528, -1963337, 15528991, -27692876, +841814, -6109054, 37241660, -13790066, 11589969, 25591562, 21065204, 8784282, -16987132, 12319040, +5593121, 9323300, 10675141, -35030828, 67766528, 25137906, -8174934, 6744173, 5524402, 22641456, +-7925289, 18447958, 37724308, 1553168, -53472880, 25216290, 13695040, -13142063, 19138374, 86973, +-15933255, -20787104, 45022532, -19213536, 46641196, -20296942, -8302709, 47775604, 5717675, 25935696, +13239237, -26289494, 1649268, 15581068, -4686346, -22907744, -4379793, -49945100, -13973139, -18632106, +-10768020, 10851235, -1469416, 17809618, -8771934, 1866163, 17385490, -15595563, 1650878, 9825275, +-1013075, -17137456, -71404, -11828877, 34391952, -6197638, 19902342, 3051038, -405338, 35109748, +25363930, -15788300, -18342732, 8684961, 15890842, 19077708, 23431194, -783295, 8189966, 21927418, +-1333051, -9426379, 6864432, 277562, -19912542, -1020592, 12908524, -20111722, -26350162, -3209414, +-1698660, -3636227, -8894877, -10410464, -31310848, -1082869, 30666066, 8231305, 17122960, 8679592, +-3961571, -42021960, -29311542, 6034966, 26676042, 6226092, 14101451, 50219440, 56551296, 42986716, +-1324461, 18129594, -11250667, -41430328, -12513924, -28809030, 11126650, -16311212, 11366631, -5713917, +-19774030, -4362076, 2051384, 13386876, -7128035, 8079907, -30145838, 32791538, -65553012, -4138738, +-14818711, -11181410, 11136850, 41466836, 8269423, 16846472, -31307628, 10322954, 14287746, 29533268, +-11873974, -18569292, -13003550, -4262755, 912681, 2544231, 18008262, 14915348, -7609072, -45600740, +-21350282, -36384816, 6452652, 73555608, -47777752, -16087874, -5836861, 44174276, -11787538, 20905216, +-11216844, 23425826, -6032282, -7796977, -23500988, 17160542, -27540940, 31323196, 50310712, 10770704, +-7458748, -4416837, 41884520, 15625091, 1028645, 26492968, 8315594, 13099650, -6593312, 52376588, +-72422272, 59130424, -43932148, 27502824, 53038552, -35573604, 85165440, 64849712, -22929756, -483184, +52582212, 10427644, -1819456, 49515604, 47280612, -40470940, 39404716, 36080948, -33980708, -51576116, +-75854488, 17479980, 114150032, 46601468, 357556, 23259396, -108829104, -45330696, -3646427, 16282758, +82269024, 79885320, 14143327, -31326418, -60071024, -35826468, 4464082, 25467008, 39623220, 62625992, +38553236, -51353852, -119683560, -98488968, -9075266, 108454368, 119198224, 74342128, 23548768, -25802552, +-47702056, -73814920, -40949292, -45182520, 88082800, 71890240, 46770048, 39872864, -60738352, -87229176, +-99286760, -90647432, 35748088, 120885072, 151079232, 49818400, -44083544, -107556720, -126545304, -35707820, +22132504, 12317966, 81728392, 30499636, -28472948, -18853296, -59732256, -14364518, -68441912, 29630442, +85649168, 155424128, -7383586, -84310208, -179678352, -7825968, -60879552, 709207, -10483478, 51368884, +29966524, -4529043, 10808285, 5589363, -36745056, -3774740, -3145527, 4064650, 944893, 3024731, +-13609141, -5235029, -5191005, -3227131, -6372121, 22072374, -8183524, 9603010, -16834124, -1443646, +6428493, -537408, -5424007, 38103340, 4785131, -21122112, -25380572, 5560372, 4700842, -14271639, +3482682, 19392314, 9247065, 18308372, -18980534, 5998996, -1376000, 4792647, -13673565, 2987150, +13449153, 20824686, 4206921, -4646081, 4942434, 2966212, -5792837, 14537391, -21561810, 5400385, +-34487512, -9536975, 12334609, -10332081, -14865419, 19091130, -13183402, -29874182, -25834766, 22508850, +-4685810, -2826625, 2615635, 12326019, 24374476, -15803869, -25809532, 2990908, -6576132, 20608326, +-4078608, 13589277, -1009854, 2337536, -30821222, -33906620, -79672720, 22098144, 21817896, -2318746, +-67296768, -43715252, -7096360, -11606075, 43687332, 29312078, 13646722, -30123290, -12941810, -8461086, +27052388, 2416993, -8724152, -17913772, 10622528, 4461398, 13054553, -1350767, -6455336, -7647726, +-16724603, -8502962, -10436234, 26067768, 13419088, 2628520, 3191698, -17989470, -1731946, 1682554, +23490250, -2168959, 10531797, -9402220, -7068443, 4609037, -10780368, 6318971, 2141041, 6868190, +22931904, -2263985, 20044612, -403190, 12621835, -10382547, 169114, -15159624, -20343650, -20562692, +-18363132, 6059662, 2438468, 1881733, -26664230, 13395466, -23241142, -1854352, 682363, -13266080, +-15824807, -6873022, -63888, -25426206, -18562848, 19097036, -8240432, 18857590, 2741800, 16105590, +-39820252, -96227672, -92380448, -15345381, 25716654, 89699320, 77120968, 72816336, 78090560, 42960948, +8966818, -41781980, -42320460, -85619096, -67212480, -58720792, -38221988, -47107200, 61097520, 50477676, +66293892, 38030860, 53811108, -3291019, 12722230, -10189273, -23733990, -13634374, -28012850, -31404264, +-32165546, -30837866, -37244344, -26830660, -23001698, -3396782, 3440269, 48476224, 39378408, 20952462, +21359410, 31758062, 28112172, 13780939, 68213744, 8424578, -1277216, 12552042, -28508382, -81340240, +-25330106, -65220688, -71667432, -73731704, -54124104, -46457052, 95563, 38241852, 36912024, 47859896, +84735944, 62863824, 74178384, 75566728, 45872936, 52449068, 15830176, -16471736, -60059748, -74523048, +-88713088, -53304304, -78396040, -59574956, -71856952, -28498718, 16186658, 28952912, 19346680, 0, +0, 0, 0, }, { -945967, --1034550, -2892124, -6316287, 275415, -507880, -4354560, 922344, -187905, -1166084, -1078574, -4333085, 4241280, 1076426, 6105296, -4664872, 4355634, 2791192, -4049617, 3409130, -7570417, --1985886, -12191265, -1796907, 2594697, -2512556, 1838246, 1763084, 657667, -362925, -1176284, --2354179, -614717, 2034204, 2259690, 260382, 2935073, -1170916, -2332167, 2440615, 2957622, -1954210, -4855461, -4516158, -3167539, -2853469, -3075734, 3448322, 2338610, -2646774, -4559645, --7634841, -834834, -2736431, 1909650, 3505230, 1001264, -1701344, 129386, 3291019, -2840584, -3651259, 152471, -479426, -9095667, -1916092, -3704946, -955630, 4604742, -626528, -2391760, --380105, 3975529, -2802466, 251256, 332860, -4474819, 7359964, 2530810, -1413581, 1825898, -2321967, 4395899, 7366943, -3622268, 2402497, -3092913, -2431488, 1440962, -52613, 569620, --5318244, -2599529, 1778117, 3651796, -567473, 3070365, -5701569, -5039071, 3066070, 1962800, -785979, 2240899, -2000381, 3986267, 4431870, 4335233, 6201396, -3529390, -2962454, 180389, -714575, -6068252, -465467, -566399, 1569274, 549219, -3855270, -972273, 5044976, -2785286, -919123, -3189013, 1421097, 1540283, 941135, -4730907, 3696893, 297963, 769873, -695248, --1620276, -1995012, -3272228, 6742562, -1269700, -1310502, -1588601, 2957085, 649077, -6493991, -1591822, -3007551, -4434017, 2525978, -2724083, -7039989, 2817499, 941672, 406411, -6460168, --7568269, -2878165, 4576288, 744640, 605590, 4093641, -5539434, 1191317, -4582193, -5873905, -1995012, 5941551, -3299072, 2936147, -2422362, -1067299, 1394254, 504122, -2588255, -8192650, --8105140, 363462, -1867774, 135291, 4616016, 909459, 5597953, 7432441, -3556770, 6445136, -1033477, 6535867, 656593, 7715372, 1215476, -4009352, -896038, 616328, 3686156, -736587, --864899, 932545, 2865817, -2941516, 80531, -786516, 2571612, 2973191, 430570, -2678986, -77309, -354335, 1926830, 3095598, 5556077, -1692217, 3709778, -1403381, -4291746, -3966939, --2470143, 2710124, 3118146, -1447404, 4865661, 234613, 1966558, 301185, 5856725, 3712999, -4398047, 1663763, 2711198, 1444183, 2511482, 4421669, -771484, -461709, 5981279, 6169184, --6897718, -4758824, -3941706, -5662915, 1414655, 1984812, -4572530, 668941, 8573292, -6774237, -4224637, 7275675, 7286949, -5000953, -1514513, 3373697, 481573, 788663, -3609920, 1477469, --11687143, 8617315, 13896367, 2101850, 4548371, -2698850, -387621, 7076496, -4126390, -9475772, --1685238, -301185, -198642, -7758859, 378494, 1359357, -8843875, -4554813, 3886409, 883690, --3228205, -1303523, 2883534, -4750771, 8878771, 2279017, 307627, -6320045, -668941, 2541010, --2048699, -390305, -2139431, -719407, -926102, -5252208, 234613, -5124970, 6709813, -7200513, --4372814, -2168959, -7831336, 4495757, -4211216, -11652246, -2000381, -5509906, 1329292, 4132296, --5095442, -286689, -3520800, 2584497, 221728, -4445828, 177704, 1679869, -4780836, 3515431, -148176, -721555, 4143570, -3371013, -12477954, -2233920, -476741, 5844377, 8226473, 7261716, -3690451, -2505040, -538482, -7641821, -6354941, 2542621, 9321690, -2344515, 9545565, 6081674, --5342403, 3271691, -529355, 3404299, -6002754, -4082367, 1401233, 4782446, -222265, 2921652, -4184372, -7003481, -1074279, -3143916, -9408663, 6242735, 1345935, 2360085, 4621385, 7897371, -3091840, 494458, 6476811, -1303523, -2714419, 6363531, -2891587, 10667625, 5282810, 4283693, -636729, -2979097, -3277060, 5229660, 7474854, -5208722, 1710471, 6733972, -749472, 2172717, -15315317, -4532801, -1326608, 2825015, -6977175, -390842, 1815697, -3434900, 4105452, -2530273, -2696703, 7291244, -2187749, -134755, 1269700, -2810519, -17898740, -1023813, 4832, -3189013, --5296769, -1374926, 10188736, -6465000, -10059350, 4420595, -3886946, 2011118, 2185602, 7124277, --4178466, -809064, 1602560, 6688338, -2574833, -3448859, -925565, -2873333, 4781373, 8875013, -4414690, 691490, -447213, -4107063, -62277, 13662828, 2496987, -950798, 15228880, -216896, -11358041, -2677912, 245887, 8311836, 2442226, 2630131, 2826625, 2096481, 4272956, 3221226, --7067906, 14092325, 8120173, 11746199, 7335804, 5687611, -7270306, 4121021, 3666292, 1506460, --4523675, 13317083, 7356742, 12175695, 1835025, -1123671, -2941516, 9365176, -4253092, -7221988, -9637370, 4463008, -5885179, -1701344, -41339, -923418, 239444, 693100, 284005, -831076, --4472672, -484794, -11839077, -4545686, -13269301, -8990440, 1127429, -8500277, -6728603, 1038308, --1411434, 9223979, -5870147, 10208064, 12315282, 1518808, -10297721, -7021198, 11049340, -5283347, --2940442, 6457484, -7986492, -13958107, 5758478, 12641699, -6308770, 3484829, -214212, 5723581, --14883672, 3333968, -5990943, 3977140, 277562, -5851356, 10343892, 5153961, 4334159, 14246943, -6379100, 3296924, 7752953, 2025614, 2441689, 4420595, 1207423, 1122597, 2010045, 2399276, -15596637, 9383967, -201327, 13760538, 8087424, 10325638, 15037217, -7192997, -6739878, 13981192, --4911832, 143345, -8213588, -2665027, 4437775, 7816841, -6385543, 67109, 1634235, -870268, -3260954, -5473399, -1672353, -6335614, 13812615, -3255585, 6743636, 4571456, -4837207, 1583769, -730144, 1566589, -6951405, 9089761, 5306432, 12341589, 2428267, -1669669, -13881871, -7446937, --5174899, 3546032, -7186554, -12069932, -3309272, 3069828, 1392643, -13489419, 10980084, 807991, --764504, -11507828, -6542309, 2658048, 1469416, -12796318, -3906810, 4592394, 571231, 1212255, -6585796, 7546795, 4511327, -2065879, 3898220, 1085016, -4521527, -9547712, 16295106, -4210142, --7871602, 9664, 4067871, 5090073, 12178917, 1817845, -199179, -4765266, -125091, 6516539, --854162, 8173323, 16114180, 1083406, -3537443, 185757, 13824426, 17032766, -8756365, 2044404, -2284923, 8964134, 4766877, 1170916, 2614561, -7472706, 3926674, 3835406, 3925063, -3750580, --570694, 2481954, 3758097, -4016331, 6907918, -5196374, -9822053, 7665443, -312996, -2021319, -3258270, 6591164, -16814796, 1556389, 13849659, -1059783, 24486146, 11919071, -6746857, -4887136, --1674500, -6440304, -2494839, 11154567, -3526705, -3038689, 11301133, 9153649, 3471944, 5442798, -10619844, 7078643, 8111046, -5037460, -3121368, 9950902, -1223529, 9047349, 710817, -9831180, --5937256, 3220689, 8801462, -10736881, 1393717, -5530844, 3840775, -6384469, 10224707, 9903121, --8499740, -551903, 3467649, 132607, -11715597, -5172215, 2956011, 8726837, 14481019, 5078262, --9241159, -1785096, -1560147, -732829, 9517111, 1829119, 7853885, -9855876, 5667210, 1211718, --7116224, 10250476, 5272073, -715112, -953483, 2362769, 942208, -7507603, 11593190, -13121662, --1660542, -3821984, 14499810, -5706401, 12025908, -3040837, 11250130, 15165530, -5998459, 5181878, --3250217, 8902393, -2706366, 7519951, 6193343, 6023155, -805843, 6313602, -2451353, -6616934, --3064996, 8722542, -9058623, 2142652, 358630, 7860327, 14968498, -12682502, 839666, 13750875, -38118, 12640626, 1977833, 5951751, -1317481, -303869, 3544959, -17717276, 2120640, 291521, --7047505, 5625871, 3292629, 14142790, 6914898, -555661, 25652230, 7121056, -13176960, 4347044, -1480690, 9695352, -5601174, 2541547, 7643431, 1447404, 4682051, -458488, -14548665, -14083735, -68183, -4139275, 12027519, -19405736, 26108032, 840740, 14419816, 17716204, 3732327, -3302830, --3798899, -6605660, -11205570, 557809, 1542967, -24159728, -1645509, 8287677, 1437740, -9062381, --22397718, 12348, 2673080, -3932580, -824097, -6621229, 3615826, -5521718, 11727945, 4070019, --6744710, -8657043, -14609868, 11034845, -4527433, 714575, 14615774, 19767586, 12304008, -1897302, -1278290, -13653701, -5552319, -5534602, 3929358, -19356880, 5338645, 5188321, 1425392, -9997073, -9863392, 14718316, -2018098, -348966, 2120640, -8683887, -8662949, 5135707, 4029216, 11106785, --11831024, 13271986, -6523519, 7278896, -10848551, -9078487, -3919158, -363998, -717796, 4817880, --1778653, -19972672, -14212584, -4227859, 1324997, -19974282, 1143535, 9931038, -4340602, -2208150, -4079145, 8580808, -16404628, 9266929, -1745367, -2202245, 1504849, 7888245, 10961293, -9349607, --2552284, -4121558, 21521008, 301721, -4635881, 16683800, -3917010, -7110319, -2039573, -1789928, -20756504, 23750632, -3341485, 4862440, 5895380, -3309809, -11609833, 5357435, 22085258, 16757889, -14326400, -5543192, 6081674, 11710765, -15772731, -11851962, 13349295, -7209640, -7842074, -810675, -16736951, -2851322, 15381888, 723702, 13771276, -8706972, 19008988, 5542656, -6245956, -10158135, -3240553, -14244259, 1380832, -16848620, -5931887, -6274947, 9129490, -9813463, 15230491, -19428284, --33320356, 20218558, 8843875, -4439923, -227096, 22327924, 10240276, 1407139, -6426345, 4511327, --3146601, -119185, -15311558, -15358266, 8218957, -5381057, 4211216, 27904940, -8117488, 5840619, --19247896, 21704618, -8243116, -9591199, -5763846, -2426120, 7800735, -16699907, 13581760, -24655796, --18303004, -17758616, 24958592, 886911, 10767483, 6408628, -21815750, -19120120, 12991202, -34151432, -10107669, 10182831, -2068564, -13578002, -12370580, 21318608, -11303280, -1489280, -3418257, -11027865, -16376710, 5166846, 14847702, 8528731, 10318122, -3204583, 16678432, -1516124, -10522670, -12677133, --2659659, 7136088, -9330280, 12770548, 8502962, -9643812, -34289944, -2918967, -2498597, -870805, -25520696, 554588, -19299436, -11705396, -11615202, 10307385, -7128572, -16427176, -17806934, -11415486, --8360691, -40840844, 1566053, 5055714, 14045080, -21360482, 7672959, -17666812, -13655312, -5000416, -17889612, 4277788, 16745541, 29791504, 10004589, 6709813, 20621212, -15416248, -688269, -7521562, --6924024, 15185394, 16068010, 22276384, 13053479, 13198435, -9430138, -21248276, 7656853, 1136019, -971200, 2308545, 4566087, 6301254, 11350525, 4735202, 9767829, 6127308, 11311333, 27259084, -2223719, -32001264, -10925323, 10050760, 1686312, -5406827, -20203526, -12611098, 5887864, 19082540, -8121783, -15076946, 10290205, 8742943, -17540646, -1890859, -22007950, 20045686, -8376260, -10453950, -18302466, -14641007, 5955509, 37101000, -2761664, 7585449, 11812234, 1816771, 6548752, -18764712, -6458020, 5632313, 4794794, 48416092, 32874754, -1363115, -14679124, -8537321, 16111496, 19161996, --17011828, -8018704, -23318988, 42036456, 12601971, 7153268, -4616553, -1606318, -6978248, -2007360, -30437896, -4527433, 9816685, 31792958, 7087770, -4320737, -18524194, 4738960, 11447162, -37451040, -12979928, 11705396, 30207042, -5838471, -27050778, -3822521, 18787798, 10542534, -30301532, -40023728, -4712653, 27239220, 11107859, 16651588, -9337259, 12855911, 2268280, 347355, -14427332, -5210869, --22530862, 33621540, 11395622, -27347130, -18619220, 12177843, 1417876, 6674379, -8058433, 16699370, -9917079, 11451993, 22129818, 19386946, 4123169, 18931142, -9942312, 10786810, 33286, 13123273, -6189048, -3406983, -7960722, 8949101, -11868068, 31119186, -8406325, -6231461, 6439767, 15186467, -15317464, -10756209, 26977764, 26388816, 15485505, 6038724, 2105071, -9107478, -20560008, -35373888, --5928129, 11798275, -1102733, 14512694, 16067473, 17002702, 5578626, 9088151, 57081188, -29306172, --13434658, 4782446, 9824201, -2507724, -47048144, 9460739, -9830106, 5577552, 3140695, 18915572, --5295158, -9130027, 3176128, 14959371, 14666240, -8393977, -11439645, 3160559, -11021960, -34579320, -35290136, -10534481, 9685688, 3153580, 29504814, 23658290, 14588393, -14374182, -2750927, 20279224, -10406169, 23890756, 63588600, -4108673, -25742960, -6729677, 18614388, -3016678, -30394410, 45394584, -22990960, -16246788, -25631828, -3277597, 4880694, -8152922, 17324824, 15134391, 16924856, 33742872, -4798016, 9304510, 5111548, -13520020, -32709934, 18226230, -22678502, -16629040, 23765128, 12594455, -12764643, 6818798, 3697967, -2097555, -32849520, -28522878, -1217623, 15709917, -22579716, 18540836, --11282342, -24406152, 4959077, 18894634, -6402723, 2180233, 17202418, 17798344, 17210470, -1096290, --16694001, 8438000, 44137768, 1451699, 13475460, 21461952, -9206262, -22352620, 18043158, 14874545, -381715, -11799349, -17552994, -30882426, 5491116, 19156628, 25970594, -21990770, -23691576, 29122026, -12890271, -944356, -3073586, -11791833, 5350993, -5356898, -12726525, 13543106, 15968688, 11492796, -832150, -2040646, -9329206, 2290291, 6497212, 4487167, -10561861, -35747548, 7703024, -7790534, --11243688, 2471217, -5103495, 3525095, -36487896, 17324288, 12670154, -25373594, 17617418, 24710020, -19596326, -4766340, 2764348, -2534568, 12489765, -2234994, -786516, 65187940, -20104206, 6202470, --18089328, -9112847, 35478040, 14284524, 11458973, 24320252, -30658550, -23374286, 35427576, -21906480, -17411260, 24444806, 819265, 7653632, 7225209, 43139188, -15887084, -13985487, -40177272, -6045167, --19000398, 15326591, -27344446, 43139724, 16375637, 23687282, -9824201, 27180700, -14879914, 14624901, -45820320, 23016730, 17682918, -24770688, 7686381, 25735980, -20985210, 36207648, 13347148, 19601156, -17641578, -10486163, 18249852, 15730318, 6957847, 35846332, 27348742, -1589675, -60026464, -6673843, -28638306, 27543626, 28390270, 7067906, 16052440, 1733556, 8305930, -1677722, -18300856, 39071856, --580894, 37208912, 17050484, 26889180, -36908264, 25492778, 12969191, 11534135, -9445707, 8889509, --6649146, 8435853, 37392524, 14791867, 48671108, 2319282, 10901164, 28160490, -5573257, 44263932, -22028888, 3574487, -29419990, -18857590, 16222091, 1306744, -4971425, 267899, -5142150, 2609193, --21635898, 13252658, -23069344, -35424352, -12973486, -3634616, -11583527, -10989748, 28755880, -6369437, -26512834, -29101624, 29703456, -1606855, -9347459, -27965606, -26849452, -11314018, -12250857, 20015622, --34908420, -42974368, -46939160, -56132000, 23536958, 26354994, -2794413, -5204964, -1423782, -13876502, -1916092, 6191196, -12989592, 37009732, 34104724, 22567906, 23970212, -23939074, 14083735, 744640, -17008070, -7786776, -11049340, -35003448, 29341606, -31634044, -39414916, -10314901, -9589051, 40239012, --23985244, 5160403, -22778896, -6135898, 37347424, 7054484, 10559177, 19217832, 34066068, 2109903, --5931350, -43940736, -10053982, -3507378, -3244311, 24124832, 10888816, 81883016, 2010045, -2309082, --29235306, -1877975, 30333744, 30203820, -4878009, -13857712, -42600708, 10735271, 23344758, -12282533, --31659814, -11442330, 23045720, -6346888, 16468515, -56693032, -34514356, -44128640, -13878650, 23242752, -9969693, -4099010, -13769128, -5874442, 42324220, 3927211, 2782065, 73017128, 9503689, -49471580, --37504728, 52015812, 46313168, 5463736, -32229434, -40432824, -22260816, 11318849, 45070848, 40715752, -27894202, -12736189, 7460895, -12793634, 16349330, 35109748, 52262772, 57259432, -4402342, -26212186, --43553652, -65808024, 1662152, 39537320, 151162992, -16508244, -5609764, -68970736, -27442156, 9021042, -19459960, 91528976, 66160212, 42449848, -42776800, -22517976, -41776072, 315143, 76350560, 71518720, -85745800, -20171850, -80246096, -57047904, -81090592, 23670102, 78267728, 69878048, 125590752, -56281788, --69981120, -60265908, -8722542, 57330836, 74590160, 104458976, 47715476, -19024558, -38241852, 11597485, --1800665, 30933428, 82536920, -16434692, 51304460, -17312476, -46792596, -5764920, -35693324, 48163228, --10327786, 56705916, -51021528, 969052, -21781390, -53517440, 40293772, -28040768, 37439228, -28754270, --10081362, -2539936, 19899658, 4161287, -19419694, -11112691, 384936, 28964186, -25745644, 33171644, -25418690, -18584860, 5689758, -23329188, -21447456, 38417944, -36762236, -19987704, 27599996, 58779848, -1393717, 7238631, -3553012, -26967026, -5295695, 23260470, -6339372, -40441412, 7729331, -9849434, --4392141, 10477573, -33478196, 16542067, 2348810, 10717017, 30184494, -64276332, -43574592, -17297444, -1376000, 62172872, -31229244, 20969640, 53570592, -30310122, -13287555, -4544613, 30676268, 36902360, --18475876, 8177618, -4546760, 12079059, 65865472, -27304718, -66442608, 10181757, 35908612, 2891587, --33784748, 16934520, 13060459, 15062987, -10817412, -8177618, -75790064, -26295938, 27710056, 39275328, -31945966, -39401492, 8098161, -104110544, -69021736, -58972048, -12336757, 43967044, 26890790, -5356361, --25677462, -30594126, 9836012, -19954418, -5262946, 32909114, 6260452, -1483911, -39346196, -20369956, --7263327, -20065014, 7274601, -6110665, 15704548, -8189429, -3900904, -9440338, -4888747, -7689065, --24177444, -18501108, -38058244, -27218818, 13655849, 30518964, 32650342, 17341468, 27911918, -7801271, -23117662, -9258876, -16416976, -45675904, -5720360, -26501558, 14173392, 4164508, 49884436, -46491412, -11210938, 27553826, -21123722, -25950730, -17999134, -13518410, -15797963, 1274532, 33516852, 22097070, --15421080, -3978750, 22022982, -34401616, -41392212, 12144020, -47971564, -33922188, -36197984, 30782030, --1711545, -78597904, -120146344, -148846384, -116412408, -176777632, -25374130, -59462212, 27621472, 46845208, -140762192, 86220928, 145448528, 149030000, 199630624, 148996704, 149768736, 113708720, 11104101, -22142704, --49377092, -25877714, -108869368, -70201240, -56553444, -55512988, -57426396, -54674932, -55624660, -57633092, --67127656, -45543832, -79168592, -60451664, -55098524, -18348638, -66133908, -13232257, 30783104, -44066900, --21145734, 22911504, 15624554, -36007396, 40927816, 56508348, 63897304, 90801512, 86407760, 1923609, -52009368, 89183384, 116437640, 98599568, 181735632, 177670448, 150125216, 129126048, 153055984, 83625160, -120544696, 155788128, 111449568, 79443472, 119329224, 45448808, 34274912, 80129056, 65934192, 56032144, -325881, 42689292, -37689412, -5543729, 2031520, -71586904, -172790832, -139353968, -97657896, 0, -0, 0, 0, }, +-1034550, -2892124, -6316287, 275415, -507880, -4354560, 922344, -187905, -1166084, -1078574, +4333085, 4241280, 1076426, 6105296, -4664872, 4355634, 2791192, -4049617, 3409130, -7570417, +-1985886, -12191265, -1796907, 2594697, -2512556, 1838246, 1763084, 657667, -362925, -1176284, +-2354179, -614717, 2034204, 2259690, 260382, 2935073, -1170916, -2332167, 2440615, 2957622, +1954210, -4855461, -4516158, -3167539, -2853469, -3075734, 3448322, 2338610, -2646774, -4559645, +-7634841, -834834, -2736431, 1909650, 3505230, 1001264, -1701344, 129386, 3291019, -2840584, +3651259, 152471, -479426, -9095667, -1916092, -3704946, -955630, 4604742, -626528, -2391760, +-380105, 3975529, -2802466, 251256, 332860, -4474819, 7359964, 2530810, -1413581, 1825898, +2321967, 4395899, 7366943, -3622268, 2402497, -3092913, -2431488, 1440962, -52613, 569620, +-5318244, -2599529, 1778117, 3651796, -567473, 3070365, -5701569, -5039071, 3066070, 1962800, +785979, 2240899, -2000381, 3986267, 4431870, 4335233, 6201396, -3529390, -2962454, 180389, +714575, -6068252, -465467, -566399, 1569274, 549219, -3855270, -972273, 5044976, -2785286, +919123, -3189013, 1421097, 1540283, 941135, -4730907, 3696893, 297963, 769873, -695248, +-1620276, -1995012, -3272228, 6742562, -1269700, -1310502, -1588601, 2957085, 649077, -6493991, +1591822, -3007551, -4434017, 2525978, -2724083, -7039989, 2817499, 941672, 406411, -6460168, +-7568269, -2878165, 4576288, 744640, 605590, 4093641, -5539434, 1191317, -4582193, -5873905, +1995012, 5941551, -3299072, 2936147, -2422362, -1067299, 1394254, 504122, -2588255, -8192650, +-8105140, 363462, -1867774, 135291, 4616016, 909459, 5597953, 7432441, -3556770, 6445136, +1033477, 6535867, 656593, 7715372, 1215476, -4009352, -896038, 616328, 3686156, -736587, +-864899, 932545, 2865817, -2941516, 80531, -786516, 2571612, 2973191, 430570, -2678986, +77309, -354335, 1926830, 3095598, 5556077, -1692217, 3709778, -1403381, -4291746, -3966939, +-2470143, 2710124, 3118146, -1447404, 4865661, 234613, 1966558, 301185, 5856725, 3712999, +4398047, 1663763, 2711198, 1444183, 2511482, 4421669, -771484, -461709, 5981279, 6169184, +-6897718, -4758824, -3941706, -5662915, 1414655, 1984812, -4572530, 668941, 8573292, -6774237, +4224637, 7275675, 7286949, -5000953, -1514513, 3373697, 481573, 788663, -3609920, 1477469, +-11687143, 8617315, 13896367, 2101850, 4548371, -2698850, -387621, 7076496, -4126390, -9475772, +-1685238, -301185, -198642, -7758859, 378494, 1359357, -8843875, -4554813, 3886409, 883690, +-3228205, -1303523, 2883534, -4750771, 8878771, 2279017, 307627, -6320045, -668941, 2541010, +-2048699, -390305, -2139431, -719407, -926102, -5252208, 234613, -5124970, 6709813, -7200513, +-4372814, -2168959, -7831336, 4495757, -4211216, -11652246, -2000381, -5509906, 1329292, 4132296, +-5095442, -286689, -3520800, 2584497, 221728, -4445828, 177704, 1679869, -4780836, 3515431, +148176, -721555, 4143570, -3371013, -12477954, -2233920, -476741, 5844377, 8226473, 7261716, +3690451, -2505040, -538482, -7641821, -6354941, 2542621, 9321690, -2344515, 9545565, 6081674, +-5342403, 3271691, -529355, 3404299, -6002754, -4082367, 1401233, 4782446, -222265, 2921652, +4184372, -7003481, -1074279, -3143916, -9408663, 6242735, 1345935, 2360085, 4621385, 7897371, +3091840, 494458, 6476811, -1303523, -2714419, 6363531, -2891587, 10667625, 5282810, 4283693, +636729, -2979097, -3277060, 5229660, 7474854, -5208722, 1710471, 6733972, -749472, 2172717, +15315317, -4532801, -1326608, 2825015, -6977175, -390842, 1815697, -3434900, 4105452, -2530273, +2696703, 7291244, -2187749, -134755, 1269700, -2810519, -17898740, -1023813, 4832, -3189013, +-5296769, -1374926, 10188736, -6465000, -10059350, 4420595, -3886946, 2011118, 2185602, 7124277, +-4178466, -809064, 1602560, 6688338, -2574833, -3448859, -925565, -2873333, 4781373, 8875013, +4414690, 691490, -447213, -4107063, -62277, 13662828, 2496987, -950798, 15228880, -216896, +11358041, -2677912, 245887, 8311836, 2442226, 2630131, 2826625, 2096481, 4272956, 3221226, +-7067906, 14092325, 8120173, 11746199, 7335804, 5687611, -7270306, 4121021, 3666292, 1506460, +-4523675, 13317083, 7356742, 12175695, 1835025, -1123671, -2941516, 9365176, -4253092, -7221988, +9637370, 4463008, -5885179, -1701344, -41339, -923418, 239444, 693100, 284005, -831076, +-4472672, -484794, -11839077, -4545686, -13269301, -8990440, 1127429, -8500277, -6728603, 1038308, +-1411434, 9223979, -5870147, 10208064, 12315282, 1518808, -10297721, -7021198, 11049340, -5283347, +-2940442, 6457484, -7986492, -13958107, 5758478, 12641699, -6308770, 3484829, -214212, 5723581, +-14883672, 3333968, -5990943, 3977140, 277562, -5851356, 10343892, 5153961, 4334159, 14246943, +6379100, 3296924, 7752953, 2025614, 2441689, 4420595, 1207423, 1122597, 2010045, 2399276, +15596637, 9383967, -201327, 13760538, 8087424, 10325638, 15037217, -7192997, -6739878, 13981192, +-4911832, 143345, -8213588, -2665027, 4437775, 7816841, -6385543, 67109, 1634235, -870268, +3260954, -5473399, -1672353, -6335614, 13812615, -3255585, 6743636, 4571456, -4837207, 1583769, +730144, 1566589, -6951405, 9089761, 5306432, 12341589, 2428267, -1669669, -13881871, -7446937, +-5174899, 3546032, -7186554, -12069932, -3309272, 3069828, 1392643, -13489419, 10980084, 807991, +-764504, -11507828, -6542309, 2658048, 1469416, -12796318, -3906810, 4592394, 571231, 1212255, +6585796, 7546795, 4511327, -2065879, 3898220, 1085016, -4521527, -9547712, 16295106, -4210142, +-7871602, 9664, 4067871, 5090073, 12178917, 1817845, -199179, -4765266, -125091, 6516539, +-854162, 8173323, 16114180, 1083406, -3537443, 185757, 13824426, 17032766, -8756365, 2044404, +2284923, 8964134, 4766877, 1170916, 2614561, -7472706, 3926674, 3835406, 3925063, -3750580, +-570694, 2481954, 3758097, -4016331, 6907918, -5196374, -9822053, 7665443, -312996, -2021319, +3258270, 6591164, -16814796, 1556389, 13849659, -1059783, 24486146, 11919071, -6746857, -4887136, +-1674500, -6440304, -2494839, 11154567, -3526705, -3038689, 11301133, 9153649, 3471944, 5442798, +10619844, 7078643, 8111046, -5037460, -3121368, 9950902, -1223529, 9047349, 710817, -9831180, +-5937256, 3220689, 8801462, -10736881, 1393717, -5530844, 3840775, -6384469, 10224707, 9903121, +-8499740, -551903, 3467649, 132607, -11715597, -5172215, 2956011, 8726837, 14481019, 5078262, +-9241159, -1785096, -1560147, -732829, 9517111, 1829119, 7853885, -9855876, 5667210, 1211718, +-7116224, 10250476, 5272073, -715112, -953483, 2362769, 942208, -7507603, 11593190, -13121662, +-1660542, -3821984, 14499810, -5706401, 12025908, -3040837, 11250130, 15165530, -5998459, 5181878, +-3250217, 8902393, -2706366, 7519951, 6193343, 6023155, -805843, 6313602, -2451353, -6616934, +-3064996, 8722542, -9058623, 2142652, 358630, 7860327, 14968498, -12682502, 839666, 13750875, +38118, 12640626, 1977833, 5951751, -1317481, -303869, 3544959, -17717276, 2120640, 291521, +-7047505, 5625871, 3292629, 14142790, 6914898, -555661, 25652230, 7121056, -13176960, 4347044, +1480690, 9695352, -5601174, 2541547, 7643431, 1447404, 4682051, -458488, -14548665, -14083735, +68183, -4139275, 12027519, -19405736, 26108032, 840740, 14419816, 17716204, 3732327, -3302830, +-3798899, -6605660, -11205570, 557809, 1542967, -24159728, -1645509, 8287677, 1437740, -9062381, +-22397718, 12348, 2673080, -3932580, -824097, -6621229, 3615826, -5521718, 11727945, 4070019, +-6744710, -8657043, -14609868, 11034845, -4527433, 714575, 14615774, 19767586, 12304008, -1897302, +1278290, -13653701, -5552319, -5534602, 3929358, -19356880, 5338645, 5188321, 1425392, -9997073, +9863392, 14718316, -2018098, -348966, 2120640, -8683887, -8662949, 5135707, 4029216, 11106785, +-11831024, 13271986, -6523519, 7278896, -10848551, -9078487, -3919158, -363998, -717796, 4817880, +-1778653, -19972672, -14212584, -4227859, 1324997, -19974282, 1143535, 9931038, -4340602, -2208150, +4079145, 8580808, -16404628, 9266929, -1745367, -2202245, 1504849, 7888245, 10961293, -9349607, +-2552284, -4121558, 21521008, 301721, -4635881, 16683800, -3917010, -7110319, -2039573, -1789928, +20756504, 23750632, -3341485, 4862440, 5895380, -3309809, -11609833, 5357435, 22085258, 16757889, +14326400, -5543192, 6081674, 11710765, -15772731, -11851962, 13349295, -7209640, -7842074, -810675, +16736951, -2851322, 15381888, 723702, 13771276, -8706972, 19008988, 5542656, -6245956, -10158135, +3240553, -14244259, 1380832, -16848620, -5931887, -6274947, 9129490, -9813463, 15230491, -19428284, +-33320356, 20218558, 8843875, -4439923, -227096, 22327924, 10240276, 1407139, -6426345, 4511327, +-3146601, -119185, -15311558, -15358266, 8218957, -5381057, 4211216, 27904940, -8117488, 5840619, +-19247896, 21704618, -8243116, -9591199, -5763846, -2426120, 7800735, -16699907, 13581760, -24655796, +-18303004, -17758616, 24958592, 886911, 10767483, 6408628, -21815750, -19120120, 12991202, -34151432, +10107669, 10182831, -2068564, -13578002, -12370580, 21318608, -11303280, -1489280, -3418257, -11027865, +16376710, 5166846, 14847702, 8528731, 10318122, -3204583, 16678432, -1516124, -10522670, -12677133, +-2659659, 7136088, -9330280, 12770548, 8502962, -9643812, -34289944, -2918967, -2498597, -870805, +25520696, 554588, -19299436, -11705396, -11615202, 10307385, -7128572, -16427176, -17806934, -11415486, +-8360691, -40840844, 1566053, 5055714, 14045080, -21360482, 7672959, -17666812, -13655312, -5000416, +17889612, 4277788, 16745541, 29791504, 10004589, 6709813, 20621212, -15416248, -688269, -7521562, +-6924024, 15185394, 16068010, 22276384, 13053479, 13198435, -9430138, -21248276, 7656853, 1136019, +971200, 2308545, 4566087, 6301254, 11350525, 4735202, 9767829, 6127308, 11311333, 27259084, +2223719, -32001264, -10925323, 10050760, 1686312, -5406827, -20203526, -12611098, 5887864, 19082540, +8121783, -15076946, 10290205, 8742943, -17540646, -1890859, -22007950, 20045686, -8376260, -10453950, +18302466, -14641007, 5955509, 37101000, -2761664, 7585449, 11812234, 1816771, 6548752, -18764712, +6458020, 5632313, 4794794, 48416092, 32874754, -1363115, -14679124, -8537321, 16111496, 19161996, +-17011828, -8018704, -23318988, 42036456, 12601971, 7153268, -4616553, -1606318, -6978248, -2007360, +30437896, -4527433, 9816685, 31792958, 7087770, -4320737, -18524194, 4738960, 11447162, -37451040, +12979928, 11705396, 30207042, -5838471, -27050778, -3822521, 18787798, 10542534, -30301532, -40023728, +4712653, 27239220, 11107859, 16651588, -9337259, 12855911, 2268280, 347355, -14427332, -5210869, +-22530862, 33621540, 11395622, -27347130, -18619220, 12177843, 1417876, 6674379, -8058433, 16699370, +9917079, 11451993, 22129818, 19386946, 4123169, 18931142, -9942312, 10786810, 33286, 13123273, +6189048, -3406983, -7960722, 8949101, -11868068, 31119186, -8406325, -6231461, 6439767, 15186467, +15317464, -10756209, 26977764, 26388816, 15485505, 6038724, 2105071, -9107478, -20560008, -35373888, +-5928129, 11798275, -1102733, 14512694, 16067473, 17002702, 5578626, 9088151, 57081188, -29306172, +-13434658, 4782446, 9824201, -2507724, -47048144, 9460739, -9830106, 5577552, 3140695, 18915572, +-5295158, -9130027, 3176128, 14959371, 14666240, -8393977, -11439645, 3160559, -11021960, -34579320, +35290136, -10534481, 9685688, 3153580, 29504814, 23658290, 14588393, -14374182, -2750927, 20279224, +10406169, 23890756, 63588600, -4108673, -25742960, -6729677, 18614388, -3016678, -30394410, 45394584, +22990960, -16246788, -25631828, -3277597, 4880694, -8152922, 17324824, 15134391, 16924856, 33742872, +4798016, 9304510, 5111548, -13520020, -32709934, 18226230, -22678502, -16629040, 23765128, 12594455, +12764643, 6818798, 3697967, -2097555, -32849520, -28522878, -1217623, 15709917, -22579716, 18540836, +-11282342, -24406152, 4959077, 18894634, -6402723, 2180233, 17202418, 17798344, 17210470, -1096290, +-16694001, 8438000, 44137768, 1451699, 13475460, 21461952, -9206262, -22352620, 18043158, 14874545, +381715, -11799349, -17552994, -30882426, 5491116, 19156628, 25970594, -21990770, -23691576, 29122026, +12890271, -944356, -3073586, -11791833, 5350993, -5356898, -12726525, 13543106, 15968688, 11492796, +832150, -2040646, -9329206, 2290291, 6497212, 4487167, -10561861, -35747548, 7703024, -7790534, +-11243688, 2471217, -5103495, 3525095, -36487896, 17324288, 12670154, -25373594, 17617418, 24710020, +19596326, -4766340, 2764348, -2534568, 12489765, -2234994, -786516, 65187940, -20104206, 6202470, +-18089328, -9112847, 35478040, 14284524, 11458973, 24320252, -30658550, -23374286, 35427576, -21906480, +17411260, 24444806, 819265, 7653632, 7225209, 43139188, -15887084, -13985487, -40177272, -6045167, +-19000398, 15326591, -27344446, 43139724, 16375637, 23687282, -9824201, 27180700, -14879914, 14624901, +45820320, 23016730, 17682918, -24770688, 7686381, 25735980, -20985210, 36207648, 13347148, 19601156, +17641578, -10486163, 18249852, 15730318, 6957847, 35846332, 27348742, -1589675, -60026464, -6673843, +28638306, 27543626, 28390270, 7067906, 16052440, 1733556, 8305930, -1677722, -18300856, 39071856, +-580894, 37208912, 17050484, 26889180, -36908264, 25492778, 12969191, 11534135, -9445707, 8889509, +-6649146, 8435853, 37392524, 14791867, 48671108, 2319282, 10901164, 28160490, -5573257, 44263932, +22028888, 3574487, -29419990, -18857590, 16222091, 1306744, -4971425, 267899, -5142150, 2609193, +-21635898, 13252658, -23069344, -35424352, -12973486, -3634616, -11583527, -10989748, 28755880, -6369437, +26512834, -29101624, 29703456, -1606855, -9347459, -27965606, -26849452, -11314018, -12250857, 20015622, +-34908420, -42974368, -46939160, -56132000, 23536958, 26354994, -2794413, -5204964, -1423782, -13876502, +1916092, 6191196, -12989592, 37009732, 34104724, 22567906, 23970212, -23939074, 14083735, 744640, +17008070, -7786776, -11049340, -35003448, 29341606, -31634044, -39414916, -10314901, -9589051, 40239012, +-23985244, 5160403, -22778896, -6135898, 37347424, 7054484, 10559177, 19217832, 34066068, 2109903, +-5931350, -43940736, -10053982, -3507378, -3244311, 24124832, 10888816, 81883016, 2010045, -2309082, +-29235306, -1877975, 30333744, 30203820, -4878009, -13857712, -42600708, 10735271, 23344758, -12282533, +-31659814, -11442330, 23045720, -6346888, 16468515, -56693032, -34514356, -44128640, -13878650, 23242752, +9969693, -4099010, -13769128, -5874442, 42324220, 3927211, 2782065, 73017128, 9503689, -49471580, +-37504728, 52015812, 46313168, 5463736, -32229434, -40432824, -22260816, 11318849, 45070848, 40715752, +27894202, -12736189, 7460895, -12793634, 16349330, 35109748, 52262772, 57259432, -4402342, -26212186, +-43553652, -65808024, 1662152, 39537320, 151162992, -16508244, -5609764, -68970736, -27442156, 9021042, +19459960, 91528976, 66160212, 42449848, -42776800, -22517976, -41776072, 315143, 76350560, 71518720, +85745800, -20171850, -80246096, -57047904, -81090592, 23670102, 78267728, 69878048, 125590752, -56281788, +-69981120, -60265908, -8722542, 57330836, 74590160, 104458976, 47715476, -19024558, -38241852, 11597485, +-1800665, 30933428, 82536920, -16434692, 51304460, -17312476, -46792596, -5764920, -35693324, 48163228, +-10327786, 56705916, -51021528, 969052, -21781390, -53517440, 40293772, -28040768, 37439228, -28754270, +-10081362, -2539936, 19899658, 4161287, -19419694, -11112691, 384936, 28964186, -25745644, 33171644, +25418690, -18584860, 5689758, -23329188, -21447456, 38417944, -36762236, -19987704, 27599996, 58779848, +1393717, 7238631, -3553012, -26967026, -5295695, 23260470, -6339372, -40441412, 7729331, -9849434, +-4392141, 10477573, -33478196, 16542067, 2348810, 10717017, 30184494, -64276332, -43574592, -17297444, +1376000, 62172872, -31229244, 20969640, 53570592, -30310122, -13287555, -4544613, 30676268, 36902360, +-18475876, 8177618, -4546760, 12079059, 65865472, -27304718, -66442608, 10181757, 35908612, 2891587, +-33784748, 16934520, 13060459, 15062987, -10817412, -8177618, -75790064, -26295938, 27710056, 39275328, +31945966, -39401492, 8098161, -104110544, -69021736, -58972048, -12336757, 43967044, 26890790, -5356361, +-25677462, -30594126, 9836012, -19954418, -5262946, 32909114, 6260452, -1483911, -39346196, -20369956, +-7263327, -20065014, 7274601, -6110665, 15704548, -8189429, -3900904, -9440338, -4888747, -7689065, +-24177444, -18501108, -38058244, -27218818, 13655849, 30518964, 32650342, 17341468, 27911918, -7801271, +23117662, -9258876, -16416976, -45675904, -5720360, -26501558, 14173392, 4164508, 49884436, -46491412, +11210938, 27553826, -21123722, -25950730, -17999134, -13518410, -15797963, 1274532, 33516852, 22097070, +-15421080, -3978750, 22022982, -34401616, -41392212, 12144020, -47971564, -33922188, -36197984, 30782030, +-1711545, -78597904, -120146344, -148846384, -116412408, -176777632, -25374130, -59462212, 27621472, 46845208, +140762192, 86220928, 145448528, 149030000, 199630624, 148996704, 149768736, 113708720, 11104101, -22142704, +-49377092, -25877714, -108869368, -70201240, -56553444, -55512988, -57426396, -54674932, -55624660, -57633092, +-67127656, -45543832, -79168592, -60451664, -55098524, -18348638, -66133908, -13232257, 30783104, -44066900, +-21145734, 22911504, 15624554, -36007396, 40927816, 56508348, 63897304, 90801512, 86407760, 1923609, +52009368, 89183384, 116437640, 98599568, 181735632, 177670448, 150125216, 129126048, 153055984, 83625160, +120544696, 155788128, 111449568, 79443472, 119329224, 45448808, 34274912, 80129056, 65934192, 56032144, +325881, 42689292, -37689412, -5543729, 2031520, -71586904, -172790832, -139353968, -97657896, 0, +0, 0, 0, }, }, }; const Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774] ={ { { -2848100, --4996121, -2501819, 178778, -1384590, 3234110, -3849365, -6403260, -5370320, 883690, 0, --1796907, 2643016, -185757, 2986076, -4163434, -3251290, 912144, -12885, -562641, -3524558, -877247, 576063, 872415, 3602941, 2280091, -505732, 1189706, 1094680, 1391569, -843961, -188979, 4723927, 2952253, 1245541, -2436320, -1349157, -585726, -1560147, -1996086, 3809099, -1480690, 1563368, -492311, 772020, 365072, 855772, 782758, 405338, 2534031, -2726767, --1814087, -331249, -390842, -3704409, -1619203, -4740570, -2827162, 858457, 1508070, -1408212, --3979824, -1078037, 1160178, -315680, 2673617, 134755, -540092, 7708393, -3829500, -2741800, --691490, 1606318, 1019518, -4606353, 1345399, -206158, 5018670, 2812667, -3750043, 5525476, --3332895, -854699, -143881, -1605244, -2269353, -3904662, 759136, 6459631, 412317, 1331977, -2425046, 855772, -2447058, -477815, -1549946, -1117228, 3553012, 1251446, 261993, -1079111, -461709, 54761, -1678259, -2145336, 3428458, 3036542, 280247, -568009, 4009889, -5709086, --2456185, 2738042, -2706903, 5315559, 266288, 3817152, 203474, 635655, 2066416, -1820529, --1118302, 153545, -330176, -1367410, -1553168, 2479807, -396748, -5230197, 4833986, -483184, -573378, -4372814, 1885491, -1795833, 1498407, 394063, -489089, -1471563, -523449, -2397129, -2392297, -4905927, -971736, 4092567, -3421478, 1729798, 5208185, 2059437, 54224, -2459943, --324807, 1869385, 10871099, 2074469, -1596654, 3390340, -1724429, -1323924, -1829119, -674310, --4189741, 5841693, 3265786, 2533494, 2603287, 2587718, -2797098, -3616363, 4780836, -1044751, --3912178, -7224672, 1059246, -2145336, 2136746, 33286, -751082, -1636383, 2128693, -2702608, --1505386, 3539053, 6623914, 1728188, 2918430, 541703, 3235184, -760746, 3444564, 2228551, -215822, 1960653, -23085, 518617, -26307, 4871567, 826244, 1209033, -1354525, 629213, --597537, -809064, 3764539, 4479651, -1928440, -1833414, 641024, 4088272, -7202660, -526134, --2195265, -5286031, -2419677, 513249, -2542084, 2053531, 1447941, -88047, -3537443, 1180579, --1125818, -3282429, 3308736, -5625871, -3074123, -6050535, -3468186, -1366337, -70867, 2916283, -1844152, -7045894, -235686, 598611, 5129265, -1815161, -7864085, 6265821, -7407745, 25233, --3007551, -3094524, -7875360, -5893232, -2822331, -2480344, 3818763, 761283, -5038534, 377420, --2499134, -354872, 228707, 1846299, 883690, -2782602, 818191, 177167, 1772211, -2091649, --725850, -917512, -2254858, -4514548, 5995775, 2149631, 1206349, -1193464, 5186710, 3650185, --4194573, 862215, 920734, -1341104, -2232846, 154619, -4323959, 609885, -412854, -4420058, -5374078, -416612, 149787, 5567888, -4743255, 4250944, 2325188, -1267552, -3339874, 555125, -31139, -4753455, -2828236, -622770, -860067, -2561948, -5035849, -502511, 1946694, 1827509, --884763, 1515050, 1598265, -2189360, 121870, -4880157, -12334609, -11577084, 4437775, 7732552, -4580583, -10443750, 7369627, -2514703, -1052267, 668404, -4959614, -3683471, 8679055, -133681, --145492, 648003, -351650, 2842195, -4530117, 2617783, -2484102, 2332167, 3849365, -2729989, --915365, 2262911, -876173, 4118337, -1528472, 1733019, 129923, -530965, 101469, -3694746, --5245229, 4573604, 329639, -1044751, -262530, -4819490, -6132140, -328565, -232465, 2844342, --5766531, -4799626, -1373853, -9808095, 3307125, -987843, 1510755, -987843, -2787971, 1196148, -11780558, 6528887, 3016678, -4004520, 4250407, -404264, -6957847, -362925, -7290707, 5181341, -4832, 199179, -4600984, -478352, 2889439, 826244, -298500, -176631, -797790, 3355980, -1412507, -370978, 947040, -17770428, -1202591, -4377109, -475131, -3080029, -9860171, -556735, --2545842, -4251481, -9232032, -1281511, 6804839, -4774930, 4527433, -893890, 6323266, -2206540, -5166309, -1764158, -4818954, -1439888, 683437, -2281165, -4317516, -3686156, -4241817, 51003, --3857954, 1374926, 621697, 321586, 2043331, -3086471, -3890167, 5759551, -386010, 1670205, -204011, -4621385, -2758980, -3267396, 296890, -2346126, 4198331, 4110821, 816581, -5606006, --1704028, 10313290, 2691871, -4333622, -3343095, -2164664, -3700114, -1956895, 8165270, 4983236, --5734855, 3686156, 4851703, 7150047, -1712081, 3024194, -341987, 278636, -2757906, -5569499, --985695, 4637491, 504122, 8754217, 5968394, 920734, 1976222, 7722351, -5567352, 22699440, -15058692, -4584341, -975494, 133144, -752156, -2520072, 3007014, 7788923, 6369437, 3432216, --12031277, -5241471, 1336272, 703838, 4836670, -8922258, 1588601, 12090870, 7915625, -1412507, -2658048, -1099512, -4344360, -5629092, 37581, -4817343, -3063386, 1314260, 3452080, -3576634, --6811818, -3191161, 776315, 5837398, 7964480, -1722282, -9177808, -2016487, -3543885, -9002251, --950262, -456340, -4679367, 1253057, 1915019, 4933844, -7896834, 2777770, 3302293, 562104, --7710540, -5616207, 1860258, -8053, 1243930, -1131187, -1356673, -630823, -4671851, 1538672, -1319629, -3233574, 4156455, 5370857, 7152195, 1358820, -381715, 6925098, 11244224, 1209033, -404801, 1166621, 5692443, -450435, 2150168, 9822590, 11489574, 656056, 2062658, 3273839, -5308580, -1867237, 3213709, -2733747, -2421825, -9453760, 3449396, 7028714, -6535330, 5401995, --2993055, -8278550, 8447127, 5603322, -2099702, 5648419, 9954660, 7612293, -5932961, -2756295, -4736812, 1915555, -1746978, 4296578, 3163780, 5654325, -234613, -2185602, -5262409, -8116415, --877784, -6726456, 228707, -2104534, 3213173, -5359583, -13239774, 2862596, -3786014, 5879274, -787053, 496069, -4179540, -7408282, -6936372, -609349, -1366873, -5651640, 7129109, 10097468, -9811853, 4138738, -8369281, -854162, 9210557, 722628, -2570538, 4363150, -2181307, -2904472, --10419054, 4780299, 1821066, 13230110, 5399848, -10057740, 2124398, 2689187, -2065879, -1182190, -2226941, -3447785, -4018479, -5763309, -2011118, -1219771, -10918881, 862215, 918586, 5607617, --2378875, -4226248, 1502702, 889058, 2098092, 388158, 5325760, 2600603, 3544422, 966368, --864899, 3689914, 1562294, -10113574, -3650185, -14584098, 223338, -2510945, 1257352, 2881386, --270046, 7337415, 1326608, 10363756, 754304, -11829414, -258235, -4640176, -2510409, -376883, --2339147, -437013, -10099079, 2247879, -5162551, 11660836, -12528420, 6766184, -3199751, -10085120, --2536178, -7075422, -2197950, -2105608, -11541114, 3172370, 2607582, -1958505, -2555506, -691490, -3035468, -8654896, -645319, 8020852, 558346, 11143293, 17347372, 7436736, -17783312, -22417582, -9469866, 4554276, 15053324, -3777961, 6059125, 1287417, 5311801, 10627360, 9529996, -20206748, -15076409, 2937758, -2776160, -134755, -9284646, -7365332, 7860327, -1930051, -2634963, 8435853, --6149857, -6341519, 341450, 8428336, 3467112, -2359011, 245350, -4377109, -614180, 965831, -4410932, 538482, -10349261, -9962177, 2377265, -992137, 2556043, -617402, 4229469, 8468602, -15058155, 232465, 9385577, -1790465, 2732136, 6926172, -6109054, 12776991, -1628330, -7008850, --10594074, -1429687, -8756901, -10571525, -2953327, 5871757, -3309272, -7984881, 4526359, 7000797, -9893457, 13385266, -10056129, 4789426, -2666101, -8470749, 3723200, -9514426, -1742146, -16101832, -7060926, -3957812, 2740726, -1828046, 2899103, -17098802, -18242874, -9661529, -4160213, 11914776, --9768903, 21319144, -6725382, 4137127, -1695975, -2069101, 16455630, 1712618, 5772436, 5233955, -1102733, 10719701, 675921, -13293461, 6046777, 2726767, 5743445, 81604, -11075110, 15562814, -7327214, 6816650, -2103997, -3782256, 1211718, -361851, -8927626, 6052146, 3022583, -3856344, -5267778, 10168872, -447213, 4279935, 8705362, -9514963, 1758789, -2725694, 3521873, -18533858, -5183489, 9990631, -3934190, 3189550, 8588324, 5686537, -550830, 3788698, -10341208, 3200288, --6375879, 1148904, 2091649, 2241436, -5106179, 19158238, -4025458, -2790655, -5026186, -15390478, --7253663, -9164386, -12157442, -1511829, 15119895, 18086108, -2466922, 6045167, 6195491, -13886703, --5493263, 12450036, 8934606, -5164698, -4944581, -13743358, -5585605, -4886062, -7923141, -7603166, -1040456, -13785771, 4165582, -1719598, -5218922, 3245385, 1116155, -7311108, -10422812, -11561515, --4318590, -11287711, -4378719, -4607963, 481573, -10706280, 2711198, 4463545, 843961, -12177306, -4156455, -15086073, 5060009, 8464307, 657130, 13156559, 838592, -3823595, -1926293, 8931921, --2688650, 12278238, 4846334, -4071092, -3624953, 2300492, -5629629, -3169149, 1059783, 11703249, -245350, 6302865, 4120484, 1289027, 8764955, -3351685, -6672232, 3570192, -4538707, -2148021, --13659607, 8476118, -4246112, -3918621, -2058363, -15562277, 19979114, 5340255, -1313723, 8716099, -3723200, 4469987, -7381975, -12252468, -13320841, -6531035, 1937030, -14158360, 6701760, 10969883, --15014669, -5654325, 7460895, -7374459, 5550172, 17980344, 2372970, -4125316, -3109020, 12329240, -28142236, 31091268, 8449811, 19586662, -13623099, -12261058, -3755949, -1148904, 376883, 5056787, -8965744, 18202608, 4998805, 16910896, 1073205, 5677410, 1689533, -3646964, 6647536, 620086, -2224793, 2065342, -8917426, -194884, -5110474, -8068633, -6248104, 975494, 184147, -10961293, --5563594, 15713675, 10013179, 8580271, 11893301, -6947110, -613643, -20754356, 310311, 19426674, --4315369, -2818572, 1538135, -1107028, 13834090, -260382, -3112241, 12101607, -14052059, -20739324, --9418326, 2861522, -12335683, 9549860, 11356430, -16095927, -7157563, 1119376, -1026497, -23470922, --16305306, 8875550, 2645163, -760746, 7110855, -9558987, -7362648, -13921063, 2719788, 6154152, -275415, 2512019, -11202348, -14900315, 12257300, -19990388, -28567974, -19876572, 13652090, -2530810, -25141128, -5823976, 20630876, -16503949, 125628, 7961796, -2057289, 1321776, 2084670, -896574, --13071733, 4877472, 4388920, 5986111, 5936719, -3463891, 10041097, -9030706, -7387881, -4962835, -14277008, -7633231, -3124052, 1789391, -704375, -7131257, 6140193, -8000987, -10521059, -18559090, -1331440, 4020090, -13363791, -5501853, 5821828, -2063195, 2913062, 1613297, 14635101, 1647120, -10905459, 5677947, 54761, 9732396, 1626719, 3824132, -17522392, 18303540, 5789616, 14531485, --8819178, 4447439, -9608916, 15133854, 10414222, 18332532, 2355790, -3622805, -13091060, 226560, -1853278, -9699647, 14992120, 3658239, 2110977, 17799418, 3528853, -3551938, -6580427, 938450, -10126996, 13180181, -3392487, 12432857, 13180718, -30792232, -1169842, 15824807, -9942312, -3508452, -12048994, -12826383, -25581898, 5109401, 4756140, 4003983, -2990371, -15300284, 4289599, 4405026, -1612760, 8587787, -26961120, 12710419, -5850283, 6699612, -15080167, 12903155, -19194746, -12436615, -8323110, -4949950, -1627793, -14780593, 12540231, 15863462, 715112, 2066953, -6361384, 23709294, -6632503, 6763500, -3352222, -19768660, -3409130, 11622718, -1049046, 17197586, 1174137, -5516886, -5115306, -596464, 11613055, -19379430, -1218697, -14685567, 17831630, -5492727, 6874095, 253940, -789737, -17357574, -4913980, 16710107, 6603512, 2260764, -3199751, 1348620, 3707094, -22294638, --22280680, 26563836, -9516574, -26776974, 13250511, 14222784, -20338818, -28078886, -18256296, -18128520, -13223131, -18006650, -8124468, -18753974, -366146, 2415382, -22310208, 2608656, -10243497, 31649614, -3032247, -30647812, -5462125, 13194676, 10088878, 5883032, 16221018, 13867913, -19931870, -6490233, --6856916, 18941342, -5623186, 22312892, 1381369, -14453639, -9302899, -21804476, -22462142, 488553, -4237522, -4811974, -10849087, -6118718, 3092913, 2949032, 9701257, -12496207, 7446937, -14514305, --14650133, 2435783, -1918240, -4983236, -15322833, -16618839, -6147709, -5507759, 24468428, 1613834, -9264244, 12438762, 1174137, 28449864, 13247290, -9866077, 3058017, 14668387, -4230006, 18736794, --3382287, 2456721, 2834142, -25214680, -24581708, 4347581, 19701552, 1162326, -4287451, -27362700, -3139621, 11437498, 7293392, -7210177, -6942815, -1321776, -12800613, -14295799, 28685550, -9826885, --8713415, -2804077, -6115497, -19950660, 1820529, 11505144, -30465276, -1903744, 9729175, 8827232, --9411347, 5874979, -16780438, 46708, -3209951, 4355634, -14834280, 8821863, -26308286, 3200288, -2337536, 14410689, 16443282, 6013491, -8774618, 10217190, -1731409, 11569031, -12407624, 835908, -18254148, 11690364, -5974300, 1278827, 2244121, -5083631, 9895068, -4551055, -7674570, -12167105, -9649718, -20827370, 14875082, 1504312, -18593988, 18058726, 20992190, 16091632, 8734890, -10710575, -25169582, 1138166, 12395276, -15538655, -9241696, -15004468, 7190312, 3456912, 11430519, -20488068, -5450851, 11912629, -31876710, -599685, -7198902, 20442970, 19888920, 9058086, 3342022, 12414066, --5589900, -3727495, 3338800, 23400056, 5471252, 11658689, -33908228, 15472083, -18842558, 25490094, --2291365, 9638980, 19915226, -21674016, 38063072, 26607860, 20701742, -9828496, 5759015, 25343528, --6267431, -8934606, -5823976, -2002529, -19371914, 4515085, -10225780, -24452322, 23172422, 6869800, -6482717, 2108292, 5479305, 8093329, 24335284, 4237522, -14972793, -2177549, -15557445, 2171106, -2355790, -28515898, -1093069, 13980655, 1158031, -3035468, -8354785, 28165858, 6073621, 11302206, -6474663, -17032766, -11278584, -9925669, 18200998, 9388262, -3647501, 9614284, -1634772, -21451214, -19333796, 754841, 22162568, 750009, 2267743, -1383516, -29446296, 2048163, 794032, 1120987, -18348638, -9592809, 28904056, -46422692, -7585986, 29587492, -12862890, 7067369, -14155138, -27970438, -16349330, 7134478, -36538360, -41454488, -4886599, -18967650, 1505386, 12940736, -18207440, 5775658, --27207544, 12054899, -15611669, -70148624, -5947456, 43929464, -20074678, -7371775, 41961832, -9597641, -801548, 52607980, -14053670, 12017855, 3213709, -7141994, 40205724, -33340758, -6133750, -556198, --7779260, -6475737, -8817568, -570694, 11675869, -7465727, -24924768, 425739, -1672353, 6874632, -6127308, 1574642, 16524350, -715112, 6267431, -5190468, -25192668, 15709380, -5395016, -23538032, --1832877, 13242458, 38428148, 20586852, 31700616, 360240, 5368172, 16127602, 547071, -2543158, -28861644, -2306398, -16488379, 37307696, 2481954, 5947456, -4264366, -6216965, 16676284, -959925, --18311594, -15302968, -9598715, -3970161, 24596740, -23474144, -9517648, 470299, 25756382, 17813914, --38075420, -21041044, 32217086, -7220377, -28094992, -1857037, 2311766, 9216463, 34011848, 27172648, --15972983, 3774740, -2285460, -1275068, 1440425, -20118700, 29779692, -9822053, -16610786, 5053566, --11414412, 14453102, 3183108, 21189222, -5176510, -22925462, -17602386, 15731928, -6430640, 20927766, --4154844, 13074954, -12832825, -12799539, -5113696, 237834, -16550120, 3175592, 2881386, -1027034, -19947976, -1521492, 7963943, -13817447, 10896869, -21040508, 23137526, -20272782, 14579803, 5145908, -19812148, -30982820, 3071439, 1291175, -6908992, -22697828, -34303904, -7282654, -28925530, -13129715, --22676890, -12761422, -43210592, -15305116, 22923852, 24921010, 16585553, 13963476, -12348, 15167140, --29883308, -9097278, 7401840, 17032766, -52539260, 15430207, 8004209, -27465242, 10625212, 10314901, --20295332, -15320148, 23207318, 2938831, 12171400, -6339372, 15152108, -4990215, -2901787, 12185896, -5438503, 3925600, -191663, -8394514, -14798847, -8811662, 21621940, -8014946, -19979114, 32608466, -19532974, 2374580, 14173392, 4196720, -17807472, -50371376, 19593104, -1968169, -28072444, 22408454, --3479997, -36868000, -31875100, -16342887, 22727894, 9220221, 23507966, 30882426, 7910793, -25770878, -6452115, 8607114, -33909840, -5734318, 16344498, -10631118, -37089728, -27255326, -44952740, -27954332, --8524436, 26341034, 36610300, 18096844, -5404680, 26120918, -9848360, -67065916, -55911884, 10466835, --30339648, -32535988, 40442484, 4556961, -65672196, -48361332, 9644349, 754841, 2230699, 19838990, -41181756, 48706540, 48919140, -15892453, 17626546, -20444044, 12964896, -35433, 7921531, -24161338, -2857764, -20703890, -16892106, -404801, -40331892, 479426, -16528645, 4104378, 13284871, -791885, -15245523, -20776904, 32014150, -15642808, 659278, 20963736, -18841484, 7523172, 16666621, 18632642, -4032974, 6586333, 6026913, -29929480, -15167140, -4956929, 5800354, 4481262, -2972117, 19647328, --4868883, -286689, -2231773, -8500814, 8545374, 4010426, -21890912, 7061463, -17227114, 5373004, --43676060, -1939715, 636192, 225486, 20361366, -7080254, -14667850, -6914361, 18971944, 518080, --41866804, 62067108, -3295314, -10931766, 15515569, -1714766, -6829535, -10346039, -9958419, -11736535, -44418552, -14491220, -22058952, 23231478, 4313758, -29830696, -5899675, -37685116, -59234040, -54272816, -120955944, 102823128, 113995952, 262840192, 66394824, -65113852, 18334142, -209863376, -225466992, -55032488, --142878000, -108393704, 63241244, -34746284, 10564009, 166465952, 79409648, 123025040, 234027392, 157464768, -37460704, 33223182, -74300784, -217947584, -169887968, -128355632, -260513920, -105530568, 1046898, -47619376, --25778930, 126701536, 28554554, 14376329, 154111472, 16492138, 31809064, 223884832, 160408432, 101797704, -207801248, 102584224, -45685032, -8369281, -76588928, -340910880, -301647360, -242662960, -377166304, -286881280, --109767552, -140354704, 18412524, 246475296, 215295968, 305671744, 384367360, 285343136, 215829088, 212392576, -107342504, -56225952, -99315752, -199178576, -282984672, -275589248, -247752512, -277487648, -290987808, -237598128, --154757328, -120460944, -16268799, 156988032, 192766192, 123452392, 10576894, 0, 0, 0, -0, 0, 0, }, +-4996121, -2501819, 178778, -1384590, 3234110, -3849365, -6403260, -5370320, 883690, 0, +-1796907, 2643016, -185757, 2986076, -4163434, -3251290, 912144, -12885, -562641, -3524558, +877247, 576063, 872415, 3602941, 2280091, -505732, 1189706, 1094680, 1391569, -843961, +188979, 4723927, 2952253, 1245541, -2436320, -1349157, -585726, -1560147, -1996086, 3809099, +1480690, 1563368, -492311, 772020, 365072, 855772, 782758, 405338, 2534031, -2726767, +-1814087, -331249, -390842, -3704409, -1619203, -4740570, -2827162, 858457, 1508070, -1408212, +-3979824, -1078037, 1160178, -315680, 2673617, 134755, -540092, 7708393, -3829500, -2741800, +-691490, 1606318, 1019518, -4606353, 1345399, -206158, 5018670, 2812667, -3750043, 5525476, +-3332895, -854699, -143881, -1605244, -2269353, -3904662, 759136, 6459631, 412317, 1331977, +2425046, 855772, -2447058, -477815, -1549946, -1117228, 3553012, 1251446, 261993, -1079111, +461709, 54761, -1678259, -2145336, 3428458, 3036542, 280247, -568009, 4009889, -5709086, +-2456185, 2738042, -2706903, 5315559, 266288, 3817152, 203474, 635655, 2066416, -1820529, +-1118302, 153545, -330176, -1367410, -1553168, 2479807, -396748, -5230197, 4833986, -483184, +573378, -4372814, 1885491, -1795833, 1498407, 394063, -489089, -1471563, -523449, -2397129, +2392297, -4905927, -971736, 4092567, -3421478, 1729798, 5208185, 2059437, 54224, -2459943, +-324807, 1869385, 10871099, 2074469, -1596654, 3390340, -1724429, -1323924, -1829119, -674310, +-4189741, 5841693, 3265786, 2533494, 2603287, 2587718, -2797098, -3616363, 4780836, -1044751, +-3912178, -7224672, 1059246, -2145336, 2136746, 33286, -751082, -1636383, 2128693, -2702608, +-1505386, 3539053, 6623914, 1728188, 2918430, 541703, 3235184, -760746, 3444564, 2228551, +215822, 1960653, -23085, 518617, -26307, 4871567, 826244, 1209033, -1354525, 629213, +-597537, -809064, 3764539, 4479651, -1928440, -1833414, 641024, 4088272, -7202660, -526134, +-2195265, -5286031, -2419677, 513249, -2542084, 2053531, 1447941, -88047, -3537443, 1180579, +-1125818, -3282429, 3308736, -5625871, -3074123, -6050535, -3468186, -1366337, -70867, 2916283, +1844152, -7045894, -235686, 598611, 5129265, -1815161, -7864085, 6265821, -7407745, 25233, +-3007551, -3094524, -7875360, -5893232, -2822331, -2480344, 3818763, 761283, -5038534, 377420, +-2499134, -354872, 228707, 1846299, 883690, -2782602, 818191, 177167, 1772211, -2091649, +-725850, -917512, -2254858, -4514548, 5995775, 2149631, 1206349, -1193464, 5186710, 3650185, +-4194573, 862215, 920734, -1341104, -2232846, 154619, -4323959, 609885, -412854, -4420058, +5374078, -416612, 149787, 5567888, -4743255, 4250944, 2325188, -1267552, -3339874, 555125, +31139, -4753455, -2828236, -622770, -860067, -2561948, -5035849, -502511, 1946694, 1827509, +-884763, 1515050, 1598265, -2189360, 121870, -4880157, -12334609, -11577084, 4437775, 7732552, +4580583, -10443750, 7369627, -2514703, -1052267, 668404, -4959614, -3683471, 8679055, -133681, +-145492, 648003, -351650, 2842195, -4530117, 2617783, -2484102, 2332167, 3849365, -2729989, +-915365, 2262911, -876173, 4118337, -1528472, 1733019, 129923, -530965, 101469, -3694746, +-5245229, 4573604, 329639, -1044751, -262530, -4819490, -6132140, -328565, -232465, 2844342, +-5766531, -4799626, -1373853, -9808095, 3307125, -987843, 1510755, -987843, -2787971, 1196148, +11780558, 6528887, 3016678, -4004520, 4250407, -404264, -6957847, -362925, -7290707, 5181341, +4832, 199179, -4600984, -478352, 2889439, 826244, -298500, -176631, -797790, 3355980, +1412507, -370978, 947040, -17770428, -1202591, -4377109, -475131, -3080029, -9860171, -556735, +-2545842, -4251481, -9232032, -1281511, 6804839, -4774930, 4527433, -893890, 6323266, -2206540, +5166309, -1764158, -4818954, -1439888, 683437, -2281165, -4317516, -3686156, -4241817, 51003, +-3857954, 1374926, 621697, 321586, 2043331, -3086471, -3890167, 5759551, -386010, 1670205, +204011, -4621385, -2758980, -3267396, 296890, -2346126, 4198331, 4110821, 816581, -5606006, +-1704028, 10313290, 2691871, -4333622, -3343095, -2164664, -3700114, -1956895, 8165270, 4983236, +-5734855, 3686156, 4851703, 7150047, -1712081, 3024194, -341987, 278636, -2757906, -5569499, +-985695, 4637491, 504122, 8754217, 5968394, 920734, 1976222, 7722351, -5567352, 22699440, +15058692, -4584341, -975494, 133144, -752156, -2520072, 3007014, 7788923, 6369437, 3432216, +-12031277, -5241471, 1336272, 703838, 4836670, -8922258, 1588601, 12090870, 7915625, -1412507, +2658048, -1099512, -4344360, -5629092, 37581, -4817343, -3063386, 1314260, 3452080, -3576634, +-6811818, -3191161, 776315, 5837398, 7964480, -1722282, -9177808, -2016487, -3543885, -9002251, +-950262, -456340, -4679367, 1253057, 1915019, 4933844, -7896834, 2777770, 3302293, 562104, +-7710540, -5616207, 1860258, -8053, 1243930, -1131187, -1356673, -630823, -4671851, 1538672, +1319629, -3233574, 4156455, 5370857, 7152195, 1358820, -381715, 6925098, 11244224, 1209033, +404801, 1166621, 5692443, -450435, 2150168, 9822590, 11489574, 656056, 2062658, 3273839, +5308580, -1867237, 3213709, -2733747, -2421825, -9453760, 3449396, 7028714, -6535330, 5401995, +-2993055, -8278550, 8447127, 5603322, -2099702, 5648419, 9954660, 7612293, -5932961, -2756295, +4736812, 1915555, -1746978, 4296578, 3163780, 5654325, -234613, -2185602, -5262409, -8116415, +-877784, -6726456, 228707, -2104534, 3213173, -5359583, -13239774, 2862596, -3786014, 5879274, +787053, 496069, -4179540, -7408282, -6936372, -609349, -1366873, -5651640, 7129109, 10097468, +9811853, 4138738, -8369281, -854162, 9210557, 722628, -2570538, 4363150, -2181307, -2904472, +-10419054, 4780299, 1821066, 13230110, 5399848, -10057740, 2124398, 2689187, -2065879, -1182190, +2226941, -3447785, -4018479, -5763309, -2011118, -1219771, -10918881, 862215, 918586, 5607617, +-2378875, -4226248, 1502702, 889058, 2098092, 388158, 5325760, 2600603, 3544422, 966368, +-864899, 3689914, 1562294, -10113574, -3650185, -14584098, 223338, -2510945, 1257352, 2881386, +-270046, 7337415, 1326608, 10363756, 754304, -11829414, -258235, -4640176, -2510409, -376883, +-2339147, -437013, -10099079, 2247879, -5162551, 11660836, -12528420, 6766184, -3199751, -10085120, +-2536178, -7075422, -2197950, -2105608, -11541114, 3172370, 2607582, -1958505, -2555506, -691490, +3035468, -8654896, -645319, 8020852, 558346, 11143293, 17347372, 7436736, -17783312, -22417582, +9469866, 4554276, 15053324, -3777961, 6059125, 1287417, 5311801, 10627360, 9529996, -20206748, +15076409, 2937758, -2776160, -134755, -9284646, -7365332, 7860327, -1930051, -2634963, 8435853, +-6149857, -6341519, 341450, 8428336, 3467112, -2359011, 245350, -4377109, -614180, 965831, +4410932, 538482, -10349261, -9962177, 2377265, -992137, 2556043, -617402, 4229469, 8468602, +15058155, 232465, 9385577, -1790465, 2732136, 6926172, -6109054, 12776991, -1628330, -7008850, +-10594074, -1429687, -8756901, -10571525, -2953327, 5871757, -3309272, -7984881, 4526359, 7000797, +9893457, 13385266, -10056129, 4789426, -2666101, -8470749, 3723200, -9514426, -1742146, -16101832, +7060926, -3957812, 2740726, -1828046, 2899103, -17098802, -18242874, -9661529, -4160213, 11914776, +-9768903, 21319144, -6725382, 4137127, -1695975, -2069101, 16455630, 1712618, 5772436, 5233955, +1102733, 10719701, 675921, -13293461, 6046777, 2726767, 5743445, 81604, -11075110, 15562814, +7327214, 6816650, -2103997, -3782256, 1211718, -361851, -8927626, 6052146, 3022583, -3856344, +5267778, 10168872, -447213, 4279935, 8705362, -9514963, 1758789, -2725694, 3521873, -18533858, +5183489, 9990631, -3934190, 3189550, 8588324, 5686537, -550830, 3788698, -10341208, 3200288, +-6375879, 1148904, 2091649, 2241436, -5106179, 19158238, -4025458, -2790655, -5026186, -15390478, +-7253663, -9164386, -12157442, -1511829, 15119895, 18086108, -2466922, 6045167, 6195491, -13886703, +-5493263, 12450036, 8934606, -5164698, -4944581, -13743358, -5585605, -4886062, -7923141, -7603166, +1040456, -13785771, 4165582, -1719598, -5218922, 3245385, 1116155, -7311108, -10422812, -11561515, +-4318590, -11287711, -4378719, -4607963, 481573, -10706280, 2711198, 4463545, 843961, -12177306, +4156455, -15086073, 5060009, 8464307, 657130, 13156559, 838592, -3823595, -1926293, 8931921, +-2688650, 12278238, 4846334, -4071092, -3624953, 2300492, -5629629, -3169149, 1059783, 11703249, +245350, 6302865, 4120484, 1289027, 8764955, -3351685, -6672232, 3570192, -4538707, -2148021, +-13659607, 8476118, -4246112, -3918621, -2058363, -15562277, 19979114, 5340255, -1313723, 8716099, +3723200, 4469987, -7381975, -12252468, -13320841, -6531035, 1937030, -14158360, 6701760, 10969883, +-15014669, -5654325, 7460895, -7374459, 5550172, 17980344, 2372970, -4125316, -3109020, 12329240, +28142236, 31091268, 8449811, 19586662, -13623099, -12261058, -3755949, -1148904, 376883, 5056787, +8965744, 18202608, 4998805, 16910896, 1073205, 5677410, 1689533, -3646964, 6647536, 620086, +2224793, 2065342, -8917426, -194884, -5110474, -8068633, -6248104, 975494, 184147, -10961293, +-5563594, 15713675, 10013179, 8580271, 11893301, -6947110, -613643, -20754356, 310311, 19426674, +-4315369, -2818572, 1538135, -1107028, 13834090, -260382, -3112241, 12101607, -14052059, -20739324, +-9418326, 2861522, -12335683, 9549860, 11356430, -16095927, -7157563, 1119376, -1026497, -23470922, +-16305306, 8875550, 2645163, -760746, 7110855, -9558987, -7362648, -13921063, 2719788, 6154152, +275415, 2512019, -11202348, -14900315, 12257300, -19990388, -28567974, -19876572, 13652090, -2530810, +25141128, -5823976, 20630876, -16503949, 125628, 7961796, -2057289, 1321776, 2084670, -896574, +-13071733, 4877472, 4388920, 5986111, 5936719, -3463891, 10041097, -9030706, -7387881, -4962835, +14277008, -7633231, -3124052, 1789391, -704375, -7131257, 6140193, -8000987, -10521059, -18559090, +1331440, 4020090, -13363791, -5501853, 5821828, -2063195, 2913062, 1613297, 14635101, 1647120, +10905459, 5677947, 54761, 9732396, 1626719, 3824132, -17522392, 18303540, 5789616, 14531485, +-8819178, 4447439, -9608916, 15133854, 10414222, 18332532, 2355790, -3622805, -13091060, 226560, +1853278, -9699647, 14992120, 3658239, 2110977, 17799418, 3528853, -3551938, -6580427, 938450, +10126996, 13180181, -3392487, 12432857, 13180718, -30792232, -1169842, 15824807, -9942312, -3508452, +12048994, -12826383, -25581898, 5109401, 4756140, 4003983, -2990371, -15300284, 4289599, 4405026, +1612760, 8587787, -26961120, 12710419, -5850283, 6699612, -15080167, 12903155, -19194746, -12436615, +8323110, -4949950, -1627793, -14780593, 12540231, 15863462, 715112, 2066953, -6361384, 23709294, +6632503, 6763500, -3352222, -19768660, -3409130, 11622718, -1049046, 17197586, 1174137, -5516886, +5115306, -596464, 11613055, -19379430, -1218697, -14685567, 17831630, -5492727, 6874095, 253940, +789737, -17357574, -4913980, 16710107, 6603512, 2260764, -3199751, 1348620, 3707094, -22294638, +-22280680, 26563836, -9516574, -26776974, 13250511, 14222784, -20338818, -28078886, -18256296, -18128520, +13223131, -18006650, -8124468, -18753974, -366146, 2415382, -22310208, 2608656, -10243497, 31649614, +3032247, -30647812, -5462125, 13194676, 10088878, 5883032, 16221018, 13867913, -19931870, -6490233, +-6856916, 18941342, -5623186, 22312892, 1381369, -14453639, -9302899, -21804476, -22462142, 488553, +4237522, -4811974, -10849087, -6118718, 3092913, 2949032, 9701257, -12496207, 7446937, -14514305, +-14650133, 2435783, -1918240, -4983236, -15322833, -16618839, -6147709, -5507759, 24468428, 1613834, +9264244, 12438762, 1174137, 28449864, 13247290, -9866077, 3058017, 14668387, -4230006, 18736794, +-3382287, 2456721, 2834142, -25214680, -24581708, 4347581, 19701552, 1162326, -4287451, -27362700, +3139621, 11437498, 7293392, -7210177, -6942815, -1321776, -12800613, -14295799, 28685550, -9826885, +-8713415, -2804077, -6115497, -19950660, 1820529, 11505144, -30465276, -1903744, 9729175, 8827232, +-9411347, 5874979, -16780438, 46708, -3209951, 4355634, -14834280, 8821863, -26308286, 3200288, +2337536, 14410689, 16443282, 6013491, -8774618, 10217190, -1731409, 11569031, -12407624, 835908, +18254148, 11690364, -5974300, 1278827, 2244121, -5083631, 9895068, -4551055, -7674570, -12167105, +9649718, -20827370, 14875082, 1504312, -18593988, 18058726, 20992190, 16091632, 8734890, -10710575, +25169582, 1138166, 12395276, -15538655, -9241696, -15004468, 7190312, 3456912, 11430519, -20488068, +5450851, 11912629, -31876710, -599685, -7198902, 20442970, 19888920, 9058086, 3342022, 12414066, +-5589900, -3727495, 3338800, 23400056, 5471252, 11658689, -33908228, 15472083, -18842558, 25490094, +-2291365, 9638980, 19915226, -21674016, 38063072, 26607860, 20701742, -9828496, 5759015, 25343528, +-6267431, -8934606, -5823976, -2002529, -19371914, 4515085, -10225780, -24452322, 23172422, 6869800, +6482717, 2108292, 5479305, 8093329, 24335284, 4237522, -14972793, -2177549, -15557445, 2171106, +2355790, -28515898, -1093069, 13980655, 1158031, -3035468, -8354785, 28165858, 6073621, 11302206, +6474663, -17032766, -11278584, -9925669, 18200998, 9388262, -3647501, 9614284, -1634772, -21451214, +19333796, 754841, 22162568, 750009, 2267743, -1383516, -29446296, 2048163, 794032, 1120987, +18348638, -9592809, 28904056, -46422692, -7585986, 29587492, -12862890, 7067369, -14155138, -27970438, +16349330, 7134478, -36538360, -41454488, -4886599, -18967650, 1505386, 12940736, -18207440, 5775658, +-27207544, 12054899, -15611669, -70148624, -5947456, 43929464, -20074678, -7371775, 41961832, -9597641, +801548, 52607980, -14053670, 12017855, 3213709, -7141994, 40205724, -33340758, -6133750, -556198, +-7779260, -6475737, -8817568, -570694, 11675869, -7465727, -24924768, 425739, -1672353, 6874632, +6127308, 1574642, 16524350, -715112, 6267431, -5190468, -25192668, 15709380, -5395016, -23538032, +-1832877, 13242458, 38428148, 20586852, 31700616, 360240, 5368172, 16127602, 547071, -2543158, +28861644, -2306398, -16488379, 37307696, 2481954, 5947456, -4264366, -6216965, 16676284, -959925, +-18311594, -15302968, -9598715, -3970161, 24596740, -23474144, -9517648, 470299, 25756382, 17813914, +-38075420, -21041044, 32217086, -7220377, -28094992, -1857037, 2311766, 9216463, 34011848, 27172648, +-15972983, 3774740, -2285460, -1275068, 1440425, -20118700, 29779692, -9822053, -16610786, 5053566, +-11414412, 14453102, 3183108, 21189222, -5176510, -22925462, -17602386, 15731928, -6430640, 20927766, +-4154844, 13074954, -12832825, -12799539, -5113696, 237834, -16550120, 3175592, 2881386, -1027034, +19947976, -1521492, 7963943, -13817447, 10896869, -21040508, 23137526, -20272782, 14579803, 5145908, +19812148, -30982820, 3071439, 1291175, -6908992, -22697828, -34303904, -7282654, -28925530, -13129715, +-22676890, -12761422, -43210592, -15305116, 22923852, 24921010, 16585553, 13963476, -12348, 15167140, +-29883308, -9097278, 7401840, 17032766, -52539260, 15430207, 8004209, -27465242, 10625212, 10314901, +-20295332, -15320148, 23207318, 2938831, 12171400, -6339372, 15152108, -4990215, -2901787, 12185896, +5438503, 3925600, -191663, -8394514, -14798847, -8811662, 21621940, -8014946, -19979114, 32608466, +19532974, 2374580, 14173392, 4196720, -17807472, -50371376, 19593104, -1968169, -28072444, 22408454, +-3479997, -36868000, -31875100, -16342887, 22727894, 9220221, 23507966, 30882426, 7910793, -25770878, +6452115, 8607114, -33909840, -5734318, 16344498, -10631118, -37089728, -27255326, -44952740, -27954332, +-8524436, 26341034, 36610300, 18096844, -5404680, 26120918, -9848360, -67065916, -55911884, 10466835, +-30339648, -32535988, 40442484, 4556961, -65672196, -48361332, 9644349, 754841, 2230699, 19838990, +41181756, 48706540, 48919140, -15892453, 17626546, -20444044, 12964896, -35433, 7921531, -24161338, +2857764, -20703890, -16892106, -404801, -40331892, 479426, -16528645, 4104378, 13284871, -791885, +15245523, -20776904, 32014150, -15642808, 659278, 20963736, -18841484, 7523172, 16666621, 18632642, +4032974, 6586333, 6026913, -29929480, -15167140, -4956929, 5800354, 4481262, -2972117, 19647328, +-4868883, -286689, -2231773, -8500814, 8545374, 4010426, -21890912, 7061463, -17227114, 5373004, +-43676060, -1939715, 636192, 225486, 20361366, -7080254, -14667850, -6914361, 18971944, 518080, +-41866804, 62067108, -3295314, -10931766, 15515569, -1714766, -6829535, -10346039, -9958419, -11736535, +44418552, -14491220, -22058952, 23231478, 4313758, -29830696, -5899675, -37685116, -59234040, -54272816, +120955944, 102823128, 113995952, 262840192, 66394824, -65113852, 18334142, -209863376, -225466992, -55032488, +-142878000, -108393704, 63241244, -34746284, 10564009, 166465952, 79409648, 123025040, 234027392, 157464768, +37460704, 33223182, -74300784, -217947584, -169887968, -128355632, -260513920, -105530568, 1046898, -47619376, +-25778930, 126701536, 28554554, 14376329, 154111472, 16492138, 31809064, 223884832, 160408432, 101797704, +207801248, 102584224, -45685032, -8369281, -76588928, -340910880, -301647360, -242662960, -377166304, -286881280, +-109767552, -140354704, 18412524, 246475296, 215295968, 305671744, 384367360, 285343136, 215829088, 212392576, +107342504, -56225952, -99315752, -199178576, -282984672, -275589248, -247752512, -277487648, -290987808, -237598128, +-154757328, -120460944, -16268799, 156988032, 192766192, 123452392, 10576894, 0, 0, 0, +0, 0, 0, }, { -3461744, --7253126, -2795487, -4082367, 81068, 1404454, 4320737, -2083059, 347892, -3197603, -2488397, --3400540, 1675037, -3912178, 884763, -3293703, 6473053, -366146, 511101, -306016, -4567161, -2915209, 6880001, 111669, -1712081, 355409, -1312649, 2218351, -814433, -1169842, -1206886, --8152922, -2587718, 659278, -1212791, 2113124, -2427730, 1825361, -496606, 2205466, -1386201, -2369211, 446140, 3339874, 1639067, -1064078, 1348620, 854162, -1751810, -3197066, -1368484, --555125, 1919850, 805306, 178778, -592169, 3748970, 4085588, -4485020, -1616518, -4090956, -2371896, -314069, -2329483, -1136556, -1515050, -1649268, -221728, -2482491, 2707977, -3387119, --1540283, 298500, 1855426, 684510, 1488206, -570157, 9018894, -1265405, 789737, 6932614, --833761, -429497, -1981591, 7559680, 508417, 3614215, 2319282, 2136746, -3117073, 1464584, --4859219, -665720, 3833795, 631897, 2252710, 3433290, -6029597, -4377109, 1454920, -458488, -4497905, 2570538, -232465, -2662880, -1574642, -3260417, -505196, -595927, -484258, 663036, -1144609, -2881923, 4463545, -1240172, -747861, 1324461, -5791227, -1546188, 2419677, 647466, -5589363, -260919, -496606, 856846, 293132, 2098092, 3816079, 4715337, -403727, -795106, --38118, -3161096, -3780645, 1702418, 3095061, -2603824, -2360085, -1818382, 3957276, 2082522, --777389, 264141, -5114233, -1818382, 2294050, 1662152, 3347390, -5746666, 911070, 1434519, --1366337, 3074123, 11439645, 3419868, -2871186, 6155225, -3083787, 6402723, -2247342, -2589865, -2956548, 6011881, -358630, -2619930, 1367947, 1455994, -406411, -7980586, 1764158, 2662880, -503048, 5396627, 6767795, 3976066, 6668474, 4899484, 4013647, -835371, 4479651, 2498597, --3619047, 1592359, 2013803, -4213900, -5824513, -585189, 2153389, 388158, -2154463, -2460480, --2774549, -1025960, 3011846, 6497212, 5173825, 2297808, 3970697, -6165426, 368830, -1323924, -34897, -7113540, 2748779, -372052, -1757179, 60130, -2006824, -3328063, -2554969, 2974802, -679142, 2371896, -2640868, 5455682, 1408212, -5509906, 2563022, 1126892, 1802276, 3605625, -1185411, 6294812, -1630477, 1009317, -6591701, 1634772, 1065689, 383863, 639950, 877784, --2656437, -2072859, -1066226, 2462090, -4285304, 1462973, -8174397, 1775969, 1191317, -618475, -5332739, 657130, -922344, 807454, 2685428, -4526359, 394600, 1783485, 2789045, -6563247, --3774740, -2283849, 2224256, 1341640, -2450816, -6628209, 1388348, -6589017, -717796, 3060701, --1574106, 2411624, -1488206, 4980552, 6604586, 3978750, -3866544, 1007707, 4933307, 3574487, --3529926, 3067144, 513249, -5022965, 1596117, 7764764, 3172370, 2857764, 7953743, 1129040, --3428458, -5912023, -573378, -3126736, -4548907, -1578937, 4238596, -3850438, 1204202, -2088428, --2704219, 5801427, -993748, 1429150, 3911642, 6345278, -2859375, -4606353, 6389838, 5905043, -2942590, 1200443, -4434017, 1750736, 4708895, -3824132, -15714212, -5590437, -2506114, 8666707, --3334505, -1144609, -5129802, -4120484, -805843, -11096585, 6238977, 2250026, -379031, -3981435, -6159520, -1562831, 3112241, -2319819, 1960116, 4165045, -4970351, 738734, 5446019, 3313567, -2195265, 6078453, 5229123, -3026878, -4163434, -4951024, -60130, -6579353, 1673427, -8764955, --1685238, 6970195, 3566434, -1979443, -632971, -6479495, 3178276, -2564096, 6101538, -3093450, --6051072, -882616, -2413235, -4660040, 2104534, -736050, -3062849, -2837363, -10737418, 1964411, --3074123, -7590818, -1929514, 5518496, 2807835, -3621731, 3735011, 5046050, 4606353, 2238752, --5226975, -236760, -835371, 4618164, -3455838, -685047, 2587181, 2978023, -5433671, -6253473, --12175695, -1049046, -6029597, -13441100, -5570036, -2296734, -4160750, 4755066, 5900748, 5827734, --11477226, -8333847, 3121368, 13943074, 8027294, 121333, 1826972, 4060892, -5104569, 3400540, --4742181, 3445101, 4769025, 876173, 3800509, 1344862, -411243, 2156611, 1078037, -3593277, --4822175, 6587943, 2497524, -4628364, 4514011, -2480344, -602906, 11238856, -5439039, 6402186, -12338904, 5174362, -823560, 567473, -4599910, 5908265, -6050535, -3171833, -10094784, 1961726, -7624104, -119185, -7158100, -2450816, -10105521, -5026723, -1922535, -14206141, -7814156, -1343788, -1480690, -6181532, 3150896, -1584843, -4930623, 5420786, 15805480, 1556389, 8096550, 5564130, -4815732, -4858145, 2227478, -8323647, 1087164, 2723546, 2149094, -2858301, 376347, 20920248, -13687524, -7587060, 3000035, 6527277, -2543158, 3602941, -1057099, 6057515, 3455301, 1722282, -6037114, 2945274, 3113851, -2129230, -13940927, 6460705, -2170569, -3571802, 11345693, 6524592, -4075387, 4765266, 4036196, 2462090, -1942399, 1273458, 676994, -4013110, 3156801, 4413616, --7788387, 1134408, -4968204, 3421478, 4641249, -12934294, -1074, -15324443, 455803, 1418413, -1459215, 3609920, 10351408, -1712081, -5080947, -3066070, -2646774, -4417374, 3099893, 2631204, -1153199, -2190970, -1663763, 9315784, -3119757, -2558190, -5242545, 8163659, -1191317, 6735046, --3337727, 7210177, -7464653, -16655883, -4630512, 258772, 3328600, 4612795, -5285494, -4822175, -2260764, 589484, -2419140, -4996121, 10095858, -4515085, 9780714, -3651259, -6744710, -168041, -894427, -9296457, -7530152, -2224793, 2401961, -1286343, 12073690, 7459822, 151934, 11796665, -4039417, 3523484, -10198400, 9496173, -1943473, -2266669, -8638790, -3730716, 7307350, 7488276, --2309619, 4988068, -10361609, -1358283, 6620155, 5203890, -4006668, -7155416, -4263829, -4404489, --5781026, -4583804, 893890, -7539815, -951335, 10519449, -5267241, 1243930, -617402, -2384244, -3866008, -1649268, 6629282, 26307, 9442486, -2467996, -6300180, 3500935, -5016522, -4763656, --5009006, -13717052, 1404454, 5670431, 7994545, 5874979, 10581189, -1116155, -4248797, 6183143, --7707319, 1750736, 1153199, -1172526, 7009387, 6455336, -1493038, -8332237, 2030983, -4372814, --7152731, -7597797, 2285996, -11780558, -7352447, 1567663, -7179038, -17571784, 13259101, 1074, --1167694, 2015950, 794569, -11514270, 7991861, -12014097, 827318, 5945846, -1889249, 2367064, -1721745, -12940200, -4727149, -5586142, -1489280, 3045669, -4616553, -2435783, -795643, -446140, -958851, 5885179, 2716567, 12271258, -4582730, 16720308, -1398549, 794569, -10958072, -1235340, -7708393, -1222992, -16718160, 7011534, 7407745, -4536559, 3802120, -5784784, 11164767, 6685654, --573378, -298500, -7574712, -4297115, -8266202, 7884486, 7155953, 3636227, 591095, 3760244, --6717866, -16618839, -6473590, 6331856, 2349347, -12239046, 53687, 1846836, 1457068, -5709622, -4064113, 9258876, 4347581, 427349, 3348464, 6270653, -3750580, 8901857, -148176, -18527416, -9816148, -2275259, 3407520, -5287642, -3376381, 8199093, -9503689, 9178345, -5891085, -10421738, -4481799, -5502390, 22410066, 3630321, -8342974, -10830297, -2377801, -13496935, -6709276, -14562623, --1283658, 10096931, -7433515, 6301791, 9540196, -9052180, -418222, -10606959, 5592585, 2307471, --873489, 6529424, -7221988, -9521942, -8682276, 708670, 1303523, 8268886, -12247636, 8462159, -1078037, -17180406, -10087804, -13857175, -6324876, 5392869, -5318244, -4583804, -27203250, -495532, --6491306, -2391223, -17724794, -5910412, -2962991, 1322850, 13160317, 12645457, 9950365, 6119255, -12597139, -14500346, 10407243, 1446330, 4374424, 3616899, -11201812, 15800648, 9002788, 6016713, --7983808, -9882720, -7715909, 8644695, 364535, -1005559, 7307350, 13036299, 14505178, 5672578, -10198937, 7928510, 5022965, -2814814, 1244467, -4105452, 501974, -1546725, -8492224, 10827613, -17654464, 6771553, -4624606, 7639136, 7611756, -508417, 4785131, -8455717, -15751256, -10788421, --7088307, 4396436, -1775969, -8517457, 6361384, -3062849, -7289097, -298500, 13033615, 6291590, -9693741, 3143379, 7174206, 7610682, -1643362, 6958384, -2636036, -8362838, 3596498, -9648107, -3682398, 3597572, -13775571, -9206799, 5863704, 14284524, -7322383, 9928891, 14197551, -11708618, -648540, 12718472, 1561758, -4723927, -889595, -6569153, -11271605, 187368, -3265249, -5902896, -8121783, 603443, -12868259, 17160542, -6661495, 14157823, -15819975, -10267119, 8245264, -8717173, -5776194, -4632122, -1686312, 1163936, -12829604, 8497593, -6050535, -12095702, 17661980, 10380399, --14010183, 10094247, 7438884, 3254512, 14668924, -31301722, 1306744, 13980119, 3495567, 1960116, -12938589, 1307818, 6568616, -17824652, -3638911, 5786395, -933082, -8580808, 2419677, 8172249, -2371359, 4224637, 8613020, 8905615, 11826729, 10995116, -5430450, -3584150, 8757975, -5631239, -5667746, -10910291, -7790534, -14143327, -8307004, 8727910, 1190780, -2822331, 10407243, -13816373, --21226802, -30902826, 7889855, 11417634, 6549289, 7194070, -9491341, 5537824, -6488085, 12414603, -29436096, -4416837, -9143985, -13281649, -6997039, 12426951, -10905459, 7371775, 8679592, 2506114, --3554622, -8559870, -6289443, 5159330, -26021596, -19267224, -2484639, 4508642, -12589086, 2682207, -48217988, 26272852, 17768816, -5040681, -4240744, -1247151, -3454228, -5559835, -6790880, -9566503, --14688251, -2684, -506269, 3044058, 7222525, 11993159, 19743428, -3266323, -24424406, -10470057, -21959094, -4058744, 8548596, -3502546, 144955, 13538811, 5435281, 10094247, 6854768, -1203665, --182536, -968515, 7653632, 8430484, -3146064, -14854681, 18825378, 12394202, 9764608, 2632815, -5142150, -8311299, -13596256, 18347564, 11026792, 4073240, -8624294, -10799158, -13655849, -9476308, --2260227, -9638443, 4989679, -18758270, 2582886, 12125230, -8473970, 3587908, 795643, 835908, --20382304, 6053757, -8891119, 13610214, -32899450, 4318053, -8961986, -12377559, 2059437, -8110509, -5780489, 4788352, -22626962, -1400696, 12586939, 813359, -29348048, -14916958, 2062658, -25587804, -5800354, 18772228, -9067750, 22798760, 26514980, 3511673, 13209172, 16538308, 7281044, -15604153, -10201084, 12661027, -681289, 3311957, 8771934, 7962870, 18719614, 3361886, -7285339, 12149926, -4256313, -1694365, 237834, 8211441, -11001559, -4780299, -4664335, 6893960, 3463891, -15280420, -4567161, 13133473, 350577, 15795279, -14723685, -27619860, 2251100, 12724914, 18927920, 17763984, -9094593, 8567923, 6726993, -18652506, -5454609, -512175, 14294725, 22735410, -7634841, 5144297, --8114267, 5636608, 3741990, 14009110, 21361556, -7785165, -9026411, -1447404, 11883638, 15312095, -21203716, 966368, -22103512, -20765094, -2928094, 3281892, 772557, -9158481, 1203665, -24954296, --14977625, -14218489, -13561896, 8924942, 12704513, -27642410, 2850785, -5721970, 15404437, -8242042, --784905, 4462471, 11859478, -15394773, -25141128, -4552666, -9469866, 674310, -10949482, 6825240, -7436199, 715112, -13118441, 8741869, 1661079, 23289998, -2851858, 12861280, -9801652, 24143622, -7854422, 15201500, 11040750, 16610249, 25025700, -5460514, 10435160, -16324634, 18877992, 17663590, -882079, 6129455, 18656264, -10465762, -9265855, -1090385, 36348844, 6408628, -8135205, 18117246, -3964255, 14165876, 20875152, 6547678, 623307, 2875481, 5010080, 13766444, -2238215, 14790257, --7006166, 14592688, -4820027, 31292058, -1666447, 27284316, -20331302, -23575612, 38542500, -27572616, --12498892, 3541201, -5835250, -15781857, 20346870, 831076, -18097918, -7385197, -6090264, -29693794, -5254893, -24707874, -13632226, 2655901, -28371480, -19357418, -19260244, -23113904, 27395986, -2588255, -2392297, 5699422, -6079526, -35038880, -23264228, -26274462, -47917876, 1404454, 6922414, 19085224, -13729937, 5108864, 11862163, 5039071, 3492345, -17954574, -21721798, -15630997, 18855444, -4782983, --12335146, -8009041, 18386218, -23736136, -12654584, -24392730, -9880572, -4712116, -19934016, 4753455, --16481937, 15567109, 13738527, -6073621, 13487271, -15983184, -25553982, 7949985, 15628312, -17045652, --29584272, 18781356, -1721745, 12381854, 13812615, -46935940, -30427158, -4103305, -7122667, 23189602, --16336982, -23465016, -5527086, 4893579, 759672, -8430484, -10819023, 30542586, -19648938, -37345816, --42740292, 20929376, -9686762, -43407088, 11859478, 3286187, -7861401, -4075387, 2863670, -25913686, --12169790, 13683229, 19053548, 42781632, 5324686, 22796612, 9000641, 11431592, -11184632, -2237678, --9846749, -22163104, -28712930, -37116032, -15621333, -33437394, -15319075, -17280264, -8662412, 18773838, -2420751, 12854837, 19366544, 358630, 12307229, 4480725, -1571421, -322659, -5237713, -28639916, -7975755, -3583613, -35033512, -20185272, 6816650, -21010444, -10755672, 7304666, 20702280, 28210956, -6978785, -6442451, 853625, 18524730, 7043747, 3288334, -3892851, -57513908, -14881525, 11482058, -10767483, 4517232, -5924371, -20504710, 9317395, -18664854, -16942036, -5238787, -820876, -11657615, --34752728, 13619878, -8611946, 34632468, 9325448, 9291088, 9225053, 23314156, 56604984, -4525285, --4307852, -9814000, -21225192, 29459718, -2090039, 3503620, -32498406, -14009646, 42769820, -29367912, --5268851, -25762824, -67157184, -12178380, 23302346, 15165530, 5396090, 2651606, -1740536, 36397164, --39843336, -2470680, -10093710, -30414274, -21757230, -6007586, 9827959, 4458176, 11210938, 22517440, -18077518, -20307142, -16260209, 47241420, 42472932, -5899675, 6487011, -8123931, 14955076, -2886755, -30704184, 7854422, 17050484, 1586454, 3809099, -54334020, 22874996, -5063230, -28222766, -18007724, -4351876, -10942503, -28190554, 25445534, -3728032, -24096914, -3173981, -29528, 26364656, 25017648, -22544820, 4969814, 26132192, 23431730, -19284940, -25638270, -13312251, -7378217, 26728118, 30806190, -6522445, 8167417, 33819108, 15131170, -31024696, 17287244, 8638253, -14576582, 1690607, 50896972, -28792924, -18375480, -27845884, -43876312, 8343511, -7981123, -14577656, -17414482, 9413495, -10341744, --5541582, 29758218, -9511205, -1051193, -23281944, 2474438, 14245333, -31453656, -20601884, -18549426, --9773735, 12329777, -43568684, -23382338, -62718332, 11561515, -898722, -15138149, -7201050, -8476655, -13125420, 20810190, -22363358, 1621887, -7901129, -6696391, -39129836, 9416179, 29843580, 8783208, -22589380, 29326036, 25451440, -33272038, -10441065, -9370008, -15952045, 29765734, -29291140, -15916612, -1197759, 42861088, 9665824, -13532905, 42391864, -22477174, -21865678, 51480016, 48547088, 5984500, -12809740, -12225624, -44884556, -12457553, 46723876, -20536386, 42601780, -13099650, -64262912, -15097884, --29098940, 37459096, 2270427, 10918881, 33862060, -946503, 28398860, 12467216, 22647362, 2259690, --42067056, 25129316, 27910308, -33795488, 18442590, 453656, -12785581, -14040785, -49936512, -21181704, -17169132, 3893388, 45312980, -35787280, -20883204, 9390409, -5193153, 30070140, -40714680, 951335, -4082367, -33360622, 34261492, 19791210, 10466298, -15068893, 23529442, -26751740, 15447924, 13043816, -7349226, -848256, -15371151, 7609072, 31405874, -15209553, -5727876, 7335268, -24143622, 26188564, -1310502, 7825431, -33101850, 19383188, 4857608, 7484518, -78101296, 12142946, -21819508, 38103340, -30969936, 33666640, 17103096, -62514860, -10573136, 15076946, 2044941, 5597416, 45717780, -5405753, --26371100, -31278100, 2041720, -35057672, -31018254, -27220966, 14171781, -52203716, 37973416, 71612136, --18625126, -9939091, -56607132, -16937204, -49818400, 12492449, -21022254, -16729434, 17043504, -13977971, --16551730, 12861280, -22219476, -2854543, -25527674, 37637336, 2188823, -29903172, -6913824, -708133, --1350230, 7724499, -17532056, -14539538, 5811091, 6537477, 6118718, 2515240, 16355235, -18457622, --5036386, -40751724, 16207059, 2423435, -10492605, 27258010, 17164836, -12930536, 45221172, 8447664, --25851408, 19503446, 5170604, 12291660, 30409442, -3852586, -5461588, 3357591, 25353728, 12301323, -2146947, -3508452, 27015344, -3300682, -27885612, -6104759, 7065758, 22356916, -8714489, 39236136, -45935748, -28957744, 24749212, 49088792, -11856257, 75017512, 44282724, -19457812, -15672873, -28876138, --30750892, -18427020, 11524471, -5608154, -4388383, -668941, -3732864, -52153252, -19607062, -50984484, -12059194, 67464808, 16966732, -23203560, 2021319, -30672508, -4745939, 11765526, -13651554, -15915001, --19202262, -6255620, 6582575, -3286724, -6538551, 9331353, 4350802, 12372190, -12396886, -6554120, -8049306, -2151779, 1033477, -16399796, 11294153, -19332184, 9286256, 7721815, -4828617, 134755, -308164, -10715407, 1555852, 3514894, -9810779, 18134426, -9535901, 5295695, -289373, 1813013, -8215736, -7118372, -13390634, -2608119, 19285476, -13214541, 9281424, -25309168, -16212428, 6527814, --6091338, 1090922, -2069101, -14504105, 16767552, 15273441, 962073, -10053445, -850940, -5355288, -3257196, -7037304, -521302, -6571837, 6207839, -238371, 1481227, 23889682, -18442590, 903554, -3132105, 4028143, -4008278, 3568581, -8610336, 4117800, -7173669, -31237298, -48108464, 33758980, -150781264, 67173288, 68679752, 325881, -141077872, -100767984, -53613004, -109789568, 52883932, 66735200, -33494840, 143756320, 63494648, -5431523, 46614892, -91746408, -118776784, -66561256, -83453896, -17039746, -63085552, 66214436, 26592826, 110709224, 53745612, -6866579, 52058224, -47881368, -84322560, -47101832, --63642288, -97799624, 35474820, -61203, -36228588, 106965624, 63090384, 36785860, 107843944, 27092654, --56047176, 54349588, -79554608, -88912264, -19219442, -93557808, -96620120, 38710540, -16697222, 23999204, -119894552, 83562880, 85245976, 82080584, 9014063, -44677324, -53461068, -87240984, -116417240, -59766080, --33745560, -23053774, 43366820, 69708392, 63908576, 92433064, 82012400, -11800960, -15156403, -13768591, --85184232, -23875186, -41391136, -57782880, 14991583, 15187004, -727460, 0, 0, 0, -0, 0, 0, }, +-7253126, -2795487, -4082367, 81068, 1404454, 4320737, -2083059, 347892, -3197603, -2488397, +-3400540, 1675037, -3912178, 884763, -3293703, 6473053, -366146, 511101, -306016, -4567161, +2915209, 6880001, 111669, -1712081, 355409, -1312649, 2218351, -814433, -1169842, -1206886, +-8152922, -2587718, 659278, -1212791, 2113124, -2427730, 1825361, -496606, 2205466, -1386201, +2369211, 446140, 3339874, 1639067, -1064078, 1348620, 854162, -1751810, -3197066, -1368484, +-555125, 1919850, 805306, 178778, -592169, 3748970, 4085588, -4485020, -1616518, -4090956, +2371896, -314069, -2329483, -1136556, -1515050, -1649268, -221728, -2482491, 2707977, -3387119, +-1540283, 298500, 1855426, 684510, 1488206, -570157, 9018894, -1265405, 789737, 6932614, +-833761, -429497, -1981591, 7559680, 508417, 3614215, 2319282, 2136746, -3117073, 1464584, +-4859219, -665720, 3833795, 631897, 2252710, 3433290, -6029597, -4377109, 1454920, -458488, +4497905, 2570538, -232465, -2662880, -1574642, -3260417, -505196, -595927, -484258, 663036, +1144609, -2881923, 4463545, -1240172, -747861, 1324461, -5791227, -1546188, 2419677, 647466, +5589363, -260919, -496606, 856846, 293132, 2098092, 3816079, 4715337, -403727, -795106, +-38118, -3161096, -3780645, 1702418, 3095061, -2603824, -2360085, -1818382, 3957276, 2082522, +-777389, 264141, -5114233, -1818382, 2294050, 1662152, 3347390, -5746666, 911070, 1434519, +-1366337, 3074123, 11439645, 3419868, -2871186, 6155225, -3083787, 6402723, -2247342, -2589865, +2956548, 6011881, -358630, -2619930, 1367947, 1455994, -406411, -7980586, 1764158, 2662880, +503048, 5396627, 6767795, 3976066, 6668474, 4899484, 4013647, -835371, 4479651, 2498597, +-3619047, 1592359, 2013803, -4213900, -5824513, -585189, 2153389, 388158, -2154463, -2460480, +-2774549, -1025960, 3011846, 6497212, 5173825, 2297808, 3970697, -6165426, 368830, -1323924, +34897, -7113540, 2748779, -372052, -1757179, 60130, -2006824, -3328063, -2554969, 2974802, +679142, 2371896, -2640868, 5455682, 1408212, -5509906, 2563022, 1126892, 1802276, 3605625, +1185411, 6294812, -1630477, 1009317, -6591701, 1634772, 1065689, 383863, 639950, 877784, +-2656437, -2072859, -1066226, 2462090, -4285304, 1462973, -8174397, 1775969, 1191317, -618475, +5332739, 657130, -922344, 807454, 2685428, -4526359, 394600, 1783485, 2789045, -6563247, +-3774740, -2283849, 2224256, 1341640, -2450816, -6628209, 1388348, -6589017, -717796, 3060701, +-1574106, 2411624, -1488206, 4980552, 6604586, 3978750, -3866544, 1007707, 4933307, 3574487, +-3529926, 3067144, 513249, -5022965, 1596117, 7764764, 3172370, 2857764, 7953743, 1129040, +-3428458, -5912023, -573378, -3126736, -4548907, -1578937, 4238596, -3850438, 1204202, -2088428, +-2704219, 5801427, -993748, 1429150, 3911642, 6345278, -2859375, -4606353, 6389838, 5905043, +2942590, 1200443, -4434017, 1750736, 4708895, -3824132, -15714212, -5590437, -2506114, 8666707, +-3334505, -1144609, -5129802, -4120484, -805843, -11096585, 6238977, 2250026, -379031, -3981435, +6159520, -1562831, 3112241, -2319819, 1960116, 4165045, -4970351, 738734, 5446019, 3313567, +2195265, 6078453, 5229123, -3026878, -4163434, -4951024, -60130, -6579353, 1673427, -8764955, +-1685238, 6970195, 3566434, -1979443, -632971, -6479495, 3178276, -2564096, 6101538, -3093450, +-6051072, -882616, -2413235, -4660040, 2104534, -736050, -3062849, -2837363, -10737418, 1964411, +-3074123, -7590818, -1929514, 5518496, 2807835, -3621731, 3735011, 5046050, 4606353, 2238752, +-5226975, -236760, -835371, 4618164, -3455838, -685047, 2587181, 2978023, -5433671, -6253473, +-12175695, -1049046, -6029597, -13441100, -5570036, -2296734, -4160750, 4755066, 5900748, 5827734, +-11477226, -8333847, 3121368, 13943074, 8027294, 121333, 1826972, 4060892, -5104569, 3400540, +-4742181, 3445101, 4769025, 876173, 3800509, 1344862, -411243, 2156611, 1078037, -3593277, +-4822175, 6587943, 2497524, -4628364, 4514011, -2480344, -602906, 11238856, -5439039, 6402186, +12338904, 5174362, -823560, 567473, -4599910, 5908265, -6050535, -3171833, -10094784, 1961726, +7624104, -119185, -7158100, -2450816, -10105521, -5026723, -1922535, -14206141, -7814156, -1343788, +1480690, -6181532, 3150896, -1584843, -4930623, 5420786, 15805480, 1556389, 8096550, 5564130, +4815732, -4858145, 2227478, -8323647, 1087164, 2723546, 2149094, -2858301, 376347, 20920248, +13687524, -7587060, 3000035, 6527277, -2543158, 3602941, -1057099, 6057515, 3455301, 1722282, +6037114, 2945274, 3113851, -2129230, -13940927, 6460705, -2170569, -3571802, 11345693, 6524592, +4075387, 4765266, 4036196, 2462090, -1942399, 1273458, 676994, -4013110, 3156801, 4413616, +-7788387, 1134408, -4968204, 3421478, 4641249, -12934294, -1074, -15324443, 455803, 1418413, +1459215, 3609920, 10351408, -1712081, -5080947, -3066070, -2646774, -4417374, 3099893, 2631204, +1153199, -2190970, -1663763, 9315784, -3119757, -2558190, -5242545, 8163659, -1191317, 6735046, +-3337727, 7210177, -7464653, -16655883, -4630512, 258772, 3328600, 4612795, -5285494, -4822175, +2260764, 589484, -2419140, -4996121, 10095858, -4515085, 9780714, -3651259, -6744710, -168041, +894427, -9296457, -7530152, -2224793, 2401961, -1286343, 12073690, 7459822, 151934, 11796665, +4039417, 3523484, -10198400, 9496173, -1943473, -2266669, -8638790, -3730716, 7307350, 7488276, +-2309619, 4988068, -10361609, -1358283, 6620155, 5203890, -4006668, -7155416, -4263829, -4404489, +-5781026, -4583804, 893890, -7539815, -951335, 10519449, -5267241, 1243930, -617402, -2384244, +3866008, -1649268, 6629282, 26307, 9442486, -2467996, -6300180, 3500935, -5016522, -4763656, +-5009006, -13717052, 1404454, 5670431, 7994545, 5874979, 10581189, -1116155, -4248797, 6183143, +-7707319, 1750736, 1153199, -1172526, 7009387, 6455336, -1493038, -8332237, 2030983, -4372814, +-7152731, -7597797, 2285996, -11780558, -7352447, 1567663, -7179038, -17571784, 13259101, 1074, +-1167694, 2015950, 794569, -11514270, 7991861, -12014097, 827318, 5945846, -1889249, 2367064, +1721745, -12940200, -4727149, -5586142, -1489280, 3045669, -4616553, -2435783, -795643, -446140, +958851, 5885179, 2716567, 12271258, -4582730, 16720308, -1398549, 794569, -10958072, -1235340, +7708393, -1222992, -16718160, 7011534, 7407745, -4536559, 3802120, -5784784, 11164767, 6685654, +-573378, -298500, -7574712, -4297115, -8266202, 7884486, 7155953, 3636227, 591095, 3760244, +-6717866, -16618839, -6473590, 6331856, 2349347, -12239046, 53687, 1846836, 1457068, -5709622, +4064113, 9258876, 4347581, 427349, 3348464, 6270653, -3750580, 8901857, -148176, -18527416, +9816148, -2275259, 3407520, -5287642, -3376381, 8199093, -9503689, 9178345, -5891085, -10421738, +4481799, -5502390, 22410066, 3630321, -8342974, -10830297, -2377801, -13496935, -6709276, -14562623, +-1283658, 10096931, -7433515, 6301791, 9540196, -9052180, -418222, -10606959, 5592585, 2307471, +-873489, 6529424, -7221988, -9521942, -8682276, 708670, 1303523, 8268886, -12247636, 8462159, +1078037, -17180406, -10087804, -13857175, -6324876, 5392869, -5318244, -4583804, -27203250, -495532, +-6491306, -2391223, -17724794, -5910412, -2962991, 1322850, 13160317, 12645457, 9950365, 6119255, +12597139, -14500346, 10407243, 1446330, 4374424, 3616899, -11201812, 15800648, 9002788, 6016713, +-7983808, -9882720, -7715909, 8644695, 364535, -1005559, 7307350, 13036299, 14505178, 5672578, +10198937, 7928510, 5022965, -2814814, 1244467, -4105452, 501974, -1546725, -8492224, 10827613, +17654464, 6771553, -4624606, 7639136, 7611756, -508417, 4785131, -8455717, -15751256, -10788421, +-7088307, 4396436, -1775969, -8517457, 6361384, -3062849, -7289097, -298500, 13033615, 6291590, +9693741, 3143379, 7174206, 7610682, -1643362, 6958384, -2636036, -8362838, 3596498, -9648107, +3682398, 3597572, -13775571, -9206799, 5863704, 14284524, -7322383, 9928891, 14197551, -11708618, +648540, 12718472, 1561758, -4723927, -889595, -6569153, -11271605, 187368, -3265249, -5902896, +8121783, 603443, -12868259, 17160542, -6661495, 14157823, -15819975, -10267119, 8245264, -8717173, +5776194, -4632122, -1686312, 1163936, -12829604, 8497593, -6050535, -12095702, 17661980, 10380399, +-14010183, 10094247, 7438884, 3254512, 14668924, -31301722, 1306744, 13980119, 3495567, 1960116, +12938589, 1307818, 6568616, -17824652, -3638911, 5786395, -933082, -8580808, 2419677, 8172249, +2371359, 4224637, 8613020, 8905615, 11826729, 10995116, -5430450, -3584150, 8757975, -5631239, +5667746, -10910291, -7790534, -14143327, -8307004, 8727910, 1190780, -2822331, 10407243, -13816373, +-21226802, -30902826, 7889855, 11417634, 6549289, 7194070, -9491341, 5537824, -6488085, 12414603, +29436096, -4416837, -9143985, -13281649, -6997039, 12426951, -10905459, 7371775, 8679592, 2506114, +-3554622, -8559870, -6289443, 5159330, -26021596, -19267224, -2484639, 4508642, -12589086, 2682207, +48217988, 26272852, 17768816, -5040681, -4240744, -1247151, -3454228, -5559835, -6790880, -9566503, +-14688251, -2684, -506269, 3044058, 7222525, 11993159, 19743428, -3266323, -24424406, -10470057, +21959094, -4058744, 8548596, -3502546, 144955, 13538811, 5435281, 10094247, 6854768, -1203665, +-182536, -968515, 7653632, 8430484, -3146064, -14854681, 18825378, 12394202, 9764608, 2632815, +5142150, -8311299, -13596256, 18347564, 11026792, 4073240, -8624294, -10799158, -13655849, -9476308, +-2260227, -9638443, 4989679, -18758270, 2582886, 12125230, -8473970, 3587908, 795643, 835908, +-20382304, 6053757, -8891119, 13610214, -32899450, 4318053, -8961986, -12377559, 2059437, -8110509, +5780489, 4788352, -22626962, -1400696, 12586939, 813359, -29348048, -14916958, 2062658, -25587804, +5800354, 18772228, -9067750, 22798760, 26514980, 3511673, 13209172, 16538308, 7281044, -15604153, +10201084, 12661027, -681289, 3311957, 8771934, 7962870, 18719614, 3361886, -7285339, 12149926, +4256313, -1694365, 237834, 8211441, -11001559, -4780299, -4664335, 6893960, 3463891, -15280420, +4567161, 13133473, 350577, 15795279, -14723685, -27619860, 2251100, 12724914, 18927920, 17763984, +9094593, 8567923, 6726993, -18652506, -5454609, -512175, 14294725, 22735410, -7634841, 5144297, +-8114267, 5636608, 3741990, 14009110, 21361556, -7785165, -9026411, -1447404, 11883638, 15312095, +21203716, 966368, -22103512, -20765094, -2928094, 3281892, 772557, -9158481, 1203665, -24954296, +-14977625, -14218489, -13561896, 8924942, 12704513, -27642410, 2850785, -5721970, 15404437, -8242042, +-784905, 4462471, 11859478, -15394773, -25141128, -4552666, -9469866, 674310, -10949482, 6825240, +7436199, 715112, -13118441, 8741869, 1661079, 23289998, -2851858, 12861280, -9801652, 24143622, +7854422, 15201500, 11040750, 16610249, 25025700, -5460514, 10435160, -16324634, 18877992, 17663590, +882079, 6129455, 18656264, -10465762, -9265855, -1090385, 36348844, 6408628, -8135205, 18117246, +3964255, 14165876, 20875152, 6547678, 623307, 2875481, 5010080, 13766444, -2238215, 14790257, +-7006166, 14592688, -4820027, 31292058, -1666447, 27284316, -20331302, -23575612, 38542500, -27572616, +-12498892, 3541201, -5835250, -15781857, 20346870, 831076, -18097918, -7385197, -6090264, -29693794, +5254893, -24707874, -13632226, 2655901, -28371480, -19357418, -19260244, -23113904, 27395986, -2588255, +2392297, 5699422, -6079526, -35038880, -23264228, -26274462, -47917876, 1404454, 6922414, 19085224, +13729937, 5108864, 11862163, 5039071, 3492345, -17954574, -21721798, -15630997, 18855444, -4782983, +-12335146, -8009041, 18386218, -23736136, -12654584, -24392730, -9880572, -4712116, -19934016, 4753455, +-16481937, 15567109, 13738527, -6073621, 13487271, -15983184, -25553982, 7949985, 15628312, -17045652, +-29584272, 18781356, -1721745, 12381854, 13812615, -46935940, -30427158, -4103305, -7122667, 23189602, +-16336982, -23465016, -5527086, 4893579, 759672, -8430484, -10819023, 30542586, -19648938, -37345816, +-42740292, 20929376, -9686762, -43407088, 11859478, 3286187, -7861401, -4075387, 2863670, -25913686, +-12169790, 13683229, 19053548, 42781632, 5324686, 22796612, 9000641, 11431592, -11184632, -2237678, +-9846749, -22163104, -28712930, -37116032, -15621333, -33437394, -15319075, -17280264, -8662412, 18773838, +2420751, 12854837, 19366544, 358630, 12307229, 4480725, -1571421, -322659, -5237713, -28639916, +7975755, -3583613, -35033512, -20185272, 6816650, -21010444, -10755672, 7304666, 20702280, 28210956, +6978785, -6442451, 853625, 18524730, 7043747, 3288334, -3892851, -57513908, -14881525, 11482058, +10767483, 4517232, -5924371, -20504710, 9317395, -18664854, -16942036, -5238787, -820876, -11657615, +-34752728, 13619878, -8611946, 34632468, 9325448, 9291088, 9225053, 23314156, 56604984, -4525285, +-4307852, -9814000, -21225192, 29459718, -2090039, 3503620, -32498406, -14009646, 42769820, -29367912, +-5268851, -25762824, -67157184, -12178380, 23302346, 15165530, 5396090, 2651606, -1740536, 36397164, +-39843336, -2470680, -10093710, -30414274, -21757230, -6007586, 9827959, 4458176, 11210938, 22517440, +18077518, -20307142, -16260209, 47241420, 42472932, -5899675, 6487011, -8123931, 14955076, -2886755, +30704184, 7854422, 17050484, 1586454, 3809099, -54334020, 22874996, -5063230, -28222766, -18007724, +4351876, -10942503, -28190554, 25445534, -3728032, -24096914, -3173981, -29528, 26364656, 25017648, +22544820, 4969814, 26132192, 23431730, -19284940, -25638270, -13312251, -7378217, 26728118, 30806190, +6522445, 8167417, 33819108, 15131170, -31024696, 17287244, 8638253, -14576582, 1690607, 50896972, +28792924, -18375480, -27845884, -43876312, 8343511, -7981123, -14577656, -17414482, 9413495, -10341744, +-5541582, 29758218, -9511205, -1051193, -23281944, 2474438, 14245333, -31453656, -20601884, -18549426, +-9773735, 12329777, -43568684, -23382338, -62718332, 11561515, -898722, -15138149, -7201050, -8476655, +13125420, 20810190, -22363358, 1621887, -7901129, -6696391, -39129836, 9416179, 29843580, 8783208, +22589380, 29326036, 25451440, -33272038, -10441065, -9370008, -15952045, 29765734, -29291140, -15916612, +1197759, 42861088, 9665824, -13532905, 42391864, -22477174, -21865678, 51480016, 48547088, 5984500, +12809740, -12225624, -44884556, -12457553, 46723876, -20536386, 42601780, -13099650, -64262912, -15097884, +-29098940, 37459096, 2270427, 10918881, 33862060, -946503, 28398860, 12467216, 22647362, 2259690, +-42067056, 25129316, 27910308, -33795488, 18442590, 453656, -12785581, -14040785, -49936512, -21181704, +17169132, 3893388, 45312980, -35787280, -20883204, 9390409, -5193153, 30070140, -40714680, 951335, +4082367, -33360622, 34261492, 19791210, 10466298, -15068893, 23529442, -26751740, 15447924, 13043816, +7349226, -848256, -15371151, 7609072, 31405874, -15209553, -5727876, 7335268, -24143622, 26188564, +1310502, 7825431, -33101850, 19383188, 4857608, 7484518, -78101296, 12142946, -21819508, 38103340, +30969936, 33666640, 17103096, -62514860, -10573136, 15076946, 2044941, 5597416, 45717780, -5405753, +-26371100, -31278100, 2041720, -35057672, -31018254, -27220966, 14171781, -52203716, 37973416, 71612136, +-18625126, -9939091, -56607132, -16937204, -49818400, 12492449, -21022254, -16729434, 17043504, -13977971, +-16551730, 12861280, -22219476, -2854543, -25527674, 37637336, 2188823, -29903172, -6913824, -708133, +-1350230, 7724499, -17532056, -14539538, 5811091, 6537477, 6118718, 2515240, 16355235, -18457622, +-5036386, -40751724, 16207059, 2423435, -10492605, 27258010, 17164836, -12930536, 45221172, 8447664, +-25851408, 19503446, 5170604, 12291660, 30409442, -3852586, -5461588, 3357591, 25353728, 12301323, +2146947, -3508452, 27015344, -3300682, -27885612, -6104759, 7065758, 22356916, -8714489, 39236136, +45935748, -28957744, 24749212, 49088792, -11856257, 75017512, 44282724, -19457812, -15672873, -28876138, +-30750892, -18427020, 11524471, -5608154, -4388383, -668941, -3732864, -52153252, -19607062, -50984484, +12059194, 67464808, 16966732, -23203560, 2021319, -30672508, -4745939, 11765526, -13651554, -15915001, +-19202262, -6255620, 6582575, -3286724, -6538551, 9331353, 4350802, 12372190, -12396886, -6554120, +8049306, -2151779, 1033477, -16399796, 11294153, -19332184, 9286256, 7721815, -4828617, 134755, +308164, -10715407, 1555852, 3514894, -9810779, 18134426, -9535901, 5295695, -289373, 1813013, +8215736, -7118372, -13390634, -2608119, 19285476, -13214541, 9281424, -25309168, -16212428, 6527814, +-6091338, 1090922, -2069101, -14504105, 16767552, 15273441, 962073, -10053445, -850940, -5355288, +3257196, -7037304, -521302, -6571837, 6207839, -238371, 1481227, 23889682, -18442590, 903554, +3132105, 4028143, -4008278, 3568581, -8610336, 4117800, -7173669, -31237298, -48108464, 33758980, +150781264, 67173288, 68679752, 325881, -141077872, -100767984, -53613004, -109789568, 52883932, 66735200, +33494840, 143756320, 63494648, -5431523, 46614892, -91746408, -118776784, -66561256, -83453896, -17039746, +63085552, 66214436, 26592826, 110709224, 53745612, -6866579, 52058224, -47881368, -84322560, -47101832, +-63642288, -97799624, 35474820, -61203, -36228588, 106965624, 63090384, 36785860, 107843944, 27092654, +-56047176, 54349588, -79554608, -88912264, -19219442, -93557808, -96620120, 38710540, -16697222, 23999204, +119894552, 83562880, 85245976, 82080584, 9014063, -44677324, -53461068, -87240984, -116417240, -59766080, +-33745560, -23053774, 43366820, 69708392, 63908576, 92433064, 82012400, -11800960, -15156403, -13768591, +-85184232, -23875186, -41391136, -57782880, 14991583, 15187004, -727460, 0, 0, 0, +0, 0, 0, }, }, { { -3161633, --7335268, -2953327, -4199405, -2286533, 5206574, 2805151, 404264, 4345970, 2943126, -3470334, --4744328, -2906082, -2251637, 567473, 1776506, -4748623, -664109, -1881733, -74625, -561030, --1050120, -2517925, 5964636, 3493419, -426812, -4907537, -1965484, 1066226, 2006824, -151934, --1964411, 882616, 1709934, 592169, 1597728, -1355599, -231391, -3757560, -4873178, -1030792, --461172, 2405719, 2901251, 2079838, 576599, 698469, 1660542, 2501282, 708133, 3333432, -1329829, -2103997, -2516851, -22549, 2368675, 2256469, 957778, 520228, 3595425, 2430952, --4287988, -3681324, -2237678, -2025614, -1838246, 2463164, -1668595, 1176284, -4060892, 2962454, --2884071, -2058363, 2066416, -1300301, -1811403, 4696547, 2877628, -4475893, -886374, -1729798, --31675, 6410776, 481036, -2916283, 3547106, 576599, 455803, 1021665, 825707, -71404, -5014375, 2637110, -3223910, -1417339, -281857, -1306744, 1476932, 1955284, 1506997, -1569811, --2026151, 667867, -4181688, -2098629, 3309809, 125091, 2683818, 1162326, -1991254, 1415192, -124017, -2014340, 4607963, -3195993, -1322850, 392990, 1649268, -2253784, -445066, -3161633, --5768678, 5284421, -1000727, -3273839, 425202, 4822712, 109522, 1717987, -2401424, -1713692, --924492, 1289564, -1869385, 3758097, 758062, 3344706, -5159867, 1916629, -1239098, 536871, -2390686, -1293322, -430570, -4332012, 202937, 1628330, 678605, -1655710, 48855, 1180042, --699543, -2048699, 13666586, 4842576, -1209033, 3849365, 72478, 6918119, 4154844, -837519, -3376918, 6223408, 7867307, -4597763, -4735202, 2079838, -1983201, -1424855, 5589363, 4734665, -4273493, 3257733, 467078, -60130, -2119566, 2300492, 1395328, 7398618, 608275, -34360, --3347390, 1640141, 2000381, -287763, -1124208, -1009854, 1839320, -157840, -1308354, -2531346, -2688650, -812286, -1095754, 4158065, 5559299, -1326608, -842887, 3444564, 2803540, 5376226, -3086471, 1594507, 384936, 4612795, 2360622, -5958194, -153545, 2063732, -3696893, 284542, -408559, -4168803, 2051921, -1904281, 3097745, -469762, -756451, 2024540, 366683, -2729989, --483721, 1998770, -825707, -374199, -1133871, 768799, 3197066, 1176284, -3799436, 4766340, --370441, -9005473, -4190278, -1750199, -1949378, -4904853, -4503273, -2831457, 4875862, -5367099, --2508261, -2552284, 975494, 8132521, -1229971, -653372, 1981054, 4650913, -7134478, -1169842, -1440425, -3153043, 2499671, 3973919, -4410395, -280247, 545998, -2563559, -6488622, 1115618, --2748242, 867047, -2535641, 3690451, -4496294, -4177393, -10297721, -2776160, 3487514, -583042, --3983045, -1950989, -546535, -4138201, 151398, -707059, 2772402, 2231236, -1132798, 117038, --1127966, -4368519, 5233955, 915365, 3499325, -1331440, -95026, 924492, 1435056, 4110821, --1457068, -1005022, 1065152, -124017, 4325032, 2400350, -4089346, -1543504, -1199907, -6149857, --959925, -557809, 3345780, -2309619, -19718732, -6285685, -1656784, -1679332, -1557463, 7571491, --6950331, 3324842, -1535988, 1487132, -1899449, -1699733, -5558762, 874026, -1942936, 375273, --8112120, 115427, -702227, -1523103, 13959, 1508070, 1404454, -818728, -402653, -3339874, -1189706, -2683281, 1922535, -27380, 1674500, 5131412, -1158031, -5916318, -2325725, -6920266, -1162862, 1241246, -412317, 1197759, -2190970, 2321967, 1421634, -3048890, 505196, -8288750, --1521492, -5531381, 3300146, 5525476, -4569845, -340376, 1855963, 889595, -7633768, 1377611, -4376572, -3740380, -1497333, -8967892, 3395709, -1220845, 4077535, 6800544, 4171487, -5267241, -1505923, 1411971, 672162, -5822902, 1931662, -2354179, 4372814, -1366873, 171262, 2172180, -1802276, -11871290, 964220, 2579128, -4780299, -158914, 11596412, 9694278, 4663261, -956167, --2567854, 6346888, 3346317, 2292439, 1862405, -4427575, 1246614, 847719, 5232881, -4997195, --2865280, -644245, 298500, -717796, -6622303, -3825205, -4788352, -4777614, 2433636, 3848828, -1794760, 1923609, -325344, 1890323, -1225676, -278636, -59593, -1483374, -999654, 3117073, -1648731, -3818226, -5189931, -34360, -5217312, 3234647, -1944547, -7567733, 437013, 4478577, -5204964, 4406100, -344134, 4195646, -6288906, -1384590, -3167539, 58519, -257698, 3026341, --2665027, -4726612, 5596880, -5252745, -3583613, 4469451, 8276402, 2749853, 794569, -8335995, -8520141, 1868311, 5344013, 11244761, -4107063, 2183454, -1401770, -2419140, 1991254, 18580028, -13009993, -4619774, -6859063, 10324028, 6650220, 10858751, 15843597, -7998840, 5446556, 2680597, -4546223, 2095944, 2696703, 6597070, 1553168, 6731288, 130997, -4286378, 1706713, -1384053, -2160369, -802622, 12230456, 2075543, 2597918, 1657857, 357019, 4298726, 1695438, 226023, --943282, 3059091, -2546916, 5867999, -4774393, 7066832, -3540127, 4250944, 2059974, 2573222, -1884954, 10378788, 7767985, 434329, -2473901, -5733245, 5947993, -6978248, 1480690, -3101503, -2777770, 6447283, 505196, -11035382, -9177271, 818191, -5840619, -6095633, -3790846, -7017440, -2107755, 11861089, 5628018, -4528506, -132070, 1260036, -3580929, -3655017, -1068373, 5752572, -5999533, -7070590, 2659122, 7543573, 702764, 2435783, 7866233, 1857573, 11526618, -732829, --426276, -3609383, -3445638, 4284767, 8670465, -2282775, 2105608, 973347, 9430138, 4349192, --4762582, -3819300, 390842, 2385318, 8567923, 8992588, 12913893, 2756295, 3437585, -1931662, -5146982, 6474127, -2566780, -2626909, 4530117, -3226594, -5216238, 5135171, 1255741, -5415954, --7308961, 11291469, 5303211, 65498, 6799470, 1795296, -4989679, 10770704, -2524904, 774705, --341450, 3148748, -3831648, 3158949, -3818226, 3098282, -3528853, 3663070, -2866891, 4815732, --3585761, -3136400, 9664750, -11494943, 766115, 1986959, -4002373, 1380832, -13342853, -6053757, -6711424, -4777078, 4297652, -796716, 3108483, 1848447, 2867428, 2132451, -5353677, 4048007, --2427194, 354872, -9480603, -8393440, 85899, 3463354, 6843494, -7961796, 2367601, -7170448, -5925981, 4322885, -9571335, -2141578, 1142998, -11487427, -6356015, 6767258, -799938, -637803, -1726040, -864899, -11796665, 10711648, 780610, -7853348, -3670587, 1283658, -927176, -7563438, --2153926, -4422206, 1285269, -547071, -2309082, 2190433, -10261751, -4767414, 2693481, 13276818, --2231773, -8119636, -5589900, -4619774, 9167608, -9989557, -1970853, -909459, -10472741, -13253195, -3149822, -9274982, -1505386, 1073742, 6764037, 3543885, 440771, 1171989, 8036421, -3878892, --2746632, 11766600, -8343511, 5908265, -3069291, -3503083, -1586990, -2003065, 12524662, -329102, -4498442, -14101451, -10365367, -644782, -2842195, 13582297, -811749, 8082592, 1983201, -15834471, -1401770, -1444720, 10787347, 1393717, -11700565, 13944148, 4323422, -7971460, -17900350, -7264937, -17449916, 1021129, -2343979, -2785823, 1699196, 740345, 5310727, 3037079, 5701032, -1086090, -10266582, -5172215, -12317429, 705985, 471910, -2713883, -536334, 4783520, -3227131, -1656784, --1152125, 9992778, 7500624, 4158065, -804770, -13065291, -338766, -442919, -636729, -1948841, --297427, -5548024, -10935524, -1412507, 7380365, 7565048, -2821257, 8120710, -2610803, 3705483, -8477729, 8557185, -18221398, 6587406, 6418829, 3109020, -4546223, -15460809, 9490267, 6145025, -2912525, -5174362, -3362960, -5881421, 3330747, -6529424, -1597728, 788127, 6145025, -3266860, -2872796, 2691334, -12185896, -469225, -8614631, 14236206, 1522029, 9586904, 12512313, 12082817, -9881646, 11829951, -15036681, -10452877, -4981625, -5400385, -7048578, -6062883, -12033961, -4616553, -1119376, 6910066, 269509, -7512972, -65498, 6884833, 612033, -6567005, -2617783, 16231218, -1851131, 5789079, 2142652, 6402723, 1608465, 1724966, -10096394, 5207111, 555661, 1834488, --10622528, 3175592, -16414291, -573378, -5115843, 3524558, -1414655, -12684112, -212064, -12640089, -2265595, -10618770, 9168681, -5812702, 14368276, -195421, -279173, 6577206, 1511292, -2945274, --2187749, 2243584, -5018133, 2692408, 8706436, 3820374, -6788733, -4174171, 18734110, 718333, -14829448, -14784888, -3342558, -2240362, 10532334, -13004087, 1123671, 5126581, -12961674, 7805030, --8696235, 1612223, -4848481, -15177878, 2091649, 15122043, 10950556, 12361990, -4336843, -3037079, -2766496, -2041183, 14821395, 5125507, 6870337, 12789876, -1289564, 4782446, -9055402, 12684649, -5935108, -3245922, -8232379, -7324530, 8060580, -14851997, 5267778, 8352101, -6680822, -8401493, --5248450, 7715372, 2385854, -3226057, -6008659, -165893, -9726490, -13975824, 1818382, -13466870, --20251308, -2851322, 20401, 19370302, -9315784, -7239704, 8014409, 14056891, 13764833, 7188165, --1771674, 2735357, -7223062, 410169, -7568269, 15527381, 13384192, 8465381, -1721745, -17637284, --1211718, -15301895, 14558865, 11047730, 6369974, -13123273, 8483097, 4108136, 5420786, -3846143, --11421392, -9156870, -9463960, 548145, -12732431, -23264764, 2681133, 10616085, 6621766, 6963216, -13364328, 26006026, 12822088, 8518531, 9630927, -17493402, -1719598, -6934225, 22160420, -22444426, --19582366, 5038534, 14791330, -1217623, 17892834, 14576582, 191126, 5114233, -9250286, -8150774, -17078400, -7156490, 12037720, 3139621, -6221260, -4524211, -2215666, -4319664, -6513318, 5517423, -7681012, 4859756, 1519882, -9104257, -9766756, 13239237, -12700218, 10107669, 2029372, -17585744, -9570261, 15463493, 736050, -5012764, -964220, 697932, 2028835, 10410464, 544387, -8826158, --2299418, 8829379, -15874199, 3622805, -1647657, 13409962, 15879031, 9356049, 12748537, 14715095, -12188580, 3641059, -8373576, -11272679, 6849936, 7212324, 1090922, 6333466, 10453950, 23067732, --11004780, 14794552, -6377490, -5056787, 18456012, 2838437, -17373680, -3697967, 10934450, -13339632, -943819, -8566312, -13584445, 20077362, 18129594, 14223858, 7534447, 3371013, 6364605, 14639396, -8930848, 15028091, -5120675, 12523588, -9140227, 15266461, 21714280, 12797929, 11187853, 4954245, -11550241, 10560251, -2573759, 21420612, 5939940, -13547937, 6961605, -13704704, -8423505, -3106335, --19960324, -13422, -3637301, -5980205, -9269613, -5594195, -2065879, -994822, -1190243, 558883, -1748052, -12225088, -6943352, 2140504, -5337034, 4624606, 21384106, -10592463, 185220, -2231773, -1811403, -10033044, 6359773, -4947803, 16950088, 3120831, 10646687, 14557792, 3798899, -1159104, --8390755, -21819508, 4304631, 16088411, 13268765, -3002182, -12770012, 12416750, 3154117, 7919383, --16343424, -11881490, -9074729, 9100499, -30776662, -19549080, -9411884, 22051436, 15925739, -11758010, -13655312, 12496744, 10518375, 10471667, -10300942, 1214402, 5965173, -10066330, -30902290, -5461051, --8536248, -18767934, 1779727, -6263673, -4769025, 6015102, 3553549, -3994320, 1035087, 14731201, -15651398, -28271086, 6948184, 1702418, 13383118, 4748623, 936840, -17492864, 5664525, -4283156, --4661114, -11936788, -8782671, 23125714, -10038949, -126702, 3088618, -5752572, 25671020, 12286291, --10806138, -6516539, -19284404, -2566780, 19436874, 5830955, 6311455, -5929203, 12203076, -2454037, --4251481, 10882910, -5478768, 17857400, -3222299, 13335337, -25720412, -8898635, 16534013, 3883187, --1060320, 4350265, -27930710, -14081050, 6595996, -12079596, 7317551, 589484, 7589744, 16123307, -6878927, -14683956, -37129456, -4573604, -3336116, -5482526, 7182259, -16660178, 31416076, -6828998, -2622615, 31893354, -37829000, -5409512, -6375342, -5077188, -43516072, 1143535, -5662915, -10022843, -16457778, -16750909, 3626563, 1556389, 8509941, -2798708, -15055471, 9768366, -9451612, 21867826, --2736431, -27813134, -671626, -2324114, -12040941, -28037546, 13225278, 12076911, -20973936, 16703665, --18837190, -17152488, -8329552, 246424, 2934000, 1469953, 14184666, -3987877, -10916733, -30561914, -7271380, -40785008, -19451906, -15089831, -30010010, -20240570, -7624104, -3588982, -13278428, 20768852, -24613920, 3428458, -5388037, 23785528, 13154948, -4641786, -3995393, 16642998, 15453829, -7948374, -26433376, -21963926, -7907572, 25246354, 15867757, 36624260, -14024679, -12659416, 8124468, -1542430, --14170171, -7099044, 3636764, 29962228, 17075180, -2691871, 40534828, -4560182, 16713328, -18973554, -23739894, 22409528, -1877438, -17683990, 2059437, 6663642, -9779104, 10794327, -14334453, 25770, --4223564, -4486630, -16264504, -11777337, -7219840, -656593, -5020280, -12609487, 19675246, 13670881, -3984656, -4935991, 3729105, 19086298, 9226127, 14199162, 9108015, -9584220, -15181636, 32410360, --3566434, -16691317, -6600291, -6728603, -3460670, 23788214, 1735704, -16876538, -5965173, -43149924, --9980967, -4177393, 28092844, 19815906, -52536040, -21914534, -11918534, 977642, 3899830, -20026896, -17068736, 9890773, 15156940, 28458454, -33530272, 36100812, 26454314, -9327058, -21649856, 3389266, --3819300, 10773389, 33036888, 27666032, 4153770, 10132902, -21547850, -35031364, 50321448, 24568286, -2592013, 2791192, -10939819, -29943438, 10615549, -2833605, 25512106, 5071283, 9630390, 27065274, -15555298, -949725, -2708514, 4005057, -16634945, -14583025, -17709224, -10757819, 16825534, -5335423, -1265405, 19933480, -3354370, 8233453, -28631326, -26838714, -17369384, 14007499, 6311992, -1987496, -7085086, -10256919, -25705916, 31600758, -30863634, 13124883, 15045807, 10369125, 5473399, 18478024, --12492986, -33245194, 23848342, 65190624, -11400454, 30668750, -38415260, -22633404, 24438364, 12251931, --35529580, -12052215, -2465848, 29275034, -7120519, -5520107, -48229260, -33741264, -10359998, -38345468, -31141734, 29596082, 51863340, -47317656, 20812338, 3183645, -22970558, -3358665, 1447941, -50529216, -9861245, -9354439, -45156212, -24776592, -1451699, -6233608, -15486578, 5945309, 13859859, 2013266, --16336445, -276489, -15680926, 41557028, -13133473, 1453846, 30586610, -1239635, -32440962, -21701932, --22337588, -9167071, -12134893, 34681324, 3026341, 6123013, 16527571, -8896488, -10054518, -5280126, --10237055, -20398410, -5405753, 39633420, 12144557, 9743670, -26545046, 10022306, 1545651, -18156438, --2657511, -8920647, 42039140, -33282776, -29522532, -9903121, 4823249, -9718974, 818728, 11753178, --22614614, -5711770, 35555348, -28836410, 4632122, -7127498, -18111340, -30698816, -23986856, 1169305, --43329776, -51895552, 11858942, 10480257, 7887171, -46581604, 35353488, 43069396, -15156940, -13159243, -2355790, -2623151, -10067940, -25223806, 17350594, 63840392, 10054518, 11325829, -14048301, -37539624, -10532870, 14566918, -55275692, 30331060, 1523103, -15837155, 5554467, 20230370, -28412282, 17715130, --26344792, 7219303, -1245541, -13365938, -7136625, -3558917, -19261318, 14139569, 12651363, -450972, -7161321, 998580, 11276437, 14351096, 14145475, 20534776, 17928268, -10590852, 3198677, -21942452, -24029268, -17914846, 6288369, -3196530, 5350993, 1495186, -16226386, 15663746, -7907572, -15833397, -34724812, -26819386, 8868034, -7371775, -12838194, 14291504, -2794950, 4665408, 22033182, -25035902, -1884954, -30763240, -61070140, -830002, 20706574, -6624987, 80684720, 17109540, -30014306, 9728638, --42213088, 16156593, 32410896, 37893424, -11107859, -5897527, -46525772, -53790708, -2515240, -32605782, -11079405, 533650, -39602820, 8212515, -2949569, -22984518, 10292352, -14906221, -10191421, -18545132, -9392020, -20202452, 25837450, -2705830, 9492951, -5928666, 34720516, -9415105, 19002010, -259309, -22668300, -6311992, -11680700, 7509214, -13213467, -13714367, 1682017, 26027502, 16484621, -17598628, -18650358, -13174812, -20548734, 5813775, 27493696, -10582799, -11612518, 14959908, 6340446, -13712757, -1196148, 19025094, -8263517, -18029736, 9480067, 7738458, 11147051, 21454436, 3954591, -12640626, --4780299, 46956876, 48483200, -13326210, -41337448, 31454730, -14344654, 9099425, 3591667, 52966072, -6308770, -26939108, -11021960, -6197101, 307090, 8621073, 11362336, 17644262, -21872120, 7145752, -2791192, 31231392, -9831717, 22362820, 20313584, 13921600, 7151121, 8413841, 11427297, 56317760, -22507240, -24211268, 5237713, -25316684, -15006616, -919123, 8678518, -3286187, 19543712, -23296440, --1532230, 10483478, -1586990, 10886668, -2211908, 4462471, 1559610, -16347719, -6210523, 5588290, --16949552, -15249281, 612033, 5284421, -12273406, 9361955, 7198365, -3698504, -8904541, -107911, -992674, -1617592, 6061810, 3032784, 4600447, -5826123, -3830574, 14062797, -803696, 2080912, -5301064, -2610803, 5934571, -4924180, -12894566, -6185290, 11517492, -8164733, -8181376, 2560338, --10745471, -8675834, 14097156, -13032005, 22819698, 7361037, -11701638, 12725451, 473520, -15261629, -278636, -533650, -4473209, 11278047, -1764695, -7216082, 18665390, -8633958, -6573985, 14584635, -1277216, 401043, -1929514, 9380209, -3249143, 8346195, -7959648, -32926830, -41022308, 34704948, -137272528, 54618564, 62631360, 1524713, -129765992, -94425392, -50347216, -75105560, 33362770, 65935800, -26276610, 116046256, 64647848, -3649112, 26484916, -57628260, -118294672, -46253040, -82354928, -12353400, -55996172, 48419312, 42556684, 72631656, 43742632, 12935368, 19131932, -4610111, -84348864, -36246840, --30776662, -114919368, 20836496, 15944529, -51993800, 84121232, 81843824, -2007360, 103717552, 52125332, --49085572, 33216740, -48802640, -99426880, -8575439, -59695212, -88379688, 16418049, 8770323, -4301947, -81210312, 79878336, 46509128, 71253504, 42074572, -26255672, -31397284, -53624276, -94420024, -68037112, --33630132, -29681982, 16244103, 54370528, 35650376, 59759100, 87377888, 35992900, -11992086, -8795556, --61041148, -46013596, 4843113, -49038324, -18105972, 18257906, -3688303, 0, 0, 0, -0, 0, 0, }, +-7335268, -2953327, -4199405, -2286533, 5206574, 2805151, 404264, 4345970, 2943126, -3470334, +-4744328, -2906082, -2251637, 567473, 1776506, -4748623, -664109, -1881733, -74625, -561030, +-1050120, -2517925, 5964636, 3493419, -426812, -4907537, -1965484, 1066226, 2006824, -151934, +-1964411, 882616, 1709934, 592169, 1597728, -1355599, -231391, -3757560, -4873178, -1030792, +-461172, 2405719, 2901251, 2079838, 576599, 698469, 1660542, 2501282, 708133, 3333432, +1329829, -2103997, -2516851, -22549, 2368675, 2256469, 957778, 520228, 3595425, 2430952, +-4287988, -3681324, -2237678, -2025614, -1838246, 2463164, -1668595, 1176284, -4060892, 2962454, +-2884071, -2058363, 2066416, -1300301, -1811403, 4696547, 2877628, -4475893, -886374, -1729798, +-31675, 6410776, 481036, -2916283, 3547106, 576599, 455803, 1021665, 825707, -71404, +5014375, 2637110, -3223910, -1417339, -281857, -1306744, 1476932, 1955284, 1506997, -1569811, +-2026151, 667867, -4181688, -2098629, 3309809, 125091, 2683818, 1162326, -1991254, 1415192, +124017, -2014340, 4607963, -3195993, -1322850, 392990, 1649268, -2253784, -445066, -3161633, +-5768678, 5284421, -1000727, -3273839, 425202, 4822712, 109522, 1717987, -2401424, -1713692, +-924492, 1289564, -1869385, 3758097, 758062, 3344706, -5159867, 1916629, -1239098, 536871, +2390686, -1293322, -430570, -4332012, 202937, 1628330, 678605, -1655710, 48855, 1180042, +-699543, -2048699, 13666586, 4842576, -1209033, 3849365, 72478, 6918119, 4154844, -837519, +3376918, 6223408, 7867307, -4597763, -4735202, 2079838, -1983201, -1424855, 5589363, 4734665, +4273493, 3257733, 467078, -60130, -2119566, 2300492, 1395328, 7398618, 608275, -34360, +-3347390, 1640141, 2000381, -287763, -1124208, -1009854, 1839320, -157840, -1308354, -2531346, +2688650, -812286, -1095754, 4158065, 5559299, -1326608, -842887, 3444564, 2803540, 5376226, +3086471, 1594507, 384936, 4612795, 2360622, -5958194, -153545, 2063732, -3696893, 284542, +408559, -4168803, 2051921, -1904281, 3097745, -469762, -756451, 2024540, 366683, -2729989, +-483721, 1998770, -825707, -374199, -1133871, 768799, 3197066, 1176284, -3799436, 4766340, +-370441, -9005473, -4190278, -1750199, -1949378, -4904853, -4503273, -2831457, 4875862, -5367099, +-2508261, -2552284, 975494, 8132521, -1229971, -653372, 1981054, 4650913, -7134478, -1169842, +1440425, -3153043, 2499671, 3973919, -4410395, -280247, 545998, -2563559, -6488622, 1115618, +-2748242, 867047, -2535641, 3690451, -4496294, -4177393, -10297721, -2776160, 3487514, -583042, +-3983045, -1950989, -546535, -4138201, 151398, -707059, 2772402, 2231236, -1132798, 117038, +-1127966, -4368519, 5233955, 915365, 3499325, -1331440, -95026, 924492, 1435056, 4110821, +-1457068, -1005022, 1065152, -124017, 4325032, 2400350, -4089346, -1543504, -1199907, -6149857, +-959925, -557809, 3345780, -2309619, -19718732, -6285685, -1656784, -1679332, -1557463, 7571491, +-6950331, 3324842, -1535988, 1487132, -1899449, -1699733, -5558762, 874026, -1942936, 375273, +-8112120, 115427, -702227, -1523103, 13959, 1508070, 1404454, -818728, -402653, -3339874, +1189706, -2683281, 1922535, -27380, 1674500, 5131412, -1158031, -5916318, -2325725, -6920266, +1162862, 1241246, -412317, 1197759, -2190970, 2321967, 1421634, -3048890, 505196, -8288750, +-1521492, -5531381, 3300146, 5525476, -4569845, -340376, 1855963, 889595, -7633768, 1377611, +4376572, -3740380, -1497333, -8967892, 3395709, -1220845, 4077535, 6800544, 4171487, -5267241, +1505923, 1411971, 672162, -5822902, 1931662, -2354179, 4372814, -1366873, 171262, 2172180, +1802276, -11871290, 964220, 2579128, -4780299, -158914, 11596412, 9694278, 4663261, -956167, +-2567854, 6346888, 3346317, 2292439, 1862405, -4427575, 1246614, 847719, 5232881, -4997195, +-2865280, -644245, 298500, -717796, -6622303, -3825205, -4788352, -4777614, 2433636, 3848828, +1794760, 1923609, -325344, 1890323, -1225676, -278636, -59593, -1483374, -999654, 3117073, +1648731, -3818226, -5189931, -34360, -5217312, 3234647, -1944547, -7567733, 437013, 4478577, +5204964, 4406100, -344134, 4195646, -6288906, -1384590, -3167539, 58519, -257698, 3026341, +-2665027, -4726612, 5596880, -5252745, -3583613, 4469451, 8276402, 2749853, 794569, -8335995, +8520141, 1868311, 5344013, 11244761, -4107063, 2183454, -1401770, -2419140, 1991254, 18580028, +13009993, -4619774, -6859063, 10324028, 6650220, 10858751, 15843597, -7998840, 5446556, 2680597, +4546223, 2095944, 2696703, 6597070, 1553168, 6731288, 130997, -4286378, 1706713, -1384053, +2160369, -802622, 12230456, 2075543, 2597918, 1657857, 357019, 4298726, 1695438, 226023, +-943282, 3059091, -2546916, 5867999, -4774393, 7066832, -3540127, 4250944, 2059974, 2573222, +1884954, 10378788, 7767985, 434329, -2473901, -5733245, 5947993, -6978248, 1480690, -3101503, +2777770, 6447283, 505196, -11035382, -9177271, 818191, -5840619, -6095633, -3790846, -7017440, +2107755, 11861089, 5628018, -4528506, -132070, 1260036, -3580929, -3655017, -1068373, 5752572, +5999533, -7070590, 2659122, 7543573, 702764, 2435783, 7866233, 1857573, 11526618, -732829, +-426276, -3609383, -3445638, 4284767, 8670465, -2282775, 2105608, 973347, 9430138, 4349192, +-4762582, -3819300, 390842, 2385318, 8567923, 8992588, 12913893, 2756295, 3437585, -1931662, +5146982, 6474127, -2566780, -2626909, 4530117, -3226594, -5216238, 5135171, 1255741, -5415954, +-7308961, 11291469, 5303211, 65498, 6799470, 1795296, -4989679, 10770704, -2524904, 774705, +-341450, 3148748, -3831648, 3158949, -3818226, 3098282, -3528853, 3663070, -2866891, 4815732, +-3585761, -3136400, 9664750, -11494943, 766115, 1986959, -4002373, 1380832, -13342853, -6053757, +6711424, -4777078, 4297652, -796716, 3108483, 1848447, 2867428, 2132451, -5353677, 4048007, +-2427194, 354872, -9480603, -8393440, 85899, 3463354, 6843494, -7961796, 2367601, -7170448, +5925981, 4322885, -9571335, -2141578, 1142998, -11487427, -6356015, 6767258, -799938, -637803, +1726040, -864899, -11796665, 10711648, 780610, -7853348, -3670587, 1283658, -927176, -7563438, +-2153926, -4422206, 1285269, -547071, -2309082, 2190433, -10261751, -4767414, 2693481, 13276818, +-2231773, -8119636, -5589900, -4619774, 9167608, -9989557, -1970853, -909459, -10472741, -13253195, +3149822, -9274982, -1505386, 1073742, 6764037, 3543885, 440771, 1171989, 8036421, -3878892, +-2746632, 11766600, -8343511, 5908265, -3069291, -3503083, -1586990, -2003065, 12524662, -329102, +4498442, -14101451, -10365367, -644782, -2842195, 13582297, -811749, 8082592, 1983201, -15834471, +1401770, -1444720, 10787347, 1393717, -11700565, 13944148, 4323422, -7971460, -17900350, -7264937, +17449916, 1021129, -2343979, -2785823, 1699196, 740345, 5310727, 3037079, 5701032, -1086090, +10266582, -5172215, -12317429, 705985, 471910, -2713883, -536334, 4783520, -3227131, -1656784, +-1152125, 9992778, 7500624, 4158065, -804770, -13065291, -338766, -442919, -636729, -1948841, +-297427, -5548024, -10935524, -1412507, 7380365, 7565048, -2821257, 8120710, -2610803, 3705483, +8477729, 8557185, -18221398, 6587406, 6418829, 3109020, -4546223, -15460809, 9490267, 6145025, +2912525, -5174362, -3362960, -5881421, 3330747, -6529424, -1597728, 788127, 6145025, -3266860, +2872796, 2691334, -12185896, -469225, -8614631, 14236206, 1522029, 9586904, 12512313, 12082817, +9881646, 11829951, -15036681, -10452877, -4981625, -5400385, -7048578, -6062883, -12033961, -4616553, +1119376, 6910066, 269509, -7512972, -65498, 6884833, 612033, -6567005, -2617783, 16231218, +1851131, 5789079, 2142652, 6402723, 1608465, 1724966, -10096394, 5207111, 555661, 1834488, +-10622528, 3175592, -16414291, -573378, -5115843, 3524558, -1414655, -12684112, -212064, -12640089, +2265595, -10618770, 9168681, -5812702, 14368276, -195421, -279173, 6577206, 1511292, -2945274, +-2187749, 2243584, -5018133, 2692408, 8706436, 3820374, -6788733, -4174171, 18734110, 718333, +14829448, -14784888, -3342558, -2240362, 10532334, -13004087, 1123671, 5126581, -12961674, 7805030, +-8696235, 1612223, -4848481, -15177878, 2091649, 15122043, 10950556, 12361990, -4336843, -3037079, +2766496, -2041183, 14821395, 5125507, 6870337, 12789876, -1289564, 4782446, -9055402, 12684649, +5935108, -3245922, -8232379, -7324530, 8060580, -14851997, 5267778, 8352101, -6680822, -8401493, +-5248450, 7715372, 2385854, -3226057, -6008659, -165893, -9726490, -13975824, 1818382, -13466870, +-20251308, -2851322, 20401, 19370302, -9315784, -7239704, 8014409, 14056891, 13764833, 7188165, +-1771674, 2735357, -7223062, 410169, -7568269, 15527381, 13384192, 8465381, -1721745, -17637284, +-1211718, -15301895, 14558865, 11047730, 6369974, -13123273, 8483097, 4108136, 5420786, -3846143, +-11421392, -9156870, -9463960, 548145, -12732431, -23264764, 2681133, 10616085, 6621766, 6963216, +13364328, 26006026, 12822088, 8518531, 9630927, -17493402, -1719598, -6934225, 22160420, -22444426, +-19582366, 5038534, 14791330, -1217623, 17892834, 14576582, 191126, 5114233, -9250286, -8150774, +17078400, -7156490, 12037720, 3139621, -6221260, -4524211, -2215666, -4319664, -6513318, 5517423, +7681012, 4859756, 1519882, -9104257, -9766756, 13239237, -12700218, 10107669, 2029372, -17585744, +9570261, 15463493, 736050, -5012764, -964220, 697932, 2028835, 10410464, 544387, -8826158, +-2299418, 8829379, -15874199, 3622805, -1647657, 13409962, 15879031, 9356049, 12748537, 14715095, +12188580, 3641059, -8373576, -11272679, 6849936, 7212324, 1090922, 6333466, 10453950, 23067732, +-11004780, 14794552, -6377490, -5056787, 18456012, 2838437, -17373680, -3697967, 10934450, -13339632, +943819, -8566312, -13584445, 20077362, 18129594, 14223858, 7534447, 3371013, 6364605, 14639396, +8930848, 15028091, -5120675, 12523588, -9140227, 15266461, 21714280, 12797929, 11187853, 4954245, +11550241, 10560251, -2573759, 21420612, 5939940, -13547937, 6961605, -13704704, -8423505, -3106335, +-19960324, -13422, -3637301, -5980205, -9269613, -5594195, -2065879, -994822, -1190243, 558883, +1748052, -12225088, -6943352, 2140504, -5337034, 4624606, 21384106, -10592463, 185220, -2231773, +1811403, -10033044, 6359773, -4947803, 16950088, 3120831, 10646687, 14557792, 3798899, -1159104, +-8390755, -21819508, 4304631, 16088411, 13268765, -3002182, -12770012, 12416750, 3154117, 7919383, +-16343424, -11881490, -9074729, 9100499, -30776662, -19549080, -9411884, 22051436, 15925739, -11758010, +13655312, 12496744, 10518375, 10471667, -10300942, 1214402, 5965173, -10066330, -30902290, -5461051, +-8536248, -18767934, 1779727, -6263673, -4769025, 6015102, 3553549, -3994320, 1035087, 14731201, +15651398, -28271086, 6948184, 1702418, 13383118, 4748623, 936840, -17492864, 5664525, -4283156, +-4661114, -11936788, -8782671, 23125714, -10038949, -126702, 3088618, -5752572, 25671020, 12286291, +-10806138, -6516539, -19284404, -2566780, 19436874, 5830955, 6311455, -5929203, 12203076, -2454037, +-4251481, 10882910, -5478768, 17857400, -3222299, 13335337, -25720412, -8898635, 16534013, 3883187, +-1060320, 4350265, -27930710, -14081050, 6595996, -12079596, 7317551, 589484, 7589744, 16123307, +6878927, -14683956, -37129456, -4573604, -3336116, -5482526, 7182259, -16660178, 31416076, -6828998, +2622615, 31893354, -37829000, -5409512, -6375342, -5077188, -43516072, 1143535, -5662915, -10022843, +16457778, -16750909, 3626563, 1556389, 8509941, -2798708, -15055471, 9768366, -9451612, 21867826, +-2736431, -27813134, -671626, -2324114, -12040941, -28037546, 13225278, 12076911, -20973936, 16703665, +-18837190, -17152488, -8329552, 246424, 2934000, 1469953, 14184666, -3987877, -10916733, -30561914, +7271380, -40785008, -19451906, -15089831, -30010010, -20240570, -7624104, -3588982, -13278428, 20768852, +24613920, 3428458, -5388037, 23785528, 13154948, -4641786, -3995393, 16642998, 15453829, -7948374, +26433376, -21963926, -7907572, 25246354, 15867757, 36624260, -14024679, -12659416, 8124468, -1542430, +-14170171, -7099044, 3636764, 29962228, 17075180, -2691871, 40534828, -4560182, 16713328, -18973554, +23739894, 22409528, -1877438, -17683990, 2059437, 6663642, -9779104, 10794327, -14334453, 25770, +-4223564, -4486630, -16264504, -11777337, -7219840, -656593, -5020280, -12609487, 19675246, 13670881, +3984656, -4935991, 3729105, 19086298, 9226127, 14199162, 9108015, -9584220, -15181636, 32410360, +-3566434, -16691317, -6600291, -6728603, -3460670, 23788214, 1735704, -16876538, -5965173, -43149924, +-9980967, -4177393, 28092844, 19815906, -52536040, -21914534, -11918534, 977642, 3899830, -20026896, +17068736, 9890773, 15156940, 28458454, -33530272, 36100812, 26454314, -9327058, -21649856, 3389266, +-3819300, 10773389, 33036888, 27666032, 4153770, 10132902, -21547850, -35031364, 50321448, 24568286, +2592013, 2791192, -10939819, -29943438, 10615549, -2833605, 25512106, 5071283, 9630390, 27065274, +15555298, -949725, -2708514, 4005057, -16634945, -14583025, -17709224, -10757819, 16825534, -5335423, +1265405, 19933480, -3354370, 8233453, -28631326, -26838714, -17369384, 14007499, 6311992, -1987496, +7085086, -10256919, -25705916, 31600758, -30863634, 13124883, 15045807, 10369125, 5473399, 18478024, +-12492986, -33245194, 23848342, 65190624, -11400454, 30668750, -38415260, -22633404, 24438364, 12251931, +-35529580, -12052215, -2465848, 29275034, -7120519, -5520107, -48229260, -33741264, -10359998, -38345468, +31141734, 29596082, 51863340, -47317656, 20812338, 3183645, -22970558, -3358665, 1447941, -50529216, +9861245, -9354439, -45156212, -24776592, -1451699, -6233608, -15486578, 5945309, 13859859, 2013266, +-16336445, -276489, -15680926, 41557028, -13133473, 1453846, 30586610, -1239635, -32440962, -21701932, +-22337588, -9167071, -12134893, 34681324, 3026341, 6123013, 16527571, -8896488, -10054518, -5280126, +-10237055, -20398410, -5405753, 39633420, 12144557, 9743670, -26545046, 10022306, 1545651, -18156438, +-2657511, -8920647, 42039140, -33282776, -29522532, -9903121, 4823249, -9718974, 818728, 11753178, +-22614614, -5711770, 35555348, -28836410, 4632122, -7127498, -18111340, -30698816, -23986856, 1169305, +-43329776, -51895552, 11858942, 10480257, 7887171, -46581604, 35353488, 43069396, -15156940, -13159243, +2355790, -2623151, -10067940, -25223806, 17350594, 63840392, 10054518, 11325829, -14048301, -37539624, +10532870, 14566918, -55275692, 30331060, 1523103, -15837155, 5554467, 20230370, -28412282, 17715130, +-26344792, 7219303, -1245541, -13365938, -7136625, -3558917, -19261318, 14139569, 12651363, -450972, +7161321, 998580, 11276437, 14351096, 14145475, 20534776, 17928268, -10590852, 3198677, -21942452, +24029268, -17914846, 6288369, -3196530, 5350993, 1495186, -16226386, 15663746, -7907572, -15833397, +34724812, -26819386, 8868034, -7371775, -12838194, 14291504, -2794950, 4665408, 22033182, -25035902, +1884954, -30763240, -61070140, -830002, 20706574, -6624987, 80684720, 17109540, -30014306, 9728638, +-42213088, 16156593, 32410896, 37893424, -11107859, -5897527, -46525772, -53790708, -2515240, -32605782, +11079405, 533650, -39602820, 8212515, -2949569, -22984518, 10292352, -14906221, -10191421, -18545132, +9392020, -20202452, 25837450, -2705830, 9492951, -5928666, 34720516, -9415105, 19002010, -259309, +22668300, -6311992, -11680700, 7509214, -13213467, -13714367, 1682017, 26027502, 16484621, -17598628, +18650358, -13174812, -20548734, 5813775, 27493696, -10582799, -11612518, 14959908, 6340446, -13712757, +1196148, 19025094, -8263517, -18029736, 9480067, 7738458, 11147051, 21454436, 3954591, -12640626, +-4780299, 46956876, 48483200, -13326210, -41337448, 31454730, -14344654, 9099425, 3591667, 52966072, +6308770, -26939108, -11021960, -6197101, 307090, 8621073, 11362336, 17644262, -21872120, 7145752, +2791192, 31231392, -9831717, 22362820, 20313584, 13921600, 7151121, 8413841, 11427297, 56317760, +22507240, -24211268, 5237713, -25316684, -15006616, -919123, 8678518, -3286187, 19543712, -23296440, +-1532230, 10483478, -1586990, 10886668, -2211908, 4462471, 1559610, -16347719, -6210523, 5588290, +-16949552, -15249281, 612033, 5284421, -12273406, 9361955, 7198365, -3698504, -8904541, -107911, +992674, -1617592, 6061810, 3032784, 4600447, -5826123, -3830574, 14062797, -803696, 2080912, +5301064, -2610803, 5934571, -4924180, -12894566, -6185290, 11517492, -8164733, -8181376, 2560338, +-10745471, -8675834, 14097156, -13032005, 22819698, 7361037, -11701638, 12725451, 473520, -15261629, +278636, -533650, -4473209, 11278047, -1764695, -7216082, 18665390, -8633958, -6573985, 14584635, +1277216, 401043, -1929514, 9380209, -3249143, 8346195, -7959648, -32926830, -41022308, 34704948, +137272528, 54618564, 62631360, 1524713, -129765992, -94425392, -50347216, -75105560, 33362770, 65935800, +26276610, 116046256, 64647848, -3649112, 26484916, -57628260, -118294672, -46253040, -82354928, -12353400, +55996172, 48419312, 42556684, 72631656, 43742632, 12935368, 19131932, -4610111, -84348864, -36246840, +-30776662, -114919368, 20836496, 15944529, -51993800, 84121232, 81843824, -2007360, 103717552, 52125332, +-49085572, 33216740, -48802640, -99426880, -8575439, -59695212, -88379688, 16418049, 8770323, -4301947, +81210312, 79878336, 46509128, 71253504, 42074572, -26255672, -31397284, -53624276, -94420024, -68037112, +-33630132, -29681982, 16244103, 54370528, 35650376, 59759100, 87377888, 35992900, -11992086, -8795556, +-61041148, -46013596, 4843113, -49038324, -18105972, 18257906, -3688303, 0, 0, 0, +0, 0, 0, }, { -2585034, --6458557, -1875290, 1891396, 347892, 2050847, 1841467, 5793911, -1076426, -266288, -651224, --4194573, -3362423, 790274, 675921, -274341, 2022930, -6150930, -3652333, -3535832, 2113661, --63888, -900869, -1084479, -1076963, 969052, 1435056, -373662, -797790, 2165737, -3448859, -3494493, 2368675, -1294396, -2873870, -571231, -4226248, -1808718, -5934034, 2421825, 2223719, --376347, 1289564, -3872987, 3503620, -75162, -586800, 2807298, -3904125, 124017, 3304977, -843961, -905701, 246961, 469225, -3580392, 2785823, -629750, 3441880, 378494, 892816, -668941, 1102733, -2083059, -2416993, -2416993, 1851131, -1467805, 354335, 4126390, 5426155, -3099356, -549756, 1268089, -24159, 74625, 490700, 3484829, -4723927, -3761318, -701690, -3730716, 5383742, -2515777, 3121904, -1714229, -4576825, -1198833, -2582886, 1528472, -678068, --2146410, 1947768, 3083250, 623307, 3718368, -6801081, -7243999, -4742181, 717260, -82141, --1206349, 285078, 2262374, -797253, 3041374, 2409477, -3143379, 1137093, -199179, 3811784, -3624953, 1272921, -3770981, 2415382, -2230162, 1183800, 2540473, -6177774, 6693170, 9674951, -1321776, 4328254, -3553549, -830539, -3331284, -1864553, 3074123, -1126892, -3442416, -1048509, --2145873, 1553168, -2087891, -2088965, 257698, 1636919, -1709934, -2168422, -792958, 3296388, -3214246, -2832531, -865436, -3332895, 850404, 3885335, 1321239, -1782948, -1713155, 1229434, --90731, -3167002, 14972256, 6973953, -576599, 3205119, 2803003, -3544959, -1820529, 4228932, -1843615, 4598836, -3349001, 6659884, 2427730, -6445136, 5116917, 340913, -165893, -3368328, -3732864, -6968585, -6085969, -1223529, -2193655, -1096827, -2202245, 888521, -1353989, -2850785, --2159295, 2526515, -2714956, 1790465, 1038308, 768262, -2990908, 4225711, -8704825, -1436130, --87510, -1427003, -1127966, 841814, 1578937, -2680060, 2172717, -3263638, 3185792, 1130113, -668941, 3440806, -2380486, -440234, 1312113, 5334887, 1253594, 2326262, -1232656, -4356171, --6337224, 1333051, 3390877, 4662187, -1862942, -6830609, 1018444, -2630668, -1995012, -1334661, -1926293, 565862, 6864969, 248034, 2289755, 1962263, -1087164, -858993, -2025614, 8096550, -1890323, -6829535, -7741142, 2138894, -2339684, -6404870, 7326141, -3555159, -1151588, -962610, -5768141, 1243393, -3257196, 4059818, -3045132, 6119255, -8310225, -5472325, 6760816, -6901476, --6943889, -2750927, 5807870, 2581275, 2841658, -583579, 5232881, 3191161, -404264, -6653978, -1963337, -1770600, 2577517, 2258616, 1998770, 5985574, 1741609, -5646272, 714038, 4159676, -6102612, 2137820, -3023657, -608812, -4544076, 2205466, -8219494, -155156, 9403831, 676457, -1264331, -4490925, -5497022, 1100585, 1599875, 6946036, -1101659, 815507, 1103270, -742493, -1125281, 2503429, 880468, 5015985, -746251, 3447785, 1072131, 1177358, 1268626, 5899675, -1060857, -400506, 2057289, -805306, -18246632, -12525735, -2293513, 1672353, 3395172, -26307, -386547, -7439420, -14496, -1867237, -751619, -150861, -1357210, -1115081, -4792110, 2444910, --10583336, -4318053, 1488743, -2483028, -2869575, -2186675, -5767604, -3430605, -2070174, -3213709, -1955821, -5088463, -2100239, 5840082, 4537633, 221728, 3520800, 1957968, -1337882, -4207458, -3064996, 8873402, 1708860, 1000727, -2844879, -3292629, 3388729, -7822209, -3345780, 8479876, --7031399, 2301566, -1037772, -3991098, 2673617, 553514, -1273458, 505196, 2261837, -2687576, -1021665, -488553, 6333466, 4762045, 1807644, 1371705, 3480534, -9127, 248571, -1634235, --9477919, 5499706, 4805532, -2660732, 1586990, -4175245, 726923, 1108638, -945967, 2062658, --858457, -15761993, 2145873, 4093104, -1354525, -1097901, -9254581, -3339337, 2088965, -7655243, --7983271, 1848983, -7618198, -3448859, -558346, -4100620, 2090575, -3181497, 5054103, -2609730, --2276870, 1970853, 3406983, 7283728, 3995930, -7607461, -834834, -353798, 3453154, 6019934, -9435506, -4169340, -4298726, 5309654, -5812702, 1442035, 1112397, 8509941, 2615635, 4820564, --6637335, -2576444, -8903467, 6846178, 6563247, 8198556, -574452, -1601486, -5846524, -1012002, -4968741, -2403571, -3923990, -3106872, -4681515, 1001801, 558346, 1345399, -6230387, -14496, --6103149, -255014, -1255741, 2357937, 1615982, -1709934, -2937221, -7173133, -741956, -548145, -4168803, -2743947, 7177964, -4141959, 820339, 3537443, 6702834, -4945118, 587874, 19498614, -17476222, -1027034, 912144, 8463233, 1612223, 3928821, -2265059, 4450660, -3361349, 8537321, -3460670, -416612, 2218351, 191126, 11733314, 7224672, -7057705, -6637872, 2791729, 753767, --2008434, -2065879, 1811939, 4987531, 4409858, 2025614, 949188, 2410014, -1532230, -616865, -6611566, -7341173, 3113315, 7872675, 6615324, 10870562, -768799, -2212982, -645856, 224949, --3284039, 11840688, 11642583, 7579007, -3431142, -1631014, 5132486, 3406983, -3134789, 255014, -6782290, -2940442, -2728915, 3592740, -11701102, -1923609, 942208, 1231045, -3795141, -8375186, -3446175, 4827007, -6157910, -2908767, -6748468, 2058900, 628676, -1969243, -1416266, -6528351, -10109279, -3080565, 1155883, -10566693, -3020973, -4539781, 13015362, -418222, 8183524, 11404749, --6089190, -13865765, 469225, 10673531, -8330626, 7507603, -2346126, -10036802, -4794257, 10207527, --10071698, -8727374, 6233608, -10106058, 3219078, 4853313, 3811247, -2864206, 5966247, 1731946, -973884, 3941169, -6660421, 8804683, 4147328, 3803194, -2024540, -1023276, 16234440, -5808407, -801011, 4219269, 8046085, -11320460, -9498320, -8711267, 83752, 537945, -836982, 5119601, -1357747, 9213242, 3477313, 5330055, -1175747, 570694, -4927938, 8169028, -4105452, 8035347, --4832912, -7326141, 11893838, 9705015, -14469208, -12710419, -8577050, -6698002, 4009352, 364535, --3309272, 6105833, 6662031, -9004399, 4525822, -1170916, -17747878, -6213744, -9274982, -8463770, -2338610, -3327526, -7707319, -10177999, 6001143, -5742372, -4672925, -3469260, -12403329, -1016297, -5147519, -3025268, -1004486, -4176856, 9728101, 1800665, 6094559, 5118528, -8337606, 8530879, -12113955, -3546569, -5346698, 1583232, -2439542, 5600101, -15618649, 6118718, 12983686, -1521492, --4642323, -3543348, 5472862, 12129525, -3126736, 3237332, -5616744, 8377334, -10133438, -3536369, -1586990, -1313723, -7946763, 14242648, 9553618, 7617662, -3468186, -10365367, -1655710, -14818711, -2228014, -906238, -857383, -137976, -2655901, 8300561, 6483253, -10282689, 5405217, -6114423, -8180839, -681289, -2221572, -630823, -9640054, -1690607, -8872866, -18441516, -1415192, 2128693, -833761, -7182796, -920197, -2211908, -14528264, -28991, 11184632, -8032126, 2303176, -19401442, -1384053, 11298448, 6203544, -8832063, -7142531, 14181445, 3324305, 3202972, -2733747, 3692598, --76236, -9445707, -2392297, -9914932, 4798016, -5883569, -806380, -9645423, -10625749, -14372571, -9154186, 6164352, -4496294, -5071820, 4202089, -13174275, -1051193, 1085553, 3374234, 5918465, -3031710, 471373, -4386236, 2032593, -3995930, 3606699, -3808026, 2423435, 1476395, -4081293, --5185636, -10267119, -6567005, 2750927, -17419850, -4708358, 10056666, 5301601, -1784022, 23268522, --2969433, 10844256, 11014981, -16749299, 1542430, -2128693, -13768591, -7349763, -7321309, 337692, -2234994, 16064251, -1953136, 1581085, 11526082, 8046621, -1128503, 10748156, -4258460, -4092567, --6222334, -9822590, -12746926, -5740224, 9500468, -15567646, 1675037, 12779138, -1743757, 3760781, --5921686, 3316789, 6191732, -3923990, 5396090, -7881802, -7477538, 11875048, 7385197, 7508677, -10521596, -505196, -7436736, 10225243, -8654896, -12994424, 888521, 11355894, -967441, -10618233, -2137283, 13461501, -1238561, 3416110, 2120640, 19069118, 2026688, 3792993, 10413685, -1578937, --4128537, -9664750, 2177549, -1628866, -8070781, -33286, -4366908, 3257733, 14121316, -170725, --6989523, -2649458, -6381785, -4204773, -123480, -3380676, 2843268, -10089415, 11654931, -5823439, -18973018, -4732517, -11778411, 517544, 1859721, 6113886, 3986267, 3215857, -11949673, -10982768, -9200357, -11432129, -14138495, 4260071, 4683662, -3814468, 18578954, -14096620, -17261474, 6585796, --11142219, 140123, 767189, -10328859, 5690832, 611496, 14078903, 14861124, 21342766, 9789841, -4455492, 2974802, 6958384, -7287486, 8045548, -12923557, 6152004, -1289564, -1245541, -24776592, --9744207, -4102768, 8236137, -1106491, 1832877, 2626373, 2009508, -12709882, 12825846, -565325, -5041218, 358093, 11899744, -13206488, 8778376, -6541235, -689342, 9797894, -11646341, -5124433, --12692165, -4983236, -14123463, 12301860, 8593693, 16559783, -1401770, 3817689, -15832323, 3323768, --16449725, 15163919, 3569118, -2639794, 13662291, 14633490, 6641630, -8986145, -14176076, -19137300, --1965484, -6904697, -10807748, 10079751, -4235912, 23727546, -19332722, -6720013, 11880953, -14565845, --7783555, 2968359, -2240362, -2474975, -16765942, 5754720, -1654636, -8212515, 502511, 4224101, -3391951, 21974126, -4850629, 2799245, -976568, -7719130, 10189273, -4060355, 3868692, 773094, -14461155, -4961761, 16813186, -201327, 8399345, 6874632, -1260036, -5951214, -16237661, 7159174, -16935592, 295279, -142271, 11127723, 9911711, -1377611, 1752884, 19472308, 12510166, -4372277, -4238059, 12500502, -3526705, -15469935, 129923, -11486353, -1938104, -7623030, 326954, -21210696, --6400575, -8347806, -35433, 3255048, 3850438, 18708878, 21355114, 10417980, -15626702, -10058813, -11687680, 16002511, 2998424, -16998944, -3293703, -5077188, -17180406, -11790759, -13283797, 13639742, --6638946, 434865, -16515760, 20673288, 15348603, -3809099, 5451387, 35112432, -3520800, -10087804, --16303159, -3745748, 7381438, 4203163, -9384504, 5432060, -10714870, -14980309, 19808926, -11994233, -14670535, -10394895, -18372260, 1980517, 20577188, 15092515, -17131550, -9567040, 2608119, 4350802, -6244346, -103616, 13376139, 8872329, 17977122, -5774584, -4264903, 507343, -4757213, -17172890, --14597520, -3044058, 18106508, 5192079, 458488, 1860795, -18894098, -19107236, -16744467, 9351218, -8256001, -5709622, -5600101, 3030636, 1201517, -9573482, 2132988, 21488796, 2565169, 13955422, -11476153, 10256382, 20736102, 32466194, 9287330, 1892470, 3561602, 13668733, -7401840, -2058363, -7387881, -1378148, 3563212, -1419487, 12611098, 6261526, 8718247, -1111860, -4351876, 8411157, -17231408, 324270, -15422154, 11121818, -23692650, -24975234, -9736691, 15685757, -9438191, -24478630, --16585553, -4565550, 9290551, 8373576, -37216964, 1978369, 19024020, -3496104, -4286378, 22972170, --12128451, -12668543, -15996069, -5303211, -5235565, -10701985, 3474629, 5386963, 9150965, 6404333, --4847408, -3908957, -1459215, -4373888, 1941325, 4561256, 19124952, -7743289, -23735600, 13238163, -609885, -390842, -19589882, 9327595, 4489852, -1705102, 23554674, -6156836, 3153580, -1686848, -10814191, 12669617, -12678207, -821413, -6744710, -346282, 7690139, -4516695, 11381663, -15790984, --12753905, -8029978, -13639206, -1886028, 2355790, 2953864, -19356880, -12715788, 10868415, 17235704, --6628209, -8439074, 9929428, -17894444, -15627775, -15575162, 19434190, -29581050, 11353209, -766652, --16419123, -4845260, 16772384, 39581344, -3512210, -9830106, 14463302, 30458298, 12284680, -6190659, -6954626, -3959960, -19252728, -35203164, -222265, 36652716, -4421132, -4479651, -23649700, -3649649, -30602, 908386, 10123238, -580357, 8711267, -1236951, 1318555, -19819664, 4314295, 14710263, --9364639, 18660022, -6849936, -3010772, -16332687, 9837623, -7246147, -7610682, -19099182, -30058328, -16241419, -15577846, -11802033, 3195456, 4715337, -7869991, 3218004, 14243185, -2910377, -17081084, --7632694, -21380348, -512712, 3791919, 15470472, 961536, -2048699, -5187247, -6133214, 2852932, -16103980, 469225, -6746857, 14138495, -13218836, -259846, -24248312, -9720048, -2907156, 30628486, --18228378, 4656819, -4196720, 2231773, -1145146, -5746666, 3483219, 11078331, 7141457, -26317412, -29945048, 5707475, 13507672, 922344, -5527623, -10596221, 4126927, -16934520, -9346923, 35213364, --3969624, 2659122, -18031884, 16273631, -9114457, 11903502, -9200357, 21151640, 2627446, 1887638, --9936407, -8834211, 13001940, 27496918, -11067594, -17245904, 8506183, -6976638, 18859202, 22855132, -11959336, -3789235, 14875619, -9833328, -8300025, 19139984, 27353572, -30302068, 3033858, 4146254, -5662915, -10478646, -112206, 11766063, -29700772, 8759586, 18319646, 6308233, -12862353, -4093641, -22373022, 17434882, 6560026, -10625749, -12720083, -26629870, 38073812, 6356552, 19907710, -3234110, --7284265, 3735011, 11892764, -126165, 105764, -30988190, 5445482, 28212566, -4398584, 26973468, --15775415, -8053064, -10754061, 5734855, 26710402, -8938364, 60666, 22562000, 29461328, -10377715, --20074678, -19907174, -15415174, 14716705, 9834401, 25524454, -8157217, 18617072, -10197863, -3315178, -16174847, -79457, 22258668, -27198418, 16646756, 3614752, 6986301, -10691247, 7652558, 21065204, -39374112, -8831527, 9400610, -168577, -27462020, 24800752, 1615982, 9913321, -5757404, -12115566, --5556077, -680215, -11293080, -6167573, 33089502, 2703145, 12077448, -9443022, 23090282, 437013, -10612864, 5248987, -15279883, -2721936, -9907953, 550830, 3132105, 28851442, 13256417, 1497870, -2061584, -714038, -3749507, 4989679, 1421634, 18209588, 13084081, 7672959, -10042707, 12788265, -24536074, -24272470, 21257940, 4117263, 5196374, -24289650, -13505525, -30570504, -26900454, -4278861, -14994268, 14812805, -44913548, 718870, -21072184, 11590506, 41873784, 23535348, -27887222, 17934710, -10799158, 14457397, -36700496, -55248848, -15037754, -5845451, -14263050, 3512210, 18274548, -19215684, -27827094, 10775536, -41375568, -30951144, -6809671, 22735946, 279173, 2253784, -4800700, -12576201, --40068288, 1990181, -33745020, -27173184, 12976707, 11052025, 9252433, -4325569, -13392782, 30278446, -17462800, -12419435, -26404386, 20067160, 9521406, 4926328, -12658342, -30096984, 11086384, -14017700, -4118337, -25639882, 31003758, 966905, -12979391, 3229816, 7540889, 26053272, 15863462, -6527277, --1598802, 9159018, 8718247, 10038412, -6112812, -40514964, -32034014, 6434935, -4473746, 23678692, --4553739, -10263898, -28502476, 33105608, 12972949, -23303956, -23507430, 33901788, 32530082, -531502, -24288576, -3321620, 2020782, -9827422, -4198868, -18304614, 2832531, 19803020, 1638530, -13492103, --35641248, 56035900, 1127966, -42862164, -3543348, -15785615, 7013682, 21673478, 19157164, -23725400, --38793220, 6850473, -18718004, 6147172, -4044786, 17253420, -5866389, 2704219, 9791989, -15455440, --19589882, 2317135, 4761508, 17091822, -691490, -26614302, 17381196, -14716705, 13588740, -12751221, --9197136, -1177895, -4595078, -28622736, 5099200, 8376797, -28297928, 12127914, -11336566, 5907728, --9686225, 27322972, 20665236, -26918708, -14834817, 18926848, 22919556, -27539868, 36388572, 2725694, -29205240, 21873194, 34520800, -10458245, -15299747, 8216810, -29498372, 4807679, 3148748, 51327544, --16346646, -47485160, 80240728, -37783900, -30023968, 47024524, 20352776, -26765162, 44542568, 5479842, --37595996, 46370616, -49913424, 6663642, 15328201, -37949796, 17521856, 9678709, -12918725, -4051228, --371515, -9525164, -2737505, -5706401, -16494822, 168577, -8075613, -2156611, -3819300, 7864622, -30303678, 24786794, -22828288, -2888366, 31884226, -5872294, -5597416, -32639604, 4068945, 10231149, --4935455, 27128624, 66309464, -22588306, -27435178, 46538120, -2764348, -25763362, 29683056, 18824842, --14809584, -23240604, -27711666, 8046621, 15494095, -13084618, 44672492, 28267864, -54752244, -53608708, -31328028, -25626996, -31817118, 41114648, 7218230, 55225228, 27397596, -7712151, -7033009, -41456636, --31019328, 90947544, 25956098, -21017960, -44009992, -192200, -17602386, -41439456, -5652177, 44704168, -20365124, -1675574, 38866768, 30794916, -10233833, -46171972, 6851547, 21074868, -9993315, 50954420, -40550932, -10078678, 28529320, 4103841, -23940148, 15752866, 24228448, 9509058, 9910100, -31955094, --7729868, 4979478, 5683853, -3744138, -29742648, -9213779, 9353902, -5842766, -4070019, -23139136, -36301600, 5870147, -31831076, 18664318, 42777336, -21372294, -14239964, 7682623, 13377749, -12837120, --28692530, 24999930, 38743288, -1832340, -16814260, 6573448, 10119480, 19591494, 24341728, 3155727, -45258216, 478352, -53036940, 1970316, -7136088, 18505940, -6772090, -40597640, -2575907, -16520055, --19297824, 27184458, 11805254, 16360604, 16611860, -35912904, -21529598, -4579509, -2333241, 17487496, --1429150, -5421860, -1066763, -10487773, -28169616, 5184026, 37535868, -17719962, 818728, -12783433, --15054397, 31217970, -38269232, 4234838, 8467528, -4952634, -5947456, -42703788, -62617400, -54405424, -109587704, 105618616, 104272680, 296885856, 104493872, -12071542, 18526342, -205066976, -250946880, -83988624, --141394624, -194431024, 23682986, -11024644, -33920040, 213627376, 129088464, 54110144, 332514208, 157201712, -27422292, 151690192, -38000796, -182571536, -176092048, -166758016, -231985680, -226070976, -55116240, -82383376, --134922096, 153457040, 68694784, -57151520, 220734480, 70602816, -29147258, 250920048, 227108208, 51107964, -235593984, 240281408, -12815646, 57870388, 23681376, -235844176, -274841408, -204495744, -385568864, -364145568, --221490928, -293008576, -222867456, 20933670, 173680432, 199085696, 430848576, 392473568, 343708512, 372108992, -271181024, 135495488, 35293356, -37142876, -221325040, -263687904, -284140000, -317551616, -304279104, -259293088, --173356160, -126398200, -124485872, 23753854, 81166288, 74898328, 19959786, 0, 0, 0, -0, 0, 0, }, +-6458557, -1875290, 1891396, 347892, 2050847, 1841467, 5793911, -1076426, -266288, -651224, +-4194573, -3362423, 790274, 675921, -274341, 2022930, -6150930, -3652333, -3535832, 2113661, +-63888, -900869, -1084479, -1076963, 969052, 1435056, -373662, -797790, 2165737, -3448859, +3494493, 2368675, -1294396, -2873870, -571231, -4226248, -1808718, -5934034, 2421825, 2223719, +-376347, 1289564, -3872987, 3503620, -75162, -586800, 2807298, -3904125, 124017, 3304977, +843961, -905701, 246961, 469225, -3580392, 2785823, -629750, 3441880, 378494, 892816, +668941, 1102733, -2083059, -2416993, -2416993, 1851131, -1467805, 354335, 4126390, 5426155, +3099356, -549756, 1268089, -24159, 74625, 490700, 3484829, -4723927, -3761318, -701690, +3730716, 5383742, -2515777, 3121904, -1714229, -4576825, -1198833, -2582886, 1528472, -678068, +-2146410, 1947768, 3083250, 623307, 3718368, -6801081, -7243999, -4742181, 717260, -82141, +-1206349, 285078, 2262374, -797253, 3041374, 2409477, -3143379, 1137093, -199179, 3811784, +3624953, 1272921, -3770981, 2415382, -2230162, 1183800, 2540473, -6177774, 6693170, 9674951, +1321776, 4328254, -3553549, -830539, -3331284, -1864553, 3074123, -1126892, -3442416, -1048509, +-2145873, 1553168, -2087891, -2088965, 257698, 1636919, -1709934, -2168422, -792958, 3296388, +3214246, -2832531, -865436, -3332895, 850404, 3885335, 1321239, -1782948, -1713155, 1229434, +-90731, -3167002, 14972256, 6973953, -576599, 3205119, 2803003, -3544959, -1820529, 4228932, +1843615, 4598836, -3349001, 6659884, 2427730, -6445136, 5116917, 340913, -165893, -3368328, +3732864, -6968585, -6085969, -1223529, -2193655, -1096827, -2202245, 888521, -1353989, -2850785, +-2159295, 2526515, -2714956, 1790465, 1038308, 768262, -2990908, 4225711, -8704825, -1436130, +-87510, -1427003, -1127966, 841814, 1578937, -2680060, 2172717, -3263638, 3185792, 1130113, +668941, 3440806, -2380486, -440234, 1312113, 5334887, 1253594, 2326262, -1232656, -4356171, +-6337224, 1333051, 3390877, 4662187, -1862942, -6830609, 1018444, -2630668, -1995012, -1334661, +1926293, 565862, 6864969, 248034, 2289755, 1962263, -1087164, -858993, -2025614, 8096550, +1890323, -6829535, -7741142, 2138894, -2339684, -6404870, 7326141, -3555159, -1151588, -962610, +5768141, 1243393, -3257196, 4059818, -3045132, 6119255, -8310225, -5472325, 6760816, -6901476, +-6943889, -2750927, 5807870, 2581275, 2841658, -583579, 5232881, 3191161, -404264, -6653978, +1963337, -1770600, 2577517, 2258616, 1998770, 5985574, 1741609, -5646272, 714038, 4159676, +6102612, 2137820, -3023657, -608812, -4544076, 2205466, -8219494, -155156, 9403831, 676457, +1264331, -4490925, -5497022, 1100585, 1599875, 6946036, -1101659, 815507, 1103270, -742493, +1125281, 2503429, 880468, 5015985, -746251, 3447785, 1072131, 1177358, 1268626, 5899675, +1060857, -400506, 2057289, -805306, -18246632, -12525735, -2293513, 1672353, 3395172, -26307, +386547, -7439420, -14496, -1867237, -751619, -150861, -1357210, -1115081, -4792110, 2444910, +-10583336, -4318053, 1488743, -2483028, -2869575, -2186675, -5767604, -3430605, -2070174, -3213709, +1955821, -5088463, -2100239, 5840082, 4537633, 221728, 3520800, 1957968, -1337882, -4207458, +3064996, 8873402, 1708860, 1000727, -2844879, -3292629, 3388729, -7822209, -3345780, 8479876, +-7031399, 2301566, -1037772, -3991098, 2673617, 553514, -1273458, 505196, 2261837, -2687576, +1021665, -488553, 6333466, 4762045, 1807644, 1371705, 3480534, -9127, 248571, -1634235, +-9477919, 5499706, 4805532, -2660732, 1586990, -4175245, 726923, 1108638, -945967, 2062658, +-858457, -15761993, 2145873, 4093104, -1354525, -1097901, -9254581, -3339337, 2088965, -7655243, +-7983271, 1848983, -7618198, -3448859, -558346, -4100620, 2090575, -3181497, 5054103, -2609730, +-2276870, 1970853, 3406983, 7283728, 3995930, -7607461, -834834, -353798, 3453154, 6019934, +9435506, -4169340, -4298726, 5309654, -5812702, 1442035, 1112397, 8509941, 2615635, 4820564, +-6637335, -2576444, -8903467, 6846178, 6563247, 8198556, -574452, -1601486, -5846524, -1012002, +4968741, -2403571, -3923990, -3106872, -4681515, 1001801, 558346, 1345399, -6230387, -14496, +-6103149, -255014, -1255741, 2357937, 1615982, -1709934, -2937221, -7173133, -741956, -548145, +4168803, -2743947, 7177964, -4141959, 820339, 3537443, 6702834, -4945118, 587874, 19498614, +17476222, -1027034, 912144, 8463233, 1612223, 3928821, -2265059, 4450660, -3361349, 8537321, +3460670, -416612, 2218351, 191126, 11733314, 7224672, -7057705, -6637872, 2791729, 753767, +-2008434, -2065879, 1811939, 4987531, 4409858, 2025614, 949188, 2410014, -1532230, -616865, +6611566, -7341173, 3113315, 7872675, 6615324, 10870562, -768799, -2212982, -645856, 224949, +-3284039, 11840688, 11642583, 7579007, -3431142, -1631014, 5132486, 3406983, -3134789, 255014, +6782290, -2940442, -2728915, 3592740, -11701102, -1923609, 942208, 1231045, -3795141, -8375186, +3446175, 4827007, -6157910, -2908767, -6748468, 2058900, 628676, -1969243, -1416266, -6528351, +10109279, -3080565, 1155883, -10566693, -3020973, -4539781, 13015362, -418222, 8183524, 11404749, +-6089190, -13865765, 469225, 10673531, -8330626, 7507603, -2346126, -10036802, -4794257, 10207527, +-10071698, -8727374, 6233608, -10106058, 3219078, 4853313, 3811247, -2864206, 5966247, 1731946, +973884, 3941169, -6660421, 8804683, 4147328, 3803194, -2024540, -1023276, 16234440, -5808407, +801011, 4219269, 8046085, -11320460, -9498320, -8711267, 83752, 537945, -836982, 5119601, +1357747, 9213242, 3477313, 5330055, -1175747, 570694, -4927938, 8169028, -4105452, 8035347, +-4832912, -7326141, 11893838, 9705015, -14469208, -12710419, -8577050, -6698002, 4009352, 364535, +-3309272, 6105833, 6662031, -9004399, 4525822, -1170916, -17747878, -6213744, -9274982, -8463770, +2338610, -3327526, -7707319, -10177999, 6001143, -5742372, -4672925, -3469260, -12403329, -1016297, +5147519, -3025268, -1004486, -4176856, 9728101, 1800665, 6094559, 5118528, -8337606, 8530879, +12113955, -3546569, -5346698, 1583232, -2439542, 5600101, -15618649, 6118718, 12983686, -1521492, +-4642323, -3543348, 5472862, 12129525, -3126736, 3237332, -5616744, 8377334, -10133438, -3536369, +1586990, -1313723, -7946763, 14242648, 9553618, 7617662, -3468186, -10365367, -1655710, -14818711, +2228014, -906238, -857383, -137976, -2655901, 8300561, 6483253, -10282689, 5405217, -6114423, +8180839, -681289, -2221572, -630823, -9640054, -1690607, -8872866, -18441516, -1415192, 2128693, +833761, -7182796, -920197, -2211908, -14528264, -28991, 11184632, -8032126, 2303176, -19401442, +1384053, 11298448, 6203544, -8832063, -7142531, 14181445, 3324305, 3202972, -2733747, 3692598, +-76236, -9445707, -2392297, -9914932, 4798016, -5883569, -806380, -9645423, -10625749, -14372571, +9154186, 6164352, -4496294, -5071820, 4202089, -13174275, -1051193, 1085553, 3374234, 5918465, +3031710, 471373, -4386236, 2032593, -3995930, 3606699, -3808026, 2423435, 1476395, -4081293, +-5185636, -10267119, -6567005, 2750927, -17419850, -4708358, 10056666, 5301601, -1784022, 23268522, +-2969433, 10844256, 11014981, -16749299, 1542430, -2128693, -13768591, -7349763, -7321309, 337692, +2234994, 16064251, -1953136, 1581085, 11526082, 8046621, -1128503, 10748156, -4258460, -4092567, +-6222334, -9822590, -12746926, -5740224, 9500468, -15567646, 1675037, 12779138, -1743757, 3760781, +-5921686, 3316789, 6191732, -3923990, 5396090, -7881802, -7477538, 11875048, 7385197, 7508677, +10521596, -505196, -7436736, 10225243, -8654896, -12994424, 888521, 11355894, -967441, -10618233, +2137283, 13461501, -1238561, 3416110, 2120640, 19069118, 2026688, 3792993, 10413685, -1578937, +-4128537, -9664750, 2177549, -1628866, -8070781, -33286, -4366908, 3257733, 14121316, -170725, +-6989523, -2649458, -6381785, -4204773, -123480, -3380676, 2843268, -10089415, 11654931, -5823439, +18973018, -4732517, -11778411, 517544, 1859721, 6113886, 3986267, 3215857, -11949673, -10982768, +9200357, -11432129, -14138495, 4260071, 4683662, -3814468, 18578954, -14096620, -17261474, 6585796, +-11142219, 140123, 767189, -10328859, 5690832, 611496, 14078903, 14861124, 21342766, 9789841, +4455492, 2974802, 6958384, -7287486, 8045548, -12923557, 6152004, -1289564, -1245541, -24776592, +-9744207, -4102768, 8236137, -1106491, 1832877, 2626373, 2009508, -12709882, 12825846, -565325, +5041218, 358093, 11899744, -13206488, 8778376, -6541235, -689342, 9797894, -11646341, -5124433, +-12692165, -4983236, -14123463, 12301860, 8593693, 16559783, -1401770, 3817689, -15832323, 3323768, +-16449725, 15163919, 3569118, -2639794, 13662291, 14633490, 6641630, -8986145, -14176076, -19137300, +-1965484, -6904697, -10807748, 10079751, -4235912, 23727546, -19332722, -6720013, 11880953, -14565845, +-7783555, 2968359, -2240362, -2474975, -16765942, 5754720, -1654636, -8212515, 502511, 4224101, +3391951, 21974126, -4850629, 2799245, -976568, -7719130, 10189273, -4060355, 3868692, 773094, +14461155, -4961761, 16813186, -201327, 8399345, 6874632, -1260036, -5951214, -16237661, 7159174, +16935592, 295279, -142271, 11127723, 9911711, -1377611, 1752884, 19472308, 12510166, -4372277, +4238059, 12500502, -3526705, -15469935, 129923, -11486353, -1938104, -7623030, 326954, -21210696, +-6400575, -8347806, -35433, 3255048, 3850438, 18708878, 21355114, 10417980, -15626702, -10058813, +11687680, 16002511, 2998424, -16998944, -3293703, -5077188, -17180406, -11790759, -13283797, 13639742, +-6638946, 434865, -16515760, 20673288, 15348603, -3809099, 5451387, 35112432, -3520800, -10087804, +-16303159, -3745748, 7381438, 4203163, -9384504, 5432060, -10714870, -14980309, 19808926, -11994233, +14670535, -10394895, -18372260, 1980517, 20577188, 15092515, -17131550, -9567040, 2608119, 4350802, +6244346, -103616, 13376139, 8872329, 17977122, -5774584, -4264903, 507343, -4757213, -17172890, +-14597520, -3044058, 18106508, 5192079, 458488, 1860795, -18894098, -19107236, -16744467, 9351218, +8256001, -5709622, -5600101, 3030636, 1201517, -9573482, 2132988, 21488796, 2565169, 13955422, +11476153, 10256382, 20736102, 32466194, 9287330, 1892470, 3561602, 13668733, -7401840, -2058363, +7387881, -1378148, 3563212, -1419487, 12611098, 6261526, 8718247, -1111860, -4351876, 8411157, +17231408, 324270, -15422154, 11121818, -23692650, -24975234, -9736691, 15685757, -9438191, -24478630, +-16585553, -4565550, 9290551, 8373576, -37216964, 1978369, 19024020, -3496104, -4286378, 22972170, +-12128451, -12668543, -15996069, -5303211, -5235565, -10701985, 3474629, 5386963, 9150965, 6404333, +-4847408, -3908957, -1459215, -4373888, 1941325, 4561256, 19124952, -7743289, -23735600, 13238163, +609885, -390842, -19589882, 9327595, 4489852, -1705102, 23554674, -6156836, 3153580, -1686848, +10814191, 12669617, -12678207, -821413, -6744710, -346282, 7690139, -4516695, 11381663, -15790984, +-12753905, -8029978, -13639206, -1886028, 2355790, 2953864, -19356880, -12715788, 10868415, 17235704, +-6628209, -8439074, 9929428, -17894444, -15627775, -15575162, 19434190, -29581050, 11353209, -766652, +-16419123, -4845260, 16772384, 39581344, -3512210, -9830106, 14463302, 30458298, 12284680, -6190659, +6954626, -3959960, -19252728, -35203164, -222265, 36652716, -4421132, -4479651, -23649700, -3649649, +30602, 908386, 10123238, -580357, 8711267, -1236951, 1318555, -19819664, 4314295, 14710263, +-9364639, 18660022, -6849936, -3010772, -16332687, 9837623, -7246147, -7610682, -19099182, -30058328, +16241419, -15577846, -11802033, 3195456, 4715337, -7869991, 3218004, 14243185, -2910377, -17081084, +-7632694, -21380348, -512712, 3791919, 15470472, 961536, -2048699, -5187247, -6133214, 2852932, +16103980, 469225, -6746857, 14138495, -13218836, -259846, -24248312, -9720048, -2907156, 30628486, +-18228378, 4656819, -4196720, 2231773, -1145146, -5746666, 3483219, 11078331, 7141457, -26317412, +29945048, 5707475, 13507672, 922344, -5527623, -10596221, 4126927, -16934520, -9346923, 35213364, +-3969624, 2659122, -18031884, 16273631, -9114457, 11903502, -9200357, 21151640, 2627446, 1887638, +-9936407, -8834211, 13001940, 27496918, -11067594, -17245904, 8506183, -6976638, 18859202, 22855132, +11959336, -3789235, 14875619, -9833328, -8300025, 19139984, 27353572, -30302068, 3033858, 4146254, +5662915, -10478646, -112206, 11766063, -29700772, 8759586, 18319646, 6308233, -12862353, -4093641, +22373022, 17434882, 6560026, -10625749, -12720083, -26629870, 38073812, 6356552, 19907710, -3234110, +-7284265, 3735011, 11892764, -126165, 105764, -30988190, 5445482, 28212566, -4398584, 26973468, +-15775415, -8053064, -10754061, 5734855, 26710402, -8938364, 60666, 22562000, 29461328, -10377715, +-20074678, -19907174, -15415174, 14716705, 9834401, 25524454, -8157217, 18617072, -10197863, -3315178, +16174847, -79457, 22258668, -27198418, 16646756, 3614752, 6986301, -10691247, 7652558, 21065204, +39374112, -8831527, 9400610, -168577, -27462020, 24800752, 1615982, 9913321, -5757404, -12115566, +-5556077, -680215, -11293080, -6167573, 33089502, 2703145, 12077448, -9443022, 23090282, 437013, +10612864, 5248987, -15279883, -2721936, -9907953, 550830, 3132105, 28851442, 13256417, 1497870, +2061584, -714038, -3749507, 4989679, 1421634, 18209588, 13084081, 7672959, -10042707, 12788265, +24536074, -24272470, 21257940, 4117263, 5196374, -24289650, -13505525, -30570504, -26900454, -4278861, +14994268, 14812805, -44913548, 718870, -21072184, 11590506, 41873784, 23535348, -27887222, 17934710, +10799158, 14457397, -36700496, -55248848, -15037754, -5845451, -14263050, 3512210, 18274548, -19215684, +27827094, 10775536, -41375568, -30951144, -6809671, 22735946, 279173, 2253784, -4800700, -12576201, +-40068288, 1990181, -33745020, -27173184, 12976707, 11052025, 9252433, -4325569, -13392782, 30278446, +17462800, -12419435, -26404386, 20067160, 9521406, 4926328, -12658342, -30096984, 11086384, -14017700, +4118337, -25639882, 31003758, 966905, -12979391, 3229816, 7540889, 26053272, 15863462, -6527277, +-1598802, 9159018, 8718247, 10038412, -6112812, -40514964, -32034014, 6434935, -4473746, 23678692, +-4553739, -10263898, -28502476, 33105608, 12972949, -23303956, -23507430, 33901788, 32530082, -531502, +24288576, -3321620, 2020782, -9827422, -4198868, -18304614, 2832531, 19803020, 1638530, -13492103, +-35641248, 56035900, 1127966, -42862164, -3543348, -15785615, 7013682, 21673478, 19157164, -23725400, +-38793220, 6850473, -18718004, 6147172, -4044786, 17253420, -5866389, 2704219, 9791989, -15455440, +-19589882, 2317135, 4761508, 17091822, -691490, -26614302, 17381196, -14716705, 13588740, -12751221, +-9197136, -1177895, -4595078, -28622736, 5099200, 8376797, -28297928, 12127914, -11336566, 5907728, +-9686225, 27322972, 20665236, -26918708, -14834817, 18926848, 22919556, -27539868, 36388572, 2725694, +29205240, 21873194, 34520800, -10458245, -15299747, 8216810, -29498372, 4807679, 3148748, 51327544, +-16346646, -47485160, 80240728, -37783900, -30023968, 47024524, 20352776, -26765162, 44542568, 5479842, +-37595996, 46370616, -49913424, 6663642, 15328201, -37949796, 17521856, 9678709, -12918725, -4051228, +-371515, -9525164, -2737505, -5706401, -16494822, 168577, -8075613, -2156611, -3819300, 7864622, +30303678, 24786794, -22828288, -2888366, 31884226, -5872294, -5597416, -32639604, 4068945, 10231149, +-4935455, 27128624, 66309464, -22588306, -27435178, 46538120, -2764348, -25763362, 29683056, 18824842, +-14809584, -23240604, -27711666, 8046621, 15494095, -13084618, 44672492, 28267864, -54752244, -53608708, +31328028, -25626996, -31817118, 41114648, 7218230, 55225228, 27397596, -7712151, -7033009, -41456636, +-31019328, 90947544, 25956098, -21017960, -44009992, -192200, -17602386, -41439456, -5652177, 44704168, +20365124, -1675574, 38866768, 30794916, -10233833, -46171972, 6851547, 21074868, -9993315, 50954420, +40550932, -10078678, 28529320, 4103841, -23940148, 15752866, 24228448, 9509058, 9910100, -31955094, +-7729868, 4979478, 5683853, -3744138, -29742648, -9213779, 9353902, -5842766, -4070019, -23139136, +36301600, 5870147, -31831076, 18664318, 42777336, -21372294, -14239964, 7682623, 13377749, -12837120, +-28692530, 24999930, 38743288, -1832340, -16814260, 6573448, 10119480, 19591494, 24341728, 3155727, +45258216, 478352, -53036940, 1970316, -7136088, 18505940, -6772090, -40597640, -2575907, -16520055, +-19297824, 27184458, 11805254, 16360604, 16611860, -35912904, -21529598, -4579509, -2333241, 17487496, +-1429150, -5421860, -1066763, -10487773, -28169616, 5184026, 37535868, -17719962, 818728, -12783433, +-15054397, 31217970, -38269232, 4234838, 8467528, -4952634, -5947456, -42703788, -62617400, -54405424, +109587704, 105618616, 104272680, 296885856, 104493872, -12071542, 18526342, -205066976, -250946880, -83988624, +-141394624, -194431024, 23682986, -11024644, -33920040, 213627376, 129088464, 54110144, 332514208, 157201712, +27422292, 151690192, -38000796, -182571536, -176092048, -166758016, -231985680, -226070976, -55116240, -82383376, +-134922096, 153457040, 68694784, -57151520, 220734480, 70602816, -29147258, 250920048, 227108208, 51107964, +235593984, 240281408, -12815646, 57870388, 23681376, -235844176, -274841408, -204495744, -385568864, -364145568, +-221490928, -293008576, -222867456, 20933670, 173680432, 199085696, 430848576, 392473568, 343708512, 372108992, +271181024, 135495488, 35293356, -37142876, -221325040, -263687904, -284140000, -317551616, -304279104, -259293088, +-173356160, -126398200, -124485872, 23753854, 81166288, 74898328, 19959786, 0, 0, 0, +0, 0, 0, }, }, { { 2406792, -241592, 2704756, -2811056, -4813585, -194884, -3294777, -300111, -868120, -7608535, -6163815, --1093069, -2480881, 3034395, -1336809, 1396938, 1696512, 656056, -1179505, -44023, -2864743, -172336, 3119220, 1845762, -1472100, 82141, 1650878, -4111894, -1278290, 312996, 1671279, --1730335, -3926137, -1023813, -3874597, 589484, -1642825, -1633161, 1837709, -2043331, 1550483, -819802, 1028645, -3154654, 973884, 186294, 1679869, -2723009, 1590212, 1247688, 2509335, --673773, 3206193, 1557463, 3257196, 1826435, -2621541, -1370632, 6327024, 753767, -858993, -441845, -52076, 3707094, 119722, -2083596, -1013075, 4282083, -1893544, -914828, -4538170, --466004, -1688459, 1822140, -378494, -469762, -1940788, -3853660, 13997835, 7126962, 6266358, -3201361, -1299228, -634581, -1255741, -3083250, -3836480, -3036542, -3928821, -1942399, 4026532, -1099512, -64425, -235149, 2678449, 947040, -1482301, -1977833, -1182727, -7457137, 3103651, -496606, 181999, -1752884, 1041530, -147103, -1890859, 756988, 2733210, -301721, -3200288, --1138166, -1337882, -1841467, 484258, 2849711, -747861, 417149, -3699578, 2075006, -4592394, -2609730, 712428, -194347, 85899, 2565169, -3528853, -3054259, -4831302, 872415, 907849, --200790, 2805688, -3467112, 669478, -900869, 96100, -2710124, 1940788, 326418, -1605244, -2405719, -4778688, 1547799, -2601140, 4171487, 2243584, 71941, 393526, -1866700, -5873368, -3508988, -1176284, 12961138, 6540162, 8377871, 2611877, 2688650, -250182, 3131568, 606664, -2757369, -1956895, 5606543, -1227824, -6921877, -1574106, -102542, 626528, -2360622, 5385352, -45097, 2265059, 4713727, 2689187, -180389, 260919, 943282, -4247186, -3224447, 2068027, -1918777, -1369021, 235686, 2486249, -4716948, 6598681, -884763, 1213865, -1239098, 2631741, -3022583, 451508, -3663607, -3204046, 6616934, 447750, -2242510, 7516, 3708168, 3220689, --2281702, -2445984, -6290517, -1567126, -2726231, 566399, -2488934, 860604, -6126771, -2073396, -425739, -2059437, 1032403, 2713883, -1457068, 198105, 839666, -1121523, 2032593, 221728, -2620467, 457414, -1299765, -2910377, 79994, -3634616, 1032940, 848256, 2986613, -9110699, --2680597, -2234994, 1746978, 1549946, -5896453, -2942590, -1012002, 1248762, 3433826, 804233, -4635881, -3882651, -5102421, 1314797, 375810, -1174137, -3432753, 11545946, -417149, 2902861, -900869, 134755, -66572, -2049773, -4276177, -3753265, -899796, 2763275, -2298881, 5914170, --1884417, -830002, -4847408, -6273337, -311922, -4102231, -1925219, 7923678, -4271882, -1525250, --4139275, 1302449, 421444, -1880122, -4355097, -1184337, 258235, -5515275, 835371, -3133179, -4379256, 2374580, -2158758, -1646046, -1085553, 877784, 13959, 2879239, -1459215, -2614025, --1971927, 6995428, 7012608, -2840047, -6234145, 307627, 2291365, -850940, 2202245, -3437585, -836445, -4017942, 2555506, -1015760, 7474854, 1490891, -29103772, -4935455, -8248485, -9767829, -2771865, -3431679, -8130910, -7092602, 1357210, -6990060, 1169842, 9950902, -2313377, 4162897, -3509525, 8360691, 2436857, -6146635, 1584306, 9101573, -4115653, 4432943, -6629819, -6445136, -2282775, 2468533, 7543573, 228707, -4235375, 4037806, -2754685, 3047816, -118648, 4398584, --3642132, -2751464, -4086125, -164819, 1075352, -1936493, 3641059, -7929584, 1292248, 7515656, -1993939, -2454574, 3313031, -4232691, -1673964, -9992778, -2526515, -616328, 1888175, -147640, -5604396, -8132521, 1163399, -1428614, 4357245, 1712618, -1053341, 5131949, -4387309, -1126892, --3386582, -8023536, -2585570, -2328946, -1486596, 4929549, -4333085, -8951786, 1153199, 1567663, -225486, -14581414, 8320963, 9363029, -502511, 5251672, 2397129, 11059541, 14716169, 1882269, -1931662, 4212826, 1834488, 2436857, -2084133, 2900714, -2418067, 3853660, 4509179, -12616466, -6540162, -1399623, -2326262, -3919158, -5092758, 2037425, 3594351, 5711233, 1134408, 947040, --7342247, 288837, -2128156, -2494839, -1067299, 943282, 450972, -607738, 7264937, -425202, --2365990, 2336999, -2771328, 3650722, 4934918, 5405753, 2895345, 532576, -2981244, 6035503, -2012729, 745714, 723165, 722091, 537945, -3621194, -4865124, 4427038, -4508642, 4231617, -4106526, 2798171, -460098, -3389803, 3172907, 3730716, 8790724, 3817152, 3532611, 1870995, --7962333, -2703145, 1517197, -1508070, 4250944, -7394323, 1329829, 26977226, 8202314, 1942399, -5334887, 13452911, 5490042, 16231218, 4032438, -3660386, -1131724, -1435593, -1522029, 4349192, -7013682, -3320547, 1526324, 4790499, -1786706, -6853694, 5400922, -721018, 2573759, -2393371, --3387656, 5448703, 1299228, -600222, -1571958, -6263673, -3052111, 3245385, 833761, -2221035, --1090922, 834297, 2310693, 6104223, 1945620, -5825587, -1333587, 263604, -1822140, 1950452, -2914135, -5874442, -6993818, -514859, 1708323, -850404, 5337571, -10035191, -2151779, -4614406, --5632850, -726923, -484794, 1351841, 5258651, -166430, 740882, 1604170, -920734, 6974490, -4459250, -5929203, -5167920, 3773666, 8521752, -854162, -4079145, 8351564, 4417374, 1831267, --3790846, 12896713, 6802155, 11567958, -3678103, -287226, -2694018, 11640435, -12043625, -2160369, -3499862, -2783676, -2129767, 3607773, -1075889, -4247723, 10866804, 5525476, 1517197, 17386564, --4580583, -1651415, -3489124, -339839, 3227131, -5093295, -318364, -2891587, 7075422, -6271726, -1792612, -128849, -1555852, 76236, 4248260, 2167348, -5178120, -10026601, 454193, 1347009, -8046085, 8562554, 9352828, 193810, -5061619, 5911486, -15749645, -3313031, -6075231, -9998684, -6671158, -2882997, -2839510, 4280472, -1683627, -3539590, 14057428, -697932, -3980898, 3933116, -482110, 2717104, 2805688, 776315, 8495445, -6175089, -3065533, -723702, -7239168, -1403381, -1323387, -3349001, 2374580, 2417530, 8662949, -5479305, 2573759, 4647692, 2928631, -20774220, --30985504, -5324686, 1643899, -615254, 970663, -1523103, -6115497, -3572339, -4843650, -1388885, -5186173, 5986111, -5333813, -8106751, 7050726, 1404991, -4278325, 344671, -574452, -4929549, --3960497, 11469710, 6012954, -6150393, 3316789, 1322313, 5097053, -5944772, 6856379, -6604586, -4781373, 3049964, -1195075, -3031173, 3175055, -12317429, -5929203, 7696582, 12470438, 6904160, --8323647, 329102, -5824513, 8280160, 1938104, 2270964, 841277, -6526740, 3526168, 10152229, -1402307, 7743826, 5615133, 3686693, 6051072, 12473659, -3086471, -12007118, 6271189, 348966, --2593087, 969052, 10895795, -3944391, -7009924, 4009352, -1602023, -811212, -2429878, -1176284, --2950106, -5240397, -2535641, 7611219, -9346923, -5521181, 1473711, -12061342, -7698192, 1911261, -2001455, 15828565, -13857175, -9654550, -5310190, -2758443, -1663226, 5028333, 5040144, -7510824, -7632694, -1893007, 3479461, -5454072, 11336566, -2340757, -4236985, 7162395, 5282810, 4102768, --7687992, -7384123, 9558450, -5164698, 2800856, 2183991, -3503083, 7976291, 2425583, -166430, -1744294, 5811628, 7582765, 2202245, -6910603, 1426466, -9839770, 5644124, 2398202, -11041824, -7558069, 1642288, -5847061, 9820443, 2957085, -2845416, 5570036, -1040993, 10729365, -2646774, --3078955, -2451890, -1810866, 14222247, 2602213, 161598, 3411278, -12098923, -8083129, -8209830, -239444, 7634841, 241055, 9524627, -13144211, -4873178, -8883603, -6911676, 16400869, -1342177, -4441533, 5415417, -16287053, 5187247, -7072738, 4079682, -4984847, 13196287, 2069101, -8982387, -1312649, -9156333, 7439420, 14582488, -12409771, 8289287, 2895345, -187905, 5838471, 15545097, --5978058, 165893, 4604205, -16594143, 893353, 7824357, -4750234, 5667210, 5878737, -2860985, -14985141, -7300371, -13689671, -5648419, 1578937, 580894, -2843268, -5651640, 4056597, 4030290, --35970, -9357660, -2286533, -2189897, 6381248, -3954054, 25233470, -2922188, 3602941, -900869, --1078037, -11985106, 1261647, 9364102, 7364795, 24915106, -2626909, -2091649, -5070209, -670015, --6893423, -214748, 9927817, -4939750, -960462, 2116345, 2400887, 10044855, 7981660, 2574833, -19155018, -3266323, -17568026, -17348446, -12382928, -2268280, 5623186, -1533303, -4858682, 28867012, --20871394, -15592879, -5219996, -9838696, -11572253, 13992467, 5403069, 2824478, -4657892, -2776696, -16601122, -4931696, -7440494, -20274394, -3282966, -569620, 9157944, 3425237, -4529043, 1119913, -7920994, 3629247, 4753992, 12763032, 15743739, 4290673, -6602976, 3936875, -10344429, 6409165, -4866198, -3811247, -325344, -7918309, 2361158, -187368, -15400142, 13862544, -2064269, -7121056, -7998303, -14077292, -4009889, 14374182, 7591892, -787053, -418222, -19438486, 5562520, 9806484, -4894652, 2742874, -2193118, -14673219, -41999948, -4113505, 6990060, 10529649, -2457258, -12950937, -18622978, -10399726, 7556458, 14091788, 10786273, 1088774, 13248363, 376883, 3248606, 1745904, -6758668, 209380, 18790, 17608292, -10226317, -6015639, 13573707, 14431627, -4387309, -6215355, --2134062, -3346317, 14933601, 10991895, -28192702, -2224256, 1433445, -12079596, 4302484, -17980344, -13455596, 4231617, -3008625, 8568460, 3073586, -3168612, -7098507, -3825205, 19345606, 1582159, --946503, 5225365, -3511673, 8837432, 22950694, 10433549, -4239670, -3431142, -4253092, 14501957, -4127464, 14668387, 8878234, 7689602, 3270081, -5323612, -7397008, 6936909, -14805289, 3127273, --8185134, -5550709, -206158, 10424959, 699006, 1462973, 2844342, -2398739, 15659988, 21756694, -23571318, 504122, 10471130, -13752485, 5021354, 8868034, -7050726, 12811351, -10256382, -19177028, -2255932, -9886478, -1813550, 1260036, -10606422, 2860985, 14253923, -8572755, -8278550, 7094749, -13786845, -1040456, -3228742, -16646219, 30662846, 2398739, 7636989, 24213416, -9248675, 2854543, --5003100, 6691559, -7332046, 7280507, -17221746, -19437412, -1097364, -11345693, -1399623, -688269, --1843615, -2946885, 748935, -5098126, 4427575, -15375446, -6854231, -20885352, -1635846, 5289252, -9637907, 23399518, 12160126, 4382478, 2330020, 7011534, 4473746, 4290136, 8644159, 10145250, --3754338, -19039590, -19972672, -12811351, -8615168, 2347737, 5762773, -6708202, -12074227, -19315004, --231928, -7117298, 17171816, -7608535, 3645890, -13269301, -7533910, -1973538, -6608881, -26035018, --28608240, 7990250, 1715839, 1142998, 12952011, 8492224, 10071161, 9564355, -18563922, -3331284, -30698278, -5580773, -13881334, 5093295, -9003325, 3603478, -22107808, 8318278, -11836393, 4241280, -18926848, 13588203, 2282775, 14455786, -2360085, -6582575, 8609799, -11890617, -21855478, -33794412, -3199751, 194884, 13272523, 8881992, -12016782, -6890202, -32139240, -2739116, -14770393, 2963528, --7253126, -4227859, -5894843, -3019362, -2177549, -11924977, -4730907, -13814762, 10850161, -3314641, -9330280, 22608170, -11970611, 5985574, -1578401, -6531572, 6333466, -13241921, -20876762, 9374303, -5306969, 9287867, 6657200, -45287744, -19839528, 5010080, -14461155, -2204392, -12306692, 17593796, -22717692, -2141041, 25081536, 2394444, 11581379, -4424890, -472983, -15066208, 9125195, 16594143, -4248797, 28408524, 1093069, 2615098, -8335995, -14703821, 18076980, 26206280, 10241350, 3490198, -3287261, 8395050, 1510218, -470299, -25477210, -17845590, -8159901, -32974612, -40134320, -30504468, --13312788, 8759586, 151934, -7572564, -14404783, -411780, 27173184, 12660490, -23004918, -4301947, --4437775, -16996260, -2552284, 766652, 11660299, 7839389, -17077326, 12088722, -9483825, 4861366, --8814347, 2312840, -13010530, -5477694, 6993281, -24659018, -4263829, -9603547, 8289824, -6512244, --21998822, 25779468, 25672630, -165356, -9920838, 13798119, -33929168, -11253888, 10488310, -12060268, --7000797, -1437203, -10812580, 1626182, -2620467, -23535348, 10051834, -3529926, -6885370, -8480413, --5931350, -2092723, -6200322, -10421201, 19071266, -9798431, -9044664, 8274792, -373125, 30400316, --6499360, -20309826, 10679436, -11173357, -9207336, -16343424, 9554692, 17774722, -39045012, 956167, -29328184, -8668318, -26057030, 51675436, 36187784, -275415, -10143102, 8573292, -31092878, 964757, -37918120, -6273337, -13627931, 1116155, 43044700, -5699959, 9215926, -8694624, -19901268, -15310485, --4291746, -6677601, 7720741, 11676942, 343597, -15704011, -23095650, -20381768, -3633006, -3957812, --11565273, 11307038, 8372502, -8471286, -11422466, -11487964, 6679211, 3174518, 8262980, 22484154, --320512, -17651778, 12382928, 5843303, 4062502, 2246268, -526134, -7950522, 15860240, 9226663, --6601902, -6600828, -5266704, -19916838, 5611375, 16571594, 4480725, -13507135, 17018808, 13911399, -6896644, 3263638, -9310952, 6152541, -30274688, 6174016, -2217814, 28311350, -10038412, -11586748, -5130876, -5166309, -1285806, -17495012, -4539244, -3275986, 24288040, -14925548, -35012572, -13083007, -48520784, 2118493, 7902203, -7930657, -16156593, -21281026, -7281044, 6303402, 14100378, 12058658, --10488847, 201327, -21665426, -7580081, 7537668, -17810156, -9883257, -6541235, 26112864, 14069239, -14288282, 14048301, -15427523, 3205656, 5327907, 6646462, -1684701, 18206904, -4136591, 8315057, -13509283, 5816997, 3549791, 12213813, 15669651, -8778913, -19102404, 13229573, -2403034, 790811, --20247012, -17676474, 3792456, -8383240, -7696045, 17149804, -17289390, 22461068, 13204877, -8431558, -10566693, -11382737, -13506598, -14042932, 21212844, -14101451, 5895380, 8348880, -26651346, 4166118, -1480690, -18082886, -36258652, -28675350, 20475182, -20692616, -2857227, -17951890, -7785702, -11463805, --4959077, 13897440, 1109175, -9687836, 9076340, 26416196, 26193394, 25622164, -9109089, 223875, --20653424, -936303, 4440460, 3653944, -17999672, -20136954, -30166240, 21217676, 3236795, 7102802, --4038880, 11191611, -7378754, -8578660, 7646116, 16331076, 5134097, 10767483, 34858492, -4831838, --18816788, -42890616, -4634270, -16440061, -6611029, -9989020, -18328772, -13734232, -28107340, -3049427, -1341640, 10946798, 32822676, -25150792, -7930120, -3541201, 12214887, 11753178, 32830730, 5077188, --32700808, -7012608, 9595494, 28526100, 9725417, -41104984, -14323716, 39802000, 6312528, 39868572, --19544786, 3009698, 6142877, 25134686, 1178432, 23267986, 35306240, 6930467, 30721902, 21623012, -8604430, 40373228, 36217848, 13792214, 54392004, 42121820, 29000692, -35771172, 2875481, 21097954, -15159087, 5941014, -22724136, -26813480, -11196980, 9338870, -29704530, 31659814, -14780593, 21501680, -7524246, -22612466, 1739462, 17690434, -11664057, -23628762, 15312095, -4671851, 12870406, -6299644, -1969243, 8451422, -17712446, 613643, -8733816, 2211908, -27783070, -17945984, 23825794, 3820374, -8735963, -17356500, 19291382, 21333102, -15424301, 14645838, -21684216, -1495722, -12700755, 17658222, -34876744, 2345052, 42652248, -8057896, -3244848, 5203890, 3406983, 171799, -25752624, 46275052, -27132920, -54761, 22725746, 21805548, 23715198, -5858336, -1222992, -40235792, 19221052, 24143622, --6118181, -3872450, 27079768, 18112414, 14301167, 37737192, 5747740, -13806709, -20830592, 10058813, --6097243, -21560736, 21665426, -25713970, 2498060, 9557913, -18938658, -29949880, -19534048, -7334194, -5667746, 21638046, -34846144, 18933290, 34573948, -2678449, 39526584, 9286793, -30623116, -22164716, --601295, -13444858, -17873506, 18852222, 26477400, -4500052, 19011136, 20847772, -16232292, 14053133, -29496224, -3865471, -35321812, 12418898, 850404, -9615358, 12178917, 25873420, -7082938, -16433619, -8793946, -14621142, -14257681, -3442953, 26600880, 18760418, -33212446, 8795019, 16910360, -25963614, --13172128, 26029650, -5850819, -43827992, -3383897, 32311038, -9444096, -62300112, 64623152, -20391430, --5299990, -33503966, 42460048, 10566156, -11990475, 26792542, -15338402, -15687368, -5541582, 72640248, -27240294, -34441344, -25836376, 25993678, -4538170, 39085276, 3018825, 28465432, -41175316, 31482648, -62420908, 2182917, -3776350, -14314052, -7494181, -28122908, 60033444, 32836098, -28589986, 26800596, -62093416, 11717208, -23668492, -5935108, -5616207, 10613938, 9558450, -19541028, -27285390, 7122130, --23051626, 4415764, -14254460, -16898012, -3375844, 2617783, 8155069, -18796388, -7263327, -7567196, --22898082, 19224810, -7037841, 1073205, -3195993, -15607911, 6359236, 4185446, 766115, -3483219, -395137, -702227, -8913131, -19767050, 8607114, -9862856, 8717710, 5891622, -19446002, -15978889, --1630477, -2352032, -2075543, -4269735, 16152835, -11105712, 1770600, -20864952, 17918604, -20421496, --10717554, 10191421, 362925, -16316044, 13072270, -21930104, 1709934, 6746320, -572841, 2559264, -10539850, 5195300, -22716082, 11709155, 1573569, -13420162, 19432580, 7978439, -21513492, -2011655, --17022030, -1926293, 7458211, 5865852, -20632486, 25733834, -36866388, -46635292, -16768089, 139707776, -112267224, 73978664, 135693584, -54192824, -128086128, -41507100, -207131776, -81186160, 5935645, -49030272, -95090040, 129360120, 21248276, 82027432, 141749488, 2546379, 39017092, -9804337, -166732784, -138470288, --104308112, -104123968, -51167556, 78373488, 42266772, 60453812, 173771152, 73049344, 10492068, 103397040, -48080548, -60544544, 19915226, -50980724, -169347872, -41613400, -88771072, -175013472, -29521994, 2915746, --43189116, 116514944, 135098192, 52311092, 158905744, 160296240, 29229400, 60841432, 26987964, -103806672, --115757424, -108985872, -194230768, -172377968, -66453344, -81277424, 15010911, 100990784, 139574624, 114286392, -178541792, 131085088, 69427608, 6489696, -25514790, -108342696, -130485400, -98752032, -115805744, -99387688, --9206799, -13757317, 16040092, 73951824, 14881525, 7090991, 0, 0, 0, 0, -0, 0, 0, }, +241592, 2704756, -2811056, -4813585, -194884, -3294777, -300111, -868120, -7608535, -6163815, +-1093069, -2480881, 3034395, -1336809, 1396938, 1696512, 656056, -1179505, -44023, -2864743, +172336, 3119220, 1845762, -1472100, 82141, 1650878, -4111894, -1278290, 312996, 1671279, +-1730335, -3926137, -1023813, -3874597, 589484, -1642825, -1633161, 1837709, -2043331, 1550483, +819802, 1028645, -3154654, 973884, 186294, 1679869, -2723009, 1590212, 1247688, 2509335, +-673773, 3206193, 1557463, 3257196, 1826435, -2621541, -1370632, 6327024, 753767, -858993, +441845, -52076, 3707094, 119722, -2083596, -1013075, 4282083, -1893544, -914828, -4538170, +-466004, -1688459, 1822140, -378494, -469762, -1940788, -3853660, 13997835, 7126962, 6266358, +3201361, -1299228, -634581, -1255741, -3083250, -3836480, -3036542, -3928821, -1942399, 4026532, +1099512, -64425, -235149, 2678449, 947040, -1482301, -1977833, -1182727, -7457137, 3103651, +496606, 181999, -1752884, 1041530, -147103, -1890859, 756988, 2733210, -301721, -3200288, +-1138166, -1337882, -1841467, 484258, 2849711, -747861, 417149, -3699578, 2075006, -4592394, +2609730, 712428, -194347, 85899, 2565169, -3528853, -3054259, -4831302, 872415, 907849, +-200790, 2805688, -3467112, 669478, -900869, 96100, -2710124, 1940788, 326418, -1605244, +2405719, -4778688, 1547799, -2601140, 4171487, 2243584, 71941, 393526, -1866700, -5873368, +3508988, -1176284, 12961138, 6540162, 8377871, 2611877, 2688650, -250182, 3131568, 606664, +2757369, -1956895, 5606543, -1227824, -6921877, -1574106, -102542, 626528, -2360622, 5385352, +45097, 2265059, 4713727, 2689187, -180389, 260919, 943282, -4247186, -3224447, 2068027, +1918777, -1369021, 235686, 2486249, -4716948, 6598681, -884763, 1213865, -1239098, 2631741, +3022583, 451508, -3663607, -3204046, 6616934, 447750, -2242510, 7516, 3708168, 3220689, +-2281702, -2445984, -6290517, -1567126, -2726231, 566399, -2488934, 860604, -6126771, -2073396, +425739, -2059437, 1032403, 2713883, -1457068, 198105, 839666, -1121523, 2032593, 221728, +2620467, 457414, -1299765, -2910377, 79994, -3634616, 1032940, 848256, 2986613, -9110699, +-2680597, -2234994, 1746978, 1549946, -5896453, -2942590, -1012002, 1248762, 3433826, 804233, +4635881, -3882651, -5102421, 1314797, 375810, -1174137, -3432753, 11545946, -417149, 2902861, +900869, 134755, -66572, -2049773, -4276177, -3753265, -899796, 2763275, -2298881, 5914170, +-1884417, -830002, -4847408, -6273337, -311922, -4102231, -1925219, 7923678, -4271882, -1525250, +-4139275, 1302449, 421444, -1880122, -4355097, -1184337, 258235, -5515275, 835371, -3133179, +4379256, 2374580, -2158758, -1646046, -1085553, 877784, 13959, 2879239, -1459215, -2614025, +-1971927, 6995428, 7012608, -2840047, -6234145, 307627, 2291365, -850940, 2202245, -3437585, +836445, -4017942, 2555506, -1015760, 7474854, 1490891, -29103772, -4935455, -8248485, -9767829, +2771865, -3431679, -8130910, -7092602, 1357210, -6990060, 1169842, 9950902, -2313377, 4162897, +3509525, 8360691, 2436857, -6146635, 1584306, 9101573, -4115653, 4432943, -6629819, -6445136, +2282775, 2468533, 7543573, 228707, -4235375, 4037806, -2754685, 3047816, -118648, 4398584, +-3642132, -2751464, -4086125, -164819, 1075352, -1936493, 3641059, -7929584, 1292248, 7515656, +1993939, -2454574, 3313031, -4232691, -1673964, -9992778, -2526515, -616328, 1888175, -147640, +5604396, -8132521, 1163399, -1428614, 4357245, 1712618, -1053341, 5131949, -4387309, -1126892, +-3386582, -8023536, -2585570, -2328946, -1486596, 4929549, -4333085, -8951786, 1153199, 1567663, +225486, -14581414, 8320963, 9363029, -502511, 5251672, 2397129, 11059541, 14716169, 1882269, +1931662, 4212826, 1834488, 2436857, -2084133, 2900714, -2418067, 3853660, 4509179, -12616466, +6540162, -1399623, -2326262, -3919158, -5092758, 2037425, 3594351, 5711233, 1134408, 947040, +-7342247, 288837, -2128156, -2494839, -1067299, 943282, 450972, -607738, 7264937, -425202, +-2365990, 2336999, -2771328, 3650722, 4934918, 5405753, 2895345, 532576, -2981244, 6035503, +2012729, 745714, 723165, 722091, 537945, -3621194, -4865124, 4427038, -4508642, 4231617, +4106526, 2798171, -460098, -3389803, 3172907, 3730716, 8790724, 3817152, 3532611, 1870995, +-7962333, -2703145, 1517197, -1508070, 4250944, -7394323, 1329829, 26977226, 8202314, 1942399, +5334887, 13452911, 5490042, 16231218, 4032438, -3660386, -1131724, -1435593, -1522029, 4349192, +7013682, -3320547, 1526324, 4790499, -1786706, -6853694, 5400922, -721018, 2573759, -2393371, +-3387656, 5448703, 1299228, -600222, -1571958, -6263673, -3052111, 3245385, 833761, -2221035, +-1090922, 834297, 2310693, 6104223, 1945620, -5825587, -1333587, 263604, -1822140, 1950452, +2914135, -5874442, -6993818, -514859, 1708323, -850404, 5337571, -10035191, -2151779, -4614406, +-5632850, -726923, -484794, 1351841, 5258651, -166430, 740882, 1604170, -920734, 6974490, +4459250, -5929203, -5167920, 3773666, 8521752, -854162, -4079145, 8351564, 4417374, 1831267, +-3790846, 12896713, 6802155, 11567958, -3678103, -287226, -2694018, 11640435, -12043625, -2160369, +3499862, -2783676, -2129767, 3607773, -1075889, -4247723, 10866804, 5525476, 1517197, 17386564, +-4580583, -1651415, -3489124, -339839, 3227131, -5093295, -318364, -2891587, 7075422, -6271726, +1792612, -128849, -1555852, 76236, 4248260, 2167348, -5178120, -10026601, 454193, 1347009, +8046085, 8562554, 9352828, 193810, -5061619, 5911486, -15749645, -3313031, -6075231, -9998684, +6671158, -2882997, -2839510, 4280472, -1683627, -3539590, 14057428, -697932, -3980898, 3933116, +482110, 2717104, 2805688, 776315, 8495445, -6175089, -3065533, -723702, -7239168, -1403381, +1323387, -3349001, 2374580, 2417530, 8662949, -5479305, 2573759, 4647692, 2928631, -20774220, +-30985504, -5324686, 1643899, -615254, 970663, -1523103, -6115497, -3572339, -4843650, -1388885, +5186173, 5986111, -5333813, -8106751, 7050726, 1404991, -4278325, 344671, -574452, -4929549, +-3960497, 11469710, 6012954, -6150393, 3316789, 1322313, 5097053, -5944772, 6856379, -6604586, +4781373, 3049964, -1195075, -3031173, 3175055, -12317429, -5929203, 7696582, 12470438, 6904160, +-8323647, 329102, -5824513, 8280160, 1938104, 2270964, 841277, -6526740, 3526168, 10152229, +1402307, 7743826, 5615133, 3686693, 6051072, 12473659, -3086471, -12007118, 6271189, 348966, +-2593087, 969052, 10895795, -3944391, -7009924, 4009352, -1602023, -811212, -2429878, -1176284, +-2950106, -5240397, -2535641, 7611219, -9346923, -5521181, 1473711, -12061342, -7698192, 1911261, +2001455, 15828565, -13857175, -9654550, -5310190, -2758443, -1663226, 5028333, 5040144, -7510824, +7632694, -1893007, 3479461, -5454072, 11336566, -2340757, -4236985, 7162395, 5282810, 4102768, +-7687992, -7384123, 9558450, -5164698, 2800856, 2183991, -3503083, 7976291, 2425583, -166430, +1744294, 5811628, 7582765, 2202245, -6910603, 1426466, -9839770, 5644124, 2398202, -11041824, +7558069, 1642288, -5847061, 9820443, 2957085, -2845416, 5570036, -1040993, 10729365, -2646774, +-3078955, -2451890, -1810866, 14222247, 2602213, 161598, 3411278, -12098923, -8083129, -8209830, +239444, 7634841, 241055, 9524627, -13144211, -4873178, -8883603, -6911676, 16400869, -1342177, +4441533, 5415417, -16287053, 5187247, -7072738, 4079682, -4984847, 13196287, 2069101, -8982387, +1312649, -9156333, 7439420, 14582488, -12409771, 8289287, 2895345, -187905, 5838471, 15545097, +-5978058, 165893, 4604205, -16594143, 893353, 7824357, -4750234, 5667210, 5878737, -2860985, +14985141, -7300371, -13689671, -5648419, 1578937, 580894, -2843268, -5651640, 4056597, 4030290, +-35970, -9357660, -2286533, -2189897, 6381248, -3954054, 25233470, -2922188, 3602941, -900869, +-1078037, -11985106, 1261647, 9364102, 7364795, 24915106, -2626909, -2091649, -5070209, -670015, +-6893423, -214748, 9927817, -4939750, -960462, 2116345, 2400887, 10044855, 7981660, 2574833, +19155018, -3266323, -17568026, -17348446, -12382928, -2268280, 5623186, -1533303, -4858682, 28867012, +-20871394, -15592879, -5219996, -9838696, -11572253, 13992467, 5403069, 2824478, -4657892, -2776696, +16601122, -4931696, -7440494, -20274394, -3282966, -569620, 9157944, 3425237, -4529043, 1119913, +7920994, 3629247, 4753992, 12763032, 15743739, 4290673, -6602976, 3936875, -10344429, 6409165, +4866198, -3811247, -325344, -7918309, 2361158, -187368, -15400142, 13862544, -2064269, -7121056, +7998303, -14077292, -4009889, 14374182, 7591892, -787053, -418222, -19438486, 5562520, 9806484, +4894652, 2742874, -2193118, -14673219, -41999948, -4113505, 6990060, 10529649, -2457258, -12950937, +18622978, -10399726, 7556458, 14091788, 10786273, 1088774, 13248363, 376883, 3248606, 1745904, +6758668, 209380, 18790, 17608292, -10226317, -6015639, 13573707, 14431627, -4387309, -6215355, +-2134062, -3346317, 14933601, 10991895, -28192702, -2224256, 1433445, -12079596, 4302484, -17980344, +13455596, 4231617, -3008625, 8568460, 3073586, -3168612, -7098507, -3825205, 19345606, 1582159, +-946503, 5225365, -3511673, 8837432, 22950694, 10433549, -4239670, -3431142, -4253092, 14501957, +4127464, 14668387, 8878234, 7689602, 3270081, -5323612, -7397008, 6936909, -14805289, 3127273, +-8185134, -5550709, -206158, 10424959, 699006, 1462973, 2844342, -2398739, 15659988, 21756694, +23571318, 504122, 10471130, -13752485, 5021354, 8868034, -7050726, 12811351, -10256382, -19177028, +2255932, -9886478, -1813550, 1260036, -10606422, 2860985, 14253923, -8572755, -8278550, 7094749, +13786845, -1040456, -3228742, -16646219, 30662846, 2398739, 7636989, 24213416, -9248675, 2854543, +-5003100, 6691559, -7332046, 7280507, -17221746, -19437412, -1097364, -11345693, -1399623, -688269, +-1843615, -2946885, 748935, -5098126, 4427575, -15375446, -6854231, -20885352, -1635846, 5289252, +9637907, 23399518, 12160126, 4382478, 2330020, 7011534, 4473746, 4290136, 8644159, 10145250, +-3754338, -19039590, -19972672, -12811351, -8615168, 2347737, 5762773, -6708202, -12074227, -19315004, +-231928, -7117298, 17171816, -7608535, 3645890, -13269301, -7533910, -1973538, -6608881, -26035018, +-28608240, 7990250, 1715839, 1142998, 12952011, 8492224, 10071161, 9564355, -18563922, -3331284, +30698278, -5580773, -13881334, 5093295, -9003325, 3603478, -22107808, 8318278, -11836393, 4241280, +18926848, 13588203, 2282775, 14455786, -2360085, -6582575, 8609799, -11890617, -21855478, -33794412, +3199751, 194884, 13272523, 8881992, -12016782, -6890202, -32139240, -2739116, -14770393, 2963528, +-7253126, -4227859, -5894843, -3019362, -2177549, -11924977, -4730907, -13814762, 10850161, -3314641, +9330280, 22608170, -11970611, 5985574, -1578401, -6531572, 6333466, -13241921, -20876762, 9374303, +5306969, 9287867, 6657200, -45287744, -19839528, 5010080, -14461155, -2204392, -12306692, 17593796, +22717692, -2141041, 25081536, 2394444, 11581379, -4424890, -472983, -15066208, 9125195, 16594143, +4248797, 28408524, 1093069, 2615098, -8335995, -14703821, 18076980, 26206280, 10241350, 3490198, +3287261, 8395050, 1510218, -470299, -25477210, -17845590, -8159901, -32974612, -40134320, -30504468, +-13312788, 8759586, 151934, -7572564, -14404783, -411780, 27173184, 12660490, -23004918, -4301947, +-4437775, -16996260, -2552284, 766652, 11660299, 7839389, -17077326, 12088722, -9483825, 4861366, +-8814347, 2312840, -13010530, -5477694, 6993281, -24659018, -4263829, -9603547, 8289824, -6512244, +-21998822, 25779468, 25672630, -165356, -9920838, 13798119, -33929168, -11253888, 10488310, -12060268, +-7000797, -1437203, -10812580, 1626182, -2620467, -23535348, 10051834, -3529926, -6885370, -8480413, +-5931350, -2092723, -6200322, -10421201, 19071266, -9798431, -9044664, 8274792, -373125, 30400316, +-6499360, -20309826, 10679436, -11173357, -9207336, -16343424, 9554692, 17774722, -39045012, 956167, +29328184, -8668318, -26057030, 51675436, 36187784, -275415, -10143102, 8573292, -31092878, 964757, +37918120, -6273337, -13627931, 1116155, 43044700, -5699959, 9215926, -8694624, -19901268, -15310485, +-4291746, -6677601, 7720741, 11676942, 343597, -15704011, -23095650, -20381768, -3633006, -3957812, +-11565273, 11307038, 8372502, -8471286, -11422466, -11487964, 6679211, 3174518, 8262980, 22484154, +-320512, -17651778, 12382928, 5843303, 4062502, 2246268, -526134, -7950522, 15860240, 9226663, +-6601902, -6600828, -5266704, -19916838, 5611375, 16571594, 4480725, -13507135, 17018808, 13911399, +6896644, 3263638, -9310952, 6152541, -30274688, 6174016, -2217814, 28311350, -10038412, -11586748, +5130876, -5166309, -1285806, -17495012, -4539244, -3275986, 24288040, -14925548, -35012572, -13083007, +48520784, 2118493, 7902203, -7930657, -16156593, -21281026, -7281044, 6303402, 14100378, 12058658, +-10488847, 201327, -21665426, -7580081, 7537668, -17810156, -9883257, -6541235, 26112864, 14069239, +14288282, 14048301, -15427523, 3205656, 5327907, 6646462, -1684701, 18206904, -4136591, 8315057, +13509283, 5816997, 3549791, 12213813, 15669651, -8778913, -19102404, 13229573, -2403034, 790811, +-20247012, -17676474, 3792456, -8383240, -7696045, 17149804, -17289390, 22461068, 13204877, -8431558, +10566693, -11382737, -13506598, -14042932, 21212844, -14101451, 5895380, 8348880, -26651346, 4166118, +1480690, -18082886, -36258652, -28675350, 20475182, -20692616, -2857227, -17951890, -7785702, -11463805, +-4959077, 13897440, 1109175, -9687836, 9076340, 26416196, 26193394, 25622164, -9109089, 223875, +-20653424, -936303, 4440460, 3653944, -17999672, -20136954, -30166240, 21217676, 3236795, 7102802, +-4038880, 11191611, -7378754, -8578660, 7646116, 16331076, 5134097, 10767483, 34858492, -4831838, +-18816788, -42890616, -4634270, -16440061, -6611029, -9989020, -18328772, -13734232, -28107340, -3049427, +1341640, 10946798, 32822676, -25150792, -7930120, -3541201, 12214887, 11753178, 32830730, 5077188, +-32700808, -7012608, 9595494, 28526100, 9725417, -41104984, -14323716, 39802000, 6312528, 39868572, +-19544786, 3009698, 6142877, 25134686, 1178432, 23267986, 35306240, 6930467, 30721902, 21623012, +8604430, 40373228, 36217848, 13792214, 54392004, 42121820, 29000692, -35771172, 2875481, 21097954, +15159087, 5941014, -22724136, -26813480, -11196980, 9338870, -29704530, 31659814, -14780593, 21501680, +7524246, -22612466, 1739462, 17690434, -11664057, -23628762, 15312095, -4671851, 12870406, -6299644, +1969243, 8451422, -17712446, 613643, -8733816, 2211908, -27783070, -17945984, 23825794, 3820374, +8735963, -17356500, 19291382, 21333102, -15424301, 14645838, -21684216, -1495722, -12700755, 17658222, +34876744, 2345052, 42652248, -8057896, -3244848, 5203890, 3406983, 171799, -25752624, 46275052, +27132920, -54761, 22725746, 21805548, 23715198, -5858336, -1222992, -40235792, 19221052, 24143622, +-6118181, -3872450, 27079768, 18112414, 14301167, 37737192, 5747740, -13806709, -20830592, 10058813, +-6097243, -21560736, 21665426, -25713970, 2498060, 9557913, -18938658, -29949880, -19534048, -7334194, +5667746, 21638046, -34846144, 18933290, 34573948, -2678449, 39526584, 9286793, -30623116, -22164716, +-601295, -13444858, -17873506, 18852222, 26477400, -4500052, 19011136, 20847772, -16232292, 14053133, +29496224, -3865471, -35321812, 12418898, 850404, -9615358, 12178917, 25873420, -7082938, -16433619, +8793946, -14621142, -14257681, -3442953, 26600880, 18760418, -33212446, 8795019, 16910360, -25963614, +-13172128, 26029650, -5850819, -43827992, -3383897, 32311038, -9444096, -62300112, 64623152, -20391430, +-5299990, -33503966, 42460048, 10566156, -11990475, 26792542, -15338402, -15687368, -5541582, 72640248, +27240294, -34441344, -25836376, 25993678, -4538170, 39085276, 3018825, 28465432, -41175316, 31482648, +62420908, 2182917, -3776350, -14314052, -7494181, -28122908, 60033444, 32836098, -28589986, 26800596, +62093416, 11717208, -23668492, -5935108, -5616207, 10613938, 9558450, -19541028, -27285390, 7122130, +-23051626, 4415764, -14254460, -16898012, -3375844, 2617783, 8155069, -18796388, -7263327, -7567196, +-22898082, 19224810, -7037841, 1073205, -3195993, -15607911, 6359236, 4185446, 766115, -3483219, +395137, -702227, -8913131, -19767050, 8607114, -9862856, 8717710, 5891622, -19446002, -15978889, +-1630477, -2352032, -2075543, -4269735, 16152835, -11105712, 1770600, -20864952, 17918604, -20421496, +-10717554, 10191421, 362925, -16316044, 13072270, -21930104, 1709934, 6746320, -572841, 2559264, +10539850, 5195300, -22716082, 11709155, 1573569, -13420162, 19432580, 7978439, -21513492, -2011655, +-17022030, -1926293, 7458211, 5865852, -20632486, 25733834, -36866388, -46635292, -16768089, 139707776, +112267224, 73978664, 135693584, -54192824, -128086128, -41507100, -207131776, -81186160, 5935645, -49030272, +95090040, 129360120, 21248276, 82027432, 141749488, 2546379, 39017092, -9804337, -166732784, -138470288, +-104308112, -104123968, -51167556, 78373488, 42266772, 60453812, 173771152, 73049344, 10492068, 103397040, +48080548, -60544544, 19915226, -50980724, -169347872, -41613400, -88771072, -175013472, -29521994, 2915746, +-43189116, 116514944, 135098192, 52311092, 158905744, 160296240, 29229400, 60841432, 26987964, -103806672, +-115757424, -108985872, -194230768, -172377968, -66453344, -81277424, 15010911, 100990784, 139574624, 114286392, +178541792, 131085088, 69427608, 6489696, -25514790, -108342696, -130485400, -98752032, -115805744, -99387688, +-9206799, -13757317, 16040092, 73951824, 14881525, 7090991, 0, 0, 0, 0, +0, 0, 0, }, { 1680943, -1800128, 2106682, -2403034, -3902515, 656593, 2688113, -1779727, 1821603, -6285685, -3461744, --3566970, 304406, 941672, -2608656, -3248069, 1381369, 3463891, 161598, -1697049, -4660577, --2656974, 3657702, -747861, 173409, 1690070, -1887101, 1130650, -1387274, -2617783, -1802813, -3553549, -4591320, -2381559, -2007897, 4698694, 3243237, 2784750, 326954, 1528472, -195958, -3016141, 1087701, 1097901, -15569, -159988, 5154498, 4013110, -13959, -3427384, 1087164, -609885, 1602560, -4969814, -184147, 3262028, 259846, -592706, 366146, 1138166, -1207423, --795106, -1487669, -1818382, -2593624, 1584843, 1868848, -3755949, -791348, -399432, 1054415, -1325534, -2320893, 1490891, 1031329, -670015, -1116155, -4995584, 15668041, 6101001, 3752191, -1309965, -3411278, 107911, 2941516, 5743445, -1074, 613107, 251792, -2019708, 471373, -1985886, -472446, 1939178, 2819109, 3924526, 1538672, 1641214, 1950452, 1859184, -3648575, -3656628, 6685117, -3168612, 1831804, 1107565, 1796370, 390305, 3915937, -2575370, -1031329, --2316598, 2216203, 6753836, -1233729, 3292093, -192737, -1490891, -5641977, 2097018, -2973191, -2574833, 1190780, 2870649, -420907, -1700807, 798864, -1170916, 3747896, 504122, -3149285, -3909494, -952946, 3047816, 2257542, -129923, 2167348, 4391604, -1325534, -1561221, -1329292, -2165737, -1870995, -2409477, 2682207, -13422, 1797444, -2993592, 4313221, 173409, -1203128, --635118, -378494, 12114492, 9703942, 4696010, 814970, -1931125, 5669894, -3376381, -3381213, --929860, -5991480, 3557844, 357019, -2661806, 1552631, 3410741, 6196027, -2960306, 3617973, -7773354, -2153389, -85899, 1916092, 3969087, -934692, 4334696, 3272228, 4385162, 1142998, -3310883, -3426847, 5888937, -626528, 5674189, 2985002, -802622, 816581, -1129576, -45634, --2275259, -908922, -2775086, -1836635, 1857573, -467078, -5827734, -1192390, 412854, -86436, --3342022, -3189550, -1849520, -1348083, 4212826, -1715303, -5063767, -6433861, -7355132, -2424509, --3374234, -230854, 855235, 3458523, -4925254, -2121177, 267899, -492311, -2391760, 477278, --5240397, -533113, -6157373, 2988760, -3577708, -1678259, 3497714, -744640, 6345278, -13913547, --3912715, -6981470, -1464047, 133144, 7594576, -3626026, -12739947, -4299799, -467078, 4933307, -1348083, -4535486, -11084237, -2676302, 2847027, -1088237, 6006512, 380105, 2544231, -470836, --5010616, -5142150, 3023120, 4022774, 292595, 1400159, -358093, 2514703, 382252, -6356015, -172872, 9291088, 1054415, -2131378, -1026497, -2288144, 373125, -1954210, -4168803, 6267968, --2104534, -2408403, 5352603, -2767033, -5152350, 366683, -193274, 300111, -7356742, 5925445, --2456721, -3221, 5073967, 4986994, -7916699, -1809792, 1174674, 1973001, -1002875, 4292283, -796180, 2175938, 2506650, 516470, 1880122, 3564823, 270583, 52613, 2700998, -8719320, --2597918, 144418, 3618510, 2294050, -2040646, -579284, -27736362, -11266236, -5412196, -8171176, -2722473, -2985002, -2456185, -579284, 3748433, -3457986, -3611531, -5815386, 1320166, 4721780, -1313186, -4083977, -4536559, 1129040, 4352413, 3561602, -5193689, -8225399, 777926, -7718056, -4124242, -368830, 2926483, -537945, 2824478, -3255585, -1064615, 7398081, -9220758, 3951907, -2339147, 674847, -3178813, 1684701, 4760971, 830539, -5574868, 737124, -3490735, 2363306, --7668664, -743029, -6939594, 4973572, -456340, -1884954, -1889786, 2490544, -11744051, 4942434, --3311957, -7726646, 2972117, 5200132, 6628209, 3245922, 1487132, -1098438, 863825, -1262184, -4294968, -3112778, 1265942, 2565169, 8222715, 504122, 204011, -6713034, 3748433, -3818226, -611496, -16157667, 8047695, 12164958, 2682207, 737124, 7176891, 2092186, 2393908, 3542811, -807991, 3724274, 4267587, -3422552, -284542, 326954, -3590056, -2623688, 267899, 1721208, --1975148, 12719546, 7193534, -2068027, 1265942, 3922916, 5513665, 5723044, -2107218, 3987877, -5201743, 118112, 1788854, 1247688, 3141232, 1857573, 1614371, 2600603, 3017215, -5704791, --3894462, -8709657, 1366873, -3145527, -3848828, 4336307, -792421, 2709051, -10173704, 11669426, --352187, -5631239, -516470, 9264781, 7272990, -1504312, 806380, 4498978, -1548873, 1950452, --2805151, -7289097, 1524177, 741419, -5180268, -2246268, -5042829, 1148904, 2968896, 1460826, --1907502, -4932233, -6776385, -9050570, -5460514, -2240362, 2168959, 29351806, 7729331, 2203318, --1138166, 17690970, 2015413, 8409009, 1667521, 5589363, 9131637, 3244311, -5187247, 5418638, -6241125, 977105, -553514, 1319629, 11483132, 761820, -4061965, -7092602, -2178622, -274878, --8160438, 1276679, 2265059, 4532801, 1839320, 3163244, 8735963, -2877628, -1549410, 5329518, --997506, -2536715, -610422, -8079371, 4974646, 3199214, 20938, 4928475, -2717104, -7138773, --15188078, -5706401, 5371394, 5906654, 13959, 4060892, -4425427, -4869419, 12032888, -7354595, -5348845, -6531572, 1109712, -9406515, -9723806, 9990631, -4145180, -4101157, 14078903, 663036, --1794760, -7150047, 5043366, 7761006, 216896, -4966056, -8590471, -1888712, 5919539, -2575370, -1840930, 14487998, 5409512, 11935714, -7130183, 2059437, 7373922, -9841918, -2760053, -4094715, -1449015, -5173825, -2433636, 6915971, -1751810, -1784022, -38655, 8761196, -2863133, -4648765, -10275709, 1185948, -6427956, 2521146, -1020055, 1169842, 4201552, -6007586, -788663, -4611721, --7057168, 528281, 708670, 1046361, -6925098, -8148627, 3531000, -1063541, 3456912, -703838, -4791573, 860604, 353798, -5342940, -4242354, 941135, 5346161, 1935420, -823560, 13659607, -3919158, 2017561, 6979322, 1979443, 5355288, 4452271, 3783329, 1562831, 3060701, -2414845, --455267, 698469, -5288179, 1214402, -8912057, 2272575, -5638219, 4641786, -2826089, 2420214, --457414, -4939750, 2388539, -1458678, 5864778, -4509179, 14237280, 11058467, 4726612, -18144626, --35951024, -1149441, -7472170, 6557342, -2161979, -9463960, -1272384, -7576323, -9111236, -7128035, -11346230, 6478422, -8066486, -4023848, 8581345, 5594195, 7636452, -4963909, 4850629, -4333085, --5131412, -992137, -2379412, -14529874, 3871913, 9148280, 3468186, -8384850, -2287070, 2176475, -2070711, -7376607, -1997697, -10830297, 2316598, -4777614, -717260, -3310883, 1988570, 12977244, --1524177, -1539209, 5946382, 9738838, -5623186, 3251827, 3190087, -6720013, 3849901, 4657892, --9086003, 2323577, 5538361, -382252, -9569724, -4864051, -6260989, 9584756, 3048890, 9477919, --5185100, -8371428, 1988033, 6129992, -2373506, -5432597, 4190814, 8310762, 5915244, -6127308, --4673998, 354872, 11985106, -401579, 6453189, 4974646, 3437585, -18808198, 547071, -104690, -11053635, 1919850, -3653407, 5572720, -2464774, 2062121, -9359807, -3576634, -5757941, -4159139, --11997454, -5443871, -6985228, 16482474, 10341208, 9744744, -11803107, -11242077, -4591857, 5083631, --151398, -939524, 751619, 2699924, -454730, 4155918, -6759205, -6985228, 233002, -2629057, --8457327, -9762998, -6757594, -6069863, -3517041, -4493073, -10857677, 4112968, 13917305, -3991098, -6644852, 7714298, -6205154, 6498286, 5011690, 671626, 12642773, -1772748, 10590852, 2652679, -1472637, -11074573, 4024384, 3513283, -2516314, 12968654, 11476153, 765578, -4287988, -8710731, -4072166, -8691940, 2702071, -1921461, 8251169, -1963874, -13032541, -1250372, -5577552, -4497905, --10477573, 8070244, -17010218, 7952669, 4929012, 7571491, -8224326, -13152264, 3433290, 4622459, -156766, -11009612, 10492068, 3678103, -6412386, -9634685, 4050154, -3974455, 17115982, 21066278, -2502355, -2774012, -8201777, 12185359, -13814225, -4238596, 15855946, 4590783, -3722663, -8348880, --8703751, -4103305, -246424, -10324565, 1906429, 12066174, -2007360, 4855461, -9003862, -7215545, --3160022, -5875516, 16246251, -5643587, 6998649, 6718403, 6272263, 2317135, 2806224, -11119670, --12214350, -10670309, -3037616, 8922795, 18810346, -7272990, -14525579, -2703682, -6988986, 4112431, -2455111, 11310796, -7133941, 401043, -9277129, -1117765, 14941654, -1431298, -9007083, 11647414, -3057480, 2356863, 5228049, -11873437, 1264868, -3667365, 466004, 6132677, 12186970, 26848378, --11698417, -9079024, -2841658, 5695664, -15726560, 6323803, -4283693, 7962870, -7088844, -3160559, -9669582, 7256884, 2691334, -4847408, -1829656, 13357348, 13035763, -2673080, 11374147, -3270618, -16750909, -7810935, -4192425, 3067681, 17549236, 12916577, 4192962, -9386114, -726923, -19505594, --3023120, 3117073, 8930848, 10548977, 18494130, 4932770, -408559, -825171, -7195144, -12122545, --945430, -10497437, 7583839, 2493766, 11766063, 6689412, -4108673, 11843909, -14030584, 6440304, --3175592, 1152662, -2485176, 15090904, 8700530, 4454955, 2621004, -26896696, -4342749, 16311749, -8100845, 1273458, -498216, 1139240, 12997108, 5884642, -20419348, -6219650, -7765301, 2499134, -695248, -19614042, 1269163, -17985176, -11570642, 328565, 9396315, 19220516, -5109938, -7394323, -727997, 7610145, 3827890, -11279121, -1103270, -9089761, -907849, -12480638, -1811939, -10694469, -86973, 11620571, 452582, 25330106, -10976863, -4777078, -9414031, 10488847, 16216186, -13109314, --4973572, -20478404, 3386045, 85362, 5137855, 5368172, -12160663, -6633040, 8507256, -3145527, --3149822, -11032160, 22150220, -2782602, -24976846, 7106024, -7063074, -6976638, 8092792, 7085623, --7734163, -7493644, -3078418, -13806709, -9211631, 4967130, 2361695, 5173825, -5116380, -9888088, --12671764, -11541651, 8865886, -17079474, -683437, 4529043, -6381785, 813359, -1189706, -1975685, --14954539, -2135673, -6840273, 9256191, 9920838, -1543504, 16050293, -341450, -1722282, -4507568, --2800319, 26380762, 228170, -12431783, 31034896, -8164196, -2496450, 2490007, 13336410, 9181566, --19821274, -8433168, -18831820, 3890704, 1260036, -6172942, -20766166, 565862, -9620727, 4033511, -4745939, 10239739, 663036, 7354058, 36323612, 7522635, 9142912, -6045704, -1916629, 15437186, --1296543, 857383, 4265977, 634045, -2259690, -8677445, 14638859, -15908559, 6485938, -23456428, --6976638, -11227581, -14190035, -12684112, -19864, -25636122, -8566312, 2939368, 14375792, 7750806, --24737402, 13458817, 9273908, 9636833, -15749108, 10934450, -7435126, -18609020, -6210523, -18545668, -8639327, 20715164, 5293011, -2764885, -14096620, 10565083, -15020038, 21556440, -4286914, -3242700, --13610214, -15597174, 2037425, 16518444, 5641440, -12989055, -4903242, 1953136, -2217814, 5028870, -16827682, 3206193, -10894185, 4935455, -3220689, 5073967, 18425410, -26065620, -11934104, -20965346, -11795591, -4228932, 1928440, -6934225, 14961519, -14891188, -15158550, -6857452, -3673808, -10747619, --18757732, -9006010, 3265786, 12134356, -17315698, 11203959, -6685117, 1281511, 21854404, 16865262, --583042, 8846559, 3954591, -3610457, -3027415, -30141006, 3786551, -3148748, 2549063, 5748277, --2806224, 709743, 29879014, -27369142, 2044941, 32767380, 3727495, 8959302, -13507135, -3648575, -16530255, 30058866, 809601, 26638998, -11223823, 24082418, -9368397, 17785996, 17242146, -4647155, -34398392, -6051072, -2649995, -10687489, -17300666, -17147120, -9242233, -10390063, -26328686, -11760157, --7202124, 8771934, 6605123, 587874, -15923054, -13939316, -10917807, -39524436, -27138824, -20107964, --1370632, 25968982, -16791712, -2704219, -12782360, -19817516, -15398531, -20230906, -19982872, -8630200, --23687282, -26925150, -22385370, 6034429, -15266461, -8769249, -19176492, 18393198, 31501438, 2214593, --2951716, -11349451, 3146601, -2386928, -199716, -2940979, 10350334, 1591285, 21689048, -18830748, -2229088, -16090558, 32646584, 7390565, -18166102, 14287746, -12845173, 11511586, -17460652, 10110353, -2162516, -11316702, 10315975, -17628156, -5118528, 4898947, 18093086, 7099044, 31645320, -7551090, --19484120, 1265942, -5188321, 1704028, -12779138, -12222940, -20927766, 1914482, -22333830, -5452998, --3232500, -20936354, 13530221, 15698105, -9762461, -2460480, -29527900, 31987306, 40177808, 4300873, --17894444, 1845762, -30837328, 56963616, 22438520, -5389647, -16736414, -5515275, -17822504, 19149648, -50599548, 398895, -32560684, -15875273, 18628346, 6001680, -6015102, 23110682, -4030827, 2269890, -14228690, -2167885, -13193603, -5220533, 11801496, -15159624, -12562242, -6077916, 5211943, -52613, --1977296, -6825777, 11113228, 319438, 16193637, 11601244, -15685221, 7147363, 19768124, 9984725, --14482630, 4958003, 3657165, 12184822, 769873, 3700651, 3930432, 4522064, 27604292, 24890410, -16340203, 34031172, -16824460, 17119202, -20368346, 12347494, 82678, 11203959, 15429670, 4003983, -4178466, 17514876, 8738111, -5776731, 11799349, -801011, 15699179, -17467096, -9579388, 619549, -37512244, -26829586, 2022930, -33449742, -4791036, 3285650, 11285027, -16055661, -6033892, -12608413, -47953848, 4274030, 3259343, -10256919, -6957847, 8378945, 7215008, 4843650, 18499498, 8242042, --7914551, 10357851, 19832012, -259309, 21788370, -1539209, 10635413, -21544630, 40269076, -5321465, --4552666, 7435662, -30198452, -7075959, -14387604, 22214108, 12064563, 12968117, -13856101, 6060199, -5520644, -17966386, 5690832, 17176112, 14261439, 5783711, -4125853, 3046206, -8494908, 31694712, -5286568, 15030238, 11979738, 17771500, -26381300, -798327, -7328825, 6517613, -9159555, -10378788, -23505282, -19835232, 17565880, -11894375, 18510236, -2078227, -16968342, 229781, -26032870, 19029390, -17069274, 21254182, -55068460, 18762564, 11758547, -14694694, -10014790, -13191992, 30808338, -38322384, -26703960, 62344672, 2749316, -23543936, -9909563, 22362820, 33370286, 13058848, -10438381, 5744519, --25005836, 1578401, -14023605, 22371410, 4465692, 4276177, -11431592, 8516383, -1241246, -12545599, -7413114, -12838731, -3344706, -11277510, -19412178, -15320685, 19020800, 10956998, 13173738, 8946417, --24016384, -10337986, 8062191, -10487773, 18502182, 8495445, 3755412, 6866579, 29485488, -10624675, --24538758, 49424872, -19914152, -31779000, 35094716, -18286898, -6318434, 4502200, 19448686, -22111566, --3161096, -751082, -9785546, 65031172, 2416993, -13868449, -1227287, -2207613, 19982872, -36049272, --22079354, -17056388, -10042707, -4076998, -25283398, -3030100, 884226, 7489886, 46467252, 40261560, --13120588, 30362198, -29037738, -32491964, 21750788, 23868208, -4982699, 4229469, 8114267, 15350750, -28202902, -2982318, 7524246, 28013388, -18195628, 2653753, -19704236, 21345988, 127238, 13173738, --13441100, -20140176, 18897856, -19905562, 6206765, -4293894, 17817134, 496069, 3918621, -10320806, -3437048, -7129109, -26337276, -20304458, 8918500, -1068373, -602906, 4923643, 19771346, -8163122, --5859409, -15824807, 7305203, 6797860, -1816771, -2471217, -43969728, 2864743, 12738336, -14928233, -11359652, -23568634, -4208531, 2616709, 15786152, 20437066, 2858301, -8134668, 6743099, 36089536, -31128312, 31547608, -630286, -1459215, 7314866, 5036386, -12972412, 10501195, 39398272, -25732222, --7662759, -6226092, 1483374, 3263638, 6587943, -18364206, -29102162, -9529996, 332323, 64684356, -34295312, 23694260, 175020, -2692408, -12106976, 30214558, 8730595, 20812338, -68183, -4630512, --3305514, -7863012, -41568840, 22873922, 22012782, -2222646, 35498440, 14404247, -22405770, -24223078, -11136850, -10574209, -19860466, 297427, 3161096, 8325794, -4122095, 11190000, -1942936, 10541997, -15909096, -14711337, -54099408, 28609850, -7205882, -18345952, 13728326, 18546742, 1857037, -38135552, --3678103, -2542621, -36967320, -24867324, 21330418, -6852084, -14264660, -14165339, 9905268, -38196756, --25071872, 49150532, -2952253, -30163556, 12764643, 26226680, 13079249, -42296300, 60400124, 22808424, --34896072, 19166292, 28165858, 3215857, -23074174, 24520506, 30156040, 16321949, -21036212, 20407000, -41720776, 1124208, 42201812, 48963164, -24869472, -16949014, -16652125, 46262704, 32168232, -21422224, -13737990, -13214541, -27692338, 25232396, 61399780, 8210904, -15160698, -14227079, 36017596, 35713728, -54715200, 23503134, -24098524, -7458748, -20358144, 12938589, -10388452, 16383690, 9149891, -24473260, -12089259, -24937116, -9695352, 1367410, -10494216, 2651606, 12715788, 11856257, -127775, -19546934, -3819300, 17967996, -7180649, 3784403, -8376260, -22981296, 23764590, -13320841, 16204912, -23638964, --15588047, -2094870, -21381958, -4637491, 20081656, -18864034, 26737782, 3343095, 21658446, 10465762, --11992086, -28481002, 23911156, 17025250, 9487583, 8095477, 24672976, -17069810, -10406706, -9055402, -7151658, 11498701, -3315178, -21783000, -1898912, -1206886, -24849070, -7367480, 2973728, 8750996, -18139258, 79457, -17688822, 24943560, -5120675, -1372779, 26343718, 15507516, -22845468, 9901510, --14052596, 11326903, -7173669, 13047574, -18346490, 11290932, -40273908, -49613852, -25073482, 143142128, -127679712, 75634376, 169090720, -36952824, -125483376, -45567456, -237379616, -126051384, -1654636, -62863288, -85979880, 154910880, 22672596, 90475632, 179632720, 28707562, 63127428, 4611721, -183081568, -154903904, --134901168, -150751200, -89887224, 72630584, 31986768, 72675680, 193899520, 114930640, 30708480, 141813920, -65990560, -89602144, 48207788, -65915936, -167860208, -22597434, -103662256, -193171520, -85969136, -21845814, --100008848, 109806744, 120618248, 54820964, 191907728, 214351088, 82310360, 104717208, 101109432, -115246320, --73480448, -146827744, -225312912, -209976656, -133017288, -136410848, -38623032, 83235928, 111571440, 146126592, -210413664, 185558160, 109989280, 76401024, 13536126, -92983360, -128986456, -99586336, -123028264, -157394976, --51923472, -65560528, -23392002, 70367672, 34575560, 912681, 0, 0, 0, 0, -0, 0, 0, }, +1800128, 2106682, -2403034, -3902515, 656593, 2688113, -1779727, 1821603, -6285685, -3461744, +-3566970, 304406, 941672, -2608656, -3248069, 1381369, 3463891, 161598, -1697049, -4660577, +-2656974, 3657702, -747861, 173409, 1690070, -1887101, 1130650, -1387274, -2617783, -1802813, +3553549, -4591320, -2381559, -2007897, 4698694, 3243237, 2784750, 326954, 1528472, -195958, +3016141, 1087701, 1097901, -15569, -159988, 5154498, 4013110, -13959, -3427384, 1087164, +609885, 1602560, -4969814, -184147, 3262028, 259846, -592706, 366146, 1138166, -1207423, +-795106, -1487669, -1818382, -2593624, 1584843, 1868848, -3755949, -791348, -399432, 1054415, +1325534, -2320893, 1490891, 1031329, -670015, -1116155, -4995584, 15668041, 6101001, 3752191, +1309965, -3411278, 107911, 2941516, 5743445, -1074, 613107, 251792, -2019708, 471373, +1985886, -472446, 1939178, 2819109, 3924526, 1538672, 1641214, 1950452, 1859184, -3648575, +3656628, 6685117, -3168612, 1831804, 1107565, 1796370, 390305, 3915937, -2575370, -1031329, +-2316598, 2216203, 6753836, -1233729, 3292093, -192737, -1490891, -5641977, 2097018, -2973191, +2574833, 1190780, 2870649, -420907, -1700807, 798864, -1170916, 3747896, 504122, -3149285, +3909494, -952946, 3047816, 2257542, -129923, 2167348, 4391604, -1325534, -1561221, -1329292, +2165737, -1870995, -2409477, 2682207, -13422, 1797444, -2993592, 4313221, 173409, -1203128, +-635118, -378494, 12114492, 9703942, 4696010, 814970, -1931125, 5669894, -3376381, -3381213, +-929860, -5991480, 3557844, 357019, -2661806, 1552631, 3410741, 6196027, -2960306, 3617973, +7773354, -2153389, -85899, 1916092, 3969087, -934692, 4334696, 3272228, 4385162, 1142998, +3310883, -3426847, 5888937, -626528, 5674189, 2985002, -802622, 816581, -1129576, -45634, +-2275259, -908922, -2775086, -1836635, 1857573, -467078, -5827734, -1192390, 412854, -86436, +-3342022, -3189550, -1849520, -1348083, 4212826, -1715303, -5063767, -6433861, -7355132, -2424509, +-3374234, -230854, 855235, 3458523, -4925254, -2121177, 267899, -492311, -2391760, 477278, +-5240397, -533113, -6157373, 2988760, -3577708, -1678259, 3497714, -744640, 6345278, -13913547, +-3912715, -6981470, -1464047, 133144, 7594576, -3626026, -12739947, -4299799, -467078, 4933307, +1348083, -4535486, -11084237, -2676302, 2847027, -1088237, 6006512, 380105, 2544231, -470836, +-5010616, -5142150, 3023120, 4022774, 292595, 1400159, -358093, 2514703, 382252, -6356015, +172872, 9291088, 1054415, -2131378, -1026497, -2288144, 373125, -1954210, -4168803, 6267968, +-2104534, -2408403, 5352603, -2767033, -5152350, 366683, -193274, 300111, -7356742, 5925445, +-2456721, -3221, 5073967, 4986994, -7916699, -1809792, 1174674, 1973001, -1002875, 4292283, +796180, 2175938, 2506650, 516470, 1880122, 3564823, 270583, 52613, 2700998, -8719320, +-2597918, 144418, 3618510, 2294050, -2040646, -579284, -27736362, -11266236, -5412196, -8171176, +2722473, -2985002, -2456185, -579284, 3748433, -3457986, -3611531, -5815386, 1320166, 4721780, +1313186, -4083977, -4536559, 1129040, 4352413, 3561602, -5193689, -8225399, 777926, -7718056, +4124242, -368830, 2926483, -537945, 2824478, -3255585, -1064615, 7398081, -9220758, 3951907, +2339147, 674847, -3178813, 1684701, 4760971, 830539, -5574868, 737124, -3490735, 2363306, +-7668664, -743029, -6939594, 4973572, -456340, -1884954, -1889786, 2490544, -11744051, 4942434, +-3311957, -7726646, 2972117, 5200132, 6628209, 3245922, 1487132, -1098438, 863825, -1262184, +4294968, -3112778, 1265942, 2565169, 8222715, 504122, 204011, -6713034, 3748433, -3818226, +611496, -16157667, 8047695, 12164958, 2682207, 737124, 7176891, 2092186, 2393908, 3542811, +807991, 3724274, 4267587, -3422552, -284542, 326954, -3590056, -2623688, 267899, 1721208, +-1975148, 12719546, 7193534, -2068027, 1265942, 3922916, 5513665, 5723044, -2107218, 3987877, +5201743, 118112, 1788854, 1247688, 3141232, 1857573, 1614371, 2600603, 3017215, -5704791, +-3894462, -8709657, 1366873, -3145527, -3848828, 4336307, -792421, 2709051, -10173704, 11669426, +-352187, -5631239, -516470, 9264781, 7272990, -1504312, 806380, 4498978, -1548873, 1950452, +-2805151, -7289097, 1524177, 741419, -5180268, -2246268, -5042829, 1148904, 2968896, 1460826, +-1907502, -4932233, -6776385, -9050570, -5460514, -2240362, 2168959, 29351806, 7729331, 2203318, +-1138166, 17690970, 2015413, 8409009, 1667521, 5589363, 9131637, 3244311, -5187247, 5418638, +6241125, 977105, -553514, 1319629, 11483132, 761820, -4061965, -7092602, -2178622, -274878, +-8160438, 1276679, 2265059, 4532801, 1839320, 3163244, 8735963, -2877628, -1549410, 5329518, +-997506, -2536715, -610422, -8079371, 4974646, 3199214, 20938, 4928475, -2717104, -7138773, +-15188078, -5706401, 5371394, 5906654, 13959, 4060892, -4425427, -4869419, 12032888, -7354595, +5348845, -6531572, 1109712, -9406515, -9723806, 9990631, -4145180, -4101157, 14078903, 663036, +-1794760, -7150047, 5043366, 7761006, 216896, -4966056, -8590471, -1888712, 5919539, -2575370, +1840930, 14487998, 5409512, 11935714, -7130183, 2059437, 7373922, -9841918, -2760053, -4094715, +1449015, -5173825, -2433636, 6915971, -1751810, -1784022, -38655, 8761196, -2863133, -4648765, +10275709, 1185948, -6427956, 2521146, -1020055, 1169842, 4201552, -6007586, -788663, -4611721, +-7057168, 528281, 708670, 1046361, -6925098, -8148627, 3531000, -1063541, 3456912, -703838, +4791573, 860604, 353798, -5342940, -4242354, 941135, 5346161, 1935420, -823560, 13659607, +3919158, 2017561, 6979322, 1979443, 5355288, 4452271, 3783329, 1562831, 3060701, -2414845, +-455267, 698469, -5288179, 1214402, -8912057, 2272575, -5638219, 4641786, -2826089, 2420214, +-457414, -4939750, 2388539, -1458678, 5864778, -4509179, 14237280, 11058467, 4726612, -18144626, +-35951024, -1149441, -7472170, 6557342, -2161979, -9463960, -1272384, -7576323, -9111236, -7128035, +11346230, 6478422, -8066486, -4023848, 8581345, 5594195, 7636452, -4963909, 4850629, -4333085, +-5131412, -992137, -2379412, -14529874, 3871913, 9148280, 3468186, -8384850, -2287070, 2176475, +2070711, -7376607, -1997697, -10830297, 2316598, -4777614, -717260, -3310883, 1988570, 12977244, +-1524177, -1539209, 5946382, 9738838, -5623186, 3251827, 3190087, -6720013, 3849901, 4657892, +-9086003, 2323577, 5538361, -382252, -9569724, -4864051, -6260989, 9584756, 3048890, 9477919, +-5185100, -8371428, 1988033, 6129992, -2373506, -5432597, 4190814, 8310762, 5915244, -6127308, +-4673998, 354872, 11985106, -401579, 6453189, 4974646, 3437585, -18808198, 547071, -104690, +11053635, 1919850, -3653407, 5572720, -2464774, 2062121, -9359807, -3576634, -5757941, -4159139, +-11997454, -5443871, -6985228, 16482474, 10341208, 9744744, -11803107, -11242077, -4591857, 5083631, +-151398, -939524, 751619, 2699924, -454730, 4155918, -6759205, -6985228, 233002, -2629057, +-8457327, -9762998, -6757594, -6069863, -3517041, -4493073, -10857677, 4112968, 13917305, -3991098, +6644852, 7714298, -6205154, 6498286, 5011690, 671626, 12642773, -1772748, 10590852, 2652679, +1472637, -11074573, 4024384, 3513283, -2516314, 12968654, 11476153, 765578, -4287988, -8710731, +4072166, -8691940, 2702071, -1921461, 8251169, -1963874, -13032541, -1250372, -5577552, -4497905, +-10477573, 8070244, -17010218, 7952669, 4929012, 7571491, -8224326, -13152264, 3433290, 4622459, +156766, -11009612, 10492068, 3678103, -6412386, -9634685, 4050154, -3974455, 17115982, 21066278, +2502355, -2774012, -8201777, 12185359, -13814225, -4238596, 15855946, 4590783, -3722663, -8348880, +-8703751, -4103305, -246424, -10324565, 1906429, 12066174, -2007360, 4855461, -9003862, -7215545, +-3160022, -5875516, 16246251, -5643587, 6998649, 6718403, 6272263, 2317135, 2806224, -11119670, +-12214350, -10670309, -3037616, 8922795, 18810346, -7272990, -14525579, -2703682, -6988986, 4112431, +2455111, 11310796, -7133941, 401043, -9277129, -1117765, 14941654, -1431298, -9007083, 11647414, +3057480, 2356863, 5228049, -11873437, 1264868, -3667365, 466004, 6132677, 12186970, 26848378, +-11698417, -9079024, -2841658, 5695664, -15726560, 6323803, -4283693, 7962870, -7088844, -3160559, +9669582, 7256884, 2691334, -4847408, -1829656, 13357348, 13035763, -2673080, 11374147, -3270618, +16750909, -7810935, -4192425, 3067681, 17549236, 12916577, 4192962, -9386114, -726923, -19505594, +-3023120, 3117073, 8930848, 10548977, 18494130, 4932770, -408559, -825171, -7195144, -12122545, +-945430, -10497437, 7583839, 2493766, 11766063, 6689412, -4108673, 11843909, -14030584, 6440304, +-3175592, 1152662, -2485176, 15090904, 8700530, 4454955, 2621004, -26896696, -4342749, 16311749, +8100845, 1273458, -498216, 1139240, 12997108, 5884642, -20419348, -6219650, -7765301, 2499134, +695248, -19614042, 1269163, -17985176, -11570642, 328565, 9396315, 19220516, -5109938, -7394323, +727997, 7610145, 3827890, -11279121, -1103270, -9089761, -907849, -12480638, -1811939, -10694469, +86973, 11620571, 452582, 25330106, -10976863, -4777078, -9414031, 10488847, 16216186, -13109314, +-4973572, -20478404, 3386045, 85362, 5137855, 5368172, -12160663, -6633040, 8507256, -3145527, +-3149822, -11032160, 22150220, -2782602, -24976846, 7106024, -7063074, -6976638, 8092792, 7085623, +-7734163, -7493644, -3078418, -13806709, -9211631, 4967130, 2361695, 5173825, -5116380, -9888088, +-12671764, -11541651, 8865886, -17079474, -683437, 4529043, -6381785, 813359, -1189706, -1975685, +-14954539, -2135673, -6840273, 9256191, 9920838, -1543504, 16050293, -341450, -1722282, -4507568, +-2800319, 26380762, 228170, -12431783, 31034896, -8164196, -2496450, 2490007, 13336410, 9181566, +-19821274, -8433168, -18831820, 3890704, 1260036, -6172942, -20766166, 565862, -9620727, 4033511, +4745939, 10239739, 663036, 7354058, 36323612, 7522635, 9142912, -6045704, -1916629, 15437186, +-1296543, 857383, 4265977, 634045, -2259690, -8677445, 14638859, -15908559, 6485938, -23456428, +-6976638, -11227581, -14190035, -12684112, -19864, -25636122, -8566312, 2939368, 14375792, 7750806, +-24737402, 13458817, 9273908, 9636833, -15749108, 10934450, -7435126, -18609020, -6210523, -18545668, +8639327, 20715164, 5293011, -2764885, -14096620, 10565083, -15020038, 21556440, -4286914, -3242700, +-13610214, -15597174, 2037425, 16518444, 5641440, -12989055, -4903242, 1953136, -2217814, 5028870, +16827682, 3206193, -10894185, 4935455, -3220689, 5073967, 18425410, -26065620, -11934104, -20965346, +11795591, -4228932, 1928440, -6934225, 14961519, -14891188, -15158550, -6857452, -3673808, -10747619, +-18757732, -9006010, 3265786, 12134356, -17315698, 11203959, -6685117, 1281511, 21854404, 16865262, +-583042, 8846559, 3954591, -3610457, -3027415, -30141006, 3786551, -3148748, 2549063, 5748277, +-2806224, 709743, 29879014, -27369142, 2044941, 32767380, 3727495, 8959302, -13507135, -3648575, +16530255, 30058866, 809601, 26638998, -11223823, 24082418, -9368397, 17785996, 17242146, -4647155, +34398392, -6051072, -2649995, -10687489, -17300666, -17147120, -9242233, -10390063, -26328686, -11760157, +-7202124, 8771934, 6605123, 587874, -15923054, -13939316, -10917807, -39524436, -27138824, -20107964, +-1370632, 25968982, -16791712, -2704219, -12782360, -19817516, -15398531, -20230906, -19982872, -8630200, +-23687282, -26925150, -22385370, 6034429, -15266461, -8769249, -19176492, 18393198, 31501438, 2214593, +-2951716, -11349451, 3146601, -2386928, -199716, -2940979, 10350334, 1591285, 21689048, -18830748, +2229088, -16090558, 32646584, 7390565, -18166102, 14287746, -12845173, 11511586, -17460652, 10110353, +2162516, -11316702, 10315975, -17628156, -5118528, 4898947, 18093086, 7099044, 31645320, -7551090, +-19484120, 1265942, -5188321, 1704028, -12779138, -12222940, -20927766, 1914482, -22333830, -5452998, +-3232500, -20936354, 13530221, 15698105, -9762461, -2460480, -29527900, 31987306, 40177808, 4300873, +-17894444, 1845762, -30837328, 56963616, 22438520, -5389647, -16736414, -5515275, -17822504, 19149648, +50599548, 398895, -32560684, -15875273, 18628346, 6001680, -6015102, 23110682, -4030827, 2269890, +14228690, -2167885, -13193603, -5220533, 11801496, -15159624, -12562242, -6077916, 5211943, -52613, +-1977296, -6825777, 11113228, 319438, 16193637, 11601244, -15685221, 7147363, 19768124, 9984725, +-14482630, 4958003, 3657165, 12184822, 769873, 3700651, 3930432, 4522064, 27604292, 24890410, +16340203, 34031172, -16824460, 17119202, -20368346, 12347494, 82678, 11203959, 15429670, 4003983, +4178466, 17514876, 8738111, -5776731, 11799349, -801011, 15699179, -17467096, -9579388, 619549, +37512244, -26829586, 2022930, -33449742, -4791036, 3285650, 11285027, -16055661, -6033892, -12608413, +47953848, 4274030, 3259343, -10256919, -6957847, 8378945, 7215008, 4843650, 18499498, 8242042, +-7914551, 10357851, 19832012, -259309, 21788370, -1539209, 10635413, -21544630, 40269076, -5321465, +-4552666, 7435662, -30198452, -7075959, -14387604, 22214108, 12064563, 12968117, -13856101, 6060199, +5520644, -17966386, 5690832, 17176112, 14261439, 5783711, -4125853, 3046206, -8494908, 31694712, +5286568, 15030238, 11979738, 17771500, -26381300, -798327, -7328825, 6517613, -9159555, -10378788, +23505282, -19835232, 17565880, -11894375, 18510236, -2078227, -16968342, 229781, -26032870, 19029390, +17069274, 21254182, -55068460, 18762564, 11758547, -14694694, -10014790, -13191992, 30808338, -38322384, +26703960, 62344672, 2749316, -23543936, -9909563, 22362820, 33370286, 13058848, -10438381, 5744519, +-25005836, 1578401, -14023605, 22371410, 4465692, 4276177, -11431592, 8516383, -1241246, -12545599, +7413114, -12838731, -3344706, -11277510, -19412178, -15320685, 19020800, 10956998, 13173738, 8946417, +-24016384, -10337986, 8062191, -10487773, 18502182, 8495445, 3755412, 6866579, 29485488, -10624675, +-24538758, 49424872, -19914152, -31779000, 35094716, -18286898, -6318434, 4502200, 19448686, -22111566, +-3161096, -751082, -9785546, 65031172, 2416993, -13868449, -1227287, -2207613, 19982872, -36049272, +-22079354, -17056388, -10042707, -4076998, -25283398, -3030100, 884226, 7489886, 46467252, 40261560, +-13120588, 30362198, -29037738, -32491964, 21750788, 23868208, -4982699, 4229469, 8114267, 15350750, +28202902, -2982318, 7524246, 28013388, -18195628, 2653753, -19704236, 21345988, 127238, 13173738, +-13441100, -20140176, 18897856, -19905562, 6206765, -4293894, 17817134, 496069, 3918621, -10320806, +3437048, -7129109, -26337276, -20304458, 8918500, -1068373, -602906, 4923643, 19771346, -8163122, +-5859409, -15824807, 7305203, 6797860, -1816771, -2471217, -43969728, 2864743, 12738336, -14928233, +11359652, -23568634, -4208531, 2616709, 15786152, 20437066, 2858301, -8134668, 6743099, 36089536, +31128312, 31547608, -630286, -1459215, 7314866, 5036386, -12972412, 10501195, 39398272, -25732222, +-7662759, -6226092, 1483374, 3263638, 6587943, -18364206, -29102162, -9529996, 332323, 64684356, +34295312, 23694260, 175020, -2692408, -12106976, 30214558, 8730595, 20812338, -68183, -4630512, +-3305514, -7863012, -41568840, 22873922, 22012782, -2222646, 35498440, 14404247, -22405770, -24223078, +11136850, -10574209, -19860466, 297427, 3161096, 8325794, -4122095, 11190000, -1942936, 10541997, +15909096, -14711337, -54099408, 28609850, -7205882, -18345952, 13728326, 18546742, 1857037, -38135552, +-3678103, -2542621, -36967320, -24867324, 21330418, -6852084, -14264660, -14165339, 9905268, -38196756, +-25071872, 49150532, -2952253, -30163556, 12764643, 26226680, 13079249, -42296300, 60400124, 22808424, +-34896072, 19166292, 28165858, 3215857, -23074174, 24520506, 30156040, 16321949, -21036212, 20407000, +41720776, 1124208, 42201812, 48963164, -24869472, -16949014, -16652125, 46262704, 32168232, -21422224, +13737990, -13214541, -27692338, 25232396, 61399780, 8210904, -15160698, -14227079, 36017596, 35713728, +54715200, 23503134, -24098524, -7458748, -20358144, 12938589, -10388452, 16383690, 9149891, -24473260, +12089259, -24937116, -9695352, 1367410, -10494216, 2651606, 12715788, 11856257, -127775, -19546934, +3819300, 17967996, -7180649, 3784403, -8376260, -22981296, 23764590, -13320841, 16204912, -23638964, +-15588047, -2094870, -21381958, -4637491, 20081656, -18864034, 26737782, 3343095, 21658446, 10465762, +-11992086, -28481002, 23911156, 17025250, 9487583, 8095477, 24672976, -17069810, -10406706, -9055402, +7151658, 11498701, -3315178, -21783000, -1898912, -1206886, -24849070, -7367480, 2973728, 8750996, +18139258, 79457, -17688822, 24943560, -5120675, -1372779, 26343718, 15507516, -22845468, 9901510, +-14052596, 11326903, -7173669, 13047574, -18346490, 11290932, -40273908, -49613852, -25073482, 143142128, +127679712, 75634376, 169090720, -36952824, -125483376, -45567456, -237379616, -126051384, -1654636, -62863288, +85979880, 154910880, 22672596, 90475632, 179632720, 28707562, 63127428, 4611721, -183081568, -154903904, +-134901168, -150751200, -89887224, 72630584, 31986768, 72675680, 193899520, 114930640, 30708480, 141813920, +65990560, -89602144, 48207788, -65915936, -167860208, -22597434, -103662256, -193171520, -85969136, -21845814, +-100008848, 109806744, 120618248, 54820964, 191907728, 214351088, 82310360, 104717208, 101109432, -115246320, +-73480448, -146827744, -225312912, -209976656, -133017288, -136410848, -38623032, 83235928, 111571440, 146126592, +210413664, 185558160, 109989280, 76401024, 13536126, -92983360, -128986456, -99586336, -123028264, -157394976, +-51923472, -65560528, -23392002, 70367672, 34575560, 912681, 0, 0, 0, 0, +0, 0, 0, }, }, { { -1262720, -3423089, -3764539, -789200, 187905, 287763, 1505923, 6287832, 466004, -1490891, -2266669, -5662378, -581968, -2845953, 1067836, -1983738, 1464047, 1147293, 7502234, 1944010, -4078608, -1737851, -219043, 696858, -3625489, 2316061, 321586, -2681670, -1586990, -287226, 311385, --328028, 2369748, -647466, -2257542, -559956, -1553168, -294742, -2757369, 1013075, 2907156, --439160, -4005594, 2462090, -2452963, -1492501, 119722, 1152662, -2056753, -595927, 3727495, --1959579, 1065689, -2463701, 1803349, -843424, 1256815, 1658394, 1033477, -967978, -541166, -1920924, -3010772, -5550709, 1184874, -707596, -1753420, 499827, -304406, -346282, 375273, --2020245, 2206540, -2871186, 2329483, 1005022, -533113, 6467684, -676994, 1977296, -1190243, -8632347, -3391951, -813896, -312459, 1090385, -1526861, 3969624, -685047, -2633889, -472446, -5422933, 402116, -2699924, 2534031, 1896228, 3559454, 1488743, -2694555, -1752884, 6042482, -877247, -1526861, -1152125, -1209033, 1227287, 1306744, -733366, -7649874, -1875290, 401579, -5348845, 1929514, -605590, 17717, -3003793, 4265440, -4253628, -5682779, 803159, 111669, --1878511, -1257889, -1533840, 889595, 594853, 583042, -1930051, 5092221, 235686, 6804839, --991601, -3089692, 1567663, -237834, 1065152, 1690607, 3507378, 2456721, -736587, -1671816, --1422171, 4548371, -4261682, 398895, 325881, -511638, -3556233, 3675955, -1600949, 852014, -3360812, -864362, 1090385, -2479807, 2146410, 1403381, -3081639, -1589138, -318364, 336081, --245350, -389768, -1611687, 2766496, 427886, -1124745, -1688996, -38118, 5516886, -747861, --2747705, 3634079, -1511292, -3357054, -457951, 2907156, 2033130, -1832340, 385473, -2299955, -1224603, 1335198, -1240172, 2887292, -922344, -5186173, 822486, 2692945, 2364916, 350577, --537945, -3772055, -1428614, -508954, -1815697, 3380139, 4599373, 2199023, -6692096, 2174327, -7473243, 3134789, -572841, -92342, 3320547, -1794223, 935229, -3287798, -3155190, 2901251, -3106335, 1542967, 635655, 508417, 392990, 1487669, -537, -414464, -1483911, 675384, --2639258, -579821, -1387274, -4829691, -2791192, 750546, 1173063, 4379793, -234613, 1766305, --2786897, -4351339, -2589329, 2262911, -1856500, -2049773, -2018098, -2884608, 2820720, 330176, -2099165, -932545, 692027, -5857799, -3628711, -2695092, 3837553, 673773, 942745, 2005213, --1941862, -1074279, -344671, 650688, -4283156, -868120, -2847563, -3250753, 314069, -2863133, -2050310, 1810329, 7813620, -1903207, 4041564, -2584497, 1751810, -1760937, 541703, 6748468, -1219234, 2950106, -3038153, 2095944, -2717104, -1301375, -295816, 4336843, -1957968, -1016297, --3648038, -1923609, -4333622, -493921, 4387846, 1137630, 463856, 877784, 4032438, -3666828, --6575595, 1745904, 2253784, -4167192, -193274, 847182, -972273, 2081985, 5345624, 1488206, --1285269, 650151, -1915019, 2641942, -7033546, 1314797, -2575907, -4878546, -3830037, 2225330, --1189706, -61740, 4828617, 1835025, -879931, 608275, 4076461, -1835025, 2960843, -1258962, -754304, -4340065, -982474, 3220152, -1216550, 3958886, 4065724, 1563905, 2489471, 5735929, --1498944, -7692287, 1589138, -3336653, 46171, -9461276, 60666, 3240016, -2132451, 3740380, -302258, -3321084, 1036698, -7087233, -4840965, -1621887, -1994476, -5863704, 2820720, 3462281, --30065, 3227131, 6979, 965294, -2182380, 2927020, 1896765, -1009854, 6374269, -1141388, -5214627, 4781909, -536334, -678605, -262530, 1570347, 1947768, 763967, 2201708, 861141, -534187, 7325067, 2464238, -3250753, -1825361, -162672, -2144263, 847719, -1692217, 6802155, --12954158, -86436, 105764, 3233574, 5895380, 1896228, -2742337, -4902169, -606127, 6109054, --1017907, -1297617, -4443681, -215822, -1745367, 4503273, 5657546, -9505299, 6321655, 3819837, --3373160, -859530, -4731980, -62814, -1281511, 25770, 3445101, 6165426, -2126546, 1359894, --1407676, -2223183, 2559801, 4234301, 3157338, -2790118, -4192962, 3026878, 2422899, -1676648, --528281, 472983, -5442798, 2017561, 2044404, -2362232, -3512210, 1420560, -2573759, 5043902, -2605435, -9015673, 4471061, -3888556, -9464497, -2907693, -307090, 1939715, -3586298, -221191, -2673080, -4382478, -3757023, -4497905, -787053, 1126355, 10012106, 1496796, 2502355, -1962263, --4073240, 6480569, -968515, -7322383, 1576790, -7272454, 2348810, 8139500, 2195802, 1762010, -3578782, 5127117, -1119376, 12534325, -1804423, 8971650, -10553808, 3649112, 6210523, -2229625, -896038, -2966749, -244276, 4846334, 8862128, -2478733, -4326106, -1269700, 4167729, 896038, -9030706, 4263829, -893353, 1315334, 16643, -4162360, 924492, -904091, -1199907, 3951370, -5255430, -8086350, 9498857, -7103339, -3755949, 1635846, -2752537, 4767414, 273804, -2669859, -6791417, 9335648, -6741488, -1200443, -482647, 2926483, -6342056, -10742250, -4807142, -3248069, -3424163, -7432441, -4051765, -818191, 8050380, 4930623, -5079873, 3917010, 2412161, -2890513, --4042638, -652835, -2284923, -3121368, 831613, -2065879, 6387153, -4355097, -220117, 4925254, --3043521, 5273683, 7448547, 1440962, 1667521, -732292, 4575751, 4103305, 5021891, -4818954, --6864969, -3379066, 4342212, 436476, 18578418, -1197759, -646393, -4298189, -8663486, -12228309, --2930242, 4346507, 6425271, -3882114, -8151311, 1271847, -92879, 8240969, -2836826, -3035468, -9723806, -5135171, 494995, -7365332, 4737886, -1271310, -97711, -1432372, -11731703, -7013682, -493921, 6709813, 4188667, 801548, -12129525, 8267275, -4958003, -4668630, -5277978, -6576669, --1158031, 6840273, -5399311, -5554467, 3974455, -1595580, 2270427, 12362526, -5284421, 602369, -582505, 5462662, -3557844, -2894808, -1636383, 8027294, -1671279, -3635153, -624918, 6380174, -7874286, -7243999, -8557185, -2499671, -1027034, -2410014, 2260227, -5546951, -1500017, -4874251, --8234526, 2033130, -5908802, 4977867, 6558952, -4875862, -5426691, -4986457, 2809982, -695248, -9416716, 15791521, -8751533, 375810, -135291, -1336272, 1735704, 4408247, -12894566, 11578158, --9006546, -4815732, 12145631, -2986613, -5410585, 3694209, 4670240, 15569, -376347, -9429064, -6022081, -1575716, 2295660, -6347962, 7885560, -984621, -12319577, -13809394, 4857071, -2797098, --6619082, 3087545, -207232, 20566450, 3898220, -4204773, -5823439, -12741020, -3949759, 1962800, --2555506, 9168681, -1568200, -14874009, -892816, 9330280, -3788161, 692027, 9101036, 5100811, --4240744, -1645509, 7563975, 8404714, -3505767, 860067, 2094870, -5543192, 2865817, -3327526, -364535, -152471, -993211, -4494147, -7454453, -12199318, -6097243, 4604205, -10558640, 3904662, --11411191, 286152, 4379256, -2033130, -8496519, -4236449, -1599875, 7597797, 6329171, -4777078, --4613869, 8115341, 3619584, -4946192, -5000953, -4186519, -378494, 7846905, -1188095, 577136, --276489, -244813, 10444824, 4948876, 7057705, -623844, -323733, 3406983, -5133560, -9078487, -7489349, 11632382, -7772280, 9986873, -2780991, -1144072, -4347581, 5097590, 507880, -5767604, -3637301, 9463424, 7671886, 3366718, -6990596, -3023657, -14347875, 2349347, 7765838, -4725538, --975494, -5791764, 1698123, -3442416, 5834176, -3582540, 2071785, 6772090, 4028143, 12761422, -6821482, 4406100, 8294119, -6641093, 12352326, 4012036, 7562901, -2097555, -8261907, -12479564, --2359011, -1500554, -3338800, -2061584, 4718559, 6181532, -12972412, 9562745, 3051038, -1786706, -13657996, 10870025, -17858474, -11682848, 10867878, 19191524, -2030983, 2910914, -1909650, -2327336, --2209761, -723165, 4510790, 2929705, 11196980, 2884071, 10681047, 3149285, 4427038, -1480690, --6635725, 2684355, 446140, -5096516, 8010114, 852551, 2926483, 1945620, -2233920, -7877507, -510027, -8942659, -3537443, -10352482, -7447474, -4234838, 8053601, 1151588, 3636227, 10492068, --5235565, -987843, 551903, 3690451, 416612, 139586, -3742527, 7710003, 16456167, 8177081, --14612016, -9938017, -11091753, 11791296, -2784750, -11184095, 5410585, -6321118, -1793686, -1921461, --1973538, -940061, -932545, 10412611, 15848429, 6561100, 13274670, 9694278, 2946885, 2319819, -1363115, -3595961, -7472170, 2327336, 16882442, 3628711, 5738077, -5163625, 4117800, -8108362, --15259482, 718333, 7706245, 2772402, 6142877, 9418863, 9666898, 988379, -11097659, -8807367, --14604499, -21832392, -610422, -2258616, 9629854, 7740068, -8540006, -4218732, 5598490, 12079059, --14713484, -8948027, -2929705, -7522635, -5543729, -2520609, 4422206, 9503152, 348429, -5017596, --6774774, 9608379, -7295539, -2589865, -188442, 13340705, -839666, 1545115, -20076824, -1029182, -5068062, 10865730, 13660143, 3404835, -12761422, 6638409, 550830, 6611566, 8836358, 1937030, -4685810, 10257456, 17534204, -10815265, -3881040, -486942, 5920613, 18632106, 8463233, 6561637, -11156178, -2983392, -4799089, -10379862, -12259447, -7649337, 1256815, 9167608, 22024056, 9402220, -4622996, 13077102, -15334644, -10162429, -2064806, 22385906, 8461622, 1071058, 11469710, -6839736, -17412872, -3620658, -15941845, -2454574, -15829102, 13191992, 7220377, 5552856, 4612258, 918586, --5253282, 6748468, 8817031, 5240934, -3416647, 8824547, 10643466, 10451266, -1435056, -7726646, -14536317, 4223027, -1091995, -1697586, 1597191, -8818642, 9405978, -985695, -2797098, -11410117, --6801618, -6691559, 17083232, 7036767, 85899, 3204046, 8806294, 13734769, 6448894, -15512348, -14978162, -738734, 8657043, 4776541, 13183939, -1919314, -17293686, 6574521, -784368, 8352101, --3053185, -5820755, 6456410, -1451699, 4395362, 23131084, -2610803, -8583492, 77309, 4383014, --10564009, 19163608, -7865159, -8808978, 15257334, -6677064, 5049808, -4895726, 3313031, -13067975, --4492536, 9088151, 170188, -12769475, 2080912, -3628174, 8717710, 3820374, 3645354, -22235582, -5513128, 1735704, 7435126, 16469052, -918049, -632434, -476741, -6374269, 13640816, -13365938, -2981244, 10537165, 4523138, 9802189, -5728950, -5788542, -10055055, -13884019, 4117263, 3576097, -6907381, 17359184, -8023536, 15068893, 5530308, -12035035, -9596031, 1073205, -606127, 1995012, --2220498, 8120173, 9702331, 12264279, 2443837, -26492968, 4636954, 9586904, 5934034, -16983912, -8731132, -8050916, 7199439, 2523830, 2588255, -1098438, 4642860, -805843, 20976084, 12794171, --13343927, 2792266, -32600950, 6483790, -11776263, -7487739, 5177583, 7514046, -18291728, -28106802, -15104863, 12817256, -31768800, 11309723, -11186779, -4410932, -5063230, 9949292, -7394323, -887448, -2560874, 27043262, -2879776, 19245212, 5910949, 14236206, 1888175, 3338263, 5865852, 25992068, -27987618, -15030775, -11874511, 14408005, -18712636, -1058710, 6205154, -20647518, 12034498, 466541, --665720, -4679904, -5066451, 1214402, 3002719, 2501819, -11122892, -1089311, -2037425, -17013976, -8959839, 9767829, -16755741, -14412300, -5552856, 8220568, 10153303, 7517267, -41339, -4952098, -9221295, 26717918, 16090558, -6996502, -2729452, -5342403, 19937238, -16750909, 7974681, 2399813, --22712324, -11512660, -74625, 1449552, -19064822, 11962021, 10039486, 2059437, 4882841, 7497939, --17921288, -4540318, -14645838, -1708323, 10949482, 13849122, 11331197, -13292924, -4338454, -4004520, -1676648, -15228880, -2709051, 13099650, 19842212, -1208496, 1121523, -12216498, 862215, -359167, --9044127, -14622753, -3019899, -6670084, -11273215, -7925826, 12377559, -10450729, 8930848, -3019362, --2709051, 17763984, -12336220, -6604049, 2521146, 7275138, 869731, -23072028, -14454712, 2841121, --3908420, 3951370, -3413962, -7123204, 14667850, 3348464, -1435593, -5920613, -33597920, 20248624, --6202470, -205622, -2997350, 1431835, 9440338, -5423470, -9268539, -15470472, -1612223, 7021735, --9772661, -12248710, 4967667, 19745576, -3461207, 18357764, 13325673, -13289703, 24472724, 16315507, --16322486, -25012278, -7304129, -10901701, 1254667, -7949985, -2020245, 11955578, -21002926, 10176925, --3432216, -11905649, -13133473, -13329968, -15835544, 3015604, 9737765, -9113921, 13774497, -21311628, -38707856, 54278188, -5173288, 6528887, 3558381, 13065827, 26426396, -25273736, 362388, 4242354, -556735, -9200894, 1414655, -11346767, 13285944, 32242320, -6786585, 541703, 1898376, 9645960, -950262, 3626563, 12505871, -25142202, -1808181, 24282672, 25209310, -29616484, -6183143, 3999688, -4198868, 8505646, 22205518, 5967320, 44731548, 7154342, 13859859, 6280853, -6929930, -9585293, --436476, -31681826, -44973676, -15628849, -14504641, -47359532, 7500087, -1534914, -26063472, -13248363, --43748000, -5284958, -5816997, 29441464, -29074244, 17760764, -19726248, -2223183, -12793097, -11040750, -12264279, 26242250, -20153598, -8507793, -1143535, -6912750, -1263794, 10537702, 22804666, 22191560, --14796162, 45493904, 33444910, 3285113, -13824426, -37855840, -19684372, 35824860, 58922120, -13659070, --3309809, 10782515, 26206816, 9184251, -15693274, 9895068, -13458817, 3660386, 8061117, -2934000, --18067316, 5572720, 18533858, -4478577, -27363236, 21359946, -6561100, 17466558, -6757058, -4065724, --7046431, -10735271, -832687, 19349364, 10299332, 3344706, 15076946, -7199976, -6584185, 6060736, --8737574, 10871099, 5779952, 16543677, 27627914, 24765318, -18265422, -32935956, -12609487, -1980517, -25289304, -9819369, 4000762, 10496900, -10883984, -15174656, -25029996, -24981140, 19004694, 21045340, --17543868, -60219200, 4173098, -4249334, -9125195, 4651987, -6949257, -24206972, -12315819, -5728950, --17939542, -7262790, 24337432, 9617506, 13275744, -5894843, -10184441, -5539971, 11969000, 2328946, --570157, 12302934, 28611462, -13484050, -984084, -11278584, 6400038, -15663746, -23666344, -6087043, --3323231, 3782256, -7577933, 18070002, -10437844, -39084740, -20016696, 12514998, -17303886, 20540682, -19787452, -9176198, -2124398, 1985886, -10915123, -723702, 7013682, -2459406, 4181151, 26169772, -23279796, -6808060, -34921844, -27925878, 2840584, 18094160, -13523778, -7023346, -16021839, -22491670, -2866354, -6985228, -24451248, -28506772, -39572220, 15368467, 6536940, -44560, 24348170, 30382598, --199179, -24398098, -16703128, -19940460, -9569187, -7724499, 8338142, 11099269, -9533754, -18299782, --19652160, 10089952, 11336029, -21765284, -18037788, -9005473, -1570884, -13157095, 9587978, 49737868, -32963338, 58313844, 22773528, -32480154, 40607304, -2398202, -14122389, 1392106, -10690174, -37579892, -35343284, -20056424, 2274185, 10436234, -4496294, -26190710, 26489748, 25367150, -14608794, -20021526, -2711735, 35108136, -18425410, 10028212, 22452478, 6907918, -8483634, -16734803, -11031087, 7804493, --2679523, 5949604, -9831717, 6561637, -21763136, 31856846, -3067681, 7156490, -1480153, -40148280, -12546136, -11125576, 20753282, 12446278, 22188338, -8671002, -38620884, 27752468, 12628278, -13221520, --23960012, 19852950, 10849624, 21099026, 21602074, -18778670, 8833137, 22227530, -32498406, 29883308, -15134928, -1149978, 9966472, -17237314, 38122128, -4518843, 25341918, 10794327, 44382044, -3453691, --6859063, 5689758, 18742164, 11240466, 13535589, 43462920, 4007205, 9935870, 27554900, -18155900, -19930258, 644782, -26437134, 8912594, -5789079, 30200062, -17816598, -25981330, -64806760, 3463891, --7856032, 1933272, 50342924, 41280540, 59604484, 31345746, -15716896, -12196097, -24538758, -32937030, -11689290, 2812667, 8757975, 10381473, -9439264, 14893336, 25515864, 4598836, -6641093, -8661875, --17808546, -12015171, -10689100, 4894115, 8264591, -25875030, -15072651, -3627637, 17520782, -7886097, -11370926, 13783087, -36439040, -36206036, 7100655, 10395968, 8308078, -27354646, -12263205, -24581708, --11563663, -11305428, 23937464, -31144418, -42900816, -16353625, 8928163, 7244536, -32971390, -26891864, --20646444, -16063178, 18443126, 25268904, 1596654, -8767639, -10072772, -6038724, -5115843, -11634530, --36467492, 12011950, 28388660, 25102474, 8482560, 34350612, 47327856, -4216584, -5336497, 35645008, --8007967, -21698174, -48695804, -16089484, 5800354, 42026792, 15570867, 2866891, 16187732, -18237504, -1797444, -9585293, -12535399, 7332583, 3798362, -11565273, -17614198, -11069204, -16276315, -14365592, -6337224, -11198590, -4417374, 7482370, -4464082, 1299765, -5030481, 20683488, -15691126, 16869020, -7227893, 1454920, -15078556, -7410966, 13788993, 4683662, 746251, 9717900, -731755, -4746476, --5435818, -6049999, -3218541, 1399086, 1154809, 1625108, -17487496, 9343164, -6489696, -7905961, -7992934, 3942243, 3979287, -4114042, 14796162, 10764262, -14731738, 14118094, -235149, 9364639, -21806622, -4811974, 12844637, 9565429, -7606387, -7736310, -10692858, 446140, 4973036, -21870510, -11713450, 2393908, 19810000, -7322383, -33550674, 22582938, 6023692, -210990, 6268505, -17301738, -3111704, -5026723, 12183748, -21638582, -62672700, -92422864, 18921478, 72844792, 2386928, 199162464, -182884544, 126001456, 216108800, 166652240, 21722334, 3207267, -23616414, -159597232, -163501344, -123996240, --213903328, -198955776, -58145268, -67002028, -68470904, 14900852, 38499012, -34309808, -12937515, 62480500, -38591892, -3599720, 45242648, 31309774, 161061, 37966976, 91492464, 59929828, 18900540, 94227824, -68444600, 3332358, 79732848, 109726216, 23727010, 9508521, 111003968, 28484224, -48183092, 54516020, -84262960, -48387100, 16464757, 119560080, 7308961, 16437914, 144024752, 112632296, 4876936, 88148832, -117664384, -47656420, -30982820, 29654064, -106659072, -173859200, -119858576, -191541584, -282103104, -259459504, --289848000, -367075296, -387062464, -342896224, -361456384, -340003584, -254369968, -200921792, -96309808, 2296197, -124596464, 138281840, 31000000, }, +3423089, -3764539, -789200, 187905, 287763, 1505923, 6287832, 466004, -1490891, -2266669, +5662378, -581968, -2845953, 1067836, -1983738, 1464047, 1147293, 7502234, 1944010, -4078608, +1737851, -219043, 696858, -3625489, 2316061, 321586, -2681670, -1586990, -287226, 311385, +-328028, 2369748, -647466, -2257542, -559956, -1553168, -294742, -2757369, 1013075, 2907156, +-439160, -4005594, 2462090, -2452963, -1492501, 119722, 1152662, -2056753, -595927, 3727495, +-1959579, 1065689, -2463701, 1803349, -843424, 1256815, 1658394, 1033477, -967978, -541166, +1920924, -3010772, -5550709, 1184874, -707596, -1753420, 499827, -304406, -346282, 375273, +-2020245, 2206540, -2871186, 2329483, 1005022, -533113, 6467684, -676994, 1977296, -1190243, +8632347, -3391951, -813896, -312459, 1090385, -1526861, 3969624, -685047, -2633889, -472446, +5422933, 402116, -2699924, 2534031, 1896228, 3559454, 1488743, -2694555, -1752884, 6042482, +877247, -1526861, -1152125, -1209033, 1227287, 1306744, -733366, -7649874, -1875290, 401579, +5348845, 1929514, -605590, 17717, -3003793, 4265440, -4253628, -5682779, 803159, 111669, +-1878511, -1257889, -1533840, 889595, 594853, 583042, -1930051, 5092221, 235686, 6804839, +-991601, -3089692, 1567663, -237834, 1065152, 1690607, 3507378, 2456721, -736587, -1671816, +-1422171, 4548371, -4261682, 398895, 325881, -511638, -3556233, 3675955, -1600949, 852014, +3360812, -864362, 1090385, -2479807, 2146410, 1403381, -3081639, -1589138, -318364, 336081, +-245350, -389768, -1611687, 2766496, 427886, -1124745, -1688996, -38118, 5516886, -747861, +-2747705, 3634079, -1511292, -3357054, -457951, 2907156, 2033130, -1832340, 385473, -2299955, +1224603, 1335198, -1240172, 2887292, -922344, -5186173, 822486, 2692945, 2364916, 350577, +-537945, -3772055, -1428614, -508954, -1815697, 3380139, 4599373, 2199023, -6692096, 2174327, +7473243, 3134789, -572841, -92342, 3320547, -1794223, 935229, -3287798, -3155190, 2901251, +3106335, 1542967, 635655, 508417, 392990, 1487669, -537, -414464, -1483911, 675384, +-2639258, -579821, -1387274, -4829691, -2791192, 750546, 1173063, 4379793, -234613, 1766305, +-2786897, -4351339, -2589329, 2262911, -1856500, -2049773, -2018098, -2884608, 2820720, 330176, +2099165, -932545, 692027, -5857799, -3628711, -2695092, 3837553, 673773, 942745, 2005213, +-1941862, -1074279, -344671, 650688, -4283156, -868120, -2847563, -3250753, 314069, -2863133, +2050310, 1810329, 7813620, -1903207, 4041564, -2584497, 1751810, -1760937, 541703, 6748468, +1219234, 2950106, -3038153, 2095944, -2717104, -1301375, -295816, 4336843, -1957968, -1016297, +-3648038, -1923609, -4333622, -493921, 4387846, 1137630, 463856, 877784, 4032438, -3666828, +-6575595, 1745904, 2253784, -4167192, -193274, 847182, -972273, 2081985, 5345624, 1488206, +-1285269, 650151, -1915019, 2641942, -7033546, 1314797, -2575907, -4878546, -3830037, 2225330, +-1189706, -61740, 4828617, 1835025, -879931, 608275, 4076461, -1835025, 2960843, -1258962, +754304, -4340065, -982474, 3220152, -1216550, 3958886, 4065724, 1563905, 2489471, 5735929, +-1498944, -7692287, 1589138, -3336653, 46171, -9461276, 60666, 3240016, -2132451, 3740380, +302258, -3321084, 1036698, -7087233, -4840965, -1621887, -1994476, -5863704, 2820720, 3462281, +-30065, 3227131, 6979, 965294, -2182380, 2927020, 1896765, -1009854, 6374269, -1141388, +5214627, 4781909, -536334, -678605, -262530, 1570347, 1947768, 763967, 2201708, 861141, +534187, 7325067, 2464238, -3250753, -1825361, -162672, -2144263, 847719, -1692217, 6802155, +-12954158, -86436, 105764, 3233574, 5895380, 1896228, -2742337, -4902169, -606127, 6109054, +-1017907, -1297617, -4443681, -215822, -1745367, 4503273, 5657546, -9505299, 6321655, 3819837, +-3373160, -859530, -4731980, -62814, -1281511, 25770, 3445101, 6165426, -2126546, 1359894, +-1407676, -2223183, 2559801, 4234301, 3157338, -2790118, -4192962, 3026878, 2422899, -1676648, +-528281, 472983, -5442798, 2017561, 2044404, -2362232, -3512210, 1420560, -2573759, 5043902, +2605435, -9015673, 4471061, -3888556, -9464497, -2907693, -307090, 1939715, -3586298, -221191, +2673080, -4382478, -3757023, -4497905, -787053, 1126355, 10012106, 1496796, 2502355, -1962263, +-4073240, 6480569, -968515, -7322383, 1576790, -7272454, 2348810, 8139500, 2195802, 1762010, +3578782, 5127117, -1119376, 12534325, -1804423, 8971650, -10553808, 3649112, 6210523, -2229625, +896038, -2966749, -244276, 4846334, 8862128, -2478733, -4326106, -1269700, 4167729, 896038, +9030706, 4263829, -893353, 1315334, 16643, -4162360, 924492, -904091, -1199907, 3951370, +5255430, -8086350, 9498857, -7103339, -3755949, 1635846, -2752537, 4767414, 273804, -2669859, +6791417, 9335648, -6741488, -1200443, -482647, 2926483, -6342056, -10742250, -4807142, -3248069, +3424163, -7432441, -4051765, -818191, 8050380, 4930623, -5079873, 3917010, 2412161, -2890513, +-4042638, -652835, -2284923, -3121368, 831613, -2065879, 6387153, -4355097, -220117, 4925254, +-3043521, 5273683, 7448547, 1440962, 1667521, -732292, 4575751, 4103305, 5021891, -4818954, +-6864969, -3379066, 4342212, 436476, 18578418, -1197759, -646393, -4298189, -8663486, -12228309, +-2930242, 4346507, 6425271, -3882114, -8151311, 1271847, -92879, 8240969, -2836826, -3035468, +9723806, -5135171, 494995, -7365332, 4737886, -1271310, -97711, -1432372, -11731703, -7013682, +493921, 6709813, 4188667, 801548, -12129525, 8267275, -4958003, -4668630, -5277978, -6576669, +-1158031, 6840273, -5399311, -5554467, 3974455, -1595580, 2270427, 12362526, -5284421, 602369, +582505, 5462662, -3557844, -2894808, -1636383, 8027294, -1671279, -3635153, -624918, 6380174, +7874286, -7243999, -8557185, -2499671, -1027034, -2410014, 2260227, -5546951, -1500017, -4874251, +-8234526, 2033130, -5908802, 4977867, 6558952, -4875862, -5426691, -4986457, 2809982, -695248, +9416716, 15791521, -8751533, 375810, -135291, -1336272, 1735704, 4408247, -12894566, 11578158, +-9006546, -4815732, 12145631, -2986613, -5410585, 3694209, 4670240, 15569, -376347, -9429064, +6022081, -1575716, 2295660, -6347962, 7885560, -984621, -12319577, -13809394, 4857071, -2797098, +-6619082, 3087545, -207232, 20566450, 3898220, -4204773, -5823439, -12741020, -3949759, 1962800, +-2555506, 9168681, -1568200, -14874009, -892816, 9330280, -3788161, 692027, 9101036, 5100811, +-4240744, -1645509, 7563975, 8404714, -3505767, 860067, 2094870, -5543192, 2865817, -3327526, +364535, -152471, -993211, -4494147, -7454453, -12199318, -6097243, 4604205, -10558640, 3904662, +-11411191, 286152, 4379256, -2033130, -8496519, -4236449, -1599875, 7597797, 6329171, -4777078, +-4613869, 8115341, 3619584, -4946192, -5000953, -4186519, -378494, 7846905, -1188095, 577136, +-276489, -244813, 10444824, 4948876, 7057705, -623844, -323733, 3406983, -5133560, -9078487, +7489349, 11632382, -7772280, 9986873, -2780991, -1144072, -4347581, 5097590, 507880, -5767604, +3637301, 9463424, 7671886, 3366718, -6990596, -3023657, -14347875, 2349347, 7765838, -4725538, +-975494, -5791764, 1698123, -3442416, 5834176, -3582540, 2071785, 6772090, 4028143, 12761422, +6821482, 4406100, 8294119, -6641093, 12352326, 4012036, 7562901, -2097555, -8261907, -12479564, +-2359011, -1500554, -3338800, -2061584, 4718559, 6181532, -12972412, 9562745, 3051038, -1786706, +13657996, 10870025, -17858474, -11682848, 10867878, 19191524, -2030983, 2910914, -1909650, -2327336, +-2209761, -723165, 4510790, 2929705, 11196980, 2884071, 10681047, 3149285, 4427038, -1480690, +-6635725, 2684355, 446140, -5096516, 8010114, 852551, 2926483, 1945620, -2233920, -7877507, +510027, -8942659, -3537443, -10352482, -7447474, -4234838, 8053601, 1151588, 3636227, 10492068, +-5235565, -987843, 551903, 3690451, 416612, 139586, -3742527, 7710003, 16456167, 8177081, +-14612016, -9938017, -11091753, 11791296, -2784750, -11184095, 5410585, -6321118, -1793686, -1921461, +-1973538, -940061, -932545, 10412611, 15848429, 6561100, 13274670, 9694278, 2946885, 2319819, +1363115, -3595961, -7472170, 2327336, 16882442, 3628711, 5738077, -5163625, 4117800, -8108362, +-15259482, 718333, 7706245, 2772402, 6142877, 9418863, 9666898, 988379, -11097659, -8807367, +-14604499, -21832392, -610422, -2258616, 9629854, 7740068, -8540006, -4218732, 5598490, 12079059, +-14713484, -8948027, -2929705, -7522635, -5543729, -2520609, 4422206, 9503152, 348429, -5017596, +-6774774, 9608379, -7295539, -2589865, -188442, 13340705, -839666, 1545115, -20076824, -1029182, +5068062, 10865730, 13660143, 3404835, -12761422, 6638409, 550830, 6611566, 8836358, 1937030, +4685810, 10257456, 17534204, -10815265, -3881040, -486942, 5920613, 18632106, 8463233, 6561637, +11156178, -2983392, -4799089, -10379862, -12259447, -7649337, 1256815, 9167608, 22024056, 9402220, +4622996, 13077102, -15334644, -10162429, -2064806, 22385906, 8461622, 1071058, 11469710, -6839736, +17412872, -3620658, -15941845, -2454574, -15829102, 13191992, 7220377, 5552856, 4612258, 918586, +-5253282, 6748468, 8817031, 5240934, -3416647, 8824547, 10643466, 10451266, -1435056, -7726646, +14536317, 4223027, -1091995, -1697586, 1597191, -8818642, 9405978, -985695, -2797098, -11410117, +-6801618, -6691559, 17083232, 7036767, 85899, 3204046, 8806294, 13734769, 6448894, -15512348, +14978162, -738734, 8657043, 4776541, 13183939, -1919314, -17293686, 6574521, -784368, 8352101, +-3053185, -5820755, 6456410, -1451699, 4395362, 23131084, -2610803, -8583492, 77309, 4383014, +-10564009, 19163608, -7865159, -8808978, 15257334, -6677064, 5049808, -4895726, 3313031, -13067975, +-4492536, 9088151, 170188, -12769475, 2080912, -3628174, 8717710, 3820374, 3645354, -22235582, +5513128, 1735704, 7435126, 16469052, -918049, -632434, -476741, -6374269, 13640816, -13365938, +2981244, 10537165, 4523138, 9802189, -5728950, -5788542, -10055055, -13884019, 4117263, 3576097, +6907381, 17359184, -8023536, 15068893, 5530308, -12035035, -9596031, 1073205, -606127, 1995012, +-2220498, 8120173, 9702331, 12264279, 2443837, -26492968, 4636954, 9586904, 5934034, -16983912, +8731132, -8050916, 7199439, 2523830, 2588255, -1098438, 4642860, -805843, 20976084, 12794171, +-13343927, 2792266, -32600950, 6483790, -11776263, -7487739, 5177583, 7514046, -18291728, -28106802, +15104863, 12817256, -31768800, 11309723, -11186779, -4410932, -5063230, 9949292, -7394323, -887448, +2560874, 27043262, -2879776, 19245212, 5910949, 14236206, 1888175, 3338263, 5865852, 25992068, +27987618, -15030775, -11874511, 14408005, -18712636, -1058710, 6205154, -20647518, 12034498, 466541, +-665720, -4679904, -5066451, 1214402, 3002719, 2501819, -11122892, -1089311, -2037425, -17013976, +8959839, 9767829, -16755741, -14412300, -5552856, 8220568, 10153303, 7517267, -41339, -4952098, +9221295, 26717918, 16090558, -6996502, -2729452, -5342403, 19937238, -16750909, 7974681, 2399813, +-22712324, -11512660, -74625, 1449552, -19064822, 11962021, 10039486, 2059437, 4882841, 7497939, +-17921288, -4540318, -14645838, -1708323, 10949482, 13849122, 11331197, -13292924, -4338454, -4004520, +1676648, -15228880, -2709051, 13099650, 19842212, -1208496, 1121523, -12216498, 862215, -359167, +-9044127, -14622753, -3019899, -6670084, -11273215, -7925826, 12377559, -10450729, 8930848, -3019362, +-2709051, 17763984, -12336220, -6604049, 2521146, 7275138, 869731, -23072028, -14454712, 2841121, +-3908420, 3951370, -3413962, -7123204, 14667850, 3348464, -1435593, -5920613, -33597920, 20248624, +-6202470, -205622, -2997350, 1431835, 9440338, -5423470, -9268539, -15470472, -1612223, 7021735, +-9772661, -12248710, 4967667, 19745576, -3461207, 18357764, 13325673, -13289703, 24472724, 16315507, +-16322486, -25012278, -7304129, -10901701, 1254667, -7949985, -2020245, 11955578, -21002926, 10176925, +-3432216, -11905649, -13133473, -13329968, -15835544, 3015604, 9737765, -9113921, 13774497, -21311628, +38707856, 54278188, -5173288, 6528887, 3558381, 13065827, 26426396, -25273736, 362388, 4242354, +556735, -9200894, 1414655, -11346767, 13285944, 32242320, -6786585, 541703, 1898376, 9645960, +950262, 3626563, 12505871, -25142202, -1808181, 24282672, 25209310, -29616484, -6183143, 3999688, +4198868, 8505646, 22205518, 5967320, 44731548, 7154342, 13859859, 6280853, -6929930, -9585293, +-436476, -31681826, -44973676, -15628849, -14504641, -47359532, 7500087, -1534914, -26063472, -13248363, +-43748000, -5284958, -5816997, 29441464, -29074244, 17760764, -19726248, -2223183, -12793097, -11040750, +12264279, 26242250, -20153598, -8507793, -1143535, -6912750, -1263794, 10537702, 22804666, 22191560, +-14796162, 45493904, 33444910, 3285113, -13824426, -37855840, -19684372, 35824860, 58922120, -13659070, +-3309809, 10782515, 26206816, 9184251, -15693274, 9895068, -13458817, 3660386, 8061117, -2934000, +-18067316, 5572720, 18533858, -4478577, -27363236, 21359946, -6561100, 17466558, -6757058, -4065724, +-7046431, -10735271, -832687, 19349364, 10299332, 3344706, 15076946, -7199976, -6584185, 6060736, +-8737574, 10871099, 5779952, 16543677, 27627914, 24765318, -18265422, -32935956, -12609487, -1980517, +25289304, -9819369, 4000762, 10496900, -10883984, -15174656, -25029996, -24981140, 19004694, 21045340, +-17543868, -60219200, 4173098, -4249334, -9125195, 4651987, -6949257, -24206972, -12315819, -5728950, +-17939542, -7262790, 24337432, 9617506, 13275744, -5894843, -10184441, -5539971, 11969000, 2328946, +-570157, 12302934, 28611462, -13484050, -984084, -11278584, 6400038, -15663746, -23666344, -6087043, +-3323231, 3782256, -7577933, 18070002, -10437844, -39084740, -20016696, 12514998, -17303886, 20540682, +19787452, -9176198, -2124398, 1985886, -10915123, -723702, 7013682, -2459406, 4181151, 26169772, +23279796, -6808060, -34921844, -27925878, 2840584, 18094160, -13523778, -7023346, -16021839, -22491670, +2866354, -6985228, -24451248, -28506772, -39572220, 15368467, 6536940, -44560, 24348170, 30382598, +-199179, -24398098, -16703128, -19940460, -9569187, -7724499, 8338142, 11099269, -9533754, -18299782, +-19652160, 10089952, 11336029, -21765284, -18037788, -9005473, -1570884, -13157095, 9587978, 49737868, +32963338, 58313844, 22773528, -32480154, 40607304, -2398202, -14122389, 1392106, -10690174, -37579892, +35343284, -20056424, 2274185, 10436234, -4496294, -26190710, 26489748, 25367150, -14608794, -20021526, +2711735, 35108136, -18425410, 10028212, 22452478, 6907918, -8483634, -16734803, -11031087, 7804493, +-2679523, 5949604, -9831717, 6561637, -21763136, 31856846, -3067681, 7156490, -1480153, -40148280, +12546136, -11125576, 20753282, 12446278, 22188338, -8671002, -38620884, 27752468, 12628278, -13221520, +-23960012, 19852950, 10849624, 21099026, 21602074, -18778670, 8833137, 22227530, -32498406, 29883308, +15134928, -1149978, 9966472, -17237314, 38122128, -4518843, 25341918, 10794327, 44382044, -3453691, +-6859063, 5689758, 18742164, 11240466, 13535589, 43462920, 4007205, 9935870, 27554900, -18155900, +19930258, 644782, -26437134, 8912594, -5789079, 30200062, -17816598, -25981330, -64806760, 3463891, +-7856032, 1933272, 50342924, 41280540, 59604484, 31345746, -15716896, -12196097, -24538758, -32937030, +11689290, 2812667, 8757975, 10381473, -9439264, 14893336, 25515864, 4598836, -6641093, -8661875, +-17808546, -12015171, -10689100, 4894115, 8264591, -25875030, -15072651, -3627637, 17520782, -7886097, +11370926, 13783087, -36439040, -36206036, 7100655, 10395968, 8308078, -27354646, -12263205, -24581708, +-11563663, -11305428, 23937464, -31144418, -42900816, -16353625, 8928163, 7244536, -32971390, -26891864, +-20646444, -16063178, 18443126, 25268904, 1596654, -8767639, -10072772, -6038724, -5115843, -11634530, +-36467492, 12011950, 28388660, 25102474, 8482560, 34350612, 47327856, -4216584, -5336497, 35645008, +-8007967, -21698174, -48695804, -16089484, 5800354, 42026792, 15570867, 2866891, 16187732, -18237504, +1797444, -9585293, -12535399, 7332583, 3798362, -11565273, -17614198, -11069204, -16276315, -14365592, +6337224, -11198590, -4417374, 7482370, -4464082, 1299765, -5030481, 20683488, -15691126, 16869020, +7227893, 1454920, -15078556, -7410966, 13788993, 4683662, 746251, 9717900, -731755, -4746476, +-5435818, -6049999, -3218541, 1399086, 1154809, 1625108, -17487496, 9343164, -6489696, -7905961, +7992934, 3942243, 3979287, -4114042, 14796162, 10764262, -14731738, 14118094, -235149, 9364639, +21806622, -4811974, 12844637, 9565429, -7606387, -7736310, -10692858, 446140, 4973036, -21870510, +11713450, 2393908, 19810000, -7322383, -33550674, 22582938, 6023692, -210990, 6268505, -17301738, +3111704, -5026723, 12183748, -21638582, -62672700, -92422864, 18921478, 72844792, 2386928, 199162464, +182884544, 126001456, 216108800, 166652240, 21722334, 3207267, -23616414, -159597232, -163501344, -123996240, +-213903328, -198955776, -58145268, -67002028, -68470904, 14900852, 38499012, -34309808, -12937515, 62480500, +38591892, -3599720, 45242648, 31309774, 161061, 37966976, 91492464, 59929828, 18900540, 94227824, +68444600, 3332358, 79732848, 109726216, 23727010, 9508521, 111003968, 28484224, -48183092, 54516020, +84262960, -48387100, 16464757, 119560080, 7308961, 16437914, 144024752, 112632296, 4876936, 88148832, +117664384, -47656420, -30982820, 29654064, -106659072, -173859200, -119858576, -191541584, -282103104, -259459504, +-289848000, -367075296, -387062464, -342896224, -361456384, -340003584, -254369968, -200921792, -96309808, 2296197, +124596464, 138281840, 31000000, }, { 708670, --98247, 1244467, -1082332, -430034, -3767760, -1692217, -4007741, 399432, -2260764, -2665564, -1319092, 2340220, -2917357, 2914672, 334471, -3683471, 585726, -4206921, 2381023, -1177358, --685584, -1367410, 955093, -1877438, -248571, -1218160, 1555852, 3164317, -2915209, -1376000, -1154809, -636192, 2127083, 3264712, 136902, 1548873, 1027034, 963683, -427886, 2384244, --3133716, -1216013, 3446711, 112206, 4090956, -4457639, 2360622, -1635846, -6176700, 3228742, -2874944, 956167, -2195802, -1484448, -483721, 660888, 482647, -1101659, -2155000, -1287953, -911607, 146566, 1883880, 4257387, 996969, 333934, 271657, 3554086, 2046552, -762894, -976568, -527744, -1680406, -346819, -2671470, 3749507, 5184026, -3048353, 213675, 165893, --3712462, 4962835, -1979443, -1942399, 1421634, -5123896, -2294050, 5488968, 1250372, -2239826, -3906273, 1206886, 839666, -805843, 1908576, -34897, -6562173, -315680, -2430952, -297427, --135291, -6291590, 106300, -4046396, 229781, 630823, 2818572, 3352222, 1119913, 827855, -629750, 2893734, -1574106, 983548, 201327, 445603, 623307, -882616, 2610803, 3863323, --7427609, 3444564, -1926293, -4498442, -2841658, 5692443, 2890513, -1955821, 3272228, 913754, --2019708, 1977833, 73551, -45097, 331249, 339302, -743566, -17717, 456340, -404264, -2490544, -1618666, -3406446, -3447248, 12348, 977105, -181462, -27380, 1905355, -991064, -3327526, 2783139, 184684, -2187749, 1367410, -1167694, -1778117, 457951, -3728569, -419296, --2794950, 1003949, 1731409, 1702418, 1323924, -2870112, -209380, -2370822, 2572149, -4925254, --2815888, 2541547, -5435818, -574452, -355945, 1428614, 1198833, 2716030, 5650030, 2648921, --694174, 28991, -2008434, -1524177, -9953587, -9124658, -599148, 6845104, -1670205, 5480379, -493921, 1609002, -1665911, -7654706, 4013110, 1283122, -2295660, 1964948, -4062502, -766115, -2345589, 1089848, 7264401, -4893042, 4420595, -2202245, -5666136, -2571612, -1522029, -1488743, -2048163, 1779727, -4566624, -1971390, -2593624, -899796, 4450123, 4809827, 5093295, -3661997, -615254, -2280091, -367757, -1926293, -2644089, -3046206, -3708168, 3723200, -3531000, -4523138, --3958349, 126702, -1582159, -1247151, -3141769, 681826, -3508988, -247497, -1465121, 5335423, --3468723, -3763465, -8432631, -10899553, -2677375, -4864588, -4510253, -1077500, 2210835, -2780991, --6584722, 4036196, -9530532, 2828236, -1642825, -1729261, 6079526, 4294431, 2215130, 815507, --1111860, -1013612, -2362232, 950262, 4103305, -3395172, 3886946, 3594351, 999117, 484258, -1581085, 2730526, -6228777, -2741263, 5815386, -4631586, 320512, -171799, 3531537, -538482, --1434519, 584116, 6033892, 3271691, 2057289, 1851131, 3333968, -5515275, 4095251, -4540854, -3787088, 2375654, -1207423, -956704, -1897839, -2626373, -3986267, -452582, -1288490, -3439732, --3524558, -2371359, -2073396, 1954210, -5541582, -369904, -2477123, -5534602, -2233920, -1219234, --3464428, -1482301, -3177739, -1565516, 2919504, 3377992, -5755793, -3645354, 2197950, -1432372, --6308233, 4112431, 8034273, 1391569, -1597191, -3889630, 1103807, 3517578, 7295539, -3837017, --1248225, -4774930, -3376918, 3640522, 4163971, -5749351, 3477850, -2020245, -3243237, 5273683, -246424, 2747169, -7330973, 239444, -4601521, 811749, -5777268, -4097936, -708670, -1719598, -12907450, 3689914, 3565360, 2135673, -9098351, 4915053, 3963181, -2430415, 79994, 3726421, --256087, 3939559, 5348308, 4571993, -2542084, -73551, -1250909, 2181844, -1991254, -3016678, -2045478, -2914672, 1525787, 933082, 517007, 2215130, 1604170, -6445672, -263604, -1972464, --7820599, -4345433, 3191161, -3405372, 9162239, 4050154, 8973797, -115427, -4380867, -4648765, --6288369, 9607842, -2335389, 4408784, 4906464, 1048509, 3461744, 3165928, 3066607, 1257352, --6303402, -313533, -2419140, -896038, 4365298, -337692, -358093, 3083250, 1941862, 3195456, --2714956, -9908490, -5916855, -3706557, 7384660, -6560563, -1970316, 4582730, -467078, 925029, --5528160, 9754408, 567473, -3663607, 7669201, -4581657, 11857868, 6218576, -2630131, 1486596, --3332358, -2175401, -10856604, 3993246, -4933844, -626528, -406411, -2229088, 4675609, -1654099, --4756677, -4452271, 1058710, -4034585, -4705137, 2882997, 338229, 3609383, -1940252, -9649718, -3246995, 4670240, 5259188, -4897874, -6532646, 1420560, 8472360, 8120173, -7502234, 3847217, -8996883, -6460168, 1561221, -3548180, -7558069, 10959146, 3730179, 10187126, 8910983, 1526861, --7672959, -4339528, 3485903, -325881, 1248225, -7814693, 476205, -14007499, -6310381, -10910291, -6416681, -6160594, -623307, 2121714, -2234457, -2776696, 2919504, 3419331, 9336185, -1311576, --2625836, -7451769, -6867653, 6265821, 854699, 2157147, 11186779, -3551401, -443455, 6192269, --3337727, 2826625, 1579474, 6155762, 5018670, -3976603, -1217086, -8057896, 7625715, -5567888, --7824894, -7066832, 3674345, -2763812, -4495220, 7887171, -3285113, 8143795, -5976447, -4276177, --1908039, 5136781, 6284074, -987306, -8656507, 2275796, -5923834, 9459129, 1044214, 5201743, --9200894, -4408247, 1026497, 4321811, -12020003, 3937411, 3999688, 2075006, -9035537, 6730751, -12062416, -11897596, 4652524, -7494181, 4890894, 170725, 4405026, -3871913, -26307, 2225867, --7598334, -4377109, -3170223, 5666136, 6677601, -2668249, 3214246, -2141578, 4945655, 5558225, -2514167, 1263257, -6107981, -2938295, -7674570, -9220758, -5947993, -67646, -2835752, -1067836, --3573950, -9246528, -2905009, 1033477, 747324, -1253594, 12899934, -11244224, 3784403, -6007049, --1622424, -4066260, -3442416, 4664872, -3459596, -451508, -4188130, -3562139, -5079873, 5667746, --6362994, 4440460, -1740536, 4391604, -866510, -252866, -987306, 4109210, 2544768, -1339493, -10696616, -809601, -6237367, 1624035, -5736466, -7647190, -8220031, 5765994, 1875827, 4890894, -5822902, 2534031, -12418361, -1597728, 2253247, -3571265, -9656160, 11135776, -185757, -131533, -10515154, -3343095, -9658845, 3049427, 7283728, 12137041, -235686, 4808753, 1680406, -11727945, --2698850, -6360847, 6277632, 2694018, 3563212, -4727149, -170188, -1012539, 1620276, -4315906, -5900212, 937914, -3892851, 6031208, 1533303, -7860864, -5550709, 1199907, 8553964, 6614787, --9322763, 18957448, -336081, -124017, 5988795, -1254667, -1911797, -643708, 13157632, -6715182, -6846178, -1949915, 9328669, 2185065, 8442832, -3353833, -5406827, 3926137, 7346542, -3645890, --6689949, -8387535, -6354941, -3497177, -660351, 7164006, 986769, 6256157, 64961, -2218351, -7257421, -5561446, -9843528, -2704756, -5927055, -6075231, -11137387, 9708237, -3824132, -780073, --720481, -7309498, -605590, 663036, 5280126, -7704098, 281320, -1114544, -3368328, -16101296, --2082522, 7723962, 5778879, 7909183, 775242, -8623221, 22846004, 9740986, 15489263, 1702955, --6990060, -2663954, -2372433, -9690520, -772557, -3767760, 4734128, 83752, 336081, -3073049, --4348655, -8202314, 2596308, 856309, 214212, 4294431, -551903, 1838783, -1032403, -7145752, --5785858, 4353486, -204548, 10448045, -13438416, 10559177, 6223408, -4672925, -9811853, -14930917, -2864206, 11718818, -6327024, 11323144, -1222455, -593242, 2262911, -3455301, -13612362, 1441498, -5834713, 2600066, -6207839, -1748589, -4119948, 2607045, 5833640, -759136, 970126, -1452773, -5392332, -3620121, -3051038, 2767570, -4636417, 2419140, -17631378, 12599287, 11647414, 13438953, --4194036, -12183748, 4416837, 4776004, -17883170, -16501801, 16125992, 1687385, -7566122, 5988795, --11059004, -12861280, 2075006, 33432026, 15789910, 6214818, -8805757, 173946, -2943126, 303869, --3497177, -1801739, -3899294, 1279363, 9877888, 1981591, 12118250, -4537096, -3485903, 2281702, -8631811, -1414655, -726386, -17309792, -258772, -9648644, -9664, 13782013, 10222559, -3333968, -10040560, 19093278, -8332774, 5744519, 16255914, -11101954, 17192218, -992137, 7550553, -3484829, -1531156, -1761474, 3193308, 4333085, 17324288, -5691906, -982474, 4881231, -6424734, 5507759, -3846680, -3598646, -5932424, 16972100, 631360, -7857106, -944893, 11070815, -1825361, 7939247, -2920041, 1167157, -765578, -2966749, 21974126, 3593814, 3345780, -11590506, -6266894, 259309, -2769180, 4076461, 5297842, -21837762, 1230508, 1033477, 15795816, 2156611, 4201552, -1813013, -14379551, -23447300, 943819, 11491185, -13538274, 3092913, 2916820, 10791105, 2401424, 826781, --3582540, -6442, -11626476, 3633006, -2769180, 1717987, 3386045, -2405719, -8804683, 2894271, --6928856, -12706124, 7084549, -7361574, 4691178, -11982959, -7196755, -1640141, -3507378, 2340757, --4857071, 12257837, -107911, 11658689, -12761422, -11248519, -3482682, -285078, -267362, -4230543, -10792716, 8402567, 22564148, -4153770, 14317810, -9039832, -1745904, 3826279, -17628156, 19090056, --1052267, 11623792, -1202054, -17859548, -11368242, 6460168, -24521042, 11032160, 645856, 4133369, -11300596, 16819092, 6144488, -7242389, 16420197, -17493938, -1538672, -5474473, 2430415, 13700946, --12206297, 31065498, 4461934, 7630010, -8836358, -12650289, 4719632, 52613, 26878980, -3833258, --8757975, -15152645, -9765682, 7390028, 5199595, 4347581, -1422171, -14850386, -22468048, 1798518, --13313862, 18531174, 2973728, 15091978, -8652748, 6407018, -5356361, 7929584, 22274774, -3390877, --1599875, -3039763, 6365679, 7442642, 4452808, 1868311, 3023657, 9698036, 9266929, -4514011, --6552510, -6295349, -6522445, 25138980, 10714333, -14040248, 12177306, -2793876, -10816875, -7959648, -5463199, 9661529, -15759846, -21388400, 3670587, -9090835, 30250528, 15933255, -3663070, -2269890, -7492034, 14344117, 4671851, -459562, -2863670, -16449188, -3174518, -1645509, -77846, -7042136, --14914274, 9035537, -5769752, 13091060, 4205310, -11764989, -6699612, -5393405, 1513439, -16272020, -10505490, 17598092, -8007430, 11390253, -3815005, -3428995, 6683506, -11100343, 6238440, 14465450, -2323577, 24152748, 9830106, -8599061, 8469139, 5247913, 7252053, 1452236, 10976863, 11834782, -15171972, 7301445, -8005819, -6776922, -11822434, 34897, 24266028, 1560147, 9341554, -15249818, -32114008, -9011378, -28073516, -11511049, 19614042, 2662343, -4684199, -1949378, -3321620, 16828218, --13460428, 10142565, -4225174, 20923470, 28606630, 16645683, 12741020, -9921911, 15312632, 11403675, -8186208, 12696460, 15139760, -2738579, -32628866, -18602040, -24472724, 6496675, 5224291, 6974490, --7922604, 10770167, 23797876, 2269353, 44560, -7190312, 4655745, 10895795, 13314399, 4477504, -6368363, 9932112, -7813083, 23434952, 9558987, 4312684, -6559489, -18451716, -7138236, 9639517, --799938, -26043608, 34870840, -12468290, -6627672, 10400800, 686658, -3755949, 2666101, -7032472, --8002598, -2078764, -18743774, 4363150, -20163260, 251792, -15971373, -18420040, -3535295, -4169876, --3887482, -13567265, 5882495, 13853954, 3860102, 10526965, -18782428, 18227842, 33855080, 3160022, --13569412, 20784958, -17335024, -27816356, 45704356, -5053566, 3213709, -3556233, -20490752, 15388331, --18593450, 7622493, 27866822, -978179, 38292856, -30386894, 28827284, 7948374, -19054622, -10468446, -3583077, -18823768, -9075803, 19663970, -19804094, 12445741, -13055627, 6346888, 22041236, -47997332, --18661632, 19218904, -8685498, 4738960, -13246753, -40254044, -10234370, 12993350, 31172336, -9996536, -15860240, 301185, 7626252, 15917149, 10641855, 27661736, -6907918, 1072668, 7920994, -24704652, --15516106, -7429757, -7633231, 5571110, 762894, 2001992, -12461848, -2200634, -16596291, -13879187, -7039989, 34236796, 20159502, -9086003, -10537702, 16287053, 20055886, -11730093, 5660230, 15011984, --5456756, 32750736, 11704860, 4753992, -24749750, 15548318, 3803731, 12229383, -1976222, 3088082, --3526168, -5557688, -39233988, 10460393, 28322088, 13492640, 4443681, -950798, 14704894, -22672058, --40651864, 2812130, 55834036, 12887586, 44503376, 40916544, 1464584, 3038689, -25365540, -24315420, --1567663, -21239688, 28469190, -61469572, 12214350, -24635932, -47207060, 7317551, 22635014, -9421548, -28264106, 52303576, 292058, 15100568, 8206072, -25790204, -8647917, 27987618, 7457674, 12994424, --7728794, 8978092, 3592740, -8325794, -550293, 15143518, 13801877, 19235548, -8912594, -963146, --40735080, -36050880, 4205310, -21779780, -137439, 21341156, 3915400, 3732327, -7836705, -3082176, -11922292, 32739998, -23674934, -11625940, -3885335, -20645370, -2523830, -19805704, -7538742, -21077552, -19092204, -25826176, -3140695, 6593312, 12382391, 49675056, 63054416, 18335216, -17726940, -32284196, --3922916, -21425444, -10075456, -34291556, 4514011, 37096168, 24895778, 23215908, 1601486, 7435662, -34929896, 37328096, 24657944, 597000, 15220827, 8890045, 7056632, -38064684, 11548630, 8180839, --10368051, 29055454, 33100776, 331786, -955093, -9408126, -11338177, 30794378, 23897198, -16358457, -16544214, 22568980, 3798362, -30873836, -34351148, 31966368, 12400107, 6488622, 27207544, -607738, --10236518, 26799522, 8505109, -22455162, -9649181, -8928163, 10585484, -653372, -11579232, 3658239, --12923557, -2691871, -5190468, -8144332, 20244328, 34240016, -10923176, 6037114, 17954038, -9691594, --5941014, 5486284, 21478058, 5064304, -14287746, -21114060, -22398792, 11235098, 14652818, 30773440, --13952738, -16030429, 12709882, 17656074, 31505196, -2469069, -54268524, -13589277, 19492172, 16219944, -9652402, -12640089, 1244467, -24095840, 5099200, -11497091, 25026238, 31287764, -8053064, -1251983, --17298518, -23115514, -5770826, -44772348, -5937793, -23816668, 21985400, -19446002, 23317914, 22502408, --44629004, -4961224, -13735842, -11806865, -16166257, -26917096, -6082748, -15073725, -27232778, -41276248, -19988778, 21008832, 12394739, -27738510, -37534792, -29019484, -16495359, 6345814, -1501628, -36802500, --22032108, -25398290, 34950296, 10479720, 14983530, -11664057, -20532628, 44157096, 10585484, 13320841, --9090835, 1970316, 12656732, -9876277, 9898289, -4061429, 20687784, 29350732, 628676, -25183004, --20276540, 23000624, 15587510, 19998442, 5224828, 4283693, -11648488, -5732171, 2560338, 13582834, -30652108, -1339493, -59901372, -55728276, -208843, -14478335, 34340948, 34824668, -41064720, -28207198, --17876728, 48646948, 43343200, -25210922, 6079526, -32630478, -31304406, 17405892, -14819248, -806917, --5354751, -22716082, 15177878, 15392089, 12736189, 50146428, -36352068, -9808095, -2134599, 11946452, -45974940, -29348048, 27399206, 34248068, 16211891, -68102072, -32190780, 27567784, -22893786, 17476758, --8529805, -26146150, 15649250, 9376987, 2275259, -9487583, -50839528, -799401, -4851703, 3909494, --10179072, -30798136, 22424024, -17558364, 40705016, -821949, -7288023, 25372520, 12562242, -17175038, --5414343, -12000139, 20102058, 41160284, 24771224, -27248346, 3503083, -16824998, 15351824, -14005888, --11057930, 7372848, -5215164, 24536612, -22206592, -39060044, 7474317, -11028939, 12473122, 21593484, --58884000, -4598300, -14410689, 6877317, 56958244, -11428908, -48462264, -6626598, 34525096, 23938000, --28382218, -2351495, 19512036, 5656472, 24953224, -38619272, -28532004, 33155536, -33268280, -61436824, --25690884, -2363306, 71584760, -14144401, -46699180, 27497454, -52123188, 96954592, -65148212, 17975512, --662499, 21985400, 54570780, 16953846, 7826504, -30975304, -12322798, -30965640, -36223216, -12690018, -7518341, 20447802, 27974732, -3561065, 16392280, 19014894, -16675747, -34886408, 18509162, 6059125, --27693412, -10004589, 26817238, -9550397, -2734821, 23784992, 13848585, 10272488, 3591130, 13273596, --13037373, -32517198, -13727252, 8536784, -12943421, -8137353, 11839614, 186294, -22402012, 22851910, -5153961, -21481278, 2734821, -5682779, 20230906, 10570988, -8144332, 8792335, -12475269, -28737090, -3693135, 6069863, -2647847, -716723, 5782637, -13061532, 3674882, -11348377, 6039798, 19066434, --2438468, 7746511, 8847633, -8804146, 11811, -20258824, 5927055, 9929964, -35408248, 18605262, --22531936, 4983236, -30602, -2695629, 9792525, 52880176, -1740536, -1939715, -14533632, -14657113, -11131481, -800475, 9673340, 15032, -4960151, -7154879, 3830574, -9949829, 10196789, -9370008, -14754823, -11852499, 8711267, -10042170, -1944547, -1704565, -8969502, -7164006, 2375117, -4259534, --2626909, -147640, -6651294, 853625, -1071594, 2160906, -1317481, 4009889, -13612362, 12661564, --4438312, -4183298, 9963787, -7733626, 864362, -9644349, -8092792, 6164889, 5782100, -6749541, --4010426, 2774549, -61203, -11739219, 3402688, 2150168, 377420, 7840463, -2483028, -3218004, --2787971, -7925289, -1796907, 8607651, -8596914, 2496450, -3970161, -896038, 955093, -2487860, -2343442, 340913, 6240051, -8239358, -462783, 5982353, -10901701, 7037841, -4984310, 938987, -4662724, -545998, -5709086, -24478092, -42501924, 16049756, 134322416, 34163244, 73883640, -2470680, --72785200, -23049478, -71622336, -60389388, -21911850, -14198625, -5364951, 40834940, 53819700, 72138808, -90137944, 39562016, -23548768, -41426572, -89251568, -83993992, -34807488, -27720256, -19171124, 37035504, -49444736, 30291330, 45829984, 55897388, 18417894, 15738908, 10048613, -28110560, -13481902, -19953882, --45024680, -24102282, -33504504, -48665200, -27053998, 6747394, 5067525, 28192166, 66602056, 46371688, -37863356, 37757056, 11269457, 3476776, -3898757, -18456548, -27495844, -33911988, -49654116, -43030204, --24505472, -6794102, -16672526, 14811195, 25896506, 22907208, 37986300, 43193948, 27386858, 25731150, -24462524, -2268280, -10924786, -4161823, -33043868, -26174604, -5361193, -24996172, -26481694, -13142600, --12840342, 2990908, 864899, }, +-98247, 1244467, -1082332, -430034, -3767760, -1692217, -4007741, 399432, -2260764, -2665564, +1319092, 2340220, -2917357, 2914672, 334471, -3683471, 585726, -4206921, 2381023, -1177358, +-685584, -1367410, 955093, -1877438, -248571, -1218160, 1555852, 3164317, -2915209, -1376000, +1154809, -636192, 2127083, 3264712, 136902, 1548873, 1027034, 963683, -427886, 2384244, +-3133716, -1216013, 3446711, 112206, 4090956, -4457639, 2360622, -1635846, -6176700, 3228742, +2874944, 956167, -2195802, -1484448, -483721, 660888, 482647, -1101659, -2155000, -1287953, +911607, 146566, 1883880, 4257387, 996969, 333934, 271657, 3554086, 2046552, -762894, +976568, -527744, -1680406, -346819, -2671470, 3749507, 5184026, -3048353, 213675, 165893, +-3712462, 4962835, -1979443, -1942399, 1421634, -5123896, -2294050, 5488968, 1250372, -2239826, +3906273, 1206886, 839666, -805843, 1908576, -34897, -6562173, -315680, -2430952, -297427, +-135291, -6291590, 106300, -4046396, 229781, 630823, 2818572, 3352222, 1119913, 827855, +629750, 2893734, -1574106, 983548, 201327, 445603, 623307, -882616, 2610803, 3863323, +-7427609, 3444564, -1926293, -4498442, -2841658, 5692443, 2890513, -1955821, 3272228, 913754, +-2019708, 1977833, 73551, -45097, 331249, 339302, -743566, -17717, 456340, -404264, +2490544, -1618666, -3406446, -3447248, 12348, 977105, -181462, -27380, 1905355, -991064, +3327526, 2783139, 184684, -2187749, 1367410, -1167694, -1778117, 457951, -3728569, -419296, +-2794950, 1003949, 1731409, 1702418, 1323924, -2870112, -209380, -2370822, 2572149, -4925254, +-2815888, 2541547, -5435818, -574452, -355945, 1428614, 1198833, 2716030, 5650030, 2648921, +-694174, 28991, -2008434, -1524177, -9953587, -9124658, -599148, 6845104, -1670205, 5480379, +493921, 1609002, -1665911, -7654706, 4013110, 1283122, -2295660, 1964948, -4062502, -766115, +2345589, 1089848, 7264401, -4893042, 4420595, -2202245, -5666136, -2571612, -1522029, -1488743, +2048163, 1779727, -4566624, -1971390, -2593624, -899796, 4450123, 4809827, 5093295, -3661997, +615254, -2280091, -367757, -1926293, -2644089, -3046206, -3708168, 3723200, -3531000, -4523138, +-3958349, 126702, -1582159, -1247151, -3141769, 681826, -3508988, -247497, -1465121, 5335423, +-3468723, -3763465, -8432631, -10899553, -2677375, -4864588, -4510253, -1077500, 2210835, -2780991, +-6584722, 4036196, -9530532, 2828236, -1642825, -1729261, 6079526, 4294431, 2215130, 815507, +-1111860, -1013612, -2362232, 950262, 4103305, -3395172, 3886946, 3594351, 999117, 484258, +1581085, 2730526, -6228777, -2741263, 5815386, -4631586, 320512, -171799, 3531537, -538482, +-1434519, 584116, 6033892, 3271691, 2057289, 1851131, 3333968, -5515275, 4095251, -4540854, +3787088, 2375654, -1207423, -956704, -1897839, -2626373, -3986267, -452582, -1288490, -3439732, +-3524558, -2371359, -2073396, 1954210, -5541582, -369904, -2477123, -5534602, -2233920, -1219234, +-3464428, -1482301, -3177739, -1565516, 2919504, 3377992, -5755793, -3645354, 2197950, -1432372, +-6308233, 4112431, 8034273, 1391569, -1597191, -3889630, 1103807, 3517578, 7295539, -3837017, +-1248225, -4774930, -3376918, 3640522, 4163971, -5749351, 3477850, -2020245, -3243237, 5273683, +246424, 2747169, -7330973, 239444, -4601521, 811749, -5777268, -4097936, -708670, -1719598, +12907450, 3689914, 3565360, 2135673, -9098351, 4915053, 3963181, -2430415, 79994, 3726421, +-256087, 3939559, 5348308, 4571993, -2542084, -73551, -1250909, 2181844, -1991254, -3016678, +2045478, -2914672, 1525787, 933082, 517007, 2215130, 1604170, -6445672, -263604, -1972464, +-7820599, -4345433, 3191161, -3405372, 9162239, 4050154, 8973797, -115427, -4380867, -4648765, +-6288369, 9607842, -2335389, 4408784, 4906464, 1048509, 3461744, 3165928, 3066607, 1257352, +-6303402, -313533, -2419140, -896038, 4365298, -337692, -358093, 3083250, 1941862, 3195456, +-2714956, -9908490, -5916855, -3706557, 7384660, -6560563, -1970316, 4582730, -467078, 925029, +-5528160, 9754408, 567473, -3663607, 7669201, -4581657, 11857868, 6218576, -2630131, 1486596, +-3332358, -2175401, -10856604, 3993246, -4933844, -626528, -406411, -2229088, 4675609, -1654099, +-4756677, -4452271, 1058710, -4034585, -4705137, 2882997, 338229, 3609383, -1940252, -9649718, +3246995, 4670240, 5259188, -4897874, -6532646, 1420560, 8472360, 8120173, -7502234, 3847217, +8996883, -6460168, 1561221, -3548180, -7558069, 10959146, 3730179, 10187126, 8910983, 1526861, +-7672959, -4339528, 3485903, -325881, 1248225, -7814693, 476205, -14007499, -6310381, -10910291, +6416681, -6160594, -623307, 2121714, -2234457, -2776696, 2919504, 3419331, 9336185, -1311576, +-2625836, -7451769, -6867653, 6265821, 854699, 2157147, 11186779, -3551401, -443455, 6192269, +-3337727, 2826625, 1579474, 6155762, 5018670, -3976603, -1217086, -8057896, 7625715, -5567888, +-7824894, -7066832, 3674345, -2763812, -4495220, 7887171, -3285113, 8143795, -5976447, -4276177, +-1908039, 5136781, 6284074, -987306, -8656507, 2275796, -5923834, 9459129, 1044214, 5201743, +-9200894, -4408247, 1026497, 4321811, -12020003, 3937411, 3999688, 2075006, -9035537, 6730751, +12062416, -11897596, 4652524, -7494181, 4890894, 170725, 4405026, -3871913, -26307, 2225867, +-7598334, -4377109, -3170223, 5666136, 6677601, -2668249, 3214246, -2141578, 4945655, 5558225, +2514167, 1263257, -6107981, -2938295, -7674570, -9220758, -5947993, -67646, -2835752, -1067836, +-3573950, -9246528, -2905009, 1033477, 747324, -1253594, 12899934, -11244224, 3784403, -6007049, +-1622424, -4066260, -3442416, 4664872, -3459596, -451508, -4188130, -3562139, -5079873, 5667746, +-6362994, 4440460, -1740536, 4391604, -866510, -252866, -987306, 4109210, 2544768, -1339493, +10696616, -809601, -6237367, 1624035, -5736466, -7647190, -8220031, 5765994, 1875827, 4890894, +5822902, 2534031, -12418361, -1597728, 2253247, -3571265, -9656160, 11135776, -185757, -131533, +10515154, -3343095, -9658845, 3049427, 7283728, 12137041, -235686, 4808753, 1680406, -11727945, +-2698850, -6360847, 6277632, 2694018, 3563212, -4727149, -170188, -1012539, 1620276, -4315906, +5900212, 937914, -3892851, 6031208, 1533303, -7860864, -5550709, 1199907, 8553964, 6614787, +-9322763, 18957448, -336081, -124017, 5988795, -1254667, -1911797, -643708, 13157632, -6715182, +6846178, -1949915, 9328669, 2185065, 8442832, -3353833, -5406827, 3926137, 7346542, -3645890, +-6689949, -8387535, -6354941, -3497177, -660351, 7164006, 986769, 6256157, 64961, -2218351, +7257421, -5561446, -9843528, -2704756, -5927055, -6075231, -11137387, 9708237, -3824132, -780073, +-720481, -7309498, -605590, 663036, 5280126, -7704098, 281320, -1114544, -3368328, -16101296, +-2082522, 7723962, 5778879, 7909183, 775242, -8623221, 22846004, 9740986, 15489263, 1702955, +-6990060, -2663954, -2372433, -9690520, -772557, -3767760, 4734128, 83752, 336081, -3073049, +-4348655, -8202314, 2596308, 856309, 214212, 4294431, -551903, 1838783, -1032403, -7145752, +-5785858, 4353486, -204548, 10448045, -13438416, 10559177, 6223408, -4672925, -9811853, -14930917, +2864206, 11718818, -6327024, 11323144, -1222455, -593242, 2262911, -3455301, -13612362, 1441498, +5834713, 2600066, -6207839, -1748589, -4119948, 2607045, 5833640, -759136, 970126, -1452773, +5392332, -3620121, -3051038, 2767570, -4636417, 2419140, -17631378, 12599287, 11647414, 13438953, +-4194036, -12183748, 4416837, 4776004, -17883170, -16501801, 16125992, 1687385, -7566122, 5988795, +-11059004, -12861280, 2075006, 33432026, 15789910, 6214818, -8805757, 173946, -2943126, 303869, +-3497177, -1801739, -3899294, 1279363, 9877888, 1981591, 12118250, -4537096, -3485903, 2281702, +8631811, -1414655, -726386, -17309792, -258772, -9648644, -9664, 13782013, 10222559, -3333968, +10040560, 19093278, -8332774, 5744519, 16255914, -11101954, 17192218, -992137, 7550553, -3484829, +1531156, -1761474, 3193308, 4333085, 17324288, -5691906, -982474, 4881231, -6424734, 5507759, +3846680, -3598646, -5932424, 16972100, 631360, -7857106, -944893, 11070815, -1825361, 7939247, +2920041, 1167157, -765578, -2966749, 21974126, 3593814, 3345780, -11590506, -6266894, 259309, +2769180, 4076461, 5297842, -21837762, 1230508, 1033477, 15795816, 2156611, 4201552, -1813013, +14379551, -23447300, 943819, 11491185, -13538274, 3092913, 2916820, 10791105, 2401424, 826781, +-3582540, -6442, -11626476, 3633006, -2769180, 1717987, 3386045, -2405719, -8804683, 2894271, +-6928856, -12706124, 7084549, -7361574, 4691178, -11982959, -7196755, -1640141, -3507378, 2340757, +-4857071, 12257837, -107911, 11658689, -12761422, -11248519, -3482682, -285078, -267362, -4230543, +10792716, 8402567, 22564148, -4153770, 14317810, -9039832, -1745904, 3826279, -17628156, 19090056, +-1052267, 11623792, -1202054, -17859548, -11368242, 6460168, -24521042, 11032160, 645856, 4133369, +11300596, 16819092, 6144488, -7242389, 16420197, -17493938, -1538672, -5474473, 2430415, 13700946, +-12206297, 31065498, 4461934, 7630010, -8836358, -12650289, 4719632, 52613, 26878980, -3833258, +-8757975, -15152645, -9765682, 7390028, 5199595, 4347581, -1422171, -14850386, -22468048, 1798518, +-13313862, 18531174, 2973728, 15091978, -8652748, 6407018, -5356361, 7929584, 22274774, -3390877, +-1599875, -3039763, 6365679, 7442642, 4452808, 1868311, 3023657, 9698036, 9266929, -4514011, +-6552510, -6295349, -6522445, 25138980, 10714333, -14040248, 12177306, -2793876, -10816875, -7959648, +5463199, 9661529, -15759846, -21388400, 3670587, -9090835, 30250528, 15933255, -3663070, -2269890, +7492034, 14344117, 4671851, -459562, -2863670, -16449188, -3174518, -1645509, -77846, -7042136, +-14914274, 9035537, -5769752, 13091060, 4205310, -11764989, -6699612, -5393405, 1513439, -16272020, +10505490, 17598092, -8007430, 11390253, -3815005, -3428995, 6683506, -11100343, 6238440, 14465450, +2323577, 24152748, 9830106, -8599061, 8469139, 5247913, 7252053, 1452236, 10976863, 11834782, +15171972, 7301445, -8005819, -6776922, -11822434, 34897, 24266028, 1560147, 9341554, -15249818, +32114008, -9011378, -28073516, -11511049, 19614042, 2662343, -4684199, -1949378, -3321620, 16828218, +-13460428, 10142565, -4225174, 20923470, 28606630, 16645683, 12741020, -9921911, 15312632, 11403675, +8186208, 12696460, 15139760, -2738579, -32628866, -18602040, -24472724, 6496675, 5224291, 6974490, +-7922604, 10770167, 23797876, 2269353, 44560, -7190312, 4655745, 10895795, 13314399, 4477504, +6368363, 9932112, -7813083, 23434952, 9558987, 4312684, -6559489, -18451716, -7138236, 9639517, +-799938, -26043608, 34870840, -12468290, -6627672, 10400800, 686658, -3755949, 2666101, -7032472, +-8002598, -2078764, -18743774, 4363150, -20163260, 251792, -15971373, -18420040, -3535295, -4169876, +-3887482, -13567265, 5882495, 13853954, 3860102, 10526965, -18782428, 18227842, 33855080, 3160022, +-13569412, 20784958, -17335024, -27816356, 45704356, -5053566, 3213709, -3556233, -20490752, 15388331, +-18593450, 7622493, 27866822, -978179, 38292856, -30386894, 28827284, 7948374, -19054622, -10468446, +3583077, -18823768, -9075803, 19663970, -19804094, 12445741, -13055627, 6346888, 22041236, -47997332, +-18661632, 19218904, -8685498, 4738960, -13246753, -40254044, -10234370, 12993350, 31172336, -9996536, +15860240, 301185, 7626252, 15917149, 10641855, 27661736, -6907918, 1072668, 7920994, -24704652, +-15516106, -7429757, -7633231, 5571110, 762894, 2001992, -12461848, -2200634, -16596291, -13879187, +7039989, 34236796, 20159502, -9086003, -10537702, 16287053, 20055886, -11730093, 5660230, 15011984, +-5456756, 32750736, 11704860, 4753992, -24749750, 15548318, 3803731, 12229383, -1976222, 3088082, +-3526168, -5557688, -39233988, 10460393, 28322088, 13492640, 4443681, -950798, 14704894, -22672058, +-40651864, 2812130, 55834036, 12887586, 44503376, 40916544, 1464584, 3038689, -25365540, -24315420, +-1567663, -21239688, 28469190, -61469572, 12214350, -24635932, -47207060, 7317551, 22635014, -9421548, +28264106, 52303576, 292058, 15100568, 8206072, -25790204, -8647917, 27987618, 7457674, 12994424, +-7728794, 8978092, 3592740, -8325794, -550293, 15143518, 13801877, 19235548, -8912594, -963146, +-40735080, -36050880, 4205310, -21779780, -137439, 21341156, 3915400, 3732327, -7836705, -3082176, +11922292, 32739998, -23674934, -11625940, -3885335, -20645370, -2523830, -19805704, -7538742, -21077552, +19092204, -25826176, -3140695, 6593312, 12382391, 49675056, 63054416, 18335216, -17726940, -32284196, +-3922916, -21425444, -10075456, -34291556, 4514011, 37096168, 24895778, 23215908, 1601486, 7435662, +34929896, 37328096, 24657944, 597000, 15220827, 8890045, 7056632, -38064684, 11548630, 8180839, +-10368051, 29055454, 33100776, 331786, -955093, -9408126, -11338177, 30794378, 23897198, -16358457, +16544214, 22568980, 3798362, -30873836, -34351148, 31966368, 12400107, 6488622, 27207544, -607738, +-10236518, 26799522, 8505109, -22455162, -9649181, -8928163, 10585484, -653372, -11579232, 3658239, +-12923557, -2691871, -5190468, -8144332, 20244328, 34240016, -10923176, 6037114, 17954038, -9691594, +-5941014, 5486284, 21478058, 5064304, -14287746, -21114060, -22398792, 11235098, 14652818, 30773440, +-13952738, -16030429, 12709882, 17656074, 31505196, -2469069, -54268524, -13589277, 19492172, 16219944, +9652402, -12640089, 1244467, -24095840, 5099200, -11497091, 25026238, 31287764, -8053064, -1251983, +-17298518, -23115514, -5770826, -44772348, -5937793, -23816668, 21985400, -19446002, 23317914, 22502408, +-44629004, -4961224, -13735842, -11806865, -16166257, -26917096, -6082748, -15073725, -27232778, -41276248, +19988778, 21008832, 12394739, -27738510, -37534792, -29019484, -16495359, 6345814, -1501628, -36802500, +-22032108, -25398290, 34950296, 10479720, 14983530, -11664057, -20532628, 44157096, 10585484, 13320841, +-9090835, 1970316, 12656732, -9876277, 9898289, -4061429, 20687784, 29350732, 628676, -25183004, +-20276540, 23000624, 15587510, 19998442, 5224828, 4283693, -11648488, -5732171, 2560338, 13582834, +30652108, -1339493, -59901372, -55728276, -208843, -14478335, 34340948, 34824668, -41064720, -28207198, +-17876728, 48646948, 43343200, -25210922, 6079526, -32630478, -31304406, 17405892, -14819248, -806917, +-5354751, -22716082, 15177878, 15392089, 12736189, 50146428, -36352068, -9808095, -2134599, 11946452, +45974940, -29348048, 27399206, 34248068, 16211891, -68102072, -32190780, 27567784, -22893786, 17476758, +-8529805, -26146150, 15649250, 9376987, 2275259, -9487583, -50839528, -799401, -4851703, 3909494, +-10179072, -30798136, 22424024, -17558364, 40705016, -821949, -7288023, 25372520, 12562242, -17175038, +-5414343, -12000139, 20102058, 41160284, 24771224, -27248346, 3503083, -16824998, 15351824, -14005888, +-11057930, 7372848, -5215164, 24536612, -22206592, -39060044, 7474317, -11028939, 12473122, 21593484, +-58884000, -4598300, -14410689, 6877317, 56958244, -11428908, -48462264, -6626598, 34525096, 23938000, +-28382218, -2351495, 19512036, 5656472, 24953224, -38619272, -28532004, 33155536, -33268280, -61436824, +-25690884, -2363306, 71584760, -14144401, -46699180, 27497454, -52123188, 96954592, -65148212, 17975512, +-662499, 21985400, 54570780, 16953846, 7826504, -30975304, -12322798, -30965640, -36223216, -12690018, +7518341, 20447802, 27974732, -3561065, 16392280, 19014894, -16675747, -34886408, 18509162, 6059125, +-27693412, -10004589, 26817238, -9550397, -2734821, 23784992, 13848585, 10272488, 3591130, 13273596, +-13037373, -32517198, -13727252, 8536784, -12943421, -8137353, 11839614, 186294, -22402012, 22851910, +5153961, -21481278, 2734821, -5682779, 20230906, 10570988, -8144332, 8792335, -12475269, -28737090, +3693135, 6069863, -2647847, -716723, 5782637, -13061532, 3674882, -11348377, 6039798, 19066434, +-2438468, 7746511, 8847633, -8804146, 11811, -20258824, 5927055, 9929964, -35408248, 18605262, +-22531936, 4983236, -30602, -2695629, 9792525, 52880176, -1740536, -1939715, -14533632, -14657113, +11131481, -800475, 9673340, 15032, -4960151, -7154879, 3830574, -9949829, 10196789, -9370008, +14754823, -11852499, 8711267, -10042170, -1944547, -1704565, -8969502, -7164006, 2375117, -4259534, +-2626909, -147640, -6651294, 853625, -1071594, 2160906, -1317481, 4009889, -13612362, 12661564, +-4438312, -4183298, 9963787, -7733626, 864362, -9644349, -8092792, 6164889, 5782100, -6749541, +-4010426, 2774549, -61203, -11739219, 3402688, 2150168, 377420, 7840463, -2483028, -3218004, +-2787971, -7925289, -1796907, 8607651, -8596914, 2496450, -3970161, -896038, 955093, -2487860, +2343442, 340913, 6240051, -8239358, -462783, 5982353, -10901701, 7037841, -4984310, 938987, +4662724, -545998, -5709086, -24478092, -42501924, 16049756, 134322416, 34163244, 73883640, -2470680, +-72785200, -23049478, -71622336, -60389388, -21911850, -14198625, -5364951, 40834940, 53819700, 72138808, +90137944, 39562016, -23548768, -41426572, -89251568, -83993992, -34807488, -27720256, -19171124, 37035504, +49444736, 30291330, 45829984, 55897388, 18417894, 15738908, 10048613, -28110560, -13481902, -19953882, +-45024680, -24102282, -33504504, -48665200, -27053998, 6747394, 5067525, 28192166, 66602056, 46371688, +37863356, 37757056, 11269457, 3476776, -3898757, -18456548, -27495844, -33911988, -49654116, -43030204, +-24505472, -6794102, -16672526, 14811195, 25896506, 22907208, 37986300, 43193948, 27386858, 25731150, +24462524, -2268280, -10924786, -4161823, -33043868, -26174604, -5361193, -24996172, -26481694, -13142600, +-12840342, 2990908, 864899, }, }, { { -576599, -426276, -2568927, 2670933, -3614215, 389768, -1221918, -2304250, -4488778, -1504312, -48318, -806380, 5398774, 2911988, -2048699, 37044, -506806, -76773, 327491, 152471, 1750199, --247497, 1137093, -858457, -6593312, -2307471, -1106491, 323733, 3984656, -2474438, 271657, --373662, -129386, -1427003, 2348273, 466004, -1072131, 2851858, -2022930, 1081795, 1283658, --2902861, 2544768, -1269700, 164283, 659278, 910533, 1276679, -1180042, -2157684, -705985, --1498944, 1106491, -1358283, 297963, 1719061, 4559645, -1600412, -3562675, -1049583, 3362423, -3476239, 2158758, -106837, 1025423, -1277216, -1781875, -1467805, -4255239, 2999498, -606664, -752156, 80531, -2029909, 737661, 863288, 3195993, 3035468, -2722473, -571768, 4541928, -1391033, -2224793, 407485, -2465848, -2342368, -1739999, -4069482, -1302449, 2369211, -108448, -1283122, -585189, -1199370, -1017907, -549219, 3452617, -2185602, 302258, -210990, 241055, -2610266, 7516, 1780264, 5945846, 4508642, 4684736, 2327336, 1140851, -787053, -5305895, -2176475, -1915019, 3427921, 1334661, -1871532, 1738925, -2445984, -4578972, -1471563, -1701344, --4460324, 301721, -561030, -519691, -2088428, 400506, 4631586, 2174864, 3155727, 74625, -1953673, -1683627, -100932, 2553895, -1957968, 1758789, -2421288, -2499134, 350040, 5602248, -3700651, 2250026, -920197, 1077500, 770947, 493921, -735513, -1899986, -2858838, -2107218, -578747, -1760937, 2013266, 1010391, -3445638, 8136816, -172336, 465467, -865436, -4341138, -3179350, -2284923, -2164127, -5063230, -3884798, -1674500, 3096672, 4430796, -933082, 2594697, --1062468, 4801237, 5011153, -10143102, 1803886, -25233, -1034013, 3330747, 5309654, -1738925, --840203, 18790, -394600, -2656437, 2037425, -2683818, -2117419, -317828, 2602750, -1635846, --5759015, -2642479, -3951907, 319975, 234613, -5170067, -714038, -2343442, 917512, -306553, --896038, 1069984, -1824287, 1529008, -2855617, 2456185, 3700651, 5745056, 2284386, -2814814, -1930051, 2263448, -1153199, -6982006, 201863, 3236258, -2964064, 1728724, -4188130, -363998, --2803540, -7191923, -2428267, -3968550, 1355599, 2103460, -2711735, 603980, -1399086, 6582038, -1921461, -9176198, 3313567, 4554276, 1787780, -893353, 2450279, -5811628, 884763, 2416456, --1201517, 2330020, -316754, 2860985, 787590, -3970697, 2484102, 3395172, 3538516, -1138166, -1719061, 1771137, 1373316, -10408316, 1493038, -4509179, -1248225, -1592896, 2442763, 970126, --8347269, -3165391, -1844152, -1741072, 3440806, -3274913, -5841693, 1292785, 2742874, 1535988, --5820755, -2908230, 1884954, -5678484, -435939, -6260989, 898722, 2812130, -3122441, -1129576, -3479461, 4253628, -10362682, -955630, -2891587, 2939368, 1262184, 313533, 868120, -3125126, -2603287, 2061584, -8079371, 5946382, -874563, 1278827, -4155381, -1971390, -3529926, -706522, -838056, -3515968, -4534949, 3643206, -1478543, -4601521, -3852586, -3643206, -1915555, 6542309, --2126009, 682900, -5265630, 5601711, 637266, -4202626, -794569, 3143379, -6806450, 2152852, --1830730, 1347546, 1393180, -3474092, -2036351, -8637716, -2000918, -9698036, 1485522, 1884417, --750009, -1533303, -596464, 1178432, -3428995, -6988986, -2857764, -2732136, -762357, 2218888, --1270237, 3754338, 2068564, 2813741, -3884798, -499827, 89657, -3760781, 1272384, 2480344, -35970, -2018635, -3777961, -4068408, 2874407, 3526705, 208843, 7258495, 6332393, -5710696, --1024350, -295279, -5343476, -6850473, 10251550, -490163, 667331, 2754685, -5857799, -2419677, --3624953, 9375914, 3104188, 112206, -7253126, -6585259, 1395328, -2997887, 5698348, -3098819, -813359, 772557, -11395622, 5709622, 3225521, 5823439, -3121368, 3198677, 3330747, 5987185, -1416266, -11353746, 2842732, 508954, 4523138, 8273718, 438087, 3607236, 3144990, -6784975, -2397666, 657130, 949188, -1822140, -939524, 4256850, 2807298, 205622, -4158602, -13959, --1980517, -2117419, 6819871, 3189550, -278099, -867047, -8224863, -7013145, -8079907, 2203855, -2192044, -8326868, 600759, 628139, -8301635, 587337, 1286343, -1040456, 9549323, -1101122, --4692252, -1098438, 5480915, -364535, -8509941, 9339943, 4780299, -5773510, 4486630, 1013612, -847182, -22549, 495532, -2138894, -4301410, -3878892, 7347616, -304943, -2210298, -128312, -5244155, -4668093, -8787503, 621697, 1854352, 2030446, -7778186, -3353833, 2665564, 3497177, -13082470, 3983582, 10480794, -11529303, 381715, -5655398, 122943, 3924526, 4379793, -5884642, -2545305, -3374771, -3113315, -4063039, -6793565, -906775, -15923591, -67109, 5186710, -613643, --1132798, 1833951, -8377871, 3022046, -7990787, -2412698, 8127152, 1752884, 2772402, 292595, -2357400, 7074885, 6259915, 12253542, 6262063, -9082245, -816044, 10344429, -1483911, -7379828, --1190780, 1063004, -3476776, 6973953, 5027259, -5774584, -1780264, 6696928, 6937983, -2371359, --4517232, 11220602, -4647692, -14835891, -10191957, 3421478, -15141370, -175557, -4611721, 197032, --1522029, -4086662, 5487358, 1726040, -1654636, -4814122, 4075924, -2857764, 7683697, 5514738, --2581812, -5276904, 547071, 1992328, 1015223, -12938589, 6176700, -1252520, 3337727, 4118874, -7020661, 1412507, -6019934, 8128763, -3018825, 3519726, -3651259, 2893197, -519691, -15262166, --3090766, -2782065, -1755031, 816044, -3614215, -2717104, 2006824, 3066070, 1119376, 7887171, -3720516, -8137353, -630286, -263604, -4496831, 9071508, -5681705, -5723581, 9764608, 10063108, --1404991, -461172, -6596533, 1976759, 1256278, -3744675, 1554778, 6043556, 3782256, 7328288, --2138357, -6502581, 3540664, 454730, 1593970, -7711077, -4044786, -4748623, 1382980, 3624953, -1159104, 562104, 7036767, 8331700, 890132, -4845797, 4582193, 3505230, -6826851, 185220, -475668, -1459752, 37044, -943819, 4516158, -1455994, -5105106, 1146219, 5825587, 1988570, -2260227, 5105106, -10878615, -6905771, 4679367, -2847563, -10142028, 5048734, -5184563, -4986457, -6962679, -2268280, -1963337, -1894081, 1987496, 4740570, 2837363, 2449205, 3005940, -4355634, --2215130, -1076963, 6300180, 2902324, -10365904, 3177739, 3569655, -4655208, 10250476, 8975945, -5189394, 167504, -3376918, -2533494, 788663, -3291556, -3487514, -6322192, 1140851, -7186554, -5344550, 1810329, 301721, 971200, 2927020, 2197950, 5690295, 8401493, -3006477, -13608067, --2137283, -9288404, 3377455, 1194001, -12023224, 4371740, -4942971, 15304042, 5270462, -9693204, --170725, 9763534, 5235029, -7982734, -4645007, 10268193, 5964636, -7008313, 8793409, -7155953, --9574019, 1656247, -14560476, 8997956, 9350681, -1887638, -8943196, -1195075, -210453, 2853469, -46171, -8825084, -6372658, 93952, -10411538, -89657, -24570434, -7879655, -2787434, -13593035, --4677757, -2965138, -5873905, -4716948, 3228205, -6651294, -12305618, 3104188, 7726646, -12761958, --3487514, 3681861, 6293738, 10645076, 6897181, 6176163, 6971806, 2309619, 12376485, -7630547, --3224447, 2383170, -6219650, 2079838, 3440269, 6233072, 762357, 10351945, 2130304, 2324114, -7227893, -3557844, -6426882, -215285, -9797357, -6518150, -11300059, -827855, -683437, -15031312, -5097590, -7038378, 2797634, -14260365, 1439351, -10920491, 15392089, 308701, -14179298, 16205448, -20204600, 5201743, -7148973, -5677410, 5009543, -2432562, -993748, 5324686, -10102837, 5539971, --10417443, 4345970, -4303021, -7037841, 2274722, 6872485, 1439888, 6320045, -3398930, 10088878, --7736310, -7915625, -19512036, -4769561, -9922985, -24624122, 6496675, -14338748, -8093329, -11621645, -3515968, -22201760, 6274411, 1457068, -3770445, -812286, -5854041, -2543695, 5688684, -7770670, --4862440, -26844, 4456566, -6829535, -39192, 7171522, -11527692, -3081639, 7486665, -6963753, -83752, -235686, -1398549, 9849971, -8362302, 5733782, -3517578, 7963406, 9234180, -9144522, --11291469, 10786810, -645856, 2130304, 3456375, 715649, -1964948, 5955509, -2791192, -13961328, -4172561, 2508261, -11236171, -1605244, -3607236, 6841346, 9328669, 4007741, 2141578, -3703336, --7715372, 8322573, 6070937, 7408819, 258772, -12438225, -1979980, -2112050, -4316979, -3192235, --120259, -5569499, 29155312, 17494476, 741419, -8950175, -22771380, -2285460, 10030896, -4449049, --9411884, -16320339, -1339493, -3149822, 193274, -5275294, 5043366, 398358, 14282914, 6296422, --6477348, 79457, -2966212, 1632088, -3362423, 3562675, 8754754, -10094784, 1743220, -5854578, -3925063, -3997541, -8049843, -14578730, -1503775, 9274445, 2643552, -1284195, 2950643, -499290, -8041790, 13735305, -4788889, -2327336, -15371688, -15771657, 4364761, 3133716, -7116761, -5301064, --13798119, -8654896, 5299990, -1014149, -56371, 1477469, -1104880, 7050726, 3564823, -10407780, -513785, -9379672, -789200, -4625680, -3005940, 11824582, 22711788, 37944964, 1797444, 12919798, --10561325, -13121662, -19078244, 100932, 1329292, 5330592, 6788733, -679679, 387621, 10646687, -18181134, -9078487, 191126, 3296924, -14543296, -31675, -9337796, -9365713, 13994614, -4245575, --3330747, -7613367, 16042777, 13802414, 133681, 22785876, 2716030, 6997576, 5181341, -6573448, --7374996, -12123082, -6176163, 2627446, 223338, 10117332, 906775, -1292785, -1775432, 7101729, --10416906, -25845502, -8919573, 7409893, 2449742, -2270964, -7584912, 298500, -12299176, -2010045, --11210938, -926639, -1377074, -8074539, 7621420, 3639985, 14444512, -12055973, 22356916, 5887327, --4383551, -8023536, -4118874, 3431679, 12825309, -4046933, 7275138, -11456825, 9070434, -10382547, --11839614, 11497627, -16906066, 10976326, 8870181, 17846662, -18449032, 13931800, -2231773, 12599287, -4081830, -18310520, -4270808, -3051038, 4175245, 1416266, -12616466, -16619376, -34434364, -10403485, --20273856, 5743445, -1049046, -6732361, -10108742, -9365176, -8718247, -9168145, -9249212, 1091459, --7568806, -1199370, -16290811, -24635396, 30208116, -9313637, 16297253, -2994129, 4090956, 5397164, -8706436, 6010807, -1715303, -329102, -13279502, -2787434, -3298535, -8628589, -13932337, 5564667, --1746978, 19637128, -13658533, 577136, 26663694, -6243809, -22559852, -6953552, 648003, -9853192, -15475304, 7519414, -8904541, 6696391, 8164733, -4864588, -476741, 4622996, 10188736, 20401, --10709501, -9739375, 12202002, 9504763, -7032472, -13777718, 8690866, 11229729, -9971840, -12183748, -8458938, -15539192, 30642982, 7696582, -3367254, 2401424, 6657200, 3065533, -6860137, 2113661, -126165, 12905303, 8207683, -12880070, -53150, 4782446, 3566970, -8479339, 20260434, 14336064, -29196114, 16144245, 10749766, 4156455, -25876104, -2235531, 3269544, -15278272, -4284230, 28854128, -1948305, -17043504, -16910896, 14802068, -23213762, -6208375, 641024, 5824513, 2234994, -4699231, -7004018, -10699300, -474594, -2493229, -6999186, -1871532, -5056250, -15414101, 7310035, -13460428, -6992744, 6216429, 8198019, 1008780, 5173825, -6052146, 23422604, 2555506, -26431766, -23288386, -1236951, 9335648, 18743238, -7315940, -16360604, -7729331, -3060701, 1253057, 10434623, 1480690, --10274636, 25467546, -33842196, -6595459, 4784057, -23910082, -13244069, -7295002, 1691680, -38124816, --19223200, 24809878, -12027519, 6167036, -10893648, -31060666, -13940390, 13400298, -7182259, 3243237, -16533477, -8024610, -45746232, -13909788, 4266513, 11550241, 14556181, 10052908, 13443785, 19614578, -39966280, -23671176, 17675402, -7271917, 910533, -7358353, -29895120, -25263534, -2871723, -3147674, -8375723, 10621454, 17780628, -6822019, 1088774, -10067940, 1702418, -3245922, 1483911, 14904073, -10575820, 3784403, 14491220, 13387950, -24932286, 11393474, -13763760, -21455510, -4079145, 10838350, -5400922, -15119359, 6161131, -270583, 11300059, -2806761, -24019068, -20461762, -19561966, -23311472, -4733054, 15697032, -1323924, 62054760, -39847632, -33643552, 21417392, -7752953, -10648298, -6489159, --1202054, -1515587, -36814312, 1852742, -307090, 3020436, 32759864, -4577362, 13476534, 8974334, -17579302, 46477452, -14698452, 59146532, 21228950, -6231998, 9808095, -28056336, 10145250, 45107356, -1197222, 47066936, 24713778, -2812130, -18265422, 53070764, 7853885, -8909910, 6749541, -12069395, --3678640, -1810866, -3384434, 6696928, 14672682, 10308458, 1815161, 6800007, -10797548, -10308458, -3062312, -3153043, 17273822, 18901078, 11863237, -4871567, 1008780, -22999550, -14625437, -4273493, --15989090, -24866786, -15030775, 11857331, -14679661, -43841952, -20533164, 13428752, -17986786, -12460774, -347355, -3163780, 20338280, 30427158, 39557184, -21008296, 10999411, -159988, 949725, -8400419, --26758720, -52402360, -35065724, 18550500, -35558036, -18063558, 9101036, 18278844, -13524315, 20663624, -57148836, 12825309, 10575283, -42776264, -59151900, -11598022, -18915036, -29830696, -9649181, -24235426, -17899276, 13205414, 51779052, 25865904, -11722576, 24396488, 47579112, -25194278, 35998268, 29405494, --5056787, -7177427, -16615081, 5255430, 32154272, 24382530, 37792492, -16223702, -7772280, -7410429, --2586644, -9854266, 9761924, -12156368, 27781460, 12315819, -46068356, -19357418, 281320, 7403987, -19753628, -8935679, -17405892, 5734855, 5427765, -6763500, -8523363, 5819144, -12950400, -19303194, --8921721, 44029320, 18135500, 8131984, -21690122, -6244883, -18302466, 11804718, 21390010, 8039642, -1864016, 13442174, -6809134, 28731720, 16319265, 2832531, 9904195, 263604, 55562380, 12676596, --22348326, 10377178, 10546829, 7035694, 13629542, 2430952, -20830054, 28222230, 7429757, 6529961, -12206834, 6987912, 2117419, -13962939, 21378200, 24100136, 14084272, 64521148, 47339668, -20717312, --43521440, -935229, -10394895, -54476828, -8824010, 15217069, 14098767, -11544335, 17974438, 7242926, --9670119, -19787452, 2855080, -4051228, -32921462, -8946417, -12922483, 3193308, -44731548, -32636920, --7696582, 21842594, -4861903, -5732708, -27967754, 1224066, 20045150, 1720134, -17558364, -8244727, --5540508, -8108899, 3231963, 7921531, -24245628, -23918136, 1436667, -347355, 2838974, 40794672, --27140436, -2116345, -4088272, -38883948, -14437533, -28360206, -7151658, -2036888, 25125022, 31717796, -35631048, 11355357, 3696356, -14223321, -36456220, 1702418, 10742250, -11310796, 44191456, 110583056, -102877888, 15821586, -70785360, -61818000, -27450210, -38696044, 126820184, 80814640, 47431472, 66143032, --4040491, -34181496, -95428264, -58631136, -25756918, -4387846, 34372088, 73114304, 25682294, -25102474, -29321204, 9737765, -2684, -48770964, -20568598, 49227304, -34428996, 16020765, -3740917, -7026567, -10297721, 8564702, 20556250, 41918880, -26620744, -27071178, 3925600, -15255724, 20140712, -28508382, --20802138, -16903380, -1876901, -2335389, -22662394, 11365020, 32461362, -25901338, -36451388, -20673288, --11971684, -4016331, 44799192, 5876589, -6209449, -45856292, -17390860, 7320235, 36561444, 20733418, --12446278, -67496488, -55412596, 50172196, 46555836, 52693880, -28476706, -114543560, -28658170, 54802172, -38034084, 8849780, -19499152, 9488656, -53403624, -26198764, 9536438, -12082280, 7726110, -6976101, --5096516, 51020992, -44231720, -18067316, 33169496, 33375654, 53492208, 26979910, -91865592, 26121454, -79257712, 18686866, 33982856, 9258339, -35785668, -59232968, 7531225, 9465571, 6493454, 56499756, -10609643, -5279052, -35764728, -7241315, -2699387, -9567040, 532576, -7916162, 15588584, 5888400, --9941239, -2825552, 23676544, -899259, -441308, 1456531, -4886599, -10757819, 13612362, 10362682, -9380745, -15219753, 8266202, 20402706, 9114994, -2161979, 14487462, -3431142, -15649250, 3409667, -4801774, -14057428, -13677860, 13371844, 14467597, -14556718, 9330280, 7642895, 386010, -5796595, -559956, 10060424, -195421, -12837657, 6639483, 6689412, -22204980, 5107790, 16813186, 4858145, --14513231, 1771137, 10310606, -19349902, 5012764, 8566312, 3464965, -5093831, -18516678, 21256330, --23694798, -1793149, 21147882, 917512, -5201743, 1510755, -22756348, 10972031, -3159485, 15024869, -17451526, 53689776, 4897337, -6723235, -17824652, -12109123, 6505265, -8153996, 7152195, -10828686, --634581, 8428336, -4597763, 3918621, 4170413, -15010911, 4374424, -4959614, -2988760, -12361990, -3745212, -3531000, -7475391, -3652333, 6241661, -5392332, -5011153, 7582765, -8114804, 4272419, -7549479, -14940581, 15086609, -3703336, -17242146, 9380745, 9654013, -8148627, 3230889, 5396090, --7042673, -6572374, 448287, 1092532, 5209796, -2305324, -476205, -7272990, 7233799, -5654325, --1418413, 8681740, -9822053, 3144453, -1382443, 219043, -4345433, -6432788, -2187749, 11806328, --7385197, -2780991, 2429341, 2712272, 913754, -6757594, 5953899, -2874944, -5417028, 104153, --10419054, 16517370, -6411313, 3555696, 4487167, -3083787, 6919729, -26126822, -44335872, 20601348, -150156896, 23738284, 74683576, -17060684, -77306192, -27226334, -75361640, -48557288, -16295106, -7597261, -2863133, 44980120, 52636972, 74658880, 72835128, 23971824, -29779692, -46453828, -87045568, -65540128, --35509716, -12960601, -9552007, 27240294, 44008384, 35148940, 46401216, 46256260, 16094853, 15375983, -4838818, -32872070, -13176960, -28191092, -50521700, -29530048, -29841432, -42591580, -9965935, 20694226, -14528801, 44529684, 56864292, 30540438, 37598144, 29419990, -4888210, -755377, -3547106, -30524870, --39058968, -33587180, -52185464, -43242268, -16342887, -2112050, 5301601, 36046048, 31852014, 32013076, -38854420, 30122216, 9268539, 19175956, 9355513, -11183021, -6426882, -20983600, -45847164, -26555246, --26025354, -34526168, -16361141, -7961796, -8920647, 12223477, 751619, 0, 0, 0, -0, 0, 0, }, +426276, -2568927, 2670933, -3614215, 389768, -1221918, -2304250, -4488778, -1504312, -48318, +806380, 5398774, 2911988, -2048699, 37044, -506806, -76773, 327491, 152471, 1750199, +-247497, 1137093, -858457, -6593312, -2307471, -1106491, 323733, 3984656, -2474438, 271657, +-373662, -129386, -1427003, 2348273, 466004, -1072131, 2851858, -2022930, 1081795, 1283658, +-2902861, 2544768, -1269700, 164283, 659278, 910533, 1276679, -1180042, -2157684, -705985, +-1498944, 1106491, -1358283, 297963, 1719061, 4559645, -1600412, -3562675, -1049583, 3362423, +3476239, 2158758, -106837, 1025423, -1277216, -1781875, -1467805, -4255239, 2999498, -606664, +752156, 80531, -2029909, 737661, 863288, 3195993, 3035468, -2722473, -571768, 4541928, +1391033, -2224793, 407485, -2465848, -2342368, -1739999, -4069482, -1302449, 2369211, -108448, +1283122, -585189, -1199370, -1017907, -549219, 3452617, -2185602, 302258, -210990, 241055, +2610266, 7516, 1780264, 5945846, 4508642, 4684736, 2327336, 1140851, -787053, -5305895, +2176475, -1915019, 3427921, 1334661, -1871532, 1738925, -2445984, -4578972, -1471563, -1701344, +-4460324, 301721, -561030, -519691, -2088428, 400506, 4631586, 2174864, 3155727, 74625, +1953673, -1683627, -100932, 2553895, -1957968, 1758789, -2421288, -2499134, 350040, 5602248, +3700651, 2250026, -920197, 1077500, 770947, 493921, -735513, -1899986, -2858838, -2107218, +578747, -1760937, 2013266, 1010391, -3445638, 8136816, -172336, 465467, -865436, -4341138, +3179350, -2284923, -2164127, -5063230, -3884798, -1674500, 3096672, 4430796, -933082, 2594697, +-1062468, 4801237, 5011153, -10143102, 1803886, -25233, -1034013, 3330747, 5309654, -1738925, +-840203, 18790, -394600, -2656437, 2037425, -2683818, -2117419, -317828, 2602750, -1635846, +-5759015, -2642479, -3951907, 319975, 234613, -5170067, -714038, -2343442, 917512, -306553, +-896038, 1069984, -1824287, 1529008, -2855617, 2456185, 3700651, 5745056, 2284386, -2814814, +1930051, 2263448, -1153199, -6982006, 201863, 3236258, -2964064, 1728724, -4188130, -363998, +-2803540, -7191923, -2428267, -3968550, 1355599, 2103460, -2711735, 603980, -1399086, 6582038, +1921461, -9176198, 3313567, 4554276, 1787780, -893353, 2450279, -5811628, 884763, 2416456, +-1201517, 2330020, -316754, 2860985, 787590, -3970697, 2484102, 3395172, 3538516, -1138166, +1719061, 1771137, 1373316, -10408316, 1493038, -4509179, -1248225, -1592896, 2442763, 970126, +-8347269, -3165391, -1844152, -1741072, 3440806, -3274913, -5841693, 1292785, 2742874, 1535988, +-5820755, -2908230, 1884954, -5678484, -435939, -6260989, 898722, 2812130, -3122441, -1129576, +3479461, 4253628, -10362682, -955630, -2891587, 2939368, 1262184, 313533, 868120, -3125126, +2603287, 2061584, -8079371, 5946382, -874563, 1278827, -4155381, -1971390, -3529926, -706522, +838056, -3515968, -4534949, 3643206, -1478543, -4601521, -3852586, -3643206, -1915555, 6542309, +-2126009, 682900, -5265630, 5601711, 637266, -4202626, -794569, 3143379, -6806450, 2152852, +-1830730, 1347546, 1393180, -3474092, -2036351, -8637716, -2000918, -9698036, 1485522, 1884417, +-750009, -1533303, -596464, 1178432, -3428995, -6988986, -2857764, -2732136, -762357, 2218888, +-1270237, 3754338, 2068564, 2813741, -3884798, -499827, 89657, -3760781, 1272384, 2480344, +35970, -2018635, -3777961, -4068408, 2874407, 3526705, 208843, 7258495, 6332393, -5710696, +-1024350, -295279, -5343476, -6850473, 10251550, -490163, 667331, 2754685, -5857799, -2419677, +-3624953, 9375914, 3104188, 112206, -7253126, -6585259, 1395328, -2997887, 5698348, -3098819, +813359, 772557, -11395622, 5709622, 3225521, 5823439, -3121368, 3198677, 3330747, 5987185, +1416266, -11353746, 2842732, 508954, 4523138, 8273718, 438087, 3607236, 3144990, -6784975, +2397666, 657130, 949188, -1822140, -939524, 4256850, 2807298, 205622, -4158602, -13959, +-1980517, -2117419, 6819871, 3189550, -278099, -867047, -8224863, -7013145, -8079907, 2203855, +2192044, -8326868, 600759, 628139, -8301635, 587337, 1286343, -1040456, 9549323, -1101122, +-4692252, -1098438, 5480915, -364535, -8509941, 9339943, 4780299, -5773510, 4486630, 1013612, +847182, -22549, 495532, -2138894, -4301410, -3878892, 7347616, -304943, -2210298, -128312, +5244155, -4668093, -8787503, 621697, 1854352, 2030446, -7778186, -3353833, 2665564, 3497177, +13082470, 3983582, 10480794, -11529303, 381715, -5655398, 122943, 3924526, 4379793, -5884642, +2545305, -3374771, -3113315, -4063039, -6793565, -906775, -15923591, -67109, 5186710, -613643, +-1132798, 1833951, -8377871, 3022046, -7990787, -2412698, 8127152, 1752884, 2772402, 292595, +2357400, 7074885, 6259915, 12253542, 6262063, -9082245, -816044, 10344429, -1483911, -7379828, +-1190780, 1063004, -3476776, 6973953, 5027259, -5774584, -1780264, 6696928, 6937983, -2371359, +-4517232, 11220602, -4647692, -14835891, -10191957, 3421478, -15141370, -175557, -4611721, 197032, +-1522029, -4086662, 5487358, 1726040, -1654636, -4814122, 4075924, -2857764, 7683697, 5514738, +-2581812, -5276904, 547071, 1992328, 1015223, -12938589, 6176700, -1252520, 3337727, 4118874, +7020661, 1412507, -6019934, 8128763, -3018825, 3519726, -3651259, 2893197, -519691, -15262166, +-3090766, -2782065, -1755031, 816044, -3614215, -2717104, 2006824, 3066070, 1119376, 7887171, +3720516, -8137353, -630286, -263604, -4496831, 9071508, -5681705, -5723581, 9764608, 10063108, +-1404991, -461172, -6596533, 1976759, 1256278, -3744675, 1554778, 6043556, 3782256, 7328288, +-2138357, -6502581, 3540664, 454730, 1593970, -7711077, -4044786, -4748623, 1382980, 3624953, +1159104, 562104, 7036767, 8331700, 890132, -4845797, 4582193, 3505230, -6826851, 185220, +475668, -1459752, 37044, -943819, 4516158, -1455994, -5105106, 1146219, 5825587, 1988570, +2260227, 5105106, -10878615, -6905771, 4679367, -2847563, -10142028, 5048734, -5184563, -4986457, +6962679, -2268280, -1963337, -1894081, 1987496, 4740570, 2837363, 2449205, 3005940, -4355634, +-2215130, -1076963, 6300180, 2902324, -10365904, 3177739, 3569655, -4655208, 10250476, 8975945, +5189394, 167504, -3376918, -2533494, 788663, -3291556, -3487514, -6322192, 1140851, -7186554, +5344550, 1810329, 301721, 971200, 2927020, 2197950, 5690295, 8401493, -3006477, -13608067, +-2137283, -9288404, 3377455, 1194001, -12023224, 4371740, -4942971, 15304042, 5270462, -9693204, +-170725, 9763534, 5235029, -7982734, -4645007, 10268193, 5964636, -7008313, 8793409, -7155953, +-9574019, 1656247, -14560476, 8997956, 9350681, -1887638, -8943196, -1195075, -210453, 2853469, +46171, -8825084, -6372658, 93952, -10411538, -89657, -24570434, -7879655, -2787434, -13593035, +-4677757, -2965138, -5873905, -4716948, 3228205, -6651294, -12305618, 3104188, 7726646, -12761958, +-3487514, 3681861, 6293738, 10645076, 6897181, 6176163, 6971806, 2309619, 12376485, -7630547, +-3224447, 2383170, -6219650, 2079838, 3440269, 6233072, 762357, 10351945, 2130304, 2324114, +7227893, -3557844, -6426882, -215285, -9797357, -6518150, -11300059, -827855, -683437, -15031312, +5097590, -7038378, 2797634, -14260365, 1439351, -10920491, 15392089, 308701, -14179298, 16205448, +20204600, 5201743, -7148973, -5677410, 5009543, -2432562, -993748, 5324686, -10102837, 5539971, +-10417443, 4345970, -4303021, -7037841, 2274722, 6872485, 1439888, 6320045, -3398930, 10088878, +-7736310, -7915625, -19512036, -4769561, -9922985, -24624122, 6496675, -14338748, -8093329, -11621645, +3515968, -22201760, 6274411, 1457068, -3770445, -812286, -5854041, -2543695, 5688684, -7770670, +-4862440, -26844, 4456566, -6829535, -39192, 7171522, -11527692, -3081639, 7486665, -6963753, +83752, -235686, -1398549, 9849971, -8362302, 5733782, -3517578, 7963406, 9234180, -9144522, +-11291469, 10786810, -645856, 2130304, 3456375, 715649, -1964948, 5955509, -2791192, -13961328, +4172561, 2508261, -11236171, -1605244, -3607236, 6841346, 9328669, 4007741, 2141578, -3703336, +-7715372, 8322573, 6070937, 7408819, 258772, -12438225, -1979980, -2112050, -4316979, -3192235, +-120259, -5569499, 29155312, 17494476, 741419, -8950175, -22771380, -2285460, 10030896, -4449049, +-9411884, -16320339, -1339493, -3149822, 193274, -5275294, 5043366, 398358, 14282914, 6296422, +-6477348, 79457, -2966212, 1632088, -3362423, 3562675, 8754754, -10094784, 1743220, -5854578, +3925063, -3997541, -8049843, -14578730, -1503775, 9274445, 2643552, -1284195, 2950643, -499290, +8041790, 13735305, -4788889, -2327336, -15371688, -15771657, 4364761, 3133716, -7116761, -5301064, +-13798119, -8654896, 5299990, -1014149, -56371, 1477469, -1104880, 7050726, 3564823, -10407780, +513785, -9379672, -789200, -4625680, -3005940, 11824582, 22711788, 37944964, 1797444, 12919798, +-10561325, -13121662, -19078244, 100932, 1329292, 5330592, 6788733, -679679, 387621, 10646687, +18181134, -9078487, 191126, 3296924, -14543296, -31675, -9337796, -9365713, 13994614, -4245575, +-3330747, -7613367, 16042777, 13802414, 133681, 22785876, 2716030, 6997576, 5181341, -6573448, +-7374996, -12123082, -6176163, 2627446, 223338, 10117332, 906775, -1292785, -1775432, 7101729, +-10416906, -25845502, -8919573, 7409893, 2449742, -2270964, -7584912, 298500, -12299176, -2010045, +-11210938, -926639, -1377074, -8074539, 7621420, 3639985, 14444512, -12055973, 22356916, 5887327, +-4383551, -8023536, -4118874, 3431679, 12825309, -4046933, 7275138, -11456825, 9070434, -10382547, +-11839614, 11497627, -16906066, 10976326, 8870181, 17846662, -18449032, 13931800, -2231773, 12599287, +4081830, -18310520, -4270808, -3051038, 4175245, 1416266, -12616466, -16619376, -34434364, -10403485, +-20273856, 5743445, -1049046, -6732361, -10108742, -9365176, -8718247, -9168145, -9249212, 1091459, +-7568806, -1199370, -16290811, -24635396, 30208116, -9313637, 16297253, -2994129, 4090956, 5397164, +8706436, 6010807, -1715303, -329102, -13279502, -2787434, -3298535, -8628589, -13932337, 5564667, +-1746978, 19637128, -13658533, 577136, 26663694, -6243809, -22559852, -6953552, 648003, -9853192, +15475304, 7519414, -8904541, 6696391, 8164733, -4864588, -476741, 4622996, 10188736, 20401, +-10709501, -9739375, 12202002, 9504763, -7032472, -13777718, 8690866, 11229729, -9971840, -12183748, +8458938, -15539192, 30642982, 7696582, -3367254, 2401424, 6657200, 3065533, -6860137, 2113661, +126165, 12905303, 8207683, -12880070, -53150, 4782446, 3566970, -8479339, 20260434, 14336064, +29196114, 16144245, 10749766, 4156455, -25876104, -2235531, 3269544, -15278272, -4284230, 28854128, +1948305, -17043504, -16910896, 14802068, -23213762, -6208375, 641024, 5824513, 2234994, -4699231, +7004018, -10699300, -474594, -2493229, -6999186, -1871532, -5056250, -15414101, 7310035, -13460428, +6992744, 6216429, 8198019, 1008780, 5173825, -6052146, 23422604, 2555506, -26431766, -23288386, +1236951, 9335648, 18743238, -7315940, -16360604, -7729331, -3060701, 1253057, 10434623, 1480690, +-10274636, 25467546, -33842196, -6595459, 4784057, -23910082, -13244069, -7295002, 1691680, -38124816, +-19223200, 24809878, -12027519, 6167036, -10893648, -31060666, -13940390, 13400298, -7182259, 3243237, +16533477, -8024610, -45746232, -13909788, 4266513, 11550241, 14556181, 10052908, 13443785, 19614578, +39966280, -23671176, 17675402, -7271917, 910533, -7358353, -29895120, -25263534, -2871723, -3147674, +8375723, 10621454, 17780628, -6822019, 1088774, -10067940, 1702418, -3245922, 1483911, 14904073, +10575820, 3784403, 14491220, 13387950, -24932286, 11393474, -13763760, -21455510, -4079145, 10838350, +5400922, -15119359, 6161131, -270583, 11300059, -2806761, -24019068, -20461762, -19561966, -23311472, +4733054, 15697032, -1323924, 62054760, -39847632, -33643552, 21417392, -7752953, -10648298, -6489159, +-1202054, -1515587, -36814312, 1852742, -307090, 3020436, 32759864, -4577362, 13476534, 8974334, +17579302, 46477452, -14698452, 59146532, 21228950, -6231998, 9808095, -28056336, 10145250, 45107356, +1197222, 47066936, 24713778, -2812130, -18265422, 53070764, 7853885, -8909910, 6749541, -12069395, +-3678640, -1810866, -3384434, 6696928, 14672682, 10308458, 1815161, 6800007, -10797548, -10308458, +3062312, -3153043, 17273822, 18901078, 11863237, -4871567, 1008780, -22999550, -14625437, -4273493, +-15989090, -24866786, -15030775, 11857331, -14679661, -43841952, -20533164, 13428752, -17986786, -12460774, +347355, -3163780, 20338280, 30427158, 39557184, -21008296, 10999411, -159988, 949725, -8400419, +-26758720, -52402360, -35065724, 18550500, -35558036, -18063558, 9101036, 18278844, -13524315, 20663624, +57148836, 12825309, 10575283, -42776264, -59151900, -11598022, -18915036, -29830696, -9649181, -24235426, +17899276, 13205414, 51779052, 25865904, -11722576, 24396488, 47579112, -25194278, 35998268, 29405494, +-5056787, -7177427, -16615081, 5255430, 32154272, 24382530, 37792492, -16223702, -7772280, -7410429, +-2586644, -9854266, 9761924, -12156368, 27781460, 12315819, -46068356, -19357418, 281320, 7403987, +19753628, -8935679, -17405892, 5734855, 5427765, -6763500, -8523363, 5819144, -12950400, -19303194, +-8921721, 44029320, 18135500, 8131984, -21690122, -6244883, -18302466, 11804718, 21390010, 8039642, +1864016, 13442174, -6809134, 28731720, 16319265, 2832531, 9904195, 263604, 55562380, 12676596, +-22348326, 10377178, 10546829, 7035694, 13629542, 2430952, -20830054, 28222230, 7429757, 6529961, +12206834, 6987912, 2117419, -13962939, 21378200, 24100136, 14084272, 64521148, 47339668, -20717312, +-43521440, -935229, -10394895, -54476828, -8824010, 15217069, 14098767, -11544335, 17974438, 7242926, +-9670119, -19787452, 2855080, -4051228, -32921462, -8946417, -12922483, 3193308, -44731548, -32636920, +-7696582, 21842594, -4861903, -5732708, -27967754, 1224066, 20045150, 1720134, -17558364, -8244727, +-5540508, -8108899, 3231963, 7921531, -24245628, -23918136, 1436667, -347355, 2838974, 40794672, +-27140436, -2116345, -4088272, -38883948, -14437533, -28360206, -7151658, -2036888, 25125022, 31717796, +35631048, 11355357, 3696356, -14223321, -36456220, 1702418, 10742250, -11310796, 44191456, 110583056, +102877888, 15821586, -70785360, -61818000, -27450210, -38696044, 126820184, 80814640, 47431472, 66143032, +-4040491, -34181496, -95428264, -58631136, -25756918, -4387846, 34372088, 73114304, 25682294, -25102474, +29321204, 9737765, -2684, -48770964, -20568598, 49227304, -34428996, 16020765, -3740917, -7026567, +10297721, 8564702, 20556250, 41918880, -26620744, -27071178, 3925600, -15255724, 20140712, -28508382, +-20802138, -16903380, -1876901, -2335389, -22662394, 11365020, 32461362, -25901338, -36451388, -20673288, +-11971684, -4016331, 44799192, 5876589, -6209449, -45856292, -17390860, 7320235, 36561444, 20733418, +-12446278, -67496488, -55412596, 50172196, 46555836, 52693880, -28476706, -114543560, -28658170, 54802172, +38034084, 8849780, -19499152, 9488656, -53403624, -26198764, 9536438, -12082280, 7726110, -6976101, +-5096516, 51020992, -44231720, -18067316, 33169496, 33375654, 53492208, 26979910, -91865592, 26121454, +79257712, 18686866, 33982856, 9258339, -35785668, -59232968, 7531225, 9465571, 6493454, 56499756, +10609643, -5279052, -35764728, -7241315, -2699387, -9567040, 532576, -7916162, 15588584, 5888400, +-9941239, -2825552, 23676544, -899259, -441308, 1456531, -4886599, -10757819, 13612362, 10362682, +9380745, -15219753, 8266202, 20402706, 9114994, -2161979, 14487462, -3431142, -15649250, 3409667, +4801774, -14057428, -13677860, 13371844, 14467597, -14556718, 9330280, 7642895, 386010, -5796595, +559956, 10060424, -195421, -12837657, 6639483, 6689412, -22204980, 5107790, 16813186, 4858145, +-14513231, 1771137, 10310606, -19349902, 5012764, 8566312, 3464965, -5093831, -18516678, 21256330, +-23694798, -1793149, 21147882, 917512, -5201743, 1510755, -22756348, 10972031, -3159485, 15024869, +17451526, 53689776, 4897337, -6723235, -17824652, -12109123, 6505265, -8153996, 7152195, -10828686, +-634581, 8428336, -4597763, 3918621, 4170413, -15010911, 4374424, -4959614, -2988760, -12361990, +3745212, -3531000, -7475391, -3652333, 6241661, -5392332, -5011153, 7582765, -8114804, 4272419, +7549479, -14940581, 15086609, -3703336, -17242146, 9380745, 9654013, -8148627, 3230889, 5396090, +-7042673, -6572374, 448287, 1092532, 5209796, -2305324, -476205, -7272990, 7233799, -5654325, +-1418413, 8681740, -9822053, 3144453, -1382443, 219043, -4345433, -6432788, -2187749, 11806328, +-7385197, -2780991, 2429341, 2712272, 913754, -6757594, 5953899, -2874944, -5417028, 104153, +-10419054, 16517370, -6411313, 3555696, 4487167, -3083787, 6919729, -26126822, -44335872, 20601348, +150156896, 23738284, 74683576, -17060684, -77306192, -27226334, -75361640, -48557288, -16295106, -7597261, +2863133, 44980120, 52636972, 74658880, 72835128, 23971824, -29779692, -46453828, -87045568, -65540128, +-35509716, -12960601, -9552007, 27240294, 44008384, 35148940, 46401216, 46256260, 16094853, 15375983, +4838818, -32872070, -13176960, -28191092, -50521700, -29530048, -29841432, -42591580, -9965935, 20694226, +14528801, 44529684, 56864292, 30540438, 37598144, 29419990, -4888210, -755377, -3547106, -30524870, +-39058968, -33587180, -52185464, -43242268, -16342887, -2112050, 5301601, 36046048, 31852014, 32013076, +38854420, 30122216, 9268539, 19175956, 9355513, -11183021, -6426882, -20983600, -45847164, -26555246, +-26025354, -34526168, -16361141, -7961796, -8920647, 12223477, 751619, 0, 0, 0, +0, 0, 0, }, { 598611, -333934, 2591476, 2121714, -2348273, -1621887, -504122, 3191698, -3264712, -204011, -1760937, --4113505, 2080912, -803159, -3930969, -1672890, 3838090, -5396627, -1599339, 4961761, -1509681, --6172405, 4240207, -550293, -2192044, 1329829, -1729798, 3087008, -1814087, 1402307, -3595425, -3181497, -461172, -3484292, -361314, -1637456, 1931125, 1603633, -786516, 234076, 488016, -6812355, 3144453, -887448, 3452080, -1697049, 2784750, 452045, -1193464, -816044, -4350265, -1185411, -1661616, -3380676, 3061775, 515396, 1702955, 727997, 2112587, -1243930, -1906966, --3758, 391379, 1242856, -1053341, 2158758, 209380, 346282, -200253, -2683818, -278636, -1002875, 1946694, 506806, 1073742, 3257733, -1122597, 6152541, -3447785, 1016297, -5133560, -1427003, 601832, 7850127, -4687420, 2147, -2454574, 3928821, 4049081, -2579128, -463320, --2216740, -1239635, -2588792, -3184182, 2361695, 802622, -2107218, 4418985, 3992172, 6861747, --206158, 2617783, 1356136, -83215, -6174016, 1637456, 2571612, -2404645, 1546725, -1763621, --2088428, -3354906, 1765768, 4394826, 460098, 5122822, -2064806, -399432, 5146445, 2719251, -432718, -29528, 4894652, 7354595, -5419712, 1251446, -1851668, -814433, -8442295, -2981244, -3463354, -2609730, 2416993, 1114007, -1196148, -2046015, 1255741, -704912, 2707977, 1418413, -1306207, 1316408, -4312147, 96637, -2010045, 2585034, 4619774, 2936684, -469225, 4467840, -271657, 1075889, 187905, 717796, -953483, 3576097, -4402879, -4807142, 278636, -6439767, -1265942, -2093260, 3185255, -1795833, -4927938, 475668, 5037460, -850404, 275952, 6771016, -8739722, -3822521, -3852586, -1224066, -6307160, 2643552, 697932, 1500554, -2143189, 3325379, --4356171, -916439, 3179350, -2619930, -798327, 363998, 5683853, 250182, 4148939, -5414880, -5338108, -681289, 882079, 3257196, -2779918, 2694555, -1187559, -1472100, 2562485, 3069291, --401043, 1693828, -6891812, 4111358, 4277788, -7610145, -6412923, -2015950, -5288179, -1699196, -2238215, 1167694, 2149631, -89657, -1641751, 4364761, -1357747, -82678, -1647120, 796716, --2582349, 3576097, 1165010, -3395709, -1459752, -1672890, -1506460, -2182380, 4170950, 11210938, -1996623, -3994320, 5013838, 756451, -3629784, 10229001, -6945499, -9654013, -5862094, -5826123, --2149094, 2956011, 3387119, -3300146, 4940286, -6359236, -3685082, -723702, 1934883, 1647657, --2157684, -2483565, 5513665, 1134408, -609885, -3183645, 4044249, -3106872, -962073, 4832, --610959, -444529, 1404454, 886374, -1151588, 3557844, -1963874, 2158221, -446677, -5844914, --2589329, -2356863, 5871221, -3470871, -4504884, -7605850, -9179419, -1669132, 86973, -3589519, -6323266, 834297, 3202972, -2785823, 5384815, 2388002, -3802120, 9260486, -4700305, -4632659, -236760, 5753646, 8078834, 5969468, 1464047, -3119757, -7357816, 2563559, -724776, 6531572, -1974611, -2041720, -1029718, 3271691, 1751273, -1172526, -10104984, 1241246, -3427921, 2028835, -1084479, 7131257, -9335648, -5965173, -6757058, 3391414, 3540664, 4148939, -4725001, 1308354, --1153199, 197569, -7574712, -7219303, -4615479, -5380521, 8346732, -3700114, -628139, -629213, -3056406, -1768990, -8104067, 3048890, -3037616, -1614371, 4205847, 2404645, 4774393, -246424, -2684892, -6451041, -2157684, 4733591, 9067750, 4585415, -116501, -7304129, 5043902, -2768643, --5555540, 7391102, 2613488, 2116345, -4708895, -3534758, 2958159, -2495913, -2552821, 3519726, --3156264, 734439, 368293, -6353867, -1049046, -4501663, 5978058, 2138357, -733366, 98784, --2652142, 2509335, 584652, -1146756, 980326, -7838852, -3604551, 2470680, 1605781, -2611340, --1188095, -6390375, -15860777, 5310727, 800475, 3974992, 4274566, -3051038, -11190537, 8689793, -3697430, 8559870, -1523640, 4576288, -37044, -2979097, -147103, -7833484, 9768903, 2310693, -1007170, -4883378, -2764348, -3264712, 3011846, -4326106, 7554311, 457951, 2701535, 4276177, -2448131, -328028, 2576444, 2447595, -1537598, 2093260, -8038568, 2320893, 3998615, 4034048, -7669201, 2765959, -4670240, 2682207, -2190433, 5251135, 1308354, 3886946, 6002217, 1152662, --845035, 4660040, -2618856, -4559108, -1315334, 3341485, 8322573, -1588064, 1040993, 415538, -1535451, 1821603, 3934727, 1408212, -1330903, -64425, -1969243, 2326262, 1548873, -4639102, --3347927, 2057826, 3914863, 3062849, 6272263, -7311645, -2424509, -5419175, 8507793, 4360466, -15653008, 8999030, 7214472, 11618423, 2611340, 2515777, -7232725, 265751, -13157095, -1797981, -4462471, 4036196, 1879585, 3470871, 3132105, -2221572, -2234457, 7853885, 6231461, 6211060, --780610, 1360431, -9451612, -7310035, -3322157, 6357626, 1539746, -591095, 2813741, -4686346, -192737, -2102923, 6041945, 5631239, 10846940, -439697, 3919158, 4183835, -2066953, -5141076, -10213969, -5374078, -1639604, 5485210, -19864, 3459059, 7317014, -1628866, 2589329, -6496675, --15836081, -7825968, -5390721, -1231582, 526134, 275415, -4212826, -7459822, -1923072, -5051419, -1691143, 883690, 599685, -8390219, -4436701, 7277822, 2014340, 848793, -10572599, -8181376, -5613523, 2463164, 3462818, -5317707, -242129, -1155883, -7872138, 5893232, -3350611, -568546, --20921860, -5271536, -7562901, -5447629, 1133335, 6731825, -1121523, 8987756, 5172215, -809601, --8842801, -4034585, 13834627, 2009508, -7848516, -6190659, -2411087, 6104759, -4689031, -175557, -4641249, 6670084, 8072928, -8805220, 6024229, 538482, 1891933, 2208150, 3423089, 2520072, -8084202, -12885, 2629594, -7082938, 9843528, -5037460, -2014340, 1401770, -7723425, 9648644, --1324461, -19452980, -6136972, -15648713, 1168231, -402653, -4457103, 20802138, -3461207, -10536092, --3325915, -2692945, 9819906, -1444183, 4766877, 5544803, -3781719, 7112466, 10060961, -5105106, -3882651, -8856223, 4369056, -3157875, -2485712, 10252087, -3807489, -851477, -4758824, 523986, --459562, 9727027, -13538811, 2786897, 2670933, -4153234, 1733019, 10252087, 10799695, 4151623, -3825205, 5311264, -8463770, -1327145, -9028021, -45097, 5690295, 3782793, -1930051, -6942278, --2335925, 4968204, -9337259, 494458, -690416, 4482335, 8841727, 1036161, -4795868, -3432753, -9469866, -5877126, -2954938, 5688684, -3405909, -10970420, -4069482, 2806224, 1890859, -4215511, -1044214, 6122476, 4024921, 5929739, -669478, 4560182, 8050380, -3223910, 4001299, 3815005, --5534066, 12328167, -11526082, 7244536, 2974802, -15563888, 15233712, -9454297, 2092723, -1297080, -12095165, -4677757, -8798241, -1301375, -120796, 2796561, 9110163, -7334194, -751619, 1268626, -52613, -650151, 2075543, -5572183, -1980517, -3473018, -10244571, -7334731, -10450192, 8245801, --24276766, 13211856, -9476308, -6936909, -11691975, 1117228, -1110786, 1894081, 8920110, -7406134, --2407866, 6645925, 6621229, -2228551, 2825015, -3470871, -10838350, -1228361, 3264712, -5908265, -9527311, 1403381, -591632, -5504538, -4821101, 1140314, 14493904, 506269, -1438814, 3768834, --11543798, -2130841, 4987531, -8212515, 12344810, 7472706, 193810, -3564823, -3297998, -4466229, --7372848, -9837623, 9046275, 752156, 15560667, 1519882, -14496, -6453725, 2022930, -2350958, -4158065, 107911, -8484171, -6938520, -8618389, -15611132, -1276142, 14668387, -12517145, -227633, --13091060, 2971044, 5145908, 4127464, 11356967, -126165, -13212930, 11637214, 487479, -5605469, --4176856, -10753524, -2292976, -7048578, 7716446, 10859825, -4169876, 9689983, -9464497, -4548371, -6107981, 2363306, -12665859, 1107028, 15769509, -18212808, 787053, 8955544, 20508468, -8595840, --5598490, -1978906, 15813533, 16123307, -17029008, -489089, -13150653, -5858336, 8071318, 8709657, -10726144, 6547678, -2483565, 8034810, -9878962, -4888210, -1254131, -1197759, -14163728, 1500017, --605590, 18620294, -3124589, 9307731, 1899986, 5618891, 12007118, -7188702, -3597572, -17884244, -12209518, -15740518, -3117073, 3898220, -2436320, -9007620, -2592550, 2832531, -6838662, 2000918, --1346472, -1205812, -20648056, -14249091, 732292, -10290205, -14586246, 2803003, -13513578, 4370129, -8306467, -7611756, 14461692, 3265249, 9133785, 10363756, 2203855, -7305740, -9452686, -10736344, -5082020, -10249403, 25836376, 10216117, 4825933, 12696460, -4575214, 2373506, -13070659, -17767742, -11407970, 21990770, 7113540, -472446, -21630530, 26304528, 4334159, 2921652, 4316442, 628676, -5324149, 1163399, -3306051, -522375, 7262790, -4491999, 9005473, 1268089, -6105833, -9603547, --1949915, 8086887, -1722282, 2395518, -3209414, -3753802, 773631, 23561654, 4524211, 3090766, -3909494, 1644436, 15044197, -5724655, 4856535, -9654550, 17846662, 23408646, 6997039, -1773822, --7644505, 24460912, 12557411, -55835, -8713952, 3204046, -4815195, -1338956, -10030896, -4609574, --6298033, -10602127, 17507898, -5403069, 13276818, 2024003, -8109972, -659278, -18737868, 18613852, -118112, -9664213, -5523328, -12103218, -12632573, -8033200, 24063092, -5737540, -2419677, 6013491, -7747048, -5880884, -5759015, 23381266, 23390928, 28359132, 17415556, 5361730, -7150047, -7921531, -4412005, 7958038, 10293426, -15627239, -368293, -2226404, 7706245, 5603859, -10531260, -13492640, --28991, -5416491, 12430172, 14128295, -26844, 7231115, 2509335, 2552284, 16825534, -10888816, --13764833, 10184978, -18023294, 920734, -5661304, 9228274, 4874251, -504122, 11361799, 9892920, --9877351, 11270531, -288300, -5935108, 2547989, 12233141, -5384815, 4715874, 9309342, 3465502, --21293910, -13036836, 1585917, 80531, -14717242, -10779831, 4125853, 5601711, 5080410, -20564840, --14248554, -14774687, -1909113, 6957310, 11261404, -32268626, -23687818, 2042794, 3408057, 15811385, -4663798, 4248260, 10894721, -4297652, -5771899, -7749195, -9547175, -20014548, -18446884, -16110959, -6554120, -2516314, 9342628, -17700634, -2292976, 306553, -6089727, -8540006, 14532022, -5842230, -3386045, -692027, 1531693, -14495515, -4596689, -12457016, 2163053, 1124745, 3688840, 32700808, --12336757, 8713952, 14539001, -7516193, -6095096, -10453414, -1432909, 15073725, -15200426, 10418517, --428960, -3020436, 2066416, 1214402, 9111773, 597537, -16132971, 12483322, -9803263, -24376624, --18825378, -10052371, 33225330, 27361626, -14348949, -4564477, -19935628, -17416092, -6095633, 19951734, -1240709, 13756780, 7990787, -9526774, 11338177, -7198365, -20675436, -1723893, -12194486, -2444910, --6115497, 42726336, 1295470, -34493956, 28506772, -10211285, -6751689, 29259464, 29496762, 2602213, --10764262, 10919954, 4944044, -16592532, -10773389, 5386963, 3703336, 9425843, 28558848, 5225365, --1051730, 6994891, 1184874, -11769821, -7707856, 6692633, 1139777, 23786066, 5208185, -1256278, -8156143, 12858058, 12441983, 14003204, 348966, -9491878, -3099356, -21935472, -3434363, -24798068, -13487271, -15028091, -6346888, 239981, 19742890, -11564199, 10751914, -8080444, 6295885, -10178536, -12360916, 19649476, 756451, -3988951, -11098732, -15005542, 7837779, 9825811, 24072218, -3234110, -536871, 11013907, 38876432, -9139690, 5144297, -6311455, -22919556, 15592879, -4076461, 11113228, --2362769, 2825015, -14383845, 36779416, -56223808, 40604084, -64483564, 27335856, -34121368, 10275172, --27372900, 9421011, 14668387, -3677566, 9619653, -5782100, 41744396, -26366268, 22759032, 13652090, -11617887, 44087304, -30496416, 12618077, 8557185, -26951456, -293668, -5512591, -7114077, -13955959, --252866, 1335735, 18178450, 6370510, 9770514, 13080323, 11294153, 213675, 15297600, -17169668, --1871532, 20326470, 2879776, -28247464, -5843303, -36905580, -6236293, 6308233, -6154152, -8666170, --915365, 32803886, 9021042, 2458869, 4750771, 8186745, -1719061, -18889266, -4985920, -2106682, -4322348, -4347581, -7960722, 23824720, 13701483, -4892505, -212601, -5073430, -20570746, -17617418, --11911018, -10665478, 25076166, 5864778, 9967008, -14398341, -12908524, 4611185, 11001559, 9108552, --2773475, -2767033, -14944339, -10726144, 15755551, 678605, -37891276, 13886703, 23394686, 6794639, --15110769, -10861435, -5956583, 2253247, -8484171, 4482335, -13548474, -36303212, 31753766, 39429412, --3988414, 28790240, 846645, 4754529, 12083354, -24648818, 8859981, 19017578, 18080202, 8157754, -5462662, -17645874, 13084081, 8314520, -11159399, 6385543, -2314451, 22178138, 5868536, 6096706, -12721693, -4548371, -14762339, 4857071, 27564564, -9256191, -5318780, 25526064, -9060770, -10483478, --8940511, 9243843, 32189170, 45215804, -2546379, -28172838, 43952548, 15771657, -28429462, 33324114, -12873091, -7307350, -7885560, -11423539, -19724638, -337692, 11276437, -16552804, -10660109, -35873716, --4156992, 22264574, -43545064, -23199802, 8121247, 8099772, 10035191, 27940910, 25338160, -38588672, -2005750, 2484102, -26023206, 8778376, 15652471, -13433047, -7425462, -11294153, 11639361, 31664646, -14372034, 16024523, -14433774, 7022809, -20315196, 23511188, 80269720, -25956634, 1286880, 5633387, -36590436, 31432718, -9820980, -14306536, -19458886, 421444, 15903727, -923418, -9596031, -10965588, -15084999, -8225936, -18615462, -17642652, -2751464, 28951300, 21304112, -23608362, 2347737, 127775, --9350681, 11270531, 5099200, -8565775, -1893544, -6769942, -2248952, 37177772, -13023951, -25017648, --16456167, -14277008, 34015604, 774705, -6688338, 30331060, 21937620, 8228621, 16532940, 29873646, --17138530, 4576288, 30234422, 17017734, 23394150, -25267292, -5947993, -905701, 11879343, 10108742, --22665080, 2375654, -30127048, -47166792, -1130650, -12368969, 23374822, 24579024, -4927938, -1764158, -6497749, -17012902, -44194676, 30995168, -20523502, 4905390, -6814503, -15404974, -7186017, -17878338, --33541548, 3739843, 2144263, -12475269, -3684545, -39131984, -22318260, -18218178, -45932528, 53255984, --1043677, 28094454, -6188511, 1484985, -31878322, -17454748, -16301012, 3836480, 25469156, -1012539, --25862682, -19439022, -37080064, -41525892, 36177584, 13379360, -32003412, -9877351, 16510391, 29990682, -4712116, -36742908, -21887690, 7511898, 10973641, 9409200, 22261352, -22742388, -21070572, -3108483, --6945499, 3286187, 7280507, -44174276, -7268159, -30742302, -18853832, -41087804, -14602889, 56812752, -10897943, 1989107, 15105937, 14213121, 5749351, 42211476, 34714072, -10888816, 12840878, 56906708, --13234942, -13247290, -11780558, -42369316, 319438, -23286776, -50450296, -55343876, -26556856, -28752658, -15515569, -21682068, 4852776, 10827613, -33975876, -13740137, 4628901, 2218888, 36537288, -24303610, -8310762, -27909234, -7650948, -30287036, 5165772, 34113316, 658204, 20675436, -42107324, 37250252, -14399952, -8913668, 31984084, 3242164, 15460809, -13137768, -12670154, -1218697, 11033771, 6228240, --28687698, 27088896, -31935230, 3301219, 11309723, -12254079, 21808770, -21736292, -9949829, -3036005, --5463199, -11300596, -264141, 3859565, -13445395, -18973018, -3748970, -3777961, -2239826, 10638634, -8407935, 4064650, -19865834, 5487358, 29613262, 35538172, -23923504, -13721347, 33247878, 41470592, --22544820, -15957951, 20539608, 7147900, -17076254, 16491601, -44070660, -9500468, 22645216, 37618544, -8509404, -23609436, -17351132, 5552856, 49460308, 3710852, 11376295, 999654, 20195474, -3517041, -39698384, -1546188, -29679834, 20793548, -13015362, -55158656, -17581986, 11382200, -21012590, 57985280, -39339216, 28754270, 12507482, 39686036, 24951612, 10670309, 16398722, -42877732, -61819612, -6592238, --1301912, -13687524, 6138045, -1122597, -17550310, -17921824, -17934172, 32810866, 25134148, -19906636, --4696010, -1276142, -7361037, -5954436, -13215614, -14643691, -24889336, -2638184, 38573100, -11212012, --24473798, -9001715, 36061084, -16013249, -19468550, 60620244, 18943490, 11669963, -16333761, -30572650, --24613920, -31587874, 6968048, 29300266, 72264432, -63541892, -29804388, 40105868, 50939384, 11043435, --5286031, 69914552, 30463130, -19718732, 19480362, -6070937, -2025077, -45418744, -26156888, -14737643, --79807472, -31077846, -15052787, 43346420, -25285546, -11390253, 28026810, -496606, -7639673, 8931921, -17315698, 48987324, 18403934, -4422206, 13099113, -2808372, -4247723, -18476412, 9032853, 7215545, --14015552, -7292318, -51833812, -2434173, 21793200, -5351530, -21427592, 9203578, -4563940, 23145042, -5013301, -11686606, 146029, 24795384, -13967771, 3715684, 9408663, -7971996, 118648, -13921600, -28082106, -2002529, 4481262, 104153, 13765370, -6413997, -4850629, -9017821, 5924908, 10072772, --4176319, 12028593, -4956393, 7271380, -12590160, -10613401, 16234976, 19891604, -25713970, 853088, -518617, 2080375, 8761196, -16842714, 25806310, -23003844, 20915416, 2471754, -34697432, -2297808, -28255516, -36320928, 17908940, -193274, 5483063, -8959302, -4443681, 6979859, -9351218, 36604396, --25979720, 3967476, -5798206, -3197066, 10928007, 1034550, -2403571, -26561152, -74454328, -106802416, -34812856, 92843232, 19430432, 259243152, 213183392, 142831824, 243473648, 125044216, -11820287, -34357592, --100785168, -228516960, -189453696, -184973504, -255336880, -190651456, -59875604, -46215460, -12696460, 80392664, -33774548, -18269180, 47793324, 83300352, 36570572, 33973728, 74265888, 39944268, 28499792, 64966212, -107842336, 38015292, 58076012, 98965176, 6721087, -5583458, 84869624, 43930536, -52042656, 32123672, -45501956, -80090936, -35751844, 52691732, -32268626, -61215096, 71354440, 27569396, -77579992, 26468272, -41736880, -110550312, -105817792, -60903172, -235776528, -305454848, -203463344, -276229760, -359028672, -262171776, --269178496, -339558496, -278824448, -208691920, -225337072, -156797984, -43481712, 8761733, 81913080, 168436800, -219100240, 279131520, 305690528, 325236928, 256278016, 71095664, 3454764, 0, 0, 0, -0, 0, 0, }, +333934, 2591476, 2121714, -2348273, -1621887, -504122, 3191698, -3264712, -204011, -1760937, +-4113505, 2080912, -803159, -3930969, -1672890, 3838090, -5396627, -1599339, 4961761, -1509681, +-6172405, 4240207, -550293, -2192044, 1329829, -1729798, 3087008, -1814087, 1402307, -3595425, +3181497, -461172, -3484292, -361314, -1637456, 1931125, 1603633, -786516, 234076, 488016, +6812355, 3144453, -887448, 3452080, -1697049, 2784750, 452045, -1193464, -816044, -4350265, +1185411, -1661616, -3380676, 3061775, 515396, 1702955, 727997, 2112587, -1243930, -1906966, +-3758, 391379, 1242856, -1053341, 2158758, 209380, 346282, -200253, -2683818, -278636, +1002875, 1946694, 506806, 1073742, 3257733, -1122597, 6152541, -3447785, 1016297, -5133560, +1427003, 601832, 7850127, -4687420, 2147, -2454574, 3928821, 4049081, -2579128, -463320, +-2216740, -1239635, -2588792, -3184182, 2361695, 802622, -2107218, 4418985, 3992172, 6861747, +-206158, 2617783, 1356136, -83215, -6174016, 1637456, 2571612, -2404645, 1546725, -1763621, +-2088428, -3354906, 1765768, 4394826, 460098, 5122822, -2064806, -399432, 5146445, 2719251, +432718, -29528, 4894652, 7354595, -5419712, 1251446, -1851668, -814433, -8442295, -2981244, +3463354, -2609730, 2416993, 1114007, -1196148, -2046015, 1255741, -704912, 2707977, 1418413, +1306207, 1316408, -4312147, 96637, -2010045, 2585034, 4619774, 2936684, -469225, 4467840, +271657, 1075889, 187905, 717796, -953483, 3576097, -4402879, -4807142, 278636, -6439767, +1265942, -2093260, 3185255, -1795833, -4927938, 475668, 5037460, -850404, 275952, 6771016, +8739722, -3822521, -3852586, -1224066, -6307160, 2643552, 697932, 1500554, -2143189, 3325379, +-4356171, -916439, 3179350, -2619930, -798327, 363998, 5683853, 250182, 4148939, -5414880, +5338108, -681289, 882079, 3257196, -2779918, 2694555, -1187559, -1472100, 2562485, 3069291, +-401043, 1693828, -6891812, 4111358, 4277788, -7610145, -6412923, -2015950, -5288179, -1699196, +2238215, 1167694, 2149631, -89657, -1641751, 4364761, -1357747, -82678, -1647120, 796716, +-2582349, 3576097, 1165010, -3395709, -1459752, -1672890, -1506460, -2182380, 4170950, 11210938, +1996623, -3994320, 5013838, 756451, -3629784, 10229001, -6945499, -9654013, -5862094, -5826123, +-2149094, 2956011, 3387119, -3300146, 4940286, -6359236, -3685082, -723702, 1934883, 1647657, +-2157684, -2483565, 5513665, 1134408, -609885, -3183645, 4044249, -3106872, -962073, 4832, +-610959, -444529, 1404454, 886374, -1151588, 3557844, -1963874, 2158221, -446677, -5844914, +-2589329, -2356863, 5871221, -3470871, -4504884, -7605850, -9179419, -1669132, 86973, -3589519, +6323266, 834297, 3202972, -2785823, 5384815, 2388002, -3802120, 9260486, -4700305, -4632659, +236760, 5753646, 8078834, 5969468, 1464047, -3119757, -7357816, 2563559, -724776, 6531572, +1974611, -2041720, -1029718, 3271691, 1751273, -1172526, -10104984, 1241246, -3427921, 2028835, +1084479, 7131257, -9335648, -5965173, -6757058, 3391414, 3540664, 4148939, -4725001, 1308354, +-1153199, 197569, -7574712, -7219303, -4615479, -5380521, 8346732, -3700114, -628139, -629213, +3056406, -1768990, -8104067, 3048890, -3037616, -1614371, 4205847, 2404645, 4774393, -246424, +2684892, -6451041, -2157684, 4733591, 9067750, 4585415, -116501, -7304129, 5043902, -2768643, +-5555540, 7391102, 2613488, 2116345, -4708895, -3534758, 2958159, -2495913, -2552821, 3519726, +-3156264, 734439, 368293, -6353867, -1049046, -4501663, 5978058, 2138357, -733366, 98784, +-2652142, 2509335, 584652, -1146756, 980326, -7838852, -3604551, 2470680, 1605781, -2611340, +-1188095, -6390375, -15860777, 5310727, 800475, 3974992, 4274566, -3051038, -11190537, 8689793, +3697430, 8559870, -1523640, 4576288, -37044, -2979097, -147103, -7833484, 9768903, 2310693, +1007170, -4883378, -2764348, -3264712, 3011846, -4326106, 7554311, 457951, 2701535, 4276177, +2448131, -328028, 2576444, 2447595, -1537598, 2093260, -8038568, 2320893, 3998615, 4034048, +7669201, 2765959, -4670240, 2682207, -2190433, 5251135, 1308354, 3886946, 6002217, 1152662, +-845035, 4660040, -2618856, -4559108, -1315334, 3341485, 8322573, -1588064, 1040993, 415538, +1535451, 1821603, 3934727, 1408212, -1330903, -64425, -1969243, 2326262, 1548873, -4639102, +-3347927, 2057826, 3914863, 3062849, 6272263, -7311645, -2424509, -5419175, 8507793, 4360466, +15653008, 8999030, 7214472, 11618423, 2611340, 2515777, -7232725, 265751, -13157095, -1797981, +4462471, 4036196, 1879585, 3470871, 3132105, -2221572, -2234457, 7853885, 6231461, 6211060, +-780610, 1360431, -9451612, -7310035, -3322157, 6357626, 1539746, -591095, 2813741, -4686346, +192737, -2102923, 6041945, 5631239, 10846940, -439697, 3919158, 4183835, -2066953, -5141076, +10213969, -5374078, -1639604, 5485210, -19864, 3459059, 7317014, -1628866, 2589329, -6496675, +-15836081, -7825968, -5390721, -1231582, 526134, 275415, -4212826, -7459822, -1923072, -5051419, +1691143, 883690, 599685, -8390219, -4436701, 7277822, 2014340, 848793, -10572599, -8181376, +5613523, 2463164, 3462818, -5317707, -242129, -1155883, -7872138, 5893232, -3350611, -568546, +-20921860, -5271536, -7562901, -5447629, 1133335, 6731825, -1121523, 8987756, 5172215, -809601, +-8842801, -4034585, 13834627, 2009508, -7848516, -6190659, -2411087, 6104759, -4689031, -175557, +4641249, 6670084, 8072928, -8805220, 6024229, 538482, 1891933, 2208150, 3423089, 2520072, +8084202, -12885, 2629594, -7082938, 9843528, -5037460, -2014340, 1401770, -7723425, 9648644, +-1324461, -19452980, -6136972, -15648713, 1168231, -402653, -4457103, 20802138, -3461207, -10536092, +-3325915, -2692945, 9819906, -1444183, 4766877, 5544803, -3781719, 7112466, 10060961, -5105106, +3882651, -8856223, 4369056, -3157875, -2485712, 10252087, -3807489, -851477, -4758824, 523986, +-459562, 9727027, -13538811, 2786897, 2670933, -4153234, 1733019, 10252087, 10799695, 4151623, +3825205, 5311264, -8463770, -1327145, -9028021, -45097, 5690295, 3782793, -1930051, -6942278, +-2335925, 4968204, -9337259, 494458, -690416, 4482335, 8841727, 1036161, -4795868, -3432753, +9469866, -5877126, -2954938, 5688684, -3405909, -10970420, -4069482, 2806224, 1890859, -4215511, +1044214, 6122476, 4024921, 5929739, -669478, 4560182, 8050380, -3223910, 4001299, 3815005, +-5534066, 12328167, -11526082, 7244536, 2974802, -15563888, 15233712, -9454297, 2092723, -1297080, +12095165, -4677757, -8798241, -1301375, -120796, 2796561, 9110163, -7334194, -751619, 1268626, +52613, -650151, 2075543, -5572183, -1980517, -3473018, -10244571, -7334731, -10450192, 8245801, +-24276766, 13211856, -9476308, -6936909, -11691975, 1117228, -1110786, 1894081, 8920110, -7406134, +-2407866, 6645925, 6621229, -2228551, 2825015, -3470871, -10838350, -1228361, 3264712, -5908265, +9527311, 1403381, -591632, -5504538, -4821101, 1140314, 14493904, 506269, -1438814, 3768834, +-11543798, -2130841, 4987531, -8212515, 12344810, 7472706, 193810, -3564823, -3297998, -4466229, +-7372848, -9837623, 9046275, 752156, 15560667, 1519882, -14496, -6453725, 2022930, -2350958, +4158065, 107911, -8484171, -6938520, -8618389, -15611132, -1276142, 14668387, -12517145, -227633, +-13091060, 2971044, 5145908, 4127464, 11356967, -126165, -13212930, 11637214, 487479, -5605469, +-4176856, -10753524, -2292976, -7048578, 7716446, 10859825, -4169876, 9689983, -9464497, -4548371, +6107981, 2363306, -12665859, 1107028, 15769509, -18212808, 787053, 8955544, 20508468, -8595840, +-5598490, -1978906, 15813533, 16123307, -17029008, -489089, -13150653, -5858336, 8071318, 8709657, +10726144, 6547678, -2483565, 8034810, -9878962, -4888210, -1254131, -1197759, -14163728, 1500017, +-605590, 18620294, -3124589, 9307731, 1899986, 5618891, 12007118, -7188702, -3597572, -17884244, +12209518, -15740518, -3117073, 3898220, -2436320, -9007620, -2592550, 2832531, -6838662, 2000918, +-1346472, -1205812, -20648056, -14249091, 732292, -10290205, -14586246, 2803003, -13513578, 4370129, +8306467, -7611756, 14461692, 3265249, 9133785, 10363756, 2203855, -7305740, -9452686, -10736344, +5082020, -10249403, 25836376, 10216117, 4825933, 12696460, -4575214, 2373506, -13070659, -17767742, +11407970, 21990770, 7113540, -472446, -21630530, 26304528, 4334159, 2921652, 4316442, 628676, +5324149, 1163399, -3306051, -522375, 7262790, -4491999, 9005473, 1268089, -6105833, -9603547, +-1949915, 8086887, -1722282, 2395518, -3209414, -3753802, 773631, 23561654, 4524211, 3090766, +3909494, 1644436, 15044197, -5724655, 4856535, -9654550, 17846662, 23408646, 6997039, -1773822, +-7644505, 24460912, 12557411, -55835, -8713952, 3204046, -4815195, -1338956, -10030896, -4609574, +-6298033, -10602127, 17507898, -5403069, 13276818, 2024003, -8109972, -659278, -18737868, 18613852, +118112, -9664213, -5523328, -12103218, -12632573, -8033200, 24063092, -5737540, -2419677, 6013491, +7747048, -5880884, -5759015, 23381266, 23390928, 28359132, 17415556, 5361730, -7150047, -7921531, +4412005, 7958038, 10293426, -15627239, -368293, -2226404, 7706245, 5603859, -10531260, -13492640, +-28991, -5416491, 12430172, 14128295, -26844, 7231115, 2509335, 2552284, 16825534, -10888816, +-13764833, 10184978, -18023294, 920734, -5661304, 9228274, 4874251, -504122, 11361799, 9892920, +-9877351, 11270531, -288300, -5935108, 2547989, 12233141, -5384815, 4715874, 9309342, 3465502, +-21293910, -13036836, 1585917, 80531, -14717242, -10779831, 4125853, 5601711, 5080410, -20564840, +-14248554, -14774687, -1909113, 6957310, 11261404, -32268626, -23687818, 2042794, 3408057, 15811385, +4663798, 4248260, 10894721, -4297652, -5771899, -7749195, -9547175, -20014548, -18446884, -16110959, +6554120, -2516314, 9342628, -17700634, -2292976, 306553, -6089727, -8540006, 14532022, -5842230, +3386045, -692027, 1531693, -14495515, -4596689, -12457016, 2163053, 1124745, 3688840, 32700808, +-12336757, 8713952, 14539001, -7516193, -6095096, -10453414, -1432909, 15073725, -15200426, 10418517, +-428960, -3020436, 2066416, 1214402, 9111773, 597537, -16132971, 12483322, -9803263, -24376624, +-18825378, -10052371, 33225330, 27361626, -14348949, -4564477, -19935628, -17416092, -6095633, 19951734, +1240709, 13756780, 7990787, -9526774, 11338177, -7198365, -20675436, -1723893, -12194486, -2444910, +-6115497, 42726336, 1295470, -34493956, 28506772, -10211285, -6751689, 29259464, 29496762, 2602213, +-10764262, 10919954, 4944044, -16592532, -10773389, 5386963, 3703336, 9425843, 28558848, 5225365, +-1051730, 6994891, 1184874, -11769821, -7707856, 6692633, 1139777, 23786066, 5208185, -1256278, +8156143, 12858058, 12441983, 14003204, 348966, -9491878, -3099356, -21935472, -3434363, -24798068, +13487271, -15028091, -6346888, 239981, 19742890, -11564199, 10751914, -8080444, 6295885, -10178536, +12360916, 19649476, 756451, -3988951, -11098732, -15005542, 7837779, 9825811, 24072218, -3234110, +536871, 11013907, 38876432, -9139690, 5144297, -6311455, -22919556, 15592879, -4076461, 11113228, +-2362769, 2825015, -14383845, 36779416, -56223808, 40604084, -64483564, 27335856, -34121368, 10275172, +-27372900, 9421011, 14668387, -3677566, 9619653, -5782100, 41744396, -26366268, 22759032, 13652090, +11617887, 44087304, -30496416, 12618077, 8557185, -26951456, -293668, -5512591, -7114077, -13955959, +-252866, 1335735, 18178450, 6370510, 9770514, 13080323, 11294153, 213675, 15297600, -17169668, +-1871532, 20326470, 2879776, -28247464, -5843303, -36905580, -6236293, 6308233, -6154152, -8666170, +-915365, 32803886, 9021042, 2458869, 4750771, 8186745, -1719061, -18889266, -4985920, -2106682, +4322348, -4347581, -7960722, 23824720, 13701483, -4892505, -212601, -5073430, -20570746, -17617418, +-11911018, -10665478, 25076166, 5864778, 9967008, -14398341, -12908524, 4611185, 11001559, 9108552, +-2773475, -2767033, -14944339, -10726144, 15755551, 678605, -37891276, 13886703, 23394686, 6794639, +-15110769, -10861435, -5956583, 2253247, -8484171, 4482335, -13548474, -36303212, 31753766, 39429412, +-3988414, 28790240, 846645, 4754529, 12083354, -24648818, 8859981, 19017578, 18080202, 8157754, +5462662, -17645874, 13084081, 8314520, -11159399, 6385543, -2314451, 22178138, 5868536, 6096706, +12721693, -4548371, -14762339, 4857071, 27564564, -9256191, -5318780, 25526064, -9060770, -10483478, +-8940511, 9243843, 32189170, 45215804, -2546379, -28172838, 43952548, 15771657, -28429462, 33324114, +12873091, -7307350, -7885560, -11423539, -19724638, -337692, 11276437, -16552804, -10660109, -35873716, +-4156992, 22264574, -43545064, -23199802, 8121247, 8099772, 10035191, 27940910, 25338160, -38588672, +2005750, 2484102, -26023206, 8778376, 15652471, -13433047, -7425462, -11294153, 11639361, 31664646, +14372034, 16024523, -14433774, 7022809, -20315196, 23511188, 80269720, -25956634, 1286880, 5633387, +36590436, 31432718, -9820980, -14306536, -19458886, 421444, 15903727, -923418, -9596031, -10965588, +15084999, -8225936, -18615462, -17642652, -2751464, 28951300, 21304112, -23608362, 2347737, 127775, +-9350681, 11270531, 5099200, -8565775, -1893544, -6769942, -2248952, 37177772, -13023951, -25017648, +-16456167, -14277008, 34015604, 774705, -6688338, 30331060, 21937620, 8228621, 16532940, 29873646, +-17138530, 4576288, 30234422, 17017734, 23394150, -25267292, -5947993, -905701, 11879343, 10108742, +-22665080, 2375654, -30127048, -47166792, -1130650, -12368969, 23374822, 24579024, -4927938, -1764158, +6497749, -17012902, -44194676, 30995168, -20523502, 4905390, -6814503, -15404974, -7186017, -17878338, +-33541548, 3739843, 2144263, -12475269, -3684545, -39131984, -22318260, -18218178, -45932528, 53255984, +-1043677, 28094454, -6188511, 1484985, -31878322, -17454748, -16301012, 3836480, 25469156, -1012539, +-25862682, -19439022, -37080064, -41525892, 36177584, 13379360, -32003412, -9877351, 16510391, 29990682, +4712116, -36742908, -21887690, 7511898, 10973641, 9409200, 22261352, -22742388, -21070572, -3108483, +-6945499, 3286187, 7280507, -44174276, -7268159, -30742302, -18853832, -41087804, -14602889, 56812752, +10897943, 1989107, 15105937, 14213121, 5749351, 42211476, 34714072, -10888816, 12840878, 56906708, +-13234942, -13247290, -11780558, -42369316, 319438, -23286776, -50450296, -55343876, -26556856, -28752658, +15515569, -21682068, 4852776, 10827613, -33975876, -13740137, 4628901, 2218888, 36537288, -24303610, +8310762, -27909234, -7650948, -30287036, 5165772, 34113316, 658204, 20675436, -42107324, 37250252, +14399952, -8913668, 31984084, 3242164, 15460809, -13137768, -12670154, -1218697, 11033771, 6228240, +-28687698, 27088896, -31935230, 3301219, 11309723, -12254079, 21808770, -21736292, -9949829, -3036005, +-5463199, -11300596, -264141, 3859565, -13445395, -18973018, -3748970, -3777961, -2239826, 10638634, +8407935, 4064650, -19865834, 5487358, 29613262, 35538172, -23923504, -13721347, 33247878, 41470592, +-22544820, -15957951, 20539608, 7147900, -17076254, 16491601, -44070660, -9500468, 22645216, 37618544, +8509404, -23609436, -17351132, 5552856, 49460308, 3710852, 11376295, 999654, 20195474, -3517041, +39698384, -1546188, -29679834, 20793548, -13015362, -55158656, -17581986, 11382200, -21012590, 57985280, +39339216, 28754270, 12507482, 39686036, 24951612, 10670309, 16398722, -42877732, -61819612, -6592238, +-1301912, -13687524, 6138045, -1122597, -17550310, -17921824, -17934172, 32810866, 25134148, -19906636, +-4696010, -1276142, -7361037, -5954436, -13215614, -14643691, -24889336, -2638184, 38573100, -11212012, +-24473798, -9001715, 36061084, -16013249, -19468550, 60620244, 18943490, 11669963, -16333761, -30572650, +-24613920, -31587874, 6968048, 29300266, 72264432, -63541892, -29804388, 40105868, 50939384, 11043435, +-5286031, 69914552, 30463130, -19718732, 19480362, -6070937, -2025077, -45418744, -26156888, -14737643, +-79807472, -31077846, -15052787, 43346420, -25285546, -11390253, 28026810, -496606, -7639673, 8931921, +17315698, 48987324, 18403934, -4422206, 13099113, -2808372, -4247723, -18476412, 9032853, 7215545, +-14015552, -7292318, -51833812, -2434173, 21793200, -5351530, -21427592, 9203578, -4563940, 23145042, +5013301, -11686606, 146029, 24795384, -13967771, 3715684, 9408663, -7971996, 118648, -13921600, +28082106, -2002529, 4481262, 104153, 13765370, -6413997, -4850629, -9017821, 5924908, 10072772, +-4176319, 12028593, -4956393, 7271380, -12590160, -10613401, 16234976, 19891604, -25713970, 853088, +518617, 2080375, 8761196, -16842714, 25806310, -23003844, 20915416, 2471754, -34697432, -2297808, +28255516, -36320928, 17908940, -193274, 5483063, -8959302, -4443681, 6979859, -9351218, 36604396, +-25979720, 3967476, -5798206, -3197066, 10928007, 1034550, -2403571, -26561152, -74454328, -106802416, +34812856, 92843232, 19430432, 259243152, 213183392, 142831824, 243473648, 125044216, -11820287, -34357592, +-100785168, -228516960, -189453696, -184973504, -255336880, -190651456, -59875604, -46215460, -12696460, 80392664, +33774548, -18269180, 47793324, 83300352, 36570572, 33973728, 74265888, 39944268, 28499792, 64966212, +107842336, 38015292, 58076012, 98965176, 6721087, -5583458, 84869624, 43930536, -52042656, 32123672, +45501956, -80090936, -35751844, 52691732, -32268626, -61215096, 71354440, 27569396, -77579992, 26468272, +41736880, -110550312, -105817792, -60903172, -235776528, -305454848, -203463344, -276229760, -359028672, -262171776, +-269178496, -339558496, -278824448, -208691920, -225337072, -156797984, -43481712, 8761733, 81913080, 168436800, +219100240, 279131520, 305690528, 325236928, 256278016, 71095664, 3454764, 0, 0, 0, +0, 0, 0, }, }, { { -7415261, --2544231, 572304, -1530619, 395137, 130997, 4044786, -5265630, -2714419, -483721, -2277943, --1417339, -3992709, 1948841, -3980898, -2339684, 606127, 3228205, -4040491, 19327, 298500, --3243774, 1285269, 609349, -1534377, 301721, 1772748, 5829881, 1129576, 762357, 2332704, -973884, -288837, 1200443, -1358283, 1248225, -5062693, -1829656, 1426466, -1128503, 5373004, --2825015, -1618666, -3403762, 1119913, 1017907, -626528, 878858, -942208, -1641751, -2905009, --328565, -419296, 2385318, 3314104, 906775, 2357937, 1724966, 119722, 419296, 12348, --5108327, 1069447, -49929, -3014530, 214748, -2730526, 2490544, 2663417, -1436667, -2617783, --6153615, 1680943, 3428995, 3181497, -2975339, -286689, 4031364, 9729712, 142271, 423591, --4658966, -3685619, 2778307, 1738925, 232465, 3989488, -6000606, -2003065, 9670656, 689342, -1867237, -2518462, -3293166, 4589710, 3790846, -1563368, 3731253, 196495, 591632, -3657165, -1310502, -3323768, -2646774, -3260417, 1104880, 181999, -1096827, -319975, 1112397, 2938831, --1398012, -5208185, 70867, -3690451, -4821638, -1189169, 2144799, -662499, 1911797, 1309428, -1750736, -668404, -696858, -806917, -798327, 1726577, -77309, 3448322, -469762, 4253092, -665183, 1069447, 3907347, 1548336, 984084, 5245229, -2088965, 1860258, -1788854, -3395172, -3277060, -970126, -12348, 1467268, -624381, -2702071, -940061, 2472828, -1409286, 300648, --2909840, 1835025, -12709882, -6642704, -2950106, -2794950, 11274, 537, 968515, 146566, --694174, -5253282, -2348273, -5384279, -8358007, -7035157, 3964792, 4831302, 4941360, -1982664, --571231, -598074, -1089311, 1770063, 767725, -1826972, -3787624, 2687576, 2340220, 3367791, -898722, -1198833, -2075006, 919123, 1633161, -440234, 3470334, -1740536, -98784, 3318936, --2583960, -4150549, 321586, 5610838, 1295470, 1197759, 784905, -7516, 715649, -933619, -996432, -4533875, 716723, 4587562, -1079647, 10737, 443455, -1642825, -906775, -700617, --777926, -1298154, 2818036, -2720862, 2762201, 2325188, 5186173, -408022, 2897492, 6621229, --1270237, -5398237, -6068252, -302795, -852014, 343597, -5197984, 1583232, -3626026, 8703751, -7128572, 2822331, 3726958, -2456721, 1767916, 5973226, 3155190, 6444062, -2410551, 2509872, -3936338, -338229, 5003100, -2654827, 3189013, 403190, -2934537, -936840, -420370, -344134, --712965, 210990, -1387811, 335007, -969052, 5876052, -1217086, -486405, 156229, -2874944, --7491497, 4205847, -1642288, 1526861, -2865817, -3038689, -3075197, -2318746, 2177012, 5622112, -4750771, 1757715, -136365, -1407676, 2032593, 3989488, -720481, -1534377, 5357435, -2452963, -2681133, -2740726, -1788317, -1407676, 2150168, 1858647, -3372623, -2674691, 358093, 3679713, -5287642, 2524904, 4202089, -740345, 3980361, 1226750, 4196183, -2389076, 1935420, 8547522, -4546223, 3451006, -380641, -2834142, -5375152, 2699387, 10271414, 1360431, 3810710, 7292318, -278099, -4264903, -1650341, -1302986, 462783, -2675228, -7037304, 2894271, 450972, 165893, -3246995, -4768488, -1970316, 7591355, -1586454, -2792266, -4189204, 228707, -3922916, -613643, --1086090, -1162326, 887985, 6226092, 171799, -1769527, 2181307, -4686346, 6921877, -648003, --1021129, 8334384, -4217121, 607738, -5040144, -2290291, 998580, 521839, 2687039, 2853469, --4348655, 1781875, 2699387, 2020782, 1141924, 2695629, 2403034, 3798899, -2372433, -1247151, -7224135, -2211371, 3314641, 1109175, 2767570, 2197950, 447750, -1585917, 737124, 5179731, --1532230, 413391, -157303, 1846299, 5459441, -1372779, -3465502, -8707509, 2425046, 856309, -1328219, 1675037, -861678, -3620121, -11673184, 6289980, -4360466, -5423470, -495532, -10871099, -1739462, 4354560, -2061584, 9308268, -4036196, -9460202, 1684164, 4690105, -4345970, -6453725, -11621645, 25770, -1518271, 3959423, -3519726, -775242, 488016, -5252208, 2778844, 177167, -972273, -444529, 5017059, -634581, 2467996, 3695283, -6512244, -1964948, -4015258, 6806450, --3753802, -920734, 3732864, -711891, -4161823, 3499862, 7500087, -3330747, 3241090, -3459059, -4647692, -2102387, 2061047, 1472637, -3756486, -7559680, 3921842, 7071127, -1411434, -981400, -2667712, 5281736, 3300682, -4829154, -1547262, -4110821, -1375463, 2895882, -4527433, 2508261, -3086471, -3133716, -1098438, 2065879, -5192079, -1685238, 2685965, -1329829, 1669669, -228170, --4409321, 5577015, -6124087, -6065031, -10414759, 4418985, 11044508, 1713155, -1947231, -907849, --1817308, 9653476, -5710696, -5181341, -1184874, -5708012, -1714229, -6197638, -2642479, -4313758, --8649527, -2341831, -1837172, -186294, -863288, 2398202, 5311801, 2005213, 2690797, -7860864, -1114544, 42413, -2382633, 2969970, 1621350, -2136209, -887985, -5491116, -6177237, -689342, -7182259, -1803886, -3439195, -500364, -2161979, -4637491, 271120, -4833449, 10729365, 9223979, -2503429, -2347737, -2253247, 1324997, 1806571, 2246268, 1964948, -178778, 4158065, -3216394, -1979980, -2722473, 354872, 565325, 2462627, 2208150, 5213017, -1393180, -2757906, -1918240, --11150809, 1348083, 2687576, 44560, 4475356, 3372086, -3083250, -10333154, 1308891, 11414949, -9912785, -10684805, -10584947, 3060164, -8512625, -3852049, 721018, -128312, -3740917, 8771397, -3246459, -11306501, -1401770, 1139240, -560493, 7946227, 2336999, -5014375, 7446937, 3390340, -580894, -3789235, -4971962, 3830037, -3358128, -7504919, -1918240, -583579, -4026532, -4291746, --6892886, 7292318, 2684, 1474248, -4927401, 578210, 4360466, -3349001, -8564702, -7708393, -8094940, 2410551, 7608535, -806380, 1816234, 6463389, 11640972, 4420595, -2049773, -5702106, --3198677, -2582886, 1301912, 1175210, -5397700, -1439888, 6495601, 5528160, 9012452, 5042829, --7255811, -5796595, 7305203, 4796942, -4853850, 632434, 7461432, 1234266, -1250909, -5764920, -6127845, 5804112, -2366527, 9787157, 1843078, -4452808, 1800665, -1687385, -827318, 5362267, --8920110, 5378373, -5819681, 1043677, 4791036, -74625, -2310693, 1755568, -6080063, 245887, --4709969, -13942538, -4166655, 5914170, 3923990, 2168959, -3281892, 2872260, 1392106, 14925011, -2680597, -5004711, 5668820, 1136556, 1314260, 9957345, -2714956, -2726231, 3590056, -6912750, -8550743, 7835631, -26307, 4479114, -1468879, -4170950, -387084, -5254893, 629750, -5128728, -2243047, 73014, 1717987, 772020, -8814884, -1673427, -942745, 708133, -4314295, 2200097, -2250026, -1474784, 12164958, -4908611, -10306311, 6643778, 10700374, 2733210, 2996277, -4175782, -9250286, -2565706, 1829656, 4570382, 1496259, -3395172, 4552129, 2624225, 677531, 907849, -30595200, -8519068, 403727, -3244311, -1708860, -6935299, 96100, -17957258, 9511742, -6538014, --172872, 10179609, 5382131, -6949794, -7031399, -2845416, -5952288, 5581847, -14389214, 2648921, -6455873, 8370892, 2028835, 2469606, 729071, 1344862, -1540283, -4643934, -13035226, -1988033, -2150705, 6207839, -4385699, 6002754, 2813741, -2402497, -357556, 4689031, -4344360, -4527970, --2097018, -3423089, 59056, -11797738, -4961761, -2706366, 311385, 9599789, 2792266, 9188009, -3820910, -208306, -4895189, 919123, 1371168, 1629403, 3983045, 12912282, 2405182, -11504070, -4053912, -4283693, 758062, -4068945, -3798899, -1906429, 6157910, 3609383, -19449222, -7327751, --4518843, 4548371, 1131724, -3876208, -333934, 12375948, -1323387, 6920266, -4279935, -5509370, -4221953, -9885941, 973347, -22564148, 5786395, -7637526, 2557653, -7920457, -15976741, -2886218, --3413962, 11258183, 5324149, 3827890, 8053, 15067819, -11186779, 2484102, 4784057, 11570642, --13320304, -8169565, -2312303, 799938, -512712, -4226248, -867583, 3791919, -6983080, 1191317, -4779225, -1161252, 1003412, -6275484, -6425271, -4535486, 18842558, -133681, -4079682, 6875169, --4028143, -9569187, -7203197, -5316633, -939524, 2985539, 1069984, 356482, 10618233, 9080098, --1318555, 3059091, 2618320, -12101607, -7772280, -788127, -617938, -3372623, -7762080, 9631464, -12248710, -10101763, 6704444, 5771363, -1726577, -9696962, -15015743, -15023796, -11284490, -7060390, --13162464, 714038, -10989748, 5738613, -9239012, -7461969, -5433671, -5794448, -2027761, -13368086, -455267, 14982993, -5355288, 7990787, -3251290, 14962055, 12368432, 5378373, -15461345, -3714073, -20362440, -5064304, 15067282, 2622078, -14675903, -7122667, 17047798, 642098, -11651709, 561030, --9947681, -1044214, 3375308, 1739999, -2075006, -16754667, -15301895, 4574140, 10891500, -9367861, --966368, 4721243, -840203, 2145873, 18159658, 3863323, 2550674, 2119566, 5924908, -7509214, --5849746, -3527779, -19378356, -5859946, -7359427, -4254702, 4937065, 4189204, -1374390, -1052267, --7788923, -10594074, 14873472, -2203855, -13451838, -5048197, 2448668, 11380053, -8276939, -1050120, --8812736, 71941, -10524280, -2147, -2616172, -18020072, 1324461, -3826279, 13482976, 821413, --11831024, -8499203, 6842957, -24721832, -12948253, -8374113, -13857712, -7099044, -5811091, -13943074, -14622216, -4111894, 22184042, -11133629, -17180942, -3107946, -11628087, 19489488, -6919729, -9994926, --5000953, 5362804, 9517111, 8616778, -2349884, -2074469, -4750234, 2323041, 15573551, -223875, -1161789, -4918812, -2384244, -8121783, -3117610, 3918084, 2326799, -6658273, -104690, -9952513, -1585917, -2789045, -3536906, 4438849, 1425392, -4456029, -2448131, 9028558, 2696703, -6877317, --10113574, 16221555, -1413044, -24839944, 12428025, -2355253, -11481521, 5579700, -2372970, 1711008, --3341485, 9405978, 2436857, 1614908, 23203560, 24770150, -9600326, 3595425, -19274740, -2637647, --4896263, 9125732, -4401268, 3179350, 5443871, -2714419, 11394548, 29878476, -22391276, -7296076, --14149233, -9578314, 11425150, -13073344, 27553826, -3386582, 8440148, 1346472, 6698539, -17296908, -3131568, 4265977, -1289027, -2815888, -1549946, 4786204, -10575820, -6659884, -1586454, -3287798, --13105019, -11869679, -3242700, -5696201, 15506443, -4474282, -7640210, -5788542, 5157182, -8499203, --3675418, -14416058, 6231998, -5832029, 5424007, -5472862, 6951942, -4306242, -24451248, -12860743, -3110093, -2524367, -1954210, -8193187, -14849313, -1561221, 5735929, 3455301, -3881577, 3879429, -6687801, 21902186, -10522670, 9832791, -26472568, 568009, 2888903, -4190278, -8335995, 3958349, --92342, -186831, 4597763, 16591459, 11004780, 7542500, -6318971, -7890929, 7300371, -13416404, -700617, 5854041, -9103183, 11152419, 36368172, 24252070, -5849209, -16602196, -9750113, 20675972, --24680492, 515396, -5562520, -7126962, 11403675, -19606526, 3447248, -10434086, 717260, -13884556, --9109089, 700617, 1657321, -289910, -11624866, 19291382, 5067525, -9795747, 4650376, -3453154, -2783139, 29177860, 10497437, -9152038, -6322192, 674847, 10351408, 1734093, -21341692, -6285685, --14410689, -5937256, -6158446, 6810208, -3069828, -2882997, 974958, -1522029, -9847286, -13503377, -9466108, -5574331, 3423089, -1336809, 12346420, -9793599, -5268851, 2108829, 5890548, -12721156, -14639396, -9113384, -18257370, -18931678, -5211406, -5944235, -6571837, -4794794, -26410290, 9092446, --11786464, -4886599, -9572945, 14692546, 6464463, 6663105, 1483911, -3105261, -12019466, -5328981, --34716756, -4629975, 23584202, -28909962, -11126113, -1023813, -8509941, 10020159, -5716602, 31960462, --3028489, -7409893, -5145371, -1828046, 9661529, -6840809, -6060736, 25943214, -19164144, -2803540, -6289443, -4744328, 16636556, 8817031, -1036161, -2581275, 7101729, 8848170, 10282689, 7817914, -17513266, 4992900, 7545184, 3951370, -5654325, 28600724, 3666292, 4815732, 7348152, 3684008, -21028160, -2199560, 5114769, 6550362, 5976447, 2696166, 13763223, -9021042, -6831146, 13034689, --2767570, -14841259, -3849901, -25350508, -8613557, -5642514, 22810572, -22914188, -3213709, -116501, --1175210, -2406792, 13184476, 36151276, -7033546, 3325379, 3736085, 4143570, 17283486, -21090436, --20385526, -20144470, 31420906, -328028, -12040941, 25333864, -9906342, 19982872, 2648384, -21640730, --60681444, 11574937, -13982266, -24483462, 27406724, -16666621, -7410966, -24107652, 6879464, -5335423, --22042310, -8099772, -12745852, 5721970, -11732240, -42950, 5750961, 9632538, 6097780, 16772384, -3623342, -756988, -914291, -15284178, -10347113, -11055246, 9368934, 12406550, 6993281, 4025995, -582505, 4434017, 11183558, 23211078, -10272488, -6845104, 5192079, -11381663, 12494060, 1927367, --9346386, 23664732, 9940702, -20929912, 9185324, -20146618, 3490735, 3218004, 11535745, -6094022, --5366562, 30277908, 13276281, -13747653, 9416179, 15787226, -11180874, -27346056, 16452946, -2657511, -1345935, 1700270, 8324184, 41140956, -1920924, 4653597, 10153303, -761283, 12030203, 4827543, --19279034, 3616363, -8520678, -18818400, -22079890, 47099148, 9820443, -2866891, -5877126, 10735808, -42164232, 19591494, 4824322, -1100585, 13953812, 35525284, 8536784, 12310987, 10755672, 25336012, --16575889, 16428787, 6956237, -48410724, 14033269, -6804302, 14032195, -15057082, 11047193, 7594576, -14690399, -107911, 6005438, 2359011, -14153528, 6844031, 13226889, -11472395, 6427419, -11155104, --7128035, 34696356, 3091840, 30699352, -22374632, 9496173, -1616518, -4506495, -1202054, -2792803, -4249334, 11144366, 7271917, -1008780, 17010754, -28196998, -27012660, 18976240, -15652471, -4085051, --4158602, -18358300, 8474507, -5036386, 4470524, 2522757, 29073708, 14141717, 14960445, 5528697, -3453691, -27513560, -7013682, 12821014, -1035087, -295816, -760209, -9568113, -24014772, 11507291, --41874856, 35594004, -14653892, 6460705, 24101746, -34725884, -281320, -3476239, 8877161, 12192875, -15350750, 24887724, 4861903, -16966732, 9580998, 26508538, -37975564, -23263690, 26371100, 702227, -296353, 579284, 2695092, -1358283, -199716, 12538620, 8559333, -19192598, 1611150, -5922760, -32583770, 18709952, -6166500, 1183800, 4262218, 3218004, 170725, 10884521, 1544578, 8153459, -33188286, 3681324, 3811247, -5838471, 8775155, -32118840, -13179107, -14048838, -1058710, 2350421, --27208618, 9831180, -24104968, 7209640, 25703232, -6653441, -22444962, -13392782, 9847286, -5667210, --46160696, 11495480, -32013076, -8394514, -3424163, -279173, -12269648, 1910724, 17440252, -14942191, --29496762, -47967268, 38487200, 9437117, -1792075, 8078834, 50638740, -54569708, 21360482, 29607358, --36139464, -9531606, -19988240, -9099962, 50324132, -21893058, 35391068, -15852187, -6049462, -7976291, -10857140, 5794985, -45622752, -7169911, -12877386, 20443508, -81604, 9301289, 14425721, -20499878, --5073967, -12643310, 6774774, 19389630, 10281078, -26832272, -5873368, 6861747, 2801393, -513249, --14171781, -4213900, -26265336, -3375844, -4440996, 24602646, -21599928, 52223580, 10318659, -13583908, -21578452, 2113661, 28293098, 17258790, 26803818, 8134668, 24404542, 21982180, 23847806, 27451284, -3051038, 26599806, -33287608, -4268124, 5840082, -20033338, -4683662, 14671608, -26124138, -35569308, -13708462, 24973624, -361314, 6481106, -26921928, -6159520, -22790708, -419833, 23259932, 1824287, -44633300, 19233400, -12421582, 33441690, -70490616, 64120640, -13011603, -23814520, -17310328, 43887588, --32727114, -7393786, -7938174, -2175401, 26569742, -29068876, -417149, 9101036, -6130529, -5335960, -2768107, -17162152, 24082956, -375810, -33656976, -10648298, -6486475, 613107, -37029596, -1926830, -6932077, -9381819, 2629594, 9142912, 26557930, -11613055, -3743601, 3593814, -13799193, -52099028, -6844031, 38511900, -17935246, -32688996, 4717485, 30745524, -12460237, -11274826, -39195336, -8443369, -3629247, 28210418, 16709033, 2111513, -28665148, -19807852, 27896350, -31614718, 13662291, 47527572, -31159988, 36387500, -15107011, 20351702, 17719424, -44947908, -12098386, -25204478, -1803349, 22936736, -2888366, 24815784, 26516592, -45336600, 52168284, -32009318, 5029944, -1331440, -15858630, 41517300, -5531381, -25339770, 44077100, 29745870, 5428839, -9146670, -21507048, 12263205, -829466, -2867428, --483184, -1593970, 1046898, -9417790, 11833172, -1044214, -37555732, 8856223, 4436701, -14128295, -1503775, 15856482, -4606353, 337692, -26840862, 19522774, -8880919, -3757023, -1762547, 10809896, --14036490, -1283122, 4511863, -250719, 4285841, -7856032, 21748104, -11490111, 37507412, -23037668, --22706418, 21853330, -24033564, 714575, 20005958, -17994840, -6533719, 9464497, 12975096, 14975477, --54176716, 17181480, 825171, -13139379, 36586680, -18057116, 3618510, -163746, -28350006, 38013680, --217970, -1873143, -18423800, -3738232, 33414846, -7350837, 797253, 1427540, 11297911, 5634460, --36529232, 19917374, 37652904, -17117592, 17510582, -25291988, 50496468, 5413270, -33929704, -24130736, --80461920, -121709176, 7871065, 105049528, 1190780, 274979360, 248930400, 148951616, 287339232, 188441152, --32073206, 10234907, -37939056, -227597296, -129892160, -100756712, -222752032, -183257664, -55137716, -108183784, --124351648, -11412802, 5605469, -53501332, 9527311, 45276472, -62039192, -52889836, 78230680, 14404783, --21863532, 53906136, 72769632, -2510409, 74513384, 128199944, 43918724, 33065342, 130185824, 87116968, -7488276, 94655176, 140815328, 59967408, 69956968, 160880880, 58329412, 18434536, 152754800, 150445184, -43019468, 181774288, 259935184, 93846112, 103291280, 179526416, 50458348, -65550864, 4243965, -67559832, --229549888, -218926288, -234149264, -371325152, -401654080, -428382176, -506228480, -528294400, -517024416, -501871232, --443181568, -395437632, -323578528, -207575232, -141330192, -7804493, 207479136, 179362672, 35194572, 0, -0, 0, 0, }, +-2544231, 572304, -1530619, 395137, 130997, 4044786, -5265630, -2714419, -483721, -2277943, +-1417339, -3992709, 1948841, -3980898, -2339684, 606127, 3228205, -4040491, 19327, 298500, +-3243774, 1285269, 609349, -1534377, 301721, 1772748, 5829881, 1129576, 762357, 2332704, +973884, -288837, 1200443, -1358283, 1248225, -5062693, -1829656, 1426466, -1128503, 5373004, +-2825015, -1618666, -3403762, 1119913, 1017907, -626528, 878858, -942208, -1641751, -2905009, +-328565, -419296, 2385318, 3314104, 906775, 2357937, 1724966, 119722, 419296, 12348, +-5108327, 1069447, -49929, -3014530, 214748, -2730526, 2490544, 2663417, -1436667, -2617783, +-6153615, 1680943, 3428995, 3181497, -2975339, -286689, 4031364, 9729712, 142271, 423591, +-4658966, -3685619, 2778307, 1738925, 232465, 3989488, -6000606, -2003065, 9670656, 689342, +1867237, -2518462, -3293166, 4589710, 3790846, -1563368, 3731253, 196495, 591632, -3657165, +1310502, -3323768, -2646774, -3260417, 1104880, 181999, -1096827, -319975, 1112397, 2938831, +-1398012, -5208185, 70867, -3690451, -4821638, -1189169, 2144799, -662499, 1911797, 1309428, +1750736, -668404, -696858, -806917, -798327, 1726577, -77309, 3448322, -469762, 4253092, +665183, 1069447, 3907347, 1548336, 984084, 5245229, -2088965, 1860258, -1788854, -3395172, +3277060, -970126, -12348, 1467268, -624381, -2702071, -940061, 2472828, -1409286, 300648, +-2909840, 1835025, -12709882, -6642704, -2950106, -2794950, 11274, 537, 968515, 146566, +-694174, -5253282, -2348273, -5384279, -8358007, -7035157, 3964792, 4831302, 4941360, -1982664, +-571231, -598074, -1089311, 1770063, 767725, -1826972, -3787624, 2687576, 2340220, 3367791, +898722, -1198833, -2075006, 919123, 1633161, -440234, 3470334, -1740536, -98784, 3318936, +-2583960, -4150549, 321586, 5610838, 1295470, 1197759, 784905, -7516, 715649, -933619, +996432, -4533875, 716723, 4587562, -1079647, 10737, 443455, -1642825, -906775, -700617, +-777926, -1298154, 2818036, -2720862, 2762201, 2325188, 5186173, -408022, 2897492, 6621229, +-1270237, -5398237, -6068252, -302795, -852014, 343597, -5197984, 1583232, -3626026, 8703751, +7128572, 2822331, 3726958, -2456721, 1767916, 5973226, 3155190, 6444062, -2410551, 2509872, +3936338, -338229, 5003100, -2654827, 3189013, 403190, -2934537, -936840, -420370, -344134, +-712965, 210990, -1387811, 335007, -969052, 5876052, -1217086, -486405, 156229, -2874944, +-7491497, 4205847, -1642288, 1526861, -2865817, -3038689, -3075197, -2318746, 2177012, 5622112, +4750771, 1757715, -136365, -1407676, 2032593, 3989488, -720481, -1534377, 5357435, -2452963, +2681133, -2740726, -1788317, -1407676, 2150168, 1858647, -3372623, -2674691, 358093, 3679713, +5287642, 2524904, 4202089, -740345, 3980361, 1226750, 4196183, -2389076, 1935420, 8547522, +4546223, 3451006, -380641, -2834142, -5375152, 2699387, 10271414, 1360431, 3810710, 7292318, +278099, -4264903, -1650341, -1302986, 462783, -2675228, -7037304, 2894271, 450972, 165893, +3246995, -4768488, -1970316, 7591355, -1586454, -2792266, -4189204, 228707, -3922916, -613643, +-1086090, -1162326, 887985, 6226092, 171799, -1769527, 2181307, -4686346, 6921877, -648003, +-1021129, 8334384, -4217121, 607738, -5040144, -2290291, 998580, 521839, 2687039, 2853469, +-4348655, 1781875, 2699387, 2020782, 1141924, 2695629, 2403034, 3798899, -2372433, -1247151, +7224135, -2211371, 3314641, 1109175, 2767570, 2197950, 447750, -1585917, 737124, 5179731, +-1532230, 413391, -157303, 1846299, 5459441, -1372779, -3465502, -8707509, 2425046, 856309, +1328219, 1675037, -861678, -3620121, -11673184, 6289980, -4360466, -5423470, -495532, -10871099, +1739462, 4354560, -2061584, 9308268, -4036196, -9460202, 1684164, 4690105, -4345970, -6453725, +11621645, 25770, -1518271, 3959423, -3519726, -775242, 488016, -5252208, 2778844, 177167, +972273, -444529, 5017059, -634581, 2467996, 3695283, -6512244, -1964948, -4015258, 6806450, +-3753802, -920734, 3732864, -711891, -4161823, 3499862, 7500087, -3330747, 3241090, -3459059, +4647692, -2102387, 2061047, 1472637, -3756486, -7559680, 3921842, 7071127, -1411434, -981400, +2667712, 5281736, 3300682, -4829154, -1547262, -4110821, -1375463, 2895882, -4527433, 2508261, +3086471, -3133716, -1098438, 2065879, -5192079, -1685238, 2685965, -1329829, 1669669, -228170, +-4409321, 5577015, -6124087, -6065031, -10414759, 4418985, 11044508, 1713155, -1947231, -907849, +-1817308, 9653476, -5710696, -5181341, -1184874, -5708012, -1714229, -6197638, -2642479, -4313758, +-8649527, -2341831, -1837172, -186294, -863288, 2398202, 5311801, 2005213, 2690797, -7860864, +1114544, 42413, -2382633, 2969970, 1621350, -2136209, -887985, -5491116, -6177237, -689342, +7182259, -1803886, -3439195, -500364, -2161979, -4637491, 271120, -4833449, 10729365, 9223979, +2503429, -2347737, -2253247, 1324997, 1806571, 2246268, 1964948, -178778, 4158065, -3216394, +1979980, -2722473, 354872, 565325, 2462627, 2208150, 5213017, -1393180, -2757906, -1918240, +-11150809, 1348083, 2687576, 44560, 4475356, 3372086, -3083250, -10333154, 1308891, 11414949, +9912785, -10684805, -10584947, 3060164, -8512625, -3852049, 721018, -128312, -3740917, 8771397, +3246459, -11306501, -1401770, 1139240, -560493, 7946227, 2336999, -5014375, 7446937, 3390340, +580894, -3789235, -4971962, 3830037, -3358128, -7504919, -1918240, -583579, -4026532, -4291746, +-6892886, 7292318, 2684, 1474248, -4927401, 578210, 4360466, -3349001, -8564702, -7708393, +8094940, 2410551, 7608535, -806380, 1816234, 6463389, 11640972, 4420595, -2049773, -5702106, +-3198677, -2582886, 1301912, 1175210, -5397700, -1439888, 6495601, 5528160, 9012452, 5042829, +-7255811, -5796595, 7305203, 4796942, -4853850, 632434, 7461432, 1234266, -1250909, -5764920, +6127845, 5804112, -2366527, 9787157, 1843078, -4452808, 1800665, -1687385, -827318, 5362267, +-8920110, 5378373, -5819681, 1043677, 4791036, -74625, -2310693, 1755568, -6080063, 245887, +-4709969, -13942538, -4166655, 5914170, 3923990, 2168959, -3281892, 2872260, 1392106, 14925011, +2680597, -5004711, 5668820, 1136556, 1314260, 9957345, -2714956, -2726231, 3590056, -6912750, +8550743, 7835631, -26307, 4479114, -1468879, -4170950, -387084, -5254893, 629750, -5128728, +2243047, 73014, 1717987, 772020, -8814884, -1673427, -942745, 708133, -4314295, 2200097, +2250026, -1474784, 12164958, -4908611, -10306311, 6643778, 10700374, 2733210, 2996277, -4175782, +9250286, -2565706, 1829656, 4570382, 1496259, -3395172, 4552129, 2624225, 677531, 907849, +30595200, -8519068, 403727, -3244311, -1708860, -6935299, 96100, -17957258, 9511742, -6538014, +-172872, 10179609, 5382131, -6949794, -7031399, -2845416, -5952288, 5581847, -14389214, 2648921, +6455873, 8370892, 2028835, 2469606, 729071, 1344862, -1540283, -4643934, -13035226, -1988033, +2150705, 6207839, -4385699, 6002754, 2813741, -2402497, -357556, 4689031, -4344360, -4527970, +-2097018, -3423089, 59056, -11797738, -4961761, -2706366, 311385, 9599789, 2792266, 9188009, +3820910, -208306, -4895189, 919123, 1371168, 1629403, 3983045, 12912282, 2405182, -11504070, +4053912, -4283693, 758062, -4068945, -3798899, -1906429, 6157910, 3609383, -19449222, -7327751, +-4518843, 4548371, 1131724, -3876208, -333934, 12375948, -1323387, 6920266, -4279935, -5509370, +4221953, -9885941, 973347, -22564148, 5786395, -7637526, 2557653, -7920457, -15976741, -2886218, +-3413962, 11258183, 5324149, 3827890, 8053, 15067819, -11186779, 2484102, 4784057, 11570642, +-13320304, -8169565, -2312303, 799938, -512712, -4226248, -867583, 3791919, -6983080, 1191317, +4779225, -1161252, 1003412, -6275484, -6425271, -4535486, 18842558, -133681, -4079682, 6875169, +-4028143, -9569187, -7203197, -5316633, -939524, 2985539, 1069984, 356482, 10618233, 9080098, +-1318555, 3059091, 2618320, -12101607, -7772280, -788127, -617938, -3372623, -7762080, 9631464, +12248710, -10101763, 6704444, 5771363, -1726577, -9696962, -15015743, -15023796, -11284490, -7060390, +-13162464, 714038, -10989748, 5738613, -9239012, -7461969, -5433671, -5794448, -2027761, -13368086, +455267, 14982993, -5355288, 7990787, -3251290, 14962055, 12368432, 5378373, -15461345, -3714073, +20362440, -5064304, 15067282, 2622078, -14675903, -7122667, 17047798, 642098, -11651709, 561030, +-9947681, -1044214, 3375308, 1739999, -2075006, -16754667, -15301895, 4574140, 10891500, -9367861, +-966368, 4721243, -840203, 2145873, 18159658, 3863323, 2550674, 2119566, 5924908, -7509214, +-5849746, -3527779, -19378356, -5859946, -7359427, -4254702, 4937065, 4189204, -1374390, -1052267, +-7788923, -10594074, 14873472, -2203855, -13451838, -5048197, 2448668, 11380053, -8276939, -1050120, +-8812736, 71941, -10524280, -2147, -2616172, -18020072, 1324461, -3826279, 13482976, 821413, +-11831024, -8499203, 6842957, -24721832, -12948253, -8374113, -13857712, -7099044, -5811091, -13943074, +14622216, -4111894, 22184042, -11133629, -17180942, -3107946, -11628087, 19489488, -6919729, -9994926, +-5000953, 5362804, 9517111, 8616778, -2349884, -2074469, -4750234, 2323041, 15573551, -223875, +1161789, -4918812, -2384244, -8121783, -3117610, 3918084, 2326799, -6658273, -104690, -9952513, +1585917, -2789045, -3536906, 4438849, 1425392, -4456029, -2448131, 9028558, 2696703, -6877317, +-10113574, 16221555, -1413044, -24839944, 12428025, -2355253, -11481521, 5579700, -2372970, 1711008, +-3341485, 9405978, 2436857, 1614908, 23203560, 24770150, -9600326, 3595425, -19274740, -2637647, +-4896263, 9125732, -4401268, 3179350, 5443871, -2714419, 11394548, 29878476, -22391276, -7296076, +-14149233, -9578314, 11425150, -13073344, 27553826, -3386582, 8440148, 1346472, 6698539, -17296908, +3131568, 4265977, -1289027, -2815888, -1549946, 4786204, -10575820, -6659884, -1586454, -3287798, +-13105019, -11869679, -3242700, -5696201, 15506443, -4474282, -7640210, -5788542, 5157182, -8499203, +-3675418, -14416058, 6231998, -5832029, 5424007, -5472862, 6951942, -4306242, -24451248, -12860743, +3110093, -2524367, -1954210, -8193187, -14849313, -1561221, 5735929, 3455301, -3881577, 3879429, +6687801, 21902186, -10522670, 9832791, -26472568, 568009, 2888903, -4190278, -8335995, 3958349, +-92342, -186831, 4597763, 16591459, 11004780, 7542500, -6318971, -7890929, 7300371, -13416404, +700617, 5854041, -9103183, 11152419, 36368172, 24252070, -5849209, -16602196, -9750113, 20675972, +-24680492, 515396, -5562520, -7126962, 11403675, -19606526, 3447248, -10434086, 717260, -13884556, +-9109089, 700617, 1657321, -289910, -11624866, 19291382, 5067525, -9795747, 4650376, -3453154, +2783139, 29177860, 10497437, -9152038, -6322192, 674847, 10351408, 1734093, -21341692, -6285685, +-14410689, -5937256, -6158446, 6810208, -3069828, -2882997, 974958, -1522029, -9847286, -13503377, +9466108, -5574331, 3423089, -1336809, 12346420, -9793599, -5268851, 2108829, 5890548, -12721156, +14639396, -9113384, -18257370, -18931678, -5211406, -5944235, -6571837, -4794794, -26410290, 9092446, +-11786464, -4886599, -9572945, 14692546, 6464463, 6663105, 1483911, -3105261, -12019466, -5328981, +-34716756, -4629975, 23584202, -28909962, -11126113, -1023813, -8509941, 10020159, -5716602, 31960462, +-3028489, -7409893, -5145371, -1828046, 9661529, -6840809, -6060736, 25943214, -19164144, -2803540, +6289443, -4744328, 16636556, 8817031, -1036161, -2581275, 7101729, 8848170, 10282689, 7817914, +17513266, 4992900, 7545184, 3951370, -5654325, 28600724, 3666292, 4815732, 7348152, 3684008, +21028160, -2199560, 5114769, 6550362, 5976447, 2696166, 13763223, -9021042, -6831146, 13034689, +-2767570, -14841259, -3849901, -25350508, -8613557, -5642514, 22810572, -22914188, -3213709, -116501, +-1175210, -2406792, 13184476, 36151276, -7033546, 3325379, 3736085, 4143570, 17283486, -21090436, +-20385526, -20144470, 31420906, -328028, -12040941, 25333864, -9906342, 19982872, 2648384, -21640730, +-60681444, 11574937, -13982266, -24483462, 27406724, -16666621, -7410966, -24107652, 6879464, -5335423, +-22042310, -8099772, -12745852, 5721970, -11732240, -42950, 5750961, 9632538, 6097780, 16772384, +3623342, -756988, -914291, -15284178, -10347113, -11055246, 9368934, 12406550, 6993281, 4025995, +582505, 4434017, 11183558, 23211078, -10272488, -6845104, 5192079, -11381663, 12494060, 1927367, +-9346386, 23664732, 9940702, -20929912, 9185324, -20146618, 3490735, 3218004, 11535745, -6094022, +-5366562, 30277908, 13276281, -13747653, 9416179, 15787226, -11180874, -27346056, 16452946, -2657511, +1345935, 1700270, 8324184, 41140956, -1920924, 4653597, 10153303, -761283, 12030203, 4827543, +-19279034, 3616363, -8520678, -18818400, -22079890, 47099148, 9820443, -2866891, -5877126, 10735808, +42164232, 19591494, 4824322, -1100585, 13953812, 35525284, 8536784, 12310987, 10755672, 25336012, +-16575889, 16428787, 6956237, -48410724, 14033269, -6804302, 14032195, -15057082, 11047193, 7594576, +14690399, -107911, 6005438, 2359011, -14153528, 6844031, 13226889, -11472395, 6427419, -11155104, +-7128035, 34696356, 3091840, 30699352, -22374632, 9496173, -1616518, -4506495, -1202054, -2792803, +4249334, 11144366, 7271917, -1008780, 17010754, -28196998, -27012660, 18976240, -15652471, -4085051, +-4158602, -18358300, 8474507, -5036386, 4470524, 2522757, 29073708, 14141717, 14960445, 5528697, +3453691, -27513560, -7013682, 12821014, -1035087, -295816, -760209, -9568113, -24014772, 11507291, +-41874856, 35594004, -14653892, 6460705, 24101746, -34725884, -281320, -3476239, 8877161, 12192875, +15350750, 24887724, 4861903, -16966732, 9580998, 26508538, -37975564, -23263690, 26371100, 702227, +296353, 579284, 2695092, -1358283, -199716, 12538620, 8559333, -19192598, 1611150, -5922760, +32583770, 18709952, -6166500, 1183800, 4262218, 3218004, 170725, 10884521, 1544578, 8153459, +33188286, 3681324, 3811247, -5838471, 8775155, -32118840, -13179107, -14048838, -1058710, 2350421, +-27208618, 9831180, -24104968, 7209640, 25703232, -6653441, -22444962, -13392782, 9847286, -5667210, +-46160696, 11495480, -32013076, -8394514, -3424163, -279173, -12269648, 1910724, 17440252, -14942191, +-29496762, -47967268, 38487200, 9437117, -1792075, 8078834, 50638740, -54569708, 21360482, 29607358, +-36139464, -9531606, -19988240, -9099962, 50324132, -21893058, 35391068, -15852187, -6049462, -7976291, +10857140, 5794985, -45622752, -7169911, -12877386, 20443508, -81604, 9301289, 14425721, -20499878, +-5073967, -12643310, 6774774, 19389630, 10281078, -26832272, -5873368, 6861747, 2801393, -513249, +-14171781, -4213900, -26265336, -3375844, -4440996, 24602646, -21599928, 52223580, 10318659, -13583908, +21578452, 2113661, 28293098, 17258790, 26803818, 8134668, 24404542, 21982180, 23847806, 27451284, +3051038, 26599806, -33287608, -4268124, 5840082, -20033338, -4683662, 14671608, -26124138, -35569308, +13708462, 24973624, -361314, 6481106, -26921928, -6159520, -22790708, -419833, 23259932, 1824287, +44633300, 19233400, -12421582, 33441690, -70490616, 64120640, -13011603, -23814520, -17310328, 43887588, +-32727114, -7393786, -7938174, -2175401, 26569742, -29068876, -417149, 9101036, -6130529, -5335960, +2768107, -17162152, 24082956, -375810, -33656976, -10648298, -6486475, 613107, -37029596, -1926830, +6932077, -9381819, 2629594, 9142912, 26557930, -11613055, -3743601, 3593814, -13799193, -52099028, +6844031, 38511900, -17935246, -32688996, 4717485, 30745524, -12460237, -11274826, -39195336, -8443369, +3629247, 28210418, 16709033, 2111513, -28665148, -19807852, 27896350, -31614718, 13662291, 47527572, +31159988, 36387500, -15107011, 20351702, 17719424, -44947908, -12098386, -25204478, -1803349, 22936736, +2888366, 24815784, 26516592, -45336600, 52168284, -32009318, 5029944, -1331440, -15858630, 41517300, +5531381, -25339770, 44077100, 29745870, 5428839, -9146670, -21507048, 12263205, -829466, -2867428, +-483184, -1593970, 1046898, -9417790, 11833172, -1044214, -37555732, 8856223, 4436701, -14128295, +1503775, 15856482, -4606353, 337692, -26840862, 19522774, -8880919, -3757023, -1762547, 10809896, +-14036490, -1283122, 4511863, -250719, 4285841, -7856032, 21748104, -11490111, 37507412, -23037668, +-22706418, 21853330, -24033564, 714575, 20005958, -17994840, -6533719, 9464497, 12975096, 14975477, +-54176716, 17181480, 825171, -13139379, 36586680, -18057116, 3618510, -163746, -28350006, 38013680, +-217970, -1873143, -18423800, -3738232, 33414846, -7350837, 797253, 1427540, 11297911, 5634460, +-36529232, 19917374, 37652904, -17117592, 17510582, -25291988, 50496468, 5413270, -33929704, -24130736, +-80461920, -121709176, 7871065, 105049528, 1190780, 274979360, 248930400, 148951616, 287339232, 188441152, +-32073206, 10234907, -37939056, -227597296, -129892160, -100756712, -222752032, -183257664, -55137716, -108183784, +-124351648, -11412802, 5605469, -53501332, 9527311, 45276472, -62039192, -52889836, 78230680, 14404783, +-21863532, 53906136, 72769632, -2510409, 74513384, 128199944, 43918724, 33065342, 130185824, 87116968, +7488276, 94655176, 140815328, 59967408, 69956968, 160880880, 58329412, 18434536, 152754800, 150445184, +43019468, 181774288, 259935184, 93846112, 103291280, 179526416, 50458348, -65550864, 4243965, -67559832, +-229549888, -218926288, -234149264, -371325152, -401654080, -428382176, -506228480, -528294400, -517024416, -501871232, +-443181568, -395437632, -323578528, -207575232, -141330192, -7804493, 207479136, 179362672, 35194572, 0, +0, 0, 0, }, { -7441568, --3151432, 441845, -2930778, -376883, 3689377, -4294431, 1852205, -1865626, -1881196, -3999152, --1311039, 6078453, -4331475, 3453691, 1873143, -3306588, -148176, -4864588, 1398012, -404264, -2983929, -8735963, -3820910, -1162326, 1890323, -725850, -3172370, -10201, -863825, -3992709, -3882114, -7516, 1139240, 4190278, 224412, -1038845, -682363, -801548, 386547, -1806034, --2829847, -2325725, -2204392, -1247151, -1381906, 5653788, 3712462, 1368484, 1187559, 1036698, --1246077, -381178, -1191317, 5369783, -718333, 1422708, -3681861, 1379221, -339302, 2182917, -1082869, 758062, -1595044, 268972, -986232, 4189204, 20401, 476741, 1946694, 1056025, --2605972, 1250372, 544387, -1300301, -175557, 61203, 3103651, 9375377, 2301566, 1213865, --2005750, -963146, -4553202, -378494, -1047435, 3354906, 3287798, -3340948, -2121177, -2093797, --1660542, -2437394, 393526, 2622078, -2090575, -2595771, -7725036, -5989332, -4116726, -399432, -559956, 5565741, -3045132, 2652679, 1900523, 1258962, 475668, -4524211, 1230508, -9406515, -1243393, 61203, 553514, -857920, -5549635, -2815351, -4771172, 62814, 424665, -3197066, --7479149, 4965519, -264677, -4694400, 76773, 2697240, 737124, -1800128, 1165547, -2805151, --1007707, -2670933, 1913408, -2833068, 3645354, 2588255, -512175, -5367636, 316754, 373125, --406948, -2188823, 1309965, 550293, -1137630, 2371359, 2971044, 1684701, 166967, -354872, -881005, -3081639, -10150081, -11382737, -815507, -4498442, 3469797, -5577552, 1392106, 2581275, --3815005, 3110093, 11382737, 637803, -1061394, 6242198, 832687, 6265284, 82141, 2854543, --4499515, -5953362, -337692, 2243047, -4149475, -1345399, -436476, -1184337, 1114544, -1235877, --2200634, 2040646, -1046361, -893890, 4459250, 6352257, -2007897, -3467649, 1254667, 5069135, -1923072, 6503118, 259309, -970663, -181999, 5786932, 362925, -4242891, -2306398, 4517232, -3319473, 3490735, 965831, -2363843, -4722854, 835908, 2224793, 2648384, -1009317, -2596845, -5119064, 3289945, -824097, -3014530, 204011, -2169495, 5366562, 1421634, 1039382, 1452773, -681826, 808528, 3388729, 214212, 3454764, -1107028, 5493800, -32749, -4663798, 6007049, -4163971, 6323803, 6525129, -1543504, 3255048, -1377074, -3742527, -318901, 9677635, 4276714, -2138357, 3481608, -4076461, 6947647, 2937758, 4664335, -1398012, -7653632, 3198140, -11957726, -2400350, -3032784, 2377265, 1917703, -259309, -4096325, 960462, 2722473, -1640678, 2555506, -6038724, -404264, -5078262, -6835441, 1030255, 3102577, -6365679, 3549254, -5987722, -3841312, -4264366, -2471217, -5074504, -2411087, -3598646, 5586142, 7559680, 4353486, -2803540, 73014, -4002373, 2472291, -416075, -3071975, -1554778, -2689723, 2820183, 9466645, -160524, -5065377, --4125316, 2231236, 672162, -1869921, -5677410, -58519, -4880157, -1834488, 651761, -779537, -3698504, 743029, 4691178, 5570573, -4841502, -1762010, 13325673, -3549254, 1248225, 1948841, --8884140, -7483981, 128312, 8770860, 6597070, 10591389, 3406446, -2964601, -4632659, 792421, --2702608, 2091112, 911070, 3573950, 6459094, 2089502, 4727686, -142808, 2749853, -2923799, --6242735, -3220689, -4816269, 42950, -1450625, 1401770, -7602629, -3748970, -1158567, 2721936, --3853660, 7680476, -8879845, 1823751, -5669894, -4489852, 2325188, 2165737, 7231115, -881542, -1653026, -2183991, 4972499, 5451924, 1273458, -1252520, -5881958, -843961, 1637993, -4365835, -3989488, -4800163, 1686848, 7751342, 6183679, 28454, -2930242, 1160178, 7374996, -1035624, -1429687, 1166621, 5834176, 31139, -2342368, -3973919, 2034741, -5940477, 1246614, 12558484, -1803886, 6146098, -1505923, -5070746, -8145406, 4016331, -5749351, -6321118, 1465121, -3157875, --19420232, 1718524, 3238405, 17782776, 6028524, 1152662, -7944079, 7311108, 3459059, -3431142, -4140885, -849330, 6747931, -4105989, -1799591, -1488743, -1509681, -2864206, -945967, 4483946, -4286914, 6867653, 2741263, 3296924, 163746, -4708895, -4702453, 6511708, -3401077, 1347009, --357019, -4818954, 6988449, -1245004, -2674691, 1063541, 5158256, -3370476, 7705708, -9542880, --7563438, -9667971, 2577517, -5473399, -7941395, -1952600, 7928510, -3300682, 2566780, 4511327, --3025805, -4343823, 625992, 709743, 2849711, 498216, -2095407, -214748, 10191421, 4292283, --3691525, -12279848, -9561134, 3859028, 12186970, 10210211, -7163469, 669478, -4236985, 2711735, --3429532, 5726265, -9710384, -1726577, -12060805, -3621194, 1836635, 4146254, -11013370, -2840047, -7579544, -1014149, -11048266, 5615133, -3547106, -6445672, 3440269, 5662915, 1276142, 1066763, -1949378, 7416872, -3659849, -3320010, 1903207, -3940633, -2007360, -97711, -534723, 40802, -5949604, 2891050, -846645, -770410, 3391414, 1236414, 4183298, -647466, 4726075, 4926328, -1861332, -5986648, 584652, -1112933, -4305705, 5143224, -3389266, 1943473, -4069482, -1750199, --13873281, 850404, 10616622, 562104, 11275363, -2586107, -3068217, -12481712, 13627931, 6169184, -7507066, 808528, 6001143, -614717, -708133, 4924717, -3951370, 1372779, -856846, -14155675, -2132988, -3904125, 2428804, -2878702, 1814087, 11451457, 1825898, -15932718, -117038, 11295764, --2160906, 6532109, -7052873, -5523328, -13017509, 7290170, 4391604, 8529268, 4576825, -4758287, -7923678, -2263448, 7604240, -5089536, -3943854, 186831, -1172526, 5865315, 1741609, 4895189, -6305012, -3858491, -2552284, -2415382, 4311074, -1132261, -2039573, 464393, -4823785, 2400887, -2331094, -3102040, 4372814, 6546067, -2277407, -3428458, -354872, -5493800, -2041720, 7586523, -1554241, -5185100, 10077067, -10839424, 2159832, 5361193, -1921461, -3755412, -277562, 4225711, --7543573, 3757560, -2758980, -7182796, -4665945, -4445828, 671089, -2242510, -3879429, 1629940, -12439299, 6295349, -1075889, -4378719, -10963978, 912681, 6969658, -4097936, -12141336, -73014, --1370632, 65498, 2291365, 4653597, 5291937, -2390149, 1445257, 7538742, 635118, 8858907, -9852118, 21573084, 14925011, 8981313, -2139968, -11540040, -3832185, 10453950, 4722317, -11129334, -8454106, -1970853, -5307506, -6808060, 1210644, 18711026, -12486007, 13538274, 5498095, -2909840, -4668093, -3640522, 9918690, -3688303, 5353140, 1065689, -6483790, -4650376, -6303938, 326954, -5798206, -1510218, -3432216, 3679713, 730681, -993211, -12391518, 3979287, -6813966, -5205501, -3783866, 8537321, -5871757, -8670465, 616328, 7774965, 927176, -4799089, -1577864, -2718714, -3750043, 2835752, -2600603, -4419522, -6878927, 4857071, 11842299, 7524246, 3940096, -6184216, -3747359, 7872675, -7953206, -10061498, 2053531, -8120710, -4159676, -16533477, 54224, -11076184, -23852638, 382252, -9118216, 10302553, -11263552, 13086228, 1240172, -8187819, -13623636, -3470334, -6946036, -11089606, 9915469, -1668595, 6460705, 7366943, -6227166, -2770791, -3668976, -5204964, --1791538, -4860829, 996432, -5913633, 6276558, 3767223, 5304285, 10282152, 5533529, -1590212, -12547210, 6249178, 2495913, -6645388, -6998113, 3686693, -5302674, 1270774, 4124242, -8222178, -7281044, 18820546, 1664837, 13411035, 6561100, 6531572, 9779104, 641561, 5297306, 5448166, --11921219, -8118562, 8637179, 719944, 8167954, 1598802, 8564702, -1122060, 3242700, 2327872, --17172890, -846645, 4731444, 12008729, 2857764, 10630581, 1292785, -1941862, 3604551, 5131412, --9539659, -15911780, -8507793, 2997350, 4224101, 1354525, 11479911, 4630512, -11056856, -1415729, --9792525, -5228586, 4753455, -5589900, 2754148, 3083250, -5675263, -15651398, 5362267, -15507516, --16889958, 3369402, -8051990, 7266011, 11429982, -3197603, 13262859, -3486977, 13117904, 16779364, -550830, 616328, -16809966, -3677566, 2434173, 2571075, -1462973, -11828340, 1373853, -10078678, -1822677, -3010772, 3237332, -4119948, -5798206, 1051730, -514859, -3941169, 4712653, -3758, --1987496, 11996381, 5284421, 8899172, -5192616, 1295470, -4249334, 3121904, -373125, 4447439, --877247, -4122632, -3973919, -11431055, -5665599, 17251810, 8016020, 11274289, -12716324, 2375117, -10969346, -9070434, 1035087, 6043019, -2558190, 6039798, 1986959, -12457553, -2001455, -18910204, --1163936, 6649146, 4809827, 11294690, -10687489, -10626823, -10106595, -16142098, 11140608, 6250788, -1469416, -11093364, 9961640, -740882, -12705050, -11469173, -3288334, -3383361, -7983271, -4043712, --4555350, -4983773, -2681133, -12964359, 6544994, 6371584, -211527, -1939715, -1813550, -5339181, --14094472, -16672526, 883153, 5982353, -3784940, -10654740, -5085778, 6473053, 5837398, -617402, --2668785, -5200132, -3863323, 8327942, -4398584, 5499706, -4140349, -944356, -15387257, -4623533, --854699, 10664404, 3669513, -4087735, -8457864, -7530152, -11984569, 18592914, -8762807, 17503066, -2902861, -9813463, 13066901, 10632192, 21922586, -22799298, 9304510, 1471026, 3545496, -6367289, --5175973, 6800007, 5805722, -4390531, -8567386, 7639673, -4087735, 7672959, 12035035, 3554086, --4313221, 5134634, 16377247, -27824408, -31216896, -18587544, -3885335, -12794708, 7521562, -10439455, -423591, 6029061, -1547799, 20644298, 13757317, 5638755, -6663642, -4003447, 13302051, -1896228, -1380295, -5330592, -13392245, 452582, 4249870, 3764002, -7771207, 6460705, -9127, -476741, -11033234, 16747688, 258235, -10217727, -5466957, -19894826, -8774618, -4983773, -7038378, 1101122, -2515777, -7169911, -3964792, -10129143, 9984188, 13328894, 9959492, 12407087, 8616241, 16178605, -845035, 5492190, 2674691, -3061775, 5041218, 9465571, -10916196, -33726768, -9059160, 10781979, --18645526, 8411693, 9593883, 3417720, -6657200, 176631, -5593121, -14254996, -5130876, 7746511, --12271258, -10336913, 1658394, -8942659, 20166482, 20157356, -9888088, 26321170, -21997748, -1437203, -4895189, -23023710, -5499706, -10313827, 4311611, -7748658, 20096152, 1418413, 759672, 22793928, --352724, -22199612, -15948824, -11449309, 9167071, -2322504, -19487878, 4145180, 6708739, 9648644, --11183021, 5055714, 11376831, 7872138, 8262980, -3665218, 13409425, 12202002, 5551782, -31032212, -22841172, -11919071, 9446781, -3416110, -2040110, 4451197, -12148315, -8841727, 15103252, -7728257, --733903, 11337103, -13075491, 11379516, -3800509, 10433549, -14477798, 19407346, -8099235, 30775052, --3020436, 486405, 9539122, -8739185, -4022237, -5587753, 3955128, -3396246, -14858439, -22237194, --4181151, 9901510, -4567161, -9495636, -19121194, 7316477, 3980898, -30916248, 1675574, -2488397, -6700149, 11124502, -6556805, 9706626, 32529546, 14999636, -8860518, 21027086, 7991324, -14802605, -6167573, 13271986, -1399623, -5674726, -18700824, -6160057, 12796318, 6959995, 6494528, 2628520, --2739116, -8744553, -17617956, 8844411, -5496485, 3912178, -13347148, -8632884, 424128, -3187403, -18864570, 4412005, 3666828, 12780212, 7438347, -22048752, -1652489, 6528887, -3121904, -734976, -18685256, 4669167, 21574158, -13334800, -6774237, -4712653, -6880001, 6776385, -7187628, 14199699, -16460999, -8337606, -14265734, 23885386, -12134356, -6954626, -2045478, 5816997, 4933307, -16086800, --3126736, 7063611, -5574331, 9336185, -4190814, 13939853, -7118372, 1044214, 26473642, -3467112, -19265076, 27076548, 5754720, 10965052, -5509370, -41586556, -22146998, -11431055, 1833951, 9121437, --41660644, -9674951, 42950208, -16385837, -18851686, 38363184, -24832964, 21674552, 28387586, 11498701, -3562139, -21726092, 7941395, -38219840, -19314468, 8440148, 19443316, 2284386, 4094715, 14522358, -38218228, 26168698, 7628399, 1393717, -632971, 4230006, 2580202, -15147276, -333397, 9446244, -11433203, 51533700, 28420336, 19717658, 36574868, 15013058, -6153078, 10936597, -1554241, 35453344, -12052215, -3285650, -6912750, 14539538, -3304441, 16707960, -54400056, 1794223, 17238924, -1669132, -21029770, -8944806, 4592931, 11143293, -51034948, -19971598, -5371931, -16775069, -22175990, -25227028, -20946556, -15939697, 2603287, -5801964, 20633022, -38773892, -12666395, -6986301, 8915278, -2276870, --6766184, 24824910, 43823160, -3958349, 9276056, -15131170, -5906654, 20311438, 21919902, -20780126, --63768452, -14108431, 29155312, 3923453, -5214627, -7537668, 4187056, -11459510, -9951976, 12161737, -12988518, 27576374, 13059385, 15598784, -4597763, 37436008, 9380745, 22810572, -1367947, 34285652, --11755862, 21432960, -21113522, -2361695, 4839892, 14516453, -4460324, -15420006, -28571196, 14512158, -4613332, 790811, -12545599, -30489436, 730681, 374736, -934155, 5588826, 20376936, -273267, -15357729, 42526080, -16502338, 1443109, -12253005, 20317880, 23280334, -26181584, 24563992, 21209622, --14503568, 2695629, 9060770, 13365401, 11877195, 30815854, 14589467, -16388521, 5999533, 40527312, -18447422, -55876988, 19765440, 4219269, -38981660, -17696340, -8305393, -37248104, 9035001, 12190191, -29326036, -21314848, 48659296, -40586904, 32833414, 71673880, 4448513, -39407936, 61197380, -13613973, --1290638, 9020505, 34489660, -19859392, 1038845, 70104600, -35151088, 16829292, 23025320, 22762790, --31565862, -2979097, 4947803, -15059766, 1999844, 7402913, -13297219, 12510166, -22112102, -5973226, --9349607, -1542967, -13677323, -11169062, -5048734, 6782290, -24273008, -21747030, 31723166, 5974837, --21619254, -5356898, 18304614, 47301012, -5382668, -23054310, 23324894, 36265632, -11981885, -2700461, --606664, 13120051, -1564442, 21475, 14700599, -40074192, 25552908, -23124640, -1792075, -32770064, -16124381, -2570001, -51392504, 24153822, -6176700, -18922552, 30082488, 3908957, 29417842, -27571006, --14153528, -11085847, -29520920, -39539468, -56872348, 44641352, 13276281, 32871532, 24970402, -83752, --10754598, 37688876, -14851997, 10384694, 9831180, -41316512, 36961952, 11461120, -9540733, 29808146, -3339337, 813359, 15870441, -14777372, 40249748, -33127082, -16393353, 13368086, 14209899, 5299990, --29020558, -19479824, -32442036, 16667694, 4820564, 15042049, 427349, 16221018, 7560216, 4288525, -1024887, 13479218, -6607807, 6579353, -14844481, 9427453, -13755707, -2048163, -18262738, -15047418, -823560, -18404472, 7654169, 36828272, 9252970, -31412854, 15114527, 9432285, 20477330, -1794223, -34106336, -31998580, 4191888, 11136850, -28893856, -9331890, 57003880, 29557428, -76669464, -35256848, -39788576, -14163192, -36908264, 10934987, -4644471, -31384936, 19311784, 30791158, -48245904, 5095442, -40036076, -32911260, -27360016, 28703804, 2029909, -32854352, 30849140, -69800736, -7910793, -10036802, --83419000, -11615202, -27593018, 10768020, 11195906, 26757646, -13313325, -28577638, -14538464, -42497092, -3462281, 19223200, 6802692, 10208600, -39127152, 25448754, 989453, -40853728, 29526826, -44125956, --21850646, -14577656, 10300942, 37351720, 37129992, -27917, -11410117, -73156712, 30346092, 80700288, -25748866, 5144297, -44965624, -58880780, -28029494, -1785096, 30113090, -35483408, -25733834, -36483600, --15186467, 75958104, 75535592, -9836549, -38338488, -27137750, -18890876, -4316442, 36863168, -14645302, -9350681, 12310450, 23716810, -2929705, -20007568, -41130216, -22166864, 73904040, 27264452, 50901268, --44797044, -18495740, -22120692, 52425444, -1631551, -71095664, -76762336, 47587700, 68295352, 126617784, -17081084, -93201864, 9834938, -9425843, -35230008, 29841970, -31285078, -8602283, 2618320, 6777459, --4783520, 5907191, 14090177, -22632330, -16755204, -1966021, 6129992, 11953431, -13928579, 549219, -12975096, -10671920, 8573828, -6341519, 36974300, -2172717, -4119411, 18829136, 12490302, 16522739, --7978976, 9911174, -2476586, -2244121, 16251083, 8910983, 3709241, 2683281, 21470004, -20742544, --4524748, 165893, 28529320, -2327872, -4993973, 23518704, -5310190, -13013214, -9860708, 19086298, --3861176, 7174206, 6769406, 1132798, -6279779, 1665374, 9332427, 730144, 24911884, 9585830, -7864085, -12604655, -459562, 6715718, -15903190, 3676492, 7534983, 15002321, 1289564, -4733591, -10946261, -596464, -18748606, 19237696, 7697655, -8392903, 19242528, -16128676, -914828, -13819057, --7582765, 6757594, 57184804, 4913980, -21501680, -17287780, 2589865, 13297756, -1049046, 12174622, --4759898, -2856690, -16172699, -3175055, -11385958, 18078054, -11314018, -558346, -7212324, -2952253, --4305705, 2305861, -11974369, 2180770, -5252745, -7929584, 2280628, -935766, 521302, -1854352, -4020090, 2405719, -9982041, -5926518, -112206, -6271189, -5909875, 5315022, -1674500, -9650792, -607738, -5170604, 4250944, -14449881, 7410429, -6027450, -11317239, 3884798, -5179731, -5406290, -1545651, 358093, 736587, -2020782, 2551211, -4096862, 5106716, -2669322, 621697, 8756901, --5886253, 3236258, -1450625, -438087, 2415382, -6434935, 6420976, -6804839, 6439767, -1123671, --61740, -4282620, 6183679, -6677064, 831076, 2535105, -8554501, 8676908, -4320737, -27081380, --45240500, 47907676, 163869648, 32117228, 48748416, -100729328, -141508432, -58276264, -74418360, 57521424, -131404528, 76488000, 50305880, 5655398, -73475616, -63890860, -65136936, -25817048, 35844188, 31711354, -32593970, 30465276, -1734093, -4335770, -8388071, -9878962, -16035260, -1569274, 19426674, -1308354, --12519293, -4124242, -17751100, -9069360, -3764539, -3761855, 31585190, 30579630, 16981226, 19563576, -118648, -22992570, -24749750, -43387224, -30072288, 4407174, 2649995, 9312563, 24894168, 37159520, -21117818, 18869938, -1850594, -20535312, -30039538, -24758876, -22081500, 3252901, 6372121, 13687524, -8145943, 6349573, 112743, -7495255, 1671816, 758062, 1774358, 18221398, -3234110, 7907035, -6639483, -13961865, -27626304, -27039504, -26032334, 5912023, 14761803, 5912560, 384936, 0, -0, 0, 0, }, +-3151432, 441845, -2930778, -376883, 3689377, -4294431, 1852205, -1865626, -1881196, -3999152, +-1311039, 6078453, -4331475, 3453691, 1873143, -3306588, -148176, -4864588, 1398012, -404264, +2983929, -8735963, -3820910, -1162326, 1890323, -725850, -3172370, -10201, -863825, -3992709, +3882114, -7516, 1139240, 4190278, 224412, -1038845, -682363, -801548, 386547, -1806034, +-2829847, -2325725, -2204392, -1247151, -1381906, 5653788, 3712462, 1368484, 1187559, 1036698, +-1246077, -381178, -1191317, 5369783, -718333, 1422708, -3681861, 1379221, -339302, 2182917, +1082869, 758062, -1595044, 268972, -986232, 4189204, 20401, 476741, 1946694, 1056025, +-2605972, 1250372, 544387, -1300301, -175557, 61203, 3103651, 9375377, 2301566, 1213865, +-2005750, -963146, -4553202, -378494, -1047435, 3354906, 3287798, -3340948, -2121177, -2093797, +-1660542, -2437394, 393526, 2622078, -2090575, -2595771, -7725036, -5989332, -4116726, -399432, +559956, 5565741, -3045132, 2652679, 1900523, 1258962, 475668, -4524211, 1230508, -9406515, +1243393, 61203, 553514, -857920, -5549635, -2815351, -4771172, 62814, 424665, -3197066, +-7479149, 4965519, -264677, -4694400, 76773, 2697240, 737124, -1800128, 1165547, -2805151, +-1007707, -2670933, 1913408, -2833068, 3645354, 2588255, -512175, -5367636, 316754, 373125, +-406948, -2188823, 1309965, 550293, -1137630, 2371359, 2971044, 1684701, 166967, -354872, +881005, -3081639, -10150081, -11382737, -815507, -4498442, 3469797, -5577552, 1392106, 2581275, +-3815005, 3110093, 11382737, 637803, -1061394, 6242198, 832687, 6265284, 82141, 2854543, +-4499515, -5953362, -337692, 2243047, -4149475, -1345399, -436476, -1184337, 1114544, -1235877, +-2200634, 2040646, -1046361, -893890, 4459250, 6352257, -2007897, -3467649, 1254667, 5069135, +1923072, 6503118, 259309, -970663, -181999, 5786932, 362925, -4242891, -2306398, 4517232, +3319473, 3490735, 965831, -2363843, -4722854, 835908, 2224793, 2648384, -1009317, -2596845, +5119064, 3289945, -824097, -3014530, 204011, -2169495, 5366562, 1421634, 1039382, 1452773, +681826, 808528, 3388729, 214212, 3454764, -1107028, 5493800, -32749, -4663798, 6007049, +4163971, 6323803, 6525129, -1543504, 3255048, -1377074, -3742527, -318901, 9677635, 4276714, +2138357, 3481608, -4076461, 6947647, 2937758, 4664335, -1398012, -7653632, 3198140, -11957726, +2400350, -3032784, 2377265, 1917703, -259309, -4096325, 960462, 2722473, -1640678, 2555506, +6038724, -404264, -5078262, -6835441, 1030255, 3102577, -6365679, 3549254, -5987722, -3841312, +4264366, -2471217, -5074504, -2411087, -3598646, 5586142, 7559680, 4353486, -2803540, 73014, +4002373, 2472291, -416075, -3071975, -1554778, -2689723, 2820183, 9466645, -160524, -5065377, +-4125316, 2231236, 672162, -1869921, -5677410, -58519, -4880157, -1834488, 651761, -779537, +3698504, 743029, 4691178, 5570573, -4841502, -1762010, 13325673, -3549254, 1248225, 1948841, +-8884140, -7483981, 128312, 8770860, 6597070, 10591389, 3406446, -2964601, -4632659, 792421, +-2702608, 2091112, 911070, 3573950, 6459094, 2089502, 4727686, -142808, 2749853, -2923799, +-6242735, -3220689, -4816269, 42950, -1450625, 1401770, -7602629, -3748970, -1158567, 2721936, +-3853660, 7680476, -8879845, 1823751, -5669894, -4489852, 2325188, 2165737, 7231115, -881542, +1653026, -2183991, 4972499, 5451924, 1273458, -1252520, -5881958, -843961, 1637993, -4365835, +3989488, -4800163, 1686848, 7751342, 6183679, 28454, -2930242, 1160178, 7374996, -1035624, +1429687, 1166621, 5834176, 31139, -2342368, -3973919, 2034741, -5940477, 1246614, 12558484, +1803886, 6146098, -1505923, -5070746, -8145406, 4016331, -5749351, -6321118, 1465121, -3157875, +-19420232, 1718524, 3238405, 17782776, 6028524, 1152662, -7944079, 7311108, 3459059, -3431142, +4140885, -849330, 6747931, -4105989, -1799591, -1488743, -1509681, -2864206, -945967, 4483946, +4286914, 6867653, 2741263, 3296924, 163746, -4708895, -4702453, 6511708, -3401077, 1347009, +-357019, -4818954, 6988449, -1245004, -2674691, 1063541, 5158256, -3370476, 7705708, -9542880, +-7563438, -9667971, 2577517, -5473399, -7941395, -1952600, 7928510, -3300682, 2566780, 4511327, +-3025805, -4343823, 625992, 709743, 2849711, 498216, -2095407, -214748, 10191421, 4292283, +-3691525, -12279848, -9561134, 3859028, 12186970, 10210211, -7163469, 669478, -4236985, 2711735, +-3429532, 5726265, -9710384, -1726577, -12060805, -3621194, 1836635, 4146254, -11013370, -2840047, +7579544, -1014149, -11048266, 5615133, -3547106, -6445672, 3440269, 5662915, 1276142, 1066763, +1949378, 7416872, -3659849, -3320010, 1903207, -3940633, -2007360, -97711, -534723, 40802, +5949604, 2891050, -846645, -770410, 3391414, 1236414, 4183298, -647466, 4726075, 4926328, +1861332, -5986648, 584652, -1112933, -4305705, 5143224, -3389266, 1943473, -4069482, -1750199, +-13873281, 850404, 10616622, 562104, 11275363, -2586107, -3068217, -12481712, 13627931, 6169184, +7507066, 808528, 6001143, -614717, -708133, 4924717, -3951370, 1372779, -856846, -14155675, +2132988, -3904125, 2428804, -2878702, 1814087, 11451457, 1825898, -15932718, -117038, 11295764, +-2160906, 6532109, -7052873, -5523328, -13017509, 7290170, 4391604, 8529268, 4576825, -4758287, +7923678, -2263448, 7604240, -5089536, -3943854, 186831, -1172526, 5865315, 1741609, 4895189, +6305012, -3858491, -2552284, -2415382, 4311074, -1132261, -2039573, 464393, -4823785, 2400887, +2331094, -3102040, 4372814, 6546067, -2277407, -3428458, -354872, -5493800, -2041720, 7586523, +1554241, -5185100, 10077067, -10839424, 2159832, 5361193, -1921461, -3755412, -277562, 4225711, +-7543573, 3757560, -2758980, -7182796, -4665945, -4445828, 671089, -2242510, -3879429, 1629940, +12439299, 6295349, -1075889, -4378719, -10963978, 912681, 6969658, -4097936, -12141336, -73014, +-1370632, 65498, 2291365, 4653597, 5291937, -2390149, 1445257, 7538742, 635118, 8858907, +9852118, 21573084, 14925011, 8981313, -2139968, -11540040, -3832185, 10453950, 4722317, -11129334, +8454106, -1970853, -5307506, -6808060, 1210644, 18711026, -12486007, 13538274, 5498095, -2909840, +4668093, -3640522, 9918690, -3688303, 5353140, 1065689, -6483790, -4650376, -6303938, 326954, +5798206, -1510218, -3432216, 3679713, 730681, -993211, -12391518, 3979287, -6813966, -5205501, +3783866, 8537321, -5871757, -8670465, 616328, 7774965, 927176, -4799089, -1577864, -2718714, +3750043, 2835752, -2600603, -4419522, -6878927, 4857071, 11842299, 7524246, 3940096, -6184216, +3747359, 7872675, -7953206, -10061498, 2053531, -8120710, -4159676, -16533477, 54224, -11076184, +23852638, 382252, -9118216, 10302553, -11263552, 13086228, 1240172, -8187819, -13623636, -3470334, +6946036, -11089606, 9915469, -1668595, 6460705, 7366943, -6227166, -2770791, -3668976, -5204964, +-1791538, -4860829, 996432, -5913633, 6276558, 3767223, 5304285, 10282152, 5533529, -1590212, +12547210, 6249178, 2495913, -6645388, -6998113, 3686693, -5302674, 1270774, 4124242, -8222178, +7281044, 18820546, 1664837, 13411035, 6561100, 6531572, 9779104, 641561, 5297306, 5448166, +-11921219, -8118562, 8637179, 719944, 8167954, 1598802, 8564702, -1122060, 3242700, 2327872, +-17172890, -846645, 4731444, 12008729, 2857764, 10630581, 1292785, -1941862, 3604551, 5131412, +-9539659, -15911780, -8507793, 2997350, 4224101, 1354525, 11479911, 4630512, -11056856, -1415729, +-9792525, -5228586, 4753455, -5589900, 2754148, 3083250, -5675263, -15651398, 5362267, -15507516, +-16889958, 3369402, -8051990, 7266011, 11429982, -3197603, 13262859, -3486977, 13117904, 16779364, +550830, 616328, -16809966, -3677566, 2434173, 2571075, -1462973, -11828340, 1373853, -10078678, +1822677, -3010772, 3237332, -4119948, -5798206, 1051730, -514859, -3941169, 4712653, -3758, +-1987496, 11996381, 5284421, 8899172, -5192616, 1295470, -4249334, 3121904, -373125, 4447439, +-877247, -4122632, -3973919, -11431055, -5665599, 17251810, 8016020, 11274289, -12716324, 2375117, +10969346, -9070434, 1035087, 6043019, -2558190, 6039798, 1986959, -12457553, -2001455, -18910204, +-1163936, 6649146, 4809827, 11294690, -10687489, -10626823, -10106595, -16142098, 11140608, 6250788, +1469416, -11093364, 9961640, -740882, -12705050, -11469173, -3288334, -3383361, -7983271, -4043712, +-4555350, -4983773, -2681133, -12964359, 6544994, 6371584, -211527, -1939715, -1813550, -5339181, +-14094472, -16672526, 883153, 5982353, -3784940, -10654740, -5085778, 6473053, 5837398, -617402, +-2668785, -5200132, -3863323, 8327942, -4398584, 5499706, -4140349, -944356, -15387257, -4623533, +-854699, 10664404, 3669513, -4087735, -8457864, -7530152, -11984569, 18592914, -8762807, 17503066, +2902861, -9813463, 13066901, 10632192, 21922586, -22799298, 9304510, 1471026, 3545496, -6367289, +-5175973, 6800007, 5805722, -4390531, -8567386, 7639673, -4087735, 7672959, 12035035, 3554086, +-4313221, 5134634, 16377247, -27824408, -31216896, -18587544, -3885335, -12794708, 7521562, -10439455, +423591, 6029061, -1547799, 20644298, 13757317, 5638755, -6663642, -4003447, 13302051, -1896228, +1380295, -5330592, -13392245, 452582, 4249870, 3764002, -7771207, 6460705, -9127, -476741, +11033234, 16747688, 258235, -10217727, -5466957, -19894826, -8774618, -4983773, -7038378, 1101122, +2515777, -7169911, -3964792, -10129143, 9984188, 13328894, 9959492, 12407087, 8616241, 16178605, +845035, 5492190, 2674691, -3061775, 5041218, 9465571, -10916196, -33726768, -9059160, 10781979, +-18645526, 8411693, 9593883, 3417720, -6657200, 176631, -5593121, -14254996, -5130876, 7746511, +-12271258, -10336913, 1658394, -8942659, 20166482, 20157356, -9888088, 26321170, -21997748, -1437203, +4895189, -23023710, -5499706, -10313827, 4311611, -7748658, 20096152, 1418413, 759672, 22793928, +-352724, -22199612, -15948824, -11449309, 9167071, -2322504, -19487878, 4145180, 6708739, 9648644, +-11183021, 5055714, 11376831, 7872138, 8262980, -3665218, 13409425, 12202002, 5551782, -31032212, +22841172, -11919071, 9446781, -3416110, -2040110, 4451197, -12148315, -8841727, 15103252, -7728257, +-733903, 11337103, -13075491, 11379516, -3800509, 10433549, -14477798, 19407346, -8099235, 30775052, +-3020436, 486405, 9539122, -8739185, -4022237, -5587753, 3955128, -3396246, -14858439, -22237194, +-4181151, 9901510, -4567161, -9495636, -19121194, 7316477, 3980898, -30916248, 1675574, -2488397, +6700149, 11124502, -6556805, 9706626, 32529546, 14999636, -8860518, 21027086, 7991324, -14802605, +6167573, 13271986, -1399623, -5674726, -18700824, -6160057, 12796318, 6959995, 6494528, 2628520, +-2739116, -8744553, -17617956, 8844411, -5496485, 3912178, -13347148, -8632884, 424128, -3187403, +18864570, 4412005, 3666828, 12780212, 7438347, -22048752, -1652489, 6528887, -3121904, -734976, +18685256, 4669167, 21574158, -13334800, -6774237, -4712653, -6880001, 6776385, -7187628, 14199699, +16460999, -8337606, -14265734, 23885386, -12134356, -6954626, -2045478, 5816997, 4933307, -16086800, +-3126736, 7063611, -5574331, 9336185, -4190814, 13939853, -7118372, 1044214, 26473642, -3467112, +19265076, 27076548, 5754720, 10965052, -5509370, -41586556, -22146998, -11431055, 1833951, 9121437, +-41660644, -9674951, 42950208, -16385837, -18851686, 38363184, -24832964, 21674552, 28387586, 11498701, +3562139, -21726092, 7941395, -38219840, -19314468, 8440148, 19443316, 2284386, 4094715, 14522358, +38218228, 26168698, 7628399, 1393717, -632971, 4230006, 2580202, -15147276, -333397, 9446244, +11433203, 51533700, 28420336, 19717658, 36574868, 15013058, -6153078, 10936597, -1554241, 35453344, +12052215, -3285650, -6912750, 14539538, -3304441, 16707960, -54400056, 1794223, 17238924, -1669132, +21029770, -8944806, 4592931, 11143293, -51034948, -19971598, -5371931, -16775069, -22175990, -25227028, +20946556, -15939697, 2603287, -5801964, 20633022, -38773892, -12666395, -6986301, 8915278, -2276870, +-6766184, 24824910, 43823160, -3958349, 9276056, -15131170, -5906654, 20311438, 21919902, -20780126, +-63768452, -14108431, 29155312, 3923453, -5214627, -7537668, 4187056, -11459510, -9951976, 12161737, +12988518, 27576374, 13059385, 15598784, -4597763, 37436008, 9380745, 22810572, -1367947, 34285652, +-11755862, 21432960, -21113522, -2361695, 4839892, 14516453, -4460324, -15420006, -28571196, 14512158, +4613332, 790811, -12545599, -30489436, 730681, 374736, -934155, 5588826, 20376936, -273267, +15357729, 42526080, -16502338, 1443109, -12253005, 20317880, 23280334, -26181584, 24563992, 21209622, +-14503568, 2695629, 9060770, 13365401, 11877195, 30815854, 14589467, -16388521, 5999533, 40527312, +18447422, -55876988, 19765440, 4219269, -38981660, -17696340, -8305393, -37248104, 9035001, 12190191, +29326036, -21314848, 48659296, -40586904, 32833414, 71673880, 4448513, -39407936, 61197380, -13613973, +-1290638, 9020505, 34489660, -19859392, 1038845, 70104600, -35151088, 16829292, 23025320, 22762790, +-31565862, -2979097, 4947803, -15059766, 1999844, 7402913, -13297219, 12510166, -22112102, -5973226, +-9349607, -1542967, -13677323, -11169062, -5048734, 6782290, -24273008, -21747030, 31723166, 5974837, +-21619254, -5356898, 18304614, 47301012, -5382668, -23054310, 23324894, 36265632, -11981885, -2700461, +-606664, 13120051, -1564442, 21475, 14700599, -40074192, 25552908, -23124640, -1792075, -32770064, +16124381, -2570001, -51392504, 24153822, -6176700, -18922552, 30082488, 3908957, 29417842, -27571006, +-14153528, -11085847, -29520920, -39539468, -56872348, 44641352, 13276281, 32871532, 24970402, -83752, +-10754598, 37688876, -14851997, 10384694, 9831180, -41316512, 36961952, 11461120, -9540733, 29808146, +3339337, 813359, 15870441, -14777372, 40249748, -33127082, -16393353, 13368086, 14209899, 5299990, +-29020558, -19479824, -32442036, 16667694, 4820564, 15042049, 427349, 16221018, 7560216, 4288525, +1024887, 13479218, -6607807, 6579353, -14844481, 9427453, -13755707, -2048163, -18262738, -15047418, +823560, -18404472, 7654169, 36828272, 9252970, -31412854, 15114527, 9432285, 20477330, -1794223, +34106336, -31998580, 4191888, 11136850, -28893856, -9331890, 57003880, 29557428, -76669464, -35256848, +39788576, -14163192, -36908264, 10934987, -4644471, -31384936, 19311784, 30791158, -48245904, 5095442, +40036076, -32911260, -27360016, 28703804, 2029909, -32854352, 30849140, -69800736, -7910793, -10036802, +-83419000, -11615202, -27593018, 10768020, 11195906, 26757646, -13313325, -28577638, -14538464, -42497092, +3462281, 19223200, 6802692, 10208600, -39127152, 25448754, 989453, -40853728, 29526826, -44125956, +-21850646, -14577656, 10300942, 37351720, 37129992, -27917, -11410117, -73156712, 30346092, 80700288, +25748866, 5144297, -44965624, -58880780, -28029494, -1785096, 30113090, -35483408, -25733834, -36483600, +-15186467, 75958104, 75535592, -9836549, -38338488, -27137750, -18890876, -4316442, 36863168, -14645302, +9350681, 12310450, 23716810, -2929705, -20007568, -41130216, -22166864, 73904040, 27264452, 50901268, +-44797044, -18495740, -22120692, 52425444, -1631551, -71095664, -76762336, 47587700, 68295352, 126617784, +17081084, -93201864, 9834938, -9425843, -35230008, 29841970, -31285078, -8602283, 2618320, 6777459, +-4783520, 5907191, 14090177, -22632330, -16755204, -1966021, 6129992, 11953431, -13928579, 549219, +12975096, -10671920, 8573828, -6341519, 36974300, -2172717, -4119411, 18829136, 12490302, 16522739, +-7978976, 9911174, -2476586, -2244121, 16251083, 8910983, 3709241, 2683281, 21470004, -20742544, +-4524748, 165893, 28529320, -2327872, -4993973, 23518704, -5310190, -13013214, -9860708, 19086298, +-3861176, 7174206, 6769406, 1132798, -6279779, 1665374, 9332427, 730144, 24911884, 9585830, +7864085, -12604655, -459562, 6715718, -15903190, 3676492, 7534983, 15002321, 1289564, -4733591, +10946261, -596464, -18748606, 19237696, 7697655, -8392903, 19242528, -16128676, -914828, -13819057, +-7582765, 6757594, 57184804, 4913980, -21501680, -17287780, 2589865, 13297756, -1049046, 12174622, +-4759898, -2856690, -16172699, -3175055, -11385958, 18078054, -11314018, -558346, -7212324, -2952253, +-4305705, 2305861, -11974369, 2180770, -5252745, -7929584, 2280628, -935766, 521302, -1854352, +4020090, 2405719, -9982041, -5926518, -112206, -6271189, -5909875, 5315022, -1674500, -9650792, +607738, -5170604, 4250944, -14449881, 7410429, -6027450, -11317239, 3884798, -5179731, -5406290, +1545651, 358093, 736587, -2020782, 2551211, -4096862, 5106716, -2669322, 621697, 8756901, +-5886253, 3236258, -1450625, -438087, 2415382, -6434935, 6420976, -6804839, 6439767, -1123671, +-61740, -4282620, 6183679, -6677064, 831076, 2535105, -8554501, 8676908, -4320737, -27081380, +-45240500, 47907676, 163869648, 32117228, 48748416, -100729328, -141508432, -58276264, -74418360, 57521424, +131404528, 76488000, 50305880, 5655398, -73475616, -63890860, -65136936, -25817048, 35844188, 31711354, +32593970, 30465276, -1734093, -4335770, -8388071, -9878962, -16035260, -1569274, 19426674, -1308354, +-12519293, -4124242, -17751100, -9069360, -3764539, -3761855, 31585190, 30579630, 16981226, 19563576, +118648, -22992570, -24749750, -43387224, -30072288, 4407174, 2649995, 9312563, 24894168, 37159520, +21117818, 18869938, -1850594, -20535312, -30039538, -24758876, -22081500, 3252901, 6372121, 13687524, +8145943, 6349573, 112743, -7495255, 1671816, 758062, 1774358, 18221398, -3234110, 7907035, +6639483, -13961865, -27626304, -27039504, -26032334, 5912023, 14761803, 5912560, 384936, 0, +0, 0, 0, }, }, { { -4326643, --3154117, 690416, -2771328, -1715839, -1253594, -353261, -445066, -1789391, -5367636, -3997541, --2841658, -1395864, -3881040, 1618666, -900333, 638876, -1604707, -575526, -2429341, 2540473, -501437, -1779727, -3200288, 312996, 3591667, 1978906, -3655017, -3510062, 656056, 300111, -410706, -2443837, 530428, -883690, -1581085, -469225, -1490354, -2250563, -1051730, -3828963, -4952098, 1385664, 3439195, -3332895, -5646809, -444529, 726386, -625992, -5243618, 306016, --1304060, 3092913, 2091112, 2322504, 5333276, -921807, -187905, -1628330, -805306, 1934883, --3631395, 4267050, 5105106, -2404645, -1676111, -4257387, -2229088, 862752, -1294933, -2566780, -281857, -2709588, -1395864, -3434363, -2870112, -3156801, 2104534, 6383395, 455267, 4291209, --1053878, -557272, -2368675, 4565014, 2754685, -2595771, -3593814, 2321967, -995359, -5324149, --6333466, 1521492, 193810, -2057289, -2243584, -4147865, 2546916, -4888747, 1125818, -448824, -974958, 441308, 906775, -2180233, -479963, 906775, 1250909, -474057, 1558536, 1295470, --2371359, 1677722, -1518271, -4172561, 5760088, -1117765, 53687, 1449552, -979789, 3319473, -3961034, -874026, 1317481, 3191698, -13422, -3326452, -2867965, 874563, 1680943, -984084, -749472, 3918084, -3788698, -3038689, 2822331, 659814, -1718524, -2029372, -572841, 795643, -1913945, -3847754, 1330366, 1078574, -3729105, -3206730, 2043868, -1678259, -4968741, -1581085, --1531693, 6293738, 5272609, -7813620, -3304441, -5403606, 3563212, -2643552, -3582540, -2507724, --3205119, -689879, 1262184, 5833640, 1074279, -3175055, 5019743, 158914, 5174899, -4943508, -7981123, 3643206, 8653822, -1568200, -2853469, -615254, -4653597, -424128, -264141, -1731409, -1680406, 142271, -3675418, -923418, 64961, 1151588, 3805878, 852551, -5527086, -4676146, --1687922, 3151432, 295816, 158377, -2754685, 4678830, -36507, 353798, -1921461, 611496, --1121523, 2472291, -696322, 7813083, 166967, -994822, 3055332, -1931125, -3397319, -1408749, -2748242, 4747550, 893890, 2933463, 826781, 549219, -2350421, -2343979, -3833795, -93416, --3972308, 1116692, 3489661, 3685082, 2665564, -1132261, -1646046, 3390877, 5618354, 5676873, -3284576, -192200, 4967130, -2788508, -3900904, 3762391, 4293894, 5023501, 7869991, 523986, --4753992, 2641942, -4531728, -524523, 1714229, 909996, 8726837, 460098, -6774774, -542240, -1366337, 2675765, -370978, -2581812, -7486128, -1736777, 6577743, 1984275, 4362613, 4718022, -4246112, 886374, -613107, 4145180, -5549635, -460098, -3744138, 10015864, -463320, -22012, -4683662, -4149475, -512175, 1275068, -491774, 5798743, -865973, 1488743, 5968931, -1532230, -1926293, 83215, -206158, -484794, -695785, -2151242, 2623151, 2942053, -747324, 2899103, -1322313, 6196027, 7777649, -979789, 2148558, 659814, -3783866, 3150359, -839129, -3960497, -1482838, 2962454, 1202591, -1854889, 8439611, 8529268, -3437585, -4677757, -4333085, -2755759, -2028298, -9052717, -1018444, 1399086, -4516695, -8006893, 7776039, -1582696, -2103997, 1386201, -3525095, 3362423, -4140885, -1484448, -271120, -323196, 1794223, 2893734, -1631551, 3531000, --2658585, 5352066, -721555, 319975, -2773475, 2873333, 935229, -696858, -2757369, 1367947, --1598265, -2246268, -2041720, 558883, 1655173, -4871567, 357556, -9274445, -5473399, 3441880, --1468879, 1188095, 2033667, 6223945, -2035278, -3048890, -262530, 241592, 2550137, 2529199, --2921115, -1244467, 6773164, 270046, 1012539, 572841, 3007551, -5701569, 177167, 2825552, -5280126, 1031329, 2270964, 7927973, -1973001, -917512, -4336307, -164819, 1371705, 2499671, --5361193, -8586713, 3718905, -2863133, 235686, -4471061, 3467649, -9917616, -7998840, -9365176, --3059627, -2071248, -6411313, 3188476, 8904004, -6637872, 1411971, 10271414, -2365990, -2967823, --4749160, 706522, 1611, 4461398, 1529545, 3158949, 2339684, -3544422, -6592775, -3312494, -3951907, -2416993, -4038880, 834297, 1664300, 1103807, 828392, 8844411, -4287988, 4711579, --2379412, 2247342, -2661806, 7291781, -5638219, 2823941, -500901, -4737349, 4125853, -1937030, --1532230, 4198868, 2331094, -692564, -2046552, 3757560, 1941862, -4540854, -5107253, 3083250, -5481989, 2749316, 38655, -2829847, 186294, 3115999, -1632625, 3827890, -1115618, -9230958, -170725, -4361540, 12349642, 3801046, -7107097, -4466766, -994822, 39728, 3587372, -7589744, --8516920, 7243463, -1286343, -7580618, 938450, -2243584, 7712151, 3274913, -1563905, 961536, --61203, -1528472, -1022202, 8144332, 1968169, 9127, -5583458, -3143916, -1106491, 2528662, -4023311, 11057930, 529355, -130460, -127238, 259309, -4866735, -314606, 2298881, -6878390, --4275103, -4671314, -347355, 7844758, -6713571, 550293, 3995930, 1029182, -3088082, 2851858, --8465917, 6322192, -1427540, -712965, 3878356, -5077188, -5028333, -8647380, 1702418, -3379066, -7473780, 1758252, 172872, 548682, 2234457, 4939750, -2650532, -2249489, 6023155, -2269890, --3609383, -1202591, 5961415, 5054640, 5456756, 1827509, -4012036, 2284386, 4811437, -7547868, -7352984, -6482180, -4917201, 4703526, -16230145, -10058277, 2429878, 5478231, 10462003, -6215892, -5444408, 1475321, 5756330, 81068, -3223910, -3326989, 3420942, 11625403, 591095, -584116, --11065446, -8559870, -292058, -6183679, -4220342, 788127, 1010391, -6345814, -2355253, 2045478, -3636227, 2523830, -4690105, 396211, 4723927, 4514011, 543313, -3731253, 464393, -2123325, -927713, 1824824, 2027761, -2779381, 3727495, 10188199, -1258425, -321049, 1645509, -5045513, -2334315, 8278550, -7988103, -8755828, -4946729, 1155346, -12048994, 687732, 165893, 2042794, --36507, 207232, -5756330, -2660732, -3754338, -135291, 8002061, 12259447, 312459, 1119376, -5833103, -2119566, -914291, 2983929, 13554917, 1940252, 5071820, 9587978, 2117419, -6078453, -3155727, 8653822, 4621385, -7028177, -818728, 16684874, 13802951, 3542274, 8133595, 11191611, -2207613, 382789, 6519224, -2622615, -402653, -5803575, 4714801, 121870, -222265, 2904472, -2283849, 9368397, -7900593, -6188511, 6240051, 1963337, 2582349, -4685810, 460098, -1241782, -2961917, 667331, 4352950, 5400385, -5368172, 4682588, 2856153, -4931160, 13810467, 3178813, -2252710, -10434623, -4119411, -186294, 8731132, 9392557, -1462973, -8796630, 5639829, -7525320, --3195456, 8078297, -848793, -5050882, 6440841, 9800042, -2961917, 3923453, -4312147, -11553462, --682363, 9039832, -4486094, -3200825, 4434554, -4844723, -10016937, 3520800, 5213554, 12642773, -4858145, -6893960, 2395518, -8128226, -12927852, 12965969, 3749507, 6914361, 17204566, 10358387, --6838125, -2385854, 175020, 2555506, 2834142, -1428077, -6078453, 1235340, -3999152, 6639483, -732829, 2361695, -1751273, -1354525, -6297496, -3947612, 14994805, 4479114, -8211441, 3886946, --7988639, -6334540, -12817256, 5593121, 870805, -29528, 3852586, -598611, -5404680, 9922448, -6513318, -2437394, -9473624, 10040560, -6245956, 2525978, 529355, 3192235, 2842732, 6356552, -8351564, -1877975, 5039608, 11768210, 2448131, -3821447, -2437931, -2178622, 2848637, 7874286, --1132261, 3187940, 1720134, -7277822, 1427003, -1775969, 4750234, -10887205, 1087164, -18145700, --9701794, -10056666, -1149441, -9893994, 8268349, -2308545, -6691559, -1967095, 813359, -6367826, --1025423, 287226, 2768643, -3136937, -6251325, -11173894, -14638859, -6475200, -9843528, 25006910, --12280385, 5895917, -11623255, -2961380, 884763, -1556389, -17191680, -88584, -8344585, 851477, -19536732, -6119255, 7994545, 11164767, 3600256, 4661114, 11591043, 3757560, -5021354, 3583613, -4310000, 5215164, 1756642, -2328946, 13518410, 670015, -1517197, -2208150, 3365107, -1083406, --5255430, 4793721, -2212982, 3443490, -13901735, 608812, -3038689, 12215961, -5252208, 3936338, -17830556, -1613297, -70867, -4507568, -8013872, -506806, -1705102, -7831873, 9238475, -2224256, -6568079, 582505, 6170795, -4061965, -1206349, 14371497, 6653978, -11628624, -6441914, 2765422, -3002719, 1358820, 2594160, -3752728, 3599183, 4853850, 11578695, -16179142, 343597, -7379291, -2543695, -1324461, -2458869, -3385508, -8622684, -6808060, -8344048, 9065065, -16994648, -4346507, --10800232, 5708012, 16747151, -8782134, 103616, 1062468, -3751117, 7206419, -5901285, 3262565, --2078764, -6451578, 14958834, 1392106, -5329518, 862215, -2562485, -6117107, 5034776, -4518843, -4721780, -9007620, -4784057, 7238094, 4537633, -15478525, -3154117, -13057237, 3880503, -1561221, --13475460, 16935592, -4716411, 468151, -12446278, -12653511, 628139, -11308112, -1719061, -9635222, --9061307, 11457899, 1082332, -12737799, 4412542, -11278047, 10844256, 4887673, -5278515, 1405528, -3526168, 12454868, -8777303, -11444477, 12766253, -7727720, -4884989, 7796440, 9770514, -16513612, --8438000, 11355894, 7868380, 5233955, -442919, 2578591, -12103218, 8652748, -13242995, -21009370, --17374216, 7925826, -20733954, -796180, 15263777, -1188095, 846645, 11317776, -7670275, -6132140, -24391656, -9612674, 5483063, 9539122, -2040110, -22228604, -2165737, 2488934, -5935645, -2981244, --5523328, 20979304, -124554, 332860, -1358820, -14950244, 2414309, -8585103, -4694400, 994285, -2163590, 4499515, 11762842, 2721936, -3488050, 23862302, 2139968, -5899675, -22184042, -3201361, -15612743, -3508988, -10397579, -13476534, -12218108, -10170483, -6756521, 16865262, 6183679, 854162, -9008157, 14025216, 7474854, -3261491, -2924336, 14445049, -3340411, -4729296, 3795141, 10929618, -1121523, -11824582, 2155537, -1520418, -17721572, -1709934, 13149042, -7250442, -8499203, -2458869, -17751100, -15231565, -3744138, -8268886, 17121888, 1996086, -15733539, -312459, 4436165, -288300, --7272990, 7013145, -5422396, 14099304, -10801306, 9791989, 20568062, -5294084, -5681168, -4559645, --4459787, 18852758, -13853417, -14728517, -11626476, 4562329, -6111202, -9334038, -4561792, 7035157, --9388799, 5543192, 1149441, 7670275, 10726144, 1745367, -1423245, -1640678, 10597832, -2298344, -3737159, -12577812, -122407, -4177930, 10371272, -13372918, 11390790, -4299263, -7103339, 11943767, -19883552, -10644540, 5705864, -1947231, 4097936, -29259464, -23527830, -13792751, 2166811, -8547522, -4039417, 1518808, -10937671, -8188892, 1101659, 24293408, 5749888, -14247480, -21955872, -11135776, --7992398, 15062450, -9901510, -13938243, 3642669, 3557307, -13123809, -589484, 6979, -6690486, -3687766, 29661582, 19683836, -5338108, 2111513, 19082002, -7501698, 408559, 8396124, 20635708, -12343736, -3939022, -4605816, -7545184, 1912334, -4318590, 330712, 173409, 22000970, 36049272, --2180233, 24732032, 15795279, 2836826, 3836480, -18342194, -17900886, -2470680, 4539781, -1749125, -4156455, -7169911, -13539884, -22945862, -2206003, -14959371, -12531104, -8623221, -13002477, -9631464, --898722, 20281910, -1109712, -16395501, -1828046, 3915400, 14924474, -5457293, -4532264, -10056129, -6357626, -28986734, -26221312, -12890271, -13514651, -14256607, -9141301, 8417062, -12421045, -16519518, --14411226, -24387362, 11060615, 5939403, -22366042, 10285910, 20010790, 41363220, 21642340, -656593, -6095633, -24311126, -11458436, 13065827, 9459129, -5301064, -31964220, -1854889, 48485348, -2574833, -637266, 13422847, -19305878, 11177116, 33972116, 33469606, -34047280, -30477624, -1280437, -33168958, --14213657, 864899, 2612951, 13334800, 17381732, 17397302, 27838904, 7745437, 10101226, 12461311, --6371584, -1287417, 1722282, 4630512, 7143605, -14920716, 33605436, 15795279, 14855755, -2353642, -34097744, 5105106, 19903952, 9567040, 5105106, -7765301, -7102266, 18796388, 5316633, 9041443, --20870856, -9689446, -17734994, -8805220, -13396540, 461709, -24982214, -24708946, -3274913, -9234180, --49364744, -34934192, -33880848, 9576703, 32806034, 45302780, -26644904, 31357556, 46268072, 8627516, -2239826, -2631741, 31333398, 2999498, 28265716, 13440563, 12499429, -19236622, -67281200, -51207820, --12307766, 439160, -4864051, 25325274, -6584185, -42319924, -5140002, 70458936, 11323681, -11801496, -16489990, -4583804, 10218264, -4431870, -8960376, -21728776, -10066866, -1428614, -5340792, -9898826, -14824616, -13809394, -17504140, -128849, 901943, 15446313, 4845260, 4893042, 4468914, -5055714, --1638530, 22501870, -12882754, -25026774, -7032472, 3027952, -10633802, 18756122, -11395085, -5393942, -13173202, 4912369, 9391483, -26089242, -32200980, 10546292, -8016020, -9720048, -15161771, -15427523, --35465156, 485868, -5360656, 11382200, -23744726, -43924632, 30438970, 9299141, 28332288, 3569118, --12955232, -9361955, 5029944, -16751446, 22550188, 4879083, 27507654, 21176336, 42267312, -5215164, --48172352, -35322884, -23926726, 23900420, 20608864, -21805012, 14681272, 35783520, -29113972, -37147172, -38476464, 50758996, 9535901, 1687385, 11984032, -8504035, 22972706, 11868605, 23964844, -5437966, --24239184, 54287312, 806917, -21383568, 3013457, 36457828, 17474612, 6555731, -23132694, 1808718, --12209518, -9966472, 4067334, -18291192, 1837172, 3943854, 21466246, -30790620, -4804458, -4383551, -18127446, -7579544, -10839424, -11344619, 74625, 10586021, -23153094, 907849, 6300717, -48536888, -6698002, -13727789, -33573224, 21347598, -24831354, -44394392, 57607324, -1203128, 3292629, -5279052, --16112033, 34055332, -24730422, -2983929, 4985920, -16496433, -1546188, 43365748, 22407382, -39240968, --42306500, 40975600, -20188494, 23848880, 39177080, -35700304, -61954368, -42264624, 70080984, -3630858, --56396680, 51933132, -38074348, -68276024, -2396592, 63445256, -3219615, -22526566, 35526896, -5509906, -9244380, 26124138, 15031312, 20288888, 42145440, 21230560, -13131326, 9047349, 8676908, 16513076, --18349174, 44710608, 38029252, 7647726, 11647414, -7821136, -2360085, -41515152, 17667348, -20941186, -13147432, 300111, -18409304, 25705916, -11817066, -15509664, 7012071, -22750978, 14053133, 2870112, --7227893, 9069360, 7796977, 17680770, 13266617, 17325898, 42591044, -2120103, 2299418, 16653736, -27777700, -558346, 5389647, 2620467, 21061446, 30845918, -12001749, 9489730, -4100083, -1807108, --54524072, 7072738, 19050328, -9245454, -15656230, 14729053, -24609626, -28483686, -326954, 21984864, -34861176, -44802416, 15355045, 2180770, -4919348, 5591511, 15406048, 47440060, -3367254, -21990770, -5087389, 44297756, 23466090, -44339096, -34619048, -549219, -53385368, -18246094, -19746650, 41193568, --1171452, -15111842, 18953690, -9590662, 10546829, 2799782, -20286204, 24452860, -54895588, -5096516, -3483219, -13625247, 10314901, 2590402, -10530723, -1819456, 1855963, 14002667, 1109712, -15982110, --53061636, -38778184, -29298656, -14596446, 33495376, -6548215, 1703491, -53291956, 4519380, -3563749, --6665253, 1847373, -51037632, 27837830, -24375014, 12898324, -9474698, 35360464, -18331994, -33914136, --15410343, -121333, 26622892, 46716360, 50116900, -60153700, -43282532, -30612380, 22339736, 49780280, -61731564, -10239202, -13091060, -52564496, -17331266, 47299936, 31339840, -229781, 3078418, -714038, --40962712, 30363808, -4472672, 29457034, 75491568, -77176808, 102184792, 27326192, -40305048, -44378288, -36662376, -21905406, 22435836, 12211666, 14058502, 8639327, -28771986, 31398896, -4904316, -10879689, --10492605, -12091407, 9280887, -6226092, 13321378, 8339216, -2032593, -2995203, -24093156, 14127758, -5410048, -5850819, 5078799, 12856985, -3808026, 7421167, -12332999, 14601815, -5539434, 2128156, -5624797, 6382322, -6558415, 22365506, -1033477, -20435992, -1536525, 9874130, 4574140, -15556372, -7584376, 18785650, -3584687, -8661338, -8854075, -900333, 5019743, -1926293, 21657910, -14285061, --5597953, -4877472, -10875394, -622233, -3257733, 8247948, 5874442, -8688719, -1168768, 8605504, --8509404, -4275640, -2254321, 13609678, -7793218, 5880347, 9715216, -20775830, -7378754, 6484327, --20199768, 32344862, 11212549, 9054865, 19843822, 51882132, 6342056, -17064442, -13917305, -9760313, --1340030, -1247151, 780610, -982474, -2332704, -28693066, 300111, -5355824, -7051800, 4152160, --11755325, -4721243, 4992363, -7493108, 1966558, 9533217, -12513924, 8209830, -4810900, -5960878, --1316408, -5946919, 2758980, -5465346, -3474092, -6522445, -1642825, 483184, -416612, -3653944, --4670777, 1967095, 2085207, -4449049, 6663642, -7822209, -977642, -2697776, -1300838, -882079, --6951405, 9972377, 5457830, -8498667, 11065983, -352187, 2205466, -4267050, 10618233, -9947681, -621160, 1823214, 2669322, -850404, -2985002, 9050033, -5537824, 2230699, 246424, -555125, -2401424, -2357937, -660888, 5738613, -2426657, -733903, 4980552, -549219, -2274185, -3150896, -2643016, 4165045, -24603184, -41523208, 46290084, 153218656, 16207059, 34741992, -83122112, -128543000, --31609348, -67428304, 52617108, 106619344, 57036628, 35136052, -7486665, -42201812, -40380744, -31390306, --28053652, 9586904, 18800682, 9947144, 20191178, 1969779, 2073932, 7128572, 2723009, 8169565, -7520488, -5912023, -19109384, -15168214, -16792248, -24001888, -11845520, 12440373, 17423608, 30782568, -44944148, 15393163, 6885907, -15526307, -34828964, -34896072, -23405424, -17328046, 3810710, 12332462, -19291382, 19312858, 17380122, 10596221, 1717450, -2227478, -10838887, -8668318, -4594005, -6570763, --1852205, -7347616, -1513439, -8580271, -7058242, 1584306, -341987, 8527121, 16221555, 8198556, -23975044, 19763292, -10112500, -22558778, -20933670, -33113660, -8793409, -9854266, -1106491, 13064217, -7633768, -1311576, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-3154117, 690416, -2771328, -1715839, -1253594, -353261, -445066, -1789391, -5367636, -3997541, +-2841658, -1395864, -3881040, 1618666, -900333, 638876, -1604707, -575526, -2429341, 2540473, +501437, -1779727, -3200288, 312996, 3591667, 1978906, -3655017, -3510062, 656056, 300111, +410706, -2443837, 530428, -883690, -1581085, -469225, -1490354, -2250563, -1051730, -3828963, +4952098, 1385664, 3439195, -3332895, -5646809, -444529, 726386, -625992, -5243618, 306016, +-1304060, 3092913, 2091112, 2322504, 5333276, -921807, -187905, -1628330, -805306, 1934883, +-3631395, 4267050, 5105106, -2404645, -1676111, -4257387, -2229088, 862752, -1294933, -2566780, +281857, -2709588, -1395864, -3434363, -2870112, -3156801, 2104534, 6383395, 455267, 4291209, +-1053878, -557272, -2368675, 4565014, 2754685, -2595771, -3593814, 2321967, -995359, -5324149, +-6333466, 1521492, 193810, -2057289, -2243584, -4147865, 2546916, -4888747, 1125818, -448824, +974958, 441308, 906775, -2180233, -479963, 906775, 1250909, -474057, 1558536, 1295470, +-2371359, 1677722, -1518271, -4172561, 5760088, -1117765, 53687, 1449552, -979789, 3319473, +3961034, -874026, 1317481, 3191698, -13422, -3326452, -2867965, 874563, 1680943, -984084, +749472, 3918084, -3788698, -3038689, 2822331, 659814, -1718524, -2029372, -572841, 795643, +1913945, -3847754, 1330366, 1078574, -3729105, -3206730, 2043868, -1678259, -4968741, -1581085, +-1531693, 6293738, 5272609, -7813620, -3304441, -5403606, 3563212, -2643552, -3582540, -2507724, +-3205119, -689879, 1262184, 5833640, 1074279, -3175055, 5019743, 158914, 5174899, -4943508, +7981123, 3643206, 8653822, -1568200, -2853469, -615254, -4653597, -424128, -264141, -1731409, +1680406, 142271, -3675418, -923418, 64961, 1151588, 3805878, 852551, -5527086, -4676146, +-1687922, 3151432, 295816, 158377, -2754685, 4678830, -36507, 353798, -1921461, 611496, +-1121523, 2472291, -696322, 7813083, 166967, -994822, 3055332, -1931125, -3397319, -1408749, +2748242, 4747550, 893890, 2933463, 826781, 549219, -2350421, -2343979, -3833795, -93416, +-3972308, 1116692, 3489661, 3685082, 2665564, -1132261, -1646046, 3390877, 5618354, 5676873, +3284576, -192200, 4967130, -2788508, -3900904, 3762391, 4293894, 5023501, 7869991, 523986, +-4753992, 2641942, -4531728, -524523, 1714229, 909996, 8726837, 460098, -6774774, -542240, +1366337, 2675765, -370978, -2581812, -7486128, -1736777, 6577743, 1984275, 4362613, 4718022, +4246112, 886374, -613107, 4145180, -5549635, -460098, -3744138, 10015864, -463320, -22012, +4683662, -4149475, -512175, 1275068, -491774, 5798743, -865973, 1488743, 5968931, -1532230, +1926293, 83215, -206158, -484794, -695785, -2151242, 2623151, 2942053, -747324, 2899103, +1322313, 6196027, 7777649, -979789, 2148558, 659814, -3783866, 3150359, -839129, -3960497, +1482838, 2962454, 1202591, -1854889, 8439611, 8529268, -3437585, -4677757, -4333085, -2755759, +2028298, -9052717, -1018444, 1399086, -4516695, -8006893, 7776039, -1582696, -2103997, 1386201, +3525095, 3362423, -4140885, -1484448, -271120, -323196, 1794223, 2893734, -1631551, 3531000, +-2658585, 5352066, -721555, 319975, -2773475, 2873333, 935229, -696858, -2757369, 1367947, +-1598265, -2246268, -2041720, 558883, 1655173, -4871567, 357556, -9274445, -5473399, 3441880, +-1468879, 1188095, 2033667, 6223945, -2035278, -3048890, -262530, 241592, 2550137, 2529199, +-2921115, -1244467, 6773164, 270046, 1012539, 572841, 3007551, -5701569, 177167, 2825552, +5280126, 1031329, 2270964, 7927973, -1973001, -917512, -4336307, -164819, 1371705, 2499671, +-5361193, -8586713, 3718905, -2863133, 235686, -4471061, 3467649, -9917616, -7998840, -9365176, +-3059627, -2071248, -6411313, 3188476, 8904004, -6637872, 1411971, 10271414, -2365990, -2967823, +-4749160, 706522, 1611, 4461398, 1529545, 3158949, 2339684, -3544422, -6592775, -3312494, +3951907, -2416993, -4038880, 834297, 1664300, 1103807, 828392, 8844411, -4287988, 4711579, +-2379412, 2247342, -2661806, 7291781, -5638219, 2823941, -500901, -4737349, 4125853, -1937030, +-1532230, 4198868, 2331094, -692564, -2046552, 3757560, 1941862, -4540854, -5107253, 3083250, +5481989, 2749316, 38655, -2829847, 186294, 3115999, -1632625, 3827890, -1115618, -9230958, +170725, -4361540, 12349642, 3801046, -7107097, -4466766, -994822, 39728, 3587372, -7589744, +-8516920, 7243463, -1286343, -7580618, 938450, -2243584, 7712151, 3274913, -1563905, 961536, +-61203, -1528472, -1022202, 8144332, 1968169, 9127, -5583458, -3143916, -1106491, 2528662, +4023311, 11057930, 529355, -130460, -127238, 259309, -4866735, -314606, 2298881, -6878390, +-4275103, -4671314, -347355, 7844758, -6713571, 550293, 3995930, 1029182, -3088082, 2851858, +-8465917, 6322192, -1427540, -712965, 3878356, -5077188, -5028333, -8647380, 1702418, -3379066, +7473780, 1758252, 172872, 548682, 2234457, 4939750, -2650532, -2249489, 6023155, -2269890, +-3609383, -1202591, 5961415, 5054640, 5456756, 1827509, -4012036, 2284386, 4811437, -7547868, +7352984, -6482180, -4917201, 4703526, -16230145, -10058277, 2429878, 5478231, 10462003, -6215892, +5444408, 1475321, 5756330, 81068, -3223910, -3326989, 3420942, 11625403, 591095, -584116, +-11065446, -8559870, -292058, -6183679, -4220342, 788127, 1010391, -6345814, -2355253, 2045478, +3636227, 2523830, -4690105, 396211, 4723927, 4514011, 543313, -3731253, 464393, -2123325, +927713, 1824824, 2027761, -2779381, 3727495, 10188199, -1258425, -321049, 1645509, -5045513, +2334315, 8278550, -7988103, -8755828, -4946729, 1155346, -12048994, 687732, 165893, 2042794, +-36507, 207232, -5756330, -2660732, -3754338, -135291, 8002061, 12259447, 312459, 1119376, +5833103, -2119566, -914291, 2983929, 13554917, 1940252, 5071820, 9587978, 2117419, -6078453, +3155727, 8653822, 4621385, -7028177, -818728, 16684874, 13802951, 3542274, 8133595, 11191611, +2207613, 382789, 6519224, -2622615, -402653, -5803575, 4714801, 121870, -222265, 2904472, +2283849, 9368397, -7900593, -6188511, 6240051, 1963337, 2582349, -4685810, 460098, -1241782, +2961917, 667331, 4352950, 5400385, -5368172, 4682588, 2856153, -4931160, 13810467, 3178813, +2252710, -10434623, -4119411, -186294, 8731132, 9392557, -1462973, -8796630, 5639829, -7525320, +-3195456, 8078297, -848793, -5050882, 6440841, 9800042, -2961917, 3923453, -4312147, -11553462, +-682363, 9039832, -4486094, -3200825, 4434554, -4844723, -10016937, 3520800, 5213554, 12642773, +4858145, -6893960, 2395518, -8128226, -12927852, 12965969, 3749507, 6914361, 17204566, 10358387, +-6838125, -2385854, 175020, 2555506, 2834142, -1428077, -6078453, 1235340, -3999152, 6639483, +732829, 2361695, -1751273, -1354525, -6297496, -3947612, 14994805, 4479114, -8211441, 3886946, +-7988639, -6334540, -12817256, 5593121, 870805, -29528, 3852586, -598611, -5404680, 9922448, +6513318, -2437394, -9473624, 10040560, -6245956, 2525978, 529355, 3192235, 2842732, 6356552, +8351564, -1877975, 5039608, 11768210, 2448131, -3821447, -2437931, -2178622, 2848637, 7874286, +-1132261, 3187940, 1720134, -7277822, 1427003, -1775969, 4750234, -10887205, 1087164, -18145700, +-9701794, -10056666, -1149441, -9893994, 8268349, -2308545, -6691559, -1967095, 813359, -6367826, +-1025423, 287226, 2768643, -3136937, -6251325, -11173894, -14638859, -6475200, -9843528, 25006910, +-12280385, 5895917, -11623255, -2961380, 884763, -1556389, -17191680, -88584, -8344585, 851477, +19536732, -6119255, 7994545, 11164767, 3600256, 4661114, 11591043, 3757560, -5021354, 3583613, +4310000, 5215164, 1756642, -2328946, 13518410, 670015, -1517197, -2208150, 3365107, -1083406, +-5255430, 4793721, -2212982, 3443490, -13901735, 608812, -3038689, 12215961, -5252208, 3936338, +17830556, -1613297, -70867, -4507568, -8013872, -506806, -1705102, -7831873, 9238475, -2224256, +6568079, 582505, 6170795, -4061965, -1206349, 14371497, 6653978, -11628624, -6441914, 2765422, +3002719, 1358820, 2594160, -3752728, 3599183, 4853850, 11578695, -16179142, 343597, -7379291, +2543695, -1324461, -2458869, -3385508, -8622684, -6808060, -8344048, 9065065, -16994648, -4346507, +-10800232, 5708012, 16747151, -8782134, 103616, 1062468, -3751117, 7206419, -5901285, 3262565, +-2078764, -6451578, 14958834, 1392106, -5329518, 862215, -2562485, -6117107, 5034776, -4518843, +4721780, -9007620, -4784057, 7238094, 4537633, -15478525, -3154117, -13057237, 3880503, -1561221, +-13475460, 16935592, -4716411, 468151, -12446278, -12653511, 628139, -11308112, -1719061, -9635222, +-9061307, 11457899, 1082332, -12737799, 4412542, -11278047, 10844256, 4887673, -5278515, 1405528, +3526168, 12454868, -8777303, -11444477, 12766253, -7727720, -4884989, 7796440, 9770514, -16513612, +-8438000, 11355894, 7868380, 5233955, -442919, 2578591, -12103218, 8652748, -13242995, -21009370, +-17374216, 7925826, -20733954, -796180, 15263777, -1188095, 846645, 11317776, -7670275, -6132140, +24391656, -9612674, 5483063, 9539122, -2040110, -22228604, -2165737, 2488934, -5935645, -2981244, +-5523328, 20979304, -124554, 332860, -1358820, -14950244, 2414309, -8585103, -4694400, 994285, +2163590, 4499515, 11762842, 2721936, -3488050, 23862302, 2139968, -5899675, -22184042, -3201361, +15612743, -3508988, -10397579, -13476534, -12218108, -10170483, -6756521, 16865262, 6183679, 854162, +9008157, 14025216, 7474854, -3261491, -2924336, 14445049, -3340411, -4729296, 3795141, 10929618, +1121523, -11824582, 2155537, -1520418, -17721572, -1709934, 13149042, -7250442, -8499203, -2458869, +17751100, -15231565, -3744138, -8268886, 17121888, 1996086, -15733539, -312459, 4436165, -288300, +-7272990, 7013145, -5422396, 14099304, -10801306, 9791989, 20568062, -5294084, -5681168, -4559645, +-4459787, 18852758, -13853417, -14728517, -11626476, 4562329, -6111202, -9334038, -4561792, 7035157, +-9388799, 5543192, 1149441, 7670275, 10726144, 1745367, -1423245, -1640678, 10597832, -2298344, +3737159, -12577812, -122407, -4177930, 10371272, -13372918, 11390790, -4299263, -7103339, 11943767, +19883552, -10644540, 5705864, -1947231, 4097936, -29259464, -23527830, -13792751, 2166811, -8547522, +4039417, 1518808, -10937671, -8188892, 1101659, 24293408, 5749888, -14247480, -21955872, -11135776, +-7992398, 15062450, -9901510, -13938243, 3642669, 3557307, -13123809, -589484, 6979, -6690486, +3687766, 29661582, 19683836, -5338108, 2111513, 19082002, -7501698, 408559, 8396124, 20635708, +12343736, -3939022, -4605816, -7545184, 1912334, -4318590, 330712, 173409, 22000970, 36049272, +-2180233, 24732032, 15795279, 2836826, 3836480, -18342194, -17900886, -2470680, 4539781, -1749125, +4156455, -7169911, -13539884, -22945862, -2206003, -14959371, -12531104, -8623221, -13002477, -9631464, +-898722, 20281910, -1109712, -16395501, -1828046, 3915400, 14924474, -5457293, -4532264, -10056129, +6357626, -28986734, -26221312, -12890271, -13514651, -14256607, -9141301, 8417062, -12421045, -16519518, +-14411226, -24387362, 11060615, 5939403, -22366042, 10285910, 20010790, 41363220, 21642340, -656593, +6095633, -24311126, -11458436, 13065827, 9459129, -5301064, -31964220, -1854889, 48485348, -2574833, +637266, 13422847, -19305878, 11177116, 33972116, 33469606, -34047280, -30477624, -1280437, -33168958, +-14213657, 864899, 2612951, 13334800, 17381732, 17397302, 27838904, 7745437, 10101226, 12461311, +-6371584, -1287417, 1722282, 4630512, 7143605, -14920716, 33605436, 15795279, 14855755, -2353642, +34097744, 5105106, 19903952, 9567040, 5105106, -7765301, -7102266, 18796388, 5316633, 9041443, +-20870856, -9689446, -17734994, -8805220, -13396540, 461709, -24982214, -24708946, -3274913, -9234180, +-49364744, -34934192, -33880848, 9576703, 32806034, 45302780, -26644904, 31357556, 46268072, 8627516, +2239826, -2631741, 31333398, 2999498, 28265716, 13440563, 12499429, -19236622, -67281200, -51207820, +-12307766, 439160, -4864051, 25325274, -6584185, -42319924, -5140002, 70458936, 11323681, -11801496, +16489990, -4583804, 10218264, -4431870, -8960376, -21728776, -10066866, -1428614, -5340792, -9898826, +14824616, -13809394, -17504140, -128849, 901943, 15446313, 4845260, 4893042, 4468914, -5055714, +-1638530, 22501870, -12882754, -25026774, -7032472, 3027952, -10633802, 18756122, -11395085, -5393942, +13173202, 4912369, 9391483, -26089242, -32200980, 10546292, -8016020, -9720048, -15161771, -15427523, +-35465156, 485868, -5360656, 11382200, -23744726, -43924632, 30438970, 9299141, 28332288, 3569118, +-12955232, -9361955, 5029944, -16751446, 22550188, 4879083, 27507654, 21176336, 42267312, -5215164, +-48172352, -35322884, -23926726, 23900420, 20608864, -21805012, 14681272, 35783520, -29113972, -37147172, +38476464, 50758996, 9535901, 1687385, 11984032, -8504035, 22972706, 11868605, 23964844, -5437966, +-24239184, 54287312, 806917, -21383568, 3013457, 36457828, 17474612, 6555731, -23132694, 1808718, +-12209518, -9966472, 4067334, -18291192, 1837172, 3943854, 21466246, -30790620, -4804458, -4383551, +18127446, -7579544, -10839424, -11344619, 74625, 10586021, -23153094, 907849, 6300717, -48536888, +6698002, -13727789, -33573224, 21347598, -24831354, -44394392, 57607324, -1203128, 3292629, -5279052, +-16112033, 34055332, -24730422, -2983929, 4985920, -16496433, -1546188, 43365748, 22407382, -39240968, +-42306500, 40975600, -20188494, 23848880, 39177080, -35700304, -61954368, -42264624, 70080984, -3630858, +-56396680, 51933132, -38074348, -68276024, -2396592, 63445256, -3219615, -22526566, 35526896, -5509906, +9244380, 26124138, 15031312, 20288888, 42145440, 21230560, -13131326, 9047349, 8676908, 16513076, +-18349174, 44710608, 38029252, 7647726, 11647414, -7821136, -2360085, -41515152, 17667348, -20941186, +13147432, 300111, -18409304, 25705916, -11817066, -15509664, 7012071, -22750978, 14053133, 2870112, +-7227893, 9069360, 7796977, 17680770, 13266617, 17325898, 42591044, -2120103, 2299418, 16653736, +27777700, -558346, 5389647, 2620467, 21061446, 30845918, -12001749, 9489730, -4100083, -1807108, +-54524072, 7072738, 19050328, -9245454, -15656230, 14729053, -24609626, -28483686, -326954, 21984864, +34861176, -44802416, 15355045, 2180770, -4919348, 5591511, 15406048, 47440060, -3367254, -21990770, +5087389, 44297756, 23466090, -44339096, -34619048, -549219, -53385368, -18246094, -19746650, 41193568, +-1171452, -15111842, 18953690, -9590662, 10546829, 2799782, -20286204, 24452860, -54895588, -5096516, +3483219, -13625247, 10314901, 2590402, -10530723, -1819456, 1855963, 14002667, 1109712, -15982110, +-53061636, -38778184, -29298656, -14596446, 33495376, -6548215, 1703491, -53291956, 4519380, -3563749, +-6665253, 1847373, -51037632, 27837830, -24375014, 12898324, -9474698, 35360464, -18331994, -33914136, +-15410343, -121333, 26622892, 46716360, 50116900, -60153700, -43282532, -30612380, 22339736, 49780280, +61731564, -10239202, -13091060, -52564496, -17331266, 47299936, 31339840, -229781, 3078418, -714038, +-40962712, 30363808, -4472672, 29457034, 75491568, -77176808, 102184792, 27326192, -40305048, -44378288, +36662376, -21905406, 22435836, 12211666, 14058502, 8639327, -28771986, 31398896, -4904316, -10879689, +-10492605, -12091407, 9280887, -6226092, 13321378, 8339216, -2032593, -2995203, -24093156, 14127758, +5410048, -5850819, 5078799, 12856985, -3808026, 7421167, -12332999, 14601815, -5539434, 2128156, +5624797, 6382322, -6558415, 22365506, -1033477, -20435992, -1536525, 9874130, 4574140, -15556372, +7584376, 18785650, -3584687, -8661338, -8854075, -900333, 5019743, -1926293, 21657910, -14285061, +-5597953, -4877472, -10875394, -622233, -3257733, 8247948, 5874442, -8688719, -1168768, 8605504, +-8509404, -4275640, -2254321, 13609678, -7793218, 5880347, 9715216, -20775830, -7378754, 6484327, +-20199768, 32344862, 11212549, 9054865, 19843822, 51882132, 6342056, -17064442, -13917305, -9760313, +-1340030, -1247151, 780610, -982474, -2332704, -28693066, 300111, -5355824, -7051800, 4152160, +-11755325, -4721243, 4992363, -7493108, 1966558, 9533217, -12513924, 8209830, -4810900, -5960878, +-1316408, -5946919, 2758980, -5465346, -3474092, -6522445, -1642825, 483184, -416612, -3653944, +-4670777, 1967095, 2085207, -4449049, 6663642, -7822209, -977642, -2697776, -1300838, -882079, +-6951405, 9972377, 5457830, -8498667, 11065983, -352187, 2205466, -4267050, 10618233, -9947681, +621160, 1823214, 2669322, -850404, -2985002, 9050033, -5537824, 2230699, 246424, -555125, +2401424, -2357937, -660888, 5738613, -2426657, -733903, 4980552, -549219, -2274185, -3150896, +2643016, 4165045, -24603184, -41523208, 46290084, 153218656, 16207059, 34741992, -83122112, -128543000, +-31609348, -67428304, 52617108, 106619344, 57036628, 35136052, -7486665, -42201812, -40380744, -31390306, +-28053652, 9586904, 18800682, 9947144, 20191178, 1969779, 2073932, 7128572, 2723009, 8169565, +7520488, -5912023, -19109384, -15168214, -16792248, -24001888, -11845520, 12440373, 17423608, 30782568, +44944148, 15393163, 6885907, -15526307, -34828964, -34896072, -23405424, -17328046, 3810710, 12332462, +19291382, 19312858, 17380122, 10596221, 1717450, -2227478, -10838887, -8668318, -4594005, -6570763, +-1852205, -7347616, -1513439, -8580271, -7058242, 1584306, -341987, 8527121, 16221555, 8198556, +23975044, 19763292, -10112500, -22558778, -20933670, -33113660, -8793409, -9854266, -1106491, 13064217, +7633768, -1311576, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, { -6125697, -1522566, -2790655, -7104950, -2758980, 654983, -1326071, 2278480, -3286187, -1293859, -2513630, --1180042, 1643362, -267899, -94489, -1381369, 2288144, -5952825, 584116, -3075197, 2193655, -1506997, -3591667, 671089, -427886, 933619, -1331977, 1057099, -3933116, -2491081, 5079336, --1430761, -1890859, -2262911, -654446, -1429687, -512175, -3594351, -411243, 4619774, -987843, -863825, -95026, -1367947, 6444599, -1275605, 3697967, 4507032, -292595, -1640141, -1067836, --3859028, -3624416, -3997004, -4694936, -2481954, -3256659, 890669, -3137474, -907849, -1837709, --270046, 820876, -3737159, 3806415, 811749, 1660542, 3340948, -3020973, 1801202, 3497177, --3479997, 736050, 2767570, 1246077, 1465658, -6023155, 3957276, 6521908, 1672353, 5761162, -65498, -5881958, -4111358, -4276714, -706522, -2928631, 6893960, -5156645, -1357210, -2327336, --870268, -4131759, 3954591, -2426657, -1964411, 3387119, 5529771, 6334003, 923418, -428423, -1261647, 357556, 837519, -2832531, -3129421, 1525787, -2845416, -2769180, -3802120, -3911105, -1134408, -2583423, 3411815, -4320200, -662499, 1935957, 1745904, 1626719, -6813429, -1188632, --3819837, -629750, -1657857, -4087198, -180389, 4921496, 1389959, 2399813, 2145336, 2668249, -220654, 3341485, 1966021, 3726421, -2236067, 2491081, -1365800, 1723893, 35970, -3415036, -3830037, 4537633, -2623151, -3037079, 1117765, 4161823, 742493, 1105417, -1688459, -282931, -1895691, 1427003, -159451, -10110890, -2695092, -4542465, 3326452, -9475235, 2054068, -4157528, --2243047, 1382980, 158914, 1098438, 1392643, 1108102, 4097399, -1796907, 403190, -378494, --5048734, 3740380, 6155225, -4990752, -4751308, 3632469, 896038, 4475893, 1377611, 5998996, --853088, 2054068, -3178276, -909996, 6043556, 536871, -3985730, -4831302, -5302674, 279173, -4344360, 2277407, -54224, 5034239, 3938485, 219580, -4092567, 6426882, 1597728, 4974646, -4960151, -799401, 3150359, 3831111, -482110, 2298881, 2545842, -2389613, 482647, -678605, -2416456, -5495948, -3607236, 1901060, -3490198, -1232656, 4759898, -1833951, 2600066, -1014149, --7555921, 1380832, -71404, 4065187, -6229313, -3222836, 2770791, 802622, 6448357, 6669011, -3034931, 4918812, 3965866, 6685117, 7766375, -2916820, -743566, 2533494, -7595650, -308701, --2443837, -1513976, 3608846, -4517232, -427349, 5640366, 1149978, 3603478, -1698660, -1353452, --1806571, -7256347, -1072131, 460635, 3935801, -1189169, 6694244, 2566243, -1010391, 2607045, -1493038, 3360812, -2307471, -524523, 7816841, -1037772, 7398618, 3396782, -3029563, 758062, -6545530, 3325915, -4046396, 5827197, -1423782, 403190, 484258, -1160715, 1307818, 666794, --5064304, 3384434, 2666638, -421444, 415001, -1134945, -4518306, 54224, 2927020, -484794, --287763, -3128884, -6696928, -2312840, 2928094, 5983427, -8555038, -4609574, 2079838, -3696893, -2771328, 100395, 571768, -4893579, 9466645, 9973988, -1957431, -4238059, -4541391, 9563818, --8287677, 189515, -1314797, -3922379, -5230734, 1840394, -1404991, -7220377, -8698919, 299574, --613107, -4599373, 1697586, 2394444, -3171833, -4871567, -4478041, 6361384, -6853157, -855772, --8017094, 73551, 4522601, 1510755, 803159, -4533338, -4313758, 3942243, -3023657, -4626217, -599148, -1685238, 2847563, 56371, 1158567, -4600984, -1692217, -1290101, 4424890, 3045132, -3069828, -9097814, 1428614, 2568391, 2057289, 2603824, -2638184, -1618666, 273267, 1900523, -3535295, -561567, 2288144, -2561948, 6918119, -12679817, 4330938, 474057, -6995428, -159451, -7256347, -2113661, -3853123, -6653441, -2745558, 773631, -2495376, 296353, 2212445, 4319664, --4505958, -14098767, 2543158, -6406481, 1378685, 1222455, -851477, 10073846, 522912, -6373732, -8538932, 4176319, 2912525, -1239635, 1746441, -2558727, 6689949, -1061931, 736587, 10177462, -9851044, 4287451, 4496294, 4414690, 4890357, 3350075, -9790378, -2979097, -164283, -2492155, --8338142, -836445, -1999307, -2110977, -4493073, 3758, -1340030, 7245610, -2324651, 12637941, --106837, 1168231, -2354179, -1694902, 62814, -231391, -1036698, -2051384, -1502702, -5989869, -1461363, 1173063, -768262, -2993055, 4254702, 3379066, 3683471, -1080721, -2724620, 323733, -3207267, 3791383, -2855080, -7703024, -4125853, 1236414, 6667400, -491237, 5455682, -3824669, --6307697, 5357435, -2179159, -4333085, 3089155, 4386772, -5557151, -3619584, 5279052, -6244883, --6650757, 3143916, -1852205, -663036, -3461207, -2123861, 3519189, 4794794, 2622078, -1217086, -813359, -672699, -1058173, -4746476, 1633698, -12639552, -3574487, -4097399, 3528316, 4196720, -425202, 2024003, -7747048, 2013803, 1267015, 1997160, -6980396, 13167833, -537945, 2330557, -1807644, -6438156, 1054415, -9175661, 5852430, -2092186, -7483444, 1340030, 641561, -3979824, -477278, 617402, 6029597, 10505490, 4716411, -2411624, 3549791, 4148939, -9904195, -3948686, --4487704, 2476586, 2379949, -1988033, 1686848, 3118683, 2333778, 4086125, 8505109, -238908, --2956548, -1342177, -168041, 6030134, -4495757, -595390, 3328063, 8142721, 427349, -6762426, --5179194, -1584843, -6038187, -2279017, -12999792, -3563212, -4802311, 5565741, 211527, -2671470, --16678432, -2188823, -2199023, 6951405, 16593606, -4728222, 11175505, 1957431, -9710384, -9939091, -1823214, 2604898, -5587216, 6339909, -4381404, 5132486, -6096169, 3104725, 2290828, -5815923, --4820027, -3689914, 2143189, 6592238, -8245801, 441845, -8662412, -359704, -3143916, 2308008, -6729677, 834297, -2531346, -2318746, 7306813, 148713, 11007464, 3461207, -3686156, -3691525, --2724083, 1724966, 7108171, 63888, 11550778, -19586124, -14131516, -11595338, -2226404, -9849971, -1205275, -3557307, 4184909, 9234717, 2272038, 3973382, 6490233, 9778567, 5698348, 1726040, --5660767, -16108275, -16236587, 9558450, 1838246, 12068858, -6899865, -5712307, 7117298, -11788075, -3459596, 8360154, 2915746, -5741835, -685047, 15454366, 12154221, -663036, -11468100, -17971754, --2626909, -5981279, 6089727, -5033165, -5973226, -20422570, -9502078, -18240726, 6392522, -112206, --5094905, 5493800, -1185411, 612570, 826244, -5519033, -2147, -6415071, -1763084, 4693863, -2586644, -6556805, 1999307, 7687992, 11170136, -1282585, -2185065, -3409130, 116501, 6567005, -8081518, -756451, 719407, -1381906, -2057289, 10763725, 6920266, 773631, 7150584, 2704219, --10040560, 2248416, -1535988, 12697534, 4194573, 1988033, 5309117, 8378408, 1577864, -6567005, --12589623, -2358474, 1862942, 6803765, 2629057, 754841, 1837709, 9810242, 1397475, 3350075, -3648575, 2736968, -6867653, -6842420, -6810745, -6980396, -7097434, 9822590, 26246008, 5699959, --8055211, 4629438, -4687420, -15602006, -3132642, -15315853, -8347269, 7807714, 10516227, 3973382, -2166274, 790274, 1943473, 9863392, -7085623, 13990319, -9130027, -9415642, 11253888, 4862977, --18187040, 7800735, 4627291, 5602248, 11964705, 5737540, 8889509, -790811, 4806606, -3044058, -7572564, 1786706, 1590749, 4852240, -10290742, -5775121, -3197603, 6312528, 2791192, 2087891, -5144834, 1237488, 1764158, -9559523, -8053, 9705552, -1916629, 901406, 1131724, 940061, -11833172, 4245575, 15949361, 3326452, -2500745, 14909442, -13423920, -2164127, -2355253, -5745056, --1515050, 2696703, 14833206, 901943, -3653407, -6511171, 2628520, -6875706, -3286187, -4738960, --9124121, -2187212, 1124208, 11897596, -2909304, -10002442, -13974750, -5817533, -13748727, 9718437, --11644730, -9556839, -6619619, 5935645, 16963510, -17187922, -5318244, -19299436, 5953362, 2049773, -2348273, -5948530, 2057826, 20525112, -10437844, -2422899, 8593156, 4883378, 4789426, 6845104, -5559835, -7517267, -11099269, -2773475, -5861020, -9437117, -10182294, -419296, -1874216, 2066953, -14601815, 8220031, -7154879, -4843650, -188442, -4666482, 4115116, 25876642, -8279623, 17848274, -6529961, 2450816, -454193, -3670050, 3909494, -10843719, 5668283, 13683229, 1449015, 1565516, -12395276, 6714108, 5375689, -10507637, 9091372, -6626598, -7626788, -24296630, -6269042, 14266271, --7459822, 2919504, -15174119, 10663867, -4747550, -7770133, 11973295, -17934172, -10146323, 16694538, --10631655, -15522549, 1539746, -10394895, -8083666, -884226, 11839077, -5513665, 20955682, 19891068, -3661460, 6496675, -11659762, 1602560, -9487583, 14976551, -3190624, 4543002, -7300371, -4386772, -2276333, 2180770, -7031399, 11523397, -3460670, 2592550, 3969624, -7237020, 2544768, -9283572, --232465, 5588826, 6176700, 353798, 8249022, 10983305, -1103270, -19963544, -3701188, -5746130, -14134201, -11955578, -15468862, -10555956, -7560753, 2369211, -8920647, -6456947, -4664872, -934155, -2306398, -29248728, 18319646, 14926622, 20928302, -6369437, 3043521, 14714558, -14025216, -12145631, -2113661, 9881109, 5734855, -972810, 2483028, -6746320, -9293235, -10522133, -3714610, 40351756, -2820183, -20587388, -4181151, -10416369, 7362111, 7919383, -13329968, -6106370, -10813117, -22126060, -2230162, -18522046, 9053254, 2587718, -14084272, 7929584, 10041634, 12933220, 4410395, 4963909, --14549202, -543850, -2377265, 13911936, 7250979, 435939, 13917305, 14555644, -1029718, -7183333, -2458332, 18040474, -11005854, -9443022, 10200010, 5054640, -11135240, -2696166, -10198400, 20761336, --16751983, 4948339, 12048994, -6624987, 11201275, 3741990, -3963181, -5266704, -4299263, -8304856, -12824235, 15843061, 4386236, -11793443, 2568927, -13009456, -3667902, 8929774, -180926, -6250788, --3300682, 2599529, -16018081, 967978, -122943, -9684078, 15622407, -13014825, 1053341, -2496987, --7920994, 11359115, 1457605, 6983080, -2588255, -87510, 2189897, -5296232, 8105140, -4541928, -2543158, -4068408, 20269562, 9120900, 20282984, -558883, -13234405, -7516193, 9788767, 12549894, -16070157, -787053, -2286533, 19541028, 10276246, 21851720, 4000762, 597537, -10019622, -5989869, --5484137, 4783520, 4488241, 11124502, -13267691, -474057, -7459822, 6230924, -11379516, 3246459, -14880988, -3593814, 639950, -8755828, 2998961, -8829379, -23767276, 1809255, -2800319, 97174, --10080288, -4094715, 10660646, 17026324, -979789, -8531953, 11841762, 3348464, 3584150, 11068668, -5396627, -8749385, -2402497, 6398965, -280247, 5613523, -8223789, -10128607, 3616363, -9716827, --13763223, -8932458, -15822660, -6008123, 6280316, -15440944, -1227287, -17512730, -5967857, -2839510, -6357089, -20757040, 8140037, -1889249, -10443213, 9698036, -4881231, -594853, 22812182, 21646636, -67646, 32029718, 36687612, 1996086, 11781632, 11346767, -1489817, -26268556, -614180, -909996, --9897215, 7619272, 7045357, -14164802, 7999914, 10284836, 1865090, -3571802, 5699422, -3390340, -18951006, -2903398, -8449274, 450972, 4575214, -1403917, -868120, 46171, -29386704, 9008694, --239444, -20142322, -8054138, 4022237, -1412507, -13533979, 5440113, -16034724, -879931, 2171106, --25894358, -4181151, 12124693, -7928510, 2023467, 17382806, 11120207, 13471702, 4911295, -6539088, --11408507, 13463112, -5501316, 7878044, -10609643, -5402532, 9751723, 15101105, 3507378, 17951890, --9955734, 15647103, -10852309, -14331232, -8898098, 15579994, 17643726, -13569412, 9876277, -38866232, --713501, 12066711, 7198902, -6148246, -11143293, 6325413, -27980638, 1129576, 36884644, -25266218, --1272384, -3113851, 2913599, -10609643, 5586679, -16317118, -14665703, -6186901, -3277060, 2769717, --2940442, 7143068, -10744934, -634581, 24078124, -19938312, -15691126, -5074504, 21195664, 1793686, --24283746, 9735617, -8378945, -11846594, 3519189, 33725692, -18544596, -11933030, 25755308, 17294760, -2611340, -11263552, 1701881, -4834523, -6828461, 6053757, 7501161, -5236102, -19002010, 24668144, -13125420, 3849365, -26220238, -5182952, 9574556, 8451959, -2279554, 13373991, -1175210, 3918084, --5085778, -17385490, 11926587, -12649752, 8296803, 2764885, -13091597, 26370562, 5576478, 18808198, -21133386, 2785286, -27960238, -6297496, 2042257, -12234751, -3976603, 820339, 1343788, 12855374, -26875758, -6376953, 10804527, 1929514, -10687489, -51171852, 2997887, -13054016, 1387811, 26224534, -2075006, -4578435, 4311611, 1399623, -17909476, -18500572, -17424682, -15943992, 20875688, -3859028, -24992414, 2654827, -24385214, -442919, 2246805, 20948166, 3647501, -2923799, -4484483, 6265821, --13316009, -4554276, 22327388, -4241280, -29912836, -22152904, 13073880, -2542084, -6531572, 7170448, --2512556, -14821395, 4192425, 9312026, 20075214, -3745748, -17373142, 606127, -21805548, 8612483, -23881628, -3520263, -30135102, 9727564, -697395, 2021319, 6831683, -9041980, 17992692, 1695438, --12670154, 9913321, -6978248, -3860639, 25924960, -13168907, -4716948, -4208531, 16335908, 6753299, --29040958, 14711874, -23306104, -5716602, -12384001, 2563559, -7151658, -8141111, -1053341, -25713432, -5702643, 41075456, 27654220, 11902965, -20044076, 14993194, 20161650, 28477780, 14606110, 2989834, -1685775, 17711908, 31964758, -7450158, -3103114, 17344152, -34287796, 12393128, 32009318, -6811818, --10032507, 7798587, 25082072, 19247360, -12212203, -22654342, -431107, 11005854, -2873870, 2480881, -1315871, 26039850, -13996762, 16628503, 26427470, -10328859, -1995012, 17784922, -1566053, 62743568, --25192668, 11226508, 44246216, -24843164, 9394167, 2842195, -33552284, -1090922, 7905961, -15360414, -35580044, 2638184, -3155190, 2746632, -12584254, 46911780, 14594836, -37324876, 37963216, -14907831, -3221226, 11363947, 15421617, 24322400, 13801341, -6126771, -21232170, -31126164, -9518721, -12204150, -238908, -9258876, 22233972, -11812234, -18814642, 1631014, 10715943, -48797272, 28614682, 863288, -17478906, 27666568, -45935748, 10206990, 24340116, 5020280, 18289044, -18244484, 20095616, 5352066, --17693654, -86973, -10959146, -34314640, 19157164, 10250476, 31586264, -17503602, -22221088, -8261907, -7832947, -5022965, -37956236, -19285476, 12411919, -3134789, 6347962, -16499117, -4438849, 12592307, --10242423, -5621039, -15810311, -4025458, 6642167, -18366354, 2594697, -39908836, -32048510, 10038949, --33339684, 2921115, -34884800, -24981678, -16407312, 16814796, 34089692, 41060424, -8825084, 18372260, -23124104, 11000485, 10610180, -15552613, 46654620, 46933792, -30438970, 32265404, -23587424, 16689169, -34128348, 32022740, 39517456, 46418396, 33950104, -34428456, -23260470, 1737314, 3800509, 16239271, --4610111, -3490198, 60345364, -44334800, -21859236, 23060216, -13649943, 21966610, -17213692, -20235738, -6954089, -47012176, -1800128, 30455076, -7260642, 15266998, -26356066, -7327751, -10304163, 217433, -33398740, 9166534, 7509214, -6868190, 18332532, 4882841, 45467060, 10131828, 26527328, 789737, --20760798, -20766704, 26362510, -14074608, 12114492, -1547262, -34257732, 23228256, -30583388, 57577256, --44236552, 25331180, 23754928, -26875758, -21573084, -17397302, 21399674, -3485903, 22354768, -2226404, -2456721, -42424612, -22275312, 7179038, -20500416, 4196183, -12842489, 9302362, 5894306, 28238336, --19361712, -9337796, -8914741, -18462990, 40830108, 4184909, 2603287, -43128988, -14220100, 16572131, -10650982, 8293582, 34331284, 17308718, 29721174, 29836064, -4155381, 6698002, -19644644, -89491552, -61929672, -38069516, -28145994, 1551020, 11978127, 17095580, 1990181, -13595719, 47938276, 25670482, -5850819, -23598698, 15032922, 45097, 17198122, -22492206, -17220134, 13392782, 35450124, -41024452, -573915, 14484240, 3273839, -9405442, -7427072, -4357245, 406948, -1191853, 8136279, 47038480, -1583232, -19852412, 29544006, -6238977, -31476204, -37631428, 35223564, 13091597, -6784438, 14796162, -6752763, 31750546, -43421584, -3241627, -23100482, -4796942, 21686900, -16256988, 7056632, -18880140, -7404524, 64909840, 2303713, -34901440, -43495672, -978179, 16555488, 20715164, -19474456, 5695127, -27536646, -11113228, -63534916, 36134096, -24685324, -31863826, 10457172, 59134720, -44241384, 31227634, -33861524, 16607565, -40893996, -25109990, -25437480, 51672752, 17278116, 3221762, -3608846, 7997229, -14785425, -4887673, 6989523, -8102456, 97174, -6463926, 24530168, -27608050, -2916820, 16075526, --37834368, 12011413, -9128953, 2573222, -4313758, -10929081, 6916508, -3242700, -15349676, 41302552, --31648540, -9259413, 29655676, -19269908, -2794413, -6310918, 6599754, 28889560, 2369211, -28868622, -39182988, -21474836, 14018236, 24001350, 10941429, -9461813, 2245731, -21840446, 5338645, -13371307, --10137733, 51993264, -12069395, -21231098, 6926172, -10099079, 12550968, -8477192, 13785771, 33367600, --18370648, 10853919, 25922812, -30522186, 14087493, 16242493, 7814156, 20446192, -23128936, -6266358, -36461052, -24799678, -4852776, 10495289, -9212168, 34827352, -32868310, 6730751, 14233522, -14040785, -15199889, 15695958, -30044906, -78913584, -125615984, 10678362, 116809152, 8474507, 266435616, 275957568, -134877008, 288296992, 189871376, -43626132, -9072045, -68091872, -239189408, -209839216, -133089760, -244179088, --193873216, -60613800, -124914832, -105086576, 26050050, 50784232, -37904160, 6602976, 42063836, -50005768, --34875672, 63314796, 53419192, -3963181, 60163364, 112608672, 27622546, 76939504, 155897648, 67514736, -26968636, 137478144, 110531520, -73551, 73077792, 161175632, 15161771, 22280142, 123206504, 40891848, --39371428, 79200272, 71367864, -34455840, 57970248, 82851528, -31707060, -110922896, -70146480, -222823984, --349264608, -315122816, -336399008, -494227808, -451002176, -426023712, -512009504, -500549984, -423244864, -389259328, --360098112, -237003280, -135062224, -14229764, 46017892, 153234768, 263588592, 284531904, 321910496, 359044768, -146011168, 19289234, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +1522566, -2790655, -7104950, -2758980, 654983, -1326071, 2278480, -3286187, -1293859, -2513630, +-1180042, 1643362, -267899, -94489, -1381369, 2288144, -5952825, 584116, -3075197, 2193655, +1506997, -3591667, 671089, -427886, 933619, -1331977, 1057099, -3933116, -2491081, 5079336, +-1430761, -1890859, -2262911, -654446, -1429687, -512175, -3594351, -411243, 4619774, -987843, +863825, -95026, -1367947, 6444599, -1275605, 3697967, 4507032, -292595, -1640141, -1067836, +-3859028, -3624416, -3997004, -4694936, -2481954, -3256659, 890669, -3137474, -907849, -1837709, +-270046, 820876, -3737159, 3806415, 811749, 1660542, 3340948, -3020973, 1801202, 3497177, +-3479997, 736050, 2767570, 1246077, 1465658, -6023155, 3957276, 6521908, 1672353, 5761162, +65498, -5881958, -4111358, -4276714, -706522, -2928631, 6893960, -5156645, -1357210, -2327336, +-870268, -4131759, 3954591, -2426657, -1964411, 3387119, 5529771, 6334003, 923418, -428423, +1261647, 357556, 837519, -2832531, -3129421, 1525787, -2845416, -2769180, -3802120, -3911105, +1134408, -2583423, 3411815, -4320200, -662499, 1935957, 1745904, 1626719, -6813429, -1188632, +-3819837, -629750, -1657857, -4087198, -180389, 4921496, 1389959, 2399813, 2145336, 2668249, +220654, 3341485, 1966021, 3726421, -2236067, 2491081, -1365800, 1723893, 35970, -3415036, +3830037, 4537633, -2623151, -3037079, 1117765, 4161823, 742493, 1105417, -1688459, -282931, +1895691, 1427003, -159451, -10110890, -2695092, -4542465, 3326452, -9475235, 2054068, -4157528, +-2243047, 1382980, 158914, 1098438, 1392643, 1108102, 4097399, -1796907, 403190, -378494, +-5048734, 3740380, 6155225, -4990752, -4751308, 3632469, 896038, 4475893, 1377611, 5998996, +-853088, 2054068, -3178276, -909996, 6043556, 536871, -3985730, -4831302, -5302674, 279173, +4344360, 2277407, -54224, 5034239, 3938485, 219580, -4092567, 6426882, 1597728, 4974646, +4960151, -799401, 3150359, 3831111, -482110, 2298881, 2545842, -2389613, 482647, -678605, +2416456, -5495948, -3607236, 1901060, -3490198, -1232656, 4759898, -1833951, 2600066, -1014149, +-7555921, 1380832, -71404, 4065187, -6229313, -3222836, 2770791, 802622, 6448357, 6669011, +3034931, 4918812, 3965866, 6685117, 7766375, -2916820, -743566, 2533494, -7595650, -308701, +-2443837, -1513976, 3608846, -4517232, -427349, 5640366, 1149978, 3603478, -1698660, -1353452, +-1806571, -7256347, -1072131, 460635, 3935801, -1189169, 6694244, 2566243, -1010391, 2607045, +1493038, 3360812, -2307471, -524523, 7816841, -1037772, 7398618, 3396782, -3029563, 758062, +6545530, 3325915, -4046396, 5827197, -1423782, 403190, 484258, -1160715, 1307818, 666794, +-5064304, 3384434, 2666638, -421444, 415001, -1134945, -4518306, 54224, 2927020, -484794, +-287763, -3128884, -6696928, -2312840, 2928094, 5983427, -8555038, -4609574, 2079838, -3696893, +2771328, 100395, 571768, -4893579, 9466645, 9973988, -1957431, -4238059, -4541391, 9563818, +-8287677, 189515, -1314797, -3922379, -5230734, 1840394, -1404991, -7220377, -8698919, 299574, +-613107, -4599373, 1697586, 2394444, -3171833, -4871567, -4478041, 6361384, -6853157, -855772, +-8017094, 73551, 4522601, 1510755, 803159, -4533338, -4313758, 3942243, -3023657, -4626217, +599148, -1685238, 2847563, 56371, 1158567, -4600984, -1692217, -1290101, 4424890, 3045132, +3069828, -9097814, 1428614, 2568391, 2057289, 2603824, -2638184, -1618666, 273267, 1900523, +3535295, -561567, 2288144, -2561948, 6918119, -12679817, 4330938, 474057, -6995428, -159451, +7256347, -2113661, -3853123, -6653441, -2745558, 773631, -2495376, 296353, 2212445, 4319664, +-4505958, -14098767, 2543158, -6406481, 1378685, 1222455, -851477, 10073846, 522912, -6373732, +8538932, 4176319, 2912525, -1239635, 1746441, -2558727, 6689949, -1061931, 736587, 10177462, +9851044, 4287451, 4496294, 4414690, 4890357, 3350075, -9790378, -2979097, -164283, -2492155, +-8338142, -836445, -1999307, -2110977, -4493073, 3758, -1340030, 7245610, -2324651, 12637941, +-106837, 1168231, -2354179, -1694902, 62814, -231391, -1036698, -2051384, -1502702, -5989869, +1461363, 1173063, -768262, -2993055, 4254702, 3379066, 3683471, -1080721, -2724620, 323733, +3207267, 3791383, -2855080, -7703024, -4125853, 1236414, 6667400, -491237, 5455682, -3824669, +-6307697, 5357435, -2179159, -4333085, 3089155, 4386772, -5557151, -3619584, 5279052, -6244883, +-6650757, 3143916, -1852205, -663036, -3461207, -2123861, 3519189, 4794794, 2622078, -1217086, +813359, -672699, -1058173, -4746476, 1633698, -12639552, -3574487, -4097399, 3528316, 4196720, +425202, 2024003, -7747048, 2013803, 1267015, 1997160, -6980396, 13167833, -537945, 2330557, +1807644, -6438156, 1054415, -9175661, 5852430, -2092186, -7483444, 1340030, 641561, -3979824, +477278, 617402, 6029597, 10505490, 4716411, -2411624, 3549791, 4148939, -9904195, -3948686, +-4487704, 2476586, 2379949, -1988033, 1686848, 3118683, 2333778, 4086125, 8505109, -238908, +-2956548, -1342177, -168041, 6030134, -4495757, -595390, 3328063, 8142721, 427349, -6762426, +-5179194, -1584843, -6038187, -2279017, -12999792, -3563212, -4802311, 5565741, 211527, -2671470, +-16678432, -2188823, -2199023, 6951405, 16593606, -4728222, 11175505, 1957431, -9710384, -9939091, +1823214, 2604898, -5587216, 6339909, -4381404, 5132486, -6096169, 3104725, 2290828, -5815923, +-4820027, -3689914, 2143189, 6592238, -8245801, 441845, -8662412, -359704, -3143916, 2308008, +6729677, 834297, -2531346, -2318746, 7306813, 148713, 11007464, 3461207, -3686156, -3691525, +-2724083, 1724966, 7108171, 63888, 11550778, -19586124, -14131516, -11595338, -2226404, -9849971, +1205275, -3557307, 4184909, 9234717, 2272038, 3973382, 6490233, 9778567, 5698348, 1726040, +-5660767, -16108275, -16236587, 9558450, 1838246, 12068858, -6899865, -5712307, 7117298, -11788075, +3459596, 8360154, 2915746, -5741835, -685047, 15454366, 12154221, -663036, -11468100, -17971754, +-2626909, -5981279, 6089727, -5033165, -5973226, -20422570, -9502078, -18240726, 6392522, -112206, +-5094905, 5493800, -1185411, 612570, 826244, -5519033, -2147, -6415071, -1763084, 4693863, +2586644, -6556805, 1999307, 7687992, 11170136, -1282585, -2185065, -3409130, 116501, 6567005, +8081518, -756451, 719407, -1381906, -2057289, 10763725, 6920266, 773631, 7150584, 2704219, +-10040560, 2248416, -1535988, 12697534, 4194573, 1988033, 5309117, 8378408, 1577864, -6567005, +-12589623, -2358474, 1862942, 6803765, 2629057, 754841, 1837709, 9810242, 1397475, 3350075, +3648575, 2736968, -6867653, -6842420, -6810745, -6980396, -7097434, 9822590, 26246008, 5699959, +-8055211, 4629438, -4687420, -15602006, -3132642, -15315853, -8347269, 7807714, 10516227, 3973382, +2166274, 790274, 1943473, 9863392, -7085623, 13990319, -9130027, -9415642, 11253888, 4862977, +-18187040, 7800735, 4627291, 5602248, 11964705, 5737540, 8889509, -790811, 4806606, -3044058, +7572564, 1786706, 1590749, 4852240, -10290742, -5775121, -3197603, 6312528, 2791192, 2087891, +5144834, 1237488, 1764158, -9559523, -8053, 9705552, -1916629, 901406, 1131724, 940061, +11833172, 4245575, 15949361, 3326452, -2500745, 14909442, -13423920, -2164127, -2355253, -5745056, +-1515050, 2696703, 14833206, 901943, -3653407, -6511171, 2628520, -6875706, -3286187, -4738960, +-9124121, -2187212, 1124208, 11897596, -2909304, -10002442, -13974750, -5817533, -13748727, 9718437, +-11644730, -9556839, -6619619, 5935645, 16963510, -17187922, -5318244, -19299436, 5953362, 2049773, +2348273, -5948530, 2057826, 20525112, -10437844, -2422899, 8593156, 4883378, 4789426, 6845104, +5559835, -7517267, -11099269, -2773475, -5861020, -9437117, -10182294, -419296, -1874216, 2066953, +14601815, 8220031, -7154879, -4843650, -188442, -4666482, 4115116, 25876642, -8279623, 17848274, +6529961, 2450816, -454193, -3670050, 3909494, -10843719, 5668283, 13683229, 1449015, 1565516, +12395276, 6714108, 5375689, -10507637, 9091372, -6626598, -7626788, -24296630, -6269042, 14266271, +-7459822, 2919504, -15174119, 10663867, -4747550, -7770133, 11973295, -17934172, -10146323, 16694538, +-10631655, -15522549, 1539746, -10394895, -8083666, -884226, 11839077, -5513665, 20955682, 19891068, +3661460, 6496675, -11659762, 1602560, -9487583, 14976551, -3190624, 4543002, -7300371, -4386772, +2276333, 2180770, -7031399, 11523397, -3460670, 2592550, 3969624, -7237020, 2544768, -9283572, +-232465, 5588826, 6176700, 353798, 8249022, 10983305, -1103270, -19963544, -3701188, -5746130, +14134201, -11955578, -15468862, -10555956, -7560753, 2369211, -8920647, -6456947, -4664872, -934155, +2306398, -29248728, 18319646, 14926622, 20928302, -6369437, 3043521, 14714558, -14025216, -12145631, +2113661, 9881109, 5734855, -972810, 2483028, -6746320, -9293235, -10522133, -3714610, 40351756, +2820183, -20587388, -4181151, -10416369, 7362111, 7919383, -13329968, -6106370, -10813117, -22126060, +2230162, -18522046, 9053254, 2587718, -14084272, 7929584, 10041634, 12933220, 4410395, 4963909, +-14549202, -543850, -2377265, 13911936, 7250979, 435939, 13917305, 14555644, -1029718, -7183333, +2458332, 18040474, -11005854, -9443022, 10200010, 5054640, -11135240, -2696166, -10198400, 20761336, +-16751983, 4948339, 12048994, -6624987, 11201275, 3741990, -3963181, -5266704, -4299263, -8304856, +12824235, 15843061, 4386236, -11793443, 2568927, -13009456, -3667902, 8929774, -180926, -6250788, +-3300682, 2599529, -16018081, 967978, -122943, -9684078, 15622407, -13014825, 1053341, -2496987, +-7920994, 11359115, 1457605, 6983080, -2588255, -87510, 2189897, -5296232, 8105140, -4541928, +2543158, -4068408, 20269562, 9120900, 20282984, -558883, -13234405, -7516193, 9788767, 12549894, +16070157, -787053, -2286533, 19541028, 10276246, 21851720, 4000762, 597537, -10019622, -5989869, +-5484137, 4783520, 4488241, 11124502, -13267691, -474057, -7459822, 6230924, -11379516, 3246459, +14880988, -3593814, 639950, -8755828, 2998961, -8829379, -23767276, 1809255, -2800319, 97174, +-10080288, -4094715, 10660646, 17026324, -979789, -8531953, 11841762, 3348464, 3584150, 11068668, +5396627, -8749385, -2402497, 6398965, -280247, 5613523, -8223789, -10128607, 3616363, -9716827, +-13763223, -8932458, -15822660, -6008123, 6280316, -15440944, -1227287, -17512730, -5967857, -2839510, +6357089, -20757040, 8140037, -1889249, -10443213, 9698036, -4881231, -594853, 22812182, 21646636, +67646, 32029718, 36687612, 1996086, 11781632, 11346767, -1489817, -26268556, -614180, -909996, +-9897215, 7619272, 7045357, -14164802, 7999914, 10284836, 1865090, -3571802, 5699422, -3390340, +18951006, -2903398, -8449274, 450972, 4575214, -1403917, -868120, 46171, -29386704, 9008694, +-239444, -20142322, -8054138, 4022237, -1412507, -13533979, 5440113, -16034724, -879931, 2171106, +-25894358, -4181151, 12124693, -7928510, 2023467, 17382806, 11120207, 13471702, 4911295, -6539088, +-11408507, 13463112, -5501316, 7878044, -10609643, -5402532, 9751723, 15101105, 3507378, 17951890, +-9955734, 15647103, -10852309, -14331232, -8898098, 15579994, 17643726, -13569412, 9876277, -38866232, +-713501, 12066711, 7198902, -6148246, -11143293, 6325413, -27980638, 1129576, 36884644, -25266218, +-1272384, -3113851, 2913599, -10609643, 5586679, -16317118, -14665703, -6186901, -3277060, 2769717, +-2940442, 7143068, -10744934, -634581, 24078124, -19938312, -15691126, -5074504, 21195664, 1793686, +-24283746, 9735617, -8378945, -11846594, 3519189, 33725692, -18544596, -11933030, 25755308, 17294760, +2611340, -11263552, 1701881, -4834523, -6828461, 6053757, 7501161, -5236102, -19002010, 24668144, +13125420, 3849365, -26220238, -5182952, 9574556, 8451959, -2279554, 13373991, -1175210, 3918084, +-5085778, -17385490, 11926587, -12649752, 8296803, 2764885, -13091597, 26370562, 5576478, 18808198, +21133386, 2785286, -27960238, -6297496, 2042257, -12234751, -3976603, 820339, 1343788, 12855374, +26875758, -6376953, 10804527, 1929514, -10687489, -51171852, 2997887, -13054016, 1387811, 26224534, +2075006, -4578435, 4311611, 1399623, -17909476, -18500572, -17424682, -15943992, 20875688, -3859028, +24992414, 2654827, -24385214, -442919, 2246805, 20948166, 3647501, -2923799, -4484483, 6265821, +-13316009, -4554276, 22327388, -4241280, -29912836, -22152904, 13073880, -2542084, -6531572, 7170448, +-2512556, -14821395, 4192425, 9312026, 20075214, -3745748, -17373142, 606127, -21805548, 8612483, +23881628, -3520263, -30135102, 9727564, -697395, 2021319, 6831683, -9041980, 17992692, 1695438, +-12670154, 9913321, -6978248, -3860639, 25924960, -13168907, -4716948, -4208531, 16335908, 6753299, +-29040958, 14711874, -23306104, -5716602, -12384001, 2563559, -7151658, -8141111, -1053341, -25713432, +5702643, 41075456, 27654220, 11902965, -20044076, 14993194, 20161650, 28477780, 14606110, 2989834, +1685775, 17711908, 31964758, -7450158, -3103114, 17344152, -34287796, 12393128, 32009318, -6811818, +-10032507, 7798587, 25082072, 19247360, -12212203, -22654342, -431107, 11005854, -2873870, 2480881, +1315871, 26039850, -13996762, 16628503, 26427470, -10328859, -1995012, 17784922, -1566053, 62743568, +-25192668, 11226508, 44246216, -24843164, 9394167, 2842195, -33552284, -1090922, 7905961, -15360414, +35580044, 2638184, -3155190, 2746632, -12584254, 46911780, 14594836, -37324876, 37963216, -14907831, +3221226, 11363947, 15421617, 24322400, 13801341, -6126771, -21232170, -31126164, -9518721, -12204150, +238908, -9258876, 22233972, -11812234, -18814642, 1631014, 10715943, -48797272, 28614682, 863288, +17478906, 27666568, -45935748, 10206990, 24340116, 5020280, 18289044, -18244484, 20095616, 5352066, +-17693654, -86973, -10959146, -34314640, 19157164, 10250476, 31586264, -17503602, -22221088, -8261907, +7832947, -5022965, -37956236, -19285476, 12411919, -3134789, 6347962, -16499117, -4438849, 12592307, +-10242423, -5621039, -15810311, -4025458, 6642167, -18366354, 2594697, -39908836, -32048510, 10038949, +-33339684, 2921115, -34884800, -24981678, -16407312, 16814796, 34089692, 41060424, -8825084, 18372260, +23124104, 11000485, 10610180, -15552613, 46654620, 46933792, -30438970, 32265404, -23587424, 16689169, +34128348, 32022740, 39517456, 46418396, 33950104, -34428456, -23260470, 1737314, 3800509, 16239271, +-4610111, -3490198, 60345364, -44334800, -21859236, 23060216, -13649943, 21966610, -17213692, -20235738, +6954089, -47012176, -1800128, 30455076, -7260642, 15266998, -26356066, -7327751, -10304163, 217433, +33398740, 9166534, 7509214, -6868190, 18332532, 4882841, 45467060, 10131828, 26527328, 789737, +-20760798, -20766704, 26362510, -14074608, 12114492, -1547262, -34257732, 23228256, -30583388, 57577256, +-44236552, 25331180, 23754928, -26875758, -21573084, -17397302, 21399674, -3485903, 22354768, -2226404, +2456721, -42424612, -22275312, 7179038, -20500416, 4196183, -12842489, 9302362, 5894306, 28238336, +-19361712, -9337796, -8914741, -18462990, 40830108, 4184909, 2603287, -43128988, -14220100, 16572131, +10650982, 8293582, 34331284, 17308718, 29721174, 29836064, -4155381, 6698002, -19644644, -89491552, +61929672, -38069516, -28145994, 1551020, 11978127, 17095580, 1990181, -13595719, 47938276, 25670482, +5850819, -23598698, 15032922, 45097, 17198122, -22492206, -17220134, 13392782, 35450124, -41024452, +573915, 14484240, 3273839, -9405442, -7427072, -4357245, 406948, -1191853, 8136279, 47038480, +1583232, -19852412, 29544006, -6238977, -31476204, -37631428, 35223564, 13091597, -6784438, 14796162, +6752763, 31750546, -43421584, -3241627, -23100482, -4796942, 21686900, -16256988, 7056632, -18880140, +7404524, 64909840, 2303713, -34901440, -43495672, -978179, 16555488, 20715164, -19474456, 5695127, +27536646, -11113228, -63534916, 36134096, -24685324, -31863826, 10457172, 59134720, -44241384, 31227634, +33861524, 16607565, -40893996, -25109990, -25437480, 51672752, 17278116, 3221762, -3608846, 7997229, +14785425, -4887673, 6989523, -8102456, 97174, -6463926, 24530168, -27608050, -2916820, 16075526, +-37834368, 12011413, -9128953, 2573222, -4313758, -10929081, 6916508, -3242700, -15349676, 41302552, +-31648540, -9259413, 29655676, -19269908, -2794413, -6310918, 6599754, 28889560, 2369211, -28868622, +39182988, -21474836, 14018236, 24001350, 10941429, -9461813, 2245731, -21840446, 5338645, -13371307, +-10137733, 51993264, -12069395, -21231098, 6926172, -10099079, 12550968, -8477192, 13785771, 33367600, +-18370648, 10853919, 25922812, -30522186, 14087493, 16242493, 7814156, 20446192, -23128936, -6266358, +36461052, -24799678, -4852776, 10495289, -9212168, 34827352, -32868310, 6730751, 14233522, -14040785, +15199889, 15695958, -30044906, -78913584, -125615984, 10678362, 116809152, 8474507, 266435616, 275957568, +134877008, 288296992, 189871376, -43626132, -9072045, -68091872, -239189408, -209839216, -133089760, -244179088, +-193873216, -60613800, -124914832, -105086576, 26050050, 50784232, -37904160, 6602976, 42063836, -50005768, +-34875672, 63314796, 53419192, -3963181, 60163364, 112608672, 27622546, 76939504, 155897648, 67514736, +26968636, 137478144, 110531520, -73551, 73077792, 161175632, 15161771, 22280142, 123206504, 40891848, +-39371428, 79200272, 71367864, -34455840, 57970248, 82851528, -31707060, -110922896, -70146480, -222823984, +-349264608, -315122816, -336399008, -494227808, -451002176, -426023712, -512009504, -500549984, -423244864, -389259328, +-360098112, -237003280, -135062224, -14229764, 46017892, 153234768, 263588592, 284531904, 321910496, 359044768, +146011168, 19289234, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, }, { { -6075768, --9342091, 178241, -5176510, -1161252, -3584150, 2933463, -5563594, 260919, 2194728, -1876901, -1732482, -447750, -497679, 755377, 812823, 1699196, -2633889, -605054, -1763621, -4587562, --3758, 1382443, 388695, -1945083, 3505230, 1270774, -1101122, 1235877, 311922, -1985886, -1167694, -658204, -2212445, -2467996, -1138166, -475668, -1144609, 2312840, 4354023, -381715, -6562173, 1059783, -4931160, 1795296, -817654, -3785477, 483721, -3598109, 4072703, 906238, --3160022, 1583232, -1826972, 1346472, 2078764, 997506, 951872, -717796, 1852742, -3002182, -1622961, -1305133, -1239098, -824097, -1472100, -5317707, -967441, 2918430, -1786170, 2085744, -1026497, -1455457, 526670, -4295, 1669132, 6414534, -3165928, 1748589, -614717, 339839, -360240, -2633889, -2897492, 1913945, -472446, -2393908, -2960843, -1883880, 2755222, -288300, -3676492, 749472, -4461934, -4704600, -3240553, 1377074, 1270237, 2448131, -249645, 2805151, --2011655, -375810, -4795868, -733903, -779537, 1045288, 2001455, 1893544, 3796751, -1772748, --2268280, 2012729, 1290101, -2325725, -2232309, 168577, 1896228, 871878, 4256850, -1470489, --1048509, 4652524, 1647657, 8664560, 3914326, -2323041, 202937, -5190468, 406411, -5921150, --64425, -2142115, 4523138, 559956, 2628520, 3179887, 2082522, 3066070, 2423972, 570694, --4517769, -391916, -1925219, 3668976, 5787469, -3366181, -1704565, -1318555, -1012002, -2474975, --10022306, -10944114, -754304, -3221762, 520228, -2468533, -538482, 5906117, -980863, 3116536, --1395864, -3023657, -3914863, 606127, -741956, -4913980, 5595269, 1521492, 456877, 2801929, -2877628, 4406100, 3272228, -443455, -3317325, 3013993, 796716, -4705674, -1959042, -2204392, --1315334, 3925600, -1350767, -7105487, -2315524, -949188, 1486059, -2317672, -4497368, -10201, --420907, 5096516, 792421, -202937, 1925756, -282394, 7089381, -1386738, 641024, -1731409, --2835752, -161598, 3013457, 1212255, 786516, 2713883, -2698850, -4563403, -3220689, -795643, -488553, -1185948, 15032, -3459059, -865436, 1579474, -1217086, 3299609, 1598802, -332323, -392990, -3360812, -3063922, 5215164, 792421, 2091649, 808528, 1320166, 7189776, -595390, -3768297, 1891396, 4955856, 5641977, -1183264, 235149, 3763465, 3315178, 2524904, 6452652, -1487669, -2485176, 404801, 5585605, 2172717, 2465848, 5193689, 6535867, 4607426, -1899449, --4636417, 2952790, 2311229, -3092913, -4500052, -142808, -2622615, 804233, 1756642, -2080912, --2262374, 1843078, 1796370, 3595425, -2734284, -6004901, -2808909, -2890513, -3735548, -1797444, --4274030, 1980517, -5842230, 1910724, 395137, 743029, -2674154, 4888210, 4067871, -4533875, -4688494, 1145683, -881005, 887985, -3689914, -1859184, 3099893, 397821, 1155883, 45634, -3694746, 731755, 4600447, -3322157, -606127, -1309965, 1549410, 1749662, -1511292, 690416, --2992519, -66035, 1236414, -173946, 18912352, 621697, 16696148, 1844152, 10409927, -1866163, --2321430, 3444564, -8557722, 9338333, -5486284, 6423661, 3941706, -2763275, 2146947, 246961, --110059, -1010391, 2029372, 3995393, 3909494, 7657927, 1313723, 2785823, -709743, 8926553, --10100689, 744640, -1166084, 2834679, 3681324, -4570919, 1526324, 2819109, 763430, 3895535, -1407139, -3395709, 1458141, 8072391, -1822677, 2847563, -1679332, -625992, -763967, -4859756, -7945153, 428960, 416612, 6805913, -1268089, 1053878, 7355669, -10778757, 2736968, 374199, -3024731, 9787694, 2378338, 2827162, 2830384, -381715, -2913062, -1114544, 1918777, 1474784, -4626217, -1139777, 3772592, 2545305, -1634235, 1487669, -3445638, -1471563, 307090, -7634305, --9627706, -3671123, -1547262, -3463354, 7492571, 3349538, -6206765, 6867653, -1082869, -4856535, -1337346, 3032784, -2896419, -4440460, -4218732, -8516383, -4490389, 3776350, -5604933, -8658117, -2292976, 3587372, 529892, -3155190, 6357626, 856846, 5858336, -335007, -1582159, 3490735, -5528160, -8108899, -4084514, 2248416, -2037962, 2019172, -5545340, -369904, 1208496, 1941862, --4780836, -8264054, -2572686, 2414309, -1652489, -1047972, 241055, 2661806, -1088237, 1465658, --3066607, 4771172, -6585796, -4742181, -1946157, -4654134, -1693291, -1296543, 1516660, -3443490, -2224256, 5139465, -796180, 1144609, 1046361, 2410014, 4716411, -2032056, -1359357, -1067299, --2502355, 5199595, -2542084, -9267466, -6197638, -3659849, -2429878, -8141111, -19667192, -1571958, -1149441, 462246, -6496675, -2528125, -7337415, -1568737, -8611946, -9385040, -7715909, -1453310, --5153961, -10590316, -6957847, 2580739, 3247532, -2676838, 6443525, 3976603, -2531346, 8448738, -1637993, 1040993, 1217086, -10686416, -479426, 2241436, 4107599, -3069291, -3133716, 7021198, -12795244, -9163850, 3426847, -2372433, -512712, -7995619, -750009, 385473, -4308926, -4978404, --3957276, -4145180, -2448131, 3299072, 9468792, -3856344, 3592740, 6931541, 5836324, -1364726, -738198, -1462973, -1729261, -8068096, -4185446, 5563594, -3002182, 1729261, -2843805, 3163780, -1482301, -256624, -147103, -3333432, -3142306, 1496259, -984621, 2521683, -10028749, -10164577, --860067, -11668352, -2790655, -14130442, -3668976, -9882183, -1632088, 2376191, 2229088, 11630235, --7373385, 2947421, 2636573, -5622112, -3120294, 9458592, 581968, -2170032, 763967, -6951405, -6367826, -9032853, -3493419, 4711043, 2288681, -510027, 1281511, -1393717, 2777770, -3566970, --7464653, 978716, 3133716, 3322694, -6020471, 2083596, 6111739, -6092948, -8657580, 7174206, --5989332, 4864051, -4381404, 2943663, -435939, -5415417, -7978439, -4233764, 1859184, 215822, -2652679, -3507915, -4153234, -9330280, 4935991, -6537477, -3416647, 4365835, 8581345, -609349, --1960653, -12381854, -10286447, -2872796, -3711926, 5359046, -1424319, -7067369, -1212255, 869731, --4139275, -597000, -8869644, 6397354, 2645700, 7859790, 9822590, 7447474, 3477313, 21099564, -9785546, 13745506, -4491999, -286689, -554051, -20345260, 734439, 9083319, -4435091, -1399623, -329639, 13147432, -2590402, 7679939, -1948305, 7348152, 3525095, 9024800, 12044162, 1733019, -7875897, -2470143, 6736120, -879931, 12865575, 7194607, -743566, 7673496, 5601174, -2197950, -5301601, 3566970, 4479651, -3977677, -3815005, -10793790, -1291175, 7651484, 818191, 952409, --3196530, -4078072, -3936875, -3615289, 18066780, -12165495, 4020090, 5631776, 2428804, 1527935, --8072391, -9715216, -3352759, -1556389, -1390496, -16776142, -9253507, -8700530, -654983, -546535, -3809099, -700080, 3169149, 5752572, 9322763, 1837709, -4215511, 3524021, -8364449, 1905355, --6843494, 2195802, 1767916, 31304942, 4084514, 4133906, 4268661, -2610266, -12266427, 8135742, -9927817, -5767068, 4755066, 3571802, -7036230, -1657321, 8347806, 3810173, -12919798, 2935610, --2927557, -7538205, 672699, 3499862, 1941325, -636192, 614717, 5419175, -958851, 2856153, --9783399, 3823595, -174483, 3760244, 3358128, -2378875, 8574902, -10804527, -3500935, -10659572, -9921911, 3846143, 15576236, 6840273, 979789, 2782602, -10771778, -431644, 4509179, 3455301, -4672925, 495532, 3173981, -3400004, 4473746, 10214506, 15214922, 5871221, -5277441, -3740380, --297963, -2961917, 6410776, 6975027, -3765076, 4097936, 9057012, 2335925, -9674951, -21486648, --9403294, 4306242, 10558640, -3991098, 3966402, -707596, -864362, 66572, 10806675, 1787243, --18634252, 4922033, 10263361, -11453067, 7744363, 10473815, -26931056, 5050882, 2161442, 5143760, --9436043, 14775761, -21042656, -1184337, -601832, -2800319, -1280974, -7414724, -7342784, -2379412, -8872866, -214212, 1205275, -5232881, 6543383, -1910724, -1724429, 3133179, 10736344, -7524246, -8027294, -2357937, 5274757, 1042066, 7612830, 9002788, -1312649, 1531693, -12068321, -7711614, --1664837, -6132677, -10884521, 89121, -3287261, -8985608, 12527883, -11992622, -2502355, -6351183, --4718022, 6506339, -7789997, 3612604, -1996086, 6630356, -3118683, 7339026, -10492068, -4843113, -2658048, 9056475, -17616346, -8792335, 1888175, -1828046, -2134599, 5514201, -8524973, -21263846, -5388574, -19191524, 9774809, -8809515, 1392643, -21087216, -4997732, -14766098, -5933498, 17934172, -1037235, -15351824, 14415521, -6952479, 1188095, -16019691, 2648921, 5867462, -13607530, -3743601, --12145094, -467078, 997506, -4563403, -3230352, 11659226, 2052458, -8607114, 2239289, -17968532, -10711648, 16226386, -5222680, 6482717, 12014097, -1395864, -2252174, 921807, 1601486, 6377490, -1343788, 1016297, 3799972, -10411001, -549219, -11906723, -11349451, -5400922, 4991826, 6114423, --202937, -14303315, 2830384, 2751464, 6831146, 13634911, -14676977, 20834886, -17841832, -162672, --3437048, -4146791, -8505109, -17820894, -22332220, -9929964, -2323041, 4475893, -1415192, -443455, -3666292, -1670205, 16304233, 5865315, -15799037, -4371740, 308701, 8370892, -10414759, -1517197, --21489868, 1786170, 19727322, -17648020, -9777493, -18418968, 22106196, 10111427, -11531987, 15123117, -14194330, 21296596, -8154533, -6723772, 14729590, -1767379, -3483755, 5770289, 6282464, 3171297, -2754148, -20245938, -2681670, 539555, -310311, 1624571, -2828773, 9270150, 16551730, 2212982, -673236, 200790, 319975, 16191490, 3671660, -606127, -3929895, 4524748, 2966749, -1950452, -1292248, -8438537, -2384244, 14176613, -14064944, -6048388, -12205760, 15797963, -14505178, 7563438, --6257231, 5058398, -3578245, 4205847, -11775727, 3177739, 16397648, -10529112, 326418, -28935732, --1883880, -9771587, 224412, -26896696, -1807644, -597000, -9114457, -5114233, 21935472, -23302346, -3417720, -5553393, -9658308, 7628399, -8830453, -17580912, -13911399, 3482682, 344671, 6261526, --9908490, -5090610, 18262738, 7361037, -3149822, 4818417, -10111964, -9243306, -8800388, 19224274, --17068200, -19683836, 9258339, -18228914, 6537477, 1615445, 4683125, -7618198, -2554432, -9437654, --4881231, -7036230, 3403225, 10497974, 6104223, -14353781, 17490180, 3264175, 5855651, 2769180, -8240432, -676994, 7919383, 3257196, -4048007, 6562710, 1597728, 8335458, 4511863, -10311143, -4401268, -1986422, 3021510, -876173, -4615479, -2041720, -8444443, 9300215, 7971460, 10296647, --1799591, 17489106, 18541910, 9412958, 2297271, 10529112, 19272592, 11732777, 21061446, 15891379, -15701864, -14510010, -17118666, 6098854, -3477850, -1764158, 1357747, -5473936, 7170448, 8665097, -3462818, 19817516, -3596498, -6310381, -8470749, -3075197, 2215130, 1550483, -34396244, -6533719, -15755551, 10117869, -33344516, -25227028, -7363722, -628676, 11521787, -4920959, -366683, -27112518, -4242354, -14314052, 10498511, -2192581, 13776108, -11627550, -2349884, -13736916, 2854006, 10849087, --4760971, 3051574, -7211250, 430570, -17573932, -5156645, -309238, 1194001, 14018773, 17402670, -1201517, -16117939, -10691784, -5222680, 2268280, -4247186, 5743982, -18424336, -5083094, -2469069, --4133369, -10268193, -1761474, -4640176, 13246216, 18417894, 12994424, 4727149, 8217883, 7928510, --8080444, 30808338, 19192062, -23611046, -20052128, 22868016, -16868484, -9585830, 4184372, 3150359, --16353625, 17346836, 1805497, -50656456, 14527727, 33483028, -21709986, 23633594, 30532386, -8340827, --2452963, 17949742, -18044232, -9745281, 6781217, -6375342, -11219528, -9796284, -7401840, 11761231, -6059662, 7932268, -2581812, -10199474, -9482751, 10843719, -8990440, -162672, 2180770, -14762339, -9095130, 8689793, -7115687, -4505958, -12902082, 810675, -8363375, 10808822, -17790292, 1716913, -5432597, -483184, -9032316, -17035450, -4984310, -7221451, -2787434, -13150116, 17263084, -17651778, -1992865, -6255083, 3441343, -25183004, 24994562, 5195837, 1374390, -10305237, 4696010, 4418448, --168041, 2499134, -6031208, -19983946, -4865661, -8643622, -14294725, -17234094, -7689602, -4383551, --18634790, -6636262, -2354179, 11710228, 3857954, -15679852, -15191299, 8125005, -5239860, -19963544, --10209674, 4497905, 14458471, 15700790, 14620606, 25664040, -6738267, -18254684, -18526878, -1668595, -10219875, 19745038, 8841727, 4060892, 11322608, 33716032, -29795262, 27917, -12349642, -14450417, --9965935, 15950972, -8993125, -7999377, 6961605, 20322174, 11467563, -13562970, 8690329, -14258755, -10536629, 1648731, -2379412, -6337224, -12019466, -8106214, 1312649, 3183108, -18591840, 12538083, -1315871, -483184, -7379828, -6473053, 12260521, -16281684, -1322850, 20221780, 21881784, -18802294, --1786170, -2723546, -13397614, -15503758, 17971754, 5484137, 11311870, -2273648, 1096290, -238908, -11324218, -3159485, 363998, -13007308, 20414516, 18620294, -25360172, -29344290, -6673306, 1804960, --10234907, 2479807, -7587060, 3809099, -15624554, 18008262, -20026358, -16141024, -6440304, 4329327, -14057428, -5850819, 20380156, 3443490, -6736656, -5643587, -4641249, -11595338, 13194676, 9904195, --43181064, 64617784, -43963284, -12861816, 13261248, 34318936, 30277908, -11954505, -10216653, 622233, -3034931, 17106318, 8168491, -25545928, 8709657, -6496138, -7101192, 1149978, 11395085, -1364726, --16740172, -17278116, 9993315, 5733245, 12770548, -7361574, 15469398, 2056753, 17900350, -2879239, --3995930, 10923176, 140123, -14093398, 3882651, 13868986, 1010928, -18289044, 10195179, 18835580, --16690243, 6140730, -18025440, 6710350, -23204634, -17420924, 29312614, 24554328, 13894219, 32315870, --4534412, 38796976, 16743393, 14306536, 23379654, -37172940, 32459752, 9342628, 14373645, 13000329, -5467494, -18688476, 5029407, 32578400, 40527312, -1543504, -41133976, 20206210, 3466039, 7901129, -804770, -235149, -7175280, -34134252, 8753143, -7212861, 9308268, 44449152, -2460480, -50982872, --27057220, -29655138, -12506945, 1142461, 16259672, -43317968, -10745471, 7834557, -21448530, -22837952, --22451942, -22794466, -4667019, 27036820, 12573517, -9467182, 11705933, 6051072, -12838194, 14393509, --15993384, -2443300, 5437966, 9837086, -30923764, 16009491, -15666967, 9521406, -6804302, -23216982, -5800890, 8419210, 2816962, 4889284, -10949482, -33337000, 450972, 7996156, 6511708, 1263794, -3308199, -13304735, -1149441, -299574, 30114700, -3880503, -52171504, -22215718, -6584185, -41612864, -8635569, -12108050, -11907260, -19623706, -10247792, -29753922, -31080530, -35974648, -4762045, 39521216, -4218732, -23758148, 10198937, 1046898, -3768834, -13137231, -20332912, 8722542, 15205795, 12686260, -6364068, -6675990, -30057792, -19474456, -17070348, 27817966, -2426657, 22140020, 30735860, -26014080, --30455076, -34019364, 9812927, 10791642, -44329432, -27077622, 2101850, 521302, 14936286, -53655952, -6943352, 11490648, 38022808, -43089796, 6410239, 6252399, -3833258, 22690312, -11947525, 40290552, --682900, 2964601, 13986024, 15276125, -13772886, -33693480, 21055004, 22749368, 7246684, 28955058, -7681549, -4342212, -9010841, -25575456, 40830644, -17884244, 38918308, 13913547, -341450, 10280004, --13003550, 19252728, 22247394, -14261439, 17383880, 6853694, -35457640, 27414240, 31702764, -4224637, --16188805, 3058554, 2729452, 554051, -2936147, 52184928, 3358665, -31544388, -12433393, 5086315, --39020852, -59122372, 13951128, 71422088, 22967874, -6615860, -38202660, -13657459, 2507724, 46917148, --19808390, -26489748, -41519448, -71721656, 20309290, 35698156, -47370804, -3361886, 25371446, -10449655, --21774948, 19520626, -21064130, -10325638, 692564, -14503568, 23715198, -7598871, -12127914, -3634616, -12070469, 45105208, -7873749, -19906636, -23848880, 8791261, 20274930, 13217225, -21233782, -2727841, -23170274, 1064078, -19381576, 6436546, -17431662, 41440528, -19698330, -44324064, 14275398, -7312719, -20139102, -29738890, -30521112, 29541322, -3536906, -38244000, -21489868, -36624260, 46103252, 22604950, -11565810, -50107236, 7668664, 20163798, -36115308, 1541356, -26265336, -19677392, 18361522, -17723720, -21273510, -14958834, -31417148, -8040179, -8517457, -5927055, 9535901, 1902671, -19716048, 56809532, --7808788, 23540716, 26539676, 13052942, -7781407, 1943473, -12261595, 27130772, 11224360, -19014358, -14564234, 51314660, 11997454, 21539260, -716723, 4281009, 9538049, -20320564, 9631464, 17121888, -1397475, -23195508, -10539313, -17520782, -5461051, -23241142, -20046760, 1448478, -15731391, 23667418, -9279277, -7008313, -16793322, -9852655, -4705137, 12193949, -2916283, -22036940, -15978889, 3149285, -5690832, 10732050, 5744519, -5806259, 6754910, -19370302, -54101556, 1099512, 68300720, -3182571, --47596292, -9145059, 33116882, 7676181, 6379100, -2124935, -20039780, -27633282, -14660334, 4780836, --510564, -25664040, 10107132, -50371376, -7734163, 44238164, 14408542, 57252452, -6727530, -24390582, --6061810, -6474663, 16508244, 2051921, 300648, -33328410, -15448997, -16744467, -1722819, 35463008, --4805532, -10821170, 11962558, 12930536, 1439351, -22488986, -33509334, -23281944, -78017008, -120094800, -26946624, 105764640, 31889058, 259835856, 243976160, 107178224, 251017216, 104265160, -49821084, -4488778, --80820544, -213458256, -119199304, -114530136, -220008096, -161750608, -96014528, -141422528, -97886600, 12578349, --15737297, -51120848, 42545408, 39113192, -9622874, 41739564, 128942968, 48041892, 15103252, 121942712, -107189496, 27801860, 129026720, 160507760, -14295262, 88605712, 160070752, 50862612, 53750440, 161863360, -89143656, -32202592, 120459872, 78304232, -58421220, 33590404, 88803816, -72533944, -111872624, -44733696, --211876640, -339239072, -330434912, -365603712, -568404032, -497740544, -417713472, -533232544, -463905312, -313789760, --366493312, -292750336, -115445496, -72475424, 52023328, 138012336, 261211856, 364685664, 398688384, 468327008, -507501920, 453715520, 408530848, 400821376, 171415904, -13131326, -2270427, 0, 0, 0, -0, 0, 0, }, +-9342091, 178241, -5176510, -1161252, -3584150, 2933463, -5563594, 260919, 2194728, -1876901, +1732482, -447750, -497679, 755377, 812823, 1699196, -2633889, -605054, -1763621, -4587562, +-3758, 1382443, 388695, -1945083, 3505230, 1270774, -1101122, 1235877, 311922, -1985886, +1167694, -658204, -2212445, -2467996, -1138166, -475668, -1144609, 2312840, 4354023, -381715, +6562173, 1059783, -4931160, 1795296, -817654, -3785477, 483721, -3598109, 4072703, 906238, +-3160022, 1583232, -1826972, 1346472, 2078764, 997506, 951872, -717796, 1852742, -3002182, +1622961, -1305133, -1239098, -824097, -1472100, -5317707, -967441, 2918430, -1786170, 2085744, +1026497, -1455457, 526670, -4295, 1669132, 6414534, -3165928, 1748589, -614717, 339839, +360240, -2633889, -2897492, 1913945, -472446, -2393908, -2960843, -1883880, 2755222, -288300, +3676492, 749472, -4461934, -4704600, -3240553, 1377074, 1270237, 2448131, -249645, 2805151, +-2011655, -375810, -4795868, -733903, -779537, 1045288, 2001455, 1893544, 3796751, -1772748, +-2268280, 2012729, 1290101, -2325725, -2232309, 168577, 1896228, 871878, 4256850, -1470489, +-1048509, 4652524, 1647657, 8664560, 3914326, -2323041, 202937, -5190468, 406411, -5921150, +-64425, -2142115, 4523138, 559956, 2628520, 3179887, 2082522, 3066070, 2423972, 570694, +-4517769, -391916, -1925219, 3668976, 5787469, -3366181, -1704565, -1318555, -1012002, -2474975, +-10022306, -10944114, -754304, -3221762, 520228, -2468533, -538482, 5906117, -980863, 3116536, +-1395864, -3023657, -3914863, 606127, -741956, -4913980, 5595269, 1521492, 456877, 2801929, +2877628, 4406100, 3272228, -443455, -3317325, 3013993, 796716, -4705674, -1959042, -2204392, +-1315334, 3925600, -1350767, -7105487, -2315524, -949188, 1486059, -2317672, -4497368, -10201, +-420907, 5096516, 792421, -202937, 1925756, -282394, 7089381, -1386738, 641024, -1731409, +-2835752, -161598, 3013457, 1212255, 786516, 2713883, -2698850, -4563403, -3220689, -795643, +488553, -1185948, 15032, -3459059, -865436, 1579474, -1217086, 3299609, 1598802, -332323, +392990, -3360812, -3063922, 5215164, 792421, 2091649, 808528, 1320166, 7189776, -595390, +3768297, 1891396, 4955856, 5641977, -1183264, 235149, 3763465, 3315178, 2524904, 6452652, +1487669, -2485176, 404801, 5585605, 2172717, 2465848, 5193689, 6535867, 4607426, -1899449, +-4636417, 2952790, 2311229, -3092913, -4500052, -142808, -2622615, 804233, 1756642, -2080912, +-2262374, 1843078, 1796370, 3595425, -2734284, -6004901, -2808909, -2890513, -3735548, -1797444, +-4274030, 1980517, -5842230, 1910724, 395137, 743029, -2674154, 4888210, 4067871, -4533875, +4688494, 1145683, -881005, 887985, -3689914, -1859184, 3099893, 397821, 1155883, 45634, +3694746, 731755, 4600447, -3322157, -606127, -1309965, 1549410, 1749662, -1511292, 690416, +-2992519, -66035, 1236414, -173946, 18912352, 621697, 16696148, 1844152, 10409927, -1866163, +-2321430, 3444564, -8557722, 9338333, -5486284, 6423661, 3941706, -2763275, 2146947, 246961, +-110059, -1010391, 2029372, 3995393, 3909494, 7657927, 1313723, 2785823, -709743, 8926553, +-10100689, 744640, -1166084, 2834679, 3681324, -4570919, 1526324, 2819109, 763430, 3895535, +1407139, -3395709, 1458141, 8072391, -1822677, 2847563, -1679332, -625992, -763967, -4859756, +7945153, 428960, 416612, 6805913, -1268089, 1053878, 7355669, -10778757, 2736968, 374199, +3024731, 9787694, 2378338, 2827162, 2830384, -381715, -2913062, -1114544, 1918777, 1474784, +4626217, -1139777, 3772592, 2545305, -1634235, 1487669, -3445638, -1471563, 307090, -7634305, +-9627706, -3671123, -1547262, -3463354, 7492571, 3349538, -6206765, 6867653, -1082869, -4856535, +1337346, 3032784, -2896419, -4440460, -4218732, -8516383, -4490389, 3776350, -5604933, -8658117, +2292976, 3587372, 529892, -3155190, 6357626, 856846, 5858336, -335007, -1582159, 3490735, +5528160, -8108899, -4084514, 2248416, -2037962, 2019172, -5545340, -369904, 1208496, 1941862, +-4780836, -8264054, -2572686, 2414309, -1652489, -1047972, 241055, 2661806, -1088237, 1465658, +-3066607, 4771172, -6585796, -4742181, -1946157, -4654134, -1693291, -1296543, 1516660, -3443490, +2224256, 5139465, -796180, 1144609, 1046361, 2410014, 4716411, -2032056, -1359357, -1067299, +-2502355, 5199595, -2542084, -9267466, -6197638, -3659849, -2429878, -8141111, -19667192, -1571958, +1149441, 462246, -6496675, -2528125, -7337415, -1568737, -8611946, -9385040, -7715909, -1453310, +-5153961, -10590316, -6957847, 2580739, 3247532, -2676838, 6443525, 3976603, -2531346, 8448738, +1637993, 1040993, 1217086, -10686416, -479426, 2241436, 4107599, -3069291, -3133716, 7021198, +12795244, -9163850, 3426847, -2372433, -512712, -7995619, -750009, 385473, -4308926, -4978404, +-3957276, -4145180, -2448131, 3299072, 9468792, -3856344, 3592740, 6931541, 5836324, -1364726, +738198, -1462973, -1729261, -8068096, -4185446, 5563594, -3002182, 1729261, -2843805, 3163780, +1482301, -256624, -147103, -3333432, -3142306, 1496259, -984621, 2521683, -10028749, -10164577, +-860067, -11668352, -2790655, -14130442, -3668976, -9882183, -1632088, 2376191, 2229088, 11630235, +-7373385, 2947421, 2636573, -5622112, -3120294, 9458592, 581968, -2170032, 763967, -6951405, +6367826, -9032853, -3493419, 4711043, 2288681, -510027, 1281511, -1393717, 2777770, -3566970, +-7464653, 978716, 3133716, 3322694, -6020471, 2083596, 6111739, -6092948, -8657580, 7174206, +-5989332, 4864051, -4381404, 2943663, -435939, -5415417, -7978439, -4233764, 1859184, 215822, +2652679, -3507915, -4153234, -9330280, 4935991, -6537477, -3416647, 4365835, 8581345, -609349, +-1960653, -12381854, -10286447, -2872796, -3711926, 5359046, -1424319, -7067369, -1212255, 869731, +-4139275, -597000, -8869644, 6397354, 2645700, 7859790, 9822590, 7447474, 3477313, 21099564, +9785546, 13745506, -4491999, -286689, -554051, -20345260, 734439, 9083319, -4435091, -1399623, +329639, 13147432, -2590402, 7679939, -1948305, 7348152, 3525095, 9024800, 12044162, 1733019, +7875897, -2470143, 6736120, -879931, 12865575, 7194607, -743566, 7673496, 5601174, -2197950, +5301601, 3566970, 4479651, -3977677, -3815005, -10793790, -1291175, 7651484, 818191, 952409, +-3196530, -4078072, -3936875, -3615289, 18066780, -12165495, 4020090, 5631776, 2428804, 1527935, +-8072391, -9715216, -3352759, -1556389, -1390496, -16776142, -9253507, -8700530, -654983, -546535, +3809099, -700080, 3169149, 5752572, 9322763, 1837709, -4215511, 3524021, -8364449, 1905355, +-6843494, 2195802, 1767916, 31304942, 4084514, 4133906, 4268661, -2610266, -12266427, 8135742, +9927817, -5767068, 4755066, 3571802, -7036230, -1657321, 8347806, 3810173, -12919798, 2935610, +-2927557, -7538205, 672699, 3499862, 1941325, -636192, 614717, 5419175, -958851, 2856153, +-9783399, 3823595, -174483, 3760244, 3358128, -2378875, 8574902, -10804527, -3500935, -10659572, +9921911, 3846143, 15576236, 6840273, 979789, 2782602, -10771778, -431644, 4509179, 3455301, +4672925, 495532, 3173981, -3400004, 4473746, 10214506, 15214922, 5871221, -5277441, -3740380, +-297963, -2961917, 6410776, 6975027, -3765076, 4097936, 9057012, 2335925, -9674951, -21486648, +-9403294, 4306242, 10558640, -3991098, 3966402, -707596, -864362, 66572, 10806675, 1787243, +-18634252, 4922033, 10263361, -11453067, 7744363, 10473815, -26931056, 5050882, 2161442, 5143760, +-9436043, 14775761, -21042656, -1184337, -601832, -2800319, -1280974, -7414724, -7342784, -2379412, +8872866, -214212, 1205275, -5232881, 6543383, -1910724, -1724429, 3133179, 10736344, -7524246, +8027294, -2357937, 5274757, 1042066, 7612830, 9002788, -1312649, 1531693, -12068321, -7711614, +-1664837, -6132677, -10884521, 89121, -3287261, -8985608, 12527883, -11992622, -2502355, -6351183, +-4718022, 6506339, -7789997, 3612604, -1996086, 6630356, -3118683, 7339026, -10492068, -4843113, +2658048, 9056475, -17616346, -8792335, 1888175, -1828046, -2134599, 5514201, -8524973, -21263846, +5388574, -19191524, 9774809, -8809515, 1392643, -21087216, -4997732, -14766098, -5933498, 17934172, +1037235, -15351824, 14415521, -6952479, 1188095, -16019691, 2648921, 5867462, -13607530, -3743601, +-12145094, -467078, 997506, -4563403, -3230352, 11659226, 2052458, -8607114, 2239289, -17968532, +10711648, 16226386, -5222680, 6482717, 12014097, -1395864, -2252174, 921807, 1601486, 6377490, +1343788, 1016297, 3799972, -10411001, -549219, -11906723, -11349451, -5400922, 4991826, 6114423, +-202937, -14303315, 2830384, 2751464, 6831146, 13634911, -14676977, 20834886, -17841832, -162672, +-3437048, -4146791, -8505109, -17820894, -22332220, -9929964, -2323041, 4475893, -1415192, -443455, +3666292, -1670205, 16304233, 5865315, -15799037, -4371740, 308701, 8370892, -10414759, -1517197, +-21489868, 1786170, 19727322, -17648020, -9777493, -18418968, 22106196, 10111427, -11531987, 15123117, +14194330, 21296596, -8154533, -6723772, 14729590, -1767379, -3483755, 5770289, 6282464, 3171297, +2754148, -20245938, -2681670, 539555, -310311, 1624571, -2828773, 9270150, 16551730, 2212982, +673236, 200790, 319975, 16191490, 3671660, -606127, -3929895, 4524748, 2966749, -1950452, +1292248, -8438537, -2384244, 14176613, -14064944, -6048388, -12205760, 15797963, -14505178, 7563438, +-6257231, 5058398, -3578245, 4205847, -11775727, 3177739, 16397648, -10529112, 326418, -28935732, +-1883880, -9771587, 224412, -26896696, -1807644, -597000, -9114457, -5114233, 21935472, -23302346, +3417720, -5553393, -9658308, 7628399, -8830453, -17580912, -13911399, 3482682, 344671, 6261526, +-9908490, -5090610, 18262738, 7361037, -3149822, 4818417, -10111964, -9243306, -8800388, 19224274, +-17068200, -19683836, 9258339, -18228914, 6537477, 1615445, 4683125, -7618198, -2554432, -9437654, +-4881231, -7036230, 3403225, 10497974, 6104223, -14353781, 17490180, 3264175, 5855651, 2769180, +8240432, -676994, 7919383, 3257196, -4048007, 6562710, 1597728, 8335458, 4511863, -10311143, +4401268, -1986422, 3021510, -876173, -4615479, -2041720, -8444443, 9300215, 7971460, 10296647, +-1799591, 17489106, 18541910, 9412958, 2297271, 10529112, 19272592, 11732777, 21061446, 15891379, +15701864, -14510010, -17118666, 6098854, -3477850, -1764158, 1357747, -5473936, 7170448, 8665097, +3462818, 19817516, -3596498, -6310381, -8470749, -3075197, 2215130, 1550483, -34396244, -6533719, +15755551, 10117869, -33344516, -25227028, -7363722, -628676, 11521787, -4920959, -366683, -27112518, +4242354, -14314052, 10498511, -2192581, 13776108, -11627550, -2349884, -13736916, 2854006, 10849087, +-4760971, 3051574, -7211250, 430570, -17573932, -5156645, -309238, 1194001, 14018773, 17402670, +1201517, -16117939, -10691784, -5222680, 2268280, -4247186, 5743982, -18424336, -5083094, -2469069, +-4133369, -10268193, -1761474, -4640176, 13246216, 18417894, 12994424, 4727149, 8217883, 7928510, +-8080444, 30808338, 19192062, -23611046, -20052128, 22868016, -16868484, -9585830, 4184372, 3150359, +-16353625, 17346836, 1805497, -50656456, 14527727, 33483028, -21709986, 23633594, 30532386, -8340827, +-2452963, 17949742, -18044232, -9745281, 6781217, -6375342, -11219528, -9796284, -7401840, 11761231, +6059662, 7932268, -2581812, -10199474, -9482751, 10843719, -8990440, -162672, 2180770, -14762339, +9095130, 8689793, -7115687, -4505958, -12902082, 810675, -8363375, 10808822, -17790292, 1716913, +5432597, -483184, -9032316, -17035450, -4984310, -7221451, -2787434, -13150116, 17263084, -17651778, +1992865, -6255083, 3441343, -25183004, 24994562, 5195837, 1374390, -10305237, 4696010, 4418448, +-168041, 2499134, -6031208, -19983946, -4865661, -8643622, -14294725, -17234094, -7689602, -4383551, +-18634790, -6636262, -2354179, 11710228, 3857954, -15679852, -15191299, 8125005, -5239860, -19963544, +-10209674, 4497905, 14458471, 15700790, 14620606, 25664040, -6738267, -18254684, -18526878, -1668595, +10219875, 19745038, 8841727, 4060892, 11322608, 33716032, -29795262, 27917, -12349642, -14450417, +-9965935, 15950972, -8993125, -7999377, 6961605, 20322174, 11467563, -13562970, 8690329, -14258755, +10536629, 1648731, -2379412, -6337224, -12019466, -8106214, 1312649, 3183108, -18591840, 12538083, +1315871, -483184, -7379828, -6473053, 12260521, -16281684, -1322850, 20221780, 21881784, -18802294, +-1786170, -2723546, -13397614, -15503758, 17971754, 5484137, 11311870, -2273648, 1096290, -238908, +11324218, -3159485, 363998, -13007308, 20414516, 18620294, -25360172, -29344290, -6673306, 1804960, +-10234907, 2479807, -7587060, 3809099, -15624554, 18008262, -20026358, -16141024, -6440304, 4329327, +14057428, -5850819, 20380156, 3443490, -6736656, -5643587, -4641249, -11595338, 13194676, 9904195, +-43181064, 64617784, -43963284, -12861816, 13261248, 34318936, 30277908, -11954505, -10216653, 622233, +3034931, 17106318, 8168491, -25545928, 8709657, -6496138, -7101192, 1149978, 11395085, -1364726, +-16740172, -17278116, 9993315, 5733245, 12770548, -7361574, 15469398, 2056753, 17900350, -2879239, +-3995930, 10923176, 140123, -14093398, 3882651, 13868986, 1010928, -18289044, 10195179, 18835580, +-16690243, 6140730, -18025440, 6710350, -23204634, -17420924, 29312614, 24554328, 13894219, 32315870, +-4534412, 38796976, 16743393, 14306536, 23379654, -37172940, 32459752, 9342628, 14373645, 13000329, +5467494, -18688476, 5029407, 32578400, 40527312, -1543504, -41133976, 20206210, 3466039, 7901129, +804770, -235149, -7175280, -34134252, 8753143, -7212861, 9308268, 44449152, -2460480, -50982872, +-27057220, -29655138, -12506945, 1142461, 16259672, -43317968, -10745471, 7834557, -21448530, -22837952, +-22451942, -22794466, -4667019, 27036820, 12573517, -9467182, 11705933, 6051072, -12838194, 14393509, +-15993384, -2443300, 5437966, 9837086, -30923764, 16009491, -15666967, 9521406, -6804302, -23216982, +5800890, 8419210, 2816962, 4889284, -10949482, -33337000, 450972, 7996156, 6511708, 1263794, +3308199, -13304735, -1149441, -299574, 30114700, -3880503, -52171504, -22215718, -6584185, -41612864, +8635569, -12108050, -11907260, -19623706, -10247792, -29753922, -31080530, -35974648, -4762045, 39521216, +4218732, -23758148, 10198937, 1046898, -3768834, -13137231, -20332912, 8722542, 15205795, 12686260, +6364068, -6675990, -30057792, -19474456, -17070348, 27817966, -2426657, 22140020, 30735860, -26014080, +-30455076, -34019364, 9812927, 10791642, -44329432, -27077622, 2101850, 521302, 14936286, -53655952, +6943352, 11490648, 38022808, -43089796, 6410239, 6252399, -3833258, 22690312, -11947525, 40290552, +-682900, 2964601, 13986024, 15276125, -13772886, -33693480, 21055004, 22749368, 7246684, 28955058, +7681549, -4342212, -9010841, -25575456, 40830644, -17884244, 38918308, 13913547, -341450, 10280004, +-13003550, 19252728, 22247394, -14261439, 17383880, 6853694, -35457640, 27414240, 31702764, -4224637, +-16188805, 3058554, 2729452, 554051, -2936147, 52184928, 3358665, -31544388, -12433393, 5086315, +-39020852, -59122372, 13951128, 71422088, 22967874, -6615860, -38202660, -13657459, 2507724, 46917148, +-19808390, -26489748, -41519448, -71721656, 20309290, 35698156, -47370804, -3361886, 25371446, -10449655, +-21774948, 19520626, -21064130, -10325638, 692564, -14503568, 23715198, -7598871, -12127914, -3634616, +12070469, 45105208, -7873749, -19906636, -23848880, 8791261, 20274930, 13217225, -21233782, -2727841, +23170274, 1064078, -19381576, 6436546, -17431662, 41440528, -19698330, -44324064, 14275398, -7312719, +20139102, -29738890, -30521112, 29541322, -3536906, -38244000, -21489868, -36624260, 46103252, 22604950, +11565810, -50107236, 7668664, 20163798, -36115308, 1541356, -26265336, -19677392, 18361522, -17723720, +21273510, -14958834, -31417148, -8040179, -8517457, -5927055, 9535901, 1902671, -19716048, 56809532, +-7808788, 23540716, 26539676, 13052942, -7781407, 1943473, -12261595, 27130772, 11224360, -19014358, +14564234, 51314660, 11997454, 21539260, -716723, 4281009, 9538049, -20320564, 9631464, 17121888, +1397475, -23195508, -10539313, -17520782, -5461051, -23241142, -20046760, 1448478, -15731391, 23667418, +9279277, -7008313, -16793322, -9852655, -4705137, 12193949, -2916283, -22036940, -15978889, 3149285, +5690832, 10732050, 5744519, -5806259, 6754910, -19370302, -54101556, 1099512, 68300720, -3182571, +-47596292, -9145059, 33116882, 7676181, 6379100, -2124935, -20039780, -27633282, -14660334, 4780836, +-510564, -25664040, 10107132, -50371376, -7734163, 44238164, 14408542, 57252452, -6727530, -24390582, +-6061810, -6474663, 16508244, 2051921, 300648, -33328410, -15448997, -16744467, -1722819, 35463008, +-4805532, -10821170, 11962558, 12930536, 1439351, -22488986, -33509334, -23281944, -78017008, -120094800, +26946624, 105764640, 31889058, 259835856, 243976160, 107178224, 251017216, 104265160, -49821084, -4488778, +-80820544, -213458256, -119199304, -114530136, -220008096, -161750608, -96014528, -141422528, -97886600, 12578349, +-15737297, -51120848, 42545408, 39113192, -9622874, 41739564, 128942968, 48041892, 15103252, 121942712, +107189496, 27801860, 129026720, 160507760, -14295262, 88605712, 160070752, 50862612, 53750440, 161863360, +89143656, -32202592, 120459872, 78304232, -58421220, 33590404, 88803816, -72533944, -111872624, -44733696, +-211876640, -339239072, -330434912, -365603712, -568404032, -497740544, -417713472, -533232544, -463905312, -313789760, +-366493312, -292750336, -115445496, -72475424, 52023328, 138012336, 261211856, 364685664, 398688384, 468327008, +507501920, 453715520, 408530848, 400821376, 171415904, -13131326, -2270427, 0, 0, 0, +0, 0, 0, }, { -5747740, --9216463, -690953, -9408663, -5207648, -1798518, -1622424, -255014, -2236604, -419833, 2037425, --2442763, 2855617, 351114, -3832185, 2399276, -658741, 2564632, 381178, -3635690, 2573759, -1425392, 2024003, -1553704, -2319819, -1667521, -1928977, 1527398, -316217, 425202, -2103460, -1513976, -2552284, -3497714, 191126, -4347581, -3234110, -1664837, 4675609, 579821, 1805497, --5655398, 832150, 969052, -4862977, 1753420, 386010, -5078799, -925565, -374199, -3939022, -4518306, -2825015, -1625108, 2663417, -187368, -4773856, -477278, -3299609, 3722126, 3245922, --4551592, -2374043, -3041374, -2056753, -1284732, 1970853, 1727651, 1132261, 3125663, -27917, -1241246, -458488, -1240172, -1636383, -746787, 11343009, -5726802, 626528, -3499325, -70867, -4510253, 2416456, 2749853, -2404108, 3452080, -3615289, 3898220, 2225867, 4738423, 2259690, --1166084, -5435281, 5792837, 4310000, 1294933, 864362, 323196, -2226404, -2965138, 3262565, -1662689, 2179696, 2739652, -2895882, -488553, 2943663, 3062312, -298500, -2745021, -4582730, --253940, 1007707, -3126199, 1189169, 475668, -4129611, -2586107, -209380, 1864016, 158377, --2371359, 4072166, 432718, -1240709, -3251290, -557809, 26307, -5457293, 2231773, 3561065, --2266669, 4530117, 3300146, -505732, 2661806, 1846836, 5531918, 1912871, 730681, -870268, -1837709, -4708358, 216359, 2291365, -2757906, 2595234, 2710661, 3393561, 1677185, 4340065, --10730976, -7254200, -1204202, -4619774, -4230543, 2151242, -6180995, -5668283, 1516124, -2491618, --2520072, 2558190, -2063195, -3978750, -612033, -175020, -1329292, -1748589, -1279900, -4588636, --465467, -3273839, -2636573, 0, 4045322, -810138, 5921686, -3045669, 3483219, 4334696, --4913980, 1770063, -1387274, 1036161, -3540664, 1775969, 1967632, 3363496, -1870458, -3856344, --1589138, -2066953, 1058173, 1648194, -5032091, -500901, -3531000, -2554432, 670552, -3845070, --6556268, -1088774, 5949604, 1462436, 1908039, 424665, 1151051, 929860, 1993402, 2527052, -6648610, 591095, -3417183, -3928821, -1209570, -1846836, -897111, -8027294, 1250372, -541166, -2100776, -1059783, 167504, -1922535, -1605781, 7887708, 678068, 573915, 8603893, 9923522, -7634841, 5673115, 8027831, 3263102, 3492345, -721018, 2287070, 8458401, 910533, 2591476, --3127810, -2073932, 6484864, -4321811, -7903277, 2419140, -6598681, 5735392, 1365263, 6880538, --2160906, -398895, -1666447, 2286533, 2768643, -57982, -6711960, -1348083, 5804112, -3796751, -2636036, 1578937, -1267015, -1605781, 6454262, 4898947, 11234024, 4546223, 973884, 2753074, --898722, 759672, 3577171, 2189360, 9595494, -3990025, -2662343, 770410, 2521683, -1385664, -4492536, -4013110, 936303, -128849, -3096135, 1150514, 1051193, -4129074, -5729487, -3404299, -4734128, 2472828, 150861, -103616, 3637301, 581431, 1334661, 6423661, 3200825, -978179, --685047, 5966247, -4286378, 1465658, 18814642, -460635, 9277129, -1794223, -1315334, 9682467, --9501005, -3473555, -641024, 4702989, 3474629, -2212445, 1971390, 749472, -8611946, 2037962, -4750771, 3966939, -9672803, -3608846, 1184337, -7181722, -1846836, 345745, 389231, 755914, --1006633, 4255776, -3088618, 3335042, 7377680, 7092065, -2069101, -4419522, -699006, 8000987, --426276, -686658, 101469, 556735, -4243965, 468688, 3494493, 245887, 845572, 3033858, --2180233, 1938104, 1308354, -1213328, 5794448, 249108, 4599910, 575526, -1555315, 1661079, -3055332, 2290828, -167504, -4908611, -4169340, -5850819, -2492155, -609349, -78383, -1074816, -3945464, 3029026, -2783676, -5825587, -26307, 2280091, 3061775, -3772592, -1029182, -5024575, --13927505, -3649112, -4704063, 887985, 2343979, -2385318, -2765959, -26305064, 557272, 8441221, --6103149, -9845676, 7407208, -11136850, -1643362, -4978941, -5810017, -3630858, -3627637, 408559, -4523675, -800475, 2550674, -2821257, 3432753, -2552284, -3918621, 1792075, -1422708, -6243272, --7956964, 3892851, 462246, 3853660, 1244467, 8554501, 1285806, 3025805, -3984119, -6965900, --1954747, -3398393, 7151121, -3172907, 284005, 1966558, -3399467, 10013716, 6641093, 306016, --7750806, -9787694, -3274376, 3520263, -8883603, -3221, -4262755, -8315594, 908922, -13133473, --2851322, -1125281, -4872641, 9349070, -444529, -1044214, -36507, 6071473, 7313793, 2652142, --7108171, -1764695, -1723356, 4567698, 1920924, 2982318, 5953362, -15421617, -21805012, 2320893, --4704063, 4544613, -5847061, -11409581, 633508, 9730248, 2431488, 5819144, 5324686, 3452080, -2829847, -3939559, 3082176, 6340446, -10166724, -5321465, -3129421, -2747169, 4243428, -1250909, -1714229, 6599218, 6470905, -2850248, -5550709, 1018444, -2930242, -2913599, -5357972, -4377646, --8365523, 1739999, -2863670, -442382, 8220031, -1929514, 1926293, 1688459, -5151814, 4325569, -5093295, 6121402, -5242008, 9880035, -1203128, -7893076, -5862094, -8603893, 8142721, -3291556, --8218420, 2240362, -823560, -6570226, 7083475, 8359080, -2481954, -7798587, 6027450, 1252520, -4874251, -1143535, 12459163, 6410239, -6242198, -4023311, -2559801, -3367791, 4683125, 4606353, -7752416, -20522964, -208843, -3575560, 1174137, 144955, 7613367, 5911486, 7888245, -1137630, -10830834, -4960687, 7292855, 9360881, 1473174, 9327058, 1752884, 2543158, -2799782, -778463, --4088809, 7418483, -690416, -674847, 9984188, 6329171, -156766, 2902324, -1130650, -201863, -6386617, -3665755, -6856916, 128312, -1195612, 3510062, -18905910, 11320997, 11773579, 4889284, -2037962, 439160, -6241661, -12298639, 7864622, -4891968, -5995238, -3673808, 6995428, -5082020, -4158602, 4705674, -4811974, -2829847, -11145440, 5020280, -7424388, 4215511, 210990, 3774740, -6001143, 10463614, 3904662, -4751845, -12057047, -1982664, 6324340, 11485279, 7840463, -1738925, --3164317, -7397008, -13321915, -1351304, 7131257, 3710315, 806917, 1886028, 8020852, 26946624, -14877230, -1440425, 2698313, 2267743, 6082748, 10550050, -1388885, 1943473, 18202608, 1679332, --709743, 10739566, 7688529, -7735773, 4550518, 885300, 7325604, 4791573, -12554726, 9336185, --5815923, -1081258, 1068910, 7227356, 1317481, 1748589, 5656472, 6241661, -6299107, 6403260, -19925964, -3859565, 9006010, 8995272, -5097053, 6962679, 1796370, -5196911, -5376226, 3151969, --4846871, -12866111, -1824287, -1027571, 1038845, -16393353, -4157528, 4403952, -10373420, -7300908, --16924318, 4944581, 7272454, -11919608, -4447976, -6075231, 11573863, -343061, -7354595, -5479305, --8182450, 3142306, 9474161, -7887171, 3239479, -3822521, 4149475, 10537165, 4006131, 8075613, -8251169, 10420128, 743566, 27285928, 8026220, 582505, -1024887, -4586488, 751619, 4649839, --2803540, -6999186, -8953933, 147640, 7371775, -9050033, 4734665, 4993437, -1826435, 18203146, -7201587, -5267241, -2652679, -2008971, 7299834, -3384434, -5719286, -7505992, 4861903, -15669114, -1069984, -4873178, -4966056, 4181151, 1593433, -6162205, -2885144, -5956046, 8026757, -3142842, --11410654, -2123325, 775242, 201327, -6420976, -10426033, 1401770, -2533494, -848256, 2573222, --1602023, 8361765, 2327336, 4667556, -5386426, 12474733, 4262755, -7436736, 9167608, 15939161, --4453344, -5001490, 8926553, 7022272, 3597572, 3870303, -10112500, -3775813, -11018202, 2207613, -10590316, 3575024, -13157095, -3968013, 3944928, -14443438, -20863340, -3514894, -440234, 3440806, --21502754, 10066330, 28809566, -11890080, 20256676, -4633733, -4226248, -6381248, -10285373, 7651484, -426276, 5206574, 5355288, -18916646, 396748, 8712878, -7489886, -4099546, -11712376, 20963736, --12935368, 10322417, 9966472, -12552042, -4962835, -4402879, 9018894, -10040023, -3870839, 10161893, --1552094, -2747705, -4727686, 12409771, 2436320, -2019708, -4850629, 324807, -9182640, 10244571, --930934, 4719096, 25842282, 17157858, -14395120, -10386842, 4341675, -1301375, 11031623, -5843303, --8261370, -3027415, -15649250, -6142877, -1501628, -12258374, -6612102, 27367532, 6963216, 166967, --865973, -220117, 8543227, 9715753, -1488743, 9617506, 1344325, -5077188, 1657321, -14384919, --408559, -13249437, -6523519, 8505109, 12790413, -17325362, 8056285, -22578644, 3608846, 21577916, --5881421, -5059472, 4310537, -6213207, -5638219, 6393059, -1041530, -774705, -483184, -13972065, -24255828, -25540560, -2688113, -113817, 8745627, 5863704, 177704, -9346386, -7215008, 3658239, -19008988, -983011, -8492224, -5165772, -13601625, -306553, -7979513, -5694053, -2780455, 4919348, --410706, 1330903, -9107478, 2568391, 2713883, 6621229, 5027796, 6692096, -12278238, 869731, --2319282, 9037148, 2343979, 17500382, 3910568, -2926483, 1842004, -8076686, 363998, 8263517, -9865540, -13210783, -10489921, 67646, 15541876, -22122302, 6870874, 28108950, 15648176, -5890011, -3484292, -13069585, 7249905, 14750528, -21388938, 6660421, -9503689, -1428077, -28963112, 2006824, --10795400, 14024142, 3285650, -12258910, -5893232, -17709224, 27798102, 7722888, 14687178, -16546362, --17951352, -3612604, 5104032, -5326297, -2181844, 8972187, 2779381, 2611340, 8385924, -20489678, --1992328, 4832, 5352066, -14340896, 2044941, 2119566, -9607842, -5685463, -13319230, -10424959, -79994, 4040491, -10778220, 519154, -4828080, -10005663, 3871913, -333397, 7831336, -21758304, --22327924, 4321274, -1882269, 8075076, 18797462, 1749125, -11820287, 16428787, -8396124, -16139413, --12206834, -5564130, 1263794, -17121350, -6582575, 16075526, 22200686, 9035001, 6083285, 4265440, --2790118, 13838921, 7802345, -17018272, -9352291, -306553, 1331977, 15195057, 9647570, 2103460, --2819646, -2330020, -8122857, 9937481, 7602092, 17539036, 3555696, 4641249, 1617592, 31219580, -3040300, 6793028, 18395344, 1382980, 22909892, -660351, -10797548, -11467026, -21861384, 4124242, --9314173, -445603, 1701881, 7967701, 11225971, 19381040, 19779398, -2873333, 17617956, -1097364, --1607392, 6933151, 14880988, 6749541, 4159139, -23483270, -12184822, -19029926, 9826348, 19650012, -3825742, -8041253, 13609678, 19741280, -2493766, 3362423, -4376035, 16681116, 13994614, 12082817, --6684043, -11914239, -1673964, -2787434, -27063662, 5200132, 4122632, 2874944, -6539625, -3191161, --30067456, -10354629, -27186606, -4387846, -20159502, -10288594, 20702816, 5794448, 21853868, 1888175, --16430934, -7916162, -17031692, -33855080, 5907728, -20742008, -5000953, 20726976, 9800578, 8421894, -3208341, -3423089, 292595, 4376572, -12701829, 12210592, -22698902, -25687126, 1953673, -3718368, -10753524, 21897354, 18920404, 20548734, -11850889, -20419886, 15728170, -9213242, 16262357, 5030481, --26252450, 6750615, 4836670, -29345900, 15820512, -13258564, -13778792, 8266739, 8935679, 1647657, -10613401, 1067836, 484794, -6636798, -4048544, 6793565, -4154844, -9779641, 617938, -18644990, -6804839, -23769422, -14775761, 1347009, 9507984, -2812667, -10094247, 4282620, 7458211, 6212134, -321586, 20107964, -44900124, -9472550, -12414603, -14111115, 19244674, -14828375, -2336999, -35196720, --10320270, -3287798, 1636919, 25181394, -6082748, 4268124, -14842870, 13572097, -18425946, -10195715, -9033390, -40210556, 5699959, 24351390, 28671054, 24461450, 13616120, 35325568, 17606682, 2690260, --8541079, -4640712, -12998719, -23419382, -3071975, 9302899, -38356744, -38178500, -180389, 6684043, -26735634, -8483097, 12261058, 11643119, 5786932, 6516539, -42193760, 33496986, 17915382, 41439992, -14949171, -1400159, -15387794, -9290551, -9665824, -14460081, 10531260, 8249559, -15184320, -16722455, -9026411, 12803834, 21419002, 6512781, -13350369, -19385334, 4216584, 3917010, 1393180, 2958159, -38144140, 13491566, 7344394, 13168907, 13871671, 16164646, 467615, -23492934, 17155174, 53871236, --5265630, -14050449, -32151052, -6156299, 43091944, 5856725, 18006650, 6839736, -58945204, 13187697, -10998338, 2279554, 6505802, -3029563, 1386738, 13303124, -31351650, -11914776, 27707370, 11508365, -4447976, -22388590, 18024904, 8209830, -20634096, -21386252, -14567455, 23979340, 46189688, 44575856, -47611860, 50037980, 3842922, -17688822, 19793356, 38005628, -77828568, -28494960, 6878390, -46692200, --41366976, -19015430, -24838870, 2113124, -18103824, 48990544, -4579509, -18471580, -6436546, -38956428, --9852118, -31610960, -12099460, 4520453, -38966092, -7521025, 31439160, -26625040, -6698539, 7958038, -561030, 11901891, 3407520, -898185, 12183748, 3285650, -18985366, -4686346, 18284750, -9891310, --23809152, -9116605, -29020020, -15741592, -51390356, 3978750, -34746284, 16013786, 7150584, -14212047, --45185740, 3039226, -4051765, 55432996, 23411866, -265751, 31679678, 11975443, 1235340, 23597088, --28518582, -15517717, 3251290, 20577726, -23341000, -16467978, 83362096, -9560597, 43829604, -34971772, -1277216, -25567404, 19338628, -10339060, 29473140, 41802916, 2893734, -32982128, 28332826, -34684008, --30291868, 62000000, -35809828, 23271744, 19589882, -31148176, 17022566, 10460393, 6463389, -4800163, -23849954, 13451301, -31171262, 22849226, 25164750, 5981816, 4079145, 16481400, -586800, -29518236, -39723616, -21552146, 8942659, -15660525, -3921305, 6335614, -7424388, 33867428, 7403450, -2835215, --7641284, -170725, 6600828, -31451508, 10790568, -15452219, -11192148, -6163815, 393526, -14358076, --7156490, 5900212, 34972844, 2435783, -6436546, -19681150, 10009421, 8352638, 2015950, 29091960, --5339718, -156229, 32979444, 12765717, 3315715, -27565636, -14328548, 22978076, 12938052, -25112136, -3088082, -61221536, -29738890, 62624380, -10781442, 36352068, 44729936, 17221208, 11048266, 25086904, --3125126, -15158550, 18344342, 13691819, 6467147, 40351216, 27632746, 37771016, -13725105, -55264956, -6891275, -4113505, 17012366, 9008694, -22792318, 13087302, 8916352, -19648938, -27826556, -13704704, --44405132, -38689604, 25351044, -3815542, -45897096, -10285373, 1071594, 16894790, 10159745, -23347442, --31725850, 5557688, 35956392, -16079821, 11693585, -23746874, 5841693, -27142046, 15830713, 23346906, --18395882, -27998892, -24991878, -628676, 8190503, -10396505, -12698071, -8164196, -43256228, -30989262, -13557601, -25528212, -10120554, 13057237, -27905476, -34934192, 9902584, 22910966, -7259569, -42554536, -15531139, 21058224, 52649856, 3499862, 9892920, 14631880, -30129196, 12896713, -13387413, -46270756, --13643500, 34288336, 938450, -21187610, -69268696, 43906912, 43431784, -10176925, 33298344, 53128208, --5667210, 8993125, 28766080, -13380434, -11127723, 21986474, -4459250, 12113418, -25556130, -83468928, -23110682, -10064719, 62672164, -21772800, -12862890, -25306484, -70189968, 32065152, -40542880, -24548422, -2115272, -420907, 55632712, -39471288, -26502096, 35786204, 22418656, 18564460, -5808944, 17763448, --11669426, -18217640, -15564425, 42158864, 36264020, 54885924, -16357920, -20622822, 2143189, -3637837, -21391084, -33064268, 8340290, -34713000, 19865834, 34238944, 13031468, -27940372, 20505784, -24568286, -57176752, 28655484, 9324374, 7812009, -7154342, -43404940, 26225070, -58955404, 13932874, 11492259, -30565672, 23501524, -49664856, 15994995, -30664992, -18592914, 15612743, -4475893, 20795694, 12898324, --45214732, 19816980, 44682692, 57576184, -14993194, 17411798, -21946746, 40405440, -56023552, -2826625, --11329050, 17613124, 19671488, -62097176, 43461848, -2959769, -4911295, 18555870, 9877351, 21511344, -2005213, 12113418, -26068840, 24883430, 2792266, -20236812, 12593918, -6139119, -3580929, 24434068, -9080635, -30081414, 15439871, -12531104, 24437828, -16945256, 3704409, -7048578, 9558450, -6536940, -2553358, -11315091, 28468654, 543850, -2588792, 12895639, 7183870, -12699681, -6921340, 10792179, -7023346, 13269838, -14885820, 7662222, -3275986, -28708098, -6511708, 12167642, 8017094, 9034464, -3645354, -25208236, 543850, 2351495, -1274532, 10872173, -10117332, 10640781, 363998, 7201587, --11721503, -1954210, -7125888, 38582764, -16983374, 11799886, 7131793, -1684164, 6163815, -7814693, -5270999, 12191802, -15927349, -6799470, 864899, -633508, -2373506, -3015604, -22502408, 8468065, --8503498, 51747376, -3650185, -16884054, -25515864, -11738682, -14293651, 18701362, 10946798, -13785234, -1203665, 1495186, 6201933, 721555, 13074954, 4367982, 10303627, -3649649, -329102, -3215320, -4842576, 10977400, -10296110, -212601, -5087389, 210990, 13571560, -7846369, 1330366, -3635690, -5344013, 2592013, -7441031, -2925947, 7969312, -2624762, 12993350, 9077413, -13599477, 4171487, -2848100, 6939057, 2973191, -13018583, 8640400, -2592550, 8393440, 6565932, -15378667, 4009352, --23085, 3254512, -1786170, -6922414, 10836739, -2877091, 4864051, 71941, -3381750, 4872104, --6631967, -1090922, 8989367, -6421513, -7638063, 15039365, -9940702, 14049375, -1620813, -11545946, -23323284, -21560736, 18578954, -6538551, -11405823, 12179990, -11252277, -25596394, -43371116, 54744192, -157598464, 24665460, 15432354, -115311280, -142109200, -45834816, -27808840, 95988224, 146946944, 75275208, -22033720, -49680960, -106072272, -97159680, -81017040, 6127308, 121730648, 101404712, 58438400, 19487878, --51940652, -67829880, -53519588, -52158084, -18191334, 24225764, 33848636, 69494184, 50077172, 11759084, --16885664, -10355166, -56188908, -27720792, -28387586, -38909184, 22931904, 42764988, 24982752, 62437552, -16689706, -15399068, -24188718, -42293616, -33091112, -5680631, -10286984, 12308839, 25930328, 22628036, -16449188, 10697153, -5866926, -23577222, -16412681, -19754702, 5929203, 21559126, 7081328, 4702989, --9989557, -20806970, -4127464, -974421, -771484, 15134928, 13889387, 15029164, 5647345, -6951942, --18339510, -26736172, -26924076, -17573932, 15055471, 7797513, 2724083, 0, 0, 0, -0, 0, 0, }, +-9216463, -690953, -9408663, -5207648, -1798518, -1622424, -255014, -2236604, -419833, 2037425, +-2442763, 2855617, 351114, -3832185, 2399276, -658741, 2564632, 381178, -3635690, 2573759, +1425392, 2024003, -1553704, -2319819, -1667521, -1928977, 1527398, -316217, 425202, -2103460, +1513976, -2552284, -3497714, 191126, -4347581, -3234110, -1664837, 4675609, 579821, 1805497, +-5655398, 832150, 969052, -4862977, 1753420, 386010, -5078799, -925565, -374199, -3939022, +4518306, -2825015, -1625108, 2663417, -187368, -4773856, -477278, -3299609, 3722126, 3245922, +-4551592, -2374043, -3041374, -2056753, -1284732, 1970853, 1727651, 1132261, 3125663, -27917, +1241246, -458488, -1240172, -1636383, -746787, 11343009, -5726802, 626528, -3499325, -70867, +4510253, 2416456, 2749853, -2404108, 3452080, -3615289, 3898220, 2225867, 4738423, 2259690, +-1166084, -5435281, 5792837, 4310000, 1294933, 864362, 323196, -2226404, -2965138, 3262565, +1662689, 2179696, 2739652, -2895882, -488553, 2943663, 3062312, -298500, -2745021, -4582730, +-253940, 1007707, -3126199, 1189169, 475668, -4129611, -2586107, -209380, 1864016, 158377, +-2371359, 4072166, 432718, -1240709, -3251290, -557809, 26307, -5457293, 2231773, 3561065, +-2266669, 4530117, 3300146, -505732, 2661806, 1846836, 5531918, 1912871, 730681, -870268, +1837709, -4708358, 216359, 2291365, -2757906, 2595234, 2710661, 3393561, 1677185, 4340065, +-10730976, -7254200, -1204202, -4619774, -4230543, 2151242, -6180995, -5668283, 1516124, -2491618, +-2520072, 2558190, -2063195, -3978750, -612033, -175020, -1329292, -1748589, -1279900, -4588636, +-465467, -3273839, -2636573, 0, 4045322, -810138, 5921686, -3045669, 3483219, 4334696, +-4913980, 1770063, -1387274, 1036161, -3540664, 1775969, 1967632, 3363496, -1870458, -3856344, +-1589138, -2066953, 1058173, 1648194, -5032091, -500901, -3531000, -2554432, 670552, -3845070, +-6556268, -1088774, 5949604, 1462436, 1908039, 424665, 1151051, 929860, 1993402, 2527052, +6648610, 591095, -3417183, -3928821, -1209570, -1846836, -897111, -8027294, 1250372, -541166, +2100776, -1059783, 167504, -1922535, -1605781, 7887708, 678068, 573915, 8603893, 9923522, +7634841, 5673115, 8027831, 3263102, 3492345, -721018, 2287070, 8458401, 910533, 2591476, +-3127810, -2073932, 6484864, -4321811, -7903277, 2419140, -6598681, 5735392, 1365263, 6880538, +-2160906, -398895, -1666447, 2286533, 2768643, -57982, -6711960, -1348083, 5804112, -3796751, +2636036, 1578937, -1267015, -1605781, 6454262, 4898947, 11234024, 4546223, 973884, 2753074, +-898722, 759672, 3577171, 2189360, 9595494, -3990025, -2662343, 770410, 2521683, -1385664, +4492536, -4013110, 936303, -128849, -3096135, 1150514, 1051193, -4129074, -5729487, -3404299, +4734128, 2472828, 150861, -103616, 3637301, 581431, 1334661, 6423661, 3200825, -978179, +-685047, 5966247, -4286378, 1465658, 18814642, -460635, 9277129, -1794223, -1315334, 9682467, +-9501005, -3473555, -641024, 4702989, 3474629, -2212445, 1971390, 749472, -8611946, 2037962, +4750771, 3966939, -9672803, -3608846, 1184337, -7181722, -1846836, 345745, 389231, 755914, +-1006633, 4255776, -3088618, 3335042, 7377680, 7092065, -2069101, -4419522, -699006, 8000987, +-426276, -686658, 101469, 556735, -4243965, 468688, 3494493, 245887, 845572, 3033858, +-2180233, 1938104, 1308354, -1213328, 5794448, 249108, 4599910, 575526, -1555315, 1661079, +3055332, 2290828, -167504, -4908611, -4169340, -5850819, -2492155, -609349, -78383, -1074816, +3945464, 3029026, -2783676, -5825587, -26307, 2280091, 3061775, -3772592, -1029182, -5024575, +-13927505, -3649112, -4704063, 887985, 2343979, -2385318, -2765959, -26305064, 557272, 8441221, +-6103149, -9845676, 7407208, -11136850, -1643362, -4978941, -5810017, -3630858, -3627637, 408559, +4523675, -800475, 2550674, -2821257, 3432753, -2552284, -3918621, 1792075, -1422708, -6243272, +-7956964, 3892851, 462246, 3853660, 1244467, 8554501, 1285806, 3025805, -3984119, -6965900, +-1954747, -3398393, 7151121, -3172907, 284005, 1966558, -3399467, 10013716, 6641093, 306016, +-7750806, -9787694, -3274376, 3520263, -8883603, -3221, -4262755, -8315594, 908922, -13133473, +-2851322, -1125281, -4872641, 9349070, -444529, -1044214, -36507, 6071473, 7313793, 2652142, +-7108171, -1764695, -1723356, 4567698, 1920924, 2982318, 5953362, -15421617, -21805012, 2320893, +-4704063, 4544613, -5847061, -11409581, 633508, 9730248, 2431488, 5819144, 5324686, 3452080, +2829847, -3939559, 3082176, 6340446, -10166724, -5321465, -3129421, -2747169, 4243428, -1250909, +1714229, 6599218, 6470905, -2850248, -5550709, 1018444, -2930242, -2913599, -5357972, -4377646, +-8365523, 1739999, -2863670, -442382, 8220031, -1929514, 1926293, 1688459, -5151814, 4325569, +5093295, 6121402, -5242008, 9880035, -1203128, -7893076, -5862094, -8603893, 8142721, -3291556, +-8218420, 2240362, -823560, -6570226, 7083475, 8359080, -2481954, -7798587, 6027450, 1252520, +4874251, -1143535, 12459163, 6410239, -6242198, -4023311, -2559801, -3367791, 4683125, 4606353, +7752416, -20522964, -208843, -3575560, 1174137, 144955, 7613367, 5911486, 7888245, -1137630, +10830834, -4960687, 7292855, 9360881, 1473174, 9327058, 1752884, 2543158, -2799782, -778463, +-4088809, 7418483, -690416, -674847, 9984188, 6329171, -156766, 2902324, -1130650, -201863, +6386617, -3665755, -6856916, 128312, -1195612, 3510062, -18905910, 11320997, 11773579, 4889284, +2037962, 439160, -6241661, -12298639, 7864622, -4891968, -5995238, -3673808, 6995428, -5082020, +4158602, 4705674, -4811974, -2829847, -11145440, 5020280, -7424388, 4215511, 210990, 3774740, +6001143, 10463614, 3904662, -4751845, -12057047, -1982664, 6324340, 11485279, 7840463, -1738925, +-3164317, -7397008, -13321915, -1351304, 7131257, 3710315, 806917, 1886028, 8020852, 26946624, +14877230, -1440425, 2698313, 2267743, 6082748, 10550050, -1388885, 1943473, 18202608, 1679332, +-709743, 10739566, 7688529, -7735773, 4550518, 885300, 7325604, 4791573, -12554726, 9336185, +-5815923, -1081258, 1068910, 7227356, 1317481, 1748589, 5656472, 6241661, -6299107, 6403260, +19925964, -3859565, 9006010, 8995272, -5097053, 6962679, 1796370, -5196911, -5376226, 3151969, +-4846871, -12866111, -1824287, -1027571, 1038845, -16393353, -4157528, 4403952, -10373420, -7300908, +-16924318, 4944581, 7272454, -11919608, -4447976, -6075231, 11573863, -343061, -7354595, -5479305, +-8182450, 3142306, 9474161, -7887171, 3239479, -3822521, 4149475, 10537165, 4006131, 8075613, +8251169, 10420128, 743566, 27285928, 8026220, 582505, -1024887, -4586488, 751619, 4649839, +-2803540, -6999186, -8953933, 147640, 7371775, -9050033, 4734665, 4993437, -1826435, 18203146, +7201587, -5267241, -2652679, -2008971, 7299834, -3384434, -5719286, -7505992, 4861903, -15669114, +1069984, -4873178, -4966056, 4181151, 1593433, -6162205, -2885144, -5956046, 8026757, -3142842, +-11410654, -2123325, 775242, 201327, -6420976, -10426033, 1401770, -2533494, -848256, 2573222, +-1602023, 8361765, 2327336, 4667556, -5386426, 12474733, 4262755, -7436736, 9167608, 15939161, +-4453344, -5001490, 8926553, 7022272, 3597572, 3870303, -10112500, -3775813, -11018202, 2207613, +10590316, 3575024, -13157095, -3968013, 3944928, -14443438, -20863340, -3514894, -440234, 3440806, +-21502754, 10066330, 28809566, -11890080, 20256676, -4633733, -4226248, -6381248, -10285373, 7651484, +426276, 5206574, 5355288, -18916646, 396748, 8712878, -7489886, -4099546, -11712376, 20963736, +-12935368, 10322417, 9966472, -12552042, -4962835, -4402879, 9018894, -10040023, -3870839, 10161893, +-1552094, -2747705, -4727686, 12409771, 2436320, -2019708, -4850629, 324807, -9182640, 10244571, +-930934, 4719096, 25842282, 17157858, -14395120, -10386842, 4341675, -1301375, 11031623, -5843303, +-8261370, -3027415, -15649250, -6142877, -1501628, -12258374, -6612102, 27367532, 6963216, 166967, +-865973, -220117, 8543227, 9715753, -1488743, 9617506, 1344325, -5077188, 1657321, -14384919, +-408559, -13249437, -6523519, 8505109, 12790413, -17325362, 8056285, -22578644, 3608846, 21577916, +-5881421, -5059472, 4310537, -6213207, -5638219, 6393059, -1041530, -774705, -483184, -13972065, +24255828, -25540560, -2688113, -113817, 8745627, 5863704, 177704, -9346386, -7215008, 3658239, +19008988, -983011, -8492224, -5165772, -13601625, -306553, -7979513, -5694053, -2780455, 4919348, +-410706, 1330903, -9107478, 2568391, 2713883, 6621229, 5027796, 6692096, -12278238, 869731, +-2319282, 9037148, 2343979, 17500382, 3910568, -2926483, 1842004, -8076686, 363998, 8263517, +9865540, -13210783, -10489921, 67646, 15541876, -22122302, 6870874, 28108950, 15648176, -5890011, +3484292, -13069585, 7249905, 14750528, -21388938, 6660421, -9503689, -1428077, -28963112, 2006824, +-10795400, 14024142, 3285650, -12258910, -5893232, -17709224, 27798102, 7722888, 14687178, -16546362, +-17951352, -3612604, 5104032, -5326297, -2181844, 8972187, 2779381, 2611340, 8385924, -20489678, +-1992328, 4832, 5352066, -14340896, 2044941, 2119566, -9607842, -5685463, -13319230, -10424959, +79994, 4040491, -10778220, 519154, -4828080, -10005663, 3871913, -333397, 7831336, -21758304, +-22327924, 4321274, -1882269, 8075076, 18797462, 1749125, -11820287, 16428787, -8396124, -16139413, +-12206834, -5564130, 1263794, -17121350, -6582575, 16075526, 22200686, 9035001, 6083285, 4265440, +-2790118, 13838921, 7802345, -17018272, -9352291, -306553, 1331977, 15195057, 9647570, 2103460, +-2819646, -2330020, -8122857, 9937481, 7602092, 17539036, 3555696, 4641249, 1617592, 31219580, +3040300, 6793028, 18395344, 1382980, 22909892, -660351, -10797548, -11467026, -21861384, 4124242, +-9314173, -445603, 1701881, 7967701, 11225971, 19381040, 19779398, -2873333, 17617956, -1097364, +-1607392, 6933151, 14880988, 6749541, 4159139, -23483270, -12184822, -19029926, 9826348, 19650012, +3825742, -8041253, 13609678, 19741280, -2493766, 3362423, -4376035, 16681116, 13994614, 12082817, +-6684043, -11914239, -1673964, -2787434, -27063662, 5200132, 4122632, 2874944, -6539625, -3191161, +-30067456, -10354629, -27186606, -4387846, -20159502, -10288594, 20702816, 5794448, 21853868, 1888175, +-16430934, -7916162, -17031692, -33855080, 5907728, -20742008, -5000953, 20726976, 9800578, 8421894, +3208341, -3423089, 292595, 4376572, -12701829, 12210592, -22698902, -25687126, 1953673, -3718368, +10753524, 21897354, 18920404, 20548734, -11850889, -20419886, 15728170, -9213242, 16262357, 5030481, +-26252450, 6750615, 4836670, -29345900, 15820512, -13258564, -13778792, 8266739, 8935679, 1647657, +10613401, 1067836, 484794, -6636798, -4048544, 6793565, -4154844, -9779641, 617938, -18644990, +6804839, -23769422, -14775761, 1347009, 9507984, -2812667, -10094247, 4282620, 7458211, 6212134, +321586, 20107964, -44900124, -9472550, -12414603, -14111115, 19244674, -14828375, -2336999, -35196720, +-10320270, -3287798, 1636919, 25181394, -6082748, 4268124, -14842870, 13572097, -18425946, -10195715, +9033390, -40210556, 5699959, 24351390, 28671054, 24461450, 13616120, 35325568, 17606682, 2690260, +-8541079, -4640712, -12998719, -23419382, -3071975, 9302899, -38356744, -38178500, -180389, 6684043, +26735634, -8483097, 12261058, 11643119, 5786932, 6516539, -42193760, 33496986, 17915382, 41439992, +14949171, -1400159, -15387794, -9290551, -9665824, -14460081, 10531260, 8249559, -15184320, -16722455, +9026411, 12803834, 21419002, 6512781, -13350369, -19385334, 4216584, 3917010, 1393180, 2958159, +38144140, 13491566, 7344394, 13168907, 13871671, 16164646, 467615, -23492934, 17155174, 53871236, +-5265630, -14050449, -32151052, -6156299, 43091944, 5856725, 18006650, 6839736, -58945204, 13187697, +10998338, 2279554, 6505802, -3029563, 1386738, 13303124, -31351650, -11914776, 27707370, 11508365, +4447976, -22388590, 18024904, 8209830, -20634096, -21386252, -14567455, 23979340, 46189688, 44575856, +47611860, 50037980, 3842922, -17688822, 19793356, 38005628, -77828568, -28494960, 6878390, -46692200, +-41366976, -19015430, -24838870, 2113124, -18103824, 48990544, -4579509, -18471580, -6436546, -38956428, +-9852118, -31610960, -12099460, 4520453, -38966092, -7521025, 31439160, -26625040, -6698539, 7958038, +561030, 11901891, 3407520, -898185, 12183748, 3285650, -18985366, -4686346, 18284750, -9891310, +-23809152, -9116605, -29020020, -15741592, -51390356, 3978750, -34746284, 16013786, 7150584, -14212047, +-45185740, 3039226, -4051765, 55432996, 23411866, -265751, 31679678, 11975443, 1235340, 23597088, +-28518582, -15517717, 3251290, 20577726, -23341000, -16467978, 83362096, -9560597, 43829604, -34971772, +1277216, -25567404, 19338628, -10339060, 29473140, 41802916, 2893734, -32982128, 28332826, -34684008, +-30291868, 62000000, -35809828, 23271744, 19589882, -31148176, 17022566, 10460393, 6463389, -4800163, +23849954, 13451301, -31171262, 22849226, 25164750, 5981816, 4079145, 16481400, -586800, -29518236, +39723616, -21552146, 8942659, -15660525, -3921305, 6335614, -7424388, 33867428, 7403450, -2835215, +-7641284, -170725, 6600828, -31451508, 10790568, -15452219, -11192148, -6163815, 393526, -14358076, +-7156490, 5900212, 34972844, 2435783, -6436546, -19681150, 10009421, 8352638, 2015950, 29091960, +-5339718, -156229, 32979444, 12765717, 3315715, -27565636, -14328548, 22978076, 12938052, -25112136, +3088082, -61221536, -29738890, 62624380, -10781442, 36352068, 44729936, 17221208, 11048266, 25086904, +-3125126, -15158550, 18344342, 13691819, 6467147, 40351216, 27632746, 37771016, -13725105, -55264956, +6891275, -4113505, 17012366, 9008694, -22792318, 13087302, 8916352, -19648938, -27826556, -13704704, +-44405132, -38689604, 25351044, -3815542, -45897096, -10285373, 1071594, 16894790, 10159745, -23347442, +-31725850, 5557688, 35956392, -16079821, 11693585, -23746874, 5841693, -27142046, 15830713, 23346906, +-18395882, -27998892, -24991878, -628676, 8190503, -10396505, -12698071, -8164196, -43256228, -30989262, +13557601, -25528212, -10120554, 13057237, -27905476, -34934192, 9902584, 22910966, -7259569, -42554536, +15531139, 21058224, 52649856, 3499862, 9892920, 14631880, -30129196, 12896713, -13387413, -46270756, +-13643500, 34288336, 938450, -21187610, -69268696, 43906912, 43431784, -10176925, 33298344, 53128208, +-5667210, 8993125, 28766080, -13380434, -11127723, 21986474, -4459250, 12113418, -25556130, -83468928, +23110682, -10064719, 62672164, -21772800, -12862890, -25306484, -70189968, 32065152, -40542880, -24548422, +2115272, -420907, 55632712, -39471288, -26502096, 35786204, 22418656, 18564460, -5808944, 17763448, +-11669426, -18217640, -15564425, 42158864, 36264020, 54885924, -16357920, -20622822, 2143189, -3637837, +21391084, -33064268, 8340290, -34713000, 19865834, 34238944, 13031468, -27940372, 20505784, -24568286, +57176752, 28655484, 9324374, 7812009, -7154342, -43404940, 26225070, -58955404, 13932874, 11492259, +30565672, 23501524, -49664856, 15994995, -30664992, -18592914, 15612743, -4475893, 20795694, 12898324, +-45214732, 19816980, 44682692, 57576184, -14993194, 17411798, -21946746, 40405440, -56023552, -2826625, +-11329050, 17613124, 19671488, -62097176, 43461848, -2959769, -4911295, 18555870, 9877351, 21511344, +2005213, 12113418, -26068840, 24883430, 2792266, -20236812, 12593918, -6139119, -3580929, 24434068, +9080635, -30081414, 15439871, -12531104, 24437828, -16945256, 3704409, -7048578, 9558450, -6536940, +2553358, -11315091, 28468654, 543850, -2588792, 12895639, 7183870, -12699681, -6921340, 10792179, +7023346, 13269838, -14885820, 7662222, -3275986, -28708098, -6511708, 12167642, 8017094, 9034464, +3645354, -25208236, 543850, 2351495, -1274532, 10872173, -10117332, 10640781, 363998, 7201587, +-11721503, -1954210, -7125888, 38582764, -16983374, 11799886, 7131793, -1684164, 6163815, -7814693, +5270999, 12191802, -15927349, -6799470, 864899, -633508, -2373506, -3015604, -22502408, 8468065, +-8503498, 51747376, -3650185, -16884054, -25515864, -11738682, -14293651, 18701362, 10946798, -13785234, +1203665, 1495186, 6201933, 721555, 13074954, 4367982, 10303627, -3649649, -329102, -3215320, +4842576, 10977400, -10296110, -212601, -5087389, 210990, 13571560, -7846369, 1330366, -3635690, +5344013, 2592013, -7441031, -2925947, 7969312, -2624762, 12993350, 9077413, -13599477, 4171487, +2848100, 6939057, 2973191, -13018583, 8640400, -2592550, 8393440, 6565932, -15378667, 4009352, +-23085, 3254512, -1786170, -6922414, 10836739, -2877091, 4864051, 71941, -3381750, 4872104, +-6631967, -1090922, 8989367, -6421513, -7638063, 15039365, -9940702, 14049375, -1620813, -11545946, +23323284, -21560736, 18578954, -6538551, -11405823, 12179990, -11252277, -25596394, -43371116, 54744192, +157598464, 24665460, 15432354, -115311280, -142109200, -45834816, -27808840, 95988224, 146946944, 75275208, +22033720, -49680960, -106072272, -97159680, -81017040, 6127308, 121730648, 101404712, 58438400, 19487878, +-51940652, -67829880, -53519588, -52158084, -18191334, 24225764, 33848636, 69494184, 50077172, 11759084, +-16885664, -10355166, -56188908, -27720792, -28387586, -38909184, 22931904, 42764988, 24982752, 62437552, +16689706, -15399068, -24188718, -42293616, -33091112, -5680631, -10286984, 12308839, 25930328, 22628036, +16449188, 10697153, -5866926, -23577222, -16412681, -19754702, 5929203, 21559126, 7081328, 4702989, +-9989557, -20806970, -4127464, -974421, -771484, 15134928, 13889387, 15029164, 5647345, -6951942, +-18339510, -26736172, -26924076, -17573932, 15055471, 7797513, 2724083, 0, 0, 0, +0, 0, 0, }, }, { { -4990215, --5331128, -6693170, -8210367, -6183143, -3707631, -540629, -3342558, 2524367, -566399, -781147, -1321776, 2819109, -49392, -1805497, -1963874, -3180960, 483184, -2907693, 5175973, 5660230, --2302103, 202937, 1690607, -1453310, 4345433, -1626719, -1887101, 208306, -387621, 3879429, -3149822, 1447404, 773631, -3640522, -1656247, 4308389, -1210107, 1197759, -868657, -2005213, --2586107, -2677375, 2293513, 4832, 453119, 921271, -1221381, 1274532, 2755759, -5076115, --1198833, 2038499, 479963, 2065342, -276489, -4689031, -1698123, 2646774, -2906082, -284005, -2043331, -1753420, -463320, -839666, -2774549, -756451, -2180233, -988916, 217970, -1457068, -162135, 409633, -343061, -1260573, -881005, -2870112, -2877628, 10940355, 1263257, 2972654, -1030792, 1570884, -2653753, -6599754, -1296006, 3500398, 1224066, -3266860, -484258, 2674154, --716186, -3939022, 1158567, -4542465, -2845416, -146029, 1214939, -1299228, -1062468, 2803540, --3954591, -107374, 455267, 1876364, 1457068, 1421097, 4736812, 2136746, -5996848, -1544041, --2756832, 721555, -210990, -485331, -3804267, -4920422, 6402723, -3029026, 1514513, 1832877, -1549946, -6190122, -3562139, -1666984, 598074, -545998, -274878, -635118, 946503, 2261837, --3301756, -93416, 1620813, 1908576, 2283849, 777389, -68183, 2200634, 700617, -1127966, --424665, 3619047, -2927557, -3100967, -1743220, -1352915, 3041911, 1705639, 580357, -1415192, -2889976, -1620276, 1374926, -6254010, -3696356, 2615635, -6028524, -8622684, 1730872, 719944, -1125818, 1244467, 1282048, -7395934, -1129040, 2148021, -4601521, 4933307, 4879083, 4124242, --1562294, 401043, 1217623, 3177202, 830539, -67646, 739271, -2091649, 2113124, -716723, --643171, -941135, 6216965, -3549254, 2254321, -2203855, -1808181, -1960653, 1781875, 3425237, --3364570, -1651952, -1730335, 2557653, 2490007, 3832722, 2722473, 646393, 3461207, -2588255, -2183991, 922881, 1098438, 6977711, 1873143, 3569655, -5274220, -1262184, 2602213, -2521146, -2970507, -915902, -1688996, 1040456, 4456029, 3090766, 2301566, -609349, 1304060, 3460133, --3139084, 5318780, -55298, 4507568, -900333, 3888556, 4782983, 3988414, -644245, -4189741, --1416266, 10172093, 7781407, 5880347, 5397700, 5501316, 2719251, -718333, 159451, -2402497, --348966, 7328825, -3018288, -3669513, 5532992, 3632469, 5334350, -3770981, 1828582, -1581085, -1445793, 1994476, 3455301, 213138, -1977296, -1949915, -2630668, -1298154, -1498407, -5624260, --321586, 4290136, -3191698, -854162, 2016487, -3012383, -2165201, 2324114, -1032403, -3833258, --1568200, 1809792, -2706903, -4194036, -1432372, -1414118, 1712618, -3000035, -5332202, 163209, --549219, -1045288, 2057289, -4940823, -1875290, -165356, -1539746, 2330557, -228707, 854162, --7984344, -2823941, 5219996, -2158758, -4177393, 1088774, 1293859, 996969, -1247151, -7012608, --2549600, 7161858, 989990, 2386391, 2033130, -1459752, 14823543, 9083319, 8623221, 141734, -874563, 674847, -3514357, -7855495, -2949032, 5902896, -4463545, 2662343, 8011188, 626528, --2528662, -1021665, -1615982, -869731, 3238942, 4578972, 164819, 1333051, 1875290, 2975339, -175020, -4236985, 1290101, -6812892, -2057826, -884226, -1904281, -1259499, 825171, -1650878, --3587908, -2803003, -1312649, 267362, -1563905, -4141959, 4853850, -1861868, 310848, -1296543, --3260417, 3994857, 11125039, 2671470, -3955128, 6590628, 1440425, -2059974, 1933809, -1164473, --4397510, 2684, -1905892, 1657857, -3842922, -6467684, 132070, 1074816, -7972533, 2350958, -1471026, 4399657, 2320893, 5821292, -2144799, -3854733, -2498060, -1142998, 2591476, -934155, --5288716, 3535832, -2581275, -7846905, -11822971, -3927748, -5806259, 8398809, -1751810, -1292785, -3447785, -8207146, -5400922, 4538707, -3649649, -3832722, 10201, -577673, 1056562, 2893734, --1119913, 1171989, -1873680, -1811939, 53687, -1639604, -3291556, -592706, -551903, 3361349, -3888556, 2945811, -4129611, 1707786, 1658394, 5740224, -2855617, -542777, -1882269, -4954782, -6780680, -6590091, -2880313, -2784213, 1743220, 5107253, -4874788, 5281736, -426276, 2658585, -4901095, 356482, 3819837, -7163469, 1669132, -2990371, 532039, -7609072, 317291, -2962991, --6205691, -5445482, 564251, 4136054, 427349, -4059818, 5544266, -2524904, 3282429, -1175210, --6455873, 8435853, -5618354, -2114198, -3120831, 1180042, 3944391, 1073742, 3664681, 5302137, -3307662, -8586176, -12099460, 1313186, 1090922, 637266, 7915088, -2582886, -8457864, 863825, -1078037, -2289755, -402116, -7540889, -1388885, 905164, 1214939, 8374650, -1365800, 7504382, --1709397, -1965484, 745177, -7492571, 3310883, -2834679, 4679367, -1276142, -1787780, -2791192, --1215476, 252329, -5438503, 9648107, -6539625, -10877005, 3411278, 486405, -7457674, -2267743, --14461692, 238908, -5025112, -86436, -5462125, -4610111, 1005022, 500364, 2745021, -4654134, -3932580, -5253282, -9861245, 1171989, 3063386, -3104188, 3593814, -1782948, -5310727, -5002563, --6499896, -3314104, -379031, 1023813, -1663763, 6211060, 434329, -2129230, 1010928, 185220, -1839857, 722628, 1355599, -6437082, -4915590, 652835, -18813030, -4701916, 737661, -4776004, --3509525, -5974300, 1549410, 2140504, 4282620, -3191698, -4001299, -4493073, 2279554, 5106716, --2501819, -2106145, -1266479, -712428, 2422899, -10409927, -2559801, 6003828, 1962800, -2981244, -1156957, 5344013, -476205, -1231582, 1877975, -213675, 12912819, -5409512, 3196530, 1172526, --5367636, 1931125, 1264868, -6005438, 4409858, -8588861, -792421, 7935489, 1765232, -28454, --1568737, -5778342, -5106179, 1606318, 3400004, -2014877, 1691680, 6678674, 3252901, -2394981, -4030290, -5411659, -13339095, -1466731, -5816997, 4057670, -3699041, 9873056, 4845260, -68719, --1484985, -11958263, 3979287, 5136781, -3694746, 7988639, -5750961, 2771328, -9670656, 5061082, -3718368, -10644003, 5093831, 7533910, 18694918, 19143206, 4263292, 5426691, 377420, 2340220, -478352, 1588064, -4949413, 1934346, -2990908, 3817152, 4344897, 9530532, 1775432, -2596845, -6513318, 3968550, 7772817, -231928, 4883915, 2114198, -2201171, 1705639, 11418171, 1114007, --4780836, -3340948, 8438000, 4431870, 4076461, 7006703, -5949604, 1534377, 9273908, -10064182, --11051488, 2782602, 5874979, 8722005, -4236985, -8120173, 5730560, 1132798, -994822, 2596308, --1611150, -1947768, -237834, 12576738, -5170067, 1602560, -3557307, -3357591, -1905892, 5838471, --1280437, 14560476, 7261716, -9120363, 8471823, 373662, 3653407, 224949, 1362042, 332860, --3583077, 3346853, -13391171, -5622649, 4829154, -15519864, 3212636, -13726179, 29292750, 6223408, -3804804, -7894150, 12090870, -3364570, -1518271, -2457795, -220117, -7502771, -1587527, 4992363, -10737, -5921150, 7665980, -1077500, -5407901, 2248952, 1758789, -7888781, -13445395, 6209986, --6102612, -6358699, 515933, 999654, -4732517, 7565048, -7502234, 3223373, 5406290, -55835, -8305393, 3990562, -12644384, -11149198, -6169721, 1896228, 1291711, -8555038, 2560338, 4652524, -902480, 4262755, 3331284, -8886824, -5957120, 4104915, -12153684, -2844342, -1212255, -10373957, --7167764, -2704219, 1401233, -4647155, -13575855, -4646081, -7703024, 16008417, 6099928, 245350, -1031329, -2414309, 10649908, 15539192, 581968, 11039140, 5823439, 4511327, 668941, -3406983, --2212982, -2537252, 5664525, -6381248, -1294396, -20643224, 13948443, 22348326, -16741246, -9987410, -4641249, 4017405, -3359738, 7358890, 2048163, -6230924, -7579007, -130460, -2388002, -5421323, -2866354, -2467996, 441308, 6228777, -8224863, 1803349, 1218697, -4881231, 821413, -7779797, -1655173, 11587285, 6008123, -1076426, -3556770, -861141, -6418829, -6909529, 3610457, 5920076, --1658394, -3121904, -2102387, 3591130, 6009196, 2899103, 10853382, -5604396, 4611185, -2633352, -1298691, 6765111, -2118493, -1963337, -12370580, -1798518, -9494562, 5074504, 3692061, 12756590, --10451803, -3824669, -10078141, -17046188, -2483028, 7349763, -11442330, 2813204, -828929, -8488466, --9684078, -12695386, 17921288, 863288, 10992969, 7790534, 9598178, -3678640, -10384694, -8366597, --9060234, 4129074, -15713675, 11249056, -1028108, -6443525, 10439992, 3149822, -9249212, -14282377, --4889284, -307627, 790274, 338229, -4439386, 15505369, 7096360, 4478577, 4210142, 4689031, --4239670, 926102, 3737695, 2057826, 14825690, 1241246, -20549272, 2384781, 9466108, -8108362, --11237245, -2711735, -5774047, -3993783, 1705639, 14821395, 9706626, -1655173, 416075, -4634807, --12331925, -4536023, -10024454, 7654706, 11417634, 76236, -5013301, -2179159, -1535988, 4837207, -7662759, 7157026, -15563888, 3221762, 1566589, 1520418, 12524662, -6614787, 5782637, -5998459, --3284576, 1364189, 8694624, 13719736, -912681, -8527121, 4134980, -15488189, 13964012, 7107634, --85362, -6143951, 4994510, -3221762, -6020471, -6003828, -5024575, -5984500, -2711198, 8748848, --14868103, -2923262, 7984344, -10258529, -2150168, -97711, -2493766, -12104292, 12066174, 6695854, --10077067, -520765, -4884452, -2279554, -20946556, -1740536, -10106058, -21460878, 3827890, 4565014, --11236171, -7384660, -13066364, -12647068, 10726681, 7727720, 11341935, 1566053, 24889872, 2361158, -12519293, 19768660, -3164854, 6867116, 18157512, -11717208, 4891968, -6563247, 12160126, -2899640, -24646670, 12939663, -9043591, -10778220, 945430, 7285875, 9638980, 4248260, -10380936, -732829, -7394860, 20543366, -9103720, 14311905, -5821828, 9386651, -16135118, 7548942, -9356049, 7648263, --306016, 3814468, -4061429, 13777718, 15031312, -27780386, 7509214, 8607651, 2663417, -2783139, -1769527, -18369038, -1283122, 15064598, 15735686, -3291019, 16389058, -655519, -3513283, 1517197, -9219684, -3233037, -4226248, -1663226, -11722039, 2210298, -3337190, 18771692, 12198244, -8464307, --9251896, -17166448, -6320581, 13113609, 23053236, -10023917, 7233262, 1974074, 3194919, 12956843, -9146133, -17462800, 3802120, -5887864, -3383361, -6855305, -3750580, -7234873, -16976932, 3647501, -11940009, 5085778, 27511414, -5906654, -3297461, 19553912, -6383932, -293132, -3675955, 5786932, --20110648, -12437688, 7814693, 16357920, 23233088, 27846420, -19035832, -9280887, -225486, 10040023, -1611, 31634582, 9475235, 5724118, -22621056, 2873870, 1362042, 12765180, 16276852, -9750113, --2208687, 6162741, -3174518, 1595044, 18918258, 7838316, -14560476, 6167036, 11390790, -6849399, -22504554, 4734128, 30258582, 15921444, -9280351, -1566589, -29944512, 3337727, 6602976, 3110093, -42059540, -4347581, -4301947, -17823578, -17395692, 7832410, -14410689, -7045894, -10004589, -4902169, -9675488, -5851893, -13330505, -9457518, -71941, 11965242, -14941117, 4302484, 5253819, 2574833, -14513768, -615254, 179852, -14606110, -23292682, -7951058, 9145059, -11053098, 1921998, -9074192, --39904540, -19670950, 10570988, 2086817, -23339926, 4697621, 29906932, -154082, -1915555, -10816338, -5654862, -12056510, -25094420, 1918240, 2465311, -7965017, 3394635, 10352482, -3456375, -6477885, -5182952, 9746891, 14228153, -7573638, 10300405, 16372415, 4846334, 27459336, 1356673, -14793478, -17296908, 2571612, 1270774, -2014340, -6084895, 13289703, -14703821, 736587, 15426449, -21738440, --24663312, -27788976, 38511360, -21059298, 4329864, -516470, -13374528, 20635708, -24381456, 10802916, -40894532, 26363584, 5010616, -33306934, -2899103, -21793200, -12375411, -19871740, -3000572, 6343667, --4772246, 16581795, -8853001, 3168612, 6774237, 22928146, 1917166, 3556770, 25927106, -17452062, --3827353, 12403866, -6579890, -13475460, -10606959, 14073534, -13375065, 6105296, 21769042, -6129455, --43492448, -2234994, 8880919, -51203528, 29399588, 24267102, -21304112, 32231046, 19810536, 14526653, -31207770, 973347, 14994805, 2215666, -139050, 12188043, -23341000, 21270288, 26136486, 22233972, --25262460, -4156455, 28606092, -14914811, 21875342, 23204098, 50041736, 32680406, -1822677, 4406100, --11030013, 7820062, 4486630, -28810640, -50102404, -9320616, 23591182, 30049202, -58759448, -53081500, -22717156, -15126875, -17430052, -6858526, -21002926, 7280507, -33662344, 41531260, 14784351, -17390860, --1275068, -17090212, -13708462, -13884556, -16670379, -10442676, -40805412, -36056788, -7847979, -8582418, -994822, 2815351, 5546414, -3168075, 3626563, 5888400, 16137266, 18699214, -8985072, -10839961, --13281649, -10889353, -24254754, 32241782, -13703093, 6852621, 22810572, 22033182, -11025718, -11611981, --20941724, -13983877, -17729088, 23825794, 216896, 1141924, -34463892, -13483513, 43096240, -6862821, -39734352, -11264625, -19283866, -12970801, -21620866, -21683142, -7192460, -3224447, -29637422, -1629940, -7665443, -5207111, 4554276, -63539748, -29475286, -21729850, 24715926, -13489419, -2703145, 3544959, -39042864, 4756677, -19370840, -32320166, 65497716, -22164178, -11268920, 36399312, -22439594, -37750616, -35245040, -50286012, -12506408, 10074383, 10014790, -35475892, -11715597, 27843736, 1845762, -7131793, --17346300, 21602074, -21082920, 188442, 19758460, -7322919, 18291192, -1148904, -6478422, 4317516, -5663988, -11099806, 17504140, -9856413, -1778117, 3565360, 1435056, -129923, -1211718, 3608310, -11764989, 15145128, 25052008, 10428717, -7861938, -3638911, -13017509, 12748000, -3159485, -22209812, -6761889, -721555, -10423886, -29939680, 22273700, 859530, -11800960, 32353452, 3575024, -10775536, --4310537, 48367776, -44113608, -49609556, 31527208, 46513960, -84973784, 207769, -30677878, -29133300, --11729019, 31490164, -23427972, 41839960, -5440113, -548682, 55707336, -14940044, -44533444, 53691924, -52155936, 39657044, -19358492, -22463752, -8167954, 7718593, 37164352, 30606474, -11577621, -1319629, -10625212, 33271502, -11906723, 81604, 17904644, -22844932, -22641456, 18898392, -12640626, -6433861, --11723650, 1111860, -18435610, 3481608, 10468983, -5029944, 7814693, -5822365, -6304475, -2768107, --24917790, 5931350, -10799158, 17015050, 29844118, 4289062, 14295799, 15500537, 32749, 8645232, -8574365, 35818416, -24414742, 18932216, 12882754, -13699335, 10187126, 14301704, 2420751, -11477763, --30996242, -26583700, 8917963, 14746233, -12481712, -46430208, 40079024, -9423695, -23196582, -8042327, -40334036, -14313515, 44208100, 5616744, 14169634, -36399312, 39229156, -11545409, 16826072, 2357937, --59235652, -9335648, 10591389, -25224342, 36361728, 17562658, -53324704, -38901668, -26764626, 9829570, --11012296, 12731894, -19931332, -36089536, -478352, -38360500, 10133975, -2701535, -7584376, 13888314, -21056078, -13034152, 2569464, 24605330, -19122806, 33092186, -4778688, -34547108, 29953638, -13707925, --6931541, 28020366, -35089344, 10112500, 219043, 13580150, -5789616, -11719355, -53255448, 13183939, --22130892, -52119428, 64043868, -42191076, -18242874, -7477538, -14814416, -31525596, 18189724, 45540612, --27566710, 13653164, -39901320, -21303038, -22723598, 21315386, 3625489, 59519120, -9957882, -3520800, --17265232, -48843440, 209917, 25843356, -18359374, 21976274, 24906516, -19256486, 2390686, -16115254, --73817600, -37196028, -22397718, -76101992, 50333796, 67680096, 31452046, -63795832, -52476984, -115839560, -17899276, 144502560, 66134980, 30247844, -35484484, -116993296, -54767276, 39440148, -6903623, -9912248, -2044404, 17182016, 1383516, -4549444, 14528801, 3580392, 5528697, 20447802, -12598750, -1218160, -12202002, -4965519, -999654, 12487617, -11563126, -4136591, 4844723, 20234664, -13065827, -11097122, -12964896, -1663226, 7729868, -22227530, 28734404, -7718056, 10380936, -7177964, 4603668, 13964012, -7681012, -4690641, 14028974, -6104223, 14172318, -11517492, 275952, 12361990, -2064806, -6841346, --26284662, 1546725, 22217866, 962610, 10998874, -15122580, -3286724, -9598715, -7569880, -4911832, -16447577, -6970195, 10507101, -13489419, -13170517, -7681549, 4707284, 26385058, -9372692, 11033771, -2292439, 961536, -12084427, 5459977, 16301012, -1505386, -11131481, 7494718, -6212670, 3379603, --1795833, -8837432, 53140020, 10554882, -28481538, -20227686, -31456340, -9970767, 6053220, 16711718, --5218922, -6746320, -5816460, -5598490, -5299453, 7642895, -3875134, -1060320, -1680406, -5527086, --1318555, 8400956, 1206886, -2419140, -8382166, 9640054, -12483322, 7351374, -4451734, -12251394, -62814, 5596880, 6299107, 4926865, -7228430, 1621350, -2305324, -3960497, 14784351, -13143137, --2377801, -530965, -884226, 1386201, -2172180, -7723425, 6532109, -12242267, 11708081, -1714766, --8159901, 2824478, -4185983, 10374494, -6025302, -3686693, 11266773, -10066866, 3556233, -4832912, --1037772, 8571681, -6066105, -2475512, 7792682, -5331128, 2122788, 746787, -6152004, 15171435, --13174275, -1194538, 6007049, -3443490, 9913858, -4461398, -1873680, 2568927, -25028386, -37926708, -49657876, 154407296, 13345537, 13313862, -105246560, -133411888, -27664422, -28378996, 78596288, 133451616, -68653976, 13033615, -48258788, -94241784, -66320736, -47653200, -2390149, 64908768, 95189360, 51213192, -11841225, -33551748, -59223840, -33403034, -31887448, -30128122, 18946712, 38529076, 38234336, 38246148, -9280887, -16930762, -6825777, -25614112, -39679592, -4668630, -11832098, -8294119, 35833448, 20410222, -29925184, 17847200, -13601625, -32990718, -7904888, -21576842, -3331284, 14478335, 4483409, 7630010, -16112570, -8629126, -11594264, -3093450, -6877317, 6053757, 10305774, 44023, 12725988, 7088844, --13775571, -13667660, -21046950, -18468360, 454193, 20640540, 32067836, 14737643, 3565897, -8627516, --22477712, -5037460, -25556130, -16676821, 10130754, 5693516, 8642548, -1285269, 0, 0, -0, 0, 0, }, +-5331128, -6693170, -8210367, -6183143, -3707631, -540629, -3342558, 2524367, -566399, -781147, +1321776, 2819109, -49392, -1805497, -1963874, -3180960, 483184, -2907693, 5175973, 5660230, +-2302103, 202937, 1690607, -1453310, 4345433, -1626719, -1887101, 208306, -387621, 3879429, +3149822, 1447404, 773631, -3640522, -1656247, 4308389, -1210107, 1197759, -868657, -2005213, +-2586107, -2677375, 2293513, 4832, 453119, 921271, -1221381, 1274532, 2755759, -5076115, +-1198833, 2038499, 479963, 2065342, -276489, -4689031, -1698123, 2646774, -2906082, -284005, +2043331, -1753420, -463320, -839666, -2774549, -756451, -2180233, -988916, 217970, -1457068, +162135, 409633, -343061, -1260573, -881005, -2870112, -2877628, 10940355, 1263257, 2972654, +1030792, 1570884, -2653753, -6599754, -1296006, 3500398, 1224066, -3266860, -484258, 2674154, +-716186, -3939022, 1158567, -4542465, -2845416, -146029, 1214939, -1299228, -1062468, 2803540, +-3954591, -107374, 455267, 1876364, 1457068, 1421097, 4736812, 2136746, -5996848, -1544041, +-2756832, 721555, -210990, -485331, -3804267, -4920422, 6402723, -3029026, 1514513, 1832877, +1549946, -6190122, -3562139, -1666984, 598074, -545998, -274878, -635118, 946503, 2261837, +-3301756, -93416, 1620813, 1908576, 2283849, 777389, -68183, 2200634, 700617, -1127966, +-424665, 3619047, -2927557, -3100967, -1743220, -1352915, 3041911, 1705639, 580357, -1415192, +2889976, -1620276, 1374926, -6254010, -3696356, 2615635, -6028524, -8622684, 1730872, 719944, +1125818, 1244467, 1282048, -7395934, -1129040, 2148021, -4601521, 4933307, 4879083, 4124242, +-1562294, 401043, 1217623, 3177202, 830539, -67646, 739271, -2091649, 2113124, -716723, +-643171, -941135, 6216965, -3549254, 2254321, -2203855, -1808181, -1960653, 1781875, 3425237, +-3364570, -1651952, -1730335, 2557653, 2490007, 3832722, 2722473, 646393, 3461207, -2588255, +2183991, 922881, 1098438, 6977711, 1873143, 3569655, -5274220, -1262184, 2602213, -2521146, +2970507, -915902, -1688996, 1040456, 4456029, 3090766, 2301566, -609349, 1304060, 3460133, +-3139084, 5318780, -55298, 4507568, -900333, 3888556, 4782983, 3988414, -644245, -4189741, +-1416266, 10172093, 7781407, 5880347, 5397700, 5501316, 2719251, -718333, 159451, -2402497, +-348966, 7328825, -3018288, -3669513, 5532992, 3632469, 5334350, -3770981, 1828582, -1581085, +1445793, 1994476, 3455301, 213138, -1977296, -1949915, -2630668, -1298154, -1498407, -5624260, +-321586, 4290136, -3191698, -854162, 2016487, -3012383, -2165201, 2324114, -1032403, -3833258, +-1568200, 1809792, -2706903, -4194036, -1432372, -1414118, 1712618, -3000035, -5332202, 163209, +-549219, -1045288, 2057289, -4940823, -1875290, -165356, -1539746, 2330557, -228707, 854162, +-7984344, -2823941, 5219996, -2158758, -4177393, 1088774, 1293859, 996969, -1247151, -7012608, +-2549600, 7161858, 989990, 2386391, 2033130, -1459752, 14823543, 9083319, 8623221, 141734, +874563, 674847, -3514357, -7855495, -2949032, 5902896, -4463545, 2662343, 8011188, 626528, +-2528662, -1021665, -1615982, -869731, 3238942, 4578972, 164819, 1333051, 1875290, 2975339, +175020, -4236985, 1290101, -6812892, -2057826, -884226, -1904281, -1259499, 825171, -1650878, +-3587908, -2803003, -1312649, 267362, -1563905, -4141959, 4853850, -1861868, 310848, -1296543, +-3260417, 3994857, 11125039, 2671470, -3955128, 6590628, 1440425, -2059974, 1933809, -1164473, +-4397510, 2684, -1905892, 1657857, -3842922, -6467684, 132070, 1074816, -7972533, 2350958, +1471026, 4399657, 2320893, 5821292, -2144799, -3854733, -2498060, -1142998, 2591476, -934155, +-5288716, 3535832, -2581275, -7846905, -11822971, -3927748, -5806259, 8398809, -1751810, -1292785, +3447785, -8207146, -5400922, 4538707, -3649649, -3832722, 10201, -577673, 1056562, 2893734, +-1119913, 1171989, -1873680, -1811939, 53687, -1639604, -3291556, -592706, -551903, 3361349, +3888556, 2945811, -4129611, 1707786, 1658394, 5740224, -2855617, -542777, -1882269, -4954782, +6780680, -6590091, -2880313, -2784213, 1743220, 5107253, -4874788, 5281736, -426276, 2658585, +4901095, 356482, 3819837, -7163469, 1669132, -2990371, 532039, -7609072, 317291, -2962991, +-6205691, -5445482, 564251, 4136054, 427349, -4059818, 5544266, -2524904, 3282429, -1175210, +-6455873, 8435853, -5618354, -2114198, -3120831, 1180042, 3944391, 1073742, 3664681, 5302137, +3307662, -8586176, -12099460, 1313186, 1090922, 637266, 7915088, -2582886, -8457864, 863825, +1078037, -2289755, -402116, -7540889, -1388885, 905164, 1214939, 8374650, -1365800, 7504382, +-1709397, -1965484, 745177, -7492571, 3310883, -2834679, 4679367, -1276142, -1787780, -2791192, +-1215476, 252329, -5438503, 9648107, -6539625, -10877005, 3411278, 486405, -7457674, -2267743, +-14461692, 238908, -5025112, -86436, -5462125, -4610111, 1005022, 500364, 2745021, -4654134, +3932580, -5253282, -9861245, 1171989, 3063386, -3104188, 3593814, -1782948, -5310727, -5002563, +-6499896, -3314104, -379031, 1023813, -1663763, 6211060, 434329, -2129230, 1010928, 185220, +1839857, 722628, 1355599, -6437082, -4915590, 652835, -18813030, -4701916, 737661, -4776004, +-3509525, -5974300, 1549410, 2140504, 4282620, -3191698, -4001299, -4493073, 2279554, 5106716, +-2501819, -2106145, -1266479, -712428, 2422899, -10409927, -2559801, 6003828, 1962800, -2981244, +1156957, 5344013, -476205, -1231582, 1877975, -213675, 12912819, -5409512, 3196530, 1172526, +-5367636, 1931125, 1264868, -6005438, 4409858, -8588861, -792421, 7935489, 1765232, -28454, +-1568737, -5778342, -5106179, 1606318, 3400004, -2014877, 1691680, 6678674, 3252901, -2394981, +4030290, -5411659, -13339095, -1466731, -5816997, 4057670, -3699041, 9873056, 4845260, -68719, +-1484985, -11958263, 3979287, 5136781, -3694746, 7988639, -5750961, 2771328, -9670656, 5061082, +3718368, -10644003, 5093831, 7533910, 18694918, 19143206, 4263292, 5426691, 377420, 2340220, +478352, 1588064, -4949413, 1934346, -2990908, 3817152, 4344897, 9530532, 1775432, -2596845, +6513318, 3968550, 7772817, -231928, 4883915, 2114198, -2201171, 1705639, 11418171, 1114007, +-4780836, -3340948, 8438000, 4431870, 4076461, 7006703, -5949604, 1534377, 9273908, -10064182, +-11051488, 2782602, 5874979, 8722005, -4236985, -8120173, 5730560, 1132798, -994822, 2596308, +-1611150, -1947768, -237834, 12576738, -5170067, 1602560, -3557307, -3357591, -1905892, 5838471, +-1280437, 14560476, 7261716, -9120363, 8471823, 373662, 3653407, 224949, 1362042, 332860, +-3583077, 3346853, -13391171, -5622649, 4829154, -15519864, 3212636, -13726179, 29292750, 6223408, +3804804, -7894150, 12090870, -3364570, -1518271, -2457795, -220117, -7502771, -1587527, 4992363, +10737, -5921150, 7665980, -1077500, -5407901, 2248952, 1758789, -7888781, -13445395, 6209986, +-6102612, -6358699, 515933, 999654, -4732517, 7565048, -7502234, 3223373, 5406290, -55835, +8305393, 3990562, -12644384, -11149198, -6169721, 1896228, 1291711, -8555038, 2560338, 4652524, +902480, 4262755, 3331284, -8886824, -5957120, 4104915, -12153684, -2844342, -1212255, -10373957, +-7167764, -2704219, 1401233, -4647155, -13575855, -4646081, -7703024, 16008417, 6099928, 245350, +1031329, -2414309, 10649908, 15539192, 581968, 11039140, 5823439, 4511327, 668941, -3406983, +-2212982, -2537252, 5664525, -6381248, -1294396, -20643224, 13948443, 22348326, -16741246, -9987410, +4641249, 4017405, -3359738, 7358890, 2048163, -6230924, -7579007, -130460, -2388002, -5421323, +2866354, -2467996, 441308, 6228777, -8224863, 1803349, 1218697, -4881231, 821413, -7779797, +1655173, 11587285, 6008123, -1076426, -3556770, -861141, -6418829, -6909529, 3610457, 5920076, +-1658394, -3121904, -2102387, 3591130, 6009196, 2899103, 10853382, -5604396, 4611185, -2633352, +1298691, 6765111, -2118493, -1963337, -12370580, -1798518, -9494562, 5074504, 3692061, 12756590, +-10451803, -3824669, -10078141, -17046188, -2483028, 7349763, -11442330, 2813204, -828929, -8488466, +-9684078, -12695386, 17921288, 863288, 10992969, 7790534, 9598178, -3678640, -10384694, -8366597, +-9060234, 4129074, -15713675, 11249056, -1028108, -6443525, 10439992, 3149822, -9249212, -14282377, +-4889284, -307627, 790274, 338229, -4439386, 15505369, 7096360, 4478577, 4210142, 4689031, +-4239670, 926102, 3737695, 2057826, 14825690, 1241246, -20549272, 2384781, 9466108, -8108362, +-11237245, -2711735, -5774047, -3993783, 1705639, 14821395, 9706626, -1655173, 416075, -4634807, +-12331925, -4536023, -10024454, 7654706, 11417634, 76236, -5013301, -2179159, -1535988, 4837207, +7662759, 7157026, -15563888, 3221762, 1566589, 1520418, 12524662, -6614787, 5782637, -5998459, +-3284576, 1364189, 8694624, 13719736, -912681, -8527121, 4134980, -15488189, 13964012, 7107634, +-85362, -6143951, 4994510, -3221762, -6020471, -6003828, -5024575, -5984500, -2711198, 8748848, +-14868103, -2923262, 7984344, -10258529, -2150168, -97711, -2493766, -12104292, 12066174, 6695854, +-10077067, -520765, -4884452, -2279554, -20946556, -1740536, -10106058, -21460878, 3827890, 4565014, +-11236171, -7384660, -13066364, -12647068, 10726681, 7727720, 11341935, 1566053, 24889872, 2361158, +12519293, 19768660, -3164854, 6867116, 18157512, -11717208, 4891968, -6563247, 12160126, -2899640, +24646670, 12939663, -9043591, -10778220, 945430, 7285875, 9638980, 4248260, -10380936, -732829, +7394860, 20543366, -9103720, 14311905, -5821828, 9386651, -16135118, 7548942, -9356049, 7648263, +-306016, 3814468, -4061429, 13777718, 15031312, -27780386, 7509214, 8607651, 2663417, -2783139, +1769527, -18369038, -1283122, 15064598, 15735686, -3291019, 16389058, -655519, -3513283, 1517197, +9219684, -3233037, -4226248, -1663226, -11722039, 2210298, -3337190, 18771692, 12198244, -8464307, +-9251896, -17166448, -6320581, 13113609, 23053236, -10023917, 7233262, 1974074, 3194919, 12956843, +9146133, -17462800, 3802120, -5887864, -3383361, -6855305, -3750580, -7234873, -16976932, 3647501, +11940009, 5085778, 27511414, -5906654, -3297461, 19553912, -6383932, -293132, -3675955, 5786932, +-20110648, -12437688, 7814693, 16357920, 23233088, 27846420, -19035832, -9280887, -225486, 10040023, +1611, 31634582, 9475235, 5724118, -22621056, 2873870, 1362042, 12765180, 16276852, -9750113, +-2208687, 6162741, -3174518, 1595044, 18918258, 7838316, -14560476, 6167036, 11390790, -6849399, +22504554, 4734128, 30258582, 15921444, -9280351, -1566589, -29944512, 3337727, 6602976, 3110093, +42059540, -4347581, -4301947, -17823578, -17395692, 7832410, -14410689, -7045894, -10004589, -4902169, +9675488, -5851893, -13330505, -9457518, -71941, 11965242, -14941117, 4302484, 5253819, 2574833, +14513768, -615254, 179852, -14606110, -23292682, -7951058, 9145059, -11053098, 1921998, -9074192, +-39904540, -19670950, 10570988, 2086817, -23339926, 4697621, 29906932, -154082, -1915555, -10816338, +5654862, -12056510, -25094420, 1918240, 2465311, -7965017, 3394635, 10352482, -3456375, -6477885, +5182952, 9746891, 14228153, -7573638, 10300405, 16372415, 4846334, 27459336, 1356673, -14793478, +17296908, 2571612, 1270774, -2014340, -6084895, 13289703, -14703821, 736587, 15426449, -21738440, +-24663312, -27788976, 38511360, -21059298, 4329864, -516470, -13374528, 20635708, -24381456, 10802916, +40894532, 26363584, 5010616, -33306934, -2899103, -21793200, -12375411, -19871740, -3000572, 6343667, +-4772246, 16581795, -8853001, 3168612, 6774237, 22928146, 1917166, 3556770, 25927106, -17452062, +-3827353, 12403866, -6579890, -13475460, -10606959, 14073534, -13375065, 6105296, 21769042, -6129455, +-43492448, -2234994, 8880919, -51203528, 29399588, 24267102, -21304112, 32231046, 19810536, 14526653, +31207770, 973347, 14994805, 2215666, -139050, 12188043, -23341000, 21270288, 26136486, 22233972, +-25262460, -4156455, 28606092, -14914811, 21875342, 23204098, 50041736, 32680406, -1822677, 4406100, +-11030013, 7820062, 4486630, -28810640, -50102404, -9320616, 23591182, 30049202, -58759448, -53081500, +22717156, -15126875, -17430052, -6858526, -21002926, 7280507, -33662344, 41531260, 14784351, -17390860, +-1275068, -17090212, -13708462, -13884556, -16670379, -10442676, -40805412, -36056788, -7847979, -8582418, +994822, 2815351, 5546414, -3168075, 3626563, 5888400, 16137266, 18699214, -8985072, -10839961, +-13281649, -10889353, -24254754, 32241782, -13703093, 6852621, 22810572, 22033182, -11025718, -11611981, +-20941724, -13983877, -17729088, 23825794, 216896, 1141924, -34463892, -13483513, 43096240, -6862821, +39734352, -11264625, -19283866, -12970801, -21620866, -21683142, -7192460, -3224447, -29637422, -1629940, +7665443, -5207111, 4554276, -63539748, -29475286, -21729850, 24715926, -13489419, -2703145, 3544959, +39042864, 4756677, -19370840, -32320166, 65497716, -22164178, -11268920, 36399312, -22439594, -37750616, +35245040, -50286012, -12506408, 10074383, 10014790, -35475892, -11715597, 27843736, 1845762, -7131793, +-17346300, 21602074, -21082920, 188442, 19758460, -7322919, 18291192, -1148904, -6478422, 4317516, +5663988, -11099806, 17504140, -9856413, -1778117, 3565360, 1435056, -129923, -1211718, 3608310, +11764989, 15145128, 25052008, 10428717, -7861938, -3638911, -13017509, 12748000, -3159485, -22209812, +6761889, -721555, -10423886, -29939680, 22273700, 859530, -11800960, 32353452, 3575024, -10775536, +-4310537, 48367776, -44113608, -49609556, 31527208, 46513960, -84973784, 207769, -30677878, -29133300, +-11729019, 31490164, -23427972, 41839960, -5440113, -548682, 55707336, -14940044, -44533444, 53691924, +52155936, 39657044, -19358492, -22463752, -8167954, 7718593, 37164352, 30606474, -11577621, -1319629, +10625212, 33271502, -11906723, 81604, 17904644, -22844932, -22641456, 18898392, -12640626, -6433861, +-11723650, 1111860, -18435610, 3481608, 10468983, -5029944, 7814693, -5822365, -6304475, -2768107, +-24917790, 5931350, -10799158, 17015050, 29844118, 4289062, 14295799, 15500537, 32749, 8645232, +8574365, 35818416, -24414742, 18932216, 12882754, -13699335, 10187126, 14301704, 2420751, -11477763, +-30996242, -26583700, 8917963, 14746233, -12481712, -46430208, 40079024, -9423695, -23196582, -8042327, +40334036, -14313515, 44208100, 5616744, 14169634, -36399312, 39229156, -11545409, 16826072, 2357937, +-59235652, -9335648, 10591389, -25224342, 36361728, 17562658, -53324704, -38901668, -26764626, 9829570, +-11012296, 12731894, -19931332, -36089536, -478352, -38360500, 10133975, -2701535, -7584376, 13888314, +21056078, -13034152, 2569464, 24605330, -19122806, 33092186, -4778688, -34547108, 29953638, -13707925, +-6931541, 28020366, -35089344, 10112500, 219043, 13580150, -5789616, -11719355, -53255448, 13183939, +-22130892, -52119428, 64043868, -42191076, -18242874, -7477538, -14814416, -31525596, 18189724, 45540612, +-27566710, 13653164, -39901320, -21303038, -22723598, 21315386, 3625489, 59519120, -9957882, -3520800, +-17265232, -48843440, 209917, 25843356, -18359374, 21976274, 24906516, -19256486, 2390686, -16115254, +-73817600, -37196028, -22397718, -76101992, 50333796, 67680096, 31452046, -63795832, -52476984, -115839560, +17899276, 144502560, 66134980, 30247844, -35484484, -116993296, -54767276, 39440148, -6903623, -9912248, +2044404, 17182016, 1383516, -4549444, 14528801, 3580392, 5528697, 20447802, -12598750, -1218160, +12202002, -4965519, -999654, 12487617, -11563126, -4136591, 4844723, 20234664, -13065827, -11097122, +12964896, -1663226, 7729868, -22227530, 28734404, -7718056, 10380936, -7177964, 4603668, 13964012, +7681012, -4690641, 14028974, -6104223, 14172318, -11517492, 275952, 12361990, -2064806, -6841346, +-26284662, 1546725, 22217866, 962610, 10998874, -15122580, -3286724, -9598715, -7569880, -4911832, +16447577, -6970195, 10507101, -13489419, -13170517, -7681549, 4707284, 26385058, -9372692, 11033771, +2292439, 961536, -12084427, 5459977, 16301012, -1505386, -11131481, 7494718, -6212670, 3379603, +-1795833, -8837432, 53140020, 10554882, -28481538, -20227686, -31456340, -9970767, 6053220, 16711718, +-5218922, -6746320, -5816460, -5598490, -5299453, 7642895, -3875134, -1060320, -1680406, -5527086, +-1318555, 8400956, 1206886, -2419140, -8382166, 9640054, -12483322, 7351374, -4451734, -12251394, +62814, 5596880, 6299107, 4926865, -7228430, 1621350, -2305324, -3960497, 14784351, -13143137, +-2377801, -530965, -884226, 1386201, -2172180, -7723425, 6532109, -12242267, 11708081, -1714766, +-8159901, 2824478, -4185983, 10374494, -6025302, -3686693, 11266773, -10066866, 3556233, -4832912, +-1037772, 8571681, -6066105, -2475512, 7792682, -5331128, 2122788, 746787, -6152004, 15171435, +-13174275, -1194538, 6007049, -3443490, 9913858, -4461398, -1873680, 2568927, -25028386, -37926708, +49657876, 154407296, 13345537, 13313862, -105246560, -133411888, -27664422, -28378996, 78596288, 133451616, +68653976, 13033615, -48258788, -94241784, -66320736, -47653200, -2390149, 64908768, 95189360, 51213192, +11841225, -33551748, -59223840, -33403034, -31887448, -30128122, 18946712, 38529076, 38234336, 38246148, +9280887, -16930762, -6825777, -25614112, -39679592, -4668630, -11832098, -8294119, 35833448, 20410222, +29925184, 17847200, -13601625, -32990718, -7904888, -21576842, -3331284, 14478335, 4483409, 7630010, +16112570, -8629126, -11594264, -3093450, -6877317, 6053757, 10305774, 44023, 12725988, 7088844, +-13775571, -13667660, -21046950, -18468360, 454193, 20640540, 32067836, 14737643, 3565897, -8627516, +-22477712, -5037460, -25556130, -16676821, 10130754, 5693516, 8642548, -1285269, 0, 0, +0, 0, 0, }, { -4021700, --5322538, -7656853, -865436, -2963528, -5371931, -2615098, -1255741, 1214402, -2573222, -5400922, --438624, 1519882, -5378910, -2807298, -1046361, -3007014, -3120831, 2367064, -342524, 525597, --2747169, -2796024, -708670, -4345433, 3001109, -4391604, 1318555, -1085016, 1723893, -2087354, -514322, 1439351, -5981816, -1072668, 682363, 6537477, -2992519, -553514, -1056025, -11811, -2509335, -905164, -2785286, -406948, -920734, 1993939, -784905, -2341831, 2424509, 2251100, -1175210, 525060, -1649268, 2951716, 2145336, -3511673, 2212982, -2488397, -1145146, -416612, --1997697, -639950, 352187, 758062, 2488934, -2017024, -1631551, -352724, 409096, -1770600, --5507759, -970663, -2046552, -1000191, -767725, 1010391, 1248225, 3432216, 2682744, -891743, -2056753, 978179, 5915244, -1031329, -152471, 745714, 4330401, -853088, -4507568, -2094870, --4327180, 1060320, -1537598, -355409, -543313, 1054951, 420907, 890669, 2511482, 4626754, --2049773, -1117765, 920197, -2157147, -302795, 3622268, -1959042, 4475893, 452045, -1564442, -2945274, -3995930, -1044751, -2767570, 3929358, -69256, -1474248, -1017370, 26307, 3727495, -122943, 4482335, 1664300, -3546032, 2900714, -1494649, -2750390, -2109903, 2968896, -513249, -9561671, 1152662, 2350421, 1899986, -4562866, 237297, -754841, 1368484, -2655901, -1496259, -4882304, 4367982, 214212, 2013803, -651761, 2923262, -4378183, 875100, 2786897, 2547989, --142808, 550293, 1317481, -7219303, -6740951, -3997541, -3865471, -3122978, 1140851, 4766877, -9338333, 1950989, 2336462, 126702, -6833830, -2669322, -2593624, -5896453, 9334038, 2667712, -3658775, 2756832, -2163590, 1135482, 8943196, 3783329, -2195802, 16106, -2259153, 387084, --4242891, 2716030, -1381906, -1657857, 294205, 5013838, 446140, 1901597, 2945274, 4393215, --7502771, 344134, 1836099, 4590247, 6605123, -3437585, -804770, -1516660, 5500780, 3297998, -3527779, -290984, 1605781, 11422466, -7074348, 1735167, 593242, -4348655, 1932735, -6196564, --954020, 2055679, -1498944, -9490804, 2679523, 1093069, -2778307, -2309082, -582505, -1035087, -3186329, -2660195, -1571958, 1471563, -332323, -2528662, -432181, 3039226, -4473209, 927176, --1577864, 9697499, 1118839, 3308736, -176631, -2940442, 445603, 6720550, 3805341, 4233227, -7450695, -3479997, 287226, 6728603, 2452963, 2786360, 601832, 560493, 4310000, -4032974, --907312, 4905390, -3370476, 1719598, 3148748, -2552284, 2354716, 6666863, -3154654, 2246268, -711891, -73014, 238908, -1809792, -4635881, -1837709, -3869766, -786516, 1799054, 2981244, -3659849, -1016297, -5887327, -934692, 8845485, -3637301, 1851131, -1971390, -9133785, 4968741, -1410360, 3577708, -624381, 4124779, 4459787, -8263517, 3138011, -200253, 2924336, -1025423, --5528697, -712428, -839666, -1464047, -1136556, 3049427, -162672, 231391, 6907918, 935229, -5370320, -236760, 148713, 720481, -3696356, -5084168, 16073378, 9373229, 13708999, 4729833, --6036040, 3155727, -2855080, 574989, 1076426, -11720966, -3460670, -3115462, 2767570, 4820564, --2241436, -138513, 1242319, 500364, 8169565, -826781, -9279277, 3006477, -5528160, 4052302, -4142496, 3684008, 4875325, -1206349, -2231773, 2186138, -2003065, -2040646, 1079647, -1365263, -2710124, 4537633, -2426120, -6878927, 1729798, -6705518, -4807142, -878858, -14424111, 83215, --2886218, 5383742, 4642860, 2428267, 7938710, 8468602, 3195993, 1788317, -1246077, 278099, --168041, -4045859, 7275675, -1240709, 2055679, -2724083, -3779034, -1318018, -5331128, 3762928, --2932389, -1954210, 6918656, -6796786, -2942590, 1328756, -4012036, -1252520, -1387274, 2362232, -1888175, 1780801, 3642132, -6749004, -13741211, -5650567, -936840, 1483374, -1214939, 3779034, --387084, 6438693, -5725729, 3148211, -983548, 12306155, 5970542, -3373697, -4925254, 2412161, --7249905, -4759898, 3618510, -3331821, -4075924, 8337069, 4319664, -1084479, -3497714, -6135898, -4395899, 2331630, 3446711, -817118, -747324, -4009352, 5886253, -7413114, -2279017, -891206, -5528160, 3149822, 326418, 4791573, 1363115, -3077344, 1791001, -3064459, -1888712, -3582540, -4505958, -3330747, 657130, 4436165, 8222178, 7080254, 3916473, 2158758, 321049, 3783866, --888521, 5687074, -195958, 3445101, 3983582, -3066070, 1299228, -3293703, 4068408, 2172717, -2186138, -1397475, -3985730, 3297461, -4284230, -1015223, -4488241, 2033130, 1735167, -712965, --1879048, -6794102, -13875966, -11436424, 827318, -9795210, -4636954, -13819594, -7164543, -8483097, -3433290, -4605816, -5811091, -2185602, 438087, -3679176, -13171591, 3400540, -2239289, 1163399, --5903433, 5818070, 2330020, -46171, -5240934, -2570538, 6906308, 4441533, 410169, -1212791, --4451197, 2637110, 1585917, 2731062, -5347771, -729608, -4320737, -4210142, -4221416, 212601, -8928700, -7430831, 280784, -7100655, 832150, 2918967, 4132832, -7495792, 7403987, 8520678, --2750927, -2400887, -1372779, -667331, 2980171, 3221226, 1075889, 2066953, -4081830, -1207960, --1357747, 7187091, -2107755, 7970386, 89121, -3027415, 7047505, -1186485, -3587908, 900333, -7761543, 7767985, 16643, -3271691, -3662533, 2135673, -11063299, -10514617, -12678743, 3902515, --10315975, -3945464, 9430138, 4964982, -11177116, -488553, -142271, 5048734, 6895570, 12453258, --3554086, -4141422, -12254079, -14483703, -8958765, -2717104, 5749351, -5728950, 2631741, -8240432, -8561480, -6121939, 6821482, -3038689, 725850, 2097555, -1695975, -6034429, 9679783, -8345122, --715112, -4335770, 932008, -5092221, 937377, -21275658, 51003, 10271951, -13117904, 3180423, -8442295, 3398393, -6993818, -487479, 10209674, -12731894, -383863, 5570573, 4748087, 5249524, --2239289, -1628866, -8779450, -3921305, 3045132, 5973226, 8708583, 11365020, -16833050, 6460705, --5420786, 1411434, -12069932, -4508105, 8950175, 2484102, 667867, -6235219, -744103, 6164889, -3528853, 2566780, 1200443, 12942347, 21376590, 12017318, 13906567, 2212445, 4886599, 18901078, --668941, 649077, 12801150, -6209449, -47782, 3794604, 6342593, 10719165, -8725763, -12233677, -6720013, 3875671, -7237020, 1639604, 4321274, -2637647, 2450816, -6524592, -1576253, -7634305, -2310156, 8575976, 2553358, 7534983, 5649493, 6163815, -14736033, 918049, 16998406, -1872069, --373662, 16076599, -2163053, -381178, 2292976, -1901597, -527744, 9015673, 13774497, -13360033, --2267206, 2959233, -4217658, 6684580, -2199023, 926639, 977105, -2636573, 12156905, -1198833, --4441533, 4965519, -4588099, -7144678, 2653216, 8809515, 3197603, -335544, 1779190, 8619999, -4294431, 7916162, 2359548, 1854889, 224949, -5768141, -1016834, -3892851, 36006320, 5239323, --962610, 14496, -17552994, -4834523, 1517197, -3789235, 7522099, 3653407, 12297028, -1287417, --98247, -2370285, -5357435, 8666170, 1479079, 3534221, 4607963, 6889128, -6199249, -5804649, --7191386, -4577362, -4124779, -1379758, -9833864, -1493038, 15850577, 7925826, -3003793, -599685, --1837172, 1816234, 5657546, -2231773, 22711250, -3401077, -544924, -9722195, 4196720, 10468983, --1596654, -6955163, -862752, 4446365, 7722351, 3944928, 10816875, 16630113, 5357972, 393526, -9648107, 8500277, 3091840, 6783364, -19639812, 5459977, 760209, -16673063, 6706592, 539555, --7303055, 5963562, -7746511, -6733435, 9614284, 8491687, -3836480, -14292041, -6733435, 5106716, --8655433, -304406, 4111358, 16976932, -2643016, -18473728, 11382737, -1491964, -13090523, 253940, -10566156, -12103755, -3395172, -9597641, 6205691, 3017215, -4475893, -3614215, -2236067, 7721815, -4648229, 3797288, 6562710, 7153805, 34897, 8478265, 8143795, 4493073, 4255239, -8012799, --4926328, -5290863, 4958540, 8114267, 2029372, 3169149, -4747013, -2132988, -3093450, -1313186, --8048769, 7931194, 1126892, 1477469, -8535711, -1368484, 12443057, -8185671, -10271951, -14055817, -4931696, -10240276, 16167868, 20242180, 12857521, 8884677, 483184, 16140487, -8094403, 12983686, --1678795, -7065221, 529355, 2028835, -17959942, -6592238, 6818798, 2481954, -2839510, 4234838, -15406585, 11901891, -16747151, -2668249, 577136, 1386738, 6254010, 9408663, 1642825, -11490111, -9084393, -4578972, -15275588, 793495, 2619393, 9265318, 3007551, 24927990, 4943508, -11401528, --2575370, -9716827, 17124572, -21623012, -981400, 13648332, -30602178, -13188771, -9722195, -11763915, --19970524, 1227824, -2728378, -9701794, -193810, 9145059, 2207076, 577673, -5182952, 1721208, --1088774, 1709934, 1026497, 840740, 9089761, -2676838, 552977, 15673946, -9528922, -2850248, -3926137, 13404056, -6295349, 19444928, -4961224, -8855686, -16090558, -23169202, -5357972, -17428440, -9375914, -5787469, -11296838, 996432, 3313031, 8526047, 9140227, 2545305, -232465, 27801860, -17183090, -2531883, 4217658, 9035537, 8780524, 4008815, -2344515, -1292785, -3559991, -7381438, --4559108, 3585761, 23860690, -16231218, -2227478, -9440338, 17440788, -12125230, -13049721, 7622493, --6276558, -22441204, 10657424, -6254546, 8326331, -6036577, 10660646, 8413304, 8694088, 15871515, -1583232, 13493177, 4278325, 3864934, 7832410, 3531537, 1417339, 1102196, -1395864, -7778723, -6267968, -16282758, 6211597, 2148021, -5923297, -8627516, -1410897, 6811282, -8676371, -2791192, --12414066, -4023311, -15035607, 1140851, 6209986, 105764, -3178813, -8502425, -16614544, -10830297, -10345502, 4105989, -6506876, -8597451, -3765613, -621160, -16526497, 12588549, 9647570, -14612552, --16051367, -23314694, -5491116, -27939300, 5443871, 10660646, 3535832, -1982127, -5846524, -3205656, -8980777, 11113765, 10714870, -9233106, -9700721, 8194798, -6876780, -5080947, -19615116, 6029597, -9728101, 13612899, -7461969, 20824148, 27094802, -11523934, 872952, 5582384, -19298362, -5177583, -27329414, -398895, -26606786, 1810866, 10205916, -1929514, 11362873, 21875342, -7860327, 19675246, -12968654, 16637093, 6681359, -14818711, -12826383, 10510859, -11444477, -21853868, -4228932, -25733834, -7251516, -2743947, 10617696, 6449967, 7293392, 1731946, 969589, -336081, 14526653, 5098126, --22083112, -3819837, 10204305, 14546517, 10825465, 18270254, 19583978, 12641162, -4118874, -3249680, -5971615, 34094524, -12205760, 1661079, 9962177, 12838731, -3025805, -20349018, -1347009, -5789079, --8868034, -22407382, -20527260, 5567888, -10059350, -10852309, 9376450, 17587892, 26296474, -534187, -2437394, -1311576, 21541408, -13033078, -1658931, 19388556, -17620640, 808528, -11848204, -14276471, -8198556, 5497022, 11125576, -13237089, -32697050, -6543920, -12020540, -9512279, -7508140, 2428267, --11825119, -8253854, 2094333, 8033200, -7775502, 17772574, -2768107, 12226161, -6633577, 295279, -8754217, -12890271, -9623411, -3746822, 13522705, -2516851, -16840030, -5027259, 1449015, -6729677, -5645198, -9674951, -11671037, 16553878, 3563212, -11355894, 6527814, -501974, -10696616, 43487, --17103096, -12877923, 1765768, 25169046, 8753143, 8526047, -20384452, 15919833, -2735357, 12430172, --7789997, -12497281, 5504538, -23891292, 19707994, -32700270, -22458920, 8792872, 17410186, 2422362, -21030308, -8735427, 4594542, -14436996, 19539954, 7669201, 14118094, 8099772, 2153926, -3925600, --6823630, -9194451, -5394479, 438087, -20118164, -9387188, -1168231, -23768350, -2788508, 5523328, --24133422, -22043382, 1902671, 9360881, -11575474, -50193136, -10873783, -124554, 6206228, -16927002, -1069984, -9419937, -2410014, -13520557, -15608985, 13480292, -15219753, -18087718, -3571265, -12692165, --14458471, 4723391, -20787642, -6790880, 11595875, 27802934, 21930104, -1241246, -14427869, 4631049, -19612968, -1170379, 12778601, -4144644, 16252156, 9260486, -18272402, 27469538, -22031572, -11580842, -17853106, -21057688, 5318244, -5212480, -16475495, 1311039, 22542672, -5451924, -14868103, 8189966, -10465762, -1011465, 3647501, -34586836, 6986838, 608275, 15832860, 7388418, -16151761, 13786308, --9284109, -2331630, -15209553, 6168110, 18294950, -5335960, -5563057, -21693342, -30513596, 14872398, --4006668, 11606075, -17888538, 10473815, 6993818, -20547660, 17673790, 20352240, -52646636, 20673826, -24728274, -5301601, 16811038, 1144609, 8092256, -2834679, -11847130, -5479842, 9634685, 3924526, --16115791, -8279087, -2653753, -5592048, -5078262, -221191, 30481920, 7767985, 5754183, -18256832, -12397423, -12588012, -1072131, 3876208, -22751516, 11455215, -9241159, 2560338, -9976135, -14068165, --862752, 11775190, 28142774, 12072079, 1766842, 19710142, 6410239, -672699, 1689533, 2005213, -3829500, 4552129, 18646600, 10332618, 4708358, 4918275, -3897683, -4549444, -21004538, -14810121, -926102, -628139, -13510357, 3498788, 13336947, -20659330, 20294258, 7487739, -9465571, 1057099, --7320772, 242129, 11605539, 7901666, 2665027, -13007308, -4826470, -18454400, -8310225, 8438537, -5504538, 10401337, -11784853, -45381700, 70447664, -69694432, -31921808, -15772194, -5095442, 41091024, -11675869, 45956152, 11065983, -9227737, 35689568, 15725486, -12634720, 17003238, 14867029, 8624294, -13856101, 13929116, -12876849, -19985020, -14758581, 2291365, -13640816, 6866042, 3529390, 8886824, --2002529, 6089727, 1454920, 22354232, 4664335, 1950989, 6220724, -5442261, -1051193, 7702487, --14879914, -20335060, -14448807, -11983496, 1148904, 5599564, -15035070, -2698850, -9445707, -35225712, -16537772, -6781754, 7834557, -18846316, -7301982, -17558364, -24372866, 8095477, 4944044, 21846352, --2262911, 19073412, -9803800, 15742666, 495532, 22755810, -18448496, 13545253, 15971373, 8443369, -8367670, -679142, -9354439, 26068304, 16213502, -4008278, 30702036, 5394479, 150324, 10875931, -13377749, 43274480, 3704409, -25851408, -38186556, -20047296, -15858093, 5414880, 31782222, -170188, --13169980, 28717226, 2595234, -22377854, 20891794, 22878754, -3712462, 214748, -1734630, -19531900, -22982370, 2056753, 13314399, -6267968, -17415018, -30525406, 6380174, 5016522, 5565204, -3310883, -10643466, -9241696, 672699, -18850612, -24293408, 10257456, -2285460, 9539122, -2687576, -7676181, --21772800, -33563020, 19158776, -17848274, 9186935, 19027778, -63351, -6919729, -16182900, -10171019, -41890428, 11741904, -615791, 7961796, -4105452, -13581223, -4103841, 26669600, -21502216, -35074312, --12093017, -8622147, -52475912, -38177428, -21349746, -19209242, 6994354, 4269735, -17601312, -30960272, --13256417, -11581916, -11531987, -3931506, -7104950, -15049029, -21485574, 23079544, -20298016, 30895310, --4732517, 29511258, 40647032, -6437619, -46569792, -42653856, -10645613, 22382686, 1722819, -33162516, -25939992, -4556961, -23716272, 29146184, -53305912, -9598715, -807454, -7858180, -9053254, 64742872, --27562416, 60770568, -3917010, 13916768, -5332739, -22005802, 37120864, 11541114, 38682624, -25626460, --27492086, 10100152, -43799540, -11425150, -7603166, -28458454, 61672508, -3935801, -65174520, 512712, --29282550, 9920838, 15525770, 27417460, 20747914, -24012626, -16167331, -38197292, -11713450, -16867948, -17071422, 12787191, -1961726, 13259101, -7591355, -26606786, -10995653, -31287226, 34478924, -23793046, --16559783, 31950798, 8473970, 52927956, 26489748, 6354941, 29154238, -34139084, -10762114, -35035660, --32727114, -2782602, -402653, -41871636, 54322748, -2647311, -84989888, 44071196, 9744207, -17892834, --14095009, 27417998, 14566382, -15905875, -4742718, -39370892, -16942572, 17445620, -34700116, 1862942, -5936182, -9948755, -23205708, -15065672, 30709554, 13074417, -6428493, -43776992, 14850386, 28713466, -15952582, -33655900, -23132694, 967978, 37287296, 4213900, -9250823, 6832756, 1028108, 20134270, --50117436, -42155104, 53289268, 9406515, 22187802, -49677204, 10894721, -1032403, 37091336, -32088238, --6590091, -49555868, 17625472, 38278896, 8393440, -21013664, 14366129, 55094228, -24168854, -23545010, --20255602, 9629854, 1891396, 49004504, -14352170, 6009196, -25664578, 10932839, -28173374, 2026151, -17157858, -31283468, 32324998, 13733695, -24879134, -33117956, -23793046, 3170760, 31901406, -54020488, --15207405, 63221920, 56377352, 28223304, 13442174, 12547210, 14028974, -9262097, -8183524, -19209242, -3024194, 5760625, 5610301, -1405528, -31464394, 15134928, 7036230, -22591528, -18224620, -9895068, --10321880, 8152922, -7493108, -9625022, 3578782, -890669, -16233903, 21822192, -14842333, -5110474, --15434502, -14794552, 11565810, -6252936, -1209570, 5611912, 7910793, -1631551, -20753818, 5390184, -34904664, 7504382, -52148420, -3037079, -10497974, -16136729, 12265353, 12458626, 28609314, 13793287, --33582888, 38242388, -8199093, -25358024, 79478904, -14968498, -5550709, -24906516, -61112016, 29586956, -32817846, 11647414, 13140989, -51866024, 16690780, -2586644, -11678016, -7567196, 3374234, -2969433, -9596031, 12581570, 3491809, -5006858, -13918378, 19609746, 21568252, 32215476, -30353608, -77912856, --127658240, 8096550, 131210712, 9712532, 277941824, 277607904, 101380552, 278103424, 162358896, -51828444, --6031745, -30348776, -215721712, -182449680, -126938296, -227640240, -214977072, -66859220, -137009456, -123141008, -22080964, 29525216, -33563020, 33033668, 55111408, -8930311, -1786706, 111039936, 73708080, 20485920, -81730008, 155786512, 70354784, 80175768, 197344624, 69063072, 27357868, 164954128, 161349568, -6845641, -98422936, 179189792, -12230993, 32870458, 101640400, -22295712, -109273096, 27588722, -36014376, -202095392, --187093072, -177784800, -321783232, -470911488, -332511552, -460994400, -602850752, -437514912, -357588224, -479588928, --315460512, -173039408, -165894192, -64977488, 95526512, 223822016, 260847328, 355200768, 503006176, 482404288, -452136032, 502134304, 496818208, 363852448, 247115776, 142944560, -27574764, -27306328, 0, 0, -0, 0, 0, }, +-5322538, -7656853, -865436, -2963528, -5371931, -2615098, -1255741, 1214402, -2573222, -5400922, +-438624, 1519882, -5378910, -2807298, -1046361, -3007014, -3120831, 2367064, -342524, 525597, +-2747169, -2796024, -708670, -4345433, 3001109, -4391604, 1318555, -1085016, 1723893, -2087354, +514322, 1439351, -5981816, -1072668, 682363, 6537477, -2992519, -553514, -1056025, -11811, +2509335, -905164, -2785286, -406948, -920734, 1993939, -784905, -2341831, 2424509, 2251100, +1175210, 525060, -1649268, 2951716, 2145336, -3511673, 2212982, -2488397, -1145146, -416612, +-1997697, -639950, 352187, 758062, 2488934, -2017024, -1631551, -352724, 409096, -1770600, +-5507759, -970663, -2046552, -1000191, -767725, 1010391, 1248225, 3432216, 2682744, -891743, +2056753, 978179, 5915244, -1031329, -152471, 745714, 4330401, -853088, -4507568, -2094870, +-4327180, 1060320, -1537598, -355409, -543313, 1054951, 420907, 890669, 2511482, 4626754, +-2049773, -1117765, 920197, -2157147, -302795, 3622268, -1959042, 4475893, 452045, -1564442, +2945274, -3995930, -1044751, -2767570, 3929358, -69256, -1474248, -1017370, 26307, 3727495, +122943, 4482335, 1664300, -3546032, 2900714, -1494649, -2750390, -2109903, 2968896, -513249, +9561671, 1152662, 2350421, 1899986, -4562866, 237297, -754841, 1368484, -2655901, -1496259, +4882304, 4367982, 214212, 2013803, -651761, 2923262, -4378183, 875100, 2786897, 2547989, +-142808, 550293, 1317481, -7219303, -6740951, -3997541, -3865471, -3122978, 1140851, 4766877, +9338333, 1950989, 2336462, 126702, -6833830, -2669322, -2593624, -5896453, 9334038, 2667712, +3658775, 2756832, -2163590, 1135482, 8943196, 3783329, -2195802, 16106, -2259153, 387084, +-4242891, 2716030, -1381906, -1657857, 294205, 5013838, 446140, 1901597, 2945274, 4393215, +-7502771, 344134, 1836099, 4590247, 6605123, -3437585, -804770, -1516660, 5500780, 3297998, +3527779, -290984, 1605781, 11422466, -7074348, 1735167, 593242, -4348655, 1932735, -6196564, +-954020, 2055679, -1498944, -9490804, 2679523, 1093069, -2778307, -2309082, -582505, -1035087, +3186329, -2660195, -1571958, 1471563, -332323, -2528662, -432181, 3039226, -4473209, 927176, +-1577864, 9697499, 1118839, 3308736, -176631, -2940442, 445603, 6720550, 3805341, 4233227, +7450695, -3479997, 287226, 6728603, 2452963, 2786360, 601832, 560493, 4310000, -4032974, +-907312, 4905390, -3370476, 1719598, 3148748, -2552284, 2354716, 6666863, -3154654, 2246268, +711891, -73014, 238908, -1809792, -4635881, -1837709, -3869766, -786516, 1799054, 2981244, +3659849, -1016297, -5887327, -934692, 8845485, -3637301, 1851131, -1971390, -9133785, 4968741, +1410360, 3577708, -624381, 4124779, 4459787, -8263517, 3138011, -200253, 2924336, -1025423, +-5528697, -712428, -839666, -1464047, -1136556, 3049427, -162672, 231391, 6907918, 935229, +5370320, -236760, 148713, 720481, -3696356, -5084168, 16073378, 9373229, 13708999, 4729833, +-6036040, 3155727, -2855080, 574989, 1076426, -11720966, -3460670, -3115462, 2767570, 4820564, +-2241436, -138513, 1242319, 500364, 8169565, -826781, -9279277, 3006477, -5528160, 4052302, +4142496, 3684008, 4875325, -1206349, -2231773, 2186138, -2003065, -2040646, 1079647, -1365263, +2710124, 4537633, -2426120, -6878927, 1729798, -6705518, -4807142, -878858, -14424111, 83215, +-2886218, 5383742, 4642860, 2428267, 7938710, 8468602, 3195993, 1788317, -1246077, 278099, +-168041, -4045859, 7275675, -1240709, 2055679, -2724083, -3779034, -1318018, -5331128, 3762928, +-2932389, -1954210, 6918656, -6796786, -2942590, 1328756, -4012036, -1252520, -1387274, 2362232, +1888175, 1780801, 3642132, -6749004, -13741211, -5650567, -936840, 1483374, -1214939, 3779034, +-387084, 6438693, -5725729, 3148211, -983548, 12306155, 5970542, -3373697, -4925254, 2412161, +-7249905, -4759898, 3618510, -3331821, -4075924, 8337069, 4319664, -1084479, -3497714, -6135898, +4395899, 2331630, 3446711, -817118, -747324, -4009352, 5886253, -7413114, -2279017, -891206, +5528160, 3149822, 326418, 4791573, 1363115, -3077344, 1791001, -3064459, -1888712, -3582540, +4505958, -3330747, 657130, 4436165, 8222178, 7080254, 3916473, 2158758, 321049, 3783866, +-888521, 5687074, -195958, 3445101, 3983582, -3066070, 1299228, -3293703, 4068408, 2172717, +2186138, -1397475, -3985730, 3297461, -4284230, -1015223, -4488241, 2033130, 1735167, -712965, +-1879048, -6794102, -13875966, -11436424, 827318, -9795210, -4636954, -13819594, -7164543, -8483097, +3433290, -4605816, -5811091, -2185602, 438087, -3679176, -13171591, 3400540, -2239289, 1163399, +-5903433, 5818070, 2330020, -46171, -5240934, -2570538, 6906308, 4441533, 410169, -1212791, +-4451197, 2637110, 1585917, 2731062, -5347771, -729608, -4320737, -4210142, -4221416, 212601, +8928700, -7430831, 280784, -7100655, 832150, 2918967, 4132832, -7495792, 7403987, 8520678, +-2750927, -2400887, -1372779, -667331, 2980171, 3221226, 1075889, 2066953, -4081830, -1207960, +-1357747, 7187091, -2107755, 7970386, 89121, -3027415, 7047505, -1186485, -3587908, 900333, +7761543, 7767985, 16643, -3271691, -3662533, 2135673, -11063299, -10514617, -12678743, 3902515, +-10315975, -3945464, 9430138, 4964982, -11177116, -488553, -142271, 5048734, 6895570, 12453258, +-3554086, -4141422, -12254079, -14483703, -8958765, -2717104, 5749351, -5728950, 2631741, -8240432, +8561480, -6121939, 6821482, -3038689, 725850, 2097555, -1695975, -6034429, 9679783, -8345122, +-715112, -4335770, 932008, -5092221, 937377, -21275658, 51003, 10271951, -13117904, 3180423, +8442295, 3398393, -6993818, -487479, 10209674, -12731894, -383863, 5570573, 4748087, 5249524, +-2239289, -1628866, -8779450, -3921305, 3045132, 5973226, 8708583, 11365020, -16833050, 6460705, +-5420786, 1411434, -12069932, -4508105, 8950175, 2484102, 667867, -6235219, -744103, 6164889, +3528853, 2566780, 1200443, 12942347, 21376590, 12017318, 13906567, 2212445, 4886599, 18901078, +-668941, 649077, 12801150, -6209449, -47782, 3794604, 6342593, 10719165, -8725763, -12233677, +6720013, 3875671, -7237020, 1639604, 4321274, -2637647, 2450816, -6524592, -1576253, -7634305, +2310156, 8575976, 2553358, 7534983, 5649493, 6163815, -14736033, 918049, 16998406, -1872069, +-373662, 16076599, -2163053, -381178, 2292976, -1901597, -527744, 9015673, 13774497, -13360033, +-2267206, 2959233, -4217658, 6684580, -2199023, 926639, 977105, -2636573, 12156905, -1198833, +-4441533, 4965519, -4588099, -7144678, 2653216, 8809515, 3197603, -335544, 1779190, 8619999, +4294431, 7916162, 2359548, 1854889, 224949, -5768141, -1016834, -3892851, 36006320, 5239323, +-962610, 14496, -17552994, -4834523, 1517197, -3789235, 7522099, 3653407, 12297028, -1287417, +-98247, -2370285, -5357435, 8666170, 1479079, 3534221, 4607963, 6889128, -6199249, -5804649, +-7191386, -4577362, -4124779, -1379758, -9833864, -1493038, 15850577, 7925826, -3003793, -599685, +-1837172, 1816234, 5657546, -2231773, 22711250, -3401077, -544924, -9722195, 4196720, 10468983, +-1596654, -6955163, -862752, 4446365, 7722351, 3944928, 10816875, 16630113, 5357972, 393526, +9648107, 8500277, 3091840, 6783364, -19639812, 5459977, 760209, -16673063, 6706592, 539555, +-7303055, 5963562, -7746511, -6733435, 9614284, 8491687, -3836480, -14292041, -6733435, 5106716, +-8655433, -304406, 4111358, 16976932, -2643016, -18473728, 11382737, -1491964, -13090523, 253940, +10566156, -12103755, -3395172, -9597641, 6205691, 3017215, -4475893, -3614215, -2236067, 7721815, +4648229, 3797288, 6562710, 7153805, 34897, 8478265, 8143795, 4493073, 4255239, -8012799, +-4926328, -5290863, 4958540, 8114267, 2029372, 3169149, -4747013, -2132988, -3093450, -1313186, +-8048769, 7931194, 1126892, 1477469, -8535711, -1368484, 12443057, -8185671, -10271951, -14055817, +4931696, -10240276, 16167868, 20242180, 12857521, 8884677, 483184, 16140487, -8094403, 12983686, +-1678795, -7065221, 529355, 2028835, -17959942, -6592238, 6818798, 2481954, -2839510, 4234838, +15406585, 11901891, -16747151, -2668249, 577136, 1386738, 6254010, 9408663, 1642825, -11490111, +9084393, -4578972, -15275588, 793495, 2619393, 9265318, 3007551, 24927990, 4943508, -11401528, +-2575370, -9716827, 17124572, -21623012, -981400, 13648332, -30602178, -13188771, -9722195, -11763915, +-19970524, 1227824, -2728378, -9701794, -193810, 9145059, 2207076, 577673, -5182952, 1721208, +-1088774, 1709934, 1026497, 840740, 9089761, -2676838, 552977, 15673946, -9528922, -2850248, +3926137, 13404056, -6295349, 19444928, -4961224, -8855686, -16090558, -23169202, -5357972, -17428440, +9375914, -5787469, -11296838, 996432, 3313031, 8526047, 9140227, 2545305, -232465, 27801860, +17183090, -2531883, 4217658, 9035537, 8780524, 4008815, -2344515, -1292785, -3559991, -7381438, +-4559108, 3585761, 23860690, -16231218, -2227478, -9440338, 17440788, -12125230, -13049721, 7622493, +-6276558, -22441204, 10657424, -6254546, 8326331, -6036577, 10660646, 8413304, 8694088, 15871515, +1583232, 13493177, 4278325, 3864934, 7832410, 3531537, 1417339, 1102196, -1395864, -7778723, +6267968, -16282758, 6211597, 2148021, -5923297, -8627516, -1410897, 6811282, -8676371, -2791192, +-12414066, -4023311, -15035607, 1140851, 6209986, 105764, -3178813, -8502425, -16614544, -10830297, +10345502, 4105989, -6506876, -8597451, -3765613, -621160, -16526497, 12588549, 9647570, -14612552, +-16051367, -23314694, -5491116, -27939300, 5443871, 10660646, 3535832, -1982127, -5846524, -3205656, +8980777, 11113765, 10714870, -9233106, -9700721, 8194798, -6876780, -5080947, -19615116, 6029597, +9728101, 13612899, -7461969, 20824148, 27094802, -11523934, 872952, 5582384, -19298362, -5177583, +27329414, -398895, -26606786, 1810866, 10205916, -1929514, 11362873, 21875342, -7860327, 19675246, +12968654, 16637093, 6681359, -14818711, -12826383, 10510859, -11444477, -21853868, -4228932, -25733834, +7251516, -2743947, 10617696, 6449967, 7293392, 1731946, 969589, -336081, 14526653, 5098126, +-22083112, -3819837, 10204305, 14546517, 10825465, 18270254, 19583978, 12641162, -4118874, -3249680, +5971615, 34094524, -12205760, 1661079, 9962177, 12838731, -3025805, -20349018, -1347009, -5789079, +-8868034, -22407382, -20527260, 5567888, -10059350, -10852309, 9376450, 17587892, 26296474, -534187, +2437394, -1311576, 21541408, -13033078, -1658931, 19388556, -17620640, 808528, -11848204, -14276471, +8198556, 5497022, 11125576, -13237089, -32697050, -6543920, -12020540, -9512279, -7508140, 2428267, +-11825119, -8253854, 2094333, 8033200, -7775502, 17772574, -2768107, 12226161, -6633577, 295279, +8754217, -12890271, -9623411, -3746822, 13522705, -2516851, -16840030, -5027259, 1449015, -6729677, +5645198, -9674951, -11671037, 16553878, 3563212, -11355894, 6527814, -501974, -10696616, 43487, +-17103096, -12877923, 1765768, 25169046, 8753143, 8526047, -20384452, 15919833, -2735357, 12430172, +-7789997, -12497281, 5504538, -23891292, 19707994, -32700270, -22458920, 8792872, 17410186, 2422362, +21030308, -8735427, 4594542, -14436996, 19539954, 7669201, 14118094, 8099772, 2153926, -3925600, +-6823630, -9194451, -5394479, 438087, -20118164, -9387188, -1168231, -23768350, -2788508, 5523328, +-24133422, -22043382, 1902671, 9360881, -11575474, -50193136, -10873783, -124554, 6206228, -16927002, +1069984, -9419937, -2410014, -13520557, -15608985, 13480292, -15219753, -18087718, -3571265, -12692165, +-14458471, 4723391, -20787642, -6790880, 11595875, 27802934, 21930104, -1241246, -14427869, 4631049, +19612968, -1170379, 12778601, -4144644, 16252156, 9260486, -18272402, 27469538, -22031572, -11580842, +17853106, -21057688, 5318244, -5212480, -16475495, 1311039, 22542672, -5451924, -14868103, 8189966, +10465762, -1011465, 3647501, -34586836, 6986838, 608275, 15832860, 7388418, -16151761, 13786308, +-9284109, -2331630, -15209553, 6168110, 18294950, -5335960, -5563057, -21693342, -30513596, 14872398, +-4006668, 11606075, -17888538, 10473815, 6993818, -20547660, 17673790, 20352240, -52646636, 20673826, +24728274, -5301601, 16811038, 1144609, 8092256, -2834679, -11847130, -5479842, 9634685, 3924526, +-16115791, -8279087, -2653753, -5592048, -5078262, -221191, 30481920, 7767985, 5754183, -18256832, +12397423, -12588012, -1072131, 3876208, -22751516, 11455215, -9241159, 2560338, -9976135, -14068165, +-862752, 11775190, 28142774, 12072079, 1766842, 19710142, 6410239, -672699, 1689533, 2005213, +3829500, 4552129, 18646600, 10332618, 4708358, 4918275, -3897683, -4549444, -21004538, -14810121, +926102, -628139, -13510357, 3498788, 13336947, -20659330, 20294258, 7487739, -9465571, 1057099, +-7320772, 242129, 11605539, 7901666, 2665027, -13007308, -4826470, -18454400, -8310225, 8438537, +5504538, 10401337, -11784853, -45381700, 70447664, -69694432, -31921808, -15772194, -5095442, 41091024, +11675869, 45956152, 11065983, -9227737, 35689568, 15725486, -12634720, 17003238, 14867029, 8624294, +13856101, 13929116, -12876849, -19985020, -14758581, 2291365, -13640816, 6866042, 3529390, 8886824, +-2002529, 6089727, 1454920, 22354232, 4664335, 1950989, 6220724, -5442261, -1051193, 7702487, +-14879914, -20335060, -14448807, -11983496, 1148904, 5599564, -15035070, -2698850, -9445707, -35225712, +16537772, -6781754, 7834557, -18846316, -7301982, -17558364, -24372866, 8095477, 4944044, 21846352, +-2262911, 19073412, -9803800, 15742666, 495532, 22755810, -18448496, 13545253, 15971373, 8443369, +8367670, -679142, -9354439, 26068304, 16213502, -4008278, 30702036, 5394479, 150324, 10875931, +13377749, 43274480, 3704409, -25851408, -38186556, -20047296, -15858093, 5414880, 31782222, -170188, +-13169980, 28717226, 2595234, -22377854, 20891794, 22878754, -3712462, 214748, -1734630, -19531900, +22982370, 2056753, 13314399, -6267968, -17415018, -30525406, 6380174, 5016522, 5565204, -3310883, +10643466, -9241696, 672699, -18850612, -24293408, 10257456, -2285460, 9539122, -2687576, -7676181, +-21772800, -33563020, 19158776, -17848274, 9186935, 19027778, -63351, -6919729, -16182900, -10171019, +41890428, 11741904, -615791, 7961796, -4105452, -13581223, -4103841, 26669600, -21502216, -35074312, +-12093017, -8622147, -52475912, -38177428, -21349746, -19209242, 6994354, 4269735, -17601312, -30960272, +-13256417, -11581916, -11531987, -3931506, -7104950, -15049029, -21485574, 23079544, -20298016, 30895310, +-4732517, 29511258, 40647032, -6437619, -46569792, -42653856, -10645613, 22382686, 1722819, -33162516, +25939992, -4556961, -23716272, 29146184, -53305912, -9598715, -807454, -7858180, -9053254, 64742872, +-27562416, 60770568, -3917010, 13916768, -5332739, -22005802, 37120864, 11541114, 38682624, -25626460, +-27492086, 10100152, -43799540, -11425150, -7603166, -28458454, 61672508, -3935801, -65174520, 512712, +-29282550, 9920838, 15525770, 27417460, 20747914, -24012626, -16167331, -38197292, -11713450, -16867948, +17071422, 12787191, -1961726, 13259101, -7591355, -26606786, -10995653, -31287226, 34478924, -23793046, +-16559783, 31950798, 8473970, 52927956, 26489748, 6354941, 29154238, -34139084, -10762114, -35035660, +-32727114, -2782602, -402653, -41871636, 54322748, -2647311, -84989888, 44071196, 9744207, -17892834, +-14095009, 27417998, 14566382, -15905875, -4742718, -39370892, -16942572, 17445620, -34700116, 1862942, +5936182, -9948755, -23205708, -15065672, 30709554, 13074417, -6428493, -43776992, 14850386, 28713466, +15952582, -33655900, -23132694, 967978, 37287296, 4213900, -9250823, 6832756, 1028108, 20134270, +-50117436, -42155104, 53289268, 9406515, 22187802, -49677204, 10894721, -1032403, 37091336, -32088238, +-6590091, -49555868, 17625472, 38278896, 8393440, -21013664, 14366129, 55094228, -24168854, -23545010, +-20255602, 9629854, 1891396, 49004504, -14352170, 6009196, -25664578, 10932839, -28173374, 2026151, +17157858, -31283468, 32324998, 13733695, -24879134, -33117956, -23793046, 3170760, 31901406, -54020488, +-15207405, 63221920, 56377352, 28223304, 13442174, 12547210, 14028974, -9262097, -8183524, -19209242, +3024194, 5760625, 5610301, -1405528, -31464394, 15134928, 7036230, -22591528, -18224620, -9895068, +-10321880, 8152922, -7493108, -9625022, 3578782, -890669, -16233903, 21822192, -14842333, -5110474, +-15434502, -14794552, 11565810, -6252936, -1209570, 5611912, 7910793, -1631551, -20753818, 5390184, +34904664, 7504382, -52148420, -3037079, -10497974, -16136729, 12265353, 12458626, 28609314, 13793287, +-33582888, 38242388, -8199093, -25358024, 79478904, -14968498, -5550709, -24906516, -61112016, 29586956, +32817846, 11647414, 13140989, -51866024, 16690780, -2586644, -11678016, -7567196, 3374234, -2969433, +9596031, 12581570, 3491809, -5006858, -13918378, 19609746, 21568252, 32215476, -30353608, -77912856, +-127658240, 8096550, 131210712, 9712532, 277941824, 277607904, 101380552, 278103424, 162358896, -51828444, +-6031745, -30348776, -215721712, -182449680, -126938296, -227640240, -214977072, -66859220, -137009456, -123141008, +22080964, 29525216, -33563020, 33033668, 55111408, -8930311, -1786706, 111039936, 73708080, 20485920, +81730008, 155786512, 70354784, 80175768, 197344624, 69063072, 27357868, 164954128, 161349568, -6845641, +98422936, 179189792, -12230993, 32870458, 101640400, -22295712, -109273096, 27588722, -36014376, -202095392, +-187093072, -177784800, -321783232, -470911488, -332511552, -460994400, -602850752, -437514912, -357588224, -479588928, +-315460512, -173039408, -165894192, -64977488, 95526512, 223822016, 260847328, 355200768, 503006176, 482404288, +452136032, 502134304, 496818208, 363852448, 247115776, 142944560, -27574764, -27306328, 0, 0, +0, 0, 0, }, }, { { -2313914, -1927904, -5349382, 1587527, 2429341, 27917, -2440078, 324807, -826781, -2805688, 7335268, -2345589, 2139431, 4487167, -2088428, -465467, 420370, -3085397, 5737003, -2183454, 597000, --3279745, -700617, 3382824, 29528, 252329, -1219771, 466541, -4053912, 4246649, -3253975, -951335, 2710124, -577136, -2592013, 4911832, -60130, -4220879, -510564, -4885526, 2048699, --5196911, -2491081, 529355, 1159641, 803159, 1119913, 2338610, 3609383, -427886, 2384781, -2505040, 1815697, -67646, -2026151, 2518998, 688269, 1548336, -2685428, 4915590, 3955128, --386010, -2535105, -408022, -200790, -955093, -2917357, -5924371, -979789, 3772055, 3449933, -1532767, 7355669, -1255741, 218506, -2921652, 10228465, -406411, -570694, 3279208, -1360968, -3738232, -2011655, -4784057, 1644436, 4806069, 665720, -754304, 6337761, 203474, 210453, --2198487, -1272921, 9928354, 1322313, -6787659, -5063230, 6982543, -711354, 7235946, 434865, --1433982, -766115, 5441187, 1002875, 11478837, 4993437, 3106335, -716186, 2485176, 5122822, --1371168, -3995930, -4984310, -1045825, 4303557, 3677029, 5767604, 1533840, -3411278, -3543885, --1557463, 2327336, -932008, 1217086, -825707, -5374078, -4207994, 1455994, 3639448, 2199023, --2090039, -2319819, -358630, 5538897, 2673080, -803696, -1528472, 2457795, 1510755, 934155, --3214246, 1245541, 2398202, -591095, 3794604, 4661114, -9068287, 2843268, 1196148, 5211943, -2711198, 4661650, 9530532, -7705172, 1611150, -1548873, -49929, -9943923, 860067, 6283001, --9163313, -1674500, 5870684, 16172699, 2144263, 92342, 994822, -9801652, -459562, 7584912, -6415071, 392453, -335544, 824634, 3313567, 5975374, 5946919, 6780680, -3040837, 1647120, --505732, 2762738, 607201, 1869385, -10248329, -2538326, 1495186, 1079647, -5697274, 76236, -3757560, -4204773, 3461207, 3525095, 5952825, 3091303, -2347737, 3284576, 6678674, -3469260, --6096169, 2337536, 1389422, 1497333, 3178813, -2365453, -4897874, -6975027, 5928129, -734976, --1343788, -2007897, 2648384, 302258, 3905736, 7991324, 1629403, 967978, -288837, -1329829, --5767068, 9746891, 2413235, -434865, 4883915, 102542, -4664872, -4219806, -5072357, -7426536, -4184909, -195421, -3423089, -1498944, -1714766, 1482838, -2837900, -5144297, 1212791, -3388192, -8660802, 11308112, 9097814, -6376953, -184147, -540092, 2470143, -3602404, 7138773, 4310537, --967441, 3293703, 5418101, 290984, 1340030, 1728188, 5256503, -652835, 1971390, 6095096, -659814, -233539, -2712809, 4332012, -6782290, 2572686, -944356, -1574106, 4529580, -4558571, --557272, -35433, -5917928, 2258079, -1210107, 2532957, -217970, -2763275, 1758252, 1661079, --357556, 5021354, -432718, 5818070, -162135, -4270808, -1879048, -25770, -2855617, 5127654, -2683818, 4347581, 5090073, -2602750, -5414880, -3728569, -284005, -1324997, -1494649, 3877282, -4817343, -1307818, -15266461, -3415036, -4859756, -8027294, 2633352, 2287070, -1128503, 3946538, --682363, 3352759, 4373888, -1848983, -5445482, -6520834, -2702608, -6064494, 323733, 826244, --2867965, 3661997, -3204583, 2027761, -1556926, -3402688, -9581535, -3525095, 664109, 1615982, -2295660, -3362960, 2318209, 3918084, 1068910, 8719320, 1949915, -85362, 6457484, -4563403, -3645890, 766652, -2433099, -3046743, 4085588, 711891, 1149441, -9998147, -2079301, -3212099, -9966472, 4502200, 3445638, 4271882, 4446365, 3841312, 4948339, -2597382, -1355062, 3326989, -4839355, -530428, 5683853, -3039763, 1025960, -1118839, 4748087, 7728257, -12091944, 3291556, --3243237, 605590, -5912023, -2587181, 548145, -1340030, -2795487, -4186519, -2434173, 5993090, -3534758, 2236604, -1202591, 587874, 565325, 7729331, -6124087, 7759396, -1082332, 4286914, -7773354, -4778151, 6012418, -3662533, 3061775, 1327682, 9161165, 4220879, -5175973, -8288750, -1880659, -6168110, 5167920, -1128503, 6750078, -4878546, -855772, -3862786, 2309619, 1703491, -1913408, -301721, -747324, -7154879, -3256122, 6286222, -4851166, -744103, 3920232, 435402, --3799436, 1494649, 322659, -573915, -3295314, 6913287, 2095407, -9130564, -4275103, -7296613, --1352378, -6397354, -11633456, -2289755, 5043366, 14682883, 3099893, 1580548, 6706592, 245350, --5320928, -4162360, 3709778, 1950452, 2470680, 4647692, -10215043, -1928440, -9436043, -1434519, -2434710, -3015067, -8865886, 1632088, 3300682, -979253, 16563541, 3809636, 12031814, -5682779, --645856, -4063039, -780610, 12572443, -10650982, 3549254, 1376537, 16507707, 8982924, 10941429, -2174864, -2782602, 5362804, -3656091, -13561896, 2585034, 966905, 1592896, 11020349, 1020592, --6165426, -559956, 488553, 3446175, 3957812, -302795, -1203128, 4453881, -4956393, -1381369, --2396055, -1271310, 1567126, 267899, 9774272, 1455994, 7729331, 8730595, 2632815, 7725573, --318901, 2644626, 4878009, -4859219, -7215008, 1091459, 7769059, -11839077, 3825742, -9027484, --8362838, -5075041, -2142115, -7882339, -7613904, -8067023, -4031364, -1799054, 5802501, 430034, -6892349, 1333587, -5324686, 8784819, -8613020, -2939368, -3513820, -3170223, -4585415, -5623186, -8742943, 7454453, -3863860, -8243116, -9578314, -4633196, -6139656, -2310156, -2924336, -10045392, --9237401, -6641630, -1795296, -39192, -2039573, 7964480, 32212, 4380867, 4945655, 7190312, -305480, 13515188, 15484431, 200790, 3934190, 4191888, -2756295, 7620883, 3049427, -14083735, --1306207, -4548371, 6979, 11777337, 3633006, -11185705, -3979287, 5667210, 4250407, 1179505, -14013941, -5733245, 5072357, 6544457, 5674726, 4332549, 6741488, -12719546, 3773666, -4712116, -6731288, 701153, 2245194, -9471477, 6083821, 5639829, -2487860, 5462662, -2122251, 1786706, --1430224, -4793184, -68183, -2949032, 1729261, -3732864, 3456912, 1903207, 10933913, 9760850, --4866198, 3658239, -12529493, 9343164, -5235565, 5801964, 6994891, 9839233, -3170223, 9879499, -806917, 8540542, -7601019, -2024540, 6860674, -3659849, 11730629, -3752191, -8215736, 15517180, -21168284, 4675609, -8280160, 5815386, -4333085, 8658117, 5117991, -1908039, -8762270, -5800354, --14945949, 3919158, 6507413, -13281113, -1471026, 7690139, 2130841, -665183, 447750, -1649268, --7035694, 1719061, 9068823, 334471, 2103997, 3190087, 12812961, -8349954, -10201, 9123584, --8140574, 12263205, 911070, 17248052, -14098767, -13037373, 7468948, 571231, -1363652, 3640522, --789200, 4727686, 3401614, 9519795, 9659918, -7693897, 1932735, -5085242, -2379949, 5605469, --34897, -3140695, -514859, 67109, 9477919, -16687022, 13525926, -4219806, -4445291, 8935143, --6148246, 6986301, -8461622, -6327561, 172872, -8610336, 199716, -10551124, -7898982, -3605625, --7409893, -11509975, -2325188, 4032438, 14067629, 2150705, -8392366, -15789910, -3214783, 4713727, --2691334, 16659104, 5330592, -6110128, -11854647, -15034533, -28119150, -2484102, -3082176, 10586558, -7996692, -5975910, 744640, -4685273, -2429341, 9883257, -265751, 285078, -1238024, 11212012, -1934346, -3732864, -586800, -732292, 3084324, -10777147, -3320547, -4460861, 16496969, 3478387, --17430052, 4080219, -9073118, -5514738, 2503966, -16652662, 4970888, 11156178, 10273025, 7514582, -1888175, 2654827, -615791, 1056025, -10308458, 2977486, -16093779, -3877282, 9018894, 2437931, -9225053, 8221641, 7473243, -6405944, -11992086, -11681237, -8215199, 962610, 2897492, 3443490, -5036923, -1495722, 3051038, 7043210, 8249559, 14565845, 16900160, 12199318, 20891794, -9771587, -14858439, -12711493, -9933186, 10985453, 14081050, 16587164, -17076254, -96637, 4360466, -12676596, -6058588, -5569499, -8926016, 10251013, -13264470, 14471355, -13630079, 13558138, -9756555, -3613141, --815507, -17908404, -2395518, 19771346, -4952098, -14107894, 3131031, 9188009, -10177999, 5115843, -21494164, 11502996, 4465156, 9466108, -11150272, 7560753, -6625524, -19450834, -5727339, -5078799, -1635846, 8836895, 11112154, -4820564, -8309151, 7779260, 299037, 5954972, 3980361, -3165391, -1355062, -7736847, 1496796, 2466922, 246961, 2545842, 17965312, -2170569, 2173254, 5038534, -1539209, 2181844, -8376797, -9747428, 7457137, -11582453, -15022185, -16481937, -13032541, -21954800, -8137353, 27404576, 14153528, -5703717, -21055540, -7965017, 1891933, 2541010, -3666292, 10121090, -7675644, -8298414, -3512747, -1512902, -13719736, 19364934, -8472360, 6602439, -1087164, -5133560, --16807280, 5236639, 4199405, -2629057, 2700461, 7323993, -2230162, 18921478, -3719979, -3427921, -16804060, -2280091, -10963441, -10861972, -19396610, 2268817, -3781719, -6728067, -3688303, -15221901, --5463736, -14301167, 2183454, -12666395, 11687143, -7412577, 516470, 2827162, 2119030, 5721434, --5050345, -15530602, 7271380, -2396055, 4511863, -4058744, -678605, -346819, 15181099, 20598664, -6685654, -7687992, 8286066, 6722698, 9405442, -4727149, -6289443, 9511205, 6060736, 12888123, -4255776, 1688459, 1195612, 1282048, 13578539, 9124658, 9250823, 40359272, 2323041, -12416214, -35951024, 16276852, 16638166, 28865402, 31317290, 7312182, 10886131, 6261526, 33935612, 388695, --10120017, 12774843, 4392141, -14030048, -12921946, 11217381, 13561896, 22086332, -864362, 360240, -1762010, 1854352, -12444668, 14288282, 12377559, 3424700, -9296994, 15171435, -3490735, -2297271, --20447802, -6245956, -76236, -2861522, -9985799, 6112812, -9138080, -7692824, -4625680, 1595044, --5735392, -11712376, -12252468, 13230647, -8839043, 14134737, 8899172, 11270531, 5996848, -14936823, -1410897, -23008140, -7652021, -13422310, 6721087, -16660178, -5614596, -4690105, 2679523, 13172128, -4355097, -4606353, -21438866, 7349763, 11622182, -3077881, 3554622, -15078556, 13918378, -1960116, --5121749, 25368224, 14274861, -12942347, -22985592, 6880001, 7272454, -7452842, 15408195, -16991428, -18455474, -13368623, -7356742, 5598490, 4492536, 46665356, 18622978, 6777996, -28981902, -1028108, --6646999, -15766288, -4200478, -5919539, -4821101, -1983738, -24023900, -715112, -8880382, 55835, -12194486, -13161390, 15732465, -5288179, -16661252, -15433428, 12560095, 9102646, -3419331, -8630737, -15944529, -8631811, -7502234, 11972221, 86973, 3515431, -12130598, -667867, -6922414, 15427523, --1859721, 22237730, -7877507, 3141232, 7334194, -875100, 1455994, 6630893, -13857175, -2542621, -19152870, 1291175, 5805185, -362925, -14182519, 6233608, -9588514, 5187784, 17099338, 20860120, -23898272, 24034636, -4020626, 8534637, 1113470, 13192529, 30607010, -31338228, 26423176, -12563853, -4053376, -10557566, -25418690, -4130148, 4324495, 1028108, 5124970, -17686676, -3167539, -3068754, --26825828, -19544248, 9727027, 11567421, 4349728, 8204462, -14064407, -5841156, -10168335, 29334090, -6187974, 1540820, 20739324, 13090523, 10085120, 10474888, 7730405, -14300094, 10158135, 5217849, --5347771, 9366250, -8331163, -6662568, 14209899, -5609228, 8672076, 20633560, -64425, 4721780, --1119913, 2259153, -5082557, -10551124, -15428596, -22692996, 8900783, -19007914, 6692096, 9006010, -9230422, 1308354, -317828, -1503239, -16461536, -5948530, 6840273, -3867618, 7032472, 21356188, --7221451, 16858284, 5681705, 3606699, -2197950, -3246459, -15802258, 1796907, -20998096, -3984119, -18942416, -7868380, 1196148, -30304216, 13761612, -1106491, 2117419, -17052630, -22750442, 7493644, -6690486, 20426328, -48381196, -11911018, -28729036, 9700721, -25796110, -8652748, -29234768, 7833484, --15232102, -11693048, -2473364, -24834574, -9007620, -26605712, -13415330, -30805116, 6681359, -28496034, --11242614, -14790257, -8267812, -7802882, -6624450, -27191974, -15528991, -20677046, -10589779, -5945309, -11796128, -1664300, 8815420, -16904992, -2719788, 1016297, -19486804, 3812857, -1333587, 1691143, -5145908, -19731616, -1089311, 7315940, -2421825, 8235063, 16426639, 29740502, -24692304, 1511292, -33046016, 133681, 16206522, -11635603, 20447802, 3659312, -4943508, -27606440, -16259136, 22634478, -13977434, 22022444, 666794, -15906411, 5477694, 7542500, 15668041, -30601642, -142271, 4615479, --16976932, -7085086, -7793755, -12657805, -24834574, 30673046, -2499671, -13788456, 20585778, -34854732, --406948, -7024419, 14946486, -7822209, -21533892, 18504330, -37751152, -32660542, -26951456, 15071577, --8192650, 555125, -14865419, -14154065, -16452946, 8697846, 7500087, 25809532, 11941083, 4867272, -23965918, -6961068, 8362302, -9305584, 7095286, 3877282, 13955959, 22937272, 11641509, -5498632, --15072114, -9222369, -3687766, 12522514, -5166846, 2965138, -375810, -6824703, 11544335, -1587527, -9236864, 6773701, -21110302, 15632607, 29159606, 3804804, 24109798, 23596550, 9776956, 7120519, --1413581, 11918534, -9674951, -30612380, -11334419, 20749524, -1668595, -12064026, 9222369, 29847876, --9382893, 1058173, -25058986, 20806970, 17013976, -2863133, 3075197, -11589432, 47078212, -33382096, --32917166, -27088358, 54212688, -10677826, 29489782, 55289116, -19894826, 27375584, 9758703, -32120450, -29264296, 6372121, -16376173, 24457692, 8099235, 23097798, -1774895, -16310675, 15479599, 7619272, --1492501, 7141457, -6744173, -17302812, -12956843, -7336878, -18093086, -10439992, -4701379, 14537391, --12946105, -4969814, -17846662, 5327907, -185220, 4509716, 20748988, -11442330, 3789235, -10452340, --8615168, 14796699, -11861089, -20916490, -31091806, 35944044, 13399761, -6353331, 21682606, -19412178, --20574504, -9323837, -3671123, 5599564, -1682017, -17814988, -16636019, -13407277, -36424008, -19210314, --20657182, 8996346, 9298067, 1459215, 17558364, 6275484, -23256174, -15208479, 23993298, -20469814, --160524, 26402774, -7157026, -37753300, 23364622, -11864310, -2373506, 5253819, 11489038, -26694296, -15863462, -7268696, 27055072, 19271518, -44149580, -5122286, 4278325, -26288422, -4720706, -4012036, -31952410, 23672786, 21209086, 27230630, -1408212, -18574122, -15018964, -14747844, 292058, -41544680, -4590247, 36004172, -33054068, -58693948, 5559835, -21869974, 43001748, -153008, 980863, 29234232, --13793824, 6059662, -1796370, -7871602, 24850680, -7292318, 12355547, 42496016, -31733366, -17930952, --28952912, 14088566, 1949378, 28315108, -16730508, 11013370, 1133871, 25677462, 14915885, -12989592, --8768713, 9444633, -4979478, -1583769, -18558016, -18563386, 9307731, -4600984, -5421323, -10919417, -23493472, -9636833, -9283035, 38567196, 42443940, 26359288, -35186520, -4195110, -10280541, 12773770, -53962504, -7888245, -37510632, -4091493, -12279311, 20345796, -26291106, 4413079, -21705154, 19960324, -10555956, -20139638, 34532612, 53805740, 831613, -2030446, -18957986, -18033494, 2370822, 3481608, --9759239, 48615808, -5143224, 36332740, 28010702, -36012228, -1996623, -11878806, -39759048, 10086731, -8098161, 21492554, 35438312, -871342, -11368242, 12173011, 12184822, 28821378, 10954851, 2782065, -22501870, 24944096, 7429757, -5604396, 20477330, 9715216, 24802900, 5616207, 6274947, 16282758, -26263188, -4590783, -23113904, -25241522, -9570798, -8817031, 41902776, 23651312, 65386044, -3211562, --35166120, 29533268, -11715060, -11681774, -11696270, -22897008, 1693828, 12580496, -2229088, -12948253, -45654964, -9723806, 54105312, -15633144, 28113782, 2268280, -11640435, -31101468, -46022184, 40011916, --6589554, -9184251, -15374372, -19359566, 12869333, 48737140, -28584618, -19813222, 4925254, 8100845, --4704600, 34265248, 28258738, 26786100, 10255845, 12814572, 24167780, 13538811, -7467875, -14637785, --30242476, -5830418, 18102750, 5100811, 4671314, -12368432, -28534152, -9343164, -3160022, 29381872, -1400696, -4280472, 23810224, -4286378, 7306813, 4234838, -49823768, 12428562, 14727443, -9453223, --20726438, 3592203, -27660664, -15091978, -42899208, 12812424, -35655208, -73074040, 9428527, -1362042, -52153788, -2069637, 18359374, 41997800, -5955509, -11129871, 19723564, -470299, -35931696, -12884902, -5750425, 6245420, 28068148, 11557220, 25042344, 21374978, -14332306, -10707353, 10982768, 31703838, --12333535, -5335423, -28040768, -18008262, 7480760, -36093296, 10383620, -39857296, 5872294, -6429566, --1507534, -10030359, 38351912, 42099808, 96431144, 11988864, -54987928, -40258340, -30709554, -34140160, -67239320, 91193432, 30016990, -8159364, -29277718, 1489817, -35302484, 38456600, 35094716, 11117523, -4347581, -22048752, -4148402, 42241004, 8817031, 17227114, 13179644, 44286480, 35887136, -13808857, --33681672, -42709692, -30181808, -3920232, 10842108, 39828844, 22413824, -7839926, 20066624, -29545616, --11567421, -66926328, -12090870, 66615480, 49649820, -9946071, 132584032, 42461656, 2179159, -73252280, --14423574, -5982890, -19284940, 19113678, 8257612, 16222628, 25811680, -59788092, -67262944, -32276142, --46461884, -6054830, 11664594, 54431732, -35976792, 19859392, 80760952, 42142756, 10230612, 23256174, -11975443, -52157544, -91135448, 41270876, -29368450, 13917842, -20547660, -89156008, -21260624, 49079128, -94605784, 82932600, 199940928, 104043432, 70535176, 61588220, 27681602, -12429635, -102235256, -128500592, --190778160, -146803056, -150321712, -58489940, -839666, 54990612, 104316704, 85269056, 88462904, 59854128, -82899848, 63895692, 91799560, 41895260, 32471026, 13560822, -27154394, -40804872, -60283088, -38337952, --127493960, -56521768, -121146528, -89165128, -138427328, -84695144, -129466424, -49622440, -66748624, -25806848, -4447439, 57425860, 160950672, 151998352, 216138864, 143258096, 96016144, 125458680, 174772960, 151669792, -126644088, 84594752, 2708514, -101126616, -99828464, -123179128, -223651840, -247721360, -268104208, -269902176, --294455456, -258973648, -220291024, -199029328, -135946992, -8399882, 111380848, 205813216, 279080544, 348654720, -387223520, 247036848, 212924608, 56009596, -22849762, -17192754, 0, 0, 0, 0, -0, 0, 0, }, +1927904, -5349382, 1587527, 2429341, 27917, -2440078, 324807, -826781, -2805688, 7335268, +2345589, 2139431, 4487167, -2088428, -465467, 420370, -3085397, 5737003, -2183454, 597000, +-3279745, -700617, 3382824, 29528, 252329, -1219771, 466541, -4053912, 4246649, -3253975, +951335, 2710124, -577136, -2592013, 4911832, -60130, -4220879, -510564, -4885526, 2048699, +-5196911, -2491081, 529355, 1159641, 803159, 1119913, 2338610, 3609383, -427886, 2384781, +2505040, 1815697, -67646, -2026151, 2518998, 688269, 1548336, -2685428, 4915590, 3955128, +-386010, -2535105, -408022, -200790, -955093, -2917357, -5924371, -979789, 3772055, 3449933, +1532767, 7355669, -1255741, 218506, -2921652, 10228465, -406411, -570694, 3279208, -1360968, +3738232, -2011655, -4784057, 1644436, 4806069, 665720, -754304, 6337761, 203474, 210453, +-2198487, -1272921, 9928354, 1322313, -6787659, -5063230, 6982543, -711354, 7235946, 434865, +-1433982, -766115, 5441187, 1002875, 11478837, 4993437, 3106335, -716186, 2485176, 5122822, +-1371168, -3995930, -4984310, -1045825, 4303557, 3677029, 5767604, 1533840, -3411278, -3543885, +-1557463, 2327336, -932008, 1217086, -825707, -5374078, -4207994, 1455994, 3639448, 2199023, +-2090039, -2319819, -358630, 5538897, 2673080, -803696, -1528472, 2457795, 1510755, 934155, +-3214246, 1245541, 2398202, -591095, 3794604, 4661114, -9068287, 2843268, 1196148, 5211943, +2711198, 4661650, 9530532, -7705172, 1611150, -1548873, -49929, -9943923, 860067, 6283001, +-9163313, -1674500, 5870684, 16172699, 2144263, 92342, 994822, -9801652, -459562, 7584912, +6415071, 392453, -335544, 824634, 3313567, 5975374, 5946919, 6780680, -3040837, 1647120, +-505732, 2762738, 607201, 1869385, -10248329, -2538326, 1495186, 1079647, -5697274, 76236, +3757560, -4204773, 3461207, 3525095, 5952825, 3091303, -2347737, 3284576, 6678674, -3469260, +-6096169, 2337536, 1389422, 1497333, 3178813, -2365453, -4897874, -6975027, 5928129, -734976, +-1343788, -2007897, 2648384, 302258, 3905736, 7991324, 1629403, 967978, -288837, -1329829, +-5767068, 9746891, 2413235, -434865, 4883915, 102542, -4664872, -4219806, -5072357, -7426536, +4184909, -195421, -3423089, -1498944, -1714766, 1482838, -2837900, -5144297, 1212791, -3388192, +8660802, 11308112, 9097814, -6376953, -184147, -540092, 2470143, -3602404, 7138773, 4310537, +-967441, 3293703, 5418101, 290984, 1340030, 1728188, 5256503, -652835, 1971390, 6095096, +659814, -233539, -2712809, 4332012, -6782290, 2572686, -944356, -1574106, 4529580, -4558571, +-557272, -35433, -5917928, 2258079, -1210107, 2532957, -217970, -2763275, 1758252, 1661079, +-357556, 5021354, -432718, 5818070, -162135, -4270808, -1879048, -25770, -2855617, 5127654, +2683818, 4347581, 5090073, -2602750, -5414880, -3728569, -284005, -1324997, -1494649, 3877282, +4817343, -1307818, -15266461, -3415036, -4859756, -8027294, 2633352, 2287070, -1128503, 3946538, +-682363, 3352759, 4373888, -1848983, -5445482, -6520834, -2702608, -6064494, 323733, 826244, +-2867965, 3661997, -3204583, 2027761, -1556926, -3402688, -9581535, -3525095, 664109, 1615982, +2295660, -3362960, 2318209, 3918084, 1068910, 8719320, 1949915, -85362, 6457484, -4563403, +3645890, 766652, -2433099, -3046743, 4085588, 711891, 1149441, -9998147, -2079301, -3212099, +9966472, 4502200, 3445638, 4271882, 4446365, 3841312, 4948339, -2597382, -1355062, 3326989, +4839355, -530428, 5683853, -3039763, 1025960, -1118839, 4748087, 7728257, -12091944, 3291556, +-3243237, 605590, -5912023, -2587181, 548145, -1340030, -2795487, -4186519, -2434173, 5993090, +3534758, 2236604, -1202591, 587874, 565325, 7729331, -6124087, 7759396, -1082332, 4286914, +7773354, -4778151, 6012418, -3662533, 3061775, 1327682, 9161165, 4220879, -5175973, -8288750, +1880659, -6168110, 5167920, -1128503, 6750078, -4878546, -855772, -3862786, 2309619, 1703491, +1913408, -301721, -747324, -7154879, -3256122, 6286222, -4851166, -744103, 3920232, 435402, +-3799436, 1494649, 322659, -573915, -3295314, 6913287, 2095407, -9130564, -4275103, -7296613, +-1352378, -6397354, -11633456, -2289755, 5043366, 14682883, 3099893, 1580548, 6706592, 245350, +-5320928, -4162360, 3709778, 1950452, 2470680, 4647692, -10215043, -1928440, -9436043, -1434519, +2434710, -3015067, -8865886, 1632088, 3300682, -979253, 16563541, 3809636, 12031814, -5682779, +-645856, -4063039, -780610, 12572443, -10650982, 3549254, 1376537, 16507707, 8982924, 10941429, +2174864, -2782602, 5362804, -3656091, -13561896, 2585034, 966905, 1592896, 11020349, 1020592, +-6165426, -559956, 488553, 3446175, 3957812, -302795, -1203128, 4453881, -4956393, -1381369, +-2396055, -1271310, 1567126, 267899, 9774272, 1455994, 7729331, 8730595, 2632815, 7725573, +-318901, 2644626, 4878009, -4859219, -7215008, 1091459, 7769059, -11839077, 3825742, -9027484, +-8362838, -5075041, -2142115, -7882339, -7613904, -8067023, -4031364, -1799054, 5802501, 430034, +6892349, 1333587, -5324686, 8784819, -8613020, -2939368, -3513820, -3170223, -4585415, -5623186, +8742943, 7454453, -3863860, -8243116, -9578314, -4633196, -6139656, -2310156, -2924336, -10045392, +-9237401, -6641630, -1795296, -39192, -2039573, 7964480, 32212, 4380867, 4945655, 7190312, +305480, 13515188, 15484431, 200790, 3934190, 4191888, -2756295, 7620883, 3049427, -14083735, +-1306207, -4548371, 6979, 11777337, 3633006, -11185705, -3979287, 5667210, 4250407, 1179505, +14013941, -5733245, 5072357, 6544457, 5674726, 4332549, 6741488, -12719546, 3773666, -4712116, +6731288, 701153, 2245194, -9471477, 6083821, 5639829, -2487860, 5462662, -2122251, 1786706, +-1430224, -4793184, -68183, -2949032, 1729261, -3732864, 3456912, 1903207, 10933913, 9760850, +-4866198, 3658239, -12529493, 9343164, -5235565, 5801964, 6994891, 9839233, -3170223, 9879499, +806917, 8540542, -7601019, -2024540, 6860674, -3659849, 11730629, -3752191, -8215736, 15517180, +21168284, 4675609, -8280160, 5815386, -4333085, 8658117, 5117991, -1908039, -8762270, -5800354, +-14945949, 3919158, 6507413, -13281113, -1471026, 7690139, 2130841, -665183, 447750, -1649268, +-7035694, 1719061, 9068823, 334471, 2103997, 3190087, 12812961, -8349954, -10201, 9123584, +-8140574, 12263205, 911070, 17248052, -14098767, -13037373, 7468948, 571231, -1363652, 3640522, +-789200, 4727686, 3401614, 9519795, 9659918, -7693897, 1932735, -5085242, -2379949, 5605469, +-34897, -3140695, -514859, 67109, 9477919, -16687022, 13525926, -4219806, -4445291, 8935143, +-6148246, 6986301, -8461622, -6327561, 172872, -8610336, 199716, -10551124, -7898982, -3605625, +-7409893, -11509975, -2325188, 4032438, 14067629, 2150705, -8392366, -15789910, -3214783, 4713727, +-2691334, 16659104, 5330592, -6110128, -11854647, -15034533, -28119150, -2484102, -3082176, 10586558, +7996692, -5975910, 744640, -4685273, -2429341, 9883257, -265751, 285078, -1238024, 11212012, +1934346, -3732864, -586800, -732292, 3084324, -10777147, -3320547, -4460861, 16496969, 3478387, +-17430052, 4080219, -9073118, -5514738, 2503966, -16652662, 4970888, 11156178, 10273025, 7514582, +1888175, 2654827, -615791, 1056025, -10308458, 2977486, -16093779, -3877282, 9018894, 2437931, +9225053, 8221641, 7473243, -6405944, -11992086, -11681237, -8215199, 962610, 2897492, 3443490, +5036923, -1495722, 3051038, 7043210, 8249559, 14565845, 16900160, 12199318, 20891794, -9771587, +14858439, -12711493, -9933186, 10985453, 14081050, 16587164, -17076254, -96637, 4360466, -12676596, +6058588, -5569499, -8926016, 10251013, -13264470, 14471355, -13630079, 13558138, -9756555, -3613141, +-815507, -17908404, -2395518, 19771346, -4952098, -14107894, 3131031, 9188009, -10177999, 5115843, +21494164, 11502996, 4465156, 9466108, -11150272, 7560753, -6625524, -19450834, -5727339, -5078799, +1635846, 8836895, 11112154, -4820564, -8309151, 7779260, 299037, 5954972, 3980361, -3165391, +1355062, -7736847, 1496796, 2466922, 246961, 2545842, 17965312, -2170569, 2173254, 5038534, +1539209, 2181844, -8376797, -9747428, 7457137, -11582453, -15022185, -16481937, -13032541, -21954800, +8137353, 27404576, 14153528, -5703717, -21055540, -7965017, 1891933, 2541010, -3666292, 10121090, +7675644, -8298414, -3512747, -1512902, -13719736, 19364934, -8472360, 6602439, -1087164, -5133560, +-16807280, 5236639, 4199405, -2629057, 2700461, 7323993, -2230162, 18921478, -3719979, -3427921, +16804060, -2280091, -10963441, -10861972, -19396610, 2268817, -3781719, -6728067, -3688303, -15221901, +-5463736, -14301167, 2183454, -12666395, 11687143, -7412577, 516470, 2827162, 2119030, 5721434, +-5050345, -15530602, 7271380, -2396055, 4511863, -4058744, -678605, -346819, 15181099, 20598664, +6685654, -7687992, 8286066, 6722698, 9405442, -4727149, -6289443, 9511205, 6060736, 12888123, +4255776, 1688459, 1195612, 1282048, 13578539, 9124658, 9250823, 40359272, 2323041, -12416214, +35951024, 16276852, 16638166, 28865402, 31317290, 7312182, 10886131, 6261526, 33935612, 388695, +-10120017, 12774843, 4392141, -14030048, -12921946, 11217381, 13561896, 22086332, -864362, 360240, +1762010, 1854352, -12444668, 14288282, 12377559, 3424700, -9296994, 15171435, -3490735, -2297271, +-20447802, -6245956, -76236, -2861522, -9985799, 6112812, -9138080, -7692824, -4625680, 1595044, +-5735392, -11712376, -12252468, 13230647, -8839043, 14134737, 8899172, 11270531, 5996848, -14936823, +1410897, -23008140, -7652021, -13422310, 6721087, -16660178, -5614596, -4690105, 2679523, 13172128, +4355097, -4606353, -21438866, 7349763, 11622182, -3077881, 3554622, -15078556, 13918378, -1960116, +-5121749, 25368224, 14274861, -12942347, -22985592, 6880001, 7272454, -7452842, 15408195, -16991428, +18455474, -13368623, -7356742, 5598490, 4492536, 46665356, 18622978, 6777996, -28981902, -1028108, +-6646999, -15766288, -4200478, -5919539, -4821101, -1983738, -24023900, -715112, -8880382, 55835, +12194486, -13161390, 15732465, -5288179, -16661252, -15433428, 12560095, 9102646, -3419331, -8630737, +15944529, -8631811, -7502234, 11972221, 86973, 3515431, -12130598, -667867, -6922414, 15427523, +-1859721, 22237730, -7877507, 3141232, 7334194, -875100, 1455994, 6630893, -13857175, -2542621, +19152870, 1291175, 5805185, -362925, -14182519, 6233608, -9588514, 5187784, 17099338, 20860120, +23898272, 24034636, -4020626, 8534637, 1113470, 13192529, 30607010, -31338228, 26423176, -12563853, +4053376, -10557566, -25418690, -4130148, 4324495, 1028108, 5124970, -17686676, -3167539, -3068754, +-26825828, -19544248, 9727027, 11567421, 4349728, 8204462, -14064407, -5841156, -10168335, 29334090, +6187974, 1540820, 20739324, 13090523, 10085120, 10474888, 7730405, -14300094, 10158135, 5217849, +-5347771, 9366250, -8331163, -6662568, 14209899, -5609228, 8672076, 20633560, -64425, 4721780, +-1119913, 2259153, -5082557, -10551124, -15428596, -22692996, 8900783, -19007914, 6692096, 9006010, +9230422, 1308354, -317828, -1503239, -16461536, -5948530, 6840273, -3867618, 7032472, 21356188, +-7221451, 16858284, 5681705, 3606699, -2197950, -3246459, -15802258, 1796907, -20998096, -3984119, +18942416, -7868380, 1196148, -30304216, 13761612, -1106491, 2117419, -17052630, -22750442, 7493644, +6690486, 20426328, -48381196, -11911018, -28729036, 9700721, -25796110, -8652748, -29234768, 7833484, +-15232102, -11693048, -2473364, -24834574, -9007620, -26605712, -13415330, -30805116, 6681359, -28496034, +-11242614, -14790257, -8267812, -7802882, -6624450, -27191974, -15528991, -20677046, -10589779, -5945309, +11796128, -1664300, 8815420, -16904992, -2719788, 1016297, -19486804, 3812857, -1333587, 1691143, +5145908, -19731616, -1089311, 7315940, -2421825, 8235063, 16426639, 29740502, -24692304, 1511292, +33046016, 133681, 16206522, -11635603, 20447802, 3659312, -4943508, -27606440, -16259136, 22634478, +13977434, 22022444, 666794, -15906411, 5477694, 7542500, 15668041, -30601642, -142271, 4615479, +-16976932, -7085086, -7793755, -12657805, -24834574, 30673046, -2499671, -13788456, 20585778, -34854732, +-406948, -7024419, 14946486, -7822209, -21533892, 18504330, -37751152, -32660542, -26951456, 15071577, +-8192650, 555125, -14865419, -14154065, -16452946, 8697846, 7500087, 25809532, 11941083, 4867272, +23965918, -6961068, 8362302, -9305584, 7095286, 3877282, 13955959, 22937272, 11641509, -5498632, +-15072114, -9222369, -3687766, 12522514, -5166846, 2965138, -375810, -6824703, 11544335, -1587527, +9236864, 6773701, -21110302, 15632607, 29159606, 3804804, 24109798, 23596550, 9776956, 7120519, +-1413581, 11918534, -9674951, -30612380, -11334419, 20749524, -1668595, -12064026, 9222369, 29847876, +-9382893, 1058173, -25058986, 20806970, 17013976, -2863133, 3075197, -11589432, 47078212, -33382096, +-32917166, -27088358, 54212688, -10677826, 29489782, 55289116, -19894826, 27375584, 9758703, -32120450, +29264296, 6372121, -16376173, 24457692, 8099235, 23097798, -1774895, -16310675, 15479599, 7619272, +-1492501, 7141457, -6744173, -17302812, -12956843, -7336878, -18093086, -10439992, -4701379, 14537391, +-12946105, -4969814, -17846662, 5327907, -185220, 4509716, 20748988, -11442330, 3789235, -10452340, +-8615168, 14796699, -11861089, -20916490, -31091806, 35944044, 13399761, -6353331, 21682606, -19412178, +-20574504, -9323837, -3671123, 5599564, -1682017, -17814988, -16636019, -13407277, -36424008, -19210314, +-20657182, 8996346, 9298067, 1459215, 17558364, 6275484, -23256174, -15208479, 23993298, -20469814, +-160524, 26402774, -7157026, -37753300, 23364622, -11864310, -2373506, 5253819, 11489038, -26694296, +15863462, -7268696, 27055072, 19271518, -44149580, -5122286, 4278325, -26288422, -4720706, -4012036, +31952410, 23672786, 21209086, 27230630, -1408212, -18574122, -15018964, -14747844, 292058, -41544680, +4590247, 36004172, -33054068, -58693948, 5559835, -21869974, 43001748, -153008, 980863, 29234232, +-13793824, 6059662, -1796370, -7871602, 24850680, -7292318, 12355547, 42496016, -31733366, -17930952, +-28952912, 14088566, 1949378, 28315108, -16730508, 11013370, 1133871, 25677462, 14915885, -12989592, +-8768713, 9444633, -4979478, -1583769, -18558016, -18563386, 9307731, -4600984, -5421323, -10919417, +23493472, -9636833, -9283035, 38567196, 42443940, 26359288, -35186520, -4195110, -10280541, 12773770, +53962504, -7888245, -37510632, -4091493, -12279311, 20345796, -26291106, 4413079, -21705154, 19960324, +10555956, -20139638, 34532612, 53805740, 831613, -2030446, -18957986, -18033494, 2370822, 3481608, +-9759239, 48615808, -5143224, 36332740, 28010702, -36012228, -1996623, -11878806, -39759048, 10086731, +8098161, 21492554, 35438312, -871342, -11368242, 12173011, 12184822, 28821378, 10954851, 2782065, +22501870, 24944096, 7429757, -5604396, 20477330, 9715216, 24802900, 5616207, 6274947, 16282758, +26263188, -4590783, -23113904, -25241522, -9570798, -8817031, 41902776, 23651312, 65386044, -3211562, +-35166120, 29533268, -11715060, -11681774, -11696270, -22897008, 1693828, 12580496, -2229088, -12948253, +45654964, -9723806, 54105312, -15633144, 28113782, 2268280, -11640435, -31101468, -46022184, 40011916, +-6589554, -9184251, -15374372, -19359566, 12869333, 48737140, -28584618, -19813222, 4925254, 8100845, +-4704600, 34265248, 28258738, 26786100, 10255845, 12814572, 24167780, 13538811, -7467875, -14637785, +-30242476, -5830418, 18102750, 5100811, 4671314, -12368432, -28534152, -9343164, -3160022, 29381872, +1400696, -4280472, 23810224, -4286378, 7306813, 4234838, -49823768, 12428562, 14727443, -9453223, +-20726438, 3592203, -27660664, -15091978, -42899208, 12812424, -35655208, -73074040, 9428527, -1362042, +52153788, -2069637, 18359374, 41997800, -5955509, -11129871, 19723564, -470299, -35931696, -12884902, +5750425, 6245420, 28068148, 11557220, 25042344, 21374978, -14332306, -10707353, 10982768, 31703838, +-12333535, -5335423, -28040768, -18008262, 7480760, -36093296, 10383620, -39857296, 5872294, -6429566, +-1507534, -10030359, 38351912, 42099808, 96431144, 11988864, -54987928, -40258340, -30709554, -34140160, +67239320, 91193432, 30016990, -8159364, -29277718, 1489817, -35302484, 38456600, 35094716, 11117523, +4347581, -22048752, -4148402, 42241004, 8817031, 17227114, 13179644, 44286480, 35887136, -13808857, +-33681672, -42709692, -30181808, -3920232, 10842108, 39828844, 22413824, -7839926, 20066624, -29545616, +-11567421, -66926328, -12090870, 66615480, 49649820, -9946071, 132584032, 42461656, 2179159, -73252280, +-14423574, -5982890, -19284940, 19113678, 8257612, 16222628, 25811680, -59788092, -67262944, -32276142, +-46461884, -6054830, 11664594, 54431732, -35976792, 19859392, 80760952, 42142756, 10230612, 23256174, +11975443, -52157544, -91135448, 41270876, -29368450, 13917842, -20547660, -89156008, -21260624, 49079128, +94605784, 82932600, 199940928, 104043432, 70535176, 61588220, 27681602, -12429635, -102235256, -128500592, +-190778160, -146803056, -150321712, -58489940, -839666, 54990612, 104316704, 85269056, 88462904, 59854128, +82899848, 63895692, 91799560, 41895260, 32471026, 13560822, -27154394, -40804872, -60283088, -38337952, +-127493960, -56521768, -121146528, -89165128, -138427328, -84695144, -129466424, -49622440, -66748624, -25806848, +4447439, 57425860, 160950672, 151998352, 216138864, 143258096, 96016144, 125458680, 174772960, 151669792, +126644088, 84594752, 2708514, -101126616, -99828464, -123179128, -223651840, -247721360, -268104208, -269902176, +-294455456, -258973648, -220291024, -199029328, -135946992, -8399882, 111380848, 205813216, 279080544, 348654720, +387223520, 247036848, 212924608, 56009596, -22849762, -17192754, 0, 0, 0, 0, +0, 0, 0, }, { -6327561, -328028, -5092221, -1712081, 2312840, 1407676, 3224447, -4187593, 2341831, -546535, -3929895, -4642860, -2215130, -960999, -3183645, -2645700, 3153580, -3089155, 1725503, 4360466, -419296, -2439542, -1421097, 79994, 2024003, -584116, 4193499, -173946, -6439230, -145492, 1058173, -2829310, -2903935, 465467, 929324, -569083, 2788508, -506806, 3889630, 3453154, -2181844, --229244, 3512747, -7078106, -4002373, 1541893, -3591667, -805843, 1478543, -16643, 4281546, -4736275, 1091995, 2000918, 2433636, 2530273, -747324, 705985, 2312840, 3107946, 442382, --2132451, -4013647, -2622615, -83752, -431107, -329639, -5526549, 5031018, -1579474, 712965, --1739462, -3380139, 1675037, -679679, 1908576, 12936978, 565325, 2183454, 1793149, -5264556, --2747705, 7159174, 12437152, 2004139, 6609418, -2703682, 1221381, -357556, 5581847, -4473209, --10208064, 4088272, 4704600, -5950677, 6812355, 3353296, 6203007, 1949378, 1420024, -2775086, --954020, 285615, 4093641, 332323, -6381785, 228707, -608812, 1309428, -983548, 1065689, -1394254, 3690988, 2596845, 833761, 1040993, 307627, 1697586, -2005213, -3288871, -7038915, -1184874, 1459215, 391916, 5262946, -2074469, 4071092, 950798, -1735704, -3499862, -2211371, -7255274, 1519882, 3935264, 613643, 1391569, -1516660, -16643, 421444, 1857573, -722091, --3101503, -1578401, -6141803, 581968, 757525, 4909148, -2013803, 3758097, -1148904, 2475512, -4661114, 4758287, 1983201, 2024003, 2399813, 3192235, 4398584, -1839857, 4570919, 186831, -4894652, -964757, 8811125, 3170760, 2833068, -5951751, -969589, -1244467, -8032663, 4464619, -3537443, -2365453, -10481331, -4588099, -1662152, 5191542, 6855305, 4521527, -2876018, 1619740, --4538707, 345745, 300648, -3487514, -1882269, -9251896, 701690, -1045825, -3994320, 537945, -484258, -1144072, -345208, 9109089, -2196876, 7441031, 1399086, -5533529, 407485, 668404, -4117263, -1731946, 1187559, 1086627, 355945, 5709622, 2007897, 5853504, 4320737, -2856153, -5367099, 2641405, 3990562, 438624, 1460289, -1277753, -2225867, -4687420, -5484673, 6099928, --5606006, -4685273, -4405026, 2741263, 3393561, 940598, -8111583, -7507066, 1603097, 168577, --1649268, 4529043, -611496, -766115, 4662187, -5134097, 991601, -4479114, -2931852, -1604170, -31675, 7668127, 8669391, -4015258, 3386045, -6237367, -615791, -2429878, 8422431, -2475512, --494995, 903554, -11901354, -2047626, -5885716, -1915019, -1473711, 4446902, 5865315, 2428804, -7933342, -999117, -3635690, -3654480, 4575214, 11947525, 8324721, -4635344, -5455682, 5985037, --5368172, 1035624, 1889249, 9789304, -3611531, -4802847, 1051193, -2975876, 1855963, 2500208, -6200322, -6798397, -4427038, 3992709, 7494181, -693637, -3496104, -4434017, -10623602, 4008278, --27380, 3130494, 491774, 223338, -1667521, 1867237, -2697240, 1557463, 2331094, 2116882, --3663070, 2427730, -19679004, -6484327, -1038845, 3355980, 2259690, 4895726, -9396852, -2815351, --423591, -9746891, -6961068, 2450279, 5900212, 3462818, 6511171, -827318, 3742527, 8669928, -7651484, 7192997, 4148939, -2760053, -2196339, -4439923, -1963337, -4457639, 9257265, 4318053, --1409286, -4078072, -2487323, -4160750, -6081137, -6547141, -8245801, 5012764, 3584687, -9131637, -2180233, -441845, 6349573, 1009317, 3138547, 4150549, -8639327, -1296006, -290447, 1209570, -4578972, 6976638, -2730526, -915902, -1989107, -5356361, 1720671, 1206349, -526670, -1351304, -5289789, 449898, -2833068, -783832, 2549600, 3583077, -1276679, 135828, 958315, -4391067, -3610457, 75699, -7033009, 1393180, -8607651, 2162516, 6528351, -989990, -413391, 10589779, -4296578, 1618129, -2469606, 7757785, 3323768, 4303021, 12857521, 13467407, 776315, -2403034, --4580583, -7603703, 2997350, 5222680, -2513630, -724239, 1060320, -1465658, -4062502, 4959614, --4701379, 2205466, -14137422, -2240899, -3189550, -3661997, -6802692, -1637993, -571768, -34360, --3296388, -5372467, -3742527, 432181, -2338073, -5687611, 3725347, 4628901, 812286, -4690105, --4669703, 1738388, -3476776, 4356171, -5146982, 3483755, 1808718, -213675, -7492571, -7567733, -2265059, -5529771, 9296457, 1396938, 7924215, -3965329, 8006356, 1251983, 5421323, 1413581, -5218922, -4361540, -5142150, -370978, 10325101, -1214402, -5448166, -3726958, 5186173, -3070365, --2419140, 417149, -8655970, 6105296, 10442139, -1925756, 15885473, 2833605, 8893804, -3696356, -6758131, 4417911, 10320270, -7703024, -4882841, -2018098, 957778, 6743636, -2939368, 10411001, --410169, 5778342, 5662378, -3325915, 2564096, 5862631, 6118718, 1145146, 1984812, 5315559, --11235098, 1588064, 9418863, 6723772, -5877126, 7546258, -8861054, 5327907, -7761006, -4442070, --1721208, 8218957, -1309428, 8623221, 2421288, 1618666, 884763, -605054, 3983582, 4940823, -12091407, 1530619, 10506564, -5235029, 7815767, 9373229, 182536, -2021319, -2987150, 3454764, --13295608, -1423245, 1890859, -5441187, -7647190, -722091, 46171, -1358283, 4206921, -8674760, -4882841, 3501472, 6005975, -13499082, 5254356, 3039763, -7159711, -1023276, 5064304, 9812927, --11694122, -1181116, 1443109, -13885092, -16828756, -13618804, -12135967, -485868, 8724152, -17914308, -12826383, 8164733, -19925964, 12579422, 5490579, 4277788, 2134599, 1906429, 4694936, -3179350, --3104725, -6610492, -17180, 7680476, 6693707, 3785477, -11217918, 7807177, -7948374, 235686, --6951405, 8978092, -4506495, -3673808, 3082176, -13388487, 1610076, -4398047, -3730179, -1370632, -1263794, 13281649, -5908265, -1936493, -4686346, 10145250, -5746130, -3179350, 3483219, 3151432, -3246459, 3702799, -3725884, 5013301, 1711545, -10826002, 15657303, 6239514, 3002719, 1823751, -527207, -6779069, 9329206, 7580081, 3763465, 10081899, 1845225, 4699231, 10679436, 5468567, -3140695, -6146098, 9259413, -2823404, 16828756, -795106, 2243047, -3066070, -13536663, 3409130, -10298258, 6261526, -710280, -6648610, 16617228, 25274272, -2991445, -4067334, 12852690, 2525441, -4496831, 2785823, -18169322, 1510755, -11624329, 9048959, 14042932, -4152697, -6257231, 1658931, -9009231, -5794985, 10802916, -4719632, 20530480, -6536404, 4227322, -1638530, 5793374, 13726179, --5131412, 730144, -974421, 3453691, -5048734, -3309809, 8475581, 16900160, 1751810, 12143483, --4515621, 971200, -2166274, 3468723, 9709310, 13217225, 11240466, 9527848, 11102490, 5917928, --1734093, 686658, -1248762, -760209, 2398202, -8133595, -1789391, 10210211, -9732933, 2766496, --4144644, -3913252, -4940823, -21927418, 2544768, 9660992, 7304666, -4155918, -9490267, -25490094, --3549254, 7588671, -1709397, 1359357, -7055558, 2308545, -6011344, -18287970, -13481365, 1248762, -8891119, -8530879, -4612795, 468151, -3671123, -27062588, -22246320, 9415642, 9812927, 1149441, -1989644, -10241350, 15853261, 17949206, 12049531, -10051834, 9561671, 11615202, -1215476, -15898895, --6258841, 20764556, -5624797, 1634235, 1998770, 11455215, -8871255, -17571784, 4434554, 7364795, --3462818, 4541928, 11819750, -5849209, -3486977, -978179, -23082228, -7384123, 9002788, -5005785, --15133854, 2415382, 404801, -5488968, 4016331, -1979980, -14249091, -13291850, -21736830, -18466748, -4425427, 7439957, 1685238, -5882495, -6574521, -324807, -4149475, 4299263, -9813463, -180926, --2741263, -3719979, -2512019, -1604170, 5493263, -5618891, -20367272, 2506650, -1658394, 4501126, -7593502, -602369, 6045167, 3766686, 8648990, 27763206, 24663850, 19247896, -2103997, 18795850, -6049999, 26235808, 11058467, -644782, 31998044, -6809134, -1819992, -20594368, -5557688, -583579, --14610942, 8444443, 12672301, -4398047, -424665, -11839077, -20183126, -11999065, -15481746, -4700305, --9501541, -3178813, -1804960, 8810589, 1921461, -2231236, -8631274, -3187403, -5937256, 2538863, --280247, -8526584, 3765613, 4990215, 1566053, -6721087, -8864812, 2299418, 6979322, -1564979, --978716, -15094126, 25438554, 3875134, -5764920, -1251446, 1485522, 10648298, 8624831, -10422812, -4605816, -4444755, 186294, -2273648, -3553012, -15590194, -14487462, -18558016, 1512365, -1401233, --5055177, 10594074, -4919885, 31108448, -4535486, -2335389, -9276056, -4049617, -18336290, -22716082, --14801531, 19356344, 12747463, -10896332, -14115947, 20687784, 10266046, -10715407, -17963700, -1269700, -1486059, 3309272, 1020592, -8208756, 8819178, -5729487, 18541910, -1574642, -15255724, 4776541, -3794604, 1424855, 246961, -4581657, -10335302, 1084479, 6824166, -3335042, 4911832, -8122320, --27292370, -19488950, 12182675, -14784888, 12007655, 5573794, 354335, -3758097, 6581501, 4270808, --3231963, -1959042, 2477659, 9800578, -8311299, 23966454, -6703370, 9371082, -7778186, 3940633, --2982855, -6598144, 20199232, -14560476, 22082574, 1334661, -12602508, -15274514, 7889318, 5463199, -1855426, 3441343, 8388608, 8824010, 7530689, -15417859, -6438156, 3215320, -666794, 7395934, --14481556, -3721052, -5132486, 296890, -17075716, -2323041, 4007205, 40796284, 14227616, -9645960, -21664352, 19297824, -9731859, -13438953, 32347546, -3282429, 7492571, -19319836, 46877420, 1207960, --12498355, 6330782, 2815351, 22131430, 889058, 28063316, -19942070, 66572, -21826486, 1361505, -16208670, 382789, -13171591, 19057306, 10879152, 5392332, 5185636, -7080254, -6017786, 1480153, --9163313, 12430709, -10798622, -15338939, 13850733, 4827543, -16984448, 9312563, 1676648, -12897787, --6615860, -4391604, 7217156, -1605244, -7148973, 9288941, -10800232, -4505958, -3367791, 15687368, --9767293, 7660611, 12523051, 5732171, -6617471, -14374182, 9750650, -12156368, 17370996, -20835424, -28533078, -7705172, -3562139, -3200825, 13120051, 100932, 4860293, 8973797, 4626754, 12597676, --11027865, -17936858, -723165, -1926293, -24815784, -2918967, 22411676, -6456410, -14223858, 6367826, --6765647, -1082332, 10062572, -24375550, -14567992, 9599252, 12430172, 17316234, -1402307, -3125663, -6735583, -1540283, -24428164, -16474958, 28286654, -2049773, -25185152, -14383845, -10276783, -8149701, -2078764, 8489540, 202400, -4065187, -12723841, -18956912, 2287607, 2634426, -960999, 15680926, --10945724, -29802242, 11797738, 8886824, -35264904, 20940650, -6016713, -17547626, -14921790, -1229971, -19455128, 4832912, -7029251, -7121056, 5196911, 10520522, -15220290, 11329587, 1258962, 8362838, --6968585, -15229954, 12917651, 108985, 14506252, -47195248, 5225902, 7364795, -7853885, 13204877, -14295262, 45007500, 197032, -29568702, -14898168, -7611756, -30237644, -28066000, -197569, -15211700, --1046361, -181462, -19841138, 2504503, 13489419, 10541460, -17524540, 31769336, 23471996, -11259794, -14349486, -27193048, -5078262, -9667435, 42415488, 25836912, -9130564, -16735877, -18646600, -5180268, -1902671, 6776385, 28739774, 5055714, 5565204, 5141076, 1603097, -10129143, 1969243, -2678986, -13733695, 16418586, 22905060, 13362180, 10242960, -3161096, -3143379, 2482491, 20918638, 2116345, -4526896, -21370684, -9300752, 33176474, 14969572, 9170292, 1353452, 19365470, 12117176, 42063300, --1221918, 43359844, 4434554, -15153718, 15779710, -13421773, -7592429, -3012920, -6719477, -1018981, -9914932, 16248398, 4872104, -5509906, -17618492, 4469987, 3750043, 10900090, -12947716, 1890323, --4058207, -154082, -16345035, 7062000, -13345000, -5508296, -18343268, -36530844, 5495948, -10959146, --16591459, 5065377, -19014894, -19327, 23218056, 7293928, 19837918, -22779970, -10373420, 11310260, -2496987, 32847910, -16399796, 19731616, -7148436, -9696962, -24096914, -9234180, -12795244, 16618839, -4160213, -21415244, 27580132, -13727789, -12694313, 3015067, 11029476, -7545184, 19279034, -8685498, --12596065, -6260989, 6768332, -1782948, -3045132, 2593624, 19343996, -12123082, 34955664, -12699681, -202937, 32494112, -5709622, 6317897, -42684996, 2687039, 8509404, -8993125, 19932944, -33971580, --41771780, 17066590, -6696391, 24507084, -16683800, -15604690, 2842195, -4402342, 37202468, -3284039, --620623, 9262634, -32549410, 3190624, -32845226, -12245489, 3175055, 9624485, -41142564, -17264694, --3805341, -105227, 15307263, -15712064, 23671712, -5352603, -24773908, 19900730, -17306570, -6937446, -18650358, 37733436, -9669582, 30621506, 12971338, 6701760, -13471702, 34048352, 7087770, 14996952, -3031173, -22597970, 9067213, -22709640, -19490562, 11344619, -19437948, -6231998, -3501472, 19374598, -3164854, -8887361, 8172786, 7588134, -3064459, -21780316, -3416647, 13464186, 38367480, 6657200, --19732690, 370441, -2865817, 6940667, 12386686, 16835734, -7258495, -1598802, 13211856, 743029, -329102, 22741314, 23351200, 24580098, 10067403, 20270098, 3854196, 11238319, -9864466, -4168266, -3601867, -23220740, 2098092, 32947230, -4080219, -10188736, 7711614, -3039226, 9615895, -23622856, -27764280, -20125680, -8141648, -7513509, 755377, 463320, 2441152, -33514704, 36749352, -11370389, --15515569, -7590818, 62282396, -2867965, 11825656, 320512, -7305203, 2643016, -29999272, -11589432, --9770514, 12234751, 7318088, 15179488, 863288, -14453639, 15337865, -12127377, 17811230, 14591078, --15757161, -15149960, 1189706, 23661512, -23994372, 10720238, 10027675, -12318503, 5234492, -723165, -7452842, -23622, -34604552, 20059644, 11047730, -27561342, 33871184, -17235704, -5015448, -10251550, -27247810, -4432943, -24285892, 1065689, -216359, 24154360, 22854594, 2709051, -18597208, 27434104, --4762582, 5848135, -33806760, 27467390, 10205379, 2865280, -19575388, -13150653, -2484639, 10497974, --15788837, -26016764, -12101070, 23190140, 13038447, -1613834, 34812320, 3811784, -6109054, -23523536, -30657476, -26776974, -9778567, 34158412, 9426916, 7138236, -12927315, 9147207, 28258738, -24062018, --415538, -27060442, 25303800, 42703248, 18052822, 24876450, -37304476, -30878130, -26459146, 3798899, -43694848, -6903623, 15557982, 30561914, 13599477, -14639933, -107374, 22763864, -28503014, -21417392, --20724290, 23855858, 14519137, -27181774, -41645612, 56744572, 32993402, -37625524, 16809428, -2876018, -15330886, 3511136, -12847858, -25474524, 23980950, 1205275, -21169356, -28356984, 6828998, 9082782, --8570070, 2873870, -3710315, -12805445, -7468948, -5651640, 13165685, -24236500, 28398860, -17626008, -194884, 48589500, -45340360, -8110509, 41072236, 5809480, 8916352, -3346317, -14055280, 16211354, --5821292, -15286862, 1424855, -38783016, 70520144, -3400540, -80019000, 33764884, 76601280, 50141596, --97656280, -23369454, 16311749, 12184285, -17753248, -14671071, -19428822, 3991635, 20086488, 45191108, --18843632, 14192719, -23961086, -65156264, 34958348, -17110076, -35025460, -25373594, -35890356, 16182900, -11996917, -49540300, 30999464, -18093624, -1371705, -1896765, -25078850, 17770964, 18760418, 15362024, --2011655, 20464982, 10995653, -15001247, 605054, -29330332, -10709501, -26309896, -17898740, -3126199, -38859252, -35262756, -8151848, -9292699, -30962956, 15227270, -34908420, 15057618, 13638132, -25271588, -16372415, -39252244, 8761733, -34600256, 18736258, -14812268, -18986976, -20498268, -28329068, -10200010, -10500658, 19271518, -29212220, 14046154, 6739341, 23781234, 30451854, 15611132, -32037772, -17429514, --57311508, -18067316, -20234128, 12572980, -67374080, -17264158, -43149924, -9307731, 29434484, 27074400, -13265543, -222265, 38205880, -12263742, 9589588, 55236500, -31762894, 19235548, 28322624, -14345728, -4567698, 7741679, -1024350, 25615184, 3595961, 17917530, -23663660, -5923297, 24580634, 1426466, --32910186, 20404316, -11890617, -13670881, -11297375, -5740761, -10989211, 11024644, 20591684, 6788733, --1234266, -11986717, 18081812, -7477001, -23779624, 18857054, -41521596, -13137768, -7065758, -11719355, -26624502, 24978456, 50453516, -16393353, 22566832, -2860448, 11082626, 29849486, -685047, 1404991, --19694572, -68973416, 34690452, 4498978, -30932354, -23996520, 4606353, 15784005, -1861332, -20628192, -10950019, -20991116, 26562226, 12912282, -10389526, -24552180, 46982112, 4132832, 2755759, -4945655, -6387690, 2968359, 1528472, -15401216, -34102576, 10099616, -6833293, -9446244, -33934000, -963683, --4100083, 3590593, 63458680, 32945620, 63858648, -58932320, 4749697, 31221728, -12338367, 35510252, -67403608, 37586868, 1785096, -17870286, -19209242, 3908957, 29000692, 31854698, 6772627, 319438, --47154984, -9241696, 45759656, 15665356, -13242458, 25884158, -22051972, -29916594, -8704288, -1615982, -35292820, 46996068, 41474888, 16269873, -16603807, -24528022, -46652472, -45594836, 39692476, 17223892, -2898029, 62310848, 3359738, -18532248, -25722560, -25313464, 12116640, 26862872, 20636244, 41018012, -2464238, 29630442, -2346126, -4836133, 14352707, 27456116, 19320910, 17589502, -15918759, -5456219, --12691628, -27064736, -22546430, -39639864, -14006425, 11023570, -7266548, 29330868, 34155728, -426276, --645319, -14345728, -26794154, 4911295, 32120986, -3092913, -33655364, -66329864, 26410290, 107707576, -110029008, 92739616, 67689760, -41527500, -46842524, -51114404, -67476624, -104013904, -83249888, -72686416, -34508988, 78488376, 58959700, 126156072, 98103496, 51077900, -17822504, -33501818, -83646632, -65566972, --64366528, -12811887, -38958036, -31912680, 10910291, 18424336, 36941552, 36579700, 50474456, 49579492, -64301568, 37616936, 17699560, -8065949, -8913131, -26461294, -40011916, -49213344, -59800976, -39023000, --73751568, -48973364, -35681516, 39662948, 74382928, 79483736, 56294672, 38640212, 60119340, 46114528, -58054000, 45729052, 18486076, -17628156, -92651568, -64991444, -65392488, -104228656, -63103808, -54507428, --51727512, 25232932, 62867584, 96071976, 81349368, 113052664, 103615552, 101507792, 76465984, -26111254, --20229296, -60276644, -79548160, -68961072, -11515344, -6640020, 0, 0, 0, 0, -0, 0, 0, }, +328028, -5092221, -1712081, 2312840, 1407676, 3224447, -4187593, 2341831, -546535, -3929895, +4642860, -2215130, -960999, -3183645, -2645700, 3153580, -3089155, 1725503, 4360466, -419296, +2439542, -1421097, 79994, 2024003, -584116, 4193499, -173946, -6439230, -145492, 1058173, +2829310, -2903935, 465467, 929324, -569083, 2788508, -506806, 3889630, 3453154, -2181844, +-229244, 3512747, -7078106, -4002373, 1541893, -3591667, -805843, 1478543, -16643, 4281546, +4736275, 1091995, 2000918, 2433636, 2530273, -747324, 705985, 2312840, 3107946, 442382, +-2132451, -4013647, -2622615, -83752, -431107, -329639, -5526549, 5031018, -1579474, 712965, +-1739462, -3380139, 1675037, -679679, 1908576, 12936978, 565325, 2183454, 1793149, -5264556, +-2747705, 7159174, 12437152, 2004139, 6609418, -2703682, 1221381, -357556, 5581847, -4473209, +-10208064, 4088272, 4704600, -5950677, 6812355, 3353296, 6203007, 1949378, 1420024, -2775086, +-954020, 285615, 4093641, 332323, -6381785, 228707, -608812, 1309428, -983548, 1065689, +1394254, 3690988, 2596845, 833761, 1040993, 307627, 1697586, -2005213, -3288871, -7038915, +1184874, 1459215, 391916, 5262946, -2074469, 4071092, 950798, -1735704, -3499862, -2211371, +7255274, 1519882, 3935264, 613643, 1391569, -1516660, -16643, 421444, 1857573, -722091, +-3101503, -1578401, -6141803, 581968, 757525, 4909148, -2013803, 3758097, -1148904, 2475512, +4661114, 4758287, 1983201, 2024003, 2399813, 3192235, 4398584, -1839857, 4570919, 186831, +4894652, -964757, 8811125, 3170760, 2833068, -5951751, -969589, -1244467, -8032663, 4464619, +3537443, -2365453, -10481331, -4588099, -1662152, 5191542, 6855305, 4521527, -2876018, 1619740, +-4538707, 345745, 300648, -3487514, -1882269, -9251896, 701690, -1045825, -3994320, 537945, +484258, -1144072, -345208, 9109089, -2196876, 7441031, 1399086, -5533529, 407485, 668404, +4117263, -1731946, 1187559, 1086627, 355945, 5709622, 2007897, 5853504, 4320737, -2856153, +5367099, 2641405, 3990562, 438624, 1460289, -1277753, -2225867, -4687420, -5484673, 6099928, +-5606006, -4685273, -4405026, 2741263, 3393561, 940598, -8111583, -7507066, 1603097, 168577, +-1649268, 4529043, -611496, -766115, 4662187, -5134097, 991601, -4479114, -2931852, -1604170, +31675, 7668127, 8669391, -4015258, 3386045, -6237367, -615791, -2429878, 8422431, -2475512, +-494995, 903554, -11901354, -2047626, -5885716, -1915019, -1473711, 4446902, 5865315, 2428804, +7933342, -999117, -3635690, -3654480, 4575214, 11947525, 8324721, -4635344, -5455682, 5985037, +-5368172, 1035624, 1889249, 9789304, -3611531, -4802847, 1051193, -2975876, 1855963, 2500208, +6200322, -6798397, -4427038, 3992709, 7494181, -693637, -3496104, -4434017, -10623602, 4008278, +-27380, 3130494, 491774, 223338, -1667521, 1867237, -2697240, 1557463, 2331094, 2116882, +-3663070, 2427730, -19679004, -6484327, -1038845, 3355980, 2259690, 4895726, -9396852, -2815351, +-423591, -9746891, -6961068, 2450279, 5900212, 3462818, 6511171, -827318, 3742527, 8669928, +7651484, 7192997, 4148939, -2760053, -2196339, -4439923, -1963337, -4457639, 9257265, 4318053, +-1409286, -4078072, -2487323, -4160750, -6081137, -6547141, -8245801, 5012764, 3584687, -9131637, +2180233, -441845, 6349573, 1009317, 3138547, 4150549, -8639327, -1296006, -290447, 1209570, +4578972, 6976638, -2730526, -915902, -1989107, -5356361, 1720671, 1206349, -526670, -1351304, +5289789, 449898, -2833068, -783832, 2549600, 3583077, -1276679, 135828, 958315, -4391067, +3610457, 75699, -7033009, 1393180, -8607651, 2162516, 6528351, -989990, -413391, 10589779, +4296578, 1618129, -2469606, 7757785, 3323768, 4303021, 12857521, 13467407, 776315, -2403034, +-4580583, -7603703, 2997350, 5222680, -2513630, -724239, 1060320, -1465658, -4062502, 4959614, +-4701379, 2205466, -14137422, -2240899, -3189550, -3661997, -6802692, -1637993, -571768, -34360, +-3296388, -5372467, -3742527, 432181, -2338073, -5687611, 3725347, 4628901, 812286, -4690105, +-4669703, 1738388, -3476776, 4356171, -5146982, 3483755, 1808718, -213675, -7492571, -7567733, +2265059, -5529771, 9296457, 1396938, 7924215, -3965329, 8006356, 1251983, 5421323, 1413581, +5218922, -4361540, -5142150, -370978, 10325101, -1214402, -5448166, -3726958, 5186173, -3070365, +-2419140, 417149, -8655970, 6105296, 10442139, -1925756, 15885473, 2833605, 8893804, -3696356, +6758131, 4417911, 10320270, -7703024, -4882841, -2018098, 957778, 6743636, -2939368, 10411001, +-410169, 5778342, 5662378, -3325915, 2564096, 5862631, 6118718, 1145146, 1984812, 5315559, +-11235098, 1588064, 9418863, 6723772, -5877126, 7546258, -8861054, 5327907, -7761006, -4442070, +-1721208, 8218957, -1309428, 8623221, 2421288, 1618666, 884763, -605054, 3983582, 4940823, +12091407, 1530619, 10506564, -5235029, 7815767, 9373229, 182536, -2021319, -2987150, 3454764, +-13295608, -1423245, 1890859, -5441187, -7647190, -722091, 46171, -1358283, 4206921, -8674760, +4882841, 3501472, 6005975, -13499082, 5254356, 3039763, -7159711, -1023276, 5064304, 9812927, +-11694122, -1181116, 1443109, -13885092, -16828756, -13618804, -12135967, -485868, 8724152, -17914308, +12826383, 8164733, -19925964, 12579422, 5490579, 4277788, 2134599, 1906429, 4694936, -3179350, +-3104725, -6610492, -17180, 7680476, 6693707, 3785477, -11217918, 7807177, -7948374, 235686, +-6951405, 8978092, -4506495, -3673808, 3082176, -13388487, 1610076, -4398047, -3730179, -1370632, +1263794, 13281649, -5908265, -1936493, -4686346, 10145250, -5746130, -3179350, 3483219, 3151432, +3246459, 3702799, -3725884, 5013301, 1711545, -10826002, 15657303, 6239514, 3002719, 1823751, +527207, -6779069, 9329206, 7580081, 3763465, 10081899, 1845225, 4699231, 10679436, 5468567, +3140695, -6146098, 9259413, -2823404, 16828756, -795106, 2243047, -3066070, -13536663, 3409130, +10298258, 6261526, -710280, -6648610, 16617228, 25274272, -2991445, -4067334, 12852690, 2525441, +4496831, 2785823, -18169322, 1510755, -11624329, 9048959, 14042932, -4152697, -6257231, 1658931, +9009231, -5794985, 10802916, -4719632, 20530480, -6536404, 4227322, -1638530, 5793374, 13726179, +-5131412, 730144, -974421, 3453691, -5048734, -3309809, 8475581, 16900160, 1751810, 12143483, +-4515621, 971200, -2166274, 3468723, 9709310, 13217225, 11240466, 9527848, 11102490, 5917928, +-1734093, 686658, -1248762, -760209, 2398202, -8133595, -1789391, 10210211, -9732933, 2766496, +-4144644, -3913252, -4940823, -21927418, 2544768, 9660992, 7304666, -4155918, -9490267, -25490094, +-3549254, 7588671, -1709397, 1359357, -7055558, 2308545, -6011344, -18287970, -13481365, 1248762, +8891119, -8530879, -4612795, 468151, -3671123, -27062588, -22246320, 9415642, 9812927, 1149441, +1989644, -10241350, 15853261, 17949206, 12049531, -10051834, 9561671, 11615202, -1215476, -15898895, +-6258841, 20764556, -5624797, 1634235, 1998770, 11455215, -8871255, -17571784, 4434554, 7364795, +-3462818, 4541928, 11819750, -5849209, -3486977, -978179, -23082228, -7384123, 9002788, -5005785, +-15133854, 2415382, 404801, -5488968, 4016331, -1979980, -14249091, -13291850, -21736830, -18466748, +4425427, 7439957, 1685238, -5882495, -6574521, -324807, -4149475, 4299263, -9813463, -180926, +-2741263, -3719979, -2512019, -1604170, 5493263, -5618891, -20367272, 2506650, -1658394, 4501126, +7593502, -602369, 6045167, 3766686, 8648990, 27763206, 24663850, 19247896, -2103997, 18795850, +6049999, 26235808, 11058467, -644782, 31998044, -6809134, -1819992, -20594368, -5557688, -583579, +-14610942, 8444443, 12672301, -4398047, -424665, -11839077, -20183126, -11999065, -15481746, -4700305, +-9501541, -3178813, -1804960, 8810589, 1921461, -2231236, -8631274, -3187403, -5937256, 2538863, +-280247, -8526584, 3765613, 4990215, 1566053, -6721087, -8864812, 2299418, 6979322, -1564979, +-978716, -15094126, 25438554, 3875134, -5764920, -1251446, 1485522, 10648298, 8624831, -10422812, +4605816, -4444755, 186294, -2273648, -3553012, -15590194, -14487462, -18558016, 1512365, -1401233, +-5055177, 10594074, -4919885, 31108448, -4535486, -2335389, -9276056, -4049617, -18336290, -22716082, +-14801531, 19356344, 12747463, -10896332, -14115947, 20687784, 10266046, -10715407, -17963700, -1269700, +1486059, 3309272, 1020592, -8208756, 8819178, -5729487, 18541910, -1574642, -15255724, 4776541, +3794604, 1424855, 246961, -4581657, -10335302, 1084479, 6824166, -3335042, 4911832, -8122320, +-27292370, -19488950, 12182675, -14784888, 12007655, 5573794, 354335, -3758097, 6581501, 4270808, +-3231963, -1959042, 2477659, 9800578, -8311299, 23966454, -6703370, 9371082, -7778186, 3940633, +-2982855, -6598144, 20199232, -14560476, 22082574, 1334661, -12602508, -15274514, 7889318, 5463199, +1855426, 3441343, 8388608, 8824010, 7530689, -15417859, -6438156, 3215320, -666794, 7395934, +-14481556, -3721052, -5132486, 296890, -17075716, -2323041, 4007205, 40796284, 14227616, -9645960, +21664352, 19297824, -9731859, -13438953, 32347546, -3282429, 7492571, -19319836, 46877420, 1207960, +-12498355, 6330782, 2815351, 22131430, 889058, 28063316, -19942070, 66572, -21826486, 1361505, +16208670, 382789, -13171591, 19057306, 10879152, 5392332, 5185636, -7080254, -6017786, 1480153, +-9163313, 12430709, -10798622, -15338939, 13850733, 4827543, -16984448, 9312563, 1676648, -12897787, +-6615860, -4391604, 7217156, -1605244, -7148973, 9288941, -10800232, -4505958, -3367791, 15687368, +-9767293, 7660611, 12523051, 5732171, -6617471, -14374182, 9750650, -12156368, 17370996, -20835424, +28533078, -7705172, -3562139, -3200825, 13120051, 100932, 4860293, 8973797, 4626754, 12597676, +-11027865, -17936858, -723165, -1926293, -24815784, -2918967, 22411676, -6456410, -14223858, 6367826, +-6765647, -1082332, 10062572, -24375550, -14567992, 9599252, 12430172, 17316234, -1402307, -3125663, +6735583, -1540283, -24428164, -16474958, 28286654, -2049773, -25185152, -14383845, -10276783, -8149701, +2078764, 8489540, 202400, -4065187, -12723841, -18956912, 2287607, 2634426, -960999, 15680926, +-10945724, -29802242, 11797738, 8886824, -35264904, 20940650, -6016713, -17547626, -14921790, -1229971, +19455128, 4832912, -7029251, -7121056, 5196911, 10520522, -15220290, 11329587, 1258962, 8362838, +-6968585, -15229954, 12917651, 108985, 14506252, -47195248, 5225902, 7364795, -7853885, 13204877, +14295262, 45007500, 197032, -29568702, -14898168, -7611756, -30237644, -28066000, -197569, -15211700, +-1046361, -181462, -19841138, 2504503, 13489419, 10541460, -17524540, 31769336, 23471996, -11259794, +14349486, -27193048, -5078262, -9667435, 42415488, 25836912, -9130564, -16735877, -18646600, -5180268, +1902671, 6776385, 28739774, 5055714, 5565204, 5141076, 1603097, -10129143, 1969243, -2678986, +13733695, 16418586, 22905060, 13362180, 10242960, -3161096, -3143379, 2482491, 20918638, 2116345, +4526896, -21370684, -9300752, 33176474, 14969572, 9170292, 1353452, 19365470, 12117176, 42063300, +-1221918, 43359844, 4434554, -15153718, 15779710, -13421773, -7592429, -3012920, -6719477, -1018981, +9914932, 16248398, 4872104, -5509906, -17618492, 4469987, 3750043, 10900090, -12947716, 1890323, +-4058207, -154082, -16345035, 7062000, -13345000, -5508296, -18343268, -36530844, 5495948, -10959146, +-16591459, 5065377, -19014894, -19327, 23218056, 7293928, 19837918, -22779970, -10373420, 11310260, +2496987, 32847910, -16399796, 19731616, -7148436, -9696962, -24096914, -9234180, -12795244, 16618839, +4160213, -21415244, 27580132, -13727789, -12694313, 3015067, 11029476, -7545184, 19279034, -8685498, +-12596065, -6260989, 6768332, -1782948, -3045132, 2593624, 19343996, -12123082, 34955664, -12699681, +202937, 32494112, -5709622, 6317897, -42684996, 2687039, 8509404, -8993125, 19932944, -33971580, +-41771780, 17066590, -6696391, 24507084, -16683800, -15604690, 2842195, -4402342, 37202468, -3284039, +-620623, 9262634, -32549410, 3190624, -32845226, -12245489, 3175055, 9624485, -41142564, -17264694, +-3805341, -105227, 15307263, -15712064, 23671712, -5352603, -24773908, 19900730, -17306570, -6937446, +18650358, 37733436, -9669582, 30621506, 12971338, 6701760, -13471702, 34048352, 7087770, 14996952, +3031173, -22597970, 9067213, -22709640, -19490562, 11344619, -19437948, -6231998, -3501472, 19374598, +3164854, -8887361, 8172786, 7588134, -3064459, -21780316, -3416647, 13464186, 38367480, 6657200, +-19732690, 370441, -2865817, 6940667, 12386686, 16835734, -7258495, -1598802, 13211856, 743029, +329102, 22741314, 23351200, 24580098, 10067403, 20270098, 3854196, 11238319, -9864466, -4168266, +3601867, -23220740, 2098092, 32947230, -4080219, -10188736, 7711614, -3039226, 9615895, -23622856, +27764280, -20125680, -8141648, -7513509, 755377, 463320, 2441152, -33514704, 36749352, -11370389, +-15515569, -7590818, 62282396, -2867965, 11825656, 320512, -7305203, 2643016, -29999272, -11589432, +-9770514, 12234751, 7318088, 15179488, 863288, -14453639, 15337865, -12127377, 17811230, 14591078, +-15757161, -15149960, 1189706, 23661512, -23994372, 10720238, 10027675, -12318503, 5234492, -723165, +7452842, -23622, -34604552, 20059644, 11047730, -27561342, 33871184, -17235704, -5015448, -10251550, +27247810, -4432943, -24285892, 1065689, -216359, 24154360, 22854594, 2709051, -18597208, 27434104, +-4762582, 5848135, -33806760, 27467390, 10205379, 2865280, -19575388, -13150653, -2484639, 10497974, +-15788837, -26016764, -12101070, 23190140, 13038447, -1613834, 34812320, 3811784, -6109054, -23523536, +30657476, -26776974, -9778567, 34158412, 9426916, 7138236, -12927315, 9147207, 28258738, -24062018, +-415538, -27060442, 25303800, 42703248, 18052822, 24876450, -37304476, -30878130, -26459146, 3798899, +43694848, -6903623, 15557982, 30561914, 13599477, -14639933, -107374, 22763864, -28503014, -21417392, +-20724290, 23855858, 14519137, -27181774, -41645612, 56744572, 32993402, -37625524, 16809428, -2876018, +15330886, 3511136, -12847858, -25474524, 23980950, 1205275, -21169356, -28356984, 6828998, 9082782, +-8570070, 2873870, -3710315, -12805445, -7468948, -5651640, 13165685, -24236500, 28398860, -17626008, +194884, 48589500, -45340360, -8110509, 41072236, 5809480, 8916352, -3346317, -14055280, 16211354, +-5821292, -15286862, 1424855, -38783016, 70520144, -3400540, -80019000, 33764884, 76601280, 50141596, +-97656280, -23369454, 16311749, 12184285, -17753248, -14671071, -19428822, 3991635, 20086488, 45191108, +-18843632, 14192719, -23961086, -65156264, 34958348, -17110076, -35025460, -25373594, -35890356, 16182900, +11996917, -49540300, 30999464, -18093624, -1371705, -1896765, -25078850, 17770964, 18760418, 15362024, +-2011655, 20464982, 10995653, -15001247, 605054, -29330332, -10709501, -26309896, -17898740, -3126199, +38859252, -35262756, -8151848, -9292699, -30962956, 15227270, -34908420, 15057618, 13638132, -25271588, +16372415, -39252244, 8761733, -34600256, 18736258, -14812268, -18986976, -20498268, -28329068, -10200010, +10500658, 19271518, -29212220, 14046154, 6739341, 23781234, 30451854, 15611132, -32037772, -17429514, +-57311508, -18067316, -20234128, 12572980, -67374080, -17264158, -43149924, -9307731, 29434484, 27074400, +13265543, -222265, 38205880, -12263742, 9589588, 55236500, -31762894, 19235548, 28322624, -14345728, +4567698, 7741679, -1024350, 25615184, 3595961, 17917530, -23663660, -5923297, 24580634, 1426466, +-32910186, 20404316, -11890617, -13670881, -11297375, -5740761, -10989211, 11024644, 20591684, 6788733, +-1234266, -11986717, 18081812, -7477001, -23779624, 18857054, -41521596, -13137768, -7065758, -11719355, +26624502, 24978456, 50453516, -16393353, 22566832, -2860448, 11082626, 29849486, -685047, 1404991, +-19694572, -68973416, 34690452, 4498978, -30932354, -23996520, 4606353, 15784005, -1861332, -20628192, +10950019, -20991116, 26562226, 12912282, -10389526, -24552180, 46982112, 4132832, 2755759, -4945655, +6387690, 2968359, 1528472, -15401216, -34102576, 10099616, -6833293, -9446244, -33934000, -963683, +-4100083, 3590593, 63458680, 32945620, 63858648, -58932320, 4749697, 31221728, -12338367, 35510252, +67403608, 37586868, 1785096, -17870286, -19209242, 3908957, 29000692, 31854698, 6772627, 319438, +-47154984, -9241696, 45759656, 15665356, -13242458, 25884158, -22051972, -29916594, -8704288, -1615982, +35292820, 46996068, 41474888, 16269873, -16603807, -24528022, -46652472, -45594836, 39692476, 17223892, +2898029, 62310848, 3359738, -18532248, -25722560, -25313464, 12116640, 26862872, 20636244, 41018012, +2464238, 29630442, -2346126, -4836133, 14352707, 27456116, 19320910, 17589502, -15918759, -5456219, +-12691628, -27064736, -22546430, -39639864, -14006425, 11023570, -7266548, 29330868, 34155728, -426276, +-645319, -14345728, -26794154, 4911295, 32120986, -3092913, -33655364, -66329864, 26410290, 107707576, +110029008, 92739616, 67689760, -41527500, -46842524, -51114404, -67476624, -104013904, -83249888, -72686416, +34508988, 78488376, 58959700, 126156072, 98103496, 51077900, -17822504, -33501818, -83646632, -65566972, +-64366528, -12811887, -38958036, -31912680, 10910291, 18424336, 36941552, 36579700, 50474456, 49579492, +64301568, 37616936, 17699560, -8065949, -8913131, -26461294, -40011916, -49213344, -59800976, -39023000, +-73751568, -48973364, -35681516, 39662948, 74382928, 79483736, 56294672, 38640212, 60119340, 46114528, +58054000, 45729052, 18486076, -17628156, -92651568, -64991444, -65392488, -104228656, -63103808, -54507428, +-51727512, 25232932, 62867584, 96071976, 81349368, 113052664, 103615552, 101507792, 76465984, -26111254, +-20229296, -60276644, -79548160, -68961072, -11515344, -6640020, 0, 0, 0, 0, +0, 0, 0, }, }, { { -6346351, --4986994, 1199907, -2861522, 4595615, -4682051, 1912871, -8588324, -650688, -3399467, -5342403, --4507032, -2642479, -223338, -1012002, 5650567, -1739462, 1135482, -736050, -292595, -4706748, -5520107, 1690070, 1017370, 1465121, -1102733, -1225139, 1391033, 5286568, 2262374, -1039919, --404264, -153545, -1214939, 110595, -889058, -490163, 70867, 2984466, 355945, -2333241, -1708860, -2499671, 7295539, -4435091, 544924, -76236, -5440650, -831613, 2388539, -3060701, --1372242, -998043, 3630858, -1977296, -1393180, -223338, 417686, 781147, -537945, -1773822, --4234838, 797253, -2205466, -3162707, 755914, 1193464, -232465, 857383, 2074469, 2114735, --301721, 788127, 358093, 2738579, -3060164, -3017752, 3038689, 3194919, 6111739, -8471286, -1552094, 6108517, 10254771, -830002, 5626944, 61203, 5075041, 1619740, 7965554, 141197, --3046206, 5906654, 7613904, 7854959, 4099546, 1524177, -3433826, -2118493, 384400, 4155918, --2324114, 2094333, 104153, 4682051, -2493229, 181462, 713501, -4922033, -3421478, -1233193, --5844914, 1610613, -1933809, 258772, -1140851, -4236985, 3132642, 5722507, -1529545, 743029, -83215, -555661, 5325760, -6663105, -450435, 3199214, 336081, 1237488, -2121177, -5456756, --1932198, 2571075, 2190433, 3283503, -1003412, 439160, -454730, 1517197, -1491964, 6407555, --362925, -157840, -4524748, 932008, -3438121, -1762010, 1730335, 3077344, 5479305, 784368, -5145371, 6923488, 11277510, 1492501, 5629092, -2043331, 3358128, 4340065, -1302449, -3484292, -5940477, 10184441, -1954210, 1139777, 3984656, -4859219, 3084860, 4365835, -8844411, 2528662, -928250, -1970853, 64425, -9229885, 445066, 2639258, -4334159, 864899, 231928, 5992553, -4321274, -2165737, -548682, -493384, -6219650, -4163971, 788663, 2635499, 670552, 2927557, --4064113, 734439, 2192044, 545461, -3743601, -2699387, -733903, 1481227, 3250217, 3380139, -2288681, 3935264, 3832722, -3961571, -1117228, 365609, 5404680, -581431, 3932043, -2236067, --2383170, -528281, -4522601, -1881733, 1171989, 3079492, -3800509, 4308926, -869731, -753230, --515396, -1105417, -1727114, 1396938, 3426847, 1868848, 5583995, -5913096, -1457605, -1082332, --3233574, 1156420, 6731288, 9020505, 5553930, -2530810, 4161287, -2629594, -1427540, -8106751, --6085969, 2630131, 6238440, 5694590, 6355478, 1155883, 526670, 3595961, -4895189, 4896263, -4338991, 157840, 3753802, 8920110, 6414534, 1513976, -6382322, -41876, 2400887, 1182727, -1276142, -7441568, 1916092, 1082869, 5012227, 5073967, -1480153, 3166465, -2398202, -3131031, -4067871, 1938104, -6699612, -6789807, -2661806, -3936875, -2530810, -3188476, -7763691, -7490423, --448824, 2312303, 161598, -1057636, -5153961, 410169, 6589017, -2101850, -1785096, 2076080, -224949, 4274030, 2567317, 2010045, -2702071, -4023848, 7135552, 2765959, -2407329, 4139275, --216896, 3162170, -2510409, 301185, -12742094, -7514046, -2340757, 2410551, -5245229, 1597728, --1426466, 3665218, -877247, -7142531, -5662915, 4935991, 4059818, 10213432, 9040906, -1372779, -6548752, -9822590, -1573569, 7633768, 2327872, 1770600, -976568, -3208341, -1462973, 1056562, --839129, -297427, 3904662, -4814659, 1119376, 1751273, -66035, 3041374, -3255048, -2711198, -1809792, -2108292, 2784750, -5379984, 966368, -3230889, -1190780, -3598646, -2605435, -4087735, --5967320, 3722663, 70330, 6344741, -5807870, -5072357, 94489, 1220308, -544387, -1211718, -590558, 3828963, 2022930, 834297, -2388002, -2501282, -1174137, -4715874, 1047435, -1198833, -901943, -183610, -4682588, -370441, 110059, -5311264, 813896, -869194, 1563368, -607201, --4278861, 4320737, -6703907, 2657511, -7512972, -1450088, 515933, -5773510, 5456219, 3932043, --11234024, -1279363, 2041183, -1183264, -4846871, -6803765, 1498407, -3497177, -5426691, -2882460, -3406446, 2765959, 8178155, 10331007, -798327, 9210557, -5636071, 3520263, 4193499, -1004486, -4130685, -2483028, 195958, -794032, -1822677, -1190780, -2054068, 7613367, -330176, -6020471, --1282585, 3703873, 2539936, 2914672, 733903, -2938831, 5817533, 11400991, 839129, 943282, -798327, -1099512, 1961726, -1020055, 6768332, -5323075, 6484864, 4157528, -3899830, 1821066, -4284230, 2584497, -4683125, -5486821, -10188736, -1932198, -796180, 1089848, 4205310, -1173063, -2831457, -1034550, -2500208, -2812130, 5632850, -1108638, 5978595, -7617125, -142808, 3257196, -1059246, 386547, 3758097, 11959336, 13535589, -3384971, -635655, 3111704, -2422362, 9146133, -8402030, -5336497, 8215199, 6897181, 2222646, 4053912, 3105261, 1918240, -1157494, 743566, -731218, -4625143, -6226092, 1611687, -2073932, 7516, 530965, -5050882, 4676146, 10419591, --828929, -6180458, 9613747, 1258425, -230854, 3991635, -2341831, -3041911, 893353, -3827890, -919660, 10322417, 3811247, -119185, 3054259, 5569499, 13939853, -2460480, 5609228, -1340030, --7073275, 4075387, -370441, -2225330, 2095407, 8831527, 1489280, 1453310, -974958, 3436511, -12052752, 5636608, 697395, 1140314, 2442226, -3908957, 5606543, -1889786, -13864691, 1380295, --2497524, 7552700, 7891466, 3840775, 204548, -15011984, -2362232, -6016176, -8428336, -1457605, --6180458, 885300, 4201552, -6714108, 7006166, -15603079, 1715303, -4175245, -9235790, -10975252, -11529303, 6683506, 197032, -9647570, -7306276, 4481262, -13933411, -8696235, 2597382, 3482145, -12996034, -1114007, 562641, 10700911, -6543383, 10524280, 2826089, 4269735, -2483565, -5294084, --1252520, 8875013, -4989142, 1351841, 9774809, -3117610, -3594888, -4346507, -6682969, -4654671, --4524748, -7694434, -1568737, 3146601, -3406983, 2470143, -3285113, -3639448, 5245766, -6825240, -3962107, -5718749, -8551817, 984621, 5978058, 1010391, -2581275, 3169686, -5952825, -2139968, --8122320, -12776454, -6994354, 2384244, -4812511, 15657303, 5155035, -10125922, -6393059, -947577, -17137456, 10777147, 11797738, -3620658, -16230681, -1559610, -8211441, 1859184, 3858491, 8593693, --3947075, 3623342, -6558415, 894427, -5762773, -15551003, -8050380, 5588290, -5386963, -12379169, --11203959, -10856604, -16357383, 1794223, -5610301, -12857521, -11151346, 1723893, 16107201, -2394981, --2483565, -5592048, -9487583, 1727651, -3675955, 791348, -11885785, 503048, -12391518, 1486059, --864362, 6478958, 5378910, 5348845, 3033858, -740882, 4804458, -3345780, 9307731, 2314451, -4774393, 2520609, -2872260, 3002719, 9359271, -1468342, 5274220, -1573032, 14635101, 1611150, -5557688, 450435, -8055211, -6493991, 370978, -3150359, 1956358, -2377265, 4888747, 4009889, -5674726, -2889976, 3294240, -11549704, 6123550, 15605764, -8165270, -23688356, -3905736, -8258149, --12440910, 6733435, -23758686, -3056943, -8417062, -4569845, 6928856, -7525320, 10133438, 8739185, -1462436, 7897908, 784368, 4220342, -6100464, -10851772, -11938935, -6637335, -10919954, 8728447, -11420318, -354872, -5793911, 3400004, 3416647, -3998615, 1007170, -18649822, -9761387, 8936216, --4591857, 453119, 8810052, -601295, 5551782, 4777078, -2193655, 5450851, 213138, -9764071, -11463805, -7563438, 854162, 927713, -5823976, 4440460, 7023882, -3564823, 8001524, 1249299, --170188, -6527814, 9054328, 418759, -6466074, -1794223, -13407277, -5287105, -7367480, -378494, -10255845, 3478387, -169651, 970663, -8182450, 2979097, 7932268, -7960722, 1722282, 15421080, --4177393, 3532611, 4045859, 41747620, 9862856, -5964099, -7975755, -1242856, -2172180, 7069516, --1146219, 5925981, 12502650, -5209796, 1155346, -8288750, -4852240, 2189360, -719407, 5807870, --11224360, -7260642, 6206228, 11541651, 8468065, -666794, 3469260, -3189013, -6442451, 4881767, -9968619, 9466645, 12451110, -9947681, -1554241, -5788542, -11275900, -1721208, 1422171, -2819109, -6360847, 7147363, 835371, 3469260, -1278290, -12914430, -6049462, -17208324, -16419123, -5131949, -6813966, -2572686, -6656663, 14561550, 6594386, -557272, -12512850, -547608, -3001109, -9642202, -1400159, -4290136, -4964982, -13280039, -270046, -4672925, -13280576, 420370, 13121662, -7086159, --1671816, 4946729, -4152160, 3577171, -3650185, 10805601, 519691, -6247030, -8180302, 9937481, --33889976, -18615998, 17251274, -4185446, 654983, -8776229, 7235410, -2774012, -13408351, 6582038, -17394080, 2669859, -16210817, 4780836, -3960497, -3241627, 9755481, 11028402, -2015950, -1859721, -21973052, 5344013, -3842385, -13575855, 5527623, -19610820, -16990354, -14824080, 5480379, -2610266, --2269890, 13187697, 4502737, -12954695, -11683922, 3058017, 12105365, 4560182, -2173254, 886911, -7807714, -6026376, -14648523, 18267032, -6092948, 1986959, 6547678, 1215476, 1717450, 18723374, --492311, 11929809, -300111, -12481712, 950798, 2673617, -3475702, 2365990, 7581154, -6360847, --2860985, 2116345, -25693032, 6488622, 4038343, -217433, 4867272, 4554276, -10295573, 4312684, -32744830, 14649597, 7086159, 2774549, 6881075, -24525874, -22889492, 16239271, 16368657, 5945846, -8828305, -5699959, 26435524, -2621541, 9817221, 7567733, -12828530, -4520453, -6136972, 16203301, --9692131, -2298881, 9454297, 8884677, -9505836, -1857037, -26759794, 5570573, -3273302, -7103339, -1954747, 1376000, 1634235, 3102040, 8639327, 1053878, 9508521, 1867774, 4507568, -1812476, --8752070, -8338142, 16831976, -5330055, -12560095, -9636833, -4899484, -4942971, 7239168, 5387500, -5563057, 8358007, 2151242, -8516920, 5275831, -14394583, -5041755, -12448426, 9149354, -15183246, --11522324, -2490007, -5355824, 5755256, 10924249, -7612293, 10370735, 17834314, 8565775, 17260400, --6508486, 22857280, 2354179, 19599546, 10904385, 3557844, -9250823, -23316840, -15980500, -11979201, --6832756, -5530308, 12598750, 6252399, -6980933, 20912732, 2502892, -20610474, 25748866, 1627793, --10776073, 8959302, -20900922, -4101694, -13253195, -4248260, -2226404, -4167192, -9427453, 2636036, --18028126, -7067906, -6402723, -24557012, 3133716, -17804786, -12491376, -19961398, 4159676, -15049029, --4392141, -4965519, 316217, 7630547, -5970005, 10741713, 701690, 14252849, -3157338, 12424267, -15684147, -18545668, -143345, 5134097, 11539503, 598611, 13841069, 4772783, 13340168, -73014, --10007274, -6120866, -885300, 8828842, -1899449, -3634079, -806917, 16199006, 10040560, -3380139, --13062606, 4820564, 7153268, 5604396, 13996225, -18262200, -14034879, -3332895, 1170379, -4561256, --66572, -4552666, -12061342, 34022584, -16681116, -17788144, 13706851, 9434969, 3146601, -4910222, --5065914, 16158204, 12816182, 19209242, -5989332, -5346698, -26461830, 30945240, 14993731, -42274288, --21770116, 12966506, 19252190, 18304614, -11378979, -10181220, 23333484, 4969814, 5892159, 15315317, -13412109, -23515482, 7820599, 9366787, -975494, 10542534, 2878702, -3337727, 3066607, -7890392, -39443368, 9754944, 5888937, -1412507, -3886409, -2943663, -20981452, 3853660, 7390565, -5502390, --6191196, -35802848, -15911243, 7071664, 7252053, -11992622, -10266582, -1971390, -15715285, 6605123, -7486128, -2851322, 8330626, 13562433, 2049236, -1175747, -3054796, -7959648, -932008, 714038, --24522116, -4090420, 7869454, 15227807, -26409218, 5443871, 12195023, -3256122, -11020886, -13343390, -23995446, 19304268, 136902, -15931644, -19663970, 12828530, -9541270, 3790309, -8006356, -6330245, -807454, 8846022, 16480326, -30587146, -40808632, -27692338, -36535676, 31869194, -21294448, 13101798, --3862249, -24973624, 4241817, -6437619, -9747965, -32542968, -30532386, -22106196, -8897025, 1666447, --17767742, -4573604, 4366371, 14721000, 881542, -8335458, -199179, -8942659, 13419088, -16639240, -23507966, 20966956, -5089536, -5970542, -28315646, -15865609, -17281338, 2603287, 3619047, -4034585, -22836878, 7104413, 18497350, 4233227, -2318746, -7889855, 16655346, 12146704, 5167920, -16261283, -8938364, -27890444, -3241627, -2434710, -18948322, -2512556, 205622, 22385906, 14417131, 1049583, -10082973, 267899, -21427054, 11658689, 3113851, 18727668, -9996536, -19640348, 12607340, -35637492, --39814348, -4414690, -25113210, 939524, -18324478, 16623671, -12901008, -2084670, 4049617, 5801964, -21471078, 6337761, -8768713, 21838834, 7662759, -38911328, 6980396, -23605140, -954557, 3728569, --2524367, 18247168, -4915590, 2791729, 5469641, 1023813, -11582990, 18534394, -10408853, -1692217, --21732534, -653909, 4499515, -4180614, -7192997, -10919954, -11019812, 28440200, 1861868, 14427332, --25189446, 2301566, 370978, 8272107, 16144245, -18410914, 32309966, 44924820, -1393717, 3800509, --15214922, 6704444, 11266773, -9362492, 2927557, 8022999, 18311594, -1103270, 1662152, -5974300, --14777909, -23541790, 12319040, -17710298, -6813966, -11655467, 5446019, 15354508, 14279156, -2779381, -5428302, -31059592, 20688858, -3029563, 4194573, -7036767, 19591494, 50554448, 14779519, 36686000, -12051678, -38812544, 15731391, 10415296, -12582107, 2310156, 25128244, 782758, 24056112, 20766704, --24504936, 13277355, -24520506, -17074642, -2123861, 49393736, 15515032, -22840100, 21424370, 13268765, --27179090, -12490302, -1665374, 27437324, 4319127, -25908316, -14131516, -1235877, -6779606, 15010911, -22504554, -8531953, 19815368, -13117367, -16911434, -1081795, 40611064, 3255048, -23018878, 12684112, --901406, -2843268, 11501922, -26892938, -22577032, -22180822, 16026670, -14736570, 5295158, 6146635, -24349780, 11345693, 25025700, 2024003, -892816, 19624242, 37372120, 21461952, -36617816, 115427, -3739306, -6874632, 7244536, 9586367, -28293634, -4849018, 5696737, 4473209, -33868500, -32265404, --18213346, -19040126, 32853278, -19777788, 14944876, -39052528, 28445032, 30814780, 9168145, 33614024, --34308200, -17420388, -8866423, -50425064, 28802050, 2492692, 18078054, 22656490, 23097260, 1443109, --41876, 22565222, -2923262, -27362700, -27434640, 16818018, -31062814, 30843234, -8133595, 6630356, -31561030, 27586574, -13120588, 42113228, -23613194, 2640868, -24551644, 4051765, -7755101, 16595754, -6638946, -18061948, 17235704, 24667608, 37262064, -20843476, 8871255, 22332220, -29332480, 1574106, --11016591, -43916576, -17671106, 12058658, -22846542, 8975408, -18869938, -75162, 31297964, -13602698, -14280229, 34846144, 26277146, 9885404, 47508244, -70057896, -11203422, 24725052, -338229, 15074798, --19274202, -36748812, 49643380, 1339493, -19822348, 12712566, 33946348, 76958296, 33686504, -13520557, -7113540, 4147328, 35897336, -31341986, -4522601, -14147622, -21046414, 31604516, -13215077, 41010496, --5447093, -28774670, 45725296, 69963408, -11294690, -20164334, -34556232, 9521942, 34743600, 8835821, --9213242, -20924544, 3804267, 7091528, -6600291, 7369090, -4831302, -9327058, -12972949, 12294881, -13283797, 721555, 18510236, -17535278, 39679592, 33109902, 16259136, 493384, 724239, 7942469, --23650774, -17043504, -23013508, -8974334, -7648800, 15501611, 9761387, 24777666, -12763032, -247497, --11581379, 28068148, 47805672, -9107478, -34161096, -17838610, -3478924, -40431212, 31491774, -55781960, -14661408, 28398860, 23214298, -21980568, 3428995, 30120068, -62393528, -23604066, 9411884, -969589, --32905356, -19937238, -6537477, -5373004, 41301480, -24927454, 6980933, 40164388, 549219, -12699681, -32326608, 24263344, -7496329, -20528870, -32758252, 6790880, 62460100, 14533096, 31698470, -2179696, -2156074, -1890323, -8097087, 665183, 2215130, 15957951, 4363150, -11589969, 9810242, -10055055, --12512313, -12672838, -380641, 13356275, 2024540, 10825465, 10132365, 9488120, -9623948, -14944876, -4206921, -10122164, -27915140, -7293928, 5367099, -8705899, 30901752, -31945430, 25810606, -7643431, --652298, 40248676, -7060390, -217433, 50580220, -7009387, -21891448, 4725538, -18928458, -3083787, --17966922, 58399744, -17281874, 14959908, -14893873, -4962298, -9037685, 10852309, -15681999, -33686504, -14183056, -2382633, -40432824, 22306986, -11774653, 23970212, 47292960, -21715354, -2315524, 1363652, --8814347, -18965502, -13968307, -5369, 65717832, 33326262, 68917048, -38683160, -10108742, 22677964, --21693880, 16357920, 70796096, 16674137, 10072772, -18898930, -17866528, 20124606, -11006927, 28507308, --5010616, -6837051, -8667244, -41091024, 9462350, 48704392, -26302916, 29279328, 25439092, -17023640, --5471252, 19945828, -33099166, 15754477, -2856153, 24028194, 7736310, -20993264, -7201050, -41672456, --21712670, 18516140, 13744432, 31102006, 48962092, 4475356, -34360, -43967044, -27194122, -26688390, --22117470, 10230075, -18571438, -6156299, -5104032, 11679627, -34038688, -6628745, 15811922, 7369090, -25810070, -5175973, -14405320, 25300578, -6418292, 14702747, -22441204, -14558329, -5037997, -9174050, -11218991, 17125646, 25494388, 4976257, -273804, -22541062, -8339753, -14068165, 19857782, -19222664, --66339528, 652835, 109888352, 96932040, 93436480, 38037840, -37827924, -55237576, -52443700, -49043156, --86917792, -63958504, -60028072, 46699180, 74549896, 58791124, 96621728, 78341280, 18374406, -4389994, --32380296, -66948876, -37866580, -70261904, -36079872, -23874650, 2181307, -9813463, 19338090, 29451664, -52729852, 31583578, 55368572, 40319544, 44469016, 3055869, -32788318, -16072304, 3425237, -38233260, --48099876, -65521872, -62034896, -45586248, -3949223, 32195612, 15228880, 46865072, 35624068, 53540524, -50093276, 52087216, 62687732, 32930052, -1418413, -8622684, -35610648, -30640296, -101640400, -82641080, --63600412, -50838992, 10344429, -20689932, 6112812, 74770552, 93920200, 125083944, 82671680, 50870668, -38315404, 13654238, -38030324, -33484102, -53408456, -67266168, -40710920, -8149701, 1158567, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-4986994, 1199907, -2861522, 4595615, -4682051, 1912871, -8588324, -650688, -3399467, -5342403, +-4507032, -2642479, -223338, -1012002, 5650567, -1739462, 1135482, -736050, -292595, -4706748, +5520107, 1690070, 1017370, 1465121, -1102733, -1225139, 1391033, 5286568, 2262374, -1039919, +-404264, -153545, -1214939, 110595, -889058, -490163, 70867, 2984466, 355945, -2333241, +1708860, -2499671, 7295539, -4435091, 544924, -76236, -5440650, -831613, 2388539, -3060701, +-1372242, -998043, 3630858, -1977296, -1393180, -223338, 417686, 781147, -537945, -1773822, +-4234838, 797253, -2205466, -3162707, 755914, 1193464, -232465, 857383, 2074469, 2114735, +-301721, 788127, 358093, 2738579, -3060164, -3017752, 3038689, 3194919, 6111739, -8471286, +1552094, 6108517, 10254771, -830002, 5626944, 61203, 5075041, 1619740, 7965554, 141197, +-3046206, 5906654, 7613904, 7854959, 4099546, 1524177, -3433826, -2118493, 384400, 4155918, +-2324114, 2094333, 104153, 4682051, -2493229, 181462, 713501, -4922033, -3421478, -1233193, +-5844914, 1610613, -1933809, 258772, -1140851, -4236985, 3132642, 5722507, -1529545, 743029, +83215, -555661, 5325760, -6663105, -450435, 3199214, 336081, 1237488, -2121177, -5456756, +-1932198, 2571075, 2190433, 3283503, -1003412, 439160, -454730, 1517197, -1491964, 6407555, +-362925, -157840, -4524748, 932008, -3438121, -1762010, 1730335, 3077344, 5479305, 784368, +5145371, 6923488, 11277510, 1492501, 5629092, -2043331, 3358128, 4340065, -1302449, -3484292, +5940477, 10184441, -1954210, 1139777, 3984656, -4859219, 3084860, 4365835, -8844411, 2528662, +928250, -1970853, 64425, -9229885, 445066, 2639258, -4334159, 864899, 231928, 5992553, +4321274, -2165737, -548682, -493384, -6219650, -4163971, 788663, 2635499, 670552, 2927557, +-4064113, 734439, 2192044, 545461, -3743601, -2699387, -733903, 1481227, 3250217, 3380139, +2288681, 3935264, 3832722, -3961571, -1117228, 365609, 5404680, -581431, 3932043, -2236067, +-2383170, -528281, -4522601, -1881733, 1171989, 3079492, -3800509, 4308926, -869731, -753230, +-515396, -1105417, -1727114, 1396938, 3426847, 1868848, 5583995, -5913096, -1457605, -1082332, +-3233574, 1156420, 6731288, 9020505, 5553930, -2530810, 4161287, -2629594, -1427540, -8106751, +-6085969, 2630131, 6238440, 5694590, 6355478, 1155883, 526670, 3595961, -4895189, 4896263, +4338991, 157840, 3753802, 8920110, 6414534, 1513976, -6382322, -41876, 2400887, 1182727, +1276142, -7441568, 1916092, 1082869, 5012227, 5073967, -1480153, 3166465, -2398202, -3131031, +4067871, 1938104, -6699612, -6789807, -2661806, -3936875, -2530810, -3188476, -7763691, -7490423, +-448824, 2312303, 161598, -1057636, -5153961, 410169, 6589017, -2101850, -1785096, 2076080, +224949, 4274030, 2567317, 2010045, -2702071, -4023848, 7135552, 2765959, -2407329, 4139275, +-216896, 3162170, -2510409, 301185, -12742094, -7514046, -2340757, 2410551, -5245229, 1597728, +-1426466, 3665218, -877247, -7142531, -5662915, 4935991, 4059818, 10213432, 9040906, -1372779, +6548752, -9822590, -1573569, 7633768, 2327872, 1770600, -976568, -3208341, -1462973, 1056562, +-839129, -297427, 3904662, -4814659, 1119376, 1751273, -66035, 3041374, -3255048, -2711198, +1809792, -2108292, 2784750, -5379984, 966368, -3230889, -1190780, -3598646, -2605435, -4087735, +-5967320, 3722663, 70330, 6344741, -5807870, -5072357, 94489, 1220308, -544387, -1211718, +590558, 3828963, 2022930, 834297, -2388002, -2501282, -1174137, -4715874, 1047435, -1198833, +901943, -183610, -4682588, -370441, 110059, -5311264, 813896, -869194, 1563368, -607201, +-4278861, 4320737, -6703907, 2657511, -7512972, -1450088, 515933, -5773510, 5456219, 3932043, +-11234024, -1279363, 2041183, -1183264, -4846871, -6803765, 1498407, -3497177, -5426691, -2882460, +3406446, 2765959, 8178155, 10331007, -798327, 9210557, -5636071, 3520263, 4193499, -1004486, +4130685, -2483028, 195958, -794032, -1822677, -1190780, -2054068, 7613367, -330176, -6020471, +-1282585, 3703873, 2539936, 2914672, 733903, -2938831, 5817533, 11400991, 839129, 943282, +798327, -1099512, 1961726, -1020055, 6768332, -5323075, 6484864, 4157528, -3899830, 1821066, +4284230, 2584497, -4683125, -5486821, -10188736, -1932198, -796180, 1089848, 4205310, -1173063, +2831457, -1034550, -2500208, -2812130, 5632850, -1108638, 5978595, -7617125, -142808, 3257196, +1059246, 386547, 3758097, 11959336, 13535589, -3384971, -635655, 3111704, -2422362, 9146133, +8402030, -5336497, 8215199, 6897181, 2222646, 4053912, 3105261, 1918240, -1157494, 743566, +731218, -4625143, -6226092, 1611687, -2073932, 7516, 530965, -5050882, 4676146, 10419591, +-828929, -6180458, 9613747, 1258425, -230854, 3991635, -2341831, -3041911, 893353, -3827890, +919660, 10322417, 3811247, -119185, 3054259, 5569499, 13939853, -2460480, 5609228, -1340030, +-7073275, 4075387, -370441, -2225330, 2095407, 8831527, 1489280, 1453310, -974958, 3436511, +12052752, 5636608, 697395, 1140314, 2442226, -3908957, 5606543, -1889786, -13864691, 1380295, +-2497524, 7552700, 7891466, 3840775, 204548, -15011984, -2362232, -6016176, -8428336, -1457605, +-6180458, 885300, 4201552, -6714108, 7006166, -15603079, 1715303, -4175245, -9235790, -10975252, +11529303, 6683506, 197032, -9647570, -7306276, 4481262, -13933411, -8696235, 2597382, 3482145, +12996034, -1114007, 562641, 10700911, -6543383, 10524280, 2826089, 4269735, -2483565, -5294084, +-1252520, 8875013, -4989142, 1351841, 9774809, -3117610, -3594888, -4346507, -6682969, -4654671, +-4524748, -7694434, -1568737, 3146601, -3406983, 2470143, -3285113, -3639448, 5245766, -6825240, +3962107, -5718749, -8551817, 984621, 5978058, 1010391, -2581275, 3169686, -5952825, -2139968, +-8122320, -12776454, -6994354, 2384244, -4812511, 15657303, 5155035, -10125922, -6393059, -947577, +17137456, 10777147, 11797738, -3620658, -16230681, -1559610, -8211441, 1859184, 3858491, 8593693, +-3947075, 3623342, -6558415, 894427, -5762773, -15551003, -8050380, 5588290, -5386963, -12379169, +-11203959, -10856604, -16357383, 1794223, -5610301, -12857521, -11151346, 1723893, 16107201, -2394981, +-2483565, -5592048, -9487583, 1727651, -3675955, 791348, -11885785, 503048, -12391518, 1486059, +-864362, 6478958, 5378910, 5348845, 3033858, -740882, 4804458, -3345780, 9307731, 2314451, +4774393, 2520609, -2872260, 3002719, 9359271, -1468342, 5274220, -1573032, 14635101, 1611150, +5557688, 450435, -8055211, -6493991, 370978, -3150359, 1956358, -2377265, 4888747, 4009889, +5674726, -2889976, 3294240, -11549704, 6123550, 15605764, -8165270, -23688356, -3905736, -8258149, +-12440910, 6733435, -23758686, -3056943, -8417062, -4569845, 6928856, -7525320, 10133438, 8739185, +1462436, 7897908, 784368, 4220342, -6100464, -10851772, -11938935, -6637335, -10919954, 8728447, +11420318, -354872, -5793911, 3400004, 3416647, -3998615, 1007170, -18649822, -9761387, 8936216, +-4591857, 453119, 8810052, -601295, 5551782, 4777078, -2193655, 5450851, 213138, -9764071, +11463805, -7563438, 854162, 927713, -5823976, 4440460, 7023882, -3564823, 8001524, 1249299, +-170188, -6527814, 9054328, 418759, -6466074, -1794223, -13407277, -5287105, -7367480, -378494, +10255845, 3478387, -169651, 970663, -8182450, 2979097, 7932268, -7960722, 1722282, 15421080, +-4177393, 3532611, 4045859, 41747620, 9862856, -5964099, -7975755, -1242856, -2172180, 7069516, +-1146219, 5925981, 12502650, -5209796, 1155346, -8288750, -4852240, 2189360, -719407, 5807870, +-11224360, -7260642, 6206228, 11541651, 8468065, -666794, 3469260, -3189013, -6442451, 4881767, +9968619, 9466645, 12451110, -9947681, -1554241, -5788542, -11275900, -1721208, 1422171, -2819109, +6360847, 7147363, 835371, 3469260, -1278290, -12914430, -6049462, -17208324, -16419123, -5131949, +6813966, -2572686, -6656663, 14561550, 6594386, -557272, -12512850, -547608, -3001109, -9642202, +1400159, -4290136, -4964982, -13280039, -270046, -4672925, -13280576, 420370, 13121662, -7086159, +-1671816, 4946729, -4152160, 3577171, -3650185, 10805601, 519691, -6247030, -8180302, 9937481, +-33889976, -18615998, 17251274, -4185446, 654983, -8776229, 7235410, -2774012, -13408351, 6582038, +17394080, 2669859, -16210817, 4780836, -3960497, -3241627, 9755481, 11028402, -2015950, -1859721, +21973052, 5344013, -3842385, -13575855, 5527623, -19610820, -16990354, -14824080, 5480379, -2610266, +-2269890, 13187697, 4502737, -12954695, -11683922, 3058017, 12105365, 4560182, -2173254, 886911, +7807714, -6026376, -14648523, 18267032, -6092948, 1986959, 6547678, 1215476, 1717450, 18723374, +-492311, 11929809, -300111, -12481712, 950798, 2673617, -3475702, 2365990, 7581154, -6360847, +-2860985, 2116345, -25693032, 6488622, 4038343, -217433, 4867272, 4554276, -10295573, 4312684, +32744830, 14649597, 7086159, 2774549, 6881075, -24525874, -22889492, 16239271, 16368657, 5945846, +8828305, -5699959, 26435524, -2621541, 9817221, 7567733, -12828530, -4520453, -6136972, 16203301, +-9692131, -2298881, 9454297, 8884677, -9505836, -1857037, -26759794, 5570573, -3273302, -7103339, +1954747, 1376000, 1634235, 3102040, 8639327, 1053878, 9508521, 1867774, 4507568, -1812476, +-8752070, -8338142, 16831976, -5330055, -12560095, -9636833, -4899484, -4942971, 7239168, 5387500, +5563057, 8358007, 2151242, -8516920, 5275831, -14394583, -5041755, -12448426, 9149354, -15183246, +-11522324, -2490007, -5355824, 5755256, 10924249, -7612293, 10370735, 17834314, 8565775, 17260400, +-6508486, 22857280, 2354179, 19599546, 10904385, 3557844, -9250823, -23316840, -15980500, -11979201, +-6832756, -5530308, 12598750, 6252399, -6980933, 20912732, 2502892, -20610474, 25748866, 1627793, +-10776073, 8959302, -20900922, -4101694, -13253195, -4248260, -2226404, -4167192, -9427453, 2636036, +-18028126, -7067906, -6402723, -24557012, 3133716, -17804786, -12491376, -19961398, 4159676, -15049029, +-4392141, -4965519, 316217, 7630547, -5970005, 10741713, 701690, 14252849, -3157338, 12424267, +15684147, -18545668, -143345, 5134097, 11539503, 598611, 13841069, 4772783, 13340168, -73014, +-10007274, -6120866, -885300, 8828842, -1899449, -3634079, -806917, 16199006, 10040560, -3380139, +-13062606, 4820564, 7153268, 5604396, 13996225, -18262200, -14034879, -3332895, 1170379, -4561256, +-66572, -4552666, -12061342, 34022584, -16681116, -17788144, 13706851, 9434969, 3146601, -4910222, +-5065914, 16158204, 12816182, 19209242, -5989332, -5346698, -26461830, 30945240, 14993731, -42274288, +-21770116, 12966506, 19252190, 18304614, -11378979, -10181220, 23333484, 4969814, 5892159, 15315317, +13412109, -23515482, 7820599, 9366787, -975494, 10542534, 2878702, -3337727, 3066607, -7890392, +39443368, 9754944, 5888937, -1412507, -3886409, -2943663, -20981452, 3853660, 7390565, -5502390, +-6191196, -35802848, -15911243, 7071664, 7252053, -11992622, -10266582, -1971390, -15715285, 6605123, +7486128, -2851322, 8330626, 13562433, 2049236, -1175747, -3054796, -7959648, -932008, 714038, +-24522116, -4090420, 7869454, 15227807, -26409218, 5443871, 12195023, -3256122, -11020886, -13343390, +23995446, 19304268, 136902, -15931644, -19663970, 12828530, -9541270, 3790309, -8006356, -6330245, +807454, 8846022, 16480326, -30587146, -40808632, -27692338, -36535676, 31869194, -21294448, 13101798, +-3862249, -24973624, 4241817, -6437619, -9747965, -32542968, -30532386, -22106196, -8897025, 1666447, +-17767742, -4573604, 4366371, 14721000, 881542, -8335458, -199179, -8942659, 13419088, -16639240, +23507966, 20966956, -5089536, -5970542, -28315646, -15865609, -17281338, 2603287, 3619047, -4034585, +22836878, 7104413, 18497350, 4233227, -2318746, -7889855, 16655346, 12146704, 5167920, -16261283, +8938364, -27890444, -3241627, -2434710, -18948322, -2512556, 205622, 22385906, 14417131, 1049583, +10082973, 267899, -21427054, 11658689, 3113851, 18727668, -9996536, -19640348, 12607340, -35637492, +-39814348, -4414690, -25113210, 939524, -18324478, 16623671, -12901008, -2084670, 4049617, 5801964, +21471078, 6337761, -8768713, 21838834, 7662759, -38911328, 6980396, -23605140, -954557, 3728569, +-2524367, 18247168, -4915590, 2791729, 5469641, 1023813, -11582990, 18534394, -10408853, -1692217, +-21732534, -653909, 4499515, -4180614, -7192997, -10919954, -11019812, 28440200, 1861868, 14427332, +-25189446, 2301566, 370978, 8272107, 16144245, -18410914, 32309966, 44924820, -1393717, 3800509, +-15214922, 6704444, 11266773, -9362492, 2927557, 8022999, 18311594, -1103270, 1662152, -5974300, +-14777909, -23541790, 12319040, -17710298, -6813966, -11655467, 5446019, 15354508, 14279156, -2779381, +5428302, -31059592, 20688858, -3029563, 4194573, -7036767, 19591494, 50554448, 14779519, 36686000, +12051678, -38812544, 15731391, 10415296, -12582107, 2310156, 25128244, 782758, 24056112, 20766704, +-24504936, 13277355, -24520506, -17074642, -2123861, 49393736, 15515032, -22840100, 21424370, 13268765, +-27179090, -12490302, -1665374, 27437324, 4319127, -25908316, -14131516, -1235877, -6779606, 15010911, +22504554, -8531953, 19815368, -13117367, -16911434, -1081795, 40611064, 3255048, -23018878, 12684112, +-901406, -2843268, 11501922, -26892938, -22577032, -22180822, 16026670, -14736570, 5295158, 6146635, +24349780, 11345693, 25025700, 2024003, -892816, 19624242, 37372120, 21461952, -36617816, 115427, +3739306, -6874632, 7244536, 9586367, -28293634, -4849018, 5696737, 4473209, -33868500, -32265404, +-18213346, -19040126, 32853278, -19777788, 14944876, -39052528, 28445032, 30814780, 9168145, 33614024, +-34308200, -17420388, -8866423, -50425064, 28802050, 2492692, 18078054, 22656490, 23097260, 1443109, +-41876, 22565222, -2923262, -27362700, -27434640, 16818018, -31062814, 30843234, -8133595, 6630356, +31561030, 27586574, -13120588, 42113228, -23613194, 2640868, -24551644, 4051765, -7755101, 16595754, +6638946, -18061948, 17235704, 24667608, 37262064, -20843476, 8871255, 22332220, -29332480, 1574106, +-11016591, -43916576, -17671106, 12058658, -22846542, 8975408, -18869938, -75162, 31297964, -13602698, +14280229, 34846144, 26277146, 9885404, 47508244, -70057896, -11203422, 24725052, -338229, 15074798, +-19274202, -36748812, 49643380, 1339493, -19822348, 12712566, 33946348, 76958296, 33686504, -13520557, +7113540, 4147328, 35897336, -31341986, -4522601, -14147622, -21046414, 31604516, -13215077, 41010496, +-5447093, -28774670, 45725296, 69963408, -11294690, -20164334, -34556232, 9521942, 34743600, 8835821, +-9213242, -20924544, 3804267, 7091528, -6600291, 7369090, -4831302, -9327058, -12972949, 12294881, +13283797, 721555, 18510236, -17535278, 39679592, 33109902, 16259136, 493384, 724239, 7942469, +-23650774, -17043504, -23013508, -8974334, -7648800, 15501611, 9761387, 24777666, -12763032, -247497, +-11581379, 28068148, 47805672, -9107478, -34161096, -17838610, -3478924, -40431212, 31491774, -55781960, +14661408, 28398860, 23214298, -21980568, 3428995, 30120068, -62393528, -23604066, 9411884, -969589, +-32905356, -19937238, -6537477, -5373004, 41301480, -24927454, 6980933, 40164388, 549219, -12699681, +32326608, 24263344, -7496329, -20528870, -32758252, 6790880, 62460100, 14533096, 31698470, -2179696, +2156074, -1890323, -8097087, 665183, 2215130, 15957951, 4363150, -11589969, 9810242, -10055055, +-12512313, -12672838, -380641, 13356275, 2024540, 10825465, 10132365, 9488120, -9623948, -14944876, +4206921, -10122164, -27915140, -7293928, 5367099, -8705899, 30901752, -31945430, 25810606, -7643431, +-652298, 40248676, -7060390, -217433, 50580220, -7009387, -21891448, 4725538, -18928458, -3083787, +-17966922, 58399744, -17281874, 14959908, -14893873, -4962298, -9037685, 10852309, -15681999, -33686504, +14183056, -2382633, -40432824, 22306986, -11774653, 23970212, 47292960, -21715354, -2315524, 1363652, +-8814347, -18965502, -13968307, -5369, 65717832, 33326262, 68917048, -38683160, -10108742, 22677964, +-21693880, 16357920, 70796096, 16674137, 10072772, -18898930, -17866528, 20124606, -11006927, 28507308, +-5010616, -6837051, -8667244, -41091024, 9462350, 48704392, -26302916, 29279328, 25439092, -17023640, +-5471252, 19945828, -33099166, 15754477, -2856153, 24028194, 7736310, -20993264, -7201050, -41672456, +-21712670, 18516140, 13744432, 31102006, 48962092, 4475356, -34360, -43967044, -27194122, -26688390, +-22117470, 10230075, -18571438, -6156299, -5104032, 11679627, -34038688, -6628745, 15811922, 7369090, +25810070, -5175973, -14405320, 25300578, -6418292, 14702747, -22441204, -14558329, -5037997, -9174050, +11218991, 17125646, 25494388, 4976257, -273804, -22541062, -8339753, -14068165, 19857782, -19222664, +-66339528, 652835, 109888352, 96932040, 93436480, 38037840, -37827924, -55237576, -52443700, -49043156, +-86917792, -63958504, -60028072, 46699180, 74549896, 58791124, 96621728, 78341280, 18374406, -4389994, +-32380296, -66948876, -37866580, -70261904, -36079872, -23874650, 2181307, -9813463, 19338090, 29451664, +52729852, 31583578, 55368572, 40319544, 44469016, 3055869, -32788318, -16072304, 3425237, -38233260, +-48099876, -65521872, -62034896, -45586248, -3949223, 32195612, 15228880, 46865072, 35624068, 53540524, +50093276, 52087216, 62687732, 32930052, -1418413, -8622684, -35610648, -30640296, -101640400, -82641080, +-63600412, -50838992, 10344429, -20689932, 6112812, 74770552, 93920200, 125083944, 82671680, 50870668, +38315404, 13654238, -38030324, -33484102, -53408456, -67266168, -40710920, -8149701, 1158567, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, { -5803575, --3656628, -530965, -5476084, 4852240, -4402342, -5283884, 2318746, -1553168, -1198296, 1406065, --6242198, -1283658, 4512937, -3128884, -1114007, -4889284, 1396401, -3642669, -6628745, 2744484, -1201517, 2328409, -2642479, -3220689, 3591130, 1022202, 4066260, 4225174, -4557497, 4128001, --1251446, -1247688, 2871723, -680215, 2598992, 4476430, 4192425, 804770, 1748052, 1620813, --3750043, -1819456, -1436130, 700080, 3224984, -6259378, -1509681, -338766, -448824, -2866354, -462783, 2571612, -3308736, 2246268, -2618856, -6324876, 1282048, 1240172, 780073, -2477659, --766652, -1642825, 2947421, -777389, -151934, 130997, 2049773, 665183, 1256815, 1723356, --4498442, -2363843, 2320356, -540629, -1096290, 1130650, -1292785, 4477504, 4966056, 2718714, --1960653, -7510287, -6949794, 2547989, 3948149, -1427540, 7396471, -1396401, 4405026, -5229660, --4670240, 2071248, 165356, -1323924, 1944547, 4858145, -2109366, 715112, -2763812, -225486, -245350, 2022393, 1826972, 2523830, 403727, 1525250, 5492727, -2065342, -2572686, -2718714, --4977330, 1491964, -1042066, 9170292, 1779190, -622233, 728534, 5592048, -494995, -1136019, --1389959, -3169686, -570694, 4323422, -624918, 1840394, 4330401, -1267015, -270583, -6825777, --4017942, -6212134, -1182190, -1734630, 988916, 446677, 974958, 2359548, -1435056, 1207960, -157303, 691490, 1060320, -2147484, 2291902, -566399, -2481954, -113280, -2469606, -506806, -499827, 5185100, 12045773, 4832912, 2807298, 3416647, -7167227, -782221, 3010772, -910533, -1141924, -6435472, 6318971, 8691940, 1429687, 3910568, -1880659, -5010616, -7903814, -8535711, --5771899, 6855305, -6488622, -4032438, -5502390, 1792612, 4454418, 903017, 544387, 2576444, --325881, 1645509, 5500243, -733903, 4559645, -4363687, 4152160, 2989834, 2611340, -2275259, --7284265, -1484448, 4046396, 2493766, -2095944, -190052, 1343788, -252866, -3563749, -675921, -2859911, -956704, 235686, -1660542, -475131, 273804, 887985, 5153424, 2027761, -2540473, -335007, 494995, -1837172, 1009317, -2631204, -204011, 4008815, 1447941, 4505958, -3185792, --2974802, -1547799, -877784, 2553358, 5090610, -2758443, -3988414, 4845260, 733366, -1968169, -2202781, -466541, 3538516, 1500017, -3993783, -3764002, -4282083, -680215, -3501472, -7350837, --7009387, 7195144, -181999, 1497333, -81604, 4368519, -6529961, 9628243, 8543227, 410706, -420370, -25233, 215285, -996432, 3315715, 2565706, 166430, -5549098, 2332704, -1763084, -2590939, -828929, 5801427, -1433445, -3467649, -1619203, -981937, 2089502, -102542, 3534221, --5884642, 3040837, 941672, -3330210, 9075803, -1564442, -1389959, -311922, -226023, -2542621, --865973, 4744328, 3908957, -8730058, -4139812, 4195110, 1158567, -2233383, 7363185, 73551, -1569811, 7127498, 2929168, 5522254, 1522566, -2494839, -3104188, -6094559, -5698885, 430034, -2879239, 6673843, 204548, -3558917, -9801115, -3401077, -4774930, 4456029, -3265249, 2896956, --3530463, -1446330, 8288750, 4065187, -5523865, 2520072, 7904888, 1165547, -2789581, -5557151, --6693707, -4577899, -6730214, 4459250, 1001264, 2452426, -1301912, -3044058, -3219078, -5922760, -296353, -191663, 1395328, -1453846, -5391258, 74088, 5739150, -1290101, 59056, -2883534, --5737540, -8504035, -734976, 6085432, 2218888, 612570, -2877091, 747861, -4600447, -1546725, --3459059, 396211, 788663, -5290326, 5924908, -3386582, 7539278, 2785286, 731218, -3489661, --1775969, 1857037, -408022, 1744831, 4068408, 726923, 1634235, -4576825, 2676302, -2362232, -6958384, 8446590, 3971234, 5626944, 2718178, -1015223, -5990406, -4006668, 462783, 4374961, -4110284, 3312494, -7938710, 1073742, -8487392, -2684, 1258425, 820339, 3774203, 415538, -566936, 14981920, -1913945, -6570763, -7161321, 7540889, 4989679, -5633924, 1326608, -6287832, --2752537, 241592, 7104413, -8835285, 2536178, -316217, 1362042, -646929, 9024263, -4665945, -2503429, -1391569, -2463701, 1408212, -500364, 2749853, -2847027, -2551748, -7755101, 1231582, --2629594, -1627256, 523986, -2694555, 2174327, -4308926, -2678449, -7601555, -338229, -6747931, --2975339, -8031589, 5852967, 1233729, -2612414, 5275831, -6259915, -17717, -11803107, -616865, -3821984, -313533, 3222836, 7395397, -2852395, -1053878, 8962523, 3882114, 3228205, 5609764, --3339874, -8628052, -1418413, -5240934, 3079492, 8316668, -2464238, 2044404, -1004486, 4144644, -4841502, 1642288, -2815351, 1975148, 1308354, 8994735, -1330366, -2060511, -12218108, -3580929, -9268539, 8885750, 5832029, 4436165, 13162464, 673773, -15654082, -4166118, -2593087, -3952444, -8373576, -1488206, -3033858, 9574556, 1523640, -4199941, -1401770, 3700651, -3473555, -1567663, -1168231, -1457605, -5491653, -2700461, -294205, -5514738, -2464774, -2465848, 3630858, -2741263, -7036230, 6624450, 598074, 6271189, 4523675, -3277597, -1103270, -2583423, -10296110, 791885, -1988570, -10074383, -1520955, -3155727, 3329674, 8419747, 1191853, -9460739, 1146756, -3984119, --6245956, 4329864, -1628330, -7072738, 2685428, 1759326, 6855842, -1392106, -1163936, 4271345, -5888400, 5630702, -7317551, 3376381, 6119255, -15912317, 6524056, -1629403, -3821447, -3184718, -2580739, -1423245, -9695889, -10043781, 1045288, 15884937, 4153770, -11432666, 2382096, 9434969, --6970732, 1261110, -1938104, 5623723, -281857, 5179194, 13571023, 10074920, 6018860, -243739, --1422171, -6414534, -7138236, 2688113, -18217104, -2886218, 8176007, 881005, -1234803, -8666170, --3401614, -469762, -746251, -4292820, -9242770, 9797357, -3823595, -2344515, -2007360, -8406862, --9665824, -503585, -4951561, 402116, 3939559, 3100430, 3241627, -7637526, -2412161, -3940096, --2825015, 11426224, -1804960, -5804649, -212064, 14667850, -8698919, 2024003, 10474888, -234076, --3266323, -6267431, 2631204, -91268, 7205882, -5144297, 5907728, 4578435, 9561134, 4087735, -8986682, 13479218, 7854422, 1596117, -3068754, -4704063, -11218991, -2927557, 7034620, -14696304, --6351183, 13889924, -19089520, -3147674, 10349261, 13527536, -1562831, -13034689, 1648194, -4813048, -17613124, 8177081, -12414066, -7585986, -2059974, -7256884, -15562814, -7408819, -6994891, -5276368, --12621835, 6567542, 2061584, 7997766, -4888747, -1998234, -11099806, -818191, -9641128, 1298154, --6443525, 1709934, 3215857, -14377403, -4925254, -5279589, -3991635, 3479997, 3053185, -4373888, -14407468, -622233, -3848828, -2399276, 1346472, -3081639, -1236951, 5706401, 4560182, 6351183, -7926899, 7861938, 587874, 5269925, -2412698, 11627013, 12088722, -5734855, -3157338, 7781407, --223875, -17916456, 785442, -8796093, 5487358, 6552510, -9701257, -12756590, -5564130, -12342125, --16493211, 11525545, 1641751, 6241661, -8913131, -10219338, -12989055, -9569187, 4602595, -10448582, --8500277, 11711839, -2601140, 86973, 3401077, 6475200, -4963909, -4604742, 2464774, -3791919, -2359548, -1127429, -5565741, -12036646, -17581448, 5438503, -12498355, -12409234, 1083942, -3668976, --371515, -7233799, 3486977, 2881386, -14237280, -888521, -2759517, -6334540, -7701950, 4057134, -1471563, 14090714, 2234457, -8864812, -25233, 730144, 6554120, 1884954, 13530758, -1790465, --13671955, 5376762, -2491618, 5689221, -7951058, 1108638, 5351530, -25840134, -11354820, 8065949, --197032, -3520263, 4446902, -2137283, 16457778, -1447941, 10692321, 7807177, -12109660, -15772194, -1700270, -17156784, 8447664, 35293892, -8784819, -23424752, -2218888, -10122164, 25456272, 2198487, -14242112, 7980049, -4495757, -11027865, -5089000, -12015171, -3164317, 17519708, -19132468, 1162326, --15579994, 4620848, 1376000, 8039642, 1867774, -7064148, -12541305, -14303315, -2586107, -13991930, --11160473, 2381559, 3584150, 11331197, -9835475, -20409684, -4130685, -6662568, 2822331, -9204652, --6336151, 3739843, -4887136, -7600482, -163209, 1715839, -3827890, 21323438, -3709778, -2449742, -5702106, 6317897, -5493800, -1545115, 15778099, 13812078, 9029632, 17164300, 13266080, 1307818, -6068252, 10461467, -5837398, -4836670, 2869575, 8187819, 11740293, 6174016, 22807350, 4388920, -15866146, -1812476, -6731825, -2748779, 32493576, 8554501, -1653562, 204548, -8054138, 7945153, --32078036, -10136660, 14144938, -2385318, -17014512, -13458817, -6258841, 18013092, 7621420, -12148852, -6162205, -16594143, -8629126, -860604, -13040594, -14769856, 12212203, 8716099, -15606301, -3747359, -29555280, 8465381, -14937359, -17478906, -921807, 11421392, 471373, 3047816, -22767622, 683437, --3687766, -14131516, -10271951, -4903242, -13645111, -4521527, 2313377, 1832877, -14360760, -11703249, -365072, 9590125, -1537061, 12400107, 17086990, -11545409, 10055055, 10048076, 2239826, 3943854, -12467753, 5814849, 7106561, 7241852, 6219650, -1054415, -3219078, 17440252, 23192286, 5733782, --7434589, 4718559, -5309117, -7655779, 13945222, -5909338, -15246597, -19148574, -9311489, -22530862, -10000831, -7907035, -6689949, 821949, -6182069, -5840619, -13857712, 11811160, 6624987, -1781338, -7406134, 5979668, 16098611, 12895102, -26991722, -8614094, 29325500, -23140746, -7245610, -13936632, -20779052, 9624485, 9373229, 4308926, 2719788, 8658654, 22023518, 10861435, -10278394, -9664, -319438, -449898, 8432631, 10145250, 753767, 6066105, 5163625, -4988068, 6443525, 4320737, -13326210, -6510097, -13870060, -11307575, -9490804, 2763275, -1767379, 5405217, 5365488, 6145562, -11521250, -5251135, 1857573, -5303748, -10272488, -3775813, 199716, -10897943, 13139379, 17002702, --19353660, 6316287, -13766981, 10444287, -3178813, 4056060, -2594697, -10212358, -3802657, 11692512, --10644540, -2886218, 418222, -18900540, -9093520, 3810173, -16791174, -1189169, 20531554, 11322608, --5164698, -5746666, 18488224, -1487132, -4372814, -15388868, 592706, 1459752, -4227322, -348429, --7248294, 2671470, -22239340, 20143934, -4213363, -7209103, -14147085, -15887084, -1793149, 19168976, --3665755, 5229123, -12089259, -7001871, -3520800, -11730093, -14197014, 12627741, -8125005, -6613713, -11099806, 10827613, -15833934, 5218922, 5636071, 13266617, 10879689, -4323959, -10146323, -6495601, --15448997, 16384226, 10667625, 5221607, 11582453, -12655658, 8112657, -2149094, 7400766, 8182450, --8406325, -1049046, 26797374, 22312356, -17552994, 6419366, 13736379, -11329587, 2997887, -25900264, -7244536, -14295262, 10996727, -8573292, -9106404, -6855842, 29968134, 1024887, -9099425, 1918240, -9968082, 497142, 5944235, -17256642, -1788854, 26123064, -445066, -11985643, 3824669, -23267448, --12328704, -12588549, 10405095, -4748087, 15997679, 11433740, 20653424, -9778030, -2038499, -16068010, -13363791, 27444842, -9404368, -19976966, 869194, -3282429, 31223338, -6987912, -13946833, 13355201, -5569499, 6162741, 10948945, 5138929, -42047192, 1124745, -4048007, 16888348, 27292906, -26080116, --293668, 9073118, -14367202, -1674500, -38383584, -7416872, 17389248, -29470454, -19697256, -8394514, --13435731, 13064217, -8945880, -9904195, 14664629, 5883569, 4264366, 17722108, 116501, -4851166, -10151692, 18549426, -19008452, -11842299, 24269250, 18964428, 4045322, 9272834, 4050691, -10845329, --19305878, 951872, -2188286, -2503429, 2778307, -9272298, 4516695, -13175349, 2717104, 34563748, --18949396, -11382200, 14443438, 7273527, -10528575, 9738838, 8687645, 14333916, -33011118, -60811904, --28083718, -4130148, 20758114, 1635309, 22910430, 21318070, -6328098, 3643206, -5093831, -11340861, --18950470, -10812580, -13632763, -7694434, 21862994, -27904402, -4753992, -23170274, -29017872, -4714801, --29270738, -23273354, 3107409, -5737003, -3179887, 5860483, 26087632, 2341294, -18514530, 1644436, --1991254, -5029944, -24093156, -940598, 29321204, 3387119, -208306, 12513387, 22855132, 15982647, -4243428, -8341900, 8165807, -6818261, -20382842, -36965708, 36366024, -3547643, 30332132, -1445257, -664109, -9643275, -17124034, 32912872, -17794586, -13307956, -1362042, -21669720, -21593484, 19549080, -13225278, 8578123, -2432562, 10964515, -16340740, 8180302, -13632763, -16175921, -21209622, -13128104, --14487462, -24497420, 763430, -23478438, -25084220, -5429376, -10918344, -29670170, -38674032, 3475166, --14017163, 6294275, -1869385, 13852343, 34409668, 663036, 4445291, -17986250, -17165374, 14079440, -9422085, -13313325, 1042066, 8821326, -21634824, -18427020, -250719, 27645094, -23696408, -716186, -1554241, 12160126, -20109036, 20909512, 12483322, 5171678, 373662, -10199474, -23511188, -1304596, --4918812, 7784092, -12345883, -33507724, 27650462, -20614770, -7812546, -2432562, 27054536, -20972862, -10056129, -17424682, 10991358, -7008313, -23217520, 10413685, -29834454, -7875897, -7999377, 9584756, -25902410, -15688979, 10043244, 24284818, -19691888, 2140504, 6798933, 4690641, 8106214, -38547332, --10634339, -7863548, 13724031, 902480, 41339, 4079682, -7185481, 43082280, 4962835, 17955648, -50522236, -23775328, -12522514, -19956566, -6658810, 22666690, 2192581, 28032178, 8344048, -1324997, --9822053, 21164526, -12550968, 4636417, -8075076, 8640400, -13253195, 16156056, -7007239, -3963718, --8338679, 12441983, 9655086, -13922136, -2191507, 13168907, 5152350, -8908299, 2099702, -11417634, --36257576, 16308528, -18382460, -28802588, 19244138, 7997229, 20768314, -1692217, -17247514, -6878390, --3409130, 11389180, 16681116, 16866874, 29571924, 27656368, -10273562, 4068408, -27022860, 620623, --19029926, -37374268, -1506997, -30360586, 12313671, -24118388, -13710072, -15769509, -20430622, 2842195, --2683818, 2562485, -3899830, -2216740, 1148904, -39129836, 9757092, 6953015, 12724914, 20188494, -231928, -30486214, 22319334, 868657, -3978750, -2512019, 29769492, 59585156, -33403572, -24571508, --46601468, -90577104, -24192478, -8392366, 19024558, 13610751, -9470403, -16539382, 23539642, 31821950, -1079111, -349503, -1429687, -23117662, -15916612, -16099148, -14854681, -24569898, -2036351, -5445482, --4814659, 18581640, -25818660, 20257750, 16308528, -4708358, 7494181, -151934, -44686452, -29642254, --18931678, -14763950, -9133785, 4176856, 14508400, 6104223, 6820945, 42061688, 35489852, 9176734, --30119532, -13925358, -3472481, -13811004, -28833190, -65632468, -58004608, -24569360, -8503498, 3084324, -11802033, -45594836, -29258390, 23978802, 24594056, 33235530, -33436858, -36679020, 8435316, -22492744, -50539416, -27677306, -7495792, -16496433, -13804025, 7107097, 9933722, -8293045, -29669098, 404801, --13615583, -12524125, 12363063, 53153980, -16699907, 16012712, 779537, -26053272, 5305359, -50921132, --9556302, 8870181, 2494302, -30393336, 18483928, 48425756, 36724116, -17321604, -29912300, -15203110, -5046050, 50887848, 8609262, -555661, 1717987, 22464290, 26593364, 4595078, 20695300, 13545253, -31009128, -10444824, 4908074, 16739635, -15633144, -28305982, 16263967, 41075456, 10961293, 18713710, -3612068, 10553272, -56303800, 8329016, -617402, 10616085, 58464704, 20364050, 9385040, -8283382, -27192512, -8559870, -10153303, 6132677, 17641578, 30433602, -8899172, 17635672, 5713380, 2454037, -15141907, 13403519, 1527398, -25886304, -11613592, 1127966, 45031660, 24915642, 25054154, 19745576, -22967874, -11592117, -50761680, -44945224, -70713416, -21256330, -8351564, 44354128, -1460826, -21378736, -5463736, -4517232, -16694538, -14308684, 2799782, 23070416, 64542620, 28205050, 57219164, 29119342, -25539486, 23404350, -16730508, -14896557, -16022375, 6381248, 46843596, 14254996, -38887708, 16036334, --41846940, 20179366, -26532698, -6489696, -23314156, -25963614, -1200443, 2346126, -399969, -32313724, -40840844, -9244917, 15267535, -40677100, 10489384, -10225243, -12419972, 19568944, -17097728, 40127344, -4570382, -17329120, 1782948, -13362180, -17265232, 10418517, -28362890, -7208566, 34548716, -8928700, -13757317, -3223373, -26096758, 26466662, -15785615, -59334972, 6330782, 2792803, -1227824, 4731980, --9113921, -13025562, -4535486, 24335284, -51226076, 27426050, -13459891, -8931921, 30668214, -21935472, -6972343, 11493332, -13496935, -24347096, 39770324, 36761700, 128776544, 51788180, -70142720, -33197412, --34403760, -54185844, 37479496, 115402552, 46211700, 21575232, -29185376, -8422968, -2156611, -1854889, -55318640, 37524592, 23953032, 83022256, -100484520, 5859409, 51978232, -13411035, 10343892, 54073640, -9152038, -16522202, 29076392, -56161528, -111363672, -11580306, 10274636, -44060996, -5539434, 58196268, -9291625, 2220498, 21788370, -48257180, -96312496, -88715232, -40597640, 27235462, 55764244, 123947384, -30518426, -17978196, -16954384, -36145372, -76421960, -25119654, 53653804, 52858164, 56593172, 53866408, -33928096, 26425324, 6751689, 9460739, -50305340, -33566244, 4933844, 9059160, 22192096, 25149718, -71698576, 13328894, 39876624, -36370856, -32727650, -60985852, -16951162, -54403812, -16287053, -9627169, --90664616, -58418536, 33867964, 84439592, 101242040, 207237536, 128063576, 84079352, 76562624, 56633976, --10780905, -94139240, -100144680, -196562944, -206199776, -198443600, -125714232, -47724604, 41446972, 69995616, -122264832, 117187648, 83266528, 79310328, 105388832, 98122824, 89919976, 52925272, 37356552, 29645474, --7927436, -13412109, -124673776, -93057984, -112559816, -138038640, -60423212, -135530912, -108811920, -196178000, --170617040, -125825896, -85171352, -22049288, 88831736, 106549008, 90035936, 93985696, 88064544, 168997296, -225793952, 197736544, 197746192, 170182176, 165380400, 116562192, 117955912, 10516764, -106514112, -206546592, --197441792, -289185504, -244233856, -349138432, -410943552, -371445952, -354515712, -228542192, -170124736, -12810814, -24292336, 106535056, 175329152, 290591584, 231230304, 347713024, 200316736, 32184338, -2443837, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-3656628, -530965, -5476084, 4852240, -4402342, -5283884, 2318746, -1553168, -1198296, 1406065, +-6242198, -1283658, 4512937, -3128884, -1114007, -4889284, 1396401, -3642669, -6628745, 2744484, +1201517, 2328409, -2642479, -3220689, 3591130, 1022202, 4066260, 4225174, -4557497, 4128001, +-1251446, -1247688, 2871723, -680215, 2598992, 4476430, 4192425, 804770, 1748052, 1620813, +-3750043, -1819456, -1436130, 700080, 3224984, -6259378, -1509681, -338766, -448824, -2866354, +462783, 2571612, -3308736, 2246268, -2618856, -6324876, 1282048, 1240172, 780073, -2477659, +-766652, -1642825, 2947421, -777389, -151934, 130997, 2049773, 665183, 1256815, 1723356, +-4498442, -2363843, 2320356, -540629, -1096290, 1130650, -1292785, 4477504, 4966056, 2718714, +-1960653, -7510287, -6949794, 2547989, 3948149, -1427540, 7396471, -1396401, 4405026, -5229660, +-4670240, 2071248, 165356, -1323924, 1944547, 4858145, -2109366, 715112, -2763812, -225486, +245350, 2022393, 1826972, 2523830, 403727, 1525250, 5492727, -2065342, -2572686, -2718714, +-4977330, 1491964, -1042066, 9170292, 1779190, -622233, 728534, 5592048, -494995, -1136019, +-1389959, -3169686, -570694, 4323422, -624918, 1840394, 4330401, -1267015, -270583, -6825777, +-4017942, -6212134, -1182190, -1734630, 988916, 446677, 974958, 2359548, -1435056, 1207960, +157303, 691490, 1060320, -2147484, 2291902, -566399, -2481954, -113280, -2469606, -506806, +499827, 5185100, 12045773, 4832912, 2807298, 3416647, -7167227, -782221, 3010772, -910533, +1141924, -6435472, 6318971, 8691940, 1429687, 3910568, -1880659, -5010616, -7903814, -8535711, +-5771899, 6855305, -6488622, -4032438, -5502390, 1792612, 4454418, 903017, 544387, 2576444, +-325881, 1645509, 5500243, -733903, 4559645, -4363687, 4152160, 2989834, 2611340, -2275259, +-7284265, -1484448, 4046396, 2493766, -2095944, -190052, 1343788, -252866, -3563749, -675921, +2859911, -956704, 235686, -1660542, -475131, 273804, 887985, 5153424, 2027761, -2540473, +335007, 494995, -1837172, 1009317, -2631204, -204011, 4008815, 1447941, 4505958, -3185792, +-2974802, -1547799, -877784, 2553358, 5090610, -2758443, -3988414, 4845260, 733366, -1968169, +2202781, -466541, 3538516, 1500017, -3993783, -3764002, -4282083, -680215, -3501472, -7350837, +-7009387, 7195144, -181999, 1497333, -81604, 4368519, -6529961, 9628243, 8543227, 410706, +420370, -25233, 215285, -996432, 3315715, 2565706, 166430, -5549098, 2332704, -1763084, +2590939, -828929, 5801427, -1433445, -3467649, -1619203, -981937, 2089502, -102542, 3534221, +-5884642, 3040837, 941672, -3330210, 9075803, -1564442, -1389959, -311922, -226023, -2542621, +-865973, 4744328, 3908957, -8730058, -4139812, 4195110, 1158567, -2233383, 7363185, 73551, +1569811, 7127498, 2929168, 5522254, 1522566, -2494839, -3104188, -6094559, -5698885, 430034, +2879239, 6673843, 204548, -3558917, -9801115, -3401077, -4774930, 4456029, -3265249, 2896956, +-3530463, -1446330, 8288750, 4065187, -5523865, 2520072, 7904888, 1165547, -2789581, -5557151, +-6693707, -4577899, -6730214, 4459250, 1001264, 2452426, -1301912, -3044058, -3219078, -5922760, +296353, -191663, 1395328, -1453846, -5391258, 74088, 5739150, -1290101, 59056, -2883534, +-5737540, -8504035, -734976, 6085432, 2218888, 612570, -2877091, 747861, -4600447, -1546725, +-3459059, 396211, 788663, -5290326, 5924908, -3386582, 7539278, 2785286, 731218, -3489661, +-1775969, 1857037, -408022, 1744831, 4068408, 726923, 1634235, -4576825, 2676302, -2362232, +6958384, 8446590, 3971234, 5626944, 2718178, -1015223, -5990406, -4006668, 462783, 4374961, +4110284, 3312494, -7938710, 1073742, -8487392, -2684, 1258425, 820339, 3774203, 415538, +566936, 14981920, -1913945, -6570763, -7161321, 7540889, 4989679, -5633924, 1326608, -6287832, +-2752537, 241592, 7104413, -8835285, 2536178, -316217, 1362042, -646929, 9024263, -4665945, +2503429, -1391569, -2463701, 1408212, -500364, 2749853, -2847027, -2551748, -7755101, 1231582, +-2629594, -1627256, 523986, -2694555, 2174327, -4308926, -2678449, -7601555, -338229, -6747931, +-2975339, -8031589, 5852967, 1233729, -2612414, 5275831, -6259915, -17717, -11803107, -616865, +3821984, -313533, 3222836, 7395397, -2852395, -1053878, 8962523, 3882114, 3228205, 5609764, +-3339874, -8628052, -1418413, -5240934, 3079492, 8316668, -2464238, 2044404, -1004486, 4144644, +4841502, 1642288, -2815351, 1975148, 1308354, 8994735, -1330366, -2060511, -12218108, -3580929, +9268539, 8885750, 5832029, 4436165, 13162464, 673773, -15654082, -4166118, -2593087, -3952444, +8373576, -1488206, -3033858, 9574556, 1523640, -4199941, -1401770, 3700651, -3473555, -1567663, +1168231, -1457605, -5491653, -2700461, -294205, -5514738, -2464774, -2465848, 3630858, -2741263, +7036230, 6624450, 598074, 6271189, 4523675, -3277597, -1103270, -2583423, -10296110, 791885, +1988570, -10074383, -1520955, -3155727, 3329674, 8419747, 1191853, -9460739, 1146756, -3984119, +-6245956, 4329864, -1628330, -7072738, 2685428, 1759326, 6855842, -1392106, -1163936, 4271345, +5888400, 5630702, -7317551, 3376381, 6119255, -15912317, 6524056, -1629403, -3821447, -3184718, +2580739, -1423245, -9695889, -10043781, 1045288, 15884937, 4153770, -11432666, 2382096, 9434969, +-6970732, 1261110, -1938104, 5623723, -281857, 5179194, 13571023, 10074920, 6018860, -243739, +-1422171, -6414534, -7138236, 2688113, -18217104, -2886218, 8176007, 881005, -1234803, -8666170, +-3401614, -469762, -746251, -4292820, -9242770, 9797357, -3823595, -2344515, -2007360, -8406862, +-9665824, -503585, -4951561, 402116, 3939559, 3100430, 3241627, -7637526, -2412161, -3940096, +-2825015, 11426224, -1804960, -5804649, -212064, 14667850, -8698919, 2024003, 10474888, -234076, +-3266323, -6267431, 2631204, -91268, 7205882, -5144297, 5907728, 4578435, 9561134, 4087735, +8986682, 13479218, 7854422, 1596117, -3068754, -4704063, -11218991, -2927557, 7034620, -14696304, +-6351183, 13889924, -19089520, -3147674, 10349261, 13527536, -1562831, -13034689, 1648194, -4813048, +17613124, 8177081, -12414066, -7585986, -2059974, -7256884, -15562814, -7408819, -6994891, -5276368, +-12621835, 6567542, 2061584, 7997766, -4888747, -1998234, -11099806, -818191, -9641128, 1298154, +-6443525, 1709934, 3215857, -14377403, -4925254, -5279589, -3991635, 3479997, 3053185, -4373888, +14407468, -622233, -3848828, -2399276, 1346472, -3081639, -1236951, 5706401, 4560182, 6351183, +7926899, 7861938, 587874, 5269925, -2412698, 11627013, 12088722, -5734855, -3157338, 7781407, +-223875, -17916456, 785442, -8796093, 5487358, 6552510, -9701257, -12756590, -5564130, -12342125, +-16493211, 11525545, 1641751, 6241661, -8913131, -10219338, -12989055, -9569187, 4602595, -10448582, +-8500277, 11711839, -2601140, 86973, 3401077, 6475200, -4963909, -4604742, 2464774, -3791919, +2359548, -1127429, -5565741, -12036646, -17581448, 5438503, -12498355, -12409234, 1083942, -3668976, +-371515, -7233799, 3486977, 2881386, -14237280, -888521, -2759517, -6334540, -7701950, 4057134, +1471563, 14090714, 2234457, -8864812, -25233, 730144, 6554120, 1884954, 13530758, -1790465, +-13671955, 5376762, -2491618, 5689221, -7951058, 1108638, 5351530, -25840134, -11354820, 8065949, +-197032, -3520263, 4446902, -2137283, 16457778, -1447941, 10692321, 7807177, -12109660, -15772194, +1700270, -17156784, 8447664, 35293892, -8784819, -23424752, -2218888, -10122164, 25456272, 2198487, +14242112, 7980049, -4495757, -11027865, -5089000, -12015171, -3164317, 17519708, -19132468, 1162326, +-15579994, 4620848, 1376000, 8039642, 1867774, -7064148, -12541305, -14303315, -2586107, -13991930, +-11160473, 2381559, 3584150, 11331197, -9835475, -20409684, -4130685, -6662568, 2822331, -9204652, +-6336151, 3739843, -4887136, -7600482, -163209, 1715839, -3827890, 21323438, -3709778, -2449742, +5702106, 6317897, -5493800, -1545115, 15778099, 13812078, 9029632, 17164300, 13266080, 1307818, +6068252, 10461467, -5837398, -4836670, 2869575, 8187819, 11740293, 6174016, 22807350, 4388920, +15866146, -1812476, -6731825, -2748779, 32493576, 8554501, -1653562, 204548, -8054138, 7945153, +-32078036, -10136660, 14144938, -2385318, -17014512, -13458817, -6258841, 18013092, 7621420, -12148852, +6162205, -16594143, -8629126, -860604, -13040594, -14769856, 12212203, 8716099, -15606301, -3747359, +29555280, 8465381, -14937359, -17478906, -921807, 11421392, 471373, 3047816, -22767622, 683437, +-3687766, -14131516, -10271951, -4903242, -13645111, -4521527, 2313377, 1832877, -14360760, -11703249, +365072, 9590125, -1537061, 12400107, 17086990, -11545409, 10055055, 10048076, 2239826, 3943854, +12467753, 5814849, 7106561, 7241852, 6219650, -1054415, -3219078, 17440252, 23192286, 5733782, +-7434589, 4718559, -5309117, -7655779, 13945222, -5909338, -15246597, -19148574, -9311489, -22530862, +10000831, -7907035, -6689949, 821949, -6182069, -5840619, -13857712, 11811160, 6624987, -1781338, +7406134, 5979668, 16098611, 12895102, -26991722, -8614094, 29325500, -23140746, -7245610, -13936632, +20779052, 9624485, 9373229, 4308926, 2719788, 8658654, 22023518, 10861435, -10278394, -9664, +319438, -449898, 8432631, 10145250, 753767, 6066105, 5163625, -4988068, 6443525, 4320737, +13326210, -6510097, -13870060, -11307575, -9490804, 2763275, -1767379, 5405217, 5365488, 6145562, +11521250, -5251135, 1857573, -5303748, -10272488, -3775813, 199716, -10897943, 13139379, 17002702, +-19353660, 6316287, -13766981, 10444287, -3178813, 4056060, -2594697, -10212358, -3802657, 11692512, +-10644540, -2886218, 418222, -18900540, -9093520, 3810173, -16791174, -1189169, 20531554, 11322608, +-5164698, -5746666, 18488224, -1487132, -4372814, -15388868, 592706, 1459752, -4227322, -348429, +-7248294, 2671470, -22239340, 20143934, -4213363, -7209103, -14147085, -15887084, -1793149, 19168976, +-3665755, 5229123, -12089259, -7001871, -3520800, -11730093, -14197014, 12627741, -8125005, -6613713, +11099806, 10827613, -15833934, 5218922, 5636071, 13266617, 10879689, -4323959, -10146323, -6495601, +-15448997, 16384226, 10667625, 5221607, 11582453, -12655658, 8112657, -2149094, 7400766, 8182450, +-8406325, -1049046, 26797374, 22312356, -17552994, 6419366, 13736379, -11329587, 2997887, -25900264, +7244536, -14295262, 10996727, -8573292, -9106404, -6855842, 29968134, 1024887, -9099425, 1918240, +9968082, 497142, 5944235, -17256642, -1788854, 26123064, -445066, -11985643, 3824669, -23267448, +-12328704, -12588549, 10405095, -4748087, 15997679, 11433740, 20653424, -9778030, -2038499, -16068010, +13363791, 27444842, -9404368, -19976966, 869194, -3282429, 31223338, -6987912, -13946833, 13355201, +5569499, 6162741, 10948945, 5138929, -42047192, 1124745, -4048007, 16888348, 27292906, -26080116, +-293668, 9073118, -14367202, -1674500, -38383584, -7416872, 17389248, -29470454, -19697256, -8394514, +-13435731, 13064217, -8945880, -9904195, 14664629, 5883569, 4264366, 17722108, 116501, -4851166, +10151692, 18549426, -19008452, -11842299, 24269250, 18964428, 4045322, 9272834, 4050691, -10845329, +-19305878, 951872, -2188286, -2503429, 2778307, -9272298, 4516695, -13175349, 2717104, 34563748, +-18949396, -11382200, 14443438, 7273527, -10528575, 9738838, 8687645, 14333916, -33011118, -60811904, +-28083718, -4130148, 20758114, 1635309, 22910430, 21318070, -6328098, 3643206, -5093831, -11340861, +-18950470, -10812580, -13632763, -7694434, 21862994, -27904402, -4753992, -23170274, -29017872, -4714801, +-29270738, -23273354, 3107409, -5737003, -3179887, 5860483, 26087632, 2341294, -18514530, 1644436, +-1991254, -5029944, -24093156, -940598, 29321204, 3387119, -208306, 12513387, 22855132, 15982647, +4243428, -8341900, 8165807, -6818261, -20382842, -36965708, 36366024, -3547643, 30332132, -1445257, +664109, -9643275, -17124034, 32912872, -17794586, -13307956, -1362042, -21669720, -21593484, 19549080, +13225278, 8578123, -2432562, 10964515, -16340740, 8180302, -13632763, -16175921, -21209622, -13128104, +-14487462, -24497420, 763430, -23478438, -25084220, -5429376, -10918344, -29670170, -38674032, 3475166, +-14017163, 6294275, -1869385, 13852343, 34409668, 663036, 4445291, -17986250, -17165374, 14079440, +9422085, -13313325, 1042066, 8821326, -21634824, -18427020, -250719, 27645094, -23696408, -716186, +1554241, 12160126, -20109036, 20909512, 12483322, 5171678, 373662, -10199474, -23511188, -1304596, +-4918812, 7784092, -12345883, -33507724, 27650462, -20614770, -7812546, -2432562, 27054536, -20972862, +10056129, -17424682, 10991358, -7008313, -23217520, 10413685, -29834454, -7875897, -7999377, 9584756, +25902410, -15688979, 10043244, 24284818, -19691888, 2140504, 6798933, 4690641, 8106214, -38547332, +-10634339, -7863548, 13724031, 902480, 41339, 4079682, -7185481, 43082280, 4962835, 17955648, +50522236, -23775328, -12522514, -19956566, -6658810, 22666690, 2192581, 28032178, 8344048, -1324997, +-9822053, 21164526, -12550968, 4636417, -8075076, 8640400, -13253195, 16156056, -7007239, -3963718, +-8338679, 12441983, 9655086, -13922136, -2191507, 13168907, 5152350, -8908299, 2099702, -11417634, +-36257576, 16308528, -18382460, -28802588, 19244138, 7997229, 20768314, -1692217, -17247514, -6878390, +-3409130, 11389180, 16681116, 16866874, 29571924, 27656368, -10273562, 4068408, -27022860, 620623, +-19029926, -37374268, -1506997, -30360586, 12313671, -24118388, -13710072, -15769509, -20430622, 2842195, +-2683818, 2562485, -3899830, -2216740, 1148904, -39129836, 9757092, 6953015, 12724914, 20188494, +231928, -30486214, 22319334, 868657, -3978750, -2512019, 29769492, 59585156, -33403572, -24571508, +-46601468, -90577104, -24192478, -8392366, 19024558, 13610751, -9470403, -16539382, 23539642, 31821950, +1079111, -349503, -1429687, -23117662, -15916612, -16099148, -14854681, -24569898, -2036351, -5445482, +-4814659, 18581640, -25818660, 20257750, 16308528, -4708358, 7494181, -151934, -44686452, -29642254, +-18931678, -14763950, -9133785, 4176856, 14508400, 6104223, 6820945, 42061688, 35489852, 9176734, +-30119532, -13925358, -3472481, -13811004, -28833190, -65632468, -58004608, -24569360, -8503498, 3084324, +11802033, -45594836, -29258390, 23978802, 24594056, 33235530, -33436858, -36679020, 8435316, -22492744, +50539416, -27677306, -7495792, -16496433, -13804025, 7107097, 9933722, -8293045, -29669098, 404801, +-13615583, -12524125, 12363063, 53153980, -16699907, 16012712, 779537, -26053272, 5305359, -50921132, +-9556302, 8870181, 2494302, -30393336, 18483928, 48425756, 36724116, -17321604, -29912300, -15203110, +5046050, 50887848, 8609262, -555661, 1717987, 22464290, 26593364, 4595078, 20695300, 13545253, +31009128, -10444824, 4908074, 16739635, -15633144, -28305982, 16263967, 41075456, 10961293, 18713710, +3612068, 10553272, -56303800, 8329016, -617402, 10616085, 58464704, 20364050, 9385040, -8283382, +27192512, -8559870, -10153303, 6132677, 17641578, 30433602, -8899172, 17635672, 5713380, 2454037, +15141907, 13403519, 1527398, -25886304, -11613592, 1127966, 45031660, 24915642, 25054154, 19745576, +22967874, -11592117, -50761680, -44945224, -70713416, -21256330, -8351564, 44354128, -1460826, -21378736, +5463736, -4517232, -16694538, -14308684, 2799782, 23070416, 64542620, 28205050, 57219164, 29119342, +25539486, 23404350, -16730508, -14896557, -16022375, 6381248, 46843596, 14254996, -38887708, 16036334, +-41846940, 20179366, -26532698, -6489696, -23314156, -25963614, -1200443, 2346126, -399969, -32313724, +40840844, -9244917, 15267535, -40677100, 10489384, -10225243, -12419972, 19568944, -17097728, 40127344, +4570382, -17329120, 1782948, -13362180, -17265232, 10418517, -28362890, -7208566, 34548716, -8928700, +13757317, -3223373, -26096758, 26466662, -15785615, -59334972, 6330782, 2792803, -1227824, 4731980, +-9113921, -13025562, -4535486, 24335284, -51226076, 27426050, -13459891, -8931921, 30668214, -21935472, +6972343, 11493332, -13496935, -24347096, 39770324, 36761700, 128776544, 51788180, -70142720, -33197412, +-34403760, -54185844, 37479496, 115402552, 46211700, 21575232, -29185376, -8422968, -2156611, -1854889, +55318640, 37524592, 23953032, 83022256, -100484520, 5859409, 51978232, -13411035, 10343892, 54073640, +9152038, -16522202, 29076392, -56161528, -111363672, -11580306, 10274636, -44060996, -5539434, 58196268, +9291625, 2220498, 21788370, -48257180, -96312496, -88715232, -40597640, 27235462, 55764244, 123947384, +30518426, -17978196, -16954384, -36145372, -76421960, -25119654, 53653804, 52858164, 56593172, 53866408, +33928096, 26425324, 6751689, 9460739, -50305340, -33566244, 4933844, 9059160, 22192096, 25149718, +71698576, 13328894, 39876624, -36370856, -32727650, -60985852, -16951162, -54403812, -16287053, -9627169, +-90664616, -58418536, 33867964, 84439592, 101242040, 207237536, 128063576, 84079352, 76562624, 56633976, +-10780905, -94139240, -100144680, -196562944, -206199776, -198443600, -125714232, -47724604, 41446972, 69995616, +122264832, 117187648, 83266528, 79310328, 105388832, 98122824, 89919976, 52925272, 37356552, 29645474, +-7927436, -13412109, -124673776, -93057984, -112559816, -138038640, -60423212, -135530912, -108811920, -196178000, +-170617040, -125825896, -85171352, -22049288, 88831736, 106549008, 90035936, 93985696, 88064544, 168997296, +225793952, 197736544, 197746192, 170182176, 165380400, 116562192, 117955912, 10516764, -106514112, -206546592, +-197441792, -289185504, -244233856, -349138432, -410943552, -371445952, -354515712, -228542192, -170124736, -12810814, +24292336, 106535056, 175329152, 290591584, 231230304, 347713024, 200316736, 32184338, -2443837, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, }, { { 15547245, --3688303, -1811939, -4158065, 384400, -4757750, 141734, 2228551, 1487132, -693100, -3057480, -2359548, 3493419, 202937, -1853278, -1523103, -1205275, -2942590, 1131724, 665183, 818728, -2069637, 4105452, 4027606, 979253, 3172370, 1658394, -1734093, 867583, 1382443, -275952, -499290, 465467, -446677, 2117956, -139050, 3839164, 3338800, -3635153, 2774012, 623307, -2270427, 445603, -366146, 95026, 6896107, 196495, 2267206, 558346, 1948841, 2699924, -544387, -1862942, 4030290, -5218386, -449898, 1494649, 4357781, 1412507, -661425, 3718905, --404264, -3114388, 1017370, 1066226, 711891, -653372, 427886, -378494, -2338610, 723165, --956704, -1605244, 1811403, -2806224, 2375117, -5189394, -13831405, -1182190, -2191507, -1902671, -230318, -2318209, 890669, 1352378, 5705864, -1919314, -195958, -5235029, 420907, 5266167, -403727, 3810173, -1082869, 1605781, -2156611, -3294240, 155693, 3631395, -417149, -4513474, --137439, 4408247, 1482301, -1855963, -1511829, -179852, -546535, -995896, 112206, -709207, --1447941, -156766, 964757, 652298, -134755, -3409667, 5199595, 7036230, 294205, 861141, --2754148, -1555315, 627065, -3598646, -3977677, 2476049, -3217468, 2449742, 3175592, 3147137, -1232119, -408559, 907849, 705448, 2400887, -4966593, 498753, -592706, -3599720, -4897874, -193274, 2514167, -1851131, -234613, -562104, -347355, 3466039, 1685238, 385473, 1224066, --1347009, -12506945, -3179350, 5121749, -947040, -3725347, 1410360, -9230422, -3884798, -1182190, --1960116, -4689031, -5405217, 2960306, 4006668, 3848291, -5076652, -6910603, 534187, -3975529, --7836705, 1903744, -753767, 2311766, 8229694, -2632815, -1175210, -5206574, 7068980, 729608, -3385508, 2691334, 5748814, 3223910, 1579474, -5834176, -967978, -5355824, -1809792, 385473, --2605972, 1990181, 1265405, -2467996, -5409512, 3386045, 5024038, 1624571, -2842732, -3825742, --2757369, 1377074, -4753992, -5520644, -1916629, 2881386, -1873680, 1460826, 3213173, 2311229, --2956011, 5192616, 126165, 4417911, -3997541, -3046743, -2129767, -2137283, 2696703, -1726040, --178778, 5137855, 1471026, 55835, -5285494, 1218160, -2365990, 3400540, -2513093, 3187940, -4596689, 1733556, -2746095, 1873680, -1251446, 1262720, 8558259, 5127654, -7102802, 4753455, --3882651, -2065342, -978716, 19327, 3663607, 5906, 9978820, 2732136, -3762928, -2646237, --2428267, 6841883, 1685775, 6577206, 2246805, 4370129, 7059853, 7886097, 3097208, -1087701, --775778, 1030255, -6429029, -6201933, 1946157, -4763119, 2617246, 1035087, -1522029, -892816, -1917703, 6493991, -2178622, -2523830, -3431679, 8339753, -1134408, -10972568, -5313412, -4518843, --3862249, 4141422, 4293357, 3443490, 5646272, 2174864, 3565897, -480499, -266825, -497679, -5715528, 1474248, 3409130, -7828652, 621160, -48318, 573915, 78920, 3464965, 1837172, -1237488, -4072166, -3171297, 18506478, 4529043, 2528125, -1901597, -1654099, 2229088, 974958, -5431523, 6309307, 98247, 9453223, 4313758, -3799436, -2826625, -591632, 5098126, -896574, --2144799, 4842039, 1144609, 13785771, 4118874, 2453500, 1005022, -1708860, 1091995, 1793686, -3169149, -986769, 461709, 7235410, 1497333, 7998840, -3757023, -4360466, 3198677, 12182138, -4080219, 2675765, -632434, -5774047, -1670742, 1337882, 836982, -484258, 929324, -8055211, -1021129, -3752191, 3563212, 2053531, -2546379, 1390496, 3196530, 1426466, -3106335, -4107063, -1401233, 906775, 539555, -5191005, 1788317, -2293513, 3616363, -898185, 1167694, 1456531, --143345, 547608, -1084479, -59593, 11654931, 572841, 4605816, -701153, -2226404, 642098, -1447404, -237297, 2610266, -4005594, -896038, 4374424, -2324651, -6419903, -233002, 10952167, --950262, 8619999, 4141959, 11870216, 1196685, 1210644, 4044249, -3196530, -7248831, -9113384, -1918777, -4596152, 10572062, 6288369, 7381438, -1351304, -3471407, 1040993, 1420560, 3658775, -9833328, 1286880, 3904125, -4569309, 2895882, -3230352, 1036698, -1721745, 2975876, 5852430, -405874, 5586142, 1640678, 2807835, -2017561, -1318018, 6991133, -1717987, -2303713, 5596880, --3810710, -316754, 311922, -2457258, -3752728, 2456721, -4251481, -738734, -5304822, -10171019, --1717450, -1585917, -873489, -10614475, -4669167, -3285650, -3400540, 3901978, 9713605, -2723009, -2631741, 5373541, -2233920, 977642, 252866, 648003, -4240744, 4479651, -13898514, 1373853, -7169911, 4060355, -7889855, -401043, 155693, 1988033, 2607582, -271657, -6199249, -5566815, -671089, 9874667, 4394826, 5916855, 9546639, -6463926, 6742025, 13049184, -1426466, 3049964, --7562901, 2649995, 2390149, -6146635, -3636764, -1227824, 2710124, -6221797, -8638790, 1721208, -645319, -7067906, 290447, 2376191, -1753420, 15397458, -1165547, -10737418, -1040456, 3838090, -8305393, 3264175, 3550327, -6867653, 1604170, 2269353, -6517076, -338766, -1378685, 10679973, -6174016, -1709934, -3974455, -8180839, 3218004, 3335579, -5184026, -137976, 1647120, 3238942, -2986613, -4177930, -427886, -912144, 9665287, -8380555, 750009, -2195802, 8723615, -663572, --2389076, -3776350, 1049583, -3846143, -8650601, 5036386, 4933307, 1500017, -3287798, 806917, -2477659, 15895674, 10872173, 7830799, 11527155, 4420058, -747861, 1460826, 4420595, -11544335, -6093485, 30602, 6541235, -4728759, -2067490, -7474317, 2355253, 12829604, -12389370, -8150774, --13179644, 6720013, -2779918, 333397, -5829345, 704375, -1977296, -6209986, 2658585, 2937758, --9246528, -1364726, 2066416, -2156611, 5398237, -13915694, -6368363, 14179298, 1787780, -257161, --1031866, 507880, -6830609, -7639673, 846645, -11110007, -2167885, 1173600, 3401614, -4726612, --676994, 13917842, -456877, 4955319, 10738492, -9473624, -2881386, 2386391, 2894271, 1998234, --2485176, -6686191, 8303246, -685584, -6898255, 5566278, -959388, 1448478, 2265059, -3794067, --2524904, -1653562, -26331908, -15188615, 12419435, -4977867, -5290326, 6979322, 6752763, -11710228, --14986215, -5230734, -5070209, -6072010, -589484, -10863046, -7170448, 3630858, 904091, -14489609, --15213311, -9023189, -3788161, -992674, 8587787, -759672, -5318244, 4258997, -12517145, 253940, --27380, 436476, 5171678, 2411087, -8916352, -7250442, 6356552, 1949378, 21926344, 5188858, --6412923, 955630, 1382443, 235686, 6326487, 1121523, 3075734, -2108292, -3925600, 1499481, --11461657, -2136209, -4538707, -6280316, 2229625, -9497783, 12186970, -1170916, 5610838, 8465381, -3304977, 4721780, 397821, -4766340, 737661, -79457, -5551782, 9234717, -2492155, 16027744, -581968, 728534, 1833951, -2563022, -7034083, 4408247, -5246840, 210990, 9738838, 6372658, -18834506, -10108742, 8460549, 4816806, 6048925, -1882806, -11754789, 2455648, -3816615, -9163313, -19396610, -542240, -6687801, -19224810, 11329050, 4308926, -1271310, -6648610, -9761387, 1087701, -19635516, 8558259, -1903744, -1207960, -10004589, -6411313, 4845797, 3463891, -8107825, -4085051, -6052683, 2607045, -1497870, 7005092, 8341900, 2288144, 11378979, 15097884, 7419019, -2533494, -1855426, 1932735, 1032940, 8229694, -11977590, 11919608, -2167885, -4929549, -10040560, 796716, -5856725, 5879274, -11674795, 2970507, 6458020, 1979443, -8975945, -15113453, -16110959, 4564477, -4634807, 1845225, -7419556, 45097, 9615358, -4472135, -10714333, -15899432, -369904, 4160750, --14798310, 5680094, 9993315, -4605816, 6932614, 4380330, 23157390, 16411607, 2822331, -4093641, --3326989, -2669322, -17188460, -5975910, -1018981, 11108933, -8363912, -3598109, -4369593, 781684, -16412681, -12845710, -4479651, -177704, 7209640, -2260227, -10841034, -16078747, 5003100, -10965052, --6212134, -6667400, -8727910, 2906619, -14012331, -5867999, 10513006, 17714056, -255014, -10406706, --10716480, 16330003, -2877628, -8266202, 15518791, 864362, -125091, 1028108, -19325206, 7689065, --7931194, 6878927, 4861903, -12082280, -2617246, -12284143, 3555159, -11930882, -3414499, 5266167, -5512054, -3901978, 2759517, -14603426, 8655433, -1048509, 5379984, 5876589, 2603824, -3229279, --4745402, 14698452, -11886859, 7289633, -4303021, -12506408, -9434969, -799938, 11228118, -7355669, -4189741, 2675228, -5660230, 6155225, -1511829, -3048890, 10009421, 1054415, -5531381, -14934675, --138513, -19203336, 3794604, 858993, 9623948, -8164196, -1169305, 3963181, 4554276, 4423280, --11917461, 16788490, 13059385, 1429687, 9782325, -5068062, -17261474, 3279745, -6986838, -9264244, -8858907, 19488414, 4045859, -6625524, -6965363, -17413408, 469225, -272194, 25640954, -10990821, -4832, -336081, -383863, -16318191, -16782584, 12418361, 880468, 6523519, -1878511, -20650202, --10877542, 281320, -2961380, -5422933, -5279589, 11347304, -2439005, 6838662, -8685498, 16225313, --20708722, 8801999, 11020349, 4840965, 5889474, 3520800, 16676284, 6670084, -1085016, 1564979, -234076, 14209899, 24672976, -5195300, 2113661, -9908490, 10575820, 13266080, -10468446, -1080721, --21045876, -2687576, -26805428, -13190918, 10056666, -10438381, -23857470, 2583960, -13009993, 993211, -140123, -14666240, -14641544, 6910603, 13554380, 4614406, -16381542, 8148090, -18378702, -5896990, --6926709, 6131603, -7683160, -2921652, 8477729, 1967095, -6172942, -12406013, 13455059, 13733695, -17023102, 2750927, -2079838, 1120987, 5365488, -781147, 6925635, -7234873, 9165997, -3117073, -10595684, 9113921, 6381248, -2556043, 396211, -16070694, 5634460, -3623879, 12506945, 2843268, --29044180, 5039071, 14385456, 19851876, -11000485, -14566918, 18250390, 8811125, 12905840, -22127134, -11428908, 28999082, 30190936, 2467459, 1016297, 17578764, -11422466, -15209016, 10515154, -16955994, -7082938, -7775502, -6153615, -3739306, -36550172, -22006876, -16607028, -4265977, -16076599, -29395294, -22355842, 2892661, 7174743, -3377992, 15685757, 923418, -14303852, 11173357, 3847754, -4398584, --8831527, -6041945, 1558536, 4387846, 13836237, -7677254, 10751914, 4066260, 19943144, -28848222, --8367133, -4169340, 3282429, 12451647, 16881368, 4421132, -14600204, 10000831, 13181792, 11976516, --3701725, 4481262, 348429, -4355097, -2447595, 1291175, 3954054, 2045478, 9642738, 2114198, --13204340, 12351789, -13664438, -16442745, 2188286, 12625593, -6356015, -3965329, 4028679, 6355478, -10130754, -5622112, 4622996, 24121074, -9816148, -24901146, -32999308, -16212428, -22414898, 10336376, -19018652, 12520903, 4555350, 11724187, 6733972, 12849468, -10909754, 14382235, 7661148, 5582384, -15320685, 18881750, -5990406, 29911762, 2910377, 4696010, -6180458, 10878615, -34182036, -15084999, --23340462, -24106578, 9641665, -21022254, 20773684, 23625542, 1109175, 5176510, -3546032, 4390531, --22290344, 9287867, 24866250, -14008573, -28708636, 3926674, -10723460, -9061307, -27987080, 5011153, -10449119, 48318, -3681324, 9214852, -15891916, -2478196, 10572062, -5540508, -14059575, 1950452, --6940131, 14937896, -9575093, -5125507, 13910862, 12234751, 25554518, 3693135, 6289980, -1976759, -6976101, 9440338, 15842524, -4090420, -368293, -9277129, 20835960, -25564720, 28151364, 1579474, --11068668, 13779329, -10109816, -6777459, 25820270, -36397164, 6062347, -6918656, 7201050, -13356275, -6768869, 16042777, -7987566, 198105, -4525822, -4154844, -4366908, 30270930, -33194728, -5609228, -36696736, -14598594, -23267448, 2524367, -8994198, -7488276, -13214004, -15905338, 20167556, 9104794, -1029718, 9910100, 23946590, 14631343, -1919314, 5270999, 16022375, 21109228, -18687940, 8956081, -17144972, 7920457, 6133750, 24348170, 11329587, 5374615, -955630, 11172821, -1424855, 12602508, -9881646, 5921686, -11435887, 21628382, -17637820, -1759863, 26373784, 26698054, -6431714, -22834730, -8596914, 108448, 22629108, 39699456, 8616241, -5507759, 2638721, -21981642, -2779918, -5401458, --4945655, 1023276, 19921132, -7985955, 8731669, 24720222, 4031901, -21598316, 14702210, -412317, -9360344, 23411330, 31875100, -8137353, -8412767, -1795833, -25172804, -35915052, 1121523, -15620259, --2560874, -18988588, -1866163, 2356327, 3099356, 17406428, 2684, -6190122, 25182466, -47042776, -25982942, -19931332, -45969036, -13882408, -11424613, -1843078, -10438381, 5399848, -12555263, -28815472, --17062832, -8761196, -2389076, 3073049, -11555610, 11305965, 22646288, 621160, -1180579, 5931350, -1608465, -4401805, -8090645, -4918275, 6300180, 6434935, -1755031, 6099391, 27778774, 7333657, --7816304, -27585502, -4127464, 19029390, -23270670, -11343545, -8720394, -25233, -1564442, 14498736, --4666482, 1423245, 20633022, 6904697, 22857280, -3602941, -10486163, -5363878, -5618891, -6372658, -11096048, 629750, 7537668, 13181255, -24146844, 2866891, -6336151, -15901043, -11353746, 22795002, -17061220, -201327, -11679090, 3534758, 9802189, -483721, 6564858, -18187040, -40857488, -21099026, --15691126, 11391327, -108448, -7019587, 13771276, -18731426, 22468584, -2033667, -34890704, 6914898, --16702054, -3769371, -2313377, -4424890, -22148072, 6768869, 1387811, 17457432, -38044284, 340913, -19063750, 1988570, -8884140, -19645180, -1321239, 10812043, 16687559, -14008573, -4726612, 8617315, -19024020, 16930224, -16494285, -3700114, -26840862, 12262132, 13803488, 8165807, -7587597, -2423435, --7258495, -3183108, -8930311, 2279017, 19711216, -7609072, -7733089, -7067906, -11169062, 22017612, -19152870, -2185065, 26953604, -1530619, 9489193, -24160802, 19430432, 8425652, -27058830, -8946417, -30451854, 12501576, 7971460, 5768141, -14908905, -11563663, -16063178, 26577258, -14499273, 20592220, -20460150, -24097450, 54883776, -11705396, 33283312, 2100239, -9828496, -13904420, 23173496, 12238509, --25979720, -3645890, 13459354, 22957138, 1889786, -19447076, 9289477, -37485936, -10013179, -34120292, --47046536, 1329292, -18216030, 5710696, -3706020, -7730405, -18124762, -12706661, 10167261, 27763206, --23912230, -5588826, -40977748, -36197448, 9341554, 13618268, -22798224, -24019068, 882616, 4397510, --38315940, 1178432, 111132, 18689550, -17666812, -214212, 15417859, -11602317, -20492900, -23040352, --11550241, -21179558, -17414482, -22133578, 28165858, -38501160, -24210730, 32204202, -2316061, 7985955, --29461328, -6499360, -9434433, -937377, 45881524, -8494372, -2540473, 2803540, 20480552, -1464584, --22835268, -11392401, -17118666, 2902324, 54563264, 8717173, -22311818, 40315248, 28331752, -29948806, -29025926, 49683108, -2742337, -22982370, 31839130, -8584029, 32742146, 32149978, 24252070, -64873872, --42591044, -41345504, -17046726, -26764088, 33967824, 15978352, 27493160, -2049773, -59301152, -6357089, -7195144, 41744936, -3686693, 11558831, 34100968, -11076184, -28184112, 5140539, -3752191, 48161080, -27741194, -12408697, -22691386, 51049444, 1476395, 26829050, 9788767, 47835736, 37207840, 32741072, -1313186, -22950158, -15771120, -16898548, 35991288, -15524696, -27672474, -11447162, -417686, 1596117, -14959371, -13743895, 4266513, -74176768, 6909529, 14658723, 10948409, -29417304, -31478352, 11944304, -25446070, -30412126, 11317239, -16074452, -16286516, -19468550, -3539590, 26479010, -17336636, 28835336, --8058433, 13066364, -49328236, -27900644, -2529736, 28419262, 16585553, -31879394, -38661148, -14398878, -2698313, 43056512, 16077673, -94489, -26196616, -5927592, 11465952, 87300040, 8409546, -45814952, --104562056, -8871255, 61527552, 16164646, 26737246, -2179159, 37423124, -5608154, 16412144, -7951058, -21243982, 30873298, 16023449, -13694503, -34353832, 41429256, 46089296, -9354976, -45342508, -26657252, -5004711, 27618788, 9122511, 10677826, 2069101, 8015483, 3498251, 8020315, -8419747, -51352776, -303332, 34069828, 25766582, -8840116, 3318399, 21689584, 44824428, 28701118, 22524956, -24105504, --17008070, -2534031, -3573413, -37313604, 29166586, 18634252, 30387430, 61303680, -28766080, -17118666, --928787, -13860396, -12202539, -23139136, 48002164, -24909736, -27497992, -27727236, -7987029, 61821760, -18070002, 26394722, 2287070, -969052, -9445707, 40715752, 34231964, -10228465, -28221156, 17150878, -3351685, 1184874, -28027346, 5264556, 63607928, 54318452, 5090073, 7007239, -39060044, -66516160, --63817308, -26657788, 47130824, 57880052, 53935664, 34692600, -11140071, -32877974, -36194228, -18622978, -11515881, 25524454, 36104032, 6956774, -32285806, -21570400, -8172249, -21561810, -14354318, 9023189, -37563248, 61006788, 34541736, 21405580, 13650480, -32236950, -6883759, -68513320, -83456584, -46755552, --26988500, -18230526, 35207996, 63270772, 63045288, 63483912, 48816060, 25560960, 904628, -20421496, --9383967, -35449588, -73423000, -1205812, 4053912, 11710765, 20973400, 19022948, 21306260, -74179992, --45949172, -22963580, -48578764, -13853954, 31420906, -14362371, 20250234, 9460739, -23713588, 23606750, --20397874, 26193394, 19054622, -9111236, -37546068, -61729956, -72327248, -39911520, 10897406, -118135224, --61386356, -30361124, 40002252, 11003169, 153135984, 158792464, 118672632, 155196496, 160953904, 148202144, -105568688, 97850632, 106633840, 45268956, -4508105, -61349312, -98553392, -134919952, -132706440, -196864656, --119482232, -74590160, -60099476, -84480400, -43867184, -7224672, -63567128, -46082316, -51103668, -5851356, --28695750, -4700305, -40043052, -15179488, 31949724, 35822712, 13888850, 402653, 35181152, 32877974, --61394948, 24008868, 52830784, 111040472, 81126560, 106932872, 47174312, 50046568, 167843024, 99145024, -172128864, 68340984, 162600480, 120288072, 143822880, 195829040, 181568672, 155182000, 167029664, 190645552, -200246400, 179790016, 198315280, 147091360, 201686288, 173010416, 148262800, 166259264, 92603792, 184319056, -91319056, 71124120, -48287780, 21985400, -95662344, -107075144, -115826144, -3383897, 0, 0, -0, 0, 0, }, +-3688303, -1811939, -4158065, 384400, -4757750, 141734, 2228551, 1487132, -693100, -3057480, +2359548, 3493419, 202937, -1853278, -1523103, -1205275, -2942590, 1131724, 665183, 818728, +2069637, 4105452, 4027606, 979253, 3172370, 1658394, -1734093, 867583, 1382443, -275952, +499290, 465467, -446677, 2117956, -139050, 3839164, 3338800, -3635153, 2774012, 623307, +2270427, 445603, -366146, 95026, 6896107, 196495, 2267206, 558346, 1948841, 2699924, +544387, -1862942, 4030290, -5218386, -449898, 1494649, 4357781, 1412507, -661425, 3718905, +-404264, -3114388, 1017370, 1066226, 711891, -653372, 427886, -378494, -2338610, 723165, +-956704, -1605244, 1811403, -2806224, 2375117, -5189394, -13831405, -1182190, -2191507, -1902671, +230318, -2318209, 890669, 1352378, 5705864, -1919314, -195958, -5235029, 420907, 5266167, +403727, 3810173, -1082869, 1605781, -2156611, -3294240, 155693, 3631395, -417149, -4513474, +-137439, 4408247, 1482301, -1855963, -1511829, -179852, -546535, -995896, 112206, -709207, +-1447941, -156766, 964757, 652298, -134755, -3409667, 5199595, 7036230, 294205, 861141, +-2754148, -1555315, 627065, -3598646, -3977677, 2476049, -3217468, 2449742, 3175592, 3147137, +1232119, -408559, 907849, 705448, 2400887, -4966593, 498753, -592706, -3599720, -4897874, +193274, 2514167, -1851131, -234613, -562104, -347355, 3466039, 1685238, 385473, 1224066, +-1347009, -12506945, -3179350, 5121749, -947040, -3725347, 1410360, -9230422, -3884798, -1182190, +-1960116, -4689031, -5405217, 2960306, 4006668, 3848291, -5076652, -6910603, 534187, -3975529, +-7836705, 1903744, -753767, 2311766, 8229694, -2632815, -1175210, -5206574, 7068980, 729608, +3385508, 2691334, 5748814, 3223910, 1579474, -5834176, -967978, -5355824, -1809792, 385473, +-2605972, 1990181, 1265405, -2467996, -5409512, 3386045, 5024038, 1624571, -2842732, -3825742, +-2757369, 1377074, -4753992, -5520644, -1916629, 2881386, -1873680, 1460826, 3213173, 2311229, +-2956011, 5192616, 126165, 4417911, -3997541, -3046743, -2129767, -2137283, 2696703, -1726040, +-178778, 5137855, 1471026, 55835, -5285494, 1218160, -2365990, 3400540, -2513093, 3187940, +4596689, 1733556, -2746095, 1873680, -1251446, 1262720, 8558259, 5127654, -7102802, 4753455, +-3882651, -2065342, -978716, 19327, 3663607, 5906, 9978820, 2732136, -3762928, -2646237, +-2428267, 6841883, 1685775, 6577206, 2246805, 4370129, 7059853, 7886097, 3097208, -1087701, +-775778, 1030255, -6429029, -6201933, 1946157, -4763119, 2617246, 1035087, -1522029, -892816, +1917703, 6493991, -2178622, -2523830, -3431679, 8339753, -1134408, -10972568, -5313412, -4518843, +-3862249, 4141422, 4293357, 3443490, 5646272, 2174864, 3565897, -480499, -266825, -497679, +5715528, 1474248, 3409130, -7828652, 621160, -48318, 573915, 78920, 3464965, 1837172, +1237488, -4072166, -3171297, 18506478, 4529043, 2528125, -1901597, -1654099, 2229088, 974958, +5431523, 6309307, 98247, 9453223, 4313758, -3799436, -2826625, -591632, 5098126, -896574, +-2144799, 4842039, 1144609, 13785771, 4118874, 2453500, 1005022, -1708860, 1091995, 1793686, +3169149, -986769, 461709, 7235410, 1497333, 7998840, -3757023, -4360466, 3198677, 12182138, +4080219, 2675765, -632434, -5774047, -1670742, 1337882, 836982, -484258, 929324, -8055211, +1021129, -3752191, 3563212, 2053531, -2546379, 1390496, 3196530, 1426466, -3106335, -4107063, +1401233, 906775, 539555, -5191005, 1788317, -2293513, 3616363, -898185, 1167694, 1456531, +-143345, 547608, -1084479, -59593, 11654931, 572841, 4605816, -701153, -2226404, 642098, +1447404, -237297, 2610266, -4005594, -896038, 4374424, -2324651, -6419903, -233002, 10952167, +-950262, 8619999, 4141959, 11870216, 1196685, 1210644, 4044249, -3196530, -7248831, -9113384, +1918777, -4596152, 10572062, 6288369, 7381438, -1351304, -3471407, 1040993, 1420560, 3658775, +9833328, 1286880, 3904125, -4569309, 2895882, -3230352, 1036698, -1721745, 2975876, 5852430, +405874, 5586142, 1640678, 2807835, -2017561, -1318018, 6991133, -1717987, -2303713, 5596880, +-3810710, -316754, 311922, -2457258, -3752728, 2456721, -4251481, -738734, -5304822, -10171019, +-1717450, -1585917, -873489, -10614475, -4669167, -3285650, -3400540, 3901978, 9713605, -2723009, +2631741, 5373541, -2233920, 977642, 252866, 648003, -4240744, 4479651, -13898514, 1373853, +7169911, 4060355, -7889855, -401043, 155693, 1988033, 2607582, -271657, -6199249, -5566815, +671089, 9874667, 4394826, 5916855, 9546639, -6463926, 6742025, 13049184, -1426466, 3049964, +-7562901, 2649995, 2390149, -6146635, -3636764, -1227824, 2710124, -6221797, -8638790, 1721208, +645319, -7067906, 290447, 2376191, -1753420, 15397458, -1165547, -10737418, -1040456, 3838090, +8305393, 3264175, 3550327, -6867653, 1604170, 2269353, -6517076, -338766, -1378685, 10679973, +6174016, -1709934, -3974455, -8180839, 3218004, 3335579, -5184026, -137976, 1647120, 3238942, +2986613, -4177930, -427886, -912144, 9665287, -8380555, 750009, -2195802, 8723615, -663572, +-2389076, -3776350, 1049583, -3846143, -8650601, 5036386, 4933307, 1500017, -3287798, 806917, +2477659, 15895674, 10872173, 7830799, 11527155, 4420058, -747861, 1460826, 4420595, -11544335, +6093485, 30602, 6541235, -4728759, -2067490, -7474317, 2355253, 12829604, -12389370, -8150774, +-13179644, 6720013, -2779918, 333397, -5829345, 704375, -1977296, -6209986, 2658585, 2937758, +-9246528, -1364726, 2066416, -2156611, 5398237, -13915694, -6368363, 14179298, 1787780, -257161, +-1031866, 507880, -6830609, -7639673, 846645, -11110007, -2167885, 1173600, 3401614, -4726612, +-676994, 13917842, -456877, 4955319, 10738492, -9473624, -2881386, 2386391, 2894271, 1998234, +-2485176, -6686191, 8303246, -685584, -6898255, 5566278, -959388, 1448478, 2265059, -3794067, +-2524904, -1653562, -26331908, -15188615, 12419435, -4977867, -5290326, 6979322, 6752763, -11710228, +-14986215, -5230734, -5070209, -6072010, -589484, -10863046, -7170448, 3630858, 904091, -14489609, +-15213311, -9023189, -3788161, -992674, 8587787, -759672, -5318244, 4258997, -12517145, 253940, +-27380, 436476, 5171678, 2411087, -8916352, -7250442, 6356552, 1949378, 21926344, 5188858, +-6412923, 955630, 1382443, 235686, 6326487, 1121523, 3075734, -2108292, -3925600, 1499481, +-11461657, -2136209, -4538707, -6280316, 2229625, -9497783, 12186970, -1170916, 5610838, 8465381, +3304977, 4721780, 397821, -4766340, 737661, -79457, -5551782, 9234717, -2492155, 16027744, +581968, 728534, 1833951, -2563022, -7034083, 4408247, -5246840, 210990, 9738838, 6372658, +18834506, -10108742, 8460549, 4816806, 6048925, -1882806, -11754789, 2455648, -3816615, -9163313, +19396610, -542240, -6687801, -19224810, 11329050, 4308926, -1271310, -6648610, -9761387, 1087701, +19635516, 8558259, -1903744, -1207960, -10004589, -6411313, 4845797, 3463891, -8107825, -4085051, +6052683, 2607045, -1497870, 7005092, 8341900, 2288144, 11378979, 15097884, 7419019, -2533494, +1855426, 1932735, 1032940, 8229694, -11977590, 11919608, -2167885, -4929549, -10040560, 796716, +5856725, 5879274, -11674795, 2970507, 6458020, 1979443, -8975945, -15113453, -16110959, 4564477, +4634807, 1845225, -7419556, 45097, 9615358, -4472135, -10714333, -15899432, -369904, 4160750, +-14798310, 5680094, 9993315, -4605816, 6932614, 4380330, 23157390, 16411607, 2822331, -4093641, +-3326989, -2669322, -17188460, -5975910, -1018981, 11108933, -8363912, -3598109, -4369593, 781684, +16412681, -12845710, -4479651, -177704, 7209640, -2260227, -10841034, -16078747, 5003100, -10965052, +-6212134, -6667400, -8727910, 2906619, -14012331, -5867999, 10513006, 17714056, -255014, -10406706, +-10716480, 16330003, -2877628, -8266202, 15518791, 864362, -125091, 1028108, -19325206, 7689065, +-7931194, 6878927, 4861903, -12082280, -2617246, -12284143, 3555159, -11930882, -3414499, 5266167, +5512054, -3901978, 2759517, -14603426, 8655433, -1048509, 5379984, 5876589, 2603824, -3229279, +-4745402, 14698452, -11886859, 7289633, -4303021, -12506408, -9434969, -799938, 11228118, -7355669, +4189741, 2675228, -5660230, 6155225, -1511829, -3048890, 10009421, 1054415, -5531381, -14934675, +-138513, -19203336, 3794604, 858993, 9623948, -8164196, -1169305, 3963181, 4554276, 4423280, +-11917461, 16788490, 13059385, 1429687, 9782325, -5068062, -17261474, 3279745, -6986838, -9264244, +8858907, 19488414, 4045859, -6625524, -6965363, -17413408, 469225, -272194, 25640954, -10990821, +4832, -336081, -383863, -16318191, -16782584, 12418361, 880468, 6523519, -1878511, -20650202, +-10877542, 281320, -2961380, -5422933, -5279589, 11347304, -2439005, 6838662, -8685498, 16225313, +-20708722, 8801999, 11020349, 4840965, 5889474, 3520800, 16676284, 6670084, -1085016, 1564979, +234076, 14209899, 24672976, -5195300, 2113661, -9908490, 10575820, 13266080, -10468446, -1080721, +-21045876, -2687576, -26805428, -13190918, 10056666, -10438381, -23857470, 2583960, -13009993, 993211, +140123, -14666240, -14641544, 6910603, 13554380, 4614406, -16381542, 8148090, -18378702, -5896990, +-6926709, 6131603, -7683160, -2921652, 8477729, 1967095, -6172942, -12406013, 13455059, 13733695, +17023102, 2750927, -2079838, 1120987, 5365488, -781147, 6925635, -7234873, 9165997, -3117073, +10595684, 9113921, 6381248, -2556043, 396211, -16070694, 5634460, -3623879, 12506945, 2843268, +-29044180, 5039071, 14385456, 19851876, -11000485, -14566918, 18250390, 8811125, 12905840, -22127134, +11428908, 28999082, 30190936, 2467459, 1016297, 17578764, -11422466, -15209016, 10515154, -16955994, +7082938, -7775502, -6153615, -3739306, -36550172, -22006876, -16607028, -4265977, -16076599, -29395294, +22355842, 2892661, 7174743, -3377992, 15685757, 923418, -14303852, 11173357, 3847754, -4398584, +-8831527, -6041945, 1558536, 4387846, 13836237, -7677254, 10751914, 4066260, 19943144, -28848222, +-8367133, -4169340, 3282429, 12451647, 16881368, 4421132, -14600204, 10000831, 13181792, 11976516, +-3701725, 4481262, 348429, -4355097, -2447595, 1291175, 3954054, 2045478, 9642738, 2114198, +-13204340, 12351789, -13664438, -16442745, 2188286, 12625593, -6356015, -3965329, 4028679, 6355478, +10130754, -5622112, 4622996, 24121074, -9816148, -24901146, -32999308, -16212428, -22414898, 10336376, +19018652, 12520903, 4555350, 11724187, 6733972, 12849468, -10909754, 14382235, 7661148, 5582384, +15320685, 18881750, -5990406, 29911762, 2910377, 4696010, -6180458, 10878615, -34182036, -15084999, +-23340462, -24106578, 9641665, -21022254, 20773684, 23625542, 1109175, 5176510, -3546032, 4390531, +-22290344, 9287867, 24866250, -14008573, -28708636, 3926674, -10723460, -9061307, -27987080, 5011153, +10449119, 48318, -3681324, 9214852, -15891916, -2478196, 10572062, -5540508, -14059575, 1950452, +-6940131, 14937896, -9575093, -5125507, 13910862, 12234751, 25554518, 3693135, 6289980, -1976759, +6976101, 9440338, 15842524, -4090420, -368293, -9277129, 20835960, -25564720, 28151364, 1579474, +-11068668, 13779329, -10109816, -6777459, 25820270, -36397164, 6062347, -6918656, 7201050, -13356275, +6768869, 16042777, -7987566, 198105, -4525822, -4154844, -4366908, 30270930, -33194728, -5609228, +36696736, -14598594, -23267448, 2524367, -8994198, -7488276, -13214004, -15905338, 20167556, 9104794, +1029718, 9910100, 23946590, 14631343, -1919314, 5270999, 16022375, 21109228, -18687940, 8956081, +17144972, 7920457, 6133750, 24348170, 11329587, 5374615, -955630, 11172821, -1424855, 12602508, +9881646, 5921686, -11435887, 21628382, -17637820, -1759863, 26373784, 26698054, -6431714, -22834730, +8596914, 108448, 22629108, 39699456, 8616241, -5507759, 2638721, -21981642, -2779918, -5401458, +-4945655, 1023276, 19921132, -7985955, 8731669, 24720222, 4031901, -21598316, 14702210, -412317, +9360344, 23411330, 31875100, -8137353, -8412767, -1795833, -25172804, -35915052, 1121523, -15620259, +-2560874, -18988588, -1866163, 2356327, 3099356, 17406428, 2684, -6190122, 25182466, -47042776, +25982942, -19931332, -45969036, -13882408, -11424613, -1843078, -10438381, 5399848, -12555263, -28815472, +-17062832, -8761196, -2389076, 3073049, -11555610, 11305965, 22646288, 621160, -1180579, 5931350, +1608465, -4401805, -8090645, -4918275, 6300180, 6434935, -1755031, 6099391, 27778774, 7333657, +-7816304, -27585502, -4127464, 19029390, -23270670, -11343545, -8720394, -25233, -1564442, 14498736, +-4666482, 1423245, 20633022, 6904697, 22857280, -3602941, -10486163, -5363878, -5618891, -6372658, +11096048, 629750, 7537668, 13181255, -24146844, 2866891, -6336151, -15901043, -11353746, 22795002, +17061220, -201327, -11679090, 3534758, 9802189, -483721, 6564858, -18187040, -40857488, -21099026, +-15691126, 11391327, -108448, -7019587, 13771276, -18731426, 22468584, -2033667, -34890704, 6914898, +-16702054, -3769371, -2313377, -4424890, -22148072, 6768869, 1387811, 17457432, -38044284, 340913, +19063750, 1988570, -8884140, -19645180, -1321239, 10812043, 16687559, -14008573, -4726612, 8617315, +19024020, 16930224, -16494285, -3700114, -26840862, 12262132, 13803488, 8165807, -7587597, -2423435, +-7258495, -3183108, -8930311, 2279017, 19711216, -7609072, -7733089, -7067906, -11169062, 22017612, +19152870, -2185065, 26953604, -1530619, 9489193, -24160802, 19430432, 8425652, -27058830, -8946417, +30451854, 12501576, 7971460, 5768141, -14908905, -11563663, -16063178, 26577258, -14499273, 20592220, +20460150, -24097450, 54883776, -11705396, 33283312, 2100239, -9828496, -13904420, 23173496, 12238509, +-25979720, -3645890, 13459354, 22957138, 1889786, -19447076, 9289477, -37485936, -10013179, -34120292, +-47046536, 1329292, -18216030, 5710696, -3706020, -7730405, -18124762, -12706661, 10167261, 27763206, +-23912230, -5588826, -40977748, -36197448, 9341554, 13618268, -22798224, -24019068, 882616, 4397510, +-38315940, 1178432, 111132, 18689550, -17666812, -214212, 15417859, -11602317, -20492900, -23040352, +-11550241, -21179558, -17414482, -22133578, 28165858, -38501160, -24210730, 32204202, -2316061, 7985955, +-29461328, -6499360, -9434433, -937377, 45881524, -8494372, -2540473, 2803540, 20480552, -1464584, +-22835268, -11392401, -17118666, 2902324, 54563264, 8717173, -22311818, 40315248, 28331752, -29948806, +29025926, 49683108, -2742337, -22982370, 31839130, -8584029, 32742146, 32149978, 24252070, -64873872, +-42591044, -41345504, -17046726, -26764088, 33967824, 15978352, 27493160, -2049773, -59301152, -6357089, +7195144, 41744936, -3686693, 11558831, 34100968, -11076184, -28184112, 5140539, -3752191, 48161080, +27741194, -12408697, -22691386, 51049444, 1476395, 26829050, 9788767, 47835736, 37207840, 32741072, +1313186, -22950158, -15771120, -16898548, 35991288, -15524696, -27672474, -11447162, -417686, 1596117, +14959371, -13743895, 4266513, -74176768, 6909529, 14658723, 10948409, -29417304, -31478352, 11944304, +25446070, -30412126, 11317239, -16074452, -16286516, -19468550, -3539590, 26479010, -17336636, 28835336, +-8058433, 13066364, -49328236, -27900644, -2529736, 28419262, 16585553, -31879394, -38661148, -14398878, +2698313, 43056512, 16077673, -94489, -26196616, -5927592, 11465952, 87300040, 8409546, -45814952, +-104562056, -8871255, 61527552, 16164646, 26737246, -2179159, 37423124, -5608154, 16412144, -7951058, +21243982, 30873298, 16023449, -13694503, -34353832, 41429256, 46089296, -9354976, -45342508, -26657252, +5004711, 27618788, 9122511, 10677826, 2069101, 8015483, 3498251, 8020315, -8419747, -51352776, +303332, 34069828, 25766582, -8840116, 3318399, 21689584, 44824428, 28701118, 22524956, -24105504, +-17008070, -2534031, -3573413, -37313604, 29166586, 18634252, 30387430, 61303680, -28766080, -17118666, +-928787, -13860396, -12202539, -23139136, 48002164, -24909736, -27497992, -27727236, -7987029, 61821760, +18070002, 26394722, 2287070, -969052, -9445707, 40715752, 34231964, -10228465, -28221156, 17150878, +3351685, 1184874, -28027346, 5264556, 63607928, 54318452, 5090073, 7007239, -39060044, -66516160, +-63817308, -26657788, 47130824, 57880052, 53935664, 34692600, -11140071, -32877974, -36194228, -18622978, +11515881, 25524454, 36104032, 6956774, -32285806, -21570400, -8172249, -21561810, -14354318, 9023189, +37563248, 61006788, 34541736, 21405580, 13650480, -32236950, -6883759, -68513320, -83456584, -46755552, +-26988500, -18230526, 35207996, 63270772, 63045288, 63483912, 48816060, 25560960, 904628, -20421496, +-9383967, -35449588, -73423000, -1205812, 4053912, 11710765, 20973400, 19022948, 21306260, -74179992, +-45949172, -22963580, -48578764, -13853954, 31420906, -14362371, 20250234, 9460739, -23713588, 23606750, +-20397874, 26193394, 19054622, -9111236, -37546068, -61729956, -72327248, -39911520, 10897406, -118135224, +-61386356, -30361124, 40002252, 11003169, 153135984, 158792464, 118672632, 155196496, 160953904, 148202144, +105568688, 97850632, 106633840, 45268956, -4508105, -61349312, -98553392, -134919952, -132706440, -196864656, +-119482232, -74590160, -60099476, -84480400, -43867184, -7224672, -63567128, -46082316, -51103668, -5851356, +-28695750, -4700305, -40043052, -15179488, 31949724, 35822712, 13888850, 402653, 35181152, 32877974, +-61394948, 24008868, 52830784, 111040472, 81126560, 106932872, 47174312, 50046568, 167843024, 99145024, +172128864, 68340984, 162600480, 120288072, 143822880, 195829040, 181568672, 155182000, 167029664, 190645552, +200246400, 179790016, 198315280, 147091360, 201686288, 173010416, 148262800, 166259264, 92603792, 184319056, +91319056, 71124120, -48287780, 21985400, -95662344, -107075144, -115826144, -3383897, 0, 0, +0, 0, 0, }, { 15113453, --1633698, -2529736, 694174, 1110786, 4139812, -1085016, -2465311, -4063039, 4425964, 384400, -1467805, 4436165, 1223529, -699006, 1129576, 2338073, 1537598, -2365453, 5131949, 536871, --6700149, -1268089, 4452808, 1720671, 485868, -2434173, -1402307, 2183991, -816044, 8834748, --1593433, 2013803, 346282, 805843, -4951561, -1691143, -1029182, 1817308, -663572, 1092532, --2844879, -1573032, 1886564, 2798171, 1957968, 3325915, 3411278, 2185602, -3005403, -4722317, -593779, 2790655, 3081639, 2320893, -1652489, -2074469, -7317014, 3772592, -1742146, -2819109, --473520, -1253594, 1475321, -3479461, 1503239, -4404489, 1876364, -4182761, 3798899, -1668595, -3176665, -807991, -527744, -4976794, -453656, -7773891, -15089831, -2759517, 307090, -3581466, --7044283, -2458332, 5346698, -8506183, -4537633, -2880849, -1538672, 2573759, -1091459, 2877628, -1470489, 2509335, -179315, 3129958, -2700998, 431644, -1121523, 517544, 8223789, -1817845, --385473, -4110821, 5128191, 3022583, 2527588, 6167036, -3082176, -1905892, 2256469, 5514201, --1393717, -459562, -4403415, -5039071, -3194919, 3453154, -4278861, -3854196, -357019, 4955856, --6699075, -1531693, -5577552, -2843268, -1511292, 704912, -395674, -4161823, 5352066, 816581, -4825933, -1980517, -1082869, -5944772, -19864, -2131915, -2112050, 3311420, 1995549, -1120450, -1903207, 3677029, -1000191, 1546725, -2640868, -1602560, -649077, -2569464, 2173254, 778463, -1483374, -12412455, -4581657, 3688840, -3404299, -1400159, -1497870, 1782948, -738198, -3214783, -5102958, 4737886, 1448478, -505196, 2303176, -6342056, -1053341, -6269042, -3312494, 4752382, --900869, 906238, -763967, -658204, -20938, 9858561, 8832600, 4070019, 4649839, 5735929, --1234266, -590558, -2097555, 5065914, -637266, -1839320, 1252520, -2857227, 1840930, 3659312, --2007897, 4117263, 4415227, 9007083, -3682398, -4168803, 3645890, -2259153, -68183, 1940788, --5410048, 368293, -2939368, -2996814, 6667937, 4110821, 4721243, -2777233, -4001836, 2693481, --4635881, 3129958, 13005161, 830539, 581968, 3080565, 931471, 1334661, 7159174, -3920768, --1509681, 1563905, 409633, -3529926, -3508452, -3468723, -2874407, -615254, -3712462, 4012036, -6310381, -3007551, 3088618, 10081362, 3279208, 2341294, -7096360, 5856725, 1445793, -8991514, -3742527, -2499134, -5510980, 2215666, -847182, 2132988, 5149666, -5486284, -5889474, -2554969, -7770133, 238908, 3801046, 8165807, -12233677, -9768903, 1478006, 5980205, -4498442, 388695, -7973607, 2085207, -1168768, -2440078, 9557376, 1174674, -2489471, 1340030, -8922258, 978179, --4986457, 4449586, 636729, 4721780, -2546916, -1230508, 1989644, 97711, 457414, 220654, -4385162, 3609920, -5190468, 2793876, 3839164, -6951942, 607201, -3190087, 1061931, -1683090, --5557688, -37581, 4307316, 3837017, 8533563, -5634997, 6504191, -4713190, -1290638, 3834869, --4860829, -6861211, -2859375, 20041392, 9178345, 12083890, -858993, -3522947, -4279935, -4565014, -2530273, -3860639, 5750961, -789737, 7843147, 311385, 4203699, 4911295, 4036196, 3192771, -4559645, -15155866, -4319127, -1580548, -3048353, -2949569, -4609037, -10857677, 588411, 7130183, --4396436, 4201552, -3511136, -5524939, -3918084, 405338, -3291556, -1468879, -3379066, -456877, -8924405, 248571, 4066797, 5347235, 7354058, -3645890, 1799591, -1869921, -5497022, 6099928, --3455301, -527744, -5437429, 3770445, 51540, -201863, -1421097, -2888903, 1989107, 5352603, --2263985, 2852932, 3157875, 2176475, 9904731, -10227391, -4000762, -196495, -5236102, -7490423, --2573759, -9115531, 1546188, 9458592, -6599218, -4017942, -7424388, -342524, -1603097, -4742181, --4812511, -584116, 6470368, 8751533, -4749697, 4461934, -3833795, -2157147, -1389959, -11286100, -8286066, -2538863, -955093, 12614319, 8194798, 8373039, -3240553, 147640, 1772748, -2149094, -3100967, -6702297, 84826, -4638028, 5491653, -5247913, -3227131, -699006, 1171452, -6434398, -1495722, 504659, 8535174, -98784, -10952703, 6331856, 6393059, 8506720, -1051730, 2028835, --5891622, -4844723, -1619740, -4705137, 2147484, 1046361, -1329292, -827318, 5095442, 7195681, --9644886, -2310156, 411243, -4256850, -3856344, 6500970, -4889284, 2370285, -4767951, -7082401, --4670777, -3565360, 2930242, 843961, 12986370, -2232309, -2733210, 3576097, -3086471, -1215476, --2615635, 3343632, -2306934, 4349728, -1403917, -2173254, 3969087, 6934225, -15254113, 14665703, -8145406, -9035001, -8754754, 3483755, 11960947, -348966, 3634079, 13544179, 4778688, 3952981, --2142652, 6973953, 6713034, 7355669, -13407277, -8521215, -8065949, 6328635, 5788006, 6977711, -515933, -8470212, 3582003, -1436667, 3922916, -12097849, 4776541, 7042136, -5422396, 2943663, -6009733, 1456531, -9664, 1072131, -1710471, 10253161, 7251516, 5400922, 366683, 3442953, -8207683, -7374459, -3717831, 168041, 10794863, 6623914, 4330938, -8215199, 430034, 5255966, -6485401, -2440615, 2087891, 6002217, 7796977, 2210298, 7203197, 2593087, -722091, -6809671, -8590, -11198053, -4457639, -5538361, 896038, 3271155, -6408091, -2957622, -11722039, 4546760, --3508452, -724239, 5564130, 7954817, 9414568, 2218888, 12882218, 4290136, -2414309, -5738077, --15693810, -7323993, 9307194, -3134789, -14445049, -3608846, -2455111, 2375117, 7685307, 12238509, --903017, 3743064, -2958696, 6199249, -6923488, -6955163, -7908646, -13482976, 7097971, 4367445, --11648488, 555661, -8570070, -2980707, 7147363, 4382478, 5785321, -1483911, -1823751, -1751273, -12752832, 10335302, 10471130, -4660040, -9433896, 7475391, -1507534, -3024731, 8961986, 1876364, -8802535, -54761, 4781373, -6150930, -650151, 4820027, -19826642, -2687039, 595927, -14011257, -3345243, -3365644, 12947179, 8776766, -8554501, 941135, 11752104, -950262, 5764920, -3758097, -7905424, -3542274, 1169305, -2863133, -304406, 6235219, -8462696, 8931921, 3809099, 5222680, -753767, 10964515, -31454730, -6573448, 16818018, -13512504, -4936528, 14420890, 5403069, -4410395, -1545651, -11702175, 10625749, -1173063, -19030464, 1555852, -909996, 7429220, 7199439, -3566970, --14829985, -6162741, -5558225, 587874, -7802345, -4093641, -9975598, -2612414, 11312944, -8774081, --4328790, -3144990, -5653788, -5874979, -8195872, 6202470, 1498407, 7640210, 1608465, -4866198, --7853348, -7641284, -1269700, 5916855, 8415988, -2281702, -6808060, 8207683, 3677029, -10837276, --12212203, -25355876, -1727651, -7631620, -4413079, 4565550, 4604205, 3134789, 12375411, -413927, --4826470, 153008, -5204427, 14231374, 7943542, -1604170, 8050916, -6425808, 4745939, 4228396, --6220724, -1931125, -5361193, 6141267, 4625680, -10422275, 9404905, 14212047, 319438, 6449431, -19986094, -8885214, 7065221, -4260608, -906775, 12782896, -4309463, -4483409, -3685619, -280247, -1225676, 8947491, 26569204, -686658, 768262, 8437463, 882616, 945430, -13744432, -12548284, -1147293, 2638721, -9314710, -3477850, -2863670, 8411693, -4309463, 2278480, -1121523, 4120484, --4394289, 16824460, 7932268, -6693707, 7834557, 8776229, -10692321, 2486249, 3120294, 3999688, --3721589, -2498060, 12307766, -10901164, 3885872, 15553687, -6230387, 2626373, 8357470, -243739, -7096360, 5320928, -1040456, 5319317, 5861020, 10516764, 4866735, 1596654, -1650878, -5884642, --8766028, 1102733, -599685, -22461068, 13705241, -2722473, -8828305, -7221451, -18854906, -18394272, --14515379, 3282966, 7248831, -2526515, -1728188, -595927, 27845346, 28665148, -1188095, -23117124, -4172561, 5108327, -3121368, 6430640, 3072512, 2319819, -742493, -3714073, 22389128, 4466766, --4201015, -25276956, -14875082, 6220724, -2152852, -8684424, -15882789, 2299955, 1970853, 4071092, --4460861, -16637093, -18560164, 19487340, 17638356, 5808944, 16109349, -14341433, 1186485, 7587597, --3842922, -9115531, -17267380, -8128226, 2019708, -725850, -8632347, 7874286, -820876, 7613904, -5222680, 319975, -18728204, -10402948, -9431748, -1595044, 627065, 2132451, -4261145, -5235565, --118112, 2575907, -17208860, -4294968, 1067299, 3189013, -8794482, -20164872, -6364605, -5432597, -12682502, -1096827, 4478041, -7206419, -7323456, -9531069, -12484396, -6585259, -1402307, -1681480, -8664023, -8420283, -2525441, -5384815, 6208375, -4382478, 13399224, -7416872, 3269007, -5857262, -2078764, 2129230, -6594923, -6325950, -12657805, -16351477, -8872866, -5018133, 455803, -712428, --7279433, -8916889, -14649597, 6515466, -14675366, -21501680, 14369887, -13331042, -14369887, 13401909, -3966402, -4375498, 16779900, 7871602, -10851235, 10064182, -29570312, -3200825, -6656126, -4413079, --13209709, 24232206, 13173202, -8566312, 5037997, 6846178, -3976066, 7667054, 1487132, -777926, --5870147, 7386807, 11275900, 12149926, -19479288, -1940788, 1314260, 4959614, -7988103, -4867809, --8120173, -10755135, 18189186, 4080219, -10831371, 5100811, -6027987, -9505299, -11629161, -25651692, -8165807, 14695231, 3010772, 14826227, 24019068, -2595234, -6743636, -21937620, 4192425, -3299072, --17152488, 1921461, -38797512, -26796300, -18447958, 9802189, 19924354, -28185722, 6906308, 19266150, -12629351, -693637, 7683697, 18149994, -8038568, -1513976, -4912369, 146566, -11557220, 8176007, -688269, 619549, 3686693, 24485072, -731755, -11364483, -10152229, 5543192, 18862422, -7781944, --17990544, 5123359, 19156092, 10468446, -1925219, 8644695, 6692096, 8315594, 2542084, 6985765, -13232257, -1954210, -20616916, 683974, 7213935, -20305532, -13866839, 19100256, 15988016, -15438260, --9138617, 4362613, -264141, 9153649, 24471114, -5510443, -3785477, 4076461, -390305, 8325257, -5256503, -9112310, -5871221, -3766686, 7905424, 5753646, -5287105, -17794586, -1945083, -26565984, -25616258, 3240016, -3243237, 1145683, 11451457, -2388539, -10073309, -4803384, -1575716, -15209553, --654983, 2559801, -18600430, -4963909, 13945222, 18080738, 12821014, 33805688, 20402706, 30605400, -11402601, 7951595, -15964930, 17083770, -5905580, -2127083, -12828530, -8671002, 16542603, -5681168, -37664716, 17345226, 10759430, -2286533, 8579734, -6234145, -17820356, -9232569, -11137924, 7636989, --10524280, -587874, -11258720, 6091874, 15161771, 13479755, -1140851, 19647864, 16535624, 330176, --6083821, -8152922, -14006962, -5243082, 31395138, 11731166, 36175436, -12320114, -76773, -1847910, -8235063, 28594818, 9761924, 14496, 18548354, 20813948, 22513144, -2836826, -13670344, -5769215, --3914326, -4764730, 14916958, 9346386, 14194330, 20820390, -13682692, 31918050, -22162568, -42933568, --6276558, -14529337, 8869644, 19144816, 32694364, -16531329, -12008192, 11009612, -9009768, -2261837, --3908420, 3833795, 14655502, 14663555, 22950694, -24932286, 28174448, -10365367, 3047279, -13118441, -12023761, 20480552, 9076340, 3508988, 1998234, 25084220, 6810745, -1138703, -7814693, -4145180, --25509422, -3764002, -12076911, -31625992, 3317862, -2060511, 13492103, -32859722, -5728950, 7577933, -12814572, 27183922, -6753836, 7912941, 15644955, 2263448, -2986613, 7765301, -6394670, -1754494, --39986684, 3745212, -16462073, -20268488, -21799106, 9481677, -35543000, 12394739, -12551505, -18012020, --23671176, 22981834, 25852482, 24555938, 6586869, 4990215, 24584930, -30880278, -930934, -8980240, -15129022, -36643052, -10342818, -2966212, 14861124, 10471667, 10945724, 15967615, -10252624, 5651640, --10739029, -29021630, -1141924, -9951976, 34495568, 7961259, 24261734, -7455527, 33349884, -20587926, --40371620, 9721658, 6310918, 5296232, -20245402, -21814138, -18078054, 7424925, -18169322, 8666170, --9763534, 27438936, -8941048, -3126199, 18933826, 1512365, -47925392, -18887656, -795106, 32432372, --3719979, -8856759, -27429808, 5792301, -6767795, -22477712, -27856084, -2127620, 5196911, -8461086, --10479183, -26734560, 18476950, -5710159, 6828461, -12642773, 936840, 9575093, 5447093, 25975426, -714038, -7097434, -31486942, -9865003, 16110422, -20444582, -10457172, 9663140, 18447422, 15360951, -36069136, 28493350, 1568737, 22114786, 22067542, 8977019, 2197950, 14204531, -8840116, 55188184, --22565758, -55537148, 17549774, -46612744, 725313, -35461396, 3251827, 50035296, 23487566, -34894460, --21047488, -15106474, -10440529, 12359842, 22417044, -13485124, 2854543, 17654464, -36453000, 1753957, -10433012, -29640106, 16410533, -10503879, 14708116, 3991635, 16413754, 707059, -16836272, 18363670, --22416508, -6075768, 48636748, -19979650, 19015968, -11871290, 21191906, 16894790, -4178466, -21174188, -23841364, 56168508, -29023242, 7536594, -39139500, 20384452, 14760729, -22810034, 27041114, 1930588, --47228536, 6774237, 4844723, 22340810, -3584150, -3740917, -23471996, -25513180, -10349797, 61780420, --6691559, 31374736, -24730422, 20697984, 13100724, -5586142, -18107046, -3743601, 20713016, 35108672, --9191230, -11256036, -78383, 7403450, 34125664, -6927246, -3053185, -21492554, 11374684, -32548872, --10116795, 25892748, 34988416, 5447093, 7211250, -34439732, 24910810, 19147502, -40375376, 1477469, --19887846, 127238, -44656924, 45044008, 44311176, -6890202, -18779744, -10131291, -5769215, 20551418, --20783346, 27277874, -36678484, -25561498, 14358613, 11511586, 6319508, 11045582, 40944460, 8376260, -20645370, 2145873, 21391084, 10408316, -5146982, 1312649, 18757196, -3511673, 2195265, 27756226, -17132088, 37206228, 52076, 20192252, 3837553, -31334470, 33512020, -17658758, 677531, 6815576, --23337242, -20864952, 14942728, 40845140, 27981712, 13342853, -50934556, -15117211, -34138012, -2517388, -67330592, 38896836, 52419540, 1684701, -40145596, 12305618, 52308944, 7946227, -5292474, 39664560, -11256572, 26207354, -63747516, -60058676, 50494320, -3593814, -10132365, -44777720, 379031, -14394046, -31027380, 21861384, 9682467, 15945603, -38615516, 21630530, 34923988, -219580, 13540421, -32060320, -25355876, -16117939, 13403519, -1761474, 2500208, 16515223, -3609920, 9692131, -1681480, -26533772, -8655970, -4689568, 28687698, 19860466, 35095788, 7701950, -22686018, -23971824, 23622856, 20488604, -13432510, -1372242, 9951439, -10095321, -18115098, -190589, -5158256, 25262998, 22793392, 13799730, -25565256, 19558208, -30063160, 31699542, 37955164, 21488258, -14849313, -20201378, -19917374, 26510148, -21170968, 46386184, -28327994, -36266168, -20848308, -51029580, -8603893, 43231532, 11246909, 32310502, --37511172, -50707996, 13491029, 20725902, -34274912, -1795833, -26049514, 3644817, -30269856, -12293270, -22594212, 7085086, -25419764, 372588, -16235513, -63424320, 9323300, 39062728, -1226750, -78683800, --16837882, -1178969, 275415, 28491740, -74698072, -7698729, 32639604, -53870700, 11398306, -11815992, -62566400, 34146064, -39909372, 10043781, 41625212, 4750771, -18234820, 14413910, 8977019, 5872294, --2178622, -4083977, 1851131, 7093676, 13137768, 44040056, 33640868, 38432976, 24595130, 48330192, -21806622, 49332532, 18530100, 43645996, -1348083, 26891328, 22507240, 26548266, 18565534, -2595771, -5872831, -34452616, -22432078, 63391568, -1577327, -26606786, -9663140, 19093814, 31270584, 67916856, --12002823, -39366060, -21913996, -29512868, 36503464, 43414604, 47472272, 13882408, -4933844, 32189706, --61244088, 50685984, 16648367, -30153892, -4033511, -92733712, -1535988, -62268972, -86595128, -23243826, --52696028, -23509040, 89358944, 84272088, 74320648, -21633750, 56481504, 69455528, -57583700, -52101712, -17289928, 60788820, 1128503, -27897960, -181999, 16816408, 17731772, -49504328, 18166102, -6195491, -25941066, -26927298, -13648869, -31607738, 33459942, -4060892, -15501074, -29446296, 21486110, 13646185, --5771899, -24704116, 11271605, 11995844, 5344013, -21641266, -3941706, -261456, 25194278, -18631568, --5585068, -27604828, -8411693, 10982768, 21826486, -28598040, -12401718, 32993402, 26045218, -6965900, --20417738, 1360968, -11115912, 28111098, -16582332, -6614787, 11265699, 11519639, 14491757, -12486544, -2741800, -17800492, 21128554, 29856466, 10765872, 6969658, -23893976, 27308476, -19954418, 40960028, --30577482, 33928096, -50874960, 36171676, 234076, 1887101, -37774776, -4619774, 5814312, -2275259, --2499134, -1524713, -12630962, 55407764, 58331560, -34177204, -20724290, 11953968, 55705724, 35119948, -20587388, 20410758, -9185324, -23077396, -7354595, 13515725, -460098, -5150740, 16452409, 668404, -11528766, 1831267, -6498286, -20593832, -5800354, -818728, 1329292, -409096, -17268990, 19475530, -2974802, -7216082, -622770, -124554, 87510, 12772696, 22408992, 10128070, 2127083, -7611219, --11827266, -2491618, 7211250, 15699179, 20273856, -10783589, -11317776, 3163244, 20542292, 9946607, -4562866, -8616778, -18695992, 16681653, -3248069, 1230508, 1170916, 5974837, 5070209, -1365800, --470299, -11213086, 2168959, 11818676, -4702989, 7599945, -3060701, -7376070, 6245956, -167504, -3970161, 1043677, 10710038, 8366060, -11973295, 6646462, 3745748, -21616570, -19639274, -72522672, -30721902, 112317688, 103244568, 88463976, 35081828, -83498456, -52515100, -75024488, -84443352, -75151192, --22042846, 16596827, 63520956, 66533340, 79271136, 52864068, 52960168, 1664300, -55736328, -52855480, --65612068, -50938848, -28549184, -1509681, -18364206, 20388210, 24653650, 40328668, 43862892, 44962404, -26599270, 2762201, 11899744, -9242770, 6459094, -29853244, -21948356, -27530204, -45802604, -35847408, --27740120, -19056770, -32442572, 5283884, 56150256, 63887100, 35576824, 66820028, 16752520, 39405788, -20255602, 12282533, -16070694, -34169688, -47678968, -66659504, -51311976, -76097160, -31238908, -33056752, -23133230, 23775866, 65812320, 76304928, 67755256, 61146376, 59515360, 38570952, 6681359, -17242146, --58684284, -34739844, -75764832, -62251792, -83965536, 5574868, 3627100, 11296301, 0, 0, -0, 0, 0, }, +-1633698, -2529736, 694174, 1110786, 4139812, -1085016, -2465311, -4063039, 4425964, 384400, +1467805, 4436165, 1223529, -699006, 1129576, 2338073, 1537598, -2365453, 5131949, 536871, +-6700149, -1268089, 4452808, 1720671, 485868, -2434173, -1402307, 2183991, -816044, 8834748, +-1593433, 2013803, 346282, 805843, -4951561, -1691143, -1029182, 1817308, -663572, 1092532, +-2844879, -1573032, 1886564, 2798171, 1957968, 3325915, 3411278, 2185602, -3005403, -4722317, +593779, 2790655, 3081639, 2320893, -1652489, -2074469, -7317014, 3772592, -1742146, -2819109, +-473520, -1253594, 1475321, -3479461, 1503239, -4404489, 1876364, -4182761, 3798899, -1668595, +3176665, -807991, -527744, -4976794, -453656, -7773891, -15089831, -2759517, 307090, -3581466, +-7044283, -2458332, 5346698, -8506183, -4537633, -2880849, -1538672, 2573759, -1091459, 2877628, +1470489, 2509335, -179315, 3129958, -2700998, 431644, -1121523, 517544, 8223789, -1817845, +-385473, -4110821, 5128191, 3022583, 2527588, 6167036, -3082176, -1905892, 2256469, 5514201, +-1393717, -459562, -4403415, -5039071, -3194919, 3453154, -4278861, -3854196, -357019, 4955856, +-6699075, -1531693, -5577552, -2843268, -1511292, 704912, -395674, -4161823, 5352066, 816581, +4825933, -1980517, -1082869, -5944772, -19864, -2131915, -2112050, 3311420, 1995549, -1120450, +1903207, 3677029, -1000191, 1546725, -2640868, -1602560, -649077, -2569464, 2173254, 778463, +1483374, -12412455, -4581657, 3688840, -3404299, -1400159, -1497870, 1782948, -738198, -3214783, +5102958, 4737886, 1448478, -505196, 2303176, -6342056, -1053341, -6269042, -3312494, 4752382, +-900869, 906238, -763967, -658204, -20938, 9858561, 8832600, 4070019, 4649839, 5735929, +-1234266, -590558, -2097555, 5065914, -637266, -1839320, 1252520, -2857227, 1840930, 3659312, +-2007897, 4117263, 4415227, 9007083, -3682398, -4168803, 3645890, -2259153, -68183, 1940788, +-5410048, 368293, -2939368, -2996814, 6667937, 4110821, 4721243, -2777233, -4001836, 2693481, +-4635881, 3129958, 13005161, 830539, 581968, 3080565, 931471, 1334661, 7159174, -3920768, +-1509681, 1563905, 409633, -3529926, -3508452, -3468723, -2874407, -615254, -3712462, 4012036, +6310381, -3007551, 3088618, 10081362, 3279208, 2341294, -7096360, 5856725, 1445793, -8991514, +3742527, -2499134, -5510980, 2215666, -847182, 2132988, 5149666, -5486284, -5889474, -2554969, +7770133, 238908, 3801046, 8165807, -12233677, -9768903, 1478006, 5980205, -4498442, 388695, +7973607, 2085207, -1168768, -2440078, 9557376, 1174674, -2489471, 1340030, -8922258, 978179, +-4986457, 4449586, 636729, 4721780, -2546916, -1230508, 1989644, 97711, 457414, 220654, +4385162, 3609920, -5190468, 2793876, 3839164, -6951942, 607201, -3190087, 1061931, -1683090, +-5557688, -37581, 4307316, 3837017, 8533563, -5634997, 6504191, -4713190, -1290638, 3834869, +-4860829, -6861211, -2859375, 20041392, 9178345, 12083890, -858993, -3522947, -4279935, -4565014, +2530273, -3860639, 5750961, -789737, 7843147, 311385, 4203699, 4911295, 4036196, 3192771, +4559645, -15155866, -4319127, -1580548, -3048353, -2949569, -4609037, -10857677, 588411, 7130183, +-4396436, 4201552, -3511136, -5524939, -3918084, 405338, -3291556, -1468879, -3379066, -456877, +8924405, 248571, 4066797, 5347235, 7354058, -3645890, 1799591, -1869921, -5497022, 6099928, +-3455301, -527744, -5437429, 3770445, 51540, -201863, -1421097, -2888903, 1989107, 5352603, +-2263985, 2852932, 3157875, 2176475, 9904731, -10227391, -4000762, -196495, -5236102, -7490423, +-2573759, -9115531, 1546188, 9458592, -6599218, -4017942, -7424388, -342524, -1603097, -4742181, +-4812511, -584116, 6470368, 8751533, -4749697, 4461934, -3833795, -2157147, -1389959, -11286100, +8286066, -2538863, -955093, 12614319, 8194798, 8373039, -3240553, 147640, 1772748, -2149094, +3100967, -6702297, 84826, -4638028, 5491653, -5247913, -3227131, -699006, 1171452, -6434398, +1495722, 504659, 8535174, -98784, -10952703, 6331856, 6393059, 8506720, -1051730, 2028835, +-5891622, -4844723, -1619740, -4705137, 2147484, 1046361, -1329292, -827318, 5095442, 7195681, +-9644886, -2310156, 411243, -4256850, -3856344, 6500970, -4889284, 2370285, -4767951, -7082401, +-4670777, -3565360, 2930242, 843961, 12986370, -2232309, -2733210, 3576097, -3086471, -1215476, +-2615635, 3343632, -2306934, 4349728, -1403917, -2173254, 3969087, 6934225, -15254113, 14665703, +8145406, -9035001, -8754754, 3483755, 11960947, -348966, 3634079, 13544179, 4778688, 3952981, +-2142652, 6973953, 6713034, 7355669, -13407277, -8521215, -8065949, 6328635, 5788006, 6977711, +515933, -8470212, 3582003, -1436667, 3922916, -12097849, 4776541, 7042136, -5422396, 2943663, +6009733, 1456531, -9664, 1072131, -1710471, 10253161, 7251516, 5400922, 366683, 3442953, +8207683, -7374459, -3717831, 168041, 10794863, 6623914, 4330938, -8215199, 430034, 5255966, +6485401, -2440615, 2087891, 6002217, 7796977, 2210298, 7203197, 2593087, -722091, -6809671, +8590, -11198053, -4457639, -5538361, 896038, 3271155, -6408091, -2957622, -11722039, 4546760, +-3508452, -724239, 5564130, 7954817, 9414568, 2218888, 12882218, 4290136, -2414309, -5738077, +-15693810, -7323993, 9307194, -3134789, -14445049, -3608846, -2455111, 2375117, 7685307, 12238509, +-903017, 3743064, -2958696, 6199249, -6923488, -6955163, -7908646, -13482976, 7097971, 4367445, +-11648488, 555661, -8570070, -2980707, 7147363, 4382478, 5785321, -1483911, -1823751, -1751273, +12752832, 10335302, 10471130, -4660040, -9433896, 7475391, -1507534, -3024731, 8961986, 1876364, +8802535, -54761, 4781373, -6150930, -650151, 4820027, -19826642, -2687039, 595927, -14011257, +3345243, -3365644, 12947179, 8776766, -8554501, 941135, 11752104, -950262, 5764920, -3758097, +7905424, -3542274, 1169305, -2863133, -304406, 6235219, -8462696, 8931921, 3809099, 5222680, +753767, 10964515, -31454730, -6573448, 16818018, -13512504, -4936528, 14420890, 5403069, -4410395, +1545651, -11702175, 10625749, -1173063, -19030464, 1555852, -909996, 7429220, 7199439, -3566970, +-14829985, -6162741, -5558225, 587874, -7802345, -4093641, -9975598, -2612414, 11312944, -8774081, +-4328790, -3144990, -5653788, -5874979, -8195872, 6202470, 1498407, 7640210, 1608465, -4866198, +-7853348, -7641284, -1269700, 5916855, 8415988, -2281702, -6808060, 8207683, 3677029, -10837276, +-12212203, -25355876, -1727651, -7631620, -4413079, 4565550, 4604205, 3134789, 12375411, -413927, +-4826470, 153008, -5204427, 14231374, 7943542, -1604170, 8050916, -6425808, 4745939, 4228396, +-6220724, -1931125, -5361193, 6141267, 4625680, -10422275, 9404905, 14212047, 319438, 6449431, +19986094, -8885214, 7065221, -4260608, -906775, 12782896, -4309463, -4483409, -3685619, -280247, +1225676, 8947491, 26569204, -686658, 768262, 8437463, 882616, 945430, -13744432, -12548284, +1147293, 2638721, -9314710, -3477850, -2863670, 8411693, -4309463, 2278480, -1121523, 4120484, +-4394289, 16824460, 7932268, -6693707, 7834557, 8776229, -10692321, 2486249, 3120294, 3999688, +-3721589, -2498060, 12307766, -10901164, 3885872, 15553687, -6230387, 2626373, 8357470, -243739, +7096360, 5320928, -1040456, 5319317, 5861020, 10516764, 4866735, 1596654, -1650878, -5884642, +-8766028, 1102733, -599685, -22461068, 13705241, -2722473, -8828305, -7221451, -18854906, -18394272, +-14515379, 3282966, 7248831, -2526515, -1728188, -595927, 27845346, 28665148, -1188095, -23117124, +4172561, 5108327, -3121368, 6430640, 3072512, 2319819, -742493, -3714073, 22389128, 4466766, +-4201015, -25276956, -14875082, 6220724, -2152852, -8684424, -15882789, 2299955, 1970853, 4071092, +-4460861, -16637093, -18560164, 19487340, 17638356, 5808944, 16109349, -14341433, 1186485, 7587597, +-3842922, -9115531, -17267380, -8128226, 2019708, -725850, -8632347, 7874286, -820876, 7613904, +5222680, 319975, -18728204, -10402948, -9431748, -1595044, 627065, 2132451, -4261145, -5235565, +-118112, 2575907, -17208860, -4294968, 1067299, 3189013, -8794482, -20164872, -6364605, -5432597, +12682502, -1096827, 4478041, -7206419, -7323456, -9531069, -12484396, -6585259, -1402307, -1681480, +8664023, -8420283, -2525441, -5384815, 6208375, -4382478, 13399224, -7416872, 3269007, -5857262, +2078764, 2129230, -6594923, -6325950, -12657805, -16351477, -8872866, -5018133, 455803, -712428, +-7279433, -8916889, -14649597, 6515466, -14675366, -21501680, 14369887, -13331042, -14369887, 13401909, +3966402, -4375498, 16779900, 7871602, -10851235, 10064182, -29570312, -3200825, -6656126, -4413079, +-13209709, 24232206, 13173202, -8566312, 5037997, 6846178, -3976066, 7667054, 1487132, -777926, +-5870147, 7386807, 11275900, 12149926, -19479288, -1940788, 1314260, 4959614, -7988103, -4867809, +-8120173, -10755135, 18189186, 4080219, -10831371, 5100811, -6027987, -9505299, -11629161, -25651692, +8165807, 14695231, 3010772, 14826227, 24019068, -2595234, -6743636, -21937620, 4192425, -3299072, +-17152488, 1921461, -38797512, -26796300, -18447958, 9802189, 19924354, -28185722, 6906308, 19266150, +12629351, -693637, 7683697, 18149994, -8038568, -1513976, -4912369, 146566, -11557220, 8176007, +688269, 619549, 3686693, 24485072, -731755, -11364483, -10152229, 5543192, 18862422, -7781944, +-17990544, 5123359, 19156092, 10468446, -1925219, 8644695, 6692096, 8315594, 2542084, 6985765, +13232257, -1954210, -20616916, 683974, 7213935, -20305532, -13866839, 19100256, 15988016, -15438260, +-9138617, 4362613, -264141, 9153649, 24471114, -5510443, -3785477, 4076461, -390305, 8325257, +5256503, -9112310, -5871221, -3766686, 7905424, 5753646, -5287105, -17794586, -1945083, -26565984, +25616258, 3240016, -3243237, 1145683, 11451457, -2388539, -10073309, -4803384, -1575716, -15209553, +-654983, 2559801, -18600430, -4963909, 13945222, 18080738, 12821014, 33805688, 20402706, 30605400, +11402601, 7951595, -15964930, 17083770, -5905580, -2127083, -12828530, -8671002, 16542603, -5681168, +37664716, 17345226, 10759430, -2286533, 8579734, -6234145, -17820356, -9232569, -11137924, 7636989, +-10524280, -587874, -11258720, 6091874, 15161771, 13479755, -1140851, 19647864, 16535624, 330176, +-6083821, -8152922, -14006962, -5243082, 31395138, 11731166, 36175436, -12320114, -76773, -1847910, +8235063, 28594818, 9761924, 14496, 18548354, 20813948, 22513144, -2836826, -13670344, -5769215, +-3914326, -4764730, 14916958, 9346386, 14194330, 20820390, -13682692, 31918050, -22162568, -42933568, +-6276558, -14529337, 8869644, 19144816, 32694364, -16531329, -12008192, 11009612, -9009768, -2261837, +-3908420, 3833795, 14655502, 14663555, 22950694, -24932286, 28174448, -10365367, 3047279, -13118441, +12023761, 20480552, 9076340, 3508988, 1998234, 25084220, 6810745, -1138703, -7814693, -4145180, +-25509422, -3764002, -12076911, -31625992, 3317862, -2060511, 13492103, -32859722, -5728950, 7577933, +12814572, 27183922, -6753836, 7912941, 15644955, 2263448, -2986613, 7765301, -6394670, -1754494, +-39986684, 3745212, -16462073, -20268488, -21799106, 9481677, -35543000, 12394739, -12551505, -18012020, +-23671176, 22981834, 25852482, 24555938, 6586869, 4990215, 24584930, -30880278, -930934, -8980240, +15129022, -36643052, -10342818, -2966212, 14861124, 10471667, 10945724, 15967615, -10252624, 5651640, +-10739029, -29021630, -1141924, -9951976, 34495568, 7961259, 24261734, -7455527, 33349884, -20587926, +-40371620, 9721658, 6310918, 5296232, -20245402, -21814138, -18078054, 7424925, -18169322, 8666170, +-9763534, 27438936, -8941048, -3126199, 18933826, 1512365, -47925392, -18887656, -795106, 32432372, +-3719979, -8856759, -27429808, 5792301, -6767795, -22477712, -27856084, -2127620, 5196911, -8461086, +-10479183, -26734560, 18476950, -5710159, 6828461, -12642773, 936840, 9575093, 5447093, 25975426, +714038, -7097434, -31486942, -9865003, 16110422, -20444582, -10457172, 9663140, 18447422, 15360951, +36069136, 28493350, 1568737, 22114786, 22067542, 8977019, 2197950, 14204531, -8840116, 55188184, +-22565758, -55537148, 17549774, -46612744, 725313, -35461396, 3251827, 50035296, 23487566, -34894460, +-21047488, -15106474, -10440529, 12359842, 22417044, -13485124, 2854543, 17654464, -36453000, 1753957, +10433012, -29640106, 16410533, -10503879, 14708116, 3991635, 16413754, 707059, -16836272, 18363670, +-22416508, -6075768, 48636748, -19979650, 19015968, -11871290, 21191906, 16894790, -4178466, -21174188, +23841364, 56168508, -29023242, 7536594, -39139500, 20384452, 14760729, -22810034, 27041114, 1930588, +-47228536, 6774237, 4844723, 22340810, -3584150, -3740917, -23471996, -25513180, -10349797, 61780420, +-6691559, 31374736, -24730422, 20697984, 13100724, -5586142, -18107046, -3743601, 20713016, 35108672, +-9191230, -11256036, -78383, 7403450, 34125664, -6927246, -3053185, -21492554, 11374684, -32548872, +-10116795, 25892748, 34988416, 5447093, 7211250, -34439732, 24910810, 19147502, -40375376, 1477469, +-19887846, 127238, -44656924, 45044008, 44311176, -6890202, -18779744, -10131291, -5769215, 20551418, +-20783346, 27277874, -36678484, -25561498, 14358613, 11511586, 6319508, 11045582, 40944460, 8376260, +20645370, 2145873, 21391084, 10408316, -5146982, 1312649, 18757196, -3511673, 2195265, 27756226, +17132088, 37206228, 52076, 20192252, 3837553, -31334470, 33512020, -17658758, 677531, 6815576, +-23337242, -20864952, 14942728, 40845140, 27981712, 13342853, -50934556, -15117211, -34138012, -2517388, +67330592, 38896836, 52419540, 1684701, -40145596, 12305618, 52308944, 7946227, -5292474, 39664560, +11256572, 26207354, -63747516, -60058676, 50494320, -3593814, -10132365, -44777720, 379031, -14394046, +31027380, 21861384, 9682467, 15945603, -38615516, 21630530, 34923988, -219580, 13540421, -32060320, +25355876, -16117939, 13403519, -1761474, 2500208, 16515223, -3609920, 9692131, -1681480, -26533772, +8655970, -4689568, 28687698, 19860466, 35095788, 7701950, -22686018, -23971824, 23622856, 20488604, +13432510, -1372242, 9951439, -10095321, -18115098, -190589, -5158256, 25262998, 22793392, 13799730, +25565256, 19558208, -30063160, 31699542, 37955164, 21488258, -14849313, -20201378, -19917374, 26510148, +21170968, 46386184, -28327994, -36266168, -20848308, -51029580, -8603893, 43231532, 11246909, 32310502, +-37511172, -50707996, 13491029, 20725902, -34274912, -1795833, -26049514, 3644817, -30269856, -12293270, +22594212, 7085086, -25419764, 372588, -16235513, -63424320, 9323300, 39062728, -1226750, -78683800, +-16837882, -1178969, 275415, 28491740, -74698072, -7698729, 32639604, -53870700, 11398306, -11815992, +62566400, 34146064, -39909372, 10043781, 41625212, 4750771, -18234820, 14413910, 8977019, 5872294, +-2178622, -4083977, 1851131, 7093676, 13137768, 44040056, 33640868, 38432976, 24595130, 48330192, +21806622, 49332532, 18530100, 43645996, -1348083, 26891328, 22507240, 26548266, 18565534, -2595771, +5872831, -34452616, -22432078, 63391568, -1577327, -26606786, -9663140, 19093814, 31270584, 67916856, +-12002823, -39366060, -21913996, -29512868, 36503464, 43414604, 47472272, 13882408, -4933844, 32189706, +-61244088, 50685984, 16648367, -30153892, -4033511, -92733712, -1535988, -62268972, -86595128, -23243826, +-52696028, -23509040, 89358944, 84272088, 74320648, -21633750, 56481504, 69455528, -57583700, -52101712, +17289928, 60788820, 1128503, -27897960, -181999, 16816408, 17731772, -49504328, 18166102, -6195491, +25941066, -26927298, -13648869, -31607738, 33459942, -4060892, -15501074, -29446296, 21486110, 13646185, +-5771899, -24704116, 11271605, 11995844, 5344013, -21641266, -3941706, -261456, 25194278, -18631568, +-5585068, -27604828, -8411693, 10982768, 21826486, -28598040, -12401718, 32993402, 26045218, -6965900, +-20417738, 1360968, -11115912, 28111098, -16582332, -6614787, 11265699, 11519639, 14491757, -12486544, +2741800, -17800492, 21128554, 29856466, 10765872, 6969658, -23893976, 27308476, -19954418, 40960028, +-30577482, 33928096, -50874960, 36171676, 234076, 1887101, -37774776, -4619774, 5814312, -2275259, +-2499134, -1524713, -12630962, 55407764, 58331560, -34177204, -20724290, 11953968, 55705724, 35119948, +20587388, 20410758, -9185324, -23077396, -7354595, 13515725, -460098, -5150740, 16452409, 668404, +11528766, 1831267, -6498286, -20593832, -5800354, -818728, 1329292, -409096, -17268990, 19475530, +2974802, -7216082, -622770, -124554, 87510, 12772696, 22408992, 10128070, 2127083, -7611219, +-11827266, -2491618, 7211250, 15699179, 20273856, -10783589, -11317776, 3163244, 20542292, 9946607, +4562866, -8616778, -18695992, 16681653, -3248069, 1230508, 1170916, 5974837, 5070209, -1365800, +-470299, -11213086, 2168959, 11818676, -4702989, 7599945, -3060701, -7376070, 6245956, -167504, +3970161, 1043677, 10710038, 8366060, -11973295, 6646462, 3745748, -21616570, -19639274, -72522672, +30721902, 112317688, 103244568, 88463976, 35081828, -83498456, -52515100, -75024488, -84443352, -75151192, +-22042846, 16596827, 63520956, 66533340, 79271136, 52864068, 52960168, 1664300, -55736328, -52855480, +-65612068, -50938848, -28549184, -1509681, -18364206, 20388210, 24653650, 40328668, 43862892, 44962404, +26599270, 2762201, 11899744, -9242770, 6459094, -29853244, -21948356, -27530204, -45802604, -35847408, +-27740120, -19056770, -32442572, 5283884, 56150256, 63887100, 35576824, 66820028, 16752520, 39405788, +20255602, 12282533, -16070694, -34169688, -47678968, -66659504, -51311976, -76097160, -31238908, -33056752, +23133230, 23775866, 65812320, 76304928, 67755256, 61146376, 59515360, 38570952, 6681359, -17242146, +-58684284, -34739844, -75764832, -62251792, -83965536, 5574868, 3627100, 11296301, 0, 0, +0, 0, 0, }, }, { { 11112154, --2180770, 3111704, 1506997, -5671505, 1533840, 4866198, -1912334, -797253, 1494649, -2167348, --5287642, 5623723, -1262720, 9840307, -102005, 1028645, 4223564, -6033892, -2025614, -6458557, --1136019, -2865280, 2684355, 4490389, 1052267, -2036351, -425202, -153545, 4327717, -3388729, --2140504, -4611185, 3471944, 1825361, 1074, 654983, -3719979, 2979097, -4370666, 424128, --2235531, 3635153, 2950106, -4909685, 505732, -5879274, 274341, 1964411, 2135136, 2486786, -1970316, 672699, -3381750, -2552284, 1389422, 2266132, -2422362, 5784784, -1857573, 788663, --1344325, -344671, 864899, -746251, 4227322, -3030636, 8243116, 1514513, 1303523, -1824287, --197569, 740882, 1292248, 129386, 938987, -5042829, -5404680, -4244502, 1082332, -2385854, --532039, -600222, 2398202, 10223096, -2838437, 1129576, -9767293, -5150203, 2795487, -4469987, --3715147, -1244467, -4214437, -972810, 8238821, -3499325, -5525476, 9166534, 7099044, -2459943, --1844152, 8396124, 2195265, 3315178, 1432372, 502511, -2298344, -3402151, 3109020, -2512019, -2272575, 984621, 755377, -1070521, -3049964, -2147484, 1821066, -2487323, -4281546, -1747515, --2040646, -5095442, 5632313, 9145059, -5454072, 3039763, -3221, -1952600, 1168768, -144418, --208306, -2955474, 5303748, -3246995, -4428648, 4740034, 1076963, -169114, -900333, 2636036, --251256, -1611, -2069637, -737661, 4402879, -7125351, 1840930, 1386738, -2481954, -1660005, --3449396, -3486440, -15956877, -2483028, -5850819, -1400159, 1254131, -4311074, -9739912, 7145215, --2416993, 1685775, 4728759, -1484985, -519691, -565325, 2158758, -1656784, 7977902, -306016, -6146098, 9089225, -10913512, 2304787, 7522635, 544387, 1470489, 5255430, 9632001, 1405528, --2210835, 4888747, -1330366, -2499134, 2143726, 1741609, 2120640, -2702071, 9816685, -4527433, -2450816, 3696356, -79457, -461172, -4841502, 803159, -5602785, 4700305, -5721970, -4347581, -3121904, -5282273, 3610457, -3679713, 1503239, -2964601, 1999844, 4315369, 8376797, 2607045, -936840, 4119411, 54761, -7218767, 962610, 2081449, 2770254, -1777043, 402116, -944356, -1417876, 4109747, 2502892, 5598490, 2004139, 803696, -3222836, -1681480, 3346317, -5754183, -4271345, 2832531, 834297, 5478231, -334471, 3071975, 7381438, 4611185, 9687299, 1882806, --1505386, -9989020, 1497333, -6134287, -2129230, 748935, 2157684, -3859565, -103079, 9565966, --5022965, -296353, -5026186, 2288144, -85899, 1813550, 3773666, 4565550, -3067144, 3405909, -3411278, 6876243, 81068, -6884833, 462783, 7282117, -937914, -542777, -1247688, 4861366, --6010270, 392453, 3514357, 4855461, 5646809, -2334315, -4193499, -602369, 8196408, 688269, -2723009, -7048042, -3488587, 1570347, 1014686, -1302449, 4066797, -428423, -1430761, 2419677, --4902169, 162672, -1277753, 2870112, 3919695, -6844568, -2250026, 2093797, 3673808, -2952790, --3745748, 1847910, 4175245, -403727, 2090039, 17066052, 8645769, 6572911, -6201396, -1394254, --8752606, -6682432, 9876277, 607738, -5848135, -3097208, 2294050, -6025302, -293668, 9526774, -4143033, -686121, 3363496, 14091788, -9360344, 2007897, -1588064, -4940823, 8466454, 3905736, -4482872, -3516505, 3890704, 4445291, -1278827, 2741800, -795106, -4406637, 1021129, 1229434, --552977, 4555350, 1352915, -2073932, 5528697, -2778307, -2405182, -3439195, 1635309, 1745367, -503585, 3546569, 618475, 11846594, 885300, -329102, -2755759, -2860985, 2973728, -9375914, -411780, 5116917, 4331475, -5200669, 7160784, -182536, 3168612, 5434744, -1699196, 4154844, -3324842, -1836635, -5340255, -4176856, 2993055, 7955890, 1971927, -3652870, -2253247, -1967095, -4794794, 4032438, 1239635, 11166378, 2934000, 6571300, -211527, 1296543, 1970853, 1661616, --1822140, 6662031, -2877628, 7206955, -3659312, -3175055, 1947231, -5241471, -1446330, -1879585, -2049773, 2760053, -2057826, -7596724, 3186329, -9130564, -3653944, -1898376, -352724, -1806571, -1533840, 7372312, 4221953, 47782, -8376797, -8334384, 8590, 4748623, -3082713, 267362, --1326071, -4058207, -5594195, -73551, 3145527, 6910066, 6376953, -1548873, 1709397, -10180146, -2710124, 5550709, 6572911, -1662689, 5888400, 575526, 8800388, 4749697, 1057636, 3381750, --1263794, -3447248, -2604898, -1990717, 4940823, -3383361, -4504884, -5335423, 4669167, -2722473, --11908334, 664646, 2239826, 4264366, 5482526, 11105712, -8184597, -6551436, -15877957, 8152922, -9474698, 2246805, 7755101, 2077690, -8503498, 179315, -4395362, -978716, 7120519, -9384504, --3666292, 4540854, 3266323, 10274099, -2614561, 4991826, -15388331, -6470905, 2984466, 9629854, --6443525, -3095061, -6845104, -6355478, 3117610, 106837, -648540, 3770445, 622770, 3903589, -10641855, -5814849, 10316511, 458488, 1568737, 3526705, 1721745, -2220498, 3169149, -6670621, --2130304, -3104188, -1457068, -4625680, 6393596, 2424509, 18821620, 1832340, -1834488, -3678640, -287763, -2847563, 9601399, -4961224, 816581, -10019622, 8021389, 9235253, -9883793, 7193534, -5403069, 3937411, -5493800, -3610457, 8213051, 3877282, -12647068, 7708930, -6049462, -1273995, -2769717, -988916, 1306744, 4846334, 3710852, -2513630, 6442988, 1459215, -281857, -5390721, --9516574, 3513820, -5164162, -1823751, 8946417, -12146704, -5265630, -8886287, -1036161, 8034810, --825171, -6207839, -9031779, -9796820, 3830037, 10868415, -3115999, 6891275, 9924596, -2501282, --2358474, 4182761, 5510980, 12135430, -1751810, 6951942, 944356, 14391362, 10355703, 3139084, --3318936, 1733019, -7801808, 14003741, 3206730, -5713380, -6662568, 8225399, 6719477, 5138392, -3485366, 2690797, 7169374, -2709051, 3225521, -4326643, 793495, 751619, -6982006, -9134322, --3219078, -6336151, 4491999, -3715684, -2848637, -9984188, -6305549, 2374580, -3299609, -861141, -5254893, 10761041, 13399224, 7161321, 5743982, -4527970, -10331544, 395674, -7131793, -17258790, --19594178, -6446209, 1402844, 9404905, -6662568, 4451197, 3431142, -685047, 14938433, -2231773, -14087493, -8360691, 4388383, 4091493, 532576, -12807056, -4820564, -4929549, -13880261, 4636954, --3156801, 2806761, -489089, 4962298, 393526, -5778879, 3400540, -9366250, 7210177, 3788161, -16083579, -827855, 933619, 14130979, -12144557, 10950019, 14079440, -8623221, 9256728, -3762928, --3586298, -7225209, 2338073, 1567663, 10220948, 6156836, -1916092, -4063039, -7619809, 4483409, -5746666, -9422085, -3592203, 8849243, -14787036, 1502165, -11236171, 6837588, 1402307, -100932, -4396436, -3878892, 2206003, 14477261, -4983236, 3412352, 7894687, 4752382, 1809792, -7030862, -4484483, 3401077, -3037616, -11370389, 1764158, -1686312, -7118909, -7915088, 23422604, -8576513, -4351876, 3612604, 8199630, 2866354, 4878546, 12020003, -9373229, -5398774, -997506, 16636556, --6587943, -6784438, -8400419, 4266513, 2492155, 9194988, -19007914, 380641, 142271, -1072131, -9382893, -2138357, 7175817, 13988708, -10281615, -4298726, 3668976, -7323993, -9721122, 6558415, --9050570, 13163001, -2478733, -13154948, -2031520, -7471096, 3972845, 10771778, -474057, 5544803, --927176, 2251637, 12327093, 584116, 8863202, 3809099, -7125351, 7332583, 5818607, 1045825, -4837207, 18289582, -3294240, -7920994, 3994857, -10074383, 492848, 17501454, 5538361, 2965675, --3639985, -4692789, -3707094, -5837398, 9991168, -6542309, -2319819, -3934190, 11195369, -21355652, -6560026, 8061117, 11565810, 3498251, 34909496, 10470593, -6383932, -8429410, -7151121, 25383256, --21803402, 1818919, 8569533, 1359894, -11788075, -2566243, 5990943, -1144609, 1447404, 10635950, --10783589, -8979703, 4578435, 13849659, 8550206, 3710852, -6501507, -6291590, -6092948, -7066295, -6942815, 2910377, 9895605, 8025147, 4639639, -10064182, -4683662, -10722386, -1940252, -6929393, --16331613, -2799782, 7696582, 1956358, -7391639, -7435126, 525597, 4354560, 10742250, 1678259, -5650030, 1880122, 20482700, -17022030, 11838540, 2547989, -17293686, -2780455, -4842039, -3948686, -3286187, -7313793, 5297306, 3898220, 8610336, -9203578, 4147328, 16047072, 8054138, 25201258, --4668093, -106300, -5123359, -2629057, 1724966, -101469, -22224308, 10610180, 344134, -1836635, -7626252, -1723356, -12097849, 3223373, 5947993, 124017, -7612830, -4631586, -15971910, -18114024, -3381213, -7849053, -4358318, 3036005, -628676, -1624571, -8722542, -3793530, -577136, 6762426, -6398428, -9872519, -6339372, 6637872, -9619653, -4224101, -15426986, 14629195, -2435247, 13186623, -562104, 5061082, 13203266, 10598369, -6723235, 3300682, 6396817, -7223062, -3627637, 6954089, --3178813, -16425029, -3732864, -11497091, 16314970, -1732482, -5205501, -9672803, -14886894, 5098126, -2272575, 3336653, 6240588, 129923, -3360275, 7256347, 1068373, -1490354, 1746441, -4216048, -10370199, -2814814, 6191196, 20759724, 3740380, 3688840, 3927211, 7431904, -19289234, -15139223, -4502200, -16578574, 9931038, -2868501, 11370926, 2516314, 23055384, 7847442, -6873022, -1081258, --30188252, -20477330, 7306813, -7945690, -17662516, -25792890, -1094143, 2414845, -5539434, -3859565, -24443196, 6841883, -18525804, 4057134, -11513734, -8983998, -9460739, -15845208, -3200825, 1722282, --22725746, -20771536, -8545374, 3677566, 1482301, 12906914, 10166188, 6858526, -5952288, -55835, -4290673, -11237245, -6983617, -3766150, 3104188, -10588168, -7201050, 7372848, 3729105, -238908, --2348810, -1967632, 5359583, -15378130, -9508521, -7594039, 9443559, -11970074, 7326141, 13590350, -17923436, -1349157, 4570919, -4574140, -9768366, -11893301, -4015795, 11354820, 3471407, -21232170, -31675, 21438330, -15345381, 374199, -4022237, 782221, 4194036, 10652056, -3299072, 3039763, -12242267, 8608188, 4684736, -10804527, -13694503, -18192944, 10397042, -14875082, -24308978, 3743064, --14462229, -9657234, 30476552, 1230508, 23028004, 19205484, -3191161, 20269024, 29952566, 19931870, --25224880, -4260071, -11274826, -13048648, -6662568, -257698, -9893994, 21952114, 7610682, 11694122, --9782325, 11159936, 10064182, 2275796, -12678207, -11331197, 22530862, -4738423, -19287088, -2163590, --22453552, -4161287, 7427072, -9172976, 1461363, -19866908, 9718437, 16487843, 10342281, -3352222, --8361765, -4306242, -1338419, -4061429, -7727183, -24253144, 16892644, 8068633, 9363566, 9073655, --12185896, 19813222, 3765076, -7113540, -3395709, -17370458, -5998996, 9771051, 7942469, 16745004, --489089, -21213380, -34003256, -3108483, 1437740, -939524, -10881837, -19087372, -1087701, 10466835, --3098819, -9194988, 37757056, 24014772, -3508452, -21933324, 4528506, 11133629, 6227166, 16215112, -24019604, -10503879, 1880122, -21417392, 6001680, 1934883, -8473434, 39024608, 14623290, 33702072, -13739600, 8826695, -29321742, 635655, 16192564, 3164317, -15659451, 6778532, -23882702, -9070434, -1525787, 7388955, -7232188, -4388383, 5040144, 4449049, 1600412, 21313776, 12960064, 3738769, --8553964, 14789720, -9558987, -6465537, -13998372, -4291746, 17943300, -28224914, -586263, 13187697, --14410152, -4092030, 5274220, 5240397, 26208428, -1071058, -482647, -11828877, 25598542, -10964515, -3049427, 3281355, 17641578, -3536906, -6680285, 17699560, -28925530, 8259222, 2512556, -11004243, -22721988, -27639188, -3791919, -8348343, -19232864, -8060580, -1185411, 10483478, 20439212, 29417304, --35563404, 9071508, 3129958, 43283608, 11372537, 7326141, 80531, 20660404, 7188165, -33424510, --3585224, 33895344, -8841727, -8159901, 4452808, -3201361, 2369211, -7088307, 37856916, 40482752, --20446192, 9323300, 12868259, 5384279, 13550085, -18735722, -23128398, 18715856, 7296613, -14382772, --21867290, -7681549, -5966247, 21448530, 20160576, 9627706, -17921288, 10763188, -6327561, 6755984, -3784940, 9089761, 23336704, 4465156, -43361988, -14406931, 11429445, -18724984, 8720931, 19392852, -9842454, 33944200, -7851737, -51397336, 2451353, -20558934, 21689584, 15363098, -1481227, -11003169, -20232518, -24713778, 338229, -13412109, 16752520, 15878494, 19300510, 14677514, -4874788, -21186536, --55041616, -30235496, -27925878, 4689568, -14345728, -14122389, 10201084, -31653372, 681826, -19746112, --9459665, 6283537, -10773389, -1934346, 1173600, -49349176, -5735392, 30636002, -36627480, 2498597, -15509127, -817118, 11265162, -4051765, -28756416, -3720516, 17694728, 4310537, 25712896, 15352361, --24504936, -29098940, -2433099, -13256417, -2700998, -47178604, 18456548, 17075716, 33421824, 13480829, -30515206, -13819594, 5221607, 28963648, -8331163, 31635656, 10276783, 16214038, 6987912, -9446244, -17299054, -20976620, 2037425, 40351756, -31124018, 1917703, -40833864, -19859928, -29136522, -21450140, --4383551, 1238561, -9067213, -32799054, -5018670, -53821308, 60448444, 20157356, 897111, -8854612, --14041322, 2641942, -26064010, 4285841, -39390220, 445066, 1782948, 8511015, 24660628, 36294084, -50466, -60965988, -30339112, 26378616, -18382996, -8720931, 10405095, -23213224, 16241956, 27901718, -9415105, -11900281, -17276506, 8527658, -22129282, 34506304, 27571542, 43575128, -31410706, -37252400, --10243497, -329639, -19895900, 25837986, 29898342, -22167936, -904628, -39946952, -12802761, -18638548, --37427420, 12093554, 29252486, 18813568, -24697672, -8662412, 1809255, 20884816, 2031520, -895501, -6587943, -1704028, -11366094, -32142998, -23338316, 9074729, -4231080, -17164300, 18127446, 17890150, -9701257, -32808718, -31891206, 29678760, 16088411, 22306986, -23259396, -54994908, -12049531, 24460912, -21789980, -4697621, 54871428, -5893769, 55093156, -84147536, -107683960, -42086920, -65665220, 2377801, -22921704, 14994268, 66997732, -5565741, -6522982, 15655156, -15727633, -50826644, -50175420, -48998060, -42142220, 43195560, -12718472, 18923090, 5133560, 13867376, -42725796, 37388764, 25441776, 12773233, -31878322, -18257370, 10547366, -54292144, -28895466, 16153909, 18633178, 10907069, 5171678, 8354785, -12354473, -5399311, 61353608, 7080254, 37335612, 12686797, -21347598, 49689552, -8924405, 20280836, --1408749, 18600430, -4321811, 197032, 8051990, 25503516, 4412005, 18946712, -1511829, -2459943, -35339528, 5537287, -11020349, 1843615, -6090264, -18043694, -8714489, 11950210, 3755949, -41899552, --14032195, 6663105, 6304475, 46309948, 32875828, -43293272, -28618440, 5000953, -14153528, 51004884, -293668, 47224776, -37078452, 24591372, -556198, 4214437, 15640660, 48877800, 24404004, 8334921, -34843996, 18701362, -27125402, -39145944, 28148142, -29983166, 12077448, -39396124, -12451110, -62434864, -53624816, -4304631, -67589360, -19659676, -2956011, 5293547, 8846022, -45535780, -22636088, 37456408, --12496207, 12712566, -14547054, 2136209, 52408264, 78066400, 8602283, -4364761, 43208980, 16001974, -19871740, 47990352, 4516158, 28609850, 39757976, 33614024, -9999758, 13953812, 35081828, 42608224, -39570608, 52719648, 34301220, 67662376, 76820320, 51783884, 62227632, 38837780, 92342, 18772766, -14837501, -15492484, -10117869, 10986526, 38708392, 7380365, 6597607, -448824, 21935472, 50174880, -44557600, 84458384, 22652732, -43989056, 23335094, 824634, 23953570, -22558778, 39888436, -61327840, --72577432, 22109954, 86361056, 34537444, 23039816, -98785320, 8093329, 37082212, 67532456, 79264696, --25498684, 3614752, -128708360, -93314608, 47158740, 47392280, -64359548, -23079006, 63171988, 77474232, --86948928, -31797254, 29329794, -20398410, 13196287, -27685360, 25061672, -22983980, 3613141, 2975339, --15262703, 9404368, -1240709, -4993437, -8599598, -17808008, -8192650, 7501698, -96100, -18231600, -17504140, -16500727, -9305584, -13944148, -656056, -13246216, 30295626, 2068564, 6145562, -6105833, -6140193, -6696391, 6859600, 22747220, 24843702, -4789963, 6726456, 12655121, 21569326, -12457553, -13052406, -10895795, 26482768, -5227512, -18702972, 11673721, -9468792, -6493991, 1069447, -403727, -10233833, -4570382, -18527416, -14074071, 518080, 4851166, -30498026, 10291279, -6161131, -1502702, -3398393, -6995965, -6201396, 3652870, -5604933, 4233764, -16051903, 17732310, -51288352, 25837450, --21145734, 31841276, -21040508, 3349001, -13613973, 63559072, 38472168, -20964272, -24189792, -2142652, -78857744, 32941326, 10945724, 21787832, -19294604, -24262270, 6568616, 15218680, 3810173, 1258962, --8618389, -6704981, 7198902, 7401840, 18129594, 7987029, -10188199, -4586488, -5201206, -10229001, --435402, 1501091, 4547297, 5949067, -185220, -2959769, 6934225, -21526912, -8486319, 9072582, -13058311, 16381005, -9928891, -5898064, -10558640, 16711181, 11297911, -3708704, 4845797, -20306068, --17792438, 15302432, 11615202, 3332358, -30770756, -16018617, 437013, 4393215, 18905372, 13490492, --3151432, 5142150, 6006512, -10084583, 7469485, 8589935, -3985730, -6466074, 4155381, -10792179, --622233, -2438468, -8863739, -11413876, 12780212, 2593624, 609885, 20619064, 21335250, 10772852, -9466108, -23015656, -62674312, 21540334, 115799296, 90656024, 87219512, 27559732, -80792096, -48841832, --71628240, -72283760, -65498252, -23223426, 35446364, 45252312, 71772128, 63883880, 38718056, 6123013, -6314139, -31479962, -49181132, -70755288, -27113592, -19522236, 6232535, -4406100, 35580584, 23659902, -10095858, 47263432, 26602490, 19943680, -4411469, 17423608, -32704566, -24958592, -20551418, -24142012, --31489626, -19291920, -12862353, -32202592, -22401476, 7803419, 45945412, 44309568, 50357956, 39441220, -57586384, 9432285, 14088566, -39476656, -29681982, -25345138, -59281288, -58704688, -53226992, -25369298, --31861678, 6315750, 20987894, 31609348, 63496796, 63211180, 59334972, 54092964, 45827836, 9252970, --31094490, -47233904, -85662584, -71830104, -55363740, -70824008, -36502392, -10081362, 2771865, 38146288, --6261526, 0, 0, }, +-2180770, 3111704, 1506997, -5671505, 1533840, 4866198, -1912334, -797253, 1494649, -2167348, +-5287642, 5623723, -1262720, 9840307, -102005, 1028645, 4223564, -6033892, -2025614, -6458557, +-1136019, -2865280, 2684355, 4490389, 1052267, -2036351, -425202, -153545, 4327717, -3388729, +-2140504, -4611185, 3471944, 1825361, 1074, 654983, -3719979, 2979097, -4370666, 424128, +-2235531, 3635153, 2950106, -4909685, 505732, -5879274, 274341, 1964411, 2135136, 2486786, +1970316, 672699, -3381750, -2552284, 1389422, 2266132, -2422362, 5784784, -1857573, 788663, +-1344325, -344671, 864899, -746251, 4227322, -3030636, 8243116, 1514513, 1303523, -1824287, +-197569, 740882, 1292248, 129386, 938987, -5042829, -5404680, -4244502, 1082332, -2385854, +-532039, -600222, 2398202, 10223096, -2838437, 1129576, -9767293, -5150203, 2795487, -4469987, +-3715147, -1244467, -4214437, -972810, 8238821, -3499325, -5525476, 9166534, 7099044, -2459943, +-1844152, 8396124, 2195265, 3315178, 1432372, 502511, -2298344, -3402151, 3109020, -2512019, +2272575, 984621, 755377, -1070521, -3049964, -2147484, 1821066, -2487323, -4281546, -1747515, +-2040646, -5095442, 5632313, 9145059, -5454072, 3039763, -3221, -1952600, 1168768, -144418, +-208306, -2955474, 5303748, -3246995, -4428648, 4740034, 1076963, -169114, -900333, 2636036, +-251256, -1611, -2069637, -737661, 4402879, -7125351, 1840930, 1386738, -2481954, -1660005, +-3449396, -3486440, -15956877, -2483028, -5850819, -1400159, 1254131, -4311074, -9739912, 7145215, +-2416993, 1685775, 4728759, -1484985, -519691, -565325, 2158758, -1656784, 7977902, -306016, +6146098, 9089225, -10913512, 2304787, 7522635, 544387, 1470489, 5255430, 9632001, 1405528, +-2210835, 4888747, -1330366, -2499134, 2143726, 1741609, 2120640, -2702071, 9816685, -4527433, +2450816, 3696356, -79457, -461172, -4841502, 803159, -5602785, 4700305, -5721970, -4347581, +3121904, -5282273, 3610457, -3679713, 1503239, -2964601, 1999844, 4315369, 8376797, 2607045, +936840, 4119411, 54761, -7218767, 962610, 2081449, 2770254, -1777043, 402116, -944356, +1417876, 4109747, 2502892, 5598490, 2004139, 803696, -3222836, -1681480, 3346317, -5754183, +4271345, 2832531, 834297, 5478231, -334471, 3071975, 7381438, 4611185, 9687299, 1882806, +-1505386, -9989020, 1497333, -6134287, -2129230, 748935, 2157684, -3859565, -103079, 9565966, +-5022965, -296353, -5026186, 2288144, -85899, 1813550, 3773666, 4565550, -3067144, 3405909, +3411278, 6876243, 81068, -6884833, 462783, 7282117, -937914, -542777, -1247688, 4861366, +-6010270, 392453, 3514357, 4855461, 5646809, -2334315, -4193499, -602369, 8196408, 688269, +2723009, -7048042, -3488587, 1570347, 1014686, -1302449, 4066797, -428423, -1430761, 2419677, +-4902169, 162672, -1277753, 2870112, 3919695, -6844568, -2250026, 2093797, 3673808, -2952790, +-3745748, 1847910, 4175245, -403727, 2090039, 17066052, 8645769, 6572911, -6201396, -1394254, +-8752606, -6682432, 9876277, 607738, -5848135, -3097208, 2294050, -6025302, -293668, 9526774, +4143033, -686121, 3363496, 14091788, -9360344, 2007897, -1588064, -4940823, 8466454, 3905736, +4482872, -3516505, 3890704, 4445291, -1278827, 2741800, -795106, -4406637, 1021129, 1229434, +-552977, 4555350, 1352915, -2073932, 5528697, -2778307, -2405182, -3439195, 1635309, 1745367, +503585, 3546569, 618475, 11846594, 885300, -329102, -2755759, -2860985, 2973728, -9375914, +411780, 5116917, 4331475, -5200669, 7160784, -182536, 3168612, 5434744, -1699196, 4154844, +3324842, -1836635, -5340255, -4176856, 2993055, 7955890, 1971927, -3652870, -2253247, -1967095, +4794794, 4032438, 1239635, 11166378, 2934000, 6571300, -211527, 1296543, 1970853, 1661616, +-1822140, 6662031, -2877628, 7206955, -3659312, -3175055, 1947231, -5241471, -1446330, -1879585, +2049773, 2760053, -2057826, -7596724, 3186329, -9130564, -3653944, -1898376, -352724, -1806571, +1533840, 7372312, 4221953, 47782, -8376797, -8334384, 8590, 4748623, -3082713, 267362, +-1326071, -4058207, -5594195, -73551, 3145527, 6910066, 6376953, -1548873, 1709397, -10180146, +2710124, 5550709, 6572911, -1662689, 5888400, 575526, 8800388, 4749697, 1057636, 3381750, +-1263794, -3447248, -2604898, -1990717, 4940823, -3383361, -4504884, -5335423, 4669167, -2722473, +-11908334, 664646, 2239826, 4264366, 5482526, 11105712, -8184597, -6551436, -15877957, 8152922, +9474698, 2246805, 7755101, 2077690, -8503498, 179315, -4395362, -978716, 7120519, -9384504, +-3666292, 4540854, 3266323, 10274099, -2614561, 4991826, -15388331, -6470905, 2984466, 9629854, +-6443525, -3095061, -6845104, -6355478, 3117610, 106837, -648540, 3770445, 622770, 3903589, +10641855, -5814849, 10316511, 458488, 1568737, 3526705, 1721745, -2220498, 3169149, -6670621, +-2130304, -3104188, -1457068, -4625680, 6393596, 2424509, 18821620, 1832340, -1834488, -3678640, +287763, -2847563, 9601399, -4961224, 816581, -10019622, 8021389, 9235253, -9883793, 7193534, +5403069, 3937411, -5493800, -3610457, 8213051, 3877282, -12647068, 7708930, -6049462, -1273995, +2769717, -988916, 1306744, 4846334, 3710852, -2513630, 6442988, 1459215, -281857, -5390721, +-9516574, 3513820, -5164162, -1823751, 8946417, -12146704, -5265630, -8886287, -1036161, 8034810, +-825171, -6207839, -9031779, -9796820, 3830037, 10868415, -3115999, 6891275, 9924596, -2501282, +-2358474, 4182761, 5510980, 12135430, -1751810, 6951942, 944356, 14391362, 10355703, 3139084, +-3318936, 1733019, -7801808, 14003741, 3206730, -5713380, -6662568, 8225399, 6719477, 5138392, +3485366, 2690797, 7169374, -2709051, 3225521, -4326643, 793495, 751619, -6982006, -9134322, +-3219078, -6336151, 4491999, -3715684, -2848637, -9984188, -6305549, 2374580, -3299609, -861141, +5254893, 10761041, 13399224, 7161321, 5743982, -4527970, -10331544, 395674, -7131793, -17258790, +-19594178, -6446209, 1402844, 9404905, -6662568, 4451197, 3431142, -685047, 14938433, -2231773, +14087493, -8360691, 4388383, 4091493, 532576, -12807056, -4820564, -4929549, -13880261, 4636954, +-3156801, 2806761, -489089, 4962298, 393526, -5778879, 3400540, -9366250, 7210177, 3788161, +16083579, -827855, 933619, 14130979, -12144557, 10950019, 14079440, -8623221, 9256728, -3762928, +-3586298, -7225209, 2338073, 1567663, 10220948, 6156836, -1916092, -4063039, -7619809, 4483409, +5746666, -9422085, -3592203, 8849243, -14787036, 1502165, -11236171, 6837588, 1402307, -100932, +4396436, -3878892, 2206003, 14477261, -4983236, 3412352, 7894687, 4752382, 1809792, -7030862, +4484483, 3401077, -3037616, -11370389, 1764158, -1686312, -7118909, -7915088, 23422604, -8576513, +4351876, 3612604, 8199630, 2866354, 4878546, 12020003, -9373229, -5398774, -997506, 16636556, +-6587943, -6784438, -8400419, 4266513, 2492155, 9194988, -19007914, 380641, 142271, -1072131, +9382893, -2138357, 7175817, 13988708, -10281615, -4298726, 3668976, -7323993, -9721122, 6558415, +-9050570, 13163001, -2478733, -13154948, -2031520, -7471096, 3972845, 10771778, -474057, 5544803, +-927176, 2251637, 12327093, 584116, 8863202, 3809099, -7125351, 7332583, 5818607, 1045825, +4837207, 18289582, -3294240, -7920994, 3994857, -10074383, 492848, 17501454, 5538361, 2965675, +-3639985, -4692789, -3707094, -5837398, 9991168, -6542309, -2319819, -3934190, 11195369, -21355652, +6560026, 8061117, 11565810, 3498251, 34909496, 10470593, -6383932, -8429410, -7151121, 25383256, +-21803402, 1818919, 8569533, 1359894, -11788075, -2566243, 5990943, -1144609, 1447404, 10635950, +-10783589, -8979703, 4578435, 13849659, 8550206, 3710852, -6501507, -6291590, -6092948, -7066295, +6942815, 2910377, 9895605, 8025147, 4639639, -10064182, -4683662, -10722386, -1940252, -6929393, +-16331613, -2799782, 7696582, 1956358, -7391639, -7435126, 525597, 4354560, 10742250, 1678259, +5650030, 1880122, 20482700, -17022030, 11838540, 2547989, -17293686, -2780455, -4842039, -3948686, +3286187, -7313793, 5297306, 3898220, 8610336, -9203578, 4147328, 16047072, 8054138, 25201258, +-4668093, -106300, -5123359, -2629057, 1724966, -101469, -22224308, 10610180, 344134, -1836635, +7626252, -1723356, -12097849, 3223373, 5947993, 124017, -7612830, -4631586, -15971910, -18114024, +3381213, -7849053, -4358318, 3036005, -628676, -1624571, -8722542, -3793530, -577136, 6762426, +6398428, -9872519, -6339372, 6637872, -9619653, -4224101, -15426986, 14629195, -2435247, 13186623, +562104, 5061082, 13203266, 10598369, -6723235, 3300682, 6396817, -7223062, -3627637, 6954089, +-3178813, -16425029, -3732864, -11497091, 16314970, -1732482, -5205501, -9672803, -14886894, 5098126, +2272575, 3336653, 6240588, 129923, -3360275, 7256347, 1068373, -1490354, 1746441, -4216048, +10370199, -2814814, 6191196, 20759724, 3740380, 3688840, 3927211, 7431904, -19289234, -15139223, +4502200, -16578574, 9931038, -2868501, 11370926, 2516314, 23055384, 7847442, -6873022, -1081258, +-30188252, -20477330, 7306813, -7945690, -17662516, -25792890, -1094143, 2414845, -5539434, -3859565, +24443196, 6841883, -18525804, 4057134, -11513734, -8983998, -9460739, -15845208, -3200825, 1722282, +-22725746, -20771536, -8545374, 3677566, 1482301, 12906914, 10166188, 6858526, -5952288, -55835, +4290673, -11237245, -6983617, -3766150, 3104188, -10588168, -7201050, 7372848, 3729105, -238908, +-2348810, -1967632, 5359583, -15378130, -9508521, -7594039, 9443559, -11970074, 7326141, 13590350, +17923436, -1349157, 4570919, -4574140, -9768366, -11893301, -4015795, 11354820, 3471407, -21232170, +31675, 21438330, -15345381, 374199, -4022237, 782221, 4194036, 10652056, -3299072, 3039763, +12242267, 8608188, 4684736, -10804527, -13694503, -18192944, 10397042, -14875082, -24308978, 3743064, +-14462229, -9657234, 30476552, 1230508, 23028004, 19205484, -3191161, 20269024, 29952566, 19931870, +-25224880, -4260071, -11274826, -13048648, -6662568, -257698, -9893994, 21952114, 7610682, 11694122, +-9782325, 11159936, 10064182, 2275796, -12678207, -11331197, 22530862, -4738423, -19287088, -2163590, +-22453552, -4161287, 7427072, -9172976, 1461363, -19866908, 9718437, 16487843, 10342281, -3352222, +-8361765, -4306242, -1338419, -4061429, -7727183, -24253144, 16892644, 8068633, 9363566, 9073655, +-12185896, 19813222, 3765076, -7113540, -3395709, -17370458, -5998996, 9771051, 7942469, 16745004, +-489089, -21213380, -34003256, -3108483, 1437740, -939524, -10881837, -19087372, -1087701, 10466835, +-3098819, -9194988, 37757056, 24014772, -3508452, -21933324, 4528506, 11133629, 6227166, 16215112, +24019604, -10503879, 1880122, -21417392, 6001680, 1934883, -8473434, 39024608, 14623290, 33702072, +13739600, 8826695, -29321742, 635655, 16192564, 3164317, -15659451, 6778532, -23882702, -9070434, +1525787, 7388955, -7232188, -4388383, 5040144, 4449049, 1600412, 21313776, 12960064, 3738769, +-8553964, 14789720, -9558987, -6465537, -13998372, -4291746, 17943300, -28224914, -586263, 13187697, +-14410152, -4092030, 5274220, 5240397, 26208428, -1071058, -482647, -11828877, 25598542, -10964515, +3049427, 3281355, 17641578, -3536906, -6680285, 17699560, -28925530, 8259222, 2512556, -11004243, +22721988, -27639188, -3791919, -8348343, -19232864, -8060580, -1185411, 10483478, 20439212, 29417304, +-35563404, 9071508, 3129958, 43283608, 11372537, 7326141, 80531, 20660404, 7188165, -33424510, +-3585224, 33895344, -8841727, -8159901, 4452808, -3201361, 2369211, -7088307, 37856916, 40482752, +-20446192, 9323300, 12868259, 5384279, 13550085, -18735722, -23128398, 18715856, 7296613, -14382772, +-21867290, -7681549, -5966247, 21448530, 20160576, 9627706, -17921288, 10763188, -6327561, 6755984, +3784940, 9089761, 23336704, 4465156, -43361988, -14406931, 11429445, -18724984, 8720931, 19392852, +9842454, 33944200, -7851737, -51397336, 2451353, -20558934, 21689584, 15363098, -1481227, -11003169, +20232518, -24713778, 338229, -13412109, 16752520, 15878494, 19300510, 14677514, -4874788, -21186536, +-55041616, -30235496, -27925878, 4689568, -14345728, -14122389, 10201084, -31653372, 681826, -19746112, +-9459665, 6283537, -10773389, -1934346, 1173600, -49349176, -5735392, 30636002, -36627480, 2498597, +15509127, -817118, 11265162, -4051765, -28756416, -3720516, 17694728, 4310537, 25712896, 15352361, +-24504936, -29098940, -2433099, -13256417, -2700998, -47178604, 18456548, 17075716, 33421824, 13480829, +30515206, -13819594, 5221607, 28963648, -8331163, 31635656, 10276783, 16214038, 6987912, -9446244, +17299054, -20976620, 2037425, 40351756, -31124018, 1917703, -40833864, -19859928, -29136522, -21450140, +-4383551, 1238561, -9067213, -32799054, -5018670, -53821308, 60448444, 20157356, 897111, -8854612, +-14041322, 2641942, -26064010, 4285841, -39390220, 445066, 1782948, 8511015, 24660628, 36294084, +50466, -60965988, -30339112, 26378616, -18382996, -8720931, 10405095, -23213224, 16241956, 27901718, +9415105, -11900281, -17276506, 8527658, -22129282, 34506304, 27571542, 43575128, -31410706, -37252400, +-10243497, -329639, -19895900, 25837986, 29898342, -22167936, -904628, -39946952, -12802761, -18638548, +-37427420, 12093554, 29252486, 18813568, -24697672, -8662412, 1809255, 20884816, 2031520, -895501, +6587943, -1704028, -11366094, -32142998, -23338316, 9074729, -4231080, -17164300, 18127446, 17890150, +9701257, -32808718, -31891206, 29678760, 16088411, 22306986, -23259396, -54994908, -12049531, 24460912, +21789980, -4697621, 54871428, -5893769, 55093156, -84147536, -107683960, -42086920, -65665220, 2377801, +22921704, 14994268, 66997732, -5565741, -6522982, 15655156, -15727633, -50826644, -50175420, -48998060, +42142220, 43195560, -12718472, 18923090, 5133560, 13867376, -42725796, 37388764, 25441776, 12773233, +31878322, -18257370, 10547366, -54292144, -28895466, 16153909, 18633178, 10907069, 5171678, 8354785, +12354473, -5399311, 61353608, 7080254, 37335612, 12686797, -21347598, 49689552, -8924405, 20280836, +-1408749, 18600430, -4321811, 197032, 8051990, 25503516, 4412005, 18946712, -1511829, -2459943, +35339528, 5537287, -11020349, 1843615, -6090264, -18043694, -8714489, 11950210, 3755949, -41899552, +-14032195, 6663105, 6304475, 46309948, 32875828, -43293272, -28618440, 5000953, -14153528, 51004884, +293668, 47224776, -37078452, 24591372, -556198, 4214437, 15640660, 48877800, 24404004, 8334921, +34843996, 18701362, -27125402, -39145944, 28148142, -29983166, 12077448, -39396124, -12451110, -62434864, +53624816, -4304631, -67589360, -19659676, -2956011, 5293547, 8846022, -45535780, -22636088, 37456408, +-12496207, 12712566, -14547054, 2136209, 52408264, 78066400, 8602283, -4364761, 43208980, 16001974, +19871740, 47990352, 4516158, 28609850, 39757976, 33614024, -9999758, 13953812, 35081828, 42608224, +39570608, 52719648, 34301220, 67662376, 76820320, 51783884, 62227632, 38837780, 92342, 18772766, +14837501, -15492484, -10117869, 10986526, 38708392, 7380365, 6597607, -448824, 21935472, 50174880, +44557600, 84458384, 22652732, -43989056, 23335094, 824634, 23953570, -22558778, 39888436, -61327840, +-72577432, 22109954, 86361056, 34537444, 23039816, -98785320, 8093329, 37082212, 67532456, 79264696, +-25498684, 3614752, -128708360, -93314608, 47158740, 47392280, -64359548, -23079006, 63171988, 77474232, +-86948928, -31797254, 29329794, -20398410, 13196287, -27685360, 25061672, -22983980, 3613141, 2975339, +-15262703, 9404368, -1240709, -4993437, -8599598, -17808008, -8192650, 7501698, -96100, -18231600, +17504140, -16500727, -9305584, -13944148, -656056, -13246216, 30295626, 2068564, 6145562, -6105833, +6140193, -6696391, 6859600, 22747220, 24843702, -4789963, 6726456, 12655121, 21569326, -12457553, +13052406, -10895795, 26482768, -5227512, -18702972, 11673721, -9468792, -6493991, 1069447, -403727, +10233833, -4570382, -18527416, -14074071, 518080, 4851166, -30498026, 10291279, -6161131, -1502702, +3398393, -6995965, -6201396, 3652870, -5604933, 4233764, -16051903, 17732310, -51288352, 25837450, +-21145734, 31841276, -21040508, 3349001, -13613973, 63559072, 38472168, -20964272, -24189792, -2142652, +78857744, 32941326, 10945724, 21787832, -19294604, -24262270, 6568616, 15218680, 3810173, 1258962, +-8618389, -6704981, 7198902, 7401840, 18129594, 7987029, -10188199, -4586488, -5201206, -10229001, +-435402, 1501091, 4547297, 5949067, -185220, -2959769, 6934225, -21526912, -8486319, 9072582, +13058311, 16381005, -9928891, -5898064, -10558640, 16711181, 11297911, -3708704, 4845797, -20306068, +-17792438, 15302432, 11615202, 3332358, -30770756, -16018617, 437013, 4393215, 18905372, 13490492, +-3151432, 5142150, 6006512, -10084583, 7469485, 8589935, -3985730, -6466074, 4155381, -10792179, +-622233, -2438468, -8863739, -11413876, 12780212, 2593624, 609885, 20619064, 21335250, 10772852, +9466108, -23015656, -62674312, 21540334, 115799296, 90656024, 87219512, 27559732, -80792096, -48841832, +-71628240, -72283760, -65498252, -23223426, 35446364, 45252312, 71772128, 63883880, 38718056, 6123013, +6314139, -31479962, -49181132, -70755288, -27113592, -19522236, 6232535, -4406100, 35580584, 23659902, +10095858, 47263432, 26602490, 19943680, -4411469, 17423608, -32704566, -24958592, -20551418, -24142012, +-31489626, -19291920, -12862353, -32202592, -22401476, 7803419, 45945412, 44309568, 50357956, 39441220, +57586384, 9432285, 14088566, -39476656, -29681982, -25345138, -59281288, -58704688, -53226992, -25369298, +-31861678, 6315750, 20987894, 31609348, 63496796, 63211180, 59334972, 54092964, 45827836, 9252970, +-31094490, -47233904, -85662584, -71830104, -55363740, -70824008, -36502392, -10081362, 2771865, 38146288, +-6261526, 0, 0, }, { 11669426, --4000225, 3040300, -444529, -324270, -3609383, 2025077, 5330592, -3006477, -1369558, 754841, --2290828, -3757023, 580894, 78383, -3585761, -6129992, 4901632, -2550137, 8421357, -464930, -4721243, -6693707, -304406, 2417530, -1489280, -3539053, -1470489, -2531346, -436476, -2094333, -224412, -438624, -3110093, 1935420, -4150012, 4902705, -1733019, -1356673, -803159, 5811628, -5447093, 210990, 4046933, 2596308, -1280437, -1222455, 5425618, -2703145, -6251325, -83752, --1341640, 6776385, 349503, 847719, -4264366, 11811, -2239826, -2360622, -1159104, -2544768, -1848983, -3678640, -1647657, 938450, -1364189, -3943854, -5515275, -107374, 3163244, 1662152, -2664490, -53687, -676457, 988916, -346819, -3704946, -3823595, -6515466, 2431488, -3365107, --5735392, -4250944, 3114925, -8042327, -3912715, -9757629, 3612068, 3840775, 5691906, 2555506, --2946348, 6759205, -4532801, 1074279, 490700, -1390496, -4810900, -3007014, -5326297, -148713, --2069637, 2800856, 2438468, -3077881, -527207, -994822, -4865124, -596464, -821413, 1928977, -240518, 4319127, -1342714, 5563594, -2247342, -315680, 1285806, -4742181, 3347390, -1734093, --1345399, 86973, -855235, 1868311, -8792335, 3805878, 5801427, 346282, 3428458, 1242319, --3727495, -1000191, -4077535, 5497558, -1284732, -4211753, 3885335, -5981816, 513785, 1603633, --5961952, 210990, -1216550, -2913599, 2358474, -84289, 748398, -3488050, -1758789, -10506564, --1186485, 1881196, -14341970, -8486319, 1502165, -4544076, 801548, -4688494, -8268886, -5362804, -9220758, 5504538, -1516124, 6393596, 1408749, 1646583, 1694902, -2949569, -901406, 5223754, --4190278, 2433099, 3666828, -3882651, -6384469, 3011309, -5229123, 694711, 2896956, 7710003, --1771674, -3529390, -3260954, 1315334, 4067334, -5466420, -104153, 4755603, 1759326, 636192, --360777, -274878, 5935108, -64961, 5433671, 3777424, -1446330, 3772592, -1317481, -139050, --612570, -9820443, 3416110, 5870147, -3328063, -1648731, 1329829, 1772748, 1557463, 1130650, --595390, -948114, 287226, -2241436, 6806450, -2777770, 744103, 4044786, 2921115, -2109366, -2647311, 1225139, 1695975, 4156455, 3237332, -4563403, 5035313, 6123013, -2185602, -5443871, -7019587, 4935991, 10973105, -1646583, 999117, 3633006, -5631239, -914828, 1966021, -2030446, --7576323, -223338, 597537, 5168457, -6157910, -14340359, -11954505, -7019587, 2602213, 7146289, --7167764, 4146254, -3617973, 5578626, 3954054, 3858491, 6208375, 3808026, -5233955, -4401268, -661425, 3673808, -477278, 542240, 8754754, 184684, 1341640, 4727149, 4490389, 1049046, --95563, 11365557, -1012002, -3884798, -1494649, 2809982, 2987150, -1852205, 5706401, 1479616, -2935610, -3945464, -4057670, -1120987, -2788508, 1796370, -2285996, 6863895, -7815767, -6300717, -7764227, -434329, -704375, -8975408, 2532420, -4085588, 4651450, -3389266, -10914586, 116501, -4830765, -3779034, 6332930, -3329674, 2538863, 17536352, 3956739, 4784057, 1852205, -3825205, -8209830, -3797825, -2500208, 10774999, -935229, 8698383, -1036161, -9604084, 3320010, -3147137, -10640245, 5841693, -885300, -9473087, -6880001, 9089225, 10435697, -12155294, 6048388, 5133023, -3582540, -615791, 1063004, 1226213, -1072668, 12419972, -693100, -1885491, -3507915, -3883187, --5370320, -1502165, -421444, -6810745, -2652679, 2076617, -5053566, 521302, 130997, 7570954, --2897492, 500364, 3241627, 573378, 6825240, 3454764, 7096897, 3909494, 2036351, -7350300, -623307, -5338108, -5518496, 1655710, 7205882, 121333, 6146098, -2223719, -5048197, -632971, -48318, 2407329, 4085051, -1425392, -363998, -1718524, 2061584, 2446521, -6739878, 2144263, -637266, 4982699, 3354370, 4014721, 11094974, 5914707, -4953708, -4286378, -12146704, -734976, --382252, -6385543, 2319819, 9694815, 1040456, -7587597, 6929930, 6735046, -848793, 2695629, -6651294, 1615982, -6352257, -959925, 14249091, 7083475, 1305670, -9536975, -3602941, 8652748, -2778844, -1333587, 4669167, 4325032, 4345433, -90731, 8709657, -143881, -1406065, 2183991, --4720706, -5909875, -582505, 894427, 3023657, 1726040, -5769752, 5418101, 9365176, 4858682, --631897, 7073275, -8598525, 4532801, -5308043, 4982162, -1818382, -6083821, -782758, -7886634, --13120051, -4804995, -5575942, -836982, -679679, -6834904, 583579, -2282775, 3042448, 2254321, -3630321, -1004486, 756988, -6631430, -225486, 759136, 7020661, -3468723, -12169253, -7417409, -16307454, -3267933, -4033511, 1365800, -956167, 18275086, -5597953, -9257265, -132607, -9123584, -2005750, 7992934, 7795903, 2985539, -16966732, 14055280, -11107322, 6120866, -7708930, -5163088, --4475893, 7238094, 6961068, -10554345, 503585, 5234492, -3775813, 2643552, 2856690, -3519726, -138513, -8588324, -6451041, -13496398, 7896298, -1475858, 13701483, -6070400, 2676838, 9898826, --2730526, -2280628, -4546760, 11298448, 7476465, -12687870, 3379603, -6925098, -2911988, -2330020, --7836168, 5060009, 1952600, 12271258, 7777112, -13984950, -2830384, -5604933, 8107825, 3694209, -281857, -7774428, 812823, -78383, 6706055, -310848, 408559, -8837432, -722628, 8087424, --6920803, 2406256, -2462627, -140660, -5356361, 569083, 1816234, 4044786, -4481262, 273804, --9458592, -1222992, -10921565, 1658931, -2753074, 6206228, -469225, 5249524, -7507603, -14139032, -2942590, 9386651, 1185948, -1228361, 7323993, 4873714, -11570642, -287763, -4410932, 14453102, --728534, 1576253, 1055488, 20938, -552440, -5362804, 11437498, -1126892, -16474958, -3227131, -9794136, -6553047, 1523103, -434865, 1185411, -2232846, 1430224, -3204046, 3751117, -6480032, -5740224, 8077223, -6682432, -1883343, -4042101, -11630235, 4354023, -8336532, 6818798, -7369090, --12533788, -3629247, 7050189, -2563559, -4670240, 4594005, 6454262, 3564823, 7072201, 12362526, -9833328, -969052, 1564979, 1421097, -7289633, 1008244, -7705172, -7978439, 3452080, -5981279, --16639777, -12903692, 7306276, 14982993, -530428, -265214, 2224793, -6330782, -3874597, -16044387, --9375377, -4107599, -665183, -11490648, 16812112, 4066797, 9135932, -10405632, -13669270, -9265855, --4354560, 3286724, -15442555, -6033892, 6432251, -2296197, -18671296, -5487895, 1962800, 882079, -10793253, 4493073, -4027069, -7910793, 10247255, -5504001, -1106491, 8821863, 1913945, -8056285, --4998268, 78383, -15194521, 4483946, 10969883, -4189741, -6792491, 2479270, -7924215, -1923072, -1005022, -3900367, -4105989, 4748623, -6031745, -10848014, 5324686, -5776194, -9240622, -11082089, --6502044, 2182380, -5296232, 3023120, 14303315, 9431748, -2301029, 15241228, 13828184, -4990215, -1500554, 5310727, -7882876, -3292629, -16057809, 3561065, -4700305, -10024991, 25879862, -804770, -15793668, -7821136, -23037668, 6757058, 1785096, -664646, -10887742, -806917, -7225209, 18342732, -13091060, 12093554, 8503498, -13933948, -233539, 2208150, 12454868, -21277804, -2580739, -5006858, --6424734, 3504693, -7219840, 3038689, 4680978, 3842922, 3724811, 5272073, -1600412, -1837172, --10570451, -2209761, -1687922, 10575283, -81068, -9127342, -2287607, 11485816, -1368484, 6805376, -8312373, -5774047, -3639448, -13581760, -8106214, 27448600, 7120519, 12375411, 6469295, 1861868, -1003412, -16926466, 10189273, 1890323, 2989297, 9054328, 9582072, 15176267, -17173426, -6853157, --9530532, -986769, 2377265, -2081449, -4832912, -2673617, -14449344, -18017388, -11847667, -16967806, --2371359, -11218991, -19244674, -8083129, 35009888, 7945690, -5098663, -7270306, 1070521, -11256036, --22043382, 16153909, -12348, 10377715, -7969849, 7488813, 17873506, -1832340, 1876901, -4592394, -15508590, 13110925, 4948876, -21294984, 1350767, 3033321, 12906914, 18985366, -5857799, -4008278, --2769717, 5006858, 6544457, 5550172, -9942312, 4290136, -11440719, 8385387, 11017128, -5557688, --11622182, 6973417, -12643310, -11331197, -903017, 3122441, 15483357, 1797981, -2689187, 13466333, --3063922, 12090333, 21969294, 11199664, -376347, -14415521, -2048163, -8325257, -7429757, 14359149, -4823785, -14547054, -1050656, -11087995, -3780645, 19170050, 7723425, 2913599, 6998113, 11717745, -4639102, -15084999, 6430640, 13320841, 2656437, -9853729, 2248416, 2196339, -445066, -6799470, -8609262, 5616744, 5090610, -8522826, -408559, -10876468, -25558814, 8850854, -10159208, 2851322, -944356, 17969070, -12315819, -10885595, -4547834, -4944044, -6561100, 13320841, -11696807, -16489990, -4999879, -30874372, 950262, -5714991, -13063680, 16800838, -1033477, -826781, 7039989, -6424198, -5290863, -1472100, -18488760, -19967302, -201327, 4520990, 11826192, 6004365, -1375463, -1811403, --11679627, -5158256, 11617350, -17878338, 25119116, 15404974, 3253438, 19120658, -12589623, -4800163, --11574400, -11061688, -5262409, 9164923, 23531588, 937914, -12627741, -1262184, 765578, -424665, --1745904, -6542846, 5855651, 7053947, 15375446, 1030792, 17340930, 10892574, 4021700, 1370095, -2708514, -24882356, 12884365, -630286, -17564268, 15156940, -1969243, 20657718, -8826158, -8169028, --46883328, -4715337, 29434484, -6235756, 1903207, 23811298, -4679904, -691490, 4131759, 5650567, --6336151, 5649493, -1418950, -9221295, 9168681, 8498130, -26797374, 2390686, -23689966, -1581622, --11656541, -14970645, -1807108, -5116380, -12360379, 5973763, 3602941, 7772817, 13160317, -17849348, -22788022, 625455, -18552648, 798864, -12319040, -7815230, -13320841, -14359149, -4258460, 13338021, --10581189, 5920076, 16021839, -9432285, -13567802, -14948097, -18896782, -23153632, -11250130, -7198902, -3664144, -4229469, 8150238, 3359738, -11146514, -1852742, 17058536, 7641284, -19711752, 7700877, -722628, -7094749, -17847736, 12739947, -4628364, 17909476, 26877368, -525597, 25927106, -13830868, -16615081, -11312407, 17983028, 16446504, 6026913, -21614422, 17217988, -42319924, -3806415, -3040300, --4890357, 5104032, -26240102, 2789045, -6237903, -1119913, 10036265, 5465346, 11868068, -9281424, -7963943, -3960497, -23606750, -8032663, -17743046, -9246528, 9221832, -18514530, 996969, -6356552, --16229608, -1829656, 12730283, -18483928, -20146080, 8309151, 9450002, 81604, -10464688, 11053098, -9221295, 14074071, 9786620, 5415954, 14015015, 19360638, -11944841, 3378529, -10797011, 24084030, --3860639, -15782931, 17643188, 9097814, 2675765, -8875013, -14486925, 3323768, 5332202, 7921531, --2860448, -9875740, 5539971, -11586211, -1966021, -11450920, 34011848, 5924371, -12873628, 30167850, --6121402, 9417790, -10239739, 15272904, 19810000, -13604309, 18875844, 22846542, 27331024, 22785338, -720481, 15809238, 44181792, 12306692, -8236137, -5912023, 9802189, 3623879, 3834332, -421981, --18497888, 15696495, -41459856, 5147519, 8385387, -1133871, -8055748, -14996415, -7778723, 2543158, -11541114, 19198504, -11540577, -23133768, -19797114, -2087354, 149250, -13390634, 28288266, -12833362, --9354976, 12512850, -4588636, 2730526, -3111167, 25317222, 3616363, -24266566, 9326521, 3668439, -16680579, -5634997, 1380832, -9796284, 8065412, 4212826, 21198348, -4882304, 9334575, 10620380, --13506062, -14126684, 624918, 13390097, -25869124, -29960082, -9236864, -12271258, -1974074, -4348118, -2672544, 6760816, -6416681, 843424, -35089884, -29890824, 23248122, 24486146, -30391726, -23856932, --29240674, -16112570, -12221329, 13829258, -16019691, -29508036, 746787, -519154, -15814070, -3633542, --25342992, -2645700, -6460705, 7885560, -12254079, -2843268, -39230768, 34690452, 21581674, -3377455, -46580532, -4283693, -26341572, -2048699, 10026064, -15637439, -21626234, -4109747, -14966887, -366146, -3385508, -21330418, 31107374, 1360968, 2740726, -19662360, -6460705, 2449742, -6445136, 5390721, -6458020, 26401164, 3864934, -1032403, 20242718, 17710834, -7059853, 10578504, -14260902, 4081830, -10814728, 11807402, 28475096, -28829432, 16840566, 54489712, -759672, 9274445, 17298518, 2532420, -2389076, 9190693, 5365488, -17603460, -23022098, -7309498, 15770583, 5750961, -24082956, -11489574, --2794950, -10036802, 17952426, 2647847, 13234942, -33234994, -23538568, 11045045, 20793010, 15622407, -6443525, 34003256, 15497316, -11799349, 18188650, -14481556, -8872866, 3543348, 14829985, -43890808, --202937, 936303, -2580739, -4457639, 19958714, 2957085, -13201656, -21297132, 21843130, -18989662, --493921, 16061030, 10832444, -14588930, -5242545, -24314884, -1045288, 8810589, 8078834, 11890617, -1873143, -15249281, -21722334, 18718004, 8069707, 10129143, 2602213, 10315975, 1883880, 14302778, --23215908, -36437428, 9927817, -4022774, -8722005, 23052700, -4284767, -9506373, 18298708, 19625316, -14277545, 587337, -9986336, -14392435, -4571993, -19614578, 50732152, -2190970, 18176838, 6185827, --17037062, 16244103, -6482717, -13788993, 16037408, 15214385, -27819040, 22269942, -2607582, 30005716, --26889716, -17655536, 28460064, 2160906, -21373904, 26477936, -7023882, 43059196, -14782204, -8987219, --21177946, 20173462, 6112276, -12845173, 12127377, -13635984, 7320235, -6656126, -11775190, 32322850, --6487548, 21531744, -34273840, -7341173, 334471, -43383464, -8130910, 5011153, 21939230, -11509975, --8733816, -183073, -2072322, 28572270, -1625645, -16019154, 32679870, -5002563, -400506, 4841502, --11335492, 26101590, 3047816, -6645925, 14293651, 10066866, -13564044, -6185827, -5593658, 20078436, --41020696, -1827509, -6882685, -16048145, 8593156, -16304233, 26008712, -7583302, -29123100, -4294431, -47747688, -29251948, 21729850, -32494648, -7580081, 30042760, 24271934, -18017388, 9405978, -21736830, --25473452, 4513474, -10332618, 10499584, 4957466, -3192771, 6172942, -40882720, -13854491, -21572546, --27273042, 11914776, -9342091, -9667971, -14401025, -29867202, -22034256, 16470663, -2219961, 55252608, -11318849, 1999307, 20637854, 23250268, 9959492, 21972516, -12772159, -17424682, 19602768, -30713312, --2995203, -6628745, 2370822, 20986284, -13364328, 23352810, 10785200, 5071820, 7736847, -38956428, -26955214, 4639639, -26482232, 10404021, -28106266, 4703526, 39475044, -4996121, -22115860, -24555402, -11237782, 17438104, 15057618, 7449084, -24638616, -17579838, -6982543, -4808216, 34029564, -20971252, --11556683, 49225692, -26314728, -2087354, 20607254, 146029, 21699786, -2917894, -15385647, -10998338, --28876676, 15535970, 22753662, -31967442, 49468360, 16220481, -34764540, -32814088, -29943438, -37497212, --28858422, 1903207, 16935592, 3335042, -23455354, -9226127, 19214074, 537, -13471165, 18063022, --31442918, 2750390, -4580046, -31038118, -25562034, 5888400, -6646999, 23365158, -33836288, -3894999, --1382443, 23434952, -58744952, -54430656, -47081432, -30520038, 12375411, -12936441, 60677688, 15936476, --6408091, -13984414, -7590818, 17067664, -39355860, 46060840, 61158188, 24163486, -3594888, 48155172, --15217069, 29057602, 55621436, -10290205, 3193845, 10222559, 74011952, -18925236, -4496831, 43685724, -16838420, 13880261, -11901354, -45275396, 3334505, -35961224, 17278654, -44520556, -51496656, -956704, --2655901, -36516884, -1574106, -17985176, -36677412, -30056718, -47932372, -2786897, 49809272, -16275242, --8945343, -46080704, -23820962, -17394080, -14991046, 14701673, -10460930, 81398224, -18678276, -1978369, --29141354, 61088392, 51912196, -37045704, 42515344, -15607911, -59020368, -11986717, -4414690, 11353209, --12442520, -15092515, -5794985, -25872882, 9076877, 28978144, -33502892, -18060338, 24429774, 105075304, -11806328, -64860984, -16569984, -22447646, 4788352, 33402498, 58463096, 17608830, -49318572, -22549, -34026880, 8391829, 777926, -468151, 8992588, -3571265, -5810017, 41694468, 25614648, 23898272, --34112776, -20975546, 23805930, 10501195, 14282377, -10421201, 4836133, 46720116, 1658394, 39947492, -20774756, 22656490, 38132868, 7302518, -19023484, 6580427, -21824876, 7795903, 16815870, 6231461, -62207768, -18081812, -38257420, -35539244, 48468168, 24373402, 26492432, 19935090, -25615722, -31052614, --19152332, 1916092, 11931419, -4145717, 18426484, 34793532, -281320, 26439818, 22611392, -27674084, --4159676, 13377749, -12610561, -8691940, -13219909, -47124920, -6345814, 28299002, 4569845, 51928840, -32962800, -15269682, 18016850, -3700651, -27634356, 4979478, 80083424, 23267986, 32287416, -15173046, --77538656, -36133024, -57773216, -16707423, 34664680, 87195352, 35489316, 11341398, -43179992, -36404144, -24209120, 44207560, 18313740, 53265112, -4974646, -32021128, -52182244, -22367116, -10526428, 39887900, -1716913, 23689966, 16675211, 4850092, 48036524, 37338300, -7135015, -3481608, -50422380, -10122164, --4355634, 2280628, 23574002, 49501108, 25998510, 24350318, 41668700, 27278948, -50770272, -36767068, --15676094, -28679108, 27423904, 22207128, 42345692, 36976448, 36812164, 12801687, 2777233, -33282238, --40048424, -32840394, 6739341, 17027398, -5349382, -4617090, 67702640, 18141942, -11111080, -7761006, -43567076, -54899884, 3856344, -104087992, -31280784, 21996676, -45863272, 27477054, 5349382, -9892920, -37969120, 3468723, -115902376, -74394736, -35985384, 33944200, 14284524, 161773168, 178037664, 105389368, -197549712, 157703152, 172297440, 116491328, 147426896, 116111760, 9766756, -51516524, -69096896, -70964136, --146513680, -182563488, -185266640, -131311648, -96490200, -36483064, 18901078, -48716204, 45999636, -62283468, --11984569, 3306051, -7434589, 25414396, -48779556, 97562864, 31021476, 90759104, 68488624, 41690172, -39130912, 57097296, 48281336, 59355376, 125164472, 114416856, 101272104, 113453712, 146351552, 129560376, -130612104, 212603568, 94868848, 156988032, 206231984, 144597584, 192188512, 110306032, 148384672, 116758152, -144128896, 146131968, 82794088, 107959912, 100515120, 106456672, 115922776, 58412092, 39406860, -29678760, -31663036, -48875116, -19325742, -89413168, -88047904, -101545912, -260147248, -222526016, -175442432, -80647136, --13482976, 0, 0, }, +-4000225, 3040300, -444529, -324270, -3609383, 2025077, 5330592, -3006477, -1369558, 754841, +-2290828, -3757023, 580894, 78383, -3585761, -6129992, 4901632, -2550137, 8421357, -464930, +4721243, -6693707, -304406, 2417530, -1489280, -3539053, -1470489, -2531346, -436476, -2094333, +224412, -438624, -3110093, 1935420, -4150012, 4902705, -1733019, -1356673, -803159, 5811628, +5447093, 210990, 4046933, 2596308, -1280437, -1222455, 5425618, -2703145, -6251325, -83752, +-1341640, 6776385, 349503, 847719, -4264366, 11811, -2239826, -2360622, -1159104, -2544768, +1848983, -3678640, -1647657, 938450, -1364189, -3943854, -5515275, -107374, 3163244, 1662152, +2664490, -53687, -676457, 988916, -346819, -3704946, -3823595, -6515466, 2431488, -3365107, +-5735392, -4250944, 3114925, -8042327, -3912715, -9757629, 3612068, 3840775, 5691906, 2555506, +-2946348, 6759205, -4532801, 1074279, 490700, -1390496, -4810900, -3007014, -5326297, -148713, +-2069637, 2800856, 2438468, -3077881, -527207, -994822, -4865124, -596464, -821413, 1928977, +240518, 4319127, -1342714, 5563594, -2247342, -315680, 1285806, -4742181, 3347390, -1734093, +-1345399, 86973, -855235, 1868311, -8792335, 3805878, 5801427, 346282, 3428458, 1242319, +-3727495, -1000191, -4077535, 5497558, -1284732, -4211753, 3885335, -5981816, 513785, 1603633, +-5961952, 210990, -1216550, -2913599, 2358474, -84289, 748398, -3488050, -1758789, -10506564, +-1186485, 1881196, -14341970, -8486319, 1502165, -4544076, 801548, -4688494, -8268886, -5362804, +9220758, 5504538, -1516124, 6393596, 1408749, 1646583, 1694902, -2949569, -901406, 5223754, +-4190278, 2433099, 3666828, -3882651, -6384469, 3011309, -5229123, 694711, 2896956, 7710003, +-1771674, -3529390, -3260954, 1315334, 4067334, -5466420, -104153, 4755603, 1759326, 636192, +-360777, -274878, 5935108, -64961, 5433671, 3777424, -1446330, 3772592, -1317481, -139050, +-612570, -9820443, 3416110, 5870147, -3328063, -1648731, 1329829, 1772748, 1557463, 1130650, +-595390, -948114, 287226, -2241436, 6806450, -2777770, 744103, 4044786, 2921115, -2109366, +2647311, 1225139, 1695975, 4156455, 3237332, -4563403, 5035313, 6123013, -2185602, -5443871, +7019587, 4935991, 10973105, -1646583, 999117, 3633006, -5631239, -914828, 1966021, -2030446, +-7576323, -223338, 597537, 5168457, -6157910, -14340359, -11954505, -7019587, 2602213, 7146289, +-7167764, 4146254, -3617973, 5578626, 3954054, 3858491, 6208375, 3808026, -5233955, -4401268, +661425, 3673808, -477278, 542240, 8754754, 184684, 1341640, 4727149, 4490389, 1049046, +-95563, 11365557, -1012002, -3884798, -1494649, 2809982, 2987150, -1852205, 5706401, 1479616, +2935610, -3945464, -4057670, -1120987, -2788508, 1796370, -2285996, 6863895, -7815767, -6300717, +7764227, -434329, -704375, -8975408, 2532420, -4085588, 4651450, -3389266, -10914586, 116501, +4830765, -3779034, 6332930, -3329674, 2538863, 17536352, 3956739, 4784057, 1852205, -3825205, +8209830, -3797825, -2500208, 10774999, -935229, 8698383, -1036161, -9604084, 3320010, -3147137, +10640245, 5841693, -885300, -9473087, -6880001, 9089225, 10435697, -12155294, 6048388, 5133023, +3582540, -615791, 1063004, 1226213, -1072668, 12419972, -693100, -1885491, -3507915, -3883187, +-5370320, -1502165, -421444, -6810745, -2652679, 2076617, -5053566, 521302, 130997, 7570954, +-2897492, 500364, 3241627, 573378, 6825240, 3454764, 7096897, 3909494, 2036351, -7350300, +623307, -5338108, -5518496, 1655710, 7205882, 121333, 6146098, -2223719, -5048197, -632971, +48318, 2407329, 4085051, -1425392, -363998, -1718524, 2061584, 2446521, -6739878, 2144263, +637266, 4982699, 3354370, 4014721, 11094974, 5914707, -4953708, -4286378, -12146704, -734976, +-382252, -6385543, 2319819, 9694815, 1040456, -7587597, 6929930, 6735046, -848793, 2695629, +6651294, 1615982, -6352257, -959925, 14249091, 7083475, 1305670, -9536975, -3602941, 8652748, +2778844, -1333587, 4669167, 4325032, 4345433, -90731, 8709657, -143881, -1406065, 2183991, +-4720706, -5909875, -582505, 894427, 3023657, 1726040, -5769752, 5418101, 9365176, 4858682, +-631897, 7073275, -8598525, 4532801, -5308043, 4982162, -1818382, -6083821, -782758, -7886634, +-13120051, -4804995, -5575942, -836982, -679679, -6834904, 583579, -2282775, 3042448, 2254321, +3630321, -1004486, 756988, -6631430, -225486, 759136, 7020661, -3468723, -12169253, -7417409, +16307454, -3267933, -4033511, 1365800, -956167, 18275086, -5597953, -9257265, -132607, -9123584, +2005750, 7992934, 7795903, 2985539, -16966732, 14055280, -11107322, 6120866, -7708930, -5163088, +-4475893, 7238094, 6961068, -10554345, 503585, 5234492, -3775813, 2643552, 2856690, -3519726, +138513, -8588324, -6451041, -13496398, 7896298, -1475858, 13701483, -6070400, 2676838, 9898826, +-2730526, -2280628, -4546760, 11298448, 7476465, -12687870, 3379603, -6925098, -2911988, -2330020, +-7836168, 5060009, 1952600, 12271258, 7777112, -13984950, -2830384, -5604933, 8107825, 3694209, +281857, -7774428, 812823, -78383, 6706055, -310848, 408559, -8837432, -722628, 8087424, +-6920803, 2406256, -2462627, -140660, -5356361, 569083, 1816234, 4044786, -4481262, 273804, +-9458592, -1222992, -10921565, 1658931, -2753074, 6206228, -469225, 5249524, -7507603, -14139032, +2942590, 9386651, 1185948, -1228361, 7323993, 4873714, -11570642, -287763, -4410932, 14453102, +-728534, 1576253, 1055488, 20938, -552440, -5362804, 11437498, -1126892, -16474958, -3227131, +9794136, -6553047, 1523103, -434865, 1185411, -2232846, 1430224, -3204046, 3751117, -6480032, +5740224, 8077223, -6682432, -1883343, -4042101, -11630235, 4354023, -8336532, 6818798, -7369090, +-12533788, -3629247, 7050189, -2563559, -4670240, 4594005, 6454262, 3564823, 7072201, 12362526, +9833328, -969052, 1564979, 1421097, -7289633, 1008244, -7705172, -7978439, 3452080, -5981279, +-16639777, -12903692, 7306276, 14982993, -530428, -265214, 2224793, -6330782, -3874597, -16044387, +-9375377, -4107599, -665183, -11490648, 16812112, 4066797, 9135932, -10405632, -13669270, -9265855, +-4354560, 3286724, -15442555, -6033892, 6432251, -2296197, -18671296, -5487895, 1962800, 882079, +10793253, 4493073, -4027069, -7910793, 10247255, -5504001, -1106491, 8821863, 1913945, -8056285, +-4998268, 78383, -15194521, 4483946, 10969883, -4189741, -6792491, 2479270, -7924215, -1923072, +1005022, -3900367, -4105989, 4748623, -6031745, -10848014, 5324686, -5776194, -9240622, -11082089, +-6502044, 2182380, -5296232, 3023120, 14303315, 9431748, -2301029, 15241228, 13828184, -4990215, +1500554, 5310727, -7882876, -3292629, -16057809, 3561065, -4700305, -10024991, 25879862, -804770, +15793668, -7821136, -23037668, 6757058, 1785096, -664646, -10887742, -806917, -7225209, 18342732, +13091060, 12093554, 8503498, -13933948, -233539, 2208150, 12454868, -21277804, -2580739, -5006858, +-6424734, 3504693, -7219840, 3038689, 4680978, 3842922, 3724811, 5272073, -1600412, -1837172, +-10570451, -2209761, -1687922, 10575283, -81068, -9127342, -2287607, 11485816, -1368484, 6805376, +8312373, -5774047, -3639448, -13581760, -8106214, 27448600, 7120519, 12375411, 6469295, 1861868, +1003412, -16926466, 10189273, 1890323, 2989297, 9054328, 9582072, 15176267, -17173426, -6853157, +-9530532, -986769, 2377265, -2081449, -4832912, -2673617, -14449344, -18017388, -11847667, -16967806, +-2371359, -11218991, -19244674, -8083129, 35009888, 7945690, -5098663, -7270306, 1070521, -11256036, +-22043382, 16153909, -12348, 10377715, -7969849, 7488813, 17873506, -1832340, 1876901, -4592394, +15508590, 13110925, 4948876, -21294984, 1350767, 3033321, 12906914, 18985366, -5857799, -4008278, +-2769717, 5006858, 6544457, 5550172, -9942312, 4290136, -11440719, 8385387, 11017128, -5557688, +-11622182, 6973417, -12643310, -11331197, -903017, 3122441, 15483357, 1797981, -2689187, 13466333, +-3063922, 12090333, 21969294, 11199664, -376347, -14415521, -2048163, -8325257, -7429757, 14359149, +4823785, -14547054, -1050656, -11087995, -3780645, 19170050, 7723425, 2913599, 6998113, 11717745, +4639102, -15084999, 6430640, 13320841, 2656437, -9853729, 2248416, 2196339, -445066, -6799470, +8609262, 5616744, 5090610, -8522826, -408559, -10876468, -25558814, 8850854, -10159208, 2851322, +944356, 17969070, -12315819, -10885595, -4547834, -4944044, -6561100, 13320841, -11696807, -16489990, +4999879, -30874372, 950262, -5714991, -13063680, 16800838, -1033477, -826781, 7039989, -6424198, +5290863, -1472100, -18488760, -19967302, -201327, 4520990, 11826192, 6004365, -1375463, -1811403, +-11679627, -5158256, 11617350, -17878338, 25119116, 15404974, 3253438, 19120658, -12589623, -4800163, +-11574400, -11061688, -5262409, 9164923, 23531588, 937914, -12627741, -1262184, 765578, -424665, +-1745904, -6542846, 5855651, 7053947, 15375446, 1030792, 17340930, 10892574, 4021700, 1370095, +2708514, -24882356, 12884365, -630286, -17564268, 15156940, -1969243, 20657718, -8826158, -8169028, +-46883328, -4715337, 29434484, -6235756, 1903207, 23811298, -4679904, -691490, 4131759, 5650567, +-6336151, 5649493, -1418950, -9221295, 9168681, 8498130, -26797374, 2390686, -23689966, -1581622, +-11656541, -14970645, -1807108, -5116380, -12360379, 5973763, 3602941, 7772817, 13160317, -17849348, +22788022, 625455, -18552648, 798864, -12319040, -7815230, -13320841, -14359149, -4258460, 13338021, +-10581189, 5920076, 16021839, -9432285, -13567802, -14948097, -18896782, -23153632, -11250130, -7198902, +3664144, -4229469, 8150238, 3359738, -11146514, -1852742, 17058536, 7641284, -19711752, 7700877, +722628, -7094749, -17847736, 12739947, -4628364, 17909476, 26877368, -525597, 25927106, -13830868, +16615081, -11312407, 17983028, 16446504, 6026913, -21614422, 17217988, -42319924, -3806415, -3040300, +-4890357, 5104032, -26240102, 2789045, -6237903, -1119913, 10036265, 5465346, 11868068, -9281424, +7963943, -3960497, -23606750, -8032663, -17743046, -9246528, 9221832, -18514530, 996969, -6356552, +-16229608, -1829656, 12730283, -18483928, -20146080, 8309151, 9450002, 81604, -10464688, 11053098, +9221295, 14074071, 9786620, 5415954, 14015015, 19360638, -11944841, 3378529, -10797011, 24084030, +-3860639, -15782931, 17643188, 9097814, 2675765, -8875013, -14486925, 3323768, 5332202, 7921531, +-2860448, -9875740, 5539971, -11586211, -1966021, -11450920, 34011848, 5924371, -12873628, 30167850, +-6121402, 9417790, -10239739, 15272904, 19810000, -13604309, 18875844, 22846542, 27331024, 22785338, +720481, 15809238, 44181792, 12306692, -8236137, -5912023, 9802189, 3623879, 3834332, -421981, +-18497888, 15696495, -41459856, 5147519, 8385387, -1133871, -8055748, -14996415, -7778723, 2543158, +11541114, 19198504, -11540577, -23133768, -19797114, -2087354, 149250, -13390634, 28288266, -12833362, +-9354976, 12512850, -4588636, 2730526, -3111167, 25317222, 3616363, -24266566, 9326521, 3668439, +16680579, -5634997, 1380832, -9796284, 8065412, 4212826, 21198348, -4882304, 9334575, 10620380, +-13506062, -14126684, 624918, 13390097, -25869124, -29960082, -9236864, -12271258, -1974074, -4348118, +2672544, 6760816, -6416681, 843424, -35089884, -29890824, 23248122, 24486146, -30391726, -23856932, +-29240674, -16112570, -12221329, 13829258, -16019691, -29508036, 746787, -519154, -15814070, -3633542, +-25342992, -2645700, -6460705, 7885560, -12254079, -2843268, -39230768, 34690452, 21581674, -3377455, +46580532, -4283693, -26341572, -2048699, 10026064, -15637439, -21626234, -4109747, -14966887, -366146, +3385508, -21330418, 31107374, 1360968, 2740726, -19662360, -6460705, 2449742, -6445136, 5390721, +6458020, 26401164, 3864934, -1032403, 20242718, 17710834, -7059853, 10578504, -14260902, 4081830, +10814728, 11807402, 28475096, -28829432, 16840566, 54489712, -759672, 9274445, 17298518, 2532420, +2389076, 9190693, 5365488, -17603460, -23022098, -7309498, 15770583, 5750961, -24082956, -11489574, +-2794950, -10036802, 17952426, 2647847, 13234942, -33234994, -23538568, 11045045, 20793010, 15622407, +6443525, 34003256, 15497316, -11799349, 18188650, -14481556, -8872866, 3543348, 14829985, -43890808, +-202937, 936303, -2580739, -4457639, 19958714, 2957085, -13201656, -21297132, 21843130, -18989662, +-493921, 16061030, 10832444, -14588930, -5242545, -24314884, -1045288, 8810589, 8078834, 11890617, +1873143, -15249281, -21722334, 18718004, 8069707, 10129143, 2602213, 10315975, 1883880, 14302778, +-23215908, -36437428, 9927817, -4022774, -8722005, 23052700, -4284767, -9506373, 18298708, 19625316, +14277545, 587337, -9986336, -14392435, -4571993, -19614578, 50732152, -2190970, 18176838, 6185827, +-17037062, 16244103, -6482717, -13788993, 16037408, 15214385, -27819040, 22269942, -2607582, 30005716, +-26889716, -17655536, 28460064, 2160906, -21373904, 26477936, -7023882, 43059196, -14782204, -8987219, +-21177946, 20173462, 6112276, -12845173, 12127377, -13635984, 7320235, -6656126, -11775190, 32322850, +-6487548, 21531744, -34273840, -7341173, 334471, -43383464, -8130910, 5011153, 21939230, -11509975, +-8733816, -183073, -2072322, 28572270, -1625645, -16019154, 32679870, -5002563, -400506, 4841502, +-11335492, 26101590, 3047816, -6645925, 14293651, 10066866, -13564044, -6185827, -5593658, 20078436, +-41020696, -1827509, -6882685, -16048145, 8593156, -16304233, 26008712, -7583302, -29123100, -4294431, +47747688, -29251948, 21729850, -32494648, -7580081, 30042760, 24271934, -18017388, 9405978, -21736830, +-25473452, 4513474, -10332618, 10499584, 4957466, -3192771, 6172942, -40882720, -13854491, -21572546, +-27273042, 11914776, -9342091, -9667971, -14401025, -29867202, -22034256, 16470663, -2219961, 55252608, +11318849, 1999307, 20637854, 23250268, 9959492, 21972516, -12772159, -17424682, 19602768, -30713312, +-2995203, -6628745, 2370822, 20986284, -13364328, 23352810, 10785200, 5071820, 7736847, -38956428, +26955214, 4639639, -26482232, 10404021, -28106266, 4703526, 39475044, -4996121, -22115860, -24555402, +11237782, 17438104, 15057618, 7449084, -24638616, -17579838, -6982543, -4808216, 34029564, -20971252, +-11556683, 49225692, -26314728, -2087354, 20607254, 146029, 21699786, -2917894, -15385647, -10998338, +-28876676, 15535970, 22753662, -31967442, 49468360, 16220481, -34764540, -32814088, -29943438, -37497212, +-28858422, 1903207, 16935592, 3335042, -23455354, -9226127, 19214074, 537, -13471165, 18063022, +-31442918, 2750390, -4580046, -31038118, -25562034, 5888400, -6646999, 23365158, -33836288, -3894999, +-1382443, 23434952, -58744952, -54430656, -47081432, -30520038, 12375411, -12936441, 60677688, 15936476, +-6408091, -13984414, -7590818, 17067664, -39355860, 46060840, 61158188, 24163486, -3594888, 48155172, +-15217069, 29057602, 55621436, -10290205, 3193845, 10222559, 74011952, -18925236, -4496831, 43685724, +16838420, 13880261, -11901354, -45275396, 3334505, -35961224, 17278654, -44520556, -51496656, -956704, +-2655901, -36516884, -1574106, -17985176, -36677412, -30056718, -47932372, -2786897, 49809272, -16275242, +-8945343, -46080704, -23820962, -17394080, -14991046, 14701673, -10460930, 81398224, -18678276, -1978369, +-29141354, 61088392, 51912196, -37045704, 42515344, -15607911, -59020368, -11986717, -4414690, 11353209, +-12442520, -15092515, -5794985, -25872882, 9076877, 28978144, -33502892, -18060338, 24429774, 105075304, +11806328, -64860984, -16569984, -22447646, 4788352, 33402498, 58463096, 17608830, -49318572, -22549, +34026880, 8391829, 777926, -468151, 8992588, -3571265, -5810017, 41694468, 25614648, 23898272, +-34112776, -20975546, 23805930, 10501195, 14282377, -10421201, 4836133, 46720116, 1658394, 39947492, +20774756, 22656490, 38132868, 7302518, -19023484, 6580427, -21824876, 7795903, 16815870, 6231461, +62207768, -18081812, -38257420, -35539244, 48468168, 24373402, 26492432, 19935090, -25615722, -31052614, +-19152332, 1916092, 11931419, -4145717, 18426484, 34793532, -281320, 26439818, 22611392, -27674084, +-4159676, 13377749, -12610561, -8691940, -13219909, -47124920, -6345814, 28299002, 4569845, 51928840, +32962800, -15269682, 18016850, -3700651, -27634356, 4979478, 80083424, 23267986, 32287416, -15173046, +-77538656, -36133024, -57773216, -16707423, 34664680, 87195352, 35489316, 11341398, -43179992, -36404144, +24209120, 44207560, 18313740, 53265112, -4974646, -32021128, -52182244, -22367116, -10526428, 39887900, +1716913, 23689966, 16675211, 4850092, 48036524, 37338300, -7135015, -3481608, -50422380, -10122164, +-4355634, 2280628, 23574002, 49501108, 25998510, 24350318, 41668700, 27278948, -50770272, -36767068, +-15676094, -28679108, 27423904, 22207128, 42345692, 36976448, 36812164, 12801687, 2777233, -33282238, +-40048424, -32840394, 6739341, 17027398, -5349382, -4617090, 67702640, 18141942, -11111080, -7761006, +43567076, -54899884, 3856344, -104087992, -31280784, 21996676, -45863272, 27477054, 5349382, -9892920, +37969120, 3468723, -115902376, -74394736, -35985384, 33944200, 14284524, 161773168, 178037664, 105389368, +197549712, 157703152, 172297440, 116491328, 147426896, 116111760, 9766756, -51516524, -69096896, -70964136, +-146513680, -182563488, -185266640, -131311648, -96490200, -36483064, 18901078, -48716204, 45999636, -62283468, +-11984569, 3306051, -7434589, 25414396, -48779556, 97562864, 31021476, 90759104, 68488624, 41690172, +39130912, 57097296, 48281336, 59355376, 125164472, 114416856, 101272104, 113453712, 146351552, 129560376, +130612104, 212603568, 94868848, 156988032, 206231984, 144597584, 192188512, 110306032, 148384672, 116758152, +144128896, 146131968, 82794088, 107959912, 100515120, 106456672, 115922776, 58412092, 39406860, -29678760, +31663036, -48875116, -19325742, -89413168, -88047904, -101545912, -260147248, -222526016, -175442432, -80647136, +-13482976, 0, 0, }, }, { { 1787243, --403190, 1455457, -329102, 6126771, -915902, -234076, 7471096, -1792612, 8322036, 1512365, --3323231, 5019206, 2379949, -3670050, 1390496, 1989107, 594316, 3205656, -833761, 2577517, --537, -3583613, 1549410, 3954591, 2282775, 2304250, -457414, 335007, 22549, 1433982, -2919504, -6963753, -3382287, 161061, 1675574, 652835, -2704756, 5324149, 1768990, -1191317, -2855617, 1030792, 3949759, 1143535, -1539209, -3018825, 3193845, 214212, -56371, -1628330, -900333, -2840584, -1970316, 1321239, 2859375, -1372242, 634581, -27917, -399969, 5279052, -1985349, -627602, 843424, 2306934, 224412, 2361695, -3019362, 2885681, 3200288, -1607392, --5352603, -2806761, -1466731, 5539434, 60666, -1999844, -515933, -4878546, -3432753, 2224256, -137976, -3061775, 3794067, 2615635, -897648, 264141, -587874, 3129421, -4371740, 1641751, -3154117, 2869575, -6267968, -4319664, -3153580, 4181151, 928250, 1376537, -1807644, 4453881, -1581622, -1087701, 28991, -1252520, 778463, 1671816, -1081795, -1269163, -3828427, 3974992, -6508486, 785979, 4092567, -776852, 734976, 1508607, 1711545, -5016522, 234613, -5242008, --1326071, -747324, 1520955, -2648384, -219580, 1140851, 388695, -3061238, -23085, 340376, -2350958, -3252364, -4229469, -551366, 5368709, 8871792, -148176, 1461363, 445066, -1882269, --5506685, -1321239, 3539053, -1638530, 3525095, 1545651, 3604551, -6442, 1345399, 2401961, --5445482, -1385127, -5160403, 2927557, 456340, -2558190, 11362336, -4524211, -7949448, 484258, -3842385, -813359, -5958194, -1862405, -2530810, -1130113, -2772938, -1085553, 4274566, -434329, --2622615, 4642860, 801548, 4503273, -1141388, -1292248, 1882806, -32212, 2175401, -1028108, -4478577, 7011534, -1888175, -4984847, -3447248, 2791192, 75162, -11213086, -967978, -4575214, --1559610, 5226975, -3697967, -3051574, 3802120, -2627446, -462783, 4762045, 1777580, -4112431, -1815697, -3026341, -6462852, 1866700, 2615635, -5181878, -2814814, -1673427, -2035278, -301721, -2164127, 3108483, 5156108, 5430450, -1341104, 259846, -2244121, 2102923, 1577864, -1698660, -2388002, 3158412, -3542274, -9136469, -4521527, 2698850, 4087735, 1476932, 4425427, -3812320, -4625680, 5496485, -1502165, 6090264, -778463, 4458176, -2102923, 38118, -1881733, 5722507, -2332704, -344134, 5261872, -2883534, -2149094, 3695819, -8993662, -1692754, 542777, -2046552, --8014946, -5049271, 3387119, -3287261, -2062121, -17180, 6343130, -1651952, -4380867, -489089, -1653026, 3420942, -515396, -5867999, -3663607, -1205812, -2910914, 792421, -4962835, 2308545, --4672925, -7052873, 226560, 2240899, 2800856, -2381023, -1586454, -4701379, 5834713, 3192235, -798864, -132607, -186831, -2180770, -1095754, 1778117, 2455648, 8621073, -1043677, 2024540, -518080, -450972, -4393215, -3446711, 5888400, -2688650, 476741, 1475858, 718870, 2173790, -2726767, 2399813, 5802501, -3828427, -5665599, -4607426, 2942590, 6386617, -1131724, 4902705, --4283156, -5260798, 4440996, -2166811, 529355, 1672890, 5563594, 2084670, 8792872, -3730179, --4536023, 2101313, -2459406, -2344515, 5049808, -7603703, -4616553, 871342, -1350767, 3615289, --2466385, 1086627, 6340983, -5626944, 4466229, -3331821, 2960843, -3100430, -741956, -357019, -6604586, 1387811, 432718, -4497368, 446140, -5375152, 2320893, 1602023, -3493956, 148713, --1295470, 9926206, 1563905, 890132, -8119636, -4633196, -6791954, 5835250, -3306051, -73014, -3229279, 12683575, 9040369, -3117073, -7247758, -2775086, -6234145, 7378754, -969052, -1497333, --2677375, -1576253, -212064, -2718178, -1327145, -5069672, 3703873, -5236639, -8736500, 8926016, -4349728, -9783399, 9798431, -1738388, -337692, -13660680, 8239358, 5148592, -10663330, 3047816, --1570347, 3936875, 1181653, 4568772, 3277597, 1031866, -4835597, 295279, 2094333, -6868727, --2623688, -8070244, -1124745, -5076652, -2399813, 738198, -5958731, -2434173, -8890045, 3299072, -1132261, 643708, 1025960, -4058744, -7716983, -2608656, 3011309, -1408749, -472446, 8198556, --12120398, 5076115, 6503654, -1009854, 594316, -2485176, -784905, -4071629, -5910412, -4216048, --4629438, -3258270, 3218541, 1661079, 2868501, 4148402, -865973, -2207613, 6042482, 11378979, -8080981, -97711, -9602473, 2772402, -1464047, 1603633, 10205379, 216359, 10240813, 9655086, -14874545, 3377992, -2234994, -1039382, 4821638, -1859721, 14432164, -1824824, -1802276, 17509508, -476741, 8693014, -2982318, -76236, -401043, 1145146, -1898376, 916439, 110595, -831076, --9281424, -1246614, -1900523, -2052994, -3619047, 5874442, 3320547, 3365644, -4995584, -923955, --8135742, -3758097, 2068027, -1023276, -4747013, -1934346, 3351148, 6143951, 4416300, -2385318, --7461969, -615791, 2805151, -1680406, 4781373, 2463164, 6307160, 7547868, -1966021, -409633, --7887708, -10721849, 10436771, 4872641, 345745, -820876, 416075, -4176319, -3354370, -495532, -8666707, 4089346, 2327872, 9093520, -6334003, 1665911, -4925254, -5144297, 5299453, 3665218, -4811437, 13772350, 1005022, -7179575, 2901251, -7153805, -7817914, -10869488, 4322885, -10166188, -170188, 10995653, -11491185, 4121021, 5410585, -3273839, -14215268, 47782, 8603893, -9453223, -5980205, -789737, -3934727, -12212203, -141197, -8846559, 1747515, -4555887, -6580427, -8606041, -3700651, -1330366, -273804, 7931731, -4647155, 6672769, -4926328, -2189897, 10659572, 3447248, --5304285, 4154307, 2776160, -4940823, 2812130, 2498597, -1567126, -2179696, 709207, -2445447, --2441689, 1582696, 2224793, 14049375, -13013214, 2030446, 1200443, -4914517, 9962177, 5325223, --2907156, -10489921, 1329829, -1199370, -2689723, -6693170, -7186554, 9156333, 6550362, 575526, --395137, 4745402, 3110630, -2529199, 4626217, 2525441, -1861868, 9493488, -2852932, 5441724, --3067144, 1912334, 4899484, -10974715, 8099235, -4693326, -1809792, -6373732, -4277251, 3604015, --3374771, 2915746, 12284143, 3969624, 6833293, -15611669, -10029822, -5676873, -3506304, 1493038, -115964, 2484102, -12767327, 6754373, 3079492, 1550483, 12551505, 25233, -6814503, 11418171, -4759898, -5366025, 2566243, -6845104, 6296422, 2681670, 8327942, -7163469, -4744328, 1859721, --6838662, 8681740, -7938174, -349503, 8108362, 7060926, -14821395, -642098, 956704, 1526324, -2713883, 16199006, 4027069, 790274, -4786741, -4398584, -8630737, -5064304, 12406550, 28991, --14223321, -57445, 3648038, -8525510, -8749922, 769873, -5538897, 2087354, 13684840, 6189585, -6025302, -5821292, -13728863, 775242, -1824287, 6169184, -453656, -12164958, -18944028, -5772436, -5461588, 14598057, 2165201, 7508677, 26170846, 4211753, 4500052, -4179540, -12487617, 6943352, --6051609, 6373195, -1566589, 17098264, 12587475, -6856379, -14160507, -11451993, 8505109, -7710540, -10420128, 4365298, 3354906, -3862249, -1445257, 12169253, -2532957, 10692858, 10889890, 5379447, -7596724, -8854075, 8221641, 4165582, -4608500, 11799886, -5506685, 10668162, 663572, 855772, --16382616, 9348533, 692027, -3484829, 7783555, -11756399, -4719632, 6272800, 5269388, -10928007, -1392106, -7213398, -4134980, 9706626, 1046898, 2468533, -1459752, -12560095, 7558606, 6810208, -64961, 5152350, 2175938, -6178311, -6100464, -1491964, 5655935, -11967926, -1201517, -804233, --577673, -2091649, 3191161, 2991445, 9470403, 22771916, 7723962, 2351495, -7898445, -22002580, -16220481, 4039417, -13206488, 3469260, -628676, 2895345, 3900367, -10883447, -20832738, -17732846, -6705518, 12668543, -1672890, 13347685, -5499169, 10282689, 14359686, 17443472, -2949569, 12737262, --10799695, 3913789, -5385352, 1010391, 8313983, -898185, -2719251, 2675765, 10208600, -7018514, --10838350, -12732967, 26712550, -507343, -22012, -12050604, 13102871, 3302293, -22212498, -14165876, -6625524, -3849901, -2781528, 8647917, 4532801, 22224308, 14035953, -1357210, -11723650, -13544179, --5818607, -5911486, -13407277, 13283797, -8609799, 10361609, 11152419, -10159208, -10474351, -12548821, --15437723, 3434900, 1639604, -7084549, -5803575, -13692356, -2420751, -13718126, 4874788, -100932, --1865090, -913217, -12212740, -24854976, -4981625, -6791954, 1783485, -6128919, 1483374, 2108829, --2208150, 10011032, -13108240, -4571993, -12429635, -1104344, -5998459, 14376329, 16986596, 12792560, --18165564, 12657269, -6340446, 9496173, -3494493, 6884833, -5827734, -8405251, 3162170, -10714333, -6874095, 7448547, -709743, 4284767, -9120900, -1655173, 16108275, -13091060, 817654, -4206921, --4984847, -10627360, -401579, 15242302, 20805896, -13464186, 6358699, -2044941, -12459700, -13208098, --13728326, -6664716, 26167626, 15464567, -4926865, 8106214, -5638219, 7027104, -14455249, 8215736, --635118, -7953743, 19634980, 10221485, 3697967, 6575058, 5222680, 18852222, 1856500, -15426449, -5646809, 12744779, 8421894, -26523034, 15471546, -9896678, -12395812, -1713155, -1262720, -94489, -16982838, 11157788, 46131708, 12957916, -7815767, 2994129, 7707319, 205085, 15306190, 11443940, -10569378, -13756243, -23037668, 22907208, -13100724, 2125472, 7823283, 25101400, 9976135, -15342160, -13625247, -13908715, -3000035, -19102404, -25052008, -2955474, 6554657, 6515466, 4837207, 6124087, --2150168, -17344688, -6502581, 5201206, 5582384, -9375377, 18773838, 11666742, -11566347, 5882495, -9244917, 3246459, 377957, -10996190, -1501628, -7918309, -4539781, 454730, 11605002, 28679108, --8164196, 1907502, 4145180, 10103911, -10685342, 36284420, -3381213, 2552821, 2964601, -18075370, --16694001, -28064390, -11457899, 13144211, -5188858, 5661304, 5916855, 23667418, 4159139, 2329483, -1529545, 17512730, 10122701, -11657615, 19354196, -20689932, 5367636, -5153961, -18893024, 10567230, -5502927, 13066364, -3176665, -29586420, 2770791, -19878720, -17022030, 5051419, 4677220, 8086887, --4576825, 5825587, -471373, -10087268, 16618302, -2585034, -4664335, -6379100, -10563472, -9560597, -6542846, -12030740, 3721052, -7618735, -4547297, -3165391, 16549583, -2855617, 17745194, 10819023, --3506304, 5916318, 6800007, 12345883, -7267622, -10897943, 2756295, 7520488, 10307385, 16338056, --16306380, -16370268, 8469139, 6273874, 20779052, -8917963, -77846, 10462003, 1433982, 3559991, --2166811, 13692893, 17551384, 8366060, -468151, 11163157, 35304632, -6257768, -8097624, 13782550, -425202, 21051246, 6620155, 10682657, 13063143, -1958505, 9824201, 24532316, -4075387, -25371982, -21351356, 7822209, -7245610, 5579700, -36595804, -15721728, -2936147, 29851096, 11586211, -33578056, -3466576, -4269198, 1004486, 8050916, -3816079, -16173773, 514322, -572304, 13961865, 33342904, --7145752, 12343199, 18453326, 1476932, -7720741, -2817499, 6131603, 33461554, -2578054, 369904, -23550916, -7802345, 4954782, 2680060, -2323041, -3982509, 7699266, -25718264, -986769, 11779485, -18917720, 24930674, -20036022, 3670050, 18126910, 1761474, 35334696, -10449119, -20033874, 5616207, -25182466, 7967701, -22538378, -6430640, 4336843, 3310883, 9939091, -26701274, 1868848, 4964446, --8152385, -18169322, -21286394, 9036074, -7804493, 2687576, -863288, -18587544, -25950730, 9515500, -1630477, -19494856, -10438381, -10722386, 11639361, -32825362, -17177184, 18511846, -26332982, 19603304, --7827041, 18683108, 1524713, 9673877, -19549618, -3063922, -18415210, 19428284, 10812043, 25880400, -20840792, -11176579, 5266704, 20141250, 12686260, 9535901, 8648990, -19818590, -3639985, 7565048, -3076270, 9201431, -21774410, -18830210, 12233141, 33601140, 6439767, -13052406, 23828478, 4850629, -15537044, 2198487, 4416837, -21253646, -18429168, -1116692, 2073932, -36125508, 4558571, -8606578, --8590, 9465034, -11726871, 6777459, 29028610, 1335198, -42528768, -33440616, -3339874, -11379516, --9144522, -1915555, 9995463, 5416491, -8924942, 10645613, 13650480, 8872866, -4823785, 7348152, --2912525, -13357885, -568009, 8255464, -30865246, -9573482, -12593381, -19426138, -4365298, 2291365, --6068789, -3585224, 39533564, 17566416, -10323491, -4032974, 7609609, 14169097, -19756312, -5187247, --8300025, 5152887, 41674604, 6434935, -20307142, 5285494, 18495740, -4051765, 17297980, 21728240, --11114302, 5068062, 11184632, 7440494, 658204, -3285650, -6578816, 3198677, 13130252, 6631430, -12279848, -18158584, -27746026, -2988760, 12661027, 10990284, 9149354, -3163244, -25570088, 8336532, -5923297, 38658464, 40799504, 9716827, -29990146, 21939230, -11289322, -30754114, -7002408, -36394480, --27618250, -12126303, -13197361, -28142774, 5146982, -11203422, -32231046, -29438242, 8780524, 19548544, --2981244, -24746528, 7639673, 1065689, 8202851, 16162499, 15549929, -18953690, 25192668, 17673254, -2347200, 7445326, 17566954, -322659, 45689324, -31828928, -15365246, -406411, -36864240, 31082678, -2434710, 38690140, 11580306, 9188546, 13048648, -19320910, 4434554, -39485244, -11818139, -1552094, --10800232, 45347340, 13143137, -10799158, -28712930, -13127031, -12299713, -16633871, -13776108, 7836705, --41506028, -7689602, 29075318, -2440078, -4148402, -29975650, 28876138, 15849503, -113280, -10618770, -11864310, 7475928, -7858180, 14775761, -21788906, -4307316, -11507291, 7330973, -5682779, -11899744, -14258218, -9912248, 5488968, 1859721, -21206938, -11242077, -3985730, -24030342, -25902948, -32015224, --9501005, 17051020, -12130061, -4445291, 18508624, -21857626, -20345260, 22825604, -1116155, 754304, -17874044, 2355790, -17207786, -7067369, 5229123, 16012175, -22106196, -4005594, 24013700, 13753022, -22940494, 15775952, -6833830, 16382079, -3189013, -29122562, 7584912, -20063402, 14051522, -6504728, --11960947, 30722438, 10170483, 1564979, 3307125, -7452305, 11629161, 19130322, 46912316, 41771780, -3217468, -17692580, 8070244, 24440512, 6517076, 19047644, 13060459, 9494025, -14310831, -17470316, --21908092, -973884, 7770133, 15774341, 30466350, 16805134, 19467476, 12013560, 18051748, 9783399, -17401060, -11172821, 3146601, 33789580, -1040456, 26137560, 6646999, 21259552, -32877974, -4723927, --9732933, -9044664, 7605314, 13387950, 23734526, 39035348, 32201518, -10770704, 5782637, -42013908, -10474888, 10464688, 37745248, -29228326, 23990614, -7107097, -20652350, 16699907, 5325223, 14045080, -24013162, -7010461, -29552060, 16250546, -18621904, -25936770, -11647414, 36202816, -29550986, -43157444, --20259898, -6525129, 25955024, -1339493, -10517301, -26351772, -5390184, 5437429, 4869419, 30153892, --9905268, -32413044, 1739999, -13325673, -47525960, -23382876, 60927868, 8932995, -28452010, -30229054, -2752000, 805843, 11996381, 16208133, -22275848, -14100378, -35123704, 8156143, -13273060, -8121247, -51634096, 11356430, -8142185, -54122492, -4417374, -28918014, 27712740, 35376572, 2720325, 27470610, --33490008, -12898324, -21580064, -5022965, 52480744, 66513476, 9500468, -18108656, -25044492, -48547088, --595927, 5810017, 56959320, 32015224, -9877351, -96372624, -51037096, 7567733, -10678362, 83348672, -26650808, -41285912, -18422188, -73134168, -24515674, 1331977, 45365056, 47250544, 52736828, 971200, -10951093, -7662759, 2604898, 64902324, -27047556, 46584824, -14374182, -54117124, -17808008, -58176944, --20193326, 64117420, 28470264, -42981884, 47602732, -260382, -12093017, -73904040, -19588272, -20260434, --33005214, 70752072, 896574, 31428960, -48561048, 26523570, 22744536, -22416508, 14264660, -4759898, -12712566, -587337, 36355824, 12255152, -35439384, 20704964, 17459042, -780073, 24393266, -18869402, --9579925, 30144764, 21339546, 19812684, 9921374, 17118130, -53658100, 45695768, -27187680, -17822504, -9655623, -38178500, 53974856, -16375637, 4833986, 38510824, 674847, -6899865, 20651814, 20976620, -37769404, -10366977, -36783712, -37490768, 3033858, -14162655, 15795816, -23077934, -11995844, -15949898, -9558987, -69647192, -402116, 49973020, 12417824, 19755238, -3798362, -6604586, 11328513, -19113678, --23113366, 11802033, 4393752, -23347980, -27968828, 93541168, -13938243, -32125282, 3987877, 40903656, --8375186, 11800960, -34781720, 11065446, 59732796, 89115736, -38505456, 27616640, -58432492, -19888382, --34959424, -7199439, 57677652, 57198764, 48857400, -3789772, -36165236, -25177636, 22058952, -874026, -11772505, 28595356, 849867, 12931073, -38177428, -12685186, -21553756, -30523796, 16565152, 10009958, -2086817, 25068114, -22487912, -3717831, 7398081, -36303212, 147640, -682900, -20073066, -11065446, -8867497, -17280264, 32315334, -13559749, 48426832, 32602560, -22676354, -10072772, -31890132, -40871444, --47745540, 11756936, 22893786, 60839284, 49846852, 19058380, 31786516, 1854352, -35286916, -27885076, --19704236, -28787018, -4995047, 8832600, -1252520, -21679384, 4282620, -22133040, 10394895, 18422188, -4393752, -31281320, 19245212, -18775986, -13166759, -32620276, 13502303, 3877282, -8490077, -96976600, --58569396, -30632244, 56043956, 29473676, 150962736, 145518320, 146964112, 152333904, 159670784, 116084376, -59204512, 89265528, 52097416, -20622822, -45678588, -67573256, -139540272, -121853056, -129803576, -89764816, --94291712, -65485904, -56399364, -24784108, 6970195, -48583596, -24407762, -3721589, -4095251, -21889300, -13099650, 46822660, 48381732, 25352656, 56700012, 74052216, 22948548, 23323820, 20432234, 74237976, -73966320, 94747512, 101766032, 93835368, 101966280, 153218128, 67579160, 123526480, 160647344, 111155904, -125925216, 105348032, 58730992, 70806832, 74251392, 71240624, 87949120, 90361816, 62148176, 30720828, -42338176, 65289408, 20514912, 31168040, 6020471, 6266894, -41075992, 649614, -88445184, -116520312, --84060024, -98010616, -144426336, -134697152, -53810036, -116386632, -38426000, -1539746, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-403190, 1455457, -329102, 6126771, -915902, -234076, 7471096, -1792612, 8322036, 1512365, +-3323231, 5019206, 2379949, -3670050, 1390496, 1989107, 594316, 3205656, -833761, 2577517, +-537, -3583613, 1549410, 3954591, 2282775, 2304250, -457414, 335007, 22549, 1433982, +2919504, -6963753, -3382287, 161061, 1675574, 652835, -2704756, 5324149, 1768990, -1191317, +2855617, 1030792, 3949759, 1143535, -1539209, -3018825, 3193845, 214212, -56371, -1628330, +900333, -2840584, -1970316, 1321239, 2859375, -1372242, 634581, -27917, -399969, 5279052, +1985349, -627602, 843424, 2306934, 224412, 2361695, -3019362, 2885681, 3200288, -1607392, +-5352603, -2806761, -1466731, 5539434, 60666, -1999844, -515933, -4878546, -3432753, 2224256, +137976, -3061775, 3794067, 2615635, -897648, 264141, -587874, 3129421, -4371740, 1641751, +3154117, 2869575, -6267968, -4319664, -3153580, 4181151, 928250, 1376537, -1807644, 4453881, +1581622, -1087701, 28991, -1252520, 778463, 1671816, -1081795, -1269163, -3828427, 3974992, +6508486, 785979, 4092567, -776852, 734976, 1508607, 1711545, -5016522, 234613, -5242008, +-1326071, -747324, 1520955, -2648384, -219580, 1140851, 388695, -3061238, -23085, 340376, +2350958, -3252364, -4229469, -551366, 5368709, 8871792, -148176, 1461363, 445066, -1882269, +-5506685, -1321239, 3539053, -1638530, 3525095, 1545651, 3604551, -6442, 1345399, 2401961, +-5445482, -1385127, -5160403, 2927557, 456340, -2558190, 11362336, -4524211, -7949448, 484258, +3842385, -813359, -5958194, -1862405, -2530810, -1130113, -2772938, -1085553, 4274566, -434329, +-2622615, 4642860, 801548, 4503273, -1141388, -1292248, 1882806, -32212, 2175401, -1028108, +4478577, 7011534, -1888175, -4984847, -3447248, 2791192, 75162, -11213086, -967978, -4575214, +-1559610, 5226975, -3697967, -3051574, 3802120, -2627446, -462783, 4762045, 1777580, -4112431, +1815697, -3026341, -6462852, 1866700, 2615635, -5181878, -2814814, -1673427, -2035278, -301721, +2164127, 3108483, 5156108, 5430450, -1341104, 259846, -2244121, 2102923, 1577864, -1698660, +2388002, 3158412, -3542274, -9136469, -4521527, 2698850, 4087735, 1476932, 4425427, -3812320, +4625680, 5496485, -1502165, 6090264, -778463, 4458176, -2102923, 38118, -1881733, 5722507, +2332704, -344134, 5261872, -2883534, -2149094, 3695819, -8993662, -1692754, 542777, -2046552, +-8014946, -5049271, 3387119, -3287261, -2062121, -17180, 6343130, -1651952, -4380867, -489089, +1653026, 3420942, -515396, -5867999, -3663607, -1205812, -2910914, 792421, -4962835, 2308545, +-4672925, -7052873, 226560, 2240899, 2800856, -2381023, -1586454, -4701379, 5834713, 3192235, +798864, -132607, -186831, -2180770, -1095754, 1778117, 2455648, 8621073, -1043677, 2024540, +518080, -450972, -4393215, -3446711, 5888400, -2688650, 476741, 1475858, 718870, 2173790, +2726767, 2399813, 5802501, -3828427, -5665599, -4607426, 2942590, 6386617, -1131724, 4902705, +-4283156, -5260798, 4440996, -2166811, 529355, 1672890, 5563594, 2084670, 8792872, -3730179, +-4536023, 2101313, -2459406, -2344515, 5049808, -7603703, -4616553, 871342, -1350767, 3615289, +-2466385, 1086627, 6340983, -5626944, 4466229, -3331821, 2960843, -3100430, -741956, -357019, +6604586, 1387811, 432718, -4497368, 446140, -5375152, 2320893, 1602023, -3493956, 148713, +-1295470, 9926206, 1563905, 890132, -8119636, -4633196, -6791954, 5835250, -3306051, -73014, +3229279, 12683575, 9040369, -3117073, -7247758, -2775086, -6234145, 7378754, -969052, -1497333, +-2677375, -1576253, -212064, -2718178, -1327145, -5069672, 3703873, -5236639, -8736500, 8926016, +4349728, -9783399, 9798431, -1738388, -337692, -13660680, 8239358, 5148592, -10663330, 3047816, +-1570347, 3936875, 1181653, 4568772, 3277597, 1031866, -4835597, 295279, 2094333, -6868727, +-2623688, -8070244, -1124745, -5076652, -2399813, 738198, -5958731, -2434173, -8890045, 3299072, +1132261, 643708, 1025960, -4058744, -7716983, -2608656, 3011309, -1408749, -472446, 8198556, +-12120398, 5076115, 6503654, -1009854, 594316, -2485176, -784905, -4071629, -5910412, -4216048, +-4629438, -3258270, 3218541, 1661079, 2868501, 4148402, -865973, -2207613, 6042482, 11378979, +8080981, -97711, -9602473, 2772402, -1464047, 1603633, 10205379, 216359, 10240813, 9655086, +14874545, 3377992, -2234994, -1039382, 4821638, -1859721, 14432164, -1824824, -1802276, 17509508, +476741, 8693014, -2982318, -76236, -401043, 1145146, -1898376, 916439, 110595, -831076, +-9281424, -1246614, -1900523, -2052994, -3619047, 5874442, 3320547, 3365644, -4995584, -923955, +-8135742, -3758097, 2068027, -1023276, -4747013, -1934346, 3351148, 6143951, 4416300, -2385318, +-7461969, -615791, 2805151, -1680406, 4781373, 2463164, 6307160, 7547868, -1966021, -409633, +-7887708, -10721849, 10436771, 4872641, 345745, -820876, 416075, -4176319, -3354370, -495532, +8666707, 4089346, 2327872, 9093520, -6334003, 1665911, -4925254, -5144297, 5299453, 3665218, +4811437, 13772350, 1005022, -7179575, 2901251, -7153805, -7817914, -10869488, 4322885, -10166188, +170188, 10995653, -11491185, 4121021, 5410585, -3273839, -14215268, 47782, 8603893, -9453223, +5980205, -789737, -3934727, -12212203, -141197, -8846559, 1747515, -4555887, -6580427, -8606041, +3700651, -1330366, -273804, 7931731, -4647155, 6672769, -4926328, -2189897, 10659572, 3447248, +-5304285, 4154307, 2776160, -4940823, 2812130, 2498597, -1567126, -2179696, 709207, -2445447, +-2441689, 1582696, 2224793, 14049375, -13013214, 2030446, 1200443, -4914517, 9962177, 5325223, +-2907156, -10489921, 1329829, -1199370, -2689723, -6693170, -7186554, 9156333, 6550362, 575526, +-395137, 4745402, 3110630, -2529199, 4626217, 2525441, -1861868, 9493488, -2852932, 5441724, +-3067144, 1912334, 4899484, -10974715, 8099235, -4693326, -1809792, -6373732, -4277251, 3604015, +-3374771, 2915746, 12284143, 3969624, 6833293, -15611669, -10029822, -5676873, -3506304, 1493038, +115964, 2484102, -12767327, 6754373, 3079492, 1550483, 12551505, 25233, -6814503, 11418171, +4759898, -5366025, 2566243, -6845104, 6296422, 2681670, 8327942, -7163469, -4744328, 1859721, +-6838662, 8681740, -7938174, -349503, 8108362, 7060926, -14821395, -642098, 956704, 1526324, +2713883, 16199006, 4027069, 790274, -4786741, -4398584, -8630737, -5064304, 12406550, 28991, +-14223321, -57445, 3648038, -8525510, -8749922, 769873, -5538897, 2087354, 13684840, 6189585, +6025302, -5821292, -13728863, 775242, -1824287, 6169184, -453656, -12164958, -18944028, -5772436, +5461588, 14598057, 2165201, 7508677, 26170846, 4211753, 4500052, -4179540, -12487617, 6943352, +-6051609, 6373195, -1566589, 17098264, 12587475, -6856379, -14160507, -11451993, 8505109, -7710540, +10420128, 4365298, 3354906, -3862249, -1445257, 12169253, -2532957, 10692858, 10889890, 5379447, +7596724, -8854075, 8221641, 4165582, -4608500, 11799886, -5506685, 10668162, 663572, 855772, +-16382616, 9348533, 692027, -3484829, 7783555, -11756399, -4719632, 6272800, 5269388, -10928007, +1392106, -7213398, -4134980, 9706626, 1046898, 2468533, -1459752, -12560095, 7558606, 6810208, +64961, 5152350, 2175938, -6178311, -6100464, -1491964, 5655935, -11967926, -1201517, -804233, +-577673, -2091649, 3191161, 2991445, 9470403, 22771916, 7723962, 2351495, -7898445, -22002580, +16220481, 4039417, -13206488, 3469260, -628676, 2895345, 3900367, -10883447, -20832738, -17732846, +6705518, 12668543, -1672890, 13347685, -5499169, 10282689, 14359686, 17443472, -2949569, 12737262, +-10799695, 3913789, -5385352, 1010391, 8313983, -898185, -2719251, 2675765, 10208600, -7018514, +-10838350, -12732967, 26712550, -507343, -22012, -12050604, 13102871, 3302293, -22212498, -14165876, +6625524, -3849901, -2781528, 8647917, 4532801, 22224308, 14035953, -1357210, -11723650, -13544179, +-5818607, -5911486, -13407277, 13283797, -8609799, 10361609, 11152419, -10159208, -10474351, -12548821, +-15437723, 3434900, 1639604, -7084549, -5803575, -13692356, -2420751, -13718126, 4874788, -100932, +-1865090, -913217, -12212740, -24854976, -4981625, -6791954, 1783485, -6128919, 1483374, 2108829, +-2208150, 10011032, -13108240, -4571993, -12429635, -1104344, -5998459, 14376329, 16986596, 12792560, +-18165564, 12657269, -6340446, 9496173, -3494493, 6884833, -5827734, -8405251, 3162170, -10714333, +6874095, 7448547, -709743, 4284767, -9120900, -1655173, 16108275, -13091060, 817654, -4206921, +-4984847, -10627360, -401579, 15242302, 20805896, -13464186, 6358699, -2044941, -12459700, -13208098, +-13728326, -6664716, 26167626, 15464567, -4926865, 8106214, -5638219, 7027104, -14455249, 8215736, +-635118, -7953743, 19634980, 10221485, 3697967, 6575058, 5222680, 18852222, 1856500, -15426449, +5646809, 12744779, 8421894, -26523034, 15471546, -9896678, -12395812, -1713155, -1262720, -94489, +16982838, 11157788, 46131708, 12957916, -7815767, 2994129, 7707319, 205085, 15306190, 11443940, +10569378, -13756243, -23037668, 22907208, -13100724, 2125472, 7823283, 25101400, 9976135, -15342160, +13625247, -13908715, -3000035, -19102404, -25052008, -2955474, 6554657, 6515466, 4837207, 6124087, +-2150168, -17344688, -6502581, 5201206, 5582384, -9375377, 18773838, 11666742, -11566347, 5882495, +9244917, 3246459, 377957, -10996190, -1501628, -7918309, -4539781, 454730, 11605002, 28679108, +-8164196, 1907502, 4145180, 10103911, -10685342, 36284420, -3381213, 2552821, 2964601, -18075370, +-16694001, -28064390, -11457899, 13144211, -5188858, 5661304, 5916855, 23667418, 4159139, 2329483, +1529545, 17512730, 10122701, -11657615, 19354196, -20689932, 5367636, -5153961, -18893024, 10567230, +5502927, 13066364, -3176665, -29586420, 2770791, -19878720, -17022030, 5051419, 4677220, 8086887, +-4576825, 5825587, -471373, -10087268, 16618302, -2585034, -4664335, -6379100, -10563472, -9560597, +6542846, -12030740, 3721052, -7618735, -4547297, -3165391, 16549583, -2855617, 17745194, 10819023, +-3506304, 5916318, 6800007, 12345883, -7267622, -10897943, 2756295, 7520488, 10307385, 16338056, +-16306380, -16370268, 8469139, 6273874, 20779052, -8917963, -77846, 10462003, 1433982, 3559991, +-2166811, 13692893, 17551384, 8366060, -468151, 11163157, 35304632, -6257768, -8097624, 13782550, +425202, 21051246, 6620155, 10682657, 13063143, -1958505, 9824201, 24532316, -4075387, -25371982, +21351356, 7822209, -7245610, 5579700, -36595804, -15721728, -2936147, 29851096, 11586211, -33578056, +3466576, -4269198, 1004486, 8050916, -3816079, -16173773, 514322, -572304, 13961865, 33342904, +-7145752, 12343199, 18453326, 1476932, -7720741, -2817499, 6131603, 33461554, -2578054, 369904, +23550916, -7802345, 4954782, 2680060, -2323041, -3982509, 7699266, -25718264, -986769, 11779485, +18917720, 24930674, -20036022, 3670050, 18126910, 1761474, 35334696, -10449119, -20033874, 5616207, +25182466, 7967701, -22538378, -6430640, 4336843, 3310883, 9939091, -26701274, 1868848, 4964446, +-8152385, -18169322, -21286394, 9036074, -7804493, 2687576, -863288, -18587544, -25950730, 9515500, +1630477, -19494856, -10438381, -10722386, 11639361, -32825362, -17177184, 18511846, -26332982, 19603304, +-7827041, 18683108, 1524713, 9673877, -19549618, -3063922, -18415210, 19428284, 10812043, 25880400, +20840792, -11176579, 5266704, 20141250, 12686260, 9535901, 8648990, -19818590, -3639985, 7565048, +3076270, 9201431, -21774410, -18830210, 12233141, 33601140, 6439767, -13052406, 23828478, 4850629, +15537044, 2198487, 4416837, -21253646, -18429168, -1116692, 2073932, -36125508, 4558571, -8606578, +-8590, 9465034, -11726871, 6777459, 29028610, 1335198, -42528768, -33440616, -3339874, -11379516, +-9144522, -1915555, 9995463, 5416491, -8924942, 10645613, 13650480, 8872866, -4823785, 7348152, +-2912525, -13357885, -568009, 8255464, -30865246, -9573482, -12593381, -19426138, -4365298, 2291365, +-6068789, -3585224, 39533564, 17566416, -10323491, -4032974, 7609609, 14169097, -19756312, -5187247, +-8300025, 5152887, 41674604, 6434935, -20307142, 5285494, 18495740, -4051765, 17297980, 21728240, +-11114302, 5068062, 11184632, 7440494, 658204, -3285650, -6578816, 3198677, 13130252, 6631430, +12279848, -18158584, -27746026, -2988760, 12661027, 10990284, 9149354, -3163244, -25570088, 8336532, +5923297, 38658464, 40799504, 9716827, -29990146, 21939230, -11289322, -30754114, -7002408, -36394480, +-27618250, -12126303, -13197361, -28142774, 5146982, -11203422, -32231046, -29438242, 8780524, 19548544, +-2981244, -24746528, 7639673, 1065689, 8202851, 16162499, 15549929, -18953690, 25192668, 17673254, +2347200, 7445326, 17566954, -322659, 45689324, -31828928, -15365246, -406411, -36864240, 31082678, +2434710, 38690140, 11580306, 9188546, 13048648, -19320910, 4434554, -39485244, -11818139, -1552094, +-10800232, 45347340, 13143137, -10799158, -28712930, -13127031, -12299713, -16633871, -13776108, 7836705, +-41506028, -7689602, 29075318, -2440078, -4148402, -29975650, 28876138, 15849503, -113280, -10618770, +11864310, 7475928, -7858180, 14775761, -21788906, -4307316, -11507291, 7330973, -5682779, -11899744, +14258218, -9912248, 5488968, 1859721, -21206938, -11242077, -3985730, -24030342, -25902948, -32015224, +-9501005, 17051020, -12130061, -4445291, 18508624, -21857626, -20345260, 22825604, -1116155, 754304, +17874044, 2355790, -17207786, -7067369, 5229123, 16012175, -22106196, -4005594, 24013700, 13753022, +22940494, 15775952, -6833830, 16382079, -3189013, -29122562, 7584912, -20063402, 14051522, -6504728, +-11960947, 30722438, 10170483, 1564979, 3307125, -7452305, 11629161, 19130322, 46912316, 41771780, +3217468, -17692580, 8070244, 24440512, 6517076, 19047644, 13060459, 9494025, -14310831, -17470316, +-21908092, -973884, 7770133, 15774341, 30466350, 16805134, 19467476, 12013560, 18051748, 9783399, +17401060, -11172821, 3146601, 33789580, -1040456, 26137560, 6646999, 21259552, -32877974, -4723927, +-9732933, -9044664, 7605314, 13387950, 23734526, 39035348, 32201518, -10770704, 5782637, -42013908, +10474888, 10464688, 37745248, -29228326, 23990614, -7107097, -20652350, 16699907, 5325223, 14045080, +24013162, -7010461, -29552060, 16250546, -18621904, -25936770, -11647414, 36202816, -29550986, -43157444, +-20259898, -6525129, 25955024, -1339493, -10517301, -26351772, -5390184, 5437429, 4869419, 30153892, +-9905268, -32413044, 1739999, -13325673, -47525960, -23382876, 60927868, 8932995, -28452010, -30229054, +2752000, 805843, 11996381, 16208133, -22275848, -14100378, -35123704, 8156143, -13273060, -8121247, +51634096, 11356430, -8142185, -54122492, -4417374, -28918014, 27712740, 35376572, 2720325, 27470610, +-33490008, -12898324, -21580064, -5022965, 52480744, 66513476, 9500468, -18108656, -25044492, -48547088, +-595927, 5810017, 56959320, 32015224, -9877351, -96372624, -51037096, 7567733, -10678362, 83348672, +26650808, -41285912, -18422188, -73134168, -24515674, 1331977, 45365056, 47250544, 52736828, 971200, +10951093, -7662759, 2604898, 64902324, -27047556, 46584824, -14374182, -54117124, -17808008, -58176944, +-20193326, 64117420, 28470264, -42981884, 47602732, -260382, -12093017, -73904040, -19588272, -20260434, +-33005214, 70752072, 896574, 31428960, -48561048, 26523570, 22744536, -22416508, 14264660, -4759898, +12712566, -587337, 36355824, 12255152, -35439384, 20704964, 17459042, -780073, 24393266, -18869402, +-9579925, 30144764, 21339546, 19812684, 9921374, 17118130, -53658100, 45695768, -27187680, -17822504, +9655623, -38178500, 53974856, -16375637, 4833986, 38510824, 674847, -6899865, 20651814, 20976620, +37769404, -10366977, -36783712, -37490768, 3033858, -14162655, 15795816, -23077934, -11995844, -15949898, +9558987, -69647192, -402116, 49973020, 12417824, 19755238, -3798362, -6604586, 11328513, -19113678, +-23113366, 11802033, 4393752, -23347980, -27968828, 93541168, -13938243, -32125282, 3987877, 40903656, +-8375186, 11800960, -34781720, 11065446, 59732796, 89115736, -38505456, 27616640, -58432492, -19888382, +-34959424, -7199439, 57677652, 57198764, 48857400, -3789772, -36165236, -25177636, 22058952, -874026, +11772505, 28595356, 849867, 12931073, -38177428, -12685186, -21553756, -30523796, 16565152, 10009958, +2086817, 25068114, -22487912, -3717831, 7398081, -36303212, 147640, -682900, -20073066, -11065446, +8867497, -17280264, 32315334, -13559749, 48426832, 32602560, -22676354, -10072772, -31890132, -40871444, +-47745540, 11756936, 22893786, 60839284, 49846852, 19058380, 31786516, 1854352, -35286916, -27885076, +-19704236, -28787018, -4995047, 8832600, -1252520, -21679384, 4282620, -22133040, 10394895, 18422188, +4393752, -31281320, 19245212, -18775986, -13166759, -32620276, 13502303, 3877282, -8490077, -96976600, +-58569396, -30632244, 56043956, 29473676, 150962736, 145518320, 146964112, 152333904, 159670784, 116084376, +59204512, 89265528, 52097416, -20622822, -45678588, -67573256, -139540272, -121853056, -129803576, -89764816, +-94291712, -65485904, -56399364, -24784108, 6970195, -48583596, -24407762, -3721589, -4095251, -21889300, +13099650, 46822660, 48381732, 25352656, 56700012, 74052216, 22948548, 23323820, 20432234, 74237976, +73966320, 94747512, 101766032, 93835368, 101966280, 153218128, 67579160, 123526480, 160647344, 111155904, +125925216, 105348032, 58730992, 70806832, 74251392, 71240624, 87949120, 90361816, 62148176, 30720828, +42338176, 65289408, 20514912, 31168040, 6020471, 6266894, -41075992, 649614, -88445184, -116520312, +-84060024, -98010616, -144426336, -134697152, -53810036, -116386632, -38426000, -1539746, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, { 632971, --2012729, 393526, -3454228, -2672007, -2975876, -3445101, -5291400, 2605435, 2426657, -2637110, -587874, 3957812, 6357089, 2251100, 2586644, -1566589, 707059, -9688909, 2893734, 299037, --1386201, 2769180, -938987, -3627100, 3354370, 1221918, 1333587, 2476586, 3316252, 3384434, --86436, -4323422, -194884, 4540318, 4769025, 6190122, -1454920, 6061273, 120259, -335007, --1996086, -275952, 3360275, 1279900, -9922448, -3320547, -5809480, -277562, -387084, -3804267, --4479114, -3420942, 1127429, -3291556, 2004139, 3149822, 3466576, -4528506, -2304787, -5123359, --2987150, -1445257, 330176, -4853850, 4890357, 1969243, -2193655, -102542, -902480, 8402567, -1959042, -757525, -2509335, 10535018, 805306, -955630, -133144, -1093069, -5280663, -5849209, -5594732, 1035087, -2969433, -5145371, -2122251, -3954591, -6140193, 7887708, 1216550, 2686502, -4292820, 11471321, -72478, 1601486, -2601140, -1321776, -1948841, -7935489, 1935420, -2627983, -983011, 5027259, -1873143, -819802, 1386201, 260382, -1035087, -59056, -6839736, 1152662, -62814, -2858301, 2445984, 686658, -4521527, 7175817, 504659, 736587, 7234873, -3066070, --2769180, -7253126, -3235721, 4388383, 562641, 4692252, -2212982, -6030671, 2735894, -5660230, --2054068, -10561325, 4482872, 3112778, 2495376, 2599529, 7317014, 1331977, -2663417, 3258807, -6216965, -4305168, 3362423, -579284, -624381, -2564632, -805306, 3222299, 267362, 1358820, --4187056, 1064078, -2566780, -5495948, -459562, -6480032, -7678328, -4992363, -3649649, -8645769, -398358, -3193845, -1669132, 2513630, 9142912, 715112, -2123325, -1165547, 1495722, -303869, -3806415, 6328635, -525597, 7117835, -820876, -612570, -860604, 3988414, -5459441, 703838, -655519, -1491427, -325881, -3416110, -5448166, 7295002, -2567854, -718870, -1369021, 3120831, --3595961, -3224984, 1238561, 928250, 5136244, -3754338, 4204773, -2693481, -4391604, -530965, --1886028, 967978, 2209224, -295816, 2886755, 1235340, 2044404, -3087008, -3566970, -5814312, --4328254, 301721, 6435472, 615791, 5143224, 1176821, -3122441, 3498251, 1387811, -4264366, -6612102, 955630, -7225209, -8031052, -6932077, 1394791, 911070, 5804649, -4442070, 5981279, --2966212, -1454383, -9417790, -706522, 753767, -3363496, -447213, 5035313, 4954245, 7172059, --1639604, -1176284, 4657355, 2060511, 4201552, -9890236, 9885404, -2148558, 11811, 1503239, --1038308, -109522, -714575, -697395, 6208912, -192200, 8106751, -1371705, -3074660, -6597607, -953483, -2975339, -2429341, 4589173, 3725884, 4809290, 365609, 642098, -6815576, -5005785, -148176, 6481643, 2448668, -728534, 2388539, -2554969, 7075959, -233002, -5617281, -7322383, --2384244, 8553427, 6630893, 6670621, 3325915, 472983, -6670084, -2872260, -627065, -3804804, -4711579, -401043, -1542430, 4077535, -9530532, 3422015, -785979, 2857227, -263067, 2275796, --2535641, -4072703, -1001264, -3095598, 1253594, 5718749, 1845225, 458488, -2514703, -12406013, --8648454, -12348, 3367254, 4696010, -48318, 1152662, -2096481, 4653597, 1636919, 3777424, --5839545, 5487358, 2685965, -5705327, 1905355, 5707475, -630286, 2011118, 553514, 5195837, --4189741, 3182034, -848793, -425202, -5087926, 531502, 4710506, -2991982, -2706903, -4194036, -5577015, -339839, 777926, -4423817, -13688598, -3635153, 1557463, 1471563, 4508642, -3291556, --2602213, -1767379, -1316408, -4020626, -306553, -3599183, 8262444, 3335579, 6641093, -6920803, --1904818, -2693481, 6156836, -1716376, -1756642, -5207648, 2887292, 259309, -4294431, 6099928, -1130113, 1203128, 5819681, 2050310, 3502009, -2784213, 2206540, 243203, -1497333, 6040872, -4530654, -438624, -8247948, -10920491, -8506183, 3150359, -47245, -4710506, -1288490, 566936, --1133871, 12322261, 2066416, -8891119, -2427194, -2656974, 384400, -4189741, 6900402, -5210869, --6888054, 6366216, -2747169, 1737314, 1626182, -2934000, -8099772, 1048509, -4348118, -3807489, --4001299, -521302, 6185290, -899796, -1483911, 9200357, 1631014, 1370095, -11985643, -1380832, -6299644, 7389491, -4173098, 1960116, 967978, -11829951, -1618129, -790811, -1234803, 2889976, -108448, -6678138, 849330, -5358509, 5067525, -1878511, 6544457, 1217623, -7412577, 3235721, -14132053, -5513128, 285078, -10495289, 2780455, 8804683, -15382962, 2371896, -510027, -938987, -10336913, 1514513, 4513474, 7668127, -9437117, -2639258, -7261716, 3718905, 3842385, 8290361, -15464030, 2641942, -12233141, -958315, -3272228, -1087701, -5449240, 167504, -854699, 6081137, -4444755, 1857037, -715649, 367757, -2144263, -1247688, 6497212, -2102387, -1226750, 5196374, --962610, 3101503, -839666, 6571837, -5282810, -9691594, 11821361, -629213, 2531346, -9077413, -307627, -2709588, 13127568, 2199560, 5727876, -1211181, 5026186, 3710852, -12626130, -1867774, --7276212, -5845988, 401043, 8665097, 649077, -1682017, 12929462, -1370095, -8005282, -5724655, --4410932, 6607271, 19737522, 2684, 5135171, 1494649, -6914361, -1368484, -365609, 6038187, -8708583, 879931, 6913824, 6590091, -12552579, 284542, -3989488, -15205258, 3144990, -1178432, -4963372, 3830574, 14134201, 3326452, -3133179, 3886946, 10730439, 12708271, 4699231, 9074729, -8484708, -6457484, -5713917, -10718091, -12403329, 1735167, 4821638, -9756555, -7605850, -128312, --12137578, -9332427, 4589173, 2015413, -5589363, -3049964, -8079371, 6851547, 4332549, 10987063, -19699404, -1781338, -6032282, -1694902, -10225780, 332323, -8040716, -8067023, 9935870, 1628330, -1078574, -12741557, 13301514, 3173444, -8818642, -2260764, 6693707, 942208, 1200980, 243203, -826781, 4468377, -6812355, 8111583, -134755, -4870493, -1792612, -8689256, 1140851, -8931921, --8638790, 7719130, 7201587, -7002944, -12147778, 3520263, -5944235, -382789, -3309272, 4454955, --3398393, 5657009, -5858336, -6583111, 7938174, -2506650, -1770063, 4455492, -6465537, -6975027, -8005819, 10515691, 255551, -726386, 3663607, -9199283, 15634755, -9627706, 1203128, 7370701, --3464965, 6874632, 8468065, 2696703, -8741332, 9434433, -1343251, 3506304, -6838662, -1354525, --13070659, 4463545, -7736847, 2954938, -13456669, 7888781, -9818832, -6954626, 5726265, 7794292, -2704756, 825707, 392990, -8542690, -7828115, -5077188, 20643224, 11262478, -3179887, -19099720, --2636036, 5335960, 11148661, -6302865, 947040, -13197898, -4494147, -1646583, 3455301, 1919314, --2941516, -246961, 5786395, -6527814, -371515, -7435662, 4016331, 4864051, 14170171, 6040872, --6985765, 2931315, -3946001, -10759430, -1466195, 6165963, 840740, 17558364, -13351443, -2226404, -2991982, 7767985, 4097399, 10203769, 2091649, -12770548, 8135205, -10857140, -11158325, 23085, --875636, 8311836, 10854456, 9534827, 14501420, 3182571, -14706505, 15888695, 8986682, -6917582, -12589623, -1986959, 1613297, -11342472, -3711389, -3562675, -4788889, 10050760, -17532594, -4414690, --8218957, -8312373, 1487132, 8006356, -3992709, -10645613, -10758893, -14538464, -14181445, -7741679, --2429341, 5554467, -11161009, -15016279, -8574365, -4250944, -7143605, -5379984, 12491912, -7747048, -1085553, 5957120, -11521250, -7530152, -7823820, 11584601, -5443334, 7219840, 17551384, -2622078, -3762391, 775778, -5690295, -8152922, -5171141, 7279433, -1604170, 8412767, 145492, 5980742, -1142461, -13492640, 14359149, -7639136, -2967286, 24346558, 16670379, 10742787, -7520488, -18896246, --4059281, 10237591, -16313360, -10123238, 1175210, 12695923, 10507637, 7057168, -9073655, 6733435, --1804423, 6735046, -1082869, 18719614, 12568148, -1714766, -17008070, -2593624, 14494441, 10806138, -1410360, 22865332, 11621108, -5485210, 947040, 891743, -1821066, -7329899, -8105140, -2166274, --24525338, 6496675, -7736310, 476741, 140660, 5928666, 10557566, -500364, 3608310, -12136504, -9221295, -4887136, 18030272, -365072, 3566434, -41938744, -592169, 10221485, 6880001, 10911901, --2769180, -12316892, 7678328, 1436667, -8137890, 8177618, 3170760, -9889699, 1523640, -470836, -4597226, -4215511, -13582297, -16027207, 936303, -6398965, 6701223, 4315369, 4001299, 4641786, --16377247, -7114077, -17178796, -28140088, 4722317, 9508521, 10279467, 81604, 23474680, -16667157, -5703717, 3053185, -4442607, -14781130, -5895380, -8439074, 10152766, -4406100, -8721468, -14993731, --1051193, -5565741, -2508261, -11290932, 6364605, -719407, -4894115, 6070400, 8114267, 9162776, --11454678, 21719112, 1746441, -3052111, -12866111, -12428562, -2078227, -1534914, -12498355, -13402982, --9880572, 8887361, -5486821, 14660871, 5190468, 24369108, 8869644, 9413495, -2492692, 13229036, --1617055, 3429532, 19025094, -5243082, 7363722, -21676700, -27361090, 6569690, -542777, -17342542, -1946694, 999654, -23366232, 7458211, -6191732, -4082367, -8444979, 9972914, -7733089, 1451162, -251256, 5523865, 1393180, -11944841, 9350681, -256624, 4946192, -14524506, -20430622, -12965969, -4545149, 16942572, 22222698, -708133, 5900748, 13921600, 11471321, -1305670, -28330678, 19195282, --2003602, 5087926, -5891622, 9714142, -859530, -12462384, 3249680, 21980568, 3176128, -14879914, -12598750, 8884677, 5719286, -11311870, 11494943, 8415988, 662499, 13750875, -6058052, 3373697, -22304838, 16159814, 159988, 4790499, 10625212, -21978958, -4944581, -1884954, -4025458, -19367082, -4103841, 5130876, 304943, -15188078, -1074816, -25607132, 418222, -18497888, -4530117, 8541079, --8706972, -11496554, -9873593, 4599910, 3084860, -10704132, 2558190, -4351339, 10800769, -7183870, --8913131, 5638755, 9680319, -1911261, 2985539, 3643743, -29560650, -1436130, -4558034, -14703284, --1455457, 17044578, 2047089, -5566278, -6263136, 12904766, 3386582, 9689983, -23827942, 9459129, --24712704, -31876174, -18690088, 144955, -15770046, 15355582, -4010426, -21800718, 472983, -6394670, -3980361, 2709588, -3637301, -3802120, 14807973, -5200132, 6386617, -8554501, -6199249, 20551418, --6101538, -3613141, 551903, 3819300, 14568529, -28336584, -630286, 13463649, 15289547, 12084427, -2961917, -6040872, 29228864, 8391829, 10052908, 9831180, 6206228, -5049808, 1430224, 15394237, -6570226, -12757127, 7408282, 29272350, -14796699, 19890530, 8938901, -33163590, 9004399, 20432770, --1095217, 8581345, 1120450, -25414396, 13518410, 29138668, 2938295, 19446538, -11249593, 17058000, -16252693, -1657857, -1563368, 15509664, 9967545, -23222352, 23019414, -6751689, -4072166, 11895986, --5672041, -9574019, -9302362, 1061394, 1192390, -9198746, -17808546, 42027864, 19998978, -47840568, --20471962, 5678484, -8546985, 14523969, 15929497, 18207976, 19673634, -11853573, 37743100, -5199595, -443992, -11961484, 13899051, 19785304, -14369887, -15222438, -3844533, -8517994, 1180042, 8250096, -663036, -9352291, -4278861, 16357383, -1777580, 8568460, 1400159, 19575924, 27897960, 11402064, --14190572, -31391380, -3212099, -4799089, 3077344, -6765647, 10034117, 18403934, 1073205, -5914707, --15164456, 35681516, 30074972, -3377992, 14406394, -7638600, -11733314, -33018098, 18090402, -15022185, --4181688, -286152, -11100343, 6637872, 20147692, 3904125, -9709310, 10570451, -4803921, -13183402, -20601348, 5030481, -29934312, 38320236, -26063472, -12978317, 13961328, 15533286, 11923366, 703838, --13116293, 1275068, 19343996, 5467494, -25621628, -20946018, -4675072, 32249836, 3707094, -15693274, --41453952, -11739219, -1535451, 9831717, 29151554, 21966074, -2669859, 220117, 19353660, 15367393, -1169305, 4208531, -55925308, -35555348, -16830904, -27842126, 2942590, -15501611, 25500832, -5652177, --1389959, -41876, -9461276, -11378979, 18698140, 11384885, 7038378, -2423972, -7949985, -7563438, -9694815, -20044612, -6863358, 3757560, -6273337, -9645960, 9186935, -29001766, -40096740, 9947144, -13576392, 16102369, -23045720, -12444668, 14063334, 5275294, -38985420, -34735012, 3006477, -16669305, --16630650, 6788733, -31296890, 16608102, -11559368, 13693966, 13762686, -7724499, -17301202, -41671384, --13923747, -12333535, 24182276, -20040318, -12880607, 7660611, 17037598, 22434762, -3226594, -31104154, -14353244, -4983773, -12366821, -26847840, 8360691, 10975789, -38810936, 14494978, 14429480, 35099548, -3680250, -9186935, 2674154, -43643312, -12109660, -5546951, 1046898, 7669738, -14338211, 26320096, -11116986, 32608466, -6124087, 28671592, 19013284, 11221139, 26786638, 13148506, 17821430, 22208202, -1411434, -29438242, -27222576, 5502927, 32041530, 22746146, -41785200, -1306207, -6790344, -5998996, --4103841, -29258928, 7769059, -20833812, 18975166, -13923747, 42458436, -11097122, -60481192, -6408628, --20813948, 12113955, 9002251, 17342004, 39249560, 8872329, -5557688, 21620866, -13077102, 44021268, -6856379, 29424820, 13042205, 2602213, -12261595, -10333154, 70567920, -129386, -52116208, -11185705, -36235564, -26365730, -1173063, 20314658, 8103530, -40814000, -16008954, -46450608, 6543920, 41573672, --31042950, -28244778, 26575648, 13035763, -47399260, -44051868, 13393856, 2462627, 5657546, 15127412, --2728378, -13253732, -7689602, 28230820, -21223580, 34813932, 4640176, -8303783, 6355478, 19972134, --1229971, -6279779, -38563436, -16690243, 2863670, -20374252, 15917686, 25366076, 443992, 3779571, --28208808, 31304942, -12758737, -14875082, 24334210, -10691784, -1686848, -19426674, -3730716, -13979045, --47866336, 14795625, -7200513, 33068026, 41602664, -1822140, -10140418, -29056528, -11256572, -9166534, -38999912, -41206452, -30840012, -67431520, -1588601, -29164976, 4108673, 20547124, -16088411, -5968931, -40499396, 25948582, 15480673, 48318, -3851512, 29708826, -44307956, -7297687, -83752, -7471096, -5382131, 37666864, -27004606, 7903814, -7707319, -16516834, -11501386, 58158688, -5689221, 27424976, --21516712, 38998840, -11841762, -1589138, 24682104, 21620328, 59340880, 549219, 11819213, 6198175, --21591338, 27212376, 11669426, -19362786, 31207232, -14051522, 38658464, 25438018, -5845451, 21879638, -3815542, 20308216, 7239704, 35881232, -20374252, 16907676, -35497368, -11577621, 15729244, 39115340, -1104344, 1379221, 20649666, -2053531, -10846940, -51351704, -27520002, 6582038, -18129594, -2787434, -18781892, -44922672, 29589104, -3685619, 34637300, -16688632, -25996364, -6844031, 84444424, 16719234, --70302176, 11359115, 22259204, 3033321, 83746496, -6320581, -55638616, 59978144, -17333414, -5129265, -70184600, -8130373, 46377592, 6557342, -40179420, -37044, 45335528, 5752572, 6224482, -1919850, --60213296, -3600256, 8388608, -21256330, -7240241, -61324080, 38628936, 61428768, -27375584, 9495099, --46836080, -133491344, -26514980, 7156490, 67432064, 58204324, -56927108, -49095236, -51241644, -40502080, --30073362, 36464808, -7009924, 79249664, 52194592, -14893336, -65695820, -161201936, -105814576, 8188355, -178984176, 137766976, 24132348, -69751344, -178050016, -180537344, -14219563, 106435192, 162301440, 179919936, -17362942, -57139172, -74480104, -96471944, -88790392, 6618545, 59248536, 113466592, 76251776, 62712428, --82299088, -98407368, -117955368, -139525776, 13943074, 168471696, 163601744, 34133180, -61911416, -157148016, --208972704, -69584912, 13150116, 76899776, 185250528, 69302520, -4307316, -104345160, -89848568, -36695664, -36417564, 71912784, 119060792, -15982647, 28919626, 22203370, -51009180, 510027, 26201448, -21131776, -28949690, -1255204, -5373541, -2173254, 5771899, 21932788, -8748312, 25848724, 17557290, 10439455, -11635603, 8767102, -2381023, -15035607, 24139864, -511101, 14659797, -9037685, 13022878, -4754529, --2076617, 8736500, -12210592, -12917651, 1656784, -5711770, 19441170, 19152332, -18037252, 8595303, --10846940, 11912092, 6979, 7700340, 2794413, 10075993, -12945568, 8440148, -14864882, -6695317, --2301566, -2022930, 11506217, -22647900, -4677757, -9582609, -20095078, -2153926, -8061117, 4338991, -18615998, -6067178, -26416196, 3826816, 16028281, 31335008, -1562294, 2470680, -17195438, -13243532, -14740865, 1175210, -5468030, 430570, 26240102, 11692512, 8942659, 14721537, 25309168, -23469312, -3491809, 4629975, -17569100, 46506444, 82949240, 5957657, -52567716, 16939888, -3011846, 65376920, -32224602, 64243584, -5128191, -32069448, -7428683, 13434658, 28449326, 20419348, -11094437, 1056025, -12656195, 7406134, 26927834, -19180788, 5372467, -25501368, -2959233, -711354, 7280507, 11680164, -3794604, -11486890, 20854750, -2894271, -16549046, 22880902, -3092377, -9631464, 7363185, -4627291, -19650550, 28669980, 1745367, 6701223, -8981313, -7309498, 18233746, 11394011, 15287399, 1763621, --7980586, -19757386, -18126910, -21914534, 17780628, 17300128, 19089520, 25784836, 29864518, 11402601, -2683818, -26097832, 16587164, -3674882, -21524228, 27179626, -749472, 17583596, 11100343, -29072634, -9326521, -9186935, 7744900, 18357764, 5627481, -24103894, -13885092, -13422310, -29577292, -64042796, -3663607, 90122912, 117629488, 102159552, 69261720, -2511482, 3453154, -51382304, -62596464, -103194104, --79272752, -82841328, -28030568, 7259569, 25929792, 45681272, 111720688, 94090384, 62000536, 20554640, --11318849, -40837084, -31834298, -42526080, -55497420, -30178050, -32463510, -38227356, -19364396, -25301652, -3544959, 17300128, 12998182, 47659104, 42467564, 38869456, 23725400, 29214904, 16619913, 35012572, -6327024, 30084098, -1049583, -9049496, -56550224, -24577950, -67792304, -76883136, -87505128, -67726264, --52930104, -19244138, 9436580, 46834472, 48215840, 38823820, 80172544, 65844532, 68587408, 64836288, -58298276, 22283900, 35588636, -19765976, -46177876, -46452220, -106357888, -104589968, -103832448, -108328736, --93204552, -35801772, -24256364, 14690936, 46365784, 49877992, 21386790, 10043244, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, }, +-2012729, 393526, -3454228, -2672007, -2975876, -3445101, -5291400, 2605435, 2426657, -2637110, +587874, 3957812, 6357089, 2251100, 2586644, -1566589, 707059, -9688909, 2893734, 299037, +-1386201, 2769180, -938987, -3627100, 3354370, 1221918, 1333587, 2476586, 3316252, 3384434, +-86436, -4323422, -194884, 4540318, 4769025, 6190122, -1454920, 6061273, 120259, -335007, +-1996086, -275952, 3360275, 1279900, -9922448, -3320547, -5809480, -277562, -387084, -3804267, +-4479114, -3420942, 1127429, -3291556, 2004139, 3149822, 3466576, -4528506, -2304787, -5123359, +-2987150, -1445257, 330176, -4853850, 4890357, 1969243, -2193655, -102542, -902480, 8402567, +1959042, -757525, -2509335, 10535018, 805306, -955630, -133144, -1093069, -5280663, -5849209, +5594732, 1035087, -2969433, -5145371, -2122251, -3954591, -6140193, 7887708, 1216550, 2686502, +4292820, 11471321, -72478, 1601486, -2601140, -1321776, -1948841, -7935489, 1935420, -2627983, +983011, 5027259, -1873143, -819802, 1386201, 260382, -1035087, -59056, -6839736, 1152662, +62814, -2858301, 2445984, 686658, -4521527, 7175817, 504659, 736587, 7234873, -3066070, +-2769180, -7253126, -3235721, 4388383, 562641, 4692252, -2212982, -6030671, 2735894, -5660230, +-2054068, -10561325, 4482872, 3112778, 2495376, 2599529, 7317014, 1331977, -2663417, 3258807, +6216965, -4305168, 3362423, -579284, -624381, -2564632, -805306, 3222299, 267362, 1358820, +-4187056, 1064078, -2566780, -5495948, -459562, -6480032, -7678328, -4992363, -3649649, -8645769, +398358, -3193845, -1669132, 2513630, 9142912, 715112, -2123325, -1165547, 1495722, -303869, +3806415, 6328635, -525597, 7117835, -820876, -612570, -860604, 3988414, -5459441, 703838, +655519, -1491427, -325881, -3416110, -5448166, 7295002, -2567854, -718870, -1369021, 3120831, +-3595961, -3224984, 1238561, 928250, 5136244, -3754338, 4204773, -2693481, -4391604, -530965, +-1886028, 967978, 2209224, -295816, 2886755, 1235340, 2044404, -3087008, -3566970, -5814312, +-4328254, 301721, 6435472, 615791, 5143224, 1176821, -3122441, 3498251, 1387811, -4264366, +6612102, 955630, -7225209, -8031052, -6932077, 1394791, 911070, 5804649, -4442070, 5981279, +-2966212, -1454383, -9417790, -706522, 753767, -3363496, -447213, 5035313, 4954245, 7172059, +-1639604, -1176284, 4657355, 2060511, 4201552, -9890236, 9885404, -2148558, 11811, 1503239, +-1038308, -109522, -714575, -697395, 6208912, -192200, 8106751, -1371705, -3074660, -6597607, +953483, -2975339, -2429341, 4589173, 3725884, 4809290, 365609, 642098, -6815576, -5005785, +148176, 6481643, 2448668, -728534, 2388539, -2554969, 7075959, -233002, -5617281, -7322383, +-2384244, 8553427, 6630893, 6670621, 3325915, 472983, -6670084, -2872260, -627065, -3804804, +4711579, -401043, -1542430, 4077535, -9530532, 3422015, -785979, 2857227, -263067, 2275796, +-2535641, -4072703, -1001264, -3095598, 1253594, 5718749, 1845225, 458488, -2514703, -12406013, +-8648454, -12348, 3367254, 4696010, -48318, 1152662, -2096481, 4653597, 1636919, 3777424, +-5839545, 5487358, 2685965, -5705327, 1905355, 5707475, -630286, 2011118, 553514, 5195837, +-4189741, 3182034, -848793, -425202, -5087926, 531502, 4710506, -2991982, -2706903, -4194036, +5577015, -339839, 777926, -4423817, -13688598, -3635153, 1557463, 1471563, 4508642, -3291556, +-2602213, -1767379, -1316408, -4020626, -306553, -3599183, 8262444, 3335579, 6641093, -6920803, +-1904818, -2693481, 6156836, -1716376, -1756642, -5207648, 2887292, 259309, -4294431, 6099928, +1130113, 1203128, 5819681, 2050310, 3502009, -2784213, 2206540, 243203, -1497333, 6040872, +4530654, -438624, -8247948, -10920491, -8506183, 3150359, -47245, -4710506, -1288490, 566936, +-1133871, 12322261, 2066416, -8891119, -2427194, -2656974, 384400, -4189741, 6900402, -5210869, +-6888054, 6366216, -2747169, 1737314, 1626182, -2934000, -8099772, 1048509, -4348118, -3807489, +-4001299, -521302, 6185290, -899796, -1483911, 9200357, 1631014, 1370095, -11985643, -1380832, +6299644, 7389491, -4173098, 1960116, 967978, -11829951, -1618129, -790811, -1234803, 2889976, +108448, -6678138, 849330, -5358509, 5067525, -1878511, 6544457, 1217623, -7412577, 3235721, +14132053, -5513128, 285078, -10495289, 2780455, 8804683, -15382962, 2371896, -510027, -938987, +10336913, 1514513, 4513474, 7668127, -9437117, -2639258, -7261716, 3718905, 3842385, 8290361, +15464030, 2641942, -12233141, -958315, -3272228, -1087701, -5449240, 167504, -854699, 6081137, +4444755, 1857037, -715649, 367757, -2144263, -1247688, 6497212, -2102387, -1226750, 5196374, +-962610, 3101503, -839666, 6571837, -5282810, -9691594, 11821361, -629213, 2531346, -9077413, +307627, -2709588, 13127568, 2199560, 5727876, -1211181, 5026186, 3710852, -12626130, -1867774, +-7276212, -5845988, 401043, 8665097, 649077, -1682017, 12929462, -1370095, -8005282, -5724655, +-4410932, 6607271, 19737522, 2684, 5135171, 1494649, -6914361, -1368484, -365609, 6038187, +8708583, 879931, 6913824, 6590091, -12552579, 284542, -3989488, -15205258, 3144990, -1178432, +4963372, 3830574, 14134201, 3326452, -3133179, 3886946, 10730439, 12708271, 4699231, 9074729, +8484708, -6457484, -5713917, -10718091, -12403329, 1735167, 4821638, -9756555, -7605850, -128312, +-12137578, -9332427, 4589173, 2015413, -5589363, -3049964, -8079371, 6851547, 4332549, 10987063, +19699404, -1781338, -6032282, -1694902, -10225780, 332323, -8040716, -8067023, 9935870, 1628330, +1078574, -12741557, 13301514, 3173444, -8818642, -2260764, 6693707, 942208, 1200980, 243203, +826781, 4468377, -6812355, 8111583, -134755, -4870493, -1792612, -8689256, 1140851, -8931921, +-8638790, 7719130, 7201587, -7002944, -12147778, 3520263, -5944235, -382789, -3309272, 4454955, +-3398393, 5657009, -5858336, -6583111, 7938174, -2506650, -1770063, 4455492, -6465537, -6975027, +8005819, 10515691, 255551, -726386, 3663607, -9199283, 15634755, -9627706, 1203128, 7370701, +-3464965, 6874632, 8468065, 2696703, -8741332, 9434433, -1343251, 3506304, -6838662, -1354525, +-13070659, 4463545, -7736847, 2954938, -13456669, 7888781, -9818832, -6954626, 5726265, 7794292, +2704756, 825707, 392990, -8542690, -7828115, -5077188, 20643224, 11262478, -3179887, -19099720, +-2636036, 5335960, 11148661, -6302865, 947040, -13197898, -4494147, -1646583, 3455301, 1919314, +-2941516, -246961, 5786395, -6527814, -371515, -7435662, 4016331, 4864051, 14170171, 6040872, +-6985765, 2931315, -3946001, -10759430, -1466195, 6165963, 840740, 17558364, -13351443, -2226404, +2991982, 7767985, 4097399, 10203769, 2091649, -12770548, 8135205, -10857140, -11158325, 23085, +-875636, 8311836, 10854456, 9534827, 14501420, 3182571, -14706505, 15888695, 8986682, -6917582, +12589623, -1986959, 1613297, -11342472, -3711389, -3562675, -4788889, 10050760, -17532594, -4414690, +-8218957, -8312373, 1487132, 8006356, -3992709, -10645613, -10758893, -14538464, -14181445, -7741679, +-2429341, 5554467, -11161009, -15016279, -8574365, -4250944, -7143605, -5379984, 12491912, -7747048, +1085553, 5957120, -11521250, -7530152, -7823820, 11584601, -5443334, 7219840, 17551384, -2622078, +3762391, 775778, -5690295, -8152922, -5171141, 7279433, -1604170, 8412767, 145492, 5980742, +1142461, -13492640, 14359149, -7639136, -2967286, 24346558, 16670379, 10742787, -7520488, -18896246, +-4059281, 10237591, -16313360, -10123238, 1175210, 12695923, 10507637, 7057168, -9073655, 6733435, +-1804423, 6735046, -1082869, 18719614, 12568148, -1714766, -17008070, -2593624, 14494441, 10806138, +1410360, 22865332, 11621108, -5485210, 947040, 891743, -1821066, -7329899, -8105140, -2166274, +-24525338, 6496675, -7736310, 476741, 140660, 5928666, 10557566, -500364, 3608310, -12136504, +9221295, -4887136, 18030272, -365072, 3566434, -41938744, -592169, 10221485, 6880001, 10911901, +-2769180, -12316892, 7678328, 1436667, -8137890, 8177618, 3170760, -9889699, 1523640, -470836, +4597226, -4215511, -13582297, -16027207, 936303, -6398965, 6701223, 4315369, 4001299, 4641786, +-16377247, -7114077, -17178796, -28140088, 4722317, 9508521, 10279467, 81604, 23474680, -16667157, +5703717, 3053185, -4442607, -14781130, -5895380, -8439074, 10152766, -4406100, -8721468, -14993731, +-1051193, -5565741, -2508261, -11290932, 6364605, -719407, -4894115, 6070400, 8114267, 9162776, +-11454678, 21719112, 1746441, -3052111, -12866111, -12428562, -2078227, -1534914, -12498355, -13402982, +-9880572, 8887361, -5486821, 14660871, 5190468, 24369108, 8869644, 9413495, -2492692, 13229036, +-1617055, 3429532, 19025094, -5243082, 7363722, -21676700, -27361090, 6569690, -542777, -17342542, +1946694, 999654, -23366232, 7458211, -6191732, -4082367, -8444979, 9972914, -7733089, 1451162, +251256, 5523865, 1393180, -11944841, 9350681, -256624, 4946192, -14524506, -20430622, -12965969, +4545149, 16942572, 22222698, -708133, 5900748, 13921600, 11471321, -1305670, -28330678, 19195282, +-2003602, 5087926, -5891622, 9714142, -859530, -12462384, 3249680, 21980568, 3176128, -14879914, +12598750, 8884677, 5719286, -11311870, 11494943, 8415988, 662499, 13750875, -6058052, 3373697, +22304838, 16159814, 159988, 4790499, 10625212, -21978958, -4944581, -1884954, -4025458, -19367082, +4103841, 5130876, 304943, -15188078, -1074816, -25607132, 418222, -18497888, -4530117, 8541079, +-8706972, -11496554, -9873593, 4599910, 3084860, -10704132, 2558190, -4351339, 10800769, -7183870, +-8913131, 5638755, 9680319, -1911261, 2985539, 3643743, -29560650, -1436130, -4558034, -14703284, +-1455457, 17044578, 2047089, -5566278, -6263136, 12904766, 3386582, 9689983, -23827942, 9459129, +-24712704, -31876174, -18690088, 144955, -15770046, 15355582, -4010426, -21800718, 472983, -6394670, +3980361, 2709588, -3637301, -3802120, 14807973, -5200132, 6386617, -8554501, -6199249, 20551418, +-6101538, -3613141, 551903, 3819300, 14568529, -28336584, -630286, 13463649, 15289547, 12084427, +2961917, -6040872, 29228864, 8391829, 10052908, 9831180, 6206228, -5049808, 1430224, 15394237, +6570226, -12757127, 7408282, 29272350, -14796699, 19890530, 8938901, -33163590, 9004399, 20432770, +-1095217, 8581345, 1120450, -25414396, 13518410, 29138668, 2938295, 19446538, -11249593, 17058000, +16252693, -1657857, -1563368, 15509664, 9967545, -23222352, 23019414, -6751689, -4072166, 11895986, +-5672041, -9574019, -9302362, 1061394, 1192390, -9198746, -17808546, 42027864, 19998978, -47840568, +-20471962, 5678484, -8546985, 14523969, 15929497, 18207976, 19673634, -11853573, 37743100, -5199595, +443992, -11961484, 13899051, 19785304, -14369887, -15222438, -3844533, -8517994, 1180042, 8250096, +663036, -9352291, -4278861, 16357383, -1777580, 8568460, 1400159, 19575924, 27897960, 11402064, +-14190572, -31391380, -3212099, -4799089, 3077344, -6765647, 10034117, 18403934, 1073205, -5914707, +-15164456, 35681516, 30074972, -3377992, 14406394, -7638600, -11733314, -33018098, 18090402, -15022185, +-4181688, -286152, -11100343, 6637872, 20147692, 3904125, -9709310, 10570451, -4803921, -13183402, +20601348, 5030481, -29934312, 38320236, -26063472, -12978317, 13961328, 15533286, 11923366, 703838, +-13116293, 1275068, 19343996, 5467494, -25621628, -20946018, -4675072, 32249836, 3707094, -15693274, +-41453952, -11739219, -1535451, 9831717, 29151554, 21966074, -2669859, 220117, 19353660, 15367393, +1169305, 4208531, -55925308, -35555348, -16830904, -27842126, 2942590, -15501611, 25500832, -5652177, +-1389959, -41876, -9461276, -11378979, 18698140, 11384885, 7038378, -2423972, -7949985, -7563438, +9694815, -20044612, -6863358, 3757560, -6273337, -9645960, 9186935, -29001766, -40096740, 9947144, +13576392, 16102369, -23045720, -12444668, 14063334, 5275294, -38985420, -34735012, 3006477, -16669305, +-16630650, 6788733, -31296890, 16608102, -11559368, 13693966, 13762686, -7724499, -17301202, -41671384, +-13923747, -12333535, 24182276, -20040318, -12880607, 7660611, 17037598, 22434762, -3226594, -31104154, +14353244, -4983773, -12366821, -26847840, 8360691, 10975789, -38810936, 14494978, 14429480, 35099548, +3680250, -9186935, 2674154, -43643312, -12109660, -5546951, 1046898, 7669738, -14338211, 26320096, +11116986, 32608466, -6124087, 28671592, 19013284, 11221139, 26786638, 13148506, 17821430, 22208202, +1411434, -29438242, -27222576, 5502927, 32041530, 22746146, -41785200, -1306207, -6790344, -5998996, +-4103841, -29258928, 7769059, -20833812, 18975166, -13923747, 42458436, -11097122, -60481192, -6408628, +-20813948, 12113955, 9002251, 17342004, 39249560, 8872329, -5557688, 21620866, -13077102, 44021268, +6856379, 29424820, 13042205, 2602213, -12261595, -10333154, 70567920, -129386, -52116208, -11185705, +36235564, -26365730, -1173063, 20314658, 8103530, -40814000, -16008954, -46450608, 6543920, 41573672, +-31042950, -28244778, 26575648, 13035763, -47399260, -44051868, 13393856, 2462627, 5657546, 15127412, +-2728378, -13253732, -7689602, 28230820, -21223580, 34813932, 4640176, -8303783, 6355478, 19972134, +-1229971, -6279779, -38563436, -16690243, 2863670, -20374252, 15917686, 25366076, 443992, 3779571, +-28208808, 31304942, -12758737, -14875082, 24334210, -10691784, -1686848, -19426674, -3730716, -13979045, +-47866336, 14795625, -7200513, 33068026, 41602664, -1822140, -10140418, -29056528, -11256572, -9166534, +38999912, -41206452, -30840012, -67431520, -1588601, -29164976, 4108673, 20547124, -16088411, -5968931, +40499396, 25948582, 15480673, 48318, -3851512, 29708826, -44307956, -7297687, -83752, -7471096, +5382131, 37666864, -27004606, 7903814, -7707319, -16516834, -11501386, 58158688, -5689221, 27424976, +-21516712, 38998840, -11841762, -1589138, 24682104, 21620328, 59340880, 549219, 11819213, 6198175, +-21591338, 27212376, 11669426, -19362786, 31207232, -14051522, 38658464, 25438018, -5845451, 21879638, +3815542, 20308216, 7239704, 35881232, -20374252, 16907676, -35497368, -11577621, 15729244, 39115340, +1104344, 1379221, 20649666, -2053531, -10846940, -51351704, -27520002, 6582038, -18129594, -2787434, +18781892, -44922672, 29589104, -3685619, 34637300, -16688632, -25996364, -6844031, 84444424, 16719234, +-70302176, 11359115, 22259204, 3033321, 83746496, -6320581, -55638616, 59978144, -17333414, -5129265, +70184600, -8130373, 46377592, 6557342, -40179420, -37044, 45335528, 5752572, 6224482, -1919850, +-60213296, -3600256, 8388608, -21256330, -7240241, -61324080, 38628936, 61428768, -27375584, 9495099, +-46836080, -133491344, -26514980, 7156490, 67432064, 58204324, -56927108, -49095236, -51241644, -40502080, +-30073362, 36464808, -7009924, 79249664, 52194592, -14893336, -65695820, -161201936, -105814576, 8188355, +178984176, 137766976, 24132348, -69751344, -178050016, -180537344, -14219563, 106435192, 162301440, 179919936, +17362942, -57139172, -74480104, -96471944, -88790392, 6618545, 59248536, 113466592, 76251776, 62712428, +-82299088, -98407368, -117955368, -139525776, 13943074, 168471696, 163601744, 34133180, -61911416, -157148016, +-208972704, -69584912, 13150116, 76899776, 185250528, 69302520, -4307316, -104345160, -89848568, -36695664, +36417564, 71912784, 119060792, -15982647, 28919626, 22203370, -51009180, 510027, 26201448, -21131776, +28949690, -1255204, -5373541, -2173254, 5771899, 21932788, -8748312, 25848724, 17557290, 10439455, +11635603, 8767102, -2381023, -15035607, 24139864, -511101, 14659797, -9037685, 13022878, -4754529, +-2076617, 8736500, -12210592, -12917651, 1656784, -5711770, 19441170, 19152332, -18037252, 8595303, +-10846940, 11912092, 6979, 7700340, 2794413, 10075993, -12945568, 8440148, -14864882, -6695317, +-2301566, -2022930, 11506217, -22647900, -4677757, -9582609, -20095078, -2153926, -8061117, 4338991, +18615998, -6067178, -26416196, 3826816, 16028281, 31335008, -1562294, 2470680, -17195438, -13243532, +14740865, 1175210, -5468030, 430570, 26240102, 11692512, 8942659, 14721537, 25309168, -23469312, +3491809, 4629975, -17569100, 46506444, 82949240, 5957657, -52567716, 16939888, -3011846, 65376920, +32224602, 64243584, -5128191, -32069448, -7428683, 13434658, 28449326, 20419348, -11094437, 1056025, +12656195, 7406134, 26927834, -19180788, 5372467, -25501368, -2959233, -711354, 7280507, 11680164, +3794604, -11486890, 20854750, -2894271, -16549046, 22880902, -3092377, -9631464, 7363185, -4627291, +19650550, 28669980, 1745367, 6701223, -8981313, -7309498, 18233746, 11394011, 15287399, 1763621, +-7980586, -19757386, -18126910, -21914534, 17780628, 17300128, 19089520, 25784836, 29864518, 11402601, +2683818, -26097832, 16587164, -3674882, -21524228, 27179626, -749472, 17583596, 11100343, -29072634, +9326521, -9186935, 7744900, 18357764, 5627481, -24103894, -13885092, -13422310, -29577292, -64042796, +3663607, 90122912, 117629488, 102159552, 69261720, -2511482, 3453154, -51382304, -62596464, -103194104, +-79272752, -82841328, -28030568, 7259569, 25929792, 45681272, 111720688, 94090384, 62000536, 20554640, +-11318849, -40837084, -31834298, -42526080, -55497420, -30178050, -32463510, -38227356, -19364396, -25301652, +3544959, 17300128, 12998182, 47659104, 42467564, 38869456, 23725400, 29214904, 16619913, 35012572, +6327024, 30084098, -1049583, -9049496, -56550224, -24577950, -67792304, -76883136, -87505128, -67726264, +-52930104, -19244138, 9436580, 46834472, 48215840, 38823820, 80172544, 65844532, 68587408, 64836288, +58298276, 22283900, 35588636, -19765976, -46177876, -46452220, -106357888, -104589968, -103832448, -108328736, +-93204552, -35801772, -24256364, 14690936, 46365784, 49877992, 21386790, 10043244, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, }, }, { { -2168959, --445603, 329102, -860067, -1518808, -3882651, 483721, -608275, -7189239, -1008244, -819265, -2469069, 5764383, -4874788, 2117419, -3059091, 1299765, -4207458, 2139968, 1373316, -3018288, --2754148, -4562329, 1896765, -4285841, 639413, 3762391, 2639794, 1153736, 1784559, 277562, --3806952, 163746, -2378875, 1923072, 1250909, 1466195, 5996311, 1932735, 905164, -128849, -2052458, -59593, 1890323, -471373, 4276177, 1480153, 1901597, 3220152, 7155416, 351114, --1174674, 2863670, -2155537, -4983236, 2552821, -2284923, -4288525, 1119913, -1305670, 2362769, --1137093, -1913408, -3275986, 3397856, 1266479, -198642, -3163244, -4417374, -1308891, -1005022, -724239, -550293, -78383, 702764, 1323387, 10341208, 5574868, -671626, 3679176, 858993, -882616, -11425150, -4894652, -5681168, 4491462, -653372, -3637837, 3988951, 4221953, 233539, -4057670, -1706713, -73551, -271120, -2401961, -1318555, -5402532, 2793876, -8017630, 3346317, --4148939, 3414499, 6497749, 2909304, -1153736, -1840930, 4822175, -786516, 293132, 4478041, --4742181, -155156, -1554241, -2785286, 666257, -682900, 1073742, 4603668, 7672959, -2413772, -216359, 6311455, 559956, 1668058, -2241436, -3520263, -437550, 1080184, -5875516, -1537061, -3196530, 439697, 1206886, 1893544, -774168, -1806571, -1682554, -2019172, 2379949, 1974611, --1029182, -3305514, -4138201, 2214593, 81604, -3298535, 3694746, -541166, -271120, 972810, -933082, -900333, -3777961, -983548, -13422, -3494493, -3621731, -2102923, 8546448, -5988258, --2523293, -4167192, -7713762, 2911451, 1271847, 346282, 6541235, 6283001, 6203544, 2067490, --1213865, 1017907, 4664335, -1962263, 1984275, 2433636, -5604933, 7968238, 1485522, 2518998, -5800354, -2190433, -5890548, 456877, 3911105, -2729452, -1324461, -3658239, 3888019, -30065, --463856, -6401649, -345208, -708670, 3920232, 2119566, -3623342, 7172596, 2539400, 1567126, -2401424, -1057636, 3886946, -1443646, 104690, -4833449, -6005975, 4854387, 3600793, 6688338, -522912, 1908039, -5209796, -7714835, -4003983, -2196876, -2451890, -3454764, -3311957, 1820529, --1120450, 2610803, -3198677, -869194, 1000191, 1787780, -1254131, 4429185, 809601, -7387881, --6904160, 4044249, 906238, 5658620, -8762270, -1235877, -3497714, 933619, 10387378, 5934034, --9133785, 3433290, 832150, -3811784, -4260608, -5182415, -8425115, 277025, 960462, -3134789, -1440425, -1821066, 266825, 2496450, 1895154, 5369246, -4792647, 8470749, -5258651, 4898947, -3845070, -3234110, 2211908, 362388, 3447785, -1469953, 1751810, 3187403, 979789, 443455, --1413581, 2463701, 636729, -1199370, 5921150, -7988639, 399969, -4872641, 9373766, 3284039, --8493835, 3147674, 10707890, -10334765, -5094368, 1137093, -1074279, -3986804, 2988224, -1469953, -6963216, -6220724, -943282, -2143189, -810138, -504122, 6557878, -6653978, -2710661, -869731, --7407745, 3433290, 1894081, 7009387, 1601486, 5668283, 3165391, -4946729, 531502, -3039226, -3274376, 1378685, -5211406, 15005005, -9493488, 3167539, 15992311, -11124502, 5242008, -74088, -5224291, -1154809, -9706089, -1869921, 8018167, 7448010, 2011118, 216896, 4097399, 2289755, -206158, 3674882, 3449396, -2449742, 4391604, -839666, 6885907, -5085242, -8287677, 2187212, --7198902, 2946348, 310848, -1674500, -2158758, -2908767, -4786204, 1440425, 2004139, 668404, -1537598, 1969243, -2793876, -5920076, 5394479, 1696512, 1180579, 268972, 7838852, 2113124, -3537443, 8521752, -4391067, 2579665, 807454, 3079492, 6057515, 5060545, -6602976, -5530844, --974958, -2790118, -108448, 1111323, -2292439, 2547453, -4840428, 1237488, -4478577, 3754338, -3987340, -2122251, 5488968, -2804614, 5054103, -1597191, 2937221, -3226057, 1123671, -2384244, -2248416, -1548873, -8396661, 6248104, 5364414, 10813654, -6733435, 3979824, -8527121, -2374580, -6621766, 5453535, -5703717, 1139240, -6739341, -179315, -8047158, 2195802, -5786932, -9069897, --6516003, 3010772, -5071283, -468688, -6098854, 192200, 2018635, -1788317, -4176856, 2527052, -5552319, 1986422, 3143379, -6244346, 4054449, -6511708, -767189, 2844879, 1203128, -1515587, --450972, -935229, 4814659, -4988068, -7082401, -2455111, 3732864, -2455648, -4884989, -6897718, --7500624, 1378148, -1216013, -8931921, 7235410, -5989869, -3732327, 9185861, -2080912, -2702071, -2415382, -2552284, -1498944, 33823, -3508452, -3478924, -2290828, -4392141, 1838783, 1303523, -7954817, -11344082, 2266669, 9336722, -3315715, 10241886, 3199214, 319975, -2827699, -7746511, --4632659, 12214887, -6550362, -447213, -2138357, 580357, 7764227, 6390375, -3953518, 9402220, -9978820, -5077188, -2276333, 5517959, -4922570, -4902169, -200790, -7290170, -50466, -2517925, -964757, 11270531, 4101694, 89657, -5350456, -16261820, -1869385, 8233989, 2193118, -6488622, -4524748, 6541772, 6259915, 6924561, -12422656, 1833414, 568009, -6854231, 3285650, -6266358, -3877819, -3882651, 4809827, 10212358, 14440217, 8352638, 4100620, -6898255, -1795833, -8112120, --7713762, -2558727, 8370355, 1069447, -27917, 902480, -8507256, 967441, 889595, -1404454, --4336843, 751082, 4537633, -6624450, -8929774, 18355616, 3469797, -6244883, -1061394, -4031901, --783832, 2131378, -3040300, 15830176, -1044751, 4096325, 12309376, 1032403, -1165010, -8174397, -4907000, -4636417, -4582730, -15999827, -6327561, 2643016, -205085, -3474092, -10573136, 3447785, -6813429, -9277129, -3962107, -2820183, -8575976, 3234647, 1320703, -5319854, -3339337, -2110977, --11795054, -4867272, 6874095, 9958419, -7158100, -10223096, -2144799, -970663, -7261716, -6942815, -3220689, 3990562, -8009041, 17133162, 825707, 6757594, -3234647, 6337761, -3773129, 1675037, --11660299, -2946348, 5842230, -12743705, 4189204, -3114925, -5546414, -14404247, 475668, 7549479, -904628, -15149423, -1461363, 2456185, 6764037, 10684805, -3264175, 4669703, 13457743, 4052302, -2160906, -6031745, -767189, 5134097, -1885491, -4529580, 5578089, 1372242, -9407589, -13916768, --11974369, -14417668, 12342125, -7388418, -2253784, 4488778, -14308147, -5471789, -10069551, -4007205, --3475166, 6621766, -12593918, -6212670, 3507915, 5142687, 6658273, 190589, -156766, -1884417, --421981, -2578591, 1345935, -9400073, -5619965, -8237211, 5499706, 3213173, 4161287, 6208912, --12204150, -583579, -1701881, 10974715, -4466766, 3625489, 5390721, -1952600, 5794985, -3859028, -6504191, 10001368, -4296041, -460635, 7902740, -6970195, 11099806, -4779762, -18964428, 3040300, -9021042, -3496640, 543850, -186831, 6746857, 9294846, -9940702, -3991098, 1517734, 6359773, --11684459, -8349954, -7454990, 13186623, -1224066, -15464030, -4395362, -6790880, -8757438, -3270618, -5674726, 2366527, 8213588, 3074123, 3906273, -16359530, -6701223, 6631967, -4582730, -2946885, --5741835, 1864553, 8381092, 2428267, 1810866, -10917270, -3997541, -1860795, 3852586, 9891310, --12081743, 5730023, -9904195, -2405719, -9139690, 1292785, 944893, -296890, 3411815, -8120710, --2682744, -7599945, -3495567, 296353, -672162, -9580998, 5260261, 6413460, -2659659, 7584376, -14252312, 1666447, 10705206, 14353781, 759136, 643708, 3054796, -2785823, 4325569, 1168768, --3485903, -4556424, 17416630, -1612223, 10007274, 4864588, -5657546, -5804649, -4656819, 5298379, --4488241, 6829535, 15259482, 8362838, -2512556, 727997, -13583371, -8511015, -8453033, 12995497, -18949396, -7742216, -534723, -7007239, -2135136, 10761577, 31446676, 13088913, -3799972, -1516124, --5352603, 13853954, -13918378, -8591545, -21499532, -709207, 11195906, 12970801, 2811056, -5805185, --12743168, -10085657, 10057203, -2451353, 15744276, -538482, -4563940, 6750615, 3009162, -643708, --3459596, 9511205, -1508070, 8135742, 213675, -5265093, 19253802, -5073430, 8010114, 18023294, -6871411, -1359894, -8753680, -2300492, -14471355, -17938468, 4094178, 10484015, -2350421, 921271, --18613314, -7847979, 11263015, 5266167, -4608500, 2928631, -5324149, -3442416, -8346732, -15247134, -1151051, -4197794, -9973451, -17545478, -14175003, -5545877, -13006772, 5213554, -5690832, 1166621, -1956358, -1093606, 554051, -3200825, -2736431, 7464117, 17307108, -12693776, 2343979, -6057515, -6427419, -7341173, -13131326, -14126147, 3389803, 5872831, 16974784, -14357002, 4293357, 4802311, --24833500, -846109, -243739, -20139102, -11552388, -6958384, 4762582, -1383516, 772557, -5524939, -8122857, 13751948, 6635188, -1713155, -21239150, -8829916, -11799886, 4391604, 721018, -8922258, --1276142, 7296076, -6626061, 12477954, -11731703, -202400, -7118909, -20605106, 2871723, -8720931, --10635950, 7798587, 10726144, -12772696, 4221416, 15204721, -5728413, 6674916, 4384625, -3534758, -1215476, -16822314, 24577414, 10006200, 5102421, 24283208, -30652108, -2282238, -5127654, 3070365, -11040213, 12481712, 3703873, 5877126, 14361297, -1632088, -11830487, -18534932, 5771899, -7147363, --737661, 4733054, -5193153, 7237557, 18292802, -12601971, 7517267, -6309307, -7764764, 3360275, -16244640, 18402862, 5011153, 11233487, -7184407, 5127117, 5633387, -31039728, 9033927, 9657234, -2442763, -10089415, 117575, -19261318, 22666154, 13159780, -6665789, -7790534, -10745471, -6070400, -16502338, -16615618, -9011915, -2713346, -2374580, -3778498, 2707977, -11072963, -10690174, -6746857, --8153459, -2532957, -10714870, -1750199, -7077033, -24509768, -15156940, -6202470, -3513820, 3201361, -4398047, -318901, 1044751, 6866042, 3709241, 3440269, 17413408, 3419331, 6076305, 10525354, -23248658, 19500226, 1293322, -7898445, -14842870, 13599477, -3180423, 36960340, 7636452, 16505022, --1721208, 1995012, -14715095, -715112, 12782360, 7290707, 9528385, -11311333, -7793218, -14535243, --27913530, 15375446, -25289842, -3349538, 29072096, 4118337, -22535694, 7082938, 7699803, -14106820, --11938398, 855235, 8524973, 22098680, -1633698, -15891379, -17224430, -210990, -9965935, 3483219, -2534568, -17773648, -16434692, -29465086, -9407052, -8022999, -21029770, -13175886, -612033, -8789651, --6471442, -4625143, -2142115, -19503446, -11353746, -11659226, -6633040, 7105487, -17719962, 2159295, -13942538, 18012020, -4452271, 5602785, 9363566, -15990163, 9145059, -6357089, 14635101, -6278706, -948651, -6808060, -2137820, 30996242, -6574521, 12391518, -22288196, -2432025, -450972, -19498078, -18918258, 2043868, -7544110, 15273441, -6156836, 5039071, 26978838, -9325448, -15533823, 12048994, --3391951, -28988344, 11984569, -38818452, -22537304, 18786186, 12192338, 5479305, 8055748, 3779571, --660351, -24014772, -13033615, -5106716, -5273683, 41637560, 22516366, 212601, -21529060, 11142756, --22441740, -17934172, 3109020, 18581640, 36220532, -5566815, 18225156, -6426345, 12888123, 22211960, -12167642, 14242112, 7394860, -4002373, -18221936, -18566070, -5813775, -17550846, -5348308, -3148211, --4122095, 14197551, -2545305, -36208720, 1997160, 8797704, 8256538, 21725018, -2352568, -43281996, -24515136, -19390704, 6248641, -4284767, 14489609, 21134998, -23663122, -1763621, -11836393, -20729122, -14875082, -10427644, -25346750, 9705552, 14828375, 24065776, 6506339, -4164508, 2753074, 19505594, --15923054, 30955976, -9722195, -9418863, -2596845, 18411988, -19650550, 896038, 2843805, -56716652, --7705708, 15770046, -7286412, 1068373, 8698919, 1640678, -1293322, 1112397, 21388400, 16207596, --6067178, -1649268, 23895588, 15787763, -43983688, -25033216, 30500710, 35201552, -18548354, -6195491, --49353468, -27228482, 7570954, -1950452, 7078106, -26060250, -16033113, -17687212, 27409408, 40343700, --1297080, 11305428, -5786395, -2884608, 259309, 9827959, 18103824, 4944581, -5254893, -2494839, --3090766, -22927610, -12468290, -23248658, -2108829, 8523899, -8989367, 16062104, -9791452, -2929705, -24537686, -9928891, 14476187, 10461467, -2704756, -20812338, -14512694, -11680700, 5786395, 43500504, -9233643, 24339580, 28474022, 22750978, 17495550, 15932718, -20700668, 2950106, -1255741, 33512020, -17406428, 20929376, 35227860, -12694850, -18450106, 11455752, 30884572, -42324220, 3193845, 8147016, -26096222, -32197222, -50982336, -3731790, 22392886, 12239583, 15524159, 24599962, -5709086, -4151623, -11483669, -18018998, 14460618, -3159485, -8803072, -22660248, 10111964, -12372727, -17046726, 11507828, -29740502, 5699959, -7743826, 13480292, 29913910, 7430294, 8309688, -748398, -325881, 10130217, --20037634, -1365263, -29998736, 14755897, -23669028, -4987531, 16989280, 5061082, -12286291, 357019, --14637785, 32908040, 7461432, 8702677, 21497386, 36515276, -13421773, 9820980, -15988016, 3771518, -17114370, 28609850, 10435697, -9634149, 35489316, 1125281, 724776, -22071836, 4277788, 16907676, --3826279, 15990700, -21002926, 33411624, 41678900, -50243600, 1974074, -7054484, 13344463, -12280922, --2811593, 15222438, -13507135, -54526756, 3942780, 38307888, -31277026, 11065446, -4586488, -11754252, --17653926, 39577588, 439697, -3789235, 9495636, -47160352, 31740882, 3342558, -23501524, 2079301, --48242148, -11462194, 2998961, -9750650, -38282116, -4579509, -24896314, -6578816, 24048058, 5220533, -31363462, 12557948, 12304544, 7055021, -9702868, 24503326, -11681774, -314606, 12472585, 5323075, --14188961, 12229383, 5938329, 29181618, 12972949, -5142687, 18646600, -13871134, 24866786, 8344048, --24987046, -26668526, 15104863, 17752174, 8523899, 3176665, -11370926, -16817482, 6649683, -16476031, --24122684, -7327751, -2789581, -22913114, -7132867, 9480067, -14394046, -25741350, 9271224, 10705206, -2819109, -2264522, 454730, -3391414, 11642046, 46409804, 11459510, -49929, 685584, -14336601, --23198728, -9583146, 39920112, 42055248, 23420456, 6266358, 39437464, 20358682, -4737349, -46825880, --34610992, -26671746, -54487028, -18801220, -4173635, 11114838, 20989506, -8956081, 27049704, -30818538, -25026774, -3120294, 33391224, -21473226, 19362786, -31667330, 27834610, -25536802, -10658498, 38696044, -9084930, 31155156, 44432512, 4800700, -3328600, -18146236, -1219234, 28414430, 7348152, -9556302, --30791694, 3097745, 6462315, 15182709, 9318468, 12774306, 7995082, -17540646, -28551332, -11619497, -28417114, 11454678, 89802936, -27609124, -23438710, 30000346, 46350212, 10553272, -297963, 13072807, -3543885, 15816754, -12960601, 6489696, 22000970, 24962886, 16394427, 70727912, -8215736, -7497939, --3896072, 37360308, 22030498, -16463147, 19403052, 1406065, 6786585, -13021804, 32450626, -29650844, -2899640, 51128364, -35389992, 107395120, -47647292, 52570936, 46679852, -43224552, -41303088, 48406964, -214748, -6401649, 15406585, 25325812, -56374132, -20627118, 30735322, -67406824, -45587320, -26863946, -46312096, 106180720, 26261578, -79249664, -20893942, -81029392, -46005004, 70129296, 37999188, 66051764, -32489816, -46073724, -79274360, -56203944, -16707960, 36759016, 36556616, 25818122, 10465762, -18096844, --86604792, -98599568, -24707874, 79257712, 134582800, 95370288, -20601348, -62435940, -95699384, -66620848, --58736900, 2108292, 18945638, 77162312, 76854680, -41406704, -30623116, -98852968, -97304632, -31746788, -5587753, 99310920, 139974064, 65721588, -46362560, -148769072, -115755808, -80074832, 35328252, 87601760, -49107584, 35632660, 24166708, -88227752, -21397528, -49703508, 13907641, -5697811, 47798692, 84873384, -60666412, -77268608, -163727904, -118200184, 6646999, 91106992, -9023189, -18546206, 36869072, 11468100, --29811904, -28164248, 126702, -45367204, -5565204, 6737193, 5241471, -3920768, 1190243, -15222975, --1841467, -1746441, 7894687, -5206037, 20983600, -5480915, -3952444, -5755256, -6490233, 13137768, -3810710, -6173479, 20338818, 1415192, -35923644, -17829482, 10006737, 17793512, -5908802, 2340220, -24766392, -392453, 3459596, -19944218, -8924405, 6483790, -4295504, -4187056, -2587718, 16658031, -6002217, -6023692, -19226422, -7283191, -1044751, -17161078, 1773285, -19613506, -13380434, -8799851, --17797808, 28664074, -4969814, -11979738, 11940546, 598074, -27473296, -717796, 27613418, 23338852, --12692165, 18442590, 3029026, 17818208, -18239116, -25617332, 10669773, 13737453, 11002632, 11162083, --9331353, 12267500, -18025440, 15222975, 13787382, -22089554, 44259636, 67796056, -9012452, -25017648, --21711596, 62460636, 28014998, 60424820, 32353452, 56371, -28331214, -6320581, 15123117, 28304372, -13254269, -13253195, -3598646, 13433047, 19596862, 2320356, 4061429, -14163192, 2091649, -6957310, -8615168, 9984725, 25912612, 22519588, -12671227, 1693828, -14192719, 3228742, 11415486, 17687212, -639950, -8942122, -772557, -15890842, 12146704, -3995393, 4497905, 11625940, -639950, 15605227, --8870181, -4926328, -4776004, -17095044, -10990821, -25820806, -5922760, -29398514, 746787, -10555956, -22381074, 2824478, 5577552, -22996866, 7902203, -631897, -11526082, 15466714, -10567230, -5499169, -2117956, 9791452, -3447248, -7013145, 34257196, 10708964, 5645735, 12385075, -13457206, -26069914, --54200876, -8253854, 73179800, 110934176, 94459752, 73223288, -4501663, 7681549, -54067732, -62911608, --100407208, -59183576, -63180044, -21227876, 8187819, 42566348, 31361852, 94142464, 83210696, 26023744, -5766531, -16346109, -32590212, -52922588, -19020800, -54284628, -14340896, -27353036, -16983912, -14111652, -2235531, -1018444, 17188996, 23805394, 38463580, 40415104, 50138376, 41859288, -6365142, 1970853, --1762010, 5847598, -26663156, 7657927, -28591598, -70239360, -34949224, -53398792, -86973624, -27907624, --9662066, -37609416, 9090835, 22734872, 56418692, 66290136, 99907384, 61277908, 49377628, 48590040, -28564216, -14806900, 430034, -57105348, -50594176, -81016504, -96411280, -109865800, -83515640, -65424700, --16093242, -11559368, -4680978, 19373524, 33392296, 77469400, 49866716, 24200530, -2239289, 0, -0, 0, 0, }, +-445603, 329102, -860067, -1518808, -3882651, 483721, -608275, -7189239, -1008244, -819265, +2469069, 5764383, -4874788, 2117419, -3059091, 1299765, -4207458, 2139968, 1373316, -3018288, +-2754148, -4562329, 1896765, -4285841, 639413, 3762391, 2639794, 1153736, 1784559, 277562, +-3806952, 163746, -2378875, 1923072, 1250909, 1466195, 5996311, 1932735, 905164, -128849, +2052458, -59593, 1890323, -471373, 4276177, 1480153, 1901597, 3220152, 7155416, 351114, +-1174674, 2863670, -2155537, -4983236, 2552821, -2284923, -4288525, 1119913, -1305670, 2362769, +-1137093, -1913408, -3275986, 3397856, 1266479, -198642, -3163244, -4417374, -1308891, -1005022, +724239, -550293, -78383, 702764, 1323387, 10341208, 5574868, -671626, 3679176, 858993, +882616, -11425150, -4894652, -5681168, 4491462, -653372, -3637837, 3988951, 4221953, 233539, +4057670, -1706713, -73551, -271120, -2401961, -1318555, -5402532, 2793876, -8017630, 3346317, +-4148939, 3414499, 6497749, 2909304, -1153736, -1840930, 4822175, -786516, 293132, 4478041, +-4742181, -155156, -1554241, -2785286, 666257, -682900, 1073742, 4603668, 7672959, -2413772, +216359, 6311455, 559956, 1668058, -2241436, -3520263, -437550, 1080184, -5875516, -1537061, +3196530, 439697, 1206886, 1893544, -774168, -1806571, -1682554, -2019172, 2379949, 1974611, +-1029182, -3305514, -4138201, 2214593, 81604, -3298535, 3694746, -541166, -271120, 972810, +933082, -900333, -3777961, -983548, -13422, -3494493, -3621731, -2102923, 8546448, -5988258, +-2523293, -4167192, -7713762, 2911451, 1271847, 346282, 6541235, 6283001, 6203544, 2067490, +-1213865, 1017907, 4664335, -1962263, 1984275, 2433636, -5604933, 7968238, 1485522, 2518998, +5800354, -2190433, -5890548, 456877, 3911105, -2729452, -1324461, -3658239, 3888019, -30065, +-463856, -6401649, -345208, -708670, 3920232, 2119566, -3623342, 7172596, 2539400, 1567126, +2401424, -1057636, 3886946, -1443646, 104690, -4833449, -6005975, 4854387, 3600793, 6688338, +522912, 1908039, -5209796, -7714835, -4003983, -2196876, -2451890, -3454764, -3311957, 1820529, +-1120450, 2610803, -3198677, -869194, 1000191, 1787780, -1254131, 4429185, 809601, -7387881, +-6904160, 4044249, 906238, 5658620, -8762270, -1235877, -3497714, 933619, 10387378, 5934034, +-9133785, 3433290, 832150, -3811784, -4260608, -5182415, -8425115, 277025, 960462, -3134789, +1440425, -1821066, 266825, 2496450, 1895154, 5369246, -4792647, 8470749, -5258651, 4898947, +3845070, -3234110, 2211908, 362388, 3447785, -1469953, 1751810, 3187403, 979789, 443455, +-1413581, 2463701, 636729, -1199370, 5921150, -7988639, 399969, -4872641, 9373766, 3284039, +-8493835, 3147674, 10707890, -10334765, -5094368, 1137093, -1074279, -3986804, 2988224, -1469953, +6963216, -6220724, -943282, -2143189, -810138, -504122, 6557878, -6653978, -2710661, -869731, +-7407745, 3433290, 1894081, 7009387, 1601486, 5668283, 3165391, -4946729, 531502, -3039226, +3274376, 1378685, -5211406, 15005005, -9493488, 3167539, 15992311, -11124502, 5242008, -74088, +5224291, -1154809, -9706089, -1869921, 8018167, 7448010, 2011118, 216896, 4097399, 2289755, +206158, 3674882, 3449396, -2449742, 4391604, -839666, 6885907, -5085242, -8287677, 2187212, +-7198902, 2946348, 310848, -1674500, -2158758, -2908767, -4786204, 1440425, 2004139, 668404, +1537598, 1969243, -2793876, -5920076, 5394479, 1696512, 1180579, 268972, 7838852, 2113124, +3537443, 8521752, -4391067, 2579665, 807454, 3079492, 6057515, 5060545, -6602976, -5530844, +-974958, -2790118, -108448, 1111323, -2292439, 2547453, -4840428, 1237488, -4478577, 3754338, +3987340, -2122251, 5488968, -2804614, 5054103, -1597191, 2937221, -3226057, 1123671, -2384244, +2248416, -1548873, -8396661, 6248104, 5364414, 10813654, -6733435, 3979824, -8527121, -2374580, +6621766, 5453535, -5703717, 1139240, -6739341, -179315, -8047158, 2195802, -5786932, -9069897, +-6516003, 3010772, -5071283, -468688, -6098854, 192200, 2018635, -1788317, -4176856, 2527052, +5552319, 1986422, 3143379, -6244346, 4054449, -6511708, -767189, 2844879, 1203128, -1515587, +-450972, -935229, 4814659, -4988068, -7082401, -2455111, 3732864, -2455648, -4884989, -6897718, +-7500624, 1378148, -1216013, -8931921, 7235410, -5989869, -3732327, 9185861, -2080912, -2702071, +2415382, -2552284, -1498944, 33823, -3508452, -3478924, -2290828, -4392141, 1838783, 1303523, +7954817, -11344082, 2266669, 9336722, -3315715, 10241886, 3199214, 319975, -2827699, -7746511, +-4632659, 12214887, -6550362, -447213, -2138357, 580357, 7764227, 6390375, -3953518, 9402220, +9978820, -5077188, -2276333, 5517959, -4922570, -4902169, -200790, -7290170, -50466, -2517925, +964757, 11270531, 4101694, 89657, -5350456, -16261820, -1869385, 8233989, 2193118, -6488622, +4524748, 6541772, 6259915, 6924561, -12422656, 1833414, 568009, -6854231, 3285650, -6266358, +3877819, -3882651, 4809827, 10212358, 14440217, 8352638, 4100620, -6898255, -1795833, -8112120, +-7713762, -2558727, 8370355, 1069447, -27917, 902480, -8507256, 967441, 889595, -1404454, +-4336843, 751082, 4537633, -6624450, -8929774, 18355616, 3469797, -6244883, -1061394, -4031901, +-783832, 2131378, -3040300, 15830176, -1044751, 4096325, 12309376, 1032403, -1165010, -8174397, +4907000, -4636417, -4582730, -15999827, -6327561, 2643016, -205085, -3474092, -10573136, 3447785, +6813429, -9277129, -3962107, -2820183, -8575976, 3234647, 1320703, -5319854, -3339337, -2110977, +-11795054, -4867272, 6874095, 9958419, -7158100, -10223096, -2144799, -970663, -7261716, -6942815, +3220689, 3990562, -8009041, 17133162, 825707, 6757594, -3234647, 6337761, -3773129, 1675037, +-11660299, -2946348, 5842230, -12743705, 4189204, -3114925, -5546414, -14404247, 475668, 7549479, +904628, -15149423, -1461363, 2456185, 6764037, 10684805, -3264175, 4669703, 13457743, 4052302, +2160906, -6031745, -767189, 5134097, -1885491, -4529580, 5578089, 1372242, -9407589, -13916768, +-11974369, -14417668, 12342125, -7388418, -2253784, 4488778, -14308147, -5471789, -10069551, -4007205, +-3475166, 6621766, -12593918, -6212670, 3507915, 5142687, 6658273, 190589, -156766, -1884417, +-421981, -2578591, 1345935, -9400073, -5619965, -8237211, 5499706, 3213173, 4161287, 6208912, +-12204150, -583579, -1701881, 10974715, -4466766, 3625489, 5390721, -1952600, 5794985, -3859028, +6504191, 10001368, -4296041, -460635, 7902740, -6970195, 11099806, -4779762, -18964428, 3040300, +9021042, -3496640, 543850, -186831, 6746857, 9294846, -9940702, -3991098, 1517734, 6359773, +-11684459, -8349954, -7454990, 13186623, -1224066, -15464030, -4395362, -6790880, -8757438, -3270618, +5674726, 2366527, 8213588, 3074123, 3906273, -16359530, -6701223, 6631967, -4582730, -2946885, +-5741835, 1864553, 8381092, 2428267, 1810866, -10917270, -3997541, -1860795, 3852586, 9891310, +-12081743, 5730023, -9904195, -2405719, -9139690, 1292785, 944893, -296890, 3411815, -8120710, +-2682744, -7599945, -3495567, 296353, -672162, -9580998, 5260261, 6413460, -2659659, 7584376, +14252312, 1666447, 10705206, 14353781, 759136, 643708, 3054796, -2785823, 4325569, 1168768, +-3485903, -4556424, 17416630, -1612223, 10007274, 4864588, -5657546, -5804649, -4656819, 5298379, +-4488241, 6829535, 15259482, 8362838, -2512556, 727997, -13583371, -8511015, -8453033, 12995497, +18949396, -7742216, -534723, -7007239, -2135136, 10761577, 31446676, 13088913, -3799972, -1516124, +-5352603, 13853954, -13918378, -8591545, -21499532, -709207, 11195906, 12970801, 2811056, -5805185, +-12743168, -10085657, 10057203, -2451353, 15744276, -538482, -4563940, 6750615, 3009162, -643708, +-3459596, 9511205, -1508070, 8135742, 213675, -5265093, 19253802, -5073430, 8010114, 18023294, +6871411, -1359894, -8753680, -2300492, -14471355, -17938468, 4094178, 10484015, -2350421, 921271, +-18613314, -7847979, 11263015, 5266167, -4608500, 2928631, -5324149, -3442416, -8346732, -15247134, +1151051, -4197794, -9973451, -17545478, -14175003, -5545877, -13006772, 5213554, -5690832, 1166621, +1956358, -1093606, 554051, -3200825, -2736431, 7464117, 17307108, -12693776, 2343979, -6057515, +6427419, -7341173, -13131326, -14126147, 3389803, 5872831, 16974784, -14357002, 4293357, 4802311, +-24833500, -846109, -243739, -20139102, -11552388, -6958384, 4762582, -1383516, 772557, -5524939, +8122857, 13751948, 6635188, -1713155, -21239150, -8829916, -11799886, 4391604, 721018, -8922258, +-1276142, 7296076, -6626061, 12477954, -11731703, -202400, -7118909, -20605106, 2871723, -8720931, +-10635950, 7798587, 10726144, -12772696, 4221416, 15204721, -5728413, 6674916, 4384625, -3534758, +1215476, -16822314, 24577414, 10006200, 5102421, 24283208, -30652108, -2282238, -5127654, 3070365, +11040213, 12481712, 3703873, 5877126, 14361297, -1632088, -11830487, -18534932, 5771899, -7147363, +-737661, 4733054, -5193153, 7237557, 18292802, -12601971, 7517267, -6309307, -7764764, 3360275, +16244640, 18402862, 5011153, 11233487, -7184407, 5127117, 5633387, -31039728, 9033927, 9657234, +2442763, -10089415, 117575, -19261318, 22666154, 13159780, -6665789, -7790534, -10745471, -6070400, +16502338, -16615618, -9011915, -2713346, -2374580, -3778498, 2707977, -11072963, -10690174, -6746857, +-8153459, -2532957, -10714870, -1750199, -7077033, -24509768, -15156940, -6202470, -3513820, 3201361, +4398047, -318901, 1044751, 6866042, 3709241, 3440269, 17413408, 3419331, 6076305, 10525354, +23248658, 19500226, 1293322, -7898445, -14842870, 13599477, -3180423, 36960340, 7636452, 16505022, +-1721208, 1995012, -14715095, -715112, 12782360, 7290707, 9528385, -11311333, -7793218, -14535243, +-27913530, 15375446, -25289842, -3349538, 29072096, 4118337, -22535694, 7082938, 7699803, -14106820, +-11938398, 855235, 8524973, 22098680, -1633698, -15891379, -17224430, -210990, -9965935, 3483219, +2534568, -17773648, -16434692, -29465086, -9407052, -8022999, -21029770, -13175886, -612033, -8789651, +-6471442, -4625143, -2142115, -19503446, -11353746, -11659226, -6633040, 7105487, -17719962, 2159295, +13942538, 18012020, -4452271, 5602785, 9363566, -15990163, 9145059, -6357089, 14635101, -6278706, +948651, -6808060, -2137820, 30996242, -6574521, 12391518, -22288196, -2432025, -450972, -19498078, +18918258, 2043868, -7544110, 15273441, -6156836, 5039071, 26978838, -9325448, -15533823, 12048994, +-3391951, -28988344, 11984569, -38818452, -22537304, 18786186, 12192338, 5479305, 8055748, 3779571, +-660351, -24014772, -13033615, -5106716, -5273683, 41637560, 22516366, 212601, -21529060, 11142756, +-22441740, -17934172, 3109020, 18581640, 36220532, -5566815, 18225156, -6426345, 12888123, 22211960, +12167642, 14242112, 7394860, -4002373, -18221936, -18566070, -5813775, -17550846, -5348308, -3148211, +-4122095, 14197551, -2545305, -36208720, 1997160, 8797704, 8256538, 21725018, -2352568, -43281996, +24515136, -19390704, 6248641, -4284767, 14489609, 21134998, -23663122, -1763621, -11836393, -20729122, +14875082, -10427644, -25346750, 9705552, 14828375, 24065776, 6506339, -4164508, 2753074, 19505594, +-15923054, 30955976, -9722195, -9418863, -2596845, 18411988, -19650550, 896038, 2843805, -56716652, +-7705708, 15770046, -7286412, 1068373, 8698919, 1640678, -1293322, 1112397, 21388400, 16207596, +-6067178, -1649268, 23895588, 15787763, -43983688, -25033216, 30500710, 35201552, -18548354, -6195491, +-49353468, -27228482, 7570954, -1950452, 7078106, -26060250, -16033113, -17687212, 27409408, 40343700, +-1297080, 11305428, -5786395, -2884608, 259309, 9827959, 18103824, 4944581, -5254893, -2494839, +-3090766, -22927610, -12468290, -23248658, -2108829, 8523899, -8989367, 16062104, -9791452, -2929705, +24537686, -9928891, 14476187, 10461467, -2704756, -20812338, -14512694, -11680700, 5786395, 43500504, +9233643, 24339580, 28474022, 22750978, 17495550, 15932718, -20700668, 2950106, -1255741, 33512020, +17406428, 20929376, 35227860, -12694850, -18450106, 11455752, 30884572, -42324220, 3193845, 8147016, +26096222, -32197222, -50982336, -3731790, 22392886, 12239583, 15524159, 24599962, -5709086, -4151623, +11483669, -18018998, 14460618, -3159485, -8803072, -22660248, 10111964, -12372727, -17046726, 11507828, +29740502, 5699959, -7743826, 13480292, 29913910, 7430294, 8309688, -748398, -325881, 10130217, +-20037634, -1365263, -29998736, 14755897, -23669028, -4987531, 16989280, 5061082, -12286291, 357019, +-14637785, 32908040, 7461432, 8702677, 21497386, 36515276, -13421773, 9820980, -15988016, 3771518, +17114370, 28609850, 10435697, -9634149, 35489316, 1125281, 724776, -22071836, 4277788, 16907676, +-3826279, 15990700, -21002926, 33411624, 41678900, -50243600, 1974074, -7054484, 13344463, -12280922, +-2811593, 15222438, -13507135, -54526756, 3942780, 38307888, -31277026, 11065446, -4586488, -11754252, +-17653926, 39577588, 439697, -3789235, 9495636, -47160352, 31740882, 3342558, -23501524, 2079301, +-48242148, -11462194, 2998961, -9750650, -38282116, -4579509, -24896314, -6578816, 24048058, 5220533, +31363462, 12557948, 12304544, 7055021, -9702868, 24503326, -11681774, -314606, 12472585, 5323075, +-14188961, 12229383, 5938329, 29181618, 12972949, -5142687, 18646600, -13871134, 24866786, 8344048, +-24987046, -26668526, 15104863, 17752174, 8523899, 3176665, -11370926, -16817482, 6649683, -16476031, +-24122684, -7327751, -2789581, -22913114, -7132867, 9480067, -14394046, -25741350, 9271224, 10705206, +2819109, -2264522, 454730, -3391414, 11642046, 46409804, 11459510, -49929, 685584, -14336601, +-23198728, -9583146, 39920112, 42055248, 23420456, 6266358, 39437464, 20358682, -4737349, -46825880, +-34610992, -26671746, -54487028, -18801220, -4173635, 11114838, 20989506, -8956081, 27049704, -30818538, +25026774, -3120294, 33391224, -21473226, 19362786, -31667330, 27834610, -25536802, -10658498, 38696044, +9084930, 31155156, 44432512, 4800700, -3328600, -18146236, -1219234, 28414430, 7348152, -9556302, +-30791694, 3097745, 6462315, 15182709, 9318468, 12774306, 7995082, -17540646, -28551332, -11619497, +28417114, 11454678, 89802936, -27609124, -23438710, 30000346, 46350212, 10553272, -297963, 13072807, +3543885, 15816754, -12960601, 6489696, 22000970, 24962886, 16394427, 70727912, -8215736, -7497939, +-3896072, 37360308, 22030498, -16463147, 19403052, 1406065, 6786585, -13021804, 32450626, -29650844, +2899640, 51128364, -35389992, 107395120, -47647292, 52570936, 46679852, -43224552, -41303088, 48406964, +214748, -6401649, 15406585, 25325812, -56374132, -20627118, 30735322, -67406824, -45587320, -26863946, +46312096, 106180720, 26261578, -79249664, -20893942, -81029392, -46005004, 70129296, 37999188, 66051764, +32489816, -46073724, -79274360, -56203944, -16707960, 36759016, 36556616, 25818122, 10465762, -18096844, +-86604792, -98599568, -24707874, 79257712, 134582800, 95370288, -20601348, -62435940, -95699384, -66620848, +-58736900, 2108292, 18945638, 77162312, 76854680, -41406704, -30623116, -98852968, -97304632, -31746788, +5587753, 99310920, 139974064, 65721588, -46362560, -148769072, -115755808, -80074832, 35328252, 87601760, +49107584, 35632660, 24166708, -88227752, -21397528, -49703508, 13907641, -5697811, 47798692, 84873384, +60666412, -77268608, -163727904, -118200184, 6646999, 91106992, -9023189, -18546206, 36869072, 11468100, +-29811904, -28164248, 126702, -45367204, -5565204, 6737193, 5241471, -3920768, 1190243, -15222975, +-1841467, -1746441, 7894687, -5206037, 20983600, -5480915, -3952444, -5755256, -6490233, 13137768, +3810710, -6173479, 20338818, 1415192, -35923644, -17829482, 10006737, 17793512, -5908802, 2340220, +24766392, -392453, 3459596, -19944218, -8924405, 6483790, -4295504, -4187056, -2587718, 16658031, +6002217, -6023692, -19226422, -7283191, -1044751, -17161078, 1773285, -19613506, -13380434, -8799851, +-17797808, 28664074, -4969814, -11979738, 11940546, 598074, -27473296, -717796, 27613418, 23338852, +-12692165, 18442590, 3029026, 17818208, -18239116, -25617332, 10669773, 13737453, 11002632, 11162083, +-9331353, 12267500, -18025440, 15222975, 13787382, -22089554, 44259636, 67796056, -9012452, -25017648, +-21711596, 62460636, 28014998, 60424820, 32353452, 56371, -28331214, -6320581, 15123117, 28304372, +13254269, -13253195, -3598646, 13433047, 19596862, 2320356, 4061429, -14163192, 2091649, -6957310, +8615168, 9984725, 25912612, 22519588, -12671227, 1693828, -14192719, 3228742, 11415486, 17687212, +639950, -8942122, -772557, -15890842, 12146704, -3995393, 4497905, 11625940, -639950, 15605227, +-8870181, -4926328, -4776004, -17095044, -10990821, -25820806, -5922760, -29398514, 746787, -10555956, +22381074, 2824478, 5577552, -22996866, 7902203, -631897, -11526082, 15466714, -10567230, -5499169, +2117956, 9791452, -3447248, -7013145, 34257196, 10708964, 5645735, 12385075, -13457206, -26069914, +-54200876, -8253854, 73179800, 110934176, 94459752, 73223288, -4501663, 7681549, -54067732, -62911608, +-100407208, -59183576, -63180044, -21227876, 8187819, 42566348, 31361852, 94142464, 83210696, 26023744, +5766531, -16346109, -32590212, -52922588, -19020800, -54284628, -14340896, -27353036, -16983912, -14111652, +2235531, -1018444, 17188996, 23805394, 38463580, 40415104, 50138376, 41859288, -6365142, 1970853, +-1762010, 5847598, -26663156, 7657927, -28591598, -70239360, -34949224, -53398792, -86973624, -27907624, +-9662066, -37609416, 9090835, 22734872, 56418692, 66290136, 99907384, 61277908, 49377628, 48590040, +28564216, -14806900, 430034, -57105348, -50594176, -81016504, -96411280, -109865800, -83515640, -65424700, +-16093242, -11559368, -4680978, 19373524, 33392296, 77469400, 49866716, 24200530, -2239289, 0, +0, 0, 0, }, { -266825, --848256, -2347200, 1889786, 4907000, -1739999, 3080029, 3562139, 873489, 1805497, 4203699, -4820564, -1772748, 1234266, -3221226, -3966402, 4744328, -9451076, 529892, -6005975, -4046933, --2385318, -933619, 11103027, -158914, 2776160, 2876554, 420907, -907312, -488016, -839666, -1137093, 2854006, 2432025, -752693, 103079, -830002, -3867618, 1779190, 1083406, -1492501, --5880884, -5230734, -176094, 334471, 709207, 3226594, 3525631, -4456566, -3146601, -3311957, -2951716, 4565014, 2816962, 6103686, -190052, -630286, -1303523, 4073777, -2573759, 559420, -408022, -3329137, -4973572, -1956895, 5257040, 117038, 7946763, 250182, -931471, 187368, -5209259, -796180, -425739, 2817499, 2080912, 7327214, 2882997, -3787088, -561567, 2501819, --388158, 2665027, -6706055, -4909148, -1118302, -5785321, 2454037, -1354525, -568009, -3938485, --1659468, 3496640, 3636764, -1491427, -1035624, -2467459, -5420786, 6010807, 3679713, 63351, -689342, -430570, 222265, 4817880, -2449742, 803159, -7824357, -6547141, -1578937, 481573, --5448166, -1122597, 1975148, 364535, 121333, -2859375, -2098629, 5031554, -2369211, -2306398, --716723, -841277, 2265595, -1306744, -3376381, -239444, 2937758, -4331475, 156229, -4633196, -280247, -3429532, 4955856, -416075, -5337571, -901406, -592169, 492848, -7631083, -1048509, -503048, -5172751, 2165201, -26844, -5990943, 2514167, 3332358, -3196530, -3852586, -6400038, -2956548, 2305324, -105764, -5415954, 2425046, -6763500, -1952063, -875636, -3496640, 3380139, -7613904, -3033321, -1048509, 463320, -3186329, 2309082, -492848, -2454574, -4378719, -2196876, -6899328, 6797860, 3751117, 7883413, 4569845, 2614561, 7310035, -4369593, 1632625, 3286187, --107911, 1435056, -2121714, 1585380, -10034654, 413391, -525597, 3850975, -2214056, -1063541, --624381, 3020436, -3104188, -274341, 1008780, 2218351, 2024540, -271657, -3301756, 927176, -1334661, 2763275, 2014877, 3180423, -3055869, -1590212, -409096, -5375152, -478889, 1872606, -5127117, 5856725, -514859, 3415036, 2511482, 1074, 2321967, 2856690, 3857954, -974421, -297963, -2196876, 839666, -1829656, 1991791, -2967286, -2759517, 2160369, 402653, -6684043, --6768332, 2659122, -1015760, 5648419, 5196911, 673236, -130460, 10700911, -3102040, -34897, -8533026, 573915, -5369783, -7251516, 5126044, -1982664, -256087, -4423817, 1136556, -3109556, -3374234, 16552267, -6283001, -4631586, -6215892, -6214818, 848793, -5042829, -13222594, -164819, -961536, 185220, -5465883, -931471, 3846143, -5127654, -3457986, 7783555, 2161442, -1822677, --2188286, 5043366, -2815351, 3635690, 2843805, -6884296, -5018670, -4045322, 4174171, -3462818, --2509872, -1857573, -2736968, -310848, -5129802, 80531, -1851668, 1190243, -1090922, -10220412, -4295504, -5730560, 4054449, 809601, -8873402, 1647120, 5146445, 1640141, 8884677, -4090420, -54224, 909459, 1783485, 3090766, -3891777, 942745, 2807835, -4038880, 1764158, 2519535, --2606508, 1392106, -1407676, -9050570, 2654827, 9175124, 7113003, 8639327, 1233729, -1399623, --7303055, -3325379, -3529390, -2266669, 7158100, 10620380, 563714, -251792, 7110319, -11334956, -84289, -474594, -347892, -3350075, -4090420, 4809290, 5193153, 702764, -1278290, 2669322, --5821292, -3772592, 4318590, -4197257, 9096204, 8907225, 1341104, 5741298, 4285304, 1529545, --3762928, 1979443, -201327, -5761162, 6295885, 177167, 2975876, 5869610, -6008123, -1557463, --7126962, -794569, 1763621, 7647726, -6806987, -1835562, 5248450, -90194, -4232154, 8465917, --5929203, -11884711, 2496987, -6120329, -2903935, 4848481, -2701535, 2084670, 1308354, -1501091, -6199786, -3046206, 3128347, -1690070, 479426, -12029667, 2826089, 10812043, 1224603, 1478543, -3708168, 10132365, 1777580, -10214506, 11441793, 4645544, 4377646, 6534256, 6238977, -149787, --1672890, 6175626, 5274757, 1492501, -4153770, 5373004, 3037616, 8043937, 9998684, 3503620, --1899986, 102005, 398358, 3880503, 12607340, 7119445, -6237903, 11667279, 974958, -1498944, -2069101, -8691940, 10149545, -1300301, 717796, -1149441, 3010772, -1280437, 5539434, -6940131, -10413685, 8442295, 289373, -1479079, -4844723, -10301479, -2936147, 4269198, -1769527, -3739843, -6197101, 6679748, -3695819, -3678103, -12636331, -4363150, -908386, -339839, -14170171, 7968238, -1646046, -8483634, -6458557, 2940979, -2543158, 1505386, -1142998, 1341104, -2357937, 1533840, -5874442, -7321309, 310848, -285615, 628139, 10888279, 6557342, -448824, 14395120, 6127308, -13037910, 2674154, 4671314, 13160854, -4942971, -9338333, -5289252, 12290049, 3498788, -7454990, -10044855, -2964601, -5203353, 8281771, 20855824, -5594732, 1458141, 2945811, 4344360, -5629092, -1118302, 10937134, 1657321, 13524315, -2555506, 14549202, 10971494, 3257733, 9279277, 5282273, --4811437, 3400004, -875100, -1612760, 1909650, 722091, -463320, 3635153, 3220689, 9316858, -6982006, -8300561, 3323231, 3338263, -5391795, 79457, -13433047, -18378702, 7797513, -4911832, --11274289, -2815351, -5803575, 7517267, 2286533, -3968013, -8353175, 6688338, -5883032, 3933653, --6682969, 687195, -2384781, 10515691, 2468533, -4888210, 4134443, -7803956, 950798, 445066, -1993939, -4698158, 5363341, 6172942, -749472, -3875671, -14004815, -11768747, -9263708, 4442070, -1161252, 2389076, -11481521, 7408282, 5031554, 9181566, -9842991, 9469866, 7074348, -5416491, --4711579, -2631204, 9400073, 6731288, -4194036, 1156420, 14260365, 7471633, 3664144, 8518531, -5673115, 2471217, -4743792, 1323387, 653909, -1753420, -5250598, 12965433, 5939940, -11537356, -8006893, 8233453, 7939247, 6499896, 1708860, -7056632, 271657, -661425, 11128260, 1803886, -5017059, 10399190, -1723356, -10615549, 2528662, 6284611, 11285563, -14521284, -8297340, 4495220, -280247, 1802813, -8700530, -1735704, -8427800, -721018, 4209605, -2324651, -4563403, -5178657, -2481954, -884226, -2955474, 5305895, 674847, -9218074, 9416716, 6092948, -2809446, 3792993, -5691369, -6195491, -2088428, 24169392, -751082, 9477919, 6622840, -20026896, -10635950, -1036161, --776315, -130460, 11506754, 2677375, -5465346, 11927124, 7362111, -1349694, -1817308, 3904125, --1785633, -4029753, -8813273, -10474351, 6046240, -2172717, -4821101, -355409, -16349867, -2907156, -1314797, 9311489, -10694469, -2980707, 1680943, 923955, 2674154, 1009317, 11987254, -13404593, --4187593, 3229279, -70330, -7821673, -1289027, 10799158, 9548786, 8084739, -1685775, -13338021, --5649493, 5112085, -954020, 9303973, 123480, 22549, -6021544, -3995930, 8775692, -9538585, -7609609, 5362267, -5881421, -3336653, -261993, 1241782, -5783711, 3770981, -17704392, -1662689, -3056406, 11752641, 2098629, -1010928, 8002061, -5876052, 16691854, -16562468, -937377, -3919695, -3309809, -1249836, -684510, 3675955, -2383707, -5909338, -2995203, -3663070, -8979703, -1948841, -7539278, -1987496, -3591130, 9803800, 551903, 11883638, -11281805, -7260642, 15934866, -1918240, --168041, 542777, -8791798, -1462973, -11150272, 3156264, -13523778, -693637, 11484206, -3802120, -8110509, 9235790, 6421513, 7212861, -8801462, 9361418, 1990717, -25560424, -3304441, 3390877, --1093606, -3092913, -9833328, 8265128, -8201240, -2093260, -9403831, -10104447, -14100915, 13282186, -1247151, 15518791, -6674379, 11611444, 17057462, -10711112, 14199699, -16202227, -11765526, -14753213, --3474092, -10598906, 4901632, 4131759, 1307818, 12462384, 19557670, 3412889, -5888400, -10329933, -6207302, 19044958, -369367, 5832029, 408559, 7911330, 4546760, 6190122, 9536975, -11647951, --1522566, -4006131, 15344844, 12315819, -1141388, 18820546, 9113384, 2149631, -17788680, -8031589, --13700409, -5565741, 762357, 5457293, -5282810, 1207423, 18047452, -2977486, -557809, 1464584, -18559628, -11181410, -5282810, -4249334, -2449742, -10929081, 12610561, 1399086, 8273718, -13210783, -1308354, -974421, -8732205, -2726767, -15699179, 5282273, -251256, 3726958, -2386928, -373662, --18096308, -5420786, 6383395, 11752641, -3702799, 3520263, 22958748, -894964, 983011, 4957466, -10235981, -9191230, 2066953, 12642236, -7089918, 9524090, 2688113, 10077604, -11375758, -4615479, -3041911, 5046587, -10887742, -16687022, 4671851, -1814087, -16754131, 4584878, 1756642, 15221901, -13547401, -12508019, -14911053, 3352759, -11354820, -6030671, 578210, 22706418, 440234, -2882997, --20166482, -10156524, -1612223, -15126875, -22845468, 15795279, -5759551, -7245610, -1134945, 17135846, --5150740, 1896228, -3208341, -3409667, -9701794, -5274757, 1934346, -23995982, -15167140, -4408247, --8458401, -8101919, -2471754, -9391483, 8535174, 3779034, 3017215, -5710696, 4566087, -34645352, -32723356, 18967650, -2753074, -4363687, 18708340, 1129040, -10235444, -15425375, -1283658, -5396090, --5677410, -9277666, -8651675, 11881490, 12029130, -5017596, 25414932, -13547937, -9859634, -10075456, -1531156, 7854422, -26724898, 8243653, -6794639, 14528264, -13179107, 6120329, 3268470, 16307991, -1560147, 38288560, 12731894, -1011465, 1832340, -15142981, -19134616, 23794656, -6965900, 2457258, -32079648, -8602819, -1400696, -7128572, 25033216, 4476430, -10167798, 14370961, -5226975, 21489868, -11573863, 5077188, 3339874, -2798708, -8259759, -3124052, -2174864, -23826332, -5793374, -4210142, -13032005, -7710540, 2519535, 3823595, -16698296, -25491168, -823560, 21041044, -1377074, 18606872, --3259343, -27369680, -10316511, 605590, 6123013, 4201552, -21739514, -492848, -6192806, 15111306, --16127602, 19254338, 29618632, 18393734, -5990406, 2747169, 11959336, -5130876, 23195508, 25900800, -23656680, 6759742, 25922276, -1904818, -10486700, 2283312, -13639742, -18234284, 9200357, -8489003, -20932060, 9823664, 5113696, -8282845, -27255326, -8667244, -19506130, 11455752, 14190035, -140660, -6924561, 4776541, 6857989, 5822365, 2595771, -1441498, 3340411, -3964255, 7376070, -13091060, --36857260, -14643154, 20180978, 1313723, -6019934, -12176769, -77846, 17154100, 21682606, 4803921, --13314399, -2153926, 17346300, -20790326, 2001455, -2397129, 15522012, 17949742, -14209362, 27127014, -5209259, 1330903, 37962680, 462246, -11923903, 13586592, -6360310, 2202245, -8138426, 3142306, -25194816, 3248069, 32092532, 13919989, -28133110, -30350386, -6801081, 8374650, 17056388, -23420994, --8565775, -3031710, 28762322, 26925150, -22913650, -450972, -14120779, 9172440, -5119064, 30710626, --32212, -6285685, 19346144, -3741990, -24225226, -11701638, -4808753, 24320790, -23050016, 12352326, -35602596, 14506252, 16258062, -16554415, 12008192, 21009906, 15062987, -27146878, -14921253, 19420768, -53271016, 4738960, 10550587, -14396730, 3630321, 687195, -3853660, -13387950, 3214246, -3715684, -24912958, 22317724, -28661390, -10562935, 27670326, 16292958, 9128416, 4704063, 14367202, 19894288, -4534412, 12597139, 8773008, -11489038, 668941, -11178726, -7088307, 5373541, -3833258, 4052302, --12468827, -8124468, 6450504, -114354, 9379135, 10431402, -26648662, 20973400, 2429341, 17347372, --18461380, 11987254, 13973139, -9658845, -20947630, -17323214, -23084912, -19217832, -19431506, 8962523, -30409980, 11112691, 8215736, 17923436, -664646, 2629594, -14309220, 24493662, -29133300, -51233592, -16520592, -8934069, -20401, -42423540, 8689793, 18968186, -721555, 14212584, 3649112, 104153, --6353331, 12906377, 9430674, 12348568, -17546016, -9186935, -2343442, 11336566, -23412404, 39272644, -18822694, -3134253, 21603148, 12954695, 20616380, -10597295, -13485660, -13180718, 24962350, 8963060, -4740570, 22501334, -19208168, -62892816, -3892314, 4514011, 7846369, -35213364, 27900108, 20409684, --37803228, -28963112, 1326608, 16197932, 1737314, 9453223, 20654498, -4796405, 12999792, -17811766, --20660940, -16144245, -21464100, -33390150, 9999758, 4367445, -22424024, 31173946, 12283070, -6398965, --6680285, -16773458, -12829604, -29931090, -16341814, 12390444, 28208808, -9067213, 3373160, 12978317, --23881092, 19479824, 24576876, 5548561, -5478231, 22748294, 6278169, 4933307, -13972602, -14074071, --549219, 34301220, -8696235, -23524072, 165356, -29366838, -36941012, -21114596, -5521181, -13657996, --24065238, -12350715, -13008919, 15737834, 30451854, 11491722, -14146549, -29339996, 31492310, 17252346, --15476378, -8026220, -8359080, 2001455, 7240241, -9524090, 16232829, 15562814, 612033, -10022306, --10017474, -8898098, -1463510, 6261526, -4934918, -9837086, -24528558, 7809861, 20906290, -11834782, -18407692, 984621, 12185896, -10105521, 13555991, 41192496, -15787226, 18287434, 34784404, 6703370, --6835978, -9207873, 9545028, 1431298, 17261474, -13083007, 47656420, -14226005, -33567852, 8357470, --15945603, 39366060, 11358578, -10954851, 815507, -22000970, -33364380, 40299680, 2652679, -9044127, -36446556, -18322868, 2591476, -9419937, 19455128, -26366268, -35443144, -20356534, 2797634, 16670379, -20032802, 14522895, 19369228, 47296716, -17997524, 18949396, 29767344, -4385699, 916976, 35718560, -3964792, -19409494, -22529250, -19890530, 36767604, -24437290, 14726906, 17343614, -11522860, 3716221, --19847044, -4351876, 16662862, -14347338, 12162274, -4621922, -24888798, -55206972, -4516158, 50240380, -21403970, 5466420, -9328132, -14629732, -2119566, -19279572, 7046968, -27312770, 33968360, 2960306, -4787815, 3269544, -10396505, -32904282, -11933030, 27521614, -21033528, -4953708, -14216342, 12738873, --9853192, 37984692, -4912369, 8502425, -12421582, -33856692, 8900783, -25586194, -4712653, -1335198, --47319804, -39980776, -37398964, 14004278, -5695127, -19813758, -12131135, -12170864, -10786273, -17397838, --10964515, -1808718, -41914048, 13763223, 6732361, 17814988, -7755101, 39884140, -1970853, 9648644, --11135240, -1921998, 22451942, -29170882, -6785512, -9058623, 15607374, 8588861, 18762564, -7444789, --37512780, 10387915, 998580, 62495532, 64986076, 7223598, 1047435, 14616847, 8016557, 15649787, -28223304, 9784472, 29265908, 43109660, -10568841, 5140539, -35616016, -5682242, 4959077, -5230734, --10458245, -22354232, -18118320, 9567040, 10235981, -48275968, 34164856, 8645232, 48125644, -3468186, --9470940, 15187541, -3330210, 50075024, 12829604, -3070902, 9625559, 9553618, -13725105, -31309774, --24435680, -12530030, 37479496, 157840, 41154376, 4802847, 40153112, -11949673, -56337624, -21072184, --16802986, 28792924, 2828773, -27157078, -40102648, -27389544, -6386617, 34124588, -30576946, -25407952, --18129056, 30770756, -16260209, -8153459, -40629316, -38003480, 10615012, 7857106, 50629612, 15314780, --7201050, 2029909, 1872606, 37700688, 15772194, -19594178, 37560564, -3022583, -70213592, -22457848, -46395848, 49450104, -33840048, -35830228, -34394636, 19529216, 32203664, 60875792, 20164872, 7573638, --33266132, -3813394, -391916, 13596793, 32516660, 22164716, 3725884, -37108516, -70023000, -19044958, --34354368, 54322748, 59558312, 100364792, -27739046, -96022584, -18643380, -32701344, 77300288, 25952340, -78459928, 20147692, -22746684, -72698224, -46891380, 3473555, 11974906, 83199960, 36372468, -1819456, --64658048, -116964848, -27704686, 3842385, 57890252, 125777040, 30533460, 39127152, -76527192, -120902792, -9021579, 30238718, 101604968, 59762324, 45086420, -20090246, -74926776, -61756260, 3670050, 21627308, -2703145, 53289808, -36320928, -33377264, -5237713, -81202800, 16903918, -38385732, 51882132, 1436667, -5345087, -20291572, -54413476, 33552822, -54757612, 58003532, 5436892, 7632157, 9065602, -30555472, -30394946, 5959804, 20350628, -29154774, 8695698, 3036542, 37066104, -12995497, 7198365, 29218126, --32580548, -14533096, 388695, -24596740, 42004244, -7135015, -20830592, 42887932, 43544524, -9420474, --36477156, -5487895, -32409824, -2609193, 16159278, 56371, -39701604, 7432441, 17806398, -10160819, -20424180, -15784005, 6546067, 27344984, -11909407, 19076634, -44634912, -39741332, 41533944, 27369680, -65285112, 352724, -18934900, 60210608, -34333968, -25822954, 18367428, 22463752, 30871688, -26156350, --15321759, 11956115, -7292318, 35620848, -26554172, -76734960, 20570746, 48212080, 1013075, -33564096, -8509404, 26615912, -5541582, -4725001, -966368, -21809844, -12732431, 80502720, 22468048, 21867290, --68539088, -17929878, -53742924, -46308876, 41028748, 42242612, 85385024, 38483444, -11551315, -17563196, --10140955, 25857314, 18496814, -624381, 41157596, 6810745, -17012366, -21016886, -16383153, 28369332, --609349, 24524264, 11451993, 14071387, 3090766, -8359617, 2077154, -2088965, 2830920, -8831527, --2951180, 6401649, 5833640, 53699440, 43546136, 34418796, -4904853, 7513509, -24652038, -6476811, --16212965, -28562070, -29022168, 5065377, 12175695, 18074832, 23408646, 18112414, -16409459, -37976100, -49041012, -41194640, -19920596, -13675176, 13985487, -2069101, 21181704, 21924734, 18408766, -36599564, --16896402, -1336272, -18828600, -56920664, 26350162, -18839338, -18276160, 11249593, 27908160, -91805, --101211440, -55207508, -68036040, 49380848, 15797963, 146582400, 158503088, 151371824, 180178704, 170931648, -129291400, 75900664, 102373768, 41882372, 15068356, -82077360, -64566244, -178295904, -148969872, -139623488, --75197896, -103356776, -71624488, -5462662, -17286170, -8757975, -4027606, 2536715, 8727910, 7075959, -29717416, 24642374, 30727270, 64755220, 73468640, 70672080, 58719184, 138063328, 46520400, 61188252, -105774304, 109945256, 51662552, 111295488, 139947744, 106662832, 100910792, 95799248, 24975234, 61392264, -122573000, 114757768, 85029080, 98944776, 95597920, 10949482, -8668318, -6726456, -31142808, -49916648, -14867029, -56121264, -85837608, -67704792, -75654776, -131582768, -39023536, -78740176, -79629768, -133531608, --91513944, -115153440, -122459184, -70647384, -130706592, -165349264, -101339752, 6479495, -672162, 0, -0, 0, 0, }, +-848256, -2347200, 1889786, 4907000, -1739999, 3080029, 3562139, 873489, 1805497, 4203699, +4820564, -1772748, 1234266, -3221226, -3966402, 4744328, -9451076, 529892, -6005975, -4046933, +-2385318, -933619, 11103027, -158914, 2776160, 2876554, 420907, -907312, -488016, -839666, +1137093, 2854006, 2432025, -752693, 103079, -830002, -3867618, 1779190, 1083406, -1492501, +-5880884, -5230734, -176094, 334471, 709207, 3226594, 3525631, -4456566, -3146601, -3311957, +2951716, 4565014, 2816962, 6103686, -190052, -630286, -1303523, 4073777, -2573759, 559420, +408022, -3329137, -4973572, -1956895, 5257040, 117038, 7946763, 250182, -931471, 187368, +5209259, -796180, -425739, 2817499, 2080912, 7327214, 2882997, -3787088, -561567, 2501819, +-388158, 2665027, -6706055, -4909148, -1118302, -5785321, 2454037, -1354525, -568009, -3938485, +-1659468, 3496640, 3636764, -1491427, -1035624, -2467459, -5420786, 6010807, 3679713, 63351, +689342, -430570, 222265, 4817880, -2449742, 803159, -7824357, -6547141, -1578937, 481573, +-5448166, -1122597, 1975148, 364535, 121333, -2859375, -2098629, 5031554, -2369211, -2306398, +-716723, -841277, 2265595, -1306744, -3376381, -239444, 2937758, -4331475, 156229, -4633196, +280247, -3429532, 4955856, -416075, -5337571, -901406, -592169, 492848, -7631083, -1048509, +503048, -5172751, 2165201, -26844, -5990943, 2514167, 3332358, -3196530, -3852586, -6400038, +2956548, 2305324, -105764, -5415954, 2425046, -6763500, -1952063, -875636, -3496640, 3380139, +7613904, -3033321, -1048509, 463320, -3186329, 2309082, -492848, -2454574, -4378719, -2196876, +6899328, 6797860, 3751117, 7883413, 4569845, 2614561, 7310035, -4369593, 1632625, 3286187, +-107911, 1435056, -2121714, 1585380, -10034654, 413391, -525597, 3850975, -2214056, -1063541, +-624381, 3020436, -3104188, -274341, 1008780, 2218351, 2024540, -271657, -3301756, 927176, +1334661, 2763275, 2014877, 3180423, -3055869, -1590212, -409096, -5375152, -478889, 1872606, +5127117, 5856725, -514859, 3415036, 2511482, 1074, 2321967, 2856690, 3857954, -974421, +297963, -2196876, 839666, -1829656, 1991791, -2967286, -2759517, 2160369, 402653, -6684043, +-6768332, 2659122, -1015760, 5648419, 5196911, 673236, -130460, 10700911, -3102040, -34897, +8533026, 573915, -5369783, -7251516, 5126044, -1982664, -256087, -4423817, 1136556, -3109556, +3374234, 16552267, -6283001, -4631586, -6215892, -6214818, 848793, -5042829, -13222594, -164819, +961536, 185220, -5465883, -931471, 3846143, -5127654, -3457986, 7783555, 2161442, -1822677, +-2188286, 5043366, -2815351, 3635690, 2843805, -6884296, -5018670, -4045322, 4174171, -3462818, +-2509872, -1857573, -2736968, -310848, -5129802, 80531, -1851668, 1190243, -1090922, -10220412, +4295504, -5730560, 4054449, 809601, -8873402, 1647120, 5146445, 1640141, 8884677, -4090420, +54224, 909459, 1783485, 3090766, -3891777, 942745, 2807835, -4038880, 1764158, 2519535, +-2606508, 1392106, -1407676, -9050570, 2654827, 9175124, 7113003, 8639327, 1233729, -1399623, +-7303055, -3325379, -3529390, -2266669, 7158100, 10620380, 563714, -251792, 7110319, -11334956, +84289, -474594, -347892, -3350075, -4090420, 4809290, 5193153, 702764, -1278290, 2669322, +-5821292, -3772592, 4318590, -4197257, 9096204, 8907225, 1341104, 5741298, 4285304, 1529545, +-3762928, 1979443, -201327, -5761162, 6295885, 177167, 2975876, 5869610, -6008123, -1557463, +-7126962, -794569, 1763621, 7647726, -6806987, -1835562, 5248450, -90194, -4232154, 8465917, +-5929203, -11884711, 2496987, -6120329, -2903935, 4848481, -2701535, 2084670, 1308354, -1501091, +6199786, -3046206, 3128347, -1690070, 479426, -12029667, 2826089, 10812043, 1224603, 1478543, +3708168, 10132365, 1777580, -10214506, 11441793, 4645544, 4377646, 6534256, 6238977, -149787, +-1672890, 6175626, 5274757, 1492501, -4153770, 5373004, 3037616, 8043937, 9998684, 3503620, +-1899986, 102005, 398358, 3880503, 12607340, 7119445, -6237903, 11667279, 974958, -1498944, +2069101, -8691940, 10149545, -1300301, 717796, -1149441, 3010772, -1280437, 5539434, -6940131, +10413685, 8442295, 289373, -1479079, -4844723, -10301479, -2936147, 4269198, -1769527, -3739843, +6197101, 6679748, -3695819, -3678103, -12636331, -4363150, -908386, -339839, -14170171, 7968238, +1646046, -8483634, -6458557, 2940979, -2543158, 1505386, -1142998, 1341104, -2357937, 1533840, +5874442, -7321309, 310848, -285615, 628139, 10888279, 6557342, -448824, 14395120, 6127308, +13037910, 2674154, 4671314, 13160854, -4942971, -9338333, -5289252, 12290049, 3498788, -7454990, +10044855, -2964601, -5203353, 8281771, 20855824, -5594732, 1458141, 2945811, 4344360, -5629092, +1118302, 10937134, 1657321, 13524315, -2555506, 14549202, 10971494, 3257733, 9279277, 5282273, +-4811437, 3400004, -875100, -1612760, 1909650, 722091, -463320, 3635153, 3220689, 9316858, +6982006, -8300561, 3323231, 3338263, -5391795, 79457, -13433047, -18378702, 7797513, -4911832, +-11274289, -2815351, -5803575, 7517267, 2286533, -3968013, -8353175, 6688338, -5883032, 3933653, +-6682969, 687195, -2384781, 10515691, 2468533, -4888210, 4134443, -7803956, 950798, 445066, +1993939, -4698158, 5363341, 6172942, -749472, -3875671, -14004815, -11768747, -9263708, 4442070, +1161252, 2389076, -11481521, 7408282, 5031554, 9181566, -9842991, 9469866, 7074348, -5416491, +-4711579, -2631204, 9400073, 6731288, -4194036, 1156420, 14260365, 7471633, 3664144, 8518531, +5673115, 2471217, -4743792, 1323387, 653909, -1753420, -5250598, 12965433, 5939940, -11537356, +8006893, 8233453, 7939247, 6499896, 1708860, -7056632, 271657, -661425, 11128260, 1803886, +5017059, 10399190, -1723356, -10615549, 2528662, 6284611, 11285563, -14521284, -8297340, 4495220, +280247, 1802813, -8700530, -1735704, -8427800, -721018, 4209605, -2324651, -4563403, -5178657, +2481954, -884226, -2955474, 5305895, 674847, -9218074, 9416716, 6092948, -2809446, 3792993, +5691369, -6195491, -2088428, 24169392, -751082, 9477919, 6622840, -20026896, -10635950, -1036161, +-776315, -130460, 11506754, 2677375, -5465346, 11927124, 7362111, -1349694, -1817308, 3904125, +-1785633, -4029753, -8813273, -10474351, 6046240, -2172717, -4821101, -355409, -16349867, -2907156, +1314797, 9311489, -10694469, -2980707, 1680943, 923955, 2674154, 1009317, 11987254, -13404593, +-4187593, 3229279, -70330, -7821673, -1289027, 10799158, 9548786, 8084739, -1685775, -13338021, +-5649493, 5112085, -954020, 9303973, 123480, 22549, -6021544, -3995930, 8775692, -9538585, +7609609, 5362267, -5881421, -3336653, -261993, 1241782, -5783711, 3770981, -17704392, -1662689, +3056406, 11752641, 2098629, -1010928, 8002061, -5876052, 16691854, -16562468, -937377, -3919695, +3309809, -1249836, -684510, 3675955, -2383707, -5909338, -2995203, -3663070, -8979703, -1948841, +7539278, -1987496, -3591130, 9803800, 551903, 11883638, -11281805, -7260642, 15934866, -1918240, +-168041, 542777, -8791798, -1462973, -11150272, 3156264, -13523778, -693637, 11484206, -3802120, +8110509, 9235790, 6421513, 7212861, -8801462, 9361418, 1990717, -25560424, -3304441, 3390877, +-1093606, -3092913, -9833328, 8265128, -8201240, -2093260, -9403831, -10104447, -14100915, 13282186, +1247151, 15518791, -6674379, 11611444, 17057462, -10711112, 14199699, -16202227, -11765526, -14753213, +-3474092, -10598906, 4901632, 4131759, 1307818, 12462384, 19557670, 3412889, -5888400, -10329933, +6207302, 19044958, -369367, 5832029, 408559, 7911330, 4546760, 6190122, 9536975, -11647951, +-1522566, -4006131, 15344844, 12315819, -1141388, 18820546, 9113384, 2149631, -17788680, -8031589, +-13700409, -5565741, 762357, 5457293, -5282810, 1207423, 18047452, -2977486, -557809, 1464584, +18559628, -11181410, -5282810, -4249334, -2449742, -10929081, 12610561, 1399086, 8273718, -13210783, +1308354, -974421, -8732205, -2726767, -15699179, 5282273, -251256, 3726958, -2386928, -373662, +-18096308, -5420786, 6383395, 11752641, -3702799, 3520263, 22958748, -894964, 983011, 4957466, +10235981, -9191230, 2066953, 12642236, -7089918, 9524090, 2688113, 10077604, -11375758, -4615479, +3041911, 5046587, -10887742, -16687022, 4671851, -1814087, -16754131, 4584878, 1756642, 15221901, +13547401, -12508019, -14911053, 3352759, -11354820, -6030671, 578210, 22706418, 440234, -2882997, +-20166482, -10156524, -1612223, -15126875, -22845468, 15795279, -5759551, -7245610, -1134945, 17135846, +-5150740, 1896228, -3208341, -3409667, -9701794, -5274757, 1934346, -23995982, -15167140, -4408247, +-8458401, -8101919, -2471754, -9391483, 8535174, 3779034, 3017215, -5710696, 4566087, -34645352, +32723356, 18967650, -2753074, -4363687, 18708340, 1129040, -10235444, -15425375, -1283658, -5396090, +-5677410, -9277666, -8651675, 11881490, 12029130, -5017596, 25414932, -13547937, -9859634, -10075456, +1531156, 7854422, -26724898, 8243653, -6794639, 14528264, -13179107, 6120329, 3268470, 16307991, +1560147, 38288560, 12731894, -1011465, 1832340, -15142981, -19134616, 23794656, -6965900, 2457258, +32079648, -8602819, -1400696, -7128572, 25033216, 4476430, -10167798, 14370961, -5226975, 21489868, +11573863, 5077188, 3339874, -2798708, -8259759, -3124052, -2174864, -23826332, -5793374, -4210142, +13032005, -7710540, 2519535, 3823595, -16698296, -25491168, -823560, 21041044, -1377074, 18606872, +-3259343, -27369680, -10316511, 605590, 6123013, 4201552, -21739514, -492848, -6192806, 15111306, +-16127602, 19254338, 29618632, 18393734, -5990406, 2747169, 11959336, -5130876, 23195508, 25900800, +23656680, 6759742, 25922276, -1904818, -10486700, 2283312, -13639742, -18234284, 9200357, -8489003, +20932060, 9823664, 5113696, -8282845, -27255326, -8667244, -19506130, 11455752, 14190035, -140660, +6924561, 4776541, 6857989, 5822365, 2595771, -1441498, 3340411, -3964255, 7376070, -13091060, +-36857260, -14643154, 20180978, 1313723, -6019934, -12176769, -77846, 17154100, 21682606, 4803921, +-13314399, -2153926, 17346300, -20790326, 2001455, -2397129, 15522012, 17949742, -14209362, 27127014, +5209259, 1330903, 37962680, 462246, -11923903, 13586592, -6360310, 2202245, -8138426, 3142306, +25194816, 3248069, 32092532, 13919989, -28133110, -30350386, -6801081, 8374650, 17056388, -23420994, +-8565775, -3031710, 28762322, 26925150, -22913650, -450972, -14120779, 9172440, -5119064, 30710626, +-32212, -6285685, 19346144, -3741990, -24225226, -11701638, -4808753, 24320790, -23050016, 12352326, +35602596, 14506252, 16258062, -16554415, 12008192, 21009906, 15062987, -27146878, -14921253, 19420768, +53271016, 4738960, 10550587, -14396730, 3630321, 687195, -3853660, -13387950, 3214246, -3715684, +24912958, 22317724, -28661390, -10562935, 27670326, 16292958, 9128416, 4704063, 14367202, 19894288, +4534412, 12597139, 8773008, -11489038, 668941, -11178726, -7088307, 5373541, -3833258, 4052302, +-12468827, -8124468, 6450504, -114354, 9379135, 10431402, -26648662, 20973400, 2429341, 17347372, +-18461380, 11987254, 13973139, -9658845, -20947630, -17323214, -23084912, -19217832, -19431506, 8962523, +30409980, 11112691, 8215736, 17923436, -664646, 2629594, -14309220, 24493662, -29133300, -51233592, +16520592, -8934069, -20401, -42423540, 8689793, 18968186, -721555, 14212584, 3649112, 104153, +-6353331, 12906377, 9430674, 12348568, -17546016, -9186935, -2343442, 11336566, -23412404, 39272644, +18822694, -3134253, 21603148, 12954695, 20616380, -10597295, -13485660, -13180718, 24962350, 8963060, +4740570, 22501334, -19208168, -62892816, -3892314, 4514011, 7846369, -35213364, 27900108, 20409684, +-37803228, -28963112, 1326608, 16197932, 1737314, 9453223, 20654498, -4796405, 12999792, -17811766, +-20660940, -16144245, -21464100, -33390150, 9999758, 4367445, -22424024, 31173946, 12283070, -6398965, +-6680285, -16773458, -12829604, -29931090, -16341814, 12390444, 28208808, -9067213, 3373160, 12978317, +-23881092, 19479824, 24576876, 5548561, -5478231, 22748294, 6278169, 4933307, -13972602, -14074071, +-549219, 34301220, -8696235, -23524072, 165356, -29366838, -36941012, -21114596, -5521181, -13657996, +-24065238, -12350715, -13008919, 15737834, 30451854, 11491722, -14146549, -29339996, 31492310, 17252346, +-15476378, -8026220, -8359080, 2001455, 7240241, -9524090, 16232829, 15562814, 612033, -10022306, +-10017474, -8898098, -1463510, 6261526, -4934918, -9837086, -24528558, 7809861, 20906290, -11834782, +18407692, 984621, 12185896, -10105521, 13555991, 41192496, -15787226, 18287434, 34784404, 6703370, +-6835978, -9207873, 9545028, 1431298, 17261474, -13083007, 47656420, -14226005, -33567852, 8357470, +-15945603, 39366060, 11358578, -10954851, 815507, -22000970, -33364380, 40299680, 2652679, -9044127, +36446556, -18322868, 2591476, -9419937, 19455128, -26366268, -35443144, -20356534, 2797634, 16670379, +20032802, 14522895, 19369228, 47296716, -17997524, 18949396, 29767344, -4385699, 916976, 35718560, +3964792, -19409494, -22529250, -19890530, 36767604, -24437290, 14726906, 17343614, -11522860, 3716221, +-19847044, -4351876, 16662862, -14347338, 12162274, -4621922, -24888798, -55206972, -4516158, 50240380, +21403970, 5466420, -9328132, -14629732, -2119566, -19279572, 7046968, -27312770, 33968360, 2960306, +4787815, 3269544, -10396505, -32904282, -11933030, 27521614, -21033528, -4953708, -14216342, 12738873, +-9853192, 37984692, -4912369, 8502425, -12421582, -33856692, 8900783, -25586194, -4712653, -1335198, +-47319804, -39980776, -37398964, 14004278, -5695127, -19813758, -12131135, -12170864, -10786273, -17397838, +-10964515, -1808718, -41914048, 13763223, 6732361, 17814988, -7755101, 39884140, -1970853, 9648644, +-11135240, -1921998, 22451942, -29170882, -6785512, -9058623, 15607374, 8588861, 18762564, -7444789, +-37512780, 10387915, 998580, 62495532, 64986076, 7223598, 1047435, 14616847, 8016557, 15649787, +28223304, 9784472, 29265908, 43109660, -10568841, 5140539, -35616016, -5682242, 4959077, -5230734, +-10458245, -22354232, -18118320, 9567040, 10235981, -48275968, 34164856, 8645232, 48125644, -3468186, +-9470940, 15187541, -3330210, 50075024, 12829604, -3070902, 9625559, 9553618, -13725105, -31309774, +-24435680, -12530030, 37479496, 157840, 41154376, 4802847, 40153112, -11949673, -56337624, -21072184, +-16802986, 28792924, 2828773, -27157078, -40102648, -27389544, -6386617, 34124588, -30576946, -25407952, +-18129056, 30770756, -16260209, -8153459, -40629316, -38003480, 10615012, 7857106, 50629612, 15314780, +-7201050, 2029909, 1872606, 37700688, 15772194, -19594178, 37560564, -3022583, -70213592, -22457848, +46395848, 49450104, -33840048, -35830228, -34394636, 19529216, 32203664, 60875792, 20164872, 7573638, +-33266132, -3813394, -391916, 13596793, 32516660, 22164716, 3725884, -37108516, -70023000, -19044958, +-34354368, 54322748, 59558312, 100364792, -27739046, -96022584, -18643380, -32701344, 77300288, 25952340, +78459928, 20147692, -22746684, -72698224, -46891380, 3473555, 11974906, 83199960, 36372468, -1819456, +-64658048, -116964848, -27704686, 3842385, 57890252, 125777040, 30533460, 39127152, -76527192, -120902792, +9021579, 30238718, 101604968, 59762324, 45086420, -20090246, -74926776, -61756260, 3670050, 21627308, +2703145, 53289808, -36320928, -33377264, -5237713, -81202800, 16903918, -38385732, 51882132, 1436667, +5345087, -20291572, -54413476, 33552822, -54757612, 58003532, 5436892, 7632157, 9065602, -30555472, +30394946, 5959804, 20350628, -29154774, 8695698, 3036542, 37066104, -12995497, 7198365, 29218126, +-32580548, -14533096, 388695, -24596740, 42004244, -7135015, -20830592, 42887932, 43544524, -9420474, +-36477156, -5487895, -32409824, -2609193, 16159278, 56371, -39701604, 7432441, 17806398, -10160819, +20424180, -15784005, 6546067, 27344984, -11909407, 19076634, -44634912, -39741332, 41533944, 27369680, +65285112, 352724, -18934900, 60210608, -34333968, -25822954, 18367428, 22463752, 30871688, -26156350, +-15321759, 11956115, -7292318, 35620848, -26554172, -76734960, 20570746, 48212080, 1013075, -33564096, +8509404, 26615912, -5541582, -4725001, -966368, -21809844, -12732431, 80502720, 22468048, 21867290, +-68539088, -17929878, -53742924, -46308876, 41028748, 42242612, 85385024, 38483444, -11551315, -17563196, +-10140955, 25857314, 18496814, -624381, 41157596, 6810745, -17012366, -21016886, -16383153, 28369332, +-609349, 24524264, 11451993, 14071387, 3090766, -8359617, 2077154, -2088965, 2830920, -8831527, +-2951180, 6401649, 5833640, 53699440, 43546136, 34418796, -4904853, 7513509, -24652038, -6476811, +-16212965, -28562070, -29022168, 5065377, 12175695, 18074832, 23408646, 18112414, -16409459, -37976100, +49041012, -41194640, -19920596, -13675176, 13985487, -2069101, 21181704, 21924734, 18408766, -36599564, +-16896402, -1336272, -18828600, -56920664, 26350162, -18839338, -18276160, 11249593, 27908160, -91805, +-101211440, -55207508, -68036040, 49380848, 15797963, 146582400, 158503088, 151371824, 180178704, 170931648, +129291400, 75900664, 102373768, 41882372, 15068356, -82077360, -64566244, -178295904, -148969872, -139623488, +-75197896, -103356776, -71624488, -5462662, -17286170, -8757975, -4027606, 2536715, 8727910, 7075959, +29717416, 24642374, 30727270, 64755220, 73468640, 70672080, 58719184, 138063328, 46520400, 61188252, +105774304, 109945256, 51662552, 111295488, 139947744, 106662832, 100910792, 95799248, 24975234, 61392264, +122573000, 114757768, 85029080, 98944776, 95597920, 10949482, -8668318, -6726456, -31142808, -49916648, +14867029, -56121264, -85837608, -67704792, -75654776, -131582768, -39023536, -78740176, -79629768, -133531608, +-91513944, -115153440, -122459184, -70647384, -130706592, -165349264, -101339752, 6479495, -672162, 0, +0, 0, 0, }, }, }; const Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 591356864, -602200576, 625467520, 657311488, 675305792, 655243456, 616993536, 612510656, 636582848, 605619904, 484448160, -380037504, 423112256, 590311552, 738261376, 797214656, 832138112, 910296320, 1007401216, 1071398400, 1095982720, -1089256320, 1031573312, 913199168, 777546368, 685862784, 657140736, 668234624, 696832704, 742273408, 813552704, -913253952, 1030070592, 1139625600, 1216546304, 1250709504, 1250671872, 1231760128, 1203536768, 1166884608, 1119160064, -1061989696, 1004802752, 959169792, 929753024, 912757312, 901457280, 889540864, 871032256, 842555008, 806505728, -769039680, 734854400, 705459136, 680934848, 661060416, 645468096, 633794368, 624781888, 615331904, 602178560, -584063488, 560285440, 528072672, 484184544, 428944832, 366892224, 304280192, 247500176, 202229616, 171427184, -154277904, 148099056, 150429088, 158711920, 169591616, 179823296, 187428608, 191850816, 193787856, 194745632, -195949296, 197934640, 201510736, 208074528, 218345392, 231886352, 248418768, 268307680, 291102144, 314787264, -337050240, 356353984, 371552800, 381496704, 385412640, 383181408, 375294784, 362846368, 347200320, 329467488, -310722080, 292437888, 275762656, 260609488, 246567088, 234356496, 225260832, 219650000, 217340384, 218822672, -224834560, 235197776, 249167152, 266420048, 286923136, 310524512, 337267680, 367393120, 400790784, 437318400, -477523040, 521913696, 569809536, 620230336, 673409024, 729850240, 788359488, 846688384, 903672960, 958912640, -1010481792, 1054694208, 1088314112, 1109581184, 1116685056, 1106621952, 1076729472, 1026966400, 959503744, 876062208, -777221056, 664998400, 544082688, 418661056, 289705760, 157642480, 25789132, -102029632, -225718256, -347099936, --465098784, -576757184, -682193792, -784291648, -883714240, -978283520, -1067402432, -1153286272, -1237131520, -1317139200, --1391275136, -1459658624, -1522985728, -1579894656, -1627292288, -1663214848, -1688108928, -1702371968, -1704015872, -1691106304, --1665435264, -1630263808, -1585290624, -1528357120, -1461195136, -1387605632, -1306595072, -1214017024, -1110125568, -997769216, --874274944, -733867072, -576635840, -405794400, -218905360, -12729746, 206384448, 427856064, 646835520, 856251136, -1036709568, 1168554240, 1244153216, 1253890432, 1176388864, 1002391680, 748564480, 427082432, 39296804, -354520032, --598867136, -562934400, -304085824, -39659728, 67954432, 43758200, 3848828, -113817, 5425081, -234613, --4213363, 795106, 3238405, -993211, -2480881, 1097364, 1996086, -1024350, -1545651, 974421, -1202591, -926639, -976568, 789200, 694174, -766652, -570694, 625992, 367220, -578747, --257161, 485331, 141734, -388158, -8590, 346282, -38118, -208306, 187368, }, +602200576, 625467520, 657311488, 675305792, 655243456, 616993536, 612510656, 636582848, 605619904, 484448160, +380037504, 423112256, 590311552, 738261376, 797214656, 832138112, 910296320, 1007401216, 1071398400, 1095982720, +1089256320, 1031573312, 913199168, 777546368, 685862784, 657140736, 668234624, 696832704, 742273408, 813552704, +913253952, 1030070592, 1139625600, 1216546304, 1250709504, 1250671872, 1231760128, 1203536768, 1166884608, 1119160064, +1061989696, 1004802752, 959169792, 929753024, 912757312, 901457280, 889540864, 871032256, 842555008, 806505728, +769039680, 734854400, 705459136, 680934848, 661060416, 645468096, 633794368, 624781888, 615331904, 602178560, +584063488, 560285440, 528072672, 484184544, 428944832, 366892224, 304280192, 247500176, 202229616, 171427184, +154277904, 148099056, 150429088, 158711920, 169591616, 179823296, 187428608, 191850816, 193787856, 194745632, +195949296, 197934640, 201510736, 208074528, 218345392, 231886352, 248418768, 268307680, 291102144, 314787264, +337050240, 356353984, 371552800, 381496704, 385412640, 383181408, 375294784, 362846368, 347200320, 329467488, +310722080, 292437888, 275762656, 260609488, 246567088, 234356496, 225260832, 219650000, 217340384, 218822672, +224834560, 235197776, 249167152, 266420048, 286923136, 310524512, 337267680, 367393120, 400790784, 437318400, +477523040, 521913696, 569809536, 620230336, 673409024, 729850240, 788359488, 846688384, 903672960, 958912640, +1010481792, 1054694208, 1088314112, 1109581184, 1116685056, 1106621952, 1076729472, 1026966400, 959503744, 876062208, +777221056, 664998400, 544082688, 418661056, 289705760, 157642480, 25789132, -102029632, -225718256, -347099936, +-465098784, -576757184, -682193792, -784291648, -883714240, -978283520, -1067402432, -1153286272, -1237131520, -1317139200, +-1391275136, -1459658624, -1522985728, -1579894656, -1627292288, -1663214848, -1688108928, -1702371968, -1704015872, -1691106304, +-1665435264, -1630263808, -1585290624, -1528357120, -1461195136, -1387605632, -1306595072, -1214017024, -1110125568, -997769216, +-874274944, -733867072, -576635840, -405794400, -218905360, -12729746, 206384448, 427856064, 646835520, 856251136, +1036709568, 1168554240, 1244153216, 1253890432, 1176388864, 1002391680, 748564480, 427082432, 39296804, -354520032, +-598867136, -562934400, -304085824, -39659728, 67954432, 43758200, 3848828, -113817, 5425081, -234613, +-4213363, 795106, 3238405, -993211, -2480881, 1097364, 1996086, -1024350, -1545651, 974421, +1202591, -926639, -976568, 789200, 694174, -766652, -570694, 625992, 367220, -578747, +-257161, 485331, 141734, -388158, -8590, 346282, -38118, -208306, 187368, }, { 519927808, -530017216, 466860800, 320014240, 179574192, 91877944, 9543417, -86853904, -131920456, -83504904, 3501472, -50432044, 26572962, -75433584, -251784400, -442617312, -551045888, -545525824, -486239168, -427736864, -359921472, --270188864, -194567920, -165222016, -158624960, -136778608, -99855840, -60807612, -3196530, 94492504, 214905136, -319855328, 399596768, 470877120, 531518304, 549032640, 501886240, 410894688, 317784096, 244543632, 185171072, -128257928, 71558984, 14892262, -46188616, -112785304, -177098144, -230683232, -272678880, -305296480, -326825536, --334137728, -327876736, -310965280, -285371584, -253225360, -217572848, -179481312, -137296144, -90265720, -40242768, -10457708, 59538984, 102896680, 135867536, 157079840, 168768048, 173415744, 172320528, 167035568, 159876944, -152828352, 147094032, 143294608, 141170736, 139437184, 136325488, 129968392, 118732760, 102292696, 82190640, -60512332, 38238632, 15131170, -9887015, -38775500, -73349992, -113059648, -154378304, -192600832, -223349040, --242643104, -247449168, -237033344, -213207552, -179452320, -140565152, -102270152, -69394320, -44122200, -26440892, --15446850, -9341017, -5072357, 725313, 10765336, 27581744, 54035520, 92223152, 141980880, 200616304, -263345920, 323517888, 373243936, 404991264, 413136672, 394475552, 348091008, 275402432, 180246352, 68402184, --53290880, -177418656, -295944192, -400517504, -483597216, -539454848, -564354944, -556716352, -517826496, -451912704, --364800032, -262651744, -151906544, -39088496, 70405248, 172821424, 264930768, 343262912, 404896768, 447910336, -470505088, 470804128, 448127776, 403556736, 339092512, 257591200, 163818640, 64262912, -34533148, -126612952, --206073600, -267704240, -308601984, -328299232, -327595936, -308422144, -274420480, -230245136, -180154544, -127826816, --76795624, -29921964, 11274826, 46106472, 74042016, 95014880, 109733192, 119107496, 123791696, 124422520, -121678032, 115948544, 107431624, 96491808, 83497384, 68584720, 51995412, 34262564, 15771657, -3326989, --22571126, -41188200, -58603220, -74133816, -86342264, -93631896, -95170032, -90304912, -77953120, -57965952, --32314260, -3663607, 25825638, 52808232, 71989024, 79367240, 74249784, 56223268, 24601572, -14105746, --42410656, -44609140, -24227910, -1767379, 6867116, 3891777, 264677, 423591, 1282585, 801011, -521839, 1245004, 1653562, 1271310, 1171989, 1639604, 1773285, 1404991, 1297080, 1534914, -1468879, 1077500, 922344, 980326, 776315, 379568, 200253, 144955, -121333, -471910, --623844, -716723, -967441, -1210644, -1279900, -1345399, -1514513, -1603097, -1554778, }, +530017216, 466860800, 320014240, 179574192, 91877944, 9543417, -86853904, -131920456, -83504904, 3501472, +50432044, 26572962, -75433584, -251784400, -442617312, -551045888, -545525824, -486239168, -427736864, -359921472, +-270188864, -194567920, -165222016, -158624960, -136778608, -99855840, -60807612, -3196530, 94492504, 214905136, +319855328, 399596768, 470877120, 531518304, 549032640, 501886240, 410894688, 317784096, 244543632, 185171072, +128257928, 71558984, 14892262, -46188616, -112785304, -177098144, -230683232, -272678880, -305296480, -326825536, +-334137728, -327876736, -310965280, -285371584, -253225360, -217572848, -179481312, -137296144, -90265720, -40242768, +10457708, 59538984, 102896680, 135867536, 157079840, 168768048, 173415744, 172320528, 167035568, 159876944, +152828352, 147094032, 143294608, 141170736, 139437184, 136325488, 129968392, 118732760, 102292696, 82190640, +60512332, 38238632, 15131170, -9887015, -38775500, -73349992, -113059648, -154378304, -192600832, -223349040, +-242643104, -247449168, -237033344, -213207552, -179452320, -140565152, -102270152, -69394320, -44122200, -26440892, +-15446850, -9341017, -5072357, 725313, 10765336, 27581744, 54035520, 92223152, 141980880, 200616304, +263345920, 323517888, 373243936, 404991264, 413136672, 394475552, 348091008, 275402432, 180246352, 68402184, +-53290880, -177418656, -295944192, -400517504, -483597216, -539454848, -564354944, -556716352, -517826496, -451912704, +-364800032, -262651744, -151906544, -39088496, 70405248, 172821424, 264930768, 343262912, 404896768, 447910336, +470505088, 470804128, 448127776, 403556736, 339092512, 257591200, 163818640, 64262912, -34533148, -126612952, +-206073600, -267704240, -308601984, -328299232, -327595936, -308422144, -274420480, -230245136, -180154544, -127826816, +-76795624, -29921964, 11274826, 46106472, 74042016, 95014880, 109733192, 119107496, 123791696, 124422520, +121678032, 115948544, 107431624, 96491808, 83497384, 68584720, 51995412, 34262564, 15771657, -3326989, +-22571126, -41188200, -58603220, -74133816, -86342264, -93631896, -95170032, -90304912, -77953120, -57965952, +-32314260, -3663607, 25825638, 52808232, 71989024, 79367240, 74249784, 56223268, 24601572, -14105746, +-42410656, -44609140, -24227910, -1767379, 6867116, 3891777, 264677, 423591, 1282585, 801011, +521839, 1245004, 1653562, 1271310, 1171989, 1639604, 1773285, 1404991, 1297080, 1534914, +1468879, 1077500, 922344, 980326, 776315, 379568, 200253, 144955, -121333, -471910, +-623844, -716723, -967441, -1210644, -1279900, -1345399, -1514513, -1603097, -1554778, }, }, { { 519927808, -530017216, 466860800, 320014240, 179574192, 91877944, 9543417, -86853904, -131920456, -83504904, 3501472, -50432044, 26572962, -75433584, -251784400, -442617312, -551045888, -545525824, -486239168, -427736864, -359921472, --270188864, -194567920, -165222016, -158624960, -136778608, -99855840, -60807612, -3196530, 94492504, 214905136, -319855328, 399596768, 470877120, 531518304, 549032640, 501886240, 410894688, 317784096, 244543632, 185171072, -128257928, 71558984, 14892262, -46188616, -112785304, -177098144, -230683232, -272678880, -305296480, -326825536, --334137728, -327876736, -310965280, -285371584, -253225360, -217572848, -179481312, -137296144, -90265720, -40242768, -10457708, 59538984, 102896680, 135867536, 157079840, 168768048, 173415744, 172320528, 167035568, 159876944, -152828352, 147094032, 143294608, 141170736, 139437184, 136325488, 129968392, 118732760, 102292696, 82190640, -60512332, 38238632, 15131170, -9887015, -38775500, -73349992, -113059648, -154378304, -192600832, -223349040, --242643104, -247449168, -237033344, -213207552, -179452320, -140565152, -102270152, -69394320, -44122200, -26440892, --15446850, -9341017, -5072357, 725313, 10765336, 27581744, 54035520, 92223152, 141980880, 200616304, -263345920, 323517888, 373243936, 404991264, 413136672, 394475552, 348091008, 275402432, 180246352, 68402184, --53290880, -177418656, -295944192, -400517504, -483597216, -539454848, -564354944, -556716352, -517826496, -451912704, --364800032, -262651744, -151906544, -39088496, 70405248, 172821424, 264930768, 343262912, 404896768, 447910336, -470505088, 470804128, 448127776, 403556736, 339092512, 257591200, 163818640, 64262912, -34533148, -126612952, --206073600, -267704240, -308601984, -328299232, -327595936, -308422144, -274420480, -230245136, -180154544, -127826816, --76795624, -29921964, 11274826, 46106472, 74042016, 95014880, 109733192, 119107496, 123791696, 124422520, -121678032, 115948544, 107431624, 96491808, 83497384, 68584720, 51995412, 34262564, 15771657, -3326989, --22571126, -41188200, -58603220, -74133816, -86342264, -93631896, -95170032, -90304912, -77953120, -57965952, --32314260, -3663607, 25825638, 52808232, 71989024, 79367240, 74249784, 56223268, 24601572, -14105746, --42410656, -44609140, -24227910, -1767379, 6867116, 3891777, 264677, 423591, 1282585, 801011, -521839, 1245004, 1653562, 1271310, 1171989, 1639604, 1773285, 1404991, 1297080, 1534914, -1468879, 1077500, 922344, 980326, 776315, 379568, 200253, 144955, -121333, -471910, --623844, -716723, -967441, -1210644, -1279900, -1345399, -1514513, -1603097, -1554778, }, +530017216, 466860800, 320014240, 179574192, 91877944, 9543417, -86853904, -131920456, -83504904, 3501472, +50432044, 26572962, -75433584, -251784400, -442617312, -551045888, -545525824, -486239168, -427736864, -359921472, +-270188864, -194567920, -165222016, -158624960, -136778608, -99855840, -60807612, -3196530, 94492504, 214905136, +319855328, 399596768, 470877120, 531518304, 549032640, 501886240, 410894688, 317784096, 244543632, 185171072, +128257928, 71558984, 14892262, -46188616, -112785304, -177098144, -230683232, -272678880, -305296480, -326825536, +-334137728, -327876736, -310965280, -285371584, -253225360, -217572848, -179481312, -137296144, -90265720, -40242768, +10457708, 59538984, 102896680, 135867536, 157079840, 168768048, 173415744, 172320528, 167035568, 159876944, +152828352, 147094032, 143294608, 141170736, 139437184, 136325488, 129968392, 118732760, 102292696, 82190640, +60512332, 38238632, 15131170, -9887015, -38775500, -73349992, -113059648, -154378304, -192600832, -223349040, +-242643104, -247449168, -237033344, -213207552, -179452320, -140565152, -102270152, -69394320, -44122200, -26440892, +-15446850, -9341017, -5072357, 725313, 10765336, 27581744, 54035520, 92223152, 141980880, 200616304, +263345920, 323517888, 373243936, 404991264, 413136672, 394475552, 348091008, 275402432, 180246352, 68402184, +-53290880, -177418656, -295944192, -400517504, -483597216, -539454848, -564354944, -556716352, -517826496, -451912704, +-364800032, -262651744, -151906544, -39088496, 70405248, 172821424, 264930768, 343262912, 404896768, 447910336, +470505088, 470804128, 448127776, 403556736, 339092512, 257591200, 163818640, 64262912, -34533148, -126612952, +-206073600, -267704240, -308601984, -328299232, -327595936, -308422144, -274420480, -230245136, -180154544, -127826816, +-76795624, -29921964, 11274826, 46106472, 74042016, 95014880, 109733192, 119107496, 123791696, 124422520, +121678032, 115948544, 107431624, 96491808, 83497384, 68584720, 51995412, 34262564, 15771657, -3326989, +-22571126, -41188200, -58603220, -74133816, -86342264, -93631896, -95170032, -90304912, -77953120, -57965952, +-32314260, -3663607, 25825638, 52808232, 71989024, 79367240, 74249784, 56223268, 24601572, -14105746, +-42410656, -44609140, -24227910, -1767379, 6867116, 3891777, 264677, 423591, 1282585, 801011, +521839, 1245004, 1653562, 1271310, 1171989, 1639604, 1773285, 1404991, 1297080, 1534914, +1468879, 1077500, 922344, 980326, 776315, 379568, 200253, 144955, -121333, -471910, +-623844, -716723, -967441, -1210644, -1279900, -1345399, -1514513, -1603097, -1554778, }, { 591356864, -602200576, 625467520, 657311488, 675305792, 655243456, 616993536, 612510656, 636582848, 605619904, 484448160, -380037504, 423112256, 590311552, 738261376, 797214656, 832138112, 910296320, 1007401216, 1071398400, 1095982720, -1089256320, 1031573312, 913199168, 777546368, 685862784, 657140736, 668234624, 696832704, 742273408, 813552704, -913253952, 1030070592, 1139625600, 1216546304, 1250709504, 1250671872, 1231760128, 1203536768, 1166884608, 1119160064, -1061989696, 1004802752, 959169792, 929753024, 912757312, 901457280, 889540864, 871032256, 842555008, 806505728, -769039680, 734854400, 705459136, 680934848, 661060416, 645468096, 633794368, 624781888, 615331904, 602178560, -584063488, 560285440, 528072672, 484184544, 428944832, 366892224, 304280192, 247500176, 202229616, 171427184, -154277904, 148099056, 150429088, 158711920, 169591616, 179823296, 187428608, 191850816, 193787856, 194745632, -195949296, 197934640, 201510736, 208074528, 218345392, 231886352, 248418768, 268307680, 291102144, 314787264, -337050240, 356353984, 371552800, 381496704, 385412640, 383181408, 375294784, 362846368, 347200320, 329467488, -310722080, 292437888, 275762656, 260609488, 246567088, 234356496, 225260832, 219650000, 217340384, 218822672, -224834560, 235197776, 249167152, 266420048, 286923136, 310524512, 337267680, 367393120, 400790784, 437318400, -477523040, 521913696, 569809536, 620230336, 673409024, 729850240, 788359488, 846688384, 903672960, 958912640, -1010481792, 1054694208, 1088314112, 1109581184, 1116685056, 1106621952, 1076729472, 1026966400, 959503744, 876062208, -777221056, 664998400, 544082688, 418661056, 289705760, 157642480, 25789132, -102029632, -225718256, -347099936, --465098784, -576757184, -682193792, -784291648, -883714240, -978283520, -1067402432, -1153286272, -1237131520, -1317139200, --1391275136, -1459658624, -1522985728, -1579894656, -1627292288, -1663214848, -1688108928, -1702371968, -1704015872, -1691106304, --1665435264, -1630263808, -1585290624, -1528357120, -1461195136, -1387605632, -1306595072, -1214017024, -1110125568, -997769216, --874274944, -733867072, -576635840, -405794400, -218905360, -12729746, 206384448, 427856064, 646835520, 856251136, -1036709568, 1168554240, 1244153216, 1253890432, 1176388864, 1002391680, 748564480, 427082432, 39296804, -354520032, --598867136, -562934400, -304085824, -39659728, 67954432, 43758200, 3848828, -113817, 5425081, -234613, --4213363, 795106, 3238405, -993211, -2480881, 1097364, 1996086, -1024350, -1545651, 974421, -1202591, -926639, -976568, 789200, 694174, -766652, -570694, 625992, 367220, -578747, --257161, 485331, 141734, -388158, -8590, 346282, -38118, -208306, 187368, }, +602200576, 625467520, 657311488, 675305792, 655243456, 616993536, 612510656, 636582848, 605619904, 484448160, +380037504, 423112256, 590311552, 738261376, 797214656, 832138112, 910296320, 1007401216, 1071398400, 1095982720, +1089256320, 1031573312, 913199168, 777546368, 685862784, 657140736, 668234624, 696832704, 742273408, 813552704, +913253952, 1030070592, 1139625600, 1216546304, 1250709504, 1250671872, 1231760128, 1203536768, 1166884608, 1119160064, +1061989696, 1004802752, 959169792, 929753024, 912757312, 901457280, 889540864, 871032256, 842555008, 806505728, +769039680, 734854400, 705459136, 680934848, 661060416, 645468096, 633794368, 624781888, 615331904, 602178560, +584063488, 560285440, 528072672, 484184544, 428944832, 366892224, 304280192, 247500176, 202229616, 171427184, +154277904, 148099056, 150429088, 158711920, 169591616, 179823296, 187428608, 191850816, 193787856, 194745632, +195949296, 197934640, 201510736, 208074528, 218345392, 231886352, 248418768, 268307680, 291102144, 314787264, +337050240, 356353984, 371552800, 381496704, 385412640, 383181408, 375294784, 362846368, 347200320, 329467488, +310722080, 292437888, 275762656, 260609488, 246567088, 234356496, 225260832, 219650000, 217340384, 218822672, +224834560, 235197776, 249167152, 266420048, 286923136, 310524512, 337267680, 367393120, 400790784, 437318400, +477523040, 521913696, 569809536, 620230336, 673409024, 729850240, 788359488, 846688384, 903672960, 958912640, +1010481792, 1054694208, 1088314112, 1109581184, 1116685056, 1106621952, 1076729472, 1026966400, 959503744, 876062208, +777221056, 664998400, 544082688, 418661056, 289705760, 157642480, 25789132, -102029632, -225718256, -347099936, +-465098784, -576757184, -682193792, -784291648, -883714240, -978283520, -1067402432, -1153286272, -1237131520, -1317139200, +-1391275136, -1459658624, -1522985728, -1579894656, -1627292288, -1663214848, -1688108928, -1702371968, -1704015872, -1691106304, +-1665435264, -1630263808, -1585290624, -1528357120, -1461195136, -1387605632, -1306595072, -1214017024, -1110125568, -997769216, +-874274944, -733867072, -576635840, -405794400, -218905360, -12729746, 206384448, 427856064, 646835520, 856251136, +1036709568, 1168554240, 1244153216, 1253890432, 1176388864, 1002391680, 748564480, 427082432, 39296804, -354520032, +-598867136, -562934400, -304085824, -39659728, 67954432, 43758200, 3848828, -113817, 5425081, -234613, +-4213363, 795106, 3238405, -993211, -2480881, 1097364, 1996086, -1024350, -1545651, 974421, +1202591, -926639, -976568, 789200, 694174, -766652, -570694, 625992, 367220, -578747, +-257161, 485331, 141734, -388158, -8590, 346282, -38118, -208306, 187368, }, }, { { 557387968, -593159680, 624878528, 592054784, 496021472, 439830944, 497395872, 568646144, 487803584, 279752160, 172007536, -304443936, 546257024, 676547008, 654668992, 619560320, 679938944, 802748160, 890860480, 891186368, 816945216, -714719040, 629804352, 583309184, 570548288, 582207488, 619833600, 686186496, 771129152, 854134784, 913836416, -934031360, 911524672, 860876800, 801601408, 739015168, 666780224, 587767872, 520823296, 484344000, 481374016, -501688672, 530134784, 551650944, 556632576, 545941888, 527557280, 506844256, 482542784, 451983552, 416671968, -381627168, 351128064, 326048672, 304637728, 285190112, 267333792, 250556048, 233008960, 213521616, 193968784, -177589376, 165159216, 154646736, 144559472, 135879344, 130301256, 127932040, 127418256, 127691528, 129051416, -132694088, 139440944, 148960208, 160134096, 171935600, 183858960, 195841920, 208121232, 220983584, 234291008, -247348784, 259533600, 271027456, 282685088, 295102368, 307943776, 320258528, 331289632, 340634944, 347539104, -350454848, 347743104, 338704352, 323762688, 304125568, 281853472, 259888464, 241151136, 227387920, 219248416, -217304400, 222436352, 235214416, 255448544, 282617984, 316601888, 357794400, 406395712, 461548992, 521332256, -583583488, 646257280, 706787840, 761959424, 809219648, 847609088, 876638784, 894981504, 901453504, 896620608, -881838912, 856941568, 820498176, 772231872, 713310848, 644071168, 563615168, 472553792, 374247872, 272054496, -166945920, 59370944, -48115980, -152288272, -252473216, -350090848, -445352128, -536800032, -624242368, -709630592, --794075584, -876057344, -953815040, -1027575744, -1097648640, -1161764480, -1216457088, -1260221824, -1293141120, -1313950208, --1319934720, -1309968256, -1285501440, -1247996672, -1197440640, -1134339456, -1061370688, -981684032, -896877248, -808056192, --717803392, -629496704, -545263808, -466033472, -393168832, -328561248, -273071872, -226043056, -186550832, -154243008, --128655744, -108451680, -91867200, -77659448, -65245384, -54001160, -42885784, -31039728, -18444738, -5459977, -8137890, 22981834, 39114804, 56093884, 74043624, 93453120, 113812872, 133719512, 152372016, 169460080, -183575488, 192614256, 195772128, 193043216, 183014992, 163948560, 136519296, 101771936, 57531624, 3827353, --46607912, -71913856, -62028992, -31731756, -6418829, 2238215, 1021129, -205085, 335007, 281320, --333397, -169114, 317828, 137439, -227633, -49392, 216359, 30065, -185220, -26844, -124017, -28454, -144418, -12348, 70867, -41876, -94489, 8053, 47782, -28454, --42413, 27380, 38655, -5369, 1074, 35970, 30065, 16106, 27917, }, +593159680, 624878528, 592054784, 496021472, 439830944, 497395872, 568646144, 487803584, 279752160, 172007536, +304443936, 546257024, 676547008, 654668992, 619560320, 679938944, 802748160, 890860480, 891186368, 816945216, +714719040, 629804352, 583309184, 570548288, 582207488, 619833600, 686186496, 771129152, 854134784, 913836416, +934031360, 911524672, 860876800, 801601408, 739015168, 666780224, 587767872, 520823296, 484344000, 481374016, +501688672, 530134784, 551650944, 556632576, 545941888, 527557280, 506844256, 482542784, 451983552, 416671968, +381627168, 351128064, 326048672, 304637728, 285190112, 267333792, 250556048, 233008960, 213521616, 193968784, +177589376, 165159216, 154646736, 144559472, 135879344, 130301256, 127932040, 127418256, 127691528, 129051416, +132694088, 139440944, 148960208, 160134096, 171935600, 183858960, 195841920, 208121232, 220983584, 234291008, +247348784, 259533600, 271027456, 282685088, 295102368, 307943776, 320258528, 331289632, 340634944, 347539104, +350454848, 347743104, 338704352, 323762688, 304125568, 281853472, 259888464, 241151136, 227387920, 219248416, +217304400, 222436352, 235214416, 255448544, 282617984, 316601888, 357794400, 406395712, 461548992, 521332256, +583583488, 646257280, 706787840, 761959424, 809219648, 847609088, 876638784, 894981504, 901453504, 896620608, +881838912, 856941568, 820498176, 772231872, 713310848, 644071168, 563615168, 472553792, 374247872, 272054496, +166945920, 59370944, -48115980, -152288272, -252473216, -350090848, -445352128, -536800032, -624242368, -709630592, +-794075584, -876057344, -953815040, -1027575744, -1097648640, -1161764480, -1216457088, -1260221824, -1293141120, -1313950208, +-1319934720, -1309968256, -1285501440, -1247996672, -1197440640, -1134339456, -1061370688, -981684032, -896877248, -808056192, +-717803392, -629496704, -545263808, -466033472, -393168832, -328561248, -273071872, -226043056, -186550832, -154243008, +-128655744, -108451680, -91867200, -77659448, -65245384, -54001160, -42885784, -31039728, -18444738, -5459977, +8137890, 22981834, 39114804, 56093884, 74043624, 93453120, 113812872, 133719512, 152372016, 169460080, +183575488, 192614256, 195772128, 193043216, 183014992, 163948560, 136519296, 101771936, 57531624, 3827353, +-46607912, -71913856, -62028992, -31731756, -6418829, 2238215, 1021129, -205085, 335007, 281320, +-333397, -169114, 317828, 137439, -227633, -49392, 216359, 30065, -185220, -26844, +124017, -28454, -144418, -12348, 70867, -41876, -94489, 8053, 47782, -28454, +-42413, 27380, 38655, -5369, 1074, 35970, 30065, 16106, 27917, }, { 557387968, -593159680, 624878528, 592054784, 496021472, 439830944, 497395872, 568646144, 487803584, 279752160, 172007536, -304443936, 546257024, 676547008, 654668992, 619560320, 679938944, 802748160, 890860480, 891186368, 816945216, -714719040, 629804352, 583309184, 570548288, 582207488, 619833600, 686186496, 771129152, 854134784, 913836416, -934031360, 911524672, 860876800, 801601408, 739015168, 666780224, 587767872, 520823296, 484344000, 481374016, -501688672, 530134784, 551650944, 556632576, 545941888, 527557280, 506844256, 482542784, 451983552, 416671968, -381627168, 351128064, 326048672, 304637728, 285190112, 267333792, 250556048, 233008960, 213521616, 193968784, -177589376, 165159216, 154646736, 144559472, 135879344, 130301256, 127932040, 127418256, 127691528, 129051416, -132694088, 139440944, 148960208, 160134096, 171935600, 183858960, 195841920, 208121232, 220983584, 234291008, -247348784, 259533600, 271027456, 282685088, 295102368, 307943776, 320258528, 331289632, 340634944, 347539104, -350454848, 347743104, 338704352, 323762688, 304125568, 281853472, 259888464, 241151136, 227387920, 219248416, -217304400, 222436352, 235214416, 255448544, 282617984, 316601888, 357794400, 406395712, 461548992, 521332256, -583583488, 646257280, 706787840, 761959424, 809219648, 847609088, 876638784, 894981504, 901453504, 896620608, -881838912, 856941568, 820498176, 772231872, 713310848, 644071168, 563615168, 472553792, 374247872, 272054496, -166945920, 59370944, -48115980, -152288272, -252473216, -350090848, -445352128, -536800032, -624242368, -709630592, --794075584, -876057344, -953815040, -1027575744, -1097648640, -1161764480, -1216457088, -1260221824, -1293141120, -1313950208, --1319934720, -1309968256, -1285501440, -1247996672, -1197440640, -1134339456, -1061370688, -981684032, -896877248, -808056192, --717803392, -629496704, -545263808, -466033472, -393168832, -328561248, -273071872, -226043056, -186550832, -154243008, --128655744, -108451680, -91867200, -77659448, -65245384, -54001160, -42885784, -31039728, -18444738, -5459977, -8137890, 22981834, 39114804, 56093884, 74043624, 93453120, 113812872, 133719512, 152372016, 169460080, -183575488, 192614256, 195772128, 193043216, 183014992, 163948560, 136519296, 101771936, 57531624, 3827353, --46607912, -71913856, -62028992, -31731756, -6418829, 2238215, 1021129, -205085, 335007, 281320, --333397, -169114, 317828, 137439, -227633, -49392, 216359, 30065, -185220, -26844, -124017, -28454, -144418, -12348, 70867, -41876, -94489, 8053, 47782, -28454, --42413, 27380, 38655, -5369, 1074, 35970, 30065, 16106, 27917, }, +593159680, 624878528, 592054784, 496021472, 439830944, 497395872, 568646144, 487803584, 279752160, 172007536, +304443936, 546257024, 676547008, 654668992, 619560320, 679938944, 802748160, 890860480, 891186368, 816945216, +714719040, 629804352, 583309184, 570548288, 582207488, 619833600, 686186496, 771129152, 854134784, 913836416, +934031360, 911524672, 860876800, 801601408, 739015168, 666780224, 587767872, 520823296, 484344000, 481374016, +501688672, 530134784, 551650944, 556632576, 545941888, 527557280, 506844256, 482542784, 451983552, 416671968, +381627168, 351128064, 326048672, 304637728, 285190112, 267333792, 250556048, 233008960, 213521616, 193968784, +177589376, 165159216, 154646736, 144559472, 135879344, 130301256, 127932040, 127418256, 127691528, 129051416, +132694088, 139440944, 148960208, 160134096, 171935600, 183858960, 195841920, 208121232, 220983584, 234291008, +247348784, 259533600, 271027456, 282685088, 295102368, 307943776, 320258528, 331289632, 340634944, 347539104, +350454848, 347743104, 338704352, 323762688, 304125568, 281853472, 259888464, 241151136, 227387920, 219248416, +217304400, 222436352, 235214416, 255448544, 282617984, 316601888, 357794400, 406395712, 461548992, 521332256, +583583488, 646257280, 706787840, 761959424, 809219648, 847609088, 876638784, 894981504, 901453504, 896620608, +881838912, 856941568, 820498176, 772231872, 713310848, 644071168, 563615168, 472553792, 374247872, 272054496, +166945920, 59370944, -48115980, -152288272, -252473216, -350090848, -445352128, -536800032, -624242368, -709630592, +-794075584, -876057344, -953815040, -1027575744, -1097648640, -1161764480, -1216457088, -1260221824, -1293141120, -1313950208, +-1319934720, -1309968256, -1285501440, -1247996672, -1197440640, -1134339456, -1061370688, -981684032, -896877248, -808056192, +-717803392, -629496704, -545263808, -466033472, -393168832, -328561248, -273071872, -226043056, -186550832, -154243008, +-128655744, -108451680, -91867200, -77659448, -65245384, -54001160, -42885784, -31039728, -18444738, -5459977, +8137890, 22981834, 39114804, 56093884, 74043624, 93453120, 113812872, 133719512, 152372016, 169460080, +183575488, 192614256, 195772128, 193043216, 183014992, 163948560, 136519296, 101771936, 57531624, 3827353, +-46607912, -71913856, -62028992, -31731756, -6418829, 2238215, 1021129, -205085, 335007, 281320, +-333397, -169114, 317828, 137439, -227633, -49392, 216359, 30065, -185220, -26844, +124017, -28454, -144418, -12348, 70867, -41876, -94489, 8053, 47782, -28454, +-42413, 27380, 38655, -5369, 1074, 35970, 30065, 16106, 27917, }, }, { { 528323936, -521020320, 540578560, 592845056, 653261312, 717063552, 786136832, 823052096, 793232128, 737496320, 723856640, -740865728, 720060928, 652342720, 596755648, 578083264, 559248768, 518883584, 479682880, 451339872, 413041632, -363545888, 331671328, 327888544, 332871232, 337333184, 348948384, 358744672, 343110976, 302795200, 264860432, -243976688, 231275392, 220823056, 219565712, 230320848, 247392800, 269858176, 301967872, 340665536, 375766688, -401169824, 416797056, 423082208, 421671840, 418448992, 419976928, 429309888, 447531296, 474900992, 508197696, -540729920, 566361216, 581071488, 581869824, 568189248, 543684352, 513382816, 479775232, 443569728, 406177216, -369065472, 332418112, 296441856, 262662480, 232833936, 207938160, 188815360, 176282640, 170244448, 169768784, -173987520, 182115200, 193182800, 206733424, 223349040, 243906368, 268926688, 299044608, 335399904, 379107104, -430591936, 489461440, 554827072, 625948544, 702407552, 783147008, 865627008, 946551744, 1022604352, 1089404544, -1141034880, 1172661888, 1183078784, 1173171968, 1143169408, 1093627008, 1027916160, 950953024, 865882560, 774277376, -678871104, 583300608, 489188736, 395959488, 303981664, 215988000, 134995120, 62572304, -201863, -51686172, --90861104, -118878256, -138328544, -151115744, -157800864, -158872992, -155626528, -149380032, -140627968, -129674192, --117633248, -106007848, -95420752, -85375896, -75175888, -64502356, -53092776, -40415104, -25994216, -9968082, -6793028, 23126252, 38115152, 51076288, 61049204, 66719632, 67147520, 62217968, 51898776, 35355632, -11499775, -19732690, -57364120, -100552160, -148785728, -200636176, -253343472, -304400960, -352847136, -398310976, --439680640, -475895808, -507457888, -535759584, -561140160, -582897920, -601041472, -616570496, -629873600, -640165952, --646885952, -650597376, -652060864, -651216384, -647618816, -641518336, -633958656, -625735936, -616669248, -606437568, --595811840, -585957568, -576570368, -566297344, -555121280, -544144960, -532675264, -518246848, -500029760, -478902272, --453556608, -420442944, -378153632, -327303904, -265747888, -189495568, -98843304, 2273648, 112312320, 229941808, -346832576, 451240000, 536794688, 597777856, 620114368, 590760960, 510590016, 381782336, 195273904, -35808752, --234559968, -300432960, -214249072, -71331888, 15775415, 23496156, 4268124, -942745, 2696703, 938987, --2272575, -402116, 1856500, 120259, -1471026, 93952, 1229971, -158914, -984084, 210453, -777389, -264677, -656593, 226560, 473520, -271120, -405338, 216359, 273267, -221728, --205085, 190589, 136365, -145492, -48855, 142808, 31675, -60130, 65498, }, +521020320, 540578560, 592845056, 653261312, 717063552, 786136832, 823052096, 793232128, 737496320, 723856640, +740865728, 720060928, 652342720, 596755648, 578083264, 559248768, 518883584, 479682880, 451339872, 413041632, +363545888, 331671328, 327888544, 332871232, 337333184, 348948384, 358744672, 343110976, 302795200, 264860432, +243976688, 231275392, 220823056, 219565712, 230320848, 247392800, 269858176, 301967872, 340665536, 375766688, +401169824, 416797056, 423082208, 421671840, 418448992, 419976928, 429309888, 447531296, 474900992, 508197696, +540729920, 566361216, 581071488, 581869824, 568189248, 543684352, 513382816, 479775232, 443569728, 406177216, +369065472, 332418112, 296441856, 262662480, 232833936, 207938160, 188815360, 176282640, 170244448, 169768784, +173987520, 182115200, 193182800, 206733424, 223349040, 243906368, 268926688, 299044608, 335399904, 379107104, +430591936, 489461440, 554827072, 625948544, 702407552, 783147008, 865627008, 946551744, 1022604352, 1089404544, +1141034880, 1172661888, 1183078784, 1173171968, 1143169408, 1093627008, 1027916160, 950953024, 865882560, 774277376, +678871104, 583300608, 489188736, 395959488, 303981664, 215988000, 134995120, 62572304, -201863, -51686172, +-90861104, -118878256, -138328544, -151115744, -157800864, -158872992, -155626528, -149380032, -140627968, -129674192, +-117633248, -106007848, -95420752, -85375896, -75175888, -64502356, -53092776, -40415104, -25994216, -9968082, +6793028, 23126252, 38115152, 51076288, 61049204, 66719632, 67147520, 62217968, 51898776, 35355632, +11499775, -19732690, -57364120, -100552160, -148785728, -200636176, -253343472, -304400960, -352847136, -398310976, +-439680640, -475895808, -507457888, -535759584, -561140160, -582897920, -601041472, -616570496, -629873600, -640165952, +-646885952, -650597376, -652060864, -651216384, -647618816, -641518336, -633958656, -625735936, -616669248, -606437568, +-595811840, -585957568, -576570368, -566297344, -555121280, -544144960, -532675264, -518246848, -500029760, -478902272, +-453556608, -420442944, -378153632, -327303904, -265747888, -189495568, -98843304, 2273648, 112312320, 229941808, +346832576, 451240000, 536794688, 597777856, 620114368, 590760960, 510590016, 381782336, 195273904, -35808752, +-234559968, -300432960, -214249072, -71331888, 15775415, 23496156, 4268124, -942745, 2696703, 938987, +-2272575, -402116, 1856500, 120259, -1471026, 93952, 1229971, -158914, -984084, 210453, +777389, -264677, -656593, 226560, 473520, -271120, -405338, 216359, 273267, -221728, +-205085, 190589, 136365, -145492, -48855, 142808, 31675, -60130, 65498, }, { 474580480, -398759264, 259799344, 101417064, -25479356, -112331112, -185142624, -246895664, -268402704, -242585120, -205237152, --186441312, -177279600, -161690480, -147096192, -139762528, -115844928, -44347148, 72617696, 199460960, 297104896, -342636384, 332363904, 279873504, 206060176, 123929672, 37595996, -44044888, -104937328, -137535584, -150566528, --156369024, -158901984, -157653760, -153791504, -146374096, -128723928, -94373320, -44081932, 14919106, 72908680, -119517128, 146036944, 149292528, 132541080, 102513888, 67012764, 34136400, 10182831, -3135863, -8441221, --9655086, -9846213, -10952703, -13720273, -17641578, -21669720, -25094420, -27732066, -29929480, -32669132, --37112276, -43723840, -51956756, -60378112, -66410396, -66276716, -56291988, -34812320, -3122441, 34979824, -74029664, 108025408, 131982200, 143158784, 141070880, 126644088, 101371432, 66827008, 24585466, -23269596, --73314016, -120408872, -158241088, -180575456, -182854480, -163737568, -125828584, -75043280, -18950470, 34983044, -80619224, 113781736, 132411696, 136386144, 127179888, 107473504, 80718544, 50710140, 21187074, -4627291, --24551644, -37795712, -44883480, -47211892, -46525772, -44491568, -42404748, -41034116, -40599252, -40838696, --41083508, -40307196, -37228776, -30582852, -19549618, -4136054, 14667850, 34984120, 54367308, 70325792, -80868328, 84793928, 81678464, 71765680, 55852292, 35109212, 10918881, -15112379, -41051296, -64691336, --83730928, -95960840, -99542312, -93476744, -78015400, -54739360, -26379152, 3516505, 31205622, 53573812, -68691560, 75903880, 75692360, 69438880, 58948964, 45899240, 31609348, 17107392, 3111167, -9999758, --21968220, -32387812, -40741524, -46544560, -49306760, -48571248, -44215616, -36639828, -26604102, -15072651, --3232500, 7695508, 16845398, 23805930, 28441810, 30910342, 31720480, 31430034, 30328374, 28571734, -26295938, 23301808, 18974628, 12774306, 4409858, -6484864, -20079508, -35452272, -50543176, -62921272, --69786240, -67693520, -53924924, -28570122, 5386963, 43156368, 77880104, 100739528, 104390256, 86776056, -50828252, 2720325, -47143708, -84642528, -98577016, -86414208, -51794084, -1819456, 47561396, 71257800, -54431732, 12842489, -18505404, -20906828, -7013145, 1737851, 650688, -1589675, -652835, 148176, --869731, -1324461, -414464, -31139, -600222, -618475, 101469, 339839, 38118, 163209, -667331, 766115, 553514, 638340, 883690, 816581, 587337, 552440, 564788, 373662, -127775, 8590, -99858, -300111, -486942, -588947, -670552, -758062, -811749, }, +398759264, 259799344, 101417064, -25479356, -112331112, -185142624, -246895664, -268402704, -242585120, -205237152, +-186441312, -177279600, -161690480, -147096192, -139762528, -115844928, -44347148, 72617696, 199460960, 297104896, +342636384, 332363904, 279873504, 206060176, 123929672, 37595996, -44044888, -104937328, -137535584, -150566528, +-156369024, -158901984, -157653760, -153791504, -146374096, -128723928, -94373320, -44081932, 14919106, 72908680, +119517128, 146036944, 149292528, 132541080, 102513888, 67012764, 34136400, 10182831, -3135863, -8441221, +-9655086, -9846213, -10952703, -13720273, -17641578, -21669720, -25094420, -27732066, -29929480, -32669132, +-37112276, -43723840, -51956756, -60378112, -66410396, -66276716, -56291988, -34812320, -3122441, 34979824, +74029664, 108025408, 131982200, 143158784, 141070880, 126644088, 101371432, 66827008, 24585466, -23269596, +-73314016, -120408872, -158241088, -180575456, -182854480, -163737568, -125828584, -75043280, -18950470, 34983044, +80619224, 113781736, 132411696, 136386144, 127179888, 107473504, 80718544, 50710140, 21187074, -4627291, +-24551644, -37795712, -44883480, -47211892, -46525772, -44491568, -42404748, -41034116, -40599252, -40838696, +-41083508, -40307196, -37228776, -30582852, -19549618, -4136054, 14667850, 34984120, 54367308, 70325792, +80868328, 84793928, 81678464, 71765680, 55852292, 35109212, 10918881, -15112379, -41051296, -64691336, +-83730928, -95960840, -99542312, -93476744, -78015400, -54739360, -26379152, 3516505, 31205622, 53573812, +68691560, 75903880, 75692360, 69438880, 58948964, 45899240, 31609348, 17107392, 3111167, -9999758, +-21968220, -32387812, -40741524, -46544560, -49306760, -48571248, -44215616, -36639828, -26604102, -15072651, +-3232500, 7695508, 16845398, 23805930, 28441810, 30910342, 31720480, 31430034, 30328374, 28571734, +26295938, 23301808, 18974628, 12774306, 4409858, -6484864, -20079508, -35452272, -50543176, -62921272, +-69786240, -67693520, -53924924, -28570122, 5386963, 43156368, 77880104, 100739528, 104390256, 86776056, +50828252, 2720325, -47143708, -84642528, -98577016, -86414208, -51794084, -1819456, 47561396, 71257800, +54431732, 12842489, -18505404, -20906828, -7013145, 1737851, 650688, -1589675, -652835, 148176, +-869731, -1324461, -414464, -31139, -600222, -618475, 101469, 339839, 38118, 163209, +667331, 766115, 553514, 638340, 883690, 816581, 587337, 552440, 564788, 373662, +127775, 8590, -99858, -300111, -486942, -588947, -670552, -758062, -811749, }, }, { { 474580480, -398759264, 259799344, 101417064, -25479356, -112331112, -185142624, -246895664, -268402704, -242585120, -205237152, --186441312, -177279600, -161690480, -147096192, -139762528, -115844928, -44347148, 72617696, 199460960, 297104896, -342636384, 332363904, 279873504, 206060176, 123929672, 37595996, -44044888, -104937328, -137535584, -150566528, --156369024, -158901984, -157653760, -153791504, -146374096, -128723928, -94373320, -44081932, 14919106, 72908680, -119517128, 146036944, 149292528, 132541080, 102513888, 67012764, 34136400, 10182831, -3135863, -8441221, --9655086, -9846213, -10952703, -13720273, -17641578, -21669720, -25094420, -27732066, -29929480, -32669132, --37112276, -43723840, -51956756, -60378112, -66410396, -66276716, -56291988, -34812320, -3122441, 34979824, -74029664, 108025408, 131982200, 143158784, 141070880, 126644088, 101371432, 66827008, 24585466, -23269596, --73314016, -120408872, -158241088, -180575456, -182854480, -163737568, -125828584, -75043280, -18950470, 34983044, -80619224, 113781736, 132411696, 136386144, 127179888, 107473504, 80718544, 50710140, 21187074, -4627291, --24551644, -37795712, -44883480, -47211892, -46525772, -44491568, -42404748, -41034116, -40599252, -40838696, --41083508, -40307196, -37228776, -30582852, -19549618, -4136054, 14667850, 34984120, 54367308, 70325792, -80868328, 84793928, 81678464, 71765680, 55852292, 35109212, 10918881, -15112379, -41051296, -64691336, --83730928, -95960840, -99542312, -93476744, -78015400, -54739360, -26379152, 3516505, 31205622, 53573812, -68691560, 75903880, 75692360, 69438880, 58948964, 45899240, 31609348, 17107392, 3111167, -9999758, --21968220, -32387812, -40741524, -46544560, -49306760, -48571248, -44215616, -36639828, -26604102, -15072651, --3232500, 7695508, 16845398, 23805930, 28441810, 30910342, 31720480, 31430034, 30328374, 28571734, -26295938, 23301808, 18974628, 12774306, 4409858, -6484864, -20079508, -35452272, -50543176, -62921272, --69786240, -67693520, -53924924, -28570122, 5386963, 43156368, 77880104, 100739528, 104390256, 86776056, -50828252, 2720325, -47143708, -84642528, -98577016, -86414208, -51794084, -1819456, 47561396, 71257800, -54431732, 12842489, -18505404, -20906828, -7013145, 1737851, 650688, -1589675, -652835, 148176, --869731, -1324461, -414464, -31139, -600222, -618475, 101469, 339839, 38118, 163209, -667331, 766115, 553514, 638340, 883690, 816581, 587337, 552440, 564788, 373662, -127775, 8590, -99858, -300111, -486942, -588947, -670552, -758062, -811749, }, +398759264, 259799344, 101417064, -25479356, -112331112, -185142624, -246895664, -268402704, -242585120, -205237152, +-186441312, -177279600, -161690480, -147096192, -139762528, -115844928, -44347148, 72617696, 199460960, 297104896, +342636384, 332363904, 279873504, 206060176, 123929672, 37595996, -44044888, -104937328, -137535584, -150566528, +-156369024, -158901984, -157653760, -153791504, -146374096, -128723928, -94373320, -44081932, 14919106, 72908680, +119517128, 146036944, 149292528, 132541080, 102513888, 67012764, 34136400, 10182831, -3135863, -8441221, +-9655086, -9846213, -10952703, -13720273, -17641578, -21669720, -25094420, -27732066, -29929480, -32669132, +-37112276, -43723840, -51956756, -60378112, -66410396, -66276716, -56291988, -34812320, -3122441, 34979824, +74029664, 108025408, 131982200, 143158784, 141070880, 126644088, 101371432, 66827008, 24585466, -23269596, +-73314016, -120408872, -158241088, -180575456, -182854480, -163737568, -125828584, -75043280, -18950470, 34983044, +80619224, 113781736, 132411696, 136386144, 127179888, 107473504, 80718544, 50710140, 21187074, -4627291, +-24551644, -37795712, -44883480, -47211892, -46525772, -44491568, -42404748, -41034116, -40599252, -40838696, +-41083508, -40307196, -37228776, -30582852, -19549618, -4136054, 14667850, 34984120, 54367308, 70325792, +80868328, 84793928, 81678464, 71765680, 55852292, 35109212, 10918881, -15112379, -41051296, -64691336, +-83730928, -95960840, -99542312, -93476744, -78015400, -54739360, -26379152, 3516505, 31205622, 53573812, +68691560, 75903880, 75692360, 69438880, 58948964, 45899240, 31609348, 17107392, 3111167, -9999758, +-21968220, -32387812, -40741524, -46544560, -49306760, -48571248, -44215616, -36639828, -26604102, -15072651, +-3232500, 7695508, 16845398, 23805930, 28441810, 30910342, 31720480, 31430034, 30328374, 28571734, +26295938, 23301808, 18974628, 12774306, 4409858, -6484864, -20079508, -35452272, -50543176, -62921272, +-69786240, -67693520, -53924924, -28570122, 5386963, 43156368, 77880104, 100739528, 104390256, 86776056, +50828252, 2720325, -47143708, -84642528, -98577016, -86414208, -51794084, -1819456, 47561396, 71257800, +54431732, 12842489, -18505404, -20906828, -7013145, 1737851, 650688, -1589675, -652835, 148176, +-869731, -1324461, -414464, -31139, -600222, -618475, 101469, 339839, 38118, 163209, +667331, 766115, 553514, 638340, 883690, 816581, 587337, 552440, 564788, 373662, +127775, 8590, -99858, -300111, -486942, -588947, -670552, -758062, -811749, }, { 528323936, -521020320, 540578560, 592845056, 653261312, 717063552, 786136832, 823052096, 793232128, 737496320, 723856640, -740865728, 720060928, 652342720, 596755648, 578083264, 559248768, 518883584, 479682880, 451339872, 413041632, -363545888, 331671328, 327888544, 332871232, 337333184, 348948384, 358744672, 343110976, 302795200, 264860432, -243976688, 231275392, 220823056, 219565712, 230320848, 247392800, 269858176, 301967872, 340665536, 375766688, -401169824, 416797056, 423082208, 421671840, 418448992, 419976928, 429309888, 447531296, 474900992, 508197696, -540729920, 566361216, 581071488, 581869824, 568189248, 543684352, 513382816, 479775232, 443569728, 406177216, -369065472, 332418112, 296441856, 262662480, 232833936, 207938160, 188815360, 176282640, 170244448, 169768784, -173987520, 182115200, 193182800, 206733424, 223349040, 243906368, 268926688, 299044608, 335399904, 379107104, -430591936, 489461440, 554827072, 625948544, 702407552, 783147008, 865627008, 946551744, 1022604352, 1089404544, -1141034880, 1172661888, 1183078784, 1173171968, 1143169408, 1093627008, 1027916160, 950953024, 865882560, 774277376, -678871104, 583300608, 489188736, 395959488, 303981664, 215988000, 134995120, 62572304, -201863, -51686172, --90861104, -118878256, -138328544, -151115744, -157800864, -158872992, -155626528, -149380032, -140627968, -129674192, --117633248, -106007848, -95420752, -85375896, -75175888, -64502356, -53092776, -40415104, -25994216, -9968082, -6793028, 23126252, 38115152, 51076288, 61049204, 66719632, 67147520, 62217968, 51898776, 35355632, -11499775, -19732690, -57364120, -100552160, -148785728, -200636176, -253343472, -304400960, -352847136, -398310976, --439680640, -475895808, -507457888, -535759584, -561140160, -582897920, -601041472, -616570496, -629873600, -640165952, --646885952, -650597376, -652060864, -651216384, -647618816, -641518336, -633958656, -625735936, -616669248, -606437568, --595811840, -585957568, -576570368, -566297344, -555121280, -544144960, -532675264, -518246848, -500029760, -478902272, --453556608, -420442944, -378153632, -327303904, -265747888, -189495568, -98843304, 2273648, 112312320, 229941808, -346832576, 451240000, 536794688, 597777856, 620114368, 590760960, 510590016, 381782336, 195273904, -35808752, --234559968, -300432960, -214249072, -71331888, 15775415, 23496156, 4268124, -942745, 2696703, 938987, --2272575, -402116, 1856500, 120259, -1471026, 93952, 1229971, -158914, -984084, 210453, -777389, -264677, -656593, 226560, 473520, -271120, -405338, 216359, 273267, -221728, --205085, 190589, 136365, -145492, -48855, 142808, 31675, -60130, 65498, }, +521020320, 540578560, 592845056, 653261312, 717063552, 786136832, 823052096, 793232128, 737496320, 723856640, +740865728, 720060928, 652342720, 596755648, 578083264, 559248768, 518883584, 479682880, 451339872, 413041632, +363545888, 331671328, 327888544, 332871232, 337333184, 348948384, 358744672, 343110976, 302795200, 264860432, +243976688, 231275392, 220823056, 219565712, 230320848, 247392800, 269858176, 301967872, 340665536, 375766688, +401169824, 416797056, 423082208, 421671840, 418448992, 419976928, 429309888, 447531296, 474900992, 508197696, +540729920, 566361216, 581071488, 581869824, 568189248, 543684352, 513382816, 479775232, 443569728, 406177216, +369065472, 332418112, 296441856, 262662480, 232833936, 207938160, 188815360, 176282640, 170244448, 169768784, +173987520, 182115200, 193182800, 206733424, 223349040, 243906368, 268926688, 299044608, 335399904, 379107104, +430591936, 489461440, 554827072, 625948544, 702407552, 783147008, 865627008, 946551744, 1022604352, 1089404544, +1141034880, 1172661888, 1183078784, 1173171968, 1143169408, 1093627008, 1027916160, 950953024, 865882560, 774277376, +678871104, 583300608, 489188736, 395959488, 303981664, 215988000, 134995120, 62572304, -201863, -51686172, +-90861104, -118878256, -138328544, -151115744, -157800864, -158872992, -155626528, -149380032, -140627968, -129674192, +-117633248, -106007848, -95420752, -85375896, -75175888, -64502356, -53092776, -40415104, -25994216, -9968082, +6793028, 23126252, 38115152, 51076288, 61049204, 66719632, 67147520, 62217968, 51898776, 35355632, +11499775, -19732690, -57364120, -100552160, -148785728, -200636176, -253343472, -304400960, -352847136, -398310976, +-439680640, -475895808, -507457888, -535759584, -561140160, -582897920, -601041472, -616570496, -629873600, -640165952, +-646885952, -650597376, -652060864, -651216384, -647618816, -641518336, -633958656, -625735936, -616669248, -606437568, +-595811840, -585957568, -576570368, -566297344, -555121280, -544144960, -532675264, -518246848, -500029760, -478902272, +-453556608, -420442944, -378153632, -327303904, -265747888, -189495568, -98843304, 2273648, 112312320, 229941808, +346832576, 451240000, 536794688, 597777856, 620114368, 590760960, 510590016, 381782336, 195273904, -35808752, +-234559968, -300432960, -214249072, -71331888, 15775415, 23496156, 4268124, -942745, 2696703, 938987, +-2272575, -402116, 1856500, 120259, -1471026, 93952, 1229971, -158914, -984084, 210453, +777389, -264677, -656593, 226560, 473520, -271120, -405338, 216359, 273267, -221728, +-205085, 190589, 136365, -145492, -48855, 142808, 31675, -60130, 65498, }, }, { { 570948288, -560026688, 580181376, 651761280, 741916928, 808227456, 843835456, 857312512, 837136384, 774951680, 706217152, -679031104, 684954432, 669311040, 616302016, 573348608, 574092160, 586936832, 569456832, 532186720, 511266464, -508753920, 500068416, 481083584, 469860832, 471176704, 471000064, 463027008, 456938336, 460991712, 472953760, -487162560, 498884064, 503802880, 502036032, 500722304, 507399392, 523648864, 547635712, 577758464, 611217856, -643876800, 673844416, 701608704, 726164096, 744914304, 757558144, 766675264, 774677376, 782670272, 791276352, -800164224, 807529536, 811386944, 810441536, 803607680, 790492480, 772253888, 750109056, 723654208, 692558656, -658613376, 623875136, 588272000, 551226816, 513920224, 477741024, 442319360, 407270816, 374342368, 346103488, -324013952, 308986912, 302183712, 304083136, 314027616, 331233792, 355143872, 384909600, 419871168, 460244416, -506109280, 556402816, 610180096, 667974272, 730482688, 796728256, 864836224, 933754880, 1002700352, 1069331456, -1129822848, 1180747776, 1219959168, 1245454080, 1254418176, 1244496256, 1215806464, 1170467200, 1109940864, 1034459008, -945641216, 847554880, 743703680, 634964736, 522334048, 409629280, 301142176, 198468288, 102261024, 15424301, --58399208, -118443920, -166344624, -202983920, -228296832, -243548272, -251478384, -254185296, -252344368, -246456496, --237761344, -227809360, -217644784, -207521552, -197397776, -187577872, -178339920, -168868448, -157501280, -143418624, --127228208, -109625816, -90643672, -70704288, -51351164, -34363496, -20870320, -11671574, -7842611, -10806138, --21989696, -42191076, -71323840, -109272560, -156607936, -213349280, -277530592, -346465888, -418796896, -493406368, --567116608, -635954752, -698211328, -753866624, -801667456, -839523328, -867368640, -886954240, -899010176, -902935808, --899064448, -889133376, -874578816, -855873728, -833484544, -808545280, -782657920, -757145856, -732274752, -707778944, --684467456, -663835520, -645579200, -627796992, -610332544, -594772992, -580344064, -563827712, -544390336, -523586592, --499708160, -467863136, -426242208, -375602400, -312369216, -230306880, -129177048, -13320841, 116749560, 260566000, -407468928, 542101120, 656437952, 742504256, 780045504, 750219648, 653257024, 490681760, 248766112, -54896660, --315592576, -397934080, -278208128, -86560232, 26632556, 32959042, 5339181, -1480690, 3817152, 1295470, --3219078, -542240, 2632278, 140123, -2107218, 150324, 1763084, -252329, -1420024, 335007, -1135482, -409633, -951335, 375810, 700080, -432181, -585189, 369904, 397821, -374736, --287226, 331786, 177167, -271657, -49392, 255014, 3758, -143345, 130460, }, +560026688, 580181376, 651761280, 741916928, 808227456, 843835456, 857312512, 837136384, 774951680, 706217152, +679031104, 684954432, 669311040, 616302016, 573348608, 574092160, 586936832, 569456832, 532186720, 511266464, +508753920, 500068416, 481083584, 469860832, 471176704, 471000064, 463027008, 456938336, 460991712, 472953760, +487162560, 498884064, 503802880, 502036032, 500722304, 507399392, 523648864, 547635712, 577758464, 611217856, +643876800, 673844416, 701608704, 726164096, 744914304, 757558144, 766675264, 774677376, 782670272, 791276352, +800164224, 807529536, 811386944, 810441536, 803607680, 790492480, 772253888, 750109056, 723654208, 692558656, +658613376, 623875136, 588272000, 551226816, 513920224, 477741024, 442319360, 407270816, 374342368, 346103488, +324013952, 308986912, 302183712, 304083136, 314027616, 331233792, 355143872, 384909600, 419871168, 460244416, +506109280, 556402816, 610180096, 667974272, 730482688, 796728256, 864836224, 933754880, 1002700352, 1069331456, +1129822848, 1180747776, 1219959168, 1245454080, 1254418176, 1244496256, 1215806464, 1170467200, 1109940864, 1034459008, +945641216, 847554880, 743703680, 634964736, 522334048, 409629280, 301142176, 198468288, 102261024, 15424301, +-58399208, -118443920, -166344624, -202983920, -228296832, -243548272, -251478384, -254185296, -252344368, -246456496, +-237761344, -227809360, -217644784, -207521552, -197397776, -187577872, -178339920, -168868448, -157501280, -143418624, +-127228208, -109625816, -90643672, -70704288, -51351164, -34363496, -20870320, -11671574, -7842611, -10806138, +-21989696, -42191076, -71323840, -109272560, -156607936, -213349280, -277530592, -346465888, -418796896, -493406368, +-567116608, -635954752, -698211328, -753866624, -801667456, -839523328, -867368640, -886954240, -899010176, -902935808, +-899064448, -889133376, -874578816, -855873728, -833484544, -808545280, -782657920, -757145856, -732274752, -707778944, +-684467456, -663835520, -645579200, -627796992, -610332544, -594772992, -580344064, -563827712, -544390336, -523586592, +-499708160, -467863136, -426242208, -375602400, -312369216, -230306880, -129177048, -13320841, 116749560, 260566000, +407468928, 542101120, 656437952, 742504256, 780045504, 750219648, 653257024, 490681760, 248766112, -54896660, +-315592576, -397934080, -278208128, -86560232, 26632556, 32959042, 5339181, -1480690, 3817152, 1295470, +-3219078, -542240, 2632278, 140123, -2107218, 150324, 1763084, -252329, -1420024, 335007, +1135482, -409633, -951335, 375810, 700080, -432181, -585189, 369904, 397821, -374736, +-287226, 331786, 177167, -271657, -49392, 255014, 3758, -143345, 130460, }, { 486143040, -364342624, 167167104, -39809516, -210170464, -331450144, -400646368, -397819200, -302972896, -136612176, 38106024, -162898976, 224026560, 241295024, 232041520, 197469712, 137426608, 64054068, -4851703, -61337500, -109474424, --150905280, -174555520, -167025904, -129885720, -78476568, -24754580, 29452202, 81586128, 121351616, 139262704, -135213088, 114415248, 80613848, 37157372, -10004053, -54111756, -89473832, -110401064, -112610824, -97661648, --72609104, -43728672, -13062606, 18713172, 49372260, 75726712, 94291712, 100883952, 92121144, 68263672, -33529736, -5985574, -43577812, -72516768, -87965760, -88946088, -77864536, -58571544, -35153772, -11158862, -11494943, 32676648, 52577380, 70250632, 83405584, 88749056, 82459080, 61465276, 25380036, -22145926, --73177112, -116362472, -139532752, -134017472, -98660232, -41028212, 24821152, 82922936, 120561880, 131824896, -117951616, 85022632, 41123240, -5562520, -47731044, -79383344, -96038152, -95309080, -77927888, -48202416, --13012140, 20197620, 45314052, 58828168, 60328184, 52038896, 37601900, 20818780, 4846334, -8215736, --17446694, -22883586, -25109990, -24932286, -23152558, -20329690, -16650514, -12021077, -6245420, 798864, -8900783, 17241072, 24407762, 28773060, 28998008, 24451786, 15506443, 3594351, -9093520, -20161114, --27564026, -30052960, -27466316, -20724828, -11460583, -1493038, 7592429, 14678588, 19193672, 21027624, -20345796, 17446158, 12731357, 6713571, 0, -6703370, -12594455, -16858284, -18838800, -18180596, --14910516, -9489730, -2803540, 4010963, 9847823, 13867913, 15613280, 15064061, 12602508, 8839043, -4398047, -165893, -4359392, -7796440, -10248329, -11593190, -11739756, -10663330, -8444443, -5230197, --1233729, 3169686, 7443715, 11014444, 13337484, 13909788, 12430172, 8997956, 4060355, -1731409, --7519414, -12302934, -15287936, -16097001, -14592688, -10806138, -5191542, 1425929, 8293582, 14696841, -19480362, 21246130, 19167366, 13080323, 3120831, -9589051, -21958020, -29879550, -30411590, -22520124, --6946573, 12622372, 29110214, 35555348, 29511258, 13119514, -8797704, -27741730, -32343788, -17748952, -5345624, 18192944, 13360033, 1357210, -4248260, -2078227, 543313, 91268, -795643, -256087, -223875, -275952, -562641, -71941, 215285, -70867, -133681, 248034, 392990, 158377, -103616, 299574, 277025, 19327, -73014, -4295, -89121, -279710, -303869, -215822, --225486, -260919, -163209, -23085, 32212, 82141, 196495, 271657, 263604, }, +364342624, 167167104, -39809516, -210170464, -331450144, -400646368, -397819200, -302972896, -136612176, 38106024, +162898976, 224026560, 241295024, 232041520, 197469712, 137426608, 64054068, -4851703, -61337500, -109474424, +-150905280, -174555520, -167025904, -129885720, -78476568, -24754580, 29452202, 81586128, 121351616, 139262704, +135213088, 114415248, 80613848, 37157372, -10004053, -54111756, -89473832, -110401064, -112610824, -97661648, +-72609104, -43728672, -13062606, 18713172, 49372260, 75726712, 94291712, 100883952, 92121144, 68263672, +33529736, -5985574, -43577812, -72516768, -87965760, -88946088, -77864536, -58571544, -35153772, -11158862, +11494943, 32676648, 52577380, 70250632, 83405584, 88749056, 82459080, 61465276, 25380036, -22145926, +-73177112, -116362472, -139532752, -134017472, -98660232, -41028212, 24821152, 82922936, 120561880, 131824896, +117951616, 85022632, 41123240, -5562520, -47731044, -79383344, -96038152, -95309080, -77927888, -48202416, +-13012140, 20197620, 45314052, 58828168, 60328184, 52038896, 37601900, 20818780, 4846334, -8215736, +-17446694, -22883586, -25109990, -24932286, -23152558, -20329690, -16650514, -12021077, -6245420, 798864, +8900783, 17241072, 24407762, 28773060, 28998008, 24451786, 15506443, 3594351, -9093520, -20161114, +-27564026, -30052960, -27466316, -20724828, -11460583, -1493038, 7592429, 14678588, 19193672, 21027624, +20345796, 17446158, 12731357, 6713571, 0, -6703370, -12594455, -16858284, -18838800, -18180596, +-14910516, -9489730, -2803540, 4010963, 9847823, 13867913, 15613280, 15064061, 12602508, 8839043, +4398047, -165893, -4359392, -7796440, -10248329, -11593190, -11739756, -10663330, -8444443, -5230197, +-1233729, 3169686, 7443715, 11014444, 13337484, 13909788, 12430172, 8997956, 4060355, -1731409, +-7519414, -12302934, -15287936, -16097001, -14592688, -10806138, -5191542, 1425929, 8293582, 14696841, +19480362, 21246130, 19167366, 13080323, 3120831, -9589051, -21958020, -29879550, -30411590, -22520124, +-6946573, 12622372, 29110214, 35555348, 29511258, 13119514, -8797704, -27741730, -32343788, -17748952, +5345624, 18192944, 13360033, 1357210, -4248260, -2078227, 543313, 91268, -795643, -256087, +223875, -275952, -562641, -71941, 215285, -70867, -133681, 248034, 392990, 158377, +103616, 299574, 277025, 19327, -73014, -4295, -89121, -279710, -303869, -215822, +-225486, -260919, -163209, -23085, 32212, 82141, 196495, 271657, 263604, }, }, { { 486143040, -364342624, 167167104, -39809516, -210170464, -331450144, -400646368, -397819200, -302972896, -136612176, 38106024, -162898976, 224026560, 241295024, 232041520, 197469712, 137426608, 64054068, -4851703, -61337500, -109474424, --150905280, -174555520, -167025904, -129885720, -78476568, -24754580, 29452202, 81586128, 121351616, 139262704, -135213088, 114415248, 80613848, 37157372, -10004053, -54111756, -89473832, -110401064, -112610824, -97661648, --72609104, -43728672, -13062606, 18713172, 49372260, 75726712, 94291712, 100883952, 92121144, 68263672, -33529736, -5985574, -43577812, -72516768, -87965760, -88946088, -77864536, -58571544, -35153772, -11158862, -11494943, 32676648, 52577380, 70250632, 83405584, 88749056, 82459080, 61465276, 25380036, -22145926, --73177112, -116362472, -139532752, -134017472, -98660232, -41028212, 24821152, 82922936, 120561880, 131824896, -117951616, 85022632, 41123240, -5562520, -47731044, -79383344, -96038152, -95309080, -77927888, -48202416, --13012140, 20197620, 45314052, 58828168, 60328184, 52038896, 37601900, 20818780, 4846334, -8215736, --17446694, -22883586, -25109990, -24932286, -23152558, -20329690, -16650514, -12021077, -6245420, 798864, -8900783, 17241072, 24407762, 28773060, 28998008, 24451786, 15506443, 3594351, -9093520, -20161114, --27564026, -30052960, -27466316, -20724828, -11460583, -1493038, 7592429, 14678588, 19193672, 21027624, -20345796, 17446158, 12731357, 6713571, 0, -6703370, -12594455, -16858284, -18838800, -18180596, --14910516, -9489730, -2803540, 4010963, 9847823, 13867913, 15613280, 15064061, 12602508, 8839043, -4398047, -165893, -4359392, -7796440, -10248329, -11593190, -11739756, -10663330, -8444443, -5230197, --1233729, 3169686, 7443715, 11014444, 13337484, 13909788, 12430172, 8997956, 4060355, -1731409, --7519414, -12302934, -15287936, -16097001, -14592688, -10806138, -5191542, 1425929, 8293582, 14696841, -19480362, 21246130, 19167366, 13080323, 3120831, -9589051, -21958020, -29879550, -30411590, -22520124, --6946573, 12622372, 29110214, 35555348, 29511258, 13119514, -8797704, -27741730, -32343788, -17748952, -5345624, 18192944, 13360033, 1357210, -4248260, -2078227, 543313, 91268, -795643, -256087, -223875, -275952, -562641, -71941, 215285, -70867, -133681, 248034, 392990, 158377, -103616, 299574, 277025, 19327, -73014, -4295, -89121, -279710, -303869, -215822, --225486, -260919, -163209, -23085, 32212, 82141, 196495, 271657, 263604, }, +364342624, 167167104, -39809516, -210170464, -331450144, -400646368, -397819200, -302972896, -136612176, 38106024, +162898976, 224026560, 241295024, 232041520, 197469712, 137426608, 64054068, -4851703, -61337500, -109474424, +-150905280, -174555520, -167025904, -129885720, -78476568, -24754580, 29452202, 81586128, 121351616, 139262704, +135213088, 114415248, 80613848, 37157372, -10004053, -54111756, -89473832, -110401064, -112610824, -97661648, +-72609104, -43728672, -13062606, 18713172, 49372260, 75726712, 94291712, 100883952, 92121144, 68263672, +33529736, -5985574, -43577812, -72516768, -87965760, -88946088, -77864536, -58571544, -35153772, -11158862, +11494943, 32676648, 52577380, 70250632, 83405584, 88749056, 82459080, 61465276, 25380036, -22145926, +-73177112, -116362472, -139532752, -134017472, -98660232, -41028212, 24821152, 82922936, 120561880, 131824896, +117951616, 85022632, 41123240, -5562520, -47731044, -79383344, -96038152, -95309080, -77927888, -48202416, +-13012140, 20197620, 45314052, 58828168, 60328184, 52038896, 37601900, 20818780, 4846334, -8215736, +-17446694, -22883586, -25109990, -24932286, -23152558, -20329690, -16650514, -12021077, -6245420, 798864, +8900783, 17241072, 24407762, 28773060, 28998008, 24451786, 15506443, 3594351, -9093520, -20161114, +-27564026, -30052960, -27466316, -20724828, -11460583, -1493038, 7592429, 14678588, 19193672, 21027624, +20345796, 17446158, 12731357, 6713571, 0, -6703370, -12594455, -16858284, -18838800, -18180596, +-14910516, -9489730, -2803540, 4010963, 9847823, 13867913, 15613280, 15064061, 12602508, 8839043, +4398047, -165893, -4359392, -7796440, -10248329, -11593190, -11739756, -10663330, -8444443, -5230197, +-1233729, 3169686, 7443715, 11014444, 13337484, 13909788, 12430172, 8997956, 4060355, -1731409, +-7519414, -12302934, -15287936, -16097001, -14592688, -10806138, -5191542, 1425929, 8293582, 14696841, +19480362, 21246130, 19167366, 13080323, 3120831, -9589051, -21958020, -29879550, -30411590, -22520124, +-6946573, 12622372, 29110214, 35555348, 29511258, 13119514, -8797704, -27741730, -32343788, -17748952, +5345624, 18192944, 13360033, 1357210, -4248260, -2078227, 543313, 91268, -795643, -256087, +223875, -275952, -562641, -71941, 215285, -70867, -133681, 248034, 392990, 158377, +103616, 299574, 277025, 19327, -73014, -4295, -89121, -279710, -303869, -215822, +-225486, -260919, -163209, -23085, 32212, 82141, 196495, 271657, 263604, }, { 570948288, -560026688, 580181376, 651761280, 741916928, 808227456, 843835456, 857312512, 837136384, 774951680, 706217152, -679031104, 684954432, 669311040, 616302016, 573348608, 574092160, 586936832, 569456832, 532186720, 511266464, -508753920, 500068416, 481083584, 469860832, 471176704, 471000064, 463027008, 456938336, 460991712, 472953760, -487162560, 498884064, 503802880, 502036032, 500722304, 507399392, 523648864, 547635712, 577758464, 611217856, -643876800, 673844416, 701608704, 726164096, 744914304, 757558144, 766675264, 774677376, 782670272, 791276352, -800164224, 807529536, 811386944, 810441536, 803607680, 790492480, 772253888, 750109056, 723654208, 692558656, -658613376, 623875136, 588272000, 551226816, 513920224, 477741024, 442319360, 407270816, 374342368, 346103488, -324013952, 308986912, 302183712, 304083136, 314027616, 331233792, 355143872, 384909600, 419871168, 460244416, -506109280, 556402816, 610180096, 667974272, 730482688, 796728256, 864836224, 933754880, 1002700352, 1069331456, -1129822848, 1180747776, 1219959168, 1245454080, 1254418176, 1244496256, 1215806464, 1170467200, 1109940864, 1034459008, -945641216, 847554880, 743703680, 634964736, 522334048, 409629280, 301142176, 198468288, 102261024, 15424301, --58399208, -118443920, -166344624, -202983920, -228296832, -243548272, -251478384, -254185296, -252344368, -246456496, --237761344, -227809360, -217644784, -207521552, -197397776, -187577872, -178339920, -168868448, -157501280, -143418624, --127228208, -109625816, -90643672, -70704288, -51351164, -34363496, -20870320, -11671574, -7842611, -10806138, --21989696, -42191076, -71323840, -109272560, -156607936, -213349280, -277530592, -346465888, -418796896, -493406368, --567116608, -635954752, -698211328, -753866624, -801667456, -839523328, -867368640, -886954240, -899010176, -902935808, --899064448, -889133376, -874578816, -855873728, -833484544, -808545280, -782657920, -757145856, -732274752, -707778944, --684467456, -663835520, -645579200, -627796992, -610332544, -594772992, -580344064, -563827712, -544390336, -523586592, --499708160, -467863136, -426242208, -375602400, -312369216, -230306880, -129177048, -13320841, 116749560, 260566000, -407468928, 542101120, 656437952, 742504256, 780045504, 750219648, 653257024, 490681760, 248766112, -54896660, --315592576, -397934080, -278208128, -86560232, 26632556, 32959042, 5339181, -1480690, 3817152, 1295470, --3219078, -542240, 2632278, 140123, -2107218, 150324, 1763084, -252329, -1420024, 335007, -1135482, -409633, -951335, 375810, 700080, -432181, -585189, 369904, 397821, -374736, --287226, 331786, 177167, -271657, -49392, 255014, 3758, -143345, 130460, }, +560026688, 580181376, 651761280, 741916928, 808227456, 843835456, 857312512, 837136384, 774951680, 706217152, +679031104, 684954432, 669311040, 616302016, 573348608, 574092160, 586936832, 569456832, 532186720, 511266464, +508753920, 500068416, 481083584, 469860832, 471176704, 471000064, 463027008, 456938336, 460991712, 472953760, +487162560, 498884064, 503802880, 502036032, 500722304, 507399392, 523648864, 547635712, 577758464, 611217856, +643876800, 673844416, 701608704, 726164096, 744914304, 757558144, 766675264, 774677376, 782670272, 791276352, +800164224, 807529536, 811386944, 810441536, 803607680, 790492480, 772253888, 750109056, 723654208, 692558656, +658613376, 623875136, 588272000, 551226816, 513920224, 477741024, 442319360, 407270816, 374342368, 346103488, +324013952, 308986912, 302183712, 304083136, 314027616, 331233792, 355143872, 384909600, 419871168, 460244416, +506109280, 556402816, 610180096, 667974272, 730482688, 796728256, 864836224, 933754880, 1002700352, 1069331456, +1129822848, 1180747776, 1219959168, 1245454080, 1254418176, 1244496256, 1215806464, 1170467200, 1109940864, 1034459008, +945641216, 847554880, 743703680, 634964736, 522334048, 409629280, 301142176, 198468288, 102261024, 15424301, +-58399208, -118443920, -166344624, -202983920, -228296832, -243548272, -251478384, -254185296, -252344368, -246456496, +-237761344, -227809360, -217644784, -207521552, -197397776, -187577872, -178339920, -168868448, -157501280, -143418624, +-127228208, -109625816, -90643672, -70704288, -51351164, -34363496, -20870320, -11671574, -7842611, -10806138, +-21989696, -42191076, -71323840, -109272560, -156607936, -213349280, -277530592, -346465888, -418796896, -493406368, +-567116608, -635954752, -698211328, -753866624, -801667456, -839523328, -867368640, -886954240, -899010176, -902935808, +-899064448, -889133376, -874578816, -855873728, -833484544, -808545280, -782657920, -757145856, -732274752, -707778944, +-684467456, -663835520, -645579200, -627796992, -610332544, -594772992, -580344064, -563827712, -544390336, -523586592, +-499708160, -467863136, -426242208, -375602400, -312369216, -230306880, -129177048, -13320841, 116749560, 260566000, +407468928, 542101120, 656437952, 742504256, 780045504, 750219648, 653257024, 490681760, 248766112, -54896660, +-315592576, -397934080, -278208128, -86560232, 26632556, 32959042, 5339181, -1480690, 3817152, 1295470, +-3219078, -542240, 2632278, 140123, -2107218, 150324, 1763084, -252329, -1420024, 335007, +1135482, -409633, -951335, 375810, 700080, -432181, -585189, 369904, 397821, -374736, +-287226, 331786, 177167, -271657, -49392, 255014, 3758, -143345, 130460, }, }, { { 585517888, -603768768, 627174208, 672103296, 761459584, 857675968, 888617472, 849407616, 807566592, 792039744, 753588544, -665247488, 586939520, 580662912, 620325888, 642416512, 641460352, 654848832, 684151232, 694853760, 681777728, -678236032, 698247872, 713505216, 696568512, 655880192, 618497280, 599802944, 597858880, 602115776, 602125952, -598339392, 606265216, 640826304, 696614144, 752099776, 792209408, 818164416, 836594112, 849271232, 855984832, -860132160, 867262912, 880720640, 900384576, 923915648, 948425984, 971895296, 993049024, 1009658240, 1018224000, -1016310592, 1004292736, 984205184, 958115904, 928455424, 898594112, 871473024, 847765312, 826018304, 804140800, -779889280, 750238976, 711679296, 662058496, 601978304, 534215008, 462380064, 390642304, 323834624, 266263808, -220085392, 185562992, 162854416, 152585152, 154569968, 167094624, 188017024, 216053504, 250726768, 291603040, -337903328, 388500736, 441990784, 496750016, 550902592, 602529152, 650644608, 696202944, 741374720, 787388864, -833677824, 879251776, 923515136, 964723712, 998794112, 1021126336, 1029023680, 1021009280, 994659136, 947367808, -879430016, 794493248, 696595904, 588685376, 474664768, 360498080, 251361344, 148936048, 53078280, -35200480, --114485040, -185632784, -251139088, -311828032, -366206080, -413158144, -453193152, -486505984, -511755552, -527891744, --535970048, -538049344, -535165280, -527439712, -515578624, -500989696, -484397152, -465294208, -443159552, -418643360, --393136064, -367567072, -342242336, -317726112, -295226912, -275897952, -260195024, -248294736, -240972368, -239713392, --245919088, -260263200, -283061440, -314996128, -356768960, -407775456, -465772032, -528284736, -593519936, -659180864, --721473408, -776672896, -823061248, -860024256, -886102208, -899678592, -901019200, -891726464, -872470016, -843046784, --804458624, -759121536, -709012672, -655144640, -598906368, -542581056, -488293760, -437264704, -390185440, -347831136, --311187008, -280902688, -256568992, -237137488, -222288720, -212319568, -206354384, -202389600, -199712752, -198990128, --199218832, -197380592, -191855648, -182596240, -167102688, -140601120, -101198016, -50129248, 13270375, 90374168, -176566640, 262803680, 343406784, 413509248, 460463456, 469743264, 437460672, 362457664, 232589120, 48323752, --135371456, -227771248, -189644816, -81659680, -712965, 16642998, 4131222, -1096290, 1920924, 1211181, --1720134, -702764, 1472100, 416075, -1187022, -164819, 1025960, 63888, -841277, 14496, -667867, -108448, -586263, 91268, 417686, -167504, -371515, 130997, 248571, -156766, --188979, 143345, 129386, -107911, -42950, 121870, 37581, -40802, 61203, }, +603768768, 627174208, 672103296, 761459584, 857675968, 888617472, 849407616, 807566592, 792039744, 753588544, +665247488, 586939520, 580662912, 620325888, 642416512, 641460352, 654848832, 684151232, 694853760, 681777728, +678236032, 698247872, 713505216, 696568512, 655880192, 618497280, 599802944, 597858880, 602115776, 602125952, +598339392, 606265216, 640826304, 696614144, 752099776, 792209408, 818164416, 836594112, 849271232, 855984832, +860132160, 867262912, 880720640, 900384576, 923915648, 948425984, 971895296, 993049024, 1009658240, 1018224000, +1016310592, 1004292736, 984205184, 958115904, 928455424, 898594112, 871473024, 847765312, 826018304, 804140800, +779889280, 750238976, 711679296, 662058496, 601978304, 534215008, 462380064, 390642304, 323834624, 266263808, +220085392, 185562992, 162854416, 152585152, 154569968, 167094624, 188017024, 216053504, 250726768, 291603040, +337903328, 388500736, 441990784, 496750016, 550902592, 602529152, 650644608, 696202944, 741374720, 787388864, +833677824, 879251776, 923515136, 964723712, 998794112, 1021126336, 1029023680, 1021009280, 994659136, 947367808, +879430016, 794493248, 696595904, 588685376, 474664768, 360498080, 251361344, 148936048, 53078280, -35200480, +-114485040, -185632784, -251139088, -311828032, -366206080, -413158144, -453193152, -486505984, -511755552, -527891744, +-535970048, -538049344, -535165280, -527439712, -515578624, -500989696, -484397152, -465294208, -443159552, -418643360, +-393136064, -367567072, -342242336, -317726112, -295226912, -275897952, -260195024, -248294736, -240972368, -239713392, +-245919088, -260263200, -283061440, -314996128, -356768960, -407775456, -465772032, -528284736, -593519936, -659180864, +-721473408, -776672896, -823061248, -860024256, -886102208, -899678592, -901019200, -891726464, -872470016, -843046784, +-804458624, -759121536, -709012672, -655144640, -598906368, -542581056, -488293760, -437264704, -390185440, -347831136, +-311187008, -280902688, -256568992, -237137488, -222288720, -212319568, -206354384, -202389600, -199712752, -198990128, +-199218832, -197380592, -191855648, -182596240, -167102688, -140601120, -101198016, -50129248, 13270375, 90374168, +176566640, 262803680, 343406784, 413509248, 460463456, 469743264, 437460672, 362457664, 232589120, 48323752, +-135371456, -227771248, -189644816, -81659680, -712965, 16642998, 4131222, -1096290, 1920924, 1211181, +-1720134, -702764, 1472100, 416075, -1187022, -164819, 1025960, 63888, -841277, 14496, +667867, -108448, -586263, 91268, 417686, -167504, -371515, 130997, 248571, -156766, +-188979, 143345, 129386, -107911, -42950, 121870, 37581, -40802, 61203, }, { 492458816, -349794496, 129527088, -96207264, -288197664, -422264544, -462296864, -379511904, -194033200, 25005300, 207826496, -323443264, 371411584, 352320992, 261544720, 108599856, -70567920, -227162960, -323923200, -346284416, -296182016, --183876672, -29744260, 131055560, 255829184, 313094528, 295361152, 215104848, 93717264, -42967388, -164946064, --244086752, -264142640, -224621424, -137462576, -23976654, 87305408, 168234944, 202542608, 190500048, 142876384, -72989744, -5356361, -77092512, -128115656, -149521776, -139468320, -102299144, -47389596, 12211129, 62995360, -95328408, 105811888, 96282432, 71339944, 36839544, -556198, -34204044, -58991912, -72233296, -73333344, --63195076, -44117904, -19546396, 6851547, 31963146, 53144316, 67774584, 73123432, 66496832, 45960980, -12265353, -28991566, -67493800, -91713656, -93705984, -72288056, -33486250, 11548093, 50563040, 74676056, -80886048, 71364640, 50734300, 23636816, -6165426, -35329328, -59969016, -75204880, -76068704, -59759640, --28084254, 11696807, 48752172, 72719704, 77735152, 64218888, 37776384, 6369974, -22525492, -43672300, --54536956, -54899344, -46179488, -30768072, -11426224, 9098351, 28132572, 42993160, 51108500, 50401440, -39848168, 20178830, -5488432, -31690416, -51811800, -60119880, -53805740, -34228740, -6758668, 20978768, -41781980, 51145544, 48185776, 35227320, 16558710, -3080565, -19743964, -30885646, -35407712, -33469070, --26164940, -15119359, -2183454, 10665478, 21432960, 28376848, 30299920, 26755498, 18218714, 6157373, --7192997, -19282256, -27701466, -30641370, -27364848, -18465676, -5731634, 8220568, 20392504, 28074054, -29621852, 24886114, 15098421, 2502892, -10116795, -20106890, -25608742, -25818660, -20939576, -12112345, --1234266, 9513889, 18153754, 23138600, 23540178, 19303194, 11266236, 916439, -9779104, -18561774, --23449448, -23363012, -18262738, -9059160, 2299418, 13110388, 20908974, 24199994, 22317724, 15349676, -4602595, -7508140, -18427020, -25810606, -27186070, -20816096, -7585449, 8796093, 23526758, 31803160, -29438780, 15509664, -4955856, -23095650, -31586264, -27039504, -9897752, 13072270, 27832998, 22847616, -2806761, -13591961, -13608604, -3265249, 3494493, 2470143, -91268, 244276, 1340567, 833224, -1611, 189515, 360240, -318364, -882079, -673773, -454193, -654446, -615254, -68183, -355945, 403727, 528818, 820339, 833224, 507880, 234076, 67646, -243203, -622233, --778463, -736050, -680752, -548145, -228170, 137976, 404264, 624381, 802085, }, +349794496, 129527088, -96207264, -288197664, -422264544, -462296864, -379511904, -194033200, 25005300, 207826496, +323443264, 371411584, 352320992, 261544720, 108599856, -70567920, -227162960, -323923200, -346284416, -296182016, +-183876672, -29744260, 131055560, 255829184, 313094528, 295361152, 215104848, 93717264, -42967388, -164946064, +-244086752, -264142640, -224621424, -137462576, -23976654, 87305408, 168234944, 202542608, 190500048, 142876384, +72989744, -5356361, -77092512, -128115656, -149521776, -139468320, -102299144, -47389596, 12211129, 62995360, +95328408, 105811888, 96282432, 71339944, 36839544, -556198, -34204044, -58991912, -72233296, -73333344, +-63195076, -44117904, -19546396, 6851547, 31963146, 53144316, 67774584, 73123432, 66496832, 45960980, +12265353, -28991566, -67493800, -91713656, -93705984, -72288056, -33486250, 11548093, 50563040, 74676056, +80886048, 71364640, 50734300, 23636816, -6165426, -35329328, -59969016, -75204880, -76068704, -59759640, +-28084254, 11696807, 48752172, 72719704, 77735152, 64218888, 37776384, 6369974, -22525492, -43672300, +-54536956, -54899344, -46179488, -30768072, -11426224, 9098351, 28132572, 42993160, 51108500, 50401440, +39848168, 20178830, -5488432, -31690416, -51811800, -60119880, -53805740, -34228740, -6758668, 20978768, +41781980, 51145544, 48185776, 35227320, 16558710, -3080565, -19743964, -30885646, -35407712, -33469070, +-26164940, -15119359, -2183454, 10665478, 21432960, 28376848, 30299920, 26755498, 18218714, 6157373, +-7192997, -19282256, -27701466, -30641370, -27364848, -18465676, -5731634, 8220568, 20392504, 28074054, +29621852, 24886114, 15098421, 2502892, -10116795, -20106890, -25608742, -25818660, -20939576, -12112345, +-1234266, 9513889, 18153754, 23138600, 23540178, 19303194, 11266236, 916439, -9779104, -18561774, +-23449448, -23363012, -18262738, -9059160, 2299418, 13110388, 20908974, 24199994, 22317724, 15349676, +4602595, -7508140, -18427020, -25810606, -27186070, -20816096, -7585449, 8796093, 23526758, 31803160, +29438780, 15509664, -4955856, -23095650, -31586264, -27039504, -9897752, 13072270, 27832998, 22847616, +2806761, -13591961, -13608604, -3265249, 3494493, 2470143, -91268, 244276, 1340567, 833224, +1611, 189515, 360240, -318364, -882079, -673773, -454193, -654446, -615254, -68183, +355945, 403727, 528818, 820339, 833224, 507880, 234076, 67646, -243203, -622233, +-778463, -736050, -680752, -548145, -228170, 137976, 404264, 624381, 802085, }, }, { { 492458816, -349794496, 129527088, -96207264, -288197664, -422264544, -462296864, -379511904, -194033200, 25005300, 207826496, -323443264, 371411584, 352320992, 261544720, 108599856, -70567920, -227162960, -323923200, -346284416, -296182016, --183876672, -29744260, 131055560, 255829184, 313094528, 295361152, 215104848, 93717264, -42967388, -164946064, --244086752, -264142640, -224621424, -137462576, -23976654, 87305408, 168234944, 202542608, 190500048, 142876384, -72989744, -5356361, -77092512, -128115656, -149521776, -139468320, -102299144, -47389596, 12211129, 62995360, -95328408, 105811888, 96282432, 71339944, 36839544, -556198, -34204044, -58991912, -72233296, -73333344, --63195076, -44117904, -19546396, 6851547, 31963146, 53144316, 67774584, 73123432, 66496832, 45960980, -12265353, -28991566, -67493800, -91713656, -93705984, -72288056, -33486250, 11548093, 50563040, 74676056, -80886048, 71364640, 50734300, 23636816, -6165426, -35329328, -59969016, -75204880, -76068704, -59759640, --28084254, 11696807, 48752172, 72719704, 77735152, 64218888, 37776384, 6369974, -22525492, -43672300, --54536956, -54899344, -46179488, -30768072, -11426224, 9098351, 28132572, 42993160, 51108500, 50401440, -39848168, 20178830, -5488432, -31690416, -51811800, -60119880, -53805740, -34228740, -6758668, 20978768, -41781980, 51145544, 48185776, 35227320, 16558710, -3080565, -19743964, -30885646, -35407712, -33469070, --26164940, -15119359, -2183454, 10665478, 21432960, 28376848, 30299920, 26755498, 18218714, 6157373, --7192997, -19282256, -27701466, -30641370, -27364848, -18465676, -5731634, 8220568, 20392504, 28074054, -29621852, 24886114, 15098421, 2502892, -10116795, -20106890, -25608742, -25818660, -20939576, -12112345, --1234266, 9513889, 18153754, 23138600, 23540178, 19303194, 11266236, 916439, -9779104, -18561774, --23449448, -23363012, -18262738, -9059160, 2299418, 13110388, 20908974, 24199994, 22317724, 15349676, -4602595, -7508140, -18427020, -25810606, -27186070, -20816096, -7585449, 8796093, 23526758, 31803160, -29438780, 15509664, -4955856, -23095650, -31586264, -27039504, -9897752, 13072270, 27832998, 22847616, -2806761, -13591961, -13608604, -3265249, 3494493, 2470143, -91268, 244276, 1340567, 833224, -1611, 189515, 360240, -318364, -882079, -673773, -454193, -654446, -615254, -68183, -355945, 403727, 528818, 820339, 833224, 507880, 234076, 67646, -243203, -622233, --778463, -736050, -680752, -548145, -228170, 137976, 404264, 624381, 802085, }, +349794496, 129527088, -96207264, -288197664, -422264544, -462296864, -379511904, -194033200, 25005300, 207826496, +323443264, 371411584, 352320992, 261544720, 108599856, -70567920, -227162960, -323923200, -346284416, -296182016, +-183876672, -29744260, 131055560, 255829184, 313094528, 295361152, 215104848, 93717264, -42967388, -164946064, +-244086752, -264142640, -224621424, -137462576, -23976654, 87305408, 168234944, 202542608, 190500048, 142876384, +72989744, -5356361, -77092512, -128115656, -149521776, -139468320, -102299144, -47389596, 12211129, 62995360, +95328408, 105811888, 96282432, 71339944, 36839544, -556198, -34204044, -58991912, -72233296, -73333344, +-63195076, -44117904, -19546396, 6851547, 31963146, 53144316, 67774584, 73123432, 66496832, 45960980, +12265353, -28991566, -67493800, -91713656, -93705984, -72288056, -33486250, 11548093, 50563040, 74676056, +80886048, 71364640, 50734300, 23636816, -6165426, -35329328, -59969016, -75204880, -76068704, -59759640, +-28084254, 11696807, 48752172, 72719704, 77735152, 64218888, 37776384, 6369974, -22525492, -43672300, +-54536956, -54899344, -46179488, -30768072, -11426224, 9098351, 28132572, 42993160, 51108500, 50401440, +39848168, 20178830, -5488432, -31690416, -51811800, -60119880, -53805740, -34228740, -6758668, 20978768, +41781980, 51145544, 48185776, 35227320, 16558710, -3080565, -19743964, -30885646, -35407712, -33469070, +-26164940, -15119359, -2183454, 10665478, 21432960, 28376848, 30299920, 26755498, 18218714, 6157373, +-7192997, -19282256, -27701466, -30641370, -27364848, -18465676, -5731634, 8220568, 20392504, 28074054, +29621852, 24886114, 15098421, 2502892, -10116795, -20106890, -25608742, -25818660, -20939576, -12112345, +-1234266, 9513889, 18153754, 23138600, 23540178, 19303194, 11266236, 916439, -9779104, -18561774, +-23449448, -23363012, -18262738, -9059160, 2299418, 13110388, 20908974, 24199994, 22317724, 15349676, +4602595, -7508140, -18427020, -25810606, -27186070, -20816096, -7585449, 8796093, 23526758, 31803160, +29438780, 15509664, -4955856, -23095650, -31586264, -27039504, -9897752, 13072270, 27832998, 22847616, +2806761, -13591961, -13608604, -3265249, 3494493, 2470143, -91268, 244276, 1340567, 833224, +1611, 189515, 360240, -318364, -882079, -673773, -454193, -654446, -615254, -68183, +355945, 403727, 528818, 820339, 833224, 507880, 234076, 67646, -243203, -622233, +-778463, -736050, -680752, -548145, -228170, 137976, 404264, 624381, 802085, }, { 585517888, -603768768, 627174208, 672103296, 761459584, 857675968, 888617472, 849407616, 807566592, 792039744, 753588544, -665247488, 586939520, 580662912, 620325888, 642416512, 641460352, 654848832, 684151232, 694853760, 681777728, -678236032, 698247872, 713505216, 696568512, 655880192, 618497280, 599802944, 597858880, 602115776, 602125952, -598339392, 606265216, 640826304, 696614144, 752099776, 792209408, 818164416, 836594112, 849271232, 855984832, -860132160, 867262912, 880720640, 900384576, 923915648, 948425984, 971895296, 993049024, 1009658240, 1018224000, -1016310592, 1004292736, 984205184, 958115904, 928455424, 898594112, 871473024, 847765312, 826018304, 804140800, -779889280, 750238976, 711679296, 662058496, 601978304, 534215008, 462380064, 390642304, 323834624, 266263808, -220085392, 185562992, 162854416, 152585152, 154569968, 167094624, 188017024, 216053504, 250726768, 291603040, -337903328, 388500736, 441990784, 496750016, 550902592, 602529152, 650644608, 696202944, 741374720, 787388864, -833677824, 879251776, 923515136, 964723712, 998794112, 1021126336, 1029023680, 1021009280, 994659136, 947367808, -879430016, 794493248, 696595904, 588685376, 474664768, 360498080, 251361344, 148936048, 53078280, -35200480, --114485040, -185632784, -251139088, -311828032, -366206080, -413158144, -453193152, -486505984, -511755552, -527891744, --535970048, -538049344, -535165280, -527439712, -515578624, -500989696, -484397152, -465294208, -443159552, -418643360, --393136064, -367567072, -342242336, -317726112, -295226912, -275897952, -260195024, -248294736, -240972368, -239713392, --245919088, -260263200, -283061440, -314996128, -356768960, -407775456, -465772032, -528284736, -593519936, -659180864, --721473408, -776672896, -823061248, -860024256, -886102208, -899678592, -901019200, -891726464, -872470016, -843046784, --804458624, -759121536, -709012672, -655144640, -598906368, -542581056, -488293760, -437264704, -390185440, -347831136, --311187008, -280902688, -256568992, -237137488, -222288720, -212319568, -206354384, -202389600, -199712752, -198990128, --199218832, -197380592, -191855648, -182596240, -167102688, -140601120, -101198016, -50129248, 13270375, 90374168, -176566640, 262803680, 343406784, 413509248, 460463456, 469743264, 437460672, 362457664, 232589120, 48323752, --135371456, -227771248, -189644816, -81659680, -712965, 16642998, 4131222, -1096290, 1920924, 1211181, --1720134, -702764, 1472100, 416075, -1187022, -164819, 1025960, 63888, -841277, 14496, -667867, -108448, -586263, 91268, 417686, -167504, -371515, 130997, 248571, -156766, --188979, 143345, 129386, -107911, -42950, 121870, 37581, -40802, 61203, }, +603768768, 627174208, 672103296, 761459584, 857675968, 888617472, 849407616, 807566592, 792039744, 753588544, +665247488, 586939520, 580662912, 620325888, 642416512, 641460352, 654848832, 684151232, 694853760, 681777728, +678236032, 698247872, 713505216, 696568512, 655880192, 618497280, 599802944, 597858880, 602115776, 602125952, +598339392, 606265216, 640826304, 696614144, 752099776, 792209408, 818164416, 836594112, 849271232, 855984832, +860132160, 867262912, 880720640, 900384576, 923915648, 948425984, 971895296, 993049024, 1009658240, 1018224000, +1016310592, 1004292736, 984205184, 958115904, 928455424, 898594112, 871473024, 847765312, 826018304, 804140800, +779889280, 750238976, 711679296, 662058496, 601978304, 534215008, 462380064, 390642304, 323834624, 266263808, +220085392, 185562992, 162854416, 152585152, 154569968, 167094624, 188017024, 216053504, 250726768, 291603040, +337903328, 388500736, 441990784, 496750016, 550902592, 602529152, 650644608, 696202944, 741374720, 787388864, +833677824, 879251776, 923515136, 964723712, 998794112, 1021126336, 1029023680, 1021009280, 994659136, 947367808, +879430016, 794493248, 696595904, 588685376, 474664768, 360498080, 251361344, 148936048, 53078280, -35200480, +-114485040, -185632784, -251139088, -311828032, -366206080, -413158144, -453193152, -486505984, -511755552, -527891744, +-535970048, -538049344, -535165280, -527439712, -515578624, -500989696, -484397152, -465294208, -443159552, -418643360, +-393136064, -367567072, -342242336, -317726112, -295226912, -275897952, -260195024, -248294736, -240972368, -239713392, +-245919088, -260263200, -283061440, -314996128, -356768960, -407775456, -465772032, -528284736, -593519936, -659180864, +-721473408, -776672896, -823061248, -860024256, -886102208, -899678592, -901019200, -891726464, -872470016, -843046784, +-804458624, -759121536, -709012672, -655144640, -598906368, -542581056, -488293760, -437264704, -390185440, -347831136, +-311187008, -280902688, -256568992, -237137488, -222288720, -212319568, -206354384, -202389600, -199712752, -198990128, +-199218832, -197380592, -191855648, -182596240, -167102688, -140601120, -101198016, -50129248, 13270375, 90374168, +176566640, 262803680, 343406784, 413509248, 460463456, 469743264, 437460672, 362457664, 232589120, 48323752, +-135371456, -227771248, -189644816, -81659680, -712965, 16642998, 4131222, -1096290, 1920924, 1211181, +-1720134, -702764, 1472100, 416075, -1187022, -164819, 1025960, 63888, -841277, 14496, +667867, -108448, -586263, 91268, 417686, -167504, -371515, 130997, 248571, -156766, +-188979, 143345, 129386, -107911, -42950, 121870, 37581, -40802, 61203, }, }, { { 597213568, -596643456, 589774720, 572423040, 546464256, 513296896, 469925248, 426302880, 420621728, 490009600, 619773440, -746362240, 818147776, 830061504, 797643584, 733486464, 660355520, 611384320, 598772160, 608339712, 634336576, -687962496, 761336640, 817412288, 830826496, 811578624, 779512960, 745057664, 723017984, 733358144, 775793472, -828397184, 878846976, 933033856, 988564032, 1026026368, 1033997248, 1021642816, 1001205760, 976111296, 949339712, -926577472, 907651712, 887279552, 865113280, 845489024, 829484352, 815743680, 805347200, 798338304, 790169856, -778097728, 766046080, 758030080, 752204480, 745350784, 737406720, 728103232, 714701376, 696160000, 675283200, -654903040, 635414656, 616550080, 598197696, 579157568, 557310144, 530734464, 497799584, 457844064, 412453216, -364070944, 313385504, 260460240, 207604768, 157896416, 111621368, 67432600, 26114474, -9955734, -40010840, --64545844, -82950848, -94379760, -100110320, -102734008, -103747080, -103519448, -102710384, -102403832, -103430864, --106081400, -109889960, -113784424, -117140400, -120256936, -123273080, -125650880, -127430072, -129705328, -133059160, --136775920, -140245184, -143737520, -147170272, -149432112, -149540560, -147397904, -143076640, -136364672, -127245384, --116070952, -103235448, -89156008, -74332464, -59030032, -43270720, -27318676, -11630235, 3788161, 19364396, -35270808, 51383380, 67845448, 85084376, 103357848, 122716344, 143190448, 164647568, 186708128, 208921168, -230610208, 250557120, 267457280, 280695968, 290074560, 294978368, 294679840, 289356768, 279864896, 266521504, -249057632, 227865200, 204276704, 179287504, 152854672, 124924496, 96344168, 68000072, 39594228, 10161356, --20476794, -51754892, -83805552, -117771224, -154393344, -193238096, -233857216, -276860032, -323067456, -372146016, --422997376, -475317600, -529790656, -586465408, -643890240, -700616000, -756673408, -812224512, -865455744, -913745152, --956444672, -993991808, -1024540800, -1044644480, -1053249984, -1051286144, -1037245888, -1007591808, -961676992, -901270464, --825239296, -730415040, -617438080, -489367488, -345486080, -184001760, -9601399, 169511088, 349013344, 523518400, -678688576, 799189824, 878520512, 909441600, 875318080, 766932416, 594697792, 366670496, 80809272, -222708016, --426628768, -421689024, -237979312, -36925980, 50219440, 34310348, 3150359, -520765, 4166655, 107911, --3273302, 406948, 2525441, -611496, -1940788, 715649, 1552094, -683974, -1200443, 656593, -932545, -623307, -751082, 527744, 540629, -506269, -441845, 405874, 294742, -368293, --213675, 300648, 132070, -231928, -41339, 200790, 8590, -107374, 91805, }, +596643456, 589774720, 572423040, 546464256, 513296896, 469925248, 426302880, 420621728, 490009600, 619773440, +746362240, 818147776, 830061504, 797643584, 733486464, 660355520, 611384320, 598772160, 608339712, 634336576, +687962496, 761336640, 817412288, 830826496, 811578624, 779512960, 745057664, 723017984, 733358144, 775793472, +828397184, 878846976, 933033856, 988564032, 1026026368, 1033997248, 1021642816, 1001205760, 976111296, 949339712, +926577472, 907651712, 887279552, 865113280, 845489024, 829484352, 815743680, 805347200, 798338304, 790169856, +778097728, 766046080, 758030080, 752204480, 745350784, 737406720, 728103232, 714701376, 696160000, 675283200, +654903040, 635414656, 616550080, 598197696, 579157568, 557310144, 530734464, 497799584, 457844064, 412453216, +364070944, 313385504, 260460240, 207604768, 157896416, 111621368, 67432600, 26114474, -9955734, -40010840, +-64545844, -82950848, -94379760, -100110320, -102734008, -103747080, -103519448, -102710384, -102403832, -103430864, +-106081400, -109889960, -113784424, -117140400, -120256936, -123273080, -125650880, -127430072, -129705328, -133059160, +-136775920, -140245184, -143737520, -147170272, -149432112, -149540560, -147397904, -143076640, -136364672, -127245384, +-116070952, -103235448, -89156008, -74332464, -59030032, -43270720, -27318676, -11630235, 3788161, 19364396, +35270808, 51383380, 67845448, 85084376, 103357848, 122716344, 143190448, 164647568, 186708128, 208921168, +230610208, 250557120, 267457280, 280695968, 290074560, 294978368, 294679840, 289356768, 279864896, 266521504, +249057632, 227865200, 204276704, 179287504, 152854672, 124924496, 96344168, 68000072, 39594228, 10161356, +-20476794, -51754892, -83805552, -117771224, -154393344, -193238096, -233857216, -276860032, -323067456, -372146016, +-422997376, -475317600, -529790656, -586465408, -643890240, -700616000, -756673408, -812224512, -865455744, -913745152, +-956444672, -993991808, -1024540800, -1044644480, -1053249984, -1051286144, -1037245888, -1007591808, -961676992, -901270464, +-825239296, -730415040, -617438080, -489367488, -345486080, -184001760, -9601399, 169511088, 349013344, 523518400, +678688576, 799189824, 878520512, 909441600, 875318080, 766932416, 594697792, 366670496, 80809272, -222708016, +-426628768, -421689024, -237979312, -36925980, 50219440, 34310348, 3150359, -520765, 4166655, 107911, +-3273302, 406948, 2525441, -611496, -1940788, 715649, 1552094, -683974, -1200443, 656593, +932545, -623307, -751082, 527744, 540629, -506269, -441845, 405874, 294742, -368293, +-213675, 300648, 132070, -231928, -41339, 200790, 8590, -107374, 91805, }, { 579569344, -535923328, 456493280, 339312096, 191848672, 66356708, 32766306, 103828152, 212905280, 270114240, 223526736, -80593984, -96322696, -222835248, -256390224, -230623632, -209125712, -218933808, -251325920, -302965920, -374807840, --441093664, -461958080, -430899584, -381811328, -347154688, -331162368, -322570848, -310652288, -285347968, -238625168, --171585552, -93660352, -15587510, 52657908, 103282688, 137355200, 165996720, 199463648, 238056608, 275797024, -307733856, 331415232, 346436352, 355098784, 360181312, 361320576, 356328192, 345073792, 328951552, 307940032, -281095424, 248241056, 208854064, 161546064, 106783088, 47956532, -11725798, -71075264, -128828080, -182525376, --230390640, -271964320, -306472224, -332878752, -351642944, -364130016, -370140288, -367786112, -355681824, -333905248, --303412064, -265913232, -223840816, -179236496, -132854072, -84868552, -35997732, 12401718, 58838368, 102022120, -140978000, 174821808, 202405168, 222608160, 235105968, 240408640, 239242032, 232475840, 221377648, 207077552, -189982512, 170418400, 149442320, 128243432, 107248552, 86594056, 66920960, 48932024, 32751810, 18377628, -6179921, -3654480, -11619497, -18376554, -24261196, -29586420, -34911104, -40721120, -47217260, -54525684, --62832688, -72317584, -83130704, -95292440, -108497856, -122208464, -135885248, -148858192, -160160400, -168929648, --174782080, -177386976, -176042656, -170148880, -159679904, -144694224, -124912680, -100323992, -71671192, -39765492, --4875325, 32683090, 71931576, 111755584, 151444848, 190155376, 226390416, 258580656, 285708736, 306818496, -320383616, 324775776, 319060768, 302832224, 275651008, 237360288, 188829840, 131817912, 68225552, 119722, --69640744, -137617728, -200805296, -256893264, -303624128, -338806336, -361185824, -370585888, -367052736, -350678720, --322384544, -283973568, -237179904, -183409056, -124464928, -62643172, 13422, 61794916, 120655832, 174232864, -220522416, 257989024, 285203008, 300952640, 304579744, 295920576, 275240288, 243384528, 201620800, 151448592, -94955288, 34892316, -26127896, -85768888, -140812112, -187124752, -221358864, -241145776, -243458608, -225485776, --187893008, -134548448, -69194072, 3423626, 73443944, 128780840, 162185488, 168736912, 138974400, 69362648, --16011101, -71099424, -69478072, -32066226, -1396938, 4179540, -1872069, -3814468, -2048163, -2362769, --3785477, -3195456, -1980517, -2334315, -2949032, -2248952, -1418950, -1617055, -1794223, -1104880, --477278, -527207, -454193, 172872, 659278, 707059, 900869, 1422171, 1777043, 1865090, -2081449, 2456185, 2674691, 2752000, 2915746, 3112778, 3192235, 3227131, 3289408, }, +535923328, 456493280, 339312096, 191848672, 66356708, 32766306, 103828152, 212905280, 270114240, 223526736, +80593984, -96322696, -222835248, -256390224, -230623632, -209125712, -218933808, -251325920, -302965920, -374807840, +-441093664, -461958080, -430899584, -381811328, -347154688, -331162368, -322570848, -310652288, -285347968, -238625168, +-171585552, -93660352, -15587510, 52657908, 103282688, 137355200, 165996720, 199463648, 238056608, 275797024, +307733856, 331415232, 346436352, 355098784, 360181312, 361320576, 356328192, 345073792, 328951552, 307940032, +281095424, 248241056, 208854064, 161546064, 106783088, 47956532, -11725798, -71075264, -128828080, -182525376, +-230390640, -271964320, -306472224, -332878752, -351642944, -364130016, -370140288, -367786112, -355681824, -333905248, +-303412064, -265913232, -223840816, -179236496, -132854072, -84868552, -35997732, 12401718, 58838368, 102022120, +140978000, 174821808, 202405168, 222608160, 235105968, 240408640, 239242032, 232475840, 221377648, 207077552, +189982512, 170418400, 149442320, 128243432, 107248552, 86594056, 66920960, 48932024, 32751810, 18377628, +6179921, -3654480, -11619497, -18376554, -24261196, -29586420, -34911104, -40721120, -47217260, -54525684, +-62832688, -72317584, -83130704, -95292440, -108497856, -122208464, -135885248, -148858192, -160160400, -168929648, +-174782080, -177386976, -176042656, -170148880, -159679904, -144694224, -124912680, -100323992, -71671192, -39765492, +-4875325, 32683090, 71931576, 111755584, 151444848, 190155376, 226390416, 258580656, 285708736, 306818496, +320383616, 324775776, 319060768, 302832224, 275651008, 237360288, 188829840, 131817912, 68225552, 119722, +-69640744, -137617728, -200805296, -256893264, -303624128, -338806336, -361185824, -370585888, -367052736, -350678720, +-322384544, -283973568, -237179904, -183409056, -124464928, -62643172, 13422, 61794916, 120655832, 174232864, +220522416, 257989024, 285203008, 300952640, 304579744, 295920576, 275240288, 243384528, 201620800, 151448592, +94955288, 34892316, -26127896, -85768888, -140812112, -187124752, -221358864, -241145776, -243458608, -225485776, +-187893008, -134548448, -69194072, 3423626, 73443944, 128780840, 162185488, 168736912, 138974400, 69362648, +-16011101, -71099424, -69478072, -32066226, -1396938, 4179540, -1872069, -3814468, -2048163, -2362769, +-3785477, -3195456, -1980517, -2334315, -2949032, -2248952, -1418950, -1617055, -1794223, -1104880, +-477278, -527207, -454193, 172872, 659278, 707059, 900869, 1422171, 1777043, 1865090, +2081449, 2456185, 2674691, 2752000, 2915746, 3112778, 3192235, 3227131, 3289408, }, }, { { 579569344, -535923328, 456493280, 339312096, 191848672, 66356708, 32766306, 103828152, 212905280, 270114240, 223526736, -80593984, -96322696, -222835248, -256390224, -230623632, -209125712, -218933808, -251325920, -302965920, -374807840, --441093664, -461958080, -430899584, -381811328, -347154688, -331162368, -322570848, -310652288, -285347968, -238625168, --171585552, -93660352, -15587510, 52657908, 103282688, 137355200, 165996720, 199463648, 238056608, 275797024, -307733856, 331415232, 346436352, 355098784, 360181312, 361320576, 356328192, 345073792, 328951552, 307940032, -281095424, 248241056, 208854064, 161546064, 106783088, 47956532, -11725798, -71075264, -128828080, -182525376, --230390640, -271964320, -306472224, -332878752, -351642944, -364130016, -370140288, -367786112, -355681824, -333905248, --303412064, -265913232, -223840816, -179236496, -132854072, -84868552, -35997732, 12401718, 58838368, 102022120, -140978000, 174821808, 202405168, 222608160, 235105968, 240408640, 239242032, 232475840, 221377648, 207077552, -189982512, 170418400, 149442320, 128243432, 107248552, 86594056, 66920960, 48932024, 32751810, 18377628, -6179921, -3654480, -11619497, -18376554, -24261196, -29586420, -34911104, -40721120, -47217260, -54525684, --62832688, -72317584, -83130704, -95292440, -108497856, -122208464, -135885248, -148858192, -160160400, -168929648, --174782080, -177386976, -176042656, -170148880, -159679904, -144694224, -124912680, -100323992, -71671192, -39765492, --4875325, 32683090, 71931576, 111755584, 151444848, 190155376, 226390416, 258580656, 285708736, 306818496, -320383616, 324775776, 319060768, 302832224, 275651008, 237360288, 188829840, 131817912, 68225552, 119722, --69640744, -137617728, -200805296, -256893264, -303624128, -338806336, -361185824, -370585888, -367052736, -350678720, --322384544, -283973568, -237179904, -183409056, -124464928, -62643172, 13422, 61794916, 120655832, 174232864, -220522416, 257989024, 285203008, 300952640, 304579744, 295920576, 275240288, 243384528, 201620800, 151448592, -94955288, 34892316, -26127896, -85768888, -140812112, -187124752, -221358864, -241145776, -243458608, -225485776, --187893008, -134548448, -69194072, 3423626, 73443944, 128780840, 162185488, 168736912, 138974400, 69362648, --16011101, -71099424, -69478072, -32066226, -1396938, 4179540, -1872069, -3814468, -2048163, -2362769, --3785477, -3195456, -1980517, -2334315, -2949032, -2248952, -1418950, -1617055, -1794223, -1104880, --477278, -527207, -454193, 172872, 659278, 707059, 900869, 1422171, 1777043, 1865090, -2081449, 2456185, 2674691, 2752000, 2915746, 3112778, 3192235, 3227131, 3289408, }, +535923328, 456493280, 339312096, 191848672, 66356708, 32766306, 103828152, 212905280, 270114240, 223526736, +80593984, -96322696, -222835248, -256390224, -230623632, -209125712, -218933808, -251325920, -302965920, -374807840, +-441093664, -461958080, -430899584, -381811328, -347154688, -331162368, -322570848, -310652288, -285347968, -238625168, +-171585552, -93660352, -15587510, 52657908, 103282688, 137355200, 165996720, 199463648, 238056608, 275797024, +307733856, 331415232, 346436352, 355098784, 360181312, 361320576, 356328192, 345073792, 328951552, 307940032, +281095424, 248241056, 208854064, 161546064, 106783088, 47956532, -11725798, -71075264, -128828080, -182525376, +-230390640, -271964320, -306472224, -332878752, -351642944, -364130016, -370140288, -367786112, -355681824, -333905248, +-303412064, -265913232, -223840816, -179236496, -132854072, -84868552, -35997732, 12401718, 58838368, 102022120, +140978000, 174821808, 202405168, 222608160, 235105968, 240408640, 239242032, 232475840, 221377648, 207077552, +189982512, 170418400, 149442320, 128243432, 107248552, 86594056, 66920960, 48932024, 32751810, 18377628, +6179921, -3654480, -11619497, -18376554, -24261196, -29586420, -34911104, -40721120, -47217260, -54525684, +-62832688, -72317584, -83130704, -95292440, -108497856, -122208464, -135885248, -148858192, -160160400, -168929648, +-174782080, -177386976, -176042656, -170148880, -159679904, -144694224, -124912680, -100323992, -71671192, -39765492, +-4875325, 32683090, 71931576, 111755584, 151444848, 190155376, 226390416, 258580656, 285708736, 306818496, +320383616, 324775776, 319060768, 302832224, 275651008, 237360288, 188829840, 131817912, 68225552, 119722, +-69640744, -137617728, -200805296, -256893264, -303624128, -338806336, -361185824, -370585888, -367052736, -350678720, +-322384544, -283973568, -237179904, -183409056, -124464928, -62643172, 13422, 61794916, 120655832, 174232864, +220522416, 257989024, 285203008, 300952640, 304579744, 295920576, 275240288, 243384528, 201620800, 151448592, +94955288, 34892316, -26127896, -85768888, -140812112, -187124752, -221358864, -241145776, -243458608, -225485776, +-187893008, -134548448, -69194072, 3423626, 73443944, 128780840, 162185488, 168736912, 138974400, 69362648, +-16011101, -71099424, -69478072, -32066226, -1396938, 4179540, -1872069, -3814468, -2048163, -2362769, +-3785477, -3195456, -1980517, -2334315, -2949032, -2248952, -1418950, -1617055, -1794223, -1104880, +-477278, -527207, -454193, 172872, 659278, 707059, 900869, 1422171, 1777043, 1865090, +2081449, 2456185, 2674691, 2752000, 2915746, 3112778, 3192235, 3227131, 3289408, }, { 597213568, -596643456, 589774720, 572423040, 546464256, 513296896, 469925248, 426302880, 420621728, 490009600, 619773440, -746362240, 818147776, 830061504, 797643584, 733486464, 660355520, 611384320, 598772160, 608339712, 634336576, -687962496, 761336640, 817412288, 830826496, 811578624, 779512960, 745057664, 723017984, 733358144, 775793472, -828397184, 878846976, 933033856, 988564032, 1026026368, 1033997248, 1021642816, 1001205760, 976111296, 949339712, -926577472, 907651712, 887279552, 865113280, 845489024, 829484352, 815743680, 805347200, 798338304, 790169856, -778097728, 766046080, 758030080, 752204480, 745350784, 737406720, 728103232, 714701376, 696160000, 675283200, -654903040, 635414656, 616550080, 598197696, 579157568, 557310144, 530734464, 497799584, 457844064, 412453216, -364070944, 313385504, 260460240, 207604768, 157896416, 111621368, 67432600, 26114474, -9955734, -40010840, --64545844, -82950848, -94379760, -100110320, -102734008, -103747080, -103519448, -102710384, -102403832, -103430864, --106081400, -109889960, -113784424, -117140400, -120256936, -123273080, -125650880, -127430072, -129705328, -133059160, --136775920, -140245184, -143737520, -147170272, -149432112, -149540560, -147397904, -143076640, -136364672, -127245384, --116070952, -103235448, -89156008, -74332464, -59030032, -43270720, -27318676, -11630235, 3788161, 19364396, -35270808, 51383380, 67845448, 85084376, 103357848, 122716344, 143190448, 164647568, 186708128, 208921168, -230610208, 250557120, 267457280, 280695968, 290074560, 294978368, 294679840, 289356768, 279864896, 266521504, -249057632, 227865200, 204276704, 179287504, 152854672, 124924496, 96344168, 68000072, 39594228, 10161356, --20476794, -51754892, -83805552, -117771224, -154393344, -193238096, -233857216, -276860032, -323067456, -372146016, --422997376, -475317600, -529790656, -586465408, -643890240, -700616000, -756673408, -812224512, -865455744, -913745152, --956444672, -993991808, -1024540800, -1044644480, -1053249984, -1051286144, -1037245888, -1007591808, -961676992, -901270464, --825239296, -730415040, -617438080, -489367488, -345486080, -184001760, -9601399, 169511088, 349013344, 523518400, -678688576, 799189824, 878520512, 909441600, 875318080, 766932416, 594697792, 366670496, 80809272, -222708016, --426628768, -421689024, -237979312, -36925980, 50219440, 34310348, 3150359, -520765, 4166655, 107911, --3273302, 406948, 2525441, -611496, -1940788, 715649, 1552094, -683974, -1200443, 656593, -932545, -623307, -751082, 527744, 540629, -506269, -441845, 405874, 294742, -368293, --213675, 300648, 132070, -231928, -41339, 200790, 8590, -107374, 91805, }, +596643456, 589774720, 572423040, 546464256, 513296896, 469925248, 426302880, 420621728, 490009600, 619773440, +746362240, 818147776, 830061504, 797643584, 733486464, 660355520, 611384320, 598772160, 608339712, 634336576, +687962496, 761336640, 817412288, 830826496, 811578624, 779512960, 745057664, 723017984, 733358144, 775793472, +828397184, 878846976, 933033856, 988564032, 1026026368, 1033997248, 1021642816, 1001205760, 976111296, 949339712, +926577472, 907651712, 887279552, 865113280, 845489024, 829484352, 815743680, 805347200, 798338304, 790169856, +778097728, 766046080, 758030080, 752204480, 745350784, 737406720, 728103232, 714701376, 696160000, 675283200, +654903040, 635414656, 616550080, 598197696, 579157568, 557310144, 530734464, 497799584, 457844064, 412453216, +364070944, 313385504, 260460240, 207604768, 157896416, 111621368, 67432600, 26114474, -9955734, -40010840, +-64545844, -82950848, -94379760, -100110320, -102734008, -103747080, -103519448, -102710384, -102403832, -103430864, +-106081400, -109889960, -113784424, -117140400, -120256936, -123273080, -125650880, -127430072, -129705328, -133059160, +-136775920, -140245184, -143737520, -147170272, -149432112, -149540560, -147397904, -143076640, -136364672, -127245384, +-116070952, -103235448, -89156008, -74332464, -59030032, -43270720, -27318676, -11630235, 3788161, 19364396, +35270808, 51383380, 67845448, 85084376, 103357848, 122716344, 143190448, 164647568, 186708128, 208921168, +230610208, 250557120, 267457280, 280695968, 290074560, 294978368, 294679840, 289356768, 279864896, 266521504, +249057632, 227865200, 204276704, 179287504, 152854672, 124924496, 96344168, 68000072, 39594228, 10161356, +-20476794, -51754892, -83805552, -117771224, -154393344, -193238096, -233857216, -276860032, -323067456, -372146016, +-422997376, -475317600, -529790656, -586465408, -643890240, -700616000, -756673408, -812224512, -865455744, -913745152, +-956444672, -993991808, -1024540800, -1044644480, -1053249984, -1051286144, -1037245888, -1007591808, -961676992, -901270464, +-825239296, -730415040, -617438080, -489367488, -345486080, -184001760, -9601399, 169511088, 349013344, 523518400, +678688576, 799189824, 878520512, 909441600, 875318080, 766932416, 594697792, 366670496, 80809272, -222708016, +-426628768, -421689024, -237979312, -36925980, 50219440, 34310348, 3150359, -520765, 4166655, 107911, +-3273302, 406948, 2525441, -611496, -1940788, 715649, 1552094, -683974, -1200443, 656593, +932545, -623307, -751082, 527744, 540629, -506269, -441845, 405874, 294742, -368293, +-213675, 300648, 132070, -231928, -41339, 200790, 8590, -107374, 91805, }, }, { { 577258624, -576715840, 589559424, 634232448, 698922688, 728686848, 684827712, 605792256, 564653952, 574836800, 588651584, -585370752, 601567104, 661806144, 733112256, 772729600, 780550720, 777879232, 765676736, 732168960, 682062848, -633115776, 593396992, 558773120, 526239264, 497608480, 473712896, 452478016, 431136864, 408102976, 385196288, -367728128, 358867616, 354917856, 349517472, 341043488, 333114976, 330029056, 334360512, 346667200, 364892384, -385567264, 406968544, 429555776, 453146432, 475951648, 496440224, 513792448, 526557632, 533109056, 533698016, -530780640, 527621152, 527320512, 532114240, 542515008, 557551744, 575819264, 595270656, 612548800, 624400192, -629702848, 628770304, 621445248, 607733056, 589560512, 569769856, 549599040, 528701344, 507052576, 485115488, -462446656, 437741984, 410362656, 380882528, 350196064, 318906688, 287777856, 258289136, 232238016, 210521040, -192472512, 176729856, 162499552, 149450368, 136906384, 124364536, 112801944, 104405824, 100885560, 102829568, -110493400, 124145496, 143568416, 168067968, 197059536, 230199504, 267108304, 307226528, 349479328, 391873344, -432042048, 468332352, 499699584, 524740320, 541990528, 551234368, 553277696, 548283200, 535577056, 515299968, -488932640, 457753856, 421960128, 381905280, 339214368, 295833600, 252551056, 209267456, 166404208, 125076960, -85714128, 47379932, 9058623, -29046864, -66327716, -103271416, -140889952, -178859088, -215597696, -250224256, --282999680, -313612608, -340509824, -362547840, -380093856, -393859776, -403703296, -409354400, -411566848, -411762816, --410889856, -409194944, -406989504, -405171648, -404765760, -406089696, -408785312, -412814016, -418855936, -427302016, --437474624, -448574976, -460808640, -474671744, -489646688, -504675840, -519564352, -534837248, -550401664, -565369088, --579182784, -592082688, -604251456, -615084416, -623628736, -629501568, -632924096, -633715456, -630808320, -623335040, --611626432, -596118400, -575879424, -549629632, -517612800, -480661056, -438062496, -388580192, -332951232, -272879680, --208295712, -138401568, -64546916, 10955925, 87666192, 165303088, 240628224, 309478176, 369945408, 419880832, -454019904, 467810528, 460804896, 432175712, 378043008, 298507744, 200767712, 89689120, -32957432, -147629296, --208934592, -183362352, -94947768, -11396159, 21154862, 13571023, 1598802, 219580, 1552094, -166967, --1190780, 297963, 907849, -333934, -683974, 361314, 556198, -324270, -425739, 303332, -326954, -289910, -272194, 236760, 183073, -237834, -159451, 185757, 95026, -176094, --68183, 146029, 36507, -114354, 5369, 108448, -10737, -59056, 63351, }, +576715840, 589559424, 634232448, 698922688, 728686848, 684827712, 605792256, 564653952, 574836800, 588651584, +585370752, 601567104, 661806144, 733112256, 772729600, 780550720, 777879232, 765676736, 732168960, 682062848, +633115776, 593396992, 558773120, 526239264, 497608480, 473712896, 452478016, 431136864, 408102976, 385196288, +367728128, 358867616, 354917856, 349517472, 341043488, 333114976, 330029056, 334360512, 346667200, 364892384, +385567264, 406968544, 429555776, 453146432, 475951648, 496440224, 513792448, 526557632, 533109056, 533698016, +530780640, 527621152, 527320512, 532114240, 542515008, 557551744, 575819264, 595270656, 612548800, 624400192, +629702848, 628770304, 621445248, 607733056, 589560512, 569769856, 549599040, 528701344, 507052576, 485115488, +462446656, 437741984, 410362656, 380882528, 350196064, 318906688, 287777856, 258289136, 232238016, 210521040, +192472512, 176729856, 162499552, 149450368, 136906384, 124364536, 112801944, 104405824, 100885560, 102829568, +110493400, 124145496, 143568416, 168067968, 197059536, 230199504, 267108304, 307226528, 349479328, 391873344, +432042048, 468332352, 499699584, 524740320, 541990528, 551234368, 553277696, 548283200, 535577056, 515299968, +488932640, 457753856, 421960128, 381905280, 339214368, 295833600, 252551056, 209267456, 166404208, 125076960, +85714128, 47379932, 9058623, -29046864, -66327716, -103271416, -140889952, -178859088, -215597696, -250224256, +-282999680, -313612608, -340509824, -362547840, -380093856, -393859776, -403703296, -409354400, -411566848, -411762816, +-410889856, -409194944, -406989504, -405171648, -404765760, -406089696, -408785312, -412814016, -418855936, -427302016, +-437474624, -448574976, -460808640, -474671744, -489646688, -504675840, -519564352, -534837248, -550401664, -565369088, +-579182784, -592082688, -604251456, -615084416, -623628736, -629501568, -632924096, -633715456, -630808320, -623335040, +-611626432, -596118400, -575879424, -549629632, -517612800, -480661056, -438062496, -388580192, -332951232, -272879680, +-208295712, -138401568, -64546916, 10955925, 87666192, 165303088, 240628224, 309478176, 369945408, 419880832, +454019904, 467810528, 460804896, 432175712, 378043008, 298507744, 200767712, 89689120, -32957432, -147629296, +-208934592, -183362352, -94947768, -11396159, 21154862, 13571023, 1598802, 219580, 1552094, -166967, +-1190780, 297963, 907849, -333934, -683974, 361314, 556198, -324270, -425739, 303332, +326954, -289910, -272194, 236760, 183073, -237834, -159451, 185757, 95026, -176094, +-68183, 146029, 36507, -114354, 5369, 108448, -10737, -59056, 63351, }, { 515484128, -438002368, 285437632, 87102472, -95549600, -207499536, -246394224, -259768752, -290284480, -329814304, -334158112, --277309920, -179602640, -81671488, -2548526, 68614248, 145949968, 223177232, 277775392, 292139904, 267355264, -219215136, 163913664, 107111112, 45060648, -25191594, -98342936, -163622144, -212229360, -239572208, -242371984, --218386208, -170373840, -107468136, -40647032, 22208202, 76519136, 118805240, 146478256, 159197264, 158901440, -148381456, 130218040, 106511432, 78693464, 47551192, 13783624, -21502216, -56903484, -90858960, -121219008, --144781200, -157715488, -156839328, -140899088, -111030272, -70184600, -22074522, 29413546, 80016312, 124801552, -158639984, 177334368, 178578304, 162241312, 130077920, 85197120, 31552440, -26269630, -82910584, -132101920, --167161744, -182411552, -175011872, -146204976, -101226472, -47990352, 4851703, 49933288, 82761336, 102251360, -109926464, 108391552, 100088848, 86803440, 69654704, 49291728, 26264798, 1508070, -23351200, -46049028, --64142116, -75698800, -79888000, -77085536, -68492920, -55634320, -40024264, -22984518, -5550709, 11476153, -27378806, 41423884, 52866216, 60949344, 64928632, 64188824, 58415852, 47712792, 32670206, 14405320, --5500780, -25198574, -42783244, -56484724, -64899640, -67242008, -63444720, -54072028, -40175124, -23145042, --4522064, 14173929, 31491774, 46041512, 56548612, 61957052, 61529164, 55007792, 42856796, 26371636, -7527467, -11340861, -27921582, -40336184, -47478716, -49118320, -45780056, -38537132, -28769302, -17866528, --6992744, 2981781, 11478837, 18216030, 23148264, 26322244, 27794880, 27651536, 25996900, 22894860, -18408766, 12705050, 6067178, -1148904, -8491150, -15392626, -21266530, -25612500, -28012314, -28146532, --25897042, -21394306, -14951318, -7052337, 1611150, 10235444, 18057654, 24388434, 28619514, 30362198, -29501056, 26049514, 20122996, 12118250, 2699387, -7464653, -17680770, -26953604, -34088080, -38085084, --38092064, -33202782, -22987202, -8251169, 9140227, 26823682, 41736344, 50129784, 49140868, 38405060, -19730542, -3705483, -26817238, -42991012, -47351476, -39288752, -21038360, 3487514, 26129508, 34982508, -24200530, 2942053, -11587822, -11480984, -4002910, 411780, 44023, -694174, 86436, 687732, -409633, 424128, 1004486, 1205812, 898185, 817654, 995896, 848793, 416075, 180926, -95563, -194884, -587337, -776315, -840740, -990527, -1120987, -1066226, -919123, -800475, --636192, -364535, -71941, 179315, 426812, 675921, 872952, 997506, 1061931, }, +438002368, 285437632, 87102472, -95549600, -207499536, -246394224, -259768752, -290284480, -329814304, -334158112, +-277309920, -179602640, -81671488, -2548526, 68614248, 145949968, 223177232, 277775392, 292139904, 267355264, +219215136, 163913664, 107111112, 45060648, -25191594, -98342936, -163622144, -212229360, -239572208, -242371984, +-218386208, -170373840, -107468136, -40647032, 22208202, 76519136, 118805240, 146478256, 159197264, 158901440, +148381456, 130218040, 106511432, 78693464, 47551192, 13783624, -21502216, -56903484, -90858960, -121219008, +-144781200, -157715488, -156839328, -140899088, -111030272, -70184600, -22074522, 29413546, 80016312, 124801552, +158639984, 177334368, 178578304, 162241312, 130077920, 85197120, 31552440, -26269630, -82910584, -132101920, +-167161744, -182411552, -175011872, -146204976, -101226472, -47990352, 4851703, 49933288, 82761336, 102251360, +109926464, 108391552, 100088848, 86803440, 69654704, 49291728, 26264798, 1508070, -23351200, -46049028, +-64142116, -75698800, -79888000, -77085536, -68492920, -55634320, -40024264, -22984518, -5550709, 11476153, +27378806, 41423884, 52866216, 60949344, 64928632, 64188824, 58415852, 47712792, 32670206, 14405320, +-5500780, -25198574, -42783244, -56484724, -64899640, -67242008, -63444720, -54072028, -40175124, -23145042, +-4522064, 14173929, 31491774, 46041512, 56548612, 61957052, 61529164, 55007792, 42856796, 26371636, +7527467, -11340861, -27921582, -40336184, -47478716, -49118320, -45780056, -38537132, -28769302, -17866528, +-6992744, 2981781, 11478837, 18216030, 23148264, 26322244, 27794880, 27651536, 25996900, 22894860, +18408766, 12705050, 6067178, -1148904, -8491150, -15392626, -21266530, -25612500, -28012314, -28146532, +-25897042, -21394306, -14951318, -7052337, 1611150, 10235444, 18057654, 24388434, 28619514, 30362198, +29501056, 26049514, 20122996, 12118250, 2699387, -7464653, -17680770, -26953604, -34088080, -38085084, +-38092064, -33202782, -22987202, -8251169, 9140227, 26823682, 41736344, 50129784, 49140868, 38405060, +19730542, -3705483, -26817238, -42991012, -47351476, -39288752, -21038360, 3487514, 26129508, 34982508, +24200530, 2942053, -11587822, -11480984, -4002910, 411780, 44023, -694174, 86436, 687732, +409633, 424128, 1004486, 1205812, 898185, 817654, 995896, 848793, 416075, 180926, +95563, -194884, -587337, -776315, -840740, -990527, -1120987, -1066226, -919123, -800475, +-636192, -364535, -71941, 179315, 426812, 675921, 872952, 997506, 1061931, }, }, { { 515484128, -438002368, 285437632, 87102472, -95549600, -207499536, -246394224, -259768752, -290284480, -329814304, -334158112, --277309920, -179602640, -81671488, -2548526, 68614248, 145949968, 223177232, 277775392, 292139904, 267355264, -219215136, 163913664, 107111112, 45060648, -25191594, -98342936, -163622144, -212229360, -239572208, -242371984, --218386208, -170373840, -107468136, -40647032, 22208202, 76519136, 118805240, 146478256, 159197264, 158901440, -148381456, 130218040, 106511432, 78693464, 47551192, 13783624, -21502216, -56903484, -90858960, -121219008, --144781200, -157715488, -156839328, -140899088, -111030272, -70184600, -22074522, 29413546, 80016312, 124801552, -158639984, 177334368, 178578304, 162241312, 130077920, 85197120, 31552440, -26269630, -82910584, -132101920, --167161744, -182411552, -175011872, -146204976, -101226472, -47990352, 4851703, 49933288, 82761336, 102251360, -109926464, 108391552, 100088848, 86803440, 69654704, 49291728, 26264798, 1508070, -23351200, -46049028, --64142116, -75698800, -79888000, -77085536, -68492920, -55634320, -40024264, -22984518, -5550709, 11476153, -27378806, 41423884, 52866216, 60949344, 64928632, 64188824, 58415852, 47712792, 32670206, 14405320, --5500780, -25198574, -42783244, -56484724, -64899640, -67242008, -63444720, -54072028, -40175124, -23145042, --4522064, 14173929, 31491774, 46041512, 56548612, 61957052, 61529164, 55007792, 42856796, 26371636, -7527467, -11340861, -27921582, -40336184, -47478716, -49118320, -45780056, -38537132, -28769302, -17866528, --6992744, 2981781, 11478837, 18216030, 23148264, 26322244, 27794880, 27651536, 25996900, 22894860, -18408766, 12705050, 6067178, -1148904, -8491150, -15392626, -21266530, -25612500, -28012314, -28146532, --25897042, -21394306, -14951318, -7052337, 1611150, 10235444, 18057654, 24388434, 28619514, 30362198, -29501056, 26049514, 20122996, 12118250, 2699387, -7464653, -17680770, -26953604, -34088080, -38085084, --38092064, -33202782, -22987202, -8251169, 9140227, 26823682, 41736344, 50129784, 49140868, 38405060, -19730542, -3705483, -26817238, -42991012, -47351476, -39288752, -21038360, 3487514, 26129508, 34982508, -24200530, 2942053, -11587822, -11480984, -4002910, 411780, 44023, -694174, 86436, 687732, -409633, 424128, 1004486, 1205812, 898185, 817654, 995896, 848793, 416075, 180926, -95563, -194884, -587337, -776315, -840740, -990527, -1120987, -1066226, -919123, -800475, --636192, -364535, -71941, 179315, 426812, 675921, 872952, 997506, 1061931, }, +438002368, 285437632, 87102472, -95549600, -207499536, -246394224, -259768752, -290284480, -329814304, -334158112, +-277309920, -179602640, -81671488, -2548526, 68614248, 145949968, 223177232, 277775392, 292139904, 267355264, +219215136, 163913664, 107111112, 45060648, -25191594, -98342936, -163622144, -212229360, -239572208, -242371984, +-218386208, -170373840, -107468136, -40647032, 22208202, 76519136, 118805240, 146478256, 159197264, 158901440, +148381456, 130218040, 106511432, 78693464, 47551192, 13783624, -21502216, -56903484, -90858960, -121219008, +-144781200, -157715488, -156839328, -140899088, -111030272, -70184600, -22074522, 29413546, 80016312, 124801552, +158639984, 177334368, 178578304, 162241312, 130077920, 85197120, 31552440, -26269630, -82910584, -132101920, +-167161744, -182411552, -175011872, -146204976, -101226472, -47990352, 4851703, 49933288, 82761336, 102251360, +109926464, 108391552, 100088848, 86803440, 69654704, 49291728, 26264798, 1508070, -23351200, -46049028, +-64142116, -75698800, -79888000, -77085536, -68492920, -55634320, -40024264, -22984518, -5550709, 11476153, +27378806, 41423884, 52866216, 60949344, 64928632, 64188824, 58415852, 47712792, 32670206, 14405320, +-5500780, -25198574, -42783244, -56484724, -64899640, -67242008, -63444720, -54072028, -40175124, -23145042, +-4522064, 14173929, 31491774, 46041512, 56548612, 61957052, 61529164, 55007792, 42856796, 26371636, +7527467, -11340861, -27921582, -40336184, -47478716, -49118320, -45780056, -38537132, -28769302, -17866528, +-6992744, 2981781, 11478837, 18216030, 23148264, 26322244, 27794880, 27651536, 25996900, 22894860, +18408766, 12705050, 6067178, -1148904, -8491150, -15392626, -21266530, -25612500, -28012314, -28146532, +-25897042, -21394306, -14951318, -7052337, 1611150, 10235444, 18057654, 24388434, 28619514, 30362198, +29501056, 26049514, 20122996, 12118250, 2699387, -7464653, -17680770, -26953604, -34088080, -38085084, +-38092064, -33202782, -22987202, -8251169, 9140227, 26823682, 41736344, 50129784, 49140868, 38405060, +19730542, -3705483, -26817238, -42991012, -47351476, -39288752, -21038360, 3487514, 26129508, 34982508, +24200530, 2942053, -11587822, -11480984, -4002910, 411780, 44023, -694174, 86436, 687732, +409633, 424128, 1004486, 1205812, 898185, 817654, 995896, 848793, 416075, 180926, +95563, -194884, -587337, -776315, -840740, -990527, -1120987, -1066226, -919123, -800475, +-636192, -364535, -71941, 179315, 426812, 675921, 872952, 997506, 1061931, }, { 577258624, -576715840, 589559424, 634232448, 698922688, 728686848, 684827712, 605792256, 564653952, 574836800, 588651584, -585370752, 601567104, 661806144, 733112256, 772729600, 780550720, 777879232, 765676736, 732168960, 682062848, -633115776, 593396992, 558773120, 526239264, 497608480, 473712896, 452478016, 431136864, 408102976, 385196288, -367728128, 358867616, 354917856, 349517472, 341043488, 333114976, 330029056, 334360512, 346667200, 364892384, -385567264, 406968544, 429555776, 453146432, 475951648, 496440224, 513792448, 526557632, 533109056, 533698016, -530780640, 527621152, 527320512, 532114240, 542515008, 557551744, 575819264, 595270656, 612548800, 624400192, -629702848, 628770304, 621445248, 607733056, 589560512, 569769856, 549599040, 528701344, 507052576, 485115488, -462446656, 437741984, 410362656, 380882528, 350196064, 318906688, 287777856, 258289136, 232238016, 210521040, -192472512, 176729856, 162499552, 149450368, 136906384, 124364536, 112801944, 104405824, 100885560, 102829568, -110493400, 124145496, 143568416, 168067968, 197059536, 230199504, 267108304, 307226528, 349479328, 391873344, -432042048, 468332352, 499699584, 524740320, 541990528, 551234368, 553277696, 548283200, 535577056, 515299968, -488932640, 457753856, 421960128, 381905280, 339214368, 295833600, 252551056, 209267456, 166404208, 125076960, -85714128, 47379932, 9058623, -29046864, -66327716, -103271416, -140889952, -178859088, -215597696, -250224256, --282999680, -313612608, -340509824, -362547840, -380093856, -393859776, -403703296, -409354400, -411566848, -411762816, --410889856, -409194944, -406989504, -405171648, -404765760, -406089696, -408785312, -412814016, -418855936, -427302016, --437474624, -448574976, -460808640, -474671744, -489646688, -504675840, -519564352, -534837248, -550401664, -565369088, --579182784, -592082688, -604251456, -615084416, -623628736, -629501568, -632924096, -633715456, -630808320, -623335040, --611626432, -596118400, -575879424, -549629632, -517612800, -480661056, -438062496, -388580192, -332951232, -272879680, --208295712, -138401568, -64546916, 10955925, 87666192, 165303088, 240628224, 309478176, 369945408, 419880832, -454019904, 467810528, 460804896, 432175712, 378043008, 298507744, 200767712, 89689120, -32957432, -147629296, --208934592, -183362352, -94947768, -11396159, 21154862, 13571023, 1598802, 219580, 1552094, -166967, --1190780, 297963, 907849, -333934, -683974, 361314, 556198, -324270, -425739, 303332, -326954, -289910, -272194, 236760, 183073, -237834, -159451, 185757, 95026, -176094, --68183, 146029, 36507, -114354, 5369, 108448, -10737, -59056, 63351, }, +576715840, 589559424, 634232448, 698922688, 728686848, 684827712, 605792256, 564653952, 574836800, 588651584, +585370752, 601567104, 661806144, 733112256, 772729600, 780550720, 777879232, 765676736, 732168960, 682062848, +633115776, 593396992, 558773120, 526239264, 497608480, 473712896, 452478016, 431136864, 408102976, 385196288, +367728128, 358867616, 354917856, 349517472, 341043488, 333114976, 330029056, 334360512, 346667200, 364892384, +385567264, 406968544, 429555776, 453146432, 475951648, 496440224, 513792448, 526557632, 533109056, 533698016, +530780640, 527621152, 527320512, 532114240, 542515008, 557551744, 575819264, 595270656, 612548800, 624400192, +629702848, 628770304, 621445248, 607733056, 589560512, 569769856, 549599040, 528701344, 507052576, 485115488, +462446656, 437741984, 410362656, 380882528, 350196064, 318906688, 287777856, 258289136, 232238016, 210521040, +192472512, 176729856, 162499552, 149450368, 136906384, 124364536, 112801944, 104405824, 100885560, 102829568, +110493400, 124145496, 143568416, 168067968, 197059536, 230199504, 267108304, 307226528, 349479328, 391873344, +432042048, 468332352, 499699584, 524740320, 541990528, 551234368, 553277696, 548283200, 535577056, 515299968, +488932640, 457753856, 421960128, 381905280, 339214368, 295833600, 252551056, 209267456, 166404208, 125076960, +85714128, 47379932, 9058623, -29046864, -66327716, -103271416, -140889952, -178859088, -215597696, -250224256, +-282999680, -313612608, -340509824, -362547840, -380093856, -393859776, -403703296, -409354400, -411566848, -411762816, +-410889856, -409194944, -406989504, -405171648, -404765760, -406089696, -408785312, -412814016, -418855936, -427302016, +-437474624, -448574976, -460808640, -474671744, -489646688, -504675840, -519564352, -534837248, -550401664, -565369088, +-579182784, -592082688, -604251456, -615084416, -623628736, -629501568, -632924096, -633715456, -630808320, -623335040, +-611626432, -596118400, -575879424, -549629632, -517612800, -480661056, -438062496, -388580192, -332951232, -272879680, +-208295712, -138401568, -64546916, 10955925, 87666192, 165303088, 240628224, 309478176, 369945408, 419880832, +454019904, 467810528, 460804896, 432175712, 378043008, 298507744, 200767712, 89689120, -32957432, -147629296, +-208934592, -183362352, -94947768, -11396159, 21154862, 13571023, 1598802, 219580, 1552094, -166967, +-1190780, 297963, 907849, -333934, -683974, 361314, 556198, -324270, -425739, 303332, +326954, -289910, -272194, 236760, 183073, -237834, -159451, 185757, 95026, -176094, +-68183, 146029, 36507, -114354, 5369, 108448, -10737, -59056, 63351, }, }, { { 548208576, -544875648, 556473152, 595631424, 646513920, 673311808, 656640896, 613493120, 573444160, 545771136, 523946272, -512668224, 528104896, 570986368, 619035776, 651238912, 664630592, 662498176, 642140544, 604135488, 562161856, -531653600, 513580928, 497497888, 476482048, 451859008, 426314688, 399838368, 372339296, 345038336, 318229152, -290570112, 261266080, 231251776, 202268800, 176573088, 157658592, 149259776, 152462208, 164561664, 181516048, -200835888, 221446368, 241784640, 259613056, 273704320, 284568960, 293368800, 300983776, 308247104, 316196576, -325680384, 336977760, 349679584, 362544096, 373749120, 381757088, 385728320, 385028256, 379138240, 368555968, -354957568, 339719040, 322804384, 303550048, 281759520, 257424240, 230248896, 200429488, 169588928, 140275776, -114747568, 94497336, 80372256, 72387912, 69433512, 69580080, 70905080, 72181224, 73050952, 73737608, -74635256, 76160504, 78805136, 83034064, 89080304, 97012040, 106988176, 119291640, 134152768, 151717568, -172148192, 195655088, 222447088, 252568240, 285544992, 320244032, 355295264, 389456352, 421268640, 448819264, -470615680, 486550016, 497294400, 502999200, 503384672, 498815360, 490098720, 477141888, 458903296, 434948640, -406098272, 373242848, 336539136, 296369376, 254260992, 212019984, 170402288, 129428840, 89707368, 52514028, -18496276, -12868259, -42181948, -69283728, -94063008, -117452320, -140713872, -164041440, -186702768, -208308592, --228934640, -248002144, -264098608, -276266240, -284733792, -290072960, -292338560, -291486560, -288102112, -283189216, --277436640, -271084928, -264461008, -258339056, -253602256, -250668784, -249504848, -250273648, -253578624, -259806336, --268593312, -279387616, -292212928, -307295232, -324187360, -341960992, -360170048, -378949792, -398132736, -416920000, --434612576, -451133696, -466487680, -480054400, -490873952, -498532960, -503238624, -504890592, -502673312, -495979072, --485127840, -470478240, -451429504, -427278912, -398506944, -365985984, -329454048, -288222912, -242872352, -194613024, --143526528, -89254792, -32881732, 23790360, 80102752, 135577088, 187954752, 234388176, 273482048, 303914560, -322653504, 327144960, 317413664, 293490688, 253710704, 198723840, 133334576, 60891900, -17351668, -89882928, --129710696, -116388248, -63574104, -11751031, 10314901, 7651484, 1107565, 191126, 886374, -95563, --682900, 167504, 525060, -182536, -388695, 207232, 321049, -182536, -245350, 169114, -184684, -166967, -160524, 128312, 100932, -136902, -95026, 100395, 53150, -98247, --40265, 80531, 23622, -60130, 4295, 62277, 0, -26844, 38118, }, +544875648, 556473152, 595631424, 646513920, 673311808, 656640896, 613493120, 573444160, 545771136, 523946272, +512668224, 528104896, 570986368, 619035776, 651238912, 664630592, 662498176, 642140544, 604135488, 562161856, +531653600, 513580928, 497497888, 476482048, 451859008, 426314688, 399838368, 372339296, 345038336, 318229152, +290570112, 261266080, 231251776, 202268800, 176573088, 157658592, 149259776, 152462208, 164561664, 181516048, +200835888, 221446368, 241784640, 259613056, 273704320, 284568960, 293368800, 300983776, 308247104, 316196576, +325680384, 336977760, 349679584, 362544096, 373749120, 381757088, 385728320, 385028256, 379138240, 368555968, +354957568, 339719040, 322804384, 303550048, 281759520, 257424240, 230248896, 200429488, 169588928, 140275776, +114747568, 94497336, 80372256, 72387912, 69433512, 69580080, 70905080, 72181224, 73050952, 73737608, +74635256, 76160504, 78805136, 83034064, 89080304, 97012040, 106988176, 119291640, 134152768, 151717568, +172148192, 195655088, 222447088, 252568240, 285544992, 320244032, 355295264, 389456352, 421268640, 448819264, +470615680, 486550016, 497294400, 502999200, 503384672, 498815360, 490098720, 477141888, 458903296, 434948640, +406098272, 373242848, 336539136, 296369376, 254260992, 212019984, 170402288, 129428840, 89707368, 52514028, +18496276, -12868259, -42181948, -69283728, -94063008, -117452320, -140713872, -164041440, -186702768, -208308592, +-228934640, -248002144, -264098608, -276266240, -284733792, -290072960, -292338560, -291486560, -288102112, -283189216, +-277436640, -271084928, -264461008, -258339056, -253602256, -250668784, -249504848, -250273648, -253578624, -259806336, +-268593312, -279387616, -292212928, -307295232, -324187360, -341960992, -360170048, -378949792, -398132736, -416920000, +-434612576, -451133696, -466487680, -480054400, -490873952, -498532960, -503238624, -504890592, -502673312, -495979072, +-485127840, -470478240, -451429504, -427278912, -398506944, -365985984, -329454048, -288222912, -242872352, -194613024, +-143526528, -89254792, -32881732, 23790360, 80102752, 135577088, 187954752, 234388176, 273482048, 303914560, +322653504, 327144960, 317413664, 293490688, 253710704, 198723840, 133334576, 60891900, -17351668, -89882928, +-129710696, -116388248, -63574104, -11751031, 10314901, 7651484, 1107565, 191126, 886374, -95563, +-682900, 167504, 525060, -182536, -388695, 207232, 321049, -182536, -245350, 169114, +184684, -166967, -160524, 128312, 100932, -136902, -95026, 100395, 53150, -98247, +-40265, 80531, 23622, -60130, 4295, 62277, 0, -26844, 38118, }, { 500830240, -459700000, 365290720, 223673840, 79591112, -12800076, -46884400, -72271416, -131517264, -207050176, -253433680, --264418048, -274940192, -304089056, -331065216, -330414528, -300650400, -250105072, -180549152, -97373888, -17135846, -48171280, 102873056, 155102000, 202770240, 239229136, 263950976, 280074816, 286780320, 279620096, 255321312, -213867360, 159070016, 98352064, 38867844, -16834662, -69041064, -115651656, -151848576, -174539424, -184535424, --184808144, -178791440, -169817632, -160143760, -150425328, -140704736, -130871408, -119393648, -102829032, -77734616, --42771432, 861678, 49697068, 98473400, 141868144, 176802336, 202836816, 220397856, 229242272, 228382208, -216517888, 192473584, 156089312, 109163576, 55341728, -993748, -55795384, -105952008, -149571696, -185756256, --213678912, -231680736, -237370496, -228723120, -205311248, -168948448, -123544736, -74185896, -25676926, 18674518, -57234196, 89338008, 114706768, 133451080, 146092240, 153200944, 155143888, 152306512, 145243440, 134385232, -119815632, 101499744, 79442936, 53550724, 23803782, -9089761, -43452720, -77154256, -108082856, -134136120, --153368448, -164484896, -166966848, -160689760, -145835616, -123247304, -94430224, -61100740, -25034290, 11703786, -46866684, 78484088, 104971688, 124940064, 137357888, 141914848, 138936288, 129008472, 112964080, 92061016, -67778880, 41452876, 14324253, -12225624, -36784248, -58154396, -75314936, -87332792, -93628136, -94261648, --89822800, -81178104, -69453376, -56011744, -42142756, -28752658, -16386374, -5359046, 4293357, 12834973, -20619602, 27886686, 34779036, 41381472, 47594680, 53053048, 57246544, 59666224, 59808492, 57193932, -51528332, 42825656, 31368294, 17646946, 2381023, -13491566, -28950228, -43017856, -54792508, -63472100, --68468224, -69502768, -66583804, -59929828, -49961744, -37337224, -22892176, -7493108, 8032126, 22838488, -36083092, 47083580, 55367496, 60529512, 62212064, 60317984, 55040544, 46573552, 35052840, 20901458, -4920959, -12059194, -29173566, -45003204, -57619132, -65364032, -67100812, -61773440, -48815524, -29346974, --6101538, 17914846, 39580272, 54831164, 59880972, 53787488, 38157028, 14897631, -12156905, -33443300, --37562712, -23103166, -2974802, 7738458, 6340983, 1333051, -418222, 242129, 268435, -290447, --146566, 301721, 176094, -116501, 54224, 310311, 185757, 17717, 149787, 287226, -174483, 65498, 147640, 206695, 107374, 28991, 68719, 79457, -3221, -60666, --47782, -57982, -118648, -155693, -150324, -161061, -197569, -210453, -195958, }, +459700000, 365290720, 223673840, 79591112, -12800076, -46884400, -72271416, -131517264, -207050176, -253433680, +-264418048, -274940192, -304089056, -331065216, -330414528, -300650400, -250105072, -180549152, -97373888, -17135846, +48171280, 102873056, 155102000, 202770240, 239229136, 263950976, 280074816, 286780320, 279620096, 255321312, +213867360, 159070016, 98352064, 38867844, -16834662, -69041064, -115651656, -151848576, -174539424, -184535424, +-184808144, -178791440, -169817632, -160143760, -150425328, -140704736, -130871408, -119393648, -102829032, -77734616, +-42771432, 861678, 49697068, 98473400, 141868144, 176802336, 202836816, 220397856, 229242272, 228382208, +216517888, 192473584, 156089312, 109163576, 55341728, -993748, -55795384, -105952008, -149571696, -185756256, +-213678912, -231680736, -237370496, -228723120, -205311248, -168948448, -123544736, -74185896, -25676926, 18674518, +57234196, 89338008, 114706768, 133451080, 146092240, 153200944, 155143888, 152306512, 145243440, 134385232, +119815632, 101499744, 79442936, 53550724, 23803782, -9089761, -43452720, -77154256, -108082856, -134136120, +-153368448, -164484896, -166966848, -160689760, -145835616, -123247304, -94430224, -61100740, -25034290, 11703786, +46866684, 78484088, 104971688, 124940064, 137357888, 141914848, 138936288, 129008472, 112964080, 92061016, +67778880, 41452876, 14324253, -12225624, -36784248, -58154396, -75314936, -87332792, -93628136, -94261648, +-89822800, -81178104, -69453376, -56011744, -42142756, -28752658, -16386374, -5359046, 4293357, 12834973, +20619602, 27886686, 34779036, 41381472, 47594680, 53053048, 57246544, 59666224, 59808492, 57193932, +51528332, 42825656, 31368294, 17646946, 2381023, -13491566, -28950228, -43017856, -54792508, -63472100, +-68468224, -69502768, -66583804, -59929828, -49961744, -37337224, -22892176, -7493108, 8032126, 22838488, +36083092, 47083580, 55367496, 60529512, 62212064, 60317984, 55040544, 46573552, 35052840, 20901458, +4920959, -12059194, -29173566, -45003204, -57619132, -65364032, -67100812, -61773440, -48815524, -29346974, +-6101538, 17914846, 39580272, 54831164, 59880972, 53787488, 38157028, 14897631, -12156905, -33443300, +-37562712, -23103166, -2974802, 7738458, 6340983, 1333051, -418222, 242129, 268435, -290447, +-146566, 301721, 176094, -116501, 54224, 310311, 185757, 17717, 149787, 287226, +174483, 65498, 147640, 206695, 107374, 28991, 68719, 79457, -3221, -60666, +-47782, -57982, -118648, -155693, -150324, -161061, -197569, -210453, -195958, }, }, { { 500830240, -459700000, 365290720, 223673840, 79591112, -12800076, -46884400, -72271416, -131517264, -207050176, -253433680, --264418048, -274940192, -304089056, -331065216, -330414528, -300650400, -250105072, -180549152, -97373888, -17135846, -48171280, 102873056, 155102000, 202770240, 239229136, 263950976, 280074816, 286780320, 279620096, 255321312, -213867360, 159070016, 98352064, 38867844, -16834662, -69041064, -115651656, -151848576, -174539424, -184535424, --184808144, -178791440, -169817632, -160143760, -150425328, -140704736, -130871408, -119393648, -102829032, -77734616, --42771432, 861678, 49697068, 98473400, 141868144, 176802336, 202836816, 220397856, 229242272, 228382208, -216517888, 192473584, 156089312, 109163576, 55341728, -993748, -55795384, -105952008, -149571696, -185756256, --213678912, -231680736, -237370496, -228723120, -205311248, -168948448, -123544736, -74185896, -25676926, 18674518, -57234196, 89338008, 114706768, 133451080, 146092240, 153200944, 155143888, 152306512, 145243440, 134385232, -119815632, 101499744, 79442936, 53550724, 23803782, -9089761, -43452720, -77154256, -108082856, -134136120, --153368448, -164484896, -166966848, -160689760, -145835616, -123247304, -94430224, -61100740, -25034290, 11703786, -46866684, 78484088, 104971688, 124940064, 137357888, 141914848, 138936288, 129008472, 112964080, 92061016, -67778880, 41452876, 14324253, -12225624, -36784248, -58154396, -75314936, -87332792, -93628136, -94261648, --89822800, -81178104, -69453376, -56011744, -42142756, -28752658, -16386374, -5359046, 4293357, 12834973, -20619602, 27886686, 34779036, 41381472, 47594680, 53053048, 57246544, 59666224, 59808492, 57193932, -51528332, 42825656, 31368294, 17646946, 2381023, -13491566, -28950228, -43017856, -54792508, -63472100, --68468224, -69502768, -66583804, -59929828, -49961744, -37337224, -22892176, -7493108, 8032126, 22838488, -36083092, 47083580, 55367496, 60529512, 62212064, 60317984, 55040544, 46573552, 35052840, 20901458, -4920959, -12059194, -29173566, -45003204, -57619132, -65364032, -67100812, -61773440, -48815524, -29346974, --6101538, 17914846, 39580272, 54831164, 59880972, 53787488, 38157028, 14897631, -12156905, -33443300, --37562712, -23103166, -2974802, 7738458, 6340983, 1333051, -418222, 242129, 268435, -290447, --146566, 301721, 176094, -116501, 54224, 310311, 185757, 17717, 149787, 287226, -174483, 65498, 147640, 206695, 107374, 28991, 68719, 79457, -3221, -60666, --47782, -57982, -118648, -155693, -150324, -161061, -197569, -210453, -195958, }, +459700000, 365290720, 223673840, 79591112, -12800076, -46884400, -72271416, -131517264, -207050176, -253433680, +-264418048, -274940192, -304089056, -331065216, -330414528, -300650400, -250105072, -180549152, -97373888, -17135846, +48171280, 102873056, 155102000, 202770240, 239229136, 263950976, 280074816, 286780320, 279620096, 255321312, +213867360, 159070016, 98352064, 38867844, -16834662, -69041064, -115651656, -151848576, -174539424, -184535424, +-184808144, -178791440, -169817632, -160143760, -150425328, -140704736, -130871408, -119393648, -102829032, -77734616, +-42771432, 861678, 49697068, 98473400, 141868144, 176802336, 202836816, 220397856, 229242272, 228382208, +216517888, 192473584, 156089312, 109163576, 55341728, -993748, -55795384, -105952008, -149571696, -185756256, +-213678912, -231680736, -237370496, -228723120, -205311248, -168948448, -123544736, -74185896, -25676926, 18674518, +57234196, 89338008, 114706768, 133451080, 146092240, 153200944, 155143888, 152306512, 145243440, 134385232, +119815632, 101499744, 79442936, 53550724, 23803782, -9089761, -43452720, -77154256, -108082856, -134136120, +-153368448, -164484896, -166966848, -160689760, -145835616, -123247304, -94430224, -61100740, -25034290, 11703786, +46866684, 78484088, 104971688, 124940064, 137357888, 141914848, 138936288, 129008472, 112964080, 92061016, +67778880, 41452876, 14324253, -12225624, -36784248, -58154396, -75314936, -87332792, -93628136, -94261648, +-89822800, -81178104, -69453376, -56011744, -42142756, -28752658, -16386374, -5359046, 4293357, 12834973, +20619602, 27886686, 34779036, 41381472, 47594680, 53053048, 57246544, 59666224, 59808492, 57193932, +51528332, 42825656, 31368294, 17646946, 2381023, -13491566, -28950228, -43017856, -54792508, -63472100, +-68468224, -69502768, -66583804, -59929828, -49961744, -37337224, -22892176, -7493108, 8032126, 22838488, +36083092, 47083580, 55367496, 60529512, 62212064, 60317984, 55040544, 46573552, 35052840, 20901458, +4920959, -12059194, -29173566, -45003204, -57619132, -65364032, -67100812, -61773440, -48815524, -29346974, +-6101538, 17914846, 39580272, 54831164, 59880972, 53787488, 38157028, 14897631, -12156905, -33443300, +-37562712, -23103166, -2974802, 7738458, 6340983, 1333051, -418222, 242129, 268435, -290447, +-146566, 301721, 176094, -116501, 54224, 310311, 185757, 17717, 149787, 287226, +174483, 65498, 147640, 206695, 107374, 28991, 68719, 79457, -3221, -60666, +-47782, -57982, -118648, -155693, -150324, -161061, -197569, -210453, -195958, }, { 548208576, -544875648, 556473152, 595631424, 646513920, 673311808, 656640896, 613493120, 573444160, 545771136, 523946272, -512668224, 528104896, 570986368, 619035776, 651238912, 664630592, 662498176, 642140544, 604135488, 562161856, -531653600, 513580928, 497497888, 476482048, 451859008, 426314688, 399838368, 372339296, 345038336, 318229152, -290570112, 261266080, 231251776, 202268800, 176573088, 157658592, 149259776, 152462208, 164561664, 181516048, -200835888, 221446368, 241784640, 259613056, 273704320, 284568960, 293368800, 300983776, 308247104, 316196576, -325680384, 336977760, 349679584, 362544096, 373749120, 381757088, 385728320, 385028256, 379138240, 368555968, -354957568, 339719040, 322804384, 303550048, 281759520, 257424240, 230248896, 200429488, 169588928, 140275776, -114747568, 94497336, 80372256, 72387912, 69433512, 69580080, 70905080, 72181224, 73050952, 73737608, -74635256, 76160504, 78805136, 83034064, 89080304, 97012040, 106988176, 119291640, 134152768, 151717568, -172148192, 195655088, 222447088, 252568240, 285544992, 320244032, 355295264, 389456352, 421268640, 448819264, -470615680, 486550016, 497294400, 502999200, 503384672, 498815360, 490098720, 477141888, 458903296, 434948640, -406098272, 373242848, 336539136, 296369376, 254260992, 212019984, 170402288, 129428840, 89707368, 52514028, -18496276, -12868259, -42181948, -69283728, -94063008, -117452320, -140713872, -164041440, -186702768, -208308592, --228934640, -248002144, -264098608, -276266240, -284733792, -290072960, -292338560, -291486560, -288102112, -283189216, --277436640, -271084928, -264461008, -258339056, -253602256, -250668784, -249504848, -250273648, -253578624, -259806336, --268593312, -279387616, -292212928, -307295232, -324187360, -341960992, -360170048, -378949792, -398132736, -416920000, --434612576, -451133696, -466487680, -480054400, -490873952, -498532960, -503238624, -504890592, -502673312, -495979072, --485127840, -470478240, -451429504, -427278912, -398506944, -365985984, -329454048, -288222912, -242872352, -194613024, --143526528, -89254792, -32881732, 23790360, 80102752, 135577088, 187954752, 234388176, 273482048, 303914560, -322653504, 327144960, 317413664, 293490688, 253710704, 198723840, 133334576, 60891900, -17351668, -89882928, --129710696, -116388248, -63574104, -11751031, 10314901, 7651484, 1107565, 191126, 886374, -95563, --682900, 167504, 525060, -182536, -388695, 207232, 321049, -182536, -245350, 169114, -184684, -166967, -160524, 128312, 100932, -136902, -95026, 100395, 53150, -98247, --40265, 80531, 23622, -60130, 4295, 62277, 0, -26844, 38118, }, +544875648, 556473152, 595631424, 646513920, 673311808, 656640896, 613493120, 573444160, 545771136, 523946272, +512668224, 528104896, 570986368, 619035776, 651238912, 664630592, 662498176, 642140544, 604135488, 562161856, +531653600, 513580928, 497497888, 476482048, 451859008, 426314688, 399838368, 372339296, 345038336, 318229152, +290570112, 261266080, 231251776, 202268800, 176573088, 157658592, 149259776, 152462208, 164561664, 181516048, +200835888, 221446368, 241784640, 259613056, 273704320, 284568960, 293368800, 300983776, 308247104, 316196576, +325680384, 336977760, 349679584, 362544096, 373749120, 381757088, 385728320, 385028256, 379138240, 368555968, +354957568, 339719040, 322804384, 303550048, 281759520, 257424240, 230248896, 200429488, 169588928, 140275776, +114747568, 94497336, 80372256, 72387912, 69433512, 69580080, 70905080, 72181224, 73050952, 73737608, +74635256, 76160504, 78805136, 83034064, 89080304, 97012040, 106988176, 119291640, 134152768, 151717568, +172148192, 195655088, 222447088, 252568240, 285544992, 320244032, 355295264, 389456352, 421268640, 448819264, +470615680, 486550016, 497294400, 502999200, 503384672, 498815360, 490098720, 477141888, 458903296, 434948640, +406098272, 373242848, 336539136, 296369376, 254260992, 212019984, 170402288, 129428840, 89707368, 52514028, +18496276, -12868259, -42181948, -69283728, -94063008, -117452320, -140713872, -164041440, -186702768, -208308592, +-228934640, -248002144, -264098608, -276266240, -284733792, -290072960, -292338560, -291486560, -288102112, -283189216, +-277436640, -271084928, -264461008, -258339056, -253602256, -250668784, -249504848, -250273648, -253578624, -259806336, +-268593312, -279387616, -292212928, -307295232, -324187360, -341960992, -360170048, -378949792, -398132736, -416920000, +-434612576, -451133696, -466487680, -480054400, -490873952, -498532960, -503238624, -504890592, -502673312, -495979072, +-485127840, -470478240, -451429504, -427278912, -398506944, -365985984, -329454048, -288222912, -242872352, -194613024, +-143526528, -89254792, -32881732, 23790360, 80102752, 135577088, 187954752, 234388176, 273482048, 303914560, +322653504, 327144960, 317413664, 293490688, 253710704, 198723840, 133334576, 60891900, -17351668, -89882928, +-129710696, -116388248, -63574104, -11751031, 10314901, 7651484, 1107565, 191126, 886374, -95563, +-682900, 167504, 525060, -182536, -388695, 207232, 321049, -182536, -245350, 169114, +184684, -166967, -160524, 128312, 100932, -136902, -95026, 100395, 53150, -98247, +-40265, 80531, 23622, -60130, 4295, 62277, 0, -26844, 38118, }, }, }; const Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 11671574, -33428268, 48048336, 42938400, 10669236, -23849416, -20741470, 7692824, -3387119, -60983168, -61801896, -75895296, 273056832, 373722816, 342877984, 285016704, 275532896, 274483296, 221783520, 125141392, 18176302, --95674688, -211587264, -285864960, -277180544, -200371504, -107004816, -29242822, 34718904, 94131728, 145453904, -173212816, 159637488, 97118336, -2741800, -114900576, -218103808, -305466112, -380638784, -447978496, -505954112, --547699072, -568476480, -572700096, -571630080, -574870080, -586484736, -606955648, -633760512, -660538560, -680332480, --690672640, -693753728, -692721856, -689765824, -686531200, -684405184, -684960832, -690392384, -702076288, -718923840, --738931392, -761562688, -786150272, -808610816, -822278976, -821855936, -805235520, -773099456, -729042752, -679147072, --629310400, -583083136, -542430208, -508994432, -483474816, -464784704, -450638176, -438507040, -426233088, -412716288, --397979712, -382108736, -364839744, -346619968, -328956928, -313062304, -299318432, -288607296, -282822528, -283359936, --290075648, -302071488, -318472352, -338125600, -359373888, -380381088, -399396000, -415003904, -426471456, -433510368, --435789408, -433354688, -427214496, -418410336, -406781184, -391712832, -373661632, -353731904, -332318784, -309478688, --286101728, -263467792, -242115904, -222054112, -203476224, -186587344, -171440064, -158391408, -147968608, -140255920, --135438576, -134720784, -139487120, -149966304, -166157792, -189564832, -222349376, -265213696, -317849056, -381103200, --456832576, -545526336, -645587840, -755151872, -873149696, -997795520, -1124988288, -1249492480, -1367641088, -1477668480, --1577235968, -1662584576, -1731487104, -1785210624, -1825508224, -1851442304, -1861844224, -1859087360, -1846884736, -1825654784, --1793888128, -1753022592, -1706731904, -1655882752, -1598357632, -1533789184, -1464510848, -1391412096, -1312354688, -1225542656, --1131783424, -1032359296, -926551168, -812663616, -690843904, -563587200, -433046528, -299167008, -162062000, -24927454, -108413568, 237962656, 365616608, 489768000, 607022208, 718448192, 827780352, 934079168, 1033306880, 1126050176, -1215316352, 1297863424, 1366641408, 1419627904, 1456143744, 1467462528, 1442218880, 1377115264, 1271023104, 1115677824, -906274048, 653276864, 370027008, 61913028, -255111936, -543083584, -769113216, -917314304, -946205440, -779825408, --411155616, 4182761, 243786096, 231176608, 95539400, 3235721, -7104950, 4381941, 277025, -4724464, -574452, 3642669, -973884, -2865817, 1049583, 2232846, -1037772, -1719598, 1045288, 1407139, --914291, -1052804, 878858, 840203, -778463, -638876, 676994, 439160, -634581, -346282, -492848, 158377, -474594, -108985, 336081, -40802, -296353, 102005, 194347, }, +33428268, 48048336, 42938400, 10669236, -23849416, -20741470, 7692824, -3387119, -60983168, -61801896, +75895296, 273056832, 373722816, 342877984, 285016704, 275532896, 274483296, 221783520, 125141392, 18176302, +-95674688, -211587264, -285864960, -277180544, -200371504, -107004816, -29242822, 34718904, 94131728, 145453904, +173212816, 159637488, 97118336, -2741800, -114900576, -218103808, -305466112, -380638784, -447978496, -505954112, +-547699072, -568476480, -572700096, -571630080, -574870080, -586484736, -606955648, -633760512, -660538560, -680332480, +-690672640, -693753728, -692721856, -689765824, -686531200, -684405184, -684960832, -690392384, -702076288, -718923840, +-738931392, -761562688, -786150272, -808610816, -822278976, -821855936, -805235520, -773099456, -729042752, -679147072, +-629310400, -583083136, -542430208, -508994432, -483474816, -464784704, -450638176, -438507040, -426233088, -412716288, +-397979712, -382108736, -364839744, -346619968, -328956928, -313062304, -299318432, -288607296, -282822528, -283359936, +-290075648, -302071488, -318472352, -338125600, -359373888, -380381088, -399396000, -415003904, -426471456, -433510368, +-435789408, -433354688, -427214496, -418410336, -406781184, -391712832, -373661632, -353731904, -332318784, -309478688, +-286101728, -263467792, -242115904, -222054112, -203476224, -186587344, -171440064, -158391408, -147968608, -140255920, +-135438576, -134720784, -139487120, -149966304, -166157792, -189564832, -222349376, -265213696, -317849056, -381103200, +-456832576, -545526336, -645587840, -755151872, -873149696, -997795520, -1124988288, -1249492480, -1367641088, -1477668480, +-1577235968, -1662584576, -1731487104, -1785210624, -1825508224, -1851442304, -1861844224, -1859087360, -1846884736, -1825654784, +-1793888128, -1753022592, -1706731904, -1655882752, -1598357632, -1533789184, -1464510848, -1391412096, -1312354688, -1225542656, +-1131783424, -1032359296, -926551168, -812663616, -690843904, -563587200, -433046528, -299167008, -162062000, -24927454, +108413568, 237962656, 365616608, 489768000, 607022208, 718448192, 827780352, 934079168, 1033306880, 1126050176, +1215316352, 1297863424, 1366641408, 1419627904, 1456143744, 1467462528, 1442218880, 1377115264, 1271023104, 1115677824, +906274048, 653276864, 370027008, 61913028, -255111936, -543083584, -769113216, -917314304, -946205440, -779825408, +-411155616, 4182761, 243786096, 231176608, 95539400, 3235721, -7104950, 4381941, 277025, -4724464, +574452, 3642669, -973884, -2865817, 1049583, 2232846, -1037772, -1719598, 1045288, 1407139, +-914291, -1052804, 878858, 840203, -778463, -638876, 676994, 439160, -634581, -346282, +492848, 158377, -474594, -108985, 336081, -40802, -296353, 102005, 194347, }, { -43152612, --167244416, -326189344, -425169024, -430063680, -408412736, -396821152, -347003296, -240177248, -150636320, -149980256, --227270880, -334289120, -431815488, -465875104, -381789856, -201092512, -19849728, 100399696, 182234384, 254505808, -295659648, 288585824, 269964992, 281386944, 315109408, 345971968, 378699072, 424291776, 459042880, 447787936, -391741280, 318566848, 234615808, 120319752, -26028038, -167703984, -263907488, -309349856, -328910208, -343889440, --357035808, -365100128, -369183040, -368511424, -355676992, -325343232, -281465856, -230792208, -174850800, -113110112, --48930952, 12495670, 68545528, 118137904, 159899488, 194040720, 222759552, 246649776, 263353968, 270581344, -267532432, 253314480, 227605888, 193476464, 156568736, 121000504, 88099440, 58618252, 33705292, 13705241, --2253247, -15534897, -27778774, -40846212, -56144888, -74168720, -94531160, -115715544, -135217376, -151071184, --163176544, -172670576, -180643104, -187729264, -193513504, -195408656, -189196000, -171573200, -141721040, -100734160, --51151448, 2652679, 55053964, 100841536, 136072080, 158270624, 167375952, 166312400, 159483952, 150750128, -143187760, 139580528, 141745200, 149778400, 162720736, 179277840, 197052032, 211674784, 217527216, 209201408, -182345520, 134332080, 65313032, -21227338, -119223464, -221298192, -319546656, -405998432, -473390208, -516054816, --530230368, -513815520, -466422720, -390015232, -289196256, -170530608, -41752988, 88480088, 211208240, 318744032, -405772416, 468956192, 506444288, 518312352, 506494752, 473356928, 420836992, 351277312, 267993616, 174445472, -73914776, -29439854, -130281392, -223306080, -303793248, -366947520, -408276384, -425243104, -417698464, -386863264, --335266752, -267617264, -190219808, -109179680, -29850560, 42653320, 104020888, 151907632, 185724048, 205642496, -212621824, 208755280, 196538784, 178010288, 155011808, 129571112, 103384160, 77390480, 52181168, 28295244, -5985037, -14707042, -33559800, -50273664, -64760052, -76887432, -86267104, -92647280, -96055336, -96301216, --92933432, -85790360, -74892952, -59932512, -40791452, -18388902, 5860483, 30818538, 54721104, 74417288, -86956984, 91032904, 85701776, 69631080, 43691092, 12382928, -19332722, -47658568, -65710852, -62912144, --36258112, -518080, 21429202, 20601348, 8546985, 825707, 671626, 1986959, 1380832, 722628, -1206886, 1399623, 694711, 281320, 529892, 461709, -140660, -445066, -325344, -481036, --959925, -1155883, -1067299, -1207960, -1529008, -1587527, -1462973, -1526861, -1668058, -1577864, --1390496, -1357210, -1326071, -1107565, -872952, -761283, -598074, -305480, -71941, }, +-167244416, -326189344, -425169024, -430063680, -408412736, -396821152, -347003296, -240177248, -150636320, -149980256, +-227270880, -334289120, -431815488, -465875104, -381789856, -201092512, -19849728, 100399696, 182234384, 254505808, +295659648, 288585824, 269964992, 281386944, 315109408, 345971968, 378699072, 424291776, 459042880, 447787936, +391741280, 318566848, 234615808, 120319752, -26028038, -167703984, -263907488, -309349856, -328910208, -343889440, +-357035808, -365100128, -369183040, -368511424, -355676992, -325343232, -281465856, -230792208, -174850800, -113110112, +-48930952, 12495670, 68545528, 118137904, 159899488, 194040720, 222759552, 246649776, 263353968, 270581344, +267532432, 253314480, 227605888, 193476464, 156568736, 121000504, 88099440, 58618252, 33705292, 13705241, +-2253247, -15534897, -27778774, -40846212, -56144888, -74168720, -94531160, -115715544, -135217376, -151071184, +-163176544, -172670576, -180643104, -187729264, -193513504, -195408656, -189196000, -171573200, -141721040, -100734160, +-51151448, 2652679, 55053964, 100841536, 136072080, 158270624, 167375952, 166312400, 159483952, 150750128, +143187760, 139580528, 141745200, 149778400, 162720736, 179277840, 197052032, 211674784, 217527216, 209201408, +182345520, 134332080, 65313032, -21227338, -119223464, -221298192, -319546656, -405998432, -473390208, -516054816, +-530230368, -513815520, -466422720, -390015232, -289196256, -170530608, -41752988, 88480088, 211208240, 318744032, +405772416, 468956192, 506444288, 518312352, 506494752, 473356928, 420836992, 351277312, 267993616, 174445472, +73914776, -29439854, -130281392, -223306080, -303793248, -366947520, -408276384, -425243104, -417698464, -386863264, +-335266752, -267617264, -190219808, -109179680, -29850560, 42653320, 104020888, 151907632, 185724048, 205642496, +212621824, 208755280, 196538784, 178010288, 155011808, 129571112, 103384160, 77390480, 52181168, 28295244, +5985037, -14707042, -33559800, -50273664, -64760052, -76887432, -86267104, -92647280, -96055336, -96301216, +-92933432, -85790360, -74892952, -59932512, -40791452, -18388902, 5860483, 30818538, 54721104, 74417288, +86956984, 91032904, 85701776, 69631080, 43691092, 12382928, -19332722, -47658568, -65710852, -62912144, +-36258112, -518080, 21429202, 20601348, 8546985, 825707, 671626, 1986959, 1380832, 722628, +1206886, 1399623, 694711, 281320, 529892, 461709, -140660, -445066, -325344, -481036, +-959925, -1155883, -1067299, -1207960, -1529008, -1587527, -1462973, -1526861, -1668058, -1577864, +-1390496, -1357210, -1326071, -1107565, -872952, -761283, -598074, -305480, -71941, }, }, { { -43152612, --167244416, -326189344, -425169024, -430063680, -408412736, -396821152, -347003296, -240177248, -150636320, -149980256, --227270880, -334289120, -431815488, -465875104, -381789856, -201092512, -19849728, 100399696, 182234384, 254505808, -295659648, 288585824, 269964992, 281386944, 315109408, 345971968, 378699072, 424291776, 459042880, 447787936, -391741280, 318566848, 234615808, 120319752, -26028038, -167703984, -263907488, -309349856, -328910208, -343889440, --357035808, -365100128, -369183040, -368511424, -355676992, -325343232, -281465856, -230792208, -174850800, -113110112, --48930952, 12495670, 68545528, 118137904, 159899488, 194040720, 222759552, 246649776, 263353968, 270581344, -267532432, 253314480, 227605888, 193476464, 156568736, 121000504, 88099440, 58618252, 33705292, 13705241, --2253247, -15534897, -27778774, -40846212, -56144888, -74168720, -94531160, -115715544, -135217376, -151071184, --163176544, -172670576, -180643104, -187729264, -193513504, -195408656, -189196000, -171573200, -141721040, -100734160, --51151448, 2652679, 55053964, 100841536, 136072080, 158270624, 167375952, 166312400, 159483952, 150750128, -143187760, 139580528, 141745200, 149778400, 162720736, 179277840, 197052032, 211674784, 217527216, 209201408, -182345520, 134332080, 65313032, -21227338, -119223464, -221298192, -319546656, -405998432, -473390208, -516054816, --530230368, -513815520, -466422720, -390015232, -289196256, -170530608, -41752988, 88480088, 211208240, 318744032, -405772416, 468956192, 506444288, 518312352, 506494752, 473356928, 420836992, 351277312, 267993616, 174445472, -73914776, -29439854, -130281392, -223306080, -303793248, -366947520, -408276384, -425243104, -417698464, -386863264, --335266752, -267617264, -190219808, -109179680, -29850560, 42653320, 104020888, 151907632, 185724048, 205642496, -212621824, 208755280, 196538784, 178010288, 155011808, 129571112, 103384160, 77390480, 52181168, 28295244, -5985037, -14707042, -33559800, -50273664, -64760052, -76887432, -86267104, -92647280, -96055336, -96301216, --92933432, -85790360, -74892952, -59932512, -40791452, -18388902, 5860483, 30818538, 54721104, 74417288, -86956984, 91032904, 85701776, 69631080, 43691092, 12382928, -19332722, -47658568, -65710852, -62912144, --36258112, -518080, 21429202, 20601348, 8546985, 825707, 671626, 1986959, 1380832, 722628, -1206886, 1399623, 694711, 281320, 529892, 461709, -140660, -445066, -325344, -481036, --959925, -1155883, -1067299, -1207960, -1529008, -1587527, -1462973, -1526861, -1668058, -1577864, --1390496, -1357210, -1326071, -1107565, -872952, -761283, -598074, -305480, -71941, }, +-167244416, -326189344, -425169024, -430063680, -408412736, -396821152, -347003296, -240177248, -150636320, -149980256, +-227270880, -334289120, -431815488, -465875104, -381789856, -201092512, -19849728, 100399696, 182234384, 254505808, +295659648, 288585824, 269964992, 281386944, 315109408, 345971968, 378699072, 424291776, 459042880, 447787936, +391741280, 318566848, 234615808, 120319752, -26028038, -167703984, -263907488, -309349856, -328910208, -343889440, +-357035808, -365100128, -369183040, -368511424, -355676992, -325343232, -281465856, -230792208, -174850800, -113110112, +-48930952, 12495670, 68545528, 118137904, 159899488, 194040720, 222759552, 246649776, 263353968, 270581344, +267532432, 253314480, 227605888, 193476464, 156568736, 121000504, 88099440, 58618252, 33705292, 13705241, +-2253247, -15534897, -27778774, -40846212, -56144888, -74168720, -94531160, -115715544, -135217376, -151071184, +-163176544, -172670576, -180643104, -187729264, -193513504, -195408656, -189196000, -171573200, -141721040, -100734160, +-51151448, 2652679, 55053964, 100841536, 136072080, 158270624, 167375952, 166312400, 159483952, 150750128, +143187760, 139580528, 141745200, 149778400, 162720736, 179277840, 197052032, 211674784, 217527216, 209201408, +182345520, 134332080, 65313032, -21227338, -119223464, -221298192, -319546656, -405998432, -473390208, -516054816, +-530230368, -513815520, -466422720, -390015232, -289196256, -170530608, -41752988, 88480088, 211208240, 318744032, +405772416, 468956192, 506444288, 518312352, 506494752, 473356928, 420836992, 351277312, 267993616, 174445472, +73914776, -29439854, -130281392, -223306080, -303793248, -366947520, -408276384, -425243104, -417698464, -386863264, +-335266752, -267617264, -190219808, -109179680, -29850560, 42653320, 104020888, 151907632, 185724048, 205642496, +212621824, 208755280, 196538784, 178010288, 155011808, 129571112, 103384160, 77390480, 52181168, 28295244, +5985037, -14707042, -33559800, -50273664, -64760052, -76887432, -86267104, -92647280, -96055336, -96301216, +-92933432, -85790360, -74892952, -59932512, -40791452, -18388902, 5860483, 30818538, 54721104, 74417288, +86956984, 91032904, 85701776, 69631080, 43691092, 12382928, -19332722, -47658568, -65710852, -62912144, +-36258112, -518080, 21429202, 20601348, 8546985, 825707, 671626, 1986959, 1380832, 722628, +1206886, 1399623, 694711, 281320, 529892, 461709, -140660, -445066, -325344, -481036, +-959925, -1155883, -1067299, -1207960, -1529008, -1587527, -1462973, -1526861, -1668058, -1577864, +-1390496, -1357210, -1326071, -1107565, -872952, -761283, -598074, -305480, -71941, }, { 11671574, -33428268, 48048336, 42938400, 10669236, -23849416, -20741470, 7692824, -3387119, -60983168, -61801896, -75895296, 273056832, 373722816, 342877984, 285016704, 275532896, 274483296, 221783520, 125141392, 18176302, --95674688, -211587264, -285864960, -277180544, -200371504, -107004816, -29242822, 34718904, 94131728, 145453904, -173212816, 159637488, 97118336, -2741800, -114900576, -218103808, -305466112, -380638784, -447978496, -505954112, --547699072, -568476480, -572700096, -571630080, -574870080, -586484736, -606955648, -633760512, -660538560, -680332480, --690672640, -693753728, -692721856, -689765824, -686531200, -684405184, -684960832, -690392384, -702076288, -718923840, --738931392, -761562688, -786150272, -808610816, -822278976, -821855936, -805235520, -773099456, -729042752, -679147072, --629310400, -583083136, -542430208, -508994432, -483474816, -464784704, -450638176, -438507040, -426233088, -412716288, --397979712, -382108736, -364839744, -346619968, -328956928, -313062304, -299318432, -288607296, -282822528, -283359936, --290075648, -302071488, -318472352, -338125600, -359373888, -380381088, -399396000, -415003904, -426471456, -433510368, --435789408, -433354688, -427214496, -418410336, -406781184, -391712832, -373661632, -353731904, -332318784, -309478688, --286101728, -263467792, -242115904, -222054112, -203476224, -186587344, -171440064, -158391408, -147968608, -140255920, --135438576, -134720784, -139487120, -149966304, -166157792, -189564832, -222349376, -265213696, -317849056, -381103200, --456832576, -545526336, -645587840, -755151872, -873149696, -997795520, -1124988288, -1249492480, -1367641088, -1477668480, --1577235968, -1662584576, -1731487104, -1785210624, -1825508224, -1851442304, -1861844224, -1859087360, -1846884736, -1825654784, --1793888128, -1753022592, -1706731904, -1655882752, -1598357632, -1533789184, -1464510848, -1391412096, -1312354688, -1225542656, --1131783424, -1032359296, -926551168, -812663616, -690843904, -563587200, -433046528, -299167008, -162062000, -24927454, -108413568, 237962656, 365616608, 489768000, 607022208, 718448192, 827780352, 934079168, 1033306880, 1126050176, -1215316352, 1297863424, 1366641408, 1419627904, 1456143744, 1467462528, 1442218880, 1377115264, 1271023104, 1115677824, -906274048, 653276864, 370027008, 61913028, -255111936, -543083584, -769113216, -917314304, -946205440, -779825408, --411155616, 4182761, 243786096, 231176608, 95539400, 3235721, -7104950, 4381941, 277025, -4724464, -574452, 3642669, -973884, -2865817, 1049583, 2232846, -1037772, -1719598, 1045288, 1407139, --914291, -1052804, 878858, 840203, -778463, -638876, 676994, 439160, -634581, -346282, -492848, 158377, -474594, -108985, 336081, -40802, -296353, 102005, 194347, }, +33428268, 48048336, 42938400, 10669236, -23849416, -20741470, 7692824, -3387119, -60983168, -61801896, +75895296, 273056832, 373722816, 342877984, 285016704, 275532896, 274483296, 221783520, 125141392, 18176302, +-95674688, -211587264, -285864960, -277180544, -200371504, -107004816, -29242822, 34718904, 94131728, 145453904, +173212816, 159637488, 97118336, -2741800, -114900576, -218103808, -305466112, -380638784, -447978496, -505954112, +-547699072, -568476480, -572700096, -571630080, -574870080, -586484736, -606955648, -633760512, -660538560, -680332480, +-690672640, -693753728, -692721856, -689765824, -686531200, -684405184, -684960832, -690392384, -702076288, -718923840, +-738931392, -761562688, -786150272, -808610816, -822278976, -821855936, -805235520, -773099456, -729042752, -679147072, +-629310400, -583083136, -542430208, -508994432, -483474816, -464784704, -450638176, -438507040, -426233088, -412716288, +-397979712, -382108736, -364839744, -346619968, -328956928, -313062304, -299318432, -288607296, -282822528, -283359936, +-290075648, -302071488, -318472352, -338125600, -359373888, -380381088, -399396000, -415003904, -426471456, -433510368, +-435789408, -433354688, -427214496, -418410336, -406781184, -391712832, -373661632, -353731904, -332318784, -309478688, +-286101728, -263467792, -242115904, -222054112, -203476224, -186587344, -171440064, -158391408, -147968608, -140255920, +-135438576, -134720784, -139487120, -149966304, -166157792, -189564832, -222349376, -265213696, -317849056, -381103200, +-456832576, -545526336, -645587840, -755151872, -873149696, -997795520, -1124988288, -1249492480, -1367641088, -1477668480, +-1577235968, -1662584576, -1731487104, -1785210624, -1825508224, -1851442304, -1861844224, -1859087360, -1846884736, -1825654784, +-1793888128, -1753022592, -1706731904, -1655882752, -1598357632, -1533789184, -1464510848, -1391412096, -1312354688, -1225542656, +-1131783424, -1032359296, -926551168, -812663616, -690843904, -563587200, -433046528, -299167008, -162062000, -24927454, +108413568, 237962656, 365616608, 489768000, 607022208, 718448192, 827780352, 934079168, 1033306880, 1126050176, +1215316352, 1297863424, 1366641408, 1419627904, 1456143744, 1467462528, 1442218880, 1377115264, 1271023104, 1115677824, +906274048, 653276864, 370027008, 61913028, -255111936, -543083584, -769113216, -917314304, -946205440, -779825408, +-411155616, 4182761, 243786096, 231176608, 95539400, 3235721, -7104950, 4381941, 277025, -4724464, +574452, 3642669, -973884, -2865817, 1049583, 2232846, -1037772, -1719598, 1045288, 1407139, +-914291, -1052804, 878858, 840203, -778463, -638876, 676994, 439160, -634581, -346282, +492848, 158377, -474594, -108985, 336081, -40802, -296353, 102005, 194347, }, }, { { 11190000, -11688753, -40061308, -117706800, -134747616, -57714160, 5634460, -62899260, -187951520, -160767600, 71454832, -306802400, 341183072, 213331568, 114958560, 134767488, 188811056, 166078864, 51683488, -91673392, -197863776, --236760608, -216768080, -167876320, -114699248, -63814088, -17744658, 10382547, 3632469, -45310832, -131139848, --237333984, -339328192, -417852000, -472420640, -513258784, -540252096, -540749248, -509197376, -458708960, -410927968, --381957344, -378321664, -397385408, -428277504, -458271392, -481866880, -501694048, -520654720, -536553088, -544890176, --544073024, -536677632, -526796544, -516915424, -507240992, -497597728, -488693184, -480493024, -470668832, -456728448, --439283872, -421299232, -404266496, -386905152, -367767840, -347481632, -327834848, -309644608, -292188768, -274380224, --256101376, -238439936, -222777808, -209789296, -199288624, -190734128, -183625952, -177709104, -173162880, -170485504, --169868640, -170759840, -172325904, -174384800, -177703728, -183303296, -191610832, -202452416, -215758752, -231803136, --250417536, -270201216, -288826880, -303902752, -313296928, -315217312, -308869888, -295065856, -275606432, -252019552, --225260304, -196459328, -167298640, -139454368, -113997560, -91598768, -73310256, -61077120, -57306676, -63880124, --81812688, -111846320, -154618288, -209682448, -275052384, -348547872, -429030176, -515448160, -605471232, -696545472, --787878464, -879785408, -971233856, -1059755776, -1143757312, -1222864640, -1295487232, -1358142208, -1408379904, -1446699648, --1474248064, -1490276864, -1493755776, -1486252544, -1470870016, -1448836864, -1419387904, -1382823296, -1341137920, -1295046400, --1242674176, -1182316928, -1114553728, -1040169152, -957788992, -865628096, -764488064, -656917952, -544147136, -426189056, --304802560, -183969552, -66967132, 45001056, 150619136, 246948272, 331334720, 403297952, 463172480, 510109504, -542955264, 562277248, 570001216, 567531584, 555661952, 536101568, 511675008, 484807840, 456758496, 428523904, -401605216, 377419712, 356422688, 338270560, 322689472, 309778272, 299407008, 290740288, 282810720, 275370208, -268582560, 262031664, 254824160, 246598768, 237373184, 226360352, 212164944, 194264592, 172972832, 147953040, -118503520, 85361936, 50281184, 13942538, -23293756, -58928560, -89729384, -114679384, -131502768, -130823096, --102383432, -51582556, -2934537, 20398410, 17792438, 6694244, 927713, 525597, 409096, -360240, --264141, 293668, 136365, -266288, -70330, 250719, 71941, -165893, 3758, 180389, -18254, -121870, 12885, 104153, -25233, -98784, 3221, 44560, -47245, -75162, --3221, 9664, -45097, -44560, -1611, -3758, -23622, -9127, 3221, }, +11688753, -40061308, -117706800, -134747616, -57714160, 5634460, -62899260, -187951520, -160767600, 71454832, +306802400, 341183072, 213331568, 114958560, 134767488, 188811056, 166078864, 51683488, -91673392, -197863776, +-236760608, -216768080, -167876320, -114699248, -63814088, -17744658, 10382547, 3632469, -45310832, -131139848, +-237333984, -339328192, -417852000, -472420640, -513258784, -540252096, -540749248, -509197376, -458708960, -410927968, +-381957344, -378321664, -397385408, -428277504, -458271392, -481866880, -501694048, -520654720, -536553088, -544890176, +-544073024, -536677632, -526796544, -516915424, -507240992, -497597728, -488693184, -480493024, -470668832, -456728448, +-439283872, -421299232, -404266496, -386905152, -367767840, -347481632, -327834848, -309644608, -292188768, -274380224, +-256101376, -238439936, -222777808, -209789296, -199288624, -190734128, -183625952, -177709104, -173162880, -170485504, +-169868640, -170759840, -172325904, -174384800, -177703728, -183303296, -191610832, -202452416, -215758752, -231803136, +-250417536, -270201216, -288826880, -303902752, -313296928, -315217312, -308869888, -295065856, -275606432, -252019552, +-225260304, -196459328, -167298640, -139454368, -113997560, -91598768, -73310256, -61077120, -57306676, -63880124, +-81812688, -111846320, -154618288, -209682448, -275052384, -348547872, -429030176, -515448160, -605471232, -696545472, +-787878464, -879785408, -971233856, -1059755776, -1143757312, -1222864640, -1295487232, -1358142208, -1408379904, -1446699648, +-1474248064, -1490276864, -1493755776, -1486252544, -1470870016, -1448836864, -1419387904, -1382823296, -1341137920, -1295046400, +-1242674176, -1182316928, -1114553728, -1040169152, -957788992, -865628096, -764488064, -656917952, -544147136, -426189056, +-304802560, -183969552, -66967132, 45001056, 150619136, 246948272, 331334720, 403297952, 463172480, 510109504, +542955264, 562277248, 570001216, 567531584, 555661952, 536101568, 511675008, 484807840, 456758496, 428523904, +401605216, 377419712, 356422688, 338270560, 322689472, 309778272, 299407008, 290740288, 282810720, 275370208, +268582560, 262031664, 254824160, 246598768, 237373184, 226360352, 212164944, 194264592, 172972832, 147953040, +118503520, 85361936, 50281184, 13942538, -23293756, -58928560, -89729384, -114679384, -131502768, -130823096, +-102383432, -51582556, -2934537, 20398410, 17792438, 6694244, 927713, 525597, 409096, -360240, +-264141, 293668, 136365, -266288, -70330, 250719, 71941, -165893, 3758, 180389, +18254, -121870, 12885, 104153, -25233, -98784, 3221, 44560, -47245, -75162, +-3221, 9664, -45097, -44560, -1611, -3758, -23622, -9127, 3221, }, { 11190000, -11688753, -40061308, -117706800, -134747616, -57714160, 5634460, -62899260, -187951520, -160767600, 71454832, -306802400, 341183072, 213331568, 114958560, 134767488, 188811056, 166078864, 51683488, -91673392, -197863776, --236760608, -216768080, -167876320, -114699248, -63814088, -17744658, 10382547, 3632469, -45310832, -131139848, --237333984, -339328192, -417852000, -472420640, -513258784, -540252096, -540749248, -509197376, -458708960, -410927968, --381957344, -378321664, -397385408, -428277504, -458271392, -481866880, -501694048, -520654720, -536553088, -544890176, --544073024, -536677632, -526796544, -516915424, -507240992, -497597728, -488693184, -480493024, -470668832, -456728448, --439283872, -421299232, -404266496, -386905152, -367767840, -347481632, -327834848, -309644608, -292188768, -274380224, --256101376, -238439936, -222777808, -209789296, -199288624, -190734128, -183625952, -177709104, -173162880, -170485504, --169868640, -170759840, -172325904, -174384800, -177703728, -183303296, -191610832, -202452416, -215758752, -231803136, --250417536, -270201216, -288826880, -303902752, -313296928, -315217312, -308869888, -295065856, -275606432, -252019552, --225260304, -196459328, -167298640, -139454368, -113997560, -91598768, -73310256, -61077120, -57306676, -63880124, --81812688, -111846320, -154618288, -209682448, -275052384, -348547872, -429030176, -515448160, -605471232, -696545472, --787878464, -879785408, -971233856, -1059755776, -1143757312, -1222864640, -1295487232, -1358142208, -1408379904, -1446699648, --1474248064, -1490276864, -1493755776, -1486252544, -1470870016, -1448836864, -1419387904, -1382823296, -1341137920, -1295046400, --1242674176, -1182316928, -1114553728, -1040169152, -957788992, -865628096, -764488064, -656917952, -544147136, -426189056, --304802560, -183969552, -66967132, 45001056, 150619136, 246948272, 331334720, 403297952, 463172480, 510109504, -542955264, 562277248, 570001216, 567531584, 555661952, 536101568, 511675008, 484807840, 456758496, 428523904, -401605216, 377419712, 356422688, 338270560, 322689472, 309778272, 299407008, 290740288, 282810720, 275370208, -268582560, 262031664, 254824160, 246598768, 237373184, 226360352, 212164944, 194264592, 172972832, 147953040, -118503520, 85361936, 50281184, 13942538, -23293756, -58928560, -89729384, -114679384, -131502768, -130823096, --102383432, -51582556, -2934537, 20398410, 17792438, 6694244, 927713, 525597, 409096, -360240, --264141, 293668, 136365, -266288, -70330, 250719, 71941, -165893, 3758, 180389, -18254, -121870, 12885, 104153, -25233, -98784, 3221, 44560, -47245, -75162, --3221, 9664, -45097, -44560, -1611, -3758, -23622, -9127, 3221, }, +11688753, -40061308, -117706800, -134747616, -57714160, 5634460, -62899260, -187951520, -160767600, 71454832, +306802400, 341183072, 213331568, 114958560, 134767488, 188811056, 166078864, 51683488, -91673392, -197863776, +-236760608, -216768080, -167876320, -114699248, -63814088, -17744658, 10382547, 3632469, -45310832, -131139848, +-237333984, -339328192, -417852000, -472420640, -513258784, -540252096, -540749248, -509197376, -458708960, -410927968, +-381957344, -378321664, -397385408, -428277504, -458271392, -481866880, -501694048, -520654720, -536553088, -544890176, +-544073024, -536677632, -526796544, -516915424, -507240992, -497597728, -488693184, -480493024, -470668832, -456728448, +-439283872, -421299232, -404266496, -386905152, -367767840, -347481632, -327834848, -309644608, -292188768, -274380224, +-256101376, -238439936, -222777808, -209789296, -199288624, -190734128, -183625952, -177709104, -173162880, -170485504, +-169868640, -170759840, -172325904, -174384800, -177703728, -183303296, -191610832, -202452416, -215758752, -231803136, +-250417536, -270201216, -288826880, -303902752, -313296928, -315217312, -308869888, -295065856, -275606432, -252019552, +-225260304, -196459328, -167298640, -139454368, -113997560, -91598768, -73310256, -61077120, -57306676, -63880124, +-81812688, -111846320, -154618288, -209682448, -275052384, -348547872, -429030176, -515448160, -605471232, -696545472, +-787878464, -879785408, -971233856, -1059755776, -1143757312, -1222864640, -1295487232, -1358142208, -1408379904, -1446699648, +-1474248064, -1490276864, -1493755776, -1486252544, -1470870016, -1448836864, -1419387904, -1382823296, -1341137920, -1295046400, +-1242674176, -1182316928, -1114553728, -1040169152, -957788992, -865628096, -764488064, -656917952, -544147136, -426189056, +-304802560, -183969552, -66967132, 45001056, 150619136, 246948272, 331334720, 403297952, 463172480, 510109504, +542955264, 562277248, 570001216, 567531584, 555661952, 536101568, 511675008, 484807840, 456758496, 428523904, +401605216, 377419712, 356422688, 338270560, 322689472, 309778272, 299407008, 290740288, 282810720, 275370208, +268582560, 262031664, 254824160, 246598768, 237373184, 226360352, 212164944, 194264592, 172972832, 147953040, +118503520, 85361936, 50281184, 13942538, -23293756, -58928560, -89729384, -114679384, -131502768, -130823096, +-102383432, -51582556, -2934537, 20398410, 17792438, 6694244, 927713, 525597, 409096, -360240, +-264141, 293668, 136365, -266288, -70330, 250719, 71941, -165893, 3758, 180389, +18254, -121870, 12885, 104153, -25233, -98784, 3221, 44560, -47245, -75162, +-3221, 9664, -45097, -44560, -1611, -3758, -23622, -9127, 3221, }, }, { { 6211060, -34978752, 80612776, 109325712, 110260400, 92930208, 42263016, -53406844, -146626960, -180780000, -181451632, --218612768, -291483328, -334530176, -329071808, -323580704, -343249504, -359814656, -357419648, -356058144, -359599904, --343069088, -302278176, -264480864, -243390432, -228616272, -220896080, -233855600, -258485632, -265091824, -244069040, --213233856, -184628832, -152695216, -115064320, -79634600, -49862424, -22612466, -731218, 7459822, 524523, --15042049, -33455110, -50982336, -62585188, -64738580, -59263032, -50605452, -42732240, -40575092, -49833432, --73002632, -108290624, -152267872, -200412304, -246377040, -284815392, -314633184, -337180160, -352783232, -361140192, --363007424, -359134432, -348979520, -332006336, -308914464, -280828576, -248721024, -214081568, -178794656, -144102592, --110534208, -78451336, -47745004, -17543868, 12916577, 43589624, 74150464, 104460584, 134023920, 161468224, -184815664, 202076608, 211709680, 212568672, 203110080, 180917440, 143664512, 90120224, 19548544, -68624448, --172849888, -288047360, -407998272, -528383520, -645873408, -755773568, -853351488, -936860672, -1006812288, -1062875008, --1103973504, -1130945408, -1146318720, -1151125376, -1144086400, -1124344064, -1093229184, -1052873088, -1004816704, -950963712, --894673344, -839560896, -787456512, -738373568, -692276224, -649974016, -612192832, -578741504, -549220032, -523921600, --503275680, -486701408, -472745984, -460297024, -449115616, -439285504, -430778240, -423759712, -418975680, -417571744, --420481600, -428016032, -440041952, -456500800, -477438752, -502406496, -530226048, -559775424, -590655168, -622515776, --653955456, -682810688, -707459520, -727025216, -740269312, -745413568, -741645312, -729996288, -712013760, -688337216, --659459456, -627038912, -593065216, -558063360, -521429440, -483322336, -444842112, -406379616, -367223456, -327093984, --286897920, -247544192, -208959824, -170764672, -133316856, -97519376, -63731944, -31346282, 276489, 30821222, -59784872, 88011400, 117109800, 147303952, 177724672, 209031760, 243277152, 280708864, 319700192, 360357952, -404555328, 451731232, 498806240, 544664128, 589579264, 629760832, 658198912, 670943680, 666074816, 637512704, -578303936, 489051808, 374302112, 234066048, 70973264, -98681704, -255379824, -389007008, -478705248, -472851744, --333534272, -111147312, 68010808, 117137720, 67772976, 12375411, -2839510, 2132451, 1378148, -2444910, --650688, 2015950, 204548, -1671279, 1074, 1360431, -106300, -1068910, 222265, 907312, --214212, -693637, 259309, 566399, -253940, -448287, 227096, 315143, -245887, -266288, -176094, 139050, -197569, -118112, 121870, 20401, -115964, 9127, 60666, }, +34978752, 80612776, 109325712, 110260400, 92930208, 42263016, -53406844, -146626960, -180780000, -181451632, +-218612768, -291483328, -334530176, -329071808, -323580704, -343249504, -359814656, -357419648, -356058144, -359599904, +-343069088, -302278176, -264480864, -243390432, -228616272, -220896080, -233855600, -258485632, -265091824, -244069040, +-213233856, -184628832, -152695216, -115064320, -79634600, -49862424, -22612466, -731218, 7459822, 524523, +-15042049, -33455110, -50982336, -62585188, -64738580, -59263032, -50605452, -42732240, -40575092, -49833432, +-73002632, -108290624, -152267872, -200412304, -246377040, -284815392, -314633184, -337180160, -352783232, -361140192, +-363007424, -359134432, -348979520, -332006336, -308914464, -280828576, -248721024, -214081568, -178794656, -144102592, +-110534208, -78451336, -47745004, -17543868, 12916577, 43589624, 74150464, 104460584, 134023920, 161468224, +184815664, 202076608, 211709680, 212568672, 203110080, 180917440, 143664512, 90120224, 19548544, -68624448, +-172849888, -288047360, -407998272, -528383520, -645873408, -755773568, -853351488, -936860672, -1006812288, -1062875008, +-1103973504, -1130945408, -1146318720, -1151125376, -1144086400, -1124344064, -1093229184, -1052873088, -1004816704, -950963712, +-894673344, -839560896, -787456512, -738373568, -692276224, -649974016, -612192832, -578741504, -549220032, -523921600, +-503275680, -486701408, -472745984, -460297024, -449115616, -439285504, -430778240, -423759712, -418975680, -417571744, +-420481600, -428016032, -440041952, -456500800, -477438752, -502406496, -530226048, -559775424, -590655168, -622515776, +-653955456, -682810688, -707459520, -727025216, -740269312, -745413568, -741645312, -729996288, -712013760, -688337216, +-659459456, -627038912, -593065216, -558063360, -521429440, -483322336, -444842112, -406379616, -367223456, -327093984, +-286897920, -247544192, -208959824, -170764672, -133316856, -97519376, -63731944, -31346282, 276489, 30821222, +59784872, 88011400, 117109800, 147303952, 177724672, 209031760, 243277152, 280708864, 319700192, 360357952, +404555328, 451731232, 498806240, 544664128, 589579264, 629760832, 658198912, 670943680, 666074816, 637512704, +578303936, 489051808, 374302112, 234066048, 70973264, -98681704, -255379824, -389007008, -478705248, -472851744, +-333534272, -111147312, 68010808, 117137720, 67772976, 12375411, -2839510, 2132451, 1378148, -2444910, +-650688, 2015950, 204548, -1671279, 1074, 1360431, -106300, -1068910, 222265, 907312, +-214212, -693637, 259309, 566399, -253940, -448287, 227096, 315143, -245887, -266288, +176094, 139050, -197569, -118112, 121870, 20401, -115964, 9127, 60666, }, { -91098944, --257189088, -369215776, -400231360, -368604832, -319033920, -265362944, -188068032, -89787368, -9621264, 29767882, -50291920, 77778096, 108183248, 133607304, 170049568, 232137616, 298603840, 326322496, 290237248, 197401536, -73890616, -49498424, -148477552, -214940032, -253075584, -264258608, -244663888, -199331584, -146193168, -100364792, --62904628, -28640452, 4153234, 36403068, 71977208, 112137304, 150219696, 175712480, 181030192, 163381088, -124666256, 72294504, 17459578, -29639032, -62694712, -79011296, -79526688, -69355672, -55715388, -44043816, --36359044, -32417340, -30959198, -30240864, -28823526, -26287348, -23006530, -19612432, -16761647, -14723685, --12786118, -9368397, -2711735, 8783208, 26276610, 49416284, 75259640, 98729488, 114351360, 117805048, -106865232, 82032800, 46493556, 4951561, -37917044, -78324096, -113419888, -140948480, -158707632, -164144528, --154651568, -128642864, -86754584, -32558000, 27484032, 85047328, 131882880, 161876784, 172216912, 163395056, -138473504, 102116608, 59641528, 16258599, -23465554, -55970940, -78933984, -91351272, -93557272, -87172800, --74826384, -59545428, -44037372, -30204358, -18999324, -10519986, -4220342, 817118, 5617281, 11120207, -18055506, 26812408, 37246492, 48491256, 58960776, 66642860, 69566656, 66279936, 56247964, 40042516, -19180250, -4301410, -28228672, -50518480, -69346008, -83255792, -91117728, -92039536, -85456424, -71343704, --50351512, -23885386, 5788006, 35614404, 62179852, 82309824, 93587872, 94823216, 86394880, 70160976, -48873508, 25526602, 2877091, -16967268, -32840930, -44412648, -51804284, -55371256, -55631100, -53061636, --47908212, -40312028, -30549566, -19041200, -6323266, 6787659, 19158238, 29657286, 37421512, 41853384, -42696268, 40242232, 35249872, 28576564, 21034602, 13422310, 6296959, -242129, -6320045, -12029130, --17589502, -23371602, -29429652, -35311072, -40429600, -44040056, -44704168, -40561136, -30383136, -13873818, -8616778, 35296580, 61857192, 82479480, 92036856, 86772832, 64508260, 26887570, -18865644, -62464932, --94489816, -107148696, -94908040, -58954332, -9684078, 38810400, 74739944, 87122872, 66568236, 18261128, --29876866, -46610596, -28573344, -2207613, 8111583, 3517578, -1232119, -479963, 791885, -161598, --657130, 418759, 933619, 294205, 179852, 879395, 1036161, 533113, 457414, 810675, -723165, 273267, 157303, 263067, 57982, -306553, -411780, -402116, -574452, -774705, --785442, -737124, -769336, -770947, -658741, -520228, -406411, -269509, -93952, }, +-257189088, -369215776, -400231360, -368604832, -319033920, -265362944, -188068032, -89787368, -9621264, 29767882, +50291920, 77778096, 108183248, 133607304, 170049568, 232137616, 298603840, 326322496, 290237248, 197401536, +73890616, -49498424, -148477552, -214940032, -253075584, -264258608, -244663888, -199331584, -146193168, -100364792, +-62904628, -28640452, 4153234, 36403068, 71977208, 112137304, 150219696, 175712480, 181030192, 163381088, +124666256, 72294504, 17459578, -29639032, -62694712, -79011296, -79526688, -69355672, -55715388, -44043816, +-36359044, -32417340, -30959198, -30240864, -28823526, -26287348, -23006530, -19612432, -16761647, -14723685, +-12786118, -9368397, -2711735, 8783208, 26276610, 49416284, 75259640, 98729488, 114351360, 117805048, +106865232, 82032800, 46493556, 4951561, -37917044, -78324096, -113419888, -140948480, -158707632, -164144528, +-154651568, -128642864, -86754584, -32558000, 27484032, 85047328, 131882880, 161876784, 172216912, 163395056, +138473504, 102116608, 59641528, 16258599, -23465554, -55970940, -78933984, -91351272, -93557272, -87172800, +-74826384, -59545428, -44037372, -30204358, -18999324, -10519986, -4220342, 817118, 5617281, 11120207, +18055506, 26812408, 37246492, 48491256, 58960776, 66642860, 69566656, 66279936, 56247964, 40042516, +19180250, -4301410, -28228672, -50518480, -69346008, -83255792, -91117728, -92039536, -85456424, -71343704, +-50351512, -23885386, 5788006, 35614404, 62179852, 82309824, 93587872, 94823216, 86394880, 70160976, +48873508, 25526602, 2877091, -16967268, -32840930, -44412648, -51804284, -55371256, -55631100, -53061636, +-47908212, -40312028, -30549566, -19041200, -6323266, 6787659, 19158238, 29657286, 37421512, 41853384, +42696268, 40242232, 35249872, 28576564, 21034602, 13422310, 6296959, -242129, -6320045, -12029130, +-17589502, -23371602, -29429652, -35311072, -40429600, -44040056, -44704168, -40561136, -30383136, -13873818, +8616778, 35296580, 61857192, 82479480, 92036856, 86772832, 64508260, 26887570, -18865644, -62464932, +-94489816, -107148696, -94908040, -58954332, -9684078, 38810400, 74739944, 87122872, 66568236, 18261128, +-29876866, -46610596, -28573344, -2207613, 8111583, 3517578, -1232119, -479963, 791885, -161598, +-657130, 418759, 933619, 294205, 179852, 879395, 1036161, 533113, 457414, 810675, +723165, 273267, 157303, 263067, 57982, -306553, -411780, -402116, -574452, -774705, +-785442, -737124, -769336, -770947, -658741, -520228, -406411, -269509, -93952, }, }, { { -91098944, --257189088, -369215776, -400231360, -368604832, -319033920, -265362944, -188068032, -89787368, -9621264, 29767882, -50291920, 77778096, 108183248, 133607304, 170049568, 232137616, 298603840, 326322496, 290237248, 197401536, -73890616, -49498424, -148477552, -214940032, -253075584, -264258608, -244663888, -199331584, -146193168, -100364792, --62904628, -28640452, 4153234, 36403068, 71977208, 112137304, 150219696, 175712480, 181030192, 163381088, -124666256, 72294504, 17459578, -29639032, -62694712, -79011296, -79526688, -69355672, -55715388, -44043816, --36359044, -32417340, -30959198, -30240864, -28823526, -26287348, -23006530, -19612432, -16761647, -14723685, --12786118, -9368397, -2711735, 8783208, 26276610, 49416284, 75259640, 98729488, 114351360, 117805048, -106865232, 82032800, 46493556, 4951561, -37917044, -78324096, -113419888, -140948480, -158707632, -164144528, --154651568, -128642864, -86754584, -32558000, 27484032, 85047328, 131882880, 161876784, 172216912, 163395056, -138473504, 102116608, 59641528, 16258599, -23465554, -55970940, -78933984, -91351272, -93557272, -87172800, --74826384, -59545428, -44037372, -30204358, -18999324, -10519986, -4220342, 817118, 5617281, 11120207, -18055506, 26812408, 37246492, 48491256, 58960776, 66642860, 69566656, 66279936, 56247964, 40042516, -19180250, -4301410, -28228672, -50518480, -69346008, -83255792, -91117728, -92039536, -85456424, -71343704, --50351512, -23885386, 5788006, 35614404, 62179852, 82309824, 93587872, 94823216, 86394880, 70160976, -48873508, 25526602, 2877091, -16967268, -32840930, -44412648, -51804284, -55371256, -55631100, -53061636, --47908212, -40312028, -30549566, -19041200, -6323266, 6787659, 19158238, 29657286, 37421512, 41853384, -42696268, 40242232, 35249872, 28576564, 21034602, 13422310, 6296959, -242129, -6320045, -12029130, --17589502, -23371602, -29429652, -35311072, -40429600, -44040056, -44704168, -40561136, -30383136, -13873818, -8616778, 35296580, 61857192, 82479480, 92036856, 86772832, 64508260, 26887570, -18865644, -62464932, --94489816, -107148696, -94908040, -58954332, -9684078, 38810400, 74739944, 87122872, 66568236, 18261128, --29876866, -46610596, -28573344, -2207613, 8111583, 3517578, -1232119, -479963, 791885, -161598, --657130, 418759, 933619, 294205, 179852, 879395, 1036161, 533113, 457414, 810675, -723165, 273267, 157303, 263067, 57982, -306553, -411780, -402116, -574452, -774705, --785442, -737124, -769336, -770947, -658741, -520228, -406411, -269509, -93952, }, +-257189088, -369215776, -400231360, -368604832, -319033920, -265362944, -188068032, -89787368, -9621264, 29767882, +50291920, 77778096, 108183248, 133607304, 170049568, 232137616, 298603840, 326322496, 290237248, 197401536, +73890616, -49498424, -148477552, -214940032, -253075584, -264258608, -244663888, -199331584, -146193168, -100364792, +-62904628, -28640452, 4153234, 36403068, 71977208, 112137304, 150219696, 175712480, 181030192, 163381088, +124666256, 72294504, 17459578, -29639032, -62694712, -79011296, -79526688, -69355672, -55715388, -44043816, +-36359044, -32417340, -30959198, -30240864, -28823526, -26287348, -23006530, -19612432, -16761647, -14723685, +-12786118, -9368397, -2711735, 8783208, 26276610, 49416284, 75259640, 98729488, 114351360, 117805048, +106865232, 82032800, 46493556, 4951561, -37917044, -78324096, -113419888, -140948480, -158707632, -164144528, +-154651568, -128642864, -86754584, -32558000, 27484032, 85047328, 131882880, 161876784, 172216912, 163395056, +138473504, 102116608, 59641528, 16258599, -23465554, -55970940, -78933984, -91351272, -93557272, -87172800, +-74826384, -59545428, -44037372, -30204358, -18999324, -10519986, -4220342, 817118, 5617281, 11120207, +18055506, 26812408, 37246492, 48491256, 58960776, 66642860, 69566656, 66279936, 56247964, 40042516, +19180250, -4301410, -28228672, -50518480, -69346008, -83255792, -91117728, -92039536, -85456424, -71343704, +-50351512, -23885386, 5788006, 35614404, 62179852, 82309824, 93587872, 94823216, 86394880, 70160976, +48873508, 25526602, 2877091, -16967268, -32840930, -44412648, -51804284, -55371256, -55631100, -53061636, +-47908212, -40312028, -30549566, -19041200, -6323266, 6787659, 19158238, 29657286, 37421512, 41853384, +42696268, 40242232, 35249872, 28576564, 21034602, 13422310, 6296959, -242129, -6320045, -12029130, +-17589502, -23371602, -29429652, -35311072, -40429600, -44040056, -44704168, -40561136, -30383136, -13873818, +8616778, 35296580, 61857192, 82479480, 92036856, 86772832, 64508260, 26887570, -18865644, -62464932, +-94489816, -107148696, -94908040, -58954332, -9684078, 38810400, 74739944, 87122872, 66568236, 18261128, +-29876866, -46610596, -28573344, -2207613, 8111583, 3517578, -1232119, -479963, 791885, -161598, +-657130, 418759, 933619, 294205, 179852, 879395, 1036161, 533113, 457414, 810675, +723165, 273267, 157303, 263067, 57982, -306553, -411780, -402116, -574452, -774705, +-785442, -737124, -769336, -770947, -658741, -520228, -406411, -269509, -93952, }, { 6211060, -34978752, 80612776, 109325712, 110260400, 92930208, 42263016, -53406844, -146626960, -180780000, -181451632, --218612768, -291483328, -334530176, -329071808, -323580704, -343249504, -359814656, -357419648, -356058144, -359599904, --343069088, -302278176, -264480864, -243390432, -228616272, -220896080, -233855600, -258485632, -265091824, -244069040, --213233856, -184628832, -152695216, -115064320, -79634600, -49862424, -22612466, -731218, 7459822, 524523, --15042049, -33455110, -50982336, -62585188, -64738580, -59263032, -50605452, -42732240, -40575092, -49833432, --73002632, -108290624, -152267872, -200412304, -246377040, -284815392, -314633184, -337180160, -352783232, -361140192, --363007424, -359134432, -348979520, -332006336, -308914464, -280828576, -248721024, -214081568, -178794656, -144102592, --110534208, -78451336, -47745004, -17543868, 12916577, 43589624, 74150464, 104460584, 134023920, 161468224, -184815664, 202076608, 211709680, 212568672, 203110080, 180917440, 143664512, 90120224, 19548544, -68624448, --172849888, -288047360, -407998272, -528383520, -645873408, -755773568, -853351488, -936860672, -1006812288, -1062875008, --1103973504, -1130945408, -1146318720, -1151125376, -1144086400, -1124344064, -1093229184, -1052873088, -1004816704, -950963712, --894673344, -839560896, -787456512, -738373568, -692276224, -649974016, -612192832, -578741504, -549220032, -523921600, --503275680, -486701408, -472745984, -460297024, -449115616, -439285504, -430778240, -423759712, -418975680, -417571744, --420481600, -428016032, -440041952, -456500800, -477438752, -502406496, -530226048, -559775424, -590655168, -622515776, --653955456, -682810688, -707459520, -727025216, -740269312, -745413568, -741645312, -729996288, -712013760, -688337216, --659459456, -627038912, -593065216, -558063360, -521429440, -483322336, -444842112, -406379616, -367223456, -327093984, --286897920, -247544192, -208959824, -170764672, -133316856, -97519376, -63731944, -31346282, 276489, 30821222, -59784872, 88011400, 117109800, 147303952, 177724672, 209031760, 243277152, 280708864, 319700192, 360357952, -404555328, 451731232, 498806240, 544664128, 589579264, 629760832, 658198912, 670943680, 666074816, 637512704, -578303936, 489051808, 374302112, 234066048, 70973264, -98681704, -255379824, -389007008, -478705248, -472851744, --333534272, -111147312, 68010808, 117137720, 67772976, 12375411, -2839510, 2132451, 1378148, -2444910, --650688, 2015950, 204548, -1671279, 1074, 1360431, -106300, -1068910, 222265, 907312, --214212, -693637, 259309, 566399, -253940, -448287, 227096, 315143, -245887, -266288, -176094, 139050, -197569, -118112, 121870, 20401, -115964, 9127, 60666, }, +34978752, 80612776, 109325712, 110260400, 92930208, 42263016, -53406844, -146626960, -180780000, -181451632, +-218612768, -291483328, -334530176, -329071808, -323580704, -343249504, -359814656, -357419648, -356058144, -359599904, +-343069088, -302278176, -264480864, -243390432, -228616272, -220896080, -233855600, -258485632, -265091824, -244069040, +-213233856, -184628832, -152695216, -115064320, -79634600, -49862424, -22612466, -731218, 7459822, 524523, +-15042049, -33455110, -50982336, -62585188, -64738580, -59263032, -50605452, -42732240, -40575092, -49833432, +-73002632, -108290624, -152267872, -200412304, -246377040, -284815392, -314633184, -337180160, -352783232, -361140192, +-363007424, -359134432, -348979520, -332006336, -308914464, -280828576, -248721024, -214081568, -178794656, -144102592, +-110534208, -78451336, -47745004, -17543868, 12916577, 43589624, 74150464, 104460584, 134023920, 161468224, +184815664, 202076608, 211709680, 212568672, 203110080, 180917440, 143664512, 90120224, 19548544, -68624448, +-172849888, -288047360, -407998272, -528383520, -645873408, -755773568, -853351488, -936860672, -1006812288, -1062875008, +-1103973504, -1130945408, -1146318720, -1151125376, -1144086400, -1124344064, -1093229184, -1052873088, -1004816704, -950963712, +-894673344, -839560896, -787456512, -738373568, -692276224, -649974016, -612192832, -578741504, -549220032, -523921600, +-503275680, -486701408, -472745984, -460297024, -449115616, -439285504, -430778240, -423759712, -418975680, -417571744, +-420481600, -428016032, -440041952, -456500800, -477438752, -502406496, -530226048, -559775424, -590655168, -622515776, +-653955456, -682810688, -707459520, -727025216, -740269312, -745413568, -741645312, -729996288, -712013760, -688337216, +-659459456, -627038912, -593065216, -558063360, -521429440, -483322336, -444842112, -406379616, -367223456, -327093984, +-286897920, -247544192, -208959824, -170764672, -133316856, -97519376, -63731944, -31346282, 276489, 30821222, +59784872, 88011400, 117109800, 147303952, 177724672, 209031760, 243277152, 280708864, 319700192, 360357952, +404555328, 451731232, 498806240, 544664128, 589579264, 629760832, 658198912, 670943680, 666074816, 637512704, +578303936, 489051808, 374302112, 234066048, 70973264, -98681704, -255379824, -389007008, -478705248, -472851744, +-333534272, -111147312, 68010808, 117137720, 67772976, 12375411, -2839510, 2132451, 1378148, -2444910, +-650688, 2015950, 204548, -1671279, 1074, 1360431, -106300, -1068910, 222265, 907312, +-214212, -693637, 259309, 566399, -253940, -448287, 227096, 315143, -245887, -266288, +176094, 139050, -197569, -118112, 121870, 20401, -115964, 9127, 60666, }, }, { { 7603166, -42476688, 103279464, 146589920, 135250672, 80335752, 11234561, -65767760, -149280720, -208833120, -214609856, --191591504, -195253504, -231171248, -247936112, -220656096, -190400192, -197253888, -220569120, -219633360, -197185712, --183433760, -182333712, -173349168, -152315104, -135353744, -128052304, -118505664, -99485400, -77576240, -60952564, --51844012, -49365816, -49600968, -45003740, -30903900, -10552198, 9705015, 26149908, 36463200, 38291244, -31807454, 19619410, 2814277, -19248970, -45126148, -71135392, -95098096, -117431384, -139254656, -161874640, --187139776, -216240336, -248834304, -283934368, -320240800, -355665184, -388487840, -418700800, -446400640, -469913984, --487608160, -500139808, -508678752, -512512544, -510573888, -503515648, -492055072, -474965408, -450726208, -419716000, --383359104, -342749664, -299282976, -255128032, -212111792, -171212960, -133291088, -99048392, -68507952, -41831372, --20184736, -4600447, 5168993, 9294309, 6242735, -6143414, -28790240, -61982820, -107035416, -165830832, --238823264, -324541696, -421067872, -526965120, -640141760, -756518208, -871110080, -980573248, -1083398528, -1177353088, --1258720128, -1325160064, -1377268224, -1415646976, -1438483328, -1444116736, -1434029440, -1410808192, -1374958592, -1326537728, --1268522880, -1205691776, -1141034880, -1075703552, -1011597376, -951476992, -896733888, -846954688, -801676032, -761317824, --726391168, -696634560, -671082176, -648755904, -629198720, -612108032, -596566656, -581449984, -566881472, -554386304, --545277248, -539866112, -538575488, -542615424, -552946432, -569424640, -591395520, -618458112, -650345536, -686426496, --725362560, -765176896, -804046336, -840819840, -874014592, -900821056, -918468544, -926077632, -923566656, -909549504, --882574464, -843826880, -796154880, -740955392, -678549504, -610973056, -541576576, -472080256, -402478176, -333600832, --267507744, -205489488, -147484880, -93419832, -43877924, 492848, 39701604, 74688944, 106660144, 135861088, -162007776, 186297424, 211087984, 236946368, 262724224, 289269280, 319466112, 353746400, 390006112, 428802560, -473271584, 523070112, 574500736, 626924032, 681552256, 733620160, 773950400, 797709120, 802263936, 778438656, -715712832, 614000448, 478078176, 306086208, 100260640, -117822768, -322167104, -499343648, -620302272, -613854976, --428609280, -133701256, 100466800, 159385168, 88751208, 13932337, -4886599, 2917357, 1884417, -3468186, --879395, 2867965, 268972, -2379412, 20401, 1941862, -180926, -1547262, 338229, 1308354, --344671, -1014686, 410169, 827855, -409096, -651224, 383326, 463856, -403727, -373662, -319438, 195421, -336618, -142808, 237297, 3221, -216896, 54224, 134755, }, +42476688, 103279464, 146589920, 135250672, 80335752, 11234561, -65767760, -149280720, -208833120, -214609856, +-191591504, -195253504, -231171248, -247936112, -220656096, -190400192, -197253888, -220569120, -219633360, -197185712, +-183433760, -182333712, -173349168, -152315104, -135353744, -128052304, -118505664, -99485400, -77576240, -60952564, +-51844012, -49365816, -49600968, -45003740, -30903900, -10552198, 9705015, 26149908, 36463200, 38291244, +31807454, 19619410, 2814277, -19248970, -45126148, -71135392, -95098096, -117431384, -139254656, -161874640, +-187139776, -216240336, -248834304, -283934368, -320240800, -355665184, -388487840, -418700800, -446400640, -469913984, +-487608160, -500139808, -508678752, -512512544, -510573888, -503515648, -492055072, -474965408, -450726208, -419716000, +-383359104, -342749664, -299282976, -255128032, -212111792, -171212960, -133291088, -99048392, -68507952, -41831372, +-20184736, -4600447, 5168993, 9294309, 6242735, -6143414, -28790240, -61982820, -107035416, -165830832, +-238823264, -324541696, -421067872, -526965120, -640141760, -756518208, -871110080, -980573248, -1083398528, -1177353088, +-1258720128, -1325160064, -1377268224, -1415646976, -1438483328, -1444116736, -1434029440, -1410808192, -1374958592, -1326537728, +-1268522880, -1205691776, -1141034880, -1075703552, -1011597376, -951476992, -896733888, -846954688, -801676032, -761317824, +-726391168, -696634560, -671082176, -648755904, -629198720, -612108032, -596566656, -581449984, -566881472, -554386304, +-545277248, -539866112, -538575488, -542615424, -552946432, -569424640, -591395520, -618458112, -650345536, -686426496, +-725362560, -765176896, -804046336, -840819840, -874014592, -900821056, -918468544, -926077632, -923566656, -909549504, +-882574464, -843826880, -796154880, -740955392, -678549504, -610973056, -541576576, -472080256, -402478176, -333600832, +-267507744, -205489488, -147484880, -93419832, -43877924, 492848, 39701604, 74688944, 106660144, 135861088, +162007776, 186297424, 211087984, 236946368, 262724224, 289269280, 319466112, 353746400, 390006112, 428802560, +473271584, 523070112, 574500736, 626924032, 681552256, 733620160, 773950400, 797709120, 802263936, 778438656, +715712832, 614000448, 478078176, 306086208, 100260640, -117822768, -322167104, -499343648, -620302272, -613854976, +-428609280, -133701256, 100466800, 159385168, 88751208, 13932337, -4886599, 2917357, 1884417, -3468186, +-879395, 2867965, 268972, -2379412, 20401, 1941862, -180926, -1547262, 338229, 1308354, +-344671, -1014686, 410169, 827855, -409096, -651224, 383326, 463856, -403727, -373662, +319438, 195421, -336618, -142808, 237297, 3221, -216896, 54224, 134755, }, { -121878824, --327949216, -439449792, -444052896, -368775552, -245396720, -86296632, 97207456, 264143712, 356090368, 346550720, -263938096, 159234304, 62198104, -24681030, -102201968, -160068592, -186791344, -183981904, -163771392, -133201432, --87697328, -23809152, 46788300, 103827080, 137113072, 150406000, 147602992, 125509144, 83242912, 29804388, --22716618, -67662376, -102038760, -122054920, -124664648, -110078936, -80458160, -39591008, 4912369, 43421584, -70509408, 86873768, 94564440, 93348968, 82163800, 60991756, 30705794, -6274947, -44485660, -76545984, --96388728, -100801272, -89162448, -63834488, -30457224, 3966939, 33825552, 55890408, 69000264, 73880416, -72445896, 66097400, 54684060, 37191732, 12969727, -17504676, -51842404, -85010288, -109748760, -118309168, --104737608, -67371392, -11078868, 52457656, 107721000, 140508240, 142736256, 114968760, 65752728, 7995082, --45689324, -86133960, -108403360, -111204760, -96031712, -66442072, -27694486, 13394392, 49216568, 73181408, -81637128, 74689480, 55739548, 30266634, 4209068, -17627620, -32488206, -39666708, -40008696, -35300872, --27625766, -18796924, -10100689, -2289218, 4378719, 10022843, 14871861, 19003620, 22226456, 24037322, -23637890, 20209432, 13393856, 3655017, -7693360, -18708878, -27219356, -31388158, -30255898, -23992224, --13833553, -1796907, 9791452, 18900540, 24272470, 25560960, 23177792, 18026514, 11200738, 3724274, --3570729, -10016937, -15056008, -18243410, -19265612, -17955110, -14359686, -8842264, -2096481, 4945655, -11243151, 15796353, 17865990, 17185238, 14020921, 9051107, 3195456, -2569464, -7425999, -10878615, --12737262, -13000866, -11812771, -9455371, -6269042, -2563559, 1353452, 5134097, 8430484, 10930155, -12307766, 12255152, 10621454, 7481296, 3088618, -2079838, -7271917, -11628624, -14440217, -15199352, --13622563, -9851581, -4516158, 1581622, 7680476, 12921946, 16411070, 17614198, 16370268, 12476343, -5845988, -2801929, -11996917, -20175072, -25573310, -25850872, -19255950, -6481106, 9387725, 24314884, -33745560, 33120640, 20860656, 999654, -18942416, -32137092, -33390686, -19749870, 4261145, 23944980, -25036438, 9262097, -6587943, -9628780, -3402151, 1152125, 552440, -816581, -246424, 438624, --35970, -354335, 189515, 510027, 148176, -16106, 305480, 378494, 28454, -121870, -37044, -1074, -271657, -336618, -187368, -178241, -283468, -211527, -19864, 46171, -44023, 150861, 278636, 281320, 241055, 255014, 233539, 123480, 26844, }, +-327949216, -439449792, -444052896, -368775552, -245396720, -86296632, 97207456, 264143712, 356090368, 346550720, +263938096, 159234304, 62198104, -24681030, -102201968, -160068592, -186791344, -183981904, -163771392, -133201432, +-87697328, -23809152, 46788300, 103827080, 137113072, 150406000, 147602992, 125509144, 83242912, 29804388, +-22716618, -67662376, -102038760, -122054920, -124664648, -110078936, -80458160, -39591008, 4912369, 43421584, +70509408, 86873768, 94564440, 93348968, 82163800, 60991756, 30705794, -6274947, -44485660, -76545984, +-96388728, -100801272, -89162448, -63834488, -30457224, 3966939, 33825552, 55890408, 69000264, 73880416, +72445896, 66097400, 54684060, 37191732, 12969727, -17504676, -51842404, -85010288, -109748760, -118309168, +-104737608, -67371392, -11078868, 52457656, 107721000, 140508240, 142736256, 114968760, 65752728, 7995082, +-45689324, -86133960, -108403360, -111204760, -96031712, -66442072, -27694486, 13394392, 49216568, 73181408, +81637128, 74689480, 55739548, 30266634, 4209068, -17627620, -32488206, -39666708, -40008696, -35300872, +-27625766, -18796924, -10100689, -2289218, 4378719, 10022843, 14871861, 19003620, 22226456, 24037322, +23637890, 20209432, 13393856, 3655017, -7693360, -18708878, -27219356, -31388158, -30255898, -23992224, +-13833553, -1796907, 9791452, 18900540, 24272470, 25560960, 23177792, 18026514, 11200738, 3724274, +-3570729, -10016937, -15056008, -18243410, -19265612, -17955110, -14359686, -8842264, -2096481, 4945655, +11243151, 15796353, 17865990, 17185238, 14020921, 9051107, 3195456, -2569464, -7425999, -10878615, +-12737262, -13000866, -11812771, -9455371, -6269042, -2563559, 1353452, 5134097, 8430484, 10930155, +12307766, 12255152, 10621454, 7481296, 3088618, -2079838, -7271917, -11628624, -14440217, -15199352, +-13622563, -9851581, -4516158, 1581622, 7680476, 12921946, 16411070, 17614198, 16370268, 12476343, +5845988, -2801929, -11996917, -20175072, -25573310, -25850872, -19255950, -6481106, 9387725, 24314884, +33745560, 33120640, 20860656, 999654, -18942416, -32137092, -33390686, -19749870, 4261145, 23944980, +25036438, 9262097, -6587943, -9628780, -3402151, 1152125, 552440, -816581, -246424, 438624, +-35970, -354335, 189515, 510027, 148176, -16106, 305480, 378494, 28454, -121870, +37044, -1074, -271657, -336618, -187368, -178241, -283468, -211527, -19864, 46171, +44023, 150861, 278636, 281320, 241055, 255014, 233539, 123480, 26844, }, }, { { -121878824, --327949216, -439449792, -444052896, -368775552, -245396720, -86296632, 97207456, 264143712, 356090368, 346550720, -263938096, 159234304, 62198104, -24681030, -102201968, -160068592, -186791344, -183981904, -163771392, -133201432, --87697328, -23809152, 46788300, 103827080, 137113072, 150406000, 147602992, 125509144, 83242912, 29804388, --22716618, -67662376, -102038760, -122054920, -124664648, -110078936, -80458160, -39591008, 4912369, 43421584, -70509408, 86873768, 94564440, 93348968, 82163800, 60991756, 30705794, -6274947, -44485660, -76545984, --96388728, -100801272, -89162448, -63834488, -30457224, 3966939, 33825552, 55890408, 69000264, 73880416, -72445896, 66097400, 54684060, 37191732, 12969727, -17504676, -51842404, -85010288, -109748760, -118309168, --104737608, -67371392, -11078868, 52457656, 107721000, 140508240, 142736256, 114968760, 65752728, 7995082, --45689324, -86133960, -108403360, -111204760, -96031712, -66442072, -27694486, 13394392, 49216568, 73181408, -81637128, 74689480, 55739548, 30266634, 4209068, -17627620, -32488206, -39666708, -40008696, -35300872, --27625766, -18796924, -10100689, -2289218, 4378719, 10022843, 14871861, 19003620, 22226456, 24037322, -23637890, 20209432, 13393856, 3655017, -7693360, -18708878, -27219356, -31388158, -30255898, -23992224, --13833553, -1796907, 9791452, 18900540, 24272470, 25560960, 23177792, 18026514, 11200738, 3724274, --3570729, -10016937, -15056008, -18243410, -19265612, -17955110, -14359686, -8842264, -2096481, 4945655, -11243151, 15796353, 17865990, 17185238, 14020921, 9051107, 3195456, -2569464, -7425999, -10878615, --12737262, -13000866, -11812771, -9455371, -6269042, -2563559, 1353452, 5134097, 8430484, 10930155, -12307766, 12255152, 10621454, 7481296, 3088618, -2079838, -7271917, -11628624, -14440217, -15199352, --13622563, -9851581, -4516158, 1581622, 7680476, 12921946, 16411070, 17614198, 16370268, 12476343, -5845988, -2801929, -11996917, -20175072, -25573310, -25850872, -19255950, -6481106, 9387725, 24314884, -33745560, 33120640, 20860656, 999654, -18942416, -32137092, -33390686, -19749870, 4261145, 23944980, -25036438, 9262097, -6587943, -9628780, -3402151, 1152125, 552440, -816581, -246424, 438624, --35970, -354335, 189515, 510027, 148176, -16106, 305480, 378494, 28454, -121870, -37044, -1074, -271657, -336618, -187368, -178241, -283468, -211527, -19864, 46171, -44023, 150861, 278636, 281320, 241055, 255014, 233539, 123480, 26844, }, +-327949216, -439449792, -444052896, -368775552, -245396720, -86296632, 97207456, 264143712, 356090368, 346550720, +263938096, 159234304, 62198104, -24681030, -102201968, -160068592, -186791344, -183981904, -163771392, -133201432, +-87697328, -23809152, 46788300, 103827080, 137113072, 150406000, 147602992, 125509144, 83242912, 29804388, +-22716618, -67662376, -102038760, -122054920, -124664648, -110078936, -80458160, -39591008, 4912369, 43421584, +70509408, 86873768, 94564440, 93348968, 82163800, 60991756, 30705794, -6274947, -44485660, -76545984, +-96388728, -100801272, -89162448, -63834488, -30457224, 3966939, 33825552, 55890408, 69000264, 73880416, +72445896, 66097400, 54684060, 37191732, 12969727, -17504676, -51842404, -85010288, -109748760, -118309168, +-104737608, -67371392, -11078868, 52457656, 107721000, 140508240, 142736256, 114968760, 65752728, 7995082, +-45689324, -86133960, -108403360, -111204760, -96031712, -66442072, -27694486, 13394392, 49216568, 73181408, +81637128, 74689480, 55739548, 30266634, 4209068, -17627620, -32488206, -39666708, -40008696, -35300872, +-27625766, -18796924, -10100689, -2289218, 4378719, 10022843, 14871861, 19003620, 22226456, 24037322, +23637890, 20209432, 13393856, 3655017, -7693360, -18708878, -27219356, -31388158, -30255898, -23992224, +-13833553, -1796907, 9791452, 18900540, 24272470, 25560960, 23177792, 18026514, 11200738, 3724274, +-3570729, -10016937, -15056008, -18243410, -19265612, -17955110, -14359686, -8842264, -2096481, 4945655, +11243151, 15796353, 17865990, 17185238, 14020921, 9051107, 3195456, -2569464, -7425999, -10878615, +-12737262, -13000866, -11812771, -9455371, -6269042, -2563559, 1353452, 5134097, 8430484, 10930155, +12307766, 12255152, 10621454, 7481296, 3088618, -2079838, -7271917, -11628624, -14440217, -15199352, +-13622563, -9851581, -4516158, 1581622, 7680476, 12921946, 16411070, 17614198, 16370268, 12476343, +5845988, -2801929, -11996917, -20175072, -25573310, -25850872, -19255950, -6481106, 9387725, 24314884, +33745560, 33120640, 20860656, 999654, -18942416, -32137092, -33390686, -19749870, 4261145, 23944980, +25036438, 9262097, -6587943, -9628780, -3402151, 1152125, 552440, -816581, -246424, 438624, +-35970, -354335, 189515, 510027, 148176, -16106, 305480, 378494, 28454, -121870, +37044, -1074, -271657, -336618, -187368, -178241, -283468, -211527, -19864, 46171, +44023, 150861, 278636, 281320, 241055, 255014, 233539, 123480, 26844, }, { 7603166, -42476688, 103279464, 146589920, 135250672, 80335752, 11234561, -65767760, -149280720, -208833120, -214609856, --191591504, -195253504, -231171248, -247936112, -220656096, -190400192, -197253888, -220569120, -219633360, -197185712, --183433760, -182333712, -173349168, -152315104, -135353744, -128052304, -118505664, -99485400, -77576240, -60952564, --51844012, -49365816, -49600968, -45003740, -30903900, -10552198, 9705015, 26149908, 36463200, 38291244, -31807454, 19619410, 2814277, -19248970, -45126148, -71135392, -95098096, -117431384, -139254656, -161874640, --187139776, -216240336, -248834304, -283934368, -320240800, -355665184, -388487840, -418700800, -446400640, -469913984, --487608160, -500139808, -508678752, -512512544, -510573888, -503515648, -492055072, -474965408, -450726208, -419716000, --383359104, -342749664, -299282976, -255128032, -212111792, -171212960, -133291088, -99048392, -68507952, -41831372, --20184736, -4600447, 5168993, 9294309, 6242735, -6143414, -28790240, -61982820, -107035416, -165830832, --238823264, -324541696, -421067872, -526965120, -640141760, -756518208, -871110080, -980573248, -1083398528, -1177353088, --1258720128, -1325160064, -1377268224, -1415646976, -1438483328, -1444116736, -1434029440, -1410808192, -1374958592, -1326537728, --1268522880, -1205691776, -1141034880, -1075703552, -1011597376, -951476992, -896733888, -846954688, -801676032, -761317824, --726391168, -696634560, -671082176, -648755904, -629198720, -612108032, -596566656, -581449984, -566881472, -554386304, --545277248, -539866112, -538575488, -542615424, -552946432, -569424640, -591395520, -618458112, -650345536, -686426496, --725362560, -765176896, -804046336, -840819840, -874014592, -900821056, -918468544, -926077632, -923566656, -909549504, --882574464, -843826880, -796154880, -740955392, -678549504, -610973056, -541576576, -472080256, -402478176, -333600832, --267507744, -205489488, -147484880, -93419832, -43877924, 492848, 39701604, 74688944, 106660144, 135861088, -162007776, 186297424, 211087984, 236946368, 262724224, 289269280, 319466112, 353746400, 390006112, 428802560, -473271584, 523070112, 574500736, 626924032, 681552256, 733620160, 773950400, 797709120, 802263936, 778438656, -715712832, 614000448, 478078176, 306086208, 100260640, -117822768, -322167104, -499343648, -620302272, -613854976, --428609280, -133701256, 100466800, 159385168, 88751208, 13932337, -4886599, 2917357, 1884417, -3468186, --879395, 2867965, 268972, -2379412, 20401, 1941862, -180926, -1547262, 338229, 1308354, --344671, -1014686, 410169, 827855, -409096, -651224, 383326, 463856, -403727, -373662, -319438, 195421, -336618, -142808, 237297, 3221, -216896, 54224, 134755, }, +42476688, 103279464, 146589920, 135250672, 80335752, 11234561, -65767760, -149280720, -208833120, -214609856, +-191591504, -195253504, -231171248, -247936112, -220656096, -190400192, -197253888, -220569120, -219633360, -197185712, +-183433760, -182333712, -173349168, -152315104, -135353744, -128052304, -118505664, -99485400, -77576240, -60952564, +-51844012, -49365816, -49600968, -45003740, -30903900, -10552198, 9705015, 26149908, 36463200, 38291244, +31807454, 19619410, 2814277, -19248970, -45126148, -71135392, -95098096, -117431384, -139254656, -161874640, +-187139776, -216240336, -248834304, -283934368, -320240800, -355665184, -388487840, -418700800, -446400640, -469913984, +-487608160, -500139808, -508678752, -512512544, -510573888, -503515648, -492055072, -474965408, -450726208, -419716000, +-383359104, -342749664, -299282976, -255128032, -212111792, -171212960, -133291088, -99048392, -68507952, -41831372, +-20184736, -4600447, 5168993, 9294309, 6242735, -6143414, -28790240, -61982820, -107035416, -165830832, +-238823264, -324541696, -421067872, -526965120, -640141760, -756518208, -871110080, -980573248, -1083398528, -1177353088, +-1258720128, -1325160064, -1377268224, -1415646976, -1438483328, -1444116736, -1434029440, -1410808192, -1374958592, -1326537728, +-1268522880, -1205691776, -1141034880, -1075703552, -1011597376, -951476992, -896733888, -846954688, -801676032, -761317824, +-726391168, -696634560, -671082176, -648755904, -629198720, -612108032, -596566656, -581449984, -566881472, -554386304, +-545277248, -539866112, -538575488, -542615424, -552946432, -569424640, -591395520, -618458112, -650345536, -686426496, +-725362560, -765176896, -804046336, -840819840, -874014592, -900821056, -918468544, -926077632, -923566656, -909549504, +-882574464, -843826880, -796154880, -740955392, -678549504, -610973056, -541576576, -472080256, -402478176, -333600832, +-267507744, -205489488, -147484880, -93419832, -43877924, 492848, 39701604, 74688944, 106660144, 135861088, +162007776, 186297424, 211087984, 236946368, 262724224, 289269280, 319466112, 353746400, 390006112, 428802560, +473271584, 523070112, 574500736, 626924032, 681552256, 733620160, 773950400, 797709120, 802263936, 778438656, +715712832, 614000448, 478078176, 306086208, 100260640, -117822768, -322167104, -499343648, -620302272, -613854976, +-428609280, -133701256, 100466800, 159385168, 88751208, 13932337, -4886599, 2917357, 1884417, -3468186, +-879395, 2867965, 268972, -2379412, 20401, 1941862, -180926, -1547262, 338229, 1308354, +-344671, -1014686, 410169, 827855, -409096, -651224, 383326, 463856, -403727, -373662, +319438, 195421, -336618, -142808, 237297, 3221, -216896, 54224, 134755, }, }, { { 22941568, -60834992, 94597728, 135659232, 151335328, 93556200, -15516643, -96951904, -125620280, -154287040, -207301968, --228418704, -174931328, -95768104, -61450780, -67413272, -64889440, -49018460, -53573276, -80212808, -94167696, --85941760, -86875912, -117151136, -155600224, -170909104, -157015952, -129109400, -103067400, -85586888, -71761384, --48570176, -10253161, 29126858, 47252692, 37082212, 10780368, -17792438, -44844292, -71080096, -94165008, --110759688, -121372552, -130140728, -141675936, -159057136, -183318336, -214228672, -251893392, -296846112, -347995968, --401685216, -453714432, -501417024, -543284928, -578109568, -605895872, -628941056, -650780416, -674133760, -700343296, --730119744, -763450816, -798361408, -830556992, -855029760, -867926976, -866865088, -850513600, -819124864, -775252864, --722731328, -664644608, -602938240, -539823168, -478321376, -420980896, -368797024, -321822976, -280324448, -245082112, --217063360, -197146512, -185978528, -183895472, -190771168, -205554448, -226081712, -250233920, -277758208, -310404256, --350039296, -397613568, -454370496, -522581024, -603616832, -695994112, -796599936, -903032960, -1012979328, -1121766528, --1222814720, -1311025920, -1384092928, -1440244224, -1477094528, -1494116608, -1494412928, -1482181376, -1459547520, -1427511296, --1388589824, -1346003072, -1300631040, -1251070336, -1196795264, -1139278720, -1079781632, -1018152064, -954703040, -891668480, --831614144, -775381696, -722612672, -673521728, -628960384, -589041856, -552887360, -520006720, -491207360, -467731072, --449969760, -437531008, -430267680, -428568480, -432568160, -441643424, -454992192, -472407200, -494080704, -519696960, --547997056, -577340800, -606388160, -633769664, -657122496, -673232384, -679566400, -675043776, -658866240, -629654528, --586888512, -532360128, -468847232, -398032864, -321164224, -240938000, -160777808, -82597592, -7059853, 64257004, -128806608, 185087328, 233052448, 272529632, 302702848, 323317088, 335299520, 340011616, 338508384, 331614976, -320457696, 306831936, 292658528, 278890496, 265742512, 254260448, 246242816, 242156704, 241125376, 243671744, -251926144, 266340592, 285317376, 308789888, 338100896, 371314432, 403117056, 429964896, 449832320, 456690848, -442260288, 403697920, 342134400, 255046432, 140796000, 9450002, -123436824, -249365808, -352794528, -388898560, --312111520, -143997904, 17201344, 83570936, 59500328, 15437723, -1094143, 1642288, 1639067, -1799591, --961536, 1548873, 506806, -1336272, -270046, 1126892, 141734, -891743, 17717, 785442, --37044, -605054, 112743, 501974, -137976, -407485, 129386, 281320, -176094, -251256, -115964, 123480, -159451, -115427, 89657, 18254, -98247, 2684, 48318, }, +60834992, 94597728, 135659232, 151335328, 93556200, -15516643, -96951904, -125620280, -154287040, -207301968, +-228418704, -174931328, -95768104, -61450780, -67413272, -64889440, -49018460, -53573276, -80212808, -94167696, +-85941760, -86875912, -117151136, -155600224, -170909104, -157015952, -129109400, -103067400, -85586888, -71761384, +-48570176, -10253161, 29126858, 47252692, 37082212, 10780368, -17792438, -44844292, -71080096, -94165008, +-110759688, -121372552, -130140728, -141675936, -159057136, -183318336, -214228672, -251893392, -296846112, -347995968, +-401685216, -453714432, -501417024, -543284928, -578109568, -605895872, -628941056, -650780416, -674133760, -700343296, +-730119744, -763450816, -798361408, -830556992, -855029760, -867926976, -866865088, -850513600, -819124864, -775252864, +-722731328, -664644608, -602938240, -539823168, -478321376, -420980896, -368797024, -321822976, -280324448, -245082112, +-217063360, -197146512, -185978528, -183895472, -190771168, -205554448, -226081712, -250233920, -277758208, -310404256, +-350039296, -397613568, -454370496, -522581024, -603616832, -695994112, -796599936, -903032960, -1012979328, -1121766528, +-1222814720, -1311025920, -1384092928, -1440244224, -1477094528, -1494116608, -1494412928, -1482181376, -1459547520, -1427511296, +-1388589824, -1346003072, -1300631040, -1251070336, -1196795264, -1139278720, -1079781632, -1018152064, -954703040, -891668480, +-831614144, -775381696, -722612672, -673521728, -628960384, -589041856, -552887360, -520006720, -491207360, -467731072, +-449969760, -437531008, -430267680, -428568480, -432568160, -441643424, -454992192, -472407200, -494080704, -519696960, +-547997056, -577340800, -606388160, -633769664, -657122496, -673232384, -679566400, -675043776, -658866240, -629654528, +-586888512, -532360128, -468847232, -398032864, -321164224, -240938000, -160777808, -82597592, -7059853, 64257004, +128806608, 185087328, 233052448, 272529632, 302702848, 323317088, 335299520, 340011616, 338508384, 331614976, +320457696, 306831936, 292658528, 278890496, 265742512, 254260448, 246242816, 242156704, 241125376, 243671744, +251926144, 266340592, 285317376, 308789888, 338100896, 371314432, 403117056, 429964896, 449832320, 456690848, +442260288, 403697920, 342134400, 255046432, 140796000, 9450002, -123436824, -249365808, -352794528, -388898560, +-312111520, -143997904, 17201344, 83570936, 59500328, 15437723, -1094143, 1642288, 1639067, -1799591, +-961536, 1548873, 506806, -1336272, -270046, 1126892, 141734, -891743, 17717, 785442, +-37044, -605054, 112743, 501974, -137976, -407485, 129386, 281320, -176094, -251256, +115964, 123480, -159451, -115427, 89657, 18254, -98247, 2684, 48318, }, { -134705744, --355052064, -462366656, -454684576, -356599328, -183986192, 41270340, 262388672, 404438816, 426639488, 346103488, -208141632, 46766824, -119401168, -266116176, -356898368, -362558592, -282236800, -142683104, 19489488, 171758432, -286208576, 336999776, 307832128, 205007376, 59145996, -89700392, -208730576, -276980288, -282773120, -225548064, --120158152, 6200322, 123784712, 207463024, 239510464, 213983328, 141544944, 46180564, -46616500, -119248160, --162227360, -170816224, -145180096, -92382600, -25236154, 41639708, 95004136, 124838056, 126479808, 102404368, -61247308, 13972065, -29905320, -63705640, -83256864, -86804512, -75461504, -52934400, -24138790, 6084358, -33353642, 53966264, 65539592, 67355288, 59813324, 43739412, 20334522, -8456254, -39436388, -67427232, --85135912, -85208928, -64182380, -25450366, 21178484, 62900332, 88331368, 91328184, 72951096, 40411348, -3381750, -29947196, -54736672, -69009384, -72172096, -63930052, -44290240, -14661408, 20721070, 54373748, -77168216, 81717656, 65875136, 34143380, -4037806, -38145216, -60307248, -67199592, -59830504, -42037528, --18751828, 5282273, 26208964, 41352480, 49213884, 49219252, 41464688, 26736172, 6737730, -15744276, --36872296, -52103860, -57128972, -49394272, -29525216, -1772748, 26890254, 48787608, 58082452, 52814140, -35395364, 11363410, -12761422, -31455804, -41445896, -42038068, -34630320, -21813602, -6573985, 8270497, -20461224, 28472948, 31444530, 29120952, 21932788, 11050951, -1744294, -14279693, -24270324, -29755534, --29578366, -23648090, -12975096, 421444, 13831405, 24459838, 30067992, 29402810, 22509386, 10887742, --2807835, -15531675, -24613920, -28263032, -25919590, -18389440, -7525857, 4358318, 14934138, 22187802, -24834574, 22589918, 16065862, 6547141, -4144644, -13931800, -20942260, -23813984, -21829172, -15197205, --5259725, 5860483, 15851114, 22525492, 24193550, 20387672, 12138651, 1318555, -9976135, -19389092, --24594056, -24252070, -18323942, -7525857, 6455873, 20078436, 28725278, 29109140, 20496120, 4436701, --14688788, -29411936, -32658932, -22777286, -4110821, 16222091, 29726006, 27842126, 9167608, -13823889, --22857280, -12723304, 3033321, 8892193, 4354023, -463856, -427886, 914291, 268435, -825707, --612570, -216896, -677531, -992137, -438087, 107911, 82678, 163209, 664646, 923418, -667867, 439697, 420907, 186294, -307627, -612570, -645319, -705985, -776315, -590021, --216359, 78920, 310311, 594316, 802085, 790274, 652835, 476741, 187368, }, +-355052064, -462366656, -454684576, -356599328, -183986192, 41270340, 262388672, 404438816, 426639488, 346103488, +208141632, 46766824, -119401168, -266116176, -356898368, -362558592, -282236800, -142683104, 19489488, 171758432, +286208576, 336999776, 307832128, 205007376, 59145996, -89700392, -208730576, -276980288, -282773120, -225548064, +-120158152, 6200322, 123784712, 207463024, 239510464, 213983328, 141544944, 46180564, -46616500, -119248160, +-162227360, -170816224, -145180096, -92382600, -25236154, 41639708, 95004136, 124838056, 126479808, 102404368, +61247308, 13972065, -29905320, -63705640, -83256864, -86804512, -75461504, -52934400, -24138790, 6084358, +33353642, 53966264, 65539592, 67355288, 59813324, 43739412, 20334522, -8456254, -39436388, -67427232, +-85135912, -85208928, -64182380, -25450366, 21178484, 62900332, 88331368, 91328184, 72951096, 40411348, +3381750, -29947196, -54736672, -69009384, -72172096, -63930052, -44290240, -14661408, 20721070, 54373748, +77168216, 81717656, 65875136, 34143380, -4037806, -38145216, -60307248, -67199592, -59830504, -42037528, +-18751828, 5282273, 26208964, 41352480, 49213884, 49219252, 41464688, 26736172, 6737730, -15744276, +-36872296, -52103860, -57128972, -49394272, -29525216, -1772748, 26890254, 48787608, 58082452, 52814140, +35395364, 11363410, -12761422, -31455804, -41445896, -42038068, -34630320, -21813602, -6573985, 8270497, +20461224, 28472948, 31444530, 29120952, 21932788, 11050951, -1744294, -14279693, -24270324, -29755534, +-29578366, -23648090, -12975096, 421444, 13831405, 24459838, 30067992, 29402810, 22509386, 10887742, +-2807835, -15531675, -24613920, -28263032, -25919590, -18389440, -7525857, 4358318, 14934138, 22187802, +24834574, 22589918, 16065862, 6547141, -4144644, -13931800, -20942260, -23813984, -21829172, -15197205, +-5259725, 5860483, 15851114, 22525492, 24193550, 20387672, 12138651, 1318555, -9976135, -19389092, +-24594056, -24252070, -18323942, -7525857, 6455873, 20078436, 28725278, 29109140, 20496120, 4436701, +-14688788, -29411936, -32658932, -22777286, -4110821, 16222091, 29726006, 27842126, 9167608, -13823889, +-22857280, -12723304, 3033321, 8892193, 4354023, -463856, -427886, 914291, 268435, -825707, +-612570, -216896, -677531, -992137, -438087, 107911, 82678, 163209, 664646, 923418, +667867, 439697, 420907, 186294, -307627, -612570, -645319, -705985, -776315, -590021, +-216359, 78920, 310311, 594316, 802085, 790274, 652835, 476741, 187368, }, }, { { -134705744, --355052064, -462366656, -454684576, -356599328, -183986192, 41270340, 262388672, 404438816, 426639488, 346103488, -208141632, 46766824, -119401168, -266116176, -356898368, -362558592, -282236800, -142683104, 19489488, 171758432, -286208576, 336999776, 307832128, 205007376, 59145996, -89700392, -208730576, -276980288, -282773120, -225548064, --120158152, 6200322, 123784712, 207463024, 239510464, 213983328, 141544944, 46180564, -46616500, -119248160, --162227360, -170816224, -145180096, -92382600, -25236154, 41639708, 95004136, 124838056, 126479808, 102404368, -61247308, 13972065, -29905320, -63705640, -83256864, -86804512, -75461504, -52934400, -24138790, 6084358, -33353642, 53966264, 65539592, 67355288, 59813324, 43739412, 20334522, -8456254, -39436388, -67427232, --85135912, -85208928, -64182380, -25450366, 21178484, 62900332, 88331368, 91328184, 72951096, 40411348, -3381750, -29947196, -54736672, -69009384, -72172096, -63930052, -44290240, -14661408, 20721070, 54373748, -77168216, 81717656, 65875136, 34143380, -4037806, -38145216, -60307248, -67199592, -59830504, -42037528, --18751828, 5282273, 26208964, 41352480, 49213884, 49219252, 41464688, 26736172, 6737730, -15744276, --36872296, -52103860, -57128972, -49394272, -29525216, -1772748, 26890254, 48787608, 58082452, 52814140, -35395364, 11363410, -12761422, -31455804, -41445896, -42038068, -34630320, -21813602, -6573985, 8270497, -20461224, 28472948, 31444530, 29120952, 21932788, 11050951, -1744294, -14279693, -24270324, -29755534, --29578366, -23648090, -12975096, 421444, 13831405, 24459838, 30067992, 29402810, 22509386, 10887742, --2807835, -15531675, -24613920, -28263032, -25919590, -18389440, -7525857, 4358318, 14934138, 22187802, -24834574, 22589918, 16065862, 6547141, -4144644, -13931800, -20942260, -23813984, -21829172, -15197205, --5259725, 5860483, 15851114, 22525492, 24193550, 20387672, 12138651, 1318555, -9976135, -19389092, --24594056, -24252070, -18323942, -7525857, 6455873, 20078436, 28725278, 29109140, 20496120, 4436701, --14688788, -29411936, -32658932, -22777286, -4110821, 16222091, 29726006, 27842126, 9167608, -13823889, --22857280, -12723304, 3033321, 8892193, 4354023, -463856, -427886, 914291, 268435, -825707, --612570, -216896, -677531, -992137, -438087, 107911, 82678, 163209, 664646, 923418, -667867, 439697, 420907, 186294, -307627, -612570, -645319, -705985, -776315, -590021, --216359, 78920, 310311, 594316, 802085, 790274, 652835, 476741, 187368, }, +-355052064, -462366656, -454684576, -356599328, -183986192, 41270340, 262388672, 404438816, 426639488, 346103488, +208141632, 46766824, -119401168, -266116176, -356898368, -362558592, -282236800, -142683104, 19489488, 171758432, +286208576, 336999776, 307832128, 205007376, 59145996, -89700392, -208730576, -276980288, -282773120, -225548064, +-120158152, 6200322, 123784712, 207463024, 239510464, 213983328, 141544944, 46180564, -46616500, -119248160, +-162227360, -170816224, -145180096, -92382600, -25236154, 41639708, 95004136, 124838056, 126479808, 102404368, +61247308, 13972065, -29905320, -63705640, -83256864, -86804512, -75461504, -52934400, -24138790, 6084358, +33353642, 53966264, 65539592, 67355288, 59813324, 43739412, 20334522, -8456254, -39436388, -67427232, +-85135912, -85208928, -64182380, -25450366, 21178484, 62900332, 88331368, 91328184, 72951096, 40411348, +3381750, -29947196, -54736672, -69009384, -72172096, -63930052, -44290240, -14661408, 20721070, 54373748, +77168216, 81717656, 65875136, 34143380, -4037806, -38145216, -60307248, -67199592, -59830504, -42037528, +-18751828, 5282273, 26208964, 41352480, 49213884, 49219252, 41464688, 26736172, 6737730, -15744276, +-36872296, -52103860, -57128972, -49394272, -29525216, -1772748, 26890254, 48787608, 58082452, 52814140, +35395364, 11363410, -12761422, -31455804, -41445896, -42038068, -34630320, -21813602, -6573985, 8270497, +20461224, 28472948, 31444530, 29120952, 21932788, 11050951, -1744294, -14279693, -24270324, -29755534, +-29578366, -23648090, -12975096, 421444, 13831405, 24459838, 30067992, 29402810, 22509386, 10887742, +-2807835, -15531675, -24613920, -28263032, -25919590, -18389440, -7525857, 4358318, 14934138, 22187802, +24834574, 22589918, 16065862, 6547141, -4144644, -13931800, -20942260, -23813984, -21829172, -15197205, +-5259725, 5860483, 15851114, 22525492, 24193550, 20387672, 12138651, 1318555, -9976135, -19389092, +-24594056, -24252070, -18323942, -7525857, 6455873, 20078436, 28725278, 29109140, 20496120, 4436701, +-14688788, -29411936, -32658932, -22777286, -4110821, 16222091, 29726006, 27842126, 9167608, -13823889, +-22857280, -12723304, 3033321, 8892193, 4354023, -463856, -427886, 914291, 268435, -825707, +-612570, -216896, -677531, -992137, -438087, 107911, 82678, 163209, 664646, 923418, +667867, 439697, 420907, 186294, -307627, -612570, -645319, -705985, -776315, -590021, +-216359, 78920, 310311, 594316, 802085, 790274, 652835, 476741, 187368, }, { 22941568, -60834992, 94597728, 135659232, 151335328, 93556200, -15516643, -96951904, -125620280, -154287040, -207301968, --228418704, -174931328, -95768104, -61450780, -67413272, -64889440, -49018460, -53573276, -80212808, -94167696, --85941760, -86875912, -117151136, -155600224, -170909104, -157015952, -129109400, -103067400, -85586888, -71761384, --48570176, -10253161, 29126858, 47252692, 37082212, 10780368, -17792438, -44844292, -71080096, -94165008, --110759688, -121372552, -130140728, -141675936, -159057136, -183318336, -214228672, -251893392, -296846112, -347995968, --401685216, -453714432, -501417024, -543284928, -578109568, -605895872, -628941056, -650780416, -674133760, -700343296, --730119744, -763450816, -798361408, -830556992, -855029760, -867926976, -866865088, -850513600, -819124864, -775252864, --722731328, -664644608, -602938240, -539823168, -478321376, -420980896, -368797024, -321822976, -280324448, -245082112, --217063360, -197146512, -185978528, -183895472, -190771168, -205554448, -226081712, -250233920, -277758208, -310404256, --350039296, -397613568, -454370496, -522581024, -603616832, -695994112, -796599936, -903032960, -1012979328, -1121766528, --1222814720, -1311025920, -1384092928, -1440244224, -1477094528, -1494116608, -1494412928, -1482181376, -1459547520, -1427511296, --1388589824, -1346003072, -1300631040, -1251070336, -1196795264, -1139278720, -1079781632, -1018152064, -954703040, -891668480, --831614144, -775381696, -722612672, -673521728, -628960384, -589041856, -552887360, -520006720, -491207360, -467731072, --449969760, -437531008, -430267680, -428568480, -432568160, -441643424, -454992192, -472407200, -494080704, -519696960, --547997056, -577340800, -606388160, -633769664, -657122496, -673232384, -679566400, -675043776, -658866240, -629654528, --586888512, -532360128, -468847232, -398032864, -321164224, -240938000, -160777808, -82597592, -7059853, 64257004, -128806608, 185087328, 233052448, 272529632, 302702848, 323317088, 335299520, 340011616, 338508384, 331614976, -320457696, 306831936, 292658528, 278890496, 265742512, 254260448, 246242816, 242156704, 241125376, 243671744, -251926144, 266340592, 285317376, 308789888, 338100896, 371314432, 403117056, 429964896, 449832320, 456690848, -442260288, 403697920, 342134400, 255046432, 140796000, 9450002, -123436824, -249365808, -352794528, -388898560, --312111520, -143997904, 17201344, 83570936, 59500328, 15437723, -1094143, 1642288, 1639067, -1799591, --961536, 1548873, 506806, -1336272, -270046, 1126892, 141734, -891743, 17717, 785442, --37044, -605054, 112743, 501974, -137976, -407485, 129386, 281320, -176094, -251256, -115964, 123480, -159451, -115427, 89657, 18254, -98247, 2684, 48318, }, +60834992, 94597728, 135659232, 151335328, 93556200, -15516643, -96951904, -125620280, -154287040, -207301968, +-228418704, -174931328, -95768104, -61450780, -67413272, -64889440, -49018460, -53573276, -80212808, -94167696, +-85941760, -86875912, -117151136, -155600224, -170909104, -157015952, -129109400, -103067400, -85586888, -71761384, +-48570176, -10253161, 29126858, 47252692, 37082212, 10780368, -17792438, -44844292, -71080096, -94165008, +-110759688, -121372552, -130140728, -141675936, -159057136, -183318336, -214228672, -251893392, -296846112, -347995968, +-401685216, -453714432, -501417024, -543284928, -578109568, -605895872, -628941056, -650780416, -674133760, -700343296, +-730119744, -763450816, -798361408, -830556992, -855029760, -867926976, -866865088, -850513600, -819124864, -775252864, +-722731328, -664644608, -602938240, -539823168, -478321376, -420980896, -368797024, -321822976, -280324448, -245082112, +-217063360, -197146512, -185978528, -183895472, -190771168, -205554448, -226081712, -250233920, -277758208, -310404256, +-350039296, -397613568, -454370496, -522581024, -603616832, -695994112, -796599936, -903032960, -1012979328, -1121766528, +-1222814720, -1311025920, -1384092928, -1440244224, -1477094528, -1494116608, -1494412928, -1482181376, -1459547520, -1427511296, +-1388589824, -1346003072, -1300631040, -1251070336, -1196795264, -1139278720, -1079781632, -1018152064, -954703040, -891668480, +-831614144, -775381696, -722612672, -673521728, -628960384, -589041856, -552887360, -520006720, -491207360, -467731072, +-449969760, -437531008, -430267680, -428568480, -432568160, -441643424, -454992192, -472407200, -494080704, -519696960, +-547997056, -577340800, -606388160, -633769664, -657122496, -673232384, -679566400, -675043776, -658866240, -629654528, +-586888512, -532360128, -468847232, -398032864, -321164224, -240938000, -160777808, -82597592, -7059853, 64257004, +128806608, 185087328, 233052448, 272529632, 302702848, 323317088, 335299520, 340011616, 338508384, 331614976, +320457696, 306831936, 292658528, 278890496, 265742512, 254260448, 246242816, 242156704, 241125376, 243671744, +251926144, 266340592, 285317376, 308789888, 338100896, 371314432, 403117056, 429964896, 449832320, 456690848, +442260288, 403697920, 342134400, 255046432, 140796000, 9450002, -123436824, -249365808, -352794528, -388898560, +-312111520, -143997904, 17201344, 83570936, 59500328, 15437723, -1094143, 1642288, 1639067, -1799591, +-961536, 1548873, 506806, -1336272, -270046, 1126892, 141734, -891743, 17717, 785442, +-37044, -605054, 112743, 501974, -137976, -407485, 129386, 281320, -176094, -251256, +115964, 123480, -159451, -115427, 89657, 18254, -98247, 2684, 48318, }, }, { { -4357781, --15616501, -30627412, -43881144, -49493592, -45687716, -24834574, 32756104, 132964136, 236001472, 278151200, -234555136, 138744624, 37156300, -46155868, -96170224, -98129264, -59395104, -9983115, 32935956, 73852496, -105064560, 99138584, 48845052, -16016470, -64116884, -87776784, -86431384, -57499948, -14449881, 14837501, -18675592, 7561290, -14667313, -59650116, -128861368, -203432736, -266602048, -317439424, -358831104, -389818208, --413140416, -435458688, -457594400, -475116256, -487643616, -498576448, -508736736, -518301088, -530641056, -547201408, --563499200, -576024896, -587904256, -603265216, -621687936, -641835072, -664708992, -689980032, -714076416, -734508096, --752373568, -769566336, -786965248, -805674688, -827064704, -851393536, -877783424, -904528704, -928722816, -947569088, --960526464, -968117312, -969178688, -962167168, -948336320, -930310848, -908301312, -880925696, -848764992, -814003136, --777668800, -740189824, -703618176, -670610304, -641908096, -616688064, -594530304, -575577152, -559538688, -545531712, --532376768, -518926016, -504799840, -490573856, -476650112, -462685024, -448691488, -435484448, -423228768, -410814144, --397389152, -383203968, -368334240, -351987072, -333742592, -314279392, -294420000, -274476864, -254796256, -236030464, --218706720, -203103632, -189430064, -177678496, -167604112, -159153776, -152452544, -147246512, -142963360, -139410880, --136809200, -135170144, -134270336, -134177464, -135288784, -138003200, -142755056, -150127360, -160649488, -174779392, --193083472, -215875792, -242649552, -272467904, -304807392, -339312608, -374917344, -410167776, -444380928, -477570848, --509230112, -538187328, -563902336, -586957760, -607890368, -626362432, -642089536, -655882304, -668904640, -681289216, --692395968, -702260416, -711722816, -720979008, -729036864, -735027840, -739143488, -741636672, -741602880, -737625728, --729266688, -716956736, -700395904, -678032512, -648656576, -612586880, -570266432, -520494208, -461707360, -394449248, --320360000, -239108880, -149194816, -51655036, 50466940, 156328752, 266896784, 380279104, 492131840, 600777856, -706555968, 806222784, 894021056, 967654528, 1026274944, 1063700736, 1071413440, 1046386624, 987673344, 889303040, -747161088, 568291840, 362638592, 134009960, -106979048, -332635552, -517338464, -648572800, -695149056, -595534272, --334001888, -20295868, 172842368, 174538880, 74892952, 2940442, -6116034, 3243774, 536871, -3659849, -205085, 2843268, -568546, -2236067, 668404, 1739999, -687195, -1341104, 701153, 1087164, --616328, -816044, 590021, 648540, -517544, -494458, 443455, 347892, -408559, -276489, -308701, 145492, -290984, -108985, 195958, 7516, -166430, 34360, 97174, }, +-15616501, -30627412, -43881144, -49493592, -45687716, -24834574, 32756104, 132964136, 236001472, 278151200, +234555136, 138744624, 37156300, -46155868, -96170224, -98129264, -59395104, -9983115, 32935956, 73852496, +105064560, 99138584, 48845052, -16016470, -64116884, -87776784, -86431384, -57499948, -14449881, 14837501, +18675592, 7561290, -14667313, -59650116, -128861368, -203432736, -266602048, -317439424, -358831104, -389818208, +-413140416, -435458688, -457594400, -475116256, -487643616, -498576448, -508736736, -518301088, -530641056, -547201408, +-563499200, -576024896, -587904256, -603265216, -621687936, -641835072, -664708992, -689980032, -714076416, -734508096, +-752373568, -769566336, -786965248, -805674688, -827064704, -851393536, -877783424, -904528704, -928722816, -947569088, +-960526464, -968117312, -969178688, -962167168, -948336320, -930310848, -908301312, -880925696, -848764992, -814003136, +-777668800, -740189824, -703618176, -670610304, -641908096, -616688064, -594530304, -575577152, -559538688, -545531712, +-532376768, -518926016, -504799840, -490573856, -476650112, -462685024, -448691488, -435484448, -423228768, -410814144, +-397389152, -383203968, -368334240, -351987072, -333742592, -314279392, -294420000, -274476864, -254796256, -236030464, +-218706720, -203103632, -189430064, -177678496, -167604112, -159153776, -152452544, -147246512, -142963360, -139410880, +-136809200, -135170144, -134270336, -134177464, -135288784, -138003200, -142755056, -150127360, -160649488, -174779392, +-193083472, -215875792, -242649552, -272467904, -304807392, -339312608, -374917344, -410167776, -444380928, -477570848, +-509230112, -538187328, -563902336, -586957760, -607890368, -626362432, -642089536, -655882304, -668904640, -681289216, +-692395968, -702260416, -711722816, -720979008, -729036864, -735027840, -739143488, -741636672, -741602880, -737625728, +-729266688, -716956736, -700395904, -678032512, -648656576, -612586880, -570266432, -520494208, -461707360, -394449248, +-320360000, -239108880, -149194816, -51655036, 50466940, 156328752, 266896784, 380279104, 492131840, 600777856, +706555968, 806222784, 894021056, 967654528, 1026274944, 1063700736, 1071413440, 1046386624, 987673344, 889303040, +747161088, 568291840, 362638592, 134009960, -106979048, -332635552, -517338464, -648572800, -695149056, -595534272, +-334001888, -20295868, 172842368, 174538880, 74892952, 2940442, -6116034, 3243774, 536871, -3659849, +205085, 2843268, -568546, -2236067, 668404, 1739999, -687195, -1341104, 701153, 1087164, +-616328, -816044, 590021, 648540, -517544, -494458, 443455, 347892, -408559, -276489, +308701, 145492, -290984, -108985, 195958, 7516, -166430, 34360, 97174, }, { -69783016, --199971536, -310595392, -391509344, -410424384, -341338752, -220779568, -138907840, -162189776, -282055328, -432248736, --532211936, -528276160, -431201824, -313920768, -246209008, -234605616, -242493312, -246754464, -242492240, -212146688, --135220064, -27264452, 66219804, 119115552, 144776368, 168390640, 202259136, 248485872, 304710208, 361405376, -404982144, 426869824, 425519040, 403979264, 371348768, 340884576, 319475232, 301885184, 278762176, 246195584, -205628000, 160109408, 113309824, 67929736, 23271744, -22824530, -69941928, -115888416, -160149664, -203430048, --245286112, -284792832, -321529856, -353703968, -377589888, -390746464, -393658464, -387155328, -370846272, -345016864, --311447936, -271611584, -226304512, -177214112, -126466384, -74490840, -20390358, 35524212, 91066728, 143629616, -190960144, 231159440, 263330880, 287973248, 305897248, 317057696, 320815808, 316798944, 305198752, 286624640, -261830336, 231468672, 196347648, 157979632, 118393456, 79318920, 41998336, 7539278, -23330262, -50640884, --74534864, -94525784, -110122960, -121693064, -129915248, -134911904, -136685184, -135825120, -133061312, -128692256, --123075512, -117087784, -111551040, -106692360, -102533216, -99270656, -96970160, -95349344, -94065152, -92896920, --91614872, -89897424, -87315072, -83257944, -77060840, -68273872, -56595856, -41711112, -23567022, -2640331, -20503100, 45624900, 72381472, 99876784, 127154120, 153659968, 178721648, 201124192, 219794944, 234370992, -244561888, 249531152, 248457952, 241128592, 227431408, 206856368, 179084032, 144575040, 104046120, 57863412, -6546604, -48497160, -105292200, -161998656, -216730496, -266991280, -310002144, -343559808, -366076160, -376005600, --372055296, -354064224, -323047584, -280337888, -227390064, -166443408, -100478072, -32240172, 36025112, 101848704, -162506000, 215946656, 260997104, 296530432, 321288256, 334612320, 336531104, 327058016, 306174272, 274521440, -233450256, 184480112, 129268848, 69917232, 8820789, -51598664, -108862928, -160553936, -204564992, -238923120, --261717056, -271722720, -268565920, -251806960, -220931504, -176865680, -122199872, -59592672, 7924752, 74658344, -133093520, 177590448, 204240720, 207763680, 184013040, 135966320, 71502080, -3244848, -78216184, -128000760, --123941480, -68201400, -3135863, 27491548, 20126754, 3505767, -1666447, 785979, 1134408, -297963, -426812, 1980517, 1751273, 1092532, 1852742, 2781528, 2525441, 2199560, 2792803, 3315178, -3042448, 2836826, 3216394, 3432753, 3126736, 2936684, 3098819, 3076270, 2731599, 2509335, -2474438, 2274722, 1906429, 1642288, 1448478, 1138703, 780610, 486942, 178241, }, +-199971536, -310595392, -391509344, -410424384, -341338752, -220779568, -138907840, -162189776, -282055328, -432248736, +-532211936, -528276160, -431201824, -313920768, -246209008, -234605616, -242493312, -246754464, -242492240, -212146688, +-135220064, -27264452, 66219804, 119115552, 144776368, 168390640, 202259136, 248485872, 304710208, 361405376, +404982144, 426869824, 425519040, 403979264, 371348768, 340884576, 319475232, 301885184, 278762176, 246195584, +205628000, 160109408, 113309824, 67929736, 23271744, -22824530, -69941928, -115888416, -160149664, -203430048, +-245286112, -284792832, -321529856, -353703968, -377589888, -390746464, -393658464, -387155328, -370846272, -345016864, +-311447936, -271611584, -226304512, -177214112, -126466384, -74490840, -20390358, 35524212, 91066728, 143629616, +190960144, 231159440, 263330880, 287973248, 305897248, 317057696, 320815808, 316798944, 305198752, 286624640, +261830336, 231468672, 196347648, 157979632, 118393456, 79318920, 41998336, 7539278, -23330262, -50640884, +-74534864, -94525784, -110122960, -121693064, -129915248, -134911904, -136685184, -135825120, -133061312, -128692256, +-123075512, -117087784, -111551040, -106692360, -102533216, -99270656, -96970160, -95349344, -94065152, -92896920, +-91614872, -89897424, -87315072, -83257944, -77060840, -68273872, -56595856, -41711112, -23567022, -2640331, +20503100, 45624900, 72381472, 99876784, 127154120, 153659968, 178721648, 201124192, 219794944, 234370992, +244561888, 249531152, 248457952, 241128592, 227431408, 206856368, 179084032, 144575040, 104046120, 57863412, +6546604, -48497160, -105292200, -161998656, -216730496, -266991280, -310002144, -343559808, -366076160, -376005600, +-372055296, -354064224, -323047584, -280337888, -227390064, -166443408, -100478072, -32240172, 36025112, 101848704, +162506000, 215946656, 260997104, 296530432, 321288256, 334612320, 336531104, 327058016, 306174272, 274521440, +233450256, 184480112, 129268848, 69917232, 8820789, -51598664, -108862928, -160553936, -204564992, -238923120, +-261717056, -271722720, -268565920, -251806960, -220931504, -176865680, -122199872, -59592672, 7924752, 74658344, +133093520, 177590448, 204240720, 207763680, 184013040, 135966320, 71502080, -3244848, -78216184, -128000760, +-123941480, -68201400, -3135863, 27491548, 20126754, 3505767, -1666447, 785979, 1134408, -297963, +426812, 1980517, 1751273, 1092532, 1852742, 2781528, 2525441, 2199560, 2792803, 3315178, +3042448, 2836826, 3216394, 3432753, 3126736, 2936684, 3098819, 3076270, 2731599, 2509335, +2474438, 2274722, 1906429, 1642288, 1448478, 1138703, 780610, 486942, 178241, }, }, { { -69783016, --199971536, -310595392, -391509344, -410424384, -341338752, -220779568, -138907840, -162189776, -282055328, -432248736, --532211936, -528276160, -431201824, -313920768, -246209008, -234605616, -242493312, -246754464, -242492240, -212146688, --135220064, -27264452, 66219804, 119115552, 144776368, 168390640, 202259136, 248485872, 304710208, 361405376, -404982144, 426869824, 425519040, 403979264, 371348768, 340884576, 319475232, 301885184, 278762176, 246195584, -205628000, 160109408, 113309824, 67929736, 23271744, -22824530, -69941928, -115888416, -160149664, -203430048, --245286112, -284792832, -321529856, -353703968, -377589888, -390746464, -393658464, -387155328, -370846272, -345016864, --311447936, -271611584, -226304512, -177214112, -126466384, -74490840, -20390358, 35524212, 91066728, 143629616, -190960144, 231159440, 263330880, 287973248, 305897248, 317057696, 320815808, 316798944, 305198752, 286624640, -261830336, 231468672, 196347648, 157979632, 118393456, 79318920, 41998336, 7539278, -23330262, -50640884, --74534864, -94525784, -110122960, -121693064, -129915248, -134911904, -136685184, -135825120, -133061312, -128692256, --123075512, -117087784, -111551040, -106692360, -102533216, -99270656, -96970160, -95349344, -94065152, -92896920, --91614872, -89897424, -87315072, -83257944, -77060840, -68273872, -56595856, -41711112, -23567022, -2640331, -20503100, 45624900, 72381472, 99876784, 127154120, 153659968, 178721648, 201124192, 219794944, 234370992, -244561888, 249531152, 248457952, 241128592, 227431408, 206856368, 179084032, 144575040, 104046120, 57863412, -6546604, -48497160, -105292200, -161998656, -216730496, -266991280, -310002144, -343559808, -366076160, -376005600, --372055296, -354064224, -323047584, -280337888, -227390064, -166443408, -100478072, -32240172, 36025112, 101848704, -162506000, 215946656, 260997104, 296530432, 321288256, 334612320, 336531104, 327058016, 306174272, 274521440, -233450256, 184480112, 129268848, 69917232, 8820789, -51598664, -108862928, -160553936, -204564992, -238923120, --261717056, -271722720, -268565920, -251806960, -220931504, -176865680, -122199872, -59592672, 7924752, 74658344, -133093520, 177590448, 204240720, 207763680, 184013040, 135966320, 71502080, -3244848, -78216184, -128000760, --123941480, -68201400, -3135863, 27491548, 20126754, 3505767, -1666447, 785979, 1134408, -297963, -426812, 1980517, 1751273, 1092532, 1852742, 2781528, 2525441, 2199560, 2792803, 3315178, -3042448, 2836826, 3216394, 3432753, 3126736, 2936684, 3098819, 3076270, 2731599, 2509335, -2474438, 2274722, 1906429, 1642288, 1448478, 1138703, 780610, 486942, 178241, }, +-199971536, -310595392, -391509344, -410424384, -341338752, -220779568, -138907840, -162189776, -282055328, -432248736, +-532211936, -528276160, -431201824, -313920768, -246209008, -234605616, -242493312, -246754464, -242492240, -212146688, +-135220064, -27264452, 66219804, 119115552, 144776368, 168390640, 202259136, 248485872, 304710208, 361405376, +404982144, 426869824, 425519040, 403979264, 371348768, 340884576, 319475232, 301885184, 278762176, 246195584, +205628000, 160109408, 113309824, 67929736, 23271744, -22824530, -69941928, -115888416, -160149664, -203430048, +-245286112, -284792832, -321529856, -353703968, -377589888, -390746464, -393658464, -387155328, -370846272, -345016864, +-311447936, -271611584, -226304512, -177214112, -126466384, -74490840, -20390358, 35524212, 91066728, 143629616, +190960144, 231159440, 263330880, 287973248, 305897248, 317057696, 320815808, 316798944, 305198752, 286624640, +261830336, 231468672, 196347648, 157979632, 118393456, 79318920, 41998336, 7539278, -23330262, -50640884, +-74534864, -94525784, -110122960, -121693064, -129915248, -134911904, -136685184, -135825120, -133061312, -128692256, +-123075512, -117087784, -111551040, -106692360, -102533216, -99270656, -96970160, -95349344, -94065152, -92896920, +-91614872, -89897424, -87315072, -83257944, -77060840, -68273872, -56595856, -41711112, -23567022, -2640331, +20503100, 45624900, 72381472, 99876784, 127154120, 153659968, 178721648, 201124192, 219794944, 234370992, +244561888, 249531152, 248457952, 241128592, 227431408, 206856368, 179084032, 144575040, 104046120, 57863412, +6546604, -48497160, -105292200, -161998656, -216730496, -266991280, -310002144, -343559808, -366076160, -376005600, +-372055296, -354064224, -323047584, -280337888, -227390064, -166443408, -100478072, -32240172, 36025112, 101848704, +162506000, 215946656, 260997104, 296530432, 321288256, 334612320, 336531104, 327058016, 306174272, 274521440, +233450256, 184480112, 129268848, 69917232, 8820789, -51598664, -108862928, -160553936, -204564992, -238923120, +-261717056, -271722720, -268565920, -251806960, -220931504, -176865680, -122199872, -59592672, 7924752, 74658344, +133093520, 177590448, 204240720, 207763680, 184013040, 135966320, 71502080, -3244848, -78216184, -128000760, +-123941480, -68201400, -3135863, 27491548, 20126754, 3505767, -1666447, 785979, 1134408, -297963, +426812, 1980517, 1751273, 1092532, 1852742, 2781528, 2525441, 2199560, 2792803, 3315178, +3042448, 2836826, 3216394, 3432753, 3126736, 2936684, 3098819, 3076270, 2731599, 2509335, +2474438, 2274722, 1906429, 1642288, 1448478, 1138703, 780610, 486942, 178241, }, { -4357781, --15616501, -30627412, -43881144, -49493592, -45687716, -24834574, 32756104, 132964136, 236001472, 278151200, -234555136, 138744624, 37156300, -46155868, -96170224, -98129264, -59395104, -9983115, 32935956, 73852496, -105064560, 99138584, 48845052, -16016470, -64116884, -87776784, -86431384, -57499948, -14449881, 14837501, -18675592, 7561290, -14667313, -59650116, -128861368, -203432736, -266602048, -317439424, -358831104, -389818208, --413140416, -435458688, -457594400, -475116256, -487643616, -498576448, -508736736, -518301088, -530641056, -547201408, --563499200, -576024896, -587904256, -603265216, -621687936, -641835072, -664708992, -689980032, -714076416, -734508096, --752373568, -769566336, -786965248, -805674688, -827064704, -851393536, -877783424, -904528704, -928722816, -947569088, --960526464, -968117312, -969178688, -962167168, -948336320, -930310848, -908301312, -880925696, -848764992, -814003136, --777668800, -740189824, -703618176, -670610304, -641908096, -616688064, -594530304, -575577152, -559538688, -545531712, --532376768, -518926016, -504799840, -490573856, -476650112, -462685024, -448691488, -435484448, -423228768, -410814144, --397389152, -383203968, -368334240, -351987072, -333742592, -314279392, -294420000, -274476864, -254796256, -236030464, --218706720, -203103632, -189430064, -177678496, -167604112, -159153776, -152452544, -147246512, -142963360, -139410880, --136809200, -135170144, -134270336, -134177464, -135288784, -138003200, -142755056, -150127360, -160649488, -174779392, --193083472, -215875792, -242649552, -272467904, -304807392, -339312608, -374917344, -410167776, -444380928, -477570848, --509230112, -538187328, -563902336, -586957760, -607890368, -626362432, -642089536, -655882304, -668904640, -681289216, --692395968, -702260416, -711722816, -720979008, -729036864, -735027840, -739143488, -741636672, -741602880, -737625728, --729266688, -716956736, -700395904, -678032512, -648656576, -612586880, -570266432, -520494208, -461707360, -394449248, --320360000, -239108880, -149194816, -51655036, 50466940, 156328752, 266896784, 380279104, 492131840, 600777856, -706555968, 806222784, 894021056, 967654528, 1026274944, 1063700736, 1071413440, 1046386624, 987673344, 889303040, -747161088, 568291840, 362638592, 134009960, -106979048, -332635552, -517338464, -648572800, -695149056, -595534272, --334001888, -20295868, 172842368, 174538880, 74892952, 2940442, -6116034, 3243774, 536871, -3659849, -205085, 2843268, -568546, -2236067, 668404, 1739999, -687195, -1341104, 701153, 1087164, --616328, -816044, 590021, 648540, -517544, -494458, 443455, 347892, -408559, -276489, -308701, 145492, -290984, -108985, 195958, 7516, -166430, 34360, 97174, }, +-15616501, -30627412, -43881144, -49493592, -45687716, -24834574, 32756104, 132964136, 236001472, 278151200, +234555136, 138744624, 37156300, -46155868, -96170224, -98129264, -59395104, -9983115, 32935956, 73852496, +105064560, 99138584, 48845052, -16016470, -64116884, -87776784, -86431384, -57499948, -14449881, 14837501, +18675592, 7561290, -14667313, -59650116, -128861368, -203432736, -266602048, -317439424, -358831104, -389818208, +-413140416, -435458688, -457594400, -475116256, -487643616, -498576448, -508736736, -518301088, -530641056, -547201408, +-563499200, -576024896, -587904256, -603265216, -621687936, -641835072, -664708992, -689980032, -714076416, -734508096, +-752373568, -769566336, -786965248, -805674688, -827064704, -851393536, -877783424, -904528704, -928722816, -947569088, +-960526464, -968117312, -969178688, -962167168, -948336320, -930310848, -908301312, -880925696, -848764992, -814003136, +-777668800, -740189824, -703618176, -670610304, -641908096, -616688064, -594530304, -575577152, -559538688, -545531712, +-532376768, -518926016, -504799840, -490573856, -476650112, -462685024, -448691488, -435484448, -423228768, -410814144, +-397389152, -383203968, -368334240, -351987072, -333742592, -314279392, -294420000, -274476864, -254796256, -236030464, +-218706720, -203103632, -189430064, -177678496, -167604112, -159153776, -152452544, -147246512, -142963360, -139410880, +-136809200, -135170144, -134270336, -134177464, -135288784, -138003200, -142755056, -150127360, -160649488, -174779392, +-193083472, -215875792, -242649552, -272467904, -304807392, -339312608, -374917344, -410167776, -444380928, -477570848, +-509230112, -538187328, -563902336, -586957760, -607890368, -626362432, -642089536, -655882304, -668904640, -681289216, +-692395968, -702260416, -711722816, -720979008, -729036864, -735027840, -739143488, -741636672, -741602880, -737625728, +-729266688, -716956736, -700395904, -678032512, -648656576, -612586880, -570266432, -520494208, -461707360, -394449248, +-320360000, -239108880, -149194816, -51655036, 50466940, 156328752, 266896784, 380279104, 492131840, 600777856, +706555968, 806222784, 894021056, 967654528, 1026274944, 1063700736, 1071413440, 1046386624, 987673344, 889303040, +747161088, 568291840, 362638592, 134009960, -106979048, -332635552, -517338464, -648572800, -695149056, -595534272, +-334001888, -20295868, 172842368, 174538880, 74892952, 2940442, -6116034, 3243774, 536871, -3659849, +205085, 2843268, -568546, -2236067, 668404, 1739999, -687195, -1341104, 701153, 1087164, +-616328, -816044, 590021, 648540, -517544, -494458, 443455, 347892, -408559, -276489, +308701, 145492, -290984, -108985, 195958, 7516, -166430, 34360, 97174, }, }, { { 4396973, -18730352, 43955768, 62520228, 36020816, -44321380, -122355032, -133907416, -89308480, -52676164, -46959560, --35172024, 995896, 22633940, -6811818, -70629128, -132929776, -187501632, -245622736, -301632864, -338469184, --353582656, -358535264, -360587200, -358735008, -352565280, -344896608, -337896896, -331250976, -322315808, -307475104, --286514048, -264907680, -248241600, -235557488, -221265440, -201784544, -177688704, -151782528, -127838088, -109232832, --96672736, -88565984, -84239344, -84811648, -90858424, -101595304, -116348520, -134488848, -153815120, -170888688, --183136864, -189838624, -191920608, -191799280, -192611024, -196889888, -206453712, -223010816, -247206512, -277297600, --310380096, -344601344, -378737728, -410577920, -437911104, -460739936, -480709920, -498734816, -514743232, -529178624, --542961152, -555994816, -566950208, -574567296, -578352256, -578027456, -573051200, -563112640, -549016512, -532708544, --516039776, -499600800, -483089344, -466339488, -449094144, -430101792, -407705152, -381528928, -352745664, -322786112, --292707392, -263698112, -237151984, -214081568, -195071504, -180745648, -171941504, -169715088, -175369952, -189889632, --213101248, -243979376, -281717120, -325589120, -373912864, -424414720, -475792192, -527720480, -579196736, -628193216, --673297344, -714438848, -751509760, -783385920, -809055872, -828938368, -844243456, -855476928, -862441216, -865578688, --866344832, -865804736, -863600320, -858992384, -852285824, -844150592, -833970432, -820226560, -802486720, -781642688, --758091264, -731185984, -700930624, -668854208, -636547456, -604441472, -572702720, -542376512, -514803904, -490429952, --468853664, -449801184, -433525408, -420207264, -409284608, -399728864, -390993952, -383223296, -376250400, -369016064, --360573248, -351062560, -340871168, -329410048, -315708544, -299783360, -282321088, -263283104, -241879136, -217813904, --191608160, -163595840, -133328136, -100234336, -64467996, -26707180, 12809203, 54536420, 98570576, 143910928, -189559456, 235761488, 282941184, 330004896, 375307680, 418653536, 460329760, 498804064, 531752384, 558711872, -580073472, 594267264, 598866112, 593451712, 578232000, 551137152, 509791680, 454804288, 387670720, 307864320, -216058864, 117309512, 16954384, -82486992, -175775296, -252181152, -303696608, -327520800, -313098816, -241155968, --115031576, 14910516, 83878024, 74836048, 30868466, 2026151, -1671279, 1275068, -20401, -1331977, -242129, 1015760, -345745, -801548, 348429, 621697, -330712, -469225, 333934, 392453, --280247, -284542, 272194, 230318, -237834, -175020, 202937, 114354, -195421, -97711, -143345, 34360, -147640, -31139, 97711, -19864, -92342, 31675, 59593, }, +18730352, 43955768, 62520228, 36020816, -44321380, -122355032, -133907416, -89308480, -52676164, -46959560, +-35172024, 995896, 22633940, -6811818, -70629128, -132929776, -187501632, -245622736, -301632864, -338469184, +-353582656, -358535264, -360587200, -358735008, -352565280, -344896608, -337896896, -331250976, -322315808, -307475104, +-286514048, -264907680, -248241600, -235557488, -221265440, -201784544, -177688704, -151782528, -127838088, -109232832, +-96672736, -88565984, -84239344, -84811648, -90858424, -101595304, -116348520, -134488848, -153815120, -170888688, +-183136864, -189838624, -191920608, -191799280, -192611024, -196889888, -206453712, -223010816, -247206512, -277297600, +-310380096, -344601344, -378737728, -410577920, -437911104, -460739936, -480709920, -498734816, -514743232, -529178624, +-542961152, -555994816, -566950208, -574567296, -578352256, -578027456, -573051200, -563112640, -549016512, -532708544, +-516039776, -499600800, -483089344, -466339488, -449094144, -430101792, -407705152, -381528928, -352745664, -322786112, +-292707392, -263698112, -237151984, -214081568, -195071504, -180745648, -171941504, -169715088, -175369952, -189889632, +-213101248, -243979376, -281717120, -325589120, -373912864, -424414720, -475792192, -527720480, -579196736, -628193216, +-673297344, -714438848, -751509760, -783385920, -809055872, -828938368, -844243456, -855476928, -862441216, -865578688, +-866344832, -865804736, -863600320, -858992384, -852285824, -844150592, -833970432, -820226560, -802486720, -781642688, +-758091264, -731185984, -700930624, -668854208, -636547456, -604441472, -572702720, -542376512, -514803904, -490429952, +-468853664, -449801184, -433525408, -420207264, -409284608, -399728864, -390993952, -383223296, -376250400, -369016064, +-360573248, -351062560, -340871168, -329410048, -315708544, -299783360, -282321088, -263283104, -241879136, -217813904, +-191608160, -163595840, -133328136, -100234336, -64467996, -26707180, 12809203, 54536420, 98570576, 143910928, +189559456, 235761488, 282941184, 330004896, 375307680, 418653536, 460329760, 498804064, 531752384, 558711872, +580073472, 594267264, 598866112, 593451712, 578232000, 551137152, 509791680, 454804288, 387670720, 307864320, +216058864, 117309512, 16954384, -82486992, -175775296, -252181152, -303696608, -327520800, -313098816, -241155968, +-115031576, 14910516, 83878024, 74836048, 30868466, 2026151, -1671279, 1275068, -20401, -1331977, +242129, 1015760, -345745, -801548, 348429, 621697, -330712, -469225, 333934, 392453, +-280247, -284542, 272194, 230318, -237834, -175020, 202937, 114354, -195421, -97711, +143345, 34360, -147640, -31139, 97711, -19864, -92342, 31675, 59593, }, { -99617472, --286525856, -426918144, -479716704, -432016800, -323711680, -220421472, -155266832, -104122352, -23704998, 92558696, -205582368, 273793952, 292715456, 287555584, 276731712, 253248448, 200025760, 114359944, 13984414, -76767712, --143746656, -188256464, -218978368, -239801440, -245534688, -228605008, -187522032, -127440272, -55115168, 22870164, -97539248, 157715488, 195234720, 208737552, 201576240, 177796608, 141271136, 96886408, 50203872, 5709622, --33995204, -67701032, -95033128, -116073640, -130764040, -138548672, -138680192, -130588480, -113732880, -87506200, --51908436, -8606041, 38646116, 84669376, 124226024, 153222960, 169042928, 170094128, 155477824, 125430224, -82081656, 29616484, -26425860, -80192944, -126371896, -160656480, -179832960, -181643296, -164823136, -129660232, --78935056, -18505940, 43240656, 97167192, 135631312, 154242480, 152633472, 134172096, 104647416, 70279624, -35944044, 4480188, -22913114, -45918568, -64495912, -78462608, -87238304, -89910848, -85651312, -74275016, --56666724, -34820372, -11373610, 11130408, 30785788, 46446312, 57597124, 64184528, 66410932, 64531884, -58780384, 49432928, 36874440, 21636434, 4475893, -13545253, -31093416, -46683072, -58814744, -66160212, --67793376, -63361504, -53129820, -37984692, -19406810, 711354, 20378010, 37780144, 51434916, 60302952, -63837172, 61920008, 54761368, 42888468, 27187142, 8901320, -10379862, -28739774, -44103408, -54607824, --58997280, -56868052, -48755396, -36053568, -20711406, -4804458, 9823127, 21776558, 30251602, 35050692, -36432060, 34912716, 31146030, 25813828, 19491098, 12600897, 5487358, -1540820, -8236674, -14373645, --19656992, -23740968, -26317412, -27138288, -26007100, -22863722, -17864380, -11331734, -3701725, 4446902, -12408697, 19478750, 25026774, 28495498, 29480118, 27852862, 23748484, 17478906, 9565429, 723702, --8311299, -16871168, -24227910, -29619706, -32505924, -32583232, -29544544, -23179938, -13749264, -1946694, -11372000, 24927454, 36624260, 44075492, 45504640, 39842800, 26695906, 7341173, -14562623, -34248068, --47577500, -51240032, -43075836, -24232206, -117575, 22448184, 37966436, 41439456, 29064044, 4553739, --17837536, -23693724, -13037373, 359167, 5138392, 2745558, 555661, 988916, 1490354, 879931, -510027, 812286, 741419, 117575, -214748, -168577, -386010, -847182, -1012002, -918049, --975494, -1106491, -983011, -702227, -527207, -376347, -74088, 267362, 491237, 669478, -882616, 1039382, 1072668, 1042066, 981937, 848793, 638876, 394600, 134755, }, +-286525856, -426918144, -479716704, -432016800, -323711680, -220421472, -155266832, -104122352, -23704998, 92558696, +205582368, 273793952, 292715456, 287555584, 276731712, 253248448, 200025760, 114359944, 13984414, -76767712, +-143746656, -188256464, -218978368, -239801440, -245534688, -228605008, -187522032, -127440272, -55115168, 22870164, +97539248, 157715488, 195234720, 208737552, 201576240, 177796608, 141271136, 96886408, 50203872, 5709622, +-33995204, -67701032, -95033128, -116073640, -130764040, -138548672, -138680192, -130588480, -113732880, -87506200, +-51908436, -8606041, 38646116, 84669376, 124226024, 153222960, 169042928, 170094128, 155477824, 125430224, +82081656, 29616484, -26425860, -80192944, -126371896, -160656480, -179832960, -181643296, -164823136, -129660232, +-78935056, -18505940, 43240656, 97167192, 135631312, 154242480, 152633472, 134172096, 104647416, 70279624, +35944044, 4480188, -22913114, -45918568, -64495912, -78462608, -87238304, -89910848, -85651312, -74275016, +-56666724, -34820372, -11373610, 11130408, 30785788, 46446312, 57597124, 64184528, 66410932, 64531884, +58780384, 49432928, 36874440, 21636434, 4475893, -13545253, -31093416, -46683072, -58814744, -66160212, +-67793376, -63361504, -53129820, -37984692, -19406810, 711354, 20378010, 37780144, 51434916, 60302952, +63837172, 61920008, 54761368, 42888468, 27187142, 8901320, -10379862, -28739774, -44103408, -54607824, +-58997280, -56868052, -48755396, -36053568, -20711406, -4804458, 9823127, 21776558, 30251602, 35050692, +36432060, 34912716, 31146030, 25813828, 19491098, 12600897, 5487358, -1540820, -8236674, -14373645, +-19656992, -23740968, -26317412, -27138288, -26007100, -22863722, -17864380, -11331734, -3701725, 4446902, +12408697, 19478750, 25026774, 28495498, 29480118, 27852862, 23748484, 17478906, 9565429, 723702, +-8311299, -16871168, -24227910, -29619706, -32505924, -32583232, -29544544, -23179938, -13749264, -1946694, +11372000, 24927454, 36624260, 44075492, 45504640, 39842800, 26695906, 7341173, -14562623, -34248068, +-47577500, -51240032, -43075836, -24232206, -117575, 22448184, 37966436, 41439456, 29064044, 4553739, +-17837536, -23693724, -13037373, 359167, 5138392, 2745558, 555661, 988916, 1490354, 879931, +510027, 812286, 741419, 117575, -214748, -168577, -386010, -847182, -1012002, -918049, +-975494, -1106491, -983011, -702227, -527207, -376347, -74088, 267362, 491237, 669478, +882616, 1039382, 1072668, 1042066, 981937, 848793, 638876, 394600, 134755, }, }, { { -99617472, --286525856, -426918144, -479716704, -432016800, -323711680, -220421472, -155266832, -104122352, -23704998, 92558696, -205582368, 273793952, 292715456, 287555584, 276731712, 253248448, 200025760, 114359944, 13984414, -76767712, --143746656, -188256464, -218978368, -239801440, -245534688, -228605008, -187522032, -127440272, -55115168, 22870164, -97539248, 157715488, 195234720, 208737552, 201576240, 177796608, 141271136, 96886408, 50203872, 5709622, --33995204, -67701032, -95033128, -116073640, -130764040, -138548672, -138680192, -130588480, -113732880, -87506200, --51908436, -8606041, 38646116, 84669376, 124226024, 153222960, 169042928, 170094128, 155477824, 125430224, -82081656, 29616484, -26425860, -80192944, -126371896, -160656480, -179832960, -181643296, -164823136, -129660232, --78935056, -18505940, 43240656, 97167192, 135631312, 154242480, 152633472, 134172096, 104647416, 70279624, -35944044, 4480188, -22913114, -45918568, -64495912, -78462608, -87238304, -89910848, -85651312, -74275016, --56666724, -34820372, -11373610, 11130408, 30785788, 46446312, 57597124, 64184528, 66410932, 64531884, -58780384, 49432928, 36874440, 21636434, 4475893, -13545253, -31093416, -46683072, -58814744, -66160212, --67793376, -63361504, -53129820, -37984692, -19406810, 711354, 20378010, 37780144, 51434916, 60302952, -63837172, 61920008, 54761368, 42888468, 27187142, 8901320, -10379862, -28739774, -44103408, -54607824, --58997280, -56868052, -48755396, -36053568, -20711406, -4804458, 9823127, 21776558, 30251602, 35050692, -36432060, 34912716, 31146030, 25813828, 19491098, 12600897, 5487358, -1540820, -8236674, -14373645, --19656992, -23740968, -26317412, -27138288, -26007100, -22863722, -17864380, -11331734, -3701725, 4446902, -12408697, 19478750, 25026774, 28495498, 29480118, 27852862, 23748484, 17478906, 9565429, 723702, --8311299, -16871168, -24227910, -29619706, -32505924, -32583232, -29544544, -23179938, -13749264, -1946694, -11372000, 24927454, 36624260, 44075492, 45504640, 39842800, 26695906, 7341173, -14562623, -34248068, --47577500, -51240032, -43075836, -24232206, -117575, 22448184, 37966436, 41439456, 29064044, 4553739, --17837536, -23693724, -13037373, 359167, 5138392, 2745558, 555661, 988916, 1490354, 879931, -510027, 812286, 741419, 117575, -214748, -168577, -386010, -847182, -1012002, -918049, --975494, -1106491, -983011, -702227, -527207, -376347, -74088, 267362, 491237, 669478, -882616, 1039382, 1072668, 1042066, 981937, 848793, 638876, 394600, 134755, }, +-286525856, -426918144, -479716704, -432016800, -323711680, -220421472, -155266832, -104122352, -23704998, 92558696, +205582368, 273793952, 292715456, 287555584, 276731712, 253248448, 200025760, 114359944, 13984414, -76767712, +-143746656, -188256464, -218978368, -239801440, -245534688, -228605008, -187522032, -127440272, -55115168, 22870164, +97539248, 157715488, 195234720, 208737552, 201576240, 177796608, 141271136, 96886408, 50203872, 5709622, +-33995204, -67701032, -95033128, -116073640, -130764040, -138548672, -138680192, -130588480, -113732880, -87506200, +-51908436, -8606041, 38646116, 84669376, 124226024, 153222960, 169042928, 170094128, 155477824, 125430224, +82081656, 29616484, -26425860, -80192944, -126371896, -160656480, -179832960, -181643296, -164823136, -129660232, +-78935056, -18505940, 43240656, 97167192, 135631312, 154242480, 152633472, 134172096, 104647416, 70279624, +35944044, 4480188, -22913114, -45918568, -64495912, -78462608, -87238304, -89910848, -85651312, -74275016, +-56666724, -34820372, -11373610, 11130408, 30785788, 46446312, 57597124, 64184528, 66410932, 64531884, +58780384, 49432928, 36874440, 21636434, 4475893, -13545253, -31093416, -46683072, -58814744, -66160212, +-67793376, -63361504, -53129820, -37984692, -19406810, 711354, 20378010, 37780144, 51434916, 60302952, +63837172, 61920008, 54761368, 42888468, 27187142, 8901320, -10379862, -28739774, -44103408, -54607824, +-58997280, -56868052, -48755396, -36053568, -20711406, -4804458, 9823127, 21776558, 30251602, 35050692, +36432060, 34912716, 31146030, 25813828, 19491098, 12600897, 5487358, -1540820, -8236674, -14373645, +-19656992, -23740968, -26317412, -27138288, -26007100, -22863722, -17864380, -11331734, -3701725, 4446902, +12408697, 19478750, 25026774, 28495498, 29480118, 27852862, 23748484, 17478906, 9565429, 723702, +-8311299, -16871168, -24227910, -29619706, -32505924, -32583232, -29544544, -23179938, -13749264, -1946694, +11372000, 24927454, 36624260, 44075492, 45504640, 39842800, 26695906, 7341173, -14562623, -34248068, +-47577500, -51240032, -43075836, -24232206, -117575, 22448184, 37966436, 41439456, 29064044, 4553739, +-17837536, -23693724, -13037373, 359167, 5138392, 2745558, 555661, 988916, 1490354, 879931, +510027, 812286, 741419, 117575, -214748, -168577, -386010, -847182, -1012002, -918049, +-975494, -1106491, -983011, -702227, -527207, -376347, -74088, 267362, 491237, 669478, +882616, 1039382, 1072668, 1042066, 981937, 848793, 638876, 394600, 134755, }, { 4396973, -18730352, 43955768, 62520228, 36020816, -44321380, -122355032, -133907416, -89308480, -52676164, -46959560, --35172024, 995896, 22633940, -6811818, -70629128, -132929776, -187501632, -245622736, -301632864, -338469184, --353582656, -358535264, -360587200, -358735008, -352565280, -344896608, -337896896, -331250976, -322315808, -307475104, --286514048, -264907680, -248241600, -235557488, -221265440, -201784544, -177688704, -151782528, -127838088, -109232832, --96672736, -88565984, -84239344, -84811648, -90858424, -101595304, -116348520, -134488848, -153815120, -170888688, --183136864, -189838624, -191920608, -191799280, -192611024, -196889888, -206453712, -223010816, -247206512, -277297600, --310380096, -344601344, -378737728, -410577920, -437911104, -460739936, -480709920, -498734816, -514743232, -529178624, --542961152, -555994816, -566950208, -574567296, -578352256, -578027456, -573051200, -563112640, -549016512, -532708544, --516039776, -499600800, -483089344, -466339488, -449094144, -430101792, -407705152, -381528928, -352745664, -322786112, --292707392, -263698112, -237151984, -214081568, -195071504, -180745648, -171941504, -169715088, -175369952, -189889632, --213101248, -243979376, -281717120, -325589120, -373912864, -424414720, -475792192, -527720480, -579196736, -628193216, --673297344, -714438848, -751509760, -783385920, -809055872, -828938368, -844243456, -855476928, -862441216, -865578688, --866344832, -865804736, -863600320, -858992384, -852285824, -844150592, -833970432, -820226560, -802486720, -781642688, --758091264, -731185984, -700930624, -668854208, -636547456, -604441472, -572702720, -542376512, -514803904, -490429952, --468853664, -449801184, -433525408, -420207264, -409284608, -399728864, -390993952, -383223296, -376250400, -369016064, --360573248, -351062560, -340871168, -329410048, -315708544, -299783360, -282321088, -263283104, -241879136, -217813904, --191608160, -163595840, -133328136, -100234336, -64467996, -26707180, 12809203, 54536420, 98570576, 143910928, -189559456, 235761488, 282941184, 330004896, 375307680, 418653536, 460329760, 498804064, 531752384, 558711872, -580073472, 594267264, 598866112, 593451712, 578232000, 551137152, 509791680, 454804288, 387670720, 307864320, -216058864, 117309512, 16954384, -82486992, -175775296, -252181152, -303696608, -327520800, -313098816, -241155968, --115031576, 14910516, 83878024, 74836048, 30868466, 2026151, -1671279, 1275068, -20401, -1331977, -242129, 1015760, -345745, -801548, 348429, 621697, -330712, -469225, 333934, 392453, --280247, -284542, 272194, 230318, -237834, -175020, 202937, 114354, -195421, -97711, -143345, 34360, -147640, -31139, 97711, -19864, -92342, 31675, 59593, }, +18730352, 43955768, 62520228, 36020816, -44321380, -122355032, -133907416, -89308480, -52676164, -46959560, +-35172024, 995896, 22633940, -6811818, -70629128, -132929776, -187501632, -245622736, -301632864, -338469184, +-353582656, -358535264, -360587200, -358735008, -352565280, -344896608, -337896896, -331250976, -322315808, -307475104, +-286514048, -264907680, -248241600, -235557488, -221265440, -201784544, -177688704, -151782528, -127838088, -109232832, +-96672736, -88565984, -84239344, -84811648, -90858424, -101595304, -116348520, -134488848, -153815120, -170888688, +-183136864, -189838624, -191920608, -191799280, -192611024, -196889888, -206453712, -223010816, -247206512, -277297600, +-310380096, -344601344, -378737728, -410577920, -437911104, -460739936, -480709920, -498734816, -514743232, -529178624, +-542961152, -555994816, -566950208, -574567296, -578352256, -578027456, -573051200, -563112640, -549016512, -532708544, +-516039776, -499600800, -483089344, -466339488, -449094144, -430101792, -407705152, -381528928, -352745664, -322786112, +-292707392, -263698112, -237151984, -214081568, -195071504, -180745648, -171941504, -169715088, -175369952, -189889632, +-213101248, -243979376, -281717120, -325589120, -373912864, -424414720, -475792192, -527720480, -579196736, -628193216, +-673297344, -714438848, -751509760, -783385920, -809055872, -828938368, -844243456, -855476928, -862441216, -865578688, +-866344832, -865804736, -863600320, -858992384, -852285824, -844150592, -833970432, -820226560, -802486720, -781642688, +-758091264, -731185984, -700930624, -668854208, -636547456, -604441472, -572702720, -542376512, -514803904, -490429952, +-468853664, -449801184, -433525408, -420207264, -409284608, -399728864, -390993952, -383223296, -376250400, -369016064, +-360573248, -351062560, -340871168, -329410048, -315708544, -299783360, -282321088, -263283104, -241879136, -217813904, +-191608160, -163595840, -133328136, -100234336, -64467996, -26707180, 12809203, 54536420, 98570576, 143910928, +189559456, 235761488, 282941184, 330004896, 375307680, 418653536, 460329760, 498804064, 531752384, 558711872, +580073472, 594267264, 598866112, 593451712, 578232000, 551137152, 509791680, 454804288, 387670720, 307864320, +216058864, 117309512, 16954384, -82486992, -175775296, -252181152, -303696608, -327520800, -313098816, -241155968, +-115031576, 14910516, 83878024, 74836048, 30868466, 2026151, -1671279, 1275068, -20401, -1331977, +242129, 1015760, -345745, -801548, 348429, 621697, -330712, -469225, 333934, 392453, +-280247, -284542, 272194, 230318, -237834, -175020, 202937, 114354, -195421, -97711, +143345, 34360, -147640, -31139, 97711, -19864, -92342, 31675, 59593, }, }, { { 294205, -8901857, 28864864, 39342436, 13937706, -47083580, -111196168, -146788016, -153042576, -147262624, -134354624, --107734424, -75171056, -61331596, -80488224, -123064232, -173706192, -227136128, -279479968, -318843328, -336521952, --339959008, -344491808, -356248736, -370266432, -381413504, -389552448, -395492384, -398438208, -398182656, -395899872, --391819136, -384272320, -371361664, -351976320, -325347008, -291679296, -253915248, -217424128, -186781680, -163319360, --146260816, -135214160, -130368904, -130834368, -134310064, -138643696, -142857584, -146631792, -149753696, -152409600, --155440768, -160096512, -167755520, -179548416, -195720048, -215495696, -237803216, -261634912, -285511712, -307542752, --326749824, -343719264, -359359904, -373625120, -385901728, -395743104, -402390112, -404216000, -399577440, -388097536, --370758208, -349199104, -325402816, -301640928, -279964768, -261452384, -245954528, -232490880, -219916288, -207399680, --194486320, -180918512, -166608768, -151734208, -136620224, -121469192, -106369160, -91516088, -77255184, -63954212, --51991652, -41852844, -34239480, -30183956, -30968862, -37641632, -50665044, -70217880, -96439736, -128817344, --165670304, -205029920, -245914800, -288069376, -330800544, -373101120, -414799360, -456399872, -497562304, -536742048, --572604480, -604822656, -633069568, -656218368, -673303232, -684666112, -691340480, -693680704, -691445184, -685094016, --676069184, -665548672, -653697792, -640570752, -626994880, -613774464, -600480448, -585917824, -569544320, -551551616, --531744320, -509446464, -484738048, -458893088, -433236576, -408261344, -384195040, -361766176, -341875648, -324845568, --310456352, -298596320, -289516224, -283392128, -279850944, -278159264, -277859680, -278895296, -280965472, -283144096, --284521184, -284876064, -284215168, -281956544, -277226176, -269789984, -260008736, -247893696, -232882784, -214655488, --193558064, -169964208, -143662368, -114285320, -82115480, -47969952, -12283070, 25144886, 64223720, 104003704, -143587744, 182995664, 222292480, 260444672, 296157856, 329288160, 360096512, 387627776, 410374464, 428013344, -440756512, 447537728, 446730272, 438046400, 421747520, 396788928, 361954624, 317939776, 266154288, 206862800, -140971568, 71972912, 3565360, -62324808, -122405496, -170344848, -201553696, -214717232, -204053904, -158424704, --79753248, 1994476, 47517908, 45334452, 20262046, 2575907, -511101, 807454, 5906, -761283, -128312, 577673, -195958, -460635, 197569, 360240, -182536, -265214, 192737, 229244, --154619, -161061, 154082, 132070, -134218, -102542, 110059, 62814, -112206, -61203, -74088, 16643, -84826, -23085, 49392, -11811, -51540, 14496, 30602, }, +8901857, 28864864, 39342436, 13937706, -47083580, -111196168, -146788016, -153042576, -147262624, -134354624, +-107734424, -75171056, -61331596, -80488224, -123064232, -173706192, -227136128, -279479968, -318843328, -336521952, +-339959008, -344491808, -356248736, -370266432, -381413504, -389552448, -395492384, -398438208, -398182656, -395899872, +-391819136, -384272320, -371361664, -351976320, -325347008, -291679296, -253915248, -217424128, -186781680, -163319360, +-146260816, -135214160, -130368904, -130834368, -134310064, -138643696, -142857584, -146631792, -149753696, -152409600, +-155440768, -160096512, -167755520, -179548416, -195720048, -215495696, -237803216, -261634912, -285511712, -307542752, +-326749824, -343719264, -359359904, -373625120, -385901728, -395743104, -402390112, -404216000, -399577440, -388097536, +-370758208, -349199104, -325402816, -301640928, -279964768, -261452384, -245954528, -232490880, -219916288, -207399680, +-194486320, -180918512, -166608768, -151734208, -136620224, -121469192, -106369160, -91516088, -77255184, -63954212, +-51991652, -41852844, -34239480, -30183956, -30968862, -37641632, -50665044, -70217880, -96439736, -128817344, +-165670304, -205029920, -245914800, -288069376, -330800544, -373101120, -414799360, -456399872, -497562304, -536742048, +-572604480, -604822656, -633069568, -656218368, -673303232, -684666112, -691340480, -693680704, -691445184, -685094016, +-676069184, -665548672, -653697792, -640570752, -626994880, -613774464, -600480448, -585917824, -569544320, -551551616, +-531744320, -509446464, -484738048, -458893088, -433236576, -408261344, -384195040, -361766176, -341875648, -324845568, +-310456352, -298596320, -289516224, -283392128, -279850944, -278159264, -277859680, -278895296, -280965472, -283144096, +-284521184, -284876064, -284215168, -281956544, -277226176, -269789984, -260008736, -247893696, -232882784, -214655488, +-193558064, -169964208, -143662368, -114285320, -82115480, -47969952, -12283070, 25144886, 64223720, 104003704, +143587744, 182995664, 222292480, 260444672, 296157856, 329288160, 360096512, 387627776, 410374464, 428013344, +440756512, 447537728, 446730272, 438046400, 421747520, 396788928, 361954624, 317939776, 266154288, 206862800, +140971568, 71972912, 3565360, -62324808, -122405496, -170344848, -201553696, -214717232, -204053904, -158424704, +-79753248, 1994476, 47517908, 45334452, 20262046, 2575907, -511101, 807454, 5906, -761283, +128312, 577673, -195958, -460635, 197569, 360240, -182536, -265214, 192737, 229244, +-154619, -161061, 154082, 132070, -134218, -102542, 110059, 62814, -112206, -61203, +74088, 16643, -84826, -23085, 49392, -11811, -51540, 14496, 30602, }, { -71337800, --213465776, -339793664, -413543616, -409479488, -353031808, -305707168, -298885696, -300287456, -264226384, -195696432, --136379712, -100566120, -60322280, 7445863, 92119536, 172758624, 241801296, 295369728, 323153344, 321709696, -303267104, 280336800, 251828960, 211822416, 162183328, 108903192, 53142168, -7278896, -71462888, -134384160, --189267936, -229497824, -251617440, -257608384, -251723744, -235261136, -207125328, -168757856, -125397472, -82674896, --44142064, -11410654, 15624554, 38577396, 59280212, 78995720, 99249176, 121977072, 147628224, 173745392, -195907952, 209443536, 210543584, 197508896, 171792256, 137052944, 96641056, 52245592, 4629975, -45239428, --95707976, -144094000, -186567472, -218991792, -238354048, -243538608, -235136576, -214888496, -184976192, -147172960, --102447856, -51600812, 3540127, 59476708, 111452256, 154566208, 185071744, 201401760, 204407152, 196513008, -180407952, 158314112, 132102456, 103480792, 73781096, 43827992, 14254996, -14263050, -41233832, -66497368, --89908160, -111083424, -129520104, -144553568, -154997312, -159221424, -155894960, -144507392, -125213864, -98698888, --66384624, -30321932, 7365332, 44700944, 79597552, 109910360, 133930504, 150538064, 158915408, 158564288, -149662432, 133052184, 109883520, 81576464, 50009524, 17294222, -14701673, -44412648, -70369280, -91344824, --106646184, -115988816, -119189640, -116235776, -107519672, -93766656, -75855568, -54942832, -32583770, -10457708, -10011032, 27708982, 41794864, 51884280, 58184460, 61274688, 61807800, 60452740, 57889716, 54622320, -50830936, 46487116, 41490456, 35638028, 28609850, 20147692, 10214506, -1030255, -13279502, -26003342, --38427608, -49677740, -58929100, -65435436, -68561640, -67904504, -63380832, -55185496, -43737800, -29694868, --13953275, 2471754, 18584860, 33456722, 46217068, 56118044, 62656592, 65594888, 64864208, 60536492, -52914532, 42531988, 29978334, 15844671, 871342, -14052059, -28158880, -40861244, -51453172, -59042916, --62928252, -62682900, -57788784, -47746076, -32801202, -14114873, 6833293, 28235652, 47299936, 60724932, -66258460, 63038308, 50745040, 30215094, 5039608, -19430968, -38898444, -49840948, -47437912, -29073170, --1954210, 18064632, 20342576, 9911711, 258772, -1879048, -155693, 432718, -141197, -37581, -459562, 310848, -67646, 66035, 318364, 149787, -82678, 21475, 147640, 0, --147103, -73551, -13422, -125091, -211527, -157303, -125091, -194347, -232465, -185220, --158377, -187368, -188442, -140660, -110059, -110059, -88047, -37581, -5906, }, +-213465776, -339793664, -413543616, -409479488, -353031808, -305707168, -298885696, -300287456, -264226384, -195696432, +-136379712, -100566120, -60322280, 7445863, 92119536, 172758624, 241801296, 295369728, 323153344, 321709696, +303267104, 280336800, 251828960, 211822416, 162183328, 108903192, 53142168, -7278896, -71462888, -134384160, +-189267936, -229497824, -251617440, -257608384, -251723744, -235261136, -207125328, -168757856, -125397472, -82674896, +-44142064, -11410654, 15624554, 38577396, 59280212, 78995720, 99249176, 121977072, 147628224, 173745392, +195907952, 209443536, 210543584, 197508896, 171792256, 137052944, 96641056, 52245592, 4629975, -45239428, +-95707976, -144094000, -186567472, -218991792, -238354048, -243538608, -235136576, -214888496, -184976192, -147172960, +-102447856, -51600812, 3540127, 59476708, 111452256, 154566208, 185071744, 201401760, 204407152, 196513008, +180407952, 158314112, 132102456, 103480792, 73781096, 43827992, 14254996, -14263050, -41233832, -66497368, +-89908160, -111083424, -129520104, -144553568, -154997312, -159221424, -155894960, -144507392, -125213864, -98698888, +-66384624, -30321932, 7365332, 44700944, 79597552, 109910360, 133930504, 150538064, 158915408, 158564288, +149662432, 133052184, 109883520, 81576464, 50009524, 17294222, -14701673, -44412648, -70369280, -91344824, +-106646184, -115988816, -119189640, -116235776, -107519672, -93766656, -75855568, -54942832, -32583770, -10457708, +10011032, 27708982, 41794864, 51884280, 58184460, 61274688, 61807800, 60452740, 57889716, 54622320, +50830936, 46487116, 41490456, 35638028, 28609850, 20147692, 10214506, -1030255, -13279502, -26003342, +-38427608, -49677740, -58929100, -65435436, -68561640, -67904504, -63380832, -55185496, -43737800, -29694868, +-13953275, 2471754, 18584860, 33456722, 46217068, 56118044, 62656592, 65594888, 64864208, 60536492, +52914532, 42531988, 29978334, 15844671, 871342, -14052059, -28158880, -40861244, -51453172, -59042916, +-62928252, -62682900, -57788784, -47746076, -32801202, -14114873, 6833293, 28235652, 47299936, 60724932, +66258460, 63038308, 50745040, 30215094, 5039608, -19430968, -38898444, -49840948, -47437912, -29073170, +-1954210, 18064632, 20342576, 9911711, 258772, -1879048, -155693, 432718, -141197, -37581, +459562, 310848, -67646, 66035, 318364, 149787, -82678, 21475, 147640, 0, +-147103, -73551, -13422, -125091, -211527, -157303, -125091, -194347, -232465, -185220, +-158377, -187368, -188442, -140660, -110059, -110059, -88047, -37581, -5906, }, }, { { -71337800, --213465776, -339793664, -413543616, -409479488, -353031808, -305707168, -298885696, -300287456, -264226384, -195696432, --136379712, -100566120, -60322280, 7445863, 92119536, 172758624, 241801296, 295369728, 323153344, 321709696, -303267104, 280336800, 251828960, 211822416, 162183328, 108903192, 53142168, -7278896, -71462888, -134384160, --189267936, -229497824, -251617440, -257608384, -251723744, -235261136, -207125328, -168757856, -125397472, -82674896, --44142064, -11410654, 15624554, 38577396, 59280212, 78995720, 99249176, 121977072, 147628224, 173745392, -195907952, 209443536, 210543584, 197508896, 171792256, 137052944, 96641056, 52245592, 4629975, -45239428, --95707976, -144094000, -186567472, -218991792, -238354048, -243538608, -235136576, -214888496, -184976192, -147172960, --102447856, -51600812, 3540127, 59476708, 111452256, 154566208, 185071744, 201401760, 204407152, 196513008, -180407952, 158314112, 132102456, 103480792, 73781096, 43827992, 14254996, -14263050, -41233832, -66497368, --89908160, -111083424, -129520104, -144553568, -154997312, -159221424, -155894960, -144507392, -125213864, -98698888, --66384624, -30321932, 7365332, 44700944, 79597552, 109910360, 133930504, 150538064, 158915408, 158564288, -149662432, 133052184, 109883520, 81576464, 50009524, 17294222, -14701673, -44412648, -70369280, -91344824, --106646184, -115988816, -119189640, -116235776, -107519672, -93766656, -75855568, -54942832, -32583770, -10457708, -10011032, 27708982, 41794864, 51884280, 58184460, 61274688, 61807800, 60452740, 57889716, 54622320, -50830936, 46487116, 41490456, 35638028, 28609850, 20147692, 10214506, -1030255, -13279502, -26003342, --38427608, -49677740, -58929100, -65435436, -68561640, -67904504, -63380832, -55185496, -43737800, -29694868, --13953275, 2471754, 18584860, 33456722, 46217068, 56118044, 62656592, 65594888, 64864208, 60536492, -52914532, 42531988, 29978334, 15844671, 871342, -14052059, -28158880, -40861244, -51453172, -59042916, --62928252, -62682900, -57788784, -47746076, -32801202, -14114873, 6833293, 28235652, 47299936, 60724932, -66258460, 63038308, 50745040, 30215094, 5039608, -19430968, -38898444, -49840948, -47437912, -29073170, --1954210, 18064632, 20342576, 9911711, 258772, -1879048, -155693, 432718, -141197, -37581, -459562, 310848, -67646, 66035, 318364, 149787, -82678, 21475, 147640, 0, --147103, -73551, -13422, -125091, -211527, -157303, -125091, -194347, -232465, -185220, --158377, -187368, -188442, -140660, -110059, -110059, -88047, -37581, -5906, }, +-213465776, -339793664, -413543616, -409479488, -353031808, -305707168, -298885696, -300287456, -264226384, -195696432, +-136379712, -100566120, -60322280, 7445863, 92119536, 172758624, 241801296, 295369728, 323153344, 321709696, +303267104, 280336800, 251828960, 211822416, 162183328, 108903192, 53142168, -7278896, -71462888, -134384160, +-189267936, -229497824, -251617440, -257608384, -251723744, -235261136, -207125328, -168757856, -125397472, -82674896, +-44142064, -11410654, 15624554, 38577396, 59280212, 78995720, 99249176, 121977072, 147628224, 173745392, +195907952, 209443536, 210543584, 197508896, 171792256, 137052944, 96641056, 52245592, 4629975, -45239428, +-95707976, -144094000, -186567472, -218991792, -238354048, -243538608, -235136576, -214888496, -184976192, -147172960, +-102447856, -51600812, 3540127, 59476708, 111452256, 154566208, 185071744, 201401760, 204407152, 196513008, +180407952, 158314112, 132102456, 103480792, 73781096, 43827992, 14254996, -14263050, -41233832, -66497368, +-89908160, -111083424, -129520104, -144553568, -154997312, -159221424, -155894960, -144507392, -125213864, -98698888, +-66384624, -30321932, 7365332, 44700944, 79597552, 109910360, 133930504, 150538064, 158915408, 158564288, +149662432, 133052184, 109883520, 81576464, 50009524, 17294222, -14701673, -44412648, -70369280, -91344824, +-106646184, -115988816, -119189640, -116235776, -107519672, -93766656, -75855568, -54942832, -32583770, -10457708, +10011032, 27708982, 41794864, 51884280, 58184460, 61274688, 61807800, 60452740, 57889716, 54622320, +50830936, 46487116, 41490456, 35638028, 28609850, 20147692, 10214506, -1030255, -13279502, -26003342, +-38427608, -49677740, -58929100, -65435436, -68561640, -67904504, -63380832, -55185496, -43737800, -29694868, +-13953275, 2471754, 18584860, 33456722, 46217068, 56118044, 62656592, 65594888, 64864208, 60536492, +52914532, 42531988, 29978334, 15844671, 871342, -14052059, -28158880, -40861244, -51453172, -59042916, +-62928252, -62682900, -57788784, -47746076, -32801202, -14114873, 6833293, 28235652, 47299936, 60724932, +66258460, 63038308, 50745040, 30215094, 5039608, -19430968, -38898444, -49840948, -47437912, -29073170, +-1954210, 18064632, 20342576, 9911711, 258772, -1879048, -155693, 432718, -141197, -37581, +459562, 310848, -67646, 66035, 318364, 149787, -82678, 21475, 147640, 0, +-147103, -73551, -13422, -125091, -211527, -157303, -125091, -194347, -232465, -185220, +-158377, -187368, -188442, -140660, -110059, -110059, -88047, -37581, -5906, }, { 294205, -8901857, 28864864, 39342436, 13937706, -47083580, -111196168, -146788016, -153042576, -147262624, -134354624, --107734424, -75171056, -61331596, -80488224, -123064232, -173706192, -227136128, -279479968, -318843328, -336521952, --339959008, -344491808, -356248736, -370266432, -381413504, -389552448, -395492384, -398438208, -398182656, -395899872, --391819136, -384272320, -371361664, -351976320, -325347008, -291679296, -253915248, -217424128, -186781680, -163319360, --146260816, -135214160, -130368904, -130834368, -134310064, -138643696, -142857584, -146631792, -149753696, -152409600, --155440768, -160096512, -167755520, -179548416, -195720048, -215495696, -237803216, -261634912, -285511712, -307542752, --326749824, -343719264, -359359904, -373625120, -385901728, -395743104, -402390112, -404216000, -399577440, -388097536, --370758208, -349199104, -325402816, -301640928, -279964768, -261452384, -245954528, -232490880, -219916288, -207399680, --194486320, -180918512, -166608768, -151734208, -136620224, -121469192, -106369160, -91516088, -77255184, -63954212, --51991652, -41852844, -34239480, -30183956, -30968862, -37641632, -50665044, -70217880, -96439736, -128817344, --165670304, -205029920, -245914800, -288069376, -330800544, -373101120, -414799360, -456399872, -497562304, -536742048, --572604480, -604822656, -633069568, -656218368, -673303232, -684666112, -691340480, -693680704, -691445184, -685094016, --676069184, -665548672, -653697792, -640570752, -626994880, -613774464, -600480448, -585917824, -569544320, -551551616, --531744320, -509446464, -484738048, -458893088, -433236576, -408261344, -384195040, -361766176, -341875648, -324845568, --310456352, -298596320, -289516224, -283392128, -279850944, -278159264, -277859680, -278895296, -280965472, -283144096, --284521184, -284876064, -284215168, -281956544, -277226176, -269789984, -260008736, -247893696, -232882784, -214655488, --193558064, -169964208, -143662368, -114285320, -82115480, -47969952, -12283070, 25144886, 64223720, 104003704, -143587744, 182995664, 222292480, 260444672, 296157856, 329288160, 360096512, 387627776, 410374464, 428013344, -440756512, 447537728, 446730272, 438046400, 421747520, 396788928, 361954624, 317939776, 266154288, 206862800, -140971568, 71972912, 3565360, -62324808, -122405496, -170344848, -201553696, -214717232, -204053904, -158424704, --79753248, 1994476, 47517908, 45334452, 20262046, 2575907, -511101, 807454, 5906, -761283, -128312, 577673, -195958, -460635, 197569, 360240, -182536, -265214, 192737, 229244, --154619, -161061, 154082, 132070, -134218, -102542, 110059, 62814, -112206, -61203, -74088, 16643, -84826, -23085, 49392, -11811, -51540, 14496, 30602, }, +8901857, 28864864, 39342436, 13937706, -47083580, -111196168, -146788016, -153042576, -147262624, -134354624, +-107734424, -75171056, -61331596, -80488224, -123064232, -173706192, -227136128, -279479968, -318843328, -336521952, +-339959008, -344491808, -356248736, -370266432, -381413504, -389552448, -395492384, -398438208, -398182656, -395899872, +-391819136, -384272320, -371361664, -351976320, -325347008, -291679296, -253915248, -217424128, -186781680, -163319360, +-146260816, -135214160, -130368904, -130834368, -134310064, -138643696, -142857584, -146631792, -149753696, -152409600, +-155440768, -160096512, -167755520, -179548416, -195720048, -215495696, -237803216, -261634912, -285511712, -307542752, +-326749824, -343719264, -359359904, -373625120, -385901728, -395743104, -402390112, -404216000, -399577440, -388097536, +-370758208, -349199104, -325402816, -301640928, -279964768, -261452384, -245954528, -232490880, -219916288, -207399680, +-194486320, -180918512, -166608768, -151734208, -136620224, -121469192, -106369160, -91516088, -77255184, -63954212, +-51991652, -41852844, -34239480, -30183956, -30968862, -37641632, -50665044, -70217880, -96439736, -128817344, +-165670304, -205029920, -245914800, -288069376, -330800544, -373101120, -414799360, -456399872, -497562304, -536742048, +-572604480, -604822656, -633069568, -656218368, -673303232, -684666112, -691340480, -693680704, -691445184, -685094016, +-676069184, -665548672, -653697792, -640570752, -626994880, -613774464, -600480448, -585917824, -569544320, -551551616, +-531744320, -509446464, -484738048, -458893088, -433236576, -408261344, -384195040, -361766176, -341875648, -324845568, +-310456352, -298596320, -289516224, -283392128, -279850944, -278159264, -277859680, -278895296, -280965472, -283144096, +-284521184, -284876064, -284215168, -281956544, -277226176, -269789984, -260008736, -247893696, -232882784, -214655488, +-193558064, -169964208, -143662368, -114285320, -82115480, -47969952, -12283070, 25144886, 64223720, 104003704, +143587744, 182995664, 222292480, 260444672, 296157856, 329288160, 360096512, 387627776, 410374464, 428013344, +440756512, 447537728, 446730272, 438046400, 421747520, 396788928, 361954624, 317939776, 266154288, 206862800, +140971568, 71972912, 3565360, -62324808, -122405496, -170344848, -201553696, -214717232, -204053904, -158424704, +-79753248, 1994476, 47517908, 45334452, 20262046, 2575907, -511101, 807454, 5906, -761283, +128312, 577673, -195958, -460635, 197569, 360240, -182536, -265214, 192737, 229244, +-154619, -161061, 154082, 132070, -134218, -102542, 110059, 62814, -112206, -61203, +74088, 16643, -84826, -23085, 49392, -11811, -51540, 14496, 30602, }, }, }; const Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 684059456, -694721728, 718016512, 750012416, 767910656, 747670080, 709496384, 705104256, 728998208, 697888192, 576820544, -472416352, 515254336, 682356480, 830409408, 889270848, 923931200, 1002047040, 1099221120, 1163028352, 1187355008, -1180632832, 1122951936, 1004305600, 868427904, 776772224, 747962112, 758725312, 787148864, 832611072, 903697088, -1003041280, 1119737728, 1229271680, 1305896064, 1339709312, 1339594368, 1320585344, 1291978240, 1255008768, 1207225088, -1149855616, 1092223616, 1046323264, 1016832448, 999522624, 987748544, 975616832, 956979392, 928073728, 891554688, -853911424, 819506048, 789585152, 764623872, 744581440, 728649792, 716380160, 706977920, 697330368, 683703488, -664957056, 640836480, 608352064, 563857280, 507986176, 445618976, 382620384, 325117760, 279242144, 248119184, -230435728, 223447824, 225212512, 233121696, 243301312, 252673456, 259749424, 263692736, 264762720, 264846480, -265530448, 266880672, 269439392, 275141504, 284857248, 297565536, 312960832, 332009024, 354152800, 376782464, -397825088, 416296672, 430680544, 439338112, 441985408, 438891424, 429955744, 416002464, 399061504, 380368736, -360280096, 340298304, 322299712, 306000320, 290274304, 276203456, 265722112, 258674064, 254312528, 253796064, -258285376, 266805520, 278343424, 293458464, 312182912, 333418304, 357347200, 385152256, 416348224, 449873120, -486868896, 528649792, 573701312, 620366656, 669895744, 723237056, 777981760, 831667264, 884435264, 935750976, -982277824, 1020765568, 1049322240, 1065305984, 1065594240, 1048380032, 1012002752, 954715904, 877888640, 785156544, -677219712, 553643840, 419359520, 280817856, 137423392, -13232794, -166012304, -315872832, -467536704, -625439552, --787549888, -961260928, -1156324352, -1334872064, -1404911232, -1314379776, -1130580864, -975823552, -905737728, }, +694721728, 718016512, 750012416, 767910656, 747670080, 709496384, 705104256, 728998208, 697888192, 576820544, +472416352, 515254336, 682356480, 830409408, 889270848, 923931200, 1002047040, 1099221120, 1163028352, 1187355008, +1180632832, 1122951936, 1004305600, 868427904, 776772224, 747962112, 758725312, 787148864, 832611072, 903697088, +1003041280, 1119737728, 1229271680, 1305896064, 1339709312, 1339594368, 1320585344, 1291978240, 1255008768, 1207225088, +1149855616, 1092223616, 1046323264, 1016832448, 999522624, 987748544, 975616832, 956979392, 928073728, 891554688, +853911424, 819506048, 789585152, 764623872, 744581440, 728649792, 716380160, 706977920, 697330368, 683703488, +664957056, 640836480, 608352064, 563857280, 507986176, 445618976, 382620384, 325117760, 279242144, 248119184, +230435728, 223447824, 225212512, 233121696, 243301312, 252673456, 259749424, 263692736, 264762720, 264846480, +265530448, 266880672, 269439392, 275141504, 284857248, 297565536, 312960832, 332009024, 354152800, 376782464, +397825088, 416296672, 430680544, 439338112, 441985408, 438891424, 429955744, 416002464, 399061504, 380368736, +360280096, 340298304, 322299712, 306000320, 290274304, 276203456, 265722112, 258674064, 254312528, 253796064, +258285376, 266805520, 278343424, 293458464, 312182912, 333418304, 357347200, 385152256, 416348224, 449873120, +486868896, 528649792, 573701312, 620366656, 669895744, 723237056, 777981760, 831667264, 884435264, 935750976, +982277824, 1020765568, 1049322240, 1065305984, 1065594240, 1048380032, 1012002752, 954715904, 877888640, 785156544, +677219712, 553643840, 419359520, 280817856, 137423392, -13232794, -166012304, -315872832, -467536704, -625439552, +-787549888, -961260928, -1156324352, -1334872064, -1404911232, -1314379776, -1130580864, -975823552, -905737728, }, { 520912960, -531102240, 467924352, 320982240, 180585120, 92974232, 10579578, -85890752, -130880536, -82408608, 4509179, -51402704, 27641336, -74349104, -250800320, -441627328, -549956096, -544462784, -485270112, -426719488, -358819808, --269153248, -193602096, -164174048, -157523296, -135770352, -98880344, -59730112, -2107755, 95477656, 215902640, -320955392, 400663552, 471848864, 532545888, 550145024, 502925632, 411866432, 318845472, 245655488, 186183072, -129242544, 72652056, 15991237, -45198088, -111775448, -175980912, -229606272, -271699616, -304252800, -325694880, --333088672, -326895328, -309884032, -284240928, -252203696, -216574256, -178364624, -136178912, -89264456, -39213588, -11601780, 60633664, 103889352, 136936448, 158239488, 169834816, 174414320, 173432928, 168196832, 160916848, -153850560, 148247776, 144443504, 142192416, 140497504, 137513040, 131094216, 119749592, 103401872, 83398600, -61611304, 39268884, 16295106, -8673686, -37701224, -72286448, -111843096, -153174096, -191540512, -222234496, --241382000, -246264304, -235969792, -212026432, -178160080, -139403360, -101179768, -68139120, -42813844, -25296820, --14304389, -8010114, -3761855, 1866700, 11986180, 28982976, 55339044, 93388160, 143304272, 202077136, -264642992, 324739808, 374687040, 406500416, 414440736, 395797888, 349667776, 276952384, 181587456, 69872672, --51570748, -175824688, -294516096, -398845152, -481722464, -537794304, -562765824, -554778752, -515776192, -450131904, --362942464, -260368976, -149631296, -37082212, 72688024, 175570752, 267537264, 345687424, 407858688, 451339328, -473669408, 474014080, 452224608, 408090080, 343312832, 262358608, 170016288, 70852464, -28055800, -118341384, --195563824, -257014064, -292038976, -283843648, -229665328, -154733184, -96225520, -71824200, -69452304, }, +531102240, 467924352, 320982240, 180585120, 92974232, 10579578, -85890752, -130880536, -82408608, 4509179, +51402704, 27641336, -74349104, -250800320, -441627328, -549956096, -544462784, -485270112, -426719488, -358819808, +-269153248, -193602096, -164174048, -157523296, -135770352, -98880344, -59730112, -2107755, 95477656, 215902640, +320955392, 400663552, 471848864, 532545888, 550145024, 502925632, 411866432, 318845472, 245655488, 186183072, +129242544, 72652056, 15991237, -45198088, -111775448, -175980912, -229606272, -271699616, -304252800, -325694880, +-333088672, -326895328, -309884032, -284240928, -252203696, -216574256, -178364624, -136178912, -89264456, -39213588, +11601780, 60633664, 103889352, 136936448, 158239488, 169834816, 174414320, 173432928, 168196832, 160916848, +153850560, 148247776, 144443504, 142192416, 140497504, 137513040, 131094216, 119749592, 103401872, 83398600, +61611304, 39268884, 16295106, -8673686, -37701224, -72286448, -111843096, -153174096, -191540512, -222234496, +-241382000, -246264304, -235969792, -212026432, -178160080, -139403360, -101179768, -68139120, -42813844, -25296820, +-14304389, -8010114, -3761855, 1866700, 11986180, 28982976, 55339044, 93388160, 143304272, 202077136, +264642992, 324739808, 374687040, 406500416, 414440736, 395797888, 349667776, 276952384, 181587456, 69872672, +-51570748, -175824688, -294516096, -398845152, -481722464, -537794304, -562765824, -554778752, -515776192, -450131904, +-362942464, -260368976, -149631296, -37082212, 72688024, 175570752, 267537264, 345687424, 407858688, 451339328, +473669408, 474014080, 452224608, 408090080, 343312832, 262358608, 170016288, 70852464, -28055800, -118341384, +-195563824, -257014064, -292038976, -283843648, -229665328, -154733184, -96225520, -71824200, -69452304, }, }, { { 520912960, -531102240, 467924352, 320982240, 180585120, 92974232, 10579578, -85890752, -130880536, -82408608, 4509179, -51402704, 27641336, -74349104, -250800320, -441627328, -549956096, -544462784, -485270112, -426719488, -358819808, --269153248, -193602096, -164174048, -157523296, -135770352, -98880344, -59730112, -2107755, 95477656, 215902640, -320955392, 400663552, 471848864, 532545888, 550145024, 502925632, 411866432, 318845472, 245655488, 186183072, -129242544, 72652056, 15991237, -45198088, -111775448, -175980912, -229606272, -271699616, -304252800, -325694880, --333088672, -326895328, -309884032, -284240928, -252203696, -216574256, -178364624, -136178912, -89264456, -39213588, -11601780, 60633664, 103889352, 136936448, 158239488, 169834816, 174414320, 173432928, 168196832, 160916848, -153850560, 148247776, 144443504, 142192416, 140497504, 137513040, 131094216, 119749592, 103401872, 83398600, -61611304, 39268884, 16295106, -8673686, -37701224, -72286448, -111843096, -153174096, -191540512, -222234496, --241382000, -246264304, -235969792, -212026432, -178160080, -139403360, -101179768, -68139120, -42813844, -25296820, --14304389, -8010114, -3761855, 1866700, 11986180, 28982976, 55339044, 93388160, 143304272, 202077136, -264642992, 324739808, 374687040, 406500416, 414440736, 395797888, 349667776, 276952384, 181587456, 69872672, --51570748, -175824688, -294516096, -398845152, -481722464, -537794304, -562765824, -554778752, -515776192, -450131904, --362942464, -260368976, -149631296, -37082212, 72688024, 175570752, 267537264, 345687424, 407858688, 451339328, -473669408, 474014080, 452224608, 408090080, 343312832, 262358608, 170016288, 70852464, -28055800, -118341384, --195563824, -257014064, -292038976, -283843648, -229665328, -154733184, -96225520, -71824200, -69452304, }, +531102240, 467924352, 320982240, 180585120, 92974232, 10579578, -85890752, -130880536, -82408608, 4509179, +51402704, 27641336, -74349104, -250800320, -441627328, -549956096, -544462784, -485270112, -426719488, -358819808, +-269153248, -193602096, -164174048, -157523296, -135770352, -98880344, -59730112, -2107755, 95477656, 215902640, +320955392, 400663552, 471848864, 532545888, 550145024, 502925632, 411866432, 318845472, 245655488, 186183072, +129242544, 72652056, 15991237, -45198088, -111775448, -175980912, -229606272, -271699616, -304252800, -325694880, +-333088672, -326895328, -309884032, -284240928, -252203696, -216574256, -178364624, -136178912, -89264456, -39213588, +11601780, 60633664, 103889352, 136936448, 158239488, 169834816, 174414320, 173432928, 168196832, 160916848, +153850560, 148247776, 144443504, 142192416, 140497504, 137513040, 131094216, 119749592, 103401872, 83398600, +61611304, 39268884, 16295106, -8673686, -37701224, -72286448, -111843096, -153174096, -191540512, -222234496, +-241382000, -246264304, -235969792, -212026432, -178160080, -139403360, -101179768, -68139120, -42813844, -25296820, +-14304389, -8010114, -3761855, 1866700, 11986180, 28982976, 55339044, 93388160, 143304272, 202077136, +264642992, 324739808, 374687040, 406500416, 414440736, 395797888, 349667776, 276952384, 181587456, 69872672, +-51570748, -175824688, -294516096, -398845152, -481722464, -537794304, -562765824, -554778752, -515776192, -450131904, +-362942464, -260368976, -149631296, -37082212, 72688024, 175570752, 267537264, 345687424, 407858688, 451339328, +473669408, 474014080, 452224608, 408090080, 343312832, 262358608, 170016288, 70852464, -28055800, -118341384, +-195563824, -257014064, -292038976, -283843648, -229665328, -154733184, -96225520, -71824200, -69452304, }, { 684059456, -694721728, 718016512, 750012416, 767910656, 747670080, 709496384, 705104256, 728998208, 697888192, 576820544, -472416352, 515254336, 682356480, 830409408, 889270848, 923931200, 1002047040, 1099221120, 1163028352, 1187355008, -1180632832, 1122951936, 1004305600, 868427904, 776772224, 747962112, 758725312, 787148864, 832611072, 903697088, -1003041280, 1119737728, 1229271680, 1305896064, 1339709312, 1339594368, 1320585344, 1291978240, 1255008768, 1207225088, -1149855616, 1092223616, 1046323264, 1016832448, 999522624, 987748544, 975616832, 956979392, 928073728, 891554688, -853911424, 819506048, 789585152, 764623872, 744581440, 728649792, 716380160, 706977920, 697330368, 683703488, -664957056, 640836480, 608352064, 563857280, 507986176, 445618976, 382620384, 325117760, 279242144, 248119184, -230435728, 223447824, 225212512, 233121696, 243301312, 252673456, 259749424, 263692736, 264762720, 264846480, -265530448, 266880672, 269439392, 275141504, 284857248, 297565536, 312960832, 332009024, 354152800, 376782464, -397825088, 416296672, 430680544, 439338112, 441985408, 438891424, 429955744, 416002464, 399061504, 380368736, -360280096, 340298304, 322299712, 306000320, 290274304, 276203456, 265722112, 258674064, 254312528, 253796064, -258285376, 266805520, 278343424, 293458464, 312182912, 333418304, 357347200, 385152256, 416348224, 449873120, -486868896, 528649792, 573701312, 620366656, 669895744, 723237056, 777981760, 831667264, 884435264, 935750976, -982277824, 1020765568, 1049322240, 1065305984, 1065594240, 1048380032, 1012002752, 954715904, 877888640, 785156544, -677219712, 553643840, 419359520, 280817856, 137423392, -13232794, -166012304, -315872832, -467536704, -625439552, --787549888, -961260928, -1156324352, -1334872064, -1404911232, -1314379776, -1130580864, -975823552, -905737728, }, +694721728, 718016512, 750012416, 767910656, 747670080, 709496384, 705104256, 728998208, 697888192, 576820544, +472416352, 515254336, 682356480, 830409408, 889270848, 923931200, 1002047040, 1099221120, 1163028352, 1187355008, +1180632832, 1122951936, 1004305600, 868427904, 776772224, 747962112, 758725312, 787148864, 832611072, 903697088, +1003041280, 1119737728, 1229271680, 1305896064, 1339709312, 1339594368, 1320585344, 1291978240, 1255008768, 1207225088, +1149855616, 1092223616, 1046323264, 1016832448, 999522624, 987748544, 975616832, 956979392, 928073728, 891554688, +853911424, 819506048, 789585152, 764623872, 744581440, 728649792, 716380160, 706977920, 697330368, 683703488, +664957056, 640836480, 608352064, 563857280, 507986176, 445618976, 382620384, 325117760, 279242144, 248119184, +230435728, 223447824, 225212512, 233121696, 243301312, 252673456, 259749424, 263692736, 264762720, 264846480, +265530448, 266880672, 269439392, 275141504, 284857248, 297565536, 312960832, 332009024, 354152800, 376782464, +397825088, 416296672, 430680544, 439338112, 441985408, 438891424, 429955744, 416002464, 399061504, 380368736, +360280096, 340298304, 322299712, 306000320, 290274304, 276203456, 265722112, 258674064, 254312528, 253796064, +258285376, 266805520, 278343424, 293458464, 312182912, 333418304, 357347200, 385152256, 416348224, 449873120, +486868896, 528649792, 573701312, 620366656, 669895744, 723237056, 777981760, 831667264, 884435264, 935750976, +982277824, 1020765568, 1049322240, 1065305984, 1065594240, 1048380032, 1012002752, 954715904, 877888640, 785156544, +677219712, 553643840, 419359520, 280817856, 137423392, -13232794, -166012304, -315872832, -467536704, -625439552, +-787549888, -961260928, -1156324352, -1334872064, -1404911232, -1314379776, -1130580864, -975823552, -905737728, }, }, { { 582648256, -618615424, 650287040, 617266816, 521306496, 465274880, 522704512, 593792128, 513081632, 305120384, 197173888, -329508288, 571484032, 701774592, 679660864, 644523712, 705061824, 827775488, 915653184, 916024704, 841901632, -739491392, 654379072, 607986432, 595271744, 606680768, 644171520, 710656000, 795550912, 878273024, 937916736, -958235136, 935579712, 884652160, 825393408, 762884992, 690409536, 611157760, 544286144, 507804736, 504527136, -524668384, 553213824, 574627968, 579268160, 568484032, 550185280, 529262368, 504625376, 474049504, 438770624, -403417696, 372625984, 347587424, 326120640, 306292384, 288215392, 271501536, 253786400, 233882976, 214194320, -197859472, 185142624, 174220512, 164078496, 155379024, 149404736, 146674736, 146163648, 146315040, 147198192, -150557392, 157327344, 166595344, 177253296, 188863664, 200782208, 212376464, 224147904, 236905568, 250129232, -262673216, 274402240, 285852096, 297302464, 309112032, 321584608, 333871968, 344540672, 353230464, 359869952, -362718592, 359478560, 349791264, 334681568, 314877472, 291924096, 269370144, 250531344, 236445472, 227508176, -225077232, 230121120, 242381648, 261755712, 288561664, 322402272, 362865696, 410612832, 465521312, 525029152, -586353216, 648246400, 708615360, 763308544, 809486464, 847227904, 876116416, 893722048, 899027904, 893719360, -878729920, 852810880, 815213760, 766653248, 707359616, 636827136, 555341440, 464146368, 365206432, 261514656, -155622768, 48023640, -60431800, -166176576, -266760960, -364360320, -460942880, -553809216, -641089344, -726464704, --812489152, -895320320, -972042880, -1045741888, -1117278336, -1180764416, -1232809216, -1276032128, -1308899328, -1324840064, --1324293632, -1308397952, -1254367232, -1122987392, -911265920, -682454208, -520263872, -454856352, -447431968, }, +618615424, 650287040, 617266816, 521306496, 465274880, 522704512, 593792128, 513081632, 305120384, 197173888, +329508288, 571484032, 701774592, 679660864, 644523712, 705061824, 827775488, 915653184, 916024704, 841901632, +739491392, 654379072, 607986432, 595271744, 606680768, 644171520, 710656000, 795550912, 878273024, 937916736, +958235136, 935579712, 884652160, 825393408, 762884992, 690409536, 611157760, 544286144, 507804736, 504527136, +524668384, 553213824, 574627968, 579268160, 568484032, 550185280, 529262368, 504625376, 474049504, 438770624, +403417696, 372625984, 347587424, 326120640, 306292384, 288215392, 271501536, 253786400, 233882976, 214194320, +197859472, 185142624, 174220512, 164078496, 155379024, 149404736, 146674736, 146163648, 146315040, 147198192, +150557392, 157327344, 166595344, 177253296, 188863664, 200782208, 212376464, 224147904, 236905568, 250129232, +262673216, 274402240, 285852096, 297302464, 309112032, 321584608, 333871968, 344540672, 353230464, 359869952, +362718592, 359478560, 349791264, 334681568, 314877472, 291924096, 269370144, 250531344, 236445472, 227508176, +225077232, 230121120, 242381648, 261755712, 288561664, 322402272, 362865696, 410612832, 465521312, 525029152, +586353216, 648246400, 708615360, 763308544, 809486464, 847227904, 876116416, 893722048, 899027904, 893719360, +878729920, 852810880, 815213760, 766653248, 707359616, 636827136, 555341440, 464146368, 365206432, 261514656, +155622768, 48023640, -60431800, -166176576, -266760960, -364360320, -460942880, -553809216, -641089344, -726464704, +-812489152, -895320320, -972042880, -1045741888, -1117278336, -1180764416, -1232809216, -1276032128, -1308899328, -1324840064, +-1324293632, -1308397952, -1254367232, -1122987392, -911265920, -682454208, -520263872, -454856352, -447431968, }, { 582648256, -618615424, 650287040, 617266816, 521306496, 465274880, 522704512, 593792128, 513081632, 305120384, 197173888, -329508288, 571484032, 701774592, 679660864, 644523712, 705061824, 827775488, 915653184, 916024704, 841901632, -739491392, 654379072, 607986432, 595271744, 606680768, 644171520, 710656000, 795550912, 878273024, 937916736, -958235136, 935579712, 884652160, 825393408, 762884992, 690409536, 611157760, 544286144, 507804736, 504527136, -524668384, 553213824, 574627968, 579268160, 568484032, 550185280, 529262368, 504625376, 474049504, 438770624, -403417696, 372625984, 347587424, 326120640, 306292384, 288215392, 271501536, 253786400, 233882976, 214194320, -197859472, 185142624, 174220512, 164078496, 155379024, 149404736, 146674736, 146163648, 146315040, 147198192, -150557392, 157327344, 166595344, 177253296, 188863664, 200782208, 212376464, 224147904, 236905568, 250129232, -262673216, 274402240, 285852096, 297302464, 309112032, 321584608, 333871968, 344540672, 353230464, 359869952, -362718592, 359478560, 349791264, 334681568, 314877472, 291924096, 269370144, 250531344, 236445472, 227508176, -225077232, 230121120, 242381648, 261755712, 288561664, 322402272, 362865696, 410612832, 465521312, 525029152, -586353216, 648246400, 708615360, 763308544, 809486464, 847227904, 876116416, 893722048, 899027904, 893719360, -878729920, 852810880, 815213760, 766653248, 707359616, 636827136, 555341440, 464146368, 365206432, 261514656, -155622768, 48023640, -60431800, -166176576, -266760960, -364360320, -460942880, -553809216, -641089344, -726464704, --812489152, -895320320, -972042880, -1045741888, -1117278336, -1180764416, -1232809216, -1276032128, -1308899328, -1324840064, --1324293632, -1308397952, -1254367232, -1122987392, -911265920, -682454208, -520263872, -454856352, -447431968, }, +618615424, 650287040, 617266816, 521306496, 465274880, 522704512, 593792128, 513081632, 305120384, 197173888, +329508288, 571484032, 701774592, 679660864, 644523712, 705061824, 827775488, 915653184, 916024704, 841901632, +739491392, 654379072, 607986432, 595271744, 606680768, 644171520, 710656000, 795550912, 878273024, 937916736, +958235136, 935579712, 884652160, 825393408, 762884992, 690409536, 611157760, 544286144, 507804736, 504527136, +524668384, 553213824, 574627968, 579268160, 568484032, 550185280, 529262368, 504625376, 474049504, 438770624, +403417696, 372625984, 347587424, 326120640, 306292384, 288215392, 271501536, 253786400, 233882976, 214194320, +197859472, 185142624, 174220512, 164078496, 155379024, 149404736, 146674736, 146163648, 146315040, 147198192, +150557392, 157327344, 166595344, 177253296, 188863664, 200782208, 212376464, 224147904, 236905568, 250129232, +262673216, 274402240, 285852096, 297302464, 309112032, 321584608, 333871968, 344540672, 353230464, 359869952, +362718592, 359478560, 349791264, 334681568, 314877472, 291924096, 269370144, 250531344, 236445472, 227508176, +225077232, 230121120, 242381648, 261755712, 288561664, 322402272, 362865696, 410612832, 465521312, 525029152, +586353216, 648246400, 708615360, 763308544, 809486464, 847227904, 876116416, 893722048, 899027904, 893719360, +878729920, 852810880, 815213760, 766653248, 707359616, 636827136, 555341440, 464146368, 365206432, 261514656, +155622768, 48023640, -60431800, -166176576, -266760960, -364360320, -460942880, -553809216, -641089344, -726464704, +-812489152, -895320320, -972042880, -1045741888, -1117278336, -1180764416, -1232809216, -1276032128, -1308899328, -1324840064, +-1324293632, -1308397952, -1254367232, -1122987392, -911265920, -682454208, -520263872, -454856352, -447431968, }, }, { { 571035776, -563686528, 583248000, 635546176, 695931264, 759681984, 828763840, 865687680, 835810304, 780023488, 766391296, -783381632, 762498432, 694734592, 639146944, 620424128, 601497792, 561093440, 521875584, 493450944, 455055552, -405524384, 373608480, 369716160, 374602752, 379026560, 390569280, 400235648, 384511776, 344146080, 306105536, -285078976, 272291808, 261769136, 260373264, 270980224, 287966272, 310333408, 342275616, 380825088, 415834432, -441104416, 456541600, 462682336, 461164064, 457771040, 459094432, 468284576, 486372832, 513534752, 546620480, -579007232, 604470464, 618940736, 619525952, 605687552, 580972736, 550405952, 516585248, 480198816, 442552352, -405156608, 368293440, 332101888, 298025088, 267901808, 242780000, 223397360, 210527488, 204188656, 203466016, -207371760, 215130624, 225890576, 239159888, 255406672, 275569920, 300270816, 330058560, 365990272, 409284064, -460427488, 518904512, 583795072, 654486976, 730567488, 810844160, 892802880, 973278784, 1048897600, 1115158144, -1166228608, 1197377280, 1207286912, 1196761984, 1166163072, 1116097152, 1049787712, 972130944, 886425984, 794229120, -698117376, 601780224, 506985984, 413070624, 320269792, 231436992, 149695184, 76461152, 12737799, -39661876, --79682384, -108665896, -129199056, -142991280, -150659392, -152885808, -150864480, -145741120, -138163728, -128583264, --117925304, -107590544, -98434208, -90017144, -81393392, -72254768, -62612032, -51864416, -39275864, -25141664, --10588168, 3440269, 16223702, 26762478, 33942052, 36804648, 34439732, 26286810, 12356084, -7755101, --35396972, -71133784, -113634632, -161730208, -215634736, -274280896, -334196768, -393189760, -451771488, -509486752, --565356736, -622273664, -679333376, -715514688, -697926272, -620863296, -524469728, -457446752, -431498720, }, +563686528, 583248000, 635546176, 695931264, 759681984, 828763840, 865687680, 835810304, 780023488, 766391296, +783381632, 762498432, 694734592, 639146944, 620424128, 601497792, 561093440, 521875584, 493450944, 455055552, +405524384, 373608480, 369716160, 374602752, 379026560, 390569280, 400235648, 384511776, 344146080, 306105536, +285078976, 272291808, 261769136, 260373264, 270980224, 287966272, 310333408, 342275616, 380825088, 415834432, +441104416, 456541600, 462682336, 461164064, 457771040, 459094432, 468284576, 486372832, 513534752, 546620480, +579007232, 604470464, 618940736, 619525952, 605687552, 580972736, 550405952, 516585248, 480198816, 442552352, +405156608, 368293440, 332101888, 298025088, 267901808, 242780000, 223397360, 210527488, 204188656, 203466016, +207371760, 215130624, 225890576, 239159888, 255406672, 275569920, 300270816, 330058560, 365990272, 409284064, +460427488, 518904512, 583795072, 654486976, 730567488, 810844160, 892802880, 973278784, 1048897600, 1115158144, +1166228608, 1197377280, 1207286912, 1196761984, 1166163072, 1116097152, 1049787712, 972130944, 886425984, 794229120, +698117376, 601780224, 506985984, 413070624, 320269792, 231436992, 149695184, 76461152, 12737799, -39661876, +-79682384, -108665896, -129199056, -142991280, -150659392, -152885808, -150864480, -145741120, -138163728, -128583264, +-117925304, -107590544, -98434208, -90017144, -81393392, -72254768, -62612032, -51864416, -39275864, -25141664, +-10588168, 3440269, 16223702, 26762478, 33942052, 36804648, 34439732, 26286810, 12356084, -7755101, +-35396972, -71133784, -113634632, -161730208, -215634736, -274280896, -334196768, -393189760, -451771488, -509486752, +-565356736, -622273664, -679333376, -715514688, -697926272, -620863296, -524469728, -457446752, -431498720, }, { 474638432, -398825280, 259863776, 101473968, -25419228, -112263464, -185079808, -246839280, -268340432, -242517472, -205177024, --186384400, -177214112, -161623376, -147037664, -139704016, -115777824, -44282188, 72674608, 199522176, 297173088, -342699200, 332420800, 279936832, 206128368, 123990336, 37653980, -43978316, -104869680, -137476000, -150506928, --156300304, -158835936, -157595232, -153728688, -146304304, -128659504, -94315336, -44016436, 14989436, 72971496, -119576720, 146105664, 149362320, 132602280, 102576168, 67084704, 34205656, 10243497, -3070365, -8367670, --9587978, -9785546, -10883447, -13646185, -17576080, -21606906, -25021406, -27657442, -29865056, -32603096, --37036040, -43650288, -51892332, -60308320, -66331476, -66204236, -56226492, -34737696, -3041374, 35050692, -74097848, 108104864, 132063264, 143228576, 141143360, 126728376, 101452496, 66897872, 24663850, -23181550, --73234024, -120335320, -158156272, -180484192, -182774480, -163660272, -125737312, -74950400, -18869938, 35067336, -80717464, 113876224, 132494376, 136477952, 127284576, 107568528, 80806048, 50812148, 21297670, -4530117, --24456618, -37682432, -44767516, -47110960, -46420008, -44366476, -42283952, -40926744, -40478456, -40700720, --40956272, -40189620, -37089728, -30430918, -19414326, -4001836, 14828911, 35151088, 54514948, 70483096, -81056232, 84978072, 81845968, 71956272, 56072944, 35316980, 11116986, -14876156, -40789304, -64449744, --83484504, -95661272, -99224480, -93182536, -77692736, -54348516, -25981330, 3897683, 31652298, 54102628, -69217160, 76438608, 76350024, 70198016, 59703268, 46730856, 32668058, 18297098, 4329327, -8508867, --20058034, -30340186, -37857988, -39406860, -33274722, -22494892, -13228499, -9212168, -8891656, }, +398825280, 259863776, 101473968, -25419228, -112263464, -185079808, -246839280, -268340432, -242517472, -205177024, +-186384400, -177214112, -161623376, -147037664, -139704016, -115777824, -44282188, 72674608, 199522176, 297173088, +342699200, 332420800, 279936832, 206128368, 123990336, 37653980, -43978316, -104869680, -137476000, -150506928, +-156300304, -158835936, -157595232, -153728688, -146304304, -128659504, -94315336, -44016436, 14989436, 72971496, +119576720, 146105664, 149362320, 132602280, 102576168, 67084704, 34205656, 10243497, -3070365, -8367670, +-9587978, -9785546, -10883447, -13646185, -17576080, -21606906, -25021406, -27657442, -29865056, -32603096, +-37036040, -43650288, -51892332, -60308320, -66331476, -66204236, -56226492, -34737696, -3041374, 35050692, +74097848, 108104864, 132063264, 143228576, 141143360, 126728376, 101452496, 66897872, 24663850, -23181550, +-73234024, -120335320, -158156272, -180484192, -182774480, -163660272, -125737312, -74950400, -18869938, 35067336, +80717464, 113876224, 132494376, 136477952, 127284576, 107568528, 80806048, 50812148, 21297670, -4530117, +-24456618, -37682432, -44767516, -47110960, -46420008, -44366476, -42283952, -40926744, -40478456, -40700720, +-40956272, -40189620, -37089728, -30430918, -19414326, -4001836, 14828911, 35151088, 54514948, 70483096, +81056232, 84978072, 81845968, 71956272, 56072944, 35316980, 11116986, -14876156, -40789304, -64449744, +-83484504, -95661272, -99224480, -93182536, -77692736, -54348516, -25981330, 3897683, 31652298, 54102628, +69217160, 76438608, 76350024, 70198016, 59703268, 46730856, 32668058, 18297098, 4329327, -8508867, +-20058034, -30340186, -37857988, -39406860, -33274722, -22494892, -13228499, -9212168, -8891656, }, }, { { 474638432, -398825280, 259863776, 101473968, -25419228, -112263464, -185079808, -246839280, -268340432, -242517472, -205177024, --186384400, -177214112, -161623376, -147037664, -139704016, -115777824, -44282188, 72674608, 199522176, 297173088, -342699200, 332420800, 279936832, 206128368, 123990336, 37653980, -43978316, -104869680, -137476000, -150506928, --156300304, -158835936, -157595232, -153728688, -146304304, -128659504, -94315336, -44016436, 14989436, 72971496, -119576720, 146105664, 149362320, 132602280, 102576168, 67084704, 34205656, 10243497, -3070365, -8367670, --9587978, -9785546, -10883447, -13646185, -17576080, -21606906, -25021406, -27657442, -29865056, -32603096, --37036040, -43650288, -51892332, -60308320, -66331476, -66204236, -56226492, -34737696, -3041374, 35050692, -74097848, 108104864, 132063264, 143228576, 141143360, 126728376, 101452496, 66897872, 24663850, -23181550, --73234024, -120335320, -158156272, -180484192, -182774480, -163660272, -125737312, -74950400, -18869938, 35067336, -80717464, 113876224, 132494376, 136477952, 127284576, 107568528, 80806048, 50812148, 21297670, -4530117, --24456618, -37682432, -44767516, -47110960, -46420008, -44366476, -42283952, -40926744, -40478456, -40700720, --40956272, -40189620, -37089728, -30430918, -19414326, -4001836, 14828911, 35151088, 54514948, 70483096, -81056232, 84978072, 81845968, 71956272, 56072944, 35316980, 11116986, -14876156, -40789304, -64449744, --83484504, -95661272, -99224480, -93182536, -77692736, -54348516, -25981330, 3897683, 31652298, 54102628, -69217160, 76438608, 76350024, 70198016, 59703268, 46730856, 32668058, 18297098, 4329327, -8508867, --20058034, -30340186, -37857988, -39406860, -33274722, -22494892, -13228499, -9212168, -8891656, }, +398825280, 259863776, 101473968, -25419228, -112263464, -185079808, -246839280, -268340432, -242517472, -205177024, +-186384400, -177214112, -161623376, -147037664, -139704016, -115777824, -44282188, 72674608, 199522176, 297173088, +342699200, 332420800, 279936832, 206128368, 123990336, 37653980, -43978316, -104869680, -137476000, -150506928, +-156300304, -158835936, -157595232, -153728688, -146304304, -128659504, -94315336, -44016436, 14989436, 72971496, +119576720, 146105664, 149362320, 132602280, 102576168, 67084704, 34205656, 10243497, -3070365, -8367670, +-9587978, -9785546, -10883447, -13646185, -17576080, -21606906, -25021406, -27657442, -29865056, -32603096, +-37036040, -43650288, -51892332, -60308320, -66331476, -66204236, -56226492, -34737696, -3041374, 35050692, +74097848, 108104864, 132063264, 143228576, 141143360, 126728376, 101452496, 66897872, 24663850, -23181550, +-73234024, -120335320, -158156272, -180484192, -182774480, -163660272, -125737312, -74950400, -18869938, 35067336, +80717464, 113876224, 132494376, 136477952, 127284576, 107568528, 80806048, 50812148, 21297670, -4530117, +-24456618, -37682432, -44767516, -47110960, -46420008, -44366476, -42283952, -40926744, -40478456, -40700720, +-40956272, -40189620, -37089728, -30430918, -19414326, -4001836, 14828911, 35151088, 54514948, 70483096, +81056232, 84978072, 81845968, 71956272, 56072944, 35316980, 11116986, -14876156, -40789304, -64449744, +-83484504, -95661272, -99224480, -93182536, -77692736, -54348516, -25981330, 3897683, 31652298, 54102628, +69217160, 76438608, 76350024, 70198016, 59703268, 46730856, 32668058, 18297098, 4329327, -8508867, +-20058034, -30340186, -37857988, -39406860, -33274722, -22494892, -13228499, -9212168, -8891656, }, { 571035776, -563686528, 583248000, 635546176, 695931264, 759681984, 828763840, 865687680, 835810304, 780023488, 766391296, -783381632, 762498432, 694734592, 639146944, 620424128, 601497792, 561093440, 521875584, 493450944, 455055552, -405524384, 373608480, 369716160, 374602752, 379026560, 390569280, 400235648, 384511776, 344146080, 306105536, -285078976, 272291808, 261769136, 260373264, 270980224, 287966272, 310333408, 342275616, 380825088, 415834432, -441104416, 456541600, 462682336, 461164064, 457771040, 459094432, 468284576, 486372832, 513534752, 546620480, -579007232, 604470464, 618940736, 619525952, 605687552, 580972736, 550405952, 516585248, 480198816, 442552352, -405156608, 368293440, 332101888, 298025088, 267901808, 242780000, 223397360, 210527488, 204188656, 203466016, -207371760, 215130624, 225890576, 239159888, 255406672, 275569920, 300270816, 330058560, 365990272, 409284064, -460427488, 518904512, 583795072, 654486976, 730567488, 810844160, 892802880, 973278784, 1048897600, 1115158144, -1166228608, 1197377280, 1207286912, 1196761984, 1166163072, 1116097152, 1049787712, 972130944, 886425984, 794229120, -698117376, 601780224, 506985984, 413070624, 320269792, 231436992, 149695184, 76461152, 12737799, -39661876, --79682384, -108665896, -129199056, -142991280, -150659392, -152885808, -150864480, -145741120, -138163728, -128583264, --117925304, -107590544, -98434208, -90017144, -81393392, -72254768, -62612032, -51864416, -39275864, -25141664, --10588168, 3440269, 16223702, 26762478, 33942052, 36804648, 34439732, 26286810, 12356084, -7755101, --35396972, -71133784, -113634632, -161730208, -215634736, -274280896, -334196768, -393189760, -451771488, -509486752, --565356736, -622273664, -679333376, -715514688, -697926272, -620863296, -524469728, -457446752, -431498720, }, +563686528, 583248000, 635546176, 695931264, 759681984, 828763840, 865687680, 835810304, 780023488, 766391296, +783381632, 762498432, 694734592, 639146944, 620424128, 601497792, 561093440, 521875584, 493450944, 455055552, +405524384, 373608480, 369716160, 374602752, 379026560, 390569280, 400235648, 384511776, 344146080, 306105536, +285078976, 272291808, 261769136, 260373264, 270980224, 287966272, 310333408, 342275616, 380825088, 415834432, +441104416, 456541600, 462682336, 461164064, 457771040, 459094432, 468284576, 486372832, 513534752, 546620480, +579007232, 604470464, 618940736, 619525952, 605687552, 580972736, 550405952, 516585248, 480198816, 442552352, +405156608, 368293440, 332101888, 298025088, 267901808, 242780000, 223397360, 210527488, 204188656, 203466016, +207371760, 215130624, 225890576, 239159888, 255406672, 275569920, 300270816, 330058560, 365990272, 409284064, +460427488, 518904512, 583795072, 654486976, 730567488, 810844160, 892802880, 973278784, 1048897600, 1115158144, +1166228608, 1197377280, 1207286912, 1196761984, 1166163072, 1116097152, 1049787712, 972130944, 886425984, 794229120, +698117376, 601780224, 506985984, 413070624, 320269792, 231436992, 149695184, 76461152, 12737799, -39661876, +-79682384, -108665896, -129199056, -142991280, -150659392, -152885808, -150864480, -145741120, -138163728, -128583264, +-117925304, -107590544, -98434208, -90017144, -81393392, -72254768, -62612032, -51864416, -39275864, -25141664, +-10588168, 3440269, 16223702, 26762478, 33942052, 36804648, 34439732, 26286810, 12356084, -7755101, +-35396972, -71133784, -113634632, -161730208, -215634736, -274280896, -334196768, -393189760, -451771488, -509486752, +-565356736, -622273664, -679333376, -715514688, -697926272, -620863296, -524469728, -457446752, -431498720, }, }, { { 623941184, -612998144, 633148480, 704733824, 794866944, 861142528, 896738688, 910201280, 889980544, 827751360, 758994304, -731771712, 737631104, 721934592, 668889600, 625876032, 626539072, 639323072, 621788864, 584434432, 563421312, -560838464, 552077248, 532985568, 521658688, 522892416, 522615904, 514515616, 508313152, 512267744, 524103584, -538168000, 549766016, 554565632, 552645760, 551173184, 557714944, 573819456, 597628032, 627579008, 660887552, -693373056, 723139328, 750719488, 775102528, 793649280, 806071936, 814991488, 822795456, 830553792, 838920384, -847593024, 854729600, 858321856, 857120320, 850050240, 836670336, 818138112, 795719488, 768999936, 737601600, -703336320, 668304960, 632402240, 595015104, 557364352, 520866240, 485103680, 449674496, 416376672, 387787232, -365310048, 349864288, 342665920, 344173984, 353679296, 370430176, 393913984, 423238432, 457707136, 497588608, -542988032, 592780672, 646010304, 703274560, 765267584, 830945152, 898450240, 966795520, 1035161728, 1101150208, -1160982784, 1211281152, 1249836032, 1274607744, 1282854656, 1272239104, 1242800384, 1196652544, 1135342976, 1059082048, -969406848, 870422912, 765710016, 656083648, 542472640, 428773568, 319327072, 215629376, 118305944, 30366492, --44544180, -105779136, -154947392, -192818800, -219386400, -236027776, -245397248, -249499488, -249133344, -244873808, --237816640, -229477952, -221075920, -212865552, -204624592, -196717552, -189617440, -182404032, -173244480, -161499360, --147937472, -133030168, -116715736, -99729680, -83664352, -69962872, -59843388, -54524072, -54907936, -62049928, --77787760, -103346576, -138120784, -181814560, -235942416, -300696032, -373188640, -451458496, -535952320, -624968768, --715645696, -809665728, -902200832, -960130816, -936017280, -824557504, -686992384, -594167936, -560223744, }, +612998144, 633148480, 704733824, 794866944, 861142528, 896738688, 910201280, 889980544, 827751360, 758994304, +731771712, 737631104, 721934592, 668889600, 625876032, 626539072, 639323072, 621788864, 584434432, 563421312, +560838464, 552077248, 532985568, 521658688, 522892416, 522615904, 514515616, 508313152, 512267744, 524103584, +538168000, 549766016, 554565632, 552645760, 551173184, 557714944, 573819456, 597628032, 627579008, 660887552, +693373056, 723139328, 750719488, 775102528, 793649280, 806071936, 814991488, 822795456, 830553792, 838920384, +847593024, 854729600, 858321856, 857120320, 850050240, 836670336, 818138112, 795719488, 768999936, 737601600, +703336320, 668304960, 632402240, 595015104, 557364352, 520866240, 485103680, 449674496, 416376672, 387787232, +365310048, 349864288, 342665920, 344173984, 353679296, 370430176, 393913984, 423238432, 457707136, 497588608, +542988032, 592780672, 646010304, 703274560, 765267584, 830945152, 898450240, 966795520, 1035161728, 1101150208, +1160982784, 1211281152, 1249836032, 1274607744, 1282854656, 1272239104, 1242800384, 1196652544, 1135342976, 1059082048, +969406848, 870422912, 765710016, 656083648, 542472640, 428773568, 319327072, 215629376, 118305944, 30366492, +-44544180, -105779136, -154947392, -192818800, -219386400, -236027776, -245397248, -249499488, -249133344, -244873808, +-237816640, -229477952, -221075920, -212865552, -204624592, -196717552, -189617440, -182404032, -173244480, -161499360, +-147937472, -133030168, -116715736, -99729680, -83664352, -69962872, -59843388, -54524072, -54907936, -62049928, +-77787760, -103346576, -138120784, -181814560, -235942416, -300696032, -373188640, -451458496, -535952320, -624968768, +-715645696, -809665728, -902200832, -960130816, -936017280, -824557504, -686992384, -594167936, -560223744, }, { 486183840, -364385568, 167209520, -39768712, -210128592, -331406656, -400604480, -397778400, -302930496, -136568688, 38147364, -162939248, 224068976, 241337968, 232082848, 197511056, 137470096, 64096480, -4810900, -61295624, -109430936, --150863408, -174515264, -166983504, -129842232, -78434696, -24713242, 29495152, 81629072, 121392416, 139304576, -135256576, 114458192, 80654656, 37199784, -9960566, -54069344, -89433032, -110358112, -112567336, -97620312, --72567768, -43685188, -13019120, 18754512, 49414136, 75770736, 94334664, 100924752, 92163552, 68307696, -33571612, -5944235, -43534324, -72472744, -87923888, -88904216, -77820512, -58528056, -35112432, -11116449, -11539503, 32719598, 52619256, 70294120, 83450144, 88791472, 82500952, 61509836, 25424596, -22104050, --73134704, -116317376, -139488192, -133975064, -98616744, -40982576, 24864640, 82965344, 120606440, 131869992, -117995096, 85065584, 41168872, -5516886, -47687560, -79339320, -95991984, -95263984, -77884400, -48157320, --12965433, 20242718, 45358076, 58874336, 60375428, 52083456, 37647000, 20866562, 4893579, -8170639, --17400524, -22834730, -25062208, -24886114, -23104240, -20279762, -16602733, -11973832, -6195491, 849867, -8949101, 17289928, 24459302, 28824600, 29047400, 24502788, 15560130, 3646964, -9041980, -20107426, --27507654, -29998200, -27412092, -20667382, -11401528, -1435056, 7650948, 14740328, 19257560, 21090436, -20409684, 17514340, 12801687, 6782827, 71941, -6625524, -12513924, -16778826, -18755048, -18087182, --14814416, -9395241, -2698850, 4130685, 9968619, 13988708, 15758235, 15228880, 12757127, 9001715, -4598836, -22012, -4278325, -7080254, -7436736, -5652714, -3403225, -2173790, -1954747, }, +364385568, 167209520, -39768712, -210128592, -331406656, -400604480, -397778400, -302930496, -136568688, 38147364, +162939248, 224068976, 241337968, 232082848, 197511056, 137470096, 64096480, -4810900, -61295624, -109430936, +-150863408, -174515264, -166983504, -129842232, -78434696, -24713242, 29495152, 81629072, 121392416, 139304576, +135256576, 114458192, 80654656, 37199784, -9960566, -54069344, -89433032, -110358112, -112567336, -97620312, +-72567768, -43685188, -13019120, 18754512, 49414136, 75770736, 94334664, 100924752, 92163552, 68307696, +33571612, -5944235, -43534324, -72472744, -87923888, -88904216, -77820512, -58528056, -35112432, -11116449, +11539503, 32719598, 52619256, 70294120, 83450144, 88791472, 82500952, 61509836, 25424596, -22104050, +-73134704, -116317376, -139488192, -133975064, -98616744, -40982576, 24864640, 82965344, 120606440, 131869992, +117995096, 85065584, 41168872, -5516886, -47687560, -79339320, -95991984, -95263984, -77884400, -48157320, +-12965433, 20242718, 45358076, 58874336, 60375428, 52083456, 37647000, 20866562, 4893579, -8170639, +-17400524, -22834730, -25062208, -24886114, -23104240, -20279762, -16602733, -11973832, -6195491, 849867, +8949101, 17289928, 24459302, 28824600, 29047400, 24502788, 15560130, 3646964, -9041980, -20107426, +-27507654, -29998200, -27412092, -20667382, -11401528, -1435056, 7650948, 14740328, 19257560, 21090436, +20409684, 17514340, 12801687, 6782827, 71941, -6625524, -12513924, -16778826, -18755048, -18087182, +-14814416, -9395241, -2698850, 4130685, 9968619, 13988708, 15758235, 15228880, 12757127, 9001715, +4598836, -22012, -4278325, -7080254, -7436736, -5652714, -3403225, -2173790, -1954747, }, }, { { 486183840, -364385568, 167209520, -39768712, -210128592, -331406656, -400604480, -397778400, -302930496, -136568688, 38147364, -162939248, 224068976, 241337968, 232082848, 197511056, 137470096, 64096480, -4810900, -61295624, -109430936, --150863408, -174515264, -166983504, -129842232, -78434696, -24713242, 29495152, 81629072, 121392416, 139304576, -135256576, 114458192, 80654656, 37199784, -9960566, -54069344, -89433032, -110358112, -112567336, -97620312, --72567768, -43685188, -13019120, 18754512, 49414136, 75770736, 94334664, 100924752, 92163552, 68307696, -33571612, -5944235, -43534324, -72472744, -87923888, -88904216, -77820512, -58528056, -35112432, -11116449, -11539503, 32719598, 52619256, 70294120, 83450144, 88791472, 82500952, 61509836, 25424596, -22104050, --73134704, -116317376, -139488192, -133975064, -98616744, -40982576, 24864640, 82965344, 120606440, 131869992, -117995096, 85065584, 41168872, -5516886, -47687560, -79339320, -95991984, -95263984, -77884400, -48157320, --12965433, 20242718, 45358076, 58874336, 60375428, 52083456, 37647000, 20866562, 4893579, -8170639, --17400524, -22834730, -25062208, -24886114, -23104240, -20279762, -16602733, -11973832, -6195491, 849867, -8949101, 17289928, 24459302, 28824600, 29047400, 24502788, 15560130, 3646964, -9041980, -20107426, --27507654, -29998200, -27412092, -20667382, -11401528, -1435056, 7650948, 14740328, 19257560, 21090436, -20409684, 17514340, 12801687, 6782827, 71941, -6625524, -12513924, -16778826, -18755048, -18087182, --14814416, -9395241, -2698850, 4130685, 9968619, 13988708, 15758235, 15228880, 12757127, 9001715, -4598836, -22012, -4278325, -7080254, -7436736, -5652714, -3403225, -2173790, -1954747, }, +364385568, 167209520, -39768712, -210128592, -331406656, -400604480, -397778400, -302930496, -136568688, 38147364, +162939248, 224068976, 241337968, 232082848, 197511056, 137470096, 64096480, -4810900, -61295624, -109430936, +-150863408, -174515264, -166983504, -129842232, -78434696, -24713242, 29495152, 81629072, 121392416, 139304576, +135256576, 114458192, 80654656, 37199784, -9960566, -54069344, -89433032, -110358112, -112567336, -97620312, +-72567768, -43685188, -13019120, 18754512, 49414136, 75770736, 94334664, 100924752, 92163552, 68307696, +33571612, -5944235, -43534324, -72472744, -87923888, -88904216, -77820512, -58528056, -35112432, -11116449, +11539503, 32719598, 52619256, 70294120, 83450144, 88791472, 82500952, 61509836, 25424596, -22104050, +-73134704, -116317376, -139488192, -133975064, -98616744, -40982576, 24864640, 82965344, 120606440, 131869992, +117995096, 85065584, 41168872, -5516886, -47687560, -79339320, -95991984, -95263984, -77884400, -48157320, +-12965433, 20242718, 45358076, 58874336, 60375428, 52083456, 37647000, 20866562, 4893579, -8170639, +-17400524, -22834730, -25062208, -24886114, -23104240, -20279762, -16602733, -11973832, -6195491, 849867, +8949101, 17289928, 24459302, 28824600, 29047400, 24502788, 15560130, 3646964, -9041980, -20107426, +-27507654, -29998200, -27412092, -20667382, -11401528, -1435056, 7650948, 14740328, 19257560, 21090436, +20409684, 17514340, 12801687, 6782827, 71941, -6625524, -12513924, -16778826, -18755048, -18087182, +-14814416, -9395241, -2698850, 4130685, 9968619, 13988708, 15758235, 15228880, 12757127, 9001715, +4598836, -22012, -4278325, -7080254, -7436736, -5652714, -3403225, -2173790, -1954747, }, { 623941184, -612998144, 633148480, 704733824, 794866944, 861142528, 896738688, 910201280, 889980544, 827751360, 758994304, -731771712, 737631104, 721934592, 668889600, 625876032, 626539072, 639323072, 621788864, 584434432, 563421312, -560838464, 552077248, 532985568, 521658688, 522892416, 522615904, 514515616, 508313152, 512267744, 524103584, -538168000, 549766016, 554565632, 552645760, 551173184, 557714944, 573819456, 597628032, 627579008, 660887552, -693373056, 723139328, 750719488, 775102528, 793649280, 806071936, 814991488, 822795456, 830553792, 838920384, -847593024, 854729600, 858321856, 857120320, 850050240, 836670336, 818138112, 795719488, 768999936, 737601600, -703336320, 668304960, 632402240, 595015104, 557364352, 520866240, 485103680, 449674496, 416376672, 387787232, -365310048, 349864288, 342665920, 344173984, 353679296, 370430176, 393913984, 423238432, 457707136, 497588608, -542988032, 592780672, 646010304, 703274560, 765267584, 830945152, 898450240, 966795520, 1035161728, 1101150208, -1160982784, 1211281152, 1249836032, 1274607744, 1282854656, 1272239104, 1242800384, 1196652544, 1135342976, 1059082048, -969406848, 870422912, 765710016, 656083648, 542472640, 428773568, 319327072, 215629376, 118305944, 30366492, --44544180, -105779136, -154947392, -192818800, -219386400, -236027776, -245397248, -249499488, -249133344, -244873808, --237816640, -229477952, -221075920, -212865552, -204624592, -196717552, -189617440, -182404032, -173244480, -161499360, --147937472, -133030168, -116715736, -99729680, -83664352, -69962872, -59843388, -54524072, -54907936, -62049928, --77787760, -103346576, -138120784, -181814560, -235942416, -300696032, -373188640, -451458496, -535952320, -624968768, --715645696, -809665728, -902200832, -960130816, -936017280, -824557504, -686992384, -594167936, -560223744, }, +612998144, 633148480, 704733824, 794866944, 861142528, 896738688, 910201280, 889980544, 827751360, 758994304, +731771712, 737631104, 721934592, 668889600, 625876032, 626539072, 639323072, 621788864, 584434432, 563421312, +560838464, 552077248, 532985568, 521658688, 522892416, 522615904, 514515616, 508313152, 512267744, 524103584, +538168000, 549766016, 554565632, 552645760, 551173184, 557714944, 573819456, 597628032, 627579008, 660887552, +693373056, 723139328, 750719488, 775102528, 793649280, 806071936, 814991488, 822795456, 830553792, 838920384, +847593024, 854729600, 858321856, 857120320, 850050240, 836670336, 818138112, 795719488, 768999936, 737601600, +703336320, 668304960, 632402240, 595015104, 557364352, 520866240, 485103680, 449674496, 416376672, 387787232, +365310048, 349864288, 342665920, 344173984, 353679296, 370430176, 393913984, 423238432, 457707136, 497588608, +542988032, 592780672, 646010304, 703274560, 765267584, 830945152, 898450240, 966795520, 1035161728, 1101150208, +1160982784, 1211281152, 1249836032, 1274607744, 1282854656, 1272239104, 1242800384, 1196652544, 1135342976, 1059082048, +969406848, 870422912, 765710016, 656083648, 542472640, 428773568, 319327072, 215629376, 118305944, 30366492, +-44544180, -105779136, -154947392, -192818800, -219386400, -236027776, -245397248, -249499488, -249133344, -244873808, +-237816640, -229477952, -221075920, -212865552, -204624592, -196717552, -189617440, -182404032, -173244480, -161499360, +-147937472, -133030168, -116715736, -99729680, -83664352, -69962872, -59843388, -54524072, -54907936, -62049928, +-77787760, -103346576, -138120784, -181814560, -235942416, -300696032, -373188640, -451458496, -535952320, -624968768, +-715645696, -809665728, -902200832, -960130816, -936017280, -824557504, -686992384, -594167936, -560223744, }, }, { { 622567296, -640857984, 664247808, 709125376, 798487040, 894723840, 925620224, 886355648, 844520512, 828989888, 790468352, -702073600, 623767744, 617457408, 657030656, 679072448, 678107136, 691429632, 720630016, 731288512, 718183488, -714545088, 734450688, 749665088, 732673088, 691860736, 654373184, 635630464, 633599488, 637711360, 637620672, -633773440, 641577920, 675981120, 731671296, 787074240, 827028672, 852819968, 871151424, 883716928, 890245760, -894228864, 901254848, 914564992, 934020096, 957390080, 981779584, 1005063168, 1025992512, 1042441728, 1050861440, -1048723648, 1036472768, 1016223104, 989953984, 960034176, 929936128, 902642688, 878713792, 856679040, 834564736, -810120512, 780202816, 741334976, 691475776, 631171776, 563095424, 490937856, 418955808, 351882368, 293955072, -247446480, 212663696, 189638912, 178975584, 180624848, 192862816, 213411024, 241024976, 275355712, 315903968, -361771552, 411923872, 465059072, 519434944, 573097344, 624263296, 671999168, 717108160, 761738240, 807277760, -853147456, 898196288, 941872896, 982590784, 1016185536, 1037911040, 1045184064, 1036654272, 1009752192, 961772032, -893178176, 807686848, 709143104, 600464320, 485757568, 370975648, 261082464, 157814272, 61236568, -27743878, --107908368, -179967184, -246240672, -307747296, -363138400, -411065408, -451936864, -486216608, -512616160, -529793888, --538810624, -542039936, -540447552, -533838656, -523063136, -509843744, -494687360, -476798816, -455955872, -433068544, --409150400, -384934304, -361187424, -338605568, -317866784, -300097952, -286370688, -276776832, -271422080, -272051296, --280811936, -297940800, -322991744, -357392832, -402666080, -457149344, -517921504, -584243328, -654970176, -725584768, --793207424, -858191360, -908787712, -910023552, -830644544, -689013120, -552559872, -476109472, -454689920, }, +640857984, 664247808, 709125376, 798487040, 894723840, 925620224, 886355648, 844520512, 828989888, 790468352, +702073600, 623767744, 617457408, 657030656, 679072448, 678107136, 691429632, 720630016, 731288512, 718183488, +714545088, 734450688, 749665088, 732673088, 691860736, 654373184, 635630464, 633599488, 637711360, 637620672, +633773440, 641577920, 675981120, 731671296, 787074240, 827028672, 852819968, 871151424, 883716928, 890245760, +894228864, 901254848, 914564992, 934020096, 957390080, 981779584, 1005063168, 1025992512, 1042441728, 1050861440, +1048723648, 1036472768, 1016223104, 989953984, 960034176, 929936128, 902642688, 878713792, 856679040, 834564736, +810120512, 780202816, 741334976, 691475776, 631171776, 563095424, 490937856, 418955808, 351882368, 293955072, +247446480, 212663696, 189638912, 178975584, 180624848, 192862816, 213411024, 241024976, 275355712, 315903968, +361771552, 411923872, 465059072, 519434944, 573097344, 624263296, 671999168, 717108160, 761738240, 807277760, +853147456, 898196288, 941872896, 982590784, 1016185536, 1037911040, 1045184064, 1036654272, 1009752192, 961772032, +893178176, 807686848, 709143104, 600464320, 485757568, 370975648, 261082464, 157814272, 61236568, -27743878, +-107908368, -179967184, -246240672, -307747296, -363138400, -411065408, -451936864, -486216608, -512616160, -529793888, +-538810624, -542039936, -540447552, -533838656, -523063136, -509843744, -494687360, -476798816, -455955872, -433068544, +-409150400, -384934304, -361187424, -338605568, -317866784, -300097952, -286370688, -276776832, -271422080, -272051296, +-280811936, -297940800, -322991744, -357392832, -402666080, -457149344, -517921504, -584243328, -654970176, -725584768, +-793207424, -858191360, -908787712, -910023552, -830644544, -689013120, -552559872, -476109472, -454689920, }, { 492595168, -349920640, 129655400, -96068752, -288063456, -422139456, -462165312, -379373376, -193902208, 25130390, 207960704, -323581216, 371539904, 352447712, 261681088, 108736224, -70442296, -227034112, -323784704, -346151264, -296056928, --183744608, -29605210, 131186016, 255954288, 313229280, 295499104, 215232624, 93843960, -42829952, -164810240, --243961664, -264013248, -224482368, -137329424, -23852100, 87437480, 168374000, 202671984, 190624608, 143011680, -73127720, -5229123, -76965816, -127977680, -149385936, -139343232, -102169216, -47250008, 12343199, 63119376, -95461016, 105951472, 96411280, 71464496, 36975372, -418222, -34078420, -58865212, -72094784, -73198056, --63071056, -43987980, -19406272, 6983080, 32086090, 53277460, 67914168, 73251208, 66620848, 46097884, -12402792, -28867548, -67367096, -91574072, -93571232, -72166184, -33356864, 11688753, 50693500, 74797392, -81019728, 71504760, 50860464, 23759760, -6027450, -35191888, -59846612, -75079248, -75928040, -59625956, --27964532, 11826729, 48893908, 72848016, 77854872, 64353644, 37917044, 6492917, -22404160, -43533252, --54400056, -54780696, -46054936, -30625802, -11294690, 9214315, 28262496, 43135968, 51233592, 50516868, -39984000, 20319490, -5370320, -31572842, -51671140, -59984588, -53693532, -34106336, -6614787, 21106006, -41889888, 51274932, 48329656, 35343824, 16665547, -2943663, -19605988, -30780956, -35298188, -33326262, --26037702, -15025943, -2067490, 10809359, 21541408, 28460600, 30424474, 26890254, 18299246, 6234682, --7063611, -19175956, -27662274, -30571578, -27251568, -18436684, -5765994, 8252243, 20380156, 27853400, -29329794, 24358370, 13501230, 316217, -8907225, -10369662, -6804839, -3740380, -3008088, }, +349920640, 129655400, -96068752, -288063456, -422139456, -462165312, -379373376, -193902208, 25130390, 207960704, +323581216, 371539904, 352447712, 261681088, 108736224, -70442296, -227034112, -323784704, -346151264, -296056928, +-183744608, -29605210, 131186016, 255954288, 313229280, 295499104, 215232624, 93843960, -42829952, -164810240, +-243961664, -264013248, -224482368, -137329424, -23852100, 87437480, 168374000, 202671984, 190624608, 143011680, +73127720, -5229123, -76965816, -127977680, -149385936, -139343232, -102169216, -47250008, 12343199, 63119376, +95461016, 105951472, 96411280, 71464496, 36975372, -418222, -34078420, -58865212, -72094784, -73198056, +-63071056, -43987980, -19406272, 6983080, 32086090, 53277460, 67914168, 73251208, 66620848, 46097884, +12402792, -28867548, -67367096, -91574072, -93571232, -72166184, -33356864, 11688753, 50693500, 74797392, +81019728, 71504760, 50860464, 23759760, -6027450, -35191888, -59846612, -75079248, -75928040, -59625956, +-27964532, 11826729, 48893908, 72848016, 77854872, 64353644, 37917044, 6492917, -22404160, -43533252, +-54400056, -54780696, -46054936, -30625802, -11294690, 9214315, 28262496, 43135968, 51233592, 50516868, +39984000, 20319490, -5370320, -31572842, -51671140, -59984588, -53693532, -34106336, -6614787, 21106006, +41889888, 51274932, 48329656, 35343824, 16665547, -2943663, -19605988, -30780956, -35298188, -33326262, +-26037702, -15025943, -2067490, 10809359, 21541408, 28460600, 30424474, 26890254, 18299246, 6234682, +-7063611, -19175956, -27662274, -30571578, -27251568, -18436684, -5765994, 8252243, 20380156, 27853400, +29329794, 24358370, 13501230, 316217, -8907225, -10369662, -6804839, -3740380, -3008088, }, }, { { 492595168, -349920640, 129655400, -96068752, -288063456, -422139456, -462165312, -379373376, -193902208, 25130390, 207960704, -323581216, 371539904, 352447712, 261681088, 108736224, -70442296, -227034112, -323784704, -346151264, -296056928, --183744608, -29605210, 131186016, 255954288, 313229280, 295499104, 215232624, 93843960, -42829952, -164810240, --243961664, -264013248, -224482368, -137329424, -23852100, 87437480, 168374000, 202671984, 190624608, 143011680, -73127720, -5229123, -76965816, -127977680, -149385936, -139343232, -102169216, -47250008, 12343199, 63119376, -95461016, 105951472, 96411280, 71464496, 36975372, -418222, -34078420, -58865212, -72094784, -73198056, --63071056, -43987980, -19406272, 6983080, 32086090, 53277460, 67914168, 73251208, 66620848, 46097884, -12402792, -28867548, -67367096, -91574072, -93571232, -72166184, -33356864, 11688753, 50693500, 74797392, -81019728, 71504760, 50860464, 23759760, -6027450, -35191888, -59846612, -75079248, -75928040, -59625956, --27964532, 11826729, 48893908, 72848016, 77854872, 64353644, 37917044, 6492917, -22404160, -43533252, --54400056, -54780696, -46054936, -30625802, -11294690, 9214315, 28262496, 43135968, 51233592, 50516868, -39984000, 20319490, -5370320, -31572842, -51671140, -59984588, -53693532, -34106336, -6614787, 21106006, -41889888, 51274932, 48329656, 35343824, 16665547, -2943663, -19605988, -30780956, -35298188, -33326262, --26037702, -15025943, -2067490, 10809359, 21541408, 28460600, 30424474, 26890254, 18299246, 6234682, --7063611, -19175956, -27662274, -30571578, -27251568, -18436684, -5765994, 8252243, 20380156, 27853400, -29329794, 24358370, 13501230, 316217, -8907225, -10369662, -6804839, -3740380, -3008088, }, +349920640, 129655400, -96068752, -288063456, -422139456, -462165312, -379373376, -193902208, 25130390, 207960704, +323581216, 371539904, 352447712, 261681088, 108736224, -70442296, -227034112, -323784704, -346151264, -296056928, +-183744608, -29605210, 131186016, 255954288, 313229280, 295499104, 215232624, 93843960, -42829952, -164810240, +-243961664, -264013248, -224482368, -137329424, -23852100, 87437480, 168374000, 202671984, 190624608, 143011680, +73127720, -5229123, -76965816, -127977680, -149385936, -139343232, -102169216, -47250008, 12343199, 63119376, +95461016, 105951472, 96411280, 71464496, 36975372, -418222, -34078420, -58865212, -72094784, -73198056, +-63071056, -43987980, -19406272, 6983080, 32086090, 53277460, 67914168, 73251208, 66620848, 46097884, +12402792, -28867548, -67367096, -91574072, -93571232, -72166184, -33356864, 11688753, 50693500, 74797392, +81019728, 71504760, 50860464, 23759760, -6027450, -35191888, -59846612, -75079248, -75928040, -59625956, +-27964532, 11826729, 48893908, 72848016, 77854872, 64353644, 37917044, 6492917, -22404160, -43533252, +-54400056, -54780696, -46054936, -30625802, -11294690, 9214315, 28262496, 43135968, 51233592, 50516868, +39984000, 20319490, -5370320, -31572842, -51671140, -59984588, -53693532, -34106336, -6614787, 21106006, +41889888, 51274932, 48329656, 35343824, 16665547, -2943663, -19605988, -30780956, -35298188, -33326262, +-26037702, -15025943, -2067490, 10809359, 21541408, 28460600, 30424474, 26890254, 18299246, 6234682, +-7063611, -19175956, -27662274, -30571578, -27251568, -18436684, -5765994, 8252243, 20380156, 27853400, +29329794, 24358370, 13501230, 316217, -8907225, -10369662, -6804839, -3740380, -3008088, }, { 622567296, -640857984, 664247808, 709125376, 798487040, 894723840, 925620224, 886355648, 844520512, 828989888, 790468352, -702073600, 623767744, 617457408, 657030656, 679072448, 678107136, 691429632, 720630016, 731288512, 718183488, -714545088, 734450688, 749665088, 732673088, 691860736, 654373184, 635630464, 633599488, 637711360, 637620672, -633773440, 641577920, 675981120, 731671296, 787074240, 827028672, 852819968, 871151424, 883716928, 890245760, -894228864, 901254848, 914564992, 934020096, 957390080, 981779584, 1005063168, 1025992512, 1042441728, 1050861440, -1048723648, 1036472768, 1016223104, 989953984, 960034176, 929936128, 902642688, 878713792, 856679040, 834564736, -810120512, 780202816, 741334976, 691475776, 631171776, 563095424, 490937856, 418955808, 351882368, 293955072, -247446480, 212663696, 189638912, 178975584, 180624848, 192862816, 213411024, 241024976, 275355712, 315903968, -361771552, 411923872, 465059072, 519434944, 573097344, 624263296, 671999168, 717108160, 761738240, 807277760, -853147456, 898196288, 941872896, 982590784, 1016185536, 1037911040, 1045184064, 1036654272, 1009752192, 961772032, -893178176, 807686848, 709143104, 600464320, 485757568, 370975648, 261082464, 157814272, 61236568, -27743878, --107908368, -179967184, -246240672, -307747296, -363138400, -411065408, -451936864, -486216608, -512616160, -529793888, --538810624, -542039936, -540447552, -533838656, -523063136, -509843744, -494687360, -476798816, -455955872, -433068544, --409150400, -384934304, -361187424, -338605568, -317866784, -300097952, -286370688, -276776832, -271422080, -272051296, --280811936, -297940800, -322991744, -357392832, -402666080, -457149344, -517921504, -584243328, -654970176, -725584768, --793207424, -858191360, -908787712, -910023552, -830644544, -689013120, -552559872, -476109472, -454689920, }, +640857984, 664247808, 709125376, 798487040, 894723840, 925620224, 886355648, 844520512, 828989888, 790468352, +702073600, 623767744, 617457408, 657030656, 679072448, 678107136, 691429632, 720630016, 731288512, 718183488, +714545088, 734450688, 749665088, 732673088, 691860736, 654373184, 635630464, 633599488, 637711360, 637620672, +633773440, 641577920, 675981120, 731671296, 787074240, 827028672, 852819968, 871151424, 883716928, 890245760, +894228864, 901254848, 914564992, 934020096, 957390080, 981779584, 1005063168, 1025992512, 1042441728, 1050861440, +1048723648, 1036472768, 1016223104, 989953984, 960034176, 929936128, 902642688, 878713792, 856679040, 834564736, +810120512, 780202816, 741334976, 691475776, 631171776, 563095424, 490937856, 418955808, 351882368, 293955072, +247446480, 212663696, 189638912, 178975584, 180624848, 192862816, 213411024, 241024976, 275355712, 315903968, +361771552, 411923872, 465059072, 519434944, 573097344, 624263296, 671999168, 717108160, 761738240, 807277760, +853147456, 898196288, 941872896, 982590784, 1016185536, 1037911040, 1045184064, 1036654272, 1009752192, 961772032, +893178176, 807686848, 709143104, 600464320, 485757568, 370975648, 261082464, 157814272, 61236568, -27743878, +-107908368, -179967184, -246240672, -307747296, -363138400, -411065408, -451936864, -486216608, -512616160, -529793888, +-538810624, -542039936, -540447552, -533838656, -523063136, -509843744, -494687360, -476798816, -455955872, -433068544, +-409150400, -384934304, -361187424, -338605568, -317866784, -300097952, -286370688, -276776832, -271422080, -272051296, +-280811936, -297940800, -322991744, -357392832, -402666080, -457149344, -517921504, -584243328, -654970176, -725584768, +-793207424, -858191360, -908787712, -910023552, -830644544, -689013120, -552559872, -476109472, -454689920, }, }, { { 646679296, -645968448, 639122816, 621891968, 595861760, 562558592, 519251872, 475705760, 469890912, 539172480, 669025472, -795626560, 867237120, 879086400, 846760320, 782541952, 709219328, 660229888, 647685376, 657119232, 682932544, -736579392, 809972288, 865853056, 879113792, 859909376, 827793728, 793103296, 770953600, 781334528, 823643200, -875996160, 926382016, 980579136, 1035906368, 1073128704, 1081072256, 1068672128, 1047969344, 1022666048, 995884800, -973002304, 953768896, 933232000, 911046848, 891218048, 874890176, 861030336, 850576960, 843280320, 834800448, -822642496, 810467328, 802096448, 795990592, 789062784, 780909312, 771205376, 757566720, 738932992, 717751296, -696952384, 677270720, 658261696, 639511488, 620062272, 598049472, 571248896, 537837248, 497503232, 451948672, -403237824, 352022496, 298759008, 245707568, 195555232, 148726128, 104236168, 62650688, 26023744, -4582193, --29400124, -48178796, -60261076, -66517768, -69439424, -70959840, -71456984, -71142376, -71192304, -72874320, --76290432, -80570904, -84927608, -89087288, -92982824, -96474632, -99465536, -102183176, -105232064, -109111496, --113631416, -118149720, -122408176, -126476048, -129755256, -130996504, -129633928, -126123864, -120656368, -112729472, --102395776, -90620592, -78009488, -64432024, -50106164, -35723928, -21455510, -7087233, 7117298, 20935282, -34948684, 49608484, 64487324, 79528296, 95684352, 113342040, 131704096, 150455920, 170115072, 190190816, -209036592, 225673680, 239742928, 250109904, 255638608, 256449280, 252586496, 243170848, 228394544, 209796800, -187407136, 160037456, 128926328, 96630856, 62485868, 24452322, -15824270, -56131464, -99214816, -148330992, --202740176, -265789216, -346546400, -437759168, -502903616, -508028608, -462745152, -409909536, -380657568, }, +645968448, 639122816, 621891968, 595861760, 562558592, 519251872, 475705760, 469890912, 539172480, 669025472, +795626560, 867237120, 879086400, 846760320, 782541952, 709219328, 660229888, 647685376, 657119232, 682932544, +736579392, 809972288, 865853056, 879113792, 859909376, 827793728, 793103296, 770953600, 781334528, 823643200, +875996160, 926382016, 980579136, 1035906368, 1073128704, 1081072256, 1068672128, 1047969344, 1022666048, 995884800, +973002304, 953768896, 933232000, 911046848, 891218048, 874890176, 861030336, 850576960, 843280320, 834800448, +822642496, 810467328, 802096448, 795990592, 789062784, 780909312, 771205376, 757566720, 738932992, 717751296, +696952384, 677270720, 658261696, 639511488, 620062272, 598049472, 571248896, 537837248, 497503232, 451948672, +403237824, 352022496, 298759008, 245707568, 195555232, 148726128, 104236168, 62650688, 26023744, -4582193, +-29400124, -48178796, -60261076, -66517768, -69439424, -70959840, -71456984, -71142376, -71192304, -72874320, +-76290432, -80570904, -84927608, -89087288, -92982824, -96474632, -99465536, -102183176, -105232064, -109111496, +-113631416, -118149720, -122408176, -126476048, -129755256, -130996504, -129633928, -126123864, -120656368, -112729472, +-102395776, -90620592, -78009488, -64432024, -50106164, -35723928, -21455510, -7087233, 7117298, 20935282, +34948684, 49608484, 64487324, 79528296, 95684352, 113342040, 131704096, 150455920, 170115072, 190190816, +209036592, 225673680, 239742928, 250109904, 255638608, 256449280, 252586496, 243170848, 228394544, 209796800, +187407136, 160037456, 128926328, 96630856, 62485868, 24452322, -15824270, -56131464, -99214816, -148330992, +-202740176, -265789216, -346546400, -437759168, -502903616, -508028608, -462745152, -409909536, -380657568, }, { 583148672, -539481152, 460055424, 342895680, 195422624, 69911328, 36334888, 107412304, 216472256, 273669952, 227101760, -84176528, -92762168, -219276864, -252809824, -227045936, -205569488, -215370064, -247742848, -299394656, -371254304, --437524032, -458374464, -427335840, -378257248, -343579136, -327581984, -319013536, -307094464, -281768096, -235050672, --168033072, -90096600, -12005507, 56224880, 106833552, 140924864, 169577664, 203022560, 241609088, 279372064, -311309952, 334967712, 349992576, 358677536, 363750432, 364868736, 359889792, 348653088, 332512064, 311486048, -284663456, 251817696, 212406528, 165094240, 110355960, 51527260, -8180839, -67522256, -125252520, -178963232, --226849440, -268405936, -302897728, -329326816, -348103328, -360565184, -366570080, -364243840, -352140064, -330336128, --299850464, -262378480, -220294240, -175666848, -129303208, -81339168, -32445794, 15968152, 62376348, 105550432, -144535312, 178380192, 205931872, 226138624, 238665968, 243955216, 242759072, 236011136, 224936032, 210609088, -193493648, 173958528, 152993712, 131758856, 110757544, 90138480, 70458936, 52431888, 36262408, 21920976, -9699647, -167504, -8105140, -14840723, -20764556, -26108570, -31393526, -37200324, -43745316, -51052128, --59316720, -68821480, -79682920, -91820496, -104991552, -118746184, -132459472, -145388400, -156676112, -165509248, --171375104, -173924160, -172597024, -166776800, -156289024, -141251280, -121526640, -97005056, -68300184, -36366560, --1575716, 35940824, 75268768, 115067544, 154620432, 193336880, 229652976, 261728320, 288700736, 309878144, -323465792, 327600256, 321737600, 305615904, 278244096, 239449792, 190780832, 133667976, 69099584, -204011, --71012456, -142523664, -210281600, -255934416, -256065408, -210513520, -151919440, -114944064, -103846400, }, +539481152, 460055424, 342895680, 195422624, 69911328, 36334888, 107412304, 216472256, 273669952, 227101760, +84176528, -92762168, -219276864, -252809824, -227045936, -205569488, -215370064, -247742848, -299394656, -371254304, +-437524032, -458374464, -427335840, -378257248, -343579136, -327581984, -319013536, -307094464, -281768096, -235050672, +-168033072, -90096600, -12005507, 56224880, 106833552, 140924864, 169577664, 203022560, 241609088, 279372064, +311309952, 334967712, 349992576, 358677536, 363750432, 364868736, 359889792, 348653088, 332512064, 311486048, +284663456, 251817696, 212406528, 165094240, 110355960, 51527260, -8180839, -67522256, -125252520, -178963232, +-226849440, -268405936, -302897728, -329326816, -348103328, -360565184, -366570080, -364243840, -352140064, -330336128, +-299850464, -262378480, -220294240, -175666848, -129303208, -81339168, -32445794, 15968152, 62376348, 105550432, +144535312, 178380192, 205931872, 226138624, 238665968, 243955216, 242759072, 236011136, 224936032, 210609088, +193493648, 173958528, 152993712, 131758856, 110757544, 90138480, 70458936, 52431888, 36262408, 21920976, +9699647, -167504, -8105140, -14840723, -20764556, -26108570, -31393526, -37200324, -43745316, -51052128, +-59316720, -68821480, -79682920, -91820496, -104991552, -118746184, -132459472, -145388400, -156676112, -165509248, +-171375104, -173924160, -172597024, -166776800, -156289024, -141251280, -121526640, -97005056, -68300184, -36366560, +-1575716, 35940824, 75268768, 115067544, 154620432, 193336880, 229652976, 261728320, 288700736, 309878144, +323465792, 327600256, 321737600, 305615904, 278244096, 239449792, 190780832, 133667976, 69099584, -204011, +-71012456, -142523664, -210281600, -255934416, -256065408, -210513520, -151919440, -114944064, -103846400, }, }, { { 583148672, -539481152, 460055424, 342895680, 195422624, 69911328, 36334888, 107412304, 216472256, 273669952, 227101760, -84176528, -92762168, -219276864, -252809824, -227045936, -205569488, -215370064, -247742848, -299394656, -371254304, --437524032, -458374464, -427335840, -378257248, -343579136, -327581984, -319013536, -307094464, -281768096, -235050672, --168033072, -90096600, -12005507, 56224880, 106833552, 140924864, 169577664, 203022560, 241609088, 279372064, -311309952, 334967712, 349992576, 358677536, 363750432, 364868736, 359889792, 348653088, 332512064, 311486048, -284663456, 251817696, 212406528, 165094240, 110355960, 51527260, -8180839, -67522256, -125252520, -178963232, --226849440, -268405936, -302897728, -329326816, -348103328, -360565184, -366570080, -364243840, -352140064, -330336128, --299850464, -262378480, -220294240, -175666848, -129303208, -81339168, -32445794, 15968152, 62376348, 105550432, -144535312, 178380192, 205931872, 226138624, 238665968, 243955216, 242759072, 236011136, 224936032, 210609088, -193493648, 173958528, 152993712, 131758856, 110757544, 90138480, 70458936, 52431888, 36262408, 21920976, -9699647, -167504, -8105140, -14840723, -20764556, -26108570, -31393526, -37200324, -43745316, -51052128, --59316720, -68821480, -79682920, -91820496, -104991552, -118746184, -132459472, -145388400, -156676112, -165509248, --171375104, -173924160, -172597024, -166776800, -156289024, -141251280, -121526640, -97005056, -68300184, -36366560, --1575716, 35940824, 75268768, 115067544, 154620432, 193336880, 229652976, 261728320, 288700736, 309878144, -323465792, 327600256, 321737600, 305615904, 278244096, 239449792, 190780832, 133667976, 69099584, -204011, --71012456, -142523664, -210281600, -255934416, -256065408, -210513520, -151919440, -114944064, -103846400, }, +539481152, 460055424, 342895680, 195422624, 69911328, 36334888, 107412304, 216472256, 273669952, 227101760, +84176528, -92762168, -219276864, -252809824, -227045936, -205569488, -215370064, -247742848, -299394656, -371254304, +-437524032, -458374464, -427335840, -378257248, -343579136, -327581984, -319013536, -307094464, -281768096, -235050672, +-168033072, -90096600, -12005507, 56224880, 106833552, 140924864, 169577664, 203022560, 241609088, 279372064, +311309952, 334967712, 349992576, 358677536, 363750432, 364868736, 359889792, 348653088, 332512064, 311486048, +284663456, 251817696, 212406528, 165094240, 110355960, 51527260, -8180839, -67522256, -125252520, -178963232, +-226849440, -268405936, -302897728, -329326816, -348103328, -360565184, -366570080, -364243840, -352140064, -330336128, +-299850464, -262378480, -220294240, -175666848, -129303208, -81339168, -32445794, 15968152, 62376348, 105550432, +144535312, 178380192, 205931872, 226138624, 238665968, 243955216, 242759072, 236011136, 224936032, 210609088, +193493648, 173958528, 152993712, 131758856, 110757544, 90138480, 70458936, 52431888, 36262408, 21920976, +9699647, -167504, -8105140, -14840723, -20764556, -26108570, -31393526, -37200324, -43745316, -51052128, +-59316720, -68821480, -79682920, -91820496, -104991552, -118746184, -132459472, -145388400, -156676112, -165509248, +-171375104, -173924160, -172597024, -166776800, -156289024, -141251280, -121526640, -97005056, -68300184, -36366560, +-1575716, 35940824, 75268768, 115067544, 154620432, 193336880, 229652976, 261728320, 288700736, 309878144, +323465792, 327600256, 321737600, 305615904, 278244096, 239449792, 190780832, 133667976, 69099584, -204011, +-71012456, -142523664, -210281600, -255934416, -256065408, -210513520, -151919440, -114944064, -103846400, }, { 646679296, -645968448, 639122816, 621891968, 595861760, 562558592, 519251872, 475705760, 469890912, 539172480, 669025472, -795626560, 867237120, 879086400, 846760320, 782541952, 709219328, 660229888, 647685376, 657119232, 682932544, -736579392, 809972288, 865853056, 879113792, 859909376, 827793728, 793103296, 770953600, 781334528, 823643200, -875996160, 926382016, 980579136, 1035906368, 1073128704, 1081072256, 1068672128, 1047969344, 1022666048, 995884800, -973002304, 953768896, 933232000, 911046848, 891218048, 874890176, 861030336, 850576960, 843280320, 834800448, -822642496, 810467328, 802096448, 795990592, 789062784, 780909312, 771205376, 757566720, 738932992, 717751296, -696952384, 677270720, 658261696, 639511488, 620062272, 598049472, 571248896, 537837248, 497503232, 451948672, -403237824, 352022496, 298759008, 245707568, 195555232, 148726128, 104236168, 62650688, 26023744, -4582193, --29400124, -48178796, -60261076, -66517768, -69439424, -70959840, -71456984, -71142376, -71192304, -72874320, --76290432, -80570904, -84927608, -89087288, -92982824, -96474632, -99465536, -102183176, -105232064, -109111496, --113631416, -118149720, -122408176, -126476048, -129755256, -130996504, -129633928, -126123864, -120656368, -112729472, --102395776, -90620592, -78009488, -64432024, -50106164, -35723928, -21455510, -7087233, 7117298, 20935282, -34948684, 49608484, 64487324, 79528296, 95684352, 113342040, 131704096, 150455920, 170115072, 190190816, -209036592, 225673680, 239742928, 250109904, 255638608, 256449280, 252586496, 243170848, 228394544, 209796800, -187407136, 160037456, 128926328, 96630856, 62485868, 24452322, -15824270, -56131464, -99214816, -148330992, --202740176, -265789216, -346546400, -437759168, -502903616, -508028608, -462745152, -409909536, -380657568, }, +645968448, 639122816, 621891968, 595861760, 562558592, 519251872, 475705760, 469890912, 539172480, 669025472, +795626560, 867237120, 879086400, 846760320, 782541952, 709219328, 660229888, 647685376, 657119232, 682932544, +736579392, 809972288, 865853056, 879113792, 859909376, 827793728, 793103296, 770953600, 781334528, 823643200, +875996160, 926382016, 980579136, 1035906368, 1073128704, 1081072256, 1068672128, 1047969344, 1022666048, 995884800, +973002304, 953768896, 933232000, 911046848, 891218048, 874890176, 861030336, 850576960, 843280320, 834800448, +822642496, 810467328, 802096448, 795990592, 789062784, 780909312, 771205376, 757566720, 738932992, 717751296, +696952384, 677270720, 658261696, 639511488, 620062272, 598049472, 571248896, 537837248, 497503232, 451948672, +403237824, 352022496, 298759008, 245707568, 195555232, 148726128, 104236168, 62650688, 26023744, -4582193, +-29400124, -48178796, -60261076, -66517768, -69439424, -70959840, -71456984, -71142376, -71192304, -72874320, +-76290432, -80570904, -84927608, -89087288, -92982824, -96474632, -99465536, -102183176, -105232064, -109111496, +-113631416, -118149720, -122408176, -126476048, -129755256, -130996504, -129633928, -126123864, -120656368, -112729472, +-102395776, -90620592, -78009488, -64432024, -50106164, -35723928, -21455510, -7087233, 7117298, 20935282, +34948684, 49608484, 64487324, 79528296, 95684352, 113342040, 131704096, 150455920, 170115072, 190190816, +209036592, 225673680, 239742928, 250109904, 255638608, 256449280, 252586496, 243170848, 228394544, 209796800, +187407136, 160037456, 128926328, 96630856, 62485868, 24452322, -15824270, -56131464, -99214816, -148330992, +-202740176, -265789216, -346546400, -437759168, -502903616, -508028608, -462745152, -409909536, -380657568, }, }, { { 610245056, -609693184, 622532992, 667203840, 731880704, 761625984, 717755584, 638705664, 597541632, 607697088, 621490880, -618182720, 634340928, 694544000, 765818944, 805395520, 813167232, 810452288, 798206784, 764644288, 714478528, -665478848, 625704768, 591012224, 558409664, 529716032, 505750656, 484434720, 463015200, 439907200, 416915712, -399353568, 390405536, 386368800, 380867488, 372288288, 364262080, 361074144, 365289120, 377479840, 395595488, -416150656, 437420960, 459881472, 483348096, 506016928, 526359520, 543573184, 556197696, 562593472, 563023488, -559953664, 556635840, 556160704, 560780992, 571014272, 585870592, 603945408, 623209408, 640301248, 651950272, -657041920, 655905408, 648372544, 634434880, 616032512, 596019584, 575616896, 554468480, 532571648, 510390304, -487461600, 462482080, 434833216, 405084128, 374107232, 342517728, 311096832, 281308000, 254934224, 232891376, -214522880, 198445744, 183858960, 170454896, 157559264, 144643232, 132688184, 123906048, 119996016, 121520728, -128755064, 141985184, 160971616, 185004112, 213525376, 246200416, 282618496, 322217024, 363954464, 405830912, -445446624, 481160352, 511960640, 536418880, 553044672, 561650752, 563063744, 557408896, 543997312, 523012128, -495937184, 464004096, 427414208, 386569056, 343072864, 298823968, 254642176, 210468432, 166675328, 124344136, -83961776, 44609140, 5198521, -34072512, -72519448, -110651776, -149564720, -188894816, -226988480, -263036144, --297373344, -329594176, -358105248, -381894528, -401356640, -417061184, -428902400, -436790656, -441414720, -444037344, --445783776, -447092128, -448056896, -449501600, -452866176, -458555392, -465826240, -474977216, -487494368, -503547872, --522694848, -546431488, -572308672, -583722560, -557764288, -492758368, -418989632, -370297600, -352403680, }, +609693184, 622532992, 667203840, 731880704, 761625984, 717755584, 638705664, 597541632, 607697088, 621490880, +618182720, 634340928, 694544000, 765818944, 805395520, 813167232, 810452288, 798206784, 764644288, 714478528, +665478848, 625704768, 591012224, 558409664, 529716032, 505750656, 484434720, 463015200, 439907200, 416915712, +399353568, 390405536, 386368800, 380867488, 372288288, 364262080, 361074144, 365289120, 377479840, 395595488, +416150656, 437420960, 459881472, 483348096, 506016928, 526359520, 543573184, 556197696, 562593472, 563023488, +559953664, 556635840, 556160704, 560780992, 571014272, 585870592, 603945408, 623209408, 640301248, 651950272, +657041920, 655905408, 648372544, 634434880, 616032512, 596019584, 575616896, 554468480, 532571648, 510390304, +487461600, 462482080, 434833216, 405084128, 374107232, 342517728, 311096832, 281308000, 254934224, 232891376, +214522880, 198445744, 183858960, 170454896, 157559264, 144643232, 132688184, 123906048, 119996016, 121520728, +128755064, 141985184, 160971616, 185004112, 213525376, 246200416, 282618496, 322217024, 363954464, 405830912, +445446624, 481160352, 511960640, 536418880, 553044672, 561650752, 563063744, 557408896, 543997312, 523012128, +495937184, 464004096, 427414208, 386569056, 343072864, 298823968, 254642176, 210468432, 166675328, 124344136, +83961776, 44609140, 5198521, -34072512, -72519448, -110651776, -149564720, -188894816, -226988480, -263036144, +-297373344, -329594176, -358105248, -381894528, -401356640, -417061184, -428902400, -436790656, -441414720, -444037344, +-445783776, -447092128, -448056896, -449501600, -452866176, -458555392, -465826240, -474977216, -487494368, -503547872, +-522694848, -546431488, -572308672, -583722560, -557764288, -492758368, -418989632, -370297600, -352403680, }, { 515739680, -438247712, 285685120, 87360168, -95296200, -207255264, -246143504, -259510512, -290034304, -329569472, -333904704, --277052768, -179355152, -81425064, -2292439, 68869264, 146194784, 223425280, 278033088, 292392768, 267599552, -219466384, 164171360, 107360224, 45304924, -24937654, -98085776, -163375184, -211983472, -239316112, -242116976, --218141392, -170125808, -107210440, -40395240, 22451942, 76769856, 119062936, 146726816, 159440992, 159155376, -148637536, 130463392, 106756784, 78949552, 47805132, 14026826, -21254720, -56645788, -90608776, -120976880, --144530480, -157458336, -156592368, -140656416, -110776872, -69929048, -21831318, 29657286, 80272400, 125053880, -158881040, 177580784, 178835456, 162489888, 130317896, 85446760, 31808528, -26025354, -82670608, -131849056, --166907792, -182170496, -174769728, -145949968, -100976288, -47752520, 5096516, 50188840, 83007224, 102487584, -110175040, 108646032, 100329360, 87040200, 69905960, 49542984, 26501022, 1746441, -23098334, -45803140, --63909652, -75457208, -79635136, -76845552, -68262600, -55389508, -39773544, -22750978, -5320391, 11724187, -27624692, 41651520, 53098144, 61197916, 65167540, 64411088, 58650464, 47960288, 32899986, 14624364, --5263483, -24955908, -42563664, -56267828, -64661268, -67008468, -63235340, -53855132, -39938364, -22924924, --4322885, 14391362, 31722628, 46244988, 56738664, 62173408, 61746596, 55190328, 43038256, 26581552, -7721815, -11183558, -27750858, -40142912, -47320340, -48993764, -45628120, -38378756, -28668370, -17787608, --6880001, 3067144, 11483669, 18213882, 23163832, 26246008, 27607512, 27451820, 25715580, 22356378, -17622788, 11525008, 3844533, -4312147, -9948755, -10860899, -8375723, -5792301, -4709969, }, +438247712, 285685120, 87360168, -95296200, -207255264, -246143504, -259510512, -290034304, -329569472, -333904704, +-277052768, -179355152, -81425064, -2292439, 68869264, 146194784, 223425280, 278033088, 292392768, 267599552, +219466384, 164171360, 107360224, 45304924, -24937654, -98085776, -163375184, -211983472, -239316112, -242116976, +-218141392, -170125808, -107210440, -40395240, 22451942, 76769856, 119062936, 146726816, 159440992, 159155376, +148637536, 130463392, 106756784, 78949552, 47805132, 14026826, -21254720, -56645788, -90608776, -120976880, +-144530480, -157458336, -156592368, -140656416, -110776872, -69929048, -21831318, 29657286, 80272400, 125053880, +158881040, 177580784, 178835456, 162489888, 130317896, 85446760, 31808528, -26025354, -82670608, -131849056, +-166907792, -182170496, -174769728, -145949968, -100976288, -47752520, 5096516, 50188840, 83007224, 102487584, +110175040, 108646032, 100329360, 87040200, 69905960, 49542984, 26501022, 1746441, -23098334, -45803140, +-63909652, -75457208, -79635136, -76845552, -68262600, -55389508, -39773544, -22750978, -5320391, 11724187, +27624692, 41651520, 53098144, 61197916, 65167540, 64411088, 58650464, 47960288, 32899986, 14624364, +-5263483, -24955908, -42563664, -56267828, -64661268, -67008468, -63235340, -53855132, -39938364, -22924924, +-4322885, 14391362, 31722628, 46244988, 56738664, 62173408, 61746596, 55190328, 43038256, 26581552, +7721815, -11183558, -27750858, -40142912, -47320340, -48993764, -45628120, -38378756, -28668370, -17787608, +-6880001, 3067144, 11483669, 18213882, 23163832, 26246008, 27607512, 27451820, 25715580, 22356378, +17622788, 11525008, 3844533, -4312147, -9948755, -10860899, -8375723, -5792301, -4709969, }, }, { { 515739680, -438247712, 285685120, 87360168, -95296200, -207255264, -246143504, -259510512, -290034304, -329569472, -333904704, --277052768, -179355152, -81425064, -2292439, 68869264, 146194784, 223425280, 278033088, 292392768, 267599552, -219466384, 164171360, 107360224, 45304924, -24937654, -98085776, -163375184, -211983472, -239316112, -242116976, --218141392, -170125808, -107210440, -40395240, 22451942, 76769856, 119062936, 146726816, 159440992, 159155376, -148637536, 130463392, 106756784, 78949552, 47805132, 14026826, -21254720, -56645788, -90608776, -120976880, --144530480, -157458336, -156592368, -140656416, -110776872, -69929048, -21831318, 29657286, 80272400, 125053880, -158881040, 177580784, 178835456, 162489888, 130317896, 85446760, 31808528, -26025354, -82670608, -131849056, --166907792, -182170496, -174769728, -145949968, -100976288, -47752520, 5096516, 50188840, 83007224, 102487584, -110175040, 108646032, 100329360, 87040200, 69905960, 49542984, 26501022, 1746441, -23098334, -45803140, --63909652, -75457208, -79635136, -76845552, -68262600, -55389508, -39773544, -22750978, -5320391, 11724187, -27624692, 41651520, 53098144, 61197916, 65167540, 64411088, 58650464, 47960288, 32899986, 14624364, --5263483, -24955908, -42563664, -56267828, -64661268, -67008468, -63235340, -53855132, -39938364, -22924924, --4322885, 14391362, 31722628, 46244988, 56738664, 62173408, 61746596, 55190328, 43038256, 26581552, -7721815, -11183558, -27750858, -40142912, -47320340, -48993764, -45628120, -38378756, -28668370, -17787608, --6880001, 3067144, 11483669, 18213882, 23163832, 26246008, 27607512, 27451820, 25715580, 22356378, -17622788, 11525008, 3844533, -4312147, -9948755, -10860899, -8375723, -5792301, -4709969, }, +438247712, 285685120, 87360168, -95296200, -207255264, -246143504, -259510512, -290034304, -329569472, -333904704, +-277052768, -179355152, -81425064, -2292439, 68869264, 146194784, 223425280, 278033088, 292392768, 267599552, +219466384, 164171360, 107360224, 45304924, -24937654, -98085776, -163375184, -211983472, -239316112, -242116976, +-218141392, -170125808, -107210440, -40395240, 22451942, 76769856, 119062936, 146726816, 159440992, 159155376, +148637536, 130463392, 106756784, 78949552, 47805132, 14026826, -21254720, -56645788, -90608776, -120976880, +-144530480, -157458336, -156592368, -140656416, -110776872, -69929048, -21831318, 29657286, 80272400, 125053880, +158881040, 177580784, 178835456, 162489888, 130317896, 85446760, 31808528, -26025354, -82670608, -131849056, +-166907792, -182170496, -174769728, -145949968, -100976288, -47752520, 5096516, 50188840, 83007224, 102487584, +110175040, 108646032, 100329360, 87040200, 69905960, 49542984, 26501022, 1746441, -23098334, -45803140, +-63909652, -75457208, -79635136, -76845552, -68262600, -55389508, -39773544, -22750978, -5320391, 11724187, +27624692, 41651520, 53098144, 61197916, 65167540, 64411088, 58650464, 47960288, 32899986, 14624364, +-5263483, -24955908, -42563664, -56267828, -64661268, -67008468, -63235340, -53855132, -39938364, -22924924, +-4322885, 14391362, 31722628, 46244988, 56738664, 62173408, 61746596, 55190328, 43038256, 26581552, +7721815, -11183558, -27750858, -40142912, -47320340, -48993764, -45628120, -38378756, -28668370, -17787608, +-6880001, 3067144, 11483669, 18213882, 23163832, 26246008, 27607512, 27451820, 25715580, 22356378, +17622788, 11525008, 3844533, -4312147, -9948755, -10860899, -8375723, -5792301, -4709969, }, { 610245056, -609693184, 622532992, 667203840, 731880704, 761625984, 717755584, 638705664, 597541632, 607697088, 621490880, -618182720, 634340928, 694544000, 765818944, 805395520, 813167232, 810452288, 798206784, 764644288, 714478528, -665478848, 625704768, 591012224, 558409664, 529716032, 505750656, 484434720, 463015200, 439907200, 416915712, -399353568, 390405536, 386368800, 380867488, 372288288, 364262080, 361074144, 365289120, 377479840, 395595488, -416150656, 437420960, 459881472, 483348096, 506016928, 526359520, 543573184, 556197696, 562593472, 563023488, -559953664, 556635840, 556160704, 560780992, 571014272, 585870592, 603945408, 623209408, 640301248, 651950272, -657041920, 655905408, 648372544, 634434880, 616032512, 596019584, 575616896, 554468480, 532571648, 510390304, -487461600, 462482080, 434833216, 405084128, 374107232, 342517728, 311096832, 281308000, 254934224, 232891376, -214522880, 198445744, 183858960, 170454896, 157559264, 144643232, 132688184, 123906048, 119996016, 121520728, -128755064, 141985184, 160971616, 185004112, 213525376, 246200416, 282618496, 322217024, 363954464, 405830912, -445446624, 481160352, 511960640, 536418880, 553044672, 561650752, 563063744, 557408896, 543997312, 523012128, -495937184, 464004096, 427414208, 386569056, 343072864, 298823968, 254642176, 210468432, 166675328, 124344136, -83961776, 44609140, 5198521, -34072512, -72519448, -110651776, -149564720, -188894816, -226988480, -263036144, --297373344, -329594176, -358105248, -381894528, -401356640, -417061184, -428902400, -436790656, -441414720, -444037344, --445783776, -447092128, -448056896, -449501600, -452866176, -458555392, -465826240, -474977216, -487494368, -503547872, --522694848, -546431488, -572308672, -583722560, -557764288, -492758368, -418989632, -370297600, -352403680, }, +609693184, 622532992, 667203840, 731880704, 761625984, 717755584, 638705664, 597541632, 607697088, 621490880, +618182720, 634340928, 694544000, 765818944, 805395520, 813167232, 810452288, 798206784, 764644288, 714478528, +665478848, 625704768, 591012224, 558409664, 529716032, 505750656, 484434720, 463015200, 439907200, 416915712, +399353568, 390405536, 386368800, 380867488, 372288288, 364262080, 361074144, 365289120, 377479840, 395595488, +416150656, 437420960, 459881472, 483348096, 506016928, 526359520, 543573184, 556197696, 562593472, 563023488, +559953664, 556635840, 556160704, 560780992, 571014272, 585870592, 603945408, 623209408, 640301248, 651950272, +657041920, 655905408, 648372544, 634434880, 616032512, 596019584, 575616896, 554468480, 532571648, 510390304, +487461600, 462482080, 434833216, 405084128, 374107232, 342517728, 311096832, 281308000, 254934224, 232891376, +214522880, 198445744, 183858960, 170454896, 157559264, 144643232, 132688184, 123906048, 119996016, 121520728, +128755064, 141985184, 160971616, 185004112, 213525376, 246200416, 282618496, 322217024, 363954464, 405830912, +445446624, 481160352, 511960640, 536418880, 553044672, 561650752, 563063744, 557408896, 543997312, 523012128, +495937184, 464004096, 427414208, 386569056, 343072864, 298823968, 254642176, 210468432, 166675328, 124344136, +83961776, 44609140, 5198521, -34072512, -72519448, -110651776, -149564720, -188894816, -226988480, -263036144, +-297373344, -329594176, -358105248, -381894528, -401356640, -417061184, -428902400, -436790656, -441414720, -444037344, +-445783776, -447092128, -448056896, -449501600, -452866176, -458555392, -465826240, -474977216, -487494368, -503547872, +-522694848, -546431488, -572308672, -583722560, -557764288, -492758368, -418989632, -370297600, -352403680, }, }, { { 573552064, -570192320, 581792000, 620967424, 671831104, 698598464, 681930752, 638787264, 598702848, 570998720, 549175488, -537884544, 553273408, 596125376, 644172096, 676342976, 689677824, 687518528, 667147456, 629091904, 587057088, -556523584, 538422976, 522272320, 501194752, 476544352, 450953856, 424396448, 396837248, 369501952, 342626720, -314877472, 285514944, 255454992, 226385584, 200594832, 181621824, 173160192, 176257408, 188260768, 205153952, -224390032, 244880784, 265123504, 282881056, 296865984, 307601248, 316306080, 323835712, 330969632, 338782720, -348169376, 359361536, 371913568, 384639008, 395740960, 403618464, 407422208, 406582528, 400576032, 389836992, -376057664, 360677408, 343627456, 324188960, 302208928, 277727072, 250390144, 220360816, 189325376, 159854384, -134133976, 113651280, 99327024, 91166048, 87985624, 87882544, 89001384, 90074056, 90682328, 91105920, -91786136, 93073016, 95422360, 99376952, 105186968, 112838456, 122489248, 134506560, 149102480, 166340320, -186418768, 209624464, 236110992, 265856336, 298457280, 332832576, 367526272, 401262144, 432677152, 459869664, -481246240, 496708128, 507029472, 512326784, 512221568, 507134720, 497961728, 484529216, 465722080, 441205344, -411850848, 378432800, 341078912, 300298208, 257615904, 214704880, 172351664, 130707128, 90312960, 52321828, -17476222, -14641544, -44763760, -72813120, -98525480, -122787208, -147041424, -171491072, -195217008, -217874032, --239737024, -260137040, -277482816, -290973312, -301004192, -307948096, -311751808, -312641952, -311275072, -308364160, --304645248, -300720736, -296806944, -293374176, -291637952, -292377760, -295200096, -300228960, -308901024, -321814912, --338522336, -360246272, -386598592, -406292640, -400060640, -361901472, -311420032, -275072800, -260514992, }, +570192320, 581792000, 620967424, 671831104, 698598464, 681930752, 638787264, 598702848, 570998720, 549175488, +537884544, 553273408, 596125376, 644172096, 676342976, 689677824, 687518528, 667147456, 629091904, 587057088, +556523584, 538422976, 522272320, 501194752, 476544352, 450953856, 424396448, 396837248, 369501952, 342626720, +314877472, 285514944, 255454992, 226385584, 200594832, 181621824, 173160192, 176257408, 188260768, 205153952, +224390032, 244880784, 265123504, 282881056, 296865984, 307601248, 316306080, 323835712, 330969632, 338782720, +348169376, 359361536, 371913568, 384639008, 395740960, 403618464, 407422208, 406582528, 400576032, 389836992, +376057664, 360677408, 343627456, 324188960, 302208928, 277727072, 250390144, 220360816, 189325376, 159854384, +134133976, 113651280, 99327024, 91166048, 87985624, 87882544, 89001384, 90074056, 90682328, 91105920, +91786136, 93073016, 95422360, 99376952, 105186968, 112838456, 122489248, 134506560, 149102480, 166340320, +186418768, 209624464, 236110992, 265856336, 298457280, 332832576, 367526272, 401262144, 432677152, 459869664, +481246240, 496708128, 507029472, 512326784, 512221568, 507134720, 497961728, 484529216, 465722080, 441205344, +411850848, 378432800, 341078912, 300298208, 257615904, 214704880, 172351664, 130707128, 90312960, 52321828, +17476222, -14641544, -44763760, -72813120, -98525480, -122787208, -147041424, -171491072, -195217008, -217874032, +-239737024, -260137040, -277482816, -290973312, -301004192, -307948096, -311751808, -312641952, -311275072, -308364160, +-304645248, -300720736, -296806944, -293374176, -291637952, -292377760, -295200096, -300228960, -308901024, -321814912, +-338522336, -360246272, -386598592, -406292640, -400060640, -361901472, -311420032, -275072800, -260514992, }, { 501715520, -460559008, 366155616, 224563440, 80469432, -11944304, -46012520, -71380208, -130646464, -206194400, -252554816, --263529536, -274076352, -303230048, -330179904, -329530816, -299793024, -249240176, -179660624, -96497712, -16281684, -49042620, 103762112, 155969584, 203624400, 240106928, 264837344, 280934336, 287637184, 280503232, 256201248, -214720448, 159932240, 99238440, 39739184, -15985331, -68172408, -114765824, -150986352, -173690096, -183660848, --183926064, -177937808, -168966160, -159263824, -149551296, -139858624, -130014568, -118512104, -101964672, -76892800, --41908144, 1741609, 50550156, 99314136, 142736800, 177676352, 203679696, 221240752, 230115216, 229246560, -217352192, 193321312, 156962800, 110015584, 56170656, -140123, -54926188, -105112880, -148744912, -184897808, --212817248, -230854496, -236542640, -227862512, -204462448, -168132944, -122712584, -73326904, -24844238, 19481972, -58070104, 90189480, 115522272, 134254240, 146931376, 154040080, 155942208, 153108608, 146082032, 135206112, -120597848, 102302896, 80275088, 54349052, 24573656, -8286066, -42633456, -76381160, -107322640, -133334040, --152571200, -163738656, -166214160, -159895728, -145068432, -122527360, -93683976, -60323888, -24304684, 12397960, -47603272, 79232480, 105656192, 125609536, 138077824, 142619216, 139570336, 129651104, 113653960, 92704720, -68354944, 42062764, 14964203, -11664057, -36275292, -57592828, -74755520, -86879136, -93201864, -93776856, --89387936, -80867256, -69139312, -55655260, -41899552, -28639916, -16245177, -5225902, 4234301, 12647068, -20462834, 27614492, 34209416, 40676560, 46849504, 51966420, 55684788, 57866096, 57622356, 54056996, -47305308, 37140728, 22166326, 3399467, -12861280, -19901804, -17953500, -13210783, -10441065, }, +460559008, 366155616, 224563440, 80469432, -11944304, -46012520, -71380208, -130646464, -206194400, -252554816, +-263529536, -274076352, -303230048, -330179904, -329530816, -299793024, -249240176, -179660624, -96497712, -16281684, +49042620, 103762112, 155969584, 203624400, 240106928, 264837344, 280934336, 287637184, 280503232, 256201248, +214720448, 159932240, 99238440, 39739184, -15985331, -68172408, -114765824, -150986352, -173690096, -183660848, +-183926064, -177937808, -168966160, -159263824, -149551296, -139858624, -130014568, -118512104, -101964672, -76892800, +-41908144, 1741609, 50550156, 99314136, 142736800, 177676352, 203679696, 221240752, 230115216, 229246560, +217352192, 193321312, 156962800, 110015584, 56170656, -140123, -54926188, -105112880, -148744912, -184897808, +-212817248, -230854496, -236542640, -227862512, -204462448, -168132944, -122712584, -73326904, -24844238, 19481972, +58070104, 90189480, 115522272, 134254240, 146931376, 154040080, 155942208, 153108608, 146082032, 135206112, +120597848, 102302896, 80275088, 54349052, 24573656, -8286066, -42633456, -76381160, -107322640, -133334040, +-152571200, -163738656, -166214160, -159895728, -145068432, -122527360, -93683976, -60323888, -24304684, 12397960, +47603272, 79232480, 105656192, 125609536, 138077824, 142619216, 139570336, 129651104, 113653960, 92704720, +68354944, 42062764, 14964203, -11664057, -36275292, -57592828, -74755520, -86879136, -93201864, -93776856, +-89387936, -80867256, -69139312, -55655260, -41899552, -28639916, -16245177, -5225902, 4234301, 12647068, +20462834, 27614492, 34209416, 40676560, 46849504, 51966420, 55684788, 57866096, 57622356, 54056996, +47305308, 37140728, 22166326, 3399467, -12861280, -19901804, -17953500, -13210783, -10441065, }, }, { { 501715520, -460559008, 366155616, 224563440, 80469432, -11944304, -46012520, -71380208, -130646464, -206194400, -252554816, --263529536, -274076352, -303230048, -330179904, -329530816, -299793024, -249240176, -179660624, -96497712, -16281684, -49042620, 103762112, 155969584, 203624400, 240106928, 264837344, 280934336, 287637184, 280503232, 256201248, -214720448, 159932240, 99238440, 39739184, -15985331, -68172408, -114765824, -150986352, -173690096, -183660848, --183926064, -177937808, -168966160, -159263824, -149551296, -139858624, -130014568, -118512104, -101964672, -76892800, --41908144, 1741609, 50550156, 99314136, 142736800, 177676352, 203679696, 221240752, 230115216, 229246560, -217352192, 193321312, 156962800, 110015584, 56170656, -140123, -54926188, -105112880, -148744912, -184897808, --212817248, -230854496, -236542640, -227862512, -204462448, -168132944, -122712584, -73326904, -24844238, 19481972, -58070104, 90189480, 115522272, 134254240, 146931376, 154040080, 155942208, 153108608, 146082032, 135206112, -120597848, 102302896, 80275088, 54349052, 24573656, -8286066, -42633456, -76381160, -107322640, -133334040, --152571200, -163738656, -166214160, -159895728, -145068432, -122527360, -93683976, -60323888, -24304684, 12397960, -47603272, 79232480, 105656192, 125609536, 138077824, 142619216, 139570336, 129651104, 113653960, 92704720, -68354944, 42062764, 14964203, -11664057, -36275292, -57592828, -74755520, -86879136, -93201864, -93776856, --89387936, -80867256, -69139312, -55655260, -41899552, -28639916, -16245177, -5225902, 4234301, 12647068, -20462834, 27614492, 34209416, 40676560, 46849504, 51966420, 55684788, 57866096, 57622356, 54056996, -47305308, 37140728, 22166326, 3399467, -12861280, -19901804, -17953500, -13210783, -10441065, }, +460559008, 366155616, 224563440, 80469432, -11944304, -46012520, -71380208, -130646464, -206194400, -252554816, +-263529536, -274076352, -303230048, -330179904, -329530816, -299793024, -249240176, -179660624, -96497712, -16281684, +49042620, 103762112, 155969584, 203624400, 240106928, 264837344, 280934336, 287637184, 280503232, 256201248, +214720448, 159932240, 99238440, 39739184, -15985331, -68172408, -114765824, -150986352, -173690096, -183660848, +-183926064, -177937808, -168966160, -159263824, -149551296, -139858624, -130014568, -118512104, -101964672, -76892800, +-41908144, 1741609, 50550156, 99314136, 142736800, 177676352, 203679696, 221240752, 230115216, 229246560, +217352192, 193321312, 156962800, 110015584, 56170656, -140123, -54926188, -105112880, -148744912, -184897808, +-212817248, -230854496, -236542640, -227862512, -204462448, -168132944, -122712584, -73326904, -24844238, 19481972, +58070104, 90189480, 115522272, 134254240, 146931376, 154040080, 155942208, 153108608, 146082032, 135206112, +120597848, 102302896, 80275088, 54349052, 24573656, -8286066, -42633456, -76381160, -107322640, -133334040, +-152571200, -163738656, -166214160, -159895728, -145068432, -122527360, -93683976, -60323888, -24304684, 12397960, +47603272, 79232480, 105656192, 125609536, 138077824, 142619216, 139570336, 129651104, 113653960, 92704720, +68354944, 42062764, 14964203, -11664057, -36275292, -57592828, -74755520, -86879136, -93201864, -93776856, +-89387936, -80867256, -69139312, -55655260, -41899552, -28639916, -16245177, -5225902, 4234301, 12647068, +20462834, 27614492, 34209416, 40676560, 46849504, 51966420, 55684788, 57866096, 57622356, 54056996, +47305308, 37140728, 22166326, 3399467, -12861280, -19901804, -17953500, -13210783, -10441065, }, { 573552064, -570192320, 581792000, 620967424, 671831104, 698598464, 681930752, 638787264, 598702848, 570998720, 549175488, -537884544, 553273408, 596125376, 644172096, 676342976, 689677824, 687518528, 667147456, 629091904, 587057088, -556523584, 538422976, 522272320, 501194752, 476544352, 450953856, 424396448, 396837248, 369501952, 342626720, -314877472, 285514944, 255454992, 226385584, 200594832, 181621824, 173160192, 176257408, 188260768, 205153952, -224390032, 244880784, 265123504, 282881056, 296865984, 307601248, 316306080, 323835712, 330969632, 338782720, -348169376, 359361536, 371913568, 384639008, 395740960, 403618464, 407422208, 406582528, 400576032, 389836992, -376057664, 360677408, 343627456, 324188960, 302208928, 277727072, 250390144, 220360816, 189325376, 159854384, -134133976, 113651280, 99327024, 91166048, 87985624, 87882544, 89001384, 90074056, 90682328, 91105920, -91786136, 93073016, 95422360, 99376952, 105186968, 112838456, 122489248, 134506560, 149102480, 166340320, -186418768, 209624464, 236110992, 265856336, 298457280, 332832576, 367526272, 401262144, 432677152, 459869664, -481246240, 496708128, 507029472, 512326784, 512221568, 507134720, 497961728, 484529216, 465722080, 441205344, -411850848, 378432800, 341078912, 300298208, 257615904, 214704880, 172351664, 130707128, 90312960, 52321828, -17476222, -14641544, -44763760, -72813120, -98525480, -122787208, -147041424, -171491072, -195217008, -217874032, --239737024, -260137040, -277482816, -290973312, -301004192, -307948096, -311751808, -312641952, -311275072, -308364160, --304645248, -300720736, -296806944, -293374176, -291637952, -292377760, -295200096, -300228960, -308901024, -321814912, --338522336, -360246272, -386598592, -406292640, -400060640, -361901472, -311420032, -275072800, -260514992, }, +570192320, 581792000, 620967424, 671831104, 698598464, 681930752, 638787264, 598702848, 570998720, 549175488, +537884544, 553273408, 596125376, 644172096, 676342976, 689677824, 687518528, 667147456, 629091904, 587057088, +556523584, 538422976, 522272320, 501194752, 476544352, 450953856, 424396448, 396837248, 369501952, 342626720, +314877472, 285514944, 255454992, 226385584, 200594832, 181621824, 173160192, 176257408, 188260768, 205153952, +224390032, 244880784, 265123504, 282881056, 296865984, 307601248, 316306080, 323835712, 330969632, 338782720, +348169376, 359361536, 371913568, 384639008, 395740960, 403618464, 407422208, 406582528, 400576032, 389836992, +376057664, 360677408, 343627456, 324188960, 302208928, 277727072, 250390144, 220360816, 189325376, 159854384, +134133976, 113651280, 99327024, 91166048, 87985624, 87882544, 89001384, 90074056, 90682328, 91105920, +91786136, 93073016, 95422360, 99376952, 105186968, 112838456, 122489248, 134506560, 149102480, 166340320, +186418768, 209624464, 236110992, 265856336, 298457280, 332832576, 367526272, 401262144, 432677152, 459869664, +481246240, 496708128, 507029472, 512326784, 512221568, 507134720, 497961728, 484529216, 465722080, 441205344, +411850848, 378432800, 341078912, 300298208, 257615904, 214704880, 172351664, 130707128, 90312960, 52321828, +17476222, -14641544, -44763760, -72813120, -98525480, -122787208, -147041424, -171491072, -195217008, -217874032, +-239737024, -260137040, -277482816, -290973312, -301004192, -307948096, -311751808, -312641952, -311275072, -308364160, +-304645248, -300720736, -296806944, -293374176, -291637952, -292377760, -295200096, -300228960, -308901024, -321814912, +-338522336, -360246272, -386598592, -406292640, -400060640, -361901472, -311420032, -275072800, -260514992, }, }, }; const Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 12131672, -35005056, 50895364, 46826956, 15495705, -17832168, -13483513, 15928960, 5836324, -50508816, -50141060, -88496192, 286718048, 388669312, 358944384, 302016736, 293678048, 293919104, 242271056, 146592608, 40855876, --71729712, -186644240, -259896528, -249916624, -171891568, -77554224, 1320166, 66618164, 127185256, 179485616, -208453552, 196224176, 134799152, 35961760, -74894032, -176771184, -263083392, -337156544, -403115424, -459808448, --500517760, -520093152, -522885440, -520588160, -522769984, -533068800, -552091200, -577720320, -603377920, -621745344, --630650432, -632588544, -630336384, -625862080, -621228928, -617958272, -617169088, -621017920, -631350528, -647010496, --665534720, -686553728, -709830336, -731014144, -743064768, -741031616, -723115712, -689573120, -643782848, -592302272, --541145984, -493351616, -450879232, -415891872, -388977472, -368544160, -352527680, -338865952, -325068896, -309634400, --293009120, -275597312, -256625376, -236331120, -216784176, -199284864, -183619520, -170708304, -163045552, -161851008, --166402064, -176108688, -190615488, -208338128, -227175856, -245833728, -262890656, -276299552, -285124096, -289769632, --289952704, -284990944, -276000512, -264748768, -250791200, -232823200, -211744576, -189266864, -165182288, -139047424, --112483048, -87114824, -62633508, -38871600, -16938278, 3001645, 21852794, 39007968, 53010632, 64268280, -73474008, 78717624, 77876344, 71662064, 60654064, 42243152, 13946833, -23653996, -70185136, -127838624, --198167104, -280244992, -373098976, -476168544, -587304576, -703502208, -822057792, -938586688, -1047525888, -1146535040, --1235352832, -1310038016, -1365803904, -1404562176, -1430346496, -1440137984, -1430087168, -1404998656, -1369252736, -1317694336, --1246936960, -1155320960, -1014742400, -778383360, -456820768, -156443104, 11594801, 43531640, 16896938, }, +35005056, 50895364, 46826956, 15495705, -17832168, -13483513, 15928960, 5836324, -50508816, -50141060, +88496192, 286718048, 388669312, 358944384, 302016736, 293678048, 293919104, 242271056, 146592608, 40855876, +-71729712, -186644240, -259896528, -249916624, -171891568, -77554224, 1320166, 66618164, 127185256, 179485616, +208453552, 196224176, 134799152, 35961760, -74894032, -176771184, -263083392, -337156544, -403115424, -459808448, +-500517760, -520093152, -522885440, -520588160, -522769984, -533068800, -552091200, -577720320, -603377920, -621745344, +-630650432, -632588544, -630336384, -625862080, -621228928, -617958272, -617169088, -621017920, -631350528, -647010496, +-665534720, -686553728, -709830336, -731014144, -743064768, -741031616, -723115712, -689573120, -643782848, -592302272, +-541145984, -493351616, -450879232, -415891872, -388977472, -368544160, -352527680, -338865952, -325068896, -309634400, +-293009120, -275597312, -256625376, -236331120, -216784176, -199284864, -183619520, -170708304, -163045552, -161851008, +-166402064, -176108688, -190615488, -208338128, -227175856, -245833728, -262890656, -276299552, -285124096, -289769632, +-289952704, -284990944, -276000512, -264748768, -250791200, -232823200, -211744576, -189266864, -165182288, -139047424, +-112483048, -87114824, -62633508, -38871600, -16938278, 3001645, 21852794, 39007968, 53010632, 64268280, +73474008, 78717624, 77876344, 71662064, 60654064, 42243152, 13946833, -23653996, -70185136, -127838624, +-198167104, -280244992, -373098976, -476168544, -587304576, -703502208, -822057792, -938586688, -1047525888, -1146535040, +-1235352832, -1310038016, -1365803904, -1404562176, -1430346496, -1440137984, -1430087168, -1404998656, -1369252736, -1317694336, +-1246936960, -1155320960, -1014742400, -778383360, -456820768, -156443104, 11594801, 43531640, 16896938, }, { -43097848, --167190736, -326224256, -425162560, -429956832, -408348320, -396827072, -346930816, -240030688, -150563840, -149945360, --227132896, -334114080, -431730656, -465785984, -381590112, -200899776, -19745576, 100551624, 182485648, 254709808, -295795456, 288805952, 270257056, 281600608, 315289248, 346260256, 379019584, 424518848, 459280704, 448139584, -392080576, 318817024, 234920752, 120725624, -25675852, -167418368, -263528992, -308901024, -328545664, -343552832, --356583744, -364620160, -368800800, -368111456, -355156736, -324841248, -281055680, -230317088, -174271520, -112592032, --48478368, 13051869, 69172592, 118673168, 160411120, 194679056, 223423120, 247208656, 263940240, 271297504, -268223392, 253909872, 228279120, 194260832, 157282240, 121650120, 88867704, 59459528, 34444564, 14427332, --1388348, -14647449, -27005144, -40033392, -55187108, -73243152, -93707056, -114795888, -134174776, -150110720, --162281040, -171633328, -179525872, -186728528, -192521904, -194249024, -188014880, -170518784, -140609712, -99453728, --49912352, 3782256, 56306484, 102237400, 137370240, 159504352, 168786848, 167815648, 160851888, 152121840, -144768848, 141185776, 143204944, 151323504, 164478464, 180984560, 198637408, 213429808, 219464240, 211020336, -184103776, 136330848, 67433136, -19269370, -117235424, -219022400, -317232736, -403855232, -471103680, -513468160, --527698464, -511415712, -463756064, -387076960, -286395936, -167771088, -38606388, 91831232, 214368800, 322013568, -409529952, 472823296, 510125600, 522313120, 511061920, 477930016, 425322016, 356367392, 273709664, 180098720, -79737144, -22600654, -122727080, -215745328, -295460992, -356861856, -397155104, -413489376, -403401568, -368710048, --313911648, -239426704, -144517600, -42037528, 37808060, 69194608, 55704116, 26498874, 6231461, }, +-167190736, -326224256, -425162560, -429956832, -408348320, -396827072, -346930816, -240030688, -150563840, -149945360, +-227132896, -334114080, -431730656, -465785984, -381590112, -200899776, -19745576, 100551624, 182485648, 254709808, +295795456, 288805952, 270257056, 281600608, 315289248, 346260256, 379019584, 424518848, 459280704, 448139584, +392080576, 318817024, 234920752, 120725624, -25675852, -167418368, -263528992, -308901024, -328545664, -343552832, +-356583744, -364620160, -368800800, -368111456, -355156736, -324841248, -281055680, -230317088, -174271520, -112592032, +-48478368, 13051869, 69172592, 118673168, 160411120, 194679056, 223423120, 247208656, 263940240, 271297504, +268223392, 253909872, 228279120, 194260832, 157282240, 121650120, 88867704, 59459528, 34444564, 14427332, +-1388348, -14647449, -27005144, -40033392, -55187108, -73243152, -93707056, -114795888, -134174776, -150110720, +-162281040, -171633328, -179525872, -186728528, -192521904, -194249024, -188014880, -170518784, -140609712, -99453728, +-49912352, 3782256, 56306484, 102237400, 137370240, 159504352, 168786848, 167815648, 160851888, 152121840, +144768848, 141185776, 143204944, 151323504, 164478464, 180984560, 198637408, 213429808, 219464240, 211020336, +184103776, 136330848, 67433136, -19269370, -117235424, -219022400, -317232736, -403855232, -471103680, -513468160, +-527698464, -511415712, -463756064, -387076960, -286395936, -167771088, -38606388, 91831232, 214368800, 322013568, +409529952, 472823296, 510125600, 522313120, 511061920, 477930016, 425322016, 356367392, 273709664, 180098720, +79737144, -22600654, -122727080, -215745328, -295460992, -356861856, -397155104, -413489376, -403401568, -368710048, +-313911648, -239426704, -144517600, -42037528, 37808060, 69194608, 55704116, 26498874, 6231461, }, }, { { -43097848, --167190736, -326224256, -425162560, -429956832, -408348320, -396827072, -346930816, -240030688, -150563840, -149945360, --227132896, -334114080, -431730656, -465785984, -381590112, -200899776, -19745576, 100551624, 182485648, 254709808, -295795456, 288805952, 270257056, 281600608, 315289248, 346260256, 379019584, 424518848, 459280704, 448139584, -392080576, 318817024, 234920752, 120725624, -25675852, -167418368, -263528992, -308901024, -328545664, -343552832, --356583744, -364620160, -368800800, -368111456, -355156736, -324841248, -281055680, -230317088, -174271520, -112592032, --48478368, 13051869, 69172592, 118673168, 160411120, 194679056, 223423120, 247208656, 263940240, 271297504, -268223392, 253909872, 228279120, 194260832, 157282240, 121650120, 88867704, 59459528, 34444564, 14427332, --1388348, -14647449, -27005144, -40033392, -55187108, -73243152, -93707056, -114795888, -134174776, -150110720, --162281040, -171633328, -179525872, -186728528, -192521904, -194249024, -188014880, -170518784, -140609712, -99453728, --49912352, 3782256, 56306484, 102237400, 137370240, 159504352, 168786848, 167815648, 160851888, 152121840, -144768848, 141185776, 143204944, 151323504, 164478464, 180984560, 198637408, 213429808, 219464240, 211020336, -184103776, 136330848, 67433136, -19269370, -117235424, -219022400, -317232736, -403855232, -471103680, -513468160, --527698464, -511415712, -463756064, -387076960, -286395936, -167771088, -38606388, 91831232, 214368800, 322013568, -409529952, 472823296, 510125600, 522313120, 511061920, 477930016, 425322016, 356367392, 273709664, 180098720, -79737144, -22600654, -122727080, -215745328, -295460992, -356861856, -397155104, -413489376, -403401568, -368710048, --313911648, -239426704, -144517600, -42037528, 37808060, 69194608, 55704116, 26498874, 6231461, }, +-167190736, -326224256, -425162560, -429956832, -408348320, -396827072, -346930816, -240030688, -150563840, -149945360, +-227132896, -334114080, -431730656, -465785984, -381590112, -200899776, -19745576, 100551624, 182485648, 254709808, +295795456, 288805952, 270257056, 281600608, 315289248, 346260256, 379019584, 424518848, 459280704, 448139584, +392080576, 318817024, 234920752, 120725624, -25675852, -167418368, -263528992, -308901024, -328545664, -343552832, +-356583744, -364620160, -368800800, -368111456, -355156736, -324841248, -281055680, -230317088, -174271520, -112592032, +-48478368, 13051869, 69172592, 118673168, 160411120, 194679056, 223423120, 247208656, 263940240, 271297504, +268223392, 253909872, 228279120, 194260832, 157282240, 121650120, 88867704, 59459528, 34444564, 14427332, +-1388348, -14647449, -27005144, -40033392, -55187108, -73243152, -93707056, -114795888, -134174776, -150110720, +-162281040, -171633328, -179525872, -186728528, -192521904, -194249024, -188014880, -170518784, -140609712, -99453728, +-49912352, 3782256, 56306484, 102237400, 137370240, 159504352, 168786848, 167815648, 160851888, 152121840, +144768848, 141185776, 143204944, 151323504, 164478464, 180984560, 198637408, 213429808, 219464240, 211020336, +184103776, 136330848, 67433136, -19269370, -117235424, -219022400, -317232736, -403855232, -471103680, -513468160, +-527698464, -511415712, -463756064, -387076960, -286395936, -167771088, -38606388, 91831232, 214368800, 322013568, +409529952, 472823296, 510125600, 522313120, 511061920, 477930016, 425322016, 356367392, 273709664, 180098720, +79737144, -22600654, -122727080, -215745328, -295460992, -356861856, -397155104, -413489376, -403401568, -368710048, +-313911648, -239426704, -144517600, -42037528, 37808060, 69194608, 55704116, 26498874, 6231461, }, { 12131672, -35005056, 50895364, 46826956, 15495705, -17832168, -13483513, 15928960, 5836324, -50508816, -50141060, -88496192, 286718048, 388669312, 358944384, 302016736, 293678048, 293919104, 242271056, 146592608, 40855876, --71729712, -186644240, -259896528, -249916624, -171891568, -77554224, 1320166, 66618164, 127185256, 179485616, -208453552, 196224176, 134799152, 35961760, -74894032, -176771184, -263083392, -337156544, -403115424, -459808448, --500517760, -520093152, -522885440, -520588160, -522769984, -533068800, -552091200, -577720320, -603377920, -621745344, --630650432, -632588544, -630336384, -625862080, -621228928, -617958272, -617169088, -621017920, -631350528, -647010496, --665534720, -686553728, -709830336, -731014144, -743064768, -741031616, -723115712, -689573120, -643782848, -592302272, --541145984, -493351616, -450879232, -415891872, -388977472, -368544160, -352527680, -338865952, -325068896, -309634400, --293009120, -275597312, -256625376, -236331120, -216784176, -199284864, -183619520, -170708304, -163045552, -161851008, --166402064, -176108688, -190615488, -208338128, -227175856, -245833728, -262890656, -276299552, -285124096, -289769632, --289952704, -284990944, -276000512, -264748768, -250791200, -232823200, -211744576, -189266864, -165182288, -139047424, --112483048, -87114824, -62633508, -38871600, -16938278, 3001645, 21852794, 39007968, 53010632, 64268280, -73474008, 78717624, 77876344, 71662064, 60654064, 42243152, 13946833, -23653996, -70185136, -127838624, --198167104, -280244992, -373098976, -476168544, -587304576, -703502208, -822057792, -938586688, -1047525888, -1146535040, --1235352832, -1310038016, -1365803904, -1404562176, -1430346496, -1440137984, -1430087168, -1404998656, -1369252736, -1317694336, --1246936960, -1155320960, -1014742400, -778383360, -456820768, -156443104, 11594801, 43531640, 16896938, }, +35005056, 50895364, 46826956, 15495705, -17832168, -13483513, 15928960, 5836324, -50508816, -50141060, +88496192, 286718048, 388669312, 358944384, 302016736, 293678048, 293919104, 242271056, 146592608, 40855876, +-71729712, -186644240, -259896528, -249916624, -171891568, -77554224, 1320166, 66618164, 127185256, 179485616, +208453552, 196224176, 134799152, 35961760, -74894032, -176771184, -263083392, -337156544, -403115424, -459808448, +-500517760, -520093152, -522885440, -520588160, -522769984, -533068800, -552091200, -577720320, -603377920, -621745344, +-630650432, -632588544, -630336384, -625862080, -621228928, -617958272, -617169088, -621017920, -631350528, -647010496, +-665534720, -686553728, -709830336, -731014144, -743064768, -741031616, -723115712, -689573120, -643782848, -592302272, +-541145984, -493351616, -450879232, -415891872, -388977472, -368544160, -352527680, -338865952, -325068896, -309634400, +-293009120, -275597312, -256625376, -236331120, -216784176, -199284864, -183619520, -170708304, -163045552, -161851008, +-166402064, -176108688, -190615488, -208338128, -227175856, -245833728, -262890656, -276299552, -285124096, -289769632, +-289952704, -284990944, -276000512, -264748768, -250791200, -232823200, -211744576, -189266864, -165182288, -139047424, +-112483048, -87114824, -62633508, -38871600, -16938278, 3001645, 21852794, 39007968, 53010632, 64268280, +73474008, 78717624, 77876344, 71662064, 60654064, 42243152, 13946833, -23653996, -70185136, -127838624, +-198167104, -280244992, -373098976, -476168544, -587304576, -703502208, -822057792, -938586688, -1047525888, -1146535040, +-1235352832, -1310038016, -1365803904, -1404562176, -1430346496, -1440137984, -1430087168, -1404998656, -1369252736, -1317694336, +-1246936960, -1155320960, -1014742400, -778383360, -456820768, -156443104, 11594801, 43531640, 16896938, }, }, { { 11454678, -12261595, -39353712, -116605680, -133135400, -55874840, 7644505, -60422136, -185013776, -157663952, 74794168, -310658208, 345424896, 217707056, 119653496, 139996064, 194340288, 171745536, 57756572, -85087064, -191056256, --229774848, -209300736, -159948336, -106610752, -55478092, -8877161, 19633906, 13015898, -35591320, -120874336, --226771056, -328624576, -406721600, -460766784, -501388032, -528194528, -528187552, -496168032, -445522848, -397478816, --367953056, -363930304, -382863040, -413397056, -442821856, -466120992, -485803200, -504309152, -519663648, -527787584, --526773440, -518840640, -508476896, -498442752, -488485952, -478252128, -468951360, -460622880, -450411616, -435866688, --418123104, -399991392, -382464704, -364528384, -345181152, -324685024, -304454656, -285758144, -268155744, -250039568, --231118640, -213047024, -197261408, -183846608, -172690432, -163833680, -156576256, -150111792, -144944944, -142063552, --141222816, -141463872, -142488224, -144411840, -147390928, -152274848, -160152352, -170881184, -183707024, -199021264, --217329648, -236966224, -254967520, -269355104, -278557632, -280236960, -273142208, -258744944, -239172240, -215200944, --187614368, -158353840, -129102960, -100698728, -74394736, -51687248, -33260226, -20282446, -15713675, -22118544, --39787504, -68913288, -111002896, -165992976, -230904960, -303376640, -383343552, -469707840, -559023808, -649028096, --740035776, -831807936, -922267968, -1009758080, -1093606016, -1172373632, -1243722624, -1305461760, -1355644672, -1393273984, --1419281024, -1434560384, -1437935232, -1429216384, -1412040832, -1389403136, -1359531648, -1320978944, -1277201920, -1230462976, --1176829568, -1113237248, -1042787456, -967061824, -881342848, -783402048, -677669056, -565563968, -442997952, -311154816, --174498080, -24946244, 148259056, 319944992, 423110656, 406406976, 290862688, 151469008, 43244952, }, +12261595, -39353712, -116605680, -133135400, -55874840, 7644505, -60422136, -185013776, -157663952, 74794168, +310658208, 345424896, 217707056, 119653496, 139996064, 194340288, 171745536, 57756572, -85087064, -191056256, +-229774848, -209300736, -159948336, -106610752, -55478092, -8877161, 19633906, 13015898, -35591320, -120874336, +-226771056, -328624576, -406721600, -460766784, -501388032, -528194528, -528187552, -496168032, -445522848, -397478816, +-367953056, -363930304, -382863040, -413397056, -442821856, -466120992, -485803200, -504309152, -519663648, -527787584, +-526773440, -518840640, -508476896, -498442752, -488485952, -478252128, -468951360, -460622880, -450411616, -435866688, +-418123104, -399991392, -382464704, -364528384, -345181152, -324685024, -304454656, -285758144, -268155744, -250039568, +-231118640, -213047024, -197261408, -183846608, -172690432, -163833680, -156576256, -150111792, -144944944, -142063552, +-141222816, -141463872, -142488224, -144411840, -147390928, -152274848, -160152352, -170881184, -183707024, -199021264, +-217329648, -236966224, -254967520, -269355104, -278557632, -280236960, -273142208, -258744944, -239172240, -215200944, +-187614368, -158353840, -129102960, -100698728, -74394736, -51687248, -33260226, -20282446, -15713675, -22118544, +-39787504, -68913288, -111002896, -165992976, -230904960, -303376640, -383343552, -469707840, -559023808, -649028096, +-740035776, -831807936, -922267968, -1009758080, -1093606016, -1172373632, -1243722624, -1305461760, -1355644672, -1393273984, +-1419281024, -1434560384, -1437935232, -1429216384, -1412040832, -1389403136, -1359531648, -1320978944, -1277201920, -1230462976, +-1176829568, -1113237248, -1042787456, -967061824, -881342848, -783402048, -677669056, -565563968, -442997952, -311154816, +-174498080, -24946244, 148259056, 319944992, 423110656, 406406976, 290862688, 151469008, 43244952, }, { 11454678, -12261595, -39353712, -116605680, -133135400, -55874840, 7644505, -60422136, -185013776, -157663952, 74794168, -310658208, 345424896, 217707056, 119653496, 139996064, 194340288, 171745536, 57756572, -85087064, -191056256, --229774848, -209300736, -159948336, -106610752, -55478092, -8877161, 19633906, 13015898, -35591320, -120874336, --226771056, -328624576, -406721600, -460766784, -501388032, -528194528, -528187552, -496168032, -445522848, -397478816, --367953056, -363930304, -382863040, -413397056, -442821856, -466120992, -485803200, -504309152, -519663648, -527787584, --526773440, -518840640, -508476896, -498442752, -488485952, -478252128, -468951360, -460622880, -450411616, -435866688, --418123104, -399991392, -382464704, -364528384, -345181152, -324685024, -304454656, -285758144, -268155744, -250039568, --231118640, -213047024, -197261408, -183846608, -172690432, -163833680, -156576256, -150111792, -144944944, -142063552, --141222816, -141463872, -142488224, -144411840, -147390928, -152274848, -160152352, -170881184, -183707024, -199021264, --217329648, -236966224, -254967520, -269355104, -278557632, -280236960, -273142208, -258744944, -239172240, -215200944, --187614368, -158353840, -129102960, -100698728, -74394736, -51687248, -33260226, -20282446, -15713675, -22118544, --39787504, -68913288, -111002896, -165992976, -230904960, -303376640, -383343552, -469707840, -559023808, -649028096, --740035776, -831807936, -922267968, -1009758080, -1093606016, -1172373632, -1243722624, -1305461760, -1355644672, -1393273984, --1419281024, -1434560384, -1437935232, -1429216384, -1412040832, -1389403136, -1359531648, -1320978944, -1277201920, -1230462976, --1176829568, -1113237248, -1042787456, -967061824, -881342848, -783402048, -677669056, -565563968, -442997952, -311154816, --174498080, -24946244, 148259056, 319944992, 423110656, 406406976, 290862688, 151469008, 43244952, }, +12261595, -39353712, -116605680, -133135400, -55874840, 7644505, -60422136, -185013776, -157663952, 74794168, +310658208, 345424896, 217707056, 119653496, 139996064, 194340288, 171745536, 57756572, -85087064, -191056256, +-229774848, -209300736, -159948336, -106610752, -55478092, -8877161, 19633906, 13015898, -35591320, -120874336, +-226771056, -328624576, -406721600, -460766784, -501388032, -528194528, -528187552, -496168032, -445522848, -397478816, +-367953056, -363930304, -382863040, -413397056, -442821856, -466120992, -485803200, -504309152, -519663648, -527787584, +-526773440, -518840640, -508476896, -498442752, -488485952, -478252128, -468951360, -460622880, -450411616, -435866688, +-418123104, -399991392, -382464704, -364528384, -345181152, -324685024, -304454656, -285758144, -268155744, -250039568, +-231118640, -213047024, -197261408, -183846608, -172690432, -163833680, -156576256, -150111792, -144944944, -142063552, +-141222816, -141463872, -142488224, -144411840, -147390928, -152274848, -160152352, -170881184, -183707024, -199021264, +-217329648, -236966224, -254967520, -269355104, -278557632, -280236960, -273142208, -258744944, -239172240, -215200944, +-187614368, -158353840, -129102960, -100698728, -74394736, -51687248, -33260226, -20282446, -15713675, -22118544, +-39787504, -68913288, -111002896, -165992976, -230904960, -303376640, -383343552, -469707840, -559023808, -649028096, +-740035776, -831807936, -922267968, -1009758080, -1093606016, -1172373632, -1243722624, -1305461760, -1355644672, -1393273984, +-1419281024, -1434560384, -1437935232, -1429216384, -1412040832, -1389403136, -1359531648, -1320978944, -1277201920, -1230462976, +-1176829568, -1113237248, -1042787456, -967061824, -881342848, -783402048, -677669056, -565563968, -442997952, -311154816, +-174498080, -24946244, 148259056, 319944992, 423110656, 406406976, 290862688, 151469008, 43244952, }, }, { { 6452115, -35748088, 81947440, 111170400, 112590960, 95807832, 45698988, -49475340, -142197248, -175787648, -175914352, --212588528, -284941024, -327417184, -321428896, -315450304, -334580096, -350572416, -347663104, -345804448, -348785152, --331687424, -290392416, -252080752, -230411568, -215081232, -206860656, -219282240, -243322240, -249385136, -227857136, --196457168, -167259456, -134793792, -96642136, -60622928, -30261266, -2485712, 19939922, 28740848, 22386980, -7348152, -10490994, -27394912, -38426000, -40039832, -33959232, -24671902, -16234440, -13515188, -22138946, --44678936, -79402672, -122788280, -170272368, -215612720, -253478768, -282667904, -304536256, -319520320, -327285632, --328484992, -323923200, -313150912, -295553344, -271757088, -242979184, -210247232, -174942608, -138919104, -103535016, --69322920, -36527624, -5060009, 25834766, 56970056, 88406536, 119745296, 150757104, 181040928, 209296448, -233433616, 251415568, 261826032, 263540272, 254881072, 233442752, 197032704, 144379616, 74620760, -12745852, --116058608, -230334800, -349448192, -468957824, -585466304, -694418368, -791117952, -873665600, -942570304, -997656448, --1037813376, -1063725952, -1077990144, -1081780992, -1073710656, -1052800640, -1020519104, -979087168, -929881920, -874748480, --817228096, -760950080, -707549696, -657069312, -609664704, -566065984, -526812640, -491839264, -460903136, -434124032, --411802528, -393564512, -378035520, -363857280, -350761376, -339089824, -328770080, -319691072, -312706368, -309211872, --309946304, -314980544, -324437536, -338422496, -356629920, -378493984, -403220672, -429656704, -456929760, -484799808, --512288128, -536868768, -556423232, -570509632, -578120320, -576579520, -564771584, -544449920, -516401088, -479406944, --433754656, -377739680, -299510080, -187618672, -59096064, 38548944, 70563088, 50473380, 16210817, }, +35748088, 81947440, 111170400, 112590960, 95807832, 45698988, -49475340, -142197248, -175787648, -175914352, +-212588528, -284941024, -327417184, -321428896, -315450304, -334580096, -350572416, -347663104, -345804448, -348785152, +-331687424, -290392416, -252080752, -230411568, -215081232, -206860656, -219282240, -243322240, -249385136, -227857136, +-196457168, -167259456, -134793792, -96642136, -60622928, -30261266, -2485712, 19939922, 28740848, 22386980, +7348152, -10490994, -27394912, -38426000, -40039832, -33959232, -24671902, -16234440, -13515188, -22138946, +-44678936, -79402672, -122788280, -170272368, -215612720, -253478768, -282667904, -304536256, -319520320, -327285632, +-328484992, -323923200, -313150912, -295553344, -271757088, -242979184, -210247232, -174942608, -138919104, -103535016, +-69322920, -36527624, -5060009, 25834766, 56970056, 88406536, 119745296, 150757104, 181040928, 209296448, +233433616, 251415568, 261826032, 263540272, 254881072, 233442752, 197032704, 144379616, 74620760, -12745852, +-116058608, -230334800, -349448192, -468957824, -585466304, -694418368, -791117952, -873665600, -942570304, -997656448, +-1037813376, -1063725952, -1077990144, -1081780992, -1073710656, -1052800640, -1020519104, -979087168, -929881920, -874748480, +-817228096, -760950080, -707549696, -657069312, -609664704, -566065984, -526812640, -491839264, -460903136, -434124032, +-411802528, -393564512, -378035520, -363857280, -350761376, -339089824, -328770080, -319691072, -312706368, -309211872, +-309946304, -314980544, -324437536, -338422496, -356629920, -378493984, -403220672, -429656704, -456929760, -484799808, +-512288128, -536868768, -556423232, -570509632, -578120320, -576579520, -564771584, -544449920, -516401088, -479406944, +-433754656, -377739680, -299510080, -187618672, -59096064, 38548944, 70563088, 50473380, 16210817, }, { -91094112, --257185328, -369219552, -400231904, -368597312, -319030176, -265365632, -188064272, -89778240, -9618042, 29767344, -50299436, 77788304, 108185392, 133609456, 170060848, 232147808, 298606528, 326328928, 290251200, 197411728, -73894912, -49488224, -148460912, -214930368, -253069136, -264243568, -244646704, -199322448, -146183504, -100346544, --62887448, -28630788, 4166655, 36424544, 71994392, 112148040, 150237424, 175736096, 181046832, 163393984, -124688808, 72319736, 17476222, -29621852, -62667868, -78985520, -79509512, -69334192, -55685324, -44018584, --36340256, -32390496, -30926448, -30215632, -28802050, -26255672, -22972170, -19587198, -16735877, -14687178, --12751221, -9342628, -2680597, 8824010, 26312044, 49444200, 75296680, 98773512, 114386256, 117836720, -106908176, 82078432, 46528456, 4988068, -37868188, -78277392, -113383376, -140904992, -158653408, -164096736, --154611840, -128592392, -86696064, -32510218, 27528592, 85105312, 131944080, 161925632, 172267920, 163461088, -138537392, 102168144, 59701120, 16331613, -23400056, -55914568, -78863656, -91271280, -93489624, -87109456, --74745312, -59459528, -43966508, -30130806, -18906446, -10429791, -4144644, 904091, 5722507, 11215770, -18139794, 26915486, 37363532, 48592188, 59057948, 66765268, 69696584, 66389992, 56364468, 40188008, -19323058, -4177930, -28086402, -50346680, -69186552, -83109768, -90938952, -91835528, -85273352, -71162776, --50123880, -23640036, 6007049, 35852240, 62478352, 82614768, 93869728, 95155536, 86802360, 70564168, -49274012, 26030186, 3476239, -16371878, -32184874, -43548284, -50790672, -54296976, -54269060, -51174000, --45562624, -37070400, -24777130, -9773735, 3378529, 9642202, 8386461, 3991098, 887448, }, +-257185328, -369219552, -400231904, -368597312, -319030176, -265365632, -188064272, -89778240, -9618042, 29767344, +50299436, 77788304, 108185392, 133609456, 170060848, 232147808, 298606528, 326328928, 290251200, 197411728, +73894912, -49488224, -148460912, -214930368, -253069136, -264243568, -244646704, -199322448, -146183504, -100346544, +-62887448, -28630788, 4166655, 36424544, 71994392, 112148040, 150237424, 175736096, 181046832, 163393984, +124688808, 72319736, 17476222, -29621852, -62667868, -78985520, -79509512, -69334192, -55685324, -44018584, +-36340256, -32390496, -30926448, -30215632, -28802050, -26255672, -22972170, -19587198, -16735877, -14687178, +-12751221, -9342628, -2680597, 8824010, 26312044, 49444200, 75296680, 98773512, 114386256, 117836720, +106908176, 82078432, 46528456, 4988068, -37868188, -78277392, -113383376, -140904992, -158653408, -164096736, +-154611840, -128592392, -86696064, -32510218, 27528592, 85105312, 131944080, 161925632, 172267920, 163461088, +138537392, 102168144, 59701120, 16331613, -23400056, -55914568, -78863656, -91271280, -93489624, -87109456, +-74745312, -59459528, -43966508, -30130806, -18906446, -10429791, -4144644, 904091, 5722507, 11215770, +18139794, 26915486, 37363532, 48592188, 59057948, 66765268, 69696584, 66389992, 56364468, 40188008, +19323058, -4177930, -28086402, -50346680, -69186552, -83109768, -90938952, -91835528, -85273352, -71162776, +-50123880, -23640036, 6007049, 35852240, 62478352, 82614768, 93869728, 95155536, 86802360, 70564168, +49274012, 26030186, 3476239, -16371878, -32184874, -43548284, -50790672, -54296976, -54269060, -51174000, +-45562624, -37070400, -24777130, -9773735, 3378529, 9642202, 8386461, 3991098, 887448, }, }, { { -91094112, --257185328, -369219552, -400231904, -368597312, -319030176, -265365632, -188064272, -89778240, -9618042, 29767344, -50299436, 77788304, 108185392, 133609456, 170060848, 232147808, 298606528, 326328928, 290251200, 197411728, -73894912, -49488224, -148460912, -214930368, -253069136, -264243568, -244646704, -199322448, -146183504, -100346544, --62887448, -28630788, 4166655, 36424544, 71994392, 112148040, 150237424, 175736096, 181046832, 163393984, -124688808, 72319736, 17476222, -29621852, -62667868, -78985520, -79509512, -69334192, -55685324, -44018584, --36340256, -32390496, -30926448, -30215632, -28802050, -26255672, -22972170, -19587198, -16735877, -14687178, --12751221, -9342628, -2680597, 8824010, 26312044, 49444200, 75296680, 98773512, 114386256, 117836720, -106908176, 82078432, 46528456, 4988068, -37868188, -78277392, -113383376, -140904992, -158653408, -164096736, --154611840, -128592392, -86696064, -32510218, 27528592, 85105312, 131944080, 161925632, 172267920, 163461088, -138537392, 102168144, 59701120, 16331613, -23400056, -55914568, -78863656, -91271280, -93489624, -87109456, --74745312, -59459528, -43966508, -30130806, -18906446, -10429791, -4144644, 904091, 5722507, 11215770, -18139794, 26915486, 37363532, 48592188, 59057948, 66765268, 69696584, 66389992, 56364468, 40188008, -19323058, -4177930, -28086402, -50346680, -69186552, -83109768, -90938952, -91835528, -85273352, -71162776, --50123880, -23640036, 6007049, 35852240, 62478352, 82614768, 93869728, 95155536, 86802360, 70564168, -49274012, 26030186, 3476239, -16371878, -32184874, -43548284, -50790672, -54296976, -54269060, -51174000, --45562624, -37070400, -24777130, -9773735, 3378529, 9642202, 8386461, 3991098, 887448, }, +-257185328, -369219552, -400231904, -368597312, -319030176, -265365632, -188064272, -89778240, -9618042, 29767344, +50299436, 77788304, 108185392, 133609456, 170060848, 232147808, 298606528, 326328928, 290251200, 197411728, +73894912, -49488224, -148460912, -214930368, -253069136, -264243568, -244646704, -199322448, -146183504, -100346544, +-62887448, -28630788, 4166655, 36424544, 71994392, 112148040, 150237424, 175736096, 181046832, 163393984, +124688808, 72319736, 17476222, -29621852, -62667868, -78985520, -79509512, -69334192, -55685324, -44018584, +-36340256, -32390496, -30926448, -30215632, -28802050, -26255672, -22972170, -19587198, -16735877, -14687178, +-12751221, -9342628, -2680597, 8824010, 26312044, 49444200, 75296680, 98773512, 114386256, 117836720, +106908176, 82078432, 46528456, 4988068, -37868188, -78277392, -113383376, -140904992, -158653408, -164096736, +-154611840, -128592392, -86696064, -32510218, 27528592, 85105312, 131944080, 161925632, 172267920, 163461088, +138537392, 102168144, 59701120, 16331613, -23400056, -55914568, -78863656, -91271280, -93489624, -87109456, +-74745312, -59459528, -43966508, -30130806, -18906446, -10429791, -4144644, 904091, 5722507, 11215770, +18139794, 26915486, 37363532, 48592188, 59057948, 66765268, 69696584, 66389992, 56364468, 40188008, +19323058, -4177930, -28086402, -50346680, -69186552, -83109768, -90938952, -91835528, -85273352, -71162776, +-50123880, -23640036, 6007049, 35852240, 62478352, 82614768, 93869728, 95155536, 86802360, 70564168, +49274012, 26030186, 3476239, -16371878, -32184874, -43548284, -50790672, -54296976, -54269060, -51174000, +-45562624, -37070400, -24777130, -9773735, 3378529, 9642202, 8386461, 3991098, 887448, }, { 6452115, -35748088, 81947440, 111170400, 112590960, 95807832, 45698988, -49475340, -142197248, -175787648, -175914352, --212588528, -284941024, -327417184, -321428896, -315450304, -334580096, -350572416, -347663104, -345804448, -348785152, --331687424, -290392416, -252080752, -230411568, -215081232, -206860656, -219282240, -243322240, -249385136, -227857136, --196457168, -167259456, -134793792, -96642136, -60622928, -30261266, -2485712, 19939922, 28740848, 22386980, -7348152, -10490994, -27394912, -38426000, -40039832, -33959232, -24671902, -16234440, -13515188, -22138946, --44678936, -79402672, -122788280, -170272368, -215612720, -253478768, -282667904, -304536256, -319520320, -327285632, --328484992, -323923200, -313150912, -295553344, -271757088, -242979184, -210247232, -174942608, -138919104, -103535016, --69322920, -36527624, -5060009, 25834766, 56970056, 88406536, 119745296, 150757104, 181040928, 209296448, -233433616, 251415568, 261826032, 263540272, 254881072, 233442752, 197032704, 144379616, 74620760, -12745852, --116058608, -230334800, -349448192, -468957824, -585466304, -694418368, -791117952, -873665600, -942570304, -997656448, --1037813376, -1063725952, -1077990144, -1081780992, -1073710656, -1052800640, -1020519104, -979087168, -929881920, -874748480, --817228096, -760950080, -707549696, -657069312, -609664704, -566065984, -526812640, -491839264, -460903136, -434124032, --411802528, -393564512, -378035520, -363857280, -350761376, -339089824, -328770080, -319691072, -312706368, -309211872, --309946304, -314980544, -324437536, -338422496, -356629920, -378493984, -403220672, -429656704, -456929760, -484799808, --512288128, -536868768, -556423232, -570509632, -578120320, -576579520, -564771584, -544449920, -516401088, -479406944, --433754656, -377739680, -299510080, -187618672, -59096064, 38548944, 70563088, 50473380, 16210817, }, +35748088, 81947440, 111170400, 112590960, 95807832, 45698988, -49475340, -142197248, -175787648, -175914352, +-212588528, -284941024, -327417184, -321428896, -315450304, -334580096, -350572416, -347663104, -345804448, -348785152, +-331687424, -290392416, -252080752, -230411568, -215081232, -206860656, -219282240, -243322240, -249385136, -227857136, +-196457168, -167259456, -134793792, -96642136, -60622928, -30261266, -2485712, 19939922, 28740848, 22386980, +7348152, -10490994, -27394912, -38426000, -40039832, -33959232, -24671902, -16234440, -13515188, -22138946, +-44678936, -79402672, -122788280, -170272368, -215612720, -253478768, -282667904, -304536256, -319520320, -327285632, +-328484992, -323923200, -313150912, -295553344, -271757088, -242979184, -210247232, -174942608, -138919104, -103535016, +-69322920, -36527624, -5060009, 25834766, 56970056, 88406536, 119745296, 150757104, 181040928, 209296448, +233433616, 251415568, 261826032, 263540272, 254881072, 233442752, 197032704, 144379616, 74620760, -12745852, +-116058608, -230334800, -349448192, -468957824, -585466304, -694418368, -791117952, -873665600, -942570304, -997656448, +-1037813376, -1063725952, -1077990144, -1081780992, -1073710656, -1052800640, -1020519104, -979087168, -929881920, -874748480, +-817228096, -760950080, -707549696, -657069312, -609664704, -566065984, -526812640, -491839264, -460903136, -434124032, +-411802528, -393564512, -378035520, -363857280, -350761376, -339089824, -328770080, -319691072, -312706368, -309211872, +-309946304, -314980544, -324437536, -338422496, -356629920, -378493984, -403220672, -429656704, -456929760, -484799808, +-512288128, -536868768, -556423232, -570509632, -578120320, -576579520, -564771584, -544449920, -516401088, -479406944, +-433754656, -377739680, -299510080, -187618672, -59096064, 38548944, 70563088, 50473380, 16210817, }, }, { { 7919920, -43446816, 104918000, 148874304, 138170704, 83917216, 15482820, -60879012, -143749872, -202633328, -207747568, --184090896, -187100592, -222344016, -238450672, -210530704, -179610704, -185786864, -208447648, -206863872, -183740304, --169309760, -167556336, -157913056, -136191808, -118551832, -110594336, -100373920, -80657336, -58070644, -40783400, --30984968, -27802934, -27360016, -22086870, -7280507, 13779329, 34718904, 51856900, 62892280, 65432752, -59639916, 48164300, 32096290, 10749229, -14424648, -39697844, -62912144, -84523880, -105623448, -127484832, --151991920, -180360704, -212206816, -246526288, -282065536, -316742560, -348788928, -378200864, -405123872, -427867872, --444754592, -456467520, -464216160, -467251648, -464473856, -456580256, -444310624, -426387168, -401278272, -369414976, --332223776, -290739744, -246373280, -201346464, -157460480, -115644144, -76794016, -41654740, -10200547, 17439714, -40042516, 56556128, 67292472, 72427104, 70361224, 58948428, 37329172, 5191005, -38839928, -96605088, --168503920, -253121216, -348580608, -453376224, -565388928, -680615424, -794080960, -902358144, -1003945408, -1096694144, --1176855936, -1242011136, -1292803968, -1329907584, -1351437184, -1355673728, -1344186752, -1319600768, -1282316672, -1232374784, --1172863232, -1108547200, -1042297856, -975305984, -909583872, -847816320, -791289216, -739690560, -692638656, -650415360, --613473280, -581705536, -554161920, -529680608, -507825120, -488477376, -470631776, -452970336, -435749120, -420651776, --408776736, -400292032, -395874112, -396789472, -403652832, -416310656, -434459040, -457537504, -484837376, -515965696, --549921728, -584192320, -616537216, -646397952, -672314304, -690305408, -697493568, -693863232, -677921920, -645913664, --596482880, -525728160, -416760544, -255793760, -71349608, 65669512, 106195216, 73027328, 22857816, }, +43446816, 104918000, 148874304, 138170704, 83917216, 15482820, -60879012, -143749872, -202633328, -207747568, +-184090896, -187100592, -222344016, -238450672, -210530704, -179610704, -185786864, -208447648, -206863872, -183740304, +-169309760, -167556336, -157913056, -136191808, -118551832, -110594336, -100373920, -80657336, -58070644, -40783400, +-30984968, -27802934, -27360016, -22086870, -7280507, 13779329, 34718904, 51856900, 62892280, 65432752, +59639916, 48164300, 32096290, 10749229, -14424648, -39697844, -62912144, -84523880, -105623448, -127484832, +-151991920, -180360704, -212206816, -246526288, -282065536, -316742560, -348788928, -378200864, -405123872, -427867872, +-444754592, -456467520, -464216160, -467251648, -464473856, -456580256, -444310624, -426387168, -401278272, -369414976, +-332223776, -290739744, -246373280, -201346464, -157460480, -115644144, -76794016, -41654740, -10200547, 17439714, +40042516, 56556128, 67292472, 72427104, 70361224, 58948428, 37329172, 5191005, -38839928, -96605088, +-168503920, -253121216, -348580608, -453376224, -565388928, -680615424, -794080960, -902358144, -1003945408, -1096694144, +-1176855936, -1242011136, -1292803968, -1329907584, -1351437184, -1355673728, -1344186752, -1319600768, -1282316672, -1232374784, +-1172863232, -1108547200, -1042297856, -975305984, -909583872, -847816320, -791289216, -739690560, -692638656, -650415360, +-613473280, -581705536, -554161920, -529680608, -507825120, -488477376, -470631776, -452970336, -435749120, -420651776, +-408776736, -400292032, -395874112, -396789472, -403652832, -416310656, -434459040, -457537504, -484837376, -515965696, +-549921728, -584192320, -616537216, -646397952, -672314304, -690305408, -697493568, -693863232, -677921920, -645913664, +-596482880, -525728160, -416760544, -255793760, -71349608, 65669512, 106195216, 73027328, 22857816, }, { -121877216, --327947584, -439449792, -444051840, -368772320, -245394560, -86295016, 97210144, 264148544, 356093600, 346553920, -263942928, 159240208, 62202400, -24676198, -102194448, -160061088, -186785440, -183974928, -163762272, -133193376, --87690344, -23799488, 46799036, 103836200, 137122192, 150417808, 147615344, 125519880, 83253648, 29818348, --22703198, -67650568, -102025336, -122039352, -124650152, -110064976, -80442592, -39573828, 4927938, 43437152, -70527656, 86892560, 94581624, 93367224, 82184200, 61012156, 30724586, -6254010, -44463112, -76524504, --96368328, -100777648, -89137752, -63811404, -30434138, 3992709, 33851860, 55915104, 69026032, 73909408, -72473816, 66124244, 54713052, 37222872, 12999792, -17475686, -51810192, -84977000, -109717088, -118276424, --104702176, -67335960, -11045045, 52493628, 107759656, 140545824, 142772768, 115008488, 65794068, 8034810, --45649060, -86090472, -108358800, -111161808, -95987688, -66394288, -27647242, 13440563, 49265424, 73232952, -81687592, 74739944, 55793236, 30321932, 4263292, -17572322, -32429150, -39607116, -39949640, -35240208, --27561342, -18732500, -10036265, -2222109, 4449049, 10092636, 14942728, 19077708, 22303766, 24113558, -23716272, 20292110, 13478144, 3739843, -7605850, -18616536, -27125940, -31294206, -30157112, -23889144, --13728863, -1690607, 9903121, 19017042, 24391120, 25682294, 23306104, 18159658, 11337103, 3865471, --3420942, -9860171, -14895483, -18075906, -19086298, -17766670, -14164802, -8636105, -1872606, 5182415, -11490111, 16064788, 18162880, 17501992, 14358613, 9434969, 3633542, -2091649, -6881612, -10204305, --11922829, -11974906, -10144176, -6567005, -2434710, 442919, 1197222, 654983, 130460, }, +-327947584, -439449792, -444051840, -368772320, -245394560, -86295016, 97210144, 264148544, 356093600, 346553920, +263942928, 159240208, 62202400, -24676198, -102194448, -160061088, -186785440, -183974928, -163762272, -133193376, +-87690344, -23799488, 46799036, 103836200, 137122192, 150417808, 147615344, 125519880, 83253648, 29818348, +-22703198, -67650568, -102025336, -122039352, -124650152, -110064976, -80442592, -39573828, 4927938, 43437152, +70527656, 86892560, 94581624, 93367224, 82184200, 61012156, 30724586, -6254010, -44463112, -76524504, +-96368328, -100777648, -89137752, -63811404, -30434138, 3992709, 33851860, 55915104, 69026032, 73909408, +72473816, 66124244, 54713052, 37222872, 12999792, -17475686, -51810192, -84977000, -109717088, -118276424, +-104702176, -67335960, -11045045, 52493628, 107759656, 140545824, 142772768, 115008488, 65794068, 8034810, +-45649060, -86090472, -108358800, -111161808, -95987688, -66394288, -27647242, 13440563, 49265424, 73232952, +81687592, 74739944, 55793236, 30321932, 4263292, -17572322, -32429150, -39607116, -39949640, -35240208, +-27561342, -18732500, -10036265, -2222109, 4449049, 10092636, 14942728, 19077708, 22303766, 24113558, +23716272, 20292110, 13478144, 3739843, -7605850, -18616536, -27125940, -31294206, -30157112, -23889144, +-13728863, -1690607, 9903121, 19017042, 24391120, 25682294, 23306104, 18159658, 11337103, 3865471, +-3420942, -9860171, -14895483, -18075906, -19086298, -17766670, -14164802, -8636105, -1872606, 5182415, +11490111, 16064788, 18162880, 17501992, 14358613, 9434969, 3633542, -2091649, -6881612, -10204305, +-11922829, -11974906, -10144176, -6567005, -2434710, 442919, 1197222, 654983, 130460, }, }, { { -121877216, --327947584, -439449792, -444051840, -368772320, -245394560, -86295016, 97210144, 264148544, 356093600, 346553920, -263942928, 159240208, 62202400, -24676198, -102194448, -160061088, -186785440, -183974928, -163762272, -133193376, --87690344, -23799488, 46799036, 103836200, 137122192, 150417808, 147615344, 125519880, 83253648, 29818348, --22703198, -67650568, -102025336, -122039352, -124650152, -110064976, -80442592, -39573828, 4927938, 43437152, -70527656, 86892560, 94581624, 93367224, 82184200, 61012156, 30724586, -6254010, -44463112, -76524504, --96368328, -100777648, -89137752, -63811404, -30434138, 3992709, 33851860, 55915104, 69026032, 73909408, -72473816, 66124244, 54713052, 37222872, 12999792, -17475686, -51810192, -84977000, -109717088, -118276424, --104702176, -67335960, -11045045, 52493628, 107759656, 140545824, 142772768, 115008488, 65794068, 8034810, --45649060, -86090472, -108358800, -111161808, -95987688, -66394288, -27647242, 13440563, 49265424, 73232952, -81687592, 74739944, 55793236, 30321932, 4263292, -17572322, -32429150, -39607116, -39949640, -35240208, --27561342, -18732500, -10036265, -2222109, 4449049, 10092636, 14942728, 19077708, 22303766, 24113558, -23716272, 20292110, 13478144, 3739843, -7605850, -18616536, -27125940, -31294206, -30157112, -23889144, --13728863, -1690607, 9903121, 19017042, 24391120, 25682294, 23306104, 18159658, 11337103, 3865471, --3420942, -9860171, -14895483, -18075906, -19086298, -17766670, -14164802, -8636105, -1872606, 5182415, -11490111, 16064788, 18162880, 17501992, 14358613, 9434969, 3633542, -2091649, -6881612, -10204305, --11922829, -11974906, -10144176, -6567005, -2434710, 442919, 1197222, 654983, 130460, }, +-327947584, -439449792, -444051840, -368772320, -245394560, -86295016, 97210144, 264148544, 356093600, 346553920, +263942928, 159240208, 62202400, -24676198, -102194448, -160061088, -186785440, -183974928, -163762272, -133193376, +-87690344, -23799488, 46799036, 103836200, 137122192, 150417808, 147615344, 125519880, 83253648, 29818348, +-22703198, -67650568, -102025336, -122039352, -124650152, -110064976, -80442592, -39573828, 4927938, 43437152, +70527656, 86892560, 94581624, 93367224, 82184200, 61012156, 30724586, -6254010, -44463112, -76524504, +-96368328, -100777648, -89137752, -63811404, -30434138, 3992709, 33851860, 55915104, 69026032, 73909408, +72473816, 66124244, 54713052, 37222872, 12999792, -17475686, -51810192, -84977000, -109717088, -118276424, +-104702176, -67335960, -11045045, 52493628, 107759656, 140545824, 142772768, 115008488, 65794068, 8034810, +-45649060, -86090472, -108358800, -111161808, -95987688, -66394288, -27647242, 13440563, 49265424, 73232952, +81687592, 74739944, 55793236, 30321932, 4263292, -17572322, -32429150, -39607116, -39949640, -35240208, +-27561342, -18732500, -10036265, -2222109, 4449049, 10092636, 14942728, 19077708, 22303766, 24113558, +23716272, 20292110, 13478144, 3739843, -7605850, -18616536, -27125940, -31294206, -30157112, -23889144, +-13728863, -1690607, 9903121, 19017042, 24391120, 25682294, 23306104, 18159658, 11337103, 3865471, +-3420942, -9860171, -14895483, -18075906, -19086298, -17766670, -14164802, -8636105, -1872606, 5182415, +11490111, 16064788, 18162880, 17501992, 14358613, 9434969, 3633542, -2091649, -6881612, -10204305, +-11922829, -11974906, -10144176, -6567005, -2434710, 442919, 1197222, 654983, 130460, }, { 7919920, -43446816, 104918000, 148874304, 138170704, 83917216, 15482820, -60879012, -143749872, -202633328, -207747568, --184090896, -187100592, -222344016, -238450672, -210530704, -179610704, -185786864, -208447648, -206863872, -183740304, --169309760, -167556336, -157913056, -136191808, -118551832, -110594336, -100373920, -80657336, -58070644, -40783400, --30984968, -27802934, -27360016, -22086870, -7280507, 13779329, 34718904, 51856900, 62892280, 65432752, -59639916, 48164300, 32096290, 10749229, -14424648, -39697844, -62912144, -84523880, -105623448, -127484832, --151991920, -180360704, -212206816, -246526288, -282065536, -316742560, -348788928, -378200864, -405123872, -427867872, --444754592, -456467520, -464216160, -467251648, -464473856, -456580256, -444310624, -426387168, -401278272, -369414976, --332223776, -290739744, -246373280, -201346464, -157460480, -115644144, -76794016, -41654740, -10200547, 17439714, -40042516, 56556128, 67292472, 72427104, 70361224, 58948428, 37329172, 5191005, -38839928, -96605088, --168503920, -253121216, -348580608, -453376224, -565388928, -680615424, -794080960, -902358144, -1003945408, -1096694144, --1176855936, -1242011136, -1292803968, -1329907584, -1351437184, -1355673728, -1344186752, -1319600768, -1282316672, -1232374784, --1172863232, -1108547200, -1042297856, -975305984, -909583872, -847816320, -791289216, -739690560, -692638656, -650415360, --613473280, -581705536, -554161920, -529680608, -507825120, -488477376, -470631776, -452970336, -435749120, -420651776, --408776736, -400292032, -395874112, -396789472, -403652832, -416310656, -434459040, -457537504, -484837376, -515965696, --549921728, -584192320, -616537216, -646397952, -672314304, -690305408, -697493568, -693863232, -677921920, -645913664, --596482880, -525728160, -416760544, -255793760, -71349608, 65669512, 106195216, 73027328, 22857816, }, +43446816, 104918000, 148874304, 138170704, 83917216, 15482820, -60879012, -143749872, -202633328, -207747568, +-184090896, -187100592, -222344016, -238450672, -210530704, -179610704, -185786864, -208447648, -206863872, -183740304, +-169309760, -167556336, -157913056, -136191808, -118551832, -110594336, -100373920, -80657336, -58070644, -40783400, +-30984968, -27802934, -27360016, -22086870, -7280507, 13779329, 34718904, 51856900, 62892280, 65432752, +59639916, 48164300, 32096290, 10749229, -14424648, -39697844, -62912144, -84523880, -105623448, -127484832, +-151991920, -180360704, -212206816, -246526288, -282065536, -316742560, -348788928, -378200864, -405123872, -427867872, +-444754592, -456467520, -464216160, -467251648, -464473856, -456580256, -444310624, -426387168, -401278272, -369414976, +-332223776, -290739744, -246373280, -201346464, -157460480, -115644144, -76794016, -41654740, -10200547, 17439714, +40042516, 56556128, 67292472, 72427104, 70361224, 58948428, 37329172, 5191005, -38839928, -96605088, +-168503920, -253121216, -348580608, -453376224, -565388928, -680615424, -794080960, -902358144, -1003945408, -1096694144, +-1176855936, -1242011136, -1292803968, -1329907584, -1351437184, -1355673728, -1344186752, -1319600768, -1282316672, -1232374784, +-1172863232, -1108547200, -1042297856, -975305984, -909583872, -847816320, -791289216, -739690560, -692638656, -650415360, +-613473280, -581705536, -554161920, -529680608, -507825120, -488477376, -470631776, -452970336, -435749120, -420651776, +-408776736, -400292032, -395874112, -396789472, -403652832, -416310656, -434459040, -457537504, -484837376, -515965696, +-549921728, -584192320, -616537216, -646397952, -672314304, -690305408, -697493568, -693863232, -677921920, -645913664, +-596482880, -525728160, -416760544, -255793760, -71349608, 65669512, 106195216, 73027328, 22857816, }, }, { { 23198728, -61559228, 95750928, 137297760, 153484944, 96155728, -12480638, -93413928, -121580864, -149810608, -202373488, --222976448, -169002128, -89407264, -54619636, -60062432, -57067768, -40763536, -44826572, -70948024, -84447112, --75777720, -76200776, -105965968, -143970528, -158818224, -144399488, -115995256, -89512488, -71548248, -57189100, --33515778, 5246840, 45134200, 63794224, 54092964, 28249610, 206695, -26316876, -52092584, -74698072, --90745144, -100841000, -109150152, -120179624, -137001936, -160759008, -191203360, -228334416, -272725056, -323382592, --376589184, -428057920, -475202176, -516584704, -550901504, -578105280, -600600704, -621953664, -644768000, -670379968, --699618496, -732452480, -766789120, -798380224, -822325184, -834703296, -833034688, -816078656, -784167104, -739744768, --686587584, -627903296, -565669184, -501964096, -439806272, -381877344, -329149120, -281542080, -239374640, -203550848, --174959248, -154366496, -142524192, -139860784, -146122304, -160189936, -180045568, -203606688, -230465264, -262363440, --301331136, -348290176, -404322304, -471761888, -552131456, -643851584, -743671424, -849317952, -958592128, -1066663168, --1166864768, -1254281344, -1326654720, -1382013056, -1417960960, -1434180864, -1433740032, -1420624896, -1397040128, -1364187904, --1324459520, -1280886528, -1234519680, -1184113920, -1128929408, -1070315008, -1009779008, -947248064, -882750528, -818495168, --757349824, -700115648, -646115008, -595666304, -549934592, -508849472, -471224480, -436821248, -406718368, -381813472, --362260640, -348076512, -339271264, -335725792, -337478144, -344461216, -355828384, -370701856, -389412352, -412315264, --437762944, -463297056, -488082752, -511443104, -529989824, -539554176, -538693568, -526605952, -499879424, -455919360, --395226112, -312759520, -194631808, -41409928, 105241192, 182446992, 166282880, 96889632, 28705414, }, +61559228, 95750928, 137297760, 153484944, 96155728, -12480638, -93413928, -121580864, -149810608, -202373488, +-222976448, -169002128, -89407264, -54619636, -60062432, -57067768, -40763536, -44826572, -70948024, -84447112, +-75777720, -76200776, -105965968, -143970528, -158818224, -144399488, -115995256, -89512488, -71548248, -57189100, +-33515778, 5246840, 45134200, 63794224, 54092964, 28249610, 206695, -26316876, -52092584, -74698072, +-90745144, -100841000, -109150152, -120179624, -137001936, -160759008, -191203360, -228334416, -272725056, -323382592, +-376589184, -428057920, -475202176, -516584704, -550901504, -578105280, -600600704, -621953664, -644768000, -670379968, +-699618496, -732452480, -766789120, -798380224, -822325184, -834703296, -833034688, -816078656, -784167104, -739744768, +-686587584, -627903296, -565669184, -501964096, -439806272, -381877344, -329149120, -281542080, -239374640, -203550848, +-174959248, -154366496, -142524192, -139860784, -146122304, -160189936, -180045568, -203606688, -230465264, -262363440, +-301331136, -348290176, -404322304, -471761888, -552131456, -643851584, -743671424, -849317952, -958592128, -1066663168, +-1166864768, -1254281344, -1326654720, -1382013056, -1417960960, -1434180864, -1433740032, -1420624896, -1397040128, -1364187904, +-1324459520, -1280886528, -1234519680, -1184113920, -1128929408, -1070315008, -1009779008, -947248064, -882750528, -818495168, +-757349824, -700115648, -646115008, -595666304, -549934592, -508849472, -471224480, -436821248, -406718368, -381813472, +-362260640, -348076512, -339271264, -335725792, -337478144, -344461216, -355828384, -370701856, -389412352, -412315264, +-437762944, -463297056, -488082752, -511443104, -529989824, -539554176, -538693568, -526605952, -499879424, -455919360, +-395226112, -312759520, -194631808, -41409928, 105241192, 182446992, 166282880, 96889632, 28705414, }, { -134710032, --355053664, -462356992, -454677056, -356599328, -183980288, 41285372, 262398336, 404443104, 426653472, 346123904, -208153440, 46777564, -119379152, -266092016, -356883328, -362540864, -282207264, -142656272, 19508278, 171784736, -286243456, 337028768, 307856288, 205042272, 59186260, -89668720, -208699440, -276937344, -282728576, -225512624, --120118960, 6251325, 123831960, 207502752, 239558240, 214040768, 141594864, 46226196, -46559056, -119185880, --162174208, -170762528, -145114064, -92316024, -25178708, 41701984, 95078224, 124908384, 126542624, 102476312, -61328376, 14045617, -29835528, -63623500, -83169896, -86727200, -75383120, -52842056, -24046448, 6167036, -33442762, 54068268, 65636228, 67444408, 59914256, 43849468, 20435454, -8358007, -39323648, -67309656, --85029080, -85099408, -64057828, -25326348, 21291764, 63022204, 88467200, 91458104, 73073496, 40547176, -3528316, -29810832, -54602456, -68857992, -72016400, -63786168, -44141528, -14494978, 20885352, 54527832, -77333568, 81899656, 66048544, 34309808, -3853123, -37948720, -60123100, -67015984, -59624884, -41827076, --18555870, 5486821, 26436060, 41576896, 49426484, 49449032, 41713796, 26975616, 6971269, -15485505, --36599564, -51846696, -56868052, -49102752, -29229400, -1492501, 27186606, 49115100, 58404576, 53124988, -35735740, 11730629, -12408161, -31103616, -41052372, -41626288, -34236796, -21403970, -6115497, 8734353, -20910048, 28959890, 31982474, 29651380, 22461606, 11644193, -1104344, -13655849, -23618562, -29010356, --28798292, -22879290, -12122545, 1396401, 14827301, 25492242, 31286690, 30774514, 23921894, 12525735, --779000, -13266080, -21409876, -21661668, -14317273, -5112085, -53687, 488016, 18790, }, +-355053664, -462356992, -454677056, -356599328, -183980288, 41285372, 262398336, 404443104, 426653472, 346123904, +208153440, 46777564, -119379152, -266092016, -356883328, -362540864, -282207264, -142656272, 19508278, 171784736, +286243456, 337028768, 307856288, 205042272, 59186260, -89668720, -208699440, -276937344, -282728576, -225512624, +-120118960, 6251325, 123831960, 207502752, 239558240, 214040768, 141594864, 46226196, -46559056, -119185880, +-162174208, -170762528, -145114064, -92316024, -25178708, 41701984, 95078224, 124908384, 126542624, 102476312, +61328376, 14045617, -29835528, -63623500, -83169896, -86727200, -75383120, -52842056, -24046448, 6167036, +33442762, 54068268, 65636228, 67444408, 59914256, 43849468, 20435454, -8358007, -39323648, -67309656, +-85029080, -85099408, -64057828, -25326348, 21291764, 63022204, 88467200, 91458104, 73073496, 40547176, +3528316, -29810832, -54602456, -68857992, -72016400, -63786168, -44141528, -14494978, 20885352, 54527832, +77333568, 81899656, 66048544, 34309808, -3853123, -37948720, -60123100, -67015984, -59624884, -41827076, +-18555870, 5486821, 26436060, 41576896, 49426484, 49449032, 41713796, 26975616, 6971269, -15485505, +-36599564, -51846696, -56868052, -49102752, -29229400, -1492501, 27186606, 49115100, 58404576, 53124988, +35735740, 11730629, -12408161, -31103616, -41052372, -41626288, -34236796, -21403970, -6115497, 8734353, +20910048, 28959890, 31982474, 29651380, 22461606, 11644193, -1104344, -13655849, -23618562, -29010356, +-28798292, -22879290, -12122545, 1396401, 14827301, 25492242, 31286690, 30774514, 23921894, 12525735, +-779000, -13266080, -21409876, -21661668, -14317273, -5112085, -53687, 488016, 18790, }, }, { { -134710032, --355053664, -462356992, -454677056, -356599328, -183980288, 41285372, 262398336, 404443104, 426653472, 346123904, -208153440, 46777564, -119379152, -266092016, -356883328, -362540864, -282207264, -142656272, 19508278, 171784736, -286243456, 337028768, 307856288, 205042272, 59186260, -89668720, -208699440, -276937344, -282728576, -225512624, --120118960, 6251325, 123831960, 207502752, 239558240, 214040768, 141594864, 46226196, -46559056, -119185880, --162174208, -170762528, -145114064, -92316024, -25178708, 41701984, 95078224, 124908384, 126542624, 102476312, -61328376, 14045617, -29835528, -63623500, -83169896, -86727200, -75383120, -52842056, -24046448, 6167036, -33442762, 54068268, 65636228, 67444408, 59914256, 43849468, 20435454, -8358007, -39323648, -67309656, --85029080, -85099408, -64057828, -25326348, 21291764, 63022204, 88467200, 91458104, 73073496, 40547176, -3528316, -29810832, -54602456, -68857992, -72016400, -63786168, -44141528, -14494978, 20885352, 54527832, -77333568, 81899656, 66048544, 34309808, -3853123, -37948720, -60123100, -67015984, -59624884, -41827076, --18555870, 5486821, 26436060, 41576896, 49426484, 49449032, 41713796, 26975616, 6971269, -15485505, --36599564, -51846696, -56868052, -49102752, -29229400, -1492501, 27186606, 49115100, 58404576, 53124988, -35735740, 11730629, -12408161, -31103616, -41052372, -41626288, -34236796, -21403970, -6115497, 8734353, -20910048, 28959890, 31982474, 29651380, 22461606, 11644193, -1104344, -13655849, -23618562, -29010356, --28798292, -22879290, -12122545, 1396401, 14827301, 25492242, 31286690, 30774514, 23921894, 12525735, --779000, -13266080, -21409876, -21661668, -14317273, -5112085, -53687, 488016, 18790, }, +-355053664, -462356992, -454677056, -356599328, -183980288, 41285372, 262398336, 404443104, 426653472, 346123904, +208153440, 46777564, -119379152, -266092016, -356883328, -362540864, -282207264, -142656272, 19508278, 171784736, +286243456, 337028768, 307856288, 205042272, 59186260, -89668720, -208699440, -276937344, -282728576, -225512624, +-120118960, 6251325, 123831960, 207502752, 239558240, 214040768, 141594864, 46226196, -46559056, -119185880, +-162174208, -170762528, -145114064, -92316024, -25178708, 41701984, 95078224, 124908384, 126542624, 102476312, +61328376, 14045617, -29835528, -63623500, -83169896, -86727200, -75383120, -52842056, -24046448, 6167036, +33442762, 54068268, 65636228, 67444408, 59914256, 43849468, 20435454, -8358007, -39323648, -67309656, +-85029080, -85099408, -64057828, -25326348, 21291764, 63022204, 88467200, 91458104, 73073496, 40547176, +3528316, -29810832, -54602456, -68857992, -72016400, -63786168, -44141528, -14494978, 20885352, 54527832, +77333568, 81899656, 66048544, 34309808, -3853123, -37948720, -60123100, -67015984, -59624884, -41827076, +-18555870, 5486821, 26436060, 41576896, 49426484, 49449032, 41713796, 26975616, 6971269, -15485505, +-36599564, -51846696, -56868052, -49102752, -29229400, -1492501, 27186606, 49115100, 58404576, 53124988, +35735740, 11730629, -12408161, -31103616, -41052372, -41626288, -34236796, -21403970, -6115497, 8734353, +20910048, 28959890, 31982474, 29651380, 22461606, 11644193, -1104344, -13655849, -23618562, -29010356, +-28798292, -22879290, -12122545, 1396401, 14827301, 25492242, 31286690, 30774514, 23921894, 12525735, +-779000, -13266080, -21409876, -21661668, -14317273, -5112085, -53687, 488016, 18790, }, { 23198728, -61559228, 95750928, 137297760, 153484944, 96155728, -12480638, -93413928, -121580864, -149810608, -202373488, --222976448, -169002128, -89407264, -54619636, -60062432, -57067768, -40763536, -44826572, -70948024, -84447112, --75777720, -76200776, -105965968, -143970528, -158818224, -144399488, -115995256, -89512488, -71548248, -57189100, --33515778, 5246840, 45134200, 63794224, 54092964, 28249610, 206695, -26316876, -52092584, -74698072, --90745144, -100841000, -109150152, -120179624, -137001936, -160759008, -191203360, -228334416, -272725056, -323382592, --376589184, -428057920, -475202176, -516584704, -550901504, -578105280, -600600704, -621953664, -644768000, -670379968, --699618496, -732452480, -766789120, -798380224, -822325184, -834703296, -833034688, -816078656, -784167104, -739744768, --686587584, -627903296, -565669184, -501964096, -439806272, -381877344, -329149120, -281542080, -239374640, -203550848, --174959248, -154366496, -142524192, -139860784, -146122304, -160189936, -180045568, -203606688, -230465264, -262363440, --301331136, -348290176, -404322304, -471761888, -552131456, -643851584, -743671424, -849317952, -958592128, -1066663168, --1166864768, -1254281344, -1326654720, -1382013056, -1417960960, -1434180864, -1433740032, -1420624896, -1397040128, -1364187904, --1324459520, -1280886528, -1234519680, -1184113920, -1128929408, -1070315008, -1009779008, -947248064, -882750528, -818495168, --757349824, -700115648, -646115008, -595666304, -549934592, -508849472, -471224480, -436821248, -406718368, -381813472, --362260640, -348076512, -339271264, -335725792, -337478144, -344461216, -355828384, -370701856, -389412352, -412315264, --437762944, -463297056, -488082752, -511443104, -529989824, -539554176, -538693568, -526605952, -499879424, -455919360, --395226112, -312759520, -194631808, -41409928, 105241192, 182446992, 166282880, 96889632, 28705414, }, +61559228, 95750928, 137297760, 153484944, 96155728, -12480638, -93413928, -121580864, -149810608, -202373488, +-222976448, -169002128, -89407264, -54619636, -60062432, -57067768, -40763536, -44826572, -70948024, -84447112, +-75777720, -76200776, -105965968, -143970528, -158818224, -144399488, -115995256, -89512488, -71548248, -57189100, +-33515778, 5246840, 45134200, 63794224, 54092964, 28249610, 206695, -26316876, -52092584, -74698072, +-90745144, -100841000, -109150152, -120179624, -137001936, -160759008, -191203360, -228334416, -272725056, -323382592, +-376589184, -428057920, -475202176, -516584704, -550901504, -578105280, -600600704, -621953664, -644768000, -670379968, +-699618496, -732452480, -766789120, -798380224, -822325184, -834703296, -833034688, -816078656, -784167104, -739744768, +-686587584, -627903296, -565669184, -501964096, -439806272, -381877344, -329149120, -281542080, -239374640, -203550848, +-174959248, -154366496, -142524192, -139860784, -146122304, -160189936, -180045568, -203606688, -230465264, -262363440, +-301331136, -348290176, -404322304, -471761888, -552131456, -643851584, -743671424, -849317952, -958592128, -1066663168, +-1166864768, -1254281344, -1326654720, -1382013056, -1417960960, -1434180864, -1433740032, -1420624896, -1397040128, -1364187904, +-1324459520, -1280886528, -1234519680, -1184113920, -1128929408, -1070315008, -1009779008, -947248064, -882750528, -818495168, +-757349824, -700115648, -646115008, -595666304, -549934592, -508849472, -471224480, -436821248, -406718368, -381813472, +-362260640, -348076512, -339271264, -335725792, -337478144, -344461216, -355828384, -370701856, -389412352, -412315264, +-437762944, -463297056, -488082752, -511443104, -529989824, -539554176, -538693568, -526605952, -499879424, -455919360, +-395226112, -312759520, -194631808, -41409928, 105241192, 182446992, 166282880, 96889632, 28705414, }, }, { { -4125853, --14767708, -29042032, -41738492, -46874200, -42393476, -20827908, 37269580, 137992464, 241750288, 284568416, -241448560, 146208736, 45365592, -37332928, -86877528, -88201448, -48722108, 1248225, 44657996, 86271400, -118205016, 112792824, 63035624, -1081795, -48502528, -71673880, -69729328, -40025872, 3649649, 33426656, -37935300, 27593554, 5938866, -38524248, -106998376, -180820272, -243455920, -293718848, -334321344, -364600832, --387406592, -409077376, -430395456, -447260192, -459261376, -469467296, -478806176, -487763328, -499535840, -515295136, --530793536, -542745920, -553990656, -568492096, -586156224, -605739648, -627893632, -652271296, -675657920, -695503936, --712557632, -728850048, -745584320, -763652160, -784144512, -807592896, -833343936, -859363904, -882591616, -900595584, --912911936, -919673856, -919725888, -911916608, -897406592, -878441088, -855408768, -827272960, -794356352, -758548160, --721204992, -682981376, -645543808, -611403072, -581723264, -555737600, -532580768, -512435232, -495456704, -480619200, --466320160, -451648576, -436605984, -421438304, -406230880, -391044416, -376126944, -361823616, -348162944, -334543584, --320139872, -304671008, -288301824, -270764928, -251427920, -230474384, -209052160, -187910720, -166958256, -146492208, --127567512, -110708688, -95519000, -81867448, -70162584, -60325500, -51804820, -44518948, -38556996, -33389076, --28616294, -24735790, -22054120, -20000052, -18549426, -18861348, -21626770, -26554172, -34089692, -45622216, --61571040, -81274200, -104590504, -131516192, -160885184, -191458912, -223045712, -254892352, -285142336, -313281344, --340161952, -364766752, -384908000, -401329248, -416241376, -428463776, -435818400, -440402720, -444750304, -446371104, --443175648, -436180224, -415763040, -357410528, -251464432, -130003288, -41952704, -4706211, 1130650, }, +-14767708, -29042032, -41738492, -46874200, -42393476, -20827908, 37269580, 137992464, 241750288, 284568416, +241448560, 146208736, 45365592, -37332928, -86877528, -88201448, -48722108, 1248225, 44657996, 86271400, +118205016, 112792824, 63035624, -1081795, -48502528, -71673880, -69729328, -40025872, 3649649, 33426656, +37935300, 27593554, 5938866, -38524248, -106998376, -180820272, -243455920, -293718848, -334321344, -364600832, +-387406592, -409077376, -430395456, -447260192, -459261376, -469467296, -478806176, -487763328, -499535840, -515295136, +-530793536, -542745920, -553990656, -568492096, -586156224, -605739648, -627893632, -652271296, -675657920, -695503936, +-712557632, -728850048, -745584320, -763652160, -784144512, -807592896, -833343936, -859363904, -882591616, -900595584, +-912911936, -919673856, -919725888, -911916608, -897406592, -878441088, -855408768, -827272960, -794356352, -758548160, +-721204992, -682981376, -645543808, -611403072, -581723264, -555737600, -532580768, -512435232, -495456704, -480619200, +-466320160, -451648576, -436605984, -421438304, -406230880, -391044416, -376126944, -361823616, -348162944, -334543584, +-320139872, -304671008, -288301824, -270764928, -251427920, -230474384, -209052160, -187910720, -166958256, -146492208, +-127567512, -110708688, -95519000, -81867448, -70162584, -60325500, -51804820, -44518948, -38556996, -33389076, +-28616294, -24735790, -22054120, -20000052, -18549426, -18861348, -21626770, -26554172, -34089692, -45622216, +-61571040, -81274200, -104590504, -131516192, -160885184, -191458912, -223045712, -254892352, -285142336, -313281344, +-340161952, -364766752, -384908000, -401329248, -416241376, -428463776, -435818400, -440402720, -444750304, -446371104, +-443175648, -436180224, -415763040, -357410528, -251464432, -130003288, -41952704, -4706211, 1130650, }, { -69776040, --199926976, -310493920, -391379968, -410279424, -341146560, -220535296, -138643152, -161903632, -281714432, -431863264, --531811456, -527844512, -430712192, -313395712, -245669440, -234024720, -241856048, -246089808, -241810416, -211413856, --134434624, -26459682, 67050344, 120003536, 145708912, 169338208, 203243216, 249530624, 305789856, 362501696, -406125664, 428072416, 426747936, 405230176, 372656608, 342246080, 320857152, 303298240, 280238560, 247717600, -207168288, 161693168, 114959632, 69615512, 24978456, -21061982, -68116032, -114034064, -158266864, -201481744, --243280368, -282763456, -319460192, -351561856, -375398944, -388531872, -391390720, -384812960, -368463648, -342605792, --308969216, -269061440, -223721632, -174591488, -123765392, -71724880, -17594870, 38373924, 94002336, 146620512, -193984352, 234253952, 266512928, 291203072, 309168928, 320415840, 324258752, 320284288, 308741024, 290266240, -265549776, 235231056, 200186272, 161926176, 122410328, 83385720, 46162844, 11814381, -18991808, -46236932, --70012264, -89895280, -105430712, -116912232, -124998584, -129893232, -131597800, -130620696, -127709776, -123243552, --117540904, -111405544, -105715792, -100761008, -96488048, -93046712, -90591600, -88866632, -87428888, -86055040, --84617296, -82773144, -79990008, -75703632, -69346008, -60391536, -48456896, -33323578, -15001247, 6155762, -29615946, 55006184, 81981800, 109794400, 137452368, 164257264, 189614224, 212451088, 231574432, 246505888, -257123056, 262678592, 262149776, 255290704, 242235088, 222452464, 195367856, 161559488, 122027536, 76943800, -26591754, -27271968, -82442432, -137508752, -190622992, -238597776, -278680032, -309303680, -328158048, -332487904, --321526624, -293460608, -240470928, -157793872, -62716188, 7940321, 31165356, 20784958, 5646272, }, +-199926976, -310493920, -391379968, -410279424, -341146560, -220535296, -138643152, -161903632, -281714432, -431863264, +-531811456, -527844512, -430712192, -313395712, -245669440, -234024720, -241856048, -246089808, -241810416, -211413856, +-134434624, -26459682, 67050344, 120003536, 145708912, 169338208, 203243216, 249530624, 305789856, 362501696, +406125664, 428072416, 426747936, 405230176, 372656608, 342246080, 320857152, 303298240, 280238560, 247717600, +207168288, 161693168, 114959632, 69615512, 24978456, -21061982, -68116032, -114034064, -158266864, -201481744, +-243280368, -282763456, -319460192, -351561856, -375398944, -388531872, -391390720, -384812960, -368463648, -342605792, +-308969216, -269061440, -223721632, -174591488, -123765392, -71724880, -17594870, 38373924, 94002336, 146620512, +193984352, 234253952, 266512928, 291203072, 309168928, 320415840, 324258752, 320284288, 308741024, 290266240, +265549776, 235231056, 200186272, 161926176, 122410328, 83385720, 46162844, 11814381, -18991808, -46236932, +-70012264, -89895280, -105430712, -116912232, -124998584, -129893232, -131597800, -130620696, -127709776, -123243552, +-117540904, -111405544, -105715792, -100761008, -96488048, -93046712, -90591600, -88866632, -87428888, -86055040, +-84617296, -82773144, -79990008, -75703632, -69346008, -60391536, -48456896, -33323578, -15001247, 6155762, +29615946, 55006184, 81981800, 109794400, 137452368, 164257264, 189614224, 212451088, 231574432, 246505888, +257123056, 262678592, 262149776, 255290704, 242235088, 222452464, 195367856, 161559488, 122027536, 76943800, +26591754, -27271968, -82442432, -137508752, -190622992, -238597776, -278680032, -309303680, -328158048, -332487904, +-321526624, -293460608, -240470928, -157793872, -62716188, 7940321, 31165356, 20784958, 5646272, }, }, { { -69776040, --199926976, -310493920, -391379968, -410279424, -341146560, -220535296, -138643152, -161903632, -281714432, -431863264, --531811456, -527844512, -430712192, -313395712, -245669440, -234024720, -241856048, -246089808, -241810416, -211413856, --134434624, -26459682, 67050344, 120003536, 145708912, 169338208, 203243216, 249530624, 305789856, 362501696, -406125664, 428072416, 426747936, 405230176, 372656608, 342246080, 320857152, 303298240, 280238560, 247717600, -207168288, 161693168, 114959632, 69615512, 24978456, -21061982, -68116032, -114034064, -158266864, -201481744, --243280368, -282763456, -319460192, -351561856, -375398944, -388531872, -391390720, -384812960, -368463648, -342605792, --308969216, -269061440, -223721632, -174591488, -123765392, -71724880, -17594870, 38373924, 94002336, 146620512, -193984352, 234253952, 266512928, 291203072, 309168928, 320415840, 324258752, 320284288, 308741024, 290266240, -265549776, 235231056, 200186272, 161926176, 122410328, 83385720, 46162844, 11814381, -18991808, -46236932, --70012264, -89895280, -105430712, -116912232, -124998584, -129893232, -131597800, -130620696, -127709776, -123243552, --117540904, -111405544, -105715792, -100761008, -96488048, -93046712, -90591600, -88866632, -87428888, -86055040, --84617296, -82773144, -79990008, -75703632, -69346008, -60391536, -48456896, -33323578, -15001247, 6155762, -29615946, 55006184, 81981800, 109794400, 137452368, 164257264, 189614224, 212451088, 231574432, 246505888, -257123056, 262678592, 262149776, 255290704, 242235088, 222452464, 195367856, 161559488, 122027536, 76943800, -26591754, -27271968, -82442432, -137508752, -190622992, -238597776, -278680032, -309303680, -328158048, -332487904, --321526624, -293460608, -240470928, -157793872, -62716188, 7940321, 31165356, 20784958, 5646272, }, +-199926976, -310493920, -391379968, -410279424, -341146560, -220535296, -138643152, -161903632, -281714432, -431863264, +-531811456, -527844512, -430712192, -313395712, -245669440, -234024720, -241856048, -246089808, -241810416, -211413856, +-134434624, -26459682, 67050344, 120003536, 145708912, 169338208, 203243216, 249530624, 305789856, 362501696, +406125664, 428072416, 426747936, 405230176, 372656608, 342246080, 320857152, 303298240, 280238560, 247717600, +207168288, 161693168, 114959632, 69615512, 24978456, -21061982, -68116032, -114034064, -158266864, -201481744, +-243280368, -282763456, -319460192, -351561856, -375398944, -388531872, -391390720, -384812960, -368463648, -342605792, +-308969216, -269061440, -223721632, -174591488, -123765392, -71724880, -17594870, 38373924, 94002336, 146620512, +193984352, 234253952, 266512928, 291203072, 309168928, 320415840, 324258752, 320284288, 308741024, 290266240, +265549776, 235231056, 200186272, 161926176, 122410328, 83385720, 46162844, 11814381, -18991808, -46236932, +-70012264, -89895280, -105430712, -116912232, -124998584, -129893232, -131597800, -130620696, -127709776, -123243552, +-117540904, -111405544, -105715792, -100761008, -96488048, -93046712, -90591600, -88866632, -87428888, -86055040, +-84617296, -82773144, -79990008, -75703632, -69346008, -60391536, -48456896, -33323578, -15001247, 6155762, +29615946, 55006184, 81981800, 109794400, 137452368, 164257264, 189614224, 212451088, 231574432, 246505888, +257123056, 262678592, 262149776, 255290704, 242235088, 222452464, 195367856, 161559488, 122027536, 76943800, +26591754, -27271968, -82442432, -137508752, -190622992, -238597776, -278680032, -309303680, -328158048, -332487904, +-321526624, -293460608, -240470928, -157793872, -62716188, 7940321, 31165356, 20784958, 5646272, }, { -4125853, --14767708, -29042032, -41738492, -46874200, -42393476, -20827908, 37269580, 137992464, 241750288, 284568416, -241448560, 146208736, 45365592, -37332928, -86877528, -88201448, -48722108, 1248225, 44657996, 86271400, -118205016, 112792824, 63035624, -1081795, -48502528, -71673880, -69729328, -40025872, 3649649, 33426656, -37935300, 27593554, 5938866, -38524248, -106998376, -180820272, -243455920, -293718848, -334321344, -364600832, --387406592, -409077376, -430395456, -447260192, -459261376, -469467296, -478806176, -487763328, -499535840, -515295136, --530793536, -542745920, -553990656, -568492096, -586156224, -605739648, -627893632, -652271296, -675657920, -695503936, --712557632, -728850048, -745584320, -763652160, -784144512, -807592896, -833343936, -859363904, -882591616, -900595584, --912911936, -919673856, -919725888, -911916608, -897406592, -878441088, -855408768, -827272960, -794356352, -758548160, --721204992, -682981376, -645543808, -611403072, -581723264, -555737600, -532580768, -512435232, -495456704, -480619200, --466320160, -451648576, -436605984, -421438304, -406230880, -391044416, -376126944, -361823616, -348162944, -334543584, --320139872, -304671008, -288301824, -270764928, -251427920, -230474384, -209052160, -187910720, -166958256, -146492208, --127567512, -110708688, -95519000, -81867448, -70162584, -60325500, -51804820, -44518948, -38556996, -33389076, --28616294, -24735790, -22054120, -20000052, -18549426, -18861348, -21626770, -26554172, -34089692, -45622216, --61571040, -81274200, -104590504, -131516192, -160885184, -191458912, -223045712, -254892352, -285142336, -313281344, --340161952, -364766752, -384908000, -401329248, -416241376, -428463776, -435818400, -440402720, -444750304, -446371104, --443175648, -436180224, -415763040, -357410528, -251464432, -130003288, -41952704, -4706211, 1130650, }, +-14767708, -29042032, -41738492, -46874200, -42393476, -20827908, 37269580, 137992464, 241750288, 284568416, +241448560, 146208736, 45365592, -37332928, -86877528, -88201448, -48722108, 1248225, 44657996, 86271400, +118205016, 112792824, 63035624, -1081795, -48502528, -71673880, -69729328, -40025872, 3649649, 33426656, +37935300, 27593554, 5938866, -38524248, -106998376, -180820272, -243455920, -293718848, -334321344, -364600832, +-387406592, -409077376, -430395456, -447260192, -459261376, -469467296, -478806176, -487763328, -499535840, -515295136, +-530793536, -542745920, -553990656, -568492096, -586156224, -605739648, -627893632, -652271296, -675657920, -695503936, +-712557632, -728850048, -745584320, -763652160, -784144512, -807592896, -833343936, -859363904, -882591616, -900595584, +-912911936, -919673856, -919725888, -911916608, -897406592, -878441088, -855408768, -827272960, -794356352, -758548160, +-721204992, -682981376, -645543808, -611403072, -581723264, -555737600, -532580768, -512435232, -495456704, -480619200, +-466320160, -451648576, -436605984, -421438304, -406230880, -391044416, -376126944, -361823616, -348162944, -334543584, +-320139872, -304671008, -288301824, -270764928, -251427920, -230474384, -209052160, -187910720, -166958256, -146492208, +-127567512, -110708688, -95519000, -81867448, -70162584, -60325500, -51804820, -44518948, -38556996, -33389076, +-28616294, -24735790, -22054120, -20000052, -18549426, -18861348, -21626770, -26554172, -34089692, -45622216, +-61571040, -81274200, -104590504, -131516192, -160885184, -191458912, -223045712, -254892352, -285142336, -313281344, +-340161952, -364766752, -384908000, -401329248, -416241376, -428463776, -435818400, -440402720, -444750304, -446371104, +-443175648, -436180224, -415763040, -357410528, -251464432, -130003288, -41952704, -4706211, 1130650, }, }, { { 4600447, -19346680, 44991392, 63967096, 37875168, -42050952, -119665304, -130808600, -85799488, -48747880, -42614128, --30416958, 6164352, 28224914, -804233, -64210836, -126092720, -180239920, -237944944, -293541696, -329953344, --344641056, -349177088, -350809696, -348528544, -341931488, -333844064, -326418592, -319338336, -309974784, -294711520, --273317216, -251272224, -234176112, -221063040, -206330224, -186406944, -161877856, -135534672, -111140872, -92090008, --79091288, -70537856, -65754876, -65877284, -71478456, -81757384, -96047816, -113733416, -132603896, -149208768, --160987184, -167227776, -168843216, -168241392, -168576928, -172385488, -181468816, -197534672, -221246112, -250856160, --283442624, -317161856, -350805408, -382150624, -408971072, -431287744, -450754144, -468265792, -483745920, -497657856, --510922880, -523423360, -533833824, -540915136, -544164864, -543285440, -537748160, -527259328, -512605952, -495719744, --478473312, -461465248, -444370208, -427017984, -409177248, -389593248, -366583520, -339779680, -310380096, -279799936, --249073744, -219411632, -192223408, -168497472, -148803968, -133796824, -124318904, -121394032, -126326800, -140132976, --162630544, -192760816, -229733504, -272853888, -320412064, -370109152, -420674880, -471803776, -522449472, -570576768, --614814912, -655093120, -691254080, -722185856, -746924864, -765859264, -780155584, -790358784, -796305216, -798383424, --798019392, -796342208, -793002368, -787184320, -779196160, -769785408, -758301696, -743142080, -723924800, -701610816, --676507840, -647901184, -615899392, -582057728, -547816640, -513594336, -479704352, -447123264, -416993536, -389851488, --365435680, -343231232, -323292384, -306035200, -290884704, -276268416, -261546336, -247164096, -232224048, -214475104, --192652368, -163808976, -118643104, -50144816, 27531814, 80195632, 85242752, 55034636, 17487496, }, +19346680, 44991392, 63967096, 37875168, -42050952, -119665304, -130808600, -85799488, -48747880, -42614128, +-30416958, 6164352, 28224914, -804233, -64210836, -126092720, -180239920, -237944944, -293541696, -329953344, +-344641056, -349177088, -350809696, -348528544, -341931488, -333844064, -326418592, -319338336, -309974784, -294711520, +-273317216, -251272224, -234176112, -221063040, -206330224, -186406944, -161877856, -135534672, -111140872, -92090008, +-79091288, -70537856, -65754876, -65877284, -71478456, -81757384, -96047816, -113733416, -132603896, -149208768, +-160987184, -167227776, -168843216, -168241392, -168576928, -172385488, -181468816, -197534672, -221246112, -250856160, +-283442624, -317161856, -350805408, -382150624, -408971072, -431287744, -450754144, -468265792, -483745920, -497657856, +-510922880, -523423360, -533833824, -540915136, -544164864, -543285440, -537748160, -527259328, -512605952, -495719744, +-478473312, -461465248, -444370208, -427017984, -409177248, -389593248, -366583520, -339779680, -310380096, -279799936, +-249073744, -219411632, -192223408, -168497472, -148803968, -133796824, -124318904, -121394032, -126326800, -140132976, +-162630544, -192760816, -229733504, -272853888, -320412064, -370109152, -420674880, -471803776, -522449472, -570576768, +-614814912, -655093120, -691254080, -722185856, -746924864, -765859264, -780155584, -790358784, -796305216, -798383424, +-798019392, -796342208, -793002368, -787184320, -779196160, -769785408, -758301696, -743142080, -723924800, -701610816, +-676507840, -647901184, -615899392, -582057728, -547816640, -513594336, -479704352, -447123264, -416993536, -389851488, +-365435680, -343231232, -323292384, -306035200, -290884704, -276268416, -261546336, -247164096, -232224048, -214475104, +-192652368, -163808976, -118643104, -50144816, 27531814, 80195632, 85242752, 55034636, 17487496, }, { -99621232, --286525856, -426905792, -479705440, -432011968, -323699328, -220398400, -155248032, -104107856, -23679228, 92591976, -205608144, 273819744, 292754112, 287597440, 276765536, 253286576, 200076224, 114409336, 14027363, -76716168, --143684368, -188199568, -218924688, -239735952, -245462752, -228540576, -187456528, -127361888, -55034100, 22943716, -97618168, 157806768, 195323840, 208820768, 201669120, 177899696, 141368848, 96980896, 50311784, 5823976, --33888904, -67592584, -94911264, -115949088, -130647536, -138425728, -138543840, -130454264, -113604568, -87367152, --51758652, -8462159, 38787848, 84825064, 124388160, 153377040, 169199696, 170266464, 155651760, 125596656, -82256136, 29805462, -26240102, -80012560, -126178624, -160451920, -179634864, -181446256, -164609984, -129440112, --78724064, -18290118, 43474196, 97401808, 135857872, 154479776, 152887408, 134421744, 104892232, 70540544, -36217848, 4746476, -22646288, -45631880, -64202244, -78178072, -86946248, -89597848, -85337240, -73968464, --56345676, -34479996, -11038066, 11462194, 31138512, 46814068, 57956288, 64547452, 66799088, 64929168, -59168008, 49832360, 37300716, 22064320, 4896800, -13102871, -30626338, -46220292, -58353036, -65668440, --67281736, -62858456, -52617644, -37437084, -18846316, 1262720, 20951388, 38391640, 52051244, 60915520, -64485712, 62605052, 55444268, 43579424, 27926952, 9672266, -9613211, -27947352, -43250856, -53731116, --58120572, -55941948, -47761112, -35042640, -19684372, -3697430, 11003169, 22971632, 31496068, 36412196, -37870336, 36382132, 32725504, 27558120, 21326124, 14526653, 7638600, 853625, -5680094, -11527155, --16320876, -19895362, -21371758, -19102940, -12946105, -5827734, -1298154, 30602, 38655, }, +-286525856, -426905792, -479705440, -432011968, -323699328, -220398400, -155248032, -104107856, -23679228, 92591976, +205608144, 273819744, 292754112, 287597440, 276765536, 253286576, 200076224, 114409336, 14027363, -76716168, +-143684368, -188199568, -218924688, -239735952, -245462752, -228540576, -187456528, -127361888, -55034100, 22943716, +97618168, 157806768, 195323840, 208820768, 201669120, 177899696, 141368848, 96980896, 50311784, 5823976, +-33888904, -67592584, -94911264, -115949088, -130647536, -138425728, -138543840, -130454264, -113604568, -87367152, +-51758652, -8462159, 38787848, 84825064, 124388160, 153377040, 169199696, 170266464, 155651760, 125596656, +82256136, 29805462, -26240102, -80012560, -126178624, -160451920, -179634864, -181446256, -164609984, -129440112, +-78724064, -18290118, 43474196, 97401808, 135857872, 154479776, 152887408, 134421744, 104892232, 70540544, +36217848, 4746476, -22646288, -45631880, -64202244, -78178072, -86946248, -89597848, -85337240, -73968464, +-56345676, -34479996, -11038066, 11462194, 31138512, 46814068, 57956288, 64547452, 66799088, 64929168, +59168008, 49832360, 37300716, 22064320, 4896800, -13102871, -30626338, -46220292, -58353036, -65668440, +-67281736, -62858456, -52617644, -37437084, -18846316, 1262720, 20951388, 38391640, 52051244, 60915520, +64485712, 62605052, 55444268, 43579424, 27926952, 9672266, -9613211, -27947352, -43250856, -53731116, +-58120572, -55941948, -47761112, -35042640, -19684372, -3697430, 11003169, 22971632, 31496068, 36412196, +37870336, 36382132, 32725504, 27558120, 21326124, 14526653, 7638600, 853625, -5680094, -11527155, +-16320876, -19895362, -21371758, -19102940, -12946105, -5827734, -1298154, 30602, 38655, }, }, { { -99621232, --286525856, -426905792, -479705440, -432011968, -323699328, -220398400, -155248032, -104107856, -23679228, 92591976, -205608144, 273819744, 292754112, 287597440, 276765536, 253286576, 200076224, 114409336, 14027363, -76716168, --143684368, -188199568, -218924688, -239735952, -245462752, -228540576, -187456528, -127361888, -55034100, 22943716, -97618168, 157806768, 195323840, 208820768, 201669120, 177899696, 141368848, 96980896, 50311784, 5823976, --33888904, -67592584, -94911264, -115949088, -130647536, -138425728, -138543840, -130454264, -113604568, -87367152, --51758652, -8462159, 38787848, 84825064, 124388160, 153377040, 169199696, 170266464, 155651760, 125596656, -82256136, 29805462, -26240102, -80012560, -126178624, -160451920, -179634864, -181446256, -164609984, -129440112, --78724064, -18290118, 43474196, 97401808, 135857872, 154479776, 152887408, 134421744, 104892232, 70540544, -36217848, 4746476, -22646288, -45631880, -64202244, -78178072, -86946248, -89597848, -85337240, -73968464, --56345676, -34479996, -11038066, 11462194, 31138512, 46814068, 57956288, 64547452, 66799088, 64929168, -59168008, 49832360, 37300716, 22064320, 4896800, -13102871, -30626338, -46220292, -58353036, -65668440, --67281736, -62858456, -52617644, -37437084, -18846316, 1262720, 20951388, 38391640, 52051244, 60915520, -64485712, 62605052, 55444268, 43579424, 27926952, 9672266, -9613211, -27947352, -43250856, -53731116, --58120572, -55941948, -47761112, -35042640, -19684372, -3697430, 11003169, 22971632, 31496068, 36412196, -37870336, 36382132, 32725504, 27558120, 21326124, 14526653, 7638600, 853625, -5680094, -11527155, --16320876, -19895362, -21371758, -19102940, -12946105, -5827734, -1298154, 30602, 38655, }, +-286525856, -426905792, -479705440, -432011968, -323699328, -220398400, -155248032, -104107856, -23679228, 92591976, +205608144, 273819744, 292754112, 287597440, 276765536, 253286576, 200076224, 114409336, 14027363, -76716168, +-143684368, -188199568, -218924688, -239735952, -245462752, -228540576, -187456528, -127361888, -55034100, 22943716, +97618168, 157806768, 195323840, 208820768, 201669120, 177899696, 141368848, 96980896, 50311784, 5823976, +-33888904, -67592584, -94911264, -115949088, -130647536, -138425728, -138543840, -130454264, -113604568, -87367152, +-51758652, -8462159, 38787848, 84825064, 124388160, 153377040, 169199696, 170266464, 155651760, 125596656, +82256136, 29805462, -26240102, -80012560, -126178624, -160451920, -179634864, -181446256, -164609984, -129440112, +-78724064, -18290118, 43474196, 97401808, 135857872, 154479776, 152887408, 134421744, 104892232, 70540544, +36217848, 4746476, -22646288, -45631880, -64202244, -78178072, -86946248, -89597848, -85337240, -73968464, +-56345676, -34479996, -11038066, 11462194, 31138512, 46814068, 57956288, 64547452, 66799088, 64929168, +59168008, 49832360, 37300716, 22064320, 4896800, -13102871, -30626338, -46220292, -58353036, -65668440, +-67281736, -62858456, -52617644, -37437084, -18846316, 1262720, 20951388, 38391640, 52051244, 60915520, +64485712, 62605052, 55444268, 43579424, 27926952, 9672266, -9613211, -27947352, -43250856, -53731116, +-58120572, -55941948, -47761112, -35042640, -19684372, -3697430, 11003169, 22971632, 31496068, 36412196, +37870336, 36382132, 32725504, 27558120, 21326124, 14526653, 7638600, 853625, -5680094, -11527155, +-16320876, -19895362, -21371758, -19102940, -12946105, -5827734, -1298154, 30602, 38655, }, { 4600447, -19346680, 44991392, 63967096, 37875168, -42050952, -119665304, -130808600, -85799488, -48747880, -42614128, --30416958, 6164352, 28224914, -804233, -64210836, -126092720, -180239920, -237944944, -293541696, -329953344, --344641056, -349177088, -350809696, -348528544, -341931488, -333844064, -326418592, -319338336, -309974784, -294711520, --273317216, -251272224, -234176112, -221063040, -206330224, -186406944, -161877856, -135534672, -111140872, -92090008, --79091288, -70537856, -65754876, -65877284, -71478456, -81757384, -96047816, -113733416, -132603896, -149208768, --160987184, -167227776, -168843216, -168241392, -168576928, -172385488, -181468816, -197534672, -221246112, -250856160, --283442624, -317161856, -350805408, -382150624, -408971072, -431287744, -450754144, -468265792, -483745920, -497657856, --510922880, -523423360, -533833824, -540915136, -544164864, -543285440, -537748160, -527259328, -512605952, -495719744, --478473312, -461465248, -444370208, -427017984, -409177248, -389593248, -366583520, -339779680, -310380096, -279799936, --249073744, -219411632, -192223408, -168497472, -148803968, -133796824, -124318904, -121394032, -126326800, -140132976, --162630544, -192760816, -229733504, -272853888, -320412064, -370109152, -420674880, -471803776, -522449472, -570576768, --614814912, -655093120, -691254080, -722185856, -746924864, -765859264, -780155584, -790358784, -796305216, -798383424, --798019392, -796342208, -793002368, -787184320, -779196160, -769785408, -758301696, -743142080, -723924800, -701610816, --676507840, -647901184, -615899392, -582057728, -547816640, -513594336, -479704352, -447123264, -416993536, -389851488, --365435680, -343231232, -323292384, -306035200, -290884704, -276268416, -261546336, -247164096, -232224048, -214475104, --192652368, -163808976, -118643104, -50144816, 27531814, 80195632, 85242752, 55034636, 17487496, }, +19346680, 44991392, 63967096, 37875168, -42050952, -119665304, -130808600, -85799488, -48747880, -42614128, +-30416958, 6164352, 28224914, -804233, -64210836, -126092720, -180239920, -237944944, -293541696, -329953344, +-344641056, -349177088, -350809696, -348528544, -341931488, -333844064, -326418592, -319338336, -309974784, -294711520, +-273317216, -251272224, -234176112, -221063040, -206330224, -186406944, -161877856, -135534672, -111140872, -92090008, +-79091288, -70537856, -65754876, -65877284, -71478456, -81757384, -96047816, -113733416, -132603896, -149208768, +-160987184, -167227776, -168843216, -168241392, -168576928, -172385488, -181468816, -197534672, -221246112, -250856160, +-283442624, -317161856, -350805408, -382150624, -408971072, -431287744, -450754144, -468265792, -483745920, -497657856, +-510922880, -523423360, -533833824, -540915136, -544164864, -543285440, -537748160, -527259328, -512605952, -495719744, +-478473312, -461465248, -444370208, -427017984, -409177248, -389593248, -366583520, -339779680, -310380096, -279799936, +-249073744, -219411632, -192223408, -168497472, -148803968, -133796824, -124318904, -121394032, -126326800, -140132976, +-162630544, -192760816, -229733504, -272853888, -320412064, -370109152, -420674880, -471803776, -522449472, -570576768, +-614814912, -655093120, -691254080, -722185856, -746924864, -765859264, -780155584, -790358784, -796305216, -798383424, +-798019392, -796342208, -793002368, -787184320, -779196160, -769785408, -758301696, -743142080, -723924800, -701610816, +-676507840, -647901184, -615899392, -582057728, -547816640, -513594336, -479704352, -447123264, -416993536, -389851488, +-365435680, -343231232, -323292384, -306035200, -290884704, -276268416, -261546336, -247164096, -232224048, -214475104, +-192652368, -163808976, -118643104, -50144816, 27531814, 80195632, 85242752, 55034636, 17487496, }, }, { { 439160, -9365176, 29668024, 40453224, 15341623, -45351632, -109128136, -144421504, -150375392, -144258288, -131021736, --104107856, -71233104, -57051124, -75888312, -118171192, -168489424, -221575760, -273609280, -312674144, -330016704, --333112288, -337341760, -348790528, -362461952, -373274528, -381112320, -386730656, -389323744, -388740704, -386155136, --381738304, -373836096, -360605440, -340908736, -313929376, -279907840, -241828128, -205013280, -174007920, -150196624, --132822936, -121436976, -116219664, -116342072, -119497800, -123473328, -127311960, -130748472, -133538584, -135819744, --138475120, -142795312, -150106416, -161509568, -177308064, -196745472, -218684704, -242115360, -265623328, -287307008, --306123808, -322685728, -337959712, -351861984, -363726272, -373157504, -379437280, -380878240, -375808576, -363919008, --346204960, -324234592, -299991648, -275821184, -253755264, -234803184, -218847904, -204974624, -191987728, -179002432, --165625744, -151641872, -136889200, -121520728, -105938592, -90356448, -74778600, -59408524, -44675176, -30919470, --18438294, -7765301, 328565, 4874251, 4648229, -1475321, -14002130, -33019172, -58642948, -90458456, --126786360, -165555424, -205805712, -247382064, -289544672, -331192448, -372222272, -413219872, -453753088, -492213984, --527374752, -558949760, -586488512, -608848128, -625194240, -635851136, -641718016, -643196032, -640171328, -633021248, --623069824, -611607104, -598890752, -584830656, -570187520, -555927680, -541649088, -525968128, -508355008, -489191392, --468209408, -444536096, -418368992, -391147488, -364010304, -337297728, -311460832, -287304864, -265427904, -246115040, --229447360, -215199872, -203242144, -193907568, -187083408, -181587456, -176594016, -172417168, -168547936, -162928512, --154181280, -140419664, -114481280, -68539624, -9762461, 36551784, 49731428, 34809636, 11406359, }, +9365176, 29668024, 40453224, 15341623, -45351632, -109128136, -144421504, -150375392, -144258288, -131021736, +-104107856, -71233104, -57051124, -75888312, -118171192, -168489424, -221575760, -273609280, -312674144, -330016704, +-333112288, -337341760, -348790528, -362461952, -373274528, -381112320, -386730656, -389323744, -388740704, -386155136, +-381738304, -373836096, -360605440, -340908736, -313929376, -279907840, -241828128, -205013280, -174007920, -150196624, +-132822936, -121436976, -116219664, -116342072, -119497800, -123473328, -127311960, -130748472, -133538584, -135819744, +-138475120, -142795312, -150106416, -161509568, -177308064, -196745472, -218684704, -242115360, -265623328, -287307008, +-306123808, -322685728, -337959712, -351861984, -363726272, -373157504, -379437280, -380878240, -375808576, -363919008, +-346204960, -324234592, -299991648, -275821184, -253755264, -234803184, -218847904, -204974624, -191987728, -179002432, +-165625744, -151641872, -136889200, -121520728, -105938592, -90356448, -74778600, -59408524, -44675176, -30919470, +-18438294, -7765301, 328565, 4874251, 4648229, -1475321, -14002130, -33019172, -58642948, -90458456, +-126786360, -165555424, -205805712, -247382064, -289544672, -331192448, -372222272, -413219872, -453753088, -492213984, +-527374752, -558949760, -586488512, -608848128, -625194240, -635851136, -641718016, -643196032, -640171328, -633021248, +-623069824, -611607104, -598890752, -584830656, -570187520, -555927680, -541649088, -525968128, -508355008, -489191392, +-468209408, -444536096, -418368992, -391147488, -364010304, -337297728, -311460832, -287304864, -265427904, -246115040, +-229447360, -215199872, -203242144, -193907568, -187083408, -181587456, -176594016, -172417168, -168547936, -162928512, +-154181280, -140419664, -114481280, -68539624, -9762461, 36551784, 49731428, 34809636, 11406359, }, { -71346384, --213462560, -339756064, -413504960, -409455872, -352985632, -305631488, -298819136, -300228416, -264136736, -195585824, --136284144, -100468408, -60189672, 7589207, 92245696, 172898736, 241975776, 295543136, 323312800, 321893312, -303480256, 280539744, 252025456, 212051664, 162432976, 109136728, 53380536, -7004555, -71178880, -134117336, --188985008, -229179456, -251300688, -257305056, -251393568, -234900352, -206775824, -168413728, -125017912, -82274392, --43759276, -11020886, 16053514, 39014948, 59700584, 79435424, 99726992, 122451664, 148089936, 174238240, -196432480, 209955712, 211052544, 198057584, 172362400, 137605376, 97203696, 52851720, 5244692, -44642428, --95086816, -143431504, -185908736, -218344320, -237670064, -242820272, -234431664, -214183040, -184224576, -146399328, --101692480, -50829864, 4360466, 60305636, 112264536, 155409632, 185961888, 202288128, 205284400, 197435888, -181369488, 159261680, 133054864, 104489040, 74815648, 44843752, 15293305, -13164612, -40124660, -65403224, --88772144, -109890496, -128330936, -143368688, -153753392, -157929712, -154617216, -143216752, -123850216, -97302488, --65005404, -28906740, 8858370, 46210092, 81095424, 111469432, 135565280, 152172304, 160555008, 160288720, -151451824, 134831376, 111693848, 83490408, 51971788, 19245748, -12685723, -42281804, -68209448, -89182848, --104380592, -113607792, -116795728, -113810192, -104951280, -91091424, -73173896, -52182244, -29644402, -7425999, -13060996, 30902826, 45198624, 55365348, 61724584, 65044596, 65811248, 64531884, 62112208, 59181428, -55647208, 51414516, 46716360, 41342820, 34611532, 26388816, 17041894, 6484327, -5341329, -17431662, --28704878, -38885024, -46234788, -46222976, -36266704, -20924544, -8422431, -2397666, -471910, }, +-213462560, -339756064, -413504960, -409455872, -352985632, -305631488, -298819136, -300228416, -264136736, -195585824, +-136284144, -100468408, -60189672, 7589207, 92245696, 172898736, 241975776, 295543136, 323312800, 321893312, +303480256, 280539744, 252025456, 212051664, 162432976, 109136728, 53380536, -7004555, -71178880, -134117336, +-188985008, -229179456, -251300688, -257305056, -251393568, -234900352, -206775824, -168413728, -125017912, -82274392, +-43759276, -11020886, 16053514, 39014948, 59700584, 79435424, 99726992, 122451664, 148089936, 174238240, +196432480, 209955712, 211052544, 198057584, 172362400, 137605376, 97203696, 52851720, 5244692, -44642428, +-95086816, -143431504, -185908736, -218344320, -237670064, -242820272, -234431664, -214183040, -184224576, -146399328, +-101692480, -50829864, 4360466, 60305636, 112264536, 155409632, 185961888, 202288128, 205284400, 197435888, +181369488, 159261680, 133054864, 104489040, 74815648, 44843752, 15293305, -13164612, -40124660, -65403224, +-88772144, -109890496, -128330936, -143368688, -153753392, -157929712, -154617216, -143216752, -123850216, -97302488, +-65005404, -28906740, 8858370, 46210092, 81095424, 111469432, 135565280, 152172304, 160555008, 160288720, +151451824, 134831376, 111693848, 83490408, 51971788, 19245748, -12685723, -42281804, -68209448, -89182848, +-104380592, -113607792, -116795728, -113810192, -104951280, -91091424, -73173896, -52182244, -29644402, -7425999, +13060996, 30902826, 45198624, 55365348, 61724584, 65044596, 65811248, 64531884, 62112208, 59181428, +55647208, 51414516, 46716360, 41342820, 34611532, 26388816, 17041894, 6484327, -5341329, -17431662, +-28704878, -38885024, -46234788, -46222976, -36266704, -20924544, -8422431, -2397666, -471910, }, }, { { -71346384, --213462560, -339756064, -413504960, -409455872, -352985632, -305631488, -298819136, -300228416, -264136736, -195585824, --136284144, -100468408, -60189672, 7589207, 92245696, 172898736, 241975776, 295543136, 323312800, 321893312, -303480256, 280539744, 252025456, 212051664, 162432976, 109136728, 53380536, -7004555, -71178880, -134117336, --188985008, -229179456, -251300688, -257305056, -251393568, -234900352, -206775824, -168413728, -125017912, -82274392, --43759276, -11020886, 16053514, 39014948, 59700584, 79435424, 99726992, 122451664, 148089936, 174238240, -196432480, 209955712, 211052544, 198057584, 172362400, 137605376, 97203696, 52851720, 5244692, -44642428, --95086816, -143431504, -185908736, -218344320, -237670064, -242820272, -234431664, -214183040, -184224576, -146399328, --101692480, -50829864, 4360466, 60305636, 112264536, 155409632, 185961888, 202288128, 205284400, 197435888, -181369488, 159261680, 133054864, 104489040, 74815648, 44843752, 15293305, -13164612, -40124660, -65403224, --88772144, -109890496, -128330936, -143368688, -153753392, -157929712, -154617216, -143216752, -123850216, -97302488, --65005404, -28906740, 8858370, 46210092, 81095424, 111469432, 135565280, 152172304, 160555008, 160288720, -151451824, 134831376, 111693848, 83490408, 51971788, 19245748, -12685723, -42281804, -68209448, -89182848, --104380592, -113607792, -116795728, -113810192, -104951280, -91091424, -73173896, -52182244, -29644402, -7425999, -13060996, 30902826, 45198624, 55365348, 61724584, 65044596, 65811248, 64531884, 62112208, 59181428, -55647208, 51414516, 46716360, 41342820, 34611532, 26388816, 17041894, 6484327, -5341329, -17431662, --28704878, -38885024, -46234788, -46222976, -36266704, -20924544, -8422431, -2397666, -471910, }, +-213462560, -339756064, -413504960, -409455872, -352985632, -305631488, -298819136, -300228416, -264136736, -195585824, +-136284144, -100468408, -60189672, 7589207, 92245696, 172898736, 241975776, 295543136, 323312800, 321893312, +303480256, 280539744, 252025456, 212051664, 162432976, 109136728, 53380536, -7004555, -71178880, -134117336, +-188985008, -229179456, -251300688, -257305056, -251393568, -234900352, -206775824, -168413728, -125017912, -82274392, +-43759276, -11020886, 16053514, 39014948, 59700584, 79435424, 99726992, 122451664, 148089936, 174238240, +196432480, 209955712, 211052544, 198057584, 172362400, 137605376, 97203696, 52851720, 5244692, -44642428, +-95086816, -143431504, -185908736, -218344320, -237670064, -242820272, -234431664, -214183040, -184224576, -146399328, +-101692480, -50829864, 4360466, 60305636, 112264536, 155409632, 185961888, 202288128, 205284400, 197435888, +181369488, 159261680, 133054864, 104489040, 74815648, 44843752, 15293305, -13164612, -40124660, -65403224, +-88772144, -109890496, -128330936, -143368688, -153753392, -157929712, -154617216, -143216752, -123850216, -97302488, +-65005404, -28906740, 8858370, 46210092, 81095424, 111469432, 135565280, 152172304, 160555008, 160288720, +151451824, 134831376, 111693848, 83490408, 51971788, 19245748, -12685723, -42281804, -68209448, -89182848, +-104380592, -113607792, -116795728, -113810192, -104951280, -91091424, -73173896, -52182244, -29644402, -7425999, +13060996, 30902826, 45198624, 55365348, 61724584, 65044596, 65811248, 64531884, 62112208, 59181428, +55647208, 51414516, 46716360, 41342820, 34611532, 26388816, 17041894, 6484327, -5341329, -17431662, +-28704878, -38885024, -46234788, -46222976, -36266704, -20924544, -8422431, -2397666, -471910, }, { 439160, -9365176, 29668024, 40453224, 15341623, -45351632, -109128136, -144421504, -150375392, -144258288, -131021736, --104107856, -71233104, -57051124, -75888312, -118171192, -168489424, -221575760, -273609280, -312674144, -330016704, --333112288, -337341760, -348790528, -362461952, -373274528, -381112320, -386730656, -389323744, -388740704, -386155136, --381738304, -373836096, -360605440, -340908736, -313929376, -279907840, -241828128, -205013280, -174007920, -150196624, --132822936, -121436976, -116219664, -116342072, -119497800, -123473328, -127311960, -130748472, -133538584, -135819744, --138475120, -142795312, -150106416, -161509568, -177308064, -196745472, -218684704, -242115360, -265623328, -287307008, --306123808, -322685728, -337959712, -351861984, -363726272, -373157504, -379437280, -380878240, -375808576, -363919008, --346204960, -324234592, -299991648, -275821184, -253755264, -234803184, -218847904, -204974624, -191987728, -179002432, --165625744, -151641872, -136889200, -121520728, -105938592, -90356448, -74778600, -59408524, -44675176, -30919470, --18438294, -7765301, 328565, 4874251, 4648229, -1475321, -14002130, -33019172, -58642948, -90458456, --126786360, -165555424, -205805712, -247382064, -289544672, -331192448, -372222272, -413219872, -453753088, -492213984, --527374752, -558949760, -586488512, -608848128, -625194240, -635851136, -641718016, -643196032, -640171328, -633021248, --623069824, -611607104, -598890752, -584830656, -570187520, -555927680, -541649088, -525968128, -508355008, -489191392, --468209408, -444536096, -418368992, -391147488, -364010304, -337297728, -311460832, -287304864, -265427904, -246115040, --229447360, -215199872, -203242144, -193907568, -187083408, -181587456, -176594016, -172417168, -168547936, -162928512, --154181280, -140419664, -114481280, -68539624, -9762461, 36551784, 49731428, 34809636, 11406359, }, +9365176, 29668024, 40453224, 15341623, -45351632, -109128136, -144421504, -150375392, -144258288, -131021736, +-104107856, -71233104, -57051124, -75888312, -118171192, -168489424, -221575760, -273609280, -312674144, -330016704, +-333112288, -337341760, -348790528, -362461952, -373274528, -381112320, -386730656, -389323744, -388740704, -386155136, +-381738304, -373836096, -360605440, -340908736, -313929376, -279907840, -241828128, -205013280, -174007920, -150196624, +-132822936, -121436976, -116219664, -116342072, -119497800, -123473328, -127311960, -130748472, -133538584, -135819744, +-138475120, -142795312, -150106416, -161509568, -177308064, -196745472, -218684704, -242115360, -265623328, -287307008, +-306123808, -322685728, -337959712, -351861984, -363726272, -373157504, -379437280, -380878240, -375808576, -363919008, +-346204960, -324234592, -299991648, -275821184, -253755264, -234803184, -218847904, -204974624, -191987728, -179002432, +-165625744, -151641872, -136889200, -121520728, -105938592, -90356448, -74778600, -59408524, -44675176, -30919470, +-18438294, -7765301, 328565, 4874251, 4648229, -1475321, -14002130, -33019172, -58642948, -90458456, +-126786360, -165555424, -205805712, -247382064, -289544672, -331192448, -372222272, -413219872, -453753088, -492213984, +-527374752, -558949760, -586488512, -608848128, -625194240, -635851136, -641718016, -643196032, -640171328, -633021248, +-623069824, -611607104, -598890752, -584830656, -570187520, -555927680, -541649088, -525968128, -508355008, -489191392, +-468209408, -444536096, -418368992, -391147488, -364010304, -337297728, -311460832, -287304864, -265427904, -246115040, +-229447360, -215199872, -203242144, -193907568, -187083408, -181587456, -176594016, -172417168, -168547936, -162928512, +-154181280, -140419664, -114481280, -68539624, -9762461, 36551784, 49731428, 34809636, 11406359, }, }, }; const Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 665281280, -674784448, 698239808, 731240192, 748593472, 727196992, 689475904, 685777408, 708633664, 676513152, 556107520, -451947584, 493353760, 659701056, 808494336, 867047040, 900015232, 977696704, 1075521024, 1138411136, 1160941952, -1154109824, 1096802048, 976626176, 839007872, 747508480, 718602816, 727278080, 754160832, 799917248, 870264512, -967069888, 1082529280, 1192306048, 1267405184, 1298377728, 1297374848, 1278310528, 1247297664, 1207363072, 1159006592, -1100992896, 1040038144, 991227968, 961344128, 942479040, 926492096, 911659968, 892559168, 860845632, 819307968, -779264384, 743933440, 709595200, 678932864, 656769728, 638880704, 620198656, 604545664, 592851520, 575412864, -547787648, 516941728, 481964064, 430530752, 362592960, 292907104, 225806832, 155925024, 93299040, 53560928, -27193048, -3490198, -27827094, -33299418, -51461760, -118380576, -203644800, -245106800, -242138976, }, +674784448, 698239808, 731240192, 748593472, 727196992, 689475904, 685777408, 708633664, 676513152, 556107520, +451947584, 493353760, 659701056, 808494336, 867047040, 900015232, 977696704, 1075521024, 1138411136, 1160941952, +1154109824, 1096802048, 976626176, 839007872, 747508480, 718602816, 727278080, 754160832, 799917248, 870264512, +967069888, 1082529280, 1192306048, 1267405184, 1298377728, 1297374848, 1278310528, 1247297664, 1207363072, 1159006592, +1100992896, 1040038144, 991227968, 961344128, 942479040, 926492096, 911659968, 892559168, 860845632, 819307968, +779264384, 743933440, 709595200, 678932864, 656769728, 638880704, 620198656, 604545664, 592851520, 575412864, +547787648, 516941728, 481964064, 430530752, 362592960, 292907104, 225806832, 155925024, 93299040, 53560928, +27193048, -3490198, -27827094, -33299418, -51461760, -118380576, -203644800, -245106800, -242138976, }, { 524114848, -533789280, 470712320, 324263040, 183661936, 95593624, 13487271, -82588464, -127956200, -79816064, 7536057, -54663124, 30402462, -71739912, -247676272, -438472672, -547349568, -541801024, -482090752, -423726432, -356343232, --266416288, -190427040, -161387152, -155142816, -132955544, -95782600, -57178364, 214212, 98348848, 218841472, -323258016, 402958112, 474727552, 535242048, 552199104, 505210560, 414675328, 321215232, 247467968, 188448128, -131875360, 74614320, 17566416, -42997992, -109456704, -174512032, -228280736, -269658976, -302424768, -324817632, --332062176, -325179488, -308778080, -284093824, -251596496, -215451664, -178305568, -136985840, -89327264, -39129300, -10106595, 58457188, 102657768, 135197520, 154283280, 165445360, 170970832, 168290240, 159845792, 152339264, -145684752, 135665664, 126222112, 123444880, 118667264, 95619392, 55449100, 18055506, -1458678, }, +533789280, 470712320, 324263040, 183661936, 95593624, 13487271, -82588464, -127956200, -79816064, 7536057, +54663124, 30402462, -71739912, -247676272, -438472672, -547349568, -541801024, -482090752, -423726432, -356343232, +-266416288, -190427040, -161387152, -155142816, -132955544, -95782600, -57178364, 214212, 98348848, 218841472, +323258016, 402958112, 474727552, 535242048, 552199104, 505210560, 414675328, 321215232, 247467968, 188448128, +131875360, 74614320, 17566416, -42997992, -109456704, -174512032, -228280736, -269658976, -302424768, -324817632, +-332062176, -325179488, -308778080, -284093824, -251596496, -215451664, -178305568, -136985840, -89327264, -39129300, +10106595, 58457188, 102657768, 135197520, 154283280, 165445360, 170970832, 168290240, 159845792, 152339264, +145684752, 135665664, 126222112, 123444880, 118667264, 95619392, 55449100, 18055506, -1458678, }, }, { { 524114848, -533789280, 470712320, 324263040, 183661936, 95593624, 13487271, -82588464, -127956200, -79816064, 7536057, -54663124, 30402462, -71739912, -247676272, -438472672, -547349568, -541801024, -482090752, -423726432, -356343232, --266416288, -190427040, -161387152, -155142816, -132955544, -95782600, -57178364, 214212, 98348848, 218841472, -323258016, 402958112, 474727552, 535242048, 552199104, 505210560, 414675328, 321215232, 247467968, 188448128, -131875360, 74614320, 17566416, -42997992, -109456704, -174512032, -228280736, -269658976, -302424768, -324817632, --332062176, -325179488, -308778080, -284093824, -251596496, -215451664, -178305568, -136985840, -89327264, -39129300, -10106595, 58457188, 102657768, 135197520, 154283280, 165445360, 170970832, 168290240, 159845792, 152339264, -145684752, 135665664, 126222112, 123444880, 118667264, 95619392, 55449100, 18055506, -1458678, }, +533789280, 470712320, 324263040, 183661936, 95593624, 13487271, -82588464, -127956200, -79816064, 7536057, +54663124, 30402462, -71739912, -247676272, -438472672, -547349568, -541801024, -482090752, -423726432, -356343232, +-266416288, -190427040, -161387152, -155142816, -132955544, -95782600, -57178364, 214212, 98348848, 218841472, +323258016, 402958112, 474727552, 535242048, 552199104, 505210560, 414675328, 321215232, 247467968, 188448128, +131875360, 74614320, 17566416, -42997992, -109456704, -174512032, -228280736, -269658976, -302424768, -324817632, +-332062176, -325179488, -308778080, -284093824, -251596496, -215451664, -178305568, -136985840, -89327264, -39129300, +10106595, 58457188, 102657768, 135197520, 154283280, 165445360, 170970832, 168290240, 159845792, 152339264, +145684752, 135665664, 126222112, 123444880, 118667264, 95619392, 55449100, 18055506, -1458678, }, { 665281280, -674784448, 698239808, 731240192, 748593472, 727196992, 689475904, 685777408, 708633664, 676513152, 556107520, -451947584, 493353760, 659701056, 808494336, 867047040, 900015232, 977696704, 1075521024, 1138411136, 1160941952, -1154109824, 1096802048, 976626176, 839007872, 747508480, 718602816, 727278080, 754160832, 799917248, 870264512, -967069888, 1082529280, 1192306048, 1267405184, 1298377728, 1297374848, 1278310528, 1247297664, 1207363072, 1159006592, -1100992896, 1040038144, 991227968, 961344128, 942479040, 926492096, 911659968, 892559168, 860845632, 819307968, -779264384, 743933440, 709595200, 678932864, 656769728, 638880704, 620198656, 604545664, 592851520, 575412864, -547787648, 516941728, 481964064, 430530752, 362592960, 292907104, 225806832, 155925024, 93299040, 53560928, -27193048, -3490198, -27827094, -33299418, -51461760, -118380576, -203644800, -245106800, -242138976, }, +674784448, 698239808, 731240192, 748593472, 727196992, 689475904, 685777408, 708633664, 676513152, 556107520, +451947584, 493353760, 659701056, 808494336, 867047040, 900015232, 977696704, 1075521024, 1138411136, 1160941952, +1154109824, 1096802048, 976626176, 839007872, 747508480, 718602816, 727278080, 754160832, 799917248, 870264512, +967069888, 1082529280, 1192306048, 1267405184, 1298377728, 1297374848, 1278310528, 1247297664, 1207363072, 1159006592, +1100992896, 1040038144, 991227968, 961344128, 942479040, 926492096, 911659968, 892559168, 860845632, 819307968, +779264384, 743933440, 709595200, 678932864, 656769728, 638880704, 620198656, 604545664, 592851520, 575412864, +547787648, 516941728, 481964064, 430530752, 362592960, 292907104, 225806832, 155925024, 93299040, 53560928, +27193048, -3490198, -27827094, -33299418, -51461760, -118380576, -203644800, -245106800, -242138976, }, }, { { 602370240, -637539008, 669323968, 636987136, 540635456, 483809280, 541556736, 613094208, 531643392, 322999264, 215506432, -347957856, 588924864, 718721408, 697091968, 661672448, 721040704, 843483776, 931750208, 931413056, 856077184, -753607296, 668653952, 621145664, 607285312, 618784000, 656078784, 721098688, 805003584, 887858304, 946848640, -965448000, 942007680, 891112832, 830678336, 766307520, 693250688, 613766400, 545172544, 506799712, 503085632, -522555264, 548847936, 568437824, 572668416, 560602752, 539573504, 516954080, 491754976, 459128256, 420713536, -383797216, 352052032, 324045632, 299112800, 277784000, 258055056, 237306608, 215845200, 194331696, 171894256, -150265344, 133504760, 120547384, 105984224, 90401008, 79930952, 74162808, 66552128, 57468808, 52935472, -51010788, 45456324, 40671728, 43430172, 42086384, 16999480, -28233504, -68147176, -87076168, }, +637539008, 669323968, 636987136, 540635456, 483809280, 541556736, 613094208, 531643392, 322999264, 215506432, +347957856, 588924864, 718721408, 697091968, 661672448, 721040704, 843483776, 931750208, 931413056, 856077184, +753607296, 668653952, 621145664, 607285312, 618784000, 656078784, 721098688, 805003584, 887858304, 946848640, +965448000, 942007680, 891112832, 830678336, 766307520, 693250688, 613766400, 545172544, 506799712, 503085632, +522555264, 548847936, 568437824, 572668416, 560602752, 539573504, 516954080, 491754976, 459128256, 420713536, +383797216, 352052032, 324045632, 299112800, 277784000, 258055056, 237306608, 215845200, 194331696, 171894256, +150265344, 133504760, 120547384, 105984224, 90401008, 79930952, 74162808, 66552128, 57468808, 52935472, +51010788, 45456324, 40671728, 43430172, 42086384, 16999480, -28233504, -68147176, -87076168, }, { 602370240, -637539008, 669323968, 636987136, 540635456, 483809280, 541556736, 613094208, 531643392, 322999264, 215506432, -347957856, 588924864, 718721408, 697091968, 661672448, 721040704, 843483776, 931750208, 931413056, 856077184, -753607296, 668653952, 621145664, 607285312, 618784000, 656078784, 721098688, 805003584, 887858304, 946848640, -965448000, 942007680, 891112832, 830678336, 766307520, 693250688, 613766400, 545172544, 506799712, 503085632, -522555264, 548847936, 568437824, 572668416, 560602752, 539573504, 516954080, 491754976, 459128256, 420713536, -383797216, 352052032, 324045632, 299112800, 277784000, 258055056, 237306608, 215845200, 194331696, 171894256, -150265344, 133504760, 120547384, 105984224, 90401008, 79930952, 74162808, 66552128, 57468808, 52935472, -51010788, 45456324, 40671728, 43430172, 42086384, 16999480, -28233504, -68147176, -87076168, }, +637539008, 669323968, 636987136, 540635456, 483809280, 541556736, 613094208, 531643392, 322999264, 215506432, +347957856, 588924864, 718721408, 697091968, 661672448, 721040704, 843483776, 931750208, 931413056, 856077184, +753607296, 668653952, 621145664, 607285312, 618784000, 656078784, 721098688, 805003584, 887858304, 946848640, +965448000, 942007680, 891112832, 830678336, 766307520, 693250688, 613766400, 545172544, 506799712, 503085632, +522555264, 548847936, 568437824, 572668416, 560602752, 539573504, 516954080, 491754976, 459128256, 420713536, +383797216, 352052032, 324045632, 299112800, 277784000, 258055056, 237306608, 215845200, 194331696, 171894256, +150265344, 133504760, 120547384, 105984224, 90401008, 79930952, 74162808, 66552128, 57468808, 52935472, +51010788, 45456324, 40671728, 43430172, 42086384, 16999480, -28233504, -68147176, -87076168, }, }, { { 554296640, -547196032, 566668864, 618661056, 679085312, 742984256, 811807872, 848410112, 818592320, 762813568, 748776000, -765459264, 744624384, 676696768, 620590016, 601593408, 582660096, 541901952, 502089728, 473425120, 434916992, -384839264, 352291456, 348175808, 352792896, 356490880, 367396864, 376819488, 360623712, 319377536, 280715296, -259372000, 245877744, 234353280, 232350752, 242504592, 258529120, 279809056, 311139776, 349029984, 382816352, -406947072, 421723360, 426924576, 423932608, 419369728, 419914112, 427815264, 444200544, 470166304, 502258848, -532944224, 556508608, 569734400, 568993536, 552990464, 526220992, 494308864, 458682112, 419633888, 379832416, -340900160, 301575424, 262233520, 225994192, 194006896, 165567776, 142686336, 127879968, 119163864, 114121576, -114892520, 121773600, 129415416, 138241040, 157090576, 180498144, 179665456, 140071232, 95798168, }, +547196032, 566668864, 618661056, 679085312, 742984256, 811807872, 848410112, 818592320, 762813568, 748776000, +765459264, 744624384, 676696768, 620590016, 601593408, 582660096, 541901952, 502089728, 473425120, 434916992, +384839264, 352291456, 348175808, 352792896, 356490880, 367396864, 376819488, 360623712, 319377536, 280715296, +259372000, 245877744, 234353280, 232350752, 242504592, 258529120, 279809056, 311139776, 349029984, 382816352, +406947072, 421723360, 426924576, 423932608, 419369728, 419914112, 427815264, 444200544, 470166304, 502258848, +532944224, 556508608, 569734400, 568993536, 552990464, 526220992, 494308864, 458682112, 419633888, 379832416, +340900160, 301575424, 262233520, 225994192, 194006896, 165567776, 142686336, 127879968, 119163864, 114121576, +114892520, 121773600, 129415416, 138241040, 157090576, 180498144, 179665456, 140071232, 95798168, }, { 477454336, -401040416, 262195936, 104383808, -22741314, -110121352, -182601616, -243891872, -265826256, -240394688, -202544208, --183463280, -174869600, -159462480, -144265264, -136873088, -113585240, -42030548, 75551696, 202205984, 299249152, -345080224, 335348352, 282432224, 208138944, 126522224, 40561672, -41695544, -102866080, -134796480, -147696416, --154232272, -156779184, -154798144, -151095344, -144431696, -126498064, -91458648, -41634340, 16705812, 75270912, -122406568, 148172080, 150975072, 135045584, 105265352, 68783368, 35770636, 12797392, -663572, -7075422, --8021389, -7206955, -8933532, -12796855, -15990163, -19165754, -23754928, -27308476, -28304908, -30581240, --36782100, -43931072, -50539952, -59223304, -67665600, -67461048, -55589760, -35688492, -7253663, 31792422, -72493680, 101975408, 120829240, 134001368, 129902360, 94151048, 40635224, 1247151, -13009456, }, +401040416, 262195936, 104383808, -22741314, -110121352, -182601616, -243891872, -265826256, -240394688, -202544208, +-183463280, -174869600, -159462480, -144265264, -136873088, -113585240, -42030548, 75551696, 202205984, 299249152, +345080224, 335348352, 282432224, 208138944, 126522224, 40561672, -41695544, -102866080, -134796480, -147696416, +-154232272, -156779184, -154798144, -151095344, -144431696, -126498064, -91458648, -41634340, 16705812, 75270912, +122406568, 148172080, 150975072, 135045584, 105265352, 68783368, 35770636, 12797392, -663572, -7075422, +-8021389, -7206955, -8933532, -12796855, -15990163, -19165754, -23754928, -27308476, -28304908, -30581240, +-36782100, -43931072, -50539952, -59223304, -67665600, -67461048, -55589760, -35688492, -7253663, 31792422, +72493680, 101975408, 120829240, 134001368, 129902360, 94151048, 40635224, 1247151, -13009456, }, }, { { 477454336, -401040416, 262195936, 104383808, -22741314, -110121352, -182601616, -243891872, -265826256, -240394688, -202544208, --183463280, -174869600, -159462480, -144265264, -136873088, -113585240, -42030548, 75551696, 202205984, 299249152, -345080224, 335348352, 282432224, 208138944, 126522224, 40561672, -41695544, -102866080, -134796480, -147696416, --154232272, -156779184, -154798144, -151095344, -144431696, -126498064, -91458648, -41634340, 16705812, 75270912, -122406568, 148172080, 150975072, 135045584, 105265352, 68783368, 35770636, 12797392, -663572, -7075422, --8021389, -7206955, -8933532, -12796855, -15990163, -19165754, -23754928, -27308476, -28304908, -30581240, --36782100, -43931072, -50539952, -59223304, -67665600, -67461048, -55589760, -35688492, -7253663, 31792422, -72493680, 101975408, 120829240, 134001368, 129902360, 94151048, 40635224, 1247151, -13009456, }, +401040416, 262195936, 104383808, -22741314, -110121352, -182601616, -243891872, -265826256, -240394688, -202544208, +-183463280, -174869600, -159462480, -144265264, -136873088, -113585240, -42030548, 75551696, 202205984, 299249152, +345080224, 335348352, 282432224, 208138944, 126522224, 40561672, -41695544, -102866080, -134796480, -147696416, +-154232272, -156779184, -154798144, -151095344, -144431696, -126498064, -91458648, -41634340, 16705812, 75270912, +122406568, 148172080, 150975072, 135045584, 105265352, 68783368, 35770636, 12797392, -663572, -7075422, +-8021389, -7206955, -8933532, -12796855, -15990163, -19165754, -23754928, -27308476, -28304908, -30581240, +-36782100, -43931072, -50539952, -59223304, -67665600, -67461048, -55589760, -35688492, -7253663, 31792422, +72493680, 101975408, 120829240, 134001368, 129902360, 94151048, 40635224, 1247151, -13009456, }, { 554296640, -547196032, 566668864, 618661056, 679085312, 742984256, 811807872, 848410112, 818592320, 762813568, 748776000, -765459264, 744624384, 676696768, 620590016, 601593408, 582660096, 541901952, 502089728, 473425120, 434916992, -384839264, 352291456, 348175808, 352792896, 356490880, 367396864, 376819488, 360623712, 319377536, 280715296, -259372000, 245877744, 234353280, 232350752, 242504592, 258529120, 279809056, 311139776, 349029984, 382816352, -406947072, 421723360, 426924576, 423932608, 419369728, 419914112, 427815264, 444200544, 470166304, 502258848, -532944224, 556508608, 569734400, 568993536, 552990464, 526220992, 494308864, 458682112, 419633888, 379832416, -340900160, 301575424, 262233520, 225994192, 194006896, 165567776, 142686336, 127879968, 119163864, 114121576, -114892520, 121773600, 129415416, 138241040, 157090576, 180498144, 179665456, 140071232, 95798168, }, +547196032, 566668864, 618661056, 679085312, 742984256, 811807872, 848410112, 818592320, 762813568, 748776000, +765459264, 744624384, 676696768, 620590016, 601593408, 582660096, 541901952, 502089728, 473425120, 434916992, +384839264, 352291456, 348175808, 352792896, 356490880, 367396864, 376819488, 360623712, 319377536, 280715296, +259372000, 245877744, 234353280, 232350752, 242504592, 258529120, 279809056, 311139776, 349029984, 382816352, +406947072, 421723360, 426924576, 423932608, 419369728, 419914112, 427815264, 444200544, 470166304, 502258848, +532944224, 556508608, 569734400, 568993536, 552990464, 526220992, 494308864, 458682112, 419633888, 379832416, +340900160, 301575424, 262233520, 225994192, 194006896, 165567776, 142686336, 127879968, 119163864, 114121576, +114892520, 121773600, 129415416, 138241040, 157090576, 180498144, 179665456, 140071232, 95798168, }, }, { { 621756672, -610452800, 630615552, 702445632, 792348480, 858193536, 893816000, 907361792, 886694400, 824003968, 755261440, -727917504, 733139136, 716980352, 663897280, 620523968, 620393024, 632726528, 615048448, 577073984, 555149248, -552123392, 543052416, 523071168, 510752672, 511525760, 510709184, 501455136, 494210624, 497641216, 508644928, -521307040, 531829696, 535974336, 532874432, 529774560, 535202848, 550437632, 572668928, 600793984, 632921920, -664218304, 691969728, 717544640, 740619840, 757538304, 767474688, 774215616, 780483072, 786036992, 791412672, -797712320, 802936640, 803587840, 798848320, 789148160, 773271808, 750862848, 724289856, 694559040, 659781056, -620432192, 580501888, 540989760, 498887296, 454513856, 412135392, 371802432, 329539968, 287038560, 251136944, -222513664, 196285904, 175022064, 167052224, 167232608, 153102160, 109348792, 49311592, 6205691, }, +610452800, 630615552, 702445632, 792348480, 858193536, 893816000, 907361792, 886694400, 824003968, 755261440, +727917504, 733139136, 716980352, 663897280, 620523968, 620393024, 632726528, 615048448, 577073984, 555149248, +552123392, 543052416, 523071168, 510752672, 511525760, 510709184, 501455136, 494210624, 497641216, 508644928, +521307040, 531829696, 535974336, 532874432, 529774560, 535202848, 550437632, 572668928, 600793984, 632921920, +664218304, 691969728, 717544640, 740619840, 757538304, 767474688, 774215616, 780483072, 786036992, 791412672, +797712320, 802936640, 803587840, 798848320, 789148160, 773271808, 750862848, 724289856, 694559040, 659781056, +620432192, 580501888, 540989760, 498887296, 454513856, 412135392, 371802432, 329539968, 287038560, 251136944, +222513664, 196285904, 175022064, 167052224, 167232608, 153102160, 109348792, 49311592, 6205691, }, { 484072864, -362911328, 165609648, -41981156, -212093008, -332805216, -402363808, -400033792, -304724160, -137953808, 36216776, -160706944, 222448160, 239901840, 229993344, 195366256, 135999072, 62549756, -7023882, -63296008, -110795120, --152567968, -176795888, -168798656, -131159712, -80323408, -26991722, 27882928, 80286360, 119317952, 137106096, -133840304, 113017232, 78420200, 35158064, -11215233, -55674588, -91772712, -112176496, -113720000, -99439232, --74932144, -45231376, -14150307, 16697759, 47128676, 74521440, 93131000, 98641440, 90078352, 67349920, -32195612, -8400956, -45283988, -73177112, -89565104, -91423744, -79084840, -59047212, -37090264, -13511430, -10936597, 32290638, 50281720, 68347960, 83755624, 88343720, 79904648, 60663192, 27116276, -22636088, --75426072, -114201568, -134971488, -134073848, -95666104, -22046604, 41375568, 52510808, 32166084, }, +362911328, 165609648, -41981156, -212093008, -332805216, -402363808, -400033792, -304724160, -137953808, 36216776, +160706944, 222448160, 239901840, 229993344, 195366256, 135999072, 62549756, -7023882, -63296008, -110795120, +-152567968, -176795888, -168798656, -131159712, -80323408, -26991722, 27882928, 80286360, 119317952, 137106096, +133840304, 113017232, 78420200, 35158064, -11215233, -55674588, -91772712, -112176496, -113720000, -99439232, +-74932144, -45231376, -14150307, 16697759, 47128676, 74521440, 93131000, 98641440, 90078352, 67349920, +32195612, -8400956, -45283988, -73177112, -89565104, -91423744, -79084840, -59047212, -37090264, -13511430, +10936597, 32290638, 50281720, 68347960, 83755624, 88343720, 79904648, 60663192, 27116276, -22636088, +-75426072, -114201568, -134971488, -134073848, -95666104, -22046604, 41375568, 52510808, 32166084, }, }, { { 484072864, -362911328, 165609648, -41981156, -212093008, -332805216, -402363808, -400033792, -304724160, -137953808, 36216776, -160706944, 222448160, 239901840, 229993344, 195366256, 135999072, 62549756, -7023882, -63296008, -110795120, --152567968, -176795888, -168798656, -131159712, -80323408, -26991722, 27882928, 80286360, 119317952, 137106096, -133840304, 113017232, 78420200, 35158064, -11215233, -55674588, -91772712, -112176496, -113720000, -99439232, --74932144, -45231376, -14150307, 16697759, 47128676, 74521440, 93131000, 98641440, 90078352, 67349920, -32195612, -8400956, -45283988, -73177112, -89565104, -91423744, -79084840, -59047212, -37090264, -13511430, -10936597, 32290638, 50281720, 68347960, 83755624, 88343720, 79904648, 60663192, 27116276, -22636088, --75426072, -114201568, -134971488, -134073848, -95666104, -22046604, 41375568, 52510808, 32166084, }, +362911328, 165609648, -41981156, -212093008, -332805216, -402363808, -400033792, -304724160, -137953808, 36216776, +160706944, 222448160, 239901840, 229993344, 195366256, 135999072, 62549756, -7023882, -63296008, -110795120, +-152567968, -176795888, -168798656, -131159712, -80323408, -26991722, 27882928, 80286360, 119317952, 137106096, +133840304, 113017232, 78420200, 35158064, -11215233, -55674588, -91772712, -112176496, -113720000, -99439232, +-74932144, -45231376, -14150307, 16697759, 47128676, 74521440, 93131000, 98641440, 90078352, 67349920, +32195612, -8400956, -45283988, -73177112, -89565104, -91423744, -79084840, -59047212, -37090264, -13511430, +10936597, 32290638, 50281720, 68347960, 83755624, 88343720, 79904648, 60663192, 27116276, -22636088, +-75426072, -114201568, -134971488, -134073848, -95666104, -22046604, 41375568, 52510808, 32166084, }, { 621756672, -610452800, 630615552, 702445632, 792348480, 858193536, 893816000, 907361792, 886694400, 824003968, 755261440, -727917504, 733139136, 716980352, 663897280, 620523968, 620393024, 632726528, 615048448, 577073984, 555149248, -552123392, 543052416, 523071168, 510752672, 511525760, 510709184, 501455136, 494210624, 497641216, 508644928, -521307040, 531829696, 535974336, 532874432, 529774560, 535202848, 550437632, 572668928, 600793984, 632921920, -664218304, 691969728, 717544640, 740619840, 757538304, 767474688, 774215616, 780483072, 786036992, 791412672, -797712320, 802936640, 803587840, 798848320, 789148160, 773271808, 750862848, 724289856, 694559040, 659781056, -620432192, 580501888, 540989760, 498887296, 454513856, 412135392, 371802432, 329539968, 287038560, 251136944, -222513664, 196285904, 175022064, 167052224, 167232608, 153102160, 109348792, 49311592, 6205691, }, +610452800, 630615552, 702445632, 792348480, 858193536, 893816000, 907361792, 886694400, 824003968, 755261440, +727917504, 733139136, 716980352, 663897280, 620523968, 620393024, 632726528, 615048448, 577073984, 555149248, +552123392, 543052416, 523071168, 510752672, 511525760, 510709184, 501455136, 494210624, 497641216, 508644928, +521307040, 531829696, 535974336, 532874432, 529774560, 535202848, 550437632, 572668928, 600793984, 632921920, +664218304, 691969728, 717544640, 740619840, 757538304, 767474688, 774215616, 780483072, 786036992, 791412672, +797712320, 802936640, 803587840, 798848320, 789148160, 773271808, 750862848, 724289856, 694559040, 659781056, +620432192, 580501888, 540989760, 498887296, 454513856, 412135392, 371802432, 329539968, 287038560, 251136944, +222513664, 196285904, 175022064, 167052224, 167232608, 153102160, 109348792, 49311592, 6205691, }, }, { { 663314752, -680615424, 704123904, 749817024, 838668608, 933881600, 965105984, 926342848, 883536512, 867071744, 829009728, -740681600, 661032000, 653968896, 694012480, 715598464, 713035968, 725833920, 755362368, 764999168, 750177792, -746233920, 766158272, 779788864, 761093952, 720125888, 682184128, 661349248, 657734528, 661714368, 660551488, -654196544, 660604096, 694720064, 748607424, 801209536, 839960832, 865090176, 880818880, 890421376, 895874368, -898570496, 902171328, 912473856, 930828928, 952021376, 972181952, 992491264, 1012047872, 1025152832, 1028589376, -1023516992, 1009262528, 984214848, 952265088, 919344704, 886117760, 852254656, 821971904, 796597248, 769538944, -736346880, 699329664, 656234496, 598574016, 526703104, 450481408, 372134208, 287646848, 204881744, 136896720, -79741976, 23230404, -23418310, -49200996, -74181600, -124141200, -181532704, -207284784, -203362400, }, +680615424, 704123904, 749817024, 838668608, 933881600, 965105984, 926342848, 883536512, 867071744, 829009728, +740681600, 661032000, 653968896, 694012480, 715598464, 713035968, 725833920, 755362368, 764999168, 750177792, +746233920, 766158272, 779788864, 761093952, 720125888, 682184128, 661349248, 657734528, 661714368, 660551488, +654196544, 660604096, 694720064, 748607424, 801209536, 839960832, 865090176, 880818880, 890421376, 895874368, +898570496, 902171328, 912473856, 930828928, 952021376, 972181952, 992491264, 1012047872, 1025152832, 1028589376, +1023516992, 1009262528, 984214848, 952265088, 919344704, 886117760, 852254656, 821971904, 796597248, 769538944, +736346880, 699329664, 656234496, 598574016, 526703104, 450481408, 372134208, 287646848, 204881744, 136896720, +79741976, 23230404, -23418310, -49200996, -74181600, -124141200, -181532704, -207284784, -203362400, }, { 491119840, -348995616, 128621384, -97632120, -289412608, -423000064, -463336768, -380973248, -195104256, 24281598, 206642144, -322000672, 370486560, 351555424, 260226160, 107231376, -71365176, -228021424, -325345920, -347531584, -296888000, --184866672, -31224950, 129964640, 255163472, 311949920, 293880992, 214185728, 93033288, -44268228, -166360192, --244839984, -264906608, -226057552, -138746240, -24590836, 86406152, 166708624, 201445776, 189976064, 141800496, -71440336, -6223408, -77591272, -129388576, -151008896, -140083584, -102848896, -48852032, 10887205, 62631896, -94646048, 104201816, 95234992, 71203576, 35948876, -2226404, -34846680, -58946816, -73388640, -74912816, --63276680, -43950400, -20984674, 5622112, 32672354, 53384832, 66130684, 72770168, 68470368, 46321760, -10834592, -26956826, -62720480, -90538984, -91584808, -56170656, -9368934, 13955422, 13662291, }, +348995616, 128621384, -97632120, -289412608, -423000064, -463336768, -380973248, -195104256, 24281598, 206642144, +322000672, 370486560, 351555424, 260226160, 107231376, -71365176, -228021424, -325345920, -347531584, -296888000, +-184866672, -31224950, 129964640, 255163472, 311949920, 293880992, 214185728, 93033288, -44268228, -166360192, +-244839984, -264906608, -226057552, -138746240, -24590836, 86406152, 166708624, 201445776, 189976064, 141800496, +71440336, -6223408, -77591272, -129388576, -151008896, -140083584, -102848896, -48852032, 10887205, 62631896, +94646048, 104201816, 95234992, 71203576, 35948876, -2226404, -34846680, -58946816, -73388640, -74912816, +-63276680, -43950400, -20984674, 5622112, 32672354, 53384832, 66130684, 72770168, 68470368, 46321760, +10834592, -26956826, -62720480, -90538984, -91584808, -56170656, -9368934, 13955422, 13662291, }, }, { { 491119840, -348995616, 128621384, -97632120, -289412608, -423000064, -463336768, -380973248, -195104256, 24281598, 206642144, -322000672, 370486560, 351555424, 260226160, 107231376, -71365176, -228021424, -325345920, -347531584, -296888000, --184866672, -31224950, 129964640, 255163472, 311949920, 293880992, 214185728, 93033288, -44268228, -166360192, --244839984, -264906608, -226057552, -138746240, -24590836, 86406152, 166708624, 201445776, 189976064, 141800496, -71440336, -6223408, -77591272, -129388576, -151008896, -140083584, -102848896, -48852032, 10887205, 62631896, -94646048, 104201816, 95234992, 71203576, 35948876, -2226404, -34846680, -58946816, -73388640, -74912816, --63276680, -43950400, -20984674, 5622112, 32672354, 53384832, 66130684, 72770168, 68470368, 46321760, -10834592, -26956826, -62720480, -90538984, -91584808, -56170656, -9368934, 13955422, 13662291, }, +348995616, 128621384, -97632120, -289412608, -423000064, -463336768, -380973248, -195104256, 24281598, 206642144, +322000672, 370486560, 351555424, 260226160, 107231376, -71365176, -228021424, -325345920, -347531584, -296888000, +-184866672, -31224950, 129964640, 255163472, 311949920, 293880992, 214185728, 93033288, -44268228, -166360192, +-244839984, -264906608, -226057552, -138746240, -24590836, 86406152, 166708624, 201445776, 189976064, 141800496, +71440336, -6223408, -77591272, -129388576, -151008896, -140083584, -102848896, -48852032, 10887205, 62631896, +94646048, 104201816, 95234992, 71203576, 35948876, -2226404, -34846680, -58946816, -73388640, -74912816, +-63276680, -43950400, -20984674, 5622112, 32672354, 53384832, 66130684, 72770168, 68470368, 46321760, +10834592, -26956826, -62720480, -90538984, -91584808, -56170656, -9368934, 13955422, 13662291, }, { 663314752, -680615424, 704123904, 749817024, 838668608, 933881600, 965105984, 926342848, 883536512, 867071744, 829009728, -740681600, 661032000, 653968896, 694012480, 715598464, 713035968, 725833920, 755362368, 764999168, 750177792, -746233920, 766158272, 779788864, 761093952, 720125888, 682184128, 661349248, 657734528, 661714368, 660551488, -654196544, 660604096, 694720064, 748607424, 801209536, 839960832, 865090176, 880818880, 890421376, 895874368, -898570496, 902171328, 912473856, 930828928, 952021376, 972181952, 992491264, 1012047872, 1025152832, 1028589376, -1023516992, 1009262528, 984214848, 952265088, 919344704, 886117760, 852254656, 821971904, 796597248, 769538944, -736346880, 699329664, 656234496, 598574016, 526703104, 450481408, 372134208, 287646848, 204881744, 136896720, -79741976, 23230404, -23418310, -49200996, -74181600, -124141200, -181532704, -207284784, -203362400, }, +680615424, 704123904, 749817024, 838668608, 933881600, 965105984, 926342848, 883536512, 867071744, 829009728, +740681600, 661032000, 653968896, 694012480, 715598464, 713035968, 725833920, 755362368, 764999168, 750177792, +746233920, 766158272, 779788864, 761093952, 720125888, 682184128, 661349248, 657734528, 661714368, 660551488, +654196544, 660604096, 694720064, 748607424, 801209536, 839960832, 865090176, 880818880, 890421376, 895874368, +898570496, 902171328, 912473856, 930828928, 952021376, 972181952, 992491264, 1012047872, 1025152832, 1028589376, +1023516992, 1009262528, 984214848, 952265088, 919344704, 886117760, 852254656, 821971904, 796597248, 769538944, +736346880, 699329664, 656234496, 598574016, 526703104, 450481408, 372134208, 287646848, 204881744, 136896720, +79741976, 23230404, -23418310, -49200996, -74181600, -124141200, -181532704, -207284784, -203362400, }, }, { { 698450240, -695113600, 688707136, 673868544, 646702336, 610917760, 568857664, 527102560, 519145056, 586428416, 718136768, -845610880, 914316416, 924911552, 894738880, 830247232, 753590144, 704238272, 693756416, 701662912, 724094464, -778277056, 853215104, 906342784, 916561024, 898645696, 867138880, 828636608, 804123648, 816253184, 857867648, -905643776, 954590336, 1010564992, 1063627712, 1095899008, 1103429120, 1092297216, 1067622016, 1037442368, 1011192576, -988458240, 963559808, 938667776, 917664832, 896221696, 872711040, 855399104, 846239552, 834929280, 818068352, -803600704, 792021504, 776625664, 761370432, 753275008, 743880832, 723544128, 700462464, 681426624, 655573056, -619867392, 590852736, 571201152, 541938432, 502302336, 471169184, 441192992, 387073184, 319064544, 263699712, -203195440, 109921096, 14169097, -55798068, -158887488, -345028160, -519762432, -554675136, -496490176, }, +695113600, 688707136, 673868544, 646702336, 610917760, 568857664, 527102560, 519145056, 586428416, 718136768, +845610880, 914316416, 924911552, 894738880, 830247232, 753590144, 704238272, 693756416, 701662912, 724094464, +778277056, 853215104, 906342784, 916561024, 898645696, 867138880, 828636608, 804123648, 816253184, 857867648, +905643776, 954590336, 1010564992, 1063627712, 1095899008, 1103429120, 1092297216, 1067622016, 1037442368, 1011192576, +988458240, 963559808, 938667776, 917664832, 896221696, 872711040, 855399104, 846239552, 834929280, 818068352, +803600704, 792021504, 776625664, 761370432, 753275008, 743880832, 723544128, 700462464, 681426624, 655573056, +619867392, 590852736, 571201152, 541938432, 502302336, 471169184, 441192992, 387073184, 319064544, 263699712, +203195440, 109921096, 14169097, -55798068, -158887488, -345028160, -519762432, -554675136, -496490176, }, { 567408640, -524879360, 445231872, 326981216, 179955904, 55461448, 21249350, 91448984, 201343232, 259282336, 211754768, -68303400, -107528800, -233695072, -268373184, -242689280, -219989296, -229898864, -263432352, -314680992, -385375616, --452217120, -474061312, -442161504, -392155200, -358447232, -343104000, -333307712, -320852320, -296769888, -250224256, --181758720, -103790568, -27038430, 41594072, 93680752, 127249144, 154683792, 189131568, 229011408, 265722112, -296795136, 322010880, 337931264, 345139264, 349932992, 353043616, 348371232, 335426752, 319803264, 301012256, -273765504, 239266192, 201343776, 156256272, 100300912, 40257804, -16853452, -74278776, -133969160, -187937568, --232004464, -272277856, -309240320, -334208576, -347784992, -359915040, -368298816, -361418272, -342292800, -321298976, --291328160, -242526608, -189707088, -145970368, -87378424, 5882495, 92952216, 118694104, 100779800, }, +524879360, 445231872, 326981216, 179955904, 55461448, 21249350, 91448984, 201343232, 259282336, 211754768, +68303400, -107528800, -233695072, -268373184, -242689280, -219989296, -229898864, -263432352, -314680992, -385375616, +-452217120, -474061312, -442161504, -392155200, -358447232, -343104000, -333307712, -320852320, -296769888, -250224256, +-181758720, -103790568, -27038430, 41594072, 93680752, 127249144, 154683792, 189131568, 229011408, 265722112, +296795136, 322010880, 337931264, 345139264, 349932992, 353043616, 348371232, 335426752, 319803264, 301012256, +273765504, 239266192, 201343776, 156256272, 100300912, 40257804, -16853452, -74278776, -133969160, -187937568, +-232004464, -272277856, -309240320, -334208576, -347784992, -359915040, -368298816, -361418272, -342292800, -321298976, +-291328160, -242526608, -189707088, -145970368, -87378424, 5882495, 92952216, 118694104, 100779800, }, }, { { 567408640, -524879360, 445231872, 326981216, 179955904, 55461448, 21249350, 91448984, 201343232, 259282336, 211754768, -68303400, -107528800, -233695072, -268373184, -242689280, -219989296, -229898864, -263432352, -314680992, -385375616, --452217120, -474061312, -442161504, -392155200, -358447232, -343104000, -333307712, -320852320, -296769888, -250224256, --181758720, -103790568, -27038430, 41594072, 93680752, 127249144, 154683792, 189131568, 229011408, 265722112, -296795136, 322010880, 337931264, 345139264, 349932992, 353043616, 348371232, 335426752, 319803264, 301012256, -273765504, 239266192, 201343776, 156256272, 100300912, 40257804, -16853452, -74278776, -133969160, -187937568, --232004464, -272277856, -309240320, -334208576, -347784992, -359915040, -368298816, -361418272, -342292800, -321298976, --291328160, -242526608, -189707088, -145970368, -87378424, 5882495, 92952216, 118694104, 100779800, }, +524879360, 445231872, 326981216, 179955904, 55461448, 21249350, 91448984, 201343232, 259282336, 211754768, +68303400, -107528800, -233695072, -268373184, -242689280, -219989296, -229898864, -263432352, -314680992, -385375616, +-452217120, -474061312, -442161504, -392155200, -358447232, -343104000, -333307712, -320852320, -296769888, -250224256, +-181758720, -103790568, -27038430, 41594072, 93680752, 127249144, 154683792, 189131568, 229011408, 265722112, +296795136, 322010880, 337931264, 345139264, 349932992, 353043616, 348371232, 335426752, 319803264, 301012256, +273765504, 239266192, 201343776, 156256272, 100300912, 40257804, -16853452, -74278776, -133969160, -187937568, +-232004464, -272277856, -309240320, -334208576, -347784992, -359915040, -368298816, -361418272, -342292800, -321298976, +-291328160, -242526608, -189707088, -145970368, -87378424, 5882495, 92952216, 118694104, 100779800, }, { 698450240, -695113600, 688707136, 673868544, 646702336, 610917760, 568857664, 527102560, 519145056, 586428416, 718136768, -845610880, 914316416, 924911552, 894738880, 830247232, 753590144, 704238272, 693756416, 701662912, 724094464, -778277056, 853215104, 906342784, 916561024, 898645696, 867138880, 828636608, 804123648, 816253184, 857867648, -905643776, 954590336, 1010564992, 1063627712, 1095899008, 1103429120, 1092297216, 1067622016, 1037442368, 1011192576, -988458240, 963559808, 938667776, 917664832, 896221696, 872711040, 855399104, 846239552, 834929280, 818068352, -803600704, 792021504, 776625664, 761370432, 753275008, 743880832, 723544128, 700462464, 681426624, 655573056, -619867392, 590852736, 571201152, 541938432, 502302336, 471169184, 441192992, 387073184, 319064544, 263699712, -203195440, 109921096, 14169097, -55798068, -158887488, -345028160, -519762432, -554675136, -496490176, }, +695113600, 688707136, 673868544, 646702336, 610917760, 568857664, 527102560, 519145056, 586428416, 718136768, +845610880, 914316416, 924911552, 894738880, 830247232, 753590144, 704238272, 693756416, 701662912, 724094464, +778277056, 853215104, 906342784, 916561024, 898645696, 867138880, 828636608, 804123648, 816253184, 857867648, +905643776, 954590336, 1010564992, 1063627712, 1095899008, 1103429120, 1092297216, 1067622016, 1037442368, 1011192576, +988458240, 963559808, 938667776, 917664832, 896221696, 872711040, 855399104, 846239552, 834929280, 818068352, +803600704, 792021504, 776625664, 761370432, 753275008, 743880832, 723544128, 700462464, 681426624, 655573056, +619867392, 590852736, 571201152, 541938432, 502302336, 471169184, 441192992, 387073184, 319064544, 263699712, +203195440, 109921096, 14169097, -55798068, -158887488, -345028160, -519762432, -554675136, -496490176, }, }, { { 644109824, -641661120, 654817664, 701214080, 765066304, 793017920, 750046272, 672282112, 629564352, 638276160, 653404672, -650713344, 664768064, 724066496, 796885568, 836247872, 841609600, 838631552, 827856576, 793175744, 740571520, -691951424, 653267776, 616578496, 581786624, 554008384, 530454752, 506390080, 483272416, 461399744, 437886944, -417039168, 407054464, 404265952, 397127712, 385007840, 376674016, 374368128, 375742528, 384455936, 402931808, -423579872, 440827392, 460186432, 484475008, 506007808, 521276416, 536031776, 549570624, 553172480, 547704960, -542988032, 540130816, 534797504, 532996864, 542406592, 556516096, 567273344, 579921536, 596790016, 605442240, -600309184, 592648576, 584888128, 564139648, 531910240, 505569728, 483578432, 448984064, 408078272, 379293920, -349889504, 297504320, 240236304, 200201840, 139145664, 12122545, -134532864, -211733840, -217447744, }, +641661120, 654817664, 701214080, 765066304, 793017920, 750046272, 672282112, 629564352, 638276160, 653404672, +650713344, 664768064, 724066496, 796885568, 836247872, 841609600, 838631552, 827856576, 793175744, 740571520, +691951424, 653267776, 616578496, 581786624, 554008384, 530454752, 506390080, 483272416, 461399744, 437886944, +417039168, 407054464, 404265952, 397127712, 385007840, 376674016, 374368128, 375742528, 384455936, 402931808, +423579872, 440827392, 460186432, 484475008, 506007808, 521276416, 536031776, 549570624, 553172480, 547704960, +542988032, 540130816, 534797504, 532996864, 542406592, 556516096, 567273344, 579921536, 596790016, 605442240, +600309184, 592648576, 584888128, 564139648, 531910240, 505569728, 483578432, 448984064, 408078272, 379293920, +349889504, 297504320, 240236304, 200201840, 139145664, 12122545, -134532864, -211733840, -217447744, }, { 512525440, -435640128, 282957824, 84049288, -98370320, -209789824, -249021136, -262860048, -292943072, -332088480, -336941792, --280376544, -182095344, -83988624, -5475547, 65635152, 143603840, 220762928, 274739392, 289304160, 265117600, -216662848, 160822896, 104457360, 42877732, -27904402, -101418672, -166072432, -214420880, -242443920, -245357520, --220635696, -172637824, -110469240, -43466144, 20132660, 74126840, 115731112, 143894832, 157248416, 156342720, -145316992, 127926136, 104625400, 75957032, 44605920, 11819750, -23396834, -59791312, -93554592, -122836600, --146753664, -160679552, -159128544, -142168784, -113127824, -73081016, -23768350, 28488518, 77793672, 122219736, -157799248, 176779248, 176332560, 160420784, 130510096, 85142896, 29638496, -26396870, -80311592, -131147360, --167546672, -178184240, -167493520, -141860080, -92922152, -21397528, 37648608, 50324668, 34608308, }, +435640128, 282957824, 84049288, -98370320, -209789824, -249021136, -262860048, -292943072, -332088480, -336941792, +-280376544, -182095344, -83988624, -5475547, 65635152, 143603840, 220762928, 274739392, 289304160, 265117600, +216662848, 160822896, 104457360, 42877732, -27904402, -101418672, -166072432, -214420880, -242443920, -245357520, +-220635696, -172637824, -110469240, -43466144, 20132660, 74126840, 115731112, 143894832, 157248416, 156342720, +145316992, 127926136, 104625400, 75957032, 44605920, 11819750, -23396834, -59791312, -93554592, -122836600, +-146753664, -160679552, -159128544, -142168784, -113127824, -73081016, -23768350, 28488518, 77793672, 122219736, +157799248, 176779248, 176332560, 160420784, 130510096, 85142896, 29638496, -26396870, -80311592, -131147360, +-167546672, -178184240, -167493520, -141860080, -92922152, -21397528, 37648608, 50324668, 34608308, }, }, { { 512525440, -435640128, 282957824, 84049288, -98370320, -209789824, -249021136, -262860048, -292943072, -332088480, -336941792, --280376544, -182095344, -83988624, -5475547, 65635152, 143603840, 220762928, 274739392, 289304160, 265117600, -216662848, 160822896, 104457360, 42877732, -27904402, -101418672, -166072432, -214420880, -242443920, -245357520, --220635696, -172637824, -110469240, -43466144, 20132660, 74126840, 115731112, 143894832, 157248416, 156342720, -145316992, 127926136, 104625400, 75957032, 44605920, 11819750, -23396834, -59791312, -93554592, -122836600, --146753664, -160679552, -159128544, -142168784, -113127824, -73081016, -23768350, 28488518, 77793672, 122219736, -157799248, 176779248, 176332560, 160420784, 130510096, 85142896, 29638496, -26396870, -80311592, -131147360, --167546672, -178184240, -167493520, -141860080, -92922152, -21397528, 37648608, 50324668, 34608308, }, +435640128, 282957824, 84049288, -98370320, -209789824, -249021136, -262860048, -292943072, -332088480, -336941792, +-280376544, -182095344, -83988624, -5475547, 65635152, 143603840, 220762928, 274739392, 289304160, 265117600, +216662848, 160822896, 104457360, 42877732, -27904402, -101418672, -166072432, -214420880, -242443920, -245357520, +-220635696, -172637824, -110469240, -43466144, 20132660, 74126840, 115731112, 143894832, 157248416, 156342720, +145316992, 127926136, 104625400, 75957032, 44605920, 11819750, -23396834, -59791312, -93554592, -122836600, +-146753664, -160679552, -159128544, -142168784, -113127824, -73081016, -23768350, 28488518, 77793672, 122219736, +157799248, 176779248, 176332560, 160420784, 130510096, 85142896, 29638496, -26396870, -80311592, -131147360, +-167546672, -178184240, -167493520, -141860080, -92922152, -21397528, 37648608, 50324668, 34608308, }, { 644109824, -641661120, 654817664, 701214080, 765066304, 793017920, 750046272, 672282112, 629564352, 638276160, 653404672, -650713344, 664768064, 724066496, 796885568, 836247872, 841609600, 838631552, 827856576, 793175744, 740571520, -691951424, 653267776, 616578496, 581786624, 554008384, 530454752, 506390080, 483272416, 461399744, 437886944, -417039168, 407054464, 404265952, 397127712, 385007840, 376674016, 374368128, 375742528, 384455936, 402931808, -423579872, 440827392, 460186432, 484475008, 506007808, 521276416, 536031776, 549570624, 553172480, 547704960, -542988032, 540130816, 534797504, 532996864, 542406592, 556516096, 567273344, 579921536, 596790016, 605442240, -600309184, 592648576, 584888128, 564139648, 531910240, 505569728, 483578432, 448984064, 408078272, 379293920, -349889504, 297504320, 240236304, 200201840, 139145664, 12122545, -134532864, -211733840, -217447744, }, +641661120, 654817664, 701214080, 765066304, 793017920, 750046272, 672282112, 629564352, 638276160, 653404672, +650713344, 664768064, 724066496, 796885568, 836247872, 841609600, 838631552, 827856576, 793175744, 740571520, +691951424, 653267776, 616578496, 581786624, 554008384, 530454752, 506390080, 483272416, 461399744, 437886944, +417039168, 407054464, 404265952, 397127712, 385007840, 376674016, 374368128, 375742528, 384455936, 402931808, +423579872, 440827392, 460186432, 484475008, 506007808, 521276416, 536031776, 549570624, 553172480, 547704960, +542988032, 540130816, 534797504, 532996864, 542406592, 556516096, 567273344, 579921536, 596790016, 605442240, +600309184, 592648576, 584888128, 564139648, 531910240, 505569728, 483578432, 448984064, 408078272, 379293920, +349889504, 297504320, 240236304, 200201840, 139145664, 12122545, -134532864, -211733840, -217447744, }, }, { { 587978880, -583932480, 595629312, 635400704, 685938496, 712024000, 695631680, 652895680, 612192832, 583900288, 562476992, -551322432, 565862464, 608285504, 656774592, 688751168, 701092224, 698698304, 678709504, 640098816, 597021952, -566447680, 548555904, 531494688, 509422848, 484884096, 459217888, 431434848, 403011808, 375859552, 348526944, -319307200, 289268736, 259346768, 229363600, 201952576, 182509808, 173997712, 175682960, 186022016, 202622064, -221453344, 240029072, 258667088, 276221696, 289274112, 297622976, 304864832, 312131392, 317628416, 322647616, -330756512, 341403744, 351437856, 361045152, 371032032, 377771360, 377995776, 373800128, 366717184, 353812416, -335176576, 316256160, 297876384, 274586912, 246141888, 217887984, 188342368, 151595696, 111782968, 77966008, -47567300, 14498199, -13151190, -28034862, -46559592, -86153288, -128819488, -143185616, -134899024, }, +583932480, 595629312, 635400704, 685938496, 712024000, 695631680, 652895680, 612192832, 583900288, 562476992, +551322432, 565862464, 608285504, 656774592, 688751168, 701092224, 698698304, 678709504, 640098816, 597021952, +566447680, 548555904, 531494688, 509422848, 484884096, 459217888, 431434848, 403011808, 375859552, 348526944, +319307200, 289268736, 259346768, 229363600, 201952576, 182509808, 173997712, 175682960, 186022016, 202622064, +221453344, 240029072, 258667088, 276221696, 289274112, 297622976, 304864832, 312131392, 317628416, 322647616, +330756512, 341403744, 351437856, 361045152, 371032032, 377771360, 377995776, 373800128, 366717184, 353812416, +335176576, 316256160, 297876384, 274586912, 246141888, 217887984, 188342368, 151595696, 111782968, 77966008, +47567300, 14498199, -13151190, -28034862, -46559592, -86153288, -128819488, -143185616, -134899024, }, { 495951136, -455682080, 361104736, 218659472, 74911208, -16711718, -51278152, -77336256, -135958256, -210931216, -258044864, --269439936, -279133696, -308019488, -335871264, -335299520, -304617856, -254157376, -185496960, -102038760, -20926692, -43942884, 97866200, 150721136, 199086768, 234797280, 258988144, 276016064, 283122112, 274994944, 250520080, -210138256, 155355952, 93582504, 34347392, -20257750, -72878616, -120474368, -155971744, -177703728, -188535104, --189547648, -182415856, -172789216, -164300208, -154903904, -143742352, -133717368, -123639760, -106822280, -80108656, --45536852, -3321084, 46471008, 96844536, 139191296, 172961552, 200751600, 219641936, 226778576, 225363920, -216120064, 192853696, 154202208, 107838576, 57583164, 1152662, -56183540, -103766944, -142620832, -180127168, --209971280, -220987872, -219427728, -213443232, -185617216, -118235080, -37197100, 11489038, 22216792, }, +455682080, 361104736, 218659472, 74911208, -16711718, -51278152, -77336256, -135958256, -210931216, -258044864, +-269439936, -279133696, -308019488, -335871264, -335299520, -304617856, -254157376, -185496960, -102038760, -20926692, +43942884, 97866200, 150721136, 199086768, 234797280, 258988144, 276016064, 283122112, 274994944, 250520080, +210138256, 155355952, 93582504, 34347392, -20257750, -72878616, -120474368, -155971744, -177703728, -188535104, +-189547648, -182415856, -172789216, -164300208, -154903904, -143742352, -133717368, -123639760, -106822280, -80108656, +-45536852, -3321084, 46471008, 96844536, 139191296, 172961552, 200751600, 219641936, 226778576, 225363920, +216120064, 192853696, 154202208, 107838576, 57583164, 1152662, -56183540, -103766944, -142620832, -180127168, +-209971280, -220987872, -219427728, -213443232, -185617216, -118235080, -37197100, 11489038, 22216792, }, }, { { 495951136, -455682080, 361104736, 218659472, 74911208, -16711718, -51278152, -77336256, -135958256, -210931216, -258044864, --269439936, -279133696, -308019488, -335871264, -335299520, -304617856, -254157376, -185496960, -102038760, -20926692, -43942884, 97866200, 150721136, 199086768, 234797280, 258988144, 276016064, 283122112, 274994944, 250520080, -210138256, 155355952, 93582504, 34347392, -20257750, -72878616, -120474368, -155971744, -177703728, -188535104, --189547648, -182415856, -172789216, -164300208, -154903904, -143742352, -133717368, -123639760, -106822280, -80108656, --45536852, -3321084, 46471008, 96844536, 139191296, 172961552, 200751600, 219641936, 226778576, 225363920, -216120064, 192853696, 154202208, 107838576, 57583164, 1152662, -56183540, -103766944, -142620832, -180127168, --209971280, -220987872, -219427728, -213443232, -185617216, -118235080, -37197100, 11489038, 22216792, }, +455682080, 361104736, 218659472, 74911208, -16711718, -51278152, -77336256, -135958256, -210931216, -258044864, +-269439936, -279133696, -308019488, -335871264, -335299520, -304617856, -254157376, -185496960, -102038760, -20926692, +43942884, 97866200, 150721136, 199086768, 234797280, 258988144, 276016064, 283122112, 274994944, 250520080, +210138256, 155355952, 93582504, 34347392, -20257750, -72878616, -120474368, -155971744, -177703728, -188535104, +-189547648, -182415856, -172789216, -164300208, -154903904, -143742352, -133717368, -123639760, -106822280, -80108656, +-45536852, -3321084, 46471008, 96844536, 139191296, 172961552, 200751600, 219641936, 226778576, 225363920, +216120064, 192853696, 154202208, 107838576, 57583164, 1152662, -56183540, -103766944, -142620832, -180127168, +-209971280, -220987872, -219427728, -213443232, -185617216, -118235080, -37197100, 11489038, 22216792, }, { 587978880, -583932480, 595629312, 635400704, 685938496, 712024000, 695631680, 652895680, 612192832, 583900288, 562476992, -551322432, 565862464, 608285504, 656774592, 688751168, 701092224, 698698304, 678709504, 640098816, 597021952, -566447680, 548555904, 531494688, 509422848, 484884096, 459217888, 431434848, 403011808, 375859552, 348526944, -319307200, 289268736, 259346768, 229363600, 201952576, 182509808, 173997712, 175682960, 186022016, 202622064, -221453344, 240029072, 258667088, 276221696, 289274112, 297622976, 304864832, 312131392, 317628416, 322647616, -330756512, 341403744, 351437856, 361045152, 371032032, 377771360, 377995776, 373800128, 366717184, 353812416, -335176576, 316256160, 297876384, 274586912, 246141888, 217887984, 188342368, 151595696, 111782968, 77966008, -47567300, 14498199, -13151190, -28034862, -46559592, -86153288, -128819488, -143185616, -134899024, }, +583932480, 595629312, 635400704, 685938496, 712024000, 695631680, 652895680, 612192832, 583900288, 562476992, +551322432, 565862464, 608285504, 656774592, 688751168, 701092224, 698698304, 678709504, 640098816, 597021952, +566447680, 548555904, 531494688, 509422848, 484884096, 459217888, 431434848, 403011808, 375859552, 348526944, +319307200, 289268736, 259346768, 229363600, 201952576, 182509808, 173997712, 175682960, 186022016, 202622064, +221453344, 240029072, 258667088, 276221696, 289274112, 297622976, 304864832, 312131392, 317628416, 322647616, +330756512, 341403744, 351437856, 361045152, 371032032, 377771360, 377995776, 373800128, 366717184, 353812416, +335176576, 316256160, 297876384, 274586912, 246141888, 217887984, 188342368, 151595696, 111782968, 77966008, +47567300, 14498199, -13151190, -28034862, -46559592, -86153288, -128819488, -143185616, -134899024, }, }, }; const Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 12014097, -35897336, 53805204, 50312856, 18828062, -13066364, -6854768, 22745610, 12735115, -41816876, -39875552, -98654864, 297323936, 401317440, 372772544, 315583456, 308144576, 310529888, 259613600, 163684960, 59336584, --51169704, -165799696, -239111024, -227276784, -147407568, -53171696, 26007638, 93542240, 155563712, 207501152, -237285664, 227532864, 167055968, 67771360, -41654204, -141005920, -226938560, -301322560, -365197856, -419542080, --460432832, -479936288, -480030240, -475801312, -478633312, -488226656, -504062208, -528410912, -555006400, -571804032, --577254336, -578772608, -577470144, -570372736, -562345408, -559677184, -559475840, -559533312, -566981312, -584370560, --602642944, -618692736, -640225536, -664323008, -674664192, -666645504, -649141376, -619779904, -569934080, -512024000, --465699552, -423834368, -373262176, -334423328, -327638880, -316269056, -247134560, -134972576, -38042136, }, +35897336, 53805204, 50312856, 18828062, -13066364, -6854768, 22745610, 12735115, -41816876, -39875552, +98654864, 297323936, 401317440, 372772544, 315583456, 308144576, 310529888, 259613600, 163684960, 59336584, +-51169704, -165799696, -239111024, -227276784, -147407568, -53171696, 26007638, 93542240, 155563712, 207501152, +237285664, 227532864, 167055968, 67771360, -41654204, -141005920, -226938560, -301322560, -365197856, -419542080, +-460432832, -479936288, -480030240, -475801312, -478633312, -488226656, -504062208, -528410912, -555006400, -571804032, +-577254336, -578772608, -577470144, -570372736, -562345408, -559677184, -559475840, -559533312, -566981312, -584370560, +-602642944, -618692736, -640225536, -664323008, -674664192, -666645504, -649141376, -619779904, -569934080, -512024000, +-465699552, -423834368, -373262176, -334423328, -327638880, -316269056, -247134560, -134972576, -38042136, }, { -43315284, --167275552, -325720672, -424729856, -429919232, -407980544, -395947680, -346303200, -239683328, -149724176, -148736336, --226306656, -333395232, -430414784, -464289728, -380538944, -199746048, -17964238, 102305048, 183813328, 256357472, -298020256, 290804704, 271931552, 283791040, 317931200, 348516736, 381127872, 427289120, 462315104, 450696160, -394719296, 322191808, 238335248, 123655328, -22405234, -163422432, -259725264, -305492960, -324537920, -338921248, --352351072, -360596320, -363949632, -362820032, -350412416, -320028736, -275247808, -224321840, -168880800, -106778792, --41586020, 19834696, 75412112, 125746976, 168545792, 202392288, 230801344, 255875904, 273531968, 280169312, -277151008, 264613472, 239632336, 204636400, 168342320, 135009072, 102396856, 71785008, 48446156, 31304942, -14647986, -258772, -9262634, -19164144, -40214316, -64947420, -72200008, -53375168, -18999324, }, +-167275552, -325720672, -424729856, -429919232, -407980544, -395947680, -346303200, -239683328, -149724176, -148736336, +-226306656, -333395232, -430414784, -464289728, -380538944, -199746048, -17964238, 102305048, 183813328, 256357472, +298020256, 290804704, 271931552, 283791040, 317931200, 348516736, 381127872, 427289120, 462315104, 450696160, +394719296, 322191808, 238335248, 123655328, -22405234, -163422432, -259725264, -305492960, -324537920, -338921248, +-352351072, -360596320, -363949632, -362820032, -350412416, -320028736, -275247808, -224321840, -168880800, -106778792, +-41586020, 19834696, 75412112, 125746976, 168545792, 202392288, 230801344, 255875904, 273531968, 280169312, +277151008, 264613472, 239632336, 204636400, 168342320, 135009072, 102396856, 71785008, 48446156, 31304942, +14647986, -258772, -9262634, -19164144, -40214316, -64947420, -72200008, -53375168, -18999324, }, }, { { -43315284, --167275552, -325720672, -424729856, -429919232, -407980544, -395947680, -346303200, -239683328, -149724176, -148736336, --226306656, -333395232, -430414784, -464289728, -380538944, -199746048, -17964238, 102305048, 183813328, 256357472, -298020256, 290804704, 271931552, 283791040, 317931200, 348516736, 381127872, 427289120, 462315104, 450696160, -394719296, 322191808, 238335248, 123655328, -22405234, -163422432, -259725264, -305492960, -324537920, -338921248, --352351072, -360596320, -363949632, -362820032, -350412416, -320028736, -275247808, -224321840, -168880800, -106778792, --41586020, 19834696, 75412112, 125746976, 168545792, 202392288, 230801344, 255875904, 273531968, 280169312, -277151008, 264613472, 239632336, 204636400, 168342320, 135009072, 102396856, 71785008, 48446156, 31304942, -14647986, -258772, -9262634, -19164144, -40214316, -64947420, -72200008, -53375168, -18999324, }, +-167275552, -325720672, -424729856, -429919232, -407980544, -395947680, -346303200, -239683328, -149724176, -148736336, +-226306656, -333395232, -430414784, -464289728, -380538944, -199746048, -17964238, 102305048, 183813328, 256357472, +298020256, 290804704, 271931552, 283791040, 317931200, 348516736, 381127872, 427289120, 462315104, 450696160, +394719296, 322191808, 238335248, 123655328, -22405234, -163422432, -259725264, -305492960, -324537920, -338921248, +-352351072, -360596320, -363949632, -362820032, -350412416, -320028736, -275247808, -224321840, -168880800, -106778792, +-41586020, 19834696, 75412112, 125746976, 168545792, 202392288, 230801344, 255875904, 273531968, 280169312, +277151008, 264613472, 239632336, 204636400, 168342320, 135009072, 102396856, 71785008, 48446156, 31304942, +14647986, -258772, -9262634, -19164144, -40214316, -64947420, -72200008, -53375168, -18999324, }, { 12014097, -35897336, 53805204, 50312856, 18828062, -13066364, -6854768, 22745610, 12735115, -41816876, -39875552, -98654864, 297323936, 401317440, 372772544, 315583456, 308144576, 310529888, 259613600, 163684960, 59336584, --51169704, -165799696, -239111024, -227276784, -147407568, -53171696, 26007638, 93542240, 155563712, 207501152, -237285664, 227532864, 167055968, 67771360, -41654204, -141005920, -226938560, -301322560, -365197856, -419542080, --460432832, -479936288, -480030240, -475801312, -478633312, -488226656, -504062208, -528410912, -555006400, -571804032, --577254336, -578772608, -577470144, -570372736, -562345408, -559677184, -559475840, -559533312, -566981312, -584370560, --602642944, -618692736, -640225536, -664323008, -674664192, -666645504, -649141376, -619779904, -569934080, -512024000, --465699552, -423834368, -373262176, -334423328, -327638880, -316269056, -247134560, -134972576, -38042136, }, +35897336, 53805204, 50312856, 18828062, -13066364, -6854768, 22745610, 12735115, -41816876, -39875552, +98654864, 297323936, 401317440, 372772544, 315583456, 308144576, 310529888, 259613600, 163684960, 59336584, +-51169704, -165799696, -239111024, -227276784, -147407568, -53171696, 26007638, 93542240, 155563712, 207501152, +237285664, 227532864, 167055968, 67771360, -41654204, -141005920, -226938560, -301322560, -365197856, -419542080, +-460432832, -479936288, -480030240, -475801312, -478633312, -488226656, -504062208, -528410912, -555006400, -571804032, +-577254336, -578772608, -577470144, -570372736, -562345408, -559677184, -559475840, -559533312, -566981312, -584370560, +-602642944, -618692736, -640225536, -664323008, -674664192, -666645504, -649141376, -619779904, -569934080, -512024000, +-465699552, -423834368, -373262176, -334423328, -327638880, -316269056, -247134560, -134972576, -38042136, }, }, { { 11529840, -13347148, -36569500, -113121920, -129439576, -50867444, 14232448, -53408992, -177612464, -148705184, 85114976, -321205568, 356627232, 230623104, 133642736, 154121136, 209440320, 188600064, 75365400, -67306968, -171972096, --209020496, -188093792, -138411232, -83479128, -30877056, 15938087, 45047228, 40231496, -7201587, -92407296, --197360720, -297320736, -374595776, -428572768, -467873344, -492833536, -492368064, -460149376, -407823264, -358125632, --328469440, -323982272, -340943616, -370154784, -399694496, -422151808, -439693504, -457322752, -472918304, -479750528, --476592128, -468317856, -458178528, -446379712, -434486400, -424508128, -415263744, -404740000, -393061440, -379423840, --361430624, -340799200, -322628288, -306349824, -286351904, -263314784, -243854288, -227870560, -209237920, -189143376, --173876912, -160802496, -144108496, -131797512, -135355888, -143668800, -130320584, -87279640, -29750164, }, +13347148, -36569500, -113121920, -129439576, -50867444, 14232448, -53408992, -177612464, -148705184, 85114976, +321205568, 356627232, 230623104, 133642736, 154121136, 209440320, 188600064, 75365400, -67306968, -171972096, +-209020496, -188093792, -138411232, -83479128, -30877056, 15938087, 45047228, 40231496, -7201587, -92407296, +-197360720, -297320736, -374595776, -428572768, -467873344, -492833536, -492368064, -460149376, -407823264, -358125632, +-328469440, -323982272, -340943616, -370154784, -399694496, -422151808, -439693504, -457322752, -472918304, -479750528, +-476592128, -468317856, -458178528, -446379712, -434486400, -424508128, -415263744, -404740000, -393061440, -379423840, +-361430624, -340799200, -322628288, -306349824, -286351904, -263314784, -243854288, -227870560, -209237920, -189143376, +-173876912, -160802496, -144108496, -131797512, -135355888, -143668800, -130320584, -87279640, -29750164, }, { 11529840, -13347148, -36569500, -113121920, -129439576, -50867444, 14232448, -53408992, -177612464, -148705184, 85114976, -321205568, 356627232, 230623104, 133642736, 154121136, 209440320, 188600064, 75365400, -67306968, -171972096, --209020496, -188093792, -138411232, -83479128, -30877056, 15938087, 45047228, 40231496, -7201587, -92407296, --197360720, -297320736, -374595776, -428572768, -467873344, -492833536, -492368064, -460149376, -407823264, -358125632, --328469440, -323982272, -340943616, -370154784, -399694496, -422151808, -439693504, -457322752, -472918304, -479750528, --476592128, -468317856, -458178528, -446379712, -434486400, -424508128, -415263744, -404740000, -393061440, -379423840, --361430624, -340799200, -322628288, -306349824, -286351904, -263314784, -243854288, -227870560, -209237920, -189143376, --173876912, -160802496, -144108496, -131797512, -135355888, -143668800, -130320584, -87279640, -29750164, }, +13347148, -36569500, -113121920, -129439576, -50867444, 14232448, -53408992, -177612464, -148705184, 85114976, +321205568, 356627232, 230623104, 133642736, 154121136, 209440320, 188600064, 75365400, -67306968, -171972096, +-209020496, -188093792, -138411232, -83479128, -30877056, 15938087, 45047228, 40231496, -7201587, -92407296, +-197360720, -297320736, -374595776, -428572768, -467873344, -492833536, -492368064, -460149376, -407823264, -358125632, +-328469440, -323982272, -340943616, -370154784, -399694496, -422151808, -439693504, -457322752, -472918304, -479750528, +-476592128, -468317856, -458178528, -446379712, -434486400, -424508128, -415263744, -404740000, -393061440, -379423840, +-361430624, -340799200, -322628288, -306349824, -286351904, -263314784, -243854288, -227870560, -209237920, -189143376, +-173876912, -160802496, -144108496, -131797512, -135355888, -143668800, -130320584, -87279640, -29750164, }, }, { { 6737730, -36310728, 82552496, 112160384, 114129096, 97516160, 47489452, -47207596, -139446848, -172956720, -172927728, --209062368, -281033120, -323487264, -317248832, -310710272, -329580224, -345570912, -342311584, -339921440, -342769536, --325651392, -283917728, -245152432, -223469840, -208063248, -199347152, -211438016, -235558560, -241466288, -219431488, --187860800, -158804272, -126097016, -87488480, -51480552, -21284248, 6805376, 29567628, 38165616, 31655520, -16961900, -736587, -18033494, -29193430, -30501248, -24554864, -15843061, -7511361, -4630512, -13749264, --37041944, -71893456, -115411136, -163850848, -210135568, -248258768, -278091072, -301507232, -317690144, -326059968, --328749696, -326538848, -317392704, -301186208, -280315328, -255096896, -224872144, -192732896, -162321840, -132668320, --103223632, -78363824, -58980100, -39456252, -23711440, -29182156, -56074556, -68051072, -31855772, }, +36310728, 82552496, 112160384, 114129096, 97516160, 47489452, -47207596, -139446848, -172956720, -172927728, +-209062368, -281033120, -323487264, -317248832, -310710272, -329580224, -345570912, -342311584, -339921440, -342769536, +-325651392, -283917728, -245152432, -223469840, -208063248, -199347152, -211438016, -235558560, -241466288, -219431488, +-187860800, -158804272, -126097016, -87488480, -51480552, -21284248, 6805376, 29567628, 38165616, 31655520, +16961900, -736587, -18033494, -29193430, -30501248, -24554864, -15843061, -7511361, -4630512, -13749264, +-37041944, -71893456, -115411136, -163850848, -210135568, -248258768, -278091072, -301507232, -317690144, -326059968, +-328749696, -326538848, -317392704, -301186208, -280315328, -255096896, -224872144, -192732896, -162321840, -132668320, +-103223632, -78363824, -58980100, -39456252, -23711440, -29182156, -56074556, -68051072, -31855772, }, { -91367912, --257344784, -368731008, -399863072, -368732064, -318823488, -264597360, -187626176, -89714888, -9023726, 30760556, -50806240, 78116864, 109169480, 134775008, 170659456, 232808160, 299963744, 327622784, 290989408, 198465072, -75594112, -48091284, -147514416, -213435184, -251069824, -262746768, -243405456, -197352144, -143928656, -98723584, --61254824, -26169236, 6638946, 38232188, 74120400, 115100832, 152906208, 177822384, 183768768, 166826736, -127559992, 74813496, 20892868, -25723632, -59548648, -75917304, -75299904, -64973192, -52216064, -40167608, --31237298, -27542552, -26933204, -25319906, -22686018, -20841328, -18178450, -13306346, -9438728, -8532489, --6724308, -1197222, 6068789, 16056735, 34274376, 60207924, 85978264, 107714024, 125535992, 132588328, -120357328, 93827320, 63501628, 26500486, -22081500, -64213520, -72819560, -48505752, -15430207, }, +-257344784, -368731008, -399863072, -368732064, -318823488, -264597360, -187626176, -89714888, -9023726, 30760556, +50806240, 78116864, 109169480, 134775008, 170659456, 232808160, 299963744, 327622784, 290989408, 198465072, +75594112, -48091284, -147514416, -213435184, -251069824, -262746768, -243405456, -197352144, -143928656, -98723584, +-61254824, -26169236, 6638946, 38232188, 74120400, 115100832, 152906208, 177822384, 183768768, 166826736, +127559992, 74813496, 20892868, -25723632, -59548648, -75917304, -75299904, -64973192, -52216064, -40167608, +-31237298, -27542552, -26933204, -25319906, -22686018, -20841328, -18178450, -13306346, -9438728, -8532489, +-6724308, -1197222, 6068789, 16056735, 34274376, 60207924, 85978264, 107714024, 125535992, 132588328, +120357328, 93827320, 63501628, 26500486, -22081500, -64213520, -72819560, -48505752, -15430207, }, }, { { -91367912, --257344784, -368731008, -399863072, -368732064, -318823488, -264597360, -187626176, -89714888, -9023726, 30760556, -50806240, 78116864, 109169480, 134775008, 170659456, 232808160, 299963744, 327622784, 290989408, 198465072, -75594112, -48091284, -147514416, -213435184, -251069824, -262746768, -243405456, -197352144, -143928656, -98723584, --61254824, -26169236, 6638946, 38232188, 74120400, 115100832, 152906208, 177822384, 183768768, 166826736, -127559992, 74813496, 20892868, -25723632, -59548648, -75917304, -75299904, -64973192, -52216064, -40167608, --31237298, -27542552, -26933204, -25319906, -22686018, -20841328, -18178450, -13306346, -9438728, -8532489, --6724308, -1197222, 6068789, 16056735, 34274376, 60207924, 85978264, 107714024, 125535992, 132588328, -120357328, 93827320, 63501628, 26500486, -22081500, -64213520, -72819560, -48505752, -15430207, }, +-257344784, -368731008, -399863072, -368732064, -318823488, -264597360, -187626176, -89714888, -9023726, 30760556, +50806240, 78116864, 109169480, 134775008, 170659456, 232808160, 299963744, 327622784, 290989408, 198465072, +75594112, -48091284, -147514416, -213435184, -251069824, -262746768, -243405456, -197352144, -143928656, -98723584, +-61254824, -26169236, 6638946, 38232188, 74120400, 115100832, 152906208, 177822384, 183768768, 166826736, +127559992, 74813496, 20892868, -25723632, -59548648, -75917304, -75299904, -64973192, -52216064, -40167608, +-31237298, -27542552, -26933204, -25319906, -22686018, -20841328, -18178450, -13306346, -9438728, -8532489, +-6724308, -1197222, 6068789, 16056735, 34274376, 60207924, 85978264, 107714024, 125535992, 132588328, +120357328, 93827320, 63501628, 26500486, -22081500, -64213520, -72819560, -48505752, -15430207, }, { 6737730, -36310728, 82552496, 112160384, 114129096, 97516160, 47489452, -47207596, -139446848, -172956720, -172927728, --209062368, -281033120, -323487264, -317248832, -310710272, -329580224, -345570912, -342311584, -339921440, -342769536, --325651392, -283917728, -245152432, -223469840, -208063248, -199347152, -211438016, -235558560, -241466288, -219431488, --187860800, -158804272, -126097016, -87488480, -51480552, -21284248, 6805376, 29567628, 38165616, 31655520, -16961900, -736587, -18033494, -29193430, -30501248, -24554864, -15843061, -7511361, -4630512, -13749264, --37041944, -71893456, -115411136, -163850848, -210135568, -248258768, -278091072, -301507232, -317690144, -326059968, --328749696, -326538848, -317392704, -301186208, -280315328, -255096896, -224872144, -192732896, -162321840, -132668320, --103223632, -78363824, -58980100, -39456252, -23711440, -29182156, -56074556, -68051072, -31855772, }, +36310728, 82552496, 112160384, 114129096, 97516160, 47489452, -47207596, -139446848, -172956720, -172927728, +-209062368, -281033120, -323487264, -317248832, -310710272, -329580224, -345570912, -342311584, -339921440, -342769536, +-325651392, -283917728, -245152432, -223469840, -208063248, -199347152, -211438016, -235558560, -241466288, -219431488, +-187860800, -158804272, -126097016, -87488480, -51480552, -21284248, 6805376, 29567628, 38165616, 31655520, +16961900, -736587, -18033494, -29193430, -30501248, -24554864, -15843061, -7511361, -4630512, -13749264, +-37041944, -71893456, -115411136, -163850848, -210135568, -248258768, -278091072, -301507232, -317690144, -326059968, +-328749696, -326538848, -317392704, -301186208, -280315328, -255096896, -224872144, -192732896, -162321840, -132668320, +-103223632, -78363824, -58980100, -39456252, -23711440, -29182156, -56074556, -68051072, -31855772, }, }, { { 8164196, -44547400, 107173392, 151858768, 141665744, 88392040, 21066814, -54681376, -136974560, -194774624, -198866656, --174685984, -177014928, -211105152, -226307200, -197914240, -166187312, -171183968, -193077040, -191026192, -166961488, --151375584, -148994032, -138841264, -116053240, -97335232, -88876296, -78059416, -57178900, -33640332, -15949898, --5432597, -1035624, 192737, 5810017, 21478594, 43743168, 65269544, 82739864, 94780800, 98439576, -93017184, 81910928, 66963908, 46561740, 21537114, -3291019, -25325274, -46266460, -67437432, -88755496, --112122272, -140211360, -172351136, -206041936, -240635744, -275572608, -308160160, -336930528, -363343488, -387111296, --404877440, -416117376, -424204256, -429434464, -428134144, -420355424, -410097440, -396474336, -374188288, -344111168, --312845408, -280789920, -243339424, -206263664, -185131344, -182077088, -173855984, -131779264, -49716932, }, +44547400, 107173392, 151858768, 141665744, 88392040, 21066814, -54681376, -136974560, -194774624, -198866656, +-174685984, -177014928, -211105152, -226307200, -197914240, -166187312, -171183968, -193077040, -191026192, -166961488, +-151375584, -148994032, -138841264, -116053240, -97335232, -88876296, -78059416, -57178900, -33640332, -15949898, +-5432597, -1035624, 192737, 5810017, 21478594, 43743168, 65269544, 82739864, 94780800, 98439576, +93017184, 81910928, 66963908, 46561740, 21537114, -3291019, -25325274, -46266460, -67437432, -88755496, +-112122272, -140211360, -172351136, -206041936, -240635744, -275572608, -308160160, -336930528, -363343488, -387111296, +-404877440, -416117376, -424204256, -429434464, -428134144, -420355424, -410097440, -396474336, -374188288, -344111168, +-312845408, -280789920, -243339424, -206263664, -185131344, -182077088, -173855984, -131779264, -49716932, }, { -121575488, --327745728, -439912576, -444363744, -368528608, -245493344, -86965032, 96915936, 264271488, 355673216, 345737888, -263669648, 159173104, 61461520, -25578140, -102469864, -160386960, -187825360, -184911760, -164087072, -133838160, --88987968, -24737402, 46355584, 102826888, 135619504, 149487952, 146968416, 124120800, 81604912, 28876676, --23648090, -69442640, -103766944, -123045984, -125989104, -112232328, -82238424, -40732932, 3103114, 40929964, -68689408, 85459112, 92190400, 90564752, 80275624, 59148680, 27699318, -9310952, -46522548, -79008072, --100086160, -104067592, -91500520, -67148056, -34903052, 443992, 30932354, 51430084, 63724968, 69987568, -68585256, 60078540, 48424144, 32638530, 7427609, -25753160, -59433756, -90916944, -118414936, -130138584, --114544096, -76610408, -26872536, 33355790, 92639224, 114539264, 78836272, 23021024, -652298, }, +-327745728, -439912576, -444363744, -368528608, -245493344, -86965032, 96915936, 264271488, 355673216, 345737888, +263669648, 159173104, 61461520, -25578140, -102469864, -160386960, -187825360, -184911760, -164087072, -133838160, +-88987968, -24737402, 46355584, 102826888, 135619504, 149487952, 146968416, 124120800, 81604912, 28876676, +-23648090, -69442640, -103766944, -123045984, -125989104, -112232328, -82238424, -40732932, 3103114, 40929964, +68689408, 85459112, 92190400, 90564752, 80275624, 59148680, 27699318, -9310952, -46522548, -79008072, +-100086160, -104067592, -91500520, -67148056, -34903052, 443992, 30932354, 51430084, 63724968, 69987568, +68585256, 60078540, 48424144, 32638530, 7427609, -25753160, -59433756, -90916944, -118414936, -130138584, +-114544096, -76610408, -26872536, 33355790, 92639224, 114539264, 78836272, 23021024, -652298, }, }, { { -121575488, --327745728, -439912576, -444363744, -368528608, -245493344, -86965032, 96915936, 264271488, 355673216, 345737888, -263669648, 159173104, 61461520, -25578140, -102469864, -160386960, -187825360, -184911760, -164087072, -133838160, --88987968, -24737402, 46355584, 102826888, 135619504, 149487952, 146968416, 124120800, 81604912, 28876676, --23648090, -69442640, -103766944, -123045984, -125989104, -112232328, -82238424, -40732932, 3103114, 40929964, -68689408, 85459112, 92190400, 90564752, 80275624, 59148680, 27699318, -9310952, -46522548, -79008072, --100086160, -104067592, -91500520, -67148056, -34903052, 443992, 30932354, 51430084, 63724968, 69987568, -68585256, 60078540, 48424144, 32638530, 7427609, -25753160, -59433756, -90916944, -118414936, -130138584, --114544096, -76610408, -26872536, 33355790, 92639224, 114539264, 78836272, 23021024, -652298, }, +-327745728, -439912576, -444363744, -368528608, -245493344, -86965032, 96915936, 264271488, 355673216, 345737888, +263669648, 159173104, 61461520, -25578140, -102469864, -160386960, -187825360, -184911760, -164087072, -133838160, +-88987968, -24737402, 46355584, 102826888, 135619504, 149487952, 146968416, 124120800, 81604912, 28876676, +-23648090, -69442640, -103766944, -123045984, -125989104, -112232328, -82238424, -40732932, 3103114, 40929964, +68689408, 85459112, 92190400, 90564752, 80275624, 59148680, 27699318, -9310952, -46522548, -79008072, +-100086160, -104067592, -91500520, -67148056, -34903052, 443992, 30932354, 51430084, 63724968, 69987568, +68585256, 60078540, 48424144, 32638530, 7427609, -25753160, -59433756, -90916944, -118414936, -130138584, +-114544096, -76610408, -26872536, 33355790, 92639224, 114539264, 78836272, 23021024, -652298, }, { 8164196, -44547400, 107173392, 151858768, 141665744, 88392040, 21066814, -54681376, -136974560, -194774624, -198866656, --174685984, -177014928, -211105152, -226307200, -197914240, -166187312, -171183968, -193077040, -191026192, -166961488, --151375584, -148994032, -138841264, -116053240, -97335232, -88876296, -78059416, -57178900, -33640332, -15949898, --5432597, -1035624, 192737, 5810017, 21478594, 43743168, 65269544, 82739864, 94780800, 98439576, -93017184, 81910928, 66963908, 46561740, 21537114, -3291019, -25325274, -46266460, -67437432, -88755496, --112122272, -140211360, -172351136, -206041936, -240635744, -275572608, -308160160, -336930528, -363343488, -387111296, --404877440, -416117376, -424204256, -429434464, -428134144, -420355424, -410097440, -396474336, -374188288, -344111168, --312845408, -280789920, -243339424, -206263664, -185131344, -182077088, -173855984, -131779264, -49716932, }, +44547400, 107173392, 151858768, 141665744, 88392040, 21066814, -54681376, -136974560, -194774624, -198866656, +-174685984, -177014928, -211105152, -226307200, -197914240, -166187312, -171183968, -193077040, -191026192, -166961488, +-151375584, -148994032, -138841264, -116053240, -97335232, -88876296, -78059416, -57178900, -33640332, -15949898, +-5432597, -1035624, 192737, 5810017, 21478594, 43743168, 65269544, 82739864, 94780800, 98439576, +93017184, 81910928, 66963908, 46561740, 21537114, -3291019, -25325274, -46266460, -67437432, -88755496, +-112122272, -140211360, -172351136, -206041936, -240635744, -275572608, -308160160, -336930528, -363343488, -387111296, +-404877440, -416117376, -424204256, -429434464, -428134144, -420355424, -410097440, -396474336, -374188288, -344111168, +-312845408, -280789920, -243339424, -206263664, -185131344, -182077088, -173855984, -131779264, -49716932, }, }, { { 23554674, -63680944, 100486128, 143425072, 160396624, 105198784, -958851, -80830208, -108001784, -133792528, -184129536, --203911632, -148618224, -66377108, -29700236, -34437048, -29727616, -10700374, -13250511, -38631084, -49996104, --38671884, -37946572, -66779764, -102261560, -114666496, -99396280, -69727720, -40418328, -20343112, -5313412, -20069846, 61832496, 103414760, 122720104, 115239344, 92404072, 65606700, 39885752, 16847546, -2928094, --18153216, -27101244, -32216550, -40784472, -57119844, -79209936, -106136696, -141351136, -185442736, -233775072, --283348672, -333599776, -380434784, -418755008, -449614368, -476425696, -498366528, -515928640, -535856224, -562014720, --590205248, -618661568, -651252352, -684484672, -706655808, -714453824, -713151936, -699310336, -664759488, -616559168, --568175872, -515411648, -449946688, -387446304, -345378720, -302782304, -225644704, -124012888, -36187248, }, +63680944, 100486128, 143425072, 160396624, 105198784, -958851, -80830208, -108001784, -133792528, -184129536, +-203911632, -148618224, -66377108, -29700236, -34437048, -29727616, -10700374, -13250511, -38631084, -49996104, +-38671884, -37946572, -66779764, -102261560, -114666496, -99396280, -69727720, -40418328, -20343112, -5313412, +20069846, 61832496, 103414760, 122720104, 115239344, 92404072, 65606700, 39885752, 16847546, -2928094, +-18153216, -27101244, -32216550, -40784472, -57119844, -79209936, -106136696, -141351136, -185442736, -233775072, +-283348672, -333599776, -380434784, -418755008, -449614368, -476425696, -498366528, -515928640, -535856224, -562014720, +-590205248, -618661568, -651252352, -684484672, -706655808, -714453824, -713151936, -699310336, -664759488, -616559168, +-568175872, -515411648, -449946688, -387446304, -345378720, -302782304, -225644704, -124012888, -36187248, }, { -134445904, --354867904, -462737632, -454919712, -356354496, -184022704, 40757628, 262201840, 404614912, 426365152, 345501120, -208006336, 46817828, -119911728, -266756656, -356998752, -362689600, -282963712, -143316624, 19385334, 171397120, -285301248, 336403328, 307668384, 204379248, 58105540, -90248536, -209021568, -277893504, -283894112, -226059696, --120651000, 5003100, 122632592, 206948160, 238739520, 212521424, 140400336, 45597520, -47734804, -120938760, --163346192, -171559248, -146704816, -94255208, -26338886, 40620192, 93026848, 122830160, 125343792, 100967704, -58784680, 11866995, -31174484, -65726960, -86230592, -88996552, -77031312, -55747064, -27654220, 3765613, -31211528, 50083076, 61416960, 64772940, 56640420, 38346004, 15450071, -11638825, -44530756, -75189312, --91152624, -89874872, -73525008, -37754372, 13605383, 52383568, 52429740, 26051124, 5407364, }, +-354867904, -462737632, -454919712, -356354496, -184022704, 40757628, 262201840, 404614912, 426365152, 345501120, +208006336, 46817828, -119911728, -266756656, -356998752, -362689600, -282963712, -143316624, 19385334, 171397120, +285301248, 336403328, 307668384, 204379248, 58105540, -90248536, -209021568, -277893504, -283894112, -226059696, +-120651000, 5003100, 122632592, 206948160, 238739520, 212521424, 140400336, 45597520, -47734804, -120938760, +-163346192, -171559248, -146704816, -94255208, -26338886, 40620192, 93026848, 122830160, 125343792, 100967704, +58784680, 11866995, -31174484, -65726960, -86230592, -88996552, -77031312, -55747064, -27654220, 3765613, +31211528, 50083076, 61416960, 64772940, 56640420, 38346004, 15450071, -11638825, -44530756, -75189312, +-91152624, -89874872, -73525008, -37754372, 13605383, 52383568, 52429740, 26051124, 5407364, }, }, { { -134445904, --354867904, -462737632, -454919712, -356354496, -184022704, 40757628, 262201840, 404614912, 426365152, 345501120, -208006336, 46817828, -119911728, -266756656, -356998752, -362689600, -282963712, -143316624, 19385334, 171397120, -285301248, 336403328, 307668384, 204379248, 58105540, -90248536, -209021568, -277893504, -283894112, -226059696, --120651000, 5003100, 122632592, 206948160, 238739520, 212521424, 140400336, 45597520, -47734804, -120938760, --163346192, -171559248, -146704816, -94255208, -26338886, 40620192, 93026848, 122830160, 125343792, 100967704, -58784680, 11866995, -31174484, -65726960, -86230592, -88996552, -77031312, -55747064, -27654220, 3765613, -31211528, 50083076, 61416960, 64772940, 56640420, 38346004, 15450071, -11638825, -44530756, -75189312, --91152624, -89874872, -73525008, -37754372, 13605383, 52383568, 52429740, 26051124, 5407364, }, +-354867904, -462737632, -454919712, -356354496, -184022704, 40757628, 262201840, 404614912, 426365152, 345501120, +208006336, 46817828, -119911728, -266756656, -356998752, -362689600, -282963712, -143316624, 19385334, 171397120, +285301248, 336403328, 307668384, 204379248, 58105540, -90248536, -209021568, -277893504, -283894112, -226059696, +-120651000, 5003100, 122632592, 206948160, 238739520, 212521424, 140400336, 45597520, -47734804, -120938760, +-163346192, -171559248, -146704816, -94255208, -26338886, 40620192, 93026848, 122830160, 125343792, 100967704, +58784680, 11866995, -31174484, -65726960, -86230592, -88996552, -77031312, -55747064, -27654220, 3765613, +31211528, 50083076, 61416960, 64772940, 56640420, 38346004, 15450071, -11638825, -44530756, -75189312, +-91152624, -89874872, -73525008, -37754372, 13605383, 52383568, 52429740, 26051124, 5407364, }, { 23554674, -63680944, 100486128, 143425072, 160396624, 105198784, -958851, -80830208, -108001784, -133792528, -184129536, --203911632, -148618224, -66377108, -29700236, -34437048, -29727616, -10700374, -13250511, -38631084, -49996104, --38671884, -37946572, -66779764, -102261560, -114666496, -99396280, -69727720, -40418328, -20343112, -5313412, -20069846, 61832496, 103414760, 122720104, 115239344, 92404072, 65606700, 39885752, 16847546, -2928094, --18153216, -27101244, -32216550, -40784472, -57119844, -79209936, -106136696, -141351136, -185442736, -233775072, --283348672, -333599776, -380434784, -418755008, -449614368, -476425696, -498366528, -515928640, -535856224, -562014720, --590205248, -618661568, -651252352, -684484672, -706655808, -714453824, -713151936, -699310336, -664759488, -616559168, --568175872, -515411648, -449946688, -387446304, -345378720, -302782304, -225644704, -124012888, -36187248, }, +63680944, 100486128, 143425072, 160396624, 105198784, -958851, -80830208, -108001784, -133792528, -184129536, +-203911632, -148618224, -66377108, -29700236, -34437048, -29727616, -10700374, -13250511, -38631084, -49996104, +-38671884, -37946572, -66779764, -102261560, -114666496, -99396280, -69727720, -40418328, -20343112, -5313412, +20069846, 61832496, 103414760, 122720104, 115239344, 92404072, 65606700, 39885752, 16847546, -2928094, +-18153216, -27101244, -32216550, -40784472, -57119844, -79209936, -106136696, -141351136, -185442736, -233775072, +-283348672, -333599776, -380434784, -418755008, -449614368, -476425696, -498366528, -515928640, -535856224, -562014720, +-590205248, -618661568, -651252352, -684484672, -706655808, -714453824, -713151936, -699310336, -664759488, -616559168, +-568175872, -515411648, -449946688, -387446304, -345378720, -302782304, -225644704, -124012888, -36187248, }, }, { { -4428648, --12817793, -22537304, -33988760, -39535172, -31816044, -6058052, 52388936, 153264304, 261093216, 307425184, -263993392, 169773072, 73569032, -6526203, -56706452, -55943024, -11604465, 39944268, 82797304, 127639448, -164261568, 159431328, 109619912, 49804976, 6515466, -16895864, -14101451, 20765094, 67684392, 96716224, -103307920, 98653248, 79120816, 33847028, -31095026, -99142344, -160865312, -211477216, -247033632, -271942848, --294957952, -315941568, -330808032, -343203328, -356247136, -364157920, -365933376, -371765920, -384912288, -396248864, --403550304, -414054720, -426279808, -433807808, -443296448, -463264832, -485040864, -499604032, -515666656, -537647232, --551704640, -555206144, -566512640, -588050304, -601189632, -608905024, -632589632, -662465984, -671137472, -670804096, --687241472, -695903872, -667400896, -641328832, -648485312, -605638144, -424692256, -185103968, -37003292, }, +-12817793, -22537304, -33988760, -39535172, -31816044, -6058052, 52388936, 153264304, 261093216, 307425184, +263993392, 169773072, 73569032, -6526203, -56706452, -55943024, -11604465, 39944268, 82797304, 127639448, +164261568, 159431328, 109619912, 49804976, 6515466, -16895864, -14101451, 20765094, 67684392, 96716224, +103307920, 98653248, 79120816, 33847028, -31095026, -99142344, -160865312, -211477216, -247033632, -271942848, +-294957952, -315941568, -330808032, -343203328, -356247136, -364157920, -365933376, -371765920, -384912288, -396248864, +-403550304, -414054720, -426279808, -433807808, -443296448, -463264832, -485040864, -499604032, -515666656, -537647232, +-551704640, -555206144, -566512640, -588050304, -601189632, -608905024, -632589632, -662465984, -671137472, -670804096, +-687241472, -695903872, -667400896, -641328832, -648485312, -605638144, -424692256, -185103968, -37003292, }, { -69350840, --199906576, -311887648, -392731264, -410866784, -342573568, -223211056, -140879216, -163624832, -284638208, -435727104, --534943008, -530843456, -435152128, -318364448, -249764704, -238453360, -247804576, -252108672, -246991216, -217418768, --141864384, -33516314, 60608968, 112287088, 136834976, 161198720, 195325984, 239988816, 295499648, 353162816, -396481312, 416609152, 415039328, 394495968, 361008640, 328777600, 307674272, 290885792, 266287968, 232155872, -192372656, 147222896, 98384280, 51841864, 8317204, -38079180, -87672632, -134203232, -177202304, -221665408, --266239648, -305633632, -341292064, -375708704, -402299392, -414610912, -417046144, -413983840, -400061184, -372735520, --339849472, -304759072, -261169984, -210188720, -162091536, -116283016, -62799400, -5180268, 44332116, 89105000, -137649408, 177868560, 197069200, 212243328, 236309632, 234228192, 169281840, 75060456, 15222438, }, +-199906576, -311887648, -392731264, -410866784, -342573568, -223211056, -140879216, -163624832, -284638208, -435727104, +-534943008, -530843456, -435152128, -318364448, -249764704, -238453360, -247804576, -252108672, -246991216, -217418768, +-141864384, -33516314, 60608968, 112287088, 136834976, 161198720, 195325984, 239988816, 295499648, 353162816, +396481312, 416609152, 415039328, 394495968, 361008640, 328777600, 307674272, 290885792, 266287968, 232155872, +192372656, 147222896, 98384280, 51841864, 8317204, -38079180, -87672632, -134203232, -177202304, -221665408, +-266239648, -305633632, -341292064, -375708704, -402299392, -414610912, -417046144, -413983840, -400061184, -372735520, +-339849472, -304759072, -261169984, -210188720, -162091536, -116283016, -62799400, -5180268, 44332116, 89105000, +137649408, 177868560, 197069200, 212243328, 236309632, 234228192, 169281840, 75060456, 15222438, }, }, { { -69350840, --199906576, -311887648, -392731264, -410866784, -342573568, -223211056, -140879216, -163624832, -284638208, -435727104, --534943008, -530843456, -435152128, -318364448, -249764704, -238453360, -247804576, -252108672, -246991216, -217418768, --141864384, -33516314, 60608968, 112287088, 136834976, 161198720, 195325984, 239988816, 295499648, 353162816, -396481312, 416609152, 415039328, 394495968, 361008640, 328777600, 307674272, 290885792, 266287968, 232155872, -192372656, 147222896, 98384280, 51841864, 8317204, -38079180, -87672632, -134203232, -177202304, -221665408, --266239648, -305633632, -341292064, -375708704, -402299392, -414610912, -417046144, -413983840, -400061184, -372735520, --339849472, -304759072, -261169984, -210188720, -162091536, -116283016, -62799400, -5180268, 44332116, 89105000, -137649408, 177868560, 197069200, 212243328, 236309632, 234228192, 169281840, 75060456, 15222438, }, +-199906576, -311887648, -392731264, -410866784, -342573568, -223211056, -140879216, -163624832, -284638208, -435727104, +-534943008, -530843456, -435152128, -318364448, -249764704, -238453360, -247804576, -252108672, -246991216, -217418768, +-141864384, -33516314, 60608968, 112287088, 136834976, 161198720, 195325984, 239988816, 295499648, 353162816, +396481312, 416609152, 415039328, 394495968, 361008640, 328777600, 307674272, 290885792, 266287968, 232155872, +192372656, 147222896, 98384280, 51841864, 8317204, -38079180, -87672632, -134203232, -177202304, -221665408, +-266239648, -305633632, -341292064, -375708704, -402299392, -414610912, -417046144, -413983840, -400061184, -372735520, +-339849472, -304759072, -261169984, -210188720, -162091536, -116283016, -62799400, -5180268, 44332116, 89105000, +137649408, 177868560, 197069200, 212243328, 236309632, 234228192, 169281840, 75060456, 15222438, }, { -4428648, --12817793, -22537304, -33988760, -39535172, -31816044, -6058052, 52388936, 153264304, 261093216, 307425184, -263993392, 169773072, 73569032, -6526203, -56706452, -55943024, -11604465, 39944268, 82797304, 127639448, -164261568, 159431328, 109619912, 49804976, 6515466, -16895864, -14101451, 20765094, 67684392, 96716224, -103307920, 98653248, 79120816, 33847028, -31095026, -99142344, -160865312, -211477216, -247033632, -271942848, --294957952, -315941568, -330808032, -343203328, -356247136, -364157920, -365933376, -371765920, -384912288, -396248864, --403550304, -414054720, -426279808, -433807808, -443296448, -463264832, -485040864, -499604032, -515666656, -537647232, --551704640, -555206144, -566512640, -588050304, -601189632, -608905024, -632589632, -662465984, -671137472, -670804096, --687241472, -695903872, -667400896, -641328832, -648485312, -605638144, -424692256, -185103968, -37003292, }, +-12817793, -22537304, -33988760, -39535172, -31816044, -6058052, 52388936, 153264304, 261093216, 307425184, +263993392, 169773072, 73569032, -6526203, -56706452, -55943024, -11604465, 39944268, 82797304, 127639448, +164261568, 159431328, 109619912, 49804976, 6515466, -16895864, -14101451, 20765094, 67684392, 96716224, +103307920, 98653248, 79120816, 33847028, -31095026, -99142344, -160865312, -211477216, -247033632, -271942848, +-294957952, -315941568, -330808032, -343203328, -356247136, -364157920, -365933376, -371765920, -384912288, -396248864, +-403550304, -414054720, -426279808, -433807808, -443296448, -463264832, -485040864, -499604032, -515666656, -537647232, +-551704640, -555206144, -566512640, -588050304, -601189632, -608905024, -632589632, -662465984, -671137472, -670804096, +-687241472, -695903872, -667400896, -641328832, -648485312, -605638144, -424692256, -185103968, -37003292, }, }, { { 4335233, -20616380, 49456012, 69235944, 42754788, -34925064, -109610248, -120600000, -75574248, -35679368, -27114128, --15243913, 21977348, 47280072, 20015622, -43954696, -104432664, -155194352, -211883088, -267991456, -302190688, --313634624, -317882336, -319672256, -314427584, -305008192, -297233216, -289331008, -278697216, -267171664, -252595072, --229863968, -203925584, -185493200, -173132816, -156063008, -132223792, -107246944, -81357952, -53597972, -30962420, --18345952, -9557376, -471373, 2304250, -4316442, -13293461, -22566296, -38360500, -58558120, -72458784, --78857208, -84461608, -87244208, -82279760, -77346992, -81921672, -91409792, -101298416, -120460408, -152264112, --183732256, -209425296, -240028544, -274892416, -298074496, -310640480, -329773504, -351942496, -359755040, -362668640, --380955552, -399289696, -394886816, -392853664, -420282944, -427300928, -342532768, -189912720, -54082764, }, +20616380, 49456012, 69235944, 42754788, -34925064, -109610248, -120600000, -75574248, -35679368, -27114128, +-15243913, 21977348, 47280072, 20015622, -43954696, -104432664, -155194352, -211883088, -267991456, -302190688, +-313634624, -317882336, -319672256, -314427584, -305008192, -297233216, -289331008, -278697216, -267171664, -252595072, +-229863968, -203925584, -185493200, -173132816, -156063008, -132223792, -107246944, -81357952, -53597972, -30962420, +-18345952, -9557376, -471373, 2304250, -4316442, -13293461, -22566296, -38360500, -58558120, -72458784, +-78857208, -84461608, -87244208, -82279760, -77346992, -81921672, -91409792, -101298416, -120460408, -152264112, +-183732256, -209425296, -240028544, -274892416, -298074496, -310640480, -329773504, -351942496, -359755040, -362668640, +-380955552, -399289696, -394886816, -392853664, -420282944, -427300928, -342532768, -189912720, -54082764, }, { -99345816, --286369632, -427405632, -480084992, -431886880, -323924288, -221190816, -155707056, -104193760, -24307368, 91562800, -205071264, 273453600, 291721152, 286386816, 276125600, 252572000, 198656192, 113060720, 13233868, -77841984, --145458192, -189659312, -219943120, -241321872, -247546880, -230110384, -188789040, -129440112, -57381836, 21233782, -95871184, 155221728, 192750080, 206907360, 199403520, 174810544, 138590000, 94764160, 47423956, 2244657, --36883568, -70249560, -98521184, -120003536, -133912248, -141698480, -142972480, -134980624, -117253144, -91475288, --57106424, -13491029, 34559992, 79605608, 118001544, 147751168, 164080096, 163572752, 148051280, 119160648, -75744432, 21119428, -35354560, -87692496, -134928016, -171976928, -190841504, -191279056, -177239872, -145453360, --93279176, -32515050, 22766548, 72799696, 114743272, 124032752, 85572928, 30638150, 3125126, }, +-286369632, -427405632, -480084992, -431886880, -323924288, -221190816, -155707056, -104193760, -24307368, 91562800, +205071264, 273453600, 291721152, 286386816, 276125600, 252572000, 198656192, 113060720, 13233868, -77841984, +-145458192, -189659312, -219943120, -241321872, -247546880, -230110384, -188789040, -129440112, -57381836, 21233782, +95871184, 155221728, 192750080, 206907360, 199403520, 174810544, 138590000, 94764160, 47423956, 2244657, +-36883568, -70249560, -98521184, -120003536, -133912248, -141698480, -142972480, -134980624, -117253144, -91475288, +-57106424, -13491029, 34559992, 79605608, 118001544, 147751168, 164080096, 163572752, 148051280, 119160648, +75744432, 21119428, -35354560, -87692496, -134928016, -171976928, -190841504, -191279056, -177239872, -145453360, +-93279176, -32515050, 22766548, 72799696, 114743272, 124032752, 85572928, 30638150, 3125126, }, }, { { -99345816, --286369632, -427405632, -480084992, -431886880, -323924288, -221190816, -155707056, -104193760, -24307368, 91562800, -205071264, 273453600, 291721152, 286386816, 276125600, 252572000, 198656192, 113060720, 13233868, -77841984, --145458192, -189659312, -219943120, -241321872, -247546880, -230110384, -188789040, -129440112, -57381836, 21233782, -95871184, 155221728, 192750080, 206907360, 199403520, 174810544, 138590000, 94764160, 47423956, 2244657, --36883568, -70249560, -98521184, -120003536, -133912248, -141698480, -142972480, -134980624, -117253144, -91475288, --57106424, -13491029, 34559992, 79605608, 118001544, 147751168, 164080096, 163572752, 148051280, 119160648, -75744432, 21119428, -35354560, -87692496, -134928016, -171976928, -190841504, -191279056, -177239872, -145453360, --93279176, -32515050, 22766548, 72799696, 114743272, 124032752, 85572928, 30638150, 3125126, }, +-286369632, -427405632, -480084992, -431886880, -323924288, -221190816, -155707056, -104193760, -24307368, 91562800, +205071264, 273453600, 291721152, 286386816, 276125600, 252572000, 198656192, 113060720, 13233868, -77841984, +-145458192, -189659312, -219943120, -241321872, -247546880, -230110384, -188789040, -129440112, -57381836, 21233782, +95871184, 155221728, 192750080, 206907360, 199403520, 174810544, 138590000, 94764160, 47423956, 2244657, +-36883568, -70249560, -98521184, -120003536, -133912248, -141698480, -142972480, -134980624, -117253144, -91475288, +-57106424, -13491029, 34559992, 79605608, 118001544, 147751168, 164080096, 163572752, 148051280, 119160648, +75744432, 21119428, -35354560, -87692496, -134928016, -171976928, -190841504, -191279056, -177239872, -145453360, +-93279176, -32515050, 22766548, 72799696, 114743272, 124032752, 85572928, 30638150, 3125126, }, { 4335233, -20616380, 49456012, 69235944, 42754788, -34925064, -109610248, -120600000, -75574248, -35679368, -27114128, --15243913, 21977348, 47280072, 20015622, -43954696, -104432664, -155194352, -211883088, -267991456, -302190688, --313634624, -317882336, -319672256, -314427584, -305008192, -297233216, -289331008, -278697216, -267171664, -252595072, --229863968, -203925584, -185493200, -173132816, -156063008, -132223792, -107246944, -81357952, -53597972, -30962420, --18345952, -9557376, -471373, 2304250, -4316442, -13293461, -22566296, -38360500, -58558120, -72458784, --78857208, -84461608, -87244208, -82279760, -77346992, -81921672, -91409792, -101298416, -120460408, -152264112, --183732256, -209425296, -240028544, -274892416, -298074496, -310640480, -329773504, -351942496, -359755040, -362668640, --380955552, -399289696, -394886816, -392853664, -420282944, -427300928, -342532768, -189912720, -54082764, }, +20616380, 49456012, 69235944, 42754788, -34925064, -109610248, -120600000, -75574248, -35679368, -27114128, +-15243913, 21977348, 47280072, 20015622, -43954696, -104432664, -155194352, -211883088, -267991456, -302190688, +-313634624, -317882336, -319672256, -314427584, -305008192, -297233216, -289331008, -278697216, -267171664, -252595072, +-229863968, -203925584, -185493200, -173132816, -156063008, -132223792, -107246944, -81357952, -53597972, -30962420, +-18345952, -9557376, -471373, 2304250, -4316442, -13293461, -22566296, -38360500, -58558120, -72458784, +-78857208, -84461608, -87244208, -82279760, -77346992, -81921672, -91409792, -101298416, -120460408, -152264112, +-183732256, -209425296, -240028544, -274892416, -298074496, -310640480, -329773504, -351942496, -359755040, -362668640, +-380955552, -399289696, -394886816, -392853664, -420282944, -427300928, -342532768, -189912720, -54082764, }, }, { { 485331, -10242960, 31972274, 43328168, 18358838, -41247792, -103692320, -138647984, -144314128, -136896720, -122505352, --95425584, -62041340, -46414100, -64334316, -106537200, -156071600, -207659520, -259043968, -298011136, -314279392, --315926528, -319767840, -330993792, -343319296, -352833184, -360500768, -365669760, -366703776, -365058784, -362441024, --357266112, -347681376, -333688352, -313987328, -285891808, -250179696, -211662432, -174741824, -142250928, -116871968, --99368360, -87635048, -80598280, -79409648, -82679192, -85931560, -87700544, -90206128, -93239984, -94304064, --94775432, -98646808, -106169448, -115775672, -129464272, -149003696, -170912848, -191925440, -213642944, -236010064, --254295344, -267836848, -281970496, -297131200, -307629728, -313544960, -319844608, -323095360, -315331136, -299738784, --284300000, -264724608, -235417888, -208847072, -196258528, -178760304, -131210712, -66350264, -17217988, }, +10242960, 31972274, 43328168, 18358838, -41247792, -103692320, -138647984, -144314128, -136896720, -122505352, +-95425584, -62041340, -46414100, -64334316, -106537200, -156071600, -207659520, -259043968, -298011136, -314279392, +-315926528, -319767840, -330993792, -343319296, -352833184, -360500768, -365669760, -366703776, -365058784, -362441024, +-357266112, -347681376, -333688352, -313987328, -285891808, -250179696, -211662432, -174741824, -142250928, -116871968, +-99368360, -87635048, -80598280, -79409648, -82679192, -85931560, -87700544, -90206128, -93239984, -94304064, +-94775432, -98646808, -106169448, -115775672, -129464272, -149003696, -170912848, -191925440, -213642944, -236010064, +-254295344, -267836848, -281970496, -297131200, -307629728, -313544960, -319844608, -323095360, -315331136, -299738784, +-284300000, -264724608, -235417888, -208847072, -196258528, -178760304, -131210712, -66350264, -17217988, }, { -70953936, --213264448, -340538816, -414134176, -409366752, -353428032, -306926432, -299649120, -300532288, -265251808, -197311328, --137314400, -101265128, -61981748, 5509370, 90977072, 171506096, 239528720, 293170720, 321731168, 319811840, -300423296, 277909088, 250022928, 209204640, 158823600, 106245144, 50823420, -10669773, -75280040, -137317088, --192245952, -233691312, -255845296, -260910144, -255517264, -240265840, -211742960, -172575008, -130165424, -88486528, --49173080, -15943455, 9725417, 31963684, 53752588, 73487424, 92061016, 114548392, 141434880, 166937856, -187263264, 201139232, 203403744, 188994672, 161490768, 127726424, 88114472, 41495828, -7604240, -55883968, --106299368, -157816432, -201166064, -231501424, -252095248, -261367552, -252826464, -230248368, -203759696, -171087872, --124413928, -71516576, -24179056, 25768730, 85896128, 128984848, 119969176, 69876432, 20000588, }, +-213264448, -340538816, -414134176, -409366752, -353428032, -306926432, -299649120, -300532288, -265251808, -197311328, +-137314400, -101265128, -61981748, 5509370, 90977072, 171506096, 239528720, 293170720, 321731168, 319811840, +300423296, 277909088, 250022928, 209204640, 158823600, 106245144, 50823420, -10669773, -75280040, -137317088, +-192245952, -233691312, -255845296, -260910144, -255517264, -240265840, -211742960, -172575008, -130165424, -88486528, +-49173080, -15943455, 9725417, 31963684, 53752588, 73487424, 92061016, 114548392, 141434880, 166937856, +187263264, 201139232, 203403744, 188994672, 161490768, 127726424, 88114472, 41495828, -7604240, -55883968, +-106299368, -157816432, -201166064, -231501424, -252095248, -261367552, -252826464, -230248368, -203759696, -171087872, +-124413928, -71516576, -24179056, 25768730, 85896128, 128984848, 119969176, 69876432, 20000588, }, }, { { -70953936, --213264448, -340538816, -414134176, -409366752, -353428032, -306926432, -299649120, -300532288, -265251808, -197311328, --137314400, -101265128, -61981748, 5509370, 90977072, 171506096, 239528720, 293170720, 321731168, 319811840, -300423296, 277909088, 250022928, 209204640, 158823600, 106245144, 50823420, -10669773, -75280040, -137317088, --192245952, -233691312, -255845296, -260910144, -255517264, -240265840, -211742960, -172575008, -130165424, -88486528, --49173080, -15943455, 9725417, 31963684, 53752588, 73487424, 92061016, 114548392, 141434880, 166937856, -187263264, 201139232, 203403744, 188994672, 161490768, 127726424, 88114472, 41495828, -7604240, -55883968, --106299368, -157816432, -201166064, -231501424, -252095248, -261367552, -252826464, -230248368, -203759696, -171087872, --124413928, -71516576, -24179056, 25768730, 85896128, 128984848, 119969176, 69876432, 20000588, }, +-213264448, -340538816, -414134176, -409366752, -353428032, -306926432, -299649120, -300532288, -265251808, -197311328, +-137314400, -101265128, -61981748, 5509370, 90977072, 171506096, 239528720, 293170720, 321731168, 319811840, +300423296, 277909088, 250022928, 209204640, 158823600, 106245144, 50823420, -10669773, -75280040, -137317088, +-192245952, -233691312, -255845296, -260910144, -255517264, -240265840, -211742960, -172575008, -130165424, -88486528, +-49173080, -15943455, 9725417, 31963684, 53752588, 73487424, 92061016, 114548392, 141434880, 166937856, +187263264, 201139232, 203403744, 188994672, 161490768, 127726424, 88114472, 41495828, -7604240, -55883968, +-106299368, -157816432, -201166064, -231501424, -252095248, -261367552, -252826464, -230248368, -203759696, -171087872, +-124413928, -71516576, -24179056, 25768730, 85896128, 128984848, 119969176, 69876432, 20000588, }, { 485331, -10242960, 31972274, 43328168, 18358838, -41247792, -103692320, -138647984, -144314128, -136896720, -122505352, --95425584, -62041340, -46414100, -64334316, -106537200, -156071600, -207659520, -259043968, -298011136, -314279392, --315926528, -319767840, -330993792, -343319296, -352833184, -360500768, -365669760, -366703776, -365058784, -362441024, --357266112, -347681376, -333688352, -313987328, -285891808, -250179696, -211662432, -174741824, -142250928, -116871968, --99368360, -87635048, -80598280, -79409648, -82679192, -85931560, -87700544, -90206128, -93239984, -94304064, --94775432, -98646808, -106169448, -115775672, -129464272, -149003696, -170912848, -191925440, -213642944, -236010064, --254295344, -267836848, -281970496, -297131200, -307629728, -313544960, -319844608, -323095360, -315331136, -299738784, --284300000, -264724608, -235417888, -208847072, -196258528, -178760304, -131210712, -66350264, -17217988, }, +10242960, 31972274, 43328168, 18358838, -41247792, -103692320, -138647984, -144314128, -136896720, -122505352, +-95425584, -62041340, -46414100, -64334316, -106537200, -156071600, -207659520, -259043968, -298011136, -314279392, +-315926528, -319767840, -330993792, -343319296, -352833184, -360500768, -365669760, -366703776, -365058784, -362441024, +-357266112, -347681376, -333688352, -313987328, -285891808, -250179696, -211662432, -174741824, -142250928, -116871968, +-99368360, -87635048, -80598280, -79409648, -82679192, -85931560, -87700544, -90206128, -93239984, -94304064, +-94775432, -98646808, -106169448, -115775672, -129464272, -149003696, -170912848, -191925440, -213642944, -236010064, +-254295344, -267836848, -281970496, -297131200, -307629728, -313544960, -319844608, -323095360, -315331136, -299738784, +-284300000, -264724608, -235417888, -208847072, -196258528, -178760304, -131210712, -66350264, -17217988, }, }, }; const Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 523696096, -442117504, 310699008, 167178384, 38328824, -62973884, -142701904, -218207424, -288233120, -324050464, -305476864, --239455696, -124559960, 52899500, 239470736, 289440000, 117837256, -137072800, -214231360, -22201760, 253544800, -372249120, 286295008, 117738472, -31679678, -156358816, -271503680, -359748064, -405781536, -424572000, -434228160, --433325696, -417425728, -393916672, -370626688, -346321472, -318988288, -291659424, -266480704, -241915648, -217410704, --194249024, -171965120, -149140592, -126572152, -105665320, -85652384, -65502008, -46165528, -28507308, -11534135, -5517959, 21835614, 36923296, 51426328, 65420940, 78127600, 89553824, 100435664, 110730160, 119946624, -128456568, 136897792, 144993808, 152274304, 159110816, 165962368, 172539568, 178568096, 184424816, 190402880, -196267664, 201906416, 207601008, 213461488, 219304784, 225092800, 230917840, 236754704, 242604992, 248525056, -254273872, 259479376, 264267184, 269042656, 273646848, 277524672, 280694912, 283720704, 286716992, 289173184, -290755872, 291661024, 292211328, 292578528, 292768608, 292590368, 291897792, 291028608, 290619488, 290858944, -291348032, 291775392, 292309024, 293284512, 294904256, 297195616, 299932608, 302707136, 305358752, 308171424, -311448480, 315120128, 318904000, 322573504, 325947744, 328940800, 331715360, 334517824, 337346048, 339990688, -342338944, 344415040, 346238240, 347855296, 349375200, 350801664, 351969888, 352762848, 353224544, 353432864, -353450560, 353402272, 353409760, 353459168, 353489216, 353525216, 353615936, 353763584, 354041664, 354629536, -355629728, 356984256, 358612576, 360484672, 362536576, 364679776, 366888448, 369164256, 371435200, 373599872, -375592736, 377362272, 378847264, 380034272, 380948576, 381599776, 382006752, 382226848, 382302560, 382249408, -382125920, 382023904, 381983104, 382034656, 382263360, 382681600, 383146528, 383545952, 383915328, 384261600, -384489216, 384601440, 384703968, 384776992, 384730816, 384668544, 384751776, 384924096, 385130240, 385565120, -386347872, 387285248, 388299936, 389614208, 391214080, 392766176, 394279616, 396044288, 397870752, 399357856, -400790240, 402575872, 404207968, 405212448, 406370464, 408240928, 409671712, 409968576, 410793760, 413089408, -414437504, 413311680, 413165120, 416964544, 420169120, 415984224, 406336640, 400335520, 402015904, 406590592, -408728960, 407087744, 400552416, 388721920, 377990944, 378296960, 389718368, 399499616, 397218976, 387056000, -379926368, 378810752, 378725920, 378463936, 384824224, 403541184, 430237088, 453206560, 464204896, 464701504, -461558112, 458781952, 455806080, 452544064, 451409664, 452445280, 450857216, 443671200, 436101856, }, +442117504, 310699008, 167178384, 38328824, -62973884, -142701904, -218207424, -288233120, -324050464, -305476864, +-239455696, -124559960, 52899500, 239470736, 289440000, 117837256, -137072800, -214231360, -22201760, 253544800, +372249120, 286295008, 117738472, -31679678, -156358816, -271503680, -359748064, -405781536, -424572000, -434228160, +-433325696, -417425728, -393916672, -370626688, -346321472, -318988288, -291659424, -266480704, -241915648, -217410704, +-194249024, -171965120, -149140592, -126572152, -105665320, -85652384, -65502008, -46165528, -28507308, -11534135, +5517959, 21835614, 36923296, 51426328, 65420940, 78127600, 89553824, 100435664, 110730160, 119946624, +128456568, 136897792, 144993808, 152274304, 159110816, 165962368, 172539568, 178568096, 184424816, 190402880, +196267664, 201906416, 207601008, 213461488, 219304784, 225092800, 230917840, 236754704, 242604992, 248525056, +254273872, 259479376, 264267184, 269042656, 273646848, 277524672, 280694912, 283720704, 286716992, 289173184, +290755872, 291661024, 292211328, 292578528, 292768608, 292590368, 291897792, 291028608, 290619488, 290858944, +291348032, 291775392, 292309024, 293284512, 294904256, 297195616, 299932608, 302707136, 305358752, 308171424, +311448480, 315120128, 318904000, 322573504, 325947744, 328940800, 331715360, 334517824, 337346048, 339990688, +342338944, 344415040, 346238240, 347855296, 349375200, 350801664, 351969888, 352762848, 353224544, 353432864, +353450560, 353402272, 353409760, 353459168, 353489216, 353525216, 353615936, 353763584, 354041664, 354629536, +355629728, 356984256, 358612576, 360484672, 362536576, 364679776, 366888448, 369164256, 371435200, 373599872, +375592736, 377362272, 378847264, 380034272, 380948576, 381599776, 382006752, 382226848, 382302560, 382249408, +382125920, 382023904, 381983104, 382034656, 382263360, 382681600, 383146528, 383545952, 383915328, 384261600, +384489216, 384601440, 384703968, 384776992, 384730816, 384668544, 384751776, 384924096, 385130240, 385565120, +386347872, 387285248, 388299936, 389614208, 391214080, 392766176, 394279616, 396044288, 397870752, 399357856, +400790240, 402575872, 404207968, 405212448, 406370464, 408240928, 409671712, 409968576, 410793760, 413089408, +414437504, 413311680, 413165120, 416964544, 420169120, 415984224, 406336640, 400335520, 402015904, 406590592, +408728960, 407087744, 400552416, 388721920, 377990944, 378296960, 389718368, 399499616, 397218976, 387056000, +379926368, 378810752, 378725920, 378463936, 384824224, 403541184, 430237088, 453206560, 464204896, 464701504, +461558112, 458781952, 455806080, 452544064, 451409664, 452445280, 450857216, 443671200, 436101856, }, { 523696096, -442117504, 310699008, 167178384, 38328824, -62973884, -142701904, -218207424, -288233120, -324050464, -305476864, --239455696, -124559960, 52899500, 239470736, 289440000, 117837256, -137072800, -214231360, -22201760, 253544800, -372249120, 286295008, 117738472, -31679678, -156358816, -271503680, -359748064, -405781536, -424572000, -434228160, --433325696, -417425728, -393916672, -370626688, -346321472, -318988288, -291659424, -266480704, -241915648, -217410704, --194249024, -171965120, -149140592, -126572152, -105665320, -85652384, -65502008, -46165528, -28507308, -11534135, -5517959, 21835614, 36923296, 51426328, 65420940, 78127600, 89553824, 100435664, 110730160, 119946624, -128456568, 136897792, 144993808, 152274304, 159110816, 165962368, 172539568, 178568096, 184424816, 190402880, -196267664, 201906416, 207601008, 213461488, 219304784, 225092800, 230917840, 236754704, 242604992, 248525056, -254273872, 259479376, 264267184, 269042656, 273646848, 277524672, 280694912, 283720704, 286716992, 289173184, -290755872, 291661024, 292211328, 292578528, 292768608, 292590368, 291897792, 291028608, 290619488, 290858944, -291348032, 291775392, 292309024, 293284512, 294904256, 297195616, 299932608, 302707136, 305358752, 308171424, -311448480, 315120128, 318904000, 322573504, 325947744, 328940800, 331715360, 334517824, 337346048, 339990688, -342338944, 344415040, 346238240, 347855296, 349375200, 350801664, 351969888, 352762848, 353224544, 353432864, -353450560, 353402272, 353409760, 353459168, 353489216, 353525216, 353615936, 353763584, 354041664, 354629536, -355629728, 356984256, 358612576, 360484672, 362536576, 364679776, 366888448, 369164256, 371435200, 373599872, -375592736, 377362272, 378847264, 380034272, 380948576, 381599776, 382006752, 382226848, 382302560, 382249408, -382125920, 382023904, 381983104, 382034656, 382263360, 382681600, 383146528, 383545952, 383915328, 384261600, -384489216, 384601440, 384703968, 384776992, 384730816, 384668544, 384751776, 384924096, 385130240, 385565120, -386347872, 387285248, 388299936, 389614208, 391214080, 392766176, 394279616, 396044288, 397870752, 399357856, -400790240, 402575872, 404207968, 405212448, 406370464, 408240928, 409671712, 409968576, 410793760, 413089408, -414437504, 413311680, 413165120, 416964544, 420169120, 415984224, 406336640, 400335520, 402015904, 406590592, -408728960, 407087744, 400552416, 388721920, 377990944, 378296960, 389718368, 399499616, 397218976, 387056000, -379926368, 378810752, 378725920, 378463936, 384824224, 403541184, 430237088, 453206560, 464204896, 464701504, -461558112, 458781952, 455806080, 452544064, 451409664, 452445280, 450857216, 443671200, 436101856, }, +442117504, 310699008, 167178384, 38328824, -62973884, -142701904, -218207424, -288233120, -324050464, -305476864, +-239455696, -124559960, 52899500, 239470736, 289440000, 117837256, -137072800, -214231360, -22201760, 253544800, +372249120, 286295008, 117738472, -31679678, -156358816, -271503680, -359748064, -405781536, -424572000, -434228160, +-433325696, -417425728, -393916672, -370626688, -346321472, -318988288, -291659424, -266480704, -241915648, -217410704, +-194249024, -171965120, -149140592, -126572152, -105665320, -85652384, -65502008, -46165528, -28507308, -11534135, +5517959, 21835614, 36923296, 51426328, 65420940, 78127600, 89553824, 100435664, 110730160, 119946624, +128456568, 136897792, 144993808, 152274304, 159110816, 165962368, 172539568, 178568096, 184424816, 190402880, +196267664, 201906416, 207601008, 213461488, 219304784, 225092800, 230917840, 236754704, 242604992, 248525056, +254273872, 259479376, 264267184, 269042656, 273646848, 277524672, 280694912, 283720704, 286716992, 289173184, +290755872, 291661024, 292211328, 292578528, 292768608, 292590368, 291897792, 291028608, 290619488, 290858944, +291348032, 291775392, 292309024, 293284512, 294904256, 297195616, 299932608, 302707136, 305358752, 308171424, +311448480, 315120128, 318904000, 322573504, 325947744, 328940800, 331715360, 334517824, 337346048, 339990688, +342338944, 344415040, 346238240, 347855296, 349375200, 350801664, 351969888, 352762848, 353224544, 353432864, +353450560, 353402272, 353409760, 353459168, 353489216, 353525216, 353615936, 353763584, 354041664, 354629536, +355629728, 356984256, 358612576, 360484672, 362536576, 364679776, 366888448, 369164256, 371435200, 373599872, +375592736, 377362272, 378847264, 380034272, 380948576, 381599776, 382006752, 382226848, 382302560, 382249408, +382125920, 382023904, 381983104, 382034656, 382263360, 382681600, 383146528, 383545952, 383915328, 384261600, +384489216, 384601440, 384703968, 384776992, 384730816, 384668544, 384751776, 384924096, 385130240, 385565120, +386347872, 387285248, 388299936, 389614208, 391214080, 392766176, 394279616, 396044288, 397870752, 399357856, +400790240, 402575872, 404207968, 405212448, 406370464, 408240928, 409671712, 409968576, 410793760, 413089408, +414437504, 413311680, 413165120, 416964544, 420169120, 415984224, 406336640, 400335520, 402015904, 406590592, +408728960, 407087744, 400552416, 388721920, 377990944, 378296960, 389718368, 399499616, 397218976, 387056000, +379926368, 378810752, 378725920, 378463936, 384824224, 403541184, 430237088, 453206560, 464204896, 464701504, +461558112, 458781952, 455806080, 452544064, 451409664, 452445280, 450857216, 443671200, 436101856, }, }, { { 39313448, -162039984, 354059392, 513073024, 544220672, 426079008, 200846096, -76480480, -341753760, -517496864, -570909632, --538810624, -426258848, -152656560, 268456928, 556916608, 392621760, -137937712, -524111648, -381302368, 122664800, -517052864, 571298304, 423385536, 267364400, 134421200, -10704132, -142540304, -220866016, -263521472, -306872192, --348453920, -370534880, -379185472, -388552800, -396056640, -394882528, -389052640, -382683744, -371897472, -354961344, --336135936, -316509568, -293179840, -267362784, -242905632, -218939184, -192737200, -166288784, -142837728, -121205048, --99199784, -77883864, -58247808, -38609608, -18247168, 1144609, 19156628, 37176164, 54835460, 70412232, -84282288, 97901632, 110576616, 120906552, 129687608, 138192720, 145665968, 151166736, 155605584, 159884448, -163383248, 165773392, 168035760, 170768432, 173590768, 176530672, 180116432, 184315840, 188937760, 194341904, -200491760, 206520816, 212239568, 218499488, 225355856, 231702208, 237215344, 242769264, 248687728, 254468752, -260238512, 266707808, 273941056, 281680064, 290293632, 300081856, 310452576, 320862496, 331534976, 342404448, -352558304, 361381760, 369063328, 375619040, 380618944, 383952896, 385725632, 385646720, 383630784, 380563104, -377491648, 374619936, 371822848, 369278592, 366996352, 364715744, 362746496, 361908992, 362372288, 363497056, -364780704, 365996160, 366721472, 366764960, 366680672, 366982400, 367400096, 367574048, 367722208, 368027168, -368227424, 368258560, 368442688, 368780928, 368942528, 368980096, 369208288, 369538976, 369727968, 369950752, -370432864, 370996064, 371569984, 372518624, 374047104, 375963712, 378274944, 381220224, 384661024, 388236576, -392007584, 396189792, 400559936, 404847904, 409238432, 413860896, 418399616, 422691904, 426985248, 431279680, -435233184, 438858688, 442451968, 445902976, 448900320, 451546560, 454001120, 456011712, 457482752, 458817920, -460182656, 461281088, 462164256, 463233696, 464334272, 464945792, 465118656, 465174496, 464947392, 464355744, -463920896, 463844128, 463656736, 463389920, 463649760, 464247296, 464458848, 464531328, 465066560, 465613632, -465777920, 466290112, 467196864, 467418080, 467498592, 469054464, 470692448, 470029952, 469692256, 473230240, -476283424, 473541632, 472350304, 482087520, 491237952, 478718144, 450771840, 438733056, 452943488, 469665408, -474604096, 484207104, 505161184, 508774304, 474142368, 428292000, 412397920, 428558816, 447011072, 448439680, -436165216, 422568416, 419888896, 424843680, 401945600, 313745216, 185358448, 103257456, 121463824, 197578704, -251416656, 259959344, 258984384, 271355488, 275937152, 245777360, 185467968, 123581776, 86443736, }, +162039984, 354059392, 513073024, 544220672, 426079008, 200846096, -76480480, -341753760, -517496864, -570909632, +-538810624, -426258848, -152656560, 268456928, 556916608, 392621760, -137937712, -524111648, -381302368, 122664800, +517052864, 571298304, 423385536, 267364400, 134421200, -10704132, -142540304, -220866016, -263521472, -306872192, +-348453920, -370534880, -379185472, -388552800, -396056640, -394882528, -389052640, -382683744, -371897472, -354961344, +-336135936, -316509568, -293179840, -267362784, -242905632, -218939184, -192737200, -166288784, -142837728, -121205048, +-99199784, -77883864, -58247808, -38609608, -18247168, 1144609, 19156628, 37176164, 54835460, 70412232, +84282288, 97901632, 110576616, 120906552, 129687608, 138192720, 145665968, 151166736, 155605584, 159884448, +163383248, 165773392, 168035760, 170768432, 173590768, 176530672, 180116432, 184315840, 188937760, 194341904, +200491760, 206520816, 212239568, 218499488, 225355856, 231702208, 237215344, 242769264, 248687728, 254468752, +260238512, 266707808, 273941056, 281680064, 290293632, 300081856, 310452576, 320862496, 331534976, 342404448, +352558304, 361381760, 369063328, 375619040, 380618944, 383952896, 385725632, 385646720, 383630784, 380563104, +377491648, 374619936, 371822848, 369278592, 366996352, 364715744, 362746496, 361908992, 362372288, 363497056, +364780704, 365996160, 366721472, 366764960, 366680672, 366982400, 367400096, 367574048, 367722208, 368027168, +368227424, 368258560, 368442688, 368780928, 368942528, 368980096, 369208288, 369538976, 369727968, 369950752, +370432864, 370996064, 371569984, 372518624, 374047104, 375963712, 378274944, 381220224, 384661024, 388236576, +392007584, 396189792, 400559936, 404847904, 409238432, 413860896, 418399616, 422691904, 426985248, 431279680, +435233184, 438858688, 442451968, 445902976, 448900320, 451546560, 454001120, 456011712, 457482752, 458817920, +460182656, 461281088, 462164256, 463233696, 464334272, 464945792, 465118656, 465174496, 464947392, 464355744, +463920896, 463844128, 463656736, 463389920, 463649760, 464247296, 464458848, 464531328, 465066560, 465613632, +465777920, 466290112, 467196864, 467418080, 467498592, 469054464, 470692448, 470029952, 469692256, 473230240, +476283424, 473541632, 472350304, 482087520, 491237952, 478718144, 450771840, 438733056, 452943488, 469665408, +474604096, 484207104, 505161184, 508774304, 474142368, 428292000, 412397920, 428558816, 447011072, 448439680, +436165216, 422568416, 419888896, 424843680, 401945600, 313745216, 185358448, 103257456, 121463824, 197578704, +251416656, 259959344, 258984384, 271355488, 275937152, 245777360, 185467968, 123581776, 86443736, }, { -39313448, --162039984, -354059392, -513073024, -544220672, -426079008, -200846096, 76480480, 341753760, 517496864, 570909632, -538810624, 426258848, 152656560, -268456928, -556916608, -392621760, 137937712, 524111648, 381302368, -122664800, --517052864, -571298304, -423385536, -267364400, -134421200, 10704132, 142540304, 220866016, 263521472, 306872192, -348453920, 370534880, 379185472, 388552800, 396056640, 394882528, 389052640, 382683744, 371897472, 354961344, -336135936, 316509568, 293179840, 267362784, 242905632, 218939184, 192737200, 166288784, 142837728, 121205048, -99199784, 77883864, 58247808, 38609608, 18247168, -1144609, -19156628, -37176164, -54835460, -70412232, --84282288, -97901632, -110576616, -120906552, -129687608, -138192720, -145665968, -151166736, -155605584, -159884448, --163383248, -165773392, -168035760, -170768432, -173590768, -176530672, -180116432, -184315840, -188937760, -194341904, --200491760, -206520816, -212239568, -218499488, -225355856, -231702208, -237215344, -242769264, -248687728, -254468752, --260238512, -266707808, -273941056, -281680064, -290293632, -300081856, -310452576, -320862496, -331534976, -342404448, --352558304, -361381760, -369063328, -375619040, -380618944, -383952896, -385725632, -385646720, -383630784, -380563104, --377491648, -374619936, -371822848, -369278592, -366996352, -364715744, -362746496, -361908992, -362372288, -363497056, --364780704, -365996160, -366721472, -366764960, -366680672, -366982400, -367400096, -367574048, -367722208, -368027168, --368227424, -368258560, -368442688, -368780928, -368942528, -368980096, -369208288, -369538976, -369727968, -369950752, --370432864, -370996064, -371569984, -372518624, -374047104, -375963712, -378274944, -381220224, -384661024, -388236576, --392007584, -396189792, -400559936, -404847904, -409238432, -413860896, -418399616, -422691904, -426985248, -431279680, --435233184, -438858688, -442451968, -445902976, -448900320, -451546560, -454001120, -456011712, -457482752, -458817920, --460182656, -461281088, -462164256, -463233696, -464334272, -464945792, -465118656, -465174496, -464947392, -464355744, --463920896, -463844128, -463656736, -463389920, -463649760, -464247296, -464458848, -464531328, -465066560, -465613632, --465777920, -466290112, -467196864, -467418080, -467498592, -469054464, -470692448, -470029952, -469692256, -473230240, --476283424, -473541632, -472350304, -482087520, -491237952, -478718144, -450771840, -438733056, -452943488, -469665408, --474604096, -484207104, -505161184, -508774304, -474142368, -428292000, -412397920, -428558816, -447011072, -448439680, --436165216, -422568416, -419888896, -424843680, -401945600, -313745216, -185358448, -103257456, -121463824, -197578704, --251416656, -259959344, -258984384, -271355488, -275937152, -245777360, -185467968, -123581776, -86443736, }, +-162039984, -354059392, -513073024, -544220672, -426079008, -200846096, 76480480, 341753760, 517496864, 570909632, +538810624, 426258848, 152656560, -268456928, -556916608, -392621760, 137937712, 524111648, 381302368, -122664800, +-517052864, -571298304, -423385536, -267364400, -134421200, 10704132, 142540304, 220866016, 263521472, 306872192, +348453920, 370534880, 379185472, 388552800, 396056640, 394882528, 389052640, 382683744, 371897472, 354961344, +336135936, 316509568, 293179840, 267362784, 242905632, 218939184, 192737200, 166288784, 142837728, 121205048, +99199784, 77883864, 58247808, 38609608, 18247168, -1144609, -19156628, -37176164, -54835460, -70412232, +-84282288, -97901632, -110576616, -120906552, -129687608, -138192720, -145665968, -151166736, -155605584, -159884448, +-163383248, -165773392, -168035760, -170768432, -173590768, -176530672, -180116432, -184315840, -188937760, -194341904, +-200491760, -206520816, -212239568, -218499488, -225355856, -231702208, -237215344, -242769264, -248687728, -254468752, +-260238512, -266707808, -273941056, -281680064, -290293632, -300081856, -310452576, -320862496, -331534976, -342404448, +-352558304, -361381760, -369063328, -375619040, -380618944, -383952896, -385725632, -385646720, -383630784, -380563104, +-377491648, -374619936, -371822848, -369278592, -366996352, -364715744, -362746496, -361908992, -362372288, -363497056, +-364780704, -365996160, -366721472, -366764960, -366680672, -366982400, -367400096, -367574048, -367722208, -368027168, +-368227424, -368258560, -368442688, -368780928, -368942528, -368980096, -369208288, -369538976, -369727968, -369950752, +-370432864, -370996064, -371569984, -372518624, -374047104, -375963712, -378274944, -381220224, -384661024, -388236576, +-392007584, -396189792, -400559936, -404847904, -409238432, -413860896, -418399616, -422691904, -426985248, -431279680, +-435233184, -438858688, -442451968, -445902976, -448900320, -451546560, -454001120, -456011712, -457482752, -458817920, +-460182656, -461281088, -462164256, -463233696, -464334272, -464945792, -465118656, -465174496, -464947392, -464355744, +-463920896, -463844128, -463656736, -463389920, -463649760, -464247296, -464458848, -464531328, -465066560, -465613632, +-465777920, -466290112, -467196864, -467418080, -467498592, -469054464, -470692448, -470029952, -469692256, -473230240, +-476283424, -473541632, -472350304, -482087520, -491237952, -478718144, -450771840, -438733056, -452943488, -469665408, +-474604096, -484207104, -505161184, -508774304, -474142368, -428292000, -412397920, -428558816, -447011072, -448439680, +-436165216, -422568416, -419888896, -424843680, -401945600, -313745216, -185358448, -103257456, -121463824, -197578704, +-251416656, -259959344, -258984384, -271355488, -275937152, -245777360, -185467968, -123581776, -86443736, }, }, { { 60774324, -59729572, 33552284, -19560892, -61997316, -58416924, -16454020, 26468810, 43690556, 34408592, 9218610, --21484500, -43571368, -38717520, -2093797, 40014064, 45883136, 4796405, -39861056, -32189170, 31201864, -94976224, 107137424, 69399152, 19405200, -16790100, -39045548, -54413476, -64906084, -71736152, -77391016, --81401976, -81075024, -76618456, -71176200, -67105104, -65755948, -68925632, -77089296, -87613040, -97186520, --104786464, -110843440, -115289808, -117946784, -119391504, -120165128, -119999776, -118380576, -114929568, -108963856, --99642704, -86779280, -70805224, -51947628, -30181272, -5902359, 20093468, 47315508, 75696648, 105004968, -134663328, 164189616, 193327216, 221575216, 247971008, 271514400, 291530048, 307443424, 318553952, 324301696, -324525568, 319261568, 308642784, 293263040, 274253536, 252611728, 228828880, 203581984, 178318992, 154462064, -132279624, 111285824, 91716344, 74807592, 61318712, 50438484, 40789304, 32231582, 25963078, 22846004, -22310744, 23179402, 24956982, 27881854, 32162326, 37633040, 43853228, 50110996, 55558088, 59663540, -62427348, 64029372, 64456184, 63435592, 60476896, 55152748, 47702056, 39153460, 30481382, 21861384, -13050258, 4080756, -4772246, -13239774, -20906828, -27201102, -31792422, -34639448, -35629976, -34651796, --31963684, -27963458, -22743462, -16363825, -9285182, -2051921, 5099737, 11960410, 18188112, 23685670, -28553480, 32546188, 35286376, 37026376, 38472708, 40037148, 41990820, 44889924, 48940616, 53439056, -57652420, 61640832, 65580928, 69140384, 72131832, 74825312, 77170896, 78721920, 79533128, 80082352, -80360984, 80159120, 79882096, 79979272, 80138184, 80043160, 80053360, 80276696, 80137648, 79536352, -79057464, 78639240, 77597176, 76030048, 74532712, 72858216, 70625368, 68576672, 67376760, 66365296, -65076272, 64294588, 64252712, 63928440, 63068372, 62334472, 61069068, 57945552, 53580252, 49213344, -43928924, 36705328, 29108604, 22355304, 14842333, 5965710, -1968706, -8492761, -15931644, -23791434, --29415158, -34534760, -42116448, -48639968, -50829328, -54961084, -65088080, -71225592, -67966248, -70453032, --86594592, -93825168, -79387640, -78654808, -121203440, -160942624, -128472672, -42519640, 7400229, -10142565, --38660076, -43189656, -60630444, -109811040, -134682128, -88345328, -12016782, 23361400, 10660109, -5608154, --2326799, 3198677, -12473122, -53285512, -96956200, -102666360, -49961744, 22169548, 46085536, 5877663, --44782552, -56557740, -41253160, -36235028, -45420888, -45099304, -27812598, -9433359, -1260036, }, +59729572, 33552284, -19560892, -61997316, -58416924, -16454020, 26468810, 43690556, 34408592, 9218610, +-21484500, -43571368, -38717520, -2093797, 40014064, 45883136, 4796405, -39861056, -32189170, 31201864, +94976224, 107137424, 69399152, 19405200, -16790100, -39045548, -54413476, -64906084, -71736152, -77391016, +-81401976, -81075024, -76618456, -71176200, -67105104, -65755948, -68925632, -77089296, -87613040, -97186520, +-104786464, -110843440, -115289808, -117946784, -119391504, -120165128, -119999776, -118380576, -114929568, -108963856, +-99642704, -86779280, -70805224, -51947628, -30181272, -5902359, 20093468, 47315508, 75696648, 105004968, +134663328, 164189616, 193327216, 221575216, 247971008, 271514400, 291530048, 307443424, 318553952, 324301696, +324525568, 319261568, 308642784, 293263040, 274253536, 252611728, 228828880, 203581984, 178318992, 154462064, +132279624, 111285824, 91716344, 74807592, 61318712, 50438484, 40789304, 32231582, 25963078, 22846004, +22310744, 23179402, 24956982, 27881854, 32162326, 37633040, 43853228, 50110996, 55558088, 59663540, +62427348, 64029372, 64456184, 63435592, 60476896, 55152748, 47702056, 39153460, 30481382, 21861384, +13050258, 4080756, -4772246, -13239774, -20906828, -27201102, -31792422, -34639448, -35629976, -34651796, +-31963684, -27963458, -22743462, -16363825, -9285182, -2051921, 5099737, 11960410, 18188112, 23685670, +28553480, 32546188, 35286376, 37026376, 38472708, 40037148, 41990820, 44889924, 48940616, 53439056, +57652420, 61640832, 65580928, 69140384, 72131832, 74825312, 77170896, 78721920, 79533128, 80082352, +80360984, 80159120, 79882096, 79979272, 80138184, 80043160, 80053360, 80276696, 80137648, 79536352, +79057464, 78639240, 77597176, 76030048, 74532712, 72858216, 70625368, 68576672, 67376760, 66365296, +65076272, 64294588, 64252712, 63928440, 63068372, 62334472, 61069068, 57945552, 53580252, 49213344, +43928924, 36705328, 29108604, 22355304, 14842333, 5965710, -1968706, -8492761, -15931644, -23791434, +-29415158, -34534760, -42116448, -48639968, -50829328, -54961084, -65088080, -71225592, -67966248, -70453032, +-86594592, -93825168, -79387640, -78654808, -121203440, -160942624, -128472672, -42519640, 7400229, -10142565, +-38660076, -43189656, -60630444, -109811040, -134682128, -88345328, -12016782, 23361400, 10660109, -5608154, +-2326799, 3198677, -12473122, -53285512, -96956200, -102666360, -49961744, 22169548, 46085536, 5877663, +-44782552, -56557740, -41253160, -36235028, -45420888, -45099304, -27812598, -9433359, -1260036, }, { 60774324, -59729572, 33552284, -19560892, -61997316, -58416924, -16454020, 26468810, 43690556, 34408592, 9218610, --21484500, -43571368, -38717520, -2093797, 40014064, 45883136, 4796405, -39861056, -32189170, 31201864, -94976224, 107137424, 69399152, 19405200, -16790100, -39045548, -54413476, -64906084, -71736152, -77391016, --81401976, -81075024, -76618456, -71176200, -67105104, -65755948, -68925632, -77089296, -87613040, -97186520, --104786464, -110843440, -115289808, -117946784, -119391504, -120165128, -119999776, -118380576, -114929568, -108963856, --99642704, -86779280, -70805224, -51947628, -30181272, -5902359, 20093468, 47315508, 75696648, 105004968, -134663328, 164189616, 193327216, 221575216, 247971008, 271514400, 291530048, 307443424, 318553952, 324301696, -324525568, 319261568, 308642784, 293263040, 274253536, 252611728, 228828880, 203581984, 178318992, 154462064, -132279624, 111285824, 91716344, 74807592, 61318712, 50438484, 40789304, 32231582, 25963078, 22846004, -22310744, 23179402, 24956982, 27881854, 32162326, 37633040, 43853228, 50110996, 55558088, 59663540, -62427348, 64029372, 64456184, 63435592, 60476896, 55152748, 47702056, 39153460, 30481382, 21861384, -13050258, 4080756, -4772246, -13239774, -20906828, -27201102, -31792422, -34639448, -35629976, -34651796, --31963684, -27963458, -22743462, -16363825, -9285182, -2051921, 5099737, 11960410, 18188112, 23685670, -28553480, 32546188, 35286376, 37026376, 38472708, 40037148, 41990820, 44889924, 48940616, 53439056, -57652420, 61640832, 65580928, 69140384, 72131832, 74825312, 77170896, 78721920, 79533128, 80082352, -80360984, 80159120, 79882096, 79979272, 80138184, 80043160, 80053360, 80276696, 80137648, 79536352, -79057464, 78639240, 77597176, 76030048, 74532712, 72858216, 70625368, 68576672, 67376760, 66365296, -65076272, 64294588, 64252712, 63928440, 63068372, 62334472, 61069068, 57945552, 53580252, 49213344, -43928924, 36705328, 29108604, 22355304, 14842333, 5965710, -1968706, -8492761, -15931644, -23791434, --29415158, -34534760, -42116448, -48639968, -50829328, -54961084, -65088080, -71225592, -67966248, -70453032, --86594592, -93825168, -79387640, -78654808, -121203440, -160942624, -128472672, -42519640, 7400229, -10142565, --38660076, -43189656, -60630444, -109811040, -134682128, -88345328, -12016782, 23361400, 10660109, -5608154, --2326799, 3198677, -12473122, -53285512, -96956200, -102666360, -49961744, 22169548, 46085536, 5877663, --44782552, -56557740, -41253160, -36235028, -45420888, -45099304, -27812598, -9433359, -1260036, }, +59729572, 33552284, -19560892, -61997316, -58416924, -16454020, 26468810, 43690556, 34408592, 9218610, +-21484500, -43571368, -38717520, -2093797, 40014064, 45883136, 4796405, -39861056, -32189170, 31201864, +94976224, 107137424, 69399152, 19405200, -16790100, -39045548, -54413476, -64906084, -71736152, -77391016, +-81401976, -81075024, -76618456, -71176200, -67105104, -65755948, -68925632, -77089296, -87613040, -97186520, +-104786464, -110843440, -115289808, -117946784, -119391504, -120165128, -119999776, -118380576, -114929568, -108963856, +-99642704, -86779280, -70805224, -51947628, -30181272, -5902359, 20093468, 47315508, 75696648, 105004968, +134663328, 164189616, 193327216, 221575216, 247971008, 271514400, 291530048, 307443424, 318553952, 324301696, +324525568, 319261568, 308642784, 293263040, 274253536, 252611728, 228828880, 203581984, 178318992, 154462064, +132279624, 111285824, 91716344, 74807592, 61318712, 50438484, 40789304, 32231582, 25963078, 22846004, +22310744, 23179402, 24956982, 27881854, 32162326, 37633040, 43853228, 50110996, 55558088, 59663540, +62427348, 64029372, 64456184, 63435592, 60476896, 55152748, 47702056, 39153460, 30481382, 21861384, +13050258, 4080756, -4772246, -13239774, -20906828, -27201102, -31792422, -34639448, -35629976, -34651796, +-31963684, -27963458, -22743462, -16363825, -9285182, -2051921, 5099737, 11960410, 18188112, 23685670, +28553480, 32546188, 35286376, 37026376, 38472708, 40037148, 41990820, 44889924, 48940616, 53439056, +57652420, 61640832, 65580928, 69140384, 72131832, 74825312, 77170896, 78721920, 79533128, 80082352, +80360984, 80159120, 79882096, 79979272, 80138184, 80043160, 80053360, 80276696, 80137648, 79536352, +79057464, 78639240, 77597176, 76030048, 74532712, 72858216, 70625368, 68576672, 67376760, 66365296, +65076272, 64294588, 64252712, 63928440, 63068372, 62334472, 61069068, 57945552, 53580252, 49213344, +43928924, 36705328, 29108604, 22355304, 14842333, 5965710, -1968706, -8492761, -15931644, -23791434, +-29415158, -34534760, -42116448, -48639968, -50829328, -54961084, -65088080, -71225592, -67966248, -70453032, +-86594592, -93825168, -79387640, -78654808, -121203440, -160942624, -128472672, -42519640, 7400229, -10142565, +-38660076, -43189656, -60630444, -109811040, -134682128, -88345328, -12016782, 23361400, 10660109, -5608154, +-2326799, 3198677, -12473122, -53285512, -96956200, -102666360, -49961744, 22169548, 46085536, 5877663, +-44782552, -56557740, -41253160, -36235028, -45420888, -45099304, -27812598, -9433359, -1260036, }, }, { { 29020558, -43026984, 51106352, 33877628, -3030100, -28343026, -17795124, 14452028, 29481730, 9083856, -28427314, --59444496, -77127416, -71994392, -24524800, 51500952, 86269784, 25448754, -81479824, -116287312, -27297738, -112266152, 196773920, 197985648, 157917360, 111005040, 55734716, -12725451, -82915952, -143763824, -196459856, --243939104, -282670048, -308530592, -321597472, -323049184, -313426848, -294756640, -270353696, -242588880, -213100176, --183778432, -155631904, -128221416, -101467528, -76332840, -53064320, -30685930, -8827232, 11590506, 29678224, -45077292, 57243324, 65799436, 71648648, 76578728, 81806240, 87654912, 94220848, 101459472, 108883864, -115894320, 122306712, 128216048, 133621264, 138539008, 143277424, 148222000, 153368992, 158288880, 162613904, -166339248, 169426800, 171317120, 171284912, 169202928, 165378784, 159672384, 151565104, 141233024, 129656472, -117366960, 103997800, 89535032, 75091064, 61760556, 49442052, 37490232, 25878252, 14907831, 4243428, --6872485, -18598282, -30380988, -41854456, -53257596, -64815888, -76096616, -86220928, -94558536, -101078832, --106015360, -109264504, -110227648, -108380280, -103932304, -97702992, -90310816, -81695648, -71516576, -59845000, --47395500, -35190276, -23958402, -13630079, -3425773, 7343321, 18519898, 29235306, 38665980, 46534896, -53135188, 59176060, 65425772, 72171016, 79077864, 85709296, 91984240, 98078800, 104238856, 110832168, -118231856, 126450280, 135140608, 143966768, 152718304, 161164896, 169167488, 176834544, 184250336, 191181872, -197286640, 202369200, 206265264, 208791776, 210006720, 210206432, 209600304, 208306448, 206575584, 204618144, -202391200, 199920528, 197530912, 195447312, 193624112, 192247024, 191791232, 192336688, 193484512, 195080096, -197244224, 199711680, 201983184, 204049600, 206191184, 208402544, 210732576, 213604288, 217094496, 220677568, -224179040, 227969888, 231921792, 235477488, 238799104, 242353728, 245612544, 247775056, 249122592, 250004672, -249646048, 247669824, 245118080, 242424064, 238654160, 233954384, 229781824, 225996352, 221350800, 216711696, -213395984, 209736672, 204569296, 200872944, 199637600, 195925664, 188862064, 186209376, 188915744, 185078736, -173190800, 171437376, 182817424, 176767440, 138999104, 113357072, 146674208, 211644720, 240775872, 224184944, -209917056, 212717920, 196212896, 156345392, 147491328, 196417440, 253637152, 267065360, 251954592, 249604176, -261806704, 266423264, 260329248, 246459184, 209993296, 149151872, 105053824, 118057912, 168719200, 200982992, -195907424, 185727808, 196233296, 211471312, 207507584, 194690336, 204803376, 245127200, 283631584, }, +43026984, 51106352, 33877628, -3030100, -28343026, -17795124, 14452028, 29481730, 9083856, -28427314, +-59444496, -77127416, -71994392, -24524800, 51500952, 86269784, 25448754, -81479824, -116287312, -27297738, +112266152, 196773920, 197985648, 157917360, 111005040, 55734716, -12725451, -82915952, -143763824, -196459856, +-243939104, -282670048, -308530592, -321597472, -323049184, -313426848, -294756640, -270353696, -242588880, -213100176, +-183778432, -155631904, -128221416, -101467528, -76332840, -53064320, -30685930, -8827232, 11590506, 29678224, +45077292, 57243324, 65799436, 71648648, 76578728, 81806240, 87654912, 94220848, 101459472, 108883864, +115894320, 122306712, 128216048, 133621264, 138539008, 143277424, 148222000, 153368992, 158288880, 162613904, +166339248, 169426800, 171317120, 171284912, 169202928, 165378784, 159672384, 151565104, 141233024, 129656472, +117366960, 103997800, 89535032, 75091064, 61760556, 49442052, 37490232, 25878252, 14907831, 4243428, +-6872485, -18598282, -30380988, -41854456, -53257596, -64815888, -76096616, -86220928, -94558536, -101078832, +-106015360, -109264504, -110227648, -108380280, -103932304, -97702992, -90310816, -81695648, -71516576, -59845000, +-47395500, -35190276, -23958402, -13630079, -3425773, 7343321, 18519898, 29235306, 38665980, 46534896, +53135188, 59176060, 65425772, 72171016, 79077864, 85709296, 91984240, 98078800, 104238856, 110832168, +118231856, 126450280, 135140608, 143966768, 152718304, 161164896, 169167488, 176834544, 184250336, 191181872, +197286640, 202369200, 206265264, 208791776, 210006720, 210206432, 209600304, 208306448, 206575584, 204618144, +202391200, 199920528, 197530912, 195447312, 193624112, 192247024, 191791232, 192336688, 193484512, 195080096, +197244224, 199711680, 201983184, 204049600, 206191184, 208402544, 210732576, 213604288, 217094496, 220677568, +224179040, 227969888, 231921792, 235477488, 238799104, 242353728, 245612544, 247775056, 249122592, 250004672, +249646048, 247669824, 245118080, 242424064, 238654160, 233954384, 229781824, 225996352, 221350800, 216711696, +213395984, 209736672, 204569296, 200872944, 199637600, 195925664, 188862064, 186209376, 188915744, 185078736, +173190800, 171437376, 182817424, 176767440, 138999104, 113357072, 146674208, 211644720, 240775872, 224184944, +209917056, 212717920, 196212896, 156345392, 147491328, 196417440, 253637152, 267065360, 251954592, 249604176, +261806704, 266423264, 260329248, 246459184, 209993296, 149151872, 105053824, 118057912, 168719200, 200982992, +195907424, 185727808, 196233296, 211471312, 207507584, 194690336, 204803376, 245127200, 283631584, }, { 29020558, -43026984, 51106352, 33877628, -3030100, -28343026, -17795124, 14452028, 29481730, 9083856, -28427314, --59444496, -77127416, -71994392, -24524800, 51500952, 86269784, 25448754, -81479824, -116287312, -27297738, -112266152, 196773920, 197985648, 157917360, 111005040, 55734716, -12725451, -82915952, -143763824, -196459856, --243939104, -282670048, -308530592, -321597472, -323049184, -313426848, -294756640, -270353696, -242588880, -213100176, --183778432, -155631904, -128221416, -101467528, -76332840, -53064320, -30685930, -8827232, 11590506, 29678224, -45077292, 57243324, 65799436, 71648648, 76578728, 81806240, 87654912, 94220848, 101459472, 108883864, -115894320, 122306712, 128216048, 133621264, 138539008, 143277424, 148222000, 153368992, 158288880, 162613904, -166339248, 169426800, 171317120, 171284912, 169202928, 165378784, 159672384, 151565104, 141233024, 129656472, -117366960, 103997800, 89535032, 75091064, 61760556, 49442052, 37490232, 25878252, 14907831, 4243428, --6872485, -18598282, -30380988, -41854456, -53257596, -64815888, -76096616, -86220928, -94558536, -101078832, --106015360, -109264504, -110227648, -108380280, -103932304, -97702992, -90310816, -81695648, -71516576, -59845000, --47395500, -35190276, -23958402, -13630079, -3425773, 7343321, 18519898, 29235306, 38665980, 46534896, -53135188, 59176060, 65425772, 72171016, 79077864, 85709296, 91984240, 98078800, 104238856, 110832168, -118231856, 126450280, 135140608, 143966768, 152718304, 161164896, 169167488, 176834544, 184250336, 191181872, -197286640, 202369200, 206265264, 208791776, 210006720, 210206432, 209600304, 208306448, 206575584, 204618144, -202391200, 199920528, 197530912, 195447312, 193624112, 192247024, 191791232, 192336688, 193484512, 195080096, -197244224, 199711680, 201983184, 204049600, 206191184, 208402544, 210732576, 213604288, 217094496, 220677568, -224179040, 227969888, 231921792, 235477488, 238799104, 242353728, 245612544, 247775056, 249122592, 250004672, -249646048, 247669824, 245118080, 242424064, 238654160, 233954384, 229781824, 225996352, 221350800, 216711696, -213395984, 209736672, 204569296, 200872944, 199637600, 195925664, 188862064, 186209376, 188915744, 185078736, -173190800, 171437376, 182817424, 176767440, 138999104, 113357072, 146674208, 211644720, 240775872, 224184944, -209917056, 212717920, 196212896, 156345392, 147491328, 196417440, 253637152, 267065360, 251954592, 249604176, -261806704, 266423264, 260329248, 246459184, 209993296, 149151872, 105053824, 118057912, 168719200, 200982992, -195907424, 185727808, 196233296, 211471312, 207507584, 194690336, 204803376, 245127200, 283631584, }, +43026984, 51106352, 33877628, -3030100, -28343026, -17795124, 14452028, 29481730, 9083856, -28427314, +-59444496, -77127416, -71994392, -24524800, 51500952, 86269784, 25448754, -81479824, -116287312, -27297738, +112266152, 196773920, 197985648, 157917360, 111005040, 55734716, -12725451, -82915952, -143763824, -196459856, +-243939104, -282670048, -308530592, -321597472, -323049184, -313426848, -294756640, -270353696, -242588880, -213100176, +-183778432, -155631904, -128221416, -101467528, -76332840, -53064320, -30685930, -8827232, 11590506, 29678224, +45077292, 57243324, 65799436, 71648648, 76578728, 81806240, 87654912, 94220848, 101459472, 108883864, +115894320, 122306712, 128216048, 133621264, 138539008, 143277424, 148222000, 153368992, 158288880, 162613904, +166339248, 169426800, 171317120, 171284912, 169202928, 165378784, 159672384, 151565104, 141233024, 129656472, +117366960, 103997800, 89535032, 75091064, 61760556, 49442052, 37490232, 25878252, 14907831, 4243428, +-6872485, -18598282, -30380988, -41854456, -53257596, -64815888, -76096616, -86220928, -94558536, -101078832, +-106015360, -109264504, -110227648, -108380280, -103932304, -97702992, -90310816, -81695648, -71516576, -59845000, +-47395500, -35190276, -23958402, -13630079, -3425773, 7343321, 18519898, 29235306, 38665980, 46534896, +53135188, 59176060, 65425772, 72171016, 79077864, 85709296, 91984240, 98078800, 104238856, 110832168, +118231856, 126450280, 135140608, 143966768, 152718304, 161164896, 169167488, 176834544, 184250336, 191181872, +197286640, 202369200, 206265264, 208791776, 210006720, 210206432, 209600304, 208306448, 206575584, 204618144, +202391200, 199920528, 197530912, 195447312, 193624112, 192247024, 191791232, 192336688, 193484512, 195080096, +197244224, 199711680, 201983184, 204049600, 206191184, 208402544, 210732576, 213604288, 217094496, 220677568, +224179040, 227969888, 231921792, 235477488, 238799104, 242353728, 245612544, 247775056, 249122592, 250004672, +249646048, 247669824, 245118080, 242424064, 238654160, 233954384, 229781824, 225996352, 221350800, 216711696, +213395984, 209736672, 204569296, 200872944, 199637600, 195925664, 188862064, 186209376, 188915744, 185078736, +173190800, 171437376, 182817424, 176767440, 138999104, 113357072, 146674208, 211644720, 240775872, 224184944, +209917056, 212717920, 196212896, 156345392, 147491328, 196417440, 253637152, 267065360, 251954592, 249604176, +261806704, 266423264, 260329248, 246459184, 209993296, 149151872, 105053824, 118057912, 168719200, 200982992, +195907424, 185727808, 196233296, 211471312, 207507584, 194690336, 204803376, 245127200, 283631584, }, }, { { 9651865, -3961034, 1835025, 9908490, 22075596, 26681948, 24311662, 28811714, 45453640, 56586732, 36004172, --25028386, -102528384, -142361520, -93304408, 31549220, 131521560, 101836896, -42115912, -161706048, -141696880, --8993125, 120542016, 177131968, 177010640, 155108992, 116447840, 57876296, -6760816, -61629560, -106419088, --146315584, -179404544, -202494816, -218007712, -228075648, -229450576, -219002528, -198989600, -174288160, -148494736, --124015032, -102447856, -83734680, -66888212, -51527796, -37416144, -23551454, -9249212, 4811974, 17686676, -29273960, 39620000, 48319456, 55328844, 61418032, 67337032, 73311336, 79517560, 86243480, 93488016, -101055208, 108991776, 117364280, 125814088, 133909024, 141755936, 149705920, 157633360, 165047008, 171803520, -178155248, 184033440, 188793344, 191877120, 193336880, 193314864, 191339712, 186779008, 179929072, 171889424, -163159360, 153135456, 141469776, 129112088, 117172080, 105288440, 92156040, 77496240, 62520228, 48381196, -35046932, 22009024, 9437654, -1845225, -11237782, -18853832, -25243134, -30777736, -35313220, -38456064, --40142912, -40800580, -40957880, -41000832, -41336376, -42368240, -44060460, -45845016, -47209208, -48200808, --49257908, -50800336, -52993452, -55553256, -57713624, -58755688, -58689656, -58201640, -57996016, -58389008, --59332288, -60458108, -61217780, -61281668, -60723320, -59672664, -58015880, -55542516, -52076480, -47392816, --41369124, -34298000, -26756572, -19200652, -11957726, -5417565, 163746, 4829154, 8558259, 11005317, -11884711, 11284490, 9393093, 6365142, 2624225, -1176284, -4648229, -7708930, -10205916, -11959336, --13013751, -13386876, -12816182, -11110544, -8341900, -4396436, 1074816, 8005819, 15867757, 24364276, -33447058, 42705932, 51593296, 60073708, 68262064, 75834088, 82568064, 88848912, 94926832, 100491496, -105538624, 110612584, 115818088, 120789512, 125676112, 130783904, 135540576, 139341088, 142721232, 146152912, -148914032, 150690000, 152522336, 154741232, 156256816, 156975680, 158030096, 159093104, 159020624, 158774208, -159527440, 159551056, 157928624, 157767568, 159824864, 159133904, 155159456, 155541168, 160509376, 158103120, -147591712, 146963584, 157603296, 148436752, 107092864, 79350592, 112127640, 177940496, 209333488, 194080976, -176679392, 173700288, 156176816, 122001768, 116535888, 159170944, 207145200, 219210304, 207884464, 203208864, -206750592, 205597408, 194819712, 166498160, 114397528, 67672040, 78230680, 150149904, 219664496, 232825344, -209000080, 198397968, 209876256, 217262528, 211632896, 205857248, 200630800, 185133488, 166889008, }, +3961034, 1835025, 9908490, 22075596, 26681948, 24311662, 28811714, 45453640, 56586732, 36004172, +-25028386, -102528384, -142361520, -93304408, 31549220, 131521560, 101836896, -42115912, -161706048, -141696880, +-8993125, 120542016, 177131968, 177010640, 155108992, 116447840, 57876296, -6760816, -61629560, -106419088, +-146315584, -179404544, -202494816, -218007712, -228075648, -229450576, -219002528, -198989600, -174288160, -148494736, +-124015032, -102447856, -83734680, -66888212, -51527796, -37416144, -23551454, -9249212, 4811974, 17686676, +29273960, 39620000, 48319456, 55328844, 61418032, 67337032, 73311336, 79517560, 86243480, 93488016, +101055208, 108991776, 117364280, 125814088, 133909024, 141755936, 149705920, 157633360, 165047008, 171803520, +178155248, 184033440, 188793344, 191877120, 193336880, 193314864, 191339712, 186779008, 179929072, 171889424, +163159360, 153135456, 141469776, 129112088, 117172080, 105288440, 92156040, 77496240, 62520228, 48381196, +35046932, 22009024, 9437654, -1845225, -11237782, -18853832, -25243134, -30777736, -35313220, -38456064, +-40142912, -40800580, -40957880, -41000832, -41336376, -42368240, -44060460, -45845016, -47209208, -48200808, +-49257908, -50800336, -52993452, -55553256, -57713624, -58755688, -58689656, -58201640, -57996016, -58389008, +-59332288, -60458108, -61217780, -61281668, -60723320, -59672664, -58015880, -55542516, -52076480, -47392816, +-41369124, -34298000, -26756572, -19200652, -11957726, -5417565, 163746, 4829154, 8558259, 11005317, +11884711, 11284490, 9393093, 6365142, 2624225, -1176284, -4648229, -7708930, -10205916, -11959336, +-13013751, -13386876, -12816182, -11110544, -8341900, -4396436, 1074816, 8005819, 15867757, 24364276, +33447058, 42705932, 51593296, 60073708, 68262064, 75834088, 82568064, 88848912, 94926832, 100491496, +105538624, 110612584, 115818088, 120789512, 125676112, 130783904, 135540576, 139341088, 142721232, 146152912, +148914032, 150690000, 152522336, 154741232, 156256816, 156975680, 158030096, 159093104, 159020624, 158774208, +159527440, 159551056, 157928624, 157767568, 159824864, 159133904, 155159456, 155541168, 160509376, 158103120, +147591712, 146963584, 157603296, 148436752, 107092864, 79350592, 112127640, 177940496, 209333488, 194080976, +176679392, 173700288, 156176816, 122001768, 116535888, 159170944, 207145200, 219210304, 207884464, 203208864, +206750592, 205597408, 194819712, 166498160, 114397528, 67672040, 78230680, 150149904, 219664496, 232825344, +209000080, 198397968, 209876256, 217262528, 211632896, 205857248, 200630800, 185133488, 166889008, }, { -9651865, --3961034, -1835025, -9908490, -22075596, -26681948, -24311662, -28811714, -45453640, -56586732, -36004172, -25028386, 102528384, 142361520, 93304408, -31549220, -131521560, -101836896, 42115912, 161706048, 141696880, -8993125, -120542016, -177131968, -177010640, -155108992, -116447840, -57876296, 6760816, 61629560, 106419088, -146315584, 179404544, 202494816, 218007712, 228075648, 229450576, 219002528, 198989600, 174288160, 148494736, -124015032, 102447856, 83734680, 66888212, 51527796, 37416144, 23551454, 9249212, -4811974, -17686676, --29273960, -39620000, -48319456, -55328844, -61418032, -67337032, -73311336, -79517560, -86243480, -93488016, --101055208, -108991776, -117364280, -125814088, -133909024, -141755936, -149705920, -157633360, -165047008, -171803520, --178155248, -184033440, -188793344, -191877120, -193336880, -193314864, -191339712, -186779008, -179929072, -171889424, --163159360, -153135456, -141469776, -129112088, -117172080, -105288440, -92156040, -77496240, -62520228, -48381196, --35046932, -22009024, -9437654, 1845225, 11237782, 18853832, 25243134, 30777736, 35313220, 38456064, -40142912, 40800580, 40957880, 41000832, 41336376, 42368240, 44060460, 45845016, 47209208, 48200808, -49257908, 50800336, 52993452, 55553256, 57713624, 58755688, 58689656, 58201640, 57996016, 58389008, -59332288, 60458108, 61217780, 61281668, 60723320, 59672664, 58015880, 55542516, 52076480, 47392816, -41369124, 34298000, 26756572, 19200652, 11957726, 5417565, -163746, -4829154, -8558259, -11005317, --11884711, -11284490, -9393093, -6365142, -2624225, 1176284, 4648229, 7708930, 10205916, 11959336, -13013751, 13386876, 12816182, 11110544, 8341900, 4396436, -1074816, -8005819, -15867757, -24364276, --33447058, -42705932, -51593296, -60073708, -68262064, -75834088, -82568064, -88848912, -94926832, -100491496, --105538624, -110612584, -115818088, -120789512, -125676112, -130783904, -135540576, -139341088, -142721232, -146152912, --148914032, -150690000, -152522336, -154741232, -156256816, -156975680, -158030096, -159093104, -159020624, -158774208, --159527440, -159551056, -157928624, -157767568, -159824864, -159133904, -155159456, -155541168, -160509376, -158103120, --147591712, -146963584, -157603296, -148436752, -107092864, -79350592, -112127640, -177940496, -209333488, -194080976, --176679392, -173700288, -156176816, -122001768, -116535888, -159170944, -207145200, -219210304, -207884464, -203208864, --206750592, -205597408, -194819712, -166498160, -114397528, -67672040, -78230680, -150149904, -219664496, -232825344, --209000080, -198397968, -209876256, -217262528, -211632896, -205857248, -200630800, -185133488, -166889008, }, +-3961034, -1835025, -9908490, -22075596, -26681948, -24311662, -28811714, -45453640, -56586732, -36004172, +25028386, 102528384, 142361520, 93304408, -31549220, -131521560, -101836896, 42115912, 161706048, 141696880, +8993125, -120542016, -177131968, -177010640, -155108992, -116447840, -57876296, 6760816, 61629560, 106419088, +146315584, 179404544, 202494816, 218007712, 228075648, 229450576, 219002528, 198989600, 174288160, 148494736, +124015032, 102447856, 83734680, 66888212, 51527796, 37416144, 23551454, 9249212, -4811974, -17686676, +-29273960, -39620000, -48319456, -55328844, -61418032, -67337032, -73311336, -79517560, -86243480, -93488016, +-101055208, -108991776, -117364280, -125814088, -133909024, -141755936, -149705920, -157633360, -165047008, -171803520, +-178155248, -184033440, -188793344, -191877120, -193336880, -193314864, -191339712, -186779008, -179929072, -171889424, +-163159360, -153135456, -141469776, -129112088, -117172080, -105288440, -92156040, -77496240, -62520228, -48381196, +-35046932, -22009024, -9437654, 1845225, 11237782, 18853832, 25243134, 30777736, 35313220, 38456064, +40142912, 40800580, 40957880, 41000832, 41336376, 42368240, 44060460, 45845016, 47209208, 48200808, +49257908, 50800336, 52993452, 55553256, 57713624, 58755688, 58689656, 58201640, 57996016, 58389008, +59332288, 60458108, 61217780, 61281668, 60723320, 59672664, 58015880, 55542516, 52076480, 47392816, +41369124, 34298000, 26756572, 19200652, 11957726, 5417565, -163746, -4829154, -8558259, -11005317, +-11884711, -11284490, -9393093, -6365142, -2624225, 1176284, 4648229, 7708930, 10205916, 11959336, +13013751, 13386876, 12816182, 11110544, 8341900, 4396436, -1074816, -8005819, -15867757, -24364276, +-33447058, -42705932, -51593296, -60073708, -68262064, -75834088, -82568064, -88848912, -94926832, -100491496, +-105538624, -110612584, -115818088, -120789512, -125676112, -130783904, -135540576, -139341088, -142721232, -146152912, +-148914032, -150690000, -152522336, -154741232, -156256816, -156975680, -158030096, -159093104, -159020624, -158774208, +-159527440, -159551056, -157928624, -157767568, -159824864, -159133904, -155159456, -155541168, -160509376, -158103120, +-147591712, -146963584, -157603296, -148436752, -107092864, -79350592, -112127640, -177940496, -209333488, -194080976, +-176679392, -173700288, -156176816, -122001768, -116535888, -159170944, -207145200, -219210304, -207884464, -203208864, +-206750592, -205597408, -194819712, -166498160, -114397528, -67672040, -78230680, -150149904, -219664496, -232825344, +-209000080, -198397968, -209876256, -217262528, -211632896, -205857248, -200630800, -185133488, -166889008, }, }, { { 14787572, --9309878, -12623446, 14235132, 21446382, -18530636, -51859584, -11151883, 81569480, 130340448, 80423800, --23640036, -97234840, -95277408, -29990682, 48718352, 78334832, 28942174, -55041616, -87754232, -36443336, -41908680, 74315816, 52690120, 19752018, 3755949, 63888, 1271847, 11577621, 32096290, 54330264, -71073656, 81520088, 85850488, 83865144, 77858632, 70140576, 59209884, 42861088, 22803056, 2893734, --14632417, -28780576, -38480224, -43919800, -47207596, -50281720, -53584012, -57026428, -60498372, -63314260, --64689188, -64704220, -63640140, -60756608, -54784456, -45235668, -32409824, -16589848, 2012192, 22822920, -44995688, 67856728, 91011968, 114083992, 136437696, 157193648, 175502032, 190672384, 201933792, 208334368, -209109616, 203979808, 193023344, 176628912, 155657136, 131174208, 103956464, 74747464, 44881336, 15788300, --12182675, -39564700, -66217120, -90894928, -112714976, -132169032, -150156896, -166723120, -181363040, -194027824, --205038512, -214222224, -220860640, -224489344, -225158288, -222805728, -216964560, -207381952, -194514768, -179062560, --161272800, -141016656, -118520160, -94934880, -72164576, -51830056, -34111168, -17818746, -1939715, 13076565, -25801480, 35229468, 41436232, 45314052, 48045652, 50455664, 52508124, 53684944, 53906136, 53718768, -53710712, 54243828, 55603720, 57789320, 60308856, 62680752, 64859376, 66787280, 68006512, 68133216, -67199056, 65231428, 62128848, 58126476, 53721988, 49094696, 44256952, 39577588, 35408784, 31518618, -27623082, 23968064, 20742544, 17588428, 14274324, 11059541, 7991324, 4777614, 1561758, -1203665, --3655017, -6198175, -8592619, -10442676, -12040404, -13614509, -14581951, -14561550, -14057428, -13307419, --11811697, -9615895, -7500624, -5536213, -3138547, -507343, 1806034, 4284767, 7539278, 10920491, -13808857, 16869020, 20430086, 23504208, 25693032, 27695022, 29115046, 28652264, 26727582, 24683178, -21885006, 17188460, 11892228, 7428146, 2467996, -3930432, -9811316, -14376329, -19734300, -25883084, --30247844, -33807300, -39536248, -44918916, -46400680, -48712444, -56388088, -61736932, -58746564, -59299540, --72151152, -79747344, -68556264, -65434900, -97560184, -129828272, -101897560, -25092810, 23052700, 8773544, --21001854, -28310276, -39726300, -79001088, -107210976, -78245712, -12508019, 30356292, 27078158, 3529390, --11720966, -20394652, -47575352, -109237664, -177698896, -189935808, -117179592, -17255032, 19667192, -23667418, --79005920, -87648472, -65023120, -56499220, -69431368, -77732464, -69026568, -55698208, -49138720, }, +-9309878, -12623446, 14235132, 21446382, -18530636, -51859584, -11151883, 81569480, 130340448, 80423800, +-23640036, -97234840, -95277408, -29990682, 48718352, 78334832, 28942174, -55041616, -87754232, -36443336, +41908680, 74315816, 52690120, 19752018, 3755949, 63888, 1271847, 11577621, 32096290, 54330264, +71073656, 81520088, 85850488, 83865144, 77858632, 70140576, 59209884, 42861088, 22803056, 2893734, +-14632417, -28780576, -38480224, -43919800, -47207596, -50281720, -53584012, -57026428, -60498372, -63314260, +-64689188, -64704220, -63640140, -60756608, -54784456, -45235668, -32409824, -16589848, 2012192, 22822920, +44995688, 67856728, 91011968, 114083992, 136437696, 157193648, 175502032, 190672384, 201933792, 208334368, +209109616, 203979808, 193023344, 176628912, 155657136, 131174208, 103956464, 74747464, 44881336, 15788300, +-12182675, -39564700, -66217120, -90894928, -112714976, -132169032, -150156896, -166723120, -181363040, -194027824, +-205038512, -214222224, -220860640, -224489344, -225158288, -222805728, -216964560, -207381952, -194514768, -179062560, +-161272800, -141016656, -118520160, -94934880, -72164576, -51830056, -34111168, -17818746, -1939715, 13076565, +25801480, 35229468, 41436232, 45314052, 48045652, 50455664, 52508124, 53684944, 53906136, 53718768, +53710712, 54243828, 55603720, 57789320, 60308856, 62680752, 64859376, 66787280, 68006512, 68133216, +67199056, 65231428, 62128848, 58126476, 53721988, 49094696, 44256952, 39577588, 35408784, 31518618, +27623082, 23968064, 20742544, 17588428, 14274324, 11059541, 7991324, 4777614, 1561758, -1203665, +-3655017, -6198175, -8592619, -10442676, -12040404, -13614509, -14581951, -14561550, -14057428, -13307419, +-11811697, -9615895, -7500624, -5536213, -3138547, -507343, 1806034, 4284767, 7539278, 10920491, +13808857, 16869020, 20430086, 23504208, 25693032, 27695022, 29115046, 28652264, 26727582, 24683178, +21885006, 17188460, 11892228, 7428146, 2467996, -3930432, -9811316, -14376329, -19734300, -25883084, +-30247844, -33807300, -39536248, -44918916, -46400680, -48712444, -56388088, -61736932, -58746564, -59299540, +-72151152, -79747344, -68556264, -65434900, -97560184, -129828272, -101897560, -25092810, 23052700, 8773544, +-21001854, -28310276, -39726300, -79001088, -107210976, -78245712, -12508019, 30356292, 27078158, 3529390, +-11720966, -20394652, -47575352, -109237664, -177698896, -189935808, -117179592, -17255032, 19667192, -23667418, +-79005920, -87648472, -65023120, -56499220, -69431368, -77732464, -69026568, -55698208, -49138720, }, { -14787572, -9309878, 12623446, -14235132, -21446382, 18530636, 51859584, 11151883, -81569480, -130340448, -80423800, -23640036, 97234840, 95277408, 29990682, -48718352, -78334832, -28942174, 55041616, 87754232, 36443336, --41908680, -74315816, -52690120, -19752018, -3755949, -63888, -1271847, -11577621, -32096290, -54330264, --71073656, -81520088, -85850488, -83865144, -77858632, -70140576, -59209884, -42861088, -22803056, -2893734, -14632417, 28780576, 38480224, 43919800, 47207596, 50281720, 53584012, 57026428, 60498372, 63314260, -64689188, 64704220, 63640140, 60756608, 54784456, 45235668, 32409824, 16589848, -2012192, -22822920, --44995688, -67856728, -91011968, -114083992, -136437696, -157193648, -175502032, -190672384, -201933792, -208334368, --209109616, -203979808, -193023344, -176628912, -155657136, -131174208, -103956464, -74747464, -44881336, -15788300, -12182675, 39564700, 66217120, 90894928, 112714976, 132169032, 150156896, 166723120, 181363040, 194027824, -205038512, 214222224, 220860640, 224489344, 225158288, 222805728, 216964560, 207381952, 194514768, 179062560, -161272800, 141016656, 118520160, 94934880, 72164576, 51830056, 34111168, 17818746, 1939715, -13076565, --25801480, -35229468, -41436232, -45314052, -48045652, -50455664, -52508124, -53684944, -53906136, -53718768, --53710712, -54243828, -55603720, -57789320, -60308856, -62680752, -64859376, -66787280, -68006512, -68133216, --67199056, -65231428, -62128848, -58126476, -53721988, -49094696, -44256952, -39577588, -35408784, -31518618, --27623082, -23968064, -20742544, -17588428, -14274324, -11059541, -7991324, -4777614, -1561758, 1203665, -3655017, 6198175, 8592619, 10442676, 12040404, 13614509, 14581951, 14561550, 14057428, 13307419, -11811697, 9615895, 7500624, 5536213, 3138547, 507343, -1806034, -4284767, -7539278, -10920491, --13808857, -16869020, -20430086, -23504208, -25693032, -27695022, -29115046, -28652264, -26727582, -24683178, --21885006, -17188460, -11892228, -7428146, -2467996, 3930432, 9811316, 14376329, 19734300, 25883084, -30247844, 33807300, 39536248, 44918916, 46400680, 48712444, 56388088, 61736932, 58746564, 59299540, -72151152, 79747344, 68556264, 65434900, 97560184, 129828272, 101897560, 25092810, -23052700, -8773544, -21001854, 28310276, 39726300, 79001088, 107210976, 78245712, 12508019, -30356292, -27078158, -3529390, -11720966, 20394652, 47575352, 109237664, 177698896, 189935808, 117179592, 17255032, -19667192, 23667418, -79005920, 87648472, 65023120, 56499220, 69431368, 77732464, 69026568, 55698208, 49138720, }, +9309878, 12623446, -14235132, -21446382, 18530636, 51859584, 11151883, -81569480, -130340448, -80423800, +23640036, 97234840, 95277408, 29990682, -48718352, -78334832, -28942174, 55041616, 87754232, 36443336, +-41908680, -74315816, -52690120, -19752018, -3755949, -63888, -1271847, -11577621, -32096290, -54330264, +-71073656, -81520088, -85850488, -83865144, -77858632, -70140576, -59209884, -42861088, -22803056, -2893734, +14632417, 28780576, 38480224, 43919800, 47207596, 50281720, 53584012, 57026428, 60498372, 63314260, +64689188, 64704220, 63640140, 60756608, 54784456, 45235668, 32409824, 16589848, -2012192, -22822920, +-44995688, -67856728, -91011968, -114083992, -136437696, -157193648, -175502032, -190672384, -201933792, -208334368, +-209109616, -203979808, -193023344, -176628912, -155657136, -131174208, -103956464, -74747464, -44881336, -15788300, +12182675, 39564700, 66217120, 90894928, 112714976, 132169032, 150156896, 166723120, 181363040, 194027824, +205038512, 214222224, 220860640, 224489344, 225158288, 222805728, 216964560, 207381952, 194514768, 179062560, +161272800, 141016656, 118520160, 94934880, 72164576, 51830056, 34111168, 17818746, 1939715, -13076565, +-25801480, -35229468, -41436232, -45314052, -48045652, -50455664, -52508124, -53684944, -53906136, -53718768, +-53710712, -54243828, -55603720, -57789320, -60308856, -62680752, -64859376, -66787280, -68006512, -68133216, +-67199056, -65231428, -62128848, -58126476, -53721988, -49094696, -44256952, -39577588, -35408784, -31518618, +-27623082, -23968064, -20742544, -17588428, -14274324, -11059541, -7991324, -4777614, -1561758, 1203665, +3655017, 6198175, 8592619, 10442676, 12040404, 13614509, 14581951, 14561550, 14057428, 13307419, +11811697, 9615895, 7500624, 5536213, 3138547, 507343, -1806034, -4284767, -7539278, -10920491, +-13808857, -16869020, -20430086, -23504208, -25693032, -27695022, -29115046, -28652264, -26727582, -24683178, +-21885006, -17188460, -11892228, -7428146, -2467996, 3930432, 9811316, 14376329, 19734300, 25883084, +30247844, 33807300, 39536248, 44918916, 46400680, 48712444, 56388088, 61736932, 58746564, 59299540, +72151152, 79747344, 68556264, 65434900, 97560184, 129828272, 101897560, 25092810, -23052700, -8773544, +21001854, 28310276, 39726300, 79001088, 107210976, 78245712, 12508019, -30356292, -27078158, -3529390, +11720966, 20394652, 47575352, 109237664, 177698896, 189935808, 117179592, 17255032, -19667192, 23667418, +79005920, 87648472, 65023120, 56499220, 69431368, 77732464, 69026568, 55698208, 49138720, }, }, { { -6025302, -1979443, -222265, -16834662, -30957588, -36381596, -51714092, -87899728, -120777704, -112181864, -43570832, -77029168, 208089024, 261198432, 152920160, -75685912, -236769200, -175597056, 39822400, 187850064, 150632560, -20638928, -58457728, -61116848, -46331960, -37755448, -13233331, 26470958, 49673444, 44979580, 32832878, -29070486, 30021822, 31279710, 35779224, 43230456, 48567492, 50661288, 52303036, 53977000, 54458576, -53994180, 52387328, 47992500, 41231148, 34854196, 29503204, 23281944, 15821586, 8548596, 1335735, --7248831, -17124034, -27237072, -37695316, -48859548, -59795608, -69548408, -78358992, -86362664, -92807800, --97305704, -100093136, -100751880, -98342936, -92724048, -84230752, -72535016, -57256208, -39036420, -18780282, -3400540, 27492086, 52703544, 78053512, 103020160, 127148752, 149767664, 170279344, 188142112, 202759504, -213930704, 221964976, 226878432, 228149200, 225644704, 219942592, 211418688, 199924288, 185485136, 168290240, -147967536, 124031680, 97151088, 68976640, 40701796, 12624519, -14948634, -41031432, -64026152, -82104744, --94056560, -100199976, -101970040, -100331512, -95142656, -86187648, -74119864, -60247116, -46028628, -32858648, --21724482, -12905840, -6273874, -1771137, 579821, 753767, -1453846, -6287832, -13451838, -22012244, --31038118, -40020504, -48729624, -57130580, -65436512, -73827264, -82161648, -90292024, -98483600, -107146016, --116334560, -125821600, -135456288, -145181168, -154930208, -164768368, -174957104, -185680032, -196791648, -207871584, --218379760, -227793248, -235789408, -242291984, -247272544, -250634960, -252407168, -252862448, -252302480, -250889440, --248792960, -246312624, -243703968, -241036256, -238327200, -235674512, -233170016, -230821200, -228622720, -226595488, --224694976, -222788000, -220744144, -218472096, -215921968, -213194128, -210591376, -208357456, -206404848, -204483936, --202514688, -200500880, -198246032, -195491872, -192226096, -188531344, -184309936, -179491520, -174255408, -168694512, --162626256, -156058704, -149355344, -142635856, -135690896, -128732520, -122365768, -116624472, -111073760, -105838728, --101291432, -97019552, -92588224, -88589072, -85222352, -81268832, -76563696, -73123968, -71223976, -68003824, --63351840, -61722440, -63362040, -61339648, -54596012, -54396296, -66872640, -79462264, -79236776, -73754256, --75033080, -74489232, -59138480, -43898324, -56496536, -92272000, -115959288, -111137112, -97305168, -93654448, --96820912, -100096360, -102982040, -95615096, -68264744, -44223668, -64519536, -126372968, -176200496, -181162800, --167001744, -164430144, -164273376, -155705984, -159117808, -175705504, -151062592, -52396992, 49567680, }, +1979443, -222265, -16834662, -30957588, -36381596, -51714092, -87899728, -120777704, -112181864, -43570832, +77029168, 208089024, 261198432, 152920160, -75685912, -236769200, -175597056, 39822400, 187850064, 150632560, +20638928, -58457728, -61116848, -46331960, -37755448, -13233331, 26470958, 49673444, 44979580, 32832878, +29070486, 30021822, 31279710, 35779224, 43230456, 48567492, 50661288, 52303036, 53977000, 54458576, +53994180, 52387328, 47992500, 41231148, 34854196, 29503204, 23281944, 15821586, 8548596, 1335735, +-7248831, -17124034, -27237072, -37695316, -48859548, -59795608, -69548408, -78358992, -86362664, -92807800, +-97305704, -100093136, -100751880, -98342936, -92724048, -84230752, -72535016, -57256208, -39036420, -18780282, +3400540, 27492086, 52703544, 78053512, 103020160, 127148752, 149767664, 170279344, 188142112, 202759504, +213930704, 221964976, 226878432, 228149200, 225644704, 219942592, 211418688, 199924288, 185485136, 168290240, +147967536, 124031680, 97151088, 68976640, 40701796, 12624519, -14948634, -41031432, -64026152, -82104744, +-94056560, -100199976, -101970040, -100331512, -95142656, -86187648, -74119864, -60247116, -46028628, -32858648, +-21724482, -12905840, -6273874, -1771137, 579821, 753767, -1453846, -6287832, -13451838, -22012244, +-31038118, -40020504, -48729624, -57130580, -65436512, -73827264, -82161648, -90292024, -98483600, -107146016, +-116334560, -125821600, -135456288, -145181168, -154930208, -164768368, -174957104, -185680032, -196791648, -207871584, +-218379760, -227793248, -235789408, -242291984, -247272544, -250634960, -252407168, -252862448, -252302480, -250889440, +-248792960, -246312624, -243703968, -241036256, -238327200, -235674512, -233170016, -230821200, -228622720, -226595488, +-224694976, -222788000, -220744144, -218472096, -215921968, -213194128, -210591376, -208357456, -206404848, -204483936, +-202514688, -200500880, -198246032, -195491872, -192226096, -188531344, -184309936, -179491520, -174255408, -168694512, +-162626256, -156058704, -149355344, -142635856, -135690896, -128732520, -122365768, -116624472, -111073760, -105838728, +-101291432, -97019552, -92588224, -88589072, -85222352, -81268832, -76563696, -73123968, -71223976, -68003824, +-63351840, -61722440, -63362040, -61339648, -54596012, -54396296, -66872640, -79462264, -79236776, -73754256, +-75033080, -74489232, -59138480, -43898324, -56496536, -92272000, -115959288, -111137112, -97305168, -93654448, +-96820912, -100096360, -102982040, -95615096, -68264744, -44223668, -64519536, -126372968, -176200496, -181162800, +-167001744, -164430144, -164273376, -155705984, -159117808, -175705504, -151062592, -52396992, 49567680, }, { -6025302, -1979443, -222265, -16834662, -30957588, -36381596, -51714092, -87899728, -120777704, -112181864, -43570832, -77029168, 208089024, 261198432, 152920160, -75685912, -236769200, -175597056, 39822400, 187850064, 150632560, -20638928, -58457728, -61116848, -46331960, -37755448, -13233331, 26470958, 49673444, 44979580, 32832878, -29070486, 30021822, 31279710, 35779224, 43230456, 48567492, 50661288, 52303036, 53977000, 54458576, -53994180, 52387328, 47992500, 41231148, 34854196, 29503204, 23281944, 15821586, 8548596, 1335735, --7248831, -17124034, -27237072, -37695316, -48859548, -59795608, -69548408, -78358992, -86362664, -92807800, --97305704, -100093136, -100751880, -98342936, -92724048, -84230752, -72535016, -57256208, -39036420, -18780282, -3400540, 27492086, 52703544, 78053512, 103020160, 127148752, 149767664, 170279344, 188142112, 202759504, -213930704, 221964976, 226878432, 228149200, 225644704, 219942592, 211418688, 199924288, 185485136, 168290240, -147967536, 124031680, 97151088, 68976640, 40701796, 12624519, -14948634, -41031432, -64026152, -82104744, --94056560, -100199976, -101970040, -100331512, -95142656, -86187648, -74119864, -60247116, -46028628, -32858648, --21724482, -12905840, -6273874, -1771137, 579821, 753767, -1453846, -6287832, -13451838, -22012244, --31038118, -40020504, -48729624, -57130580, -65436512, -73827264, -82161648, -90292024, -98483600, -107146016, --116334560, -125821600, -135456288, -145181168, -154930208, -164768368, -174957104, -185680032, -196791648, -207871584, --218379760, -227793248, -235789408, -242291984, -247272544, -250634960, -252407168, -252862448, -252302480, -250889440, --248792960, -246312624, -243703968, -241036256, -238327200, -235674512, -233170016, -230821200, -228622720, -226595488, --224694976, -222788000, -220744144, -218472096, -215921968, -213194128, -210591376, -208357456, -206404848, -204483936, --202514688, -200500880, -198246032, -195491872, -192226096, -188531344, -184309936, -179491520, -174255408, -168694512, --162626256, -156058704, -149355344, -142635856, -135690896, -128732520, -122365768, -116624472, -111073760, -105838728, --101291432, -97019552, -92588224, -88589072, -85222352, -81268832, -76563696, -73123968, -71223976, -68003824, --63351840, -61722440, -63362040, -61339648, -54596012, -54396296, -66872640, -79462264, -79236776, -73754256, --75033080, -74489232, -59138480, -43898324, -56496536, -92272000, -115959288, -111137112, -97305168, -93654448, --96820912, -100096360, -102982040, -95615096, -68264744, -44223668, -64519536, -126372968, -176200496, -181162800, --167001744, -164430144, -164273376, -155705984, -159117808, -175705504, -151062592, -52396992, 49567680, }, +1979443, -222265, -16834662, -30957588, -36381596, -51714092, -87899728, -120777704, -112181864, -43570832, +77029168, 208089024, 261198432, 152920160, -75685912, -236769200, -175597056, 39822400, 187850064, 150632560, +20638928, -58457728, -61116848, -46331960, -37755448, -13233331, 26470958, 49673444, 44979580, 32832878, +29070486, 30021822, 31279710, 35779224, 43230456, 48567492, 50661288, 52303036, 53977000, 54458576, +53994180, 52387328, 47992500, 41231148, 34854196, 29503204, 23281944, 15821586, 8548596, 1335735, +-7248831, -17124034, -27237072, -37695316, -48859548, -59795608, -69548408, -78358992, -86362664, -92807800, +-97305704, -100093136, -100751880, -98342936, -92724048, -84230752, -72535016, -57256208, -39036420, -18780282, +3400540, 27492086, 52703544, 78053512, 103020160, 127148752, 149767664, 170279344, 188142112, 202759504, +213930704, 221964976, 226878432, 228149200, 225644704, 219942592, 211418688, 199924288, 185485136, 168290240, +147967536, 124031680, 97151088, 68976640, 40701796, 12624519, -14948634, -41031432, -64026152, -82104744, +-94056560, -100199976, -101970040, -100331512, -95142656, -86187648, -74119864, -60247116, -46028628, -32858648, +-21724482, -12905840, -6273874, -1771137, 579821, 753767, -1453846, -6287832, -13451838, -22012244, +-31038118, -40020504, -48729624, -57130580, -65436512, -73827264, -82161648, -90292024, -98483600, -107146016, +-116334560, -125821600, -135456288, -145181168, -154930208, -164768368, -174957104, -185680032, -196791648, -207871584, +-218379760, -227793248, -235789408, -242291984, -247272544, -250634960, -252407168, -252862448, -252302480, -250889440, +-248792960, -246312624, -243703968, -241036256, -238327200, -235674512, -233170016, -230821200, -228622720, -226595488, +-224694976, -222788000, -220744144, -218472096, -215921968, -213194128, -210591376, -208357456, -206404848, -204483936, +-202514688, -200500880, -198246032, -195491872, -192226096, -188531344, -184309936, -179491520, -174255408, -168694512, +-162626256, -156058704, -149355344, -142635856, -135690896, -128732520, -122365768, -116624472, -111073760, -105838728, +-101291432, -97019552, -92588224, -88589072, -85222352, -81268832, -76563696, -73123968, -71223976, -68003824, +-63351840, -61722440, -63362040, -61339648, -54596012, -54396296, -66872640, -79462264, -79236776, -73754256, +-75033080, -74489232, -59138480, -43898324, -56496536, -92272000, -115959288, -111137112, -97305168, -93654448, +-96820912, -100096360, -102982040, -95615096, -68264744, -44223668, -64519536, -126372968, -176200496, -181162800, +-167001744, -164430144, -164273376, -155705984, -159117808, -175705504, -151062592, -52396992, 49567680, }, }, { { 29307246, --878858, -42704324, -72876472, -70761736, -23331336, 55871084, 116787144, 109559248, 39856760, -32484448, --58414776, -43856448, -21141440, -2680597, 15889768, 26560614, 13996225, -14605036, -31122406, -21969832, --2903398, 6818798, 8773544, 15928423, 31583578, 48165372, 59697360, 65471944, 64473900, 54574000, -37441376, 18937048, 3500935, -9198746, -21889838, -36363876, -52752936, -69901664, -85429584, -96595424, --102137008, -103021232, -101151312, -97832912, -93675920, -89173184, -84649512, -79967456, -74834440, -69271384, --63428612, -57213260, -50484656, -43397960, -36165236, -28683940, -20797842, -12817793, -5420786, 918049, -6114423, 10133975, 12791486, 14083198, 14567455, 15083388, 16026670, 17206712, 18585934, 20751672, -24294482, 29113436, 34883188, 41921028, 50963544, 62261992, 75462040, 90223840, 106428216, 123815856, -141812304, 159680448, 176754016, 192737728, 207700864, 221378720, 232731936, 240982032, 246897264, 251979824, -256221104, 257716832, 254803760, 247682176, 237500960, 224613360, 208337056, 188131376, 164570256, 139064592, -112637664, 85165984, 56152404, 26129508, -3279745, -30788474, -56460028, -81225344, -105789336, -129938864, --152505696, -172069808, -188065888, -201101104, -212045760, -221146256, -228186784, -233039552, -235799616, -236826640, --236814832, -236425072, -235787792, -234723184, -233300480, -231734960, -229933216, -227519984, -224062000, -219077696, --212325472, -204323936, -196038416, -187871536, -179481856, -170480144, -160598496, -149437488, -136977776, -124157840, --112090056, -100978976, -90492816, -80589152, -71204112, -61867392, -52499532, -43907452, -36817532, -31094490, --26345330, -22387518, -18780818, -14820322, -10290742, -5505075, -673236, 4072703, 8424578, 12390444, -16510391, 21018496, 25596394, 30291868, 35538708, 41002980, 45722612, 49519900, 52903796, 55758340, -57636852, 58932856, 60229936, 61198988, 61519500, 61785252, 62269508, 62305480, 61950072, 62325344, -63552096, 64648920, 65827352, 68190120, 71262096, 73829952, 76496592, 80195096, 83748640, 86269784, -89391152, 93638880, 96563752, 97985384, 101374112, 106389024, 107995880, 106985488, 110517560, 117346024, -117004576, 110704392, 114393232, 129332200, 131231648, 107544368, 84891640, 93700616, 122091424, 134975792, -127269544, 123901752, 131259032, 125364192, 95880312, 70135744, 76178760, 102809168, 116211616, 105042552, -88894008, 83855480, 78058344, 51140712, 9394167, -13389024, 5523328, 48172892, 74796856, 68604584, -50431504, 47843788, 61429308, 69788920, 61923228, 53546968, 67870680, 105293808, 138296336, }, +-878858, -42704324, -72876472, -70761736, -23331336, 55871084, 116787144, 109559248, 39856760, -32484448, +-58414776, -43856448, -21141440, -2680597, 15889768, 26560614, 13996225, -14605036, -31122406, -21969832, +-2903398, 6818798, 8773544, 15928423, 31583578, 48165372, 59697360, 65471944, 64473900, 54574000, +37441376, 18937048, 3500935, -9198746, -21889838, -36363876, -52752936, -69901664, -85429584, -96595424, +-102137008, -103021232, -101151312, -97832912, -93675920, -89173184, -84649512, -79967456, -74834440, -69271384, +-63428612, -57213260, -50484656, -43397960, -36165236, -28683940, -20797842, -12817793, -5420786, 918049, +6114423, 10133975, 12791486, 14083198, 14567455, 15083388, 16026670, 17206712, 18585934, 20751672, +24294482, 29113436, 34883188, 41921028, 50963544, 62261992, 75462040, 90223840, 106428216, 123815856, +141812304, 159680448, 176754016, 192737728, 207700864, 221378720, 232731936, 240982032, 246897264, 251979824, +256221104, 257716832, 254803760, 247682176, 237500960, 224613360, 208337056, 188131376, 164570256, 139064592, +112637664, 85165984, 56152404, 26129508, -3279745, -30788474, -56460028, -81225344, -105789336, -129938864, +-152505696, -172069808, -188065888, -201101104, -212045760, -221146256, -228186784, -233039552, -235799616, -236826640, +-236814832, -236425072, -235787792, -234723184, -233300480, -231734960, -229933216, -227519984, -224062000, -219077696, +-212325472, -204323936, -196038416, -187871536, -179481856, -170480144, -160598496, -149437488, -136977776, -124157840, +-112090056, -100978976, -90492816, -80589152, -71204112, -61867392, -52499532, -43907452, -36817532, -31094490, +-26345330, -22387518, -18780818, -14820322, -10290742, -5505075, -673236, 4072703, 8424578, 12390444, +16510391, 21018496, 25596394, 30291868, 35538708, 41002980, 45722612, 49519900, 52903796, 55758340, +57636852, 58932856, 60229936, 61198988, 61519500, 61785252, 62269508, 62305480, 61950072, 62325344, +63552096, 64648920, 65827352, 68190120, 71262096, 73829952, 76496592, 80195096, 83748640, 86269784, +89391152, 93638880, 96563752, 97985384, 101374112, 106389024, 107995880, 106985488, 110517560, 117346024, +117004576, 110704392, 114393232, 129332200, 131231648, 107544368, 84891640, 93700616, 122091424, 134975792, +127269544, 123901752, 131259032, 125364192, 95880312, 70135744, 76178760, 102809168, 116211616, 105042552, +88894008, 83855480, 78058344, 51140712, 9394167, -13389024, 5523328, 48172892, 74796856, 68604584, +50431504, 47843788, 61429308, 69788920, 61923228, 53546968, 67870680, 105293808, 138296336, }, { 29307246, --878858, -42704324, -72876472, -70761736, -23331336, 55871084, 116787144, 109559248, 39856760, -32484448, --58414776, -43856448, -21141440, -2680597, 15889768, 26560614, 13996225, -14605036, -31122406, -21969832, --2903398, 6818798, 8773544, 15928423, 31583578, 48165372, 59697360, 65471944, 64473900, 54574000, -37441376, 18937048, 3500935, -9198746, -21889838, -36363876, -52752936, -69901664, -85429584, -96595424, --102137008, -103021232, -101151312, -97832912, -93675920, -89173184, -84649512, -79967456, -74834440, -69271384, --63428612, -57213260, -50484656, -43397960, -36165236, -28683940, -20797842, -12817793, -5420786, 918049, -6114423, 10133975, 12791486, 14083198, 14567455, 15083388, 16026670, 17206712, 18585934, 20751672, -24294482, 29113436, 34883188, 41921028, 50963544, 62261992, 75462040, 90223840, 106428216, 123815856, -141812304, 159680448, 176754016, 192737728, 207700864, 221378720, 232731936, 240982032, 246897264, 251979824, -256221104, 257716832, 254803760, 247682176, 237500960, 224613360, 208337056, 188131376, 164570256, 139064592, -112637664, 85165984, 56152404, 26129508, -3279745, -30788474, -56460028, -81225344, -105789336, -129938864, --152505696, -172069808, -188065888, -201101104, -212045760, -221146256, -228186784, -233039552, -235799616, -236826640, --236814832, -236425072, -235787792, -234723184, -233300480, -231734960, -229933216, -227519984, -224062000, -219077696, --212325472, -204323936, -196038416, -187871536, -179481856, -170480144, -160598496, -149437488, -136977776, -124157840, --112090056, -100978976, -90492816, -80589152, -71204112, -61867392, -52499532, -43907452, -36817532, -31094490, --26345330, -22387518, -18780818, -14820322, -10290742, -5505075, -673236, 4072703, 8424578, 12390444, -16510391, 21018496, 25596394, 30291868, 35538708, 41002980, 45722612, 49519900, 52903796, 55758340, -57636852, 58932856, 60229936, 61198988, 61519500, 61785252, 62269508, 62305480, 61950072, 62325344, -63552096, 64648920, 65827352, 68190120, 71262096, 73829952, 76496592, 80195096, 83748640, 86269784, -89391152, 93638880, 96563752, 97985384, 101374112, 106389024, 107995880, 106985488, 110517560, 117346024, -117004576, 110704392, 114393232, 129332200, 131231648, 107544368, 84891640, 93700616, 122091424, 134975792, -127269544, 123901752, 131259032, 125364192, 95880312, 70135744, 76178760, 102809168, 116211616, 105042552, -88894008, 83855480, 78058344, 51140712, 9394167, -13389024, 5523328, 48172892, 74796856, 68604584, -50431504, 47843788, 61429308, 69788920, 61923228, 53546968, 67870680, 105293808, 138296336, }, +-878858, -42704324, -72876472, -70761736, -23331336, 55871084, 116787144, 109559248, 39856760, -32484448, +-58414776, -43856448, -21141440, -2680597, 15889768, 26560614, 13996225, -14605036, -31122406, -21969832, +-2903398, 6818798, 8773544, 15928423, 31583578, 48165372, 59697360, 65471944, 64473900, 54574000, +37441376, 18937048, 3500935, -9198746, -21889838, -36363876, -52752936, -69901664, -85429584, -96595424, +-102137008, -103021232, -101151312, -97832912, -93675920, -89173184, -84649512, -79967456, -74834440, -69271384, +-63428612, -57213260, -50484656, -43397960, -36165236, -28683940, -20797842, -12817793, -5420786, 918049, +6114423, 10133975, 12791486, 14083198, 14567455, 15083388, 16026670, 17206712, 18585934, 20751672, +24294482, 29113436, 34883188, 41921028, 50963544, 62261992, 75462040, 90223840, 106428216, 123815856, +141812304, 159680448, 176754016, 192737728, 207700864, 221378720, 232731936, 240982032, 246897264, 251979824, +256221104, 257716832, 254803760, 247682176, 237500960, 224613360, 208337056, 188131376, 164570256, 139064592, +112637664, 85165984, 56152404, 26129508, -3279745, -30788474, -56460028, -81225344, -105789336, -129938864, +-152505696, -172069808, -188065888, -201101104, -212045760, -221146256, -228186784, -233039552, -235799616, -236826640, +-236814832, -236425072, -235787792, -234723184, -233300480, -231734960, -229933216, -227519984, -224062000, -219077696, +-212325472, -204323936, -196038416, -187871536, -179481856, -170480144, -160598496, -149437488, -136977776, -124157840, +-112090056, -100978976, -90492816, -80589152, -71204112, -61867392, -52499532, -43907452, -36817532, -31094490, +-26345330, -22387518, -18780818, -14820322, -10290742, -5505075, -673236, 4072703, 8424578, 12390444, +16510391, 21018496, 25596394, 30291868, 35538708, 41002980, 45722612, 49519900, 52903796, 55758340, +57636852, 58932856, 60229936, 61198988, 61519500, 61785252, 62269508, 62305480, 61950072, 62325344, +63552096, 64648920, 65827352, 68190120, 71262096, 73829952, 76496592, 80195096, 83748640, 86269784, +89391152, 93638880, 96563752, 97985384, 101374112, 106389024, 107995880, 106985488, 110517560, 117346024, +117004576, 110704392, 114393232, 129332200, 131231648, 107544368, 84891640, 93700616, 122091424, 134975792, +127269544, 123901752, 131259032, 125364192, 95880312, 70135744, 76178760, 102809168, 116211616, 105042552, +88894008, 83855480, 78058344, 51140712, 9394167, -13389024, 5523328, 48172892, 74796856, 68604584, +50431504, 47843788, 61429308, 69788920, 61923228, 53546968, 67870680, 105293808, 138296336, }, }, { { -14042932, -36850284, 74545600, 62616864, 21942452, -35493608, -129862632, -245363968, -305267488, -253026192, -105521440, -97686344, 316325952, 438439392, 305316864, -72467376, -401281472, -367888640, -8289824, 324833760, 372224416, -210067392, 57280368, -6293201, -43093556, -93670016, -132662416, -146641456, -157265600, -172272752, -174583984, --158528848, -136673920, -114313240, -85986856, -52620864, -21429202, 5864241, 30623116, 49920404, 61535072, -69225208, 76380624, 81414864, 83167744, 83600464, 83035136, 79553528, 73965776, 69466264, 66667556, -63886028, 60877940, 58137752, 54595476, 49376016, 43455404, 37355480, 30013232, 21316460, 12649216, -4209068, -5113696, -15124727, -24588150, -33608120, -42966852, -51969104, -59424632, -65610996, -71242232, --75948440, -79402672, -82365128, -85393080, -88081192, -90216864, -92116848, -93674312, -94658392, -95714960, --97591856, -99947112, -102214320, -104685536, -107563160, -110046192, -111361520, -111583248, -110840224, -108969224, --106280040, -103409928, -100490424, -97757752, -96583080, -98445480, -103285376, -110119200, -118666728, -129239328, --141640512, -155055840, -168416944, -180446064, -190171488, -197639904, -203280272, -206717312, -207151648, -204593984, --199757856, -193181728, -185304224, -176749712, -167726528, -157865280, -147240608, -136770016, -127191696, -118458416, --110238928, -102100496, -93313536, -83529600, -73475616, -64114736, -55502788, -47197396, -39099236, -31110596, --22786412, -14031121, -5390184, 2841658, 10960757, 19097572, 27059368, 35013112, 43351252, 51912196, -60190208, 68055368, 75498008, 82111720, 87556664, 92006792, 95621008, 98203888, 99734512, 100466800, -100345472, 99104224, 96911104, 94131184, 90725816, 86650432, 82366200, 78212432, 73921216, 69373920, -65007016, 60975652, 56887380, 52735220, 49089864, 46178952, 43797928, 42036992, 41066328, 40505836, -39958228, 39606576, 39498128, 39136816, 38496328, 38295004, 38741140, 39278012, 39824548, 40808632, -41965588, 42667816, 43120396, 43752296, 44179644, 44193064, 44544180, 45489072, 46232100, 46717432, -47753592, 48926656, 49216568, 49459232, 50723564, 51389284, 50187228, 49803904, 51974472, 52767432, -49910204, 49344344, 54588496, 56278032, 46409804, 37261524, 47913044, 74125232, 91240136, 88413512, -80640160, 82477864, 88261040, 86315424, 77971376, 72854456, 75130792, 82306608, 90818696, 97236984, -99371048, 99507416, 100442640, 94990184, 67389112, 14216879, -39399344, -58022860, -36593120, -10273562, --9674414, -19194746, -6493454, 16509854, 8908299, -13298292, 33717640, 181697520, 325155872, }, +36850284, 74545600, 62616864, 21942452, -35493608, -129862632, -245363968, -305267488, -253026192, -105521440, +97686344, 316325952, 438439392, 305316864, -72467376, -401281472, -367888640, -8289824, 324833760, 372224416, +210067392, 57280368, -6293201, -43093556, -93670016, -132662416, -146641456, -157265600, -172272752, -174583984, +-158528848, -136673920, -114313240, -85986856, -52620864, -21429202, 5864241, 30623116, 49920404, 61535072, +69225208, 76380624, 81414864, 83167744, 83600464, 83035136, 79553528, 73965776, 69466264, 66667556, +63886028, 60877940, 58137752, 54595476, 49376016, 43455404, 37355480, 30013232, 21316460, 12649216, +4209068, -5113696, -15124727, -24588150, -33608120, -42966852, -51969104, -59424632, -65610996, -71242232, +-75948440, -79402672, -82365128, -85393080, -88081192, -90216864, -92116848, -93674312, -94658392, -95714960, +-97591856, -99947112, -102214320, -104685536, -107563160, -110046192, -111361520, -111583248, -110840224, -108969224, +-106280040, -103409928, -100490424, -97757752, -96583080, -98445480, -103285376, -110119200, -118666728, -129239328, +-141640512, -155055840, -168416944, -180446064, -190171488, -197639904, -203280272, -206717312, -207151648, -204593984, +-199757856, -193181728, -185304224, -176749712, -167726528, -157865280, -147240608, -136770016, -127191696, -118458416, +-110238928, -102100496, -93313536, -83529600, -73475616, -64114736, -55502788, -47197396, -39099236, -31110596, +-22786412, -14031121, -5390184, 2841658, 10960757, 19097572, 27059368, 35013112, 43351252, 51912196, +60190208, 68055368, 75498008, 82111720, 87556664, 92006792, 95621008, 98203888, 99734512, 100466800, +100345472, 99104224, 96911104, 94131184, 90725816, 86650432, 82366200, 78212432, 73921216, 69373920, +65007016, 60975652, 56887380, 52735220, 49089864, 46178952, 43797928, 42036992, 41066328, 40505836, +39958228, 39606576, 39498128, 39136816, 38496328, 38295004, 38741140, 39278012, 39824548, 40808632, +41965588, 42667816, 43120396, 43752296, 44179644, 44193064, 44544180, 45489072, 46232100, 46717432, +47753592, 48926656, 49216568, 49459232, 50723564, 51389284, 50187228, 49803904, 51974472, 52767432, +49910204, 49344344, 54588496, 56278032, 46409804, 37261524, 47913044, 74125232, 91240136, 88413512, +80640160, 82477864, 88261040, 86315424, 77971376, 72854456, 75130792, 82306608, 90818696, 97236984, +99371048, 99507416, 100442640, 94990184, 67389112, 14216879, -39399344, -58022860, -36593120, -10273562, +-9674414, -19194746, -6493454, 16509854, 8908299, -13298292, 33717640, 181697520, 325155872, }, { -14042932, -36850284, 74545600, 62616864, 21942452, -35493608, -129862632, -245363968, -305267488, -253026192, -105521440, -97686344, 316325952, 438439392, 305316864, -72467376, -401281472, -367888640, -8289824, 324833760, 372224416, -210067392, 57280368, -6293201, -43093556, -93670016, -132662416, -146641456, -157265600, -172272752, -174583984, --158528848, -136673920, -114313240, -85986856, -52620864, -21429202, 5864241, 30623116, 49920404, 61535072, -69225208, 76380624, 81414864, 83167744, 83600464, 83035136, 79553528, 73965776, 69466264, 66667556, -63886028, 60877940, 58137752, 54595476, 49376016, 43455404, 37355480, 30013232, 21316460, 12649216, -4209068, -5113696, -15124727, -24588150, -33608120, -42966852, -51969104, -59424632, -65610996, -71242232, --75948440, -79402672, -82365128, -85393080, -88081192, -90216864, -92116848, -93674312, -94658392, -95714960, --97591856, -99947112, -102214320, -104685536, -107563160, -110046192, -111361520, -111583248, -110840224, -108969224, --106280040, -103409928, -100490424, -97757752, -96583080, -98445480, -103285376, -110119200, -118666728, -129239328, --141640512, -155055840, -168416944, -180446064, -190171488, -197639904, -203280272, -206717312, -207151648, -204593984, --199757856, -193181728, -185304224, -176749712, -167726528, -157865280, -147240608, -136770016, -127191696, -118458416, --110238928, -102100496, -93313536, -83529600, -73475616, -64114736, -55502788, -47197396, -39099236, -31110596, --22786412, -14031121, -5390184, 2841658, 10960757, 19097572, 27059368, 35013112, 43351252, 51912196, -60190208, 68055368, 75498008, 82111720, 87556664, 92006792, 95621008, 98203888, 99734512, 100466800, -100345472, 99104224, 96911104, 94131184, 90725816, 86650432, 82366200, 78212432, 73921216, 69373920, -65007016, 60975652, 56887380, 52735220, 49089864, 46178952, 43797928, 42036992, 41066328, 40505836, -39958228, 39606576, 39498128, 39136816, 38496328, 38295004, 38741140, 39278012, 39824548, 40808632, -41965588, 42667816, 43120396, 43752296, 44179644, 44193064, 44544180, 45489072, 46232100, 46717432, -47753592, 48926656, 49216568, 49459232, 50723564, 51389284, 50187228, 49803904, 51974472, 52767432, -49910204, 49344344, 54588496, 56278032, 46409804, 37261524, 47913044, 74125232, 91240136, 88413512, -80640160, 82477864, 88261040, 86315424, 77971376, 72854456, 75130792, 82306608, 90818696, 97236984, -99371048, 99507416, 100442640, 94990184, 67389112, 14216879, -39399344, -58022860, -36593120, -10273562, --9674414, -19194746, -6493454, 16509854, 8908299, -13298292, 33717640, 181697520, 325155872, }, +36850284, 74545600, 62616864, 21942452, -35493608, -129862632, -245363968, -305267488, -253026192, -105521440, +97686344, 316325952, 438439392, 305316864, -72467376, -401281472, -367888640, -8289824, 324833760, 372224416, +210067392, 57280368, -6293201, -43093556, -93670016, -132662416, -146641456, -157265600, -172272752, -174583984, +-158528848, -136673920, -114313240, -85986856, -52620864, -21429202, 5864241, 30623116, 49920404, 61535072, +69225208, 76380624, 81414864, 83167744, 83600464, 83035136, 79553528, 73965776, 69466264, 66667556, +63886028, 60877940, 58137752, 54595476, 49376016, 43455404, 37355480, 30013232, 21316460, 12649216, +4209068, -5113696, -15124727, -24588150, -33608120, -42966852, -51969104, -59424632, -65610996, -71242232, +-75948440, -79402672, -82365128, -85393080, -88081192, -90216864, -92116848, -93674312, -94658392, -95714960, +-97591856, -99947112, -102214320, -104685536, -107563160, -110046192, -111361520, -111583248, -110840224, -108969224, +-106280040, -103409928, -100490424, -97757752, -96583080, -98445480, -103285376, -110119200, -118666728, -129239328, +-141640512, -155055840, -168416944, -180446064, -190171488, -197639904, -203280272, -206717312, -207151648, -204593984, +-199757856, -193181728, -185304224, -176749712, -167726528, -157865280, -147240608, -136770016, -127191696, -118458416, +-110238928, -102100496, -93313536, -83529600, -73475616, -64114736, -55502788, -47197396, -39099236, -31110596, +-22786412, -14031121, -5390184, 2841658, 10960757, 19097572, 27059368, 35013112, 43351252, 51912196, +60190208, 68055368, 75498008, 82111720, 87556664, 92006792, 95621008, 98203888, 99734512, 100466800, +100345472, 99104224, 96911104, 94131184, 90725816, 86650432, 82366200, 78212432, 73921216, 69373920, +65007016, 60975652, 56887380, 52735220, 49089864, 46178952, 43797928, 42036992, 41066328, 40505836, +39958228, 39606576, 39498128, 39136816, 38496328, 38295004, 38741140, 39278012, 39824548, 40808632, +41965588, 42667816, 43120396, 43752296, 44179644, 44193064, 44544180, 45489072, 46232100, 46717432, +47753592, 48926656, 49216568, 49459232, 50723564, 51389284, 50187228, 49803904, 51974472, 52767432, +49910204, 49344344, 54588496, 56278032, 46409804, 37261524, 47913044, 74125232, 91240136, 88413512, +80640160, 82477864, 88261040, 86315424, 77971376, 72854456, 75130792, 82306608, 90818696, 97236984, +99371048, 99507416, 100442640, 94990184, 67389112, 14216879, -39399344, -58022860, -36593120, -10273562, +-9674414, -19194746, -6493454, 16509854, 8908299, -13298292, 33717640, 181697520, 325155872, }, }, { { -3956202, --4892505, -590021, 12164421, 38077032, 81775104, 124623304, 129460512, 85682984, 10402411, -102941240, --257014064, -344556224, -196735264, 162329360, 421296576, 301453568, -81786376, -339304576, -270695136, -44466872, -89393304, 91300808, 71099960, 80839872, 84115320, 60540248, 34794068, 20905754, 6206228, -14057965, --28276990, -31372052, -29687350, -27041114, -22638772, -17798882, -13996225, -9483288, -3846680, -10201, -1374390, 3223910, 6271726, 8032126, 7897908, 7853885, 8408472, 8438537, 8327405, 9541270, -12103755, 15187004, 18816252, 23058606, 27099096, 30406220, 33283312, 35678832, 37071472, 37647000, -38043748, 38136624, 37421512, 36086316, 34518116, 32481764, 29738354, 26662620, 23539106, 20119238, -16299401, 12321187, 8060580, 3009698, -2988760, -9727564, -17154100, -25212532, -33552822, -42001560, --50826108, -60007136, -68805912, -76527192, -83177944, -89035208, -94018448, -97715872, -99669544, -99597608, --97630512, -94253592, -89847496, -84563072, -78763792, -73134168, -68153616, -63880124, -60413008, -58128624, --57258892, -57550952, -58465244, -59591596, -60923576, -62826244, -65579856, -68929392, -72264432, -75220984, --77873128, -80420040, -82957832, -85422608, -87509960, -88818848, -89284856, -89289688, -89233312, -89199488, --89014272, -88326000, -86707872, -84005800, -80527416, -76630272, -72300408, -67334352, -61617212, -55052352, --47603808, -39574364, -31474058, -23550916, -15794742, -8280160, -1080184, 5948530, 12839268, 19225348, -24750822, 29457570, 33496986, 36922760, 39977556, 43079060, 46364172, 49711024, 53141092, 56701620, -60179472, 63440960, 66724464, 70176544, 73627552, 77124192, 80998248, 85179400, 89241368, 93158912, -97144104, 100919920, 104110544, 106969920, 109786344, 112219440, 114109224, 116018344, 118209312, 120240296, -122128472, 124492312, 127278136, 129930816, 132675296, 135856256, 138673760, 140493216, 142199920, 144359760, -145933328, 146609776, 147791440, 149669408, 150676576, 150927296, 152078352, 153518768, 153616480, 153758752, -155404272, 155954560, 154248912, 154691840, 158040832, 157198480, 151757840, 152642608, 159947808, 156843616, -142624592, 142603648, 158689376, 148107648, 94958504, 63685776, 117763168, 214589984, 256608720, 227827072, -195774272, 188039040, 163344592, 115923312, 110401064, 177253840, 254218576, 275298816, 254263680, 239107808, -239403632, 237804288, 225745632, 194518000, 136255152, 81283328, 85342072, 150444112, 207728240, 209318448, -186659280, 185007328, 195300752, 193707856, 193329904, 199881872, 165390064, 59089624, -47498580, }, +-4892505, -590021, 12164421, 38077032, 81775104, 124623304, 129460512, 85682984, 10402411, -102941240, +-257014064, -344556224, -196735264, 162329360, 421296576, 301453568, -81786376, -339304576, -270695136, -44466872, +89393304, 91300808, 71099960, 80839872, 84115320, 60540248, 34794068, 20905754, 6206228, -14057965, +-28276990, -31372052, -29687350, -27041114, -22638772, -17798882, -13996225, -9483288, -3846680, -10201, +1374390, 3223910, 6271726, 8032126, 7897908, 7853885, 8408472, 8438537, 8327405, 9541270, +12103755, 15187004, 18816252, 23058606, 27099096, 30406220, 33283312, 35678832, 37071472, 37647000, +38043748, 38136624, 37421512, 36086316, 34518116, 32481764, 29738354, 26662620, 23539106, 20119238, +16299401, 12321187, 8060580, 3009698, -2988760, -9727564, -17154100, -25212532, -33552822, -42001560, +-50826108, -60007136, -68805912, -76527192, -83177944, -89035208, -94018448, -97715872, -99669544, -99597608, +-97630512, -94253592, -89847496, -84563072, -78763792, -73134168, -68153616, -63880124, -60413008, -58128624, +-57258892, -57550952, -58465244, -59591596, -60923576, -62826244, -65579856, -68929392, -72264432, -75220984, +-77873128, -80420040, -82957832, -85422608, -87509960, -88818848, -89284856, -89289688, -89233312, -89199488, +-89014272, -88326000, -86707872, -84005800, -80527416, -76630272, -72300408, -67334352, -61617212, -55052352, +-47603808, -39574364, -31474058, -23550916, -15794742, -8280160, -1080184, 5948530, 12839268, 19225348, +24750822, 29457570, 33496986, 36922760, 39977556, 43079060, 46364172, 49711024, 53141092, 56701620, +60179472, 63440960, 66724464, 70176544, 73627552, 77124192, 80998248, 85179400, 89241368, 93158912, +97144104, 100919920, 104110544, 106969920, 109786344, 112219440, 114109224, 116018344, 118209312, 120240296, +122128472, 124492312, 127278136, 129930816, 132675296, 135856256, 138673760, 140493216, 142199920, 144359760, +145933328, 146609776, 147791440, 149669408, 150676576, 150927296, 152078352, 153518768, 153616480, 153758752, +155404272, 155954560, 154248912, 154691840, 158040832, 157198480, 151757840, 152642608, 159947808, 156843616, +142624592, 142603648, 158689376, 148107648, 94958504, 63685776, 117763168, 214589984, 256608720, 227827072, +195774272, 188039040, 163344592, 115923312, 110401064, 177253840, 254218576, 275298816, 254263680, 239107808, +239403632, 237804288, 225745632, 194518000, 136255152, 81283328, 85342072, 150444112, 207728240, 209318448, +186659280, 185007328, 195300752, 193707856, 193329904, 199881872, 165390064, 59089624, -47498580, }, { 3956202, -4892505, 590021, -12164421, -38077032, -81775104, -124623304, -129460512, -85682984, -10402411, 102941240, -257014064, 344556224, 196735264, -162329360, -421296576, -301453568, 81786376, 339304576, 270695136, 44466872, --89393304, -91300808, -71099960, -80839872, -84115320, -60540248, -34794068, -20905754, -6206228, 14057965, -28276990, 31372052, 29687350, 27041114, 22638772, 17798882, 13996225, 9483288, 3846680, 10201, --1374390, -3223910, -6271726, -8032126, -7897908, -7853885, -8408472, -8438537, -8327405, -9541270, --12103755, -15187004, -18816252, -23058606, -27099096, -30406220, -33283312, -35678832, -37071472, -37647000, --38043748, -38136624, -37421512, -36086316, -34518116, -32481764, -29738354, -26662620, -23539106, -20119238, --16299401, -12321187, -8060580, -3009698, 2988760, 9727564, 17154100, 25212532, 33552822, 42001560, -50826108, 60007136, 68805912, 76527192, 83177944, 89035208, 94018448, 97715872, 99669544, 99597608, -97630512, 94253592, 89847496, 84563072, 78763792, 73134168, 68153616, 63880124, 60413008, 58128624, -57258892, 57550952, 58465244, 59591596, 60923576, 62826244, 65579856, 68929392, 72264432, 75220984, -77873128, 80420040, 82957832, 85422608, 87509960, 88818848, 89284856, 89289688, 89233312, 89199488, -89014272, 88326000, 86707872, 84005800, 80527416, 76630272, 72300408, 67334352, 61617212, 55052352, -47603808, 39574364, 31474058, 23550916, 15794742, 8280160, 1080184, -5948530, -12839268, -19225348, --24750822, -29457570, -33496986, -36922760, -39977556, -43079060, -46364172, -49711024, -53141092, -56701620, --60179472, -63440960, -66724464, -70176544, -73627552, -77124192, -80998248, -85179400, -89241368, -93158912, --97144104, -100919920, -104110544, -106969920, -109786344, -112219440, -114109224, -116018344, -118209312, -120240296, --122128472, -124492312, -127278136, -129930816, -132675296, -135856256, -138673760, -140493216, -142199920, -144359760, --145933328, -146609776, -147791440, -149669408, -150676576, -150927296, -152078352, -153518768, -153616480, -153758752, --155404272, -155954560, -154248912, -154691840, -158040832, -157198480, -151757840, -152642608, -159947808, -156843616, --142624592, -142603648, -158689376, -148107648, -94958504, -63685776, -117763168, -214589984, -256608720, -227827072, --195774272, -188039040, -163344592, -115923312, -110401064, -177253840, -254218576, -275298816, -254263680, -239107808, --239403632, -237804288, -225745632, -194518000, -136255152, -81283328, -85342072, -150444112, -207728240, -209318448, --186659280, -185007328, -195300752, -193707856, -193329904, -199881872, -165390064, -59089624, 47498580, }, +4892505, 590021, -12164421, -38077032, -81775104, -124623304, -129460512, -85682984, -10402411, 102941240, +257014064, 344556224, 196735264, -162329360, -421296576, -301453568, 81786376, 339304576, 270695136, 44466872, +-89393304, -91300808, -71099960, -80839872, -84115320, -60540248, -34794068, -20905754, -6206228, 14057965, +28276990, 31372052, 29687350, 27041114, 22638772, 17798882, 13996225, 9483288, 3846680, 10201, +-1374390, -3223910, -6271726, -8032126, -7897908, -7853885, -8408472, -8438537, -8327405, -9541270, +-12103755, -15187004, -18816252, -23058606, -27099096, -30406220, -33283312, -35678832, -37071472, -37647000, +-38043748, -38136624, -37421512, -36086316, -34518116, -32481764, -29738354, -26662620, -23539106, -20119238, +-16299401, -12321187, -8060580, -3009698, 2988760, 9727564, 17154100, 25212532, 33552822, 42001560, +50826108, 60007136, 68805912, 76527192, 83177944, 89035208, 94018448, 97715872, 99669544, 99597608, +97630512, 94253592, 89847496, 84563072, 78763792, 73134168, 68153616, 63880124, 60413008, 58128624, +57258892, 57550952, 58465244, 59591596, 60923576, 62826244, 65579856, 68929392, 72264432, 75220984, +77873128, 80420040, 82957832, 85422608, 87509960, 88818848, 89284856, 89289688, 89233312, 89199488, +89014272, 88326000, 86707872, 84005800, 80527416, 76630272, 72300408, 67334352, 61617212, 55052352, +47603808, 39574364, 31474058, 23550916, 15794742, 8280160, 1080184, -5948530, -12839268, -19225348, +-24750822, -29457570, -33496986, -36922760, -39977556, -43079060, -46364172, -49711024, -53141092, -56701620, +-60179472, -63440960, -66724464, -70176544, -73627552, -77124192, -80998248, -85179400, -89241368, -93158912, +-97144104, -100919920, -104110544, -106969920, -109786344, -112219440, -114109224, -116018344, -118209312, -120240296, +-122128472, -124492312, -127278136, -129930816, -132675296, -135856256, -138673760, -140493216, -142199920, -144359760, +-145933328, -146609776, -147791440, -149669408, -150676576, -150927296, -152078352, -153518768, -153616480, -153758752, +-155404272, -155954560, -154248912, -154691840, -158040832, -157198480, -151757840, -152642608, -159947808, -156843616, +-142624592, -142603648, -158689376, -148107648, -94958504, -63685776, -117763168, -214589984, -256608720, -227827072, +-195774272, -188039040, -163344592, -115923312, -110401064, -177253840, -254218576, -275298816, -254263680, -239107808, +-239403632, -237804288, -225745632, -194518000, -136255152, -81283328, -85342072, -150444112, -207728240, -209318448, +-186659280, -185007328, -195300752, -193707856, -193329904, -199881872, -165390064, -59089624, 47498580, }, }, { { -1443109, -2916283, 6827925, 4448513, -10190347, -35941896, -50278496, -21301964, 45321568, 90000504, 62208844, --10385231, -52024400, -33970508, 263604, 7722888, -259846, 5224291, 19049790, 17630840, 2166811, --5846524, -1266479, 181999, -9330280, -18641232, -16736414, -6763500, 2556579, 8128763, 10948409, -10774462, 6565932, -1125818, -10446971, -19356344, -26142930, -30390652, -33340758, -36155572, -38265476, --38332048, -36147520, -32708860, -29106456, -26172456, -24637544, -24765856, -25979184, -27272506, -27890980, --27470610, -25853018, -23069880, -19397146, -15212237, -10771241, -6171868, -1490891, 3144453, 7651484, -12047920, 16274705, 20060182, 23145042, 25582436, 27581744, 29147258, 30173756, 30836254, 31517544, -32333588, 33101850, 33842196, 34967476, 36871756, 39647380, 43362528, 48338248, 54939612, 63217088, -72916736, 83794808, 95823944, 109095392, 123496952, 138459552, 153138672, 166951280, 179796992, 191547488, -201411424, 208091696, 210612304, 208791248, 202888880, 193053408, 179311120, 162035696, 142256832, 121402080, -100614976, 80314280, 60539712, 41757284, 25057376, 11293617, 126165, -9823127, -19814294, -30041686, --39722004, -47958140, -54550380, -60103772, -65415572, -70796096, -75989784, -80636936, -84662936, -88305064, --91958472, -95962456, -100363720, -104873976, -109146928, -113031192, -116513872, -119557928, -122106456, -124112208, --125511832, -126300496, -126655904, -126842736, -126988224, -127060704, -126995200, -126714424, -126185064, -125603096, --125345936, -125597728, -126224256, -127060168, -128004520, -128815736, -129247376, -129471256, -129961416, -130892888, --132046088, -133215392, -134260672, -134826544, -134499056, -133149888, -130776920, -127238408, -122458104, -116582592, --109666088, -101599600, -92521112, -82809120, -72629504, -62070868, -51628192, -41856068, -32731946, -24047522, --16039555, -8904004, -2273648, 4118337, 10006737, 15390478, 20740398, 25972740, 30525406, 34676492, -39222180, 43891344, 47938276, 51878372, 56495464, 61012696, 64582348, 68081136, 72005664, 75044352, -77184856, 80520440, 84550192, 86223080, 86974696, 91581584, 97592392, 97656816, 95367600, 101955544, -112541032, 109671992, 100214472, 116350128, 158572880, 173721760, 126094336, 58961312, 38272452, 60790968, -74576736, 71284648, 88594440, 124262528, 123211336, 68228776, 16135118, 13064754, 31056908, 25668336, -5967857, 2714419, 8382166, 107911, -6194417, 21946746, 71502616, 93503584, 71871984, 41361072, -33930240, 42570644, 46276124, 41583872, 36570036, 33631204, 31004296, 29609504, 29946122, }, +2916283, 6827925, 4448513, -10190347, -35941896, -50278496, -21301964, 45321568, 90000504, 62208844, +-10385231, -52024400, -33970508, 263604, 7722888, -259846, 5224291, 19049790, 17630840, 2166811, +-5846524, -1266479, 181999, -9330280, -18641232, -16736414, -6763500, 2556579, 8128763, 10948409, +10774462, 6565932, -1125818, -10446971, -19356344, -26142930, -30390652, -33340758, -36155572, -38265476, +-38332048, -36147520, -32708860, -29106456, -26172456, -24637544, -24765856, -25979184, -27272506, -27890980, +-27470610, -25853018, -23069880, -19397146, -15212237, -10771241, -6171868, -1490891, 3144453, 7651484, +12047920, 16274705, 20060182, 23145042, 25582436, 27581744, 29147258, 30173756, 30836254, 31517544, +32333588, 33101850, 33842196, 34967476, 36871756, 39647380, 43362528, 48338248, 54939612, 63217088, +72916736, 83794808, 95823944, 109095392, 123496952, 138459552, 153138672, 166951280, 179796992, 191547488, +201411424, 208091696, 210612304, 208791248, 202888880, 193053408, 179311120, 162035696, 142256832, 121402080, +100614976, 80314280, 60539712, 41757284, 25057376, 11293617, 126165, -9823127, -19814294, -30041686, +-39722004, -47958140, -54550380, -60103772, -65415572, -70796096, -75989784, -80636936, -84662936, -88305064, +-91958472, -95962456, -100363720, -104873976, -109146928, -113031192, -116513872, -119557928, -122106456, -124112208, +-125511832, -126300496, -126655904, -126842736, -126988224, -127060704, -126995200, -126714424, -126185064, -125603096, +-125345936, -125597728, -126224256, -127060168, -128004520, -128815736, -129247376, -129471256, -129961416, -130892888, +-132046088, -133215392, -134260672, -134826544, -134499056, -133149888, -130776920, -127238408, -122458104, -116582592, +-109666088, -101599600, -92521112, -82809120, -72629504, -62070868, -51628192, -41856068, -32731946, -24047522, +-16039555, -8904004, -2273648, 4118337, 10006737, 15390478, 20740398, 25972740, 30525406, 34676492, +39222180, 43891344, 47938276, 51878372, 56495464, 61012696, 64582348, 68081136, 72005664, 75044352, +77184856, 80520440, 84550192, 86223080, 86974696, 91581584, 97592392, 97656816, 95367600, 101955544, +112541032, 109671992, 100214472, 116350128, 158572880, 173721760, 126094336, 58961312, 38272452, 60790968, +74576736, 71284648, 88594440, 124262528, 123211336, 68228776, 16135118, 13064754, 31056908, 25668336, +5967857, 2714419, 8382166, 107911, -6194417, 21946746, 71502616, 93503584, 71871984, 41361072, +33930240, 42570644, 46276124, 41583872, 36570036, 33631204, 31004296, 29609504, 29946122, }, { 1443109, --2916283, -6827925, -4448513, 10190347, 35941896, 50278496, 21301964, -45321568, -90000504, -62208844, -10385231, 52024400, 33970508, -263604, -7722888, 259846, -5224291, -19049790, -17630840, -2166811, -5846524, 1266479, -181999, 9330280, 18641232, 16736414, 6763500, -2556579, -8128763, -10948409, --10774462, -6565932, 1125818, 10446971, 19356344, 26142930, 30390652, 33340758, 36155572, 38265476, -38332048, 36147520, 32708860, 29106456, 26172456, 24637544, 24765856, 25979184, 27272506, 27890980, -27470610, 25853018, 23069880, 19397146, 15212237, 10771241, 6171868, 1490891, -3144453, -7651484, --12047920, -16274705, -20060182, -23145042, -25582436, -27581744, -29147258, -30173756, -30836254, -31517544, --32333588, -33101850, -33842196, -34967476, -36871756, -39647380, -43362528, -48338248, -54939612, -63217088, --72916736, -83794808, -95823944, -109095392, -123496952, -138459552, -153138672, -166951280, -179796992, -191547488, --201411424, -208091696, -210612304, -208791248, -202888880, -193053408, -179311120, -162035696, -142256832, -121402080, --100614976, -80314280, -60539712, -41757284, -25057376, -11293617, -126165, 9823127, 19814294, 30041686, -39722004, 47958140, 54550380, 60103772, 65415572, 70796096, 75989784, 80636936, 84662936, 88305064, -91958472, 95962456, 100363720, 104873976, 109146928, 113031192, 116513872, 119557928, 122106456, 124112208, -125511832, 126300496, 126655904, 126842736, 126988224, 127060704, 126995200, 126714424, 126185064, 125603096, -125345936, 125597728, 126224256, 127060168, 128004520, 128815736, 129247376, 129471256, 129961416, 130892888, -132046088, 133215392, 134260672, 134826544, 134499056, 133149888, 130776920, 127238408, 122458104, 116582592, -109666088, 101599600, 92521112, 82809120, 72629504, 62070868, 51628192, 41856068, 32731946, 24047522, -16039555, 8904004, 2273648, -4118337, -10006737, -15390478, -20740398, -25972740, -30525406, -34676492, --39222180, -43891344, -47938276, -51878372, -56495464, -61012696, -64582348, -68081136, -72005664, -75044352, --77184856, -80520440, -84550192, -86223080, -86974696, -91581584, -97592392, -97656816, -95367600, -101955544, --112541032, -109671992, -100214472, -116350128, -158572880, -173721760, -126094336, -58961312, -38272452, -60790968, --74576736, -71284648, -88594440, -124262528, -123211336, -68228776, -16135118, -13064754, -31056908, -25668336, --5967857, -2714419, -8382166, -107911, 6194417, -21946746, -71502616, -93503584, -71871984, -41361072, --33930240, -42570644, -46276124, -41583872, -36570036, -33631204, -31004296, -29609504, -29946122, }, +-2916283, -6827925, -4448513, 10190347, 35941896, 50278496, 21301964, -45321568, -90000504, -62208844, +10385231, 52024400, 33970508, -263604, -7722888, 259846, -5224291, -19049790, -17630840, -2166811, +5846524, 1266479, -181999, 9330280, 18641232, 16736414, 6763500, -2556579, -8128763, -10948409, +-10774462, -6565932, 1125818, 10446971, 19356344, 26142930, 30390652, 33340758, 36155572, 38265476, +38332048, 36147520, 32708860, 29106456, 26172456, 24637544, 24765856, 25979184, 27272506, 27890980, +27470610, 25853018, 23069880, 19397146, 15212237, 10771241, 6171868, 1490891, -3144453, -7651484, +-12047920, -16274705, -20060182, -23145042, -25582436, -27581744, -29147258, -30173756, -30836254, -31517544, +-32333588, -33101850, -33842196, -34967476, -36871756, -39647380, -43362528, -48338248, -54939612, -63217088, +-72916736, -83794808, -95823944, -109095392, -123496952, -138459552, -153138672, -166951280, -179796992, -191547488, +-201411424, -208091696, -210612304, -208791248, -202888880, -193053408, -179311120, -162035696, -142256832, -121402080, +-100614976, -80314280, -60539712, -41757284, -25057376, -11293617, -126165, 9823127, 19814294, 30041686, +39722004, 47958140, 54550380, 60103772, 65415572, 70796096, 75989784, 80636936, 84662936, 88305064, +91958472, 95962456, 100363720, 104873976, 109146928, 113031192, 116513872, 119557928, 122106456, 124112208, +125511832, 126300496, 126655904, 126842736, 126988224, 127060704, 126995200, 126714424, 126185064, 125603096, +125345936, 125597728, 126224256, 127060168, 128004520, 128815736, 129247376, 129471256, 129961416, 130892888, +132046088, 133215392, 134260672, 134826544, 134499056, 133149888, 130776920, 127238408, 122458104, 116582592, +109666088, 101599600, 92521112, 82809120, 72629504, 62070868, 51628192, 41856068, 32731946, 24047522, +16039555, 8904004, 2273648, -4118337, -10006737, -15390478, -20740398, -25972740, -30525406, -34676492, +-39222180, -43891344, -47938276, -51878372, -56495464, -61012696, -64582348, -68081136, -72005664, -75044352, +-77184856, -80520440, -84550192, -86223080, -86974696, -91581584, -97592392, -97656816, -95367600, -101955544, +-112541032, -109671992, -100214472, -116350128, -158572880, -173721760, -126094336, -58961312, -38272452, -60790968, +-74576736, -71284648, -88594440, -124262528, -123211336, -68228776, -16135118, -13064754, -31056908, -25668336, +-5967857, -2714419, -8382166, -107911, 6194417, -21946746, -71502616, -93503584, -71871984, -41361072, +-33930240, -42570644, -46276124, -41583872, -36570036, -33631204, -31004296, -29609504, -29946122, }, }, { { -16855062, --9421548, 6735046, 14541149, -696858, -10459856, 31685584, 111822696, 141461184, 46983720, -137070128, --274288416, -233875472, -17981418, 207736288, 249013616, 80600432, -120410480, -170559600, -71937480, 34109020, -58366996, 33574832, 14930380, 994822, -26393648, -51163260, -50008452, -32954210, -25242060, -30743912, --35949412, -33978560, -26447872, -12712566, 8307541, 31826244, 51606180, 66345972, 77356120, 84789096, -89105000, 92007864, 94001264, 94112936, 92410520, 89962920, 86695528, 81840600, 75707392, 68811816, -60250876, 48849348, 34935800, 19663434, 3723737, -12246026, -27256400, -40934260, -53897008, -66593468, --78649440, -89627912, -99442992, -107755360, -113711408, -116477904, -115559320, -110695264, -101907760, -89489936, --73636144, -54377508, -32165010, -8080444, 16866874, 42273752, 67840616, 92708480, 115740240, 136301328, -154419104, 170198272, 183356448, 193434592, 200290976, 204173616, 205277424, 203442400, 198369504, 189873520, -177717696, 161489696, 141020416, 116809152, 89718648, 60403348, 29473140, -1858647, -31750008, -58535036, --81430432, -100451768, -115763328, -127038152, -133412960, -134269808, -130168648, -122766808, -113663088, -103536096, --92426088, -80411992, -67775656, -54875188, -42179264, -30258582, -19552302, -10249939, -2371359, 4298189, -10300405, 16173773, 21946210, 27116276, 31076772, 33417530, 34017752, 33116346, 31163746, 28391882, -24641302, 19670414, 13437879, 6062347, -2212445, -11009075, -20040854, -29295972, -38747584, -48046724, --56775708, -64774012, -71954120, -78098608, -83117280, -87159384, -90254440, -92231200, -93148712, -93386008, --93218504, -92764848, -92332136, -92295088, -92656400, -93204552, -93935768, -94896768, -95902328, -96840240, --97889280, -99085968, -100114616, -100798048, -101271032, -101534640, -101465384, -101275328, -101294120, -101381096, --101242040, -101033200, -100954280, -100668664, -99784440, -98339720, -96269008, -93179312, -89117888, -84647360, --79874040, -74464536, -68683504, -63166620, -57808648, -52207476, -46784004, -42070280, -37632504, -33078764, --29027536, -25747256, -22391812, -18797462, -15994995, -13892072, -11106249, -7990787, -6463389, -6082211, --4431870, -2181307, -2782602, -6077916, -7808251, -7052873, -8244190, -13497472, -18622442, -19725174, --18895708, -19746112, -20739324, -17023640, -8380018, -2305324, -6387690, -17554606, -23748484, -19843822, --15245523, -17352742, -15122043, 5159867, 31018790, 31144956, -3549254, -43825308, -55629492, -36705864, --11915850, -2823404, -9434433, -15443092, -8246874, 1931125, -11863237, -57452704, -101456256, }, +-9421548, 6735046, 14541149, -696858, -10459856, 31685584, 111822696, 141461184, 46983720, -137070128, +-274288416, -233875472, -17981418, 207736288, 249013616, 80600432, -120410480, -170559600, -71937480, 34109020, +58366996, 33574832, 14930380, 994822, -26393648, -51163260, -50008452, -32954210, -25242060, -30743912, +-35949412, -33978560, -26447872, -12712566, 8307541, 31826244, 51606180, 66345972, 77356120, 84789096, +89105000, 92007864, 94001264, 94112936, 92410520, 89962920, 86695528, 81840600, 75707392, 68811816, +60250876, 48849348, 34935800, 19663434, 3723737, -12246026, -27256400, -40934260, -53897008, -66593468, +-78649440, -89627912, -99442992, -107755360, -113711408, -116477904, -115559320, -110695264, -101907760, -89489936, +-73636144, -54377508, -32165010, -8080444, 16866874, 42273752, 67840616, 92708480, 115740240, 136301328, +154419104, 170198272, 183356448, 193434592, 200290976, 204173616, 205277424, 203442400, 198369504, 189873520, +177717696, 161489696, 141020416, 116809152, 89718648, 60403348, 29473140, -1858647, -31750008, -58535036, +-81430432, -100451768, -115763328, -127038152, -133412960, -134269808, -130168648, -122766808, -113663088, -103536096, +-92426088, -80411992, -67775656, -54875188, -42179264, -30258582, -19552302, -10249939, -2371359, 4298189, +10300405, 16173773, 21946210, 27116276, 31076772, 33417530, 34017752, 33116346, 31163746, 28391882, +24641302, 19670414, 13437879, 6062347, -2212445, -11009075, -20040854, -29295972, -38747584, -48046724, +-56775708, -64774012, -71954120, -78098608, -83117280, -87159384, -90254440, -92231200, -93148712, -93386008, +-93218504, -92764848, -92332136, -92295088, -92656400, -93204552, -93935768, -94896768, -95902328, -96840240, +-97889280, -99085968, -100114616, -100798048, -101271032, -101534640, -101465384, -101275328, -101294120, -101381096, +-101242040, -101033200, -100954280, -100668664, -99784440, -98339720, -96269008, -93179312, -89117888, -84647360, +-79874040, -74464536, -68683504, -63166620, -57808648, -52207476, -46784004, -42070280, -37632504, -33078764, +-29027536, -25747256, -22391812, -18797462, -15994995, -13892072, -11106249, -7990787, -6463389, -6082211, +-4431870, -2181307, -2782602, -6077916, -7808251, -7052873, -8244190, -13497472, -18622442, -19725174, +-18895708, -19746112, -20739324, -17023640, -8380018, -2305324, -6387690, -17554606, -23748484, -19843822, +-15245523, -17352742, -15122043, 5159867, 31018790, 31144956, -3549254, -43825308, -55629492, -36705864, +-11915850, -2823404, -9434433, -15443092, -8246874, 1931125, -11863237, -57452704, -101456256, }, { 16855062, -9421548, -6735046, -14541149, 696858, 10459856, -31685584, -111822696, -141461184, -46983720, 137070128, -274288416, 233875472, 17981418, -207736288, -249013616, -80600432, 120410480, 170559600, 71937480, -34109020, --58366996, -33574832, -14930380, -994822, 26393648, 51163260, 50008452, 32954210, 25242060, 30743912, -35949412, 33978560, 26447872, 12712566, -8307541, -31826244, -51606180, -66345972, -77356120, -84789096, --89105000, -92007864, -94001264, -94112936, -92410520, -89962920, -86695528, -81840600, -75707392, -68811816, --60250876, -48849348, -34935800, -19663434, -3723737, 12246026, 27256400, 40934260, 53897008, 66593468, -78649440, 89627912, 99442992, 107755360, 113711408, 116477904, 115559320, 110695264, 101907760, 89489936, -73636144, 54377508, 32165010, 8080444, -16866874, -42273752, -67840616, -92708480, -115740240, -136301328, --154419104, -170198272, -183356448, -193434592, -200290976, -204173616, -205277424, -203442400, -198369504, -189873520, --177717696, -161489696, -141020416, -116809152, -89718648, -60403348, -29473140, 1858647, 31750008, 58535036, -81430432, 100451768, 115763328, 127038152, 133412960, 134269808, 130168648, 122766808, 113663088, 103536096, -92426088, 80411992, 67775656, 54875188, 42179264, 30258582, 19552302, 10249939, 2371359, -4298189, --10300405, -16173773, -21946210, -27116276, -31076772, -33417530, -34017752, -33116346, -31163746, -28391882, --24641302, -19670414, -13437879, -6062347, 2212445, 11009075, 20040854, 29295972, 38747584, 48046724, -56775708, 64774012, 71954120, 78098608, 83117280, 87159384, 90254440, 92231200, 93148712, 93386008, -93218504, 92764848, 92332136, 92295088, 92656400, 93204552, 93935768, 94896768, 95902328, 96840240, -97889280, 99085968, 100114616, 100798048, 101271032, 101534640, 101465384, 101275328, 101294120, 101381096, -101242040, 101033200, 100954280, 100668664, 99784440, 98339720, 96269008, 93179312, 89117888, 84647360, -79874040, 74464536, 68683504, 63166620, 57808648, 52207476, 46784004, 42070280, 37632504, 33078764, -29027536, 25747256, 22391812, 18797462, 15994995, 13892072, 11106249, 7990787, 6463389, 6082211, -4431870, 2181307, 2782602, 6077916, 7808251, 7052873, 8244190, 13497472, 18622442, 19725174, -18895708, 19746112, 20739324, 17023640, 8380018, 2305324, 6387690, 17554606, 23748484, 19843822, -15245523, 17352742, 15122043, -5159867, -31018790, -31144956, 3549254, 43825308, 55629492, 36705864, -11915850, 2823404, 9434433, 15443092, 8246874, -1931125, 11863237, 57452704, 101456256, }, +9421548, -6735046, -14541149, 696858, 10459856, -31685584, -111822696, -141461184, -46983720, 137070128, +274288416, 233875472, 17981418, -207736288, -249013616, -80600432, 120410480, 170559600, 71937480, -34109020, +-58366996, -33574832, -14930380, -994822, 26393648, 51163260, 50008452, 32954210, 25242060, 30743912, +35949412, 33978560, 26447872, 12712566, -8307541, -31826244, -51606180, -66345972, -77356120, -84789096, +-89105000, -92007864, -94001264, -94112936, -92410520, -89962920, -86695528, -81840600, -75707392, -68811816, +-60250876, -48849348, -34935800, -19663434, -3723737, 12246026, 27256400, 40934260, 53897008, 66593468, +78649440, 89627912, 99442992, 107755360, 113711408, 116477904, 115559320, 110695264, 101907760, 89489936, +73636144, 54377508, 32165010, 8080444, -16866874, -42273752, -67840616, -92708480, -115740240, -136301328, +-154419104, -170198272, -183356448, -193434592, -200290976, -204173616, -205277424, -203442400, -198369504, -189873520, +-177717696, -161489696, -141020416, -116809152, -89718648, -60403348, -29473140, 1858647, 31750008, 58535036, +81430432, 100451768, 115763328, 127038152, 133412960, 134269808, 130168648, 122766808, 113663088, 103536096, +92426088, 80411992, 67775656, 54875188, 42179264, 30258582, 19552302, 10249939, 2371359, -4298189, +-10300405, -16173773, -21946210, -27116276, -31076772, -33417530, -34017752, -33116346, -31163746, -28391882, +-24641302, -19670414, -13437879, -6062347, 2212445, 11009075, 20040854, 29295972, 38747584, 48046724, +56775708, 64774012, 71954120, 78098608, 83117280, 87159384, 90254440, 92231200, 93148712, 93386008, +93218504, 92764848, 92332136, 92295088, 92656400, 93204552, 93935768, 94896768, 95902328, 96840240, +97889280, 99085968, 100114616, 100798048, 101271032, 101534640, 101465384, 101275328, 101294120, 101381096, +101242040, 101033200, 100954280, 100668664, 99784440, 98339720, 96269008, 93179312, 89117888, 84647360, +79874040, 74464536, 68683504, 63166620, 57808648, 52207476, 46784004, 42070280, 37632504, 33078764, +29027536, 25747256, 22391812, 18797462, 15994995, 13892072, 11106249, 7990787, 6463389, 6082211, +4431870, 2181307, 2782602, 6077916, 7808251, 7052873, 8244190, 13497472, 18622442, 19725174, +18895708, 19746112, 20739324, 17023640, 8380018, 2305324, 6387690, 17554606, 23748484, 19843822, +15245523, 17352742, 15122043, -5159867, -31018790, -31144956, 3549254, 43825308, 55629492, 36705864, +11915850, 2823404, 9434433, 15443092, 8246874, -1931125, 11863237, 57452704, 101456256, }, }, { { -10470057, --12942884, -12745852, -5259188, 8346732, 21582210, 26531086, 16127065, -12313134, -48213692, -65599184, --43744780, 4936528, 39658656, 33028836, -708133, -27792734, -34398928, -30497490, -23885386, -10569915, -9479530, 25550224, 31105226, 32856500, 38252052, 42853036, 36798208, 18005040, -6361384, -27448062, --39666708, -41641856, -36514200, -30181808, -26812408, -26179974, -25506200, -22668300, -17521320, -11483132, --6290517, -2583423, 323196, 3242700, 6392522, 9896678, 13967771, 18304076, 22140556, 25072408, -27159762, 28331752, 28344636, 27087822, 24391120, 19908784, 13641353, 6088653, -2334852, -11470784, --20963198, -30399242, -39853540, -49548892, -59197536, -68443528, -77530064, -86653648, -95127624, -101969504, --106768592, -109260744, -108752328, -104731704, -97443144, -87307560, -74422656, -59063316, -41965588, -23700166, --4328254, 16065862, 36932424, 57482768, 77115600, 95685432, 113377472, 129973760, 144324864, 155117568, -162090992, 165811504, 166406368, 163296272, 156047440, 144834880, 130329712, 113758648, 96646968, 79828408, -63017372, 45769856, 28480466, 12293807, -1440962, -11697343, -18540300, -23277112, -27110370, -29834454, --30441118, -28513752, -24380382, -18583786, -11894912, -5140539, 1609002, 9041980, 17504676, 26640072, -36108864, 45703820, 54845660, 62985696, 70323648, 77253040, 83527448, 88758720, 93038656, 96317864, -98002560, 97827544, 96204048, 93308168, 88845160, 82897704, 75859856, 67580776, 57710400, 46616500, -34867620, 22393422, 9161165, -4181151, -17242684, -30352534, -43362528, -55311124, -65827352, -75440560, --84275312, -92010544, -99078456, -106269840, -113417200, -119903136, -125755032, -130954624, -134836208, -137331584, --139376528, -141256640, -142338976, -142835584, -143646784, -144416128, -144120304, -143218368, -142758272, -142301392, --141159472, -140213504, -140188272, -140127600, -139490880, -139126880, -138788640, -136974560, -134036264, -131654704, --129288176, -125414120, -121233504, -118497072, -115775672, -111627272, -108029168, -106125960, -103531264, -99802688, --97849016, -96995392, -93625992, -89979568, -90543816, -90746752, -84661320, -79976584, -84875536, -87457344, --75802952, -67523328, -81065896, -89801864, -57851600, -15802258, -34449932, -114977888, -175820928, -169301712, --139757168, -133547176, -123692376, -75457208, -27874874, -44988708, -118811680, -179056112, -183894928, -155834832, --134097472, -124879392, -101552888, -41813656, 33384780, 63154808, 9710384, -84638776, -133886480, -106619880, --56604984, -45735496, -70000984, -82993800, -66955320, -50478212, -64196876, -103361608, -136314752, }, +-12942884, -12745852, -5259188, 8346732, 21582210, 26531086, 16127065, -12313134, -48213692, -65599184, +-43744780, 4936528, 39658656, 33028836, -708133, -27792734, -34398928, -30497490, -23885386, -10569915, +9479530, 25550224, 31105226, 32856500, 38252052, 42853036, 36798208, 18005040, -6361384, -27448062, +-39666708, -41641856, -36514200, -30181808, -26812408, -26179974, -25506200, -22668300, -17521320, -11483132, +-6290517, -2583423, 323196, 3242700, 6392522, 9896678, 13967771, 18304076, 22140556, 25072408, +27159762, 28331752, 28344636, 27087822, 24391120, 19908784, 13641353, 6088653, -2334852, -11470784, +-20963198, -30399242, -39853540, -49548892, -59197536, -68443528, -77530064, -86653648, -95127624, -101969504, +-106768592, -109260744, -108752328, -104731704, -97443144, -87307560, -74422656, -59063316, -41965588, -23700166, +-4328254, 16065862, 36932424, 57482768, 77115600, 95685432, 113377472, 129973760, 144324864, 155117568, +162090992, 165811504, 166406368, 163296272, 156047440, 144834880, 130329712, 113758648, 96646968, 79828408, +63017372, 45769856, 28480466, 12293807, -1440962, -11697343, -18540300, -23277112, -27110370, -29834454, +-30441118, -28513752, -24380382, -18583786, -11894912, -5140539, 1609002, 9041980, 17504676, 26640072, +36108864, 45703820, 54845660, 62985696, 70323648, 77253040, 83527448, 88758720, 93038656, 96317864, +98002560, 97827544, 96204048, 93308168, 88845160, 82897704, 75859856, 67580776, 57710400, 46616500, +34867620, 22393422, 9161165, -4181151, -17242684, -30352534, -43362528, -55311124, -65827352, -75440560, +-84275312, -92010544, -99078456, -106269840, -113417200, -119903136, -125755032, -130954624, -134836208, -137331584, +-139376528, -141256640, -142338976, -142835584, -143646784, -144416128, -144120304, -143218368, -142758272, -142301392, +-141159472, -140213504, -140188272, -140127600, -139490880, -139126880, -138788640, -136974560, -134036264, -131654704, +-129288176, -125414120, -121233504, -118497072, -115775672, -111627272, -108029168, -106125960, -103531264, -99802688, +-97849016, -96995392, -93625992, -89979568, -90543816, -90746752, -84661320, -79976584, -84875536, -87457344, +-75802952, -67523328, -81065896, -89801864, -57851600, -15802258, -34449932, -114977888, -175820928, -169301712, +-139757168, -133547176, -123692376, -75457208, -27874874, -44988708, -118811680, -179056112, -183894928, -155834832, +-134097472, -124879392, -101552888, -41813656, 33384780, 63154808, 9710384, -84638776, -133886480, -106619880, +-56604984, -45735496, -70000984, -82993800, -66955320, -50478212, -64196876, -103361608, -136314752, }, { -10470057, --12942884, -12745852, -5259188, 8346732, 21582210, 26531086, 16127065, -12313134, -48213692, -65599184, --43744780, 4936528, 39658656, 33028836, -708133, -27792734, -34398928, -30497490, -23885386, -10569915, -9479530, 25550224, 31105226, 32856500, 38252052, 42853036, 36798208, 18005040, -6361384, -27448062, --39666708, -41641856, -36514200, -30181808, -26812408, -26179974, -25506200, -22668300, -17521320, -11483132, --6290517, -2583423, 323196, 3242700, 6392522, 9896678, 13967771, 18304076, 22140556, 25072408, -27159762, 28331752, 28344636, 27087822, 24391120, 19908784, 13641353, 6088653, -2334852, -11470784, --20963198, -30399242, -39853540, -49548892, -59197536, -68443528, -77530064, -86653648, -95127624, -101969504, --106768592, -109260744, -108752328, -104731704, -97443144, -87307560, -74422656, -59063316, -41965588, -23700166, --4328254, 16065862, 36932424, 57482768, 77115600, 95685432, 113377472, 129973760, 144324864, 155117568, -162090992, 165811504, 166406368, 163296272, 156047440, 144834880, 130329712, 113758648, 96646968, 79828408, -63017372, 45769856, 28480466, 12293807, -1440962, -11697343, -18540300, -23277112, -27110370, -29834454, --30441118, -28513752, -24380382, -18583786, -11894912, -5140539, 1609002, 9041980, 17504676, 26640072, -36108864, 45703820, 54845660, 62985696, 70323648, 77253040, 83527448, 88758720, 93038656, 96317864, -98002560, 97827544, 96204048, 93308168, 88845160, 82897704, 75859856, 67580776, 57710400, 46616500, -34867620, 22393422, 9161165, -4181151, -17242684, -30352534, -43362528, -55311124, -65827352, -75440560, --84275312, -92010544, -99078456, -106269840, -113417200, -119903136, -125755032, -130954624, -134836208, -137331584, --139376528, -141256640, -142338976, -142835584, -143646784, -144416128, -144120304, -143218368, -142758272, -142301392, --141159472, -140213504, -140188272, -140127600, -139490880, -139126880, -138788640, -136974560, -134036264, -131654704, --129288176, -125414120, -121233504, -118497072, -115775672, -111627272, -108029168, -106125960, -103531264, -99802688, --97849016, -96995392, -93625992, -89979568, -90543816, -90746752, -84661320, -79976584, -84875536, -87457344, --75802952, -67523328, -81065896, -89801864, -57851600, -15802258, -34449932, -114977888, -175820928, -169301712, --139757168, -133547176, -123692376, -75457208, -27874874, -44988708, -118811680, -179056112, -183894928, -155834832, --134097472, -124879392, -101552888, -41813656, 33384780, 63154808, 9710384, -84638776, -133886480, -106619880, --56604984, -45735496, -70000984, -82993800, -66955320, -50478212, -64196876, -103361608, -136314752, }, +-12942884, -12745852, -5259188, 8346732, 21582210, 26531086, 16127065, -12313134, -48213692, -65599184, +-43744780, 4936528, 39658656, 33028836, -708133, -27792734, -34398928, -30497490, -23885386, -10569915, +9479530, 25550224, 31105226, 32856500, 38252052, 42853036, 36798208, 18005040, -6361384, -27448062, +-39666708, -41641856, -36514200, -30181808, -26812408, -26179974, -25506200, -22668300, -17521320, -11483132, +-6290517, -2583423, 323196, 3242700, 6392522, 9896678, 13967771, 18304076, 22140556, 25072408, +27159762, 28331752, 28344636, 27087822, 24391120, 19908784, 13641353, 6088653, -2334852, -11470784, +-20963198, -30399242, -39853540, -49548892, -59197536, -68443528, -77530064, -86653648, -95127624, -101969504, +-106768592, -109260744, -108752328, -104731704, -97443144, -87307560, -74422656, -59063316, -41965588, -23700166, +-4328254, 16065862, 36932424, 57482768, 77115600, 95685432, 113377472, 129973760, 144324864, 155117568, +162090992, 165811504, 166406368, 163296272, 156047440, 144834880, 130329712, 113758648, 96646968, 79828408, +63017372, 45769856, 28480466, 12293807, -1440962, -11697343, -18540300, -23277112, -27110370, -29834454, +-30441118, -28513752, -24380382, -18583786, -11894912, -5140539, 1609002, 9041980, 17504676, 26640072, +36108864, 45703820, 54845660, 62985696, 70323648, 77253040, 83527448, 88758720, 93038656, 96317864, +98002560, 97827544, 96204048, 93308168, 88845160, 82897704, 75859856, 67580776, 57710400, 46616500, +34867620, 22393422, 9161165, -4181151, -17242684, -30352534, -43362528, -55311124, -65827352, -75440560, +-84275312, -92010544, -99078456, -106269840, -113417200, -119903136, -125755032, -130954624, -134836208, -137331584, +-139376528, -141256640, -142338976, -142835584, -143646784, -144416128, -144120304, -143218368, -142758272, -142301392, +-141159472, -140213504, -140188272, -140127600, -139490880, -139126880, -138788640, -136974560, -134036264, -131654704, +-129288176, -125414120, -121233504, -118497072, -115775672, -111627272, -108029168, -106125960, -103531264, -99802688, +-97849016, -96995392, -93625992, -89979568, -90543816, -90746752, -84661320, -79976584, -84875536, -87457344, +-75802952, -67523328, -81065896, -89801864, -57851600, -15802258, -34449932, -114977888, -175820928, -169301712, +-139757168, -133547176, -123692376, -75457208, -27874874, -44988708, -118811680, -179056112, -183894928, -155834832, +-134097472, -124879392, -101552888, -41813656, 33384780, 63154808, 9710384, -84638776, -133886480, -106619880, +-56604984, -45735496, -70000984, -82993800, -66955320, -50478212, -64196876, -103361608, -136314752, }, }, { { -10983842, --13006235, -3929358, 17680232, 37721088, 46443092, 40728100, 10941429, -45254996, -94501088, -86430848, --14913200, 62980328, 84985056, 45491220, -10434086, -37785512, -24608016, 9770514, 33019172, 23539642, --11264625, -42012296, -46957416, -29937532, -7779797, 9924596, 23110682, 32777042, 39185672, 44401908, -49861348, 53220552, 51618528, 46033996, 39414916, 32559610, 24599962, 15992311, 8638253, 3759707, -1116155, -229781, -1309428, -3022046, -5972152, -10582263, -17145510, -25346750, -33986076, -41676216, --47652124, -51702280, -53836880, -54471460, -54538568, -54916524, -55923160, -57564372, -59957208, -63242856, --67312336, -71798432, -76145472, -79616344, -81476064, -81290312, -78923248, -74315280, -67587752, -59334972, --50400368, -41213968, -31722628, -22126060, -13195213, -5475010, 1385127, 7913477, 13701483, 17743584, -19851876, 20965882, 21868900, 22339736, 22064320, 21849572, 23214298, 26851598, 31973884, 37264212, -42150272, 47022376, 52471616, 58609660, 65099892, 71545568, 77639584, 83133920, 88036632, 92906048, -98628016, 105656736, 113549808, 121376312, 128510256, 134914592, 140710640, 145655232, 149133072, 150623424, -150069920, 147765136, 143911472, 138366128, 130764576, 120871656, 108866144, 95364384, 81130320, 66660576, -52002928, 36966248, 21507048, 5965710, -8986682, -22654342, -34726420, -45481556, -55559696, -65417720, --74898328, -83278880, -89790048, -94177360, -96808024, -98299992, -99149320, -99631968, -99754376, -99183680, --97453880, -94422712, -90353760, -85500984, -79889616, -73622184, -67088464, -60686816, -54556284, -48695264, --43115028, -37770480, -32540820, -27353036, -22235046, -17331266, -12957379, -9450002, -6832219, -4832912, --3287798, -2183454, -1323924, -408559, 513785, 1160178, 1595044, 2214056, 3241090, 4732517, -6899865, 9940165, 13769128, 18282066, 23430120, 28734404, 33386392, 37118716, 40237400, 42695732, -44135084, 44812616, 45314052, 45488000, 44896368, 43860208, 42726872, 40971840, 38429220, 36053568, -34061776, 31361314, 28194312, 26342646, 25353728, 22824530, 19765976, 19673634, 20761336, 17531520, -12257300, 13286481, 17734456, 11180337, -6809671, -14278082, 1575179, 21179020, 20340966, 6315750, -2094870, 6956237, 2289218, -9325985, -3779571, 22872312, 43185360, 38782480, 25930866, 26627186, -36120140, 37453188, 31576062, 30486214, 29011430, 7890929, -32850594, -64304788, -62836444, -39954472, --24018530, -21896818, -18189186, -8540542, -7630010, -15991774, -5650030, 39217348, 85677616, }, +-13006235, -3929358, 17680232, 37721088, 46443092, 40728100, 10941429, -45254996, -94501088, -86430848, +-14913200, 62980328, 84985056, 45491220, -10434086, -37785512, -24608016, 9770514, 33019172, 23539642, +-11264625, -42012296, -46957416, -29937532, -7779797, 9924596, 23110682, 32777042, 39185672, 44401908, +49861348, 53220552, 51618528, 46033996, 39414916, 32559610, 24599962, 15992311, 8638253, 3759707, +1116155, -229781, -1309428, -3022046, -5972152, -10582263, -17145510, -25346750, -33986076, -41676216, +-47652124, -51702280, -53836880, -54471460, -54538568, -54916524, -55923160, -57564372, -59957208, -63242856, +-67312336, -71798432, -76145472, -79616344, -81476064, -81290312, -78923248, -74315280, -67587752, -59334972, +-50400368, -41213968, -31722628, -22126060, -13195213, -5475010, 1385127, 7913477, 13701483, 17743584, +19851876, 20965882, 21868900, 22339736, 22064320, 21849572, 23214298, 26851598, 31973884, 37264212, +42150272, 47022376, 52471616, 58609660, 65099892, 71545568, 77639584, 83133920, 88036632, 92906048, +98628016, 105656736, 113549808, 121376312, 128510256, 134914592, 140710640, 145655232, 149133072, 150623424, +150069920, 147765136, 143911472, 138366128, 130764576, 120871656, 108866144, 95364384, 81130320, 66660576, +52002928, 36966248, 21507048, 5965710, -8986682, -22654342, -34726420, -45481556, -55559696, -65417720, +-74898328, -83278880, -89790048, -94177360, -96808024, -98299992, -99149320, -99631968, -99754376, -99183680, +-97453880, -94422712, -90353760, -85500984, -79889616, -73622184, -67088464, -60686816, -54556284, -48695264, +-43115028, -37770480, -32540820, -27353036, -22235046, -17331266, -12957379, -9450002, -6832219, -4832912, +-3287798, -2183454, -1323924, -408559, 513785, 1160178, 1595044, 2214056, 3241090, 4732517, +6899865, 9940165, 13769128, 18282066, 23430120, 28734404, 33386392, 37118716, 40237400, 42695732, +44135084, 44812616, 45314052, 45488000, 44896368, 43860208, 42726872, 40971840, 38429220, 36053568, +34061776, 31361314, 28194312, 26342646, 25353728, 22824530, 19765976, 19673634, 20761336, 17531520, +12257300, 13286481, 17734456, 11180337, -6809671, -14278082, 1575179, 21179020, 20340966, 6315750, +2094870, 6956237, 2289218, -9325985, -3779571, 22872312, 43185360, 38782480, 25930866, 26627186, +36120140, 37453188, 31576062, 30486214, 29011430, 7890929, -32850594, -64304788, -62836444, -39954472, +-24018530, -21896818, -18189186, -8540542, -7630010, -15991774, -5650030, 39217348, 85677616, }, { -10983842, --13006235, -3929358, 17680232, 37721088, 46443092, 40728100, 10941429, -45254996, -94501088, -86430848, --14913200, 62980328, 84985056, 45491220, -10434086, -37785512, -24608016, 9770514, 33019172, 23539642, --11264625, -42012296, -46957416, -29937532, -7779797, 9924596, 23110682, 32777042, 39185672, 44401908, -49861348, 53220552, 51618528, 46033996, 39414916, 32559610, 24599962, 15992311, 8638253, 3759707, -1116155, -229781, -1309428, -3022046, -5972152, -10582263, -17145510, -25346750, -33986076, -41676216, --47652124, -51702280, -53836880, -54471460, -54538568, -54916524, -55923160, -57564372, -59957208, -63242856, --67312336, -71798432, -76145472, -79616344, -81476064, -81290312, -78923248, -74315280, -67587752, -59334972, --50400368, -41213968, -31722628, -22126060, -13195213, -5475010, 1385127, 7913477, 13701483, 17743584, -19851876, 20965882, 21868900, 22339736, 22064320, 21849572, 23214298, 26851598, 31973884, 37264212, -42150272, 47022376, 52471616, 58609660, 65099892, 71545568, 77639584, 83133920, 88036632, 92906048, -98628016, 105656736, 113549808, 121376312, 128510256, 134914592, 140710640, 145655232, 149133072, 150623424, -150069920, 147765136, 143911472, 138366128, 130764576, 120871656, 108866144, 95364384, 81130320, 66660576, -52002928, 36966248, 21507048, 5965710, -8986682, -22654342, -34726420, -45481556, -55559696, -65417720, --74898328, -83278880, -89790048, -94177360, -96808024, -98299992, -99149320, -99631968, -99754376, -99183680, --97453880, -94422712, -90353760, -85500984, -79889616, -73622184, -67088464, -60686816, -54556284, -48695264, --43115028, -37770480, -32540820, -27353036, -22235046, -17331266, -12957379, -9450002, -6832219, -4832912, --3287798, -2183454, -1323924, -408559, 513785, 1160178, 1595044, 2214056, 3241090, 4732517, -6899865, 9940165, 13769128, 18282066, 23430120, 28734404, 33386392, 37118716, 40237400, 42695732, -44135084, 44812616, 45314052, 45488000, 44896368, 43860208, 42726872, 40971840, 38429220, 36053568, -34061776, 31361314, 28194312, 26342646, 25353728, 22824530, 19765976, 19673634, 20761336, 17531520, -12257300, 13286481, 17734456, 11180337, -6809671, -14278082, 1575179, 21179020, 20340966, 6315750, -2094870, 6956237, 2289218, -9325985, -3779571, 22872312, 43185360, 38782480, 25930866, 26627186, -36120140, 37453188, 31576062, 30486214, 29011430, 7890929, -32850594, -64304788, -62836444, -39954472, --24018530, -21896818, -18189186, -8540542, -7630010, -15991774, -5650030, 39217348, 85677616, }, +-13006235, -3929358, 17680232, 37721088, 46443092, 40728100, 10941429, -45254996, -94501088, -86430848, +-14913200, 62980328, 84985056, 45491220, -10434086, -37785512, -24608016, 9770514, 33019172, 23539642, +-11264625, -42012296, -46957416, -29937532, -7779797, 9924596, 23110682, 32777042, 39185672, 44401908, +49861348, 53220552, 51618528, 46033996, 39414916, 32559610, 24599962, 15992311, 8638253, 3759707, +1116155, -229781, -1309428, -3022046, -5972152, -10582263, -17145510, -25346750, -33986076, -41676216, +-47652124, -51702280, -53836880, -54471460, -54538568, -54916524, -55923160, -57564372, -59957208, -63242856, +-67312336, -71798432, -76145472, -79616344, -81476064, -81290312, -78923248, -74315280, -67587752, -59334972, +-50400368, -41213968, -31722628, -22126060, -13195213, -5475010, 1385127, 7913477, 13701483, 17743584, +19851876, 20965882, 21868900, 22339736, 22064320, 21849572, 23214298, 26851598, 31973884, 37264212, +42150272, 47022376, 52471616, 58609660, 65099892, 71545568, 77639584, 83133920, 88036632, 92906048, +98628016, 105656736, 113549808, 121376312, 128510256, 134914592, 140710640, 145655232, 149133072, 150623424, +150069920, 147765136, 143911472, 138366128, 130764576, 120871656, 108866144, 95364384, 81130320, 66660576, +52002928, 36966248, 21507048, 5965710, -8986682, -22654342, -34726420, -45481556, -55559696, -65417720, +-74898328, -83278880, -89790048, -94177360, -96808024, -98299992, -99149320, -99631968, -99754376, -99183680, +-97453880, -94422712, -90353760, -85500984, -79889616, -73622184, -67088464, -60686816, -54556284, -48695264, +-43115028, -37770480, -32540820, -27353036, -22235046, -17331266, -12957379, -9450002, -6832219, -4832912, +-3287798, -2183454, -1323924, -408559, 513785, 1160178, 1595044, 2214056, 3241090, 4732517, +6899865, 9940165, 13769128, 18282066, 23430120, 28734404, 33386392, 37118716, 40237400, 42695732, +44135084, 44812616, 45314052, 45488000, 44896368, 43860208, 42726872, 40971840, 38429220, 36053568, +34061776, 31361314, 28194312, 26342646, 25353728, 22824530, 19765976, 19673634, 20761336, 17531520, +12257300, 13286481, 17734456, 11180337, -6809671, -14278082, 1575179, 21179020, 20340966, 6315750, +2094870, 6956237, 2289218, -9325985, -3779571, 22872312, 43185360, 38782480, 25930866, 26627186, +36120140, 37453188, 31576062, 30486214, 29011430, 7890929, -32850594, -64304788, -62836444, -39954472, +-24018530, -21896818, -18189186, -8540542, -7630010, -15991774, -5650030, 39217348, 85677616, }, }, { { 10324028, -2917894, -896574, -694711, -5630166, -7763691, 16464220, 60774860, 69673496, 7516, -103573136, --135416560, -49716392, 73525544, 113157352, 43390444, -47776680, -72686416, -36822904, -2836826, 1784022, -4785668, 31545998, 67513664, 85577224, 83043192, 75681080, 70517992, 60548840, 39773008, 10974178, --19559818, -46844136, -67238248, -79171280, -84281216, -85352808, -83596168, -79180408, -72855528, -65625488, --58138288, -51459076, -47203300, -46050104, -47078212, -48954036, -50823420, -51943872, -51584168, -49573588, --46244448, -41780904, -36245764, -30135102, -24321326, -19505594, -16079284, -14329622, -14419816, -16262357, --19583978, -24019068, -29147258, -34573948, -39960376, -44920528, -49046916, -52075404, -53814328, -53897008, --51870320, -47521664, -40890772, -32073206, -21276194, -8932458, 4456566, 18388902, 32183800, 45177152, -57294328, 68956776, 80292264, 90978144, 100936560, 110481592, 119705032, 128622456, 138112720, 149675856, -163716096, 178787136, 193075424, 206050512, 218157488, 229284688, 238077024, 242689280, 241976848, 235966576, -225290896, 210357840, 191294080, 168584976, 143340240, 116700168, 89182312, 60728152, 31309238, 1509144, --27413166, -54177792, -78366512, -100525856, -121310816, -140697216, -158071984, -172816592, -184749088, -194308080, --202391744, -209771568, -216545808, -222269920, -226527312, -229223472, -230488352, -230473312, -229108592, -225995808, --220735552, -213378800, -204309440, -193762080, -181724896, -168168912, -153010896, -136079056, -117541984, -98166848, --78799768, -59817620, -41325640, -23476292, -6266894, 10496363, 26674968, 41643468, 54920820, 66607964, -77071040, 86648280, 95760592, 104841760, 113982528, 122839288, 130839200, 137375072, 142081280, 145099024, -146820240, 147379648, 146776752, 145286928, 143180256, 140241424, 136197168, 131337952, 126123864, 120605904, -114806088, 109120624, 103819024, 98736464, 93811216, 89157080, 84482008, 79365088, 74079592, 69140920, -64355788, 59411208, 54780696, 50856172, 47135656, 43397424, 40339944, 38064148, 35719096, 33387466, -31977106, 30885110, 28834262, 26812944, 26247082, 25228638, 21756156, 18828062, 19435264, 19375134, -14382235, 10659035, 15308874, 19550154, 8751533, -11116986, -16849156, -1181116, 17405354, 23600308, -23253490, 24434606, 22022982, 13565654, 11261941, 23040888, 37060736, 39835820, 36630164, 39961988, -50042276, 60002840, 68639480, 74309376, 68069328, 48506288, 33592012, 40907416, 62417684, 74914432, -71076880, 64213520, 64415920, 66957468, 67494336, 74431248, 97751848, 132080984, 157776160, }, +2917894, -896574, -694711, -5630166, -7763691, 16464220, 60774860, 69673496, 7516, -103573136, +-135416560, -49716392, 73525544, 113157352, 43390444, -47776680, -72686416, -36822904, -2836826, 1784022, +4785668, 31545998, 67513664, 85577224, 83043192, 75681080, 70517992, 60548840, 39773008, 10974178, +-19559818, -46844136, -67238248, -79171280, -84281216, -85352808, -83596168, -79180408, -72855528, -65625488, +-58138288, -51459076, -47203300, -46050104, -47078212, -48954036, -50823420, -51943872, -51584168, -49573588, +-46244448, -41780904, -36245764, -30135102, -24321326, -19505594, -16079284, -14329622, -14419816, -16262357, +-19583978, -24019068, -29147258, -34573948, -39960376, -44920528, -49046916, -52075404, -53814328, -53897008, +-51870320, -47521664, -40890772, -32073206, -21276194, -8932458, 4456566, 18388902, 32183800, 45177152, +57294328, 68956776, 80292264, 90978144, 100936560, 110481592, 119705032, 128622456, 138112720, 149675856, +163716096, 178787136, 193075424, 206050512, 218157488, 229284688, 238077024, 242689280, 241976848, 235966576, +225290896, 210357840, 191294080, 168584976, 143340240, 116700168, 89182312, 60728152, 31309238, 1509144, +-27413166, -54177792, -78366512, -100525856, -121310816, -140697216, -158071984, -172816592, -184749088, -194308080, +-202391744, -209771568, -216545808, -222269920, -226527312, -229223472, -230488352, -230473312, -229108592, -225995808, +-220735552, -213378800, -204309440, -193762080, -181724896, -168168912, -153010896, -136079056, -117541984, -98166848, +-78799768, -59817620, -41325640, -23476292, -6266894, 10496363, 26674968, 41643468, 54920820, 66607964, +77071040, 86648280, 95760592, 104841760, 113982528, 122839288, 130839200, 137375072, 142081280, 145099024, +146820240, 147379648, 146776752, 145286928, 143180256, 140241424, 136197168, 131337952, 126123864, 120605904, +114806088, 109120624, 103819024, 98736464, 93811216, 89157080, 84482008, 79365088, 74079592, 69140920, +64355788, 59411208, 54780696, 50856172, 47135656, 43397424, 40339944, 38064148, 35719096, 33387466, +31977106, 30885110, 28834262, 26812944, 26247082, 25228638, 21756156, 18828062, 19435264, 19375134, +14382235, 10659035, 15308874, 19550154, 8751533, -11116986, -16849156, -1181116, 17405354, 23600308, +23253490, 24434606, 22022982, 13565654, 11261941, 23040888, 37060736, 39835820, 36630164, 39961988, +50042276, 60002840, 68639480, 74309376, 68069328, 48506288, 33592012, 40907416, 62417684, 74914432, +71076880, 64213520, 64415920, 66957468, 67494336, 74431248, 97751848, 132080984, 157776160, }, { 10324028, -2917894, -896574, -694711, -5630166, -7763691, 16464220, 60774860, 69673496, 7516, -103573136, --135416560, -49716392, 73525544, 113157352, 43390444, -47776680, -72686416, -36822904, -2836826, 1784022, -4785668, 31545998, 67513664, 85577224, 83043192, 75681080, 70517992, 60548840, 39773008, 10974178, --19559818, -46844136, -67238248, -79171280, -84281216, -85352808, -83596168, -79180408, -72855528, -65625488, --58138288, -51459076, -47203300, -46050104, -47078212, -48954036, -50823420, -51943872, -51584168, -49573588, --46244448, -41780904, -36245764, -30135102, -24321326, -19505594, -16079284, -14329622, -14419816, -16262357, --19583978, -24019068, -29147258, -34573948, -39960376, -44920528, -49046916, -52075404, -53814328, -53897008, --51870320, -47521664, -40890772, -32073206, -21276194, -8932458, 4456566, 18388902, 32183800, 45177152, -57294328, 68956776, 80292264, 90978144, 100936560, 110481592, 119705032, 128622456, 138112720, 149675856, -163716096, 178787136, 193075424, 206050512, 218157488, 229284688, 238077024, 242689280, 241976848, 235966576, -225290896, 210357840, 191294080, 168584976, 143340240, 116700168, 89182312, 60728152, 31309238, 1509144, --27413166, -54177792, -78366512, -100525856, -121310816, -140697216, -158071984, -172816592, -184749088, -194308080, --202391744, -209771568, -216545808, -222269920, -226527312, -229223472, -230488352, -230473312, -229108592, -225995808, --220735552, -213378800, -204309440, -193762080, -181724896, -168168912, -153010896, -136079056, -117541984, -98166848, --78799768, -59817620, -41325640, -23476292, -6266894, 10496363, 26674968, 41643468, 54920820, 66607964, -77071040, 86648280, 95760592, 104841760, 113982528, 122839288, 130839200, 137375072, 142081280, 145099024, -146820240, 147379648, 146776752, 145286928, 143180256, 140241424, 136197168, 131337952, 126123864, 120605904, -114806088, 109120624, 103819024, 98736464, 93811216, 89157080, 84482008, 79365088, 74079592, 69140920, -64355788, 59411208, 54780696, 50856172, 47135656, 43397424, 40339944, 38064148, 35719096, 33387466, -31977106, 30885110, 28834262, 26812944, 26247082, 25228638, 21756156, 18828062, 19435264, 19375134, -14382235, 10659035, 15308874, 19550154, 8751533, -11116986, -16849156, -1181116, 17405354, 23600308, -23253490, 24434606, 22022982, 13565654, 11261941, 23040888, 37060736, 39835820, 36630164, 39961988, -50042276, 60002840, 68639480, 74309376, 68069328, 48506288, 33592012, 40907416, 62417684, 74914432, -71076880, 64213520, 64415920, 66957468, 67494336, 74431248, 97751848, 132080984, 157776160, }, +2917894, -896574, -694711, -5630166, -7763691, 16464220, 60774860, 69673496, 7516, -103573136, +-135416560, -49716392, 73525544, 113157352, 43390444, -47776680, -72686416, -36822904, -2836826, 1784022, +4785668, 31545998, 67513664, 85577224, 83043192, 75681080, 70517992, 60548840, 39773008, 10974178, +-19559818, -46844136, -67238248, -79171280, -84281216, -85352808, -83596168, -79180408, -72855528, -65625488, +-58138288, -51459076, -47203300, -46050104, -47078212, -48954036, -50823420, -51943872, -51584168, -49573588, +-46244448, -41780904, -36245764, -30135102, -24321326, -19505594, -16079284, -14329622, -14419816, -16262357, +-19583978, -24019068, -29147258, -34573948, -39960376, -44920528, -49046916, -52075404, -53814328, -53897008, +-51870320, -47521664, -40890772, -32073206, -21276194, -8932458, 4456566, 18388902, 32183800, 45177152, +57294328, 68956776, 80292264, 90978144, 100936560, 110481592, 119705032, 128622456, 138112720, 149675856, +163716096, 178787136, 193075424, 206050512, 218157488, 229284688, 238077024, 242689280, 241976848, 235966576, +225290896, 210357840, 191294080, 168584976, 143340240, 116700168, 89182312, 60728152, 31309238, 1509144, +-27413166, -54177792, -78366512, -100525856, -121310816, -140697216, -158071984, -172816592, -184749088, -194308080, +-202391744, -209771568, -216545808, -222269920, -226527312, -229223472, -230488352, -230473312, -229108592, -225995808, +-220735552, -213378800, -204309440, -193762080, -181724896, -168168912, -153010896, -136079056, -117541984, -98166848, +-78799768, -59817620, -41325640, -23476292, -6266894, 10496363, 26674968, 41643468, 54920820, 66607964, +77071040, 86648280, 95760592, 104841760, 113982528, 122839288, 130839200, 137375072, 142081280, 145099024, +146820240, 147379648, 146776752, 145286928, 143180256, 140241424, 136197168, 131337952, 126123864, 120605904, +114806088, 109120624, 103819024, 98736464, 93811216, 89157080, 84482008, 79365088, 74079592, 69140920, +64355788, 59411208, 54780696, 50856172, 47135656, 43397424, 40339944, 38064148, 35719096, 33387466, +31977106, 30885110, 28834262, 26812944, 26247082, 25228638, 21756156, 18828062, 19435264, 19375134, +14382235, 10659035, 15308874, 19550154, 8751533, -11116986, -16849156, -1181116, 17405354, 23600308, +23253490, 24434606, 22022982, 13565654, 11261941, 23040888, 37060736, 39835820, 36630164, 39961988, +50042276, 60002840, 68639480, 74309376, 68069328, 48506288, 33592012, 40907416, 62417684, 74914432, +71076880, 64213520, 64415920, 66957468, 67494336, 74431248, 97751848, 132080984, 157776160, }, }, { { -2374580, --1975685, -1382443, -914828, -1770600, -5363341, -9013526, -5036386, 7479149, 10615012, -15942919, --56564184, -57993868, 7053947, 85042496, 88171384, 2945811, -83288008, -83608520, -10362145, 53223236, -56314536, 20531554, -10377178, -20672214, -16948478, -3994320, 16381005, 36971080, 49690624, 53488984, -51806432, 47150152, 41786272, 38687456, 38138772, 36497020, 30347702, 19595252, 5913633, -9071508, --23396298, -34890168, -42566348, -46789912, -48198660, -47502340, -45899240, -44558676, -43887048, -43898324, --44784696, -46591268, -48833780, -50869056, -52300892, -52907556, -52671332, -51987356, -51447804, -51408612, --52043192, -53603876, -56228100, -59635620, -63368484, -67205504, -71101576, -74897784, -78367048, -81413256, --83995064, -85938000, -87039120, -87366616, -87256016, -86901144, -86133960, -84820776, -83342768, -82242184, --81369232, -79879952, -77301896, -74104288, -70828304, -67064304, -61832496, -54830088, -46868292, -39093328, --32087700, -25779468, -20059644, -15351824, -12449500, -11724724, -12670690, -14439680, -16755741, -20076288, --24864640, -30848602, -36961416, -41910292, -44918916, -46094124, -46125800, -45565308, -44384192, -42154032, --38555920, -33717104, -28170690, -22527640, -17147656, -12047383, -7031935, -1874216, 3546569, 9167071, -14823006, 20462834, 26199838, 32102734, 38029252, 43714716, 48913236, 53425636, 57149372, 60168732, -62699008, 64918968, 66953172, 68969656, 71169216, 73711840, 76739792, 80424336, 84902376, 90224376, -96379064, 103264976, 110630304, 118148104, 125512904, 132400416, 138475120, 143570016, 147709824, 150860192, -152853584, 153623456, 153249264, 151710592, 148889344, 144849920, 139821584, 133943384, 127320008, 120237072, -112997368, 105686264, 98361192, 91252488, 84576496, 78442744, 73074040, 68684040, 65085396, 61884036, -58992988, 56423524, 53806812, 50775104, 47516296, 44320840, 41041632, 37541236, 33990908, 30249454, -25816512, 20746840, 15533823, 10032507, 3857954, -2369748, -7787850, -12741557, -17762374, -22230750, --25899190, -29855392, -34100428, -37107444, -39562016, -44016436, -49089864, -50723564, -51017768, -55984900, --62226024, -60142964, -54548768, -61892088, -77720120, -72277856, -36496484, -5768141, -11269994, -33130304, --36767604, -31787052, -48571248, -72495288, -57268556, -2782065, 35726612, 27451820, 5108864, 6401112, -22469658, 29867740, 33055678, 42106248, 39908836, 9390946, -26454852, -28629716, 3511673, 33764884, -40212704, 35827544, 37678676, 43050604, 45202920, 52891448, 79491256, 120323512, 151594096, }, +-1975685, -1382443, -914828, -1770600, -5363341, -9013526, -5036386, 7479149, 10615012, -15942919, +-56564184, -57993868, 7053947, 85042496, 88171384, 2945811, -83288008, -83608520, -10362145, 53223236, +56314536, 20531554, -10377178, -20672214, -16948478, -3994320, 16381005, 36971080, 49690624, 53488984, +51806432, 47150152, 41786272, 38687456, 38138772, 36497020, 30347702, 19595252, 5913633, -9071508, +-23396298, -34890168, -42566348, -46789912, -48198660, -47502340, -45899240, -44558676, -43887048, -43898324, +-44784696, -46591268, -48833780, -50869056, -52300892, -52907556, -52671332, -51987356, -51447804, -51408612, +-52043192, -53603876, -56228100, -59635620, -63368484, -67205504, -71101576, -74897784, -78367048, -81413256, +-83995064, -85938000, -87039120, -87366616, -87256016, -86901144, -86133960, -84820776, -83342768, -82242184, +-81369232, -79879952, -77301896, -74104288, -70828304, -67064304, -61832496, -54830088, -46868292, -39093328, +-32087700, -25779468, -20059644, -15351824, -12449500, -11724724, -12670690, -14439680, -16755741, -20076288, +-24864640, -30848602, -36961416, -41910292, -44918916, -46094124, -46125800, -45565308, -44384192, -42154032, +-38555920, -33717104, -28170690, -22527640, -17147656, -12047383, -7031935, -1874216, 3546569, 9167071, +14823006, 20462834, 26199838, 32102734, 38029252, 43714716, 48913236, 53425636, 57149372, 60168732, +62699008, 64918968, 66953172, 68969656, 71169216, 73711840, 76739792, 80424336, 84902376, 90224376, +96379064, 103264976, 110630304, 118148104, 125512904, 132400416, 138475120, 143570016, 147709824, 150860192, +152853584, 153623456, 153249264, 151710592, 148889344, 144849920, 139821584, 133943384, 127320008, 120237072, +112997368, 105686264, 98361192, 91252488, 84576496, 78442744, 73074040, 68684040, 65085396, 61884036, +58992988, 56423524, 53806812, 50775104, 47516296, 44320840, 41041632, 37541236, 33990908, 30249454, +25816512, 20746840, 15533823, 10032507, 3857954, -2369748, -7787850, -12741557, -17762374, -22230750, +-25899190, -29855392, -34100428, -37107444, -39562016, -44016436, -49089864, -50723564, -51017768, -55984900, +-62226024, -60142964, -54548768, -61892088, -77720120, -72277856, -36496484, -5768141, -11269994, -33130304, +-36767604, -31787052, -48571248, -72495288, -57268556, -2782065, 35726612, 27451820, 5108864, 6401112, +22469658, 29867740, 33055678, 42106248, 39908836, 9390946, -26454852, -28629716, 3511673, 33764884, +40212704, 35827544, 37678676, 43050604, 45202920, 52891448, 79491256, 120323512, 151594096, }, { -2374580, --1975685, -1382443, -914828, -1770600, -5363341, -9013526, -5036386, 7479149, 10615012, -15942919, --56564184, -57993868, 7053947, 85042496, 88171384, 2945811, -83288008, -83608520, -10362145, 53223236, -56314536, 20531554, -10377178, -20672214, -16948478, -3994320, 16381005, 36971080, 49690624, 53488984, -51806432, 47150152, 41786272, 38687456, 38138772, 36497020, 30347702, 19595252, 5913633, -9071508, --23396298, -34890168, -42566348, -46789912, -48198660, -47502340, -45899240, -44558676, -43887048, -43898324, --44784696, -46591268, -48833780, -50869056, -52300892, -52907556, -52671332, -51987356, -51447804, -51408612, --52043192, -53603876, -56228100, -59635620, -63368484, -67205504, -71101576, -74897784, -78367048, -81413256, --83995064, -85938000, -87039120, -87366616, -87256016, -86901144, -86133960, -84820776, -83342768, -82242184, --81369232, -79879952, -77301896, -74104288, -70828304, -67064304, -61832496, -54830088, -46868292, -39093328, --32087700, -25779468, -20059644, -15351824, -12449500, -11724724, -12670690, -14439680, -16755741, -20076288, --24864640, -30848602, -36961416, -41910292, -44918916, -46094124, -46125800, -45565308, -44384192, -42154032, --38555920, -33717104, -28170690, -22527640, -17147656, -12047383, -7031935, -1874216, 3546569, 9167071, -14823006, 20462834, 26199838, 32102734, 38029252, 43714716, 48913236, 53425636, 57149372, 60168732, -62699008, 64918968, 66953172, 68969656, 71169216, 73711840, 76739792, 80424336, 84902376, 90224376, -96379064, 103264976, 110630304, 118148104, 125512904, 132400416, 138475120, 143570016, 147709824, 150860192, -152853584, 153623456, 153249264, 151710592, 148889344, 144849920, 139821584, 133943384, 127320008, 120237072, -112997368, 105686264, 98361192, 91252488, 84576496, 78442744, 73074040, 68684040, 65085396, 61884036, -58992988, 56423524, 53806812, 50775104, 47516296, 44320840, 41041632, 37541236, 33990908, 30249454, -25816512, 20746840, 15533823, 10032507, 3857954, -2369748, -7787850, -12741557, -17762374, -22230750, --25899190, -29855392, -34100428, -37107444, -39562016, -44016436, -49089864, -50723564, -51017768, -55984900, --62226024, -60142964, -54548768, -61892088, -77720120, -72277856, -36496484, -5768141, -11269994, -33130304, --36767604, -31787052, -48571248, -72495288, -57268556, -2782065, 35726612, 27451820, 5108864, 6401112, -22469658, 29867740, 33055678, 42106248, 39908836, 9390946, -26454852, -28629716, 3511673, 33764884, -40212704, 35827544, 37678676, 43050604, 45202920, 52891448, 79491256, 120323512, 151594096, }, +-1975685, -1382443, -914828, -1770600, -5363341, -9013526, -5036386, 7479149, 10615012, -15942919, +-56564184, -57993868, 7053947, 85042496, 88171384, 2945811, -83288008, -83608520, -10362145, 53223236, +56314536, 20531554, -10377178, -20672214, -16948478, -3994320, 16381005, 36971080, 49690624, 53488984, +51806432, 47150152, 41786272, 38687456, 38138772, 36497020, 30347702, 19595252, 5913633, -9071508, +-23396298, -34890168, -42566348, -46789912, -48198660, -47502340, -45899240, -44558676, -43887048, -43898324, +-44784696, -46591268, -48833780, -50869056, -52300892, -52907556, -52671332, -51987356, -51447804, -51408612, +-52043192, -53603876, -56228100, -59635620, -63368484, -67205504, -71101576, -74897784, -78367048, -81413256, +-83995064, -85938000, -87039120, -87366616, -87256016, -86901144, -86133960, -84820776, -83342768, -82242184, +-81369232, -79879952, -77301896, -74104288, -70828304, -67064304, -61832496, -54830088, -46868292, -39093328, +-32087700, -25779468, -20059644, -15351824, -12449500, -11724724, -12670690, -14439680, -16755741, -20076288, +-24864640, -30848602, -36961416, -41910292, -44918916, -46094124, -46125800, -45565308, -44384192, -42154032, +-38555920, -33717104, -28170690, -22527640, -17147656, -12047383, -7031935, -1874216, 3546569, 9167071, +14823006, 20462834, 26199838, 32102734, 38029252, 43714716, 48913236, 53425636, 57149372, 60168732, +62699008, 64918968, 66953172, 68969656, 71169216, 73711840, 76739792, 80424336, 84902376, 90224376, +96379064, 103264976, 110630304, 118148104, 125512904, 132400416, 138475120, 143570016, 147709824, 150860192, +152853584, 153623456, 153249264, 151710592, 148889344, 144849920, 139821584, 133943384, 127320008, 120237072, +112997368, 105686264, 98361192, 91252488, 84576496, 78442744, 73074040, 68684040, 65085396, 61884036, +58992988, 56423524, 53806812, 50775104, 47516296, 44320840, 41041632, 37541236, 33990908, 30249454, +25816512, 20746840, 15533823, 10032507, 3857954, -2369748, -7787850, -12741557, -17762374, -22230750, +-25899190, -29855392, -34100428, -37107444, -39562016, -44016436, -49089864, -50723564, -51017768, -55984900, +-62226024, -60142964, -54548768, -61892088, -77720120, -72277856, -36496484, -5768141, -11269994, -33130304, +-36767604, -31787052, -48571248, -72495288, -57268556, -2782065, 35726612, 27451820, 5108864, 6401112, +22469658, 29867740, 33055678, 42106248, 39908836, 9390946, -26454852, -28629716, 3511673, 33764884, +40212704, 35827544, 37678676, 43050604, 45202920, 52891448, 79491256, 120323512, 151594096, }, }, }; const Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240] ={ { { -94963336, --259899744, -365878592, -407935456, -399034688, -360622624, -313190080, -256787504, -171167872, -51148764, 77082848, -190087200, 280461376, 307977600, 197138464, -42101416, -233239808, -184613808, 66844724, 261040592, 200156752, --49803368, -281876544, -387830720, -404907520, -388901760, -342356672, -260487088, -167980464, -88047904, -17336636, -52413632, 115413288, 165056128, 205573776, 242155088, 273263552, 297519360, 317817920, 336046816, 351308992, -363975936, 375640512, 385805088, 393180096, 398694848, 403710272, 407503264, 409267424, 410109792, 410945152, -410935488, 409496672, 407403424, 405001472, 401672320, 397503520, 393377664, 389382816, 385003008, 380521760, -376547840, 372777920, 368674080, 364578848, 360973760, 357542080, 353929472, 350476320, 347467136, 344584704, -341609344, 338776288, 336161728, 333495616, 330667392, 327781152, 324807968, 321659232, 318333312, 314676160, -310469760, 305917632, 301435296, 296905728, 291875776, 286476992, 281314464, 276465984, 271412928, 265969072, -260564928, 255623568, 251213712, 247219392, 243490816, 239998480, 237063936, 235104368, 234008064, 233171632, -232267536, 231538464, 231289888, 231495520, 231909984, 232202576, 232065680, 231499280, 230856096, 230369696, -229821552, 228851424, 227326176, 225292512, 222869616, 220299072, 217801008, 215311008, 212592832, 209589568, -206436000, 203235168, 200035424, 196905456, 193827584, 190668096, 187384048, 184121488, 181036096, 178191744, -175648064, 173445808, 171507168, 169725296, 168109312, 166713456, 165531792, 164576160, 163917968, 163530880, -163231840, 162854416, 162346000, 161662032, 160738608, 159572528, 158192768, 156563904, 154628480, 152397248, -149915296, 147220208, 144376944, 141480512, 138593232, 135757472, 133036608, 130476272, 128080216, 125873144, -123902288, 122153704, 120579600, 119167624, 117866248, 116520856, 115040160, 113503104, 111976240, 110411800, -108827488, 107345728, 105978320, 104645264, 103426568, 102459664, 101669928, 100940320, 100377144, 100041064, -99700688, 99215896, 98755256, 98316632, 97593472, 96572336, 95553896, 94439352, 92886184, 91133304, -89595704, 87897040, 85607824, 83369608, 81698864, 79643728, 76585176, 73904040, 72387376, 70017632, -65605624, 62018792, 61284352, 59253904, 51306604, 41377716, 38103876, 42578696, 47088412, 45931456, -40431748, 33403034, 26739392, 25276420, 33993592, 48282412, 55147916, 48762376, 38468412, 36508832, -43465068, 51666844, 58545236, 68971808, 84820232, 98487360, 99587408, 85861768, 65221224, 47458852, -35827544, 27596776, 20706038, 16087337, 13238700, 8391292, 366683, -5357435, -3285113, }, +-259899744, -365878592, -407935456, -399034688, -360622624, -313190080, -256787504, -171167872, -51148764, 77082848, +190087200, 280461376, 307977600, 197138464, -42101416, -233239808, -184613808, 66844724, 261040592, 200156752, +-49803368, -281876544, -387830720, -404907520, -388901760, -342356672, -260487088, -167980464, -88047904, -17336636, +52413632, 115413288, 165056128, 205573776, 242155088, 273263552, 297519360, 317817920, 336046816, 351308992, +363975936, 375640512, 385805088, 393180096, 398694848, 403710272, 407503264, 409267424, 410109792, 410945152, +410935488, 409496672, 407403424, 405001472, 401672320, 397503520, 393377664, 389382816, 385003008, 380521760, +376547840, 372777920, 368674080, 364578848, 360973760, 357542080, 353929472, 350476320, 347467136, 344584704, +341609344, 338776288, 336161728, 333495616, 330667392, 327781152, 324807968, 321659232, 318333312, 314676160, +310469760, 305917632, 301435296, 296905728, 291875776, 286476992, 281314464, 276465984, 271412928, 265969072, +260564928, 255623568, 251213712, 247219392, 243490816, 239998480, 237063936, 235104368, 234008064, 233171632, +232267536, 231538464, 231289888, 231495520, 231909984, 232202576, 232065680, 231499280, 230856096, 230369696, +229821552, 228851424, 227326176, 225292512, 222869616, 220299072, 217801008, 215311008, 212592832, 209589568, +206436000, 203235168, 200035424, 196905456, 193827584, 190668096, 187384048, 184121488, 181036096, 178191744, +175648064, 173445808, 171507168, 169725296, 168109312, 166713456, 165531792, 164576160, 163917968, 163530880, +163231840, 162854416, 162346000, 161662032, 160738608, 159572528, 158192768, 156563904, 154628480, 152397248, +149915296, 147220208, 144376944, 141480512, 138593232, 135757472, 133036608, 130476272, 128080216, 125873144, +123902288, 122153704, 120579600, 119167624, 117866248, 116520856, 115040160, 113503104, 111976240, 110411800, +108827488, 107345728, 105978320, 104645264, 103426568, 102459664, 101669928, 100940320, 100377144, 100041064, +99700688, 99215896, 98755256, 98316632, 97593472, 96572336, 95553896, 94439352, 92886184, 91133304, +89595704, 87897040, 85607824, 83369608, 81698864, 79643728, 76585176, 73904040, 72387376, 70017632, +65605624, 62018792, 61284352, 59253904, 51306604, 41377716, 38103876, 42578696, 47088412, 45931456, +40431748, 33403034, 26739392, 25276420, 33993592, 48282412, 55147916, 48762376, 38468412, 36508832, +43465068, 51666844, 58545236, 68971808, 84820232, 98487360, 99587408, 85861768, 65221224, 47458852, +35827544, 27596776, 20706038, 16087337, 13238700, 8391292, 366683, -5357435, -3285113, }, { -94963336, --259899744, -365878592, -407935456, -399034688, -360622624, -313190080, -256787504, -171167872, -51148764, 77082848, -190087200, 280461376, 307977600, 197138464, -42101416, -233239808, -184613808, 66844724, 261040592, 200156752, --49803368, -281876544, -387830720, -404907520, -388901760, -342356672, -260487088, -167980464, -88047904, -17336636, -52413632, 115413288, 165056128, 205573776, 242155088, 273263552, 297519360, 317817920, 336046816, 351308992, -363975936, 375640512, 385805088, 393180096, 398694848, 403710272, 407503264, 409267424, 410109792, 410945152, -410935488, 409496672, 407403424, 405001472, 401672320, 397503520, 393377664, 389382816, 385003008, 380521760, -376547840, 372777920, 368674080, 364578848, 360973760, 357542080, 353929472, 350476320, 347467136, 344584704, -341609344, 338776288, 336161728, 333495616, 330667392, 327781152, 324807968, 321659232, 318333312, 314676160, -310469760, 305917632, 301435296, 296905728, 291875776, 286476992, 281314464, 276465984, 271412928, 265969072, -260564928, 255623568, 251213712, 247219392, 243490816, 239998480, 237063936, 235104368, 234008064, 233171632, -232267536, 231538464, 231289888, 231495520, 231909984, 232202576, 232065680, 231499280, 230856096, 230369696, -229821552, 228851424, 227326176, 225292512, 222869616, 220299072, 217801008, 215311008, 212592832, 209589568, -206436000, 203235168, 200035424, 196905456, 193827584, 190668096, 187384048, 184121488, 181036096, 178191744, -175648064, 173445808, 171507168, 169725296, 168109312, 166713456, 165531792, 164576160, 163917968, 163530880, -163231840, 162854416, 162346000, 161662032, 160738608, 159572528, 158192768, 156563904, 154628480, 152397248, -149915296, 147220208, 144376944, 141480512, 138593232, 135757472, 133036608, 130476272, 128080216, 125873144, -123902288, 122153704, 120579600, 119167624, 117866248, 116520856, 115040160, 113503104, 111976240, 110411800, -108827488, 107345728, 105978320, 104645264, 103426568, 102459664, 101669928, 100940320, 100377144, 100041064, -99700688, 99215896, 98755256, 98316632, 97593472, 96572336, 95553896, 94439352, 92886184, 91133304, -89595704, 87897040, 85607824, 83369608, 81698864, 79643728, 76585176, 73904040, 72387376, 70017632, -65605624, 62018792, 61284352, 59253904, 51306604, 41377716, 38103876, 42578696, 47088412, 45931456, -40431748, 33403034, 26739392, 25276420, 33993592, 48282412, 55147916, 48762376, 38468412, 36508832, -43465068, 51666844, 58545236, 68971808, 84820232, 98487360, 99587408, 85861768, 65221224, 47458852, -35827544, 27596776, 20706038, 16087337, 13238700, 8391292, 366683, -5357435, -3285113, }, +-259899744, -365878592, -407935456, -399034688, -360622624, -313190080, -256787504, -171167872, -51148764, 77082848, +190087200, 280461376, 307977600, 197138464, -42101416, -233239808, -184613808, 66844724, 261040592, 200156752, +-49803368, -281876544, -387830720, -404907520, -388901760, -342356672, -260487088, -167980464, -88047904, -17336636, +52413632, 115413288, 165056128, 205573776, 242155088, 273263552, 297519360, 317817920, 336046816, 351308992, +363975936, 375640512, 385805088, 393180096, 398694848, 403710272, 407503264, 409267424, 410109792, 410945152, +410935488, 409496672, 407403424, 405001472, 401672320, 397503520, 393377664, 389382816, 385003008, 380521760, +376547840, 372777920, 368674080, 364578848, 360973760, 357542080, 353929472, 350476320, 347467136, 344584704, +341609344, 338776288, 336161728, 333495616, 330667392, 327781152, 324807968, 321659232, 318333312, 314676160, +310469760, 305917632, 301435296, 296905728, 291875776, 286476992, 281314464, 276465984, 271412928, 265969072, +260564928, 255623568, 251213712, 247219392, 243490816, 239998480, 237063936, 235104368, 234008064, 233171632, +232267536, 231538464, 231289888, 231495520, 231909984, 232202576, 232065680, 231499280, 230856096, 230369696, +229821552, 228851424, 227326176, 225292512, 222869616, 220299072, 217801008, 215311008, 212592832, 209589568, +206436000, 203235168, 200035424, 196905456, 193827584, 190668096, 187384048, 184121488, 181036096, 178191744, +175648064, 173445808, 171507168, 169725296, 168109312, 166713456, 165531792, 164576160, 163917968, 163530880, +163231840, 162854416, 162346000, 161662032, 160738608, 159572528, 158192768, 156563904, 154628480, 152397248, +149915296, 147220208, 144376944, 141480512, 138593232, 135757472, 133036608, 130476272, 128080216, 125873144, +123902288, 122153704, 120579600, 119167624, 117866248, 116520856, 115040160, 113503104, 111976240, 110411800, +108827488, 107345728, 105978320, 104645264, 103426568, 102459664, 101669928, 100940320, 100377144, 100041064, +99700688, 99215896, 98755256, 98316632, 97593472, 96572336, 95553896, 94439352, 92886184, 91133304, +89595704, 87897040, 85607824, 83369608, 81698864, 79643728, 76585176, 73904040, 72387376, 70017632, +65605624, 62018792, 61284352, 59253904, 51306604, 41377716, 38103876, 42578696, 47088412, 45931456, +40431748, 33403034, 26739392, 25276420, 33993592, 48282412, 55147916, 48762376, 38468412, 36508832, +43465068, 51666844, 58545236, 68971808, 84820232, 98487360, 99587408, 85861768, 65221224, 47458852, +35827544, 27596776, 20706038, 16087337, 13238700, 8391292, 366683, -5357435, -3285113, }, }, { { 75060456, -181290576, 166391328, 4222490, -246988544, -485340416, -637412352, -668590592, -562286912, -345107616, -95697776, -137160848, 373837696, 571850752, 535651136, 141639424, -359325568, -489517280, -90843392, 444124864, 613286976, -345293888, -38591892, -275234400, -372770944, -427594048, -446676608, -404071584, -331896832, -276191616, -232449536, --177023520, -115572200, -64596308, -20371030, 27089432, 74404936, 116204632, 156305136, 197281808, 234746272, -267057840, 297569824, 326030976, 349027296, 367687328, 385397632, 400829984, 411187808, 418360416, 425423488, -431585152, 435494112, 438640192, 441890944, 443526240, 442963072, 441746528, 439925440, 436022944, 430542016, -425219488, 419662880, 412594432, 404927904, 398160640, 391658592, 384455936, 377527616, 371925376, 366999584, -362234336, 358501472, 356285792, 354875424, 353917120, 353771072, 354289152, 354975840, 355882048, 356943456, -357440608, 357242496, 357187200, 357383680, 356850592, 355441280, 354234400, 353652448, 353077440, 352439104, -352331200, 352665664, 352851968, 352886848, 352854656, 352064384, 349902400, 346624256, 342358816, 336486528, -328759872, 319841920, 310215840, 299768864, 288650272, 277372736, 266137104, 255173136, 245376320, 237521888, -231328544, 226142384, 221828624, 218345392, 215404416, 213101776, 211880944, 211491168, 210960736, 209735072, -207901120, 205508272, 202684336, 200050448, 198051136, 196295568, 194327408, 192371584, 190693856, 189062320, -187366880, 185905504, 184712048, 183460608, 182183920, 181219696, 180506736, 179776064, 179172080, 178942832, -178924048, 178977728, 179375552, 180231328, 181216480, 182158688, 183190560, 184158000, 184690032, 184836608, -184854320, 184577824, 183745136, 182548464, 181182128, 179390048, 177025664, 174380512, 171548512, 168253728, -164523552, 160702112, 156747520, 152372560, 147711440, 143038512, 138227072, 133205192, 128355632, 123843768, -119330832, 114747032, 110418776, 106214008, 101653288, 96854200, 92291328, 87922816, 83602072, 79703320, -76371496, 73081552, 69701416, 66722316, 63989108, 60789356, 57319024, 54249196, 51235200, 47760036, -44398688, 41387380, 37823628, 33910916, 30954904, 28005872, 23077934, 18101140, 15947750, 13168370, -5380521, -1872069, -1912871, -4445828, -23741506, -48941688, -52257404, -31860604, -17410724, -24125906, --34259880, -38182796, -57206280, -101681200, -139482816, -137172128, -108657304, -93728536, -106906032, -132457864, --153244432, -164201968, -173872080, -205003616, -268345264, -323572640, -301992576, -192217504, -70960912, -19066970, --34032248, -56741888, -58976344, -64205468, -93292592, -128591856, -136745856, -103326176, -38155952, }, +181290576, 166391328, 4222490, -246988544, -485340416, -637412352, -668590592, -562286912, -345107616, -95697776, +137160848, 373837696, 571850752, 535651136, 141639424, -359325568, -489517280, -90843392, 444124864, 613286976, +345293888, -38591892, -275234400, -372770944, -427594048, -446676608, -404071584, -331896832, -276191616, -232449536, +-177023520, -115572200, -64596308, -20371030, 27089432, 74404936, 116204632, 156305136, 197281808, 234746272, +267057840, 297569824, 326030976, 349027296, 367687328, 385397632, 400829984, 411187808, 418360416, 425423488, +431585152, 435494112, 438640192, 441890944, 443526240, 442963072, 441746528, 439925440, 436022944, 430542016, +425219488, 419662880, 412594432, 404927904, 398160640, 391658592, 384455936, 377527616, 371925376, 366999584, +362234336, 358501472, 356285792, 354875424, 353917120, 353771072, 354289152, 354975840, 355882048, 356943456, +357440608, 357242496, 357187200, 357383680, 356850592, 355441280, 354234400, 353652448, 353077440, 352439104, +352331200, 352665664, 352851968, 352886848, 352854656, 352064384, 349902400, 346624256, 342358816, 336486528, +328759872, 319841920, 310215840, 299768864, 288650272, 277372736, 266137104, 255173136, 245376320, 237521888, +231328544, 226142384, 221828624, 218345392, 215404416, 213101776, 211880944, 211491168, 210960736, 209735072, +207901120, 205508272, 202684336, 200050448, 198051136, 196295568, 194327408, 192371584, 190693856, 189062320, +187366880, 185905504, 184712048, 183460608, 182183920, 181219696, 180506736, 179776064, 179172080, 178942832, +178924048, 178977728, 179375552, 180231328, 181216480, 182158688, 183190560, 184158000, 184690032, 184836608, +184854320, 184577824, 183745136, 182548464, 181182128, 179390048, 177025664, 174380512, 171548512, 168253728, +164523552, 160702112, 156747520, 152372560, 147711440, 143038512, 138227072, 133205192, 128355632, 123843768, +119330832, 114747032, 110418776, 106214008, 101653288, 96854200, 92291328, 87922816, 83602072, 79703320, +76371496, 73081552, 69701416, 66722316, 63989108, 60789356, 57319024, 54249196, 51235200, 47760036, +44398688, 41387380, 37823628, 33910916, 30954904, 28005872, 23077934, 18101140, 15947750, 13168370, +5380521, -1872069, -1912871, -4445828, -23741506, -48941688, -52257404, -31860604, -17410724, -24125906, +-34259880, -38182796, -57206280, -101681200, -139482816, -137172128, -108657304, -93728536, -106906032, -132457864, +-153244432, -164201968, -173872080, -205003616, -268345264, -323572640, -301992576, -192217504, -70960912, -19066970, +-34032248, -56741888, -58976344, -64205468, -93292592, -128591856, -136745856, -103326176, -38155952, }, { -75060456, --181290576, -166391328, -4222490, 246988544, 485340416, 637412352, 668590592, 562286912, 345107616, 95697776, --137160848, -373837696, -571850752, -535651136, -141639424, 359325568, 489517280, 90843392, -444124864, -613286976, --345293888, 38591892, 275234400, 372770944, 427594048, 446676608, 404071584, 331896832, 276191616, 232449536, -177023520, 115572200, 64596308, 20371030, -27089432, -74404936, -116204632, -156305136, -197281808, -234746272, --267057840, -297569824, -326030976, -349027296, -367687328, -385397632, -400829984, -411187808, -418360416, -425423488, --431585152, -435494112, -438640192, -441890944, -443526240, -442963072, -441746528, -439925440, -436022944, -430542016, --425219488, -419662880, -412594432, -404927904, -398160640, -391658592, -384455936, -377527616, -371925376, -366999584, --362234336, -358501472, -356285792, -354875424, -353917120, -353771072, -354289152, -354975840, -355882048, -356943456, --357440608, -357242496, -357187200, -357383680, -356850592, -355441280, -354234400, -353652448, -353077440, -352439104, --352331200, -352665664, -352851968, -352886848, -352854656, -352064384, -349902400, -346624256, -342358816, -336486528, --328759872, -319841920, -310215840, -299768864, -288650272, -277372736, -266137104, -255173136, -245376320, -237521888, --231328544, -226142384, -221828624, -218345392, -215404416, -213101776, -211880944, -211491168, -210960736, -209735072, --207901120, -205508272, -202684336, -200050448, -198051136, -196295568, -194327408, -192371584, -190693856, -189062320, --187366880, -185905504, -184712048, -183460608, -182183920, -181219696, -180506736, -179776064, -179172080, -178942832, --178924048, -178977728, -179375552, -180231328, -181216480, -182158688, -183190560, -184158000, -184690032, -184836608, --184854320, -184577824, -183745136, -182548464, -181182128, -179390048, -177025664, -174380512, -171548512, -168253728, --164523552, -160702112, -156747520, -152372560, -147711440, -143038512, -138227072, -133205192, -128355632, -123843768, --119330832, -114747032, -110418776, -106214008, -101653288, -96854200, -92291328, -87922816, -83602072, -79703320, --76371496, -73081552, -69701416, -66722316, -63989108, -60789356, -57319024, -54249196, -51235200, -47760036, --44398688, -41387380, -37823628, -33910916, -30954904, -28005872, -23077934, -18101140, -15947750, -13168370, --5380521, 1872069, 1912871, 4445828, 23741506, 48941688, 52257404, 31860604, 17410724, 24125906, -34259880, 38182796, 57206280, 101681200, 139482816, 137172128, 108657304, 93728536, 106906032, 132457864, -153244432, 164201968, 173872080, 205003616, 268345264, 323572640, 301992576, 192217504, 70960912, 19066970, -34032248, 56741888, 58976344, 64205468, 93292592, 128591856, 136745856, 103326176, 38155952, }, +-181290576, -166391328, -4222490, 246988544, 485340416, 637412352, 668590592, 562286912, 345107616, 95697776, +-137160848, -373837696, -571850752, -535651136, -141639424, 359325568, 489517280, 90843392, -444124864, -613286976, +-345293888, 38591892, 275234400, 372770944, 427594048, 446676608, 404071584, 331896832, 276191616, 232449536, +177023520, 115572200, 64596308, 20371030, -27089432, -74404936, -116204632, -156305136, -197281808, -234746272, +-267057840, -297569824, -326030976, -349027296, -367687328, -385397632, -400829984, -411187808, -418360416, -425423488, +-431585152, -435494112, -438640192, -441890944, -443526240, -442963072, -441746528, -439925440, -436022944, -430542016, +-425219488, -419662880, -412594432, -404927904, -398160640, -391658592, -384455936, -377527616, -371925376, -366999584, +-362234336, -358501472, -356285792, -354875424, -353917120, -353771072, -354289152, -354975840, -355882048, -356943456, +-357440608, -357242496, -357187200, -357383680, -356850592, -355441280, -354234400, -353652448, -353077440, -352439104, +-352331200, -352665664, -352851968, -352886848, -352854656, -352064384, -349902400, -346624256, -342358816, -336486528, +-328759872, -319841920, -310215840, -299768864, -288650272, -277372736, -266137104, -255173136, -245376320, -237521888, +-231328544, -226142384, -221828624, -218345392, -215404416, -213101776, -211880944, -211491168, -210960736, -209735072, +-207901120, -205508272, -202684336, -200050448, -198051136, -196295568, -194327408, -192371584, -190693856, -189062320, +-187366880, -185905504, -184712048, -183460608, -182183920, -181219696, -180506736, -179776064, -179172080, -178942832, +-178924048, -178977728, -179375552, -180231328, -181216480, -182158688, -183190560, -184158000, -184690032, -184836608, +-184854320, -184577824, -183745136, -182548464, -181182128, -179390048, -177025664, -174380512, -171548512, -168253728, +-164523552, -160702112, -156747520, -152372560, -147711440, -143038512, -138227072, -133205192, -128355632, -123843768, +-119330832, -114747032, -110418776, -106214008, -101653288, -96854200, -92291328, -87922816, -83602072, -79703320, +-76371496, -73081552, -69701416, -66722316, -63989108, -60789356, -57319024, -54249196, -51235200, -47760036, +-44398688, -41387380, -37823628, -33910916, -30954904, -28005872, -23077934, -18101140, -15947750, -13168370, +-5380521, 1872069, 1912871, 4445828, 23741506, 48941688, 52257404, 31860604, 17410724, 24125906, +34259880, 38182796, 57206280, 101681200, 139482816, 137172128, 108657304, 93728536, 106906032, 132457864, +153244432, 164201968, 173872080, 205003616, 268345264, 323572640, 301992576, 192217504, 70960912, 19066970, +34032248, 56741888, 58976344, 64205468, 93292592, 128591856, 136745856, 103326176, 38155952, }, }, { { -9009231, --36637680, -70193728, -75922136, -36270460, 20501490, 50464256, 39287140, 6155225, -24621436, -40747964, --36815384, -10376104, 28257664, 50878184, 32616518, -14510010, -41502804, -12632573, 47379932, 74487080, -36009004, -36733244, -90490128, -105127376, -96395712, -82754896, -69029248, -55150600, -42622720, -31022548, --18132278, -4883915, 5132486, 10377178, 11759620, 10193031, 7223062, 6258841, 10063108, 18169860, -28565290, 40365176, 53441740, 67170064, 81056232, 95515240, 111126912, 127973920, 146063792, 165386304, -185295632, 204663248, 222767072, 239341344, 253865856, 265567488, 274117152, 279660896, 282155200, 281194208, -276510528, 268132128, 255947840, 239568976, 218812480, 194024608, 165772320, 134540384, 100960184, 66029752, -30862024, -3540664, -36068060, -65486976, -91001768, -112490560, -129825584, -142414672, -149966304, -153312608, --153736736, -151610736, -146457312, -138457936, -129109936, -119890256, -110741440, -100565048, -89078696, -77489264, --67181880, -58417460, -50668268, -43698608, -37853156, -33639796, -31494458, -31674310, -33990908, -37805376, --42507828, -47871704, -53913652, -60627760, -67760624, -74542376, -79847200, -83028160, -84393960, -84554488, --83609056, -81294064, -77459200, -72026064, -64901252, -56278568, -46660524, -36447628, -25920664, -15577310, --5956046, 2781528, 10603737, 17167522, 22128208, 25563108, 27681064, 28526636, 28289876, 27351426, -25821344, 23676544, 21408264, 19786914, 19047106, 18995030, 19587198, 20571820, 21073794, 20432234, -18941880, 17059610, 14637249, 11552388, 8166344, 4611721, 605590, -3702262, -7746511, -11465952, --15144055, -18547816, -21358872, -23982024, -26864484, -29727080, -32395328, -35358320, -38722352, -41896332, --44844828, -48186848, -51808044, -55009404, -57896160, -60905320, -63523640, -65251828, -66866200, -69036232, --71145056, -72943576, -75442712, -78984448, -82773144, -86984360, -92518968, -98582384, -103691248, -108415712, --113725368, -118238840, -120716496, -122672320, -125000728, -125737312, -124344672, -123203824, -122424824, -119594976, --115836880, -114016888, -111642304, -105648144, -100828112, -100789464, -97543000, -86452320, -79858472, -84221088, --81069656, -60564408, -50760608, -70058968, -75491032, -19363860, 59583544, 75100184, 18751290, -32347546, --37635188, -37250252, -54767276, -44564580, 21100638, 85975048, 85095112, 34751656, -3085934, -8105677, --8428873, -26249766, -52829708, -62334472, -32243930, 30965640, 78734800, 61895848, -5378373, -54467700, --45957760, -11283953, 3053185, -2666638, 354872, 17393006, 27977416, 21667574, 7367480, }, +-36637680, -70193728, -75922136, -36270460, 20501490, 50464256, 39287140, 6155225, -24621436, -40747964, +-36815384, -10376104, 28257664, 50878184, 32616518, -14510010, -41502804, -12632573, 47379932, 74487080, +36009004, -36733244, -90490128, -105127376, -96395712, -82754896, -69029248, -55150600, -42622720, -31022548, +-18132278, -4883915, 5132486, 10377178, 11759620, 10193031, 7223062, 6258841, 10063108, 18169860, +28565290, 40365176, 53441740, 67170064, 81056232, 95515240, 111126912, 127973920, 146063792, 165386304, +185295632, 204663248, 222767072, 239341344, 253865856, 265567488, 274117152, 279660896, 282155200, 281194208, +276510528, 268132128, 255947840, 239568976, 218812480, 194024608, 165772320, 134540384, 100960184, 66029752, +30862024, -3540664, -36068060, -65486976, -91001768, -112490560, -129825584, -142414672, -149966304, -153312608, +-153736736, -151610736, -146457312, -138457936, -129109936, -119890256, -110741440, -100565048, -89078696, -77489264, +-67181880, -58417460, -50668268, -43698608, -37853156, -33639796, -31494458, -31674310, -33990908, -37805376, +-42507828, -47871704, -53913652, -60627760, -67760624, -74542376, -79847200, -83028160, -84393960, -84554488, +-83609056, -81294064, -77459200, -72026064, -64901252, -56278568, -46660524, -36447628, -25920664, -15577310, +-5956046, 2781528, 10603737, 17167522, 22128208, 25563108, 27681064, 28526636, 28289876, 27351426, +25821344, 23676544, 21408264, 19786914, 19047106, 18995030, 19587198, 20571820, 21073794, 20432234, +18941880, 17059610, 14637249, 11552388, 8166344, 4611721, 605590, -3702262, -7746511, -11465952, +-15144055, -18547816, -21358872, -23982024, -26864484, -29727080, -32395328, -35358320, -38722352, -41896332, +-44844828, -48186848, -51808044, -55009404, -57896160, -60905320, -63523640, -65251828, -66866200, -69036232, +-71145056, -72943576, -75442712, -78984448, -82773144, -86984360, -92518968, -98582384, -103691248, -108415712, +-113725368, -118238840, -120716496, -122672320, -125000728, -125737312, -124344672, -123203824, -122424824, -119594976, +-115836880, -114016888, -111642304, -105648144, -100828112, -100789464, -97543000, -86452320, -79858472, -84221088, +-81069656, -60564408, -50760608, -70058968, -75491032, -19363860, 59583544, 75100184, 18751290, -32347546, +-37635188, -37250252, -54767276, -44564580, 21100638, 85975048, 85095112, 34751656, -3085934, -8105677, +-8428873, -26249766, -52829708, -62334472, -32243930, 30965640, 78734800, 61895848, -5378373, -54467700, +-45957760, -11283953, 3053185, -2666638, 354872, 17393006, 27977416, 21667574, 7367480, }, { -9009231, --36637680, -70193728, -75922136, -36270460, 20501490, 50464256, 39287140, 6155225, -24621436, -40747964, --36815384, -10376104, 28257664, 50878184, 32616518, -14510010, -41502804, -12632573, 47379932, 74487080, -36009004, -36733244, -90490128, -105127376, -96395712, -82754896, -69029248, -55150600, -42622720, -31022548, --18132278, -4883915, 5132486, 10377178, 11759620, 10193031, 7223062, 6258841, 10063108, 18169860, -28565290, 40365176, 53441740, 67170064, 81056232, 95515240, 111126912, 127973920, 146063792, 165386304, -185295632, 204663248, 222767072, 239341344, 253865856, 265567488, 274117152, 279660896, 282155200, 281194208, -276510528, 268132128, 255947840, 239568976, 218812480, 194024608, 165772320, 134540384, 100960184, 66029752, -30862024, -3540664, -36068060, -65486976, -91001768, -112490560, -129825584, -142414672, -149966304, -153312608, --153736736, -151610736, -146457312, -138457936, -129109936, -119890256, -110741440, -100565048, -89078696, -77489264, --67181880, -58417460, -50668268, -43698608, -37853156, -33639796, -31494458, -31674310, -33990908, -37805376, --42507828, -47871704, -53913652, -60627760, -67760624, -74542376, -79847200, -83028160, -84393960, -84554488, --83609056, -81294064, -77459200, -72026064, -64901252, -56278568, -46660524, -36447628, -25920664, -15577310, --5956046, 2781528, 10603737, 17167522, 22128208, 25563108, 27681064, 28526636, 28289876, 27351426, -25821344, 23676544, 21408264, 19786914, 19047106, 18995030, 19587198, 20571820, 21073794, 20432234, -18941880, 17059610, 14637249, 11552388, 8166344, 4611721, 605590, -3702262, -7746511, -11465952, --15144055, -18547816, -21358872, -23982024, -26864484, -29727080, -32395328, -35358320, -38722352, -41896332, --44844828, -48186848, -51808044, -55009404, -57896160, -60905320, -63523640, -65251828, -66866200, -69036232, --71145056, -72943576, -75442712, -78984448, -82773144, -86984360, -92518968, -98582384, -103691248, -108415712, --113725368, -118238840, -120716496, -122672320, -125000728, -125737312, -124344672, -123203824, -122424824, -119594976, --115836880, -114016888, -111642304, -105648144, -100828112, -100789464, -97543000, -86452320, -79858472, -84221088, --81069656, -60564408, -50760608, -70058968, -75491032, -19363860, 59583544, 75100184, 18751290, -32347546, --37635188, -37250252, -54767276, -44564580, 21100638, 85975048, 85095112, 34751656, -3085934, -8105677, --8428873, -26249766, -52829708, -62334472, -32243930, 30965640, 78734800, 61895848, -5378373, -54467700, --45957760, -11283953, 3053185, -2666638, 354872, 17393006, 27977416, 21667574, 7367480, }, +-36637680, -70193728, -75922136, -36270460, 20501490, 50464256, 39287140, 6155225, -24621436, -40747964, +-36815384, -10376104, 28257664, 50878184, 32616518, -14510010, -41502804, -12632573, 47379932, 74487080, +36009004, -36733244, -90490128, -105127376, -96395712, -82754896, -69029248, -55150600, -42622720, -31022548, +-18132278, -4883915, 5132486, 10377178, 11759620, 10193031, 7223062, 6258841, 10063108, 18169860, +28565290, 40365176, 53441740, 67170064, 81056232, 95515240, 111126912, 127973920, 146063792, 165386304, +185295632, 204663248, 222767072, 239341344, 253865856, 265567488, 274117152, 279660896, 282155200, 281194208, +276510528, 268132128, 255947840, 239568976, 218812480, 194024608, 165772320, 134540384, 100960184, 66029752, +30862024, -3540664, -36068060, -65486976, -91001768, -112490560, -129825584, -142414672, -149966304, -153312608, +-153736736, -151610736, -146457312, -138457936, -129109936, -119890256, -110741440, -100565048, -89078696, -77489264, +-67181880, -58417460, -50668268, -43698608, -37853156, -33639796, -31494458, -31674310, -33990908, -37805376, +-42507828, -47871704, -53913652, -60627760, -67760624, -74542376, -79847200, -83028160, -84393960, -84554488, +-83609056, -81294064, -77459200, -72026064, -64901252, -56278568, -46660524, -36447628, -25920664, -15577310, +-5956046, 2781528, 10603737, 17167522, 22128208, 25563108, 27681064, 28526636, 28289876, 27351426, +25821344, 23676544, 21408264, 19786914, 19047106, 18995030, 19587198, 20571820, 21073794, 20432234, +18941880, 17059610, 14637249, 11552388, 8166344, 4611721, 605590, -3702262, -7746511, -11465952, +-15144055, -18547816, -21358872, -23982024, -26864484, -29727080, -32395328, -35358320, -38722352, -41896332, +-44844828, -48186848, -51808044, -55009404, -57896160, -60905320, -63523640, -65251828, -66866200, -69036232, +-71145056, -72943576, -75442712, -78984448, -82773144, -86984360, -92518968, -98582384, -103691248, -108415712, +-113725368, -118238840, -120716496, -122672320, -125000728, -125737312, -124344672, -123203824, -122424824, -119594976, +-115836880, -114016888, -111642304, -105648144, -100828112, -100789464, -97543000, -86452320, -79858472, -84221088, +-81069656, -60564408, -50760608, -70058968, -75491032, -19363860, 59583544, 75100184, 18751290, -32347546, +-37635188, -37250252, -54767276, -44564580, 21100638, 85975048, 85095112, 34751656, -3085934, -8105677, +-8428873, -26249766, -52829708, -62334472, -32243930, 30965640, 78734800, 61895848, -5378373, -54467700, +-45957760, -11283953, 3053185, -2666638, 354872, 17393006, 27977416, 21667574, 7367480, }, }, { { 3446175, --204011, -23846196, -52114596, -57095148, -29986388, 2611340, 5036923, -25295746, -55882892, -60017336, --39953932, -4871030, 43847856, 85644336, 72697152, -8475581, -85297512, -62989992, 54970212, 156982672, -148635392, 47907140, -62916440, -138422496, -189236800, -230008384, -253524944, -252534416, -234389792, -207569856, --171629584, -125080720, -71781248, -16589311, 37920268, 89157080, 134070624, 171440592, 201639056, 224939248, -242043424, 254667408, 263904272, 269539808, 271831712, 272078112, 270801984, 267182944, 260721696, 251943312, -241457152, 229871488, 218583232, 209222352, 202222624, 196823312, 192198176, 187797984, 183002112, 177325248, -170842528, 163924944, 156742144, 149337616, 141901424, 134577424, 127103648, 118936768, 109767552, 99714648, -88896696, 77050104, 63917168, 49879064, 35686884, 21620328, 7586523, -5926518, -17868138, -27814208, --36255428, -43333000, -48244832, -50476068, -50791748, -50297288, -49199924, -47218872, -44614508, -41934452, --39023000, -35104380, -29783450, -23331336, -15924665, -7117298, 3712999, 16642998, 31121334, 46524160, -62676456, 79761840, 97699232, 115731112, 132824008, 148484000, 162958576, 176581136, 189124592, 199893680, -208319328, 214461136, 219077152, 223164352, 227175312, 230635984, 232696496, 233028288, 232094656, 230754640, -229811344, 229692704, 230215072, 230740144, 230807792, 230511424, 230201664, 230107168, 230344464, 230907104, -231461696, 231452032, 230528608, 228649568, 225833680, 222136240, 217763424, 212854816, 207249888, 200751072, -193433520, 185503392, 177138944, 168663904, 160532448, 153006592, 146134112, 140022384, 134765872, 130244344, -126378336, 123361128, 121290416, 119954680, 119273392, 119402240, 120142584, 120883464, 121341952, 121644208, -121653872, 121032176, 119935888, 118821880, 117758880, 116659904, 115715008, 114868360, 113551416, 111552648, -109263432, 106677320, 103307384, 99273336, 95068024, 90331752, 84431000, 77818904, 71178880, 64132988, -56488484, 49333068, 43240656, 37349572, 31592168, 27217208, 24106578, 20869782, 17935246, 16546362, -15436112, 13311177, 12393128, 13733695, 13445932, 10598369, 11399380, 16712791, 16895864, 10786810, -13023415, 25579752, 25152940, 5520107, 5433134, 53553412, 109159280, 110144976, 64105608, 32104344, -31825170, 25709138, 6568616, 18708340, 73229192, 112479824, 93217432, 48184700, 27605902, 28006408, -18255222, -5207648, -29517162, -56871808, -84257056, -80665392, -27346594, 38667592, 62351652, 41161356, -20950850, 27518930, 39184596, 31987306, 19144816, 27559194, 53057340, 60521996, 27237608, }, +-204011, -23846196, -52114596, -57095148, -29986388, 2611340, 5036923, -25295746, -55882892, -60017336, +-39953932, -4871030, 43847856, 85644336, 72697152, -8475581, -85297512, -62989992, 54970212, 156982672, +148635392, 47907140, -62916440, -138422496, -189236800, -230008384, -253524944, -252534416, -234389792, -207569856, +-171629584, -125080720, -71781248, -16589311, 37920268, 89157080, 134070624, 171440592, 201639056, 224939248, +242043424, 254667408, 263904272, 269539808, 271831712, 272078112, 270801984, 267182944, 260721696, 251943312, +241457152, 229871488, 218583232, 209222352, 202222624, 196823312, 192198176, 187797984, 183002112, 177325248, +170842528, 163924944, 156742144, 149337616, 141901424, 134577424, 127103648, 118936768, 109767552, 99714648, +88896696, 77050104, 63917168, 49879064, 35686884, 21620328, 7586523, -5926518, -17868138, -27814208, +-36255428, -43333000, -48244832, -50476068, -50791748, -50297288, -49199924, -47218872, -44614508, -41934452, +-39023000, -35104380, -29783450, -23331336, -15924665, -7117298, 3712999, 16642998, 31121334, 46524160, +62676456, 79761840, 97699232, 115731112, 132824008, 148484000, 162958576, 176581136, 189124592, 199893680, +208319328, 214461136, 219077152, 223164352, 227175312, 230635984, 232696496, 233028288, 232094656, 230754640, +229811344, 229692704, 230215072, 230740144, 230807792, 230511424, 230201664, 230107168, 230344464, 230907104, +231461696, 231452032, 230528608, 228649568, 225833680, 222136240, 217763424, 212854816, 207249888, 200751072, +193433520, 185503392, 177138944, 168663904, 160532448, 153006592, 146134112, 140022384, 134765872, 130244344, +126378336, 123361128, 121290416, 119954680, 119273392, 119402240, 120142584, 120883464, 121341952, 121644208, +121653872, 121032176, 119935888, 118821880, 117758880, 116659904, 115715008, 114868360, 113551416, 111552648, +109263432, 106677320, 103307384, 99273336, 95068024, 90331752, 84431000, 77818904, 71178880, 64132988, +56488484, 49333068, 43240656, 37349572, 31592168, 27217208, 24106578, 20869782, 17935246, 16546362, +15436112, 13311177, 12393128, 13733695, 13445932, 10598369, 11399380, 16712791, 16895864, 10786810, +13023415, 25579752, 25152940, 5520107, 5433134, 53553412, 109159280, 110144976, 64105608, 32104344, +31825170, 25709138, 6568616, 18708340, 73229192, 112479824, 93217432, 48184700, 27605902, 28006408, +18255222, -5207648, -29517162, -56871808, -84257056, -80665392, -27346594, 38667592, 62351652, 41161356, +20950850, 27518930, 39184596, 31987306, 19144816, 27559194, 53057340, 60521996, 27237608, }, { 3446175, --204011, -23846196, -52114596, -57095148, -29986388, 2611340, 5036923, -25295746, -55882892, -60017336, --39953932, -4871030, 43847856, 85644336, 72697152, -8475581, -85297512, -62989992, 54970212, 156982672, -148635392, 47907140, -62916440, -138422496, -189236800, -230008384, -253524944, -252534416, -234389792, -207569856, --171629584, -125080720, -71781248, -16589311, 37920268, 89157080, 134070624, 171440592, 201639056, 224939248, -242043424, 254667408, 263904272, 269539808, 271831712, 272078112, 270801984, 267182944, 260721696, 251943312, -241457152, 229871488, 218583232, 209222352, 202222624, 196823312, 192198176, 187797984, 183002112, 177325248, -170842528, 163924944, 156742144, 149337616, 141901424, 134577424, 127103648, 118936768, 109767552, 99714648, -88896696, 77050104, 63917168, 49879064, 35686884, 21620328, 7586523, -5926518, -17868138, -27814208, --36255428, -43333000, -48244832, -50476068, -50791748, -50297288, -49199924, -47218872, -44614508, -41934452, --39023000, -35104380, -29783450, -23331336, -15924665, -7117298, 3712999, 16642998, 31121334, 46524160, -62676456, 79761840, 97699232, 115731112, 132824008, 148484000, 162958576, 176581136, 189124592, 199893680, -208319328, 214461136, 219077152, 223164352, 227175312, 230635984, 232696496, 233028288, 232094656, 230754640, -229811344, 229692704, 230215072, 230740144, 230807792, 230511424, 230201664, 230107168, 230344464, 230907104, -231461696, 231452032, 230528608, 228649568, 225833680, 222136240, 217763424, 212854816, 207249888, 200751072, -193433520, 185503392, 177138944, 168663904, 160532448, 153006592, 146134112, 140022384, 134765872, 130244344, -126378336, 123361128, 121290416, 119954680, 119273392, 119402240, 120142584, 120883464, 121341952, 121644208, -121653872, 121032176, 119935888, 118821880, 117758880, 116659904, 115715008, 114868360, 113551416, 111552648, -109263432, 106677320, 103307384, 99273336, 95068024, 90331752, 84431000, 77818904, 71178880, 64132988, -56488484, 49333068, 43240656, 37349572, 31592168, 27217208, 24106578, 20869782, 17935246, 16546362, -15436112, 13311177, 12393128, 13733695, 13445932, 10598369, 11399380, 16712791, 16895864, 10786810, -13023415, 25579752, 25152940, 5520107, 5433134, 53553412, 109159280, 110144976, 64105608, 32104344, -31825170, 25709138, 6568616, 18708340, 73229192, 112479824, 93217432, 48184700, 27605902, 28006408, -18255222, -5207648, -29517162, -56871808, -84257056, -80665392, -27346594, 38667592, 62351652, 41161356, -20950850, 27518930, 39184596, 31987306, 19144816, 27559194, 53057340, 60521996, 27237608, }, +-204011, -23846196, -52114596, -57095148, -29986388, 2611340, 5036923, -25295746, -55882892, -60017336, +-39953932, -4871030, 43847856, 85644336, 72697152, -8475581, -85297512, -62989992, 54970212, 156982672, +148635392, 47907140, -62916440, -138422496, -189236800, -230008384, -253524944, -252534416, -234389792, -207569856, +-171629584, -125080720, -71781248, -16589311, 37920268, 89157080, 134070624, 171440592, 201639056, 224939248, +242043424, 254667408, 263904272, 269539808, 271831712, 272078112, 270801984, 267182944, 260721696, 251943312, +241457152, 229871488, 218583232, 209222352, 202222624, 196823312, 192198176, 187797984, 183002112, 177325248, +170842528, 163924944, 156742144, 149337616, 141901424, 134577424, 127103648, 118936768, 109767552, 99714648, +88896696, 77050104, 63917168, 49879064, 35686884, 21620328, 7586523, -5926518, -17868138, -27814208, +-36255428, -43333000, -48244832, -50476068, -50791748, -50297288, -49199924, -47218872, -44614508, -41934452, +-39023000, -35104380, -29783450, -23331336, -15924665, -7117298, 3712999, 16642998, 31121334, 46524160, +62676456, 79761840, 97699232, 115731112, 132824008, 148484000, 162958576, 176581136, 189124592, 199893680, +208319328, 214461136, 219077152, 223164352, 227175312, 230635984, 232696496, 233028288, 232094656, 230754640, +229811344, 229692704, 230215072, 230740144, 230807792, 230511424, 230201664, 230107168, 230344464, 230907104, +231461696, 231452032, 230528608, 228649568, 225833680, 222136240, 217763424, 212854816, 207249888, 200751072, +193433520, 185503392, 177138944, 168663904, 160532448, 153006592, 146134112, 140022384, 134765872, 130244344, +126378336, 123361128, 121290416, 119954680, 119273392, 119402240, 120142584, 120883464, 121341952, 121644208, +121653872, 121032176, 119935888, 118821880, 117758880, 116659904, 115715008, 114868360, 113551416, 111552648, +109263432, 106677320, 103307384, 99273336, 95068024, 90331752, 84431000, 77818904, 71178880, 64132988, +56488484, 49333068, 43240656, 37349572, 31592168, 27217208, 24106578, 20869782, 17935246, 16546362, +15436112, 13311177, 12393128, 13733695, 13445932, 10598369, 11399380, 16712791, 16895864, 10786810, +13023415, 25579752, 25152940, 5520107, 5433134, 53553412, 109159280, 110144976, 64105608, 32104344, +31825170, 25709138, 6568616, 18708340, 73229192, 112479824, 93217432, 48184700, 27605902, 28006408, +18255222, -5207648, -29517162, -56871808, -84257056, -80665392, -27346594, 38667592, 62351652, 41161356, +20950850, 27518930, 39184596, 31987306, 19144816, 27559194, 53057340, 60521996, 27237608, }, }, { { -2225330, --1968169, 6158983, 13817447, 11214160, 1439351, -3064459, -928250, -8775692, -40647572, -86008328, --111542984, -82070920, 9318468, 113516520, 141111680, 46847892, -94969776, -142930064, -40359272, 117732032, -193996688, 151521072, 55995100, -28795072, -94653560, -151199488, -189946544, -200638864, -190920960, -173208512, --149123952, -116706608, -79762376, -42197516, -2463164, 40505836, 82167016, 116783920, 142430784, 159909152, -170632064, 176767440, 180639344, 183267872, 184873648, 186086976, 187212800, 187352384, 185622576, 182334784, -178134848, 173134432, 167612704, 162464112, 158304448, 154957056, 152108416, 149671024, 147394144, 144867632, -141955648, 138645296, 134621984, 129568960, 123688080, 117348168, 110399448, 102380208, 93241592, 83318608, -72623064, 60706140, 47369732, 33063732, 18300856, 3044595, -12803298, -28537374, -42998528, -55863564, --67835784, -79229800, -89193048, -96977680, -103273024, -109301552, -114945672, -118789672, -119976688, -119090856, --117023904, -113776368, -108802256, -102050568, -94226752, -86180128, -78276312, -70336528, -62114892, -53812720, --46037216, -39275328, -33621004, -29006062, -25313464, -22121766, -18753974, -14859513, -10736344, -6897718, --3529926, -406948, 2980171, 7223062, 12537546, 18391586, 23873576, 28486908, 32414656, 36171140, -40293772, 45185204, 50880868, 57031796, 63330904, 69791072, 76509472, 83419000, 90373632, 97126392, -103161896, 107887432, 111051752, 112713360, 112941000, 111880136, 109895864, 107271104, 103991896, 100135016, -96173448, 92631704, 89830312, 88130584, 87942136, 89307400, 91908544, 95536176, 100127496, 105472048, -111369040, 117878600, 125004488, 132456792, 140041696, 147776400, 155345216, 162075952, 167646000, 172148736, -175450480, 177293024, 177915264, 177747760, 176772800, 174956560, 172788144, 170622400, 168202192, 165463616, -162873744, 160496480, 157845424, 154883504, 151892592, 148480240, 144195472, 139637984, 135422464, 130997040, -126027760, 121446640, 117606944, 113443512, 108729784, 104593192, 100958576, 96706560, 92480312, 89471688, -86388432, 82171312, 79161080, 78174848, 75229576, 69644504, 67556616, 69301448, 65283504, 55109264, -53410604, 61128660, 55084568, 31154082, 29526290, 77868296, 133987408, 135236704, 87899192, 51497732, -46257336, 40239012, 25975426, 39135744, 86180664, 117801824, 100321312, 61812632, 41196788, 36080408, -25941066, 7624641, -14322105, -36024040, -35353488, 14984604, 94637456, 136563312, 107327472, 51139640, -26530550, 33206002, 33858836, 17900350, 3644280, -3314104, -12925167, -20556250, -10763188, }, +-1968169, 6158983, 13817447, 11214160, 1439351, -3064459, -928250, -8775692, -40647572, -86008328, +-111542984, -82070920, 9318468, 113516520, 141111680, 46847892, -94969776, -142930064, -40359272, 117732032, +193996688, 151521072, 55995100, -28795072, -94653560, -151199488, -189946544, -200638864, -190920960, -173208512, +-149123952, -116706608, -79762376, -42197516, -2463164, 40505836, 82167016, 116783920, 142430784, 159909152, +170632064, 176767440, 180639344, 183267872, 184873648, 186086976, 187212800, 187352384, 185622576, 182334784, +178134848, 173134432, 167612704, 162464112, 158304448, 154957056, 152108416, 149671024, 147394144, 144867632, +141955648, 138645296, 134621984, 129568960, 123688080, 117348168, 110399448, 102380208, 93241592, 83318608, +72623064, 60706140, 47369732, 33063732, 18300856, 3044595, -12803298, -28537374, -42998528, -55863564, +-67835784, -79229800, -89193048, -96977680, -103273024, -109301552, -114945672, -118789672, -119976688, -119090856, +-117023904, -113776368, -108802256, -102050568, -94226752, -86180128, -78276312, -70336528, -62114892, -53812720, +-46037216, -39275328, -33621004, -29006062, -25313464, -22121766, -18753974, -14859513, -10736344, -6897718, +-3529926, -406948, 2980171, 7223062, 12537546, 18391586, 23873576, 28486908, 32414656, 36171140, +40293772, 45185204, 50880868, 57031796, 63330904, 69791072, 76509472, 83419000, 90373632, 97126392, +103161896, 107887432, 111051752, 112713360, 112941000, 111880136, 109895864, 107271104, 103991896, 100135016, +96173448, 92631704, 89830312, 88130584, 87942136, 89307400, 91908544, 95536176, 100127496, 105472048, +111369040, 117878600, 125004488, 132456792, 140041696, 147776400, 155345216, 162075952, 167646000, 172148736, +175450480, 177293024, 177915264, 177747760, 176772800, 174956560, 172788144, 170622400, 168202192, 165463616, +162873744, 160496480, 157845424, 154883504, 151892592, 148480240, 144195472, 139637984, 135422464, 130997040, +126027760, 121446640, 117606944, 113443512, 108729784, 104593192, 100958576, 96706560, 92480312, 89471688, +86388432, 82171312, 79161080, 78174848, 75229576, 69644504, 67556616, 69301448, 65283504, 55109264, +53410604, 61128660, 55084568, 31154082, 29526290, 77868296, 133987408, 135236704, 87899192, 51497732, +46257336, 40239012, 25975426, 39135744, 86180664, 117801824, 100321312, 61812632, 41196788, 36080408, +25941066, 7624641, -14322105, -36024040, -35353488, 14984604, 94637456, 136563312, 107327472, 51139640, +26530550, 33206002, 33858836, 17900350, 3644280, -3314104, -12925167, -20556250, -10763188, }, { 2225330, -1968169, -6158983, -13817447, -11214160, -1439351, 3064459, 928250, 8775692, 40647572, 86008328, -111542984, 82070920, -9318468, -113516520, -141111680, -46847892, 94969776, 142930064, 40359272, -117732032, --193996688, -151521072, -55995100, 28795072, 94653560, 151199488, 189946544, 200638864, 190920960, 173208512, -149123952, 116706608, 79762376, 42197516, 2463164, -40505836, -82167016, -116783920, -142430784, -159909152, --170632064, -176767440, -180639344, -183267872, -184873648, -186086976, -187212800, -187352384, -185622576, -182334784, --178134848, -173134432, -167612704, -162464112, -158304448, -154957056, -152108416, -149671024, -147394144, -144867632, --141955648, -138645296, -134621984, -129568960, -123688080, -117348168, -110399448, -102380208, -93241592, -83318608, --72623064, -60706140, -47369732, -33063732, -18300856, -3044595, 12803298, 28537374, 42998528, 55863564, -67835784, 79229800, 89193048, 96977680, 103273024, 109301552, 114945672, 118789672, 119976688, 119090856, -117023904, 113776368, 108802256, 102050568, 94226752, 86180128, 78276312, 70336528, 62114892, 53812720, -46037216, 39275328, 33621004, 29006062, 25313464, 22121766, 18753974, 14859513, 10736344, 6897718, -3529926, 406948, -2980171, -7223062, -12537546, -18391586, -23873576, -28486908, -32414656, -36171140, --40293772, -45185204, -50880868, -57031796, -63330904, -69791072, -76509472, -83419000, -90373632, -97126392, --103161896, -107887432, -111051752, -112713360, -112941000, -111880136, -109895864, -107271104, -103991896, -100135016, --96173448, -92631704, -89830312, -88130584, -87942136, -89307400, -91908544, -95536176, -100127496, -105472048, --111369040, -117878600, -125004488, -132456792, -140041696, -147776400, -155345216, -162075952, -167646000, -172148736, --175450480, -177293024, -177915264, -177747760, -176772800, -174956560, -172788144, -170622400, -168202192, -165463616, --162873744, -160496480, -157845424, -154883504, -151892592, -148480240, -144195472, -139637984, -135422464, -130997040, --126027760, -121446640, -117606944, -113443512, -108729784, -104593192, -100958576, -96706560, -92480312, -89471688, --86388432, -82171312, -79161080, -78174848, -75229576, -69644504, -67556616, -69301448, -65283504, -55109264, --53410604, -61128660, -55084568, -31154082, -29526290, -77868296, -133987408, -135236704, -87899192, -51497732, --46257336, -40239012, -25975426, -39135744, -86180664, -117801824, -100321312, -61812632, -41196788, -36080408, --25941066, -7624641, 14322105, 36024040, 35353488, -14984604, -94637456, -136563312, -107327472, -51139640, --26530550, -33206002, -33858836, -17900350, -3644280, 3314104, 12925167, 20556250, 10763188, }, +1968169, -6158983, -13817447, -11214160, -1439351, 3064459, 928250, 8775692, 40647572, 86008328, +111542984, 82070920, -9318468, -113516520, -141111680, -46847892, 94969776, 142930064, 40359272, -117732032, +-193996688, -151521072, -55995100, 28795072, 94653560, 151199488, 189946544, 200638864, 190920960, 173208512, +149123952, 116706608, 79762376, 42197516, 2463164, -40505836, -82167016, -116783920, -142430784, -159909152, +-170632064, -176767440, -180639344, -183267872, -184873648, -186086976, -187212800, -187352384, -185622576, -182334784, +-178134848, -173134432, -167612704, -162464112, -158304448, -154957056, -152108416, -149671024, -147394144, -144867632, +-141955648, -138645296, -134621984, -129568960, -123688080, -117348168, -110399448, -102380208, -93241592, -83318608, +-72623064, -60706140, -47369732, -33063732, -18300856, -3044595, 12803298, 28537374, 42998528, 55863564, +67835784, 79229800, 89193048, 96977680, 103273024, 109301552, 114945672, 118789672, 119976688, 119090856, +117023904, 113776368, 108802256, 102050568, 94226752, 86180128, 78276312, 70336528, 62114892, 53812720, +46037216, 39275328, 33621004, 29006062, 25313464, 22121766, 18753974, 14859513, 10736344, 6897718, +3529926, 406948, -2980171, -7223062, -12537546, -18391586, -23873576, -28486908, -32414656, -36171140, +-40293772, -45185204, -50880868, -57031796, -63330904, -69791072, -76509472, -83419000, -90373632, -97126392, +-103161896, -107887432, -111051752, -112713360, -112941000, -111880136, -109895864, -107271104, -103991896, -100135016, +-96173448, -92631704, -89830312, -88130584, -87942136, -89307400, -91908544, -95536176, -100127496, -105472048, +-111369040, -117878600, -125004488, -132456792, -140041696, -147776400, -155345216, -162075952, -167646000, -172148736, +-175450480, -177293024, -177915264, -177747760, -176772800, -174956560, -172788144, -170622400, -168202192, -165463616, +-162873744, -160496480, -157845424, -154883504, -151892592, -148480240, -144195472, -139637984, -135422464, -130997040, +-126027760, -121446640, -117606944, -113443512, -108729784, -104593192, -100958576, -96706560, -92480312, -89471688, +-86388432, -82171312, -79161080, -78174848, -75229576, -69644504, -67556616, -69301448, -65283504, -55109264, +-53410604, -61128660, -55084568, -31154082, -29526290, -77868296, -133987408, -135236704, -87899192, -51497732, +-46257336, -40239012, -25975426, -39135744, -86180664, -117801824, -100321312, -61812632, -41196788, -36080408, +-25941066, -7624641, 14322105, 36024040, 35353488, -14984604, -94637456, -136563312, -107327472, -51139640, +-26530550, -33206002, -33858836, -17900350, -3644280, 3314104, 12925167, 20556250, 10763188, }, }, { { -11633456, --12715788, 12792560, 18263274, -12629351, -26460220, 21744882, 86905976, 80966040, -10594611, -106126496, --122959544, -57123600, 33699388, 87169048, 69767448, -4167192, -68813432, -56982940, 24143622, 93236224, -87987240, 31314606, -12676059, -17874580, -4080219, 9590662, 23705536, 38931732, 46676092, 41782516, -28186260, 10654203, -8883066, -27856622, -43992812, -58518928, -73033768, -85168128, -91186448, -90479928, --84697832, -75187696, -63605780, -52536040, -43498892, -35870492, -28498718, -20794084, -12163884, -2105608, -9038222, 20708184, 33236604, 47214040, 62171800, 76826224, 90194312, 101713416, 110697952, 116401128, -118458960, 116876264, 111651432, 102568112, 89337464, 71894528, 50494320, 25478820, -2820183, -33770256, --66238060, -98885176, -130422048, -159560176, -185192016, -206752208, -223980400, -236382656, -243613760, -246335696, --245776816, -242294672, -235259520, -224608000, -211570624, -197400992, -182159232, -165314368, -146910960, -127420408, --106850200, -84780504, -61219928, -36779952, -11969537, 13087839, 38044820, 61965640, 83914000, 103569376, -120941984, 135637744, 146652736, 152961504, 154441648, 152350000, 148595664, 144171312, 138459008, 130358696, -119826904, 108059768, 96567504, 86388432, 77755552, 70118024, 62765580, 55661704, 49382996, 44306344, -40295920, 37040336, 34111704, 30863634, 26847840, 22164178, 16979080, 11103564, 4450660, -2598992, --9654550, -16572668, -23050016, -28622736, -33212446, -37021008, -39973260, -41962904, -43382928, -44648332, --45602352, -46068892, -46399604, -46832860, -47065864, -46939160, -46704012, -46290084, -45317272, -43932148, --42582452, -41093712, -39066484, -36768140, -34521336, -31913218, -28693602, -25490630, -22720376, -19980188, --17258252, -15257871, -14019847, -12853227, -11799886, -11412802, -11355357, -11072963, -11185169, -12369506, --14022531, -15709917, -18303004, -22199076, -26546120, -31270046, -37242736, -43883292, -49666464, -54925116, --60749092, -66045860, -69426000, -72148472, -75399224, -77537584, -77686296, -77916072, -78711720, -77787224, --75630080, -75049720, -74414600, -70523360, -66937064, -67662376, -66614404, -58616640, -53277460, -57761940, --57564372, -41883448, -32214402, -46751256, -52820580, -8381092, 57775900, 70812736, 17866528, -34949760, --45163192, -43890272, -59213640, -58918900, -12106439, 44909252, 53140556, 9370545, -40288940, -64476048, --72780368, -89085136, -116870352, -126028832, -77658376, 20669530, 96355984, 82265264, 1233729, -57616448, --47462072, -8155069, 4672388, -8897562, -14241575, -753230, 12420509, 12272332, 4403415, }, +-12715788, 12792560, 18263274, -12629351, -26460220, 21744882, 86905976, 80966040, -10594611, -106126496, +-122959544, -57123600, 33699388, 87169048, 69767448, -4167192, -68813432, -56982940, 24143622, 93236224, +87987240, 31314606, -12676059, -17874580, -4080219, 9590662, 23705536, 38931732, 46676092, 41782516, +28186260, 10654203, -8883066, -27856622, -43992812, -58518928, -73033768, -85168128, -91186448, -90479928, +-84697832, -75187696, -63605780, -52536040, -43498892, -35870492, -28498718, -20794084, -12163884, -2105608, +9038222, 20708184, 33236604, 47214040, 62171800, 76826224, 90194312, 101713416, 110697952, 116401128, +118458960, 116876264, 111651432, 102568112, 89337464, 71894528, 50494320, 25478820, -2820183, -33770256, +-66238060, -98885176, -130422048, -159560176, -185192016, -206752208, -223980400, -236382656, -243613760, -246335696, +-245776816, -242294672, -235259520, -224608000, -211570624, -197400992, -182159232, -165314368, -146910960, -127420408, +-106850200, -84780504, -61219928, -36779952, -11969537, 13087839, 38044820, 61965640, 83914000, 103569376, +120941984, 135637744, 146652736, 152961504, 154441648, 152350000, 148595664, 144171312, 138459008, 130358696, +119826904, 108059768, 96567504, 86388432, 77755552, 70118024, 62765580, 55661704, 49382996, 44306344, +40295920, 37040336, 34111704, 30863634, 26847840, 22164178, 16979080, 11103564, 4450660, -2598992, +-9654550, -16572668, -23050016, -28622736, -33212446, -37021008, -39973260, -41962904, -43382928, -44648332, +-45602352, -46068892, -46399604, -46832860, -47065864, -46939160, -46704012, -46290084, -45317272, -43932148, +-42582452, -41093712, -39066484, -36768140, -34521336, -31913218, -28693602, -25490630, -22720376, -19980188, +-17258252, -15257871, -14019847, -12853227, -11799886, -11412802, -11355357, -11072963, -11185169, -12369506, +-14022531, -15709917, -18303004, -22199076, -26546120, -31270046, -37242736, -43883292, -49666464, -54925116, +-60749092, -66045860, -69426000, -72148472, -75399224, -77537584, -77686296, -77916072, -78711720, -77787224, +-75630080, -75049720, -74414600, -70523360, -66937064, -67662376, -66614404, -58616640, -53277460, -57761940, +-57564372, -41883448, -32214402, -46751256, -52820580, -8381092, 57775900, 70812736, 17866528, -34949760, +-45163192, -43890272, -59213640, -58918900, -12106439, 44909252, 53140556, 9370545, -40288940, -64476048, +-72780368, -89085136, -116870352, -126028832, -77658376, 20669530, 96355984, 82265264, 1233729, -57616448, +-47462072, -8155069, 4672388, -8897562, -14241575, -753230, 12420509, 12272332, 4403415, }, { 11633456, -12715788, -12792560, -18263274, 12629351, 26460220, -21744882, -86905976, -80966040, 10594611, 106126496, -122959544, 57123600, -33699388, -87169048, -69767448, 4167192, 68813432, 56982940, -24143622, -93236224, --87987240, -31314606, 12676059, 17874580, 4080219, -9590662, -23705536, -38931732, -46676092, -41782516, --28186260, -10654203, 8883066, 27856622, 43992812, 58518928, 73033768, 85168128, 91186448, 90479928, -84697832, 75187696, 63605780, 52536040, 43498892, 35870492, 28498718, 20794084, 12163884, 2105608, --9038222, -20708184, -33236604, -47214040, -62171800, -76826224, -90194312, -101713416, -110697952, -116401128, --118458960, -116876264, -111651432, -102568112, -89337464, -71894528, -50494320, -25478820, 2820183, 33770256, -66238060, 98885176, 130422048, 159560176, 185192016, 206752208, 223980400, 236382656, 243613760, 246335696, -245776816, 242294672, 235259520, 224608000, 211570624, 197400992, 182159232, 165314368, 146910960, 127420408, -106850200, 84780504, 61219928, 36779952, 11969537, -13087839, -38044820, -61965640, -83914000, -103569376, --120941984, -135637744, -146652736, -152961504, -154441648, -152350000, -148595664, -144171312, -138459008, -130358696, --119826904, -108059768, -96567504, -86388432, -77755552, -70118024, -62765580, -55661704, -49382996, -44306344, --40295920, -37040336, -34111704, -30863634, -26847840, -22164178, -16979080, -11103564, -4450660, 2598992, -9654550, 16572668, 23050016, 28622736, 33212446, 37021008, 39973260, 41962904, 43382928, 44648332, -45602352, 46068892, 46399604, 46832860, 47065864, 46939160, 46704012, 46290084, 45317272, 43932148, -42582452, 41093712, 39066484, 36768140, 34521336, 31913218, 28693602, 25490630, 22720376, 19980188, -17258252, 15257871, 14019847, 12853227, 11799886, 11412802, 11355357, 11072963, 11185169, 12369506, -14022531, 15709917, 18303004, 22199076, 26546120, 31270046, 37242736, 43883292, 49666464, 54925116, -60749092, 66045860, 69426000, 72148472, 75399224, 77537584, 77686296, 77916072, 78711720, 77787224, -75630080, 75049720, 74414600, 70523360, 66937064, 67662376, 66614404, 58616640, 53277460, 57761940, -57564372, 41883448, 32214402, 46751256, 52820580, 8381092, -57775900, -70812736, -17866528, 34949760, -45163192, 43890272, 59213640, 58918900, 12106439, -44909252, -53140556, -9370545, 40288940, 64476048, -72780368, 89085136, 116870352, 126028832, 77658376, -20669530, -96355984, -82265264, -1233729, 57616448, -47462072, 8155069, -4672388, 8897562, 14241575, 753230, -12420509, -12272332, -4403415, }, +12715788, -12792560, -18263274, 12629351, 26460220, -21744882, -86905976, -80966040, 10594611, 106126496, +122959544, 57123600, -33699388, -87169048, -69767448, 4167192, 68813432, 56982940, -24143622, -93236224, +-87987240, -31314606, 12676059, 17874580, 4080219, -9590662, -23705536, -38931732, -46676092, -41782516, +-28186260, -10654203, 8883066, 27856622, 43992812, 58518928, 73033768, 85168128, 91186448, 90479928, +84697832, 75187696, 63605780, 52536040, 43498892, 35870492, 28498718, 20794084, 12163884, 2105608, +-9038222, -20708184, -33236604, -47214040, -62171800, -76826224, -90194312, -101713416, -110697952, -116401128, +-118458960, -116876264, -111651432, -102568112, -89337464, -71894528, -50494320, -25478820, 2820183, 33770256, +66238060, 98885176, 130422048, 159560176, 185192016, 206752208, 223980400, 236382656, 243613760, 246335696, +245776816, 242294672, 235259520, 224608000, 211570624, 197400992, 182159232, 165314368, 146910960, 127420408, +106850200, 84780504, 61219928, 36779952, 11969537, -13087839, -38044820, -61965640, -83914000, -103569376, +-120941984, -135637744, -146652736, -152961504, -154441648, -152350000, -148595664, -144171312, -138459008, -130358696, +-119826904, -108059768, -96567504, -86388432, -77755552, -70118024, -62765580, -55661704, -49382996, -44306344, +-40295920, -37040336, -34111704, -30863634, -26847840, -22164178, -16979080, -11103564, -4450660, 2598992, +9654550, 16572668, 23050016, 28622736, 33212446, 37021008, 39973260, 41962904, 43382928, 44648332, +45602352, 46068892, 46399604, 46832860, 47065864, 46939160, 46704012, 46290084, 45317272, 43932148, +42582452, 41093712, 39066484, 36768140, 34521336, 31913218, 28693602, 25490630, 22720376, 19980188, +17258252, 15257871, 14019847, 12853227, 11799886, 11412802, 11355357, 11072963, 11185169, 12369506, +14022531, 15709917, 18303004, 22199076, 26546120, 31270046, 37242736, 43883292, 49666464, 54925116, +60749092, 66045860, 69426000, 72148472, 75399224, 77537584, 77686296, 77916072, 78711720, 77787224, +75630080, 75049720, 74414600, 70523360, 66937064, 67662376, 66614404, 58616640, 53277460, 57761940, +57564372, 41883448, 32214402, 46751256, 52820580, 8381092, -57775900, -70812736, -17866528, 34949760, +45163192, 43890272, 59213640, 58918900, 12106439, -44909252, -53140556, -9370545, 40288940, 64476048, +72780368, 89085136, 116870352, 126028832, 77658376, -20669530, -96355984, -82265264, -1233729, 57616448, +47462072, 8155069, -4672388, 8897562, 14241575, 753230, -12420509, -12272332, -4403415, }, }, { { 1873680, --3342558, -19244674, -27656906, -22355304, -19368156, -24668682, -14368276, 35566088, 115204984, 187445792, -207972512, 133678712, -40381820, -220773136, -249746976, -72728288, 156203136, 219099168, 80410376, -88923000, --134445904, -75266080, -14714558, 11208254, 32719598, 56719876, 56432648, 28938952, 3604015, -2774012, --493921, 44023, 623844, 1908576, -689342, -7561827, -14534706, -20530480, -27339078, -34963720, --42800424, -51575040, -60615948, -67405216, -71713072, -75916768, -80622976, -84235584, -86635936, -89183384, --91638496, -92573192, -91874720, -90047208, -86417424, -80261128, -72179072, -62777928, -51649128, -38638600, --24369108, -8988293, 7864622, 25739202, 43609488, 61118460, 78132432, 93664648, 106606456, 116818816, -124399968, 128720168, 129075040, 125471560, 118142736, 107078904, 92366496, 74322800, 53285512, 29830158, -4844723, -21139292, -48130476, -75797584, -103187664, -129672576, -155294736, -179954832, -203204032, -224887168, --244870576, -262082128, -274927840, -282757568, -286034624, -285112800, -279649600, -269137696, -253551776, -233815328, --211990992, -190447984, -170416256, -151812592, -134632192, -119826904, -108681464, -101978632, -99884832, -101988296, --107322640, -114817360, -123800824, -133918152, -144834880, -156276688, -167954160, -179187104, -188990368, -196777152, --202669840, -207099024, -210479712, -213223648, -215589104, -217503056, -218880128, -219979632, -221099008, -222103504, --222602784, -222417024, -221578432, -220112784, -218076960, -215601984, -212652960, -208877680, -203807472, -197126656, --188761136, -178910080, -167981008, -156358816, -144291568, -132064872, -120104464, -108753944, -98115304, -88228832, --79218528, -71134856, -63835024, -57146152, -51018844, -45420352, -40235252, -35341676, -30671436, -26133802, --21595632, -16984448, -12326556, -7702487, -3257733, 802085, 4425964, 7874823, 11486890, 15340013, -19361712, 23628226, 28253906, 33103460, 37936372, 42713448, 47430396, 51872468, 55884504, 59576564, -62923956, 65588984, 67455680, 68768328, 69464120, 69151656, 67971616, 66530116, 64882996, 62704912, -60319596, 58182848, 55834036, 52952116, 50392316, 48293148, 45027900, 40353364, 36657008, 34141232, -29250874, 21852794, 17468706, 16530792, 10105521, -4660040, -14901926, -10554345, -1905892, -2388539, --5411659, -14496, 1378148, -20427938, -52753472, -61199524, -39141648, -15971373, -12524125, -18922552, --21503828, -20447266, -14762876, -2520609, -2463701, -38536596, -92413736, -110900888, -76509472, -31289374, --12119324, -5588826, 8677981, 18663244, 20618528, 49403400, 113965880, 143392848, 67788008, }, +-3342558, -19244674, -27656906, -22355304, -19368156, -24668682, -14368276, 35566088, 115204984, 187445792, +207972512, 133678712, -40381820, -220773136, -249746976, -72728288, 156203136, 219099168, 80410376, -88923000, +-134445904, -75266080, -14714558, 11208254, 32719598, 56719876, 56432648, 28938952, 3604015, -2774012, +-493921, 44023, 623844, 1908576, -689342, -7561827, -14534706, -20530480, -27339078, -34963720, +-42800424, -51575040, -60615948, -67405216, -71713072, -75916768, -80622976, -84235584, -86635936, -89183384, +-91638496, -92573192, -91874720, -90047208, -86417424, -80261128, -72179072, -62777928, -51649128, -38638600, +-24369108, -8988293, 7864622, 25739202, 43609488, 61118460, 78132432, 93664648, 106606456, 116818816, +124399968, 128720168, 129075040, 125471560, 118142736, 107078904, 92366496, 74322800, 53285512, 29830158, +4844723, -21139292, -48130476, -75797584, -103187664, -129672576, -155294736, -179954832, -203204032, -224887168, +-244870576, -262082128, -274927840, -282757568, -286034624, -285112800, -279649600, -269137696, -253551776, -233815328, +-211990992, -190447984, -170416256, -151812592, -134632192, -119826904, -108681464, -101978632, -99884832, -101988296, +-107322640, -114817360, -123800824, -133918152, -144834880, -156276688, -167954160, -179187104, -188990368, -196777152, +-202669840, -207099024, -210479712, -213223648, -215589104, -217503056, -218880128, -219979632, -221099008, -222103504, +-222602784, -222417024, -221578432, -220112784, -218076960, -215601984, -212652960, -208877680, -203807472, -197126656, +-188761136, -178910080, -167981008, -156358816, -144291568, -132064872, -120104464, -108753944, -98115304, -88228832, +-79218528, -71134856, -63835024, -57146152, -51018844, -45420352, -40235252, -35341676, -30671436, -26133802, +-21595632, -16984448, -12326556, -7702487, -3257733, 802085, 4425964, 7874823, 11486890, 15340013, +19361712, 23628226, 28253906, 33103460, 37936372, 42713448, 47430396, 51872468, 55884504, 59576564, +62923956, 65588984, 67455680, 68768328, 69464120, 69151656, 67971616, 66530116, 64882996, 62704912, +60319596, 58182848, 55834036, 52952116, 50392316, 48293148, 45027900, 40353364, 36657008, 34141232, +29250874, 21852794, 17468706, 16530792, 10105521, -4660040, -14901926, -10554345, -1905892, -2388539, +-5411659, -14496, 1378148, -20427938, -52753472, -61199524, -39141648, -15971373, -12524125, -18922552, +-21503828, -20447266, -14762876, -2520609, -2463701, -38536596, -92413736, -110900888, -76509472, -31289374, +-12119324, -5588826, 8677981, 18663244, 20618528, 49403400, 113965880, 143392848, 67788008, }, { 1873680, --3342558, -19244674, -27656906, -22355304, -19368156, -24668682, -14368276, 35566088, 115204984, 187445792, -207972512, 133678712, -40381820, -220773136, -249746976, -72728288, 156203136, 219099168, 80410376, -88923000, --134445904, -75266080, -14714558, 11208254, 32719598, 56719876, 56432648, 28938952, 3604015, -2774012, --493921, 44023, 623844, 1908576, -689342, -7561827, -14534706, -20530480, -27339078, -34963720, --42800424, -51575040, -60615948, -67405216, -71713072, -75916768, -80622976, -84235584, -86635936, -89183384, --91638496, -92573192, -91874720, -90047208, -86417424, -80261128, -72179072, -62777928, -51649128, -38638600, --24369108, -8988293, 7864622, 25739202, 43609488, 61118460, 78132432, 93664648, 106606456, 116818816, -124399968, 128720168, 129075040, 125471560, 118142736, 107078904, 92366496, 74322800, 53285512, 29830158, -4844723, -21139292, -48130476, -75797584, -103187664, -129672576, -155294736, -179954832, -203204032, -224887168, --244870576, -262082128, -274927840, -282757568, -286034624, -285112800, -279649600, -269137696, -253551776, -233815328, --211990992, -190447984, -170416256, -151812592, -134632192, -119826904, -108681464, -101978632, -99884832, -101988296, --107322640, -114817360, -123800824, -133918152, -144834880, -156276688, -167954160, -179187104, -188990368, -196777152, --202669840, -207099024, -210479712, -213223648, -215589104, -217503056, -218880128, -219979632, -221099008, -222103504, --222602784, -222417024, -221578432, -220112784, -218076960, -215601984, -212652960, -208877680, -203807472, -197126656, --188761136, -178910080, -167981008, -156358816, -144291568, -132064872, -120104464, -108753944, -98115304, -88228832, --79218528, -71134856, -63835024, -57146152, -51018844, -45420352, -40235252, -35341676, -30671436, -26133802, --21595632, -16984448, -12326556, -7702487, -3257733, 802085, 4425964, 7874823, 11486890, 15340013, -19361712, 23628226, 28253906, 33103460, 37936372, 42713448, 47430396, 51872468, 55884504, 59576564, -62923956, 65588984, 67455680, 68768328, 69464120, 69151656, 67971616, 66530116, 64882996, 62704912, -60319596, 58182848, 55834036, 52952116, 50392316, 48293148, 45027900, 40353364, 36657008, 34141232, -29250874, 21852794, 17468706, 16530792, 10105521, -4660040, -14901926, -10554345, -1905892, -2388539, --5411659, -14496, 1378148, -20427938, -52753472, -61199524, -39141648, -15971373, -12524125, -18922552, --21503828, -20447266, -14762876, -2520609, -2463701, -38536596, -92413736, -110900888, -76509472, -31289374, --12119324, -5588826, 8677981, 18663244, 20618528, 49403400, 113965880, 143392848, 67788008, }, +-3342558, -19244674, -27656906, -22355304, -19368156, -24668682, -14368276, 35566088, 115204984, 187445792, +207972512, 133678712, -40381820, -220773136, -249746976, -72728288, 156203136, 219099168, 80410376, -88923000, +-134445904, -75266080, -14714558, 11208254, 32719598, 56719876, 56432648, 28938952, 3604015, -2774012, +-493921, 44023, 623844, 1908576, -689342, -7561827, -14534706, -20530480, -27339078, -34963720, +-42800424, -51575040, -60615948, -67405216, -71713072, -75916768, -80622976, -84235584, -86635936, -89183384, +-91638496, -92573192, -91874720, -90047208, -86417424, -80261128, -72179072, -62777928, -51649128, -38638600, +-24369108, -8988293, 7864622, 25739202, 43609488, 61118460, 78132432, 93664648, 106606456, 116818816, +124399968, 128720168, 129075040, 125471560, 118142736, 107078904, 92366496, 74322800, 53285512, 29830158, +4844723, -21139292, -48130476, -75797584, -103187664, -129672576, -155294736, -179954832, -203204032, -224887168, +-244870576, -262082128, -274927840, -282757568, -286034624, -285112800, -279649600, -269137696, -253551776, -233815328, +-211990992, -190447984, -170416256, -151812592, -134632192, -119826904, -108681464, -101978632, -99884832, -101988296, +-107322640, -114817360, -123800824, -133918152, -144834880, -156276688, -167954160, -179187104, -188990368, -196777152, +-202669840, -207099024, -210479712, -213223648, -215589104, -217503056, -218880128, -219979632, -221099008, -222103504, +-222602784, -222417024, -221578432, -220112784, -218076960, -215601984, -212652960, -208877680, -203807472, -197126656, +-188761136, -178910080, -167981008, -156358816, -144291568, -132064872, -120104464, -108753944, -98115304, -88228832, +-79218528, -71134856, -63835024, -57146152, -51018844, -45420352, -40235252, -35341676, -30671436, -26133802, +-21595632, -16984448, -12326556, -7702487, -3257733, 802085, 4425964, 7874823, 11486890, 15340013, +19361712, 23628226, 28253906, 33103460, 37936372, 42713448, 47430396, 51872468, 55884504, 59576564, +62923956, 65588984, 67455680, 68768328, 69464120, 69151656, 67971616, 66530116, 64882996, 62704912, +60319596, 58182848, 55834036, 52952116, 50392316, 48293148, 45027900, 40353364, 36657008, 34141232, +29250874, 21852794, 17468706, 16530792, 10105521, -4660040, -14901926, -10554345, -1905892, -2388539, +-5411659, -14496, 1378148, -20427938, -52753472, -61199524, -39141648, -15971373, -12524125, -18922552, +-21503828, -20447266, -14762876, -2520609, -2463701, -38536596, -92413736, -110900888, -76509472, -31289374, +-12119324, -5588826, 8677981, 18663244, 20618528, 49403400, 113965880, 143392848, 67788008, }, }, { { -19043884, --43914968, -38262252, -1210644, 55222544, 103580656, 104854648, 41815800, -48219060, -98342936, -79811232, --27014270, 11771968, 25251186, 27530204, 21311628, 423054, -23129472, -24757802, -1234803, 23149874, -29137058, 23870354, 23459648, 29103772, 30188252, 21255256, 5424544, -13989245, -35932232, -57081724, --71927816, -78420736, -79843440, -80427560, -81427752, -81558208, -78913048, -71798968, -59414432, -42890080, --25060598, -8555575, 5655398, 17808008, 28244778, 37237368, 45284524, 52852792, 59964184, 66443144, -72349800, 77808704, 82662552, 86696064, 89984400, 92640296, 94380832, 94751272, 93707056, 91681984, -89125400, 86281064, 83486648, 81406272, 80671832, 81307488, 82813952, 84937808, 88006568, 92246232, -97188128, 102227736, 107407472, 113055888, 118871808, 123967248, 127667368, 129718752, 129829344, 127503624, -122321744, 114165600, 103276248, 90096600, 74759272, 56898116, 36531920, 14866492, -6754910, -28671054, --52594560, -79236240, -107203992, -134600512, -160846528, -186407488, -211295216, -234419856, -254366224, -270582944, --283647168, -294197728, -301790720, -305295392, -304413856, -300247744, -294231040, -286901120, -277723328, -265717808, --250344512, -232193456, -212747440, -193219312, -173814112, -154246240, -134529648, -115035864, -96240016, -78633872, --62454732, -47388520, -32900524, -18815178, -5185100, 8209830, 21780852, 35743256, 50075024, 64490008, -78244640, 90542208, 101380016, 111477488, 121334440, 130941208, 140193632, 148746528, 155699536, 160357440, -163121792, 164887008, 165994048, 166473472, 166606608, 166391328, 165169952, 162598336, 159321808, 156156960, -153387776, 151220432, 149974896, 149471312, 149054160, 148359984, 147387712, 146072368, 144525120, 143221584, -142293344, 141271680, 139971376, 138650128, 137006768, 134275712, 130547680, 126651072, 122752848, 118513184, -114306800, 110740360, 107516992, 104217384, 101331704, 99189048, 97191352, 95255936, 94279360, 94262184, -94076960, 93668408, 93980864, 94576256, 94197760, 93305480, 92939872, 92204360, 90170688, 88225072, -87094960, 84780504, 80922016, 78442208, 77275048, 73243152, 66924716, 64326800, 64422360, 58594628, -48184164, 46018964, 51507396, 44683768, 20112794, 5031554, 21172578, 47353624, 48104708, 25314538, -9361418, 7545184, -2579665, -27305792, -39609800, -20830592, 7098507, 10118406, -13167296, -34975528, --39409008, -40161164, -53462680, -68065568, -55893092, -10875931, 35991824, 48624936, 26519812, 2823941, -3407520, 19760070, 26929982, 18486612, 13001940, 26946088, 50138912, 54092428, 23716272, }, +-43914968, -38262252, -1210644, 55222544, 103580656, 104854648, 41815800, -48219060, -98342936, -79811232, +-27014270, 11771968, 25251186, 27530204, 21311628, 423054, -23129472, -24757802, -1234803, 23149874, +29137058, 23870354, 23459648, 29103772, 30188252, 21255256, 5424544, -13989245, -35932232, -57081724, +-71927816, -78420736, -79843440, -80427560, -81427752, -81558208, -78913048, -71798968, -59414432, -42890080, +-25060598, -8555575, 5655398, 17808008, 28244778, 37237368, 45284524, 52852792, 59964184, 66443144, +72349800, 77808704, 82662552, 86696064, 89984400, 92640296, 94380832, 94751272, 93707056, 91681984, +89125400, 86281064, 83486648, 81406272, 80671832, 81307488, 82813952, 84937808, 88006568, 92246232, +97188128, 102227736, 107407472, 113055888, 118871808, 123967248, 127667368, 129718752, 129829344, 127503624, +122321744, 114165600, 103276248, 90096600, 74759272, 56898116, 36531920, 14866492, -6754910, -28671054, +-52594560, -79236240, -107203992, -134600512, -160846528, -186407488, -211295216, -234419856, -254366224, -270582944, +-283647168, -294197728, -301790720, -305295392, -304413856, -300247744, -294231040, -286901120, -277723328, -265717808, +-250344512, -232193456, -212747440, -193219312, -173814112, -154246240, -134529648, -115035864, -96240016, -78633872, +-62454732, -47388520, -32900524, -18815178, -5185100, 8209830, 21780852, 35743256, 50075024, 64490008, +78244640, 90542208, 101380016, 111477488, 121334440, 130941208, 140193632, 148746528, 155699536, 160357440, +163121792, 164887008, 165994048, 166473472, 166606608, 166391328, 165169952, 162598336, 159321808, 156156960, +153387776, 151220432, 149974896, 149471312, 149054160, 148359984, 147387712, 146072368, 144525120, 143221584, +142293344, 141271680, 139971376, 138650128, 137006768, 134275712, 130547680, 126651072, 122752848, 118513184, +114306800, 110740360, 107516992, 104217384, 101331704, 99189048, 97191352, 95255936, 94279360, 94262184, +94076960, 93668408, 93980864, 94576256, 94197760, 93305480, 92939872, 92204360, 90170688, 88225072, +87094960, 84780504, 80922016, 78442208, 77275048, 73243152, 66924716, 64326800, 64422360, 58594628, +48184164, 46018964, 51507396, 44683768, 20112794, 5031554, 21172578, 47353624, 48104708, 25314538, +9361418, 7545184, -2579665, -27305792, -39609800, -20830592, 7098507, 10118406, -13167296, -34975528, +-39409008, -40161164, -53462680, -68065568, -55893092, -10875931, 35991824, 48624936, 26519812, 2823941, +3407520, 19760070, 26929982, 18486612, 13001940, 26946088, 50138912, 54092428, 23716272, }, { -19043884, --43914968, -38262252, -1210644, 55222544, 103580656, 104854648, 41815800, -48219060, -98342936, -79811232, --27014270, 11771968, 25251186, 27530204, 21311628, 423054, -23129472, -24757802, -1234803, 23149874, -29137058, 23870354, 23459648, 29103772, 30188252, 21255256, 5424544, -13989245, -35932232, -57081724, --71927816, -78420736, -79843440, -80427560, -81427752, -81558208, -78913048, -71798968, -59414432, -42890080, --25060598, -8555575, 5655398, 17808008, 28244778, 37237368, 45284524, 52852792, 59964184, 66443144, -72349800, 77808704, 82662552, 86696064, 89984400, 92640296, 94380832, 94751272, 93707056, 91681984, -89125400, 86281064, 83486648, 81406272, 80671832, 81307488, 82813952, 84937808, 88006568, 92246232, -97188128, 102227736, 107407472, 113055888, 118871808, 123967248, 127667368, 129718752, 129829344, 127503624, -122321744, 114165600, 103276248, 90096600, 74759272, 56898116, 36531920, 14866492, -6754910, -28671054, --52594560, -79236240, -107203992, -134600512, -160846528, -186407488, -211295216, -234419856, -254366224, -270582944, --283647168, -294197728, -301790720, -305295392, -304413856, -300247744, -294231040, -286901120, -277723328, -265717808, --250344512, -232193456, -212747440, -193219312, -173814112, -154246240, -134529648, -115035864, -96240016, -78633872, --62454732, -47388520, -32900524, -18815178, -5185100, 8209830, 21780852, 35743256, 50075024, 64490008, -78244640, 90542208, 101380016, 111477488, 121334440, 130941208, 140193632, 148746528, 155699536, 160357440, -163121792, 164887008, 165994048, 166473472, 166606608, 166391328, 165169952, 162598336, 159321808, 156156960, -153387776, 151220432, 149974896, 149471312, 149054160, 148359984, 147387712, 146072368, 144525120, 143221584, -142293344, 141271680, 139971376, 138650128, 137006768, 134275712, 130547680, 126651072, 122752848, 118513184, -114306800, 110740360, 107516992, 104217384, 101331704, 99189048, 97191352, 95255936, 94279360, 94262184, -94076960, 93668408, 93980864, 94576256, 94197760, 93305480, 92939872, 92204360, 90170688, 88225072, -87094960, 84780504, 80922016, 78442208, 77275048, 73243152, 66924716, 64326800, 64422360, 58594628, -48184164, 46018964, 51507396, 44683768, 20112794, 5031554, 21172578, 47353624, 48104708, 25314538, -9361418, 7545184, -2579665, -27305792, -39609800, -20830592, 7098507, 10118406, -13167296, -34975528, --39409008, -40161164, -53462680, -68065568, -55893092, -10875931, 35991824, 48624936, 26519812, 2823941, -3407520, 19760070, 26929982, 18486612, 13001940, 26946088, 50138912, 54092428, 23716272, }, +-43914968, -38262252, -1210644, 55222544, 103580656, 104854648, 41815800, -48219060, -98342936, -79811232, +-27014270, 11771968, 25251186, 27530204, 21311628, 423054, -23129472, -24757802, -1234803, 23149874, +29137058, 23870354, 23459648, 29103772, 30188252, 21255256, 5424544, -13989245, -35932232, -57081724, +-71927816, -78420736, -79843440, -80427560, -81427752, -81558208, -78913048, -71798968, -59414432, -42890080, +-25060598, -8555575, 5655398, 17808008, 28244778, 37237368, 45284524, 52852792, 59964184, 66443144, +72349800, 77808704, 82662552, 86696064, 89984400, 92640296, 94380832, 94751272, 93707056, 91681984, +89125400, 86281064, 83486648, 81406272, 80671832, 81307488, 82813952, 84937808, 88006568, 92246232, +97188128, 102227736, 107407472, 113055888, 118871808, 123967248, 127667368, 129718752, 129829344, 127503624, +122321744, 114165600, 103276248, 90096600, 74759272, 56898116, 36531920, 14866492, -6754910, -28671054, +-52594560, -79236240, -107203992, -134600512, -160846528, -186407488, -211295216, -234419856, -254366224, -270582944, +-283647168, -294197728, -301790720, -305295392, -304413856, -300247744, -294231040, -286901120, -277723328, -265717808, +-250344512, -232193456, -212747440, -193219312, -173814112, -154246240, -134529648, -115035864, -96240016, -78633872, +-62454732, -47388520, -32900524, -18815178, -5185100, 8209830, 21780852, 35743256, 50075024, 64490008, +78244640, 90542208, 101380016, 111477488, 121334440, 130941208, 140193632, 148746528, 155699536, 160357440, +163121792, 164887008, 165994048, 166473472, 166606608, 166391328, 165169952, 162598336, 159321808, 156156960, +153387776, 151220432, 149974896, 149471312, 149054160, 148359984, 147387712, 146072368, 144525120, 143221584, +142293344, 141271680, 139971376, 138650128, 137006768, 134275712, 130547680, 126651072, 122752848, 118513184, +114306800, 110740360, 107516992, 104217384, 101331704, 99189048, 97191352, 95255936, 94279360, 94262184, +94076960, 93668408, 93980864, 94576256, 94197760, 93305480, 92939872, 92204360, 90170688, 88225072, +87094960, 84780504, 80922016, 78442208, 77275048, 73243152, 66924716, 64326800, 64422360, 58594628, +48184164, 46018964, 51507396, 44683768, 20112794, 5031554, 21172578, 47353624, 48104708, 25314538, +9361418, 7545184, -2579665, -27305792, -39609800, -20830592, 7098507, 10118406, -13167296, -34975528, +-39409008, -40161164, -53462680, -68065568, -55893092, -10875931, 35991824, 48624936, 26519812, 2823941, +3407520, 19760070, 26929982, 18486612, 13001940, 26946088, 50138912, 54092428, 23716272, }, }, { { 22912576, -33083060, -15137612, -77247672, -120297736, -152744064, -162527472, -98063768, 53420804, 225633424, 342901600, -368999968, 262932528, -8273181, -334095840, -445709152, -187704032, 234369392, 430890432, 258872176, -54666880, --231026288, -234318928, -195415648, -183787552, -168180720, -128274568, -89106072, -61837328, -28456306, 16117939, -55568824, 82885888, 105637408, 125082872, 134603744, 133938552, 127843456, 116640040, 99855304, 82162184, -67347768, 53308596, 38053948, 23500988, 10541997, -2518462, -15147813, -24635932, -31176094, -37507412, --44420164, -51113868, -58128624, -66110284, -73897056, -80638544, -87209848, -93788128, -99032280, -102709312, --106020192, -108920904, -110194904, -109961904, -109219408, -107584096, -104145440, -99537480, -94908576, -90141160, --84906672, -79914312, -75686448, -71660456, -67447632, -63418412, -59664076, -55971476, -52758304, -50490024, --48571248, -46197204, -43537008, -40852120, -37523520, -33078764, -28085328, -23219666, -18641232, -14722611, --12118787, -10951093, -11154567, -13344463, -17927194, -23760296, -29066192, -33188822, -36287640, -37961068, --37246492, -33403034, -26076894, -15426449, -2415919, 11868605, 27242440, 43924632, 61286500, 78111496, -93715112, 107930384, 120553824, 131646656, 141690432, 150730800, 158116000, 163587792, 167816720, 171597904, -175348480, 179357840, 183519664, 186957248, 188903936, 189707632, 190191888, 190584336, 190813584, 191065920, -191285488, 190901088, 189672192, 188022400, 186193280, 183966336, 181352304, 178589040, 175419888, 171292960, -166147056, 160202816, 153353424, 145516720, 137107168, 128511328, 119673896, 110619568, 101676912, 92926984, -84211960, 75754632, 67987184, 60909080, 54394688, 48741972, 44157096, 40261024, 36796060, 34086472, -32245004, 30837328, 29772176, 29517700, 30151208, 31197568, 32465658, 34006476, 35463008, 36461588, -37243272, 38035692, 38538740, 38768524, 39375724, 40481676, 41403484, 41928544, 42491724, 42966316, -42817064, 42306500, 42020888, 41728292, 41157060, 40897752, 41180148, 41191956, 40722732, 40543956, -40480068, 39620000, 38581692, 38432976, 38014220, 36214628, 35186520, 36433672, 36713916, 34064460, -33306398, 37192268, 38308960, 31653908, 28657632, 42315092, 62512176, 65438660, 47303696, 29169808, -25497610, 26946624, 20507396, 9653476, 5276904, 8847096, 13584982, 14318347, 9484898, -607201, --13053479, -25279104, -41357852, -68102616, -99225016, -110134232, -80648208, -24404004, 17795660, 24222542, -19369228, 35908076, 62372052, 65007552, 59028420, 102312560, 191254352, 219296736, 99885904, }, +33083060, -15137612, -77247672, -120297736, -152744064, -162527472, -98063768, 53420804, 225633424, 342901600, +368999968, 262932528, -8273181, -334095840, -445709152, -187704032, 234369392, 430890432, 258872176, -54666880, +-231026288, -234318928, -195415648, -183787552, -168180720, -128274568, -89106072, -61837328, -28456306, 16117939, +55568824, 82885888, 105637408, 125082872, 134603744, 133938552, 127843456, 116640040, 99855304, 82162184, +67347768, 53308596, 38053948, 23500988, 10541997, -2518462, -15147813, -24635932, -31176094, -37507412, +-44420164, -51113868, -58128624, -66110284, -73897056, -80638544, -87209848, -93788128, -99032280, -102709312, +-106020192, -108920904, -110194904, -109961904, -109219408, -107584096, -104145440, -99537480, -94908576, -90141160, +-84906672, -79914312, -75686448, -71660456, -67447632, -63418412, -59664076, -55971476, -52758304, -50490024, +-48571248, -46197204, -43537008, -40852120, -37523520, -33078764, -28085328, -23219666, -18641232, -14722611, +-12118787, -10951093, -11154567, -13344463, -17927194, -23760296, -29066192, -33188822, -36287640, -37961068, +-37246492, -33403034, -26076894, -15426449, -2415919, 11868605, 27242440, 43924632, 61286500, 78111496, +93715112, 107930384, 120553824, 131646656, 141690432, 150730800, 158116000, 163587792, 167816720, 171597904, +175348480, 179357840, 183519664, 186957248, 188903936, 189707632, 190191888, 190584336, 190813584, 191065920, +191285488, 190901088, 189672192, 188022400, 186193280, 183966336, 181352304, 178589040, 175419888, 171292960, +166147056, 160202816, 153353424, 145516720, 137107168, 128511328, 119673896, 110619568, 101676912, 92926984, +84211960, 75754632, 67987184, 60909080, 54394688, 48741972, 44157096, 40261024, 36796060, 34086472, +32245004, 30837328, 29772176, 29517700, 30151208, 31197568, 32465658, 34006476, 35463008, 36461588, +37243272, 38035692, 38538740, 38768524, 39375724, 40481676, 41403484, 41928544, 42491724, 42966316, +42817064, 42306500, 42020888, 41728292, 41157060, 40897752, 41180148, 41191956, 40722732, 40543956, +40480068, 39620000, 38581692, 38432976, 38014220, 36214628, 35186520, 36433672, 36713916, 34064460, +33306398, 37192268, 38308960, 31653908, 28657632, 42315092, 62512176, 65438660, 47303696, 29169808, +25497610, 26946624, 20507396, 9653476, 5276904, 8847096, 13584982, 14318347, 9484898, -607201, +-13053479, -25279104, -41357852, -68102616, -99225016, -110134232, -80648208, -24404004, 17795660, 24222542, +19369228, 35908076, 62372052, 65007552, 59028420, 102312560, 191254352, 219296736, 99885904, }, { 22912576, -33083060, -15137612, -77247672, -120297736, -152744064, -162527472, -98063768, 53420804, 225633424, 342901600, -368999968, 262932528, -8273181, -334095840, -445709152, -187704032, 234369392, 430890432, 258872176, -54666880, --231026288, -234318928, -195415648, -183787552, -168180720, -128274568, -89106072, -61837328, -28456306, 16117939, -55568824, 82885888, 105637408, 125082872, 134603744, 133938552, 127843456, 116640040, 99855304, 82162184, -67347768, 53308596, 38053948, 23500988, 10541997, -2518462, -15147813, -24635932, -31176094, -37507412, --44420164, -51113868, -58128624, -66110284, -73897056, -80638544, -87209848, -93788128, -99032280, -102709312, --106020192, -108920904, -110194904, -109961904, -109219408, -107584096, -104145440, -99537480, -94908576, -90141160, --84906672, -79914312, -75686448, -71660456, -67447632, -63418412, -59664076, -55971476, -52758304, -50490024, --48571248, -46197204, -43537008, -40852120, -37523520, -33078764, -28085328, -23219666, -18641232, -14722611, --12118787, -10951093, -11154567, -13344463, -17927194, -23760296, -29066192, -33188822, -36287640, -37961068, --37246492, -33403034, -26076894, -15426449, -2415919, 11868605, 27242440, 43924632, 61286500, 78111496, -93715112, 107930384, 120553824, 131646656, 141690432, 150730800, 158116000, 163587792, 167816720, 171597904, -175348480, 179357840, 183519664, 186957248, 188903936, 189707632, 190191888, 190584336, 190813584, 191065920, -191285488, 190901088, 189672192, 188022400, 186193280, 183966336, 181352304, 178589040, 175419888, 171292960, -166147056, 160202816, 153353424, 145516720, 137107168, 128511328, 119673896, 110619568, 101676912, 92926984, -84211960, 75754632, 67987184, 60909080, 54394688, 48741972, 44157096, 40261024, 36796060, 34086472, -32245004, 30837328, 29772176, 29517700, 30151208, 31197568, 32465658, 34006476, 35463008, 36461588, -37243272, 38035692, 38538740, 38768524, 39375724, 40481676, 41403484, 41928544, 42491724, 42966316, -42817064, 42306500, 42020888, 41728292, 41157060, 40897752, 41180148, 41191956, 40722732, 40543956, -40480068, 39620000, 38581692, 38432976, 38014220, 36214628, 35186520, 36433672, 36713916, 34064460, -33306398, 37192268, 38308960, 31653908, 28657632, 42315092, 62512176, 65438660, 47303696, 29169808, -25497610, 26946624, 20507396, 9653476, 5276904, 8847096, 13584982, 14318347, 9484898, -607201, --13053479, -25279104, -41357852, -68102616, -99225016, -110134232, -80648208, -24404004, 17795660, 24222542, -19369228, 35908076, 62372052, 65007552, 59028420, 102312560, 191254352, 219296736, 99885904, }, +33083060, -15137612, -77247672, -120297736, -152744064, -162527472, -98063768, 53420804, 225633424, 342901600, +368999968, 262932528, -8273181, -334095840, -445709152, -187704032, 234369392, 430890432, 258872176, -54666880, +-231026288, -234318928, -195415648, -183787552, -168180720, -128274568, -89106072, -61837328, -28456306, 16117939, +55568824, 82885888, 105637408, 125082872, 134603744, 133938552, 127843456, 116640040, 99855304, 82162184, +67347768, 53308596, 38053948, 23500988, 10541997, -2518462, -15147813, -24635932, -31176094, -37507412, +-44420164, -51113868, -58128624, -66110284, -73897056, -80638544, -87209848, -93788128, -99032280, -102709312, +-106020192, -108920904, -110194904, -109961904, -109219408, -107584096, -104145440, -99537480, -94908576, -90141160, +-84906672, -79914312, -75686448, -71660456, -67447632, -63418412, -59664076, -55971476, -52758304, -50490024, +-48571248, -46197204, -43537008, -40852120, -37523520, -33078764, -28085328, -23219666, -18641232, -14722611, +-12118787, -10951093, -11154567, -13344463, -17927194, -23760296, -29066192, -33188822, -36287640, -37961068, +-37246492, -33403034, -26076894, -15426449, -2415919, 11868605, 27242440, 43924632, 61286500, 78111496, +93715112, 107930384, 120553824, 131646656, 141690432, 150730800, 158116000, 163587792, 167816720, 171597904, +175348480, 179357840, 183519664, 186957248, 188903936, 189707632, 190191888, 190584336, 190813584, 191065920, +191285488, 190901088, 189672192, 188022400, 186193280, 183966336, 181352304, 178589040, 175419888, 171292960, +166147056, 160202816, 153353424, 145516720, 137107168, 128511328, 119673896, 110619568, 101676912, 92926984, +84211960, 75754632, 67987184, 60909080, 54394688, 48741972, 44157096, 40261024, 36796060, 34086472, +32245004, 30837328, 29772176, 29517700, 30151208, 31197568, 32465658, 34006476, 35463008, 36461588, +37243272, 38035692, 38538740, 38768524, 39375724, 40481676, 41403484, 41928544, 42491724, 42966316, +42817064, 42306500, 42020888, 41728292, 41157060, 40897752, 41180148, 41191956, 40722732, 40543956, +40480068, 39620000, 38581692, 38432976, 38014220, 36214628, 35186520, 36433672, 36713916, 34064460, +33306398, 37192268, 38308960, 31653908, 28657632, 42315092, 62512176, 65438660, 47303696, 29169808, +25497610, 26946624, 20507396, 9653476, 5276904, 8847096, 13584982, 14318347, 9484898, -607201, +-13053479, -25279104, -41357852, -68102616, -99225016, -110134232, -80648208, -24404004, 17795660, 24222542, +19369228, 35908076, 62372052, 65007552, 59028420, 102312560, 191254352, 219296736, 99885904, }, }, { { 2811593, -11651709, 24683714, 38550552, 49903224, 43626132, -1712618, -78012712, -148158112, -194630208, -212185872, --141817680, 80555872, 349895968, 395538560, 95827696, -293273792, -390015776, -136008192, 164994384, 247096448, -150730272, 59409060, 36841156, 23941758, -11520176, -40115532, -45217952, -44843752, -48241608, -44198436, --29087130, -13136157, -2078764, 6528887, 13400835, 17460652, 20465520, 23479512, 24280524, 22565222, -21513492, 21992380, 21405580, 19192062, 17724256, 17702244, 17687212, 17659832, 18847390, 20900384, -22446036, 23242216, 23521926, 22731114, 20545512, 17583060, 14187351, 10077604, 5511517, 1179505, --3005403, -7570954, -12317966, -16756815, -21050708, -25465934, -29654602, -33335388, -36824512, -40335648, --43652972, -46806552, -50156628, -53645752, -56791816, -59336584, -61207580, -62139048, -61984432, -60968136, --59076740, -55733644, -50593640, -44098576, -36854040, -28940564, -20136954, -10415296, -74088, 10281078, -19926500, 28428388, 35715336, 41639172, 45858976, 48331268, 49465676, 49610632, 48818208, 47272020, -45551348, 44269840, 43650828, 43487616, 43418900, 43353400, 43700756, 45009648, 47382080, 50449760, -53869092, 57584236, 61721900, 66486632, 72013720, 78093776, 84218400, 90076200, 95814280, 101782136, -108258408, 115370336, 122938608, 130462856, 137564048, 144328624, 150999232, 157586112, 163950176, 169920720, -175151456, 179257440, 182218816, 184320128, 185714384, 186431648, 186631904, 186397280, 185502864, 183816016, -181655104, 179429232, 177305376, 175456928, 174135152, 173290656, 172604528, 171951696, 171356848, 170666960, -169782208, 168940384, 168295072, 167642240, 166908336, 166301664, 165705200, 164677632, 163193184, 161554656, -159646624, 157208144, 154559232, 152100368, 149600688, 146894864, 144484304, 142610624, 140772928, 138825152, -137261792, 135995840, 134363216, 132420288, 130557880, 128245576, 125015224, 121768768, 119185344, 116360864, -112885696, 110000016, 107964200, 105277168, 101876088, 99383936, 97464616, 94458680, 91321744, 89620400, -87426744, 83417928, 81007912, 81163072, 78259136, 71723272, 70384312, 74463456, 70391296, 57915488, -57659400, 70776232, 65012384, 34982508, 36167920, 104857328, 179518896, 172511664, 96391952, 39862664, -33528126, 29611652, 13415330, 34887484, 105161736, 152656016, 124219048, 59104120, 20142860, 10727218, --97711, -22026202, -49624588, -78276312, -84543208, -37925636, 40091372, 78421272, 47701516, 60666, --12510166, -6209449, -15641197, -32628866, -43815108, -75613440, -136878992, -159193504, -73527696, }, +11651709, 24683714, 38550552, 49903224, 43626132, -1712618, -78012712, -148158112, -194630208, -212185872, +-141817680, 80555872, 349895968, 395538560, 95827696, -293273792, -390015776, -136008192, 164994384, 247096448, +150730272, 59409060, 36841156, 23941758, -11520176, -40115532, -45217952, -44843752, -48241608, -44198436, +-29087130, -13136157, -2078764, 6528887, 13400835, 17460652, 20465520, 23479512, 24280524, 22565222, +21513492, 21992380, 21405580, 19192062, 17724256, 17702244, 17687212, 17659832, 18847390, 20900384, +22446036, 23242216, 23521926, 22731114, 20545512, 17583060, 14187351, 10077604, 5511517, 1179505, +-3005403, -7570954, -12317966, -16756815, -21050708, -25465934, -29654602, -33335388, -36824512, -40335648, +-43652972, -46806552, -50156628, -53645752, -56791816, -59336584, -61207580, -62139048, -61984432, -60968136, +-59076740, -55733644, -50593640, -44098576, -36854040, -28940564, -20136954, -10415296, -74088, 10281078, +19926500, 28428388, 35715336, 41639172, 45858976, 48331268, 49465676, 49610632, 48818208, 47272020, +45551348, 44269840, 43650828, 43487616, 43418900, 43353400, 43700756, 45009648, 47382080, 50449760, +53869092, 57584236, 61721900, 66486632, 72013720, 78093776, 84218400, 90076200, 95814280, 101782136, +108258408, 115370336, 122938608, 130462856, 137564048, 144328624, 150999232, 157586112, 163950176, 169920720, +175151456, 179257440, 182218816, 184320128, 185714384, 186431648, 186631904, 186397280, 185502864, 183816016, +181655104, 179429232, 177305376, 175456928, 174135152, 173290656, 172604528, 171951696, 171356848, 170666960, +169782208, 168940384, 168295072, 167642240, 166908336, 166301664, 165705200, 164677632, 163193184, 161554656, +159646624, 157208144, 154559232, 152100368, 149600688, 146894864, 144484304, 142610624, 140772928, 138825152, +137261792, 135995840, 134363216, 132420288, 130557880, 128245576, 125015224, 121768768, 119185344, 116360864, +112885696, 110000016, 107964200, 105277168, 101876088, 99383936, 97464616, 94458680, 91321744, 89620400, +87426744, 83417928, 81007912, 81163072, 78259136, 71723272, 70384312, 74463456, 70391296, 57915488, +57659400, 70776232, 65012384, 34982508, 36167920, 104857328, 179518896, 172511664, 96391952, 39862664, +33528126, 29611652, 13415330, 34887484, 105161736, 152656016, 124219048, 59104120, 20142860, 10727218, +-97711, -22026202, -49624588, -78276312, -84543208, -37925636, 40091372, 78421272, 47701516, 60666, +-12510166, -6209449, -15641197, -32628866, -43815108, -75613440, -136878992, -159193504, -73527696, }, { -2811593, --11651709, -24683714, -38550552, -49903224, -43626132, 1712618, 78012712, 148158112, 194630208, 212185872, -141817680, -80555872, -349895968, -395538560, -95827696, 293273792, 390015776, 136008192, -164994384, -247096448, --150730272, -59409060, -36841156, -23941758, 11520176, 40115532, 45217952, 44843752, 48241608, 44198436, -29087130, 13136157, 2078764, -6528887, -13400835, -17460652, -20465520, -23479512, -24280524, -22565222, --21513492, -21992380, -21405580, -19192062, -17724256, -17702244, -17687212, -17659832, -18847390, -20900384, --22446036, -23242216, -23521926, -22731114, -20545512, -17583060, -14187351, -10077604, -5511517, -1179505, -3005403, 7570954, 12317966, 16756815, 21050708, 25465934, 29654602, 33335388, 36824512, 40335648, -43652972, 46806552, 50156628, 53645752, 56791816, 59336584, 61207580, 62139048, 61984432, 60968136, -59076740, 55733644, 50593640, 44098576, 36854040, 28940564, 20136954, 10415296, 74088, -10281078, --19926500, -28428388, -35715336, -41639172, -45858976, -48331268, -49465676, -49610632, -48818208, -47272020, --45551348, -44269840, -43650828, -43487616, -43418900, -43353400, -43700756, -45009648, -47382080, -50449760, --53869092, -57584236, -61721900, -66486632, -72013720, -78093776, -84218400, -90076200, -95814280, -101782136, --108258408, -115370336, -122938608, -130462856, -137564048, -144328624, -150999232, -157586112, -163950176, -169920720, --175151456, -179257440, -182218816, -184320128, -185714384, -186431648, -186631904, -186397280, -185502864, -183816016, --181655104, -179429232, -177305376, -175456928, -174135152, -173290656, -172604528, -171951696, -171356848, -170666960, --169782208, -168940384, -168295072, -167642240, -166908336, -166301664, -165705200, -164677632, -163193184, -161554656, --159646624, -157208144, -154559232, -152100368, -149600688, -146894864, -144484304, -142610624, -140772928, -138825152, --137261792, -135995840, -134363216, -132420288, -130557880, -128245576, -125015224, -121768768, -119185344, -116360864, --112885696, -110000016, -107964200, -105277168, -101876088, -99383936, -97464616, -94458680, -91321744, -89620400, --87426744, -83417928, -81007912, -81163072, -78259136, -71723272, -70384312, -74463456, -70391296, -57915488, --57659400, -70776232, -65012384, -34982508, -36167920, -104857328, -179518896, -172511664, -96391952, -39862664, --33528126, -29611652, -13415330, -34887484, -105161736, -152656016, -124219048, -59104120, -20142860, -10727218, -97711, 22026202, 49624588, 78276312, 84543208, 37925636, -40091372, -78421272, -47701516, -60666, -12510166, 6209449, 15641197, 32628866, 43815108, 75613440, 136878992, 159193504, 73527696, }, +-11651709, -24683714, -38550552, -49903224, -43626132, 1712618, 78012712, 148158112, 194630208, 212185872, +141817680, -80555872, -349895968, -395538560, -95827696, 293273792, 390015776, 136008192, -164994384, -247096448, +-150730272, -59409060, -36841156, -23941758, 11520176, 40115532, 45217952, 44843752, 48241608, 44198436, +29087130, 13136157, 2078764, -6528887, -13400835, -17460652, -20465520, -23479512, -24280524, -22565222, +-21513492, -21992380, -21405580, -19192062, -17724256, -17702244, -17687212, -17659832, -18847390, -20900384, +-22446036, -23242216, -23521926, -22731114, -20545512, -17583060, -14187351, -10077604, -5511517, -1179505, +3005403, 7570954, 12317966, 16756815, 21050708, 25465934, 29654602, 33335388, 36824512, 40335648, +43652972, 46806552, 50156628, 53645752, 56791816, 59336584, 61207580, 62139048, 61984432, 60968136, +59076740, 55733644, 50593640, 44098576, 36854040, 28940564, 20136954, 10415296, 74088, -10281078, +-19926500, -28428388, -35715336, -41639172, -45858976, -48331268, -49465676, -49610632, -48818208, -47272020, +-45551348, -44269840, -43650828, -43487616, -43418900, -43353400, -43700756, -45009648, -47382080, -50449760, +-53869092, -57584236, -61721900, -66486632, -72013720, -78093776, -84218400, -90076200, -95814280, -101782136, +-108258408, -115370336, -122938608, -130462856, -137564048, -144328624, -150999232, -157586112, -163950176, -169920720, +-175151456, -179257440, -182218816, -184320128, -185714384, -186431648, -186631904, -186397280, -185502864, -183816016, +-181655104, -179429232, -177305376, -175456928, -174135152, -173290656, -172604528, -171951696, -171356848, -170666960, +-169782208, -168940384, -168295072, -167642240, -166908336, -166301664, -165705200, -164677632, -163193184, -161554656, +-159646624, -157208144, -154559232, -152100368, -149600688, -146894864, -144484304, -142610624, -140772928, -138825152, +-137261792, -135995840, -134363216, -132420288, -130557880, -128245576, -125015224, -121768768, -119185344, -116360864, +-112885696, -110000016, -107964200, -105277168, -101876088, -99383936, -97464616, -94458680, -91321744, -89620400, +-87426744, -83417928, -81007912, -81163072, -78259136, -71723272, -70384312, -74463456, -70391296, -57915488, +-57659400, -70776232, -65012384, -34982508, -36167920, -104857328, -179518896, -172511664, -96391952, -39862664, +-33528126, -29611652, -13415330, -34887484, -105161736, -152656016, -124219048, -59104120, -20142860, -10727218, +97711, 22026202, 49624588, 78276312, 84543208, 37925636, -40091372, -78421272, -47701516, -60666, +12510166, 6209449, 15641197, 32628866, 43815108, 75613440, 136878992, 159193504, 73527696, }, }, { { 1766305, -2392834, -2967823, -13154948, -21828098, -13592498, 23732916, 69370168, 72411536, 11843372, -60894584, --74438224, -25907780, 20711942, 23179938, 5403069, 3657165, 11682311, 4756140, -13142600, -18874770, --10082436, -5405753, -11533598, -15028091, -6480569, 6342056, 12303471, 10251013, 4749160, -2111513, --10241350, -18179522, -23642184, -25355876, -23281408, -18531710, -13084081, -8157217, -3108483, 3117610, -10074383, 16234440, 20606180, 23109608, 24038396, 24024974, 24174224, 25506738, 28323698, 32306744, -36983964, 41889888, 46537044, 50538344, 53766548, 56298968, 58215060, 59515900, 60221348, 60425896, -60163900, 59333900, 57909580, 56159380, 54442468, 52864068, 51385524, 50192600, 49603116, 49638548, -50051940, 50826644, 52286396, 54623396, 57640072, 61087320, 64938832, 69148976, 73336032, 76918032, -79475152, 80860272, 80984296, 79532592, 75905496, 69521560, 60245508, 48402132, 34217468, 17394080, --2496987, -25216290, -49676664, -74593920, -99082752, -122543472, -144185808, -162914016, -177765472, -188473904, --195543952, -199672496, -201060848, -199500160, -195243312, -189557840, -184086064, -179620368, -175639472, -171028816, --165171552, -158431136, -151753536, -145830240, -140600592, -135516416, -130188512, -124697400, -119384520, -114528528, --110164304, -106021808, -101652216, -96741992, -91300264, -85496152, -79429512, -73136312, -66677220, -60127396, --53596360, -47292420, -41414224, -35956928, -30760018, -25701084, -20750060, -15941845, -11440182, -7451232, --3917547, -482647, 3153043, 7072738, 11359115, 16073378, 20965882, 25650618, 30160870, 34941708, -40317396, 46365784, 53226992, 61034708, 69603168, 78600048, 87877176, 97303024, 106561896, 115417048, -123827664, 131587064, 138292576, 143794976, 148143616, 151136672, 152569056, 152790784, 152322624, 151187680, -149328496, 147177248, 145073792, 142777600, 140200624, 137736912, 135370384, 132611944, 129665064, 127228744, -125030792, 122277184, 119323856, 116903640, 114341696, 110789216, 107069240, 103905456, 100271384, 95927024, -92563528, 89972048, 85635208, 80475336, 78287592, 77118824, 71010840, 62952948, 62019328, 64006824, -55034636, 40962176, 44935020, 61018600, 45531484, -16530255, -70942120, -62221728, -13724031, 11134166, -4073777, 5789616, 18125298, -3304441, -61377768, -95043328, -70010648, -29961154, -23776402, -35720168, --28427314, -8661338, -1998770, 2596845, 29952566, 61971548, 55981676, 12006581, -23720030, -23033372, --5655398, 145492, -6174553, -10863046, -10317585, -8673686, -6595996, -3351148, -774168, }, +2392834, -2967823, -13154948, -21828098, -13592498, 23732916, 69370168, 72411536, 11843372, -60894584, +-74438224, -25907780, 20711942, 23179938, 5403069, 3657165, 11682311, 4756140, -13142600, -18874770, +-10082436, -5405753, -11533598, -15028091, -6480569, 6342056, 12303471, 10251013, 4749160, -2111513, +-10241350, -18179522, -23642184, -25355876, -23281408, -18531710, -13084081, -8157217, -3108483, 3117610, +10074383, 16234440, 20606180, 23109608, 24038396, 24024974, 24174224, 25506738, 28323698, 32306744, +36983964, 41889888, 46537044, 50538344, 53766548, 56298968, 58215060, 59515900, 60221348, 60425896, +60163900, 59333900, 57909580, 56159380, 54442468, 52864068, 51385524, 50192600, 49603116, 49638548, +50051940, 50826644, 52286396, 54623396, 57640072, 61087320, 64938832, 69148976, 73336032, 76918032, +79475152, 80860272, 80984296, 79532592, 75905496, 69521560, 60245508, 48402132, 34217468, 17394080, +-2496987, -25216290, -49676664, -74593920, -99082752, -122543472, -144185808, -162914016, -177765472, -188473904, +-195543952, -199672496, -201060848, -199500160, -195243312, -189557840, -184086064, -179620368, -175639472, -171028816, +-165171552, -158431136, -151753536, -145830240, -140600592, -135516416, -130188512, -124697400, -119384520, -114528528, +-110164304, -106021808, -101652216, -96741992, -91300264, -85496152, -79429512, -73136312, -66677220, -60127396, +-53596360, -47292420, -41414224, -35956928, -30760018, -25701084, -20750060, -15941845, -11440182, -7451232, +-3917547, -482647, 3153043, 7072738, 11359115, 16073378, 20965882, 25650618, 30160870, 34941708, +40317396, 46365784, 53226992, 61034708, 69603168, 78600048, 87877176, 97303024, 106561896, 115417048, +123827664, 131587064, 138292576, 143794976, 148143616, 151136672, 152569056, 152790784, 152322624, 151187680, +149328496, 147177248, 145073792, 142777600, 140200624, 137736912, 135370384, 132611944, 129665064, 127228744, +125030792, 122277184, 119323856, 116903640, 114341696, 110789216, 107069240, 103905456, 100271384, 95927024, +92563528, 89972048, 85635208, 80475336, 78287592, 77118824, 71010840, 62952948, 62019328, 64006824, +55034636, 40962176, 44935020, 61018600, 45531484, -16530255, -70942120, -62221728, -13724031, 11134166, +4073777, 5789616, 18125298, -3304441, -61377768, -95043328, -70010648, -29961154, -23776402, -35720168, +-28427314, -8661338, -1998770, 2596845, 29952566, 61971548, 55981676, 12006581, -23720030, -23033372, +-5655398, 145492, -6174553, -10863046, -10317585, -8673686, -6595996, -3351148, -774168, }, { -1766305, --2392834, 2967823, 13154948, 21828098, 13592498, -23732916, -69370168, -72411536, -11843372, 60894584, -74438224, 25907780, -20711942, -23179938, -5403069, -3657165, -11682311, -4756140, 13142600, 18874770, -10082436, 5405753, 11533598, 15028091, 6480569, -6342056, -12303471, -10251013, -4749160, 2111513, -10241350, 18179522, 23642184, 25355876, 23281408, 18531710, 13084081, 8157217, 3108483, -3117610, --10074383, -16234440, -20606180, -23109608, -24038396, -24024974, -24174224, -25506738, -28323698, -32306744, --36983964, -41889888, -46537044, -50538344, -53766548, -56298968, -58215060, -59515900, -60221348, -60425896, --60163900, -59333900, -57909580, -56159380, -54442468, -52864068, -51385524, -50192600, -49603116, -49638548, --50051940, -50826644, -52286396, -54623396, -57640072, -61087320, -64938832, -69148976, -73336032, -76918032, --79475152, -80860272, -80984296, -79532592, -75905496, -69521560, -60245508, -48402132, -34217468, -17394080, -2496987, 25216290, 49676664, 74593920, 99082752, 122543472, 144185808, 162914016, 177765472, 188473904, -195543952, 199672496, 201060848, 199500160, 195243312, 189557840, 184086064, 179620368, 175639472, 171028816, -165171552, 158431136, 151753536, 145830240, 140600592, 135516416, 130188512, 124697400, 119384520, 114528528, -110164304, 106021808, 101652216, 96741992, 91300264, 85496152, 79429512, 73136312, 66677220, 60127396, -53596360, 47292420, 41414224, 35956928, 30760018, 25701084, 20750060, 15941845, 11440182, 7451232, -3917547, 482647, -3153043, -7072738, -11359115, -16073378, -20965882, -25650618, -30160870, -34941708, --40317396, -46365784, -53226992, -61034708, -69603168, -78600048, -87877176, -97303024, -106561896, -115417048, --123827664, -131587064, -138292576, -143794976, -148143616, -151136672, -152569056, -152790784, -152322624, -151187680, --149328496, -147177248, -145073792, -142777600, -140200624, -137736912, -135370384, -132611944, -129665064, -127228744, --125030792, -122277184, -119323856, -116903640, -114341696, -110789216, -107069240, -103905456, -100271384, -95927024, --92563528, -89972048, -85635208, -80475336, -78287592, -77118824, -71010840, -62952948, -62019328, -64006824, --55034636, -40962176, -44935020, -61018600, -45531484, 16530255, 70942120, 62221728, 13724031, -11134166, --4073777, -5789616, -18125298, 3304441, 61377768, 95043328, 70010648, 29961154, 23776402, 35720168, -28427314, 8661338, 1998770, -2596845, -29952566, -61971548, -55981676, -12006581, 23720030, 23033372, -5655398, -145492, 6174553, 10863046, 10317585, 8673686, 6595996, 3351148, 774168, }, +-2392834, 2967823, 13154948, 21828098, 13592498, -23732916, -69370168, -72411536, -11843372, 60894584, +74438224, 25907780, -20711942, -23179938, -5403069, -3657165, -11682311, -4756140, 13142600, 18874770, +10082436, 5405753, 11533598, 15028091, 6480569, -6342056, -12303471, -10251013, -4749160, 2111513, +10241350, 18179522, 23642184, 25355876, 23281408, 18531710, 13084081, 8157217, 3108483, -3117610, +-10074383, -16234440, -20606180, -23109608, -24038396, -24024974, -24174224, -25506738, -28323698, -32306744, +-36983964, -41889888, -46537044, -50538344, -53766548, -56298968, -58215060, -59515900, -60221348, -60425896, +-60163900, -59333900, -57909580, -56159380, -54442468, -52864068, -51385524, -50192600, -49603116, -49638548, +-50051940, -50826644, -52286396, -54623396, -57640072, -61087320, -64938832, -69148976, -73336032, -76918032, +-79475152, -80860272, -80984296, -79532592, -75905496, -69521560, -60245508, -48402132, -34217468, -17394080, +2496987, 25216290, 49676664, 74593920, 99082752, 122543472, 144185808, 162914016, 177765472, 188473904, +195543952, 199672496, 201060848, 199500160, 195243312, 189557840, 184086064, 179620368, 175639472, 171028816, +165171552, 158431136, 151753536, 145830240, 140600592, 135516416, 130188512, 124697400, 119384520, 114528528, +110164304, 106021808, 101652216, 96741992, 91300264, 85496152, 79429512, 73136312, 66677220, 60127396, +53596360, 47292420, 41414224, 35956928, 30760018, 25701084, 20750060, 15941845, 11440182, 7451232, +3917547, 482647, -3153043, -7072738, -11359115, -16073378, -20965882, -25650618, -30160870, -34941708, +-40317396, -46365784, -53226992, -61034708, -69603168, -78600048, -87877176, -97303024, -106561896, -115417048, +-123827664, -131587064, -138292576, -143794976, -148143616, -151136672, -152569056, -152790784, -152322624, -151187680, +-149328496, -147177248, -145073792, -142777600, -140200624, -137736912, -135370384, -132611944, -129665064, -127228744, +-125030792, -122277184, -119323856, -116903640, -114341696, -110789216, -107069240, -103905456, -100271384, -95927024, +-92563528, -89972048, -85635208, -80475336, -78287592, -77118824, -71010840, -62952948, -62019328, -64006824, +-55034636, -40962176, -44935020, -61018600, -45531484, 16530255, 70942120, 62221728, 13724031, -11134166, +-4073777, -5789616, -18125298, 3304441, 61377768, 95043328, 70010648, 29961154, 23776402, 35720168, +28427314, 8661338, 1998770, -2596845, -29952566, -61971548, -55981676, -12006581, 23720030, 23033372, +5655398, -145492, 6174553, 10863046, 10317585, 8673686, 6595996, 3351148, 774168, }, }, { { 5993627, -17628694, 19673634, 5511517, -1316944, 26298084, 60221348, 29726006, -86547888, -207553216, -211214688, --51820392, 175624432, 290699488, 184001760, -57539676, -215310464, -162342784, 8655970, 113864416, 90045600, -19725712, -16241956, -23730232, -33396056, -36325224, -14506789, 15855409, 28052578, 24194624, 24378772, -35450124, 50498076, 65474092, 79804784, 89017496, 88574576, 80295488, 68737192, 55748140, 41954316, -28828358, 16729971, 4466766, -8088497, -19849728, -30842698, -41951092, -52959632, -63195612, -73171744, --83501680, -93191128, -100623568, -105214888, -106988712, -105779672, -101878232, -96300680, -89617176, -81389096, --71149888, -58987080, -44915696, -28600724, -9971840, 10462003, 31940598, 53636088, 74668544, 94358288, -112261320, 127707096, 139699184, 147604064, 151536640, 151740656, 147978800, 139933792, 127940096, 112900192, -95545304, 76076216, 54547696, 31362924, 7206955, -17441326, -42510512, -67998456, -93649080, -119086560, --143967296, -167687872, -189147136, -207169888, -221065184, -230433056, -234611520, -232813536, -224927968, -211891680, --195147200, -175832736, -154430384, -131102264, -106469552, -82101520, -59958816, -41174776, -25575456, -12447889, --1443109, 7364795, 13848585, 17929340, 19570556, 18952080, 16517907, 12791486, 8284455, 3510062, --1264868, -6323266, -12278238, -19502910, -27894738, -37029596, -46336256, -55298776, -63761472, -71935336, --79978736, -87721488, -94827512, -100983808, -105914968, -109505024, -111884968, -113158968, -113146616, -111667000, --108869368, -105025912, -100253128, -94717984, -88775904, -82661480, -76385992, -70137352, -64354716, -59281824, --54871428, -51158968, -48226576, -45827300, -43549356, -41275708, -39049304, -36720360, -34171296, -31555662, --28919088, -25992068, -22663468, -19183472, -15687905, -12097849, -8553427, -5284421, -2087354, 1395328, -5065914, 8723079, 12654047, 17178796, 22093312, 27161374, 32479080, 37844032, 42629696, 46680924, -50356344, 53518512, 55652040, 56935696, 57907432, 58341764, 57814016, 56804164, 55839408, 54453744, -52364240, 50339700, 48634600, 46335180, 43406552, 41039488, 39003672, 35665408, 31436476, 28479392, -26251914, 21914534, 16054051, 12672838, 12202002, 10322954, 5653788, 2725157, 4658966, 8232379, -9478456, 9896678, 13198435, 18043694, 17870286, 9187472, -1604170, -3621731, 4505958, 11703249, -11009612, 11530913, 22065932, 29156386, 10431402, -29294362, -55091008, -42656540, -7008313, 17862768, -16177531, -407485, -11506217, -9565429, -7515656, -24008330, -54532128, -65081104, -29904246, }, +17628694, 19673634, 5511517, -1316944, 26298084, 60221348, 29726006, -86547888, -207553216, -211214688, +-51820392, 175624432, 290699488, 184001760, -57539676, -215310464, -162342784, 8655970, 113864416, 90045600, +19725712, -16241956, -23730232, -33396056, -36325224, -14506789, 15855409, 28052578, 24194624, 24378772, +35450124, 50498076, 65474092, 79804784, 89017496, 88574576, 80295488, 68737192, 55748140, 41954316, +28828358, 16729971, 4466766, -8088497, -19849728, -30842698, -41951092, -52959632, -63195612, -73171744, +-83501680, -93191128, -100623568, -105214888, -106988712, -105779672, -101878232, -96300680, -89617176, -81389096, +-71149888, -58987080, -44915696, -28600724, -9971840, 10462003, 31940598, 53636088, 74668544, 94358288, +112261320, 127707096, 139699184, 147604064, 151536640, 151740656, 147978800, 139933792, 127940096, 112900192, +95545304, 76076216, 54547696, 31362924, 7206955, -17441326, -42510512, -67998456, -93649080, -119086560, +-143967296, -167687872, -189147136, -207169888, -221065184, -230433056, -234611520, -232813536, -224927968, -211891680, +-195147200, -175832736, -154430384, -131102264, -106469552, -82101520, -59958816, -41174776, -25575456, -12447889, +-1443109, 7364795, 13848585, 17929340, 19570556, 18952080, 16517907, 12791486, 8284455, 3510062, +-1264868, -6323266, -12278238, -19502910, -27894738, -37029596, -46336256, -55298776, -63761472, -71935336, +-79978736, -87721488, -94827512, -100983808, -105914968, -109505024, -111884968, -113158968, -113146616, -111667000, +-108869368, -105025912, -100253128, -94717984, -88775904, -82661480, -76385992, -70137352, -64354716, -59281824, +-54871428, -51158968, -48226576, -45827300, -43549356, -41275708, -39049304, -36720360, -34171296, -31555662, +-28919088, -25992068, -22663468, -19183472, -15687905, -12097849, -8553427, -5284421, -2087354, 1395328, +5065914, 8723079, 12654047, 17178796, 22093312, 27161374, 32479080, 37844032, 42629696, 46680924, +50356344, 53518512, 55652040, 56935696, 57907432, 58341764, 57814016, 56804164, 55839408, 54453744, +52364240, 50339700, 48634600, 46335180, 43406552, 41039488, 39003672, 35665408, 31436476, 28479392, +26251914, 21914534, 16054051, 12672838, 12202002, 10322954, 5653788, 2725157, 4658966, 8232379, +9478456, 9896678, 13198435, 18043694, 17870286, 9187472, -1604170, -3621731, 4505958, 11703249, +11009612, 11530913, 22065932, 29156386, 10431402, -29294362, -55091008, -42656540, -7008313, 17862768, +16177531, -407485, -11506217, -9565429, -7515656, -24008330, -54532128, -65081104, -29904246, }, { -5993627, --17628694, -19673634, -5511517, 1316944, -26298084, -60221348, -29726006, 86547888, 207553216, 211214688, -51820392, -175624432, -290699488, -184001760, 57539676, 215310464, 162342784, -8655970, -113864416, -90045600, --19725712, 16241956, 23730232, 33396056, 36325224, 14506789, -15855409, -28052578, -24194624, -24378772, --35450124, -50498076, -65474092, -79804784, -89017496, -88574576, -80295488, -68737192, -55748140, -41954316, --28828358, -16729971, -4466766, 8088497, 19849728, 30842698, 41951092, 52959632, 63195612, 73171744, -83501680, 93191128, 100623568, 105214888, 106988712, 105779672, 101878232, 96300680, 89617176, 81389096, -71149888, 58987080, 44915696, 28600724, 9971840, -10462003, -31940598, -53636088, -74668544, -94358288, --112261320, -127707096, -139699184, -147604064, -151536640, -151740656, -147978800, -139933792, -127940096, -112900192, --95545304, -76076216, -54547696, -31362924, -7206955, 17441326, 42510512, 67998456, 93649080, 119086560, -143967296, 167687872, 189147136, 207169888, 221065184, 230433056, 234611520, 232813536, 224927968, 211891680, -195147200, 175832736, 154430384, 131102264, 106469552, 82101520, 59958816, 41174776, 25575456, 12447889, -1443109, -7364795, -13848585, -17929340, -19570556, -18952080, -16517907, -12791486, -8284455, -3510062, -1264868, 6323266, 12278238, 19502910, 27894738, 37029596, 46336256, 55298776, 63761472, 71935336, -79978736, 87721488, 94827512, 100983808, 105914968, 109505024, 111884968, 113158968, 113146616, 111667000, -108869368, 105025912, 100253128, 94717984, 88775904, 82661480, 76385992, 70137352, 64354716, 59281824, -54871428, 51158968, 48226576, 45827300, 43549356, 41275708, 39049304, 36720360, 34171296, 31555662, -28919088, 25992068, 22663468, 19183472, 15687905, 12097849, 8553427, 5284421, 2087354, -1395328, --5065914, -8723079, -12654047, -17178796, -22093312, -27161374, -32479080, -37844032, -42629696, -46680924, --50356344, -53518512, -55652040, -56935696, -57907432, -58341764, -57814016, -56804164, -55839408, -54453744, --52364240, -50339700, -48634600, -46335180, -43406552, -41039488, -39003672, -35665408, -31436476, -28479392, --26251914, -21914534, -16054051, -12672838, -12202002, -10322954, -5653788, -2725157, -4658966, -8232379, --9478456, -9896678, -13198435, -18043694, -17870286, -9187472, 1604170, 3621731, -4505958, -11703249, --11009612, -11530913, -22065932, -29156386, -10431402, 29294362, 55091008, 42656540, 7008313, -17862768, --16177531, 407485, 11506217, 9565429, 7515656, 24008330, 54532128, 65081104, 29904246, }, +-17628694, -19673634, -5511517, 1316944, -26298084, -60221348, -29726006, 86547888, 207553216, 211214688, +51820392, -175624432, -290699488, -184001760, 57539676, 215310464, 162342784, -8655970, -113864416, -90045600, +-19725712, 16241956, 23730232, 33396056, 36325224, 14506789, -15855409, -28052578, -24194624, -24378772, +-35450124, -50498076, -65474092, -79804784, -89017496, -88574576, -80295488, -68737192, -55748140, -41954316, +-28828358, -16729971, -4466766, 8088497, 19849728, 30842698, 41951092, 52959632, 63195612, 73171744, +83501680, 93191128, 100623568, 105214888, 106988712, 105779672, 101878232, 96300680, 89617176, 81389096, +71149888, 58987080, 44915696, 28600724, 9971840, -10462003, -31940598, -53636088, -74668544, -94358288, +-112261320, -127707096, -139699184, -147604064, -151536640, -151740656, -147978800, -139933792, -127940096, -112900192, +-95545304, -76076216, -54547696, -31362924, -7206955, 17441326, 42510512, 67998456, 93649080, 119086560, +143967296, 167687872, 189147136, 207169888, 221065184, 230433056, 234611520, 232813536, 224927968, 211891680, +195147200, 175832736, 154430384, 131102264, 106469552, 82101520, 59958816, 41174776, 25575456, 12447889, +1443109, -7364795, -13848585, -17929340, -19570556, -18952080, -16517907, -12791486, -8284455, -3510062, +1264868, 6323266, 12278238, 19502910, 27894738, 37029596, 46336256, 55298776, 63761472, 71935336, +79978736, 87721488, 94827512, 100983808, 105914968, 109505024, 111884968, 113158968, 113146616, 111667000, +108869368, 105025912, 100253128, 94717984, 88775904, 82661480, 76385992, 70137352, 64354716, 59281824, +54871428, 51158968, 48226576, 45827300, 43549356, 41275708, 39049304, 36720360, 34171296, 31555662, +28919088, 25992068, 22663468, 19183472, 15687905, 12097849, 8553427, 5284421, 2087354, -1395328, +-5065914, -8723079, -12654047, -17178796, -22093312, -27161374, -32479080, -37844032, -42629696, -46680924, +-50356344, -53518512, -55652040, -56935696, -57907432, -58341764, -57814016, -56804164, -55839408, -54453744, +-52364240, -50339700, -48634600, -46335180, -43406552, -41039488, -39003672, -35665408, -31436476, -28479392, +-26251914, -21914534, -16054051, -12672838, -12202002, -10322954, -5653788, -2725157, -4658966, -8232379, +-9478456, -9896678, -13198435, -18043694, -17870286, -9187472, 1604170, 3621731, -4505958, -11703249, +-11009612, -11530913, -22065932, -29156386, -10431402, 29294362, 55091008, 42656540, 7008313, -17862768, +-16177531, 407485, 11506217, 9565429, 7515656, 24008330, 54532128, 65081104, 29904246, }, }, { { -30602, -2479270, 9492951, 16711718, 17120276, 6766721, -13114683, -36174900, -49415748, -36882496, 3577171, -46484968, 55562920, 22531936, -20698522, -37361384, -23899882, -2588792, 12509092, 24769614, 35760972, -37337760, 26557930, 13006235, 4521527, -3856881, -20049982, -41466836, -57522496, -60912300, -51961052, --35696548, -18810884, -7061463, -2002529, -471373, 1672890, 5923834, 11039677, 14950244, 16398185, -15717970, 14334453, 13266617, 12461848, 11574937, 10468983, 8745627, 5770289, 1439351, -3791383, --9651865, -16166794, -23213224, -30580168, -38163468, -45602888, -52181168, -57428008, -61326228, -63802276, --64693480, -64217276, -62700616, -59956132, -55662776, -50021336, -43212204, -34663608, -23717884, -10545755, -4327180, 20737176, 38386272, 56305948, 73504608, 89552752, 104081016, 116416160, 126146408, 133414568, -138302784, 140432016, 139366320, 135071888, 127921304, 118373056, 106448616, 91569240, 73389176, 52714816, -30967788, 8856223, -13687524, -36408436, -58315456, -78199544, -94956360, -107788648, -116784992, -122916592, --126914136, -128452808, -126728912, -121377920, -112811608, -102297528, -91600376, -81738056, -72181224, -61933964, --51042464, -40455372, -30998926, -23176718, -17252346, -12846247, -9113921, -5813775, -3537443, -2767033, --3551938, -6061810, -10421201, -16129213, -22588306, -29928942, -38486664, -48046188, -58372364, -69697120, --81970528, -94491424, -106836240, -119177288, -131404528, -143031536, -154034704, -164636304, -174413792, -182744416, --189709776, -195511200, -199726720, -202112576, -203154096, -202998416, -201069424, -197389184, -192904704, -188092192, --182729920, -177114784, -171862576, -166647952, -160692976, -154040608, -147007072, -139340544, -131171520, -123469576, --116542328, -109671456, -102832256, -96776888, -91197728, -85123032, -78982840, -73858408, -69328824, -64517924, --60049012, -56563644, -53043384, -48741436, -44484052, -40409736, -35395900, -29847338, -25490094, -21993990, --17826798, -13899588, -11877732, -10437844, -7936563, -6040872, -6036577, -5704791, -4167729, -4024384, --5182952, -4381941, -2988224, -5002027, -7115150, -4204773, -2294586, -8315057, -12634183, -5450851, --1278827, -14765024, -24306294, -5111548, 11762842, -26110716, -98523864, -122462400, -70461088, -8380018, -10191421, 14363981, 40327060, 53931368, 8960912, -63687924, -88644368, -45148696, 17628694, 52721796, -62794568, 77477992, 107806360, 126214056, 90390808, -1745904, -87026240, -94509144, -29715804, 29446832, -27824408, -8575976, -23322210, -6749004, 4201552, -14711874, -44802952, -51480016, -22588306, }, +2479270, 9492951, 16711718, 17120276, 6766721, -13114683, -36174900, -49415748, -36882496, 3577171, +46484968, 55562920, 22531936, -20698522, -37361384, -23899882, -2588792, 12509092, 24769614, 35760972, +37337760, 26557930, 13006235, 4521527, -3856881, -20049982, -41466836, -57522496, -60912300, -51961052, +-35696548, -18810884, -7061463, -2002529, -471373, 1672890, 5923834, 11039677, 14950244, 16398185, +15717970, 14334453, 13266617, 12461848, 11574937, 10468983, 8745627, 5770289, 1439351, -3791383, +-9651865, -16166794, -23213224, -30580168, -38163468, -45602888, -52181168, -57428008, -61326228, -63802276, +-64693480, -64217276, -62700616, -59956132, -55662776, -50021336, -43212204, -34663608, -23717884, -10545755, +4327180, 20737176, 38386272, 56305948, 73504608, 89552752, 104081016, 116416160, 126146408, 133414568, +138302784, 140432016, 139366320, 135071888, 127921304, 118373056, 106448616, 91569240, 73389176, 52714816, +30967788, 8856223, -13687524, -36408436, -58315456, -78199544, -94956360, -107788648, -116784992, -122916592, +-126914136, -128452808, -126728912, -121377920, -112811608, -102297528, -91600376, -81738056, -72181224, -61933964, +-51042464, -40455372, -30998926, -23176718, -17252346, -12846247, -9113921, -5813775, -3537443, -2767033, +-3551938, -6061810, -10421201, -16129213, -22588306, -29928942, -38486664, -48046188, -58372364, -69697120, +-81970528, -94491424, -106836240, -119177288, -131404528, -143031536, -154034704, -164636304, -174413792, -182744416, +-189709776, -195511200, -199726720, -202112576, -203154096, -202998416, -201069424, -197389184, -192904704, -188092192, +-182729920, -177114784, -171862576, -166647952, -160692976, -154040608, -147007072, -139340544, -131171520, -123469576, +-116542328, -109671456, -102832256, -96776888, -91197728, -85123032, -78982840, -73858408, -69328824, -64517924, +-60049012, -56563644, -53043384, -48741436, -44484052, -40409736, -35395900, -29847338, -25490094, -21993990, +-17826798, -13899588, -11877732, -10437844, -7936563, -6040872, -6036577, -5704791, -4167729, -4024384, +-5182952, -4381941, -2988224, -5002027, -7115150, -4204773, -2294586, -8315057, -12634183, -5450851, +-1278827, -14765024, -24306294, -5111548, 11762842, -26110716, -98523864, -122462400, -70461088, -8380018, +10191421, 14363981, 40327060, 53931368, 8960912, -63687924, -88644368, -45148696, 17628694, 52721796, +62794568, 77477992, 107806360, 126214056, 90390808, -1745904, -87026240, -94509144, -29715804, 29446832, +27824408, -8575976, -23322210, -6749004, 4201552, -14711874, -44802952, -51480016, -22588306, }, { -30602, -2479270, 9492951, 16711718, 17120276, 6766721, -13114683, -36174900, -49415748, -36882496, 3577171, -46484968, 55562920, 22531936, -20698522, -37361384, -23899882, -2588792, 12509092, 24769614, 35760972, -37337760, 26557930, 13006235, 4521527, -3856881, -20049982, -41466836, -57522496, -60912300, -51961052, --35696548, -18810884, -7061463, -2002529, -471373, 1672890, 5923834, 11039677, 14950244, 16398185, -15717970, 14334453, 13266617, 12461848, 11574937, 10468983, 8745627, 5770289, 1439351, -3791383, --9651865, -16166794, -23213224, -30580168, -38163468, -45602888, -52181168, -57428008, -61326228, -63802276, --64693480, -64217276, -62700616, -59956132, -55662776, -50021336, -43212204, -34663608, -23717884, -10545755, -4327180, 20737176, 38386272, 56305948, 73504608, 89552752, 104081016, 116416160, 126146408, 133414568, -138302784, 140432016, 139366320, 135071888, 127921304, 118373056, 106448616, 91569240, 73389176, 52714816, -30967788, 8856223, -13687524, -36408436, -58315456, -78199544, -94956360, -107788648, -116784992, -122916592, --126914136, -128452808, -126728912, -121377920, -112811608, -102297528, -91600376, -81738056, -72181224, -61933964, --51042464, -40455372, -30998926, -23176718, -17252346, -12846247, -9113921, -5813775, -3537443, -2767033, --3551938, -6061810, -10421201, -16129213, -22588306, -29928942, -38486664, -48046188, -58372364, -69697120, --81970528, -94491424, -106836240, -119177288, -131404528, -143031536, -154034704, -164636304, -174413792, -182744416, --189709776, -195511200, -199726720, -202112576, -203154096, -202998416, -201069424, -197389184, -192904704, -188092192, --182729920, -177114784, -171862576, -166647952, -160692976, -154040608, -147007072, -139340544, -131171520, -123469576, --116542328, -109671456, -102832256, -96776888, -91197728, -85123032, -78982840, -73858408, -69328824, -64517924, --60049012, -56563644, -53043384, -48741436, -44484052, -40409736, -35395900, -29847338, -25490094, -21993990, --17826798, -13899588, -11877732, -10437844, -7936563, -6040872, -6036577, -5704791, -4167729, -4024384, --5182952, -4381941, -2988224, -5002027, -7115150, -4204773, -2294586, -8315057, -12634183, -5450851, --1278827, -14765024, -24306294, -5111548, 11762842, -26110716, -98523864, -122462400, -70461088, -8380018, -10191421, 14363981, 40327060, 53931368, 8960912, -63687924, -88644368, -45148696, 17628694, 52721796, -62794568, 77477992, 107806360, 126214056, 90390808, -1745904, -87026240, -94509144, -29715804, 29446832, -27824408, -8575976, -23322210, -6749004, 4201552, -14711874, -44802952, -51480016, -22588306, }, +2479270, 9492951, 16711718, 17120276, 6766721, -13114683, -36174900, -49415748, -36882496, 3577171, +46484968, 55562920, 22531936, -20698522, -37361384, -23899882, -2588792, 12509092, 24769614, 35760972, +37337760, 26557930, 13006235, 4521527, -3856881, -20049982, -41466836, -57522496, -60912300, -51961052, +-35696548, -18810884, -7061463, -2002529, -471373, 1672890, 5923834, 11039677, 14950244, 16398185, +15717970, 14334453, 13266617, 12461848, 11574937, 10468983, 8745627, 5770289, 1439351, -3791383, +-9651865, -16166794, -23213224, -30580168, -38163468, -45602888, -52181168, -57428008, -61326228, -63802276, +-64693480, -64217276, -62700616, -59956132, -55662776, -50021336, -43212204, -34663608, -23717884, -10545755, +4327180, 20737176, 38386272, 56305948, 73504608, 89552752, 104081016, 116416160, 126146408, 133414568, +138302784, 140432016, 139366320, 135071888, 127921304, 118373056, 106448616, 91569240, 73389176, 52714816, +30967788, 8856223, -13687524, -36408436, -58315456, -78199544, -94956360, -107788648, -116784992, -122916592, +-126914136, -128452808, -126728912, -121377920, -112811608, -102297528, -91600376, -81738056, -72181224, -61933964, +-51042464, -40455372, -30998926, -23176718, -17252346, -12846247, -9113921, -5813775, -3537443, -2767033, +-3551938, -6061810, -10421201, -16129213, -22588306, -29928942, -38486664, -48046188, -58372364, -69697120, +-81970528, -94491424, -106836240, -119177288, -131404528, -143031536, -154034704, -164636304, -174413792, -182744416, +-189709776, -195511200, -199726720, -202112576, -203154096, -202998416, -201069424, -197389184, -192904704, -188092192, +-182729920, -177114784, -171862576, -166647952, -160692976, -154040608, -147007072, -139340544, -131171520, -123469576, +-116542328, -109671456, -102832256, -96776888, -91197728, -85123032, -78982840, -73858408, -69328824, -64517924, +-60049012, -56563644, -53043384, -48741436, -44484052, -40409736, -35395900, -29847338, -25490094, -21993990, +-17826798, -13899588, -11877732, -10437844, -7936563, -6040872, -6036577, -5704791, -4167729, -4024384, +-5182952, -4381941, -2988224, -5002027, -7115150, -4204773, -2294586, -8315057, -12634183, -5450851, +-1278827, -14765024, -24306294, -5111548, 11762842, -26110716, -98523864, -122462400, -70461088, -8380018, +10191421, 14363981, 40327060, 53931368, 8960912, -63687924, -88644368, -45148696, 17628694, 52721796, +62794568, 77477992, 107806360, 126214056, 90390808, -1745904, -87026240, -94509144, -29715804, 29446832, +27824408, -8575976, -23322210, -6749004, 4201552, -14711874, -44802952, -51480016, -22588306, }, }, { { 1764158, -11093364, 25240986, 28730110, 14854144, -9666361, -40182104, -69641824, -71814000, -21892522, 57956288, -103303088, 74577272, 1510218, -52022792, -52189760, -14654428, 22415972, 30050276, 5174362, -28579786, --40120364, -19475530, 15033996, 39711268, 47734268, 45950780, 40360880, 32664836, 24563454, 17143898, -8398272, -3512747, -16379395, -26647050, -33858836, -39592620, -43914968, -45525044, -44310104, -41805600, --39669392, -38815768, -39513164, -41541996, -44401908, -47503948, -49970872, -50604380, -48607756, -44217764, --38310572, -31732292, -25287694, -19827180, -15787763, -12870406, -10492605, -8318278, -6136972, -3542274, -5369, 4964982, 11649562, 20126216, 30054034, 40803800, 51764556, 62355408, 71839768, 79551384, -85389856, 89726696, 92673584, 93885840, 93318904, 91695408, 89711664, 87142200, 83405040, 78859896, -74775384, 71914936, 69914016, 68377488, 67898064, 69339560, 72409392, 75580688, 77486040, 78026672, -78029896, 78132432, 78204376, 77709384, 76295800, 73944304, 70800928, 67173288, 63604708, 60559040, -57841400, 54515484, 49600428, 42812236, 34536368, 25171730, 14672145, 2752000, -10590316, -24861956, --39404716, -53848152, -68203008, -82547664, -96672200, -109987672, -121740848, -131383584, -138849312, -144482704, --148653120, -151401360, -152416576, -151308480, -147960544, -142739472, -136395808, -129641976, -122683592, -115113176, --106294536, -95959232, -84526032, -72860896, -61704720, -51327008, -41615548, -32273994, -22919020, -13291313, --3552475, 5793911, 14383845, 22182970, 29150480, 35029752, 39650600, 43175696, 45889580, 47962436, -49513992, 50675784, 51485920, 51858508, 51663624, 50763828, 49123152, 47008952, 44880260, 42984032, -41307920, 39934604, 39033200, 38481832, 37993280, 37645388, 37808060, 38575784, 39746164, 41225780, -42949136, 44591424, 45797772, 46382424, 46002320, 44205952, 41131828, 37461240, 33474438, 29009282, -24359980, 20109574, 16124918, 11930882, 7791608, 4148402, 641024, -2932926, -5789616, -7692824, --9641128, -11643656, -12316356, -12039867, -12932683, -14353244, -13486197, -11772505, -13637058, -17055316, --15304579, -11020349, -15027017, -25094958, -22591528, -1823214, 14637249, 7070590, -10776610, -13829795, --4560719, -2980707, -7587597, 1844152, 24108726, 31710818, 13125420, -8542153, -11340861, -4901632, --9131637, -22211424, -30261266, -35723928, -52106008, -73799888, -74506944, -42775188, -1936493, 17946520, -16542067, 15548318, 22264574, 23836532, 19005768, 28008018, 55568824, 67573256, 31613644, }, +11093364, 25240986, 28730110, 14854144, -9666361, -40182104, -69641824, -71814000, -21892522, 57956288, +103303088, 74577272, 1510218, -52022792, -52189760, -14654428, 22415972, 30050276, 5174362, -28579786, +-40120364, -19475530, 15033996, 39711268, 47734268, 45950780, 40360880, 32664836, 24563454, 17143898, +8398272, -3512747, -16379395, -26647050, -33858836, -39592620, -43914968, -45525044, -44310104, -41805600, +-39669392, -38815768, -39513164, -41541996, -44401908, -47503948, -49970872, -50604380, -48607756, -44217764, +-38310572, -31732292, -25287694, -19827180, -15787763, -12870406, -10492605, -8318278, -6136972, -3542274, +5369, 4964982, 11649562, 20126216, 30054034, 40803800, 51764556, 62355408, 71839768, 79551384, +85389856, 89726696, 92673584, 93885840, 93318904, 91695408, 89711664, 87142200, 83405040, 78859896, +74775384, 71914936, 69914016, 68377488, 67898064, 69339560, 72409392, 75580688, 77486040, 78026672, +78029896, 78132432, 78204376, 77709384, 76295800, 73944304, 70800928, 67173288, 63604708, 60559040, +57841400, 54515484, 49600428, 42812236, 34536368, 25171730, 14672145, 2752000, -10590316, -24861956, +-39404716, -53848152, -68203008, -82547664, -96672200, -109987672, -121740848, -131383584, -138849312, -144482704, +-148653120, -151401360, -152416576, -151308480, -147960544, -142739472, -136395808, -129641976, -122683592, -115113176, +-106294536, -95959232, -84526032, -72860896, -61704720, -51327008, -41615548, -32273994, -22919020, -13291313, +-3552475, 5793911, 14383845, 22182970, 29150480, 35029752, 39650600, 43175696, 45889580, 47962436, +49513992, 50675784, 51485920, 51858508, 51663624, 50763828, 49123152, 47008952, 44880260, 42984032, +41307920, 39934604, 39033200, 38481832, 37993280, 37645388, 37808060, 38575784, 39746164, 41225780, +42949136, 44591424, 45797772, 46382424, 46002320, 44205952, 41131828, 37461240, 33474438, 29009282, +24359980, 20109574, 16124918, 11930882, 7791608, 4148402, 641024, -2932926, -5789616, -7692824, +-9641128, -11643656, -12316356, -12039867, -12932683, -14353244, -13486197, -11772505, -13637058, -17055316, +-15304579, -11020349, -15027017, -25094958, -22591528, -1823214, 14637249, 7070590, -10776610, -13829795, +-4560719, -2980707, -7587597, 1844152, 24108726, 31710818, 13125420, -8542153, -11340861, -4901632, +-9131637, -22211424, -30261266, -35723928, -52106008, -73799888, -74506944, -42775188, -1936493, 17946520, +16542067, 15548318, 22264574, 23836532, 19005768, 28008018, 55568824, 67573256, 31613644, }, { 1764158, -11093364, 25240986, 28730110, 14854144, -9666361, -40182104, -69641824, -71814000, -21892522, 57956288, -103303088, 74577272, 1510218, -52022792, -52189760, -14654428, 22415972, 30050276, 5174362, -28579786, --40120364, -19475530, 15033996, 39711268, 47734268, 45950780, 40360880, 32664836, 24563454, 17143898, -8398272, -3512747, -16379395, -26647050, -33858836, -39592620, -43914968, -45525044, -44310104, -41805600, --39669392, -38815768, -39513164, -41541996, -44401908, -47503948, -49970872, -50604380, -48607756, -44217764, --38310572, -31732292, -25287694, -19827180, -15787763, -12870406, -10492605, -8318278, -6136972, -3542274, -5369, 4964982, 11649562, 20126216, 30054034, 40803800, 51764556, 62355408, 71839768, 79551384, -85389856, 89726696, 92673584, 93885840, 93318904, 91695408, 89711664, 87142200, 83405040, 78859896, -74775384, 71914936, 69914016, 68377488, 67898064, 69339560, 72409392, 75580688, 77486040, 78026672, -78029896, 78132432, 78204376, 77709384, 76295800, 73944304, 70800928, 67173288, 63604708, 60559040, -57841400, 54515484, 49600428, 42812236, 34536368, 25171730, 14672145, 2752000, -10590316, -24861956, --39404716, -53848152, -68203008, -82547664, -96672200, -109987672, -121740848, -131383584, -138849312, -144482704, --148653120, -151401360, -152416576, -151308480, -147960544, -142739472, -136395808, -129641976, -122683592, -115113176, --106294536, -95959232, -84526032, -72860896, -61704720, -51327008, -41615548, -32273994, -22919020, -13291313, --3552475, 5793911, 14383845, 22182970, 29150480, 35029752, 39650600, 43175696, 45889580, 47962436, -49513992, 50675784, 51485920, 51858508, 51663624, 50763828, 49123152, 47008952, 44880260, 42984032, -41307920, 39934604, 39033200, 38481832, 37993280, 37645388, 37808060, 38575784, 39746164, 41225780, -42949136, 44591424, 45797772, 46382424, 46002320, 44205952, 41131828, 37461240, 33474438, 29009282, -24359980, 20109574, 16124918, 11930882, 7791608, 4148402, 641024, -2932926, -5789616, -7692824, --9641128, -11643656, -12316356, -12039867, -12932683, -14353244, -13486197, -11772505, -13637058, -17055316, --15304579, -11020349, -15027017, -25094958, -22591528, -1823214, 14637249, 7070590, -10776610, -13829795, --4560719, -2980707, -7587597, 1844152, 24108726, 31710818, 13125420, -8542153, -11340861, -4901632, --9131637, -22211424, -30261266, -35723928, -52106008, -73799888, -74506944, -42775188, -1936493, 17946520, -16542067, 15548318, 22264574, 23836532, 19005768, 28008018, 55568824, 67573256, 31613644, }, +11093364, 25240986, 28730110, 14854144, -9666361, -40182104, -69641824, -71814000, -21892522, 57956288, +103303088, 74577272, 1510218, -52022792, -52189760, -14654428, 22415972, 30050276, 5174362, -28579786, +-40120364, -19475530, 15033996, 39711268, 47734268, 45950780, 40360880, 32664836, 24563454, 17143898, +8398272, -3512747, -16379395, -26647050, -33858836, -39592620, -43914968, -45525044, -44310104, -41805600, +-39669392, -38815768, -39513164, -41541996, -44401908, -47503948, -49970872, -50604380, -48607756, -44217764, +-38310572, -31732292, -25287694, -19827180, -15787763, -12870406, -10492605, -8318278, -6136972, -3542274, +5369, 4964982, 11649562, 20126216, 30054034, 40803800, 51764556, 62355408, 71839768, 79551384, +85389856, 89726696, 92673584, 93885840, 93318904, 91695408, 89711664, 87142200, 83405040, 78859896, +74775384, 71914936, 69914016, 68377488, 67898064, 69339560, 72409392, 75580688, 77486040, 78026672, +78029896, 78132432, 78204376, 77709384, 76295800, 73944304, 70800928, 67173288, 63604708, 60559040, +57841400, 54515484, 49600428, 42812236, 34536368, 25171730, 14672145, 2752000, -10590316, -24861956, +-39404716, -53848152, -68203008, -82547664, -96672200, -109987672, -121740848, -131383584, -138849312, -144482704, +-148653120, -151401360, -152416576, -151308480, -147960544, -142739472, -136395808, -129641976, -122683592, -115113176, +-106294536, -95959232, -84526032, -72860896, -61704720, -51327008, -41615548, -32273994, -22919020, -13291313, +-3552475, 5793911, 14383845, 22182970, 29150480, 35029752, 39650600, 43175696, 45889580, 47962436, +49513992, 50675784, 51485920, 51858508, 51663624, 50763828, 49123152, 47008952, 44880260, 42984032, +41307920, 39934604, 39033200, 38481832, 37993280, 37645388, 37808060, 38575784, 39746164, 41225780, +42949136, 44591424, 45797772, 46382424, 46002320, 44205952, 41131828, 37461240, 33474438, 29009282, +24359980, 20109574, 16124918, 11930882, 7791608, 4148402, 641024, -2932926, -5789616, -7692824, +-9641128, -11643656, -12316356, -12039867, -12932683, -14353244, -13486197, -11772505, -13637058, -17055316, +-15304579, -11020349, -15027017, -25094958, -22591528, -1823214, 14637249, 7070590, -10776610, -13829795, +-4560719, -2980707, -7587597, 1844152, 24108726, 31710818, 13125420, -8542153, -11340861, -4901632, +-9131637, -22211424, -30261266, -35723928, -52106008, -73799888, -74506944, -42775188, -1936493, 17946520, +16542067, 15548318, 22264574, 23836532, 19005768, 28008018, 55568824, 67573256, 31613644, }, }, { { -4406637, --7348689, -3356517, -1883880, -58519, 15189152, 32778654, 12958990, -56069724, -113955680, -81304808, -35633732, 129195304, 105268040, -6237903, -87387016, -69393784, 2754685, 46722800, 43382392, 34414500, -46532748, 59179280, 45785960, 12456479, -17613660, -37055904, -55365888, -77968152, -98888400, -110563192, --110758080, -100773888, -83529064, -63528472, -44748728, -28308130, -13724568, -1228898, 8499203, 15370614, -19379430, 20318954, 18934364, 17206176, 16825534, 18235894, 21321828, 25922276, 31459024, 37022620, -42048268, 46316928, 49381924, 50653772, 49984828, 47725676, 44330504, 40263708, 36105644, 32465658, -29827474, 28544890, 28830504, 30761092, 34375308, 39688720, 46570332, 54795192, 64247344, 74831216, -86176368, 97677216, 108785080, 119024280, 127867080, 134872176, 139811392, 142530096, 143018112, 141754864, -139501616, 136562240, 132723080, 128011504, 122875792, 117545736, 111997712, 106638136, 102006544, 97423280, -90851984, 80689552, 67099736, 51097764, 32862406, 11516418, -13649406, -42112156, -72248328, -102324912, --131304128, -158685088, -183792928, -205630688, -223527808, -237600816, -248374208, -256063808, -260270720, -260319584, --255977360, -247973152, -237642688, -225920656, -212798992, -197832096, -180929248, -162609072, -143774560, -125302448, --107543832, -90107880, -72290208, -53744536, -34629784, -15271293, 4137127, 23631446, 43414068, 63530084, -83574160, 102937480, 121328528, 138791872, 155334464, 170847888, 185203824, 198027520, 208609776, 216449168, -221711584, 224857648, 226156336, 225817040, 224124272, 221082912, 216368640, 209960544, 202450800, 194533024, -186563712, 178708224, 171015936, 163204992, 154712240, 145068960, 134116800, 122069952, 109522736, 97109744, -85053776, 73320464, 62079996, 51527260, 41466300, 31688268, 22530324, 14449881, 7395397, 1171452, --4069482, -8266202, -11797738, -14943802, -17665200, -20134270, -22630182, -24838332, -26244934, -27055072, --27682138, -27813672, -27129160, -26157424, -25265682, -23912768, -21990770, -20338280, -19040126, -17272210, --15395310, -14513768, -13857175, -12069932, -10526965, -10856067, -10587094, -7240778, -4358855, -5493800, --5580773, 703838, 5775121, -506269, -9443022, -1343788, 23636278, 42522324, 42022496, 33808372, -30777736, 29378650, 25759604, 28761248, 42633992, 54049480, 51519208, 43749612, 44405668, 51233056, -53909892, 50683300, 43901544, 31022548, 14563160, 9776956, 25884694, 47662324, 52263848, 39165268, -27675696, 28365038, 33512556, 35976256, 41140956, 53856744, 64300492, 55533392, 22204980, }, +-7348689, -3356517, -1883880, -58519, 15189152, 32778654, 12958990, -56069724, -113955680, -81304808, +35633732, 129195304, 105268040, -6237903, -87387016, -69393784, 2754685, 46722800, 43382392, 34414500, +46532748, 59179280, 45785960, 12456479, -17613660, -37055904, -55365888, -77968152, -98888400, -110563192, +-110758080, -100773888, -83529064, -63528472, -44748728, -28308130, -13724568, -1228898, 8499203, 15370614, +19379430, 20318954, 18934364, 17206176, 16825534, 18235894, 21321828, 25922276, 31459024, 37022620, +42048268, 46316928, 49381924, 50653772, 49984828, 47725676, 44330504, 40263708, 36105644, 32465658, +29827474, 28544890, 28830504, 30761092, 34375308, 39688720, 46570332, 54795192, 64247344, 74831216, +86176368, 97677216, 108785080, 119024280, 127867080, 134872176, 139811392, 142530096, 143018112, 141754864, +139501616, 136562240, 132723080, 128011504, 122875792, 117545736, 111997712, 106638136, 102006544, 97423280, +90851984, 80689552, 67099736, 51097764, 32862406, 11516418, -13649406, -42112156, -72248328, -102324912, +-131304128, -158685088, -183792928, -205630688, -223527808, -237600816, -248374208, -256063808, -260270720, -260319584, +-255977360, -247973152, -237642688, -225920656, -212798992, -197832096, -180929248, -162609072, -143774560, -125302448, +-107543832, -90107880, -72290208, -53744536, -34629784, -15271293, 4137127, 23631446, 43414068, 63530084, +83574160, 102937480, 121328528, 138791872, 155334464, 170847888, 185203824, 198027520, 208609776, 216449168, +221711584, 224857648, 226156336, 225817040, 224124272, 221082912, 216368640, 209960544, 202450800, 194533024, +186563712, 178708224, 171015936, 163204992, 154712240, 145068960, 134116800, 122069952, 109522736, 97109744, +85053776, 73320464, 62079996, 51527260, 41466300, 31688268, 22530324, 14449881, 7395397, 1171452, +-4069482, -8266202, -11797738, -14943802, -17665200, -20134270, -22630182, -24838332, -26244934, -27055072, +-27682138, -27813672, -27129160, -26157424, -25265682, -23912768, -21990770, -20338280, -19040126, -17272210, +-15395310, -14513768, -13857175, -12069932, -10526965, -10856067, -10587094, -7240778, -4358855, -5493800, +-5580773, 703838, 5775121, -506269, -9443022, -1343788, 23636278, 42522324, 42022496, 33808372, +30777736, 29378650, 25759604, 28761248, 42633992, 54049480, 51519208, 43749612, 44405668, 51233056, +53909892, 50683300, 43901544, 31022548, 14563160, 9776956, 25884694, 47662324, 52263848, 39165268, +27675696, 28365038, 33512556, 35976256, 41140956, 53856744, 64300492, 55533392, 22204980, }, { -4406637, --7348689, -3356517, -1883880, -58519, 15189152, 32778654, 12958990, -56069724, -113955680, -81304808, -35633732, 129195304, 105268040, -6237903, -87387016, -69393784, 2754685, 46722800, 43382392, 34414500, -46532748, 59179280, 45785960, 12456479, -17613660, -37055904, -55365888, -77968152, -98888400, -110563192, --110758080, -100773888, -83529064, -63528472, -44748728, -28308130, -13724568, -1228898, 8499203, 15370614, -19379430, 20318954, 18934364, 17206176, 16825534, 18235894, 21321828, 25922276, 31459024, 37022620, -42048268, 46316928, 49381924, 50653772, 49984828, 47725676, 44330504, 40263708, 36105644, 32465658, -29827474, 28544890, 28830504, 30761092, 34375308, 39688720, 46570332, 54795192, 64247344, 74831216, -86176368, 97677216, 108785080, 119024280, 127867080, 134872176, 139811392, 142530096, 143018112, 141754864, -139501616, 136562240, 132723080, 128011504, 122875792, 117545736, 111997712, 106638136, 102006544, 97423280, -90851984, 80689552, 67099736, 51097764, 32862406, 11516418, -13649406, -42112156, -72248328, -102324912, --131304128, -158685088, -183792928, -205630688, -223527808, -237600816, -248374208, -256063808, -260270720, -260319584, --255977360, -247973152, -237642688, -225920656, -212798992, -197832096, -180929248, -162609072, -143774560, -125302448, --107543832, -90107880, -72290208, -53744536, -34629784, -15271293, 4137127, 23631446, 43414068, 63530084, -83574160, 102937480, 121328528, 138791872, 155334464, 170847888, 185203824, 198027520, 208609776, 216449168, -221711584, 224857648, 226156336, 225817040, 224124272, 221082912, 216368640, 209960544, 202450800, 194533024, -186563712, 178708224, 171015936, 163204992, 154712240, 145068960, 134116800, 122069952, 109522736, 97109744, -85053776, 73320464, 62079996, 51527260, 41466300, 31688268, 22530324, 14449881, 7395397, 1171452, --4069482, -8266202, -11797738, -14943802, -17665200, -20134270, -22630182, -24838332, -26244934, -27055072, --27682138, -27813672, -27129160, -26157424, -25265682, -23912768, -21990770, -20338280, -19040126, -17272210, --15395310, -14513768, -13857175, -12069932, -10526965, -10856067, -10587094, -7240778, -4358855, -5493800, --5580773, 703838, 5775121, -506269, -9443022, -1343788, 23636278, 42522324, 42022496, 33808372, -30777736, 29378650, 25759604, 28761248, 42633992, 54049480, 51519208, 43749612, 44405668, 51233056, -53909892, 50683300, 43901544, 31022548, 14563160, 9776956, 25884694, 47662324, 52263848, 39165268, -27675696, 28365038, 33512556, 35976256, 41140956, 53856744, 64300492, 55533392, 22204980, }, +-7348689, -3356517, -1883880, -58519, 15189152, 32778654, 12958990, -56069724, -113955680, -81304808, +35633732, 129195304, 105268040, -6237903, -87387016, -69393784, 2754685, 46722800, 43382392, 34414500, +46532748, 59179280, 45785960, 12456479, -17613660, -37055904, -55365888, -77968152, -98888400, -110563192, +-110758080, -100773888, -83529064, -63528472, -44748728, -28308130, -13724568, -1228898, 8499203, 15370614, +19379430, 20318954, 18934364, 17206176, 16825534, 18235894, 21321828, 25922276, 31459024, 37022620, +42048268, 46316928, 49381924, 50653772, 49984828, 47725676, 44330504, 40263708, 36105644, 32465658, +29827474, 28544890, 28830504, 30761092, 34375308, 39688720, 46570332, 54795192, 64247344, 74831216, +86176368, 97677216, 108785080, 119024280, 127867080, 134872176, 139811392, 142530096, 143018112, 141754864, +139501616, 136562240, 132723080, 128011504, 122875792, 117545736, 111997712, 106638136, 102006544, 97423280, +90851984, 80689552, 67099736, 51097764, 32862406, 11516418, -13649406, -42112156, -72248328, -102324912, +-131304128, -158685088, -183792928, -205630688, -223527808, -237600816, -248374208, -256063808, -260270720, -260319584, +-255977360, -247973152, -237642688, -225920656, -212798992, -197832096, -180929248, -162609072, -143774560, -125302448, +-107543832, -90107880, -72290208, -53744536, -34629784, -15271293, 4137127, 23631446, 43414068, 63530084, +83574160, 102937480, 121328528, 138791872, 155334464, 170847888, 185203824, 198027520, 208609776, 216449168, +221711584, 224857648, 226156336, 225817040, 224124272, 221082912, 216368640, 209960544, 202450800, 194533024, +186563712, 178708224, 171015936, 163204992, 154712240, 145068960, 134116800, 122069952, 109522736, 97109744, +85053776, 73320464, 62079996, 51527260, 41466300, 31688268, 22530324, 14449881, 7395397, 1171452, +-4069482, -8266202, -11797738, -14943802, -17665200, -20134270, -22630182, -24838332, -26244934, -27055072, +-27682138, -27813672, -27129160, -26157424, -25265682, -23912768, -21990770, -20338280, -19040126, -17272210, +-15395310, -14513768, -13857175, -12069932, -10526965, -10856067, -10587094, -7240778, -4358855, -5493800, +-5580773, 703838, 5775121, -506269, -9443022, -1343788, 23636278, 42522324, 42022496, 33808372, +30777736, 29378650, 25759604, 28761248, 42633992, 54049480, 51519208, 43749612, 44405668, 51233056, +53909892, 50683300, 43901544, 31022548, 14563160, 9776956, 25884694, 47662324, 52263848, 39165268, +27675696, 28365038, 33512556, 35976256, 41140956, 53856744, 64300492, 55533392, 22204980, }, }, { { 117575, -161061, -252329, -1464584, -3598646, -4524748, -379031, 6758668, 4143033, -16192564, -33903400, --12020003, 49617072, 89670864, 48064444, -48242148, -100213936, -51793548, 42024108, 84818088, 49868864, --8434779, -34635152, -24835112, -3246995, 16035260, 30627412, 36352068, 29423210, 13908715, -2612951, --16478179, -27019102, -33733748, -38114076, -44135084, -53906672, -65277060, -74832824, -80749144, -82240032, --78949552, -71816152, -62895500, -53892712, -45776836, -39388608, -35219268, -32866164, -31560494, -30902826, --30591978, -30010548, -28633474, -26456462, -23782844, -20996484, -18630494, -17163226, -16643535, -16815334, --17479444, -18406620, -19099720, -19061064, -18182744, -16600049, -14325863, -11284490, -7541963, -3243774, -1568200, 6864432, 12396886, 17781702, 22871238, 27857158, 32864552, 37613176, 41810432, 45802604, -50356880, 55646132, 60961692, 65723200, 70293048, 75307416, 80490912, 84649512, 86786256, 86875912, -85539104, 83229488, 79847200, 75143136, 69425464, 63683092, 58845348, 55023364, 51725364, 48756468, -46721728, 46633144, 49120468, 53931368, 60053844, 66373888, 72363760, 78207600, 84296784, 90664072, -96856880, 102248672, 106451304, 109519520, 111827528, 113777976, 115599048, 117298240, 118724704, 119707720, -120225800, 120397064, 120254792, 119632016, 118329568, 116299128, 113634096, 110527224, 107276472, 104199128, -101474504, 99150392, 97272960, 95897496, 95001992, 94505920, 94329296, 94344864, 94334128, 94034552, -93170728, 91431800, 88545584, 84382152, 78907136, 72140952, 64253784, 55550032, 46234788, 36351528, -26020522, 15505369, 4977330, -5508296, -15746424, -25402048, -34286188, -42334956, -49382996, -55277840, --60101624, -63987496, -66891432, -68781752, -69795904, -70051456, -69659000, -69007240, -68578280, -68463392, --68547680, -69004552, -70006360, -71223440, -72264976, -73256576, -74401184, -75542032, -76666776, -78069080, --79573936, -80576808, -81057848, -81349904, -80996640, -79342008, -76901392, -74463992, -71653480, -68145560, --64833068, -61896920, -58074400, -53672060, -50640348, -47916264, -42216844, -35222488, -31835372, -29344290, --20187420, -8438000, -6424734, -8773544, 7063611, 41104448, 58184460, 37411848, 8157754, 6343130, -19957102, 18105434, 12898861, 40517112, 89652072, 105694848, 72303624, 36204428, 35644472, 51827908, -53061100, 43456480, 38454452, 28644210, 3903052, -12447889, 8261907, 52053392, 76827304, 68179384, -50771344, 46590196, 50434728, 51454780, 54419384, 66729296, 78190416, 67669360, 27167816, }, +161061, -252329, -1464584, -3598646, -4524748, -379031, 6758668, 4143033, -16192564, -33903400, +-12020003, 49617072, 89670864, 48064444, -48242148, -100213936, -51793548, 42024108, 84818088, 49868864, +-8434779, -34635152, -24835112, -3246995, 16035260, 30627412, 36352068, 29423210, 13908715, -2612951, +-16478179, -27019102, -33733748, -38114076, -44135084, -53906672, -65277060, -74832824, -80749144, -82240032, +-78949552, -71816152, -62895500, -53892712, -45776836, -39388608, -35219268, -32866164, -31560494, -30902826, +-30591978, -30010548, -28633474, -26456462, -23782844, -20996484, -18630494, -17163226, -16643535, -16815334, +-17479444, -18406620, -19099720, -19061064, -18182744, -16600049, -14325863, -11284490, -7541963, -3243774, +1568200, 6864432, 12396886, 17781702, 22871238, 27857158, 32864552, 37613176, 41810432, 45802604, +50356880, 55646132, 60961692, 65723200, 70293048, 75307416, 80490912, 84649512, 86786256, 86875912, +85539104, 83229488, 79847200, 75143136, 69425464, 63683092, 58845348, 55023364, 51725364, 48756468, +46721728, 46633144, 49120468, 53931368, 60053844, 66373888, 72363760, 78207600, 84296784, 90664072, +96856880, 102248672, 106451304, 109519520, 111827528, 113777976, 115599048, 117298240, 118724704, 119707720, +120225800, 120397064, 120254792, 119632016, 118329568, 116299128, 113634096, 110527224, 107276472, 104199128, +101474504, 99150392, 97272960, 95897496, 95001992, 94505920, 94329296, 94344864, 94334128, 94034552, +93170728, 91431800, 88545584, 84382152, 78907136, 72140952, 64253784, 55550032, 46234788, 36351528, +26020522, 15505369, 4977330, -5508296, -15746424, -25402048, -34286188, -42334956, -49382996, -55277840, +-60101624, -63987496, -66891432, -68781752, -69795904, -70051456, -69659000, -69007240, -68578280, -68463392, +-68547680, -69004552, -70006360, -71223440, -72264976, -73256576, -74401184, -75542032, -76666776, -78069080, +-79573936, -80576808, -81057848, -81349904, -80996640, -79342008, -76901392, -74463992, -71653480, -68145560, +-64833068, -61896920, -58074400, -53672060, -50640348, -47916264, -42216844, -35222488, -31835372, -29344290, +-20187420, -8438000, -6424734, -8773544, 7063611, 41104448, 58184460, 37411848, 8157754, 6343130, +19957102, 18105434, 12898861, 40517112, 89652072, 105694848, 72303624, 36204428, 35644472, 51827908, +53061100, 43456480, 38454452, 28644210, 3903052, -12447889, 8261907, 52053392, 76827304, 68179384, +50771344, 46590196, 50434728, 51454780, 54419384, 66729296, 78190416, 67669360, 27167816, }, { 117575, -161061, -252329, -1464584, -3598646, -4524748, -379031, 6758668, 4143033, -16192564, -33903400, --12020003, 49617072, 89670864, 48064444, -48242148, -100213936, -51793548, 42024108, 84818088, 49868864, --8434779, -34635152, -24835112, -3246995, 16035260, 30627412, 36352068, 29423210, 13908715, -2612951, --16478179, -27019102, -33733748, -38114076, -44135084, -53906672, -65277060, -74832824, -80749144, -82240032, --78949552, -71816152, -62895500, -53892712, -45776836, -39388608, -35219268, -32866164, -31560494, -30902826, --30591978, -30010548, -28633474, -26456462, -23782844, -20996484, -18630494, -17163226, -16643535, -16815334, --17479444, -18406620, -19099720, -19061064, -18182744, -16600049, -14325863, -11284490, -7541963, -3243774, -1568200, 6864432, 12396886, 17781702, 22871238, 27857158, 32864552, 37613176, 41810432, 45802604, -50356880, 55646132, 60961692, 65723200, 70293048, 75307416, 80490912, 84649512, 86786256, 86875912, -85539104, 83229488, 79847200, 75143136, 69425464, 63683092, 58845348, 55023364, 51725364, 48756468, -46721728, 46633144, 49120468, 53931368, 60053844, 66373888, 72363760, 78207600, 84296784, 90664072, -96856880, 102248672, 106451304, 109519520, 111827528, 113777976, 115599048, 117298240, 118724704, 119707720, -120225800, 120397064, 120254792, 119632016, 118329568, 116299128, 113634096, 110527224, 107276472, 104199128, -101474504, 99150392, 97272960, 95897496, 95001992, 94505920, 94329296, 94344864, 94334128, 94034552, -93170728, 91431800, 88545584, 84382152, 78907136, 72140952, 64253784, 55550032, 46234788, 36351528, -26020522, 15505369, 4977330, -5508296, -15746424, -25402048, -34286188, -42334956, -49382996, -55277840, --60101624, -63987496, -66891432, -68781752, -69795904, -70051456, -69659000, -69007240, -68578280, -68463392, --68547680, -69004552, -70006360, -71223440, -72264976, -73256576, -74401184, -75542032, -76666776, -78069080, --79573936, -80576808, -81057848, -81349904, -80996640, -79342008, -76901392, -74463992, -71653480, -68145560, --64833068, -61896920, -58074400, -53672060, -50640348, -47916264, -42216844, -35222488, -31835372, -29344290, --20187420, -8438000, -6424734, -8773544, 7063611, 41104448, 58184460, 37411848, 8157754, 6343130, -19957102, 18105434, 12898861, 40517112, 89652072, 105694848, 72303624, 36204428, 35644472, 51827908, -53061100, 43456480, 38454452, 28644210, 3903052, -12447889, 8261907, 52053392, 76827304, 68179384, -50771344, 46590196, 50434728, 51454780, 54419384, 66729296, 78190416, 67669360, 27167816, }, +161061, -252329, -1464584, -3598646, -4524748, -379031, 6758668, 4143033, -16192564, -33903400, +-12020003, 49617072, 89670864, 48064444, -48242148, -100213936, -51793548, 42024108, 84818088, 49868864, +-8434779, -34635152, -24835112, -3246995, 16035260, 30627412, 36352068, 29423210, 13908715, -2612951, +-16478179, -27019102, -33733748, -38114076, -44135084, -53906672, -65277060, -74832824, -80749144, -82240032, +-78949552, -71816152, -62895500, -53892712, -45776836, -39388608, -35219268, -32866164, -31560494, -30902826, +-30591978, -30010548, -28633474, -26456462, -23782844, -20996484, -18630494, -17163226, -16643535, -16815334, +-17479444, -18406620, -19099720, -19061064, -18182744, -16600049, -14325863, -11284490, -7541963, -3243774, +1568200, 6864432, 12396886, 17781702, 22871238, 27857158, 32864552, 37613176, 41810432, 45802604, +50356880, 55646132, 60961692, 65723200, 70293048, 75307416, 80490912, 84649512, 86786256, 86875912, +85539104, 83229488, 79847200, 75143136, 69425464, 63683092, 58845348, 55023364, 51725364, 48756468, +46721728, 46633144, 49120468, 53931368, 60053844, 66373888, 72363760, 78207600, 84296784, 90664072, +96856880, 102248672, 106451304, 109519520, 111827528, 113777976, 115599048, 117298240, 118724704, 119707720, +120225800, 120397064, 120254792, 119632016, 118329568, 116299128, 113634096, 110527224, 107276472, 104199128, +101474504, 99150392, 97272960, 95897496, 95001992, 94505920, 94329296, 94344864, 94334128, 94034552, +93170728, 91431800, 88545584, 84382152, 78907136, 72140952, 64253784, 55550032, 46234788, 36351528, +26020522, 15505369, 4977330, -5508296, -15746424, -25402048, -34286188, -42334956, -49382996, -55277840, +-60101624, -63987496, -66891432, -68781752, -69795904, -70051456, -69659000, -69007240, -68578280, -68463392, +-68547680, -69004552, -70006360, -71223440, -72264976, -73256576, -74401184, -75542032, -76666776, -78069080, +-79573936, -80576808, -81057848, -81349904, -80996640, -79342008, -76901392, -74463992, -71653480, -68145560, +-64833068, -61896920, -58074400, -53672060, -50640348, -47916264, -42216844, -35222488, -31835372, -29344290, +-20187420, -8438000, -6424734, -8773544, 7063611, 41104448, 58184460, 37411848, 8157754, 6343130, +19957102, 18105434, 12898861, 40517112, 89652072, 105694848, 72303624, 36204428, 35644472, 51827908, +53061100, 43456480, 38454452, 28644210, 3903052, -12447889, 8261907, 52053392, 76827304, 68179384, +50771344, 46590196, 50434728, 51454780, 54419384, 66729296, 78190416, 67669360, 27167816, }, }, }; const Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 500112448, -418537056, 287121792, 143605456, 14763950, -86528024, -166246368, -241739552, -311749664, -347549824, -328959072, --262918032, -147998128, 29484414, 216079808, 266078048, 94506464, -160373536, -237499344, -45432700, 230351984, -349093344, 263181104, 94669672, -54703388, -179336896, -294431296, -382621984, -428603392, -447339648, -456935680, --455972512, -440012416, -416439488, -393079712, -368706304, -341304416, -313900896, -288643808, -264001440, -239418128, --216171072, -193799664, -170890304, -148231664, -127228208, -107119168, -86873232, -67434744, -49669148, -32590212, --15431817, 1001264, 16207596, 30826054, 44940928, 57775900, 69332048, 80341120, 90769840, 100129112, -108780248, 117362128, 125608464, 133045736, 140035792, 147043568, 153789360, 159989136, 166012832, 172165904, -178216976, 184042032, 189920240, 195976144, 202025056, 208014400, 214042912, 220098288, 226173520, 232313168, -238288544, 243737776, 248770944, 253786400, 258645072, 262792400, 266229456, 269521024, 272802368, 275555968, -277430720, 278632256, 279502528, 280196672, 280706720, 280861856, 280527392, 280017376, 279963680, 280580544, -281469600, 282292096, 283223040, 284627488, 286693376, 289421216, 292608608, 295871168, 299018848, 302320064, -306113600, 310339840, 314677760, 318900256, 322870400, 326495360, 329891616, 333329728, 336852128, 340216160, -343272032, 346091136, 348726112, 351167264, 353505344, 355814432, 357938816, 359685792, 361114400, 362388928, -363542144, 364617504, 365799680, 367162272, 368560800, 369955584, 371522176, 373325536, 375293184, 377594208, -380535168, 384050080, 387854336, 392037088, 396819552, 401957408, 407214976, 413027136, 419667168, 426614272, -434127232, 443276608, 450554944, 444149536, 412868768, 361643232, 312110432, 282796224, 273215232, }, +418537056, 287121792, 143605456, 14763950, -86528024, -166246368, -241739552, -311749664, -347549824, -328959072, +-262918032, -147998128, 29484414, 216079808, 266078048, 94506464, -160373536, -237499344, -45432700, 230351984, +349093344, 263181104, 94669672, -54703388, -179336896, -294431296, -382621984, -428603392, -447339648, -456935680, +-455972512, -440012416, -416439488, -393079712, -368706304, -341304416, -313900896, -288643808, -264001440, -239418128, +-216171072, -193799664, -170890304, -148231664, -127228208, -107119168, -86873232, -67434744, -49669148, -32590212, +-15431817, 1001264, 16207596, 30826054, 44940928, 57775900, 69332048, 80341120, 90769840, 100129112, +108780248, 117362128, 125608464, 133045736, 140035792, 147043568, 153789360, 159989136, 166012832, 172165904, +178216976, 184042032, 189920240, 195976144, 202025056, 208014400, 214042912, 220098288, 226173520, 232313168, +238288544, 243737776, 248770944, 253786400, 258645072, 262792400, 266229456, 269521024, 272802368, 275555968, +277430720, 278632256, 279502528, 280196672, 280706720, 280861856, 280527392, 280017376, 279963680, 280580544, +281469600, 282292096, 283223040, 284627488, 286693376, 289421216, 292608608, 295871168, 299018848, 302320064, +306113600, 310339840, 314677760, 318900256, 322870400, 326495360, 329891616, 333329728, 336852128, 340216160, +343272032, 346091136, 348726112, 351167264, 353505344, 355814432, 357938816, 359685792, 361114400, 362388928, +363542144, 364617504, 365799680, 367162272, 368560800, 369955584, 371522176, 373325536, 375293184, 377594208, +380535168, 384050080, 387854336, 392037088, 396819552, 401957408, 407214976, 413027136, 419667168, 426614272, +434127232, 443276608, 450554944, 444149536, 412868768, 361643232, 312110432, 282796224, 273215232, }, { 500112448, -418537056, 287121792, 143605456, 14763950, -86528024, -166246368, -241739552, -311749664, -347549824, -328959072, --262918032, -147998128, 29484414, 216079808, 266078048, 94506464, -160373536, -237499344, -45432700, 230351984, -349093344, 263181104, 94669672, -54703388, -179336896, -294431296, -382621984, -428603392, -447339648, -456935680, --455972512, -440012416, -416439488, -393079712, -368706304, -341304416, -313900896, -288643808, -264001440, -239418128, --216171072, -193799664, -170890304, -148231664, -127228208, -107119168, -86873232, -67434744, -49669148, -32590212, --15431817, 1001264, 16207596, 30826054, 44940928, 57775900, 69332048, 80341120, 90769840, 100129112, -108780248, 117362128, 125608464, 133045736, 140035792, 147043568, 153789360, 159989136, 166012832, 172165904, -178216976, 184042032, 189920240, 195976144, 202025056, 208014400, 214042912, 220098288, 226173520, 232313168, -238288544, 243737776, 248770944, 253786400, 258645072, 262792400, 266229456, 269521024, 272802368, 275555968, -277430720, 278632256, 279502528, 280196672, 280706720, 280861856, 280527392, 280017376, 279963680, 280580544, -281469600, 282292096, 283223040, 284627488, 286693376, 289421216, 292608608, 295871168, 299018848, 302320064, -306113600, 310339840, 314677760, 318900256, 322870400, 326495360, 329891616, 333329728, 336852128, 340216160, -343272032, 346091136, 348726112, 351167264, 353505344, 355814432, 357938816, 359685792, 361114400, 362388928, -363542144, 364617504, 365799680, 367162272, 368560800, 369955584, 371522176, 373325536, 375293184, 377594208, -380535168, 384050080, 387854336, 392037088, 396819552, 401957408, 407214976, 413027136, 419667168, 426614272, -434127232, 443276608, 450554944, 444149536, 412868768, 361643232, 312110432, 282796224, 273215232, }, +418537056, 287121792, 143605456, 14763950, -86528024, -166246368, -241739552, -311749664, -347549824, -328959072, +-262918032, -147998128, 29484414, 216079808, 266078048, 94506464, -160373536, -237499344, -45432700, 230351984, +349093344, 263181104, 94669672, -54703388, -179336896, -294431296, -382621984, -428603392, -447339648, -456935680, +-455972512, -440012416, -416439488, -393079712, -368706304, -341304416, -313900896, -288643808, -264001440, -239418128, +-216171072, -193799664, -170890304, -148231664, -127228208, -107119168, -86873232, -67434744, -49669148, -32590212, +-15431817, 1001264, 16207596, 30826054, 44940928, 57775900, 69332048, 80341120, 90769840, 100129112, +108780248, 117362128, 125608464, 133045736, 140035792, 147043568, 153789360, 159989136, 166012832, 172165904, +178216976, 184042032, 189920240, 195976144, 202025056, 208014400, 214042912, 220098288, 226173520, 232313168, +238288544, 243737776, 248770944, 253786400, 258645072, 262792400, 266229456, 269521024, 272802368, 275555968, +277430720, 278632256, 279502528, 280196672, 280706720, 280861856, 280527392, 280017376, 279963680, 280580544, +281469600, 282292096, 283223040, 284627488, 286693376, 289421216, 292608608, 295871168, 299018848, 302320064, +306113600, 310339840, 314677760, 318900256, 322870400, 326495360, 329891616, 333329728, 336852128, 340216160, +343272032, 346091136, 348726112, 351167264, 353505344, 355814432, 357938816, 359685792, 361114400, 362388928, +363542144, 364617504, 365799680, 367162272, 368560800, 369955584, 371522176, 373325536, 375293184, 377594208, +380535168, 384050080, 387854336, 392037088, 396819552, 401957408, 407214976, 413027136, 419667168, 426614272, +434127232, 443276608, 450554944, 444149536, 412868768, 361643232, 312110432, 282796224, 273215232, }, }, { { 13864154, -136623984, 328640160, 487629664, 518798752, 400693056, 175451568, -101884144, -367117696, -542826944, -596249344, --564139648, -451535296, -177904528, 243203600, 531694944, 367461824, -163075616, -549243648, -406381760, 97649304, -492055072, 546322496, 398481696, 242520704, 109596288, -35486092, -167236896, -245507312, -288138080, -331422240, --372911616, -394943168, -403555136, -412833856, -420243744, -419021856, -413134528, -406657696, -395780160, -378794112, --359887136, -340138848, -316722688, -290845536, -266280992, -242185696, -215901024, -189375312, -165792720, -144028512, --121940560, -100523712, -80735184, -60967596, -40515500, -20994874, -2815888, 15329812, 33093796, 48828948, -62875100, 76620608, 89422832, 99939056, 108899968, 117535536, 125165544, 130876784, 135496016, 139917680, -143608672, 146227536, 148670288, 151568320, 154618816, 157799248, 161570768, 165966656, 170851120, 176503296, -182850720, 189116544, 195128416, 201641728, 208718224, 215347520, 221177936, 226993312, 233166800, 239278000, -245384368, 252129616, 259665136, 267780480, 276746752, 286837248, 297567680, 308396896, 319439264, 330652896, -341231936, 350513344, 358587904, 365545728, 371041152, 374867968, 377070208, 377470720, 376021152, 373483904, -370898336, 368599456, 366440704, 364470912, 362756704, 361157888, 359899456, 359699744, 360843840, 362773344, -364846720, 366792896, 368347680, 369331744, 370134368, 371304224, 372740896, 374010592, 375177728, 376552128, -378008672, 379322912, 380723072, 382422272, 384142944, 385711136, 387467264, 389582528, 391733760, 393863520, -396390592, 399380960, 402513600, 406025280, 410536064, 415955776, 421893568, 428828864, 437292096, 446712032, -457193888, 470256512, 482825184, 481813728, 453202816, 400317792, 346350464, 312895360, 301198528, }, +136623984, 328640160, 487629664, 518798752, 400693056, 175451568, -101884144, -367117696, -542826944, -596249344, +-564139648, -451535296, -177904528, 243203600, 531694944, 367461824, -163075616, -549243648, -406381760, 97649304, +492055072, 546322496, 398481696, 242520704, 109596288, -35486092, -167236896, -245507312, -288138080, -331422240, +-372911616, -394943168, -403555136, -412833856, -420243744, -419021856, -413134528, -406657696, -395780160, -378794112, +-359887136, -340138848, -316722688, -290845536, -266280992, -242185696, -215901024, -189375312, -165792720, -144028512, +-121940560, -100523712, -80735184, -60967596, -40515500, -20994874, -2815888, 15329812, 33093796, 48828948, +62875100, 76620608, 89422832, 99939056, 108899968, 117535536, 125165544, 130876784, 135496016, 139917680, +143608672, 146227536, 148670288, 151568320, 154618816, 157799248, 161570768, 165966656, 170851120, 176503296, +182850720, 189116544, 195128416, 201641728, 208718224, 215347520, 221177936, 226993312, 233166800, 239278000, +245384368, 252129616, 259665136, 267780480, 276746752, 286837248, 297567680, 308396896, 319439264, 330652896, +341231936, 350513344, 358587904, 365545728, 371041152, 374867968, 377070208, 377470720, 376021152, 373483904, +370898336, 368599456, 366440704, 364470912, 362756704, 361157888, 359899456, 359699744, 360843840, 362773344, +364846720, 366792896, 368347680, 369331744, 370134368, 371304224, 372740896, 374010592, 375177728, 376552128, +378008672, 379322912, 380723072, 382422272, 384142944, 385711136, 387467264, 389582528, 391733760, 393863520, +396390592, 399380960, 402513600, 406025280, 410536064, 415955776, 421893568, 428828864, 437292096, 446712032, +457193888, 470256512, 482825184, 481813728, 453202816, 400317792, 346350464, 312895360, 301198528, }, { -13864154, --136623984, -328640160, -487629664, -518798752, -400693056, -175451568, 101884144, 367117696, 542826944, 596249344, -564139648, 451535296, 177904528, -243203600, -531694944, -367461824, 163075616, 549243648, 406381760, -97649304, --492055072, -546322496, -398481696, -242520704, -109596288, 35486092, 167236896, 245507312, 288138080, 331422240, -372911616, 394943168, 403555136, 412833856, 420243744, 419021856, 413134528, 406657696, 395780160, 378794112, -359887136, 340138848, 316722688, 290845536, 266280992, 242185696, 215901024, 189375312, 165792720, 144028512, -121940560, 100523712, 80735184, 60967596, 40515500, 20994874, 2815888, -15329812, -33093796, -48828948, --62875100, -76620608, -89422832, -99939056, -108899968, -117535536, -125165544, -130876784, -135496016, -139917680, --143608672, -146227536, -148670288, -151568320, -154618816, -157799248, -161570768, -165966656, -170851120, -176503296, --182850720, -189116544, -195128416, -201641728, -208718224, -215347520, -221177936, -226993312, -233166800, -239278000, --245384368, -252129616, -259665136, -267780480, -276746752, -286837248, -297567680, -308396896, -319439264, -330652896, --341231936, -350513344, -358587904, -365545728, -371041152, -374867968, -377070208, -377470720, -376021152, -373483904, --370898336, -368599456, -366440704, -364470912, -362756704, -361157888, -359899456, -359699744, -360843840, -362773344, --364846720, -366792896, -368347680, -369331744, -370134368, -371304224, -372740896, -374010592, -375177728, -376552128, --378008672, -379322912, -380723072, -382422272, -384142944, -385711136, -387467264, -389582528, -391733760, -393863520, --396390592, -399380960, -402513600, -406025280, -410536064, -415955776, -421893568, -428828864, -437292096, -446712032, --457193888, -470256512, -482825184, -481813728, -453202816, -400317792, -346350464, -312895360, -301198528, }, +-136623984, -328640160, -487629664, -518798752, -400693056, -175451568, 101884144, 367117696, 542826944, 596249344, +564139648, 451535296, 177904528, -243203600, -531694944, -367461824, 163075616, 549243648, 406381760, -97649304, +-492055072, -546322496, -398481696, -242520704, -109596288, 35486092, 167236896, 245507312, 288138080, 331422240, +372911616, 394943168, 403555136, 412833856, 420243744, 419021856, 413134528, 406657696, 395780160, 378794112, +359887136, 340138848, 316722688, 290845536, 266280992, 242185696, 215901024, 189375312, 165792720, 144028512, +121940560, 100523712, 80735184, 60967596, 40515500, 20994874, 2815888, -15329812, -33093796, -48828948, +-62875100, -76620608, -89422832, -99939056, -108899968, -117535536, -125165544, -130876784, -135496016, -139917680, +-143608672, -146227536, -148670288, -151568320, -154618816, -157799248, -161570768, -165966656, -170851120, -176503296, +-182850720, -189116544, -195128416, -201641728, -208718224, -215347520, -221177936, -226993312, -233166800, -239278000, +-245384368, -252129616, -259665136, -267780480, -276746752, -286837248, -297567680, -308396896, -319439264, -330652896, +-341231936, -350513344, -358587904, -365545728, -371041152, -374867968, -377070208, -377470720, -376021152, -373483904, +-370898336, -368599456, -366440704, -364470912, -362756704, -361157888, -359899456, -359699744, -360843840, -362773344, +-364846720, -366792896, -368347680, -369331744, -370134368, -371304224, -372740896, -374010592, -375177728, -376552128, +-378008672, -379322912, -380723072, -382422272, -384142944, -385711136, -387467264, -389582528, -391733760, -393863520, +-396390592, -399380960, -402513600, -406025280, -410536064, -415955776, -421893568, -428828864, -437292096, -446712032, +-457193888, -470256512, -482825184, -481813728, -453202816, -400317792, -346350464, -312895360, -301198528, }, }, { { 64401424, -63330368, 37157908, -15931644, -58379880, -54824184, -12847858, 30091614, 47290276, 37990596, 12819941, --17877264, -39993660, -35149476, 1495722, 43596604, 49433464, 8347806, -36291936, -28638842, 34721588, -98505608, 110677016, 72908680, 22891638, -13288629, -35545148, -50949588, -61456688, -68270656, -73939472, --77989624, -77666968, -73198056, -67782640, -63748588, -62395136, -65560528, -73762304, -84316648, -93879936, --101488464, -107591080, -112057848, -114704080, -116171352, -116993832, -116838680, -115213032, -111799608, -105879536, --96558920, -83700320, -67775656, -48956184, -27186070, -2924873, 23012434, 50206020, 78591456, 107864880, -137462032, 166971152, 196106592, 224303600, 250640864, 274176224, 294177344, 310024704, 321084768, 326829280, -327020960, 321681792, 311023264, 295638720, 276577632, 254856384, 231045616, 205785312, 180449824, 156516656, -134315440, 113291576, 93632432, 76656040, 63151588, 52218748, 42468100, 33854004, 27566174, 24370182, -23728084, 24552718, 26297012, 29117194, 33293512, 38728256, 44891536, 51022064, 56372520, 60442536, -63119376, 64576980, 64919504, 63852740, 60770568, 55293944, 47769700, 39152384, 30319784, 21547314, -12667469, 3592203, -5455146, -14068702, -21811992, -28259812, -33072322, -36057860, -37148244, -36380520, --33932388, -30065844, -24990804, -18882824, -12054363, -4963909, 1974611, 8501888, 14472429, 19794968, -24357834, 27957016, 30428232, 31926102, 32949916, 34061776, 35713728, 38252588, 41734196, 45710800, -49542448, 52979496, 56159920, 59088548, 61521112, 63342716, 64637648, 65327528, 65163780, 64192044, -62777928, 60743724, 56635588, 48552456, 36449240, 23563264, 14521821, 11260331, 11362873, }, +63330368, 37157908, -15931644, -58379880, -54824184, -12847858, 30091614, 47290276, 37990596, 12819941, +-17877264, -39993660, -35149476, 1495722, 43596604, 49433464, 8347806, -36291936, -28638842, 34721588, +98505608, 110677016, 72908680, 22891638, -13288629, -35545148, -50949588, -61456688, -68270656, -73939472, +-77989624, -77666968, -73198056, -67782640, -63748588, -62395136, -65560528, -73762304, -84316648, -93879936, +-101488464, -107591080, -112057848, -114704080, -116171352, -116993832, -116838680, -115213032, -111799608, -105879536, +-96558920, -83700320, -67775656, -48956184, -27186070, -2924873, 23012434, 50206020, 78591456, 107864880, +137462032, 166971152, 196106592, 224303600, 250640864, 274176224, 294177344, 310024704, 321084768, 326829280, +327020960, 321681792, 311023264, 295638720, 276577632, 254856384, 231045616, 205785312, 180449824, 156516656, +134315440, 113291576, 93632432, 76656040, 63151588, 52218748, 42468100, 33854004, 27566174, 24370182, +23728084, 24552718, 26297012, 29117194, 33293512, 38728256, 44891536, 51022064, 56372520, 60442536, +63119376, 64576980, 64919504, 63852740, 60770568, 55293944, 47769700, 39152384, 30319784, 21547314, +12667469, 3592203, -5455146, -14068702, -21811992, -28259812, -33072322, -36057860, -37148244, -36380520, +-33932388, -30065844, -24990804, -18882824, -12054363, -4963909, 1974611, 8501888, 14472429, 19794968, +24357834, 27957016, 30428232, 31926102, 32949916, 34061776, 35713728, 38252588, 41734196, 45710800, +49542448, 52979496, 56159920, 59088548, 61521112, 63342716, 64637648, 65327528, 65163780, 64192044, +62777928, 60743724, 56635588, 48552456, 36449240, 23563264, 14521821, 11260331, 11362873, }, { 64401424, -63330368, 37157908, -15931644, -58379880, -54824184, -12847858, 30091614, 47290276, 37990596, 12819941, --17877264, -39993660, -35149476, 1495722, 43596604, 49433464, 8347806, -36291936, -28638842, 34721588, -98505608, 110677016, 72908680, 22891638, -13288629, -35545148, -50949588, -61456688, -68270656, -73939472, --77989624, -77666968, -73198056, -67782640, -63748588, -62395136, -65560528, -73762304, -84316648, -93879936, --101488464, -107591080, -112057848, -114704080, -116171352, -116993832, -116838680, -115213032, -111799608, -105879536, --96558920, -83700320, -67775656, -48956184, -27186070, -2924873, 23012434, 50206020, 78591456, 107864880, -137462032, 166971152, 196106592, 224303600, 250640864, 274176224, 294177344, 310024704, 321084768, 326829280, -327020960, 321681792, 311023264, 295638720, 276577632, 254856384, 231045616, 205785312, 180449824, 156516656, -134315440, 113291576, 93632432, 76656040, 63151588, 52218748, 42468100, 33854004, 27566174, 24370182, -23728084, 24552718, 26297012, 29117194, 33293512, 38728256, 44891536, 51022064, 56372520, 60442536, -63119376, 64576980, 64919504, 63852740, 60770568, 55293944, 47769700, 39152384, 30319784, 21547314, -12667469, 3592203, -5455146, -14068702, -21811992, -28259812, -33072322, -36057860, -37148244, -36380520, --33932388, -30065844, -24990804, -18882824, -12054363, -4963909, 1974611, 8501888, 14472429, 19794968, -24357834, 27957016, 30428232, 31926102, 32949916, 34061776, 35713728, 38252588, 41734196, 45710800, -49542448, 52979496, 56159920, 59088548, 61521112, 63342716, 64637648, 65327528, 65163780, 64192044, -62777928, 60743724, 56635588, 48552456, 36449240, 23563264, 14521821, 11260331, 11362873, }, +63330368, 37157908, -15931644, -58379880, -54824184, -12847858, 30091614, 47290276, 37990596, 12819941, +-17877264, -39993660, -35149476, 1495722, 43596604, 49433464, 8347806, -36291936, -28638842, 34721588, +98505608, 110677016, 72908680, 22891638, -13288629, -35545148, -50949588, -61456688, -68270656, -73939472, +-77989624, -77666968, -73198056, -67782640, -63748588, -62395136, -65560528, -73762304, -84316648, -93879936, +-101488464, -107591080, -112057848, -114704080, -116171352, -116993832, -116838680, -115213032, -111799608, -105879536, +-96558920, -83700320, -67775656, -48956184, -27186070, -2924873, 23012434, 50206020, 78591456, 107864880, +137462032, 166971152, 196106592, 224303600, 250640864, 274176224, 294177344, 310024704, 321084768, 326829280, +327020960, 321681792, 311023264, 295638720, 276577632, 254856384, 231045616, 205785312, 180449824, 156516656, +134315440, 113291576, 93632432, 76656040, 63151588, 52218748, 42468100, 33854004, 27566174, 24370182, +23728084, 24552718, 26297012, 29117194, 33293512, 38728256, 44891536, 51022064, 56372520, 60442536, +63119376, 64576980, 64919504, 63852740, 60770568, 55293944, 47769700, 39152384, 30319784, 21547314, +12667469, 3592203, -5455146, -14068702, -21811992, -28259812, -33072322, -36057860, -37148244, -36380520, +-33932388, -30065844, -24990804, -18882824, -12054363, -4963909, 1974611, 8501888, 14472429, 19794968, +24357834, 27957016, 30428232, 31926102, 32949916, 34061776, 35713728, 38252588, 41734196, 45710800, +49542448, 52979496, 56159920, 59088548, 61521112, 63342716, 64637648, 65327528, 65163780, 64192044, +62777928, 60743724, 56635588, 48552456, 36449240, 23563264, 14521821, 11260331, 11362873, }, }, { { 11786464, -25789668, 33872260, 16652125, -20252382, -45563160, -35004520, -2744484, 12291660, -8097624, -45591616, --76592688, -94264872, -89115736, -41623600, 34422016, 69206416, 8408472, -98491656, -133276056, -44265008, -95329480, 179870544, 181108576, 141069280, 94194536, 38961260, -29467234, -99621768, -160425088, -213080304, --260522512, -299208896, -325018432, -338040224, -339448448, -329772960, -311046368, -286593504, -258777152, -229226704, --199843216, -171641920, -144170784, -117346560, -92145304, -68815040, -46365784, -24428700, -3939559, 14218489, -29699162, 41950556, 50583976, 56514252, 61536680, 66855996, 72790032, 79448304, 86790016, 94313184, -101418136, 107935752, 113958904, 119470424, 124494456, 129352064, 134420672, 139683072, 144722688, 149181392, -153040960, 156255200, 158280816, 158397856, 156460288, 152775744, 147223424, 139280960, 129104568, 117684792, -105569760, 92379912, 78087336, 63820528, 50685444, 38562900, 26798448, 15387794, 4635344, -5815386, --16722455, -28219546, -39760124, -51000052, -62167504, -73465416, -84478784, -94344864, -102413496, -108639048, --113280296, -116241680, -116895592, -114715896, -109939888, -103384160, -95636040, -86646136, -76100912, -64054068, --51193864, -38566120, -26919782, -16155519, -5476620, 5771363, 17424682, 28651190, 38631620, 47049220, -54205708, 60852172, 67741832, 75123808, 82692080, 90047208, 97074848, 103923176, 110883704, 118351584, -126650536, 135782704, 145463568, 155364000, 165216112, 174804640, 184064048, 193087232, 201897824, 210312208, -218072128, 224942464, 230699872, 235267040, 238810912, 241544128, 243650816, 245502480, 247508224, 249758784, -252559648, 256762272, 261317616, 260416752, 246926256, 221287984, 194087424, 176352432, 169659792, }, +25789668, 33872260, 16652125, -20252382, -45563160, -35004520, -2744484, 12291660, -8097624, -45591616, +-76592688, -94264872, -89115736, -41623600, 34422016, 69206416, 8408472, -98491656, -133276056, -44265008, +95329480, 179870544, 181108576, 141069280, 94194536, 38961260, -29467234, -99621768, -160425088, -213080304, +-260522512, -299208896, -325018432, -338040224, -339448448, -329772960, -311046368, -286593504, -258777152, -229226704, +-199843216, -171641920, -144170784, -117346560, -92145304, -68815040, -46365784, -24428700, -3939559, 14218489, +29699162, 41950556, 50583976, 56514252, 61536680, 66855996, 72790032, 79448304, 86790016, 94313184, +101418136, 107935752, 113958904, 119470424, 124494456, 129352064, 134420672, 139683072, 144722688, 149181392, +153040960, 156255200, 158280816, 158397856, 156460288, 152775744, 147223424, 139280960, 129104568, 117684792, +105569760, 92379912, 78087336, 63820528, 50685444, 38562900, 26798448, 15387794, 4635344, -5815386, +-16722455, -28219546, -39760124, -51000052, -62167504, -73465416, -84478784, -94344864, -102413496, -108639048, +-113280296, -116241680, -116895592, -114715896, -109939888, -103384160, -95636040, -86646136, -76100912, -64054068, +-51193864, -38566120, -26919782, -16155519, -5476620, 5771363, 17424682, 28651190, 38631620, 47049220, +54205708, 60852172, 67741832, 75123808, 82692080, 90047208, 97074848, 103923176, 110883704, 118351584, +126650536, 135782704, 145463568, 155364000, 165216112, 174804640, 184064048, 193087232, 201897824, 210312208, +218072128, 224942464, 230699872, 235267040, 238810912, 241544128, 243650816, 245502480, 247508224, 249758784, +252559648, 256762272, 261317616, 260416752, 246926256, 221287984, 194087424, 176352432, 169659792, }, { 11786464, -25789668, 33872260, 16652125, -20252382, -45563160, -35004520, -2744484, 12291660, -8097624, -45591616, --76592688, -94264872, -89115736, -41623600, 34422016, 69206416, 8408472, -98491656, -133276056, -44265008, -95329480, 179870544, 181108576, 141069280, 94194536, 38961260, -29467234, -99621768, -160425088, -213080304, --260522512, -299208896, -325018432, -338040224, -339448448, -329772960, -311046368, -286593504, -258777152, -229226704, --199843216, -171641920, -144170784, -117346560, -92145304, -68815040, -46365784, -24428700, -3939559, 14218489, -29699162, 41950556, 50583976, 56514252, 61536680, 66855996, 72790032, 79448304, 86790016, 94313184, -101418136, 107935752, 113958904, 119470424, 124494456, 129352064, 134420672, 139683072, 144722688, 149181392, -153040960, 156255200, 158280816, 158397856, 156460288, 152775744, 147223424, 139280960, 129104568, 117684792, -105569760, 92379912, 78087336, 63820528, 50685444, 38562900, 26798448, 15387794, 4635344, -5815386, --16722455, -28219546, -39760124, -51000052, -62167504, -73465416, -84478784, -94344864, -102413496, -108639048, --113280296, -116241680, -116895592, -114715896, -109939888, -103384160, -95636040, -86646136, -76100912, -64054068, --51193864, -38566120, -26919782, -16155519, -5476620, 5771363, 17424682, 28651190, 38631620, 47049220, -54205708, 60852172, 67741832, 75123808, 82692080, 90047208, 97074848, 103923176, 110883704, 118351584, -126650536, 135782704, 145463568, 155364000, 165216112, 174804640, 184064048, 193087232, 201897824, 210312208, -218072128, 224942464, 230699872, 235267040, 238810912, 241544128, 243650816, 245502480, 247508224, 249758784, -252559648, 256762272, 261317616, 260416752, 246926256, 221287984, 194087424, 176352432, 169659792, }, +25789668, 33872260, 16652125, -20252382, -45563160, -35004520, -2744484, 12291660, -8097624, -45591616, +-76592688, -94264872, -89115736, -41623600, 34422016, 69206416, 8408472, -98491656, -133276056, -44265008, +95329480, 179870544, 181108576, 141069280, 94194536, 38961260, -29467234, -99621768, -160425088, -213080304, +-260522512, -299208896, -325018432, -338040224, -339448448, -329772960, -311046368, -286593504, -258777152, -229226704, +-199843216, -171641920, -144170784, -117346560, -92145304, -68815040, -46365784, -24428700, -3939559, 14218489, +29699162, 41950556, 50583976, 56514252, 61536680, 66855996, 72790032, 79448304, 86790016, 94313184, +101418136, 107935752, 113958904, 119470424, 124494456, 129352064, 134420672, 139683072, 144722688, 149181392, +153040960, 156255200, 158280816, 158397856, 156460288, 152775744, 147223424, 139280960, 129104568, 117684792, +105569760, 92379912, 78087336, 63820528, 50685444, 38562900, 26798448, 15387794, 4635344, -5815386, +-16722455, -28219546, -39760124, -51000052, -62167504, -73465416, -84478784, -94344864, -102413496, -108639048, +-113280296, -116241680, -116895592, -114715896, -109939888, -103384160, -95636040, -86646136, -76100912, -64054068, +-51193864, -38566120, -26919782, -16155519, -5476620, 5771363, 17424682, 28651190, 38631620, 47049220, +54205708, 60852172, 67741832, 75123808, 82692080, 90047208, 97074848, 103923176, 110883704, 118351584, +126650536, 135782704, 145463568, 155364000, 165216112, 174804640, 184064048, 193087232, 201897824, 210312208, +218072128, 224942464, 230699872, 235267040, 238810912, 241544128, 243650816, 245502480, 247508224, 249758784, +252559648, 256762272, 261317616, 260416752, 246926256, 221287984, 194087424, 176352432, 169659792, }, }, { { -4028143, --9701794, -11829414, -3768297, 8409009, 13034689, 10660109, 15154792, 31817654, 42967928, 22381074, --38646652, -116118736, -155936848, -106882408, 17986786, 117991344, 88319024, -55631100, -175194944, -155151936, --22438520, 107107896, 163734896, 163645776, 141754320, 103114648, 44587128, -20019380, -74875240, -119631480, --159479648, -192540704, -215611648, -231079440, -241096384, -242445536, -231967968, -211899728, -187148368, -161327568, --136807056, -115175992, -96413960, -79535816, -64121716, -49940268, -36028332, -21686364, -7558069, 5389110, -17023102, 27420682, 36199596, 43281996, 49421116, 55405616, 61469572, 67748280, 74530568, 81856704, -89521080, 97530120, 105970264, 114517784, 122714192, 130636264, 138667856, 146708560, 154226912, 161064496, -167516080, 173520976, 178387712, 181562768, 183142768, 183258208, 181393648, 176939760, 170231568, 162338496, -153725472, 143828784, 132326328, 120121648, 108309952, 96578784, 83629992, 69130720, 54300196, 40343164, -27209692, 14343043, 1941862, -9128416, -18303004, -25732760, -31920196, -37209448, -41509248, -44444320, --45890116, -46268608, -46170900, -45974404, -46022184, -46740520, -48153024, -49654652, -50677928, -51319492, --52062520, -53265112, -55057724, -57225608, -59023588, -59653876, -59118616, -58188752, -57553636, -57443040, --57839252, -58457188, -58693412, -58139900, -56941604, -55291260, -52981104, -49748068, -45523432, -40108016, --33250026, -25235080, -16774532, -8288213, 44560, 7775502, 14513768, 20418812, 25611964, 29609504, -32030256, 33180232, 33344516, 32455994, 30959734, 29850022, 29509110, 29776472, 31127776, 34277060, -39178156, 46445776, 58442692, 75504448, 91873112, 99620696, 97023312, 89856088, 84774064, }, +-9701794, -11829414, -3768297, 8409009, 13034689, 10660109, 15154792, 31817654, 42967928, 22381074, +-38646652, -116118736, -155936848, -106882408, 17986786, 117991344, 88319024, -55631100, -175194944, -155151936, +-22438520, 107107896, 163734896, 163645776, 141754320, 103114648, 44587128, -20019380, -74875240, -119631480, +-159479648, -192540704, -215611648, -231079440, -241096384, -242445536, -231967968, -211899728, -187148368, -161327568, +-136807056, -115175992, -96413960, -79535816, -64121716, -49940268, -36028332, -21686364, -7558069, 5389110, +17023102, 27420682, 36199596, 43281996, 49421116, 55405616, 61469572, 67748280, 74530568, 81856704, +89521080, 97530120, 105970264, 114517784, 122714192, 130636264, 138667856, 146708560, 154226912, 161064496, +167516080, 173520976, 178387712, 181562768, 183142768, 183258208, 181393648, 176939760, 170231568, 162338496, +153725472, 143828784, 132326328, 120121648, 108309952, 96578784, 83629992, 69130720, 54300196, 40343164, +27209692, 14343043, 1941862, -9128416, -18303004, -25732760, -31920196, -37209448, -41509248, -44444320, +-45890116, -46268608, -46170900, -45974404, -46022184, -46740520, -48153024, -49654652, -50677928, -51319492, +-52062520, -53265112, -55057724, -57225608, -59023588, -59653876, -59118616, -58188752, -57553636, -57443040, +-57839252, -58457188, -58693412, -58139900, -56941604, -55291260, -52981104, -49748068, -45523432, -40108016, +-33250026, -25235080, -16774532, -8288213, 44560, 7775502, 14513768, 20418812, 25611964, 29609504, +32030256, 33180232, 33344516, 32455994, 30959734, 29850022, 29509110, 29776472, 31127776, 34277060, +39178156, 46445776, 58442692, 75504448, 91873112, 99620696, 97023312, 89856088, 84774064, }, { 4028143, -9701794, 11829414, 3768297, -8409009, -13034689, -10660109, -15154792, -31817654, -42967928, -22381074, -38646652, 116118736, 155936848, 106882408, -17986786, -117991344, -88319024, 55631100, 175194944, 155151936, -22438520, -107107896, -163734896, -163645776, -141754320, -103114648, -44587128, 20019380, 74875240, 119631480, -159479648, 192540704, 215611648, 231079440, 241096384, 242445536, 231967968, 211899728, 187148368, 161327568, -136807056, 115175992, 96413960, 79535816, 64121716, 49940268, 36028332, 21686364, 7558069, -5389110, --17023102, -27420682, -36199596, -43281996, -49421116, -55405616, -61469572, -67748280, -74530568, -81856704, --89521080, -97530120, -105970264, -114517784, -122714192, -130636264, -138667856, -146708560, -154226912, -161064496, --167516080, -173520976, -178387712, -181562768, -183142768, -183258208, -181393648, -176939760, -170231568, -162338496, --153725472, -143828784, -132326328, -120121648, -108309952, -96578784, -83629992, -69130720, -54300196, -40343164, --27209692, -14343043, -1941862, 9128416, 18303004, 25732760, 31920196, 37209448, 41509248, 44444320, -45890116, 46268608, 46170900, 45974404, 46022184, 46740520, 48153024, 49654652, 50677928, 51319492, -52062520, 53265112, 55057724, 57225608, 59023588, 59653876, 59118616, 58188752, 57553636, 57443040, -57839252, 58457188, 58693412, 58139900, 56941604, 55291260, 52981104, 49748068, 45523432, 40108016, -33250026, 25235080, 16774532, 8288213, -44560, -7775502, -14513768, -20418812, -25611964, -29609504, --32030256, -33180232, -33344516, -32455994, -30959734, -29850022, -29509110, -29776472, -31127776, -34277060, --39178156, -46445776, -58442692, -75504448, -91873112, -99620696, -97023312, -89856088, -84774064, }, +9701794, 11829414, 3768297, -8409009, -13034689, -10660109, -15154792, -31817654, -42967928, -22381074, +38646652, 116118736, 155936848, 106882408, -17986786, -117991344, -88319024, 55631100, 175194944, 155151936, +22438520, -107107896, -163734896, -163645776, -141754320, -103114648, -44587128, 20019380, 74875240, 119631480, +159479648, 192540704, 215611648, 231079440, 241096384, 242445536, 231967968, 211899728, 187148368, 161327568, +136807056, 115175992, 96413960, 79535816, 64121716, 49940268, 36028332, 21686364, 7558069, -5389110, +-17023102, -27420682, -36199596, -43281996, -49421116, -55405616, -61469572, -67748280, -74530568, -81856704, +-89521080, -97530120, -105970264, -114517784, -122714192, -130636264, -138667856, -146708560, -154226912, -161064496, +-167516080, -173520976, -178387712, -181562768, -183142768, -183258208, -181393648, -176939760, -170231568, -162338496, +-153725472, -143828784, -132326328, -120121648, -108309952, -96578784, -83629992, -69130720, -54300196, -40343164, +-27209692, -14343043, -1941862, 9128416, 18303004, 25732760, 31920196, 37209448, 41509248, 44444320, +45890116, 46268608, 46170900, 45974404, 46022184, 46740520, 48153024, 49654652, 50677928, 51319492, +52062520, 53265112, 55057724, 57225608, 59023588, 59653876, 59118616, 58188752, 57553636, 57443040, +57839252, 58457188, 58693412, 58139900, 56941604, 55291260, 52981104, 49748068, 45523432, 40108016, +33250026, 25235080, 16774532, 8288213, -44560, -7775502, -14513768, -20418812, -25611964, -29609504, +-32030256, -33180232, -33344516, -32455994, -30959734, -29850022, -29509110, -29776472, -31127776, -34277060, +-39178156, -46445776, -58442692, -75504448, -91873112, -99620696, -97023312, -89856088, -84774064, }, }, { { 17964774, --6148246, -9459665, 17413408, 24617678, -15374372, -48695264, -7977365, 84730040, 133488656, 83583824, --20476256, -94089848, -92138320, -26839250, 51866024, 81462104, 32069448, -51904144, -84628032, -33337000, -45020384, 77433432, 55789476, 22835804, 6847789, 3155727, 4340602, 14636175, 35163436, 57389352, -74107512, 84549656, 88887568, 86885576, 80854904, 73137928, 62209380, 45836428, 25757992, 5853504, --11676942, -25855166, -35569308, -41002980, -44304736, -47410532, -50720880, -54160076, -57655640, -60502132, --61879740, -61896920, -60864520, -58007828, -52034604, -42496552, -29708288, -13909252, 4695473, 25484188, -47616156, 70463768, 93617936, 116656680, 138971184, 159720176, 178019952, 193147360, 204373872, 210771232, -211526608, 206346864, 195362496, 178964848, 157959776, 133424232, 106186088, 76969032, 47055660, 17911088, --10073309, -37474128, -64185600, -88910120, -110740360, -130227168, -148283744, -164888624, -179540368, -192255616, --203338240, -212553104, -219211376, -222908800, -223648608, -221320208, -215513936, -206016704, -193214480, -177784272, --160050880, -139891920, -117452320, -93894968, -71205192, -50973744, -33303176, -17053168, -1281511, 13631689, -26313118, 35674000, 41749768, 45529876, 48215304, 50524384, 52427056, 53514220, 53673132, 53345640, -53175452, 53623740, 54891828, 56893284, 59245852, 61529164, 63567664, 65269008, 66320200, 66337916, -65197068, 62964220, 59689844, 55530168, 50836308, 45907296, 40879500, 35956928, 31396748, 27166206, -23024246, 18983756, 15240155, 11680164, 7983271, 4147328, 373662, -3414499, -7357279, -11221139, --14868103, -18824304, -23437100, -27577986, -29235842, -27671400, -24319716, -21318608, -19778862, }, +-6148246, -9459665, 17413408, 24617678, -15374372, -48695264, -7977365, 84730040, 133488656, 83583824, +-20476256, -94089848, -92138320, -26839250, 51866024, 81462104, 32069448, -51904144, -84628032, -33337000, +45020384, 77433432, 55789476, 22835804, 6847789, 3155727, 4340602, 14636175, 35163436, 57389352, +74107512, 84549656, 88887568, 86885576, 80854904, 73137928, 62209380, 45836428, 25757992, 5853504, +-11676942, -25855166, -35569308, -41002980, -44304736, -47410532, -50720880, -54160076, -57655640, -60502132, +-61879740, -61896920, -60864520, -58007828, -52034604, -42496552, -29708288, -13909252, 4695473, 25484188, +47616156, 70463768, 93617936, 116656680, 138971184, 159720176, 178019952, 193147360, 204373872, 210771232, +211526608, 206346864, 195362496, 178964848, 157959776, 133424232, 106186088, 76969032, 47055660, 17911088, +-10073309, -37474128, -64185600, -88910120, -110740360, -130227168, -148283744, -164888624, -179540368, -192255616, +-203338240, -212553104, -219211376, -222908800, -223648608, -221320208, -215513936, -206016704, -193214480, -177784272, +-160050880, -139891920, -117452320, -93894968, -71205192, -50973744, -33303176, -17053168, -1281511, 13631689, +26313118, 35674000, 41749768, 45529876, 48215304, 50524384, 52427056, 53514220, 53673132, 53345640, +53175452, 53623740, 54891828, 56893284, 59245852, 61529164, 63567664, 65269008, 66320200, 66337916, +65197068, 62964220, 59689844, 55530168, 50836308, 45907296, 40879500, 35956928, 31396748, 27166206, +23024246, 18983756, 15240155, 11680164, 7983271, 4147328, 373662, -3414499, -7357279, -11221139, +-14868103, -18824304, -23437100, -27577986, -29235842, -27671400, -24319716, -21318608, -19778862, }, { -17964774, -6148246, 9459665, -17413408, -24617678, 15374372, 48695264, 7977365, -84730040, -133488656, -83583824, -20476256, 94089848, 92138320, 26839250, -51866024, -81462104, -32069448, 51904144, 84628032, 33337000, --45020384, -77433432, -55789476, -22835804, -6847789, -3155727, -4340602, -14636175, -35163436, -57389352, --74107512, -84549656, -88887568, -86885576, -80854904, -73137928, -62209380, -45836428, -25757992, -5853504, -11676942, 25855166, 35569308, 41002980, 44304736, 47410532, 50720880, 54160076, 57655640, 60502132, -61879740, 61896920, 60864520, 58007828, 52034604, 42496552, 29708288, 13909252, -4695473, -25484188, --47616156, -70463768, -93617936, -116656680, -138971184, -159720176, -178019952, -193147360, -204373872, -210771232, --211526608, -206346864, -195362496, -178964848, -157959776, -133424232, -106186088, -76969032, -47055660, -17911088, -10073309, 37474128, 64185600, 88910120, 110740360, 130227168, 148283744, 164888624, 179540368, 192255616, -203338240, 212553104, 219211376, 222908800, 223648608, 221320208, 215513936, 206016704, 193214480, 177784272, -160050880, 139891920, 117452320, 93894968, 71205192, 50973744, 33303176, 17053168, 1281511, -13631689, --26313118, -35674000, -41749768, -45529876, -48215304, -50524384, -52427056, -53514220, -53673132, -53345640, --53175452, -53623740, -54891828, -56893284, -59245852, -61529164, -63567664, -65269008, -66320200, -66337916, --65197068, -62964220, -59689844, -55530168, -50836308, -45907296, -40879500, -35956928, -31396748, -27166206, --23024246, -18983756, -15240155, -11680164, -7983271, -4147328, -373662, 3414499, 7357279, 11221139, -14868103, 18824304, 23437100, 27577986, 29235842, 27671400, 24319716, 21318608, 19778862, }, +6148246, 9459665, -17413408, -24617678, 15374372, 48695264, 7977365, -84730040, -133488656, -83583824, +20476256, 94089848, 92138320, 26839250, -51866024, -81462104, -32069448, 51904144, 84628032, 33337000, +-45020384, -77433432, -55789476, -22835804, -6847789, -3155727, -4340602, -14636175, -35163436, -57389352, +-74107512, -84549656, -88887568, -86885576, -80854904, -73137928, -62209380, -45836428, -25757992, -5853504, +11676942, 25855166, 35569308, 41002980, 44304736, 47410532, 50720880, 54160076, 57655640, 60502132, +61879740, 61896920, 60864520, 58007828, 52034604, 42496552, 29708288, 13909252, -4695473, -25484188, +-47616156, -70463768, -93617936, -116656680, -138971184, -159720176, -178019952, -193147360, -204373872, -210771232, +-211526608, -206346864, -195362496, -178964848, -157959776, -133424232, -106186088, -76969032, -47055660, -17911088, +10073309, 37474128, 64185600, 88910120, 110740360, 130227168, 148283744, 164888624, 179540368, 192255616, +203338240, 212553104, 219211376, 222908800, 223648608, 221320208, 215513936, 206016704, 193214480, 177784272, +160050880, 139891920, 117452320, 93894968, 71205192, 50973744, 33303176, 17053168, 1281511, -13631689, +-26313118, -35674000, -41749768, -45529876, -48215304, -50524384, -52427056, -53514220, -53673132, -53345640, +-53175452, -53623740, -54891828, -56893284, -59245852, -61529164, -63567664, -65269008, -66320200, -66337916, +-65197068, -62964220, -59689844, -55530168, -50836308, -45907296, -40879500, -35956928, -31396748, -27166206, +-23024246, -18983756, -15240155, -11680164, -7983271, -4147328, -373662, 3414499, 7357279, 11221139, +14868103, 18824304, 23437100, 27577986, 29235842, 27671400, 24319716, 21318608, 19778862, }, }, { { 4097399, -12105365, 9900973, -6716792, -20841328, -26265872, -41604812, -77798504, -110680232, -102088688, -33487860, -87101936, 218155888, 271257248, 162964480, -65653408, -226745280, -165586016, 49815716, 197829952, 160600640, -30589830, -48527760, -51201916, -36432060, -27878096, -3379066, 36307508, 59490664, 54769960, 42598024, -38815768, 39741868, 40969156, 45441828, 52869436, 58176404, 60235304, 61848064, 63494648, 63940252, -63437740, 61800284, 57372172, 50569480, 44151728, 38767448, 32506996, 24999394, 17683454, 10433012, -1802813, -8124468, -18282066, -28783260, -40001176, -50993608, -60793116, -69653096, -77717968, -84222696, --88771608, -91616488, -92343408, -89996744, -84433688, -76007496, -64386928, -49173080, -31016106, -10837276, -11263015, 35285840, 60425896, 85688352, 110569104, 134624144, 157159840, 177573808, 195347456, 209883776, -220957808, 228885248, 233705280, 234884784, 232269152, 226452144, 217828928, 206229296, 191663984, 174346688, -153916592, 129858872, 102837088, 74533792, 46139760, 17920214, -9808095, -36027796, -59157804, -77400680, --89521080, -95811056, -97738424, -96288336, -91280400, -82486456, -70603360, -56943212, -42917996, -29930016, --19014358, -10431939, -4008815, 282931, 2376728, 2290828, -146029, -5231270, -12693776, -21539260, --30823906, -40108552, -49162344, -57876832, -66484484, -75242456, -83971440, -92451320, -101007432, -110116520, --119754960, -129643048, -139730848, -150000128, -160265632, -170581600, -181351776, -192741488, -204456544, -216138320, --227413680, -237657184, -246387248, -253706400, -259749952, -264183440, -266929536, -268643776, -269709440, -269844736, --269494176, -269504352, -267268832, -255428688, -228801504, -192924032, -161751152, -144927760, -140091632, }, +12105365, 9900973, -6716792, -20841328, -26265872, -41604812, -77798504, -110680232, -102088688, -33487860, +87101936, 218155888, 271257248, 162964480, -65653408, -226745280, -165586016, 49815716, 197829952, 160600640, +30589830, -48527760, -51201916, -36432060, -27878096, -3379066, 36307508, 59490664, 54769960, 42598024, +38815768, 39741868, 40969156, 45441828, 52869436, 58176404, 60235304, 61848064, 63494648, 63940252, +63437740, 61800284, 57372172, 50569480, 44151728, 38767448, 32506996, 24999394, 17683454, 10433012, +1802813, -8124468, -18282066, -28783260, -40001176, -50993608, -60793116, -69653096, -77717968, -84222696, +-88771608, -91616488, -92343408, -89996744, -84433688, -76007496, -64386928, -49173080, -31016106, -10837276, +11263015, 35285840, 60425896, 85688352, 110569104, 134624144, 157159840, 177573808, 195347456, 209883776, +220957808, 228885248, 233705280, 234884784, 232269152, 226452144, 217828928, 206229296, 191663984, 174346688, +153916592, 129858872, 102837088, 74533792, 46139760, 17920214, -9808095, -36027796, -59157804, -77400680, +-89521080, -95811056, -97738424, -96288336, -91280400, -82486456, -70603360, -56943212, -42917996, -29930016, +-19014358, -10431939, -4008815, 282931, 2376728, 2290828, -146029, -5231270, -12693776, -21539260, +-30823906, -40108552, -49162344, -57876832, -66484484, -75242456, -83971440, -92451320, -101007432, -110116520, +-119754960, -129643048, -139730848, -150000128, -160265632, -170581600, -181351776, -192741488, -204456544, -216138320, +-227413680, -237657184, -246387248, -253706400, -259749952, -264183440, -266929536, -268643776, -269709440, -269844736, +-269494176, -269504352, -267268832, -255428688, -228801504, -192924032, -161751152, -144927760, -140091632, }, { 4097399, -12105365, 9900973, -6716792, -20841328, -26265872, -41604812, -77798504, -110680232, -102088688, -33487860, -87101936, 218155888, 271257248, 162964480, -65653408, -226745280, -165586016, 49815716, 197829952, 160600640, -30589830, -48527760, -51201916, -36432060, -27878096, -3379066, 36307508, 59490664, 54769960, 42598024, -38815768, 39741868, 40969156, 45441828, 52869436, 58176404, 60235304, 61848064, 63494648, 63940252, -63437740, 61800284, 57372172, 50569480, 44151728, 38767448, 32506996, 24999394, 17683454, 10433012, -1802813, -8124468, -18282066, -28783260, -40001176, -50993608, -60793116, -69653096, -77717968, -84222696, --88771608, -91616488, -92343408, -89996744, -84433688, -76007496, -64386928, -49173080, -31016106, -10837276, -11263015, 35285840, 60425896, 85688352, 110569104, 134624144, 157159840, 177573808, 195347456, 209883776, -220957808, 228885248, 233705280, 234884784, 232269152, 226452144, 217828928, 206229296, 191663984, 174346688, -153916592, 129858872, 102837088, 74533792, 46139760, 17920214, -9808095, -36027796, -59157804, -77400680, --89521080, -95811056, -97738424, -96288336, -91280400, -82486456, -70603360, -56943212, -42917996, -29930016, --19014358, -10431939, -4008815, 282931, 2376728, 2290828, -146029, -5231270, -12693776, -21539260, --30823906, -40108552, -49162344, -57876832, -66484484, -75242456, -83971440, -92451320, -101007432, -110116520, --119754960, -129643048, -139730848, -150000128, -160265632, -170581600, -181351776, -192741488, -204456544, -216138320, --227413680, -237657184, -246387248, -253706400, -259749952, -264183440, -266929536, -268643776, -269709440, -269844736, --269494176, -269504352, -267268832, -255428688, -228801504, -192924032, -161751152, -144927760, -140091632, }, +12105365, 9900973, -6716792, -20841328, -26265872, -41604812, -77798504, -110680232, -102088688, -33487860, +87101936, 218155888, 271257248, 162964480, -65653408, -226745280, -165586016, 49815716, 197829952, 160600640, +30589830, -48527760, -51201916, -36432060, -27878096, -3379066, 36307508, 59490664, 54769960, 42598024, +38815768, 39741868, 40969156, 45441828, 52869436, 58176404, 60235304, 61848064, 63494648, 63940252, +63437740, 61800284, 57372172, 50569480, 44151728, 38767448, 32506996, 24999394, 17683454, 10433012, +1802813, -8124468, -18282066, -28783260, -40001176, -50993608, -60793116, -69653096, -77717968, -84222696, +-88771608, -91616488, -92343408, -89996744, -84433688, -76007496, -64386928, -49173080, -31016106, -10837276, +11263015, 35285840, 60425896, 85688352, 110569104, 134624144, 157159840, 177573808, 195347456, 209883776, +220957808, 228885248, 233705280, 234884784, 232269152, 226452144, 217828928, 206229296, 191663984, 174346688, +153916592, 129858872, 102837088, 74533792, 46139760, 17920214, -9808095, -36027796, -59157804, -77400680, +-89521080, -95811056, -97738424, -96288336, -91280400, -82486456, -70603360, -56943212, -42917996, -29930016, +-19014358, -10431939, -4008815, 282931, 2376728, 2290828, -146029, -5231270, -12693776, -21539260, +-30823906, -40108552, -49162344, -57876832, -66484484, -75242456, -83971440, -92451320, -101007432, -110116520, +-119754960, -129643048, -139730848, -150000128, -160265632, -170581600, -181351776, -192741488, -204456544, -216138320, +-227413680, -237657184, -246387248, -253706400, -259749952, -264183440, -266929536, -268643776, -269709440, -269844736, +-269494176, -269504352, -267268832, -255428688, -228801504, -192924032, -161751152, -144927760, -140091632, }, }, { { 18727668, --11437498, -53266720, -83454976, -81330040, -33879240, 45314588, 106220984, 99013488, 29327110, -43024836, --68955160, -54369992, -31644246, -13194140, 5386963, 16087874, 3529390, -25078850, -41574208, -32392644, --13325673, -3602404, -1616518, 5564667, 21217138, 37810744, 49380848, 55175836, 54176716, 44300440, -27208080, 8718784, -6712497, -19377818, -32028108, -46491948, -62868120, -79971752, -95463168, -106619880, --112135688, -112968912, -111066784, -107736568, -103542000, -98983960, -94433448, -89733144, -84549112, -78931296, --73065448, -66820564, -60029684, -52891448, -45635640, -38110856, -30154966, -22127672, -14702210, -8305393, --3034395, 1028645, 3723200, 5088463, 5648419, 6205691, 7199976, 8467528, 9920301, 12130061, -15741592, 20657182, 26497800, 33588256, 42718280, 54120348, 67389648, 82216952, 98528160, 116023176, -134091024, 152043984, 169242112, 185334288, 200375264, 214161568, 225654896, 234013984, 240021568, 245238336, -249632096, 251240560, 248440768, 241481312, 231461152, 218694896, 202561392, 182544704, 159153776, 133785544, -107536856, 80280456, 51447264, 21588116, -7601555, -34870304, -60346436, -84909352, -109207600, -133091912, --155438080, -174749328, -190429184, -203171824, -213856624, -222637680, -229308304, -233832512, -236274208, -236900736, --236457808, -235688480, -234648560, -233085184, -231158368, -229137040, -226815072, -223780688, -219724624, -214168544, --206731808, -197954512, -188937216, -180019264, -170715280, -160727344, -149907776, -137711680, -124003224, -109887272, --96534760, -83916144, -71652400, -59930364, -48608292, -36891620, -24775518, -13274670, -2723546, 7456600, -17607756, 28748364, 43400644, 61654792, 77274512, 82553568, 77250352, 68650224, 63350232, }, +-11437498, -53266720, -83454976, -81330040, -33879240, 45314588, 106220984, 99013488, 29327110, -43024836, +-68955160, -54369992, -31644246, -13194140, 5386963, 16087874, 3529390, -25078850, -41574208, -32392644, +-13325673, -3602404, -1616518, 5564667, 21217138, 37810744, 49380848, 55175836, 54176716, 44300440, +27208080, 8718784, -6712497, -19377818, -32028108, -46491948, -62868120, -79971752, -95463168, -106619880, +-112135688, -112968912, -111066784, -107736568, -103542000, -98983960, -94433448, -89733144, -84549112, -78931296, +-73065448, -66820564, -60029684, -52891448, -45635640, -38110856, -30154966, -22127672, -14702210, -8305393, +-3034395, 1028645, 3723200, 5088463, 5648419, 6205691, 7199976, 8467528, 9920301, 12130061, +15741592, 20657182, 26497800, 33588256, 42718280, 54120348, 67389648, 82216952, 98528160, 116023176, +134091024, 152043984, 169242112, 185334288, 200375264, 214161568, 225654896, 234013984, 240021568, 245238336, +249632096, 251240560, 248440768, 241481312, 231461152, 218694896, 202561392, 182544704, 159153776, 133785544, +107536856, 80280456, 51447264, 21588116, -7601555, -34870304, -60346436, -84909352, -109207600, -133091912, +-155438080, -174749328, -190429184, -203171824, -213856624, -222637680, -229308304, -233832512, -236274208, -236900736, +-236457808, -235688480, -234648560, -233085184, -231158368, -229137040, -226815072, -223780688, -219724624, -214168544, +-206731808, -197954512, -188937216, -180019264, -170715280, -160727344, -149907776, -137711680, -124003224, -109887272, +-96534760, -83916144, -71652400, -59930364, -48608292, -36891620, -24775518, -13274670, -2723546, 7456600, +17607756, 28748364, 43400644, 61654792, 77274512, 82553568, 77250352, 68650224, 63350232, }, { 18727668, --11437498, -53266720, -83454976, -81330040, -33879240, 45314588, 106220984, 99013488, 29327110, -43024836, --68955160, -54369992, -31644246, -13194140, 5386963, 16087874, 3529390, -25078850, -41574208, -32392644, --13325673, -3602404, -1616518, 5564667, 21217138, 37810744, 49380848, 55175836, 54176716, 44300440, -27208080, 8718784, -6712497, -19377818, -32028108, -46491948, -62868120, -79971752, -95463168, -106619880, --112135688, -112968912, -111066784, -107736568, -103542000, -98983960, -94433448, -89733144, -84549112, -78931296, --73065448, -66820564, -60029684, -52891448, -45635640, -38110856, -30154966, -22127672, -14702210, -8305393, --3034395, 1028645, 3723200, 5088463, 5648419, 6205691, 7199976, 8467528, 9920301, 12130061, -15741592, 20657182, 26497800, 33588256, 42718280, 54120348, 67389648, 82216952, 98528160, 116023176, -134091024, 152043984, 169242112, 185334288, 200375264, 214161568, 225654896, 234013984, 240021568, 245238336, -249632096, 251240560, 248440768, 241481312, 231461152, 218694896, 202561392, 182544704, 159153776, 133785544, -107536856, 80280456, 51447264, 21588116, -7601555, -34870304, -60346436, -84909352, -109207600, -133091912, --155438080, -174749328, -190429184, -203171824, -213856624, -222637680, -229308304, -233832512, -236274208, -236900736, --236457808, -235688480, -234648560, -233085184, -231158368, -229137040, -226815072, -223780688, -219724624, -214168544, --206731808, -197954512, -188937216, -180019264, -170715280, -160727344, -149907776, -137711680, -124003224, -109887272, --96534760, -83916144, -71652400, -59930364, -48608292, -36891620, -24775518, -13274670, -2723546, 7456600, -17607756, 28748364, 43400644, 61654792, 77274512, 82553568, 77250352, 68650224, 63350232, }, +-11437498, -53266720, -83454976, -81330040, -33879240, 45314588, 106220984, 99013488, 29327110, -43024836, +-68955160, -54369992, -31644246, -13194140, 5386963, 16087874, 3529390, -25078850, -41574208, -32392644, +-13325673, -3602404, -1616518, 5564667, 21217138, 37810744, 49380848, 55175836, 54176716, 44300440, +27208080, 8718784, -6712497, -19377818, -32028108, -46491948, -62868120, -79971752, -95463168, -106619880, +-112135688, -112968912, -111066784, -107736568, -103542000, -98983960, -94433448, -89733144, -84549112, -78931296, +-73065448, -66820564, -60029684, -52891448, -45635640, -38110856, -30154966, -22127672, -14702210, -8305393, +-3034395, 1028645, 3723200, 5088463, 5648419, 6205691, 7199976, 8467528, 9920301, 12130061, +15741592, 20657182, 26497800, 33588256, 42718280, 54120348, 67389648, 82216952, 98528160, 116023176, +134091024, 152043984, 169242112, 185334288, 200375264, 214161568, 225654896, 234013984, 240021568, 245238336, +249632096, 251240560, 248440768, 241481312, 231461152, 218694896, 202561392, 182544704, 159153776, 133785544, +107536856, 80280456, 51447264, 21588116, -7601555, -34870304, -60346436, -84909352, -109207600, -133091912, +-155438080, -174749328, -190429184, -203171824, -213856624, -222637680, -229308304, -233832512, -236274208, -236900736, +-236457808, -235688480, -234648560, -233085184, -231158368, -229137040, -226815072, -223780688, -219724624, -214168544, +-206731808, -197954512, -188937216, -180019264, -170715280, -160727344, -149907776, -137711680, -124003224, -109887272, +-96534760, -83916144, -71652400, -59930364, -48608292, -36891620, -24775518, -13274670, -2723546, 7456600, +17607756, 28748364, 43400644, 61654792, 77274512, 82553568, 77250352, 68650224, 63350232, }, }, { { -22726820, -28139552, 65842384, 53941568, 13258027, -44198436, -138545984, -254022624, -313942240, -261710608, -114174192, -89050776, 307671040, 429789856, 296704384, -81071800, -409902560, -376489312, -16853452, 316269056, 363651136, -201527376, 48773648, -14806900, -51604032, -102137008, -141103104, -155091264, -165697696, -180655456, -182950032, --166900816, -145012048, -122601992, -94267552, -60898340, -29658896, -2320893, 22440668, 41754600, 53427244, -61154428, 68311992, 73379520, 75195752, 75655312, 75098040, 71666896, 66141960, 61661772, 58882392, -56165824, 53215720, 50490560, 46983720, 41840496, 35969816, 29886530, 22597434, 13982803, 5356898, --3058554, -12309376, -22238804, -31666794, -40648108, -49917720, -58843200, -66265976, -72393824, -77924128, --82560544, -85977728, -88859656, -91780232, -94406064, -96492344, -98289792, -99738264, -100664904, -101653824, --103407784, -105657808, -107865960, -110244832, -112984480, -115367656, -116614808, -116716808, -115826144, -113860120, --111085032, -108066208, -104995304, -102168144, -100880728, -102568112, -107256608, -113988432, -122389392, -132765496, --145016352, -158311952, -171488384, -183303840, -192878384, -200196480, -205611888, -208824528, -209097792, -206349552, --201248752, -194439072, -186380640, -177582400, -168258032, -158151968, -147309328, -136534864, -126621544, -117624656, --109132432, -100621424, -91466696, -81385872, -70982928, -61176440, -52158084, -43499428, -34953516, -26438744, --17656610, -8459475, 754304, 9605694, 18262200, 26974006, 35667020, 44361644, 53363360, 62696860, -71919768, 80702432, 89022864, 96714608, 103426032, 109095928, 113979304, 118189448, 121602872, 124224416, -126407864, 128414152, 129241472, 126000384, 115996328, 100630544, 85895584, 77125264, 74235288, }, +28139552, 65842384, 53941568, 13258027, -44198436, -138545984, -254022624, -313942240, -261710608, -114174192, +89050776, 307671040, 429789856, 296704384, -81071800, -409902560, -376489312, -16853452, 316269056, 363651136, +201527376, 48773648, -14806900, -51604032, -102137008, -141103104, -155091264, -165697696, -180655456, -182950032, +-166900816, -145012048, -122601992, -94267552, -60898340, -29658896, -2320893, 22440668, 41754600, 53427244, +61154428, 68311992, 73379520, 75195752, 75655312, 75098040, 71666896, 66141960, 61661772, 58882392, +56165824, 53215720, 50490560, 46983720, 41840496, 35969816, 29886530, 22597434, 13982803, 5356898, +-3058554, -12309376, -22238804, -31666794, -40648108, -49917720, -58843200, -66265976, -72393824, -77924128, +-82560544, -85977728, -88859656, -91780232, -94406064, -96492344, -98289792, -99738264, -100664904, -101653824, +-103407784, -105657808, -107865960, -110244832, -112984480, -115367656, -116614808, -116716808, -115826144, -113860120, +-111085032, -108066208, -104995304, -102168144, -100880728, -102568112, -107256608, -113988432, -122389392, -132765496, +-145016352, -158311952, -171488384, -183303840, -192878384, -200196480, -205611888, -208824528, -209097792, -206349552, +-201248752, -194439072, -186380640, -177582400, -168258032, -158151968, -147309328, -136534864, -126621544, -117624656, +-109132432, -100621424, -91466696, -81385872, -70982928, -61176440, -52158084, -43499428, -34953516, -26438744, +-17656610, -8459475, 754304, 9605694, 18262200, 26974006, 35667020, 44361644, 53363360, 62696860, +71919768, 80702432, 89022864, 96714608, 103426032, 109095928, 113979304, 118189448, 121602872, 124224416, +126407864, 128414152, 129241472, 126000384, 115996328, 100630544, 85895584, 77125264, 74235288, }, { -22726820, -28139552, 65842384, 53941568, 13258027, -44198436, -138545984, -254022624, -313942240, -261710608, -114174192, -89050776, 307671040, 429789856, 296704384, -81071800, -409902560, -376489312, -16853452, 316269056, 363651136, -201527376, 48773648, -14806900, -51604032, -102137008, -141103104, -155091264, -165697696, -180655456, -182950032, --166900816, -145012048, -122601992, -94267552, -60898340, -29658896, -2320893, 22440668, 41754600, 53427244, -61154428, 68311992, 73379520, 75195752, 75655312, 75098040, 71666896, 66141960, 61661772, 58882392, -56165824, 53215720, 50490560, 46983720, 41840496, 35969816, 29886530, 22597434, 13982803, 5356898, --3058554, -12309376, -22238804, -31666794, -40648108, -49917720, -58843200, -66265976, -72393824, -77924128, --82560544, -85977728, -88859656, -91780232, -94406064, -96492344, -98289792, -99738264, -100664904, -101653824, --103407784, -105657808, -107865960, -110244832, -112984480, -115367656, -116614808, -116716808, -115826144, -113860120, --111085032, -108066208, -104995304, -102168144, -100880728, -102568112, -107256608, -113988432, -122389392, -132765496, --145016352, -158311952, -171488384, -183303840, -192878384, -200196480, -205611888, -208824528, -209097792, -206349552, --201248752, -194439072, -186380640, -177582400, -168258032, -158151968, -147309328, -136534864, -126621544, -117624656, --109132432, -100621424, -91466696, -81385872, -70982928, -61176440, -52158084, -43499428, -34953516, -26438744, --17656610, -8459475, 754304, 9605694, 18262200, 26974006, 35667020, 44361644, 53363360, 62696860, -71919768, 80702432, 89022864, 96714608, 103426032, 109095928, 113979304, 118189448, 121602872, 124224416, -126407864, 128414152, 129241472, 126000384, 115996328, 100630544, 85895584, 77125264, 74235288, }, +28139552, 65842384, 53941568, 13258027, -44198436, -138545984, -254022624, -313942240, -261710608, -114174192, +89050776, 307671040, 429789856, 296704384, -81071800, -409902560, -376489312, -16853452, 316269056, 363651136, +201527376, 48773648, -14806900, -51604032, -102137008, -141103104, -155091264, -165697696, -180655456, -182950032, +-166900816, -145012048, -122601992, -94267552, -60898340, -29658896, -2320893, 22440668, 41754600, 53427244, +61154428, 68311992, 73379520, 75195752, 75655312, 75098040, 71666896, 66141960, 61661772, 58882392, +56165824, 53215720, 50490560, 46983720, 41840496, 35969816, 29886530, 22597434, 13982803, 5356898, +-3058554, -12309376, -22238804, -31666794, -40648108, -49917720, -58843200, -66265976, -72393824, -77924128, +-82560544, -85977728, -88859656, -91780232, -94406064, -96492344, -98289792, -99738264, -100664904, -101653824, +-103407784, -105657808, -107865960, -110244832, -112984480, -115367656, -116614808, -116716808, -115826144, -113860120, +-111085032, -108066208, -104995304, -102168144, -100880728, -102568112, -107256608, -113988432, -122389392, -132765496, +-145016352, -158311952, -171488384, -183303840, -192878384, -200196480, -205611888, -208824528, -209097792, -206349552, +-201248752, -194439072, -186380640, -177582400, -168258032, -158151968, -147309328, -136534864, -126621544, -117624656, +-109132432, -100621424, -91466696, -81385872, -70982928, -61176440, -52158084, -43499428, -34953516, -26438744, +-17656610, -8459475, 754304, 9605694, 18262200, 26974006, 35667020, 44361644, 53363360, 62696860, +71919768, 80702432, 89022864, 96714608, 103426032, 109095928, 113979304, 118189448, 121602872, 124224416, +126407864, 128414152, 129241472, 126000384, 115996328, 100630544, 85895584, 77125264, 74235288, }, }, { { -20780662, --21712670, -17408040, -4653060, 21265456, 64972656, 107825688, 112669344, 68903624, -6364068, -119698592, --273759616, -361284064, -213446992, 145631600, 404616512, 284796608, -98422936, -355922336, -287288224, -61032560, -72851232, 74783968, 54613732, 64385316, 67689224, 44145820, 18436684, 4584341, -10081362, -30307974, --44483512, -47537772, -45814416, -43122008, -38670812, -33785824, -29936996, -25370908, -19680078, -15792595, --14354318, -12443594, -9336185, -7518877, -7590818, -7566659, -6946036, -6852084, -6891275, -5601711, --2967286, 188979, 3899294, 8224863, 12344273, 15734613, 18702972, 21189222, 22669912, 23339390, -23837606, 24029268, 23412404, 22183506, 20727512, 18799072, 16165720, 13209709, 10209137, 6907918, -3212099, -631897, -4758287, -9677635, -15535970, -22126060, -29405494, -37317360, -45499808, -53783192, --62446676, -71462352, -80083424, -87622168, -94094680, -99766184, -104549168, -108045272, -109799768, -109517368, --107325864, -103726144, -99096704, -93572304, -87521768, -81644640, -76410152, -71863392, -68115496, -65553548, --64393908, -64374580, -64973192, -65784940, -66783520, -68330784, -70728984, -73718280, -76666240, -79216912, --81465328, -83594560, -85681912, -87680680, -89303648, -90122912, -90061168, -89528056, -88929448, -88313656, --87506200, -86191400, -83928496, -80525808, -76309760, -71669048, -66557496, -60737280, -54133232, -46667504, --38247220, -29160680, -19973746, -10924249, -1928440, 6921877, 15493558, 23987392, 32513440, 40642740, -47986060, 54708220, 61007864, 66839892, 72506568, 78620984, 85303960, 92386896, 100205344, 109109352, -119048440, 130876240, 145829168, 161037648, 168272528, 161819328, 146276384, 132125544, 125181656, }, +-21712670, -17408040, -4653060, 21265456, 64972656, 107825688, 112669344, 68903624, -6364068, -119698592, +-273759616, -361284064, -213446992, 145631600, 404616512, 284796608, -98422936, -355922336, -287288224, -61032560, +72851232, 74783968, 54613732, 64385316, 67689224, 44145820, 18436684, 4584341, -10081362, -30307974, +-44483512, -47537772, -45814416, -43122008, -38670812, -33785824, -29936996, -25370908, -19680078, -15792595, +-14354318, -12443594, -9336185, -7518877, -7590818, -7566659, -6946036, -6852084, -6891275, -5601711, +-2967286, 188979, 3899294, 8224863, 12344273, 15734613, 18702972, 21189222, 22669912, 23339390, +23837606, 24029268, 23412404, 22183506, 20727512, 18799072, 16165720, 13209709, 10209137, 6907918, +3212099, -631897, -4758287, -9677635, -15535970, -22126060, -29405494, -37317360, -45499808, -53783192, +-62446676, -71462352, -80083424, -87622168, -94094680, -99766184, -104549168, -108045272, -109799768, -109517368, +-107325864, -103726144, -99096704, -93572304, -87521768, -81644640, -76410152, -71863392, -68115496, -65553548, +-64393908, -64374580, -64973192, -65784940, -66783520, -68330784, -70728984, -73718280, -76666240, -79216912, +-81465328, -83594560, -85681912, -87680680, -89303648, -90122912, -90061168, -89528056, -88929448, -88313656, +-87506200, -86191400, -83928496, -80525808, -76309760, -71669048, -66557496, -60737280, -54133232, -46667504, +-38247220, -29160680, -19973746, -10924249, -1928440, 6921877, 15493558, 23987392, 32513440, 40642740, +47986060, 54708220, 61007864, 66839892, 72506568, 78620984, 85303960, 92386896, 100205344, 109109352, +119048440, 130876240, 145829168, 161037648, 168272528, 161819328, 146276384, 132125544, 125181656, }, { 20780662, -21712670, 17408040, 4653060, -21265456, -64972656, -107825688, -112669344, -68903624, 6364068, 119698592, -273759616, 361284064, 213446992, -145631600, -404616512, -284796608, 98422936, 355922336, 287288224, 61032560, --72851232, -74783968, -54613732, -64385316, -67689224, -44145820, -18436684, -4584341, 10081362, 30307974, -44483512, 47537772, 45814416, 43122008, 38670812, 33785824, 29936996, 25370908, 19680078, 15792595, -14354318, 12443594, 9336185, 7518877, 7590818, 7566659, 6946036, 6852084, 6891275, 5601711, -2967286, -188979, -3899294, -8224863, -12344273, -15734613, -18702972, -21189222, -22669912, -23339390, --23837606, -24029268, -23412404, -22183506, -20727512, -18799072, -16165720, -13209709, -10209137, -6907918, --3212099, 631897, 4758287, 9677635, 15535970, 22126060, 29405494, 37317360, 45499808, 53783192, -62446676, 71462352, 80083424, 87622168, 94094680, 99766184, 104549168, 108045272, 109799768, 109517368, -107325864, 103726144, 99096704, 93572304, 87521768, 81644640, 76410152, 71863392, 68115496, 65553548, -64393908, 64374580, 64973192, 65784940, 66783520, 68330784, 70728984, 73718280, 76666240, 79216912, -81465328, 83594560, 85681912, 87680680, 89303648, 90122912, 90061168, 89528056, 88929448, 88313656, -87506200, 86191400, 83928496, 80525808, 76309760, 71669048, 66557496, 60737280, 54133232, 46667504, -38247220, 29160680, 19973746, 10924249, 1928440, -6921877, -15493558, -23987392, -32513440, -40642740, --47986060, -54708220, -61007864, -66839892, -72506568, -78620984, -85303960, -92386896, -100205344, -109109352, --119048440, -130876240, -145829168, -161037648, -168272528, -161819328, -146276384, -132125544, -125181656, }, +21712670, 17408040, 4653060, -21265456, -64972656, -107825688, -112669344, -68903624, 6364068, 119698592, +273759616, 361284064, 213446992, -145631600, -404616512, -284796608, 98422936, 355922336, 287288224, 61032560, +-72851232, -74783968, -54613732, -64385316, -67689224, -44145820, -18436684, -4584341, 10081362, 30307974, +44483512, 47537772, 45814416, 43122008, 38670812, 33785824, 29936996, 25370908, 19680078, 15792595, +14354318, 12443594, 9336185, 7518877, 7590818, 7566659, 6946036, 6852084, 6891275, 5601711, +2967286, -188979, -3899294, -8224863, -12344273, -15734613, -18702972, -21189222, -22669912, -23339390, +-23837606, -24029268, -23412404, -22183506, -20727512, -18799072, -16165720, -13209709, -10209137, -6907918, +-3212099, 631897, 4758287, 9677635, 15535970, 22126060, 29405494, 37317360, 45499808, 53783192, +62446676, 71462352, 80083424, 87622168, 94094680, 99766184, 104549168, 108045272, 109799768, 109517368, +107325864, 103726144, 99096704, 93572304, 87521768, 81644640, 76410152, 71863392, 68115496, 65553548, +64393908, 64374580, 64973192, 65784940, 66783520, 68330784, 70728984, 73718280, 76666240, 79216912, +81465328, 83594560, 85681912, 87680680, 89303648, 90122912, 90061168, 89528056, 88929448, 88313656, +87506200, 86191400, 83928496, 80525808, 76309760, 71669048, 66557496, 60737280, 54133232, 46667504, +38247220, 29160680, 19973746, 10924249, 1928440, -6921877, -15493558, -23987392, -32513440, -40642740, +-47986060, -54708220, -61007864, -66839892, -72506568, -78620984, -85303960, -92386896, -100205344, -109109352, +-119048440, -130876240, -145829168, -161037648, -168272528, -161819328, -146276384, -132125544, -125181656, }, }, { { -6142340, --1752884, 2153389, -253403, -14878840, -40603012, -54955716, -25999048, 40649716, 85347976, 57532696, --15068893, -56675316, -38612292, -4403952, 3061775, -4886062, 594853, 14398341, 12999255, -2433636, --10459856, -5893232, -4413079, -13902272, -23233088, -21329344, -11317776, -1985349, 3565360, 6399502, -6265821, 2057289, -5651103, -14944339, -23817204, -30613454, -34868156, -37777996, -40564892, -42690364, --42750492, -40518720, -37063420, -33477122, -30520574, -28937342, -29060822, -30284888, -31540092, -32114544, --31699006, -30080878, -27246736, -23538568, -19363860, -14906758, -10248866, -5544266, -918586, 3623342, -8079371, 12317966, 16100759, 19237696, 21731460, 23732378, 25309706, 26402774, 27111982, 27790586, -28637768, 29481192, 30255898, 31381716, 33338610, 36192080, 39929236, 44916768, 51591684, 59942176, -69655776, 80563920, 92683784, 106019656, 120433568, 135449840, 150231520, 164097280, 176961776, 188793344, -198764640, 205487344, 208043376, 206330768, 200533632, 190734128, 177053584, 159909680, 140229616, 119414584, -98722504, 78572672, 58887224, 40159556, 23593330, 9991705, -1092532, -10959146, -20775830, -30835718, --40430136, -48541184, -54919748, -60304024, -65514356, -70714488, -75657456, -80133352, -84022984, -87416544, --90787016, -94607928, -98813240, -102997072, -106955424, -110626008, -113824152, -116454280, -118649544, -120379344, --121370944, -121642600, -121586768, -121387048, -120952720, -120379880, -119800056, -118943216, -117592448, -116182088, --115217864, -114570400, -114006688, -113704968, -113555176, -112869056, -111450640, -109896936, -108371152, -106411576, --104070816, -100995080, -93944896, -78418048, -54832772, -31004296, -15928960, -11644193, -12591233, }, +-1752884, 2153389, -253403, -14878840, -40603012, -54955716, -25999048, 40649716, 85347976, 57532696, +-15068893, -56675316, -38612292, -4403952, 3061775, -4886062, 594853, 14398341, 12999255, -2433636, +-10459856, -5893232, -4413079, -13902272, -23233088, -21329344, -11317776, -1985349, 3565360, 6399502, +6265821, 2057289, -5651103, -14944339, -23817204, -30613454, -34868156, -37777996, -40564892, -42690364, +-42750492, -40518720, -37063420, -33477122, -30520574, -28937342, -29060822, -30284888, -31540092, -32114544, +-31699006, -30080878, -27246736, -23538568, -19363860, -14906758, -10248866, -5544266, -918586, 3623342, +8079371, 12317966, 16100759, 19237696, 21731460, 23732378, 25309706, 26402774, 27111982, 27790586, +28637768, 29481192, 30255898, 31381716, 33338610, 36192080, 39929236, 44916768, 51591684, 59942176, +69655776, 80563920, 92683784, 106019656, 120433568, 135449840, 150231520, 164097280, 176961776, 188793344, +198764640, 205487344, 208043376, 206330768, 200533632, 190734128, 177053584, 159909680, 140229616, 119414584, +98722504, 78572672, 58887224, 40159556, 23593330, 9991705, -1092532, -10959146, -20775830, -30835718, +-40430136, -48541184, -54919748, -60304024, -65514356, -70714488, -75657456, -80133352, -84022984, -87416544, +-90787016, -94607928, -98813240, -102997072, -106955424, -110626008, -113824152, -116454280, -118649544, -120379344, +-121370944, -121642600, -121586768, -121387048, -120952720, -120379880, -119800056, -118943216, -117592448, -116182088, +-115217864, -114570400, -114006688, -113704968, -113555176, -112869056, -111450640, -109896936, -108371152, -106411576, +-104070816, -100995080, -93944896, -78418048, -54832772, -31004296, -15928960, -11644193, -12591233, }, { 6142340, -1752884, -2153389, 253403, 14878840, 40603012, 54955716, 25999048, -40649716, -85347976, -57532696, -15068893, 56675316, 38612292, 4403952, -3061775, 4886062, -594853, -14398341, -12999255, 2433636, -10459856, 5893232, 4413079, 13902272, 23233088, 21329344, 11317776, 1985349, -3565360, -6399502, --6265821, -2057289, 5651103, 14944339, 23817204, 30613454, 34868156, 37777996, 40564892, 42690364, -42750492, 40518720, 37063420, 33477122, 30520574, 28937342, 29060822, 30284888, 31540092, 32114544, -31699006, 30080878, 27246736, 23538568, 19363860, 14906758, 10248866, 5544266, 918586, -3623342, --8079371, -12317966, -16100759, -19237696, -21731460, -23732378, -25309706, -26402774, -27111982, -27790586, --28637768, -29481192, -30255898, -31381716, -33338610, -36192080, -39929236, -44916768, -51591684, -59942176, --69655776, -80563920, -92683784, -106019656, -120433568, -135449840, -150231520, -164097280, -176961776, -188793344, --198764640, -205487344, -208043376, -206330768, -200533632, -190734128, -177053584, -159909680, -140229616, -119414584, --98722504, -78572672, -58887224, -40159556, -23593330, -9991705, 1092532, 10959146, 20775830, 30835718, -40430136, 48541184, 54919748, 60304024, 65514356, 70714488, 75657456, 80133352, 84022984, 87416544, -90787016, 94607928, 98813240, 102997072, 106955424, 110626008, 113824152, 116454280, 118649544, 120379344, -121370944, 121642600, 121586768, 121387048, 120952720, 120379880, 119800056, 118943216, 117592448, 116182088, -115217864, 114570400, 114006688, 113704968, 113555176, 112869056, 111450640, 109896936, 108371152, 106411576, -104070816, 100995080, 93944896, 78418048, 54832772, 31004296, 15928960, 11644193, 12591233, }, +1752884, -2153389, 253403, 14878840, 40603012, 54955716, 25999048, -40649716, -85347976, -57532696, +15068893, 56675316, 38612292, 4403952, -3061775, 4886062, -594853, -14398341, -12999255, 2433636, +10459856, 5893232, 4413079, 13902272, 23233088, 21329344, 11317776, 1985349, -3565360, -6399502, +-6265821, -2057289, 5651103, 14944339, 23817204, 30613454, 34868156, 37777996, 40564892, 42690364, +42750492, 40518720, 37063420, 33477122, 30520574, 28937342, 29060822, 30284888, 31540092, 32114544, +31699006, 30080878, 27246736, 23538568, 19363860, 14906758, 10248866, 5544266, 918586, -3623342, +-8079371, -12317966, -16100759, -19237696, -21731460, -23732378, -25309706, -26402774, -27111982, -27790586, +-28637768, -29481192, -30255898, -31381716, -33338610, -36192080, -39929236, -44916768, -51591684, -59942176, +-69655776, -80563920, -92683784, -106019656, -120433568, -135449840, -150231520, -164097280, -176961776, -188793344, +-198764640, -205487344, -208043376, -206330768, -200533632, -190734128, -177053584, -159909680, -140229616, -119414584, +-98722504, -78572672, -58887224, -40159556, -23593330, -9991705, 1092532, 10959146, 20775830, 30835718, +40430136, 48541184, 54919748, 60304024, 65514356, 70714488, 75657456, 80133352, 84022984, 87416544, +90787016, 94607928, 98813240, 102997072, 106955424, 110626008, 113824152, 116454280, 118649544, 120379344, +121370944, 121642600, 121586768, 121387048, 120952720, 120379880, 119800056, 118943216, 117592448, 116182088, +115217864, 114570400, 114006688, 113704968, 113555176, 112869056, 111450640, 109896936, 108371152, 106411576, +104070816, 100995080, 93944896, 78418048, 54832772, 31004296, 15928960, 11644193, 12591233, }, }, { { -12293807, --4858682, 11296838, 19100256, 3861713, -5900748, 36241472, 116374824, 146012784, 51534240, -132524440, --269747040, -229335152, -13444858, 212266944, 253539968, 85124640, -115891640, -166048272, -67431520, 38611756, -62862216, 38062000, 19412178, 5471252, -21926882, -46705620, -45556720, -28509992, -20809116, -26320634, --31532576, -29571386, -22053584, -8328479, 12683575, 36189932, 55955908, 70685496, 81685448, 89103392, -93404800, 96296392, 98277440, 98371928, 96653944, 94194000, 90911576, 86037320, 79888000, 72978472, -64399276, 52976812, 39047160, 23758686, 7796977, -8194798, -23222888, -36919540, -49907520, -62626528, --74701296, -85702848, -95545840, -103881840, -109858824, -112652696, -111763640, -106924288, -98160944, -85775328, --69952672, -50720344, -28536300, -4487167, 20426864, 45805288, 71338336, 96167000, 119163864, 139693280, -157771328, 173507552, 186629744, 196671392, 203482128, 207318608, 208383760, 206505792, 201380816, 192836512, -180638272, 164359808, 143832016, 119569744, 92430920, 63056564, 32062468, 675921, -29271276, -56125560, --79089672, -98170608, -113548736, -124903016, -131351912, -132275328, -128254168, -120941984, -111917720, -101868568, --90853592, -78939352, -66391068, -53582940, -40999756, -29189672, -18582712, -9393093, -1646046, 4900021, -10785737, 16521129, 22140556, 27170500, 30990336, 33161442, 33582888, 32519344, 30390652, 27408870, -23448374, 18280992, 11822971, 4185983, -4341675, -13386876, -22716082, -32304596, -42073500, -51706036, --60841432, -69281040, -76887432, -83512952, -89127016, -93801016, -97536560, -100308424, -102233640, -103560248, --104703784, -106144208, -107347336, -105644920, -97930088, -84797152, -71584760, -63486060, -60742648, }, +-4858682, 11296838, 19100256, 3861713, -5900748, 36241472, 116374824, 146012784, 51534240, -132524440, +-269747040, -229335152, -13444858, 212266944, 253539968, 85124640, -115891640, -166048272, -67431520, 38611756, +62862216, 38062000, 19412178, 5471252, -21926882, -46705620, -45556720, -28509992, -20809116, -26320634, +-31532576, -29571386, -22053584, -8328479, 12683575, 36189932, 55955908, 70685496, 81685448, 89103392, +93404800, 96296392, 98277440, 98371928, 96653944, 94194000, 90911576, 86037320, 79888000, 72978472, +64399276, 52976812, 39047160, 23758686, 7796977, -8194798, -23222888, -36919540, -49907520, -62626528, +-74701296, -85702848, -95545840, -103881840, -109858824, -112652696, -111763640, -106924288, -98160944, -85775328, +-69952672, -50720344, -28536300, -4487167, 20426864, 45805288, 71338336, 96167000, 119163864, 139693280, +157771328, 173507552, 186629744, 196671392, 203482128, 207318608, 208383760, 206505792, 201380816, 192836512, +180638272, 164359808, 143832016, 119569744, 92430920, 63056564, 32062468, 675921, -29271276, -56125560, +-79089672, -98170608, -113548736, -124903016, -131351912, -132275328, -128254168, -120941984, -111917720, -101868568, +-90853592, -78939352, -66391068, -53582940, -40999756, -29189672, -18582712, -9393093, -1646046, 4900021, +10785737, 16521129, 22140556, 27170500, 30990336, 33161442, 33582888, 32519344, 30390652, 27408870, +23448374, 18280992, 11822971, 4185983, -4341675, -13386876, -22716082, -32304596, -42073500, -51706036, +-60841432, -69281040, -76887432, -83512952, -89127016, -93801016, -97536560, -100308424, -102233640, -103560248, +-104703784, -106144208, -107347336, -105644920, -97930088, -84797152, -71584760, -63486060, -60742648, }, { 12293807, -4858682, -11296838, -19100256, -3861713, 5900748, -36241472, -116374824, -146012784, -51534240, 132524440, -269747040, 229335152, 13444858, -212266944, -253539968, -85124640, 115891640, 166048272, 67431520, -38611756, --62862216, -38062000, -19412178, -5471252, 21926882, 46705620, 45556720, 28509992, 20809116, 26320634, -31532576, 29571386, 22053584, 8328479, -12683575, -36189932, -55955908, -70685496, -81685448, -89103392, --93404800, -96296392, -98277440, -98371928, -96653944, -94194000, -90911576, -86037320, -79888000, -72978472, --64399276, -52976812, -39047160, -23758686, -7796977, 8194798, 23222888, 36919540, 49907520, 62626528, -74701296, 85702848, 95545840, 103881840, 109858824, 112652696, 111763640, 106924288, 98160944, 85775328, -69952672, 50720344, 28536300, 4487167, -20426864, -45805288, -71338336, -96167000, -119163864, -139693280, --157771328, -173507552, -186629744, -196671392, -203482128, -207318608, -208383760, -206505792, -201380816, -192836512, --180638272, -164359808, -143832016, -119569744, -92430920, -63056564, -32062468, -675921, 29271276, 56125560, -79089672, 98170608, 113548736, 124903016, 131351912, 132275328, 128254168, 120941984, 111917720, 101868568, -90853592, 78939352, 66391068, 53582940, 40999756, 29189672, 18582712, 9393093, 1646046, -4900021, --10785737, -16521129, -22140556, -27170500, -30990336, -33161442, -33582888, -32519344, -30390652, -27408870, --23448374, -18280992, -11822971, -4185983, 4341675, 13386876, 22716082, 32304596, 42073500, 51706036, -60841432, 69281040, 76887432, 83512952, 89127016, 93801016, 97536560, 100308424, 102233640, 103560248, -104703784, 106144208, 107347336, 105644920, 97930088, 84797152, 71584760, 63486060, 60742648, }, +4858682, -11296838, -19100256, -3861713, 5900748, -36241472, -116374824, -146012784, -51534240, 132524440, +269747040, 229335152, 13444858, -212266944, -253539968, -85124640, 115891640, 166048272, 67431520, -38611756, +-62862216, -38062000, -19412178, -5471252, 21926882, 46705620, 45556720, 28509992, 20809116, 26320634, +31532576, 29571386, 22053584, 8328479, -12683575, -36189932, -55955908, -70685496, -81685448, -89103392, +-93404800, -96296392, -98277440, -98371928, -96653944, -94194000, -90911576, -86037320, -79888000, -72978472, +-64399276, -52976812, -39047160, -23758686, -7796977, 8194798, 23222888, 36919540, 49907520, 62626528, +74701296, 85702848, 95545840, 103881840, 109858824, 112652696, 111763640, 106924288, 98160944, 85775328, +69952672, 50720344, 28536300, 4487167, -20426864, -45805288, -71338336, -96167000, -119163864, -139693280, +-157771328, -173507552, -186629744, -196671392, -203482128, -207318608, -208383760, -206505792, -201380816, -192836512, +-180638272, -164359808, -143832016, -119569744, -92430920, -63056564, -32062468, -675921, 29271276, 56125560, +79089672, 98170608, 113548736, 124903016, 131351912, 132275328, 128254168, 120941984, 111917720, 101868568, +90853592, 78939352, 66391068, 53582940, 40999756, 29189672, 18582712, 9393093, 1646046, -4900021, +-10785737, -16521129, -22140556, -27170500, -30990336, -33161442, -33582888, -32519344, -30390652, -27408870, +-23448374, -18280992, -11822971, -4185983, 4341675, 13386876, 22716082, 32304596, 42073500, 51706036, +60841432, 69281040, 76887432, 83512952, 89127016, 93801016, 97536560, 100308424, 102233640, 103560248, +104703784, 106144208, 107347336, 105644920, 97930088, 84797152, 71584760, 63486060, 60742648, }, }, { { 1981054, --492311, -296353, 7187091, 20790326, 34022048, 38966628, 28556164, 110595, -35796404, -53189948, --31344672, 17328046, 52040508, 45398880, 11650099, -15445776, -22064858, -18178986, -11581916, 1719061, -21751862, 37804304, 43341052, 45074072, 50449224, 55028732, 48952428, 30137786, 5746666, -15365782, --27608050, -29608968, -24510304, -18206366, -14864882, -14263050, -13622026, -10816338, -5701032, 302258, -5457293, 9128953, 11999065, 14878304, 17986786, 21451214, 25480430, 29771102, 33561948, 36449776, -38489348, 39609800, 39572756, 38267084, 35515620, 30976914, 24654722, 17046188, 8560944, -637266, --10189273, -19688666, -29212220, -38975216, -48690432, -58008904, -67171680, -76369352, -84917944, -91841432, --96724808, -99298032, -98873904, -94944544, -87748328, -77702400, -64913060, -49656800, -32660006, -14494441, -4769025, 25049324, 45805288, 66242356, 85751704, 104195904, 121765008, 138232448, 152444496, 163098160, -169934672, 173507552, 173946176, 170681456, 163277472, 151896352, 137215616, 120472224, 103182296, 86171000, -69162936, 51720532, 34225520, 17817672, 3861176, -6618008, -13700946, -18690088, -22775674, -25758530, --26644904, -25007984, -21164526, -15672336, -9310952, -2892124, 3518115, 10589242, 18666464, 27408870, -36473936, 45634564, 54317916, 61990336, 68838128, 75240312, 80961744, 85623392, 89298816, 91926792, -92930208, 92042760, 89656368, 85938536, 80607944, 73742976, 65713000, 56356412, 45335528, 33011118, -19910932, 5942624, -8905078, -24007794, -39067024, -54445152, -69956424, -84769232, -98771896, -112544248, --126454040, -141326976, -157807840, -171961904, -174743968, -161483248, -139952048, -123136712, -116040888, }, +-492311, -296353, 7187091, 20790326, 34022048, 38966628, 28556164, 110595, -35796404, -53189948, +-31344672, 17328046, 52040508, 45398880, 11650099, -15445776, -22064858, -18178986, -11581916, 1719061, +21751862, 37804304, 43341052, 45074072, 50449224, 55028732, 48952428, 30137786, 5746666, -15365782, +-27608050, -29608968, -24510304, -18206366, -14864882, -14263050, -13622026, -10816338, -5701032, 302258, +5457293, 9128953, 11999065, 14878304, 17986786, 21451214, 25480430, 29771102, 33561948, 36449776, +38489348, 39609800, 39572756, 38267084, 35515620, 30976914, 24654722, 17046188, 8560944, -637266, +-10189273, -19688666, -29212220, -38975216, -48690432, -58008904, -67171680, -76369352, -84917944, -91841432, +-96724808, -99298032, -98873904, -94944544, -87748328, -77702400, -64913060, -49656800, -32660006, -14494441, +4769025, 25049324, 45805288, 66242356, 85751704, 104195904, 121765008, 138232448, 152444496, 163098160, +169934672, 173507552, 173946176, 170681456, 163277472, 151896352, 137215616, 120472224, 103182296, 86171000, +69162936, 51720532, 34225520, 17817672, 3861176, -6618008, -13700946, -18690088, -22775674, -25758530, +-26644904, -25007984, -21164526, -15672336, -9310952, -2892124, 3518115, 10589242, 18666464, 27408870, +36473936, 45634564, 54317916, 61990336, 68838128, 75240312, 80961744, 85623392, 89298816, 91926792, +92930208, 92042760, 89656368, 85938536, 80607944, 73742976, 65713000, 56356412, 45335528, 33011118, +19910932, 5942624, -8905078, -24007794, -39067024, -54445152, -69956424, -84769232, -98771896, -112544248, +-126454040, -141326976, -157807840, -171961904, -174743968, -161483248, -139952048, -123136712, -116040888, }, { 1981054, --492311, -296353, 7187091, 20790326, 34022048, 38966628, 28556164, 110595, -35796404, -53189948, --31344672, 17328046, 52040508, 45398880, 11650099, -15445776, -22064858, -18178986, -11581916, 1719061, -21751862, 37804304, 43341052, 45074072, 50449224, 55028732, 48952428, 30137786, 5746666, -15365782, --27608050, -29608968, -24510304, -18206366, -14864882, -14263050, -13622026, -10816338, -5701032, 302258, -5457293, 9128953, 11999065, 14878304, 17986786, 21451214, 25480430, 29771102, 33561948, 36449776, -38489348, 39609800, 39572756, 38267084, 35515620, 30976914, 24654722, 17046188, 8560944, -637266, --10189273, -19688666, -29212220, -38975216, -48690432, -58008904, -67171680, -76369352, -84917944, -91841432, --96724808, -99298032, -98873904, -94944544, -87748328, -77702400, -64913060, -49656800, -32660006, -14494441, -4769025, 25049324, 45805288, 66242356, 85751704, 104195904, 121765008, 138232448, 152444496, 163098160, -169934672, 173507552, 173946176, 170681456, 163277472, 151896352, 137215616, 120472224, 103182296, 86171000, -69162936, 51720532, 34225520, 17817672, 3861176, -6618008, -13700946, -18690088, -22775674, -25758530, --26644904, -25007984, -21164526, -15672336, -9310952, -2892124, 3518115, 10589242, 18666464, 27408870, -36473936, 45634564, 54317916, 61990336, 68838128, 75240312, 80961744, 85623392, 89298816, 91926792, -92930208, 92042760, 89656368, 85938536, 80607944, 73742976, 65713000, 56356412, 45335528, 33011118, -19910932, 5942624, -8905078, -24007794, -39067024, -54445152, -69956424, -84769232, -98771896, -112544248, --126454040, -141326976, -157807840, -171961904, -174743968, -161483248, -139952048, -123136712, -116040888, }, +-492311, -296353, 7187091, 20790326, 34022048, 38966628, 28556164, 110595, -35796404, -53189948, +-31344672, 17328046, 52040508, 45398880, 11650099, -15445776, -22064858, -18178986, -11581916, 1719061, +21751862, 37804304, 43341052, 45074072, 50449224, 55028732, 48952428, 30137786, 5746666, -15365782, +-27608050, -29608968, -24510304, -18206366, -14864882, -14263050, -13622026, -10816338, -5701032, 302258, +5457293, 9128953, 11999065, 14878304, 17986786, 21451214, 25480430, 29771102, 33561948, 36449776, +38489348, 39609800, 39572756, 38267084, 35515620, 30976914, 24654722, 17046188, 8560944, -637266, +-10189273, -19688666, -29212220, -38975216, -48690432, -58008904, -67171680, -76369352, -84917944, -91841432, +-96724808, -99298032, -98873904, -94944544, -87748328, -77702400, -64913060, -49656800, -32660006, -14494441, +4769025, 25049324, 45805288, 66242356, 85751704, 104195904, 121765008, 138232448, 152444496, 163098160, +169934672, 173507552, 173946176, 170681456, 163277472, 151896352, 137215616, 120472224, 103182296, 86171000, +69162936, 51720532, 34225520, 17817672, 3861176, -6618008, -13700946, -18690088, -22775674, -25758530, +-26644904, -25007984, -21164526, -15672336, -9310952, -2892124, 3518115, 10589242, 18666464, 27408870, +36473936, 45634564, 54317916, 61990336, 68838128, 75240312, 80961744, 85623392, 89298816, 91926792, +92930208, 92042760, 89656368, 85938536, 80607944, 73742976, 65713000, 56356412, 45335528, 33011118, +19910932, 5942624, -8905078, -24007794, -39067024, -54445152, -69956424, -84769232, -98771896, -112544248, +-126454040, -141326976, -157807840, -171961904, -174743968, -161483248, -139952048, -123136712, -116040888, }, }, { { -12559558, --14574435, -5498632, 16103443, 36147520, 44876504, 39157216, 9365713, -46824808, -96066072, -88001736, --16486232, 61414812, 83421688, 43921408, -12003360, -39346196, -26169236, 8202851, 31455804, 21983790, --12823699, -43575664, -48513804, -31488016, -9336185, 8367133, 21562346, 31231928, 37633576, 42852500, -48321604, 51680804, 50072876, 44494252, 37884296, 31025770, 23062900, 14463839, 7116761, 2233383, --410169, -1745367, -2821257, -4539244, -7486128, -12084427, -18647138, -26852672, -35484484, -43163884, --49141944, -53194780, -55318104, -55944096, -56015500, -56391848, -57385060, -59020904, -61418568, -64698312, --68753840, -73237784, -77588048, -81048720, -82895016, -82710336, -80343808, -75721888, -68982544, -60732984, --51794620, -42591044, -33091112, -23498302, -14558329, -6819335, 45097, 6571837, 12374875, 16434692, -18544058, 19660212, 20583630, 21070572, 20794084, 20587388, 21976274, 25625922, 30747670, 36053028, -40965936, 45846092, 51298016, 57459148, 63976224, 70426728, 76528800, 82054280, 86981680, 91855392, -97594008, 104659760, 112574848, 120407264, 127569120, 134014792, 139829104, 144785488, 148304144, 149838528, -149301648, 147018880, 143219440, 137718128, 130134288, 120280024, 108341088, 94882808, 80673984, 66263828, -51684564, 36692980, 21274046, 5818607, -9044127, -22661858, -34666828, -45304388, -55281060, -65073048, --74445744, -82671144, -89063664, -93351112, -95811592, -97100624, -97800160, -98117456, -97976792, -97134984, --95189360, -91867200, -87386480, -82146080, -76163728, -69350304, -62128848, -55066848, -48134772, -41077068, --34018824, -26677652, -17796734, -7066295, 2895882, 8453569, 8887361, 6854768, 5247913, }, +-14574435, -5498632, 16103443, 36147520, 44876504, 39157216, 9365713, -46824808, -96066072, -88001736, +-16486232, 61414812, 83421688, 43921408, -12003360, -39346196, -26169236, 8202851, 31455804, 21983790, +-12823699, -43575664, -48513804, -31488016, -9336185, 8367133, 21562346, 31231928, 37633576, 42852500, +48321604, 51680804, 50072876, 44494252, 37884296, 31025770, 23062900, 14463839, 7116761, 2233383, +-410169, -1745367, -2821257, -4539244, -7486128, -12084427, -18647138, -26852672, -35484484, -43163884, +-49141944, -53194780, -55318104, -55944096, -56015500, -56391848, -57385060, -59020904, -61418568, -64698312, +-68753840, -73237784, -77588048, -81048720, -82895016, -82710336, -80343808, -75721888, -68982544, -60732984, +-51794620, -42591044, -33091112, -23498302, -14558329, -6819335, 45097, 6571837, 12374875, 16434692, +18544058, 19660212, 20583630, 21070572, 20794084, 20587388, 21976274, 25625922, 30747670, 36053028, +40965936, 45846092, 51298016, 57459148, 63976224, 70426728, 76528800, 82054280, 86981680, 91855392, +97594008, 104659760, 112574848, 120407264, 127569120, 134014792, 139829104, 144785488, 148304144, 149838528, +149301648, 147018880, 143219440, 137718128, 130134288, 120280024, 108341088, 94882808, 80673984, 66263828, +51684564, 36692980, 21274046, 5818607, -9044127, -22661858, -34666828, -45304388, -55281060, -65073048, +-74445744, -82671144, -89063664, -93351112, -95811592, -97100624, -97800160, -98117456, -97976792, -97134984, +-95189360, -91867200, -87386480, -82146080, -76163728, -69350304, -62128848, -55066848, -48134772, -41077068, +-34018824, -26677652, -17796734, -7066295, 2895882, 8453569, 8887361, 6854768, 5247913, }, { -12559558, --14574435, -5498632, 16103443, 36147520, 44876504, 39157216, 9365713, -46824808, -96066072, -88001736, --16486232, 61414812, 83421688, 43921408, -12003360, -39346196, -26169236, 8202851, 31455804, 21983790, --12823699, -43575664, -48513804, -31488016, -9336185, 8367133, 21562346, 31231928, 37633576, 42852500, -48321604, 51680804, 50072876, 44494252, 37884296, 31025770, 23062900, 14463839, 7116761, 2233383, --410169, -1745367, -2821257, -4539244, -7486128, -12084427, -18647138, -26852672, -35484484, -43163884, --49141944, -53194780, -55318104, -55944096, -56015500, -56391848, -57385060, -59020904, -61418568, -64698312, --68753840, -73237784, -77588048, -81048720, -82895016, -82710336, -80343808, -75721888, -68982544, -60732984, --51794620, -42591044, -33091112, -23498302, -14558329, -6819335, 45097, 6571837, 12374875, 16434692, -18544058, 19660212, 20583630, 21070572, 20794084, 20587388, 21976274, 25625922, 30747670, 36053028, -40965936, 45846092, 51298016, 57459148, 63976224, 70426728, 76528800, 82054280, 86981680, 91855392, -97594008, 104659760, 112574848, 120407264, 127569120, 134014792, 139829104, 144785488, 148304144, 149838528, -149301648, 147018880, 143219440, 137718128, 130134288, 120280024, 108341088, 94882808, 80673984, 66263828, -51684564, 36692980, 21274046, 5818607, -9044127, -22661858, -34666828, -45304388, -55281060, -65073048, --74445744, -82671144, -89063664, -93351112, -95811592, -97100624, -97800160, -98117456, -97976792, -97134984, --95189360, -91867200, -87386480, -82146080, -76163728, -69350304, -62128848, -55066848, -48134772, -41077068, --34018824, -26677652, -17796734, -7066295, 2895882, 8453569, 8887361, 6854768, 5247913, }, +-14574435, -5498632, 16103443, 36147520, 44876504, 39157216, 9365713, -46824808, -96066072, -88001736, +-16486232, 61414812, 83421688, 43921408, -12003360, -39346196, -26169236, 8202851, 31455804, 21983790, +-12823699, -43575664, -48513804, -31488016, -9336185, 8367133, 21562346, 31231928, 37633576, 42852500, +48321604, 51680804, 50072876, 44494252, 37884296, 31025770, 23062900, 14463839, 7116761, 2233383, +-410169, -1745367, -2821257, -4539244, -7486128, -12084427, -18647138, -26852672, -35484484, -43163884, +-49141944, -53194780, -55318104, -55944096, -56015500, -56391848, -57385060, -59020904, -61418568, -64698312, +-68753840, -73237784, -77588048, -81048720, -82895016, -82710336, -80343808, -75721888, -68982544, -60732984, +-51794620, -42591044, -33091112, -23498302, -14558329, -6819335, 45097, 6571837, 12374875, 16434692, +18544058, 19660212, 20583630, 21070572, 20794084, 20587388, 21976274, 25625922, 30747670, 36053028, +40965936, 45846092, 51298016, 57459148, 63976224, 70426728, 76528800, 82054280, 86981680, 91855392, +97594008, 104659760, 112574848, 120407264, 127569120, 134014792, 139829104, 144785488, 148304144, 149838528, +149301648, 147018880, 143219440, 137718128, 130134288, 120280024, 108341088, 94882808, 80673984, 66263828, +51684564, 36692980, 21274046, 5818607, -9044127, -22661858, -34666828, -45304388, -55281060, -65073048, +-74445744, -82671144, -89063664, -93351112, -95811592, -97100624, -97800160, -98117456, -97976792, -97134984, +-95189360, -91867200, -87386480, -82146080, -76163728, -69350304, -62128848, -55066848, -48134772, -41077068, +-34018824, -26677652, -17796734, -7066295, 2895882, 8453569, 8887361, 6854768, 5247913, }, }, { { 1361505, --6031745, -9847823, -9656697, -14584635, -16705812, 7517267, 51822000, 60734060, -8921184, -112508280, --144351168, -58633820, 64616172, 104241544, 34482144, -56665652, -81571096, -45710800, -11709691, -7069516, --4066797, 22695144, 58683212, 76764488, 74230456, 66876400, 61739080, 51783884, 31008590, 2225867, --28280750, -55553792, -75944152, -87853016, -92936112, -93998584, -92232272, -87786448, -81435800, -74198784, --66693864, -59979220, -55700892, -54538568, -55540908, -57379152, -59228672, -60336236, -59941100, -57892936, --54546620, -50062140, -44485124, -38338488, -32506996, -27661200, -24187108, -22404160, -22473416, -24276766, --27546846, -31951336, -37052684, -42429444, -47763256, -52693344, -56783764, -59753196, -61440580, -61491584, --59418188, -55002424, -48322140, -39467528, -28609850, -16194711, -2756832, 11221139, 25089588, 38157028, -50324132, 62045096, 73466488, 84227528, 94241248, 103860360, 113180440, 122174104, 131728256, 143384256, -157529200, 172678624, 187045296, 200132592, 212350704, 223562176, 232452752, 237196016, 236600624, 230685920, -220133184, 205348832, 186409104, 163813280, 138720464, 112246288, 84862648, 56548612, 27314382, -2303176, --31074088, -57662620, -81631760, -103590320, -124196496, -143360640, -160478224, -174997904, -186710816, -195989024, --203774192, -210894704, -217387616, -222761696, -226671728, -229054368, -229952544, -229501584, -227726144, -224215552, --218468336, -210567744, -200995344, -189917008, -177224848, -162980592, -147170272, -129491656, -110055856, -89775552, --69495256, -49401252, -29626684, -10492068, 8148627, 26706106, 44885092, 61997852, 77989624, 93141736, -107788648, 123275224, 140463152, 154866864, 157063728, 142887120, 120772336, 103758896, 96604016, }, +-6031745, -9847823, -9656697, -14584635, -16705812, 7517267, 51822000, 60734060, -8921184, -112508280, +-144351168, -58633820, 64616172, 104241544, 34482144, -56665652, -81571096, -45710800, -11709691, -7069516, +-4066797, 22695144, 58683212, 76764488, 74230456, 66876400, 61739080, 51783884, 31008590, 2225867, +-28280750, -55553792, -75944152, -87853016, -92936112, -93998584, -92232272, -87786448, -81435800, -74198784, +-66693864, -59979220, -55700892, -54538568, -55540908, -57379152, -59228672, -60336236, -59941100, -57892936, +-54546620, -50062140, -44485124, -38338488, -32506996, -27661200, -24187108, -22404160, -22473416, -24276766, +-27546846, -31951336, -37052684, -42429444, -47763256, -52693344, -56783764, -59753196, -61440580, -61491584, +-59418188, -55002424, -48322140, -39467528, -28609850, -16194711, -2756832, 11221139, 25089588, 38157028, +50324132, 62045096, 73466488, 84227528, 94241248, 103860360, 113180440, 122174104, 131728256, 143384256, +157529200, 172678624, 187045296, 200132592, 212350704, 223562176, 232452752, 237196016, 236600624, 230685920, +220133184, 205348832, 186409104, 163813280, 138720464, 112246288, 84862648, 56548612, 27314382, -2303176, +-31074088, -57662620, -81631760, -103590320, -124196496, -143360640, -160478224, -174997904, -186710816, -195989024, +-203774192, -210894704, -217387616, -222761696, -226671728, -229054368, -229952544, -229501584, -227726144, -224215552, +-218468336, -210567744, -200995344, -189917008, -177224848, -162980592, -147170272, -129491656, -110055856, -89775552, +-69495256, -49401252, -29626684, -10492068, 8148627, 26706106, 44885092, 61997852, 77989624, 93141736, +107788648, 123275224, 140463152, 154866864, 157063728, 142887120, 120772336, 103758896, 96604016, }, { 1361505, --6031745, -9847823, -9656697, -14584635, -16705812, 7517267, 51822000, 60734060, -8921184, -112508280, --144351168, -58633820, 64616172, 104241544, 34482144, -56665652, -81571096, -45710800, -11709691, -7069516, --4066797, 22695144, 58683212, 76764488, 74230456, 66876400, 61739080, 51783884, 31008590, 2225867, --28280750, -55553792, -75944152, -87853016, -92936112, -93998584, -92232272, -87786448, -81435800, -74198784, --66693864, -59979220, -55700892, -54538568, -55540908, -57379152, -59228672, -60336236, -59941100, -57892936, --54546620, -50062140, -44485124, -38338488, -32506996, -27661200, -24187108, -22404160, -22473416, -24276766, --27546846, -31951336, -37052684, -42429444, -47763256, -52693344, -56783764, -59753196, -61440580, -61491584, --59418188, -55002424, -48322140, -39467528, -28609850, -16194711, -2756832, 11221139, 25089588, 38157028, -50324132, 62045096, 73466488, 84227528, 94241248, 103860360, 113180440, 122174104, 131728256, 143384256, -157529200, 172678624, 187045296, 200132592, 212350704, 223562176, 232452752, 237196016, 236600624, 230685920, -220133184, 205348832, 186409104, 163813280, 138720464, 112246288, 84862648, 56548612, 27314382, -2303176, --31074088, -57662620, -81631760, -103590320, -124196496, -143360640, -160478224, -174997904, -186710816, -195989024, --203774192, -210894704, -217387616, -222761696, -226671728, -229054368, -229952544, -229501584, -227726144, -224215552, --218468336, -210567744, -200995344, -189917008, -177224848, -162980592, -147170272, -129491656, -110055856, -89775552, --69495256, -49401252, -29626684, -10492068, 8148627, 26706106, 44885092, 61997852, 77989624, 93141736, -107788648, 123275224, 140463152, 154866864, 157063728, 142887120, 120772336, 103758896, 96604016, }, +-6031745, -9847823, -9656697, -14584635, -16705812, 7517267, 51822000, 60734060, -8921184, -112508280, +-144351168, -58633820, 64616172, 104241544, 34482144, -56665652, -81571096, -45710800, -11709691, -7069516, +-4066797, 22695144, 58683212, 76764488, 74230456, 66876400, 61739080, 51783884, 31008590, 2225867, +-28280750, -55553792, -75944152, -87853016, -92936112, -93998584, -92232272, -87786448, -81435800, -74198784, +-66693864, -59979220, -55700892, -54538568, -55540908, -57379152, -59228672, -60336236, -59941100, -57892936, +-54546620, -50062140, -44485124, -38338488, -32506996, -27661200, -24187108, -22404160, -22473416, -24276766, +-27546846, -31951336, -37052684, -42429444, -47763256, -52693344, -56783764, -59753196, -61440580, -61491584, +-59418188, -55002424, -48322140, -39467528, -28609850, -16194711, -2756832, 11221139, 25089588, 38157028, +50324132, 62045096, 73466488, 84227528, 94241248, 103860360, 113180440, 122174104, 131728256, 143384256, +157529200, 172678624, 187045296, 200132592, 212350704, 223562176, 232452752, 237196016, 236600624, 230685920, +220133184, 205348832, 186409104, 163813280, 138720464, 112246288, 84862648, 56548612, 27314382, -2303176, +-31074088, -57662620, -81631760, -103590320, -124196496, -143360640, -160478224, -174997904, -186710816, -195989024, +-203774192, -210894704, -217387616, -222761696, -226671728, -229054368, -229952544, -229501584, -227726144, -224215552, +-218468336, -210567744, -200995344, -189917008, -177224848, -162980592, -147170272, -129491656, -110055856, -89775552, +-69495256, -49401252, -29626684, -10492068, 8148627, 26706106, 44885092, 61997852, 77989624, 93141736, +107788648, 123275224, 140463152, 154866864, 157063728, 142887120, 120772336, 103758896, 96604016, }, }, { { -3934190, --3561065, -2961380, -2469069, -3335042, -6949257, -10582799, -6585796, 5910949, 9033390, -17499844, --58110372, -59563144, 5482526, 83499536, 86628416, 1379221, -84844928, -85138064, -11901354, 51665236, -54776404, 19014894, -11911555, -22216792, -18465138, -5498632, 14854681, 35445828, 48197048, 51996484, -50291920, 45649596, 40315248, 37207300, 36641976, 35024920, 28898688, 18129056, 4440460, -10513006, --24823838, -36339180, -44009992, -48198660, -49605260, -48929340, -47307992, -45934140, -45271640, -45296872, --46153720, -47934520, -50194208, -52233244, -53628036, -54219132, -54003844, -53310208, -52730924, -52689048, --53342956, -54880020, -57467200, -60883844, -64628520, -68430104, -72297184, -76111112, -79580376, -82582560, --85147728, -87112136, -88198224, -88479544, -88365728, -88030184, -87231856, -85876800, -84408456, -83318072, --82401096, -80879600, -78321416, -75120048, -71791456, -68008656, -62799940, -55777128, -47760572, -39983460, --32998234, -26651346, -20882130, -16187195, -13293998, -12516072, -13425531, -15218143, -17527224, -20784420, --25553982, -31566936, -37652368, -42537356, -45547056, -46747496, -46730856, -46114528, -44954348, -42737072, --39073464, -34196528, -28686624, -23036594, -17581986, -12468290, -7497403, -2309619, 3184718, 8788040, -14401025, 20095078, 25889526, 31743566, 37637872, 43394740, 48620104, 53053584, 56763360, 59858960, -62368292, 64483564, 66524212, 68600288, 70713416, 73127720, 76176616, 79870824, 84172232, 89341224, -95507728, 102298608, 109355776, 116673864, 123982824, 130558952, 136096784, 140873856, 144714624, 147014576, -147960544, 147701776, 143530832, 130539624, 107595912, 81434192, 62075700, 53886272, 52787832, }, +-3561065, -2961380, -2469069, -3335042, -6949257, -10582799, -6585796, 5910949, 9033390, -17499844, +-58110372, -59563144, 5482526, 83499536, 86628416, 1379221, -84844928, -85138064, -11901354, 51665236, +54776404, 19014894, -11911555, -22216792, -18465138, -5498632, 14854681, 35445828, 48197048, 51996484, +50291920, 45649596, 40315248, 37207300, 36641976, 35024920, 28898688, 18129056, 4440460, -10513006, +-24823838, -36339180, -44009992, -48198660, -49605260, -48929340, -47307992, -45934140, -45271640, -45296872, +-46153720, -47934520, -50194208, -52233244, -53628036, -54219132, -54003844, -53310208, -52730924, -52689048, +-53342956, -54880020, -57467200, -60883844, -64628520, -68430104, -72297184, -76111112, -79580376, -82582560, +-85147728, -87112136, -88198224, -88479544, -88365728, -88030184, -87231856, -85876800, -84408456, -83318072, +-82401096, -80879600, -78321416, -75120048, -71791456, -68008656, -62799940, -55777128, -47760572, -39983460, +-32998234, -26651346, -20882130, -16187195, -13293998, -12516072, -13425531, -15218143, -17527224, -20784420, +-25553982, -31566936, -37652368, -42537356, -45547056, -46747496, -46730856, -46114528, -44954348, -42737072, +-39073464, -34196528, -28686624, -23036594, -17581986, -12468290, -7497403, -2309619, 3184718, 8788040, +14401025, 20095078, 25889526, 31743566, 37637872, 43394740, 48620104, 53053584, 56763360, 59858960, +62368292, 64483564, 66524212, 68600288, 70713416, 73127720, 76176616, 79870824, 84172232, 89341224, +95507728, 102298608, 109355776, 116673864, 123982824, 130558952, 136096784, 140873856, 144714624, 147014576, +147960544, 147701776, 143530832, 130539624, 107595912, 81434192, 62075700, 53886272, 52787832, }, { -3934190, --3561065, -2961380, -2469069, -3335042, -6949257, -10582799, -6585796, 5910949, 9033390, -17499844, --58110372, -59563144, 5482526, 83499536, 86628416, 1379221, -84844928, -85138064, -11901354, 51665236, -54776404, 19014894, -11911555, -22216792, -18465138, -5498632, 14854681, 35445828, 48197048, 51996484, -50291920, 45649596, 40315248, 37207300, 36641976, 35024920, 28898688, 18129056, 4440460, -10513006, --24823838, -36339180, -44009992, -48198660, -49605260, -48929340, -47307992, -45934140, -45271640, -45296872, --46153720, -47934520, -50194208, -52233244, -53628036, -54219132, -54003844, -53310208, -52730924, -52689048, --53342956, -54880020, -57467200, -60883844, -64628520, -68430104, -72297184, -76111112, -79580376, -82582560, --85147728, -87112136, -88198224, -88479544, -88365728, -88030184, -87231856, -85876800, -84408456, -83318072, --82401096, -80879600, -78321416, -75120048, -71791456, -68008656, -62799940, -55777128, -47760572, -39983460, --32998234, -26651346, -20882130, -16187195, -13293998, -12516072, -13425531, -15218143, -17527224, -20784420, --25553982, -31566936, -37652368, -42537356, -45547056, -46747496, -46730856, -46114528, -44954348, -42737072, --39073464, -34196528, -28686624, -23036594, -17581986, -12468290, -7497403, -2309619, 3184718, 8788040, -14401025, 20095078, 25889526, 31743566, 37637872, 43394740, 48620104, 53053584, 56763360, 59858960, -62368292, 64483564, 66524212, 68600288, 70713416, 73127720, 76176616, 79870824, 84172232, 89341224, -95507728, 102298608, 109355776, 116673864, 123982824, 130558952, 136096784, 140873856, 144714624, 147014576, -147960544, 147701776, 143530832, 130539624, 107595912, 81434192, 62075700, 53886272, 52787832, }, +-3561065, -2961380, -2469069, -3335042, -6949257, -10582799, -6585796, 5910949, 9033390, -17499844, +-58110372, -59563144, 5482526, 83499536, 86628416, 1379221, -84844928, -85138064, -11901354, 51665236, +54776404, 19014894, -11911555, -22216792, -18465138, -5498632, 14854681, 35445828, 48197048, 51996484, +50291920, 45649596, 40315248, 37207300, 36641976, 35024920, 28898688, 18129056, 4440460, -10513006, +-24823838, -36339180, -44009992, -48198660, -49605260, -48929340, -47307992, -45934140, -45271640, -45296872, +-46153720, -47934520, -50194208, -52233244, -53628036, -54219132, -54003844, -53310208, -52730924, -52689048, +-53342956, -54880020, -57467200, -60883844, -64628520, -68430104, -72297184, -76111112, -79580376, -82582560, +-85147728, -87112136, -88198224, -88479544, -88365728, -88030184, -87231856, -85876800, -84408456, -83318072, +-82401096, -80879600, -78321416, -75120048, -71791456, -68008656, -62799940, -55777128, -47760572, -39983460, +-32998234, -26651346, -20882130, -16187195, -13293998, -12516072, -13425531, -15218143, -17527224, -20784420, +-25553982, -31566936, -37652368, -42537356, -45547056, -46747496, -46730856, -46114528, -44954348, -42737072, +-39073464, -34196528, -28686624, -23036594, -17581986, -12468290, -7497403, -2309619, 3184718, 8788040, +14401025, 20095078, 25889526, 31743566, 37637872, 43394740, 48620104, 53053584, 56763360, 59858960, +62368292, 64483564, 66524212, 68600288, 70713416, 73127720, 76176616, 79870824, 84172232, 89341224, +95507728, 102298608, 109355776, 116673864, 123982824, 130558952, 136096784, 140873856, 144714624, 147014576, +147960544, 147701776, 143530832, 130539624, 107595912, 81434192, 62075700, 53886272, 52787832, }, }, }; const Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160] ={ { { -95109368, --260339440, -366612512, -408962496, -400354304, -362236480, -315098656, -258988672, -173663248, -53939956, 73996920, -186707600, 276786496, 304005312, 192871408, -46663744, -238100096, -189772592, 61389580, 255288032, 194103536, --56156696, -288527328, -394782656, -412162784, -396458240, -350214304, -268649664, -176448528, -96819304, -26412976, -43027520, 105719008, 155055296, 195263168, 231530944, 262328544, 286273536, 306256416, 324167488, 339115040, -351465760, 362808768, 372651232, 379707328, 384899392, 389586816, 393053920, 394493280, 395004928, 395505824, -395165440, 393394848, 390962272, 388219424, 384553664, 380043936, 375570208, 371227968, 366504576, 361672224, -357340736, 353217024, 348759936, 344302304, 340330528, 336536992, 332559840, 328731968, 325346464, 322093024, -318739712, 315517952, 312517920, 309469024, 306246752, 302958944, 299588992, 296042976, 292305280, 288233120, -283618176, 278650496, 273737600, 268777984, 263323904, 257488656, 251875680, 246582128, 241085648, 235180064, -229304544, 223901472, 219023472, 214540064, 210318640, 206342576, 202909824, 200431632, 198818864, 197471328, -196033584, 194752608, 193960720, 193620880, 193459824, 193164544, 192452656, 191296240, 190028688, 188915216, -187750208, 186134224, 183929296, 181221856, 178127328, 174841680, 171599520, 168378832, 164916544, 161111200, -157136752, 153130624, 149087984, 145047488, 141054240, 136985296, 132723080, 128412008, 124285080, 120380952, -116669568, 113233056, 110073568, 107003208, 103945728, 101050376, 98364416, 95750392, 93226024, 90918016, -88620208, 85932632, 82820928, 79434344, 75505528, 70683888, 65148212, 58947888, 51291036, 41580652, -29719026, 13152264, -13907104, -52447992, -89501752, -104273216, -87974888, -52846888, -16645146, }, +-260339440, -366612512, -408962496, -400354304, -362236480, -315098656, -258988672, -173663248, -53939956, 73996920, +186707600, 276786496, 304005312, 192871408, -46663744, -238100096, -189772592, 61389580, 255288032, 194103536, +-56156696, -288527328, -394782656, -412162784, -396458240, -350214304, -268649664, -176448528, -96819304, -26412976, +43027520, 105719008, 155055296, 195263168, 231530944, 262328544, 286273536, 306256416, 324167488, 339115040, +351465760, 362808768, 372651232, 379707328, 384899392, 389586816, 393053920, 394493280, 395004928, 395505824, +395165440, 393394848, 390962272, 388219424, 384553664, 380043936, 375570208, 371227968, 366504576, 361672224, +357340736, 353217024, 348759936, 344302304, 340330528, 336536992, 332559840, 328731968, 325346464, 322093024, +318739712, 315517952, 312517920, 309469024, 306246752, 302958944, 299588992, 296042976, 292305280, 288233120, +283618176, 278650496, 273737600, 268777984, 263323904, 257488656, 251875680, 246582128, 241085648, 235180064, +229304544, 223901472, 219023472, 214540064, 210318640, 206342576, 202909824, 200431632, 198818864, 197471328, +196033584, 194752608, 193960720, 193620880, 193459824, 193164544, 192452656, 191296240, 190028688, 188915216, +187750208, 186134224, 183929296, 181221856, 178127328, 174841680, 171599520, 168378832, 164916544, 161111200, +157136752, 153130624, 149087984, 145047488, 141054240, 136985296, 132723080, 128412008, 124285080, 120380952, +116669568, 113233056, 110073568, 107003208, 103945728, 101050376, 98364416, 95750392, 93226024, 90918016, +88620208, 85932632, 82820928, 79434344, 75505528, 70683888, 65148212, 58947888, 51291036, 41580652, +29719026, 13152264, -13907104, -52447992, -89501752, -104273216, -87974888, -52846888, -16645146, }, { -95109368, --260339440, -366612512, -408962496, -400354304, -362236480, -315098656, -258988672, -173663248, -53939956, 73996920, -186707600, 276786496, 304005312, 192871408, -46663744, -238100096, -189772592, 61389580, 255288032, 194103536, --56156696, -288527328, -394782656, -412162784, -396458240, -350214304, -268649664, -176448528, -96819304, -26412976, -43027520, 105719008, 155055296, 195263168, 231530944, 262328544, 286273536, 306256416, 324167488, 339115040, -351465760, 362808768, 372651232, 379707328, 384899392, 389586816, 393053920, 394493280, 395004928, 395505824, -395165440, 393394848, 390962272, 388219424, 384553664, 380043936, 375570208, 371227968, 366504576, 361672224, -357340736, 353217024, 348759936, 344302304, 340330528, 336536992, 332559840, 328731968, 325346464, 322093024, -318739712, 315517952, 312517920, 309469024, 306246752, 302958944, 299588992, 296042976, 292305280, 288233120, -283618176, 278650496, 273737600, 268777984, 263323904, 257488656, 251875680, 246582128, 241085648, 235180064, -229304544, 223901472, 219023472, 214540064, 210318640, 206342576, 202909824, 200431632, 198818864, 197471328, -196033584, 194752608, 193960720, 193620880, 193459824, 193164544, 192452656, 191296240, 190028688, 188915216, -187750208, 186134224, 183929296, 181221856, 178127328, 174841680, 171599520, 168378832, 164916544, 161111200, -157136752, 153130624, 149087984, 145047488, 141054240, 136985296, 132723080, 128412008, 124285080, 120380952, -116669568, 113233056, 110073568, 107003208, 103945728, 101050376, 98364416, 95750392, 93226024, 90918016, -88620208, 85932632, 82820928, 79434344, 75505528, 70683888, 65148212, 58947888, 51291036, 41580652, -29719026, 13152264, -13907104, -52447992, -89501752, -104273216, -87974888, -52846888, -16645146, }, +-260339440, -366612512, -408962496, -400354304, -362236480, -315098656, -258988672, -173663248, -53939956, 73996920, +186707600, 276786496, 304005312, 192871408, -46663744, -238100096, -189772592, 61389580, 255288032, 194103536, +-56156696, -288527328, -394782656, -412162784, -396458240, -350214304, -268649664, -176448528, -96819304, -26412976, +43027520, 105719008, 155055296, 195263168, 231530944, 262328544, 286273536, 306256416, 324167488, 339115040, +351465760, 362808768, 372651232, 379707328, 384899392, 389586816, 393053920, 394493280, 395004928, 395505824, +395165440, 393394848, 390962272, 388219424, 384553664, 380043936, 375570208, 371227968, 366504576, 361672224, +357340736, 353217024, 348759936, 344302304, 340330528, 336536992, 332559840, 328731968, 325346464, 322093024, +318739712, 315517952, 312517920, 309469024, 306246752, 302958944, 299588992, 296042976, 292305280, 288233120, +283618176, 278650496, 273737600, 268777984, 263323904, 257488656, 251875680, 246582128, 241085648, 235180064, +229304544, 223901472, 219023472, 214540064, 210318640, 206342576, 202909824, 200431632, 198818864, 197471328, +196033584, 194752608, 193960720, 193620880, 193459824, 193164544, 192452656, 191296240, 190028688, 188915216, +187750208, 186134224, 183929296, 181221856, 178127328, 174841680, 171599520, 168378832, 164916544, 161111200, +157136752, 153130624, 149087984, 145047488, 141054240, 136985296, 132723080, 128412008, 124285080, 120380952, +116669568, 113233056, 110073568, 107003208, 103945728, 101050376, 98364416, 95750392, 93226024, 90918016, +88620208, 85932632, 82820928, 79434344, 75505528, 70683888, 65148212, 58947888, 51291036, 41580652, +29719026, 13152264, -13907104, -52447992, -89501752, -104273216, -87974888, -52846888, -16645146, }, }, { { 74919800, -180832624, 165589776, 3118146, -248377952, -487060032, -639470720, -670940480, -564931520, -348093152, -99012416, -133561136, 369929280, 567594944, 531079680, 136782368, -364506368, -495046528, -96676496, 437999680, 606822528, -338486368, -45694692, -282642144, -380529792, -435686848, -455061984, -412777504, -340961344, -285578816, -242132544, --187046368, -125953672, -75291312, -31372052, 15731928, 62692564, 104184632, 143963008, 184569776, 221687424, -253691376, 283860288, 311944000, 334602656, 352947520, 370293824, 385346624, 395373760, 402216160, 408895904, -414681248, 418261632, 421057120, 423908992, 425174368, 424278336, 422686528, 420456352, 416190912, 410363712, -404640672, 398671744, 391244128, 383210944, 376019552, 369106816, 361541760, 354219360, 348174752, 342842016, -337704160, 333546080, 330874624, 329060544, 327708704, 327105792, 327162144, 327442944, 327925600, 328501120, -328534400, 327920224, 327404832, 327090752, 326092704, 324246400, 322538080, 321427296, 320383072, 319275520, -318623744, 318416512, 318121792, 317643424, 317027104, 315684384, 313017760, 309172160, 304287168, 297851136, -289580128, 280034560, 269758304, 258727760, 247008944, 235039936, 223125696, 211545392, 201074800, 192465008, -185562448, 179705728, 174628000, 170326048, 166635600, 163581344, 161492912, 160217856, 158877280, 156786176, -153965456, 150613232, 146883056, 143231248, 140110416, 137296144, 134274096, 131101728, 128141960, 125304600, -122328720, 119391504, 116704464, 114009368, 111109728, 108314240, 105794168, 103213432, 100447472, 97856000, -95487864, 92946312, 90264640, 87829936, 85353888, 82145544, 78237664, 73787000, 67849744, 59486372, -48626544, 32700270, 4790499, -37725920, -81636592, -103223632, -90638840, -55671368, -17729624, }, +180832624, 165589776, 3118146, -248377952, -487060032, -639470720, -670940480, -564931520, -348093152, -99012416, +133561136, 369929280, 567594944, 531079680, 136782368, -364506368, -495046528, -96676496, 437999680, 606822528, +338486368, -45694692, -282642144, -380529792, -435686848, -455061984, -412777504, -340961344, -285578816, -242132544, +-187046368, -125953672, -75291312, -31372052, 15731928, 62692564, 104184632, 143963008, 184569776, 221687424, +253691376, 283860288, 311944000, 334602656, 352947520, 370293824, 385346624, 395373760, 402216160, 408895904, +414681248, 418261632, 421057120, 423908992, 425174368, 424278336, 422686528, 420456352, 416190912, 410363712, +404640672, 398671744, 391244128, 383210944, 376019552, 369106816, 361541760, 354219360, 348174752, 342842016, +337704160, 333546080, 330874624, 329060544, 327708704, 327105792, 327162144, 327442944, 327925600, 328501120, +328534400, 327920224, 327404832, 327090752, 326092704, 324246400, 322538080, 321427296, 320383072, 319275520, +318623744, 318416512, 318121792, 317643424, 317027104, 315684384, 313017760, 309172160, 304287168, 297851136, +289580128, 280034560, 269758304, 258727760, 247008944, 235039936, 223125696, 211545392, 201074800, 192465008, +185562448, 179705728, 174628000, 170326048, 166635600, 163581344, 161492912, 160217856, 158877280, 156786176, +153965456, 150613232, 146883056, 143231248, 140110416, 137296144, 134274096, 131101728, 128141960, 125304600, +122328720, 119391504, 116704464, 114009368, 111109728, 108314240, 105794168, 103213432, 100447472, 97856000, +95487864, 92946312, 90264640, 87829936, 85353888, 82145544, 78237664, 73787000, 67849744, 59486372, +48626544, 32700270, 4790499, -37725920, -81636592, -103223632, -90638840, -55671368, -17729624, }, { -74919800, --180832624, -165589776, -3118146, 248377952, 487060032, 639470720, 670940480, 564931520, 348093152, 99012416, --133561136, -369929280, -567594944, -531079680, -136782368, 364506368, 495046528, 96676496, -437999680, -606822528, --338486368, 45694692, 282642144, 380529792, 435686848, 455061984, 412777504, 340961344, 285578816, 242132544, -187046368, 125953672, 75291312, 31372052, -15731928, -62692564, -104184632, -143963008, -184569776, -221687424, --253691376, -283860288, -311944000, -334602656, -352947520, -370293824, -385346624, -395373760, -402216160, -408895904, --414681248, -418261632, -421057120, -423908992, -425174368, -424278336, -422686528, -420456352, -416190912, -410363712, --404640672, -398671744, -391244128, -383210944, -376019552, -369106816, -361541760, -354219360, -348174752, -342842016, --337704160, -333546080, -330874624, -329060544, -327708704, -327105792, -327162144, -327442944, -327925600, -328501120, --328534400, -327920224, -327404832, -327090752, -326092704, -324246400, -322538080, -321427296, -320383072, -319275520, --318623744, -318416512, -318121792, -317643424, -317027104, -315684384, -313017760, -309172160, -304287168, -297851136, --289580128, -280034560, -269758304, -258727760, -247008944, -235039936, -223125696, -211545392, -201074800, -192465008, --185562448, -179705728, -174628000, -170326048, -166635600, -163581344, -161492912, -160217856, -158877280, -156786176, --153965456, -150613232, -146883056, -143231248, -140110416, -137296144, -134274096, -131101728, -128141960, -125304600, --122328720, -119391504, -116704464, -114009368, -111109728, -108314240, -105794168, -103213432, -100447472, -97856000, --95487864, -92946312, -90264640, -87829936, -85353888, -82145544, -78237664, -73787000, -67849744, -59486372, --48626544, -32700270, -4790499, 37725920, 81636592, 103223632, 90638840, 55671368, 17729624, }, +-180832624, -165589776, -3118146, 248377952, 487060032, 639470720, 670940480, 564931520, 348093152, 99012416, +-133561136, -369929280, -567594944, -531079680, -136782368, 364506368, 495046528, 96676496, -437999680, -606822528, +-338486368, 45694692, 282642144, 380529792, 435686848, 455061984, 412777504, 340961344, 285578816, 242132544, +187046368, 125953672, 75291312, 31372052, -15731928, -62692564, -104184632, -143963008, -184569776, -221687424, +-253691376, -283860288, -311944000, -334602656, -352947520, -370293824, -385346624, -395373760, -402216160, -408895904, +-414681248, -418261632, -421057120, -423908992, -425174368, -424278336, -422686528, -420456352, -416190912, -410363712, +-404640672, -398671744, -391244128, -383210944, -376019552, -369106816, -361541760, -354219360, -348174752, -342842016, +-337704160, -333546080, -330874624, -329060544, -327708704, -327105792, -327162144, -327442944, -327925600, -328501120, +-328534400, -327920224, -327404832, -327090752, -326092704, -324246400, -322538080, -321427296, -320383072, -319275520, +-318623744, -318416512, -318121792, -317643424, -317027104, -315684384, -313017760, -309172160, -304287168, -297851136, +-289580128, -280034560, -269758304, -258727760, -247008944, -235039936, -223125696, -211545392, -201074800, -192465008, +-185562448, -179705728, -174628000, -170326048, -166635600, -163581344, -161492912, -160217856, -158877280, -156786176, +-153965456, -150613232, -146883056, -143231248, -140110416, -137296144, -134274096, -131101728, -128141960, -125304600, +-122328720, -119391504, -116704464, -114009368, -111109728, -108314240, -105794168, -103213432, -100447472, -97856000, +-95487864, -92946312, -90264640, -87829936, -85353888, -82145544, -78237664, -73787000, -67849744, -59486372, +-48626544, -32700270, -4790499, 37725920, 81636592, 103223632, 90638840, 55671368, 17729624, }, }, { { -8997956, --36575404, -70057896, -75746584, -36069672, 20763482, 50795504, 39648992, 6548752, -24158118, -40223444, --36266704, -9786620, 28921772, 51592756, 33353642, -13720273, -40638444, -11729019, 48308720, 75479752, -37072012, -35640176, -89364848, -103929616, -95136208, -81471768, -67702640, -53746684, -41168336, -29545616, --16599512, -3274376, 6781754, 12052215, 13502303, 12007655, 9067750, 8138426, 12019466, 20188494, -30608084, 42454676, 55612848, 69392712, 83302504, 97821640, 113513840, 130401112, 148518896, 167913888, -187898912, 207297136, 225438544, 242095488, 256685504, 268412368, 277012512, 282643744, 285191744, 284255424, -279637792, 271346368, 259203424, 242854624, 222178128, 197471328, 169249088, 138059040, 104570104, 69709464, -34565896, 220654, -32209570, -61572652, -87062208, -108476376, -125715304, -138263584, -145782464, -149036976, --149373056, -147217520, -142017392, -133914392, -124491776, -115248472, -106034152, -95747704, -84204448, -72589240, --62194884, -53323628, -45533632, -38529076, -32577326, -28267864, -26095684, -26221850, -28418724, -32154810, --36836860, -42123964, -48040284, -54697484, -61807264, -68486472, -73672112, -76818176, -78148000, -78183440, --77134392, -74802760, -70909376, -65336116, -58133992, -49504328, -39798240, -29444148, -18872624, -8519068, -1219771, 10084583, 17916456, 24504936, 29606820, 33136210, 35232152, 36126580, 36039608, 35143568, -33567316, 31499290, 29361470, 27712202, 26908506, 26950920, 27614492, 28478318, 28897614, 28332826, -26790396, 24655796, 22099754, 18985366, 15300284, 11255499, 6929930, 2227478, -2730526, -7621420, --12545599, -18257370, -25141664, -31687194, -34493956, -30834108, -21662204, -11296838, -3238405, }, +-36575404, -70057896, -75746584, -36069672, 20763482, 50795504, 39648992, 6548752, -24158118, -40223444, +-36266704, -9786620, 28921772, 51592756, 33353642, -13720273, -40638444, -11729019, 48308720, 75479752, +37072012, -35640176, -89364848, -103929616, -95136208, -81471768, -67702640, -53746684, -41168336, -29545616, +-16599512, -3274376, 6781754, 12052215, 13502303, 12007655, 9067750, 8138426, 12019466, 20188494, +30608084, 42454676, 55612848, 69392712, 83302504, 97821640, 113513840, 130401112, 148518896, 167913888, +187898912, 207297136, 225438544, 242095488, 256685504, 268412368, 277012512, 282643744, 285191744, 284255424, +279637792, 271346368, 259203424, 242854624, 222178128, 197471328, 169249088, 138059040, 104570104, 69709464, +34565896, 220654, -32209570, -61572652, -87062208, -108476376, -125715304, -138263584, -145782464, -149036976, +-149373056, -147217520, -142017392, -133914392, -124491776, -115248472, -106034152, -95747704, -84204448, -72589240, +-62194884, -53323628, -45533632, -38529076, -32577326, -28267864, -26095684, -26221850, -28418724, -32154810, +-36836860, -42123964, -48040284, -54697484, -61807264, -68486472, -73672112, -76818176, -78148000, -78183440, +-77134392, -74802760, -70909376, -65336116, -58133992, -49504328, -39798240, -29444148, -18872624, -8519068, +1219771, 10084583, 17916456, 24504936, 29606820, 33136210, 35232152, 36126580, 36039608, 35143568, +33567316, 31499290, 29361470, 27712202, 26908506, 26950920, 27614492, 28478318, 28897614, 28332826, +26790396, 24655796, 22099754, 18985366, 15300284, 11255499, 6929930, 2227478, -2730526, -7621420, +-12545599, -18257370, -25141664, -31687194, -34493956, -30834108, -21662204, -11296838, -3238405, }, { -8997956, --36575404, -70057896, -75746584, -36069672, 20763482, 50795504, 39648992, 6548752, -24158118, -40223444, --36266704, -9786620, 28921772, 51592756, 33353642, -13720273, -40638444, -11729019, 48308720, 75479752, -37072012, -35640176, -89364848, -103929616, -95136208, -81471768, -67702640, -53746684, -41168336, -29545616, --16599512, -3274376, 6781754, 12052215, 13502303, 12007655, 9067750, 8138426, 12019466, 20188494, -30608084, 42454676, 55612848, 69392712, 83302504, 97821640, 113513840, 130401112, 148518896, 167913888, -187898912, 207297136, 225438544, 242095488, 256685504, 268412368, 277012512, 282643744, 285191744, 284255424, -279637792, 271346368, 259203424, 242854624, 222178128, 197471328, 169249088, 138059040, 104570104, 69709464, -34565896, 220654, -32209570, -61572652, -87062208, -108476376, -125715304, -138263584, -145782464, -149036976, --149373056, -147217520, -142017392, -133914392, -124491776, -115248472, -106034152, -95747704, -84204448, -72589240, --62194884, -53323628, -45533632, -38529076, -32577326, -28267864, -26095684, -26221850, -28418724, -32154810, --36836860, -42123964, -48040284, -54697484, -61807264, -68486472, -73672112, -76818176, -78148000, -78183440, --77134392, -74802760, -70909376, -65336116, -58133992, -49504328, -39798240, -29444148, -18872624, -8519068, -1219771, 10084583, 17916456, 24504936, 29606820, 33136210, 35232152, 36126580, 36039608, 35143568, -33567316, 31499290, 29361470, 27712202, 26908506, 26950920, 27614492, 28478318, 28897614, 28332826, -26790396, 24655796, 22099754, 18985366, 15300284, 11255499, 6929930, 2227478, -2730526, -7621420, --12545599, -18257370, -25141664, -31687194, -34493956, -30834108, -21662204, -11296838, -3238405, }, +-36575404, -70057896, -75746584, -36069672, 20763482, 50795504, 39648992, 6548752, -24158118, -40223444, +-36266704, -9786620, 28921772, 51592756, 33353642, -13720273, -40638444, -11729019, 48308720, 75479752, +37072012, -35640176, -89364848, -103929616, -95136208, -81471768, -67702640, -53746684, -41168336, -29545616, +-16599512, -3274376, 6781754, 12052215, 13502303, 12007655, 9067750, 8138426, 12019466, 20188494, +30608084, 42454676, 55612848, 69392712, 83302504, 97821640, 113513840, 130401112, 148518896, 167913888, +187898912, 207297136, 225438544, 242095488, 256685504, 268412368, 277012512, 282643744, 285191744, 284255424, +279637792, 271346368, 259203424, 242854624, 222178128, 197471328, 169249088, 138059040, 104570104, 69709464, +34565896, 220654, -32209570, -61572652, -87062208, -108476376, -125715304, -138263584, -145782464, -149036976, +-149373056, -147217520, -142017392, -133914392, -124491776, -115248472, -106034152, -95747704, -84204448, -72589240, +-62194884, -53323628, -45533632, -38529076, -32577326, -28267864, -26095684, -26221850, -28418724, -32154810, +-36836860, -42123964, -48040284, -54697484, -61807264, -68486472, -73672112, -76818176, -78148000, -78183440, +-77134392, -74802760, -70909376, -65336116, -58133992, -49504328, -39798240, -29444148, -18872624, -8519068, +1219771, 10084583, 17916456, 24504936, 29606820, 33136210, 35232152, 36126580, 36039608, 35143568, +33567316, 31499290, 29361470, 27712202, 26908506, 26950920, 27614492, 28478318, 28897614, 28332826, +26790396, 24655796, 22099754, 18985366, 15300284, 11255499, 6929930, 2227478, -2730526, -7621420, +-12545599, -18257370, -25141664, -31687194, -34493956, -30834108, -21662204, -11296838, -3238405, }, }, { { 3337190, --525597, -24376624, -52859772, -58058296, -31161062, 1227287, 3435437, -27114666, -57911728, -62258236, --42413876, -7547332, 40961640, 82542832, 69375000, -12013560, -89047024, -66958004, 50780472, 152577632, -144016688, 43066172, -67980208, -143702096, -194733824, -235730896, -259470784, -258697152, -240774800, -214183584, --178467168, -132137352, -79065520, -24104968, 30179662, 81193136, 125873680, 163009584, 192982000, 216053504, -232919840, 245307600, 254314672, 259715056, 261763760, 261771808, 260262128, 256400960, 249691152, 240672256, -229946640, 218110784, 206570208, 196965584, 189718368, 184060816, 179179056, 174530288, 169478336, 163535168, -156792080, 149618944, 142169328, 134492064, 126790656, 119201984, 111450640, 103003520, 93563176, 83234320, -72127536, 59994252, 46582140, 32255742, 17762374, 3402151, -10920491, -24737402, -36990944, -47239272, --55982752, -63379760, -68614248, -71157944, -71792528, -71634688, -70871256, -69215008, -66949952, -64623688, --62057984, -58481348, -53521736, -47441136, -40394704, -31950262, -21505438, -8965207, 5135171, 20148766, -35888748, 52565032, 70101920, 87712896, 104364488, 119592824, 133637904, 146803056, 158875136, 169184672, -177143776, 182786288, 186896032, 190489856, 193986496, 196899552, 198414608, 198207376, 196701984, 194758512, -193220384, 192503120, 192380704, 192236288, 191645200, 190669712, 189624416, 188777232, 188268816, 188042800, -187744832, 186871344, 185077120, 182256944, 178427968, 173705120, 168274128, 162197824, 155338224, 147560048, -138878304, 129408440, 119380224, 109168408, 99096168, 89302032, 79920216, 71038760, 62386548, 53589916, -44463112, 33750388, 18118320, -4322348, -28186260, -42157788, -39511552, -25010132, -8060580, }, +-525597, -24376624, -52859772, -58058296, -31161062, 1227287, 3435437, -27114666, -57911728, -62258236, +-42413876, -7547332, 40961640, 82542832, 69375000, -12013560, -89047024, -66958004, 50780472, 152577632, +144016688, 43066172, -67980208, -143702096, -194733824, -235730896, -259470784, -258697152, -240774800, -214183584, +-178467168, -132137352, -79065520, -24104968, 30179662, 81193136, 125873680, 163009584, 192982000, 216053504, +232919840, 245307600, 254314672, 259715056, 261763760, 261771808, 260262128, 256400960, 249691152, 240672256, +229946640, 218110784, 206570208, 196965584, 189718368, 184060816, 179179056, 174530288, 169478336, 163535168, +156792080, 149618944, 142169328, 134492064, 126790656, 119201984, 111450640, 103003520, 93563176, 83234320, +72127536, 59994252, 46582140, 32255742, 17762374, 3402151, -10920491, -24737402, -36990944, -47239272, +-55982752, -63379760, -68614248, -71157944, -71792528, -71634688, -70871256, -69215008, -66949952, -64623688, +-62057984, -58481348, -53521736, -47441136, -40394704, -31950262, -21505438, -8965207, 5135171, 20148766, +35888748, 52565032, 70101920, 87712896, 104364488, 119592824, 133637904, 146803056, 158875136, 169184672, +177143776, 182786288, 186896032, 190489856, 193986496, 196899552, 198414608, 198207376, 196701984, 194758512, +193220384, 192503120, 192380704, 192236288, 191645200, 190669712, 189624416, 188777232, 188268816, 188042800, +187744832, 186871344, 185077120, 182256944, 178427968, 173705120, 168274128, 162197824, 155338224, 147560048, +138878304, 129408440, 119380224, 109168408, 99096168, 89302032, 79920216, 71038760, 62386548, 53589916, +44463112, 33750388, 18118320, -4322348, -28186260, -42157788, -39511552, -25010132, -8060580, }, { 3337190, --525597, -24376624, -52859772, -58058296, -31161062, 1227287, 3435437, -27114666, -57911728, -62258236, --42413876, -7547332, 40961640, 82542832, 69375000, -12013560, -89047024, -66958004, 50780472, 152577632, -144016688, 43066172, -67980208, -143702096, -194733824, -235730896, -259470784, -258697152, -240774800, -214183584, --178467168, -132137352, -79065520, -24104968, 30179662, 81193136, 125873680, 163009584, 192982000, 216053504, -232919840, 245307600, 254314672, 259715056, 261763760, 261771808, 260262128, 256400960, 249691152, 240672256, -229946640, 218110784, 206570208, 196965584, 189718368, 184060816, 179179056, 174530288, 169478336, 163535168, -156792080, 149618944, 142169328, 134492064, 126790656, 119201984, 111450640, 103003520, 93563176, 83234320, -72127536, 59994252, 46582140, 32255742, 17762374, 3402151, -10920491, -24737402, -36990944, -47239272, --55982752, -63379760, -68614248, -71157944, -71792528, -71634688, -70871256, -69215008, -66949952, -64623688, --62057984, -58481348, -53521736, -47441136, -40394704, -31950262, -21505438, -8965207, 5135171, 20148766, -35888748, 52565032, 70101920, 87712896, 104364488, 119592824, 133637904, 146803056, 158875136, 169184672, -177143776, 182786288, 186896032, 190489856, 193986496, 196899552, 198414608, 198207376, 196701984, 194758512, -193220384, 192503120, 192380704, 192236288, 191645200, 190669712, 189624416, 188777232, 188268816, 188042800, -187744832, 186871344, 185077120, 182256944, 178427968, 173705120, 168274128, 162197824, 155338224, 147560048, -138878304, 129408440, 119380224, 109168408, 99096168, 89302032, 79920216, 71038760, 62386548, 53589916, -44463112, 33750388, 18118320, -4322348, -28186260, -42157788, -39511552, -25010132, -8060580, }, +-525597, -24376624, -52859772, -58058296, -31161062, 1227287, 3435437, -27114666, -57911728, -62258236, +-42413876, -7547332, 40961640, 82542832, 69375000, -12013560, -89047024, -66958004, 50780472, 152577632, +144016688, 43066172, -67980208, -143702096, -194733824, -235730896, -259470784, -258697152, -240774800, -214183584, +-178467168, -132137352, -79065520, -24104968, 30179662, 81193136, 125873680, 163009584, 192982000, 216053504, +232919840, 245307600, 254314672, 259715056, 261763760, 261771808, 260262128, 256400960, 249691152, 240672256, +229946640, 218110784, 206570208, 196965584, 189718368, 184060816, 179179056, 174530288, 169478336, 163535168, +156792080, 149618944, 142169328, 134492064, 126790656, 119201984, 111450640, 103003520, 93563176, 83234320, +72127536, 59994252, 46582140, 32255742, 17762374, 3402151, -10920491, -24737402, -36990944, -47239272, +-55982752, -63379760, -68614248, -71157944, -71792528, -71634688, -70871256, -69215008, -66949952, -64623688, +-62057984, -58481348, -53521736, -47441136, -40394704, -31950262, -21505438, -8965207, 5135171, 20148766, +35888748, 52565032, 70101920, 87712896, 104364488, 119592824, 133637904, 146803056, 158875136, 169184672, +177143776, 182786288, 186896032, 190489856, 193986496, 196899552, 198414608, 198207376, 196701984, 194758512, +193220384, 192503120, 192380704, 192236288, 191645200, 190669712, 189624416, 188777232, 188268816, 188042800, +187744832, 186871344, 185077120, 182256944, 178427968, 173705120, 168274128, 162197824, 155338224, 147560048, +138878304, 129408440, 119380224, 109168408, 99096168, 89302032, 79920216, 71038760, 62386548, 53589916, +44463112, 33750388, 18118320, -4322348, -28186260, -42157788, -39511552, -25010132, -8060580, }, }, { { -2301566, --2214593, 5727876, 13223131, 10465762, 513785, -4172024, -2193655, -10200010, -42254960, -87792352, --113481624, -84174920, 7027640, 111054432, 138495520, 44058312, -97946728, -146072368, -43659416, 114249888, -190329328, 147693184, 52002928, -32975686, -99015640, -155720480, -194640400, -205525456, -195984192, -178432272, --154529168, -122307248, -85534808, -48135308, -8592619, 34183108, 75675176, 110118128, 135565808, 152853056, -163407392, 169358608, 173025440, 175466592, 176900576, 177918480, 178836000, 178791968, 176883392, 173388368, -168980112, 163797168, 158085936, 152720448, 148354080, 144822544, 141771504, 139110240, 136628816, 133912248, -130783368, 127244312, 123018064, 117765320, 111654120, 105082816, 97930624, 89697704, 80315888, 70161512, -59257664, 47110960, 33521146, 18984292, 4003983, -11500312, -27609124, -43575664, -58267672, -71399000, --83637512, -95267744, -105480104, -113548736, -120113592, -126386392, -132302176, -136444128, -137903888, -137277360, --135506224, -132569536, -127873528, -121401544, -113898776, -106172664, -98556616, -90922312, -83046952, -75074952, --67602248, -61177516, -55893092, -51618528, -48250736, -45432164, -42456288, -38915088, -35148940, -31722628, --28767690, -26016228, -23027468, -19238232, -14357002, -8902930, -3870839, 246961, 3717831, 7033546, -10645613, 14998563, 20207822, 25861608, 31578748, 37455872, 43646532, 49981608, 56273736, 62394064, -67841696, 71890776, 74301320, 75271448, 74821552, 72951632, 70109432, 66714800, 62621696, 57782880, -52841520, 48412872, 44589812, 41679972, 40359808, 40643812, 41889888, 44006772, 47257524, 51142860, -55154360, 59654412, 63366336, 61291332, 49220324, 30265024, 13108777, 3496104, 413391, }, +-2214593, 5727876, 13223131, 10465762, 513785, -4172024, -2193655, -10200010, -42254960, -87792352, +-113481624, -84174920, 7027640, 111054432, 138495520, 44058312, -97946728, -146072368, -43659416, 114249888, +190329328, 147693184, 52002928, -32975686, -99015640, -155720480, -194640400, -205525456, -195984192, -178432272, +-154529168, -122307248, -85534808, -48135308, -8592619, 34183108, 75675176, 110118128, 135565808, 152853056, +163407392, 169358608, 173025440, 175466592, 176900576, 177918480, 178836000, 178791968, 176883392, 173388368, +168980112, 163797168, 158085936, 152720448, 148354080, 144822544, 141771504, 139110240, 136628816, 133912248, +130783368, 127244312, 123018064, 117765320, 111654120, 105082816, 97930624, 89697704, 80315888, 70161512, +59257664, 47110960, 33521146, 18984292, 4003983, -11500312, -27609124, -43575664, -58267672, -71399000, +-83637512, -95267744, -105480104, -113548736, -120113592, -126386392, -132302176, -136444128, -137903888, -137277360, +-135506224, -132569536, -127873528, -121401544, -113898776, -106172664, -98556616, -90922312, -83046952, -75074952, +-67602248, -61177516, -55893092, -51618528, -48250736, -45432164, -42456288, -38915088, -35148940, -31722628, +-28767690, -26016228, -23027468, -19238232, -14357002, -8902930, -3870839, 246961, 3717831, 7033546, +10645613, 14998563, 20207822, 25861608, 31578748, 37455872, 43646532, 49981608, 56273736, 62394064, +67841696, 71890776, 74301320, 75271448, 74821552, 72951632, 70109432, 66714800, 62621696, 57782880, +52841520, 48412872, 44589812, 41679972, 40359808, 40643812, 41889888, 44006772, 47257524, 51142860, +55154360, 59654412, 63366336, 61291332, 49220324, 30265024, 13108777, 3496104, 413391, }, { 2301566, -2214593, -5727876, -13223131, -10465762, -513785, 4172024, 2193655, 10200010, 42254960, 87792352, -113481624, 84174920, -7027640, -111054432, -138495520, -44058312, 97946728, 146072368, 43659416, -114249888, --190329328, -147693184, -52002928, 32975686, 99015640, 155720480, 194640400, 205525456, 195984192, 178432272, -154529168, 122307248, 85534808, 48135308, 8592619, -34183108, -75675176, -110118128, -135565808, -152853056, --163407392, -169358608, -173025440, -175466592, -176900576, -177918480, -178836000, -178791968, -176883392, -173388368, --168980112, -163797168, -158085936, -152720448, -148354080, -144822544, -141771504, -139110240, -136628816, -133912248, --130783368, -127244312, -123018064, -117765320, -111654120, -105082816, -97930624, -89697704, -80315888, -70161512, --59257664, -47110960, -33521146, -18984292, -4003983, 11500312, 27609124, 43575664, 58267672, 71399000, -83637512, 95267744, 105480104, 113548736, 120113592, 126386392, 132302176, 136444128, 137903888, 137277360, -135506224, 132569536, 127873528, 121401544, 113898776, 106172664, 98556616, 90922312, 83046952, 75074952, -67602248, 61177516, 55893092, 51618528, 48250736, 45432164, 42456288, 38915088, 35148940, 31722628, -28767690, 26016228, 23027468, 19238232, 14357002, 8902930, 3870839, -246961, -3717831, -7033546, --10645613, -14998563, -20207822, -25861608, -31578748, -37455872, -43646532, -49981608, -56273736, -62394064, --67841696, -71890776, -74301320, -75271448, -74821552, -72951632, -70109432, -66714800, -62621696, -57782880, --52841520, -48412872, -44589812, -41679972, -40359808, -40643812, -41889888, -44006772, -47257524, -51142860, --55154360, -59654412, -63366336, -61291332, -49220324, -30265024, -13108777, -3496104, -413391, }, +2214593, -5727876, -13223131, -10465762, -513785, 4172024, 2193655, 10200010, 42254960, 87792352, +113481624, 84174920, -7027640, -111054432, -138495520, -44058312, 97946728, 146072368, 43659416, -114249888, +-190329328, -147693184, -52002928, 32975686, 99015640, 155720480, 194640400, 205525456, 195984192, 178432272, +154529168, 122307248, 85534808, 48135308, 8592619, -34183108, -75675176, -110118128, -135565808, -152853056, +-163407392, -169358608, -173025440, -175466592, -176900576, -177918480, -178836000, -178791968, -176883392, -173388368, +-168980112, -163797168, -158085936, -152720448, -148354080, -144822544, -141771504, -139110240, -136628816, -133912248, +-130783368, -127244312, -123018064, -117765320, -111654120, -105082816, -97930624, -89697704, -80315888, -70161512, +-59257664, -47110960, -33521146, -18984292, -4003983, 11500312, 27609124, 43575664, 58267672, 71399000, +83637512, 95267744, 105480104, 113548736, 120113592, 126386392, 132302176, 136444128, 137903888, 137277360, +135506224, 132569536, 127873528, 121401544, 113898776, 106172664, 98556616, 90922312, 83046952, 75074952, +67602248, 61177516, 55893092, 51618528, 48250736, 45432164, 42456288, 38915088, 35148940, 31722628, +28767690, 26016228, 23027468, 19238232, 14357002, 8902930, 3870839, -246961, -3717831, -7033546, +-10645613, -14998563, -20207822, -25861608, -31578748, -37455872, -43646532, -49981608, -56273736, -62394064, +-67841696, -71890776, -74301320, -75271448, -74821552, -72951632, -70109432, -66714800, -62621696, -57782880, +-52841520, -48412872, -44589812, -41679972, -40359808, -40643812, -41889888, -44006772, -47257524, -51142860, +-55154360, -59654412, -63366336, -61291332, -49220324, -30265024, -13108777, -3496104, -413391, }, }, { { -11621645, --12662637, 12901008, 18407156, -12460774, -26243860, 22013854, 87203944, 81292992, -10214506, -105698072, --122505888, -56635048, 34244312, 87755312, 70377872, -3514894, -68105296, -56239376, 24912958, 94054416, -88859656, 32216012, -11744588, -16888348, -3045132, 10651519, 24802900, 40087076, 47873852, 43004972, -29452738, 11979201, -7521562, -26468810, -42553464, -57022672, -71507984, -83610128, -89570472, -88812944, --83004536, -73455752, -61811560, -50697256, -41634340, -33958696, -26524108, -18781892, -10123238, -8590, -11195369, 22897008, 35459248, 49500572, 64513092, 79195440, 92606472, 104193760, 113225536, 118956096, -121067072, 119553632, 114368000, 105315816, 92148520, 74772160, 53405232, 28428388, 200790, -30688616, --63127428, -95725160, -127184720, -156271312, -181872544, -203371536, -220521344, -232880112, -240076864, -242724176, --242090128, -238572016, -231492288, -220755952, -207650400, -193449088, -178148272, -161212672, -142750752, -123226904, --102581000, -80419504, -56811144, -32329830, -7428146, 17716740, 42713448, 66690640, 88742616, 108476376, -125886032, 140656416, 151783072, 158158416, 159679360, 157684352, 154043296, 149673168, 144014544, 136032352, -125606856, 113885888, 102469328, 92425008, 83886080, 76293648, 69045360, 62086436, 55886652, 50864760, -46990164, 43880608, 41015864, 37846180, 33997888, 29450054, 24321862, 18562312, 12101607, 5170067, --1821603, -8575439, -14845554, -20320028, -24818468, -28407450, -31151934, -33056752, -34331820, -35319128, --36078264, -36451924, -36548024, -36649492, -36703180, -36425616, -35817880, -35015256, -33838436, -32111860, --30125974, -27972048, -24702504, -19210314, -12044699, -5477157, -1440962, 21475, 118112, }, +-12662637, 12901008, 18407156, -12460774, -26243860, 22013854, 87203944, 81292992, -10214506, -105698072, +-122505888, -56635048, 34244312, 87755312, 70377872, -3514894, -68105296, -56239376, 24912958, 94054416, +88859656, 32216012, -11744588, -16888348, -3045132, 10651519, 24802900, 40087076, 47873852, 43004972, +29452738, 11979201, -7521562, -26468810, -42553464, -57022672, -71507984, -83610128, -89570472, -88812944, +-83004536, -73455752, -61811560, -50697256, -41634340, -33958696, -26524108, -18781892, -10123238, -8590, +11195369, 22897008, 35459248, 49500572, 64513092, 79195440, 92606472, 104193760, 113225536, 118956096, +121067072, 119553632, 114368000, 105315816, 92148520, 74772160, 53405232, 28428388, 200790, -30688616, +-63127428, -95725160, -127184720, -156271312, -181872544, -203371536, -220521344, -232880112, -240076864, -242724176, +-242090128, -238572016, -231492288, -220755952, -207650400, -193449088, -178148272, -161212672, -142750752, -123226904, +-102581000, -80419504, -56811144, -32329830, -7428146, 17716740, 42713448, 66690640, 88742616, 108476376, +125886032, 140656416, 151783072, 158158416, 159679360, 157684352, 154043296, 149673168, 144014544, 136032352, +125606856, 113885888, 102469328, 92425008, 83886080, 76293648, 69045360, 62086436, 55886652, 50864760, +46990164, 43880608, 41015864, 37846180, 33997888, 29450054, 24321862, 18562312, 12101607, 5170067, +-1821603, -8575439, -14845554, -20320028, -24818468, -28407450, -31151934, -33056752, -34331820, -35319128, +-36078264, -36451924, -36548024, -36649492, -36703180, -36425616, -35817880, -35015256, -33838436, -32111860, +-30125974, -27972048, -24702504, -19210314, -12044699, -5477157, -1440962, 21475, 118112, }, { 11621645, -12662637, -12901008, -18407156, 12460774, 26243860, -22013854, -87203944, -81292992, 10214506, 105698072, -122505888, 56635048, -34244312, -87755312, -70377872, 3514894, 68105296, 56239376, -24912958, -94054416, --88859656, -32216012, 11744588, 16888348, 3045132, -10651519, -24802900, -40087076, -47873852, -43004972, --29452738, -11979201, 7521562, 26468810, 42553464, 57022672, 71507984, 83610128, 89570472, 88812944, -83004536, 73455752, 61811560, 50697256, 41634340, 33958696, 26524108, 18781892, 10123238, 8590, --11195369, -22897008, -35459248, -49500572, -64513092, -79195440, -92606472, -104193760, -113225536, -118956096, --121067072, -119553632, -114368000, -105315816, -92148520, -74772160, -53405232, -28428388, -200790, 30688616, -63127428, 95725160, 127184720, 156271312, 181872544, 203371536, 220521344, 232880112, 240076864, 242724176, -242090128, 238572016, 231492288, 220755952, 207650400, 193449088, 178148272, 161212672, 142750752, 123226904, -102581000, 80419504, 56811144, 32329830, 7428146, -17716740, -42713448, -66690640, -88742616, -108476376, --125886032, -140656416, -151783072, -158158416, -159679360, -157684352, -154043296, -149673168, -144014544, -136032352, --125606856, -113885888, -102469328, -92425008, -83886080, -76293648, -69045360, -62086436, -55886652, -50864760, --46990164, -43880608, -41015864, -37846180, -33997888, -29450054, -24321862, -18562312, -12101607, -5170067, -1821603, 8575439, 14845554, 20320028, 24818468, 28407450, 31151934, 33056752, 34331820, 35319128, -36078264, 36451924, 36548024, 36649492, 36703180, 36425616, 35817880, 35015256, 33838436, 32111860, -30125974, 27972048, 24702504, 19210314, 12044699, 5477157, 1440962, -21475, -118112, }, +12662637, -12901008, -18407156, 12460774, 26243860, -22013854, -87203944, -81292992, 10214506, 105698072, +122505888, 56635048, -34244312, -87755312, -70377872, 3514894, 68105296, 56239376, -24912958, -94054416, +-88859656, -32216012, 11744588, 16888348, 3045132, -10651519, -24802900, -40087076, -47873852, -43004972, +-29452738, -11979201, 7521562, 26468810, 42553464, 57022672, 71507984, 83610128, 89570472, 88812944, +83004536, 73455752, 61811560, 50697256, 41634340, 33958696, 26524108, 18781892, 10123238, 8590, +-11195369, -22897008, -35459248, -49500572, -64513092, -79195440, -92606472, -104193760, -113225536, -118956096, +-121067072, -119553632, -114368000, -105315816, -92148520, -74772160, -53405232, -28428388, -200790, 30688616, +63127428, 95725160, 127184720, 156271312, 181872544, 203371536, 220521344, 232880112, 240076864, 242724176, +242090128, 238572016, 231492288, 220755952, 207650400, 193449088, 178148272, 161212672, 142750752, 123226904, +102581000, 80419504, 56811144, 32329830, 7428146, -17716740, -42713448, -66690640, -88742616, -108476376, +-125886032, -140656416, -151783072, -158158416, -159679360, -157684352, -154043296, -149673168, -144014544, -136032352, +-125606856, -113885888, -102469328, -92425008, -83886080, -76293648, -69045360, -62086436, -55886652, -50864760, +-46990164, -43880608, -41015864, -37846180, -33997888, -29450054, -24321862, -18562312, -12101607, -5170067, +1821603, 8575439, 14845554, 20320028, 24818468, 28407450, 31151934, 33056752, 34331820, 35319128, +36078264, 36451924, 36548024, 36649492, 36703180, 36425616, 35817880, 35015256, 33838436, 32111860, +30125974, 27972048, 24702504, 19210314, 12044699, 5477157, 1440962, -21475, -118112, }, }, { { 1937567, --3154117, -18935438, -27222040, -21792128, -18682034, -23860690, -13433584, 36628556, 116389320, 188753072, -209408640, 135242080, -38696580, -218963344, -247807264, -70661872, 158391952, 221414688, 82856360, -86350856, --131750272, -72441064, -11758547, 14289893, 35926864, 60059212, 59903520, 32535452, 7328288, 1085016, -3496640, 4161287, 4872104, 6293738, 3827353, -2916820, -9754944, -15612206, -22289270, -29783450, --37481104, -46116136, -55024972, -61679488, -65843996, -69907576, -74480640, -77953656, -80207440, -82614232, --84932976, -85723256, -84875000, -82906288, -79136920, -72829224, -64595772, -55052352, -43778064, -30610768, --16187732, -662499, 16342887, 34379604, 52403968, 70061656, 87236152, 102935336, 116032840, 126399280, -134149544, 138639936, 139153184, 135712384, 128561256, 117670296, 103120016, 85248120, 64397128, 41117332, -16299938, -9499394, -36297844, -63786708, -90999616, -117286968, -142710496, -167188576, -190247728, -211719872, --231499280, -248521840, -261161936, -268768320, -271836544, -270715008, -265027392, -254280320, -238480208, -218527936, --196458240, -174670416, -154414816, -135574400, -118126632, -103066328, -91683056, -84716080, -82332912, -84169544, --89245664, -96442952, -105115032, -114949968, -125577328, -136683040, -148025504, -158953520, -168424992, -175831664, --181361968, -185451856, -188442224, -190755072, -192722704, -194242576, -195153120, -195759248, -196429248, -196955392, --196885056, -196125392, -194752608, -192678144, -189928816, -186760752, -183132032, -178535344, -172533136, -164956272, --155636192, -144592224, -132347808, -119421568, -105817256, -91629368, -77513424, -63801740, -50008988, -35935992, --21733608, -5660230, 15737834, 41821172, 63403380, 68656664, 54958400, 31762356, 9776956, }, +-3154117, -18935438, -27222040, -21792128, -18682034, -23860690, -13433584, 36628556, 116389320, 188753072, +209408640, 135242080, -38696580, -218963344, -247807264, -70661872, 158391952, 221414688, 82856360, -86350856, +-131750272, -72441064, -11758547, 14289893, 35926864, 60059212, 59903520, 32535452, 7328288, 1085016, +3496640, 4161287, 4872104, 6293738, 3827353, -2916820, -9754944, -15612206, -22289270, -29783450, +-37481104, -46116136, -55024972, -61679488, -65843996, -69907576, -74480640, -77953656, -80207440, -82614232, +-84932976, -85723256, -84875000, -82906288, -79136920, -72829224, -64595772, -55052352, -43778064, -30610768, +-16187732, -662499, 16342887, 34379604, 52403968, 70061656, 87236152, 102935336, 116032840, 126399280, +134149544, 138639936, 139153184, 135712384, 128561256, 117670296, 103120016, 85248120, 64397128, 41117332, +16299938, -9499394, -36297844, -63786708, -90999616, -117286968, -142710496, -167188576, -190247728, -211719872, +-231499280, -248521840, -261161936, -268768320, -271836544, -270715008, -265027392, -254280320, -238480208, -218527936, +-196458240, -174670416, -154414816, -135574400, -118126632, -103066328, -91683056, -84716080, -82332912, -84169544, +-89245664, -96442952, -105115032, -114949968, -125577328, -136683040, -148025504, -158953520, -168424992, -175831664, +-181361968, -185451856, -188442224, -190755072, -192722704, -194242576, -195153120, -195759248, -196429248, -196955392, +-196885056, -196125392, -194752608, -192678144, -189928816, -186760752, -183132032, -178535344, -172533136, -164956272, +-155636192, -144592224, -132347808, -119421568, -105817256, -91629368, -77513424, -63801740, -50008988, -35935992, +-21733608, -5660230, 15737834, 41821172, 63403380, 68656664, 54958400, 31762356, 9776956, }, { 1937567, --3154117, -18935438, -27222040, -21792128, -18682034, -23860690, -13433584, 36628556, 116389320, 188753072, -209408640, 135242080, -38696580, -218963344, -247807264, -70661872, 158391952, 221414688, 82856360, -86350856, --131750272, -72441064, -11758547, 14289893, 35926864, 60059212, 59903520, 32535452, 7328288, 1085016, -3496640, 4161287, 4872104, 6293738, 3827353, -2916820, -9754944, -15612206, -22289270, -29783450, --37481104, -46116136, -55024972, -61679488, -65843996, -69907576, -74480640, -77953656, -80207440, -82614232, --84932976, -85723256, -84875000, -82906288, -79136920, -72829224, -64595772, -55052352, -43778064, -30610768, --16187732, -662499, 16342887, 34379604, 52403968, 70061656, 87236152, 102935336, 116032840, 126399280, -134149544, 138639936, 139153184, 135712384, 128561256, 117670296, 103120016, 85248120, 64397128, 41117332, -16299938, -9499394, -36297844, -63786708, -90999616, -117286968, -142710496, -167188576, -190247728, -211719872, --231499280, -248521840, -261161936, -268768320, -271836544, -270715008, -265027392, -254280320, -238480208, -218527936, --196458240, -174670416, -154414816, -135574400, -118126632, -103066328, -91683056, -84716080, -82332912, -84169544, --89245664, -96442952, -105115032, -114949968, -125577328, -136683040, -148025504, -158953520, -168424992, -175831664, --181361968, -185451856, -188442224, -190755072, -192722704, -194242576, -195153120, -195759248, -196429248, -196955392, --196885056, -196125392, -194752608, -192678144, -189928816, -186760752, -183132032, -178535344, -172533136, -164956272, --155636192, -144592224, -132347808, -119421568, -105817256, -91629368, -77513424, -63801740, -50008988, -35935992, --21733608, -5660230, 15737834, 41821172, 63403380, 68656664, 54958400, 31762356, 9776956, }, +-3154117, -18935438, -27222040, -21792128, -18682034, -23860690, -13433584, 36628556, 116389320, 188753072, +209408640, 135242080, -38696580, -218963344, -247807264, -70661872, 158391952, 221414688, 82856360, -86350856, +-131750272, -72441064, -11758547, 14289893, 35926864, 60059212, 59903520, 32535452, 7328288, 1085016, +3496640, 4161287, 4872104, 6293738, 3827353, -2916820, -9754944, -15612206, -22289270, -29783450, +-37481104, -46116136, -55024972, -61679488, -65843996, -69907576, -74480640, -77953656, -80207440, -82614232, +-84932976, -85723256, -84875000, -82906288, -79136920, -72829224, -64595772, -55052352, -43778064, -30610768, +-16187732, -662499, 16342887, 34379604, 52403968, 70061656, 87236152, 102935336, 116032840, 126399280, +134149544, 138639936, 139153184, 135712384, 128561256, 117670296, 103120016, 85248120, 64397128, 41117332, +16299938, -9499394, -36297844, -63786708, -90999616, -117286968, -142710496, -167188576, -190247728, -211719872, +-231499280, -248521840, -261161936, -268768320, -271836544, -270715008, -265027392, -254280320, -238480208, -218527936, +-196458240, -174670416, -154414816, -135574400, -118126632, -103066328, -91683056, -84716080, -82332912, -84169544, +-89245664, -96442952, -105115032, -114949968, -125577328, -136683040, -148025504, -158953520, -168424992, -175831664, +-181361968, -185451856, -188442224, -190755072, -192722704, -194242576, -195153120, -195759248, -196429248, -196955392, +-196885056, -196125392, -194752608, -192678144, -189928816, -186760752, -183132032, -178535344, -172533136, -164956272, +-155636192, -144592224, -132347808, -119421568, -105817256, -91629368, -77513424, -63801740, -50008988, -35935992, +-21733608, -5660230, 15737834, 41821172, 63403380, 68656664, 54958400, 31762356, 9776956, }, }, { { -19097036, --44097504, -38590820, -1660005, 54663660, 102884864, 104016056, 40863928, -49285824, -99553584, -81158776, --28471338, 10191957, 23523000, 25673168, 19345606, -1676111, -25376814, -27127014, -3715684, 20526722, -26368414, 20985210, 20455318, 25950192, 26894548, 17848274, 1888175, -17679696, -39755828, -61020212, --76006424, -82653960, -84203904, -84907208, -86058800, -86341728, -83818968, -76833744, -64608656, -48231944, --30523796, -14159433, -113280, 11897596, 22209812, 31049392, 38930120, 46360952, 53340272, 59653876, -65395708, 70720392, 75431440, 79288856, 82416128, 84936736, 86519968, 86708408, 85507432, 83341696, -80612240, 77582680, 74634720, 72403488, 71481680, 71932112, 73285560, 75244608, 78113640, 82169168, -86955368, 91811904, 96782256, 102250288, 107901392, 112794432, 116279800, 118151328, 118082608, 115535696, -110136384, 101798776, 90710248, 77292768, 61738008, 43687332, 23098334, 1181653, -20657718, -42777876, --66949412, -93851480, -122040424, -149661888, -176182240, -202011104, -227126992, -250505040, -270749376, -287239360, --300546784, -311384064, -319296992, -323081408, -322467232, -318624832, -312945824, -305905824, -297029216, -285386624, --270367648, -252524752, -233423424, -214297392, -195262096, -176031376, -156713696, -137660144, -119254064, -102028560, --86310056, -71721656, -57650808, -44007308, -30907122, -18028662, -4916664, 8523363, 22249004, 36105104, -49336828, 61008936, 71157408, 80641232, 89880784, 98731096, 107202384, 115066472, 121261960, 125000728, -126878704, 127838624, 127981976, 127339872, 126459408, 125247688, 122752312, 118818120, 114362632, 109850768, -105385072, 101484168, 96779032, 86209656, 66095788, 40770512, 19630148, 7509751, 1865090, }, +-44097504, -38590820, -1660005, 54663660, 102884864, 104016056, 40863928, -49285824, -99553584, -81158776, +-28471338, 10191957, 23523000, 25673168, 19345606, -1676111, -25376814, -27127014, -3715684, 20526722, +26368414, 20985210, 20455318, 25950192, 26894548, 17848274, 1888175, -17679696, -39755828, -61020212, +-76006424, -82653960, -84203904, -84907208, -86058800, -86341728, -83818968, -76833744, -64608656, -48231944, +-30523796, -14159433, -113280, 11897596, 22209812, 31049392, 38930120, 46360952, 53340272, 59653876, +65395708, 70720392, 75431440, 79288856, 82416128, 84936736, 86519968, 86708408, 85507432, 83341696, +80612240, 77582680, 74634720, 72403488, 71481680, 71932112, 73285560, 75244608, 78113640, 82169168, +86955368, 91811904, 96782256, 102250288, 107901392, 112794432, 116279800, 118151328, 118082608, 115535696, +110136384, 101798776, 90710248, 77292768, 61738008, 43687332, 23098334, 1181653, -20657718, -42777876, +-66949412, -93851480, -122040424, -149661888, -176182240, -202011104, -227126992, -250505040, -270749376, -287239360, +-300546784, -311384064, -319296992, -323081408, -322467232, -318624832, -312945824, -305905824, -297029216, -285386624, +-270367648, -252524752, -233423424, -214297392, -195262096, -176031376, -156713696, -137660144, -119254064, -102028560, +-86310056, -71721656, -57650808, -44007308, -30907122, -18028662, -4916664, 8523363, 22249004, 36105104, +49336828, 61008936, 71157408, 80641232, 89880784, 98731096, 107202384, 115066472, 121261960, 125000728, +126878704, 127838624, 127981976, 127339872, 126459408, 125247688, 122752312, 118818120, 114362632, 109850768, +105385072, 101484168, 96779032, 86209656, 66095788, 40770512, 19630148, 7509751, 1865090, }, { -19097036, --44097504, -38590820, -1660005, 54663660, 102884864, 104016056, 40863928, -49285824, -99553584, -81158776, --28471338, 10191957, 23523000, 25673168, 19345606, -1676111, -25376814, -27127014, -3715684, 20526722, -26368414, 20985210, 20455318, 25950192, 26894548, 17848274, 1888175, -17679696, -39755828, -61020212, --76006424, -82653960, -84203904, -84907208, -86058800, -86341728, -83818968, -76833744, -64608656, -48231944, --30523796, -14159433, -113280, 11897596, 22209812, 31049392, 38930120, 46360952, 53340272, 59653876, -65395708, 70720392, 75431440, 79288856, 82416128, 84936736, 86519968, 86708408, 85507432, 83341696, -80612240, 77582680, 74634720, 72403488, 71481680, 71932112, 73285560, 75244608, 78113640, 82169168, -86955368, 91811904, 96782256, 102250288, 107901392, 112794432, 116279800, 118151328, 118082608, 115535696, -110136384, 101798776, 90710248, 77292768, 61738008, 43687332, 23098334, 1181653, -20657718, -42777876, --66949412, -93851480, -122040424, -149661888, -176182240, -202011104, -227126992, -250505040, -270749376, -287239360, --300546784, -311384064, -319296992, -323081408, -322467232, -318624832, -312945824, -305905824, -297029216, -285386624, --270367648, -252524752, -233423424, -214297392, -195262096, -176031376, -156713696, -137660144, -119254064, -102028560, --86310056, -71721656, -57650808, -44007308, -30907122, -18028662, -4916664, 8523363, 22249004, 36105104, -49336828, 61008936, 71157408, 80641232, 89880784, 98731096, 107202384, 115066472, 121261960, 125000728, -126878704, 127838624, 127981976, 127339872, 126459408, 125247688, 122752312, 118818120, 114362632, 109850768, -105385072, 101484168, 96779032, 86209656, 66095788, 40770512, 19630148, 7509751, 1865090, }, +-44097504, -38590820, -1660005, 54663660, 102884864, 104016056, 40863928, -49285824, -99553584, -81158776, +-28471338, 10191957, 23523000, 25673168, 19345606, -1676111, -25376814, -27127014, -3715684, 20526722, +26368414, 20985210, 20455318, 25950192, 26894548, 17848274, 1888175, -17679696, -39755828, -61020212, +-76006424, -82653960, -84203904, -84907208, -86058800, -86341728, -83818968, -76833744, -64608656, -48231944, +-30523796, -14159433, -113280, 11897596, 22209812, 31049392, 38930120, 46360952, 53340272, 59653876, +65395708, 70720392, 75431440, 79288856, 82416128, 84936736, 86519968, 86708408, 85507432, 83341696, +80612240, 77582680, 74634720, 72403488, 71481680, 71932112, 73285560, 75244608, 78113640, 82169168, +86955368, 91811904, 96782256, 102250288, 107901392, 112794432, 116279800, 118151328, 118082608, 115535696, +110136384, 101798776, 90710248, 77292768, 61738008, 43687332, 23098334, 1181653, -20657718, -42777876, +-66949412, -93851480, -122040424, -149661888, -176182240, -202011104, -227126992, -250505040, -270749376, -287239360, +-300546784, -311384064, -319296992, -323081408, -322467232, -318624832, -312945824, -305905824, -297029216, -285386624, +-270367648, -252524752, -233423424, -214297392, -195262096, -176031376, -156713696, -137660144, -119254064, -102028560, +-86310056, -71721656, -57650808, -44007308, -30907122, -18028662, -4916664, 8523363, 22249004, 36105104, +49336828, 61008936, 71157408, 80641232, 89880784, 98731096, 107202384, 115066472, 121261960, 125000728, +126878704, 127838624, 127981976, 127339872, 126459408, 125247688, 122752312, 118818120, 114362632, 109850768, +105385072, 101484168, 96779032, 86209656, 66095788, 40770512, 19630148, 7509751, 1865090, }, }, { { 22844394, -32909650, -15393163, -77620800, -120804008, -153344832, -163214656, -98879272, 52478596, 224605856, 341776864, -367739936, 261556528, -9730785, -335662976, -447413184, -189512752, 232476912, 428876096, 256723088, -56909928, --233360064, -236784768, -198009264, -186468160, -170963328, -131196752, -92145840, -64961380, -31695248, 12736726, -52081848, 79310864, 101933536, 121239944, 130664176, 129902360, 123666600, 112332184, 95456720, 77654080, -62691492, 48531520, 33186676, 18509698, 5400385, -7770670, -20495048, -30122216, -36809480, -43242268, --50261316, -57106960, -64260764, -72339064, -80247704, -87148104, -93848792, -100525856, -105907448, -109747152, --113176144, -116183160, -117611776, -117537688, -116905792, -115390736, -112120656, -107663552, -103142568, -98513664, --93455808, -88604640, -84488448, -80620832, -76587320, -72689640, -69058240, -65542276, -62505732, -60363080, --58583892, -56403120, -53912040, -51351704, -48185240, -43943956, -39109972, -34375844, -29983704, -26271778, --23819352, -22798760, -23212150, -25606596, -30336428, -36339720, -41874320, -46194520, -49443664, -51316268, --50843824, -47189880, -40026412, -29606284, -16843788, -2742874, 12445205, 28867012, 45981384, 62622772, -78007880, 91937000, 104316168, 115215720, 125001264, 133735616, 140881376, 146136256, 150063472, 153525216, -157035808, 160791760, 164606240, 167716864, 169412832, 169911056, 170004464, 170063520, 170014128, 169894416, -169681808, 168951664, 167393664, 165290736, 162986496, 160383744, 157356864, 154039536, 150337280, 145769584, -140077680, 133437120, 125952064, 117530704, 108336256, 98785856, 89065272, 79058000, 68738808, 58292908, -47700444, 36189396, 22434224, 6406481, -8493835, -16772384, -16004122, -9655623, -2934537, }, +32909650, -15393163, -77620800, -120804008, -153344832, -163214656, -98879272, 52478596, 224605856, 341776864, +367739936, 261556528, -9730785, -335662976, -447413184, -189512752, 232476912, 428876096, 256723088, -56909928, +-233360064, -236784768, -198009264, -186468160, -170963328, -131196752, -92145840, -64961380, -31695248, 12736726, +52081848, 79310864, 101933536, 121239944, 130664176, 129902360, 123666600, 112332184, 95456720, 77654080, +62691492, 48531520, 33186676, 18509698, 5400385, -7770670, -20495048, -30122216, -36809480, -43242268, +-50261316, -57106960, -64260764, -72339064, -80247704, -87148104, -93848792, -100525856, -105907448, -109747152, +-113176144, -116183160, -117611776, -117537688, -116905792, -115390736, -112120656, -107663552, -103142568, -98513664, +-93455808, -88604640, -84488448, -80620832, -76587320, -72689640, -69058240, -65542276, -62505732, -60363080, +-58583892, -56403120, -53912040, -51351704, -48185240, -43943956, -39109972, -34375844, -29983704, -26271778, +-23819352, -22798760, -23212150, -25606596, -30336428, -36339720, -41874320, -46194520, -49443664, -51316268, +-50843824, -47189880, -40026412, -29606284, -16843788, -2742874, 12445205, 28867012, 45981384, 62622772, +78007880, 91937000, 104316168, 115215720, 125001264, 133735616, 140881376, 146136256, 150063472, 153525216, +157035808, 160791760, 164606240, 167716864, 169412832, 169911056, 170004464, 170063520, 170014128, 169894416, +169681808, 168951664, 167393664, 165290736, 162986496, 160383744, 157356864, 154039536, 150337280, 145769584, +140077680, 133437120, 125952064, 117530704, 108336256, 98785856, 89065272, 79058000, 68738808, 58292908, +47700444, 36189396, 22434224, 6406481, -8493835, -16772384, -16004122, -9655623, -2934537, }, { 22844394, -32909650, -15393163, -77620800, -120804008, -153344832, -163214656, -98879272, 52478596, 224605856, 341776864, -367739936, 261556528, -9730785, -335662976, -447413184, -189512752, 232476912, 428876096, 256723088, -56909928, --233360064, -236784768, -198009264, -186468160, -170963328, -131196752, -92145840, -64961380, -31695248, 12736726, -52081848, 79310864, 101933536, 121239944, 130664176, 129902360, 123666600, 112332184, 95456720, 77654080, -62691492, 48531520, 33186676, 18509698, 5400385, -7770670, -20495048, -30122216, -36809480, -43242268, --50261316, -57106960, -64260764, -72339064, -80247704, -87148104, -93848792, -100525856, -105907448, -109747152, --113176144, -116183160, -117611776, -117537688, -116905792, -115390736, -112120656, -107663552, -103142568, -98513664, --93455808, -88604640, -84488448, -80620832, -76587320, -72689640, -69058240, -65542276, -62505732, -60363080, --58583892, -56403120, -53912040, -51351704, -48185240, -43943956, -39109972, -34375844, -29983704, -26271778, --23819352, -22798760, -23212150, -25606596, -30336428, -36339720, -41874320, -46194520, -49443664, -51316268, --50843824, -47189880, -40026412, -29606284, -16843788, -2742874, 12445205, 28867012, 45981384, 62622772, -78007880, 91937000, 104316168, 115215720, 125001264, 133735616, 140881376, 146136256, 150063472, 153525216, -157035808, 160791760, 164606240, 167716864, 169412832, 169911056, 170004464, 170063520, 170014128, 169894416, -169681808, 168951664, 167393664, 165290736, 162986496, 160383744, 157356864, 154039536, 150337280, 145769584, -140077680, 133437120, 125952064, 117530704, 108336256, 98785856, 89065272, 79058000, 68738808, 58292908, -47700444, 36189396, 22434224, 6406481, -8493835, -16772384, -16004122, -9655623, -2934537, }, +32909650, -15393163, -77620800, -120804008, -153344832, -163214656, -98879272, 52478596, 224605856, 341776864, +367739936, 261556528, -9730785, -335662976, -447413184, -189512752, 232476912, 428876096, 256723088, -56909928, +-233360064, -236784768, -198009264, -186468160, -170963328, -131196752, -92145840, -64961380, -31695248, 12736726, +52081848, 79310864, 101933536, 121239944, 130664176, 129902360, 123666600, 112332184, 95456720, 77654080, +62691492, 48531520, 33186676, 18509698, 5400385, -7770670, -20495048, -30122216, -36809480, -43242268, +-50261316, -57106960, -64260764, -72339064, -80247704, -87148104, -93848792, -100525856, -105907448, -109747152, +-113176144, -116183160, -117611776, -117537688, -116905792, -115390736, -112120656, -107663552, -103142568, -98513664, +-93455808, -88604640, -84488448, -80620832, -76587320, -72689640, -69058240, -65542276, -62505732, -60363080, +-58583892, -56403120, -53912040, -51351704, -48185240, -43943956, -39109972, -34375844, -29983704, -26271778, +-23819352, -22798760, -23212150, -25606596, -30336428, -36339720, -41874320, -46194520, -49443664, -51316268, +-50843824, -47189880, -40026412, -29606284, -16843788, -2742874, 12445205, 28867012, 45981384, 62622772, +78007880, 91937000, 104316168, 115215720, 125001264, 133735616, 140881376, 146136256, 150063472, 153525216, +157035808, 160791760, 164606240, 167716864, 169412832, 169911056, 170004464, 170063520, 170014128, 169894416, +169681808, 168951664, 167393664, 165290736, 162986496, 160383744, 157356864, 154039536, 150337280, 145769584, +140077680, 133437120, 125952064, 117530704, 108336256, 98785856, 89065272, 79058000, 68738808, 58292908, +47700444, 36189396, 22434224, 6406481, -8493835, -16772384, -16004122, -9655623, -2934537, }, }, { { 2709588, -11341935, 24164022, 37824168, 48972292, 42486352, -3062849, -79568568, -149920128, -196602672, -214368256, --144205680, 77959560, 347087040, 392520288, 92602720, -296709216, -393664896, -139867216, 160926512, 242814896, -146233968, 54702316, 31922882, 18806588, -16871168, -45679124, -50996296, -50842212, -54457500, -50628536, --35736812, -20008642, -9170292, -780610, 5867462, 9701257, 12484933, 15276662, 15848429, 13904420, -12628278, 12879533, 12058658, 9613211, 7916699, 7660611, 7406671, 7144141, 8097087, 9909026, -11210938, 11767674, 11806328, 10767483, 8333311, 5125507, 1481227, -2884071, -7704635, -12288438, --16731045, -21560198, -26567594, -31265752, -35827544, -40514428, -44970456, -48920216, -52687436, -56478820, --60071560, -63505924, -67145368, -70923328, -74355008, -77193448, -79366160, -80595600, -80738408, -80030808, --78453480, -75420160, -70591544, -64421288, -57504244, -49912352, -41438380, -32058710, -22058416, -12040941, --2745021, 5396090, 12326556, 17893908, 21741662, 23833848, 24593520, 24358908, 23168664, 21221434, -19105088, 17416092, 16371342, 15782931, 15292768, 14787572, 14678051, 15534897, 17454210, 20044076, -22972170, 26204670, 29848948, 34091304, 39089036, 44647260, 50229644, 55514064, 60679296, 66076460, -71948216, 78428248, 85371600, 92261800, 98683320, 104746736, 110726944, 116595480, 122185912, 127372624, -131826504, 135100336, 137170512, 138383840, 138876160, 138605568, 137763760, 136496752, 134513008, 131615512, -128205312, 124721016, 121202368, 117805048, 114904336, 112378360, 109732120, 106923744, 104035920, 100594576, -96302832, 90974384, 82011328, 64709052, 38907036, 13247827, -1968169, -5075578, -2077154, }, +11341935, 24164022, 37824168, 48972292, 42486352, -3062849, -79568568, -149920128, -196602672, -214368256, +-144205680, 77959560, 347087040, 392520288, 92602720, -296709216, -393664896, -139867216, 160926512, 242814896, +146233968, 54702316, 31922882, 18806588, -16871168, -45679124, -50996296, -50842212, -54457500, -50628536, +-35736812, -20008642, -9170292, -780610, 5867462, 9701257, 12484933, 15276662, 15848429, 13904420, +12628278, 12879533, 12058658, 9613211, 7916699, 7660611, 7406671, 7144141, 8097087, 9909026, +11210938, 11767674, 11806328, 10767483, 8333311, 5125507, 1481227, -2884071, -7704635, -12288438, +-16731045, -21560198, -26567594, -31265752, -35827544, -40514428, -44970456, -48920216, -52687436, -56478820, +-60071560, -63505924, -67145368, -70923328, -74355008, -77193448, -79366160, -80595600, -80738408, -80030808, +-78453480, -75420160, -70591544, -64421288, -57504244, -49912352, -41438380, -32058710, -22058416, -12040941, +-2745021, 5396090, 12326556, 17893908, 21741662, 23833848, 24593520, 24358908, 23168664, 21221434, +19105088, 17416092, 16371342, 15782931, 15292768, 14787572, 14678051, 15534897, 17454210, 20044076, +22972170, 26204670, 29848948, 34091304, 39089036, 44647260, 50229644, 55514064, 60679296, 66076460, +71948216, 78428248, 85371600, 92261800, 98683320, 104746736, 110726944, 116595480, 122185912, 127372624, +131826504, 135100336, 137170512, 138383840, 138876160, 138605568, 137763760, 136496752, 134513008, 131615512, +128205312, 124721016, 121202368, 117805048, 114904336, 112378360, 109732120, 106923744, 104035920, 100594576, +96302832, 90974384, 82011328, 64709052, 38907036, 13247827, -1968169, -5075578, -2077154, }, { -2709588, --11341935, -24164022, -37824168, -48972292, -42486352, 3062849, 79568568, 149920128, 196602672, 214368256, -144205680, -77959560, -347087040, -392520288, -92602720, 296709216, 393664896, 139867216, -160926512, -242814896, --146233968, -54702316, -31922882, -18806588, 16871168, 45679124, 50996296, 50842212, 54457500, 50628536, -35736812, 20008642, 9170292, 780610, -5867462, -9701257, -12484933, -15276662, -15848429, -13904420, --12628278, -12879533, -12058658, -9613211, -7916699, -7660611, -7406671, -7144141, -8097087, -9909026, --11210938, -11767674, -11806328, -10767483, -8333311, -5125507, -1481227, 2884071, 7704635, 12288438, -16731045, 21560198, 26567594, 31265752, 35827544, 40514428, 44970456, 48920216, 52687436, 56478820, -60071560, 63505924, 67145368, 70923328, 74355008, 77193448, 79366160, 80595600, 80738408, 80030808, -78453480, 75420160, 70591544, 64421288, 57504244, 49912352, 41438380, 32058710, 22058416, 12040941, -2745021, -5396090, -12326556, -17893908, -21741662, -23833848, -24593520, -24358908, -23168664, -21221434, --19105088, -17416092, -16371342, -15782931, -15292768, -14787572, -14678051, -15534897, -17454210, -20044076, --22972170, -26204670, -29848948, -34091304, -39089036, -44647260, -50229644, -55514064, -60679296, -66076460, --71948216, -78428248, -85371600, -92261800, -98683320, -104746736, -110726944, -116595480, -122185912, -127372624, --131826504, -135100336, -137170512, -138383840, -138876160, -138605568, -137763760, -136496752, -134513008, -131615512, --128205312, -124721016, -121202368, -117805048, -114904336, -112378360, -109732120, -106923744, -104035920, -100594576, --96302832, -90974384, -82011328, -64709052, -38907036, -13247827, 1968169, 5075578, 2077154, }, +-11341935, -24164022, -37824168, -48972292, -42486352, 3062849, 79568568, 149920128, 196602672, 214368256, +144205680, -77959560, -347087040, -392520288, -92602720, 296709216, 393664896, 139867216, -160926512, -242814896, +-146233968, -54702316, -31922882, -18806588, 16871168, 45679124, 50996296, 50842212, 54457500, 50628536, +35736812, 20008642, 9170292, 780610, -5867462, -9701257, -12484933, -15276662, -15848429, -13904420, +-12628278, -12879533, -12058658, -9613211, -7916699, -7660611, -7406671, -7144141, -8097087, -9909026, +-11210938, -11767674, -11806328, -10767483, -8333311, -5125507, -1481227, 2884071, 7704635, 12288438, +16731045, 21560198, 26567594, 31265752, 35827544, 40514428, 44970456, 48920216, 52687436, 56478820, +60071560, 63505924, 67145368, 70923328, 74355008, 77193448, 79366160, 80595600, 80738408, 80030808, +78453480, 75420160, 70591544, 64421288, 57504244, 49912352, 41438380, 32058710, 22058416, 12040941, +2745021, -5396090, -12326556, -17893908, -21741662, -23833848, -24593520, -24358908, -23168664, -21221434, +-19105088, -17416092, -16371342, -15782931, -15292768, -14787572, -14678051, -15534897, -17454210, -20044076, +-22972170, -26204670, -29848948, -34091304, -39089036, -44647260, -50229644, -55514064, -60679296, -66076460, +-71948216, -78428248, -85371600, -92261800, -98683320, -104746736, -110726944, -116595480, -122185912, -127372624, +-131826504, -135100336, -137170512, -138383840, -138876160, -138605568, -137763760, -136496752, -134513008, -131615512, +-128205312, -124721016, -121202368, -117805048, -114904336, -112378360, -109732120, -106923744, -104035920, -100594576, +-96302832, -90974384, -82011328, -64709052, -38907036, -13247827, 1968169, 5075578, 2077154, }, }, { { 1752347, -2318209, -3129421, -13364328, -22068078, -13906030, 23338316, 68938520, 71941240, 11290395, -61519500, --75093208, -26613228, 19918984, 22327388, 4521527, 2712272, 10649908, 3675955, -14254996, -20063402, --11353209, -6714108, -12883291, -16463683, -7989176, 4802847, 10709501, 8565775, 3003256, -3887482, --12086038, -20115480, -25625922, -27375584, -25383256, -20718922, -15309948, -10429254, -5472862, 678068, -7601555, 13700946, 17974976, 20415590, 21309480, 21220360, 21272436, 22553410, 25330106, 29222420, -33808372, 38672424, 43266428, 47165720, 50313396, 52808232, 54654532, 55847996, 56485264, 56649544, -56301116, 55363740, 53883048, 52083996, 50264004, 48584672, 47058884, 45802604, 45097156, 45042932, -45411764, 46103788, 47441672, 49701360, 52670256, 56014428, 59743532, 63888712, 68016176, 71476312, -73917464, 75246752, 75291848, 73703248, 69972536, 63533304, 54155780, 42167452, 27892592, 11008001, --9009768, -31874026, -56412784, -81407344, -106045960, -129645200, -151357328, -170186464, -185207040, -196040560, --203181488, -207441008, -209008672, -207558592, -203382800, -197860560, -192569696, -188201712, -184324432, -179907056, --174222672, -167572976, -161031216, -155325344, -150254592, -145263312, -140111504, -134852848, -129680632, -124933616, --120787904, -116880016, -112634440, -107862736, -102680320, -97099544, -91144576, -85032296, -78863656, -72510856, --66088272, -60015188, -54439248, -49138184, -44054016, -39272644, -34603476, -29887604, -25502978, -21810918, --18476412, -15020574, -11469173, -7778723, -3459059, 1539209, 6551436, 11398843, 16697759, 22694608, -29481192, 38444252, 50652696, 62598612, 66469452, 57299160, 38711076, 19604916, 5549098, }, +2318209, -3129421, -13364328, -22068078, -13906030, 23338316, 68938520, 71941240, 11290395, -61519500, +-75093208, -26613228, 19918984, 22327388, 4521527, 2712272, 10649908, 3675955, -14254996, -20063402, +-11353209, -6714108, -12883291, -16463683, -7989176, 4802847, 10709501, 8565775, 3003256, -3887482, +-12086038, -20115480, -25625922, -27375584, -25383256, -20718922, -15309948, -10429254, -5472862, 678068, +7601555, 13700946, 17974976, 20415590, 21309480, 21220360, 21272436, 22553410, 25330106, 29222420, +33808372, 38672424, 43266428, 47165720, 50313396, 52808232, 54654532, 55847996, 56485264, 56649544, +56301116, 55363740, 53883048, 52083996, 50264004, 48584672, 47058884, 45802604, 45097156, 45042932, +45411764, 46103788, 47441672, 49701360, 52670256, 56014428, 59743532, 63888712, 68016176, 71476312, +73917464, 75246752, 75291848, 73703248, 69972536, 63533304, 54155780, 42167452, 27892592, 11008001, +-9009768, -31874026, -56412784, -81407344, -106045960, -129645200, -151357328, -170186464, -185207040, -196040560, +-203181488, -207441008, -209008672, -207558592, -203382800, -197860560, -192569696, -188201712, -184324432, -179907056, +-174222672, -167572976, -161031216, -155325344, -150254592, -145263312, -140111504, -134852848, -129680632, -124933616, +-120787904, -116880016, -112634440, -107862736, -102680320, -97099544, -91144576, -85032296, -78863656, -72510856, +-66088272, -60015188, -54439248, -49138184, -44054016, -39272644, -34603476, -29887604, -25502978, -21810918, +-18476412, -15020574, -11469173, -7778723, -3459059, 1539209, 6551436, 11398843, 16697759, 22694608, +29481192, 38444252, 50652696, 62598612, 66469452, 57299160, 38711076, 19604916, 5549098, }, { -1752347, --2318209, 3129421, 13364328, 22068078, 13906030, -23338316, -68938520, -71941240, -11290395, 61519500, -75093208, 26613228, -19918984, -22327388, -4521527, -2712272, -10649908, -3675955, 14254996, 20063402, -11353209, 6714108, 12883291, 16463683, 7989176, -4802847, -10709501, -8565775, -3003256, 3887482, -12086038, 20115480, 25625922, 27375584, 25383256, 20718922, 15309948, 10429254, 5472862, -678068, --7601555, -13700946, -17974976, -20415590, -21309480, -21220360, -21272436, -22553410, -25330106, -29222420, --33808372, -38672424, -43266428, -47165720, -50313396, -52808232, -54654532, -55847996, -56485264, -56649544, --56301116, -55363740, -53883048, -52083996, -50264004, -48584672, -47058884, -45802604, -45097156, -45042932, --45411764, -46103788, -47441672, -49701360, -52670256, -56014428, -59743532, -63888712, -68016176, -71476312, --73917464, -75246752, -75291848, -73703248, -69972536, -63533304, -54155780, -42167452, -27892592, -11008001, -9009768, 31874026, 56412784, 81407344, 106045960, 129645200, 151357328, 170186464, 185207040, 196040560, -203181488, 207441008, 209008672, 207558592, 203382800, 197860560, 192569696, 188201712, 184324432, 179907056, -174222672, 167572976, 161031216, 155325344, 150254592, 145263312, 140111504, 134852848, 129680632, 124933616, -120787904, 116880016, 112634440, 107862736, 102680320, 97099544, 91144576, 85032296, 78863656, 72510856, -66088272, 60015188, 54439248, 49138184, 44054016, 39272644, 34603476, 29887604, 25502978, 21810918, -18476412, 15020574, 11469173, 7778723, 3459059, -1539209, -6551436, -11398843, -16697759, -22694608, --29481192, -38444252, -50652696, -62598612, -66469452, -57299160, -38711076, -19604916, -5549098, }, +-2318209, 3129421, 13364328, 22068078, 13906030, -23338316, -68938520, -71941240, -11290395, 61519500, +75093208, 26613228, -19918984, -22327388, -4521527, -2712272, -10649908, -3675955, 14254996, 20063402, +11353209, 6714108, 12883291, 16463683, 7989176, -4802847, -10709501, -8565775, -3003256, 3887482, +12086038, 20115480, 25625922, 27375584, 25383256, 20718922, 15309948, 10429254, 5472862, -678068, +-7601555, -13700946, -17974976, -20415590, -21309480, -21220360, -21272436, -22553410, -25330106, -29222420, +-33808372, -38672424, -43266428, -47165720, -50313396, -52808232, -54654532, -55847996, -56485264, -56649544, +-56301116, -55363740, -53883048, -52083996, -50264004, -48584672, -47058884, -45802604, -45097156, -45042932, +-45411764, -46103788, -47441672, -49701360, -52670256, -56014428, -59743532, -63888712, -68016176, -71476312, +-73917464, -75246752, -75291848, -73703248, -69972536, -63533304, -54155780, -42167452, -27892592, -11008001, +9009768, 31874026, 56412784, 81407344, 106045960, 129645200, 151357328, 170186464, 185207040, 196040560, +203181488, 207441008, 209008672, 207558592, 203382800, 197860560, 192569696, 188201712, 184324432, 179907056, +174222672, 167572976, 161031216, 155325344, 150254592, 145263312, 140111504, 134852848, 129680632, 124933616, +120787904, 116880016, 112634440, 107862736, 102680320, 97099544, 91144576, 85032296, 78863656, 72510856, +66088272, 60015188, 54439248, 49138184, 44054016, 39272644, 34603476, 29887604, 25502978, 21810918, +18476412, 15020574, 11469173, 7778723, 3459059, -1539209, -6551436, -11398843, -16697759, -22694608, +-29481192, -38444252, -50652696, -62598612, -66469452, -57299160, -38711076, -19604916, -5549098, }, }, { { 6022081, -17711372, 19808926, 5702106, -1069984, 26598732, 60575144, 30136174, -86081344, -207033536, -210641296, --51190104, 176310560, 291438752, 184795264, -56688200, -214403696, -161382320, 9672266, 114938696, 91175176, -20908974, -15001247, -22431004, -32042604, -34917012, -13038984, 17381196, 29633126, 25831544, 26075820, -37205156, 52308408, 67342936, 81734840, 91005528, 90618976, 82400024, 70903464, 57972396, 44236552, -31173410, 19136764, 6932077, -5563594, -17260400, -28190554, -39239896, -50185620, -60355564, -70269424, --80538688, -90162104, -97526896, -102055400, -103766408, -102488656, -98518496, -92877592, -86127520, -77828032, --67520104, -55291800, -41150620, -24761024, -6062347, 14438606, 35991288, 57763016, 78866336, 98627480, -116608896, 132132520, 144197088, 152177664, 156192928, 156476400, 152789168, 144825216, 132918504, 117959664, -100683696, 81301584, 59863256, 36761700, 12690018, -11863773, -36840080, -62242128, -87801480, -113138032, --137922672, -161553040, -182911920, -200827840, -214623280, -223893968, -227962912, -226051648, -218062464, -204918800, --188054064, -168620960, -147109072, -123661776, -98896992, -74404400, -52142512, -33224256, -17482128, -4221416, -6915971, 15874736, 22513682, 26737782, 28529858, 28082106, 25817048, 22249004, 17916456, 13336410, -8747238, 3869229, -1880122, -8884140, -17067664, -25989920, -35050692, -43759276, -51981452, -59895468, --67640904, -75084616, -81900192, -87727392, -92288648, -95513096, -97520992, -98360656, -97869416, -95914136, --92604864, -88149368, -82709792, -76492296, -69763152, -62685048, -55346560, -47927540, -40649716, -33641940, --26855356, -19616726, -10412611, 1456531, 13294534, 19794430, 18117782, 11077258, 3459059, }, +17711372, 19808926, 5702106, -1069984, 26598732, 60575144, 30136174, -86081344, -207033536, -210641296, +-51190104, 176310560, 291438752, 184795264, -56688200, -214403696, -161382320, 9672266, 114938696, 91175176, +20908974, -15001247, -22431004, -32042604, -34917012, -13038984, 17381196, 29633126, 25831544, 26075820, +37205156, 52308408, 67342936, 81734840, 91005528, 90618976, 82400024, 70903464, 57972396, 44236552, +31173410, 19136764, 6932077, -5563594, -17260400, -28190554, -39239896, -50185620, -60355564, -70269424, +-80538688, -90162104, -97526896, -102055400, -103766408, -102488656, -98518496, -92877592, -86127520, -77828032, +-67520104, -55291800, -41150620, -24761024, -6062347, 14438606, 35991288, 57763016, 78866336, 98627480, +116608896, 132132520, 144197088, 152177664, 156192928, 156476400, 152789168, 144825216, 132918504, 117959664, +100683696, 81301584, 59863256, 36761700, 12690018, -11863773, -36840080, -62242128, -87801480, -113138032, +-137922672, -161553040, -182911920, -200827840, -214623280, -223893968, -227962912, -226051648, -218062464, -204918800, +-188054064, -168620960, -147109072, -123661776, -98896992, -74404400, -52142512, -33224256, -17482128, -4221416, +6915971, 15874736, 22513682, 26737782, 28529858, 28082106, 25817048, 22249004, 17916456, 13336410, +8747238, 3869229, -1880122, -8884140, -17067664, -25989920, -35050692, -43759276, -51981452, -59895468, +-67640904, -75084616, -81900192, -87727392, -92288648, -95513096, -97520992, -98360656, -97869416, -95914136, +-92604864, -88149368, -82709792, -76492296, -69763152, -62685048, -55346560, -47927540, -40649716, -33641940, +-26855356, -19616726, -10412611, 1456531, 13294534, 19794430, 18117782, 11077258, 3459059, }, { -6022081, --17711372, -19808926, -5702106, 1069984, -26598732, -60575144, -30136174, 86081344, 207033536, 210641296, -51190104, -176310560, -291438752, -184795264, 56688200, 214403696, 161382320, -9672266, -114938696, -91175176, --20908974, 15001247, 22431004, 32042604, 34917012, 13038984, -17381196, -29633126, -25831544, -26075820, --37205156, -52308408, -67342936, -81734840, -91005528, -90618976, -82400024, -70903464, -57972396, -44236552, --31173410, -19136764, -6932077, 5563594, 17260400, 28190554, 39239896, 50185620, 60355564, 70269424, -80538688, 90162104, 97526896, 102055400, 103766408, 102488656, 98518496, 92877592, 86127520, 77828032, -67520104, 55291800, 41150620, 24761024, 6062347, -14438606, -35991288, -57763016, -78866336, -98627480, --116608896, -132132520, -144197088, -152177664, -156192928, -156476400, -152789168, -144825216, -132918504, -117959664, --100683696, -81301584, -59863256, -36761700, -12690018, 11863773, 36840080, 62242128, 87801480, 113138032, -137922672, 161553040, 182911920, 200827840, 214623280, 223893968, 227962912, 226051648, 218062464, 204918800, -188054064, 168620960, 147109072, 123661776, 98896992, 74404400, 52142512, 33224256, 17482128, 4221416, --6915971, -15874736, -22513682, -26737782, -28529858, -28082106, -25817048, -22249004, -17916456, -13336410, --8747238, -3869229, 1880122, 8884140, 17067664, 25989920, 35050692, 43759276, 51981452, 59895468, -67640904, 75084616, 81900192, 87727392, 92288648, 95513096, 97520992, 98360656, 97869416, 95914136, -92604864, 88149368, 82709792, 76492296, 69763152, 62685048, 55346560, 47927540, 40649716, 33641940, -26855356, 19616726, 10412611, -1456531, -13294534, -19794430, -18117782, -11077258, -3459059, }, +-17711372, -19808926, -5702106, 1069984, -26598732, -60575144, -30136174, 86081344, 207033536, 210641296, +51190104, -176310560, -291438752, -184795264, 56688200, 214403696, 161382320, -9672266, -114938696, -91175176, +-20908974, 15001247, 22431004, 32042604, 34917012, 13038984, -17381196, -29633126, -25831544, -26075820, +-37205156, -52308408, -67342936, -81734840, -91005528, -90618976, -82400024, -70903464, -57972396, -44236552, +-31173410, -19136764, -6932077, 5563594, 17260400, 28190554, 39239896, 50185620, 60355564, 70269424, +80538688, 90162104, 97526896, 102055400, 103766408, 102488656, 98518496, 92877592, 86127520, 77828032, +67520104, 55291800, 41150620, 24761024, 6062347, -14438606, -35991288, -57763016, -78866336, -98627480, +-116608896, -132132520, -144197088, -152177664, -156192928, -156476400, -152789168, -144825216, -132918504, -117959664, +-100683696, -81301584, -59863256, -36761700, -12690018, 11863773, 36840080, 62242128, 87801480, 113138032, +137922672, 161553040, 182911920, 200827840, 214623280, 223893968, 227962912, 226051648, 218062464, 204918800, +188054064, 168620960, 147109072, 123661776, 98896992, 74404400, 52142512, 33224256, 17482128, 4221416, +-6915971, -15874736, -22513682, -26737782, -28529858, -28082106, -25817048, -22249004, -17916456, -13336410, +-8747238, -3869229, 1880122, 8884140, 17067664, 25989920, 35050692, 43759276, 51981452, 59895468, +67640904, 75084616, 81900192, 87727392, 92288648, 95513096, 97520992, 98360656, 97869416, 95914136, +92604864, 88149368, 82709792, 76492296, 69763152, 62685048, 55346560, 47927540, 40649716, 33641940, +26855356, 19616726, 10412611, -1456531, -13294534, -19794430, -18117782, -11077258, -3459059, }, }, { { 44560, -2703682, 9866077, 17234630, 17793512, 7589207, -12143483, -35052840, -48142824, -35460324, 5149129, -48207788, 57437136, 24556476, -18523120, -35033512, -21419538, 41876, 15292231, 27706834, 38851200, -40580460, 29954712, 16558173, 8228621, 3758, -16033113, -37292664, -53191560, -56425668, -47314972, --30891552, -13847511, -1938641, 3282429, 4975183, 7279433, 11693585, 16974248, 21048560, 22660248, -22146998, 20931524, 20030116, 19392852, 18677740, 17743584, 16189879, 13386876, 9232032, 4176856, --1509681, -7846905, -14711874, -21900038, -29304024, -36559300, -42951284, -48014512, -51728048, -54012436, --54712516, -54047332, -52337936, -49394808, -44904420, -39068096, -32057100, -23302882, -12154221, 1221918, -16305843, 32928978, 50787988, 68921880, 86341728, 102611600, 117358368, 129918464, 139881184, 147379120, -152497104, 154865248, 154043296, 149988848, 143081472, 133786624, 122117728, 107490144, 89568856, 69164008, -47685948, 25841744, 3575024, -18859202, -40482752, -60081760, -76539536, -89067424, -97762048, -103586024, --107260904, -108474232, -106427144, -100741680, -91825864, -80963352, -69916160, -59686624, -49751292, -39126616, --27851252, -16859358, -6990060, 1244467, 7595113, 12449500, 16635482, 20393042, 23147726, 24417962, -24137180, 22142168, 18325552, 13180718, 7290707, 540092, -7393786, -16309601, -25978646, -36615668, --48160544, -59928216, -71496176, -83015816, -94371168, -105088720, -115143776, -124732832, -133423160, -140608640, --146365504, -150849984, -153621856, -154467968, -153848944, -151803472, -147736672, -141726400, -134540384, -126354176, --116902568, -105653512, -89784680, -65000572, -32832340, -4391067, 9228811, 8695698, 2960843, }, +2703682, 9866077, 17234630, 17793512, 7589207, -12143483, -35052840, -48142824, -35460324, 5149129, +48207788, 57437136, 24556476, -18523120, -35033512, -21419538, 41876, 15292231, 27706834, 38851200, +40580460, 29954712, 16558173, 8228621, 3758, -16033113, -37292664, -53191560, -56425668, -47314972, +-30891552, -13847511, -1938641, 3282429, 4975183, 7279433, 11693585, 16974248, 21048560, 22660248, +22146998, 20931524, 20030116, 19392852, 18677740, 17743584, 16189879, 13386876, 9232032, 4176856, +-1509681, -7846905, -14711874, -21900038, -29304024, -36559300, -42951284, -48014512, -51728048, -54012436, +-54712516, -54047332, -52337936, -49394808, -44904420, -39068096, -32057100, -23302882, -12154221, 1221918, +16305843, 32928978, 50787988, 68921880, 86341728, 102611600, 117358368, 129918464, 139881184, 147379120, +152497104, 154865248, 154043296, 149988848, 143081472, 133786624, 122117728, 107490144, 89568856, 69164008, +47685948, 25841744, 3575024, -18859202, -40482752, -60081760, -76539536, -89067424, -97762048, -103586024, +-107260904, -108474232, -106427144, -100741680, -91825864, -80963352, -69916160, -59686624, -49751292, -39126616, +-27851252, -16859358, -6990060, 1244467, 7595113, 12449500, 16635482, 20393042, 23147726, 24417962, +24137180, 22142168, 18325552, 13180718, 7290707, 540092, -7393786, -16309601, -25978646, -36615668, +-48160544, -59928216, -71496176, -83015816, -94371168, -105088720, -115143776, -124732832, -133423160, -140608640, +-146365504, -150849984, -153621856, -154467968, -153848944, -151803472, -147736672, -141726400, -134540384, -126354176, +-116902568, -105653512, -89784680, -65000572, -32832340, -4391067, 9228811, 8695698, 2960843, }, { 44560, -2703682, 9866077, 17234630, 17793512, 7589207, -12143483, -35052840, -48142824, -35460324, 5149129, -48207788, 57437136, 24556476, -18523120, -35033512, -21419538, 41876, 15292231, 27706834, 38851200, -40580460, 29954712, 16558173, 8228621, 3758, -16033113, -37292664, -53191560, -56425668, -47314972, --30891552, -13847511, -1938641, 3282429, 4975183, 7279433, 11693585, 16974248, 21048560, 22660248, -22146998, 20931524, 20030116, 19392852, 18677740, 17743584, 16189879, 13386876, 9232032, 4176856, --1509681, -7846905, -14711874, -21900038, -29304024, -36559300, -42951284, -48014512, -51728048, -54012436, --54712516, -54047332, -52337936, -49394808, -44904420, -39068096, -32057100, -23302882, -12154221, 1221918, -16305843, 32928978, 50787988, 68921880, 86341728, 102611600, 117358368, 129918464, 139881184, 147379120, -152497104, 154865248, 154043296, 149988848, 143081472, 133786624, 122117728, 107490144, 89568856, 69164008, -47685948, 25841744, 3575024, -18859202, -40482752, -60081760, -76539536, -89067424, -97762048, -103586024, --107260904, -108474232, -106427144, -100741680, -91825864, -80963352, -69916160, -59686624, -49751292, -39126616, --27851252, -16859358, -6990060, 1244467, 7595113, 12449500, 16635482, 20393042, 23147726, 24417962, -24137180, 22142168, 18325552, 13180718, 7290707, 540092, -7393786, -16309601, -25978646, -36615668, --48160544, -59928216, -71496176, -83015816, -94371168, -105088720, -115143776, -124732832, -133423160, -140608640, --146365504, -150849984, -153621856, -154467968, -153848944, -151803472, -147736672, -141726400, -134540384, -126354176, --116902568, -105653512, -89784680, -65000572, -32832340, -4391067, 9228811, 8695698, 2960843, }, +2703682, 9866077, 17234630, 17793512, 7589207, -12143483, -35052840, -48142824, -35460324, 5149129, +48207788, 57437136, 24556476, -18523120, -35033512, -21419538, 41876, 15292231, 27706834, 38851200, +40580460, 29954712, 16558173, 8228621, 3758, -16033113, -37292664, -53191560, -56425668, -47314972, +-30891552, -13847511, -1938641, 3282429, 4975183, 7279433, 11693585, 16974248, 21048560, 22660248, +22146998, 20931524, 20030116, 19392852, 18677740, 17743584, 16189879, 13386876, 9232032, 4176856, +-1509681, -7846905, -14711874, -21900038, -29304024, -36559300, -42951284, -48014512, -51728048, -54012436, +-54712516, -54047332, -52337936, -49394808, -44904420, -39068096, -32057100, -23302882, -12154221, 1221918, +16305843, 32928978, 50787988, 68921880, 86341728, 102611600, 117358368, 129918464, 139881184, 147379120, +152497104, 154865248, 154043296, 149988848, 143081472, 133786624, 122117728, 107490144, 89568856, 69164008, +47685948, 25841744, 3575024, -18859202, -40482752, -60081760, -76539536, -89067424, -97762048, -103586024, +-107260904, -108474232, -106427144, -100741680, -91825864, -80963352, -69916160, -59686624, -49751292, -39126616, +-27851252, -16859358, -6990060, 1244467, 7595113, 12449500, 16635482, 20393042, 23147726, 24417962, +24137180, 22142168, 18325552, 13180718, 7290707, 540092, -7393786, -16309601, -25978646, -36615668, +-48160544, -59928216, -71496176, -83015816, -94371168, -105088720, -115143776, -124732832, -133423160, -140608640, +-146365504, -150849984, -153621856, -154467968, -153848944, -151803472, -147736672, -141726400, -134540384, -126354176, +-116902568, -105653512, -89784680, -65000572, -32832340, -4391067, 9228811, 8695698, 2960843, }, }, { { 1759326, -11070278, 25192130, 28666760, 14779519, -9762461, -40301824, -69774432, -71958952, -22061636, 57765700, -103101760, 74360376, 1267552, -52283712, -52460880, -14944876, 22100292, 29719026, 4831838, -28944858, --40509596, -19877646, 14618458, 39270496, 47271484, 45476724, 39869644, 32147294, 24026584, 16596291, -7829726, -4108136, -16990890, -27270894, -34506840, -40266392, -44603236, -46227808, -45040248, -42559368, --40435508, -39600672, -40327060, -42376832, -45249092, -48373680, -50870668, -51521892, -49539764, -45176612, --39297876, -32735704, -26308286, -20878372, -16865800, -13962402, -11606612, -9465034, -7307887, -4727686, --1206349, 3718905, 10382547, 18842022, 28738164, 39454644, 50397148, 60966524, 70414912, 78094856, -83916144, 88226144, 91133840, 92317640, 91731912, 90075664, 88051128, 85455888, 81696720, 77112376, -72987064, 70102992, 68074696, 66493608, 65974456, 67392872, 70428336, 73550240, 75418552, 75933952, -75894216, 75944152, 75982264, 75457208, 73991552, 71586904, 68410776, 64745560, 61116312, 58018028, -55267640, 51893404, 46910168, 40071508, 31758598, 22332220, 11759620, -209380, -13596793, -27944130, --42563124, -57054884, -71468256, -85903104, -100104416, -113471960, -125301376, -135047200, -142590224, -148284816, --152554016, -155416080, -156509680, -155479424, -152256048, -147157392, -140896400, -134246176, -127440808, -119999776, --111275624, -101080984, -89829240, -78299400, -67261336, -57073136, -47571056, -38373384, -29178398, -19800336, --10293426, -1107028, 7255274, 14736570, 21460878, 27151172, 31449362, 34608848, 37118180, 38982196, -40195524, 41229540, 41705208, 39342436, 32184874, 21709450, 11916387, 5348308, 1483911, }, +11070278, 25192130, 28666760, 14779519, -9762461, -40301824, -69774432, -71958952, -22061636, 57765700, +103101760, 74360376, 1267552, -52283712, -52460880, -14944876, 22100292, 29719026, 4831838, -28944858, +-40509596, -19877646, 14618458, 39270496, 47271484, 45476724, 39869644, 32147294, 24026584, 16596291, +7829726, -4108136, -16990890, -27270894, -34506840, -40266392, -44603236, -46227808, -45040248, -42559368, +-40435508, -39600672, -40327060, -42376832, -45249092, -48373680, -50870668, -51521892, -49539764, -45176612, +-39297876, -32735704, -26308286, -20878372, -16865800, -13962402, -11606612, -9465034, -7307887, -4727686, +-1206349, 3718905, 10382547, 18842022, 28738164, 39454644, 50397148, 60966524, 70414912, 78094856, +83916144, 88226144, 91133840, 92317640, 91731912, 90075664, 88051128, 85455888, 81696720, 77112376, +72987064, 70102992, 68074696, 66493608, 65974456, 67392872, 70428336, 73550240, 75418552, 75933952, +75894216, 75944152, 75982264, 75457208, 73991552, 71586904, 68410776, 64745560, 61116312, 58018028, +55267640, 51893404, 46910168, 40071508, 31758598, 22332220, 11759620, -209380, -13596793, -27944130, +-42563124, -57054884, -71468256, -85903104, -100104416, -113471960, -125301376, -135047200, -142590224, -148284816, +-152554016, -155416080, -156509680, -155479424, -152256048, -147157392, -140896400, -134246176, -127440808, -119999776, +-111275624, -101080984, -89829240, -78299400, -67261336, -57073136, -47571056, -38373384, -29178398, -19800336, +-10293426, -1107028, 7255274, 14736570, 21460878, 27151172, 31449362, 34608848, 37118180, 38982196, +40195524, 41229540, 41705208, 39342436, 32184874, 21709450, 11916387, 5348308, 1483911, }, { 1759326, -11070278, 25192130, 28666760, 14779519, -9762461, -40301824, -69774432, -71958952, -22061636, 57765700, -103101760, 74360376, 1267552, -52283712, -52460880, -14944876, 22100292, 29719026, 4831838, -28944858, --40509596, -19877646, 14618458, 39270496, 47271484, 45476724, 39869644, 32147294, 24026584, 16596291, -7829726, -4108136, -16990890, -27270894, -34506840, -40266392, -44603236, -46227808, -45040248, -42559368, --40435508, -39600672, -40327060, -42376832, -45249092, -48373680, -50870668, -51521892, -49539764, -45176612, --39297876, -32735704, -26308286, -20878372, -16865800, -13962402, -11606612, -9465034, -7307887, -4727686, --1206349, 3718905, 10382547, 18842022, 28738164, 39454644, 50397148, 60966524, 70414912, 78094856, -83916144, 88226144, 91133840, 92317640, 91731912, 90075664, 88051128, 85455888, 81696720, 77112376, -72987064, 70102992, 68074696, 66493608, 65974456, 67392872, 70428336, 73550240, 75418552, 75933952, -75894216, 75944152, 75982264, 75457208, 73991552, 71586904, 68410776, 64745560, 61116312, 58018028, -55267640, 51893404, 46910168, 40071508, 31758598, 22332220, 11759620, -209380, -13596793, -27944130, --42563124, -57054884, -71468256, -85903104, -100104416, -113471960, -125301376, -135047200, -142590224, -148284816, --152554016, -155416080, -156509680, -155479424, -152256048, -147157392, -140896400, -134246176, -127440808, -119999776, --111275624, -101080984, -89829240, -78299400, -67261336, -57073136, -47571056, -38373384, -29178398, -19800336, --10293426, -1107028, 7255274, 14736570, 21460878, 27151172, 31449362, 34608848, 37118180, 38982196, -40195524, 41229540, 41705208, 39342436, 32184874, 21709450, 11916387, 5348308, 1483911, }, +11070278, 25192130, 28666760, 14779519, -9762461, -40301824, -69774432, -71958952, -22061636, 57765700, +103101760, 74360376, 1267552, -52283712, -52460880, -14944876, 22100292, 29719026, 4831838, -28944858, +-40509596, -19877646, 14618458, 39270496, 47271484, 45476724, 39869644, 32147294, 24026584, 16596291, +7829726, -4108136, -16990890, -27270894, -34506840, -40266392, -44603236, -46227808, -45040248, -42559368, +-40435508, -39600672, -40327060, -42376832, -45249092, -48373680, -50870668, -51521892, -49539764, -45176612, +-39297876, -32735704, -26308286, -20878372, -16865800, -13962402, -11606612, -9465034, -7307887, -4727686, +-1206349, 3718905, 10382547, 18842022, 28738164, 39454644, 50397148, 60966524, 70414912, 78094856, +83916144, 88226144, 91133840, 92317640, 91731912, 90075664, 88051128, 85455888, 81696720, 77112376, +72987064, 70102992, 68074696, 66493608, 65974456, 67392872, 70428336, 73550240, 75418552, 75933952, +75894216, 75944152, 75982264, 75457208, 73991552, 71586904, 68410776, 64745560, 61116312, 58018028, +55267640, 51893404, 46910168, 40071508, 31758598, 22332220, 11759620, -209380, -13596793, -27944130, +-42563124, -57054884, -71468256, -85903104, -100104416, -113471960, -125301376, -135047200, -142590224, -148284816, +-152554016, -155416080, -156509680, -155479424, -152256048, -147157392, -140896400, -134246176, -127440808, -119999776, +-111275624, -101080984, -89829240, -78299400, -67261336, -57073136, -47571056, -38373384, -29178398, -19800336, +-10293426, -1107028, 7255274, 14736570, 21460878, 27151172, 31449362, 34608848, 37118180, 38982196, +40195524, 41229540, 41705208, 39342436, 32184874, 21709450, 11916387, 5348308, 1483911, }, }, { { -4452271, --7500087, -3624416, -2251637, -519154, 14617921, 32093070, 12177306, -56947508, -114948360, -82408608, -34436512, 127896608, 103851232, -7760469, -89002456, -71117680, 912681, 44779328, 41342820, 32260574, -44262324, 56810608, 43316892, 9867687, -20316270, -39855148, -58272504, -80997176, -102027488, -113800528, --114110304, -104249592, -87111600, -67213016, -48554604, -32237488, -17758080, -5370857, 4229469, 10980084, -14884209, 15707769, 14190572, 12344273, 11856794, 13141526, 16093242, 20577726, 26002268, 31431644, -36322540, 40476308, 43420508, 44550084, 43748000, 41371808, 37846180, 33631204, 29341606, 25579752, -22799834, 21365314, 21520470, 23321672, 26781806, 31941672, 38691748, 46775952, 56064356, 66494684, -77703472, 89050240, 99985768, 110070888, 118769808, 125605784, 130366752, 132929776, 133261560, 131814160, -129377840, 126279016, 122268056, 117357832, 112035832, 106537736, 100799128, 95228016, 90406376, 85642184, -78858280, 68473592, 54687820, 38485592, 20015622, -1562831, -26934276, -55621972, -86015312, -116332944, --145534432, -173169856, -198556336, -220646432, -238789984, -253151280, -264224784, -272182272, -276668896, -277043104, --273021408, -265308720, -255301440, -243944480, -231167488, -216527552, -200001056, -182089440, -163630208, -145534432, --128217656, -111236968, -93836984, -75738528, -57142392, -38294464, -19366544, -416075, 18755048, 38290172, -57758184, 76446656, 94111864, 110891760, 126710128, 141369920, 154847536, 166826736, 176450144, 183179280, -187335744, 189352768, 189299616, 187444720, 184237456, 179489904, 172672176, 163960912, 153935392, 142774384, -130659344, 117202680, 99061808, 71684080, 37193880, 7276749, -7205882, -7443715, -2540473, }, +-7500087, -3624416, -2251637, -519154, 14617921, 32093070, 12177306, -56947508, -114948360, -82408608, +34436512, 127896608, 103851232, -7760469, -89002456, -71117680, 912681, 44779328, 41342820, 32260574, +44262324, 56810608, 43316892, 9867687, -20316270, -39855148, -58272504, -80997176, -102027488, -113800528, +-114110304, -104249592, -87111600, -67213016, -48554604, -32237488, -17758080, -5370857, 4229469, 10980084, +14884209, 15707769, 14190572, 12344273, 11856794, 13141526, 16093242, 20577726, 26002268, 31431644, +36322540, 40476308, 43420508, 44550084, 43748000, 41371808, 37846180, 33631204, 29341606, 25579752, +22799834, 21365314, 21520470, 23321672, 26781806, 31941672, 38691748, 46775952, 56064356, 66494684, +77703472, 89050240, 99985768, 110070888, 118769808, 125605784, 130366752, 132929776, 133261560, 131814160, +129377840, 126279016, 122268056, 117357832, 112035832, 106537736, 100799128, 95228016, 90406376, 85642184, +78858280, 68473592, 54687820, 38485592, 20015622, -1562831, -26934276, -55621972, -86015312, -116332944, +-145534432, -173169856, -198556336, -220646432, -238789984, -253151280, -264224784, -272182272, -276668896, -277043104, +-273021408, -265308720, -255301440, -243944480, -231167488, -216527552, -200001056, -182089440, -163630208, -145534432, +-128217656, -111236968, -93836984, -75738528, -57142392, -38294464, -19366544, -416075, 18755048, 38290172, +57758184, 76446656, 94111864, 110891760, 126710128, 141369920, 154847536, 166826736, 176450144, 183179280, +187335744, 189352768, 189299616, 187444720, 184237456, 179489904, 172672176, 163960912, 153935392, 142774384, +130659344, 117202680, 99061808, 71684080, 37193880, 7276749, -7205882, -7443715, -2540473, }, { -4452271, --7500087, -3624416, -2251637, -519154, 14617921, 32093070, 12177306, -56947508, -114948360, -82408608, -34436512, 127896608, 103851232, -7760469, -89002456, -71117680, 912681, 44779328, 41342820, 32260574, -44262324, 56810608, 43316892, 9867687, -20316270, -39855148, -58272504, -80997176, -102027488, -113800528, --114110304, -104249592, -87111600, -67213016, -48554604, -32237488, -17758080, -5370857, 4229469, 10980084, -14884209, 15707769, 14190572, 12344273, 11856794, 13141526, 16093242, 20577726, 26002268, 31431644, -36322540, 40476308, 43420508, 44550084, 43748000, 41371808, 37846180, 33631204, 29341606, 25579752, -22799834, 21365314, 21520470, 23321672, 26781806, 31941672, 38691748, 46775952, 56064356, 66494684, -77703472, 89050240, 99985768, 110070888, 118769808, 125605784, 130366752, 132929776, 133261560, 131814160, -129377840, 126279016, 122268056, 117357832, 112035832, 106537736, 100799128, 95228016, 90406376, 85642184, -78858280, 68473592, 54687820, 38485592, 20015622, -1562831, -26934276, -55621972, -86015312, -116332944, --145534432, -173169856, -198556336, -220646432, -238789984, -253151280, -264224784, -272182272, -276668896, -277043104, --273021408, -265308720, -255301440, -243944480, -231167488, -216527552, -200001056, -182089440, -163630208, -145534432, --128217656, -111236968, -93836984, -75738528, -57142392, -38294464, -19366544, -416075, 18755048, 38290172, -57758184, 76446656, 94111864, 110891760, 126710128, 141369920, 154847536, 166826736, 176450144, 183179280, -187335744, 189352768, 189299616, 187444720, 184237456, 179489904, 172672176, 163960912, 153935392, 142774384, -130659344, 117202680, 99061808, 71684080, 37193880, 7276749, -7205882, -7443715, -2540473, }, +-7500087, -3624416, -2251637, -519154, 14617921, 32093070, 12177306, -56947508, -114948360, -82408608, +34436512, 127896608, 103851232, -7760469, -89002456, -71117680, 912681, 44779328, 41342820, 32260574, +44262324, 56810608, 43316892, 9867687, -20316270, -39855148, -58272504, -80997176, -102027488, -113800528, +-114110304, -104249592, -87111600, -67213016, -48554604, -32237488, -17758080, -5370857, 4229469, 10980084, +14884209, 15707769, 14190572, 12344273, 11856794, 13141526, 16093242, 20577726, 26002268, 31431644, +36322540, 40476308, 43420508, 44550084, 43748000, 41371808, 37846180, 33631204, 29341606, 25579752, +22799834, 21365314, 21520470, 23321672, 26781806, 31941672, 38691748, 46775952, 56064356, 66494684, +77703472, 89050240, 99985768, 110070888, 118769808, 125605784, 130366752, 132929776, 133261560, 131814160, +129377840, 126279016, 122268056, 117357832, 112035832, 106537736, 100799128, 95228016, 90406376, 85642184, +78858280, 68473592, 54687820, 38485592, 20015622, -1562831, -26934276, -55621972, -86015312, -116332944, +-145534432, -173169856, -198556336, -220646432, -238789984, -253151280, -264224784, -272182272, -276668896, -277043104, +-273021408, -265308720, -255301440, -243944480, -231167488, -216527552, -200001056, -182089440, -163630208, -145534432, +-128217656, -111236968, -93836984, -75738528, -57142392, -38294464, -19366544, -416075, 18755048, 38290172, +57758184, 76446656, 94111864, 110891760, 126710128, 141369920, 154847536, 166826736, 176450144, 183179280, +187335744, 189352768, 189299616, 187444720, 184237456, 179489904, 172672176, 163960912, 153935392, 142774384, +130659344, 117202680, 99061808, 71684080, 37193880, 7276749, -7205882, -7443715, -2540473, }, }, { { 95026, -121333, -286689, -1526861, -3704409, -4636417, -490163, 6609955, 3957812, -16376173, -34094524, --12255152, 49355080, 89414776, 47789564, -48562660, -100550016, -52124260, 41663868, 84414896, 49460308, --8843338, -35082904, -25318832, -3728032, 15545634, 30092152, 35791572, 28868622, 13333726, -3234647, --17113834, -27649388, -34395708, -38820060, -44844292, -54616952, -66028680, -75620416, -81532440, -83032992, --79790288, -72682120, -63753956, -54773180, -46706160, -40330816, -36155572, -33837364, -32576254, -31920734, --31610422, -31074088, -29732984, -27550068, -24888262, -22152904, -19811074, -18334142, -17840220, -18063558, --18738942, -19659140, -20390894, -20398948, -19520090, -17939004, -15714212, -12709345, -8958228, -4674535, -82141, 5354751, 10898480, 16254841, 21288542, 26264798, 31280246, 35985384, 40132176, 44128640, -48680768, 53914188, 59191092, 63964948, 68518152, 73470248, 78630112, 82803208, 84906136, 84932976, -83589728, 81289232, 77855944, 73096584, 67385888, 61640832, 56737592, 52874268, 49592912, 46602544, -44493712, 44381508, 46887084, 51655036, 57703424, 64018636, 70019240, 75797584, 81821272, 88200376, -94386200, 99693704, 103846400, 106935560, 109211352, 111065168, 112856712, 114575768, 115938344, 116819888, -117329920, 117506008, 117264416, 116545552, 115250616, 113193328, 110393544, 107202920, 103961832, 100808248, -97913440, 95516848, 93628680, 92104496, 91001232, 90433224, 90185720, 89945208, 89672472, 89262840, -88194472, 86022288, 82761872, 78343960, 72357312, 64792804, 56205552, 46743204, 36020280, 24197308, -11628087, -2854006, -20797842, -39668316, -51709260, -50203336, -36630704, -19493246, -5658620, }, +121333, -286689, -1526861, -3704409, -4636417, -490163, 6609955, 3957812, -16376173, -34094524, +-12255152, 49355080, 89414776, 47789564, -48562660, -100550016, -52124260, 41663868, 84414896, 49460308, +-8843338, -35082904, -25318832, -3728032, 15545634, 30092152, 35791572, 28868622, 13333726, -3234647, +-17113834, -27649388, -34395708, -38820060, -44844292, -54616952, -66028680, -75620416, -81532440, -83032992, +-79790288, -72682120, -63753956, -54773180, -46706160, -40330816, -36155572, -33837364, -32576254, -31920734, +-31610422, -31074088, -29732984, -27550068, -24888262, -22152904, -19811074, -18334142, -17840220, -18063558, +-18738942, -19659140, -20390894, -20398948, -19520090, -17939004, -15714212, -12709345, -8958228, -4674535, +82141, 5354751, 10898480, 16254841, 21288542, 26264798, 31280246, 35985384, 40132176, 44128640, +48680768, 53914188, 59191092, 63964948, 68518152, 73470248, 78630112, 82803208, 84906136, 84932976, +83589728, 81289232, 77855944, 73096584, 67385888, 61640832, 56737592, 52874268, 49592912, 46602544, +44493712, 44381508, 46887084, 51655036, 57703424, 64018636, 70019240, 75797584, 81821272, 88200376, +94386200, 99693704, 103846400, 106935560, 109211352, 111065168, 112856712, 114575768, 115938344, 116819888, +117329920, 117506008, 117264416, 116545552, 115250616, 113193328, 110393544, 107202920, 103961832, 100808248, +97913440, 95516848, 93628680, 92104496, 91001232, 90433224, 90185720, 89945208, 89672472, 89262840, +88194472, 86022288, 82761872, 78343960, 72357312, 64792804, 56205552, 46743204, 36020280, 24197308, +11628087, -2854006, -20797842, -39668316, -51709260, -50203336, -36630704, -19493246, -5658620, }, { 95026, -121333, -286689, -1526861, -3704409, -4636417, -490163, 6609955, 3957812, -16376173, -34094524, --12255152, 49355080, 89414776, 47789564, -48562660, -100550016, -52124260, 41663868, 84414896, 49460308, --8843338, -35082904, -25318832, -3728032, 15545634, 30092152, 35791572, 28868622, 13333726, -3234647, --17113834, -27649388, -34395708, -38820060, -44844292, -54616952, -66028680, -75620416, -81532440, -83032992, --79790288, -72682120, -63753956, -54773180, -46706160, -40330816, -36155572, -33837364, -32576254, -31920734, --31610422, -31074088, -29732984, -27550068, -24888262, -22152904, -19811074, -18334142, -17840220, -18063558, --18738942, -19659140, -20390894, -20398948, -19520090, -17939004, -15714212, -12709345, -8958228, -4674535, -82141, 5354751, 10898480, 16254841, 21288542, 26264798, 31280246, 35985384, 40132176, 44128640, -48680768, 53914188, 59191092, 63964948, 68518152, 73470248, 78630112, 82803208, 84906136, 84932976, -83589728, 81289232, 77855944, 73096584, 67385888, 61640832, 56737592, 52874268, 49592912, 46602544, -44493712, 44381508, 46887084, 51655036, 57703424, 64018636, 70019240, 75797584, 81821272, 88200376, -94386200, 99693704, 103846400, 106935560, 109211352, 111065168, 112856712, 114575768, 115938344, 116819888, -117329920, 117506008, 117264416, 116545552, 115250616, 113193328, 110393544, 107202920, 103961832, 100808248, -97913440, 95516848, 93628680, 92104496, 91001232, 90433224, 90185720, 89945208, 89672472, 89262840, -88194472, 86022288, 82761872, 78343960, 72357312, 64792804, 56205552, 46743204, 36020280, 24197308, -11628087, -2854006, -20797842, -39668316, -51709260, -50203336, -36630704, -19493246, -5658620, }, +121333, -286689, -1526861, -3704409, -4636417, -490163, 6609955, 3957812, -16376173, -34094524, +-12255152, 49355080, 89414776, 47789564, -48562660, -100550016, -52124260, 41663868, 84414896, 49460308, +-8843338, -35082904, -25318832, -3728032, 15545634, 30092152, 35791572, 28868622, 13333726, -3234647, +-17113834, -27649388, -34395708, -38820060, -44844292, -54616952, -66028680, -75620416, -81532440, -83032992, +-79790288, -72682120, -63753956, -54773180, -46706160, -40330816, -36155572, -33837364, -32576254, -31920734, +-31610422, -31074088, -29732984, -27550068, -24888262, -22152904, -19811074, -18334142, -17840220, -18063558, +-18738942, -19659140, -20390894, -20398948, -19520090, -17939004, -15714212, -12709345, -8958228, -4674535, +82141, 5354751, 10898480, 16254841, 21288542, 26264798, 31280246, 35985384, 40132176, 44128640, +48680768, 53914188, 59191092, 63964948, 68518152, 73470248, 78630112, 82803208, 84906136, 84932976, +83589728, 81289232, 77855944, 73096584, 67385888, 61640832, 56737592, 52874268, 49592912, 46602544, +44493712, 44381508, 46887084, 51655036, 57703424, 64018636, 70019240, 75797584, 81821272, 88200376, +94386200, 99693704, 103846400, 106935560, 109211352, 111065168, 112856712, 114575768, 115938344, 116819888, +117329920, 117506008, 117264416, 116545552, 115250616, 113193328, 110393544, 107202920, 103961832, 100808248, +97913440, 95516848, 93628680, 92104496, 91001232, 90433224, 90185720, 89945208, 89672472, 89262840, +88194472, 86022288, 82761872, 78343960, 72357312, 64792804, 56205552, 46743204, 36020280, 24197308, +11628087, -2854006, -20797842, -39668316, -51709260, -50203336, -36630704, -19493246, -5658620, }, }, }; const Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 474517120, -393749184, 262211504, 117985432, -10480794, -110985712, -191049280, -267038512, -336338368, -371476032, -353389376, --287532480, -171644080, 6297496, 192329712, 242526608, 72079216, -182587648, -260212208, -67530848, 209416704, -328129600, 241918320, 74428024, -73858944, -198710960, -313772064, -400587296, -445658688, -464703104, -473818656, --471214272, -454585792, -431268416, -406896608, -380733280, -352922304, -325544576, -298700480, -272249376, -247473328, --223824160, -199292928, -174677936, -151928560, -129886256, -107092328, -85339392, -65715684, -46066208, -25864294, --7434589, 9564355, 27704150, 45774152, 60977260, 75160856, 90906208, 105588016, 117123224, 129179728, -143516336, 155936848, 165762656, 178110144, 192645392, 203760224, 213555968, 228452528, 244631680, 255759392, -268987904, 291244960, 312113664, 327424160, 358783328, 411108896, 436517376, 395435488, 333884864, }, +393749184, 262211504, 117985432, -10480794, -110985712, -191049280, -267038512, -336338368, -371476032, -353389376, +-287532480, -171644080, 6297496, 192329712, 242526608, 72079216, -182587648, -260212208, -67530848, 209416704, +328129600, 241918320, 74428024, -73858944, -198710960, -313772064, -400587296, -445658688, -464703104, -473818656, +-471214272, -454585792, -431268416, -406896608, -380733280, -352922304, -325544576, -298700480, -272249376, -247473328, +-223824160, -199292928, -174677936, -151928560, -129886256, -107092328, -85339392, -65715684, -46066208, -25864294, +-7434589, 9564355, 27704150, 45774152, 60977260, 75160856, 90906208, 105588016, 117123224, 129179728, +143516336, 155936848, 165762656, 178110144, 192645392, 203760224, 213555968, 228452528, 244631680, 255759392, +268987904, 291244960, 312113664, 327424160, 358783328, 411108896, 436517376, 395435488, 333884864, }, { 474517120, -393749184, 262211504, 117985432, -10480794, -110985712, -191049280, -267038512, -336338368, -371476032, -353389376, --287532480, -171644080, 6297496, 192329712, 242526608, 72079216, -182587648, -260212208, -67530848, 209416704, -328129600, 241918320, 74428024, -73858944, -198710960, -313772064, -400587296, -445658688, -464703104, -473818656, --471214272, -454585792, -431268416, -406896608, -380733280, -352922304, -325544576, -298700480, -272249376, -247473328, --223824160, -199292928, -174677936, -151928560, -129886256, -107092328, -85339392, -65715684, -46066208, -25864294, --7434589, 9564355, 27704150, 45774152, 60977260, 75160856, 90906208, 105588016, 117123224, 129179728, -143516336, 155936848, 165762656, 178110144, 192645392, 203760224, 213555968, 228452528, 244631680, 255759392, -268987904, 291244960, 312113664, 327424160, 358783328, 411108896, 436517376, 395435488, 333884864, }, +393749184, 262211504, 117985432, -10480794, -110985712, -191049280, -267038512, -336338368, -371476032, -353389376, +-287532480, -171644080, 6297496, 192329712, 242526608, 72079216, -182587648, -260212208, -67530848, 209416704, +328129600, 241918320, 74428024, -73858944, -198710960, -313772064, -400587296, -445658688, -464703104, -473818656, +-471214272, -454585792, -431268416, -406896608, -380733280, -352922304, -325544576, -298700480, -272249376, -247473328, +-223824160, -199292928, -174677936, -151928560, -129886256, -107092328, -85339392, -65715684, -46066208, -25864294, +-7434589, 9564355, 27704150, 45774152, 60977260, 75160856, 90906208, 105588016, 117123224, 129179728, +143516336, 155936848, 165762656, 178110144, 192645392, 203760224, 213555968, 228452528, 244631680, 255759392, +268987904, 291244960, 312113664, 327424160, 358783328, 411108896, 436517376, 395435488, 333884864, }, }, { { -14667313, -109007344, 300884480, 459067584, 490658688, 373444736, 147811296, -130092952, -394527104, -569486336, -623482688, --591592576, -477895648, -203745728, 216717072, 505419936, 342454912, -187842000, -574587712, -431045056, 74300248, -468669504, 522579424, 375879424, 221147872, 87966832, -57102128, -187308352, -264547968, -307544352, -350313088, --389952416, -411228608, -420155712, -428318304, -433704192, -432025376, -426204096, -417957216, -405028288, -387838784, --368521600, -346348320, -320995104, -295042784, -269352960, -242227568, -214230816, -187539216, -161874096, -136570304, --113043000, -91045792, -67981280, -44285944, -22613540, -1644436, 21249350, 43590696, 62576600, 81269912, -101752608, 119903672, 134431936, 150395792, 167950944, 181327072, 192286752, 207711600, 223999728, 234186848, -245695216, 266763632, 286735232, 300152192, 330441376, 387059776, 423103136, 394020288, 339865056, }, +109007344, 300884480, 459067584, 490658688, 373444736, 147811296, -130092952, -394527104, -569486336, -623482688, +-591592576, -477895648, -203745728, 216717072, 505419936, 342454912, -187842000, -574587712, -431045056, 74300248, +468669504, 522579424, 375879424, 221147872, 87966832, -57102128, -187308352, -264547968, -307544352, -350313088, +-389952416, -411228608, -420155712, -428318304, -433704192, -432025376, -426204096, -417957216, -405028288, -387838784, +-368521600, -346348320, -320995104, -295042784, -269352960, -242227568, -214230816, -187539216, -161874096, -136570304, +-113043000, -91045792, -67981280, -44285944, -22613540, -1644436, 21249350, 43590696, 62576600, 81269912, +101752608, 119903672, 134431936, 150395792, 167950944, 181327072, 192286752, 207711600, 223999728, 234186848, +245695216, 266763632, 286735232, 300152192, 330441376, 387059776, 423103136, 394020288, 339865056, }, { 14667313, --109007344, -300884480, -459067584, -490658688, -373444736, -147811296, 130092952, 394527104, 569486336, 623482688, -591592576, 477895648, 203745728, -216717072, -505419936, -342454912, 187842000, 574587712, 431045056, -74300248, --468669504, -522579424, -375879424, -221147872, -87966832, 57102128, 187308352, 264547968, 307544352, 350313088, -389952416, 411228608, 420155712, 428318304, 433704192, 432025376, 426204096, 417957216, 405028288, 387838784, -368521600, 346348320, 320995104, 295042784, 269352960, 242227568, 214230816, 187539216, 161874096, 136570304, -113043000, 91045792, 67981280, 44285944, 22613540, 1644436, -21249350, -43590696, -62576600, -81269912, --101752608, -119903672, -134431936, -150395792, -167950944, -181327072, -192286752, -207711600, -223999728, -234186848, --245695216, -266763632, -286735232, -300152192, -330441376, -387059776, -423103136, -394020288, -339865056, }, +-109007344, -300884480, -459067584, -490658688, -373444736, -147811296, 130092952, 394527104, 569486336, 623482688, +591592576, 477895648, 203745728, -216717072, -505419936, -342454912, 187842000, 574587712, 431045056, -74300248, +-468669504, -522579424, -375879424, -221147872, -87966832, 57102128, 187308352, 264547968, 307544352, 350313088, +389952416, 411228608, 420155712, 428318304, 433704192, 432025376, 426204096, 417957216, 405028288, 387838784, +368521600, 346348320, 320995104, 295042784, 269352960, 242227568, 214230816, 187539216, 161874096, 136570304, +113043000, 91045792, 67981280, 44285944, 22613540, 1644436, -21249350, -43590696, -62576600, -81269912, +-101752608, -119903672, -134431936, -150395792, -167950944, -181327072, -192286752, -207711600, -223999728, -234186848, +-245695216, -266763632, -286735232, -300152192, -330441376, -387059776, -423103136, -394020288, -339865056, }, }, { { 63584844, -61867932, 35822176, -16645683, -59343564, -56361784, -14022531, 29422136, 46156404, 36439040, 11818139, --18567680, -41300404, -36649492, 654446, 42820288, 47975860, 6956774, -37008124, -29559576, 33152852, -97268128, 110028472, 71801112, 21268678, -14348949, -36198520, -52268680, -63071056, -69157560, -74681968, --79523464, -79209936, -73945912, -68701760, -65478924, -63816772, -66236984, -74942888, -86210192, -95153928, --102194992, -109113104, -114073792, -115841176, -117046984, -118933016, -118941600, -116276576, -113024208, -108315320, --98741832, -84825608, -69585984, -51991116, -29500520, -4359929, 20286204, 46400680, 75974752, 105691096, -133309880, 162058240, 192782288, 220608304, 244149568, 267417008, 289217184, 303198400, 310272192, 316390368, -318068096, 307477248, 290040224, 275691808, 254662576, 207049104, 137422848, 75828184, 44052944, }, +61867932, 35822176, -16645683, -59343564, -56361784, -14022531, 29422136, 46156404, 36439040, 11818139, +-18567680, -41300404, -36649492, 654446, 42820288, 47975860, 6956774, -37008124, -29559576, 33152852, +97268128, 110028472, 71801112, 21268678, -14348949, -36198520, -52268680, -63071056, -69157560, -74681968, +-79523464, -79209936, -73945912, -68701760, -65478924, -63816772, -66236984, -74942888, -86210192, -95153928, +-102194992, -109113104, -114073792, -115841176, -117046984, -118933016, -118941600, -116276576, -113024208, -108315320, +-98741832, -84825608, -69585984, -51991116, -29500520, -4359929, 20286204, 46400680, 75974752, 105691096, +133309880, 162058240, 192782288, 220608304, 244149568, 267417008, 289217184, 303198400, 310272192, 316390368, +318068096, 307477248, 290040224, 275691808, 254662576, 207049104, 137422848, 75828184, 44052944, }, { 63584844, -61867932, 35822176, -16645683, -59343564, -56361784, -14022531, 29422136, 46156404, 36439040, 11818139, --18567680, -41300404, -36649492, 654446, 42820288, 47975860, 6956774, -37008124, -29559576, 33152852, -97268128, 110028472, 71801112, 21268678, -14348949, -36198520, -52268680, -63071056, -69157560, -74681968, --79523464, -79209936, -73945912, -68701760, -65478924, -63816772, -66236984, -74942888, -86210192, -95153928, --102194992, -109113104, -114073792, -115841176, -117046984, -118933016, -118941600, -116276576, -113024208, -108315320, --98741832, -84825608, -69585984, -51991116, -29500520, -4359929, 20286204, 46400680, 75974752, 105691096, -133309880, 162058240, 192782288, 220608304, 244149568, 267417008, 289217184, 303198400, 310272192, 316390368, -318068096, 307477248, 290040224, 275691808, 254662576, 207049104, 137422848, 75828184, 44052944, }, +61867932, 35822176, -16645683, -59343564, -56361784, -14022531, 29422136, 46156404, 36439040, 11818139, +-18567680, -41300404, -36649492, 654446, 42820288, 47975860, 6956774, -37008124, -29559576, 33152852, +97268128, 110028472, 71801112, 21268678, -14348949, -36198520, -52268680, -63071056, -69157560, -74681968, +-79523464, -79209936, -73945912, -68701760, -65478924, -63816772, -66236984, -74942888, -86210192, -95153928, +-102194992, -109113104, -114073792, -115841176, -117046984, -118933016, -118941600, -116276576, -113024208, -108315320, +-98741832, -84825608, -69585984, -51991116, -29500520, -4359929, 20286204, 46400680, 75974752, 105691096, +133309880, 162058240, 192782288, 220608304, 244149568, 267417008, 289217184, 303198400, 310272192, 316390368, +318068096, 307477248, 290040224, 275691808, 254662576, 207049104, 137422848, 75828184, 44052944, }, }, { { 17322140, -31187906, 39309152, 22240952, -14697915, -40109624, -29441464, 2966212, 17942226, -2493766, -39815956, --70690328, -88434448, -83261696, -35551592, 40590124, 75310104, 14615237, -92039000, -126762200, -37784436, -101995272, 186789200, 188059968, 148041616, 101429408, 46439332, -21973052, -92030952, -152505168, -204940272, --252362608, -290860032, -316288896, -329120128, -330478944, -320509792, -301369792, -276755360, -248831072, -218876368, --189064992, -160720368, -133050568, -105711496, -80083424, -56609816, -33839512, -11282342, 9620727, 27951648, -43906912, 56876104, 65904124, 72072776, 77758232, 83885008, 90192704, 97200480, 105432320, 113842944, -121302224, 128338992, 135533056, 142001824, 147348512, 152970624, 159588640, 165846944, 171091632, 176687968, -182724016, 186785984, 188384240, 190518304, 192627680, 185383680, 159393216, 120320288, 90364504, }, +31187906, 39309152, 22240952, -14697915, -40109624, -29441464, 2966212, 17942226, -2493766, -39815956, +-70690328, -88434448, -83261696, -35551592, 40590124, 75310104, 14615237, -92039000, -126762200, -37784436, +101995272, 186789200, 188059968, 148041616, 101429408, 46439332, -21973052, -92030952, -152505168, -204940272, +-252362608, -290860032, -316288896, -329120128, -330478944, -320509792, -301369792, -276755360, -248831072, -218876368, +-189064992, -160720368, -133050568, -105711496, -80083424, -56609816, -33839512, -11282342, 9620727, 27951648, +43906912, 56876104, 65904124, 72072776, 77758232, 83885008, 90192704, 97200480, 105432320, 113842944, +121302224, 128338992, 135533056, 142001824, 147348512, 152970624, 159588640, 165846944, 171091632, 176687968, +182724016, 186785984, 188384240, 190518304, 192627680, 185383680, 159393216, 120320288, 90364504, }, { 17322140, -31187906, 39309152, 22240952, -14697915, -40109624, -29441464, 2966212, 17942226, -2493766, -39815956, --70690328, -88434448, -83261696, -35551592, 40590124, 75310104, 14615237, -92039000, -126762200, -37784436, -101995272, 186789200, 188059968, 148041616, 101429408, 46439332, -21973052, -92030952, -152505168, -204940272, --252362608, -290860032, -316288896, -329120128, -330478944, -320509792, -301369792, -276755360, -248831072, -218876368, --189064992, -160720368, -133050568, -105711496, -80083424, -56609816, -33839512, -11282342, 9620727, 27951648, -43906912, 56876104, 65904124, 72072776, 77758232, 83885008, 90192704, 97200480, 105432320, 113842944, -121302224, 128338992, 135533056, 142001824, 147348512, 152970624, 159588640, 165846944, 171091632, 176687968, -182724016, 186785984, 188384240, 190518304, 192627680, 185383680, 159393216, 120320288, 90364504, }, +31187906, 39309152, 22240952, -14697915, -40109624, -29441464, 2966212, 17942226, -2493766, -39815956, +-70690328, -88434448, -83261696, -35551592, 40590124, 75310104, 14615237, -92039000, -126762200, -37784436, +101995272, 186789200, 188059968, 148041616, 101429408, 46439332, -21973052, -92030952, -152505168, -204940272, +-252362608, -290860032, -316288896, -329120128, -330478944, -320509792, -301369792, -276755360, -248831072, -218876368, +-189064992, -160720368, -133050568, -105711496, -80083424, -56609816, -33839512, -11282342, 9620727, 27951648, +43906912, 56876104, 65904124, 72072776, 77758232, 83885008, 90192704, 97200480, 105432320, 113842944, +121302224, 128338992, 135533056, 142001824, 147348512, 152970624, 159588640, 165846944, 171091632, 176687968, +182724016, 186785984, 188384240, 190518304, 192627680, 185383680, 159393216, 120320288, 90364504, }, }, { { 6201933, -303332, -1778117, 6503654, 18598820, 23028540, 20786568, 25465934, 41975252, 52989160, 32604170, --28302760, -105976704, -145849040, -96549792, 28359670, 128144104, 98512056, -45183056, -164794672, -144955152, --12104828, 117671904, 174167360, 173926304, 152256048, 113789256, 55066312, -9612137, -64184528, -108850040, --148930144, -181961120, -204718544, -220194928, -230445936, -231651744, -220868160, -200911584, -176357264, -150281440, --125502168, -104079408, -85437640, -68207840, -52620864, -38723964, -24820616, -10057740, 4121558, 16736951, -28503550, 39352100, 48028472, 54768888, 61201136, 67616208, 73394552, 79361872, 86609088, 94278288, -101434776, 109201688, 118283400, 126990912, 134377712, 142158048, 151016960, 158850976, 165027680, 171845936, -179373936, 184241744, 186285072, 189771520, 193235408, 184292208, 152493888, 106336408, 71842992, }, +303332, -1778117, 6503654, 18598820, 23028540, 20786568, 25465934, 41975252, 52989160, 32604170, +-28302760, -105976704, -145849040, -96549792, 28359670, 128144104, 98512056, -45183056, -164794672, -144955152, +-12104828, 117671904, 174167360, 173926304, 152256048, 113789256, 55066312, -9612137, -64184528, -108850040, +-148930144, -181961120, -204718544, -220194928, -230445936, -231651744, -220868160, -200911584, -176357264, -150281440, +-125502168, -104079408, -85437640, -68207840, -52620864, -38723964, -24820616, -10057740, 4121558, 16736951, +28503550, 39352100, 48028472, 54768888, 61201136, 67616208, 73394552, 79361872, 86609088, 94278288, +101434776, 109201688, 118283400, 126990912, 134377712, 142158048, 151016960, 158850976, 165027680, 171845936, +179373936, 184241744, 186285072, 189771520, 193235408, 184292208, 152493888, 106336408, 71842992, }, { -6201933, --303332, 1778117, -6503654, -18598820, -23028540, -20786568, -25465934, -41975252, -52989160, -32604170, -28302760, 105976704, 145849040, 96549792, -28359670, -128144104, -98512056, 45183056, 164794672, 144955152, -12104828, -117671904, -174167360, -173926304, -152256048, -113789256, -55066312, 9612137, 64184528, 108850040, -148930144, 181961120, 204718544, 220194928, 230445936, 231651744, 220868160, 200911584, 176357264, 150281440, -125502168, 104079408, 85437640, 68207840, 52620864, 38723964, 24820616, 10057740, -4121558, -16736951, --28503550, -39352100, -48028472, -54768888, -61201136, -67616208, -73394552, -79361872, -86609088, -94278288, --101434776, -109201688, -118283400, -126990912, -134377712, -142158048, -151016960, -158850976, -165027680, -171845936, --179373936, -184241744, -186285072, -189771520, -193235408, -184292208, -152493888, -106336408, -71842992, }, +-303332, 1778117, -6503654, -18598820, -23028540, -20786568, -25465934, -41975252, -52989160, -32604170, +28302760, 105976704, 145849040, 96549792, -28359670, -128144104, -98512056, 45183056, 164794672, 144955152, +12104828, -117671904, -174167360, -173926304, -152256048, -113789256, -55066312, 9612137, 64184528, 108850040, +148930144, 181961120, 204718544, 220194928, 230445936, 231651744, 220868160, 200911584, 176357264, 150281440, +125502168, 104079408, 85437640, 68207840, 52620864, 38723964, 24820616, 10057740, -4121558, -16736951, +-28503550, -39352100, -48028472, -54768888, -61201136, -67616208, -73394552, -79361872, -86609088, -94278288, +-101434776, -109201688, -118283400, -126990912, -134377712, -142158048, -151016960, -158850976, -165027680, -171845936, +-179373936, -184241744, -186285072, -189771520, -193235408, -184292208, -152493888, -106336408, -71842992, }, }, { { 27467390, -2485712, -658741, 27040040, 33897492, -6876243, -39722540, 1653026, 93714040, 141894448, 92704184, --10971494, -85444616, -83779776, -17631378, 61112552, 89751928, 40414032, -42704860, -75765368, -25393458, -53360672, 86494200, 64158220, 30455076, 15159087, 11920145, 12123619, 21956410, 43373800, 65676492, -81234472, 91583200, 96871912, 94500016, 87269976, 79865456, 69784632, 52569324, 31410706, 12203613, --4763656, -20226074, -30743376, -35179540, -38381440, -43128988, -46829104, -49121004, -53146464, -57859652, --59115392, -58056148, -58328340, -57390428, -50747724, -40503688, -29918742, -15891916, 3874597, 24592982, -43498892, 64919504, 89533424, 111123688, 128989680, 148818464, 168397616, 179598352, 184638496, 190617088, -191139472, 176601008, 155666256, 138311904, 107942728, 46190764, -24148454, -62047244, -66298724, }, +2485712, -658741, 27040040, 33897492, -6876243, -39722540, 1653026, 93714040, 141894448, 92704184, +-10971494, -85444616, -83779776, -17631378, 61112552, 89751928, 40414032, -42704860, -75765368, -25393458, +53360672, 86494200, 64158220, 30455076, 15159087, 11920145, 12123619, 21956410, 43373800, 65676492, +81234472, 91583200, 96871912, 94500016, 87269976, 79865456, 69784632, 52569324, 31410706, 12203613, +-4763656, -20226074, -30743376, -35179540, -38381440, -43128988, -46829104, -49121004, -53146464, -57859652, +-59115392, -58056148, -58328340, -57390428, -50747724, -40503688, -29918742, -15891916, 3874597, 24592982, +43498892, 64919504, 89533424, 111123688, 128989680, 148818464, 168397616, 179598352, 184638496, 190617088, +191139472, 176601008, 155666256, 138311904, 107942728, 46190764, -24148454, -62047244, -66298724, }, { -27467390, --2485712, 658741, -27040040, -33897492, 6876243, 39722540, -1653026, -93714040, -141894448, -92704184, -10971494, 85444616, 83779776, 17631378, -61112552, -89751928, -40414032, 42704860, 75765368, 25393458, --53360672, -86494200, -64158220, -30455076, -15159087, -11920145, -12123619, -21956410, -43373800, -65676492, --81234472, -91583200, -96871912, -94500016, -87269976, -79865456, -69784632, -52569324, -31410706, -12203613, -4763656, 20226074, 30743376, 35179540, 38381440, 43128988, 46829104, 49121004, 53146464, 57859652, -59115392, 58056148, 58328340, 57390428, 50747724, 40503688, 29918742, 15891916, -3874597, -24592982, --43498892, -64919504, -89533424, -111123688, -128989680, -148818464, -168397616, -179598352, -184638496, -190617088, --191139472, -176601008, -155666256, -138311904, -107942728, -46190764, 24148454, 62047244, 66298724, }, +-2485712, 658741, -27040040, -33897492, 6876243, 39722540, -1653026, -93714040, -141894448, -92704184, +10971494, 85444616, 83779776, 17631378, -61112552, -89751928, -40414032, 42704860, 75765368, 25393458, +-53360672, -86494200, -64158220, -30455076, -15159087, -11920145, -12123619, -21956410, -43373800, -65676492, +-81234472, -91583200, -96871912, -94500016, -87269976, -79865456, -69784632, -52569324, -31410706, -12203613, +4763656, 20226074, 30743376, 35179540, 38381440, 43128988, 46829104, 49121004, 53146464, 57859652, +59115392, 58056148, 58328340, 57390428, 50747724, 40503688, 29918742, 15891916, -3874597, -24592982, +-43498892, -64919504, -89533424, -111123688, -128989680, -148818464, -168397616, -179598352, -184638496, -190617088, +-191139472, -176601008, -155666256, -138311904, -107942728, -46190764, 24148454, 62047244, 66298724, }, }, { { -705448, -7508677, 5253819, -11579232, -25637196, -30896920, -46382964, -82768848, -115529248, -106844824, -38469484, -81976968, 213182848, 266282608, 157711728, -70983464, -231924480, -170874208, 44229036, 192235760, 155120800, -24892020, -54510652, -57131120, -42320460, -34080564, -9823127, 29956324, 53076132, 47967268, 35619236, -31935766, 32671280, 33468532, 37842420, 45331768, 50308564, 51933132, 53520660, 55144696, 55122684, -54221276, 52611200, 48027400, 40636296, 33889440, 28547574, 21951578, 13768591, 6218039, -1031866, --10213969, -20859046, -31143344, -41762652, -53775140, -65463892, -75291848, -84485224, -93593776, -100692288, --105207368, -108724952, -110714592, -108741592, -103163504, -95911992, -85653992, -70381096, -52398600, -34105800, --12992276, 12082280, 36379984, 59146532, 87079392, 115597968, 120755152, 90703800, 54766740, }, +7508677, 5253819, -11579232, -25637196, -30896920, -46382964, -82768848, -115529248, -106844824, -38469484, +81976968, 213182848, 266282608, 157711728, -70983464, -231924480, -170874208, 44229036, 192235760, 155120800, +24892020, -54510652, -57131120, -42320460, -34080564, -9823127, 29956324, 53076132, 47967268, 35619236, +31935766, 32671280, 33468532, 37842420, 45331768, 50308564, 51933132, 53520660, 55144696, 55122684, +54221276, 52611200, 48027400, 40636296, 33889440, 28547574, 21951578, 13768591, 6218039, -1031866, +-10213969, -20859046, -31143344, -41762652, -53775140, -65463892, -75291848, -84485224, -93593776, -100692288, +-105207368, -108724952, -110714592, -108741592, -103163504, -95911992, -85653992, -70381096, -52398600, -34105800, +-12992276, 12082280, 36379984, 59146532, 87079392, 115597968, 120755152, 90703800, 54766740, }, { -705448, -7508677, 5253819, -11579232, -25637196, -30896920, -46382964, -82768848, -115529248, -106844824, -38469484, -81976968, 213182848, 266282608, 157711728, -70983464, -231924480, -170874208, 44229036, 192235760, 155120800, -24892020, -54510652, -57131120, -42320460, -34080564, -9823127, 29956324, 53076132, 47967268, 35619236, -31935766, 32671280, 33468532, 37842420, 45331768, 50308564, 51933132, 53520660, 55144696, 55122684, -54221276, 52611200, 48027400, 40636296, 33889440, 28547574, 21951578, 13768591, 6218039, -1031866, --10213969, -20859046, -31143344, -41762652, -53775140, -65463892, -75291848, -84485224, -93593776, -100692288, --105207368, -108724952, -110714592, -108741592, -103163504, -95911992, -85653992, -70381096, -52398600, -34105800, --12992276, 12082280, 36379984, 59146532, 87079392, 115597968, 120755152, 90703800, 54766740, }, +7508677, 5253819, -11579232, -25637196, -30896920, -46382964, -82768848, -115529248, -106844824, -38469484, +81976968, 213182848, 266282608, 157711728, -70983464, -231924480, -170874208, 44229036, 192235760, 155120800, +24892020, -54510652, -57131120, -42320460, -34080564, -9823127, 29956324, 53076132, 47967268, 35619236, +31935766, 32671280, 33468532, 37842420, 45331768, 50308564, 51933132, 53520660, 55144696, 55122684, +54221276, 52611200, 48027400, 40636296, 33889440, 28547574, 21951578, 13768591, 6218039, -1031866, +-10213969, -20859046, -31143344, -41762652, -53775140, -65463892, -75291848, -84485224, -93593776, -100692288, +-105207368, -108724952, -110714592, -108741592, -103163504, -95911992, -85653992, -70381096, -52398600, -34105800, +-12992276, 12082280, 36379984, 59146532, 87079392, 115597968, 120755152, 90703800, 54766740, }, }, { { 22603876, --7221988, -49116708, -79632448, -77375984, -29621852, 49382996, 110023640, 103060424, 33597380, -39041788, --65136936, -50224812, -27392228, -9287867, 9259413, 20324322, 7736310, -21227876, -37613176, -28081034, --9184251, 227633, 2462627, 9927280, 25286084, 41665476, 53599580, 59563144, 58180700, 48233556, -31579284, 13106630, -2745558, -15305116, -27499602, -42119132, -58886148, -75693968, -90777888, -102259416, --108061912, -108416248, -106223672, -103357848, -99264744, -94078040, -89418536, -85260472, -79918064, -73578160, --67833640, -62113280, -54834920, -46960636, -40078488, -32923072, -24091008, -15411953, -8589398, -2209761, -4378183, 8904541, 10871099, 12869870, 15257871, 15999290, 16421807, 19524922, 23485418, 25606596, -29661044, 39075612, 48743048, 56302728, 72059352, 99793568, 118729000, 109183976, 87719872, }, +-7221988, -49116708, -79632448, -77375984, -29621852, 49382996, 110023640, 103060424, 33597380, -39041788, +-65136936, -50224812, -27392228, -9287867, 9259413, 20324322, 7736310, -21227876, -37613176, -28081034, +-9184251, 227633, 2462627, 9927280, 25286084, 41665476, 53599580, 59563144, 58180700, 48233556, +31579284, 13106630, -2745558, -15305116, -27499602, -42119132, -58886148, -75693968, -90777888, -102259416, +-108061912, -108416248, -106223672, -103357848, -99264744, -94078040, -89418536, -85260472, -79918064, -73578160, +-67833640, -62113280, -54834920, -46960636, -40078488, -32923072, -24091008, -15411953, -8589398, -2209761, +4378183, 8904541, 10871099, 12869870, 15257871, 15999290, 16421807, 19524922, 23485418, 25606596, +29661044, 39075612, 48743048, 56302728, 72059352, 99793568, 118729000, 109183976, 87719872, }, { 22603876, --7221988, -49116708, -79632448, -77375984, -29621852, 49382996, 110023640, 103060424, 33597380, -39041788, --65136936, -50224812, -27392228, -9287867, 9259413, 20324322, 7736310, -21227876, -37613176, -28081034, --9184251, 227633, 2462627, 9927280, 25286084, 41665476, 53599580, 59563144, 58180700, 48233556, -31579284, 13106630, -2745558, -15305116, -27499602, -42119132, -58886148, -75693968, -90777888, -102259416, --108061912, -108416248, -106223672, -103357848, -99264744, -94078040, -89418536, -85260472, -79918064, -73578160, --67833640, -62113280, -54834920, -46960636, -40078488, -32923072, -24091008, -15411953, -8589398, -2209761, -4378183, 8904541, 10871099, 12869870, 15257871, 15999290, 16421807, 19524922, 23485418, 25606596, -29661044, 39075612, 48743048, 56302728, 72059352, 99793568, 118729000, 109183976, 87719872, }, +-7221988, -49116708, -79632448, -77375984, -29621852, 49382996, 110023640, 103060424, 33597380, -39041788, +-65136936, -50224812, -27392228, -9287867, 9259413, 20324322, 7736310, -21227876, -37613176, -28081034, +-9184251, 227633, 2462627, 9927280, 25286084, 41665476, 53599580, 59563144, 58180700, 48233556, +31579284, 13106630, -2745558, -15305116, -27499602, -42119132, -58886148, -75693968, -90777888, -102259416, +-108061912, -108416248, -106223672, -103357848, -99264744, -94078040, -89418536, -85260472, -79918064, -73578160, +-67833640, -62113280, -54834920, -46960636, -40078488, -32923072, -24091008, -15411953, -8589398, -2209761, +4378183, 8904541, 10871099, 12869870, 15257871, 15999290, 16421807, 19524922, 23485418, 25606596, +29661044, 39075612, 48743048, 56302728, 72059352, 99793568, 118729000, 109183976, 87719872, }, }, { { -9419400, -41321880, 79047800, 67264016, 26528940, -31041876, -125323928, -240709296, -300726080, -248581440, -100945688, -102328672, 320818496, 442890592, 309921632, -67858336, -396835648, -363421344, -3670587, 329390176, 376628352, -214554016, 61891552, -1806571, -38725036, -89168352, -128088272, -142241264, -152928752, -167772160, -170083392, --154229584, -132369280, -109843792, -81601696, -48437568, -17170742, 10256382, 34843996, 53967876, 65718368, -73473472, 80379776, 85296440, 87221120, 87615184, 86742232, 83217672, 77797960, 73125576, 69989176, -67245232, 64345588, 61274688, 57396868, 52281028, 46337328, 39731132, 32087164, 23515482, 14594836, -5459441, -4110284, -14071923, -24159728, -34084324, -43646532, -52882320, -61583388, -68936376, -74838728, --80607944, -86543592, -91094648, -95179696, -102670120, -111155368, -108656232, -89623080, -69366944, }, +41321880, 79047800, 67264016, 26528940, -31041876, -125323928, -240709296, -300726080, -248581440, -100945688, +102328672, 320818496, 442890592, 309921632, -67858336, -396835648, -363421344, -3670587, 329390176, 376628352, +214554016, 61891552, -1806571, -38725036, -89168352, -128088272, -142241264, -152928752, -167772160, -170083392, +-154229584, -132369280, -109843792, -81601696, -48437568, -17170742, 10256382, 34843996, 53967876, 65718368, +73473472, 80379776, 85296440, 87221120, 87615184, 86742232, 83217672, 77797960, 73125576, 69989176, +67245232, 64345588, 61274688, 57396868, 52281028, 46337328, 39731132, 32087164, 23515482, 14594836, +5459441, -4110284, -14071923, -24159728, -34084324, -43646532, -52882320, -61583388, -68936376, -74838728, +-80607944, -86543592, -91094648, -95179696, -102670120, -111155368, -108656232, -89623080, -69366944, }, { -9419400, -41321880, 79047800, 67264016, 26528940, -31041876, -125323928, -240709296, -300726080, -248581440, -100945688, -102328672, 320818496, 442890592, 309921632, -67858336, -396835648, -363421344, -3670587, 329390176, 376628352, -214554016, 61891552, -1806571, -38725036, -89168352, -128088272, -142241264, -152928752, -167772160, -170083392, --154229584, -132369280, -109843792, -81601696, -48437568, -17170742, 10256382, 34843996, 53967876, 65718368, -73473472, 80379776, 85296440, 87221120, 87615184, 86742232, 83217672, 77797960, 73125576, 69989176, -67245232, 64345588, 61274688, 57396868, 52281028, 46337328, 39731132, 32087164, 23515482, 14594836, -5459441, -4110284, -14071923, -24159728, -34084324, -43646532, -52882320, -61583388, -68936376, -74838728, --80607944, -86543592, -91094648, -95179696, -102670120, -111155368, -108656232, -89623080, -69366944, }, +41321880, 79047800, 67264016, 26528940, -31041876, -125323928, -240709296, -300726080, -248581440, -100945688, +102328672, 320818496, 442890592, 309921632, -67858336, -396835648, -363421344, -3670587, 329390176, 376628352, +214554016, 61891552, -1806571, -38725036, -89168352, -128088272, -142241264, -152928752, -167772160, -170083392, +-154229584, -132369280, -109843792, -81601696, -48437568, -17170742, 10256382, 34843996, 53967876, 65718368, +73473472, 80379776, 85296440, 87221120, 87615184, 86742232, 83217672, 77797960, 73125576, 69989176, +67245232, 64345588, 61274688, 57396868, 52281028, 46337328, 39731132, 32087164, 23515482, 14594836, +5459441, -4110284, -14071923, -24159728, -34084324, -43646532, -52882320, -61583388, -68936376, -74838728, +-80607944, -86543592, -91094648, -95179696, -102670120, -111155368, -108656232, -89623080, -69366944, }, }, { { -3726421, --4905390, -550293, 12445205, 38268160, 81759000, 124758600, 129797672, 85855320, 10437307, -102676560, --256617312, -344373152, -196594080, 162747056, 421756672, 301686560, -81485728, -338718304, -270162560, -44135620, -89901184, 92062624, 71720584, 81324672, 84869624, 61480308, 35527968, 21602612, 7235946, -12939663, --27393838, -30405148, -28365038, -25742424, -21561272, -16509317, -12374875, -7998303, -2522757, 1645509, -3288871, 4905927, 7898982, 10081899, 10088878, 9747428, 10390063, 10888279, 10763725, 11661910, -14477798, 18012556, 21446382, 25411174, 29873108, 33535642, 36019744, 38237020, 40196064, 40926208, -40725416, 40797356, 40727028, 39200704, 36813776, 34959960, 32791538, 28916404, 24681566, 21641804, -17919678, 11828877, 5825050, 991601, -7748121, -22736484, -34851512, -34499860, -27521076, }, +-4905390, -550293, 12445205, 38268160, 81759000, 124758600, 129797672, 85855320, 10437307, -102676560, +-256617312, -344373152, -196594080, 162747056, 421756672, 301686560, -81485728, -338718304, -270162560, -44135620, +89901184, 92062624, 71720584, 81324672, 84869624, 61480308, 35527968, 21602612, 7235946, -12939663, +-27393838, -30405148, -28365038, -25742424, -21561272, -16509317, -12374875, -7998303, -2522757, 1645509, +3288871, 4905927, 7898982, 10081899, 10088878, 9747428, 10390063, 10888279, 10763725, 11661910, +14477798, 18012556, 21446382, 25411174, 29873108, 33535642, 36019744, 38237020, 40196064, 40926208, +40725416, 40797356, 40727028, 39200704, 36813776, 34959960, 32791538, 28916404, 24681566, 21641804, +17919678, 11828877, 5825050, 991601, -7748121, -22736484, -34851512, -34499860, -27521076, }, { 3726421, -4905390, 550293, -12445205, -38268160, -81759000, -124758600, -129797672, -85855320, -10437307, 102676560, -256617312, 344373152, 196594080, -162747056, -421756672, -301686560, 81485728, 338718304, 270162560, 44135620, --89901184, -92062624, -71720584, -81324672, -84869624, -61480308, -35527968, -21602612, -7235946, 12939663, -27393838, 30405148, 28365038, 25742424, 21561272, 16509317, 12374875, 7998303, 2522757, -1645509, --3288871, -4905927, -7898982, -10081899, -10088878, -9747428, -10390063, -10888279, -10763725, -11661910, --14477798, -18012556, -21446382, -25411174, -29873108, -33535642, -36019744, -38237020, -40196064, -40926208, --40725416, -40797356, -40727028, -39200704, -36813776, -34959960, -32791538, -28916404, -24681566, -21641804, --17919678, -11828877, -5825050, -991601, 7748121, 22736484, 34851512, 34499860, 27521076, }, +4905390, 550293, -12445205, -38268160, -81759000, -124758600, -129797672, -85855320, -10437307, 102676560, +256617312, 344373152, 196594080, -162747056, -421756672, -301686560, 81485728, 338718304, 270162560, 44135620, +-89901184, -92062624, -71720584, -81324672, -84869624, -61480308, -35527968, -21602612, -7235946, 12939663, +27393838, 30405148, 28365038, 25742424, 21561272, 16509317, 12374875, 7998303, 2522757, -1645509, +-3288871, -4905927, -7898982, -10081899, -10088878, -9747428, -10390063, -10888279, -10763725, -11661910, +-14477798, -18012556, -21446382, -25411174, -29873108, -33535642, -36019744, -38237020, -40196064, -40926208, +-40725416, -40797356, -40727028, -39200704, -36813776, -34959960, -32791538, -28916404, -24681566, -21641804, +-17919678, -11828877, -5825050, -991601, 7748121, 22736484, 34851512, 34499860, 27521076, }, }, { { -4889821, --342524, 3532074, 972273, -13593571, -39178156, -53621592, -24791088, 41968808, 86767464, 58815284, --13867376, -55325620, -37217504, -3175592, 4268124, -3515431, 1946157, 15576773, 14221710, -1054415, --9167071, -4754529, -3166465, -12531641, -22008486, -20215338, -10042707, -641561, 4719096, 7508677, -7569343, 3358128, -4560182, -13816373, -22486838, -29368450, -33820720, -36604932, -39212516, -41504416, --41713260, -39269960, -35690640, -32337346, -29443074, -27575838, -27660664, -29154774, -30347166, -30591442, --30244622, -28885266, -25828860, -21779242, -17788680, -13510893, -8437463, -3421478, 920197, 5463199, -10562398, 15039902, 18501108, 21978422, 25392920, 27537720, 28916404, 30988726, 33019172, 33803004, -35061964, 38326676, 41264436, 43054900, 48853104, 60483340, 67997920, 62146568, 51134272, }, +-342524, 3532074, 972273, -13593571, -39178156, -53621592, -24791088, 41968808, 86767464, 58815284, +-13867376, -55325620, -37217504, -3175592, 4268124, -3515431, 1946157, 15576773, 14221710, -1054415, +-9167071, -4754529, -3166465, -12531641, -22008486, -20215338, -10042707, -641561, 4719096, 7508677, +7569343, 3358128, -4560182, -13816373, -22486838, -29368450, -33820720, -36604932, -39212516, -41504416, +-41713260, -39269960, -35690640, -32337346, -29443074, -27575838, -27660664, -29154774, -30347166, -30591442, +-30244622, -28885266, -25828860, -21779242, -17788680, -13510893, -8437463, -3421478, 920197, 5463199, +10562398, 15039902, 18501108, 21978422, 25392920, 27537720, 28916404, 30988726, 33019172, 33803004, +35061964, 38326676, 41264436, 43054900, 48853104, 60483340, 67997920, 62146568, 51134272, }, { 4889821, -342524, -3532074, -972273, 13593571, 39178156, 53621592, 24791088, -41968808, -86767464, -58815284, -13867376, 55325620, 37217504, 3175592, -4268124, 3515431, -1946157, -15576773, -14221710, 1054415, -9167071, 4754529, 3166465, 12531641, 22008486, 20215338, 10042707, 641561, -4719096, -7508677, --7569343, -3358128, 4560182, 13816373, 22486838, 29368450, 33820720, 36604932, 39212516, 41504416, -41713260, 39269960, 35690640, 32337346, 29443074, 27575838, 27660664, 29154774, 30347166, 30591442, -30244622, 28885266, 25828860, 21779242, 17788680, 13510893, 8437463, 3421478, -920197, -5463199, --10562398, -15039902, -18501108, -21978422, -25392920, -27537720, -28916404, -30988726, -33019172, -33803004, --35061964, -38326676, -41264436, -43054900, -48853104, -60483340, -67997920, -62146568, -51134272, }, +342524, -3532074, -972273, 13593571, 39178156, 53621592, 24791088, -41968808, -86767464, -58815284, +13867376, 55325620, 37217504, 3175592, -4268124, 3515431, -1946157, -15576773, -14221710, 1054415, +9167071, 4754529, 3166465, 12531641, 22008486, 20215338, 10042707, 641561, -4719096, -7508677, +-7569343, -3358128, 4560182, 13816373, 22486838, 29368450, 33820720, 36604932, 39212516, 41504416, +41713260, 39269960, 35690640, 32337346, 29443074, 27575838, 27660664, 29154774, 30347166, 30591442, +30244622, 28885266, 25828860, 21779242, 17788680, 13510893, 8437463, 3421478, -920197, -5463199, +-10562398, -15039902, -18501108, -21978422, -25392920, -27537720, -28916404, -30988726, -33019172, -33803004, +-35061964, -38326676, -41264436, -43054900, -48853104, -60483340, -67997920, -62146568, -51134272, }, }, { { -19487878, --11583527, 4476967, 11824045, -3235184, -12584791, 29283624, 109043312, 139014672, 44827112, -139646032, --277102688, -236251648, -20240570, 204973024, 246190208, 78254840, -122839288, -173505936, -74751224, 31737660, -55711096, 30462592, 12132209, -1471563, -29320668, -54413476, -52803400, -35593468, -28465432, -34099356, --38771208, -36869072, -29972966, -16141561, 5407364, 28610388, 47796008, 62867584, 74308840, 81188304, -85045720, 88492968, 90726352, 90090696, 88160112, 86411520, 83108152, 77392088, 71344776, 65213172, -56276956, 44019656, 30570504, 16008417, -677531, -17338246, -31462782, -44628468, -58690728, -71698576, --82425792, -93255016, -104423536, -112355272, -116525680, -119679264, -120098024, -113599736, -102504224, -91154240, --75778256, -52141976, -26696442, -3887482, 26867168, 69371240, 98732168, 91459184, 67642512, }, +-11583527, 4476967, 11824045, -3235184, -12584791, 29283624, 109043312, 139014672, 44827112, -139646032, +-277102688, -236251648, -20240570, 204973024, 246190208, 78254840, -122839288, -173505936, -74751224, 31737660, +55711096, 30462592, 12132209, -1471563, -29320668, -54413476, -52803400, -35593468, -28465432, -34099356, +-38771208, -36869072, -29972966, -16141561, 5407364, 28610388, 47796008, 62867584, 74308840, 81188304, +85045720, 88492968, 90726352, 90090696, 88160112, 86411520, 83108152, 77392088, 71344776, 65213172, +56276956, 44019656, 30570504, 16008417, -677531, -17338246, -31462782, -44628468, -58690728, -71698576, +-82425792, -93255016, -104423536, -112355272, -116525680, -119679264, -120098024, -113599736, -102504224, -91154240, +-75778256, -52141976, -26696442, -3887482, 26867168, 69371240, 98732168, 91459184, 67642512, }, { 19487878, -11583527, -4476967, -11824045, 3235184, 12584791, -29283624, -109043312, -139014672, -44827112, 139646032, -277102688, 236251648, 20240570, -204973024, -246190208, -78254840, 122839288, 173505936, 74751224, -31737660, --55711096, -30462592, -12132209, 1471563, 29320668, 54413476, 52803400, 35593468, 28465432, 34099356, -38771208, 36869072, 29972966, 16141561, -5407364, -28610388, -47796008, -62867584, -74308840, -81188304, --85045720, -88492968, -90726352, -90090696, -88160112, -86411520, -83108152, -77392088, -71344776, -65213172, --56276956, -44019656, -30570504, -16008417, 677531, 17338246, 31462782, 44628468, 58690728, 71698576, -82425792, 93255016, 104423536, 112355272, 116525680, 119679264, 120098024, 113599736, 102504224, 91154240, -75778256, 52141976, 26696442, 3887482, -26867168, -69371240, -98732168, -91459184, -67642512, }, +11583527, -4476967, -11824045, 3235184, 12584791, -29283624, -109043312, -139014672, -44827112, 139646032, +277102688, 236251648, 20240570, -204973024, -246190208, -78254840, 122839288, 173505936, 74751224, -31737660, +-55711096, -30462592, -12132209, 1471563, 29320668, 54413476, 52803400, 35593468, 28465432, 34099356, +38771208, 36869072, 29972966, 16141561, -5407364, -28610388, -47796008, -62867584, -74308840, -81188304, +-85045720, -88492968, -90726352, -90090696, -88160112, -86411520, -83108152, -77392088, -71344776, -65213172, +-56276956, -44019656, -30570504, -16008417, 677531, 17338246, 31462782, 44628468, 58690728, 71698576, +82425792, 93255016, 104423536, 112355272, 116525680, 119679264, 120098024, 113599736, 102504224, 91154240, +75778256, 52141976, 26696442, 3887482, -26867168, -69371240, -98732168, -91459184, -67642512, }, }, { { -13447006, --15437186, -15337865, -8318815, 5473936, 19134080, 23803246, 13018583, -15075872, -50674708, -68482720, --46862924, 2273648, 37122476, 29987998, -3798362, -30385284, -37065032, -33677912, -26914950, -13136157, -6638409, 22264036, 28156194, 30261266, 35209604, 39506720, 33935612, 15321759, -9609452, -30800822, --42454140, -44469016, -39946952, -33484638, -29549912, -29195040, -29076392, -25866978, -20243792, -14707042, --9924059, -5625334, -2419140, -177704, 2801929, 7062537, 11181947, 14747307, 18733574, 22507240, -24340654, 24764782, 25312926, 24883966, 21612812, 16559246, 11263552, 4413079, -4876399, -14206141, --22242562, -31212064, -41726680, -50947440, -58571004, -67672576, -77786152, -85235240, -90859496, -97880160, --103053448, -101211976, -95937224, -91939144, -80863496, -52128020, -14814416, 10315975, 18066244, }, +-15437186, -15337865, -8318815, 5473936, 19134080, 23803246, 13018583, -15075872, -50674708, -68482720, +-46862924, 2273648, 37122476, 29987998, -3798362, -30385284, -37065032, -33677912, -26914950, -13136157, +6638409, 22264036, 28156194, 30261266, 35209604, 39506720, 33935612, 15321759, -9609452, -30800822, +-42454140, -44469016, -39946952, -33484638, -29549912, -29195040, -29076392, -25866978, -20243792, -14707042, +-9924059, -5625334, -2419140, -177704, 2801929, 7062537, 11181947, 14747307, 18733574, 22507240, +24340654, 24764782, 25312926, 24883966, 21612812, 16559246, 11263552, 4413079, -4876399, -14206141, +-22242562, -31212064, -41726680, -50947440, -58571004, -67672576, -77786152, -85235240, -90859496, -97880160, +-103053448, -101211976, -95937224, -91939144, -80863496, -52128020, -14814416, 10315975, 18066244, }, { -13447006, --15437186, -15337865, -8318815, 5473936, 19134080, 23803246, 13018583, -15075872, -50674708, -68482720, --46862924, 2273648, 37122476, 29987998, -3798362, -30385284, -37065032, -33677912, -26914950, -13136157, -6638409, 22264036, 28156194, 30261266, 35209604, 39506720, 33935612, 15321759, -9609452, -30800822, --42454140, -44469016, -39946952, -33484638, -29549912, -29195040, -29076392, -25866978, -20243792, -14707042, --9924059, -5625334, -2419140, -177704, 2801929, 7062537, 11181947, 14747307, 18733574, 22507240, -24340654, 24764782, 25312926, 24883966, 21612812, 16559246, 11263552, 4413079, -4876399, -14206141, --22242562, -31212064, -41726680, -50947440, -58571004, -67672576, -77786152, -85235240, -90859496, -97880160, --103053448, -101211976, -95937224, -91939144, -80863496, -52128020, -14814416, 10315975, 18066244, }, +-15437186, -15337865, -8318815, 5473936, 19134080, 23803246, 13018583, -15075872, -50674708, -68482720, +-46862924, 2273648, 37122476, 29987998, -3798362, -30385284, -37065032, -33677912, -26914950, -13136157, +6638409, 22264036, 28156194, 30261266, 35209604, 39506720, 33935612, 15321759, -9609452, -30800822, +-42454140, -44469016, -39946952, -33484638, -29549912, -29195040, -29076392, -25866978, -20243792, -14707042, +-9924059, -5625334, -2419140, -177704, 2801929, 7062537, 11181947, 14747307, 18733574, 22507240, +24340654, 24764782, 25312926, 24883966, 21612812, 16559246, 11263552, 4413079, -4876399, -14206141, +-22242562, -31212064, -41726680, -50947440, -58571004, -67672576, -77786152, -85235240, -90859496, -97880160, +-103053448, -101211976, -95937224, -91939144, -80863496, -52128020, -14814416, 10315975, 18066244, }, }, { { -17719424, --19465328, -10439455, 10909754, 31063350, 40038224, 34177740, 4187593, -51797304, -100851736, -93000000, --21596170, 56580288, 78688632, 38936564, -16989280, -44022340, -30846456, 3275986, 26647588, 17479444, --17430588, -48388176, -53091164, -35808752, -13846438, 3738232, 17264158, 27108760, 33263448, 38486128, -44350908, 47777216, 45907296, 40481140, 34288872, 27378270, 19193136, 10905459, 3950296, -1097364, --3863860, -4734665, -5491116, -7457137, -10365367, -14367739, -20726438, -29211146, -37582576, -44572096, --50488416, -54773716, -56360172, -56250648, -56406880, -56860000, -56986164, -57897768, -60495152, -63541892, --66344896, -70165808, -74739408, -77426448, -77547784, -76788112, -74449496, -68090264, -58958628, -50159312, --40458592, -27459874, -14231374, -3525095, 10242960, 31209916, 49187040, 51644296, 44649408, }, +-19465328, -10439455, 10909754, 31063350, 40038224, 34177740, 4187593, -51797304, -100851736, -93000000, +-21596170, 56580288, 78688632, 38936564, -16989280, -44022340, -30846456, 3275986, 26647588, 17479444, +-17430588, -48388176, -53091164, -35808752, -13846438, 3738232, 17264158, 27108760, 33263448, 38486128, +44350908, 47777216, 45907296, 40481140, 34288872, 27378270, 19193136, 10905459, 3950296, -1097364, +-3863860, -4734665, -5491116, -7457137, -10365367, -14367739, -20726438, -29211146, -37582576, -44572096, +-50488416, -54773716, -56360172, -56250648, -56406880, -56860000, -56986164, -57897768, -60495152, -63541892, +-66344896, -70165808, -74739408, -77426448, -77547784, -76788112, -74449496, -68090264, -58958628, -50159312, +-40458592, -27459874, -14231374, -3525095, 10242960, 31209916, 49187040, 51644296, 44649408, }, { -17719424, --19465328, -10439455, 10909754, 31063350, 40038224, 34177740, 4187593, -51797304, -100851736, -93000000, --21596170, 56580288, 78688632, 38936564, -16989280, -44022340, -30846456, 3275986, 26647588, 17479444, --17430588, -48388176, -53091164, -35808752, -13846438, 3738232, 17264158, 27108760, 33263448, 38486128, -44350908, 47777216, 45907296, 40481140, 34288872, 27378270, 19193136, 10905459, 3950296, -1097364, --3863860, -4734665, -5491116, -7457137, -10365367, -14367739, -20726438, -29211146, -37582576, -44572096, --50488416, -54773716, -56360172, -56250648, -56406880, -56860000, -56986164, -57897768, -60495152, -63541892, --66344896, -70165808, -74739408, -77426448, -77547784, -76788112, -74449496, -68090264, -58958628, -50159312, --40458592, -27459874, -14231374, -3525095, 10242960, 31209916, 49187040, 51644296, 44649408, }, +-19465328, -10439455, 10909754, 31063350, 40038224, 34177740, 4187593, -51797304, -100851736, -93000000, +-21596170, 56580288, 78688632, 38936564, -16989280, -44022340, -30846456, 3275986, 26647588, 17479444, +-17430588, -48388176, -53091164, -35808752, -13846438, 3738232, 17264158, 27108760, 33263448, 38486128, +44350908, 47777216, 45907296, 40481140, 34288872, 27378270, 19193136, 10905459, 3950296, -1097364, +-3863860, -4734665, -5491116, -7457137, -10365367, -14367739, -20726438, -29211146, -37582576, -44572096, +-50488416, -54773716, -56360172, -56250648, -56406880, -56860000, -56986164, -57897768, -60495152, -63541892, +-66344896, -70165808, -74739408, -77426448, -77547784, -76788112, -74449496, -68090264, -58958628, -50159312, +-40458592, -27459874, -14231374, -3525095, 10242960, 31209916, 49187040, 51644296, 44649408, }, }, { { 667867, --6288906, -10187126, -10408853, -15162308, -16886738, 7102802, 51078972, 60318520, -9038759, -112977504, --145011520, -58855548, 64550136, 103756208, 33980708, -56674776, -81592568, -46154256, -11977590, -6857989, --4037269, 22369800, 58718108, 77199888, 74336224, 66762584, 62137976, 52446384, 31241056, 2430952, --27460948, -54652920, -75504992, -87207704, -91644400, -92828200, -91470992, -86566680, -79617960, -72695544, --65450468, -58036284, -53288732, -52592948, -53606560, -54540716, -56122336, -57767848, -57040924, -53947472, --50586660, -46590196, -40249212, -33004140, -27427662, -22848690, -18099530, -15264314, -15820512, -17430052, --18829674, -22328998, -28017682, -32376000, -35120484, -39361228, -43814036, -44273596, -42357504, -41875396, --39014408, -28842852, -16483548, -6364605, 11662984, 45099840, 76302240, 82672216, 72620920, }, +-6288906, -10187126, -10408853, -15162308, -16886738, 7102802, 51078972, 60318520, -9038759, -112977504, +-145011520, -58855548, 64550136, 103756208, 33980708, -56674776, -81592568, -46154256, -11977590, -6857989, +-4037269, 22369800, 58718108, 77199888, 74336224, 66762584, 62137976, 52446384, 31241056, 2430952, +-27460948, -54652920, -75504992, -87207704, -91644400, -92828200, -91470992, -86566680, -79617960, -72695544, +-65450468, -58036284, -53288732, -52592948, -53606560, -54540716, -56122336, -57767848, -57040924, -53947472, +-50586660, -46590196, -40249212, -33004140, -27427662, -22848690, -18099530, -15264314, -15820512, -17430052, +-18829674, -22328998, -28017682, -32376000, -35120484, -39361228, -43814036, -44273596, -42357504, -41875396, +-39014408, -28842852, -16483548, -6364605, 11662984, 45099840, 76302240, 82672216, 72620920, }, { 667867, --6288906, -10187126, -10408853, -15162308, -16886738, 7102802, 51078972, 60318520, -9038759, -112977504, --145011520, -58855548, 64550136, 103756208, 33980708, -56674776, -81592568, -46154256, -11977590, -6857989, --4037269, 22369800, 58718108, 77199888, 74336224, 66762584, 62137976, 52446384, 31241056, 2430952, --27460948, -54652920, -75504992, -87207704, -91644400, -92828200, -91470992, -86566680, -79617960, -72695544, --65450468, -58036284, -53288732, -52592948, -53606560, -54540716, -56122336, -57767848, -57040924, -53947472, --50586660, -46590196, -40249212, -33004140, -27427662, -22848690, -18099530, -15264314, -15820512, -17430052, --18829674, -22328998, -28017682, -32376000, -35120484, -39361228, -43814036, -44273596, -42357504, -41875396, --39014408, -28842852, -16483548, -6364605, 11662984, 45099840, 76302240, 82672216, 72620920, }, +-6288906, -10187126, -10408853, -15162308, -16886738, 7102802, 51078972, 60318520, -9038759, -112977504, +-145011520, -58855548, 64550136, 103756208, 33980708, -56674776, -81592568, -46154256, -11977590, -6857989, +-4037269, 22369800, 58718108, 77199888, 74336224, 66762584, 62137976, 52446384, 31241056, 2430952, +-27460948, -54652920, -75504992, -87207704, -91644400, -92828200, -91470992, -86566680, -79617960, -72695544, +-65450468, -58036284, -53288732, -52592948, -53606560, -54540716, -56122336, -57767848, -57040924, -53947472, +-50586660, -46590196, -40249212, -33004140, -27427662, -22848690, -18099530, -15264314, -15820512, -17430052, +-18829674, -22328998, -28017682, -32376000, -35120484, -39361228, -43814036, -44273596, -42357504, -41875396, +-39014408, -28842852, -16483548, -6364605, 11662984, 45099840, 76302240, 82672216, 72620920, }, }, { { -6998649, --6445136, -5876589, -5549098, -6338298, -9783399, -13504451, -9632538, 3009698, 6265821, -20397874, --61070140, -62327492, 2799245, 80664856, 83809304, -1217623, -87422448, -87861072, -14525579, 49264348, -52332564, 16460462, -14287209, -24394340, -20737176, -7818988, 12781286, 33522756, 46147812, 49983756, -48574468, 44018048, 38555384, 35584340, 35335232, 33735896, 27512486, 16987132, 3606699, -11391327, --25731150, -36897528, -44295072, -48573932, -49903224, -48784924, -46949360, -45679124, -44795972, -44305808, --45021456, -46874736, -48736604, -50210316, -51539072, -52110840, -51286204, -50001472, -49417356, -49181672, --48970680, -49908592, -52512956, -55440512, -57990112, -61183956, -65010236, -67820216, -69580080, -71920304, --74211128, -74067784, -72268728, -71680320, -70314520, -61509300, -43222404, -22516366, -9305047, }, +-6445136, -5876589, -5549098, -6338298, -9783399, -13504451, -9632538, 3009698, 6265821, -20397874, +-61070140, -62327492, 2799245, 80664856, 83809304, -1217623, -87422448, -87861072, -14525579, 49264348, +52332564, 16460462, -14287209, -24394340, -20737176, -7818988, 12781286, 33522756, 46147812, 49983756, +48574468, 44018048, 38555384, 35584340, 35335232, 33735896, 27512486, 16987132, 3606699, -11391327, +-25731150, -36897528, -44295072, -48573932, -49903224, -48784924, -46949360, -45679124, -44795972, -44305808, +-45021456, -46874736, -48736604, -50210316, -51539072, -52110840, -51286204, -50001472, -49417356, -49181672, +-48970680, -49908592, -52512956, -55440512, -57990112, -61183956, -65010236, -67820216, -69580080, -71920304, +-74211128, -74067784, -72268728, -71680320, -70314520, -61509300, -43222404, -22516366, -9305047, }, { -6998649, --6445136, -5876589, -5549098, -6338298, -9783399, -13504451, -9632538, 3009698, 6265821, -20397874, --61070140, -62327492, 2799245, 80664856, 83809304, -1217623, -87422448, -87861072, -14525579, 49264348, -52332564, 16460462, -14287209, -24394340, -20737176, -7818988, 12781286, 33522756, 46147812, 49983756, -48574468, 44018048, 38555384, 35584340, 35335232, 33735896, 27512486, 16987132, 3606699, -11391327, --25731150, -36897528, -44295072, -48573932, -49903224, -48784924, -46949360, -45679124, -44795972, -44305808, --45021456, -46874736, -48736604, -50210316, -51539072, -52110840, -51286204, -50001472, -49417356, -49181672, --48970680, -49908592, -52512956, -55440512, -57990112, -61183956, -65010236, -67820216, -69580080, -71920304, --74211128, -74067784, -72268728, -71680320, -70314520, -61509300, -43222404, -22516366, -9305047, }, +-6445136, -5876589, -5549098, -6338298, -9783399, -13504451, -9632538, 3009698, 6265821, -20397874, +-61070140, -62327492, 2799245, 80664856, 83809304, -1217623, -87422448, -87861072, -14525579, 49264348, +52332564, 16460462, -14287209, -24394340, -20737176, -7818988, 12781286, 33522756, 46147812, 49983756, +48574468, 44018048, 38555384, 35584340, 35335232, 33735896, 27512486, 16987132, 3606699, -11391327, +-25731150, -36897528, -44295072, -48573932, -49903224, -48784924, -46949360, -45679124, -44795972, -44305808, +-45021456, -46874736, -48736604, -50210316, -51539072, -52110840, -51286204, -50001472, -49417356, -49181672, +-48970680, -49908592, -52512956, -55440512, -57990112, -61183956, -65010236, -67820216, -69580080, -71920304, +-74211128, -74067784, -72268728, -71680320, -70314520, -61509300, -43222404, -22516366, -9305047, }, }, }; const Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80] ={ { { -95201168, --261487808, -369519136, -412615360, -404252512, -367495648, -322004448, -266368496, -181466128, -63362040, 63136556, -175570752, 264952768, 290376832, 178081152, -61641372, -254110672, -207646640, 42662448, 236334336, 173758800, --78313360, -311243392, -417897632, -437003808, -422943680, -377025120, -296157312, -205951200, -127701192, -57491896, -10853919, 71386648, 119672288, 159669168, 194378944, 222988256, 246227792, 265816592, 281690272, 294566560, -306515168, 317100128, 324461696, 329706912, 334694464, 338081024, 338716160, 338725280, 339054912, 337549536, -334171552, 331427072, 328584320, 322998176, 316280864, 311258432, 305812960, 297692768, 290134720, 285150400, -278833568, 269938144, 263123648, 258594080, 250957088, 241354080, 235775984, 231270032, 221318048, 211121808, -207134464, 200413904, 184450048, 172849344, 167500496, 133703408, 53686016, -19186692, -21186000, }, +-261487808, -369519136, -412615360, -404252512, -367495648, -322004448, -266368496, -181466128, -63362040, 63136556, +175570752, 264952768, 290376832, 178081152, -61641372, -254110672, -207646640, 42662448, 236334336, 173758800, +-78313360, -311243392, -417897632, -437003808, -422943680, -377025120, -296157312, -205951200, -127701192, -57491896, +10853919, 71386648, 119672288, 159669168, 194378944, 222988256, 246227792, 265816592, 281690272, 294566560, +306515168, 317100128, 324461696, 329706912, 334694464, 338081024, 338716160, 338725280, 339054912, 337549536, +334171552, 331427072, 328584320, 322998176, 316280864, 311258432, 305812960, 297692768, 290134720, 285150400, +278833568, 269938144, 263123648, 258594080, 250957088, 241354080, 235775984, 231270032, 221318048, 211121808, +207134464, 200413904, 184450048, 172849344, 167500496, 133703408, 53686016, -19186692, -21186000, }, { -95201168, --261487808, -369519136, -412615360, -404252512, -367495648, -322004448, -266368496, -181466128, -63362040, 63136556, -175570752, 264952768, 290376832, 178081152, -61641372, -254110672, -207646640, 42662448, 236334336, 173758800, --78313360, -311243392, -417897632, -437003808, -422943680, -377025120, -296157312, -205951200, -127701192, -57491896, -10853919, 71386648, 119672288, 159669168, 194378944, 222988256, 246227792, 265816592, 281690272, 294566560, -306515168, 317100128, 324461696, 329706912, 334694464, 338081024, 338716160, 338725280, 339054912, 337549536, -334171552, 331427072, 328584320, 322998176, 316280864, 311258432, 305812960, 297692768, 290134720, 285150400, -278833568, 269938144, 263123648, 258594080, 250957088, 241354080, 235775984, 231270032, 221318048, 211121808, -207134464, 200413904, 184450048, 172849344, 167500496, 133703408, 53686016, -19186692, -21186000, }, +-261487808, -369519136, -412615360, -404252512, -367495648, -322004448, -266368496, -181466128, -63362040, 63136556, +175570752, 264952768, 290376832, 178081152, -61641372, -254110672, -207646640, 42662448, 236334336, 173758800, +-78313360, -311243392, -417897632, -437003808, -422943680, -377025120, -296157312, -205951200, -127701192, -57491896, +10853919, 71386648, 119672288, 159669168, 194378944, 222988256, 246227792, 265816592, 281690272, 294566560, +306515168, 317100128, 324461696, 329706912, 334694464, 338081024, 338716160, 338725280, 339054912, 337549536, +334171552, 331427072, 328584320, 322998176, 316280864, 311258432, 305812960, 297692768, 290134720, 285150400, +278833568, 269938144, 263123648, 258594080, 250957088, 241354080, 235775984, 231270032, 221318048, 211121808, +207134464, 200413904, 184450048, 172849344, 167500496, 133703408, 53686016, -19186692, -21186000, }, }, { { 74828528, -179569904, 162359424, -934155, -252682048, -492879712, -647132416, -679114880, -573558016, -358526688, -111054432, -121229744, 356839296, 552497088, 514685248, 120202712, -382224160, -514852224, -117430312, 417020928, 584300224, -313930432, -70863736, -308226176, -408039072, -465042944, -484762208, -443226144, -373642816, -319809184, -276554016, --222665056, -163996352, -114508656, -70787504, -25404732, 19091666, 59804736, 99188512, 137526464, 172307648, -203887472, 233259136, 258566160, 279182016, 297342720, 313283520, 325154784, 333576160, 340281120, 344762400, -347125696, 349632896, 352061152, 351769088, 349595296, 348179584, 345620320, 339195584, 331745952, 325862912, -318082048, 306809376, 296772576, 288880576, 277835520, 264487840, 255271376, 247653184, 234710832, 221795328, -216443808, 209594400, 193566656, 182967216, 182154928, 155035440, 77873664, -201863, -14085345, }, +179569904, 162359424, -934155, -252682048, -492879712, -647132416, -679114880, -573558016, -358526688, -111054432, +121229744, 356839296, 552497088, 514685248, 120202712, -382224160, -514852224, -117430312, 417020928, 584300224, +313930432, -70863736, -308226176, -408039072, -465042944, -484762208, -443226144, -373642816, -319809184, -276554016, +-222665056, -163996352, -114508656, -70787504, -25404732, 19091666, 59804736, 99188512, 137526464, 172307648, +203887472, 233259136, 258566160, 279182016, 297342720, 313283520, 325154784, 333576160, 340281120, 344762400, +347125696, 349632896, 352061152, 351769088, 349595296, 348179584, 345620320, 339195584, 331745952, 325862912, +318082048, 306809376, 296772576, 288880576, 277835520, 264487840, 255271376, 247653184, 234710832, 221795328, +216443808, 209594400, 193566656, 182967216, 182154928, 155035440, 77873664, -201863, -14085345, }, { -74828528, --179569904, -162359424, 934155, 252682048, 492879712, 647132416, 679114880, 573558016, 358526688, 111054432, --121229744, -356839296, -552497088, -514685248, -120202712, 382224160, 514852224, 117430312, -417020928, -584300224, --313930432, 70863736, 308226176, 408039072, 465042944, 484762208, 443226144, 373642816, 319809184, 276554016, -222665056, 163996352, 114508656, 70787504, 25404732, -19091666, -59804736, -99188512, -137526464, -172307648, --203887472, -233259136, -258566160, -279182016, -297342720, -313283520, -325154784, -333576160, -340281120, -344762400, --347125696, -349632896, -352061152, -351769088, -349595296, -348179584, -345620320, -339195584, -331745952, -325862912, --318082048, -306809376, -296772576, -288880576, -277835520, -264487840, -255271376, -247653184, -234710832, -221795328, --216443808, -209594400, -193566656, -182967216, -182154928, -155035440, -77873664, 201863, 14085345, }, +-179569904, -162359424, 934155, 252682048, 492879712, 647132416, 679114880, 573558016, 358526688, 111054432, +-121229744, -356839296, -552497088, -514685248, -120202712, 382224160, 514852224, 117430312, -417020928, -584300224, +-313930432, 70863736, 308226176, 408039072, 465042944, 484762208, 443226144, 373642816, 319809184, 276554016, +222665056, 163996352, 114508656, 70787504, 25404732, -19091666, -59804736, -99188512, -137526464, -172307648, +-203887472, -233259136, -258566160, -279182016, -297342720, -313283520, -325154784, -333576160, -340281120, -344762400, +-347125696, -349632896, -352061152, -351769088, -349595296, -348179584, -345620320, -339195584, -331745952, -325862912, +-318082048, -306809376, -296772576, -288880576, -277835520, -264487840, -255271376, -247653184, -234710832, -221795328, +-216443808, -209594400, -193566656, -182967216, -182154928, -155035440, -77873664, 201863, 14085345, }, }, { { -9317395, --36821292, -69657928, -75525392, -36439040, 20711942, 51296404, 39745092, 6192269, -23994372, -39681740, --36297844, -10059350, 29302952, 52118356, 33219962, -13837848, -40058624, -11268384, 48121888, 75580152, -37813964, -35274028, -89531816, -103560792, -94278824, -81204408, -67761160, -53076668, -40245456, -29352344, --16449725, -2290291, 7725036, 12230993, 13965086, 13299903, 10004053, 8395050, 12896176, 21770652, -31536334, 42917996, 56999584, 71239552, 84259744, 98653248, 115497576, 132492224, 149590496, 169309216, -190560176, 209627696, 226769440, 244284848, 260102688, 271007072, 278817472, 285900928, 289446976, 287174400, -282213184, 275995136, 264371344, 246168736, 225895408, 203880480, 175305536, 141681840, 109760576, 78130824, -40762996, 2810519, -26260504, -52909164, -89442696, -124522376, -129005784, -92731568, -32746978, }, +-36821292, -69657928, -75525392, -36439040, 20711942, 51296404, 39745092, 6192269, -23994372, -39681740, +-36297844, -10059350, 29302952, 52118356, 33219962, -13837848, -40058624, -11268384, 48121888, 75580152, +37813964, -35274028, -89531816, -103560792, -94278824, -81204408, -67761160, -53076668, -40245456, -29352344, +-16449725, -2290291, 7725036, 12230993, 13965086, 13299903, 10004053, 8395050, 12896176, 21770652, +31536334, 42917996, 56999584, 71239552, 84259744, 98653248, 115497576, 132492224, 149590496, 169309216, +190560176, 209627696, 226769440, 244284848, 260102688, 271007072, 278817472, 285900928, 289446976, 287174400, +282213184, 275995136, 264371344, 246168736, 225895408, 203880480, 175305536, 141681840, 109760576, 78130824, +40762996, 2810519, -26260504, -52909164, -89442696, -124522376, -129005784, -92731568, -32746978, }, { -9317395, --36821292, -69657928, -75525392, -36439040, 20711942, 51296404, 39745092, 6192269, -23994372, -39681740, --36297844, -10059350, 29302952, 52118356, 33219962, -13837848, -40058624, -11268384, 48121888, 75580152, -37813964, -35274028, -89531816, -103560792, -94278824, -81204408, -67761160, -53076668, -40245456, -29352344, --16449725, -2290291, 7725036, 12230993, 13965086, 13299903, 10004053, 8395050, 12896176, 21770652, -31536334, 42917996, 56999584, 71239552, 84259744, 98653248, 115497576, 132492224, 149590496, 169309216, -190560176, 209627696, 226769440, 244284848, 260102688, 271007072, 278817472, 285900928, 289446976, 287174400, -282213184, 275995136, 264371344, 246168736, 225895408, 203880480, 175305536, 141681840, 109760576, 78130824, -40762996, 2810519, -26260504, -52909164, -89442696, -124522376, -129005784, -92731568, -32746978, }, +-36821292, -69657928, -75525392, -36439040, 20711942, 51296404, 39745092, 6192269, -23994372, -39681740, +-36297844, -10059350, 29302952, 52118356, 33219962, -13837848, -40058624, -11268384, 48121888, 75580152, +37813964, -35274028, -89531816, -103560792, -94278824, -81204408, -67761160, -53076668, -40245456, -29352344, +-16449725, -2290291, 7725036, 12230993, 13965086, 13299903, 10004053, 8395050, 12896176, 21770652, +31536334, 42917996, 56999584, 71239552, 84259744, 98653248, 115497576, 132492224, 149590496, 169309216, +190560176, 209627696, 226769440, 244284848, 260102688, 271007072, 278817472, 285900928, 289446976, 287174400, +282213184, 275995136, 264371344, 246168736, 225895408, 203880480, 175305536, 141681840, 109760576, 78130824, +40762996, 2810519, -26260504, -52909164, -89442696, -124522376, -129005784, -92731568, -32746978, }, }, { { 3206730, --760209, -24588688, -53230752, -58679452, -31832150, 557809, 2557653, -28212566, -59016072, -63398012, --43799004, -9107478, 39424580, 80919872, 67487896, -14019847, -91020560, -69074352, 48401596, 150138640, -141599168, 40451076, -70834208, -146562000, -197603392, -238845280, -262780064, -261969920, -244105536, -217789744, --182208624, -135817072, -82862808, -28186796, 26032334, 77111840, 121609848, 158477312, 188456720, 211574928, -228198048, 240359248, 249442576, 254848864, 256604432, 256453040, 255078640, 251162176, 244128096, 235041008, -224493648, 212524112, 200652816, 191093840, 184047408, 178163840, 172973904, 168506064, 163650608, 157370288, -150373248, 143538880, 136241728, 128071632, 120195736, 113128904, 105392056, 96147136, 86589224, 76972256, -65361348, 51391968, 37546604, 23663122, 4324495, -22551262, -45995880, -47598976, -20342038, }, +-760209, -24588688, -53230752, -58679452, -31832150, 557809, 2557653, -28212566, -59016072, -63398012, +-43799004, -9107478, 39424580, 80919872, 67487896, -14019847, -91020560, -69074352, 48401596, 150138640, +141599168, 40451076, -70834208, -146562000, -197603392, -238845280, -262780064, -261969920, -244105536, -217789744, +-182208624, -135817072, -82862808, -28186796, 26032334, 77111840, 121609848, 158477312, 188456720, 211574928, +228198048, 240359248, 249442576, 254848864, 256604432, 256453040, 255078640, 251162176, 244128096, 235041008, +224493648, 212524112, 200652816, 191093840, 184047408, 178163840, 172973904, 168506064, 163650608, 157370288, +150373248, 143538880, 136241728, 128071632, 120195736, 113128904, 105392056, 96147136, 86589224, 76972256, +65361348, 51391968, 37546604, 23663122, 4324495, -22551262, -45995880, -47598976, -20342038, }, { 3206730, --760209, -24588688, -53230752, -58679452, -31832150, 557809, 2557653, -28212566, -59016072, -63398012, --43799004, -9107478, 39424580, 80919872, 67487896, -14019847, -91020560, -69074352, 48401596, 150138640, -141599168, 40451076, -70834208, -146562000, -197603392, -238845280, -262780064, -261969920, -244105536, -217789744, --182208624, -135817072, -82862808, -28186796, 26032334, 77111840, 121609848, 158477312, 188456720, 211574928, -228198048, 240359248, 249442576, 254848864, 256604432, 256453040, 255078640, 251162176, 244128096, 235041008, -224493648, 212524112, 200652816, 191093840, 184047408, 178163840, 172973904, 168506064, 163650608, 157370288, -150373248, 143538880, 136241728, 128071632, 120195736, 113128904, 105392056, 96147136, 86589224, 76972256, -65361348, 51391968, 37546604, 23663122, 4324495, -22551262, -45995880, -47598976, -20342038, }, +-760209, -24588688, -53230752, -58679452, -31832150, 557809, 2557653, -28212566, -59016072, -63398012, +-43799004, -9107478, 39424580, 80919872, 67487896, -14019847, -91020560, -69074352, 48401596, 150138640, +141599168, 40451076, -70834208, -146562000, -197603392, -238845280, -262780064, -261969920, -244105536, -217789744, +-182208624, -135817072, -82862808, -28186796, 26032334, 77111840, 121609848, 158477312, 188456720, 211574928, +228198048, 240359248, 249442576, 254848864, 256604432, 256453040, 255078640, 251162176, 244128096, 235041008, +224493648, 212524112, 200652816, 191093840, 184047408, 178163840, 172973904, 168506064, 163650608, 157370288, +150373248, 143538880, 136241728, 128071632, 120195736, 113128904, 105392056, 96147136, 86589224, 76972256, +65361348, 51391968, 37546604, 23663122, 4324495, -22551262, -45995880, -47598976, -20342038, }, }, { { -2380486, --2201708, 6032282, 13530758, 10633265, 857383, -3568581, -1665374, -9763534, -41570452, -86909200, --112731080, -83443160, 8054675, 112200112, 139479056, 45113800, -96580928, -144677584, -42420856, 115654880, -192026912, 149331712, 53525492, -31199716, -96998080, -153833376, -192797328, -203361872, -193656848, -176281568, --152326384, -119745296, -82905752, -45694692, -5987722, 37148784, 78603808, 112886776, 138612016, 156223536, -166643120, 172502528, 176550000, 179240800, 180459488, 181491360, 182870048, 182965600, 180790208, 177448192, -173547280, 168362720, 162371232, 157321424, 153461872, 149761216, 146456768, 144288352, 142253072, 139164464, -135849280, 132984536, 129053032, 123152280, 116941224, 111209592, 104015520, 94634776, 85179936, 75937168, -64041184, 49254148, 35070020, 20654498, -1403381, -32753958, -58780924, -58144192, -24373402, }, +-2201708, 6032282, 13530758, 10633265, 857383, -3568581, -1665374, -9763534, -41570452, -86909200, +-112731080, -83443160, 8054675, 112200112, 139479056, 45113800, -96580928, -144677584, -42420856, 115654880, +192026912, 149331712, 53525492, -31199716, -96998080, -153833376, -192797328, -203361872, -193656848, -176281568, +-152326384, -119745296, -82905752, -45694692, -5987722, 37148784, 78603808, 112886776, 138612016, 156223536, +166643120, 172502528, 176550000, 179240800, 180459488, 181491360, 182870048, 182965600, 180790208, 177448192, +173547280, 168362720, 162371232, 157321424, 153461872, 149761216, 146456768, 144288352, 142253072, 139164464, +135849280, 132984536, 129053032, 123152280, 116941224, 111209592, 104015520, 94634776, 85179936, 75937168, +64041184, 49254148, 35070020, 20654498, -1403381, -32753958, -58780924, -58144192, -24373402, }, { 2380486, -2201708, -6032282, -13530758, -10633265, -857383, 3568581, 1665374, 9763534, 41570452, 86909200, -112731080, 83443160, -8054675, -112200112, -139479056, -45113800, 96580928, 144677584, 42420856, -115654880, --192026912, -149331712, -53525492, 31199716, 96998080, 153833376, 192797328, 203361872, 193656848, 176281568, -152326384, 119745296, 82905752, 45694692, 5987722, -37148784, -78603808, -112886776, -138612016, -156223536, --166643120, -172502528, -176550000, -179240800, -180459488, -181491360, -182870048, -182965600, -180790208, -177448192, --173547280, -168362720, -162371232, -157321424, -153461872, -149761216, -146456768, -144288352, -142253072, -139164464, --135849280, -132984536, -129053032, -123152280, -116941224, -111209592, -104015520, -94634776, -85179936, -75937168, --64041184, -49254148, -35070020, -20654498, 1403381, 32753958, 58780924, 58144192, 24373402, }, +2201708, -6032282, -13530758, -10633265, -857383, 3568581, 1665374, 9763534, 41570452, 86909200, +112731080, 83443160, -8054675, -112200112, -139479056, -45113800, 96580928, 144677584, 42420856, -115654880, +-192026912, -149331712, -53525492, 31199716, 96998080, 153833376, 192797328, 203361872, 193656848, 176281568, +152326384, 119745296, 82905752, 45694692, 5987722, -37148784, -78603808, -112886776, -138612016, -156223536, +-166643120, -172502528, -176550000, -179240800, -180459488, -181491360, -182870048, -182965600, -180790208, -177448192, +-173547280, -168362720, -162371232, -157321424, -153461872, -149761216, -146456768, -144288352, -142253072, -139164464, +-135849280, -132984536, -129053032, -123152280, -116941224, -111209592, -104015520, -94634776, -85179936, -75937168, +-64041184, -49254148, -35070020, -20654498, 1403381, 32753958, 58780924, 58144192, 24373402, }, }, { { -11930882, --12633646, 14035416, 19539416, -11880416, -24995100, 24242942, 89128624, 82855824, -7707319, -102444632, --119779120, -53979684, 38026028, 91971352, 73959872, 350577, -63051732, -51099912, 29446296, 99244344, -95165736, 38272452, -6125697, -10269267, 4490389, 17663054, 31674846, 48226576, 56620552, 51063404, -37772628, 21715892, 2442226, -17212082, -32573032, -45621144, -60280940, -72937672, -77700256, -75676248, --70407400, -61078728, -47806744, -35735200, -27477054, -19511500, -10116795, -1858110, 5894843, 16966732, -30312806, 41998336, 53784800, 69578472, 86721296, 100822208, 113888040, 128117800, 139034000, 143659680, -146247392, 148334752, 144509008, 133968080, 122643864, 109887272, 88977760, 62406948, 38290708, 13117904, --20552492, -54335632, -77318536, -99966976, -132959840, -152890640, -128148936, -70697848, -19562502, }, +-12633646, 14035416, 19539416, -11880416, -24995100, 24242942, 89128624, 82855824, -7707319, -102444632, +-119779120, -53979684, 38026028, 91971352, 73959872, 350577, -63051732, -51099912, 29446296, 99244344, +95165736, 38272452, -6125697, -10269267, 4490389, 17663054, 31674846, 48226576, 56620552, 51063404, +37772628, 21715892, 2442226, -17212082, -32573032, -45621144, -60280940, -72937672, -77700256, -75676248, +-70407400, -61078728, -47806744, -35735200, -27477054, -19511500, -10116795, -1858110, 5894843, 16966732, +30312806, 41998336, 53784800, 69578472, 86721296, 100822208, 113888040, 128117800, 139034000, 143659680, +146247392, 148334752, 144509008, 133968080, 122643864, 109887272, 88977760, 62406948, 38290708, 13117904, +-20552492, -54335632, -77318536, -99966976, -132959840, -152890640, -128148936, -70697848, -19562502, }, { 11930882, -12633646, -14035416, -19539416, 11880416, 24995100, -24242942, -89128624, -82855824, 7707319, 102444632, -119779120, 53979684, -38026028, -91971352, -73959872, -350577, 63051732, 51099912, -29446296, -99244344, --95165736, -38272452, 6125697, 10269267, -4490389, -17663054, -31674846, -48226576, -56620552, -51063404, --37772628, -21715892, -2442226, 17212082, 32573032, 45621144, 60280940, 72937672, 77700256, 75676248, -70407400, 61078728, 47806744, 35735200, 27477054, 19511500, 10116795, 1858110, -5894843, -16966732, --30312806, -41998336, -53784800, -69578472, -86721296, -100822208, -113888040, -128117800, -139034000, -143659680, --146247392, -148334752, -144509008, -133968080, -122643864, -109887272, -88977760, -62406948, -38290708, -13117904, -20552492, 54335632, 77318536, 99966976, 132959840, 152890640, 128148936, 70697848, 19562502, }, +12633646, -14035416, -19539416, 11880416, 24995100, -24242942, -89128624, -82855824, 7707319, 102444632, +119779120, 53979684, -38026028, -91971352, -73959872, -350577, 63051732, 51099912, -29446296, -99244344, +-95165736, -38272452, 6125697, 10269267, -4490389, -17663054, -31674846, -48226576, -56620552, -51063404, +-37772628, -21715892, -2442226, 17212082, 32573032, 45621144, 60280940, 72937672, 77700256, 75676248, +70407400, 61078728, 47806744, 35735200, 27477054, 19511500, 10116795, 1858110, -5894843, -16966732, +-30312806, -41998336, -53784800, -69578472, -86721296, -100822208, -113888040, -128117800, -139034000, -143659680, +-146247392, -148334752, -144509008, -133968080, -122643864, -109887272, -88977760, -62406948, -38290708, -13117904, +20552492, 54335632, 77318536, 99966976, 132959840, 152890640, 128148936, 70697848, 19562502, }, }, { { 2073396, --2979634, -18908056, -27071178, -21386252, -18320184, -23614268, -12989055, 37278704, 116928336, 189235184, -210141472, 136106432, -37988448, -218234272, -246803856, -69617664, 159266512, 222396096, 84098680, -85161152, --130710352, -71215392, -10320270, 15589121, 37127844, 61506616, 61480848, 33908228, 8679592, 2712809, -5145908, 5570573, 6349036, 8035884, 5467494, -1516660, -8196945, -13848585, -20753818, -28450400, --35919884, -44459352, -53712324, -60499448, -64401424, -68532112, -73542728, -77055472, -79073032, -81757920, --84574888, -85309864, -84337592, -82905216, -79657688, -73227048, -65103652, -56403120, -45642080, -32365262, --18467822, -4152160, 12357158, 30300994, 47081432, 63054952, 79679696, 94618664, 105121472, 113066624, -119806504, 121319944, 115937808, 108282032, 95906616, 65061776, 16160888, -19744502, -14417668, }, +-2979634, -18908056, -27071178, -21386252, -18320184, -23614268, -12989055, 37278704, 116928336, 189235184, +210141472, 136106432, -37988448, -218234272, -246803856, -69617664, 159266512, 222396096, 84098680, -85161152, +-130710352, -71215392, -10320270, 15589121, 37127844, 61506616, 61480848, 33908228, 8679592, 2712809, +5145908, 5570573, 6349036, 8035884, 5467494, -1516660, -8196945, -13848585, -20753818, -28450400, +-35919884, -44459352, -53712324, -60499448, -64401424, -68532112, -73542728, -77055472, -79073032, -81757920, +-84574888, -85309864, -84337592, -82905216, -79657688, -73227048, -65103652, -56403120, -45642080, -32365262, +-18467822, -4152160, 12357158, 30300994, 47081432, 63054952, 79679696, 94618664, 105121472, 113066624, +119806504, 121319944, 115937808, 108282032, 95906616, 65061776, 16160888, -19744502, -14417668, }, { 2073396, --2979634, -18908056, -27071178, -21386252, -18320184, -23614268, -12989055, 37278704, 116928336, 189235184, -210141472, 136106432, -37988448, -218234272, -246803856, -69617664, 159266512, 222396096, 84098680, -85161152, --130710352, -71215392, -10320270, 15589121, 37127844, 61506616, 61480848, 33908228, 8679592, 2712809, -5145908, 5570573, 6349036, 8035884, 5467494, -1516660, -8196945, -13848585, -20753818, -28450400, --35919884, -44459352, -53712324, -60499448, -64401424, -68532112, -73542728, -77055472, -79073032, -81757920, --84574888, -85309864, -84337592, -82905216, -79657688, -73227048, -65103652, -56403120, -45642080, -32365262, --18467822, -4152160, 12357158, 30300994, 47081432, 63054952, 79679696, 94618664, 105121472, 113066624, -119806504, 121319944, 115937808, 108282032, 95906616, 65061776, 16160888, -19744502, -14417668, }, +-2979634, -18908056, -27071178, -21386252, -18320184, -23614268, -12989055, 37278704, 116928336, 189235184, +210141472, 136106432, -37988448, -218234272, -246803856, -69617664, 159266512, 222396096, 84098680, -85161152, +-130710352, -71215392, -10320270, 15589121, 37127844, 61506616, 61480848, 33908228, 8679592, 2712809, +5145908, 5570573, 6349036, 8035884, 5467494, -1516660, -8196945, -13848585, -20753818, -28450400, +-35919884, -44459352, -53712324, -60499448, -64401424, -68532112, -73542728, -77055472, -79073032, -81757920, +-84574888, -85309864, -84337592, -82905216, -79657688, -73227048, -65103652, -56403120, -45642080, -32365262, +-18467822, -4152160, 12357158, 30300994, 47081432, 63054952, 79679696, 94618664, 105121472, 113066624, +119806504, 121319944, 115937808, 108282032, 95906616, 65061776, 16160888, -19744502, -14417668, }, }, { { -18935438, --43985296, -38830800, -1818382, 54804320, 102846752, 103673528, 40720048, -49203684, -99759208, -81579680, --28606092, 10171019, 23140210, 25193742, 19196894, -1850057, -25942140, -27653684, -3920768, 20147154, -25619480, 20407000, 20134270, 25312926, 25960392, 17194364, 1374390, -18625126, -40882184, -61797600, --76807440, -83958560, -85541256, -85887536, -87257096, -88059176, -85411328, -78131896, -66332548, -50427212, --32447942, -15933792, -2511482, 9138617, 19825570, 28585154, 35676684, 42913704, 50294068, 56216828, -61058864, 66391604, 71415104, 74494600, 76685568, 79417168, 81063216, 80016312, 77930032, 76124536, -72977400, 68185288, 64491080, 62619012, 60442536, 58506044, 59319940, 61267172, 61372400, 62210992, -66633732, 69985416, 68818264, 69603168, 73902432, 65627636, 34381212, 1323924, -5399311, }, +-43985296, -38830800, -1818382, 54804320, 102846752, 103673528, 40720048, -49203684, -99759208, -81579680, +-28606092, 10171019, 23140210, 25193742, 19196894, -1850057, -25942140, -27653684, -3920768, 20147154, +25619480, 20407000, 20134270, 25312926, 25960392, 17194364, 1374390, -18625126, -40882184, -61797600, +-76807440, -83958560, -85541256, -85887536, -87257096, -88059176, -85411328, -78131896, -66332548, -50427212, +-32447942, -15933792, -2511482, 9138617, 19825570, 28585154, 35676684, 42913704, 50294068, 56216828, +61058864, 66391604, 71415104, 74494600, 76685568, 79417168, 81063216, 80016312, 77930032, 76124536, +72977400, 68185288, 64491080, 62619012, 60442536, 58506044, 59319940, 61267172, 61372400, 62210992, +66633732, 69985416, 68818264, 69603168, 73902432, 65627636, 34381212, 1323924, -5399311, }, { -18935438, --43985296, -38830800, -1818382, 54804320, 102846752, 103673528, 40720048, -49203684, -99759208, -81579680, --28606092, 10171019, 23140210, 25193742, 19196894, -1850057, -25942140, -27653684, -3920768, 20147154, -25619480, 20407000, 20134270, 25312926, 25960392, 17194364, 1374390, -18625126, -40882184, -61797600, --76807440, -83958560, -85541256, -85887536, -87257096, -88059176, -85411328, -78131896, -66332548, -50427212, --32447942, -15933792, -2511482, 9138617, 19825570, 28585154, 35676684, 42913704, 50294068, 56216828, -61058864, 66391604, 71415104, 74494600, 76685568, 79417168, 81063216, 80016312, 77930032, 76124536, -72977400, 68185288, 64491080, 62619012, 60442536, 58506044, 59319940, 61267172, 61372400, 62210992, -66633732, 69985416, 68818264, 69603168, 73902432, 65627636, 34381212, 1323924, -5399311, }, +-43985296, -38830800, -1818382, 54804320, 102846752, 103673528, 40720048, -49203684, -99759208, -81579680, +-28606092, 10171019, 23140210, 25193742, 19196894, -1850057, -25942140, -27653684, -3920768, 20147154, +25619480, 20407000, 20134270, 25312926, 25960392, 17194364, 1374390, -18625126, -40882184, -61797600, +-76807440, -83958560, -85541256, -85887536, -87257096, -88059176, -85411328, -78131896, -66332548, -50427212, +-32447942, -15933792, -2511482, 9138617, 19825570, 28585154, 35676684, 42913704, 50294068, 56216828, +61058864, 66391604, 71415104, 74494600, 76685568, 79417168, 81063216, 80016312, 77930032, 76124536, +72977400, 68185288, 64491080, 62619012, 60442536, 58506044, 59319940, 61267172, 61372400, 62210992, +66633732, 69985416, 68818264, 69603168, 73902432, 65627636, 34381212, 1323924, -5399311, }, }, { { 22884122, -33165738, -14810121, -76870248, -119964344, -152239952, -161800000, -97338992, 54136988, 226571872, 344021504, -370080704, 264061024, -6888054, -332583488, -444249408, -186128320, 236213536, 432803328, 260745312, -52605296, --228708080, -231985136, -193081872, -181198224, -165368592, -125485520, -86251000, -58675160, -25121264, 19414862, -59017144, 86671368, 109536696, 128960152, 138729584, 138406400, 132367136, 121195928, 104757472, 87383256, -72582800, 58667644, 43847856, 29568702, 16611860, 3802120, -8322573, -17597554, -24101746, -30022896, --36389648, -42929808, -49812492, -57200376, -64430952, -71055936, -77319608, -83103320, -87808992, -91350200, --94069984, -95959232, -96729104, -96223376, -94447944, -91560648, -87623776, -82350096, -75940392, -69602096, --63686312, -56837448, -49156976, -42819212, -35799088, -20797306, 1918240, 16711718, 9657771, }, +33165738, -14810121, -76870248, -119964344, -152239952, -161800000, -97338992, 54136988, 226571872, 344021504, +370080704, 264061024, -6888054, -332583488, -444249408, -186128320, 236213536, 432803328, 260745312, -52605296, +-228708080, -231985136, -193081872, -181198224, -165368592, -125485520, -86251000, -58675160, -25121264, 19414862, +59017144, 86671368, 109536696, 128960152, 138729584, 138406400, 132367136, 121195928, 104757472, 87383256, +72582800, 58667644, 43847856, 29568702, 16611860, 3802120, -8322573, -17597554, -24101746, -30022896, +-36389648, -42929808, -49812492, -57200376, -64430952, -71055936, -77319608, -83103320, -87808992, -91350200, +-94069984, -95959232, -96729104, -96223376, -94447944, -91560648, -87623776, -82350096, -75940392, -69602096, +-63686312, -56837448, -49156976, -42819212, -35799088, -20797306, 1918240, 16711718, 9657771, }, { 22884122, -33165738, -14810121, -76870248, -119964344, -152239952, -161800000, -97338992, 54136988, 226571872, 344021504, -370080704, 264061024, -6888054, -332583488, -444249408, -186128320, 236213536, 432803328, 260745312, -52605296, --228708080, -231985136, -193081872, -181198224, -165368592, -125485520, -86251000, -58675160, -25121264, 19414862, -59017144, 86671368, 109536696, 128960152, 138729584, 138406400, 132367136, 121195928, 104757472, 87383256, -72582800, 58667644, 43847856, 29568702, 16611860, 3802120, -8322573, -17597554, -24101746, -30022896, --36389648, -42929808, -49812492, -57200376, -64430952, -71055936, -77319608, -83103320, -87808992, -91350200, --94069984, -95959232, -96729104, -96223376, -94447944, -91560648, -87623776, -82350096, -75940392, -69602096, --63686312, -56837448, -49156976, -42819212, -35799088, -20797306, 1918240, 16711718, 9657771, }, +33165738, -14810121, -76870248, -119964344, -152239952, -161800000, -97338992, 54136988, 226571872, 344021504, +370080704, 264061024, -6888054, -332583488, -444249408, -186128320, 236213536, 432803328, 260745312, -52605296, +-228708080, -231985136, -193081872, -181198224, -165368592, -125485520, -86251000, -58675160, -25121264, 19414862, +59017144, 86671368, 109536696, 128960152, 138729584, 138406400, 132367136, 121195928, 104757472, 87383256, +72582800, 58667644, 43847856, 29568702, 16611860, 3802120, -8322573, -17597554, -24101746, -30022896, +-36389648, -42929808, -49812492, -57200376, -64430952, -71055936, -77319608, -83103320, -87808992, -91350200, +-94069984, -95959232, -96729104, -96223376, -94447944, -91560648, -87623776, -82350096, -75940392, -69602096, +-63686312, -56837448, -49156976, -42819212, -35799088, -20797306, 1918240, 16711718, 9657771, }, }, { { 2676838, -11518565, 24768540, 38539280, 49642304, 43461848, -1695438, -78177528, -148516208, -194812208, -212254592, --142130128, 80136040, 349703232, 395369984, 95388536, -293716704, -390215488, -136282000, 164463424, 246670704, -150524640, 59037008, 36267776, 23570780, -11730093, -40562744, -45773612, -45122928, -48447768, -44677324, --29554206, -13287018, -2261300, 6082748, 13103408, 17475686, 20345260, 23156316, 24241332, 22792318, -21519396, 21908092, 21725556, 19693498, 17955110, 18005040, 18484466, 18526342, 19449760, 21778168, -23864986, 24606942, 24705188, 24425480, 22779432, 19651086, 16250009, 12910135, 8831527, 4265977, -374736, -3143379, -7501161, -12150462, -15678778, -18737868, -22670448, -26356066, -28297392, -30069066, --33279018, -35760436, -35962300, -37124624, -40197672, -37626060, -23779086, -7109245, -69793, }, +11518565, 24768540, 38539280, 49642304, 43461848, -1695438, -78177528, -148516208, -194812208, -212254592, +-142130128, 80136040, 349703232, 395369984, 95388536, -293716704, -390215488, -136282000, 164463424, 246670704, +150524640, 59037008, 36267776, 23570780, -11730093, -40562744, -45773612, -45122928, -48447768, -44677324, +-29554206, -13287018, -2261300, 6082748, 13103408, 17475686, 20345260, 23156316, 24241332, 22792318, +21519396, 21908092, 21725556, 19693498, 17955110, 18005040, 18484466, 18526342, 19449760, 21778168, +23864986, 24606942, 24705188, 24425480, 22779432, 19651086, 16250009, 12910135, 8831527, 4265977, +374736, -3143379, -7501161, -12150462, -15678778, -18737868, -22670448, -26356066, -28297392, -30069066, +-33279018, -35760436, -35962300, -37124624, -40197672, -37626060, -23779086, -7109245, -69793, }, { -2676838, --11518565, -24768540, -38539280, -49642304, -43461848, 1695438, 78177528, 148516208, 194812208, 212254592, -142130128, -80136040, -349703232, -395369984, -95388536, 293716704, 390215488, 136282000, -164463424, -246670704, --150524640, -59037008, -36267776, -23570780, 11730093, 40562744, 45773612, 45122928, 48447768, 44677324, -29554206, 13287018, 2261300, -6082748, -13103408, -17475686, -20345260, -23156316, -24241332, -22792318, --21519396, -21908092, -21725556, -19693498, -17955110, -18005040, -18484466, -18526342, -19449760, -21778168, --23864986, -24606942, -24705188, -24425480, -22779432, -19651086, -16250009, -12910135, -8831527, -4265977, --374736, 3143379, 7501161, 12150462, 15678778, 18737868, 22670448, 26356066, 28297392, 30069066, -33279018, 35760436, 35962300, 37124624, 40197672, 37626060, 23779086, 7109245, 69793, }, +-11518565, -24768540, -38539280, -49642304, -43461848, 1695438, 78177528, 148516208, 194812208, 212254592, +142130128, -80136040, -349703232, -395369984, -95388536, 293716704, 390215488, 136282000, -164463424, -246670704, +-150524640, -59037008, -36267776, -23570780, 11730093, 40562744, 45773612, 45122928, 48447768, 44677324, +29554206, 13287018, 2261300, -6082748, -13103408, -17475686, -20345260, -23156316, -24241332, -22792318, +-21519396, -21908092, -21725556, -19693498, -17955110, -18005040, -18484466, -18526342, -19449760, -21778168, +-23864986, -24606942, -24705188, -24425480, -22779432, -19651086, -16250009, -12910135, -8831527, -4265977, +-374736, 3143379, 7501161, 12150462, 15678778, 18737868, 22670448, 26356066, 28297392, 30069066, +33279018, 35760436, 35962300, 37124624, 40197672, 37626060, 23779086, 7109245, 69793, }, }, { { 1826435, -2365990, -3248606, -13448616, -22016002, -13940390, 23158464, 68848328, 71952512, 11164231, -61750356, --75194680, -26665842, 19692962, 22051436, 4394826, 2568391, 10317585, 3354906, -14431627, -20328080, --11798812, -7087770, -13144747, -16881906, -8556112, 4356708, 10319196, 7961259, 2301566, -4439386, --12662100, -20942798, -26485990, -28083718, -26211112, -21811454, -16364362, -11366631, -6633040, -730144, -6294275, 12436615, 16386374, 18624052, 19660750, 19497540, 19136764, 20284056, 23205708, 26865020, -30972620, 35785668, 40469328, 43934832, 46569792, 49092012, 50889456, 51408612, 51532628, 51770464, -51113868, 49217640, 47254840, 45489608, 42914776, 39926552, 37963216, 36498096, 34237868, 32390496, -32307818, 31949188, 29954176, 29531122, 31299574, 27438398, 13022878, -1730335, -3430605, }, +2365990, -3248606, -13448616, -22016002, -13940390, 23158464, 68848328, 71952512, 11164231, -61750356, +-75194680, -26665842, 19692962, 22051436, 4394826, 2568391, 10317585, 3354906, -14431627, -20328080, +-11798812, -7087770, -13144747, -16881906, -8556112, 4356708, 10319196, 7961259, 2301566, -4439386, +-12662100, -20942798, -26485990, -28083718, -26211112, -21811454, -16364362, -11366631, -6633040, -730144, +6294275, 12436615, 16386374, 18624052, 19660750, 19497540, 19136764, 20284056, 23205708, 26865020, +30972620, 35785668, 40469328, 43934832, 46569792, 49092012, 50889456, 51408612, 51532628, 51770464, +51113868, 49217640, 47254840, 45489608, 42914776, 39926552, 37963216, 36498096, 34237868, 32390496, +32307818, 31949188, 29954176, 29531122, 31299574, 27438398, 13022878, -1730335, -3430605, }, { -1826435, --2365990, 3248606, 13448616, 22016002, 13940390, -23158464, -68848328, -71952512, -11164231, 61750356, -75194680, 26665842, -19692962, -22051436, -4394826, -2568391, -10317585, -3354906, 14431627, 20328080, -11798812, 7087770, 13144747, 16881906, 8556112, -4356708, -10319196, -7961259, -2301566, 4439386, -12662100, 20942798, 26485990, 28083718, 26211112, 21811454, 16364362, 11366631, 6633040, 730144, --6294275, -12436615, -16386374, -18624052, -19660750, -19497540, -19136764, -20284056, -23205708, -26865020, --30972620, -35785668, -40469328, -43934832, -46569792, -49092012, -50889456, -51408612, -51532628, -51770464, --51113868, -49217640, -47254840, -45489608, -42914776, -39926552, -37963216, -36498096, -34237868, -32390496, --32307818, -31949188, -29954176, -29531122, -31299574, -27438398, -13022878, 1730335, 3430605, }, +-2365990, 3248606, 13448616, 22016002, 13940390, -23158464, -68848328, -71952512, -11164231, 61750356, +75194680, 26665842, -19692962, -22051436, -4394826, -2568391, -10317585, -3354906, 14431627, 20328080, +11798812, 7087770, 13144747, 16881906, 8556112, -4356708, -10319196, -7961259, -2301566, 4439386, +12662100, 20942798, 26485990, 28083718, 26211112, 21811454, 16364362, 11366631, 6633040, 730144, +-6294275, -12436615, -16386374, -18624052, -19660750, -19497540, -19136764, -20284056, -23205708, -26865020, +-30972620, -35785668, -40469328, -43934832, -46569792, -49092012, -50889456, -51408612, -51532628, -51770464, +-51113868, -49217640, -47254840, -45489608, -42914776, -39926552, -37963216, -36498096, -34237868, -32390496, +-32307818, -31949188, -29954176, -29531122, -31299574, -27438398, -13022878, 1730335, 3430605, }, }, { { 6216965, -17775796, 19325742, 5274757, -1144072, 26213260, 59710784, 29491930, -86476480, -207889840, -211848720, --52057152, 175533696, 290100352, 183276992, -57808112, -215628832, -163201776, 7863012, 113510616, 89436248, -18616536, -17101486, -24245090, -34355444, -37672768, -15455440, 15083388, 26690538, 22615150, 23285166, -34309272, 48685600, 63653564, 78474424, 87381112, 86266568, 78198472, 67035848, 53475564, 39097624, -26377004, 14476187, 1400159, -11567958, -22792318, -33887828, -45995880, -57177824, -66847408, -77320688, --88754424, -98337568, -105320112, -110883168, -113760800, -112169512, -108133320, -104066520, -98369784, -89551680, --79765592, -69713224, -56391308, -39460548, -22283900, -4645007, 16423955, 38332048, 56144348, 72164576, -90016608, 103996728, 108877424, 111673448, 114932784, 100724496, 57576184, 11511049, -3173444, }, +17775796, 19325742, 5274757, -1144072, 26213260, 59710784, 29491930, -86476480, -207889840, -211848720, +-52057152, 175533696, 290100352, 183276992, -57808112, -215628832, -163201776, 7863012, 113510616, 89436248, +18616536, -17101486, -24245090, -34355444, -37672768, -15455440, 15083388, 26690538, 22615150, 23285166, +34309272, 48685600, 63653564, 78474424, 87381112, 86266568, 78198472, 67035848, 53475564, 39097624, +26377004, 14476187, 1400159, -11567958, -22792318, -33887828, -45995880, -57177824, -66847408, -77320688, +-88754424, -98337568, -105320112, -110883168, -113760800, -112169512, -108133320, -104066520, -98369784, -89551680, +-79765592, -69713224, -56391308, -39460548, -22283900, -4645007, 16423955, 38332048, 56144348, 72164576, +90016608, 103996728, 108877424, 111673448, 114932784, 100724496, 57576184, 11511049, -3173444, }, { -6216965, --17775796, -19325742, -5274757, 1144072, -26213260, -59710784, -29491930, 86476480, 207889840, 211848720, -52057152, -175533696, -290100352, -183276992, 57808112, 215628832, 163201776, -7863012, -113510616, -89436248, --18616536, 17101486, 24245090, 34355444, 37672768, 15455440, -15083388, -26690538, -22615150, -23285166, --34309272, -48685600, -63653564, -78474424, -87381112, -86266568, -78198472, -67035848, -53475564, -39097624, --26377004, -14476187, -1400159, 11567958, 22792318, 33887828, 45995880, 57177824, 66847408, 77320688, -88754424, 98337568, 105320112, 110883168, 113760800, 112169512, 108133320, 104066520, 98369784, 89551680, -79765592, 69713224, 56391308, 39460548, 22283900, 4645007, -16423955, -38332048, -56144348, -72164576, --90016608, -103996728, -108877424, -111673448, -114932784, -100724496, -57576184, -11511049, 3173444, }, +-17775796, -19325742, -5274757, 1144072, -26213260, -59710784, -29491930, 86476480, 207889840, 211848720, +52057152, -175533696, -290100352, -183276992, 57808112, 215628832, 163201776, -7863012, -113510616, -89436248, +-18616536, 17101486, 24245090, 34355444, 37672768, 15455440, -15083388, -26690538, -22615150, -23285166, +-34309272, -48685600, -63653564, -78474424, -87381112, -86266568, -78198472, -67035848, -53475564, -39097624, +-26377004, -14476187, -1400159, 11567958, 22792318, 33887828, 45995880, 57177824, 66847408, 77320688, +88754424, 98337568, 105320112, 110883168, 113760800, 112169512, 108133320, 104066520, 98369784, 89551680, +79765592, 69713224, 56391308, 39460548, 22283900, 4645007, -16423955, -38332048, -56144348, -72164576, +-90016608, -103996728, -108877424, -111673448, -114932784, -100724496, -57576184, -11511049, 3173444, }, }, { { 189515, -2603824, 9093520, 16408923, 17219060, 6584185, -13749801, -36543728, -49490372, -37393060, 2747169, -46044196, 55252068, 21684754, -21689048, -37904160, -24512452, -3768834, 11381126, 24070070, 34782792, -35836132, 25294674, 12073153, 3120831, -5666136, -21471078, -42727408, -59395640, -63018980, -53593140, --37393596, -21197812, -9469866, -3933653, -2723009, -1264868, 3184182, 8684424, 12015708, 12869870, -12582107, 11391327, 9513353, 8288213, 7928510, 6730214, 4024384, 868657, -2894808, -8582955, --15516643, -21930104, -28495498, -36749888, -45392972, -52441012, -58786828, -65393560, -70221104, -72049152, --73160472, -74549360, -73696272, -70130376, -66786204, -63549948, -56963076, -47561396, -38742752, -28575492, --13094282, 4017942, 17359184, 31820876, 53082036, 69996152, 65097744, 40224516, 12428562, }, +2603824, 9093520, 16408923, 17219060, 6584185, -13749801, -36543728, -49490372, -37393060, 2747169, +46044196, 55252068, 21684754, -21689048, -37904160, -24512452, -3768834, 11381126, 24070070, 34782792, +35836132, 25294674, 12073153, 3120831, -5666136, -21471078, -42727408, -59395640, -63018980, -53593140, +-37393596, -21197812, -9469866, -3933653, -2723009, -1264868, 3184182, 8684424, 12015708, 12869870, +12582107, 11391327, 9513353, 8288213, 7928510, 6730214, 4024384, 868657, -2894808, -8582955, +-15516643, -21930104, -28495498, -36749888, -45392972, -52441012, -58786828, -65393560, -70221104, -72049152, +-73160472, -74549360, -73696272, -70130376, -66786204, -63549948, -56963076, -47561396, -38742752, -28575492, +-13094282, 4017942, 17359184, 31820876, 53082036, 69996152, 65097744, 40224516, 12428562, }, { 189515, -2603824, 9093520, 16408923, 17219060, 6584185, -13749801, -36543728, -49490372, -37393060, 2747169, -46044196, 55252068, 21684754, -21689048, -37904160, -24512452, -3768834, 11381126, 24070070, 34782792, -35836132, 25294674, 12073153, 3120831, -5666136, -21471078, -42727408, -59395640, -63018980, -53593140, --37393596, -21197812, -9469866, -3933653, -2723009, -1264868, 3184182, 8684424, 12015708, 12869870, -12582107, 11391327, 9513353, 8288213, 7928510, 6730214, 4024384, 868657, -2894808, -8582955, --15516643, -21930104, -28495498, -36749888, -45392972, -52441012, -58786828, -65393560, -70221104, -72049152, --73160472, -74549360, -73696272, -70130376, -66786204, -63549948, -56963076, -47561396, -38742752, -28575492, --13094282, 4017942, 17359184, 31820876, 53082036, 69996152, 65097744, 40224516, 12428562, }, +2603824, 9093520, 16408923, 17219060, 6584185, -13749801, -36543728, -49490372, -37393060, 2747169, +46044196, 55252068, 21684754, -21689048, -37904160, -24512452, -3768834, 11381126, 24070070, 34782792, +35836132, 25294674, 12073153, 3120831, -5666136, -21471078, -42727408, -59395640, -63018980, -53593140, +-37393596, -21197812, -9469866, -3933653, -2723009, -1264868, 3184182, 8684424, 12015708, 12869870, +12582107, 11391327, 9513353, 8288213, 7928510, 6730214, 4024384, 868657, -2894808, -8582955, +-15516643, -21930104, -28495498, -36749888, -45392972, -52441012, -58786828, -65393560, -70221104, -72049152, +-73160472, -74549360, -73696272, -70130376, -66786204, -63549948, -56963076, -47561396, -38742752, -28575492, +-13094282, 4017942, 17359184, 31820876, 53082036, 69996152, 65097744, 40224516, 12428562, }, }, { { 1822677, -10966125, 24683178, 28093918, 14313515, -10498511, -41405096, -70848168, -72985456, -23443542, 56086368, -101519608, 72735808, -771484, -54526220, -54574000, -17211008, 19396610, 26918708, 2150705, -31897648, --43881680, -23245436, 11316165, 35585416, 43225088, 41516764, 35880156, 27685896, 19294604, 11999602, -3074123, -9389335, -22429392, -32571958, -40118752, -46413564, -50786916, -52326660, -51607792, -49622980, --47427176, -46620796, -47962436, -50420232, -53144852, -56469692, -59701120, -60630980, -58479200, -54543936, --49472656, -43031276, -36491116, -31762894, -28569048, -25620554, -23313620, -22183506, -20781200, -18009872, --14838575, -11260331, -5197448, 3537979, 12585865, 21601002, 32216012, 43009804, 50777252, 56388088, -62372588, 66507568, 66082368, 64952792, 65838092, 60432876, 40850508, 16411607, 2739652, }, +10966125, 24683178, 28093918, 14313515, -10498511, -41405096, -70848168, -72985456, -23443542, 56086368, +101519608, 72735808, -771484, -54526220, -54574000, -17211008, 19396610, 26918708, 2150705, -31897648, +-43881680, -23245436, 11316165, 35585416, 43225088, 41516764, 35880156, 27685896, 19294604, 11999602, +3074123, -9389335, -22429392, -32571958, -40118752, -46413564, -50786916, -52326660, -51607792, -49622980, +-47427176, -46620796, -47962436, -50420232, -53144852, -56469692, -59701120, -60630980, -58479200, -54543936, +-49472656, -43031276, -36491116, -31762894, -28569048, -25620554, -23313620, -22183506, -20781200, -18009872, +-14838575, -11260331, -5197448, 3537979, 12585865, 21601002, 32216012, 43009804, 50777252, 56388088, +62372588, 66507568, 66082368, 64952792, 65838092, 60432876, 40850508, 16411607, 2739652, }, { 1822677, -10966125, 24683178, 28093918, 14313515, -10498511, -41405096, -70848168, -72985456, -23443542, 56086368, -101519608, 72735808, -771484, -54526220, -54574000, -17211008, 19396610, 26918708, 2150705, -31897648, --43881680, -23245436, 11316165, 35585416, 43225088, 41516764, 35880156, 27685896, 19294604, 11999602, -3074123, -9389335, -22429392, -32571958, -40118752, -46413564, -50786916, -52326660, -51607792, -49622980, --47427176, -46620796, -47962436, -50420232, -53144852, -56469692, -59701120, -60630980, -58479200, -54543936, --49472656, -43031276, -36491116, -31762894, -28569048, -25620554, -23313620, -22183506, -20781200, -18009872, --14838575, -11260331, -5197448, 3537979, 12585865, 21601002, 32216012, 43009804, 50777252, 56388088, -62372588, 66507568, 66082368, 64952792, 65838092, 60432876, 40850508, 16411607, 2739652, }, +10966125, 24683178, 28093918, 14313515, -10498511, -41405096, -70848168, -72985456, -23443542, 56086368, +101519608, 72735808, -771484, -54526220, -54574000, -17211008, 19396610, 26918708, 2150705, -31897648, +-43881680, -23245436, 11316165, 35585416, 43225088, 41516764, 35880156, 27685896, 19294604, 11999602, +3074123, -9389335, -22429392, -32571958, -40118752, -46413564, -50786916, -52326660, -51607792, -49622980, +-47427176, -46620796, -47962436, -50420232, -53144852, -56469692, -59701120, -60630980, -58479200, -54543936, +-49472656, -43031276, -36491116, -31762894, -28569048, -25620554, -23313620, -22183506, -20781200, -18009872, +-14838575, -11260331, -5197448, 3537979, 12585865, 21601002, 32216012, 43009804, 50777252, 56388088, +62372588, 66507568, 66082368, 64952792, 65838092, 60432876, 40850508, 16411607, 2739652, }, }, { { -4294968, --7507066, -4181688, -2804077, -789200, 14018236, 31004296, 11244224, -57692684, -116162224, -83996672, -33115272, 126618320, 102010304, -9821516, -90741920, -72991896, -1560147, 42258720, 39131984, 29724394, -41158136, 53827216, 40559524, 6607271, -24050206, -43329776, -61671972, -85042496, -106395464, -117824376, --118264608, -109136192, -92132952, -71879496, -53593676, -38022272, -23476292, -10812580, -1838246, 4233227, -8389145, 9313100, 6932614, 4554276, 4452271, 5563057, 7459822, 11628087, 17483738, 22373558, -26091390, 30193084, 33485712, 33631204, 31635656, 29486562, 26051662, 20342038, 14958834, 11668352, -8486855, 4993437, 4293357, 6699612, 8923331, 11404212, 17710834, 26282516, 32901596, 39942660, -51406464, 62460636, 67791760, 73733848, 84428320, 84616760, 59421408, 23559506, 3558917, }, +-7507066, -4181688, -2804077, -789200, 14018236, 31004296, 11244224, -57692684, -116162224, -83996672, +33115272, 126618320, 102010304, -9821516, -90741920, -72991896, -1560147, 42258720, 39131984, 29724394, +41158136, 53827216, 40559524, 6607271, -24050206, -43329776, -61671972, -85042496, -106395464, -117824376, +-118264608, -109136192, -92132952, -71879496, -53593676, -38022272, -23476292, -10812580, -1838246, 4233227, +8389145, 9313100, 6932614, 4554276, 4452271, 5563057, 7459822, 11628087, 17483738, 22373558, +26091390, 30193084, 33485712, 33631204, 31635656, 29486562, 26051662, 20342038, 14958834, 11668352, +8486855, 4993437, 4293357, 6699612, 8923331, 11404212, 17710834, 26282516, 32901596, 39942660, +51406464, 62460636, 67791760, 73733848, 84428320, 84616760, 59421408, 23559506, 3558917, }, { -4294968, --7507066, -4181688, -2804077, -789200, 14018236, 31004296, 11244224, -57692684, -116162224, -83996672, -33115272, 126618320, 102010304, -9821516, -90741920, -72991896, -1560147, 42258720, 39131984, 29724394, -41158136, 53827216, 40559524, 6607271, -24050206, -43329776, -61671972, -85042496, -106395464, -117824376, --118264608, -109136192, -92132952, -71879496, -53593676, -38022272, -23476292, -10812580, -1838246, 4233227, -8389145, 9313100, 6932614, 4554276, 4452271, 5563057, 7459822, 11628087, 17483738, 22373558, -26091390, 30193084, 33485712, 33631204, 31635656, 29486562, 26051662, 20342038, 14958834, 11668352, -8486855, 4993437, 4293357, 6699612, 8923331, 11404212, 17710834, 26282516, 32901596, 39942660, -51406464, 62460636, 67791760, 73733848, 84428320, 84616760, 59421408, 23559506, 3558917, }, +-7507066, -4181688, -2804077, -789200, 14018236, 31004296, 11244224, -57692684, -116162224, -83996672, +33115272, 126618320, 102010304, -9821516, -90741920, -72991896, -1560147, 42258720, 39131984, 29724394, +41158136, 53827216, 40559524, 6607271, -24050206, -43329776, -61671972, -85042496, -106395464, -117824376, +-118264608, -109136192, -92132952, -71879496, -53593676, -38022272, -23476292, -10812580, -1838246, 4233227, +8389145, 9313100, 6932614, 4554276, 4452271, 5563057, 7459822, 11628087, 17483738, 22373558, +26091390, 30193084, 33485712, 33631204, 31635656, 29486562, 26051662, 20342038, 14958834, 11668352, +8486855, 4993437, 4293357, 6699612, 8923331, 11404212, 17710834, 26282516, 32901596, 39942660, +51406464, 62460636, 67791760, 73733848, 84428320, 84616760, 59421408, 23559506, 3558917, }, }, { { 130997, -32749, -657130, -1952063, -4070555, -5195300, -1305133, 5801964, 3170223, -17411798, -35338992, --13445932, 48125644, 87900264, 46130632, -50145892, -102243840, -54114976, 39600136, 82422568, 47283296, --11302743, -37545532, -27742804, -6405407, 12627204, 27227946, 32908576, 25679610, 9967545, -6510634, --20486458, -31356482, -38201588, -42526620, -48736068, -58842664, -70268352, -79784384, -85971288, -87773024, --84463752, -77336792, -68763504, -60016800, -51819316, -45513232, -41750840, -39570608, -38140384, -37666864, --37796248, -37277096, -35762044, -33891588, -31652298, -28792924, -26312580, -25286084, -25139518, -25078850, --25694104, -27195196, -28119688, -27651536, -26830124, -25931938, -23602992, -19831474, -16272020, -12678207, --7124814, -360777, 5003637, 10241886, 19488950, 31398358, 37372120, 30353608, 11592654, }, +32749, -657130, -1952063, -4070555, -5195300, -1305133, 5801964, 3170223, -17411798, -35338992, +-13445932, 48125644, 87900264, 46130632, -50145892, -102243840, -54114976, 39600136, 82422568, 47283296, +-11302743, -37545532, -27742804, -6405407, 12627204, 27227946, 32908576, 25679610, 9967545, -6510634, +-20486458, -31356482, -38201588, -42526620, -48736068, -58842664, -70268352, -79784384, -85971288, -87773024, +-84463752, -77336792, -68763504, -60016800, -51819316, -45513232, -41750840, -39570608, -38140384, -37666864, +-37796248, -37277096, -35762044, -33891588, -31652298, -28792924, -26312580, -25286084, -25139518, -25078850, +-25694104, -27195196, -28119688, -27651536, -26830124, -25931938, -23602992, -19831474, -16272020, -12678207, +-7124814, -360777, 5003637, 10241886, 19488950, 31398358, 37372120, 30353608, 11592654, }, { 130997, -32749, -657130, -1952063, -4070555, -5195300, -1305133, 5801964, 3170223, -17411798, -35338992, --13445932, 48125644, 87900264, 46130632, -50145892, -102243840, -54114976, 39600136, 82422568, 47283296, --11302743, -37545532, -27742804, -6405407, 12627204, 27227946, 32908576, 25679610, 9967545, -6510634, --20486458, -31356482, -38201588, -42526620, -48736068, -58842664, -70268352, -79784384, -85971288, -87773024, --84463752, -77336792, -68763504, -60016800, -51819316, -45513232, -41750840, -39570608, -38140384, -37666864, --37796248, -37277096, -35762044, -33891588, -31652298, -28792924, -26312580, -25286084, -25139518, -25078850, --25694104, -27195196, -28119688, -27651536, -26830124, -25931938, -23602992, -19831474, -16272020, -12678207, --7124814, -360777, 5003637, 10241886, 19488950, 31398358, 37372120, 30353608, 11592654, }, +32749, -657130, -1952063, -4070555, -5195300, -1305133, 5801964, 3170223, -17411798, -35338992, +-13445932, 48125644, 87900264, 46130632, -50145892, -102243840, -54114976, 39600136, 82422568, 47283296, +-11302743, -37545532, -27742804, -6405407, 12627204, 27227946, 32908576, 25679610, 9967545, -6510634, +-20486458, -31356482, -38201588, -42526620, -48736068, -58842664, -70268352, -79784384, -85971288, -87773024, +-84463752, -77336792, -68763504, -60016800, -51819316, -45513232, -41750840, -39570608, -38140384, -37666864, +-37796248, -37277096, -35762044, -33891588, -31652298, -28792924, -26312580, -25286084, -25139518, -25078850, +-25694104, -27195196, -28119688, -27651536, -26830124, -25931938, -23602992, -19831474, -16272020, -12678207, +-7124814, -360777, 5003637, 10241886, 19488950, 31398358, 37372120, 30353608, 11592654, }, }, }; const Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 512962432, -341278624, 89471152, -133512280, -273079936, -336122528, -349119104, -324554560, -262216880, -165630048, -48346836, -71613208, 178208400, 260153680, 312068576, 334596736, 332439584, 311149984, 274952000, 226719520, 169514304, -107816568, 46557444, -11423539, -66238596, -118599080, -167255696, -209594400, -244145264, -271385568, -292355200, --307673728, -318017088, -324545984, -328378176, -330089184, -330015616, -328703520, -326799776, -324659264, -322200928, --319094048, -315034784, -309916256, -303793760, -296752704, -288858016, -280184864, -270791232, -260669616, -249816240, --238352432, -226495632, -214416576, -202232832, -190123168, -178318992, -166931424, -155884768, -145072192, -134496368, --124182000, -114053928, -104028400, -94160712, -84567368, -75240848, -66096864, -57156352, -48493400, -40037148, --31628140, -23242216, -14948097, -6672769, 1749125, 10307385, 18875308, 27525908, 36488968, 45755360, -55016920, 64084132, 73094440, 82186344, 91185376, 99786584, 107938432, 115887344, 123832496, 131617128, -138845552, 145306800, 151179632, 156724960, 161890736, 166396160, 170170896, 173537616, 176927424, 180539488, -184295440, 188059968, 191885712, 196051296, 200819248, 206168096, 211840672, 217638880, 223553584, 229627200, -235830208, 242074016, 248225488, 254111744, 259614672, 264742864, 269561824, 274113952, 278446496, 282621184, -286661696, 290560448, 294354496, 298083616, 301694080, 305092992, 308258944, 311198304, 313860640, 316228256, -318407392, 320516768, 322582656, 324619520, 326685952, 328788864, 330859584, 332886272, 334947328, 337102304, -339371680, 341797792, 344388736, 347055904, 349720928, 352393472, 355058496, 357624224, 360061600, 362436736, -364735072, 366851936, 368770720, 370553664, 372156768, 373476928, 374532416, 375398944, 376060352, 376523136, -376932224, 377384832, 377836864, 378318976, 378977184, 379788384, 380547520, 381205184, 381878976, 382534496, -383036448, 383457888, 383944320, 384410304, 384740480, 385069056, 385508224, 385921056, 386296352, 386908384, -387834464, 388840576, 389929344, 391359552, 393029248, 394594208, 396151680, 397985088, 399829248, 401337312, -402847520, 404673440, 406299616, 407403968, 408692448, 410470560, 411757984, 412218624, 413173184, 414995840, -415814048, 414951296, 414971136, 417450432, 419495904, 417959904, 414614144, 413365376, 414550784, 415673920, -415281472, 412165472, 403878336, 391482496, 383384352, 387701344, 400877760, 409806464, 406541728, 396224704, -388697760, 386601280, 385393856, 383336032, 387025408, 404428608, 433276288, 459798784, 471420992, 468912192, -462834272, 459868576, 458020160, 454963200, 453582368, 455604224, 456054656, 450368128, 443227744, }, +341278624, 89471152, -133512280, -273079936, -336122528, -349119104, -324554560, -262216880, -165630048, -48346836, +71613208, 178208400, 260153680, 312068576, 334596736, 332439584, 311149984, 274952000, 226719520, 169514304, +107816568, 46557444, -11423539, -66238596, -118599080, -167255696, -209594400, -244145264, -271385568, -292355200, +-307673728, -318017088, -324545984, -328378176, -330089184, -330015616, -328703520, -326799776, -324659264, -322200928, +-319094048, -315034784, -309916256, -303793760, -296752704, -288858016, -280184864, -270791232, -260669616, -249816240, +-238352432, -226495632, -214416576, -202232832, -190123168, -178318992, -166931424, -155884768, -145072192, -134496368, +-124182000, -114053928, -104028400, -94160712, -84567368, -75240848, -66096864, -57156352, -48493400, -40037148, +-31628140, -23242216, -14948097, -6672769, 1749125, 10307385, 18875308, 27525908, 36488968, 45755360, +55016920, 64084132, 73094440, 82186344, 91185376, 99786584, 107938432, 115887344, 123832496, 131617128, +138845552, 145306800, 151179632, 156724960, 161890736, 166396160, 170170896, 173537616, 176927424, 180539488, +184295440, 188059968, 191885712, 196051296, 200819248, 206168096, 211840672, 217638880, 223553584, 229627200, +235830208, 242074016, 248225488, 254111744, 259614672, 264742864, 269561824, 274113952, 278446496, 282621184, +286661696, 290560448, 294354496, 298083616, 301694080, 305092992, 308258944, 311198304, 313860640, 316228256, +318407392, 320516768, 322582656, 324619520, 326685952, 328788864, 330859584, 332886272, 334947328, 337102304, +339371680, 341797792, 344388736, 347055904, 349720928, 352393472, 355058496, 357624224, 360061600, 362436736, +364735072, 366851936, 368770720, 370553664, 372156768, 373476928, 374532416, 375398944, 376060352, 376523136, +376932224, 377384832, 377836864, 378318976, 378977184, 379788384, 380547520, 381205184, 381878976, 382534496, +383036448, 383457888, 383944320, 384410304, 384740480, 385069056, 385508224, 385921056, 386296352, 386908384, +387834464, 388840576, 389929344, 391359552, 393029248, 394594208, 396151680, 397985088, 399829248, 401337312, +402847520, 404673440, 406299616, 407403968, 408692448, 410470560, 411757984, 412218624, 413173184, 414995840, +415814048, 414951296, 414971136, 417450432, 419495904, 417959904, 414614144, 413365376, 414550784, 415673920, +415281472, 412165472, 403878336, 391482496, 383384352, 387701344, 400877760, 409806464, 406541728, 396224704, +388697760, 386601280, 385393856, 383336032, 387025408, 404428608, 433276288, 459798784, 471420992, 468912192, +462834272, 459868576, 458020160, 454963200, 453582368, 455604224, 456054656, 450368128, 443227744, }, { 512962432, -341278624, 89471152, -133512280, -273079936, -336122528, -349119104, -324554560, -262216880, -165630048, -48346836, -71613208, 178208400, 260153680, 312068576, 334596736, 332439584, 311149984, 274952000, 226719520, 169514304, -107816568, 46557444, -11423539, -66238596, -118599080, -167255696, -209594400, -244145264, -271385568, -292355200, --307673728, -318017088, -324545984, -328378176, -330089184, -330015616, -328703520, -326799776, -324659264, -322200928, --319094048, -315034784, -309916256, -303793760, -296752704, -288858016, -280184864, -270791232, -260669616, -249816240, --238352432, -226495632, -214416576, -202232832, -190123168, -178318992, -166931424, -155884768, -145072192, -134496368, --124182000, -114053928, -104028400, -94160712, -84567368, -75240848, -66096864, -57156352, -48493400, -40037148, --31628140, -23242216, -14948097, -6672769, 1749125, 10307385, 18875308, 27525908, 36488968, 45755360, -55016920, 64084132, 73094440, 82186344, 91185376, 99786584, 107938432, 115887344, 123832496, 131617128, -138845552, 145306800, 151179632, 156724960, 161890736, 166396160, 170170896, 173537616, 176927424, 180539488, -184295440, 188059968, 191885712, 196051296, 200819248, 206168096, 211840672, 217638880, 223553584, 229627200, -235830208, 242074016, 248225488, 254111744, 259614672, 264742864, 269561824, 274113952, 278446496, 282621184, -286661696, 290560448, 294354496, 298083616, 301694080, 305092992, 308258944, 311198304, 313860640, 316228256, -318407392, 320516768, 322582656, 324619520, 326685952, 328788864, 330859584, 332886272, 334947328, 337102304, -339371680, 341797792, 344388736, 347055904, 349720928, 352393472, 355058496, 357624224, 360061600, 362436736, -364735072, 366851936, 368770720, 370553664, 372156768, 373476928, 374532416, 375398944, 376060352, 376523136, -376932224, 377384832, 377836864, 378318976, 378977184, 379788384, 380547520, 381205184, 381878976, 382534496, -383036448, 383457888, 383944320, 384410304, 384740480, 385069056, 385508224, 385921056, 386296352, 386908384, -387834464, 388840576, 389929344, 391359552, 393029248, 394594208, 396151680, 397985088, 399829248, 401337312, -402847520, 404673440, 406299616, 407403968, 408692448, 410470560, 411757984, 412218624, 413173184, 414995840, -415814048, 414951296, 414971136, 417450432, 419495904, 417959904, 414614144, 413365376, 414550784, 415673920, -415281472, 412165472, 403878336, 391482496, 383384352, 387701344, 400877760, 409806464, 406541728, 396224704, -388697760, 386601280, 385393856, 383336032, 387025408, 404428608, 433276288, 459798784, 471420992, 468912192, -462834272, 459868576, 458020160, 454963200, 453582368, 455604224, 456054656, 450368128, 443227744, }, +341278624, 89471152, -133512280, -273079936, -336122528, -349119104, -324554560, -262216880, -165630048, -48346836, +71613208, 178208400, 260153680, 312068576, 334596736, 332439584, 311149984, 274952000, 226719520, 169514304, +107816568, 46557444, -11423539, -66238596, -118599080, -167255696, -209594400, -244145264, -271385568, -292355200, +-307673728, -318017088, -324545984, -328378176, -330089184, -330015616, -328703520, -326799776, -324659264, -322200928, +-319094048, -315034784, -309916256, -303793760, -296752704, -288858016, -280184864, -270791232, -260669616, -249816240, +-238352432, -226495632, -214416576, -202232832, -190123168, -178318992, -166931424, -155884768, -145072192, -134496368, +-124182000, -114053928, -104028400, -94160712, -84567368, -75240848, -66096864, -57156352, -48493400, -40037148, +-31628140, -23242216, -14948097, -6672769, 1749125, 10307385, 18875308, 27525908, 36488968, 45755360, +55016920, 64084132, 73094440, 82186344, 91185376, 99786584, 107938432, 115887344, 123832496, 131617128, +138845552, 145306800, 151179632, 156724960, 161890736, 166396160, 170170896, 173537616, 176927424, 180539488, +184295440, 188059968, 191885712, 196051296, 200819248, 206168096, 211840672, 217638880, 223553584, 229627200, +235830208, 242074016, 248225488, 254111744, 259614672, 264742864, 269561824, 274113952, 278446496, 282621184, +286661696, 290560448, 294354496, 298083616, 301694080, 305092992, 308258944, 311198304, 313860640, 316228256, +318407392, 320516768, 322582656, 324619520, 326685952, 328788864, 330859584, 332886272, 334947328, 337102304, +339371680, 341797792, 344388736, 347055904, 349720928, 352393472, 355058496, 357624224, 360061600, 362436736, +364735072, 366851936, 368770720, 370553664, 372156768, 373476928, 374532416, 375398944, 376060352, 376523136, +376932224, 377384832, 377836864, 378318976, 378977184, 379788384, 380547520, 381205184, 381878976, 382534496, +383036448, 383457888, 383944320, 384410304, 384740480, 385069056, 385508224, 385921056, 386296352, 386908384, +387834464, 388840576, 389929344, 391359552, 393029248, 394594208, 396151680, 397985088, 399829248, 401337312, +402847520, 404673440, 406299616, 407403968, 408692448, 410470560, 411757984, 412218624, 413173184, 414995840, +415814048, 414951296, 414971136, 417450432, 419495904, 417959904, 414614144, 413365376, 414550784, 415673920, +415281472, 412165472, 403878336, 391482496, 383384352, 387701344, 400877760, 409806464, 406541728, 396224704, +388697760, 386601280, 385393856, 383336032, 387025408, 404428608, 433276288, 459798784, 471420992, 468912192, +462834272, 459868576, 458020160, 454963200, 453582368, 455604224, 456054656, 450368128, 443227744, }, }, { { 52245056, -222357440, 401378656, 405117408, 177587776, -175398416, -484049792, -639197952, -636222080, -529849184, -372046176, --190520992, -1207423, 180006368, 338932512, 467017568, 559677696, 613684800, 628635008, 609800512, 567096768, -509938784, 443115008, 367884352, 286288032, 202992496, 122816200, 47916804, -21818970, -86701968, -146555552, --201343232, -251326992, -296677536, -337539328, -374389088, -407893568, -438432960, -465938464, -490061664, -510374176, --526579648, -538713472, -547120320, -552200192, -554222592, -553347456, -549751488, -543766464, -535939456, -526901760, --517067360, -506422816, -494632608, -481365440, -466567136, -450447584, -433289184, -415364128, -397026784, -378695328, --360628000, -342847360, -325416256, -308596096, -292586048, -277312064, -262696848, -248960464, -236373520, -224892000, --214347328, -204829680, -196494224, -189083248, -182072784, -175281904, -168897440, -162823824, -156483920, -149478288, --142028128, -134456640, -126554432, -117843168, -108263240, -98220000, -88029112, -77636368, -66831840, -55431384, --43236900, -30057792, -15797427, -396748, 16277389, 34321620, 53564684, 73533064, 93622768, 113299624, -132184064, 149990464, 166375216, 180912608, 193301984, 203518096, 211669408, 217803168, 221992368, 224550016, -226047344, 227133440, 228310256, 229737808, 231250704, 232713680, 234367776, 236709600, 240074720, 244437856, -249490896, 254743104, 259698416, 264169472, 268354384, 272495264, 276597504, 280563904, 284394496, 288109632, -291644384, 294928960, 297945088, 300674560, 303140928, 305479552, 307833728, 310224960, 312618848, 315017056, -317417952, 319834400, 322408160, 325350208, 328767936, 332695136, 337183936, 342184864, 347478432, 352943776, -358699552, 364821504, 371184480, 377744512, 384615936, 391724640, 398746368, 405488928, 411961440, 418068352, -423652352, 428781088, 433596800, 438024384, 441962336, 445481536, 448564768, 451039200, 453010080, 454851008, -456647904, 458242400, 459807392, 461649376, 463540256, 464983360, 465905152, 466422176, 466403936, 465932000, -465512192, 465289920, 464921632, 464530784, 464633856, 465020416, 465081600, 465055840, 465463328, 465917504, -466071584, 466539200, 467415936, 467811584, 468096672, 469604192, 471310368, 471249728, 471386624, 474611072, -477533792, 475729376, 474826336, 482493408, 490060064, 481175936, 461027168, 453999520, 466616000, 478818528, -481039552, 489577952, 509314944, 512657504, 480248736, 437299072, 422137312, 437084864, 454490208, 455429728, -441966080, 425956064, 420154624, 421830208, 396297696, 307272160, 179973088, 99357624, 118199648, 194585104, -249248224, 258870032, 258446432, 271055936, 276278080, 246866128, 186275952, 122813520, 84121232, }, +222357440, 401378656, 405117408, 177587776, -175398416, -484049792, -639197952, -636222080, -529849184, -372046176, +-190520992, -1207423, 180006368, 338932512, 467017568, 559677696, 613684800, 628635008, 609800512, 567096768, +509938784, 443115008, 367884352, 286288032, 202992496, 122816200, 47916804, -21818970, -86701968, -146555552, +-201343232, -251326992, -296677536, -337539328, -374389088, -407893568, -438432960, -465938464, -490061664, -510374176, +-526579648, -538713472, -547120320, -552200192, -554222592, -553347456, -549751488, -543766464, -535939456, -526901760, +-517067360, -506422816, -494632608, -481365440, -466567136, -450447584, -433289184, -415364128, -397026784, -378695328, +-360628000, -342847360, -325416256, -308596096, -292586048, -277312064, -262696848, -248960464, -236373520, -224892000, +-214347328, -204829680, -196494224, -189083248, -182072784, -175281904, -168897440, -162823824, -156483920, -149478288, +-142028128, -134456640, -126554432, -117843168, -108263240, -98220000, -88029112, -77636368, -66831840, -55431384, +-43236900, -30057792, -15797427, -396748, 16277389, 34321620, 53564684, 73533064, 93622768, 113299624, +132184064, 149990464, 166375216, 180912608, 193301984, 203518096, 211669408, 217803168, 221992368, 224550016, +226047344, 227133440, 228310256, 229737808, 231250704, 232713680, 234367776, 236709600, 240074720, 244437856, +249490896, 254743104, 259698416, 264169472, 268354384, 272495264, 276597504, 280563904, 284394496, 288109632, +291644384, 294928960, 297945088, 300674560, 303140928, 305479552, 307833728, 310224960, 312618848, 315017056, +317417952, 319834400, 322408160, 325350208, 328767936, 332695136, 337183936, 342184864, 347478432, 352943776, +358699552, 364821504, 371184480, 377744512, 384615936, 391724640, 398746368, 405488928, 411961440, 418068352, +423652352, 428781088, 433596800, 438024384, 441962336, 445481536, 448564768, 451039200, 453010080, 454851008, +456647904, 458242400, 459807392, 461649376, 463540256, 464983360, 465905152, 466422176, 466403936, 465932000, +465512192, 465289920, 464921632, 464530784, 464633856, 465020416, 465081600, 465055840, 465463328, 465917504, +466071584, 466539200, 467415936, 467811584, 468096672, 469604192, 471310368, 471249728, 471386624, 474611072, +477533792, 475729376, 474826336, 482493408, 490060064, 481175936, 461027168, 453999520, 466616000, 478818528, +481039552, 489577952, 509314944, 512657504, 480248736, 437299072, 422137312, 437084864, 454490208, 455429728, +441966080, 425956064, 420154624, 421830208, 396297696, 307272160, 179973088, 99357624, 118199648, 194585104, +249248224, 258870032, 258446432, 271055936, 276278080, 246866128, 186275952, 122813520, 84121232, }, { -52245056, --222357440, -401378656, -405117408, -177587776, 175398416, 484049792, 639197952, 636222080, 529849184, 372046176, -190520992, 1207423, -180006368, -338932512, -467017568, -559677696, -613684800, -628635008, -609800512, -567096768, --509938784, -443115008, -367884352, -286288032, -202992496, -122816200, -47916804, 21818970, 86701968, 146555552, -201343232, 251326992, 296677536, 337539328, 374389088, 407893568, 438432960, 465938464, 490061664, 510374176, -526579648, 538713472, 547120320, 552200192, 554222592, 553347456, 549751488, 543766464, 535939456, 526901760, -517067360, 506422816, 494632608, 481365440, 466567136, 450447584, 433289184, 415364128, 397026784, 378695328, -360628000, 342847360, 325416256, 308596096, 292586048, 277312064, 262696848, 248960464, 236373520, 224892000, -214347328, 204829680, 196494224, 189083248, 182072784, 175281904, 168897440, 162823824, 156483920, 149478288, -142028128, 134456640, 126554432, 117843168, 108263240, 98220000, 88029112, 77636368, 66831840, 55431384, -43236900, 30057792, 15797427, 396748, -16277389, -34321620, -53564684, -73533064, -93622768, -113299624, --132184064, -149990464, -166375216, -180912608, -193301984, -203518096, -211669408, -217803168, -221992368, -224550016, --226047344, -227133440, -228310256, -229737808, -231250704, -232713680, -234367776, -236709600, -240074720, -244437856, --249490896, -254743104, -259698416, -264169472, -268354384, -272495264, -276597504, -280563904, -284394496, -288109632, --291644384, -294928960, -297945088, -300674560, -303140928, -305479552, -307833728, -310224960, -312618848, -315017056, --317417952, -319834400, -322408160, -325350208, -328767936, -332695136, -337183936, -342184864, -347478432, -352943776, --358699552, -364821504, -371184480, -377744512, -384615936, -391724640, -398746368, -405488928, -411961440, -418068352, --423652352, -428781088, -433596800, -438024384, -441962336, -445481536, -448564768, -451039200, -453010080, -454851008, --456647904, -458242400, -459807392, -461649376, -463540256, -464983360, -465905152, -466422176, -466403936, -465932000, --465512192, -465289920, -464921632, -464530784, -464633856, -465020416, -465081600, -465055840, -465463328, -465917504, --466071584, -466539200, -467415936, -467811584, -468096672, -469604192, -471310368, -471249728, -471386624, -474611072, --477533792, -475729376, -474826336, -482493408, -490060064, -481175936, -461027168, -453999520, -466616000, -478818528, --481039552, -489577952, -509314944, -512657504, -480248736, -437299072, -422137312, -437084864, -454490208, -455429728, --441966080, -425956064, -420154624, -421830208, -396297696, -307272160, -179973088, -99357624, -118199648, -194585104, --249248224, -258870032, -258446432, -271055936, -276278080, -246866128, -186275952, -122813520, -84121232, }, +-222357440, -401378656, -405117408, -177587776, 175398416, 484049792, 639197952, 636222080, 529849184, 372046176, +190520992, 1207423, -180006368, -338932512, -467017568, -559677696, -613684800, -628635008, -609800512, -567096768, +-509938784, -443115008, -367884352, -286288032, -202992496, -122816200, -47916804, 21818970, 86701968, 146555552, +201343232, 251326992, 296677536, 337539328, 374389088, 407893568, 438432960, 465938464, 490061664, 510374176, +526579648, 538713472, 547120320, 552200192, 554222592, 553347456, 549751488, 543766464, 535939456, 526901760, +517067360, 506422816, 494632608, 481365440, 466567136, 450447584, 433289184, 415364128, 397026784, 378695328, +360628000, 342847360, 325416256, 308596096, 292586048, 277312064, 262696848, 248960464, 236373520, 224892000, +214347328, 204829680, 196494224, 189083248, 182072784, 175281904, 168897440, 162823824, 156483920, 149478288, +142028128, 134456640, 126554432, 117843168, 108263240, 98220000, 88029112, 77636368, 66831840, 55431384, +43236900, 30057792, 15797427, 396748, -16277389, -34321620, -53564684, -73533064, -93622768, -113299624, +-132184064, -149990464, -166375216, -180912608, -193301984, -203518096, -211669408, -217803168, -221992368, -224550016, +-226047344, -227133440, -228310256, -229737808, -231250704, -232713680, -234367776, -236709600, -240074720, -244437856, +-249490896, -254743104, -259698416, -264169472, -268354384, -272495264, -276597504, -280563904, -284394496, -288109632, +-291644384, -294928960, -297945088, -300674560, -303140928, -305479552, -307833728, -310224960, -312618848, -315017056, +-317417952, -319834400, -322408160, -325350208, -328767936, -332695136, -337183936, -342184864, -347478432, -352943776, +-358699552, -364821504, -371184480, -377744512, -384615936, -391724640, -398746368, -405488928, -411961440, -418068352, +-423652352, -428781088, -433596800, -438024384, -441962336, -445481536, -448564768, -451039200, -453010080, -454851008, +-456647904, -458242400, -459807392, -461649376, -463540256, -464983360, -465905152, -466422176, -466403936, -465932000, +-465512192, -465289920, -464921632, -464530784, -464633856, -465020416, -465081600, -465055840, -465463328, -465917504, +-466071584, -466539200, -467415936, -467811584, -468096672, -469604192, -471310368, -471249728, -471386624, -474611072, +-477533792, -475729376, -474826336, -482493408, -490060064, -481175936, -461027168, -453999520, -466616000, -478818528, +-481039552, -489577952, -509314944, -512657504, -480248736, -437299072, -422137312, -437084864, -454490208, -455429728, +-441966080, -425956064, -420154624, -421830208, -396297696, -307272160, -179973088, -99357624, -118199648, -194585104, +-249248224, -258870032, -258446432, -271055936, -276278080, -246866128, -186275952, -122813520, -84121232, }, }, { { 62659816, -38722352, -11076184, -60224032, -64550676, -17122960, 36206036, 49209052, 21104396, -18492518, -45760192, --51160576, -33653752, -3940096, 18916110, 27378806, 33587716, 49711564, 70036424, 80460840, 76390288, -62512712, 42136852, 16138340, -11113765, -32715302, -45996416, -54346368, -62400508, -71465568, -79259328, --82685640, -80657336, -74535400, -66313220, -57463980, -49786188, -45816564, -47165720, -53153980, -61890480, --72054520, -83056080, -94266480, -104957192, -114767432, -123768608, -132179768, -140125456, -147380736, -153205776, --156636928, -157067488, -154404608, -148668688, -139690048, -127354904, -111901080, -93701688, -72853920, -49290656, --23210540, 4962298, 34977140, 66672388, 99487552, 132486320, 164877360, 196077600, 225302704, 251551408, -274001184, 292006240, 304865920, 312142112, 314117280, 311378688, 304061664, 292163008, 276567968, 258962368, -240438176, 220876752, 200222256, 179760480, 161236832, 144897168, 129446560, 114223584, 100441032, 89645632, -81753088, 75438952, 69926896, 65512208, 62658740, 61415348, 61547956, 62589484, 63835564, 64725156, -65174520, 65392488, 65549792, 65541736, 64729452, 62083216, 57110180, 50492172, 43350180, 36120676, -28581934, 20549272, 12043625, 3192771, -5557151, -13465796, -20022064, -25061672, -28369332, -29724932, --29306172, -27434640, -24060406, -19061602, -12779675, -5724655, 1852742, 9672266, 17251274, 24357296, -31011812, 36879272, 41431940, 44782552, 47552804, 50098648, 52689048, 55994564, 60378112, 65176128, -69586520, 73636144, 77542416, 81007376, 83853328, 86369104, 88510688, 89804544, 90308128, 90538984, -90499256, 89949504, 89303648, 89043264, 88824752, 88268024, 87730072, 87346752, 86524264, 85144504, -83846888, 82624968, 80781352, 78412680, 76166416, 73822432, 70982928, 68426880, 66885524, 65678104, -64276868, 63483376, 63561756, 63418412, 62732292, 62209916, 61218852, 58342300, 54159000, 49993956, -44940392, 37859600, 30307436, 23600846, 16100759, 7088307, -1053878, -7720741, -15330349, -23497230, --29404956, -34690452, -42556148, -49550500, -52049636, -56297896, -66867272, -73780024, -70877696, -73289320, --89980104, -98395016, -84137872, -82304992, -124999120, -167590160, -137833552, -51009180, 2131378, -13793287, --42914776, -47504484, -63734632, -112846504, -139538656, -94187024, -16139950, 21853330, 10275172, -6083285, --2624762, 3426310, -12224551, -53722524, -98392872, -104956656, -52281028, 21005074, 46271292, 6119792, --45652280, -58137216, -42524472, -37187436, -46717968, -46745352, -29186988, -10275709, -1818919, }, +38722352, -11076184, -60224032, -64550676, -17122960, 36206036, 49209052, 21104396, -18492518, -45760192, +-51160576, -33653752, -3940096, 18916110, 27378806, 33587716, 49711564, 70036424, 80460840, 76390288, +62512712, 42136852, 16138340, -11113765, -32715302, -45996416, -54346368, -62400508, -71465568, -79259328, +-82685640, -80657336, -74535400, -66313220, -57463980, -49786188, -45816564, -47165720, -53153980, -61890480, +-72054520, -83056080, -94266480, -104957192, -114767432, -123768608, -132179768, -140125456, -147380736, -153205776, +-156636928, -157067488, -154404608, -148668688, -139690048, -127354904, -111901080, -93701688, -72853920, -49290656, +-23210540, 4962298, 34977140, 66672388, 99487552, 132486320, 164877360, 196077600, 225302704, 251551408, +274001184, 292006240, 304865920, 312142112, 314117280, 311378688, 304061664, 292163008, 276567968, 258962368, +240438176, 220876752, 200222256, 179760480, 161236832, 144897168, 129446560, 114223584, 100441032, 89645632, +81753088, 75438952, 69926896, 65512208, 62658740, 61415348, 61547956, 62589484, 63835564, 64725156, +65174520, 65392488, 65549792, 65541736, 64729452, 62083216, 57110180, 50492172, 43350180, 36120676, +28581934, 20549272, 12043625, 3192771, -5557151, -13465796, -20022064, -25061672, -28369332, -29724932, +-29306172, -27434640, -24060406, -19061602, -12779675, -5724655, 1852742, 9672266, 17251274, 24357296, +31011812, 36879272, 41431940, 44782552, 47552804, 50098648, 52689048, 55994564, 60378112, 65176128, +69586520, 73636144, 77542416, 81007376, 83853328, 86369104, 88510688, 89804544, 90308128, 90538984, +90499256, 89949504, 89303648, 89043264, 88824752, 88268024, 87730072, 87346752, 86524264, 85144504, +83846888, 82624968, 80781352, 78412680, 76166416, 73822432, 70982928, 68426880, 66885524, 65678104, +64276868, 63483376, 63561756, 63418412, 62732292, 62209916, 61218852, 58342300, 54159000, 49993956, +44940392, 37859600, 30307436, 23600846, 16100759, 7088307, -1053878, -7720741, -15330349, -23497230, +-29404956, -34690452, -42556148, -49550500, -52049636, -56297896, -66867272, -73780024, -70877696, -73289320, +-89980104, -98395016, -84137872, -82304992, -124999120, -167590160, -137833552, -51009180, 2131378, -13793287, +-42914776, -47504484, -63734632, -112846504, -139538656, -94187024, -16139950, 21853330, 10275172, -6083285, +-2624762, 3426310, -12224551, -53722524, -98392872, -104956656, -52281028, 21005074, 46271292, 6119792, +-45652280, -58137216, -42524472, -37187436, -46717968, -46745352, -29186988, -10275709, -1818919, }, { 62659816, -38722352, -11076184, -60224032, -64550676, -17122960, 36206036, 49209052, 21104396, -18492518, -45760192, --51160576, -33653752, -3940096, 18916110, 27378806, 33587716, 49711564, 70036424, 80460840, 76390288, -62512712, 42136852, 16138340, -11113765, -32715302, -45996416, -54346368, -62400508, -71465568, -79259328, --82685640, -80657336, -74535400, -66313220, -57463980, -49786188, -45816564, -47165720, -53153980, -61890480, --72054520, -83056080, -94266480, -104957192, -114767432, -123768608, -132179768, -140125456, -147380736, -153205776, --156636928, -157067488, -154404608, -148668688, -139690048, -127354904, -111901080, -93701688, -72853920, -49290656, --23210540, 4962298, 34977140, 66672388, 99487552, 132486320, 164877360, 196077600, 225302704, 251551408, -274001184, 292006240, 304865920, 312142112, 314117280, 311378688, 304061664, 292163008, 276567968, 258962368, -240438176, 220876752, 200222256, 179760480, 161236832, 144897168, 129446560, 114223584, 100441032, 89645632, -81753088, 75438952, 69926896, 65512208, 62658740, 61415348, 61547956, 62589484, 63835564, 64725156, -65174520, 65392488, 65549792, 65541736, 64729452, 62083216, 57110180, 50492172, 43350180, 36120676, -28581934, 20549272, 12043625, 3192771, -5557151, -13465796, -20022064, -25061672, -28369332, -29724932, --29306172, -27434640, -24060406, -19061602, -12779675, -5724655, 1852742, 9672266, 17251274, 24357296, -31011812, 36879272, 41431940, 44782552, 47552804, 50098648, 52689048, 55994564, 60378112, 65176128, -69586520, 73636144, 77542416, 81007376, 83853328, 86369104, 88510688, 89804544, 90308128, 90538984, -90499256, 89949504, 89303648, 89043264, 88824752, 88268024, 87730072, 87346752, 86524264, 85144504, -83846888, 82624968, 80781352, 78412680, 76166416, 73822432, 70982928, 68426880, 66885524, 65678104, -64276868, 63483376, 63561756, 63418412, 62732292, 62209916, 61218852, 58342300, 54159000, 49993956, -44940392, 37859600, 30307436, 23600846, 16100759, 7088307, -1053878, -7720741, -15330349, -23497230, --29404956, -34690452, -42556148, -49550500, -52049636, -56297896, -66867272, -73780024, -70877696, -73289320, --89980104, -98395016, -84137872, -82304992, -124999120, -167590160, -137833552, -51009180, 2131378, -13793287, --42914776, -47504484, -63734632, -112846504, -139538656, -94187024, -16139950, 21853330, 10275172, -6083285, --2624762, 3426310, -12224551, -53722524, -98392872, -104956656, -52281028, 21005074, 46271292, 6119792, --45652280, -58137216, -42524472, -37187436, -46717968, -46745352, -29186988, -10275709, -1818919, }, +38722352, -11076184, -60224032, -64550676, -17122960, 36206036, 49209052, 21104396, -18492518, -45760192, +-51160576, -33653752, -3940096, 18916110, 27378806, 33587716, 49711564, 70036424, 80460840, 76390288, +62512712, 42136852, 16138340, -11113765, -32715302, -45996416, -54346368, -62400508, -71465568, -79259328, +-82685640, -80657336, -74535400, -66313220, -57463980, -49786188, -45816564, -47165720, -53153980, -61890480, +-72054520, -83056080, -94266480, -104957192, -114767432, -123768608, -132179768, -140125456, -147380736, -153205776, +-156636928, -157067488, -154404608, -148668688, -139690048, -127354904, -111901080, -93701688, -72853920, -49290656, +-23210540, 4962298, 34977140, 66672388, 99487552, 132486320, 164877360, 196077600, 225302704, 251551408, +274001184, 292006240, 304865920, 312142112, 314117280, 311378688, 304061664, 292163008, 276567968, 258962368, +240438176, 220876752, 200222256, 179760480, 161236832, 144897168, 129446560, 114223584, 100441032, 89645632, +81753088, 75438952, 69926896, 65512208, 62658740, 61415348, 61547956, 62589484, 63835564, 64725156, +65174520, 65392488, 65549792, 65541736, 64729452, 62083216, 57110180, 50492172, 43350180, 36120676, +28581934, 20549272, 12043625, 3192771, -5557151, -13465796, -20022064, -25061672, -28369332, -29724932, +-29306172, -27434640, -24060406, -19061602, -12779675, -5724655, 1852742, 9672266, 17251274, 24357296, +31011812, 36879272, 41431940, 44782552, 47552804, 50098648, 52689048, 55994564, 60378112, 65176128, +69586520, 73636144, 77542416, 81007376, 83853328, 86369104, 88510688, 89804544, 90308128, 90538984, +90499256, 89949504, 89303648, 89043264, 88824752, 88268024, 87730072, 87346752, 86524264, 85144504, +83846888, 82624968, 80781352, 78412680, 76166416, 73822432, 70982928, 68426880, 66885524, 65678104, +64276868, 63483376, 63561756, 63418412, 62732292, 62209916, 61218852, 58342300, 54159000, 49993956, +44940392, 37859600, 30307436, 23600846, 16100759, 7088307, -1053878, -7720741, -15330349, -23497230, +-29404956, -34690452, -42556148, -49550500, -52049636, -56297896, -66867272, -73780024, -70877696, -73289320, +-89980104, -98395016, -84137872, -82304992, -124999120, -167590160, -137833552, -51009180, 2131378, -13793287, +-42914776, -47504484, -63734632, -112846504, -139538656, -94187024, -16139950, 21853330, 10275172, -6083285, +-2624762, 3426310, -12224551, -53722524, -98392872, -104956656, -52281028, 21005074, 46271292, 6119792, +-45652280, -58137216, -42524472, -37187436, -46717968, -46745352, -29186988, -10275709, -1818919, }, }, { { 30986042, -41208064, 31604516, -7399155, -42646876, -39767640, -8690329, 9193377, -9797894, -50169512, -80211200, --82558400, -61758408, -32665374, -6299107, 17018808, 44122736, 78785808, 115747760, 145393776, 161863360, -164769440, 156054960, 138911584, 118105696, 97078608, 74432320, 46010376, 10551661, -29061896, -69958040, --111732504, -154016992, -194130912, -228740288, -256414384, -277224576, -290905664, -296850944, -295474944, -288444640, --277581600, -264112576, -248858464, -232574624, -215908000, -199137776, -182061520, -164289472, -145810384, -127242704, --109562472, -93752696, -80578952, -70182984, -61754652, -53999552, -46059768, -37711424, -28867548, -19485730, --9903658, -617938, 8284992, 16995722, 25460566, 33608120, 41878616, 50787988, 60144576, 69420096, -78682728, 88327080, 98025648, 106839992, 114352432, 120786288, 125909112, 128759360, 128811440, 126640328, -122903712, 117325624, 109403016, 99716792, 89660664, 79934712, 70110512, 59742996, 49027588, 38056096, -26288958, 13349832, -290447, -14012331, -27895812, -42229728, -56575992, -69955888, -81798192, -92246232, --101595304, -109661792, -115653808, -118719336, -118834768, -117011016, -114291768, -110680232, -105365208, -97847408, --88574576, -78688632, -69342248, -60915520, -52671868, -43502112, -33178086, -22635014, -13069585, -5121212, -1269700, 6783364, 12419972, 18757732, 25522306, 32154272, 38526392, 44866840, 51430084, 58572616, -66713728, 75898512, 85738288, 95884072, 106171592, 116355496, 126199024, 135748880, 145082928, 153948272, -162009920, 169149232, 175212112, 179893632, 183124528, 185137792, 186045104, 185845376, 184825872, 183374704, -181551488, 179378768, 177229136, 175403776, 173817328, 172571792, 172180944, 172819280, 174104016, 175875152, -178309328, 181149376, 183806880, 186217968, 188689728, 191221600, 193850672, 197067600, 201028096, 205163616, -209240064, 213670336, 218358816, 222652176, 226637904, 230825504, 234698480, 237382304, 239169552, 240502064, -240591712, 238975200, 236730000, 234369392, 230888848, 226354976, 222320928, 218723888, 214212560, 209614272, -206391968, 202894256, 197778944, 194057904, 192942272, 189404304, 182277872, 179474880, 182312768, 178666880, -166541120, 164434432, 176035680, 170421088, 132294656, 105728136, 138884208, 204635872, 234144976, 216945776, -202112576, 205021344, 188581808, 148576880, 140651056, 192015632, 251442960, 265291008, 249755040, 247953824, -261581232, 266896240, 260015712, 244418000, 205954416, 143459968, 99007584, 113309824, 165628432, 198232064, -192291584, 181625584, 192703376, 208599040, 204571984, 191691376, 202913040, 245402080, 285669536, }, +41208064, 31604516, -7399155, -42646876, -39767640, -8690329, 9193377, -9797894, -50169512, -80211200, +-82558400, -61758408, -32665374, -6299107, 17018808, 44122736, 78785808, 115747760, 145393776, 161863360, +164769440, 156054960, 138911584, 118105696, 97078608, 74432320, 46010376, 10551661, -29061896, -69958040, +-111732504, -154016992, -194130912, -228740288, -256414384, -277224576, -290905664, -296850944, -295474944, -288444640, +-277581600, -264112576, -248858464, -232574624, -215908000, -199137776, -182061520, -164289472, -145810384, -127242704, +-109562472, -93752696, -80578952, -70182984, -61754652, -53999552, -46059768, -37711424, -28867548, -19485730, +-9903658, -617938, 8284992, 16995722, 25460566, 33608120, 41878616, 50787988, 60144576, 69420096, +78682728, 88327080, 98025648, 106839992, 114352432, 120786288, 125909112, 128759360, 128811440, 126640328, +122903712, 117325624, 109403016, 99716792, 89660664, 79934712, 70110512, 59742996, 49027588, 38056096, +26288958, 13349832, -290447, -14012331, -27895812, -42229728, -56575992, -69955888, -81798192, -92246232, +-101595304, -109661792, -115653808, -118719336, -118834768, -117011016, -114291768, -110680232, -105365208, -97847408, +-88574576, -78688632, -69342248, -60915520, -52671868, -43502112, -33178086, -22635014, -13069585, -5121212, +1269700, 6783364, 12419972, 18757732, 25522306, 32154272, 38526392, 44866840, 51430084, 58572616, +66713728, 75898512, 85738288, 95884072, 106171592, 116355496, 126199024, 135748880, 145082928, 153948272, +162009920, 169149232, 175212112, 179893632, 183124528, 185137792, 186045104, 185845376, 184825872, 183374704, +181551488, 179378768, 177229136, 175403776, 173817328, 172571792, 172180944, 172819280, 174104016, 175875152, +178309328, 181149376, 183806880, 186217968, 188689728, 191221600, 193850672, 197067600, 201028096, 205163616, +209240064, 213670336, 218358816, 222652176, 226637904, 230825504, 234698480, 237382304, 239169552, 240502064, +240591712, 238975200, 236730000, 234369392, 230888848, 226354976, 222320928, 218723888, 214212560, 209614272, +206391968, 202894256, 197778944, 194057904, 192942272, 189404304, 182277872, 179474880, 182312768, 178666880, +166541120, 164434432, 176035680, 170421088, 132294656, 105728136, 138884208, 204635872, 234144976, 216945776, +202112576, 205021344, 188581808, 148576880, 140651056, 192015632, 251442960, 265291008, 249755040, 247953824, +261581232, 266896240, 260015712, 244418000, 205954416, 143459968, 99007584, 113309824, 165628432, 198232064, +192291584, 181625584, 192703376, 208599040, 204571984, 191691376, 202913040, 245402080, 285669536, }, { 30986042, -41208064, 31604516, -7399155, -42646876, -39767640, -8690329, 9193377, -9797894, -50169512, -80211200, --82558400, -61758408, -32665374, -6299107, 17018808, 44122736, 78785808, 115747760, 145393776, 161863360, -164769440, 156054960, 138911584, 118105696, 97078608, 74432320, 46010376, 10551661, -29061896, -69958040, --111732504, -154016992, -194130912, -228740288, -256414384, -277224576, -290905664, -296850944, -295474944, -288444640, --277581600, -264112576, -248858464, -232574624, -215908000, -199137776, -182061520, -164289472, -145810384, -127242704, --109562472, -93752696, -80578952, -70182984, -61754652, -53999552, -46059768, -37711424, -28867548, -19485730, --9903658, -617938, 8284992, 16995722, 25460566, 33608120, 41878616, 50787988, 60144576, 69420096, -78682728, 88327080, 98025648, 106839992, 114352432, 120786288, 125909112, 128759360, 128811440, 126640328, -122903712, 117325624, 109403016, 99716792, 89660664, 79934712, 70110512, 59742996, 49027588, 38056096, -26288958, 13349832, -290447, -14012331, -27895812, -42229728, -56575992, -69955888, -81798192, -92246232, --101595304, -109661792, -115653808, -118719336, -118834768, -117011016, -114291768, -110680232, -105365208, -97847408, --88574576, -78688632, -69342248, -60915520, -52671868, -43502112, -33178086, -22635014, -13069585, -5121212, -1269700, 6783364, 12419972, 18757732, 25522306, 32154272, 38526392, 44866840, 51430084, 58572616, -66713728, 75898512, 85738288, 95884072, 106171592, 116355496, 126199024, 135748880, 145082928, 153948272, -162009920, 169149232, 175212112, 179893632, 183124528, 185137792, 186045104, 185845376, 184825872, 183374704, -181551488, 179378768, 177229136, 175403776, 173817328, 172571792, 172180944, 172819280, 174104016, 175875152, -178309328, 181149376, 183806880, 186217968, 188689728, 191221600, 193850672, 197067600, 201028096, 205163616, -209240064, 213670336, 218358816, 222652176, 226637904, 230825504, 234698480, 237382304, 239169552, 240502064, -240591712, 238975200, 236730000, 234369392, 230888848, 226354976, 222320928, 218723888, 214212560, 209614272, -206391968, 202894256, 197778944, 194057904, 192942272, 189404304, 182277872, 179474880, 182312768, 178666880, -166541120, 164434432, 176035680, 170421088, 132294656, 105728136, 138884208, 204635872, 234144976, 216945776, -202112576, 205021344, 188581808, 148576880, 140651056, 192015632, 251442960, 265291008, 249755040, 247953824, -261581232, 266896240, 260015712, 244418000, 205954416, 143459968, 99007584, 113309824, 165628432, 198232064, -192291584, 181625584, 192703376, 208599040, 204571984, 191691376, 202913040, 245402080, 285669536, }, +41208064, 31604516, -7399155, -42646876, -39767640, -8690329, 9193377, -9797894, -50169512, -80211200, +-82558400, -61758408, -32665374, -6299107, 17018808, 44122736, 78785808, 115747760, 145393776, 161863360, +164769440, 156054960, 138911584, 118105696, 97078608, 74432320, 46010376, 10551661, -29061896, -69958040, +-111732504, -154016992, -194130912, -228740288, -256414384, -277224576, -290905664, -296850944, -295474944, -288444640, +-277581600, -264112576, -248858464, -232574624, -215908000, -199137776, -182061520, -164289472, -145810384, -127242704, +-109562472, -93752696, -80578952, -70182984, -61754652, -53999552, -46059768, -37711424, -28867548, -19485730, +-9903658, -617938, 8284992, 16995722, 25460566, 33608120, 41878616, 50787988, 60144576, 69420096, +78682728, 88327080, 98025648, 106839992, 114352432, 120786288, 125909112, 128759360, 128811440, 126640328, +122903712, 117325624, 109403016, 99716792, 89660664, 79934712, 70110512, 59742996, 49027588, 38056096, +26288958, 13349832, -290447, -14012331, -27895812, -42229728, -56575992, -69955888, -81798192, -92246232, +-101595304, -109661792, -115653808, -118719336, -118834768, -117011016, -114291768, -110680232, -105365208, -97847408, +-88574576, -78688632, -69342248, -60915520, -52671868, -43502112, -33178086, -22635014, -13069585, -5121212, +1269700, 6783364, 12419972, 18757732, 25522306, 32154272, 38526392, 44866840, 51430084, 58572616, +66713728, 75898512, 85738288, 95884072, 106171592, 116355496, 126199024, 135748880, 145082928, 153948272, +162009920, 169149232, 175212112, 179893632, 183124528, 185137792, 186045104, 185845376, 184825872, 183374704, +181551488, 179378768, 177229136, 175403776, 173817328, 172571792, 172180944, 172819280, 174104016, 175875152, +178309328, 181149376, 183806880, 186217968, 188689728, 191221600, 193850672, 197067600, 201028096, 205163616, +209240064, 213670336, 218358816, 222652176, 226637904, 230825504, 234698480, 237382304, 239169552, 240502064, +240591712, 238975200, 236730000, 234369392, 230888848, 226354976, 222320928, 218723888, 214212560, 209614272, +206391968, 202894256, 197778944, 194057904, 192942272, 189404304, 182277872, 179474880, 182312768, 178666880, +166541120, 164434432, 176035680, 170421088, 132294656, 105728136, 138884208, 204635872, 234144976, 216945776, +202112576, 205021344, 188581808, 148576880, 140651056, 192015632, 251442960, 265291008, 249755040, 247953824, +261581232, 266896240, 260015712, 244418000, 205954416, 143459968, 99007584, 113309824, 165628432, 198232064, +192291584, 181625584, 192703376, 208599040, 204571984, 191691376, 202913040, 245402080, 285669536, }, }, { { 11927661, -8254391, 9876814, 18951544, 25066502, 20257214, 11820287, 10667088, 10446971, -9302362, -55198920, --104534136, -125722816, -109843248, -74312064, -38511360, -5645198, 30492658, 71030704, 110766136, 145943520, -176026016, 199234400, 212091920, 213726160, 206675968, 192827392, 171563536, 142487152, 107303312, 68175624, -26241176, -17527762, -61694520, -105109664, -146663472, -183782720, -212766768, -231493904, -240935856, -243704496, --242107840, -237774224, -231883680, -225010112, -217201872, -208442816, -198703984, -187731952, -175365664, -161985232, --148284288, -134872704, -122400664, -111573584, -102565432, -94773824, -87489560, -80411448, -73331736, -65885872, --57874148, -49357228, -40272836, -30412664, -19817516, -8664023, 3191161, 16006269, 29560650, 43398496, -57560076, 72373424, 87538952, 102159016, 115723064, 128294432, 139524704, 148304144, 153923568, 156971920, -158372624, 157951712, 154864704, 149269984, 142480704, 135179808, 126514704, 115569520, 102871984, 89632744, -76167488, 62046708, 47436840, 33361158, 20686710, 9515500, -448824, -9395241, -17293148, -24054502, --29786136, -34851512, -39529268, -43786656, -47688096, -51757576, -56459492, -61477624, -65965864, -69410432, --71972912, -74226160, -76795088, -79890152, -82914880, -84863184, -85312008, -84779968, -84113176, -83900576, --84370872, -85315232, -86102816, -86176368, -85496152, -84269408, -82502560, -80073760, -76879912, -72683192, --67184024, -60457032, -52966072, -45120780, -37196028, -29571386, -22559852, -16127065, -10208064, -5068062, --988379, 2062121, 4139275, 5170067, 5339181, 5119601, 4758824, 4228396, 3674882, 3360812, -3291556, 3446175, 4119948, 5566815, 7716446, 10654740, 14766098, 20049982, 26006026, 32377074, -39221640, 46223512, 52858164, 59122908, 65221764, 70902928, 75974216, 80866720, 85869816, 90633472, -95081984, 99736656, 104685536, 109496968, 114285320, 119390968, 124223336, 128051768, 131315400, 134485088, -136825312, 137965616, 138964208, 140230688, 140711712, 140338064, 140336448, 140453488, 139494096, 138376864, -138341968, 137693424, 135427296, 134630576, 136169248, 135092288, 130763504, 130876784, 135851968, 133693744, -123466888, 123273080, 134919952, 127440272, 88057568, 62094488, 96197600, 162636992, 193965024, 178560576, -161589552, 159551056, 143084144, 110318920, 107009112, 151814208, 200674288, 212477408, 201375984, 198243872, -203621712, 203391392, 192545536, 163330096, 109403016, 60814588, 71439800, 145763680, 217600224, 230700416, -205281184, 193948912, 206018304, 213945200, 208341344, 202911440, 198481184, 183370944, 164960560, }, +8254391, 9876814, 18951544, 25066502, 20257214, 11820287, 10667088, 10446971, -9302362, -55198920, +-104534136, -125722816, -109843248, -74312064, -38511360, -5645198, 30492658, 71030704, 110766136, 145943520, +176026016, 199234400, 212091920, 213726160, 206675968, 192827392, 171563536, 142487152, 107303312, 68175624, +26241176, -17527762, -61694520, -105109664, -146663472, -183782720, -212766768, -231493904, -240935856, -243704496, +-242107840, -237774224, -231883680, -225010112, -217201872, -208442816, -198703984, -187731952, -175365664, -161985232, +-148284288, -134872704, -122400664, -111573584, -102565432, -94773824, -87489560, -80411448, -73331736, -65885872, +-57874148, -49357228, -40272836, -30412664, -19817516, -8664023, 3191161, 16006269, 29560650, 43398496, +57560076, 72373424, 87538952, 102159016, 115723064, 128294432, 139524704, 148304144, 153923568, 156971920, +158372624, 157951712, 154864704, 149269984, 142480704, 135179808, 126514704, 115569520, 102871984, 89632744, +76167488, 62046708, 47436840, 33361158, 20686710, 9515500, -448824, -9395241, -17293148, -24054502, +-29786136, -34851512, -39529268, -43786656, -47688096, -51757576, -56459492, -61477624, -65965864, -69410432, +-71972912, -74226160, -76795088, -79890152, -82914880, -84863184, -85312008, -84779968, -84113176, -83900576, +-84370872, -85315232, -86102816, -86176368, -85496152, -84269408, -82502560, -80073760, -76879912, -72683192, +-67184024, -60457032, -52966072, -45120780, -37196028, -29571386, -22559852, -16127065, -10208064, -5068062, +-988379, 2062121, 4139275, 5170067, 5339181, 5119601, 4758824, 4228396, 3674882, 3360812, +3291556, 3446175, 4119948, 5566815, 7716446, 10654740, 14766098, 20049982, 26006026, 32377074, +39221640, 46223512, 52858164, 59122908, 65221764, 70902928, 75974216, 80866720, 85869816, 90633472, +95081984, 99736656, 104685536, 109496968, 114285320, 119390968, 124223336, 128051768, 131315400, 134485088, +136825312, 137965616, 138964208, 140230688, 140711712, 140338064, 140336448, 140453488, 139494096, 138376864, +138341968, 137693424, 135427296, 134630576, 136169248, 135092288, 130763504, 130876784, 135851968, 133693744, +123466888, 123273080, 134919952, 127440272, 88057568, 62094488, 96197600, 162636992, 193965024, 178560576, +161589552, 159551056, 143084144, 110318920, 107009112, 151814208, 200674288, 212477408, 201375984, 198243872, +203621712, 203391392, 192545536, 163330096, 109403016, 60814588, 71439800, 145763680, 217600224, 230700416, +205281184, 193948912, 206018304, 213945200, 208341344, 202911440, 198481184, 183370944, 164960560, }, { -11927661, --8254391, -9876814, -18951544, -25066502, -20257214, -11820287, -10667088, -10446971, 9302362, 55198920, -104534136, 125722816, 109843248, 74312064, 38511360, 5645198, -30492658, -71030704, -110766136, -145943520, --176026016, -199234400, -212091920, -213726160, -206675968, -192827392, -171563536, -142487152, -107303312, -68175624, --26241176, 17527762, 61694520, 105109664, 146663472, 183782720, 212766768, 231493904, 240935856, 243704496, -242107840, 237774224, 231883680, 225010112, 217201872, 208442816, 198703984, 187731952, 175365664, 161985232, -148284288, 134872704, 122400664, 111573584, 102565432, 94773824, 87489560, 80411448, 73331736, 65885872, -57874148, 49357228, 40272836, 30412664, 19817516, 8664023, -3191161, -16006269, -29560650, -43398496, --57560076, -72373424, -87538952, -102159016, -115723064, -128294432, -139524704, -148304144, -153923568, -156971920, --158372624, -157951712, -154864704, -149269984, -142480704, -135179808, -126514704, -115569520, -102871984, -89632744, --76167488, -62046708, -47436840, -33361158, -20686710, -9515500, 448824, 9395241, 17293148, 24054502, -29786136, 34851512, 39529268, 43786656, 47688096, 51757576, 56459492, 61477624, 65965864, 69410432, -71972912, 74226160, 76795088, 79890152, 82914880, 84863184, 85312008, 84779968, 84113176, 83900576, -84370872, 85315232, 86102816, 86176368, 85496152, 84269408, 82502560, 80073760, 76879912, 72683192, -67184024, 60457032, 52966072, 45120780, 37196028, 29571386, 22559852, 16127065, 10208064, 5068062, -988379, -2062121, -4139275, -5170067, -5339181, -5119601, -4758824, -4228396, -3674882, -3360812, --3291556, -3446175, -4119948, -5566815, -7716446, -10654740, -14766098, -20049982, -26006026, -32377074, --39221640, -46223512, -52858164, -59122908, -65221764, -70902928, -75974216, -80866720, -85869816, -90633472, --95081984, -99736656, -104685536, -109496968, -114285320, -119390968, -124223336, -128051768, -131315400, -134485088, --136825312, -137965616, -138964208, -140230688, -140711712, -140338064, -140336448, -140453488, -139494096, -138376864, --138341968, -137693424, -135427296, -134630576, -136169248, -135092288, -130763504, -130876784, -135851968, -133693744, --123466888, -123273080, -134919952, -127440272, -88057568, -62094488, -96197600, -162636992, -193965024, -178560576, --161589552, -159551056, -143084144, -110318920, -107009112, -151814208, -200674288, -212477408, -201375984, -198243872, --203621712, -203391392, -192545536, -163330096, -109403016, -60814588, -71439800, -145763680, -217600224, -230700416, --205281184, -193948912, -206018304, -213945200, -208341344, -202911440, -198481184, -183370944, -164960560, }, +-8254391, -9876814, -18951544, -25066502, -20257214, -11820287, -10667088, -10446971, 9302362, 55198920, +104534136, 125722816, 109843248, 74312064, 38511360, 5645198, -30492658, -71030704, -110766136, -145943520, +-176026016, -199234400, -212091920, -213726160, -206675968, -192827392, -171563536, -142487152, -107303312, -68175624, +-26241176, 17527762, 61694520, 105109664, 146663472, 183782720, 212766768, 231493904, 240935856, 243704496, +242107840, 237774224, 231883680, 225010112, 217201872, 208442816, 198703984, 187731952, 175365664, 161985232, +148284288, 134872704, 122400664, 111573584, 102565432, 94773824, 87489560, 80411448, 73331736, 65885872, +57874148, 49357228, 40272836, 30412664, 19817516, 8664023, -3191161, -16006269, -29560650, -43398496, +-57560076, -72373424, -87538952, -102159016, -115723064, -128294432, -139524704, -148304144, -153923568, -156971920, +-158372624, -157951712, -154864704, -149269984, -142480704, -135179808, -126514704, -115569520, -102871984, -89632744, +-76167488, -62046708, -47436840, -33361158, -20686710, -9515500, 448824, 9395241, 17293148, 24054502, +29786136, 34851512, 39529268, 43786656, 47688096, 51757576, 56459492, 61477624, 65965864, 69410432, +71972912, 74226160, 76795088, 79890152, 82914880, 84863184, 85312008, 84779968, 84113176, 83900576, +84370872, 85315232, 86102816, 86176368, 85496152, 84269408, 82502560, 80073760, 76879912, 72683192, +67184024, 60457032, 52966072, 45120780, 37196028, 29571386, 22559852, 16127065, 10208064, 5068062, +988379, -2062121, -4139275, -5170067, -5339181, -5119601, -4758824, -4228396, -3674882, -3360812, +-3291556, -3446175, -4119948, -5566815, -7716446, -10654740, -14766098, -20049982, -26006026, -32377074, +-39221640, -46223512, -52858164, -59122908, -65221764, -70902928, -75974216, -80866720, -85869816, -90633472, +-95081984, -99736656, -104685536, -109496968, -114285320, -119390968, -124223336, -128051768, -131315400, -134485088, +-136825312, -137965616, -138964208, -140230688, -140711712, -140338064, -140336448, -140453488, -139494096, -138376864, +-138341968, -137693424, -135427296, -134630576, -136169248, -135092288, -130763504, -130876784, -135851968, -133693744, +-123466888, -123273080, -134919952, -127440272, -88057568, -62094488, -96197600, -162636992, -193965024, -178560576, +-161589552, -159551056, -143084144, -110318920, -107009112, -151814208, -200674288, -212477408, -201375984, -198243872, +-203621712, -203391392, -192545536, -163330096, -109403016, -60814588, -71439800, -145763680, -217600224, -230700416, +-205281184, -193948912, -206018304, -213945200, -208341344, -202911440, -198481184, -183370944, -164960560, }, }, { { 1845225, --6548752, -645856, 11326366, -1323924, -23360328, 516470, 70470752, 103799160, 39323108, -75782016, --143958176, -129812168, -75616656, -29047400, 1406065, 27227946, 53433688, 77974592, 97599912, 107780056, -105458088, 93229784, 76283984, 57622892, 39669928, 26154204, 18576808, 14652818, 12916040, 14906758, -20847772, 27242440, 30925376, 32439352, 33878164, 35633196, 36080408, 32869384, 24407762, 11307575, --3862249, -18832358, -32844152, -45603424, -56769268, -66952636, -77589656, -89338544, -101743480, -114375512, --127040840, -139149968, -149981872, -159129616, -165848544, -168823888, -167367360, -161885904, -152643136, -139270752, --121952912, -101701608, -79026864, -53646824, -25821880, 3289408, 32758252, 62168040, 90734408, 117222008, -140673600, 160389648, 175473568, 185248384, 189831120, 189608304, 184527360, 174534592, 160388032, 143417008, -124507344, 103677824, 80807128, 56646860, 32723892, 9984725, -11984032, -33844880, -55168320, -74984224, --93070328, -109669304, -124435936, -136741024, -146563616, -154035248, -158579312, -159456560, -156764688, -151126480, --142818944, -131737384, -117827056, -101433168, -83825416, -67174360, -53031572, -40934260, -29385630, -17978734, --7737921, 177167, 5261335, 7716983, 8515846, 8907225, 9329206, 9336722, 8757975, 8089571, -7758859, 7969312, 9200357, 11858942, 15609522, 19887310, 24648280, 29855928, 34891240, 39198020, -42775728, 45536316, 47085728, 47491064, 47281684, 46593416, 45326400, 43938052, 42950208, 42043972, -40720584, 39240968, 37930468, 36420248, 34454764, 32409286, 30368104, 27900108, 25135222, 22725746, -20629802, 18361522, 16196859, 14656576, 13375602, 11931956, 10887742, 10683731, 10726144, 10692858, -11195906, 12278238, 13072270, 13478681, 14211510, 15105937, 15531139, 16049756, 17460652, 19108310, -20259898, 21661668, 23775866, 25526064, 26405996, 27226872, 27671400, 26280368, 23406498, 20561620, -17145510, 11816529, 5853504, 878858, -4474282, -11355357, -17719424, -22552874, -28112708, -34612604, --39279088, -42917996, -48835388, -54687820, -56460568, -58741732, -66727148, -72850160, -70095480, -70104600, --82972328, -91474752, -80050136, -74722232, -105705584, -140526496, -115971096, -38424388, 14111652, 2777770, --27246736, -34520264, -43823700, -82118168, -112770272, -86500640, -19781008, 26624502, 25559350, 1846299, --14041859, -22708028, -49884436, -112187768, -181869312, -195415648, -123007328, -21627844, 17504676, -25101936, --81594176, -91303488, -68420440, -59377384, -72649368, -81596328, -73004784, -59483148, -52861920, }, +-6548752, -645856, 11326366, -1323924, -23360328, 516470, 70470752, 103799160, 39323108, -75782016, +-143958176, -129812168, -75616656, -29047400, 1406065, 27227946, 53433688, 77974592, 97599912, 107780056, +105458088, 93229784, 76283984, 57622892, 39669928, 26154204, 18576808, 14652818, 12916040, 14906758, +20847772, 27242440, 30925376, 32439352, 33878164, 35633196, 36080408, 32869384, 24407762, 11307575, +-3862249, -18832358, -32844152, -45603424, -56769268, -66952636, -77589656, -89338544, -101743480, -114375512, +-127040840, -139149968, -149981872, -159129616, -165848544, -168823888, -167367360, -161885904, -152643136, -139270752, +-121952912, -101701608, -79026864, -53646824, -25821880, 3289408, 32758252, 62168040, 90734408, 117222008, +140673600, 160389648, 175473568, 185248384, 189831120, 189608304, 184527360, 174534592, 160388032, 143417008, +124507344, 103677824, 80807128, 56646860, 32723892, 9984725, -11984032, -33844880, -55168320, -74984224, +-93070328, -109669304, -124435936, -136741024, -146563616, -154035248, -158579312, -159456560, -156764688, -151126480, +-142818944, -131737384, -117827056, -101433168, -83825416, -67174360, -53031572, -40934260, -29385630, -17978734, +-7737921, 177167, 5261335, 7716983, 8515846, 8907225, 9329206, 9336722, 8757975, 8089571, +7758859, 7969312, 9200357, 11858942, 15609522, 19887310, 24648280, 29855928, 34891240, 39198020, +42775728, 45536316, 47085728, 47491064, 47281684, 46593416, 45326400, 43938052, 42950208, 42043972, +40720584, 39240968, 37930468, 36420248, 34454764, 32409286, 30368104, 27900108, 25135222, 22725746, +20629802, 18361522, 16196859, 14656576, 13375602, 11931956, 10887742, 10683731, 10726144, 10692858, +11195906, 12278238, 13072270, 13478681, 14211510, 15105937, 15531139, 16049756, 17460652, 19108310, +20259898, 21661668, 23775866, 25526064, 26405996, 27226872, 27671400, 26280368, 23406498, 20561620, +17145510, 11816529, 5853504, 878858, -4474282, -11355357, -17719424, -22552874, -28112708, -34612604, +-39279088, -42917996, -48835388, -54687820, -56460568, -58741732, -66727148, -72850160, -70095480, -70104600, +-82972328, -91474752, -80050136, -74722232, -105705584, -140526496, -115971096, -38424388, 14111652, 2777770, +-27246736, -34520264, -43823700, -82118168, -112770272, -86500640, -19781008, 26624502, 25559350, 1846299, +-14041859, -22708028, -49884436, -112187768, -181869312, -195415648, -123007328, -21627844, 17504676, -25101936, +-81594176, -91303488, -68420440, -59377384, -72649368, -81596328, -73004784, -59483148, -52861920, }, { -1845225, -6548752, 645856, -11326366, 1323924, 23360328, -516470, -70470752, -103799160, -39323108, 75782016, -143958176, 129812168, 75616656, 29047400, -1406065, -27227946, -53433688, -77974592, -97599912, -107780056, --105458088, -93229784, -76283984, -57622892, -39669928, -26154204, -18576808, -14652818, -12916040, -14906758, --20847772, -27242440, -30925376, -32439352, -33878164, -35633196, -36080408, -32869384, -24407762, -11307575, -3862249, 18832358, 32844152, 45603424, 56769268, 66952636, 77589656, 89338544, 101743480, 114375512, -127040840, 139149968, 149981872, 159129616, 165848544, 168823888, 167367360, 161885904, 152643136, 139270752, -121952912, 101701608, 79026864, 53646824, 25821880, -3289408, -32758252, -62168040, -90734408, -117222008, --140673600, -160389648, -175473568, -185248384, -189831120, -189608304, -184527360, -174534592, -160388032, -143417008, --124507344, -103677824, -80807128, -56646860, -32723892, -9984725, 11984032, 33844880, 55168320, 74984224, -93070328, 109669304, 124435936, 136741024, 146563616, 154035248, 158579312, 159456560, 156764688, 151126480, -142818944, 131737384, 117827056, 101433168, 83825416, 67174360, 53031572, 40934260, 29385630, 17978734, -7737921, -177167, -5261335, -7716983, -8515846, -8907225, -9329206, -9336722, -8757975, -8089571, --7758859, -7969312, -9200357, -11858942, -15609522, -19887310, -24648280, -29855928, -34891240, -39198020, --42775728, -45536316, -47085728, -47491064, -47281684, -46593416, -45326400, -43938052, -42950208, -42043972, --40720584, -39240968, -37930468, -36420248, -34454764, -32409286, -30368104, -27900108, -25135222, -22725746, --20629802, -18361522, -16196859, -14656576, -13375602, -11931956, -10887742, -10683731, -10726144, -10692858, --11195906, -12278238, -13072270, -13478681, -14211510, -15105937, -15531139, -16049756, -17460652, -19108310, --20259898, -21661668, -23775866, -25526064, -26405996, -27226872, -27671400, -26280368, -23406498, -20561620, --17145510, -11816529, -5853504, -878858, 4474282, 11355357, 17719424, 22552874, 28112708, 34612604, -39279088, 42917996, 48835388, 54687820, 56460568, 58741732, 66727148, 72850160, 70095480, 70104600, -82972328, 91474752, 80050136, 74722232, 105705584, 140526496, 115971096, 38424388, -14111652, -2777770, -27246736, 34520264, 43823700, 82118168, 112770272, 86500640, 19781008, -26624502, -25559350, -1846299, -14041859, 22708028, 49884436, 112187768, 181869312, 195415648, 123007328, 21627844, -17504676, 25101936, -81594176, 91303488, 68420440, 59377384, 72649368, 81596328, 73004784, 59483148, 52861920, }, +6548752, 645856, -11326366, 1323924, 23360328, -516470, -70470752, -103799160, -39323108, 75782016, +143958176, 129812168, 75616656, 29047400, -1406065, -27227946, -53433688, -77974592, -97599912, -107780056, +-105458088, -93229784, -76283984, -57622892, -39669928, -26154204, -18576808, -14652818, -12916040, -14906758, +-20847772, -27242440, -30925376, -32439352, -33878164, -35633196, -36080408, -32869384, -24407762, -11307575, +3862249, 18832358, 32844152, 45603424, 56769268, 66952636, 77589656, 89338544, 101743480, 114375512, +127040840, 139149968, 149981872, 159129616, 165848544, 168823888, 167367360, 161885904, 152643136, 139270752, +121952912, 101701608, 79026864, 53646824, 25821880, -3289408, -32758252, -62168040, -90734408, -117222008, +-140673600, -160389648, -175473568, -185248384, -189831120, -189608304, -184527360, -174534592, -160388032, -143417008, +-124507344, -103677824, -80807128, -56646860, -32723892, -9984725, 11984032, 33844880, 55168320, 74984224, +93070328, 109669304, 124435936, 136741024, 146563616, 154035248, 158579312, 159456560, 156764688, 151126480, +142818944, 131737384, 117827056, 101433168, 83825416, 67174360, 53031572, 40934260, 29385630, 17978734, +7737921, -177167, -5261335, -7716983, -8515846, -8907225, -9329206, -9336722, -8757975, -8089571, +-7758859, -7969312, -9200357, -11858942, -15609522, -19887310, -24648280, -29855928, -34891240, -39198020, +-42775728, -45536316, -47085728, -47491064, -47281684, -46593416, -45326400, -43938052, -42950208, -42043972, +-40720584, -39240968, -37930468, -36420248, -34454764, -32409286, -30368104, -27900108, -25135222, -22725746, +-20629802, -18361522, -16196859, -14656576, -13375602, -11931956, -10887742, -10683731, -10726144, -10692858, +-11195906, -12278238, -13072270, -13478681, -14211510, -15105937, -15531139, -16049756, -17460652, -19108310, +-20259898, -21661668, -23775866, -25526064, -26405996, -27226872, -27671400, -26280368, -23406498, -20561620, +-17145510, -11816529, -5853504, -878858, 4474282, 11355357, 17719424, 22552874, 28112708, 34612604, +39279088, 42917996, 48835388, 54687820, 56460568, 58741732, 66727148, 72850160, 70095480, 70104600, +82972328, 91474752, 80050136, 74722232, 105705584, 140526496, 115971096, 38424388, -14111652, -2777770, +27246736, 34520264, 43823700, 82118168, 112770272, 86500640, 19781008, -26624502, -25559350, -1846299, +14041859, 22708028, 49884436, 112187768, 181869312, 195415648, 123007328, 21627844, -17504676, 25101936, +81594176, 91303488, 68420440, 59377384, 72649368, 81596328, 73004784, 59483148, 52861920, }, }, { { -7046431, --6595996, -15714212, -32926294, -43859132, -45169096, -49223008, -55187644, -35014184, 33172180, 127528320, -196871632, 209954112, 176739520, 124306552, 69076496, 16124918, -29955786, -64915208, -90075664, -109764872, --125263256, -135164768, -139116144, -137467952, -129359584, -114974128, -98802504, -87378960, -83409872, -83839376, --83728776, -80569832, -74706664, -67144296, -58140436, -47568912, -35586488, -22458920, -8252243, 6661495, -20977158, 33047088, 42269996, 49456012, 55735252, 61524868, 66627828, 70803608, 73946448, 75984952, -76842872, 76411760, 74481712, 70841728, 65519728, 58886148, 51526184, 44047036, 36909340, 30363808, -24545738, 19638202, 15870441, 13397614, 12285217, 12667469, 14854681, 19190988, 25785910, 34442416, -44936632, 57326540, 71794136, 88185344, 105971872, 124750008, 144440288, 164774816, 184924112, 203962624, -221463552, 237294800, 251020976, 261918912, 269517792, 273794496, 274895616, 272934432, 267964080, 259810080, -247952752, 231975472, 212308816, 190321808, 167449504, 144289968, 120732608, 96992176, 74397960, 54987392, -40226664, 30084098, 23371064, 18984292, 16791174, 17363480, 20999168, 27120570, 34506304, 41897404, -48382808, 53475028, 57052736, 59212568, 60022168, 59326920, 56791280, 52143588, 45437532, 37138044, -27927488, 18377092, 8764418, -850940, -10451266, -19975892, -29326036, -38453380, -47488916, -56699472, --66202088, -75788456, -85160072, -94262720, -103266584, -112363864, -121757488, -131678864, -142156976, -152831040, --163162048, -172762368, -181412432, -188911456, -195065600, -199749808, -202918944, -204654112, -205204944, -204860272, --203810160, -202237664, -200407472, -198504800, -196525360, -194462704, -192439760, -190548368, -188756304, -187067296, --185547424, -184138128, -182657440, -181013552, -179228992, -177363360, -175599200, -174196896, -173178448, -172281872, --171363296, -170486048, -169535248, -168204336, -166423008, -164318464, -161801088, -158703872, -155160528, -151312240, --146953376, -142001824, -136815648, -131554848, -125957432, -120161912, -114798032, -109952240, -105170864, -100570416, --96573952, -92794376, -88781808, -85132160, -82048904, -78303160, -73764456, -70451424, -68511704, -65061776, --60248192, -58631136, -60058676, -57418880, -50366008, -50744500, -63768992, -75478144, -73326904, -66725540, --68320584, -68286760, -52987548, -38466800, -53093848, -90649576, -114169360, -107969576, -93619016, -90817080, --94996624, -98737000, -101857296, -94393184, -66017404, -40611064, -60850560, -124140664, -174951728, -179190336, --163824016, -161033888, -161131072, -152438592, -156139248, -173953152, -149530896, -48320528, 56821880, }, +-6595996, -15714212, -32926294, -43859132, -45169096, -49223008, -55187644, -35014184, 33172180, 127528320, +196871632, 209954112, 176739520, 124306552, 69076496, 16124918, -29955786, -64915208, -90075664, -109764872, +-125263256, -135164768, -139116144, -137467952, -129359584, -114974128, -98802504, -87378960, -83409872, -83839376, +-83728776, -80569832, -74706664, -67144296, -58140436, -47568912, -35586488, -22458920, -8252243, 6661495, +20977158, 33047088, 42269996, 49456012, 55735252, 61524868, 66627828, 70803608, 73946448, 75984952, +76842872, 76411760, 74481712, 70841728, 65519728, 58886148, 51526184, 44047036, 36909340, 30363808, +24545738, 19638202, 15870441, 13397614, 12285217, 12667469, 14854681, 19190988, 25785910, 34442416, +44936632, 57326540, 71794136, 88185344, 105971872, 124750008, 144440288, 164774816, 184924112, 203962624, +221463552, 237294800, 251020976, 261918912, 269517792, 273794496, 274895616, 272934432, 267964080, 259810080, +247952752, 231975472, 212308816, 190321808, 167449504, 144289968, 120732608, 96992176, 74397960, 54987392, +40226664, 30084098, 23371064, 18984292, 16791174, 17363480, 20999168, 27120570, 34506304, 41897404, +48382808, 53475028, 57052736, 59212568, 60022168, 59326920, 56791280, 52143588, 45437532, 37138044, +27927488, 18377092, 8764418, -850940, -10451266, -19975892, -29326036, -38453380, -47488916, -56699472, +-66202088, -75788456, -85160072, -94262720, -103266584, -112363864, -121757488, -131678864, -142156976, -152831040, +-163162048, -172762368, -181412432, -188911456, -195065600, -199749808, -202918944, -204654112, -205204944, -204860272, +-203810160, -202237664, -200407472, -198504800, -196525360, -194462704, -192439760, -190548368, -188756304, -187067296, +-185547424, -184138128, -182657440, -181013552, -179228992, -177363360, -175599200, -174196896, -173178448, -172281872, +-171363296, -170486048, -169535248, -168204336, -166423008, -164318464, -161801088, -158703872, -155160528, -151312240, +-146953376, -142001824, -136815648, -131554848, -125957432, -120161912, -114798032, -109952240, -105170864, -100570416, +-96573952, -92794376, -88781808, -85132160, -82048904, -78303160, -73764456, -70451424, -68511704, -65061776, +-60248192, -58631136, -60058676, -57418880, -50366008, -50744500, -63768992, -75478144, -73326904, -66725540, +-68320584, -68286760, -52987548, -38466800, -53093848, -90649576, -114169360, -107969576, -93619016, -90817080, +-94996624, -98737000, -101857296, -94393184, -66017404, -40611064, -60850560, -124140664, -174951728, -179190336, +-163824016, -161033888, -161131072, -152438592, -156139248, -173953152, -149530896, -48320528, 56821880, }, { -7046431, --6595996, -15714212, -32926294, -43859132, -45169096, -49223008, -55187644, -35014184, 33172180, 127528320, -196871632, 209954112, 176739520, 124306552, 69076496, 16124918, -29955786, -64915208, -90075664, -109764872, --125263256, -135164768, -139116144, -137467952, -129359584, -114974128, -98802504, -87378960, -83409872, -83839376, --83728776, -80569832, -74706664, -67144296, -58140436, -47568912, -35586488, -22458920, -8252243, 6661495, -20977158, 33047088, 42269996, 49456012, 55735252, 61524868, 66627828, 70803608, 73946448, 75984952, -76842872, 76411760, 74481712, 70841728, 65519728, 58886148, 51526184, 44047036, 36909340, 30363808, -24545738, 19638202, 15870441, 13397614, 12285217, 12667469, 14854681, 19190988, 25785910, 34442416, -44936632, 57326540, 71794136, 88185344, 105971872, 124750008, 144440288, 164774816, 184924112, 203962624, -221463552, 237294800, 251020976, 261918912, 269517792, 273794496, 274895616, 272934432, 267964080, 259810080, -247952752, 231975472, 212308816, 190321808, 167449504, 144289968, 120732608, 96992176, 74397960, 54987392, -40226664, 30084098, 23371064, 18984292, 16791174, 17363480, 20999168, 27120570, 34506304, 41897404, -48382808, 53475028, 57052736, 59212568, 60022168, 59326920, 56791280, 52143588, 45437532, 37138044, -27927488, 18377092, 8764418, -850940, -10451266, -19975892, -29326036, -38453380, -47488916, -56699472, --66202088, -75788456, -85160072, -94262720, -103266584, -112363864, -121757488, -131678864, -142156976, -152831040, --163162048, -172762368, -181412432, -188911456, -195065600, -199749808, -202918944, -204654112, -205204944, -204860272, --203810160, -202237664, -200407472, -198504800, -196525360, -194462704, -192439760, -190548368, -188756304, -187067296, --185547424, -184138128, -182657440, -181013552, -179228992, -177363360, -175599200, -174196896, -173178448, -172281872, --171363296, -170486048, -169535248, -168204336, -166423008, -164318464, -161801088, -158703872, -155160528, -151312240, --146953376, -142001824, -136815648, -131554848, -125957432, -120161912, -114798032, -109952240, -105170864, -100570416, --96573952, -92794376, -88781808, -85132160, -82048904, -78303160, -73764456, -70451424, -68511704, -65061776, --60248192, -58631136, -60058676, -57418880, -50366008, -50744500, -63768992, -75478144, -73326904, -66725540, --68320584, -68286760, -52987548, -38466800, -53093848, -90649576, -114169360, -107969576, -93619016, -90817080, --94996624, -98737000, -101857296, -94393184, -66017404, -40611064, -60850560, -124140664, -174951728, -179190336, --163824016, -161033888, -161131072, -152438592, -156139248, -173953152, -149530896, -48320528, 56821880, }, +-6595996, -15714212, -32926294, -43859132, -45169096, -49223008, -55187644, -35014184, 33172180, 127528320, +196871632, 209954112, 176739520, 124306552, 69076496, 16124918, -29955786, -64915208, -90075664, -109764872, +-125263256, -135164768, -139116144, -137467952, -129359584, -114974128, -98802504, -87378960, -83409872, -83839376, +-83728776, -80569832, -74706664, -67144296, -58140436, -47568912, -35586488, -22458920, -8252243, 6661495, +20977158, 33047088, 42269996, 49456012, 55735252, 61524868, 66627828, 70803608, 73946448, 75984952, +76842872, 76411760, 74481712, 70841728, 65519728, 58886148, 51526184, 44047036, 36909340, 30363808, +24545738, 19638202, 15870441, 13397614, 12285217, 12667469, 14854681, 19190988, 25785910, 34442416, +44936632, 57326540, 71794136, 88185344, 105971872, 124750008, 144440288, 164774816, 184924112, 203962624, +221463552, 237294800, 251020976, 261918912, 269517792, 273794496, 274895616, 272934432, 267964080, 259810080, +247952752, 231975472, 212308816, 190321808, 167449504, 144289968, 120732608, 96992176, 74397960, 54987392, +40226664, 30084098, 23371064, 18984292, 16791174, 17363480, 20999168, 27120570, 34506304, 41897404, +48382808, 53475028, 57052736, 59212568, 60022168, 59326920, 56791280, 52143588, 45437532, 37138044, +27927488, 18377092, 8764418, -850940, -10451266, -19975892, -29326036, -38453380, -47488916, -56699472, +-66202088, -75788456, -85160072, -94262720, -103266584, -112363864, -121757488, -131678864, -142156976, -152831040, +-163162048, -172762368, -181412432, -188911456, -195065600, -199749808, -202918944, -204654112, -205204944, -204860272, +-203810160, -202237664, -200407472, -198504800, -196525360, -194462704, -192439760, -190548368, -188756304, -187067296, +-185547424, -184138128, -182657440, -181013552, -179228992, -177363360, -175599200, -174196896, -173178448, -172281872, +-171363296, -170486048, -169535248, -168204336, -166423008, -164318464, -161801088, -158703872, -155160528, -151312240, +-146953376, -142001824, -136815648, -131554848, -125957432, -120161912, -114798032, -109952240, -105170864, -100570416, +-96573952, -92794376, -88781808, -85132160, -82048904, -78303160, -73764456, -70451424, -68511704, -65061776, +-60248192, -58631136, -60058676, -57418880, -50366008, -50744500, -63768992, -75478144, -73326904, -66725540, +-68320584, -68286760, -52987548, -38466800, -53093848, -90649576, -114169360, -107969576, -93619016, -90817080, +-94996624, -98737000, -101857296, -94393184, -66017404, -40611064, -60850560, -124140664, -174951728, -179190336, +-163824016, -161033888, -161131072, -152438592, -156139248, -173953152, -149530896, -48320528, 56821880, }, }, { { 27171036, --11462731, -54041428, -56250112, -792421, 79816064, 120961312, 82116552, -9214852, -80828600, -88135416, --51418276, -17627082, -5667210, -3959960, -2867965, -3746822, -2963528, 8109972, 25592100, 34102040, -28623272, 21260624, 23161148, 31855772, 40087076, 46668040, 53553948, 59299004, 60382944, 55612312, -46720656, 36820756, 28845538, 23300734, 17404818, 7913477, -5710159, -21782464, -38393248, -53689776, --65853124, -74299176, -79911624, -83453360, -84879288, -84442280, -83029232, -81143208, -78727824, -76015016, --73440720, -70876624, -67899136, -64530272, -60923036, -56743496, -51612620, -45780056, -39832064, -34133180, --28903520, -24467892, -21179558, -19245748, -18563386, -18611168, -18833432, -19230180, -20046760, -20867636, --20792474, -19539416, -17479444, -14470819, -9571335, -2090575, 7872138, 20029044, 34344704, 50779400, -69050192, 88562224, 108419472, 127905736, 146983440, 165609104, 182670320, 196808816, 208435296, 219484640, -230620416, 239943184, 245161024, 246006064, 243747440, 239059488, 231200240, 219135680, 202981232, 184127392, -163848176, 142009328, 117646672, 90771984, 62952408, 35974648, 10460393, -14150307, -38755636, -63661080, --87979720, -110035992, -128729832, -144301776, -157552816, -168799200, -177886800, -184668032, -189119216, -191449248, --192279248, -192278704, -191592048, -190071088, -187894624, -185443264, -182765888, -179586000, -175521888, -170055472, --162886640, -154620432, -146471264, -139066208, -132131448, -125266480, -118172800, -110337176, -101534104, -92527552, --84378392, -77287400, -70873936, -65020972, -59594280, -54016728, -48020420, -42218992, -37269040, -33144262, --29650306, -26781806, -24214488, -21324512, -17926120, -14277008, -10492605, -6687801, -3264175, -325344, -2621004, 5818607, 8962523, 12122008, 15790984, 19717122, 23000086, 25480968, 27674084, 29479044, -30463666, 31004296, 31666258, 32123672, 32067300, 32099512, 32511292, 32637456, 32460826, 32998234, -34337188, 35512400, 36698348, 38945688, 41819560, 44173200, 46582140, 49968188, 53239340, 55529096, -58347668, 62236224, 64938832, 66233228, 69305736, 73911016, 75461504, 74622912, 77919296, 84312352, -84362288, 79118128, 83010440, 97546760, 101596912, 84407920, 69243464, 81434728, 108487656, 119098904, -110885320, 108326592, 117222544, 114166136, 88067232, 63752348, 68513856, 93551368, 107158896, 97117264, -81243064, 75681080, 69503312, 42180336, -511638, -24007794, -4394289, 39977020, 67706400, 61245696, -42284488, 39489540, 53516904, 62232464, 54181012, 45533096, 60391536, 99313600, 133702328, }, +-11462731, -54041428, -56250112, -792421, 79816064, 120961312, 82116552, -9214852, -80828600, -88135416, +-51418276, -17627082, -5667210, -3959960, -2867965, -3746822, -2963528, 8109972, 25592100, 34102040, +28623272, 21260624, 23161148, 31855772, 40087076, 46668040, 53553948, 59299004, 60382944, 55612312, +46720656, 36820756, 28845538, 23300734, 17404818, 7913477, -5710159, -21782464, -38393248, -53689776, +-65853124, -74299176, -79911624, -83453360, -84879288, -84442280, -83029232, -81143208, -78727824, -76015016, +-73440720, -70876624, -67899136, -64530272, -60923036, -56743496, -51612620, -45780056, -39832064, -34133180, +-28903520, -24467892, -21179558, -19245748, -18563386, -18611168, -18833432, -19230180, -20046760, -20867636, +-20792474, -19539416, -17479444, -14470819, -9571335, -2090575, 7872138, 20029044, 34344704, 50779400, +69050192, 88562224, 108419472, 127905736, 146983440, 165609104, 182670320, 196808816, 208435296, 219484640, +230620416, 239943184, 245161024, 246006064, 243747440, 239059488, 231200240, 219135680, 202981232, 184127392, +163848176, 142009328, 117646672, 90771984, 62952408, 35974648, 10460393, -14150307, -38755636, -63661080, +-87979720, -110035992, -128729832, -144301776, -157552816, -168799200, -177886800, -184668032, -189119216, -191449248, +-192279248, -192278704, -191592048, -190071088, -187894624, -185443264, -182765888, -179586000, -175521888, -170055472, +-162886640, -154620432, -146471264, -139066208, -132131448, -125266480, -118172800, -110337176, -101534104, -92527552, +-84378392, -77287400, -70873936, -65020972, -59594280, -54016728, -48020420, -42218992, -37269040, -33144262, +-29650306, -26781806, -24214488, -21324512, -17926120, -14277008, -10492605, -6687801, -3264175, -325344, +2621004, 5818607, 8962523, 12122008, 15790984, 19717122, 23000086, 25480968, 27674084, 29479044, +30463666, 31004296, 31666258, 32123672, 32067300, 32099512, 32511292, 32637456, 32460826, 32998234, +34337188, 35512400, 36698348, 38945688, 41819560, 44173200, 46582140, 49968188, 53239340, 55529096, +58347668, 62236224, 64938832, 66233228, 69305736, 73911016, 75461504, 74622912, 77919296, 84312352, +84362288, 79118128, 83010440, 97546760, 101596912, 84407920, 69243464, 81434728, 108487656, 119098904, +110885320, 108326592, 117222544, 114166136, 88067232, 63752348, 68513856, 93551368, 107158896, 97117264, +81243064, 75681080, 69503312, 42180336, -511638, -24007794, -4394289, 39977020, 67706400, 61245696, +42284488, 39489540, 53516904, 62232464, 54181012, 45533096, 60391536, 99313600, 133702328, }, { 27171036, --11462731, -54041428, -56250112, -792421, 79816064, 120961312, 82116552, -9214852, -80828600, -88135416, --51418276, -17627082, -5667210, -3959960, -2867965, -3746822, -2963528, 8109972, 25592100, 34102040, -28623272, 21260624, 23161148, 31855772, 40087076, 46668040, 53553948, 59299004, 60382944, 55612312, -46720656, 36820756, 28845538, 23300734, 17404818, 7913477, -5710159, -21782464, -38393248, -53689776, --65853124, -74299176, -79911624, -83453360, -84879288, -84442280, -83029232, -81143208, -78727824, -76015016, --73440720, -70876624, -67899136, -64530272, -60923036, -56743496, -51612620, -45780056, -39832064, -34133180, --28903520, -24467892, -21179558, -19245748, -18563386, -18611168, -18833432, -19230180, -20046760, -20867636, --20792474, -19539416, -17479444, -14470819, -9571335, -2090575, 7872138, 20029044, 34344704, 50779400, -69050192, 88562224, 108419472, 127905736, 146983440, 165609104, 182670320, 196808816, 208435296, 219484640, -230620416, 239943184, 245161024, 246006064, 243747440, 239059488, 231200240, 219135680, 202981232, 184127392, -163848176, 142009328, 117646672, 90771984, 62952408, 35974648, 10460393, -14150307, -38755636, -63661080, --87979720, -110035992, -128729832, -144301776, -157552816, -168799200, -177886800, -184668032, -189119216, -191449248, --192279248, -192278704, -191592048, -190071088, -187894624, -185443264, -182765888, -179586000, -175521888, -170055472, --162886640, -154620432, -146471264, -139066208, -132131448, -125266480, -118172800, -110337176, -101534104, -92527552, --84378392, -77287400, -70873936, -65020972, -59594280, -54016728, -48020420, -42218992, -37269040, -33144262, --29650306, -26781806, -24214488, -21324512, -17926120, -14277008, -10492605, -6687801, -3264175, -325344, -2621004, 5818607, 8962523, 12122008, 15790984, 19717122, 23000086, 25480968, 27674084, 29479044, -30463666, 31004296, 31666258, 32123672, 32067300, 32099512, 32511292, 32637456, 32460826, 32998234, -34337188, 35512400, 36698348, 38945688, 41819560, 44173200, 46582140, 49968188, 53239340, 55529096, -58347668, 62236224, 64938832, 66233228, 69305736, 73911016, 75461504, 74622912, 77919296, 84312352, -84362288, 79118128, 83010440, 97546760, 101596912, 84407920, 69243464, 81434728, 108487656, 119098904, -110885320, 108326592, 117222544, 114166136, 88067232, 63752348, 68513856, 93551368, 107158896, 97117264, -81243064, 75681080, 69503312, 42180336, -511638, -24007794, -4394289, 39977020, 67706400, 61245696, -42284488, 39489540, 53516904, 62232464, 54181012, 45533096, 60391536, 99313600, 133702328, }, +-11462731, -54041428, -56250112, -792421, 79816064, 120961312, 82116552, -9214852, -80828600, -88135416, +-51418276, -17627082, -5667210, -3959960, -2867965, -3746822, -2963528, 8109972, 25592100, 34102040, +28623272, 21260624, 23161148, 31855772, 40087076, 46668040, 53553948, 59299004, 60382944, 55612312, +46720656, 36820756, 28845538, 23300734, 17404818, 7913477, -5710159, -21782464, -38393248, -53689776, +-65853124, -74299176, -79911624, -83453360, -84879288, -84442280, -83029232, -81143208, -78727824, -76015016, +-73440720, -70876624, -67899136, -64530272, -60923036, -56743496, -51612620, -45780056, -39832064, -34133180, +-28903520, -24467892, -21179558, -19245748, -18563386, -18611168, -18833432, -19230180, -20046760, -20867636, +-20792474, -19539416, -17479444, -14470819, -9571335, -2090575, 7872138, 20029044, 34344704, 50779400, +69050192, 88562224, 108419472, 127905736, 146983440, 165609104, 182670320, 196808816, 208435296, 219484640, +230620416, 239943184, 245161024, 246006064, 243747440, 239059488, 231200240, 219135680, 202981232, 184127392, +163848176, 142009328, 117646672, 90771984, 62952408, 35974648, 10460393, -14150307, -38755636, -63661080, +-87979720, -110035992, -128729832, -144301776, -157552816, -168799200, -177886800, -184668032, -189119216, -191449248, +-192279248, -192278704, -191592048, -190071088, -187894624, -185443264, -182765888, -179586000, -175521888, -170055472, +-162886640, -154620432, -146471264, -139066208, -132131448, -125266480, -118172800, -110337176, -101534104, -92527552, +-84378392, -77287400, -70873936, -65020972, -59594280, -54016728, -48020420, -42218992, -37269040, -33144262, +-29650306, -26781806, -24214488, -21324512, -17926120, -14277008, -10492605, -6687801, -3264175, -325344, +2621004, 5818607, 8962523, 12122008, 15790984, 19717122, 23000086, 25480968, 27674084, 29479044, +30463666, 31004296, 31666258, 32123672, 32067300, 32099512, 32511292, 32637456, 32460826, 32998234, +34337188, 35512400, 36698348, 38945688, 41819560, 44173200, 46582140, 49968188, 53239340, 55529096, +58347668, 62236224, 64938832, 66233228, 69305736, 73911016, 75461504, 74622912, 77919296, 84312352, +84362288, 79118128, 83010440, 97546760, 101596912, 84407920, 69243464, 81434728, 108487656, 119098904, +110885320, 108326592, 117222544, 114166136, 88067232, 63752348, 68513856, 93551368, 107158896, 97117264, +81243064, 75681080, 69503312, 42180336, -511638, -24007794, -4394289, 39977020, 67706400, 61245696, +42284488, 39489540, 53516904, 62232464, 54181012, 45533096, 60391536, 99313600, 133702328, }, }, { { -3897146, -35413080, 51705500, 3330210, -85761368, -165858208, -204616544, -181687312, -84494888, 65331820, 209428512, -301374624, 341843968, 351401344, 330865504, 269984864, 179177984, 87553984, 12978317, -49327164, -110070352, --170494096, -224259568, -265882096, -294854336, -315021344, -330888032, -343430944, -350049504, -348534464, -339208992, --323108768, -300449056, -271576672, -237778512, -200570144, -161187968, -120923728, -81239840, -43578884, -9268003, -20954072, 47559784, 71691592, 93727464, 112951736, 128653064, 140887280, 150231520, 157535648, 163890048, -170114528, 176132320, 181208960, 184758752, 186622240, 186763424, 185128128, 181812416, 177136256, 171495360, -165172624, 158268464, 150820992, 142963888, 134866800, 126565168, 118074560, 109640848, 101615168, 94079112, -86895240, 80117784, 74002824, 68568616, 63534376, 58829240, 54836532, 51887500, 49731964, 47737488, -45477800, 42900280, 40004400, 36643052, 32768452, 28736552, 25207700, 22724672, 21399138, 20984674, -21247204, 22197464, 23807540, 25405268, 25567404, 22917408, 17092360, 8771934, -1275605, -12981539, --26720066, -42343008, -58632748, -73864848, -86944632, -97880696, -107090176, -114465712, -119330832, -121168008, --120162984, -117121072, -112989856, -108338400, -103112504, -96983048, -89999968, -82793544, -76139568, -70478264, --65733400, -61304216, -56340844, -50405200, -43847856, -37334540, -31153546, -25199110, -19321448, -13348221, --7006703, -175557, 6962142, 14204531, 21529598, 28902446, 36197984, 43416752, 50667728, 57896696, -64880312, 71430136, 77346992, 82315192, 86084568, 88622352, 89958624, 90127208, 89313312, 87725784, -85310400, 81918448, 77646032, 72637024, 66811976, 60207388, 53271016, 46413028, 39657044, 33063732, -26965416, 21463026, 16284905, 11389180, 7116224, 3644817, 912144, -1013075, -2124935, -2820720, --3437048, -3884261, -4232154, -4928475, -5937793, -6543920, -6436546, -6000606, -5334350, -4181151, --2854006, -1941862, -1307818, -608275, -191663, -234076, -26307, 710817, 1257889, 1552631, -2401424, 3464965, 3694746, 3820374, 5041755, 5924908, 4955856, 4556961, 6925635, 8632884, -6834367, 6883759, 13447543, 18618146, 13105019, 6052683, 15908022, 41180148, 59230820, 58138288, -51392504, 54032300, 61192548, 60428580, 52166672, 46730316, 49414136, 57579944, 66939748, 74114496, -77275592, 78338592, 79395152, 73194832, 44445396, -9811316, -63851132, -81508280, -57873612, -29639570, --28724742, -38796440, -25851408, -2009508, -9972914, -33472828, 14603426, 167614864, 316267424, }, +35413080, 51705500, 3330210, -85761368, -165858208, -204616544, -181687312, -84494888, 65331820, 209428512, +301374624, 341843968, 351401344, 330865504, 269984864, 179177984, 87553984, 12978317, -49327164, -110070352, +-170494096, -224259568, -265882096, -294854336, -315021344, -330888032, -343430944, -350049504, -348534464, -339208992, +-323108768, -300449056, -271576672, -237778512, -200570144, -161187968, -120923728, -81239840, -43578884, -9268003, +20954072, 47559784, 71691592, 93727464, 112951736, 128653064, 140887280, 150231520, 157535648, 163890048, +170114528, 176132320, 181208960, 184758752, 186622240, 186763424, 185128128, 181812416, 177136256, 171495360, +165172624, 158268464, 150820992, 142963888, 134866800, 126565168, 118074560, 109640848, 101615168, 94079112, +86895240, 80117784, 74002824, 68568616, 63534376, 58829240, 54836532, 51887500, 49731964, 47737488, +45477800, 42900280, 40004400, 36643052, 32768452, 28736552, 25207700, 22724672, 21399138, 20984674, +21247204, 22197464, 23807540, 25405268, 25567404, 22917408, 17092360, 8771934, -1275605, -12981539, +-26720066, -42343008, -58632748, -73864848, -86944632, -97880696, -107090176, -114465712, -119330832, -121168008, +-120162984, -117121072, -112989856, -108338400, -103112504, -96983048, -89999968, -82793544, -76139568, -70478264, +-65733400, -61304216, -56340844, -50405200, -43847856, -37334540, -31153546, -25199110, -19321448, -13348221, +-7006703, -175557, 6962142, 14204531, 21529598, 28902446, 36197984, 43416752, 50667728, 57896696, +64880312, 71430136, 77346992, 82315192, 86084568, 88622352, 89958624, 90127208, 89313312, 87725784, +85310400, 81918448, 77646032, 72637024, 66811976, 60207388, 53271016, 46413028, 39657044, 33063732, +26965416, 21463026, 16284905, 11389180, 7116224, 3644817, 912144, -1013075, -2124935, -2820720, +-3437048, -3884261, -4232154, -4928475, -5937793, -6543920, -6436546, -6000606, -5334350, -4181151, +-2854006, -1941862, -1307818, -608275, -191663, -234076, -26307, 710817, 1257889, 1552631, +2401424, 3464965, 3694746, 3820374, 5041755, 5924908, 4955856, 4556961, 6925635, 8632884, +6834367, 6883759, 13447543, 18618146, 13105019, 6052683, 15908022, 41180148, 59230820, 58138288, +51392504, 54032300, 61192548, 60428580, 52166672, 46730316, 49414136, 57579944, 66939748, 74114496, +77275592, 78338592, 79395152, 73194832, 44445396, -9811316, -63851132, -81508280, -57873612, -29639570, +-28724742, -38796440, -25851408, -2009508, -9972914, -33472828, 14603426, 167614864, 316267424, }, { -3897146, -35413080, 51705500, 3330210, -85761368, -165858208, -204616544, -181687312, -84494888, 65331820, 209428512, -301374624, 341843968, 351401344, 330865504, 269984864, 179177984, 87553984, 12978317, -49327164, -110070352, --170494096, -224259568, -265882096, -294854336, -315021344, -330888032, -343430944, -350049504, -348534464, -339208992, --323108768, -300449056, -271576672, -237778512, -200570144, -161187968, -120923728, -81239840, -43578884, -9268003, -20954072, 47559784, 71691592, 93727464, 112951736, 128653064, 140887280, 150231520, 157535648, 163890048, -170114528, 176132320, 181208960, 184758752, 186622240, 186763424, 185128128, 181812416, 177136256, 171495360, -165172624, 158268464, 150820992, 142963888, 134866800, 126565168, 118074560, 109640848, 101615168, 94079112, -86895240, 80117784, 74002824, 68568616, 63534376, 58829240, 54836532, 51887500, 49731964, 47737488, -45477800, 42900280, 40004400, 36643052, 32768452, 28736552, 25207700, 22724672, 21399138, 20984674, -21247204, 22197464, 23807540, 25405268, 25567404, 22917408, 17092360, 8771934, -1275605, -12981539, --26720066, -42343008, -58632748, -73864848, -86944632, -97880696, -107090176, -114465712, -119330832, -121168008, --120162984, -117121072, -112989856, -108338400, -103112504, -96983048, -89999968, -82793544, -76139568, -70478264, --65733400, -61304216, -56340844, -50405200, -43847856, -37334540, -31153546, -25199110, -19321448, -13348221, --7006703, -175557, 6962142, 14204531, 21529598, 28902446, 36197984, 43416752, 50667728, 57896696, -64880312, 71430136, 77346992, 82315192, 86084568, 88622352, 89958624, 90127208, 89313312, 87725784, -85310400, 81918448, 77646032, 72637024, 66811976, 60207388, 53271016, 46413028, 39657044, 33063732, -26965416, 21463026, 16284905, 11389180, 7116224, 3644817, 912144, -1013075, -2124935, -2820720, --3437048, -3884261, -4232154, -4928475, -5937793, -6543920, -6436546, -6000606, -5334350, -4181151, --2854006, -1941862, -1307818, -608275, -191663, -234076, -26307, 710817, 1257889, 1552631, -2401424, 3464965, 3694746, 3820374, 5041755, 5924908, 4955856, 4556961, 6925635, 8632884, -6834367, 6883759, 13447543, 18618146, 13105019, 6052683, 15908022, 41180148, 59230820, 58138288, -51392504, 54032300, 61192548, 60428580, 52166672, 46730316, 49414136, 57579944, 66939748, 74114496, -77275592, 78338592, 79395152, 73194832, 44445396, -9811316, -63851132, -81508280, -57873612, -29639570, --28724742, -38796440, -25851408, -2009508, -9972914, -33472828, 14603426, 167614864, 316267424, }, +35413080, 51705500, 3330210, -85761368, -165858208, -204616544, -181687312, -84494888, 65331820, 209428512, +301374624, 341843968, 351401344, 330865504, 269984864, 179177984, 87553984, 12978317, -49327164, -110070352, +-170494096, -224259568, -265882096, -294854336, -315021344, -330888032, -343430944, -350049504, -348534464, -339208992, +-323108768, -300449056, -271576672, -237778512, -200570144, -161187968, -120923728, -81239840, -43578884, -9268003, +20954072, 47559784, 71691592, 93727464, 112951736, 128653064, 140887280, 150231520, 157535648, 163890048, +170114528, 176132320, 181208960, 184758752, 186622240, 186763424, 185128128, 181812416, 177136256, 171495360, +165172624, 158268464, 150820992, 142963888, 134866800, 126565168, 118074560, 109640848, 101615168, 94079112, +86895240, 80117784, 74002824, 68568616, 63534376, 58829240, 54836532, 51887500, 49731964, 47737488, +45477800, 42900280, 40004400, 36643052, 32768452, 28736552, 25207700, 22724672, 21399138, 20984674, +21247204, 22197464, 23807540, 25405268, 25567404, 22917408, 17092360, 8771934, -1275605, -12981539, +-26720066, -42343008, -58632748, -73864848, -86944632, -97880696, -107090176, -114465712, -119330832, -121168008, +-120162984, -117121072, -112989856, -108338400, -103112504, -96983048, -89999968, -82793544, -76139568, -70478264, +-65733400, -61304216, -56340844, -50405200, -43847856, -37334540, -31153546, -25199110, -19321448, -13348221, +-7006703, -175557, 6962142, 14204531, 21529598, 28902446, 36197984, 43416752, 50667728, 57896696, +64880312, 71430136, 77346992, 82315192, 86084568, 88622352, 89958624, 90127208, 89313312, 87725784, +85310400, 81918448, 77646032, 72637024, 66811976, 60207388, 53271016, 46413028, 39657044, 33063732, +26965416, 21463026, 16284905, 11389180, 7116224, 3644817, 912144, -1013075, -2124935, -2820720, +-3437048, -3884261, -4232154, -4928475, -5937793, -6543920, -6436546, -6000606, -5334350, -4181151, +-2854006, -1941862, -1307818, -608275, -191663, -234076, -26307, 710817, 1257889, 1552631, +2401424, 3464965, 3694746, 3820374, 5041755, 5924908, 4955856, 4556961, 6925635, 8632884, +6834367, 6883759, 13447543, 18618146, 13105019, 6052683, 15908022, 41180148, 59230820, 58138288, +51392504, 54032300, 61192548, 60428580, 52166672, 46730316, 49414136, 57579944, 66939748, 74114496, +77275592, 78338592, 79395152, 73194832, 44445396, -9811316, -63851132, -81508280, -57873612, -29639570, +-28724742, -38796440, -25851408, -2009508, -9972914, -33472828, 14603426, 167614864, 316267424, }, }, }; const Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240] ={ { { -150097296, --385323520, -471163808, -416024480, -287259232, -144949248, -11310260, 112675248, 221849024, 302379104, 342134944, -337892064, 294679840, 222711776, 134653136, 42464340, -45433776, -124755376, -193698192, -250782608, -294007168, --322044704, -336072608, -339488160, -335108384, -323229568, -303114624, -275699328, -243782336, -209982560, -175646976, --141630848, -108959560, -78353088, -49810884, -23074712, 1864016, 24938728, 46413028, 66868884, 86862496, -106658536, 126201168, 145286400, 163754752, 181534304, 198576736, 214841776, 230328352, 245016080, 258781440, -271458592, 282983040, 293392448, 302702304, 310913216, 318146496, 324659808, 330664704, 336208960, 341291520, -345992896, 350396320, 354457760, 358098272, 361374784, 364421536, 367263712, 369863264, 372304960, 374736448, -377157184, 379463584, 381680864, 383916928, 386114880, 388108800, 389912704, 391663424, 393264384, 394394496, -394925472, 395063424, 394964128, 394468576, 393364256, 391740224, 389905184, 388003040, 385829792, 383090144, -379791616, 376292832, 372916448, 369625408, 366224352, 362793216, 359735200, 357379936, 355692000, 354391168, -353266432, 352345152, 351798080, 351672992, 351722912, 351575296, 351043776, 350189088, 349097632, 347734496, -346006848, 343839520, 341191136, 338098752, 334711648, 331189760, 327615808, 324025216, 320457184, 316913280, -313361888, 309804576, 306253728, 302653472, 298930272, 295106144, 291248160, 287375712, 283517760, 279792416, -276299552, 273013344, 269879648, 266900000, 264052448, 261259104, 258503888, 255857648, 253352608, 250943120, -248592176, 246255168, 243827440, 241232736, 238500064, 235651440, 232635296, 229448432, 226177280, 222837392, -219350416, 215724928, 212060256, 208359600, 204564992, 200738176, 197007472, 193393248, 189896080, 186621168, -183625424, 180810608, 178123024, 175628192, 173262736, 170817824, 168259104, 165744928, 163291968, 160786400, -158296928, 155976032, 153755536, 151511952, 149363392, 147435488, 145601008, 143802480, 142238576, 140936672, -139611136, 138185744, 136866112, 135566352, 133954128, 132106216, 130324880, 128428112, 126101848, 123649960, -121411208, 118972208, 116022632, 113173464, 110741440, 107897096, 104326904, 101171176, 98777272, 95583424, -91120952, 87607672, 86073296, 83676704, 78086264, 71847288, 68708736, 67931352, 65994320, 61677340, -55762636, 48586816, 42441256, 43353936, 54189064, 67248984, 70312376, 60884920, 49271864, 46098956, -51298016, 57953068, 63517196, 72708968, 88788248, 105026448, 108476912, 93433792, 68637872, 48292076, -37647000, 31427350, 24909736, 19747722, 17267916, 13302587, 4965519, -2489471, -2396055, }, +-385323520, -471163808, -416024480, -287259232, -144949248, -11310260, 112675248, 221849024, 302379104, 342134944, +337892064, 294679840, 222711776, 134653136, 42464340, -45433776, -124755376, -193698192, -250782608, -294007168, +-322044704, -336072608, -339488160, -335108384, -323229568, -303114624, -275699328, -243782336, -209982560, -175646976, +-141630848, -108959560, -78353088, -49810884, -23074712, 1864016, 24938728, 46413028, 66868884, 86862496, +106658536, 126201168, 145286400, 163754752, 181534304, 198576736, 214841776, 230328352, 245016080, 258781440, +271458592, 282983040, 293392448, 302702304, 310913216, 318146496, 324659808, 330664704, 336208960, 341291520, +345992896, 350396320, 354457760, 358098272, 361374784, 364421536, 367263712, 369863264, 372304960, 374736448, +377157184, 379463584, 381680864, 383916928, 386114880, 388108800, 389912704, 391663424, 393264384, 394394496, +394925472, 395063424, 394964128, 394468576, 393364256, 391740224, 389905184, 388003040, 385829792, 383090144, +379791616, 376292832, 372916448, 369625408, 366224352, 362793216, 359735200, 357379936, 355692000, 354391168, +353266432, 352345152, 351798080, 351672992, 351722912, 351575296, 351043776, 350189088, 349097632, 347734496, +346006848, 343839520, 341191136, 338098752, 334711648, 331189760, 327615808, 324025216, 320457184, 316913280, +313361888, 309804576, 306253728, 302653472, 298930272, 295106144, 291248160, 287375712, 283517760, 279792416, +276299552, 273013344, 269879648, 266900000, 264052448, 261259104, 258503888, 255857648, 253352608, 250943120, +248592176, 246255168, 243827440, 241232736, 238500064, 235651440, 232635296, 229448432, 226177280, 222837392, +219350416, 215724928, 212060256, 208359600, 204564992, 200738176, 197007472, 193393248, 189896080, 186621168, +183625424, 180810608, 178123024, 175628192, 173262736, 170817824, 168259104, 165744928, 163291968, 160786400, +158296928, 155976032, 153755536, 151511952, 149363392, 147435488, 145601008, 143802480, 142238576, 140936672, +139611136, 138185744, 136866112, 135566352, 133954128, 132106216, 130324880, 128428112, 126101848, 123649960, +121411208, 118972208, 116022632, 113173464, 110741440, 107897096, 104326904, 101171176, 98777272, 95583424, +91120952, 87607672, 86073296, 83676704, 78086264, 71847288, 68708736, 67931352, 65994320, 61677340, +55762636, 48586816, 42441256, 43353936, 54189064, 67248984, 70312376, 60884920, 49271864, 46098956, +51298016, 57953068, 63517196, 72708968, 88788248, 105026448, 108476912, 93433792, 68637872, 48292076, +37647000, 31427350, 24909736, 19747722, 17267916, 13302587, 4965519, -2489471, -2396055, }, { -150097296, --385323520, -471163808, -416024480, -287259232, -144949248, -11310260, 112675248, 221849024, 302379104, 342134944, -337892064, 294679840, 222711776, 134653136, 42464340, -45433776, -124755376, -193698192, -250782608, -294007168, --322044704, -336072608, -339488160, -335108384, -323229568, -303114624, -275699328, -243782336, -209982560, -175646976, --141630848, -108959560, -78353088, -49810884, -23074712, 1864016, 24938728, 46413028, 66868884, 86862496, -106658536, 126201168, 145286400, 163754752, 181534304, 198576736, 214841776, 230328352, 245016080, 258781440, -271458592, 282983040, 293392448, 302702304, 310913216, 318146496, 324659808, 330664704, 336208960, 341291520, -345992896, 350396320, 354457760, 358098272, 361374784, 364421536, 367263712, 369863264, 372304960, 374736448, -377157184, 379463584, 381680864, 383916928, 386114880, 388108800, 389912704, 391663424, 393264384, 394394496, -394925472, 395063424, 394964128, 394468576, 393364256, 391740224, 389905184, 388003040, 385829792, 383090144, -379791616, 376292832, 372916448, 369625408, 366224352, 362793216, 359735200, 357379936, 355692000, 354391168, -353266432, 352345152, 351798080, 351672992, 351722912, 351575296, 351043776, 350189088, 349097632, 347734496, -346006848, 343839520, 341191136, 338098752, 334711648, 331189760, 327615808, 324025216, 320457184, 316913280, -313361888, 309804576, 306253728, 302653472, 298930272, 295106144, 291248160, 287375712, 283517760, 279792416, -276299552, 273013344, 269879648, 266900000, 264052448, 261259104, 258503888, 255857648, 253352608, 250943120, -248592176, 246255168, 243827440, 241232736, 238500064, 235651440, 232635296, 229448432, 226177280, 222837392, -219350416, 215724928, 212060256, 208359600, 204564992, 200738176, 197007472, 193393248, 189896080, 186621168, -183625424, 180810608, 178123024, 175628192, 173262736, 170817824, 168259104, 165744928, 163291968, 160786400, -158296928, 155976032, 153755536, 151511952, 149363392, 147435488, 145601008, 143802480, 142238576, 140936672, -139611136, 138185744, 136866112, 135566352, 133954128, 132106216, 130324880, 128428112, 126101848, 123649960, -121411208, 118972208, 116022632, 113173464, 110741440, 107897096, 104326904, 101171176, 98777272, 95583424, -91120952, 87607672, 86073296, 83676704, 78086264, 71847288, 68708736, 67931352, 65994320, 61677340, -55762636, 48586816, 42441256, 43353936, 54189064, 67248984, 70312376, 60884920, 49271864, 46098956, -51298016, 57953068, 63517196, 72708968, 88788248, 105026448, 108476912, 93433792, 68637872, 48292076, -37647000, 31427350, 24909736, 19747722, 17267916, 13302587, 4965519, -2489471, -2396055, }, +-385323520, -471163808, -416024480, -287259232, -144949248, -11310260, 112675248, 221849024, 302379104, 342134944, +337892064, 294679840, 222711776, 134653136, 42464340, -45433776, -124755376, -193698192, -250782608, -294007168, +-322044704, -336072608, -339488160, -335108384, -323229568, -303114624, -275699328, -243782336, -209982560, -175646976, +-141630848, -108959560, -78353088, -49810884, -23074712, 1864016, 24938728, 46413028, 66868884, 86862496, +106658536, 126201168, 145286400, 163754752, 181534304, 198576736, 214841776, 230328352, 245016080, 258781440, +271458592, 282983040, 293392448, 302702304, 310913216, 318146496, 324659808, 330664704, 336208960, 341291520, +345992896, 350396320, 354457760, 358098272, 361374784, 364421536, 367263712, 369863264, 372304960, 374736448, +377157184, 379463584, 381680864, 383916928, 386114880, 388108800, 389912704, 391663424, 393264384, 394394496, +394925472, 395063424, 394964128, 394468576, 393364256, 391740224, 389905184, 388003040, 385829792, 383090144, +379791616, 376292832, 372916448, 369625408, 366224352, 362793216, 359735200, 357379936, 355692000, 354391168, +353266432, 352345152, 351798080, 351672992, 351722912, 351575296, 351043776, 350189088, 349097632, 347734496, +346006848, 343839520, 341191136, 338098752, 334711648, 331189760, 327615808, 324025216, 320457184, 316913280, +313361888, 309804576, 306253728, 302653472, 298930272, 295106144, 291248160, 287375712, 283517760, 279792416, +276299552, 273013344, 269879648, 266900000, 264052448, 261259104, 258503888, 255857648, 253352608, 250943120, +248592176, 246255168, 243827440, 241232736, 238500064, 235651440, 232635296, 229448432, 226177280, 222837392, +219350416, 215724928, 212060256, 208359600, 204564992, 200738176, 197007472, 193393248, 189896080, 186621168, +183625424, 180810608, 178123024, 175628192, 173262736, 170817824, 168259104, 165744928, 163291968, 160786400, +158296928, 155976032, 153755536, 151511952, 149363392, 147435488, 145601008, 143802480, 142238576, 140936672, +139611136, 138185744, 136866112, 135566352, 133954128, 132106216, 130324880, 128428112, 126101848, 123649960, +121411208, 118972208, 116022632, 113173464, 110741440, 107897096, 104326904, 101171176, 98777272, 95583424, +91120952, 87607672, 86073296, 83676704, 78086264, 71847288, 68708736, 67931352, 65994320, 61677340, +55762636, 48586816, 42441256, 43353936, 54189064, 67248984, 70312376, 60884920, 49271864, 46098956, +51298016, 57953068, 63517196, 72708968, 88788248, 105026448, 108476912, 93433792, 68637872, 48292076, +37647000, 31427350, 24909736, 19747722, 17267916, 13302587, 4965519, -2489471, -2396055, }, }, { { 74128992, -125036160, -31832686, -328685248, -579388928, -630343360, -464086784, -178695872, 109277928, 336225088, 491736160, -583223296, 615155840, 591585024, 521611424, 416995680, 288475232, 146677424, 3992709, -127547640, -240920816, --335788608, -414927648, -479317824, -527319456, -558024704, -573691136, -578245376, -574549056, -563953344, -547510080, --526430368, -501655936, -473858912, -443802176, -412205728, -379325056, -344973920, -308924640, -271170816, -232013056, --192055376, -152036480, -112535656, -73853040, -36146980, 385473, 35446900, 68685656, 99869800, 129092760, -156785632, 183442352, 209277648, 234109536, 257541264, 279244288, 299046240, 316826304, 332494880, 346143776, -358055840, 368435168, 377279040, 384639008, 390804448, 396035712, 400307584, 403578752, 406126208, 408332736, -410309504, 412082240, 414000480, 416552224, 419807808, 423482688, 427579552, 432489792, 438335232, 444650976, -451000032, 457526208, 464563520, 471950880, 479151936, 485910048, 492437856, 499026336, 505774816, 512669312, -519649696, 526549568, 533144480, 539250880, 544640000, 548879616, 551407744, 551783552, 549847616, 545685824, -539488128, 531410400, 521581888, 510285600, 498035808, 485381760, 472712704, 460356608, 448764480, 438447968, -429737792, 422639264, 416840000, 411893792, 407551072, 403941152, 401302432, 399547392, 398207360, 396715392, -394635008, 391768672, 388279008, 384596608, 381029632, 377540512, 373980512, 370345376, 366690880, 362990784, -359219264, 355432160, 351699840, 348096896, 344748448, 341745184, 339038816, 336535392, 334219328, 332112640, -330238976, 328685792, 327552992, 326791712, 326244096, 325789920, 325290080, 324525568, 323402976, 322057056, -320560800, 318759584, 316548224, 313989504, 311008768, 307334976, 302885376, 297839328, 292288640, 286212864, -279763424, 273154016, 266364208, 259311328, 252110816, 244856624, 237492896, 230150656, 223164896, 216559232, -210064704, 203690976, 197608768, 191548560, 185054576, 178202496, 171357376, 164587984, 157976416, 151910848, -146453552, 141165376, 135994768, 131321848, 126925408, 122191816, 117317568, 112863152, 108515568, 103818488, -99252400, 95040112, 90424632, 85497232, 81323592, 77207944, 71499928, 65615288, 61895848, 57695908, -49410916, 41340132, 39055748, 35219804, 18512920, -2759517, -7189776, 5656472, 12028593, 1793686, --8701604, -13099650, -32475858, -75995152, -113358680, -113468744, -89127552, -77423224, -92568896, -120380952, --144085408, -157587712, -168697184, -199903888, -261747648, -314558048, -291328704, -181573504, -61053496, -9470940, --24637006, -48244832, -51813412, -58076012, -88137024, -125196152, -135724720, -103910832, -38646652, }, +125036160, -31832686, -328685248, -579388928, -630343360, -464086784, -178695872, 109277928, 336225088, 491736160, +583223296, 615155840, 591585024, 521611424, 416995680, 288475232, 146677424, 3992709, -127547640, -240920816, +-335788608, -414927648, -479317824, -527319456, -558024704, -573691136, -578245376, -574549056, -563953344, -547510080, +-526430368, -501655936, -473858912, -443802176, -412205728, -379325056, -344973920, -308924640, -271170816, -232013056, +-192055376, -152036480, -112535656, -73853040, -36146980, 385473, 35446900, 68685656, 99869800, 129092760, +156785632, 183442352, 209277648, 234109536, 257541264, 279244288, 299046240, 316826304, 332494880, 346143776, +358055840, 368435168, 377279040, 384639008, 390804448, 396035712, 400307584, 403578752, 406126208, 408332736, +410309504, 412082240, 414000480, 416552224, 419807808, 423482688, 427579552, 432489792, 438335232, 444650976, +451000032, 457526208, 464563520, 471950880, 479151936, 485910048, 492437856, 499026336, 505774816, 512669312, +519649696, 526549568, 533144480, 539250880, 544640000, 548879616, 551407744, 551783552, 549847616, 545685824, +539488128, 531410400, 521581888, 510285600, 498035808, 485381760, 472712704, 460356608, 448764480, 438447968, +429737792, 422639264, 416840000, 411893792, 407551072, 403941152, 401302432, 399547392, 398207360, 396715392, +394635008, 391768672, 388279008, 384596608, 381029632, 377540512, 373980512, 370345376, 366690880, 362990784, +359219264, 355432160, 351699840, 348096896, 344748448, 341745184, 339038816, 336535392, 334219328, 332112640, +330238976, 328685792, 327552992, 326791712, 326244096, 325789920, 325290080, 324525568, 323402976, 322057056, +320560800, 318759584, 316548224, 313989504, 311008768, 307334976, 302885376, 297839328, 292288640, 286212864, +279763424, 273154016, 266364208, 259311328, 252110816, 244856624, 237492896, 230150656, 223164896, 216559232, +210064704, 203690976, 197608768, 191548560, 185054576, 178202496, 171357376, 164587984, 157976416, 151910848, +146453552, 141165376, 135994768, 131321848, 126925408, 122191816, 117317568, 112863152, 108515568, 103818488, +99252400, 95040112, 90424632, 85497232, 81323592, 77207944, 71499928, 65615288, 61895848, 57695908, +49410916, 41340132, 39055748, 35219804, 18512920, -2759517, -7189776, 5656472, 12028593, 1793686, +-8701604, -13099650, -32475858, -75995152, -113358680, -113468744, -89127552, -77423224, -92568896, -120380952, +-144085408, -157587712, -168697184, -199903888, -261747648, -314558048, -291328704, -181573504, -61053496, -9470940, +-24637006, -48244832, -51813412, -58076012, -88137024, -125196152, -135724720, -103910832, -38646652, }, { -74128992, --125036160, 31832686, 328685248, 579388928, 630343360, 464086784, 178695872, -109277928, -336225088, -491736160, --583223296, -615155840, -591585024, -521611424, -416995680, -288475232, -146677424, -3992709, 127547640, 240920816, -335788608, 414927648, 479317824, 527319456, 558024704, 573691136, 578245376, 574549056, 563953344, 547510080, -526430368, 501655936, 473858912, 443802176, 412205728, 379325056, 344973920, 308924640, 271170816, 232013056, -192055376, 152036480, 112535656, 73853040, 36146980, -385473, -35446900, -68685656, -99869800, -129092760, --156785632, -183442352, -209277648, -234109536, -257541264, -279244288, -299046240, -316826304, -332494880, -346143776, --358055840, -368435168, -377279040, -384639008, -390804448, -396035712, -400307584, -403578752, -406126208, -408332736, --410309504, -412082240, -414000480, -416552224, -419807808, -423482688, -427579552, -432489792, -438335232, -444650976, --451000032, -457526208, -464563520, -471950880, -479151936, -485910048, -492437856, -499026336, -505774816, -512669312, --519649696, -526549568, -533144480, -539250880, -544640000, -548879616, -551407744, -551783552, -549847616, -545685824, --539488128, -531410400, -521581888, -510285600, -498035808, -485381760, -472712704, -460356608, -448764480, -438447968, --429737792, -422639264, -416840000, -411893792, -407551072, -403941152, -401302432, -399547392, -398207360, -396715392, --394635008, -391768672, -388279008, -384596608, -381029632, -377540512, -373980512, -370345376, -366690880, -362990784, --359219264, -355432160, -351699840, -348096896, -344748448, -341745184, -339038816, -336535392, -334219328, -332112640, --330238976, -328685792, -327552992, -326791712, -326244096, -325789920, -325290080, -324525568, -323402976, -322057056, --320560800, -318759584, -316548224, -313989504, -311008768, -307334976, -302885376, -297839328, -292288640, -286212864, --279763424, -273154016, -266364208, -259311328, -252110816, -244856624, -237492896, -230150656, -223164896, -216559232, --210064704, -203690976, -197608768, -191548560, -185054576, -178202496, -171357376, -164587984, -157976416, -151910848, --146453552, -141165376, -135994768, -131321848, -126925408, -122191816, -117317568, -112863152, -108515568, -103818488, --99252400, -95040112, -90424632, -85497232, -81323592, -77207944, -71499928, -65615288, -61895848, -57695908, --49410916, -41340132, -39055748, -35219804, -18512920, 2759517, 7189776, -5656472, -12028593, -1793686, -8701604, 13099650, 32475858, 75995152, 113358680, 113468744, 89127552, 77423224, 92568896, 120380952, -144085408, 157587712, 168697184, 199903888, 261747648, 314558048, 291328704, 181573504, 61053496, 9470940, -24637006, 48244832, 51813412, 58076012, 88137024, 125196152, 135724720, 103910832, 38646652, }, +-125036160, 31832686, 328685248, 579388928, 630343360, 464086784, 178695872, -109277928, -336225088, -491736160, +-583223296, -615155840, -591585024, -521611424, -416995680, -288475232, -146677424, -3992709, 127547640, 240920816, +335788608, 414927648, 479317824, 527319456, 558024704, 573691136, 578245376, 574549056, 563953344, 547510080, +526430368, 501655936, 473858912, 443802176, 412205728, 379325056, 344973920, 308924640, 271170816, 232013056, +192055376, 152036480, 112535656, 73853040, 36146980, -385473, -35446900, -68685656, -99869800, -129092760, +-156785632, -183442352, -209277648, -234109536, -257541264, -279244288, -299046240, -316826304, -332494880, -346143776, +-358055840, -368435168, -377279040, -384639008, -390804448, -396035712, -400307584, -403578752, -406126208, -408332736, +-410309504, -412082240, -414000480, -416552224, -419807808, -423482688, -427579552, -432489792, -438335232, -444650976, +-451000032, -457526208, -464563520, -471950880, -479151936, -485910048, -492437856, -499026336, -505774816, -512669312, +-519649696, -526549568, -533144480, -539250880, -544640000, -548879616, -551407744, -551783552, -549847616, -545685824, +-539488128, -531410400, -521581888, -510285600, -498035808, -485381760, -472712704, -460356608, -448764480, -438447968, +-429737792, -422639264, -416840000, -411893792, -407551072, -403941152, -401302432, -399547392, -398207360, -396715392, +-394635008, -391768672, -388279008, -384596608, -381029632, -377540512, -373980512, -370345376, -366690880, -362990784, +-359219264, -355432160, -351699840, -348096896, -344748448, -341745184, -339038816, -336535392, -334219328, -332112640, +-330238976, -328685792, -327552992, -326791712, -326244096, -325789920, -325290080, -324525568, -323402976, -322057056, +-320560800, -318759584, -316548224, -313989504, -311008768, -307334976, -302885376, -297839328, -292288640, -286212864, +-279763424, -273154016, -266364208, -259311328, -252110816, -244856624, -237492896, -230150656, -223164896, -216559232, +-210064704, -203690976, -197608768, -191548560, -185054576, -178202496, -171357376, -164587984, -157976416, -151910848, +-146453552, -141165376, -135994768, -131321848, -126925408, -122191816, -117317568, -112863152, -108515568, -103818488, +-99252400, -95040112, -90424632, -85497232, -81323592, -77207944, -71499928, -65615288, -61895848, -57695908, +-49410916, -41340132, -39055748, -35219804, -18512920, 2759517, 7189776, -5656472, -12028593, -1793686, +8701604, 13099650, 32475858, 75995152, 113358680, 113468744, 89127552, 77423224, 92568896, 120380952, +144085408, 157587712, 168697184, 199903888, 261747648, 314558048, 291328704, 181573504, 61053496, 9470940, +24637006, 48244832, 51813412, 58076012, 88137024, 125196152, 135724720, 103910832, 38646652, }, }, { { -20155744, --57068304, -71151504, -39433704, 21933862, 59390808, 41422812, -7452842, -42186244, -43565464, -19565724, -15054934, 44517872, 54613192, 45892800, 35036196, 33049236, 31137440, 15760382, -12230993, -41761576, --66220880, -84941032, -95825552, -95630672, -86114632, -73918000, -64082524, -56340308, -47381544, -35001300, --20164334, -5961952, 4998805, 11794517, 14131516, 11659226, 5186710, -2616172, -8871792, -12341052, --13105556, -11278047, -6787659, 111669, 8864812, 19053548, 30604864, 43779140, 59068684, 76820320, -96801048, 118265680, 140499120, 163101920, 185704720, 207685824, 228411200, 247590912, 265105248, 280574112, -293419296, 303271936, 309921088, 312887840, 311509152, 305471488, 294861312, 279709760, 259958800, 235875840, -208078816, 177226992, 144154128, 110148728, 76523432, 43973484, 12924630, -15611669, -40300216, -60733520, --77667504, -91633664, -101980240, -107982456, -110469240, -111319112, -111284752, -109334296, -104599632, -98070208, --91601448, -85908472, -80414136, -74633112, -68831680, -63568200, -59341416, -56565256, -55340652, -55296632, --55941412, -57078504, -58849640, -61640296, -65789772, -70942656, -75847512, -79322680, -81250040, -82208360, --82482696, -81897512, -80183816, -76993728, -71936944, -65003256, -56622164, -47178068, -36929740, -26374320, --16068010, -6155225, 3346853, 12017318, 19338090, 25205016, 29654064, 32559074, 33995204, 34316788, -33622616, 31844498, 29461866, 27319214, 25758530, 24705188, 24274618, 24349244, 24042154, 22586160, -20238960, 17517024, 14314589, 10501732, 6432788, 2237678, -2389076, -7303055, -11904039, -16127065, --20292646, -24174760, -27430346, -30488900, -33845952, -37204080, -40331892, -43709884, -47450800, -50910932, --54007068, -57383448, -60954712, -63988572, -66580048, -69206952, -71360880, -72519448, -73506752, -75081400, --76629736, -77875272, -79886928, -83066280, -86566136, -90516432, -95884608, -101905616, -107004816, -111725520, --117132888, -121851984, -124525600, -126669320, -129272072, -130303400, -129090072, -128088808, -127532072, -124883688, --121162104, -119428544, -117273544, -111342736, -106378288, -106409424, -103459320, -92259656, -85136456, -89434640, --86687472, -65751116, -54604068, -73708616, -80806592, -25334402, 56436408, 75987632, 20873004, -31660352, --37648072, -36377836, -53824532, -44966160, 20563230, 87744032, 89147416, 38726648, -581431, -6444599, --6936372, -25312926, -52908628, -63184336, -33217278, 30641370, 79638360, 63588600, -4334696, -54877872, --46950972, -11652246, 3220152, -2754685, 17180, 17445620, 28529320, 22219476, 7569880, }, +-57068304, -71151504, -39433704, 21933862, 59390808, 41422812, -7452842, -42186244, -43565464, -19565724, +15054934, 44517872, 54613192, 45892800, 35036196, 33049236, 31137440, 15760382, -12230993, -41761576, +-66220880, -84941032, -95825552, -95630672, -86114632, -73918000, -64082524, -56340308, -47381544, -35001300, +-20164334, -5961952, 4998805, 11794517, 14131516, 11659226, 5186710, -2616172, -8871792, -12341052, +-13105556, -11278047, -6787659, 111669, 8864812, 19053548, 30604864, 43779140, 59068684, 76820320, +96801048, 118265680, 140499120, 163101920, 185704720, 207685824, 228411200, 247590912, 265105248, 280574112, +293419296, 303271936, 309921088, 312887840, 311509152, 305471488, 294861312, 279709760, 259958800, 235875840, +208078816, 177226992, 144154128, 110148728, 76523432, 43973484, 12924630, -15611669, -40300216, -60733520, +-77667504, -91633664, -101980240, -107982456, -110469240, -111319112, -111284752, -109334296, -104599632, -98070208, +-91601448, -85908472, -80414136, -74633112, -68831680, -63568200, -59341416, -56565256, -55340652, -55296632, +-55941412, -57078504, -58849640, -61640296, -65789772, -70942656, -75847512, -79322680, -81250040, -82208360, +-82482696, -81897512, -80183816, -76993728, -71936944, -65003256, -56622164, -47178068, -36929740, -26374320, +-16068010, -6155225, 3346853, 12017318, 19338090, 25205016, 29654064, 32559074, 33995204, 34316788, +33622616, 31844498, 29461866, 27319214, 25758530, 24705188, 24274618, 24349244, 24042154, 22586160, +20238960, 17517024, 14314589, 10501732, 6432788, 2237678, -2389076, -7303055, -11904039, -16127065, +-20292646, -24174760, -27430346, -30488900, -33845952, -37204080, -40331892, -43709884, -47450800, -50910932, +-54007068, -57383448, -60954712, -63988572, -66580048, -69206952, -71360880, -72519448, -73506752, -75081400, +-76629736, -77875272, -79886928, -83066280, -86566136, -90516432, -95884608, -101905616, -107004816, -111725520, +-117132888, -121851984, -124525600, -126669320, -129272072, -130303400, -129090072, -128088808, -127532072, -124883688, +-121162104, -119428544, -117273544, -111342736, -106378288, -106409424, -103459320, -92259656, -85136456, -89434640, +-86687472, -65751116, -54604068, -73708616, -80806592, -25334402, 56436408, 75987632, 20873004, -31660352, +-37648072, -36377836, -53824532, -44966160, 20563230, 87744032, 89147416, 38726648, -581431, -6444599, +-6936372, -25312926, -52908628, -63184336, -33217278, 30641370, 79638360, 63588600, -4334696, -54877872, +-46950972, -11652246, 3220152, -2754685, 17180, 17445620, 28529320, 22219476, 7569880, }, { -20155744, --57068304, -71151504, -39433704, 21933862, 59390808, 41422812, -7452842, -42186244, -43565464, -19565724, -15054934, 44517872, 54613192, 45892800, 35036196, 33049236, 31137440, 15760382, -12230993, -41761576, --66220880, -84941032, -95825552, -95630672, -86114632, -73918000, -64082524, -56340308, -47381544, -35001300, --20164334, -5961952, 4998805, 11794517, 14131516, 11659226, 5186710, -2616172, -8871792, -12341052, --13105556, -11278047, -6787659, 111669, 8864812, 19053548, 30604864, 43779140, 59068684, 76820320, -96801048, 118265680, 140499120, 163101920, 185704720, 207685824, 228411200, 247590912, 265105248, 280574112, -293419296, 303271936, 309921088, 312887840, 311509152, 305471488, 294861312, 279709760, 259958800, 235875840, -208078816, 177226992, 144154128, 110148728, 76523432, 43973484, 12924630, -15611669, -40300216, -60733520, --77667504, -91633664, -101980240, -107982456, -110469240, -111319112, -111284752, -109334296, -104599632, -98070208, --91601448, -85908472, -80414136, -74633112, -68831680, -63568200, -59341416, -56565256, -55340652, -55296632, --55941412, -57078504, -58849640, -61640296, -65789772, -70942656, -75847512, -79322680, -81250040, -82208360, --82482696, -81897512, -80183816, -76993728, -71936944, -65003256, -56622164, -47178068, -36929740, -26374320, --16068010, -6155225, 3346853, 12017318, 19338090, 25205016, 29654064, 32559074, 33995204, 34316788, -33622616, 31844498, 29461866, 27319214, 25758530, 24705188, 24274618, 24349244, 24042154, 22586160, -20238960, 17517024, 14314589, 10501732, 6432788, 2237678, -2389076, -7303055, -11904039, -16127065, --20292646, -24174760, -27430346, -30488900, -33845952, -37204080, -40331892, -43709884, -47450800, -50910932, --54007068, -57383448, -60954712, -63988572, -66580048, -69206952, -71360880, -72519448, -73506752, -75081400, --76629736, -77875272, -79886928, -83066280, -86566136, -90516432, -95884608, -101905616, -107004816, -111725520, --117132888, -121851984, -124525600, -126669320, -129272072, -130303400, -129090072, -128088808, -127532072, -124883688, --121162104, -119428544, -117273544, -111342736, -106378288, -106409424, -103459320, -92259656, -85136456, -89434640, --86687472, -65751116, -54604068, -73708616, -80806592, -25334402, 56436408, 75987632, 20873004, -31660352, --37648072, -36377836, -53824532, -44966160, 20563230, 87744032, 89147416, 38726648, -581431, -6444599, --6936372, -25312926, -52908628, -63184336, -33217278, 30641370, 79638360, 63588600, -4334696, -54877872, --46950972, -11652246, 3220152, -2754685, 17180, 17445620, 28529320, 22219476, 7569880, }, +-57068304, -71151504, -39433704, 21933862, 59390808, 41422812, -7452842, -42186244, -43565464, -19565724, +15054934, 44517872, 54613192, 45892800, 35036196, 33049236, 31137440, 15760382, -12230993, -41761576, +-66220880, -84941032, -95825552, -95630672, -86114632, -73918000, -64082524, -56340308, -47381544, -35001300, +-20164334, -5961952, 4998805, 11794517, 14131516, 11659226, 5186710, -2616172, -8871792, -12341052, +-13105556, -11278047, -6787659, 111669, 8864812, 19053548, 30604864, 43779140, 59068684, 76820320, +96801048, 118265680, 140499120, 163101920, 185704720, 207685824, 228411200, 247590912, 265105248, 280574112, +293419296, 303271936, 309921088, 312887840, 311509152, 305471488, 294861312, 279709760, 259958800, 235875840, +208078816, 177226992, 144154128, 110148728, 76523432, 43973484, 12924630, -15611669, -40300216, -60733520, +-77667504, -91633664, -101980240, -107982456, -110469240, -111319112, -111284752, -109334296, -104599632, -98070208, +-91601448, -85908472, -80414136, -74633112, -68831680, -63568200, -59341416, -56565256, -55340652, -55296632, +-55941412, -57078504, -58849640, -61640296, -65789772, -70942656, -75847512, -79322680, -81250040, -82208360, +-82482696, -81897512, -80183816, -76993728, -71936944, -65003256, -56622164, -47178068, -36929740, -26374320, +-16068010, -6155225, 3346853, 12017318, 19338090, 25205016, 29654064, 32559074, 33995204, 34316788, +33622616, 31844498, 29461866, 27319214, 25758530, 24705188, 24274618, 24349244, 24042154, 22586160, +20238960, 17517024, 14314589, 10501732, 6432788, 2237678, -2389076, -7303055, -11904039, -16127065, +-20292646, -24174760, -27430346, -30488900, -33845952, -37204080, -40331892, -43709884, -47450800, -50910932, +-54007068, -57383448, -60954712, -63988572, -66580048, -69206952, -71360880, -72519448, -73506752, -75081400, +-76629736, -77875272, -79886928, -83066280, -86566136, -90516432, -95884608, -101905616, -107004816, -111725520, +-117132888, -121851984, -124525600, -126669320, -129272072, -130303400, -129090072, -128088808, -127532072, -124883688, +-121162104, -119428544, -117273544, -111342736, -106378288, -106409424, -103459320, -92259656, -85136456, -89434640, +-86687472, -65751116, -54604068, -73708616, -80806592, -25334402, 56436408, 75987632, 20873004, -31660352, +-37648072, -36377836, -53824532, -44966160, 20563230, 87744032, 89147416, 38726648, -581431, -6444599, +-6936372, -25312926, -52908628, -63184336, -33217278, 30641370, 79638360, 63588600, -4334696, -54877872, +-46950972, -11652246, 3220152, -2754685, 17180, 17445620, 28529320, 22219476, 7569880, }, }, { { -593779, --15749645, -47285980, -61542588, -36806796, 1975148, 12770012, -12308303, -41329932, -41480256, -9482751, -34246460, 68642168, 86235424, 92510376, 96318936, 99675456, 95814816, 77260016, 43951476, 2250026, --41162968, -81703696, -116041960, -143292992, -166559376, -189761856, -212546128, -230621488, -240955184, -243966496, --240413472, -229020000, -208530864, -180199104, -146741312, -110020952, -71091376, -31654982, 5920613, 39943732, -69974680, 96199752, 118821880, 138070848, 154407296, 168472784, 180739200, 191128736, 199068512, 204017920, -205905024, 205180256, 202813184, 200209904, 198603040, 198308304, 198823696, 199611296, 200352176, 200629728, -200044544, 198682496, 196919952, 194844416, 192390912, 189826288, 187396400, 184678768, 181011392, 176376592, -171086272, 164806480, 156766848, 146878224, 135744592, 123561912, 109926464, 94966024, 79778480, 65297460, -51424716, 37884832, 25379498, 15050639, 7016366, 285615, -5872294, -11288248, -15758235, -19619948, --23003844, -25256556, -25722560, -24534464, -22019760, -17813376, -11227045, -2228551, 8506183, 20395726, -33462090, 48085916, 64347200, 81491632, 98180808, 113563768, 127978752, 142265952, 156538144, 169929840, -181377536, 190427568, 197567424, 203966928, 210536608, 217013424, 222235024, 225385920, 226701264, 227103376, -227632736, 229052752, 231417664, 234032224, 236215152, 237979312, 239742384, 241751360, 244083536, 246742112, -249400160, 251434896, 252450656, 252423824, 251344704, 249170912, 246069408, 242220048, 237487536, 231686112, -224932800, 217416608, 209194432, 200498208, 191813232, 183445040, 175468736, 168131856, 161751152, 156293856, -151620928, 147904176, 145274048, 143464800, 142311056, 142009328, 142456544, 143032080, 143394992, 143675776, -143722496, 143104016, 141934176, 140727824, 139594496, 138438608, 137487264, 136726528, 135519104, 133565968, -131283192, 128694400, 125229432, 120950576, 116418848, 111328240, 104999064, 97896264, 90795608, 83313240, -75169984, 67478232, 60897804, 54517632, 48195976, 43270720, 39707508, 36021352, 32581622, 30756798, -29306710, 26775362, 25389700, 26396332, 25849260, 22560926, 22858890, 27938226, 27973658, 21383032, -23074174, 35598300, 35306780, 15142981, 14190035, 62300112, 118703768, 119914416, 73123968, 40620728, -40768904, 35194036, 16297790, 29255170, 85286240, 125082872, 104374688, 57344256, 36025112, 36459976, -25771414, 80531, -26517664, -55254756, -82899312, -78341816, -23211614, 44045428, 67240936, 44583908, -23708220, 30807800, 42936788, 35355096, 22083112, 30932892, 57170848, 64223184, 28750512, }, +-15749645, -47285980, -61542588, -36806796, 1975148, 12770012, -12308303, -41329932, -41480256, -9482751, +34246460, 68642168, 86235424, 92510376, 96318936, 99675456, 95814816, 77260016, 43951476, 2250026, +-41162968, -81703696, -116041960, -143292992, -166559376, -189761856, -212546128, -230621488, -240955184, -243966496, +-240413472, -229020000, -208530864, -180199104, -146741312, -110020952, -71091376, -31654982, 5920613, 39943732, +69974680, 96199752, 118821880, 138070848, 154407296, 168472784, 180739200, 191128736, 199068512, 204017920, +205905024, 205180256, 202813184, 200209904, 198603040, 198308304, 198823696, 199611296, 200352176, 200629728, +200044544, 198682496, 196919952, 194844416, 192390912, 189826288, 187396400, 184678768, 181011392, 176376592, +171086272, 164806480, 156766848, 146878224, 135744592, 123561912, 109926464, 94966024, 79778480, 65297460, +51424716, 37884832, 25379498, 15050639, 7016366, 285615, -5872294, -11288248, -15758235, -19619948, +-23003844, -25256556, -25722560, -24534464, -22019760, -17813376, -11227045, -2228551, 8506183, 20395726, +33462090, 48085916, 64347200, 81491632, 98180808, 113563768, 127978752, 142265952, 156538144, 169929840, +181377536, 190427568, 197567424, 203966928, 210536608, 217013424, 222235024, 225385920, 226701264, 227103376, +227632736, 229052752, 231417664, 234032224, 236215152, 237979312, 239742384, 241751360, 244083536, 246742112, +249400160, 251434896, 252450656, 252423824, 251344704, 249170912, 246069408, 242220048, 237487536, 231686112, +224932800, 217416608, 209194432, 200498208, 191813232, 183445040, 175468736, 168131856, 161751152, 156293856, +151620928, 147904176, 145274048, 143464800, 142311056, 142009328, 142456544, 143032080, 143394992, 143675776, +143722496, 143104016, 141934176, 140727824, 139594496, 138438608, 137487264, 136726528, 135519104, 133565968, +131283192, 128694400, 125229432, 120950576, 116418848, 111328240, 104999064, 97896264, 90795608, 83313240, +75169984, 67478232, 60897804, 54517632, 48195976, 43270720, 39707508, 36021352, 32581622, 30756798, +29306710, 26775362, 25389700, 26396332, 25849260, 22560926, 22858890, 27938226, 27973658, 21383032, +23074174, 35598300, 35306780, 15142981, 14190035, 62300112, 118703768, 119914416, 73123968, 40620728, +40768904, 35194036, 16297790, 29255170, 85286240, 125082872, 104374688, 57344256, 36025112, 36459976, +25771414, 80531, -26517664, -55254756, -82899312, -78341816, -23211614, 44045428, 67240936, 44583908, +23708220, 30807800, 42936788, 35355096, 22083112, 30932892, 57170848, 64223184, 28750512, }, { -593779, --15749645, -47285980, -61542588, -36806796, 1975148, 12770012, -12308303, -41329932, -41480256, -9482751, -34246460, 68642168, 86235424, 92510376, 96318936, 99675456, 95814816, 77260016, 43951476, 2250026, --41162968, -81703696, -116041960, -143292992, -166559376, -189761856, -212546128, -230621488, -240955184, -243966496, --240413472, -229020000, -208530864, -180199104, -146741312, -110020952, -71091376, -31654982, 5920613, 39943732, -69974680, 96199752, 118821880, 138070848, 154407296, 168472784, 180739200, 191128736, 199068512, 204017920, -205905024, 205180256, 202813184, 200209904, 198603040, 198308304, 198823696, 199611296, 200352176, 200629728, -200044544, 198682496, 196919952, 194844416, 192390912, 189826288, 187396400, 184678768, 181011392, 176376592, -171086272, 164806480, 156766848, 146878224, 135744592, 123561912, 109926464, 94966024, 79778480, 65297460, -51424716, 37884832, 25379498, 15050639, 7016366, 285615, -5872294, -11288248, -15758235, -19619948, --23003844, -25256556, -25722560, -24534464, -22019760, -17813376, -11227045, -2228551, 8506183, 20395726, -33462090, 48085916, 64347200, 81491632, 98180808, 113563768, 127978752, 142265952, 156538144, 169929840, -181377536, 190427568, 197567424, 203966928, 210536608, 217013424, 222235024, 225385920, 226701264, 227103376, -227632736, 229052752, 231417664, 234032224, 236215152, 237979312, 239742384, 241751360, 244083536, 246742112, -249400160, 251434896, 252450656, 252423824, 251344704, 249170912, 246069408, 242220048, 237487536, 231686112, -224932800, 217416608, 209194432, 200498208, 191813232, 183445040, 175468736, 168131856, 161751152, 156293856, -151620928, 147904176, 145274048, 143464800, 142311056, 142009328, 142456544, 143032080, 143394992, 143675776, -143722496, 143104016, 141934176, 140727824, 139594496, 138438608, 137487264, 136726528, 135519104, 133565968, -131283192, 128694400, 125229432, 120950576, 116418848, 111328240, 104999064, 97896264, 90795608, 83313240, -75169984, 67478232, 60897804, 54517632, 48195976, 43270720, 39707508, 36021352, 32581622, 30756798, -29306710, 26775362, 25389700, 26396332, 25849260, 22560926, 22858890, 27938226, 27973658, 21383032, -23074174, 35598300, 35306780, 15142981, 14190035, 62300112, 118703768, 119914416, 73123968, 40620728, -40768904, 35194036, 16297790, 29255170, 85286240, 125082872, 104374688, 57344256, 36025112, 36459976, -25771414, 80531, -26517664, -55254756, -82899312, -78341816, -23211614, 44045428, 67240936, 44583908, -23708220, 30807800, 42936788, 35355096, 22083112, 30932892, 57170848, 64223184, 28750512, }, +-15749645, -47285980, -61542588, -36806796, 1975148, 12770012, -12308303, -41329932, -41480256, -9482751, +34246460, 68642168, 86235424, 92510376, 96318936, 99675456, 95814816, 77260016, 43951476, 2250026, +-41162968, -81703696, -116041960, -143292992, -166559376, -189761856, -212546128, -230621488, -240955184, -243966496, +-240413472, -229020000, -208530864, -180199104, -146741312, -110020952, -71091376, -31654982, 5920613, 39943732, +69974680, 96199752, 118821880, 138070848, 154407296, 168472784, 180739200, 191128736, 199068512, 204017920, +205905024, 205180256, 202813184, 200209904, 198603040, 198308304, 198823696, 199611296, 200352176, 200629728, +200044544, 198682496, 196919952, 194844416, 192390912, 189826288, 187396400, 184678768, 181011392, 176376592, +171086272, 164806480, 156766848, 146878224, 135744592, 123561912, 109926464, 94966024, 79778480, 65297460, +51424716, 37884832, 25379498, 15050639, 7016366, 285615, -5872294, -11288248, -15758235, -19619948, +-23003844, -25256556, -25722560, -24534464, -22019760, -17813376, -11227045, -2228551, 8506183, 20395726, +33462090, 48085916, 64347200, 81491632, 98180808, 113563768, 127978752, 142265952, 156538144, 169929840, +181377536, 190427568, 197567424, 203966928, 210536608, 217013424, 222235024, 225385920, 226701264, 227103376, +227632736, 229052752, 231417664, 234032224, 236215152, 237979312, 239742384, 241751360, 244083536, 246742112, +249400160, 251434896, 252450656, 252423824, 251344704, 249170912, 246069408, 242220048, 237487536, 231686112, +224932800, 217416608, 209194432, 200498208, 191813232, 183445040, 175468736, 168131856, 161751152, 156293856, +151620928, 147904176, 145274048, 143464800, 142311056, 142009328, 142456544, 143032080, 143394992, 143675776, +143722496, 143104016, 141934176, 140727824, 139594496, 138438608, 137487264, 136726528, 135519104, 133565968, +131283192, 128694400, 125229432, 120950576, 116418848, 111328240, 104999064, 97896264, 90795608, 83313240, +75169984, 67478232, 60897804, 54517632, 48195976, 43270720, 39707508, 36021352, 32581622, 30756798, +29306710, 26775362, 25389700, 26396332, 25849260, 22560926, 22858890, 27938226, 27973658, 21383032, +23074174, 35598300, 35306780, 15142981, 14190035, 62300112, 118703768, 119914416, 73123968, 40620728, +40768904, 35194036, 16297790, 29255170, 85286240, 125082872, 104374688, 57344256, 36025112, 36459976, +25771414, 80531, -26517664, -55254756, -82899312, -78341816, -23211614, 44045428, 67240936, 44583908, +23708220, 30807800, 42936788, 35355096, 22083112, 30932892, 57170848, 64223184, 28750512, }, }, { { -2034204, --1912871, 2893734, 2283312, -8800388, -21194590, -25225954, -27377732, -41857676, -65462816, -72565616, --42084772, 16944720, 74471512, 110361336, 128002376, 139204720, 146519056, 144579872, 130915432, 107955080, -77377592, 39032124, -4934918, -49726056, -92294016, -132781600, -171121696, -205086304, -232441488, -252692256, --265895520, -271576672, -269452832, -259612512, -241535008, -214609856, -180362320, -142905904, -106488344, -73330128, --43904768, -18021682, 4879083, 25580288, 44618804, 62207232, 78529184, 93599152, 106967768, 118061672, -126695096, 132961448, 137057776, 139608992, 141708688, 144187952, 147163840, 150511216, 154277904, 158406976, -162597792, 166676400, 170664816, 174398224, 177568448, 180142736, 182199488, 183408528, 183263568, 181747440, -179094224, 174972128, 168627392, 159862448, 149136304, 136598752, 121848760, 105010336, 87308632, 69930656, -52820044, 35374960, 18020610, 2053531, -12117713, -25485800, -38748120, -51050520, -61122216, -68888592, --75053480, -79632448, -81893216, -81562504, -79292072, -75939856, -71945536, -67399848, -62368292, -57090316, --51939576, -47119548, -42508364, -38028176, -33923800, -30288110, -26547192, -21916144, -16276315, -10230075, --4461934, 731218, 5592585, 10865194, 17233556, 24533926, 31795642, 38166152, 43517144, 48241608, -52942452, 58260696, 64491620, 71342088, 78354696, 85415624, 92620968, 99962680, 107408008, 114904872, -122087664, 128344360, 133310416, 136963824, 139292768, 140327856, 140374560, 139734608, 138376864, 136256768, -133678176, 130995432, 128357248, 126021320, 124419296, 123687544, 123623120, 124185224, 125509144, 127505232, -130003288, 133111776, 136913360, 141143904, 145602608, 150361968, 155197040, 159469984, 162880192, 165587088, -167499424, 168321920, 168255344, 167751216, 166788608, 165273024, 163637184, 162187632, 160570576, 158612064, -156744832, 155027920, 152930368, 150392032, 147729152, 144544976, 140299408, 135554544, 131003480, 126167888, -120727232, 115672056, 111467824, 107095544, 102325448, 98324152, 95037960, 91263224, 87568480, 85192288, -82870856, 79462264, 77278272, 77233712, 75366472, 70892192, 69963408, 73052560, 70506720, 61724584, -61392800, 70719856, 66434556, 43883292, 42880416, 91149408, 146700512, 147194432, 99498824, 63552096, -59225452, 53955528, 40287332, 54138064, 101396128, 131937640, 112648936, 73204496, 52901648, 47913044, -36569500, 16180216, -7840463, -31339840, -31613106, 19630684, 101511552, 144464976, 113561080, 54766200, -29202020, 36538360, 37560564, 21087752, 6425808, -571768, -10691247, -19418084, -10495826, }, +-1912871, 2893734, 2283312, -8800388, -21194590, -25225954, -27377732, -41857676, -65462816, -72565616, +-42084772, 16944720, 74471512, 110361336, 128002376, 139204720, 146519056, 144579872, 130915432, 107955080, +77377592, 39032124, -4934918, -49726056, -92294016, -132781600, -171121696, -205086304, -232441488, -252692256, +-265895520, -271576672, -269452832, -259612512, -241535008, -214609856, -180362320, -142905904, -106488344, -73330128, +-43904768, -18021682, 4879083, 25580288, 44618804, 62207232, 78529184, 93599152, 106967768, 118061672, +126695096, 132961448, 137057776, 139608992, 141708688, 144187952, 147163840, 150511216, 154277904, 158406976, +162597792, 166676400, 170664816, 174398224, 177568448, 180142736, 182199488, 183408528, 183263568, 181747440, +179094224, 174972128, 168627392, 159862448, 149136304, 136598752, 121848760, 105010336, 87308632, 69930656, +52820044, 35374960, 18020610, 2053531, -12117713, -25485800, -38748120, -51050520, -61122216, -68888592, +-75053480, -79632448, -81893216, -81562504, -79292072, -75939856, -71945536, -67399848, -62368292, -57090316, +-51939576, -47119548, -42508364, -38028176, -33923800, -30288110, -26547192, -21916144, -16276315, -10230075, +-4461934, 731218, 5592585, 10865194, 17233556, 24533926, 31795642, 38166152, 43517144, 48241608, +52942452, 58260696, 64491620, 71342088, 78354696, 85415624, 92620968, 99962680, 107408008, 114904872, +122087664, 128344360, 133310416, 136963824, 139292768, 140327856, 140374560, 139734608, 138376864, 136256768, +133678176, 130995432, 128357248, 126021320, 124419296, 123687544, 123623120, 124185224, 125509144, 127505232, +130003288, 133111776, 136913360, 141143904, 145602608, 150361968, 155197040, 159469984, 162880192, 165587088, +167499424, 168321920, 168255344, 167751216, 166788608, 165273024, 163637184, 162187632, 160570576, 158612064, +156744832, 155027920, 152930368, 150392032, 147729152, 144544976, 140299408, 135554544, 131003480, 126167888, +120727232, 115672056, 111467824, 107095544, 102325448, 98324152, 95037960, 91263224, 87568480, 85192288, +82870856, 79462264, 77278272, 77233712, 75366472, 70892192, 69963408, 73052560, 70506720, 61724584, +61392800, 70719856, 66434556, 43883292, 42880416, 91149408, 146700512, 147194432, 99498824, 63552096, +59225452, 53955528, 40287332, 54138064, 101396128, 131937640, 112648936, 73204496, 52901648, 47913044, +36569500, 16180216, -7840463, -31339840, -31613106, 19630684, 101511552, 144464976, 113561080, 54766200, +29202020, 36538360, 37560564, 21087752, 6425808, -571768, -10691247, -19418084, -10495826, }, { 2034204, -1912871, -2893734, -2283312, 8800388, 21194590, 25225954, 27377732, 41857676, 65462816, 72565616, -42084772, -16944720, -74471512, -110361336, -128002376, -139204720, -146519056, -144579872, -130915432, -107955080, --77377592, -39032124, 4934918, 49726056, 92294016, 132781600, 171121696, 205086304, 232441488, 252692256, -265895520, 271576672, 269452832, 259612512, 241535008, 214609856, 180362320, 142905904, 106488344, 73330128, -43904768, 18021682, -4879083, -25580288, -44618804, -62207232, -78529184, -93599152, -106967768, -118061672, --126695096, -132961448, -137057776, -139608992, -141708688, -144187952, -147163840, -150511216, -154277904, -158406976, --162597792, -166676400, -170664816, -174398224, -177568448, -180142736, -182199488, -183408528, -183263568, -181747440, --179094224, -174972128, -168627392, -159862448, -149136304, -136598752, -121848760, -105010336, -87308632, -69930656, --52820044, -35374960, -18020610, -2053531, 12117713, 25485800, 38748120, 51050520, 61122216, 68888592, -75053480, 79632448, 81893216, 81562504, 79292072, 75939856, 71945536, 67399848, 62368292, 57090316, -51939576, 47119548, 42508364, 38028176, 33923800, 30288110, 26547192, 21916144, 16276315, 10230075, -4461934, -731218, -5592585, -10865194, -17233556, -24533926, -31795642, -38166152, -43517144, -48241608, --52942452, -58260696, -64491620, -71342088, -78354696, -85415624, -92620968, -99962680, -107408008, -114904872, --122087664, -128344360, -133310416, -136963824, -139292768, -140327856, -140374560, -139734608, -138376864, -136256768, --133678176, -130995432, -128357248, -126021320, -124419296, -123687544, -123623120, -124185224, -125509144, -127505232, --130003288, -133111776, -136913360, -141143904, -145602608, -150361968, -155197040, -159469984, -162880192, -165587088, --167499424, -168321920, -168255344, -167751216, -166788608, -165273024, -163637184, -162187632, -160570576, -158612064, --156744832, -155027920, -152930368, -150392032, -147729152, -144544976, -140299408, -135554544, -131003480, -126167888, --120727232, -115672056, -111467824, -107095544, -102325448, -98324152, -95037960, -91263224, -87568480, -85192288, --82870856, -79462264, -77278272, -77233712, -75366472, -70892192, -69963408, -73052560, -70506720, -61724584, --61392800, -70719856, -66434556, -43883292, -42880416, -91149408, -146700512, -147194432, -99498824, -63552096, --59225452, -53955528, -40287332, -54138064, -101396128, -131937640, -112648936, -73204496, -52901648, -47913044, --36569500, -16180216, 7840463, 31339840, 31613106, -19630684, -101511552, -144464976, -113561080, -54766200, --29202020, -36538360, -37560564, -21087752, -6425808, 571768, 10691247, 19418084, 10495826, }, +1912871, -2893734, -2283312, 8800388, 21194590, 25225954, 27377732, 41857676, 65462816, 72565616, +42084772, -16944720, -74471512, -110361336, -128002376, -139204720, -146519056, -144579872, -130915432, -107955080, +-77377592, -39032124, 4934918, 49726056, 92294016, 132781600, 171121696, 205086304, 232441488, 252692256, +265895520, 271576672, 269452832, 259612512, 241535008, 214609856, 180362320, 142905904, 106488344, 73330128, +43904768, 18021682, -4879083, -25580288, -44618804, -62207232, -78529184, -93599152, -106967768, -118061672, +-126695096, -132961448, -137057776, -139608992, -141708688, -144187952, -147163840, -150511216, -154277904, -158406976, +-162597792, -166676400, -170664816, -174398224, -177568448, -180142736, -182199488, -183408528, -183263568, -181747440, +-179094224, -174972128, -168627392, -159862448, -149136304, -136598752, -121848760, -105010336, -87308632, -69930656, +-52820044, -35374960, -18020610, -2053531, 12117713, 25485800, 38748120, 51050520, 61122216, 68888592, +75053480, 79632448, 81893216, 81562504, 79292072, 75939856, 71945536, 67399848, 62368292, 57090316, +51939576, 47119548, 42508364, 38028176, 33923800, 30288110, 26547192, 21916144, 16276315, 10230075, +4461934, -731218, -5592585, -10865194, -17233556, -24533926, -31795642, -38166152, -43517144, -48241608, +-52942452, -58260696, -64491620, -71342088, -78354696, -85415624, -92620968, -99962680, -107408008, -114904872, +-122087664, -128344360, -133310416, -136963824, -139292768, -140327856, -140374560, -139734608, -138376864, -136256768, +-133678176, -130995432, -128357248, -126021320, -124419296, -123687544, -123623120, -124185224, -125509144, -127505232, +-130003288, -133111776, -136913360, -141143904, -145602608, -150361968, -155197040, -159469984, -162880192, -165587088, +-167499424, -168321920, -168255344, -167751216, -166788608, -165273024, -163637184, -162187632, -160570576, -158612064, +-156744832, -155027920, -152930368, -150392032, -147729152, -144544976, -140299408, -135554544, -131003480, -126167888, +-120727232, -115672056, -111467824, -107095544, -102325448, -98324152, -95037960, -91263224, -87568480, -85192288, +-82870856, -79462264, -77278272, -77233712, -75366472, -70892192, -69963408, -73052560, -70506720, -61724584, +-61392800, -70719856, -66434556, -43883292, -42880416, -91149408, -146700512, -147194432, -99498824, -63552096, +-59225452, -53955528, -40287332, -54138064, -101396128, -131937640, -112648936, -73204496, -52901648, -47913044, +-36569500, -16180216, 7840463, 31339840, 31613106, -19630684, -101511552, -144464976, -113561080, -54766200, +-29202020, -36538360, -37560564, -21087752, -6425808, 571768, 10691247, 19418084, 10495826, }, }, { { -3675418, --81604, 10401337, 2452426, -11511586, 8936216, 50945828, 42283952, -43622908, -130787120, -129202816, --42832636, 50052476, 95645704, 102663680, 99507952, 95833072, 87682296, 72136664, 48658760, 18823232, --11484743, -35738424, -51967492, -60770568, -61992484, -57039312, -50183472, -44155484, -38139848, -32205276, --29515552, -32018444, -37574520, -43262132, -48939004, -56378960, -66799628, -79696336, -92715992, -102787160, --108356120, -110093968, -109205448, -106365936, -102507448, -98825048, -95390688, -91072632, -85015120, -77032920, --66794796, -53879292, -38326140, -20199768, 709207, 23946054, 48075716, 71977208, 95391224, 117751896, -137825504, 154971552, 169409616, 180861072, 188231232, 190866192, 188905552, 182306864, 170675024, 154083024, -133124120, 108329272, 80367432, 50499688, 20045686, -10299868, -40006008, -67978592, -92962960, -114493624, --132957152, -148661168, -161090800, -169352704, -173409840, -174407888, -173363136, -170013600, -163643088, -154449168, --143174352, -129936720, -114503288, -97249872, -78791176, -59132036, -38195680, -16756278, 4031364, 23615878, -41919416, 58651536, 73105176, 84196928, 90812792, 92942016, 92305824, 90893320, 88999776, 85517632, -79797808, 72384696, 64423972, 57170308, 51540144, 47448116, 44063680, 41047004, 38860864, 37816112, -37735584, 38522100, 40057012, 41652056, 42537356, 42621644, 42002096, 40294848, 37220188, 33149094, -28452010, 23117662, 17435420, 12073153, 7235410, 2716030, -1281511, -4464619, -7285875, -10326712, --13342853, -15938624, -18429168, -21095806, -23546622, -25574382, -27540404, -29378114, -30514132, -31028992, --31512176, -31836446, -31529892, -30946314, -30591978, -30040076, -28903520, -27822262, -27251030, -26651882, --25895432, -25755846, -26309896, -26737782, -27026618, -27815818, -28733868, -29087666, -29545616, -30953830, --32684164, -34200824, -36480380, -40064528, -44018048, -48190068, -53603876, -59761248, -64981780, -69554848, --74762496, -79546016, -82324320, -84368192, -87062744, -88705032, -88210040, -87769264, -88090320, -86719144, --83949432, -82848848, -81949584, -77654616, -73355360, -73597488, -72412608, -63796908, -57183196, -60899952, --60729228, -44258028, -32518272, -46260556, -54365696, -11566884, 57226144, 75289704, 24363738, -30342334, --42076720, -40014064, -55356224, -57699128, -12765180, 46264852, 58034672, 15075335, -36666672, -62856848, --71765680, -88359288, -116915992, -126920576, -78842712, 20230906, 97711576, 85162224, 3720516, -57114476, --48222284, -8475044, 5008469, -8928163, -14896557, -1306207, 12319040, 12317966, 4409321, }, +-81604, 10401337, 2452426, -11511586, 8936216, 50945828, 42283952, -43622908, -130787120, -129202816, +-42832636, 50052476, 95645704, 102663680, 99507952, 95833072, 87682296, 72136664, 48658760, 18823232, +-11484743, -35738424, -51967492, -60770568, -61992484, -57039312, -50183472, -44155484, -38139848, -32205276, +-29515552, -32018444, -37574520, -43262132, -48939004, -56378960, -66799628, -79696336, -92715992, -102787160, +-108356120, -110093968, -109205448, -106365936, -102507448, -98825048, -95390688, -91072632, -85015120, -77032920, +-66794796, -53879292, -38326140, -20199768, 709207, 23946054, 48075716, 71977208, 95391224, 117751896, +137825504, 154971552, 169409616, 180861072, 188231232, 190866192, 188905552, 182306864, 170675024, 154083024, +133124120, 108329272, 80367432, 50499688, 20045686, -10299868, -40006008, -67978592, -92962960, -114493624, +-132957152, -148661168, -161090800, -169352704, -173409840, -174407888, -173363136, -170013600, -163643088, -154449168, +-143174352, -129936720, -114503288, -97249872, -78791176, -59132036, -38195680, -16756278, 4031364, 23615878, +41919416, 58651536, 73105176, 84196928, 90812792, 92942016, 92305824, 90893320, 88999776, 85517632, +79797808, 72384696, 64423972, 57170308, 51540144, 47448116, 44063680, 41047004, 38860864, 37816112, +37735584, 38522100, 40057012, 41652056, 42537356, 42621644, 42002096, 40294848, 37220188, 33149094, +28452010, 23117662, 17435420, 12073153, 7235410, 2716030, -1281511, -4464619, -7285875, -10326712, +-13342853, -15938624, -18429168, -21095806, -23546622, -25574382, -27540404, -29378114, -30514132, -31028992, +-31512176, -31836446, -31529892, -30946314, -30591978, -30040076, -28903520, -27822262, -27251030, -26651882, +-25895432, -25755846, -26309896, -26737782, -27026618, -27815818, -28733868, -29087666, -29545616, -30953830, +-32684164, -34200824, -36480380, -40064528, -44018048, -48190068, -53603876, -59761248, -64981780, -69554848, +-74762496, -79546016, -82324320, -84368192, -87062744, -88705032, -88210040, -87769264, -88090320, -86719144, +-83949432, -82848848, -81949584, -77654616, -73355360, -73597488, -72412608, -63796908, -57183196, -60899952, +-60729228, -44258028, -32518272, -46260556, -54365696, -11566884, 57226144, 75289704, 24363738, -30342334, +-42076720, -40014064, -55356224, -57699128, -12765180, 46264852, 58034672, 15075335, -36666672, -62856848, +-71765680, -88359288, -116915992, -126920576, -78842712, 20230906, 97711576, 85162224, 3720516, -57114476, +-48222284, -8475044, 5008469, -8928163, -14896557, -1306207, 12319040, 12317966, 4409321, }, { 3675418, -81604, -10401337, -2452426, 11511586, -8936216, -50945828, -42283952, 43622908, 130787120, 129202816, -42832636, -50052476, -95645704, -102663680, -99507952, -95833072, -87682296, -72136664, -48658760, -18823232, -11484743, 35738424, 51967492, 60770568, 61992484, 57039312, 50183472, 44155484, 38139848, 32205276, -29515552, 32018444, 37574520, 43262132, 48939004, 56378960, 66799628, 79696336, 92715992, 102787160, -108356120, 110093968, 109205448, 106365936, 102507448, 98825048, 95390688, 91072632, 85015120, 77032920, -66794796, 53879292, 38326140, 20199768, -709207, -23946054, -48075716, -71977208, -95391224, -117751896, --137825504, -154971552, -169409616, -180861072, -188231232, -190866192, -188905552, -182306864, -170675024, -154083024, --133124120, -108329272, -80367432, -50499688, -20045686, 10299868, 40006008, 67978592, 92962960, 114493624, -132957152, 148661168, 161090800, 169352704, 173409840, 174407888, 173363136, 170013600, 163643088, 154449168, -143174352, 129936720, 114503288, 97249872, 78791176, 59132036, 38195680, 16756278, -4031364, -23615878, --41919416, -58651536, -73105176, -84196928, -90812792, -92942016, -92305824, -90893320, -88999776, -85517632, --79797808, -72384696, -64423972, -57170308, -51540144, -47448116, -44063680, -41047004, -38860864, -37816112, --37735584, -38522100, -40057012, -41652056, -42537356, -42621644, -42002096, -40294848, -37220188, -33149094, --28452010, -23117662, -17435420, -12073153, -7235410, -2716030, 1281511, 4464619, 7285875, 10326712, -13342853, 15938624, 18429168, 21095806, 23546622, 25574382, 27540404, 29378114, 30514132, 31028992, -31512176, 31836446, 31529892, 30946314, 30591978, 30040076, 28903520, 27822262, 27251030, 26651882, -25895432, 25755846, 26309896, 26737782, 27026618, 27815818, 28733868, 29087666, 29545616, 30953830, -32684164, 34200824, 36480380, 40064528, 44018048, 48190068, 53603876, 59761248, 64981780, 69554848, -74762496, 79546016, 82324320, 84368192, 87062744, 88705032, 88210040, 87769264, 88090320, 86719144, -83949432, 82848848, 81949584, 77654616, 73355360, 73597488, 72412608, 63796908, 57183196, 60899952, -60729228, 44258028, 32518272, 46260556, 54365696, 11566884, -57226144, -75289704, -24363738, 30342334, -42076720, 40014064, 55356224, 57699128, 12765180, -46264852, -58034672, -15075335, 36666672, 62856848, -71765680, 88359288, 116915992, 126920576, 78842712, -20230906, -97711576, -85162224, -3720516, 57114476, -48222284, 8475044, -5008469, 8928163, 14896557, 1306207, -12319040, -12317966, -4409321, }, +81604, -10401337, -2452426, 11511586, -8936216, -50945828, -42283952, 43622908, 130787120, 129202816, +42832636, -50052476, -95645704, -102663680, -99507952, -95833072, -87682296, -72136664, -48658760, -18823232, +11484743, 35738424, 51967492, 60770568, 61992484, 57039312, 50183472, 44155484, 38139848, 32205276, +29515552, 32018444, 37574520, 43262132, 48939004, 56378960, 66799628, 79696336, 92715992, 102787160, +108356120, 110093968, 109205448, 106365936, 102507448, 98825048, 95390688, 91072632, 85015120, 77032920, +66794796, 53879292, 38326140, 20199768, -709207, -23946054, -48075716, -71977208, -95391224, -117751896, +-137825504, -154971552, -169409616, -180861072, -188231232, -190866192, -188905552, -182306864, -170675024, -154083024, +-133124120, -108329272, -80367432, -50499688, -20045686, 10299868, 40006008, 67978592, 92962960, 114493624, +132957152, 148661168, 161090800, 169352704, 173409840, 174407888, 173363136, 170013600, 163643088, 154449168, +143174352, 129936720, 114503288, 97249872, 78791176, 59132036, 38195680, 16756278, -4031364, -23615878, +-41919416, -58651536, -73105176, -84196928, -90812792, -92942016, -92305824, -90893320, -88999776, -85517632, +-79797808, -72384696, -64423972, -57170308, -51540144, -47448116, -44063680, -41047004, -38860864, -37816112, +-37735584, -38522100, -40057012, -41652056, -42537356, -42621644, -42002096, -40294848, -37220188, -33149094, +-28452010, -23117662, -17435420, -12073153, -7235410, -2716030, 1281511, 4464619, 7285875, 10326712, +13342853, 15938624, 18429168, 21095806, 23546622, 25574382, 27540404, 29378114, 30514132, 31028992, +31512176, 31836446, 31529892, 30946314, 30591978, 30040076, 28903520, 27822262, 27251030, 26651882, +25895432, 25755846, 26309896, 26737782, 27026618, 27815818, 28733868, 29087666, 29545616, 30953830, +32684164, 34200824, 36480380, 40064528, 44018048, 48190068, 53603876, 59761248, 64981780, 69554848, +74762496, 79546016, 82324320, 84368192, 87062744, 88705032, 88210040, 87769264, 88090320, 86719144, +83949432, 82848848, 81949584, 77654616, 73355360, 73597488, 72412608, 63796908, 57183196, 60899952, +60729228, 44258028, 32518272, 46260556, 54365696, 11566884, -57226144, -75289704, -24363738, 30342334, +42076720, 40014064, 55356224, 57699128, 12765180, -46264852, -58034672, -15075335, 36666672, 62856848, +71765680, 88359288, 116915992, 126920576, 78842712, -20230906, -97711576, -85162224, -3720516, 57114476, +48222284, 8475044, -5008469, 8928163, 14896557, 1306207, -12319040, -12317966, -4409321, }, }, { { -762357, --6477348, -14222784, -10846403, 5228586, 21163988, 35575216, 66310536, 118070264, 157852928, 142933824, -68589552, -27521076, -105497280, -152864336, -176070032, -181038784, -170702400, -151094800, -129158792, -106835704, --82560544, -56399364, -30084098, -4484483, 19157164, 37076304, 45797772, 46952584, 46815144, 50714972, -59249612, 69804496, 80100064, 89555440, 98271536, 105989592, 112247360, 116796264, 119299160, 118966840, -115220016, 108731392, 101220032, 94026496, 87261384, 80369576, 73014448, 65229280, 57132192, 48824652, -40409200, 31980326, 23708220, 15993384, 9437117, 4599373, 1793149, 1034550, 2121714, 4803384, -8926553, 14411763, 21115670, 28822452, 37382860, 46752868, 56827248, 67247376, 77452752, 86985432, -95689720, 103484552, 109970488, 114496312, 116655072, 116416696, 113629800, 107755360, 98385352, 85743656, -70347808, 52385716, 31819802, 8960376, -15445776, -40662068, -66213900, -91788816, -117190864, -142307296, --166738144, -189384432, -208740784, -223839744, -234798880, -242265680, -246359328, -246337312, -241437824, -232037760, --219912528, -207242912, -195313632, -184130080, -173242880, -162818448, -153881168, -147643264, -144762416, -145164528, --148305760, -153484944, -160064848, -167640624, -176078096, -185327296, -195156864, -205027248, -214212560, -222095984, --228442336, -233406240, -237294800, -240332944, -242621088, -244211840, -245200752, -245777888, -246143504, -246290608, --245951840, -244897424, -243215952, -241184960, -238969296, -236579152, -233949552, -230842144, -226779648, -221327712, --214401008, -206182048, -196865200, -186623840, -175695840, -164380208, -153018416, -141984640, -131570952, -121886880, --112959784, -104855184, -97563400, -90909424, -84746688, -79084840, -73921216, -69122128, -64585032, -60297044, --56171192, -52042656, -47883516, -43815108, -39946416, -36373540, -33176474, -30210264, -27126476, -23757074, --20204064, -16452409, -12315819, -7840463, -3291556, 1277753, 5950677, 10547903, 14847702, 18951006, -22899156, 26341034, 29087130, 31393526, 33239288, 34172372, 34248068, 34074124, 33718176, 32808718, -31643172, 30706868, 29549374, 27838368, 26435524, 25466472, 23294292, 19743964, 17202954, 15673409, -11533061, 4961761, 1608465, 1366337, -5018133, -19530826, -28349468, -22183506, -13077102, -14627585, --18621904, -13313325, -12147241, -34821984, -67240936, -73887936, -49457084, -25412248, -22541598, -29239600, --31068720, -28877750, -22050362, -8371428, -7073811, -43227772, -98173824, -116765664, -80738408, -33805688, --14342506, -8144869, 6374805, 16698296, 18523658, 48044040, 115123912, 146539456, 69534448, }, +-6477348, -14222784, -10846403, 5228586, 21163988, 35575216, 66310536, 118070264, 157852928, 142933824, +68589552, -27521076, -105497280, -152864336, -176070032, -181038784, -170702400, -151094800, -129158792, -106835704, +-82560544, -56399364, -30084098, -4484483, 19157164, 37076304, 45797772, 46952584, 46815144, 50714972, +59249612, 69804496, 80100064, 89555440, 98271536, 105989592, 112247360, 116796264, 119299160, 118966840, +115220016, 108731392, 101220032, 94026496, 87261384, 80369576, 73014448, 65229280, 57132192, 48824652, +40409200, 31980326, 23708220, 15993384, 9437117, 4599373, 1793149, 1034550, 2121714, 4803384, +8926553, 14411763, 21115670, 28822452, 37382860, 46752868, 56827248, 67247376, 77452752, 86985432, +95689720, 103484552, 109970488, 114496312, 116655072, 116416696, 113629800, 107755360, 98385352, 85743656, +70347808, 52385716, 31819802, 8960376, -15445776, -40662068, -66213900, -91788816, -117190864, -142307296, +-166738144, -189384432, -208740784, -223839744, -234798880, -242265680, -246359328, -246337312, -241437824, -232037760, +-219912528, -207242912, -195313632, -184130080, -173242880, -162818448, -153881168, -147643264, -144762416, -145164528, +-148305760, -153484944, -160064848, -167640624, -176078096, -185327296, -195156864, -205027248, -214212560, -222095984, +-228442336, -233406240, -237294800, -240332944, -242621088, -244211840, -245200752, -245777888, -246143504, -246290608, +-245951840, -244897424, -243215952, -241184960, -238969296, -236579152, -233949552, -230842144, -226779648, -221327712, +-214401008, -206182048, -196865200, -186623840, -175695840, -164380208, -153018416, -141984640, -131570952, -121886880, +-112959784, -104855184, -97563400, -90909424, -84746688, -79084840, -73921216, -69122128, -64585032, -60297044, +-56171192, -52042656, -47883516, -43815108, -39946416, -36373540, -33176474, -30210264, -27126476, -23757074, +-20204064, -16452409, -12315819, -7840463, -3291556, 1277753, 5950677, 10547903, 14847702, 18951006, +22899156, 26341034, 29087130, 31393526, 33239288, 34172372, 34248068, 34074124, 33718176, 32808718, +31643172, 30706868, 29549374, 27838368, 26435524, 25466472, 23294292, 19743964, 17202954, 15673409, +11533061, 4961761, 1608465, 1366337, -5018133, -19530826, -28349468, -22183506, -13077102, -14627585, +-18621904, -13313325, -12147241, -34821984, -67240936, -73887936, -49457084, -25412248, -22541598, -29239600, +-31068720, -28877750, -22050362, -8371428, -7073811, -43227772, -98173824, -116765664, -80738408, -33805688, +-14342506, -8144869, 6374805, 16698296, 18523658, 48044040, 115123912, 146539456, 69534448, }, { -762357, --6477348, -14222784, -10846403, 5228586, 21163988, 35575216, 66310536, 118070264, 157852928, 142933824, -68589552, -27521076, -105497280, -152864336, -176070032, -181038784, -170702400, -151094800, -129158792, -106835704, --82560544, -56399364, -30084098, -4484483, 19157164, 37076304, 45797772, 46952584, 46815144, 50714972, -59249612, 69804496, 80100064, 89555440, 98271536, 105989592, 112247360, 116796264, 119299160, 118966840, -115220016, 108731392, 101220032, 94026496, 87261384, 80369576, 73014448, 65229280, 57132192, 48824652, -40409200, 31980326, 23708220, 15993384, 9437117, 4599373, 1793149, 1034550, 2121714, 4803384, -8926553, 14411763, 21115670, 28822452, 37382860, 46752868, 56827248, 67247376, 77452752, 86985432, -95689720, 103484552, 109970488, 114496312, 116655072, 116416696, 113629800, 107755360, 98385352, 85743656, -70347808, 52385716, 31819802, 8960376, -15445776, -40662068, -66213900, -91788816, -117190864, -142307296, --166738144, -189384432, -208740784, -223839744, -234798880, -242265680, -246359328, -246337312, -241437824, -232037760, --219912528, -207242912, -195313632, -184130080, -173242880, -162818448, -153881168, -147643264, -144762416, -145164528, --148305760, -153484944, -160064848, -167640624, -176078096, -185327296, -195156864, -205027248, -214212560, -222095984, --228442336, -233406240, -237294800, -240332944, -242621088, -244211840, -245200752, -245777888, -246143504, -246290608, --245951840, -244897424, -243215952, -241184960, -238969296, -236579152, -233949552, -230842144, -226779648, -221327712, --214401008, -206182048, -196865200, -186623840, -175695840, -164380208, -153018416, -141984640, -131570952, -121886880, --112959784, -104855184, -97563400, -90909424, -84746688, -79084840, -73921216, -69122128, -64585032, -60297044, --56171192, -52042656, -47883516, -43815108, -39946416, -36373540, -33176474, -30210264, -27126476, -23757074, --20204064, -16452409, -12315819, -7840463, -3291556, 1277753, 5950677, 10547903, 14847702, 18951006, -22899156, 26341034, 29087130, 31393526, 33239288, 34172372, 34248068, 34074124, 33718176, 32808718, -31643172, 30706868, 29549374, 27838368, 26435524, 25466472, 23294292, 19743964, 17202954, 15673409, -11533061, 4961761, 1608465, 1366337, -5018133, -19530826, -28349468, -22183506, -13077102, -14627585, --18621904, -13313325, -12147241, -34821984, -67240936, -73887936, -49457084, -25412248, -22541598, -29239600, --31068720, -28877750, -22050362, -8371428, -7073811, -43227772, -98173824, -116765664, -80738408, -33805688, --14342506, -8144869, 6374805, 16698296, 18523658, 48044040, 115123912, 146539456, 69534448, }, +-6477348, -14222784, -10846403, 5228586, 21163988, 35575216, 66310536, 118070264, 157852928, 142933824, +68589552, -27521076, -105497280, -152864336, -176070032, -181038784, -170702400, -151094800, -129158792, -106835704, +-82560544, -56399364, -30084098, -4484483, 19157164, 37076304, 45797772, 46952584, 46815144, 50714972, +59249612, 69804496, 80100064, 89555440, 98271536, 105989592, 112247360, 116796264, 119299160, 118966840, +115220016, 108731392, 101220032, 94026496, 87261384, 80369576, 73014448, 65229280, 57132192, 48824652, +40409200, 31980326, 23708220, 15993384, 9437117, 4599373, 1793149, 1034550, 2121714, 4803384, +8926553, 14411763, 21115670, 28822452, 37382860, 46752868, 56827248, 67247376, 77452752, 86985432, +95689720, 103484552, 109970488, 114496312, 116655072, 116416696, 113629800, 107755360, 98385352, 85743656, +70347808, 52385716, 31819802, 8960376, -15445776, -40662068, -66213900, -91788816, -117190864, -142307296, +-166738144, -189384432, -208740784, -223839744, -234798880, -242265680, -246359328, -246337312, -241437824, -232037760, +-219912528, -207242912, -195313632, -184130080, -173242880, -162818448, -153881168, -147643264, -144762416, -145164528, +-148305760, -153484944, -160064848, -167640624, -176078096, -185327296, -195156864, -205027248, -214212560, -222095984, +-228442336, -233406240, -237294800, -240332944, -242621088, -244211840, -245200752, -245777888, -246143504, -246290608, +-245951840, -244897424, -243215952, -241184960, -238969296, -236579152, -233949552, -230842144, -226779648, -221327712, +-214401008, -206182048, -196865200, -186623840, -175695840, -164380208, -153018416, -141984640, -131570952, -121886880, +-112959784, -104855184, -97563400, -90909424, -84746688, -79084840, -73921216, -69122128, -64585032, -60297044, +-56171192, -52042656, -47883516, -43815108, -39946416, -36373540, -33176474, -30210264, -27126476, -23757074, +-20204064, -16452409, -12315819, -7840463, -3291556, 1277753, 5950677, 10547903, 14847702, 18951006, +22899156, 26341034, 29087130, 31393526, 33239288, 34172372, 34248068, 34074124, 33718176, 32808718, +31643172, 30706868, 29549374, 27838368, 26435524, 25466472, 23294292, 19743964, 17202954, 15673409, +11533061, 4961761, 1608465, 1366337, -5018133, -19530826, -28349468, -22183506, -13077102, -14627585, +-18621904, -13313325, -12147241, -34821984, -67240936, -73887936, -49457084, -25412248, -22541598, -29239600, +-31068720, -28877750, -22050362, -8371428, -7073811, -43227772, -98173824, -116765664, -80738408, -33805688, +-14342506, -8144869, 6374805, 16698296, 18523658, 48044040, 115123912, 146539456, 69534448, }, }, { { -20420422, --40212704, -13275744, 46952044, 92115240, 74442520, -7164006, -95062120, -120792200, -71658848, 412317, -39556112, 39258684, 27809376, 22846004, 21613350, 22599582, 30020210, 38551628, 35357780, 20413980, -8887361, 10007274, 16486769, 18066780, 14104136, 8451422, 938450, -10698227, -25531434, -39939976, --50867984, -57304528, -60780228, -64703684, -71266392, -79088064, -84963040, -86841016, -84133576, -76906760, --66280472, -54327580, -42438036, -30728880, -19357954, -9056475, -92879, 7961259, 15277736, 21703544, -27533962, 33300492, 38995080, 44351444, 49515068, 54651312, 59322624, 62897112, 65213172, 66435092, -66654672, 65978212, 64715492, 63386736, 62636192, 62914828, 64117956, 65955664, 68715184, 73009616, -78762184, 85276040, 92387968, 100618200, 110020952, 119751208, 128918272, 137119520, 144049984, 149180320, -151877552, 151570464, 148041616, 141655536, 132766032, 120954336, 105805984, 88399016, 70622144, 52656836, -32515050, 8725226, -17654464, -44401372, -70559336, -96706560, -123290256, -149426208, -173422720, -194302704, --212562768, -229117184, -243644368, -254602976, -260943424, -263205264, -262809056, -260753904, -256988832, -250553904, --240419920, -226641664, -210570976, -193659536, -176393776, -158628176, -140387456, -121987272, -103876472, -86627344, --70640400, -55742768, -41512468, -27914066, -15139223, -3025805, 8857296, 20782274, 32812476, 44721348, -55698748, 64797096, 71973992, 78112032, 83941376, 89633280, 95259152, 100662224, 105034496, 107632416, -108781320, 109376176, 109795472, 110085920, 110543872, 111199928, 111377088, 110571248, 109153376, 107686640, -106334800, 105305080, 104967392, 105214352, 105491912, 105521976, 105286288, 104618960, 103560792, 102622872, -102025336, 101370352, 100522632, 99797864, 98946384, 97210144, 94642288, 92025576, 89505504, 86723976, -84018152, 81963008, 80254152, 78476568, 77107008, 76456864, 75900664, 75283264, 75432512, 76365056, -77025408, 77376520, 78352016, 79577688, 79879952, 79704392, 80063024, 80121008, 78970488, 77898896, -77632072, 76328008, 73605000, 72157600, 71994928, 69305736, 64568392, 63270236, 64563560, 60656212, -52715356, 52361556, 59256592, 55627880, 36381596, 24951076, 39360156, 60072632, 56738664, 33551210, -18991272, 18456548, 9521406, -14571750, -28408524, -13103408, 12198781, 15094663, -7445326, -29722248, --35500052, -37107980, -50775104, -65863324, -53801444, -7777112, 40449464, 53233436, 29868814, 4861903, -5153424, 21903796, 29221346, 20372104, 14507326, 28734942, 52626772, 56590488, 24798068, }, +-40212704, -13275744, 46952044, 92115240, 74442520, -7164006, -95062120, -120792200, -71658848, 412317, +39556112, 39258684, 27809376, 22846004, 21613350, 22599582, 30020210, 38551628, 35357780, 20413980, +8887361, 10007274, 16486769, 18066780, 14104136, 8451422, 938450, -10698227, -25531434, -39939976, +-50867984, -57304528, -60780228, -64703684, -71266392, -79088064, -84963040, -86841016, -84133576, -76906760, +-66280472, -54327580, -42438036, -30728880, -19357954, -9056475, -92879, 7961259, 15277736, 21703544, +27533962, 33300492, 38995080, 44351444, 49515068, 54651312, 59322624, 62897112, 65213172, 66435092, +66654672, 65978212, 64715492, 63386736, 62636192, 62914828, 64117956, 65955664, 68715184, 73009616, +78762184, 85276040, 92387968, 100618200, 110020952, 119751208, 128918272, 137119520, 144049984, 149180320, +151877552, 151570464, 148041616, 141655536, 132766032, 120954336, 105805984, 88399016, 70622144, 52656836, +32515050, 8725226, -17654464, -44401372, -70559336, -96706560, -123290256, -149426208, -173422720, -194302704, +-212562768, -229117184, -243644368, -254602976, -260943424, -263205264, -262809056, -260753904, -256988832, -250553904, +-240419920, -226641664, -210570976, -193659536, -176393776, -158628176, -140387456, -121987272, -103876472, -86627344, +-70640400, -55742768, -41512468, -27914066, -15139223, -3025805, 8857296, 20782274, 32812476, 44721348, +55698748, 64797096, 71973992, 78112032, 83941376, 89633280, 95259152, 100662224, 105034496, 107632416, +108781320, 109376176, 109795472, 110085920, 110543872, 111199928, 111377088, 110571248, 109153376, 107686640, +106334800, 105305080, 104967392, 105214352, 105491912, 105521976, 105286288, 104618960, 103560792, 102622872, +102025336, 101370352, 100522632, 99797864, 98946384, 97210144, 94642288, 92025576, 89505504, 86723976, +84018152, 81963008, 80254152, 78476568, 77107008, 76456864, 75900664, 75283264, 75432512, 76365056, +77025408, 77376520, 78352016, 79577688, 79879952, 79704392, 80063024, 80121008, 78970488, 77898896, +77632072, 76328008, 73605000, 72157600, 71994928, 69305736, 64568392, 63270236, 64563560, 60656212, +52715356, 52361556, 59256592, 55627880, 36381596, 24951076, 39360156, 60072632, 56738664, 33551210, +18991272, 18456548, 9521406, -14571750, -28408524, -13103408, 12198781, 15094663, -7445326, -29722248, +-35500052, -37107980, -50775104, -65863324, -53801444, -7777112, 40449464, 53233436, 29868814, 4861903, +5153424, 21903796, 29221346, 20372104, 14507326, 28734942, 52626772, 56590488, 24798068, }, { -20420422, --40212704, -13275744, 46952044, 92115240, 74442520, -7164006, -95062120, -120792200, -71658848, 412317, -39556112, 39258684, 27809376, 22846004, 21613350, 22599582, 30020210, 38551628, 35357780, 20413980, -8887361, 10007274, 16486769, 18066780, 14104136, 8451422, 938450, -10698227, -25531434, -39939976, --50867984, -57304528, -60780228, -64703684, -71266392, -79088064, -84963040, -86841016, -84133576, -76906760, --66280472, -54327580, -42438036, -30728880, -19357954, -9056475, -92879, 7961259, 15277736, 21703544, -27533962, 33300492, 38995080, 44351444, 49515068, 54651312, 59322624, 62897112, 65213172, 66435092, -66654672, 65978212, 64715492, 63386736, 62636192, 62914828, 64117956, 65955664, 68715184, 73009616, -78762184, 85276040, 92387968, 100618200, 110020952, 119751208, 128918272, 137119520, 144049984, 149180320, -151877552, 151570464, 148041616, 141655536, 132766032, 120954336, 105805984, 88399016, 70622144, 52656836, -32515050, 8725226, -17654464, -44401372, -70559336, -96706560, -123290256, -149426208, -173422720, -194302704, --212562768, -229117184, -243644368, -254602976, -260943424, -263205264, -262809056, -260753904, -256988832, -250553904, --240419920, -226641664, -210570976, -193659536, -176393776, -158628176, -140387456, -121987272, -103876472, -86627344, --70640400, -55742768, -41512468, -27914066, -15139223, -3025805, 8857296, 20782274, 32812476, 44721348, -55698748, 64797096, 71973992, 78112032, 83941376, 89633280, 95259152, 100662224, 105034496, 107632416, -108781320, 109376176, 109795472, 110085920, 110543872, 111199928, 111377088, 110571248, 109153376, 107686640, -106334800, 105305080, 104967392, 105214352, 105491912, 105521976, 105286288, 104618960, 103560792, 102622872, -102025336, 101370352, 100522632, 99797864, 98946384, 97210144, 94642288, 92025576, 89505504, 86723976, -84018152, 81963008, 80254152, 78476568, 77107008, 76456864, 75900664, 75283264, 75432512, 76365056, -77025408, 77376520, 78352016, 79577688, 79879952, 79704392, 80063024, 80121008, 78970488, 77898896, -77632072, 76328008, 73605000, 72157600, 71994928, 69305736, 64568392, 63270236, 64563560, 60656212, -52715356, 52361556, 59256592, 55627880, 36381596, 24951076, 39360156, 60072632, 56738664, 33551210, -18991272, 18456548, 9521406, -14571750, -28408524, -13103408, 12198781, 15094663, -7445326, -29722248, --35500052, -37107980, -50775104, -65863324, -53801444, -7777112, 40449464, 53233436, 29868814, 4861903, -5153424, 21903796, 29221346, 20372104, 14507326, 28734942, 52626772, 56590488, 24798068, }, +-40212704, -13275744, 46952044, 92115240, 74442520, -7164006, -95062120, -120792200, -71658848, 412317, +39556112, 39258684, 27809376, 22846004, 21613350, 22599582, 30020210, 38551628, 35357780, 20413980, +8887361, 10007274, 16486769, 18066780, 14104136, 8451422, 938450, -10698227, -25531434, -39939976, +-50867984, -57304528, -60780228, -64703684, -71266392, -79088064, -84963040, -86841016, -84133576, -76906760, +-66280472, -54327580, -42438036, -30728880, -19357954, -9056475, -92879, 7961259, 15277736, 21703544, +27533962, 33300492, 38995080, 44351444, 49515068, 54651312, 59322624, 62897112, 65213172, 66435092, +66654672, 65978212, 64715492, 63386736, 62636192, 62914828, 64117956, 65955664, 68715184, 73009616, +78762184, 85276040, 92387968, 100618200, 110020952, 119751208, 128918272, 137119520, 144049984, 149180320, +151877552, 151570464, 148041616, 141655536, 132766032, 120954336, 105805984, 88399016, 70622144, 52656836, +32515050, 8725226, -17654464, -44401372, -70559336, -96706560, -123290256, -149426208, -173422720, -194302704, +-212562768, -229117184, -243644368, -254602976, -260943424, -263205264, -262809056, -260753904, -256988832, -250553904, +-240419920, -226641664, -210570976, -193659536, -176393776, -158628176, -140387456, -121987272, -103876472, -86627344, +-70640400, -55742768, -41512468, -27914066, -15139223, -3025805, 8857296, 20782274, 32812476, 44721348, +55698748, 64797096, 71973992, 78112032, 83941376, 89633280, 95259152, 100662224, 105034496, 107632416, +108781320, 109376176, 109795472, 110085920, 110543872, 111199928, 111377088, 110571248, 109153376, 107686640, +106334800, 105305080, 104967392, 105214352, 105491912, 105521976, 105286288, 104618960, 103560792, 102622872, +102025336, 101370352, 100522632, 99797864, 98946384, 97210144, 94642288, 92025576, 89505504, 86723976, +84018152, 81963008, 80254152, 78476568, 77107008, 76456864, 75900664, 75283264, 75432512, 76365056, +77025408, 77376520, 78352016, 79577688, 79879952, 79704392, 80063024, 80121008, 78970488, 77898896, +77632072, 76328008, 73605000, 72157600, 71994928, 69305736, 64568392, 63270236, 64563560, 60656212, +52715356, 52361556, 59256592, 55627880, 36381596, 24951076, 39360156, 60072632, 56738664, 33551210, +18991272, 18456548, 9521406, -14571750, -28408524, -13103408, 12198781, 15094663, -7445326, -29722248, +-35500052, -37107980, -50775104, -65863324, -53801444, -7777112, 40449464, 53233436, 29868814, 4861903, +5153424, 21903796, 29221346, 20372104, 14507326, 28734942, 52626772, 56590488, 24798068, }, }, { { 14732275, -11638825, -44356812, -103051296, -108493024, -50523848, 52062520, 175351696, 280234816, 316784448, 267124960, -164828496, 53560388, -54754392, -164943920, -264043856, -327144960, -348748672, -347294272, -340326240, -329075552, --306791648, -271212160, -226679248, -179788944, -134819568, -91358784, -46217608, 1948305, 51128364, 98800888, -143956032, 185903360, 223205696, 254543392, 279389248, 297522048, 308752864, 313207264, 311433440, 304490624, -294090912, 281911456, 268454784, 253179728, 235893024, 217406416, 198865568, 181129504, 164740448, 149718800, -135312944, 120514096, 104906720, 88763016, 72480792, 56328496, 40613212, 25741350, 12032351, -425202, --11732240, -22002580, -31228170, -39348344, -46411416, -52493092, -57499412, -61295088, -64025616, -66019016, --67385352, -68027984, -68061272, -67838472, -67479304, -66735740, -65527244, -64324116, -63756644, -63998772, --64753612, -65714072, -66779224, -67802504, -68379640, -68074160, -66823248, -65060700, -63425392, -62366684, --62037044, -62612032, -64670396, -69012072, -75856640, -84277992, -92689688, -99956776, -105894032, -110643728, --113752208, -114045880, -110504136, -103202696, -93259312, -81803560, -69157560, -55132348, -39913132, -24388434, --9687836, 3438121, 14907295, 25171192, 34681860, 43366820, 50702624, 56338160, 60504280, 63885492, -67284960, 71270152, 75776112, 80083960, 83495240, 85966992, 87916368, 89653144, 91292216, 92918400, -94461360, 95609728, 96113312, 95987152, 95276872, 93914288, 91903176, 89335856, 86142552, 82104744, -77110232, 71161168, 64230164, 56386480, 47918952, 39143796, 30273076, 21537114, 13142600, 5056787, --2822867, -10342281, -17255032, -23532662, -29110214, -33621540, -36813240, -38884488, -40048424, -40223444, --39477192, -38198904, -36531380, -34227668, -31245888, -27889370, -24346558, -20729122, -17398376, -14614163, --12166569, -9895068, -7998840, -6334003, -4242891, -1566589, 1091995, 3431679, 5676873, 7654169, -8916889, 9718437, 10595684, 11388643, 11908334, 12730820, 14100915, 15284715, 16068546, 17187386, -18505940, 19101868, 19503984, 20854750, 22139482, 22066468, 22573812, 25519086, 28031104, 27629524, -28576564, 34391952, 38481832, 34390876, 31168578, 42307576, 60968672, 64931852, 48531520, 30916248, -27147952, 28959354, 22742388, 11207180, 6075768, 9893457, 15458661, 16604880, 11769284, 1722282, --10866267, -23903104, -41185516, -68761888, -99917048, -109958680, -78720848, -20484846, 22592064, 28151900, -21925272, 38224672, 65255048, 67648416, 60901024, 105280384, 197452000, 226874128, 103426568, }, +11638825, -44356812, -103051296, -108493024, -50523848, 52062520, 175351696, 280234816, 316784448, 267124960, +164828496, 53560388, -54754392, -164943920, -264043856, -327144960, -348748672, -347294272, -340326240, -329075552, +-306791648, -271212160, -226679248, -179788944, -134819568, -91358784, -46217608, 1948305, 51128364, 98800888, +143956032, 185903360, 223205696, 254543392, 279389248, 297522048, 308752864, 313207264, 311433440, 304490624, +294090912, 281911456, 268454784, 253179728, 235893024, 217406416, 198865568, 181129504, 164740448, 149718800, +135312944, 120514096, 104906720, 88763016, 72480792, 56328496, 40613212, 25741350, 12032351, -425202, +-11732240, -22002580, -31228170, -39348344, -46411416, -52493092, -57499412, -61295088, -64025616, -66019016, +-67385352, -68027984, -68061272, -67838472, -67479304, -66735740, -65527244, -64324116, -63756644, -63998772, +-64753612, -65714072, -66779224, -67802504, -68379640, -68074160, -66823248, -65060700, -63425392, -62366684, +-62037044, -62612032, -64670396, -69012072, -75856640, -84277992, -92689688, -99956776, -105894032, -110643728, +-113752208, -114045880, -110504136, -103202696, -93259312, -81803560, -69157560, -55132348, -39913132, -24388434, +-9687836, 3438121, 14907295, 25171192, 34681860, 43366820, 50702624, 56338160, 60504280, 63885492, +67284960, 71270152, 75776112, 80083960, 83495240, 85966992, 87916368, 89653144, 91292216, 92918400, +94461360, 95609728, 96113312, 95987152, 95276872, 93914288, 91903176, 89335856, 86142552, 82104744, +77110232, 71161168, 64230164, 56386480, 47918952, 39143796, 30273076, 21537114, 13142600, 5056787, +-2822867, -10342281, -17255032, -23532662, -29110214, -33621540, -36813240, -38884488, -40048424, -40223444, +-39477192, -38198904, -36531380, -34227668, -31245888, -27889370, -24346558, -20729122, -17398376, -14614163, +-12166569, -9895068, -7998840, -6334003, -4242891, -1566589, 1091995, 3431679, 5676873, 7654169, +8916889, 9718437, 10595684, 11388643, 11908334, 12730820, 14100915, 15284715, 16068546, 17187386, +18505940, 19101868, 19503984, 20854750, 22139482, 22066468, 22573812, 25519086, 28031104, 27629524, +28576564, 34391952, 38481832, 34390876, 31168578, 42307576, 60968672, 64931852, 48531520, 30916248, +27147952, 28959354, 22742388, 11207180, 6075768, 9893457, 15458661, 16604880, 11769284, 1722282, +-10866267, -23903104, -41185516, -68761888, -99917048, -109958680, -78720848, -20484846, 22592064, 28151900, +21925272, 38224672, 65255048, 67648416, 60901024, 105280384, 197452000, 226874128, 103426568, }, { 14732275, -11638825, -44356812, -103051296, -108493024, -50523848, 52062520, 175351696, 280234816, 316784448, 267124960, -164828496, 53560388, -54754392, -164943920, -264043856, -327144960, -348748672, -347294272, -340326240, -329075552, --306791648, -271212160, -226679248, -179788944, -134819568, -91358784, -46217608, 1948305, 51128364, 98800888, -143956032, 185903360, 223205696, 254543392, 279389248, 297522048, 308752864, 313207264, 311433440, 304490624, -294090912, 281911456, 268454784, 253179728, 235893024, 217406416, 198865568, 181129504, 164740448, 149718800, -135312944, 120514096, 104906720, 88763016, 72480792, 56328496, 40613212, 25741350, 12032351, -425202, --11732240, -22002580, -31228170, -39348344, -46411416, -52493092, -57499412, -61295088, -64025616, -66019016, --67385352, -68027984, -68061272, -67838472, -67479304, -66735740, -65527244, -64324116, -63756644, -63998772, --64753612, -65714072, -66779224, -67802504, -68379640, -68074160, -66823248, -65060700, -63425392, -62366684, --62037044, -62612032, -64670396, -69012072, -75856640, -84277992, -92689688, -99956776, -105894032, -110643728, --113752208, -114045880, -110504136, -103202696, -93259312, -81803560, -69157560, -55132348, -39913132, -24388434, --9687836, 3438121, 14907295, 25171192, 34681860, 43366820, 50702624, 56338160, 60504280, 63885492, -67284960, 71270152, 75776112, 80083960, 83495240, 85966992, 87916368, 89653144, 91292216, 92918400, -94461360, 95609728, 96113312, 95987152, 95276872, 93914288, 91903176, 89335856, 86142552, 82104744, -77110232, 71161168, 64230164, 56386480, 47918952, 39143796, 30273076, 21537114, 13142600, 5056787, --2822867, -10342281, -17255032, -23532662, -29110214, -33621540, -36813240, -38884488, -40048424, -40223444, --39477192, -38198904, -36531380, -34227668, -31245888, -27889370, -24346558, -20729122, -17398376, -14614163, --12166569, -9895068, -7998840, -6334003, -4242891, -1566589, 1091995, 3431679, 5676873, 7654169, -8916889, 9718437, 10595684, 11388643, 11908334, 12730820, 14100915, 15284715, 16068546, 17187386, -18505940, 19101868, 19503984, 20854750, 22139482, 22066468, 22573812, 25519086, 28031104, 27629524, -28576564, 34391952, 38481832, 34390876, 31168578, 42307576, 60968672, 64931852, 48531520, 30916248, -27147952, 28959354, 22742388, 11207180, 6075768, 9893457, 15458661, 16604880, 11769284, 1722282, --10866267, -23903104, -41185516, -68761888, -99917048, -109958680, -78720848, -20484846, 22592064, 28151900, -21925272, 38224672, 65255048, 67648416, 60901024, 105280384, 197452000, 226874128, 103426568, }, +11638825, -44356812, -103051296, -108493024, -50523848, 52062520, 175351696, 280234816, 316784448, 267124960, +164828496, 53560388, -54754392, -164943920, -264043856, -327144960, -348748672, -347294272, -340326240, -329075552, +-306791648, -271212160, -226679248, -179788944, -134819568, -91358784, -46217608, 1948305, 51128364, 98800888, +143956032, 185903360, 223205696, 254543392, 279389248, 297522048, 308752864, 313207264, 311433440, 304490624, +294090912, 281911456, 268454784, 253179728, 235893024, 217406416, 198865568, 181129504, 164740448, 149718800, +135312944, 120514096, 104906720, 88763016, 72480792, 56328496, 40613212, 25741350, 12032351, -425202, +-11732240, -22002580, -31228170, -39348344, -46411416, -52493092, -57499412, -61295088, -64025616, -66019016, +-67385352, -68027984, -68061272, -67838472, -67479304, -66735740, -65527244, -64324116, -63756644, -63998772, +-64753612, -65714072, -66779224, -67802504, -68379640, -68074160, -66823248, -65060700, -63425392, -62366684, +-62037044, -62612032, -64670396, -69012072, -75856640, -84277992, -92689688, -99956776, -105894032, -110643728, +-113752208, -114045880, -110504136, -103202696, -93259312, -81803560, -69157560, -55132348, -39913132, -24388434, +-9687836, 3438121, 14907295, 25171192, 34681860, 43366820, 50702624, 56338160, 60504280, 63885492, +67284960, 71270152, 75776112, 80083960, 83495240, 85966992, 87916368, 89653144, 91292216, 92918400, +94461360, 95609728, 96113312, 95987152, 95276872, 93914288, 91903176, 89335856, 86142552, 82104744, +77110232, 71161168, 64230164, 56386480, 47918952, 39143796, 30273076, 21537114, 13142600, 5056787, +-2822867, -10342281, -17255032, -23532662, -29110214, -33621540, -36813240, -38884488, -40048424, -40223444, +-39477192, -38198904, -36531380, -34227668, -31245888, -27889370, -24346558, -20729122, -17398376, -14614163, +-12166569, -9895068, -7998840, -6334003, -4242891, -1566589, 1091995, 3431679, 5676873, 7654169, +8916889, 9718437, 10595684, 11388643, 11908334, 12730820, 14100915, 15284715, 16068546, 17187386, +18505940, 19101868, 19503984, 20854750, 22139482, 22066468, 22573812, 25519086, 28031104, 27629524, +28576564, 34391952, 38481832, 34390876, 31168578, 42307576, 60968672, 64931852, 48531520, 30916248, +27147952, 28959354, 22742388, 11207180, 6075768, 9893457, 15458661, 16604880, 11769284, 1722282, +-10866267, -23903104, -41185516, -68761888, -99917048, -109958680, -78720848, -20484846, 22592064, 28151900, +21925272, 38224672, 65255048, 67648416, 60901024, 105280384, 197452000, 226874128, 103426568, }, }, }; const Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 481896416, -310217984, 58414776, -164563280, -304120192, -367148288, -380131456, -355551904, -293191648, -196581728, -79275968, -40710920, 147338320, 229316352, 281262912, 303829760, 301715552, 280467264, 244312240, 196129680, 138977088, -77330352, 16125992, -41793788, -96546568, -148845856, -197435344, -239701056, -274179968, -301347776, -322237984, --337472224, -347732896, -354176960, -357916256, -359532256, -359364736, -357953312, -355943808, -353696992, -351132352, --347911680, -343733216, -338496032, -332253312, -325083936, -317056640, -308251424, -298721952, -288455904, -277455968, --265846672, -253836864, -241596736, -229251936, -216980144, -205003616, -193438352, -182215600, -171222096, -160454608, --149944832, -139622944, -129395552, -119315800, -109508784, -99968048, -90599112, -81424528, -72528040, -63835024, --55175836, -46532748, -37983616, -29444148, -20744692, -11905649, -3056406, 5887864, 15157476, 24732032, -34304440, 43698608, 53047140, 62476740, 71822056, 80786728, 89310624, 97632120, 105963288, 114152712, -121790776, 128664872, 134969888, 140964592, 146582400, 151548464, 155807984, 159674544, 163566320, 167695392, -171996800, 176316992, 180702160, 185452400, 190833984, 196802912, 203105776, 209568640, 216174832, 222944240, -229863968, 236866912, 243799520, 250473360, 256799312, 262798304, 268505248, 273959872, 279246432, 284425632, -289483488, 294429664, 299342048, 304237760, 309028800, 313663072, 318155072, 322462912, 326518432, 330373184, -334144160, 337883456, 341634592, 345500064, 349513152, 353603584, 357777216, 362119968, 366623232, 371291872, -376310016, 381789312, 387576768, 393623552, 400144384, 407121568, 414326912, 422021344, 430657984, 440077920, -450606496, 463627232, 476568512, 477523040, 452622976, 403573920, 351848544, 318913664, 307050976, }, +310217984, 58414776, -164563280, -304120192, -367148288, -380131456, -355551904, -293191648, -196581728, -79275968, +40710920, 147338320, 229316352, 281262912, 303829760, 301715552, 280467264, 244312240, 196129680, 138977088, +77330352, 16125992, -41793788, -96546568, -148845856, -197435344, -239701056, -274179968, -301347776, -322237984, +-337472224, -347732896, -354176960, -357916256, -359532256, -359364736, -357953312, -355943808, -353696992, -351132352, +-347911680, -343733216, -338496032, -332253312, -325083936, -317056640, -308251424, -298721952, -288455904, -277455968, +-265846672, -253836864, -241596736, -229251936, -216980144, -205003616, -193438352, -182215600, -171222096, -160454608, +-149944832, -139622944, -129395552, -119315800, -109508784, -99968048, -90599112, -81424528, -72528040, -63835024, +-55175836, -46532748, -37983616, -29444148, -20744692, -11905649, -3056406, 5887864, 15157476, 24732032, +34304440, 43698608, 53047140, 62476740, 71822056, 80786728, 89310624, 97632120, 105963288, 114152712, +121790776, 128664872, 134969888, 140964592, 146582400, 151548464, 155807984, 159674544, 163566320, 167695392, +171996800, 176316992, 180702160, 185452400, 190833984, 196802912, 203105776, 209568640, 216174832, 222944240, +229863968, 236866912, 243799520, 250473360, 256799312, 262798304, 268505248, 273959872, 279246432, 284425632, +289483488, 294429664, 299342048, 304237760, 309028800, 313663072, 318155072, 322462912, 326518432, 330373184, +334144160, 337883456, 341634592, 345500064, 349513152, 353603584, 357777216, 362119968, 366623232, 371291872, +376310016, 381789312, 387576768, 393623552, 400144384, 407121568, 414326912, 422021344, 430657984, 440077920, +450606496, 463627232, 476568512, 477523040, 452622976, 403573920, 351848544, 318913664, 307050976, }, { 481896416, -310217984, 58414776, -164563280, -304120192, -367148288, -380131456, -355551904, -293191648, -196581728, -79275968, -40710920, 147338320, 229316352, 281262912, 303829760, 301715552, 280467264, 244312240, 196129680, 138977088, -77330352, 16125992, -41793788, -96546568, -148845856, -197435344, -239701056, -274179968, -301347776, -322237984, --337472224, -347732896, -354176960, -357916256, -359532256, -359364736, -357953312, -355943808, -353696992, -351132352, --347911680, -343733216, -338496032, -332253312, -325083936, -317056640, -308251424, -298721952, -288455904, -277455968, --265846672, -253836864, -241596736, -229251936, -216980144, -205003616, -193438352, -182215600, -171222096, -160454608, --149944832, -139622944, -129395552, -119315800, -109508784, -99968048, -90599112, -81424528, -72528040, -63835024, --55175836, -46532748, -37983616, -29444148, -20744692, -11905649, -3056406, 5887864, 15157476, 24732032, -34304440, 43698608, 53047140, 62476740, 71822056, 80786728, 89310624, 97632120, 105963288, 114152712, -121790776, 128664872, 134969888, 140964592, 146582400, 151548464, 155807984, 159674544, 163566320, 167695392, -171996800, 176316992, 180702160, 185452400, 190833984, 196802912, 203105776, 209568640, 216174832, 222944240, -229863968, 236866912, 243799520, 250473360, 256799312, 262798304, 268505248, 273959872, 279246432, 284425632, -289483488, 294429664, 299342048, 304237760, 309028800, 313663072, 318155072, 322462912, 326518432, 330373184, -334144160, 337883456, 341634592, 345500064, 349513152, 353603584, 357777216, 362119968, 366623232, 371291872, -376310016, 381789312, 387576768, 393623552, 400144384, 407121568, 414326912, 422021344, 430657984, 440077920, -450606496, 463627232, 476568512, 477523040, 452622976, 403573920, 351848544, 318913664, 307050976, }, +310217984, 58414776, -164563280, -304120192, -367148288, -380131456, -355551904, -293191648, -196581728, -79275968, +40710920, 147338320, 229316352, 281262912, 303829760, 301715552, 280467264, 244312240, 196129680, 138977088, +77330352, 16125992, -41793788, -96546568, -148845856, -197435344, -239701056, -274179968, -301347776, -322237984, +-337472224, -347732896, -354176960, -357916256, -359532256, -359364736, -357953312, -355943808, -353696992, -351132352, +-347911680, -343733216, -338496032, -332253312, -325083936, -317056640, -308251424, -298721952, -288455904, -277455968, +-265846672, -253836864, -241596736, -229251936, -216980144, -205003616, -193438352, -182215600, -171222096, -160454608, +-149944832, -139622944, -129395552, -119315800, -109508784, -99968048, -90599112, -81424528, -72528040, -63835024, +-55175836, -46532748, -37983616, -29444148, -20744692, -11905649, -3056406, 5887864, 15157476, 24732032, +34304440, 43698608, 53047140, 62476740, 71822056, 80786728, 89310624, 97632120, 105963288, 114152712, +121790776, 128664872, 134969888, 140964592, 146582400, 151548464, 155807984, 159674544, 163566320, 167695392, +171996800, 176316992, 180702160, 185452400, 190833984, 196802912, 203105776, 209568640, 216174832, 222944240, +229863968, 236866912, 243799520, 250473360, 256799312, 262798304, 268505248, 273959872, 279246432, 284425632, +289483488, 294429664, 299342048, 304237760, 309028800, 313663072, 318155072, 322462912, 326518432, 330373184, +334144160, 337883456, 341634592, 345500064, 349513152, 353603584, 357777216, 362119968, 366623232, 371291872, +376310016, 381789312, 387576768, 393623552, 400144384, 407121568, 414326912, 422021344, 430657984, 440077920, +450606496, 463627232, 476568512, 477523040, 452622976, 403573920, 351848544, 318913664, 307050976, }, }, { { 13525926, -183669984, 362690656, 366411168, 138906224, -214040240, -522691616, -677840320, -674817728, -568401856, -410595104, --229047392, -39669392, 141587360, 300526368, 428658144, 521396160, 575446144, 590423808, 571661760, 529043328, -471929408, 405152864, 330017760, 248510032, 165263904, 85160072, 10375030, -59271084, -124093952, -183848752, --238508128, -288401696, -333674400, -374409472, -411122848, -444532864, -474971296, -502325408, -526306912, -546517440, --562593472, -574554944, -582817408, -587780800, -589642624, -588579072, -584835520, -578711936, -570693248, -561455296, --551466304, -540655296, -528643360, -515168992, -500203168, -483882304, -466478016, -448338752, -429813472, -411243104, --392908448, -374906080, -357258080, -340159808, -323866848, -308357728, -293488000, -279438080, -266554256, -254817184, --243973472, -234108464, -225463232, -217766112, -210407760, -203240544, -196530192, -190128544, -183390272, -175983056, --168182864, -160230736, -151880240, -142743232, -132778376, -122292752, -111605264, -100761544, -89523224, -77611136, --64876016, -51212116, -36453536, -20468204, -3209414, 15364172, 35185984, 55814712, 76534704, 96804264, -116362472, 134906000, 151974192, 167189120, 180361248, 191393408, 200296336, 207218208, 212311504, 215768416, -218109712, 220124048, 222336496, 224759936, 227243504, 229805440, 232639584, 236098640, 240605680, 246271280, -252668096, 259198048, 265524544, 271540192, 277264832, 282908960, 288683008, 294484448, 300107616, 305644896, -311247680, 316729152, 321888480, 326903904, 331966080, 336980448, 342003424, 347368896, 353091936, 358864928, -364784448, 371252128, 378262080, 385742272, 394208192, 404053344, 414948608, 426906880, 440630368, 456193696, -473796640, 495514144, 520240800, 534992928, 520508704, 473353184, 415980480, 375763456, 359659488, }, +183669984, 362690656, 366411168, 138906224, -214040240, -522691616, -677840320, -674817728, -568401856, -410595104, +-229047392, -39669392, 141587360, 300526368, 428658144, 521396160, 575446144, 590423808, 571661760, 529043328, +471929408, 405152864, 330017760, 248510032, 165263904, 85160072, 10375030, -59271084, -124093952, -183848752, +-238508128, -288401696, -333674400, -374409472, -411122848, -444532864, -474971296, -502325408, -526306912, -546517440, +-562593472, -574554944, -582817408, -587780800, -589642624, -588579072, -584835520, -578711936, -570693248, -561455296, +-551466304, -540655296, -528643360, -515168992, -500203168, -483882304, -466478016, -448338752, -429813472, -411243104, +-392908448, -374906080, -357258080, -340159808, -323866848, -308357728, -293488000, -279438080, -266554256, -254817184, +-243973472, -234108464, -225463232, -217766112, -210407760, -203240544, -196530192, -190128544, -183390272, -175983056, +-168182864, -160230736, -151880240, -142743232, -132778376, -122292752, -111605264, -100761544, -89523224, -77611136, +-64876016, -51212116, -36453536, -20468204, -3209414, 15364172, 35185984, 55814712, 76534704, 96804264, +116362472, 134906000, 151974192, 167189120, 180361248, 191393408, 200296336, 207218208, 212311504, 215768416, +218109712, 220124048, 222336496, 224759936, 227243504, 229805440, 232639584, 236098640, 240605680, 246271280, +252668096, 259198048, 265524544, 271540192, 277264832, 282908960, 288683008, 294484448, 300107616, 305644896, +311247680, 316729152, 321888480, 326903904, 331966080, 336980448, 342003424, 347368896, 353091936, 358864928, +364784448, 371252128, 378262080, 385742272, 394208192, 404053344, 414948608, 426906880, 440630368, 456193696, +473796640, 495514144, 520240800, 534992928, 520508704, 473353184, 415980480, 375763456, 359659488, }, { -13525926, --183669984, -362690656, -366411168, -138906224, 214040240, 522691616, 677840320, 674817728, 568401856, 410595104, -229047392, 39669392, -141587360, -300526368, -428658144, -521396160, -575446144, -590423808, -571661760, -529043328, --471929408, -405152864, -330017760, -248510032, -165263904, -85160072, -10375030, 59271084, 124093952, 183848752, -238508128, 288401696, 333674400, 374409472, 411122848, 444532864, 474971296, 502325408, 526306912, 546517440, -562593472, 574554944, 582817408, 587780800, 589642624, 588579072, 584835520, 578711936, 570693248, 561455296, -551466304, 540655296, 528643360, 515168992, 500203168, 483882304, 466478016, 448338752, 429813472, 411243104, -392908448, 374906080, 357258080, 340159808, 323866848, 308357728, 293488000, 279438080, 266554256, 254817184, -243973472, 234108464, 225463232, 217766112, 210407760, 203240544, 196530192, 190128544, 183390272, 175983056, -168182864, 160230736, 151880240, 142743232, 132778376, 122292752, 111605264, 100761544, 89523224, 77611136, -64876016, 51212116, 36453536, 20468204, 3209414, -15364172, -35185984, -55814712, -76534704, -96804264, --116362472, -134906000, -151974192, -167189120, -180361248, -191393408, -200296336, -207218208, -212311504, -215768416, --218109712, -220124048, -222336496, -224759936, -227243504, -229805440, -232639584, -236098640, -240605680, -246271280, --252668096, -259198048, -265524544, -271540192, -277264832, -282908960, -288683008, -294484448, -300107616, -305644896, --311247680, -316729152, -321888480, -326903904, -331966080, -336980448, -342003424, -347368896, -353091936, -358864928, --364784448, -371252128, -378262080, -385742272, -394208192, -404053344, -414948608, -426906880, -440630368, -456193696, --473796640, -495514144, -520240800, -534992928, -520508704, -473353184, -415980480, -375763456, -359659488, }, +-183669984, -362690656, -366411168, -138906224, 214040240, 522691616, 677840320, 674817728, 568401856, 410595104, +229047392, 39669392, -141587360, -300526368, -428658144, -521396160, -575446144, -590423808, -571661760, -529043328, +-471929408, -405152864, -330017760, -248510032, -165263904, -85160072, -10375030, 59271084, 124093952, 183848752, +238508128, 288401696, 333674400, 374409472, 411122848, 444532864, 474971296, 502325408, 526306912, 546517440, +562593472, 574554944, 582817408, 587780800, 589642624, 588579072, 584835520, 578711936, 570693248, 561455296, +551466304, 540655296, 528643360, 515168992, 500203168, 483882304, 466478016, 448338752, 429813472, 411243104, +392908448, 374906080, 357258080, 340159808, 323866848, 308357728, 293488000, 279438080, 266554256, 254817184, +243973472, 234108464, 225463232, 217766112, 210407760, 203240544, 196530192, 190128544, 183390272, 175983056, +168182864, 160230736, 151880240, 142743232, 132778376, 122292752, 111605264, 100761544, 89523224, 77611136, +64876016, 51212116, 36453536, 20468204, 3209414, -15364172, -35185984, -55814712, -76534704, -96804264, +-116362472, -134906000, -151974192, -167189120, -180361248, -191393408, -200296336, -207218208, -212311504, -215768416, +-218109712, -220124048, -222336496, -224759936, -227243504, -229805440, -232639584, -236098640, -240605680, -246271280, +-252668096, -259198048, -265524544, -271540192, -277264832, -282908960, -288683008, -294484448, -300107616, -305644896, +-311247680, -316729152, -321888480, -326903904, -331966080, -336980448, -342003424, -347368896, -353091936, -358864928, +-364784448, -371252128, -378262080, -385742272, -394208192, -404053344, -414948608, -426906880, -440630368, -456193696, +-473796640, -495514144, -520240800, -534992928, -520508704, -473353184, -415980480, -375763456, -359659488, }, }, { { 66455492, -42489036, -7303592, -56425132, -60765736, -13364864, 39979704, 53002044, 24871618, -14745160, -41990284, --47383152, -29909078, -205622, 22675280, 31130996, 37305012, 53430468, 73776800, 84180288, 80077520, -66210680, 45848240, 19817516, -7459822, -29043642, -42323680, -50713900, -58782532, -67827736, -75635984, --79104168, -77078560, -70941048, -62747860, -53937808, -46253040, -42276972, -43666932, -49686328, -58409944, --68580968, -79631912, -90862720, -101538936, -111372264, -120424440, -128844184, -136780752, -144075216, -149948048, --153377584, -153809760, -151199488, -145503296, -136517152, -124198640, -108806552, -90635624, -69779256, -46251964, --20236276, 7921531, 37937448, 69579008, 102332968, 135326896, 167705584, 198836592, 228010144, 254259376, -276677504, 294603072, 307423552, 314699232, 316621216, 313799424, 306456128, 294547232, 278876512, 261192000, -242652224, 223062352, 202313904, 181782336, 163247408, 146855136, 131297152, 116018344, 102219688, 91343752, -83339008, 76982456, 71439800, 66915592, 63953672, 62676996, 62753768, 63661080, 64808372, 65666292, -66025460, 66092032, 66163436, 66112968, 65171832, 62365072, 57319024, 50632832, 43322260, 35932232, -28326384, 20185810, 11475079, 2470680, -6353331, -14421963, -21213380, -26396332, -29804388, -31382252, --31219044, -29484950, -26259966, -21551072, -15535434, -8628052, -1274532, 6187438, 13492640, 20416128, -26744762, 32187558, 36453536, 39546984, 41860360, 43914968, 46180564, 49097920, 52860308, 57086556, -61080876, 64526516, 67592584, 70358008, 72584408, 74128992, 75091064, 75411576, 74807056, 73303816, -71312560, 68612640, 63502164, 53864260, 39855148, 25321516, 15413564, 12046846, 12323335, }, +42489036, -7303592, -56425132, -60765736, -13364864, 39979704, 53002044, 24871618, -14745160, -41990284, +-47383152, -29909078, -205622, 22675280, 31130996, 37305012, 53430468, 73776800, 84180288, 80077520, +66210680, 45848240, 19817516, -7459822, -29043642, -42323680, -50713900, -58782532, -67827736, -75635984, +-79104168, -77078560, -70941048, -62747860, -53937808, -46253040, -42276972, -43666932, -49686328, -58409944, +-68580968, -79631912, -90862720, -101538936, -111372264, -120424440, -128844184, -136780752, -144075216, -149948048, +-153377584, -153809760, -151199488, -145503296, -136517152, -124198640, -108806552, -90635624, -69779256, -46251964, +-20236276, 7921531, 37937448, 69579008, 102332968, 135326896, 167705584, 198836592, 228010144, 254259376, +276677504, 294603072, 307423552, 314699232, 316621216, 313799424, 306456128, 294547232, 278876512, 261192000, +242652224, 223062352, 202313904, 181782336, 163247408, 146855136, 131297152, 116018344, 102219688, 91343752, +83339008, 76982456, 71439800, 66915592, 63953672, 62676996, 62753768, 63661080, 64808372, 65666292, +66025460, 66092032, 66163436, 66112968, 65171832, 62365072, 57319024, 50632832, 43322260, 35932232, +28326384, 20185810, 11475079, 2470680, -6353331, -14421963, -21213380, -26396332, -29804388, -31382252, +-31219044, -29484950, -26259966, -21551072, -15535434, -8628052, -1274532, 6187438, 13492640, 20416128, +26744762, 32187558, 36453536, 39546984, 41860360, 43914968, 46180564, 49097920, 52860308, 57086556, +61080876, 64526516, 67592584, 70358008, 72584408, 74128992, 75091064, 75411576, 74807056, 73303816, +71312560, 68612640, 63502164, 53864260, 39855148, 25321516, 15413564, 12046846, 12323335, }, { 66455492, -42489036, -7303592, -56425132, -60765736, -13364864, 39979704, 53002044, 24871618, -14745160, -41990284, --47383152, -29909078, -205622, 22675280, 31130996, 37305012, 53430468, 73776800, 84180288, 80077520, -66210680, 45848240, 19817516, -7459822, -29043642, -42323680, -50713900, -58782532, -67827736, -75635984, --79104168, -77078560, -70941048, -62747860, -53937808, -46253040, -42276972, -43666932, -49686328, -58409944, --68580968, -79631912, -90862720, -101538936, -111372264, -120424440, -128844184, -136780752, -144075216, -149948048, --153377584, -153809760, -151199488, -145503296, -136517152, -124198640, -108806552, -90635624, -69779256, -46251964, --20236276, 7921531, 37937448, 69579008, 102332968, 135326896, 167705584, 198836592, 228010144, 254259376, -276677504, 294603072, 307423552, 314699232, 316621216, 313799424, 306456128, 294547232, 278876512, 261192000, -242652224, 223062352, 202313904, 181782336, 163247408, 146855136, 131297152, 116018344, 102219688, 91343752, -83339008, 76982456, 71439800, 66915592, 63953672, 62676996, 62753768, 63661080, 64808372, 65666292, -66025460, 66092032, 66163436, 66112968, 65171832, 62365072, 57319024, 50632832, 43322260, 35932232, -28326384, 20185810, 11475079, 2470680, -6353331, -14421963, -21213380, -26396332, -29804388, -31382252, --31219044, -29484950, -26259966, -21551072, -15535434, -8628052, -1274532, 6187438, 13492640, 20416128, -26744762, 32187558, 36453536, 39546984, 41860360, 43914968, 46180564, 49097920, 52860308, 57086556, -61080876, 64526516, 67592584, 70358008, 72584408, 74128992, 75091064, 75411576, 74807056, 73303816, -71312560, 68612640, 63502164, 53864260, 39855148, 25321516, 15413564, 12046846, 12323335, }, +42489036, -7303592, -56425132, -60765736, -13364864, 39979704, 53002044, 24871618, -14745160, -41990284, +-47383152, -29909078, -205622, 22675280, 31130996, 37305012, 53430468, 73776800, 84180288, 80077520, +66210680, 45848240, 19817516, -7459822, -29043642, -42323680, -50713900, -58782532, -67827736, -75635984, +-79104168, -77078560, -70941048, -62747860, -53937808, -46253040, -42276972, -43666932, -49686328, -58409944, +-68580968, -79631912, -90862720, -101538936, -111372264, -120424440, -128844184, -136780752, -144075216, -149948048, +-153377584, -153809760, -151199488, -145503296, -136517152, -124198640, -108806552, -90635624, -69779256, -46251964, +-20236276, 7921531, 37937448, 69579008, 102332968, 135326896, 167705584, 198836592, 228010144, 254259376, +276677504, 294603072, 307423552, 314699232, 316621216, 313799424, 306456128, 294547232, 278876512, 261192000, +242652224, 223062352, 202313904, 181782336, 163247408, 146855136, 131297152, 116018344, 102219688, 91343752, +83339008, 76982456, 71439800, 66915592, 63953672, 62676996, 62753768, 63661080, 64808372, 65666292, +66025460, 66092032, 66163436, 66112968, 65171832, 62365072, 57319024, 50632832, 43322260, 35932232, +28326384, 20185810, 11475079, 2470680, -6353331, -14421963, -21213380, -26396332, -29804388, -31382252, +-31219044, -29484950, -26259966, -21551072, -15535434, -8628052, -1274532, 6187438, 13492640, 20416128, +26744762, 32187558, 36453536, 39546984, 41860360, 43914968, 46180564, 49097920, 52860308, 57086556, +61080876, 64526516, 67592584, 70358008, 72584408, 74128992, 75091064, 75411576, 74807056, 73303816, +71312560, 68612640, 63502164, 53864260, 39855148, 25321516, 15413564, 12046846, 12323335, }, }, { { 11833172, -22050898, 12451110, -26542362, -61786864, -58906012, -27816356, -9918153, -28902446, -69264400, -99286760, --101615168, -80803904, -51693152, -25300042, -1960653, 25160456, 59849832, 96844536, 126515240, 143009520, -145950512, 137272528, 120158688, 99385008, 78400872, 55796456, 27408870, -8007967, -47571596, -88422104, --130155760, -172388720, -212445728, -247005184, -274629888, -295379392, -308997664, -314888224, -313453152, -306353024, --295421280, -281890528, -266567152, -250204400, -233463680, -216624192, -199466864, -181607856, -163049312, -144401632, --126627984, -110723720, -97463008, -86975232, -78442208, -70585104, -62549220, -54095648, -45135276, -35643932, --25954488, -16548509, -7518877, 1311039, 9896142, 18180060, 26588532, 35627292, 45120780, 54547696, -63959580, 73747272, 83600464, 92582312, 100256888, 106849656, 112147504, 115181896, 115410064, 113417200, -109878152, 104501384, 96770984, 87287696, 77452216, 67945312, 58334244, 48197048, 37726992, 26994944, -15467251, 2789045, -10579578, -24038396, -37650756, -51689396, -65735548, -78822312, -90355912, -100470560, --109487304, -117223616, -122861832, -125552096, -125297616, -123098056, -119972392, -115938344, -110206712, -102256728, --92516816, -82153600, -72332616, -63403916, -54622320, -44908716, -34036004, -22905060, -12717398, -4143570, -2891587, 9098888, 15460809, 22529788, 30061550, 37520296, 44748192, 51960516, 59451476, 67590976, -76761800, 87010128, 97994512, 109366512, 120924264, 132441224, 143733760, 154837872, 165794864, 176393232, -186362928, 195563280, 203809088, 210876992, 216793840, 221757744, 225868032, 229339984, 232655152, 236167904, -240298048, 246023248, 252849024, 255440496, 246008208, 223415616, 197305424, 179231136, 171975328, }, +22050898, 12451110, -26542362, -61786864, -58906012, -27816356, -9918153, -28902446, -69264400, -99286760, +-101615168, -80803904, -51693152, -25300042, -1960653, 25160456, 59849832, 96844536, 126515240, 143009520, +145950512, 137272528, 120158688, 99385008, 78400872, 55796456, 27408870, -8007967, -47571596, -88422104, +-130155760, -172388720, -212445728, -247005184, -274629888, -295379392, -308997664, -314888224, -313453152, -306353024, +-295421280, -281890528, -266567152, -250204400, -233463680, -216624192, -199466864, -181607856, -163049312, -144401632, +-126627984, -110723720, -97463008, -86975232, -78442208, -70585104, -62549220, -54095648, -45135276, -35643932, +-25954488, -16548509, -7518877, 1311039, 9896142, 18180060, 26588532, 35627292, 45120780, 54547696, +63959580, 73747272, 83600464, 92582312, 100256888, 106849656, 112147504, 115181896, 115410064, 113417200, +109878152, 104501384, 96770984, 87287696, 77452216, 67945312, 58334244, 48197048, 37726992, 26994944, +15467251, 2789045, -10579578, -24038396, -37650756, -51689396, -65735548, -78822312, -90355912, -100470560, +-109487304, -117223616, -122861832, -125552096, -125297616, -123098056, -119972392, -115938344, -110206712, -102256728, +-92516816, -82153600, -72332616, -63403916, -54622320, -44908716, -34036004, -22905060, -12717398, -4143570, +2891587, 9098888, 15460809, 22529788, 30061550, 37520296, 44748192, 51960516, 59451476, 67590976, +76761800, 87010128, 97994512, 109366512, 120924264, 132441224, 143733760, 154837872, 165794864, 176393232, +186362928, 195563280, 203809088, 210876992, 216793840, 221757744, 225868032, 229339984, 232655152, 236167904, +240298048, 246023248, 252849024, 255440496, 246008208, 223415616, 197305424, 179231136, 171975328, }, { 11833172, -22050898, 12451110, -26542362, -61786864, -58906012, -27816356, -9918153, -28902446, -69264400, -99286760, --101615168, -80803904, -51693152, -25300042, -1960653, 25160456, 59849832, 96844536, 126515240, 143009520, -145950512, 137272528, 120158688, 99385008, 78400872, 55796456, 27408870, -8007967, -47571596, -88422104, --130155760, -172388720, -212445728, -247005184, -274629888, -295379392, -308997664, -314888224, -313453152, -306353024, --295421280, -281890528, -266567152, -250204400, -233463680, -216624192, -199466864, -181607856, -163049312, -144401632, --126627984, -110723720, -97463008, -86975232, -78442208, -70585104, -62549220, -54095648, -45135276, -35643932, --25954488, -16548509, -7518877, 1311039, 9896142, 18180060, 26588532, 35627292, 45120780, 54547696, -63959580, 73747272, 83600464, 92582312, 100256888, 106849656, 112147504, 115181896, 115410064, 113417200, -109878152, 104501384, 96770984, 87287696, 77452216, 67945312, 58334244, 48197048, 37726992, 26994944, -15467251, 2789045, -10579578, -24038396, -37650756, -51689396, -65735548, -78822312, -90355912, -100470560, --109487304, -117223616, -122861832, -125552096, -125297616, -123098056, -119972392, -115938344, -110206712, -102256728, --92516816, -82153600, -72332616, -63403916, -54622320, -44908716, -34036004, -22905060, -12717398, -4143570, -2891587, 9098888, 15460809, 22529788, 30061550, 37520296, 44748192, 51960516, 59451476, 67590976, -76761800, 87010128, 97994512, 109366512, 120924264, 132441224, 143733760, 154837872, 165794864, 176393232, -186362928, 195563280, 203809088, 210876992, 216793840, 221757744, 225868032, 229339984, 232655152, 236167904, -240298048, 246023248, 252849024, 255440496, 246008208, 223415616, 197305424, 179231136, 171975328, }, +22050898, 12451110, -26542362, -61786864, -58906012, -27816356, -9918153, -28902446, -69264400, -99286760, +-101615168, -80803904, -51693152, -25300042, -1960653, 25160456, 59849832, 96844536, 126515240, 143009520, +145950512, 137272528, 120158688, 99385008, 78400872, 55796456, 27408870, -8007967, -47571596, -88422104, +-130155760, -172388720, -212445728, -247005184, -274629888, -295379392, -308997664, -314888224, -313453152, -306353024, +-295421280, -281890528, -266567152, -250204400, -233463680, -216624192, -199466864, -181607856, -163049312, -144401632, +-126627984, -110723720, -97463008, -86975232, -78442208, -70585104, -62549220, -54095648, -45135276, -35643932, +-25954488, -16548509, -7518877, 1311039, 9896142, 18180060, 26588532, 35627292, 45120780, 54547696, +63959580, 73747272, 83600464, 92582312, 100256888, 106849656, 112147504, 115181896, 115410064, 113417200, +109878152, 104501384, 96770984, 87287696, 77452216, 67945312, 58334244, 48197048, 37726992, 26994944, +15467251, 2789045, -10579578, -24038396, -37650756, -51689396, -65735548, -78822312, -90355912, -100470560, +-109487304, -117223616, -122861832, -125552096, -125297616, -123098056, -119972392, -115938344, -110206712, -102256728, +-92516816, -82153600, -72332616, -63403916, -54622320, -44908716, -34036004, -22905060, -12717398, -4143570, +2891587, 9098888, 15460809, 22529788, 30061550, 37520296, 44748192, 51960516, 59451476, 67590976, +76761800, 87010128, 97994512, 109366512, 120924264, 132441224, 143733760, 154837872, 165794864, 176393232, +186362928, 195563280, 203809088, 210876992, 216793840, 221757744, 225868032, 229339984, 232655152, 236167904, +240298048, 246023248, 252849024, 255440496, 246008208, 223415616, 197305424, 179231136, 171975328, }, }, { { -2799245, --6461242, -4839355, 4228932, 10352482, 5557688, -2879239, -4031901, -4235375, -23969676, -69864624, --119191248, -140357376, -124462248, -88925688, -53108344, -20214264, 15939697, 56487948, 96248608, 131457136, -161556272, 184781840, 197673184, 199340176, 192308768, 178485952, 157262912, 128219808, 93059056, 53966264, -12078522, -31656594, -75794896, -119164408, -160668816, -197753184, -226699648, -245372560, -254762432, -257492416, --255849056, -251453152, -245508384, -238591344, -230725104, -221897344, -212102672, -201079632, -188643552, -175189568, --161430096, -147956784, -135404752, -124500368, -115428320, -107563160, -100188704, -93028992, -85878944, -78345576, --70234528, -61632780, -52467320, -42505680, -31803696, -20560008, -8610336, 4320737, 17988396, 31924492, -46197204, 61139932, 76425184, 91154776, 104847664, 117561848, 128919352, 137823360, 143591488, 146795008, -148332608, 148056112, 145138224, 139709920, 133072048, 125938104, 117463064, 106697192, 94169304, 81123880, -67869608, 53943716, 39527120, 25675314, 13233868, 2276333, -7464653, -16153372, -23796266, -30318712, --35788888, -40561672, -44957572, -48943300, -52537652, -56276420, -60665876, -65368328, -69496864, -72567768, --74776992, -76658720, -78807280, -81478752, -84098680, -85603528, -85559504, -84545360, -83402360, -82655568, --82548736, -82935280, -83151104, -82575576, -81216224, -79330728, -76860584, -73636680, -69632696, -64636572, --58252104, -50539416, -42062764, -33211908, -24143622, -15275051, -7023346, 731755, 8172249, 14932528, -20656646, 25547540, 29744796, 33010044, 35549980, 38117836, 40965936, 43895640, 47351476, 52045340, -58054536, 66093104, 78244104, 94179504, 107807440, 111929536, 106298832, 97620848, 92195232, }, +-6461242, -4839355, 4228932, 10352482, 5557688, -2879239, -4031901, -4235375, -23969676, -69864624, +-119191248, -140357376, -124462248, -88925688, -53108344, -20214264, 15939697, 56487948, 96248608, 131457136, +161556272, 184781840, 197673184, 199340176, 192308768, 178485952, 157262912, 128219808, 93059056, 53966264, +12078522, -31656594, -75794896, -119164408, -160668816, -197753184, -226699648, -245372560, -254762432, -257492416, +-255849056, -251453152, -245508384, -238591344, -230725104, -221897344, -212102672, -201079632, -188643552, -175189568, +-161430096, -147956784, -135404752, -124500368, -115428320, -107563160, -100188704, -93028992, -85878944, -78345576, +-70234528, -61632780, -52467320, -42505680, -31803696, -20560008, -8610336, 4320737, 17988396, 31924492, +46197204, 61139932, 76425184, 91154776, 104847664, 117561848, 128919352, 137823360, 143591488, 146795008, +148332608, 148056112, 145138224, 139709920, 133072048, 125938104, 117463064, 106697192, 94169304, 81123880, +67869608, 53943716, 39527120, 25675314, 13233868, 2276333, -7464653, -16153372, -23796266, -30318712, +-35788888, -40561672, -44957572, -48943300, -52537652, -56276420, -60665876, -65368328, -69496864, -72567768, +-74776992, -76658720, -78807280, -81478752, -84098680, -85603528, -85559504, -84545360, -83402360, -82655568, +-82548736, -82935280, -83151104, -82575576, -81216224, -79330728, -76860584, -73636680, -69632696, -64636572, +-58252104, -50539416, -42062764, -33211908, -24143622, -15275051, -7023346, 731755, 8172249, 14932528, +20656646, 25547540, 29744796, 33010044, 35549980, 38117836, 40965936, 43895640, 47351476, 52045340, +58054536, 66093104, 78244104, 94179504, 107807440, 111929536, 106298832, 97620848, 92195232, }, { 2799245, -6461242, 4839355, -4228932, -10352482, -5557688, 2879239, 4031901, 4235375, 23969676, 69864624, -119191248, 140357376, 124462248, 88925688, 53108344, 20214264, -15939697, -56487948, -96248608, -131457136, --161556272, -184781840, -197673184, -199340176, -192308768, -178485952, -157262912, -128219808, -93059056, -53966264, --12078522, 31656594, 75794896, 119164408, 160668816, 197753184, 226699648, 245372560, 254762432, 257492416, -255849056, 251453152, 245508384, 238591344, 230725104, 221897344, 212102672, 201079632, 188643552, 175189568, -161430096, 147956784, 135404752, 124500368, 115428320, 107563160, 100188704, 93028992, 85878944, 78345576, -70234528, 61632780, 52467320, 42505680, 31803696, 20560008, 8610336, -4320737, -17988396, -31924492, --46197204, -61139932, -76425184, -91154776, -104847664, -117561848, -128919352, -137823360, -143591488, -146795008, --148332608, -148056112, -145138224, -139709920, -133072048, -125938104, -117463064, -106697192, -94169304, -81123880, --67869608, -53943716, -39527120, -25675314, -13233868, -2276333, 7464653, 16153372, 23796266, 30318712, -35788888, 40561672, 44957572, 48943300, 52537652, 56276420, 60665876, 65368328, 69496864, 72567768, -74776992, 76658720, 78807280, 81478752, 84098680, 85603528, 85559504, 84545360, 83402360, 82655568, -82548736, 82935280, 83151104, 82575576, 81216224, 79330728, 76860584, 73636680, 69632696, 64636572, -58252104, 50539416, 42062764, 33211908, 24143622, 15275051, 7023346, -731755, -8172249, -14932528, --20656646, -25547540, -29744796, -33010044, -35549980, -38117836, -40965936, -43895640, -47351476, -52045340, --58054536, -66093104, -78244104, -94179504, -107807440, -111929536, -106298832, -97620848, -92195232, }, +6461242, 4839355, -4228932, -10352482, -5557688, 2879239, 4031901, 4235375, 23969676, 69864624, +119191248, 140357376, 124462248, 88925688, 53108344, 20214264, -15939697, -56487948, -96248608, -131457136, +-161556272, -184781840, -197673184, -199340176, -192308768, -178485952, -157262912, -128219808, -93059056, -53966264, +-12078522, 31656594, 75794896, 119164408, 160668816, 197753184, 226699648, 245372560, 254762432, 257492416, +255849056, 251453152, 245508384, 238591344, 230725104, 221897344, 212102672, 201079632, 188643552, 175189568, +161430096, 147956784, 135404752, 124500368, 115428320, 107563160, 100188704, 93028992, 85878944, 78345576, +70234528, 61632780, 52467320, 42505680, 31803696, 20560008, 8610336, -4320737, -17988396, -31924492, +-46197204, -61139932, -76425184, -91154776, -104847664, -117561848, -128919352, -137823360, -143591488, -146795008, +-148332608, -148056112, -145138224, -139709920, -133072048, -125938104, -117463064, -106697192, -94169304, -81123880, +-67869608, -53943716, -39527120, -25675314, -13233868, -2276333, 7464653, 16153372, 23796266, 30318712, +35788888, 40561672, 44957572, 48943300, 52537652, 56276420, 60665876, 65368328, 69496864, 72567768, +74776992, 76658720, 78807280, 81478752, 84098680, 85603528, 85559504, 84545360, 83402360, 82655568, +82548736, 82935280, 83151104, 82575576, 81216224, 79330728, 76860584, 73636680, 69632696, 64636572, +58252104, 50539416, 42062764, 33211908, 24143622, 15275051, 7023346, -731755, -8172249, -14932528, +-20656646, -25547540, -29744796, -33010044, -35549980, -38117836, -40965936, -43895640, -47351476, -52045340, +-58054536, -66093104, -78244104, -94179504, -107807440, -111929536, -106298832, -97620848, -92195232, }, }, { { 4660577, --3761318, 2147484, 14144938, 1481764, -20578798, 3313031, 73286104, 106591424, 42097660, -72984920, --141153024, -127037080, -72848552, -26254598, 4194036, 29984240, 56193740, 80756656, 100364256, 110516488, -108207944, 95994128, 79020416, 60338920, 42405824, 28893856, 21281562, 17347910, 15633144, 17613660, -23518704, 29914984, 33616708, 35107064, 36514200, 38280508, 38737920, 35492536, 27007292, 13924821, --1247151, -16257525, -30282740, -43022152, -54204636, -64430416, -75067976, -86801824, -99237904, -111906984, --124563712, -136666928, -147541792, -156717984, -163421360, -166405824, -164998144, -159533872, -150274464, -136927312, --119659936, -99412920, -76727440, -51388208, -23609436, 5508833, 34976068, 64331632, 92863096, 119363048, -142796384, 162450688, 177512080, 187299232, 191844384, 191558768, 186469760, 176480736, 162277824, 145250432, -126342904, 105501576, 82560008, 58354648, 34439196, 11667279, -10382010, -32273458, -53592064, -73464344, --91631520, -108246600, -123020752, -135405824, -145302496, -152779504, -157352032, -158328064, -155697392, -150061328, --141810688, -130838664, -116973432, -100589208, -83070576, -66531192, -52418464, -40350144, -28921236, -17620104, --7400229, 453656, 5391795, 7756174, 8531953, 8819715, 9077950, 9011378, 8390755, 7570417, -7068980, 7218230, 8370355, 10827613, 14411226, 18627810, 23251880, 28213104, 33091112, 37315748, -40679244, 43155832, 44554380, 44824428, 44306344, 43304008, 41874320, 40254580, 38846904, 37594924, -36056788, 34188476, 32320702, 30408906, 28090696, 25396678, 22599582, 19570556, 16100222, 12525735, -9177808, 5531918, 844498, -4535486, -9188009, -11842299, -12232067, -11146514, -10013716, }, +-3761318, 2147484, 14144938, 1481764, -20578798, 3313031, 73286104, 106591424, 42097660, -72984920, +-141153024, -127037080, -72848552, -26254598, 4194036, 29984240, 56193740, 80756656, 100364256, 110516488, +108207944, 95994128, 79020416, 60338920, 42405824, 28893856, 21281562, 17347910, 15633144, 17613660, +23518704, 29914984, 33616708, 35107064, 36514200, 38280508, 38737920, 35492536, 27007292, 13924821, +-1247151, -16257525, -30282740, -43022152, -54204636, -64430416, -75067976, -86801824, -99237904, -111906984, +-124563712, -136666928, -147541792, -156717984, -163421360, -166405824, -164998144, -159533872, -150274464, -136927312, +-119659936, -99412920, -76727440, -51388208, -23609436, 5508833, 34976068, 64331632, 92863096, 119363048, +142796384, 162450688, 177512080, 187299232, 191844384, 191558768, 186469760, 176480736, 162277824, 145250432, +126342904, 105501576, 82560008, 58354648, 34439196, 11667279, -10382010, -32273458, -53592064, -73464344, +-91631520, -108246600, -123020752, -135405824, -145302496, -152779504, -157352032, -158328064, -155697392, -150061328, +-141810688, -130838664, -116973432, -100589208, -83070576, -66531192, -52418464, -40350144, -28921236, -17620104, +-7400229, 453656, 5391795, 7756174, 8531953, 8819715, 9077950, 9011378, 8390755, 7570417, +7068980, 7218230, 8370355, 10827613, 14411226, 18627810, 23251880, 28213104, 33091112, 37315748, +40679244, 43155832, 44554380, 44824428, 44306344, 43304008, 41874320, 40254580, 38846904, 37594924, +36056788, 34188476, 32320702, 30408906, 28090696, 25396678, 22599582, 19570556, 16100222, 12525735, +9177808, 5531918, 844498, -4535486, -9188009, -11842299, -12232067, -11146514, -10013716, }, { -4660577, -3761318, -2147484, -14144938, -1481764, 20578798, -3313031, -73286104, -106591424, -42097660, 72984920, -141153024, 127037080, 72848552, 26254598, -4194036, -29984240, -56193740, -80756656, -100364256, -110516488, --108207944, -95994128, -79020416, -60338920, -42405824, -28893856, -21281562, -17347910, -15633144, -17613660, --23518704, -29914984, -33616708, -35107064, -36514200, -38280508, -38737920, -35492536, -27007292, -13924821, -1247151, 16257525, 30282740, 43022152, 54204636, 64430416, 75067976, 86801824, 99237904, 111906984, -124563712, 136666928, 147541792, 156717984, 163421360, 166405824, 164998144, 159533872, 150274464, 136927312, -119659936, 99412920, 76727440, 51388208, 23609436, -5508833, -34976068, -64331632, -92863096, -119363048, --142796384, -162450688, -177512080, -187299232, -191844384, -191558768, -186469760, -176480736, -162277824, -145250432, --126342904, -105501576, -82560008, -58354648, -34439196, -11667279, 10382010, 32273458, 53592064, 73464344, -91631520, 108246600, 123020752, 135405824, 145302496, 152779504, 157352032, 158328064, 155697392, 150061328, -141810688, 130838664, 116973432, 100589208, 83070576, 66531192, 52418464, 40350144, 28921236, 17620104, -7400229, -453656, -5391795, -7756174, -8531953, -8819715, -9077950, -9011378, -8390755, -7570417, --7068980, -7218230, -8370355, -10827613, -14411226, -18627810, -23251880, -28213104, -33091112, -37315748, --40679244, -43155832, -44554380, -44824428, -44306344, -43304008, -41874320, -40254580, -38846904, -37594924, --36056788, -34188476, -32320702, -30408906, -28090696, -25396678, -22599582, -19570556, -16100222, -12525735, --9177808, -5531918, -844498, 4535486, 9188009, 11842299, 12232067, 11146514, 10013716, }, +3761318, -2147484, -14144938, -1481764, 20578798, -3313031, -73286104, -106591424, -42097660, 72984920, +141153024, 127037080, 72848552, 26254598, -4194036, -29984240, -56193740, -80756656, -100364256, -110516488, +-108207944, -95994128, -79020416, -60338920, -42405824, -28893856, -21281562, -17347910, -15633144, -17613660, +-23518704, -29914984, -33616708, -35107064, -36514200, -38280508, -38737920, -35492536, -27007292, -13924821, +1247151, 16257525, 30282740, 43022152, 54204636, 64430416, 75067976, 86801824, 99237904, 111906984, +124563712, 136666928, 147541792, 156717984, 163421360, 166405824, 164998144, 159533872, 150274464, 136927312, +119659936, 99412920, 76727440, 51388208, 23609436, -5508833, -34976068, -64331632, -92863096, -119363048, +-142796384, -162450688, -177512080, -187299232, -191844384, -191558768, -186469760, -176480736, -162277824, -145250432, +-126342904, -105501576, -82560008, -58354648, -34439196, -11667279, 10382010, 32273458, 53592064, 73464344, +91631520, 108246600, 123020752, 135405824, 145302496, 152779504, 157352032, 158328064, 155697392, 150061328, +141810688, 130838664, 116973432, 100589208, 83070576, 66531192, 52418464, 40350144, 28921236, 17620104, +7400229, -453656, -5391795, -7756174, -8531953, -8819715, -9077950, -9011378, -8390755, -7570417, +-7068980, -7218230, -8370355, -10827613, -14411226, -18627810, -23251880, -28213104, -33091112, -37315748, +-40679244, -43155832, -44554380, -44824428, -44306344, -43304008, -41874320, -40254580, -38846904, -37594924, +-36056788, -34188476, -32320702, -30408906, -28090696, -25396678, -22599582, -19570556, -16100222, -12525735, +-9177808, -5531918, -844498, 4535486, 9188009, 11842299, 12232067, 11146514, 10013716, }, }, { { 5583995, -6041409, -3080565, -20302848, -31235686, -32544040, -36608152, -42584600, -22413286, 45768784, 140109344, -209438704, 222517424, 189292096, 136838736, 81594176, 28635084, -17463338, -52446920, -77622408, -97324496, --112847584, -122775936, -126743408, -125114008, -117037320, -102680320, -86526952, -75130256, -71197136, -71656160, --71568648, -68443528, -62621160, -55089400, -46113992, -35584340, -23645406, -10550587, 3620121, 18485002, -32754494, 44788456, 53966800, 61098056, 67329520, 73078328, 78128136, 82242720, 85336168, 87326352, -88121992, 87625920, 85643256, 81945832, 76552960, 69851200, 62433792, 54886996, 47670380, 41052908, -35170952, 30184494, 26330298, 23782844, 22596360, 22888418, 24982752, 29239064, 35748624, 44303124, -54699092, 67002028, 81370304, 97648768, 115331144, 134012640, 153588560, 173799616, 193838848, 212766768, -230137776, 245835872, 259442864, 270214656, 277666400, 281800320, 282770976, 280663776, 275530208, 267223200, -255219840, 239074528, 219228016, 197076192, 174036912, 150685168, 126931312, 103010496, 80224080, 60595548, -45620604, 35276712, 28341416, 23708756, 21281562, 21625160, 25003152, 30849676, 37976636, 45104672, -51291036, 56076168, 59363964, 61216704, 61680024, 60641180, 57775364, 52764748, 45659260, 36971616, -27376658, 17395692, 7320772, -2738042, -12794171, -22834730, -32721746, -42367168, -51954608, -61787400, --71921912, -82127288, -92180736, -102044128, -111806048, -121666224, -131924752, -142794784, -154210256, -165864128, --177331152, -188156608, -198022144, -206856896, -214596432, -220965328, -225850848, -229634192, -232688448, -235026512, --237125152, -239875536, -241617136, -236108848, -217380640, -188170576, -160260800, -143712288, -138218496, }, +6041409, -3080565, -20302848, -31235686, -32544040, -36608152, -42584600, -22413286, 45768784, 140109344, +209438704, 222517424, 189292096, 136838736, 81594176, 28635084, -17463338, -52446920, -77622408, -97324496, +-112847584, -122775936, -126743408, -125114008, -117037320, -102680320, -86526952, -75130256, -71197136, -71656160, +-71568648, -68443528, -62621160, -55089400, -46113992, -35584340, -23645406, -10550587, 3620121, 18485002, +32754494, 44788456, 53966800, 61098056, 67329520, 73078328, 78128136, 82242720, 85336168, 87326352, +88121992, 87625920, 85643256, 81945832, 76552960, 69851200, 62433792, 54886996, 47670380, 41052908, +35170952, 30184494, 26330298, 23782844, 22596360, 22888418, 24982752, 29239064, 35748624, 44303124, +54699092, 67002028, 81370304, 97648768, 115331144, 134012640, 153588560, 173799616, 193838848, 212766768, +230137776, 245835872, 259442864, 270214656, 277666400, 281800320, 282770976, 280663776, 275530208, 267223200, +255219840, 239074528, 219228016, 197076192, 174036912, 150685168, 126931312, 103010496, 80224080, 60595548, +45620604, 35276712, 28341416, 23708756, 21281562, 21625160, 25003152, 30849676, 37976636, 45104672, +51291036, 56076168, 59363964, 61216704, 61680024, 60641180, 57775364, 52764748, 45659260, 36971616, +27376658, 17395692, 7320772, -2738042, -12794171, -22834730, -32721746, -42367168, -51954608, -61787400, +-71921912, -82127288, -92180736, -102044128, -111806048, -121666224, -131924752, -142794784, -154210256, -165864128, +-177331152, -188156608, -198022144, -206856896, -214596432, -220965328, -225850848, -229634192, -232688448, -235026512, +-237125152, -239875536, -241617136, -236108848, -217380640, -188170576, -160260800, -143712288, -138218496, }, { 5583995, -6041409, -3080565, -20302848, -31235686, -32544040, -36608152, -42584600, -22413286, 45768784, 140109344, -209438704, 222517424, 189292096, 136838736, 81594176, 28635084, -17463338, -52446920, -77622408, -97324496, --112847584, -122775936, -126743408, -125114008, -117037320, -102680320, -86526952, -75130256, -71197136, -71656160, --71568648, -68443528, -62621160, -55089400, -46113992, -35584340, -23645406, -10550587, 3620121, 18485002, -32754494, 44788456, 53966800, 61098056, 67329520, 73078328, 78128136, 82242720, 85336168, 87326352, -88121992, 87625920, 85643256, 81945832, 76552960, 69851200, 62433792, 54886996, 47670380, 41052908, -35170952, 30184494, 26330298, 23782844, 22596360, 22888418, 24982752, 29239064, 35748624, 44303124, -54699092, 67002028, 81370304, 97648768, 115331144, 134012640, 153588560, 173799616, 193838848, 212766768, -230137776, 245835872, 259442864, 270214656, 277666400, 281800320, 282770976, 280663776, 275530208, 267223200, -255219840, 239074528, 219228016, 197076192, 174036912, 150685168, 126931312, 103010496, 80224080, 60595548, -45620604, 35276712, 28341416, 23708756, 21281562, 21625160, 25003152, 30849676, 37976636, 45104672, -51291036, 56076168, 59363964, 61216704, 61680024, 60641180, 57775364, 52764748, 45659260, 36971616, -27376658, 17395692, 7320772, -2738042, -12794171, -22834730, -32721746, -42367168, -51954608, -61787400, --71921912, -82127288, -92180736, -102044128, -111806048, -121666224, -131924752, -142794784, -154210256, -165864128, --177331152, -188156608, -198022144, -206856896, -214596432, -220965328, -225850848, -229634192, -232688448, -235026512, --237125152, -239875536, -241617136, -236108848, -217380640, -188170576, -160260800, -143712288, -138218496, }, +6041409, -3080565, -20302848, -31235686, -32544040, -36608152, -42584600, -22413286, 45768784, 140109344, +209438704, 222517424, 189292096, 136838736, 81594176, 28635084, -17463338, -52446920, -77622408, -97324496, +-112847584, -122775936, -126743408, -125114008, -117037320, -102680320, -86526952, -75130256, -71197136, -71656160, +-71568648, -68443528, -62621160, -55089400, -46113992, -35584340, -23645406, -10550587, 3620121, 18485002, +32754494, 44788456, 53966800, 61098056, 67329520, 73078328, 78128136, 82242720, 85336168, 87326352, +88121992, 87625920, 85643256, 81945832, 76552960, 69851200, 62433792, 54886996, 47670380, 41052908, +35170952, 30184494, 26330298, 23782844, 22596360, 22888418, 24982752, 29239064, 35748624, 44303124, +54699092, 67002028, 81370304, 97648768, 115331144, 134012640, 153588560, 173799616, 193838848, 212766768, +230137776, 245835872, 259442864, 270214656, 277666400, 281800320, 282770976, 280663776, 275530208, 267223200, +255219840, 239074528, 219228016, 197076192, 174036912, 150685168, 126931312, 103010496, 80224080, 60595548, +45620604, 35276712, 28341416, 23708756, 21281562, 21625160, 25003152, 30849676, 37976636, 45104672, +51291036, 56076168, 59363964, 61216704, 61680024, 60641180, 57775364, 52764748, 45659260, 36971616, +27376658, 17395692, 7320772, -2738042, -12794171, -22834730, -32721746, -42367168, -51954608, -61787400, +-71921912, -82127288, -92180736, -102044128, -111806048, -121666224, -131924752, -142794784, -154210256, -165864128, +-177331152, -188156608, -198022144, -206856896, -214596432, -220965328, -225850848, -229634192, -232688448, -235026512, +-237125152, -239875536, -241617136, -236108848, -217380640, -188170576, -160260800, -143712288, -138218496, }, }, { { 19684372, --18938122, -61517892, -63736240, -8271570, 72348728, 113489680, 74640088, -16678969, -88281976, -95594696, --58876484, -25069188, -13101261, -11398306, -10298795, -11159399, -10371272, 700617, 18197240, 26725970, -21249350, 13889387, 15810311, 24522116, 32755032, 39345120, 46255724, 52015276, 53102440, 48347908, -39482560, 29595010, 21625698, 16104517, 10235444, 754304, -12858058, -28900298, -45485852, -60772176, --72917272, -81328424, -86918328, -90447720, -91846800, -91372744, -89939296, -88036632, -85586352, -82835960, --80242336, -77655160, -74635256, -71230424, -67602784, -63391568, -58213448, -52345452, -46373300, -40633612, --35352948, -30884036, -27565636, -25581362, -24846922, -24860344, -25043954, -25381646, -26145076, -26930518, --26805964, -25485800, -23373748, -20323248, -15362024, -7809325, 2206003, 14413910, 28803124, 45313516, -63640140, 83214456, 103157600, 122722784, 141861152, 160564128, 177722528, 191942096, 203639424, 214783792, -226025344, 235433472, 240735600, 241693920, 239550720, 234954576, 227198944, 215266448, 199234944, 180485808, -160333808, 138645296, 114415248, 87663504, 59999084, 33190434, 7822209, -16640314, -41058812, -65774740, --89928560, -111802296, -130274408, -145634288, -158692064, -169711344, -178538032, -185078736, -189296384, -191343472, --191866928, -191587216, -190608496, -188735888, -186197568, -183412288, -180362320, -176743808, -172246976, -166363408, --158708704, -149891680, -141210464, -133262632, -125681480, -118111600, -110336640, -101760120, -92072288, -82134272, --73056856, -64893736, -57217016, -50053548, -43236900, -35970352, -28012314, -20119774, -12702903, -5408975, -1946157, 9951976, 20522428, 34193844, 46772732, 52321292, 49926848, 44465260, 40865540, }, +-18938122, -61517892, -63736240, -8271570, 72348728, 113489680, 74640088, -16678969, -88281976, -95594696, +-58876484, -25069188, -13101261, -11398306, -10298795, -11159399, -10371272, 700617, 18197240, 26725970, +21249350, 13889387, 15810311, 24522116, 32755032, 39345120, 46255724, 52015276, 53102440, 48347908, +39482560, 29595010, 21625698, 16104517, 10235444, 754304, -12858058, -28900298, -45485852, -60772176, +-72917272, -81328424, -86918328, -90447720, -91846800, -91372744, -89939296, -88036632, -85586352, -82835960, +-80242336, -77655160, -74635256, -71230424, -67602784, -63391568, -58213448, -52345452, -46373300, -40633612, +-35352948, -30884036, -27565636, -25581362, -24846922, -24860344, -25043954, -25381646, -26145076, -26930518, +-26805964, -25485800, -23373748, -20323248, -15362024, -7809325, 2206003, 14413910, 28803124, 45313516, +63640140, 83214456, 103157600, 122722784, 141861152, 160564128, 177722528, 191942096, 203639424, 214783792, +226025344, 235433472, 240735600, 241693920, 239550720, 234954576, 227198944, 215266448, 199234944, 180485808, +160333808, 138645296, 114415248, 87663504, 59999084, 33190434, 7822209, -16640314, -41058812, -65774740, +-89928560, -111802296, -130274408, -145634288, -158692064, -169711344, -178538032, -185078736, -189296384, -191343472, +-191866928, -191587216, -190608496, -188735888, -186197568, -183412288, -180362320, -176743808, -172246976, -166363408, +-158708704, -149891680, -141210464, -133262632, -125681480, -118111600, -110336640, -101760120, -92072288, -82134272, +-73056856, -64893736, -57217016, -50053548, -43236900, -35970352, -28012314, -20119774, -12702903, -5408975, +1946157, 9951976, 20522428, 34193844, 46772732, 52321292, 49926848, 44465260, 40865540, }, { 19684372, --18938122, -61517892, -63736240, -8271570, 72348728, 113489680, 74640088, -16678969, -88281976, -95594696, --58876484, -25069188, -13101261, -11398306, -10298795, -11159399, -10371272, 700617, 18197240, 26725970, -21249350, 13889387, 15810311, 24522116, 32755032, 39345120, 46255724, 52015276, 53102440, 48347908, -39482560, 29595010, 21625698, 16104517, 10235444, 754304, -12858058, -28900298, -45485852, -60772176, --72917272, -81328424, -86918328, -90447720, -91846800, -91372744, -89939296, -88036632, -85586352, -82835960, --80242336, -77655160, -74635256, -71230424, -67602784, -63391568, -58213448, -52345452, -46373300, -40633612, --35352948, -30884036, -27565636, -25581362, -24846922, -24860344, -25043954, -25381646, -26145076, -26930518, --26805964, -25485800, -23373748, -20323248, -15362024, -7809325, 2206003, 14413910, 28803124, 45313516, -63640140, 83214456, 103157600, 122722784, 141861152, 160564128, 177722528, 191942096, 203639424, 214783792, -226025344, 235433472, 240735600, 241693920, 239550720, 234954576, 227198944, 215266448, 199234944, 180485808, -160333808, 138645296, 114415248, 87663504, 59999084, 33190434, 7822209, -16640314, -41058812, -65774740, --89928560, -111802296, -130274408, -145634288, -158692064, -169711344, -178538032, -185078736, -189296384, -191343472, --191866928, -191587216, -190608496, -188735888, -186197568, -183412288, -180362320, -176743808, -172246976, -166363408, --158708704, -149891680, -141210464, -133262632, -125681480, -118111600, -110336640, -101760120, -92072288, -82134272, --73056856, -64893736, -57217016, -50053548, -43236900, -35970352, -28012314, -20119774, -12702903, -5408975, -1946157, 9951976, 20522428, 34193844, 46772732, 52321292, 49926848, 44465260, 40865540, }, +-18938122, -61517892, -63736240, -8271570, 72348728, 113489680, 74640088, -16678969, -88281976, -95594696, +-58876484, -25069188, -13101261, -11398306, -10298795, -11159399, -10371272, 700617, 18197240, 26725970, +21249350, 13889387, 15810311, 24522116, 32755032, 39345120, 46255724, 52015276, 53102440, 48347908, +39482560, 29595010, 21625698, 16104517, 10235444, 754304, -12858058, -28900298, -45485852, -60772176, +-72917272, -81328424, -86918328, -90447720, -91846800, -91372744, -89939296, -88036632, -85586352, -82835960, +-80242336, -77655160, -74635256, -71230424, -67602784, -63391568, -58213448, -52345452, -46373300, -40633612, +-35352948, -30884036, -27565636, -25581362, -24846922, -24860344, -25043954, -25381646, -26145076, -26930518, +-26805964, -25485800, -23373748, -20323248, -15362024, -7809325, 2206003, 14413910, 28803124, 45313516, +63640140, 83214456, 103157600, 122722784, 141861152, 160564128, 177722528, 191942096, 203639424, 214783792, +226025344, 235433472, 240735600, 241693920, 239550720, 234954576, 227198944, 215266448, 199234944, 180485808, +160333808, 138645296, 114415248, 87663504, 59999084, 33190434, 7822209, -16640314, -41058812, -65774740, +-89928560, -111802296, -130274408, -145634288, -158692064, -169711344, -178538032, -185078736, -189296384, -191343472, +-191866928, -191587216, -190608496, -188735888, -186197568, -183412288, -180362320, -176743808, -172246976, -166363408, +-158708704, -149891680, -141210464, -133262632, -125681480, -118111600, -110336640, -101760120, -92072288, -82134272, +-73056856, -64893736, -57217016, -50053548, -43236900, -35970352, -28012314, -20119774, -12702903, -5408975, +1946157, 9951976, 20522428, 34193844, 46772732, 52321292, 49926848, 44465260, 40865540, }, }, { { -4806606, -34484292, 50781008, 2425046, -86674048, -166787536, -205533520, -182588720, -85410792, 64405720, 208520656, -300475360, 340926976, 350482208, 329967296, 269087744, 178262624, 86645600, 12090870, -50222128, -110979808, --171388528, -225137360, -266773296, -295754144, -315900736, -331757248, -344317312, -350935328, -349396672, -340069600, --323986560, -301317184, -272422272, -238630528, -201435040, -162035152, -121752656, -82081656, -44427140, -10092099, -20141250, 46730316, 70864816, 92928056, 112154480, 127839168, 140086256, 149456816, 156754496, 163096544, -169343584, 175382304, 180445536, 183991568, 185883504, 186037584, 184385632, 181076352, 176431888, 170794736, -164455376, 157568384, 150151520, 142288512, 134180680, 125905896, 117439976, 108993920, 100966088, 93464928, -86296632, 79501992, 73397232, 68001144, 62971200, 58250492, 54280872, 51367808, 49206368, 47202764, -44977972, 42429980, 39519604, 36159868, 32329292, 28316182, 24769076, 22302154, 21023328, 20614770, -20861194, 21843666, 23497766, 25089052, 25243670, 22639310, 16850768, 8513699, -1527398, -13176960, --26892938, -42536284, -58801324, -73973296, -87047176, -97999880, -107164264, -114483960, -119359288, -121201832, --120134528, -117048056, -112938848, -108273976, -102973448, -96818760, -89862528, -82618528, -75885632, -70222176, --65500936, -61007864, -55974160, -50059992, -43510704, -36910948, -30680026, -24768002, -18874234, -12800613, --6443525, 330712, 7516193, 14854681, 22147536, 29458644, 36832028, 44115756, 51270636, 58440008, -65514356, 72052368, 77784544, 82687784, 86508696, 88865024, 89862528, 89898496, 88920320, 86700896, -83516712, 79278656, 72248864, 60511796, 45328012, 31496606, 23372138, 21165598, 21604760, }, +34484292, 50781008, 2425046, -86674048, -166787536, -205533520, -182588720, -85410792, 64405720, 208520656, +300475360, 340926976, 350482208, 329967296, 269087744, 178262624, 86645600, 12090870, -50222128, -110979808, +-171388528, -225137360, -266773296, -295754144, -315900736, -331757248, -344317312, -350935328, -349396672, -340069600, +-323986560, -301317184, -272422272, -238630528, -201435040, -162035152, -121752656, -82081656, -44427140, -10092099, +20141250, 46730316, 70864816, 92928056, 112154480, 127839168, 140086256, 149456816, 156754496, 163096544, +169343584, 175382304, 180445536, 183991568, 185883504, 186037584, 184385632, 181076352, 176431888, 170794736, +164455376, 157568384, 150151520, 142288512, 134180680, 125905896, 117439976, 108993920, 100966088, 93464928, +86296632, 79501992, 73397232, 68001144, 62971200, 58250492, 54280872, 51367808, 49206368, 47202764, +44977972, 42429980, 39519604, 36159868, 32329292, 28316182, 24769076, 22302154, 21023328, 20614770, +20861194, 21843666, 23497766, 25089052, 25243670, 22639310, 16850768, 8513699, -1527398, -13176960, +-26892938, -42536284, -58801324, -73973296, -87047176, -97999880, -107164264, -114483960, -119359288, -121201832, +-120134528, -117048056, -112938848, -108273976, -102973448, -96818760, -89862528, -82618528, -75885632, -70222176, +-65500936, -61007864, -55974160, -50059992, -43510704, -36910948, -30680026, -24768002, -18874234, -12800613, +-6443525, 330712, 7516193, 14854681, 22147536, 29458644, 36832028, 44115756, 51270636, 58440008, +65514356, 72052368, 77784544, 82687784, 86508696, 88865024, 89862528, 89898496, 88920320, 86700896, +83516712, 79278656, 72248864, 60511796, 45328012, 31496606, 23372138, 21165598, 21604760, }, { -4806606, -34484292, 50781008, 2425046, -86674048, -166787536, -205533520, -182588720, -85410792, 64405720, 208520656, -300475360, 340926976, 350482208, 329967296, 269087744, 178262624, 86645600, 12090870, -50222128, -110979808, --171388528, -225137360, -266773296, -295754144, -315900736, -331757248, -344317312, -350935328, -349396672, -340069600, --323986560, -301317184, -272422272, -238630528, -201435040, -162035152, -121752656, -82081656, -44427140, -10092099, -20141250, 46730316, 70864816, 92928056, 112154480, 127839168, 140086256, 149456816, 156754496, 163096544, -169343584, 175382304, 180445536, 183991568, 185883504, 186037584, 184385632, 181076352, 176431888, 170794736, -164455376, 157568384, 150151520, 142288512, 134180680, 125905896, 117439976, 108993920, 100966088, 93464928, -86296632, 79501992, 73397232, 68001144, 62971200, 58250492, 54280872, 51367808, 49206368, 47202764, -44977972, 42429980, 39519604, 36159868, 32329292, 28316182, 24769076, 22302154, 21023328, 20614770, -20861194, 21843666, 23497766, 25089052, 25243670, 22639310, 16850768, 8513699, -1527398, -13176960, --26892938, -42536284, -58801324, -73973296, -87047176, -97999880, -107164264, -114483960, -119359288, -121201832, --120134528, -117048056, -112938848, -108273976, -102973448, -96818760, -89862528, -82618528, -75885632, -70222176, --65500936, -61007864, -55974160, -50059992, -43510704, -36910948, -30680026, -24768002, -18874234, -12800613, --6443525, 330712, 7516193, 14854681, 22147536, 29458644, 36832028, 44115756, 51270636, 58440008, -65514356, 72052368, 77784544, 82687784, 86508696, 88865024, 89862528, 89898496, 88920320, 86700896, -83516712, 79278656, 72248864, 60511796, 45328012, 31496606, 23372138, 21165598, 21604760, }, +34484292, 50781008, 2425046, -86674048, -166787536, -205533520, -182588720, -85410792, 64405720, 208520656, +300475360, 340926976, 350482208, 329967296, 269087744, 178262624, 86645600, 12090870, -50222128, -110979808, +-171388528, -225137360, -266773296, -295754144, -315900736, -331757248, -344317312, -350935328, -349396672, -340069600, +-323986560, -301317184, -272422272, -238630528, -201435040, -162035152, -121752656, -82081656, -44427140, -10092099, +20141250, 46730316, 70864816, 92928056, 112154480, 127839168, 140086256, 149456816, 156754496, 163096544, +169343584, 175382304, 180445536, 183991568, 185883504, 186037584, 184385632, 181076352, 176431888, 170794736, +164455376, 157568384, 150151520, 142288512, 134180680, 125905896, 117439976, 108993920, 100966088, 93464928, +86296632, 79501992, 73397232, 68001144, 62971200, 58250492, 54280872, 51367808, 49206368, 47202764, +44977972, 42429980, 39519604, 36159868, 32329292, 28316182, 24769076, 22302154, 21023328, 20614770, +20861194, 21843666, 23497766, 25089052, 25243670, 22639310, 16850768, 8513699, -1527398, -13176960, +-26892938, -42536284, -58801324, -73973296, -87047176, -97999880, -107164264, -114483960, -119359288, -121201832, +-120134528, -117048056, -112938848, -108273976, -102973448, -96818760, -89862528, -82618528, -75885632, -70222176, +-65500936, -61007864, -55974160, -50059992, -43510704, -36910948, -30680026, -24768002, -18874234, -12800613, +-6443525, 330712, 7516193, 14854681, 22147536, 29458644, 36832028, 44115756, 51270636, 58440008, +65514356, 72052368, 77784544, 82687784, 86508696, 88865024, 89862528, 89898496, 88920320, 86700896, +83516712, 79278656, 72248864, 60511796, 45328012, 31496606, 23372138, 21165598, 21604760, }, }, }; const Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160] ={ { { -150290032, --385906048, -472137696, -417386528, -289008352, -147089744, -13842143, 109755208, 218540288, 298677408, 338041312, -333410272, 289806688, 217443456, 128992904, 36413268, -51879448, -131597800, -200934144, -258412080, -302034976, --330471424, -344894464, -348707872, -344730720, -333252960, -313536384, -286524256, -255014224, -221617632, -187685232, --154078192, -121817624, -91618096, -63485524, -37163816, -12640626, 10021769, 31080530, 51114404, 70688720, -90066000, 109184512, 127841848, 145885008, 163238288, 179848000, 195678176, 210733104, 224985424, 238308400, -250543152, 261627936, 271590656, 280449024, 288210560, 294993376, 301048224, 306591936, 311677184, 316297504, -320528032, 324459552, 328051200, 331215520, 334007808, 336570816, 338930368, 341038656, 342981600, 344917536, -346840096, 348636992, 350341568, 352067584, 353748544, 355215264, 356490336, 357713856, 358777408, 359359904, -359345408, 358935264, 358274912, 357210816, 355541152, 353345344, 350922976, 348430304, 345668640, 342328768, -338414432, 334300384, 330307680, 326383680, 322335680, 318261376, 314553728, 311527936, 309160320, 307183584, -305368960, 303734720, 302471456, 301629632, 300942464, 300034592, 298743968, 297124224, 295237664, 293061728, -290523936, 287530880, 284020288, 280054432, 275793824, 271369984, 266854368, 262317280, 257796288, 253253824, -248666256, 244071712, 239462688, 234741440, 229865040, 224886640, 219827696, 214675888, 209514944, 204474272, -199580144, 194803072, 190161280, 185628480, 181089776, 176506512, 171938272, 167363072, 162715904, 158055328, -153382416, 148456624, 143113136, 137447536, 131385736, 124594856, 117059872, 108918760, 99643240, 88533232, -75301512, 57490284, 28663002, -14293114, -59893320, -85520312, -78491600, -48966924, -15633144, }, +-385906048, -472137696, -417386528, -289008352, -147089744, -13842143, 109755208, 218540288, 298677408, 338041312, +333410272, 289806688, 217443456, 128992904, 36413268, -51879448, -131597800, -200934144, -258412080, -302034976, +-330471424, -344894464, -348707872, -344730720, -333252960, -313536384, -286524256, -255014224, -221617632, -187685232, +-154078192, -121817624, -91618096, -63485524, -37163816, -12640626, 10021769, 31080530, 51114404, 70688720, +90066000, 109184512, 127841848, 145885008, 163238288, 179848000, 195678176, 210733104, 224985424, 238308400, +250543152, 261627936, 271590656, 280449024, 288210560, 294993376, 301048224, 306591936, 311677184, 316297504, +320528032, 324459552, 328051200, 331215520, 334007808, 336570816, 338930368, 341038656, 342981600, 344917536, +346840096, 348636992, 350341568, 352067584, 353748544, 355215264, 356490336, 357713856, 358777408, 359359904, +359345408, 358935264, 358274912, 357210816, 355541152, 353345344, 350922976, 348430304, 345668640, 342328768, +338414432, 334300384, 330307680, 326383680, 322335680, 318261376, 314553728, 311527936, 309160320, 307183584, +305368960, 303734720, 302471456, 301629632, 300942464, 300034592, 298743968, 297124224, 295237664, 293061728, +290523936, 287530880, 284020288, 280054432, 275793824, 271369984, 266854368, 262317280, 257796288, 253253824, +248666256, 244071712, 239462688, 234741440, 229865040, 224886640, 219827696, 214675888, 209514944, 204474272, +199580144, 194803072, 190161280, 185628480, 181089776, 176506512, 171938272, 167363072, 162715904, 158055328, +153382416, 148456624, 143113136, 137447536, 131385736, 124594856, 117059872, 108918760, 99643240, 88533232, +75301512, 57490284, 28663002, -14293114, -59893320, -85520312, -78491600, -48966924, -15633144, }, { -150290032, --385906048, -472137696, -417386528, -289008352, -147089744, -13842143, 109755208, 218540288, 298677408, 338041312, -333410272, 289806688, 217443456, 128992904, 36413268, -51879448, -131597800, -200934144, -258412080, -302034976, --330471424, -344894464, -348707872, -344730720, -333252960, -313536384, -286524256, -255014224, -221617632, -187685232, --154078192, -121817624, -91618096, -63485524, -37163816, -12640626, 10021769, 31080530, 51114404, 70688720, -90066000, 109184512, 127841848, 145885008, 163238288, 179848000, 195678176, 210733104, 224985424, 238308400, -250543152, 261627936, 271590656, 280449024, 288210560, 294993376, 301048224, 306591936, 311677184, 316297504, -320528032, 324459552, 328051200, 331215520, 334007808, 336570816, 338930368, 341038656, 342981600, 344917536, -346840096, 348636992, 350341568, 352067584, 353748544, 355215264, 356490336, 357713856, 358777408, 359359904, -359345408, 358935264, 358274912, 357210816, 355541152, 353345344, 350922976, 348430304, 345668640, 342328768, -338414432, 334300384, 330307680, 326383680, 322335680, 318261376, 314553728, 311527936, 309160320, 307183584, -305368960, 303734720, 302471456, 301629632, 300942464, 300034592, 298743968, 297124224, 295237664, 293061728, -290523936, 287530880, 284020288, 280054432, 275793824, 271369984, 266854368, 262317280, 257796288, 253253824, -248666256, 244071712, 239462688, 234741440, 229865040, 224886640, 219827696, 214675888, 209514944, 204474272, -199580144, 194803072, 190161280, 185628480, 181089776, 176506512, 171938272, 167363072, 162715904, 158055328, -153382416, 148456624, 143113136, 137447536, 131385736, 124594856, 117059872, 108918760, 99643240, 88533232, -75301512, 57490284, 28663002, -14293114, -59893320, -85520312, -78491600, -48966924, -15633144, }, +-385906048, -472137696, -417386528, -289008352, -147089744, -13842143, 109755208, 218540288, 298677408, 338041312, +333410272, 289806688, 217443456, 128992904, 36413268, -51879448, -131597800, -200934144, -258412080, -302034976, +-330471424, -344894464, -348707872, -344730720, -333252960, -313536384, -286524256, -255014224, -221617632, -187685232, +-154078192, -121817624, -91618096, -63485524, -37163816, -12640626, 10021769, 31080530, 51114404, 70688720, +90066000, 109184512, 127841848, 145885008, 163238288, 179848000, 195678176, 210733104, 224985424, 238308400, +250543152, 261627936, 271590656, 280449024, 288210560, 294993376, 301048224, 306591936, 311677184, 316297504, +320528032, 324459552, 328051200, 331215520, 334007808, 336570816, 338930368, 341038656, 342981600, 344917536, +346840096, 348636992, 350341568, 352067584, 353748544, 355215264, 356490336, 357713856, 358777408, 359359904, +359345408, 358935264, 358274912, 357210816, 355541152, 353345344, 350922976, 348430304, 345668640, 342328768, +338414432, 334300384, 330307680, 326383680, 322335680, 318261376, 314553728, 311527936, 309160320, 307183584, +305368960, 303734720, 302471456, 301629632, 300942464, 300034592, 298743968, 297124224, 295237664, 293061728, +290523936, 287530880, 284020288, 280054432, 275793824, 271369984, 266854368, 262317280, 257796288, 253253824, +248666256, 244071712, 239462688, 234741440, 229865040, 224886640, 219827696, 214675888, 209514944, 204474272, +199580144, 194803072, 190161280, 185628480, 181089776, 176506512, 171938272, 167363072, 162715904, 158055328, +153382416, 148456624, 143113136, 137447536, 131385736, 124594856, 117059872, 108918760, 99643240, 88533232, +75301512, 57490284, 28663002, -14293114, -59893320, -85520312, -78491600, -48966924, -15633144, }, }, { { 73902968, -124324808, -33054606, -330379616, -581539136, -632991744, -467241440, -182312768, 105196096, 331635360, 486648256, -577677952, 609132672, 585046464, 514585408, 409511712, 280498400, 138183056, -4979478, -136984224, -250866896, --346249536, -425859424, -490726848, -539250304, -570464512, -586600192, -591648384, -588483520, -578389312, -562420032, --541853056, -517614976, -490312384, -460739936, -429676032, -397331168, -363471264, -327923424, -290718816, -252093104, --212628800, -173132816, -134193568, -96038152, -58834608, -22848690, 11643656, 44357884, 75023952, 103676752, -130797864, 156929520, 182224192, 206464448, 229324944, 250495920, 269728768, 286901120, 301999008, 315101344, -326414304, 336174080, 344446720, 351235968, 356772736, 361376928, 365071680, 367741536, 369632416, 371208128, -372593792, 373728192, 374967296, 376884448, 379524256, 382521600, 385921056, 390188640, 395385024, 400983520, -406621728, 412490272, 418835008, 425467520, 431946464, 438020640, 443805408, 449606304, 455618720, 461792192, -467974272, 474057024, 479896576, 485230368, 489764256, 493161568, 494904256, 494442528, 491595520, 486565568, -479537408, 470545888, 459753152, 447557600, 434411232, 420759168, 407075936, 393776576, 381201984, 369796672, -360020256, 351915136, 345023840, 338894944, 333426368, 328718016, 324855744, 321818144, 319275520, 316555744, -313096672, 308839296, 304038048, 298951200, 293826752, 288817216, 283782976, 278508768, 273084768, 267690816, -262201312, 256463232, 250696704, 245142768, 239703728, 234326432, 229221872, 224347072, 219353648, 214260352, -209409184, 204729824, 199928576, 195166528, 190528512, 185382592, 179255824, 172332336, 164206800, 153830704, -140802992, 122852704, 91956320, 41217728, -19471772, -63043140, -69735776, -46819440, -15363098, }, +124324808, -33054606, -330379616, -581539136, -632991744, -467241440, -182312768, 105196096, 331635360, 486648256, +577677952, 609132672, 585046464, 514585408, 409511712, 280498400, 138183056, -4979478, -136984224, -250866896, +-346249536, -425859424, -490726848, -539250304, -570464512, -586600192, -591648384, -588483520, -578389312, -562420032, +-541853056, -517614976, -490312384, -460739936, -429676032, -397331168, -363471264, -327923424, -290718816, -252093104, +-212628800, -173132816, -134193568, -96038152, -58834608, -22848690, 11643656, 44357884, 75023952, 103676752, +130797864, 156929520, 182224192, 206464448, 229324944, 250495920, 269728768, 286901120, 301999008, 315101344, +326414304, 336174080, 344446720, 351235968, 356772736, 361376928, 365071680, 367741536, 369632416, 371208128, +372593792, 373728192, 374967296, 376884448, 379524256, 382521600, 385921056, 390188640, 395385024, 400983520, +406621728, 412490272, 418835008, 425467520, 431946464, 438020640, 443805408, 449606304, 455618720, 461792192, +467974272, 474057024, 479896576, 485230368, 489764256, 493161568, 494904256, 494442528, 491595520, 486565568, +479537408, 470545888, 459753152, 447557600, 434411232, 420759168, 407075936, 393776576, 381201984, 369796672, +360020256, 351915136, 345023840, 338894944, 333426368, 328718016, 324855744, 321818144, 319275520, 316555744, +313096672, 308839296, 304038048, 298951200, 293826752, 288817216, 283782976, 278508768, 273084768, 267690816, +262201312, 256463232, 250696704, 245142768, 239703728, 234326432, 229221872, 224347072, 219353648, 214260352, +209409184, 204729824, 199928576, 195166528, 190528512, 185382592, 179255824, 172332336, 164206800, 153830704, +140802992, 122852704, 91956320, 41217728, -19471772, -63043140, -69735776, -46819440, -15363098, }, { -73902968, --124324808, 33054606, 330379616, 581539136, 632991744, 467241440, 182312768, -105196096, -331635360, -486648256, --577677952, -609132672, -585046464, -514585408, -409511712, -280498400, -138183056, 4979478, 136984224, 250866896, -346249536, 425859424, 490726848, 539250304, 570464512, 586600192, 591648384, 588483520, 578389312, 562420032, -541853056, 517614976, 490312384, 460739936, 429676032, 397331168, 363471264, 327923424, 290718816, 252093104, -212628800, 173132816, 134193568, 96038152, 58834608, 22848690, -11643656, -44357884, -75023952, -103676752, --130797864, -156929520, -182224192, -206464448, -229324944, -250495920, -269728768, -286901120, -301999008, -315101344, --326414304, -336174080, -344446720, -351235968, -356772736, -361376928, -365071680, -367741536, -369632416, -371208128, --372593792, -373728192, -374967296, -376884448, -379524256, -382521600, -385921056, -390188640, -395385024, -400983520, --406621728, -412490272, -418835008, -425467520, -431946464, -438020640, -443805408, -449606304, -455618720, -461792192, --467974272, -474057024, -479896576, -485230368, -489764256, -493161568, -494904256, -494442528, -491595520, -486565568, --479537408, -470545888, -459753152, -447557600, -434411232, -420759168, -407075936, -393776576, -381201984, -369796672, --360020256, -351915136, -345023840, -338894944, -333426368, -328718016, -324855744, -321818144, -319275520, -316555744, --313096672, -308839296, -304038048, -298951200, -293826752, -288817216, -283782976, -278508768, -273084768, -267690816, --262201312, -256463232, -250696704, -245142768, -239703728, -234326432, -229221872, -224347072, -219353648, -214260352, --209409184, -204729824, -199928576, -195166528, -190528512, -185382592, -179255824, -172332336, -164206800, -153830704, --140802992, -122852704, -91956320, -41217728, 19471772, 63043140, 69735776, 46819440, 15363098, }, +-124324808, 33054606, 330379616, 581539136, 632991744, 467241440, 182312768, -105196096, -331635360, -486648256, +-577677952, -609132672, -585046464, -514585408, -409511712, -280498400, -138183056, 4979478, 136984224, 250866896, +346249536, 425859424, 490726848, 539250304, 570464512, 586600192, 591648384, 588483520, 578389312, 562420032, +541853056, 517614976, 490312384, 460739936, 429676032, 397331168, 363471264, 327923424, 290718816, 252093104, +212628800, 173132816, 134193568, 96038152, 58834608, 22848690, -11643656, -44357884, -75023952, -103676752, +-130797864, -156929520, -182224192, -206464448, -229324944, -250495920, -269728768, -286901120, -301999008, -315101344, +-326414304, -336174080, -344446720, -351235968, -356772736, -361376928, -365071680, -367741536, -369632416, -371208128, +-372593792, -373728192, -374967296, -376884448, -379524256, -382521600, -385921056, -390188640, -395385024, -400983520, +-406621728, -412490272, -418835008, -425467520, -431946464, -438020640, -443805408, -449606304, -455618720, -461792192, +-467974272, -474057024, -479896576, -485230368, -489764256, -493161568, -494904256, -494442528, -491595520, -486565568, +-479537408, -470545888, -459753152, -447557600, -434411232, -420759168, -407075936, -393776576, -381201984, -369796672, +-360020256, -351915136, -345023840, -338894944, -333426368, -328718016, -324855744, -321818144, -319275520, -316555744, +-313096672, -308839296, -304038048, -298951200, -293826752, -288817216, -283782976, -278508768, -273084768, -267690816, +-262201312, -256463232, -250696704, -245142768, -239703728, -234326432, -229221872, -224347072, -219353648, -214260352, +-209409184, -204729824, -199928576, -195166528, -190528512, -185382592, -179255824, -172332336, -164206800, -153830704, +-140802992, -122852704, -91956320, -41217728, 19471772, 63043140, 69735776, 46819440, 15363098, }, }, { { -20145544, --57005492, -71009768, -39251708, 22138946, 59661392, 41766408, -7079180, -41781980, -43087112, -19023484, -15620796, 45125612, 55299852, 46632072, 35795868, 33863668, 32031330, 16694001, -11273215, -40736692, --65121904, -83812528, -94664304, -94392640, -84812184, -72592464, -62712964, -54888608, -45877232, -33475512, --18580566, -4296041, 6704444, 13525926, 15933792, 13537737, 7094749, -673236, -6847789, -10250476, --10991895, -9116068, -4538707, 2414845, 11190000, 21441550, 33079302, 46294916, 61611844, 79440792, -99501504, 120996208, 143268304, 165959680, 188631744, 210636464, 231415520, 250689184, 268259360, 283752384, -296667360, 306613408, 313304448, 316301792, 315008992, 309058336, 298478752, 283370144, 263717968, 239709104, -211936240, 181145616, 148177440, 114230560, 80630496, 48161080, 17215840, -11276974, -35932232, -56266756, --73105712, -87041272, -97337384, -103227392, -105634184, -106459888, -106354128, -104283952, -99487552, -92931816, --86368568, -80558552, -75020728, -69201584, -63283660, -57914948, -53659172, -50824496, -49467824, -49336828, --49959596, -51011328, -52643952, -55371256, -59494960, -64534032, -69305200, -72741176, -74627208, -75445936, --75603776, -74997648, -73216304, -69868920, -64723548, -57778048, -49296024, -39690868, -29388850, -18817862, --8375186, 1684701, 11204496, 19908784, 27393838, 33374580, 37808596, 40778568, 42390792, 42771968, -42039140, 40359808, 38137700, 35981624, 34367256, 33437932, 33108830, 33072858, 32698660, 31355408, -28982976, 26014080, 22699440, 18895172, 14541149, 9851581, 4925254, -359167, -5902359, -11345156, --16794932, -23118736, -30707406, -37716256, -40249212, -35419520, -24593520, -12728672, -3635690, }, +-57005492, -71009768, -39251708, 22138946, 59661392, 41766408, -7079180, -41781980, -43087112, -19023484, +15620796, 45125612, 55299852, 46632072, 35795868, 33863668, 32031330, 16694001, -11273215, -40736692, +-65121904, -83812528, -94664304, -94392640, -84812184, -72592464, -62712964, -54888608, -45877232, -33475512, +-18580566, -4296041, 6704444, 13525926, 15933792, 13537737, 7094749, -673236, -6847789, -10250476, +-10991895, -9116068, -4538707, 2414845, 11190000, 21441550, 33079302, 46294916, 61611844, 79440792, +99501504, 120996208, 143268304, 165959680, 188631744, 210636464, 231415520, 250689184, 268259360, 283752384, +296667360, 306613408, 313304448, 316301792, 315008992, 309058336, 298478752, 283370144, 263717968, 239709104, +211936240, 181145616, 148177440, 114230560, 80630496, 48161080, 17215840, -11276974, -35932232, -56266756, +-73105712, -87041272, -97337384, -103227392, -105634184, -106459888, -106354128, -104283952, -99487552, -92931816, +-86368568, -80558552, -75020728, -69201584, -63283660, -57914948, -53659172, -50824496, -49467824, -49336828, +-49959596, -51011328, -52643952, -55371256, -59494960, -64534032, -69305200, -72741176, -74627208, -75445936, +-75603776, -74997648, -73216304, -69868920, -64723548, -57778048, -49296024, -39690868, -29388850, -18817862, +-8375186, 1684701, 11204496, 19908784, 27393838, 33374580, 37808596, 40778568, 42390792, 42771968, +42039140, 40359808, 38137700, 35981624, 34367256, 33437932, 33108830, 33072858, 32698660, 31355408, +28982976, 26014080, 22699440, 18895172, 14541149, 9851581, 4925254, -359167, -5902359, -11345156, +-16794932, -23118736, -30707406, -37716256, -40249212, -35419520, -24593520, -12728672, -3635690, }, { -20145544, --57005492, -71009768, -39251708, 22138946, 59661392, 41766408, -7079180, -41781980, -43087112, -19023484, -15620796, 45125612, 55299852, 46632072, 35795868, 33863668, 32031330, 16694001, -11273215, -40736692, --65121904, -83812528, -94664304, -94392640, -84812184, -72592464, -62712964, -54888608, -45877232, -33475512, --18580566, -4296041, 6704444, 13525926, 15933792, 13537737, 7094749, -673236, -6847789, -10250476, --10991895, -9116068, -4538707, 2414845, 11190000, 21441550, 33079302, 46294916, 61611844, 79440792, -99501504, 120996208, 143268304, 165959680, 188631744, 210636464, 231415520, 250689184, 268259360, 283752384, -296667360, 306613408, 313304448, 316301792, 315008992, 309058336, 298478752, 283370144, 263717968, 239709104, -211936240, 181145616, 148177440, 114230560, 80630496, 48161080, 17215840, -11276974, -35932232, -56266756, --73105712, -87041272, -97337384, -103227392, -105634184, -106459888, -106354128, -104283952, -99487552, -92931816, --86368568, -80558552, -75020728, -69201584, -63283660, -57914948, -53659172, -50824496, -49467824, -49336828, --49959596, -51011328, -52643952, -55371256, -59494960, -64534032, -69305200, -72741176, -74627208, -75445936, --75603776, -74997648, -73216304, -69868920, -64723548, -57778048, -49296024, -39690868, -29388850, -18817862, --8375186, 1684701, 11204496, 19908784, 27393838, 33374580, 37808596, 40778568, 42390792, 42771968, -42039140, 40359808, 38137700, 35981624, 34367256, 33437932, 33108830, 33072858, 32698660, 31355408, -28982976, 26014080, 22699440, 18895172, 14541149, 9851581, 4925254, -359167, -5902359, -11345156, --16794932, -23118736, -30707406, -37716256, -40249212, -35419520, -24593520, -12728672, -3635690, }, +-57005492, -71009768, -39251708, 22138946, 59661392, 41766408, -7079180, -41781980, -43087112, -19023484, +15620796, 45125612, 55299852, 46632072, 35795868, 33863668, 32031330, 16694001, -11273215, -40736692, +-65121904, -83812528, -94664304, -94392640, -84812184, -72592464, -62712964, -54888608, -45877232, -33475512, +-18580566, -4296041, 6704444, 13525926, 15933792, 13537737, 7094749, -673236, -6847789, -10250476, +-10991895, -9116068, -4538707, 2414845, 11190000, 21441550, 33079302, 46294916, 61611844, 79440792, +99501504, 120996208, 143268304, 165959680, 188631744, 210636464, 231415520, 250689184, 268259360, 283752384, +296667360, 306613408, 313304448, 316301792, 315008992, 309058336, 298478752, 283370144, 263717968, 239709104, +211936240, 181145616, 148177440, 114230560, 80630496, 48161080, 17215840, -11276974, -35932232, -56266756, +-73105712, -87041272, -97337384, -103227392, -105634184, -106459888, -106354128, -104283952, -99487552, -92931816, +-86368568, -80558552, -75020728, -69201584, -63283660, -57914948, -53659172, -50824496, -49467824, -49336828, +-49959596, -51011328, -52643952, -55371256, -59494960, -64534032, -69305200, -72741176, -74627208, -75445936, +-75603776, -74997648, -73216304, -69868920, -64723548, -57778048, -49296024, -39690868, -29388850, -18817862, +-8375186, 1684701, 11204496, 19908784, 27393838, 33374580, 37808596, 40778568, 42390792, 42771968, +42039140, 40359808, 38137700, 35981624, 34367256, 33437932, 33108830, 33072858, 32698660, 31355408, +28982976, 26014080, 22699440, 18895172, 14541149, 9851581, 4925254, -359167, -5902359, -11345156, +-16794932, -23118736, -30707406, -37716256, -40249212, -35419520, -24593520, -12728672, -3635690, }, }, { { -715649, --16108812, -47877076, -62373124, -37880536, 666257, 11227581, -14092861, -43357156, -43741556, -11979738, -31504658, 65659312, 83018496, 89054000, 92615600, 95732136, 91636352, 72837816, 39281772, -2659659, --46311020, -87099256, -121686088, -149177104, -172685600, -196140416, -219172720, -237489680, -248071408, -251337728, --248033824, -236885168, -216649424, -188575904, -155367760, -118897040, -80227304, -41051296, -3727495, 30040076, -59804736, 85767816, 108134392, 127120832, 143185616, 156986416, 168992464, 179110880, 186774704, 191456752, -193076496, 192072016, 189424704, 186549216, 184666416, 184082832, 184314224, 184824256, 185278448, 185259664, -184386160, 182738512, 180678000, 178298592, 175550352, 172689904, 169949712, 166921760, 162953200, 158009168, -152397248, 145799648, 137449152, 127236792, 115769768, 103261216, 89302568, 74002824, 58469536, 43653512, -29442000, 15545634, 2683818, -7992398, -16384226, -23488640, -30015916, -35794256, -40643276, -44896904, --48663592, -51298016, -52166672, -51388748, -49272940, -45472968, -39315056, -30745524, -20431160, -8977019, -3633542, 17806934, 33622076, 50297824, 66501128, 81408424, 95343976, 109124384, 122879552, 135763920, -146691392, 155191120, 161778000, 167630960, 173630496, 179508160, 184133296, 186687200, 187371168, 187117760, -186996976, 187755040, 189415040, 191305904, 192768864, 193786784, 194754752, 195953584, 197472400, 199272528, -201018960, 202128144, 202200080, 201163376, 199014288, 195749040, 191514208, 186435408, 180395600, 173246640, -165060432, 155962080, 146033712, 135544336, 124882616, 114247200, 103758896, 93658744, 83965000, 74382928, -64660196, 53660784, 38013144, 14970645, -11264625, -29461328, -31584652, -21020644, -6886980, }, +-16108812, -47877076, -62373124, -37880536, 666257, 11227581, -14092861, -43357156, -43741556, -11979738, +31504658, 65659312, 83018496, 89054000, 92615600, 95732136, 91636352, 72837816, 39281772, -2659659, +-46311020, -87099256, -121686088, -149177104, -172685600, -196140416, -219172720, -237489680, -248071408, -251337728, +-248033824, -236885168, -216649424, -188575904, -155367760, -118897040, -80227304, -41051296, -3727495, 30040076, +59804736, 85767816, 108134392, 127120832, 143185616, 156986416, 168992464, 179110880, 186774704, 191456752, +193076496, 192072016, 189424704, 186549216, 184666416, 184082832, 184314224, 184824256, 185278448, 185259664, +184386160, 182738512, 180678000, 178298592, 175550352, 172689904, 169949712, 166921760, 162953200, 158009168, +152397248, 145799648, 137449152, 127236792, 115769768, 103261216, 89302568, 74002824, 58469536, 43653512, +29442000, 15545634, 2683818, -7992398, -16384226, -23488640, -30015916, -35794256, -40643276, -44896904, +-48663592, -51298016, -52166672, -51388748, -49272940, -45472968, -39315056, -30745524, -20431160, -8977019, +3633542, 17806934, 33622076, 50297824, 66501128, 81408424, 95343976, 109124384, 122879552, 135763920, +146691392, 155191120, 161778000, 167630960, 173630496, 179508160, 184133296, 186687200, 187371168, 187117760, +186996976, 187755040, 189415040, 191305904, 192768864, 193786784, 194754752, 195953584, 197472400, 199272528, +201018960, 202128144, 202200080, 201163376, 199014288, 195749040, 191514208, 186435408, 180395600, 173246640, +165060432, 155962080, 146033712, 135544336, 124882616, 114247200, 103758896, 93658744, 83965000, 74382928, +64660196, 53660784, 38013144, 14970645, -11264625, -29461328, -31584652, -21020644, -6886980, }, { -715649, --16108812, -47877076, -62373124, -37880536, 666257, 11227581, -14092861, -43357156, -43741556, -11979738, -31504658, 65659312, 83018496, 89054000, 92615600, 95732136, 91636352, 72837816, 39281772, -2659659, --46311020, -87099256, -121686088, -149177104, -172685600, -196140416, -219172720, -237489680, -248071408, -251337728, --248033824, -236885168, -216649424, -188575904, -155367760, -118897040, -80227304, -41051296, -3727495, 30040076, -59804736, 85767816, 108134392, 127120832, 143185616, 156986416, 168992464, 179110880, 186774704, 191456752, -193076496, 192072016, 189424704, 186549216, 184666416, 184082832, 184314224, 184824256, 185278448, 185259664, -184386160, 182738512, 180678000, 178298592, 175550352, 172689904, 169949712, 166921760, 162953200, 158009168, -152397248, 145799648, 137449152, 127236792, 115769768, 103261216, 89302568, 74002824, 58469536, 43653512, -29442000, 15545634, 2683818, -7992398, -16384226, -23488640, -30015916, -35794256, -40643276, -44896904, --48663592, -51298016, -52166672, -51388748, -49272940, -45472968, -39315056, -30745524, -20431160, -8977019, -3633542, 17806934, 33622076, 50297824, 66501128, 81408424, 95343976, 109124384, 122879552, 135763920, -146691392, 155191120, 161778000, 167630960, 173630496, 179508160, 184133296, 186687200, 187371168, 187117760, -186996976, 187755040, 189415040, 191305904, 192768864, 193786784, 194754752, 195953584, 197472400, 199272528, -201018960, 202128144, 202200080, 201163376, 199014288, 195749040, 191514208, 186435408, 180395600, 173246640, -165060432, 155962080, 146033712, 135544336, 124882616, 114247200, 103758896, 93658744, 83965000, 74382928, -64660196, 53660784, 38013144, 14970645, -11264625, -29461328, -31584652, -21020644, -6886980, }, +-16108812, -47877076, -62373124, -37880536, 666257, 11227581, -14092861, -43357156, -43741556, -11979738, +31504658, 65659312, 83018496, 89054000, 92615600, 95732136, 91636352, 72837816, 39281772, -2659659, +-46311020, -87099256, -121686088, -149177104, -172685600, -196140416, -219172720, -237489680, -248071408, -251337728, +-248033824, -236885168, -216649424, -188575904, -155367760, -118897040, -80227304, -41051296, -3727495, 30040076, +59804736, 85767816, 108134392, 127120832, 143185616, 156986416, 168992464, 179110880, 186774704, 191456752, +193076496, 192072016, 189424704, 186549216, 184666416, 184082832, 184314224, 184824256, 185278448, 185259664, +184386160, 182738512, 180678000, 178298592, 175550352, 172689904, 169949712, 166921760, 162953200, 158009168, +152397248, 145799648, 137449152, 127236792, 115769768, 103261216, 89302568, 74002824, 58469536, 43653512, +29442000, 15545634, 2683818, -7992398, -16384226, -23488640, -30015916, -35794256, -40643276, -44896904, +-48663592, -51298016, -52166672, -51388748, -49272940, -45472968, -39315056, -30745524, -20431160, -8977019, +3633542, 17806934, 33622076, 50297824, 66501128, 81408424, 95343976, 109124384, 122879552, 135763920, +146691392, 155191120, 161778000, 167630960, 173630496, 179508160, 184133296, 186687200, 187371168, 187117760, +186996976, 187755040, 189415040, 191305904, 192768864, 193786784, 194754752, 195953584, 197472400, 199272528, +201018960, 202128144, 202200080, 201163376, 199014288, 195749040, 191514208, 186435408, 180395600, 173246640, +165060432, 155962080, 146033712, 135544336, 124882616, 114247200, 103758896, 93658744, 83965000, 74382928, +64660196, 53660784, 38013144, 14970645, -11264625, -29461328, -31584652, -21020644, -6886980, }, }, { { -2120103, --2182380, 2431488, 1641751, -9615358, -22197464, -26419418, -28747290, -43403864, -67200672, -74491912, --44185012, 14663555, 71995464, 107700600, 125167160, 136182672, 143301584, 141180944, 127339336, 104186776, -73414416, 34889092, -9259413, -54247584, -97008816, -137676256, -176203712, -210369104, -237915424, -258347648, --271745280, -277629920, -275695040, -266039936, -248164288, -221443152, -187384048, -150119312, -113909512, -80955304, --51719996, -26036092, -3349001, 17149804, 35995048, 53375168, 69480224, 84347792, 97516696, 108393704, -116807544, 122870424, 126759520, 129085240, 130963752, 133236864, 135994768, 139109152, 142654112, 146571120, -150532704, 154372400, 158137472, 161650224, 164578848, 166909952, 168740672, 169717248, 169319952, 167556880, -164671728, 160303744, 153696480, 144681344, 133714144, 120915680, 105893496, 88800600, 70846024, 53191024, -35800164, 18094160, 470836, -15789374, -30247308, -43886512, -57436596, -70047160, -80413600, -88464512, --94938640, -99840808, -102404368, -102376984, -100438880, -97423280, -93743568, -89524296, -84849224, -79921288, --75102336, -70636104, -66406100, -62290448, -58539332, -55291260, -51955144, -47705812, -42448772, -36826660, --31488552, -26699128, -22258132, -17449378, -11537356, -4669703, 2124398, 7988103, 12854300, 17106318, -21282100, 26047366, 31759136, 38082400, 44502304, 50960324, 57600880, 64343440, 71117144, 77954728, -84510464, 90070832, 94272920, 97199944, 98811088, 99022616, 98195840, 96741992, 94531696, 91417840, -87833688, 84206592, 80507016, 76945952, 74163344, 72266584, 70794480, 69801272, 69661688, 70023000, -70470216, 71217000, 70736504, 64242512, 48515412, 27780922, 10836202, 2334852, 127238, }, +-2182380, 2431488, 1641751, -9615358, -22197464, -26419418, -28747290, -43403864, -67200672, -74491912, +-44185012, 14663555, 71995464, 107700600, 125167160, 136182672, 143301584, 141180944, 127339336, 104186776, +73414416, 34889092, -9259413, -54247584, -97008816, -137676256, -176203712, -210369104, -237915424, -258347648, +-271745280, -277629920, -275695040, -266039936, -248164288, -221443152, -187384048, -150119312, -113909512, -80955304, +-51719996, -26036092, -3349001, 17149804, 35995048, 53375168, 69480224, 84347792, 97516696, 108393704, +116807544, 122870424, 126759520, 129085240, 130963752, 133236864, 135994768, 139109152, 142654112, 146571120, +150532704, 154372400, 158137472, 161650224, 164578848, 166909952, 168740672, 169717248, 169319952, 167556880, +164671728, 160303744, 153696480, 144681344, 133714144, 120915680, 105893496, 88800600, 70846024, 53191024, +35800164, 18094160, 470836, -15789374, -30247308, -43886512, -57436596, -70047160, -80413600, -88464512, +-94938640, -99840808, -102404368, -102376984, -100438880, -97423280, -93743568, -89524296, -84849224, -79921288, +-75102336, -70636104, -66406100, -62290448, -58539332, -55291260, -51955144, -47705812, -42448772, -36826660, +-31488552, -26699128, -22258132, -17449378, -11537356, -4669703, 2124398, 7988103, 12854300, 17106318, +21282100, 26047366, 31759136, 38082400, 44502304, 50960324, 57600880, 64343440, 71117144, 77954728, +84510464, 90070832, 94272920, 97199944, 98811088, 99022616, 98195840, 96741992, 94531696, 91417840, +87833688, 84206592, 80507016, 76945952, 74163344, 72266584, 70794480, 69801272, 69661688, 70023000, +70470216, 71217000, 70736504, 64242512, 48515412, 27780922, 10836202, 2334852, 127238, }, { 2120103, -2182380, -2431488, -1641751, 9615358, 22197464, 26419418, 28747290, 43403864, 67200672, 74491912, -44185012, -14663555, -71995464, -107700600, -125167160, -136182672, -143301584, -141180944, -127339336, -104186776, --73414416, -34889092, 9259413, 54247584, 97008816, 137676256, 176203712, 210369104, 237915424, 258347648, -271745280, 277629920, 275695040, 266039936, 248164288, 221443152, 187384048, 150119312, 113909512, 80955304, -51719996, 26036092, 3349001, -17149804, -35995048, -53375168, -69480224, -84347792, -97516696, -108393704, --116807544, -122870424, -126759520, -129085240, -130963752, -133236864, -135994768, -139109152, -142654112, -146571120, --150532704, -154372400, -158137472, -161650224, -164578848, -166909952, -168740672, -169717248, -169319952, -167556880, --164671728, -160303744, -153696480, -144681344, -133714144, -120915680, -105893496, -88800600, -70846024, -53191024, --35800164, -18094160, -470836, 15789374, 30247308, 43886512, 57436596, 70047160, 80413600, 88464512, -94938640, 99840808, 102404368, 102376984, 100438880, 97423280, 93743568, 89524296, 84849224, 79921288, -75102336, 70636104, 66406100, 62290448, 58539332, 55291260, 51955144, 47705812, 42448772, 36826660, -31488552, 26699128, 22258132, 17449378, 11537356, 4669703, -2124398, -7988103, -12854300, -17106318, --21282100, -26047366, -31759136, -38082400, -44502304, -50960324, -57600880, -64343440, -71117144, -77954728, --84510464, -90070832, -94272920, -97199944, -98811088, -99022616, -98195840, -96741992, -94531696, -91417840, --87833688, -84206592, -80507016, -76945952, -74163344, -72266584, -70794480, -69801272, -69661688, -70023000, --70470216, -71217000, -70736504, -64242512, -48515412, -27780922, -10836202, -2334852, -127238, }, +2182380, -2431488, -1641751, 9615358, 22197464, 26419418, 28747290, 43403864, 67200672, 74491912, +44185012, -14663555, -71995464, -107700600, -125167160, -136182672, -143301584, -141180944, -127339336, -104186776, +-73414416, -34889092, 9259413, 54247584, 97008816, 137676256, 176203712, 210369104, 237915424, 258347648, +271745280, 277629920, 275695040, 266039936, 248164288, 221443152, 187384048, 150119312, 113909512, 80955304, +51719996, 26036092, 3349001, -17149804, -35995048, -53375168, -69480224, -84347792, -97516696, -108393704, +-116807544, -122870424, -126759520, -129085240, -130963752, -133236864, -135994768, -139109152, -142654112, -146571120, +-150532704, -154372400, -158137472, -161650224, -164578848, -166909952, -168740672, -169717248, -169319952, -167556880, +-164671728, -160303744, -153696480, -144681344, -133714144, -120915680, -105893496, -88800600, -70846024, -53191024, +-35800164, -18094160, -470836, 15789374, 30247308, 43886512, 57436596, 70047160, 80413600, 88464512, +94938640, 99840808, 102404368, 102376984, 100438880, 97423280, 93743568, 89524296, 84849224, 79921288, +75102336, 70636104, 66406100, 62290448, 58539332, 55291260, 51955144, 47705812, 42448772, 36826660, +31488552, 26699128, 22258132, 17449378, 11537356, 4669703, -2124398, -7988103, -12854300, -17106318, +-21282100, -26047366, -31759136, -38082400, -44502304, -50960324, -57600880, -64343440, -71117144, -77954728, +-84510464, -90070832, -94272920, -97199944, -98811088, -99022616, -98195840, -96741992, -94531696, -91417840, +-87833688, -84206592, -80507016, -76945952, -74163344, -72266584, -70794480, -69801272, -69661688, -70023000, +-70470216, -71217000, -70736504, -64242512, -48515412, -27780922, -10836202, -2334852, -127238, }, }, { { -3671123, --39192, 10506027, 2583423, -11370389, 9127342, 51194400, 42549168, -43339980, -130446208, -128813048, --42433204, 50480360, 96136400, 103191960, 100044280, 96409128, 88321704, 72801840, 49335216, 19551764, --10698764, -34936336, -51146620, -59889024, -61062088, -56099788, -49212808, -43119860, -37066640, -31124554, --28390808, -30828738, -36359584, -42034844, -47656420, -55036784, -65441880, -78317656, -91272352, -101293584, --106852880, -108556912, -107599128, -104722040, -100854424, -97124240, -93621160, -89277872, -83206400, -75163000, --64862060, -51931524, -36353676, -18156974, 2804077, 26050588, 50218904, 74196632, 97649304, 120020176, -140148000, 157368672, 171831984, 183300608, 190740032, 193442112, 191497024, 184927328, 173375488, 156838784, -135890080, 111140872, 83263848, 53436908, 22994718, -7286412, -36909876, -64856152, -89820112, -111269720, --129658624, -145347600, -157740720, -165909760, -169906224, -170894064, -169792400, -166344624, -159930624, -150722752, --139369536, -126035816, -110575544, -93295280, -74738336, -54994908, -34042448, -12556337, 8343511, 27995134, -46311020, 63115620, 77687904, 88826368, 95461016, 97690640, 97167728, 95783680, 93926640, 90569584, -84949088, 77551000, 69654704, 62543852, 56989920, 52911848, 49627272, 46758772, 44623100, 43604120, -43661028, 44587668, 46148888, 47797616, 48853644, 49056044, 48447768, 46837156, 43954696, 39967892, -35283692, 30098594, 24612310, 19294604, 14492830, 10176925, 6356015, 3180423, 441845, -2350421, --5238250, -7852811, -10191957, -12593381, -14998026, -17055852, -18798534, -20420422, -21658446, -22225918, --22512072, -22933514, -22862648, -21058224, -17082696, -11787538, -6634114, -2837363, -695785, }, +-39192, 10506027, 2583423, -11370389, 9127342, 51194400, 42549168, -43339980, -130446208, -128813048, +-42433204, 50480360, 96136400, 103191960, 100044280, 96409128, 88321704, 72801840, 49335216, 19551764, +-10698764, -34936336, -51146620, -59889024, -61062088, -56099788, -49212808, -43119860, -37066640, -31124554, +-28390808, -30828738, -36359584, -42034844, -47656420, -55036784, -65441880, -78317656, -91272352, -101293584, +-106852880, -108556912, -107599128, -104722040, -100854424, -97124240, -93621160, -89277872, -83206400, -75163000, +-64862060, -51931524, -36353676, -18156974, 2804077, 26050588, 50218904, 74196632, 97649304, 120020176, +140148000, 157368672, 171831984, 183300608, 190740032, 193442112, 191497024, 184927328, 173375488, 156838784, +135890080, 111140872, 83263848, 53436908, 22994718, -7286412, -36909876, -64856152, -89820112, -111269720, +-129658624, -145347600, -157740720, -165909760, -169906224, -170894064, -169792400, -166344624, -159930624, -150722752, +-139369536, -126035816, -110575544, -93295280, -74738336, -54994908, -34042448, -12556337, 8343511, 27995134, +46311020, 63115620, 77687904, 88826368, 95461016, 97690640, 97167728, 95783680, 93926640, 90569584, +84949088, 77551000, 69654704, 62543852, 56989920, 52911848, 49627272, 46758772, 44623100, 43604120, +43661028, 44587668, 46148888, 47797616, 48853644, 49056044, 48447768, 46837156, 43954696, 39967892, +35283692, 30098594, 24612310, 19294604, 14492830, 10176925, 6356015, 3180423, 441845, -2350421, +-5238250, -7852811, -10191957, -12593381, -14998026, -17055852, -18798534, -20420422, -21658446, -22225918, +-22512072, -22933514, -22862648, -21058224, -17082696, -11787538, -6634114, -2837363, -695785, }, { 3671123, -39192, -10506027, -2583423, 11370389, -9127342, -51194400, -42549168, 43339980, 130446208, 128813048, -42433204, -50480360, -96136400, -103191960, -100044280, -96409128, -88321704, -72801840, -49335216, -19551764, -10698764, 34936336, 51146620, 59889024, 61062088, 56099788, 49212808, 43119860, 37066640, 31124554, -28390808, 30828738, 36359584, 42034844, 47656420, 55036784, 65441880, 78317656, 91272352, 101293584, -106852880, 108556912, 107599128, 104722040, 100854424, 97124240, 93621160, 89277872, 83206400, 75163000, -64862060, 51931524, 36353676, 18156974, -2804077, -26050588, -50218904, -74196632, -97649304, -120020176, --140148000, -157368672, -171831984, -183300608, -190740032, -193442112, -191497024, -184927328, -173375488, -156838784, --135890080, -111140872, -83263848, -53436908, -22994718, 7286412, 36909876, 64856152, 89820112, 111269720, -129658624, 145347600, 157740720, 165909760, 169906224, 170894064, 169792400, 166344624, 159930624, 150722752, -139369536, 126035816, 110575544, 93295280, 74738336, 54994908, 34042448, 12556337, -8343511, -27995134, --46311020, -63115620, -77687904, -88826368, -95461016, -97690640, -97167728, -95783680, -93926640, -90569584, --84949088, -77551000, -69654704, -62543852, -56989920, -52911848, -49627272, -46758772, -44623100, -43604120, --43661028, -44587668, -46148888, -47797616, -48853644, -49056044, -48447768, -46837156, -43954696, -39967892, --35283692, -30098594, -24612310, -19294604, -14492830, -10176925, -6356015, -3180423, -441845, 2350421, -5238250, 7852811, 10191957, 12593381, 14998026, 17055852, 18798534, 20420422, 21658446, 22225918, -22512072, 22933514, 22862648, 21058224, 17082696, 11787538, 6634114, 2837363, 695785, }, +39192, -10506027, -2583423, 11370389, -9127342, -51194400, -42549168, 43339980, 130446208, 128813048, +42433204, -50480360, -96136400, -103191960, -100044280, -96409128, -88321704, -72801840, -49335216, -19551764, +10698764, 34936336, 51146620, 59889024, 61062088, 56099788, 49212808, 43119860, 37066640, 31124554, +28390808, 30828738, 36359584, 42034844, 47656420, 55036784, 65441880, 78317656, 91272352, 101293584, +106852880, 108556912, 107599128, 104722040, 100854424, 97124240, 93621160, 89277872, 83206400, 75163000, +64862060, 51931524, 36353676, 18156974, -2804077, -26050588, -50218904, -74196632, -97649304, -120020176, +-140148000, -157368672, -171831984, -183300608, -190740032, -193442112, -191497024, -184927328, -173375488, -156838784, +-135890080, -111140872, -83263848, -53436908, -22994718, 7286412, 36909876, 64856152, 89820112, 111269720, +129658624, 145347600, 157740720, 165909760, 169906224, 170894064, 169792400, 166344624, 159930624, 150722752, +139369536, 126035816, 110575544, 93295280, 74738336, 54994908, 34042448, 12556337, -8343511, -27995134, +-46311020, -63115620, -77687904, -88826368, -95461016, -97690640, -97167728, -95783680, -93926640, -90569584, +-84949088, -77551000, -69654704, -62543852, -56989920, -52911848, -49627272, -46758772, -44623100, -43604120, +-43661028, -44587668, -46148888, -47797616, -48853644, -49056044, -48447768, -46837156, -43954696, -39967892, +-35283692, -30098594, -24612310, -19294604, -14492830, -10176925, -6356015, -3180423, -441845, 2350421, +5238250, 7852811, 10191957, 12593381, 14998026, 17055852, 18798534, 20420422, 21658446, 22225918, +22512072, 22933514, 22862648, 21058224, 17082696, 11787538, 6634114, 2837363, 695785, }, }, { { -680752, --6240051, -13836774, -10302016, 5936182, 22024056, 36585604, 67482528, 119403848, 159337376, 144570752, -70390752, -25560424, -103386304, -150596592, -173636400, -178448368, -167961136, -148191936, -126090576, -103611792, --79183088, -52856552, -26375932, -621697, 23176718, 41265508, 50151260, 51460688, 51485384, 55557012, -64254320, 74965968, 85429584, 95057824, 103935528, 111814640, 118245280, 122967600, 125632624, 125466736, -121898152, 115582400, 108234784, 101213592, 94630480, 87911536, 80723376, 73117520, 65205656, 57070988, -48827872, 40585832, 32500018, 24959666, 18582712, 13938243, 11319386, 10739029, 12014097, 14893873, -19206020, 24874304, 31775242, 39685496, 48436492, 57997092, 68278704, 78905528, 89304184, 99037112, -107957760, 115961968, 122647088, 127384432, 129767608, 129741832, 127162168, 121512680, 112373528, 99948720, -84770840, 67046588, 46717968, 24082418, -91805, -25057912, -50365472, -75708464, -100862472, -125715840, --149895968, -172297440, -191387504, -206211584, -216911424, -224116768, -227924256, -227615552, -222445488, -212763552, --200331232, -187362576, -175147152, -163655968, -152441280, -141703856, -132459472, -125884416, -122654064, -122724936, --125530616, -130339912, -136546144, -143768656, -151833536, -160675264, -170103792, -179589232, -188355792, -195788768, --201700784, -206235200, -209647552, -212184800, -213994592, -215094640, -215534336, -215547760, -215372752, -214942720, --213959168, -212257280, -209942304, -207209616, -204216032, -201055472, -197645808, -193645584, -188603824, -182181776, --174221584, -164782864, -154138320, -142549424, -130080600, -116882704, -103449120, -90151360, -76836432, -63378684, --49806052, -34693136, -14782204, 10616085, 34621732, 46091440, 40392020, 24304146, 7576859, }, +-6240051, -13836774, -10302016, 5936182, 22024056, 36585604, 67482528, 119403848, 159337376, 144570752, +70390752, -25560424, -103386304, -150596592, -173636400, -178448368, -167961136, -148191936, -126090576, -103611792, +-79183088, -52856552, -26375932, -621697, 23176718, 41265508, 50151260, 51460688, 51485384, 55557012, +64254320, 74965968, 85429584, 95057824, 103935528, 111814640, 118245280, 122967600, 125632624, 125466736, +121898152, 115582400, 108234784, 101213592, 94630480, 87911536, 80723376, 73117520, 65205656, 57070988, +48827872, 40585832, 32500018, 24959666, 18582712, 13938243, 11319386, 10739029, 12014097, 14893873, +19206020, 24874304, 31775242, 39685496, 48436492, 57997092, 68278704, 78905528, 89304184, 99037112, +107957760, 115961968, 122647088, 127384432, 129767608, 129741832, 127162168, 121512680, 112373528, 99948720, +84770840, 67046588, 46717968, 24082418, -91805, -25057912, -50365472, -75708464, -100862472, -125715840, +-149895968, -172297440, -191387504, -206211584, -216911424, -224116768, -227924256, -227615552, -222445488, -212763552, +-200331232, -187362576, -175147152, -163655968, -152441280, -141703856, -132459472, -125884416, -122654064, -122724936, +-125530616, -130339912, -136546144, -143768656, -151833536, -160675264, -170103792, -179589232, -188355792, -195788768, +-201700784, -206235200, -209647552, -212184800, -213994592, -215094640, -215534336, -215547760, -215372752, -214942720, +-213959168, -212257280, -209942304, -207209616, -204216032, -201055472, -197645808, -193645584, -188603824, -182181776, +-174221584, -164782864, -154138320, -142549424, -130080600, -116882704, -103449120, -90151360, -76836432, -63378684, +-49806052, -34693136, -14782204, 10616085, 34621732, 46091440, 40392020, 24304146, 7576859, }, { -680752, --6240051, -13836774, -10302016, 5936182, 22024056, 36585604, 67482528, 119403848, 159337376, 144570752, -70390752, -25560424, -103386304, -150596592, -173636400, -178448368, -167961136, -148191936, -126090576, -103611792, --79183088, -52856552, -26375932, -621697, 23176718, 41265508, 50151260, 51460688, 51485384, 55557012, -64254320, 74965968, 85429584, 95057824, 103935528, 111814640, 118245280, 122967600, 125632624, 125466736, -121898152, 115582400, 108234784, 101213592, 94630480, 87911536, 80723376, 73117520, 65205656, 57070988, -48827872, 40585832, 32500018, 24959666, 18582712, 13938243, 11319386, 10739029, 12014097, 14893873, -19206020, 24874304, 31775242, 39685496, 48436492, 57997092, 68278704, 78905528, 89304184, 99037112, -107957760, 115961968, 122647088, 127384432, 129767608, 129741832, 127162168, 121512680, 112373528, 99948720, -84770840, 67046588, 46717968, 24082418, -91805, -25057912, -50365472, -75708464, -100862472, -125715840, --149895968, -172297440, -191387504, -206211584, -216911424, -224116768, -227924256, -227615552, -222445488, -212763552, --200331232, -187362576, -175147152, -163655968, -152441280, -141703856, -132459472, -125884416, -122654064, -122724936, --125530616, -130339912, -136546144, -143768656, -151833536, -160675264, -170103792, -179589232, -188355792, -195788768, --201700784, -206235200, -209647552, -212184800, -213994592, -215094640, -215534336, -215547760, -215372752, -214942720, --213959168, -212257280, -209942304, -207209616, -204216032, -201055472, -197645808, -193645584, -188603824, -182181776, --174221584, -164782864, -154138320, -142549424, -130080600, -116882704, -103449120, -90151360, -76836432, -63378684, --49806052, -34693136, -14782204, 10616085, 34621732, 46091440, 40392020, 24304146, 7576859, }, +-6240051, -13836774, -10302016, 5936182, 22024056, 36585604, 67482528, 119403848, 159337376, 144570752, +70390752, -25560424, -103386304, -150596592, -173636400, -178448368, -167961136, -148191936, -126090576, -103611792, +-79183088, -52856552, -26375932, -621697, 23176718, 41265508, 50151260, 51460688, 51485384, 55557012, +64254320, 74965968, 85429584, 95057824, 103935528, 111814640, 118245280, 122967600, 125632624, 125466736, +121898152, 115582400, 108234784, 101213592, 94630480, 87911536, 80723376, 73117520, 65205656, 57070988, +48827872, 40585832, 32500018, 24959666, 18582712, 13938243, 11319386, 10739029, 12014097, 14893873, +19206020, 24874304, 31775242, 39685496, 48436492, 57997092, 68278704, 78905528, 89304184, 99037112, +107957760, 115961968, 122647088, 127384432, 129767608, 129741832, 127162168, 121512680, 112373528, 99948720, +84770840, 67046588, 46717968, 24082418, -91805, -25057912, -50365472, -75708464, -100862472, -125715840, +-149895968, -172297440, -191387504, -206211584, -216911424, -224116768, -227924256, -227615552, -222445488, -212763552, +-200331232, -187362576, -175147152, -163655968, -152441280, -141703856, -132459472, -125884416, -122654064, -122724936, +-125530616, -130339912, -136546144, -143768656, -151833536, -160675264, -170103792, -179589232, -188355792, -195788768, +-201700784, -206235200, -209647552, -212184800, -213994592, -215094640, -215534336, -215547760, -215372752, -214942720, +-213959168, -212257280, -209942304, -207209616, -204216032, -201055472, -197645808, -193645584, -188603824, -182181776, +-174221584, -164782864, -154138320, -142549424, -130080600, -116882704, -103449120, -90151360, -76836432, -63378684, +-49806052, -34693136, -14782204, 10616085, 34621732, 46091440, 40392020, 24304146, 7576859, }, }, { { -20460150, --40343700, -13508209, 46633144, 91716344, 73947528, -7758322, -95739656, -121552408, -72519448, -544387, -38518876, 38133404, 26581552, 21526376, 20213726, 21106006, 28424094, 36867464, 33590940, 18548354, -6920266, 7955890, 14348412, 15824807, 11763915, 6027987, -1577327, -13320304, -28249074, -42741904, --53768160, -60312080, -63879584, -67890552, -74558488, -82486456, -88451096, -90421944, -87824568, -80701896, --70165272, -58311696, -46536508, -34928284, -23648626, -13455059, -4606890, 3348464, 10569378, 16880296, -22594750, 28263570, 33855616, 39091180, 44140452, 49177912, 53738092, 57185880, 59390808, 60509648, -60608968, 59803660, 58430344, 56992604, 56112136, 56260852, 57352844, 59072980, 61693984, 65859564, -71498320, 77883328, 84850840, 92952216, 102234720, 111824304, 120842664, 128914520, 135716128, 140693472, -143239312, 142800688, 139130096, 132580808, 123537752, 111588616, 96284040, 78704200, 60772176, 42660300, -22346178, -1624571, -28163174, -55070072, -81417008, -107751064, -134499056, -160813232, -185014848, -206087024, --224521568, -241275152, -256022464, -267179712, -273710752, -276195392, -276032704, -274184800, -270631808, -264445424, --254557872, -240999744, -225169024, -208532480, -191526544, -174000944, -156033472, -137935552, -120099632, -103117872, --87445536, -72877544, -58941448, -45649060, -33234456, -21478594, -9917616, 1650341, 13268228, 24788940, -35403416, 44078712, 50786916, 56499756, 61907120, 67092220, 72187664, 77117208, 80982680, 82968568, -83518864, 83573624, 83361560, 82914344, 82702280, 82717848, 82086488, 80413600, 78272560, 76019848, -73696272, 71772664, 69551088, 63401772, 50115288, 32187558, 16374563, 6685117, 1735704, }, +-40343700, -13508209, 46633144, 91716344, 73947528, -7758322, -95739656, -121552408, -72519448, -544387, +38518876, 38133404, 26581552, 21526376, 20213726, 21106006, 28424094, 36867464, 33590940, 18548354, +6920266, 7955890, 14348412, 15824807, 11763915, 6027987, -1577327, -13320304, -28249074, -42741904, +-53768160, -60312080, -63879584, -67890552, -74558488, -82486456, -88451096, -90421944, -87824568, -80701896, +-70165272, -58311696, -46536508, -34928284, -23648626, -13455059, -4606890, 3348464, 10569378, 16880296, +22594750, 28263570, 33855616, 39091180, 44140452, 49177912, 53738092, 57185880, 59390808, 60509648, +60608968, 59803660, 58430344, 56992604, 56112136, 56260852, 57352844, 59072980, 61693984, 65859564, +71498320, 77883328, 84850840, 92952216, 102234720, 111824304, 120842664, 128914520, 135716128, 140693472, +143239312, 142800688, 139130096, 132580808, 123537752, 111588616, 96284040, 78704200, 60772176, 42660300, +22346178, -1624571, -28163174, -55070072, -81417008, -107751064, -134499056, -160813232, -185014848, -206087024, +-224521568, -241275152, -256022464, -267179712, -273710752, -276195392, -276032704, -274184800, -270631808, -264445424, +-254557872, -240999744, -225169024, -208532480, -191526544, -174000944, -156033472, -137935552, -120099632, -103117872, +-87445536, -72877544, -58941448, -45649060, -33234456, -21478594, -9917616, 1650341, 13268228, 24788940, +35403416, 44078712, 50786916, 56499756, 61907120, 67092220, 72187664, 77117208, 80982680, 82968568, +83518864, 83573624, 83361560, 82914344, 82702280, 82717848, 82086488, 80413600, 78272560, 76019848, +73696272, 71772664, 69551088, 63401772, 50115288, 32187558, 16374563, 6685117, 1735704, }, { -20460150, --40343700, -13508209, 46633144, 91716344, 73947528, -7758322, -95739656, -121552408, -72519448, -544387, -38518876, 38133404, 26581552, 21526376, 20213726, 21106006, 28424094, 36867464, 33590940, 18548354, -6920266, 7955890, 14348412, 15824807, 11763915, 6027987, -1577327, -13320304, -28249074, -42741904, --53768160, -60312080, -63879584, -67890552, -74558488, -82486456, -88451096, -90421944, -87824568, -80701896, --70165272, -58311696, -46536508, -34928284, -23648626, -13455059, -4606890, 3348464, 10569378, 16880296, -22594750, 28263570, 33855616, 39091180, 44140452, 49177912, 53738092, 57185880, 59390808, 60509648, -60608968, 59803660, 58430344, 56992604, 56112136, 56260852, 57352844, 59072980, 61693984, 65859564, -71498320, 77883328, 84850840, 92952216, 102234720, 111824304, 120842664, 128914520, 135716128, 140693472, -143239312, 142800688, 139130096, 132580808, 123537752, 111588616, 96284040, 78704200, 60772176, 42660300, -22346178, -1624571, -28163174, -55070072, -81417008, -107751064, -134499056, -160813232, -185014848, -206087024, --224521568, -241275152, -256022464, -267179712, -273710752, -276195392, -276032704, -274184800, -270631808, -264445424, --254557872, -240999744, -225169024, -208532480, -191526544, -174000944, -156033472, -137935552, -120099632, -103117872, --87445536, -72877544, -58941448, -45649060, -33234456, -21478594, -9917616, 1650341, 13268228, 24788940, -35403416, 44078712, 50786916, 56499756, 61907120, 67092220, 72187664, 77117208, 80982680, 82968568, -83518864, 83573624, 83361560, 82914344, 82702280, 82717848, 82086488, 80413600, 78272560, 76019848, -73696272, 71772664, 69551088, 63401772, 50115288, 32187558, 16374563, 6685117, 1735704, }, +-40343700, -13508209, 46633144, 91716344, 73947528, -7758322, -95739656, -121552408, -72519448, -544387, +38518876, 38133404, 26581552, 21526376, 20213726, 21106006, 28424094, 36867464, 33590940, 18548354, +6920266, 7955890, 14348412, 15824807, 11763915, 6027987, -1577327, -13320304, -28249074, -42741904, +-53768160, -60312080, -63879584, -67890552, -74558488, -82486456, -88451096, -90421944, -87824568, -80701896, +-70165272, -58311696, -46536508, -34928284, -23648626, -13455059, -4606890, 3348464, 10569378, 16880296, +22594750, 28263570, 33855616, 39091180, 44140452, 49177912, 53738092, 57185880, 59390808, 60509648, +60608968, 59803660, 58430344, 56992604, 56112136, 56260852, 57352844, 59072980, 61693984, 65859564, +71498320, 77883328, 84850840, 92952216, 102234720, 111824304, 120842664, 128914520, 135716128, 140693472, +143239312, 142800688, 139130096, 132580808, 123537752, 111588616, 96284040, 78704200, 60772176, 42660300, +22346178, -1624571, -28163174, -55070072, -81417008, -107751064, -134499056, -160813232, -185014848, -206087024, +-224521568, -241275152, -256022464, -267179712, -273710752, -276195392, -276032704, -274184800, -270631808, -264445424, +-254557872, -240999744, -225169024, -208532480, -191526544, -174000944, -156033472, -137935552, -120099632, -103117872, +-87445536, -72877544, -58941448, -45649060, -33234456, -21478594, -9917616, 1650341, 13268228, 24788940, +35403416, 44078712, 50786916, 56499756, 61907120, 67092220, 72187664, 77117208, 80982680, 82968568, +83518864, 83573624, 83361560, 82914344, 82702280, 82717848, 82086488, 80413600, 78272560, 76019848, +73696272, 71772664, 69551088, 63401772, 50115288, 32187558, 16374563, 6685117, 1735704, }, }, { { 14716705, -11612518, -44376140, -103088880, -108561200, -50594176, 51995412, 175258832, 280116704, 316670080, 267007920, -164680864, 53394496, -54912768, -165113040, -264245712, -327356512, -348953216, -347518144, -340580160, -329331104, --307044512, -271491872, -226984192, -180089056, -135122896, -91693792, -46570332, 1603633, 50771344, 98411120, -143556592, 185511456, 222793376, 254099936, 278945248, 297080736, 308283104, 312712800, 310943808, 303997792, -293564224, 281367072, 267919520, 252631584, 235309440, 216815312, 198282528, 180523920, 164102640, 149081536, -134679440, 119849448, 104216304, 88079576, 71793064, 55604796, 39872328, 25011206, 11287711, -1207960, --12521440, -22782654, -32032940, -40187472, -47247860, -53325776, -58365920, -62188980, -64909304, -66907536, --68314136, -68973416, -68992744, -68787120, -68469296, -67730024, -66509716, -65335580, -64805152, -65041376, --65790844, -66789964, -67883568, -68891816, -69475392, -69215008, -67979672, -66198868, -64583424, -63570884, --63242856, -63801740, -65893388, -70275864, -77108624, -85522464, -93979792, -101276400, -107191648, -111947784, --115108880, -115415432, -111847392, -104569568, -94679336, -83218216, -70549136, -56565256, -41390600, -25843356, --11130945, 1938641, 13379360, 23678692, 33182918, 41803992, 49133352, 54810224, 58946816, 62265216, -65684008, 69705712, 74157976, 78415904, 81871200, 84363360, 86238648, 87949656, 89652608, 91270200, -92726736, 93883688, 94457608, 94284736, 93489088, 92174832, 90220616, 87558816, 84293568, 80338440, -75355736, 69250976, 62268972, 54512260, 45944340, 36912560, 27975806, 19202798, 10374494, 1696512, --6684043, -15480136, -24956982, -32718524, -34671124, -29163902, -19150186, -9488120, -2658048, }, +11612518, -44376140, -103088880, -108561200, -50594176, 51995412, 175258832, 280116704, 316670080, 267007920, +164680864, 53394496, -54912768, -165113040, -264245712, -327356512, -348953216, -347518144, -340580160, -329331104, +-307044512, -271491872, -226984192, -180089056, -135122896, -91693792, -46570332, 1603633, 50771344, 98411120, +143556592, 185511456, 222793376, 254099936, 278945248, 297080736, 308283104, 312712800, 310943808, 303997792, +293564224, 281367072, 267919520, 252631584, 235309440, 216815312, 198282528, 180523920, 164102640, 149081536, +134679440, 119849448, 104216304, 88079576, 71793064, 55604796, 39872328, 25011206, 11287711, -1207960, +-12521440, -22782654, -32032940, -40187472, -47247860, -53325776, -58365920, -62188980, -64909304, -66907536, +-68314136, -68973416, -68992744, -68787120, -68469296, -67730024, -66509716, -65335580, -64805152, -65041376, +-65790844, -66789964, -67883568, -68891816, -69475392, -69215008, -67979672, -66198868, -64583424, -63570884, +-63242856, -63801740, -65893388, -70275864, -77108624, -85522464, -93979792, -101276400, -107191648, -111947784, +-115108880, -115415432, -111847392, -104569568, -94679336, -83218216, -70549136, -56565256, -41390600, -25843356, +-11130945, 1938641, 13379360, 23678692, 33182918, 41803992, 49133352, 54810224, 58946816, 62265216, +65684008, 69705712, 74157976, 78415904, 81871200, 84363360, 86238648, 87949656, 89652608, 91270200, +92726736, 93883688, 94457608, 94284736, 93489088, 92174832, 90220616, 87558816, 84293568, 80338440, +75355736, 69250976, 62268972, 54512260, 45944340, 36912560, 27975806, 19202798, 10374494, 1696512, +-6684043, -15480136, -24956982, -32718524, -34671124, -29163902, -19150186, -9488120, -2658048, }, { 14716705, -11612518, -44376140, -103088880, -108561200, -50594176, 51995412, 175258832, 280116704, 316670080, 267007920, -164680864, 53394496, -54912768, -165113040, -264245712, -327356512, -348953216, -347518144, -340580160, -329331104, --307044512, -271491872, -226984192, -180089056, -135122896, -91693792, -46570332, 1603633, 50771344, 98411120, -143556592, 185511456, 222793376, 254099936, 278945248, 297080736, 308283104, 312712800, 310943808, 303997792, -293564224, 281367072, 267919520, 252631584, 235309440, 216815312, 198282528, 180523920, 164102640, 149081536, -134679440, 119849448, 104216304, 88079576, 71793064, 55604796, 39872328, 25011206, 11287711, -1207960, --12521440, -22782654, -32032940, -40187472, -47247860, -53325776, -58365920, -62188980, -64909304, -66907536, --68314136, -68973416, -68992744, -68787120, -68469296, -67730024, -66509716, -65335580, -64805152, -65041376, --65790844, -66789964, -67883568, -68891816, -69475392, -69215008, -67979672, -66198868, -64583424, -63570884, --63242856, -63801740, -65893388, -70275864, -77108624, -85522464, -93979792, -101276400, -107191648, -111947784, --115108880, -115415432, -111847392, -104569568, -94679336, -83218216, -70549136, -56565256, -41390600, -25843356, --11130945, 1938641, 13379360, 23678692, 33182918, 41803992, 49133352, 54810224, 58946816, 62265216, -65684008, 69705712, 74157976, 78415904, 81871200, 84363360, 86238648, 87949656, 89652608, 91270200, -92726736, 93883688, 94457608, 94284736, 93489088, 92174832, 90220616, 87558816, 84293568, 80338440, -75355736, 69250976, 62268972, 54512260, 45944340, 36912560, 27975806, 19202798, 10374494, 1696512, --6684043, -15480136, -24956982, -32718524, -34671124, -29163902, -19150186, -9488120, -2658048, }, +11612518, -44376140, -103088880, -108561200, -50594176, 51995412, 175258832, 280116704, 316670080, 267007920, +164680864, 53394496, -54912768, -165113040, -264245712, -327356512, -348953216, -347518144, -340580160, -329331104, +-307044512, -271491872, -226984192, -180089056, -135122896, -91693792, -46570332, 1603633, 50771344, 98411120, +143556592, 185511456, 222793376, 254099936, 278945248, 297080736, 308283104, 312712800, 310943808, 303997792, +293564224, 281367072, 267919520, 252631584, 235309440, 216815312, 198282528, 180523920, 164102640, 149081536, +134679440, 119849448, 104216304, 88079576, 71793064, 55604796, 39872328, 25011206, 11287711, -1207960, +-12521440, -22782654, -32032940, -40187472, -47247860, -53325776, -58365920, -62188980, -64909304, -66907536, +-68314136, -68973416, -68992744, -68787120, -68469296, -67730024, -66509716, -65335580, -64805152, -65041376, +-65790844, -66789964, -67883568, -68891816, -69475392, -69215008, -67979672, -66198868, -64583424, -63570884, +-63242856, -63801740, -65893388, -70275864, -77108624, -85522464, -93979792, -101276400, -107191648, -111947784, +-115108880, -115415432, -111847392, -104569568, -94679336, -83218216, -70549136, -56565256, -41390600, -25843356, +-11130945, 1938641, 13379360, 23678692, 33182918, 41803992, 49133352, 54810224, 58946816, 62265216, +65684008, 69705712, 74157976, 78415904, 81871200, 84363360, 86238648, 87949656, 89652608, 91270200, +92726736, 93883688, 94457608, 94284736, 93489088, 92174832, 90220616, 87558816, 84293568, 80338440, +75355736, 69250976, 62268972, 54512260, 45944340, 36912560, 27975806, 19202798, 10374494, 1696512, +-6684043, -15480136, -24956982, -32718524, -34671124, -29163902, -19150186, -9488120, -2658048, }, }, }; const Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 458548416, -288004928, 36019744, -187976224, -327024704, -388965120, -402463680, -378622848, -315303744, -217801008, -101255464, -18409304, 126339688, 208903984, 259983504, 282743072, 282130496, 261101264, 224144144, 176714288, 121097136, -59304908, -2450816, -59071368, -112419160, -165159216, -213866816, -254361920, -287706976, -315477152, -335894912, --349012800, -358507904, -365523744, -368087296, -367405472, -366872896, -365766400, -361818784, -357276864, -354698816, --351249952, -344377984, -337027168, -330979840, -322771072, -311363104, -300767968, -291396352, -279003744, -264058880, --251057488, -238803408, -223079520, -206383376, -193078640, -179949472, -163271040, -147447296, -135569040, -122029144, --104452528, -89380416, -77912320, -62358632, -43022688, -28498718, -16430397, 2892124, 24889872, 39438536, -55137716, 83652008, 112425064, 131199440, 166224368, 237659328, 303841568, 310876160, 281195808, }, +288004928, 36019744, -187976224, -327024704, -388965120, -402463680, -378622848, -315303744, -217801008, -101255464, +18409304, 126339688, 208903984, 259983504, 282743072, 282130496, 261101264, 224144144, 176714288, 121097136, +59304908, -2450816, -59071368, -112419160, -165159216, -213866816, -254361920, -287706976, -315477152, -335894912, +-349012800, -358507904, -365523744, -368087296, -367405472, -366872896, -365766400, -361818784, -357276864, -354698816, +-351249952, -344377984, -337027168, -330979840, -322771072, -311363104, -300767968, -291396352, -279003744, -264058880, +-251057488, -238803408, -223079520, -206383376, -193078640, -179949472, -163271040, -147447296, -135569040, -122029144, +-104452528, -89380416, -77912320, -62358632, -43022688, -28498718, -16430397, 2892124, 24889872, 39438536, +55137716, 83652008, 112425064, 131199440, 166224368, 237659328, 303841568, 310876160, 281195808, }, { 458548416, -288004928, 36019744, -187976224, -327024704, -388965120, -402463680, -378622848, -315303744, -217801008, -101255464, -18409304, 126339688, 208903984, 259983504, 282743072, 282130496, 261101264, 224144144, 176714288, 121097136, -59304908, -2450816, -59071368, -112419160, -165159216, -213866816, -254361920, -287706976, -315477152, -335894912, --349012800, -358507904, -365523744, -368087296, -367405472, -366872896, -365766400, -361818784, -357276864, -354698816, --351249952, -344377984, -337027168, -330979840, -322771072, -311363104, -300767968, -291396352, -279003744, -264058880, --251057488, -238803408, -223079520, -206383376, -193078640, -179949472, -163271040, -147447296, -135569040, -122029144, --104452528, -89380416, -77912320, -62358632, -43022688, -28498718, -16430397, 2892124, 24889872, 39438536, -55137716, 83652008, 112425064, 131199440, 166224368, 237659328, 303841568, 310876160, 281195808, }, +288004928, 36019744, -187976224, -327024704, -388965120, -402463680, -378622848, -315303744, -217801008, -101255464, +18409304, 126339688, 208903984, 259983504, 282743072, 282130496, 261101264, 224144144, 176714288, 121097136, +59304908, -2450816, -59071368, -112419160, -165159216, -213866816, -254361920, -287706976, -315477152, -335894912, +-349012800, -358507904, -365523744, -368087296, -367405472, -366872896, -365766400, -361818784, -357276864, -354698816, +-351249952, -344377984, -337027168, -330979840, -322771072, -311363104, -300767968, -291396352, -279003744, -264058880, +-251057488, -238803408, -223079520, -206383376, -193078640, -179949472, -163271040, -147447296, -135569040, -122029144, +-104452528, -89380416, -77912320, -62358632, -43022688, -28498718, -16430397, 2892124, 24889872, 39438536, +55137716, 83652008, 112425064, 131199440, 166224368, 237659328, 303841568, 310876160, 281195808, }, }, { { -6680285, -164793056, 343598464, 346121216, 119204136, -232472624, -541734400, -697761472, -693628096, -586175552, -429270720, --248121328, -57235272, 124696320, 282600256, 410929056, 505404384, 559695424, 573703488, 555786496, 514943488, -457637344, 390174144, 316517088, 236630688, 152837488, 72540920, -216896, -68562176, -134133440, -193402384, --245631328, -294658912, -340661248, -380098688, -414168000, -447189312, -478065824, -503238624, -524577632, -544824640, --560739648, -569639872, -575469248, -580737024, -581515456, -576584320, -570787712, -564958400, -554609152, -540835136, --529266688, -518326848, -502419360, -483915040, -467812128, -450364896, -427169920, -403682368, -384242272, -362739520, --336320096, -312757376, -293879392, -270810048, -243498336, -222114240, -204527952, -179219328, -150961664, -132316128, --114280488, -82068232, -49047452, -29818348, 4310000, 85765128, 181594976, 229271264, 229039328, }, +164793056, 343598464, 346121216, 119204136, -232472624, -541734400, -697761472, -693628096, -586175552, -429270720, +-248121328, -57235272, 124696320, 282600256, 410929056, 505404384, 559695424, 573703488, 555786496, 514943488, +457637344, 390174144, 316517088, 236630688, 152837488, 72540920, -216896, -68562176, -134133440, -193402384, +-245631328, -294658912, -340661248, -380098688, -414168000, -447189312, -478065824, -503238624, -524577632, -544824640, +-560739648, -569639872, -575469248, -580737024, -581515456, -576584320, -570787712, -564958400, -554609152, -540835136, +-529266688, -518326848, -502419360, -483915040, -467812128, -450364896, -427169920, -403682368, -384242272, -362739520, +-336320096, -312757376, -293879392, -270810048, -243498336, -222114240, -204527952, -179219328, -150961664, -132316128, +-114280488, -82068232, -49047452, -29818348, 4310000, 85765128, 181594976, 229271264, 229039328, }, { 6680285, --164793056, -343598464, -346121216, -119204136, 232472624, 541734400, 697761472, 693628096, 586175552, 429270720, -248121328, 57235272, -124696320, -282600256, -410929056, -505404384, -559695424, -573703488, -555786496, -514943488, --457637344, -390174144, -316517088, -236630688, -152837488, -72540920, 216896, 68562176, 134133440, 193402384, -245631328, 294658912, 340661248, 380098688, 414168000, 447189312, 478065824, 503238624, 524577632, 544824640, -560739648, 569639872, 575469248, 580737024, 581515456, 576584320, 570787712, 564958400, 554609152, 540835136, -529266688, 518326848, 502419360, 483915040, 467812128, 450364896, 427169920, 403682368, 384242272, 362739520, -336320096, 312757376, 293879392, 270810048, 243498336, 222114240, 204527952, 179219328, 150961664, 132316128, -114280488, 82068232, 49047452, 29818348, -4310000, -85765128, -181594976, -229271264, -229039328, }, +-164793056, -343598464, -346121216, -119204136, 232472624, 541734400, 697761472, 693628096, 586175552, 429270720, +248121328, 57235272, -124696320, -282600256, -410929056, -505404384, -559695424, -573703488, -555786496, -514943488, +-457637344, -390174144, -316517088, -236630688, -152837488, -72540920, 216896, 68562176, 134133440, 193402384, +245631328, 294658912, 340661248, 380098688, 414168000, 447189312, 478065824, 503238624, 524577632, 544824640, +560739648, 569639872, 575469248, 580737024, 581515456, 576584320, 570787712, 564958400, 554609152, 540835136, +529266688, 518326848, 502419360, 483915040, 467812128, 450364896, 427169920, 403682368, 384242272, 362739520, +336320096, 312757376, 293879392, 270810048, 243498336, 222114240, 204527952, 179219328, 150961664, 132316128, +114280488, 82068232, 49047452, 29818348, -4310000, -85765128, -181594976, -229271264, -229039328, }, }, { { 56929792, -32702954, -17035988, -65899832, -70332240, -23156854, 30343408, 43584792, 15283104, -24489904, -51496656, --56739204, -39491152, -9847823, 13324599, 21841520, 27769648, 43945568, 64601140, 74967584, 70637720, -56937308, 36863168, 10703059, -16742856, -38056096, -51105280, -59698972, -67841152, -76534168, -84198000, --87912608, -85837608, -79298520, -71068824, -62506268, -54630912, -50245212, -51711944, -57933740, -66320736, --76117560, -87351048, -98688144, -108890840, -118427280, -127745752, -136126304, -143473376, -150588000, -156772208, --159970352, -159729840, -157088960, -151699312, -142245552, -129212480, -113966960, -96036008, -74430176, -50194208, --24536612, 3521873, 34633544, 66910760, 99025840, 132155608, 166103024, 197674800, 225691408, 252471600, -277316896, 295024512, 305051648, 314057120, 321451456, 309289184, 259698416, 184246048, 126319824, }, +32702954, -17035988, -65899832, -70332240, -23156854, 30343408, 43584792, 15283104, -24489904, -51496656, +-56739204, -39491152, -9847823, 13324599, 21841520, 27769648, 43945568, 64601140, 74967584, 70637720, +56937308, 36863168, 10703059, -16742856, -38056096, -51105280, -59698972, -67841152, -76534168, -84198000, +-87912608, -85837608, -79298520, -71068824, -62506268, -54630912, -50245212, -51711944, -57933740, -66320736, +-76117560, -87351048, -98688144, -108890840, -118427280, -127745752, -136126304, -143473376, -150588000, -156772208, +-159970352, -159729840, -157088960, -151699312, -142245552, -129212480, -113966960, -96036008, -74430176, -50194208, +-24536612, 3521873, 34633544, 66910760, 99025840, 132155608, 166103024, 197674800, 225691408, 252471600, +277316896, 295024512, 305051648, 314057120, 321451456, 309289184, 259698416, 184246048, 126319824, }, { 56929792, -32702954, -17035988, -65899832, -70332240, -23156854, 30343408, 43584792, 15283104, -24489904, -51496656, --56739204, -39491152, -9847823, 13324599, 21841520, 27769648, 43945568, 64601140, 74967584, 70637720, -56937308, 36863168, 10703059, -16742856, -38056096, -51105280, -59698972, -67841152, -76534168, -84198000, --87912608, -85837608, -79298520, -71068824, -62506268, -54630912, -50245212, -51711944, -57933740, -66320736, --76117560, -87351048, -98688144, -108890840, -118427280, -127745752, -136126304, -143473376, -150588000, -156772208, --159970352, -159729840, -157088960, -151699312, -142245552, -129212480, -113966960, -96036008, -74430176, -50194208, --24536612, 3521873, 34633544, 66910760, 99025840, 132155608, 166103024, 197674800, 225691408, 252471600, -277316896, 295024512, 305051648, 314057120, 321451456, 309289184, 259698416, 184246048, 126319824, }, +32702954, -17035988, -65899832, -70332240, -23156854, 30343408, 43584792, 15283104, -24489904, -51496656, +-56739204, -39491152, -9847823, 13324599, 21841520, 27769648, 43945568, 64601140, 74967584, 70637720, +56937308, 36863168, 10703059, -16742856, -38056096, -51105280, -59698972, -67841152, -76534168, -84198000, +-87912608, -85837608, -79298520, -71068824, -62506268, -54630912, -50245212, -51711944, -57933740, -66320736, +-76117560, -87351048, -98688144, -108890840, -118427280, -127745752, -136126304, -143473376, -150588000, -156772208, +-159970352, -159729840, -157088960, -151699312, -142245552, -129212480, -113966960, -96036008, -74430176, -50194208, +-24536612, 3521873, 34633544, 66910760, 99025840, 132155608, 166103024, 197674800, 225691408, 252471600, +277316896, 295024512, 305051648, 314057120, 321451456, 309289184, 259698416, 184246048, 126319824, }, }, { { 13747653, -24179592, 14550812, -24625194, -59763932, -56667260, -25659746, -7880728, -26664768, -66838280, -96977680, --99336688, -78250008, -48997524, -22731114, 686121, 28130962, 62903016, 99795712, 129662376, 146496496, -149463792, 140745008, 123942552, 103496360, 82495584, 59947008, 31973884, -3155727, -42750492, -83415784, --124656056, -166657616, -206721600, -240942832, -268026368, -288604096, -302155232, -307542208, -305552032, -298326816, --287198560, -272998336, -257139152, -240664192, -223538016, -205876032, -188226944, -170212240, -151019104, -131421704, --113209432, -97021160, -82820928, -71288944, -62351112, -53964116, -44628468, -35070556, -25678536, -15246060, --3839164, 6704981, 16334297, 26765700, 37558952, 47022912, 56507276, 68250792, 80564456, 91340536, -103145784, 117800752, 131357280, 142814112, 158838624, 177448720, 178645408, 151044336, 119084944, }, +24179592, 14550812, -24625194, -59763932, -56667260, -25659746, -7880728, -26664768, -66838280, -96977680, +-99336688, -78250008, -48997524, -22731114, 686121, 28130962, 62903016, 99795712, 129662376, 146496496, +149463792, 140745008, 123942552, 103496360, 82495584, 59947008, 31973884, -3155727, -42750492, -83415784, +-124656056, -166657616, -206721600, -240942832, -268026368, -288604096, -302155232, -307542208, -305552032, -298326816, +-287198560, -272998336, -257139152, -240664192, -223538016, -205876032, -188226944, -170212240, -151019104, -131421704, +-113209432, -97021160, -82820928, -71288944, -62351112, -53964116, -44628468, -35070556, -25678536, -15246060, +-3839164, 6704981, 16334297, 26765700, 37558952, 47022912, 56507276, 68250792, 80564456, 91340536, +103145784, 117800752, 131357280, 142814112, 158838624, 177448720, 178645408, 151044336, 119084944, }, { 13747653, -24179592, 14550812, -24625194, -59763932, -56667260, -25659746, -7880728, -26664768, -66838280, -96977680, --99336688, -78250008, -48997524, -22731114, 686121, 28130962, 62903016, 99795712, 129662376, 146496496, -149463792, 140745008, 123942552, 103496360, 82495584, 59947008, 31973884, -3155727, -42750492, -83415784, --124656056, -166657616, -206721600, -240942832, -268026368, -288604096, -302155232, -307542208, -305552032, -298326816, --287198560, -272998336, -257139152, -240664192, -223538016, -205876032, -188226944, -170212240, -151019104, -131421704, --113209432, -97021160, -82820928, -71288944, -62351112, -53964116, -44628468, -35070556, -25678536, -15246060, --3839164, 6704981, 16334297, 26765700, 37558952, 47022912, 56507276, 68250792, 80564456, 91340536, -103145784, 117800752, 131357280, 142814112, 158838624, 177448720, 178645408, 151044336, 119084944, }, +24179592, 14550812, -24625194, -59763932, -56667260, -25659746, -7880728, -26664768, -66838280, -96977680, +-99336688, -78250008, -48997524, -22731114, 686121, 28130962, 62903016, 99795712, 129662376, 146496496, +149463792, 140745008, 123942552, 103496360, 82495584, 59947008, 31973884, -3155727, -42750492, -83415784, +-124656056, -166657616, -206721600, -240942832, -268026368, -288604096, -302155232, -307542208, -305552032, -298326816, +-287198560, -272998336, -257139152, -240664192, -223538016, -205876032, -188226944, -170212240, -151019104, -131421704, +-113209432, -97021160, -82820928, -71288944, -62351112, -53964116, -44628468, -35070556, -25678536, -15246060, +-3839164, 6704981, 16334297, 26765700, 37558952, 47022912, 56507276, 68250792, 80564456, 91340536, +103145784, 117800752, 131357280, 142814112, 158838624, 177448720, 178645408, 151044336, 119084944, }, }, { { 368293, --3048890, -1468879, 7374996, 13603772, 9038222, 481573, -840203, -845572, -20397874, -66472136, --115881976, -136780208, -120776088, -85447304, -49606872, -16407312, 19768660, 60117196, 100017976, 135532528, -165566688, 188641408, 201786160, 203722640, 196553808, 182668176, 161795184, 132951784, 97609040, 58577984, -17105780, -26522496, -70843872, -114004536, -155064960, -192145024, -221224640, -239529248, -248493392, -251313040, --249691680, -244772864, -238466784, -231702208, -223685120, -214202368, -204148928, -193284272, -180464320, -166262480, --152371488, -138978704, -125753424, -114062520, -104983496, -97000224, -88618064, -80697064, -73618424, -65599720, --56105156, -46832324, -37693168, -26623966, -14120242, -2343442, 9921911, 25036438, 40991168, 55364812, -71156336, 90472416, 108683072, 124603984, 146057872, 170790448, 175328080, 145876960, 110227648, }, +-3048890, -1468879, 7374996, 13603772, 9038222, 481573, -840203, -845572, -20397874, -66472136, +-115881976, -136780208, -120776088, -85447304, -49606872, -16407312, 19768660, 60117196, 100017976, 135532528, +165566688, 188641408, 201786160, 203722640, 196553808, 182668176, 161795184, 132951784, 97609040, 58577984, +17105780, -26522496, -70843872, -114004536, -155064960, -192145024, -221224640, -239529248, -248493392, -251313040, +-249691680, -244772864, -238466784, -231702208, -223685120, -214202368, -204148928, -193284272, -180464320, -166262480, +-152371488, -138978704, -125753424, -114062520, -104983496, -97000224, -88618064, -80697064, -73618424, -65599720, +-56105156, -46832324, -37693168, -26623966, -14120242, -2343442, 9921911, 25036438, 40991168, 55364812, +71156336, 90472416, 108683072, 124603984, 146057872, 170790448, 175328080, 145876960, 110227648, }, { -368293, -3048890, 1468879, -7374996, -13603772, -9038222, -481573, 840203, 845572, 20397874, 66472136, -115881976, 136780208, 120776088, 85447304, 49606872, 16407312, -19768660, -60117196, -100017976, -135532528, --165566688, -188641408, -201786160, -203722640, -196553808, -182668176, -161795184, -132951784, -97609040, -58577984, --17105780, 26522496, 70843872, 114004536, 155064960, 192145024, 221224640, 239529248, 248493392, 251313040, -249691680, 244772864, 238466784, 231702208, 223685120, 214202368, 204148928, 193284272, 180464320, 166262480, -152371488, 138978704, 125753424, 114062520, 104983496, 97000224, 88618064, 80697064, 73618424, 65599720, -56105156, 46832324, 37693168, 26623966, 14120242, 2343442, -9921911, -25036438, -40991168, -55364812, --71156336, -90472416, -108683072, -124603984, -146057872, -170790448, -175328080, -145876960, -110227648, }, +3048890, 1468879, -7374996, -13603772, -9038222, -481573, 840203, 845572, 20397874, 66472136, +115881976, 136780208, 120776088, 85447304, 49606872, 16407312, -19768660, -60117196, -100017976, -135532528, +-165566688, -188641408, -201786160, -203722640, -196553808, -182668176, -161795184, -132951784, -97609040, -58577984, +-17105780, 26522496, 70843872, 114004536, 155064960, 192145024, 221224640, 239529248, 248493392, 251313040, +249691680, 244772864, 238466784, 231702208, 223685120, 214202368, 204148928, 193284272, 180464320, 166262480, +152371488, 138978704, 125753424, 114062520, 104983496, 97000224, 88618064, 80697064, 73618424, 65599720, +56105156, 46832324, 37693168, 26623966, 14120242, 2343442, -9921911, -25036438, -40991168, -55364812, +-71156336, -90472416, -108683072, -124603984, -146057872, -170790448, -175328080, -145876960, -110227648, }, }, { { 4243428, --4525285, 1450088, 13779329, 980326, -21391622, 2690797, 72931768, 105982616, 41259604, -73534672, --141541728, -127762928, -73687680, -26748520, 3726421, 29141354, 55375012, 80288512, 99776384, 109567304, -107421424, 95509336, 78276312, 59301152, 41651520, 28340342, 20354924, 16241419, 14893873, 16932908, -22392348, 28755880, 32857574, 34234648, 35179540, 37076844, 37903088, 34362960, 25459492, 12666932, --2234457, -17712446, -32049046, -44368624, -55446416, -66281544, -77069432, -88304528, -100865696, -114238080, --126841656, -138443440, -149727936, -159640176, -166064912, -168644576, -167984224, -163220032, -153458640, -139938080, --123814784, -104166912, -80791016, -55704652, -29579440, -913217, 29350196, 57663696, 83715352, 109902848, -134050760, 150826368, 161287296, 170820512, 175198160, 159931168, 119301304, 68813968, 34583076, }, +-4525285, 1450088, 13779329, 980326, -21391622, 2690797, 72931768, 105982616, 41259604, -73534672, +-141541728, -127762928, -73687680, -26748520, 3726421, 29141354, 55375012, 80288512, 99776384, 109567304, +107421424, 95509336, 78276312, 59301152, 41651520, 28340342, 20354924, 16241419, 14893873, 16932908, +22392348, 28755880, 32857574, 34234648, 35179540, 37076844, 37903088, 34362960, 25459492, 12666932, +-2234457, -17712446, -32049046, -44368624, -55446416, -66281544, -77069432, -88304528, -100865696, -114238080, +-126841656, -138443440, -149727936, -159640176, -166064912, -168644576, -167984224, -163220032, -153458640, -139938080, +-123814784, -104166912, -80791016, -55704652, -29579440, -913217, 29350196, 57663696, 83715352, 109902848, +134050760, 150826368, 161287296, 170820512, 175198160, 159931168, 119301304, 68813968, 34583076, }, { -4243428, -4525285, -1450088, -13779329, -980326, 21391622, -2690797, -72931768, -105982616, -41259604, 73534672, -141541728, 127762928, 73687680, 26748520, -3726421, -29141354, -55375012, -80288512, -99776384, -109567304, --107421424, -95509336, -78276312, -59301152, -41651520, -28340342, -20354924, -16241419, -14893873, -16932908, --22392348, -28755880, -32857574, -34234648, -35179540, -37076844, -37903088, -34362960, -25459492, -12666932, -2234457, 17712446, 32049046, 44368624, 55446416, 66281544, 77069432, 88304528, 100865696, 114238080, -126841656, 138443440, 149727936, 159640176, 166064912, 168644576, 167984224, 163220032, 153458640, 139938080, -123814784, 104166912, 80791016, 55704652, 29579440, 913217, -29350196, -57663696, -83715352, -109902848, --134050760, -150826368, -161287296, -170820512, -175198160, -159931168, -119301304, -68813968, -34583076, }, +4525285, -1450088, -13779329, -980326, 21391622, -2690797, -72931768, -105982616, -41259604, 73534672, +141541728, 127762928, 73687680, 26748520, -3726421, -29141354, -55375012, -80288512, -99776384, -109567304, +-107421424, -95509336, -78276312, -59301152, -41651520, -28340342, -20354924, -16241419, -14893873, -16932908, +-22392348, -28755880, -32857574, -34234648, -35179540, -37076844, -37903088, -34362960, -25459492, -12666932, +2234457, 17712446, 32049046, 44368624, 55446416, 66281544, 77069432, 88304528, 100865696, 114238080, +126841656, 138443440, 149727936, 159640176, 166064912, 168644576, 167984224, 163220032, 153458640, 139938080, +123814784, 104166912, 80791016, 55704652, 29579440, 913217, -29350196, -57663696, -83715352, -109902848, +-134050760, -150826368, -161287296, -170820512, -175198160, -159931168, -119301304, -68813968, -34583076, }, }, { { -6826851, --6057515, -15246597, -32778116, -43596604, -44637596, -48894980, -55131272, -34748432, 33612416, 127658776, -196816336, 210170464, 177002048, 124192200, 68890200, 16225313, -29956324, -65310348, -90420872, -109859360, --125607392, -135870224, -139659456, -137849664, -130121400, -116014584, -99597072, -88147760, -84653272, -85240072, --84846544, -81829864, -76485312, -68936912, -59672128, -49427020, -37944964, -24684788, -10306848, 4103305, -18002356, 30329448, 39567388, 46104328, 52113524, 58238684, 63140852, 66578436, 69650944, 72033584, -72430328, 71256728, 69492032, 66113504, 60049548, 52780316, 45839648, 38427608, 30284888, 23361400, -18210124, 13047037, 8094403, 5720897, 5493263, 5160403, 6211597, 11516955, 19177028, 26549340, -36696200, 51961588, 67656472, 82720536, 105781288, 134890432, 144971792, 119775904, 86061480, }, +-6057515, -15246597, -32778116, -43596604, -44637596, -48894980, -55131272, -34748432, 33612416, 127658776, +196816336, 210170464, 177002048, 124192200, 68890200, 16225313, -29956324, -65310348, -90420872, -109859360, +-125607392, -135870224, -139659456, -137849664, -130121400, -116014584, -99597072, -88147760, -84653272, -85240072, +-84846544, -81829864, -76485312, -68936912, -59672128, -49427020, -37944964, -24684788, -10306848, 4103305, +18002356, 30329448, 39567388, 46104328, 52113524, 58238684, 63140852, 66578436, 69650944, 72033584, +72430328, 71256728, 69492032, 66113504, 60049548, 52780316, 45839648, 38427608, 30284888, 23361400, +18210124, 13047037, 8094403, 5720897, 5493263, 5160403, 6211597, 11516955, 19177028, 26549340, +36696200, 51961588, 67656472, 82720536, 105781288, 134890432, 144971792, 119775904, 86061480, }, { -6826851, --6057515, -15246597, -32778116, -43596604, -44637596, -48894980, -55131272, -34748432, 33612416, 127658776, -196816336, 210170464, 177002048, 124192200, 68890200, 16225313, -29956324, -65310348, -90420872, -109859360, --125607392, -135870224, -139659456, -137849664, -130121400, -116014584, -99597072, -88147760, -84653272, -85240072, --84846544, -81829864, -76485312, -68936912, -59672128, -49427020, -37944964, -24684788, -10306848, 4103305, -18002356, 30329448, 39567388, 46104328, 52113524, 58238684, 63140852, 66578436, 69650944, 72033584, -72430328, 71256728, 69492032, 66113504, 60049548, 52780316, 45839648, 38427608, 30284888, 23361400, -18210124, 13047037, 8094403, 5720897, 5493263, 5160403, 6211597, 11516955, 19177028, 26549340, -36696200, 51961588, 67656472, 82720536, 105781288, 134890432, 144971792, 119775904, 86061480, }, +-6057515, -15246597, -32778116, -43596604, -44637596, -48894980, -55131272, -34748432, 33612416, 127658776, +196816336, 210170464, 177002048, 124192200, 68890200, 16225313, -29956324, -65310348, -90420872, -109859360, +-125607392, -135870224, -139659456, -137849664, -130121400, -116014584, -99597072, -88147760, -84653272, -85240072, +-84846544, -81829864, -76485312, -68936912, -59672128, -49427020, -37944964, -24684788, -10306848, 4103305, +18002356, 30329448, 39567388, 46104328, 52113524, 58238684, 63140852, 66578436, 69650944, 72033584, +72430328, 71256728, 69492032, 66113504, 60049548, 52780316, 45839648, 38427608, 30284888, 23361400, +18210124, 13047037, 8094403, 5720897, 5493263, 5160403, 6211597, 11516955, 19177028, 26549340, +36696200, 51961588, 67656472, 82720536, 105781288, 134890432, 144971792, 119775904, 86061480, }, }, { { 19251654, --18982144, -61636000, -64225332, -8608725, 72361608, 113291576, 74142408, -16891570, -88233664, -95866888, --59329604, -25140592, -13041131, -11723113, -10652056, -11085847, -10317585, 361314, 17995912, 26939646, -21286932, 13588740, 15809238, 24864102, 32784022, 39150236, 46495168, 52472688, 53149684, 48338248, -39996348, 30160870, 21744346, 16369731, 11051488, 1435593, -12585328, -28260348, -44339096, -59943248, --72372880, -80202072, -85403816, -89399208, -90870232, -89631672, -87996904, -86639152, -83959632, -80319112, --77761456, -75691280, -72060424, -67717672, -64384244, -60509108, -54260468, -47500192, -42052560, -36249524, --29358248, -24135568, -21457656, -18673980, -15665893, -15128485, -15772731, -13948980, -11482595, -11852499, --11142756, -4625143, 2744484, 6984154, 18542984, 45823008, 73170672, 79101488, 70233992, }, +-18982144, -61636000, -64225332, -8608725, 72361608, 113291576, 74142408, -16891570, -88233664, -95866888, +-59329604, -25140592, -13041131, -11723113, -10652056, -11085847, -10317585, 361314, 17995912, 26939646, +21286932, 13588740, 15809238, 24864102, 32784022, 39150236, 46495168, 52472688, 53149684, 48338248, +39996348, 30160870, 21744346, 16369731, 11051488, 1435593, -12585328, -28260348, -44339096, -59943248, +-72372880, -80202072, -85403816, -89399208, -90870232, -89631672, -87996904, -86639152, -83959632, -80319112, +-77761456, -75691280, -72060424, -67717672, -64384244, -60509108, -54260468, -47500192, -42052560, -36249524, +-29358248, -24135568, -21457656, -18673980, -15665893, -15128485, -15772731, -13948980, -11482595, -11852499, +-11142756, -4625143, 2744484, 6984154, 18542984, 45823008, 73170672, 79101488, 70233992, }, { 19251654, --18982144, -61636000, -64225332, -8608725, 72361608, 113291576, 74142408, -16891570, -88233664, -95866888, --59329604, -25140592, -13041131, -11723113, -10652056, -11085847, -10317585, 361314, 17995912, 26939646, -21286932, 13588740, 15809238, 24864102, 32784022, 39150236, 46495168, 52472688, 53149684, 48338248, -39996348, 30160870, 21744346, 16369731, 11051488, 1435593, -12585328, -28260348, -44339096, -59943248, --72372880, -80202072, -85403816, -89399208, -90870232, -89631672, -87996904, -86639152, -83959632, -80319112, --77761456, -75691280, -72060424, -67717672, -64384244, -60509108, -54260468, -47500192, -42052560, -36249524, --29358248, -24135568, -21457656, -18673980, -15665893, -15128485, -15772731, -13948980, -11482595, -11852499, --11142756, -4625143, 2744484, 6984154, 18542984, 45823008, 73170672, 79101488, 70233992, }, +-18982144, -61636000, -64225332, -8608725, 72361608, 113291576, 74142408, -16891570, -88233664, -95866888, +-59329604, -25140592, -13041131, -11723113, -10652056, -11085847, -10317585, 361314, 17995912, 26939646, +21286932, 13588740, 15809238, 24864102, 32784022, 39150236, 46495168, 52472688, 53149684, 48338248, +39996348, 30160870, 21744346, 16369731, 11051488, 1435593, -12585328, -28260348, -44339096, -59943248, +-72372880, -80202072, -85403816, -89399208, -90870232, -89631672, -87996904, -86639152, -83959632, -80319112, +-77761456, -75691280, -72060424, -67717672, -64384244, -60509108, -54260468, -47500192, -42052560, -36249524, +-29358248, -24135568, -21457656, -18673980, -15665893, -15128485, -15772731, -13948980, -11482595, -11852499, +-11142756, -4625143, 2744484, 6984154, 18542984, 45823008, 73170672, 79101488, 70233992, }, }, { { -148713, -38926900, 55264416, 7113003, -82071992, -162379296, -201008768, -177901296, -80883360, 68788200, 213079232, -305129504, 345367456, 354848576, 334543584, 273673696, 182609664, 91002304, 16658568, -45738180, -106727256, --167042560, -220613680, -262422496, -291595520, -311575712, -327321056, -340128672, -346870688, -345117280, -335773024, --319985792, -297351872, -268227152, -234532064, -197647952, -158186336, -117700896, -78248936, -40883256, -6394133, -23968064, 50220516, 74125768, 96413424, 115648440, 130894496, 143004160, 152630784, 159769024, 165597840, -171820704, 178088672, 182780928, 185774512, 187760944, 188035280, 185756256, 181894016, 177441200, 171699904, -164425840, 157017568, 149826176, 141460112, 132021928, 123266096, 114913464, 105238512, 95279016, 87270512, -79717816, 70102456, 60736744, 54407572, 46471008, 30596274, 10727755, -2694018, -6955163, }, +38926900, 55264416, 7113003, -82071992, -162379296, -201008768, -177901296, -80883360, 68788200, 213079232, +305129504, 345367456, 354848576, 334543584, 273673696, 182609664, 91002304, 16658568, -45738180, -106727256, +-167042560, -220613680, -262422496, -291595520, -311575712, -327321056, -340128672, -346870688, -345117280, -335773024, +-319985792, -297351872, -268227152, -234532064, -197647952, -158186336, -117700896, -78248936, -40883256, -6394133, +23968064, 50220516, 74125768, 96413424, 115648440, 130894496, 143004160, 152630784, 159769024, 165597840, +171820704, 178088672, 182780928, 185774512, 187760944, 188035280, 185756256, 181894016, 177441200, 171699904, +164425840, 157017568, 149826176, 141460112, 132021928, 123266096, 114913464, 105238512, 95279016, 87270512, +79717816, 70102456, 60736744, 54407572, 46471008, 30596274, 10727755, -2694018, -6955163, }, { -148713, -38926900, 55264416, 7113003, -82071992, -162379296, -201008768, -177901296, -80883360, 68788200, 213079232, -305129504, 345367456, 354848576, 334543584, 273673696, 182609664, 91002304, 16658568, -45738180, -106727256, --167042560, -220613680, -262422496, -291595520, -311575712, -327321056, -340128672, -346870688, -345117280, -335773024, --319985792, -297351872, -268227152, -234532064, -197647952, -158186336, -117700896, -78248936, -40883256, -6394133, -23968064, 50220516, 74125768, 96413424, 115648440, 130894496, 143004160, 152630784, 159769024, 165597840, -171820704, 178088672, 182780928, 185774512, 187760944, 188035280, 185756256, 181894016, 177441200, 171699904, -164425840, 157017568, 149826176, 141460112, 132021928, 123266096, 114913464, 105238512, 95279016, 87270512, -79717816, 70102456, 60736744, 54407572, 46471008, 30596274, 10727755, -2694018, -6955163, }, +38926900, 55264416, 7113003, -82071992, -162379296, -201008768, -177901296, -80883360, 68788200, 213079232, +305129504, 345367456, 354848576, 334543584, 273673696, 182609664, 91002304, 16658568, -45738180, -106727256, +-167042560, -220613680, -262422496, -291595520, -311575712, -327321056, -340128672, -346870688, -345117280, -335773024, +-319985792, -297351872, -268227152, -234532064, -197647952, -158186336, -117700896, -78248936, -40883256, -6394133, +23968064, 50220516, 74125768, 96413424, 115648440, 130894496, 143004160, 152630784, 159769024, 165597840, +171820704, 178088672, 182780928, 185774512, 187760944, 188035280, 185756256, 181894016, 177441200, 171699904, +164425840, 157017568, 149826176, 141460112, 132021928, 123266096, 114913464, 105238512, 95279016, 87270512, +79717816, 70102456, 60736744, 54407572, 46471008, 30596274, 10727755, -2694018, -6955163, }, }, }; const Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80] ={ { { -150242784, --386995328, -475354080, -421303008, -292915168, -152560464, -21282636, 102001176, 210548960, 288762464, 326451872, -321788608, 277569792, 203039216, 113307680, 20830054, -68543384, -150520352, -220697424, -278116864, -323314400, --353931616, -368772320, -372753760, -370811904, -361272800, -341630816, -315185088, -286076512, -254237360, -220177200, --187673968, -158032784, -128915592, -100644504, -76050984, -54178328, -32091996, -11112154, 6548752, 23648626, -42909408, 61489436, 77180560, 93131536, 110697416, 126071248, 138471360, 151995136, 166570640, 177748288, -186292064, 196535552, 206622816, 212256752, 216339120, 223023152, 228599104, 229724912, 231484784, 236698864, -239321488, 237591152, 238633744, 242894352, 242224880, 237895024, 239066464, 242346208, 237767248, 231694160, -234890144, 236814832, 225951792, 219453504, 228795600, 217105760, 147807536, 56675852, 7899519, }, +-386995328, -475354080, -421303008, -292915168, -152560464, -21282636, 102001176, 210548960, 288762464, 326451872, +321788608, 277569792, 203039216, 113307680, 20830054, -68543384, -150520352, -220697424, -278116864, -323314400, +-353931616, -368772320, -372753760, -370811904, -361272800, -341630816, -315185088, -286076512, -254237360, -220177200, +-187673968, -158032784, -128915592, -100644504, -76050984, -54178328, -32091996, -11112154, 6548752, 23648626, +42909408, 61489436, 77180560, 93131536, 110697416, 126071248, 138471360, 151995136, 166570640, 177748288, +186292064, 196535552, 206622816, 212256752, 216339120, 223023152, 228599104, 229724912, 231484784, 236698864, +239321488, 237591152, 238633744, 242894352, 242224880, 237895024, 239066464, 242346208, 237767248, 231694160, +234890144, 236814832, 225951792, 219453504, 228795600, 217105760, 147807536, 56675852, 7899519, }, { -150242784, --386995328, -475354080, -421303008, -292915168, -152560464, -21282636, 102001176, 210548960, 288762464, 326451872, -321788608, 277569792, 203039216, 113307680, 20830054, -68543384, -150520352, -220697424, -278116864, -323314400, --353931616, -368772320, -372753760, -370811904, -361272800, -341630816, -315185088, -286076512, -254237360, -220177200, --187673968, -158032784, -128915592, -100644504, -76050984, -54178328, -32091996, -11112154, 6548752, 23648626, -42909408, 61489436, 77180560, 93131536, 110697416, 126071248, 138471360, 151995136, 166570640, 177748288, -186292064, 196535552, 206622816, 212256752, 216339120, 223023152, 228599104, 229724912, 231484784, 236698864, -239321488, 237591152, 238633744, 242894352, 242224880, 237895024, 239066464, 242346208, 237767248, 231694160, -234890144, 236814832, 225951792, 219453504, 228795600, 217105760, 147807536, 56675852, 7899519, }, +-386995328, -475354080, -421303008, -292915168, -152560464, -21282636, 102001176, 210548960, 288762464, 326451872, +321788608, 277569792, 203039216, 113307680, 20830054, -68543384, -150520352, -220697424, -278116864, -323314400, +-353931616, -368772320, -372753760, -370811904, -361272800, -341630816, -315185088, -286076512, -254237360, -220177200, +-187673968, -158032784, -128915592, -100644504, -76050984, -54178328, -32091996, -11112154, 6548752, 23648626, +42909408, 61489436, 77180560, 93131536, 110697416, 126071248, 138471360, 151995136, 166570640, 177748288, +186292064, 196535552, 206622816, 212256752, 216339120, 223023152, 228599104, 229724912, 231484784, 236698864, +239321488, 237591152, 238633744, 242894352, 242224880, 237895024, 239066464, 242346208, 237767248, 231694160, +234890144, 236814832, 225951792, 219453504, 228795600, 217105760, 147807536, 56675852, 7899519, }, }, { { 74029664, -123262344, -36468568, -334473248, -585478144, -638618176, -475035200, -190333616, 97043712, 321375232, 474565440, -565700864, 596585472, 570107008, 498283840, 393476448, 263353440, 118538416, -25469692, -157250560, -272816320, --370608960, -450563552, -515463200, -566206592, -599546816, -615617536, -621153216, -620634560, -612218624, -595934208, --576471616, -555134720, -528948832, -499031712, -469789952, -440383392, -407037280, -371374016, -336737248, -300843136, --261334272, -222230736, -186545456, -150669600, -113003808, -78191488, -47489992, -16384226, 14923401, 41378788, -64410552, 89771792, 115551264, 136379168, 155176624, 176510272, 195635760, 208058416, 219536720, 233740704, -243804896, 247442192, 253084176, 261829792, 264259680, 261447008, 264335904, 269670784, 265524000, 258725072, -262996416, 267509360, 257564896, 252369600, 271103168, 277647072, 221355104, 119831200, 33008972, }, +123262344, -36468568, -334473248, -585478144, -638618176, -475035200, -190333616, 97043712, 321375232, 474565440, +565700864, 596585472, 570107008, 498283840, 393476448, 263353440, 118538416, -25469692, -157250560, -272816320, +-370608960, -450563552, -515463200, -566206592, -599546816, -615617536, -621153216, -620634560, -612218624, -595934208, +-576471616, -555134720, -528948832, -499031712, -469789952, -440383392, -407037280, -371374016, -336737248, -300843136, +-261334272, -222230736, -186545456, -150669600, -113003808, -78191488, -47489992, -16384226, 14923401, 41378788, +64410552, 89771792, 115551264, 136379168, 155176624, 176510272, 195635760, 208058416, 219536720, 233740704, +243804896, 247442192, 253084176, 261829792, 264259680, 261447008, 264335904, 269670784, 265524000, 258725072, +262996416, 267509360, 257564896, 252369600, 271103168, 277647072, 221355104, 119831200, 33008972, }, { -74029664, --123262344, 36468568, 334473248, 585478144, 638618176, 475035200, 190333616, -97043712, -321375232, -474565440, --565700864, -596585472, -570107008, -498283840, -393476448, -263353440, -118538416, 25469692, 157250560, 272816320, -370608960, 450563552, 515463200, 566206592, 599546816, 615617536, 621153216, 620634560, 612218624, 595934208, -576471616, 555134720, 528948832, 499031712, 469789952, 440383392, 407037280, 371374016, 336737248, 300843136, -261334272, 222230736, 186545456, 150669600, 113003808, 78191488, 47489992, 16384226, -14923401, -41378788, --64410552, -89771792, -115551264, -136379168, -155176624, -176510272, -195635760, -208058416, -219536720, -233740704, --243804896, -247442192, -253084176, -261829792, -264259680, -261447008, -264335904, -269670784, -265524000, -258725072, --262996416, -267509360, -257564896, -252369600, -271103168, -277647072, -221355104, -119831200, -33008972, }, +-123262344, 36468568, 334473248, 585478144, 638618176, 475035200, 190333616, -97043712, -321375232, -474565440, +-565700864, -596585472, -570107008, -498283840, -393476448, -263353440, -118538416, 25469692, 157250560, 272816320, +370608960, 450563552, 515463200, 566206592, 599546816, 615617536, 621153216, 620634560, 612218624, 595934208, +576471616, 555134720, 528948832, 499031712, 469789952, 440383392, 407037280, 371374016, 336737248, 300843136, +261334272, 222230736, 186545456, 150669600, 113003808, 78191488, 47489992, 16384226, -14923401, -41378788, +-64410552, -89771792, -115551264, -136379168, -155176624, -176510272, -195635760, -208058416, -219536720, -233740704, +-243804896, -247442192, -253084176, -261829792, -264259680, -261447008, -264335904, -269670784, -265524000, -258725072, +-262996416, -267509360, -257564896, -252369600, -271103168, -277647072, -221355104, -119831200, -33008972, }, }, { { -20371030, --57393648, -71328672, -39834212, 21123186, 58579060, 40715752, -8485782, -43569220, -44861472, -20837570, -13379360, 42582452, 52821120, 44016972, 32712618, 30575872, 28821914, 13238700, -15201500, -44768056, --69100656, -88148296, -99440304, -99179920, -89612344, -77847896, -68340448, -60458644, -51561084, -39687108, --25069724, -10693395, 64961, 6320581, 8561480, 6248641, -579821, -8911520, -15140297, -18519362, --19791746, -18435610, -13812615, -6946573, 1161252, 10977936, 22731652, 35697084, 50230716, 67742368, -87943752, 108973520, 130375344, 152889568, 175663088, 196932304, 216781488, 236027776, 253572720, 267981808, -279923424, 289984384, 296387648, 297804448, 295468512, 289735264, 278325152, 260736192, 239791776, 215955248, -185889936, 150080112, 114561272, 79510584, 34376920, -24792162, -76450416, -84927072, -37017248, }, +-57393648, -71328672, -39834212, 21123186, 58579060, 40715752, -8485782, -43569220, -44861472, -20837570, +13379360, 42582452, 52821120, 44016972, 32712618, 30575872, 28821914, 13238700, -15201500, -44768056, +-69100656, -88148296, -99440304, -99179920, -89612344, -77847896, -68340448, -60458644, -51561084, -39687108, +-25069724, -10693395, 64961, 6320581, 8561480, 6248641, -579821, -8911520, -15140297, -18519362, +-19791746, -18435610, -13812615, -6946573, 1161252, 10977936, 22731652, 35697084, 50230716, 67742368, +87943752, 108973520, 130375344, 152889568, 175663088, 196932304, 216781488, 236027776, 253572720, 267981808, +279923424, 289984384, 296387648, 297804448, 295468512, 289735264, 278325152, 260736192, 239791776, 215955248, +185889936, 150080112, 114561272, 79510584, 34376920, -24792162, -76450416, -84927072, -37017248, }, { -20371030, --57393648, -71328672, -39834212, 21123186, 58579060, 40715752, -8485782, -43569220, -44861472, -20837570, -13379360, 42582452, 52821120, 44016972, 32712618, 30575872, 28821914, 13238700, -15201500, -44768056, --69100656, -88148296, -99440304, -99179920, -89612344, -77847896, -68340448, -60458644, -51561084, -39687108, --25069724, -10693395, 64961, 6320581, 8561480, 6248641, -579821, -8911520, -15140297, -18519362, --19791746, -18435610, -13812615, -6946573, 1161252, 10977936, 22731652, 35697084, 50230716, 67742368, -87943752, 108973520, 130375344, 152889568, 175663088, 196932304, 216781488, 236027776, 253572720, 267981808, -279923424, 289984384, 296387648, 297804448, 295468512, 289735264, 278325152, 260736192, 239791776, 215955248, -185889936, 150080112, 114561272, 79510584, 34376920, -24792162, -76450416, -84927072, -37017248, }, +-57393648, -71328672, -39834212, 21123186, 58579060, 40715752, -8485782, -43569220, -44861472, -20837570, +13379360, 42582452, 52821120, 44016972, 32712618, 30575872, 28821914, 13238700, -15201500, -44768056, +-69100656, -88148296, -99440304, -99179920, -89612344, -77847896, -68340448, -60458644, -51561084, -39687108, +-25069724, -10693395, 64961, 6320581, 8561480, 6248641, -579821, -8911520, -15140297, -18519362, +-19791746, -18435610, -13812615, -6946573, 1161252, 10977936, 22731652, 35697084, 50230716, 67742368, +87943752, 108973520, 130375344, 152889568, 175663088, 196932304, 216781488, 236027776, 253572720, 267981808, +279923424, 289984384, 296387648, 297804448, 295468512, 289735264, 278325152, 260736192, 239791776, 215955248, +185889936, 150080112, 114561272, 79510584, 34376920, -24792162, -76450416, -84927072, -37017248, }, }, { { -721018, --16355772, -48549772, -63205276, -38740068, -514859, 9650792, -15756624, -45094472, -45867568, -14446659, -29004452, 63013612, 79938472, 85708216, 89261232, 92144768, 87597472, 68616936, 35043712, -7224135, --51310364, -92200600, -126849176, -154753040, -178648624, -202140496, -225311296, -244109840, -255003488, -258269808, --255208032, -244579600, -224563440, -196490464, -163644160, -127695280, -89146344, -50016504, -13178570, 20107426, -49838800, 75661216, 97430800, 116016728, 132107824, 145625696, 156951520, 166787008, 174487344, 178700704, -179602640, 178454288, 175783344, 172221216, 169642624, 169055280, 169106288, 168690208, 168543648, 168626864, -167282528, 164463968, 161977712, 159704608, 155989984, 151719712, 148803440, 145611744, 139777024, 133182640, -127603480, 119584240, 107209360, 94890856, 81585592, 55024972, 13564044, -17212618, -12549358, }, +-16355772, -48549772, -63205276, -38740068, -514859, 9650792, -15756624, -45094472, -45867568, -14446659, +29004452, 63013612, 79938472, 85708216, 89261232, 92144768, 87597472, 68616936, 35043712, -7224135, +-51310364, -92200600, -126849176, -154753040, -178648624, -202140496, -225311296, -244109840, -255003488, -258269808, +-255208032, -244579600, -224563440, -196490464, -163644160, -127695280, -89146344, -50016504, -13178570, 20107426, +49838800, 75661216, 97430800, 116016728, 132107824, 145625696, 156951520, 166787008, 174487344, 178700704, +179602640, 178454288, 175783344, 172221216, 169642624, 169055280, 169106288, 168690208, 168543648, 168626864, +167282528, 164463968, 161977712, 159704608, 155989984, 151719712, 148803440, 145611744, 139777024, 133182640, +127603480, 119584240, 107209360, 94890856, 81585592, 55024972, 13564044, -17212618, -12549358, }, { -721018, --16355772, -48549772, -63205276, -38740068, -514859, 9650792, -15756624, -45094472, -45867568, -14446659, -29004452, 63013612, 79938472, 85708216, 89261232, 92144768, 87597472, 68616936, 35043712, -7224135, --51310364, -92200600, -126849176, -154753040, -178648624, -202140496, -225311296, -244109840, -255003488, -258269808, --255208032, -244579600, -224563440, -196490464, -163644160, -127695280, -89146344, -50016504, -13178570, 20107426, -49838800, 75661216, 97430800, 116016728, 132107824, 145625696, 156951520, 166787008, 174487344, 178700704, -179602640, 178454288, 175783344, 172221216, 169642624, 169055280, 169106288, 168690208, 168543648, 168626864, -167282528, 164463968, 161977712, 159704608, 155989984, 151719712, 148803440, 145611744, 139777024, 133182640, -127603480, 119584240, 107209360, 94890856, 81585592, 55024972, 13564044, -17212618, -12549358, }, +-16355772, -48549772, -63205276, -38740068, -514859, 9650792, -15756624, -45094472, -45867568, -14446659, +29004452, 63013612, 79938472, 85708216, 89261232, 92144768, 87597472, 68616936, 35043712, -7224135, +-51310364, -92200600, -126849176, -154753040, -178648624, -202140496, -225311296, -244109840, -255003488, -258269808, +-255208032, -244579600, -224563440, -196490464, -163644160, -127695280, -89146344, -50016504, -13178570, 20107426, +49838800, 75661216, 97430800, 116016728, 132107824, 145625696, 156951520, 166787008, 174487344, 178700704, +179602640, 178454288, 175783344, 172221216, 169642624, 169055280, 169106288, 168690208, 168543648, 168626864, +167282528, 164463968, 161977712, 159704608, 155989984, 151719712, 148803440, 145611744, 139777024, 133182640, +127603480, 119584240, 107209360, 94890856, 81585592, 55024972, 13564044, -17212618, -12549358, }, }, { { -2051921, --2245194, 2023467, 1197759, -9941776, -22747758, -27280558, -29560112, -44152800, -68251864, -75788992, --45372572, 13457743, 70434776, 105979392, 123585536, 134480800, 141224960, 139040432, 125328760, 101947488, -70818104, 32322314, -11746199, -57064548, -100129112, -140690784, -179227904, -213805088, -241569360, -261852352, --275380960, -281725152, -279901952, -270098144, -252496288, -226240080, -192179920, -154821760, -119033944, -86504400, --57167624, -31504122, -9376987, 10785200, 29796336, 46982648, 62418224, 77075872, 90415504, 100867840, -108550464, 114552144, 118527672, 120150096, 121297392, 123652112, 126288144, 128381408, 131267624, 135355888, -138809584, 141280272, 144532096, 148162416, 149919584, 150498336, 152006416, 152676416, 149898656, 145910784, -142762032, 136395808, 124553512, 112371376, 98595808, 68726456, 20487530, -16538308, -13313862, }, +-2245194, 2023467, 1197759, -9941776, -22747758, -27280558, -29560112, -44152800, -68251864, -75788992, +-45372572, 13457743, 70434776, 105979392, 123585536, 134480800, 141224960, 139040432, 125328760, 101947488, +70818104, 32322314, -11746199, -57064548, -100129112, -140690784, -179227904, -213805088, -241569360, -261852352, +-275380960, -281725152, -279901952, -270098144, -252496288, -226240080, -192179920, -154821760, -119033944, -86504400, +-57167624, -31504122, -9376987, 10785200, 29796336, 46982648, 62418224, 77075872, 90415504, 100867840, +108550464, 114552144, 118527672, 120150096, 121297392, 123652112, 126288144, 128381408, 131267624, 135355888, +138809584, 141280272, 144532096, 148162416, 149919584, 150498336, 152006416, 152676416, 149898656, 145910784, +142762032, 136395808, 124553512, 112371376, 98595808, 68726456, 20487530, -16538308, -13313862, }, { 2051921, -2245194, -2023467, -1197759, 9941776, 22747758, 27280558, 29560112, 44152800, 68251864, 75788992, -45372572, -13457743, -70434776, -105979392, -123585536, -134480800, -141224960, -139040432, -125328760, -101947488, --70818104, -32322314, 11746199, 57064548, 100129112, 140690784, 179227904, 213805088, 241569360, 261852352, -275380960, 281725152, 279901952, 270098144, 252496288, 226240080, 192179920, 154821760, 119033944, 86504400, -57167624, 31504122, 9376987, -10785200, -29796336, -46982648, -62418224, -77075872, -90415504, -100867840, --108550464, -114552144, -118527672, -120150096, -121297392, -123652112, -126288144, -128381408, -131267624, -135355888, --138809584, -141280272, -144532096, -148162416, -149919584, -150498336, -152006416, -152676416, -149898656, -145910784, --142762032, -136395808, -124553512, -112371376, -98595808, -68726456, -20487530, 16538308, 13313862, }, +2245194, -2023467, -1197759, 9941776, 22747758, 27280558, 29560112, 44152800, 68251864, 75788992, +45372572, -13457743, -70434776, -105979392, -123585536, -134480800, -141224960, -139040432, -125328760, -101947488, +-70818104, -32322314, 11746199, 57064548, 100129112, 140690784, 179227904, 213805088, 241569360, 261852352, +275380960, 281725152, 279901952, 270098144, 252496288, 226240080, 192179920, 154821760, 119033944, 86504400, +57167624, 31504122, 9376987, -10785200, -29796336, -46982648, -62418224, -77075872, -90415504, -100867840, +-108550464, -114552144, -118527672, -120150096, -121297392, -123652112, -126288144, -128381408, -131267624, -135355888, +-138809584, -141280272, -144532096, -148162416, -149919584, -150498336, -152006416, -152676416, -149898656, -145910784, +-142762032, -136395808, -124553512, -112371376, -98595808, -68726456, -20487530, 16538308, 13313862, }, }, { { -3833795, --144418, 10765872, 2765422, -11487427, 9198746, 51580948, 42736000, -43378096, -130186904, -128332552, --42242076, 50558744, 96583616, 103735808, 100252056, 96642672, 88947160, 73382736, 49586472, 19973208, --9914932, -34335044, -50814296, -59253368, -60146184, -55480776, -48753248, -42253888, -36046048, -30475478, --27751932, -29727616, -35259536, -41327248, -46785616, -53705880, -64280092, -77505904, -90120224, -99746320, --105634720, -107579264, -106121664, -102978280, -99567544, -95905008, -91781840, -87356952, -81819128, -73615200, --62632436, -49852760, -34813396, -16184511, 5441187, 28271622, 51984672, 76691472, 100694968, 122358248, -142214960, 160475552, 175245408, 185673040, 193137168, 197190000, 195082240, 186992144, 175870864, 160953904, -138726368, 111200464, 84099752, 55515136, 17514876, -26816166, -57793080, -56541096, -23185308, }, +-144418, 10765872, 2765422, -11487427, 9198746, 51580948, 42736000, -43378096, -130186904, -128332552, +-42242076, 50558744, 96583616, 103735808, 100252056, 96642672, 88947160, 73382736, 49586472, 19973208, +-9914932, -34335044, -50814296, -59253368, -60146184, -55480776, -48753248, -42253888, -36046048, -30475478, +-27751932, -29727616, -35259536, -41327248, -46785616, -53705880, -64280092, -77505904, -90120224, -99746320, +-105634720, -107579264, -106121664, -102978280, -99567544, -95905008, -91781840, -87356952, -81819128, -73615200, +-62632436, -49852760, -34813396, -16184511, 5441187, 28271622, 51984672, 76691472, 100694968, 122358248, +142214960, 160475552, 175245408, 185673040, 193137168, 197190000, 195082240, 186992144, 175870864, 160953904, +138726368, 111200464, 84099752, 55515136, 17514876, -26816166, -57793080, -56541096, -23185308, }, { 3833795, -144418, -10765872, -2765422, 11487427, -9198746, -51580948, -42736000, 43378096, 130186904, 128332552, -42242076, -50558744, -96583616, -103735808, -100252056, -96642672, -88947160, -73382736, -49586472, -19973208, -9914932, 34335044, 50814296, 59253368, 60146184, 55480776, 48753248, 42253888, 36046048, 30475478, -27751932, 29727616, 35259536, 41327248, 46785616, 53705880, 64280092, 77505904, 90120224, 99746320, -105634720, 107579264, 106121664, 102978280, 99567544, 95905008, 91781840, 87356952, 81819128, 73615200, -62632436, 49852760, 34813396, 16184511, -5441187, -28271622, -51984672, -76691472, -100694968, -122358248, --142214960, -160475552, -175245408, -185673040, -193137168, -197190000, -195082240, -186992144, -175870864, -160953904, --138726368, -111200464, -84099752, -55515136, -17514876, 26816166, 57793080, 56541096, 23185308, }, +144418, -10765872, -2765422, 11487427, -9198746, -51580948, -42736000, 43378096, 130186904, 128332552, +42242076, -50558744, -96583616, -103735808, -100252056, -96642672, -88947160, -73382736, -49586472, -19973208, +9914932, 34335044, 50814296, 59253368, 60146184, 55480776, 48753248, 42253888, 36046048, 30475478, +27751932, 29727616, 35259536, 41327248, 46785616, 53705880, 64280092, 77505904, 90120224, 99746320, +105634720, 107579264, 106121664, 102978280, 99567544, 95905008, 91781840, 87356952, 81819128, 73615200, +62632436, 49852760, 34813396, 16184511, -5441187, -28271622, -51984672, -76691472, -100694968, -122358248, +-142214960, -160475552, -175245408, -185673040, -193137168, -197190000, -195082240, -186992144, -175870864, -160953904, +-138726368, -111200464, -84099752, -55515136, -17514876, 26816166, 57793080, 56541096, 23185308, }, }, { { -573378, --6264747, -14272713, -10745471, 5682779, 21516712, 35712652, 66712116, 118752088, 158329136, 143282800, -69283728, -26658862, -104909408, -152286656, -175110656, -180047184, -170008768, -150282512, -127980896, -105768936, --81764904, -55362128, -28752658, -3396782, 20049444, 38305740, 47199544, 48008072, 47788492, 52076480, -60621852, 70771936, 81123344, 90956672, 99496672, 106806176, 113260432, 118105696, 120241368, 119555248, -116121960, 109772920, 101717712, 94278288, 87892744, 80907520, 72868416, 64984464, 57250304, 48546016, -39359080, 30993558, 22948548, 14470819, 7118372, 2479807, -396748, -2342905, -2013266, 912681, -4436701, 8243116, 14269492, 22054120, 29117730, 36207648, 45651208, 55477020, 62553516, 68924024, -76705432, 81624776, 81155552, 80529024, 78124920, 57773216, 15537581, -18662170, -13961865, }, +-6264747, -14272713, -10745471, 5682779, 21516712, 35712652, 66712116, 118752088, 158329136, 143282800, +69283728, -26658862, -104909408, -152286656, -175110656, -180047184, -170008768, -150282512, -127980896, -105768936, +-81764904, -55362128, -28752658, -3396782, 20049444, 38305740, 47199544, 48008072, 47788492, 52076480, +60621852, 70771936, 81123344, 90956672, 99496672, 106806176, 113260432, 118105696, 120241368, 119555248, +116121960, 109772920, 101717712, 94278288, 87892744, 80907520, 72868416, 64984464, 57250304, 48546016, +39359080, 30993558, 22948548, 14470819, 7118372, 2479807, -396748, -2342905, -2013266, 912681, +4436701, 8243116, 14269492, 22054120, 29117730, 36207648, 45651208, 55477020, 62553516, 68924024, +76705432, 81624776, 81155552, 80529024, 78124920, 57773216, 15537581, -18662170, -13961865, }, { -573378, --6264747, -14272713, -10745471, 5682779, 21516712, 35712652, 66712116, 118752088, 158329136, 143282800, -69283728, -26658862, -104909408, -152286656, -175110656, -180047184, -170008768, -150282512, -127980896, -105768936, --81764904, -55362128, -28752658, -3396782, 20049444, 38305740, 47199544, 48008072, 47788492, 52076480, -60621852, 70771936, 81123344, 90956672, 99496672, 106806176, 113260432, 118105696, 120241368, 119555248, -116121960, 109772920, 101717712, 94278288, 87892744, 80907520, 72868416, 64984464, 57250304, 48546016, -39359080, 30993558, 22948548, 14470819, 7118372, 2479807, -396748, -2342905, -2013266, 912681, -4436701, 8243116, 14269492, 22054120, 29117730, 36207648, 45651208, 55477020, 62553516, 68924024, -76705432, 81624776, 81155552, 80529024, 78124920, 57773216, 15537581, -18662170, -13961865, }, +-6264747, -14272713, -10745471, 5682779, 21516712, 35712652, 66712116, 118752088, 158329136, 143282800, +69283728, -26658862, -104909408, -152286656, -175110656, -180047184, -170008768, -150282512, -127980896, -105768936, +-81764904, -55362128, -28752658, -3396782, 20049444, 38305740, 47199544, 48008072, 47788492, 52076480, +60621852, 70771936, 81123344, 90956672, 99496672, 106806176, 113260432, 118105696, 120241368, 119555248, +116121960, 109772920, 101717712, 94278288, 87892744, 80907520, 72868416, 64984464, 57250304, 48546016, +39359080, 30993558, 22948548, 14470819, 7118372, 2479807, -396748, -2342905, -2013266, 912681, +4436701, 8243116, 14269492, 22054120, 29117730, 36207648, 45651208, 55477020, 62553516, 68924024, +76705432, 81624776, 81155552, 80529024, 78124920, 57773216, 15537581, -18662170, -13961865, }, }, { { -20308752, --40316860, -13951128, 46215460, 91573000, 73531984, -8588861, -96410744, -122033440, -73396160, -1735167, -37586332, 37263136, 25230786, 19996294, 18992346, 19787988, 26591754, 35009352, 32031330, 16721381, -4603131, 5762236, 12380243, 13429289, 8958765, 3470871, -4042638, -16344498, -31551366, -45719388, --56838524, -64023468, -67703720, -71378064, -78357920, -86946248, -92844848, -94548336, -92495880, -85982024, --75213464, -63250908, -52242372, -41119480, -29488172, -19435264, -11538967, -3883187, 3729642, 9561671, -14200236, 19799800, 25705380, 30043834, 33976412, 39186208, 43818332, 45879916, 47028280, 48526152, -48228724, 45480484, 43227236, 42264088, 40182104, 37747932, 38270308, 40305048, 40321152, 41117868, -46702400, 52560200, 54000088, 57706644, 68199248, 70951248, 50789064, 20022064, 2858838, }, +-40316860, -13951128, 46215460, 91573000, 73531984, -8588861, -96410744, -122033440, -73396160, -1735167, +37586332, 37263136, 25230786, 19996294, 18992346, 19787988, 26591754, 35009352, 32031330, 16721381, +4603131, 5762236, 12380243, 13429289, 8958765, 3470871, -4042638, -16344498, -31551366, -45719388, +-56838524, -64023468, -67703720, -71378064, -78357920, -86946248, -92844848, -94548336, -92495880, -85982024, +-75213464, -63250908, -52242372, -41119480, -29488172, -19435264, -11538967, -3883187, 3729642, 9561671, +14200236, 19799800, 25705380, 30043834, 33976412, 39186208, 43818332, 45879916, 47028280, 48526152, +48228724, 45480484, 43227236, 42264088, 40182104, 37747932, 38270308, 40305048, 40321152, 41117868, +46702400, 52560200, 54000088, 57706644, 68199248, 70951248, 50789064, 20022064, 2858838, }, { -20308752, --40316860, -13951128, 46215460, 91573000, 73531984, -8588861, -96410744, -122033440, -73396160, -1735167, -37586332, 37263136, 25230786, 19996294, 18992346, 19787988, 26591754, 35009352, 32031330, 16721381, -4603131, 5762236, 12380243, 13429289, 8958765, 3470871, -4042638, -16344498, -31551366, -45719388, --56838524, -64023468, -67703720, -71378064, -78357920, -86946248, -92844848, -94548336, -92495880, -85982024, --75213464, -63250908, -52242372, -41119480, -29488172, -19435264, -11538967, -3883187, 3729642, 9561671, -14200236, 19799800, 25705380, 30043834, 33976412, 39186208, 43818332, 45879916, 47028280, 48526152, -48228724, 45480484, 43227236, 42264088, 40182104, 37747932, 38270308, 40305048, 40321152, 41117868, -46702400, 52560200, 54000088, 57706644, 68199248, 70951248, 50789064, 20022064, 2858838, }, +-40316860, -13951128, 46215460, 91573000, 73531984, -8588861, -96410744, -122033440, -73396160, -1735167, +37586332, 37263136, 25230786, 19996294, 18992346, 19787988, 26591754, 35009352, 32031330, 16721381, +4603131, 5762236, 12380243, 13429289, 8958765, 3470871, -4042638, -16344498, -31551366, -45719388, +-56838524, -64023468, -67703720, -71378064, -78357920, -86946248, -92844848, -94548336, -92495880, -85982024, +-75213464, -63250908, -52242372, -41119480, -29488172, -19435264, -11538967, -3883187, 3729642, 9561671, +14200236, 19799800, 25705380, 30043834, 33976412, 39186208, 43818332, 45879916, 47028280, 48526152, +48228724, 45480484, 43227236, 42264088, 40182104, 37747932, 38270308, 40305048, 40321152, 41117868, +46702400, 52560200, 54000088, 57706644, 68199248, 70951248, 50789064, 20022064, 2858838, }, }, { { 14657113, -11670500, -44009992, -102688912, -108263240, -50097036, 52770652, 175993808, 280796384, 317618208, 268177216, -165755680, 54485956, -53506164, -163560400, -262813344, -325818912, -347082752, -345586496, -338761248, -327312480, --304706976, -269174176, -224736304, -177553408, -132315056, -88971320, -43842488, 4690105, 54058068, 101572752, -146826144, 189182032, 226574016, 257752800, 282824128, 301369792, 312586112, 316927776, 315509920, 308942368, -298435808, 286237024, 273256032, 258277856, 240819888, 222455152, 204482320, 186932016, 170351280, 155632976, -141848816, 127101504, 111341656, 95715496, 80057656, 63812476, 48059612, 33942052, 20797306, 8108362, --3027415, -12296491, -21097954, -29569240, -36134096, -40969156, -45819248, -50071804, -51808580, -52351356, --54154168, -55454472, -53721452, -52272436, -55008332, -56615184, -47854524, -29224568, -9227200, }, +11670500, -44009992, -102688912, -108263240, -50097036, 52770652, 175993808, 280796384, 317618208, 268177216, +165755680, 54485956, -53506164, -163560400, -262813344, -325818912, -347082752, -345586496, -338761248, -327312480, +-304706976, -269174176, -224736304, -177553408, -132315056, -88971320, -43842488, 4690105, 54058068, 101572752, +146826144, 189182032, 226574016, 257752800, 282824128, 301369792, 312586112, 316927776, 315509920, 308942368, +298435808, 286237024, 273256032, 258277856, 240819888, 222455152, 204482320, 186932016, 170351280, 155632976, +141848816, 127101504, 111341656, 95715496, 80057656, 63812476, 48059612, 33942052, 20797306, 8108362, +-3027415, -12296491, -21097954, -29569240, -36134096, -40969156, -45819248, -50071804, -51808580, -52351356, +-54154168, -55454472, -53721452, -52272436, -55008332, -56615184, -47854524, -29224568, -9227200, }, { 14657113, -11670500, -44009992, -102688912, -108263240, -50097036, 52770652, 175993808, 280796384, 317618208, 268177216, -165755680, 54485956, -53506164, -163560400, -262813344, -325818912, -347082752, -345586496, -338761248, -327312480, --304706976, -269174176, -224736304, -177553408, -132315056, -88971320, -43842488, 4690105, 54058068, 101572752, -146826144, 189182032, 226574016, 257752800, 282824128, 301369792, 312586112, 316927776, 315509920, 308942368, -298435808, 286237024, 273256032, 258277856, 240819888, 222455152, 204482320, 186932016, 170351280, 155632976, -141848816, 127101504, 111341656, 95715496, 80057656, 63812476, 48059612, 33942052, 20797306, 8108362, --3027415, -12296491, -21097954, -29569240, -36134096, -40969156, -45819248, -50071804, -51808580, -52351356, --54154168, -55454472, -53721452, -52272436, -55008332, -56615184, -47854524, -29224568, -9227200, }, +11670500, -44009992, -102688912, -108263240, -50097036, 52770652, 175993808, 280796384, 317618208, 268177216, +165755680, 54485956, -53506164, -163560400, -262813344, -325818912, -347082752, -345586496, -338761248, -327312480, +-304706976, -269174176, -224736304, -177553408, -132315056, -88971320, -43842488, 4690105, 54058068, 101572752, +146826144, 189182032, 226574016, 257752800, 282824128, 301369792, 312586112, 316927776, 315509920, 308942368, +298435808, 286237024, 273256032, 258277856, 240819888, 222455152, 204482320, 186932016, 170351280, 155632976, +141848816, 127101504, 111341656, 95715496, 80057656, 63812476, 48059612, 33942052, 20797306, 8108362, +-3027415, -12296491, -21097954, -29569240, -36134096, -40969156, -45819248, -50071804, -51808580, -52351356, +-54154168, -55454472, -53721452, -52272436, -55008332, -56615184, -47854524, -29224568, -9227200, }, }, }; const Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240] ={ { { 518734336, - 393704608, 199261792, 7454990, -137047568, -230714912, -291816192, -333582048, -354289696, -345745408, -304985632, - -237554112, -153483344, -62846108, 25924960, 106383656, 174758464, 230512512, 275441632, 311386208, 338533632, - 356124736, 364643264, 366513184, 364196576, 358214784, 347733440, 332698912, 314550528, 294970304, 274820448, - 254486480, 234499840, 215327648, 196919952, 178905792, 161172400, 144017232, 127764536, 112381576, 97512400, - 82796232, 68108520, 53500796, 39045548, 24810416, 10904385, -2594697, -15731928, -28598576, -41189812, - -53421876, -65249144, -76661408, -87611968, -98029944, -107895488, -117252608, -126151776, -134618768, -142656800, - -150280912, -157536720, -164452144, -170977824, -177055200, -182730992, -188127088, -193307888, -198289520, -203156784, - -208030496, -212934816, -217845040, -222834720, -228031632, -233469584, -239137344, -245106272, -251453696, -258109824, - -264947408, -271934240, -279045632, -286107648, -292885632, -299275456, -305308832, -311048512, -316541760, -321774112, - -326614016, -330890720, -334563456, -337721856, -340449696, -342790464, -344823072, -346637152, -348259584, -349701056, - -351036256, -352379520, -353825856, -355444512, -357255904, -359210656, -361293728, -363633408, -366375200, -369470816, - -372702752, -375887488, -378943904, -381830656, -384545056, -387131712, -389604544, -391920064, -394076672, -396146304, - -398176224, -400158336, -402088928, -403956160, -405682208, -407207456, -408578080, -409852096, -410993472, -411950176, - -412744736, -413410464, -413956992, -414451456, -415008736, -415649760, -416303648, -416950048, -417620608, -418300832, - -418970304, -419683264, -420468160, -421242336, -421935968, -422575936, -423158976, -423617472, -423979296, -424366944, - -424799104, -425193696, -425563072, -425980224, -426386112, -426662048, -426816128, -426899360, -426870880, -426727008, - -426590112, -426518176, -426442464, -426383424, -426451584, -426590112, -426624480, -426572384, -426569696, -426569696, - -426460736, -426345312, -426347456, -426357632, -426271744, -426204640, -426201408, -426114976, -425975392, -426027456, - -426272832, -426502048, -426786592, -427343328, -428008000, -428506208, -429004960, -429715776, -430357344, -430720256, - -431144384, -431780032, -432186464, -432283616, -432612192, -433128128, -433130816, -432782368, -432935392, -433196320, - -432360928, -430898496, -430319200, -430133984, -428731680, -427129664, -427792160, -429743168, -429505312, -426881632, - -424250976, -419948480, -409561088, -395892384, -390180064, -398706656, -413332608, -420260928, -415048448, -404883360, - -398317408, -396604800, -395113920, -391861536, -393665952, -410828640, -443115008, -474512832, -487703744, -482296384, - -472652032, -468896064, -468109568, -465181472, -462957760, -466247168, -472453920, -475371264, -474698048, }, + 393704608, 199261792, 7454990, -137047568, -230714912, -291816192, -333582048, -354289696, -345745408, -304985632, + -237554112, -153483344, -62846108, 25924960, 106383656, 174758464, 230512512, 275441632, 311386208, 338533632, + 356124736, 364643264, 366513184, 364196576, 358214784, 347733440, 332698912, 314550528, 294970304, 274820448, + 254486480, 234499840, 215327648, 196919952, 178905792, 161172400, 144017232, 127764536, 112381576, 97512400, + 82796232, 68108520, 53500796, 39045548, 24810416, 10904385, -2594697, -15731928, -28598576, -41189812, + -53421876, -65249144, -76661408, -87611968, -98029944, -107895488, -117252608, -126151776, -134618768, -142656800, + -150280912, -157536720, -164452144, -170977824, -177055200, -182730992, -188127088, -193307888, -198289520, -203156784, + -208030496, -212934816, -217845040, -222834720, -228031632, -233469584, -239137344, -245106272, -251453696, -258109824, + -264947408, -271934240, -279045632, -286107648, -292885632, -299275456, -305308832, -311048512, -316541760, -321774112, + -326614016, -330890720, -334563456, -337721856, -340449696, -342790464, -344823072, -346637152, -348259584, -349701056, + -351036256, -352379520, -353825856, -355444512, -357255904, -359210656, -361293728, -363633408, -366375200, -369470816, + -372702752, -375887488, -378943904, -381830656, -384545056, -387131712, -389604544, -391920064, -394076672, -396146304, + -398176224, -400158336, -402088928, -403956160, -405682208, -407207456, -408578080, -409852096, -410993472, -411950176, + -412744736, -413410464, -413956992, -414451456, -415008736, -415649760, -416303648, -416950048, -417620608, -418300832, + -418970304, -419683264, -420468160, -421242336, -421935968, -422575936, -423158976, -423617472, -423979296, -424366944, + -424799104, -425193696, -425563072, -425980224, -426386112, -426662048, -426816128, -426899360, -426870880, -426727008, + -426590112, -426518176, -426442464, -426383424, -426451584, -426590112, -426624480, -426572384, -426569696, -426569696, + -426460736, -426345312, -426347456, -426357632, -426271744, -426204640, -426201408, -426114976, -425975392, -426027456, + -426272832, -426502048, -426786592, -427343328, -428008000, -428506208, -429004960, -429715776, -430357344, -430720256, + -431144384, -431780032, -432186464, -432283616, -432612192, -433128128, -433130816, -432782368, -432935392, -433196320, + -432360928, -430898496, -430319200, -430133984, -428731680, -427129664, -427792160, -429743168, -429505312, -426881632, + -424250976, -419948480, -409561088, -395892384, -390180064, -398706656, -413332608, -420260928, -415048448, -404883360, + -398317408, -396604800, -395113920, -391861536, -393665952, -410828640, -443115008, -474512832, -487703744, -482296384, + -472652032, -468896064, -468109568, -465181472, -462957760, -466247168, -472453920, -475371264, -474698048, }, { 518734336, - 393704608, 199261792, 7454990, -137047568, -230714912, -291816192, -333582048, -354289696, -345745408, -304985632, - -237554112, -153483344, -62846108, 25924960, 106383656, 174758464, 230512512, 275441632, 311386208, 338533632, - 356124736, 364643264, 366513184, 364196576, 358214784, 347733440, 332698912, 314550528, 294970304, 274820448, - 254486480, 234499840, 215327648, 196919952, 178905792, 161172400, 144017232, 127764536, 112381576, 97512400, - 82796232, 68108520, 53500796, 39045548, 24810416, 10904385, -2594697, -15731928, -28598576, -41189812, - -53421876, -65249144, -76661408, -87611968, -98029944, -107895488, -117252608, -126151776, -134618768, -142656800, - -150280912, -157536720, -164452144, -170977824, -177055200, -182730992, -188127088, -193307888, -198289520, -203156784, - -208030496, -212934816, -217845040, -222834720, -228031632, -233469584, -239137344, -245106272, -251453696, -258109824, - -264947408, -271934240, -279045632, -286107648, -292885632, -299275456, -305308832, -311048512, -316541760, -321774112, - -326614016, -330890720, -334563456, -337721856, -340449696, -342790464, -344823072, -346637152, -348259584, -349701056, - -351036256, -352379520, -353825856, -355444512, -357255904, -359210656, -361293728, -363633408, -366375200, -369470816, - -372702752, -375887488, -378943904, -381830656, -384545056, -387131712, -389604544, -391920064, -394076672, -396146304, - -398176224, -400158336, -402088928, -403956160, -405682208, -407207456, -408578080, -409852096, -410993472, -411950176, - -412744736, -413410464, -413956992, -414451456, -415008736, -415649760, -416303648, -416950048, -417620608, -418300832, - -418970304, -419683264, -420468160, -421242336, -421935968, -422575936, -423158976, -423617472, -423979296, -424366944, - -424799104, -425193696, -425563072, -425980224, -426386112, -426662048, -426816128, -426899360, -426870880, -426727008, - -426590112, -426518176, -426442464, -426383424, -426451584, -426590112, -426624480, -426572384, -426569696, -426569696, - -426460736, -426345312, -426347456, -426357632, -426271744, -426204640, -426201408, -426114976, -425975392, -426027456, - -426272832, -426502048, -426786592, -427343328, -428008000, -428506208, -429004960, -429715776, -430357344, -430720256, - -431144384, -431780032, -432186464, -432283616, -432612192, -433128128, -433130816, -432782368, -432935392, -433196320, - -432360928, -430898496, -430319200, -430133984, -428731680, -427129664, -427792160, -429743168, -429505312, -426881632, - -424250976, -419948480, -409561088, -395892384, -390180064, -398706656, -413332608, -420260928, -415048448, -404883360, - -398317408, -396604800, -395113920, -391861536, -393665952, -410828640, -443115008, -474512832, -487703744, -482296384, - -472652032, -468896064, -468109568, -465181472, -462957760, -466247168, -472453920, -475371264, -474698048, }, + 393704608, 199261792, 7454990, -137047568, -230714912, -291816192, -333582048, -354289696, -345745408, -304985632, + -237554112, -153483344, -62846108, 25924960, 106383656, 174758464, 230512512, 275441632, 311386208, 338533632, + 356124736, 364643264, 366513184, 364196576, 358214784, 347733440, 332698912, 314550528, 294970304, 274820448, + 254486480, 234499840, 215327648, 196919952, 178905792, 161172400, 144017232, 127764536, 112381576, 97512400, + 82796232, 68108520, 53500796, 39045548, 24810416, 10904385, -2594697, -15731928, -28598576, -41189812, + -53421876, -65249144, -76661408, -87611968, -98029944, -107895488, -117252608, -126151776, -134618768, -142656800, + -150280912, -157536720, -164452144, -170977824, -177055200, -182730992, -188127088, -193307888, -198289520, -203156784, + -208030496, -212934816, -217845040, -222834720, -228031632, -233469584, -239137344, -245106272, -251453696, -258109824, + -264947408, -271934240, -279045632, -286107648, -292885632, -299275456, -305308832, -311048512, -316541760, -321774112, + -326614016, -330890720, -334563456, -337721856, -340449696, -342790464, -344823072, -346637152, -348259584, -349701056, + -351036256, -352379520, -353825856, -355444512, -357255904, -359210656, -361293728, -363633408, -366375200, -369470816, + -372702752, -375887488, -378943904, -381830656, -384545056, -387131712, -389604544, -391920064, -394076672, -396146304, + -398176224, -400158336, -402088928, -403956160, -405682208, -407207456, -408578080, -409852096, -410993472, -411950176, + -412744736, -413410464, -413956992, -414451456, -415008736, -415649760, -416303648, -416950048, -417620608, -418300832, + -418970304, -419683264, -420468160, -421242336, -421935968, -422575936, -423158976, -423617472, -423979296, -424366944, + -424799104, -425193696, -425563072, -425980224, -426386112, -426662048, -426816128, -426899360, -426870880, -426727008, + -426590112, -426518176, -426442464, -426383424, -426451584, -426590112, -426624480, -426572384, -426569696, -426569696, + -426460736, -426345312, -426347456, -426357632, -426271744, -426204640, -426201408, -426114976, -425975392, -426027456, + -426272832, -426502048, -426786592, -427343328, -428008000, -428506208, -429004960, -429715776, -430357344, -430720256, + -431144384, -431780032, -432186464, -432283616, -432612192, -433128128, -433130816, -432782368, -432935392, -433196320, + -432360928, -430898496, -430319200, -430133984, -428731680, -427129664, -427792160, -429743168, -429505312, -426881632, + -424250976, -419948480, -409561088, -395892384, -390180064, -398706656, -413332608, -420260928, -415048448, -404883360, + -398317408, -396604800, -395113920, -391861536, -393665952, -410828640, -443115008, -474512832, -487703744, -482296384, + -472652032, -468896064, -468109568, -465181472, -462957760, -466247168, -472453920, -475371264, -474698048, }, }, { { 37328636, - 189374768, 383476160, 475285376, 383028416, 133840848, -171073376, -432745888, -603796160, -683916096, -690635008, - -641510272, -552180864, -436797088, -306463104, -169717248, -34593816, 91378648, 202743392, 296894976, 374149632, - 437277600, 489349248, 531198880, 561826816, 581349568, 592261504, 597636096, 599314368, 598031232, 594031552, - 587127936, 577005760, 563930304, 548784640, 532358496, 514886592, 496108448, 475500672, 452722304, 428125568, - 402665536, 377180800, 352018208, 327308192, 303174240, 279620640, 256611408, 234338784, 213113056, 192994352, - 173741088, 155053152, 136726528, 118736520, 101311840, 84780504, 69293928, 54891828, 41746544, 30001958, - 19447076, 9730248, 790811, -7295002, -14765024, -22013318, -29103772, -35866736, -42364484, -48842368, - -55338508, -61733712, -68128920, -74811888, -81897512, -89285928, -96952984, -105030744, -113582560, -122484952, - -131581152, -140860432, -150426928, -160311264, -170375984, -180435872, -190413088, -200370432, -210518896, -221234832, - -232860784, -245344096, -258222016, -271105856, -283991296, -296971232, -309841088, -322147776, -333463936, -343533504, - -352343008, -360091680, -366892736, -372482656, -376434560, -378663104, -379509216, -379385728, -378569152, -377280672, - -375758624, -374254848, -373029728, -372255552, -371887264, -371805120, -372115424, -373099520, -374873888, -377288192, - -380094400, -382999936, -385673568, -387967072, -390036704, -392070400, -394039616, -395879488, -397664032, -399435168, - -401066208, -402452384, -403620640, -404609536, -405454592, -406308736, -407351328, -408589888, -409931008, -411351552, - -412853184, -414413888, -416115744, -418142976, -420566432, -423312512, -426339392, -429601952, -432933248, -436230176, - -439630176, -443259968, -447025024, -450868480, -454913280, -459126624, -463203648, -466963872, -470473408, -473698400, - -476477216, -478859872, -481021312, -482905728, -484371392, -485500416, -486368000, -486850656, -486995072, -487141088, - -487406848, -487615168, -487850304, -488395776, -489068448, -489370720, -489218784, -488805920, -488051104, -486929568, - -485842944, -484988256, -484049792, -483024384, -482375296, -482025248, -481413216, -480660000, -480307264, -480132256, - -479703296, -479427328, -479558880, -479476192, -479256064, -479838592, -480622400, -480185920, -479861120, -481702592, - -483188640, -481178592, -480039360, -485045696, -488822048, -479682880, -464048672, -461323520, -473385376, -481892096, - -481580192, -489001888, -506634336, -507556160, -475460384, -435317472, -421685248, -435285280, -450985536, -452022752, - -439289248, -422705856, -415015712, -414360736, -386421952, -295605952, -168432512, -90038080, -111629424, -189907888, - -245691456, -256092800, -255994016, -268771552, -274996032, -247346624, -187443104, -122430728, -81640352, }, + 189374768, 383476160, 475285376, 383028416, 133840848, -171073376, -432745888, -603796160, -683916096, -690635008, + -641510272, -552180864, -436797088, -306463104, -169717248, -34593816, 91378648, 202743392, 296894976, 374149632, + 437277600, 489349248, 531198880, 561826816, 581349568, 592261504, 597636096, 599314368, 598031232, 594031552, + 587127936, 577005760, 563930304, 548784640, 532358496, 514886592, 496108448, 475500672, 452722304, 428125568, + 402665536, 377180800, 352018208, 327308192, 303174240, 279620640, 256611408, 234338784, 213113056, 192994352, + 173741088, 155053152, 136726528, 118736520, 101311840, 84780504, 69293928, 54891828, 41746544, 30001958, + 19447076, 9730248, 790811, -7295002, -14765024, -22013318, -29103772, -35866736, -42364484, -48842368, + -55338508, -61733712, -68128920, -74811888, -81897512, -89285928, -96952984, -105030744, -113582560, -122484952, + -131581152, -140860432, -150426928, -160311264, -170375984, -180435872, -190413088, -200370432, -210518896, -221234832, + -232860784, -245344096, -258222016, -271105856, -283991296, -296971232, -309841088, -322147776, -333463936, -343533504, + -352343008, -360091680, -366892736, -372482656, -376434560, -378663104, -379509216, -379385728, -378569152, -377280672, + -375758624, -374254848, -373029728, -372255552, -371887264, -371805120, -372115424, -373099520, -374873888, -377288192, + -380094400, -382999936, -385673568, -387967072, -390036704, -392070400, -394039616, -395879488, -397664032, -399435168, + -401066208, -402452384, -403620640, -404609536, -405454592, -406308736, -407351328, -408589888, -409931008, -411351552, + -412853184, -414413888, -416115744, -418142976, -420566432, -423312512, -426339392, -429601952, -432933248, -436230176, + -439630176, -443259968, -447025024, -450868480, -454913280, -459126624, -463203648, -466963872, -470473408, -473698400, + -476477216, -478859872, -481021312, -482905728, -484371392, -485500416, -486368000, -486850656, -486995072, -487141088, + -487406848, -487615168, -487850304, -488395776, -489068448, -489370720, -489218784, -488805920, -488051104, -486929568, + -485842944, -484988256, -484049792, -483024384, -482375296, -482025248, -481413216, -480660000, -480307264, -480132256, + -479703296, -479427328, -479558880, -479476192, -479256064, -479838592, -480622400, -480185920, -479861120, -481702592, + -483188640, -481178592, -480039360, -485045696, -488822048, -479682880, -464048672, -461323520, -473385376, -481892096, + -481580192, -489001888, -506634336, -507556160, -475460384, -435317472, -421685248, -435285280, -450985536, -452022752, + -439289248, -422705856, -415015712, -414360736, -386421952, -295605952, -168432512, -90038080, -111629424, -189907888, + -245691456, -256092800, -255994016, -268771552, -274996032, -247346624, -187443104, -122430728, -81640352, }, { -37328636, - -189374768, -383476160, -475285376, -383028416, -133840848, 171073376, 432745888, 603796160, 683916096, 690635008, - 641510272, 552180864, 436797088, 306463104, 169717248, 34593816, -91378648, -202743392, -296894976, -374149632, - -437277600, -489349248, -531198880, -561826816, -581349568, -592261504, -597636096, -599314368, -598031232, -594031552, - -587127936, -577005760, -563930304, -548784640, -532358496, -514886592, -496108448, -475500672, -452722304, -428125568, - -402665536, -377180800, -352018208, -327308192, -303174240, -279620640, -256611408, -234338784, -213113056, -192994352, - -173741088, -155053152, -136726528, -118736520, -101311840, -84780504, -69293928, -54891828, -41746544, -30001958, - -19447076, -9730248, -790811, 7295002, 14765024, 22013318, 29103772, 35866736, 42364484, 48842368, - 55338508, 61733712, 68128920, 74811888, 81897512, 89285928, 96952984, 105030744, 113582560, 122484952, - 131581152, 140860432, 150426928, 160311264, 170375984, 180435872, 190413088, 200370432, 210518896, 221234832, - 232860784, 245344096, 258222016, 271105856, 283991296, 296971232, 309841088, 322147776, 333463936, 343533504, - 352343008, 360091680, 366892736, 372482656, 376434560, 378663104, 379509216, 379385728, 378569152, 377280672, - 375758624, 374254848, 373029728, 372255552, 371887264, 371805120, 372115424, 373099520, 374873888, 377288192, - 380094400, 382999936, 385673568, 387967072, 390036704, 392070400, 394039616, 395879488, 397664032, 399435168, - 401066208, 402452384, 403620640, 404609536, 405454592, 406308736, 407351328, 408589888, 409931008, 411351552, - 412853184, 414413888, 416115744, 418142976, 420566432, 423312512, 426339392, 429601952, 432933248, 436230176, - 439630176, 443259968, 447025024, 450868480, 454913280, 459126624, 463203648, 466963872, 470473408, 473698400, - 476477216, 478859872, 481021312, 482905728, 484371392, 485500416, 486368000, 486850656, 486995072, 487141088, - 487406848, 487615168, 487850304, 488395776, 489068448, 489370720, 489218784, 488805920, 488051104, 486929568, - 485842944, 484988256, 484049792, 483024384, 482375296, 482025248, 481413216, 480660000, 480307264, 480132256, - 479703296, 479427328, 479558880, 479476192, 479256064, 479838592, 480622400, 480185920, 479861120, 481702592, - 483188640, 481178592, 480039360, 485045696, 488822048, 479682880, 464048672, 461323520, 473385376, 481892096, - 481580192, 489001888, 506634336, 507556160, 475460384, 435317472, 421685248, 435285280, 450985536, 452022752, - 439289248, 422705856, 415015712, 414360736, 386421952, 295605952, 168432512, 90038080, 111629424, 189907888, - 245691456, 256092800, 255994016, 268771552, 274996032, 247346624, 187443104, 122430728, 81640352, }, + -189374768, -383476160, -475285376, -383028416, -133840848, 171073376, 432745888, 603796160, 683916096, 690635008, + 641510272, 552180864, 436797088, 306463104, 169717248, 34593816, -91378648, -202743392, -296894976, -374149632, + -437277600, -489349248, -531198880, -561826816, -581349568, -592261504, -597636096, -599314368, -598031232, -594031552, + -587127936, -577005760, -563930304, -548784640, -532358496, -514886592, -496108448, -475500672, -452722304, -428125568, + -402665536, -377180800, -352018208, -327308192, -303174240, -279620640, -256611408, -234338784, -213113056, -192994352, + -173741088, -155053152, -136726528, -118736520, -101311840, -84780504, -69293928, -54891828, -41746544, -30001958, + -19447076, -9730248, -790811, 7295002, 14765024, 22013318, 29103772, 35866736, 42364484, 48842368, + 55338508, 61733712, 68128920, 74811888, 81897512, 89285928, 96952984, 105030744, 113582560, 122484952, + 131581152, 140860432, 150426928, 160311264, 170375984, 180435872, 190413088, 200370432, 210518896, 221234832, + 232860784, 245344096, 258222016, 271105856, 283991296, 296971232, 309841088, 322147776, 333463936, 343533504, + 352343008, 360091680, 366892736, 372482656, 376434560, 378663104, 379509216, 379385728, 378569152, 377280672, + 375758624, 374254848, 373029728, 372255552, 371887264, 371805120, 372115424, 373099520, 374873888, 377288192, + 380094400, 382999936, 385673568, 387967072, 390036704, 392070400, 394039616, 395879488, 397664032, 399435168, + 401066208, 402452384, 403620640, 404609536, 405454592, 406308736, 407351328, 408589888, 409931008, 411351552, + 412853184, 414413888, 416115744, 418142976, 420566432, 423312512, 426339392, 429601952, 432933248, 436230176, + 439630176, 443259968, 447025024, 450868480, 454913280, 459126624, 463203648, 466963872, 470473408, 473698400, + 476477216, 478859872, 481021312, 482905728, 484371392, 485500416, 486368000, 486850656, 486995072, 487141088, + 487406848, 487615168, 487850304, 488395776, 489068448, 489370720, 489218784, 488805920, 488051104, 486929568, + 485842944, 484988256, 484049792, 483024384, 482375296, 482025248, 481413216, 480660000, 480307264, 480132256, + 479703296, 479427328, 479558880, 479476192, 479256064, 479838592, 480622400, 480185920, 479861120, 481702592, + 483188640, 481178592, 480039360, 485045696, 488822048, 479682880, 464048672, 461323520, 473385376, 481892096, + 481580192, 489001888, 506634336, 507556160, 475460384, 435317472, 421685248, 435285280, 450985536, 452022752, + 439289248, 422705856, 415015712, 414360736, 386421952, 295605952, 168432512, 90038080, 111629424, 189907888, + 245691456, 256092800, 255994016, 268771552, 274996032, 247346624, 187443104, 122430728, 81640352, }, }, { { 60022168, - 49746996, 10565083, -45541684, -70657584, -40651864, 11245835, 38012608, 30652644, 9220221, -13295071, - -34076808, -43962748, -34187940, -14217952, -2735357, -2489471, 1039919, 17454748, 41131828, 62984084, - 80743776, 94916632, 103083512, 102638448, 95371360, 86412056, 79781168, 75625248, 70895952, 62644244, - 50934016, 38225208, 26533234, 16660715, 9768903, 7541963, 10284299, 16239808, 23172960, 29753922, - 35461936, 40116604, 43666932, 45964204, 46811924, 46316392, 44748728, 41918880, 37129456, 29789894, - 19681688, 6796249, -8666707, -26332444, -45959372, -67415952, -90271088, -113905216, -138052064, -162602624, - -186969056, -210371264, -232554224, -253434208, -272316480, -288309344, -301175456, -310986240, -317375008, -319892384, - -318597984, -313612064, -304732768, -292141536, -276765536, -259301664, -239675824, -218124752, -196026608, -174841680, - -154810480, -135496560, -117300392, -101607648, -89267136, -79482128, -70801464, -63117764, -57910116, -56150792, - -56747792, -57774288, -58577984, -59801516, -61881888, -64522756, -67282808, -69747584, -71321688, -71554696, - -70534640, -68598680, -65859564, -62138512, -56994752, -49916108, -40994924, -31270046, -21858700, -12998182, - -4407174, 3896609, 11694659, 18927920, 25387014, 30523796, 33960844, 35690640, 35647156, 33712808, - 30168924, 25445534, 19543712, 12341589, 4201552, -4342212, -13083007, -21811454, -30077120, -37672232, - -44685912, -50859392, -55713780, -59406376, -62608812, -65666828, -68755984, -72400800, -76803144, -81170584, - -84679576, -87438016, -89740120, -91313152, -92022360, -92261264, -92120608, -91264832, -89894736, -88617520, - -87414936, -85963232, -84606560, -83760992, -82992728, -81849728, -80668616, -79576616, -77946144, -75635984, - -73285024, -70879848, -67727880, -63979980, -60372744, -56759068, -52786220, -49230524, -46776488, -44691820, - -42433204, -40787156, -39968964, -38850128, -37123548, -35539780, -33543158, -29846802, -25129316, -20710870, - -15674483, -8952322, -2120640, 3613678, 9954660, 17568564, 24113558, 29132764, 35056596, 41430864, - 45571212, 49248780, 55470576, 60667488, 61601644, 64684892, 73870752, 78956528, 74776456, 76883672, - 92792232, 99237368, 84040696, 83722336, 126914136, 165098000, 129345624, 42492260, -3980361, 17639430, - 46632072, 49243948, 66058744, 115501336, 138135808, 87157768, 7816304, -27060978, -12878459, 3414499, - -471910, -5507222, 11730093, 54191748, 98788544, 103766408, 48269528, -26941256, -51353312, -8629126, - 44756780, 56989920, 40558988, 35066260, 45074072, 45548128, 27823872, 8046085, -1290101, }, + 49746996, 10565083, -45541684, -70657584, -40651864, 11245835, 38012608, 30652644, 9220221, -13295071, + -34076808, -43962748, -34187940, -14217952, -2735357, -2489471, 1039919, 17454748, 41131828, 62984084, + 80743776, 94916632, 103083512, 102638448, 95371360, 86412056, 79781168, 75625248, 70895952, 62644244, + 50934016, 38225208, 26533234, 16660715, 9768903, 7541963, 10284299, 16239808, 23172960, 29753922, + 35461936, 40116604, 43666932, 45964204, 46811924, 46316392, 44748728, 41918880, 37129456, 29789894, + 19681688, 6796249, -8666707, -26332444, -45959372, -67415952, -90271088, -113905216, -138052064, -162602624, + -186969056, -210371264, -232554224, -253434208, -272316480, -288309344, -301175456, -310986240, -317375008, -319892384, + -318597984, -313612064, -304732768, -292141536, -276765536, -259301664, -239675824, -218124752, -196026608, -174841680, + -154810480, -135496560, -117300392, -101607648, -89267136, -79482128, -70801464, -63117764, -57910116, -56150792, + -56747792, -57774288, -58577984, -59801516, -61881888, -64522756, -67282808, -69747584, -71321688, -71554696, + -70534640, -68598680, -65859564, -62138512, -56994752, -49916108, -40994924, -31270046, -21858700, -12998182, + -4407174, 3896609, 11694659, 18927920, 25387014, 30523796, 33960844, 35690640, 35647156, 33712808, + 30168924, 25445534, 19543712, 12341589, 4201552, -4342212, -13083007, -21811454, -30077120, -37672232, + -44685912, -50859392, -55713780, -59406376, -62608812, -65666828, -68755984, -72400800, -76803144, -81170584, + -84679576, -87438016, -89740120, -91313152, -92022360, -92261264, -92120608, -91264832, -89894736, -88617520, + -87414936, -85963232, -84606560, -83760992, -82992728, -81849728, -80668616, -79576616, -77946144, -75635984, + -73285024, -70879848, -67727880, -63979980, -60372744, -56759068, -52786220, -49230524, -46776488, -44691820, + -42433204, -40787156, -39968964, -38850128, -37123548, -35539780, -33543158, -29846802, -25129316, -20710870, + -15674483, -8952322, -2120640, 3613678, 9954660, 17568564, 24113558, 29132764, 35056596, 41430864, + 45571212, 49248780, 55470576, 60667488, 61601644, 64684892, 73870752, 78956528, 74776456, 76883672, + 92792232, 99237368, 84040696, 83722336, 126914136, 165098000, 129345624, 42492260, -3980361, 17639430, + 46632072, 49243948, 66058744, 115501336, 138135808, 87157768, 7816304, -27060978, -12878459, 3414499, + -471910, -5507222, 11730093, 54191748, 98788544, 103766408, 48269528, -26941256, -51353312, -8629126, + 44756780, 56989920, 40558988, 35066260, 45074072, 45548128, 27823872, 8046085, -1290101, }, { 60022168, - 49746996, 10565083, -45541684, -70657584, -40651864, 11245835, 38012608, 30652644, 9220221, -13295071, - -34076808, -43962748, -34187940, -14217952, -2735357, -2489471, 1039919, 17454748, 41131828, 62984084, - 80743776, 94916632, 103083512, 102638448, 95371360, 86412056, 79781168, 75625248, 70895952, 62644244, - 50934016, 38225208, 26533234, 16660715, 9768903, 7541963, 10284299, 16239808, 23172960, 29753922, - 35461936, 40116604, 43666932, 45964204, 46811924, 46316392, 44748728, 41918880, 37129456, 29789894, - 19681688, 6796249, -8666707, -26332444, -45959372, -67415952, -90271088, -113905216, -138052064, -162602624, - -186969056, -210371264, -232554224, -253434208, -272316480, -288309344, -301175456, -310986240, -317375008, -319892384, - -318597984, -313612064, -304732768, -292141536, -276765536, -259301664, -239675824, -218124752, -196026608, -174841680, - -154810480, -135496560, -117300392, -101607648, -89267136, -79482128, -70801464, -63117764, -57910116, -56150792, - -56747792, -57774288, -58577984, -59801516, -61881888, -64522756, -67282808, -69747584, -71321688, -71554696, - -70534640, -68598680, -65859564, -62138512, -56994752, -49916108, -40994924, -31270046, -21858700, -12998182, - -4407174, 3896609, 11694659, 18927920, 25387014, 30523796, 33960844, 35690640, 35647156, 33712808, - 30168924, 25445534, 19543712, 12341589, 4201552, -4342212, -13083007, -21811454, -30077120, -37672232, - -44685912, -50859392, -55713780, -59406376, -62608812, -65666828, -68755984, -72400800, -76803144, -81170584, - -84679576, -87438016, -89740120, -91313152, -92022360, -92261264, -92120608, -91264832, -89894736, -88617520, - -87414936, -85963232, -84606560, -83760992, -82992728, -81849728, -80668616, -79576616, -77946144, -75635984, - -73285024, -70879848, -67727880, -63979980, -60372744, -56759068, -52786220, -49230524, -46776488, -44691820, - -42433204, -40787156, -39968964, -38850128, -37123548, -35539780, -33543158, -29846802, -25129316, -20710870, - -15674483, -8952322, -2120640, 3613678, 9954660, 17568564, 24113558, 29132764, 35056596, 41430864, - 45571212, 49248780, 55470576, 60667488, 61601644, 64684892, 73870752, 78956528, 74776456, 76883672, - 92792232, 99237368, 84040696, 83722336, 126914136, 165098000, 129345624, 42492260, -3980361, 17639430, - 46632072, 49243948, 66058744, 115501336, 138135808, 87157768, 7816304, -27060978, -12878459, 3414499, - -471910, -5507222, 11730093, 54191748, 98788544, 103766408, 48269528, -26941256, -51353312, -8629126, - 44756780, 56989920, 40558988, 35066260, 45074072, 45548128, 27823872, 8046085, -1290101, }, + 49746996, 10565083, -45541684, -70657584, -40651864, 11245835, 38012608, 30652644, 9220221, -13295071, + -34076808, -43962748, -34187940, -14217952, -2735357, -2489471, 1039919, 17454748, 41131828, 62984084, + 80743776, 94916632, 103083512, 102638448, 95371360, 86412056, 79781168, 75625248, 70895952, 62644244, + 50934016, 38225208, 26533234, 16660715, 9768903, 7541963, 10284299, 16239808, 23172960, 29753922, + 35461936, 40116604, 43666932, 45964204, 46811924, 46316392, 44748728, 41918880, 37129456, 29789894, + 19681688, 6796249, -8666707, -26332444, -45959372, -67415952, -90271088, -113905216, -138052064, -162602624, + -186969056, -210371264, -232554224, -253434208, -272316480, -288309344, -301175456, -310986240, -317375008, -319892384, + -318597984, -313612064, -304732768, -292141536, -276765536, -259301664, -239675824, -218124752, -196026608, -174841680, + -154810480, -135496560, -117300392, -101607648, -89267136, -79482128, -70801464, -63117764, -57910116, -56150792, + -56747792, -57774288, -58577984, -59801516, -61881888, -64522756, -67282808, -69747584, -71321688, -71554696, + -70534640, -68598680, -65859564, -62138512, -56994752, -49916108, -40994924, -31270046, -21858700, -12998182, + -4407174, 3896609, 11694659, 18927920, 25387014, 30523796, 33960844, 35690640, 35647156, 33712808, + 30168924, 25445534, 19543712, 12341589, 4201552, -4342212, -13083007, -21811454, -30077120, -37672232, + -44685912, -50859392, -55713780, -59406376, -62608812, -65666828, -68755984, -72400800, -76803144, -81170584, + -84679576, -87438016, -89740120, -91313152, -92022360, -92261264, -92120608, -91264832, -89894736, -88617520, + -87414936, -85963232, -84606560, -83760992, -82992728, -81849728, -80668616, -79576616, -77946144, -75635984, + -73285024, -70879848, -67727880, -63979980, -60372744, -56759068, -52786220, -49230524, -46776488, -44691820, + -42433204, -40787156, -39968964, -38850128, -37123548, -35539780, -33543158, -29846802, -25129316, -20710870, + -15674483, -8952322, -2120640, 3613678, 9954660, 17568564, 24113558, 29132764, 35056596, 41430864, + 45571212, 49248780, 55470576, 60667488, 61601644, 64684892, 73870752, 78956528, 74776456, 76883672, + 92792232, 99237368, 84040696, 83722336, 126914136, 165098000, 129345624, 42492260, -3980361, 17639430, + 46632072, 49243948, 66058744, 115501336, 138135808, 87157768, 7816304, -27060978, -12878459, 3414499, + -471910, -5507222, 11730093, 54191748, 98788544, 103766408, 48269528, -26941256, -51353312, -8629126, + 44756780, 56989920, 40558988, 35066260, 45074072, 45548128, 27823872, 8046085, -1290101, }, }, { { 31920734, - 46136540, 45763412, 14942728, -23592256, -34102576, -10480257, 17888538, 19763828, -8626442, -47391744, - -75476000, -85082768, -81128712, -73625400, -69166152, -65736620, -55586004, -33918432, -3300146, 30547418, - 63887640, 94476392, 119725968, 138947024, 155736592, 174775104, 196526960, 217297424, 234043504, 246777552, - 256118032, 260794704, 258744400, 249421104, 233813184, 212831728, 186947584, 157384784, 126632816, 97257384, - 70578120, 46705084, 25389162, 6402186, -10662256, -26432302, -41385768, -55461448, -68065568, -78422344, - -85960552, -90507848, -92429304, -92740152, -92838936, -93768800, -95774016, -98702104, -102485432, -106901736, - -111312664, -115221624, -118802552, -122387240, -125823216, -128891968, -131853888, -134915120, -137633840, -139581600, - -141094512, -142585392, -143600080, -143395536, -141987856, -139721728, -136213808, -130733976, -123400312, -115025128, - -105831216, -95274184, -83281024, -70845488, -59068148, -48165912, -37769944, -27663884, -17735530, -7606924, - 2993055, 13587666, 23325430, 32034550, 40264780, 48121352, 54684060, 58984932, 61139396, 62108448, - 62512712, 61899068, 59082644, 53230216, 44786844, 35209068, 25565792, 15585899, 4358855, -8272107, - -21323976, -33465312, -43962212, -53104588, -61926448, -71250288, -80840408, -89663344, -96920768, -102593344, - -107195408, -111458160, -116062368, -121186264, -126389080, -131220912, -135749952, -140284368, -144986288, -150000656, - -155531504, -161549824, -167774848, -174053008, -180381648, -186606128, -192506880, -198077984, -203331808, -208018688, - -211882016, -214886880, -216935040, -217763424, -217331248, -215891360, -213601072, -210547344, -207094736, -203652848, - -200254464, -196862512, -193756720, -191131952, -188817504, -186823024, -185553856, -185114704, -185130800, -185469568, - -186309232, -187417872, -188285456, -188920048, -189658784, -190536560, -191623728, -193379296, -195891312, -198575664, - -201206864, -204152688, -207264928, -209902032, -212141856, -214416048, -216199520, -216748752, -216459376, -215771648, - -213953792, -210683184, -207064128, -203521328, -199073344, -193881264, -189422016, -185501248, -180827248, -176279952, - -173140336, -169690400, -164839232, -161581504, -160694592, -157216208, -150669600, -148856048, -152050976, -148304688, - -137272528, -137371840, -149848720, -143919520, -108989088, -91152088, -131908112, -196136656, -217179856, -194179232, - -179810416, -184189136, -167261600, -129284960, -128454952, -186015568, -244544160, -253234496, -235377088, -235451184, - -251041376, -256067024, -247692912, -230110384, -189109552, -125137632, -82403776, -100727184, -155899264, -188265600, - -180487408, -169009648, -181035552, -197899744, -193123744, -179249920, -193284272, -243472032, -290958272, }, + 46136540, 45763412, 14942728, -23592256, -34102576, -10480257, 17888538, 19763828, -8626442, -47391744, + -75476000, -85082768, -81128712, -73625400, -69166152, -65736620, -55586004, -33918432, -3300146, 30547418, + 63887640, 94476392, 119725968, 138947024, 155736592, 174775104, 196526960, 217297424, 234043504, 246777552, + 256118032, 260794704, 258744400, 249421104, 233813184, 212831728, 186947584, 157384784, 126632816, 97257384, + 70578120, 46705084, 25389162, 6402186, -10662256, -26432302, -41385768, -55461448, -68065568, -78422344, + -85960552, -90507848, -92429304, -92740152, -92838936, -93768800, -95774016, -98702104, -102485432, -106901736, + -111312664, -115221624, -118802552, -122387240, -125823216, -128891968, -131853888, -134915120, -137633840, -139581600, + -141094512, -142585392, -143600080, -143395536, -141987856, -139721728, -136213808, -130733976, -123400312, -115025128, + -105831216, -95274184, -83281024, -70845488, -59068148, -48165912, -37769944, -27663884, -17735530, -7606924, + 2993055, 13587666, 23325430, 32034550, 40264780, 48121352, 54684060, 58984932, 61139396, 62108448, + 62512712, 61899068, 59082644, 53230216, 44786844, 35209068, 25565792, 15585899, 4358855, -8272107, + -21323976, -33465312, -43962212, -53104588, -61926448, -71250288, -80840408, -89663344, -96920768, -102593344, + -107195408, -111458160, -116062368, -121186264, -126389080, -131220912, -135749952, -140284368, -144986288, -150000656, + -155531504, -161549824, -167774848, -174053008, -180381648, -186606128, -192506880, -198077984, -203331808, -208018688, + -211882016, -214886880, -216935040, -217763424, -217331248, -215891360, -213601072, -210547344, -207094736, -203652848, + -200254464, -196862512, -193756720, -191131952, -188817504, -186823024, -185553856, -185114704, -185130800, -185469568, + -186309232, -187417872, -188285456, -188920048, -189658784, -190536560, -191623728, -193379296, -195891312, -198575664, + -201206864, -204152688, -207264928, -209902032, -212141856, -214416048, -216199520, -216748752, -216459376, -215771648, + -213953792, -210683184, -207064128, -203521328, -199073344, -193881264, -189422016, -185501248, -180827248, -176279952, + -173140336, -169690400, -164839232, -161581504, -160694592, -157216208, -150669600, -148856048, -152050976, -148304688, + -137272528, -137371840, -149848720, -143919520, -108989088, -91152088, -131908112, -196136656, -217179856, -194179232, + -179810416, -184189136, -167261600, -129284960, -128454952, -186015568, -244544160, -253234496, -235377088, -235451184, + -251041376, -256067024, -247692912, -230110384, -189109552, -125137632, -82403776, -100727184, -155899264, -188265600, + -180487408, -169009648, -181035552, -197899744, -193123744, -179249920, -193284272, -243472032, -290958272, }, { 31920734, - 46136540, 45763412, 14942728, -23592256, -34102576, -10480257, 17888538, 19763828, -8626442, -47391744, - -75476000, -85082768, -81128712, -73625400, -69166152, -65736620, -55586004, -33918432, -3300146, 30547418, - 63887640, 94476392, 119725968, 138947024, 155736592, 174775104, 196526960, 217297424, 234043504, 246777552, - 256118032, 260794704, 258744400, 249421104, 233813184, 212831728, 186947584, 157384784, 126632816, 97257384, - 70578120, 46705084, 25389162, 6402186, -10662256, -26432302, -41385768, -55461448, -68065568, -78422344, - -85960552, -90507848, -92429304, -92740152, -92838936, -93768800, -95774016, -98702104, -102485432, -106901736, - -111312664, -115221624, -118802552, -122387240, -125823216, -128891968, -131853888, -134915120, -137633840, -139581600, - -141094512, -142585392, -143600080, -143395536, -141987856, -139721728, -136213808, -130733976, -123400312, -115025128, - -105831216, -95274184, -83281024, -70845488, -59068148, -48165912, -37769944, -27663884, -17735530, -7606924, - 2993055, 13587666, 23325430, 32034550, 40264780, 48121352, 54684060, 58984932, 61139396, 62108448, - 62512712, 61899068, 59082644, 53230216, 44786844, 35209068, 25565792, 15585899, 4358855, -8272107, - -21323976, -33465312, -43962212, -53104588, -61926448, -71250288, -80840408, -89663344, -96920768, -102593344, - -107195408, -111458160, -116062368, -121186264, -126389080, -131220912, -135749952, -140284368, -144986288, -150000656, - -155531504, -161549824, -167774848, -174053008, -180381648, -186606128, -192506880, -198077984, -203331808, -208018688, - -211882016, -214886880, -216935040, -217763424, -217331248, -215891360, -213601072, -210547344, -207094736, -203652848, - -200254464, -196862512, -193756720, -191131952, -188817504, -186823024, -185553856, -185114704, -185130800, -185469568, - -186309232, -187417872, -188285456, -188920048, -189658784, -190536560, -191623728, -193379296, -195891312, -198575664, - -201206864, -204152688, -207264928, -209902032, -212141856, -214416048, -216199520, -216748752, -216459376, -215771648, - -213953792, -210683184, -207064128, -203521328, -199073344, -193881264, -189422016, -185501248, -180827248, -176279952, - -173140336, -169690400, -164839232, -161581504, -160694592, -157216208, -150669600, -148856048, -152050976, -148304688, - -137272528, -137371840, -149848720, -143919520, -108989088, -91152088, -131908112, -196136656, -217179856, -194179232, - -179810416, -184189136, -167261600, -129284960, -128454952, -186015568, -244544160, -253234496, -235377088, -235451184, - -251041376, -256067024, -247692912, -230110384, -189109552, -125137632, -82403776, -100727184, -155899264, -188265600, - -180487408, -169009648, -181035552, -197899744, -193123744, -179249920, -193284272, -243472032, -290958272, }, + 46136540, 45763412, 14942728, -23592256, -34102576, -10480257, 17888538, 19763828, -8626442, -47391744, + -75476000, -85082768, -81128712, -73625400, -69166152, -65736620, -55586004, -33918432, -3300146, 30547418, + 63887640, 94476392, 119725968, 138947024, 155736592, 174775104, 196526960, 217297424, 234043504, 246777552, + 256118032, 260794704, 258744400, 249421104, 233813184, 212831728, 186947584, 157384784, 126632816, 97257384, + 70578120, 46705084, 25389162, 6402186, -10662256, -26432302, -41385768, -55461448, -68065568, -78422344, + -85960552, -90507848, -92429304, -92740152, -92838936, -93768800, -95774016, -98702104, -102485432, -106901736, + -111312664, -115221624, -118802552, -122387240, -125823216, -128891968, -131853888, -134915120, -137633840, -139581600, + -141094512, -142585392, -143600080, -143395536, -141987856, -139721728, -136213808, -130733976, -123400312, -115025128, + -105831216, -95274184, -83281024, -70845488, -59068148, -48165912, -37769944, -27663884, -17735530, -7606924, + 2993055, 13587666, 23325430, 32034550, 40264780, 48121352, 54684060, 58984932, 61139396, 62108448, + 62512712, 61899068, 59082644, 53230216, 44786844, 35209068, 25565792, 15585899, 4358855, -8272107, + -21323976, -33465312, -43962212, -53104588, -61926448, -71250288, -80840408, -89663344, -96920768, -102593344, + -107195408, -111458160, -116062368, -121186264, -126389080, -131220912, -135749952, -140284368, -144986288, -150000656, + -155531504, -161549824, -167774848, -174053008, -180381648, -186606128, -192506880, -198077984, -203331808, -208018688, + -211882016, -214886880, -216935040, -217763424, -217331248, -215891360, -213601072, -210547344, -207094736, -203652848, + -200254464, -196862512, -193756720, -191131952, -188817504, -186823024, -185553856, -185114704, -185130800, -185469568, + -186309232, -187417872, -188285456, -188920048, -189658784, -190536560, -191623728, -193379296, -195891312, -198575664, + -201206864, -204152688, -207264928, -209902032, -212141856, -214416048, -216199520, -216748752, -216459376, -215771648, + -213953792, -210683184, -207064128, -203521328, -199073344, -193881264, -189422016, -185501248, -180827248, -176279952, + -173140336, -169690400, -164839232, -161581504, -160694592, -157216208, -150669600, -148856048, -152050976, -148304688, + -137272528, -137371840, -149848720, -143919520, -108989088, -91152088, -131908112, -196136656, -217179856, -194179232, + -179810416, -184189136, -167261600, -129284960, -128454952, -186015568, -244544160, -253234496, -235377088, -235451184, + -251041376, -256067024, -247692912, -230110384, -189109552, -125137632, -82403776, -100727184, -155899264, -188265600, + -180487408, -169009648, -181035552, -197899744, -193123744, -179249920, -193284272, -243472032, -290958272, }, }, }; const Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240] ={ { { -124898720, - -332729504, -439877120, -442557728, -379344384, -293460096, -205276352, -113285672, -12222940, 93858992, 192837584, - 272809888, 327290464, 355045632, 358171296, 341044576, 309595744, 269720736, 225325264, 177752592, 127412352, - 75906568, 26075284, -20146080, -63114544, -104128800, -143182400, -178805936, -209827408, -236391248, -259223824, - -278753568, -295292960, -309494272, -322090880, -333362464, -343166816, -351456640, -358579840, -365063616, -371221536, - -377014368, -382244032, -386783808, -390602048, -393683136, -396049120, -397818112, -399115744, -399944128, -400236192, - -399987072, -399253728, -398069376, -396445888, -394451392, -392200320, -389782240, -387236384, -384578336, -381834944, - -379053408, -376263296, -373443648, -370585344, -367778592, -365158656, -362774944, -360603296, -358668416, -357025056, - -355635648, -354415328, -353371648, -352556672, -351920480, -351348192, -350802720, -350258880, -349570624, -348561824, - -347180992, -345422208, -343174880, -340324096, -336925696, -333160608, -329167360, -324992672, -320619840, -315976448, - -311015776, -305840320, -300658464, -295617216, -290763904, -286148960, -281828768, -277802784, -274047904, -270602816, - -267524928, -264817488, -262432160, -260293808, -258303088, -256404720, -254646464, -253053024, -251462288, -249616512, - -247390656, -244834080, -242033760, -239064864, -236007920, -232902656, -229728672, -226498320, -223285152, -220122448, - -216968320, -213787904, -210567744, -207265456, -203864912, -200441824, -197074032, -193735776, -190386768, -187074272, - -183864336, -180773568, -177833664, -175100448, -172536896, -170028624, -167533248, -165088336, -162686384, -160296240, - -157944208, -155640496, -153303488, -150872544, -148402928, -145936016, -143440096, -140947408, -138565312, -136292192, - -134017472, -131727720, -129487360, -127250216, -124917512, -122529512, -120187144, -117889336, -115630184, -113507392, - -111558016, -109682192, -107845016, -106118976, -104446088, -102671192, -100828112, -99078456, -97401808, -95681672, - -93997504, -92467960, -90984048, -89425512, -87905632, -86504936, -85102096, -83697640, -82489680, -81455664, - -80349176, -79179336, -78134584, -77073192, -75731544, -74264816, -72914584, -71460200, -69692824, -67927592, - -66353488, -64584496, -62504660, -60603600, -58905476, -56793964, -54370528, -52408800, -50643568, -48081084, - -45197552, -43396888, -42245300, -40205724, -37985228, -37478420, -37489696, -34875672, -29977262, -25905096, - -22486302, -17277042, -13460964, -19048716, -34682396, -48724792, -49633716, -39305932, -29730300, -29189134, - -35735740, -42936788, -48927192, -58810452, -77185392, -97927936, -105323336, -90025200, -61538828, -38875360, - -30039002, -27507654, -23304492, -19342922, -19663970, -20865488, -16995722, -9038222, -2388002, }, + -332729504, -439877120, -442557728, -379344384, -293460096, -205276352, -113285672, -12222940, 93858992, 192837584, + 272809888, 327290464, 355045632, 358171296, 341044576, 309595744, 269720736, 225325264, 177752592, 127412352, + 75906568, 26075284, -20146080, -63114544, -104128800, -143182400, -178805936, -209827408, -236391248, -259223824, + -278753568, -295292960, -309494272, -322090880, -333362464, -343166816, -351456640, -358579840, -365063616, -371221536, + -377014368, -382244032, -386783808, -390602048, -393683136, -396049120, -397818112, -399115744, -399944128, -400236192, + -399987072, -399253728, -398069376, -396445888, -394451392, -392200320, -389782240, -387236384, -384578336, -381834944, + -379053408, -376263296, -373443648, -370585344, -367778592, -365158656, -362774944, -360603296, -358668416, -357025056, + -355635648, -354415328, -353371648, -352556672, -351920480, -351348192, -350802720, -350258880, -349570624, -348561824, + -347180992, -345422208, -343174880, -340324096, -336925696, -333160608, -329167360, -324992672, -320619840, -315976448, + -311015776, -305840320, -300658464, -295617216, -290763904, -286148960, -281828768, -277802784, -274047904, -270602816, + -267524928, -264817488, -262432160, -260293808, -258303088, -256404720, -254646464, -253053024, -251462288, -249616512, + -247390656, -244834080, -242033760, -239064864, -236007920, -232902656, -229728672, -226498320, -223285152, -220122448, + -216968320, -213787904, -210567744, -207265456, -203864912, -200441824, -197074032, -193735776, -190386768, -187074272, + -183864336, -180773568, -177833664, -175100448, -172536896, -170028624, -167533248, -165088336, -162686384, -160296240, + -157944208, -155640496, -153303488, -150872544, -148402928, -145936016, -143440096, -140947408, -138565312, -136292192, + -134017472, -131727720, -129487360, -127250216, -124917512, -122529512, -120187144, -117889336, -115630184, -113507392, + -111558016, -109682192, -107845016, -106118976, -104446088, -102671192, -100828112, -99078456, -97401808, -95681672, + -93997504, -92467960, -90984048, -89425512, -87905632, -86504936, -85102096, -83697640, -82489680, -81455664, + -80349176, -79179336, -78134584, -77073192, -75731544, -74264816, -72914584, -71460200, -69692824, -67927592, + -66353488, -64584496, -62504660, -60603600, -58905476, -56793964, -54370528, -52408800, -50643568, -48081084, + -45197552, -43396888, -42245300, -40205724, -37985228, -37478420, -37489696, -34875672, -29977262, -25905096, + -22486302, -17277042, -13460964, -19048716, -34682396, -48724792, -49633716, -39305932, -29730300, -29189134, + -35735740, -42936788, -48927192, -58810452, -77185392, -97927936, -105323336, -90025200, -61538828, -38875360, + -30039002, -27507654, -23304492, -19342922, -19663970, -20865488, -16995722, -9038222, -2388002, }, { -124898720, - -332729504, -439877120, -442557728, -379344384, -293460096, -205276352, -113285672, -12222940, 93858992, 192837584, - 272809888, 327290464, 355045632, 358171296, 341044576, 309595744, 269720736, 225325264, 177752592, 127412352, - 75906568, 26075284, -20146080, -63114544, -104128800, -143182400, -178805936, -209827408, -236391248, -259223824, - -278753568, -295292960, -309494272, -322090880, -333362464, -343166816, -351456640, -358579840, -365063616, -371221536, - -377014368, -382244032, -386783808, -390602048, -393683136, -396049120, -397818112, -399115744, -399944128, -400236192, - -399987072, -399253728, -398069376, -396445888, -394451392, -392200320, -389782240, -387236384, -384578336, -381834944, - -379053408, -376263296, -373443648, -370585344, -367778592, -365158656, -362774944, -360603296, -358668416, -357025056, - -355635648, -354415328, -353371648, -352556672, -351920480, -351348192, -350802720, -350258880, -349570624, -348561824, - -347180992, -345422208, -343174880, -340324096, -336925696, -333160608, -329167360, -324992672, -320619840, -315976448, - -311015776, -305840320, -300658464, -295617216, -290763904, -286148960, -281828768, -277802784, -274047904, -270602816, - -267524928, -264817488, -262432160, -260293808, -258303088, -256404720, -254646464, -253053024, -251462288, -249616512, - -247390656, -244834080, -242033760, -239064864, -236007920, -232902656, -229728672, -226498320, -223285152, -220122448, - -216968320, -213787904, -210567744, -207265456, -203864912, -200441824, -197074032, -193735776, -190386768, -187074272, - -183864336, -180773568, -177833664, -175100448, -172536896, -170028624, -167533248, -165088336, -162686384, -160296240, - -157944208, -155640496, -153303488, -150872544, -148402928, -145936016, -143440096, -140947408, -138565312, -136292192, - -134017472, -131727720, -129487360, -127250216, -124917512, -122529512, -120187144, -117889336, -115630184, -113507392, - -111558016, -109682192, -107845016, -106118976, -104446088, -102671192, -100828112, -99078456, -97401808, -95681672, - -93997504, -92467960, -90984048, -89425512, -87905632, -86504936, -85102096, -83697640, -82489680, -81455664, - -80349176, -79179336, -78134584, -77073192, -75731544, -74264816, -72914584, -71460200, -69692824, -67927592, - -66353488, -64584496, -62504660, -60603600, -58905476, -56793964, -54370528, -52408800, -50643568, -48081084, - -45197552, -43396888, -42245300, -40205724, -37985228, -37478420, -37489696, -34875672, -29977262, -25905096, - -22486302, -17277042, -13460964, -19048716, -34682396, -48724792, -49633716, -39305932, -29730300, -29189134, - -35735740, -42936788, -48927192, -58810452, -77185392, -97927936, -105323336, -90025200, -61538828, -38875360, - -30039002, -27507654, -23304492, -19342922, -19663970, -20865488, -16995722, -9038222, -2388002, }, + -332729504, -439877120, -442557728, -379344384, -293460096, -205276352, -113285672, -12222940, 93858992, 192837584, + 272809888, 327290464, 355045632, 358171296, 341044576, 309595744, 269720736, 225325264, 177752592, 127412352, + 75906568, 26075284, -20146080, -63114544, -104128800, -143182400, -178805936, -209827408, -236391248, -259223824, + -278753568, -295292960, -309494272, -322090880, -333362464, -343166816, -351456640, -358579840, -365063616, -371221536, + -377014368, -382244032, -386783808, -390602048, -393683136, -396049120, -397818112, -399115744, -399944128, -400236192, + -399987072, -399253728, -398069376, -396445888, -394451392, -392200320, -389782240, -387236384, -384578336, -381834944, + -379053408, -376263296, -373443648, -370585344, -367778592, -365158656, -362774944, -360603296, -358668416, -357025056, + -355635648, -354415328, -353371648, -352556672, -351920480, -351348192, -350802720, -350258880, -349570624, -348561824, + -347180992, -345422208, -343174880, -340324096, -336925696, -333160608, -329167360, -324992672, -320619840, -315976448, + -311015776, -305840320, -300658464, -295617216, -290763904, -286148960, -281828768, -277802784, -274047904, -270602816, + -267524928, -264817488, -262432160, -260293808, -258303088, -256404720, -254646464, -253053024, -251462288, -249616512, + -247390656, -244834080, -242033760, -239064864, -236007920, -232902656, -229728672, -226498320, -223285152, -220122448, + -216968320, -213787904, -210567744, -207265456, -203864912, -200441824, -197074032, -193735776, -190386768, -187074272, + -183864336, -180773568, -177833664, -175100448, -172536896, -170028624, -167533248, -165088336, -162686384, -160296240, + -157944208, -155640496, -153303488, -150872544, -148402928, -145936016, -143440096, -140947408, -138565312, -136292192, + -134017472, -131727720, -129487360, -127250216, -124917512, -122529512, -120187144, -117889336, -115630184, -113507392, + -111558016, -109682192, -107845016, -106118976, -104446088, -102671192, -100828112, -99078456, -97401808, -95681672, + -93997504, -92467960, -90984048, -89425512, -87905632, -86504936, -85102096, -83697640, -82489680, -81455664, + -80349176, -79179336, -78134584, -77073192, -75731544, -74264816, -72914584, -71460200, -69692824, -67927592, + -66353488, -64584496, -62504660, -60603600, -58905476, -56793964, -54370528, -52408800, -50643568, -48081084, + -45197552, -43396888, -42245300, -40205724, -37985228, -37478420, -37489696, -34875672, -29977262, -25905096, + -22486302, -17277042, -13460964, -19048716, -34682396, -48724792, -49633716, -39305932, -29730300, -29189134, + -35735740, -42936788, -48927192, -58810452, -77185392, -97927936, -105323336, -90025200, -61538828, -38875360, + -30039002, -27507654, -23304492, -19342922, -19663970, -20865488, -16995722, -9038222, -2388002, }, }, { { 75367016, - 152898688, 60698088, -183234576, -462790784, -646732928, -670164672, -552847104, -356891904, -137474384, 73971688, - 261569408, 416582848, 535674240, 619246208, 668629760, 685797824, 674825792, 641893568, 594021376, 537820096, - 477885440, 415636320, 350830656, 284640896, 220209952, 160159328, 104857328, 53330608, 4641786, -41893112, - -86666000, -129419176, -169462768, -206496656, -240911696, -273358560, -304294688, -333708768, -360983936, -385256416, - -406153568, -423995424, -439282816, -452334144, -463416768, -472780864, -480480672, -486499008, -491077984, -494679840, - -497635328, -500009344, -501677952, -502400032, -501986112, -500507040, -498200096, -495197920, -491626656, -487864256, - -484330592, -481093248, -478047040, -475357312, -473303776, -471816640, -470609760, -469671328, -469199392, -469178464, - -469423808, -469963360, -470982880, -472453376, -474128416, -475874848, -477738336, -479691488, -481542592, -483125312, - -484456192, -485635712, -486656832, -487370336, -487655968, -487559840, -487253824, -486930112, -486741120, -486666496, - -486328800, -485141792, -482780640, -479371488, -475091552, -469790496, -463164992, -455119968, -445847136, -435704576, - -425084736, -414195904, -402933440, -391173280, -379205888, -367657248, -357015936, -347438144, -338942720, -331559680, - -325298144, -320120032, -315899680, -312377280, -309302080, -306654752, -304536800, -302828480, -301160960, -299198144, - -296754848, -293748384, -290283968, -286679392, -283180064, -279745728, -276271616, -272813632, -269422752, -266000752, - -262489616, -258998336, -255647728, -252489856, -249618672, -247114160, -244883472, -242755840, -240685136, -238706224, - -236819664, -235067312, -233545296, -232212240, -230879728, -229424800, -227802912, -225917968, -223729680, -221395904, - -219032592, -216511984, -213710592, -210693920, -207425440, -203653920, -199291312, -194540000, -189516512, -184160688, - -178572928, -172972288, -167346416, -161570224, -155748928, -150033952, -144372112, -138797232, -133573480, -128747016, - -124037584, -119380760, -114943528, -110526152, -105692704, -100490960, -95319816, -90263032, -85287848, -80689552, - -76599128, -72645616, -68697464, -65106336, -61799212, -58229020, -54474680, -51085416, -47885128, -44364864, - -40817220, -37582036, -34133716, -30340722, -26945014, -23608898, -19145354, -14457397, -11223286, -7551090, - -877247, 5522254, 7752953, 11690901, 25166898, 40288404, 40982576, 30000884, 27510876, 38634840, - 47277388, 50246824, 68518152, 108822664, 141658752, 139589120, 116141288, 105104832, 118624312, 144289968, - 167411376, 181297008, 192171328, 222071824, 281490016, 330403776, 302403264, 188827168, 66482336, 14287209, - 28991566, 52163988, 55246700, 60433948, 89120032, 125949376, 137805104, 106897440, 40123048, }, + 152898688, 60698088, -183234576, -462790784, -646732928, -670164672, -552847104, -356891904, -137474384, 73971688, + 261569408, 416582848, 535674240, 619246208, 668629760, 685797824, 674825792, 641893568, 594021376, 537820096, + 477885440, 415636320, 350830656, 284640896, 220209952, 160159328, 104857328, 53330608, 4641786, -41893112, + -86666000, -129419176, -169462768, -206496656, -240911696, -273358560, -304294688, -333708768, -360983936, -385256416, + -406153568, -423995424, -439282816, -452334144, -463416768, -472780864, -480480672, -486499008, -491077984, -494679840, + -497635328, -500009344, -501677952, -502400032, -501986112, -500507040, -498200096, -495197920, -491626656, -487864256, + -484330592, -481093248, -478047040, -475357312, -473303776, -471816640, -470609760, -469671328, -469199392, -469178464, + -469423808, -469963360, -470982880, -472453376, -474128416, -475874848, -477738336, -479691488, -481542592, -483125312, + -484456192, -485635712, -486656832, -487370336, -487655968, -487559840, -487253824, -486930112, -486741120, -486666496, + -486328800, -485141792, -482780640, -479371488, -475091552, -469790496, -463164992, -455119968, -445847136, -435704576, + -425084736, -414195904, -402933440, -391173280, -379205888, -367657248, -357015936, -347438144, -338942720, -331559680, + -325298144, -320120032, -315899680, -312377280, -309302080, -306654752, -304536800, -302828480, -301160960, -299198144, + -296754848, -293748384, -290283968, -286679392, -283180064, -279745728, -276271616, -272813632, -269422752, -266000752, + -262489616, -258998336, -255647728, -252489856, -249618672, -247114160, -244883472, -242755840, -240685136, -238706224, + -236819664, -235067312, -233545296, -232212240, -230879728, -229424800, -227802912, -225917968, -223729680, -221395904, + -219032592, -216511984, -213710592, -210693920, -207425440, -203653920, -199291312, -194540000, -189516512, -184160688, + -178572928, -172972288, -167346416, -161570224, -155748928, -150033952, -144372112, -138797232, -133573480, -128747016, + -124037584, -119380760, -114943528, -110526152, -105692704, -100490960, -95319816, -90263032, -85287848, -80689552, + -76599128, -72645616, -68697464, -65106336, -61799212, -58229020, -54474680, -51085416, -47885128, -44364864, + -40817220, -37582036, -34133716, -30340722, -26945014, -23608898, -19145354, -14457397, -11223286, -7551090, + -877247, 5522254, 7752953, 11690901, 25166898, 40288404, 40982576, 30000884, 27510876, 38634840, + 47277388, 50246824, 68518152, 108822664, 141658752, 139589120, 116141288, 105104832, 118624312, 144289968, + 167411376, 181297008, 192171328, 222071824, 281490016, 330403776, 302403264, 188827168, 66482336, 14287209, + 28991566, 52163988, 55246700, 60433948, 89120032, 125949376, 137805104, 106897440, 40123048, }, { -75367016, - -152898688, -60698088, 183234576, 462790784, 646732928, 670164672, 552847104, 356891904, 137474384, -73971688, - -261569408, -416582848, -535674240, -619246208, -668629760, -685797824, -674825792, -641893568, -594021376, -537820096, - -477885440, -415636320, -350830656, -284640896, -220209952, -160159328, -104857328, -53330608, -4641786, 41893112, - 86666000, 129419176, 169462768, 206496656, 240911696, 273358560, 304294688, 333708768, 360983936, 385256416, - 406153568, 423995424, 439282816, 452334144, 463416768, 472780864, 480480672, 486499008, 491077984, 494679840, - 497635328, 500009344, 501677952, 502400032, 501986112, 500507040, 498200096, 495197920, 491626656, 487864256, - 484330592, 481093248, 478047040, 475357312, 473303776, 471816640, 470609760, 469671328, 469199392, 469178464, - 469423808, 469963360, 470982880, 472453376, 474128416, 475874848, 477738336, 479691488, 481542592, 483125312, - 484456192, 485635712, 486656832, 487370336, 487655968, 487559840, 487253824, 486930112, 486741120, 486666496, - 486328800, 485141792, 482780640, 479371488, 475091552, 469790496, 463164992, 455119968, 445847136, 435704576, - 425084736, 414195904, 402933440, 391173280, 379205888, 367657248, 357015936, 347438144, 338942720, 331559680, - 325298144, 320120032, 315899680, 312377280, 309302080, 306654752, 304536800, 302828480, 301160960, 299198144, - 296754848, 293748384, 290283968, 286679392, 283180064, 279745728, 276271616, 272813632, 269422752, 266000752, - 262489616, 258998336, 255647728, 252489856, 249618672, 247114160, 244883472, 242755840, 240685136, 238706224, - 236819664, 235067312, 233545296, 232212240, 230879728, 229424800, 227802912, 225917968, 223729680, 221395904, - 219032592, 216511984, 213710592, 210693920, 207425440, 203653920, 199291312, 194540000, 189516512, 184160688, - 178572928, 172972288, 167346416, 161570224, 155748928, 150033952, 144372112, 138797232, 133573480, 128747016, - 124037584, 119380760, 114943528, 110526152, 105692704, 100490960, 95319816, 90263032, 85287848, 80689552, - 76599128, 72645616, 68697464, 65106336, 61799212, 58229020, 54474680, 51085416, 47885128, 44364864, - 40817220, 37582036, 34133716, 30340722, 26945014, 23608898, 19145354, 14457397, 11223286, 7551090, - 877247, -5522254, -7752953, -11690901, -25166898, -40288404, -40982576, -30000884, -27510876, -38634840, - -47277388, -50246824, -68518152, -108822664, -141658752, -139589120, -116141288, -105104832, -118624312, -144289968, - -167411376, -181297008, -192171328, -222071824, -281490016, -330403776, -302403264, -188827168, -66482336, -14287209, - -28991566, -52163988, -55246700, -60433948, -89120032, -125949376, -137805104, -106897440, -40123048, }, + -152898688, -60698088, 183234576, 462790784, 646732928, 670164672, 552847104, 356891904, 137474384, -73971688, + -261569408, -416582848, -535674240, -619246208, -668629760, -685797824, -674825792, -641893568, -594021376, -537820096, + -477885440, -415636320, -350830656, -284640896, -220209952, -160159328, -104857328, -53330608, -4641786, 41893112, + 86666000, 129419176, 169462768, 206496656, 240911696, 273358560, 304294688, 333708768, 360983936, 385256416, + 406153568, 423995424, 439282816, 452334144, 463416768, 472780864, 480480672, 486499008, 491077984, 494679840, + 497635328, 500009344, 501677952, 502400032, 501986112, 500507040, 498200096, 495197920, 491626656, 487864256, + 484330592, 481093248, 478047040, 475357312, 473303776, 471816640, 470609760, 469671328, 469199392, 469178464, + 469423808, 469963360, 470982880, 472453376, 474128416, 475874848, 477738336, 479691488, 481542592, 483125312, + 484456192, 485635712, 486656832, 487370336, 487655968, 487559840, 487253824, 486930112, 486741120, 486666496, + 486328800, 485141792, 482780640, 479371488, 475091552, 469790496, 463164992, 455119968, 445847136, 435704576, + 425084736, 414195904, 402933440, 391173280, 379205888, 367657248, 357015936, 347438144, 338942720, 331559680, + 325298144, 320120032, 315899680, 312377280, 309302080, 306654752, 304536800, 302828480, 301160960, 299198144, + 296754848, 293748384, 290283968, 286679392, 283180064, 279745728, 276271616, 272813632, 269422752, 266000752, + 262489616, 258998336, 255647728, 252489856, 249618672, 247114160, 244883472, 242755840, 240685136, 238706224, + 236819664, 235067312, 233545296, 232212240, 230879728, 229424800, 227802912, 225917968, 223729680, 221395904, + 219032592, 216511984, 213710592, 210693920, 207425440, 203653920, 199291312, 194540000, 189516512, 184160688, + 178572928, 172972288, 167346416, 161570224, 155748928, 150033952, 144372112, 138797232, 133573480, 128747016, + 124037584, 119380760, 114943528, 110526152, 105692704, 100490960, 95319816, 90263032, 85287848, 80689552, + 76599128, 72645616, 68697464, 65106336, 61799212, 58229020, 54474680, 51085416, 47885128, 44364864, + 40817220, 37582036, 34133716, 30340722, 26945014, 23608898, 19145354, 14457397, 11223286, 7551090, + 877247, -5522254, -7752953, -11690901, -25166898, -40288404, -40982576, -30000884, -27510876, -38634840, + -47277388, -50246824, -68518152, -108822664, -141658752, -139589120, -116141288, -105104832, -118624312, -144289968, + -167411376, -181297008, -192171328, -222071824, -281490016, -330403776, -302403264, -188827168, -66482336, -14287209, + -28991566, -52163988, -55246700, -60433948, -89120032, -125949376, -137805104, -106897440, -40123048, }, }, { { -13802414, - -47165184, -74663712, -61562988, -5680631, 44969380, 48283484, 14860050, -17733384, -32172526, -32605782, - -20424180, 4682051, 29864518, 39075612, 35302484, 35977332, 47849692, 60231548, 62271120, 54360864, - 41108744, 23409720, 1344325, -21242908, -39104604, -50457276, -57920320, -65591668, -75411576, -85669032, - -93073016, -96052648, -95194192, -91170344, -84228600, -75784160, -68624448, -64906084, -64931316, -67952824, - -73216848, -80197776, -88596584, -98254896, -108864536, -120063128, -131917240, -144824688, -158827888, -173410384, - -187899456, -201657312, -214070304, -224739536, -233464752, -239878224, -243509072, -244260688, -242253872, -237237344, - -228833168, -217214752, -202791168, -185459904, -165003520, -141917536, -117023360, -90644744, -62943284, -34586836, - -6352794, 21360482, 47988208, 72470056, 94116152, 113059648, 129223216, 141668960, 149715584, 154010544, - 155682896, 154889408, 151030912, 144291568, 136228304, 128406640, 120784680, 112138376, 102228272, 92739080, - 85502600, 80518824, 76525576, 72917808, 70152384, 68733432, 68791952, 70391296, 73414416, 77299744, - 81420768, 85580448, 89894200, 94476936, 99248640, 103607496, 106430904, 106961328, 105525200, 102881648, - 99245416, 94438816, 88469880, 81362248, 72924784, 63197760, 52652540, 41703060, 30578556, 19728932, - 9671193, 468151, -7982197, -15341086, -21146272, -25388626, -28208808, -29520920, -29410862, -28273770, - -26246546, -23247584, -19720342, -16474958, -13775571, -11426224, -9436580, -7648263, -5215701, -1505386, - 3038689, 7768522, 12746926, 18064096, 23278186, 28182502, 33059438, 37783900, 41834592, 45306000, - 48689896, 51856900, 54507428, 57112328, 60180008, 63370632, 66406636, 69755104, 73511048, 76987824, - 80063024, 83345984, 86687472, 89292904, 91239600, 93041336, 94253592, 94427000, 94436664, 95038496, - 95600600, 95852936, 96855272, 98945848, 101201776, 103691784, 107325328, 111333608, 114234856, 116669568, - 119715768, 122031832, 122400664, 122425360, 123050280, 122258928, 119496192, 117220392, 115557168, 112020800, - 107722072, 105553656, 102967544, 96880504, 92161944, 92340184, 89240832, 78376176, 72368592, 77343768, - 74270184, 53761180, 44733160, 64812668, 69371240, 11631308, -66325568, -77721728, -18441516, 31005906, - 32542968, 30531848, 48058000, 36233416, -32217086, -97196184, -92901752, -39170100, -446140, 4465156, - 5751498, 25180856, 52560736, 61572652, 29836600, -35614404, -84488984, -65874060, 5120138, 56609280, - 47454020, 10870025, -4068408, 2501819, 12885, -17770964, -29529510, -23487028, -8164196, }, + -47165184, -74663712, -61562988, -5680631, 44969380, 48283484, 14860050, -17733384, -32172526, -32605782, + -20424180, 4682051, 29864518, 39075612, 35302484, 35977332, 47849692, 60231548, 62271120, 54360864, + 41108744, 23409720, 1344325, -21242908, -39104604, -50457276, -57920320, -65591668, -75411576, -85669032, + -93073016, -96052648, -95194192, -91170344, -84228600, -75784160, -68624448, -64906084, -64931316, -67952824, + -73216848, -80197776, -88596584, -98254896, -108864536, -120063128, -131917240, -144824688, -158827888, -173410384, + -187899456, -201657312, -214070304, -224739536, -233464752, -239878224, -243509072, -244260688, -242253872, -237237344, + -228833168, -217214752, -202791168, -185459904, -165003520, -141917536, -117023360, -90644744, -62943284, -34586836, + -6352794, 21360482, 47988208, 72470056, 94116152, 113059648, 129223216, 141668960, 149715584, 154010544, + 155682896, 154889408, 151030912, 144291568, 136228304, 128406640, 120784680, 112138376, 102228272, 92739080, + 85502600, 80518824, 76525576, 72917808, 70152384, 68733432, 68791952, 70391296, 73414416, 77299744, + 81420768, 85580448, 89894200, 94476936, 99248640, 103607496, 106430904, 106961328, 105525200, 102881648, + 99245416, 94438816, 88469880, 81362248, 72924784, 63197760, 52652540, 41703060, 30578556, 19728932, + 9671193, 468151, -7982197, -15341086, -21146272, -25388626, -28208808, -29520920, -29410862, -28273770, + -26246546, -23247584, -19720342, -16474958, -13775571, -11426224, -9436580, -7648263, -5215701, -1505386, + 3038689, 7768522, 12746926, 18064096, 23278186, 28182502, 33059438, 37783900, 41834592, 45306000, + 48689896, 51856900, 54507428, 57112328, 60180008, 63370632, 66406636, 69755104, 73511048, 76987824, + 80063024, 83345984, 86687472, 89292904, 91239600, 93041336, 94253592, 94427000, 94436664, 95038496, + 95600600, 95852936, 96855272, 98945848, 101201776, 103691784, 107325328, 111333608, 114234856, 116669568, + 119715768, 122031832, 122400664, 122425360, 123050280, 122258928, 119496192, 117220392, 115557168, 112020800, + 107722072, 105553656, 102967544, 96880504, 92161944, 92340184, 89240832, 78376176, 72368592, 77343768, + 74270184, 53761180, 44733160, 64812668, 69371240, 11631308, -66325568, -77721728, -18441516, 31005906, + 32542968, 30531848, 48058000, 36233416, -32217086, -97196184, -92901752, -39170100, -446140, 4465156, + 5751498, 25180856, 52560736, 61572652, 29836600, -35614404, -84488984, -65874060, 5120138, 56609280, + 47454020, 10870025, -4068408, 2501819, 12885, -17770964, -29529510, -23487028, -8164196, }, { -13802414, - -47165184, -74663712, -61562988, -5680631, 44969380, 48283484, 14860050, -17733384, -32172526, -32605782, - -20424180, 4682051, 29864518, 39075612, 35302484, 35977332, 47849692, 60231548, 62271120, 54360864, - 41108744, 23409720, 1344325, -21242908, -39104604, -50457276, -57920320, -65591668, -75411576, -85669032, - -93073016, -96052648, -95194192, -91170344, -84228600, -75784160, -68624448, -64906084, -64931316, -67952824, - -73216848, -80197776, -88596584, -98254896, -108864536, -120063128, -131917240, -144824688, -158827888, -173410384, - -187899456, -201657312, -214070304, -224739536, -233464752, -239878224, -243509072, -244260688, -242253872, -237237344, - -228833168, -217214752, -202791168, -185459904, -165003520, -141917536, -117023360, -90644744, -62943284, -34586836, - -6352794, 21360482, 47988208, 72470056, 94116152, 113059648, 129223216, 141668960, 149715584, 154010544, - 155682896, 154889408, 151030912, 144291568, 136228304, 128406640, 120784680, 112138376, 102228272, 92739080, - 85502600, 80518824, 76525576, 72917808, 70152384, 68733432, 68791952, 70391296, 73414416, 77299744, - 81420768, 85580448, 89894200, 94476936, 99248640, 103607496, 106430904, 106961328, 105525200, 102881648, - 99245416, 94438816, 88469880, 81362248, 72924784, 63197760, 52652540, 41703060, 30578556, 19728932, - 9671193, 468151, -7982197, -15341086, -21146272, -25388626, -28208808, -29520920, -29410862, -28273770, - -26246546, -23247584, -19720342, -16474958, -13775571, -11426224, -9436580, -7648263, -5215701, -1505386, - 3038689, 7768522, 12746926, 18064096, 23278186, 28182502, 33059438, 37783900, 41834592, 45306000, - 48689896, 51856900, 54507428, 57112328, 60180008, 63370632, 66406636, 69755104, 73511048, 76987824, - 80063024, 83345984, 86687472, 89292904, 91239600, 93041336, 94253592, 94427000, 94436664, 95038496, - 95600600, 95852936, 96855272, 98945848, 101201776, 103691784, 107325328, 111333608, 114234856, 116669568, - 119715768, 122031832, 122400664, 122425360, 123050280, 122258928, 119496192, 117220392, 115557168, 112020800, - 107722072, 105553656, 102967544, 96880504, 92161944, 92340184, 89240832, 78376176, 72368592, 77343768, - 74270184, 53761180, 44733160, 64812668, 69371240, 11631308, -66325568, -77721728, -18441516, 31005906, - 32542968, 30531848, 48058000, 36233416, -32217086, -97196184, -92901752, -39170100, -446140, 4465156, - 5751498, 25180856, 52560736, 61572652, 29836600, -35614404, -84488984, -65874060, 5120138, 56609280, - 47454020, 10870025, -4068408, 2501819, 12885, -17770964, -29529510, -23487028, -8164196, }, + -47165184, -74663712, -61562988, -5680631, 44969380, 48283484, 14860050, -17733384, -32172526, -32605782, + -20424180, 4682051, 29864518, 39075612, 35302484, 35977332, 47849692, 60231548, 62271120, 54360864, + 41108744, 23409720, 1344325, -21242908, -39104604, -50457276, -57920320, -65591668, -75411576, -85669032, + -93073016, -96052648, -95194192, -91170344, -84228600, -75784160, -68624448, -64906084, -64931316, -67952824, + -73216848, -80197776, -88596584, -98254896, -108864536, -120063128, -131917240, -144824688, -158827888, -173410384, + -187899456, -201657312, -214070304, -224739536, -233464752, -239878224, -243509072, -244260688, -242253872, -237237344, + -228833168, -217214752, -202791168, -185459904, -165003520, -141917536, -117023360, -90644744, -62943284, -34586836, + -6352794, 21360482, 47988208, 72470056, 94116152, 113059648, 129223216, 141668960, 149715584, 154010544, + 155682896, 154889408, 151030912, 144291568, 136228304, 128406640, 120784680, 112138376, 102228272, 92739080, + 85502600, 80518824, 76525576, 72917808, 70152384, 68733432, 68791952, 70391296, 73414416, 77299744, + 81420768, 85580448, 89894200, 94476936, 99248640, 103607496, 106430904, 106961328, 105525200, 102881648, + 99245416, 94438816, 88469880, 81362248, 72924784, 63197760, 52652540, 41703060, 30578556, 19728932, + 9671193, 468151, -7982197, -15341086, -21146272, -25388626, -28208808, -29520920, -29410862, -28273770, + -26246546, -23247584, -19720342, -16474958, -13775571, -11426224, -9436580, -7648263, -5215701, -1505386, + 3038689, 7768522, 12746926, 18064096, 23278186, 28182502, 33059438, 37783900, 41834592, 45306000, + 48689896, 51856900, 54507428, 57112328, 60180008, 63370632, 66406636, 69755104, 73511048, 76987824, + 80063024, 83345984, 86687472, 89292904, 91239600, 93041336, 94253592, 94427000, 94436664, 95038496, + 95600600, 95852936, 96855272, 98945848, 101201776, 103691784, 107325328, 111333608, 114234856, 116669568, + 119715768, 122031832, 122400664, 122425360, 123050280, 122258928, 119496192, 117220392, 115557168, 112020800, + 107722072, 105553656, 102967544, 96880504, 92161944, 92340184, 89240832, 78376176, 72368592, 77343768, + 74270184, 53761180, 44733160, 64812668, 69371240, 11631308, -66325568, -77721728, -18441516, 31005906, + 32542968, 30531848, 48058000, 36233416, -32217086, -97196184, -92901752, -39170100, -446140, 4465156, + 5751498, 25180856, 52560736, 61572652, 29836600, -35614404, -84488984, -65874060, 5120138, 56609280, + 47454020, 10870025, -4068408, 2501819, 12885, -17770964, -29529510, -23487028, -8164196, }, }, { { 2309082, - -7234873, -37503116, -60254632, -48443472, -12577275, 10147397, -2160369, -35461936, -59278600, -56376276, - -31350576, 663036, 27338540, 45566920, 60905320, 80859200, 106576392, 131569344, 148690160, 155850944, - 154335888, 145383568, 131094216, 115861040, 103072232, 91095184, 75183400, 53037476, 26343718, -2804077, - -34502548, -69370168, -106144752, -142213344, -175659328, -205599552, -230928576, -250000912, -261924288, -267514720, - -268606720, -266771696, -262940576, -257793056, -251920240, -245549184, -238379280, -229870944, -219733216, -208211968, - -196043248, -184249264, -173954224, -166030016, -160578624, -156850064, -153904784, -151193584, -148343344, -144844544, - -140460464, -135593184, -130700152, -125659472, -120207544, -114529064, -108797968, -102629320, -95687040, -88352312, - -81032072, -73312408, -64610804, -55194624, -45687716, -36024576, -25857314, -15668041, -6466074, 1472100, - 8615168, 14911053, 19421306, 21477520, 21525302, 20476256, 18765248, 16413218, 13526999, 10101763, - 5584531, -674310, -8546985, -17314624, -26815092, -37737732, -50499152, -64369748, -78146928, -91418912, - -104832632, -119221312, -134563472, -149674240, -163011728, -174004688, -183435904, -192284608, -200426256, -206776368, - -210514064, -211870192, -211941072, -211923344, -212261584, -212319568, -211092272, -208314496, -204679344, -201145136, - -198363072, -196546288, -195386656, -194201776, -192571840, -190721776, -189060160, -187668592, -186454192, -185362736, - -184190752, -182566704, -180319376, -177512608, -174104560, -169967968, -165173712, -159845792, -153880096, -147178336, - -139914464, -132272104, -124278640, -116138064, -108303504, -101065952, -94503776, -88835496, -84283904, -80689552, - -77795816, -75673032, -74375952, -73611448, -73210936, -73373608, -74038256, -74690552, -75090520, -75417480, - -75559752, -75160856, -74377024, -73704320, -73223288, -72819024, -72660648, -72660648, -72174776, -70936216, - -69346544, -67405216, -64584496, -60988536, -57164940, -52844740, -47495360, -41670308, -36098128, -30372398, - -24268176, -18858128, -14650133, -10692321, -6896107, -4516695, -3376918, -2033130, -936303, -1328756, - -1907502, -1430761, -2157147, -5008469, -6088116, -4768488, -7297150, -14030048, -15298137, -10843182, - -15439871, -29652454, -29951492, -12583717, -16997334, -66874788, -116566488, -107866496, -57849988, -30122216, - -35472672, -31592706, -14981920, -32949378, -91176784, -126126544, -98512592, -49836116, -31690954, -34299608, - -22535694, 5040681, 32548872, 61380452, 87701088, 79558360, 20339354, -48292076, -69578472, -44501768, - -23336704, -32086090, -45628660, -37964828, -24686936, -36248452, -67124968, -75412112, -33794412, }, + -7234873, -37503116, -60254632, -48443472, -12577275, 10147397, -2160369, -35461936, -59278600, -56376276, + -31350576, 663036, 27338540, 45566920, 60905320, 80859200, 106576392, 131569344, 148690160, 155850944, + 154335888, 145383568, 131094216, 115861040, 103072232, 91095184, 75183400, 53037476, 26343718, -2804077, + -34502548, -69370168, -106144752, -142213344, -175659328, -205599552, -230928576, -250000912, -261924288, -267514720, + -268606720, -266771696, -262940576, -257793056, -251920240, -245549184, -238379280, -229870944, -219733216, -208211968, + -196043248, -184249264, -173954224, -166030016, -160578624, -156850064, -153904784, -151193584, -148343344, -144844544, + -140460464, -135593184, -130700152, -125659472, -120207544, -114529064, -108797968, -102629320, -95687040, -88352312, + -81032072, -73312408, -64610804, -55194624, -45687716, -36024576, -25857314, -15668041, -6466074, 1472100, + 8615168, 14911053, 19421306, 21477520, 21525302, 20476256, 18765248, 16413218, 13526999, 10101763, + 5584531, -674310, -8546985, -17314624, -26815092, -37737732, -50499152, -64369748, -78146928, -91418912, + -104832632, -119221312, -134563472, -149674240, -163011728, -174004688, -183435904, -192284608, -200426256, -206776368, + -210514064, -211870192, -211941072, -211923344, -212261584, -212319568, -211092272, -208314496, -204679344, -201145136, + -198363072, -196546288, -195386656, -194201776, -192571840, -190721776, -189060160, -187668592, -186454192, -185362736, + -184190752, -182566704, -180319376, -177512608, -174104560, -169967968, -165173712, -159845792, -153880096, -147178336, + -139914464, -132272104, -124278640, -116138064, -108303504, -101065952, -94503776, -88835496, -84283904, -80689552, + -77795816, -75673032, -74375952, -73611448, -73210936, -73373608, -74038256, -74690552, -75090520, -75417480, + -75559752, -75160856, -74377024, -73704320, -73223288, -72819024, -72660648, -72660648, -72174776, -70936216, + -69346544, -67405216, -64584496, -60988536, -57164940, -52844740, -47495360, -41670308, -36098128, -30372398, + -24268176, -18858128, -14650133, -10692321, -6896107, -4516695, -3376918, -2033130, -936303, -1328756, + -1907502, -1430761, -2157147, -5008469, -6088116, -4768488, -7297150, -14030048, -15298137, -10843182, + -15439871, -29652454, -29951492, -12583717, -16997334, -66874788, -116566488, -107866496, -57849988, -30122216, + -35472672, -31592706, -14981920, -32949378, -91176784, -126126544, -98512592, -49836116, -31690954, -34299608, + -22535694, 5040681, 32548872, 61380452, 87701088, 79558360, 20339354, -48292076, -69578472, -44501768, + -23336704, -32086090, -45628660, -37964828, -24686936, -36248452, -67124968, -75412112, -33794412, }, { 2309082, - -7234873, -37503116, -60254632, -48443472, -12577275, 10147397, -2160369, -35461936, -59278600, -56376276, - -31350576, 663036, 27338540, 45566920, 60905320, 80859200, 106576392, 131569344, 148690160, 155850944, - 154335888, 145383568, 131094216, 115861040, 103072232, 91095184, 75183400, 53037476, 26343718, -2804077, - -34502548, -69370168, -106144752, -142213344, -175659328, -205599552, -230928576, -250000912, -261924288, -267514720, - -268606720, -266771696, -262940576, -257793056, -251920240, -245549184, -238379280, -229870944, -219733216, -208211968, - -196043248, -184249264, -173954224, -166030016, -160578624, -156850064, -153904784, -151193584, -148343344, -144844544, - -140460464, -135593184, -130700152, -125659472, -120207544, -114529064, -108797968, -102629320, -95687040, -88352312, - -81032072, -73312408, -64610804, -55194624, -45687716, -36024576, -25857314, -15668041, -6466074, 1472100, - 8615168, 14911053, 19421306, 21477520, 21525302, 20476256, 18765248, 16413218, 13526999, 10101763, - 5584531, -674310, -8546985, -17314624, -26815092, -37737732, -50499152, -64369748, -78146928, -91418912, - -104832632, -119221312, -134563472, -149674240, -163011728, -174004688, -183435904, -192284608, -200426256, -206776368, - -210514064, -211870192, -211941072, -211923344, -212261584, -212319568, -211092272, -208314496, -204679344, -201145136, - -198363072, -196546288, -195386656, -194201776, -192571840, -190721776, -189060160, -187668592, -186454192, -185362736, - -184190752, -182566704, -180319376, -177512608, -174104560, -169967968, -165173712, -159845792, -153880096, -147178336, - -139914464, -132272104, -124278640, -116138064, -108303504, -101065952, -94503776, -88835496, -84283904, -80689552, - -77795816, -75673032, -74375952, -73611448, -73210936, -73373608, -74038256, -74690552, -75090520, -75417480, - -75559752, -75160856, -74377024, -73704320, -73223288, -72819024, -72660648, -72660648, -72174776, -70936216, - -69346544, -67405216, -64584496, -60988536, -57164940, -52844740, -47495360, -41670308, -36098128, -30372398, - -24268176, -18858128, -14650133, -10692321, -6896107, -4516695, -3376918, -2033130, -936303, -1328756, - -1907502, -1430761, -2157147, -5008469, -6088116, -4768488, -7297150, -14030048, -15298137, -10843182, - -15439871, -29652454, -29951492, -12583717, -16997334, -66874788, -116566488, -107866496, -57849988, -30122216, - -35472672, -31592706, -14981920, -32949378, -91176784, -126126544, -98512592, -49836116, -31690954, -34299608, - -22535694, 5040681, 32548872, 61380452, 87701088, 79558360, 20339354, -48292076, -69578472, -44501768, - -23336704, -32086090, -45628660, -37964828, -24686936, -36248452, -67124968, -75412112, -33794412, }, + -7234873, -37503116, -60254632, -48443472, -12577275, 10147397, -2160369, -35461936, -59278600, -56376276, + -31350576, 663036, 27338540, 45566920, 60905320, 80859200, 106576392, 131569344, 148690160, 155850944, + 154335888, 145383568, 131094216, 115861040, 103072232, 91095184, 75183400, 53037476, 26343718, -2804077, + -34502548, -69370168, -106144752, -142213344, -175659328, -205599552, -230928576, -250000912, -261924288, -267514720, + -268606720, -266771696, -262940576, -257793056, -251920240, -245549184, -238379280, -229870944, -219733216, -208211968, + -196043248, -184249264, -173954224, -166030016, -160578624, -156850064, -153904784, -151193584, -148343344, -144844544, + -140460464, -135593184, -130700152, -125659472, -120207544, -114529064, -108797968, -102629320, -95687040, -88352312, + -81032072, -73312408, -64610804, -55194624, -45687716, -36024576, -25857314, -15668041, -6466074, 1472100, + 8615168, 14911053, 19421306, 21477520, 21525302, 20476256, 18765248, 16413218, 13526999, 10101763, + 5584531, -674310, -8546985, -17314624, -26815092, -37737732, -50499152, -64369748, -78146928, -91418912, + -104832632, -119221312, -134563472, -149674240, -163011728, -174004688, -183435904, -192284608, -200426256, -206776368, + -210514064, -211870192, -211941072, -211923344, -212261584, -212319568, -211092272, -208314496, -204679344, -201145136, + -198363072, -196546288, -195386656, -194201776, -192571840, -190721776, -189060160, -187668592, -186454192, -185362736, + -184190752, -182566704, -180319376, -177512608, -174104560, -169967968, -165173712, -159845792, -153880096, -147178336, + -139914464, -132272104, -124278640, -116138064, -108303504, -101065952, -94503776, -88835496, -84283904, -80689552, + -77795816, -75673032, -74375952, -73611448, -73210936, -73373608, -74038256, -74690552, -75090520, -75417480, + -75559752, -75160856, -74377024, -73704320, -73223288, -72819024, -72660648, -72660648, -72174776, -70936216, + -69346544, -67405216, -64584496, -60988536, -57164940, -52844740, -47495360, -41670308, -36098128, -30372398, + -24268176, -18858128, -14650133, -10692321, -6896107, -4516695, -3376918, -2033130, -936303, -1328756, + -1907502, -1430761, -2157147, -5008469, -6088116, -4768488, -7297150, -14030048, -15298137, -10843182, + -15439871, -29652454, -29951492, -12583717, -16997334, -66874788, -116566488, -107866496, -57849988, -30122216, + -35472672, -31592706, -14981920, -32949378, -91176784, -126126544, -98512592, -49836116, -31690954, -34299608, + -22535694, 5040681, 32548872, 61380452, 87701088, 79558360, 20339354, -48292076, -69578472, -44501768, + -23336704, -32086090, -45628660, -37964828, -24686936, -36248452, -67124968, -75412112, -33794412, }, }, }; const Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160] ={ { { 542228352, - 417208832, 222760096, 30935576, -113568600, -207234320, -268353856, -310141728, -330854752, -322319584, -281589344, - -214183040, -130122480, -39506720, 49225692, 129657008, 198014640, 253733776, 298617792, 334531776, 361652896, - 379196768, 387664832, 389500928, 387146208, 381105856, 370570304, 355496576, 337296672, 317647744, 297440448, - 277059744, 257007616, 237758112, 219289760, 201218144, 183405312, 166167456, 149848720, 134395440, 119433376, - 104629696, 89868968, 75175888, 60615948, 46289012, 32301376, 18699750, 5448166, -7515656, -20201378, - -32552094, -44502304, -56018184, -67078800, -77631536, -87627000, -97096328, -106124880, -114741128, -122914984, - -130664720, -138069776, -145147344, -151816896, -158036544, -163882000, -169452560, -174786912, -179930672, -184988544, - -190046928, -195118224, -200214736, -205414320, -210807200, -216429840, -222309648, -228507824, -235063568, -241926912, - -249005024, -256238816, -263574096, -270871232, -277919296, -284573248, -290850880, -296859552, -302651328, -308166048, - -313277056, -317860320, -321860544, -325323360, -328355616, -331044256, -333434432, -335579232, -337548992, -339382944, - -341105760, -342814624, -344658784, -346716608, -348950528, -351314912, -353855904, -356685216, -359889280, -363451392, - -367210592, -370939136, -374508800, -377934048, -381254048, -384445728, -387496768, -390440992, -393292288, -396038944, - -398732960, -401455968, -404184864, -406817696, -409322208, -411727392, -414018208, -416174816, -418247136, -420258240, - -422126016, -423831680, -425517984, -427292864, -429124128, -431028960, -433117376, -435350240, -437575552, -439858880, - -442404704, -445151360, -447922144, -450866336, -454171328, -457579904, -460929984, -464710624, -469181152, -473900800, - -479337152, -486478592, -491026976, -480117760, -442511552, -384772160, -330747904, -299777440, -290169600, }, + 417208832, 222760096, 30935576, -113568600, -207234320, -268353856, -310141728, -330854752, -322319584, -281589344, + -214183040, -130122480, -39506720, 49225692, 129657008, 198014640, 253733776, 298617792, 334531776, 361652896, + 379196768, 387664832, 389500928, 387146208, 381105856, 370570304, 355496576, 337296672, 317647744, 297440448, + 277059744, 257007616, 237758112, 219289760, 201218144, 183405312, 166167456, 149848720, 134395440, 119433376, + 104629696, 89868968, 75175888, 60615948, 46289012, 32301376, 18699750, 5448166, -7515656, -20201378, + -32552094, -44502304, -56018184, -67078800, -77631536, -87627000, -97096328, -106124880, -114741128, -122914984, + -130664720, -138069776, -145147344, -151816896, -158036544, -163882000, -169452560, -174786912, -179930672, -184988544, + -190046928, -195118224, -200214736, -205414320, -210807200, -216429840, -222309648, -228507824, -235063568, -241926912, + -249005024, -256238816, -263574096, -270871232, -277919296, -284573248, -290850880, -296859552, -302651328, -308166048, + -313277056, -317860320, -321860544, -325323360, -328355616, -331044256, -333434432, -335579232, -337548992, -339382944, + -341105760, -342814624, -344658784, -346716608, -348950528, -351314912, -353855904, -356685216, -359889280, -363451392, + -367210592, -370939136, -374508800, -377934048, -381254048, -384445728, -387496768, -390440992, -393292288, -396038944, + -398732960, -401455968, -404184864, -406817696, -409322208, -411727392, -414018208, -416174816, -418247136, -420258240, + -422126016, -423831680, -425517984, -427292864, -429124128, -431028960, -433117376, -435350240, -437575552, -439858880, + -442404704, -445151360, -447922144, -450866336, -454171328, -457579904, -460929984, -464710624, -469181152, -473900800, + -479337152, -486478592, -491026976, -480117760, -442511552, -384772160, -330747904, -299777440, -290169600, }, { 542228352, - 417208832, 222760096, 30935576, -113568600, -207234320, -268353856, -310141728, -330854752, -322319584, -281589344, - -214183040, -130122480, -39506720, 49225692, 129657008, 198014640, 253733776, 298617792, 334531776, 361652896, - 379196768, 387664832, 389500928, 387146208, 381105856, 370570304, 355496576, 337296672, 317647744, 297440448, - 277059744, 257007616, 237758112, 219289760, 201218144, 183405312, 166167456, 149848720, 134395440, 119433376, - 104629696, 89868968, 75175888, 60615948, 46289012, 32301376, 18699750, 5448166, -7515656, -20201378, - -32552094, -44502304, -56018184, -67078800, -77631536, -87627000, -97096328, -106124880, -114741128, -122914984, - -130664720, -138069776, -145147344, -151816896, -158036544, -163882000, -169452560, -174786912, -179930672, -184988544, - -190046928, -195118224, -200214736, -205414320, -210807200, -216429840, -222309648, -228507824, -235063568, -241926912, - -249005024, -256238816, -263574096, -270871232, -277919296, -284573248, -290850880, -296859552, -302651328, -308166048, - -313277056, -317860320, -321860544, -325323360, -328355616, -331044256, -333434432, -335579232, -337548992, -339382944, - -341105760, -342814624, -344658784, -346716608, -348950528, -351314912, -353855904, -356685216, -359889280, -363451392, - -367210592, -370939136, -374508800, -377934048, -381254048, -384445728, -387496768, -390440992, -393292288, -396038944, - -398732960, -401455968, -404184864, -406817696, -409322208, -411727392, -414018208, -416174816, -418247136, -420258240, - -422126016, -423831680, -425517984, -427292864, -429124128, -431028960, -433117376, -435350240, -437575552, -439858880, - -442404704, -445151360, -447922144, -450866336, -454171328, -457579904, -460929984, -464710624, -469181152, -473900800, - -479337152, -486478592, -491026976, -480117760, -442511552, -384772160, -330747904, -299777440, -290169600, }, + 417208832, 222760096, 30935576, -113568600, -207234320, -268353856, -310141728, -330854752, -322319584, -281589344, + -214183040, -130122480, -39506720, 49225692, 129657008, 198014640, 253733776, 298617792, 334531776, 361652896, + 379196768, 387664832, 389500928, 387146208, 381105856, 370570304, 355496576, 337296672, 317647744, 297440448, + 277059744, 257007616, 237758112, 219289760, 201218144, 183405312, 166167456, 149848720, 134395440, 119433376, + 104629696, 89868968, 75175888, 60615948, 46289012, 32301376, 18699750, 5448166, -7515656, -20201378, + -32552094, -44502304, -56018184, -67078800, -77631536, -87627000, -97096328, -106124880, -114741128, -122914984, + -130664720, -138069776, -145147344, -151816896, -158036544, -163882000, -169452560, -174786912, -179930672, -184988544, + -190046928, -195118224, -200214736, -205414320, -210807200, -216429840, -222309648, -228507824, -235063568, -241926912, + -249005024, -256238816, -263574096, -270871232, -277919296, -284573248, -290850880, -296859552, -302651328, -308166048, + -313277056, -317860320, -321860544, -325323360, -328355616, -331044256, -333434432, -335579232, -337548992, -339382944, + -341105760, -342814624, -344658784, -346716608, -348950528, -351314912, -353855904, -356685216, -359889280, -363451392, + -367210592, -370939136, -374508800, -377934048, -381254048, -384445728, -387496768, -390440992, -393292288, -396038944, + -398732960, -401455968, -404184864, -406817696, -409322208, -411727392, -414018208, -416174816, -418247136, -420258240, + -422126016, -423831680, -425517984, -427292864, -429124128, -431028960, -433117376, -435350240, -437575552, -439858880, + -442404704, -445151360, -447922144, -450866336, -454171328, -457579904, -460929984, -464710624, -469181152, -473900800, + -479337152, -486478592, -491026976, -480117760, -442511552, -384772160, -330747904, -299777440, -290169600, }, }, { { 67749352, - 219783680, 413881824, 505693216, 413422816, 164215392, -140707424, -402389056, -573466176, -653612416, -660346368, - -611244736, -521953408, -406601856, -276291488, -139582672, -4507032, 121427856, 232758240, 326858272, 404057088, - 467141056, 519165440, 560950656, 591515776, 610986496, 621836608, 627133952, 628743488, 627398080, 623321600, - 616330496, 606132096, 592982528, 577744000, 561221248, 543665536, 524797760, 504082048, 481199552, 456508864, - 430941984, 405336480, 380061120, 355244256, 330986272, 307298464, 284168448, 261772880, 240404352, 220141232, - 200755360, 181926224, 163439616, 145293904, 127723200, 111030272, 95366528, 80797464, 67489504, 55560232, - 44813152, 34916472, 25793426, 17500382, 9822053, 2378875, -4919348, -11912629, -18633178, -25326348, - -32058172, -38705172, -45339824, -52262236, -59613072, -67275296, -75201656, -83548392, -92396560, -101594768, - -110973904, -120557048, -130451576, -140654272, -151033056, -161435472, -171772928, -182076016, -192575600, -203677008, - -215695936, -228556688, -241831360, -255146832, -268460160, -281857760, -295178080, -307964192, -319747424, -330286208, - -339607360, -347886432, -355202400, -361324320, -365856064, -368671392, -370090880, -370577280, -370416224, -369777344, - -368903872, -368102848, -367618048, -367569728, -367946080, -368677312, -369823520, -371629024, -374272032, -377629088, - -381383424, -385236032, -388935584, -392324864, -395482208, -398631488, -401827488, -404948320, -408002560, -411121248, - -414235648, -417136352, -419830368, -422491104, -425155040, -427839936, -430786304, -434164288, -437787616, -441505984, - -445513728, -449924128, -454603488, -459719328, -465710816, -472510816, -479760736, -487769248, -496962624, -506955392, - -518123904, -532091680, -545398016, -543641408, -511176800, -451464416, -390454400, -352648480, -339506976, }, + 219783680, 413881824, 505693216, 413422816, 164215392, -140707424, -402389056, -573466176, -653612416, -660346368, + -611244736, -521953408, -406601856, -276291488, -139582672, -4507032, 121427856, 232758240, 326858272, 404057088, + 467141056, 519165440, 560950656, 591515776, 610986496, 621836608, 627133952, 628743488, 627398080, 623321600, + 616330496, 606132096, 592982528, 577744000, 561221248, 543665536, 524797760, 504082048, 481199552, 456508864, + 430941984, 405336480, 380061120, 355244256, 330986272, 307298464, 284168448, 261772880, 240404352, 220141232, + 200755360, 181926224, 163439616, 145293904, 127723200, 111030272, 95366528, 80797464, 67489504, 55560232, + 44813152, 34916472, 25793426, 17500382, 9822053, 2378875, -4919348, -11912629, -18633178, -25326348, + -32058172, -38705172, -45339824, -52262236, -59613072, -67275296, -75201656, -83548392, -92396560, -101594768, + -110973904, -120557048, -130451576, -140654272, -151033056, -161435472, -171772928, -182076016, -192575600, -203677008, + -215695936, -228556688, -241831360, -255146832, -268460160, -281857760, -295178080, -307964192, -319747424, -330286208, + -339607360, -347886432, -355202400, -361324320, -365856064, -368671392, -370090880, -370577280, -370416224, -369777344, + -368903872, -368102848, -367618048, -367569728, -367946080, -368677312, -369823520, -371629024, -374272032, -377629088, + -381383424, -385236032, -388935584, -392324864, -395482208, -398631488, -401827488, -404948320, -408002560, -411121248, + -414235648, -417136352, -419830368, -422491104, -425155040, -427839936, -430786304, -434164288, -437787616, -441505984, + -445513728, -449924128, -454603488, -459719328, -465710816, -472510816, -479760736, -487769248, -496962624, -506955392, + -518123904, -532091680, -545398016, -543641408, -511176800, -451464416, -390454400, -352648480, -339506976, }, { -67749352, - -219783680, -413881824, -505693216, -413422816, -164215392, 140707424, 402389056, 573466176, 653612416, 660346368, - 611244736, 521953408, 406601856, 276291488, 139582672, 4507032, -121427856, -232758240, -326858272, -404057088, - -467141056, -519165440, -560950656, -591515776, -610986496, -621836608, -627133952, -628743488, -627398080, -623321600, - -616330496, -606132096, -592982528, -577744000, -561221248, -543665536, -524797760, -504082048, -481199552, -456508864, - -430941984, -405336480, -380061120, -355244256, -330986272, -307298464, -284168448, -261772880, -240404352, -220141232, - -200755360, -181926224, -163439616, -145293904, -127723200, -111030272, -95366528, -80797464, -67489504, -55560232, - -44813152, -34916472, -25793426, -17500382, -9822053, -2378875, 4919348, 11912629, 18633178, 25326348, - 32058172, 38705172, 45339824, 52262236, 59613072, 67275296, 75201656, 83548392, 92396560, 101594768, - 110973904, 120557048, 130451576, 140654272, 151033056, 161435472, 171772928, 182076016, 192575600, 203677008, - 215695936, 228556688, 241831360, 255146832, 268460160, 281857760, 295178080, 307964192, 319747424, 330286208, - 339607360, 347886432, 355202400, 361324320, 365856064, 368671392, 370090880, 370577280, 370416224, 369777344, - 368903872, 368102848, 367618048, 367569728, 367946080, 368677312, 369823520, 371629024, 374272032, 377629088, - 381383424, 385236032, 388935584, 392324864, 395482208, 398631488, 401827488, 404948320, 408002560, 411121248, - 414235648, 417136352, 419830368, 422491104, 425155040, 427839936, 430786304, 434164288, 437787616, 441505984, - 445513728, 449924128, 454603488, 459719328, 465710816, 472510816, 479760736, 487769248, 496962624, 506955392, - 518123904, 532091680, 545398016, 543641408, 511176800, 451464416, 390454400, 352648480, 339506976, }, + -219783680, -413881824, -505693216, -413422816, -164215392, 140707424, 402389056, 573466176, 653612416, 660346368, + 611244736, 521953408, 406601856, 276291488, 139582672, 4507032, -121427856, -232758240, -326858272, -404057088, + -467141056, -519165440, -560950656, -591515776, -610986496, -621836608, -627133952, -628743488, -627398080, -623321600, + -616330496, -606132096, -592982528, -577744000, -561221248, -543665536, -524797760, -504082048, -481199552, -456508864, + -430941984, -405336480, -380061120, -355244256, -330986272, -307298464, -284168448, -261772880, -240404352, -220141232, + -200755360, -181926224, -163439616, -145293904, -127723200, -111030272, -95366528, -80797464, -67489504, -55560232, + -44813152, -34916472, -25793426, -17500382, -9822053, -2378875, 4919348, 11912629, 18633178, 25326348, + 32058172, 38705172, 45339824, 52262236, 59613072, 67275296, 75201656, 83548392, 92396560, 101594768, + 110973904, 120557048, 130451576, 140654272, 151033056, 161435472, 171772928, 182076016, 192575600, 203677008, + 215695936, 228556688, 241831360, 255146832, 268460160, 281857760, 295178080, 307964192, 319747424, 330286208, + 339607360, 347886432, 355202400, 361324320, 365856064, 368671392, 370090880, 370577280, 370416224, 369777344, + 368903872, 368102848, 367618048, 367569728, 367946080, 368677312, 369823520, 371629024, 374272032, 377629088, + 381383424, 385236032, 388935584, 392324864, 395482208, 398631488, 401827488, 404948320, 408002560, 411121248, + 414235648, 417136352, 419830368, 422491104, 425155040, 427839936, 430786304, 434164288, 437787616, 441505984, + 445513728, 449924128, 454603488, 459719328, 465710816, 472510816, 479760736, 487769248, 496962624, 506955392, + 518123904, 532091680, 545398016, 543641408, 511176800, 451464416, 390454400, 352648480, 339506976, }, }, { { 53941032, - 43702904, 4514011, -51625508, -76724224, -46684684, 5194763, 31938450, 24610700, 3203509, -19339164, - -40128416, -49972480, -40184788, -20243792, -8751533, -8460549, -4931696, 11458436, 35162896, 57057028, - 74803832, 88963272, 97172560, 96759704, 89472760, 80515608, 73936792, 69800736, 65049964, 56818660, - 45163192, 32460826, 20752746, 10919954, 4079145, 1846299, 4584878, 10595147, 17570174, 24138254, - 29859686, 34579856, 38158100, 40441948, 41324028, 40896140, 39342976, 36506684, 31771484, 24495810, - 14389751, 1512902, -13879187, -31491238, -51121920, -72550584, -95323576, -118918520, -143068048, -167566544, - -191847600, -215225104, -237401632, -258206992, -277008224, -292987648, -305829056, -315546400, -321864864, -324374176, - -323030944, -317938720, -309003584, -296401056, -280948320, -263374368, -243707184, -222131408, -199928576, -178637360, - -158576640, -139213856, -120889904, -105102144, -92734784, -82870320, -74046312, -66282084, -61039540, -59164784, - -59612536, -60572996, -61320860, -62394064, -64327336, -66911296, -69582768, -71866080, -73303816, -73477224, - -72325640, -70185672, -67324152, -63525788, -58201640, -50907172, -41873784, -32037772, -22395034, -13316546, - -4615479, 3850975, 11926587, 19372986, 25957172, 31324808, 35078072, 37015100, 37134824, 35510788, - 32312112, 27798638, 22127134, 15321759, 7548405, -763967, -9174050, -17416092, -25295210, -32601486, - -39150236, -44744968, -49178988, -52473764, -55037860, -57417272, -60014116, -63075352, -66614944, -70174400, - -73039144, -74910136, -76040784, -76593224, -76336064, -75163536, -73348376, -71009232, -67909872, -64094872, - -59985124, -55124832, -47452948, -35123168, -19442780, -5198521, 2906619, 4354560, 3023657, }, + 43702904, 4514011, -51625508, -76724224, -46684684, 5194763, 31938450, 24610700, 3203509, -19339164, + -40128416, -49972480, -40184788, -20243792, -8751533, -8460549, -4931696, 11458436, 35162896, 57057028, + 74803832, 88963272, 97172560, 96759704, 89472760, 80515608, 73936792, 69800736, 65049964, 56818660, + 45163192, 32460826, 20752746, 10919954, 4079145, 1846299, 4584878, 10595147, 17570174, 24138254, + 29859686, 34579856, 38158100, 40441948, 41324028, 40896140, 39342976, 36506684, 31771484, 24495810, + 14389751, 1512902, -13879187, -31491238, -51121920, -72550584, -95323576, -118918520, -143068048, -167566544, + -191847600, -215225104, -237401632, -258206992, -277008224, -292987648, -305829056, -315546400, -321864864, -324374176, + -323030944, -317938720, -309003584, -296401056, -280948320, -263374368, -243707184, -222131408, -199928576, -178637360, + -158576640, -139213856, -120889904, -105102144, -92734784, -82870320, -74046312, -66282084, -61039540, -59164784, + -59612536, -60572996, -61320860, -62394064, -64327336, -66911296, -69582768, -71866080, -73303816, -73477224, + -72325640, -70185672, -67324152, -63525788, -58201640, -50907172, -41873784, -32037772, -22395034, -13316546, + -4615479, 3850975, 11926587, 19372986, 25957172, 31324808, 35078072, 37015100, 37134824, 35510788, + 32312112, 27798638, 22127134, 15321759, 7548405, -763967, -9174050, -17416092, -25295210, -32601486, + -39150236, -44744968, -49178988, -52473764, -55037860, -57417272, -60014116, -63075352, -66614944, -70174400, + -73039144, -74910136, -76040784, -76593224, -76336064, -75163536, -73348376, -71009232, -67909872, -64094872, + -59985124, -55124832, -47452948, -35123168, -19442780, -5198521, 2906619, 4354560, 3023657, }, { 53941032, - 43702904, 4514011, -51625508, -76724224, -46684684, 5194763, 31938450, 24610700, 3203509, -19339164, - -40128416, -49972480, -40184788, -20243792, -8751533, -8460549, -4931696, 11458436, 35162896, 57057028, - 74803832, 88963272, 97172560, 96759704, 89472760, 80515608, 73936792, 69800736, 65049964, 56818660, - 45163192, 32460826, 20752746, 10919954, 4079145, 1846299, 4584878, 10595147, 17570174, 24138254, - 29859686, 34579856, 38158100, 40441948, 41324028, 40896140, 39342976, 36506684, 31771484, 24495810, - 14389751, 1512902, -13879187, -31491238, -51121920, -72550584, -95323576, -118918520, -143068048, -167566544, - -191847600, -215225104, -237401632, -258206992, -277008224, -292987648, -305829056, -315546400, -321864864, -324374176, - -323030944, -317938720, -309003584, -296401056, -280948320, -263374368, -243707184, -222131408, -199928576, -178637360, - -158576640, -139213856, -120889904, -105102144, -92734784, -82870320, -74046312, -66282084, -61039540, -59164784, - -59612536, -60572996, -61320860, -62394064, -64327336, -66911296, -69582768, -71866080, -73303816, -73477224, - -72325640, -70185672, -67324152, -63525788, -58201640, -50907172, -41873784, -32037772, -22395034, -13316546, - -4615479, 3850975, 11926587, 19372986, 25957172, 31324808, 35078072, 37015100, 37134824, 35510788, - 32312112, 27798638, 22127134, 15321759, 7548405, -763967, -9174050, -17416092, -25295210, -32601486, - -39150236, -44744968, -49178988, -52473764, -55037860, -57417272, -60014116, -63075352, -66614944, -70174400, - -73039144, -74910136, -76040784, -76593224, -76336064, -75163536, -73348376, -71009232, -67909872, -64094872, - -59985124, -55124832, -47452948, -35123168, -19442780, -5198521, 2906619, 4354560, 3023657, }, + 43702904, 4514011, -51625508, -76724224, -46684684, 5194763, 31938450, 24610700, 3203509, -19339164, + -40128416, -49972480, -40184788, -20243792, -8751533, -8460549, -4931696, 11458436, 35162896, 57057028, + 74803832, 88963272, 97172560, 96759704, 89472760, 80515608, 73936792, 69800736, 65049964, 56818660, + 45163192, 32460826, 20752746, 10919954, 4079145, 1846299, 4584878, 10595147, 17570174, 24138254, + 29859686, 34579856, 38158100, 40441948, 41324028, 40896140, 39342976, 36506684, 31771484, 24495810, + 14389751, 1512902, -13879187, -31491238, -51121920, -72550584, -95323576, -118918520, -143068048, -167566544, + -191847600, -215225104, -237401632, -258206992, -277008224, -292987648, -305829056, -315546400, -321864864, -324374176, + -323030944, -317938720, -309003584, -296401056, -280948320, -263374368, -243707184, -222131408, -199928576, -178637360, + -158576640, -139213856, -120889904, -105102144, -92734784, -82870320, -74046312, -66282084, -61039540, -59164784, + -59612536, -60572996, -61320860, -62394064, -64327336, -66911296, -69582768, -71866080, -73303816, -73477224, + -72325640, -70185672, -67324152, -63525788, -58201640, -50907172, -41873784, -32037772, -22395034, -13316546, + -4615479, 3850975, 11926587, 19372986, 25957172, 31324808, 35078072, 37015100, 37134824, 35510788, + 32312112, 27798638, 22127134, 15321759, 7548405, -763967, -9174050, -17416092, -25295210, -32601486, + -39150236, -44744968, -49178988, -52473764, -55037860, -57417272, -60014116, -63075352, -66614944, -70174400, + -73039144, -74910136, -76040784, -76593224, -76336064, -75163536, -73348376, -71009232, -67909872, -64094872, + -59985124, -55124832, -47452948, -35123168, -19442780, -5198521, 2906619, 4354560, 3023657, }, }, { { 45164804, - 59395104, 59016608, 28177670, -10354629, -20856362, 2749853, 31099858, 32979444, 4588636, -34200288, - -62302260, -71905808, -67962488, -60489784, -56045028, -52616572, -42487964, -20854214, 9752260, 43591772, - 76899776, 107454176, 132692480, 151896352, 168645120, 187650336, 209389312, 230131856, 246830704, 259533056, - 268856352, 273493312, 271391456, 262039168, 246406032, 225373584, 199436800, 169846096, 139058160, 109621528, - 82890720, 58987080, 37622840, 18567144, 1453310, -14353781, -29368986, -43517684, -56170120, -66573068, - -74185896, -78808352, -80779208, -81148576, -81333256, -82338280, -84396648, -87398288, -91276648, -95767032, - -100239704, -104238320, -107920720, -111578952, -115089016, -118263000, -121329072, -124467616, -127275984, -129343480, - -130962144, -132537320, -133660456, -133586904, -132287144, -130116032, -126737504, -121397784, -114174728, -105911208, - -96866544, -86456616, -74579960, -62278100, -50669340, -39919036, -29651380, -19704236, -9961640, 9664, - 10463614, 20870320, 30408368, 38951596, 47011100, 54650236, 61000348, 65122980, 67074504, 67797672, - 67977520, 67164160, 64105608, 57980984, 49299244, 39490612, 29562260, 19283330, 7798050, -5105643, - -18489298, -30955976, -41740104, -51208896, -60412472, -70090112, -80010944, -89225800, -96917008, -102980968, - -107974408, -112707456, -117801824, -123369176, -129046584, -134440528, -139526304, -144577728, -149865360, -155550288, - -161723232, -168367008, -175324864, -182408336, -189498256, -196508720, -203339328, -209896128, -216090000, -221804464, - -226880576, -231135808, -234416624, -236663440, -237896096, -238160768, -237642144, -236757392, -235874768, -235141408, - -234983568, -235941344, -236356880, -230784160, -213989760, -188165200, -163468608, -148763712, -143858320, }, + 59395104, 59016608, 28177670, -10354629, -20856362, 2749853, 31099858, 32979444, 4588636, -34200288, + -62302260, -71905808, -67962488, -60489784, -56045028, -52616572, -42487964, -20854214, 9752260, 43591772, + 76899776, 107454176, 132692480, 151896352, 168645120, 187650336, 209389312, 230131856, 246830704, 259533056, + 268856352, 273493312, 271391456, 262039168, 246406032, 225373584, 199436800, 169846096, 139058160, 109621528, + 82890720, 58987080, 37622840, 18567144, 1453310, -14353781, -29368986, -43517684, -56170120, -66573068, + -74185896, -78808352, -80779208, -81148576, -81333256, -82338280, -84396648, -87398288, -91276648, -95767032, + -100239704, -104238320, -107920720, -111578952, -115089016, -118263000, -121329072, -124467616, -127275984, -129343480, + -130962144, -132537320, -133660456, -133586904, -132287144, -130116032, -126737504, -121397784, -114174728, -105911208, + -96866544, -86456616, -74579960, -62278100, -50669340, -39919036, -29651380, -19704236, -9961640, 9664, + 10463614, 20870320, 30408368, 38951596, 47011100, 54650236, 61000348, 65122980, 67074504, 67797672, + 67977520, 67164160, 64105608, 57980984, 49299244, 39490612, 29562260, 19283330, 7798050, -5105643, + -18489298, -30955976, -41740104, -51208896, -60412472, -70090112, -80010944, -89225800, -96917008, -102980968, + -107974408, -112707456, -117801824, -123369176, -129046584, -134440528, -139526304, -144577728, -149865360, -155550288, + -161723232, -168367008, -175324864, -182408336, -189498256, -196508720, -203339328, -209896128, -216090000, -221804464, + -226880576, -231135808, -234416624, -236663440, -237896096, -238160768, -237642144, -236757392, -235874768, -235141408, + -234983568, -235941344, -236356880, -230784160, -213989760, -188165200, -163468608, -148763712, -143858320, }, { 45164804, - 59395104, 59016608, 28177670, -10354629, -20856362, 2749853, 31099858, 32979444, 4588636, -34200288, - -62302260, -71905808, -67962488, -60489784, -56045028, -52616572, -42487964, -20854214, 9752260, 43591772, - 76899776, 107454176, 132692480, 151896352, 168645120, 187650336, 209389312, 230131856, 246830704, 259533056, - 268856352, 273493312, 271391456, 262039168, 246406032, 225373584, 199436800, 169846096, 139058160, 109621528, - 82890720, 58987080, 37622840, 18567144, 1453310, -14353781, -29368986, -43517684, -56170120, -66573068, - -74185896, -78808352, -80779208, -81148576, -81333256, -82338280, -84396648, -87398288, -91276648, -95767032, - -100239704, -104238320, -107920720, -111578952, -115089016, -118263000, -121329072, -124467616, -127275984, -129343480, - -130962144, -132537320, -133660456, -133586904, -132287144, -130116032, -126737504, -121397784, -114174728, -105911208, - -96866544, -86456616, -74579960, -62278100, -50669340, -39919036, -29651380, -19704236, -9961640, 9664, - 10463614, 20870320, 30408368, 38951596, 47011100, 54650236, 61000348, 65122980, 67074504, 67797672, - 67977520, 67164160, 64105608, 57980984, 49299244, 39490612, 29562260, 19283330, 7798050, -5105643, - -18489298, -30955976, -41740104, -51208896, -60412472, -70090112, -80010944, -89225800, -96917008, -102980968, - -107974408, -112707456, -117801824, -123369176, -129046584, -134440528, -139526304, -144577728, -149865360, -155550288, - -161723232, -168367008, -175324864, -182408336, -189498256, -196508720, -203339328, -209896128, -216090000, -221804464, - -226880576, -231135808, -234416624, -236663440, -237896096, -238160768, -237642144, -236757392, -235874768, -235141408, - -234983568, -235941344, -236356880, -230784160, -213989760, -188165200, -163468608, -148763712, -143858320, }, + 59395104, 59016608, 28177670, -10354629, -20856362, 2749853, 31099858, 32979444, 4588636, -34200288, + -62302260, -71905808, -67962488, -60489784, -56045028, -52616572, -42487964, -20854214, 9752260, 43591772, + 76899776, 107454176, 132692480, 151896352, 168645120, 187650336, 209389312, 230131856, 246830704, 259533056, + 268856352, 273493312, 271391456, 262039168, 246406032, 225373584, 199436800, 169846096, 139058160, 109621528, + 82890720, 58987080, 37622840, 18567144, 1453310, -14353781, -29368986, -43517684, -56170120, -66573068, + -74185896, -78808352, -80779208, -81148576, -81333256, -82338280, -84396648, -87398288, -91276648, -95767032, + -100239704, -104238320, -107920720, -111578952, -115089016, -118263000, -121329072, -124467616, -127275984, -129343480, + -130962144, -132537320, -133660456, -133586904, -132287144, -130116032, -126737504, -121397784, -114174728, -105911208, + -96866544, -86456616, -74579960, -62278100, -50669340, -39919036, -29651380, -19704236, -9961640, 9664, + 10463614, 20870320, 30408368, 38951596, 47011100, 54650236, 61000348, 65122980, 67074504, 67797672, + 67977520, 67164160, 64105608, 57980984, 49299244, 39490612, 29562260, 19283330, 7798050, -5105643, + -18489298, -30955976, -41740104, -51208896, -60412472, -70090112, -80010944, -89225800, -96917008, -102980968, + -107974408, -112707456, -117801824, -123369176, -129046584, -134440528, -139526304, -144577728, -149865360, -155550288, + -161723232, -168367008, -175324864, -182408336, -189498256, -196508720, -203339328, -209896128, -216090000, -221804464, + -226880576, -231135808, -234416624, -236663440, -237896096, -238160768, -237642144, -236757392, -235874768, -235141408, + -234983568, -235941344, -236356880, -230784160, -213989760, -188165200, -163468608, -148763712, -143858320, }, }, }; const Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160] ={ { { -124746248, - -332286592, -439153952, -441538208, -378021536, -291850528, -203384416, -111092552, -9728638, 96636768, 195902592, - 276180352, 330958912, 358995904, 362415232, 345596160, 314441536, 274850528, 230755712, 183491744, 133441952, - 82224464, 32700808, -13212930, -55892020, -96611528, -135351600, -170669120, -201400688, -227661728, -250176480, - -269402368, -285648608, -299537472, -311814080, -322783968, -332288192, -340256960, -347059136, -353240128, -359089344, - -364553600, -369461664, -373696512, -377195296, -379940320, -381985792, -383444480, -384410304, -384898848, -384869856, - -384300800, -383224352, -381696416, -379749728, -377424000, -374818048, -372054752, -369180352, -366176576, -363069152, - -359940256, -356811936, -353631488, -350401696, -347243808, -344273856, -341512704, -338963648, -336672288, -334662240, - -332880896, -331277280, -329867456, -328667552, -327624416, -326662880, -325738368, -324787584, -323680544, -322275008, - -320497440, -318308608, -315630720, -312372448, -308554208, -304337088, -299901472, -295304224, -290483680, -285365696, - -279950272, -274330848, -268670080, -263132240, -257809168, -252722320, -247888864, -243344800, -239099760, -235146240, - -231518064, -228269456, -225366592, -222675808, -220095600, -217629744, -215315296, -213116816, -210895248, -208448720, - -205616720, -202393360, -198915504, -195302896, -191572720, -187729792, -183824608, -179889872, -175917024, -171932912, - -167981008, -164011376, -159920416, -155695248, -151405648, -147074176, -142689552, -138297408, -133931040, -129537288, - -125114008, -120789512, -116638424, -112566264, -108506440, -104497088, -100477536, -96285648, -91947200, -87612504, - -83182776, -78420200, -73369312, -68145560, -62472984, -56077776, -49192944, -41836204, -33221036, -22813792, - -10376641, 7129646, 35794796, 75874352, 112670416, 124075160, 101861056, 60357176, 18902152, }, + -332286592, -439153952, -441538208, -378021536, -291850528, -203384416, -111092552, -9728638, 96636768, 195902592, + 276180352, 330958912, 358995904, 362415232, 345596160, 314441536, 274850528, 230755712, 183491744, 133441952, + 82224464, 32700808, -13212930, -55892020, -96611528, -135351600, -170669120, -201400688, -227661728, -250176480, + -269402368, -285648608, -299537472, -311814080, -322783968, -332288192, -340256960, -347059136, -353240128, -359089344, + -364553600, -369461664, -373696512, -377195296, -379940320, -381985792, -383444480, -384410304, -384898848, -384869856, + -384300800, -383224352, -381696416, -379749728, -377424000, -374818048, -372054752, -369180352, -366176576, -363069152, + -359940256, -356811936, -353631488, -350401696, -347243808, -344273856, -341512704, -338963648, -336672288, -334662240, + -332880896, -331277280, -329867456, -328667552, -327624416, -326662880, -325738368, -324787584, -323680544, -322275008, + -320497440, -318308608, -315630720, -312372448, -308554208, -304337088, -299901472, -295304224, -290483680, -285365696, + -279950272, -274330848, -268670080, -263132240, -257809168, -252722320, -247888864, -243344800, -239099760, -235146240, + -231518064, -228269456, -225366592, -222675808, -220095600, -217629744, -215315296, -213116816, -210895248, -208448720, + -205616720, -202393360, -198915504, -195302896, -191572720, -187729792, -183824608, -179889872, -175917024, -171932912, + -167981008, -164011376, -159920416, -155695248, -151405648, -147074176, -142689552, -138297408, -133931040, -129537288, + -125114008, -120789512, -116638424, -112566264, -108506440, -104497088, -100477536, -96285648, -91947200, -87612504, + -83182776, -78420200, -73369312, -68145560, -62472984, -56077776, -49192944, -41836204, -33221036, -22813792, + -10376641, 7129646, 35794796, 75874352, 112670416, 124075160, 101861056, 60357176, 18902152, }, { -124746248, - -332286592, -439153952, -441538208, -378021536, -291850528, -203384416, -111092552, -9728638, 96636768, 195902592, - 276180352, 330958912, 358995904, 362415232, 345596160, 314441536, 274850528, 230755712, 183491744, 133441952, - 82224464, 32700808, -13212930, -55892020, -96611528, -135351600, -170669120, -201400688, -227661728, -250176480, - -269402368, -285648608, -299537472, -311814080, -322783968, -332288192, -340256960, -347059136, -353240128, -359089344, - -364553600, -369461664, -373696512, -377195296, -379940320, -381985792, -383444480, -384410304, -384898848, -384869856, - -384300800, -383224352, -381696416, -379749728, -377424000, -374818048, -372054752, -369180352, -366176576, -363069152, - -359940256, -356811936, -353631488, -350401696, -347243808, -344273856, -341512704, -338963648, -336672288, -334662240, - -332880896, -331277280, -329867456, -328667552, -327624416, -326662880, -325738368, -324787584, -323680544, -322275008, - -320497440, -318308608, -315630720, -312372448, -308554208, -304337088, -299901472, -295304224, -290483680, -285365696, - -279950272, -274330848, -268670080, -263132240, -257809168, -252722320, -247888864, -243344800, -239099760, -235146240, - -231518064, -228269456, -225366592, -222675808, -220095600, -217629744, -215315296, -213116816, -210895248, -208448720, - -205616720, -202393360, -198915504, -195302896, -191572720, -187729792, -183824608, -179889872, -175917024, -171932912, - -167981008, -164011376, -159920416, -155695248, -151405648, -147074176, -142689552, -138297408, -133931040, -129537288, - -125114008, -120789512, -116638424, -112566264, -108506440, -104497088, -100477536, -96285648, -91947200, -87612504, - -83182776, -78420200, -73369312, -68145560, -62472984, -56077776, -49192944, -41836204, -33221036, -22813792, - -10376641, 7129646, 35794796, 75874352, 112670416, 124075160, 101861056, 60357176, 18902152, }, + -332286592, -439153952, -441538208, -378021536, -291850528, -203384416, -111092552, -9728638, 96636768, 195902592, + 276180352, 330958912, 358995904, 362415232, 345596160, 314441536, 274850528, 230755712, 183491744, 133441952, + 82224464, 32700808, -13212930, -55892020, -96611528, -135351600, -170669120, -201400688, -227661728, -250176480, + -269402368, -285648608, -299537472, -311814080, -322783968, -332288192, -340256960, -347059136, -353240128, -359089344, + -364553600, -369461664, -373696512, -377195296, -379940320, -381985792, -383444480, -384410304, -384898848, -384869856, + -384300800, -383224352, -381696416, -379749728, -377424000, -374818048, -372054752, -369180352, -366176576, -363069152, + -359940256, -356811936, -353631488, -350401696, -347243808, -344273856, -341512704, -338963648, -336672288, -334662240, + -332880896, -331277280, -329867456, -328667552, -327624416, -326662880, -325738368, -324787584, -323680544, -322275008, + -320497440, -318308608, -315630720, -312372448, -308554208, -304337088, -299901472, -295304224, -290483680, -285365696, + -279950272, -274330848, -268670080, -263132240, -257809168, -252722320, -247888864, -243344800, -239099760, -235146240, + -231518064, -228269456, -225366592, -222675808, -220095600, -217629744, -215315296, -213116816, -210895248, -208448720, + -205616720, -202393360, -198915504, -195302896, -191572720, -187729792, -183824608, -179889872, -175917024, -171932912, + -167981008, -164011376, -159920416, -155695248, -151405648, -147074176, -142689552, -138297408, -133931040, -129537288, + -125114008, -120789512, -116638424, -112566264, -108506440, -104497088, -100477536, -96285648, -91947200, -87612504, + -83182776, -78420200, -73369312, -68145560, -62472984, -56077776, -49192944, -41836204, -33221036, -22813792, + -10376641, 7129646, 35794796, 75874352, 112670416, 124075160, 101861056, 60357176, 18902152, }, }, { { 75551160, - 153462400, 61649960, -181907440, -461093184, -644651520, -667696128, -550006528, -353678208, -133872520, 77957952, - 265927200, 421319648, 540801856, 624756160, 674512256, 692065792, 681486208, 648934144, 601438208, 545628352, - 486087232, 424217664, 359794784, 294002336, 229964896, 170295456, 115383760, 64259692, 15963320, -30186640, - -74560096, -116906328, -156557456, -193199984, -227206448, -259244224, -289785216, -318798784, -345656832, -369518592, - -390016320, -407445824, -422309088, -434948128, -445623808, -454563232, -461833536, -467435264, -471597088, -474762464, - -477283072, -479235680, -480473696, -480748576, -479894400, -477985824, -475232768, -471772640, -467756288, -463552064, - -459556672, -455851712, -452353472, -449206336, -446673920, -444710592, -443041984, -441627328, -440660416, -440154688, - -439923840, -439966240, -440475744, -441451232, -442630752, -443856960, -445195904, -446641696, -447974208, -449013056, - -449805472, -450459392, -450933984, -451080544, -450812128, -450166784, -449283648, -448369344, -447608064, -446953632, - -446004960, -444204320, -441246144, -437220704, -432293824, -426354976, -419100768, -410395936, -400439136, -389628704, - -378339904, -366740800, -354755712, -342292256, -329602240, -317287488, -305881664, -295553344, -286270304, -278059392, - -270983456, -264992496, -259904576, -255485600, -251535296, -247990880, -244910304, -242226496, -239601728, -236631760, - -233112032, -229034496, -224499008, -219741808, -215028080, -210395952, -205689744, -200887424, -196107136, -191308576, - -186331248, -181236352, -176257936, -171451344, -166762304, -162288016, -158070896, -153847872, -149404736, -144890192, - -140407856, -135756944, -130899328, -126020784, -120862528, -114834544, -107882064, -100117832, -90797216, -79146048, - -64960308, -45236744, -12382391, 36526548, 86974160, 112453520, 99419368, 61046516, 19385872, }, + 153462400, 61649960, -181907440, -461093184, -644651520, -667696128, -550006528, -353678208, -133872520, 77957952, + 265927200, 421319648, 540801856, 624756160, 674512256, 692065792, 681486208, 648934144, 601438208, 545628352, + 486087232, 424217664, 359794784, 294002336, 229964896, 170295456, 115383760, 64259692, 15963320, -30186640, + -74560096, -116906328, -156557456, -193199984, -227206448, -259244224, -289785216, -318798784, -345656832, -369518592, + -390016320, -407445824, -422309088, -434948128, -445623808, -454563232, -461833536, -467435264, -471597088, -474762464, + -477283072, -479235680, -480473696, -480748576, -479894400, -477985824, -475232768, -471772640, -467756288, -463552064, + -459556672, -455851712, -452353472, -449206336, -446673920, -444710592, -443041984, -441627328, -440660416, -440154688, + -439923840, -439966240, -440475744, -441451232, -442630752, -443856960, -445195904, -446641696, -447974208, -449013056, + -449805472, -450459392, -450933984, -451080544, -450812128, -450166784, -449283648, -448369344, -447608064, -446953632, + -446004960, -444204320, -441246144, -437220704, -432293824, -426354976, -419100768, -410395936, -400439136, -389628704, + -378339904, -366740800, -354755712, -342292256, -329602240, -317287488, -305881664, -295553344, -286270304, -278059392, + -270983456, -264992496, -259904576, -255485600, -251535296, -247990880, -244910304, -242226496, -239601728, -236631760, + -233112032, -229034496, -224499008, -219741808, -215028080, -210395952, -205689744, -200887424, -196107136, -191308576, + -186331248, -181236352, -176257936, -171451344, -166762304, -162288016, -158070896, -153847872, -149404736, -144890192, + -140407856, -135756944, -130899328, -126020784, -120862528, -114834544, -107882064, -100117832, -90797216, -79146048, + -64960308, -45236744, -12382391, 36526548, 86974160, 112453520, 99419368, 61046516, 19385872, }, { -75551160, - -153462400, -61649960, 181907440, 461093184, 644651520, 667696128, 550006528, 353678208, 133872520, -77957952, - -265927200, -421319648, -540801856, -624756160, -674512256, -692065792, -681486208, -648934144, -601438208, -545628352, - -486087232, -424217664, -359794784, -294002336, -229964896, -170295456, -115383760, -64259692, -15963320, 30186640, - 74560096, 116906328, 156557456, 193199984, 227206448, 259244224, 289785216, 318798784, 345656832, 369518592, - 390016320, 407445824, 422309088, 434948128, 445623808, 454563232, 461833536, 467435264, 471597088, 474762464, - 477283072, 479235680, 480473696, 480748576, 479894400, 477985824, 475232768, 471772640, 467756288, 463552064, - 459556672, 455851712, 452353472, 449206336, 446673920, 444710592, 443041984, 441627328, 440660416, 440154688, - 439923840, 439966240, 440475744, 441451232, 442630752, 443856960, 445195904, 446641696, 447974208, 449013056, - 449805472, 450459392, 450933984, 451080544, 450812128, 450166784, 449283648, 448369344, 447608064, 446953632, - 446004960, 444204320, 441246144, 437220704, 432293824, 426354976, 419100768, 410395936, 400439136, 389628704, - 378339904, 366740800, 354755712, 342292256, 329602240, 317287488, 305881664, 295553344, 286270304, 278059392, - 270983456, 264992496, 259904576, 255485600, 251535296, 247990880, 244910304, 242226496, 239601728, 236631760, - 233112032, 229034496, 224499008, 219741808, 215028080, 210395952, 205689744, 200887424, 196107136, 191308576, - 186331248, 181236352, 176257936, 171451344, 166762304, 162288016, 158070896, 153847872, 149404736, 144890192, - 140407856, 135756944, 130899328, 126020784, 120862528, 114834544, 107882064, 100117832, 90797216, 79146048, - 64960308, 45236744, 12382391, -36526548, -86974160, -112453520, -99419368, -61046516, -19385872, }, + -153462400, -61649960, 181907440, 461093184, 644651520, 667696128, 550006528, 353678208, 133872520, -77957952, + -265927200, -421319648, -540801856, -624756160, -674512256, -692065792, -681486208, -648934144, -601438208, -545628352, + -486087232, -424217664, -359794784, -294002336, -229964896, -170295456, -115383760, -64259692, -15963320, 30186640, + 74560096, 116906328, 156557456, 193199984, 227206448, 259244224, 289785216, 318798784, 345656832, 369518592, + 390016320, 407445824, 422309088, 434948128, 445623808, 454563232, 461833536, 467435264, 471597088, 474762464, + 477283072, 479235680, 480473696, 480748576, 479894400, 477985824, 475232768, 471772640, 467756288, 463552064, + 459556672, 455851712, 452353472, 449206336, 446673920, 444710592, 443041984, 441627328, 440660416, 440154688, + 439923840, 439966240, 440475744, 441451232, 442630752, 443856960, 445195904, 446641696, 447974208, 449013056, + 449805472, 450459392, 450933984, 451080544, 450812128, 450166784, 449283648, 448369344, 447608064, 446953632, + 446004960, 444204320, 441246144, 437220704, 432293824, 426354976, 419100768, 410395936, 400439136, 389628704, + 378339904, 366740800, 354755712, 342292256, 329602240, 317287488, 305881664, 295553344, 286270304, 278059392, + 270983456, 264992496, 259904576, 255485600, 251535296, 247990880, 244910304, 242226496, 239601728, 236631760, + 233112032, 229034496, 224499008, 219741808, 215028080, 210395952, 205689744, 200887424, 196107136, 191308576, + 186331248, 181236352, 176257936, 171451344, 166762304, 162288016, 158070896, 153847872, 149404736, 144890192, + 140407856, 135756944, 130899328, 126020784, 120862528, 114834544, 107882064, 100117832, 90797216, 79146048, + 64960308, 45236744, 12382391, -36526548, -86974160, -112453520, -99419368, -61046516, -19385872, }, }, { { -13823352, - -47267724, -74880608, -61845920, -6009196, 44543644, 47750372, 14274324, -18374406, -32921998, -33450816, - -21314312, 3723200, 28790776, 37921340, 34105800, 34695284, 46452756, 58769112, 60761440, 52750788, - 39390220, 21638046, -484794, -23184234, -41142564, -52540336, -60076392, -67866392, -77767896, -88068840, - -95563024, -98660768, -97868880, -93894424, -87059520, -78726752, -71621264, -67964640, -68108520, -71229352, - -76540072, -83599392, -92124368, -101866424, -112522776, -123819072, -135798272, -148773904, -162830800, -177528720, - -192135904, -205949584, -218430224, -229228848, -238058224, -244521072, -248239440, -249127424, -247208112, -242242064, - -233946864, -222463744, -208111568, -190840432, -170512880, -147554144, -122718488, -96416648, -68859600, -40615360, - -12434467, 15179488, 41655816, 66042640, 87632904, 106451840, 122465624, 134834592, 142813024, 146960352, - 148492048, 147635744, 143687056, 136782896, 128596152, 120716496, 112976968, 104157248, 94144608, 84591528, - 77207944, 72052912, 67976984, 64288680, 61347704, 59770376, 59760176, 61251064, 64079840, 67826664, - 71883256, 75900128, 80009336, 84478784, 89176944, 93355408, 95978024, 96419328, 94885488, 92028264, - 88208424, 83328808, 77226200, 69879656, 61287572, 51490752, 40765684, 29568702, 18323404, 7390028, - -2895345, -12336220, -20874614, -28348932, -34424164, -38874284, -41757284, -43234216, -43418900, -42440184, - -40466644, -37689412, -34455300, -31303332, -28665148, -26590680, -24850144, -23074712, -20723218, -17311940, - -12910672, -8087424, -3198140, 1877975, 7174743, 12360379, 17249662, 22040162, 26753888, 31093416, - 35297652, 40359808, 46330348, 50592032, 49059264, 39942124, 26100516, 12942884, 3613141, }, + -47267724, -74880608, -61845920, -6009196, 44543644, 47750372, 14274324, -18374406, -32921998, -33450816, + -21314312, 3723200, 28790776, 37921340, 34105800, 34695284, 46452756, 58769112, 60761440, 52750788, + 39390220, 21638046, -484794, -23184234, -41142564, -52540336, -60076392, -67866392, -77767896, -88068840, + -95563024, -98660768, -97868880, -93894424, -87059520, -78726752, -71621264, -67964640, -68108520, -71229352, + -76540072, -83599392, -92124368, -101866424, -112522776, -123819072, -135798272, -148773904, -162830800, -177528720, + -192135904, -205949584, -218430224, -229228848, -238058224, -244521072, -248239440, -249127424, -247208112, -242242064, + -233946864, -222463744, -208111568, -190840432, -170512880, -147554144, -122718488, -96416648, -68859600, -40615360, + -12434467, 15179488, 41655816, 66042640, 87632904, 106451840, 122465624, 134834592, 142813024, 146960352, + 148492048, 147635744, 143687056, 136782896, 128596152, 120716496, 112976968, 104157248, 94144608, 84591528, + 77207944, 72052912, 67976984, 64288680, 61347704, 59770376, 59760176, 61251064, 64079840, 67826664, + 71883256, 75900128, 80009336, 84478784, 89176944, 93355408, 95978024, 96419328, 94885488, 92028264, + 88208424, 83328808, 77226200, 69879656, 61287572, 51490752, 40765684, 29568702, 18323404, 7390028, + -2895345, -12336220, -20874614, -28348932, -34424164, -38874284, -41757284, -43234216, -43418900, -42440184, + -40466644, -37689412, -34455300, -31303332, -28665148, -26590680, -24850144, -23074712, -20723218, -17311940, + -12910672, -8087424, -3198140, 1877975, 7174743, 12360379, 17249662, 22040162, 26753888, 31093416, + 35297652, 40359808, 46330348, 50592032, 49059264, 39942124, 26100516, 12942884, 3613141, }, { -13823352, - -47267724, -74880608, -61845920, -6009196, 44543644, 47750372, 14274324, -18374406, -32921998, -33450816, - -21314312, 3723200, 28790776, 37921340, 34105800, 34695284, 46452756, 58769112, 60761440, 52750788, - 39390220, 21638046, -484794, -23184234, -41142564, -52540336, -60076392, -67866392, -77767896, -88068840, - -95563024, -98660768, -97868880, -93894424, -87059520, -78726752, -71621264, -67964640, -68108520, -71229352, - -76540072, -83599392, -92124368, -101866424, -112522776, -123819072, -135798272, -148773904, -162830800, -177528720, - -192135904, -205949584, -218430224, -229228848, -238058224, -244521072, -248239440, -249127424, -247208112, -242242064, - -233946864, -222463744, -208111568, -190840432, -170512880, -147554144, -122718488, -96416648, -68859600, -40615360, - -12434467, 15179488, 41655816, 66042640, 87632904, 106451840, 122465624, 134834592, 142813024, 146960352, - 148492048, 147635744, 143687056, 136782896, 128596152, 120716496, 112976968, 104157248, 94144608, 84591528, - 77207944, 72052912, 67976984, 64288680, 61347704, 59770376, 59760176, 61251064, 64079840, 67826664, - 71883256, 75900128, 80009336, 84478784, 89176944, 93355408, 95978024, 96419328, 94885488, 92028264, - 88208424, 83328808, 77226200, 69879656, 61287572, 51490752, 40765684, 29568702, 18323404, 7390028, - -2895345, -12336220, -20874614, -28348932, -34424164, -38874284, -41757284, -43234216, -43418900, -42440184, - -40466644, -37689412, -34455300, -31303332, -28665148, -26590680, -24850144, -23074712, -20723218, -17311940, - -12910672, -8087424, -3198140, 1877975, 7174743, 12360379, 17249662, 22040162, 26753888, 31093416, - 35297652, 40359808, 46330348, 50592032, 49059264, 39942124, 26100516, 12942884, 3613141, }, + -47267724, -74880608, -61845920, -6009196, 44543644, 47750372, 14274324, -18374406, -32921998, -33450816, + -21314312, 3723200, 28790776, 37921340, 34105800, 34695284, 46452756, 58769112, 60761440, 52750788, + 39390220, 21638046, -484794, -23184234, -41142564, -52540336, -60076392, -67866392, -77767896, -88068840, + -95563024, -98660768, -97868880, -93894424, -87059520, -78726752, -71621264, -67964640, -68108520, -71229352, + -76540072, -83599392, -92124368, -101866424, -112522776, -123819072, -135798272, -148773904, -162830800, -177528720, + -192135904, -205949584, -218430224, -229228848, -238058224, -244521072, -248239440, -249127424, -247208112, -242242064, + -233946864, -222463744, -208111568, -190840432, -170512880, -147554144, -122718488, -96416648, -68859600, -40615360, + -12434467, 15179488, 41655816, 66042640, 87632904, 106451840, 122465624, 134834592, 142813024, 146960352, + 148492048, 147635744, 143687056, 136782896, 128596152, 120716496, 112976968, 104157248, 94144608, 84591528, + 77207944, 72052912, 67976984, 64288680, 61347704, 59770376, 59760176, 61251064, 64079840, 67826664, + 71883256, 75900128, 80009336, 84478784, 89176944, 93355408, 95978024, 96419328, 94885488, 92028264, + 88208424, 83328808, 77226200, 69879656, 61287572, 51490752, 40765684, 29568702, 18323404, 7390028, + -2895345, -12336220, -20874614, -28348932, -34424164, -38874284, -41757284, -43234216, -43418900, -42440184, + -40466644, -37689412, -34455300, -31303332, -28665148, -26590680, -24850144, -23074712, -20723218, -17311940, + -12910672, -8087424, -3198140, 1877975, 7174743, 12360379, 17249662, 22040162, 26753888, 31093416, + 35297652, 40359808, 46330348, 50592032, 49059264, 39942124, 26100516, 12942884, 3613141, }, }, { { 2399276, - -6981470, -37100464, -59681792, -47691316, -11667816, 11209328, -922881, -34048352, -57713088, -54652384, - -29446296, 2738042, 29563870, 47957604, 63478544, 83597240, 109465832, 134631648, 151935008, 159254160, - 157895888, 149123408, 135013376, 119935888, 107310296, 95519000, 79781704, 57790396, 31268436, 2309082, - -29219736, -63930052, -100523712, -136403872, -169684496, -199461504, -224601552, -243487072, -255247760, -260666400, - -261562976, -259544336, -255550016, -250220496, -244148496, -237598672, -230261792, -221560176, -211221120, -199524848, - -187181120, -175184192, -164689440, -156591280, -150953600, -147014048, -143871744, -140983920, -137935024, -134219872, - -129642512, -124592168, -119487064, -114226800, -108583752, -102711992, -96756488, -90368256, -83233784, -75692360, - -68136968, -60199336, -51301236, -41661720, -31911608, -22032108, -11659226, -1228898, 8220568, 16375100, - 23738284, 30291330, 35051228, 37327560, 37614248, 36836860, 35376036, 33252174, 30627412, 27485106, - 23219666, 17203492, 9615895, 1139240, -8105677, -18764176, -31217432, -44790604, -58303644, -71284648, - -84368192, -98453536, -113515984, -128303024, -141292080, -151974736, -161100464, -169590544, -177366048, -183394032, - -186791344, -187751280, -187439888, -187079104, -187031872, -186655520, -185028272, -181873072, -177797152, -173789408, - -170582144, -168336944, -166671040, -164970224, -162876432, -160525472, -158280288, -156321776, -154579632, -152888480, - -151038432, -148774448, -145900032, -142354544, -138143328, -133252968, -127670048, -121401008, -114444232, -106790600, - -98462664, -89550072, -80235360, -70754752, -61323544, -52166136, -43558484, -35611184, -28093382, -20743082, - -13269838, -4217121, 9205726, 27543626, 44898516, 51582020, 43380780, 26081188, 8227547, }, + -6981470, -37100464, -59681792, -47691316, -11667816, 11209328, -922881, -34048352, -57713088, -54652384, + -29446296, 2738042, 29563870, 47957604, 63478544, 83597240, 109465832, 134631648, 151935008, 159254160, + 157895888, 149123408, 135013376, 119935888, 107310296, 95519000, 79781704, 57790396, 31268436, 2309082, + -29219736, -63930052, -100523712, -136403872, -169684496, -199461504, -224601552, -243487072, -255247760, -260666400, + -261562976, -259544336, -255550016, -250220496, -244148496, -237598672, -230261792, -221560176, -211221120, -199524848, + -187181120, -175184192, -164689440, -156591280, -150953600, -147014048, -143871744, -140983920, -137935024, -134219872, + -129642512, -124592168, -119487064, -114226800, -108583752, -102711992, -96756488, -90368256, -83233784, -75692360, + -68136968, -60199336, -51301236, -41661720, -31911608, -22032108, -11659226, -1228898, 8220568, 16375100, + 23738284, 30291330, 35051228, 37327560, 37614248, 36836860, 35376036, 33252174, 30627412, 27485106, + 23219666, 17203492, 9615895, 1139240, -8105677, -18764176, -31217432, -44790604, -58303644, -71284648, + -84368192, -98453536, -113515984, -128303024, -141292080, -151974736, -161100464, -169590544, -177366048, -183394032, + -186791344, -187751280, -187439888, -187079104, -187031872, -186655520, -185028272, -181873072, -177797152, -173789408, + -170582144, -168336944, -166671040, -164970224, -162876432, -160525472, -158280288, -156321776, -154579632, -152888480, + -151038432, -148774448, -145900032, -142354544, -138143328, -133252968, -127670048, -121401008, -114444232, -106790600, + -98462664, -89550072, -80235360, -70754752, -61323544, -52166136, -43558484, -35611184, -28093382, -20743082, + -13269838, -4217121, 9205726, 27543626, 44898516, 51582020, 43380780, 26081188, 8227547, }, { 2399276, - -6981470, -37100464, -59681792, -47691316, -11667816, 11209328, -922881, -34048352, -57713088, -54652384, - -29446296, 2738042, 29563870, 47957604, 63478544, 83597240, 109465832, 134631648, 151935008, 159254160, - 157895888, 149123408, 135013376, 119935888, 107310296, 95519000, 79781704, 57790396, 31268436, 2309082, - -29219736, -63930052, -100523712, -136403872, -169684496, -199461504, -224601552, -243487072, -255247760, -260666400, - -261562976, -259544336, -255550016, -250220496, -244148496, -237598672, -230261792, -221560176, -211221120, -199524848, - -187181120, -175184192, -164689440, -156591280, -150953600, -147014048, -143871744, -140983920, -137935024, -134219872, - -129642512, -124592168, -119487064, -114226800, -108583752, -102711992, -96756488, -90368256, -83233784, -75692360, - -68136968, -60199336, -51301236, -41661720, -31911608, -22032108, -11659226, -1228898, 8220568, 16375100, - 23738284, 30291330, 35051228, 37327560, 37614248, 36836860, 35376036, 33252174, 30627412, 27485106, - 23219666, 17203492, 9615895, 1139240, -8105677, -18764176, -31217432, -44790604, -58303644, -71284648, - -84368192, -98453536, -113515984, -128303024, -141292080, -151974736, -161100464, -169590544, -177366048, -183394032, - -186791344, -187751280, -187439888, -187079104, -187031872, -186655520, -185028272, -181873072, -177797152, -173789408, - -170582144, -168336944, -166671040, -164970224, -162876432, -160525472, -158280288, -156321776, -154579632, -152888480, - -151038432, -148774448, -145900032, -142354544, -138143328, -133252968, -127670048, -121401008, -114444232, -106790600, - -98462664, -89550072, -80235360, -70754752, -61323544, -52166136, -43558484, -35611184, -28093382, -20743082, - -13269838, -4217121, 9205726, 27543626, 44898516, 51582020, 43380780, 26081188, 8227547, }, + -6981470, -37100464, -59681792, -47691316, -11667816, 11209328, -922881, -34048352, -57713088, -54652384, + -29446296, 2738042, 29563870, 47957604, 63478544, 83597240, 109465832, 134631648, 151935008, 159254160, + 157895888, 149123408, 135013376, 119935888, 107310296, 95519000, 79781704, 57790396, 31268436, 2309082, + -29219736, -63930052, -100523712, -136403872, -169684496, -199461504, -224601552, -243487072, -255247760, -260666400, + -261562976, -259544336, -255550016, -250220496, -244148496, -237598672, -230261792, -221560176, -211221120, -199524848, + -187181120, -175184192, -164689440, -156591280, -150953600, -147014048, -143871744, -140983920, -137935024, -134219872, + -129642512, -124592168, -119487064, -114226800, -108583752, -102711992, -96756488, -90368256, -83233784, -75692360, + -68136968, -60199336, -51301236, -41661720, -31911608, -22032108, -11659226, -1228898, 8220568, 16375100, + 23738284, 30291330, 35051228, 37327560, 37614248, 36836860, 35376036, 33252174, 30627412, 27485106, + 23219666, 17203492, 9615895, 1139240, -8105677, -18764176, -31217432, -44790604, -58303644, -71284648, + -84368192, -98453536, -113515984, -128303024, -141292080, -151974736, -161100464, -169590544, -177366048, -183394032, + -186791344, -187751280, -187439888, -187079104, -187031872, -186655520, -185028272, -181873072, -177797152, -173789408, + -170582144, -168336944, -166671040, -164970224, -162876432, -160525472, -158280288, -156321776, -154579632, -152888480, + -151038432, -148774448, -145900032, -142354544, -138143328, -133252968, -127670048, -121401008, -114444232, -106790600, + -98462664, -89550072, -80235360, -70754752, -61323544, -52166136, -43558484, -35611184, -28093382, -20743082, + -13269838, -4217121, 9205726, 27543626, 44898516, 51582020, 43380780, 26081188, 8227547, }, }, }; const Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80] ={ { { 572464896, - 446544000, 252232688, 61201672, -83722336, -178265840, -238997216, -280229984, -301735936, -293937376, -252640720, - -185028800, -102048424, -11938935, 77425912, 157634960, 224741136, 280230496, 325673408, 360901792, 386732288, - 404316960, 413118400, 413817952, 410262784, 404473728, 393900032, 377298368, 358098272, 338798304, 318054688, - 295855616, 275074400, 256112656, 236518480, 216469568, 198215968, 181007632, 162929040, 145482896, 130317360, - 115066472, 97917736, 81350976, 66697084, 51218020, 34267932, 19015430, 5561446, -9485435, -25609280, - -39352100, -51927764, -66678292, -81533512, -93280248, -104763920, -118843352, -131907032, -141742512, -152884192, - -166880960, -178507968, -187327680, -199386336, -213892592, -224269776, -233192032, -248051536, -264364896, -274931584, - -287834752, -310893344, -332552864, -347976096, -380855136, -437410208, -466602016, -425214112, -361132128, }, + 446544000, 252232688, 61201672, -83722336, -178265840, -238997216, -280229984, -301735936, -293937376, -252640720, + -185028800, -102048424, -11938935, 77425912, 157634960, 224741136, 280230496, 325673408, 360901792, 386732288, + 404316960, 413118400, 413817952, 410262784, 404473728, 393900032, 377298368, 358098272, 338798304, 318054688, + 295855616, 275074400, 256112656, 236518480, 216469568, 198215968, 181007632, 162929040, 145482896, 130317360, + 115066472, 97917736, 81350976, 66697084, 51218020, 34267932, 19015430, 5561446, -9485435, -25609280, + -39352100, -51927764, -66678292, -81533512, -93280248, -104763920, -118843352, -131907032, -141742512, -152884192, + -166880960, -178507968, -187327680, -199386336, -213892592, -224269776, -233192032, -248051536, -264364896, -274931584, + -287834752, -310893344, -332552864, -347976096, -380855136, -437410208, -466602016, -425214112, -361132128, }, { 572464896, - 446544000, 252232688, 61201672, -83722336, -178265840, -238997216, -280229984, -301735936, -293937376, -252640720, - -185028800, -102048424, -11938935, 77425912, 157634960, 224741136, 280230496, 325673408, 360901792, 386732288, - 404316960, 413118400, 413817952, 410262784, 404473728, 393900032, 377298368, 358098272, 338798304, 318054688, - 295855616, 275074400, 256112656, 236518480, 216469568, 198215968, 181007632, 162929040, 145482896, 130317360, - 115066472, 97917736, 81350976, 66697084, 51218020, 34267932, 19015430, 5561446, -9485435, -25609280, - -39352100, -51927764, -66678292, -81533512, -93280248, -104763920, -118843352, -131907032, -141742512, -152884192, - -166880960, -178507968, -187327680, -199386336, -213892592, -224269776, -233192032, -248051536, -264364896, -274931584, - -287834752, -310893344, -332552864, -347976096, -380855136, -437410208, -466602016, -425214112, -361132128, }, + 446544000, 252232688, 61201672, -83722336, -178265840, -238997216, -280229984, -301735936, -293937376, -252640720, + -185028800, -102048424, -11938935, 77425912, 157634960, 224741136, 280230496, 325673408, 360901792, 386732288, + 404316960, 413118400, 413817952, 410262784, 404473728, 393900032, 377298368, 358098272, 338798304, 318054688, + 295855616, 275074400, 256112656, 236518480, 216469568, 198215968, 181007632, 162929040, 145482896, 130317360, + 115066472, 97917736, 81350976, 66697084, 51218020, 34267932, 19015430, 5561446, -9485435, -25609280, + -39352100, -51927764, -66678292, -81533512, -93280248, -104763920, -118843352, -131907032, -141742512, -152884192, + -166880960, -178507968, -187327680, -199386336, -213892592, -224269776, -233192032, -248051536, -264364896, -274931584, + -287834752, -310893344, -332552864, -347976096, -380855136, -437410208, -466602016, -425214112, -361132128, }, }, { { 106724032, - 257402224, 451714592, 544733376, 451847200, 201333568, -102984728, -363801440, -536040384, -617267328, -623113856, - -573654080, -485942816, -371313344, -239997936, -103555960, 29695404, 155337696, 267583984, 360738048, 436065344, - 499282432, 551908672, 592087040, 620928768, 640871936, 651791872, 654910016, 655111872, 654414528, 649687360, - 640095616, 628916352, 616357888, 599612352, 580264064, 562188672, 543567808, 520421184, 494704544, 469889824, - 443905824, 414950752, 387043136, 362318624, 336644384, 308771648, 283371200, 260980464, 236863696, 211723632, - 190507040, 171147472, 148254752, 124722632, 105695920, 87316688, 65259344, 44970992, 30302068, 14660871, - -4860829, -20713016, -31747324, -47103980, -66554812, -80329312, -91495152, -111316424, -134142032, -148395408, - -164614288, -196001376, -227258000, -247551712, -288954112, -372055840, -441701408, -434066560, -385475456, }, + 257402224, 451714592, 544733376, 451847200, 201333568, -102984728, -363801440, -536040384, -617267328, -623113856, + -573654080, -485942816, -371313344, -239997936, -103555960, 29695404, 155337696, 267583984, 360738048, 436065344, + 499282432, 551908672, 592087040, 620928768, 640871936, 651791872, 654910016, 655111872, 654414528, 649687360, + 640095616, 628916352, 616357888, 599612352, 580264064, 562188672, 543567808, 520421184, 494704544, 469889824, + 443905824, 414950752, 387043136, 362318624, 336644384, 308771648, 283371200, 260980464, 236863696, 211723632, + 190507040, 171147472, 148254752, 124722632, 105695920, 87316688, 65259344, 44970992, 30302068, 14660871, + -4860829, -20713016, -31747324, -47103980, -66554812, -80329312, -91495152, -111316424, -134142032, -148395408, + -164614288, -196001376, -227258000, -247551712, -288954112, -372055840, -441701408, -434066560, -385475456, }, { -106724032, - -257402224, -451714592, -544733376, -451847200, -201333568, 102984728, 363801440, 536040384, 617267328, 623113856, - 573654080, 485942816, 371313344, 239997936, 103555960, -29695404, -155337696, -267583984, -360738048, -436065344, - -499282432, -551908672, -592087040, -620928768, -640871936, -651791872, -654910016, -655111872, -654414528, -649687360, - -640095616, -628916352, -616357888, -599612352, -580264064, -562188672, -543567808, -520421184, -494704544, -469889824, - -443905824, -414950752, -387043136, -362318624, -336644384, -308771648, -283371200, -260980464, -236863696, -211723632, - -190507040, -171147472, -148254752, -124722632, -105695920, -87316688, -65259344, -44970992, -30302068, -14660871, - 4860829, 20713016, 31747324, 47103980, 66554812, 80329312, 91495152, 111316424, 134142032, 148395408, - 164614288, 196001376, 227258000, 247551712, 288954112, 372055840, 441701408, 434066560, 385475456, }, + -257402224, -451714592, -544733376, -451847200, -201333568, 102984728, 363801440, 536040384, 617267328, 623113856, + 573654080, 485942816, 371313344, 239997936, 103555960, -29695404, -155337696, -267583984, -360738048, -436065344, + -499282432, -551908672, -592087040, -620928768, -640871936, -651791872, -654910016, -655111872, -654414528, -649687360, + -640095616, -628916352, -616357888, -599612352, -580264064, -562188672, -543567808, -520421184, -494704544, -469889824, + -443905824, -414950752, -387043136, -362318624, -336644384, -308771648, -283371200, -260980464, -236863696, -211723632, + -190507040, -171147472, -148254752, -124722632, -105695920, -87316688, -65259344, -44970992, -30302068, -14660871, + 4860829, 20713016, 31747324, 47103980, 66554812, 80329312, 91495152, 111316424, 134142032, 148395408, + 164614288, 196001376, 227258000, 247551712, 288954112, 372055840, 441701408, 434066560, 385475456, }, }, { { 55647208, - 46043660, 6731825, -50016504, -74868256, -44260712, 7266011, 33517388, 26650808, 5660230, -17415556, - -38504920, -47735876, -37747932, -18445810, -7008313, -6036040, -2559801, 13178033, 37095096, 59641528, - 77079096, 90673736, 99350112, 99463928, 91642792, 82303384, 76399416, 72578504, 67134632, 58783068, - 47932372, 35269196, 22805740, 13168370, 7159711, 4658429, 6695854, 13236015, 20955146, 26955752, - 32157494, 37723772, 41839960, 43308840, 43981000, 44657460, 43328704, 39527656, 35013648, 29002840, - 18725520, 4880694, -9757092, -26069378, -46313168, -68515464, -89910848, -112319840, -137518944, -162332576, - -184521456, -206985744, -230567808, -250843264, -266689008, -282178272, -296575008, -304221120, -306310624, -308853248, - -308671232, -298050336, -281906080, -269787296, -252016336, -207995600, -140258592, -77732464, -44070660, }, + 46043660, 6731825, -50016504, -74868256, -44260712, 7266011, 33517388, 26650808, 5660230, -17415556, + -38504920, -47735876, -37747932, -18445810, -7008313, -6036040, -2559801, 13178033, 37095096, 59641528, + 77079096, 90673736, 99350112, 99463928, 91642792, 82303384, 76399416, 72578504, 67134632, 58783068, + 47932372, 35269196, 22805740, 13168370, 7159711, 4658429, 6695854, 13236015, 20955146, 26955752, + 32157494, 37723772, 41839960, 43308840, 43981000, 44657460, 43328704, 39527656, 35013648, 29002840, + 18725520, 4880694, -9757092, -26069378, -46313168, -68515464, -89910848, -112319840, -137518944, -162332576, + -184521456, -206985744, -230567808, -250843264, -266689008, -282178272, -296575008, -304221120, -306310624, -308853248, + -308671232, -298050336, -281906080, -269787296, -252016336, -207995600, -140258592, -77732464, -44070660, }, { 55647208, - 46043660, 6731825, -50016504, -74868256, -44260712, 7266011, 33517388, 26650808, 5660230, -17415556, - -38504920, -47735876, -37747932, -18445810, -7008313, -6036040, -2559801, 13178033, 37095096, 59641528, - 77079096, 90673736, 99350112, 99463928, 91642792, 82303384, 76399416, 72578504, 67134632, 58783068, - 47932372, 35269196, 22805740, 13168370, 7159711, 4658429, 6695854, 13236015, 20955146, 26955752, - 32157494, 37723772, 41839960, 43308840, 43981000, 44657460, 43328704, 39527656, 35013648, 29002840, - 18725520, 4880694, -9757092, -26069378, -46313168, -68515464, -89910848, -112319840, -137518944, -162332576, - -184521456, -206985744, -230567808, -250843264, -266689008, -282178272, -296575008, -304221120, -306310624, -308853248, - -308671232, -298050336, -281906080, -269787296, -252016336, -207995600, -140258592, -77732464, -44070660, }, + 46043660, 6731825, -50016504, -74868256, -44260712, 7266011, 33517388, 26650808, 5660230, -17415556, + -38504920, -47735876, -37747932, -18445810, -7008313, -6036040, -2559801, 13178033, 37095096, 59641528, + 77079096, 90673736, 99350112, 99463928, 91642792, 82303384, 76399416, 72578504, 67134632, 58783068, + 47932372, 35269196, 22805740, 13168370, 7159711, 4658429, 6695854, 13236015, 20955146, 26955752, + 32157494, 37723772, 41839960, 43308840, 43981000, 44657460, 43328704, 39527656, 35013648, 29002840, + 18725520, 4880694, -9757092, -26069378, -46313168, -68515464, -89910848, -112319840, -137518944, -162332576, + -184521456, -206985744, -230567808, -250843264, -266689008, -282178272, -296575008, -304221120, -306310624, -308853248, + -308671232, -298050336, -281906080, -269787296, -252016336, -207995600, -140258592, -77732464, -44070660, }, }, { { 44819596, - 59101436, 58700928, 27790586, -10742787, -21221434, 2320356, 30586072, 32460826, 4057134, -34835944, - -63029180, -72648296, -68759744, -61424476, -57075820, -53681184, -43654048, -22186728, 8320426, 42098732, - 75254808, 105620760, 130752760, 149856784, 166403136, 185202208, 206822544, 227415840, 243862880, 256345120, - 265526160, 269954816, 267554448, 257967008, 242157232, 220848288, 194568464, 164723808, 133708776, 103919416, - 76802072, 52618180, 30959198, 11466489, -6078990, -22204980, -37602440, -52282100, -65415572, -76193792, - -84300008, -89560272, -92070144, -92894240, -93715648, -95483568, -98152888, -101720392, -106421240, -111830208, - -117003496, -121723128, -126485176, -131264936, -135584064, -139702400, -144242720, -148783568, -152498176, -155868656, - -159711040, -163078832, -164956816, -167140800, -170631536, -168793824, -151206464, -119230440, -92601104, }, + 59101436, 58700928, 27790586, -10742787, -21221434, 2320356, 30586072, 32460826, 4057134, -34835944, + -63029180, -72648296, -68759744, -61424476, -57075820, -53681184, -43654048, -22186728, 8320426, 42098732, + 75254808, 105620760, 130752760, 149856784, 166403136, 185202208, 206822544, 227415840, 243862880, 256345120, + 265526160, 269954816, 267554448, 257967008, 242157232, 220848288, 194568464, 164723808, 133708776, 103919416, + 76802072, 52618180, 30959198, 11466489, -6078990, -22204980, -37602440, -52282100, -65415572, -76193792, + -84300008, -89560272, -92070144, -92894240, -93715648, -95483568, -98152888, -101720392, -106421240, -111830208, + -117003496, -121723128, -126485176, -131264936, -135584064, -139702400, -144242720, -148783568, -152498176, -155868656, + -159711040, -163078832, -164956816, -167140800, -170631536, -168793824, -151206464, -119230440, -92601104, }, { 44819596, - 59101436, 58700928, 27790586, -10742787, -21221434, 2320356, 30586072, 32460826, 4057134, -34835944, - -63029180, -72648296, -68759744, -61424476, -57075820, -53681184, -43654048, -22186728, 8320426, 42098732, - 75254808, 105620760, 130752760, 149856784, 166403136, 185202208, 206822544, 227415840, 243862880, 256345120, - 265526160, 269954816, 267554448, 257967008, 242157232, 220848288, 194568464, 164723808, 133708776, 103919416, - 76802072, 52618180, 30959198, 11466489, -6078990, -22204980, -37602440, -52282100, -65415572, -76193792, - -84300008, -89560272, -92070144, -92894240, -93715648, -95483568, -98152888, -101720392, -106421240, -111830208, - -117003496, -121723128, -126485176, -131264936, -135584064, -139702400, -144242720, -148783568, -152498176, -155868656, - -159711040, -163078832, -164956816, -167140800, -170631536, -168793824, -151206464, -119230440, -92601104, }, + 59101436, 58700928, 27790586, -10742787, -21221434, 2320356, 30586072, 32460826, 4057134, -34835944, + -63029180, -72648296, -68759744, -61424476, -57075820, -53681184, -43654048, -22186728, 8320426, 42098732, + 75254808, 105620760, 130752760, 149856784, 166403136, 185202208, 206822544, 227415840, 243862880, 256345120, + 265526160, 269954816, 267554448, 257967008, 242157232, 220848288, 194568464, 164723808, 133708776, 103919416, + 76802072, 52618180, 30959198, 11466489, -6078990, -22204980, -37602440, -52282100, -65415572, -76193792, + -84300008, -89560272, -92070144, -92894240, -93715648, -95483568, -98152888, -101720392, -106421240, -111830208, + -117003496, -121723128, -126485176, -131264936, -135584064, -139702400, -144242720, -148783568, -152498176, -155868656, + -159711040, -163078832, -164956816, -167140800, -170631536, -168793824, -151206464, -119230440, -92601104, }, }, }; const Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80] ={ { { -124641560, - -330995936, -435895168, -437441344, -373644960, -285947648, -195637904, -102814000, -970663, 107208824, 208084192, - 288674400, 344239488, 374285984, 379003488, 362399136, 332406304, 294898912, 251757024, 204752896, 156264864, - 107070312, 58171572, 12713103, -28032714, -66919348, -105292736, -139822128, -168325136, -193051264, -215338928, - -233332688, -247173216, -259894384, -271925120, -281149088, -288219680, -295403552, -301753120, -305660480, -309210816, - -314223552, -318274272, -319749568, -321241536, -323750336, -324336608, -322656192, -322037728, -322309920, -320046464, - -316118720, -313960512, -311962272, -306865216, -301171712, -297990208, -294138688, -287096544, -280967104, -277678752, - -272357312, -263981040, -258198944, -254881616, -247710624, -238365312, -233833584, -230562976, -221124784, -211508880, - -209043040, -203756464, -188322512, -177797680, -174789600, -141778480, -58569396, 18691698, 21820582, }, + -330995936, -435895168, -437441344, -373644960, -285947648, -195637904, -102814000, -970663, 107208824, 208084192, + 288674400, 344239488, 374285984, 379003488, 362399136, 332406304, 294898912, 251757024, 204752896, 156264864, + 107070312, 58171572, 12713103, -28032714, -66919348, -105292736, -139822128, -168325136, -193051264, -215338928, + -233332688, -247173216, -259894384, -271925120, -281149088, -288219680, -295403552, -301753120, -305660480, -309210816, + -314223552, -318274272, -319749568, -321241536, -323750336, -324336608, -322656192, -322037728, -322309920, -320046464, + -316118720, -313960512, -311962272, -306865216, -301171712, -297990208, -294138688, -287096544, -280967104, -277678752, + -272357312, -263981040, -258198944, -254881616, -247710624, -238365312, -233833584, -230562976, -221124784, -211508880, + -209043040, -203756464, -188322512, -177797680, -174789600, -141778480, -58569396, 18691698, 21820582, }, { -124641560, - -330995936, -435895168, -437441344, -373644960, -285947648, -195637904, -102814000, -970663, 107208824, 208084192, - 288674400, 344239488, 374285984, 379003488, 362399136, 332406304, 294898912, 251757024, 204752896, 156264864, - 107070312, 58171572, 12713103, -28032714, -66919348, -105292736, -139822128, -168325136, -193051264, -215338928, - -233332688, -247173216, -259894384, -271925120, -281149088, -288219680, -295403552, -301753120, -305660480, -309210816, - -314223552, -318274272, -319749568, -321241536, -323750336, -324336608, -322656192, -322037728, -322309920, -320046464, - -316118720, -313960512, -311962272, -306865216, -301171712, -297990208, -294138688, -287096544, -280967104, -277678752, - -272357312, -263981040, -258198944, -254881616, -247710624, -238365312, -233833584, -230562976, -221124784, -211508880, - -209043040, -203756464, -188322512, -177797680, -174789600, -141778480, -58569396, 18691698, 21820582, }, + -330995936, -435895168, -437441344, -373644960, -285947648, -195637904, -102814000, -970663, 107208824, 208084192, + 288674400, 344239488, 374285984, 379003488, 362399136, 332406304, 294898912, 251757024, 204752896, 156264864, + 107070312, 58171572, 12713103, -28032714, -66919348, -105292736, -139822128, -168325136, -193051264, -215338928, + -233332688, -247173216, -259894384, -271925120, -281149088, -288219680, -295403552, -301753120, -305660480, -309210816, + -314223552, -318274272, -319749568, -321241536, -323750336, -324336608, -322656192, -322037728, -322309920, -320046464, + -316118720, -313960512, -311962272, -306865216, -301171712, -297990208, -294138688, -287096544, -280967104, -277678752, + -272357312, -263981040, -258198944, -254881616, -247710624, -238365312, -233833584, -230562976, -221124784, -211508880, + -209043040, -203756464, -188322512, -177797680, -174789600, -141778480, -58569396, 18691698, 21820582, }, }, { { 75593568, - 155059056, 65981972, -176542480, -455539808, -637033280, -657530496, -539268608, -342454912, -120152784, 93872416, - 282080576, 438413088, 560683840, 646364096, 696203456, 715256448, 707575488, 676227584, 628872896, 575156800, - 518422432, 457256192, 393254176, 330107968, 268590080, 209222352, 155216352, 107179296, 60949880, 14872935, - -27944668, -66942436, -105086576, -141653920, -173350256, -201999824, -231627056, -260288432, -284058944, -304740288, - -324854688, -341365088, -352426752, -362333632, -372995360, -380162592, -383072960, -386599680, -390847392, -391133536, - -388979616, -389657152, -390702976, -386790784, -381270688, -378934752, -375216384, -366126112, -357851296, -353983680, - -347605664, -336765696, -329902336, -327582528, -320349792, -309751968, -306260704, -305536992, -296023104, -285476800, - -286087776, -284915232, -269088832, -259352672, -266973552, -245536832, -154669296, -45682884, 1611, }, + 155059056, 65981972, -176542480, -455539808, -637033280, -657530496, -539268608, -342454912, -120152784, 93872416, + 282080576, 438413088, 560683840, 646364096, 696203456, 715256448, 707575488, 676227584, 628872896, 575156800, + 518422432, 457256192, 393254176, 330107968, 268590080, 209222352, 155216352, 107179296, 60949880, 14872935, + -27944668, -66942436, -105086576, -141653920, -173350256, -201999824, -231627056, -260288432, -284058944, -304740288, + -324854688, -341365088, -352426752, -362333632, -372995360, -380162592, -383072960, -386599680, -390847392, -391133536, + -388979616, -389657152, -390702976, -386790784, -381270688, -378934752, -375216384, -366126112, -357851296, -353983680, + -347605664, -336765696, -329902336, -327582528, -320349792, -309751968, -306260704, -305536992, -296023104, -285476800, + -286087776, -284915232, -269088832, -259352672, -266973552, -245536832, -154669296, -45682884, 1611, }, { -75593568, - -155059056, -65981972, 176542480, 455539808, 637033280, 657530496, 539268608, 342454912, 120152784, -93872416, - -282080576, -438413088, -560683840, -646364096, -696203456, -715256448, -707575488, -676227584, -628872896, -575156800, - -518422432, -457256192, -393254176, -330107968, -268590080, -209222352, -155216352, -107179296, -60949880, -14872935, - 27944668, 66942436, 105086576, 141653920, 173350256, 201999824, 231627056, 260288432, 284058944, 304740288, - 324854688, 341365088, 352426752, 362333632, 372995360, 380162592, 383072960, 386599680, 390847392, 391133536, - 388979616, 389657152, 390702976, 386790784, 381270688, 378934752, 375216384, 366126112, 357851296, 353983680, - 347605664, 336765696, 329902336, 327582528, 320349792, 309751968, 306260704, 305536992, 296023104, 285476800, - 286087776, 284915232, 269088832, 259352672, 266973552, 245536832, 154669296, 45682884, -1611, }, + -155059056, -65981972, 176542480, 455539808, 637033280, 657530496, 539268608, 342454912, 120152784, -93872416, + -282080576, -438413088, -560683840, -646364096, -696203456, -715256448, -707575488, -676227584, -628872896, -575156800, + -518422432, -457256192, -393254176, -330107968, -268590080, -209222352, -155216352, -107179296, -60949880, -14872935, + 27944668, 66942436, 105086576, 141653920, 173350256, 201999824, 231627056, 260288432, 284058944, 304740288, + 324854688, 341365088, 352426752, 362333632, 372995360, 380162592, 383072960, 386599680, 390847392, 391133536, + 388979616, 389657152, 390702976, 386790784, 381270688, 378934752, 375216384, 366126112, 357851296, 353983680, + 347605664, 336765696, 329902336, 327582528, 320349792, 309751968, 306260704, 305536992, 296023104, 285476800, + 286087776, 284915232, 269088832, 259352672, 266973552, 245536832, 154669296, 45682884, -1611, }, }, { { -13516799, - -47047608, -75309032, -62113280, -5710159, 44517336, 47165720, 14072460, -18145164, -33218350, -34133716, - -21449066, 3812857, 28223304, 37196028, 34013456, 34574488, 45631344, 58047556, 60662120, 52355652, - 38347616, 20948702, -663572, -23905252, -42361264, -53194780, -60423748, -68946576, -79115448, -88714696, - -96179352, -100115152, -99302864, -94590752, -88048976, -80552648, -73115376, -68803768, -69573640, -73409584, - -78094856, -84709640, -94160176, -104377368, -114173656, -125358288, -138490688, -151593024, -164659376, -179687472, - -195560592, -209066656, -220571808, -232225664, -242282320, -247946848, -250888368, -253211952, -252287984, -246004992, - -237357616, -227911360, -214068144, -194943200, -174967840, -154628480, -129406824, -100615512, -74480104, -49318036, - -18799608, 12666395, 36197448, 58251032, 91465624, 125506464, 131118912, 95768640, 34258268, }, + -47047608, -75309032, -62113280, -5710159, 44517336, 47165720, 14072460, -18145164, -33218350, -34133716, + -21449066, 3812857, 28223304, 37196028, 34013456, 34574488, 45631344, 58047556, 60662120, 52355652, + 38347616, 20948702, -663572, -23905252, -42361264, -53194780, -60423748, -68946576, -79115448, -88714696, + -96179352, -100115152, -99302864, -94590752, -88048976, -80552648, -73115376, -68803768, -69573640, -73409584, + -78094856, -84709640, -94160176, -104377368, -114173656, -125358288, -138490688, -151593024, -164659376, -179687472, + -195560592, -209066656, -220571808, -232225664, -242282320, -247946848, -250888368, -253211952, -252287984, -246004992, + -237357616, -227911360, -214068144, -194943200, -174967840, -154628480, -129406824, -100615512, -74480104, -49318036, + -18799608, 12666395, 36197448, 58251032, 91465624, 125506464, 131118912, 95768640, 34258268, }, { -13516799, - -47047608, -75309032, -62113280, -5710159, 44517336, 47165720, 14072460, -18145164, -33218350, -34133716, - -21449066, 3812857, 28223304, 37196028, 34013456, 34574488, 45631344, 58047556, 60662120, 52355652, - 38347616, 20948702, -663572, -23905252, -42361264, -53194780, -60423748, -68946576, -79115448, -88714696, - -96179352, -100115152, -99302864, -94590752, -88048976, -80552648, -73115376, -68803768, -69573640, -73409584, - -78094856, -84709640, -94160176, -104377368, -114173656, -125358288, -138490688, -151593024, -164659376, -179687472, - -195560592, -209066656, -220571808, -232225664, -242282320, -247946848, -250888368, -253211952, -252287984, -246004992, - -237357616, -227911360, -214068144, -194943200, -174967840, -154628480, -129406824, -100615512, -74480104, -49318036, - -18799608, 12666395, 36197448, 58251032, 91465624, 125506464, 131118912, 95768640, 34258268, }, + -47047608, -75309032, -62113280, -5710159, 44517336, 47165720, 14072460, -18145164, -33218350, -34133716, + -21449066, 3812857, 28223304, 37196028, 34013456, 34574488, 45631344, 58047556, 60662120, 52355652, + 38347616, 20948702, -663572, -23905252, -42361264, -53194780, -60423748, -68946576, -79115448, -88714696, + -96179352, -100115152, -99302864, -94590752, -88048976, -80552648, -73115376, -68803768, -69573640, -73409584, + -78094856, -84709640, -94160176, -104377368, -114173656, -125358288, -138490688, -151593024, -164659376, -179687472, + -195560592, -209066656, -220571808, -232225664, -242282320, -247946848, -250888368, -253211952, -252287984, -246004992, + -237357616, -227911360, -214068144, -194943200, -174967840, -154628480, -129406824, -100615512, -74480104, -49318036, + -18799608, 12666395, 36197448, 58251032, 91465624, 125506464, 131118912, 95768640, 34258268, }, }, { { 2524904, - -6667400, -36648956, -59020904, -46782932, -10592463, 12430709, 528281, -32361504, -55874840, -52653616, - -27202712, 5201206, 32166620, 50741816, 66517232, 86834576, 112838992, 138209904, 155768800, 163266208, - 162048048, 153503744, 139643344, 124723168, 112251120, 100708392, 85207320, 63358284, 37009196, 8313983, - -22997940, -57576184, -93972272, -129579160, -162667584, -192314672, -217229248, -235842016, -247436288, -252719104, - -253362272, -251080032, -246946128, -241466288, -235115104, -228319920, -220868160, -211994224, -201354512, -189441344, - -177004736, -164805408, -153993376, -145716960, -140006272, -135824576, -132352104, -129337032, -126228552, -122214368, - -117293944, -112182400, -107019848, -101358544, -95343440, -89495848, -83437256, -76397808, -68776384, -61350388, - -53382684, -43865036, -33872260, -24074902, -10565620, 10658498, 32707786, 38097432, 17067126, }, + -6667400, -36648956, -59020904, -46782932, -10592463, 12430709, 528281, -32361504, -55874840, -52653616, + -27202712, 5201206, 32166620, 50741816, 66517232, 86834576, 112838992, 138209904, 155768800, 163266208, + 162048048, 153503744, 139643344, 124723168, 112251120, 100708392, 85207320, 63358284, 37009196, 8313983, + -22997940, -57576184, -93972272, -129579160, -162667584, -192314672, -217229248, -235842016, -247436288, -252719104, + -253362272, -251080032, -246946128, -241466288, -235115104, -228319920, -220868160, -211994224, -201354512, -189441344, + -177004736, -164805408, -153993376, -145716960, -140006272, -135824576, -132352104, -129337032, -126228552, -122214368, + -117293944, -112182400, -107019848, -101358544, -95343440, -89495848, -83437256, -76397808, -68776384, -61350388, + -53382684, -43865036, -33872260, -24074902, -10565620, 10658498, 32707786, 38097432, 17067126, }, { 2524904, - -6667400, -36648956, -59020904, -46782932, -10592463, 12430709, 528281, -32361504, -55874840, -52653616, - -27202712, 5201206, 32166620, 50741816, 66517232, 86834576, 112838992, 138209904, 155768800, 163266208, - 162048048, 153503744, 139643344, 124723168, 112251120, 100708392, 85207320, 63358284, 37009196, 8313983, - -22997940, -57576184, -93972272, -129579160, -162667584, -192314672, -217229248, -235842016, -247436288, -252719104, - -253362272, -251080032, -246946128, -241466288, -235115104, -228319920, -220868160, -211994224, -201354512, -189441344, - -177004736, -164805408, -153993376, -145716960, -140006272, -135824576, -132352104, -129337032, -126228552, -122214368, - -117293944, -112182400, -107019848, -101358544, -95343440, -89495848, -83437256, -76397808, -68776384, -61350388, - -53382684, -43865036, -33872260, -24074902, -10565620, 10658498, 32707786, 38097432, 17067126, }, + -6667400, -36648956, -59020904, -46782932, -10592463, 12430709, 528281, -32361504, -55874840, -52653616, + -27202712, 5201206, 32166620, 50741816, 66517232, 86834576, 112838992, 138209904, 155768800, 163266208, + 162048048, 153503744, 139643344, 124723168, 112251120, 100708392, 85207320, 63358284, 37009196, 8313983, + -22997940, -57576184, -93972272, -129579160, -162667584, -192314672, -217229248, -235842016, -247436288, -252719104, + -253362272, -251080032, -246946128, -241466288, -235115104, -228319920, -220868160, -211994224, -201354512, -189441344, + -177004736, -164805408, -153993376, -145716960, -140006272, -135824576, -132352104, -129337032, -126228552, -122214368, + -117293944, -112182400, -107019848, -101358544, -95343440, -89495848, -83437256, -76397808, -68776384, -61350388, + -53382684, -43865036, -33872260, -24074902, -10565620, 10658498, 32707786, 38097432, 17067126, }, }, }; //BRIR coeff diffuse tables in Q31 const Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS][2885] ={ { -77309, - -23622, -40802, -27917, -64425, -12885, -103079, -27917, -339302, 229781, -17180, - 231928, -47245, 98784, 642098, -79457, -753767, -760209, -242666, -472446, 68719, - -386547, -1015760, 279173, -249108, -195421, 283468, 73014, -339302, -560493, -700080, - 79457, -418759, -279173, 163209, -775242, 689342, 691490, -397284, -70867, -251256, - -738734, 77309, -674310, -502511, 478889, -322123, 1037235, 4367982, -1913408, 1932735, - -833224, 685047, -38655, 1007170, -453119, 244813, 423054, 513249, 545461, 955630, - -249108, 105227, 1752347, 1314260, -3481071, 685047, -457414, 169651, -1194001, 775242, - -1501091, 1479616, 1217623, 605590, -206158, -470299, -560493, 1050120, 955630, -438087, - 206158, 1816771, -693637, -38655, -633508, 212601, 266288, -51540, -528281, 852551, - 115964, -261993, 633508, 17557826, -1297080, 2422362, -70867, 749472, 311385, 566936, - 373662, 1657857, -996432, 682900, -371515, 264141, 897648, 1415192, 547608, 253403, - -719407, 1286343, -979253, 474594, -470299, -1408749, 115964, 455267, 21475, -457414, - 92342, -508954, 878321, -1891933, 405874, -457414, 463856, -42950, -2645700, -932008, - 236223, 388695, 270583, -478889, -620623, -534723, 339302, 989990, -450972, 423054, - 10630044, -12513387, 2529736, -2989297, 1677185, -1928440, 1552631, -2645700, -773094, -1623498, - -272730, -1348620, 148176, 2486786, 3609920, 1524713, 826781, 88047, 1155346, 2583423, - 1894081, -1144609, -1372242, -1851131, -858993, -1060857, 133144, -152471, -128849, 73014, - 579821, -850404, 1144609, -1125281, -1490354, 577673, 15032, 133144, 358630, -1041530, - -1166084, 384400, -693637, -968515, -146029, 156766, 809601, -24262270, 4885526, -1183264, - 654983, 564788, -1995012, -876173, 1973538, -277025, 206158, 2207613, 743029, -788127, - -1468879, 1550483, 173946, -1795296, -2583423, -3762391, 1267015, -1651415, 433792, -508954, - 753767, -350040, 311385, -1937030, -1904818, -1176821, -476741, -1191853, 410169, -558346, - 736587, 2317135, 438087, 433792, 1552631, 453119, 395137, -15032, -251256, -1471026, - -311385, 384400, -234076, -36507, -29021094, 10904922, -2682207, 3526168, -1672890, 2553358, - -1357210, -358630, -2445984, 1943473, -2901251, 1990717, -472446, 2770254, -3680787, 1002875, - 3489661, 1060857, -2886218, -985695, -1726577, -680752, 1133871, 614180, 846109, -408022, - -964220, -1352915, -1342177, -62277, -1544041, -221191, -1434519, -979253, -4032974, -1078037, - -545461, 281320, 118112, 1468879, 627065, 1449552, -120259, 1677185, 405874, 208306, - 423054, 3579855, 12605729, -3536906, 5566278, -3455301, 1421634, -3723737, 2845416, -313533, - 3105261, -300648, -360777, 3049427, -556198, -478889, 2665027, -1374390, -2529736, -4015795, - 3478924, -337155, 2366527, 229781, 1668595, 777389, -2342905, 927713, 891206, -208306, - 1144609, 1760937, -2327872, 249108, -111669, -249108, -1352915, -644245, -1324997, 296353, - -307090, 938450, 2927020, 60130, 1464584, -324270, 251256, -373662, 416612, 1144609, - -584116, -1125281, 38158636, -9461813, 3590593, -1866163, 3173981, -1447404, 2426657, -1415192, - 809601, -3762391, 1687922, -3594888, 2680060, -1129576, 764504, -1078037, 3790309, 481036, - 925565, -1883343, 2465311, -270583, -1189706, 2083059, -1683627, -2611340, 32212, -848256, - 1189706, -60130, -416612, -884763, 339302, -133144, 448824, -1814624, 382252, -828929, - 2720862, -564788, 1286343, 197569, 1075889, 2010045, -1447404, 57982, 448824, -753767, - 1589138, -386547, -749472, 3253438, -19782620, 7859790, -6081674, 3642132, -3012920, 1082332, - -3981435, 2641405, -1571958, 3676492, -375810, 1625645, -3171833, -1314260, -178241, -1127429, - -1058710, 4239133, -3066607, 573378, 1984275, -3798899, 1015760, 1395864, -936303, 1361505, - 468151, 801011, -2418067, -173946, -758062, 1548336, -1191853, 865436, -2858301, -539018, - 2134599, 1063004, 693637, -691490, -410169, -2158221, -2319282, 1318555, 496069, -60130, - -322123, -158914, 229781, 251256, -470299, -431644, 309238, 354335, -783832, -586263, - -481036, -31969590, 10554882, -5609228, 1518271, -466004, 1853278, -2338610, 2656437, -998580, - -837519, -255551, 1941325, -951335, -1434519, 1157494, 3674345, -435939, 216896, -5987185, - 586263, 158914, 3017215, -897648, -386547, -4563403, -1516124, 115964, 156766, 1666447, - 2278480, -3435974, -3137474, 2128156, 590558, -3545496, -2695092, 1410897, 852551, -156766, - -34360, -1327145, 1483911, -380105, 586263, 238371, -1816771, -743029, 1080184, -2862596, - -1387274, -530428, 687195, -534723, 122407, -1404454, -53687, -1005022, 173946, -31930934, - 14194867, -7776039, 5985037, -5413807, 2753074, -6167573, 1477469, -4007205, 6438156, -3193308, - 2304250, -356482, 94489, -2890513, -785979, -1172526, 5834713, -1063004, 3004330, 4724464, - 2742337, 727997, -573378, 1159641, -970663, 2658585, 2592013, 395137, -1221918, 481036, - 541166, -1715839, -730144, 1359357, 1962800, -1406602, -1350767, -1428077, 154619, -575526, - 874026, -1378685, 1065152, -2183991, 712965, -1185411, -19327, 253403, -816044, -1176821, - -1464584, -1410897, -1838246, 261993, -1670742, -833224, 68719, 11800423, 12266427, -4638565, - 4035122, -5083094, 700080, 1445257, 60130, -2078764, 2231236, 513249, 4818954, 2473901, - 5452461, -921271, 3189013, -962073, 2014340, 2830384, -457414, -4105989, 3777424, -496069, - 1550483, -979253, -68719, 472446, 4636417, 620623, -2615635, -944893, 558346, -1486059, - 3483219, 1432372, -614180, -1002875, -2068027, 1498944, -2027225, 1937030, 2059437, -1644973, - 1157494, 1017907, 506806, -238371, 3384434, 2046552, 2463164, -182536, 249108, 1045825, - -788127, -369367, -287763, -828929, -70867, 94489, 261993, -700080, -1479616, -1578401, - 272730, 760209, 36030480, -12966506, 4404489, -6101001, 4037269, -4045859, 5209796, -1889786, - 176094, -4041564, 7861938, -1219771, 7075959, 365072, 1155346, -4870493, 1642825, 7103876, - -2276333, -6128919, 826781, 173946, 2740189, -4443144, 3508988, -120259, 249108, -466004, - -4271345, -1320703, 639950, -5145371, 779537, 1971390, 1632088, -1509681, -461709, -279173, - 2314987, 624918, -461709, -1127429, 1793149, 1185411, 4535486, 1093069, -736587, 2469606, - 974958, -358630, 796716, 1851131, 1232656, 171799, 257698, -1586990, 272730, -244813, - 1853278, -296353, 704375, -309238, 629213, -139586, 581968, 12120398, -17433272, 10494753, - -7735236, 3298535, 1209033, -758062, -631360, 2113124, -4367982, -2761664, -2250563, -1737314, - -5985037, 3081639, -5557688, -186831, -4443144, 1679332, -3339337, -2611340, -1316408, 5117454, - 734439, 4982162, 2617783, 3427384, 4913443, 296353, -601295, -706522, 1398012, 3803194, - -296353, -229781, -2493229, 1954210, -289910, -1453846, 1408749, 1206886, 3940633, 1649268, - 1864016, -2731599, -1282048, -111669, -504659, 1964948, -5607080, 1264868, -1370095, -895501, - -1733019, -1919850, -657130, -1896228, 801011, -1309965, -216896, -2907693, -2905546, 55835, - -1030792, 2426657, -37005440, -8042327, 1754494, -6972880, -2849711, 356482, -167504, -5933498, - 1769527, -5907728, 227633, 4857608, -843961, -740882, 2686502, 1786706, 2733747, 216896, - 3296388, -1739462, 970663, 3824669, -208306, -176094, -2420214, 3644280, -2729452, -1462436, - 985695, 1513976, 2780991, 8506183, -2267743, -1309965, -3592740, 270583, -2634963, 706522, - -1026497, -3906273, -204011, 5147519, 1473174, -3360812, -1662152, 1754494, -2035815, -2529736, - 528281, -1157494, 339302, 605590, 3240553, 526134, 1610613, 912681, -2654290, -1309965, - 1726577, 1653562, -1047972, 1015760, -176094, -1174674, 68719, -45425720, 37499360, -13103945, - 11145440, -8207683, 6279242, -2381559, 4002910, -4355097, 2686502, 3126736, 4531191, -2946348, - 5484673, 2707977, 9326521, -1462436, 794569, -4937065, 1260573, -1735167, -3070902, -3826816, - -4385162, -4054449, 6055904, -279173, 7267085, 1876901, 1344325, -128849, 938450, -3210488, - 530428, -1176821, 1526861, 4288525, 788127, 1406602, 272730, 438087, -3249143, -1801739, - -107374, -261993, 457414, -1009317, -2989297, 57982, 3251290, -1054415, 974958, 925565, - -2645700, 1818919, 811749, 992137, -526134, 287763, -266288, -850404, 261993, 2884071, - 51540, 169651, 26416196, -4127464, -8596377, -3021510, -1855426, -1428077, -7578470, -4007205, - 2042257, 1236951, 2091649, 2624225, -5111011, 1988570, -1047972, 1765232, 8057359, -8250632, - 2778844, 2787434, 2153926, -2166811, -4797479, 3648575, 1047972, 2598455, 4945655, -40802, - 6835441, 551903, 3150359, 225486, 2119566, -1937030, 2553358, 1836099, 2435247, -1002875, - 775242, -240518, 3137474, 3891240, -5879810, 7818988, 618475, 2153926, 296353, 1327145, - 1477469, -1698660, 4668630, 2503966, 135291, 4277788, 1791001, -2415919, -242666, -1629940, - -1756642, -1331440, 738734, -375810, 223338, -143881, -4864051, 2443837, -1954210, 642098, - -691490, -319975, -1236951, -723702, 20933670, 1788854, 4230543, -5473936, -1071594, -13531294, - 3182571, -693637, -9206262, 7636452, -4282083, 225486, 5598490, 2486786, 4194036, -3294240, - 1831804, -4301410, 45097, -3687230, 1324997, -5579163, 7887708, 5665062, 4645007, 5398774, - 1178969, -1857573, -3457449, 1488206, 4318590, -42950, 2933463, -2199023, 571231, 2826089, - 2005750, 2538326, 156766, 874026, -354335, -1906966, 1812476, -1337882, 833224, 697932, - -1917703, 2518998, -3519726, 3064459, -1664300, 2149631, 3345780, -4174708, 388695, 418759, - -1705102, -3302830, 2269890, -5319317, -4086662, 2463164, 1041530, 1114544, 998580, 3210488, - 3128884, -1202591, 423054, 1848983, -777389, -79457, 33116346, -27489938, 9358734, -6824703, - 2445984, 8619999, 7015829, -4589173, 8407398, 4741644, 5091684, -3448859, 2385854, -1750199, - 9979357, 2785286, 2841121, 3871913, 4243428, 2688650, 2909840, -8158291, 1340030, -14759655, - -5111011, -1355062, -8435316, 2143189, 4571993, -3176128, -4561256, -5385889, -5153961, -2750927, - 3012920, 2366527, -7492571, -8693014, -635655, -4428112, 2409477, 1945620, 863288, -609885, - 4155381, -2151779, 244813, -562641, -1810329, -5581310, 4370129, 7370164, -957778, -912681, - 3496104, -5177583, 6335077, 1632088, -3152506, -109522, -2924873, -1241246, -710817, -2113124, - -526134, -1425929, -4299263, 1136019, 1599875, 1471026, 1586990, 502511, -51105816, 5196911, - -4458176, 1992865, 5330055, 3859028, 10559177, -4183298, -253403, 953483, 12616466, 4453881, - -9689446, -6289980, 5626407, 7509751, -1750199, -2686502, -98784, 3521873, 7752416, 7879118, - -6442, -13799730, -3917010, -1329292, -1565516, 8177618, -3603478, 4818954, 566936, -777389, - -7114614, 676457, 5849746, -9126806, -5310727, -2065879, -1516124, -4273493, -3558381, -8525510, - -1494649, -5748814, 152471, 1367947, 6317897, -4140349, -2697240, 635655, -530428, 1069447, - -5267778, 2203318, 2130304, 770947, 395137, -3955665, -3588445, -1949915, -1065152, -221191, - -6841883, 1507534, 2110977, -2894808, -6281390, 2645700, -221191, -3096672, -543313, -1389422, - -977105, 4127464, -30163556, 31842888, -4645007, 1937030, 7436736, 8942122, -6882685, 4264903, - 1627793, 5495411, 3685082, 7791071, 4352950, -5398774, -8942122, 1187559, 9272834, 18640158, - -4617090, -6423124, 4801774, 2972117, -3676492, -9283572, -1979980, -1917703, -8443906, 7239168, - 8592082, 75162, 1915555, -234076, 6730214, -5396627, -16649441, 6917045, -2098092, 5478231, - 2536178, 180389, -4211216, -6410239, 4286378, 5160403, 3685082, -790274, -461709, 5682242, - 3096672, 1720134, -3536906, 4778151, 3904125, -710817, -1378685, -2841121, 3178276, 66572, - -8291435, 6676527, 3889093, -1559073, 1795296, -1052267, 85899, -191126, 1857573, 493921, - 2312840, 3929895, 1979980, -633508, -2538326, -1612760, 5654325, 2220498, -1129576, -1801739, - -335007, 8939974, 322123, -6977175, -14229227, 3375844, -785979, -11759620, 3910568, -3932043, - 504659, -4490389, -3496104, 3629247, 8866960, 1039382, 11761768, 5295695, -5978595, -7868380, - 12876312, -5662915, -450972, 1093069, -12156905, -156766, 6378027, -7099581, -1900523, 8050916, - 481036, 4172561, 94489, 5276368, -934155, -3695819, -515396, 7026567, 9554155, -3212636, - 1917703, 1593433, 6365142, -3878356, -693637, 1170379, -1640678, 4071629, 1851131, 266288, - -2199023, 3238405, 3665755, 113817, 161061, 2680060, 4292820, -5261335, -36507, 1363652, - 2351495, -2735894, 2130304, 979253, 60130, 1417339, -1651415, 635655, 1702955, 3491809, - 4312147, -3575560, 384400, 67025112, -6560563, 1013612, 4078072, -6124624, -10511932, -6150393, - -2695092, -11935714, -12818330, 878321, -11366631, -5044439, -3358665, -2864743, 6813966, 7975755, - 2445984, 16797618, 2957085, -8450348, 14439680, -1544041, 10194105, -3377992, -1189706, -9663676, - 253403, 8398809, -399432, -4211216, -1752347, 788127, -2237678, -1870458, 3161096, -7707319, - 2980707, 1069447, -3732327, -7312182, -5025112, 5508296, 5379447, 6485401, -11184095, 6146098, - 1586990, -330712, 380105, 1032940, 1097364, 1372242, -1067299, 528281, 5723044, -1709397, - 2173254, 2684355, -2566243, 4797479, 5428839, 874026, -629213, 5080947, 3528316, 2783139, - 3322157, -4367982, -2136746, 947040, -616328, -689342, 143881, 2248416, 472446, -4232691, - -39352636, -66065188, 24013162, -1612760, 10030896, -11510512, 618475, -13344463, -1666447, -19271518, - 8426726, 8976482, -358630, -1449552, -167504, 1855426, -4552666, -16426102, 30419106, 2156074, - -3816079, 10456098, 1921998, -5437429, 14643691, 16237124, -6882685, 9597104, 1930588, -2020782, - -15109695, -8272107, 11940009, -6064494, 1750199, -781684, 8143258, -12348031, -13846975, 2003602, - 279173, -9380209, 5757404, 1185411, -5798206, 4183298, -6395207, -5366562, 2643552, 2493229, - 416612, -1713692, -2976412, 3876208, 6562710, 962073, 2115272, -1851131, -1791001, 5680094, - 751619, 1279900, -5703717, -1324997, -3783866, 3193308, 4810364, 47245, 3972845, -53687, - 5269925, -4202626, 2680060, -62277, -178241, -3972845, 27917, -3408057, -380105, -21206402, - 63977832, -28329604, 4853313, 4243428, 16097537, -1973538, 10305774, -10052371, 700080, -19331648, - -3631395, 152471, 7894150, 1350767, 8128226, -5506148, -11688753, 1574106, -17624398, -18614388, - 633508, -6083821, -249108, 1642825, 2772402, -4582730, -2995740, -6618545, -10000831, 4110284, - 5001490, -13114683, -5847598, -16499117, 373662, -7267085, 6060199, 6992207, -13509820, 2186138, - 11368778, 10159745, -5126044, 3721589, -3751654, -1891933, 3300682, -6137509, -1191853, 5772436, - 4619238, 3964255, 4962835, 2604898, -1292785, 3816079, 2643552, -2815351, 0, 7756711, - -663572, -3543348, -981400, 3208341, -3161096, -7898445, -418759, -2750927, 2179696, 1694365, - -996432, -3197603, -4608500, -5572720, 5815386, -1887638, -60130, -1247688, -236223, -695785, - -52632676, -16187732, 6111739, -8177618, 7700877, -3313567, 240518, -15393163, -18532784, -2368675, - -6380174, 7999377, 2394444, -2102387, -38482908, 19572166, 1539746, 17078938, 21187074, 14718853, - -20044612, -4756677, -1797444, -4870493, 4518306, 4971425, -188979, -7183333, 8332237, -13488345, - -7148973, 12311524, 781684, -5044439, 14351633, 500364, 15047418, -4964982, -2226941, 1956358, - 4818954, -10477573, -7720204, -1690070, 8542690, -2866891, 1513976, -3169686, 5757404, 7224135, - 1516124, 566936, -12219182, -1095217, 6204081, 6981470, -3723737, 7799661, 2652142, -1904818, - 2132451, -7524783, -2267743, -4969277, 5242008, 1000727, -1662152, 2042257, -13050258, 287763, - 2660732, 6524056, 2229088, -3251290, 6255620, 788127, -8171176, -3573413, -4121021, -962073, - 1896228, 33601676, 11207717, -20525648, -3661460, -8955007, 6891275, -12470438, 10075993, -2488934, - 11751031, 8085276, 14306536, -19685982, 23244364, -14577119, 13539884, -8072391, 8061654, 1331440, - 6826851, -12674448, -28709708, 10874857, 19765440, -7436736, 8042327, -10337986, 2269890, -6865505, - 20798380, -418759, -2173254, 4769561, -10260677, -7290707, -6053757, 8950712, -4295, -3605625, - -85899, -2035815, 14267881, 9401683, -5463199, 4425964, 5375152, -6195491, -3545496, -5604933, - -10969346, -1733019, 137439, -1709397, -4086662, -11276437, -539018, 16621523, 9064528, -7284265, - 9328669, -1251983, -244813, 7655779, 4045859, -8287140, 2954938, 1546188, 8224863, 9702331, - -7984344, 3337190, 5731634, 7346542, -749472, -476741, -2808909, -1647120, 4194036, -957778, - 7687992, -2007897, 71625024, -58344984, -9758166, 2946348, -1093069, -16110422, 5448166, 4245575, - 22898618, -7464653, 4531191, 18805514, 545461, 11315091, 37179384, -8057359, -2379412, -19318762, - -18036716, 839666, 6186901, -8147553, 3566970, 32751274, 18988050, 2725157, 1284195, 2669322, - 18172006, -15118285, -6637872, -837519, 9399536, -1451699, 2299955, -7670812, 2950643, -13625784, - -7956427, -10303627, 225486, -9229885, 2267743, -16436840, 7642895, -32839320, -8340827, 4496831, - 6128919, -1236951, -7503308, 2531883, 1037235, 3925600, -8912057, 3985730, -5188321, -5950677, - -14418205, -10812580, -3113851, -1821066, 785979, 2443837, 4720169, 867583, 2295660, -8665097, - 17180, -10574209, -1511829, -747324, 360777, 3491809, 10617159, -6614250, -2858301, -719407, - -5538361, -9764608, 2261300, -45105748, -31346818, -2171106, -6221260, 23890756, 938450, 4548371, - -29545080, 1698660, 4243428, 1864016, 2452426, 18083960, -22174916, 4885526, -4606353, -15238544, - -7303592, 14364518, -4808216, 11720966, -3786014, 6854768, 3796751, -2244121, -1593433, 7739531, - -856846, 32212, -18955838, 9603547, 8738111, 8235600, 9494025, -17035988, -17529910, 10438918, - 15526307, -18330920, 6972880, 2774549, 16125455, 9300752, 1707250, 10844792, -5471789, -11025181, - -1503239, -21365314, -15509127, -1649268, -616328, 3504693, -10065256, 3659312, -8035884, -27421218, - -7887708, -7337952, -26961658, 122407, -4252018, -3098819, 3283503, 8521215, -7803956, 5278515, - 3635690, -12195560, -7647190, -9360881, -1825361, -2733747, -64425, -3835406, 5392332, -5909875, - -1329292, -5016522, 9109626, -9822590, 6079526, -1516124, -1990717, 579821, 2710124, -2280628, - -28166396, 43095700, -22503482, -9545565, -13134010, 3496104, 3768834, 6438156, -2660732, 18876382, - 14218489, -13376676, -23875724, 9073118, -8927090, 22136262, 1864016, 9521942, 11615739, -8211978, - -8038032, 29384018, -16720308, -3914863, -8469676, 1161789, -3468186, 4024384, -4915590, -1803886, - -22533546, 20061792, -6919193, -1623498, 23596550, -15988016, -20319490, 2001455, -9204115, -13228499, - -55835, -6700149, 5366562, -29197188, -9730248, -7039452, -672162, 10514080, 163209, 2235531, - 5381594, -4861903, 4116726, 7090991, 6000070, 6738804, -3730179, -6043019, -5413807, 7642895, - -17744658, -3697967, -4161823, -4202626, 11647951, -7683697, -12412455, 12792560, 3861176, 7780334, - 14961519, -5282810, -4967130, 7580618, -8057359, -10020159, -9401683, 5804649, 4303557, -5349382, - 5166846, 1926293, 6090264, 1299228, -11218455, 7726646, -3723737, -58961312, 29693256, 31978180, - 16449725, 14944339, -10441065, 15187004, -25398290, 959925, -29862908, -3826816, -12964359, 14044543, - -14214194, -11796128, -3131031, -21891448, 6590628, -9953587, 9844065, -20549272, 34561600, -11224897, - 16396038, -14050986, 1513976, -14078903, -4406637, 7883413, 22177064, 24809878, -12264279, 169651, - -7194070, -12990129, -9848360, -35246648, -727997, 5985037, -33105608, 13022341, 6667937, 9163313, - 16015933, 10084583, 5448166, -11102490, -3534758, -12390981, -6206228, 6715182, -26454852, 10529112, - 5315022, 1750199, -12442520, -7359427, 6936372, 21464100, 9122511, 5583458, -8336532, 8974334, - 1350767, -10127533, 2847563, -7316477, -11486890, -6006512, -2632815, -10471130, 12060268, 6805376, - 9835475, 5433134, -8643622, 2907693, 15043123, -2929168, 13980119, 7385197, 5233418, 9371619, - -4784594, -5589900, 3715147, 2448131, 49147312, -33496450, -13945759, -4108136, 8590, 24017458, - -4355097, 7977902, -13587129, 7554848, -8390219, -38530152, -26456998, -9747428, 14014478, -1492501, - -21245056, -19883552, -42069204, -13458280, 5534066, 5871221, 2080912, -4185446, -2362232, -12925704, - 3549791, 5654325, 7290707, 1803886, -1812476, -4898410, -20016696, -4975720, -4464619, 10286447, - -1997160, -15908559, -6204081, 4808216, -17944374, 3251290, -18511310, 10520522, 14654428, -13675176, - -26839250, -5059472, -8375186, -12186970, 1391569, 2587718, 2746632, 6762426, 429497, -10432476, - 16982300, 26383984, -12573517, 11025181, 4475356, 12575664, -18923626, 7310035, 2488934, 6919193, - -27260158, 21749714, 2692945, 2568391, -3257733, -15483357, 4127464, 2106682, 3895535, 4896263, - -16973710, -8875550, 3420942, 8123931, -4252018, 105227, 6388764, 2626373, -3017215, -8050916, - 5963562, 79590040, -44493712, 4058744, -4483946, -9496173, -33202244, -1808181, -1851131, 26989574, - 12335146, 54541788, -21713208, 2076617, 5954972, 13045963, -5596343, -2544768, 22106196, -13913547, - 31823560, 19273666, -44266080, 42150808, 14856292, -15255724, -11008001, -16640851, -8673686, 2989297, - 1924145, -11978664, 28016072, 3547643, -13445395, -11942157, 2720862, -14774687, -26025354, 195421, - 15513422, 6118181, 18869938, -8834748, 5862631, 20160576, 29085518, 6792491, -30122754, 9807558, - -9702331, -16681653, 4378719, 12650826, 7316477, -3768834, -27335320, -24026048, 33711200, -4554813, - 26053272, 2877628, -10262824, 12659416, -22591528, -10125385, 10900627, -3042984, 22417582, -18146236, - -35682588, -10157598, -1739462, -11106785, -8544837, 22056804, -7417409, 3929895, -20366734, -20063940, - 9758166, 4949950, 8224863, -8839043, 8398809, 682900, -4733054, -1206886, -89620936, -58177480, - 21592948, -30148522, 9852655, -14980846, -54159536, -40035536, 72703056, -33217278, 32923072, 18663780, - -18773302, 17057462, -10582799, 22995254, 25479894, -1477469, -7020124, 43621836, -13962939, -48964776, - 968515, -20420422, 5179731, 4797479, 29577292, 15736760, 6285685, 14544907, -13067438, 143881, - 32373316, 20731808, -5641440, 8433168, -28275918, -43836584, -32244466, -22531398, -6191196, -6126771, - 8308614, -3974992, -12081743, 28310276, 7582765, -21064668, -19651622, -5592048, 8362302, -21227876, - 8699456, 26414048, -360777, 9964324, -17897128, 14134737, 10376641, 3345780, 10580652, -15790447, - -24404004, -34497176, 17547088, 13731010, 1363652, 13625784, 2731599, -15779710, -3171833, 1305670, - -27502824, -2426657, -42820824, -23547158, 7355132, -10894185, 8420283, 1099512, -5512591, -5787469, - -3869766, -7928510, 7799661, 292058, -1097364, -107176616, 36754184, -8370892, -6865505, 19344532, - 4887673, 10857677, 46952584, 28071906, 35508644, 17918604, 48423608, -8327942, -46787228, 7069516, - -5085242, -19995220, -41420664, -18023830, 36590972, 8381629, -2312840, 7718056, -2564096, 633508, - 30878668, 4011500, 11592117, -4526896, 7806103, 30659624, -8231305, -20446192, 15747498, -36395552, - -36442796, -23480586, -4410932, 1101659, 15425375, 35888748, 788127, -12275017, -35450660, -58405112, - -20336670, -8461086, -3246995, -324270, 21837762, -26738318, 48528836, 25142738, -4325032, 13945759, - -18743238, 3511136, 670015, 22376780, 43411380, 29137058, -25097642, -10630044, 7509751, -4060892, - -5104569, 2252710, -12799003, -41766408, -2845416, -7687992, -2671470, 6567005, -15940771, -5480379, - -28174986, -3023657, 4357245, 29873646, 15017353, 4194036, 5190468, 7544110, 1318555, -25284472, - 5600638, -5896990, 7148973, -3094524, -2920578, -13855564, 43364136, 43898860, 14721000, 29278792, - 21045340, 46080704, -41047004, 47921096, -59105192, -10604274, 54741504, 75172664, 15479062, -5057324, - 27206470, -23448374, -27290222, 54314156, 8549132, -8665097, 13039521, 43619688, -11785390, 26658862, - -9064528, -11239929, -5512591, 19557134, -51065012, -6442451, 24438364, -11512660, 2342905, -18217104, - 10290742, 40007620, -37372656, 11761768, -11250667, 12932147, -19666656, 26813480, 2050847, 9554155, - 10711648, -45210972, 21741124, -62861140, -13005161, 35313220, 3577708, -22576496, 38989712, -13737453, - -23927262, 28284508, -11972221, -8319352, -4756677, 17018808, -2849711, 4365835, -34482144, 12264279, - 2896956, 66752380, -50594716, -22089016, 5695127, -13108240, 14811195, 18713172, -24496346, 46645492, - 17212082, -362925, 7380902, 15530602, -7900593, -25524990, 9704479, -13234942, 3865471, -5304285, - 11875585, -16226386, 4574140, 27917, -8875550, 10636487, -4105989, 89526448, -56173876, 2055142, - -9105331, -15071040, 1705102, -20581484, -8800388, -66406636, -55649892, -55364276, 18356690, -11611444, - 18133352, -12700218, -40355512, 64046552, 44502304, -29845728, -25196426, -35218732, -7548405, 13675176, - 20952998, 25898652, -2040110, 20040318, -5991480, -25396142, -31172872, 19314468, -14325863, 58512488, - 36436356, 53972708, 7352984, 19617264, 52918292, 36846524, -11931419, 9706626, -2639258, 665720, - 5357972, -24775518, -18126910, 9562745, -31286690, -31913754, 30618822, 35188668, -38860864, -1236951, - 68184752, 47749300, -2770254, -22604412, -5315022, 14239964, 12539157, -9212705, -25853556, 30674656, - -2405182, 7567733, 21569326, 27910844, -29506426, 12594992, -5149666, 11660836, -45679124, 8471823, - 40510132, -40617504, -33846488, -17239998, 17761838, 32388348, -18642306, 17879948, -16134045, -1468879, - 508954, 6863358, 11652246, -5493263, -2937758, 7492571, 6335077, 242666, -1376537, 5471789, - 72606424, 27940910, -9715216, -2362232, 22763326, -27206470, -35373352, 30307436, -42258184, -54715736, - 14523432, -29368986, -37845104, -19752554, 36135708, 88650272, 36689760, -48262548, 90806344, 10531260, - -14235669, 16357383, -53027812, 13481902, 7325067, -38016904, 32877974, -10228465, 6489696, -27373974, - 15375983, -25016038, 45958296, -54432268, -20044612, -18807662, 25930866, 29920890, 26667452, -28930900, - 8461086, -30245160, -8677981, 16116865, 38416336, 17731772, -17643726, 37415608, 19088982, 30182882, - 2029372, 35184372, -15382425, 19454054, -53560388, 60185376, -5216238, 8381629, -15949361, -31376884, - 1617055, 20104742, 48088600, 14139032, -57490284, 24524264, -23248658, 47373488, 4114579, -18081812, - 9199820, -15635828, 9899900, -33481418, 13415330, 3197603, 2954938, 5366562, -6517613, 3459596, - -8978629, -14029511, 18801220, 11766063, 10861972, -24820616, 8237748, -13460428, 11647951, 2615635, - -1477469, 5815386, 2845416, -148921552, 6358699, 24691766, 58244052, 19007378, -91684664, 121678568, - 44498008, -56008520, 19896436, 121023592, 27064736, -29639570, -3841848, -73652248, 37572372, 3302830, - -18949396, 10389526, 24985972, -47826608, 25303800, -59882580, 6146098, -54593328, -49067852, -21006686, - 22840636, 34806416, -26897232, 30419106, -53203908, -7801808, 59431608, 5332202, -21642340, -7174743, - 11493332, -13973676, -39492224, -44079248, -5959267, -20325932, 42900280, -60591252, 63872608, 20222854, - 8070244, -21599390, -7148973, 29448444, -24099062, 39786428, 9805410, 35948876, -13428215, -21120502, - -63359356, 21453362, -6483253, -65373696, 19475530, -4582730, 39603892, 63739464, -27090506, 14340896, - 31437014, 33429878, 6805376, -19698868, -3895535, -79136920, -3938485, 7005092, 19417548, -618475, - 52982716, 11276437, 26310970, -30041148, -21410412, 39483636, -4133906, -8302172, 23976654, -5813238, - -6805376, -685047, -1378685, 2347200, -4352950, 21900038, 184451664, 84091168, 17529910, 29991756, - -37752764, -25338160, -8894877, 69720208, -49340584, 7937100, -41042708, -113359216, -54320600, 26029650, - -28915868, 18747532, -44869524, -2252710, -48249664, 41467908, -48850960, -35165044, -105149392, -19606526, - -16471200, -27633820, 54863912, -17798344, -43840880, 14302241, 42341936, 15700253, 14413910, -6298570, - -8821863, -27801324, 21620866, -35794256, -9607842, -22241488, -62672164, 9562745, -43471512, 17583596, - 5667210, -12773233, -1359357, -45704896, -2551211, -10400263, 66911296, -19245748, -1535451, 27200028, - -36621040, -16275779, 67901288, -39603892, 25982404, 1778117, 60393684, 85755464, -5010080, 11085311, - 8589935, 29673930, 15539192, -65420940, 6027987, 16544214, 23109072, -27998892, -43548820, 4578435, - 12674448, -11390253, -16548509, -70177616, -34617436, -40364104, 2838974, 8864812, -13224204, -19288698, - -21904334, -5379447, -10992969, -12281459, 14626511, -6889128, 7086696, -25252260, 1808181, -9756018, - -17493402, 4101694, 10284299, -13623636, }, + -23622, -40802, -27917, -64425, -12885, -103079, -27917, -339302, 229781, -17180, + 231928, -47245, 98784, 642098, -79457, -753767, -760209, -242666, -472446, 68719, + -386547, -1015760, 279173, -249108, -195421, 283468, 73014, -339302, -560493, -700080, + 79457, -418759, -279173, 163209, -775242, 689342, 691490, -397284, -70867, -251256, + -738734, 77309, -674310, -502511, 478889, -322123, 1037235, 4367982, -1913408, 1932735, + -833224, 685047, -38655, 1007170, -453119, 244813, 423054, 513249, 545461, 955630, + -249108, 105227, 1752347, 1314260, -3481071, 685047, -457414, 169651, -1194001, 775242, + -1501091, 1479616, 1217623, 605590, -206158, -470299, -560493, 1050120, 955630, -438087, + 206158, 1816771, -693637, -38655, -633508, 212601, 266288, -51540, -528281, 852551, + 115964, -261993, 633508, 17557826, -1297080, 2422362, -70867, 749472, 311385, 566936, + 373662, 1657857, -996432, 682900, -371515, 264141, 897648, 1415192, 547608, 253403, + -719407, 1286343, -979253, 474594, -470299, -1408749, 115964, 455267, 21475, -457414, + 92342, -508954, 878321, -1891933, 405874, -457414, 463856, -42950, -2645700, -932008, + 236223, 388695, 270583, -478889, -620623, -534723, 339302, 989990, -450972, 423054, + 10630044, -12513387, 2529736, -2989297, 1677185, -1928440, 1552631, -2645700, -773094, -1623498, + -272730, -1348620, 148176, 2486786, 3609920, 1524713, 826781, 88047, 1155346, 2583423, + 1894081, -1144609, -1372242, -1851131, -858993, -1060857, 133144, -152471, -128849, 73014, + 579821, -850404, 1144609, -1125281, -1490354, 577673, 15032, 133144, 358630, -1041530, + -1166084, 384400, -693637, -968515, -146029, 156766, 809601, -24262270, 4885526, -1183264, + 654983, 564788, -1995012, -876173, 1973538, -277025, 206158, 2207613, 743029, -788127, + -1468879, 1550483, 173946, -1795296, -2583423, -3762391, 1267015, -1651415, 433792, -508954, + 753767, -350040, 311385, -1937030, -1904818, -1176821, -476741, -1191853, 410169, -558346, + 736587, 2317135, 438087, 433792, 1552631, 453119, 395137, -15032, -251256, -1471026, + -311385, 384400, -234076, -36507, -29021094, 10904922, -2682207, 3526168, -1672890, 2553358, + -1357210, -358630, -2445984, 1943473, -2901251, 1990717, -472446, 2770254, -3680787, 1002875, + 3489661, 1060857, -2886218, -985695, -1726577, -680752, 1133871, 614180, 846109, -408022, + -964220, -1352915, -1342177, -62277, -1544041, -221191, -1434519, -979253, -4032974, -1078037, + -545461, 281320, 118112, 1468879, 627065, 1449552, -120259, 1677185, 405874, 208306, + 423054, 3579855, 12605729, -3536906, 5566278, -3455301, 1421634, -3723737, 2845416, -313533, + 3105261, -300648, -360777, 3049427, -556198, -478889, 2665027, -1374390, -2529736, -4015795, + 3478924, -337155, 2366527, 229781, 1668595, 777389, -2342905, 927713, 891206, -208306, + 1144609, 1760937, -2327872, 249108, -111669, -249108, -1352915, -644245, -1324997, 296353, + -307090, 938450, 2927020, 60130, 1464584, -324270, 251256, -373662, 416612, 1144609, + -584116, -1125281, 38158636, -9461813, 3590593, -1866163, 3173981, -1447404, 2426657, -1415192, + 809601, -3762391, 1687922, -3594888, 2680060, -1129576, 764504, -1078037, 3790309, 481036, + 925565, -1883343, 2465311, -270583, -1189706, 2083059, -1683627, -2611340, 32212, -848256, + 1189706, -60130, -416612, -884763, 339302, -133144, 448824, -1814624, 382252, -828929, + 2720862, -564788, 1286343, 197569, 1075889, 2010045, -1447404, 57982, 448824, -753767, + 1589138, -386547, -749472, 3253438, -19782620, 7859790, -6081674, 3642132, -3012920, 1082332, + -3981435, 2641405, -1571958, 3676492, -375810, 1625645, -3171833, -1314260, -178241, -1127429, + -1058710, 4239133, -3066607, 573378, 1984275, -3798899, 1015760, 1395864, -936303, 1361505, + 468151, 801011, -2418067, -173946, -758062, 1548336, -1191853, 865436, -2858301, -539018, + 2134599, 1063004, 693637, -691490, -410169, -2158221, -2319282, 1318555, 496069, -60130, + -322123, -158914, 229781, 251256, -470299, -431644, 309238, 354335, -783832, -586263, + -481036, -31969590, 10554882, -5609228, 1518271, -466004, 1853278, -2338610, 2656437, -998580, + -837519, -255551, 1941325, -951335, -1434519, 1157494, 3674345, -435939, 216896, -5987185, + 586263, 158914, 3017215, -897648, -386547, -4563403, -1516124, 115964, 156766, 1666447, + 2278480, -3435974, -3137474, 2128156, 590558, -3545496, -2695092, 1410897, 852551, -156766, + -34360, -1327145, 1483911, -380105, 586263, 238371, -1816771, -743029, 1080184, -2862596, + -1387274, -530428, 687195, -534723, 122407, -1404454, -53687, -1005022, 173946, -31930934, + 14194867, -7776039, 5985037, -5413807, 2753074, -6167573, 1477469, -4007205, 6438156, -3193308, + 2304250, -356482, 94489, -2890513, -785979, -1172526, 5834713, -1063004, 3004330, 4724464, + 2742337, 727997, -573378, 1159641, -970663, 2658585, 2592013, 395137, -1221918, 481036, + 541166, -1715839, -730144, 1359357, 1962800, -1406602, -1350767, -1428077, 154619, -575526, + 874026, -1378685, 1065152, -2183991, 712965, -1185411, -19327, 253403, -816044, -1176821, + -1464584, -1410897, -1838246, 261993, -1670742, -833224, 68719, 11800423, 12266427, -4638565, + 4035122, -5083094, 700080, 1445257, 60130, -2078764, 2231236, 513249, 4818954, 2473901, + 5452461, -921271, 3189013, -962073, 2014340, 2830384, -457414, -4105989, 3777424, -496069, + 1550483, -979253, -68719, 472446, 4636417, 620623, -2615635, -944893, 558346, -1486059, + 3483219, 1432372, -614180, -1002875, -2068027, 1498944, -2027225, 1937030, 2059437, -1644973, + 1157494, 1017907, 506806, -238371, 3384434, 2046552, 2463164, -182536, 249108, 1045825, + -788127, -369367, -287763, -828929, -70867, 94489, 261993, -700080, -1479616, -1578401, + 272730, 760209, 36030480, -12966506, 4404489, -6101001, 4037269, -4045859, 5209796, -1889786, + 176094, -4041564, 7861938, -1219771, 7075959, 365072, 1155346, -4870493, 1642825, 7103876, + -2276333, -6128919, 826781, 173946, 2740189, -4443144, 3508988, -120259, 249108, -466004, + -4271345, -1320703, 639950, -5145371, 779537, 1971390, 1632088, -1509681, -461709, -279173, + 2314987, 624918, -461709, -1127429, 1793149, 1185411, 4535486, 1093069, -736587, 2469606, + 974958, -358630, 796716, 1851131, 1232656, 171799, 257698, -1586990, 272730, -244813, + 1853278, -296353, 704375, -309238, 629213, -139586, 581968, 12120398, -17433272, 10494753, + -7735236, 3298535, 1209033, -758062, -631360, 2113124, -4367982, -2761664, -2250563, -1737314, + -5985037, 3081639, -5557688, -186831, -4443144, 1679332, -3339337, -2611340, -1316408, 5117454, + 734439, 4982162, 2617783, 3427384, 4913443, 296353, -601295, -706522, 1398012, 3803194, + -296353, -229781, -2493229, 1954210, -289910, -1453846, 1408749, 1206886, 3940633, 1649268, + 1864016, -2731599, -1282048, -111669, -504659, 1964948, -5607080, 1264868, -1370095, -895501, + -1733019, -1919850, -657130, -1896228, 801011, -1309965, -216896, -2907693, -2905546, 55835, + -1030792, 2426657, -37005440, -8042327, 1754494, -6972880, -2849711, 356482, -167504, -5933498, + 1769527, -5907728, 227633, 4857608, -843961, -740882, 2686502, 1786706, 2733747, 216896, + 3296388, -1739462, 970663, 3824669, -208306, -176094, -2420214, 3644280, -2729452, -1462436, + 985695, 1513976, 2780991, 8506183, -2267743, -1309965, -3592740, 270583, -2634963, 706522, + -1026497, -3906273, -204011, 5147519, 1473174, -3360812, -1662152, 1754494, -2035815, -2529736, + 528281, -1157494, 339302, 605590, 3240553, 526134, 1610613, 912681, -2654290, -1309965, + 1726577, 1653562, -1047972, 1015760, -176094, -1174674, 68719, -45425720, 37499360, -13103945, + 11145440, -8207683, 6279242, -2381559, 4002910, -4355097, 2686502, 3126736, 4531191, -2946348, + 5484673, 2707977, 9326521, -1462436, 794569, -4937065, 1260573, -1735167, -3070902, -3826816, + -4385162, -4054449, 6055904, -279173, 7267085, 1876901, 1344325, -128849, 938450, -3210488, + 530428, -1176821, 1526861, 4288525, 788127, 1406602, 272730, 438087, -3249143, -1801739, + -107374, -261993, 457414, -1009317, -2989297, 57982, 3251290, -1054415, 974958, 925565, + -2645700, 1818919, 811749, 992137, -526134, 287763, -266288, -850404, 261993, 2884071, + 51540, 169651, 26416196, -4127464, -8596377, -3021510, -1855426, -1428077, -7578470, -4007205, + 2042257, 1236951, 2091649, 2624225, -5111011, 1988570, -1047972, 1765232, 8057359, -8250632, + 2778844, 2787434, 2153926, -2166811, -4797479, 3648575, 1047972, 2598455, 4945655, -40802, + 6835441, 551903, 3150359, 225486, 2119566, -1937030, 2553358, 1836099, 2435247, -1002875, + 775242, -240518, 3137474, 3891240, -5879810, 7818988, 618475, 2153926, 296353, 1327145, + 1477469, -1698660, 4668630, 2503966, 135291, 4277788, 1791001, -2415919, -242666, -1629940, + -1756642, -1331440, 738734, -375810, 223338, -143881, -4864051, 2443837, -1954210, 642098, + -691490, -319975, -1236951, -723702, 20933670, 1788854, 4230543, -5473936, -1071594, -13531294, + 3182571, -693637, -9206262, 7636452, -4282083, 225486, 5598490, 2486786, 4194036, -3294240, + 1831804, -4301410, 45097, -3687230, 1324997, -5579163, 7887708, 5665062, 4645007, 5398774, + 1178969, -1857573, -3457449, 1488206, 4318590, -42950, 2933463, -2199023, 571231, 2826089, + 2005750, 2538326, 156766, 874026, -354335, -1906966, 1812476, -1337882, 833224, 697932, + -1917703, 2518998, -3519726, 3064459, -1664300, 2149631, 3345780, -4174708, 388695, 418759, + -1705102, -3302830, 2269890, -5319317, -4086662, 2463164, 1041530, 1114544, 998580, 3210488, + 3128884, -1202591, 423054, 1848983, -777389, -79457, 33116346, -27489938, 9358734, -6824703, + 2445984, 8619999, 7015829, -4589173, 8407398, 4741644, 5091684, -3448859, 2385854, -1750199, + 9979357, 2785286, 2841121, 3871913, 4243428, 2688650, 2909840, -8158291, 1340030, -14759655, + -5111011, -1355062, -8435316, 2143189, 4571993, -3176128, -4561256, -5385889, -5153961, -2750927, + 3012920, 2366527, -7492571, -8693014, -635655, -4428112, 2409477, 1945620, 863288, -609885, + 4155381, -2151779, 244813, -562641, -1810329, -5581310, 4370129, 7370164, -957778, -912681, + 3496104, -5177583, 6335077, 1632088, -3152506, -109522, -2924873, -1241246, -710817, -2113124, + -526134, -1425929, -4299263, 1136019, 1599875, 1471026, 1586990, 502511, -51105816, 5196911, + -4458176, 1992865, 5330055, 3859028, 10559177, -4183298, -253403, 953483, 12616466, 4453881, + -9689446, -6289980, 5626407, 7509751, -1750199, -2686502, -98784, 3521873, 7752416, 7879118, + -6442, -13799730, -3917010, -1329292, -1565516, 8177618, -3603478, 4818954, 566936, -777389, + -7114614, 676457, 5849746, -9126806, -5310727, -2065879, -1516124, -4273493, -3558381, -8525510, + -1494649, -5748814, 152471, 1367947, 6317897, -4140349, -2697240, 635655, -530428, 1069447, + -5267778, 2203318, 2130304, 770947, 395137, -3955665, -3588445, -1949915, -1065152, -221191, + -6841883, 1507534, 2110977, -2894808, -6281390, 2645700, -221191, -3096672, -543313, -1389422, + -977105, 4127464, -30163556, 31842888, -4645007, 1937030, 7436736, 8942122, -6882685, 4264903, + 1627793, 5495411, 3685082, 7791071, 4352950, -5398774, -8942122, 1187559, 9272834, 18640158, + -4617090, -6423124, 4801774, 2972117, -3676492, -9283572, -1979980, -1917703, -8443906, 7239168, + 8592082, 75162, 1915555, -234076, 6730214, -5396627, -16649441, 6917045, -2098092, 5478231, + 2536178, 180389, -4211216, -6410239, 4286378, 5160403, 3685082, -790274, -461709, 5682242, + 3096672, 1720134, -3536906, 4778151, 3904125, -710817, -1378685, -2841121, 3178276, 66572, + -8291435, 6676527, 3889093, -1559073, 1795296, -1052267, 85899, -191126, 1857573, 493921, + 2312840, 3929895, 1979980, -633508, -2538326, -1612760, 5654325, 2220498, -1129576, -1801739, + -335007, 8939974, 322123, -6977175, -14229227, 3375844, -785979, -11759620, 3910568, -3932043, + 504659, -4490389, -3496104, 3629247, 8866960, 1039382, 11761768, 5295695, -5978595, -7868380, + 12876312, -5662915, -450972, 1093069, -12156905, -156766, 6378027, -7099581, -1900523, 8050916, + 481036, 4172561, 94489, 5276368, -934155, -3695819, -515396, 7026567, 9554155, -3212636, + 1917703, 1593433, 6365142, -3878356, -693637, 1170379, -1640678, 4071629, 1851131, 266288, + -2199023, 3238405, 3665755, 113817, 161061, 2680060, 4292820, -5261335, -36507, 1363652, + 2351495, -2735894, 2130304, 979253, 60130, 1417339, -1651415, 635655, 1702955, 3491809, + 4312147, -3575560, 384400, 67025112, -6560563, 1013612, 4078072, -6124624, -10511932, -6150393, + -2695092, -11935714, -12818330, 878321, -11366631, -5044439, -3358665, -2864743, 6813966, 7975755, + 2445984, 16797618, 2957085, -8450348, 14439680, -1544041, 10194105, -3377992, -1189706, -9663676, + 253403, 8398809, -399432, -4211216, -1752347, 788127, -2237678, -1870458, 3161096, -7707319, + 2980707, 1069447, -3732327, -7312182, -5025112, 5508296, 5379447, 6485401, -11184095, 6146098, + 1586990, -330712, 380105, 1032940, 1097364, 1372242, -1067299, 528281, 5723044, -1709397, + 2173254, 2684355, -2566243, 4797479, 5428839, 874026, -629213, 5080947, 3528316, 2783139, + 3322157, -4367982, -2136746, 947040, -616328, -689342, 143881, 2248416, 472446, -4232691, + -39352636, -66065188, 24013162, -1612760, 10030896, -11510512, 618475, -13344463, -1666447, -19271518, + 8426726, 8976482, -358630, -1449552, -167504, 1855426, -4552666, -16426102, 30419106, 2156074, + -3816079, 10456098, 1921998, -5437429, 14643691, 16237124, -6882685, 9597104, 1930588, -2020782, + -15109695, -8272107, 11940009, -6064494, 1750199, -781684, 8143258, -12348031, -13846975, 2003602, + 279173, -9380209, 5757404, 1185411, -5798206, 4183298, -6395207, -5366562, 2643552, 2493229, + 416612, -1713692, -2976412, 3876208, 6562710, 962073, 2115272, -1851131, -1791001, 5680094, + 751619, 1279900, -5703717, -1324997, -3783866, 3193308, 4810364, 47245, 3972845, -53687, + 5269925, -4202626, 2680060, -62277, -178241, -3972845, 27917, -3408057, -380105, -21206402, + 63977832, -28329604, 4853313, 4243428, 16097537, -1973538, 10305774, -10052371, 700080, -19331648, + -3631395, 152471, 7894150, 1350767, 8128226, -5506148, -11688753, 1574106, -17624398, -18614388, + 633508, -6083821, -249108, 1642825, 2772402, -4582730, -2995740, -6618545, -10000831, 4110284, + 5001490, -13114683, -5847598, -16499117, 373662, -7267085, 6060199, 6992207, -13509820, 2186138, + 11368778, 10159745, -5126044, 3721589, -3751654, -1891933, 3300682, -6137509, -1191853, 5772436, + 4619238, 3964255, 4962835, 2604898, -1292785, 3816079, 2643552, -2815351, 0, 7756711, + -663572, -3543348, -981400, 3208341, -3161096, -7898445, -418759, -2750927, 2179696, 1694365, + -996432, -3197603, -4608500, -5572720, 5815386, -1887638, -60130, -1247688, -236223, -695785, + -52632676, -16187732, 6111739, -8177618, 7700877, -3313567, 240518, -15393163, -18532784, -2368675, + -6380174, 7999377, 2394444, -2102387, -38482908, 19572166, 1539746, 17078938, 21187074, 14718853, + -20044612, -4756677, -1797444, -4870493, 4518306, 4971425, -188979, -7183333, 8332237, -13488345, + -7148973, 12311524, 781684, -5044439, 14351633, 500364, 15047418, -4964982, -2226941, 1956358, + 4818954, -10477573, -7720204, -1690070, 8542690, -2866891, 1513976, -3169686, 5757404, 7224135, + 1516124, 566936, -12219182, -1095217, 6204081, 6981470, -3723737, 7799661, 2652142, -1904818, + 2132451, -7524783, -2267743, -4969277, 5242008, 1000727, -1662152, 2042257, -13050258, 287763, + 2660732, 6524056, 2229088, -3251290, 6255620, 788127, -8171176, -3573413, -4121021, -962073, + 1896228, 33601676, 11207717, -20525648, -3661460, -8955007, 6891275, -12470438, 10075993, -2488934, + 11751031, 8085276, 14306536, -19685982, 23244364, -14577119, 13539884, -8072391, 8061654, 1331440, + 6826851, -12674448, -28709708, 10874857, 19765440, -7436736, 8042327, -10337986, 2269890, -6865505, + 20798380, -418759, -2173254, 4769561, -10260677, -7290707, -6053757, 8950712, -4295, -3605625, + -85899, -2035815, 14267881, 9401683, -5463199, 4425964, 5375152, -6195491, -3545496, -5604933, + -10969346, -1733019, 137439, -1709397, -4086662, -11276437, -539018, 16621523, 9064528, -7284265, + 9328669, -1251983, -244813, 7655779, 4045859, -8287140, 2954938, 1546188, 8224863, 9702331, + -7984344, 3337190, 5731634, 7346542, -749472, -476741, -2808909, -1647120, 4194036, -957778, + 7687992, -2007897, 71625024, -58344984, -9758166, 2946348, -1093069, -16110422, 5448166, 4245575, + 22898618, -7464653, 4531191, 18805514, 545461, 11315091, 37179384, -8057359, -2379412, -19318762, + -18036716, 839666, 6186901, -8147553, 3566970, 32751274, 18988050, 2725157, 1284195, 2669322, + 18172006, -15118285, -6637872, -837519, 9399536, -1451699, 2299955, -7670812, 2950643, -13625784, + -7956427, -10303627, 225486, -9229885, 2267743, -16436840, 7642895, -32839320, -8340827, 4496831, + 6128919, -1236951, -7503308, 2531883, 1037235, 3925600, -8912057, 3985730, -5188321, -5950677, + -14418205, -10812580, -3113851, -1821066, 785979, 2443837, 4720169, 867583, 2295660, -8665097, + 17180, -10574209, -1511829, -747324, 360777, 3491809, 10617159, -6614250, -2858301, -719407, + -5538361, -9764608, 2261300, -45105748, -31346818, -2171106, -6221260, 23890756, 938450, 4548371, + -29545080, 1698660, 4243428, 1864016, 2452426, 18083960, -22174916, 4885526, -4606353, -15238544, + -7303592, 14364518, -4808216, 11720966, -3786014, 6854768, 3796751, -2244121, -1593433, 7739531, + -856846, 32212, -18955838, 9603547, 8738111, 8235600, 9494025, -17035988, -17529910, 10438918, + 15526307, -18330920, 6972880, 2774549, 16125455, 9300752, 1707250, 10844792, -5471789, -11025181, + -1503239, -21365314, -15509127, -1649268, -616328, 3504693, -10065256, 3659312, -8035884, -27421218, + -7887708, -7337952, -26961658, 122407, -4252018, -3098819, 3283503, 8521215, -7803956, 5278515, + 3635690, -12195560, -7647190, -9360881, -1825361, -2733747, -64425, -3835406, 5392332, -5909875, + -1329292, -5016522, 9109626, -9822590, 6079526, -1516124, -1990717, 579821, 2710124, -2280628, + -28166396, 43095700, -22503482, -9545565, -13134010, 3496104, 3768834, 6438156, -2660732, 18876382, + 14218489, -13376676, -23875724, 9073118, -8927090, 22136262, 1864016, 9521942, 11615739, -8211978, + -8038032, 29384018, -16720308, -3914863, -8469676, 1161789, -3468186, 4024384, -4915590, -1803886, + -22533546, 20061792, -6919193, -1623498, 23596550, -15988016, -20319490, 2001455, -9204115, -13228499, + -55835, -6700149, 5366562, -29197188, -9730248, -7039452, -672162, 10514080, 163209, 2235531, + 5381594, -4861903, 4116726, 7090991, 6000070, 6738804, -3730179, -6043019, -5413807, 7642895, + -17744658, -3697967, -4161823, -4202626, 11647951, -7683697, -12412455, 12792560, 3861176, 7780334, + 14961519, -5282810, -4967130, 7580618, -8057359, -10020159, -9401683, 5804649, 4303557, -5349382, + 5166846, 1926293, 6090264, 1299228, -11218455, 7726646, -3723737, -58961312, 29693256, 31978180, + 16449725, 14944339, -10441065, 15187004, -25398290, 959925, -29862908, -3826816, -12964359, 14044543, + -14214194, -11796128, -3131031, -21891448, 6590628, -9953587, 9844065, -20549272, 34561600, -11224897, + 16396038, -14050986, 1513976, -14078903, -4406637, 7883413, 22177064, 24809878, -12264279, 169651, + -7194070, -12990129, -9848360, -35246648, -727997, 5985037, -33105608, 13022341, 6667937, 9163313, + 16015933, 10084583, 5448166, -11102490, -3534758, -12390981, -6206228, 6715182, -26454852, 10529112, + 5315022, 1750199, -12442520, -7359427, 6936372, 21464100, 9122511, 5583458, -8336532, 8974334, + 1350767, -10127533, 2847563, -7316477, -11486890, -6006512, -2632815, -10471130, 12060268, 6805376, + 9835475, 5433134, -8643622, 2907693, 15043123, -2929168, 13980119, 7385197, 5233418, 9371619, + -4784594, -5589900, 3715147, 2448131, 49147312, -33496450, -13945759, -4108136, 8590, 24017458, + -4355097, 7977902, -13587129, 7554848, -8390219, -38530152, -26456998, -9747428, 14014478, -1492501, + -21245056, -19883552, -42069204, -13458280, 5534066, 5871221, 2080912, -4185446, -2362232, -12925704, + 3549791, 5654325, 7290707, 1803886, -1812476, -4898410, -20016696, -4975720, -4464619, 10286447, + -1997160, -15908559, -6204081, 4808216, -17944374, 3251290, -18511310, 10520522, 14654428, -13675176, + -26839250, -5059472, -8375186, -12186970, 1391569, 2587718, 2746632, 6762426, 429497, -10432476, + 16982300, 26383984, -12573517, 11025181, 4475356, 12575664, -18923626, 7310035, 2488934, 6919193, + -27260158, 21749714, 2692945, 2568391, -3257733, -15483357, 4127464, 2106682, 3895535, 4896263, + -16973710, -8875550, 3420942, 8123931, -4252018, 105227, 6388764, 2626373, -3017215, -8050916, + 5963562, 79590040, -44493712, 4058744, -4483946, -9496173, -33202244, -1808181, -1851131, 26989574, + 12335146, 54541788, -21713208, 2076617, 5954972, 13045963, -5596343, -2544768, 22106196, -13913547, + 31823560, 19273666, -44266080, 42150808, 14856292, -15255724, -11008001, -16640851, -8673686, 2989297, + 1924145, -11978664, 28016072, 3547643, -13445395, -11942157, 2720862, -14774687, -26025354, 195421, + 15513422, 6118181, 18869938, -8834748, 5862631, 20160576, 29085518, 6792491, -30122754, 9807558, + -9702331, -16681653, 4378719, 12650826, 7316477, -3768834, -27335320, -24026048, 33711200, -4554813, + 26053272, 2877628, -10262824, 12659416, -22591528, -10125385, 10900627, -3042984, 22417582, -18146236, + -35682588, -10157598, -1739462, -11106785, -8544837, 22056804, -7417409, 3929895, -20366734, -20063940, + 9758166, 4949950, 8224863, -8839043, 8398809, 682900, -4733054, -1206886, -89620936, -58177480, + 21592948, -30148522, 9852655, -14980846, -54159536, -40035536, 72703056, -33217278, 32923072, 18663780, + -18773302, 17057462, -10582799, 22995254, 25479894, -1477469, -7020124, 43621836, -13962939, -48964776, + 968515, -20420422, 5179731, 4797479, 29577292, 15736760, 6285685, 14544907, -13067438, 143881, + 32373316, 20731808, -5641440, 8433168, -28275918, -43836584, -32244466, -22531398, -6191196, -6126771, + 8308614, -3974992, -12081743, 28310276, 7582765, -21064668, -19651622, -5592048, 8362302, -21227876, + 8699456, 26414048, -360777, 9964324, -17897128, 14134737, 10376641, 3345780, 10580652, -15790447, + -24404004, -34497176, 17547088, 13731010, 1363652, 13625784, 2731599, -15779710, -3171833, 1305670, + -27502824, -2426657, -42820824, -23547158, 7355132, -10894185, 8420283, 1099512, -5512591, -5787469, + -3869766, -7928510, 7799661, 292058, -1097364, -107176616, 36754184, -8370892, -6865505, 19344532, + 4887673, 10857677, 46952584, 28071906, 35508644, 17918604, 48423608, -8327942, -46787228, 7069516, + -5085242, -19995220, -41420664, -18023830, 36590972, 8381629, -2312840, 7718056, -2564096, 633508, + 30878668, 4011500, 11592117, -4526896, 7806103, 30659624, -8231305, -20446192, 15747498, -36395552, + -36442796, -23480586, -4410932, 1101659, 15425375, 35888748, 788127, -12275017, -35450660, -58405112, + -20336670, -8461086, -3246995, -324270, 21837762, -26738318, 48528836, 25142738, -4325032, 13945759, + -18743238, 3511136, 670015, 22376780, 43411380, 29137058, -25097642, -10630044, 7509751, -4060892, + -5104569, 2252710, -12799003, -41766408, -2845416, -7687992, -2671470, 6567005, -15940771, -5480379, + -28174986, -3023657, 4357245, 29873646, 15017353, 4194036, 5190468, 7544110, 1318555, -25284472, + 5600638, -5896990, 7148973, -3094524, -2920578, -13855564, 43364136, 43898860, 14721000, 29278792, + 21045340, 46080704, -41047004, 47921096, -59105192, -10604274, 54741504, 75172664, 15479062, -5057324, + 27206470, -23448374, -27290222, 54314156, 8549132, -8665097, 13039521, 43619688, -11785390, 26658862, + -9064528, -11239929, -5512591, 19557134, -51065012, -6442451, 24438364, -11512660, 2342905, -18217104, + 10290742, 40007620, -37372656, 11761768, -11250667, 12932147, -19666656, 26813480, 2050847, 9554155, + 10711648, -45210972, 21741124, -62861140, -13005161, 35313220, 3577708, -22576496, 38989712, -13737453, + -23927262, 28284508, -11972221, -8319352, -4756677, 17018808, -2849711, 4365835, -34482144, 12264279, + 2896956, 66752380, -50594716, -22089016, 5695127, -13108240, 14811195, 18713172, -24496346, 46645492, + 17212082, -362925, 7380902, 15530602, -7900593, -25524990, 9704479, -13234942, 3865471, -5304285, + 11875585, -16226386, 4574140, 27917, -8875550, 10636487, -4105989, 89526448, -56173876, 2055142, + -9105331, -15071040, 1705102, -20581484, -8800388, -66406636, -55649892, -55364276, 18356690, -11611444, + 18133352, -12700218, -40355512, 64046552, 44502304, -29845728, -25196426, -35218732, -7548405, 13675176, + 20952998, 25898652, -2040110, 20040318, -5991480, -25396142, -31172872, 19314468, -14325863, 58512488, + 36436356, 53972708, 7352984, 19617264, 52918292, 36846524, -11931419, 9706626, -2639258, 665720, + 5357972, -24775518, -18126910, 9562745, -31286690, -31913754, 30618822, 35188668, -38860864, -1236951, + 68184752, 47749300, -2770254, -22604412, -5315022, 14239964, 12539157, -9212705, -25853556, 30674656, + -2405182, 7567733, 21569326, 27910844, -29506426, 12594992, -5149666, 11660836, -45679124, 8471823, + 40510132, -40617504, -33846488, -17239998, 17761838, 32388348, -18642306, 17879948, -16134045, -1468879, + 508954, 6863358, 11652246, -5493263, -2937758, 7492571, 6335077, 242666, -1376537, 5471789, + 72606424, 27940910, -9715216, -2362232, 22763326, -27206470, -35373352, 30307436, -42258184, -54715736, + 14523432, -29368986, -37845104, -19752554, 36135708, 88650272, 36689760, -48262548, 90806344, 10531260, + -14235669, 16357383, -53027812, 13481902, 7325067, -38016904, 32877974, -10228465, 6489696, -27373974, + 15375983, -25016038, 45958296, -54432268, -20044612, -18807662, 25930866, 29920890, 26667452, -28930900, + 8461086, -30245160, -8677981, 16116865, 38416336, 17731772, -17643726, 37415608, 19088982, 30182882, + 2029372, 35184372, -15382425, 19454054, -53560388, 60185376, -5216238, 8381629, -15949361, -31376884, + 1617055, 20104742, 48088600, 14139032, -57490284, 24524264, -23248658, 47373488, 4114579, -18081812, + 9199820, -15635828, 9899900, -33481418, 13415330, 3197603, 2954938, 5366562, -6517613, 3459596, + -8978629, -14029511, 18801220, 11766063, 10861972, -24820616, 8237748, -13460428, 11647951, 2615635, + -1477469, 5815386, 2845416, -148921552, 6358699, 24691766, 58244052, 19007378, -91684664, 121678568, + 44498008, -56008520, 19896436, 121023592, 27064736, -29639570, -3841848, -73652248, 37572372, 3302830, + -18949396, 10389526, 24985972, -47826608, 25303800, -59882580, 6146098, -54593328, -49067852, -21006686, + 22840636, 34806416, -26897232, 30419106, -53203908, -7801808, 59431608, 5332202, -21642340, -7174743, + 11493332, -13973676, -39492224, -44079248, -5959267, -20325932, 42900280, -60591252, 63872608, 20222854, + 8070244, -21599390, -7148973, 29448444, -24099062, 39786428, 9805410, 35948876, -13428215, -21120502, + -63359356, 21453362, -6483253, -65373696, 19475530, -4582730, 39603892, 63739464, -27090506, 14340896, + 31437014, 33429878, 6805376, -19698868, -3895535, -79136920, -3938485, 7005092, 19417548, -618475, + 52982716, 11276437, 26310970, -30041148, -21410412, 39483636, -4133906, -8302172, 23976654, -5813238, + -6805376, -685047, -1378685, 2347200, -4352950, 21900038, 184451664, 84091168, 17529910, 29991756, + -37752764, -25338160, -8894877, 69720208, -49340584, 7937100, -41042708, -113359216, -54320600, 26029650, + -28915868, 18747532, -44869524, -2252710, -48249664, 41467908, -48850960, -35165044, -105149392, -19606526, + -16471200, -27633820, 54863912, -17798344, -43840880, 14302241, 42341936, 15700253, 14413910, -6298570, + -8821863, -27801324, 21620866, -35794256, -9607842, -22241488, -62672164, 9562745, -43471512, 17583596, + 5667210, -12773233, -1359357, -45704896, -2551211, -10400263, 66911296, -19245748, -1535451, 27200028, + -36621040, -16275779, 67901288, -39603892, 25982404, 1778117, 60393684, 85755464, -5010080, 11085311, + 8589935, 29673930, 15539192, -65420940, 6027987, 16544214, 23109072, -27998892, -43548820, 4578435, + 12674448, -11390253, -16548509, -70177616, -34617436, -40364104, 2838974, 8864812, -13224204, -19288698, + -21904334, -5379447, -10992969, -12281459, 14626511, -6889128, 7086696, -25252260, 1808181, -9756018, + -17493402, 4101694, 10284299, -13623636, }, { -92342, - -25770, -98784, 6442, -64425, 146029, 96637, -463856, 6442, -302795, -360777, - 96637, 302795, 294205, 107374, -670015, -410169, 133144, -210453, 34360, 135291, - 173946, 281320, -208306, -227633, -423054, -244813, -2147, -962073, -21475, -96637, - -281320, 197569, -556198, -485331, -985695, -137439, -871878, -268435, -23622, 691490, - 188979, 528281, -274878, 560493, -152471, 109522, 674310, 4179003, -3274913, 2037962, - -2589865, 1318555, -1262720, -1247688, -751619, -710817, 753767, 865436, -3206193, -178241, - 470299, -322123, -539018, -1879048, -685047, 1333587, 2025077, 1011465, 3193308, 646393, - -569083, 652835, 551903, -330712, 1043677, 2267743, -871878, -25770, 968515, -32212, - -221191, -1629940, -62277, 822486, 661425, 130997, 47245, -543313, 575526, -62277, - 70867, 30065, -554051, 15154792, -1002875, 1305670, -974958, 962073, -1168231, 227633, - -298500, -283468, 854699, -816044, -2770254, 779537, 268435, 837519, 1846836, 981400, - 652835, -264141, -1612760, -562641, 719407, -231928, -274878, 1541893, -1990717, -639950, - -49392, -352187, -504659, 734439, 805306, 1002875, 270583, 347892, -433792, 1395864, - -79457, 1067299, 745177, -266288, -158914, 500364, -4295, -315680, -161061, 2147, - 11162620, -10640781, 1685775, -2866891, 1556926, -182536, 1127429, -1009317, 2018635, -841814, - 1228361, -2534031, 113817, -1464584, 435939, -223338, -335007, -674310, -1857573, -180389, - 236223, -912681, 1548336, -682900, -1099512, -1398012, 856846, -891206, 2196876, -219043, - 21475, 650688, 23622, 55835, -955630, -809601, -210453, 229781, -356482, -932008, - 850404, 603443, 1513976, -341450, 508954, -201863, 296353, -26124138, 3103114, -1928440, - 90194, -268435, -2160369, 2407329, -549756, 244813, 1037235, 337155, 2785286, -103079, - -1086627, 3330747, 1367947, 3008625, -27917, -3912715, -2327872, -1870458, 1662152, -2027225, - 206158, -717260, -661425, 270583, 646393, -566936, -1202591, -891206, 833224, 932008, - 1756642, -107374, -204011, -79457, 1101659, -1166084, 345745, 500364, 826781, -944893, - 1054415, -1151051, -171799, 423054, -33002528, 12010876, -4791036, 5577015, -3809636, 2579128, - -4133906, 2409477, -3060164, 1234803, 2338610, 156766, 919123, 2151779, -1322850, 1559073, - -1707250, -1241246, -3811784, 3549791, -2224793, 2394444, 210453, 34360, -3655017, -85899, - 747324, -474594, -88047, -88047, 1574106, -178241, -1047972, 1217623, 388695, -418759, - 109522, 105227, 165356, 725850, -964220, 2617783, -176094, -1550483, -133144, -818191, - -60130, 1625645, 15025943, -3231963, 5699422, -2617783, 1956358, -2123861, 7103876, -1370095, - 3790309, -438087, -279173, 959925, -4295, -4885526, 1108102, -442382, -2203318, -534723, - 81604, -6146098, -169651, 504659, 1941325, -47245, -1168231, -238371, 2104534, 386547, - -1043677, -2068027, 3161096, -1960653, -77309, -2922725, -322123, 8590, 508954, -710817, - 775242, 1264868, -1236951, 1002875, -47245, 801011, -45097, 1449552, -730144, -438087, - 1305670, 1823214, 39575976, -11632919, 1653562, -2033667, 2536178, -45097, -100932, -5405217, - 2321430, -2405182, 1565516, 496069, 770947, 1644973, 2613488, 341450, 867583, -4561256, - 1584843, 1582696, -2950643, -635655, 2976412, 1889786, 1879048, 4234838, 2353642, 551903, - 1084479, -1692217, 1312113, -463856, 2424509, 3146064, -511101, 1007170, 1971390, -934155, - 646393, -2888366, -809601, 2725157, -6442, -2055142, -727997, 762357, 2029372, -234076, - 1127429, -103079, -1730872, 2862596, -21159156, 8972187, -6139656, 4084514, -3635690, 4812511, - -3062312, 244813, -2600603, -3204046, -4507568, 362925, -2662880, 1355062, 1556926, 3478924, - -5574868, 3506841, -1307818, 4851166, 1088774, -236223, 412317, 418759, -1103807, -914828, - 760209, -2239826, 1533303, 2765959, -3663607, -764504, -193274, 1533303, -1382980, 3936338, - -4028679, 835371, 17180, 294205, -1720134, 326418, -1071594, 1078037, 180389, 246961, - -1219771, -167504, -2551211, -822486, -128849, 616328, 216896, -889058, -3238405, -64425, - -646393, -34144992, 10870562, -6964290, -431644, -1391569, 2173254, -5869073, 453119, 1906966, - 1586990, -2031520, 1206886, -2602750, -4288525, -1657857, 577673, -2559801, 9101036, 274878, - -2480344, -798864, -2995740, -1395864, 2804614, 1683627, 3629247, -302795, 1638530, -2003602, - 871878, -1812476, -586263, -1052267, 642098, 1142461, -534723, -1720134, 468151, 676457, - 2527588, -414464, -874026, -3221226, -2604898, -1241246, -472446, 627065, 481036, -1309965, - -504659, 257698, 1232656, 635655, 251256, -564788, 1251983, -386547, 2108829, -32867238, - 15474767, -7243463, 6925635, -3560528, 4118874, 2055142, 1282048, -3710852, 493921, -1876901, - 597000, -4870493, 1881196, 3098819, 1032940, -5186173, -2546916, -2594160, -2692945, -1760937, - 3779571, 925565, 2673617, 2138894, -882616, -184684, -3899830, 5113159, -1406602, -487479, - 367220, -1063004, -1518271, -1816771, -373662, -4116726, 1275605, -2173254, 1702955, 1471026, - 2424509, -618475, 311385, -2665027, 1067299, 2007897, 523986, -416612, 453119, 1576253, - 2368675, 1030792, 2207613, 122407, 386547, -103079, -435939, 10647224, 13179107, -6006512, - 3502546, -1874753, 1292785, -1458141, 725850, 1127429, 6438156, -2327872, 2634963, 6043019, - -1690070, -285615, -1058710, 1436667, 3109556, 3182571, 4155381, 1093069, 3532611, -949188, - -2136746, -7168301, 1471026, -1123134, -3607773, -2594160, -150324, -717260, 2272038, -371515, - -4166118, -4312147, 1123134, -3753802, 472446, 2214056, -3360812, -2276333, -1443109, 1612760, - 1479616, -154619, -463856, 2450279, 508954, -1009317, 979253, -2201171, 249108, -1181116, - -1644973, -1142461, 1677185, -914828, 1260573, -1007170, -2102387, 517544, 1133871, -781684, - 642098, -970663, 38019052, -13247827, 7168301, -4973572, 7127498, -5042292, 4367982, -1640678, - 4436701, 1069447, 3120294, -3648575, 3725884, -1288490, -3107409, -332860, -3337190, -5327907, - -2813204, -590558, 2690797, -3655017, -4876936, -5980742, -1078037, -536871, 4767414, 2600603, - 3062312, -2110977, 2476049, -1909113, -1866163, -1039382, 3146064, 2703682, 846109, -36507, - -115964, 70867, -884763, -515396, 2177549, 408022, 5362267, -2074469, -646393, -4488241, - 2927020, -1185411, -695785, -1071594, -277025, 242666, -743029, 796716, -1196148, -2147, - -1696512, -768799, 380105, 1728724, -908386, -135291, -609885, 10660109, -16344498, 9545565, - -6128919, 7410966, -107374, 4591320, 1279900, -7176891, -3416647, -2435247, 850404, 1771674, - 977105, 8055211, -4567698, 6433861, 1099512, 796716, -4440996, -979253, 5555540, -388695, - -4765266, 5373004, 4093104, 891206, -2248416, -1775969, -496069, -397284, 2473901, -1245541, - 1088774, -3042984, -695785, 1722282, -4383014, 1647120, -1715839, 1539746, -1288490, -405874, - 5113159, 2199023, 2901251, -244813, 1185411, 1864016, -412317, -1436667, -2293513, 755914, - 1011465, 1806034, 2183991, 498216, -523986, -2291365, -1058710, -2319282, -2078764, 246961, - 42950, -1745904, -40443560, -8134668, -1043677, -6713034, -2757369, 6103149, 2630668, -1720134, - -1524713, -4814659, -3182571, -3897683, -4376572, -3624953, -2291365, -3274913, -5602785, -4784594, - 1909113, -4859756, 1683627, -6554120, 266288, -2682207, -2130304, 5802501, -536871, -2744484, - 3768834, -4116726, 3981435, 1232656, 4198331, 2879776, -25770, -1928440, 4415227, -2147, - -609885, 4026532, -1591285, -5340792, -6043019, -1509681, 2089502, 1355062, -1752347, -120259, - -1617055, 448824, 152471, 373662, 3891240, 1563368, -2695092, -981400, 566936, 2486786, - 631360, 3682935, 1063004, -242666, -1784559, -1632088, 96637, -47620448, 41461468, -16883516, - 11512660, -10819023, 2658585, -5312875, 7022272, 1329292, 826781, -3393024, 4763119, 966368, - -8546985, 867583, 1275605, -4307852, -6584185, 6515466, 8100309, -2615635, -2121714, 1344325, - 3740917, -2194728, 7380902, -242666, 1881196, -5360119, -1887638, -3199751, 4816806, -1082332, - 1060857, 1024350, -2740189, 4638565, 4481799, 1202591, 1550483, 5437429, -3309272, -904091, - -678605, -3987877, 869731, -2611340, 987843, -148176, 373662, 4432406, -150324, -1041530, - 1009317, 206158, 2937758, -2738042, 1045825, -208306, 5738077, -1737314, -204011, -2282775, - -459562, -1479616, 31731218, -3893388, -6700149, -1638530, 4213363, 2145336, 1870458, -294205, - -4479651, 1035087, 2624225, 2982855, -2078764, -1960653, 6354404, 2132451, -5074504, 1017907, - 8239895, -10426033, 6869800, 781684, 8800388, -644245, 448824, 1683627, 1733019, 4606353, - -3493956, -1355062, 1690070, 3294240, -1374390, -141734, 380105, 732292, 2055142, -4303557, - -148176, 2433099, 657130, -2388002, -775242, 5441724, 3992172, 1881196, -2143189, -1576253, - 1531156, -743029, -1395864, 929860, -1733019, -2673617, 5596343, 2179696, 3582003, 539018, - 2692945, 2192581, 2390149, 242666, 2905546, 1445257, 2052994, -1733019, 354335, 762357, - -2546916, 878321, -1249836, -268435, 15098958, 4385162, 3642132, -2214056, -1481764, -4103841, - -2931315, 745177, -1608465, -2020782, -5877663, 5003637, 3466039, -3663607, 6259915, -5896990, - -1782411, 2624225, -4365835, 2534031, 4065187, 6206228, 5482526, 5220533, 2712272, -11046656, - 4295, -2321430, 2214056, -1069447, 4322885, 2924873, -1421634, -2690797, 2838974, -1977833, - 7292855, -4295, 2413772, 7383049, 7078106, -5345087, 450972, -3526168, -6352257, -691490, - 1198296, -816044, -1299228, -682900, 554051, -2980707, 399432, -3476776, -968515, -414464, - 929860, 21475, -2025077, -2166811, 4434554, -1567663, 685047, 1975685, 2454574, -1357210, - -1374390, -652835, -3493956, -2388002, 384400, 758062, 35680440, -25104084, 9139690, -9536975, - -734439, -6663642, 6030134, 5989332, 1932735, 1217623, 5665062, 15571404, -13683766, -1902671, - -3556233, -5527623, 12081743, 9096741, -1861868, -8278550, 3356517, -6764574, -5405217, -9476845, - 1213328, -9704479, -3204046, 5714454, 826781, -2978560, -8005819, 12885, -1930588, 4864051, - 4475356, 2063732, -3635690, 543313, -227633, 1964948, 3863323, -2454574, -1236951, -4344360, - 6582038, -820339, 972810, 5864778, -1211181, -541166, 2347200, -2954938, -304943, 2540473, - -4361540, 985695, -809601, -388695, -4548371, 2203318, -974958, 384400, 1118839, -1690070, - 2982855, -2355790, -609885, -4876936, 438087, -685047, 2022930, 2128156, -55548960, 7703024, - 792421, 3917010, -4254165, -6919193, -15032, 4666482, 7406671, -433792, 11254962, 6279242, - -7582765, -6762426, 5272073, 966368, -5394479, -10039486, -11519102, -7376607, -8493298, -9509058, - 1750199, 3062312, 2568391, -7028714, -6755984, 1065152, -1754494, -1127429, -874026, -5602785, - 4801774, -9665824, -3592740, -1445257, -317828, 3135326, 1129576, -635655, 4516158, -1329292, - 4503273, 2602750, -3397319, 586263, 7295002, -2860448, -2858301, 225486, 4290673, 1136019, - -2972117, -3837553, 3594888, 225486, -5044439, 7026567, 7926362, 989990, -2201171, 977105, - -96637, 1709397, 3532611, -304943, 4670777, 2976412, 2695092, 2355790, 1251983, 1969243, - -2259153, -135291, -34048352, 29072634, -9749576, 6199786, -180389, 4829691, -11802570, 4544076, - -8053064, 25770, -5458904, 10907069, 9268539, 3500398, 730144, -8985072, -5980742, -936303, - -3635690, 10355166, -8497593, -345745, -4224101, 15171972, -4855461, 1352915, -455267, 2609193, - 1163936, 2602750, 1885491, -2514703, 1340030, -614180, 5272073, 816044, 10020159, 5211943, - -3270618, -682900, -1279900, 184684, -3865471, -2705830, -989990, 1795296, 12221329, 1114544, - 790274, -3362960, 4967130, -1853278, -2647847, 1617055, -2574833, 1511829, -3189013, -6854768, - 3371549, 3038689, -985695, 7166153, 1494649, 1702955, 2544768, -1919850, 818191, 2325725, - -5961415, -2783139, -489626, -2699387, 2697240, 4234838, -1556926, 7269232, 4829691, -163209, - -1932735, -1462436, -504659, 22215718, -487479, 5016522, -15079630, -2499671, 1917703, -12167642, - 983548, 16879222, -2929168, 1221918, -7599945, -10417443, 2662880, -9517648, 14877767, -10314364, - 3577708, 3524021, 7971460, 6199786, -1614908, -9201967, -1058710, -841814, 4724464, -6448894, - -1241246, -1887638, -3062312, -2181844, 4518306, 2778844, 12066711, 4099546, -4479651, 5007932, - -3272765, -3451006, 3717294, 10327249, -1475321, -5323612, -4980015, 5491116, -126702, -7471096, - -6878390, 3532611, 3292093, -3098819, -5684389, -9446781, 2619930, 3521873, 2375117, -5334350, - 4015795, 2467459, 1677185, -1894081, -573378, 2924873, -7088844, -925565, 3131031, 3682935, - -670015, 1795296, 154619, 75520560, -4870493, 2987150, 6865505, -6674379, -2877628, -2323577, - -17862768, 11903502, -1992865, -11100343, 2327872, -5723044, 6433861, 5078799, 8192650, -2997887, - 11141145, 9536975, 6077379, -9938554, 7524783, -13612899, -8055211, -9283572, 3588445, -7146826, - -1342177, -2476049, -9090298, -4964982, 7563438, -5731634, -4348655, -8682276, 2740189, 2723009, - 6397354, -3706557, 11053098, 2716567, 12607876, -1513976, 2244121, 2493229, -7054484, 4930623, - 12910672, -4526896, -418759, 3466039, -3826816, -5291400, 3021510, -5272073, -2866891, -6874095, - -4522601, 4992900, 4453881, 2976412, 4786741, 6025839, 5744519, 8665097, 1372242, -2643552, - 4471061, 3015067, -90194, -923418, 324270, -3320010, -736587, 633508, 760209, -238371, - -33247342, -65399468, 24535000, 433792, 1544041, -6358699, -6807523, -1382980, 2456721, -4056597, - 17334488, -7741679, -14774687, 1067299, 1144609, -1799591, -5080947, 11847667, 2314987, -5080947, - 5632850, -10206990, 13338021, -7198365, -3635690, -8802535, 14867029, -6191196, -1930588, -8727374, - -3914863, 8111046, -3524021, 8768176, -10954314, -12889197, 1267015, 2400887, 2454574, -212601, - -6551973, 1378685, 3678640, 1857573, 7000797, 85899, 10866267, 1602023, 10198400, 13209172, - 2927020, -871878, 2671470, -7219840, -1677185, -12139725, -10711648, 3315715, 3448859, 2252710, - -554051, -3388729, -1625645, -2884071, -1462436, -2879776, 268435, -171799, 2497524, -650688, - -1221918, -4088809, -113817, -4767414, -377957, -6360847, -639950, -2308545, -502511, -21912924, - 64132452, -29149944, 13423920, -6152541, 20405390, -3169686, -8939974, -9345849, 5398774, -2761664, - -1155346, 496069, 4041564, -21509196, -10458245, -5527623, 8626442, 7226283, 12629351, 2327872, - -1846836, -1960653, 15144055, -19561428, 11420318, -9397388, -1891933, -9902047, 15648713, 6279242, - -10048076, 1372242, -4359392, 1705102, 6687264, -28093382, -11660836, 2340757, 9968619, -5759551, - 2173254, 7239168, -2834679, -3152506, -929860, 10907069, 4395899, 1887638, 1320703, 4219806, - 12889197, -7735236, 5954972, -17927194, -2989297, 4065187, 8772471, 1642825, 1372242, 438087, - 4810364, -3493956, 663572, -1247688, -4101694, -3672197, 6841883, 6543383, -2332167, -3382287, - -11029476, -4715874, -2360085, -1992865, 8287140, -3100967, -2901251, -5461051, -4784594, -395137, - -57488136, -12393128, 5639292, -13623636, 3448859, 2521146, 8439611, -25770, 16076063, 10503343, - 5819681, -4387309, -7870528, -390842, 17005924, -14512694, -5538361, -11242077, -236223, -30760556, - -24257976, 1550483, 15075335, 20755430, 4799626, -7522635, 7084549, -6676527, -4460324, -4537633, - 2063732, 5454609, 1337882, 8096014, -6111739, -10922102, 9075266, 5989332, 19048180, -2304250, - 3111704, -2701535, 15365246, -15945066, -8010114, -3747359, -12113955, 7750269, -4990752, 6515466, - -12977244, 12987981, 12579959, 11605002, -4700842, 10292889, 564788, 3618510, 6023692, 4327180, - -5418101, 996432, -1677185, -249108, 11819750, 4462471, -5177583, 9614284, -1537598, -8216273, - -2727304, -539018, -11628624, -405874, 4872641, 6401649, 1024350, -176094, -4797479, 1831804, - 2832531, 41624676, 27041114, -8609262, 12225624, -27790586, 19402514, 7067369, 14585709, -5100274, - -3770981, -15247134, -7866233, -26010322, -4569845, -20725364, -6352257, -12801150, -13106093, -17622250, - 6878390, -24049670, 3137474, 10271414, -4694400, 3176128, -10406706, -227633, -3309272, -3511136, - -14151917, -1990717, 1529008, -1058710, -2259153, -7462506, -6491843, 4234838, 4520453, 5976447, - 30356828, -12384538, -801011, 12223477, -3051574, -5179731, -11781095, 3496104, 10241350, 16986596, - 5667210, 14143327, -14033806, -21058224, 1898376, 13612899, 7582765, -11422466, 13035226, -10024454, - 6227703, 2499671, 11839077, 6624987, 4279935, 7960722, -8169028, 5031554, 4194036, 2321430, - 11626476, 2572686, 9373766, -1539746, -3897683, 1380832, 2147484, 1844689, 11278584, -1947768, - -6517613, -738734, 84217864, -54445152, -2916283, 6354404, 1737314, 6670084, 11577084, -2289218, - -1808181, 6502581, -9676561, -9259949, -1477469, 7492571, 30346092, 1301375, 10520522, -9730248, - 665720, -29927332, 18564996, -18092550, -25750476, 6027987, 7305740, -9554155, 8677981, 3637837, - 20068234, 22164178, -3616363, -8340827, -6242735, -33077690, -17972290, 25960930, 8626442, 9562745, - -14858439, -15305116, 4610648, -2957085, -13112535, 11510512, -2433099, -8235600, -9451076, 6524056, - -8456791, -4552666, 30492120, -18530636, 5708012, -6644315, 7127498, -8338679, -3347927, -22686018, - 3901978, -8398809, -5577015, 18137646, 4456029, 5059472, 11050951, 13153337, 3996467, 9105331, - -3977140, -1078037, -14828375, 6813966, 12382391, -2813204, 884763, -1367947, -3021510, -3839701, - 1458141, -3949223, -1713692, -52104396, -25512106, 9998684, -2959233, 19288698, -2403034, -4707284, - -14847702, -16666621, 9255655, -17435420, -5849746, -9764608, -1698660, -10320806, -6987912, -8233453, - -4093104, -10277857, -19765440, 11798275, -39483636, -133144, 35886600, 8972187, 92342, -9446781, - 2804614, -35699768, 15135465, 9330816, 2761664, 13292924, 19608674, -14959371, -7752416, -15577846, - 2609193, 854699, -9133248, -10453950, -11639361, -6777459, -274878, 8196945, 923418, 6775311, - 3942780, 1101659, 24973088, 6240588, -3706557, 19887846, -9300752, -21945136, -6573448, -2302103, - -2931315, -1123134, -7432441, -1408749, -9332964, -1984275, -9496173, 1318555, 5527623, -10346576, - -2768107, -5551245, 715112, -10492605, -13477607, -5609228, 5836861, 10075993, 4196183, -2869038, - -100932, 4084514, -1505386, -1911261, -4544076, 2564096, 5405217, 1421634, 45097, -5695127, - -32089848, 43628276, -21288006, -10473278, -35358320, 27876486, -9631464, 16492674, 1157494, 1159641, - -10634339, 21891448, -5291400, 7243463, 5519033, -9781788, -3255585, -3051574, -18691698, 3925600, - 3536906, -14375256, -24298778, -14985141, -22348862, -5278515, 12298639, 6571300, -13112535, -12964359, - 19754702, 13722421, -16879222, 15824807, -8360154, 14027363, -21427592, -16808354, -16312286, 6049462, - -14439680, 9423158, -6468221, 4116726, -3912715, -1846836, 3474629, 15921444, -34218004, -4099546, - 6927782, -2886218, -10350871, -24500640, -2130304, 22975928, 8590, 19947976, 14577119, 4473209, - -2742337, 15300821, -14847702, -11952894, 9650792, -3317862, -9201967, 6635725, 1909113, -6968585, - -10591389, 18303004, -16737488, -8849780, -9987946, 10520522, 562641, -6929930, -4039417, 5628555, - -15461882, 341450, 4191888, 3466039, 399432, -4975720, -7509751, -73916384, 28112708, 12148315, - -18279380, 9631464, -20729660, 19447612, 16844862, 14385993, -37666864, 23444078, 40763536, -5186173, - 14134737, 1022202, -12146168, -16056735, 44865228, -221191, -3502546, -24081882, -47908212, -25812754, - 2871186, -21030308, 18249316, -31318902, -10106058, -18352396, 5546951, -6970732, -23212150, 4297115, - -5037997, 15850577, -4810364, -18247168, -6713034, -56549688, 10604274, -1455994, 26703960, -15792595, - -17422534, 24818468, 5568425, 4320737, -9410273, -14948634, 5836861, 11441793, 8506183, -3730179, - 9012989, 4939213, 1410897, -4726612, -4960687, -18515604, 1881196, -7217693, -10531260, 10086731, - 5948530, 27908698, 6199786, -18431852, -18337362, 4337917, -11738146, -8714489, 3513283, -8974334, - -15032, -4030827, -5046587, 5473936, -6964290, 2901251, -513249, -1294933, -2336462, -3893388, - -8632884, -10791105, -3002182, -9279277, 61132416, -25333864, -485331, 2583423, 25037512, -4176856, - -5922760, 16928614, 29654602, -21444772, -24676734, 17716740, -4432406, 15307263, 22486302, 18650896, - 15895674, 12644384, 14963666, 59390808, -6002217, 3627100, 10808285, 32407676, -7786776, -12970801, - 11879880, -1692217, -11753178, -14156212, -12605729, -470299, -16112570, 22181358, 33681132, -2574833, - -9524090, 13711683, -9352291, 19965156, 13922136, -223338, -18811956, 12880607, -2308545, -6573448, - 1879048, -3171833, 39320424, -4105989, 16582869, -9562745, 34924528, -4032974, 2280628, -13144747, - -22724672, 17637284, -11774653, 35521528, 7009387, 16492674, -801011, -466004, 9547712, 2183991, - 24921548, 13851270, 3762391, 12425340, -16125455, 5164698, 10952167, 751619, -5267778, 20699594, - 4305705, -7503308, -7943542, 7999377, -4904853, -463856, 11014444, -4194036, 6320045, 2463164, - -7627862, 80474800, -22943716, 7750269, -7486128, 3798899, 10533407, 27215060, -20744692, 11544872, - -266288, 1707250, 14804752, -11710228, 15807627, -42011224, -19024558, 7365869, 15880642, 11441793, - 33758444, -33170032, 5345087, -4702989, -45758580, 19838454, -17742510, -11323681, -6599218, -37325412, - 12300786, 13565654, 5927055, -19301584, -32858648, 13249974, -20347408, 18184892, -31499290, 801011, - -37705516, -8897025, -25183540, -21487722, 22314502, 35126392, 4827543, 13176960, -16041703, 6880538, - -26912266, 11824045, -17695266, 5317170, 25701084, 13544179, -9122511, 16058883, 2518998, 13975824, - -11678016, 23117662, 38635380, 2566243, -23514946, -15700253, -10576357, -3783866, 2362232, 17912162, - 3309272, 28778428, -251256, 11353746, -25823490, -3236258, -18700288, -2952790, -2948495, 6380174, - -23461258, 3768834, -1986422, 7593502, 2308545, 4984310, 2126009, 2471754, -81559280, -68373728, - 29280940, -8332237, 34003256, -2342905, 11308649, -40733468, -38210176, -23117662, 13129715, -31467078, - -21640192, -9101036, 6644315, 23514946, 8555575, -46263240, 12814035, 26336740, -65779572, -7578470, - 3446711, -69808248, -23796266, 31525060, -64688648, 32122060, 33743412, 727997, -9118216, -2347200, - -15375983, -16935056, 11903502, 14652281, 48964776, -28479928, -14867029, -11791833, -22368190, 1644973, - -38360500, -9313637, 3184718, -777389, -12322261, -1649268, -21023864, -3998615, 12105365, -4995047, - -13627931, 16430397, -7316477, -15455440, -22310208, 48290464, -1780264, 29551522, 4080219, 11291469, - 31840740, 4898410, 21758304, -14014478, 24152748, 17703856, 5415954, 6612102, 6077379, 21197812, - 9717364, 4211216, 20353850, -8227010, 3137474, -2001455, -31284542, 15066745, 7670812, 4645007, - -19086834, -5149666, 3764539, 6459631, -5362267, -132559872, 50304804, -14448270, -59332824, -14319421, - 1737314, -15189152, 23237920, -51359220, 25074020, -3951370, -59055800, -40675488, 8364449, 23744726, - 22492744, 16518444, 35169340, 10168335, 57685704, 31630286, 67572720, 8933532, 54941220, -41942504, - -32920924, 11493332, 5020817, -33238752, 9616432, 7249905, -4387309, -12573517, 32682554, 6365142, - -71236328, -31726924, 24247238, 8409546, -14892799, 20602958, 21146272, 32637456, 7273527, 9786083, - 6360847, 9575630, 12154757, -24711094, 4075924, 4702989, -52587580, 25054692, 18650896, 22565758, - -35946728, -20918638, 26749056, 152471, -6721624, -5353677, -15193447, -13593571, 403727, -18126910, - -40336184, 13937169, 43679816, -30384746, 4552666, -17231408, -6708739, -12537010, -3603478, 22443352, - 5697274, 18556406, 5718749, -19567872, -13630079, -15880642, -9214852, -12977244, 3474629, -8201240, - -1432372, -12423193, 4340065, 6541235, 7466801, -3728032, 56446608, 38392712, 26761942, 14879914, - 2439542, -12264279, -19078244, 18195628, -54891828, 59392956, -35652524, 10161893, -59652800, -1498944, - 57466664, 23008140, -19411104, 36724116, -56639880, 23618026, 11375221, 4722317, -69911328, -20461224, - 5010080, 12075301, 46033460, -68743096, -8705899, -22357452, -64716568, -13630079, 16355235, 33389076, - 49694920, 38809324, 38588132, -2521146, -23703924, 25690346, 8214125, -14261439, 9614284, -31226560, - 51455856, 24492052, 17847736, -25771952, -57445188, -14815490, 1986422, -69709464, -56296284, -14265734, - -50429360, 33532958, 13353053, 10919954, -22877144, -24567212, 10475425, 7836168, 4928475, 16486232, - -9186935, 12631499, 34235184, 15977278, 6335077, 5267778, -21504902, -17856326, -16030965, 10486163, - -5304285, -44386340, -35450660, -2907693, -28430536, -25031070, -6781754, -36515812, -22776212, -5153961, - 2619930, -4632122, -1825361, 9592809, -6515466, -2003602, 2611340, 64171108, -49984828, 13499082, - -7017977, -6463926, 1239098, 17766132, -31095564, 41732048, -11957189, 28619514, -2699387, -23212150, - 44470092, 43780748, 31432718, -14665166, 67355824, 24889336, -75067440, 77524160, 7204808, -236223, - 56178172, 2454574, -24169928, -32549410, 55465208, -34688304, -46059228, 44721348, 39208756, -25477746, - -61291332, 24056112, -20912196, 8484708, -43046308, -35504348, -14489072, 41843720, 37840808, 4902705, - 34752728, -50236084, 16402480, -13267154, -18453326, 23957328, 3620658, 7292855, -69965016, -19299436, - 39335456, -50272592, -12788265, -63052268, -11446088, -23602992, 10907069, -15300821, 7417409, 6403796, - -1846836, 6234145, -16520592, -56034292, -10219875, 28436978, -3461744, 19692426, -21189222, -49196704, - -8349417, 10737418, 31595926, 7514046, 17467632, -1924145, 7406671, 11690901, 7584912, -17182016, - 4735202, -7110319, 7784628, -13720273, 8508330, 3176128, 1380832, -1664300, -11317239, -6034429, - 58254788, 4614943, -16758962, -41487236, -1267015, -19754702, 15625091, -34243776, 22007412, 14068165, - -29923038, -30696132, 46669116, -54713588, -2007897, 35558036, -39573828, 12938589, 45612552, -36039072, - 31329638, 23046794, 33520072, -54795192, 47586092, -55022828, 16763257, -41854456, 5381594, -21341692, - 37497212, 1279900, 23003844, 11929272, -39056284, -23766202, -54043572, 31737660, -36565204, 31913754, - -43997644, -50115824, -84022448, 8345122, 44311176, -6607807, -1166084, 14100378, 38210176, -12771085, - 10353019, -46349140, 11948599, 61873300, -6109591, 56109452, 73360192, -335007, 12386686, 15197742, - -31164282, 16387448, -37782828, -1760937, -38785704, -37576668, 2325725, -14147622, -63808180, 43465068, - 1131724, 32371168, -37617472, -19110456, -14328011, 16670916, -268435, -9829033, -9848360, -6294275, - -2360085, 3826816, 4215511, -7441031, 8768176, -8557722, -8564165, -4670777, 12339441, 9283572, - 10269267, -4829691, 7758859, -131621424, 33436320, 49329848, 13718126, -57015692, -8310762, 92876520, - -106646184, -2660732, -17946520, -69735240, -17540646, -47238196, 17388176, 17282948, 40864468, 16582869, - -55714316, -19752554, 40288940, -63606320, -18010946, -68027984, 58181776, 17489106, 45530948, 77500536, - -27193586, -16292958, -12674448, -38744900, 37260988, -18148384, -46110768, -51777980, -8963597, 19939386, - -1324997, 10640781, 12773233, 30208652, -13114683, -1355062, 22501334, -21502754, 43997644, 49954764, - 47221016, -38087768, 5274220, -11830487, 22688164, 94173600, 70759584, 134786816, 10877005, 53334904, - 43288976, -20394652, -4436701, -6977175, -12365211, 17087528, 4179003, 48578228, 36745592, -16359530, - -4737349, -28729036, -56324200, 22801982, -581968, 19406810, -3871913, -39011188, -5482526, 5974300, - -21575768, 13297219, -13662291, -18897856, 794569, -18936510, 173946, -5192616, -4436701, 221191, - 3178276, -11800423, 1949915, 843961, 216896, 4844723, 204930064, 99151464, 35676144, 32192928, - -48019880, 31879394, -38686916, 47470128, 38978976, 36571648, 9753871, -66378720, -36919540, 73508368, - 13144747, -3704409, -14957224, 82218560, -88018912, -36715528, -21726092, -6085969, -62206160, 15451145, - -53693532, -29753386, 9442486, -33833604, 51133732, -48318384, -20598664, -11512660, 54619100, -89425512, - -16831976, -66432408, -1440962, 143881, -58282708, 10106058, 46662672, 25514254, -605590, -27144194, - 2952790, 28239410, -36494336, 74790416, 101515848, -5912023, -62337156, -58727236, 42133628, -14568529, - -13159780, 87383256, -18017388, 28185722, -1900523, 55106576, -10473278, 7565585, -10005126, -34194384, - -96091304, -57286272, -8572755, -25497074, -66073776, -43374876, 25559350, 56515328, -4114579, -6768869, - -5471789, -8581345, 31241592, 19868518, 4917738, -18418968, 22080426, -12006581, -43608952, -41856604, - 6036577, 29478508, -33865816, 23111220, -1642825, -12764643, -10915659, 1342177, -18661632, -14441828, - 1449552, -5302137, -2272038, -8710194, }, + -25770, -98784, 6442, -64425, 146029, 96637, -463856, 6442, -302795, -360777, + 96637, 302795, 294205, 107374, -670015, -410169, 133144, -210453, 34360, 135291, + 173946, 281320, -208306, -227633, -423054, -244813, -2147, -962073, -21475, -96637, + -281320, 197569, -556198, -485331, -985695, -137439, -871878, -268435, -23622, 691490, + 188979, 528281, -274878, 560493, -152471, 109522, 674310, 4179003, -3274913, 2037962, + -2589865, 1318555, -1262720, -1247688, -751619, -710817, 753767, 865436, -3206193, -178241, + 470299, -322123, -539018, -1879048, -685047, 1333587, 2025077, 1011465, 3193308, 646393, + -569083, 652835, 551903, -330712, 1043677, 2267743, -871878, -25770, 968515, -32212, + -221191, -1629940, -62277, 822486, 661425, 130997, 47245, -543313, 575526, -62277, + 70867, 30065, -554051, 15154792, -1002875, 1305670, -974958, 962073, -1168231, 227633, + -298500, -283468, 854699, -816044, -2770254, 779537, 268435, 837519, 1846836, 981400, + 652835, -264141, -1612760, -562641, 719407, -231928, -274878, 1541893, -1990717, -639950, + -49392, -352187, -504659, 734439, 805306, 1002875, 270583, 347892, -433792, 1395864, + -79457, 1067299, 745177, -266288, -158914, 500364, -4295, -315680, -161061, 2147, + 11162620, -10640781, 1685775, -2866891, 1556926, -182536, 1127429, -1009317, 2018635, -841814, + 1228361, -2534031, 113817, -1464584, 435939, -223338, -335007, -674310, -1857573, -180389, + 236223, -912681, 1548336, -682900, -1099512, -1398012, 856846, -891206, 2196876, -219043, + 21475, 650688, 23622, 55835, -955630, -809601, -210453, 229781, -356482, -932008, + 850404, 603443, 1513976, -341450, 508954, -201863, 296353, -26124138, 3103114, -1928440, + 90194, -268435, -2160369, 2407329, -549756, 244813, 1037235, 337155, 2785286, -103079, + -1086627, 3330747, 1367947, 3008625, -27917, -3912715, -2327872, -1870458, 1662152, -2027225, + 206158, -717260, -661425, 270583, 646393, -566936, -1202591, -891206, 833224, 932008, + 1756642, -107374, -204011, -79457, 1101659, -1166084, 345745, 500364, 826781, -944893, + 1054415, -1151051, -171799, 423054, -33002528, 12010876, -4791036, 5577015, -3809636, 2579128, + -4133906, 2409477, -3060164, 1234803, 2338610, 156766, 919123, 2151779, -1322850, 1559073, + -1707250, -1241246, -3811784, 3549791, -2224793, 2394444, 210453, 34360, -3655017, -85899, + 747324, -474594, -88047, -88047, 1574106, -178241, -1047972, 1217623, 388695, -418759, + 109522, 105227, 165356, 725850, -964220, 2617783, -176094, -1550483, -133144, -818191, + -60130, 1625645, 15025943, -3231963, 5699422, -2617783, 1956358, -2123861, 7103876, -1370095, + 3790309, -438087, -279173, 959925, -4295, -4885526, 1108102, -442382, -2203318, -534723, + 81604, -6146098, -169651, 504659, 1941325, -47245, -1168231, -238371, 2104534, 386547, + -1043677, -2068027, 3161096, -1960653, -77309, -2922725, -322123, 8590, 508954, -710817, + 775242, 1264868, -1236951, 1002875, -47245, 801011, -45097, 1449552, -730144, -438087, + 1305670, 1823214, 39575976, -11632919, 1653562, -2033667, 2536178, -45097, -100932, -5405217, + 2321430, -2405182, 1565516, 496069, 770947, 1644973, 2613488, 341450, 867583, -4561256, + 1584843, 1582696, -2950643, -635655, 2976412, 1889786, 1879048, 4234838, 2353642, 551903, + 1084479, -1692217, 1312113, -463856, 2424509, 3146064, -511101, 1007170, 1971390, -934155, + 646393, -2888366, -809601, 2725157, -6442, -2055142, -727997, 762357, 2029372, -234076, + 1127429, -103079, -1730872, 2862596, -21159156, 8972187, -6139656, 4084514, -3635690, 4812511, + -3062312, 244813, -2600603, -3204046, -4507568, 362925, -2662880, 1355062, 1556926, 3478924, + -5574868, 3506841, -1307818, 4851166, 1088774, -236223, 412317, 418759, -1103807, -914828, + 760209, -2239826, 1533303, 2765959, -3663607, -764504, -193274, 1533303, -1382980, 3936338, + -4028679, 835371, 17180, 294205, -1720134, 326418, -1071594, 1078037, 180389, 246961, + -1219771, -167504, -2551211, -822486, -128849, 616328, 216896, -889058, -3238405, -64425, + -646393, -34144992, 10870562, -6964290, -431644, -1391569, 2173254, -5869073, 453119, 1906966, + 1586990, -2031520, 1206886, -2602750, -4288525, -1657857, 577673, -2559801, 9101036, 274878, + -2480344, -798864, -2995740, -1395864, 2804614, 1683627, 3629247, -302795, 1638530, -2003602, + 871878, -1812476, -586263, -1052267, 642098, 1142461, -534723, -1720134, 468151, 676457, + 2527588, -414464, -874026, -3221226, -2604898, -1241246, -472446, 627065, 481036, -1309965, + -504659, 257698, 1232656, 635655, 251256, -564788, 1251983, -386547, 2108829, -32867238, + 15474767, -7243463, 6925635, -3560528, 4118874, 2055142, 1282048, -3710852, 493921, -1876901, + 597000, -4870493, 1881196, 3098819, 1032940, -5186173, -2546916, -2594160, -2692945, -1760937, + 3779571, 925565, 2673617, 2138894, -882616, -184684, -3899830, 5113159, -1406602, -487479, + 367220, -1063004, -1518271, -1816771, -373662, -4116726, 1275605, -2173254, 1702955, 1471026, + 2424509, -618475, 311385, -2665027, 1067299, 2007897, 523986, -416612, 453119, 1576253, + 2368675, 1030792, 2207613, 122407, 386547, -103079, -435939, 10647224, 13179107, -6006512, + 3502546, -1874753, 1292785, -1458141, 725850, 1127429, 6438156, -2327872, 2634963, 6043019, + -1690070, -285615, -1058710, 1436667, 3109556, 3182571, 4155381, 1093069, 3532611, -949188, + -2136746, -7168301, 1471026, -1123134, -3607773, -2594160, -150324, -717260, 2272038, -371515, + -4166118, -4312147, 1123134, -3753802, 472446, 2214056, -3360812, -2276333, -1443109, 1612760, + 1479616, -154619, -463856, 2450279, 508954, -1009317, 979253, -2201171, 249108, -1181116, + -1644973, -1142461, 1677185, -914828, 1260573, -1007170, -2102387, 517544, 1133871, -781684, + 642098, -970663, 38019052, -13247827, 7168301, -4973572, 7127498, -5042292, 4367982, -1640678, + 4436701, 1069447, 3120294, -3648575, 3725884, -1288490, -3107409, -332860, -3337190, -5327907, + -2813204, -590558, 2690797, -3655017, -4876936, -5980742, -1078037, -536871, 4767414, 2600603, + 3062312, -2110977, 2476049, -1909113, -1866163, -1039382, 3146064, 2703682, 846109, -36507, + -115964, 70867, -884763, -515396, 2177549, 408022, 5362267, -2074469, -646393, -4488241, + 2927020, -1185411, -695785, -1071594, -277025, 242666, -743029, 796716, -1196148, -2147, + -1696512, -768799, 380105, 1728724, -908386, -135291, -609885, 10660109, -16344498, 9545565, + -6128919, 7410966, -107374, 4591320, 1279900, -7176891, -3416647, -2435247, 850404, 1771674, + 977105, 8055211, -4567698, 6433861, 1099512, 796716, -4440996, -979253, 5555540, -388695, + -4765266, 5373004, 4093104, 891206, -2248416, -1775969, -496069, -397284, 2473901, -1245541, + 1088774, -3042984, -695785, 1722282, -4383014, 1647120, -1715839, 1539746, -1288490, -405874, + 5113159, 2199023, 2901251, -244813, 1185411, 1864016, -412317, -1436667, -2293513, 755914, + 1011465, 1806034, 2183991, 498216, -523986, -2291365, -1058710, -2319282, -2078764, 246961, + 42950, -1745904, -40443560, -8134668, -1043677, -6713034, -2757369, 6103149, 2630668, -1720134, + -1524713, -4814659, -3182571, -3897683, -4376572, -3624953, -2291365, -3274913, -5602785, -4784594, + 1909113, -4859756, 1683627, -6554120, 266288, -2682207, -2130304, 5802501, -536871, -2744484, + 3768834, -4116726, 3981435, 1232656, 4198331, 2879776, -25770, -1928440, 4415227, -2147, + -609885, 4026532, -1591285, -5340792, -6043019, -1509681, 2089502, 1355062, -1752347, -120259, + -1617055, 448824, 152471, 373662, 3891240, 1563368, -2695092, -981400, 566936, 2486786, + 631360, 3682935, 1063004, -242666, -1784559, -1632088, 96637, -47620448, 41461468, -16883516, + 11512660, -10819023, 2658585, -5312875, 7022272, 1329292, 826781, -3393024, 4763119, 966368, + -8546985, 867583, 1275605, -4307852, -6584185, 6515466, 8100309, -2615635, -2121714, 1344325, + 3740917, -2194728, 7380902, -242666, 1881196, -5360119, -1887638, -3199751, 4816806, -1082332, + 1060857, 1024350, -2740189, 4638565, 4481799, 1202591, 1550483, 5437429, -3309272, -904091, + -678605, -3987877, 869731, -2611340, 987843, -148176, 373662, 4432406, -150324, -1041530, + 1009317, 206158, 2937758, -2738042, 1045825, -208306, 5738077, -1737314, -204011, -2282775, + -459562, -1479616, 31731218, -3893388, -6700149, -1638530, 4213363, 2145336, 1870458, -294205, + -4479651, 1035087, 2624225, 2982855, -2078764, -1960653, 6354404, 2132451, -5074504, 1017907, + 8239895, -10426033, 6869800, 781684, 8800388, -644245, 448824, 1683627, 1733019, 4606353, + -3493956, -1355062, 1690070, 3294240, -1374390, -141734, 380105, 732292, 2055142, -4303557, + -148176, 2433099, 657130, -2388002, -775242, 5441724, 3992172, 1881196, -2143189, -1576253, + 1531156, -743029, -1395864, 929860, -1733019, -2673617, 5596343, 2179696, 3582003, 539018, + 2692945, 2192581, 2390149, 242666, 2905546, 1445257, 2052994, -1733019, 354335, 762357, + -2546916, 878321, -1249836, -268435, 15098958, 4385162, 3642132, -2214056, -1481764, -4103841, + -2931315, 745177, -1608465, -2020782, -5877663, 5003637, 3466039, -3663607, 6259915, -5896990, + -1782411, 2624225, -4365835, 2534031, 4065187, 6206228, 5482526, 5220533, 2712272, -11046656, + 4295, -2321430, 2214056, -1069447, 4322885, 2924873, -1421634, -2690797, 2838974, -1977833, + 7292855, -4295, 2413772, 7383049, 7078106, -5345087, 450972, -3526168, -6352257, -691490, + 1198296, -816044, -1299228, -682900, 554051, -2980707, 399432, -3476776, -968515, -414464, + 929860, 21475, -2025077, -2166811, 4434554, -1567663, 685047, 1975685, 2454574, -1357210, + -1374390, -652835, -3493956, -2388002, 384400, 758062, 35680440, -25104084, 9139690, -9536975, + -734439, -6663642, 6030134, 5989332, 1932735, 1217623, 5665062, 15571404, -13683766, -1902671, + -3556233, -5527623, 12081743, 9096741, -1861868, -8278550, 3356517, -6764574, -5405217, -9476845, + 1213328, -9704479, -3204046, 5714454, 826781, -2978560, -8005819, 12885, -1930588, 4864051, + 4475356, 2063732, -3635690, 543313, -227633, 1964948, 3863323, -2454574, -1236951, -4344360, + 6582038, -820339, 972810, 5864778, -1211181, -541166, 2347200, -2954938, -304943, 2540473, + -4361540, 985695, -809601, -388695, -4548371, 2203318, -974958, 384400, 1118839, -1690070, + 2982855, -2355790, -609885, -4876936, 438087, -685047, 2022930, 2128156, -55548960, 7703024, + 792421, 3917010, -4254165, -6919193, -15032, 4666482, 7406671, -433792, 11254962, 6279242, + -7582765, -6762426, 5272073, 966368, -5394479, -10039486, -11519102, -7376607, -8493298, -9509058, + 1750199, 3062312, 2568391, -7028714, -6755984, 1065152, -1754494, -1127429, -874026, -5602785, + 4801774, -9665824, -3592740, -1445257, -317828, 3135326, 1129576, -635655, 4516158, -1329292, + 4503273, 2602750, -3397319, 586263, 7295002, -2860448, -2858301, 225486, 4290673, 1136019, + -2972117, -3837553, 3594888, 225486, -5044439, 7026567, 7926362, 989990, -2201171, 977105, + -96637, 1709397, 3532611, -304943, 4670777, 2976412, 2695092, 2355790, 1251983, 1969243, + -2259153, -135291, -34048352, 29072634, -9749576, 6199786, -180389, 4829691, -11802570, 4544076, + -8053064, 25770, -5458904, 10907069, 9268539, 3500398, 730144, -8985072, -5980742, -936303, + -3635690, 10355166, -8497593, -345745, -4224101, 15171972, -4855461, 1352915, -455267, 2609193, + 1163936, 2602750, 1885491, -2514703, 1340030, -614180, 5272073, 816044, 10020159, 5211943, + -3270618, -682900, -1279900, 184684, -3865471, -2705830, -989990, 1795296, 12221329, 1114544, + 790274, -3362960, 4967130, -1853278, -2647847, 1617055, -2574833, 1511829, -3189013, -6854768, + 3371549, 3038689, -985695, 7166153, 1494649, 1702955, 2544768, -1919850, 818191, 2325725, + -5961415, -2783139, -489626, -2699387, 2697240, 4234838, -1556926, 7269232, 4829691, -163209, + -1932735, -1462436, -504659, 22215718, -487479, 5016522, -15079630, -2499671, 1917703, -12167642, + 983548, 16879222, -2929168, 1221918, -7599945, -10417443, 2662880, -9517648, 14877767, -10314364, + 3577708, 3524021, 7971460, 6199786, -1614908, -9201967, -1058710, -841814, 4724464, -6448894, + -1241246, -1887638, -3062312, -2181844, 4518306, 2778844, 12066711, 4099546, -4479651, 5007932, + -3272765, -3451006, 3717294, 10327249, -1475321, -5323612, -4980015, 5491116, -126702, -7471096, + -6878390, 3532611, 3292093, -3098819, -5684389, -9446781, 2619930, 3521873, 2375117, -5334350, + 4015795, 2467459, 1677185, -1894081, -573378, 2924873, -7088844, -925565, 3131031, 3682935, + -670015, 1795296, 154619, 75520560, -4870493, 2987150, 6865505, -6674379, -2877628, -2323577, + -17862768, 11903502, -1992865, -11100343, 2327872, -5723044, 6433861, 5078799, 8192650, -2997887, + 11141145, 9536975, 6077379, -9938554, 7524783, -13612899, -8055211, -9283572, 3588445, -7146826, + -1342177, -2476049, -9090298, -4964982, 7563438, -5731634, -4348655, -8682276, 2740189, 2723009, + 6397354, -3706557, 11053098, 2716567, 12607876, -1513976, 2244121, 2493229, -7054484, 4930623, + 12910672, -4526896, -418759, 3466039, -3826816, -5291400, 3021510, -5272073, -2866891, -6874095, + -4522601, 4992900, 4453881, 2976412, 4786741, 6025839, 5744519, 8665097, 1372242, -2643552, + 4471061, 3015067, -90194, -923418, 324270, -3320010, -736587, 633508, 760209, -238371, + -33247342, -65399468, 24535000, 433792, 1544041, -6358699, -6807523, -1382980, 2456721, -4056597, + 17334488, -7741679, -14774687, 1067299, 1144609, -1799591, -5080947, 11847667, 2314987, -5080947, + 5632850, -10206990, 13338021, -7198365, -3635690, -8802535, 14867029, -6191196, -1930588, -8727374, + -3914863, 8111046, -3524021, 8768176, -10954314, -12889197, 1267015, 2400887, 2454574, -212601, + -6551973, 1378685, 3678640, 1857573, 7000797, 85899, 10866267, 1602023, 10198400, 13209172, + 2927020, -871878, 2671470, -7219840, -1677185, -12139725, -10711648, 3315715, 3448859, 2252710, + -554051, -3388729, -1625645, -2884071, -1462436, -2879776, 268435, -171799, 2497524, -650688, + -1221918, -4088809, -113817, -4767414, -377957, -6360847, -639950, -2308545, -502511, -21912924, + 64132452, -29149944, 13423920, -6152541, 20405390, -3169686, -8939974, -9345849, 5398774, -2761664, + -1155346, 496069, 4041564, -21509196, -10458245, -5527623, 8626442, 7226283, 12629351, 2327872, + -1846836, -1960653, 15144055, -19561428, 11420318, -9397388, -1891933, -9902047, 15648713, 6279242, + -10048076, 1372242, -4359392, 1705102, 6687264, -28093382, -11660836, 2340757, 9968619, -5759551, + 2173254, 7239168, -2834679, -3152506, -929860, 10907069, 4395899, 1887638, 1320703, 4219806, + 12889197, -7735236, 5954972, -17927194, -2989297, 4065187, 8772471, 1642825, 1372242, 438087, + 4810364, -3493956, 663572, -1247688, -4101694, -3672197, 6841883, 6543383, -2332167, -3382287, + -11029476, -4715874, -2360085, -1992865, 8287140, -3100967, -2901251, -5461051, -4784594, -395137, + -57488136, -12393128, 5639292, -13623636, 3448859, 2521146, 8439611, -25770, 16076063, 10503343, + 5819681, -4387309, -7870528, -390842, 17005924, -14512694, -5538361, -11242077, -236223, -30760556, + -24257976, 1550483, 15075335, 20755430, 4799626, -7522635, 7084549, -6676527, -4460324, -4537633, + 2063732, 5454609, 1337882, 8096014, -6111739, -10922102, 9075266, 5989332, 19048180, -2304250, + 3111704, -2701535, 15365246, -15945066, -8010114, -3747359, -12113955, 7750269, -4990752, 6515466, + -12977244, 12987981, 12579959, 11605002, -4700842, 10292889, 564788, 3618510, 6023692, 4327180, + -5418101, 996432, -1677185, -249108, 11819750, 4462471, -5177583, 9614284, -1537598, -8216273, + -2727304, -539018, -11628624, -405874, 4872641, 6401649, 1024350, -176094, -4797479, 1831804, + 2832531, 41624676, 27041114, -8609262, 12225624, -27790586, 19402514, 7067369, 14585709, -5100274, + -3770981, -15247134, -7866233, -26010322, -4569845, -20725364, -6352257, -12801150, -13106093, -17622250, + 6878390, -24049670, 3137474, 10271414, -4694400, 3176128, -10406706, -227633, -3309272, -3511136, + -14151917, -1990717, 1529008, -1058710, -2259153, -7462506, -6491843, 4234838, 4520453, 5976447, + 30356828, -12384538, -801011, 12223477, -3051574, -5179731, -11781095, 3496104, 10241350, 16986596, + 5667210, 14143327, -14033806, -21058224, 1898376, 13612899, 7582765, -11422466, 13035226, -10024454, + 6227703, 2499671, 11839077, 6624987, 4279935, 7960722, -8169028, 5031554, 4194036, 2321430, + 11626476, 2572686, 9373766, -1539746, -3897683, 1380832, 2147484, 1844689, 11278584, -1947768, + -6517613, -738734, 84217864, -54445152, -2916283, 6354404, 1737314, 6670084, 11577084, -2289218, + -1808181, 6502581, -9676561, -9259949, -1477469, 7492571, 30346092, 1301375, 10520522, -9730248, + 665720, -29927332, 18564996, -18092550, -25750476, 6027987, 7305740, -9554155, 8677981, 3637837, + 20068234, 22164178, -3616363, -8340827, -6242735, -33077690, -17972290, 25960930, 8626442, 9562745, + -14858439, -15305116, 4610648, -2957085, -13112535, 11510512, -2433099, -8235600, -9451076, 6524056, + -8456791, -4552666, 30492120, -18530636, 5708012, -6644315, 7127498, -8338679, -3347927, -22686018, + 3901978, -8398809, -5577015, 18137646, 4456029, 5059472, 11050951, 13153337, 3996467, 9105331, + -3977140, -1078037, -14828375, 6813966, 12382391, -2813204, 884763, -1367947, -3021510, -3839701, + 1458141, -3949223, -1713692, -52104396, -25512106, 9998684, -2959233, 19288698, -2403034, -4707284, + -14847702, -16666621, 9255655, -17435420, -5849746, -9764608, -1698660, -10320806, -6987912, -8233453, + -4093104, -10277857, -19765440, 11798275, -39483636, -133144, 35886600, 8972187, 92342, -9446781, + 2804614, -35699768, 15135465, 9330816, 2761664, 13292924, 19608674, -14959371, -7752416, -15577846, + 2609193, 854699, -9133248, -10453950, -11639361, -6777459, -274878, 8196945, 923418, 6775311, + 3942780, 1101659, 24973088, 6240588, -3706557, 19887846, -9300752, -21945136, -6573448, -2302103, + -2931315, -1123134, -7432441, -1408749, -9332964, -1984275, -9496173, 1318555, 5527623, -10346576, + -2768107, -5551245, 715112, -10492605, -13477607, -5609228, 5836861, 10075993, 4196183, -2869038, + -100932, 4084514, -1505386, -1911261, -4544076, 2564096, 5405217, 1421634, 45097, -5695127, + -32089848, 43628276, -21288006, -10473278, -35358320, 27876486, -9631464, 16492674, 1157494, 1159641, + -10634339, 21891448, -5291400, 7243463, 5519033, -9781788, -3255585, -3051574, -18691698, 3925600, + 3536906, -14375256, -24298778, -14985141, -22348862, -5278515, 12298639, 6571300, -13112535, -12964359, + 19754702, 13722421, -16879222, 15824807, -8360154, 14027363, -21427592, -16808354, -16312286, 6049462, + -14439680, 9423158, -6468221, 4116726, -3912715, -1846836, 3474629, 15921444, -34218004, -4099546, + 6927782, -2886218, -10350871, -24500640, -2130304, 22975928, 8590, 19947976, 14577119, 4473209, + -2742337, 15300821, -14847702, -11952894, 9650792, -3317862, -9201967, 6635725, 1909113, -6968585, + -10591389, 18303004, -16737488, -8849780, -9987946, 10520522, 562641, -6929930, -4039417, 5628555, + -15461882, 341450, 4191888, 3466039, 399432, -4975720, -7509751, -73916384, 28112708, 12148315, + -18279380, 9631464, -20729660, 19447612, 16844862, 14385993, -37666864, 23444078, 40763536, -5186173, + 14134737, 1022202, -12146168, -16056735, 44865228, -221191, -3502546, -24081882, -47908212, -25812754, + 2871186, -21030308, 18249316, -31318902, -10106058, -18352396, 5546951, -6970732, -23212150, 4297115, + -5037997, 15850577, -4810364, -18247168, -6713034, -56549688, 10604274, -1455994, 26703960, -15792595, + -17422534, 24818468, 5568425, 4320737, -9410273, -14948634, 5836861, 11441793, 8506183, -3730179, + 9012989, 4939213, 1410897, -4726612, -4960687, -18515604, 1881196, -7217693, -10531260, 10086731, + 5948530, 27908698, 6199786, -18431852, -18337362, 4337917, -11738146, -8714489, 3513283, -8974334, + -15032, -4030827, -5046587, 5473936, -6964290, 2901251, -513249, -1294933, -2336462, -3893388, + -8632884, -10791105, -3002182, -9279277, 61132416, -25333864, -485331, 2583423, 25037512, -4176856, + -5922760, 16928614, 29654602, -21444772, -24676734, 17716740, -4432406, 15307263, 22486302, 18650896, + 15895674, 12644384, 14963666, 59390808, -6002217, 3627100, 10808285, 32407676, -7786776, -12970801, + 11879880, -1692217, -11753178, -14156212, -12605729, -470299, -16112570, 22181358, 33681132, -2574833, + -9524090, 13711683, -9352291, 19965156, 13922136, -223338, -18811956, 12880607, -2308545, -6573448, + 1879048, -3171833, 39320424, -4105989, 16582869, -9562745, 34924528, -4032974, 2280628, -13144747, + -22724672, 17637284, -11774653, 35521528, 7009387, 16492674, -801011, -466004, 9547712, 2183991, + 24921548, 13851270, 3762391, 12425340, -16125455, 5164698, 10952167, 751619, -5267778, 20699594, + 4305705, -7503308, -7943542, 7999377, -4904853, -463856, 11014444, -4194036, 6320045, 2463164, + -7627862, 80474800, -22943716, 7750269, -7486128, 3798899, 10533407, 27215060, -20744692, 11544872, + -266288, 1707250, 14804752, -11710228, 15807627, -42011224, -19024558, 7365869, 15880642, 11441793, + 33758444, -33170032, 5345087, -4702989, -45758580, 19838454, -17742510, -11323681, -6599218, -37325412, + 12300786, 13565654, 5927055, -19301584, -32858648, 13249974, -20347408, 18184892, -31499290, 801011, + -37705516, -8897025, -25183540, -21487722, 22314502, 35126392, 4827543, 13176960, -16041703, 6880538, + -26912266, 11824045, -17695266, 5317170, 25701084, 13544179, -9122511, 16058883, 2518998, 13975824, + -11678016, 23117662, 38635380, 2566243, -23514946, -15700253, -10576357, -3783866, 2362232, 17912162, + 3309272, 28778428, -251256, 11353746, -25823490, -3236258, -18700288, -2952790, -2948495, 6380174, + -23461258, 3768834, -1986422, 7593502, 2308545, 4984310, 2126009, 2471754, -81559280, -68373728, + 29280940, -8332237, 34003256, -2342905, 11308649, -40733468, -38210176, -23117662, 13129715, -31467078, + -21640192, -9101036, 6644315, 23514946, 8555575, -46263240, 12814035, 26336740, -65779572, -7578470, + 3446711, -69808248, -23796266, 31525060, -64688648, 32122060, 33743412, 727997, -9118216, -2347200, + -15375983, -16935056, 11903502, 14652281, 48964776, -28479928, -14867029, -11791833, -22368190, 1644973, + -38360500, -9313637, 3184718, -777389, -12322261, -1649268, -21023864, -3998615, 12105365, -4995047, + -13627931, 16430397, -7316477, -15455440, -22310208, 48290464, -1780264, 29551522, 4080219, 11291469, + 31840740, 4898410, 21758304, -14014478, 24152748, 17703856, 5415954, 6612102, 6077379, 21197812, + 9717364, 4211216, 20353850, -8227010, 3137474, -2001455, -31284542, 15066745, 7670812, 4645007, + -19086834, -5149666, 3764539, 6459631, -5362267, -132559872, 50304804, -14448270, -59332824, -14319421, + 1737314, -15189152, 23237920, -51359220, 25074020, -3951370, -59055800, -40675488, 8364449, 23744726, + 22492744, 16518444, 35169340, 10168335, 57685704, 31630286, 67572720, 8933532, 54941220, -41942504, + -32920924, 11493332, 5020817, -33238752, 9616432, 7249905, -4387309, -12573517, 32682554, 6365142, + -71236328, -31726924, 24247238, 8409546, -14892799, 20602958, 21146272, 32637456, 7273527, 9786083, + 6360847, 9575630, 12154757, -24711094, 4075924, 4702989, -52587580, 25054692, 18650896, 22565758, + -35946728, -20918638, 26749056, 152471, -6721624, -5353677, -15193447, -13593571, 403727, -18126910, + -40336184, 13937169, 43679816, -30384746, 4552666, -17231408, -6708739, -12537010, -3603478, 22443352, + 5697274, 18556406, 5718749, -19567872, -13630079, -15880642, -9214852, -12977244, 3474629, -8201240, + -1432372, -12423193, 4340065, 6541235, 7466801, -3728032, 56446608, 38392712, 26761942, 14879914, + 2439542, -12264279, -19078244, 18195628, -54891828, 59392956, -35652524, 10161893, -59652800, -1498944, + 57466664, 23008140, -19411104, 36724116, -56639880, 23618026, 11375221, 4722317, -69911328, -20461224, + 5010080, 12075301, 46033460, -68743096, -8705899, -22357452, -64716568, -13630079, 16355235, 33389076, + 49694920, 38809324, 38588132, -2521146, -23703924, 25690346, 8214125, -14261439, 9614284, -31226560, + 51455856, 24492052, 17847736, -25771952, -57445188, -14815490, 1986422, -69709464, -56296284, -14265734, + -50429360, 33532958, 13353053, 10919954, -22877144, -24567212, 10475425, 7836168, 4928475, 16486232, + -9186935, 12631499, 34235184, 15977278, 6335077, 5267778, -21504902, -17856326, -16030965, 10486163, + -5304285, -44386340, -35450660, -2907693, -28430536, -25031070, -6781754, -36515812, -22776212, -5153961, + 2619930, -4632122, -1825361, 9592809, -6515466, -2003602, 2611340, 64171108, -49984828, 13499082, + -7017977, -6463926, 1239098, 17766132, -31095564, 41732048, -11957189, 28619514, -2699387, -23212150, + 44470092, 43780748, 31432718, -14665166, 67355824, 24889336, -75067440, 77524160, 7204808, -236223, + 56178172, 2454574, -24169928, -32549410, 55465208, -34688304, -46059228, 44721348, 39208756, -25477746, + -61291332, 24056112, -20912196, 8484708, -43046308, -35504348, -14489072, 41843720, 37840808, 4902705, + 34752728, -50236084, 16402480, -13267154, -18453326, 23957328, 3620658, 7292855, -69965016, -19299436, + 39335456, -50272592, -12788265, -63052268, -11446088, -23602992, 10907069, -15300821, 7417409, 6403796, + -1846836, 6234145, -16520592, -56034292, -10219875, 28436978, -3461744, 19692426, -21189222, -49196704, + -8349417, 10737418, 31595926, 7514046, 17467632, -1924145, 7406671, 11690901, 7584912, -17182016, + 4735202, -7110319, 7784628, -13720273, 8508330, 3176128, 1380832, -1664300, -11317239, -6034429, + 58254788, 4614943, -16758962, -41487236, -1267015, -19754702, 15625091, -34243776, 22007412, 14068165, + -29923038, -30696132, 46669116, -54713588, -2007897, 35558036, -39573828, 12938589, 45612552, -36039072, + 31329638, 23046794, 33520072, -54795192, 47586092, -55022828, 16763257, -41854456, 5381594, -21341692, + 37497212, 1279900, 23003844, 11929272, -39056284, -23766202, -54043572, 31737660, -36565204, 31913754, + -43997644, -50115824, -84022448, 8345122, 44311176, -6607807, -1166084, 14100378, 38210176, -12771085, + 10353019, -46349140, 11948599, 61873300, -6109591, 56109452, 73360192, -335007, 12386686, 15197742, + -31164282, 16387448, -37782828, -1760937, -38785704, -37576668, 2325725, -14147622, -63808180, 43465068, + 1131724, 32371168, -37617472, -19110456, -14328011, 16670916, -268435, -9829033, -9848360, -6294275, + -2360085, 3826816, 4215511, -7441031, 8768176, -8557722, -8564165, -4670777, 12339441, 9283572, + 10269267, -4829691, 7758859, -131621424, 33436320, 49329848, 13718126, -57015692, -8310762, 92876520, + -106646184, -2660732, -17946520, -69735240, -17540646, -47238196, 17388176, 17282948, 40864468, 16582869, + -55714316, -19752554, 40288940, -63606320, -18010946, -68027984, 58181776, 17489106, 45530948, 77500536, + -27193586, -16292958, -12674448, -38744900, 37260988, -18148384, -46110768, -51777980, -8963597, 19939386, + -1324997, 10640781, 12773233, 30208652, -13114683, -1355062, 22501334, -21502754, 43997644, 49954764, + 47221016, -38087768, 5274220, -11830487, 22688164, 94173600, 70759584, 134786816, 10877005, 53334904, + 43288976, -20394652, -4436701, -6977175, -12365211, 17087528, 4179003, 48578228, 36745592, -16359530, + -4737349, -28729036, -56324200, 22801982, -581968, 19406810, -3871913, -39011188, -5482526, 5974300, + -21575768, 13297219, -13662291, -18897856, 794569, -18936510, 173946, -5192616, -4436701, 221191, + 3178276, -11800423, 1949915, 843961, 216896, 4844723, 204930064, 99151464, 35676144, 32192928, + -48019880, 31879394, -38686916, 47470128, 38978976, 36571648, 9753871, -66378720, -36919540, 73508368, + 13144747, -3704409, -14957224, 82218560, -88018912, -36715528, -21726092, -6085969, -62206160, 15451145, + -53693532, -29753386, 9442486, -33833604, 51133732, -48318384, -20598664, -11512660, 54619100, -89425512, + -16831976, -66432408, -1440962, 143881, -58282708, 10106058, 46662672, 25514254, -605590, -27144194, + 2952790, 28239410, -36494336, 74790416, 101515848, -5912023, -62337156, -58727236, 42133628, -14568529, + -13159780, 87383256, -18017388, 28185722, -1900523, 55106576, -10473278, 7565585, -10005126, -34194384, + -96091304, -57286272, -8572755, -25497074, -66073776, -43374876, 25559350, 56515328, -4114579, -6768869, + -5471789, -8581345, 31241592, 19868518, 4917738, -18418968, 22080426, -12006581, -43608952, -41856604, + 6036577, 29478508, -33865816, 23111220, -1642825, -12764643, -10915659, 1342177, -18661632, -14441828, + 1449552, -5302137, -2272038, -8710194, }, }; const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS][2885] ={ { -9659381, - 5362267, -3098819, 1329292, -1745904, 399432, -1284195, -347892, 55835, 2576981, -1692217, - 1123134, -2744484, 2025077, -3098819, -4211216, -3702262, 850404, -397284, 579821, 79457, - -1915555, 1105954, 1917703, -1084479, 1535451, -242666, -670015, -1357210, -244813, 399432, - 1078037, -785979, 1612760, -654983, 1028645, 1501091, -1097364, -1056562, 68719, -1110249, - 298500, 27917, -508954, 1103807, 180389, -513249, 3689377, -3813931, -676457, -818191, - -858993, -294205, -38655, -743029, -500364, -15032, 180389, -549756, 328565, -1198296, - -326418, -212601, 736587, -4054449, -358630, 811749, -362925, -513249, 373662, 53687, - 307090, 1833951, -876173, -616328, -970663, -206158, 569083, 811749, -831076, -661425, - 1011465, -932008, -1329292, -171799, -345745, 448824, -380105, -408022, 244813, 392990, - -811749, 251256, 337155, -12947179, -8793946, -3573413, -4080219, -2280628, -2134599, -2022930, - -914828, -2439542, -1921998, -839666, -1498944, -197569, -539018, -1307818, -1767379, -1979980, - -779537, -1148904, -1995012, -261993, -2497524, 6442, -188979, -347892, -1511829, -261993, - -1142461, 8590, -1475321, -942745, 508954, -1086627, 191126, -2521146, -463856, 1228361, - 753767, -47245, -367220, -725850, 206158, 227633, 1168231, -702227, -115964, -362925, - -17038136, -910533, 2173254, -19327, 637803, -100932, 0, -1346472, 1436667, 590558, - 1733019, 1264868, 3569118, 2652142, 186831, -1398012, -831076, -315680, 654983, -461709, - -3180423, -2826089, -1488206, -420907, 122407, 420907, 571231, -94489, 83752, 367220, - -678605, -70867, -105227, -1930588, 1131724, 491774, -229781, 0, -760209, -1063004, - 659278, 279173, -721555, 697932, 562641, 846109, -382252, 19097572, 13387413, 2647847, - 5173288, 1090922, 1700807, 4247723, 2164664, 689342, 2529736, 1052267, -1133871, -536871, - 869731, 1492501, -2600603, -326418, -1567663, 3463891, 1698660, 901943, 1700807, 895501, - 874026, 64425, -180389, -824634, 1335735, 1655710, 1378685, 1760937, 2089502, 1279900, - 3058017, 719407, -184684, 1118839, 193274, -508954, -253403, -450972, -616328, 42950, - 1415192, 369367, 225486, 858993, 28509992, 12066711, 3697967, 3292093, 2368675, 1402307, - 500364, 73014, 3161096, 594853, 1771674, 2319282, 1284195, -201863, -826781, 4939213, - -408022, -2755222, -1518271, 1202591, 109522, 2628520, 914828, 296353, -448824, -1271310, - -309238, -599148, 1209033, -231928, 526134, 88047, 225486, -667867, 989990, 3427384, - 2226941, 2267743, 2110977, 1681480, 977105, 642098, 435939, 1105954, -910533, 665720, - -408022, 9382356, -9887015, -2985002, -4271345, -3687230, -2016487, -590558, 1367947, -1370095, - 139586, -3652870, 1241246, -1327145, -3324305, 882616, -2379412, -3158949, -2274185, 3030100, - 2265595, -1060857, 1144609, -2091649, 798864, -3809636, 182536, 633508, -665720, -889058, - 779537, -3015067, -1389422, 395137, -1075889, -886911, -708670, 251256, 298500, 1526861, - 66572, 2630668, -1041530, -717260, -852551, -1294933, -429497, -646393, 341450, -1116692, - -1754494, -266288, -33844344, -17119740, -6178311, -4795331, -5280663, -3268470, -4569845, -2929168, - -4973572, -874026, -2269890, -551903, 184684, -2029372, -605590, 343597, -17180, -3098819, - -2115272, -1391569, 249108, -4185446, 371515, -1887638, -3786014, 341450, -98784, 279173, - -143881, -1301375, -1063004, 62277, -337155, -27917, -1451699, 64425, 324270, 1148904, - 373662, -1434519, 775242, -1434519, 927713, -2480344, -1760937, 395137, -1440962, 88047, - -581968, -1988570, -652835, -20029580, 10522670, 4372277, 1664300, 2675765, 534723, 693637, - 2411624, 2628520, 1473174, 1739462, -1314260, -603443, -2068027, 2523293, 566936, 429497, - 3519726, 81604, -2304250, 4112431, -2714419, 302795, 3459596, -1065152, 934155, 412317, - -42950, -1750199, -373662, 916976, 1024350, 137439, -575526, 38655, -1174674, 3880503, - 371515, -90194, -1501091, -803159, -955630, -959925, 2153926, 1999307, -485331, 171799, - -94489, 584116, 186831, -161061, -377957, 455267, 356482, -618475, -513249, 83752, - 504659, 30129196, 12751758, 3451006, 6869800, 4041564, 1685775, 3040837, 2555506, 38655, - 1859721, 3019362, 661425, 40802, 1498944, 4241280, -1451699, -736587, -3354370, 882616, - 3809636, 1655710, 152471, -2130304, -1187559, -895501, 4015795, 1290638, 2089502, 1217623, - -1939178, -3051574, 3481071, 1958505, -2171106, -989990, 3382287, 2903398, -165356, 749472, - -373662, 1533303, 938450, -296353, 676457, -1163936, -577673, 1870458, -983548, -710817, - 1945620, 1711545, 916976, 371515, 395137, 450972, 1385127, 798864, 2192581, 35654672, - 7681549, 5985037, 2576981, 2774549, 1112397, 2854006, 3272765, 5325760, 3201898, -947040, - 4121021, -751619, 1084479, 977105, 3483219, 5239860, 3309272, -848256, 5768141, -1052267, - -629213, -3004330, 796716, -858993, 923418, 1612760, -1782411, -2385854, -1037235, 526134, - -1979980, -592706, 869731, 1340030, -2317135, -1906966, -837519, 801011, -36507, 654983, - -852551, 32212, -581968, -725850, 914828, -1273458, 1245541, -1370095, -511101, -1030792, - 219043, -341450, 1404454, 685047, -124554, 1999307, 663572, 4136054, -15805480, -5053029, - -5656472, -3622805, 962073, -886911, -3401614, 1949915, 128849, 2394444, -281320, 261993, - -3708704, -2592013, -1730872, -2669322, 214748, -2841121, -5523328, 1101659, 631360, -2544768, - -575526, -2308545, 472446, 790274, -466004, -5671505, -1625645, 369367, -650688, 493921, - 1509681, -4037269, -1230508, -2521146, 1292785, -307090, -236223, 2652142, -2703682, -176094, - 805306, -337155, -906238, 1284195, 654983, -1604170, -1992865, -3133179, -502511, -2394444, - -1967095, -1022202, -1370095, -798864, -397284, -734439, -1236951, -1623498, -955630, 584116, - 1073742, -191126, -37052684, -12517682, -7614977, -1879048, -3964255, -103079, -2164664, -2705830, - -3438121, 4254165, 53687, -1567663, -442382, -6103149, -3543348, -2952790, 4973572, -4179003, - -8974334, 788127, 1050120, 749472, -3330747, -820339, 1836099, -4056597, -470299, -4140349, - -1297080, 2390149, -2059437, 622770, 4516158, 547608, -989990, -1056562, 1191853, 1464584, - 1097364, -1309965, -298500, 1520418, 1964948, 1262720, 633508, -3796751, 682900, -135291, - -1995012, -676457, 332860, -470299, -2016487, -1256278, -2091649, -539018, 57982, 337155, - -356482, -1380832, -304943, -1063004, -139586, -1140314, -53687, -24631638, 5761699, 298500, - -2924873, 4337917, -2710124, -2216203, 1183264, -4213363, -2405182, -947040, 1797444, -3337190, - 4548371, 34360, -45097, 2027225, 2160369, 3216931, -274878, 4453881, 6562710, 4625680, - 1559073, 3949223, -1226213, 2486786, -2881923, -3077344, -1185411, 313533, 2042257, -1644973, - -2763812, -1591285, 8590, 1698660, -2669322, 1926293, 758062, 1473174, -622770, -2559801, - -3298535, -4069482, 1129576, -2106682, 1172526, -4310000, -1155346, 1861868, -2609193, 390842, - -1810329, 1236951, -528281, 1200443, 373662, -807454, 10737, -1763084, 3279208, 1299228, - 3034395, 1219771, 16460462, 27092654, 7902740, 7024419, 9824738, 7911330, 1599875, 6270653, - 5641440, 3030100, 11907797, 2808909, 2059437, 5119601, 4801774, 2488934, 2158221, 1236951, - 2029372, -1541893, 6045167, -1612760, 637803, -1889786, 3852586, 182536, -916976, 3133179, - 3801046, 1314260, 5025112, -3517578, -5748814, -1314260, -272730, 1260573, -335007, 2503966, - -2257005, 2280628, 5068062, 2151779, -4380867, -921271, 2340757, 889058, -2108829, 3148211, - 1307818, 1866163, 2138894, 2813204, 994285, -781684, 760209, -2536178, -597000, 2375117, - 2241973, -1221918, 38655, 586263, -1002875, 343597, 1793149, 62337156, 6390912, -571231, - 3837553, -62277, 5308580, 115964, 1417339, 730144, 5596343, 2675765, -2323577, 1937030, - 2675765, 1496796, -3403762, -6990060, -3244848, -2905546, 1236951, -4271345, -770947, -221191, - 1148904, 7801808, 4292820, 1513976, 3096672, -4769561, -304943, -2473901, -977105, -1937030, - 2901251, -1058710, 4861903, -2183991, -884763, -2443837, -1120987, -3554086, -1685775, 884763, - 783832, -133144, 40802, -1924145, 1123134, 3412352, 272730, -1750199, 2106682, -2911988, - 1299228, 1361505, -289910, -865436, -627065, -75162, -551903, 206158, 2018635, -167504, - -1840394, 444529, -18126910, -21575768, -4009352, -1204738, -882616, -3433826, -1417339, 6541235, - 3874061, 1374390, 1786706, -2862596, -571231, 4907000, -1810329, 7992934, -6212670, -1702955, - 6519761, -1264868, -732292, -3798899, 4466766, 4932770, 90194, 4861903, -1775969, 2149631, - -103079, -2735894, -431644, -2166811, -904091, -1410897, 2686502, -1992865, -476741, -3060164, - 2059437, -1595580, 4498978, -7123204, 2982855, 2465311, -4301410, 77309, -2845416, 749472, - -3238405, 1009317, 1340030, -4118874, -627065, -1509681, -6116034, -3554086, -1702955, -3053722, - -667867, -528281, 324270, -2501819, 341450, -4818954, 1333587, 569083, -1666447, 581968, - -1662152, -463856, -1084479, -521839, -15988016, -9083856, -12416750, -6292127, -8312909, -880468, - 7913477, -8274255, 6350109, 4140349, -4595615, 9135395, -1494649, 1816771, -5989332, -588411, - -2697240, -330712, -19327, 2287070, 1037235, 4788889, 9032316, -2415919, 1191853, -4301410, - -4604205, -3990025, 856846, 3824669, -1393717, -1277753, -1269163, -2768107, 3090229, -949188, - -274878, -2710124, -2229088, -1791001, -2901251, -201863, -188979, -2360085, 1507534, -3633542, - 1290638, -2095944, -448824, 1367947, -2778844, 3386582, -5896990, -1780264, 481036, -1694365, - -3180423, 1559073, -927713, -3470334, 5675800, 3281355, 723702, 1127429, 1084479, 1440962, - -2976412, -1876901, 667867, -1005022, -2085207, 2199023, -44420700, -5025112, 3545496, -3197603, - 7325067, 3455301, -9021579, 1271310, 1475321, -2838974, -7559143, -2727304, -1868311, 2207613, - 506806, -6899865, -2662880, -3650722, -6732361, -5581310, -13164075, -6771016, -7703024, -9242770, - 7359427, -4883378, 2671470, 5607080, -4041564, -6244883, -2465311, -1290638, 1479616, 4230543, - 2388002, -5160403, -6521908, 5188321, 3173981, 4118874, 5669357, 897648, -51540, 2310693, - -298500, -2443837, 1417339, -1286343, -893353, 3423089, 8506183, -2753074, -4292820, 2063732, - -2744484, -180389, 4372277, -8358007, -141734, -2701535, -483184, -98784, 30065, -923418, - 1664300, -2430952, 3040837, 3408057, 1382980, -113817, -40802, -2761664, 35577360, 30983894, - 8422431, 18833432, 5242008, 10838350, -1735167, -1739462, 5304285, 7118909, 3816079, -12324409, - -4052302, 7662222, 8701604, -3210488, -4146791, 1398012, 3644280, 4088809, 646393, -6414534, - -13722421, -5177583, 7548405, -672162, 7756711, -1833951, -2415919, 1556926, -6354404, -3710852, - -3676492, 7069516, -8768176, -6079526, 1629940, 1475321, -2222646, -279173, -2478196, 2647847, - 3652870, 3098819, 7033009, 4069482, 171799, -5708012, 5430986, -500364, 3036542, -2785286, - 2136746, 4264903, -590558, -1129576, -2600603, -3143916, 1997160, 446677, 2800319, -2716567, - 2349347, 5538361, -1095217, -3012920, 3917010, 5022965, -1962800, 2252710, 2576981, 2025077, - 4851166, 4105989, 43228844, 7934952, -8340827, 6899865, 4636417, -8276402, -1754494, 4065187, - 317828, 1230508, -601295, -1818919, -8967892, -8935679, 3972845, 8227010, 8656507, -8609262, - -17175574, 2293513, -234076, -7022272, -8774618, -1675037, 4421669, -3161096, 6549825, 10363756, - -3917010, -3554086, -1398012, -1681480, -2033667, -16170552, 8388071, 7505456, -289910, 4791036, - -4861903, -1679332, -4423817, 6332930, 6914898, 631360, -1730872, -2660732, 3850438, 785979, - -2263448, -4209068, 2147, 3277060, -5209796, -3373697, -2843268, 734439, 1649268, -6695854, - 3322157, 7080254, -5916318, -227633, -1438814, -1166084, -66572, 569083, 384400, -571231, - 1271310, -2104534, -3886946, -4711579, -2031520, -1271310, -2508261, -4494684, -3526168, -1022202, - 3111704, -1462436, -11905649, -7713762, 1028645, 10771778, -10851235, 7722351, 3403762, 1737314, - 2087354, 1909113, 6882685, 11366631, 206158, 3466039, 1151051, -9665824, -8933532, 8680129, - 1065152, -9990094, 5821828, -8523363, 1307818, 10597832, -779537, -2828236, 11931419, 1926293, - 712965, 1039382, 249108, 1133871, -5407364, 3221226, 4741644, 7990787, -6420976, -3079492, - 1120987, 1151051, -3008625, -5654325, 3526168, -2035815, 2435247, 1393717, -2098092, -1801739, - 697932, 3655017, -2858301, -1168231, -732292, 2117419, -5890548, -2654290, 2561948, 614180, - -2068027, -966368, 2304250, -2398739, 642098, -1608465, -523986, 1995012, 450972, 1181116, - -5102421, -3508988, 1213328, -46415712, -42518028, -9571335, -19673098, -17373142, -9764608, -3034395, - -7318625, -8927090, 6073084, 1548336, -2016487, 10052371, 3753802, 12090333, 9455371, 2639258, - 3807489, 4363687, -18592914, 8712341, -1402307, -4017942, -3455301, -11098195, -3380139, -3901978, - 10621454, -3620658, -6296422, -3231963, 1713692, -1464584, -2087354, 2250563, -2774549, -1904818, - 6502581, -6440304, -532576, -2145336, 11675869, 4535486, 4679367, -9058086, 708670, 7885560, - -4176856, 1810329, 53687, 1842541, 62277, 571231, -601295, 4986457, -654983, -1758789, - 3710852, -2731599, 2083059, 4329327, -2070174, -3184718, 1374390, 1589138, -3330747, -1471026, - -6148246, -4975720, 1610613, -667867, -1088774, -221191, 803159, -504659, -3908420, -1947768, - -29186450, 61467424, 38315404, 12524125, 3588445, 4385162, 4174708, 7054484, 5871221, 13153337, - 25769804, 1655710, 2785286, 5828271, 5145371, 6856916, -5007932, 25366076, 17779018, -16529182, - 12184822, 2473901, -2854006, 6238440, 15053860, -14085345, -4224101, 1350767, -12008729, -7889855, - -8622147, 17493402, -912681, -2888366, 2156074, 1144609, -5310727, -13707388, 9498320, 8057359, - -2493229, 4483946, 9745281, -6382322, 5250598, 747324, -2703682, 7990787, 6530498, 1743757, - 775242, 987843, 5237713, 7763154, -57982, -1178969, -195421, -2207613, 5194763, 1305670, - -2272038, -2458869, -2050847, 4232691, 1756642, 9369471, -2881923, 3476776, -2147484, 2486786, - -3850438, -1129576, 1024350, -1836099, -2720862, 433792, 345745, 1380832, 2383707, 66520452, - -23514946, -22883586, 10305774, 2671470, -8808978, -7552700, -12275017, -11950747, -8924942, -7361574, - 10894185, 2677912, 1228361, -6122476, -5544803, -19325206, -120259, -7567733, -13460428, 11252814, - 7310035, 2415919, 6788196, 2052994, -2439542, -4185446, -459562, -3517578, 5540508, 9665824, - -10224170, -3605625, 55835, 5338645, 13138305, 4108136, 17652316, -8970039, 5510443, 14922864, - 8630737, -7232725, -2280628, 1870458, -3837553, 6541235, -1075889, 517544, 9365176, 5347235, - 1432372, 1075889, -313533, -3777424, -191126, 1335735, -4318590, -2196876, 4114579, -1425929, - -8117488, -957778, 167504, -1174674, -8448201, 2409477, 1653562, 2330020, 2272038, -1511829, - -3545496, -944893, -1821066, 7054484, 2849711, -2409477, 1833951, -377957, 1376537, 356482, - 21393232, 40450000, 15990163, 10797548, 12775380, -3745212, 4170413, -11607149, 20233590, 7894150, - 19441170, 5748814, 7473243, -17693118, 22157736, 32654636, 4260608, 21163452, -4140349, -17224966, - -16911434, 15522012, -4887673, 12390981, 2420214, 4954245, -9405978, 9588514, -3212636, -3448859, - 16000901, 11014444, -8181913, 14815490, 1812476, 2697240, -2836826, -11196980, 3266323, 824634, - -6066642, -7054484, 6721624, 9210557, 3189013, -3253438, 4518306, 350040, 9981504, -5918465, - -687195, -9756018, 1316408, 9543417, 6601365, -4432406, 148176, 3354370, -8480413, -650688, - -5729487, -3294240, 1995012, 2284923, 6015102, -6837588, 3156801, -7866233, 884763, 9758166, - 3624953, 1928440, -5978595, 921271, 938450, -10172630, -2497524, 1191853, 1941325, 4041564, - 1846836, -51540, -47493748, -2415919, -10861972, 13595719, -10408853, 11212012, 156766, 9017284, - -1410897, 7797513, -23828478, 7106024, -2959233, -8377334, 3972845, -10239202, 6189048, -10340134, - -5725192, -23029614, 12996571, 27902256, -11085311, -3549791, -3367254, -4415227, 4035122, 5637145, - 7853348, -20478404, 5957120, -12713103, -3874061, -603443, 10368051, 4125316, -5516886, 2323577, - 2046552, 7645042, 7507603, -12768938, -4445291, 1937030, -9584220, -8280697, -1797444, -5896990, - 2330020, 7260642, 749472, 1314260, -1913408, 6771016, 17886392, 10280004, -11336566, 2308545, - 3889093, -5448166, 6161131, 1720134, -7340099, -616328, 7930657, 927713, 7580618, -10447508, - -2673617, 6358699, 77309, -3399467, -7531225, -504659, -4103841, 6083821, -1943473, 3818226, - -2033667, -725850, -87061136, -32411970, 17452600, 6549825, -11345156, 12537010, 9990094, 16492674, - -4123169, -6919193, 14055280, 826781, -9775346, 19591494, -21889300, -28048284, -13524852, -14944339, - 9730248, 14480482, -502511, 3914863, 22308060, 10142565, -22950158, -10048076, -14181982, 4443144, - -21320218, -18199924, -1286343, 3113851, -8257075, -8592082, -13054553, -6436009, -11959336, -11297911, - -4498978, 1260573, -4367982, -410169, -8111046, -953483, -6247030, -13166222, 28898688, 2639258, - 6730214, -11562052, 7554848, -472446, 3798899, -9223442, -517544, -1249836, -8040179, -4657892, - -3732327, 9738838, 6766721, 7687992, 4473209, 6032282, -1460289, 395137, -6968585, -942745, - -450972, -221191, 8806830, 2742337, 5117454, 5778879, -4146791, -9324374, 4020090, -3382287, - -1827509, 4264903, 11327976, -1075889, 45479408, 16823386, 36633924, 5871221, 2420214, -14590004, - 5602785, 22065394, 8231305, 1707250, 14727443, -13086765, -5916318, 12120398, -9148280, 4307852, - 21105470, 6923488, 2888366, 6867653, -3828963, 9326521, -6955700, 390842, 3612068, 1385127, - -5351530, -5645735, 2323577, 21897890, -6983617, 5551245, -19978040, -10537702, 9227737, 23072564, - -17529910, 324270, 11108933, 2965675, 4279935, -14366666, -5001490, -12386686, -21917218, -5613523, - -12141873, -12723841, 10544145, 4383014, 3715147, -7346542, -4518306, -1290638, -21028160, -1767379, - 11976516, -8160438, 9637907, 19756850, 3103114, 13161927, 8667244, 962073, -3760244, 11458973, - -14040248, -429497, -697932, 9171903, 4477504, 8473970, 478889, 9375914, -403727, 2145336, - 1565516, 9972914, 246961, 362925, 8890582, -4430259, 5613523, 2192581, 1660005, -2540473, - 55624120, -12431783, -16709570, 2435247, 13015898, 10069551, 10883447, -3365107, 11716671, 3309272, - -13290776, -27457726, 18494130, 4614943, 13460428, 7591355, -6942815, 2931315, -10114648, -18047452, - 18762564, -11821897, -21818434, 2093797, -3328600, 2476049, -1900523, -2486786, -5317170, -9012989, - 6816113, 14669461, -21257940, 20841328, -17937930, -24043226, 2617783, 6148246, -13131863, 10353019, - -1597728, 6487548, -11263552, -5959267, 19986630, 7838316, 20235738, 5091684, 1821066, 6143951, - 253403, 558346, 10750303, -1093069, 2156074, -9494025, -6034429, -5692979, 7666517, -7417409, - -5866926, 11697343, -30065, 13121125, 2347200, -9871982, 16228534, 12212740, -693637, 7907035, - -7827578, -13559212, 5478231, -5070209, -9322227, 670015, 8826158, 11392401, -4030827, 3446711, - 5927055, -925565, 2729452, -11731703, 4773856, 3856881, -5448166, 46471548, 56390772, -8557722, - 244813, -28321014, -3317862, -20637318, -15614354, -4849018, -10707353, 16101832, -90194, 12515535, - -26626650, 22157736, -16804060, 22625888, 706522, 17989470, -6554120, 22645216, 7318625, -10617159, - 4662187, -15902116, 10535555, -8811125, 25284472, 7675107, 16589311, -27635968, -15979426, -6693707, - -14147622, -5772436, -9706626, 1017907, 34213708, -15734613, 17162690, 29186450, 4039417, 12902082, - 92342, -6395207, -13647259, -10228465, 1367947, -7346542, 17471926, -11246372, 7971460, 21356724, - -2869038, -1627793, -1773822, 17491254, 18698140, 6008659, -8785356, -7509751, -4670777, 7468948, - -17263622, 3360812, -3150359, -4602058, 178241, 11484743, 949188, 16209207, 14654428, 3051574, - 3470334, -6856916, -410169, 16662326, -2192581, 1118839, 6874095, -8682276, 111669, -9957882, - -11050951, 1739462, 1533303, -2059437, -43862352, -39612484, 17740362, -5392332, 21908628, -12524125, - -10037339, -14918569, -11937862, -5753109, -34561600, -12887049, 13563507, 18539226, 7902740, -24350318, - -6682969, -11755325, 10468983, 34896608, 19816980, 8435316, 1582696, 2534031, 2035815, 6038724, - 18333068, 1359357, 4988605, -10415296, 1080184, -14879914, 6019397, 7127498, 13342316, 1610613, - -8701604, -4578435, 17521320, -8108899, 6781754, 3463891, 6530498, 21992380, -12000139, -18706730, - 7286412, 15665893, 4440996, 15659451, 19142670, 9053791, 13363791, 4999342, 3109556, 10322954, - 31726924, -17532056, 285615, 5130339, 3096672, -13602161, -2093797, 10428181, 135291, -12197707, - 5158256, 22789096, -18242874, 6027987, -17257178, 10146860, 7226283, 2791729, 1007170, -8308614, - -7934952, 16035260, 9000104, 3264175, -4567698, 11237782, -1271310, 32212, -7475391, 8284992, - 3425237, -88409752, -31151398, -1773822, -9062381, -21642340, 13131863, 18041010, 29858612, 10097468, - 18689550, -17349520, -37276020, 17467632, -8978629, 1136019, -20175608, 19836306, -12013024, -725850, - 18015240, -50343460, 4642860, 26493506, -49289044, -12768938, -17617956, 2572686, 1586990, 12199855, - -13883482, 16103980, 2022930, -25527138, -13501230, 3236258, -3547643, -12549894, 10965052, 30096984, - 6137509, 8461086, -5055177, -7258495, 17190606, 3369402, -9025874, -42777876, -7106024, 5600638, - -22048214, 10522670, 8529805, 1919850, -17104708, -14882062, -18221398, 38738456, 9957882, -5708012, - 7187628, -32613834, 3569118, -15178414, -17918604, 17235704, -3199751, 384400, -11407433, -40853728, - 5239860, 12625056, 6912750, -2834679, 23965918, 968515, -10468983, -1466731, -16230681, 25295210, - 13391708, 7189776, -4460324, 1866163, 7793218, -7327214, 2864743, 3618510, 1060857, 94128504, - 23607288, 24365350, 20544976, -5903433, 745177, 96812856, 27867896, -7889855, 59017144, -33021856, - 24595130, 5302137, 15017353, 24270860, -7505456, -16722455, 18169860, -3173981, -58437324, 15077483, - 15122580, 12513387, 27788438, 17770428, 18148384, -16292958, 3620658, -15721728, -8291435, 17482664, - 5750961, -33917356, -20349556, -28394028, -42528768, -6326487, 8798241, 20974472, 17965848, 15655156, - 12994424, -6094559, 22293028, 12592844, -27036820, -10144713, 7273527, 20620138, 545461, 4627828, - 35974648, -6197638, -2972117, -9062381, -1799591, 18549964, -15547782, 523986, -22018150, -19383188, - -12491912, 23274428, 31722628, -8905615, 2662880, -5815386, -19516332, -13022341, 5218386, -22447646, - -5920613, -5781026, -14568529, 40587440, 8965744, 13786845, 11890617, -850404, 204011, 7284265, - 2276333, 13000866, 8151848, 562641, -1108102, 96125664, 56098716, 4492536, 35465692, 27844272, - 7406671, 41897404, 11265699, 285615, -13303661, -9133248, -27455578, -72924248, -5854041, 7550553, - -25445534, -13849122, -3227668, 51627656, 16361678, -12869870, 124554, 3974992, -7733089, 22009560, - -4035122, -12887049, -9468255, -12124693, 7700877, -18013092, -45417132, 1436667, -23892904, -36013300, - 6753836, 16125455, 22419730, 13254269, 19801946, -13348758, -39170100, -24891482, -35272420, 14106820, - 32319628, 27348204, 17033840, 33062658, 453119, 20817706, 43946104, -36271000, 6231998, -16146930, - -212601, 13157632, 12837657, 21968758, -2325725, -44424996, -35021164, 7874823, -10172630, -12326556, - -8931384, -9369471, -31080530, 3141769, 20426864, -1797444, 15472620, -9096741, -1196148, -1290638, - 7548405, 30900142, 21105470, 19005230, -17978734, 1466731, -10967199, 1700807, -28585154, 6124624, - 4275640, 3526168, -964220, -2987150, -8512625, 7511898, 23478438, -47983376, 6094559, -36777804, - 16531329, -70044472, -1728724, -23381802, -35867272, 64276332, 36633924, -23229330, -57773752, -14888504, - -20987358, -50861004, 39528732, 1859721, -34855808, -13265006, 20362440, -33386928, -22417582, -17671642, - -39140036, -15337328, -682900, -32042604, -28703266, 40160092, -15000173, -12912819, -3637837, -9337259, - 34475704, -38405596, -17718888, 7735236, -10071698, -360777, -8572755, 19509888, -36054104, 12534862, - -57690000, 5538361, -16460462, -23405424, 60694332, 5950677, -22374632, 11205570, 12708808, -49327700, - 33998960, -8660802, -10518375, -4090956, 19443316, -8486855, 876173, -23843510, 12762495, 15483357, - 27292370, -23987392, -60462404, 41790032, -4849018, 17001628, 20648056, -12957916, 11899207, 30764850, - -39893804, 1685775, -14083198, -4801774, -41422812, 13647259, -6485401, 1185411, -1095217, 4992900, - -7030862, -6753836, 11317239, -10982231, 8169028, 1909113, -7857643, -91905856, -50298364, 10819023, - -31862214, 3317862, -22870700, -12764643, -33814276, -24296630, 17914308, 50667728, 54470924, 7952132, - 38603168, -26882200, 67005784, 48142288, -38281044, -35581656, 11574937, 10333691, 56717192, 19743964, - 36515812, -13597866, 14970109, -7937100, -5467494, -12543452, 53053584, 22853520, 50837380, 45021996, - 9326521, -3347927, -21685290, 21391084, -2091649, -46641196, -30118458, -9403831, -23227184, -5972152, - -23890756, -22101902, 15040975, -7161858, -14931454, 37718404, 45773612, -26710402, -8179765, 61042224, - 25690346, -42829412, -40928892, -15618649, 16108275, -2647847, -7209103, -30678952, 25832080, 7127498, - -9270687, 6350109, 7456063, -37879464, -15893526, 2854006, -13544179, -18747532, -19035296, 49787260, - -39073464, -36127116, 15028091, 25211458, 37368364, -19400368, -5521181, 2879776, -16527034, 16954384, - -2188286, 12560632, -10634339, -5252745, 3882651, 4466766, -5918465, -6247030, -42950, -7483981, - -34930968, -50813760, -44012676, -180389, -34673272, -44165148, 11248519, -3629247, -61976380, 44313324, - 7718056, -3588445, 21848498, 68199784, 64879776, 28194312, -79729624, 29725468, 21000242, -77846280, - -1202591, -37505800, -18395344, 40325448, -47285444, 27543626, -109522, -7971460, -16962974, 8244190, - -4020090, 13655849, -9176198, -41635412, 40475772, 19333796, 48496624, -4926328, -16458315, -23364622, - 19591494, -21045340, 57299160, 12208445, 34389804, -44581760, 35538708, 1507534, 12537010, -28898688, - 9680856, -34346852, -5506148, -35238060, 14394583, 24573656, -47019156, 2020782, -38749196, 18229988, - 22797686, 22374632, -3103114, -66256312, 83752, 17637284, -5765994, 29611652, -63541892, 16393890, - -26459146, 8632884, -22426172, 4728759, 16376710, -7039452, -274878, -6798933, -8291435, 2645700, - -17149804, 21629456, 4814659, -438087, -27318140, -2420214, 2836826, -1846836, 11411728, -11667279, - 2587718, -1138166, -6051609, 95490008, 115833120, 48451528, 40387724, -66780300, 64233384, 93258776, - -102039832, 12210592, 66179004, 11521250, -121708632, -12150462, -66071628, 21328808, 24206436, -30764850, - -12045236, 22194244, -55886116, -4462471, -21897890, -27457726, 10900627, -42384884, 45653356, 32545114, - 59042916, -29250874, 9646497, -6378027, -24088324, 74549896, -1479616, -34316788, -16228534, 16103980, - -16080358, -19529216, -22932978, 37920268, 14061723, 52718576, -3768834, 19323058, 69170448, -43920336, - 9148280, -29828548, 54872504, -21588654, 25645250, 10879152, -2239826, -20828444, -39172248, -26474178, - 10969346, 49604724, -46757160, 41848012, 49456548, 24865714, 57805964, -28308130, -23089744, 37673304, - -6607807, -7043747, -53470196, -3410204, -44132936, 9019431, 55718612, 27341762, 13962939, 25546466, - 15129022, -24017458, -10913512, -41916732, 47259672, 1945620, -18934364, 12474733, 4151086, -22054658, - 11394548, -3199751, 13460428, -2321430, 20484846, 9814000, -44571024, -151485648, -63621352, -108920368, - -58911920, -46544560, 25063282, -69913480, -71567040, -34168612, -95614560, -31035434, 71902048, -2177549, - 2733747, -19449760, -17040282, -9012989, 6416681, -1148904, -64087356, -10144713, -12768938, 92721904, - -12161200, 82441896, 6541235, -22166326, 21294448, 67875512, -3672197, 708670, -27474906, -7975755, - -28829968, 16138340, -12270722, -24388972, 12165495, -32948842, 26628798, 27204322, 5119601, 59435904, - -27064736, 30296700, -25312390, 33436320, 22460532, 62618476, 8415988, -25516400, 33513630, -4290673, - -21131240, 79527760, -6083821, -4797479, 45657648, 14128295, 61523260, -48037060, -47029892, -7142531, - -20456930, -6463926, -75995152, -17248588, 26175678, -10292889, -32785632, -53362820, 3478924, 16312286, - -26819924, -25559350, -46533824, -16533477, 19593640, 20336670, 40980432, -6592775, -3895535, -1464584, - 13606456, 16408923, 2686502, 26027502, 7071664, 2798171, -3586298, -2482491, 18556406, -7965017, - 18341658, 20746840, -968515, 6156836, }, + 5362267, -3098819, 1329292, -1745904, 399432, -1284195, -347892, 55835, 2576981, -1692217, + 1123134, -2744484, 2025077, -3098819, -4211216, -3702262, 850404, -397284, 579821, 79457, + -1915555, 1105954, 1917703, -1084479, 1535451, -242666, -670015, -1357210, -244813, 399432, + 1078037, -785979, 1612760, -654983, 1028645, 1501091, -1097364, -1056562, 68719, -1110249, + 298500, 27917, -508954, 1103807, 180389, -513249, 3689377, -3813931, -676457, -818191, + -858993, -294205, -38655, -743029, -500364, -15032, 180389, -549756, 328565, -1198296, + -326418, -212601, 736587, -4054449, -358630, 811749, -362925, -513249, 373662, 53687, + 307090, 1833951, -876173, -616328, -970663, -206158, 569083, 811749, -831076, -661425, + 1011465, -932008, -1329292, -171799, -345745, 448824, -380105, -408022, 244813, 392990, + -811749, 251256, 337155, -12947179, -8793946, -3573413, -4080219, -2280628, -2134599, -2022930, + -914828, -2439542, -1921998, -839666, -1498944, -197569, -539018, -1307818, -1767379, -1979980, + -779537, -1148904, -1995012, -261993, -2497524, 6442, -188979, -347892, -1511829, -261993, + -1142461, 8590, -1475321, -942745, 508954, -1086627, 191126, -2521146, -463856, 1228361, + 753767, -47245, -367220, -725850, 206158, 227633, 1168231, -702227, -115964, -362925, + -17038136, -910533, 2173254, -19327, 637803, -100932, 0, -1346472, 1436667, 590558, + 1733019, 1264868, 3569118, 2652142, 186831, -1398012, -831076, -315680, 654983, -461709, + -3180423, -2826089, -1488206, -420907, 122407, 420907, 571231, -94489, 83752, 367220, + -678605, -70867, -105227, -1930588, 1131724, 491774, -229781, 0, -760209, -1063004, + 659278, 279173, -721555, 697932, 562641, 846109, -382252, 19097572, 13387413, 2647847, + 5173288, 1090922, 1700807, 4247723, 2164664, 689342, 2529736, 1052267, -1133871, -536871, + 869731, 1492501, -2600603, -326418, -1567663, 3463891, 1698660, 901943, 1700807, 895501, + 874026, 64425, -180389, -824634, 1335735, 1655710, 1378685, 1760937, 2089502, 1279900, + 3058017, 719407, -184684, 1118839, 193274, -508954, -253403, -450972, -616328, 42950, + 1415192, 369367, 225486, 858993, 28509992, 12066711, 3697967, 3292093, 2368675, 1402307, + 500364, 73014, 3161096, 594853, 1771674, 2319282, 1284195, -201863, -826781, 4939213, + -408022, -2755222, -1518271, 1202591, 109522, 2628520, 914828, 296353, -448824, -1271310, + -309238, -599148, 1209033, -231928, 526134, 88047, 225486, -667867, 989990, 3427384, + 2226941, 2267743, 2110977, 1681480, 977105, 642098, 435939, 1105954, -910533, 665720, + -408022, 9382356, -9887015, -2985002, -4271345, -3687230, -2016487, -590558, 1367947, -1370095, + 139586, -3652870, 1241246, -1327145, -3324305, 882616, -2379412, -3158949, -2274185, 3030100, + 2265595, -1060857, 1144609, -2091649, 798864, -3809636, 182536, 633508, -665720, -889058, + 779537, -3015067, -1389422, 395137, -1075889, -886911, -708670, 251256, 298500, 1526861, + 66572, 2630668, -1041530, -717260, -852551, -1294933, -429497, -646393, 341450, -1116692, + -1754494, -266288, -33844344, -17119740, -6178311, -4795331, -5280663, -3268470, -4569845, -2929168, + -4973572, -874026, -2269890, -551903, 184684, -2029372, -605590, 343597, -17180, -3098819, + -2115272, -1391569, 249108, -4185446, 371515, -1887638, -3786014, 341450, -98784, 279173, + -143881, -1301375, -1063004, 62277, -337155, -27917, -1451699, 64425, 324270, 1148904, + 373662, -1434519, 775242, -1434519, 927713, -2480344, -1760937, 395137, -1440962, 88047, + -581968, -1988570, -652835, -20029580, 10522670, 4372277, 1664300, 2675765, 534723, 693637, + 2411624, 2628520, 1473174, 1739462, -1314260, -603443, -2068027, 2523293, 566936, 429497, + 3519726, 81604, -2304250, 4112431, -2714419, 302795, 3459596, -1065152, 934155, 412317, + -42950, -1750199, -373662, 916976, 1024350, 137439, -575526, 38655, -1174674, 3880503, + 371515, -90194, -1501091, -803159, -955630, -959925, 2153926, 1999307, -485331, 171799, + -94489, 584116, 186831, -161061, -377957, 455267, 356482, -618475, -513249, 83752, + 504659, 30129196, 12751758, 3451006, 6869800, 4041564, 1685775, 3040837, 2555506, 38655, + 1859721, 3019362, 661425, 40802, 1498944, 4241280, -1451699, -736587, -3354370, 882616, + 3809636, 1655710, 152471, -2130304, -1187559, -895501, 4015795, 1290638, 2089502, 1217623, + -1939178, -3051574, 3481071, 1958505, -2171106, -989990, 3382287, 2903398, -165356, 749472, + -373662, 1533303, 938450, -296353, 676457, -1163936, -577673, 1870458, -983548, -710817, + 1945620, 1711545, 916976, 371515, 395137, 450972, 1385127, 798864, 2192581, 35654672, + 7681549, 5985037, 2576981, 2774549, 1112397, 2854006, 3272765, 5325760, 3201898, -947040, + 4121021, -751619, 1084479, 977105, 3483219, 5239860, 3309272, -848256, 5768141, -1052267, + -629213, -3004330, 796716, -858993, 923418, 1612760, -1782411, -2385854, -1037235, 526134, + -1979980, -592706, 869731, 1340030, -2317135, -1906966, -837519, 801011, -36507, 654983, + -852551, 32212, -581968, -725850, 914828, -1273458, 1245541, -1370095, -511101, -1030792, + 219043, -341450, 1404454, 685047, -124554, 1999307, 663572, 4136054, -15805480, -5053029, + -5656472, -3622805, 962073, -886911, -3401614, 1949915, 128849, 2394444, -281320, 261993, + -3708704, -2592013, -1730872, -2669322, 214748, -2841121, -5523328, 1101659, 631360, -2544768, + -575526, -2308545, 472446, 790274, -466004, -5671505, -1625645, 369367, -650688, 493921, + 1509681, -4037269, -1230508, -2521146, 1292785, -307090, -236223, 2652142, -2703682, -176094, + 805306, -337155, -906238, 1284195, 654983, -1604170, -1992865, -3133179, -502511, -2394444, + -1967095, -1022202, -1370095, -798864, -397284, -734439, -1236951, -1623498, -955630, 584116, + 1073742, -191126, -37052684, -12517682, -7614977, -1879048, -3964255, -103079, -2164664, -2705830, + -3438121, 4254165, 53687, -1567663, -442382, -6103149, -3543348, -2952790, 4973572, -4179003, + -8974334, 788127, 1050120, 749472, -3330747, -820339, 1836099, -4056597, -470299, -4140349, + -1297080, 2390149, -2059437, 622770, 4516158, 547608, -989990, -1056562, 1191853, 1464584, + 1097364, -1309965, -298500, 1520418, 1964948, 1262720, 633508, -3796751, 682900, -135291, + -1995012, -676457, 332860, -470299, -2016487, -1256278, -2091649, -539018, 57982, 337155, + -356482, -1380832, -304943, -1063004, -139586, -1140314, -53687, -24631638, 5761699, 298500, + -2924873, 4337917, -2710124, -2216203, 1183264, -4213363, -2405182, -947040, 1797444, -3337190, + 4548371, 34360, -45097, 2027225, 2160369, 3216931, -274878, 4453881, 6562710, 4625680, + 1559073, 3949223, -1226213, 2486786, -2881923, -3077344, -1185411, 313533, 2042257, -1644973, + -2763812, -1591285, 8590, 1698660, -2669322, 1926293, 758062, 1473174, -622770, -2559801, + -3298535, -4069482, 1129576, -2106682, 1172526, -4310000, -1155346, 1861868, -2609193, 390842, + -1810329, 1236951, -528281, 1200443, 373662, -807454, 10737, -1763084, 3279208, 1299228, + 3034395, 1219771, 16460462, 27092654, 7902740, 7024419, 9824738, 7911330, 1599875, 6270653, + 5641440, 3030100, 11907797, 2808909, 2059437, 5119601, 4801774, 2488934, 2158221, 1236951, + 2029372, -1541893, 6045167, -1612760, 637803, -1889786, 3852586, 182536, -916976, 3133179, + 3801046, 1314260, 5025112, -3517578, -5748814, -1314260, -272730, 1260573, -335007, 2503966, + -2257005, 2280628, 5068062, 2151779, -4380867, -921271, 2340757, 889058, -2108829, 3148211, + 1307818, 1866163, 2138894, 2813204, 994285, -781684, 760209, -2536178, -597000, 2375117, + 2241973, -1221918, 38655, 586263, -1002875, 343597, 1793149, 62337156, 6390912, -571231, + 3837553, -62277, 5308580, 115964, 1417339, 730144, 5596343, 2675765, -2323577, 1937030, + 2675765, 1496796, -3403762, -6990060, -3244848, -2905546, 1236951, -4271345, -770947, -221191, + 1148904, 7801808, 4292820, 1513976, 3096672, -4769561, -304943, -2473901, -977105, -1937030, + 2901251, -1058710, 4861903, -2183991, -884763, -2443837, -1120987, -3554086, -1685775, 884763, + 783832, -133144, 40802, -1924145, 1123134, 3412352, 272730, -1750199, 2106682, -2911988, + 1299228, 1361505, -289910, -865436, -627065, -75162, -551903, 206158, 2018635, -167504, + -1840394, 444529, -18126910, -21575768, -4009352, -1204738, -882616, -3433826, -1417339, 6541235, + 3874061, 1374390, 1786706, -2862596, -571231, 4907000, -1810329, 7992934, -6212670, -1702955, + 6519761, -1264868, -732292, -3798899, 4466766, 4932770, 90194, 4861903, -1775969, 2149631, + -103079, -2735894, -431644, -2166811, -904091, -1410897, 2686502, -1992865, -476741, -3060164, + 2059437, -1595580, 4498978, -7123204, 2982855, 2465311, -4301410, 77309, -2845416, 749472, + -3238405, 1009317, 1340030, -4118874, -627065, -1509681, -6116034, -3554086, -1702955, -3053722, + -667867, -528281, 324270, -2501819, 341450, -4818954, 1333587, 569083, -1666447, 581968, + -1662152, -463856, -1084479, -521839, -15988016, -9083856, -12416750, -6292127, -8312909, -880468, + 7913477, -8274255, 6350109, 4140349, -4595615, 9135395, -1494649, 1816771, -5989332, -588411, + -2697240, -330712, -19327, 2287070, 1037235, 4788889, 9032316, -2415919, 1191853, -4301410, + -4604205, -3990025, 856846, 3824669, -1393717, -1277753, -1269163, -2768107, 3090229, -949188, + -274878, -2710124, -2229088, -1791001, -2901251, -201863, -188979, -2360085, 1507534, -3633542, + 1290638, -2095944, -448824, 1367947, -2778844, 3386582, -5896990, -1780264, 481036, -1694365, + -3180423, 1559073, -927713, -3470334, 5675800, 3281355, 723702, 1127429, 1084479, 1440962, + -2976412, -1876901, 667867, -1005022, -2085207, 2199023, -44420700, -5025112, 3545496, -3197603, + 7325067, 3455301, -9021579, 1271310, 1475321, -2838974, -7559143, -2727304, -1868311, 2207613, + 506806, -6899865, -2662880, -3650722, -6732361, -5581310, -13164075, -6771016, -7703024, -9242770, + 7359427, -4883378, 2671470, 5607080, -4041564, -6244883, -2465311, -1290638, 1479616, 4230543, + 2388002, -5160403, -6521908, 5188321, 3173981, 4118874, 5669357, 897648, -51540, 2310693, + -298500, -2443837, 1417339, -1286343, -893353, 3423089, 8506183, -2753074, -4292820, 2063732, + -2744484, -180389, 4372277, -8358007, -141734, -2701535, -483184, -98784, 30065, -923418, + 1664300, -2430952, 3040837, 3408057, 1382980, -113817, -40802, -2761664, 35577360, 30983894, + 8422431, 18833432, 5242008, 10838350, -1735167, -1739462, 5304285, 7118909, 3816079, -12324409, + -4052302, 7662222, 8701604, -3210488, -4146791, 1398012, 3644280, 4088809, 646393, -6414534, + -13722421, -5177583, 7548405, -672162, 7756711, -1833951, -2415919, 1556926, -6354404, -3710852, + -3676492, 7069516, -8768176, -6079526, 1629940, 1475321, -2222646, -279173, -2478196, 2647847, + 3652870, 3098819, 7033009, 4069482, 171799, -5708012, 5430986, -500364, 3036542, -2785286, + 2136746, 4264903, -590558, -1129576, -2600603, -3143916, 1997160, 446677, 2800319, -2716567, + 2349347, 5538361, -1095217, -3012920, 3917010, 5022965, -1962800, 2252710, 2576981, 2025077, + 4851166, 4105989, 43228844, 7934952, -8340827, 6899865, 4636417, -8276402, -1754494, 4065187, + 317828, 1230508, -601295, -1818919, -8967892, -8935679, 3972845, 8227010, 8656507, -8609262, + -17175574, 2293513, -234076, -7022272, -8774618, -1675037, 4421669, -3161096, 6549825, 10363756, + -3917010, -3554086, -1398012, -1681480, -2033667, -16170552, 8388071, 7505456, -289910, 4791036, + -4861903, -1679332, -4423817, 6332930, 6914898, 631360, -1730872, -2660732, 3850438, 785979, + -2263448, -4209068, 2147, 3277060, -5209796, -3373697, -2843268, 734439, 1649268, -6695854, + 3322157, 7080254, -5916318, -227633, -1438814, -1166084, -66572, 569083, 384400, -571231, + 1271310, -2104534, -3886946, -4711579, -2031520, -1271310, -2508261, -4494684, -3526168, -1022202, + 3111704, -1462436, -11905649, -7713762, 1028645, 10771778, -10851235, 7722351, 3403762, 1737314, + 2087354, 1909113, 6882685, 11366631, 206158, 3466039, 1151051, -9665824, -8933532, 8680129, + 1065152, -9990094, 5821828, -8523363, 1307818, 10597832, -779537, -2828236, 11931419, 1926293, + 712965, 1039382, 249108, 1133871, -5407364, 3221226, 4741644, 7990787, -6420976, -3079492, + 1120987, 1151051, -3008625, -5654325, 3526168, -2035815, 2435247, 1393717, -2098092, -1801739, + 697932, 3655017, -2858301, -1168231, -732292, 2117419, -5890548, -2654290, 2561948, 614180, + -2068027, -966368, 2304250, -2398739, 642098, -1608465, -523986, 1995012, 450972, 1181116, + -5102421, -3508988, 1213328, -46415712, -42518028, -9571335, -19673098, -17373142, -9764608, -3034395, + -7318625, -8927090, 6073084, 1548336, -2016487, 10052371, 3753802, 12090333, 9455371, 2639258, + 3807489, 4363687, -18592914, 8712341, -1402307, -4017942, -3455301, -11098195, -3380139, -3901978, + 10621454, -3620658, -6296422, -3231963, 1713692, -1464584, -2087354, 2250563, -2774549, -1904818, + 6502581, -6440304, -532576, -2145336, 11675869, 4535486, 4679367, -9058086, 708670, 7885560, + -4176856, 1810329, 53687, 1842541, 62277, 571231, -601295, 4986457, -654983, -1758789, + 3710852, -2731599, 2083059, 4329327, -2070174, -3184718, 1374390, 1589138, -3330747, -1471026, + -6148246, -4975720, 1610613, -667867, -1088774, -221191, 803159, -504659, -3908420, -1947768, + -29186450, 61467424, 38315404, 12524125, 3588445, 4385162, 4174708, 7054484, 5871221, 13153337, + 25769804, 1655710, 2785286, 5828271, 5145371, 6856916, -5007932, 25366076, 17779018, -16529182, + 12184822, 2473901, -2854006, 6238440, 15053860, -14085345, -4224101, 1350767, -12008729, -7889855, + -8622147, 17493402, -912681, -2888366, 2156074, 1144609, -5310727, -13707388, 9498320, 8057359, + -2493229, 4483946, 9745281, -6382322, 5250598, 747324, -2703682, 7990787, 6530498, 1743757, + 775242, 987843, 5237713, 7763154, -57982, -1178969, -195421, -2207613, 5194763, 1305670, + -2272038, -2458869, -2050847, 4232691, 1756642, 9369471, -2881923, 3476776, -2147484, 2486786, + -3850438, -1129576, 1024350, -1836099, -2720862, 433792, 345745, 1380832, 2383707, 66520452, + -23514946, -22883586, 10305774, 2671470, -8808978, -7552700, -12275017, -11950747, -8924942, -7361574, + 10894185, 2677912, 1228361, -6122476, -5544803, -19325206, -120259, -7567733, -13460428, 11252814, + 7310035, 2415919, 6788196, 2052994, -2439542, -4185446, -459562, -3517578, 5540508, 9665824, + -10224170, -3605625, 55835, 5338645, 13138305, 4108136, 17652316, -8970039, 5510443, 14922864, + 8630737, -7232725, -2280628, 1870458, -3837553, 6541235, -1075889, 517544, 9365176, 5347235, + 1432372, 1075889, -313533, -3777424, -191126, 1335735, -4318590, -2196876, 4114579, -1425929, + -8117488, -957778, 167504, -1174674, -8448201, 2409477, 1653562, 2330020, 2272038, -1511829, + -3545496, -944893, -1821066, 7054484, 2849711, -2409477, 1833951, -377957, 1376537, 356482, + 21393232, 40450000, 15990163, 10797548, 12775380, -3745212, 4170413, -11607149, 20233590, 7894150, + 19441170, 5748814, 7473243, -17693118, 22157736, 32654636, 4260608, 21163452, -4140349, -17224966, + -16911434, 15522012, -4887673, 12390981, 2420214, 4954245, -9405978, 9588514, -3212636, -3448859, + 16000901, 11014444, -8181913, 14815490, 1812476, 2697240, -2836826, -11196980, 3266323, 824634, + -6066642, -7054484, 6721624, 9210557, 3189013, -3253438, 4518306, 350040, 9981504, -5918465, + -687195, -9756018, 1316408, 9543417, 6601365, -4432406, 148176, 3354370, -8480413, -650688, + -5729487, -3294240, 1995012, 2284923, 6015102, -6837588, 3156801, -7866233, 884763, 9758166, + 3624953, 1928440, -5978595, 921271, 938450, -10172630, -2497524, 1191853, 1941325, 4041564, + 1846836, -51540, -47493748, -2415919, -10861972, 13595719, -10408853, 11212012, 156766, 9017284, + -1410897, 7797513, -23828478, 7106024, -2959233, -8377334, 3972845, -10239202, 6189048, -10340134, + -5725192, -23029614, 12996571, 27902256, -11085311, -3549791, -3367254, -4415227, 4035122, 5637145, + 7853348, -20478404, 5957120, -12713103, -3874061, -603443, 10368051, 4125316, -5516886, 2323577, + 2046552, 7645042, 7507603, -12768938, -4445291, 1937030, -9584220, -8280697, -1797444, -5896990, + 2330020, 7260642, 749472, 1314260, -1913408, 6771016, 17886392, 10280004, -11336566, 2308545, + 3889093, -5448166, 6161131, 1720134, -7340099, -616328, 7930657, 927713, 7580618, -10447508, + -2673617, 6358699, 77309, -3399467, -7531225, -504659, -4103841, 6083821, -1943473, 3818226, + -2033667, -725850, -87061136, -32411970, 17452600, 6549825, -11345156, 12537010, 9990094, 16492674, + -4123169, -6919193, 14055280, 826781, -9775346, 19591494, -21889300, -28048284, -13524852, -14944339, + 9730248, 14480482, -502511, 3914863, 22308060, 10142565, -22950158, -10048076, -14181982, 4443144, + -21320218, -18199924, -1286343, 3113851, -8257075, -8592082, -13054553, -6436009, -11959336, -11297911, + -4498978, 1260573, -4367982, -410169, -8111046, -953483, -6247030, -13166222, 28898688, 2639258, + 6730214, -11562052, 7554848, -472446, 3798899, -9223442, -517544, -1249836, -8040179, -4657892, + -3732327, 9738838, 6766721, 7687992, 4473209, 6032282, -1460289, 395137, -6968585, -942745, + -450972, -221191, 8806830, 2742337, 5117454, 5778879, -4146791, -9324374, 4020090, -3382287, + -1827509, 4264903, 11327976, -1075889, 45479408, 16823386, 36633924, 5871221, 2420214, -14590004, + 5602785, 22065394, 8231305, 1707250, 14727443, -13086765, -5916318, 12120398, -9148280, 4307852, + 21105470, 6923488, 2888366, 6867653, -3828963, 9326521, -6955700, 390842, 3612068, 1385127, + -5351530, -5645735, 2323577, 21897890, -6983617, 5551245, -19978040, -10537702, 9227737, 23072564, + -17529910, 324270, 11108933, 2965675, 4279935, -14366666, -5001490, -12386686, -21917218, -5613523, + -12141873, -12723841, 10544145, 4383014, 3715147, -7346542, -4518306, -1290638, -21028160, -1767379, + 11976516, -8160438, 9637907, 19756850, 3103114, 13161927, 8667244, 962073, -3760244, 11458973, + -14040248, -429497, -697932, 9171903, 4477504, 8473970, 478889, 9375914, -403727, 2145336, + 1565516, 9972914, 246961, 362925, 8890582, -4430259, 5613523, 2192581, 1660005, -2540473, + 55624120, -12431783, -16709570, 2435247, 13015898, 10069551, 10883447, -3365107, 11716671, 3309272, + -13290776, -27457726, 18494130, 4614943, 13460428, 7591355, -6942815, 2931315, -10114648, -18047452, + 18762564, -11821897, -21818434, 2093797, -3328600, 2476049, -1900523, -2486786, -5317170, -9012989, + 6816113, 14669461, -21257940, 20841328, -17937930, -24043226, 2617783, 6148246, -13131863, 10353019, + -1597728, 6487548, -11263552, -5959267, 19986630, 7838316, 20235738, 5091684, 1821066, 6143951, + 253403, 558346, 10750303, -1093069, 2156074, -9494025, -6034429, -5692979, 7666517, -7417409, + -5866926, 11697343, -30065, 13121125, 2347200, -9871982, 16228534, 12212740, -693637, 7907035, + -7827578, -13559212, 5478231, -5070209, -9322227, 670015, 8826158, 11392401, -4030827, 3446711, + 5927055, -925565, 2729452, -11731703, 4773856, 3856881, -5448166, 46471548, 56390772, -8557722, + 244813, -28321014, -3317862, -20637318, -15614354, -4849018, -10707353, 16101832, -90194, 12515535, + -26626650, 22157736, -16804060, 22625888, 706522, 17989470, -6554120, 22645216, 7318625, -10617159, + 4662187, -15902116, 10535555, -8811125, 25284472, 7675107, 16589311, -27635968, -15979426, -6693707, + -14147622, -5772436, -9706626, 1017907, 34213708, -15734613, 17162690, 29186450, 4039417, 12902082, + 92342, -6395207, -13647259, -10228465, 1367947, -7346542, 17471926, -11246372, 7971460, 21356724, + -2869038, -1627793, -1773822, 17491254, 18698140, 6008659, -8785356, -7509751, -4670777, 7468948, + -17263622, 3360812, -3150359, -4602058, 178241, 11484743, 949188, 16209207, 14654428, 3051574, + 3470334, -6856916, -410169, 16662326, -2192581, 1118839, 6874095, -8682276, 111669, -9957882, + -11050951, 1739462, 1533303, -2059437, -43862352, -39612484, 17740362, -5392332, 21908628, -12524125, + -10037339, -14918569, -11937862, -5753109, -34561600, -12887049, 13563507, 18539226, 7902740, -24350318, + -6682969, -11755325, 10468983, 34896608, 19816980, 8435316, 1582696, 2534031, 2035815, 6038724, + 18333068, 1359357, 4988605, -10415296, 1080184, -14879914, 6019397, 7127498, 13342316, 1610613, + -8701604, -4578435, 17521320, -8108899, 6781754, 3463891, 6530498, 21992380, -12000139, -18706730, + 7286412, 15665893, 4440996, 15659451, 19142670, 9053791, 13363791, 4999342, 3109556, 10322954, + 31726924, -17532056, 285615, 5130339, 3096672, -13602161, -2093797, 10428181, 135291, -12197707, + 5158256, 22789096, -18242874, 6027987, -17257178, 10146860, 7226283, 2791729, 1007170, -8308614, + -7934952, 16035260, 9000104, 3264175, -4567698, 11237782, -1271310, 32212, -7475391, 8284992, + 3425237, -88409752, -31151398, -1773822, -9062381, -21642340, 13131863, 18041010, 29858612, 10097468, + 18689550, -17349520, -37276020, 17467632, -8978629, 1136019, -20175608, 19836306, -12013024, -725850, + 18015240, -50343460, 4642860, 26493506, -49289044, -12768938, -17617956, 2572686, 1586990, 12199855, + -13883482, 16103980, 2022930, -25527138, -13501230, 3236258, -3547643, -12549894, 10965052, 30096984, + 6137509, 8461086, -5055177, -7258495, 17190606, 3369402, -9025874, -42777876, -7106024, 5600638, + -22048214, 10522670, 8529805, 1919850, -17104708, -14882062, -18221398, 38738456, 9957882, -5708012, + 7187628, -32613834, 3569118, -15178414, -17918604, 17235704, -3199751, 384400, -11407433, -40853728, + 5239860, 12625056, 6912750, -2834679, 23965918, 968515, -10468983, -1466731, -16230681, 25295210, + 13391708, 7189776, -4460324, 1866163, 7793218, -7327214, 2864743, 3618510, 1060857, 94128504, + 23607288, 24365350, 20544976, -5903433, 745177, 96812856, 27867896, -7889855, 59017144, -33021856, + 24595130, 5302137, 15017353, 24270860, -7505456, -16722455, 18169860, -3173981, -58437324, 15077483, + 15122580, 12513387, 27788438, 17770428, 18148384, -16292958, 3620658, -15721728, -8291435, 17482664, + 5750961, -33917356, -20349556, -28394028, -42528768, -6326487, 8798241, 20974472, 17965848, 15655156, + 12994424, -6094559, 22293028, 12592844, -27036820, -10144713, 7273527, 20620138, 545461, 4627828, + 35974648, -6197638, -2972117, -9062381, -1799591, 18549964, -15547782, 523986, -22018150, -19383188, + -12491912, 23274428, 31722628, -8905615, 2662880, -5815386, -19516332, -13022341, 5218386, -22447646, + -5920613, -5781026, -14568529, 40587440, 8965744, 13786845, 11890617, -850404, 204011, 7284265, + 2276333, 13000866, 8151848, 562641, -1108102, 96125664, 56098716, 4492536, 35465692, 27844272, + 7406671, 41897404, 11265699, 285615, -13303661, -9133248, -27455578, -72924248, -5854041, 7550553, + -25445534, -13849122, -3227668, 51627656, 16361678, -12869870, 124554, 3974992, -7733089, 22009560, + -4035122, -12887049, -9468255, -12124693, 7700877, -18013092, -45417132, 1436667, -23892904, -36013300, + 6753836, 16125455, 22419730, 13254269, 19801946, -13348758, -39170100, -24891482, -35272420, 14106820, + 32319628, 27348204, 17033840, 33062658, 453119, 20817706, 43946104, -36271000, 6231998, -16146930, + -212601, 13157632, 12837657, 21968758, -2325725, -44424996, -35021164, 7874823, -10172630, -12326556, + -8931384, -9369471, -31080530, 3141769, 20426864, -1797444, 15472620, -9096741, -1196148, -1290638, + 7548405, 30900142, 21105470, 19005230, -17978734, 1466731, -10967199, 1700807, -28585154, 6124624, + 4275640, 3526168, -964220, -2987150, -8512625, 7511898, 23478438, -47983376, 6094559, -36777804, + 16531329, -70044472, -1728724, -23381802, -35867272, 64276332, 36633924, -23229330, -57773752, -14888504, + -20987358, -50861004, 39528732, 1859721, -34855808, -13265006, 20362440, -33386928, -22417582, -17671642, + -39140036, -15337328, -682900, -32042604, -28703266, 40160092, -15000173, -12912819, -3637837, -9337259, + 34475704, -38405596, -17718888, 7735236, -10071698, -360777, -8572755, 19509888, -36054104, 12534862, + -57690000, 5538361, -16460462, -23405424, 60694332, 5950677, -22374632, 11205570, 12708808, -49327700, + 33998960, -8660802, -10518375, -4090956, 19443316, -8486855, 876173, -23843510, 12762495, 15483357, + 27292370, -23987392, -60462404, 41790032, -4849018, 17001628, 20648056, -12957916, 11899207, 30764850, + -39893804, 1685775, -14083198, -4801774, -41422812, 13647259, -6485401, 1185411, -1095217, 4992900, + -7030862, -6753836, 11317239, -10982231, 8169028, 1909113, -7857643, -91905856, -50298364, 10819023, + -31862214, 3317862, -22870700, -12764643, -33814276, -24296630, 17914308, 50667728, 54470924, 7952132, + 38603168, -26882200, 67005784, 48142288, -38281044, -35581656, 11574937, 10333691, 56717192, 19743964, + 36515812, -13597866, 14970109, -7937100, -5467494, -12543452, 53053584, 22853520, 50837380, 45021996, + 9326521, -3347927, -21685290, 21391084, -2091649, -46641196, -30118458, -9403831, -23227184, -5972152, + -23890756, -22101902, 15040975, -7161858, -14931454, 37718404, 45773612, -26710402, -8179765, 61042224, + 25690346, -42829412, -40928892, -15618649, 16108275, -2647847, -7209103, -30678952, 25832080, 7127498, + -9270687, 6350109, 7456063, -37879464, -15893526, 2854006, -13544179, -18747532, -19035296, 49787260, + -39073464, -36127116, 15028091, 25211458, 37368364, -19400368, -5521181, 2879776, -16527034, 16954384, + -2188286, 12560632, -10634339, -5252745, 3882651, 4466766, -5918465, -6247030, -42950, -7483981, + -34930968, -50813760, -44012676, -180389, -34673272, -44165148, 11248519, -3629247, -61976380, 44313324, + 7718056, -3588445, 21848498, 68199784, 64879776, 28194312, -79729624, 29725468, 21000242, -77846280, + -1202591, -37505800, -18395344, 40325448, -47285444, 27543626, -109522, -7971460, -16962974, 8244190, + -4020090, 13655849, -9176198, -41635412, 40475772, 19333796, 48496624, -4926328, -16458315, -23364622, + 19591494, -21045340, 57299160, 12208445, 34389804, -44581760, 35538708, 1507534, 12537010, -28898688, + 9680856, -34346852, -5506148, -35238060, 14394583, 24573656, -47019156, 2020782, -38749196, 18229988, + 22797686, 22374632, -3103114, -66256312, 83752, 17637284, -5765994, 29611652, -63541892, 16393890, + -26459146, 8632884, -22426172, 4728759, 16376710, -7039452, -274878, -6798933, -8291435, 2645700, + -17149804, 21629456, 4814659, -438087, -27318140, -2420214, 2836826, -1846836, 11411728, -11667279, + 2587718, -1138166, -6051609, 95490008, 115833120, 48451528, 40387724, -66780300, 64233384, 93258776, + -102039832, 12210592, 66179004, 11521250, -121708632, -12150462, -66071628, 21328808, 24206436, -30764850, + -12045236, 22194244, -55886116, -4462471, -21897890, -27457726, 10900627, -42384884, 45653356, 32545114, + 59042916, -29250874, 9646497, -6378027, -24088324, 74549896, -1479616, -34316788, -16228534, 16103980, + -16080358, -19529216, -22932978, 37920268, 14061723, 52718576, -3768834, 19323058, 69170448, -43920336, + 9148280, -29828548, 54872504, -21588654, 25645250, 10879152, -2239826, -20828444, -39172248, -26474178, + 10969346, 49604724, -46757160, 41848012, 49456548, 24865714, 57805964, -28308130, -23089744, 37673304, + -6607807, -7043747, -53470196, -3410204, -44132936, 9019431, 55718612, 27341762, 13962939, 25546466, + 15129022, -24017458, -10913512, -41916732, 47259672, 1945620, -18934364, 12474733, 4151086, -22054658, + 11394548, -3199751, 13460428, -2321430, 20484846, 9814000, -44571024, -151485648, -63621352, -108920368, + -58911920, -46544560, 25063282, -69913480, -71567040, -34168612, -95614560, -31035434, 71902048, -2177549, + 2733747, -19449760, -17040282, -9012989, 6416681, -1148904, -64087356, -10144713, -12768938, 92721904, + -12161200, 82441896, 6541235, -22166326, 21294448, 67875512, -3672197, 708670, -27474906, -7975755, + -28829968, 16138340, -12270722, -24388972, 12165495, -32948842, 26628798, 27204322, 5119601, 59435904, + -27064736, 30296700, -25312390, 33436320, 22460532, 62618476, 8415988, -25516400, 33513630, -4290673, + -21131240, 79527760, -6083821, -4797479, 45657648, 14128295, 61523260, -48037060, -47029892, -7142531, + -20456930, -6463926, -75995152, -17248588, 26175678, -10292889, -32785632, -53362820, 3478924, 16312286, + -26819924, -25559350, -46533824, -16533477, 19593640, 20336670, 40980432, -6592775, -3895535, -1464584, + 13606456, 16408923, 2686502, 26027502, 7071664, 2798171, -3586298, -2482491, 18556406, -7965017, + 18341658, 20746840, -968515, 6156836, }, { -11093901, - 5963562, -3131031, 3644280, -2179696, 3064459, -6444599, 283468, -264141, -738734, 1475321, - 3195456, -122407, -311385, -3536906, -1413044, 1507534, 867583, -427349, 1387274, -440234, - 483184, -1602023, -1086627, -1095217, -371515, 139586, -818191, -581968, 1881196, -1110249, - 1144609, -1093069, -186831, -856846, 1050120, 377957, 865436, 1473174, 1859721, 691490, - 502511, -176094, 208306, 279173, -386547, 358630, 3919158, -4483946, -597000, -826781, - -1110249, 721555, -2222646, 751619, -49392, 1009317, 891206, -1769527, -624918, 2688650, - -279173, 571231, -498216, 1166084, 2471754, 2851858, 487479, 1226213, -40802, -2259153, - -66572, 240518, -487479, 4295, 1243393, -1299228, -1739462, 753767, -839666, -781684, - -1219771, -60130, 1284195, 317828, -380105, -470299, -511101, -12885, 285615, -693637, - 253403, -790274, 474594, -11257109, -7954280, -3925600, -2909840, -2278480, -2291365, -826781, - -1687922, -558346, -1054415, -2806761, 554051, 1391569, -214748, 781684, -521839, -1471026, - -1432372, -2207613, -732292, 493921, 75162, -1256278, 835371, -1513976, -1451699, 927713, - 6442, 15032, 777389, 839666, 236223, -371515, -429497, -609885, 300648, 118112, - -762357, 375810, -1522566, -693637, -377957, -195421, -1086627, -257698, -401579, -62277, - -16026670, -2080912, 1172526, 302795, 1103807, 191126, -938450, 644245, -736587, -687195, - -1490354, -1142461, 521839, -384400, 959925, -916976, -40802, -884763, 242666, 1685775, - -481036, 1271310, 10737, -1043677, -279173, 1535451, 682900, 1022202, 1028645, -1464584, - 977105, -558346, -180389, -760209, -450972, 513249, 607738, 423054, -425202, 1251983, - 970663, 682900, -408022, -697932, 53687, -562641, 75162, 18850612, 14944339, 3584150, - 6670084, 1655710, 5151814, 3687230, 1086627, 3712999, 1438814, 2828236, 1174674, -964220, - 2763812, 2016487, -792421, -204011, -5220533, -508954, 240518, 3219078, 337155, 176094, - 1593433, 182536, 1440962, 1400159, 197569, -51540, 498216, 2220498, 1642825, 1453846, - -150324, -496069, 81604, 1065152, -386547, -42950, 1114544, 433792, -560493, 38655, - 238371, -1037235, 1378685, -736587, 33208688, 12000139, 5978595, 3358665, 2239826, 2022930, - 2149631, 3264175, 953483, 5400922, 882616, 388695, 2499671, -1406602, 702227, -691490, - -459562, -1032940, 3682935, 1840394, -148176, 2585570, -1711545, -586263, -504659, 4058744, - -238371, 1387274, 485331, 1934883, 513249, -715112, 1236951, 1294933, -481036, 392990, - 740882, 272730, 1020055, -377957, 1146756, 779537, -2506114, 487479, 491774, 414464, - 2016487, 12841952, -9539122, -3148211, -4496831, -2559801, -2735894, 1881196, -1632088, -3781719, - -1142461, -5076652, -1382980, -2136746, -5158256, -1142461, 955630, -3036542, -1228361, 607738, - -3700114, -42950, 3882651, 1024350, 399432, -1752347, -109522, 1526861, -161061, -1606318, - -2007897, 1971390, -362925, -2310693, 23622, -923418, 2750927, 17180, 1123134, -375810, - 2342905, -1582696, 807454, 438087, 377957, 126702, 433792, 21475, -1045825, 1651415, - 977105, 158914, -34999688, -19593640, -4166118, -4793184, -3517578, -4179003, -6208375, -444529, - 12885, -1670742, 1363652, -1546188, 96637, -73014, -2151779, -2102387, -3631395, -1125281, - 3251290, -3167539, -536871, 3169686, 1801739, -423054, 962073, -392990, -3536906, -1619203, - -2937758, -889058, -53687, -648540, 1415192, -2909840, -2516851, -64425, -3051574, -2188286, - -2216203, -2332167, 2276333, -717260, -3214783, -953483, 624918, 940598, -1224066, -1546188, - -901943, -2879776, -1561221, -21728240, 12620761, 4262755, 2353642, 1769527, 2218351, 605590, - -1943473, 277025, -1015760, -717260, 4176856, 2025077, 3648575, 3064459, 3837553, -3219078, - 1829656, 3442416, 962073, 2961380, -3500398, 427349, -612033, -562641, -1080184, 1084479, - -133144, -236223, 3775276, -3805341, -691490, 1050120, 2336462, -1204738, 2012192, -1677185, - -1926293, 2461016, -985695, -397284, -380105, 758062, 40802, 987843, -970663, -794569, - -839666, -612033, -680752, 1773822, 594853, 388695, -856846, -1793149, 513249, 1806034, - 508954, 32006096, 12844100, 2950643, 7071664, 5877663, 919123, 2740189, 6682969, 3335042, - -343597, 1675037, 676457, -803159, 1788854, 6109591, 1211181, 7254200, 3251290, -5585605, - 919123, 423054, 1030792, 5418101, 2768107, 2314987, -616328, -588411, -861141, -654983, - 657130, -914828, 1582696, 749472, 2211908, -249108, -749472, 1097364, 1784559, 1284195, - -347892, -2310693, -1209033, -1176821, 2145336, 1887638, 2441689, 1662152, 261993, 614180, - 2076617, 1984275, 1329292, 481036, 219043, 1346472, 1063004, 841814, 1692217, 35704064, - 10033044, 4604205, 5396627, 1078037, 5209796, -706522, -2211908, 49392, 1221918, 738734, - -319975, 1187559, 5323612, -637803, -3575560, -2229088, 2503966, 848256, 2946348, 5072357, - 4151086, -120259, 2720862, -2942053, 204011, -2246268, 3161096, 2063732, -3852586, 2342905, - -1898376, 435939, -1554778, 2372970, -1498944, 2933463, 2080912, 1956358, 3446711, 1340030, - -184684, -697932, -98784, 657130, 3837553, 68719, 2147, 455267, 1812476, 1447404, - 53687, -313533, -663572, -1906966, -444529, -1421634, -618475, 5089536, -15307263, -5961415, - -2637110, -3279208, -1758789, -1120987, 47245, 2349347, -2396592, -3908420, 3633542, -4733054, - -4872641, -678605, -1275605, 2317135, -1520418, 77309, -4718022, -2523293, -5654325, -5821828, - -6869800, -747324, 1359357, -4488241, -1451699, 843961, 302795, 380105, -798864, -4447439, - -3075197, 2186138, 575526, -901943, 4176856, -2755222, -1520418, 1267015, 2480344, 2366527, - -584116, -489626, 850404, 822486, -3042984, 433792, -1872606, -581968, 12885, -974958, - -49392, 2108829, 221191, -225486, 279173, -1967095, 1099512, 1928440, -581968, 90194, - 45097, -176094, -38732016, -12079596, -7389491, -2942053, -5340792, -4110284, -1322850, -2909840, - -1335735, -3912715, -5486821, -3777424, -1408749, -7909183, -2003602, -3169686, -4937065, -515396, - 743029, 2684355, -2927020, -3912715, -1567663, 3358665, 4116726, 5242008, 2677912, -64425, - -2639258, -1082332, -60130, -3068754, 1226213, 2211908, 2604898, -1756642, -1653562, -1387274, - -807454, -545461, -1187559, 2158221, -691490, 1425929, -2750927, -4550518, -2025077, -105227, - 2237678, -3929895, 1245541, -1848983, 1801739, -1883343, 1043677, -1563368, -167504, -992137, - -191126, 749472, 1395864, -934155, -1421634, 23622, -1417339, -22207128, 5927055, 1627793, - 34360, 3871913, -3719442, 977105, -8572755, -2813204, 2989297, 2089502, 5538361, -431644, - 6038724, -3547643, -889058, 2860448, -5254893, -1958505, -3094524, 5854041, -380105, -4911295, - 2445984, 4655745, -4183298, -3219078, -3770981, 1047972, -893353, 1984275, -1458141, -1234803, - -1030792, -2323577, 3298535, -2720862, 618475, 2130304, -302795, 2467459, -1490354, 5454609, - 792421, -605590, -1964948, -1967095, 42950, -2257005, -2731599, -1724429, 384400, 1825361, - -309238, 461709, -2394444, -2407329, -3395172, -1389422, -1120987, -936303, 895501, 1314260, - -1408749, 156766, 19142670, 27608050, 9442486, 9635759, 13000866, 9524090, -1378685, 1986422, - -1071594, 1881196, 1559073, 2531883, 1730872, 4844723, 1767379, 3096672, 889058, 9444633, - 2149631, 4722317, 2675765, 2568391, 7303592, 1919850, 9161165, 4932770, -1870458, 6672232, - 1692217, 3395172, 6470368, 1531156, 3854733, -1748052, -665720, 2050847, 2918430, -3721589, - 3390877, -2048699, -4286378, -2289218, 3573413, 5587753, 4063039, -521839, 1327145, 1494649, - 2018635, 3073049, 1636383, 3444564, 1947768, -2763812, -62277, 2503966, 3098819, 1198296, - 1024350, 822486, -3023657, -959925, -1859721, 2031520, -124554, 66486092, 4694400, -3055869, - 5025112, -3287798, 7191923, 2568391, 7567733, -3569118, 453119, 350040, 4436701, -8033737, - 1350767, 5686537, -1415192, -912681, 6631430, 11184095, -4797479, -2194728, 1052267, 5699422, - -2662880, 3822521, -90194, -3165391, -3182571, -2454574, 2040110, 3644280, 3547643, -2396592, - 3944928, -2364380, 3826816, 4028679, -1187559, -2080912, 1157494, -3558381, -5781026, 1606318, - -4026532, 1934883, 156766, 989990, 2132451, 352187, 2641405, 590558, -3985730, 1900523, - -1200443, 2196876, -2965675, -139586, 219043, 2312840, -1709397, -4350802, -1011465, -1655710, - 227633, -1232656, -22546430, -21938692, -4945655, 1668595, -959925, -3341485, -3564823, -4937065, - -1305670, 3579855, -1185411, -1284195, -5053029, 5263483, -324270, -4425964, -3788161, 9152575, - -8362302, 801011, 6081674, -785979, 981400, -8115341, 2540473, -3521873, 1894081, -5669357, - -3691525, 841814, 1451699, -2692945, -2967823, 197569, -1239098, 317828, -3466039, -2022930, - 3541201, -478889, -1722282, -1103807, 4511863, 1921998, -2639258, -4054449, -3560528, 1090922, - -586263, -1767379, 337155, 652835, -1982127, 5308580, 2886218, -665720, -468151, -1509681, - 601295, -1683627, -1623498, -1735167, -367220, -3165391, -2478196, -4215511, 899796, -4505421, - -214748, -1219771, -1125281, -347892, -9021579, -7380902, -9281424, -6328635, -4962835, -2967823, - 502511, 118112, -2506114, -702227, 1956358, 8078834, -7075959, 3657165, -2514703, -4114579, - 5330055, -259846, 884763, 7505456, 858993, 3285650, -4786741, -865436, -13522705, -1299228, - 2310693, 1868311, 942745, 1571958, 1666447, -2729452, -4194036, 3270618, -554051, 3103114, - 1247688, -3287798, 2697240, -66572, -9640054, -7546258, -1503239, -7129646, 758062, 2521146, - -700080, -1666447, -1041530, 551903, -2364380, -461709, -622770, -1060857, 2089502, 826781, - 560493, -1108102, -1148904, 3837553, 755914, -2143189, 2319282, -375810, -1879048, -3624953, - -92342, -1885491, -839666, 2894808, 1977833, 3064459, -43089260, -9805410, 622770, -8551280, - 3444564, 871878, 10320806, -4821101, 601295, -2826089, 6912750, -14111115, -13567802, 5727339, - -6582038, 10206990, 3676492, -8175470, -14366666, -313533, -4075924, -6951405, -2869038, 1653562, - 2310693, -3350075, 12277164, 674310, -1234803, -5123896, 4172561, 4670777, 5001490, 5405217, - -680752, -3176128, -1219771, 3201898, -261993, 3861176, -3631395, -1408749, -1256278, 4471061, - 3566970, -3889093, 5053029, -2808909, -3539053, 448824, -1614908, -3339337, 3446711, -3955665, - -536871, 1024350, -970663, -1604170, 897648, 3337190, -2070174, 3201898, -2643552, 2153926, - -1471026, -1634235, -1039382, 657130, 4108136, 760209, 3848291, -2435247, 39498668, 34720516, - 7256347, 9290014, -1848983, 11358041, 9092446, 11441793, -466004, 4610648, 2761664, -10694469, - -9070971, 5016522, 983548, -7645042, -8104604, -4494684, 534723, 4647155, 1363652, 10892037, - 9923522, 4391604, -2272038, -2351495, 6577743, 6197638, 506806, 5441724, -1717987, 6942815, - 408022, -1410897, 9586367, 5053029, 7868380, 5145371, 1752347, 5585605, 2796024, 1999307, - 5123896, -2699387, 1052267, 6863358, -36507, -4258460, 4054449, 4093104, 2894808, -2957085, - -38655, 4052302, 5978595, -2860448, 7221988, 8319352, -1382980, -4325032, 807454, 2005750, - 1320703, 3721589, 32212, 1413044, 2830384, -1868311, 253403, -2707977, -667867, -3695819, - -2136746, -337155, 47991964, 3839701, -1286343, 3317862, 2385854, -7922067, 2128156, 2074469, - 79457, 5044439, 7400229, 10896332, -4812511, -5014375, -7666517, -6322192, 7146826, -609885, - 10286447, -2510409, -2400887, 4157528, 8948564, 3474629, -8834748, 7002944, -2525441, 5592048, - -2864743, 4329327, -5289252, 3244848, -352187, 5091684, 704375, 2881923, 1657857, -9088151, - -4889821, -891206, -1748052, -897648, -2738042, 4310000, 1737314, 9266392, -1361505, -6425271, - -3635690, -689342, 637803, -7140383, 2471754, -2461016, -236223, -736587, -4063039, 3723737, - 7290707, -2319282, 3790309, 811749, -3970697, -433792, -3775276, -3259880, 723702, -5697274, - -3936338, 2308545, -212601, 1215476, 3951370, -5396627, 6451041, 682900, -2641405, -6412386, - 1857573, -2342905, 13821205, -3285650, -13230647, -8914205, -11929272, 11035918, -8817568, 2461016, - 13443248, -575526, -13675176, 955630, -14353781, 11965779, -4172561, 11927124, 68719, -4514011, - 10234907, 401579, 2123861, -7685844, -9736691, -1546188, 3425237, 2113124, -1900523, -4471061, - 4531191, -1367947, 3386582, 5224828, 6326487, 2944200, 3502546, -12807592, 1075889, -2890513, - -4378719, 1775969, 6365142, -5338645, -9844065, -4331475, 2894808, 1140314, -8647917, -3511136, - 4045859, 5922760, -5194763, -3369402, -3994320, 6060199, 8031589, 1638530, -2690797, 927713, - 5757404, -2738042, -216896, -3760244, 4041564, -4709432, -543313, 5624260, 3367254, -1617055, - -841814, -122407, -1795296, -48320528, -49012020, -7913477, -24043226, -14877767, -8555575, -13303661, - -1655710, 10073846, -21996676, 8040179, -4533338, 7335804, 1226213, 4501126, -9148280, 2325725, - -1185411, -4739497, -20186346, -4095251, -10520522, -12799003, -1385127, 3242700, 631360, -4350802, - 2738042, -4129611, -1277753, 10700911, -281320, -3560528, 609885, 7000797, 9347996, 6305012, - -53687, 5033702, 5757404, -569083, -6442, -10462540, 3781719, -8647917, 1554778, 8336532, - -5808944, -10473278, 2959233, -5877663, -5684389, 1155346, -154619, -4967130, 2338610, -1183264, - 11212012, 6330782, 3377992, 1389422, 4063039, -418759, 1170379, -4456029, -8078834, -1329292, - 609885, -5723044, -4045859, -3146064, -2757369, -3246995, 1702955, -1672890, -575526, -3601330, - -28771986, 53437984, 41873784, 2660732, 8493298, 3438121, 9264244, 14229227, 3214783, 13825500, - 2454574, -14441828, 9622874, 11671574, 3420942, 3536906, 8662949, 11506217, -11469710, 9612137, - -6062347, 8454643, 1234803, -6867653, 1322850, 9558450, 5355824, -11169062, 5430986, -4507568, - 16335908, -1262720, 3796751, -2403034, -10584947, 10767483, 10550587, 5177583, 2667175, -339302, - 3777424, 11428908, 2594160, 8216273, 981400, 5759551, 3027952, -594853, 6079526, -7232725, - -11523397, -4891968, -8796093, -7262790, -3835406, -7460358, 10239202, 7473243, 863288, -1657857, - -3689377, -1024350, -294205, 264141, 481036, 1619203, 2123861, 1378685, -236223, -2514703, - -2327872, -186831, -234076, -783832, 1140314, -985695, 6178311, -1187559, 8121783, 71766760, - -28237262, -14948634, 2372970, 81604, -3762391, -19619410, -8703751, 5319317, -1181116, -2594160, - -4101694, 3311420, -16544214, -4408784, 8276402, 16168404, 8467528, 7398081, -5304285, -4569845, - -9612137, 11237782, -15685221, -2437394, 3631395, -9934259, 3141769, 4653597, 12262132, -18788334, - -1806034, -68719, -4142496, 5332202, -17845590, -8937827, 19228568, 13058848, 2465311, -3062312, - 11405286, -3126736, -1700807, 2437394, 8877697, 5504001, -5808944, 1468879, -3474629, 7713762, - -12090333, -5080947, -7400229, -7297150, 14355928, 4271345, 1610613, -6146098, -734439, -1898376, - -2763812, -6455336, 889058, -6105296, -468151, 2482491, 5411659, -9408126, -6908455, -8282845, - -2808909, 4904853, 620623, 6420976, -1017907, -7677254, -1037235, -3309272, 3513283, -70867, - 21335250, 48859548, 8119636, 18595060, 16956530, 16110422, 5493263, 12025908, 7539815, -3582003, - -9846213, -6380174, -2778844, 13786845, -11748883, -13179107, -807454, -663572, -5272073, -10101763, - 29759828, 27803470, 21068962, 970663, -11875585, 2065879, 2085207, -6025839, 6925635, 4318590, - 12068858, 1342177, 4986457, -620623, -8138963, 13518410, 11347304, 8063801, -1840394, -10801843, - 762357, -869731, -2901251, -22013854, 15934329, -10052371, 18360986, 1000727, 9977209, -2134599, - 10992969, 16501264, 3408057, -7520488, -453119, 2997887, -5351530, 2873333, -2014340, -7058779, - -3743064, 2265595, -1604170, 6897718, 2557653, -11768210, 848256, -1647120, -12521977, -3006477, - 2675765, -4842576, 1490354, 10677289, 4505421, -661425, -3605625, -2884071, 332860, 4636417, - -1185411, 5134634, -51430084, -6786049, -32074816, 397284, 5596343, -10840497, -18777598, -21633750, - -20590074, -12128988, -16801912, -4075924, -1187559, -4299263, 5330055, -3311420, 1039382, 13179107, - 5851893, -1273458, 31059056, -6805376, 6176163, -4524748, 2553358, 4541928, 1597728, -1724429, - 4511863, 14592151, 4325032, 5179731, 1571958, 5849746, 12242804, 16978006, 5267778, 20596516, - -5572720, -17723182, 17854180, -5667210, -3837553, -3599183, 10065256, 15734613, 11781095, -292058, - -4153234, -8987219, -23008140, 14139032, 15981573, 11370926, -13771813, 8297877, 2065879, -1374390, - 12923557, 2203318, 8654359, -7258495, 4181151, -9049496, -951335, 7853348, -2370822, 5905580, - -1329292, -3307125, -3315715, -11027329, 1026497, 822486, -178241, 2115272, -2531883, -13608604, - 944893, 704375, -90067608, -40235252, 18169860, -3375844, -3216931, 3330747, -11403138, -9762461, - -3521873, -4335770, -15887084, 11244224, 1075889, 23633058, -13282186, -11160473, -19370302, -10636487, - -19943680, 1735167, 7099581, -29442000, 18915036, 16527034, -2501819, 3393024, 12270722, 1960653, - 10778220, -22282290, -22701050, -12390981, -14942191, -11267847, 36378372, 12030203, -8205535, -12994424, - -18867792, 8989367, 4866198, -8761733, 7133941, 7322919, -13357348, 1350767, 2785286, 10507637, - -12416750, 30204358, -13344463, -10398116, 4533338, -3131031, -330712, -8952859, -3586298, 1045825, - 18951544, -5830418, 27382564, 5980742, 1627793, 3182571, 7189776, -8162586, -3143916, -10767483, - -8957154, -8229158, -206158, 14948634, -9844065, -7002944, -4262755, -5443871, -5340792, -530428, - -3590593, -5016522, -4675072, 14214194, 45466524, 23394686, 14514842, 9878425, -15990163, 1644973, - -12929999, 20250770, -2177549, -2649995, 6895570, 4496831, 4724464, -554051, 7155416, 2632815, - 7556995, -6146098, 19797652, 2735894, -1754494, 59332824, 3274913, -4443144, -15118285, 8912057, - -14055280, 13320841, 31978180, -2403034, 7879118, 7975755, -16368120, -18268644, 618475, 506806, - 14093935, -8967892, 579821, -843961, 10408853, 10776073, 17858474, 6822556, 6249178, 7509751, - 835371, 11877732, 5555540, -21434034, 4715874, -10967199, -27616640, -2231236, 7898445, 317828, - 2426657, -3502546, 650688, -704375, -25770, 3680787, 732292, 12824772, -7434589, -974958, - 2594160, 2862596, 508954, -4636417, 8879845, 15060303, 14693083, 3277060, -2918430, -1254131, - 5342940, -448824, -1653562, -51540, 3042984, 7110319, -1013612, -2381559, -4709432, -2761664, - 67121752, -19907174, -6878390, -18549964, 34026880, 11866995, 3255585, 6322192, -4413079, -8310762, - 12298639, 616328, -11143293, 2538326, -14849849, -12090333, 1262720, -16020228, 2617783, 4610648, - -10984379, -20673826, 2435247, 627065, 14197014, 22011708, 16179142, -10988674, 358630, 13503377, - 26012470, -27135604, 10602127, -5452461, 92342, -12618614, -16580721, 1020055, 15906411, 4078072, - 7423851, 9274982, -517544, 6055904, -987843, 4213363, 10415296, -18234284, -11924977, 27270894, - -1644973, -1275605, -5708012, 10647224, 36406292, 8564165, 5970005, 11222750, -8866960, -11057393, - 577673, -8353712, -19960860, 12824772, 2278480, -10632192, 6225555, 2692945, -5229123, -10030896, - 13664438, -4883378, -15000173, 6917045, 7834021, 10657961, -10267119, 637803, 5373004, -2274185, - -3536906, 16172699, -706522, 2686502, -6723772, -1318555, 425202, 57183196, 53633404, -17257178, - 14437533, 4737349, 11164767, 29227252, -3818226, -14787572, -5540508, 56186764, -31638876, -5647882, - -15792595, -12139725, -25668872, 28280212, -8278550, -37632504, -28516436, -34299608, -13490492, 31054762, - -3837553, 14858439, -5602785, -15298674, 13514115, 4428112, 17164836, -16297253, 15264314, 12661564, - 6182606, 7537668, -27423366, 8291435, -22905060, 19709604, 40660456, 12253542, 12156905, -25486336, - 36412732, 10222022, -3874061, -5188321, -7473243, 11903502, 18189186, 4913443, -4301410, -581968, - 4891968, -8340827, -6350109, -8001524, -6597070, -197569, 13338021, -8452496, 19954418, 7694434, - 12206297, -3639985, -28656022, -18693846, 7290707, 2461016, -8551280, 11203422, -536871, -459562, - 5765994, -3502546, 8396661, -899796, -962073, 4614943, -4939213, -330712, -5338645, -2695092, - -6698002, 4943508, 365072, 1969243, -53068616, -32396938, 8128226, 3693672, 133144, -24053964, - 14368813, 7344394, -13795435, -39051992, 31797790, 7142531, 12034498, 17199196, 10827613, -5645735, - 6075231, -10310069, 26420492, -22348862, -37310380, -1861868, -1604170, -18461916, -40604620, 644245, - -8164733, -22123376, -11626476, -7380902, 9339406, 874026, 15191299, 29388314, -12622909, -25520696, - 7969312, -3601330, 429497, 11613592, -17495550, -16789028, -2072322, 13808320, -18957986, 15126875, - -5400922, 29832842, -4284230, -10312216, -3528316, -577673, 6174016, -35704064, 5098126, -31003222, - 30975304, -642098, 19445464, 10784663, -11826192, -2330020, -15693810, 6893423, -1709397, 5293547, - 5774584, -21633750, -3195456, -20907900, -8903467, 8121783, -6148246, -13166222, 5830418, -1032940, - -20879984, -11123965, 2134599, -152471, -8684424, 8207683, -4767414, -6221260, 4318590, -13408888, - 6414534, -75026640, -33316062, -13350906, -7438884, -3161096, 8615704, -26665304, -17688822, 5967857, - -20811264, 5961415, -23210004, -8375186, -22413286, -28935194, 30543660, 11469710, 5304285, -2628520, - -23684598, -42408508, 21580064, -55351392, 20607254, -32212, -16630113, 2029372, -9994389, 3330747, - 38813620, -19950124, -1187559, -41796476, 33056216, -10353019, 15509127, -15264314, -3974992, -4170413, - -700080, 18234284, 7402376, 38884488, 48586816, -5849746, 1548336, -16627966, 2611340, -6987912, - 8300025, 14377403, 2733747, 33717640, 10636487, -13681618, 6375879, 6335077, 1060857, -3264175, - 1941325, 25439092, -18734648, -40346924, -15360951, -238371, 10191957, 6040872, 20740398, -2823941, - 9360881, -10838350, -15021648, -22840636, -16716013, 672162, -4760971, 9910637, 3730179, -6889128, - -1881196, 18122614, 581968, 9700184, -3655017, 2780991, -3712999, -5179731, -7050189, 94280976, - 42402064, 28943784, 12313671, -10965052, -16960826, -29693256, 16582869, 28074054, 11909944, -13430363, - 33599528, 18592914, 33595236, 2078764, -23897198, -9554155, 50332720, -52473764, -10501195, 34396244, - -20237886, -11665131, 81146968, -10322954, 23377506, 73181944, -11514807, -4992900, -1885491, 8952859, - -3805341, 31643172, 20721070, 26055420, -18285824, -43486544, 17592186, -17248588, 21090436, -8269960, - 7838316, 30739080, 18174154, 1666447, 13872744, 6122476, 13372381, 29721174, 17126182, -3317862, - 29328184, 12038793, 4443144, 6777459, 53775140, 31950262, 375810, 29016800, -12539157, 36717676, - -8860518, 8005819, -10136123, 4297115, 21436182, -11817603, -511101, -2194728, 7664369, 715112, - -13486197, 455267, -11497627, -21268678, 3899830, -28278064, 11315091, 17197050, -6710887, -12154757, - -7739531, 15058155, 4851166, 732292, -5952825, 122228328, 54840288, -24421184, 10385231, 63292784, - 1215476, 45788648, -13636521, 18285824, 37671160, -28293098, 3193308, 66486092, 59201828, 48692044, - 16842714, 41860900, 6745246, 36737004, 12461848, 11325829, -23031762, -26452704, -38296076, -75086768, - 23785528, 1196148, -20708184, -6908455, 25844966, -16827682, -2830384, 3253438, 14431090, -66488240, - -11038066, 48788680, 37095632, -13172665, 24434068, 21378200, 13432510, -7868380, -15749645, -6423124, - -10666551, -6440304, -24893630, -20641612, 16892106, -41293964, 13563507, 34477848, -10335839, -24034636, - -38169376, 35944580, -1316408, -17652316, -11957189, -7876970, -13226352, 7838316, -6210523, -12899934, - 13335873, 55778740, -27895812, -16320876, 6893423, -10428181, 12614319, 854699, 28404766, 5871221, - -2957085, -2044404, -29865056, -13662291, -4784594, 2884071, 2123861, 10980084, 6401649, 1593433, - 4610648, 5881958, 17355962, 1808181, 326418, -11010149, 3738769, -48408576, -13209172, -58136676, - -12356621, -58095876, 28067612, -55357832, 29923038, -9773198, -31668942, -9869835, -14682346, 67242008, - 10735271, -49340584, 1224066, -32285270, -25013890, 33034740, -37209448, -34868692, -38845832, 58656368, - -7614977, 38665444, -59547576, -32087700, 24142012, -28067612, 23048942, 64969972, 43119324, 40149356, - 7249905, -7056632, -31263066, -45092860, -2044404, 9871982, -41289668, 792421, -24174224, 11942157, - 18781892, -47766480, -40091372, -74788264, -11280732, 5057324, -31705448, -46269684, 45932528, 2261300, - 47175920, 45820860, -5207648, -6532646, -18197776, 26426934, 23368918, 3279208, 11783243, -3773129, - -1885491, 22370338, -5435281, -26214332, -19658066, -32996086, -27227946, -10234907, -785979, -4511863, - -41212360, -24161338, 14100378, 3201898, -14319421, 18008798, -3126736, 985695, 28752658, 23379654, - 15560667, 6030134, 18625126, 2765959, 1047972, 8465381, 6517613, -81585048, -14903537, 7960722, - -8312909, 833224, 21562884, -17514876, 19095424, 19469086, -13711683, 26102664, -36000416, 44936096, - 29615946, 2224793, -33217278, 3328600, 20862804, -95451352, 19228568, 39928164, -69591352, 29055454, - -35983236, -49808736, -46774340, 24105504, -12236362, -71083856, 37864432, 21361020, -44197360, -71927816, - 13973676, 9281424, -23600846, -4567698, -38057704, 35809288, 28252294, 51775832, -41598904, 7372312, - -55009940, -19816980, 8630737, -34005404, 13705241, -3590593, -27986006, -40248140, -45017700, 65487512, - -44394928, -19924354, -17171280, 3438121, 29012504, 18367428, 20959440, 949188, 24648818, -7818988, - 3315715, -10048076, -27593018, 6025839, 56751552, 9650792, 575526, 508954, -37793564, 24831354, - 37931004, 41109280, 7312182, 3745212, -2525441, -2484639, 5076652, 1535451, -19192062, 339302, - 2942053, 3455301, -491774, 1125281, 13505525, -4200478, 1050120, -2849711, -21475, 25649544, - -54606216, -29083372, -57662084, 16391743, -10198400, 22870700, -15672336, 10819023, 18951544, -19355270, - -32893008, 49140868, -12839805, -21951578, 57193932, -11789685, -13247827, 65270616, -37705516, 9586367, - 16056735, 5068062, -57505316, 169651, -8323647, -34632468, 19868518, -27210766, 36715528, -6468221, - 40860172, -44637596, 27831388, -79023104, 964220, -43121472, 48202416, -7425999, 6672232, -8293582, - -43750684, -3193308, 38306812, 100824360, 7546258, 6335077, 21530672, 34458524, -5740224, -9715216, - 3262028, -1733019, 88789856, -8040179, 13776108, 35605280, -34441344, -59075128, 307090, -62431644, - -7541963, -32053340, -22866406, -12526272, -26231512, 14832670, 22104050, -36361192, 46027016, 38132868, - -5321465, -9442486, -37366216, 26195006, 9431748, 24848534, -20884278, 10277857, -3949223, 18796924, - 2304250, 18187040, -9105331, 13340168, -2108829, 335007, 4582730, 20630876, 10028749, 6326487, - -6637872, 536871, 2042257, 95163592, 103386304, 874026, -31928786, -25396142, 86558624, -56910464, - -65165392, 67703720, -61570504, 39586712, 11834782, 54784456, 50242528, 34129956, 5278515, -34419868, - -29974576, 71066680, -30361124, -3008625, 17115444, 60544008, 87359632, -2632815, 59609852, -48958332, - -51380692, 5808944, -19123342, 28286654, 17688822, -43662636, 5729487, 27797028, 71792528, 24590836, - 29283088, 27109834, 31978180, 8323647, -2772402, 45732812, 7799661, 36578088, 58295592, 12242804, - -24326694, -20422570, 52518860, 13851270, 107994808, 25293062, 42410656, -44130788, -69677256, -6659347, - -81314472, -51924008, -18743238, -27704686, 2783139, -4114579, 384400, 1129576, -60881160, -50182396, - -26776974, -51820928, 18676666, 20605106, -15955804, -4009352, -48374216, -7546258, 13913547, -13696651, - -4402342, 4924180, -30636002, 12698071, -9605694, 3635690, 5111011, 184684, 1801739, 6597070, - -7529078, 1140314, 6788196, -272730, 1408749, 2057289, -45202384, -158937408, -65622804, -129708016, - -29115584, -45341968, -18339510, 11834782, -42548092, -51500952, -82390360, -65483220, 58538256, -10402411, - -52417928, -55679956, 12607876, -74098920, -104576008, 17280800, -24346022, -22391812, -22477712, 20139102, - -62328564, 65622804, -38137164, 44581760, -31024696, -29759828, 725850, 36017596, -50820200, -48513804, - 26064010, -9148280, 71798968, -31419834, 41156524, 61924840, 29433410, -22499186, -10271414, -6418829, - 50785840, -17763984, 34106336, 68560560, -57535380, -100364792, -39517996, 34119220, 41811508, -47324096, - 77990160, -25037512, -28151364, -9356586, -8504035, -24079734, -63088776, -26620208, -65184720, -62395136, - -38656852, 46166604, 10928544, -11016591, 4269198, 71350144, 67010080, 4814659, -30906584, 12852690, - -6942815, 29435558, 9285719, -12695923, -29416232, -2555506, -5823976, -46737836, -12025908, 17931488, - 48717816, -21644488, 163209, 18657338, -27193586, -747324, -1769527, 938450, -14100378, 18339510, - 1221918, 4868346, -2121714, 2881923, }, + 5963562, -3131031, 3644280, -2179696, 3064459, -6444599, 283468, -264141, -738734, 1475321, + 3195456, -122407, -311385, -3536906, -1413044, 1507534, 867583, -427349, 1387274, -440234, + 483184, -1602023, -1086627, -1095217, -371515, 139586, -818191, -581968, 1881196, -1110249, + 1144609, -1093069, -186831, -856846, 1050120, 377957, 865436, 1473174, 1859721, 691490, + 502511, -176094, 208306, 279173, -386547, 358630, 3919158, -4483946, -597000, -826781, + -1110249, 721555, -2222646, 751619, -49392, 1009317, 891206, -1769527, -624918, 2688650, + -279173, 571231, -498216, 1166084, 2471754, 2851858, 487479, 1226213, -40802, -2259153, + -66572, 240518, -487479, 4295, 1243393, -1299228, -1739462, 753767, -839666, -781684, + -1219771, -60130, 1284195, 317828, -380105, -470299, -511101, -12885, 285615, -693637, + 253403, -790274, 474594, -11257109, -7954280, -3925600, -2909840, -2278480, -2291365, -826781, + -1687922, -558346, -1054415, -2806761, 554051, 1391569, -214748, 781684, -521839, -1471026, + -1432372, -2207613, -732292, 493921, 75162, -1256278, 835371, -1513976, -1451699, 927713, + 6442, 15032, 777389, 839666, 236223, -371515, -429497, -609885, 300648, 118112, + -762357, 375810, -1522566, -693637, -377957, -195421, -1086627, -257698, -401579, -62277, + -16026670, -2080912, 1172526, 302795, 1103807, 191126, -938450, 644245, -736587, -687195, + -1490354, -1142461, 521839, -384400, 959925, -916976, -40802, -884763, 242666, 1685775, + -481036, 1271310, 10737, -1043677, -279173, 1535451, 682900, 1022202, 1028645, -1464584, + 977105, -558346, -180389, -760209, -450972, 513249, 607738, 423054, -425202, 1251983, + 970663, 682900, -408022, -697932, 53687, -562641, 75162, 18850612, 14944339, 3584150, + 6670084, 1655710, 5151814, 3687230, 1086627, 3712999, 1438814, 2828236, 1174674, -964220, + 2763812, 2016487, -792421, -204011, -5220533, -508954, 240518, 3219078, 337155, 176094, + 1593433, 182536, 1440962, 1400159, 197569, -51540, 498216, 2220498, 1642825, 1453846, + -150324, -496069, 81604, 1065152, -386547, -42950, 1114544, 433792, -560493, 38655, + 238371, -1037235, 1378685, -736587, 33208688, 12000139, 5978595, 3358665, 2239826, 2022930, + 2149631, 3264175, 953483, 5400922, 882616, 388695, 2499671, -1406602, 702227, -691490, + -459562, -1032940, 3682935, 1840394, -148176, 2585570, -1711545, -586263, -504659, 4058744, + -238371, 1387274, 485331, 1934883, 513249, -715112, 1236951, 1294933, -481036, 392990, + 740882, 272730, 1020055, -377957, 1146756, 779537, -2506114, 487479, 491774, 414464, + 2016487, 12841952, -9539122, -3148211, -4496831, -2559801, -2735894, 1881196, -1632088, -3781719, + -1142461, -5076652, -1382980, -2136746, -5158256, -1142461, 955630, -3036542, -1228361, 607738, + -3700114, -42950, 3882651, 1024350, 399432, -1752347, -109522, 1526861, -161061, -1606318, + -2007897, 1971390, -362925, -2310693, 23622, -923418, 2750927, 17180, 1123134, -375810, + 2342905, -1582696, 807454, 438087, 377957, 126702, 433792, 21475, -1045825, 1651415, + 977105, 158914, -34999688, -19593640, -4166118, -4793184, -3517578, -4179003, -6208375, -444529, + 12885, -1670742, 1363652, -1546188, 96637, -73014, -2151779, -2102387, -3631395, -1125281, + 3251290, -3167539, -536871, 3169686, 1801739, -423054, 962073, -392990, -3536906, -1619203, + -2937758, -889058, -53687, -648540, 1415192, -2909840, -2516851, -64425, -3051574, -2188286, + -2216203, -2332167, 2276333, -717260, -3214783, -953483, 624918, 940598, -1224066, -1546188, + -901943, -2879776, -1561221, -21728240, 12620761, 4262755, 2353642, 1769527, 2218351, 605590, + -1943473, 277025, -1015760, -717260, 4176856, 2025077, 3648575, 3064459, 3837553, -3219078, + 1829656, 3442416, 962073, 2961380, -3500398, 427349, -612033, -562641, -1080184, 1084479, + -133144, -236223, 3775276, -3805341, -691490, 1050120, 2336462, -1204738, 2012192, -1677185, + -1926293, 2461016, -985695, -397284, -380105, 758062, 40802, 987843, -970663, -794569, + -839666, -612033, -680752, 1773822, 594853, 388695, -856846, -1793149, 513249, 1806034, + 508954, 32006096, 12844100, 2950643, 7071664, 5877663, 919123, 2740189, 6682969, 3335042, + -343597, 1675037, 676457, -803159, 1788854, 6109591, 1211181, 7254200, 3251290, -5585605, + 919123, 423054, 1030792, 5418101, 2768107, 2314987, -616328, -588411, -861141, -654983, + 657130, -914828, 1582696, 749472, 2211908, -249108, -749472, 1097364, 1784559, 1284195, + -347892, -2310693, -1209033, -1176821, 2145336, 1887638, 2441689, 1662152, 261993, 614180, + 2076617, 1984275, 1329292, 481036, 219043, 1346472, 1063004, 841814, 1692217, 35704064, + 10033044, 4604205, 5396627, 1078037, 5209796, -706522, -2211908, 49392, 1221918, 738734, + -319975, 1187559, 5323612, -637803, -3575560, -2229088, 2503966, 848256, 2946348, 5072357, + 4151086, -120259, 2720862, -2942053, 204011, -2246268, 3161096, 2063732, -3852586, 2342905, + -1898376, 435939, -1554778, 2372970, -1498944, 2933463, 2080912, 1956358, 3446711, 1340030, + -184684, -697932, -98784, 657130, 3837553, 68719, 2147, 455267, 1812476, 1447404, + 53687, -313533, -663572, -1906966, -444529, -1421634, -618475, 5089536, -15307263, -5961415, + -2637110, -3279208, -1758789, -1120987, 47245, 2349347, -2396592, -3908420, 3633542, -4733054, + -4872641, -678605, -1275605, 2317135, -1520418, 77309, -4718022, -2523293, -5654325, -5821828, + -6869800, -747324, 1359357, -4488241, -1451699, 843961, 302795, 380105, -798864, -4447439, + -3075197, 2186138, 575526, -901943, 4176856, -2755222, -1520418, 1267015, 2480344, 2366527, + -584116, -489626, 850404, 822486, -3042984, 433792, -1872606, -581968, 12885, -974958, + -49392, 2108829, 221191, -225486, 279173, -1967095, 1099512, 1928440, -581968, 90194, + 45097, -176094, -38732016, -12079596, -7389491, -2942053, -5340792, -4110284, -1322850, -2909840, + -1335735, -3912715, -5486821, -3777424, -1408749, -7909183, -2003602, -3169686, -4937065, -515396, + 743029, 2684355, -2927020, -3912715, -1567663, 3358665, 4116726, 5242008, 2677912, -64425, + -2639258, -1082332, -60130, -3068754, 1226213, 2211908, 2604898, -1756642, -1653562, -1387274, + -807454, -545461, -1187559, 2158221, -691490, 1425929, -2750927, -4550518, -2025077, -105227, + 2237678, -3929895, 1245541, -1848983, 1801739, -1883343, 1043677, -1563368, -167504, -992137, + -191126, 749472, 1395864, -934155, -1421634, 23622, -1417339, -22207128, 5927055, 1627793, + 34360, 3871913, -3719442, 977105, -8572755, -2813204, 2989297, 2089502, 5538361, -431644, + 6038724, -3547643, -889058, 2860448, -5254893, -1958505, -3094524, 5854041, -380105, -4911295, + 2445984, 4655745, -4183298, -3219078, -3770981, 1047972, -893353, 1984275, -1458141, -1234803, + -1030792, -2323577, 3298535, -2720862, 618475, 2130304, -302795, 2467459, -1490354, 5454609, + 792421, -605590, -1964948, -1967095, 42950, -2257005, -2731599, -1724429, 384400, 1825361, + -309238, 461709, -2394444, -2407329, -3395172, -1389422, -1120987, -936303, 895501, 1314260, + -1408749, 156766, 19142670, 27608050, 9442486, 9635759, 13000866, 9524090, -1378685, 1986422, + -1071594, 1881196, 1559073, 2531883, 1730872, 4844723, 1767379, 3096672, 889058, 9444633, + 2149631, 4722317, 2675765, 2568391, 7303592, 1919850, 9161165, 4932770, -1870458, 6672232, + 1692217, 3395172, 6470368, 1531156, 3854733, -1748052, -665720, 2050847, 2918430, -3721589, + 3390877, -2048699, -4286378, -2289218, 3573413, 5587753, 4063039, -521839, 1327145, 1494649, + 2018635, 3073049, 1636383, 3444564, 1947768, -2763812, -62277, 2503966, 3098819, 1198296, + 1024350, 822486, -3023657, -959925, -1859721, 2031520, -124554, 66486092, 4694400, -3055869, + 5025112, -3287798, 7191923, 2568391, 7567733, -3569118, 453119, 350040, 4436701, -8033737, + 1350767, 5686537, -1415192, -912681, 6631430, 11184095, -4797479, -2194728, 1052267, 5699422, + -2662880, 3822521, -90194, -3165391, -3182571, -2454574, 2040110, 3644280, 3547643, -2396592, + 3944928, -2364380, 3826816, 4028679, -1187559, -2080912, 1157494, -3558381, -5781026, 1606318, + -4026532, 1934883, 156766, 989990, 2132451, 352187, 2641405, 590558, -3985730, 1900523, + -1200443, 2196876, -2965675, -139586, 219043, 2312840, -1709397, -4350802, -1011465, -1655710, + 227633, -1232656, -22546430, -21938692, -4945655, 1668595, -959925, -3341485, -3564823, -4937065, + -1305670, 3579855, -1185411, -1284195, -5053029, 5263483, -324270, -4425964, -3788161, 9152575, + -8362302, 801011, 6081674, -785979, 981400, -8115341, 2540473, -3521873, 1894081, -5669357, + -3691525, 841814, 1451699, -2692945, -2967823, 197569, -1239098, 317828, -3466039, -2022930, + 3541201, -478889, -1722282, -1103807, 4511863, 1921998, -2639258, -4054449, -3560528, 1090922, + -586263, -1767379, 337155, 652835, -1982127, 5308580, 2886218, -665720, -468151, -1509681, + 601295, -1683627, -1623498, -1735167, -367220, -3165391, -2478196, -4215511, 899796, -4505421, + -214748, -1219771, -1125281, -347892, -9021579, -7380902, -9281424, -6328635, -4962835, -2967823, + 502511, 118112, -2506114, -702227, 1956358, 8078834, -7075959, 3657165, -2514703, -4114579, + 5330055, -259846, 884763, 7505456, 858993, 3285650, -4786741, -865436, -13522705, -1299228, + 2310693, 1868311, 942745, 1571958, 1666447, -2729452, -4194036, 3270618, -554051, 3103114, + 1247688, -3287798, 2697240, -66572, -9640054, -7546258, -1503239, -7129646, 758062, 2521146, + -700080, -1666447, -1041530, 551903, -2364380, -461709, -622770, -1060857, 2089502, 826781, + 560493, -1108102, -1148904, 3837553, 755914, -2143189, 2319282, -375810, -1879048, -3624953, + -92342, -1885491, -839666, 2894808, 1977833, 3064459, -43089260, -9805410, 622770, -8551280, + 3444564, 871878, 10320806, -4821101, 601295, -2826089, 6912750, -14111115, -13567802, 5727339, + -6582038, 10206990, 3676492, -8175470, -14366666, -313533, -4075924, -6951405, -2869038, 1653562, + 2310693, -3350075, 12277164, 674310, -1234803, -5123896, 4172561, 4670777, 5001490, 5405217, + -680752, -3176128, -1219771, 3201898, -261993, 3861176, -3631395, -1408749, -1256278, 4471061, + 3566970, -3889093, 5053029, -2808909, -3539053, 448824, -1614908, -3339337, 3446711, -3955665, + -536871, 1024350, -970663, -1604170, 897648, 3337190, -2070174, 3201898, -2643552, 2153926, + -1471026, -1634235, -1039382, 657130, 4108136, 760209, 3848291, -2435247, 39498668, 34720516, + 7256347, 9290014, -1848983, 11358041, 9092446, 11441793, -466004, 4610648, 2761664, -10694469, + -9070971, 5016522, 983548, -7645042, -8104604, -4494684, 534723, 4647155, 1363652, 10892037, + 9923522, 4391604, -2272038, -2351495, 6577743, 6197638, 506806, 5441724, -1717987, 6942815, + 408022, -1410897, 9586367, 5053029, 7868380, 5145371, 1752347, 5585605, 2796024, 1999307, + 5123896, -2699387, 1052267, 6863358, -36507, -4258460, 4054449, 4093104, 2894808, -2957085, + -38655, 4052302, 5978595, -2860448, 7221988, 8319352, -1382980, -4325032, 807454, 2005750, + 1320703, 3721589, 32212, 1413044, 2830384, -1868311, 253403, -2707977, -667867, -3695819, + -2136746, -337155, 47991964, 3839701, -1286343, 3317862, 2385854, -7922067, 2128156, 2074469, + 79457, 5044439, 7400229, 10896332, -4812511, -5014375, -7666517, -6322192, 7146826, -609885, + 10286447, -2510409, -2400887, 4157528, 8948564, 3474629, -8834748, 7002944, -2525441, 5592048, + -2864743, 4329327, -5289252, 3244848, -352187, 5091684, 704375, 2881923, 1657857, -9088151, + -4889821, -891206, -1748052, -897648, -2738042, 4310000, 1737314, 9266392, -1361505, -6425271, + -3635690, -689342, 637803, -7140383, 2471754, -2461016, -236223, -736587, -4063039, 3723737, + 7290707, -2319282, 3790309, 811749, -3970697, -433792, -3775276, -3259880, 723702, -5697274, + -3936338, 2308545, -212601, 1215476, 3951370, -5396627, 6451041, 682900, -2641405, -6412386, + 1857573, -2342905, 13821205, -3285650, -13230647, -8914205, -11929272, 11035918, -8817568, 2461016, + 13443248, -575526, -13675176, 955630, -14353781, 11965779, -4172561, 11927124, 68719, -4514011, + 10234907, 401579, 2123861, -7685844, -9736691, -1546188, 3425237, 2113124, -1900523, -4471061, + 4531191, -1367947, 3386582, 5224828, 6326487, 2944200, 3502546, -12807592, 1075889, -2890513, + -4378719, 1775969, 6365142, -5338645, -9844065, -4331475, 2894808, 1140314, -8647917, -3511136, + 4045859, 5922760, -5194763, -3369402, -3994320, 6060199, 8031589, 1638530, -2690797, 927713, + 5757404, -2738042, -216896, -3760244, 4041564, -4709432, -543313, 5624260, 3367254, -1617055, + -841814, -122407, -1795296, -48320528, -49012020, -7913477, -24043226, -14877767, -8555575, -13303661, + -1655710, 10073846, -21996676, 8040179, -4533338, 7335804, 1226213, 4501126, -9148280, 2325725, + -1185411, -4739497, -20186346, -4095251, -10520522, -12799003, -1385127, 3242700, 631360, -4350802, + 2738042, -4129611, -1277753, 10700911, -281320, -3560528, 609885, 7000797, 9347996, 6305012, + -53687, 5033702, 5757404, -569083, -6442, -10462540, 3781719, -8647917, 1554778, 8336532, + -5808944, -10473278, 2959233, -5877663, -5684389, 1155346, -154619, -4967130, 2338610, -1183264, + 11212012, 6330782, 3377992, 1389422, 4063039, -418759, 1170379, -4456029, -8078834, -1329292, + 609885, -5723044, -4045859, -3146064, -2757369, -3246995, 1702955, -1672890, -575526, -3601330, + -28771986, 53437984, 41873784, 2660732, 8493298, 3438121, 9264244, 14229227, 3214783, 13825500, + 2454574, -14441828, 9622874, 11671574, 3420942, 3536906, 8662949, 11506217, -11469710, 9612137, + -6062347, 8454643, 1234803, -6867653, 1322850, 9558450, 5355824, -11169062, 5430986, -4507568, + 16335908, -1262720, 3796751, -2403034, -10584947, 10767483, 10550587, 5177583, 2667175, -339302, + 3777424, 11428908, 2594160, 8216273, 981400, 5759551, 3027952, -594853, 6079526, -7232725, + -11523397, -4891968, -8796093, -7262790, -3835406, -7460358, 10239202, 7473243, 863288, -1657857, + -3689377, -1024350, -294205, 264141, 481036, 1619203, 2123861, 1378685, -236223, -2514703, + -2327872, -186831, -234076, -783832, 1140314, -985695, 6178311, -1187559, 8121783, 71766760, + -28237262, -14948634, 2372970, 81604, -3762391, -19619410, -8703751, 5319317, -1181116, -2594160, + -4101694, 3311420, -16544214, -4408784, 8276402, 16168404, 8467528, 7398081, -5304285, -4569845, + -9612137, 11237782, -15685221, -2437394, 3631395, -9934259, 3141769, 4653597, 12262132, -18788334, + -1806034, -68719, -4142496, 5332202, -17845590, -8937827, 19228568, 13058848, 2465311, -3062312, + 11405286, -3126736, -1700807, 2437394, 8877697, 5504001, -5808944, 1468879, -3474629, 7713762, + -12090333, -5080947, -7400229, -7297150, 14355928, 4271345, 1610613, -6146098, -734439, -1898376, + -2763812, -6455336, 889058, -6105296, -468151, 2482491, 5411659, -9408126, -6908455, -8282845, + -2808909, 4904853, 620623, 6420976, -1017907, -7677254, -1037235, -3309272, 3513283, -70867, + 21335250, 48859548, 8119636, 18595060, 16956530, 16110422, 5493263, 12025908, 7539815, -3582003, + -9846213, -6380174, -2778844, 13786845, -11748883, -13179107, -807454, -663572, -5272073, -10101763, + 29759828, 27803470, 21068962, 970663, -11875585, 2065879, 2085207, -6025839, 6925635, 4318590, + 12068858, 1342177, 4986457, -620623, -8138963, 13518410, 11347304, 8063801, -1840394, -10801843, + 762357, -869731, -2901251, -22013854, 15934329, -10052371, 18360986, 1000727, 9977209, -2134599, + 10992969, 16501264, 3408057, -7520488, -453119, 2997887, -5351530, 2873333, -2014340, -7058779, + -3743064, 2265595, -1604170, 6897718, 2557653, -11768210, 848256, -1647120, -12521977, -3006477, + 2675765, -4842576, 1490354, 10677289, 4505421, -661425, -3605625, -2884071, 332860, 4636417, + -1185411, 5134634, -51430084, -6786049, -32074816, 397284, 5596343, -10840497, -18777598, -21633750, + -20590074, -12128988, -16801912, -4075924, -1187559, -4299263, 5330055, -3311420, 1039382, 13179107, + 5851893, -1273458, 31059056, -6805376, 6176163, -4524748, 2553358, 4541928, 1597728, -1724429, + 4511863, 14592151, 4325032, 5179731, 1571958, 5849746, 12242804, 16978006, 5267778, 20596516, + -5572720, -17723182, 17854180, -5667210, -3837553, -3599183, 10065256, 15734613, 11781095, -292058, + -4153234, -8987219, -23008140, 14139032, 15981573, 11370926, -13771813, 8297877, 2065879, -1374390, + 12923557, 2203318, 8654359, -7258495, 4181151, -9049496, -951335, 7853348, -2370822, 5905580, + -1329292, -3307125, -3315715, -11027329, 1026497, 822486, -178241, 2115272, -2531883, -13608604, + 944893, 704375, -90067608, -40235252, 18169860, -3375844, -3216931, 3330747, -11403138, -9762461, + -3521873, -4335770, -15887084, 11244224, 1075889, 23633058, -13282186, -11160473, -19370302, -10636487, + -19943680, 1735167, 7099581, -29442000, 18915036, 16527034, -2501819, 3393024, 12270722, 1960653, + 10778220, -22282290, -22701050, -12390981, -14942191, -11267847, 36378372, 12030203, -8205535, -12994424, + -18867792, 8989367, 4866198, -8761733, 7133941, 7322919, -13357348, 1350767, 2785286, 10507637, + -12416750, 30204358, -13344463, -10398116, 4533338, -3131031, -330712, -8952859, -3586298, 1045825, + 18951544, -5830418, 27382564, 5980742, 1627793, 3182571, 7189776, -8162586, -3143916, -10767483, + -8957154, -8229158, -206158, 14948634, -9844065, -7002944, -4262755, -5443871, -5340792, -530428, + -3590593, -5016522, -4675072, 14214194, 45466524, 23394686, 14514842, 9878425, -15990163, 1644973, + -12929999, 20250770, -2177549, -2649995, 6895570, 4496831, 4724464, -554051, 7155416, 2632815, + 7556995, -6146098, 19797652, 2735894, -1754494, 59332824, 3274913, -4443144, -15118285, 8912057, + -14055280, 13320841, 31978180, -2403034, 7879118, 7975755, -16368120, -18268644, 618475, 506806, + 14093935, -8967892, 579821, -843961, 10408853, 10776073, 17858474, 6822556, 6249178, 7509751, + 835371, 11877732, 5555540, -21434034, 4715874, -10967199, -27616640, -2231236, 7898445, 317828, + 2426657, -3502546, 650688, -704375, -25770, 3680787, 732292, 12824772, -7434589, -974958, + 2594160, 2862596, 508954, -4636417, 8879845, 15060303, 14693083, 3277060, -2918430, -1254131, + 5342940, -448824, -1653562, -51540, 3042984, 7110319, -1013612, -2381559, -4709432, -2761664, + 67121752, -19907174, -6878390, -18549964, 34026880, 11866995, 3255585, 6322192, -4413079, -8310762, + 12298639, 616328, -11143293, 2538326, -14849849, -12090333, 1262720, -16020228, 2617783, 4610648, + -10984379, -20673826, 2435247, 627065, 14197014, 22011708, 16179142, -10988674, 358630, 13503377, + 26012470, -27135604, 10602127, -5452461, 92342, -12618614, -16580721, 1020055, 15906411, 4078072, + 7423851, 9274982, -517544, 6055904, -987843, 4213363, 10415296, -18234284, -11924977, 27270894, + -1644973, -1275605, -5708012, 10647224, 36406292, 8564165, 5970005, 11222750, -8866960, -11057393, + 577673, -8353712, -19960860, 12824772, 2278480, -10632192, 6225555, 2692945, -5229123, -10030896, + 13664438, -4883378, -15000173, 6917045, 7834021, 10657961, -10267119, 637803, 5373004, -2274185, + -3536906, 16172699, -706522, 2686502, -6723772, -1318555, 425202, 57183196, 53633404, -17257178, + 14437533, 4737349, 11164767, 29227252, -3818226, -14787572, -5540508, 56186764, -31638876, -5647882, + -15792595, -12139725, -25668872, 28280212, -8278550, -37632504, -28516436, -34299608, -13490492, 31054762, + -3837553, 14858439, -5602785, -15298674, 13514115, 4428112, 17164836, -16297253, 15264314, 12661564, + 6182606, 7537668, -27423366, 8291435, -22905060, 19709604, 40660456, 12253542, 12156905, -25486336, + 36412732, 10222022, -3874061, -5188321, -7473243, 11903502, 18189186, 4913443, -4301410, -581968, + 4891968, -8340827, -6350109, -8001524, -6597070, -197569, 13338021, -8452496, 19954418, 7694434, + 12206297, -3639985, -28656022, -18693846, 7290707, 2461016, -8551280, 11203422, -536871, -459562, + 5765994, -3502546, 8396661, -899796, -962073, 4614943, -4939213, -330712, -5338645, -2695092, + -6698002, 4943508, 365072, 1969243, -53068616, -32396938, 8128226, 3693672, 133144, -24053964, + 14368813, 7344394, -13795435, -39051992, 31797790, 7142531, 12034498, 17199196, 10827613, -5645735, + 6075231, -10310069, 26420492, -22348862, -37310380, -1861868, -1604170, -18461916, -40604620, 644245, + -8164733, -22123376, -11626476, -7380902, 9339406, 874026, 15191299, 29388314, -12622909, -25520696, + 7969312, -3601330, 429497, 11613592, -17495550, -16789028, -2072322, 13808320, -18957986, 15126875, + -5400922, 29832842, -4284230, -10312216, -3528316, -577673, 6174016, -35704064, 5098126, -31003222, + 30975304, -642098, 19445464, 10784663, -11826192, -2330020, -15693810, 6893423, -1709397, 5293547, + 5774584, -21633750, -3195456, -20907900, -8903467, 8121783, -6148246, -13166222, 5830418, -1032940, + -20879984, -11123965, 2134599, -152471, -8684424, 8207683, -4767414, -6221260, 4318590, -13408888, + 6414534, -75026640, -33316062, -13350906, -7438884, -3161096, 8615704, -26665304, -17688822, 5967857, + -20811264, 5961415, -23210004, -8375186, -22413286, -28935194, 30543660, 11469710, 5304285, -2628520, + -23684598, -42408508, 21580064, -55351392, 20607254, -32212, -16630113, 2029372, -9994389, 3330747, + 38813620, -19950124, -1187559, -41796476, 33056216, -10353019, 15509127, -15264314, -3974992, -4170413, + -700080, 18234284, 7402376, 38884488, 48586816, -5849746, 1548336, -16627966, 2611340, -6987912, + 8300025, 14377403, 2733747, 33717640, 10636487, -13681618, 6375879, 6335077, 1060857, -3264175, + 1941325, 25439092, -18734648, -40346924, -15360951, -238371, 10191957, 6040872, 20740398, -2823941, + 9360881, -10838350, -15021648, -22840636, -16716013, 672162, -4760971, 9910637, 3730179, -6889128, + -1881196, 18122614, 581968, 9700184, -3655017, 2780991, -3712999, -5179731, -7050189, 94280976, + 42402064, 28943784, 12313671, -10965052, -16960826, -29693256, 16582869, 28074054, 11909944, -13430363, + 33599528, 18592914, 33595236, 2078764, -23897198, -9554155, 50332720, -52473764, -10501195, 34396244, + -20237886, -11665131, 81146968, -10322954, 23377506, 73181944, -11514807, -4992900, -1885491, 8952859, + -3805341, 31643172, 20721070, 26055420, -18285824, -43486544, 17592186, -17248588, 21090436, -8269960, + 7838316, 30739080, 18174154, 1666447, 13872744, 6122476, 13372381, 29721174, 17126182, -3317862, + 29328184, 12038793, 4443144, 6777459, 53775140, 31950262, 375810, 29016800, -12539157, 36717676, + -8860518, 8005819, -10136123, 4297115, 21436182, -11817603, -511101, -2194728, 7664369, 715112, + -13486197, 455267, -11497627, -21268678, 3899830, -28278064, 11315091, 17197050, -6710887, -12154757, + -7739531, 15058155, 4851166, 732292, -5952825, 122228328, 54840288, -24421184, 10385231, 63292784, + 1215476, 45788648, -13636521, 18285824, 37671160, -28293098, 3193308, 66486092, 59201828, 48692044, + 16842714, 41860900, 6745246, 36737004, 12461848, 11325829, -23031762, -26452704, -38296076, -75086768, + 23785528, 1196148, -20708184, -6908455, 25844966, -16827682, -2830384, 3253438, 14431090, -66488240, + -11038066, 48788680, 37095632, -13172665, 24434068, 21378200, 13432510, -7868380, -15749645, -6423124, + -10666551, -6440304, -24893630, -20641612, 16892106, -41293964, 13563507, 34477848, -10335839, -24034636, + -38169376, 35944580, -1316408, -17652316, -11957189, -7876970, -13226352, 7838316, -6210523, -12899934, + 13335873, 55778740, -27895812, -16320876, 6893423, -10428181, 12614319, 854699, 28404766, 5871221, + -2957085, -2044404, -29865056, -13662291, -4784594, 2884071, 2123861, 10980084, 6401649, 1593433, + 4610648, 5881958, 17355962, 1808181, 326418, -11010149, 3738769, -48408576, -13209172, -58136676, + -12356621, -58095876, 28067612, -55357832, 29923038, -9773198, -31668942, -9869835, -14682346, 67242008, + 10735271, -49340584, 1224066, -32285270, -25013890, 33034740, -37209448, -34868692, -38845832, 58656368, + -7614977, 38665444, -59547576, -32087700, 24142012, -28067612, 23048942, 64969972, 43119324, 40149356, + 7249905, -7056632, -31263066, -45092860, -2044404, 9871982, -41289668, 792421, -24174224, 11942157, + 18781892, -47766480, -40091372, -74788264, -11280732, 5057324, -31705448, -46269684, 45932528, 2261300, + 47175920, 45820860, -5207648, -6532646, -18197776, 26426934, 23368918, 3279208, 11783243, -3773129, + -1885491, 22370338, -5435281, -26214332, -19658066, -32996086, -27227946, -10234907, -785979, -4511863, + -41212360, -24161338, 14100378, 3201898, -14319421, 18008798, -3126736, 985695, 28752658, 23379654, + 15560667, 6030134, 18625126, 2765959, 1047972, 8465381, 6517613, -81585048, -14903537, 7960722, + -8312909, 833224, 21562884, -17514876, 19095424, 19469086, -13711683, 26102664, -36000416, 44936096, + 29615946, 2224793, -33217278, 3328600, 20862804, -95451352, 19228568, 39928164, -69591352, 29055454, + -35983236, -49808736, -46774340, 24105504, -12236362, -71083856, 37864432, 21361020, -44197360, -71927816, + 13973676, 9281424, -23600846, -4567698, -38057704, 35809288, 28252294, 51775832, -41598904, 7372312, + -55009940, -19816980, 8630737, -34005404, 13705241, -3590593, -27986006, -40248140, -45017700, 65487512, + -44394928, -19924354, -17171280, 3438121, 29012504, 18367428, 20959440, 949188, 24648818, -7818988, + 3315715, -10048076, -27593018, 6025839, 56751552, 9650792, 575526, 508954, -37793564, 24831354, + 37931004, 41109280, 7312182, 3745212, -2525441, -2484639, 5076652, 1535451, -19192062, 339302, + 2942053, 3455301, -491774, 1125281, 13505525, -4200478, 1050120, -2849711, -21475, 25649544, + -54606216, -29083372, -57662084, 16391743, -10198400, 22870700, -15672336, 10819023, 18951544, -19355270, + -32893008, 49140868, -12839805, -21951578, 57193932, -11789685, -13247827, 65270616, -37705516, 9586367, + 16056735, 5068062, -57505316, 169651, -8323647, -34632468, 19868518, -27210766, 36715528, -6468221, + 40860172, -44637596, 27831388, -79023104, 964220, -43121472, 48202416, -7425999, 6672232, -8293582, + -43750684, -3193308, 38306812, 100824360, 7546258, 6335077, 21530672, 34458524, -5740224, -9715216, + 3262028, -1733019, 88789856, -8040179, 13776108, 35605280, -34441344, -59075128, 307090, -62431644, + -7541963, -32053340, -22866406, -12526272, -26231512, 14832670, 22104050, -36361192, 46027016, 38132868, + -5321465, -9442486, -37366216, 26195006, 9431748, 24848534, -20884278, 10277857, -3949223, 18796924, + 2304250, 18187040, -9105331, 13340168, -2108829, 335007, 4582730, 20630876, 10028749, 6326487, + -6637872, 536871, 2042257, 95163592, 103386304, 874026, -31928786, -25396142, 86558624, -56910464, + -65165392, 67703720, -61570504, 39586712, 11834782, 54784456, 50242528, 34129956, 5278515, -34419868, + -29974576, 71066680, -30361124, -3008625, 17115444, 60544008, 87359632, -2632815, 59609852, -48958332, + -51380692, 5808944, -19123342, 28286654, 17688822, -43662636, 5729487, 27797028, 71792528, 24590836, + 29283088, 27109834, 31978180, 8323647, -2772402, 45732812, 7799661, 36578088, 58295592, 12242804, + -24326694, -20422570, 52518860, 13851270, 107994808, 25293062, 42410656, -44130788, -69677256, -6659347, + -81314472, -51924008, -18743238, -27704686, 2783139, -4114579, 384400, 1129576, -60881160, -50182396, + -26776974, -51820928, 18676666, 20605106, -15955804, -4009352, -48374216, -7546258, 13913547, -13696651, + -4402342, 4924180, -30636002, 12698071, -9605694, 3635690, 5111011, 184684, 1801739, 6597070, + -7529078, 1140314, 6788196, -272730, 1408749, 2057289, -45202384, -158937408, -65622804, -129708016, + -29115584, -45341968, -18339510, 11834782, -42548092, -51500952, -82390360, -65483220, 58538256, -10402411, + -52417928, -55679956, 12607876, -74098920, -104576008, 17280800, -24346022, -22391812, -22477712, 20139102, + -62328564, 65622804, -38137164, 44581760, -31024696, -29759828, 725850, 36017596, -50820200, -48513804, + 26064010, -9148280, 71798968, -31419834, 41156524, 61924840, 29433410, -22499186, -10271414, -6418829, + 50785840, -17763984, 34106336, 68560560, -57535380, -100364792, -39517996, 34119220, 41811508, -47324096, + 77990160, -25037512, -28151364, -9356586, -8504035, -24079734, -63088776, -26620208, -65184720, -62395136, + -38656852, 46166604, 10928544, -11016591, 4269198, 71350144, 67010080, 4814659, -30906584, 12852690, + -6942815, 29435558, 9285719, -12695923, -29416232, -2555506, -5823976, -46737836, -12025908, 17931488, + 48717816, -21644488, 163209, 18657338, -27193586, -747324, -1769527, 938450, -14100378, 18339510, + 1221918, 4868346, -2121714, 2881923, }, }; const Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS][2870] ={ { -118112, - -34360, -64425, -38655, -98784, -17180, -158914, -36507, -513249, 352187, -34360, - 354335, -77309, 156766, 947040, -105227, -1127429, -1114544, -369367, -685047, 90194, - -554051, -1509681, 429497, -380105, -268435, 399432, 128849, -508954, -790274, -1030792, - 139586, -620623, -375810, 216896, -1082332, 966368, 1013612, -581968, -68719, -373662, - -1009317, 90194, -908386, -719407, 700080, -466004, 1050120, 4378719, -1900523, 1943473, - -820339, 695785, -25770, 1017907, -438087, 255551, 435939, 523986, 558346, 966368, - -234076, 115964, 1765232, 1322850, -3468186, 693637, -442382, 178241, -1178969, 783832, - -1486059, 1488206, 1234803, 612033, -188979, -463856, -543313, 1058710, 970663, -429497, - 223338, 1823214, -676457, -32212, -616328, 219043, 283468, -45097, -511101, 858993, - 133144, -257698, 650688, 17585744, -1269163, 2450279, -42950, 777389, 339302, 592706, - 403727, 1683627, -968515, 710817, -343597, 292058, 925565, 1440962, 575526, 279173, - -691490, 1312113, -949188, 500364, -440234, -1382980, 143881, 481036, 49392, -431644, - 122407, -483184, 908386, -1866163, 435939, -431644, 493921, -19327, -2615635, -908386, - 266288, 414464, 302795, -453119, -590558, -511101, 371515, 1013612, -418759, 448824, - 10608569, -12532715, 2508261, -3008625, 1655710, -1947768, 1531156, -2665027, -794569, -1642825, - -294205, -1367947, 126702, 2467459, 3588445, 1505386, 805306, 70867, 1133871, 2568391, - 1870458, -1161789, -1395864, -1868311, -882616, -1075889, 109522, -169651, -154619, 57982, - 556198, -865436, 1118839, -1140314, -1516124, 564788, -10737, 118112, 332860, -1054415, - -1191853, 371515, -719407, -981400, -173946, 143881, 783832, -24303072, 4844723, -1224066, - 616328, 523986, -2035815, -916976, 1932735, -315680, 165356, 2168959, 702227, -828929, - -1511829, 1511829, 130997, -1833951, -2626373, -3801046, 1226213, -1690070, 390842, -547608, - 710817, -388695, 268435, -1973538, -1947768, -1215476, -519691, -1228361, 367220, -594853, - 693637, 2280628, 392990, 397284, 1509681, 416612, 350040, -49392, -296353, -1505386, - -356482, 350040, -277025, -70867, -29053306, 10872710, -2712272, 3491809, -1705102, 2518998, - -1389422, -392990, -2476049, 1906966, -2931315, 1954210, -500364, 2733747, -3710852, 966368, - 3461744, 1022202, -2914135, -1022202, -1752347, -719407, 1108102, 575526, 820339, -446677, - -989990, -1393717, -1367947, -103079, -1569811, -261993, -1458141, -1020055, -4056597, -1120987, - -566936, 238371, 96637, 1425929, 605590, 1404454, -141734, 1632088, 384400, 163209, - 403727, 3627100, 12652974, -3489661, 5613523, -3405909, 1468879, -3674345, 2892661, -264141, - 3152506, -251256, -315680, 3098819, -511101, -429497, 2710124, -1322850, -2486786, -3964255, - 3521873, -285615, 2409477, 281320, 1711545, 828929, -2299955, 979253, 934155, -154619, - 1187559, 1814624, -2287070, 302795, -68719, -193274, -1312113, -590558, -1284195, 350040, - -266288, 992137, 2965675, 115964, 1503239, -266288, 289910, -317828, 455267, 1200443, - -545461, 38201588, -9421011, 3631395, -1823214, 3214783, -1404454, 2467459, -1372242, 848256, - -3717294, 1726577, -3549791, 2718714, -1084479, 803159, -1032940, 3828963, 526134, 964220, - -1836099, 2501819, -223338, -1153199, 2130304, -1649268, -2561948, 66572, -798864, 1224066, - -10737, -382252, -835371, 373662, -83752, 483184, -1763084, 416612, -779537, 2753074, - -513249, 1318555, 249108, 1108102, 2061584, -1415192, 111669, 478889, -702227, 1619203, - -332860, 3219078, -19814832, 7825431, -6113886, 3607773, -3045132, 1047972, -4013647, 2607045, - -1604170, 3642132, -405874, 1589138, -3201898, -1350767, -208306, -1163936, -1086627, 4200478, - -3096672, 534723, 1956358, -3837553, 987843, 1357210, -962073, 1320703, 442382, 760209, - -2443837, -214748, -783832, 1507534, -1217623, 824634, -2884071, -581968, 2110977, 1020055, - 670015, -734439, -433792, -2201171, -2340757, 1273458, 474594, -103079, -343597, -204011, - 208306, 206158, -489626, -478889, 289910, 307090, -803159, -32031866, 10492605, -5671505, - 1455994, -528281, 1791001, -2398739, 2594160, -1058710, -901943, -313533, 1876901, -1009317, - -1498944, 1099512, 3609920, -493921, 152471, -6045167, 521839, 100932, 2950643, -955630, - -453119, -4621385, -1582696, 60130, 88047, 1610613, 2209761, -3491809, -3204046, 2074469, - 521839, -3599183, -2763812, 1357210, 783832, -210453, -105227, -1380832, 1415192, -433792, - 517544, 186831, -1887638, -796716, 1009317, -2914135, -1458141, -581968, 616328, -584116, - 51540, -1455994, -126702, -31976032, 14151917, -7818988, 5939940, -5454609, 2705830, -6208375, - 1432372, -4048007, 6390912, -3234110, 2254858, -395137, 47245, -2929168, -835371, -1211181, - 5785321, -1099512, 2952790, 4687957, 2690797, 693637, -624918, 1125281, -1024350, 2624225, - 2536178, 360777, -1275605, 446677, 485331, -1748052, -785979, 1327145, 1906966, -1438814, - -1408749, -1458141, 96637, -605590, 816044, -1406602, 1005022, -2211908, 652835, -1213328, - -81604, 225486, -878321, -1202591, -1529008, -1434519, -1902671, 238371, -1735167, 11877732, - 12343736, -4559108, 4112431, -5005785, 775242, 1524713, 137439, -1999307, 2306398, 592706, - 4894115, 2555506, 5525476, -839666, 3262028, -880468, 2087354, 2911988, -384400, -4024384, - 3850438, -414464, 1623498, -895501, 2147, 556198, 4707284, 706522, -2544768, -858993, - 627065, -1400159, 3551938, 1520418, -545461, -914828, -1999307, 1586990, -1958505, 2025077, - 2126009, -1556926, 1224066, 1105954, 573378, -150324, 3448859, 2134599, 2527588, -90194, - 315680, 1136019, -723702, -277025, -225486, -736587, -8590, 188979, 324270, -605590, - -1417339, -1483911, 36105644, -12891344, 4477504, -6025839, 4110284, -3968550, 5282810, -1812476, - 246961, -3962107, 7930657, -1140314, 7146826, 446677, 1224066, -4788889, 1709397, 7185481, - -2209761, -6047314, 893353, 257698, 2804614, -4359392, 3573413, -34360, 313533, -377957, - -4209068, -1234803, 702227, -5057324, 839666, 2061584, 1692217, -1419487, -401579, -186831, - 2372970, 717260, -403727, -1035087, 1848983, 1277753, 4591320, 1187559, -682900, 2566243, - 1028645, -261993, 848256, 1947768, 1284195, 270583, 309238, -1488206, 322123, -143881, - 1902671, -195421, 753767, -206158, 676457, 12088185, -17463338, 10462540, -7765301, 3266323, - 1181116, -792421, -659278, 2076617, -4395899, -2796024, -2276333, -1773822, -6010807, 3045132, - -5583458, -225486, -4466766, 1640678, -3362960, -2649995, -1337882, 5078799, 712965, 4941360, - 2596308, 3386582, 4891968, 253403, -620623, -749472, 1378685, 3758097, -313533, -274878, - -2510409, 1906966, -304943, -1501091, 1393717, 1159641, 3925600, 1602023, 1851131, -2780991, - -1292785, -163209, -515396, 1913408, -5617817, 1213328, -1380832, -949188, -1741609, -1973538, - -665720, -1952063, 794569, -1365800, -223338, -2965675, -2909840, -2147, -37061272, -8098161, - 1698660, -7030862, -2905546, 298500, -223338, -5991480, 1713692, -5967857, 171799, 4799626, - -897648, -798864, 2632815, 1726577, 2680060, 156766, 3242700, -1799591, 916976, 3764539, - -259846, -236223, -2471754, 3584150, -2780991, -1524713, 934155, 1451699, 2731599, 8443906, - -2317135, -1372242, -3644280, 208306, -2686502, 642098, -1075889, -3970697, -253403, 5085242, - 1425929, -3423089, -1709397, 1690070, -2083059, -2594160, 478889, -1221918, 292058, 541166, - 3193308, 461709, 1563368, 846109, -2701535, -1374390, 1681480, 1586990, -1093069, 949188, - -221191, -45427868, 37495064, -13106093, 11141145, -8207683, 6274947, -2381559, 3996467, -4355097, - 2682207, 3128884, 4524748, -2944200, 5478231, 2710124, 9320079, -1458141, 785979, -4932770, - 1251983, -1728724, -3081639, -3820374, -4395899, -4050154, 6043019, -272730, 7256347, 1883343, - 1331440, -122407, 925565, -3201898, 515396, -1168231, 1511829, 4299263, 770947, 1417339, - 255551, 448824, -3266323, -1788854, -124554, -249108, 438087, -996432, -3008625, 73014, - 3231963, -1039382, 953483, 940598, -2667175, 1833951, 790274, 1009317, -547608, 304943, - -289910, -833224, 238371, 2903398, 26472030, -4071629, -8540542, -2967823, -1799591, -1372242, - -7524783, -3951370, 2098092, 1290638, 2147484, 2677912, -5057324, 2044404, -992137, 1818919, - 8111046, -8196945, 2834679, 2843268, 2207613, -2110977, -4743792, 3704409, 1103807, 2654290, - 4999342, 15032, 6891275, 607738, 3204046, 279173, 2175401, -1881196, 2607045, 1889786, - 2488934, -947040, 828929, -184684, 3191161, 3944928, -5826123, 7874823, 672162, 2209761, - 350040, 1382980, 1531156, -1644973, 4720169, 2559801, 188979, 4331475, 1844689, -2360085, - -191126, -1574106, -1705102, -1275605, 792421, -319975, 274878, -88047, -4810364, 2497524, - -1900523, 697932, -639950, -264141, -1185411, -667867, 20980916, 1836099, 4275640, -5426691, - -1026497, -13481902, 3225521, -644245, -9161165, 7685844, -4239133, 274878, 5641440, 2538326, - 4236985, -3240553, 1872606, -4249870, 85899, -3635690, 1363652, -5525476, 7926362, 5718749, - 4681515, 5454609, 1217623, -1801739, -3420942, 1544041, 4355097, 12885, 2969970, -2141041, - 607738, 2884071, 2040110, 2596308, 188979, 934155, -322123, -1846836, 1844689, -1277753, - 865436, 760209, -1887638, 2581275, -3489661, 3128884, -1634235, 2214056, 3375844, -4110284, - 416612, 483184, -1677185, -3236258, 2295660, -5252745, -4060892, 2529736, 1067299, 1183264, - 1022202, 3281355, 3152506, -1133871, 444529, 1919850, -755914, -6442, 33094870, -27511414, - 9335111, -6846178, 2424509, 8598525, 6992207, -4610648, 8383776, 4722317, 5065914, -3468186, - 2360085, -1769527, 9953587, 2768107, 2815351, 3854733, 4215511, 2671470, 2881923, -8173323, - 1314260, -14774687, -5138929, -1370095, -8463233, 2128156, 4541928, -3191161, -4589173, -5398774, - -5184026, -2765959, 2980707, 2351495, -7524783, -8705899, -667867, -4440996, 2377265, 1934883, - 831076, -622770, 4121021, -2162516, 210453, -573378, -1844689, -5592048, 4335770, 7359427, - -994285, -921271, 3461744, -5186173, 6298570, 1625645, -3191161, -118112, -2963528, -1247688, - -749472, -2119566, -566936, -1432372, -4340065, 1131724, 1559073, 1466731, 1546188, 498216, - -51217484, 5083094, -4571993, 1879048, 5218386, 3745212, 10445360, -4297115, -365072, 839666, - 12504797, 4340065, -9801115, -6405944, 5514738, 7393786, -1859721, -2800319, -208306, 3408057, - 7642895, 7763154, -115964, -13915694, -4028679, -1443109, -1675037, 8061654, -3712999, 4702989, - 457414, -893353, -7221988, 560493, 5740224, -9242770, -5418101, -2183991, -1623498, -4391604, - -3665755, -8643622, -1602023, -5866926, 47245, 1249836, 6210523, -4258460, -2804614, 517544, - -635655, 951335, -5375152, 2085207, 2022930, 650688, 289910, -4075924, -3693672, -2070174, - -1170379, -341450, -6944962, 1387274, 2005750, -3015067, -6386617, 2523293, -324270, -3219078, - -646393, -1509681, -1080184, 4005057, -30081950, 31924492, -4561256, 2014340, 7520488, 9019431, - -6796786, 4342212, 1715839, 5570573, 3773129, 7864085, 4443144, -5325760, -8851928, 1258425, - 9365176, 18708878, -4524748, -6354404, 4896263, 3038689, -3579855, -9217000, -1881196, -1853278, - -8345122, 7303592, 8693014, 137439, 2016487, -171799, 6833293, -5336497, -16544214, 6975027, - -1992865, 5534066, 2643552, 234076, -4103841, -6356552, 4395899, 5211943, 3796751, -738734, - -347892, 5731634, 3208341, 1767379, -3423089, 4825396, 4020090, -667867, -1260573, -2796024, - 3296388, 107374, -8169028, 6717329, 4009352, -1520418, 1917703, -1015760, 210453, -154619, - 1984275, 528281, 2441689, 3962107, 2108829, -603443, -2407329, -1582696, 5705864, 2272038, - -1080184, -1750199, -287763, 8993662, 369367, -6923488, -14181982, 3431679, -738734, -11701638, - 3955665, -3876208, 547608, -4430259, -3453154, 3689377, 8909910, 1099512, 11802570, 5355824, - -5939940, -7806103, 12914967, -5598490, -412317, 1155346, -12120398, -90194, 6414534, -7033009, - -1864016, 8117488, 515396, 4241280, 126702, 5345087, -901943, -3627100, -485331, 7097434, - 9584220, -3141769, 1947768, 1666447, 6393059, -3805341, -667867, 1245541, -1614908, 4146791, - 1876901, 343597, -2175401, 3317862, 3689377, 191126, 182536, 2759517, 4314295, -5179731, - -17180, 1445257, 2368675, -2652142, 2147484, 1063004, 77309, 1503239, -1636383, 721555, - 1715839, 3577708, 4325032, -3487514, 395137, 67171144, -6414534, 1159641, 4226248, -5978595, - -10363756, -6004365, -2544768, -11791833, -12670154, 1022202, -11216307, -4900558, -3206193, -2723009, - 6966437, 8117488, 2598455, 16939352, 3111704, -8310762, 14594299, -1404454, 10348724, -3238405, - -1035087, -9526237, 412317, 8536248, -242666, -4075924, -1595580, 923418, -2078764, -1735167, - 3322157, -7572028, 3141769, 1204738, -3571265, -7179038, -4861903, 5641440, 5542656, 6618545, - -11020886, 6277095, 1752347, -199716, 547608, 1163936, 1264868, 1503239, -899796, 659278, - 5892695, -1580548, 2342905, 2813204, -2396592, 4926328, 5600638, 1000727, -455267, 5207648, - 3702262, 2907693, 3498251, -4243428, -1960653, 1071594, -440234, -564788, 322123, 2372970, - 652835, -4110284, -39462160, -66170412, 23903640, -1717987, 9919227, -11613592, 504659, -13447543, - -1782411, -19372450, 8310762, 8877697, -476741, -1546188, -287763, 1758789, -4672925, -16522739, - 30298846, 2063732, -3938485, 10363756, 1799591, -5527623, 14519137, 16149077, -7009387, 9509058, - 1801739, -2106682, -15238544, -8358007, 11809013, -6148246, 1617055, -863288, 8007967, -12427488, - -13984414, 1926293, 141734, -9457518, 5617817, 1110249, -5939940, 4110284, -6536940, -5439576, - 2499671, 2422362, 272730, -1782411, -3122441, 3809636, 6414534, 897648, 1964948, -1913408, - -1941325, 5617817, 599148, 1219771, -5858336, -1382980, -3940633, 3135326, 4653597, -8590, - 3813931, -107374, 5108864, -4254165, 2518998, -111669, -341450, -4022237, -137439, -3455301, - -547608, -21272974, 63909112, -28394028, 4782446, 4179003, 16026670, -2037962, 10234907, -10114648, - 627065, -19391778, -3706557, 92342, 7816841, 1292785, 8050916, -5561983, -11768210, 1518271, - -17703856, -18668076, 551903, -6137509, -330712, 1591285, 2688650, -4632122, -3079492, -6667937, - -10086731, 4063039, 4915590, -13161927, -5935645, -16542067, 283468, -7310035, 5967857, 6951405, - -13602161, 2145336, 11274289, 10121090, -5220533, 3685082, -3848291, -1928440, 3201898, -6171868, - -1290638, 5740224, 4520453, 3932043, 4861903, 2574833, -1393717, 3788161, 2540473, -2843268, - -105227, 7730941, -768799, -3566970, -1088774, 3184718, -3270618, -7919920, -528281, -2770254, - 2068027, 1677185, -1108102, -3212636, -4722317, -5585605, 5699422, -1900523, -176094, -1258425, - -354335, -704375, -52800180, -16357383, 5944235, -8349417, 7535520, -3485366, 73014, -15564961, - -18698140, -2542621, -6545530, 7825431, 2231236, -2278480, -38646116, 19396072, 1378685, 16902844, - 21028160, 14542759, -20203526, -4937065, -1954210, -5048734, 4361540, 4791036, -345745, -7365869, - 8175470, -13670881, -7303592, 12126840, 627065, -5229123, 14199162, 313533, 14894947, -5151814, - -2379412, 1767379, 4668630, -10666551, -7870528, -1879048, 8392366, -3058017, 1365800, -3360812, - 5611375, 7030862, 1370095, 373662, -12365211, -1290638, 6060199, 6786049, -3867618, 7602092, - 2510409, -2104534, 1990717, -7724499, -2409477, -5168993, 5102421, 798864, -1799591, 1838246, - -13187697, 83752, 2523293, 6317897, 2091649, -3459596, 6120329, 579821, -8306467, -3783866, - -4254165, -1172526, 1765232, 33792804, 11394548, -20332376, -3474629, -8761733, 7075959, -12277164, - 10258529, -2291365, 11931419, 8284992, 14486925, -19486266, 23422604, -14375256, 13715978, -7868380, - 8235600, 1537598, 6998649, -12468290, -28537910, 11083163, 19935090, -7226283, 8209830, -10125385, - 2437394, -6650757, 20963736, -204011, -2010045, 4988605, -10097468, -7071664, -5894843, 9171903, - 154619, -3382287, 73014, -1810329, 14424648, 9629317, -5308580, 4655745, 5527623, -5963562, - -3395172, -5370857, -10819023, -1498944, 285615, -1473174, -3940633, -11038066, -395137, 16862042, - 9206262, -7041599, 9468255, -1005022, -105227, 7904888, 4185446, -8038032, 3092377, 1797444, - 8360154, 9957882, -7851200, 3594888, 5862631, 7604240, -620623, -216896, -2680060, -1385127, - 4320737, -691490, 7812546, -1739462, 71534824, -58435176, -9850507, 2858301, -1187559, -16196322, - 5351530, 4161823, 22799834, -7548405, 4430259, 18726058, 444529, 11235634, 37076304, -8134668, - -2484639, -19393924, -18144090, 764504, 6077379, -8218420, 3457449, 32682554, 18876382, 2656437, - 1170379, 2602750, 18056042, -15182709, -6755984, -901943, 9279277, -1511829, 2179696, -7730941, - 2828236, -13683766, -8080981, -10359461, 98784, -9283572, 2138894, -16490527, 7511898, -32890860, - -8473970, 4447439, 5995775, -1284195, -7638600, 2486786, 899796, 3882651, -9053791, 3944928, - -5330055, -5991480, -14562087, -10851235, -3259880, -1857573, 637803, 2409477, 4569845, 835371, - 2143189, -8695161, -137439, -10602127, -1668595, -775242, 201863, 3466039, 10456098, -6637872, - -3021510, -740882, -5703717, -9783936, 2093797, -45397804, -31638876, -2461016, -6515466, 23602992, - 644245, 4260608, -29841432, 1410897, 3947075, 1578401, 2153926, 17798344, -22473416, 4602058, - -4904853, -15522012, -7604240, 14081050, -5108864, 11441793, -4088809, 6575595, 3493956, -2523293, - -1898376, 7460358, -1161789, -242666, -19260780, 9328669, 8431021, 7960722, 9186935, -17308718, - -17839146, 10166188, 15217069, -18601504, 6661495, 2503966, 15814070, 9032316, 1393717, 10576357, - -5785321, -11291469, -1818919, -21631602, -15824807, -1913408, -934155, 3242700, -10383083, 3399467, - -8355859, -27681064, -8207683, -7595650, -27283780, -135291, -4574140, -3354370, 2961380, 8265665, - -8128226, 5025112, 3309272, -12446815, -7973607, -9612137, -2153926, -2982855, -395137, -4082367, - 5061619, -6156836, -1660005, -5261335, 8776766, -10065256, 5744519, -1756642, -2325725, 341450, - 2375117, -2518998, -28271622, 42988328, -22604412, -9657234, -13230647, 3382287, 3676492, 6320045, - -2750927, 18756122, 14132590, -13503377, -23959476, 8944269, -9006546, 22003118, 1788854, 9386651, - 11542725, -8349417, -8106751, 29242284, -16784732, -4060892, -8529805, 1013612, -3526168, 3869766, - -4969277, -1960653, -22585086, 19900730, -6966437, -1786706, 23551454, -16155519, -20360292, 1829656, - -9238475, -13404593, -88047, -6878390, 5336497, -29379724, -9756018, -7224135, -693637, 10325101, - 146029, 2042257, 5368709, -5059472, 4108136, 6889128, 5993627, 6534793, -3732327, -6251325, - -5411659, 7430294, -17738214, -3914863, -4153234, -4423817, 11662984, -7907035, -12393128, 12562779, - 3884798, 7546258, 14987288, -5519033, -4937065, 7337952, -8022999, -10264972, -9363029, 5555540, - 4346507, -5602785, 5214091, 1666447, 6141803, 1037235, -11162620, 7460358, -3663607, -59126668, - 29527900, 31814970, 16282221, 14783277, -10608569, 15025943, -25567940, 801011, -30034706, -3983582, - -13136157, 13887777, -14385993, -11952894, -3307125, -22046068, 6414534, -10106058, 9665824, -20699594, - 34383360, -11375221, 16215649, -14199162, 1331440, -14227079, -4589173, 7735236, 21992380, 24665998, - -12451110, 25770, -7380902, -13131863, -10037339, -35388384, -919123, 5845451, -33298882, 12882754, - 6474663, 9025874, 15820512, 9947144, 5250598, -11237782, -3734474, -12526272, -6405944, 6579890, - -26656714, 10398116, 5108864, 1619203, -12648679, -7488276, 6728067, 21335250, 8912057, 5454609, - -8546985, 8847633, 1138166, -10252087, 2632815, -7441031, -11703786, -6131066, -2851858, -10593537, - 11839077, 6685117, 9609989, 5312875, -8869107, 2789581, 14815490, -3047279, 13750338, 7269232, - 5001490, 9257802, -5018670, -5703717, 3476776, 2334315, 48930416, -33711200, -14160507, -4327180, - -206158, 23798414, -4567698, 7758859, -13799730, 7333657, -8600672, -38753488, -26665304, -9970767, - 13808320, -1717987, -21449066, -20109036, -42273216, -13683766, 5330055, 5643587, 1876901, -4413079, - -2564096, -13155485, 3350075, 5424544, 7090991, 1571958, -2010045, -5130339, -20212116, -5209796, - -4657892, 10052371, -2190433, -16144782, -6395207, 4571993, -18135500, 3015067, -18700288, 10282152, - 14467597, -13913547, -27026082, -5297842, -8559870, -12427488, 1209033, 2345052, 2564096, 6521908, - 249108, -10677289, 16806208, 26139170, -12749610, 10780368, 4299263, 12330851, -19097572, 7063074, - 2317135, 6672232, -27429808, 21500606, 2523293, 2321430, -3423089, -15732465, 3962107, 1857573, - 3732327, 4647155, -17134772, -9126806, 3259880, 7872675, -4408784, -148176, 6231998, 2372970, - -3171833, -8304320, 5811091, 79675936, -44409960, 4148939, -4404489, -9401683, -33124936, -1713692, - -1778117, 27088358, 12406013, 54644868, -21644488, 2181844, 6019397, 13153337, -5534066, -2433099, - 22166326, -13799730, 31879394, 19389630, -44214540, 42271068, 14907831, -15133317, -10960757, -16514149, - -8628589, 3118146, 1964948, -11845520, 28052578, 3680787, -13411035, -11802570, 2753074, -14632954, - -25997438, 339302, 15539192, 6266358, 18891414, -8684424, 5881958, 20313048, 29100550, 6949257, - -30109868, 9966472, -9693741, -16518444, 4383014, 12818330, 7316477, -3599183, -27337466, -23854248, - 33704756, -4376572, 26044682, 3055869, -10273562, 12841952, -22606560, -9938554, 10881300, -2854006, - 22393960, -17952964, -35708360, -9962177, -1769527, -10904922, -8579197, 22258668, -7453916, 4138201, - -20405390, -19853486, 9713069, 5164698, 8177618, -8622147, 8347269, 904091, -4788889, -981400, - -90089088, -58643484, 21124796, -30614526, 9380209, -15446850, -54631984, -40501540, 72230616, -33681132, - 32450626, 18202072, -19250044, 16595754, -11059541, 22535694, 25003152, -1937030, -7499013, 43164420, - -14441828, -49422188, 489626, -20877836, 4698694, 4342212, 29096256, 15283641, 5802501, 14091788, - -13552769, -307090, 31887984, 20280836, -6126771, 7984344, -28763396, -44285408, -32734094, -22980222, - -6680822, -6573448, 7818988, -4421669, -12575664, 27865748, 7090991, -21507048, -20145544, -6034429, - 7866233, -21668110, 8201240, 25973814, -858993, 9526237, -18395344, 13696651, 9876277, 2909840, - 10080288, -16226386, -24908662, -34930968, 17044578, 13297219, 858993, 13194140, 2226941, -16211354, - -3680787, 876173, -28011776, -2854006, -43329776, -23972360, 6844031, -11321534, 7907035, 676457, - -6027987, -6210523, -4385162, -8351564, 7282117, -128849, -1614908, -107359152, 36565204, -8549132, - -7058779, 19172734, 4690105, 10690174, 46748572, 27910844, 35298188, 17763984, 48208860, -8478265, - -47010564, 6923488, -5312875, -20134806, -41654740, -18159122, 36352604, 8252780, -2557653, 7593502, - -2815351, 515396, 30620970, 3897683, 11330124, -4636417, 7537668, 30556544, -8504035, -20544976, - 15468325, -36487896, -36728412, -23568634, -4702989, 1020055, 15126875, 35811436, 483184, -12348031, - -35762044, -58471684, -20654498, -8523363, -3571265, -380105, 21509196, -26787712, 48191680, 25097642, - -4668630, 13907104, -19093278, 3476776, 313533, 22346714, 43046308, 29113436, -25469156, -10647224, - 7131793, -4073777, -5491116, 2244121, -13191992, -41768556, -3244848, -7685844, -3077344, 6575595, - -16355235, -5467494, -28598040, -3002182, 3925600, 29899414, 14579266, 4224101, 4743792, 7580618, - 863288, -25243670, 5136781, -5849746, 6676527, -3040837, -3401614, -13795435, 2080912, -14538464, - 43974024, 44510892, 15335181, 29890824, 21657372, 46690588, -40432824, 48528836, -58491012, -9996536, - 55357832, 75780400, 16095390, -4449586, 27822798, -22842784, -26673894, 54919748, 9167608, -8059506, - 13657996, 44223132, -11164767, 27262304, -8443906, -10636487, -4891968, 20160576, -50442244, -5839008, - 25061134, -10911364, 2967823, -17615808, 10915659, 40608916, -36747740, 12363063, -10623602, 13531294, - -19037442, 27412628, 2680060, 10153303, 11340861, -44613972, 22370338, -62264140, -12373801, 35910220, - 4209068, -21979496, 39623220, -13140452, -23291608, 28879360, -11336566, -7724499, -4121021, 17613660, - -2211908, 4960687, -33842196, 12859132, 3536906, 67345088, -49954764, -21494164, 6337224, -12515535, - 15453292, 19305878, -23852100, 47238196, 17858474, 229781, 8027294, 16123307, -7254200, -24932286, - 10353019, -12642236, 4516158, -4711579, 12528420, -15635828, 5224828, 620623, -8222715, 11227045, - -3451006, -2390149, -876173, 89730456, -55963424, 2252710, -8888435, -14877767, 1928440, -20396800, - -8570607, -66228396, -55413668, -55192476, 18599356, -11443940, 18382460, -12541305, -40102108, 64201172, - 44764296, -29697552, -24930138, -35076996, -7273527, 13808320, 21234318, 26027502, -1752347, 20160576, - -5697274, -25280178, -30872224, 19421842, -14018773, 58613420, 36749888, 54067196, 7672959, 19705310, - 53244708, 36928128, -11598559, 9781788, -2297808, 734439, 5703717, -24715390, -17772574, 9618579, - -30925912, -31866510, 30986042, 35229468, -38487200, -1202591, 68567008, 47775068, -2381559, -22585086, - -4917738, 14252849, 12942884, -9206262, -25443386, 30672508, -1986422, 7559143, 21994528, 27893666, - -29072634, 12571369, -4711579, 11630771, -45232448, 8433168, 40965400, -40662604, -33384780, -17293686, - 18229988, 32328218, -18163416, 17811230, -15648713, -1546188, 1002875, 6779606, 12154757, -5585605, - -2428804, 7393786, 6852621, 135291, -852551, 5355824, 72690176, 28028956, -9633612, -2272038, - 22842784, -27114128, -35296040, 30401926, -42183020, -54619100, 14596446, -29268054, -37774236, -19651622, - 36202280, 88753352, 36754184, -48157320, 90868624, 10640781, -14175540, 16469052, -52971980, 13593571, - 7378754, -37903088, 32929514, -10110353, 6536940, -27253714, 15418933, -24895778, 45999100, -54309860, - -20005958, -18680960, 25965224, 30047592, 26699664, -28799904, 8489003, -30112016, -8654359, 16250009, - 38437808, 17867064, -17626546, 37553048, 19104014, 30322470, 2040110, 35326108, -15375983, 19597936, - -53556096, 60329260, -5218386, 8527658, -15953656, -31228708, 1608465, 20255066, 48075716, 14291504, - -57505316, 24678882, -23270132, 47528108, 4088809, -17925046, 9171903, -15476915, 9865540, -33320356, - 13376676, 3358665, 2911988, 5529771, -6564858, 3624953, -9032316, -13862007, 18743238, 11933567, - 10797548, -24650964, 8169028, -13288629, 11574937, 2787434, -1556926, 5989332, 2759517, -148502784, - 6779606, 25108378, 58669252, 19419694, -91255168, 122088744, 44929652, -55600500, 20332376, 121429464, - 27502824, -29237990, -3401614, -73252816, 38014756, 3697967, -18500572, 10782515, 25436944, -47435768, - 25759066, -59491740, 6603512, -54206784, -48608292, -20622286, 23304492, 35188668, -26429082, 30799210, - -52731460, -7425999, 59908352, 5708012, -21163452, -6801081, 11978664, -13604309, -39004744, -43709884, - -5467494, -19958714, 43396348, -60226180, 64372968, 20585778, 8577050, -21238614, -6640020, 29807074, - -23583666, 40142912, 10322954, 36303212, -12904229, -20768314, -62831076, 21805548, -5948530, -65023656, - 20014548, -4234838, 40147208, 64085208, -26542898, 14684493, 31991064, 33773476, 7365869, -19357418, - -3328600, -78797616, -3367254, 7342247, 19997368, -281320, 53566832, 11611444, 26901528, -29706142, - -20813412, 39814348, -3530463, -7971460, 24588688, -5484673, -6186901, -356482, -753767, 2675765, - -3719442, 22226456, 183854672, 83496312, 16930762, 29399052, -38358352, -25926570, -9502615, 69133944, - -49950468, 7355132, -41656888, -113939040, -54936928, 25454124, -29534342, 18174154, -45492292, -2823941, - -48874580, 40900972, -49478024, -35729832, -105780752, -20169166, -17104708, -28192166, 54226108, -18352396, - -44480828, 13750338, 41699836, 15150497, 13767518, -6844031, -9472550, -28342490, 20968030, -36331128, - -10262824, -22776212, -63329292, 9030169, -44132936, 17055316, 5001490, -13297219, -2029372, -46226732, - -3223373, -10919954, 66236984, -19761144, -2214056, 26686780, -37301792, -16784732, 67216240, -40108552, - 25295210, 1277753, 59702192, 85259392, -5705864, 10593537, 7892003, 29184302, 14836965, -65906272, - 5321465, 16063178, 22402550, -28477780, -44259636, 4103841, 11959336, -11860552, -17267916, -70643624, - -35341140, -40825812, 2113124, 8407398, -13954349, -19741818, -22640920, -5828271, -11731703, -12725988, - 13883482, -7329362, 6339372, -25686052, 1056562, -10185515, -18249316, 3676492, 9524090, }, + -34360, -64425, -38655, -98784, -17180, -158914, -36507, -513249, 352187, -34360, + 354335, -77309, 156766, 947040, -105227, -1127429, -1114544, -369367, -685047, 90194, + -554051, -1509681, 429497, -380105, -268435, 399432, 128849, -508954, -790274, -1030792, + 139586, -620623, -375810, 216896, -1082332, 966368, 1013612, -581968, -68719, -373662, + -1009317, 90194, -908386, -719407, 700080, -466004, 1050120, 4378719, -1900523, 1943473, + -820339, 695785, -25770, 1017907, -438087, 255551, 435939, 523986, 558346, 966368, + -234076, 115964, 1765232, 1322850, -3468186, 693637, -442382, 178241, -1178969, 783832, + -1486059, 1488206, 1234803, 612033, -188979, -463856, -543313, 1058710, 970663, -429497, + 223338, 1823214, -676457, -32212, -616328, 219043, 283468, -45097, -511101, 858993, + 133144, -257698, 650688, 17585744, -1269163, 2450279, -42950, 777389, 339302, 592706, + 403727, 1683627, -968515, 710817, -343597, 292058, 925565, 1440962, 575526, 279173, + -691490, 1312113, -949188, 500364, -440234, -1382980, 143881, 481036, 49392, -431644, + 122407, -483184, 908386, -1866163, 435939, -431644, 493921, -19327, -2615635, -908386, + 266288, 414464, 302795, -453119, -590558, -511101, 371515, 1013612, -418759, 448824, + 10608569, -12532715, 2508261, -3008625, 1655710, -1947768, 1531156, -2665027, -794569, -1642825, + -294205, -1367947, 126702, 2467459, 3588445, 1505386, 805306, 70867, 1133871, 2568391, + 1870458, -1161789, -1395864, -1868311, -882616, -1075889, 109522, -169651, -154619, 57982, + 556198, -865436, 1118839, -1140314, -1516124, 564788, -10737, 118112, 332860, -1054415, + -1191853, 371515, -719407, -981400, -173946, 143881, 783832, -24303072, 4844723, -1224066, + 616328, 523986, -2035815, -916976, 1932735, -315680, 165356, 2168959, 702227, -828929, + -1511829, 1511829, 130997, -1833951, -2626373, -3801046, 1226213, -1690070, 390842, -547608, + 710817, -388695, 268435, -1973538, -1947768, -1215476, -519691, -1228361, 367220, -594853, + 693637, 2280628, 392990, 397284, 1509681, 416612, 350040, -49392, -296353, -1505386, + -356482, 350040, -277025, -70867, -29053306, 10872710, -2712272, 3491809, -1705102, 2518998, + -1389422, -392990, -2476049, 1906966, -2931315, 1954210, -500364, 2733747, -3710852, 966368, + 3461744, 1022202, -2914135, -1022202, -1752347, -719407, 1108102, 575526, 820339, -446677, + -989990, -1393717, -1367947, -103079, -1569811, -261993, -1458141, -1020055, -4056597, -1120987, + -566936, 238371, 96637, 1425929, 605590, 1404454, -141734, 1632088, 384400, 163209, + 403727, 3627100, 12652974, -3489661, 5613523, -3405909, 1468879, -3674345, 2892661, -264141, + 3152506, -251256, -315680, 3098819, -511101, -429497, 2710124, -1322850, -2486786, -3964255, + 3521873, -285615, 2409477, 281320, 1711545, 828929, -2299955, 979253, 934155, -154619, + 1187559, 1814624, -2287070, 302795, -68719, -193274, -1312113, -590558, -1284195, 350040, + -266288, 992137, 2965675, 115964, 1503239, -266288, 289910, -317828, 455267, 1200443, + -545461, 38201588, -9421011, 3631395, -1823214, 3214783, -1404454, 2467459, -1372242, 848256, + -3717294, 1726577, -3549791, 2718714, -1084479, 803159, -1032940, 3828963, 526134, 964220, + -1836099, 2501819, -223338, -1153199, 2130304, -1649268, -2561948, 66572, -798864, 1224066, + -10737, -382252, -835371, 373662, -83752, 483184, -1763084, 416612, -779537, 2753074, + -513249, 1318555, 249108, 1108102, 2061584, -1415192, 111669, 478889, -702227, 1619203, + -332860, 3219078, -19814832, 7825431, -6113886, 3607773, -3045132, 1047972, -4013647, 2607045, + -1604170, 3642132, -405874, 1589138, -3201898, -1350767, -208306, -1163936, -1086627, 4200478, + -3096672, 534723, 1956358, -3837553, 987843, 1357210, -962073, 1320703, 442382, 760209, + -2443837, -214748, -783832, 1507534, -1217623, 824634, -2884071, -581968, 2110977, 1020055, + 670015, -734439, -433792, -2201171, -2340757, 1273458, 474594, -103079, -343597, -204011, + 208306, 206158, -489626, -478889, 289910, 307090, -803159, -32031866, 10492605, -5671505, + 1455994, -528281, 1791001, -2398739, 2594160, -1058710, -901943, -313533, 1876901, -1009317, + -1498944, 1099512, 3609920, -493921, 152471, -6045167, 521839, 100932, 2950643, -955630, + -453119, -4621385, -1582696, 60130, 88047, 1610613, 2209761, -3491809, -3204046, 2074469, + 521839, -3599183, -2763812, 1357210, 783832, -210453, -105227, -1380832, 1415192, -433792, + 517544, 186831, -1887638, -796716, 1009317, -2914135, -1458141, -581968, 616328, -584116, + 51540, -1455994, -126702, -31976032, 14151917, -7818988, 5939940, -5454609, 2705830, -6208375, + 1432372, -4048007, 6390912, -3234110, 2254858, -395137, 47245, -2929168, -835371, -1211181, + 5785321, -1099512, 2952790, 4687957, 2690797, 693637, -624918, 1125281, -1024350, 2624225, + 2536178, 360777, -1275605, 446677, 485331, -1748052, -785979, 1327145, 1906966, -1438814, + -1408749, -1458141, 96637, -605590, 816044, -1406602, 1005022, -2211908, 652835, -1213328, + -81604, 225486, -878321, -1202591, -1529008, -1434519, -1902671, 238371, -1735167, 11877732, + 12343736, -4559108, 4112431, -5005785, 775242, 1524713, 137439, -1999307, 2306398, 592706, + 4894115, 2555506, 5525476, -839666, 3262028, -880468, 2087354, 2911988, -384400, -4024384, + 3850438, -414464, 1623498, -895501, 2147, 556198, 4707284, 706522, -2544768, -858993, + 627065, -1400159, 3551938, 1520418, -545461, -914828, -1999307, 1586990, -1958505, 2025077, + 2126009, -1556926, 1224066, 1105954, 573378, -150324, 3448859, 2134599, 2527588, -90194, + 315680, 1136019, -723702, -277025, -225486, -736587, -8590, 188979, 324270, -605590, + -1417339, -1483911, 36105644, -12891344, 4477504, -6025839, 4110284, -3968550, 5282810, -1812476, + 246961, -3962107, 7930657, -1140314, 7146826, 446677, 1224066, -4788889, 1709397, 7185481, + -2209761, -6047314, 893353, 257698, 2804614, -4359392, 3573413, -34360, 313533, -377957, + -4209068, -1234803, 702227, -5057324, 839666, 2061584, 1692217, -1419487, -401579, -186831, + 2372970, 717260, -403727, -1035087, 1848983, 1277753, 4591320, 1187559, -682900, 2566243, + 1028645, -261993, 848256, 1947768, 1284195, 270583, 309238, -1488206, 322123, -143881, + 1902671, -195421, 753767, -206158, 676457, 12088185, -17463338, 10462540, -7765301, 3266323, + 1181116, -792421, -659278, 2076617, -4395899, -2796024, -2276333, -1773822, -6010807, 3045132, + -5583458, -225486, -4466766, 1640678, -3362960, -2649995, -1337882, 5078799, 712965, 4941360, + 2596308, 3386582, 4891968, 253403, -620623, -749472, 1378685, 3758097, -313533, -274878, + -2510409, 1906966, -304943, -1501091, 1393717, 1159641, 3925600, 1602023, 1851131, -2780991, + -1292785, -163209, -515396, 1913408, -5617817, 1213328, -1380832, -949188, -1741609, -1973538, + -665720, -1952063, 794569, -1365800, -223338, -2965675, -2909840, -2147, -37061272, -8098161, + 1698660, -7030862, -2905546, 298500, -223338, -5991480, 1713692, -5967857, 171799, 4799626, + -897648, -798864, 2632815, 1726577, 2680060, 156766, 3242700, -1799591, 916976, 3764539, + -259846, -236223, -2471754, 3584150, -2780991, -1524713, 934155, 1451699, 2731599, 8443906, + -2317135, -1372242, -3644280, 208306, -2686502, 642098, -1075889, -3970697, -253403, 5085242, + 1425929, -3423089, -1709397, 1690070, -2083059, -2594160, 478889, -1221918, 292058, 541166, + 3193308, 461709, 1563368, 846109, -2701535, -1374390, 1681480, 1586990, -1093069, 949188, + -221191, -45427868, 37495064, -13106093, 11141145, -8207683, 6274947, -2381559, 3996467, -4355097, + 2682207, 3128884, 4524748, -2944200, 5478231, 2710124, 9320079, -1458141, 785979, -4932770, + 1251983, -1728724, -3081639, -3820374, -4395899, -4050154, 6043019, -272730, 7256347, 1883343, + 1331440, -122407, 925565, -3201898, 515396, -1168231, 1511829, 4299263, 770947, 1417339, + 255551, 448824, -3266323, -1788854, -124554, -249108, 438087, -996432, -3008625, 73014, + 3231963, -1039382, 953483, 940598, -2667175, 1833951, 790274, 1009317, -547608, 304943, + -289910, -833224, 238371, 2903398, 26472030, -4071629, -8540542, -2967823, -1799591, -1372242, + -7524783, -3951370, 2098092, 1290638, 2147484, 2677912, -5057324, 2044404, -992137, 1818919, + 8111046, -8196945, 2834679, 2843268, 2207613, -2110977, -4743792, 3704409, 1103807, 2654290, + 4999342, 15032, 6891275, 607738, 3204046, 279173, 2175401, -1881196, 2607045, 1889786, + 2488934, -947040, 828929, -184684, 3191161, 3944928, -5826123, 7874823, 672162, 2209761, + 350040, 1382980, 1531156, -1644973, 4720169, 2559801, 188979, 4331475, 1844689, -2360085, + -191126, -1574106, -1705102, -1275605, 792421, -319975, 274878, -88047, -4810364, 2497524, + -1900523, 697932, -639950, -264141, -1185411, -667867, 20980916, 1836099, 4275640, -5426691, + -1026497, -13481902, 3225521, -644245, -9161165, 7685844, -4239133, 274878, 5641440, 2538326, + 4236985, -3240553, 1872606, -4249870, 85899, -3635690, 1363652, -5525476, 7926362, 5718749, + 4681515, 5454609, 1217623, -1801739, -3420942, 1544041, 4355097, 12885, 2969970, -2141041, + 607738, 2884071, 2040110, 2596308, 188979, 934155, -322123, -1846836, 1844689, -1277753, + 865436, 760209, -1887638, 2581275, -3489661, 3128884, -1634235, 2214056, 3375844, -4110284, + 416612, 483184, -1677185, -3236258, 2295660, -5252745, -4060892, 2529736, 1067299, 1183264, + 1022202, 3281355, 3152506, -1133871, 444529, 1919850, -755914, -6442, 33094870, -27511414, + 9335111, -6846178, 2424509, 8598525, 6992207, -4610648, 8383776, 4722317, 5065914, -3468186, + 2360085, -1769527, 9953587, 2768107, 2815351, 3854733, 4215511, 2671470, 2881923, -8173323, + 1314260, -14774687, -5138929, -1370095, -8463233, 2128156, 4541928, -3191161, -4589173, -5398774, + -5184026, -2765959, 2980707, 2351495, -7524783, -8705899, -667867, -4440996, 2377265, 1934883, + 831076, -622770, 4121021, -2162516, 210453, -573378, -1844689, -5592048, 4335770, 7359427, + -994285, -921271, 3461744, -5186173, 6298570, 1625645, -3191161, -118112, -2963528, -1247688, + -749472, -2119566, -566936, -1432372, -4340065, 1131724, 1559073, 1466731, 1546188, 498216, + -51217484, 5083094, -4571993, 1879048, 5218386, 3745212, 10445360, -4297115, -365072, 839666, + 12504797, 4340065, -9801115, -6405944, 5514738, 7393786, -1859721, -2800319, -208306, 3408057, + 7642895, 7763154, -115964, -13915694, -4028679, -1443109, -1675037, 8061654, -3712999, 4702989, + 457414, -893353, -7221988, 560493, 5740224, -9242770, -5418101, -2183991, -1623498, -4391604, + -3665755, -8643622, -1602023, -5866926, 47245, 1249836, 6210523, -4258460, -2804614, 517544, + -635655, 951335, -5375152, 2085207, 2022930, 650688, 289910, -4075924, -3693672, -2070174, + -1170379, -341450, -6944962, 1387274, 2005750, -3015067, -6386617, 2523293, -324270, -3219078, + -646393, -1509681, -1080184, 4005057, -30081950, 31924492, -4561256, 2014340, 7520488, 9019431, + -6796786, 4342212, 1715839, 5570573, 3773129, 7864085, 4443144, -5325760, -8851928, 1258425, + 9365176, 18708878, -4524748, -6354404, 4896263, 3038689, -3579855, -9217000, -1881196, -1853278, + -8345122, 7303592, 8693014, 137439, 2016487, -171799, 6833293, -5336497, -16544214, 6975027, + -1992865, 5534066, 2643552, 234076, -4103841, -6356552, 4395899, 5211943, 3796751, -738734, + -347892, 5731634, 3208341, 1767379, -3423089, 4825396, 4020090, -667867, -1260573, -2796024, + 3296388, 107374, -8169028, 6717329, 4009352, -1520418, 1917703, -1015760, 210453, -154619, + 1984275, 528281, 2441689, 3962107, 2108829, -603443, -2407329, -1582696, 5705864, 2272038, + -1080184, -1750199, -287763, 8993662, 369367, -6923488, -14181982, 3431679, -738734, -11701638, + 3955665, -3876208, 547608, -4430259, -3453154, 3689377, 8909910, 1099512, 11802570, 5355824, + -5939940, -7806103, 12914967, -5598490, -412317, 1155346, -12120398, -90194, 6414534, -7033009, + -1864016, 8117488, 515396, 4241280, 126702, 5345087, -901943, -3627100, -485331, 7097434, + 9584220, -3141769, 1947768, 1666447, 6393059, -3805341, -667867, 1245541, -1614908, 4146791, + 1876901, 343597, -2175401, 3317862, 3689377, 191126, 182536, 2759517, 4314295, -5179731, + -17180, 1445257, 2368675, -2652142, 2147484, 1063004, 77309, 1503239, -1636383, 721555, + 1715839, 3577708, 4325032, -3487514, 395137, 67171144, -6414534, 1159641, 4226248, -5978595, + -10363756, -6004365, -2544768, -11791833, -12670154, 1022202, -11216307, -4900558, -3206193, -2723009, + 6966437, 8117488, 2598455, 16939352, 3111704, -8310762, 14594299, -1404454, 10348724, -3238405, + -1035087, -9526237, 412317, 8536248, -242666, -4075924, -1595580, 923418, -2078764, -1735167, + 3322157, -7572028, 3141769, 1204738, -3571265, -7179038, -4861903, 5641440, 5542656, 6618545, + -11020886, 6277095, 1752347, -199716, 547608, 1163936, 1264868, 1503239, -899796, 659278, + 5892695, -1580548, 2342905, 2813204, -2396592, 4926328, 5600638, 1000727, -455267, 5207648, + 3702262, 2907693, 3498251, -4243428, -1960653, 1071594, -440234, -564788, 322123, 2372970, + 652835, -4110284, -39462160, -66170412, 23903640, -1717987, 9919227, -11613592, 504659, -13447543, + -1782411, -19372450, 8310762, 8877697, -476741, -1546188, -287763, 1758789, -4672925, -16522739, + 30298846, 2063732, -3938485, 10363756, 1799591, -5527623, 14519137, 16149077, -7009387, 9509058, + 1801739, -2106682, -15238544, -8358007, 11809013, -6148246, 1617055, -863288, 8007967, -12427488, + -13984414, 1926293, 141734, -9457518, 5617817, 1110249, -5939940, 4110284, -6536940, -5439576, + 2499671, 2422362, 272730, -1782411, -3122441, 3809636, 6414534, 897648, 1964948, -1913408, + -1941325, 5617817, 599148, 1219771, -5858336, -1382980, -3940633, 3135326, 4653597, -8590, + 3813931, -107374, 5108864, -4254165, 2518998, -111669, -341450, -4022237, -137439, -3455301, + -547608, -21272974, 63909112, -28394028, 4782446, 4179003, 16026670, -2037962, 10234907, -10114648, + 627065, -19391778, -3706557, 92342, 7816841, 1292785, 8050916, -5561983, -11768210, 1518271, + -17703856, -18668076, 551903, -6137509, -330712, 1591285, 2688650, -4632122, -3079492, -6667937, + -10086731, 4063039, 4915590, -13161927, -5935645, -16542067, 283468, -7310035, 5967857, 6951405, + -13602161, 2145336, 11274289, 10121090, -5220533, 3685082, -3848291, -1928440, 3201898, -6171868, + -1290638, 5740224, 4520453, 3932043, 4861903, 2574833, -1393717, 3788161, 2540473, -2843268, + -105227, 7730941, -768799, -3566970, -1088774, 3184718, -3270618, -7919920, -528281, -2770254, + 2068027, 1677185, -1108102, -3212636, -4722317, -5585605, 5699422, -1900523, -176094, -1258425, + -354335, -704375, -52800180, -16357383, 5944235, -8349417, 7535520, -3485366, 73014, -15564961, + -18698140, -2542621, -6545530, 7825431, 2231236, -2278480, -38646116, 19396072, 1378685, 16902844, + 21028160, 14542759, -20203526, -4937065, -1954210, -5048734, 4361540, 4791036, -345745, -7365869, + 8175470, -13670881, -7303592, 12126840, 627065, -5229123, 14199162, 313533, 14894947, -5151814, + -2379412, 1767379, 4668630, -10666551, -7870528, -1879048, 8392366, -3058017, 1365800, -3360812, + 5611375, 7030862, 1370095, 373662, -12365211, -1290638, 6060199, 6786049, -3867618, 7602092, + 2510409, -2104534, 1990717, -7724499, -2409477, -5168993, 5102421, 798864, -1799591, 1838246, + -13187697, 83752, 2523293, 6317897, 2091649, -3459596, 6120329, 579821, -8306467, -3783866, + -4254165, -1172526, 1765232, 33792804, 11394548, -20332376, -3474629, -8761733, 7075959, -12277164, + 10258529, -2291365, 11931419, 8284992, 14486925, -19486266, 23422604, -14375256, 13715978, -7868380, + 8235600, 1537598, 6998649, -12468290, -28537910, 11083163, 19935090, -7226283, 8209830, -10125385, + 2437394, -6650757, 20963736, -204011, -2010045, 4988605, -10097468, -7071664, -5894843, 9171903, + 154619, -3382287, 73014, -1810329, 14424648, 9629317, -5308580, 4655745, 5527623, -5963562, + -3395172, -5370857, -10819023, -1498944, 285615, -1473174, -3940633, -11038066, -395137, 16862042, + 9206262, -7041599, 9468255, -1005022, -105227, 7904888, 4185446, -8038032, 3092377, 1797444, + 8360154, 9957882, -7851200, 3594888, 5862631, 7604240, -620623, -216896, -2680060, -1385127, + 4320737, -691490, 7812546, -1739462, 71534824, -58435176, -9850507, 2858301, -1187559, -16196322, + 5351530, 4161823, 22799834, -7548405, 4430259, 18726058, 444529, 11235634, 37076304, -8134668, + -2484639, -19393924, -18144090, 764504, 6077379, -8218420, 3457449, 32682554, 18876382, 2656437, + 1170379, 2602750, 18056042, -15182709, -6755984, -901943, 9279277, -1511829, 2179696, -7730941, + 2828236, -13683766, -8080981, -10359461, 98784, -9283572, 2138894, -16490527, 7511898, -32890860, + -8473970, 4447439, 5995775, -1284195, -7638600, 2486786, 899796, 3882651, -9053791, 3944928, + -5330055, -5991480, -14562087, -10851235, -3259880, -1857573, 637803, 2409477, 4569845, 835371, + 2143189, -8695161, -137439, -10602127, -1668595, -775242, 201863, 3466039, 10456098, -6637872, + -3021510, -740882, -5703717, -9783936, 2093797, -45397804, -31638876, -2461016, -6515466, 23602992, + 644245, 4260608, -29841432, 1410897, 3947075, 1578401, 2153926, 17798344, -22473416, 4602058, + -4904853, -15522012, -7604240, 14081050, -5108864, 11441793, -4088809, 6575595, 3493956, -2523293, + -1898376, 7460358, -1161789, -242666, -19260780, 9328669, 8431021, 7960722, 9186935, -17308718, + -17839146, 10166188, 15217069, -18601504, 6661495, 2503966, 15814070, 9032316, 1393717, 10576357, + -5785321, -11291469, -1818919, -21631602, -15824807, -1913408, -934155, 3242700, -10383083, 3399467, + -8355859, -27681064, -8207683, -7595650, -27283780, -135291, -4574140, -3354370, 2961380, 8265665, + -8128226, 5025112, 3309272, -12446815, -7973607, -9612137, -2153926, -2982855, -395137, -4082367, + 5061619, -6156836, -1660005, -5261335, 8776766, -10065256, 5744519, -1756642, -2325725, 341450, + 2375117, -2518998, -28271622, 42988328, -22604412, -9657234, -13230647, 3382287, 3676492, 6320045, + -2750927, 18756122, 14132590, -13503377, -23959476, 8944269, -9006546, 22003118, 1788854, 9386651, + 11542725, -8349417, -8106751, 29242284, -16784732, -4060892, -8529805, 1013612, -3526168, 3869766, + -4969277, -1960653, -22585086, 19900730, -6966437, -1786706, 23551454, -16155519, -20360292, 1829656, + -9238475, -13404593, -88047, -6878390, 5336497, -29379724, -9756018, -7224135, -693637, 10325101, + 146029, 2042257, 5368709, -5059472, 4108136, 6889128, 5993627, 6534793, -3732327, -6251325, + -5411659, 7430294, -17738214, -3914863, -4153234, -4423817, 11662984, -7907035, -12393128, 12562779, + 3884798, 7546258, 14987288, -5519033, -4937065, 7337952, -8022999, -10264972, -9363029, 5555540, + 4346507, -5602785, 5214091, 1666447, 6141803, 1037235, -11162620, 7460358, -3663607, -59126668, + 29527900, 31814970, 16282221, 14783277, -10608569, 15025943, -25567940, 801011, -30034706, -3983582, + -13136157, 13887777, -14385993, -11952894, -3307125, -22046068, 6414534, -10106058, 9665824, -20699594, + 34383360, -11375221, 16215649, -14199162, 1331440, -14227079, -4589173, 7735236, 21992380, 24665998, + -12451110, 25770, -7380902, -13131863, -10037339, -35388384, -919123, 5845451, -33298882, 12882754, + 6474663, 9025874, 15820512, 9947144, 5250598, -11237782, -3734474, -12526272, -6405944, 6579890, + -26656714, 10398116, 5108864, 1619203, -12648679, -7488276, 6728067, 21335250, 8912057, 5454609, + -8546985, 8847633, 1138166, -10252087, 2632815, -7441031, -11703786, -6131066, -2851858, -10593537, + 11839077, 6685117, 9609989, 5312875, -8869107, 2789581, 14815490, -3047279, 13750338, 7269232, + 5001490, 9257802, -5018670, -5703717, 3476776, 2334315, 48930416, -33711200, -14160507, -4327180, + -206158, 23798414, -4567698, 7758859, -13799730, 7333657, -8600672, -38753488, -26665304, -9970767, + 13808320, -1717987, -21449066, -20109036, -42273216, -13683766, 5330055, 5643587, 1876901, -4413079, + -2564096, -13155485, 3350075, 5424544, 7090991, 1571958, -2010045, -5130339, -20212116, -5209796, + -4657892, 10052371, -2190433, -16144782, -6395207, 4571993, -18135500, 3015067, -18700288, 10282152, + 14467597, -13913547, -27026082, -5297842, -8559870, -12427488, 1209033, 2345052, 2564096, 6521908, + 249108, -10677289, 16806208, 26139170, -12749610, 10780368, 4299263, 12330851, -19097572, 7063074, + 2317135, 6672232, -27429808, 21500606, 2523293, 2321430, -3423089, -15732465, 3962107, 1857573, + 3732327, 4647155, -17134772, -9126806, 3259880, 7872675, -4408784, -148176, 6231998, 2372970, + -3171833, -8304320, 5811091, 79675936, -44409960, 4148939, -4404489, -9401683, -33124936, -1713692, + -1778117, 27088358, 12406013, 54644868, -21644488, 2181844, 6019397, 13153337, -5534066, -2433099, + 22166326, -13799730, 31879394, 19389630, -44214540, 42271068, 14907831, -15133317, -10960757, -16514149, + -8628589, 3118146, 1964948, -11845520, 28052578, 3680787, -13411035, -11802570, 2753074, -14632954, + -25997438, 339302, 15539192, 6266358, 18891414, -8684424, 5881958, 20313048, 29100550, 6949257, + -30109868, 9966472, -9693741, -16518444, 4383014, 12818330, 7316477, -3599183, -27337466, -23854248, + 33704756, -4376572, 26044682, 3055869, -10273562, 12841952, -22606560, -9938554, 10881300, -2854006, + 22393960, -17952964, -35708360, -9962177, -1769527, -10904922, -8579197, 22258668, -7453916, 4138201, + -20405390, -19853486, 9713069, 5164698, 8177618, -8622147, 8347269, 904091, -4788889, -981400, + -90089088, -58643484, 21124796, -30614526, 9380209, -15446850, -54631984, -40501540, 72230616, -33681132, + 32450626, 18202072, -19250044, 16595754, -11059541, 22535694, 25003152, -1937030, -7499013, 43164420, + -14441828, -49422188, 489626, -20877836, 4698694, 4342212, 29096256, 15283641, 5802501, 14091788, + -13552769, -307090, 31887984, 20280836, -6126771, 7984344, -28763396, -44285408, -32734094, -22980222, + -6680822, -6573448, 7818988, -4421669, -12575664, 27865748, 7090991, -21507048, -20145544, -6034429, + 7866233, -21668110, 8201240, 25973814, -858993, 9526237, -18395344, 13696651, 9876277, 2909840, + 10080288, -16226386, -24908662, -34930968, 17044578, 13297219, 858993, 13194140, 2226941, -16211354, + -3680787, 876173, -28011776, -2854006, -43329776, -23972360, 6844031, -11321534, 7907035, 676457, + -6027987, -6210523, -4385162, -8351564, 7282117, -128849, -1614908, -107359152, 36565204, -8549132, + -7058779, 19172734, 4690105, 10690174, 46748572, 27910844, 35298188, 17763984, 48208860, -8478265, + -47010564, 6923488, -5312875, -20134806, -41654740, -18159122, 36352604, 8252780, -2557653, 7593502, + -2815351, 515396, 30620970, 3897683, 11330124, -4636417, 7537668, 30556544, -8504035, -20544976, + 15468325, -36487896, -36728412, -23568634, -4702989, 1020055, 15126875, 35811436, 483184, -12348031, + -35762044, -58471684, -20654498, -8523363, -3571265, -380105, 21509196, -26787712, 48191680, 25097642, + -4668630, 13907104, -19093278, 3476776, 313533, 22346714, 43046308, 29113436, -25469156, -10647224, + 7131793, -4073777, -5491116, 2244121, -13191992, -41768556, -3244848, -7685844, -3077344, 6575595, + -16355235, -5467494, -28598040, -3002182, 3925600, 29899414, 14579266, 4224101, 4743792, 7580618, + 863288, -25243670, 5136781, -5849746, 6676527, -3040837, -3401614, -13795435, 2080912, -14538464, + 43974024, 44510892, 15335181, 29890824, 21657372, 46690588, -40432824, 48528836, -58491012, -9996536, + 55357832, 75780400, 16095390, -4449586, 27822798, -22842784, -26673894, 54919748, 9167608, -8059506, + 13657996, 44223132, -11164767, 27262304, -8443906, -10636487, -4891968, 20160576, -50442244, -5839008, + 25061134, -10911364, 2967823, -17615808, 10915659, 40608916, -36747740, 12363063, -10623602, 13531294, + -19037442, 27412628, 2680060, 10153303, 11340861, -44613972, 22370338, -62264140, -12373801, 35910220, + 4209068, -21979496, 39623220, -13140452, -23291608, 28879360, -11336566, -7724499, -4121021, 17613660, + -2211908, 4960687, -33842196, 12859132, 3536906, 67345088, -49954764, -21494164, 6337224, -12515535, + 15453292, 19305878, -23852100, 47238196, 17858474, 229781, 8027294, 16123307, -7254200, -24932286, + 10353019, -12642236, 4516158, -4711579, 12528420, -15635828, 5224828, 620623, -8222715, 11227045, + -3451006, -2390149, -876173, 89730456, -55963424, 2252710, -8888435, -14877767, 1928440, -20396800, + -8570607, -66228396, -55413668, -55192476, 18599356, -11443940, 18382460, -12541305, -40102108, 64201172, + 44764296, -29697552, -24930138, -35076996, -7273527, 13808320, 21234318, 26027502, -1752347, 20160576, + -5697274, -25280178, -30872224, 19421842, -14018773, 58613420, 36749888, 54067196, 7672959, 19705310, + 53244708, 36928128, -11598559, 9781788, -2297808, 734439, 5703717, -24715390, -17772574, 9618579, + -30925912, -31866510, 30986042, 35229468, -38487200, -1202591, 68567008, 47775068, -2381559, -22585086, + -4917738, 14252849, 12942884, -9206262, -25443386, 30672508, -1986422, 7559143, 21994528, 27893666, + -29072634, 12571369, -4711579, 11630771, -45232448, 8433168, 40965400, -40662604, -33384780, -17293686, + 18229988, 32328218, -18163416, 17811230, -15648713, -1546188, 1002875, 6779606, 12154757, -5585605, + -2428804, 7393786, 6852621, 135291, -852551, 5355824, 72690176, 28028956, -9633612, -2272038, + 22842784, -27114128, -35296040, 30401926, -42183020, -54619100, 14596446, -29268054, -37774236, -19651622, + 36202280, 88753352, 36754184, -48157320, 90868624, 10640781, -14175540, 16469052, -52971980, 13593571, + 7378754, -37903088, 32929514, -10110353, 6536940, -27253714, 15418933, -24895778, 45999100, -54309860, + -20005958, -18680960, 25965224, 30047592, 26699664, -28799904, 8489003, -30112016, -8654359, 16250009, + 38437808, 17867064, -17626546, 37553048, 19104014, 30322470, 2040110, 35326108, -15375983, 19597936, + -53556096, 60329260, -5218386, 8527658, -15953656, -31228708, 1608465, 20255066, 48075716, 14291504, + -57505316, 24678882, -23270132, 47528108, 4088809, -17925046, 9171903, -15476915, 9865540, -33320356, + 13376676, 3358665, 2911988, 5529771, -6564858, 3624953, -9032316, -13862007, 18743238, 11933567, + 10797548, -24650964, 8169028, -13288629, 11574937, 2787434, -1556926, 5989332, 2759517, -148502784, + 6779606, 25108378, 58669252, 19419694, -91255168, 122088744, 44929652, -55600500, 20332376, 121429464, + 27502824, -29237990, -3401614, -73252816, 38014756, 3697967, -18500572, 10782515, 25436944, -47435768, + 25759066, -59491740, 6603512, -54206784, -48608292, -20622286, 23304492, 35188668, -26429082, 30799210, + -52731460, -7425999, 59908352, 5708012, -21163452, -6801081, 11978664, -13604309, -39004744, -43709884, + -5467494, -19958714, 43396348, -60226180, 64372968, 20585778, 8577050, -21238614, -6640020, 29807074, + -23583666, 40142912, 10322954, 36303212, -12904229, -20768314, -62831076, 21805548, -5948530, -65023656, + 20014548, -4234838, 40147208, 64085208, -26542898, 14684493, 31991064, 33773476, 7365869, -19357418, + -3328600, -78797616, -3367254, 7342247, 19997368, -281320, 53566832, 11611444, 26901528, -29706142, + -20813412, 39814348, -3530463, -7971460, 24588688, -5484673, -6186901, -356482, -753767, 2675765, + -3719442, 22226456, 183854672, 83496312, 16930762, 29399052, -38358352, -25926570, -9502615, 69133944, + -49950468, 7355132, -41656888, -113939040, -54936928, 25454124, -29534342, 18174154, -45492292, -2823941, + -48874580, 40900972, -49478024, -35729832, -105780752, -20169166, -17104708, -28192166, 54226108, -18352396, + -44480828, 13750338, 41699836, 15150497, 13767518, -6844031, -9472550, -28342490, 20968030, -36331128, + -10262824, -22776212, -63329292, 9030169, -44132936, 17055316, 5001490, -13297219, -2029372, -46226732, + -3223373, -10919954, 66236984, -19761144, -2214056, 26686780, -37301792, -16784732, 67216240, -40108552, + 25295210, 1277753, 59702192, 85259392, -5705864, 10593537, 7892003, 29184302, 14836965, -65906272, + 5321465, 16063178, 22402550, -28477780, -44259636, 4103841, 11959336, -11860552, -17267916, -70643624, + -35341140, -40825812, 2113124, 8407398, -13954349, -19741818, -22640920, -5828271, -11731703, -12725988, + 13883482, -7329362, 6339372, -25686052, 1056562, -10185515, -18249316, 3676492, 9524090, }, { -137439, - -40802, -150324, 8590, -96637, 221191, 146029, -695785, 8590, -453119, -541166, - 143881, 450972, 440234, 158914, -994285, -609885, 199716, -311385, 53687, 199716, - 259846, 412317, -300648, -335007, -616328, -360777, 0, -1402307, -25770, -139586, - -401579, 285615, -796716, -697932, -1406602, -197569, -1234803, -382252, -25770, 979253, - 274878, 743029, -375810, 783832, -201863, 154619, 685047, 4189741, -3266323, 2046552, - -2579128, 1329292, -1254131, -1236951, -740882, -700080, 764504, 874026, -3195456, -167504, - 481036, -313533, -528281, -1868311, -674310, 1344325, 2035815, 1022202, 3204046, 654983, - -558346, 661425, 562641, -319975, 1054415, 2278480, -861141, -17180, 979253, -23622, - -208306, -1619203, -51540, 831076, 672162, 139586, 57982, -534723, 586263, -53687, - 83752, 38655, -543313, 15180562, -979253, 1331440, -951335, 987843, -1142461, 251256, - -272730, -259846, 880468, -792421, -2744484, 803159, 294205, 861141, 1872606, 1005022, - 678605, -240518, -1586990, -539018, 743029, -208306, -249108, 1565516, -1964948, -618475, - -23622, -328565, -478889, 758062, 831076, 1024350, 296353, 371515, -405874, 1417339, - -53687, 1090922, 770947, -242666, -130997, 521839, 21475, -294205, -135291, 25770, - 11151883, -10651519, 1672890, -2877628, 1544041, -193274, 1114544, -1020055, 2005750, -850404, - 1215476, -2542621, 100932, -1475321, 423054, -231928, -347892, -682900, -1872606, -188979, - 221191, -921271, 1533303, -691490, -1114544, -1406602, 841814, -899796, 2179696, -227633, - 6442, 644245, 8590, 49392, -972810, -816044, -227633, 223338, -373662, -936303, - 831076, 599148, 1496796, -345745, 491774, -206158, 277025, -26160646, 3068754, -1962800, - 55835, -304943, -2194728, 2370822, -586263, 210453, 1002875, 302795, 2748779, -137439, - -1123134, 3296388, 1331440, 2974265, -62277, -3947075, -2362232, -1904818, 1627793, -2059437, - 171799, -751619, -697932, 236223, 612033, -601295, -1239098, -923418, 796716, 897648, - 1720134, -141734, -240518, -111669, 1065152, -1198296, 309238, 468151, 788127, -977105, - 1017907, -1185411, -210453, 390842, -33039036, 11974369, -4825396, 5538361, -3846143, 2542621, - -4168266, 2370822, -3094524, 1198296, 2304250, 118112, 884763, 2113124, -1357210, 1520418, - -1741609, -1282048, -3843996, 3508988, -2257005, 2353642, 178241, -6442, -3687230, -126702, - 715112, -517544, -118112, -128849, 1544041, -221191, -1078037, 1172526, 358630, -461709, - 81604, 60130, 137439, 680752, -992137, 2572686, -201863, -1597728, -161061, -865436, - -85899, 1662152, 15060303, -3195456, 5735929, -2581275, 1990717, -2087354, 7138236, -1333587, - 3822521, -399432, -246961, 996432, 27917, -4846871, 1140314, -403727, -2171106, -496069, - 113817, -6105296, -139586, 545461, 1973538, -8590, -1138166, -197569, 2134599, 427349, - -1013612, -2025077, 3191161, -1919850, -47245, -2879776, -294205, 51540, 536871, -665720, - 803159, 1307818, -1211181, 1047972, -19327, 846109, -17180, 1494649, -704375, -392990, - 1331440, 39653284, -11557757, 1728724, -1956358, 2611340, 32212, -25770, -5327907, 2394444, - -2325725, 1638530, 575526, 843961, 1724429, 2686502, 418759, 940598, -4481799, 1655710, - 1664300, -2879776, -556198, 3047279, 1971390, 1949915, 4316442, 2424509, 633508, 1155346, - -1610613, 1380832, -382252, 2493229, 3227668, -442382, 1090922, 2040110, -850404, 712965, - -2804614, -743029, 2808909, 60130, -1969243, -661425, 848256, 2093797, -146029, 1191853, - -15032, 2811056, -21210696, 8916352, -6191196, 4028679, -3685082, 4756677, -3111704, 188979, - -2649995, -3262028, -4556961, 304943, -2710124, 1297080, 1509681, 3418794, -5622112, 3446711, - -1352915, 4791036, 1043677, -298500, 367220, 354335, -1146756, -977105, 717260, -2304250, - 1492501, 2701535, -3704409, -831076, -234076, 1466731, -1421634, 3869766, -4067334, 766652, - -19327, 225486, -1756642, 255551, -1108102, 1007170, 143881, 176094, -1254131, -238371, - -2585570, -893353, -161061, 543313, 184684, -964220, -3268470, -34190088, 10825465, -7007239, - -476741, -1434519, 2128156, -5909875, 405874, 1864016, 1539746, -2072322, 1157494, -2643552, - -4335770, -1698660, 530428, -2598455, 9051644, 236223, -2529736, -837519, -3045132, -1432372, - 2755222, 1644973, 3577708, -339302, 1586990, -2040110, 818191, -1846836, -639950, -1086627, - 588411, 1108102, -590558, -1752347, 414464, 642098, 2471754, -446677, -929860, -3251290, - -2662880, -1273458, -528281, 597000, 423054, -1337882, -564788, 229781, 1172526, 605590, - 191126, -592706, 1191853, -32916630, 15425375, -7292855, 6876243, -3607773, 4067334, 2007897, - 1232656, -3758097, 442382, -1921998, 545461, -4915590, 1827509, 3053722, 979253, -5231270, - -2600603, -2639258, -2746632, -1806034, 3723737, 882616, 2617783, 2095944, -938450, -227633, - -3955665, 5070209, -1462436, -528281, 311385, -1103807, -1576253, -1857573, -433792, -4157528, - 1215476, -2211908, 1642825, 1432372, 2364380, -657130, 249108, -2703682, 1005022, 1971390, - 461709, -453119, 388695, 1539746, 2306398, 996432, 2143189, 88047, 322123, 10683731, - 13217762, -5970005, 3541201, -1836099, 1329292, -1419487, 762357, 1166084, 6472516, -2289218, - 2669322, 6083821, -1655710, -244813, -1024350, 1479616, 3141769, 3223373, 4187593, 1133871, - 3564823, -906238, -2104534, -7125351, 1503239, -1078037, -3577708, -2549063, -120259, -672162, - 2302103, -326418, -4136054, -4267050, 1151051, -3706557, 500364, 2261300, -3332895, -2229088, - -1415192, 1662152, 1505386, -105227, -438087, 2499671, 534723, -959925, 1005022, -2149631, - 274878, -1131724, -1619203, -1090922, 1700807, -863288, 1284195, -955630, -2078764, 571231, - 1155346, -727997, 38029788, -13234942, 7181186, -4960687, 7138236, -5029407, 4378719, -1625645, - 4447439, 1082332, 3131031, -3635690, 3734474, -1273458, -3098819, -317828, -3328600, -5312875, - -2804614, -575526, 2699387, -3637837, -4868346, -5963562, -1069447, -519691, 4776004, 2617783, - 3068754, -2093797, 2482491, -1891933, -1859721, -1022202, 3150359, 2720862, 850404, -17180, - -111669, 90194, -880468, -493921, 2181844, 427349, 5364414, -2052994, -644245, -4466766, - 2929168, -1163936, -693637, -1050120, -277025, 264141, -743029, 818191, -1196148, 19327, - -1696512, -745177, 380105, 1752347, -908386, 10683731, -16320876, 9569187, -6105296, 7432441, - -83752, 4614943, 1303523, -7155416, -3393024, -2411624, 876173, 1793149, 1002875, 8078834, - -4541928, 6455336, 1125281, 820339, -4415227, -957778, 5581310, -367220, -4737349, 5394479, - 4121021, 912681, -2220498, -1754494, -470299, -375810, 2501819, -1226213, 1116692, -3021510, - -667867, 1741609, -4355097, 1666447, -1687922, 1559073, -1260573, -386547, 5141076, 2218351, - 2931315, -227633, 1213328, 1883343, -384400, -1417339, -2265595, 775242, 1039382, 1825361, - 2211908, 517544, -493921, -2274185, -1028645, -2299955, -2048699, 264141, -40583144, -8274255, - -1183264, -6852621, -2899103, 5963562, 2491081, -1859721, -1666447, -4954245, -3324305, -4037269, - -4518306, -3762391, -2433099, -3412352, -5744519, -4924180, 1767379, -4997195, 1541893, -6691559, - 124554, -2819646, -2274185, 5665062, -680752, -2881923, 3624953, -4254165, 3837553, 1095217, - 4054449, 2742337, -169651, -2065879, 4271345, -139586, -753767, 3891240, -1735167, -5476084, - -6189048, -1644973, 1945620, 1219771, -1898376, -255551, -1763084, 313533, 6442, 240518, - 3747359, 1428077, -2841121, -1114544, 420907, 2351495, 483184, 3547643, 916976, -375810, - -1930588, -47629040, 41452876, -16889958, 11501922, -10823318, 2645700, -5317170, 7009387, 1327145, - 811749, -3393024, 4745939, 966368, -8566312, 869731, 1254131, -4303557, -6605660, 6521908, - 8076686, -2609193, -2147484, 1352915, 3712999, -2183991, 7352984, -229781, 1848983, -5347235, - -1917703, -3184718, 4784594, -1065152, 1026497, 1041530, -2776696, 4657892, 4443144, 1224066, - 1511829, 5461051, -3352222, -878321, -721555, -3959960, 826781, -2581275, 940598, -118112, - 326418, 4464619, -199716, -1007170, 957778, 240518, 2884071, -2701535, 992137, -169651, - 5680094, -1696512, -261993, -2239826, 31845036, -3779571, -6586333, -1524713, 4327180, 2259153, - 1984275, -180389, -4365835, 1146756, 2740189, 3094524, -1964948, -1848983, 6468221, 2246268, - -4958540, 1129576, 8353712, -10314364, 6983617, 893353, 8916352, -532576, 564788, 1795296, - 1848983, 4715874, -3377992, -1243393, 1808181, 3405909, -1258425, -30065, 496069, 843961, - 2171106, -4191888, -30065, 2544768, 773094, -2278480, -657130, 5551245, 4110284, 1990717, - -2027225, -1466731, 1649268, -633508, -1275605, 1039382, -1614908, -2564096, 5714454, 2289218, - 3700114, 648540, 2811056, 2299955, 2510409, 350040, 3023657, 1552631, 2173254, -1625645, - 474594, 869731, -2426657, 985695, -1129576, -161061, 15116137, 4400194, 3655017, -2196876, - -1468879, -4084514, -2920578, 766652, -1597728, -1999307, -5869073, 5027259, 3474629, -3639985, - 6266358, -5871221, -1778117, 2652142, -4363687, 2561948, 4069482, 6234145, 5482526, 5250598, - 2714419, -11014444, 2147, -2287070, 2211908, -1032940, 4318590, 2959233, -1425929, -2652142, - 2832531, -1939178, 7284265, 34360, 2405182, 7423851, 7067369, -5302137, 440234, -3481071, - -6365142, -646393, 1183264, -768799, -1316408, -635655, 534723, -2933463, 380105, -3427384, - -987843, -362925, 906238, 73014, -2046552, -2113124, 4410932, -1511829, 657130, 2031520, - 2426657, -1299228, -1404454, -592706, -3526168, -2325725, 352187, 820339, 35689032, -25095494, - 9148280, -9526237, -725850, -6655052, 6038724, 6000070, 1939178, 1228361, 5673652, 15582141, - -13677323, -1891933, -3549791, -5514738, 12088185, 9109626, -1853278, -8267812, 3362960, -6751689, - -5398774, -9463960, 1219771, -9691594, -3197603, 5727339, 833224, -2963528, -7999377, 25770, - -1926293, 4876936, 4481799, 2076617, -3631395, 558346, -223338, 1979980, 3867618, -2441689, - -1232656, -4329327, 6586333, -805306, 977105, 5881958, -1206886, -523986, 2349347, -2939905, - -302795, 2557653, -4359392, 1002875, -807454, -371515, -4546223, 2220498, -972810, 401579, - 1118839, -1670742, 2982855, -2336462, -607738, -4857608, 438087, -665720, 2025077, 2147484, - -55624120, 7627862, 717260, 3843996, -4329327, -6994354, -90194, 4593468, 7331509, -508954, - 11179800, 6204081, -7657927, -6837588, 5196911, 891206, -5469641, -10114648, -11594264, -7451769, - -8568460, -9584220, 1675037, 2989297, 2493229, -7103876, -6828998, 989990, -1829656, -1202591, - -949188, -5675800, 4726612, -9740986, -3667902, -1520418, -392990, 3060164, 1054415, -708670, - 4443144, -1402307, 4430259, 2527588, -3472481, 513249, 7221988, -2935610, -2933463, 150324, - 4215511, 1063004, -3045132, -3910568, 3521873, 152471, -5117454, 6953552, 7853348, 916976, - -2274185, 904091, -169651, 1636383, 3457449, -375810, 4597763, 2903398, 2622078, 2282775, - 1178969, 1896228, -2332167, -206158, -34029024, 29091960, -9728101, 6216965, -158914, 4846871, - -11778948, 4559108, -8029442, 40802, -5433134, 10922102, 9292162, 3513283, 755914, -8972187, - -5952825, -923418, -3607773, 10365904, -8469676, -335007, -4194036, 15180562, -4823249, 1359357, - -423054, 2617783, 1198296, 2607045, 1919850, -2510409, 1374390, -609885, 5308580, 818191, - 10056666, 5214091, -3231963, -680752, -1241246, 184684, -3824669, -2705830, -949188, 1793149, - 12262132, 1112397, 833224, -3367254, 5012227, -1857573, -2602750, 1612760, -2527588, 1507534, - -3141769, -6863358, 3418794, 3030100, -936303, 7157563, 1544041, 1694365, 2594160, -1930588, - 869731, 2312840, -5909875, -2796024, -433792, -2714419, 2753074, 4219806, -1584843, 7241315, - 4799626, -191126, -1962800, -1490354, -532576, 22187802, -517544, 4988605, -15109695, -2525441, - 1887638, -12193412, 953483, 16853452, -2959233, 1196148, -7630010, -10445360, 2632815, -9545565, - 14845554, -10340134, 3545496, 3498251, 7939247, 6171868, -1644973, -9227737, -1090922, -867583, - 4692252, -6474663, -1273458, -1913408, -3096672, -2207613, 4483946, 2753074, 12032351, 4073777, - -4514011, 4982162, -3307125, -3476776, 3682935, 10303627, -1509681, -5349382, -5014375, 5467494, - -161061, -7496866, -6914898, 3506841, 3255585, -3124589, -5720897, -9470403, 2583423, 3496104, - 2336462, -5357972, 3977140, 2441689, 1638530, -1917703, -614180, 2901251, -7129646, -949188, - 3090229, 3659312, -710817, 1769527, 113817, 75634376, -4754529, 3103114, 6979322, -6560563, - -2763812, -2207613, -17746804, 12019466, -1876901, -10986526, 2443837, -5607080, 6549825, 5194763, - 8308614, -2881923, 11257109, 9650792, 6193343, -9824738, 7640747, -13496935, -7939247, -9167608, - 3704409, -7030862, -1226213, -2362232, -8974334, -4851166, 7679402, -5617817, -4232691, -8568460, - 2856153, 2836826, 6513318, -3592740, 11169062, 2830384, 12725988, -1400159, 2360085, 2607045, - -6938520, 5044439, 13026636, -4413079, -300648, 3579855, -3710852, -5177583, 3137474, -5160403, - -2750927, -6760279, -4406637, 5104569, 4571993, 3088082, 4904853, 6139656, 5860483, 8778913, - 1490354, -2531883, 4589173, 3126736, 25770, -811749, 442382, -3208341, -618475, 745177, - 878321, -128849, -33474976, -65624952, 24305220, 208306, 1314260, -6582038, -7039452, -1604170, - 2222646, -4275640, 17100412, -7960722, -15008763, 850404, 906238, -2016487, -5319317, 11632919, - 2076617, -5295695, 5392332, -10419591, 13095355, -7408819, -3880503, -9012989, 14624364, -6399502, - -2175401, -8935679, -4161823, 7902740, -3773129, 8562017, -11203422, -13093208, 1013612, 2199023, - 2201171, -414464, -6805376, 1178969, 3420942, 1660005, 6743099, -111669, 10606422, 1406602, - 9936407, 13013751, 2665027, -1065152, 2407329, -7413114, -1941325, -12330851, -10977936, 3124589, - 3180423, 2063732, -824634, -3575560, -1896228, -3070902, -1737314, -3066607, -8590, -356482, - 2220498, -833224, -1501091, -4271345, -395137, -4945655, -659278, -6539088, -923418, -2486786, - -788127, -21996676, 64048700, -29231548, 13335873, -6231998, 20315196, -3246995, -9032316, -9421011, - 5304285, -2834679, -1251983, 427349, 3940633, -21577916, -10559177, -5592048, 8523363, 7164006, - 12521977, 2265595, -1954210, -2018635, 15034533, -19617264, 11306501, -9453223, -2005750, -9955734, - 15530602, 6227703, -10168335, 1322850, -4481799, 1657857, 6562710, -28138478, -11787538, 2297808, - 9839770, -5800354, 2040110, 7200513, -2969970, -3186866, -1067299, 10874857, 4256313, 1857573, - 1178969, 4189741, 12743168, -7763154, 5806796, -17952964, -3139621, 4043712, 8619999, 1623498, - 1215476, 418759, 4651450, -3511136, 502511, -1260573, -4264903, -3682935, 6674379, 6534793, - -2501819, -3388729, -11203422, -4720169, -2536178, -1995012, 8108899, -3100967, -3081639, -5458904, - -4969277, -390842, -57526792, -12431783, 5602785, -13662291, 3410204, 2480344, 8403104, -66572, - 16039555, 10462540, 5785321, -4428112, -7904888, -433792, 16971564, -14557792, -5572720, -11287174, - -268435, -30807800, -24290188, 1503239, 15045270, 20708184, 4769561, -7569880, 7054484, -6723772, - -4490389, -4587025, 2035815, 5405217, 1309965, 8044474, -6137509, -10973641, 9049496, 5937793, - 19022410, -2357937, 3088082, -2753074, 15341623, -15998753, -8033737, -3803194, -12135430, 7696582, - -5012227, 6459631, -12998719, 12932147, 12558484, 11547020, -4722317, 10234907, 545461, 3560528, - 6006512, 4267050, -5435281, 936303, -1694365, -309238, 11804718, 4400194, -5192616, 9552007, - -1552631, -8280697, -2740189, -603443, -11641509, -472446, 4859756, 6335077, 1011465, -244813, - -4808216, 1765232, 2823941, 41764260, 27180700, -8469676, 12363063, -27648852, 19542102, 7206955, - 14723148, -4960687, -3631395, -15107547, -7728794, -25868588, -4432406, -20583630, -6214818, -12659416, - -12968654, -17480516, 7015829, -23905788, 3274913, 10415296, -4556961, 3320010, -10269267, -83752, - -3171833, -3367254, -14014478, -1846836, 1666447, -912681, -2123861, -7316477, -6356552, 4380867, - 4657892, 6122476, 30492120, -12236362, -665720, 12373801, -2916283, -5029407, -11645804, 3646427, - 10378788, 17136920, 5804649, 14293651, -13896367, -20905754, 2035815, 13765370, 7720204, -11269994, - 13172665, -9869835, 6365142, 2654290, 11976516, 6779606, 4419522, 8117488, -8031589, 5188321, - 4331475, 2480344, 11763915, 2731599, 9513353, -1380832, -3758097, 1539746, 2287070, 2005750, - 11420318, -1786706, -6375879, -575526, 84140560, -54520316, -2995740, 6277095, 1657857, 6594923, - 11495480, -2364380, -1889786, 6429566, -9760313, -9330816, -1561221, 7421704, 30260192, 1232656, - 10432476, -9798968, 577673, -29996052, 18474802, -18159122, -25840670, 5963562, 7213398, -9616432, - 8585640, 3575560, 19973746, 22104050, -3710852, -8400956, -6339372, -33135672, -18068928, 25900800, - 8527658, 9504763, -14959371, -15360951, 4509716, -3012920, -13213467, 11456825, -2536178, -8289287, - -9556302, 6472516, -8564165, -4604205, 30384746, -18580028, 5598490, -6693707, 7017977, -8385924, - -3459596, -22733262, 3788161, -8443906, -5690832, 18090402, 4337917, 5016522, 10932839, 13110388, - 3876208, 9062381, -4097399, -1118839, -14950781, 6775311, 12257837, -2851858, 760209, -1406602, - -3148211, -3876208, 1329292, -3983582, -1844689, -52585432, -25993142, 9517648, -3442416, 18809810, - -2886218, -5186173, -15330886, -17145510, 8770323, -17914308, -6335077, -10243497, -2186138, -10797548, - -7475391, -8708046, -4582730, -10752451, -20255066, 11323681, -39975408, -607738, 35394824, 8499740, - -399432, -9919227, 2310693, -36172216, 14641544, 8860518, 2267743, 12820477, 19112604, -15429670, - -8248485, -16048145, 2110977, 384400, -9631464, -10924249, -12139725, -7245610, -775242, 7728794, - 420907, 6309307, 3440269, 633508, 24468428, 5774584, -4213363, 19421842, -9807558, -22411140, - -7080254, -2765959, -3440269, -1589138, -7943542, -1872606, -9846213, -2448131, -10009421, 854699, - 5014375, -10808285, -3283503, -6012954, 197569, -10954314, -13997298, -6070937, 5317170, 9614284, - 3674345, -3330747, -624918, 3622805, -2029372, -2370822, -5072357, 2104534, 4876936, 959925, - -485331, -6156836, -32371168, 43340516, -21565030, -10763188, -35631048, 27580132, -9899900, 16192027, - 895501, 854699, -10894185, 21580064, -5544803, 6927782, 5272073, -10101763, -3500398, -3373697, - -18930068, 3597035, 3302830, -14708116, -24528558, -15324443, -22574348, -5622112, 12079596, 6223408, - -13327284, -13316546, 19546396, 13363791, -17083232, 15461882, -8559870, 13660143, -21623012, -17179870, - -16503412, 5673652, -14624364, 9040906, -6648610, 3730179, -4086662, -2239826, 3304977, 15524159, - -34383360, -4501126, 6768869, -3292093, -10505490, -24910810, -2278480, 22559316, -133144, 19527068, - 14439680, 4045859, -2875481, 14869177, -14974403, -12388833, 9528385, -3760244, -9320079, 6189048, - 1797444, -7421704, -10696616, 17845590, -16836272, -9313637, -10080288, 10052371, 474594, -7402376, - -4121021, 5149666, -15539192, -141734, 4121021, 2976412, 335007, -5471789, -7567733, -74390984, - 27635968, 11678016, -18758270, 9165460, -21212844, 18985902, 16357383, 13926431, -38156488, 22988812, - 40269612, -5639292, 13636521, 573378, -12644384, -16503412, 44362716, -663572, -4009352, -24522116, - -48419312, -26248692, 2357937, -21461952, 17731772, -31748398, -10627897, -18777598, 5022965, -7391639, - -23740432, 3878356, -5568425, 15436112, -5347235, -18659486, -7252053, -56957708, 10063108, -1859721, - 26158498, -16194174, -17972290, 24421184, 5014375, 3925600, -9968619, -15339476, 5276368, 11055246, - 7941395, -4112431, 8443906, 4559108, 837519, -5102421, -5536213, -18887118, 1301375, -7584912, - -11113228, 9721658, 5360119, 27547920, 5609228, -18788334, -18932216, 3985730, -12337294, -9062381, - 2909840, -9320079, -622770, -4370129, -5656472, 5138929, -7578470, 2568391, -1133871, -1623498, - -2961380, -4217658, -9262097, -11111080, -3633542, -9594957, 62038656, -24431922, 427349, 3481071, - 25956634, -3285650, -4997195, 17815524, 30584462, -20564304, -23740432, 18590766, -3491809, 16176994, - 23435490, 19514184, 16849156, 13501230, 15923591, 60243360, -5037997, 4473209, 11778948, 33251636, - -6809671, -12135430, 12863427, -861141, -10765336, -13331578, -11609297, 350040, -15111842, 22995254, - 34688304, -1765232, -8510478, 14516989, -8332237, 20764020, 14948634, 569083, -17779018, 13668733, - -1267015, -5789616, 2924873, -2392297, 40374840, -3335042, 17641578, -8796093, 35991824, -3272765, - 3354370, -12388833, -21644488, 18388902, -10685879, 36266704, 8104604, 17231408, 300648, 268435, - 10657961, 2911988, 26040386, 14574972, 4887673, 13144747, -14991583, 5875516, 12094628, 1458141, - -4116726, 21399674, 5463199, -6809671, -6777459, 8688719, -3730179, 221191, 12195560, -3515431, - 7511898, 3135326, -6425271, 80257904, -23149874, 7524783, -7683697, 3562675, 10344429, 26970248, - -20925080, 11293617, -438087, 1445257, 14641544, -11980811, 15655156, -42292544, -19168440, 7073811, - 15747498, 11141145, 33633888, -33479270, 5226975, -5022965, -45865956, 19512036, -17841294, -11662984, - -6689412, -37673304, 12221329, 13209172, 5858336, -19668802, -32920924, 12874164, -20398948, 17798344, - -31542240, 403727, -37737732, -9302899, -25209310, -21904334, 22299470, 34699040, 4821101, 12741020, - -16039555, 6433861, -26899380, 11364483, -17671642, 4849018, 25733296, 13065291, -9081708, 15569256, - 2570538, 13475460, -11617887, 22606560, 38706244, 2044404, -23435490, -16232829, -10488310, -4329327, - 2461016, 17355962, 3416647, 28211492, -133144, 10773925, -25694642, -3826816, -18562848, -3556233, - -2798171, 5765994, -23302346, 3141769, -1816771, 6955700, 2486786, 4331475, 2317135, 1806034, - -81836304, -68650760, 29006062, -8611409, 33730524, -2624225, 11038066, -41016936, -38480760, -23401130, - 12861280, -31752694, -21906480, -9386651, 6380174, 23227184, 8293582, -46553152, 12554189, 26044682, - -66037268, -7870528, 3191161, -70104600, -24051816, 31228708, -64942052, 31825708, 33492154, 429497, - -9367324, -2647847, -15625091, -17237852, 11658689, 14347338, 48719960, -28784870, -15109695, -12098923, - -22606560, 1335735, -38596724, -9622874, 2948495, -1088774, -12554189, -1960653, -21255794, -4312147, - 11875585, -5308580, -13853417, 16114717, -7541963, -15773267, -22531398, 47972636, -1999307, 29229400, - 3861176, 10969346, 31625992, 4574140, 21545704, -14338748, 23942296, 17379586, 5207648, 6285685, - 5871221, 20869246, 9513353, 3882651, 20154134, -8557722, 2937758, -2334315, -31479962, 14733885, - 7477538, 4310000, -19275814, -5484673, 3575560, 6122476, -5546951, -132785360, 50072876, -14671608, - -59566900, -14538464, 1498944, -15406048, 22997402, -51571820, 24831354, -4161823, -59302760, -40881648, - 8113193, 23542864, 22237194, 16320876, 34911640, 9970767, 57423712, 31439160, 67306432, 8744553, - 54672788, -42127188, -33191508, 11310796, 4743792, -33416994, 9335111, 7073811, -4668630, -12745315, - 32394790, 6195491, -71526240, -31892280, 23953032, 8248485, -15189152, 20444044, 20845624, 32482838, - 6968585, 9633612, 6051609, 9427453, 11841225, -24854976, 3758097, 4561256, -52907556, 24917252, - 18326626, 22432614, -36273148, -21049634, 26416196, 25770, -7056632, -5476084, -15532749, -13711683, - 60130, -18245022, -40684076, 13825500, 43327632, -30494268, 4198331, -17336636, -7067369, -12637941, - -3968550, 22344568, 5327907, 18461916, 5345087, -19660212, -14008036, -15968688, -9597104, -13060996, - 3088082, -8282845, -1823214, -12500502, 3944928, 6468221, 7069516, -3796751, -12530567, 208306, - 55727200, 37671160, 26046830, 14158360, 1724429, -12987981, -19789062, 17467632, -55602648, 58662812, - -36359044, 9429601, -60359324, -2233383, 56760140, 22269406, -20115480, 35985384, -57342108, 22877144, - 10677289, 3979287, -70609264, -21208548, 4314295, 11325829, 45339824, -69496864, -9397388, -23113366, - -65408056, -14388140, 15665893, 32628866, 49007724, 38044820, 37900940, -3287798, -24391120, 24919400, - 7529078, -15034533, 8931384, -32003948, 50772956, 23712514, 17166984, -26555782, -58123792, -15603616, - 1307818, -70499744, -56972740, -15058155, -51105816, 32736240, 12678743, 10118943, -23551454, -25372520, - 9801115, 7028714, 4256313, 15674483, -9859097, 11815455, 33565168, 15159087, 5662915, 4443144, - -22174916, -18683108, -16700980, 9652939, -5972152, -45221712, -36120676, -3749507, -29098404, -25879326, - -7451769, -37366216, -23444078, -6008659, 1952063, -5493263, -2493229, 8727374, -7183333, -2875481, - 1943473, 1151051, -10902774, 64126008, -50034220, 13462575, -7075959, -6493991, 1174674, 17742510, - -31166430, 41717016, -12036646, 28610924, -2785286, -23214298, 44377748, 43785044, 31331786, -14654428, - 67248448, 24906516, -75183400, 77549928, 7082401, -204011, 56049324, 2493229, -24305220, -32502166, - 55323472, -34634616, -46209552, 44781476, 39049844, -25409026, -61456688, 24131274, -21086142, 8566312, - -43226700, -35414152, -14675903, 41938208, 37645388, 5005785, 34548716, -50124416, 16192027, -13149042, - -18672370, 24084030, 3395172, 7425999, -70199096, -19159850, 39092792, -50126564, -13037373, -62895500, - -11705933, -23439784, 10640781, -15129022, 7142531, 6579890, -2130304, 6418829, -16810502, -55841016, - -10520522, 28638842, -3770981, 19900730, -21509196, -48977660, -8677981, 10965052, 31260920, 7748121, - 17121888, -1681480, 7052337, 11942157, 7219840, -16922172, 4361540, -6839736, 7402376, -13441100, - 8115341, 3463891, 977105, -1367947, -11729556, -5727339, 58100172, 4460324, -16915728, -41641856, - -1421634, -19909320, 15468325, -34398392, 21852794, 13913547, -30077656, -30850750, 46512348, -54868208, - -2164664, 35403416, -39730596, 12783970, 45457932, -36193688, 31172872, 22892176, 33365454, -54949812, - 47431472, -55177444, 16608639, -42006928, 5226975, -21494164, 37342592, 1127429, 22849226, 11776800, - -39208756, -23916526, -54196044, 31587336, -36717676, 31763430, -44150116, -50266148, -84174920, 8196945, - 44160852, -6758131, -1316408, 13952201, 38059852, -12919262, 10202695, -46497316, 11798275, 61725124, - -6259915, 55963424, 73209864, -481036, 12238509, 15053860, -31312460, 16243566, -37931004, -1902671, - -38933880, -37718404, 2179696, -14287209, -63952064, 43323336, 987843, 32231582, -37761352, -19250044, - -14471892, 16533477, -410169, -9964324, -9987946, -6429566, -2501819, 3693672, 4078072, -7574175, - 8630737, -8688719, -8701604, -4801774, 12204150, 9154723, 10136123, -4956393, 7625715, -131593504, - 33462090, 49362060, 13741748, -56981332, -8289287, 92913024, -106629008, -2622078, -17931488, -69694432, - -17527762, -47195248, 17398912, 17328046, 40873056, 16632261, -55710020, -19703162, 40291088, -63552632, - -18010946, -67972152, 58177480, 17549236, 45524504, 77560664, -27204322, -16230681, -12687333, -38680476, - 37245956, -18079664, -46130096, -51709260, -8985072, 20010252, -1348620, 10713796, 12745315, 30283814, - -13146895, -1275605, 22466974, -21421150, 43958992, 50038516, 47180216, -38001872, 5231270, -11740293, - 22640920, 94263792, 70708048, 134879152, 10823318, 53429392, 43233140, -20298016, -4496831, -6878390, - -12429635, 17190606, 4110284, 48681308, 36672580, -16254304, -4814659, -28619514, -56403660, 22913650, - -665720, 19520626, -3959960, -38895224, -5574868, 6092411, -21670258, 13417478, -13763223, -18775450, - 689342, -18814104, 66572, -5065914, -4550518, 350040, 3062312, -11669426, 1827509, 977105, - 90194, 4980015, 204264352, 98490040, 35010424, 31533650, -48687748, 31220118, -39356932, 46812996, - 38306812, 35914516, 9079561, -67033704, -37595996, 72855528, 12466143, -4355097, -15637976, 81570016, - -88701816, -37364068, -22411140, -6734509, -62895500, 14804752, -54385024, -30399778, 8748848, -34477848, - 50435800, -48960480, -21296596, -12154757, 53916872, -90067608, -17538498, -67072356, -2149631, -496069, - -58995672, 9466108, 45947560, 24874304, -1324997, -27781996, 2229088, 27601608, -37220188, 74152608, - 100785704, -6549825, -63071596, -59365036, 41394896, -15206332, -13900662, 86745456, -18762564, 27550068, - -2649995, 54470924, -11227045, 6929930, -10765336, -34832184, -96855808, -57921928, -9341554, -26134876, - -66849020, -44012676, 24779814, 55877524, -4900558, -7406671, -6262063, -9219147, 30444876, 19228568, - 4114579, -19061064, 21270826, -12646531, -44424996, -42498700, 5214091, 28834262, -34694744, 22466974, - -2478196, -13411035, -11759620, 695785, -19512036, -15088220, 590558, -5950677, -3139621, }, + -40802, -150324, 8590, -96637, 221191, 146029, -695785, 8590, -453119, -541166, + 143881, 450972, 440234, 158914, -994285, -609885, 199716, -311385, 53687, 199716, + 259846, 412317, -300648, -335007, -616328, -360777, 0, -1402307, -25770, -139586, + -401579, 285615, -796716, -697932, -1406602, -197569, -1234803, -382252, -25770, 979253, + 274878, 743029, -375810, 783832, -201863, 154619, 685047, 4189741, -3266323, 2046552, + -2579128, 1329292, -1254131, -1236951, -740882, -700080, 764504, 874026, -3195456, -167504, + 481036, -313533, -528281, -1868311, -674310, 1344325, 2035815, 1022202, 3204046, 654983, + -558346, 661425, 562641, -319975, 1054415, 2278480, -861141, -17180, 979253, -23622, + -208306, -1619203, -51540, 831076, 672162, 139586, 57982, -534723, 586263, -53687, + 83752, 38655, -543313, 15180562, -979253, 1331440, -951335, 987843, -1142461, 251256, + -272730, -259846, 880468, -792421, -2744484, 803159, 294205, 861141, 1872606, 1005022, + 678605, -240518, -1586990, -539018, 743029, -208306, -249108, 1565516, -1964948, -618475, + -23622, -328565, -478889, 758062, 831076, 1024350, 296353, 371515, -405874, 1417339, + -53687, 1090922, 770947, -242666, -130997, 521839, 21475, -294205, -135291, 25770, + 11151883, -10651519, 1672890, -2877628, 1544041, -193274, 1114544, -1020055, 2005750, -850404, + 1215476, -2542621, 100932, -1475321, 423054, -231928, -347892, -682900, -1872606, -188979, + 221191, -921271, 1533303, -691490, -1114544, -1406602, 841814, -899796, 2179696, -227633, + 6442, 644245, 8590, 49392, -972810, -816044, -227633, 223338, -373662, -936303, + 831076, 599148, 1496796, -345745, 491774, -206158, 277025, -26160646, 3068754, -1962800, + 55835, -304943, -2194728, 2370822, -586263, 210453, 1002875, 302795, 2748779, -137439, + -1123134, 3296388, 1331440, 2974265, -62277, -3947075, -2362232, -1904818, 1627793, -2059437, + 171799, -751619, -697932, 236223, 612033, -601295, -1239098, -923418, 796716, 897648, + 1720134, -141734, -240518, -111669, 1065152, -1198296, 309238, 468151, 788127, -977105, + 1017907, -1185411, -210453, 390842, -33039036, 11974369, -4825396, 5538361, -3846143, 2542621, + -4168266, 2370822, -3094524, 1198296, 2304250, 118112, 884763, 2113124, -1357210, 1520418, + -1741609, -1282048, -3843996, 3508988, -2257005, 2353642, 178241, -6442, -3687230, -126702, + 715112, -517544, -118112, -128849, 1544041, -221191, -1078037, 1172526, 358630, -461709, + 81604, 60130, 137439, 680752, -992137, 2572686, -201863, -1597728, -161061, -865436, + -85899, 1662152, 15060303, -3195456, 5735929, -2581275, 1990717, -2087354, 7138236, -1333587, + 3822521, -399432, -246961, 996432, 27917, -4846871, 1140314, -403727, -2171106, -496069, + 113817, -6105296, -139586, 545461, 1973538, -8590, -1138166, -197569, 2134599, 427349, + -1013612, -2025077, 3191161, -1919850, -47245, -2879776, -294205, 51540, 536871, -665720, + 803159, 1307818, -1211181, 1047972, -19327, 846109, -17180, 1494649, -704375, -392990, + 1331440, 39653284, -11557757, 1728724, -1956358, 2611340, 32212, -25770, -5327907, 2394444, + -2325725, 1638530, 575526, 843961, 1724429, 2686502, 418759, 940598, -4481799, 1655710, + 1664300, -2879776, -556198, 3047279, 1971390, 1949915, 4316442, 2424509, 633508, 1155346, + -1610613, 1380832, -382252, 2493229, 3227668, -442382, 1090922, 2040110, -850404, 712965, + -2804614, -743029, 2808909, 60130, -1969243, -661425, 848256, 2093797, -146029, 1191853, + -15032, 2811056, -21210696, 8916352, -6191196, 4028679, -3685082, 4756677, -3111704, 188979, + -2649995, -3262028, -4556961, 304943, -2710124, 1297080, 1509681, 3418794, -5622112, 3446711, + -1352915, 4791036, 1043677, -298500, 367220, 354335, -1146756, -977105, 717260, -2304250, + 1492501, 2701535, -3704409, -831076, -234076, 1466731, -1421634, 3869766, -4067334, 766652, + -19327, 225486, -1756642, 255551, -1108102, 1007170, 143881, 176094, -1254131, -238371, + -2585570, -893353, -161061, 543313, 184684, -964220, -3268470, -34190088, 10825465, -7007239, + -476741, -1434519, 2128156, -5909875, 405874, 1864016, 1539746, -2072322, 1157494, -2643552, + -4335770, -1698660, 530428, -2598455, 9051644, 236223, -2529736, -837519, -3045132, -1432372, + 2755222, 1644973, 3577708, -339302, 1586990, -2040110, 818191, -1846836, -639950, -1086627, + 588411, 1108102, -590558, -1752347, 414464, 642098, 2471754, -446677, -929860, -3251290, + -2662880, -1273458, -528281, 597000, 423054, -1337882, -564788, 229781, 1172526, 605590, + 191126, -592706, 1191853, -32916630, 15425375, -7292855, 6876243, -3607773, 4067334, 2007897, + 1232656, -3758097, 442382, -1921998, 545461, -4915590, 1827509, 3053722, 979253, -5231270, + -2600603, -2639258, -2746632, -1806034, 3723737, 882616, 2617783, 2095944, -938450, -227633, + -3955665, 5070209, -1462436, -528281, 311385, -1103807, -1576253, -1857573, -433792, -4157528, + 1215476, -2211908, 1642825, 1432372, 2364380, -657130, 249108, -2703682, 1005022, 1971390, + 461709, -453119, 388695, 1539746, 2306398, 996432, 2143189, 88047, 322123, 10683731, + 13217762, -5970005, 3541201, -1836099, 1329292, -1419487, 762357, 1166084, 6472516, -2289218, + 2669322, 6083821, -1655710, -244813, -1024350, 1479616, 3141769, 3223373, 4187593, 1133871, + 3564823, -906238, -2104534, -7125351, 1503239, -1078037, -3577708, -2549063, -120259, -672162, + 2302103, -326418, -4136054, -4267050, 1151051, -3706557, 500364, 2261300, -3332895, -2229088, + -1415192, 1662152, 1505386, -105227, -438087, 2499671, 534723, -959925, 1005022, -2149631, + 274878, -1131724, -1619203, -1090922, 1700807, -863288, 1284195, -955630, -2078764, 571231, + 1155346, -727997, 38029788, -13234942, 7181186, -4960687, 7138236, -5029407, 4378719, -1625645, + 4447439, 1082332, 3131031, -3635690, 3734474, -1273458, -3098819, -317828, -3328600, -5312875, + -2804614, -575526, 2699387, -3637837, -4868346, -5963562, -1069447, -519691, 4776004, 2617783, + 3068754, -2093797, 2482491, -1891933, -1859721, -1022202, 3150359, 2720862, 850404, -17180, + -111669, 90194, -880468, -493921, 2181844, 427349, 5364414, -2052994, -644245, -4466766, + 2929168, -1163936, -693637, -1050120, -277025, 264141, -743029, 818191, -1196148, 19327, + -1696512, -745177, 380105, 1752347, -908386, 10683731, -16320876, 9569187, -6105296, 7432441, + -83752, 4614943, 1303523, -7155416, -3393024, -2411624, 876173, 1793149, 1002875, 8078834, + -4541928, 6455336, 1125281, 820339, -4415227, -957778, 5581310, -367220, -4737349, 5394479, + 4121021, 912681, -2220498, -1754494, -470299, -375810, 2501819, -1226213, 1116692, -3021510, + -667867, 1741609, -4355097, 1666447, -1687922, 1559073, -1260573, -386547, 5141076, 2218351, + 2931315, -227633, 1213328, 1883343, -384400, -1417339, -2265595, 775242, 1039382, 1825361, + 2211908, 517544, -493921, -2274185, -1028645, -2299955, -2048699, 264141, -40583144, -8274255, + -1183264, -6852621, -2899103, 5963562, 2491081, -1859721, -1666447, -4954245, -3324305, -4037269, + -4518306, -3762391, -2433099, -3412352, -5744519, -4924180, 1767379, -4997195, 1541893, -6691559, + 124554, -2819646, -2274185, 5665062, -680752, -2881923, 3624953, -4254165, 3837553, 1095217, + 4054449, 2742337, -169651, -2065879, 4271345, -139586, -753767, 3891240, -1735167, -5476084, + -6189048, -1644973, 1945620, 1219771, -1898376, -255551, -1763084, 313533, 6442, 240518, + 3747359, 1428077, -2841121, -1114544, 420907, 2351495, 483184, 3547643, 916976, -375810, + -1930588, -47629040, 41452876, -16889958, 11501922, -10823318, 2645700, -5317170, 7009387, 1327145, + 811749, -3393024, 4745939, 966368, -8566312, 869731, 1254131, -4303557, -6605660, 6521908, + 8076686, -2609193, -2147484, 1352915, 3712999, -2183991, 7352984, -229781, 1848983, -5347235, + -1917703, -3184718, 4784594, -1065152, 1026497, 1041530, -2776696, 4657892, 4443144, 1224066, + 1511829, 5461051, -3352222, -878321, -721555, -3959960, 826781, -2581275, 940598, -118112, + 326418, 4464619, -199716, -1007170, 957778, 240518, 2884071, -2701535, 992137, -169651, + 5680094, -1696512, -261993, -2239826, 31845036, -3779571, -6586333, -1524713, 4327180, 2259153, + 1984275, -180389, -4365835, 1146756, 2740189, 3094524, -1964948, -1848983, 6468221, 2246268, + -4958540, 1129576, 8353712, -10314364, 6983617, 893353, 8916352, -532576, 564788, 1795296, + 1848983, 4715874, -3377992, -1243393, 1808181, 3405909, -1258425, -30065, 496069, 843961, + 2171106, -4191888, -30065, 2544768, 773094, -2278480, -657130, 5551245, 4110284, 1990717, + -2027225, -1466731, 1649268, -633508, -1275605, 1039382, -1614908, -2564096, 5714454, 2289218, + 3700114, 648540, 2811056, 2299955, 2510409, 350040, 3023657, 1552631, 2173254, -1625645, + 474594, 869731, -2426657, 985695, -1129576, -161061, 15116137, 4400194, 3655017, -2196876, + -1468879, -4084514, -2920578, 766652, -1597728, -1999307, -5869073, 5027259, 3474629, -3639985, + 6266358, -5871221, -1778117, 2652142, -4363687, 2561948, 4069482, 6234145, 5482526, 5250598, + 2714419, -11014444, 2147, -2287070, 2211908, -1032940, 4318590, 2959233, -1425929, -2652142, + 2832531, -1939178, 7284265, 34360, 2405182, 7423851, 7067369, -5302137, 440234, -3481071, + -6365142, -646393, 1183264, -768799, -1316408, -635655, 534723, -2933463, 380105, -3427384, + -987843, -362925, 906238, 73014, -2046552, -2113124, 4410932, -1511829, 657130, 2031520, + 2426657, -1299228, -1404454, -592706, -3526168, -2325725, 352187, 820339, 35689032, -25095494, + 9148280, -9526237, -725850, -6655052, 6038724, 6000070, 1939178, 1228361, 5673652, 15582141, + -13677323, -1891933, -3549791, -5514738, 12088185, 9109626, -1853278, -8267812, 3362960, -6751689, + -5398774, -9463960, 1219771, -9691594, -3197603, 5727339, 833224, -2963528, -7999377, 25770, + -1926293, 4876936, 4481799, 2076617, -3631395, 558346, -223338, 1979980, 3867618, -2441689, + -1232656, -4329327, 6586333, -805306, 977105, 5881958, -1206886, -523986, 2349347, -2939905, + -302795, 2557653, -4359392, 1002875, -807454, -371515, -4546223, 2220498, -972810, 401579, + 1118839, -1670742, 2982855, -2336462, -607738, -4857608, 438087, -665720, 2025077, 2147484, + -55624120, 7627862, 717260, 3843996, -4329327, -6994354, -90194, 4593468, 7331509, -508954, + 11179800, 6204081, -7657927, -6837588, 5196911, 891206, -5469641, -10114648, -11594264, -7451769, + -8568460, -9584220, 1675037, 2989297, 2493229, -7103876, -6828998, 989990, -1829656, -1202591, + -949188, -5675800, 4726612, -9740986, -3667902, -1520418, -392990, 3060164, 1054415, -708670, + 4443144, -1402307, 4430259, 2527588, -3472481, 513249, 7221988, -2935610, -2933463, 150324, + 4215511, 1063004, -3045132, -3910568, 3521873, 152471, -5117454, 6953552, 7853348, 916976, + -2274185, 904091, -169651, 1636383, 3457449, -375810, 4597763, 2903398, 2622078, 2282775, + 1178969, 1896228, -2332167, -206158, -34029024, 29091960, -9728101, 6216965, -158914, 4846871, + -11778948, 4559108, -8029442, 40802, -5433134, 10922102, 9292162, 3513283, 755914, -8972187, + -5952825, -923418, -3607773, 10365904, -8469676, -335007, -4194036, 15180562, -4823249, 1359357, + -423054, 2617783, 1198296, 2607045, 1919850, -2510409, 1374390, -609885, 5308580, 818191, + 10056666, 5214091, -3231963, -680752, -1241246, 184684, -3824669, -2705830, -949188, 1793149, + 12262132, 1112397, 833224, -3367254, 5012227, -1857573, -2602750, 1612760, -2527588, 1507534, + -3141769, -6863358, 3418794, 3030100, -936303, 7157563, 1544041, 1694365, 2594160, -1930588, + 869731, 2312840, -5909875, -2796024, -433792, -2714419, 2753074, 4219806, -1584843, 7241315, + 4799626, -191126, -1962800, -1490354, -532576, 22187802, -517544, 4988605, -15109695, -2525441, + 1887638, -12193412, 953483, 16853452, -2959233, 1196148, -7630010, -10445360, 2632815, -9545565, + 14845554, -10340134, 3545496, 3498251, 7939247, 6171868, -1644973, -9227737, -1090922, -867583, + 4692252, -6474663, -1273458, -1913408, -3096672, -2207613, 4483946, 2753074, 12032351, 4073777, + -4514011, 4982162, -3307125, -3476776, 3682935, 10303627, -1509681, -5349382, -5014375, 5467494, + -161061, -7496866, -6914898, 3506841, 3255585, -3124589, -5720897, -9470403, 2583423, 3496104, + 2336462, -5357972, 3977140, 2441689, 1638530, -1917703, -614180, 2901251, -7129646, -949188, + 3090229, 3659312, -710817, 1769527, 113817, 75634376, -4754529, 3103114, 6979322, -6560563, + -2763812, -2207613, -17746804, 12019466, -1876901, -10986526, 2443837, -5607080, 6549825, 5194763, + 8308614, -2881923, 11257109, 9650792, 6193343, -9824738, 7640747, -13496935, -7939247, -9167608, + 3704409, -7030862, -1226213, -2362232, -8974334, -4851166, 7679402, -5617817, -4232691, -8568460, + 2856153, 2836826, 6513318, -3592740, 11169062, 2830384, 12725988, -1400159, 2360085, 2607045, + -6938520, 5044439, 13026636, -4413079, -300648, 3579855, -3710852, -5177583, 3137474, -5160403, + -2750927, -6760279, -4406637, 5104569, 4571993, 3088082, 4904853, 6139656, 5860483, 8778913, + 1490354, -2531883, 4589173, 3126736, 25770, -811749, 442382, -3208341, -618475, 745177, + 878321, -128849, -33474976, -65624952, 24305220, 208306, 1314260, -6582038, -7039452, -1604170, + 2222646, -4275640, 17100412, -7960722, -15008763, 850404, 906238, -2016487, -5319317, 11632919, + 2076617, -5295695, 5392332, -10419591, 13095355, -7408819, -3880503, -9012989, 14624364, -6399502, + -2175401, -8935679, -4161823, 7902740, -3773129, 8562017, -11203422, -13093208, 1013612, 2199023, + 2201171, -414464, -6805376, 1178969, 3420942, 1660005, 6743099, -111669, 10606422, 1406602, + 9936407, 13013751, 2665027, -1065152, 2407329, -7413114, -1941325, -12330851, -10977936, 3124589, + 3180423, 2063732, -824634, -3575560, -1896228, -3070902, -1737314, -3066607, -8590, -356482, + 2220498, -833224, -1501091, -4271345, -395137, -4945655, -659278, -6539088, -923418, -2486786, + -788127, -21996676, 64048700, -29231548, 13335873, -6231998, 20315196, -3246995, -9032316, -9421011, + 5304285, -2834679, -1251983, 427349, 3940633, -21577916, -10559177, -5592048, 8523363, 7164006, + 12521977, 2265595, -1954210, -2018635, 15034533, -19617264, 11306501, -9453223, -2005750, -9955734, + 15530602, 6227703, -10168335, 1322850, -4481799, 1657857, 6562710, -28138478, -11787538, 2297808, + 9839770, -5800354, 2040110, 7200513, -2969970, -3186866, -1067299, 10874857, 4256313, 1857573, + 1178969, 4189741, 12743168, -7763154, 5806796, -17952964, -3139621, 4043712, 8619999, 1623498, + 1215476, 418759, 4651450, -3511136, 502511, -1260573, -4264903, -3682935, 6674379, 6534793, + -2501819, -3388729, -11203422, -4720169, -2536178, -1995012, 8108899, -3100967, -3081639, -5458904, + -4969277, -390842, -57526792, -12431783, 5602785, -13662291, 3410204, 2480344, 8403104, -66572, + 16039555, 10462540, 5785321, -4428112, -7904888, -433792, 16971564, -14557792, -5572720, -11287174, + -268435, -30807800, -24290188, 1503239, 15045270, 20708184, 4769561, -7569880, 7054484, -6723772, + -4490389, -4587025, 2035815, 5405217, 1309965, 8044474, -6137509, -10973641, 9049496, 5937793, + 19022410, -2357937, 3088082, -2753074, 15341623, -15998753, -8033737, -3803194, -12135430, 7696582, + -5012227, 6459631, -12998719, 12932147, 12558484, 11547020, -4722317, 10234907, 545461, 3560528, + 6006512, 4267050, -5435281, 936303, -1694365, -309238, 11804718, 4400194, -5192616, 9552007, + -1552631, -8280697, -2740189, -603443, -11641509, -472446, 4859756, 6335077, 1011465, -244813, + -4808216, 1765232, 2823941, 41764260, 27180700, -8469676, 12363063, -27648852, 19542102, 7206955, + 14723148, -4960687, -3631395, -15107547, -7728794, -25868588, -4432406, -20583630, -6214818, -12659416, + -12968654, -17480516, 7015829, -23905788, 3274913, 10415296, -4556961, 3320010, -10269267, -83752, + -3171833, -3367254, -14014478, -1846836, 1666447, -912681, -2123861, -7316477, -6356552, 4380867, + 4657892, 6122476, 30492120, -12236362, -665720, 12373801, -2916283, -5029407, -11645804, 3646427, + 10378788, 17136920, 5804649, 14293651, -13896367, -20905754, 2035815, 13765370, 7720204, -11269994, + 13172665, -9869835, 6365142, 2654290, 11976516, 6779606, 4419522, 8117488, -8031589, 5188321, + 4331475, 2480344, 11763915, 2731599, 9513353, -1380832, -3758097, 1539746, 2287070, 2005750, + 11420318, -1786706, -6375879, -575526, 84140560, -54520316, -2995740, 6277095, 1657857, 6594923, + 11495480, -2364380, -1889786, 6429566, -9760313, -9330816, -1561221, 7421704, 30260192, 1232656, + 10432476, -9798968, 577673, -29996052, 18474802, -18159122, -25840670, 5963562, 7213398, -9616432, + 8585640, 3575560, 19973746, 22104050, -3710852, -8400956, -6339372, -33135672, -18068928, 25900800, + 8527658, 9504763, -14959371, -15360951, 4509716, -3012920, -13213467, 11456825, -2536178, -8289287, + -9556302, 6472516, -8564165, -4604205, 30384746, -18580028, 5598490, -6693707, 7017977, -8385924, + -3459596, -22733262, 3788161, -8443906, -5690832, 18090402, 4337917, 5016522, 10932839, 13110388, + 3876208, 9062381, -4097399, -1118839, -14950781, 6775311, 12257837, -2851858, 760209, -1406602, + -3148211, -3876208, 1329292, -3983582, -1844689, -52585432, -25993142, 9517648, -3442416, 18809810, + -2886218, -5186173, -15330886, -17145510, 8770323, -17914308, -6335077, -10243497, -2186138, -10797548, + -7475391, -8708046, -4582730, -10752451, -20255066, 11323681, -39975408, -607738, 35394824, 8499740, + -399432, -9919227, 2310693, -36172216, 14641544, 8860518, 2267743, 12820477, 19112604, -15429670, + -8248485, -16048145, 2110977, 384400, -9631464, -10924249, -12139725, -7245610, -775242, 7728794, + 420907, 6309307, 3440269, 633508, 24468428, 5774584, -4213363, 19421842, -9807558, -22411140, + -7080254, -2765959, -3440269, -1589138, -7943542, -1872606, -9846213, -2448131, -10009421, 854699, + 5014375, -10808285, -3283503, -6012954, 197569, -10954314, -13997298, -6070937, 5317170, 9614284, + 3674345, -3330747, -624918, 3622805, -2029372, -2370822, -5072357, 2104534, 4876936, 959925, + -485331, -6156836, -32371168, 43340516, -21565030, -10763188, -35631048, 27580132, -9899900, 16192027, + 895501, 854699, -10894185, 21580064, -5544803, 6927782, 5272073, -10101763, -3500398, -3373697, + -18930068, 3597035, 3302830, -14708116, -24528558, -15324443, -22574348, -5622112, 12079596, 6223408, + -13327284, -13316546, 19546396, 13363791, -17083232, 15461882, -8559870, 13660143, -21623012, -17179870, + -16503412, 5673652, -14624364, 9040906, -6648610, 3730179, -4086662, -2239826, 3304977, 15524159, + -34383360, -4501126, 6768869, -3292093, -10505490, -24910810, -2278480, 22559316, -133144, 19527068, + 14439680, 4045859, -2875481, 14869177, -14974403, -12388833, 9528385, -3760244, -9320079, 6189048, + 1797444, -7421704, -10696616, 17845590, -16836272, -9313637, -10080288, 10052371, 474594, -7402376, + -4121021, 5149666, -15539192, -141734, 4121021, 2976412, 335007, -5471789, -7567733, -74390984, + 27635968, 11678016, -18758270, 9165460, -21212844, 18985902, 16357383, 13926431, -38156488, 22988812, + 40269612, -5639292, 13636521, 573378, -12644384, -16503412, 44362716, -663572, -4009352, -24522116, + -48419312, -26248692, 2357937, -21461952, 17731772, -31748398, -10627897, -18777598, 5022965, -7391639, + -23740432, 3878356, -5568425, 15436112, -5347235, -18659486, -7252053, -56957708, 10063108, -1859721, + 26158498, -16194174, -17972290, 24421184, 5014375, 3925600, -9968619, -15339476, 5276368, 11055246, + 7941395, -4112431, 8443906, 4559108, 837519, -5102421, -5536213, -18887118, 1301375, -7584912, + -11113228, 9721658, 5360119, 27547920, 5609228, -18788334, -18932216, 3985730, -12337294, -9062381, + 2909840, -9320079, -622770, -4370129, -5656472, 5138929, -7578470, 2568391, -1133871, -1623498, + -2961380, -4217658, -9262097, -11111080, -3633542, -9594957, 62038656, -24431922, 427349, 3481071, + 25956634, -3285650, -4997195, 17815524, 30584462, -20564304, -23740432, 18590766, -3491809, 16176994, + 23435490, 19514184, 16849156, 13501230, 15923591, 60243360, -5037997, 4473209, 11778948, 33251636, + -6809671, -12135430, 12863427, -861141, -10765336, -13331578, -11609297, 350040, -15111842, 22995254, + 34688304, -1765232, -8510478, 14516989, -8332237, 20764020, 14948634, 569083, -17779018, 13668733, + -1267015, -5789616, 2924873, -2392297, 40374840, -3335042, 17641578, -8796093, 35991824, -3272765, + 3354370, -12388833, -21644488, 18388902, -10685879, 36266704, 8104604, 17231408, 300648, 268435, + 10657961, 2911988, 26040386, 14574972, 4887673, 13144747, -14991583, 5875516, 12094628, 1458141, + -4116726, 21399674, 5463199, -6809671, -6777459, 8688719, -3730179, 221191, 12195560, -3515431, + 7511898, 3135326, -6425271, 80257904, -23149874, 7524783, -7683697, 3562675, 10344429, 26970248, + -20925080, 11293617, -438087, 1445257, 14641544, -11980811, 15655156, -42292544, -19168440, 7073811, + 15747498, 11141145, 33633888, -33479270, 5226975, -5022965, -45865956, 19512036, -17841294, -11662984, + -6689412, -37673304, 12221329, 13209172, 5858336, -19668802, -32920924, 12874164, -20398948, 17798344, + -31542240, 403727, -37737732, -9302899, -25209310, -21904334, 22299470, 34699040, 4821101, 12741020, + -16039555, 6433861, -26899380, 11364483, -17671642, 4849018, 25733296, 13065291, -9081708, 15569256, + 2570538, 13475460, -11617887, 22606560, 38706244, 2044404, -23435490, -16232829, -10488310, -4329327, + 2461016, 17355962, 3416647, 28211492, -133144, 10773925, -25694642, -3826816, -18562848, -3556233, + -2798171, 5765994, -23302346, 3141769, -1816771, 6955700, 2486786, 4331475, 2317135, 1806034, + -81836304, -68650760, 29006062, -8611409, 33730524, -2624225, 11038066, -41016936, -38480760, -23401130, + 12861280, -31752694, -21906480, -9386651, 6380174, 23227184, 8293582, -46553152, 12554189, 26044682, + -66037268, -7870528, 3191161, -70104600, -24051816, 31228708, -64942052, 31825708, 33492154, 429497, + -9367324, -2647847, -15625091, -17237852, 11658689, 14347338, 48719960, -28784870, -15109695, -12098923, + -22606560, 1335735, -38596724, -9622874, 2948495, -1088774, -12554189, -1960653, -21255794, -4312147, + 11875585, -5308580, -13853417, 16114717, -7541963, -15773267, -22531398, 47972636, -1999307, 29229400, + 3861176, 10969346, 31625992, 4574140, 21545704, -14338748, 23942296, 17379586, 5207648, 6285685, + 5871221, 20869246, 9513353, 3882651, 20154134, -8557722, 2937758, -2334315, -31479962, 14733885, + 7477538, 4310000, -19275814, -5484673, 3575560, 6122476, -5546951, -132785360, 50072876, -14671608, + -59566900, -14538464, 1498944, -15406048, 22997402, -51571820, 24831354, -4161823, -59302760, -40881648, + 8113193, 23542864, 22237194, 16320876, 34911640, 9970767, 57423712, 31439160, 67306432, 8744553, + 54672788, -42127188, -33191508, 11310796, 4743792, -33416994, 9335111, 7073811, -4668630, -12745315, + 32394790, 6195491, -71526240, -31892280, 23953032, 8248485, -15189152, 20444044, 20845624, 32482838, + 6968585, 9633612, 6051609, 9427453, 11841225, -24854976, 3758097, 4561256, -52907556, 24917252, + 18326626, 22432614, -36273148, -21049634, 26416196, 25770, -7056632, -5476084, -15532749, -13711683, + 60130, -18245022, -40684076, 13825500, 43327632, -30494268, 4198331, -17336636, -7067369, -12637941, + -3968550, 22344568, 5327907, 18461916, 5345087, -19660212, -14008036, -15968688, -9597104, -13060996, + 3088082, -8282845, -1823214, -12500502, 3944928, 6468221, 7069516, -3796751, -12530567, 208306, + 55727200, 37671160, 26046830, 14158360, 1724429, -12987981, -19789062, 17467632, -55602648, 58662812, + -36359044, 9429601, -60359324, -2233383, 56760140, 22269406, -20115480, 35985384, -57342108, 22877144, + 10677289, 3979287, -70609264, -21208548, 4314295, 11325829, 45339824, -69496864, -9397388, -23113366, + -65408056, -14388140, 15665893, 32628866, 49007724, 38044820, 37900940, -3287798, -24391120, 24919400, + 7529078, -15034533, 8931384, -32003948, 50772956, 23712514, 17166984, -26555782, -58123792, -15603616, + 1307818, -70499744, -56972740, -15058155, -51105816, 32736240, 12678743, 10118943, -23551454, -25372520, + 9801115, 7028714, 4256313, 15674483, -9859097, 11815455, 33565168, 15159087, 5662915, 4443144, + -22174916, -18683108, -16700980, 9652939, -5972152, -45221712, -36120676, -3749507, -29098404, -25879326, + -7451769, -37366216, -23444078, -6008659, 1952063, -5493263, -2493229, 8727374, -7183333, -2875481, + 1943473, 1151051, -10902774, 64126008, -50034220, 13462575, -7075959, -6493991, 1174674, 17742510, + -31166430, 41717016, -12036646, 28610924, -2785286, -23214298, 44377748, 43785044, 31331786, -14654428, + 67248448, 24906516, -75183400, 77549928, 7082401, -204011, 56049324, 2493229, -24305220, -32502166, + 55323472, -34634616, -46209552, 44781476, 39049844, -25409026, -61456688, 24131274, -21086142, 8566312, + -43226700, -35414152, -14675903, 41938208, 37645388, 5005785, 34548716, -50124416, 16192027, -13149042, + -18672370, 24084030, 3395172, 7425999, -70199096, -19159850, 39092792, -50126564, -13037373, -62895500, + -11705933, -23439784, 10640781, -15129022, 7142531, 6579890, -2130304, 6418829, -16810502, -55841016, + -10520522, 28638842, -3770981, 19900730, -21509196, -48977660, -8677981, 10965052, 31260920, 7748121, + 17121888, -1681480, 7052337, 11942157, 7219840, -16922172, 4361540, -6839736, 7402376, -13441100, + 8115341, 3463891, 977105, -1367947, -11729556, -5727339, 58100172, 4460324, -16915728, -41641856, + -1421634, -19909320, 15468325, -34398392, 21852794, 13913547, -30077656, -30850750, 46512348, -54868208, + -2164664, 35403416, -39730596, 12783970, 45457932, -36193688, 31172872, 22892176, 33365454, -54949812, + 47431472, -55177444, 16608639, -42006928, 5226975, -21494164, 37342592, 1127429, 22849226, 11776800, + -39208756, -23916526, -54196044, 31587336, -36717676, 31763430, -44150116, -50266148, -84174920, 8196945, + 44160852, -6758131, -1316408, 13952201, 38059852, -12919262, 10202695, -46497316, 11798275, 61725124, + -6259915, 55963424, 73209864, -481036, 12238509, 15053860, -31312460, 16243566, -37931004, -1902671, + -38933880, -37718404, 2179696, -14287209, -63952064, 43323336, 987843, 32231582, -37761352, -19250044, + -14471892, 16533477, -410169, -9964324, -9987946, -6429566, -2501819, 3693672, 4078072, -7574175, + 8630737, -8688719, -8701604, -4801774, 12204150, 9154723, 10136123, -4956393, 7625715, -131593504, + 33462090, 49362060, 13741748, -56981332, -8289287, 92913024, -106629008, -2622078, -17931488, -69694432, + -17527762, -47195248, 17398912, 17328046, 40873056, 16632261, -55710020, -19703162, 40291088, -63552632, + -18010946, -67972152, 58177480, 17549236, 45524504, 77560664, -27204322, -16230681, -12687333, -38680476, + 37245956, -18079664, -46130096, -51709260, -8985072, 20010252, -1348620, 10713796, 12745315, 30283814, + -13146895, -1275605, 22466974, -21421150, 43958992, 50038516, 47180216, -38001872, 5231270, -11740293, + 22640920, 94263792, 70708048, 134879152, 10823318, 53429392, 43233140, -20298016, -4496831, -6878390, + -12429635, 17190606, 4110284, 48681308, 36672580, -16254304, -4814659, -28619514, -56403660, 22913650, + -665720, 19520626, -3959960, -38895224, -5574868, 6092411, -21670258, 13417478, -13763223, -18775450, + 689342, -18814104, 66572, -5065914, -4550518, 350040, 3062312, -11669426, 1827509, 977105, + 90194, 4980015, 204264352, 98490040, 35010424, 31533650, -48687748, 31220118, -39356932, 46812996, + 38306812, 35914516, 9079561, -67033704, -37595996, 72855528, 12466143, -4355097, -15637976, 81570016, + -88701816, -37364068, -22411140, -6734509, -62895500, 14804752, -54385024, -30399778, 8748848, -34477848, + 50435800, -48960480, -21296596, -12154757, 53916872, -90067608, -17538498, -67072356, -2149631, -496069, + -58995672, 9466108, 45947560, 24874304, -1324997, -27781996, 2229088, 27601608, -37220188, 74152608, + 100785704, -6549825, -63071596, -59365036, 41394896, -15206332, -13900662, 86745456, -18762564, 27550068, + -2649995, 54470924, -11227045, 6929930, -10765336, -34832184, -96855808, -57921928, -9341554, -26134876, + -66849020, -44012676, 24779814, 55877524, -4900558, -7406671, -6262063, -9219147, 30444876, 19228568, + 4114579, -19061064, 21270826, -12646531, -44424996, -42498700, 5214091, 28834262, -34694744, 22466974, + -2478196, -13411035, -11759620, 695785, -19512036, -15088220, 590558, -5950677, -3139621, }, }; const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS][2870] ={ { -9622874, - 5398774, -3060164, 1363652, -1702955, 433792, -1239098, -309238, 92342, 2585570, -1634235, - 1140314, -2660732, 2018635, -2989297, -4069482, -3554086, 854699, -343597, 588411, 113817, - -1788854, 1082332, 1831804, -974958, 1453846, -184684, -586263, -1198296, -195421, 395137, - 983548, -657130, 1434519, -532576, 906238, 1309965, -899796, -846109, 77309, -867583, - 259846, 53687, -377957, 878321, 152471, -354335, 3665755, -3788161, -702227, -794569, - -882616, -268435, -62277, -717260, -523986, 10737, 154619, -523986, 304943, -1172526, - -350040, -186831, 710817, -4028679, -382252, 837519, -386547, -485331, 350040, 81604, - 283468, 1861868, -897648, -590558, -994285, -180389, 545461, 839666, -852551, -633508, - 989990, -904091, -1352915, -143881, -369367, 476741, -401579, -380105, 223338, 420907, - -833224, 279173, 315680, -12934294, -8804683, -3560528, -4093104, -2267743, -2145336, -2010045, - -925565, -2426657, -1932735, -826781, -1507534, -184684, -549756, -1292785, -1778117, -1967095, - -788127, -1133871, -2003602, -246961, -2503966, 23622, -197569, -330712, -1518271, -244813, - -1151051, 23622, -1481764, -925565, 502511, -1069447, 184684, -2503966, -470299, 1245541, - 749472, -30065, -371515, -708670, 199716, 246961, 1163936, -682900, -120259, -343597, - -17012366, -938450, 2201171, -47245, 663572, -128849, 27917, -1374390, 1462436, 560493, - 1758789, 1234803, 3594888, 2622078, 212601, -1428077, -805306, -345745, 680752, -491774, - -3154654, -2854006, -1462436, -450972, 148176, 390842, 594853, -124554, 109522, 337155, - -654983, -100932, -81604, -1960653, 1157494, 461709, -206158, -32212, -736587, -1093069, - 682900, 246961, -697932, 665720, 584116, 813896, -358630, 19078244, 13406740, 2628520, - 5192616, 1069447, 1720134, 4226248, 2181844, 667867, 2549063, 1030792, -1116692, -560493, - 886911, 1468879, -2585570, -352187, -1550483, 3440269, 1713692, 876173, 1713692, 869731, - 886911, 38655, -167504, -850404, 1348620, 1627793, 1391569, 1733019, 2100239, 1251983, - 3068754, 689342, -173946, 1088774, 201863, -539018, -242666, -481036, -607738, 10737, - 1423782, 337155, 234076, 824634, 28469190, 12107513, 3657165, 3332895, 2327872, 1443109, - 457414, 111669, 3120294, 633508, 1728724, 2355790, 1241246, -163209, -869731, 4977867, - -453119, -2718714, -1561221, 1239098, 66572, 2662880, 869731, 330712, -493921, -1234803, - -354335, -564788, 1163936, -197569, 481036, 122407, 178241, -633508, 942745, 3459596, - 2181844, 2299955, 2063732, 1713692, 929860, 672162, 388695, 1136019, -959925, 697932, - -455267, 9350144, -9854802, -3015067, -4239133, -3719442, -1984275, -620623, 1402307, -1400159, - 173946, -3682935, 1275605, -1357210, -3289945, 852551, -2345052, -3186866, -2237678, 3002182, - 2304250, -1088774, 1183264, -2117419, 837519, -3835406, 221191, 607738, -627065, -914828, - 818191, -3038689, -1350767, 369367, -1035087, -910533, -667867, 227633, 339302, 1505386, - 107374, 2609193, -998580, -738734, -809601, -1316408, -386547, -667867, 386547, -1136019, - -1711545, -33797096, -17166984, -6131066, -4840428, -5231270, -3313567, -4520453, -2976412, -4924180, - -919123, -2218351, -594853, 236223, -2074469, -554051, 300648, 34360, -3141769, -2061584, - -1434519, 300648, -4228396, 425202, -1930588, -3732327, 300648, -45097, 238371, -90194, - -1340030, -1007170, 23622, -281320, -66572, -1393717, 25770, 380105, 1110249, 431644, - -1473174, 833224, -1471026, 985695, -2516851, -1702955, 358630, -1380832, 51540, -521839, - -2025077, -19986630, 10479720, 4413079, 1623498, 2716567, 491774, 734439, 2368675, 2669322, - 1428077, 1780264, -1359357, -562641, -2113124, 2561948, 521839, 468151, 3474629, 120259, - -2349347, 4151086, -2761664, 341450, 3412352, -1028645, 886911, 448824, -90194, -1713692, - -420907, 953483, 977105, 171799, -622770, 73014, -1221918, 3917010, 322123, -55835, - -1550483, -768799, -1007170, -925565, 2104534, 2031520, -536871, 206158, -146029, 616328, - 135291, -128849, -429497, 485331, 304943, -588411, -564788, 30094836, 12783970, 3416647, - 6902013, 4007205, 1715839, 3004330, 2587718, 2147, 1887638, 2982855, 689342, 2147, - 1526861, 4202626, -1423782, -777389, -3326452, 841814, 3835406, 1617055, 178241, -2171106, - -1163936, -936303, 4039417, 1247688, 2113124, 1174674, -1917703, -3094524, 3502546, 1913408, - -2151779, -1037235, 3403762, 2856153, -143881, 702227, -356482, 1486059, 955630, -343597, - 693637, -1213328, -562641, 1821066, -966368, -762357, 1958505, 1660005, 929860, 319975, - 408022, 397284, 1398012, 35592392, 7743826, 5922760, 2637110, 2710124, 1172526, 2789581, - 3332895, 5261335, 3262028, -1011465, 4179003, -816044, 1142461, 910533, 3541201, 5175436, - 3367254, -914828, 5826123, -1118839, -571231, -3070902, 852551, -927713, 979253, 1544041, - -1726577, -2454574, -981400, 457414, -1926293, -663572, 923418, 1269163, -2263448, -1977833, - -785979, 730144, 17180, 584116, -801011, -40802, -530428, -798864, 964220, -1346472, - 1294933, -1443109, -461709, -1105954, 266288, -416612, 1453846, 609885, -77309, 4093104, - -15760382, -5095979, -5611375, -3663607, 1007170, -927713, -3354370, 1909113, 176094, 2353642, - -231928, 223338, -3657165, -2630668, -1681480, -2705830, 266288, -2877628, -5469641, 1067299, - 682900, -2579128, -519691, -2342905, 528281, 758062, -410169, -5703717, -1569811, 337155, - -592706, 463856, 1569811, -4065187, -1172526, -2549063, 1352915, -335007, -173946, 2626373, - -2641405, -201863, 869731, -360777, -841814, 1260573, 719407, -1625645, -1928440, -3156801, - -435939, -2415919, -1900523, -1041530, -1301375, -818191, -328565, -753767, -1168231, -1640678, - -884763, 566936, -36975372, -12594992, -7537668, -1956358, -3884798, -178241, -2085207, -2780991, - -3356517, 4181151, 135291, -1640678, -360777, -6176163, -3459596, -3025805, 5059472, -4249870, - -8890582, 719407, 1136019, 680752, -3242700, -889058, 1924145, -4123169, -382252, -4204773, - -1206886, 2325725, -1969243, 558346, 4606353, 485331, -897648, -1118839, 1286343, 1404454, - 1191853, -1370095, -204011, 1460289, 2059437, 1202591, 730144, -3854733, 779537, -193274, - -1896228, -734439, 431644, -526134, -1917703, -1309965, -1990717, -592706, 161061, 283468, - -253403, -1432372, -201863, -1114544, -34360, -24556476, 5686537, 373662, -3000035, 4410932, - -2785286, -2143189, 1108102, -4140349, -2480344, -874026, 1722282, -3264175, 4471061, 105227, - -122407, 2100239, 2083059, 3287798, -352187, 4524748, 6485401, 4696547, 1479616, 4020090, - -1303523, 2557653, -2961380, -3008625, -1264868, 384400, 1962800, -1576253, -2843268, -1522566, - -73014, 1767379, -2748779, 1995012, 676457, 1541893, -704375, -2491081, -3380139, -4000762, - 1045825, -2040110, 1088774, -4243428, -1239098, 1928440, -2692945, 457414, -1894081, 1301375, - -614180, 1264868, 287763, -743029, -75162, -1698660, 3193308, 1363652, 16428250, 27124866, - 7870528, 7054484, 9792525, 7939247, 1567663, 6300717, 5607080, 3058017, 11871290, 2836826, - 2025077, 5147519, 4765266, 2514703, 2121714, 1262720, 1992865, -1516124, 6008659, -1589138, - 599148, -1868311, 3813931, 206158, -957778, 3154654, 3760244, 1335735, 4984310, -3496104, - -5789616, -1294933, -315680, 1277753, -377957, 2523293, -2302103, 2297808, 5022965, 2168959, - -4425964, -904091, 2293513, 904091, -2156074, 3163244, 1260573, 1879048, 2091649, 2826089, - 944893, -768799, 710817, -2525441, -648540, 2385854, 2190433, -1211181, -15032, 597000, - -1054415, 62281320, 6448894, -627065, 3895535, -118112, 5364414, 60130, 1473174, 672162, - 5652177, 2619930, -2267743, 1881196, 2733747, 1440962, -3345780, -7045894, -3186866, -2961380, - 1292785, -4327180, -715112, -277025, 1206886, 7745974, 4350802, 1458141, 3152506, -4825396, - -246961, -2529736, -919123, -1992865, 2957085, -1114544, 4919885, -2239826, -828929, -2499671, - -1063004, -3609920, -1627793, 828929, 839666, -188979, 96637, -1979980, 1178969, 3356517, - 328565, -1806034, 2164664, -2965675, 1357210, 1305670, -231928, -921271, -569083, -128849, - -496069, 150324, 2074469, -221191, -18129056, -21573620, -4009352, -1202591, -882616, -3429532, - -1417339, 6545530, 3876208, 1380832, 1786706, -2856153, -571231, 4915590, -1808181, 7999377, - -6208375, -1694365, 6524056, -1256278, -727997, -3790309, 4473209, 4943508, 96637, 4872641, - -1769527, 2162516, -96637, -2723009, -425202, -2153926, -895501, -1395864, 2695092, -1977833, - -466004, -3045132, 2068027, -1580548, 4509716, -7106024, 2993592, 2482491, -4290673, 94489, - -2832531, 768799, -3223373, 1030792, 1355062, -4097399, -612033, -1488206, -6098854, -3532611, - -1685775, -3030100, -652835, -504659, 341450, -2476049, 360777, -4793184, 1352915, 597000, - -1644973, 609885, -1642825, -435939, -1065152, -491774, -15934329, -9137543, -12360916, -6345814, - -8257075, -934155, 7969312, -8325794, 6405944, 4086662, -4537633, 9083856, -1436667, 1767379, - -5931350, -639950, -2637110, -380105, 38655, 2237678, 1095217, 4739497, 9092446, -2463164, - 1254131, -4350802, -4541928, -4037269, 919123, 3777424, -1331440, -1324997, -1206886, -2813204, - 3152506, -994285, -210453, -2755222, -2164664, -1836099, -2836826, -244813, -124554, -2405182, - 1571958, -3678640, 1357210, -2138894, -382252, 1324997, -2712272, 3345780, -5830418, -1821066, - 549756, -1735167, -3111704, 1518271, -858993, -3508988, 5746666, 3242700, 794569, 1088774, - 1153199, 1402307, -2905546, -1913408, 738734, -1041530, -2014340, 2162516, -44373456, -5072357, - 3592740, -3244848, 7372312, 3408057, -8974334, 1224066, 1520418, -2886218, -7514046, -2776696, - -1823214, 2158221, 549756, -6947110, -2617783, -3700114, -6687264, -5630702, -13118978, -6820408, - -7657927, -9292162, 7402376, -4932770, 2714419, 5557688, -3998615, -6294275, -2420214, -1342177, - 1522566, 4179003, 2430952, -5209796, -6478958, 5136781, 3214783, 4067334, 5710159, 846109, - -10737, 2259153, -257698, -2497524, 1458141, -1337882, -852551, 3369402, 8544837, -2806761, - -4252018, 2010045, -2703682, -234076, 4410932, -8411693, -100932, -2757369, -444529, -152471, - 68719, -977105, 1702955, -2484639, 3077344, 3352222, 1421634, -169651, -4295, -2817499, - 35553740, 31005368, 8398809, 18852758, 5216238, 10857677, -1760937, -1722282, 5276368, 7133941, - 3788161, -12311524, -4082367, 7675107, 8669391, -3197603, -4179003, 1406602, 3609920, 4099546, - 609885, -6405944, -13758928, -5171141, 7509751, -667867, 7718056, -1829656, -2456721, 1559073, - -6397354, -3708704, -3721589, 7067369, -8813273, -6081674, 1582696, 1473174, -2269890, -283468, - -2527588, 2643552, 3603478, 3090229, 6981470, 4063039, 118112, -5718749, 5377299, -513249, - 2978560, -2798171, 2078764, 4249870, -648540, -1144609, -2662880, -3161096, 1934883, 427349, - 2735894, -2735894, 2284923, 5519033, -1161789, -3034395, 3848291, 4999342, -2033667, 2226941, - 2506114, 1999307, 4778151, 4075924, 43115028, 8046621, -8452496, 7013682, 4524748, -8162586, - -1864016, 4181151, 210453, 1346472, -710817, -1700807, -9075266, -8817568, 3865471, 8347269, - 8551280, -8489003, -17278654, 2415919, -337155, -6899865, -8877697, -1552631, 4320737, -3036542, - 6448894, 10488310, -4015795, -3425237, -1496796, -1554778, -2130304, -16041703, 8291435, 7636452, - -384400, 4922033, -4954245, -1548336, -4516158, 6466074, 6822556, 766652, -1821066, -2527588, - 3760244, 923418, -2351495, -4071629, -83752, 3414499, -5297842, -3234110, -2929168, 874026, - 1563368, -6554120, 3238405, 7221988, -5997922, -83752, -1520418, -1022202, -146029, 715112, - 304943, -425202, 1194001, -1958505, -3964255, -4563403, -2106682, -1120987, -2426657, -4576288, - -3444564, -1101659, 3193308, -1541893, -11821897, -7793218, 1112397, 10692321, -10767483, 7645042, - 3489661, 1662152, 2173254, 1833951, 6968585, 11291469, 294205, 3390877, 1239098, -9738838, - -8845485, 8607114, 1155346, -10063108, 5912023, -8594230, 1398012, 10526965, -689342, -2899103, - 12023761, 1857573, 805306, 970663, 341450, 1065152, -5312875, 3154654, 4836133, 7924215, - -6324340, -3146064, 1217623, 1084479, -2909840, -5716602, 3624953, -2098092, 2534031, 1331440, - -1999307, -1861868, 798864, 3594888, -2757369, -1228361, -629213, 2057289, -5787469, -2712272, - 2665027, 558346, -1962800, -1022202, 2409477, -2452426, 747324, -1664300, -416612, 1941325, - 558346, 1129576, -4995047, -3562675, 1322850, -46364172, -42567420, -9519795, -19722490, -17319456, - -9809705, -2978560, -7365869, -8871255, 6027987, 1608465, -2059437, 10112500, 3712999, 12150462, - 9414568, 2703682, 3770981, 4428112, -18631568, 8778913, -1438814, -3951370, -3489661, -11029476, - -3412352, -3833258, 10589242, -3547643, -6324340, -3158949, 1685775, -1389422, -2113124, 2325725, - -2800319, -1825361, 6478958, -6360847, -554051, -2063732, 11654394, 4617090, 4660040, -8974334, - 691490, 7971460, -4191888, 1896228, 38655, 1930588, 51540, 661425, -612033, 5078799, - -663572, -1666447, 3704409, -2639258, 2076617, 4425964, -2074469, -3088082, 1372242, 1687922, - -3330747, -1370095, -6146098, -4872641, 1612760, -562641, -1082332, -115964, 809601, -397284, - -3899830, -1838246, -29038274, 61319248, 38461432, 12375948, 3734474, 4234838, 4316442, 6902013, - 6012954, 13000866, 25909390, 1501091, 2922725, 5671505, 5284958, 6700149, -4872641, 25209310, - 17914308, -16688095, 12317966, 2312840, -2720862, 6075231, 15184857, -14248554, -4093104, 1185411, - -11879880, -8057359, -8495445, 17323750, -785979, -3058017, 2282775, 972810, -5188321, -13879187, - 9620727, 7885560, -2372970, 4307852, 9865540, -6560563, 5368709, 569083, -2585570, 7812546, - 6646462, 1563368, 891206, 805306, 5353677, 7580618, 55835, -1363652, -81604, -2394444, - 5306432, 1116692, -2160369, -2649995, -1943473, 4039417, 1864016, 9176198, -2774549, 3281355, - -2042257, 2289218, -3745212, -1329292, 1127429, -2035815, -2619930, 231928, 444529, 1176821, - 2482491, 66413080, -23407572, -22993108, 10413148, 2559801, -8701604, -7662222, -12169790, -12062416, - -8821863, -7475391, 10997264, 2564096, 1329292, -6236293, -5443871, -19441170, -19327, -7683697, - -13361643, 11134703, 7406671, 2297808, 6884833, 1934883, -2342905, -4305705, -362925, -3637837, - 5634997, 9543417, -10129680, -3728032, 148176, 5214091, 13228499, 3983582, 17742510, -9096741, - 5600638, 14796162, 8718784, -7361574, -2192581, 1741609, -3749507, 6412386, -992137, 386547, - 9448928, 5214091, 1516124, 942745, -229781, -3910568, -109522, 1200443, -4239133, -2332167, - 4194036, -1561221, -8040179, -1093069, 244813, -1312113, -8373039, 2269890, 1728724, 2190433, - 2345052, -1651415, -3472481, -1086627, -1750199, 6912750, 2918430, -2553358, 1902671, -521839, - 1443109, 210453, 21324512, 40516572, 15921444, 10861972, 12704513, -3682935, 4097399, -11547020, - 20158430, 7952132, 19366008, 5806796, 7395934, -17637284, 22078280, 32708324, 4179003, 21214990, - -4221953, -17173426, -16995186, 15571404, -4973572, 12438225, 2334315, 4999342, -9494025, 9633612, - -3302830, -3408057, 15908559, 11053098, -8276402, 14854144, 1717987, 2733747, -2933463, -11160473, - 3167539, 856846, -6167573, -7022272, 6618545, 9238475, 3085934, -3225521, 4413079, 375810, - 9874130, -5894843, -796716, -9734543, 1206886, 9564892, 6489696, -4413079, 34360, 3369402, - -8596377, -637803, -5847598, -3283503, 1874753, 2295660, 5892695, -6831146, 3032247, -7859790, - 758062, 9760313, 3498251, 1928440, -6107444, 919123, 807454, -10176925, -2630668, 1185411, - 1806034, 4032974, 1711545, -219043, -47324096, -2581275, -10690174, 13432510, -10234907, 11048803, - 332860, 8856223, -1232656, 7638600, -23650238, 6949257, -2778844, -8534100, 4155381, -10393821, - 6371584, -10492605, -5538361, -23179938, 13185550, 27754078, -10896332, -3695819, -3176128, -4561256, - 4228396, 5493263, 8046621, -20620138, 6154688, -12852690, -3676492, -740882, 10567767, 3987877, - -5312875, 2188286, 2250563, 7511898, 7713762, -12899934, -4236985, 1808181, -9373766, -8409546, - -1584843, -6023692, 2542621, 7136088, 964220, 1191853, -1694365, 6650757, 18107582, 10161893, - -11113228, 2190433, 4112431, -5564130, 6386617, 1606318, -7112466, -730144, 8160438, 818191, - 7812546, -10554882, -2439542, 6251325, 313533, -3504693, -7292855, -605590, -3863323, 5982890, - -1698660, 3719442, -1788854, -822486, -86872160, -32600950, 17639430, 6358699, -11158325, 12345883, - 10176925, 16299401, -3938485, -7112466, 14239964, 631360, -9590662, 19393924, -21706764, -28245852, - -13344463, -15141907, 9910637, 14280766, -322123, 3715147, 22486302, 9940702, -22771916, -10249939, - -14005888, 4239133, -21144124, -18406082, -1112397, 2905546, -8083129, -8800388, -12882754, -6644315, - -11785390, -11506217, -4327180, 1050120, -4198331, -622770, -7941395, -1166084, -6079526, -13380971, - 29066192, 2422362, 6895570, -11781095, 7720204, -691490, 3964255, -9444633, -354335, -1471026, - -7876970, -4881231, -3571265, 9513353, 6927782, 7462506, 4632122, 5804649, -1301375, 165356, - -6811818, -1172526, -294205, -453119, 8961449, 2508261, 5272073, 5544803, -3992172, -9560597, - 4172561, -3620658, -1677185, 4024384, 11478300, -1166084, 45567456, 16728898, 36717676, 5774584, - 2501819, -14693083, 5677947, 21960168, 8306467, 1597728, 14798310, -13198435, -5849746, 12004434, - -9083856, 4187593, 21165598, 6801081, 2944200, 6743099, -3777424, 9195525, -6906308, 255551, - 3657165, 1247688, -5310727, -5785321, 2362232, 21751862, -6949257, 5403069, -19945828, -10690174, - 9255655, 22917946, -17506286, 165356, 11128260, 2802466, 4297115, -14532022, -4986457, -12556337, - -21906480, -5787469, -12135430, -12902082, 10546292, 4200478, 3715147, -7533373, -4522601, -1479616, - -21036750, -1960653, 11963631, -8358007, 9622874, 19552838, 3081639, 12955769, 8643622, 751619, - -3788161, 11244224, -14072460, -648540, -734439, 8948564, 4438849, 8246337, 435939, 9143985, - -450972, 1909113, 1513976, 9732396, 188979, 118112, 8828305, -4679367, 5546951, 1939178, - 1589138, -2798171, 55334212, -12141873, -17001628, 2725157, 12721693, 10357314, 10587094, -3079492, - 11420318, 3592740, -13587129, -27174258, 18193482, 4898410, 13159780, 7872675, -7243463, 3210488, - -10417443, -17768280, 18457622, -11544872, -22125524, 2368675, -3635690, 2750927, -2209761, -2214056, - -5626407, -8742406, 6506876, 14940044, -21569326, 21109764, -18251464, -23776938, 2302103, 6414534, - -13449690, 10617159, -1915555, 6749541, -11583527, -5697274, 19666656, 8098161, 19913616, 5349382, - 1498944, 6401649, -70867, 811749, 10426033, -839666, 1829656, -9242770, -6362994, -5441724, - 7337952, -7168301, -6197638, 11944304, -362925, 13368086, 2014340, -9627169, 15893526, 12455405, - -1030792, 8147553, -8166881, -13320841, 5138929, -4833986, -9663676, 904091, 8482560, 11626476, - -4374424, 3678640, 5581310, -695785, 2381559, -11504070, 4425964, 4082367, -5798206, 46366320, - 56493852, -8665097, 345745, -28428388, -3214783, -20746840, -15513422, -4958540, -10608569, 15992311, - 8590, 12403866, -26530012, 22043920, -16707423, 22512072, 801011, 17873506, -6459631, 22529250, - 7410966, -10735271, 4754529, -16020228, 10625749, -8931384, 25372520, 7554848, 16677358, -27758374, - -15893526, -6818261, -14061723, -5896990, -9622874, 893353, 34297460, -15861314, 17246442, 29059748, - 4121021, 12773233, 171799, -6526203, -13569949, -10359461, 1445257, -7479686, 17549236, -11381663, - 8046621, 21221434, -2793876, -1763084, -1700807, 17353816, 18769008, 5869073, -8714489, -7649337, - -4602058, 7327214, -17194902, 3219078, -3083787, -4743792, 242666, 11340861, 1013612, 16063178, - 14718853, 2905546, 3532611, -7002944, -350040, 16514149, -2132451, 968515, 6932077, -8834748, - 169651, -10110353, -10995116, 1584843, 1586990, -2214056, -44027708, -39451424, 17572858, -5233418, - 21738976, -12369506, -10211285, -14763950, -12116103, -5602785, -34744136, -12738873, 13380971, 18683108, - 7715909, -24208584, -6871948, -11617887, 10275709, 35031900, 19621558, 8568460, 1382980, 2665027, - 1831804, 6165426, 18129056, 1483911, 4778151, -10295037, 867583, -14761803, 5804649, 7241315, - 13123273, 1722282, -8924942, -4468914, 17295834, -8003672, 6551973, 3566970, 6298570, 22091164, - -12236362, -18610094, 7048042, 15760382, 4198331, 15751793, 18895708, 9141838, 13114683, 5085242, - 2856153, 10404558, 31469226, -17452600, 23622, 5207648, 2832531, -13526999, -2362232, 10499048, - -137439, -12131135, 4881231, 22851374, -18522046, 6088116, -17540646, 10204842, 6938520, 2845416, - 715112, -8257075, -8229158, 16084653, 8699456, 3309272, -4870493, 11280732, -1580548, 70867, - -7786776, 8321499, 3109556, -88624504, -30934502, -1988570, -8843338, -21854942, 13350906, 17828410, - 30077656, 9884867, 18910742, -17559974, -37054832, 17257178, -8757438, 927713, -19952270, 19628000, - -11787538, -932008, 18240726, -50549616, 4870493, 26289494, -49063560, -12970801, -17390322, 2372970, - 1816771, 12000139, -13653701, 15906411, 2254858, -25722560, -13269301, 3038689, -3315715, -12745315, - 11196980, 29903710, 6371584, 8269960, -4818954, -7449621, 17426830, 3180423, -8787503, -42964704, - -6869800, 5413807, -21809844, 10337986, 8770323, 1735167, -16864190, -15062450, -17978734, 38558068, - 10198400, -5886253, 7430294, -32789928, 3811784, -15354508, -17673790, 17061758, -2957085, 212601, - -11162620, -41023380, 5486821, 12457553, 7159711, -3000035, 24212878, 803159, -10222022, -1629940, - -15981573, 25132002, 13640816, 7028714, -4209068, 1707250, 8044474, -7483981, 3115999, 3463891, - 1144609, 94038312, 23684598, 24270860, 20620138, -6004365, 811749, 96705480, 27930172, -8001524, - 59075128, -33137820, 24646670, 5179731, 15064598, 24144158, -7464653, -16855600, 18204218, -3311420, - -58407260, 14933601, 15146202, 12363063, 27805618, 17613660, 18161270, -16454020, 3627100, -15889232, - -8289287, 17310866, 5746666, -34095596, -20358144, -28576564, -42543800, -6515466, 8776766, 20781200, - 17940078, 15455440, 12962211, -6300717, 22254374, 12380243, -27081916, -10361609, 7224135, 20396800, - 489626, 4398047, 35912368, -6431714, -3040837, -9305047, -1872606, 18300856, -15629386, 270583, - -22106196, -19643032, -12586402, 23008140, 31621696, -9176198, 2555506, -6094559, -19630148, -13305809, - 5100274, -22739704, -6045167, -6077379, -14699526, 40282500, 8826158, 13475460, 11744588, -1168231, - 51540, 6959995, 2115272, 12668006, 7984344, 225486, -1282048, 95657512, 56566868, 4024384, - 35931696, 27376122, 7872675, 41424960, 11731703, -186831, -12839805, -9603547, -26989574, -73398840, - -5390184, 7078106, -24983824, -14323716, -2765959, 51150912, 16823386, -13346611, 586263, 3498251, - -7271380, 21532818, -3575560, -13365938, -9010841, -12603582, 8158291, -18491982, -44959716, 955630, - -23435490, -36494336, 7209103, 15644418, 22874996, 12771085, 20255066, -13831942, -38716984, -25374666, - -34819300, 13623636, 32772748, 26862872, 17486960, 32575180, 904091, 20330228, 44397076, -36758476, - 6680822, -16634408, 236223, 12668006, 13284334, 21479132, -1879048, -44914620, -34574488, 7383049, - -9728101, -12818330, -8486855, -9861245, -30633854, 2647847, 20869246, -2291365, 15915001, -9590662, - -753767, -1784559, 7990787, 30404074, 21545704, 18509162, -17538498, 968515, -10526965, 1202591, - -28144920, 5626407, 4715874, 3027952, -526134, -3485366, -8074539, 7011534, 360777, 12691628, - 23295902, -47794396, 5918465, -36582384, 16361678, -69844760, -1891933, -23173496, -36024040, 64488932, - 36483600, -23008140, -57917632, -14660871, -21124796, -50626928, 39397736, 2100239, -34980360, -13015898, - 20244328, -33133526, -22529250, -17409650, -39247412, -15068893, -783832, -31767726, -28797756, 40441412, - -15088220, -12625056, -3719442, -9040906, 34400540, -38102804, -17787608, 8046621, -10136123, -42950, - -8630737, 19834158, -36105644, 12867722, -57735096, 5877663, -16499117, -23059680, 60662120, 6302865, - -22400402, 11566347, 12689481, -48960480, 33986076, -8284992, -10526965, -3706557, 19441170, -8096014, - 880468, -23444078, 12773233, 15891379, 27309550, -23570780, -60438780, 42215232, -4818954, 17433272, - 20684562, -12517682, 11942157, 31215822, -39844412, 2145336, -14027363, -4333622, -41360536, 14124000, - -6418829, 1670742, -1020055, 5486821, -6949257, -6249178, 11405286, -10471130, 8265665, 2433099, - -7756711, 4683662, 1286343, -91293824, -50906100, 11433203, -32469952, 3936338, -23474144, -12146168, - -34415572, -23673860, 17315160, 51292648, 53873924, 8579197, 38008312, -26252988, 66413080, 48773648, - -38871600, -34948148, 10986526, 10971494, 56130928, 20383914, 35933844, -12955769, 14390288, -7290707, - -6045167, -11894912, 52478056, 23504208, 50264004, 45674828, 8755291, -2692945, -22254374, 22050362, - -2656437, -45977624, -30683246, -8740258, -23789824, -5304285, -24449102, -21431886, 14484777, -6489696, - -15485505, 38394860, 45221712, -26031796, -8729521, 61725124, 25144886, -42142220, -41472204, -14929306, - 15567109, -1956358, -7748121, -29983166, 25297358, 7825431, -9803263, 7052337, 6925635, -37175088, - -16421807, 3560528, -14070313, -18036716, -19557134, 50502372, -39593156, -35407712, 14510547, 25933012, - 36855116, -18674518, -6032282, 3607773, -17038136, 17686676, -2695092, 13297219, -11138998, -4511863, - 3380139, 5211943, -6416681, -5497558, -539018, -6730214, -34724812, -51017768, -43802224, -380105, - -34462816, -44362716, 11463268, -3824669, -61757336, 44122200, 7939247, -3777424, 22073984, 68012952, - 65107408, 28011776, -79499848, 29545080, 21234318, -78024520, -966368, -37679748, -18156974, 40155796, - -47042776, 27376122, 135291, -8136816, -16716013, 8083129, -3768834, 13496935, -8920647, -41790032, - 40733468, 19179176, 48756468, -5076652, -16194174, -23510650, 19859928, -21189222, 57569740, 12068858, - 34662532, -44719200, 35815732, 1374390, 12816182, -29029684, 9962177, -34475704, -5218386, -35362612, - 14682346, 24451248, -46724948, 1902671, -38454988, 18116172, 23098334, 22262962, -2800319, -66363688, - 388695, 17534204, -5454609, 29512868, -63226212, 16297253, -26143466, 8540542, -22104050, 4638565, - 16700980, -7125351, 53687, -6880538, -7958575, 2568391, -16814796, 21554294, 5156108, -508954, - -26972394, -2484639, 3184718, -1909113, 11766063, -11725261, 2944200, -1191853, -5690832, 95575904, - 115749368, 48541720, 40306120, -66685808, 64156072, 93355408, -102114992, 12309376, 66108136, 11622182, - -121777352, -12045236, -66138200, 21436182, 24144158, -30655330, -12105365, 22308060, -55941948, -4346507, - -21951578, -27339614, 10853382, -42264624, 45610404, 32669668, 59002112, -29124174, 9607842, -6249178, - -24122684, 74683040, -1509681, -34183644, -16254304, 16241419, -16101832, -19391778, -22952306, 38062000, - 14046691, 52862456, -3779571, 19469086, 69164008, -43770012, 9143985, -29676076, 54874648, -21434034, - 25649544, 11035918, -2229088, -20669530, -39157216, -26310970, 10988674, 49770080, -46733540, 42015516, - 49484464, 25033216, 57840324, -28138478, -23053236, 37847252, -6564858, -6867653, -53422952, -3231963, - -44081396, 9199820, 55778740, 27526446, 14027363, 25733296, 15197742, -23830626, -10838350, -41725608, - 47341276, 2136746, -18848464, 12668006, 4243428, -21859236, 11493332, -3000035, 13565654, -2119566, - 20596516, 10018011, -44154412, -151910848, -63211180, -109354160, -58510340, -46986944, 25456272, -70362304, - -71182640, -34628172, -95236608, -31501438, 72271416, -2652142, 3096672, -19935090, -16685948, -9504763, - 6762426, -1649268, -63748052, -10653666, -12438225, 92204360, -11839077, 81915760, 6856916, -22701050, - 21601538, 67330056, -3371549, 154619, -27180700, -8540542, -28544352, 15564961, -11993696, -24970940, - 12436078, -33539400, 26890790, 26605174, 5373004, 58826020, -26817776, 29676076, -25071872, 32804960, - 22694608, 61978524, 8641474, -26167088, 33730524, -4952098, -20920786, 78855600, -5881958, -5480379, - 45853072, 13434658, 61710092, -48741436, -46849504, -7859790, -20287278, -7191923, -75831944, -17987324, - 26332444, -11042361, -32637456, -54123032, 3620658, 15539192, -26686780, -26345330, -46409268, -17332340, - 19709604, 19522774, 41089952, -7419556, -3794604, -2302103, 13700946, 15556372, 2772402, 25159918, - 7146826, 1917703, -3517578, -3377992, 18616536, -8875550, 18393198, 19823422, -925565, }, + 5398774, -3060164, 1363652, -1702955, 433792, -1239098, -309238, 92342, 2585570, -1634235, + 1140314, -2660732, 2018635, -2989297, -4069482, -3554086, 854699, -343597, 588411, 113817, + -1788854, 1082332, 1831804, -974958, 1453846, -184684, -586263, -1198296, -195421, 395137, + 983548, -657130, 1434519, -532576, 906238, 1309965, -899796, -846109, 77309, -867583, + 259846, 53687, -377957, 878321, 152471, -354335, 3665755, -3788161, -702227, -794569, + -882616, -268435, -62277, -717260, -523986, 10737, 154619, -523986, 304943, -1172526, + -350040, -186831, 710817, -4028679, -382252, 837519, -386547, -485331, 350040, 81604, + 283468, 1861868, -897648, -590558, -994285, -180389, 545461, 839666, -852551, -633508, + 989990, -904091, -1352915, -143881, -369367, 476741, -401579, -380105, 223338, 420907, + -833224, 279173, 315680, -12934294, -8804683, -3560528, -4093104, -2267743, -2145336, -2010045, + -925565, -2426657, -1932735, -826781, -1507534, -184684, -549756, -1292785, -1778117, -1967095, + -788127, -1133871, -2003602, -246961, -2503966, 23622, -197569, -330712, -1518271, -244813, + -1151051, 23622, -1481764, -925565, 502511, -1069447, 184684, -2503966, -470299, 1245541, + 749472, -30065, -371515, -708670, 199716, 246961, 1163936, -682900, -120259, -343597, + -17012366, -938450, 2201171, -47245, 663572, -128849, 27917, -1374390, 1462436, 560493, + 1758789, 1234803, 3594888, 2622078, 212601, -1428077, -805306, -345745, 680752, -491774, + -3154654, -2854006, -1462436, -450972, 148176, 390842, 594853, -124554, 109522, 337155, + -654983, -100932, -81604, -1960653, 1157494, 461709, -206158, -32212, -736587, -1093069, + 682900, 246961, -697932, 665720, 584116, 813896, -358630, 19078244, 13406740, 2628520, + 5192616, 1069447, 1720134, 4226248, 2181844, 667867, 2549063, 1030792, -1116692, -560493, + 886911, 1468879, -2585570, -352187, -1550483, 3440269, 1713692, 876173, 1713692, 869731, + 886911, 38655, -167504, -850404, 1348620, 1627793, 1391569, 1733019, 2100239, 1251983, + 3068754, 689342, -173946, 1088774, 201863, -539018, -242666, -481036, -607738, 10737, + 1423782, 337155, 234076, 824634, 28469190, 12107513, 3657165, 3332895, 2327872, 1443109, + 457414, 111669, 3120294, 633508, 1728724, 2355790, 1241246, -163209, -869731, 4977867, + -453119, -2718714, -1561221, 1239098, 66572, 2662880, 869731, 330712, -493921, -1234803, + -354335, -564788, 1163936, -197569, 481036, 122407, 178241, -633508, 942745, 3459596, + 2181844, 2299955, 2063732, 1713692, 929860, 672162, 388695, 1136019, -959925, 697932, + -455267, 9350144, -9854802, -3015067, -4239133, -3719442, -1984275, -620623, 1402307, -1400159, + 173946, -3682935, 1275605, -1357210, -3289945, 852551, -2345052, -3186866, -2237678, 3002182, + 2304250, -1088774, 1183264, -2117419, 837519, -3835406, 221191, 607738, -627065, -914828, + 818191, -3038689, -1350767, 369367, -1035087, -910533, -667867, 227633, 339302, 1505386, + 107374, 2609193, -998580, -738734, -809601, -1316408, -386547, -667867, 386547, -1136019, + -1711545, -33797096, -17166984, -6131066, -4840428, -5231270, -3313567, -4520453, -2976412, -4924180, + -919123, -2218351, -594853, 236223, -2074469, -554051, 300648, 34360, -3141769, -2061584, + -1434519, 300648, -4228396, 425202, -1930588, -3732327, 300648, -45097, 238371, -90194, + -1340030, -1007170, 23622, -281320, -66572, -1393717, 25770, 380105, 1110249, 431644, + -1473174, 833224, -1471026, 985695, -2516851, -1702955, 358630, -1380832, 51540, -521839, + -2025077, -19986630, 10479720, 4413079, 1623498, 2716567, 491774, 734439, 2368675, 2669322, + 1428077, 1780264, -1359357, -562641, -2113124, 2561948, 521839, 468151, 3474629, 120259, + -2349347, 4151086, -2761664, 341450, 3412352, -1028645, 886911, 448824, -90194, -1713692, + -420907, 953483, 977105, 171799, -622770, 73014, -1221918, 3917010, 322123, -55835, + -1550483, -768799, -1007170, -925565, 2104534, 2031520, -536871, 206158, -146029, 616328, + 135291, -128849, -429497, 485331, 304943, -588411, -564788, 30094836, 12783970, 3416647, + 6902013, 4007205, 1715839, 3004330, 2587718, 2147, 1887638, 2982855, 689342, 2147, + 1526861, 4202626, -1423782, -777389, -3326452, 841814, 3835406, 1617055, 178241, -2171106, + -1163936, -936303, 4039417, 1247688, 2113124, 1174674, -1917703, -3094524, 3502546, 1913408, + -2151779, -1037235, 3403762, 2856153, -143881, 702227, -356482, 1486059, 955630, -343597, + 693637, -1213328, -562641, 1821066, -966368, -762357, 1958505, 1660005, 929860, 319975, + 408022, 397284, 1398012, 35592392, 7743826, 5922760, 2637110, 2710124, 1172526, 2789581, + 3332895, 5261335, 3262028, -1011465, 4179003, -816044, 1142461, 910533, 3541201, 5175436, + 3367254, -914828, 5826123, -1118839, -571231, -3070902, 852551, -927713, 979253, 1544041, + -1726577, -2454574, -981400, 457414, -1926293, -663572, 923418, 1269163, -2263448, -1977833, + -785979, 730144, 17180, 584116, -801011, -40802, -530428, -798864, 964220, -1346472, + 1294933, -1443109, -461709, -1105954, 266288, -416612, 1453846, 609885, -77309, 4093104, + -15760382, -5095979, -5611375, -3663607, 1007170, -927713, -3354370, 1909113, 176094, 2353642, + -231928, 223338, -3657165, -2630668, -1681480, -2705830, 266288, -2877628, -5469641, 1067299, + 682900, -2579128, -519691, -2342905, 528281, 758062, -410169, -5703717, -1569811, 337155, + -592706, 463856, 1569811, -4065187, -1172526, -2549063, 1352915, -335007, -173946, 2626373, + -2641405, -201863, 869731, -360777, -841814, 1260573, 719407, -1625645, -1928440, -3156801, + -435939, -2415919, -1900523, -1041530, -1301375, -818191, -328565, -753767, -1168231, -1640678, + -884763, 566936, -36975372, -12594992, -7537668, -1956358, -3884798, -178241, -2085207, -2780991, + -3356517, 4181151, 135291, -1640678, -360777, -6176163, -3459596, -3025805, 5059472, -4249870, + -8890582, 719407, 1136019, 680752, -3242700, -889058, 1924145, -4123169, -382252, -4204773, + -1206886, 2325725, -1969243, 558346, 4606353, 485331, -897648, -1118839, 1286343, 1404454, + 1191853, -1370095, -204011, 1460289, 2059437, 1202591, 730144, -3854733, 779537, -193274, + -1896228, -734439, 431644, -526134, -1917703, -1309965, -1990717, -592706, 161061, 283468, + -253403, -1432372, -201863, -1114544, -34360, -24556476, 5686537, 373662, -3000035, 4410932, + -2785286, -2143189, 1108102, -4140349, -2480344, -874026, 1722282, -3264175, 4471061, 105227, + -122407, 2100239, 2083059, 3287798, -352187, 4524748, 6485401, 4696547, 1479616, 4020090, + -1303523, 2557653, -2961380, -3008625, -1264868, 384400, 1962800, -1576253, -2843268, -1522566, + -73014, 1767379, -2748779, 1995012, 676457, 1541893, -704375, -2491081, -3380139, -4000762, + 1045825, -2040110, 1088774, -4243428, -1239098, 1928440, -2692945, 457414, -1894081, 1301375, + -614180, 1264868, 287763, -743029, -75162, -1698660, 3193308, 1363652, 16428250, 27124866, + 7870528, 7054484, 9792525, 7939247, 1567663, 6300717, 5607080, 3058017, 11871290, 2836826, + 2025077, 5147519, 4765266, 2514703, 2121714, 1262720, 1992865, -1516124, 6008659, -1589138, + 599148, -1868311, 3813931, 206158, -957778, 3154654, 3760244, 1335735, 4984310, -3496104, + -5789616, -1294933, -315680, 1277753, -377957, 2523293, -2302103, 2297808, 5022965, 2168959, + -4425964, -904091, 2293513, 904091, -2156074, 3163244, 1260573, 1879048, 2091649, 2826089, + 944893, -768799, 710817, -2525441, -648540, 2385854, 2190433, -1211181, -15032, 597000, + -1054415, 62281320, 6448894, -627065, 3895535, -118112, 5364414, 60130, 1473174, 672162, + 5652177, 2619930, -2267743, 1881196, 2733747, 1440962, -3345780, -7045894, -3186866, -2961380, + 1292785, -4327180, -715112, -277025, 1206886, 7745974, 4350802, 1458141, 3152506, -4825396, + -246961, -2529736, -919123, -1992865, 2957085, -1114544, 4919885, -2239826, -828929, -2499671, + -1063004, -3609920, -1627793, 828929, 839666, -188979, 96637, -1979980, 1178969, 3356517, + 328565, -1806034, 2164664, -2965675, 1357210, 1305670, -231928, -921271, -569083, -128849, + -496069, 150324, 2074469, -221191, -18129056, -21573620, -4009352, -1202591, -882616, -3429532, + -1417339, 6545530, 3876208, 1380832, 1786706, -2856153, -571231, 4915590, -1808181, 7999377, + -6208375, -1694365, 6524056, -1256278, -727997, -3790309, 4473209, 4943508, 96637, 4872641, + -1769527, 2162516, -96637, -2723009, -425202, -2153926, -895501, -1395864, 2695092, -1977833, + -466004, -3045132, 2068027, -1580548, 4509716, -7106024, 2993592, 2482491, -4290673, 94489, + -2832531, 768799, -3223373, 1030792, 1355062, -4097399, -612033, -1488206, -6098854, -3532611, + -1685775, -3030100, -652835, -504659, 341450, -2476049, 360777, -4793184, 1352915, 597000, + -1644973, 609885, -1642825, -435939, -1065152, -491774, -15934329, -9137543, -12360916, -6345814, + -8257075, -934155, 7969312, -8325794, 6405944, 4086662, -4537633, 9083856, -1436667, 1767379, + -5931350, -639950, -2637110, -380105, 38655, 2237678, 1095217, 4739497, 9092446, -2463164, + 1254131, -4350802, -4541928, -4037269, 919123, 3777424, -1331440, -1324997, -1206886, -2813204, + 3152506, -994285, -210453, -2755222, -2164664, -1836099, -2836826, -244813, -124554, -2405182, + 1571958, -3678640, 1357210, -2138894, -382252, 1324997, -2712272, 3345780, -5830418, -1821066, + 549756, -1735167, -3111704, 1518271, -858993, -3508988, 5746666, 3242700, 794569, 1088774, + 1153199, 1402307, -2905546, -1913408, 738734, -1041530, -2014340, 2162516, -44373456, -5072357, + 3592740, -3244848, 7372312, 3408057, -8974334, 1224066, 1520418, -2886218, -7514046, -2776696, + -1823214, 2158221, 549756, -6947110, -2617783, -3700114, -6687264, -5630702, -13118978, -6820408, + -7657927, -9292162, 7402376, -4932770, 2714419, 5557688, -3998615, -6294275, -2420214, -1342177, + 1522566, 4179003, 2430952, -5209796, -6478958, 5136781, 3214783, 4067334, 5710159, 846109, + -10737, 2259153, -257698, -2497524, 1458141, -1337882, -852551, 3369402, 8544837, -2806761, + -4252018, 2010045, -2703682, -234076, 4410932, -8411693, -100932, -2757369, -444529, -152471, + 68719, -977105, 1702955, -2484639, 3077344, 3352222, 1421634, -169651, -4295, -2817499, + 35553740, 31005368, 8398809, 18852758, 5216238, 10857677, -1760937, -1722282, 5276368, 7133941, + 3788161, -12311524, -4082367, 7675107, 8669391, -3197603, -4179003, 1406602, 3609920, 4099546, + 609885, -6405944, -13758928, -5171141, 7509751, -667867, 7718056, -1829656, -2456721, 1559073, + -6397354, -3708704, -3721589, 7067369, -8813273, -6081674, 1582696, 1473174, -2269890, -283468, + -2527588, 2643552, 3603478, 3090229, 6981470, 4063039, 118112, -5718749, 5377299, -513249, + 2978560, -2798171, 2078764, 4249870, -648540, -1144609, -2662880, -3161096, 1934883, 427349, + 2735894, -2735894, 2284923, 5519033, -1161789, -3034395, 3848291, 4999342, -2033667, 2226941, + 2506114, 1999307, 4778151, 4075924, 43115028, 8046621, -8452496, 7013682, 4524748, -8162586, + -1864016, 4181151, 210453, 1346472, -710817, -1700807, -9075266, -8817568, 3865471, 8347269, + 8551280, -8489003, -17278654, 2415919, -337155, -6899865, -8877697, -1552631, 4320737, -3036542, + 6448894, 10488310, -4015795, -3425237, -1496796, -1554778, -2130304, -16041703, 8291435, 7636452, + -384400, 4922033, -4954245, -1548336, -4516158, 6466074, 6822556, 766652, -1821066, -2527588, + 3760244, 923418, -2351495, -4071629, -83752, 3414499, -5297842, -3234110, -2929168, 874026, + 1563368, -6554120, 3238405, 7221988, -5997922, -83752, -1520418, -1022202, -146029, 715112, + 304943, -425202, 1194001, -1958505, -3964255, -4563403, -2106682, -1120987, -2426657, -4576288, + -3444564, -1101659, 3193308, -1541893, -11821897, -7793218, 1112397, 10692321, -10767483, 7645042, + 3489661, 1662152, 2173254, 1833951, 6968585, 11291469, 294205, 3390877, 1239098, -9738838, + -8845485, 8607114, 1155346, -10063108, 5912023, -8594230, 1398012, 10526965, -689342, -2899103, + 12023761, 1857573, 805306, 970663, 341450, 1065152, -5312875, 3154654, 4836133, 7924215, + -6324340, -3146064, 1217623, 1084479, -2909840, -5716602, 3624953, -2098092, 2534031, 1331440, + -1999307, -1861868, 798864, 3594888, -2757369, -1228361, -629213, 2057289, -5787469, -2712272, + 2665027, 558346, -1962800, -1022202, 2409477, -2452426, 747324, -1664300, -416612, 1941325, + 558346, 1129576, -4995047, -3562675, 1322850, -46364172, -42567420, -9519795, -19722490, -17319456, + -9809705, -2978560, -7365869, -8871255, 6027987, 1608465, -2059437, 10112500, 3712999, 12150462, + 9414568, 2703682, 3770981, 4428112, -18631568, 8778913, -1438814, -3951370, -3489661, -11029476, + -3412352, -3833258, 10589242, -3547643, -6324340, -3158949, 1685775, -1389422, -2113124, 2325725, + -2800319, -1825361, 6478958, -6360847, -554051, -2063732, 11654394, 4617090, 4660040, -8974334, + 691490, 7971460, -4191888, 1896228, 38655, 1930588, 51540, 661425, -612033, 5078799, + -663572, -1666447, 3704409, -2639258, 2076617, 4425964, -2074469, -3088082, 1372242, 1687922, + -3330747, -1370095, -6146098, -4872641, 1612760, -562641, -1082332, -115964, 809601, -397284, + -3899830, -1838246, -29038274, 61319248, 38461432, 12375948, 3734474, 4234838, 4316442, 6902013, + 6012954, 13000866, 25909390, 1501091, 2922725, 5671505, 5284958, 6700149, -4872641, 25209310, + 17914308, -16688095, 12317966, 2312840, -2720862, 6075231, 15184857, -14248554, -4093104, 1185411, + -11879880, -8057359, -8495445, 17323750, -785979, -3058017, 2282775, 972810, -5188321, -13879187, + 9620727, 7885560, -2372970, 4307852, 9865540, -6560563, 5368709, 569083, -2585570, 7812546, + 6646462, 1563368, 891206, 805306, 5353677, 7580618, 55835, -1363652, -81604, -2394444, + 5306432, 1116692, -2160369, -2649995, -1943473, 4039417, 1864016, 9176198, -2774549, 3281355, + -2042257, 2289218, -3745212, -1329292, 1127429, -2035815, -2619930, 231928, 444529, 1176821, + 2482491, 66413080, -23407572, -22993108, 10413148, 2559801, -8701604, -7662222, -12169790, -12062416, + -8821863, -7475391, 10997264, 2564096, 1329292, -6236293, -5443871, -19441170, -19327, -7683697, + -13361643, 11134703, 7406671, 2297808, 6884833, 1934883, -2342905, -4305705, -362925, -3637837, + 5634997, 9543417, -10129680, -3728032, 148176, 5214091, 13228499, 3983582, 17742510, -9096741, + 5600638, 14796162, 8718784, -7361574, -2192581, 1741609, -3749507, 6412386, -992137, 386547, + 9448928, 5214091, 1516124, 942745, -229781, -3910568, -109522, 1200443, -4239133, -2332167, + 4194036, -1561221, -8040179, -1093069, 244813, -1312113, -8373039, 2269890, 1728724, 2190433, + 2345052, -1651415, -3472481, -1086627, -1750199, 6912750, 2918430, -2553358, 1902671, -521839, + 1443109, 210453, 21324512, 40516572, 15921444, 10861972, 12704513, -3682935, 4097399, -11547020, + 20158430, 7952132, 19366008, 5806796, 7395934, -17637284, 22078280, 32708324, 4179003, 21214990, + -4221953, -17173426, -16995186, 15571404, -4973572, 12438225, 2334315, 4999342, -9494025, 9633612, + -3302830, -3408057, 15908559, 11053098, -8276402, 14854144, 1717987, 2733747, -2933463, -11160473, + 3167539, 856846, -6167573, -7022272, 6618545, 9238475, 3085934, -3225521, 4413079, 375810, + 9874130, -5894843, -796716, -9734543, 1206886, 9564892, 6489696, -4413079, 34360, 3369402, + -8596377, -637803, -5847598, -3283503, 1874753, 2295660, 5892695, -6831146, 3032247, -7859790, + 758062, 9760313, 3498251, 1928440, -6107444, 919123, 807454, -10176925, -2630668, 1185411, + 1806034, 4032974, 1711545, -219043, -47324096, -2581275, -10690174, 13432510, -10234907, 11048803, + 332860, 8856223, -1232656, 7638600, -23650238, 6949257, -2778844, -8534100, 4155381, -10393821, + 6371584, -10492605, -5538361, -23179938, 13185550, 27754078, -10896332, -3695819, -3176128, -4561256, + 4228396, 5493263, 8046621, -20620138, 6154688, -12852690, -3676492, -740882, 10567767, 3987877, + -5312875, 2188286, 2250563, 7511898, 7713762, -12899934, -4236985, 1808181, -9373766, -8409546, + -1584843, -6023692, 2542621, 7136088, 964220, 1191853, -1694365, 6650757, 18107582, 10161893, + -11113228, 2190433, 4112431, -5564130, 6386617, 1606318, -7112466, -730144, 8160438, 818191, + 7812546, -10554882, -2439542, 6251325, 313533, -3504693, -7292855, -605590, -3863323, 5982890, + -1698660, 3719442, -1788854, -822486, -86872160, -32600950, 17639430, 6358699, -11158325, 12345883, + 10176925, 16299401, -3938485, -7112466, 14239964, 631360, -9590662, 19393924, -21706764, -28245852, + -13344463, -15141907, 9910637, 14280766, -322123, 3715147, 22486302, 9940702, -22771916, -10249939, + -14005888, 4239133, -21144124, -18406082, -1112397, 2905546, -8083129, -8800388, -12882754, -6644315, + -11785390, -11506217, -4327180, 1050120, -4198331, -622770, -7941395, -1166084, -6079526, -13380971, + 29066192, 2422362, 6895570, -11781095, 7720204, -691490, 3964255, -9444633, -354335, -1471026, + -7876970, -4881231, -3571265, 9513353, 6927782, 7462506, 4632122, 5804649, -1301375, 165356, + -6811818, -1172526, -294205, -453119, 8961449, 2508261, 5272073, 5544803, -3992172, -9560597, + 4172561, -3620658, -1677185, 4024384, 11478300, -1166084, 45567456, 16728898, 36717676, 5774584, + 2501819, -14693083, 5677947, 21960168, 8306467, 1597728, 14798310, -13198435, -5849746, 12004434, + -9083856, 4187593, 21165598, 6801081, 2944200, 6743099, -3777424, 9195525, -6906308, 255551, + 3657165, 1247688, -5310727, -5785321, 2362232, 21751862, -6949257, 5403069, -19945828, -10690174, + 9255655, 22917946, -17506286, 165356, 11128260, 2802466, 4297115, -14532022, -4986457, -12556337, + -21906480, -5787469, -12135430, -12902082, 10546292, 4200478, 3715147, -7533373, -4522601, -1479616, + -21036750, -1960653, 11963631, -8358007, 9622874, 19552838, 3081639, 12955769, 8643622, 751619, + -3788161, 11244224, -14072460, -648540, -734439, 8948564, 4438849, 8246337, 435939, 9143985, + -450972, 1909113, 1513976, 9732396, 188979, 118112, 8828305, -4679367, 5546951, 1939178, + 1589138, -2798171, 55334212, -12141873, -17001628, 2725157, 12721693, 10357314, 10587094, -3079492, + 11420318, 3592740, -13587129, -27174258, 18193482, 4898410, 13159780, 7872675, -7243463, 3210488, + -10417443, -17768280, 18457622, -11544872, -22125524, 2368675, -3635690, 2750927, -2209761, -2214056, + -5626407, -8742406, 6506876, 14940044, -21569326, 21109764, -18251464, -23776938, 2302103, 6414534, + -13449690, 10617159, -1915555, 6749541, -11583527, -5697274, 19666656, 8098161, 19913616, 5349382, + 1498944, 6401649, -70867, 811749, 10426033, -839666, 1829656, -9242770, -6362994, -5441724, + 7337952, -7168301, -6197638, 11944304, -362925, 13368086, 2014340, -9627169, 15893526, 12455405, + -1030792, 8147553, -8166881, -13320841, 5138929, -4833986, -9663676, 904091, 8482560, 11626476, + -4374424, 3678640, 5581310, -695785, 2381559, -11504070, 4425964, 4082367, -5798206, 46366320, + 56493852, -8665097, 345745, -28428388, -3214783, -20746840, -15513422, -4958540, -10608569, 15992311, + 8590, 12403866, -26530012, 22043920, -16707423, 22512072, 801011, 17873506, -6459631, 22529250, + 7410966, -10735271, 4754529, -16020228, 10625749, -8931384, 25372520, 7554848, 16677358, -27758374, + -15893526, -6818261, -14061723, -5896990, -9622874, 893353, 34297460, -15861314, 17246442, 29059748, + 4121021, 12773233, 171799, -6526203, -13569949, -10359461, 1445257, -7479686, 17549236, -11381663, + 8046621, 21221434, -2793876, -1763084, -1700807, 17353816, 18769008, 5869073, -8714489, -7649337, + -4602058, 7327214, -17194902, 3219078, -3083787, -4743792, 242666, 11340861, 1013612, 16063178, + 14718853, 2905546, 3532611, -7002944, -350040, 16514149, -2132451, 968515, 6932077, -8834748, + 169651, -10110353, -10995116, 1584843, 1586990, -2214056, -44027708, -39451424, 17572858, -5233418, + 21738976, -12369506, -10211285, -14763950, -12116103, -5602785, -34744136, -12738873, 13380971, 18683108, + 7715909, -24208584, -6871948, -11617887, 10275709, 35031900, 19621558, 8568460, 1382980, 2665027, + 1831804, 6165426, 18129056, 1483911, 4778151, -10295037, 867583, -14761803, 5804649, 7241315, + 13123273, 1722282, -8924942, -4468914, 17295834, -8003672, 6551973, 3566970, 6298570, 22091164, + -12236362, -18610094, 7048042, 15760382, 4198331, 15751793, 18895708, 9141838, 13114683, 5085242, + 2856153, 10404558, 31469226, -17452600, 23622, 5207648, 2832531, -13526999, -2362232, 10499048, + -137439, -12131135, 4881231, 22851374, -18522046, 6088116, -17540646, 10204842, 6938520, 2845416, + 715112, -8257075, -8229158, 16084653, 8699456, 3309272, -4870493, 11280732, -1580548, 70867, + -7786776, 8321499, 3109556, -88624504, -30934502, -1988570, -8843338, -21854942, 13350906, 17828410, + 30077656, 9884867, 18910742, -17559974, -37054832, 17257178, -8757438, 927713, -19952270, 19628000, + -11787538, -932008, 18240726, -50549616, 4870493, 26289494, -49063560, -12970801, -17390322, 2372970, + 1816771, 12000139, -13653701, 15906411, 2254858, -25722560, -13269301, 3038689, -3315715, -12745315, + 11196980, 29903710, 6371584, 8269960, -4818954, -7449621, 17426830, 3180423, -8787503, -42964704, + -6869800, 5413807, -21809844, 10337986, 8770323, 1735167, -16864190, -15062450, -17978734, 38558068, + 10198400, -5886253, 7430294, -32789928, 3811784, -15354508, -17673790, 17061758, -2957085, 212601, + -11162620, -41023380, 5486821, 12457553, 7159711, -3000035, 24212878, 803159, -10222022, -1629940, + -15981573, 25132002, 13640816, 7028714, -4209068, 1707250, 8044474, -7483981, 3115999, 3463891, + 1144609, 94038312, 23684598, 24270860, 20620138, -6004365, 811749, 96705480, 27930172, -8001524, + 59075128, -33137820, 24646670, 5179731, 15064598, 24144158, -7464653, -16855600, 18204218, -3311420, + -58407260, 14933601, 15146202, 12363063, 27805618, 17613660, 18161270, -16454020, 3627100, -15889232, + -8289287, 17310866, 5746666, -34095596, -20358144, -28576564, -42543800, -6515466, 8776766, 20781200, + 17940078, 15455440, 12962211, -6300717, 22254374, 12380243, -27081916, -10361609, 7224135, 20396800, + 489626, 4398047, 35912368, -6431714, -3040837, -9305047, -1872606, 18300856, -15629386, 270583, + -22106196, -19643032, -12586402, 23008140, 31621696, -9176198, 2555506, -6094559, -19630148, -13305809, + 5100274, -22739704, -6045167, -6077379, -14699526, 40282500, 8826158, 13475460, 11744588, -1168231, + 51540, 6959995, 2115272, 12668006, 7984344, 225486, -1282048, 95657512, 56566868, 4024384, + 35931696, 27376122, 7872675, 41424960, 11731703, -186831, -12839805, -9603547, -26989574, -73398840, + -5390184, 7078106, -24983824, -14323716, -2765959, 51150912, 16823386, -13346611, 586263, 3498251, + -7271380, 21532818, -3575560, -13365938, -9010841, -12603582, 8158291, -18491982, -44959716, 955630, + -23435490, -36494336, 7209103, 15644418, 22874996, 12771085, 20255066, -13831942, -38716984, -25374666, + -34819300, 13623636, 32772748, 26862872, 17486960, 32575180, 904091, 20330228, 44397076, -36758476, + 6680822, -16634408, 236223, 12668006, 13284334, 21479132, -1879048, -44914620, -34574488, 7383049, + -9728101, -12818330, -8486855, -9861245, -30633854, 2647847, 20869246, -2291365, 15915001, -9590662, + -753767, -1784559, 7990787, 30404074, 21545704, 18509162, -17538498, 968515, -10526965, 1202591, + -28144920, 5626407, 4715874, 3027952, -526134, -3485366, -8074539, 7011534, 360777, 12691628, + 23295902, -47794396, 5918465, -36582384, 16361678, -69844760, -1891933, -23173496, -36024040, 64488932, + 36483600, -23008140, -57917632, -14660871, -21124796, -50626928, 39397736, 2100239, -34980360, -13015898, + 20244328, -33133526, -22529250, -17409650, -39247412, -15068893, -783832, -31767726, -28797756, 40441412, + -15088220, -12625056, -3719442, -9040906, 34400540, -38102804, -17787608, 8046621, -10136123, -42950, + -8630737, 19834158, -36105644, 12867722, -57735096, 5877663, -16499117, -23059680, 60662120, 6302865, + -22400402, 11566347, 12689481, -48960480, 33986076, -8284992, -10526965, -3706557, 19441170, -8096014, + 880468, -23444078, 12773233, 15891379, 27309550, -23570780, -60438780, 42215232, -4818954, 17433272, + 20684562, -12517682, 11942157, 31215822, -39844412, 2145336, -14027363, -4333622, -41360536, 14124000, + -6418829, 1670742, -1020055, 5486821, -6949257, -6249178, 11405286, -10471130, 8265665, 2433099, + -7756711, 4683662, 1286343, -91293824, -50906100, 11433203, -32469952, 3936338, -23474144, -12146168, + -34415572, -23673860, 17315160, 51292648, 53873924, 8579197, 38008312, -26252988, 66413080, 48773648, + -38871600, -34948148, 10986526, 10971494, 56130928, 20383914, 35933844, -12955769, 14390288, -7290707, + -6045167, -11894912, 52478056, 23504208, 50264004, 45674828, 8755291, -2692945, -22254374, 22050362, + -2656437, -45977624, -30683246, -8740258, -23789824, -5304285, -24449102, -21431886, 14484777, -6489696, + -15485505, 38394860, 45221712, -26031796, -8729521, 61725124, 25144886, -42142220, -41472204, -14929306, + 15567109, -1956358, -7748121, -29983166, 25297358, 7825431, -9803263, 7052337, 6925635, -37175088, + -16421807, 3560528, -14070313, -18036716, -19557134, 50502372, -39593156, -35407712, 14510547, 25933012, + 36855116, -18674518, -6032282, 3607773, -17038136, 17686676, -2695092, 13297219, -11138998, -4511863, + 3380139, 5211943, -6416681, -5497558, -539018, -6730214, -34724812, -51017768, -43802224, -380105, + -34462816, -44362716, 11463268, -3824669, -61757336, 44122200, 7939247, -3777424, 22073984, 68012952, + 65107408, 28011776, -79499848, 29545080, 21234318, -78024520, -966368, -37679748, -18156974, 40155796, + -47042776, 27376122, 135291, -8136816, -16716013, 8083129, -3768834, 13496935, -8920647, -41790032, + 40733468, 19179176, 48756468, -5076652, -16194174, -23510650, 19859928, -21189222, 57569740, 12068858, + 34662532, -44719200, 35815732, 1374390, 12816182, -29029684, 9962177, -34475704, -5218386, -35362612, + 14682346, 24451248, -46724948, 1902671, -38454988, 18116172, 23098334, 22262962, -2800319, -66363688, + 388695, 17534204, -5454609, 29512868, -63226212, 16297253, -26143466, 8540542, -22104050, 4638565, + 16700980, -7125351, 53687, -6880538, -7958575, 2568391, -16814796, 21554294, 5156108, -508954, + -26972394, -2484639, 3184718, -1909113, 11766063, -11725261, 2944200, -1191853, -5690832, 95575904, + 115749368, 48541720, 40306120, -66685808, 64156072, 93355408, -102114992, 12309376, 66108136, 11622182, + -121777352, -12045236, -66138200, 21436182, 24144158, -30655330, -12105365, 22308060, -55941948, -4346507, + -21951578, -27339614, 10853382, -42264624, 45610404, 32669668, 59002112, -29124174, 9607842, -6249178, + -24122684, 74683040, -1509681, -34183644, -16254304, 16241419, -16101832, -19391778, -22952306, 38062000, + 14046691, 52862456, -3779571, 19469086, 69164008, -43770012, 9143985, -29676076, 54874648, -21434034, + 25649544, 11035918, -2229088, -20669530, -39157216, -26310970, 10988674, 49770080, -46733540, 42015516, + 49484464, 25033216, 57840324, -28138478, -23053236, 37847252, -6564858, -6867653, -53422952, -3231963, + -44081396, 9199820, 55778740, 27526446, 14027363, 25733296, 15197742, -23830626, -10838350, -41725608, + 47341276, 2136746, -18848464, 12668006, 4243428, -21859236, 11493332, -3000035, 13565654, -2119566, + 20596516, 10018011, -44154412, -151910848, -63211180, -109354160, -58510340, -46986944, 25456272, -70362304, + -71182640, -34628172, -95236608, -31501438, 72271416, -2652142, 3096672, -19935090, -16685948, -9504763, + 6762426, -1649268, -63748052, -10653666, -12438225, 92204360, -11839077, 81915760, 6856916, -22701050, + 21601538, 67330056, -3371549, 154619, -27180700, -8540542, -28544352, 15564961, -11993696, -24970940, + 12436078, -33539400, 26890790, 26605174, 5373004, 58826020, -26817776, 29676076, -25071872, 32804960, + 22694608, 61978524, 8641474, -26167088, 33730524, -4952098, -20920786, 78855600, -5881958, -5480379, + 45853072, 13434658, 61710092, -48741436, -46849504, -7859790, -20287278, -7191923, -75831944, -17987324, + 26332444, -11042361, -32637456, -54123032, 3620658, 15539192, -26686780, -26345330, -46409268, -17332340, + 19709604, 19522774, 41089952, -7419556, -3794604, -2302103, 13700946, 15556372, 2772402, 25159918, + 7146826, 1917703, -3517578, -3377992, 18616536, -8875550, 18393198, 19823422, -925565, }, { -11068131, - 5985037, -3105261, 3661460, -2151779, 3077344, -6393059, 304943, -238371, -708670, 1481764, - 3173981, -96637, -281320, -3433826, -1352915, 1486059, 861141, -386547, 1350767, -397284, - 478889, -1490354, -1000727, -1000727, -326418, 150324, -730144, -508954, 1717987, -974958, - 1037235, -942745, -146029, -723702, 916976, 339302, 743029, 1243393, 1544041, 577673, - 416612, -122407, 176094, 231928, -279173, 283468, 3914863, -4479651, -601295, -824634, - -1114544, 725850, -2224793, 755914, -51540, 1013612, 889058, -1765232, -627065, 2692945, - -283468, 575526, -500364, 1170379, 2469606, 2856153, 485331, 1230508, -42950, -2254858, - -68719, 244813, -489626, 8590, 1241246, -1294933, -1741609, 758062, -841814, -777389, - -1221918, -53687, 1282048, 322123, -380105, -466004, -513249, -8590, 283468, -687195, - 251256, -785979, 472446, -11248519, -7962870, -3914863, -2918430, -2267743, -2299955, -816044, - -1696512, -547608, -1063004, -2796024, 545461, 1404454, -223338, 794569, -528281, -1458141, - -1438814, -2194728, -738734, 506806, 66572, -1243393, 828929, -1498944, -1458141, 942745, - 0, 30065, 770947, 854699, 231928, -356482, -435939, -594853, 296353, 133144, - -768799, 390842, -1526861, -678605, -382252, -180389, -1090922, -240518, -405874, -45097, - -16003048, -2106682, 1196148, 277025, 1127429, 165356, -914828, 618475, -712965, -710817, - -1466731, -1168231, 545461, -410169, 983548, -942745, -17180, -910533, 266288, 1662152, - -457414, 1245541, 34360, -1069447, -255551, 1509681, 706522, 996432, 1052267, -1490354, - 1000727, -584116, -156766, -785979, -427349, 487479, 631360, 397284, -401579, 1226213, - 992137, 657130, -386547, -723702, 77309, -588411, 98784, 18839874, 14955076, 3573413, - 6680822, 1644973, 5162551, 3674345, 1095217, 3700114, 1449552, 2813204, 1185411, -979253, - 2772402, 2001455, -783832, -219043, -5211943, -523986, 246961, 3204046, 343597, 158914, - 1599875, 167504, 1447404, 1382980, 204011, -68719, 504659, 2201171, 1647120, 1436667, - -146029, -513249, 83752, 1045825, -382252, -62277, 1116692, 414464, -556198, 17180, - 240518, -1058710, 1378685, -758062, 33174328, 12034498, 5942088, 3393024, 2205466, 2057289, - 2113124, 3298535, 916976, 5433134, 846109, 420907, 2461016, -1374390, 665720, -659278, - -496069, -1002875, 3644280, 1872606, -186831, 2617783, -1750199, -556198, -545461, 4088809, - -279173, 1417339, 446677, 1964948, 472446, -687195, 1196148, 1322850, -521839, 420907, - 697932, 298500, 977105, -350040, 1103807, 807454, -2549063, 513249, 448824, 440234, - 1973538, 12805445, -9502615, -3182571, -4458176, -2596308, -2699387, 1846836, -1593433, -3816079, - -1103807, -5108864, -1344325, -2171106, -5119601, -1174674, 996432, -3068754, -1187559, 575526, - -3659312, -75162, 3923453, 992137, 442382, -1782411, -68719, 1496796, -118112, -1636383, - -1964948, 1943473, -319975, -2340757, 68719, -951335, 2793876, -10737, 1166084, -403727, - 2388002, -1608465, 852551, 412317, 425202, 100932, 478889, -4295, -998580, 1625645, - 1024350, -34965328, -19630148, -4129611, -4827543, -3481071, -4213363, -6169721, -476741, 51540, - -1702955, 1402307, -1578401, 137439, -105227, -2108829, -2132451, -3588445, -1155346, 3294240, - -3195456, -491774, 3141769, 1846836, -450972, 1007170, -418759, -3489661, -1642825, -2892661, - -912681, -6442, -674310, 1462436, -2933463, -2467459, -85899, -3002182, -2209761, -2166811, - -2351495, 2327872, -736587, -3163244, -972810, 678605, 923418, -1172526, -1563368, -848256, - -2896956, -21653078, 12543452, 4337917, 2278480, 1844689, 2141041, 678605, -2022930, 350040, - -1093069, -644245, 4097399, 2098092, 3569118, 3135326, 3755949, -3148211, 1748052, 3513283, - 880468, 3032247, -3582003, 496069, -695785, -493921, -1163936, 1153199, -216896, -169651, - 3691525, -3738769, -775242, 1116692, 2250563, -1138166, 1926293, -1610613, -2014340, 2525441, - -1073742, -332860, -468151, 820339, -49392, 1050120, -1060857, -732292, -929860, -549756, - -770947, 1833951, 504659, 448824, -949188, -1733019, 420907, 31952410, 12897787, 2896956, - 7123204, 5823976, 970663, 2684355, 6732361, 3279208, -294205, 1619203, 727997, -858993, - 1840394, 6053757, 1260573, 7196218, 3298535, -5643587, 968515, 365072, 1078037, 5360119, - 2813204, 2254858, -569083, -648540, -813896, -715112, 702227, -974958, 1627793, 689342, - 2257005, -311385, -704375, 1035087, 1829656, 1219771, -304943, -2375117, -1166084, -1241246, - 2186138, 1823214, 2482491, 1597728, 302795, 547608, 2115272, 1917703, 1367947, 414464, - 257698, 1279900, 1099512, 35661112, 10078141, 4559108, 5439576, 1032940, 5252745, -751619, - -2168959, 4295, 1262720, 691490, -279173, 1140314, 5364414, -685047, -3536906, -2276333, - 2544768, 798864, 2985002, 5022965, 4189741, -169651, 2759517, -2993592, 242666, -2297808, - 3199751, 2012192, -3816079, 2291365, -1861868, 384400, -1518271, 2321430, -1464584, 2879776, - 2115272, 1902671, 3481071, 1286343, -150324, -753767, -66572, 601295, 3871913, 12885, - 34360, 399432, 1844689, 1391569, 85899, -369367, -633508, -1964948, -414464, 5042292, - -15257871, -6010807, -2585570, -3326452, -1707250, -1170379, 96637, 2302103, -2345052, -3955665, - 3682935, -4780299, -4818954, -725850, -1224066, 2269890, -1466731, 32212, -4664335, -2568391, - -5600638, -5866926, -6816113, -792421, 1413044, -4531191, -1398012, 798864, 358630, 335007, - -745177, -4490389, -3019362, 2143189, 631360, -944893, 4232691, -2798171, -1462436, 1226213, - 2538326, 2325725, -526134, -530428, 908386, 781684, -2985002, 395137, -1814624, -620623, - 73014, -1015760, 10737, 2070174, 281320, -264141, 341450, -2005750, 1159641, 1891933, - -519691, 51540, -38695508, -12116103, -7350837, -2978560, -5302137, -4146791, -1284195, -2946348, - -1297080, -3949223, -5448166, -3813931, -1370095, -7945690, -1962800, -3206193, -4896263, -551903, - 783832, 2649995, -2886218, -3949223, -1526861, 3324305, 4157528, 5207648, 2718714, -98784, - -2600603, -1116692, -19327, -3103114, 1267015, 2177549, 2645700, -1791001, -1612760, -1421634, - -766652, -577673, -1144609, 2126009, -648540, 1391569, -2707977, -4584878, -1982127, -137439, - 2280628, -3964255, 1288490, -1881196, 1844689, -1915555, 1086627, -1595580, -124554, -1024350, - -148176, 717260, 1440962, -966368, -1376537, -22194244, 5916318, 1640678, 21475, 3884798, - -3732327, 989990, -8585640, -2800319, 2978560, 2104534, 5527623, -416612, 6027987, -3534758, - -899796, 2873333, -5265630, -1945620, -3105261, 5866926, -390842, -4898410, 2435247, 4670777, - -4194036, -3204046, -3779571, 1063004, -901943, 1999307, -1466731, -1219771, -1039382, -2308545, - 3289945, -2705830, 609885, 2145336, -309238, 2482491, -1498944, 5471789, 783832, -588411, - -1971390, -1949915, 36507, -2239826, -2738042, -1709397, 377957, 1842541, -315680, 478889, - -2400887, -2388002, -3399467, -1372242, -1127429, -919123, 891206, 1331440, 19166292, 27584428, - 9463960, 9609989, 13022341, 9496173, -1359357, 1956358, -1054415, 1848983, 1574106, 2499671, - 1745904, 4810364, 1780264, 3062312, 899796, 9408126, 2158221, 4683662, 2682207, 2527588, - 7310035, 1876901, 9165460, 4889821, -1868311, 6624987, 1694365, 3350075, 6470368, 1481764, - 3854733, -1797444, -670015, 1999307, 2911988, -3775276, 3384434, -2102387, -4294968, -2345052, - 3562675, 5527623, 4052302, -581968, 1314260, 1432372, 2003602, 3008625, 1619203, 3377992, - 1930588, -2830384, -83752, 2435247, 3077344, 1127429, 1000727, 751619, -3049427, -1032940, - -1885491, 66346508, 4833986, -3197603, 5164698, -3429532, 7331509, 2426657, 7707319, -3710852, - 592706, 208306, 4574140, -8175470, 1490354, 5544803, -1277753, -1054415, 6768869, 11042361, - -4660040, -2336462, 1189706, 5557688, -2523293, 3678640, 47245, -3307125, -3045132, -2596308, - 2177549, 3500398, 3685082, -2538326, 4082367, -2506114, 3964255, 3884798, -1052267, -2224793, - 1294933, -3702262, -5643587, 1462436, -3889093, 1791001, 292058, 846109, 2267743, 208306, - 2776696, 446677, -3850438, 1754494, -1065152, 2050847, -2830384, -285615, 354335, 2166811, - -1574106, -4496831, -876173, -1801739, -22552874, -21930104, -4952098, 1679332, -966368, -3330747, - -3569118, -4922033, -1307818, 3594888, -1187559, -1269163, -5053029, 5280663, -324270, -4408784, - -3786014, 9174050, -8358007, 822486, 6085969, -764504, 985695, -8091719, 2546916, -3498251, - 1902671, -5641440, -3682935, 869731, 1462436, -2665027, -2954938, 227633, -1226213, 347892, - -3451006, -1990717, 3558381, -444529, -1705102, -1069447, 4529043, 1958505, -2619930, -4015795, - -3539053, 1129576, -562641, -1726577, 362925, 695785, -1956358, 5351530, 2914135, -622770, - -440234, -1464584, 631360, -1636383, -1591285, -1685775, -335007, -3115999, -2443837, -4163971, - 936303, -4451734, -178241, -1166084, -1086627, -292058, -8907762, -7494718, -9167608, -6442451, - -4849018, -3081639, 618475, 6442, -2392297, -813896, 2070174, 7967165, -6959995, 3545496, - -2398739, -4226248, 5446019, -371515, 1000727, 7395934, 974958, 3173981, -4670777, -977105, - -13406740, -1410897, 2428804, 1758789, 1060857, 1462436, 1784559, -2838974, -4075924, 3161096, - -435939, 2993592, 1365800, -3397319, 2815351, -176094, -9521942, -7653632, -1385127, -7239168, - 878321, 2413772, -579821, -1773822, -921271, 444529, -2244121, -569083, -502511, -1168231, - 2209761, 719407, 682900, -1213328, -1028645, 3732327, 876173, -2248416, 2441689, -481036, - -1756642, -3730179, 30065, -1990717, -717260, 2789581, 2102387, 2961380, -43074228, -9820443, - 637803, -8568460, 3461744, 856846, 10335839, -4836133, 618475, -2841121, 6929930, -14128295, - -13550622, 5710159, -6564858, 10189810, 3691525, -8192650, -14351633, -328565, -4058744, -6966437, - -2851858, 1638530, 2327872, -3365107, 12292196, 657130, -1219771, -5141076, 4187593, 4655745, - 5018670, 5390184, -665720, -3191161, -1204738, 3186866, -246961, 3846143, -3614215, -1423782, - -1241246, 4456029, 3582003, -3904125, 5070209, -2823941, -3524021, 433792, -1597728, -3354370, - 3463891, -3970697, -521839, 1009317, -955630, -1617055, 914828, 3324305, -2055142, 3186866, - -2628520, 2138894, -1455994, -1647120, -1024350, 642098, 4123169, 745177, 3863323, -2450279, - 39507256, 34709780, 7264937, 9279277, -1840394, 11345156, 9101036, 11428908, -461709, 4597763, - 2765959, -10709501, -9066676, 4999342, 987843, -7662222, -8102456, -4514011, 534723, 4629975, - 1363652, 10872710, 9921374, 4372277, -2274185, -2372970, 6575595, 6176163, 502511, 5418101, - -1722282, 6919193, 403727, -1436667, 9579925, 5027259, 7859790, 5117454, 1743757, 5557688, - 2787434, 1969243, 5113159, -2729452, 1041530, 6831146, -49392, -4290673, 4039417, 4060892, - 2879776, -2991445, -53687, 4015795, 5961415, -2896956, 7204808, 8282845, -1400159, -4361540, - 788127, 1964948, 1301375, 3682935, 10737, 1372242, 2808909, -1911261, 229781, -2750927, - -691490, -3738769, -2160369, -382252, 47916804, 3914863, -1359357, 3393024, 2310693, -7846905, - 2055142, 2149631, 6442, 5119601, 7325067, 10971494, -4885526, -4937065, -7741679, -6247030, - 7073811, -534723, 10213432, -2433099, -2473901, 4234838, 8875550, 3551938, -8905615, 7080254, - -2596308, 5669357, -2935610, 4406637, -5360119, 3322157, -423054, 5168993, 633508, 2959233, - 1586990, -9008694, -4960687, -813896, -1816771, -818191, -2806761, 4389457, 1668595, 9345849, - -1430224, -6345814, -3704409, -609885, 569083, -7060926, 2403034, -2383707, -304943, -657130, - -4129611, 3803194, 7224135, -2239826, 3723737, 891206, -4037269, -354335, -3841848, -3180423, - 657130, -5615670, -4000762, 2388002, -277025, 1294933, 3886946, -5315022, 6470368, 663572, - -2622078, -6431714, 1879048, -2362232, 13840532, -3304977, -13211319, -8935679, -11909944, 11016591, - -8798241, 2441689, 13462575, -594853, -13653701, 936303, -14332306, 11946452, -4153234, 11907797, - 90194, -4533338, 10256382, 384400, 2145336, -7705172, -9715216, -1563368, 3444564, 2093797, - -1879048, -4490389, 4552666, -1387274, 3408057, 5207648, 6347962, 2927020, 3524021, -12826920, - 1097364, -2907693, -4357245, 1758789, 6386617, -5357972, -9822590, -4350802, 2916283, 1123134, - -8626442, -3528316, 4067334, 5905580, -5171141, -3386582, -3972845, 6040872, 8053064, 1621350, - -2667175, 908386, 5781026, -2755222, -193274, -3777424, 4065187, -4726612, -519691, 5607080, - 3390877, -1634235, -816044, -139586, -1771674, -48348448, -48984104, -7939247, -24011014, -14903537, - -8523363, -13327284, -1623498, 10050223, -21960168, 8018704, -4498978, 7314330, 1262720, 4481799, - -9111773, 2308545, -1144609, -4754529, -20145544, -4110284, -10477573, -12811887, -1340030, 3231963, - 676457, -4361540, 2785286, -4140349, -1228361, 10692321, -231928, -3566970, 661425, 6994354, - 9401683, 6298570, 0, 5029407, 5813238, -571231, 51540, -10464688, 3839701, -8647917, - 1614908, 8338679, -5746666, -10471130, 3021510, -5873368, -5619965, 1159641, -88047, -4960687, - 2407329, -1176821, 11280732, 6339372, 3451006, 1398012, 4136054, -408022, 1243393, -4443144, - -8003672, -1316408, 689342, -5708012, -3966402, -3131031, -2675765, -3229816, 1786706, -1653562, - -489626, -3582003, -28658170, 53322020, 41987600, 2540473, 8602819, 3315715, 9371619, 14106820, - 3322157, 13698798, 2557653, -14568529, 9723806, 11540577, 3519726, 3403762, 8759586, 11370926, - -11375221, 9474698, -5970005, 8315057, 1324997, -7007239, 1410897, 9414568, 5441724, -11315091, - 5512591, -4655745, 16415365, -1413044, 3874061, -2555506, -10509785, 10610717, 10625749, 5018670, - 2738042, -498216, 3846143, 11267847, 2660732, 8053064, 1045825, 5592048, 3090229, -762357, - 6139656, -7404524, -11467563, -5065914, -8740258, -7438884, -3783866, -7638600, 10288594, 7290707, - 910533, -1840394, -3644280, -1209033, -251256, 77309, 521839, 1428077, 2160369, 1185411, - -201863, -2710124, -2295660, -384400, -204011, -983548, 1168231, -1189706, 6204081, -1391569, - 8143258, 71541272, -28011776, -15176267, 2598455, -148176, -3539053, -19849192, -8478265, 5089536, - -957778, -2826089, -3878356, 3081639, -16323023, -4640712, 8497593, 15934329, 8686571, 7166153, - -5085242, -4803921, -9390946, 11003706, -15466177, -2673617, 3850438, -10170483, 3358665, 4417374, - 12479027, -19026706, -1589138, -307090, -3925600, 5093831, -17628694, -9178345, 19443316, 12818330, - 2680060, -3304977, 11620034, -3369402, -1488206, 2194728, 9090298, 5259188, -5596343, 1224066, - -3262028, 7468948, -11879880, -5327907, -7189776, -7546258, 14566382, 4022237, 1818919, -6397354, - -526134, -2149631, -2555506, -6708739, 1095217, -6358699, -261993, 2229088, 5617817, -9663676, - -6702297, -8538395, -2604898, 4647155, 824634, 6161131, -813896, -7934952, -833224, -3569118, - 3715147, -330712, 21251498, 48943300, 8035884, 18678812, 16870632, 16194174, 5407364, 12109660, - 7456063, -3500398, -9932112, -6296422, -2864743, 13870597, -11834782, -13097503, -893353, -581968, - -5357972, -10020159, 29673930, 27885076, 20980916, 1050120, -11963631, 2145336, 1997160, -5946382, - 6837588, 4400194, 11980811, 1421634, 4898410, -541166, -8229158, 13600014, 11257109, 8143258, - -1932735, -10722386, 672162, -790274, -2991445, -21934398, 15841987, -9972914, 18268644, 1080184, - 9884867, -2055142, 10898480, 16580721, 3313567, -7441031, -547608, 3077344, -5446019, 2952790, - -2110977, -6979322, -3837553, 2345052, -1700807, 6977175, 2461016, -11688753, 749472, -1567663, - -12620761, -2927020, 2576981, -4763119, 1391569, 10756746, 4406637, -581968, -3704409, -2802466, - 231928, 4715874, -1286343, 5095979, -51391432, -6824703, -32034014, 360777, 5637145, -10874857, - -18734648, -21668110, -20544976, -12163347, -16756815, -4108136, -1140314, -4329327, 5377299, -3341485, - 1086627, 13151190, 5901285, -1301375, 31110596, -6831146, 6227703, -4550518, 2607045, 4516158, - 1651415, -1748052, 4565550, 14570677, 4380867, 5158256, 1629940, 5828271, 12300786, 16958678, - 5325760, 20577188, -5512591, -17740362, 17916456, -5682242, -3775276, -3612068, 10127533, 15721728, - 11847667, -302795, -4086662, -8995809, -22939420, 14130442, 16050293, 11362336, -13700946, 8291435, - 2136746, -1378685, 12996571, 2196876, 8727374, -7260642, 4256313, -9051644, -874026, 7853348, - -2293513, 5907728, -1249836, -3304977, -3234110, -11025181, 1110249, 826781, -94489, 2121714, - -2448131, -13600014, 1030792, 712965, -89930176, -40374840, 18309446, -3515431, -3079492, 3189013, - -11265699, -9904195, -3386582, -4479651, -15751793, 11100343, 1211181, 23489176, -13146895, -11306501, - -19235012, -10782515, -19810536, 1589138, 7232725, -29590178, 19048180, 16378858, -2368675, 3242700, - 12401718, 1808181, 10909217, -22434762, -22570054, -12543452, -14813342, -11420318, 36507224, 11875585, - -8076686, -13151190, -18741090, 8832600, 4992900, -8918500, 7260642, 7164006, -13230647, 1191853, - 2911988, 10346576, -12292196, 30043296, -13219909, -10563472, 4657892, -3296388, -206158, -9118216, - -3461744, 878321, 19076098, -6000070, 27507118, 5811091, 1750199, 3010772, 7312182, -8336532, - -3021510, -10941429, -8836895, -8403104, -85899, 14772540, -9721658, -7181186, -4142496, -5624260, - -5220533, -712965, -3470334, -5201206, -4554813, 14134737, 45541684, 23310934, 14583561, 9790378, - -15925739, 1552631, -12869870, 20154134, -2121714, -2750927, 6947110, 4389457, 4769561, -665720, - 7196218, 2514703, 7593502, -6268505, 19829864, 2611340, -1728724, 59201828, 3298535, -4578435, - -15101105, 8770323, -14042396, 13174812, 31986768, -2553358, 7881265, 7818988, -16370268, -18429704, - 609885, 341450, 14083198, -9139690, 564788, -1017907, 10387378, 10595684, 17832704, 6637872, - 6219113, 7318625, 801011, 11680164, 5514738, -21633750, 4670777, -11175505, -27668180, -2441689, - 7844758, 100932, 2366527, -3725884, 584116, -934155, -96637, 3446711, 657130, 12584254, - -7516193, -1219771, 2510409, 2611340, 416612, -4891968, 8783208, 14798310, 14592151, 3010772, - -3023657, -1529008, 5231270, -727997, -1769527, -337155, 2920578, 6818261, -1140314, -2677912, - -4842576, -3064459, 66640712, -19428284, -7363722, -18073222, 33537252, 12339441, 2763812, 6790344, - -4907000, -7844758, 11798275, 1078037, -11645804, 2995740, -15356656, -11632919, 751619, -15567109, - 2104534, 5059472, -11499775, -20227148, 1915555, 1069447, 13673028, 22449794, 15650861, -10552735, - -171799, 13935021, 25477746, -26706106, 10063108, -5027259, -448824, -12195560, -17126182, 1440962, - 15356656, 4494684, 6869800, 9689446, -1075889, 6466074, -1550483, 4619238, 9848360, -17832704, - -12494060, 27670326, -2218351, -878321, -6285685, 11040213, 35824324, 8952859, 5383742, 11607149, - -9455371, -10675141, -15032, -7973607, -20560008, 13200582, 1675037, -10260677, 5617817, 3060164, - -5841156, -9665824, 13045963, -4520453, -15622944, 7275675, 7209103, 11012296, -10896332, 989990, - 4737349, -1926293, -4176856, 16516297, -1352915, 3027952, -7374459, -981400, -229781, 56899728, - 53912576, -17547088, 14710263, 4443144, 11431055, 28926604, -3556233, -15094663, -5284958, 55875376, - -31387620, -5963562, -15547782, -12461848, -25428354, 27951648, -8044474, -37967512, -28286654, -34638912, - -13269301, 30709016, -3620658, 14508400, -5392332, -15655156, 13718126, 4067334, 17364552, -16664473, - 15457587, 12287901, 6369437, 7157563, -27240830, 7907035, -22728966, 19318762, 40830108, 11856257, - 12320114, -25890062, 36571648, 9814000, -3721589, -5604933, -7329362, 11482595, 18328772, 4486094, - -4168266, -1015760, 5018670, -8778913, -6229850, -8446053, -6483253, -648540, 13445395, -8907762, - 20055350, 7230578, 12300786, -4110284, -28567974, -19170586, 7372312, 1979980, -8478265, 10715943, - -468151, -955630, 5826123, -4002910, 8448201, -1406602, -916976, 4099546, -4900558, -852551, - -5306432, -3225521, -6674379, 4406637, 382252, 1425929, -53541064, -31915902, 7666517, 4185446, - -319975, -23555748, 13924284, 7853348, -14231374, -38534448, 31372588, 7668664, 11620034, 17736068, - 10419591, -5102421, 5677947, -9756018, 26031796, -21786222, -37690484, -1288490, -1973538, -17879948, - -40965400, 1234803, -8516920, -21522082, -11970074, -6771016, 9006546, 1494649, 14867029, 30017526, - -12936441, -24882894, 7664369, -2952790, 133144, 12270722, -17781164, -16121160, -2349347, 14484777, - -19224274, 15814070, -5656472, 30528628, -4531191, -9605694, -3766686, 139586, 5948530, -34976068, - 4881231, -30266634, 30769146, 105227, 19247896, 11542725, -12013024, -1561221, -15869904, 7670812, - -1876901, 6083821, 5617817, -20834886, -3339337, -20098300, -9038759, 8942122, -6272800, -12335146, - 5718749, -188979, -20983062, -10269267, 2044404, 712965, -8763881, 9083856, -4836133, -5334350, - 4260608, -12509092, 6369437, -74120400, -34222300, -12446815, -8349417, -2257005, 7705172, -25765508, - -18601504, 6867653, -21726092, 6859063, -24124832, -7479686, -23330262, -28039694, 29624536, 12363063, - 4383014, -1737314, -24605868, -41517300, 20654498, -54462332, 19681688, 856846, -17557826, 2916283, - -10926397, 4217658, 37879464, -19065360, -2123861, -40913860, 32117766, -9470403, 14568529, -14383845, - -4915590, -3292093, -1644973, 19110456, 6457484, 39760660, 47637628, -4973572, 597000, -15753940, - 1657857, -6116034, 7344394, 15251429, 1775969, 34589520, 9676561, -12809740, 5411659, 7204808, - 94489, -2396592, 972810, 26306674, -19707458, -39479340, -16335908, 627065, 9214852, 6906308, - 19758998, -1958505, 8377334, -9975062, -16007343, -21977348, -17706002, 1533303, -5753109, 10771778, - 2733747, -6027987, -2881923, 18981608, -420907, 10559177, -4660040, 3639985, -4724464, -4322885, - -7264937, 94493576, 42183020, 29152090, 12092480, -10758893, -17186312, -29493540, 16353088, 28271622, - 11678016, -13234942, 33363306, 18784040, 33354716, 2265595, -24142012, -9369471, 50085760, -52293376, - -10752451, 34574488, -20493436, -11491185, 80889264, -10151155, 23115514, 73349448, -11781095, -4827543, - -2153926, 9113921, -4078072, 31799938, 20444044, 26210038, -18567144, -43334072, 17306570, -17100412, - 20802674, -8123931, 7544110, 30880814, 17877802, 1806034, 13572097, 6257768, 13067438, 29854318, - 16816944, -3189013, 29014652, 12165495, 4125316, 6899865, 53455164, 32070520, 49392, 29132764, - -12869870, 36831492, -9193377, 8117488, -10475425, 4406637, 21092584, -11714523, -858993, -2093797, - 7312182, 813896, -13844827, 551903, -11860552, -21174188, 3532611, -28187870, 10943577, 17282948, - -7088844, -12071006, -8121783, 15139760, 4464619, 809601, -6345814, 121951304, 55115168, -24700356, - 10657961, 63011464, 1486059, 45505180, -13368086, 18000208, 37937448, -28580860, 3457449, 66196184, - 59463824, 48399988, 17102560, 41568840, 7002944, 36440652, 12717398, 11027329, -22780506, -26751204, - -38044820, -75387416, 24032490, 893353, -20463372, -7213398, 26087632, -17134772, -2589865, 2944200, - 14669461, -66799628, -10803990, 48475148, 37327560, -13488345, 24663850, 21062520, 13662291, -8188355, - -15524159, -6743099, -10443213, -6764574, -24672440, -20965882, 17109002, -41620380, 13780403, 34149284, - -10123238, -24363202, -37958920, 35613868, -1110249, -17987324, -11753178, -8211978, -13024488, 7501161, - -6012954, -13239237, 13531294, 55437292, -27702540, -16662326, 7084549, -10771778, 12801150, 508954, - 28589450, 5523328, -2776696, -2396592, -29686814, -14014478, -4610648, 2529736, 2295660, 10625749, - 6569153, 1236951, 4776004, 5523328, 17517024, 1447404, 485331, -11373073, 5746666, 8463233, - 3508988, -48185240, -13445395, -57921928, -12599287, -57887568, 27818504, -55155972, 29665340, -9579925, - -31933082, -9683004, -14952929, 67422400, 10456098, -49166640, 938450, -32119912, -25305948, 33195802, - -37510096, -34716220, -39150776, 58800248, -7928510, 38805028, -59869696, -31956704, 23813446, -27940910, - 22711788, 65088080, 42775728, 40261024, 6899865, -6953552, -31621696, -44998372, -2409477, 9962177, - -41661184, 874026, -24554328, 12017318, 18393198, -47699908, -40486508, -74728136, -11684459, 5108864, - -32115618, -46224584, 45513768, 2297808, 46748572, 45848776, -5643587, -6509023, -18640158, 26441966, - 22917946, 3285650, 11323681, -3775276, -2353642, 22361748, -5912023, -26231512, -20143396, -33021856, - -27721866, -10269267, -1288490, -4552666, -41723460, -24210730, 13580687, 3143916, -14847702, 17940078, - -3665755, 910533, 28205050, 23293756, 15002321, 5935645, 18056042, 2662880, 470299, 8353712, - 5931350, -3985730, 1713692, -82304456, -14184129, 7241315, -7593502, 113817, 22282290, -18234284, - 19814832, 18749680, -12992276, 25383256, -35281008, 44216688, 30335354, 1505386, -32497870, 2609193, - 21584358, -96170760, 19950124, 39206608, -68867656, 28333900, -35259536, -50530292, -46050640, 23383950, - -11512660, -71807560, 38588132, 20637318, -43471512, -72651520, 14699526, 8557722, -22872848, -5293547, - -37329708, 35081292, 28980292, 51047832, -40868760, 6644315, -54279796, -20544976, 9363029, -34735548, - 14437533, -4320737, -27251568, -40980432, -44283260, 64753076, -43658344, -20656646, -16432545, 2703682, - 29751238, 17630840, 21700322, 210453, 25391846, -8557722, 4060892, -10788958, -26847840, 5282810, - 57498876, 8907762, 1322850, -236223, -37041944, 24084030, 38684772, 40359808, 8068096, 2993592, - -1767379, -3238405, 5836861, 779537, -18429704, -418759, 3706557, 2695092, 274878, 362925, - 14276471, -4964982, 1823214, -3618510, 753767, 24878598, -54651312, -29038274, -57711476, 16432545, - -10249939, 22909356, -15726023, 10855530, 18893562, -19320910, -32953136, 49173080, -12902082, -21923660, - 57129508, -11763915, -13314399, 65294240, -37776384, 9607842, 15983721, 5087389, -57582628, 184684, - -8403104, -34619584, 19789062, -27197880, 36631776, -6459631, 40774272, -44631152, 27741194, -79018808, - 871878, -43119324, 48105780, -7425999, 6573448, -8297877, -43851616, -3199751, 38201588, 100815768, - 7438884, 6322192, 21421150, 34443492, -5854041, -9732396, 3146064, -1752347, 88669600, -8061654, - 13653701, 35581656, -34565896, -59100896, 178241, -62461708, -7672959, -32085554, -23001698, -12562779, - -26371100, 14794015, 21962316, -36399848, 45883136, 38089916, -5469641, -9487583, -37516540, 26145614, - 9274982, 24796994, -21043192, 10222022, -4110284, 18738942, 2136746, 18129056, -9274982, 13277891, - -2282775, 270583, 4406637, 20562156, 9846213, 6255620, -6822556, 461709, 1853278, 95008968, - 103543072, 721555, -31769874, -25548612, 86719688, -57058640, -65002184, 67555544, -61407296, 39440684, - 12000139, 54640572, 50410032, 33988224, 5446019, -34559456, -29802778, 70929240, -30189326, -3143916, - 17289390, 60410864, 87535728, -2763812, 59788092, -49089328, -51200304, 5682242, -18942954, 28162100, - 17871358, -43785044, 5912023, 27674622, 71977208, 24472724, 29469918, 26993870, 32167158, 8209830, - -2581275, 45621144, 7990787, 36468568, 58488864, 12137578, -24131274, -20525648, 52714280, 13750338, - 108194520, 25196426, 42610372, -44225280, -69477536, -6751689, -81110456, -52014200, -18539226, -27790586, - 2987150, -4198331, 592706, 1047972, -60672856, -50259708, -26566520, -51896088, 18889266, 20534238, - -15743203, -4075924, -48157320, -7610682, 14130442, -13758928, -4183298, 4866198, -30414810, 12644384, - -9384504, 3586298, 5334350, 139586, 2027225, 6556268, -7303592, 1101659, 7015829, -304943, - 1638530, 2029372, -45176612, -158969632, -65601332, -129744520, -29098404, -45382772, -18326626, 11789685, - -42539504, -51552492, -82388208, -65539052, 58536108, -10462540, -52424372, -55744380, 12594992, -74167640, - -104593192, 17207786, -24367496, -22469122, -22505628, 20057498, -62360776, 65534760, -38173668, 44489420, - -31065498, -29854318, 678605, 35916664, -50873888, -48619028, 26006026, -9257802, 71734544, -31533650, - 41087804, 61804580, 29360396, -22623740, -10350871, -6547678, 50702088, -17897128, 34016140, 68423120, - -57632020, -100506528, -39618924, 33973192, 41704132, -47474420, 77876344, -25194278, -28271622, -9517648, - -8630737, -24245090, -63219772, -26789858, -65322156, -62569084, -38798588, 45988364, 10780368, -11199127, - 4112431, 71161168, 66846872, 4621385, -31074088, 12655121, -7118909, 29231548, 9103183, -12904229, - -29605210, -2768107, -6019397, -46954728, -12227772, 17708150, 48507360, -21872120, -53687, 18427558, - -27416924, -983548, -2001455, 695785, -14336601, 18094698, 977105, 4617090, -2375117, }, + 5985037, -3105261, 3661460, -2151779, 3077344, -6393059, 304943, -238371, -708670, 1481764, + 3173981, -96637, -281320, -3433826, -1352915, 1486059, 861141, -386547, 1350767, -397284, + 478889, -1490354, -1000727, -1000727, -326418, 150324, -730144, -508954, 1717987, -974958, + 1037235, -942745, -146029, -723702, 916976, 339302, 743029, 1243393, 1544041, 577673, + 416612, -122407, 176094, 231928, -279173, 283468, 3914863, -4479651, -601295, -824634, + -1114544, 725850, -2224793, 755914, -51540, 1013612, 889058, -1765232, -627065, 2692945, + -283468, 575526, -500364, 1170379, 2469606, 2856153, 485331, 1230508, -42950, -2254858, + -68719, 244813, -489626, 8590, 1241246, -1294933, -1741609, 758062, -841814, -777389, + -1221918, -53687, 1282048, 322123, -380105, -466004, -513249, -8590, 283468, -687195, + 251256, -785979, 472446, -11248519, -7962870, -3914863, -2918430, -2267743, -2299955, -816044, + -1696512, -547608, -1063004, -2796024, 545461, 1404454, -223338, 794569, -528281, -1458141, + -1438814, -2194728, -738734, 506806, 66572, -1243393, 828929, -1498944, -1458141, 942745, + 0, 30065, 770947, 854699, 231928, -356482, -435939, -594853, 296353, 133144, + -768799, 390842, -1526861, -678605, -382252, -180389, -1090922, -240518, -405874, -45097, + -16003048, -2106682, 1196148, 277025, 1127429, 165356, -914828, 618475, -712965, -710817, + -1466731, -1168231, 545461, -410169, 983548, -942745, -17180, -910533, 266288, 1662152, + -457414, 1245541, 34360, -1069447, -255551, 1509681, 706522, 996432, 1052267, -1490354, + 1000727, -584116, -156766, -785979, -427349, 487479, 631360, 397284, -401579, 1226213, + 992137, 657130, -386547, -723702, 77309, -588411, 98784, 18839874, 14955076, 3573413, + 6680822, 1644973, 5162551, 3674345, 1095217, 3700114, 1449552, 2813204, 1185411, -979253, + 2772402, 2001455, -783832, -219043, -5211943, -523986, 246961, 3204046, 343597, 158914, + 1599875, 167504, 1447404, 1382980, 204011, -68719, 504659, 2201171, 1647120, 1436667, + -146029, -513249, 83752, 1045825, -382252, -62277, 1116692, 414464, -556198, 17180, + 240518, -1058710, 1378685, -758062, 33174328, 12034498, 5942088, 3393024, 2205466, 2057289, + 2113124, 3298535, 916976, 5433134, 846109, 420907, 2461016, -1374390, 665720, -659278, + -496069, -1002875, 3644280, 1872606, -186831, 2617783, -1750199, -556198, -545461, 4088809, + -279173, 1417339, 446677, 1964948, 472446, -687195, 1196148, 1322850, -521839, 420907, + 697932, 298500, 977105, -350040, 1103807, 807454, -2549063, 513249, 448824, 440234, + 1973538, 12805445, -9502615, -3182571, -4458176, -2596308, -2699387, 1846836, -1593433, -3816079, + -1103807, -5108864, -1344325, -2171106, -5119601, -1174674, 996432, -3068754, -1187559, 575526, + -3659312, -75162, 3923453, 992137, 442382, -1782411, -68719, 1496796, -118112, -1636383, + -1964948, 1943473, -319975, -2340757, 68719, -951335, 2793876, -10737, 1166084, -403727, + 2388002, -1608465, 852551, 412317, 425202, 100932, 478889, -4295, -998580, 1625645, + 1024350, -34965328, -19630148, -4129611, -4827543, -3481071, -4213363, -6169721, -476741, 51540, + -1702955, 1402307, -1578401, 137439, -105227, -2108829, -2132451, -3588445, -1155346, 3294240, + -3195456, -491774, 3141769, 1846836, -450972, 1007170, -418759, -3489661, -1642825, -2892661, + -912681, -6442, -674310, 1462436, -2933463, -2467459, -85899, -3002182, -2209761, -2166811, + -2351495, 2327872, -736587, -3163244, -972810, 678605, 923418, -1172526, -1563368, -848256, + -2896956, -21653078, 12543452, 4337917, 2278480, 1844689, 2141041, 678605, -2022930, 350040, + -1093069, -644245, 4097399, 2098092, 3569118, 3135326, 3755949, -3148211, 1748052, 3513283, + 880468, 3032247, -3582003, 496069, -695785, -493921, -1163936, 1153199, -216896, -169651, + 3691525, -3738769, -775242, 1116692, 2250563, -1138166, 1926293, -1610613, -2014340, 2525441, + -1073742, -332860, -468151, 820339, -49392, 1050120, -1060857, -732292, -929860, -549756, + -770947, 1833951, 504659, 448824, -949188, -1733019, 420907, 31952410, 12897787, 2896956, + 7123204, 5823976, 970663, 2684355, 6732361, 3279208, -294205, 1619203, 727997, -858993, + 1840394, 6053757, 1260573, 7196218, 3298535, -5643587, 968515, 365072, 1078037, 5360119, + 2813204, 2254858, -569083, -648540, -813896, -715112, 702227, -974958, 1627793, 689342, + 2257005, -311385, -704375, 1035087, 1829656, 1219771, -304943, -2375117, -1166084, -1241246, + 2186138, 1823214, 2482491, 1597728, 302795, 547608, 2115272, 1917703, 1367947, 414464, + 257698, 1279900, 1099512, 35661112, 10078141, 4559108, 5439576, 1032940, 5252745, -751619, + -2168959, 4295, 1262720, 691490, -279173, 1140314, 5364414, -685047, -3536906, -2276333, + 2544768, 798864, 2985002, 5022965, 4189741, -169651, 2759517, -2993592, 242666, -2297808, + 3199751, 2012192, -3816079, 2291365, -1861868, 384400, -1518271, 2321430, -1464584, 2879776, + 2115272, 1902671, 3481071, 1286343, -150324, -753767, -66572, 601295, 3871913, 12885, + 34360, 399432, 1844689, 1391569, 85899, -369367, -633508, -1964948, -414464, 5042292, + -15257871, -6010807, -2585570, -3326452, -1707250, -1170379, 96637, 2302103, -2345052, -3955665, + 3682935, -4780299, -4818954, -725850, -1224066, 2269890, -1466731, 32212, -4664335, -2568391, + -5600638, -5866926, -6816113, -792421, 1413044, -4531191, -1398012, 798864, 358630, 335007, + -745177, -4490389, -3019362, 2143189, 631360, -944893, 4232691, -2798171, -1462436, 1226213, + 2538326, 2325725, -526134, -530428, 908386, 781684, -2985002, 395137, -1814624, -620623, + 73014, -1015760, 10737, 2070174, 281320, -264141, 341450, -2005750, 1159641, 1891933, + -519691, 51540, -38695508, -12116103, -7350837, -2978560, -5302137, -4146791, -1284195, -2946348, + -1297080, -3949223, -5448166, -3813931, -1370095, -7945690, -1962800, -3206193, -4896263, -551903, + 783832, 2649995, -2886218, -3949223, -1526861, 3324305, 4157528, 5207648, 2718714, -98784, + -2600603, -1116692, -19327, -3103114, 1267015, 2177549, 2645700, -1791001, -1612760, -1421634, + -766652, -577673, -1144609, 2126009, -648540, 1391569, -2707977, -4584878, -1982127, -137439, + 2280628, -3964255, 1288490, -1881196, 1844689, -1915555, 1086627, -1595580, -124554, -1024350, + -148176, 717260, 1440962, -966368, -1376537, -22194244, 5916318, 1640678, 21475, 3884798, + -3732327, 989990, -8585640, -2800319, 2978560, 2104534, 5527623, -416612, 6027987, -3534758, + -899796, 2873333, -5265630, -1945620, -3105261, 5866926, -390842, -4898410, 2435247, 4670777, + -4194036, -3204046, -3779571, 1063004, -901943, 1999307, -1466731, -1219771, -1039382, -2308545, + 3289945, -2705830, 609885, 2145336, -309238, 2482491, -1498944, 5471789, 783832, -588411, + -1971390, -1949915, 36507, -2239826, -2738042, -1709397, 377957, 1842541, -315680, 478889, + -2400887, -2388002, -3399467, -1372242, -1127429, -919123, 891206, 1331440, 19166292, 27584428, + 9463960, 9609989, 13022341, 9496173, -1359357, 1956358, -1054415, 1848983, 1574106, 2499671, + 1745904, 4810364, 1780264, 3062312, 899796, 9408126, 2158221, 4683662, 2682207, 2527588, + 7310035, 1876901, 9165460, 4889821, -1868311, 6624987, 1694365, 3350075, 6470368, 1481764, + 3854733, -1797444, -670015, 1999307, 2911988, -3775276, 3384434, -2102387, -4294968, -2345052, + 3562675, 5527623, 4052302, -581968, 1314260, 1432372, 2003602, 3008625, 1619203, 3377992, + 1930588, -2830384, -83752, 2435247, 3077344, 1127429, 1000727, 751619, -3049427, -1032940, + -1885491, 66346508, 4833986, -3197603, 5164698, -3429532, 7331509, 2426657, 7707319, -3710852, + 592706, 208306, 4574140, -8175470, 1490354, 5544803, -1277753, -1054415, 6768869, 11042361, + -4660040, -2336462, 1189706, 5557688, -2523293, 3678640, 47245, -3307125, -3045132, -2596308, + 2177549, 3500398, 3685082, -2538326, 4082367, -2506114, 3964255, 3884798, -1052267, -2224793, + 1294933, -3702262, -5643587, 1462436, -3889093, 1791001, 292058, 846109, 2267743, 208306, + 2776696, 446677, -3850438, 1754494, -1065152, 2050847, -2830384, -285615, 354335, 2166811, + -1574106, -4496831, -876173, -1801739, -22552874, -21930104, -4952098, 1679332, -966368, -3330747, + -3569118, -4922033, -1307818, 3594888, -1187559, -1269163, -5053029, 5280663, -324270, -4408784, + -3786014, 9174050, -8358007, 822486, 6085969, -764504, 985695, -8091719, 2546916, -3498251, + 1902671, -5641440, -3682935, 869731, 1462436, -2665027, -2954938, 227633, -1226213, 347892, + -3451006, -1990717, 3558381, -444529, -1705102, -1069447, 4529043, 1958505, -2619930, -4015795, + -3539053, 1129576, -562641, -1726577, 362925, 695785, -1956358, 5351530, 2914135, -622770, + -440234, -1464584, 631360, -1636383, -1591285, -1685775, -335007, -3115999, -2443837, -4163971, + 936303, -4451734, -178241, -1166084, -1086627, -292058, -8907762, -7494718, -9167608, -6442451, + -4849018, -3081639, 618475, 6442, -2392297, -813896, 2070174, 7967165, -6959995, 3545496, + -2398739, -4226248, 5446019, -371515, 1000727, 7395934, 974958, 3173981, -4670777, -977105, + -13406740, -1410897, 2428804, 1758789, 1060857, 1462436, 1784559, -2838974, -4075924, 3161096, + -435939, 2993592, 1365800, -3397319, 2815351, -176094, -9521942, -7653632, -1385127, -7239168, + 878321, 2413772, -579821, -1773822, -921271, 444529, -2244121, -569083, -502511, -1168231, + 2209761, 719407, 682900, -1213328, -1028645, 3732327, 876173, -2248416, 2441689, -481036, + -1756642, -3730179, 30065, -1990717, -717260, 2789581, 2102387, 2961380, -43074228, -9820443, + 637803, -8568460, 3461744, 856846, 10335839, -4836133, 618475, -2841121, 6929930, -14128295, + -13550622, 5710159, -6564858, 10189810, 3691525, -8192650, -14351633, -328565, -4058744, -6966437, + -2851858, 1638530, 2327872, -3365107, 12292196, 657130, -1219771, -5141076, 4187593, 4655745, + 5018670, 5390184, -665720, -3191161, -1204738, 3186866, -246961, 3846143, -3614215, -1423782, + -1241246, 4456029, 3582003, -3904125, 5070209, -2823941, -3524021, 433792, -1597728, -3354370, + 3463891, -3970697, -521839, 1009317, -955630, -1617055, 914828, 3324305, -2055142, 3186866, + -2628520, 2138894, -1455994, -1647120, -1024350, 642098, 4123169, 745177, 3863323, -2450279, + 39507256, 34709780, 7264937, 9279277, -1840394, 11345156, 9101036, 11428908, -461709, 4597763, + 2765959, -10709501, -9066676, 4999342, 987843, -7662222, -8102456, -4514011, 534723, 4629975, + 1363652, 10872710, 9921374, 4372277, -2274185, -2372970, 6575595, 6176163, 502511, 5418101, + -1722282, 6919193, 403727, -1436667, 9579925, 5027259, 7859790, 5117454, 1743757, 5557688, + 2787434, 1969243, 5113159, -2729452, 1041530, 6831146, -49392, -4290673, 4039417, 4060892, + 2879776, -2991445, -53687, 4015795, 5961415, -2896956, 7204808, 8282845, -1400159, -4361540, + 788127, 1964948, 1301375, 3682935, 10737, 1372242, 2808909, -1911261, 229781, -2750927, + -691490, -3738769, -2160369, -382252, 47916804, 3914863, -1359357, 3393024, 2310693, -7846905, + 2055142, 2149631, 6442, 5119601, 7325067, 10971494, -4885526, -4937065, -7741679, -6247030, + 7073811, -534723, 10213432, -2433099, -2473901, 4234838, 8875550, 3551938, -8905615, 7080254, + -2596308, 5669357, -2935610, 4406637, -5360119, 3322157, -423054, 5168993, 633508, 2959233, + 1586990, -9008694, -4960687, -813896, -1816771, -818191, -2806761, 4389457, 1668595, 9345849, + -1430224, -6345814, -3704409, -609885, 569083, -7060926, 2403034, -2383707, -304943, -657130, + -4129611, 3803194, 7224135, -2239826, 3723737, 891206, -4037269, -354335, -3841848, -3180423, + 657130, -5615670, -4000762, 2388002, -277025, 1294933, 3886946, -5315022, 6470368, 663572, + -2622078, -6431714, 1879048, -2362232, 13840532, -3304977, -13211319, -8935679, -11909944, 11016591, + -8798241, 2441689, 13462575, -594853, -13653701, 936303, -14332306, 11946452, -4153234, 11907797, + 90194, -4533338, 10256382, 384400, 2145336, -7705172, -9715216, -1563368, 3444564, 2093797, + -1879048, -4490389, 4552666, -1387274, 3408057, 5207648, 6347962, 2927020, 3524021, -12826920, + 1097364, -2907693, -4357245, 1758789, 6386617, -5357972, -9822590, -4350802, 2916283, 1123134, + -8626442, -3528316, 4067334, 5905580, -5171141, -3386582, -3972845, 6040872, 8053064, 1621350, + -2667175, 908386, 5781026, -2755222, -193274, -3777424, 4065187, -4726612, -519691, 5607080, + 3390877, -1634235, -816044, -139586, -1771674, -48348448, -48984104, -7939247, -24011014, -14903537, + -8523363, -13327284, -1623498, 10050223, -21960168, 8018704, -4498978, 7314330, 1262720, 4481799, + -9111773, 2308545, -1144609, -4754529, -20145544, -4110284, -10477573, -12811887, -1340030, 3231963, + 676457, -4361540, 2785286, -4140349, -1228361, 10692321, -231928, -3566970, 661425, 6994354, + 9401683, 6298570, 0, 5029407, 5813238, -571231, 51540, -10464688, 3839701, -8647917, + 1614908, 8338679, -5746666, -10471130, 3021510, -5873368, -5619965, 1159641, -88047, -4960687, + 2407329, -1176821, 11280732, 6339372, 3451006, 1398012, 4136054, -408022, 1243393, -4443144, + -8003672, -1316408, 689342, -5708012, -3966402, -3131031, -2675765, -3229816, 1786706, -1653562, + -489626, -3582003, -28658170, 53322020, 41987600, 2540473, 8602819, 3315715, 9371619, 14106820, + 3322157, 13698798, 2557653, -14568529, 9723806, 11540577, 3519726, 3403762, 8759586, 11370926, + -11375221, 9474698, -5970005, 8315057, 1324997, -7007239, 1410897, 9414568, 5441724, -11315091, + 5512591, -4655745, 16415365, -1413044, 3874061, -2555506, -10509785, 10610717, 10625749, 5018670, + 2738042, -498216, 3846143, 11267847, 2660732, 8053064, 1045825, 5592048, 3090229, -762357, + 6139656, -7404524, -11467563, -5065914, -8740258, -7438884, -3783866, -7638600, 10288594, 7290707, + 910533, -1840394, -3644280, -1209033, -251256, 77309, 521839, 1428077, 2160369, 1185411, + -201863, -2710124, -2295660, -384400, -204011, -983548, 1168231, -1189706, 6204081, -1391569, + 8143258, 71541272, -28011776, -15176267, 2598455, -148176, -3539053, -19849192, -8478265, 5089536, + -957778, -2826089, -3878356, 3081639, -16323023, -4640712, 8497593, 15934329, 8686571, 7166153, + -5085242, -4803921, -9390946, 11003706, -15466177, -2673617, 3850438, -10170483, 3358665, 4417374, + 12479027, -19026706, -1589138, -307090, -3925600, 5093831, -17628694, -9178345, 19443316, 12818330, + 2680060, -3304977, 11620034, -3369402, -1488206, 2194728, 9090298, 5259188, -5596343, 1224066, + -3262028, 7468948, -11879880, -5327907, -7189776, -7546258, 14566382, 4022237, 1818919, -6397354, + -526134, -2149631, -2555506, -6708739, 1095217, -6358699, -261993, 2229088, 5617817, -9663676, + -6702297, -8538395, -2604898, 4647155, 824634, 6161131, -813896, -7934952, -833224, -3569118, + 3715147, -330712, 21251498, 48943300, 8035884, 18678812, 16870632, 16194174, 5407364, 12109660, + 7456063, -3500398, -9932112, -6296422, -2864743, 13870597, -11834782, -13097503, -893353, -581968, + -5357972, -10020159, 29673930, 27885076, 20980916, 1050120, -11963631, 2145336, 1997160, -5946382, + 6837588, 4400194, 11980811, 1421634, 4898410, -541166, -8229158, 13600014, 11257109, 8143258, + -1932735, -10722386, 672162, -790274, -2991445, -21934398, 15841987, -9972914, 18268644, 1080184, + 9884867, -2055142, 10898480, 16580721, 3313567, -7441031, -547608, 3077344, -5446019, 2952790, + -2110977, -6979322, -3837553, 2345052, -1700807, 6977175, 2461016, -11688753, 749472, -1567663, + -12620761, -2927020, 2576981, -4763119, 1391569, 10756746, 4406637, -581968, -3704409, -2802466, + 231928, 4715874, -1286343, 5095979, -51391432, -6824703, -32034014, 360777, 5637145, -10874857, + -18734648, -21668110, -20544976, -12163347, -16756815, -4108136, -1140314, -4329327, 5377299, -3341485, + 1086627, 13151190, 5901285, -1301375, 31110596, -6831146, 6227703, -4550518, 2607045, 4516158, + 1651415, -1748052, 4565550, 14570677, 4380867, 5158256, 1629940, 5828271, 12300786, 16958678, + 5325760, 20577188, -5512591, -17740362, 17916456, -5682242, -3775276, -3612068, 10127533, 15721728, + 11847667, -302795, -4086662, -8995809, -22939420, 14130442, 16050293, 11362336, -13700946, 8291435, + 2136746, -1378685, 12996571, 2196876, 8727374, -7260642, 4256313, -9051644, -874026, 7853348, + -2293513, 5907728, -1249836, -3304977, -3234110, -11025181, 1110249, 826781, -94489, 2121714, + -2448131, -13600014, 1030792, 712965, -89930176, -40374840, 18309446, -3515431, -3079492, 3189013, + -11265699, -9904195, -3386582, -4479651, -15751793, 11100343, 1211181, 23489176, -13146895, -11306501, + -19235012, -10782515, -19810536, 1589138, 7232725, -29590178, 19048180, 16378858, -2368675, 3242700, + 12401718, 1808181, 10909217, -22434762, -22570054, -12543452, -14813342, -11420318, 36507224, 11875585, + -8076686, -13151190, -18741090, 8832600, 4992900, -8918500, 7260642, 7164006, -13230647, 1191853, + 2911988, 10346576, -12292196, 30043296, -13219909, -10563472, 4657892, -3296388, -206158, -9118216, + -3461744, 878321, 19076098, -6000070, 27507118, 5811091, 1750199, 3010772, 7312182, -8336532, + -3021510, -10941429, -8836895, -8403104, -85899, 14772540, -9721658, -7181186, -4142496, -5624260, + -5220533, -712965, -3470334, -5201206, -4554813, 14134737, 45541684, 23310934, 14583561, 9790378, + -15925739, 1552631, -12869870, 20154134, -2121714, -2750927, 6947110, 4389457, 4769561, -665720, + 7196218, 2514703, 7593502, -6268505, 19829864, 2611340, -1728724, 59201828, 3298535, -4578435, + -15101105, 8770323, -14042396, 13174812, 31986768, -2553358, 7881265, 7818988, -16370268, -18429704, + 609885, 341450, 14083198, -9139690, 564788, -1017907, 10387378, 10595684, 17832704, 6637872, + 6219113, 7318625, 801011, 11680164, 5514738, -21633750, 4670777, -11175505, -27668180, -2441689, + 7844758, 100932, 2366527, -3725884, 584116, -934155, -96637, 3446711, 657130, 12584254, + -7516193, -1219771, 2510409, 2611340, 416612, -4891968, 8783208, 14798310, 14592151, 3010772, + -3023657, -1529008, 5231270, -727997, -1769527, -337155, 2920578, 6818261, -1140314, -2677912, + -4842576, -3064459, 66640712, -19428284, -7363722, -18073222, 33537252, 12339441, 2763812, 6790344, + -4907000, -7844758, 11798275, 1078037, -11645804, 2995740, -15356656, -11632919, 751619, -15567109, + 2104534, 5059472, -11499775, -20227148, 1915555, 1069447, 13673028, 22449794, 15650861, -10552735, + -171799, 13935021, 25477746, -26706106, 10063108, -5027259, -448824, -12195560, -17126182, 1440962, + 15356656, 4494684, 6869800, 9689446, -1075889, 6466074, -1550483, 4619238, 9848360, -17832704, + -12494060, 27670326, -2218351, -878321, -6285685, 11040213, 35824324, 8952859, 5383742, 11607149, + -9455371, -10675141, -15032, -7973607, -20560008, 13200582, 1675037, -10260677, 5617817, 3060164, + -5841156, -9665824, 13045963, -4520453, -15622944, 7275675, 7209103, 11012296, -10896332, 989990, + 4737349, -1926293, -4176856, 16516297, -1352915, 3027952, -7374459, -981400, -229781, 56899728, + 53912576, -17547088, 14710263, 4443144, 11431055, 28926604, -3556233, -15094663, -5284958, 55875376, + -31387620, -5963562, -15547782, -12461848, -25428354, 27951648, -8044474, -37967512, -28286654, -34638912, + -13269301, 30709016, -3620658, 14508400, -5392332, -15655156, 13718126, 4067334, 17364552, -16664473, + 15457587, 12287901, 6369437, 7157563, -27240830, 7907035, -22728966, 19318762, 40830108, 11856257, + 12320114, -25890062, 36571648, 9814000, -3721589, -5604933, -7329362, 11482595, 18328772, 4486094, + -4168266, -1015760, 5018670, -8778913, -6229850, -8446053, -6483253, -648540, 13445395, -8907762, + 20055350, 7230578, 12300786, -4110284, -28567974, -19170586, 7372312, 1979980, -8478265, 10715943, + -468151, -955630, 5826123, -4002910, 8448201, -1406602, -916976, 4099546, -4900558, -852551, + -5306432, -3225521, -6674379, 4406637, 382252, 1425929, -53541064, -31915902, 7666517, 4185446, + -319975, -23555748, 13924284, 7853348, -14231374, -38534448, 31372588, 7668664, 11620034, 17736068, + 10419591, -5102421, 5677947, -9756018, 26031796, -21786222, -37690484, -1288490, -1973538, -17879948, + -40965400, 1234803, -8516920, -21522082, -11970074, -6771016, 9006546, 1494649, 14867029, 30017526, + -12936441, -24882894, 7664369, -2952790, 133144, 12270722, -17781164, -16121160, -2349347, 14484777, + -19224274, 15814070, -5656472, 30528628, -4531191, -9605694, -3766686, 139586, 5948530, -34976068, + 4881231, -30266634, 30769146, 105227, 19247896, 11542725, -12013024, -1561221, -15869904, 7670812, + -1876901, 6083821, 5617817, -20834886, -3339337, -20098300, -9038759, 8942122, -6272800, -12335146, + 5718749, -188979, -20983062, -10269267, 2044404, 712965, -8763881, 9083856, -4836133, -5334350, + 4260608, -12509092, 6369437, -74120400, -34222300, -12446815, -8349417, -2257005, 7705172, -25765508, + -18601504, 6867653, -21726092, 6859063, -24124832, -7479686, -23330262, -28039694, 29624536, 12363063, + 4383014, -1737314, -24605868, -41517300, 20654498, -54462332, 19681688, 856846, -17557826, 2916283, + -10926397, 4217658, 37879464, -19065360, -2123861, -40913860, 32117766, -9470403, 14568529, -14383845, + -4915590, -3292093, -1644973, 19110456, 6457484, 39760660, 47637628, -4973572, 597000, -15753940, + 1657857, -6116034, 7344394, 15251429, 1775969, 34589520, 9676561, -12809740, 5411659, 7204808, + 94489, -2396592, 972810, 26306674, -19707458, -39479340, -16335908, 627065, 9214852, 6906308, + 19758998, -1958505, 8377334, -9975062, -16007343, -21977348, -17706002, 1533303, -5753109, 10771778, + 2733747, -6027987, -2881923, 18981608, -420907, 10559177, -4660040, 3639985, -4724464, -4322885, + -7264937, 94493576, 42183020, 29152090, 12092480, -10758893, -17186312, -29493540, 16353088, 28271622, + 11678016, -13234942, 33363306, 18784040, 33354716, 2265595, -24142012, -9369471, 50085760, -52293376, + -10752451, 34574488, -20493436, -11491185, 80889264, -10151155, 23115514, 73349448, -11781095, -4827543, + -2153926, 9113921, -4078072, 31799938, 20444044, 26210038, -18567144, -43334072, 17306570, -17100412, + 20802674, -8123931, 7544110, 30880814, 17877802, 1806034, 13572097, 6257768, 13067438, 29854318, + 16816944, -3189013, 29014652, 12165495, 4125316, 6899865, 53455164, 32070520, 49392, 29132764, + -12869870, 36831492, -9193377, 8117488, -10475425, 4406637, 21092584, -11714523, -858993, -2093797, + 7312182, 813896, -13844827, 551903, -11860552, -21174188, 3532611, -28187870, 10943577, 17282948, + -7088844, -12071006, -8121783, 15139760, 4464619, 809601, -6345814, 121951304, 55115168, -24700356, + 10657961, 63011464, 1486059, 45505180, -13368086, 18000208, 37937448, -28580860, 3457449, 66196184, + 59463824, 48399988, 17102560, 41568840, 7002944, 36440652, 12717398, 11027329, -22780506, -26751204, + -38044820, -75387416, 24032490, 893353, -20463372, -7213398, 26087632, -17134772, -2589865, 2944200, + 14669461, -66799628, -10803990, 48475148, 37327560, -13488345, 24663850, 21062520, 13662291, -8188355, + -15524159, -6743099, -10443213, -6764574, -24672440, -20965882, 17109002, -41620380, 13780403, 34149284, + -10123238, -24363202, -37958920, 35613868, -1110249, -17987324, -11753178, -8211978, -13024488, 7501161, + -6012954, -13239237, 13531294, 55437292, -27702540, -16662326, 7084549, -10771778, 12801150, 508954, + 28589450, 5523328, -2776696, -2396592, -29686814, -14014478, -4610648, 2529736, 2295660, 10625749, + 6569153, 1236951, 4776004, 5523328, 17517024, 1447404, 485331, -11373073, 5746666, 8463233, + 3508988, -48185240, -13445395, -57921928, -12599287, -57887568, 27818504, -55155972, 29665340, -9579925, + -31933082, -9683004, -14952929, 67422400, 10456098, -49166640, 938450, -32119912, -25305948, 33195802, + -37510096, -34716220, -39150776, 58800248, -7928510, 38805028, -59869696, -31956704, 23813446, -27940910, + 22711788, 65088080, 42775728, 40261024, 6899865, -6953552, -31621696, -44998372, -2409477, 9962177, + -41661184, 874026, -24554328, 12017318, 18393198, -47699908, -40486508, -74728136, -11684459, 5108864, + -32115618, -46224584, 45513768, 2297808, 46748572, 45848776, -5643587, -6509023, -18640158, 26441966, + 22917946, 3285650, 11323681, -3775276, -2353642, 22361748, -5912023, -26231512, -20143396, -33021856, + -27721866, -10269267, -1288490, -4552666, -41723460, -24210730, 13580687, 3143916, -14847702, 17940078, + -3665755, 910533, 28205050, 23293756, 15002321, 5935645, 18056042, 2662880, 470299, 8353712, + 5931350, -3985730, 1713692, -82304456, -14184129, 7241315, -7593502, 113817, 22282290, -18234284, + 19814832, 18749680, -12992276, 25383256, -35281008, 44216688, 30335354, 1505386, -32497870, 2609193, + 21584358, -96170760, 19950124, 39206608, -68867656, 28333900, -35259536, -50530292, -46050640, 23383950, + -11512660, -71807560, 38588132, 20637318, -43471512, -72651520, 14699526, 8557722, -22872848, -5293547, + -37329708, 35081292, 28980292, 51047832, -40868760, 6644315, -54279796, -20544976, 9363029, -34735548, + 14437533, -4320737, -27251568, -40980432, -44283260, 64753076, -43658344, -20656646, -16432545, 2703682, + 29751238, 17630840, 21700322, 210453, 25391846, -8557722, 4060892, -10788958, -26847840, 5282810, + 57498876, 8907762, 1322850, -236223, -37041944, 24084030, 38684772, 40359808, 8068096, 2993592, + -1767379, -3238405, 5836861, 779537, -18429704, -418759, 3706557, 2695092, 274878, 362925, + 14276471, -4964982, 1823214, -3618510, 753767, 24878598, -54651312, -29038274, -57711476, 16432545, + -10249939, 22909356, -15726023, 10855530, 18893562, -19320910, -32953136, 49173080, -12902082, -21923660, + 57129508, -11763915, -13314399, 65294240, -37776384, 9607842, 15983721, 5087389, -57582628, 184684, + -8403104, -34619584, 19789062, -27197880, 36631776, -6459631, 40774272, -44631152, 27741194, -79018808, + 871878, -43119324, 48105780, -7425999, 6573448, -8297877, -43851616, -3199751, 38201588, 100815768, + 7438884, 6322192, 21421150, 34443492, -5854041, -9732396, 3146064, -1752347, 88669600, -8061654, + 13653701, 35581656, -34565896, -59100896, 178241, -62461708, -7672959, -32085554, -23001698, -12562779, + -26371100, 14794015, 21962316, -36399848, 45883136, 38089916, -5469641, -9487583, -37516540, 26145614, + 9274982, 24796994, -21043192, 10222022, -4110284, 18738942, 2136746, 18129056, -9274982, 13277891, + -2282775, 270583, 4406637, 20562156, 9846213, 6255620, -6822556, 461709, 1853278, 95008968, + 103543072, 721555, -31769874, -25548612, 86719688, -57058640, -65002184, 67555544, -61407296, 39440684, + 12000139, 54640572, 50410032, 33988224, 5446019, -34559456, -29802778, 70929240, -30189326, -3143916, + 17289390, 60410864, 87535728, -2763812, 59788092, -49089328, -51200304, 5682242, -18942954, 28162100, + 17871358, -43785044, 5912023, 27674622, 71977208, 24472724, 29469918, 26993870, 32167158, 8209830, + -2581275, 45621144, 7990787, 36468568, 58488864, 12137578, -24131274, -20525648, 52714280, 13750338, + 108194520, 25196426, 42610372, -44225280, -69477536, -6751689, -81110456, -52014200, -18539226, -27790586, + 2987150, -4198331, 592706, 1047972, -60672856, -50259708, -26566520, -51896088, 18889266, 20534238, + -15743203, -4075924, -48157320, -7610682, 14130442, -13758928, -4183298, 4866198, -30414810, 12644384, + -9384504, 3586298, 5334350, 139586, 2027225, 6556268, -7303592, 1101659, 7015829, -304943, + 1638530, 2029372, -45176612, -158969632, -65601332, -129744520, -29098404, -45382772, -18326626, 11789685, + -42539504, -51552492, -82388208, -65539052, 58536108, -10462540, -52424372, -55744380, 12594992, -74167640, + -104593192, 17207786, -24367496, -22469122, -22505628, 20057498, -62360776, 65534760, -38173668, 44489420, + -31065498, -29854318, 678605, 35916664, -50873888, -48619028, 26006026, -9257802, 71734544, -31533650, + 41087804, 61804580, 29360396, -22623740, -10350871, -6547678, 50702088, -17897128, 34016140, 68423120, + -57632020, -100506528, -39618924, 33973192, 41704132, -47474420, 77876344, -25194278, -28271622, -9517648, + -8630737, -24245090, -63219772, -26789858, -65322156, -62569084, -38798588, 45988364, 10780368, -11199127, + 4112431, 71161168, 66846872, 4621385, -31074088, 12655121, -7118909, 29231548, 9103183, -12904229, + -29605210, -2768107, -6019397, -46954728, -12227772, 17708150, 48507360, -21872120, -53687, 18427558, + -27416924, -983548, -2001455, 695785, -14336601, 18094698, 977105, 4617090, -2375117, }, }; const Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2522] ={ { -154619, - -186831, -354335, -231928, -195421, -302795, -255551, -139586, -156766, 88047, 347892, - -710817, 8590, -49392, -223338, -341450, -1176821, -1245541, -1842541, 2450279, -165356, - -944893, -646393, 803159, -1430224, -251256, -532576, -322123, -446677, 2136746, 959925, - -1288490, -676457, -586263, 118112, 25770, -350040, -893353, -1471026, 1803886, -901943, - 1157494, 788127, 1047972, -418759, 1404454, -8549132, 743029, -985695, 326418, -848256, - 40802, -947040, 100932, -2246268, -1413044, -176094, -1194001, -283468, -498216, 2327872, - 173946, -2561948, 2261300, -788127, 1217623, 109522, 878321, -2549063, -762357, -629213, - 313533, 517544, -259846, -723702, 936303, -1340030, -255551, -781684, 347892, 201863, - 1103807, 998580, -1157494, -639950, -23622, -408022, 886911, 49392, 758062, -700080, - -732292, 1088774, 4417374, -1859721, 1979980, -779537, 732292, 17180, 1052267, -395137, - 287763, 481036, 554051, 605590, 996432, -186831, 143881, 1814624, 1350767, -3416647, - 719407, -392990, 204011, -1127429, 807454, -1432372, 1509681, 1288490, 633508, -133144, - -444529, -485331, 1073742, 1028645, -416612, 283468, 1836099, -616328, -21475, -554051, - 227633, 345745, -38655, -446677, 865436, 199716, -253403, 17663054, -1191853, 2525441, - 34360, 852551, 418759, 667867, 483184, 1756642, -886911, 781684, -261993, 360777, - 1009317, 1511829, 659278, 347892, -605590, 1378685, -863288, 564788, -354335, -1318555, - 231928, 543313, 139586, -369367, 210453, -423054, 998580, -1806034, 526134, -373662, - 586263, 36507, -2523293, -852551, 360777, 468151, 397284, -401579, -496069, -461709, - 468151, 1063004, -322123, 10552735, -12588549, 2450279, -3062312, 1595580, -1999307, 1468879, - -2714419, -858993, -1690070, -360777, -1413044, 57982, 2422362, 3517578, 1462436, 732292, - 30065, 1058710, 2527588, 1793149, -1198296, -1473174, -1904818, -962073, -1110249, 27917, - -201863, -238371, 27917, 470299, -893353, 1030792, -1168231, -1606318, 539018, -103079, - 94489, 236223, -1078037, -1290638, 350040, -820339, -1000727, -277025, 126702, -24412594, - 4733054, -1333587, 502511, 414464, -2149631, -1024350, 1816771, -423054, 49392, 2063732, - 586263, -932008, -1627793, 1406602, 12885, -1937030, -2744484, -3901978, 1105954, -1791001, - 270583, -646393, 590558, -487479, 146029, -2070174, -2070174, -1309965, -644245, -1322850, - 242666, -687195, 566936, 2188286, 266288, 307090, 1382980, 328565, 223338, -137439, - -425202, -1591285, -485331, 266288, -408022, -29152090, 10771778, -2808909, 3388729, -1799591, - 2411624, -1479616, -500364, -2566243, 1795296, -3017215, 1840394, -584116, 2617783, -3790309, - 848256, 3384434, 901943, -2989297, -1146756, -1825361, -843961, 1037235, 446677, 753767, - -577673, -1054415, -1524713, -1428077, -238371, -1625645, -399432, -1511829, -1159641, -4105989, - -1262720, -614180, 94489, 51540, 1279900, 564788, 1256278, -178241, 1481764, 352187, - 8590, 3775276, 12799003, -3339337, 5757404, -3253438, 1608465, -3519726, 3030100, -107374, - 3287798, -90194, -182536, 3262028, -380105, -264141, 2838974, -1155346, -2360085, -3792456, - 3646427, -111669, 2531883, 457414, 1829656, 1007170, -2183991, 1161789, 1047972, 30065, - 1299228, 2003602, -2175401, 493921, 38655, 0, -1206886, -392990, -1181116, 551903, - -165356, 1196148, 3064459, 324270, 1599875, -55835, 382252, -103079, 545461, 1419487, - 38317552, -9300752, 3745212, -1702955, 3324305, -1279900, 2574833, -1245541, 953483, -3588445, - 1829656, -3418794, 2817499, -949188, 899796, -895501, 3921305, 665720, 1054415, -1694365, - 2589865, -79457, -1067299, 2276333, -1567663, -2413772, 146029, -648540, 1299228, 141734, - -311385, -680752, 442382, 75162, 547608, -1602023, 476741, -616328, 2811056, -347892, - 1372242, 416612, 1157494, 2231236, -1370095, 283468, 521839, -526134, 1655710, 3094524, - -19939386, 7696582, -6234145, 3474629, -3163244, 914828, -4127464, 2469606, -1715839, 3502546, - -515396, 1447404, -3307125, -1496796, -311385, -1312113, -1187559, 4050154, -3193308, 380105, - 1861868, -3994320, 895501, 1198296, -1050120, 1159641, 356482, 597000, -2527588, -382252, - -863288, 1337882, -1292785, 652835, -2954938, -758062, 2042257, 841814, 605590, -914828, - -493921, -2383707, -2398739, 1086627, 420907, -294205, -390842, -395137, 165356, 10737, - -530428, -676457, -32205812, 10316511, -5843303, 1275605, -695785, 1608465, -2564096, 2409477, - -1221918, -1088774, -474594, 1685775, -1168231, -1692217, 944893, 3414499, -644245, -47245, - -6195491, 319975, -45097, 2746632, -1097364, -659278, -4760971, -1791001, -77309, -124554, - 1477469, 1995012, -3620658, -3423089, 1947768, 302795, -3721589, -2987150, 1239098, 556198, - -324270, -335007, -1490354, 1183264, -539018, 281320, 83752, -2126009, -893353, 768799, - -3006477, -1702955, -670015, 367220, -667867, -32100586, 14020921, -7941395, 5804649, -5572720, - 2570538, -6322192, 1290638, -4157528, 6247030, -3339337, 2106682, -498216, -107374, -3027952, - -992137, -1305670, 5624260, -1191853, 2787434, 4602058, 2521146, 609885, -801011, 1045825, - -1202591, 2549063, 2353642, 289910, -1464584, 380105, 292058, -1810329, -983548, 1269163, - 1705102, -1492501, -1617055, -1507534, -115964, -650688, 597000, -1447404, 781684, -2248416, - 423054, -1245541, -315680, 197569, -1120987, -1226213, -1775969, -1455994, 12083890, 12545599, - -4352950, 4312147, -4795331, 974958, 1735167, 332860, -1784559, 2499671, 807454, 5085242, - 2772402, 5714454, -618475, 3448859, -659278, 2272038, 3137474, -204011, -3796751, 4028679, - -184684, 1799591, -663572, 176094, 790274, 4879083, 940598, -2377265, -622770, 794569, - -1159641, 3715147, 1760937, -386547, -672162, -1842541, 1831804, -1806034, 2272038, 2276333, - -1307818, 1372242, 1357210, 719407, 103079, 3590593, 2390149, 2665027, 165356, 448824, - 1395864, -592706, -17180, 36290328, -12700218, 4660040, -5830418, 4286378, -3770981, 5456756, - -1608465, 416612, -3755949, 8096014, -929860, 7307887, 661425, 1380832, -4569845, 1864016, - 7408819, -2059437, -5819681, 1039382, 489626, 2946348, -4123169, 3708704, 206158, 446677, - -133144, -4080219, -983548, 826781, -4801774, 962073, 2319282, 1810329, -1157494, -289910, - 81604, 2480344, 989990, -298500, -758062, 1949915, 1561221, 4687957, 1475321, -588411, - 2858301, 1116692, 36507, 934155, 2250563, 1365800, 577673, 388695, 12008729, -17538498, - 10378788, -7838316, 3178276, 1110249, -880468, -725850, 1984275, -4458176, -2892661, -2336462, - -1872606, -6066642, 2942053, -5634997, -330712, -4516158, 1531156, -3408057, -2763812, -1380832, - 4960687, 674310, 4821101, 2561948, 3262028, 4861903, 126702, -648540, -880468, 1355062, - 3624953, -335007, -412317, -2527588, 1767379, -319975, -1644973, 1382980, 1011465, 3919158, - 1449552, 1848983, -2935610, -1292785, -319975, -508954, 1754494, -5607080, 1050120, -1365800, - -1114544, -1722282, -2141041, -642098, -2121714, 820339, -1535451, -191126, -3135326, -37192268, - -8231305, 1569811, -7164006, -3032247, 163209, -347892, -6128919, 1589138, -6105296, 49392, - 4660040, -1017907, -940598, 2514703, 1584843, 2564096, 12885, 3128884, -1943473, 805306, - 3618510, -371515, -382252, -2579128, 3435974, -2886218, -1672890, 831076, 1301375, 2630668, - 8293582, -2415919, -1524713, -3738769, 53687, -2778844, 487479, -1166084, -4125316, -339302, - 4928475, 1342177, -3579855, -1788854, 1533303, -2160369, -2753074, 408022, -1380832, 223338, - 382252, 3131031, 300648, 1503239, 687195, -2755222, -1535451, 1632088, 1428077, -1136019, - -45475112, 37445672, -13149042, 11087458, -8248485, 6219113, -2418067, 3938485, -4389457, 2619930, - 3096672, 4460324, -2974265, 5409512, 2682207, 9249212, -1483911, 712965, -4954245, 1172526, - -1748052, -3163244, -3837553, -4479651, -4063039, 5954972, -283468, 7164006, 1874753, 1236951, - -128849, 826781, -3204046, 414464, -1168231, 1406602, 4299263, 661425, 1421634, 141734, - 455267, -3384434, -1782411, -246961, -240518, 311385, -985695, -3139621, 85899, 3096672, - -1024350, 813896, 955630, -2811056, 1853278, 639950, 1028645, -702227, 324270, -448824, - -811749, 26598732, -3944928, -8413841, -2841121, -1672890, -1247688, -7393786, -3828963, 2226941, - 1413044, 2278480, 2800319, -4926328, 2164664, -861141, 1939178, 8244190, -8078834, 2967823, - 2959233, 2340757, -1995012, -4608500, 3818226, 1236951, 2765959, 5134634, 126702, 7026567, - 717260, 3341485, 388695, 2312840, -1775969, 2746632, 1995012, 2628520, -846109, 968515, - -85899, 3330747, 4043712, -5686537, 7969312, 813896, 2302103, 491774, 1471026, 1675037, - -1559073, 4866198, 2641405, 335007, 4408784, 1990717, -2287070, -40802, -1505386, -1552631, - -1213328, 947040, -264141, 433792, -38655, -4647155, 21120502, 1979980, 4413079, -5280663, - -891206, -13333726, 3358665, -493921, -9032316, 7840463, -4112431, 431644, 5763846, 2697240, - 4357245, -3081639, 1988570, -4086662, 199716, -3468186, 1475321, -5357972, 8033737, 5888400, - 4786741, 5626407, 1316408, -1627793, -3324305, 1720134, 4447439, 191126, 3060164, -1962800, - 693637, 3066607, 2121714, 2778844, 266288, 1118839, -249108, -1662152, 1913408, -1093069, - 929860, 947040, -1827509, 2765959, -3433826, 3313567, -1582696, 2396592, 3420942, -3927748, - 457414, 661425, -1642825, -3062312, 2323577, -5085242, -4039417, 2690797, 1080184, 1331440, - 1028645, 3416647, 3148211, 33006824, -27597312, 9244917, -6927782, 2330020, 8519068, 6895570, - -4687957, 8282845, 4647155, 4962835, -3539053, 2254858, -1838246, 9844065, 2699387, 2701535, - 3790309, 4099546, 2609193, 2761664, -8233453, 1189706, -14832670, -5265630, -1423782, -8594230, - 2076617, 4406637, -3242700, -4728759, -5448166, -5325760, -2811056, 2834679, 2308545, -7675107, - -8748848, -822486, -4479651, 2216203, 1896228, 665720, -657130, 3951370, -2196876, 34360, - -605590, -2025077, -5622112, 4148939, 7331509, -1187559, -949188, 3262028, -5214091, 6090264, - 1597728, -3405909, -143881, -3186866, -1273458, -981400, -2145336, -811749, -1460289, -4599910, - -51460152, 4840428, -4810364, 1632088, 4980015, 3496104, 10211285, -4546223, -599148, 586263, - 12272869, 4086662, -10028749, -6661495, 5289252, 7136088, -2083059, -3060164, -429497, 3146064, - 7423851, 7501161, -330712, -14179835, -4239133, -1711545, -1883343, 7793218, -3917010, 4432406, - 257698, -1168231, -7419556, 283468, 5549098, -9519795, -5604933, -2463164, -1806034, -4672925, - -3843996, -8927090, -1773822, -6152541, -118112, 962073, 6053757, -4550518, -2952790, 221191, - -777389, 652835, -5506148, 1784559, 1902671, 345745, 182536, -4385162, -3788161, -2383707, - -1247688, -659278, -7005092, 1063004, 1971390, -3345780, -6395207, -29828548, 32169306, -4303557, - 2257005, 7784628, 9255655, -6528351, 4571993, 1988570, 5796059, 4052302, 8083129, 4726612, - -5113159, -8562017, 1466731, 9661529, 18912888, -4224101, -6158983, 5201206, 3229816, -3268470, - -9032316, -1565516, -1675037, -8022999, 7477538, 9021579, 304943, 2349347, -10737, 7170448, - -5181878, -16200617, 7125351, -1642825, 5677947, 2997887, 371515, -3743064, -6225555, 4760971, - 5336497, 4168266, -620623, 27917, 5843303, 3590593, 1872606, -3034395, 4924180, 4410932, - -575526, -865436, -2710124, 3697967, 186831, -7765301, 6790344, 4417374, -1451699, 2325725, - -953483, 616328, -96637, 2388002, 5815386, 2388002, -974958, -1627793, -186831, 9120363, - 461709, -6790344, -14093935, 3569118, -657130, -11557757, 4030827, -3725884, 618475, -4277788, - -3390877, 3848291, 8967892, 1264868, 11854110, 5527623, -5894843, -7630010, 12953621, -5418101, - -380105, 1342177, -12094628, 100932, 6431714, -6835441, -1855426, 8319352, 517544, 4447439, - 122407, 5557688, -914828, -3408057, -506806, 7320772, 9554155, -2911988, 1906966, 1900523, - 6343667, -3566970, -725850, 1488206, -1683627, 4395899, 1795296, 597000, -2267743, 3573413, - 3584150, 453119, 64425, 3021510, 4179003, -4915590, -169651, 1711545, 2201171, -2388002, - 1956358, 67632848, -5948530, 1617055, 4694400, -5525476, -9891310, -5553393, -2068027, -11345156, - -12189117, 1466731, -10730976, -4458176, -2716567, -2282775, 7462506, 8555575, 3098819, 17373142, - 3616363, -7876970, 15105400, -972810, 10866267, -2808909, -508954, -9098888, 942745, 8961449, - 296353, -3650722, -1047972, 1346472, -1522566, -1309965, 3884798, -7148973, 3715147, 1627793, - -2989297, -6753836, -4269198, 6066642, 6146098, 7043747, -10402411, 6706592, 2383707, 231928, - 1194001, 1597728, 1928440, 1941325, -219043, 1103807, 6594923, -1127429, 3068754, 3274913, - -1644973, 5400922, 6382322, 1492501, 360777, 5723044, 4563403, 3453154, -39795020, -66496832, - 23562190, -2035815, 9571335, -11924977, 148176, -13750338, -2145336, -19666656, 7939247, 8589935, - -854699, -1825361, -672162, 1488206, -5065914, -16784732, 29897268, 1808181, -4348655, 10118943, - 1382980, -5763846, 14093935, 15921444, -7441031, 9292162, 1361505, -2314987, -15687368, -8555575, - 11353746, -6337224, 1153199, -1041530, 7535520, -12597139, -14465450, 1767379, -350040, -9605694, - 5117454, 972810, -6448894, 3985730, -7056632, -5551245, 1971390, 2323577, -266288, -1868311, - -3672197, 3736622, 5854041, 837519, 1393717, -1958505, -2525441, 5587753, 2147, 1204738, - -6468221, -1380832, -4563403, 3152506, 4017942, 23622, 3165391, -21440476, 63735168, -28552942, - 4599910, 4028679, 15835544, -2177549, 10033044, -10245644, 418759, -19514184, -3923453, -21475, - 7593502, 1187559, 7816841, -5658620, -12008729, 1430224, -17952964, -18745384, 294205, -6204081, - -599148, 1535451, 2413772, -4679367, -3362960, -6704444, -10378788, 4037269, 4612795, -13176960, - -6244883, -16546362, -36507, -7301445, 5639292, 6970732, -13939316, 2177549, 10926397, 10166188, - -5579163, 3743064, -4217658, -1853278, 2821794, -6083821, -1681480, 5845451, 4116726, 4054449, - 4447439, 2716567, -1823214, 3947075, 2098092, -2660732, -564788, 7937100, -1245541, -3335042, - -1584843, 3448859, -3788161, -7621420, -1073742, -2428804, 1488206, 2070174, -1730872, -53369264, - -16930762, 5381594, -8927090, 6977175, -4069482, -478889, -16155519, -19245748, -3139621, -7086696, - 7221988, 1692217, -2888366, -39178692, 18779744, 850404, 16280074, 20504174, 13911399, -20723218, - -5574868, -2469606, -5695127, 3848291, 4138201, -852551, -8027294, 7672959, -14340896, -7803956, - 11448235, 130997, -5916318, 13707388, -384400, 14405320, -5860483, -2864743, 1047972, 4185446, - -11398843, -8351564, -2624225, 7915625, -3816079, 891206, -4133906, 5136781, 6242735, 895501, - -431644, -12837657, -2115272, 5585605, 5942088, -4342212, 6734509, 2031520, -2997887, 1507534, - -8647917, -2901251, -6126771, 4597763, -197569, -2323577, 794569, -13737453, -1022202, 1932735, - 5134634, 34452080, 12047383, -19662360, -2832531, -8080981, 7709467, -11585674, 10881300, -1591285, - 12545599, 8995809, 15092515, -18764712, 24019604, -13642964, 14304389, -7125351, 8815420, 2293513, - 7569880, -11699491, -27975270, 11862700, 20489142, -6433861, 8757438, -9320079, 2976412, -5832566, - 21494164, 629213, -1486059, 5834713, -9582072, -6210523, -5385889, 10048076, 654983, -2488934, - 564788, -901943, 14907831, 10557030, -4831838, 5598490, 5997922, -5001490, -2931315, -4389457, - -10363756, -496069, 734439, -448824, -3500398, -9990094, 38655, 17935784, 9633612, -5942088, - 9889162, 122407, 307090, 9064528, 4591320, -6844031, 3491809, 3027952, 8753143, 11229192, - -7462506, 4909148, 6255620, 71146136, -58815284, -10249939, 2488934, -1597728, -16557099, 4930623, - 3811784, 22370338, -7889855, 3990025, 18393198, -6442, 10913512, 36612448, -8450348, -2957085, - -19701014, -18627274, 468151, 5581310, -8506183, 2948495, 32403380, 18356690, 2385854, 635655, - 2340757, 17510582, -15436112, -7314330, -1146756, 8708046, -1750199, 1591285, -7958575, 2224793, - -13907104, -8699456, -10574209, -534723, -9491878, 1490354, -16690243, 6844031, -33084134, -9159018, - 4260608, 5289252, -1466731, -8364449, 2308545, 152471, 3708704, -9824738, 3770981, -6126771, - -6163278, -15386720, -11025181, -4116726, -2040110, -253403, 2216203, 3637837, 622770, 1163936, - -8939974, -1172526, -10896332, -2778844, -1153199, -1005022, -46145128, -32396938, -3197603, -7284265, - 22879290, -135291, 3547643, -30629560, 710817, 3146064, 889058, 1344325, 17121888, -23293756, - 3936338, -5738077, -16172699, -8446053, 13443248, -5961415, 10816875, -4952098, 5965710, 2619930, - -3118146, -2783139, 6882685, -2059437, -807454, -20169166, 8781061, 7511898, 7432441, 8252780, - -17817672, -18784040, 9678709, 14259291, -19069654, 5690832, 2061584, 14830522, 8613557, 395137, - 10185515, -6796786, -11652246, -2843268, -21960168, -16866336, -2207613, -1990717, 2987150, -11454678, - 3186866, -9442486, -27844272, -9311489, -7705172, -28402618, -180389, -5708012, -3326452, 1814624, - 8379481, -9283572, 5242008, 2156074, -12105365, -9107478, -9113921, -3231963, -2282775, -28630252, - 42610372, -22943716, -10054518, -13552769, 2965675, 3373697, 5886253, -3032247, 18300856, 13868449, - -13975824, -24202140, 8452496, -9229885, 21492016, 1586990, 8856223, 11360188, -8901320, -8265665, - 28673202, -16924318, -4651450, -8647917, 403727, -3620658, 3240553, -5042292, -2611340, -22632330, - 19228568, -6990060, -2480344, 23553600, -16870632, -20332376, 1093069, -9186935, -14164802, -6442, - -7662222, 5446019, -30189326, -9616432, -8059506, -523986, 9463960, 347892, 1153199, 5602785, - -5976447, 4378719, 5942088, 6300717, 5555540, -3384434, -7262790, -5022965, 6382322, -17304424, - -5001490, -3672197, -5553393, 12191265, -9088151, -11811160, 11327976, 4520453, 6242735, 15680926, - -6912750, -4191888, 5808944, -7239168, -60080152, 28559386, 30872224, 15300821, 13853417, -11602854, - 14108968, -26575110, -103079, -31056908, -4876936, -14173392, 13005161, -15438260, -12822625, -4372277, - -22905060, 5332202, -10952167, 8566312, -21534966, 33266670, -12199855, 15081778, -15013058, 178241, - -15028091, -5761699, 6947110, 20800526, 23888608, -13664438, -738734, -8617852, -13885629, -11297911, - -36129264, -2205466, 5117454, -34608848, 12167642, 5134634, 8323647, 14450417, 9259949, 3846143, - -11912092, -5175436, -13183402, -7885560, 5939940, -28179280, 9775346, 3539053, 1015760, -14272176, - -8070244, 5046587, 20776904, 7164006, 4926328, -10372346, 8351564, -777389, -10711648, 612033, - -7851200, -13853417, -6478958, -5164698, -10857677, 9313637, 6549825, 6790344, 5400922, 48462264, - -34196528, -14613626, -4827543, -639950, 23280870, -4986457, 7226283, -14199162, 6786049, -8980777, - -39313984, -27028230, -10548440, 13464722, -2308545, -21773336, -20714628, -42576012, -14304389, 5048734, - 5010080, 1617055, -5059472, -2800319, -13816910, 3135326, 4750234, 6902013, 886911, -2175401, - -5828271, -20349556, -5920613, -4771709, 9328669, -2274185, -16879222, -6448894, 3824669, -18159122, - 2257005, -18691698, 9513353, 14510547, -14693083, -26944478, -6088116, -8437463, -13228499, 1372242, - 1535451, 2774549, 5699422, 506806, -11506217, 17117592, 25301652, -12375948, 9932112, 4739497, - 11474005, -18580028, 6195491, 2920578, 5791764, -26718992, 20605106, 3365107, 1400159, -2409477, - -16698833, 5229123, 798864, 5446019, 79901424, -44201656, 4389457, -4211216, -9143985, -32948842, - -1436667, -1619203, 27382564, 12547747, 54956256, -21519934, 2510409, 6128919, 13501230, -5441724, - -2068027, 22241488, -13415330, 31937376, 19791210, -44171592, 42691976, 14931454, -14693083, -10954314, - -16054588, -8637179, 3599183, 1939178, -11343009, 28011776, 4206921, -13471165, -11257109, 2675765, - -14063870, -26089778, 934155, 15429670, 6884833, 18766860, -8038032, 5740224, 20989506, 28941638, - 7653632, -30283814, 10703059, -9880572, -15745350, 4183298, 13627931, 7106024, -2746632, -27556510, - -22954452, 33479270, -3425237, 25814900, 4069482, -10499048, 13926431, -22817014, -8768176, 10700911, - -1576253, 22265110, -16537772, -35742716, -8360154, -1629940, -9030169, -8074539, 24567212, -91016800, - -59569048, 20192788, -31535798, 8446053, -16363825, -55568288, -41414224, 71290016, -34591668, 31507880, - 17295834, -20194936, 15695958, -12006581, 21638046, 24051816, -2830384, -8450348, 42277512, -15395310, - -50304804, -466004, -21754010, 3743064, 3470334, 28138478, 14416058, 4844723, 13230647, -14510547, - -1161789, 30930206, 19432580, -7084549, 7142531, -29719026, -45118632, -33685428, -23807004, -7632157, - -7391639, 6871948, -5229123, -13516262, 27066884, 6156836, -22295176, -21071110, -6807523, 6951405, - -22428320, 7299297, 25230786, -1745904, 8802535, -19262928, 12998719, 9036611, 2241973, 9270687, - -16857746, -25675314, -35512936, 16331613, 12783970, 221191, 12777528, 1690070, -16484084, -4069482, - 843961, -28177132, -2435247, -43115028, -108757160, 35147864, -9927817, -8497593, 17813376, 3229816, - 9350144, 45268956, 26590142, 33797096, 16458315, 46684148, -9764608, -48556752, 5654325, -6882685, - -21386790, -43250320, -19393924, 34733400, 7033009, -4202626, 6388764, -4486094, -672162, 28924458, - 2725157, 9603547, -5793911, 5783174, 29411936, -10286447, -21674552, 13655849, -37602440, -38570952, - -24670292, -6575595, -68719, 13219909, 34735548, -1455994, -13413183, -37735584, -59526100, -22664542, - -9564892, -5615670, -1413044, 19428284, -27812060, 46076408, 24084030, -6822556, 12899934, -21283710, - 2478196, -1911261, 21354578, 40789304, 28129888, -27751932, -11626476, 4829691, -5046587, -7795366, - 1277753, -15476915, -42726336, -5465346, -8628589, -5145371, 5656472, -18083960, -6317897, 46284716, - 46795816, 17667348, 32152126, 24017458, 48930416, -38049116, 50745040, -56081536, -7803956, 57793080, - 77951512, 18558554, -2302103, 30313880, -20716774, -24152748, 57022132, 11716671, -5980742, 16237124, - 46282568, -8553427, 29298120, -5800354, -8624294, -2214056, 22151294, -47729972, -3871913, 27812060, - -8965744, 5757404, -15693810, 13746043, 42507292, -33874408, 14237817, -7705172, 15380278, -16071768, - 29237990, 5699422, 11952894, 14416058, -42840152, 25505664, -60518236, -9174050, 37626060, 7481833, - -20295868, 42973296, -11491185, -19855634, 30492120, -7801808, -6152541, -472446, 19138374, 1565516, - 6429566, -29910152, 14261439, 7655779, 68661496, -45606112, -20298016, 10986526, -11491185, 20523502, - 20046760, -18141942, 47437912, 24715390, 89990304, -55656332, 2463164, -8531953, -14716705, 2332167, - -20282984, -8117488, -66163972, -54911156, -55177444, 19151260, -11480448, 18983756, -12627204, -39449276, - 64063732, 45466524, -29886530, -24174224, -35317516, -6468221, 13516262, 22093312, 25679610, -839666, - 19758998, -4728759, -25739740, -29847876, 18904298, -12936441, 58037892, 37892348, 53429392, 8875550, - 19005230, 54511724, 36161476, -10267119, 8948564, -897648, -169651, 7176891, -25692494, -16226386, - 8564165, -29300266, -33002528, 32695438, 34009700, -36687612, -2512556, 70461088, 46366320, -382252, - -24096914, -2804614, 12627204, 15182709, -10956462, -23061826, 28787018, 556198, 5516886, 24726126, - 25679610, -26115548, 10153303, -1479616, 8967892, -41661184, 5471789, 44957572, -43971876, 71509056, - 26852136, -10821170, -3444564, 21646636, -28284508, -36500780, 29233694, -43396348, -55787332, 13372381, - -30438434, -39011188, -20822002, 34954592, 87578680, 35493608, -49334140, 89590872, 9457518, -15470472, - 15277199, -54284092, 12393128, 6045167, -39114268, 31574452, -11334419, 5160403, -28490666, 14016626, - -26149908, 44568876, -55583320, -21466246, -19978040, 24472724, 28726888, 25172804, -30148522, 6923488, - -31494996, -10260677, 14832670, 36786396, 16406775, -19327352, 36045512, 17349520, 28759102, 225486, - 33696164, -17255032, 17892834, -55508156, 58536108, -7252053, 6629282, -18079664, -33253784, -622770, - 18075370, 45730664, 11918534, -59987808, 22061100, -25909390, 44588204, 1264868, -21311628, 6124624, - -19518478, 6541235, -38442104, 9674414, -146872848, 8398809, 26753352, 60275572, 21081846, -89661736, - 123768072, 46514496, -53901840, 21908628, 123147448, 29072634, -27496380, -1836099, -71487584, 39573828, - 5488968, -16945794, 12601434, 26989574, -45584636, 27311698, -57610544, 8156143, -52289080, -47053516, - -18668076, 24861418, 37185828, -24867860, 32839320, -51163796, -5336497, 61482456, 7849053, -19580756, - -4602058, 13569949, -11343009, -37400576, -41382008, -3850438, -17555678, 45030584, -57741540, 66024384, - 23160612, 10247792, -18562848, -4945655, 32594506, -21863532, 43057048, 12071006, 39361228, -11126113, - -17549236, -61018600, 25209310, -4099546, -61403000, 21900038, -358630, 42073500, 68266360, -24575802, - 19235012, 33992520, 38785704, 9386651, -13743895, -1318555, -72357312, -1451699, 15056008, 21627308, - 10587094, }, + -186831, -354335, -231928, -195421, -302795, -255551, -139586, -156766, 88047, 347892, + -710817, 8590, -49392, -223338, -341450, -1176821, -1245541, -1842541, 2450279, -165356, + -944893, -646393, 803159, -1430224, -251256, -532576, -322123, -446677, 2136746, 959925, + -1288490, -676457, -586263, 118112, 25770, -350040, -893353, -1471026, 1803886, -901943, + 1157494, 788127, 1047972, -418759, 1404454, -8549132, 743029, -985695, 326418, -848256, + 40802, -947040, 100932, -2246268, -1413044, -176094, -1194001, -283468, -498216, 2327872, + 173946, -2561948, 2261300, -788127, 1217623, 109522, 878321, -2549063, -762357, -629213, + 313533, 517544, -259846, -723702, 936303, -1340030, -255551, -781684, 347892, 201863, + 1103807, 998580, -1157494, -639950, -23622, -408022, 886911, 49392, 758062, -700080, + -732292, 1088774, 4417374, -1859721, 1979980, -779537, 732292, 17180, 1052267, -395137, + 287763, 481036, 554051, 605590, 996432, -186831, 143881, 1814624, 1350767, -3416647, + 719407, -392990, 204011, -1127429, 807454, -1432372, 1509681, 1288490, 633508, -133144, + -444529, -485331, 1073742, 1028645, -416612, 283468, 1836099, -616328, -21475, -554051, + 227633, 345745, -38655, -446677, 865436, 199716, -253403, 17663054, -1191853, 2525441, + 34360, 852551, 418759, 667867, 483184, 1756642, -886911, 781684, -261993, 360777, + 1009317, 1511829, 659278, 347892, -605590, 1378685, -863288, 564788, -354335, -1318555, + 231928, 543313, 139586, -369367, 210453, -423054, 998580, -1806034, 526134, -373662, + 586263, 36507, -2523293, -852551, 360777, 468151, 397284, -401579, -496069, -461709, + 468151, 1063004, -322123, 10552735, -12588549, 2450279, -3062312, 1595580, -1999307, 1468879, + -2714419, -858993, -1690070, -360777, -1413044, 57982, 2422362, 3517578, 1462436, 732292, + 30065, 1058710, 2527588, 1793149, -1198296, -1473174, -1904818, -962073, -1110249, 27917, + -201863, -238371, 27917, 470299, -893353, 1030792, -1168231, -1606318, 539018, -103079, + 94489, 236223, -1078037, -1290638, 350040, -820339, -1000727, -277025, 126702, -24412594, + 4733054, -1333587, 502511, 414464, -2149631, -1024350, 1816771, -423054, 49392, 2063732, + 586263, -932008, -1627793, 1406602, 12885, -1937030, -2744484, -3901978, 1105954, -1791001, + 270583, -646393, 590558, -487479, 146029, -2070174, -2070174, -1309965, -644245, -1322850, + 242666, -687195, 566936, 2188286, 266288, 307090, 1382980, 328565, 223338, -137439, + -425202, -1591285, -485331, 266288, -408022, -29152090, 10771778, -2808909, 3388729, -1799591, + 2411624, -1479616, -500364, -2566243, 1795296, -3017215, 1840394, -584116, 2617783, -3790309, + 848256, 3384434, 901943, -2989297, -1146756, -1825361, -843961, 1037235, 446677, 753767, + -577673, -1054415, -1524713, -1428077, -238371, -1625645, -399432, -1511829, -1159641, -4105989, + -1262720, -614180, 94489, 51540, 1279900, 564788, 1256278, -178241, 1481764, 352187, + 8590, 3775276, 12799003, -3339337, 5757404, -3253438, 1608465, -3519726, 3030100, -107374, + 3287798, -90194, -182536, 3262028, -380105, -264141, 2838974, -1155346, -2360085, -3792456, + 3646427, -111669, 2531883, 457414, 1829656, 1007170, -2183991, 1161789, 1047972, 30065, + 1299228, 2003602, -2175401, 493921, 38655, 0, -1206886, -392990, -1181116, 551903, + -165356, 1196148, 3064459, 324270, 1599875, -55835, 382252, -103079, 545461, 1419487, + 38317552, -9300752, 3745212, -1702955, 3324305, -1279900, 2574833, -1245541, 953483, -3588445, + 1829656, -3418794, 2817499, -949188, 899796, -895501, 3921305, 665720, 1054415, -1694365, + 2589865, -79457, -1067299, 2276333, -1567663, -2413772, 146029, -648540, 1299228, 141734, + -311385, -680752, 442382, 75162, 547608, -1602023, 476741, -616328, 2811056, -347892, + 1372242, 416612, 1157494, 2231236, -1370095, 283468, 521839, -526134, 1655710, 3094524, + -19939386, 7696582, -6234145, 3474629, -3163244, 914828, -4127464, 2469606, -1715839, 3502546, + -515396, 1447404, -3307125, -1496796, -311385, -1312113, -1187559, 4050154, -3193308, 380105, + 1861868, -3994320, 895501, 1198296, -1050120, 1159641, 356482, 597000, -2527588, -382252, + -863288, 1337882, -1292785, 652835, -2954938, -758062, 2042257, 841814, 605590, -914828, + -493921, -2383707, -2398739, 1086627, 420907, -294205, -390842, -395137, 165356, 10737, + -530428, -676457, -32205812, 10316511, -5843303, 1275605, -695785, 1608465, -2564096, 2409477, + -1221918, -1088774, -474594, 1685775, -1168231, -1692217, 944893, 3414499, -644245, -47245, + -6195491, 319975, -45097, 2746632, -1097364, -659278, -4760971, -1791001, -77309, -124554, + 1477469, 1995012, -3620658, -3423089, 1947768, 302795, -3721589, -2987150, 1239098, 556198, + -324270, -335007, -1490354, 1183264, -539018, 281320, 83752, -2126009, -893353, 768799, + -3006477, -1702955, -670015, 367220, -667867, -32100586, 14020921, -7941395, 5804649, -5572720, + 2570538, -6322192, 1290638, -4157528, 6247030, -3339337, 2106682, -498216, -107374, -3027952, + -992137, -1305670, 5624260, -1191853, 2787434, 4602058, 2521146, 609885, -801011, 1045825, + -1202591, 2549063, 2353642, 289910, -1464584, 380105, 292058, -1810329, -983548, 1269163, + 1705102, -1492501, -1617055, -1507534, -115964, -650688, 597000, -1447404, 781684, -2248416, + 423054, -1245541, -315680, 197569, -1120987, -1226213, -1775969, -1455994, 12083890, 12545599, + -4352950, 4312147, -4795331, 974958, 1735167, 332860, -1784559, 2499671, 807454, 5085242, + 2772402, 5714454, -618475, 3448859, -659278, 2272038, 3137474, -204011, -3796751, 4028679, + -184684, 1799591, -663572, 176094, 790274, 4879083, 940598, -2377265, -622770, 794569, + -1159641, 3715147, 1760937, -386547, -672162, -1842541, 1831804, -1806034, 2272038, 2276333, + -1307818, 1372242, 1357210, 719407, 103079, 3590593, 2390149, 2665027, 165356, 448824, + 1395864, -592706, -17180, 36290328, -12700218, 4660040, -5830418, 4286378, -3770981, 5456756, + -1608465, 416612, -3755949, 8096014, -929860, 7307887, 661425, 1380832, -4569845, 1864016, + 7408819, -2059437, -5819681, 1039382, 489626, 2946348, -4123169, 3708704, 206158, 446677, + -133144, -4080219, -983548, 826781, -4801774, 962073, 2319282, 1810329, -1157494, -289910, + 81604, 2480344, 989990, -298500, -758062, 1949915, 1561221, 4687957, 1475321, -588411, + 2858301, 1116692, 36507, 934155, 2250563, 1365800, 577673, 388695, 12008729, -17538498, + 10378788, -7838316, 3178276, 1110249, -880468, -725850, 1984275, -4458176, -2892661, -2336462, + -1872606, -6066642, 2942053, -5634997, -330712, -4516158, 1531156, -3408057, -2763812, -1380832, + 4960687, 674310, 4821101, 2561948, 3262028, 4861903, 126702, -648540, -880468, 1355062, + 3624953, -335007, -412317, -2527588, 1767379, -319975, -1644973, 1382980, 1011465, 3919158, + 1449552, 1848983, -2935610, -1292785, -319975, -508954, 1754494, -5607080, 1050120, -1365800, + -1114544, -1722282, -2141041, -642098, -2121714, 820339, -1535451, -191126, -3135326, -37192268, + -8231305, 1569811, -7164006, -3032247, 163209, -347892, -6128919, 1589138, -6105296, 49392, + 4660040, -1017907, -940598, 2514703, 1584843, 2564096, 12885, 3128884, -1943473, 805306, + 3618510, -371515, -382252, -2579128, 3435974, -2886218, -1672890, 831076, 1301375, 2630668, + 8293582, -2415919, -1524713, -3738769, 53687, -2778844, 487479, -1166084, -4125316, -339302, + 4928475, 1342177, -3579855, -1788854, 1533303, -2160369, -2753074, 408022, -1380832, 223338, + 382252, 3131031, 300648, 1503239, 687195, -2755222, -1535451, 1632088, 1428077, -1136019, + -45475112, 37445672, -13149042, 11087458, -8248485, 6219113, -2418067, 3938485, -4389457, 2619930, + 3096672, 4460324, -2974265, 5409512, 2682207, 9249212, -1483911, 712965, -4954245, 1172526, + -1748052, -3163244, -3837553, -4479651, -4063039, 5954972, -283468, 7164006, 1874753, 1236951, + -128849, 826781, -3204046, 414464, -1168231, 1406602, 4299263, 661425, 1421634, 141734, + 455267, -3384434, -1782411, -246961, -240518, 311385, -985695, -3139621, 85899, 3096672, + -1024350, 813896, 955630, -2811056, 1853278, 639950, 1028645, -702227, 324270, -448824, + -811749, 26598732, -3944928, -8413841, -2841121, -1672890, -1247688, -7393786, -3828963, 2226941, + 1413044, 2278480, 2800319, -4926328, 2164664, -861141, 1939178, 8244190, -8078834, 2967823, + 2959233, 2340757, -1995012, -4608500, 3818226, 1236951, 2765959, 5134634, 126702, 7026567, + 717260, 3341485, 388695, 2312840, -1775969, 2746632, 1995012, 2628520, -846109, 968515, + -85899, 3330747, 4043712, -5686537, 7969312, 813896, 2302103, 491774, 1471026, 1675037, + -1559073, 4866198, 2641405, 335007, 4408784, 1990717, -2287070, -40802, -1505386, -1552631, + -1213328, 947040, -264141, 433792, -38655, -4647155, 21120502, 1979980, 4413079, -5280663, + -891206, -13333726, 3358665, -493921, -9032316, 7840463, -4112431, 431644, 5763846, 2697240, + 4357245, -3081639, 1988570, -4086662, 199716, -3468186, 1475321, -5357972, 8033737, 5888400, + 4786741, 5626407, 1316408, -1627793, -3324305, 1720134, 4447439, 191126, 3060164, -1962800, + 693637, 3066607, 2121714, 2778844, 266288, 1118839, -249108, -1662152, 1913408, -1093069, + 929860, 947040, -1827509, 2765959, -3433826, 3313567, -1582696, 2396592, 3420942, -3927748, + 457414, 661425, -1642825, -3062312, 2323577, -5085242, -4039417, 2690797, 1080184, 1331440, + 1028645, 3416647, 3148211, 33006824, -27597312, 9244917, -6927782, 2330020, 8519068, 6895570, + -4687957, 8282845, 4647155, 4962835, -3539053, 2254858, -1838246, 9844065, 2699387, 2701535, + 3790309, 4099546, 2609193, 2761664, -8233453, 1189706, -14832670, -5265630, -1423782, -8594230, + 2076617, 4406637, -3242700, -4728759, -5448166, -5325760, -2811056, 2834679, 2308545, -7675107, + -8748848, -822486, -4479651, 2216203, 1896228, 665720, -657130, 3951370, -2196876, 34360, + -605590, -2025077, -5622112, 4148939, 7331509, -1187559, -949188, 3262028, -5214091, 6090264, + 1597728, -3405909, -143881, -3186866, -1273458, -981400, -2145336, -811749, -1460289, -4599910, + -51460152, 4840428, -4810364, 1632088, 4980015, 3496104, 10211285, -4546223, -599148, 586263, + 12272869, 4086662, -10028749, -6661495, 5289252, 7136088, -2083059, -3060164, -429497, 3146064, + 7423851, 7501161, -330712, -14179835, -4239133, -1711545, -1883343, 7793218, -3917010, 4432406, + 257698, -1168231, -7419556, 283468, 5549098, -9519795, -5604933, -2463164, -1806034, -4672925, + -3843996, -8927090, -1773822, -6152541, -118112, 962073, 6053757, -4550518, -2952790, 221191, + -777389, 652835, -5506148, 1784559, 1902671, 345745, 182536, -4385162, -3788161, -2383707, + -1247688, -659278, -7005092, 1063004, 1971390, -3345780, -6395207, -29828548, 32169306, -4303557, + 2257005, 7784628, 9255655, -6528351, 4571993, 1988570, 5796059, 4052302, 8083129, 4726612, + -5113159, -8562017, 1466731, 9661529, 18912888, -4224101, -6158983, 5201206, 3229816, -3268470, + -9032316, -1565516, -1675037, -8022999, 7477538, 9021579, 304943, 2349347, -10737, 7170448, + -5181878, -16200617, 7125351, -1642825, 5677947, 2997887, 371515, -3743064, -6225555, 4760971, + 5336497, 4168266, -620623, 27917, 5843303, 3590593, 1872606, -3034395, 4924180, 4410932, + -575526, -865436, -2710124, 3697967, 186831, -7765301, 6790344, 4417374, -1451699, 2325725, + -953483, 616328, -96637, 2388002, 5815386, 2388002, -974958, -1627793, -186831, 9120363, + 461709, -6790344, -14093935, 3569118, -657130, -11557757, 4030827, -3725884, 618475, -4277788, + -3390877, 3848291, 8967892, 1264868, 11854110, 5527623, -5894843, -7630010, 12953621, -5418101, + -380105, 1342177, -12094628, 100932, 6431714, -6835441, -1855426, 8319352, 517544, 4447439, + 122407, 5557688, -914828, -3408057, -506806, 7320772, 9554155, -2911988, 1906966, 1900523, + 6343667, -3566970, -725850, 1488206, -1683627, 4395899, 1795296, 597000, -2267743, 3573413, + 3584150, 453119, 64425, 3021510, 4179003, -4915590, -169651, 1711545, 2201171, -2388002, + 1956358, 67632848, -5948530, 1617055, 4694400, -5525476, -9891310, -5553393, -2068027, -11345156, + -12189117, 1466731, -10730976, -4458176, -2716567, -2282775, 7462506, 8555575, 3098819, 17373142, + 3616363, -7876970, 15105400, -972810, 10866267, -2808909, -508954, -9098888, 942745, 8961449, + 296353, -3650722, -1047972, 1346472, -1522566, -1309965, 3884798, -7148973, 3715147, 1627793, + -2989297, -6753836, -4269198, 6066642, 6146098, 7043747, -10402411, 6706592, 2383707, 231928, + 1194001, 1597728, 1928440, 1941325, -219043, 1103807, 6594923, -1127429, 3068754, 3274913, + -1644973, 5400922, 6382322, 1492501, 360777, 5723044, 4563403, 3453154, -39795020, -66496832, + 23562190, -2035815, 9571335, -11924977, 148176, -13750338, -2145336, -19666656, 7939247, 8589935, + -854699, -1825361, -672162, 1488206, -5065914, -16784732, 29897268, 1808181, -4348655, 10118943, + 1382980, -5763846, 14093935, 15921444, -7441031, 9292162, 1361505, -2314987, -15687368, -8555575, + 11353746, -6337224, 1153199, -1041530, 7535520, -12597139, -14465450, 1767379, -350040, -9605694, + 5117454, 972810, -6448894, 3985730, -7056632, -5551245, 1971390, 2323577, -266288, -1868311, + -3672197, 3736622, 5854041, 837519, 1393717, -1958505, -2525441, 5587753, 2147, 1204738, + -6468221, -1380832, -4563403, 3152506, 4017942, 23622, 3165391, -21440476, 63735168, -28552942, + 4599910, 4028679, 15835544, -2177549, 10033044, -10245644, 418759, -19514184, -3923453, -21475, + 7593502, 1187559, 7816841, -5658620, -12008729, 1430224, -17952964, -18745384, 294205, -6204081, + -599148, 1535451, 2413772, -4679367, -3362960, -6704444, -10378788, 4037269, 4612795, -13176960, + -6244883, -16546362, -36507, -7301445, 5639292, 6970732, -13939316, 2177549, 10926397, 10166188, + -5579163, 3743064, -4217658, -1853278, 2821794, -6083821, -1681480, 5845451, 4116726, 4054449, + 4447439, 2716567, -1823214, 3947075, 2098092, -2660732, -564788, 7937100, -1245541, -3335042, + -1584843, 3448859, -3788161, -7621420, -1073742, -2428804, 1488206, 2070174, -1730872, -53369264, + -16930762, 5381594, -8927090, 6977175, -4069482, -478889, -16155519, -19245748, -3139621, -7086696, + 7221988, 1692217, -2888366, -39178692, 18779744, 850404, 16280074, 20504174, 13911399, -20723218, + -5574868, -2469606, -5695127, 3848291, 4138201, -852551, -8027294, 7672959, -14340896, -7803956, + 11448235, 130997, -5916318, 13707388, -384400, 14405320, -5860483, -2864743, 1047972, 4185446, + -11398843, -8351564, -2624225, 7915625, -3816079, 891206, -4133906, 5136781, 6242735, 895501, + -431644, -12837657, -2115272, 5585605, 5942088, -4342212, 6734509, 2031520, -2997887, 1507534, + -8647917, -2901251, -6126771, 4597763, -197569, -2323577, 794569, -13737453, -1022202, 1932735, + 5134634, 34452080, 12047383, -19662360, -2832531, -8080981, 7709467, -11585674, 10881300, -1591285, + 12545599, 8995809, 15092515, -18764712, 24019604, -13642964, 14304389, -7125351, 8815420, 2293513, + 7569880, -11699491, -27975270, 11862700, 20489142, -6433861, 8757438, -9320079, 2976412, -5832566, + 21494164, 629213, -1486059, 5834713, -9582072, -6210523, -5385889, 10048076, 654983, -2488934, + 564788, -901943, 14907831, 10557030, -4831838, 5598490, 5997922, -5001490, -2931315, -4389457, + -10363756, -496069, 734439, -448824, -3500398, -9990094, 38655, 17935784, 9633612, -5942088, + 9889162, 122407, 307090, 9064528, 4591320, -6844031, 3491809, 3027952, 8753143, 11229192, + -7462506, 4909148, 6255620, 71146136, -58815284, -10249939, 2488934, -1597728, -16557099, 4930623, + 3811784, 22370338, -7889855, 3990025, 18393198, -6442, 10913512, 36612448, -8450348, -2957085, + -19701014, -18627274, 468151, 5581310, -8506183, 2948495, 32403380, 18356690, 2385854, 635655, + 2340757, 17510582, -15436112, -7314330, -1146756, 8708046, -1750199, 1591285, -7958575, 2224793, + -13907104, -8699456, -10574209, -534723, -9491878, 1490354, -16690243, 6844031, -33084134, -9159018, + 4260608, 5289252, -1466731, -8364449, 2308545, 152471, 3708704, -9824738, 3770981, -6126771, + -6163278, -15386720, -11025181, -4116726, -2040110, -253403, 2216203, 3637837, 622770, 1163936, + -8939974, -1172526, -10896332, -2778844, -1153199, -1005022, -46145128, -32396938, -3197603, -7284265, + 22879290, -135291, 3547643, -30629560, 710817, 3146064, 889058, 1344325, 17121888, -23293756, + 3936338, -5738077, -16172699, -8446053, 13443248, -5961415, 10816875, -4952098, 5965710, 2619930, + -3118146, -2783139, 6882685, -2059437, -807454, -20169166, 8781061, 7511898, 7432441, 8252780, + -17817672, -18784040, 9678709, 14259291, -19069654, 5690832, 2061584, 14830522, 8613557, 395137, + 10185515, -6796786, -11652246, -2843268, -21960168, -16866336, -2207613, -1990717, 2987150, -11454678, + 3186866, -9442486, -27844272, -9311489, -7705172, -28402618, -180389, -5708012, -3326452, 1814624, + 8379481, -9283572, 5242008, 2156074, -12105365, -9107478, -9113921, -3231963, -2282775, -28630252, + 42610372, -22943716, -10054518, -13552769, 2965675, 3373697, 5886253, -3032247, 18300856, 13868449, + -13975824, -24202140, 8452496, -9229885, 21492016, 1586990, 8856223, 11360188, -8901320, -8265665, + 28673202, -16924318, -4651450, -8647917, 403727, -3620658, 3240553, -5042292, -2611340, -22632330, + 19228568, -6990060, -2480344, 23553600, -16870632, -20332376, 1093069, -9186935, -14164802, -6442, + -7662222, 5446019, -30189326, -9616432, -8059506, -523986, 9463960, 347892, 1153199, 5602785, + -5976447, 4378719, 5942088, 6300717, 5555540, -3384434, -7262790, -5022965, 6382322, -17304424, + -5001490, -3672197, -5553393, 12191265, -9088151, -11811160, 11327976, 4520453, 6242735, 15680926, + -6912750, -4191888, 5808944, -7239168, -60080152, 28559386, 30872224, 15300821, 13853417, -11602854, + 14108968, -26575110, -103079, -31056908, -4876936, -14173392, 13005161, -15438260, -12822625, -4372277, + -22905060, 5332202, -10952167, 8566312, -21534966, 33266670, -12199855, 15081778, -15013058, 178241, + -15028091, -5761699, 6947110, 20800526, 23888608, -13664438, -738734, -8617852, -13885629, -11297911, + -36129264, -2205466, 5117454, -34608848, 12167642, 5134634, 8323647, 14450417, 9259949, 3846143, + -11912092, -5175436, -13183402, -7885560, 5939940, -28179280, 9775346, 3539053, 1015760, -14272176, + -8070244, 5046587, 20776904, 7164006, 4926328, -10372346, 8351564, -777389, -10711648, 612033, + -7851200, -13853417, -6478958, -5164698, -10857677, 9313637, 6549825, 6790344, 5400922, 48462264, + -34196528, -14613626, -4827543, -639950, 23280870, -4986457, 7226283, -14199162, 6786049, -8980777, + -39313984, -27028230, -10548440, 13464722, -2308545, -21773336, -20714628, -42576012, -14304389, 5048734, + 5010080, 1617055, -5059472, -2800319, -13816910, 3135326, 4750234, 6902013, 886911, -2175401, + -5828271, -20349556, -5920613, -4771709, 9328669, -2274185, -16879222, -6448894, 3824669, -18159122, + 2257005, -18691698, 9513353, 14510547, -14693083, -26944478, -6088116, -8437463, -13228499, 1372242, + 1535451, 2774549, 5699422, 506806, -11506217, 17117592, 25301652, -12375948, 9932112, 4739497, + 11474005, -18580028, 6195491, 2920578, 5791764, -26718992, 20605106, 3365107, 1400159, -2409477, + -16698833, 5229123, 798864, 5446019, 79901424, -44201656, 4389457, -4211216, -9143985, -32948842, + -1436667, -1619203, 27382564, 12547747, 54956256, -21519934, 2510409, 6128919, 13501230, -5441724, + -2068027, 22241488, -13415330, 31937376, 19791210, -44171592, 42691976, 14931454, -14693083, -10954314, + -16054588, -8637179, 3599183, 1939178, -11343009, 28011776, 4206921, -13471165, -11257109, 2675765, + -14063870, -26089778, 934155, 15429670, 6884833, 18766860, -8038032, 5740224, 20989506, 28941638, + 7653632, -30283814, 10703059, -9880572, -15745350, 4183298, 13627931, 7106024, -2746632, -27556510, + -22954452, 33479270, -3425237, 25814900, 4069482, -10499048, 13926431, -22817014, -8768176, 10700911, + -1576253, 22265110, -16537772, -35742716, -8360154, -1629940, -9030169, -8074539, 24567212, -91016800, + -59569048, 20192788, -31535798, 8446053, -16363825, -55568288, -41414224, 71290016, -34591668, 31507880, + 17295834, -20194936, 15695958, -12006581, 21638046, 24051816, -2830384, -8450348, 42277512, -15395310, + -50304804, -466004, -21754010, 3743064, 3470334, 28138478, 14416058, 4844723, 13230647, -14510547, + -1161789, 30930206, 19432580, -7084549, 7142531, -29719026, -45118632, -33685428, -23807004, -7632157, + -7391639, 6871948, -5229123, -13516262, 27066884, 6156836, -22295176, -21071110, -6807523, 6951405, + -22428320, 7299297, 25230786, -1745904, 8802535, -19262928, 12998719, 9036611, 2241973, 9270687, + -16857746, -25675314, -35512936, 16331613, 12783970, 221191, 12777528, 1690070, -16484084, -4069482, + 843961, -28177132, -2435247, -43115028, -108757160, 35147864, -9927817, -8497593, 17813376, 3229816, + 9350144, 45268956, 26590142, 33797096, 16458315, 46684148, -9764608, -48556752, 5654325, -6882685, + -21386790, -43250320, -19393924, 34733400, 7033009, -4202626, 6388764, -4486094, -672162, 28924458, + 2725157, 9603547, -5793911, 5783174, 29411936, -10286447, -21674552, 13655849, -37602440, -38570952, + -24670292, -6575595, -68719, 13219909, 34735548, -1455994, -13413183, -37735584, -59526100, -22664542, + -9564892, -5615670, -1413044, 19428284, -27812060, 46076408, 24084030, -6822556, 12899934, -21283710, + 2478196, -1911261, 21354578, 40789304, 28129888, -27751932, -11626476, 4829691, -5046587, -7795366, + 1277753, -15476915, -42726336, -5465346, -8628589, -5145371, 5656472, -18083960, -6317897, 46284716, + 46795816, 17667348, 32152126, 24017458, 48930416, -38049116, 50745040, -56081536, -7803956, 57793080, + 77951512, 18558554, -2302103, 30313880, -20716774, -24152748, 57022132, 11716671, -5980742, 16237124, + 46282568, -8553427, 29298120, -5800354, -8624294, -2214056, 22151294, -47729972, -3871913, 27812060, + -8965744, 5757404, -15693810, 13746043, 42507292, -33874408, 14237817, -7705172, 15380278, -16071768, + 29237990, 5699422, 11952894, 14416058, -42840152, 25505664, -60518236, -9174050, 37626060, 7481833, + -20295868, 42973296, -11491185, -19855634, 30492120, -7801808, -6152541, -472446, 19138374, 1565516, + 6429566, -29910152, 14261439, 7655779, 68661496, -45606112, -20298016, 10986526, -11491185, 20523502, + 20046760, -18141942, 47437912, 24715390, 89990304, -55656332, 2463164, -8531953, -14716705, 2332167, + -20282984, -8117488, -66163972, -54911156, -55177444, 19151260, -11480448, 18983756, -12627204, -39449276, + 64063732, 45466524, -29886530, -24174224, -35317516, -6468221, 13516262, 22093312, 25679610, -839666, + 19758998, -4728759, -25739740, -29847876, 18904298, -12936441, 58037892, 37892348, 53429392, 8875550, + 19005230, 54511724, 36161476, -10267119, 8948564, -897648, -169651, 7176891, -25692494, -16226386, + 8564165, -29300266, -33002528, 32695438, 34009700, -36687612, -2512556, 70461088, 46366320, -382252, + -24096914, -2804614, 12627204, 15182709, -10956462, -23061826, 28787018, 556198, 5516886, 24726126, + 25679610, -26115548, 10153303, -1479616, 8967892, -41661184, 5471789, 44957572, -43971876, 71509056, + 26852136, -10821170, -3444564, 21646636, -28284508, -36500780, 29233694, -43396348, -55787332, 13372381, + -30438434, -39011188, -20822002, 34954592, 87578680, 35493608, -49334140, 89590872, 9457518, -15470472, + 15277199, -54284092, 12393128, 6045167, -39114268, 31574452, -11334419, 5160403, -28490666, 14016626, + -26149908, 44568876, -55583320, -21466246, -19978040, 24472724, 28726888, 25172804, -30148522, 6923488, + -31494996, -10260677, 14832670, 36786396, 16406775, -19327352, 36045512, 17349520, 28759102, 225486, + 33696164, -17255032, 17892834, -55508156, 58536108, -7252053, 6629282, -18079664, -33253784, -622770, + 18075370, 45730664, 11918534, -59987808, 22061100, -25909390, 44588204, 1264868, -21311628, 6124624, + -19518478, 6541235, -38442104, 9674414, -146872848, 8398809, 26753352, 60275572, 21081846, -89661736, + 123768072, 46514496, -53901840, 21908628, 123147448, 29072634, -27496380, -1836099, -71487584, 39573828, + 5488968, -16945794, 12601434, 26989574, -45584636, 27311698, -57610544, 8156143, -52289080, -47053516, + -18668076, 24861418, 37185828, -24867860, 32839320, -51163796, -5336497, 61482456, 7849053, -19580756, + -4602058, 13569949, -11343009, -37400576, -41382008, -3850438, -17555678, 45030584, -57741540, 66024384, + 23160612, 10247792, -18562848, -4945655, 32594506, -21863532, 43057048, 12071006, 39361228, -11126113, + -17549236, -61018600, 25209310, -4099546, -61403000, 21900038, -358630, 42073500, 68266360, -24575802, + 19235012, 33992520, 38785704, 9386651, -13743895, -1318555, -72357312, -1451699, 15056008, 21627308, + 10587094, }, { -182536, - -236223, -500364, -326418, -137439, -575526, -801011, -73014, -431644, -382252, 109522, - 214748, 113817, 68719, -304943, 766652, -88047, 429497, -1116692, -1288490, -15032, - -2291365, -904091, 942745, 92342, 277025, 184684, 1599875, 23622, 682900, 120259, - 1043677, 66572, -809601, -1120987, -1318555, -2293513, 165356, -223338, 81604, -940598, - -156766, 646393, 790274, -530428, -622770, -9895605, 953483, -2156074, -103079, -783832, - -1453846, 805306, 3341485, 40802, 1715839, -1864016, -468151, 1314260, -1198296, 405874, - 2334315, -1348620, -429497, -614180, -113817, 367220, -463856, 691490, 463856, -502511, - 893353, -502511, -17180, -1857573, 15032, -161061, 470299, 354335, 901943, -770947, - 1529008, -195421, 1277753, -375810, 4295, 987843, -289910, 730144, 328565, 745177, - 158914, 708670, 4215511, -3240553, 2072322, -2553358, 1352915, -1228361, -1213328, -715112, - -676457, 790274, 897648, -3169686, -143881, 506806, -289910, -500364, -1846836, -646393, - 1365800, 2061584, 1043677, 3229816, 678605, -530428, 685047, 590558, -298500, 1082332, - 2299955, -833224, 4295, 1007170, -2147, -180389, -1599875, -23622, 850404, 702227, - 158914, 85899, -515396, 616328, -34360, 111669, 57982, 15255724, -904091, 1406602, - -874026, 1060857, -1067299, 326418, -195421, -186831, 957778, -719407, -2667175, 876173, - 371515, 932008, 1952063, 1075889, 758062, -169651, -1507534, -468151, 824634, -137439, - -167504, 1634235, -1883343, -549756, 57982, -259846, -397284, 824634, 912681, 1090922, - 380105, 438087, -322123, 1483911, 30065, 1155346, 854699, -178241, -47245, 586263, - 107374, -229781, -49392, 11108933, -10692321, 1627793, -2916283, 1498944, -231928, 1067299, - -1056562, 1958505, -886911, 1166084, -2576981, 49392, -1507534, 369367, -264141, -403727, - -712965, -1928440, -219043, 165356, -949188, 1475321, -717260, -1174674, -1432372, 779537, - -923418, 2117419, -249108, -57982, 622770, -57982, 27917, -1039382, -833224, -296353, - 208306, -444529, -953483, 760209, 584116, 1423782, -358630, 414464, -216896, -26268020, - 2959233, -2070174, -53687, -410169, -2304250, 2265595, -695785, 105227, 891206, 197569, - 2639258, -240518, -1234803, 3191161, 1219771, 2871186, -176094, -4050154, -2476049, -2005750, - 1513976, -2162516, 57982, -852551, -811749, 135291, 496069, -700080, -1355062, -1022202, - 680752, 798864, 1604170, -238371, -356482, -208306, 949188, -1294933, 193274, 373662, - 672162, -1071594, 899796, -1277753, -326418, -33159296, 11849815, -4945655, 5413807, -3962107, - 2413772, -4284230, 2241973, -3208341, 1065152, 2192581, -15032, 775242, 1975685, -1464584, - 1380832, -1846836, -1423782, -3949223, 3365107, -2357937, 2207613, 79457, -154619, -3783866, - -277025, 620623, -670015, -212601, -283468, 1451699, -377957, -1166084, 1013612, 272730, - -624918, -4295, -105227, 55835, 513249, -1071594, 2403034, -281320, -1769527, -238371, - -1041530, 1760937, 15156940, -3096672, 5828271, -2480344, 2083059, -1982127, 7226283, -1226213, - 3910568, -292058, -161061, 1108102, 111669, -4735202, 1219771, -289910, -2093797, -377957, - 188979, -5987185, -66572, 667867, 2044404, 115964, -1069447, -73014, 2201171, 554051, - -949188, -1896228, 3251290, -1786706, 10737, -2746632, -240518, 186831, 588411, -528281, - 852551, 1449552, -1163936, 1189706, 21475, 989990, 21475, 1640678, -670015, -244813, - 39917428, -11291469, 1990717, -1687922, 2871186, 304943, 231928, -5055177, 2649995, -2050847, - 1894081, 852551, 1095217, 2005750, 2935610, 702227, 1187559, -4196183, 1902671, 1952063, - -2637110, -264141, 3287798, 2265595, 2190433, 4612795, 2660732, 932008, 1391569, -1307818, - 1614908, -77309, 2725157, 3536906, -212601, 1400159, 2267743, -534723, 938450, -2486786, - -519691, 3131031, 281320, -1644973, -442382, 1178969, 2312840, 186831, 1408749, 2669322, - -21348134, 8770323, -6322192, 3878356, -3813931, 4602058, -3234110, 27917, -2765959, -3427384, - -4670777, 135291, -2817499, 1120987, 1406602, 3240553, -5718749, 3262028, -1445257, 4602058, - 955630, -491774, 285615, 156766, -1226213, -1181116, 644245, -2512556, 1423782, 2486786, - -3766686, -1050120, -289910, 1243393, -1473174, 3639985, -4112431, 534723, -60130, -12885, - -1791001, 12885, -1136019, 760209, 122407, -77309, -1269163, -498216, -2594160, -1157494, - -163209, 274878, -34308200, 10703059, -7123204, -601295, -1548336, 2001455, -6021544, 274878, - 1756642, 1406602, -2175401, 1022202, -2744484, -4475356, -1795296, 388695, -2692945, 8907762, - 146029, -2677912, -925565, -3195456, -1518271, 2602750, 1565516, 3423089, -416612, 1428077, - -2113124, 657130, -1917703, -803159, -1153199, 420907, 1045825, -758062, -1812476, 242666, - 588411, 2297808, -496069, -1105954, -3296388, -2841121, -1314260, -710817, 560493, 238371, - -1370095, -751619, 204011, 983548, 586263, -33077690, 15260019, -7451769, 6708739, -3764539, - 3897683, 1855426, 1058710, -3908420, 264141, -2070174, 365072, -5061619, 1644973, 2909840, - 792421, -5370857, -2789581, -2776696, -2939905, -1941325, 3528316, 749472, 2418067, 1967095, - -1140314, -354335, -4161823, 4945655, -1672890, -652835, 96637, -1224066, -1795296, -1975685, - -654983, -4273493, 989990, -2325725, 1413044, 1320703, 2130304, -766652, 10737, -2811056, - 760209, 1866163, 210453, -556198, 135291, 1436667, 2044404, 895501, 10788958, 13318694, - -5862631, 3639985, -1726577, 1425929, -1305670, 856846, 1282048, 6564858, -2171106, 2757369, - 6204081, -1569811, -120259, -940598, 1604170, 3223373, 3352222, 4267050, 1267015, 3639985, - -770947, -2031520, -6987912, 1574106, -938450, -3508988, -2405182, -55835, -526134, 2366527, - -176094, -4075924, -4112431, 1209033, -3549791, 556198, 2422362, -3279208, -2065879, -1365800, - 1829656, 1552631, 64425, -392990, 2673617, 577673, -781684, 1045825, -1967095, 313533, - -944893, -1584843, -901943, 38031936, -13230647, 7181186, -4956393, 7138236, -5022965, 4376572, - -1621350, 4445291, 1090922, 3126736, -3627100, 3730179, -1264868, -3103114, -307090, -3335042, - -5304285, -2813204, -564788, 2688650, -3627100, -4879083, -5952825, -1082332, -508954, 4760971, - 2628520, 3053722, -2083059, 2465311, -1879048, -1876901, -1009317, 3131031, 2731599, 828929, - -6442, -135291, 100932, -906238, -485331, 2156074, 435939, 5338645, -2046552, -672162, - -4460324, 2899103, -1159641, -725850, -1047972, -309238, 264141, -777389, 10803990, -16200617, - 9691594, -5985037, 7554848, 38655, 4735202, 1425929, -7035157, -3270618, -2291365, 998580, - 1913408, 1125281, 8199093, -4419522, 6575595, 1247688, 940598, -4292820, -835371, 5703717, - -246961, -4614943, 5514738, 4243428, 1032940, -2098092, -1632088, -345745, -253403, 2624225, - -1103807, 1239098, -2899103, -543313, 1866163, -4230543, 1791001, -1565516, 1685775, -1136019, - -257698, 5265630, 2347200, 3053722, -96637, 1337882, 2016487, -259846, -1282048, -2141041, - 912681, 1163936, 1967095, 2334315, 661425, -373662, -2123861, -908386, -2145336, -41004052, - -8693014, -1606318, -7267085, -3324305, 5551245, 2063732, -2269890, -2095944, -5362267, -3758097, - -4443144, -4954245, -4166118, -2871186, -3811784, -6184753, -5321465, 1324997, -5392332, 1097364, - -7084549, -324270, -3208341, -2725157, 5278515, -1133871, -3266323, 3169686, -4634270, 3377992, - 717260, 3592740, 2368675, -633508, -2437394, 3803194, -506806, -1224066, 3526168, -2209761, - -5836861, -6665789, -2001455, 1464584, 867583, -2383707, -605590, -2252710, -32212, -487479, - -100932, 3246995, 1093069, -3343632, -1445257, -88047, 2027225, -30065, 3229816, 395137, - -47652664, 41418516, -16904992, 11458973, -10829760, 2594160, -5312875, 6947110, 1340030, 740882, - -3371549, 4666482, 998580, -8654359, 910533, 1157494, -4254165, -6713034, 6579890, 7958575, - -2540473, -2274185, 1430224, 3577708, -2095944, 7206955, -130997, 1694365, -5239860, -2085207, - -3066607, 4608500, -936303, 839666, 1181116, -2974265, 4808216, 4232691, 1382980, 1290638, - 5632850, -3582003, -697932, -964220, -3766686, 571231, -2377265, 674310, 98784, 45097, - 4692252, -493921, -766652, 648540, 493921, 2559801, -2435247, 652835, 109522, 5325760, - -1404454, 32190780, -3435974, -6240588, -1183264, 4675072, 2598455, 2334315, 156766, -4013647, - 1483911, 3092377, 3429532, -1610613, -1516124, 6824703, 2576981, -4599910, 1458141, 8714489, - -9985799, 7346542, 1219771, 9279277, -210453, 929860, 2115272, 2216203, 5035849, -3008625, - -927713, 2177549, 3719442, -886911, 279173, 869731, 1151051, 2546916, -3889093, 347892, - 2845416, 1155346, -1982127, -274878, 5845451, 4496831, 2280628, -1638530, -1183264, 2040110, - -354335, -882616, 1312113, -1217623, -2295660, 6116034, 2549063, 4105989, 899796, 3221226, - 2544768, 2922725, 584116, 3442416, 1773822, 2596308, 15152645, 4445291, 3685082, -2145336, - -1447404, -4024384, -2905546, 833224, -1591285, -1924145, -5869073, 5108864, 3466039, -3549791, - 6249178, -5776731, -1801739, 2755222, -4395899, 2673617, 4028679, 6352257, 5433134, 5377299, - 2654290, -10881300, -64425, -2147484, 2136746, -886911, 4234838, 3113851, -1520418, -2491081, - 2727304, -1769527, 7170448, 212601, 2280628, 7610682, 6932077, -5108864, 294205, -3281355, - -6524056, -438087, 1015760, -551903, -1496796, -410169, 341450, -2699387, 171799, -3186866, - -1209033, -113817, 670015, 330712, -2299955, -1848983, 4140349, -1241246, 369367, 2310693, - 2117419, -1011465, -1735167, 35766340, -25016038, 9223442, -9446781, -652835, -6573448, 6109591, - 6081674, 2010045, 1312113, 5742372, 15665893, -13608604, -1806034, -3483219, -5426691, 12154757, - 9197672, -1791001, -8175470, 3427384, -6659347, -5336497, -9369471, 1279900, -9594957, -3137474, - 5826123, 891206, -2864743, -7943542, 128849, -1868311, 4980015, 4535486, 2181844, -3577708, - 665720, -169651, 2089502, 3921305, -2330020, -1181116, -4217658, 6637872, -691490, 1026497, - 5995775, -1157494, -408022, 2400887, -2819646, -253403, 2677912, -4310000, 1123134, -758062, - -249108, -4496831, 2342905, -923418, 523986, 1172526, -1550483, 3036542, -2220498, -551903, - -55843164, 7410966, 498216, 3627100, -4548371, -7211250, -309238, 4378719, 7112466, -721555, - 10958609, 5993627, -7879118, -7048042, 4975720, 682900, -5690832, -10320806, -11815455, -7657927, - -8789651, -9788230, 1451699, 2785286, 2269890, -7303592, -7052337, 792421, -2050847, -1398012, - -1170379, -5871221, 4505421, -9932112, -3886946, -1709397, -612033, 2873333, 835371, -893353, - 4224101, -1584843, 4211216, 2349347, -3689377, 339302, 7005092, -3107409, -3148211, -17180, - 4002910, 897648, -3257733, -4069482, 3311420, -2147, -5327907, 6803228, 7642895, 773094, - -2482491, 766652, -377957, 1505386, 3249143, -498216, 4389457, -34022584, 29091960, -9717364, - 6212670, -141734, 4836133, -11755325, 4541928, -8001524, 17180, -5398774, 10894185, 9332964, - 3478924, 801011, -9012989, -5901285, -970663, -3551938, 10314364, -8407398, -392990, -4127464, - 15116137, -4752382, 1288490, -345745, 2540473, 1279900, 2523293, 2005750, -2600603, 1466731, - -706522, 5407364, 715112, 10159745, 5104569, -3124589, -798864, -1127429, 60130, -3706557, - -2838974, -826781, 1653562, 12390981, 962073, 966368, -3524021, 5147519, -2022930, -2461016, - 1436667, -2383707, 1322850, -2993592, -7056632, 3569118, 2823941, -783832, 6940667, 1698660, - 1464584, 2750927, -2171106, 1026497, -1829656, 6994354, 4554813, -438087, -2207613, -1737314, - -779537, 21938692, -762357, 4739497, -15354508, -2776696, 1642825, -12446815, 708670, 16597901, - -3206193, 940598, -7876970, -10703059, 2383707, -9803263, 14598594, -10602127, 3296388, 3234110, - 7690139, 5905580, -1896228, -9498320, -1342177, -1140314, 4438849, -6751689, -1526861, -2194728, - -3352222, -2491081, 4228396, 2465311, 11774653, 3779571, -4771709, 4683662, -3566970, -3781719, - 3420942, 9992241, -1773822, -5667210, -5278515, 5141076, -427349, -7831873, -7181186, 3163244, - 2989297, -3478924, -5985037, -9837623, 2319282, 3115999, 2074469, -5753109, 3719442, 2029372, - 1387274, 75975824, -4415227, 3444564, 7316477, -6216965, -2428804, -1861868, -17413944, 12365211, - -1546188, -10638634, 2772402, -5259188, 6876243, 5544803, 8632884, -2529736, 11577084, 10005126, - 6511171, -9470403, 7956427, -13140452, -7625715, -8811125, 4017942, -6674379, -916976, -2001455, - -8667244, -4490389, 7982197, -5257040, -3932043, -8207683, 3152506, 3199751, 6807523, -3231963, - 11458973, 3191161, 13011603, -1037235, 2641405, 2967823, -6661495, 5405217, 13297219, -4054449, - -36507, 3936338, -3451006, -4823249, 3388729, -4808216, -2506114, -6412386, -4172561, 5446019, - 4793184, 3423089, 5113159, 6463926, 6053757, 9092446, 1660005, -2235531, -34218004, -66363688, - 23553600, -521839, 554051, -7305740, -7806103, -2319282, 1449552, -4984310, 16316581, -8662949, - -15801185, 154619, 107374, -2705830, -6126771, 10950019, 1258425, -5972152, 4567698, -11087458, - 12259984, -8072391, -4724464, -9670119, 13769665, -7050189, -3040837, -9579925, -5035849, 7264937, - -4657892, 7930657, -12098923, -13720273, 107374, 1578401, 1282048, -1030792, -7737384, 571231, - 2478196, 1056562, 5787469, -708670, 9637907, 813896, 8955007, 12427488, 1666447, -1647120, - 1393717, -7988639, -2969970, -12902082, -12023761, 2559801, 2117419, 1503239, -1904818, -4129611, - -2997887, -3618510, -2858301, -3605625, -1151051, -882616, 1056562, -22316650, 63715840, -29540786, - 12990129, -6528351, 19956566, -3530463, -9403831, -9691594, 4919885, -3094524, -1651415, 178241, - 3528316, -21816286, -10988674, -5819681, 8078834, 6947110, 12064563, 2061584, -2428804, -2214056, - 14542759, -19801946, 10799695, -9627169, -2531883, -10118943, 14987288, 6073084, -10730976, 1178969, - -5063767, 1522566, 5961415, -28265180, -12410308, 2179696, 9195525, -5909875, 1374390, 7097434, - -3659312, -3283503, -1782411, 10786810, 3513283, 1775969, 405874, 4114579, 11940009, -7834021, - 4971425, -18019536, -4011500, 3977140, 7709467, 1559073, 261993, 354335, 3650722, -3577708, - -551903, -1333587, -5381594, -3764539, 5484673, 6440304, -3779571, -3502546, -12597139, -57833884, - -12741020, 5299990, -13975824, 3113851, 2162516, 8111046, -388695, 15749645, 10136123, 5499706, - -4758824, -8186208, -768799, 16694538, -14897094, -5845451, -11632919, -539018, -31155692, -24556476, - 1148904, 14781130, 20349556, 4509716, -7934952, 6798933, -7095286, -4741644, -4964982, 1786706, - 5022965, 1065152, 7655779, -6380174, -11368778, 8811125, 5536213, 18788334, -2768107, 2856153, - -3171833, 15113990, -16423955, -8259222, -4236985, -12358768, 7252053, -5231270, 6008659, -13215614, - 12468290, 12343736, 11074573, -4934918, 9749576, 332860, 3062312, 5793911, 3758097, -5647882, - 412317, -1911261, -848256, 11581379, 3848291, -5424544, 8985072, -1801739, -8860518, -3021510, - -1189706, 42247444, 27657442, -7982197, 12835510, -27154930, 20008106, 7707319, 15184857, -4453881, - -3173981, -14594299, -7275675, -25348896, -3983582, -20057498, -5770289, -12124693, -12528420, -16937204, - 7451769, -23356032, 3708704, 10971494, -4127464, 3884798, -9844065, 491774, -2750927, -2783139, - -13595719, -1251983, 2083059, -309238, -1711545, -6702297, -5946382, 5005785, 5063767, 6760279, - 30895848, -11587822, -264141, 13033078, -2516851, -4357245, -11250667, 4333622, 10769630, 17839146, - 6193343, 15010911, -13511967, -20173462, 2415919, 14514842, 8093866, -10499048, 13537737, -9081708, - 6721624, 3463891, 12322261, 7614977, 4745939, 8976482, -7724499, 6077379, 4604205, 3401614, - 11987254, 3695819, 9655086, 84174920, -54479512, -2967823, 6326487, 1677185, 6652905, 11506217, - -2299955, -1887638, 6500433, -9766756, -9253507, -1576253, 7505456, 30236570, 1322850, 10398116, - -9700184, 532576, -29890824, 18421114, -18047452, -25907242, 6079526, 7136088, -9494025, 8495445, - 3704409, 19872814, 22239340, -3824669, -8259222, -6468221, -32987496, -18212808, 26057566, 8368744, - 9667971, -15135465, -15191299, 4314295, -2834679, -13428215, 11639361, -2772402, -8096014, -9816148, - 6672232, -8847633, -4395899, 30071214, -18365280, 5257040, -6468221, 6640020, -8151848, -3874061, - -22488448, 3328600, -8188355, -6199786, 18358838, 3770981, 5297842, 10295037, 13406740, 3154654, - 9375914, -4926328, -790274, -15915001, 7123204, 11111080, -54286240, -27687506, 7808251, -5128191, - 17091822, -4567698, -6910603, -17005924, -18878528, 7101729, -19655918, -7997229, -11993696, -3841848, - -12558484, -9126806, -10479720, -6227703, -12534862, -21895744, 9528385, -41611792, -2413772, 33762736, - 6678674, -2027225, -11753178, 687195, -38021196, 13022341, 6996502, 652835, 10941429, 17499844, - -17328046, -9856950, -17965848, 506806, -1552631, -11233487, -12884902, -13737453, -9229885, -2370822, - 5716602, -1170379, 4269198, 1851131, -1436667, 22883586, 3667902, -5791764, 17276506, -11383811, - -24599426, -8652212, -5003637, -5007932, -3880503, -9504763, -4230543, -11398843, -4881231, -11555610, - -1664300, 3478924, -13436805, -4806069, -8776766, -1307818, -13892072, -15479062, -9244917, -32813550, - 42868068, -21977348, -11267847, -36013300, 27045410, -10249939, 15627239, 575526, 259846, -11181947, - 20955146, -5800354, 6272800, 5046587, -10786810, -3693672, -4090956, -19091130, 2847563, 3173981, - -15487652, -24623048, -16134045, -22634478, -6466074, 12055973, 5347235, -13316546, -14224932, 19591494, - 12423193, -17001628, 14489072, -8439611, 12652974, -21464100, -18221398, -16303696, 4597763, -14381698, - 7930657, -6365142, 2583423, -3758097, -3423089, 3678640, 14304389, -33960308, -5759551, 7243463, - -4589173, -9977209, -26246546, -1694365, 21184926, 511101, 18114024, 15150497, 2592013, -2093797, - 13376676, -14115410, -13922136, 10475425, -5327907, -8272107, 4589173, 2961380, -9043054, -9388799, - 16217797, -15341623, -10900627, -8302172, -75301512, 26718992, 10773925, -19681688, 8267812, -22142704, - 18092550, 15418933, 13041668, -39101384, 22108344, 39318280, -6513318, 12676596, -296353, -13612899, - -17366700, 43387760, -1522566, -4992900, -25376814, -49411452, -27099096, 1359357, -22310208, 16724603, - -32592360, -11641509, -19619410, 3998615, -8231305, -24773372, 3040837, -6609955, 14600741, -6395207, - -19494856, -8310762, -57793080, 8995809, -2697240, 25082610, -17033840, -19056770, 23577222, 3919158, - 3077344, -11072426, -16196322, 4161823, 10189810, 6818261, -4992900, 7312182, 3663607, -304943, - -6019397, -6687264, -19832012, 139586, -8564165, -12283606, 8699456, 4183298, 26467736, 4423817, - -19945828, -20121922, 2723009, -13529147, -10477573, 1726577, -10969346, -1773822, -6433861, 65075196, - -21414706, 3478924, 6483253, 29027536, -298500, -1911261, 20787642, 33691872, -17605070, -20615844, - 21537114, -345745, 19108310, 26600880, 22434762, 20038170, 16408923, 19134080, 63138168, -1803886, - 7359427, 15036681, 36124968, -3526168, -9268539, 16172699, 1997160, -7428146, -10481868, -8244190, - 3193308, -11716671, 25832080, 38115688, 1067299, -5050882, 17343078, -4838281, 23590108, 18479096, - 3393024, -14209899, 16492674, 2340757, -2963528, 6575595, 438087, 44070660, -496069, 21386790, - -5948530, 39788576, -410169, 7206955, -9506910, -17729624, 21294448, -6706592, 39202312, 12156905, - 20207822, 4436701, 3296388, 14884209, 6008659, 30371862, 17761838, 9341554, 16456167, -10387378, - 9369471, 16892106, 5239860, 951335, 79392472, -23957328, 6599218, -8431021, 2576981, 9657234, - 25924422, -21556440, 10183367, -1009317, 274878, 14128295, -13215614, 15197742, -43589624, -19565724, - 5710159, 15408195, 9710921, 33352568, -34978212, 5005785, -6590628, -46027016, 17871358, -17944374, - -13374528, -6732361, -39462160, 12238509, 11343009, 5935645, -21614422, -32779190, 10844792, -20194936, - 15685221, -31275952, -1799591, -37407016, -11598559, -24809878, -24294482, 22765474, 32205812, 5355824, - 10140418, -15433965, 3719442, -26225070, 8531953, -16922172, 1887638, 26557930, 9966472, -8179765, - 12320114, 3549791, 10065256, -10557030, 19018116, 39848708, -1743757, -22209276, -20246476, -9178345, - -8602819, 3848291, 12771085, 4876936, 23237920, 1370095, 5278515, -24215026, -10131828, -82693152, - -69518344, 28162100, -9491878, 32899450, -3515431, 10219875, -41918880, -39286064, -24315958, 12068858, - -32678258, -22683870, -10322954, 5617817, 22280142, 7546258, -47508780, 11819750, 25076166, -66756676, - -8849780, 2488934, -71092448, -24736864, 30227980, -65609920, 30814242, 32841468, -590558, -9998684, - -3678640, -16234976, -18279380, 11065983, 13295071, 48148732, -29850022, -15659451, -13174812, -23134842, - 246961, -39101384, -10726681, 2469606, -2205466, -13009456, -3094524, -21683142, -5463199, 11474005, - -6481106, -14227079, 14920716, -7885560, -16993038, -22844932, 46720656, -2282775, 27940910, 3612068, - 9635759, 31406948, 3184718, 21356724, -15803332, 23783382, 15818365, 5065914, 4597763, 5731634, - 19000936, 9326521, 1758789, 19748260, -133412424, 49426484, -15277199, -60234768, -15124727, 809601, - -15970836, 22286586, -52117280, 24096914, -4685810, -60058676, -41386304, 7335804, 23057532, 21438330, - 15854872, 34089156, 9524090, 56577604, 31009664, 66436700, 8332237, 53779432, -42520176, -34108484, - 10937134, 3803194, -33775624, 8370892, 6734509, -5660767, -13069585, 31379032, 5888400, -72567768, - -32184338, 22885734, 7969312, -16282221, 20177756, 19726784, 32231582, 5823976, 9393093, 4879083, - 9195525, 10642929, -25078314, 2531883, 4344360, -54159536, 24704652, 17046726, 22217866, -37580964, - -21266530, 25082610, -201863, -8415988, -5718749, -16917876, -13980119, -1348620, -18549964, -42116448, - 13460428, 41871636, -30949534, 2718714, -17937930, -8579197, -13507672, -5542656, 20862804, 54090820, - 36028332, 24414742, 12506945, 98784, -14647986, -21412560, 15801185, -57221848, 56985628, -37978248, - 7739531, -61976380, -3934190, 55143084, 20555714, -21734682, 34256660, -58963460, 21133386, 9049496, - 2218351, -72239200, -22986664, 2675765, 9528385, 43692704, -71313640, -11055246, -24951612, -67076652, - -16247861, 13984414, 30743376, 47309064, 36135708, 36185100, -5224828, -26128434, 22952306, 5768141, - -17033840, 7142531, -34035468, 48954036, 21644488, 15311558, -28660316, -60022168, -17748952, -637803, - -72690176, -58972048, -17295834, -53167400, 30449170, 10544145, 7778186, -25769804, -27769112, 7481833, - 4567698, 1816771, 13146895, -12444668, 9219147, 30799210, 12487617, 2671470, 1696512, -25467008, - -21507048, -20409684, 6751689, -10312216, 62865436, -51316268, 12219182, -8377334, -7718056, -146029, - 16537772, -32508608, 40531608, -13398150, 27442694, -4170413, -24365350, 42971148, 42653320, 29903710, - -15768972, 65798900, 23809152, -76656576, 76469744, 5585605, -1269163, 54526756, 1447404, -25853556, - -33532958, 53747220, -35648228, -47811576, 43785044, 37419904, -26390426, -63114544, 23164906, -22771916, - 7617125, -44944684, -36350456, -16426102, 41019084, 35865124, 4099546, 32736240, -51017768, 14345191, - -14027363, -20553566, 23218594, 1475321, 6573448, -72153304, -20001662, 37102076, -50957640, -15064598, - -63722284, -13769665, -24262270, 8542690, -15951509, 5012227, 5753109, -4284230, 5574868, -18979460, - -56717192, -12678743, 27702540, -5888400, 18854906, -23506356, -50242528, -10387378, 9204115, 58134528, - 4462471, -16849156, -41669772, -1322850, -19969450, 15601469, -34488588, 22020298, 13793287, -29875792, - -31001074, 46750720, -55048596, -1889786, 35192964, -39417064, 12543452, 45810120, -36464272, 31565862, - 22591528, 33799244, -55280524, 47908212, -55538224, 17132624, -42399916, 5798206, -21917218, 37965364, - 672162, 23523536, 11289322, -38478612, -24436216, -53407920, 31033286, -35867272, 31177168, -43233140, - -50886772, -83187072, 7539815, 45226004, -7449621, -169651, 13224204, 39294656, -13683766, 11536282, - -47300476, 13239237, 60883308, -4700842, 55080808, 74902080, -1402307, 14078903, 14093935, -29302414, - 15247134, -35723392, -2935610, -36494336, -38781408, 4898410, -15373835, -60883308, 42232412, 4526896, - 31157840, -33543694, -20250770, -9081708, -131915624, 33137820, 49042084, 13411035, -57299160, -8626442, - 92595200, -106970456, -2939905, -18281528, -70014408, -17884244, -47517372, 17031692, 17003776, 40495100, - 16301548, -56100864, -20038170, 39889508, -63898376, -18427558, -68326488, 57747984, 17184164, 45075680, - 77184856, -27668180, -16621523, -13172665, -39086348, 36739152, -18504866, -46660524, -52155936, -9539122, - 19542102, -1930588, 10217727, 12133283, 29757680, -13791140, -1838246, 21786222, -22022444, 43241732, - 49392124, 46420008, -38697656, 4423817, -12494060, 21784074, 93445600, 69795368, 133983656, 9850507, - 52445844, 42191612, -21384642, -5611375, -8087424, -13625784, 15835544, 2828236, 47150152, 35298188, - -18004502, -6281390, -30651034, -57956288, 20508468, -2261300, 16578574, -5486821, -42722040, -6655052, - 118112, }, + -236223, -500364, -326418, -137439, -575526, -801011, -73014, -431644, -382252, 109522, + 214748, 113817, 68719, -304943, 766652, -88047, 429497, -1116692, -1288490, -15032, + -2291365, -904091, 942745, 92342, 277025, 184684, 1599875, 23622, 682900, 120259, + 1043677, 66572, -809601, -1120987, -1318555, -2293513, 165356, -223338, 81604, -940598, + -156766, 646393, 790274, -530428, -622770, -9895605, 953483, -2156074, -103079, -783832, + -1453846, 805306, 3341485, 40802, 1715839, -1864016, -468151, 1314260, -1198296, 405874, + 2334315, -1348620, -429497, -614180, -113817, 367220, -463856, 691490, 463856, -502511, + 893353, -502511, -17180, -1857573, 15032, -161061, 470299, 354335, 901943, -770947, + 1529008, -195421, 1277753, -375810, 4295, 987843, -289910, 730144, 328565, 745177, + 158914, 708670, 4215511, -3240553, 2072322, -2553358, 1352915, -1228361, -1213328, -715112, + -676457, 790274, 897648, -3169686, -143881, 506806, -289910, -500364, -1846836, -646393, + 1365800, 2061584, 1043677, 3229816, 678605, -530428, 685047, 590558, -298500, 1082332, + 2299955, -833224, 4295, 1007170, -2147, -180389, -1599875, -23622, 850404, 702227, + 158914, 85899, -515396, 616328, -34360, 111669, 57982, 15255724, -904091, 1406602, + -874026, 1060857, -1067299, 326418, -195421, -186831, 957778, -719407, -2667175, 876173, + 371515, 932008, 1952063, 1075889, 758062, -169651, -1507534, -468151, 824634, -137439, + -167504, 1634235, -1883343, -549756, 57982, -259846, -397284, 824634, 912681, 1090922, + 380105, 438087, -322123, 1483911, 30065, 1155346, 854699, -178241, -47245, 586263, + 107374, -229781, -49392, 11108933, -10692321, 1627793, -2916283, 1498944, -231928, 1067299, + -1056562, 1958505, -886911, 1166084, -2576981, 49392, -1507534, 369367, -264141, -403727, + -712965, -1928440, -219043, 165356, -949188, 1475321, -717260, -1174674, -1432372, 779537, + -923418, 2117419, -249108, -57982, 622770, -57982, 27917, -1039382, -833224, -296353, + 208306, -444529, -953483, 760209, 584116, 1423782, -358630, 414464, -216896, -26268020, + 2959233, -2070174, -53687, -410169, -2304250, 2265595, -695785, 105227, 891206, 197569, + 2639258, -240518, -1234803, 3191161, 1219771, 2871186, -176094, -4050154, -2476049, -2005750, + 1513976, -2162516, 57982, -852551, -811749, 135291, 496069, -700080, -1355062, -1022202, + 680752, 798864, 1604170, -238371, -356482, -208306, 949188, -1294933, 193274, 373662, + 672162, -1071594, 899796, -1277753, -326418, -33159296, 11849815, -4945655, 5413807, -3962107, + 2413772, -4284230, 2241973, -3208341, 1065152, 2192581, -15032, 775242, 1975685, -1464584, + 1380832, -1846836, -1423782, -3949223, 3365107, -2357937, 2207613, 79457, -154619, -3783866, + -277025, 620623, -670015, -212601, -283468, 1451699, -377957, -1166084, 1013612, 272730, + -624918, -4295, -105227, 55835, 513249, -1071594, 2403034, -281320, -1769527, -238371, + -1041530, 1760937, 15156940, -3096672, 5828271, -2480344, 2083059, -1982127, 7226283, -1226213, + 3910568, -292058, -161061, 1108102, 111669, -4735202, 1219771, -289910, -2093797, -377957, + 188979, -5987185, -66572, 667867, 2044404, 115964, -1069447, -73014, 2201171, 554051, + -949188, -1896228, 3251290, -1786706, 10737, -2746632, -240518, 186831, 588411, -528281, + 852551, 1449552, -1163936, 1189706, 21475, 989990, 21475, 1640678, -670015, -244813, + 39917428, -11291469, 1990717, -1687922, 2871186, 304943, 231928, -5055177, 2649995, -2050847, + 1894081, 852551, 1095217, 2005750, 2935610, 702227, 1187559, -4196183, 1902671, 1952063, + -2637110, -264141, 3287798, 2265595, 2190433, 4612795, 2660732, 932008, 1391569, -1307818, + 1614908, -77309, 2725157, 3536906, -212601, 1400159, 2267743, -534723, 938450, -2486786, + -519691, 3131031, 281320, -1644973, -442382, 1178969, 2312840, 186831, 1408749, 2669322, + -21348134, 8770323, -6322192, 3878356, -3813931, 4602058, -3234110, 27917, -2765959, -3427384, + -4670777, 135291, -2817499, 1120987, 1406602, 3240553, -5718749, 3262028, -1445257, 4602058, + 955630, -491774, 285615, 156766, -1226213, -1181116, 644245, -2512556, 1423782, 2486786, + -3766686, -1050120, -289910, 1243393, -1473174, 3639985, -4112431, 534723, -60130, -12885, + -1791001, 12885, -1136019, 760209, 122407, -77309, -1269163, -498216, -2594160, -1157494, + -163209, 274878, -34308200, 10703059, -7123204, -601295, -1548336, 2001455, -6021544, 274878, + 1756642, 1406602, -2175401, 1022202, -2744484, -4475356, -1795296, 388695, -2692945, 8907762, + 146029, -2677912, -925565, -3195456, -1518271, 2602750, 1565516, 3423089, -416612, 1428077, + -2113124, 657130, -1917703, -803159, -1153199, 420907, 1045825, -758062, -1812476, 242666, + 588411, 2297808, -496069, -1105954, -3296388, -2841121, -1314260, -710817, 560493, 238371, + -1370095, -751619, 204011, 983548, 586263, -33077690, 15260019, -7451769, 6708739, -3764539, + 3897683, 1855426, 1058710, -3908420, 264141, -2070174, 365072, -5061619, 1644973, 2909840, + 792421, -5370857, -2789581, -2776696, -2939905, -1941325, 3528316, 749472, 2418067, 1967095, + -1140314, -354335, -4161823, 4945655, -1672890, -652835, 96637, -1224066, -1795296, -1975685, + -654983, -4273493, 989990, -2325725, 1413044, 1320703, 2130304, -766652, 10737, -2811056, + 760209, 1866163, 210453, -556198, 135291, 1436667, 2044404, 895501, 10788958, 13318694, + -5862631, 3639985, -1726577, 1425929, -1305670, 856846, 1282048, 6564858, -2171106, 2757369, + 6204081, -1569811, -120259, -940598, 1604170, 3223373, 3352222, 4267050, 1267015, 3639985, + -770947, -2031520, -6987912, 1574106, -938450, -3508988, -2405182, -55835, -526134, 2366527, + -176094, -4075924, -4112431, 1209033, -3549791, 556198, 2422362, -3279208, -2065879, -1365800, + 1829656, 1552631, 64425, -392990, 2673617, 577673, -781684, 1045825, -1967095, 313533, + -944893, -1584843, -901943, 38031936, -13230647, 7181186, -4956393, 7138236, -5022965, 4376572, + -1621350, 4445291, 1090922, 3126736, -3627100, 3730179, -1264868, -3103114, -307090, -3335042, + -5304285, -2813204, -564788, 2688650, -3627100, -4879083, -5952825, -1082332, -508954, 4760971, + 2628520, 3053722, -2083059, 2465311, -1879048, -1876901, -1009317, 3131031, 2731599, 828929, + -6442, -135291, 100932, -906238, -485331, 2156074, 435939, 5338645, -2046552, -672162, + -4460324, 2899103, -1159641, -725850, -1047972, -309238, 264141, -777389, 10803990, -16200617, + 9691594, -5985037, 7554848, 38655, 4735202, 1425929, -7035157, -3270618, -2291365, 998580, + 1913408, 1125281, 8199093, -4419522, 6575595, 1247688, 940598, -4292820, -835371, 5703717, + -246961, -4614943, 5514738, 4243428, 1032940, -2098092, -1632088, -345745, -253403, 2624225, + -1103807, 1239098, -2899103, -543313, 1866163, -4230543, 1791001, -1565516, 1685775, -1136019, + -257698, 5265630, 2347200, 3053722, -96637, 1337882, 2016487, -259846, -1282048, -2141041, + 912681, 1163936, 1967095, 2334315, 661425, -373662, -2123861, -908386, -2145336, -41004052, + -8693014, -1606318, -7267085, -3324305, 5551245, 2063732, -2269890, -2095944, -5362267, -3758097, + -4443144, -4954245, -4166118, -2871186, -3811784, -6184753, -5321465, 1324997, -5392332, 1097364, + -7084549, -324270, -3208341, -2725157, 5278515, -1133871, -3266323, 3169686, -4634270, 3377992, + 717260, 3592740, 2368675, -633508, -2437394, 3803194, -506806, -1224066, 3526168, -2209761, + -5836861, -6665789, -2001455, 1464584, 867583, -2383707, -605590, -2252710, -32212, -487479, + -100932, 3246995, 1093069, -3343632, -1445257, -88047, 2027225, -30065, 3229816, 395137, + -47652664, 41418516, -16904992, 11458973, -10829760, 2594160, -5312875, 6947110, 1340030, 740882, + -3371549, 4666482, 998580, -8654359, 910533, 1157494, -4254165, -6713034, 6579890, 7958575, + -2540473, -2274185, 1430224, 3577708, -2095944, 7206955, -130997, 1694365, -5239860, -2085207, + -3066607, 4608500, -936303, 839666, 1181116, -2974265, 4808216, 4232691, 1382980, 1290638, + 5632850, -3582003, -697932, -964220, -3766686, 571231, -2377265, 674310, 98784, 45097, + 4692252, -493921, -766652, 648540, 493921, 2559801, -2435247, 652835, 109522, 5325760, + -1404454, 32190780, -3435974, -6240588, -1183264, 4675072, 2598455, 2334315, 156766, -4013647, + 1483911, 3092377, 3429532, -1610613, -1516124, 6824703, 2576981, -4599910, 1458141, 8714489, + -9985799, 7346542, 1219771, 9279277, -210453, 929860, 2115272, 2216203, 5035849, -3008625, + -927713, 2177549, 3719442, -886911, 279173, 869731, 1151051, 2546916, -3889093, 347892, + 2845416, 1155346, -1982127, -274878, 5845451, 4496831, 2280628, -1638530, -1183264, 2040110, + -354335, -882616, 1312113, -1217623, -2295660, 6116034, 2549063, 4105989, 899796, 3221226, + 2544768, 2922725, 584116, 3442416, 1773822, 2596308, 15152645, 4445291, 3685082, -2145336, + -1447404, -4024384, -2905546, 833224, -1591285, -1924145, -5869073, 5108864, 3466039, -3549791, + 6249178, -5776731, -1801739, 2755222, -4395899, 2673617, 4028679, 6352257, 5433134, 5377299, + 2654290, -10881300, -64425, -2147484, 2136746, -886911, 4234838, 3113851, -1520418, -2491081, + 2727304, -1769527, 7170448, 212601, 2280628, 7610682, 6932077, -5108864, 294205, -3281355, + -6524056, -438087, 1015760, -551903, -1496796, -410169, 341450, -2699387, 171799, -3186866, + -1209033, -113817, 670015, 330712, -2299955, -1848983, 4140349, -1241246, 369367, 2310693, + 2117419, -1011465, -1735167, 35766340, -25016038, 9223442, -9446781, -652835, -6573448, 6109591, + 6081674, 2010045, 1312113, 5742372, 15665893, -13608604, -1806034, -3483219, -5426691, 12154757, + 9197672, -1791001, -8175470, 3427384, -6659347, -5336497, -9369471, 1279900, -9594957, -3137474, + 5826123, 891206, -2864743, -7943542, 128849, -1868311, 4980015, 4535486, 2181844, -3577708, + 665720, -169651, 2089502, 3921305, -2330020, -1181116, -4217658, 6637872, -691490, 1026497, + 5995775, -1157494, -408022, 2400887, -2819646, -253403, 2677912, -4310000, 1123134, -758062, + -249108, -4496831, 2342905, -923418, 523986, 1172526, -1550483, 3036542, -2220498, -551903, + -55843164, 7410966, 498216, 3627100, -4548371, -7211250, -309238, 4378719, 7112466, -721555, + 10958609, 5993627, -7879118, -7048042, 4975720, 682900, -5690832, -10320806, -11815455, -7657927, + -8789651, -9788230, 1451699, 2785286, 2269890, -7303592, -7052337, 792421, -2050847, -1398012, + -1170379, -5871221, 4505421, -9932112, -3886946, -1709397, -612033, 2873333, 835371, -893353, + 4224101, -1584843, 4211216, 2349347, -3689377, 339302, 7005092, -3107409, -3148211, -17180, + 4002910, 897648, -3257733, -4069482, 3311420, -2147, -5327907, 6803228, 7642895, 773094, + -2482491, 766652, -377957, 1505386, 3249143, -498216, 4389457, -34022584, 29091960, -9717364, + 6212670, -141734, 4836133, -11755325, 4541928, -8001524, 17180, -5398774, 10894185, 9332964, + 3478924, 801011, -9012989, -5901285, -970663, -3551938, 10314364, -8407398, -392990, -4127464, + 15116137, -4752382, 1288490, -345745, 2540473, 1279900, 2523293, 2005750, -2600603, 1466731, + -706522, 5407364, 715112, 10159745, 5104569, -3124589, -798864, -1127429, 60130, -3706557, + -2838974, -826781, 1653562, 12390981, 962073, 966368, -3524021, 5147519, -2022930, -2461016, + 1436667, -2383707, 1322850, -2993592, -7056632, 3569118, 2823941, -783832, 6940667, 1698660, + 1464584, 2750927, -2171106, 1026497, -1829656, 6994354, 4554813, -438087, -2207613, -1737314, + -779537, 21938692, -762357, 4739497, -15354508, -2776696, 1642825, -12446815, 708670, 16597901, + -3206193, 940598, -7876970, -10703059, 2383707, -9803263, 14598594, -10602127, 3296388, 3234110, + 7690139, 5905580, -1896228, -9498320, -1342177, -1140314, 4438849, -6751689, -1526861, -2194728, + -3352222, -2491081, 4228396, 2465311, 11774653, 3779571, -4771709, 4683662, -3566970, -3781719, + 3420942, 9992241, -1773822, -5667210, -5278515, 5141076, -427349, -7831873, -7181186, 3163244, + 2989297, -3478924, -5985037, -9837623, 2319282, 3115999, 2074469, -5753109, 3719442, 2029372, + 1387274, 75975824, -4415227, 3444564, 7316477, -6216965, -2428804, -1861868, -17413944, 12365211, + -1546188, -10638634, 2772402, -5259188, 6876243, 5544803, 8632884, -2529736, 11577084, 10005126, + 6511171, -9470403, 7956427, -13140452, -7625715, -8811125, 4017942, -6674379, -916976, -2001455, + -8667244, -4490389, 7982197, -5257040, -3932043, -8207683, 3152506, 3199751, 6807523, -3231963, + 11458973, 3191161, 13011603, -1037235, 2641405, 2967823, -6661495, 5405217, 13297219, -4054449, + -36507, 3936338, -3451006, -4823249, 3388729, -4808216, -2506114, -6412386, -4172561, 5446019, + 4793184, 3423089, 5113159, 6463926, 6053757, 9092446, 1660005, -2235531, -34218004, -66363688, + 23553600, -521839, 554051, -7305740, -7806103, -2319282, 1449552, -4984310, 16316581, -8662949, + -15801185, 154619, 107374, -2705830, -6126771, 10950019, 1258425, -5972152, 4567698, -11087458, + 12259984, -8072391, -4724464, -9670119, 13769665, -7050189, -3040837, -9579925, -5035849, 7264937, + -4657892, 7930657, -12098923, -13720273, 107374, 1578401, 1282048, -1030792, -7737384, 571231, + 2478196, 1056562, 5787469, -708670, 9637907, 813896, 8955007, 12427488, 1666447, -1647120, + 1393717, -7988639, -2969970, -12902082, -12023761, 2559801, 2117419, 1503239, -1904818, -4129611, + -2997887, -3618510, -2858301, -3605625, -1151051, -882616, 1056562, -22316650, 63715840, -29540786, + 12990129, -6528351, 19956566, -3530463, -9403831, -9691594, 4919885, -3094524, -1651415, 178241, + 3528316, -21816286, -10988674, -5819681, 8078834, 6947110, 12064563, 2061584, -2428804, -2214056, + 14542759, -19801946, 10799695, -9627169, -2531883, -10118943, 14987288, 6073084, -10730976, 1178969, + -5063767, 1522566, 5961415, -28265180, -12410308, 2179696, 9195525, -5909875, 1374390, 7097434, + -3659312, -3283503, -1782411, 10786810, 3513283, 1775969, 405874, 4114579, 11940009, -7834021, + 4971425, -18019536, -4011500, 3977140, 7709467, 1559073, 261993, 354335, 3650722, -3577708, + -551903, -1333587, -5381594, -3764539, 5484673, 6440304, -3779571, -3502546, -12597139, -57833884, + -12741020, 5299990, -13975824, 3113851, 2162516, 8111046, -388695, 15749645, 10136123, 5499706, + -4758824, -8186208, -768799, 16694538, -14897094, -5845451, -11632919, -539018, -31155692, -24556476, + 1148904, 14781130, 20349556, 4509716, -7934952, 6798933, -7095286, -4741644, -4964982, 1786706, + 5022965, 1065152, 7655779, -6380174, -11368778, 8811125, 5536213, 18788334, -2768107, 2856153, + -3171833, 15113990, -16423955, -8259222, -4236985, -12358768, 7252053, -5231270, 6008659, -13215614, + 12468290, 12343736, 11074573, -4934918, 9749576, 332860, 3062312, 5793911, 3758097, -5647882, + 412317, -1911261, -848256, 11581379, 3848291, -5424544, 8985072, -1801739, -8860518, -3021510, + -1189706, 42247444, 27657442, -7982197, 12835510, -27154930, 20008106, 7707319, 15184857, -4453881, + -3173981, -14594299, -7275675, -25348896, -3983582, -20057498, -5770289, -12124693, -12528420, -16937204, + 7451769, -23356032, 3708704, 10971494, -4127464, 3884798, -9844065, 491774, -2750927, -2783139, + -13595719, -1251983, 2083059, -309238, -1711545, -6702297, -5946382, 5005785, 5063767, 6760279, + 30895848, -11587822, -264141, 13033078, -2516851, -4357245, -11250667, 4333622, 10769630, 17839146, + 6193343, 15010911, -13511967, -20173462, 2415919, 14514842, 8093866, -10499048, 13537737, -9081708, + 6721624, 3463891, 12322261, 7614977, 4745939, 8976482, -7724499, 6077379, 4604205, 3401614, + 11987254, 3695819, 9655086, 84174920, -54479512, -2967823, 6326487, 1677185, 6652905, 11506217, + -2299955, -1887638, 6500433, -9766756, -9253507, -1576253, 7505456, 30236570, 1322850, 10398116, + -9700184, 532576, -29890824, 18421114, -18047452, -25907242, 6079526, 7136088, -9494025, 8495445, + 3704409, 19872814, 22239340, -3824669, -8259222, -6468221, -32987496, -18212808, 26057566, 8368744, + 9667971, -15135465, -15191299, 4314295, -2834679, -13428215, 11639361, -2772402, -8096014, -9816148, + 6672232, -8847633, -4395899, 30071214, -18365280, 5257040, -6468221, 6640020, -8151848, -3874061, + -22488448, 3328600, -8188355, -6199786, 18358838, 3770981, 5297842, 10295037, 13406740, 3154654, + 9375914, -4926328, -790274, -15915001, 7123204, 11111080, -54286240, -27687506, 7808251, -5128191, + 17091822, -4567698, -6910603, -17005924, -18878528, 7101729, -19655918, -7997229, -11993696, -3841848, + -12558484, -9126806, -10479720, -6227703, -12534862, -21895744, 9528385, -41611792, -2413772, 33762736, + 6678674, -2027225, -11753178, 687195, -38021196, 13022341, 6996502, 652835, 10941429, 17499844, + -17328046, -9856950, -17965848, 506806, -1552631, -11233487, -12884902, -13737453, -9229885, -2370822, + 5716602, -1170379, 4269198, 1851131, -1436667, 22883586, 3667902, -5791764, 17276506, -11383811, + -24599426, -8652212, -5003637, -5007932, -3880503, -9504763, -4230543, -11398843, -4881231, -11555610, + -1664300, 3478924, -13436805, -4806069, -8776766, -1307818, -13892072, -15479062, -9244917, -32813550, + 42868068, -21977348, -11267847, -36013300, 27045410, -10249939, 15627239, 575526, 259846, -11181947, + 20955146, -5800354, 6272800, 5046587, -10786810, -3693672, -4090956, -19091130, 2847563, 3173981, + -15487652, -24623048, -16134045, -22634478, -6466074, 12055973, 5347235, -13316546, -14224932, 19591494, + 12423193, -17001628, 14489072, -8439611, 12652974, -21464100, -18221398, -16303696, 4597763, -14381698, + 7930657, -6365142, 2583423, -3758097, -3423089, 3678640, 14304389, -33960308, -5759551, 7243463, + -4589173, -9977209, -26246546, -1694365, 21184926, 511101, 18114024, 15150497, 2592013, -2093797, + 13376676, -14115410, -13922136, 10475425, -5327907, -8272107, 4589173, 2961380, -9043054, -9388799, + 16217797, -15341623, -10900627, -8302172, -75301512, 26718992, 10773925, -19681688, 8267812, -22142704, + 18092550, 15418933, 13041668, -39101384, 22108344, 39318280, -6513318, 12676596, -296353, -13612899, + -17366700, 43387760, -1522566, -4992900, -25376814, -49411452, -27099096, 1359357, -22310208, 16724603, + -32592360, -11641509, -19619410, 3998615, -8231305, -24773372, 3040837, -6609955, 14600741, -6395207, + -19494856, -8310762, -57793080, 8995809, -2697240, 25082610, -17033840, -19056770, 23577222, 3919158, + 3077344, -11072426, -16196322, 4161823, 10189810, 6818261, -4992900, 7312182, 3663607, -304943, + -6019397, -6687264, -19832012, 139586, -8564165, -12283606, 8699456, 4183298, 26467736, 4423817, + -19945828, -20121922, 2723009, -13529147, -10477573, 1726577, -10969346, -1773822, -6433861, 65075196, + -21414706, 3478924, 6483253, 29027536, -298500, -1911261, 20787642, 33691872, -17605070, -20615844, + 21537114, -345745, 19108310, 26600880, 22434762, 20038170, 16408923, 19134080, 63138168, -1803886, + 7359427, 15036681, 36124968, -3526168, -9268539, 16172699, 1997160, -7428146, -10481868, -8244190, + 3193308, -11716671, 25832080, 38115688, 1067299, -5050882, 17343078, -4838281, 23590108, 18479096, + 3393024, -14209899, 16492674, 2340757, -2963528, 6575595, 438087, 44070660, -496069, 21386790, + -5948530, 39788576, -410169, 7206955, -9506910, -17729624, 21294448, -6706592, 39202312, 12156905, + 20207822, 4436701, 3296388, 14884209, 6008659, 30371862, 17761838, 9341554, 16456167, -10387378, + 9369471, 16892106, 5239860, 951335, 79392472, -23957328, 6599218, -8431021, 2576981, 9657234, + 25924422, -21556440, 10183367, -1009317, 274878, 14128295, -13215614, 15197742, -43589624, -19565724, + 5710159, 15408195, 9710921, 33352568, -34978212, 5005785, -6590628, -46027016, 17871358, -17944374, + -13374528, -6732361, -39462160, 12238509, 11343009, 5935645, -21614422, -32779190, 10844792, -20194936, + 15685221, -31275952, -1799591, -37407016, -11598559, -24809878, -24294482, 22765474, 32205812, 5355824, + 10140418, -15433965, 3719442, -26225070, 8531953, -16922172, 1887638, 26557930, 9966472, -8179765, + 12320114, 3549791, 10065256, -10557030, 19018116, 39848708, -1743757, -22209276, -20246476, -9178345, + -8602819, 3848291, 12771085, 4876936, 23237920, 1370095, 5278515, -24215026, -10131828, -82693152, + -69518344, 28162100, -9491878, 32899450, -3515431, 10219875, -41918880, -39286064, -24315958, 12068858, + -32678258, -22683870, -10322954, 5617817, 22280142, 7546258, -47508780, 11819750, 25076166, -66756676, + -8849780, 2488934, -71092448, -24736864, 30227980, -65609920, 30814242, 32841468, -590558, -9998684, + -3678640, -16234976, -18279380, 11065983, 13295071, 48148732, -29850022, -15659451, -13174812, -23134842, + 246961, -39101384, -10726681, 2469606, -2205466, -13009456, -3094524, -21683142, -5463199, 11474005, + -6481106, -14227079, 14920716, -7885560, -16993038, -22844932, 46720656, -2282775, 27940910, 3612068, + 9635759, 31406948, 3184718, 21356724, -15803332, 23783382, 15818365, 5065914, 4597763, 5731634, + 19000936, 9326521, 1758789, 19748260, -133412424, 49426484, -15277199, -60234768, -15124727, 809601, + -15970836, 22286586, -52117280, 24096914, -4685810, -60058676, -41386304, 7335804, 23057532, 21438330, + 15854872, 34089156, 9524090, 56577604, 31009664, 66436700, 8332237, 53779432, -42520176, -34108484, + 10937134, 3803194, -33775624, 8370892, 6734509, -5660767, -13069585, 31379032, 5888400, -72567768, + -32184338, 22885734, 7969312, -16282221, 20177756, 19726784, 32231582, 5823976, 9393093, 4879083, + 9195525, 10642929, -25078314, 2531883, 4344360, -54159536, 24704652, 17046726, 22217866, -37580964, + -21266530, 25082610, -201863, -8415988, -5718749, -16917876, -13980119, -1348620, -18549964, -42116448, + 13460428, 41871636, -30949534, 2718714, -17937930, -8579197, -13507672, -5542656, 20862804, 54090820, + 36028332, 24414742, 12506945, 98784, -14647986, -21412560, 15801185, -57221848, 56985628, -37978248, + 7739531, -61976380, -3934190, 55143084, 20555714, -21734682, 34256660, -58963460, 21133386, 9049496, + 2218351, -72239200, -22986664, 2675765, 9528385, 43692704, -71313640, -11055246, -24951612, -67076652, + -16247861, 13984414, 30743376, 47309064, 36135708, 36185100, -5224828, -26128434, 22952306, 5768141, + -17033840, 7142531, -34035468, 48954036, 21644488, 15311558, -28660316, -60022168, -17748952, -637803, + -72690176, -58972048, -17295834, -53167400, 30449170, 10544145, 7778186, -25769804, -27769112, 7481833, + 4567698, 1816771, 13146895, -12444668, 9219147, 30799210, 12487617, 2671470, 1696512, -25467008, + -21507048, -20409684, 6751689, -10312216, 62865436, -51316268, 12219182, -8377334, -7718056, -146029, + 16537772, -32508608, 40531608, -13398150, 27442694, -4170413, -24365350, 42971148, 42653320, 29903710, + -15768972, 65798900, 23809152, -76656576, 76469744, 5585605, -1269163, 54526756, 1447404, -25853556, + -33532958, 53747220, -35648228, -47811576, 43785044, 37419904, -26390426, -63114544, 23164906, -22771916, + 7617125, -44944684, -36350456, -16426102, 41019084, 35865124, 4099546, 32736240, -51017768, 14345191, + -14027363, -20553566, 23218594, 1475321, 6573448, -72153304, -20001662, 37102076, -50957640, -15064598, + -63722284, -13769665, -24262270, 8542690, -15951509, 5012227, 5753109, -4284230, 5574868, -18979460, + -56717192, -12678743, 27702540, -5888400, 18854906, -23506356, -50242528, -10387378, 9204115, 58134528, + 4462471, -16849156, -41669772, -1322850, -19969450, 15601469, -34488588, 22020298, 13793287, -29875792, + -31001074, 46750720, -55048596, -1889786, 35192964, -39417064, 12543452, 45810120, -36464272, 31565862, + 22591528, 33799244, -55280524, 47908212, -55538224, 17132624, -42399916, 5798206, -21917218, 37965364, + 672162, 23523536, 11289322, -38478612, -24436216, -53407920, 31033286, -35867272, 31177168, -43233140, + -50886772, -83187072, 7539815, 45226004, -7449621, -169651, 13224204, 39294656, -13683766, 11536282, + -47300476, 13239237, 60883308, -4700842, 55080808, 74902080, -1402307, 14078903, 14093935, -29302414, + 15247134, -35723392, -2935610, -36494336, -38781408, 4898410, -15373835, -60883308, 42232412, 4526896, + 31157840, -33543694, -20250770, -9081708, -131915624, 33137820, 49042084, 13411035, -57299160, -8626442, + 92595200, -106970456, -2939905, -18281528, -70014408, -17884244, -47517372, 17031692, 17003776, 40495100, + 16301548, -56100864, -20038170, 39889508, -63898376, -18427558, -68326488, 57747984, 17184164, 45075680, + 77184856, -27668180, -16621523, -13172665, -39086348, 36739152, -18504866, -46660524, -52155936, -9539122, + 19542102, -1930588, 10217727, 12133283, 29757680, -13791140, -1838246, 21786222, -22022444, 43241732, + 49392124, 46420008, -38697656, 4423817, -12494060, 21784074, 93445600, 69795368, 133983656, 9850507, + 52445844, 42191612, -21384642, -5611375, -8087424, -13625784, 15835544, 2828236, 47150152, 35298188, + -18004502, -6281390, -30651034, -57956288, 20508468, -2261300, 16578574, -5486821, -42722040, -6655052, + 118112, }, }; const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2522] ={ { -8937827, - 962073, -1997160, 1969243, -977105, 848256, -12885, 942745, -57982, 1020055, -1251983, - -590558, 594853, -846109, -141734, -1324997, -92342, -489626, 2634963, 1251983, -1604170, - 62277, 657130, -60130, -371515, 682900, 73014, 448824, 635655, 562641, -816044, - -219043, 77309, 113817, 156766, -57982, 38655, -62277, 137439, 12885, -6442, - -81604, -15032, 66572, -21475, 47245, 6728067, 3895535, 2087354, 1043677, 1129576, - 382252, 801011, -148176, -150324, 1932735, 1095217, 897648, 1853278, 1550483, 2115272, - -2948495, 2561948, 708670, 169651, 513249, -178241, -1320703, -940598, 1509681, 682900, - 1234803, 55835, -423054, 901943, -105227, -438087, 912681, 476741, 1340030, 382252, - 891206, -1331440, -803159, 715112, 130997, 768799, 319975, -165356, -354335, -1080184, - 223338, 3599183, -3721589, -766652, -725850, -947040, -199716, -124554, -648540, -586263, - 81604, 94489, -453119, 244813, -1099512, -408022, -113817, 654983, -3953518, -438087, - 912681, -442382, -408022, 296353, 158914, 229781, 1941325, -951335, -511101, -1045825, - -98784, 496069, 921271, -901943, -551903, 942745, -820339, -1398012, -57982, -412317, - 562641, -446677, -292058, 180389, 511101, -874026, 369367, -12895639, -8843338, -3519726, - -4127464, -2224793, -2177549, -1967095, -957778, -2381559, -1962800, -777389, -1535451, -133144, - -575526, -1241246, -1801739, -1913408, -809601, -1080184, -2025077, -188979, -2523293, 81604, - -212601, -270583, -1533303, -182536, -1163936, 88047, -1492501, -861141, 493921, -1002875, - 178241, -2435247, -474594, 1316408, 747324, 42950, -371515, -633508, 204011, 322123, - 1170379, -605590, -111669, -16935056, -1015760, 2276333, -124554, 738734, -208306, 100932, - -1455994, 1535451, 481036, 1829656, 1153199, 3665755, 2540473, 283468, -1511829, -736587, - -429497, 747324, -577673, -3088082, -2942053, -1398012, -536871, 212601, 302795, 659278, - -214748, 169651, 246961, -594853, -191126, -21475, -2052994, 1213328, 369367, -150324, - -124554, -682900, -1187559, 736587, 152471, -646393, 569083, 633508, 717260, 19020262, - 13462575, 2568391, 5246303, 1007170, 1769527, 4161823, 2229088, 599148, 2594160, 959925, - -1073742, -631360, 925565, 1393717, -2546916, -429497, -1516124, 3358665, 1748052, 794569, - 1745904, 783832, 914828, -49392, -141734, -942745, 1370095, 1533303, 1410897, 1636383, - 2119566, 1151051, 3083787, 586263, -161061, 981400, 212601, -648540, -236223, -594853, - -603443, -105227, 1425929, 219043, 231928, 28357522, 12217034, 3543348, 3440269, 2211908, - 1546188, 339302, 214748, 2997887, 732292, 1604170, 2452426, 1116692, -68719, -998580, - 5068062, -584116, -2630668, -1694365, 1324997, -70867, 2746632, 732292, 412317, -633508, - -1157494, -498216, -489626, 1017907, -124554, 332860, 191126, 27917, -566936, 790274, - 3524021, 2025077, 2360085, 1906966, 1769527, 770947, 725850, 227633, 1187559, -1125281, - 743029, 9251360, -9751723, -3111704, -4133906, -3811784, -1876901, -710817, 1511829, -1490354, - 285615, -3768834, 1391569, -1440962, -3171833, 773094, -2224793, -3264175, -2115272, 2929168, - 2428804, -1159641, 1309965, -2186138, 966368, -3901978, 354335, 545461, -491774, -972810, - 955630, -3094524, -1211181, 317828, -893353, -959925, -523986, 182536, 485331, 1462436, - 257698, 2570538, -846109, -773094, -654983, -1346472, -229781, -693637, 543313, -1157494, - -33648920, -17313014, -5978595, -4984310, -5076652, -3453154, -4363687, -3113851, -4765266, -1054415, - -2057289, -727997, 401579, -2203318, -384400, 173946, 206158, -3264175, -1887638, -1554778, - 478889, -4346507, 605590, -2046552, -3549791, 188979, 141734, 126702, 100932, -1449552, - -813896, -81604, -83752, -169651, -1194001, -73014, 584116, 1013612, 637803, -1565516, - 1043677, -1563368, 1200443, -2604898, -1483911, 274878, -1159641, -30065, -296353, -19870666, - 10361609, 4526896, 1501091, 2826089, 367220, 843961, 2241973, 2774549, 1299228, 1881196, - -1492501, -463856, -2248416, 2658585, 384400, 562641, 3335042, 208306, -2493229, 4236985, - -2905546, 425202, 3264175, -949188, 736587, 526134, -244813, -1640678, -577673, 1024350, - 818191, 238371, -783832, 135291, -1387274, 3974992, 156766, -2147, -1720134, -719407, - -1178969, -880468, 1928440, 2074469, -715112, 242666, -326418, 646393, -47245, -103079, - -616328, 506806, 29970282, 12906377, 3287798, 7020124, 3874061, 1831804, 2866891, 2697240, - -139586, 1995012, 2836826, 792421, -146029, 1625645, 4050154, -1329292, -934155, -3236258, - 680752, 3921305, 1449552, 259846, -2340757, -1086627, -1110249, 4112431, 1069447, 2181844, - 994285, -1853278, -3281355, 3562675, 1724429, -2095944, -1230508, 3453154, 2658585, -100932, - 500364, -315680, 1277753, 989990, -556198, 723702, -1428077, -539018, 1602023, -949188, - -985695, 1971390, 1432372, 936303, 88047, 35416300, 7917772, 5744519, 2808909, 2529736, - 1342177, 2607045, 3500398, 5076652, 3427384, -1198296, 4342212, -1005022, 1301375, 719407, - 3697967, 4982162, 3521873, -1110249, 5978595, -1316408, -423054, -3270618, 998580, -1127429, - 1123134, 1342177, -1584843, -2660732, -843961, 249108, -1788854, -871878, 1056562, 1058710, - -2134599, -2192581, -657130, 515396, 139586, 365072, -680752, -259846, -412317, -1020055, - 1080184, -1569811, 1406602, -1668595, -352187, -1333587, 371515, -646393, 3966402, -15631533, - -5216238, -5478231, -3781719, 1144609, -1041530, -3212636, 1799591, 322123, 2248416, -81604, - 122407, -3502546, -2727304, -1522566, -2800319, 429497, -2967823, -5302137, 981400, 854699, - -2660732, -343597, -2420214, 708670, 685047, -225486, -5772436, -1380832, 272730, -397284, - 403727, 1767379, -4123169, -968515, -2602750, 1561221, -384400, 38655, 2579128, -2422362, - -242666, 1093069, -399432, -614180, 1226213, 953483, -1655710, -1687922, -3182571, -191126, - -2439542, -1649268, -1063004, -36771364, -12796855, -7329362, -2153926, -3674345, -373662, -1868311, - -2972117, -3137474, 3992172, 356482, -1825361, -135291, -6356552, -3231963, -3201898, 5291400, - -4423817, -8654359, 549756, 1374390, 515396, -3002182, -1052267, 2168959, -4284230, -133144, - -4361540, -955630, 2173254, -1715839, 410169, 4864051, 339302, -637803, -1258425, 1548336, - 1267015, 1458141, -1503239, 64425, 1333587, 2332167, 1078037, 1005022, -3974992, 1058710, - -309238, -1614908, -846109, 715112, -633508, -1629940, -1413044, -1700807, -24371792, 5499706, - 558346, -3189013, 4595615, -2976412, -1960653, 914828, -3959960, -2675765, -693637, 1524713, - -3088082, 4273493, 281320, -322123, 2274185, 1881196, 3459596, -556198, 4696547, 6281390, - 4866198, 1273458, 4187593, -1511829, 2723009, -3171833, -2843268, -1477469, 547608, 1748052, - -1413044, -3060164, -1361505, -289910, 1926293, -2969970, 2151779, 453119, 1696512, -929860, - -2338610, -3609920, -3848291, 813896, -1889786, 854699, -4095251, -1477469, 2076617, -2933463, - 603443, -2138894, 1447404, -861141, 1408749, 36507, -601295, -328565, -1556926, 16348793, - 27200028, 7788923, 7127498, 9706626, 8010114, 1479616, 6367289, 5514738, 3124589, 11778948, - 2899103, 1926293, 5205501, 4666482, 2570538, 2018635, 1314260, 1885491, -1466731, 5899138, - -1544041, 487479, -1823214, 3700114, 246961, -1075889, 3191161, 3639985, 1370095, 4859756, - -3466039, -5916318, -1267015, -444529, 1303523, -511101, 2544768, -2437394, 2314987, 4883378, - 2183991, -4567698, -893353, 2149631, 912681, -2302103, 3167539, 1110249, 1881196, 1939178, - 2823941, 792421, -775242, 554051, -2536178, -805306, 2370822, 2031520, -1232656, -173946, - 62150324, 6577743, -760209, 4024384, -251256, 5493263, -73014, 1602023, 539018, 5778879, - 2484639, -2141041, 1745904, 2856153, 1305670, -3223373, -7183333, -3064459, -3098819, 1413044, - -4464619, -594853, -416612, 1324997, 7606387, 4466766, 1318555, 3268470, -4964982, -135291, - -2669322, -809601, -2134599, 3066607, -1254131, 5025112, -2381559, -723702, -2641405, -962073, - -3751654, -1529008, 687195, 936303, -332860, 188979, -2123861, 1269163, 3212636, 414464, - -1949915, 2244121, -3111704, 1432372, 1159641, -163209, -1067299, -504659, -277025, -438087, - 2147, -18176302, -21524228, -4054449, -1151051, -923418, -3373697, -1455994, 6603512, 3839701, - 1440962, 1754494, -2791729, -601295, 4982162, -1836099, 8070244, -6234145, -1623498, 6500433, - -1181116, -747324, -3710852, 4453881, 5025112, 79457, 4958540, -1782411, 2250563, -109522, - -2630668, -433792, -2057289, -904091, -1297080, 2690797, -1876901, -470299, -2939905, 2068027, - -1471026, 4509716, -6994354, 2995740, 2598455, -4286378, 214748, -2828236, 893353, -3219078, - 1157494, 1359357, -3968550, -605590, -1355062, -6094559, -3395172, -1681480, -2892661, -648540, - -365072, 343597, -2334315, 358630, -4649302, 1348620, -15807627, -9262097, -12232067, -6468221, - -8123931, -1052267, 8106751, -8441758, 6545530, 3974992, -4398047, 8974334, -1292785, 1660005, - -5785321, -743029, -2488934, -481036, 191126, 2141041, 1249836, 4645007, 9249212, -2553358, - 1413044, -4436701, -4380867, -4121021, 1084479, 3697967, -1163936, -1400159, -1037235, -2886218, - 3326452, -1063004, -34360, -2819646, -1986422, -1896228, -2656437, -300648, 57982, -2456721, - 1758789, -3725884, 1544041, -2181844, -191126, 1286343, -2521146, 3311420, -5634997, -1848983, - 747324, -1758789, -2911988, 1501091, -657130, -3519726, 5950677, 3236258, 1002875, 1090922, - 1367947, 1410897, -2688650, -44233868, -5214091, 3730179, -3388729, 7507603, 3262028, -8841190, - 1075889, 1651415, -3036542, -7385197, -2929168, -1696512, 2005750, 674310, -7103876, -2495376, - -3856881, -6569153, -5789616, -13003013, -6981470, -7546258, -9455371, 7511898, -5098126, 2821794, - 5390184, -3895535, -6463926, -2321430, -1513976, 1619203, 4005057, 2521146, -5385889, -6393059, - 4956393, 3296388, 3886946, 5787469, 661425, 57982, 2074469, -193274, -2686502, 1513976, - -1529008, -803159, 3176128, 8585640, -3002182, -4221953, 1812476, -2684355, -435939, 4417374, - -8617852, -109522, -2965675, -470299, -367220, 21475, -1196148, 1632088, -2705830, 2976412, - 35465692, 31089120, 8304320, 18932216, 5115306, 10930692, -1868311, -1653562, 5164698, 7198365, - 3670050, -12253542, -4204773, 7726646, 8540542, -3150359, -4312147, 1449552, 3470334, 4136054, - 463856, -6373732, -13911399, -5145371, 7352984, -646393, 7552700, -1812476, -2626373, 1571958, - -6575595, -3702262, -3904125, 7071664, -9004399, -6083821, 1385127, 1466731, -2476049, -294205, - -2740189, 2626373, 3382287, 3070902, 6753836, 4037269, -115964, -5746666, 5134634, -545461, - 2729452, -2834679, 1821066, 4211216, -916976, -1185411, -2937758, -3204046, 1651415, 384400, - 2443837, -2778844, 1982127, 5478231, -1471026, -3068754, 3532611, 42874512, 8293582, -8686571, - 7264937, 4294968, -7902740, -2089502, 4443144, -8590, 1614908, -923418, -1425929, -9281424, - -8536248, 3665755, 8632884, 8358007, -8199093, -17467632, 2712272, -519691, -6599218, -9051644, - -1245541, 4153234, -2725157, 6287832, 10806138, -4170413, -3105261, -1644973, -1226213, -2272038, - -15708843, 8158291, 7973607, -511101, 5265630, -5072357, -1200443, -4625680, 6818261, 6721624, - 1125281, -1913408, -2162516, 3678640, 1290638, -2422362, -3697967, -146029, 3792456, -5347235, - -2851858, -2965675, 1260573, 1537598, -6163278, 3225521, 7614977, -5995775, 313533, -1503239, - -624918, -111669, 1112397, 360777, -2175401, -4823249, -3189013, -1346472, 3453154, -1782411, - -11559904, -8029442, 1378685, 10460393, -10496900, 7415261, 3764539, 1434519, 2450279, 1610613, - 7249905, 11074573, 579821, 3176128, 1526861, -9949292, -8553427, 8400956, 1451699, -10264972, - 6212670, -8791798, 1702955, 10333691, -380105, -3085934, 12337294, 1675037, 1123134, 790274, - 663572, 893353, -4986457, 2987150, 5166846, 7761006, -5989332, -3302830, 1556926, 934155, - -2566243, -5862631, 3972845, -2237678, 2888366, 1200443, -1638530, -1986422, 1163936, 3478924, - -2385854, -1335735, -251256, 1958505, -5403069, -2800319, 3055869, 478889, -1567663, -1088774, - 2811056, -46250356, -42674796, -9397388, -19821274, -17190606, -9902047, -2843268, -7447474, -8727374, - 5952825, 1758789, -2128156, 10271414, 3655017, 12317966, 9363029, 2877628, 3728032, 4610648, - -18663780, 8967892, -1464584, -3753802, -3506841, -10825465, -3418794, -3620658, 10591389, -3328600, - -6313602, -2931315, 1707250, -1155346, -2080912, 2570538, -2757369, -1574106, 6530498, -6101001, - -491774, -1795296, 11729556, 4894115, 4748087, -8688719, 790274, 8263517, -4080219, 2199023, - 167504, 2241973, 193274, 981400, -455267, 5405217, -489626, -1329292, 3895535, -2293513, - 2289218, 4778151, -1840394, -2729452, 1627793, 2050847, -3049427, -1002875, -28578712, 60851096, - 38912404, 11899207, 4176856, 3749507, 4752382, 6408091, 6440304, 12496207, 26328150, 987843, - 3335042, 5149666, 5688684, 6167573, -4475356, 24665998, 18303004, -17242146, 12702366, 1748052, - -2345052, 5499706, 15554224, -14836965, -3732327, 586263, -11523397, -8669391, -8147553, 16698833, - -444529, -3697967, 2617783, 319975, -4857608, -14549202, 9942849, 7198365, -2055142, 3605625, - 10179072, -7279970, 5675800, -169651, -2282775, 7050189, 6944962, 779537, 1183264, -4295, - 5641440, 6745246, 341450, -2229088, 201863, -3294240, 5589900, 180389, -1876901, -3629247, - -1657857, 3008625, 2153926, 8080981, -2473901, 2108829, -1726577, 66080220, -23081154, -23330262, - 10735271, 2216203, -8385924, -8012262, -11860552, -12416750, -8516920, -7834021, 11297911, 2199023, - 1623498, -6607807, -5158256, -19816980, 261993, -8065949, -13086765, 10750303, 7677254, 1904818, - 7146826, 1537598, -2087354, -4707284, -113817, -4045859, 5875516, 9131100, -9895605, -4146791, - 375810, 4788889, 13449690, 3551938, 17955110, -9532680, 5804649, 14353781, 8914205, -7810398, - -2005750, 1286343, -3571265, 5948530, -822486, -83752, 9607842, 4737349, 1664300, 457414, - -92342, -4402342, 19327, 700080, -4123169, -2843268, 4297115, -2083059, -7947837, -1625645, - 324270, -1855426, -8308614, 1715839, 1778117, 1625645, 2379412, -2229088, -3455301, 21154862, - 40677636, 15741055, 11012296, 12513387, -3541201, 3897683, -11413876, 19950124, 8074539, 19146964, - 5918465, 7166153, -17534204, 21839908, 32800666, 3932043, 21296596, -4479651, -17102560, -17261474, - 15631533, -5248450, 12487617, 2048699, 5037997, -9790378, 9659381, -3607773, -3393024, 15592879, - 11057393, -8600672, 14845554, 1382980, 2712272, -3279208, -11196980, 2813204, 809601, -6532646, - -7084549, 6242735, 9163313, 2699387, -3315715, 4015795, 270583, 9463960, -6017249, -1217623, - -9871982, 773094, 9408126, 6043019, -4587025, -425202, 3176128, -9068823, -852551, -6335077, - -3519726, 1372242, 2035815, 5375152, -7116761, 2499671, -8175470, 208306, 9416716, 2931315, - 1554778, -785979, -46746424, -3139621, -10103911, 12884902, -9637907, 10511932, 938450, 8327942, - -616328, 7118909, -23021024, 6438156, -2138894, -9034464, 4806069, -10885595, 7033009, -10975789, - -4866198, -23654532, 13868449, 27288074, -10200547, -4153234, -2465311, -5010080, 4949950, 5053029, - 8783208, -21051782, 6904160, -13277891, -2914135, -1157494, 11345156, 3579855, -4520453, 1788854, - 3058017, 7118909, 8536248, -13286481, -3395172, 1428077, -8514773, -8783208, -708670, -6390912, - 3440269, 6775311, 1883343, 833224, -753767, 6296422, 19071802, 9807558, -10123238, 1836099, - 5132486, -5920613, 7438884, 1243393, -6027987, -1103807, 9285719, 423054, 8982924, -10982231, - -1215476, 5774584, 1602023, -86215024, -33268816, 18285824, 5682242, -10524817, 11656541, 10801843, - 15597174, -3324305, -7825431, 14841259, -94489, -9000104, 18657338, -21124796, -28995324, -12773233, - -15906411, 10471130, 13503377, 227633, 2922725, 23025320, 9133248, -22243636, -11072426, -13488345, - 3401614, -20639466, -19260780, -618475, 2033667, -7599945, -9691594, -12412455, -7554848, -11327976, - -12438225, -3882651, 96637, -3766686, -1599875, -7524783, -2168959, -5675800, -14409615, 29450590, - 1363652, 7264937, -12869870, 8070244, -1812476, 4294968, -10602127, -45097, -2669322, -7591355, - -6120329, -3309272, 8227010, 7159711, 6120329, 4833986, 4406637, -1136019, -1297080, -6682969, - -2707977, -206158, -2068027, 9008694, 809601, 5291400, -1559073, 45941116, 16316581, 37072012, - 5342940, 2836826, -15141907, 5995775, 21489868, 8602819, 1108102, 15077483, -13709536, -5587753, - 11474005, -8843338, 3637837, 21388938, 6227703, 3148211, 6148246, -3592740, 8579197, -6738804, - -382252, 3805341, 586263, -5181878, -6472516, 2471754, 21041044, -6861211, 4666482, -19879256, - -11452530, 9302899, 22127672, -17480516, -654983, 11134703, 1954210, 4282083, -15412490, -5025112, - -13469017, -21966610, -6734509, -12217034, -13883482, 10441065, 3180423, 3586298, -8596377, -4675072, - -2587718, -21210696, -3115999, 11763915, -9567040, 9399536, 18285824, 2836826, 11622182, 8377334, - -657130, -4071629, 9749576, -14368813, -2250563, -1037235, 7211250, 4148939, 6320045, 54580444, - -11403138, -17766132, 3451006, 11944304, 11070278, 9798968, -2379412, 10619307, 4279935, -14403173, - -26499948, 17366700, 5555540, 12320114, 8516920, -8096014, 3839701, -11280732, -17154100, 17579302, - -10945724, -23014582, 2950643, -4537633, 3315715, -3124589, -1668595, -6556268, -8214125, 5564130, - 15446850, -22527104, 21597244, -19222126, -23310934, 1316408, 6856916, -14448270, 11035918, -2931315, - 7142531, -12614319, -5334350, 18618684, 8431021, 18848464, 5647882, 416612, 6661495, -1172526, - 1032940, 9302899, -665720, 687195, -9120363, -7526930, -5377299, 6148246, -7172596, -7410966, - 11860552, -1604170, 13187697, 743029, -9923522, 14587856, 12010876, -2370822, 7507603, -9547712, - -14235669, 3715147, -6169721, -11119670, 45996952, 56846040, -9049496, 682900, -28829968, -2896956, - -21163452, -15212774, -5392332, -10322954, 15541339, 274878, 11937862, -26278758, 21560736, -16475495, - 22011708, 1015760, 17358110, -6262063, 21996676, 7589207, -11282879, 4913443, -16587164, 10767483, - -9513353, 25492778, 6953552, 16778290, -28374702, -15811922, -7453916, -14001593, -6549825, -9584220, - 221191, 34312492, -16552804, 17237852, 28348932, 4088809, 12043088, 115964, -7275675, -13651554, - -11132555, 1335735, -8274255, 17411798, -12197707, 7879118, 20379620, -2993592, -2632815, -1932735, - 16456167, 18500572, 4941360, -9021579, -8613557, -4954245, 6324340, -17594334, 2168959, -3539053, - -5854041, -277025, 10151155, 412317, 14759655, 14008036, 1417339, 2658585, -8860518, -44989784, - -38506528, 16593606, -4305705, 20742544, -11456825, -11224897, -13868449, -13146895, -4722317, -35794256, - -11875585, 12311524, 19531364, 6627135, -23375360, -7980049, -10799695, 9148280, 35835060, 18472654, - 9356586, 214748, 3438121, 642098, 6925635, 16915728, 2226941, 3545496, -9564892, -390842, - -14048838, 4522601, 7941395, 11815455, 2409477, -10258529, -3796751, 15934329, -7344394, 5162551, - 4211216, 4879083, 22722524, -13685913, -17991618, 5564130, 16365973, 2682207, 16344498, 17343078, - 9723806, 11523397, 5656472, 1221918, 10965052, 29792040, -16902844, -1700807, 5748814, 1056562, - -12994424, -4196183, 11027329, -2031520, -11602854, 2918430, 23383950, -20560008, 6631430, -19658066, - 10778220, 4745939, 3496104, -1475321, -89096952, -30457760, -2456721, -8366597, -22320946, 13831942, - 17368848, 30560840, 9429601, 19393924, -18010946, -36567352, 16812650, -8269960, 487479, -19462644, - 19194208, -11300059, -1359357, 18730352, -50968376, 5357972, 25877178, -48576080, -13376676, -16904992, - 1975685, 2297808, 11613592, -13174812, 15526307, 2731599, -26091926, -12796855, 2680060, -2847563, - -13093208, 11660836, 29568702, 6826851, 7945690, -4372277, -7758859, 17864916, 2884071, -8360154, - -43246024, -6453189, 5149666, -21408264, 10088878, 9156870, 1507534, -16494822, -15270756, -17630840, - 38373384, 10524817, -6043019, 7730941, -32918776, 4082367, -15448997, -17439714, 17008070, -2761664, - 208306, -11014444, -40965400, 5585605, 12605729, 7209103, -2710124, 24230058, 1395864, 1361505, - 93802088, 23882166, 24013162, 20796232, -6281390, 968515, 96409128, 28067612, -8317204, 59191092, - -33474976, 24743306, 4821101, 15141907, 23764054, -7406671, -17255032, 18242874, -3734474, -58387932, - 14489072, 15146202, 11899207, 27786290, 17126182, 18122614, -16965120, 3569118, -16423955, -8366597, - 16752520, 5650030, -34677564, -20474110, -29184302, -42679092, -7148973, 8622147, 20119774, 17768280, - 14766098, 12773233, -7015829, 22048214, 11632919, -27303108, -11138998, 6987912, 19585050, 240518, - 3554086, 35654672, -7314330, -3304977, -10226317, -2141041, 17338782, -15891379, -738734, -22355304, - -20703890, -12809740, 21889300, 31441308, -10363756, 2448131, -7359427, -19617264, -14673756, 5312875, - -24238648, -5471789, -7780334, -13398150, 94725504, 57475252, 3066607, 36816460, 26394722, 8731669, - 40422084, 12564927, -1215476, -12028056, -10655814, -26205742, -74474736, -4632122, 5976447, -24249386, - -15448997, -2059437, 50002008, 17501992, -14521284, 1236951, 2299955, -6650757, 20308752, -2985002, - -14615774, -8450348, -13881334, 8686571, -19795504, -44465796, -375810, -22975928, -37853696, 7632157, - 14254996, 23259396, 11351599, 20598664, -15283641, -38418484, -26858578, -34565896, 12105365, 32974612, - 25312390, 17635136, 30988190, 992137, 18702436, 44418552, -38427072, 6629282, -18348100, 98784, - 10907069, 13052406, 19666656, -2224793, -46785080, -35055524, 5450314, -10374494, -14828375, -9345849, - -11959336, -31776316, 438087, 19333796, -4655745, 13773960, -12193412, -3955665, -4840428, 21904334, - -46355584, 4574140, -35094176, 15066745, -68305016, -3137474, -21586506, -37224480, 66129612, 35330400, - -21315922, -59023588, -12917114, -22183506, -48829484, 38386272, 3951370, -35944580, -11108933, 19327352, - -31168578, -23398982, -15388868, -40067748, -12985834, -1554778, -29624536, -29517162, 42651172, -15760382, - -10350871, -4337917, -6700149, 33833604, -35691180, -18300856, 10531260, -10593537, 2516851, -9030169, - 22473416, -36447092, 15588584, -58014272, 8686571, -16716013, -20160576, 60513940, 9300752, -22475564, - 14665166, 12693776, -45749992, 34074124, -4958540, -10344429, -257698, 19726784, -4509716, 1282048, - -19711752, 13312251, 19782620, 28007482, -19503446, -59543280, 46473692, -3674345, 21902186, 22162032, - -7829726, 13883482, 36088464, -37209448, -88989576, -53206056, 13743895, -34765612, 6251325, -25765508, - -9822590, -36702644, -21343840, 15032386, 53629108, 51593296, 10924249, 35731980, -23901494, 64136748, - 51133732, -41143640, -32579474, 8714489, 13348758, 53861036, 22771916, 33661808, -10559177, 12118250, - -4883378, -8317204, -9474698, 50203872, 25935160, 47987668, 48120812, 6474663, -234076, -24539296, - 24522116, -4947803, -43490840, -32981054, -6236293, -26096222, -2785286, -26766236, -18895708, 12154757, - -3934190, -17832704, 40969692, 42857332, -23437636, -11117523, 64340756, 22728966, -39505108, -43922484, - -12268574, 13076028, 727997, -10290742, -27279484, 22688164, 10548440, -12496207, 9790378, 4123169, - -34432752, -19370302, 6287832, -17231408, -15367393, -23036058, 53027812, -43602508, -33277406, -34456376, - -51299088, -43548820, -676457, -34220152, -44671956, 11690901, -4146791, -61544732, 43785044, 8136816, - -4127464, 22256520, 67647880, 65277060, 27631672, -79345224, 29149944, 21371758, -78434696, -843961, - -38104948, -18051748, 39711268, -46956876, 26914412, 204011, -8615704, -16666621, 7584912, -3738769, - 12979391, -8914205, -42329052, 40718436, 18618684, 48717816, -5660767, -16258599, -24122684, 19767586, - -21829172, 57447336, 11398843, 34507916, -45423576, 35624608, 633508, 12584254, -29811368, 9689446, - -35306780, -5542656, -36247376, 14304389, 23504208, -47167332, 882616, -38968240, 17008070, 22499186, - 21051782, -3498251, -67703720, -429497, 16035260, -6425271, 27805618, -64392296, 14315126, -27573690, - 6165426, -23929410, 1670742, 14201309, 94399088, 116943368, 47382080, 41519448, -67832568, 65386584, - 92223688, -100860864, 11190537, 67381592, 10516227, -120480272, -13140452, -64815352, 20349556, 25492778, - -31733366, -10728828, 21238614, -54535348, -5409512, -20514912, -28394028, 12322261, -43314744, 47113644, - 31621696, 60544008, -30169998, 11190537, -7292855, -22497038, 73637216, 163209, -35231616, -14534169, - 15189152, -14328011, -20448340, -21120502, 36996848, 15940771, 51784420, -1816771, 18378166, 71199824, - -44878112, 11261404, -30805652, 57082264, -22587234, 27958090, 9852655, 188979, -21889300, -36612448, - -27575838, 13675176, 48451528, -43883828, 40630392, 52525304, 23566486, 61106648, -29710436, -19514184, - 36137856, -2690797, -8759586, -49115100, -5383742, -39191576, 6637872, 61510376, 24157044, 21169894, - 18854906, }, + 962073, -1997160, 1969243, -977105, 848256, -12885, 942745, -57982, 1020055, -1251983, + -590558, 594853, -846109, -141734, -1324997, -92342, -489626, 2634963, 1251983, -1604170, + 62277, 657130, -60130, -371515, 682900, 73014, 448824, 635655, 562641, -816044, + -219043, 77309, 113817, 156766, -57982, 38655, -62277, 137439, 12885, -6442, + -81604, -15032, 66572, -21475, 47245, 6728067, 3895535, 2087354, 1043677, 1129576, + 382252, 801011, -148176, -150324, 1932735, 1095217, 897648, 1853278, 1550483, 2115272, + -2948495, 2561948, 708670, 169651, 513249, -178241, -1320703, -940598, 1509681, 682900, + 1234803, 55835, -423054, 901943, -105227, -438087, 912681, 476741, 1340030, 382252, + 891206, -1331440, -803159, 715112, 130997, 768799, 319975, -165356, -354335, -1080184, + 223338, 3599183, -3721589, -766652, -725850, -947040, -199716, -124554, -648540, -586263, + 81604, 94489, -453119, 244813, -1099512, -408022, -113817, 654983, -3953518, -438087, + 912681, -442382, -408022, 296353, 158914, 229781, 1941325, -951335, -511101, -1045825, + -98784, 496069, 921271, -901943, -551903, 942745, -820339, -1398012, -57982, -412317, + 562641, -446677, -292058, 180389, 511101, -874026, 369367, -12895639, -8843338, -3519726, + -4127464, -2224793, -2177549, -1967095, -957778, -2381559, -1962800, -777389, -1535451, -133144, + -575526, -1241246, -1801739, -1913408, -809601, -1080184, -2025077, -188979, -2523293, 81604, + -212601, -270583, -1533303, -182536, -1163936, 88047, -1492501, -861141, 493921, -1002875, + 178241, -2435247, -474594, 1316408, 747324, 42950, -371515, -633508, 204011, 322123, + 1170379, -605590, -111669, -16935056, -1015760, 2276333, -124554, 738734, -208306, 100932, + -1455994, 1535451, 481036, 1829656, 1153199, 3665755, 2540473, 283468, -1511829, -736587, + -429497, 747324, -577673, -3088082, -2942053, -1398012, -536871, 212601, 302795, 659278, + -214748, 169651, 246961, -594853, -191126, -21475, -2052994, 1213328, 369367, -150324, + -124554, -682900, -1187559, 736587, 152471, -646393, 569083, 633508, 717260, 19020262, + 13462575, 2568391, 5246303, 1007170, 1769527, 4161823, 2229088, 599148, 2594160, 959925, + -1073742, -631360, 925565, 1393717, -2546916, -429497, -1516124, 3358665, 1748052, 794569, + 1745904, 783832, 914828, -49392, -141734, -942745, 1370095, 1533303, 1410897, 1636383, + 2119566, 1151051, 3083787, 586263, -161061, 981400, 212601, -648540, -236223, -594853, + -603443, -105227, 1425929, 219043, 231928, 28357522, 12217034, 3543348, 3440269, 2211908, + 1546188, 339302, 214748, 2997887, 732292, 1604170, 2452426, 1116692, -68719, -998580, + 5068062, -584116, -2630668, -1694365, 1324997, -70867, 2746632, 732292, 412317, -633508, + -1157494, -498216, -489626, 1017907, -124554, 332860, 191126, 27917, -566936, 790274, + 3524021, 2025077, 2360085, 1906966, 1769527, 770947, 725850, 227633, 1187559, -1125281, + 743029, 9251360, -9751723, -3111704, -4133906, -3811784, -1876901, -710817, 1511829, -1490354, + 285615, -3768834, 1391569, -1440962, -3171833, 773094, -2224793, -3264175, -2115272, 2929168, + 2428804, -1159641, 1309965, -2186138, 966368, -3901978, 354335, 545461, -491774, -972810, + 955630, -3094524, -1211181, 317828, -893353, -959925, -523986, 182536, 485331, 1462436, + 257698, 2570538, -846109, -773094, -654983, -1346472, -229781, -693637, 543313, -1157494, + -33648920, -17313014, -5978595, -4984310, -5076652, -3453154, -4363687, -3113851, -4765266, -1054415, + -2057289, -727997, 401579, -2203318, -384400, 173946, 206158, -3264175, -1887638, -1554778, + 478889, -4346507, 605590, -2046552, -3549791, 188979, 141734, 126702, 100932, -1449552, + -813896, -81604, -83752, -169651, -1194001, -73014, 584116, 1013612, 637803, -1565516, + 1043677, -1563368, 1200443, -2604898, -1483911, 274878, -1159641, -30065, -296353, -19870666, + 10361609, 4526896, 1501091, 2826089, 367220, 843961, 2241973, 2774549, 1299228, 1881196, + -1492501, -463856, -2248416, 2658585, 384400, 562641, 3335042, 208306, -2493229, 4236985, + -2905546, 425202, 3264175, -949188, 736587, 526134, -244813, -1640678, -577673, 1024350, + 818191, 238371, -783832, 135291, -1387274, 3974992, 156766, -2147, -1720134, -719407, + -1178969, -880468, 1928440, 2074469, -715112, 242666, -326418, 646393, -47245, -103079, + -616328, 506806, 29970282, 12906377, 3287798, 7020124, 3874061, 1831804, 2866891, 2697240, + -139586, 1995012, 2836826, 792421, -146029, 1625645, 4050154, -1329292, -934155, -3236258, + 680752, 3921305, 1449552, 259846, -2340757, -1086627, -1110249, 4112431, 1069447, 2181844, + 994285, -1853278, -3281355, 3562675, 1724429, -2095944, -1230508, 3453154, 2658585, -100932, + 500364, -315680, 1277753, 989990, -556198, 723702, -1428077, -539018, 1602023, -949188, + -985695, 1971390, 1432372, 936303, 88047, 35416300, 7917772, 5744519, 2808909, 2529736, + 1342177, 2607045, 3500398, 5076652, 3427384, -1198296, 4342212, -1005022, 1301375, 719407, + 3697967, 4982162, 3521873, -1110249, 5978595, -1316408, -423054, -3270618, 998580, -1127429, + 1123134, 1342177, -1584843, -2660732, -843961, 249108, -1788854, -871878, 1056562, 1058710, + -2134599, -2192581, -657130, 515396, 139586, 365072, -680752, -259846, -412317, -1020055, + 1080184, -1569811, 1406602, -1668595, -352187, -1333587, 371515, -646393, 3966402, -15631533, + -5216238, -5478231, -3781719, 1144609, -1041530, -3212636, 1799591, 322123, 2248416, -81604, + 122407, -3502546, -2727304, -1522566, -2800319, 429497, -2967823, -5302137, 981400, 854699, + -2660732, -343597, -2420214, 708670, 685047, -225486, -5772436, -1380832, 272730, -397284, + 403727, 1767379, -4123169, -968515, -2602750, 1561221, -384400, 38655, 2579128, -2422362, + -242666, 1093069, -399432, -614180, 1226213, 953483, -1655710, -1687922, -3182571, -191126, + -2439542, -1649268, -1063004, -36771364, -12796855, -7329362, -2153926, -3674345, -373662, -1868311, + -2972117, -3137474, 3992172, 356482, -1825361, -135291, -6356552, -3231963, -3201898, 5291400, + -4423817, -8654359, 549756, 1374390, 515396, -3002182, -1052267, 2168959, -4284230, -133144, + -4361540, -955630, 2173254, -1715839, 410169, 4864051, 339302, -637803, -1258425, 1548336, + 1267015, 1458141, -1503239, 64425, 1333587, 2332167, 1078037, 1005022, -3974992, 1058710, + -309238, -1614908, -846109, 715112, -633508, -1629940, -1413044, -1700807, -24371792, 5499706, + 558346, -3189013, 4595615, -2976412, -1960653, 914828, -3959960, -2675765, -693637, 1524713, + -3088082, 4273493, 281320, -322123, 2274185, 1881196, 3459596, -556198, 4696547, 6281390, + 4866198, 1273458, 4187593, -1511829, 2723009, -3171833, -2843268, -1477469, 547608, 1748052, + -1413044, -3060164, -1361505, -289910, 1926293, -2969970, 2151779, 453119, 1696512, -929860, + -2338610, -3609920, -3848291, 813896, -1889786, 854699, -4095251, -1477469, 2076617, -2933463, + 603443, -2138894, 1447404, -861141, 1408749, 36507, -601295, -328565, -1556926, 16348793, + 27200028, 7788923, 7127498, 9706626, 8010114, 1479616, 6367289, 5514738, 3124589, 11778948, + 2899103, 1926293, 5205501, 4666482, 2570538, 2018635, 1314260, 1885491, -1466731, 5899138, + -1544041, 487479, -1823214, 3700114, 246961, -1075889, 3191161, 3639985, 1370095, 4859756, + -3466039, -5916318, -1267015, -444529, 1303523, -511101, 2544768, -2437394, 2314987, 4883378, + 2183991, -4567698, -893353, 2149631, 912681, -2302103, 3167539, 1110249, 1881196, 1939178, + 2823941, 792421, -775242, 554051, -2536178, -805306, 2370822, 2031520, -1232656, -173946, + 62150324, 6577743, -760209, 4024384, -251256, 5493263, -73014, 1602023, 539018, 5778879, + 2484639, -2141041, 1745904, 2856153, 1305670, -3223373, -7183333, -3064459, -3098819, 1413044, + -4464619, -594853, -416612, 1324997, 7606387, 4466766, 1318555, 3268470, -4964982, -135291, + -2669322, -809601, -2134599, 3066607, -1254131, 5025112, -2381559, -723702, -2641405, -962073, + -3751654, -1529008, 687195, 936303, -332860, 188979, -2123861, 1269163, 3212636, 414464, + -1949915, 2244121, -3111704, 1432372, 1159641, -163209, -1067299, -504659, -277025, -438087, + 2147, -18176302, -21524228, -4054449, -1151051, -923418, -3373697, -1455994, 6603512, 3839701, + 1440962, 1754494, -2791729, -601295, 4982162, -1836099, 8070244, -6234145, -1623498, 6500433, + -1181116, -747324, -3710852, 4453881, 5025112, 79457, 4958540, -1782411, 2250563, -109522, + -2630668, -433792, -2057289, -904091, -1297080, 2690797, -1876901, -470299, -2939905, 2068027, + -1471026, 4509716, -6994354, 2995740, 2598455, -4286378, 214748, -2828236, 893353, -3219078, + 1157494, 1359357, -3968550, -605590, -1355062, -6094559, -3395172, -1681480, -2892661, -648540, + -365072, 343597, -2334315, 358630, -4649302, 1348620, -15807627, -9262097, -12232067, -6468221, + -8123931, -1052267, 8106751, -8441758, 6545530, 3974992, -4398047, 8974334, -1292785, 1660005, + -5785321, -743029, -2488934, -481036, 191126, 2141041, 1249836, 4645007, 9249212, -2553358, + 1413044, -4436701, -4380867, -4121021, 1084479, 3697967, -1163936, -1400159, -1037235, -2886218, + 3326452, -1063004, -34360, -2819646, -1986422, -1896228, -2656437, -300648, 57982, -2456721, + 1758789, -3725884, 1544041, -2181844, -191126, 1286343, -2521146, 3311420, -5634997, -1848983, + 747324, -1758789, -2911988, 1501091, -657130, -3519726, 5950677, 3236258, 1002875, 1090922, + 1367947, 1410897, -2688650, -44233868, -5214091, 3730179, -3388729, 7507603, 3262028, -8841190, + 1075889, 1651415, -3036542, -7385197, -2929168, -1696512, 2005750, 674310, -7103876, -2495376, + -3856881, -6569153, -5789616, -13003013, -6981470, -7546258, -9455371, 7511898, -5098126, 2821794, + 5390184, -3895535, -6463926, -2321430, -1513976, 1619203, 4005057, 2521146, -5385889, -6393059, + 4956393, 3296388, 3886946, 5787469, 661425, 57982, 2074469, -193274, -2686502, 1513976, + -1529008, -803159, 3176128, 8585640, -3002182, -4221953, 1812476, -2684355, -435939, 4417374, + -8617852, -109522, -2965675, -470299, -367220, 21475, -1196148, 1632088, -2705830, 2976412, + 35465692, 31089120, 8304320, 18932216, 5115306, 10930692, -1868311, -1653562, 5164698, 7198365, + 3670050, -12253542, -4204773, 7726646, 8540542, -3150359, -4312147, 1449552, 3470334, 4136054, + 463856, -6373732, -13911399, -5145371, 7352984, -646393, 7552700, -1812476, -2626373, 1571958, + -6575595, -3702262, -3904125, 7071664, -9004399, -6083821, 1385127, 1466731, -2476049, -294205, + -2740189, 2626373, 3382287, 3070902, 6753836, 4037269, -115964, -5746666, 5134634, -545461, + 2729452, -2834679, 1821066, 4211216, -916976, -1185411, -2937758, -3204046, 1651415, 384400, + 2443837, -2778844, 1982127, 5478231, -1471026, -3068754, 3532611, 42874512, 8293582, -8686571, + 7264937, 4294968, -7902740, -2089502, 4443144, -8590, 1614908, -923418, -1425929, -9281424, + -8536248, 3665755, 8632884, 8358007, -8199093, -17467632, 2712272, -519691, -6599218, -9051644, + -1245541, 4153234, -2725157, 6287832, 10806138, -4170413, -3105261, -1644973, -1226213, -2272038, + -15708843, 8158291, 7973607, -511101, 5265630, -5072357, -1200443, -4625680, 6818261, 6721624, + 1125281, -1913408, -2162516, 3678640, 1290638, -2422362, -3697967, -146029, 3792456, -5347235, + -2851858, -2965675, 1260573, 1537598, -6163278, 3225521, 7614977, -5995775, 313533, -1503239, + -624918, -111669, 1112397, 360777, -2175401, -4823249, -3189013, -1346472, 3453154, -1782411, + -11559904, -8029442, 1378685, 10460393, -10496900, 7415261, 3764539, 1434519, 2450279, 1610613, + 7249905, 11074573, 579821, 3176128, 1526861, -9949292, -8553427, 8400956, 1451699, -10264972, + 6212670, -8791798, 1702955, 10333691, -380105, -3085934, 12337294, 1675037, 1123134, 790274, + 663572, 893353, -4986457, 2987150, 5166846, 7761006, -5989332, -3302830, 1556926, 934155, + -2566243, -5862631, 3972845, -2237678, 2888366, 1200443, -1638530, -1986422, 1163936, 3478924, + -2385854, -1335735, -251256, 1958505, -5403069, -2800319, 3055869, 478889, -1567663, -1088774, + 2811056, -46250356, -42674796, -9397388, -19821274, -17190606, -9902047, -2843268, -7447474, -8727374, + 5952825, 1758789, -2128156, 10271414, 3655017, 12317966, 9363029, 2877628, 3728032, 4610648, + -18663780, 8967892, -1464584, -3753802, -3506841, -10825465, -3418794, -3620658, 10591389, -3328600, + -6313602, -2931315, 1707250, -1155346, -2080912, 2570538, -2757369, -1574106, 6530498, -6101001, + -491774, -1795296, 11729556, 4894115, 4748087, -8688719, 790274, 8263517, -4080219, 2199023, + 167504, 2241973, 193274, 981400, -455267, 5405217, -489626, -1329292, 3895535, -2293513, + 2289218, 4778151, -1840394, -2729452, 1627793, 2050847, -3049427, -1002875, -28578712, 60851096, + 38912404, 11899207, 4176856, 3749507, 4752382, 6408091, 6440304, 12496207, 26328150, 987843, + 3335042, 5149666, 5688684, 6167573, -4475356, 24665998, 18303004, -17242146, 12702366, 1748052, + -2345052, 5499706, 15554224, -14836965, -3732327, 586263, -11523397, -8669391, -8147553, 16698833, + -444529, -3697967, 2617783, 319975, -4857608, -14549202, 9942849, 7198365, -2055142, 3605625, + 10179072, -7279970, 5675800, -169651, -2282775, 7050189, 6944962, 779537, 1183264, -4295, + 5641440, 6745246, 341450, -2229088, 201863, -3294240, 5589900, 180389, -1876901, -3629247, + -1657857, 3008625, 2153926, 8080981, -2473901, 2108829, -1726577, 66080220, -23081154, -23330262, + 10735271, 2216203, -8385924, -8012262, -11860552, -12416750, -8516920, -7834021, 11297911, 2199023, + 1623498, -6607807, -5158256, -19816980, 261993, -8065949, -13086765, 10750303, 7677254, 1904818, + 7146826, 1537598, -2087354, -4707284, -113817, -4045859, 5875516, 9131100, -9895605, -4146791, + 375810, 4788889, 13449690, 3551938, 17955110, -9532680, 5804649, 14353781, 8914205, -7810398, + -2005750, 1286343, -3571265, 5948530, -822486, -83752, 9607842, 4737349, 1664300, 457414, + -92342, -4402342, 19327, 700080, -4123169, -2843268, 4297115, -2083059, -7947837, -1625645, + 324270, -1855426, -8308614, 1715839, 1778117, 1625645, 2379412, -2229088, -3455301, 21154862, + 40677636, 15741055, 11012296, 12513387, -3541201, 3897683, -11413876, 19950124, 8074539, 19146964, + 5918465, 7166153, -17534204, 21839908, 32800666, 3932043, 21296596, -4479651, -17102560, -17261474, + 15631533, -5248450, 12487617, 2048699, 5037997, -9790378, 9659381, -3607773, -3393024, 15592879, + 11057393, -8600672, 14845554, 1382980, 2712272, -3279208, -11196980, 2813204, 809601, -6532646, + -7084549, 6242735, 9163313, 2699387, -3315715, 4015795, 270583, 9463960, -6017249, -1217623, + -9871982, 773094, 9408126, 6043019, -4587025, -425202, 3176128, -9068823, -852551, -6335077, + -3519726, 1372242, 2035815, 5375152, -7116761, 2499671, -8175470, 208306, 9416716, 2931315, + 1554778, -785979, -46746424, -3139621, -10103911, 12884902, -9637907, 10511932, 938450, 8327942, + -616328, 7118909, -23021024, 6438156, -2138894, -9034464, 4806069, -10885595, 7033009, -10975789, + -4866198, -23654532, 13868449, 27288074, -10200547, -4153234, -2465311, -5010080, 4949950, 5053029, + 8783208, -21051782, 6904160, -13277891, -2914135, -1157494, 11345156, 3579855, -4520453, 1788854, + 3058017, 7118909, 8536248, -13286481, -3395172, 1428077, -8514773, -8783208, -708670, -6390912, + 3440269, 6775311, 1883343, 833224, -753767, 6296422, 19071802, 9807558, -10123238, 1836099, + 5132486, -5920613, 7438884, 1243393, -6027987, -1103807, 9285719, 423054, 8982924, -10982231, + -1215476, 5774584, 1602023, -86215024, -33268816, 18285824, 5682242, -10524817, 11656541, 10801843, + 15597174, -3324305, -7825431, 14841259, -94489, -9000104, 18657338, -21124796, -28995324, -12773233, + -15906411, 10471130, 13503377, 227633, 2922725, 23025320, 9133248, -22243636, -11072426, -13488345, + 3401614, -20639466, -19260780, -618475, 2033667, -7599945, -9691594, -12412455, -7554848, -11327976, + -12438225, -3882651, 96637, -3766686, -1599875, -7524783, -2168959, -5675800, -14409615, 29450590, + 1363652, 7264937, -12869870, 8070244, -1812476, 4294968, -10602127, -45097, -2669322, -7591355, + -6120329, -3309272, 8227010, 7159711, 6120329, 4833986, 4406637, -1136019, -1297080, -6682969, + -2707977, -206158, -2068027, 9008694, 809601, 5291400, -1559073, 45941116, 16316581, 37072012, + 5342940, 2836826, -15141907, 5995775, 21489868, 8602819, 1108102, 15077483, -13709536, -5587753, + 11474005, -8843338, 3637837, 21388938, 6227703, 3148211, 6148246, -3592740, 8579197, -6738804, + -382252, 3805341, 586263, -5181878, -6472516, 2471754, 21041044, -6861211, 4666482, -19879256, + -11452530, 9302899, 22127672, -17480516, -654983, 11134703, 1954210, 4282083, -15412490, -5025112, + -13469017, -21966610, -6734509, -12217034, -13883482, 10441065, 3180423, 3586298, -8596377, -4675072, + -2587718, -21210696, -3115999, 11763915, -9567040, 9399536, 18285824, 2836826, 11622182, 8377334, + -657130, -4071629, 9749576, -14368813, -2250563, -1037235, 7211250, 4148939, 6320045, 54580444, + -11403138, -17766132, 3451006, 11944304, 11070278, 9798968, -2379412, 10619307, 4279935, -14403173, + -26499948, 17366700, 5555540, 12320114, 8516920, -8096014, 3839701, -11280732, -17154100, 17579302, + -10945724, -23014582, 2950643, -4537633, 3315715, -3124589, -1668595, -6556268, -8214125, 5564130, + 15446850, -22527104, 21597244, -19222126, -23310934, 1316408, 6856916, -14448270, 11035918, -2931315, + 7142531, -12614319, -5334350, 18618684, 8431021, 18848464, 5647882, 416612, 6661495, -1172526, + 1032940, 9302899, -665720, 687195, -9120363, -7526930, -5377299, 6148246, -7172596, -7410966, + 11860552, -1604170, 13187697, 743029, -9923522, 14587856, 12010876, -2370822, 7507603, -9547712, + -14235669, 3715147, -6169721, -11119670, 45996952, 56846040, -9049496, 682900, -28829968, -2896956, + -21163452, -15212774, -5392332, -10322954, 15541339, 274878, 11937862, -26278758, 21560736, -16475495, + 22011708, 1015760, 17358110, -6262063, 21996676, 7589207, -11282879, 4913443, -16587164, 10767483, + -9513353, 25492778, 6953552, 16778290, -28374702, -15811922, -7453916, -14001593, -6549825, -9584220, + 221191, 34312492, -16552804, 17237852, 28348932, 4088809, 12043088, 115964, -7275675, -13651554, + -11132555, 1335735, -8274255, 17411798, -12197707, 7879118, 20379620, -2993592, -2632815, -1932735, + 16456167, 18500572, 4941360, -9021579, -8613557, -4954245, 6324340, -17594334, 2168959, -3539053, + -5854041, -277025, 10151155, 412317, 14759655, 14008036, 1417339, 2658585, -8860518, -44989784, + -38506528, 16593606, -4305705, 20742544, -11456825, -11224897, -13868449, -13146895, -4722317, -35794256, + -11875585, 12311524, 19531364, 6627135, -23375360, -7980049, -10799695, 9148280, 35835060, 18472654, + 9356586, 214748, 3438121, 642098, 6925635, 16915728, 2226941, 3545496, -9564892, -390842, + -14048838, 4522601, 7941395, 11815455, 2409477, -10258529, -3796751, 15934329, -7344394, 5162551, + 4211216, 4879083, 22722524, -13685913, -17991618, 5564130, 16365973, 2682207, 16344498, 17343078, + 9723806, 11523397, 5656472, 1221918, 10965052, 29792040, -16902844, -1700807, 5748814, 1056562, + -12994424, -4196183, 11027329, -2031520, -11602854, 2918430, 23383950, -20560008, 6631430, -19658066, + 10778220, 4745939, 3496104, -1475321, -89096952, -30457760, -2456721, -8366597, -22320946, 13831942, + 17368848, 30560840, 9429601, 19393924, -18010946, -36567352, 16812650, -8269960, 487479, -19462644, + 19194208, -11300059, -1359357, 18730352, -50968376, 5357972, 25877178, -48576080, -13376676, -16904992, + 1975685, 2297808, 11613592, -13174812, 15526307, 2731599, -26091926, -12796855, 2680060, -2847563, + -13093208, 11660836, 29568702, 6826851, 7945690, -4372277, -7758859, 17864916, 2884071, -8360154, + -43246024, -6453189, 5149666, -21408264, 10088878, 9156870, 1507534, -16494822, -15270756, -17630840, + 38373384, 10524817, -6043019, 7730941, -32918776, 4082367, -15448997, -17439714, 17008070, -2761664, + 208306, -11014444, -40965400, 5585605, 12605729, 7209103, -2710124, 24230058, 1395864, 1361505, + 93802088, 23882166, 24013162, 20796232, -6281390, 968515, 96409128, 28067612, -8317204, 59191092, + -33474976, 24743306, 4821101, 15141907, 23764054, -7406671, -17255032, 18242874, -3734474, -58387932, + 14489072, 15146202, 11899207, 27786290, 17126182, 18122614, -16965120, 3569118, -16423955, -8366597, + 16752520, 5650030, -34677564, -20474110, -29184302, -42679092, -7148973, 8622147, 20119774, 17768280, + 14766098, 12773233, -7015829, 22048214, 11632919, -27303108, -11138998, 6987912, 19585050, 240518, + 3554086, 35654672, -7314330, -3304977, -10226317, -2141041, 17338782, -15891379, -738734, -22355304, + -20703890, -12809740, 21889300, 31441308, -10363756, 2448131, -7359427, -19617264, -14673756, 5312875, + -24238648, -5471789, -7780334, -13398150, 94725504, 57475252, 3066607, 36816460, 26394722, 8731669, + 40422084, 12564927, -1215476, -12028056, -10655814, -26205742, -74474736, -4632122, 5976447, -24249386, + -15448997, -2059437, 50002008, 17501992, -14521284, 1236951, 2299955, -6650757, 20308752, -2985002, + -14615774, -8450348, -13881334, 8686571, -19795504, -44465796, -375810, -22975928, -37853696, 7632157, + 14254996, 23259396, 11351599, 20598664, -15283641, -38418484, -26858578, -34565896, 12105365, 32974612, + 25312390, 17635136, 30988190, 992137, 18702436, 44418552, -38427072, 6629282, -18348100, 98784, + 10907069, 13052406, 19666656, -2224793, -46785080, -35055524, 5450314, -10374494, -14828375, -9345849, + -11959336, -31776316, 438087, 19333796, -4655745, 13773960, -12193412, -3955665, -4840428, 21904334, + -46355584, 4574140, -35094176, 15066745, -68305016, -3137474, -21586506, -37224480, 66129612, 35330400, + -21315922, -59023588, -12917114, -22183506, -48829484, 38386272, 3951370, -35944580, -11108933, 19327352, + -31168578, -23398982, -15388868, -40067748, -12985834, -1554778, -29624536, -29517162, 42651172, -15760382, + -10350871, -4337917, -6700149, 33833604, -35691180, -18300856, 10531260, -10593537, 2516851, -9030169, + 22473416, -36447092, 15588584, -58014272, 8686571, -16716013, -20160576, 60513940, 9300752, -22475564, + 14665166, 12693776, -45749992, 34074124, -4958540, -10344429, -257698, 19726784, -4509716, 1282048, + -19711752, 13312251, 19782620, 28007482, -19503446, -59543280, 46473692, -3674345, 21902186, 22162032, + -7829726, 13883482, 36088464, -37209448, -88989576, -53206056, 13743895, -34765612, 6251325, -25765508, + -9822590, -36702644, -21343840, 15032386, 53629108, 51593296, 10924249, 35731980, -23901494, 64136748, + 51133732, -41143640, -32579474, 8714489, 13348758, 53861036, 22771916, 33661808, -10559177, 12118250, + -4883378, -8317204, -9474698, 50203872, 25935160, 47987668, 48120812, 6474663, -234076, -24539296, + 24522116, -4947803, -43490840, -32981054, -6236293, -26096222, -2785286, -26766236, -18895708, 12154757, + -3934190, -17832704, 40969692, 42857332, -23437636, -11117523, 64340756, 22728966, -39505108, -43922484, + -12268574, 13076028, 727997, -10290742, -27279484, 22688164, 10548440, -12496207, 9790378, 4123169, + -34432752, -19370302, 6287832, -17231408, -15367393, -23036058, 53027812, -43602508, -33277406, -34456376, + -51299088, -43548820, -676457, -34220152, -44671956, 11690901, -4146791, -61544732, 43785044, 8136816, + -4127464, 22256520, 67647880, 65277060, 27631672, -79345224, 29149944, 21371758, -78434696, -843961, + -38104948, -18051748, 39711268, -46956876, 26914412, 204011, -8615704, -16666621, 7584912, -3738769, + 12979391, -8914205, -42329052, 40718436, 18618684, 48717816, -5660767, -16258599, -24122684, 19767586, + -21829172, 57447336, 11398843, 34507916, -45423576, 35624608, 633508, 12584254, -29811368, 9689446, + -35306780, -5542656, -36247376, 14304389, 23504208, -47167332, 882616, -38968240, 17008070, 22499186, + 21051782, -3498251, -67703720, -429497, 16035260, -6425271, 27805618, -64392296, 14315126, -27573690, + 6165426, -23929410, 1670742, 14201309, 94399088, 116943368, 47382080, 41519448, -67832568, 65386584, + 92223688, -100860864, 11190537, 67381592, 10516227, -120480272, -13140452, -64815352, 20349556, 25492778, + -31733366, -10728828, 21238614, -54535348, -5409512, -20514912, -28394028, 12322261, -43314744, 47113644, + 31621696, 60544008, -30169998, 11190537, -7292855, -22497038, 73637216, 163209, -35231616, -14534169, + 15189152, -14328011, -20448340, -21120502, 36996848, 15940771, 51784420, -1816771, 18378166, 71199824, + -44878112, 11261404, -30805652, 57082264, -22587234, 27958090, 9852655, 188979, -21889300, -36612448, + -27575838, 13675176, 48451528, -43883828, 40630392, 52525304, 23566486, 61106648, -29710436, -19514184, + 36137856, -2690797, -8759586, -49115100, -5383742, -39191576, 6637872, 61510376, 24157044, 21169894, + 18854906, }, { -11117523, - 365072, -2740189, 2707977, -1516124, -457414, 828929, 1941325, -371515, 1939178, 813896, - 642098, -96637, -139586, 294205, 208306, -979253, -515396, -1848983, 839666, -577673, - -77309, 1911261, 717260, 251256, 261993, 545461, 21475, -326418, -12885, -204011, - -133144, -566936, -302795, -178241, -137439, 103079, 143881, 2147, 4295, 2147, - -77309, -34360, 49392, 178241, -60130, 7786776, 4277788, 2156074, 2637110, 1483911, - 2231236, 4514011, 259846, 128849, -470299, -1114544, 2342905, 27917, -165356, 2486786, - -962073, -1153199, 687195, 249108, 1069447, 259846, 410169, 1123134, -751619, 753767, - -223338, -165356, -564788, 380105, 1490354, 790274, 938450, 785979, -94489, 612033, - 882616, -362925, 745177, -1251983, 1565516, -629213, 466004, 83752, 225486, -300648, - -279173, 3910568, -4475356, -603443, -818191, -1116692, 732292, -2229088, 760209, -53687, - 1020055, 886911, -1758789, -629213, 2699387, -283468, 581968, -500364, 1178969, 2469606, - 2862596, 485331, 1239098, -40802, -2244121, -66572, 253403, -485331, 17180, 1245541, - -1284195, -1735167, 768799, -837519, -766652, -1215476, -42950, 1288490, 332860, -373662, - -453119, -504659, 4295, 292058, -676457, 261993, -773094, -11222750, -7986492, -3886946, - -2942053, -2239826, -2321430, -785979, -1715839, -517544, -1080184, -2763812, 528281, 1438814, - -238371, 828929, -543313, -1421634, -1451699, -2156074, -749472, 545461, 57982, -1202591, - 820339, -1458141, -1464584, 985695, -6442, 75162, 768799, 899796, 229781, -309238, - -435939, -545461, 296353, 182536, -766652, 442382, -1522566, -624918, -375810, -124554, - -1084479, -184684, -397284, -15927886, -2181844, 1271310, 199716, 1202591, 88047, -841814, - 541166, -639950, -790274, -1393717, -1245541, 616328, -489626, 1056562, -1022202, 53687, - -989990, 337155, 1580548, -388695, 1163936, 103079, -1151051, -188979, 1428077, 773094, - 912681, 1118839, -1574106, 1067299, -667867, -92342, -869731, -360777, 403727, 695785, - 311385, -337155, 1140314, 1056562, 571231, -322123, -809601, 139586, -674310, 18796924, - 14995878, 3528316, 6719477, 1597728, 5199058, 3624953, 1131724, 3648575, 1481764, 2759517, - 1215476, -1035087, 2800319, 1943473, -755914, -279173, -5188321, -586263, 270583, 3139621, - 365072, 92342, 1619203, 96637, 1462436, 1312113, 219043, -141734, 515396, 2126009, - 1657857, 1357210, -137439, -594853, 90194, 962073, -380105, -148176, 1118839, 326418, - -558346, -73014, 236223, -1151051, 1374390, 33066954, 12139725, 5832566, 3498251, 2091649, - 2158221, 1999307, 3397319, 801011, 5529771, 727997, 517544, 2340757, -1282048, 541166, - -569083, -622770, -914828, 3517578, 1958505, -317828, 2701535, -1883343, -474594, -680752, - 4168266, -414464, 1494649, 307090, 2037962, 332860, -616328, 1052267, 1391569, -667867, - 487479, 549756, 362925, 826781, -289910, 951335, 865436, -2703682, 569083, 289910, - 491774, 12685186, -9378061, -3302830, -4333622, -2714419, -2570538, 1733019, -1464584, -3927748, - -970663, -5220533, -1209033, -2278480, -4980015, -1282048, 1136019, -3171833, -1045825, 474594, - -3515431, -173946, 4069482, 895501, 590558, -1879048, 83752, 1404454, 36507, -1726577, - -1806034, 1853278, -158914, -2426657, 231928, -1035087, 2959233, -92342, 1335735, -483184, - 2559801, -1685775, 1028645, 337155, 603443, 27917, 659278, -73014, -813896, 1556926, - -34866544, -19722490, -4026532, -4915590, -3371549, -4297115, -6058052, -556198, 169651, -1778117, - 1524713, -1649268, 264141, -169651, -1977833, -2192581, -3453154, -1209033, 3435974, -3246995, - -345745, 3096672, 1997160, -489626, 1163936, -453119, -3330747, -1672890, -2727304, -936303, - 163209, -691490, 1636383, -2946348, -2289218, -92342, -2817499, -2211908, -1977833, -2347200, - 2523293, -725850, -2963528, -957778, 882616, 944893, -962073, -1533303, -633508, -21388938, - 12277164, 4599910, 2007897, 2102387, 1868311, 934155, -2297808, 603443, -1372242, -395137, - 3816079, 2345052, 3283503, 3380139, 3468186, -2905546, 1455994, 3753802, 586263, 3268470, - -3880503, 730144, -996432, -261993, -1468879, 1380832, -526134, 55835, 3377992, -3515431, - -1090922, 1335735, 1930588, -921271, 1602023, -1395864, -2342905, 2735894, -1406602, -124554, - -805306, 1026497, -390842, 1254131, -1406602, -530428, -1279900, -352187, -1127429, 2029372, - 141734, 644245, 31810676, 13035226, 2753074, 7258495, 5677947, 1103807, 2536178, 6863358, - 3126736, -167504, 1464584, 850404, -1017907, 1960653, 5892695, 1378685, 7033009, 3414499, - -5811091, 1080184, 195421, 1187559, 5186173, 2920578, 2080912, -468151, -826781, -715112, - -895501, 798864, -1157494, 1720134, 502511, 2345052, -500364, -618475, 843961, 1911261, - 1026497, -225486, -2572686, -1090922, -1440962, 2257005, 1619203, 2549063, 1391569, 367220, - 337155, 2175401, 1705102, 1421634, 199716, 35540856, 10196252, 4436701, 5555540, 906238, - 5366562, -880468, -2059437, -126702, 1370095, 558346, -176094, 1005022, 5465346, -822486, - -3438121, -2418067, 2639258, 657130, 3077344, 4879083, 4277788, -317828, 2845416, -3143916, - 326418, -2450279, 3279208, 1857573, -3738769, 2134599, -1788854, 223338, -1449552, 2158221, - -1398012, 2716567, 2177549, 1735167, 3539053, 1116692, -96637, -923418, -15032, 429497, - 3917010, -163209, 77309, 223338, 1881196, 1213328, 118112, -551903, 4879083, -15094663, - -6171868, -2422362, -3487514, -1541893, -1329292, 264141, 2143189, -2177549, -4112431, 3852586, - -4937065, -4649302, -880468, -1052267, 2115272, -1294933, -122407, -4490389, -2723009, -5426691, - -6021544, -6637872, -947040, 1591285, -4685810, -1217623, 646393, 539018, 182536, -562641, - -4645007, -2836826, 1990717, 818191, -1099512, 4419522, -2952790, -1273458, 1069447, 2727304, - 2168959, -335007, -687195, 1101659, 622770, -2789581, 234076, -1617055, -783832, 270583, - -1178969, 210453, 1902671, -38590280, -12219182, -7247758, -3081639, -5199058, -4249870, -1178969, - -3049427, -1191853, -4052302, -5342940, -3917010, -1264868, -8048769, -1859721, -3309272, -4793184, - -654983, 889058, 2546916, -2780991, -4052302, -1421634, 3219078, 4262755, 5104569, 2823941, - -204011, -2493229, -1221918, 88047, -3208341, 1374390, 2070174, 2753074, -1896228, -1505386, - -1529008, -659278, -687195, -1037235, 2016487, -543313, 1279900, -2602750, -4696547, -1874753, - -251256, 2385854, -4078072, 1393717, -1999307, 1947768, -2035815, 1189706, -22192096, 5914170, - 1644973, 23622, 3891240, -3728032, 1000727, -8577050, -2787434, 2989297, 2119566, 5538361, - -399432, 6043019, -3515431, -880468, 2894808, -5244155, -1921998, -3081639, 5894843, -362925, - -4868346, 2467459, 4702989, -4159676, -3171833, -3743064, 1099512, -861141, 2037962, -1421634, - -1181116, -989990, -2267743, 3341485, -2660732, 665720, 2192581, -249108, 2531883, -1432372, - 5523328, 854699, -534723, -1896228, -1894081, 118112, -2181844, -2649995, -1647120, 472446, - 1906966, -214748, 545461, -2293513, -2319282, -3285650, -1297080, -1002875, -841814, 19284404, - 27455578, 9573482, 9472550, 13121125, 9350144, -1267015, 1801739, -972810, 1685775, 1647120, - 2325725, 1808181, 4627828, 1833951, 2869038, 944893, 9206262, 2194728, 4471061, 2710124, - 2306398, 7327214, 1644973, 9171903, 4647155, -1870458, 6373732, 1681480, 3085934, 6448894, - 1209033, 3822521, -2080912, -710817, 1702955, 2860448, -4080219, 3322157, -2420214, -4367982, - -2675765, 3478924, 5186173, 3957812, -936303, 1209033, 1065152, 1885491, 2628520, 1490354, - 2985002, 1788854, -3240553, -236223, 2012192, 2911988, 687195, 822486, 294205, -3240553, - 65925600, 5252745, -3618510, 5581310, -3852586, 7745974, 2001455, 8121783, -4138201, 1005022, - -219043, 4984310, -8604967, 1898376, 5113159, -869731, -1488206, 7174743, 10606422, -4256313, - -2772402, 1591285, 5117454, -2126009, 3238405, 444529, -3751654, -2649995, -3040837, 2568391, - 3053722, 4075924, -2987150, 4468914, -2959233, 4348655, 3431679, -670015, -2682207, 1672890, - -4161823, -5267778, 1000727, -3517578, 1324997, 661425, 377957, 2632815, -264141, 3137474, - -30065, -3493956, 1273458, -710817, 1565516, -2482491, -777389, 695785, 1668595, -1241246, - -5001490, -22578644, -21897890, -4969277, 1720134, -974958, -3283503, -3571265, -4868346, -1303523, - 3657165, -1174674, -1198296, -5033702, 5357972, -296353, -4322885, -3749507, 9266392, -8315057, - 921271, 6137509, -654983, 1045825, -7975755, 2613488, -3373697, 1977833, -5510443, -3599183, - 1011465, 1554778, -2514703, -2856153, 384400, -1118839, 515396, -3332895, -1814624, 3682935, - -259846, -1569811, -874026, 4672925, 2162516, -2465311, -3801046, -3375844, 1355062, -390842, - -1490354, 543313, 942745, -1765232, 5611375, 3115999, -350040, -227633, -1181116, 854699, - -1337882, -1359357, -1372242, -92342, -2787434, -2190433, -8562017, -7838316, -8819715, -6783901, - -4501126, -3423089, 966368, -332860, -2040110, -1153199, 2422362, 7630010, -6605660, 3210488, - -2044404, -4559108, 5802501, -704375, 1357210, 7065221, 1333587, 2847563, -4312147, -1303523, - -13045963, -1735167, 2789581, 1434519, 1423782, 1140314, 2147484, -3158949, -3710852, 2843268, - -68719, 2677912, 1733019, -3710852, 3182571, -487479, -9152575, -7965017, -1015760, -7546258, - 1247688, 2106682, -210453, -2078764, -551903, 141734, -1874753, -869731, -133144, -1466731, - 2579128, 423054, 1047972, -1507534, -663572, 3440269, 1239098, -2538326, 2798171, -768799, - -1404454, -4015795, 373662, -43033424, -9859097, 678605, -8604967, 3502546, 818191, 10378788, - -4872641, 661425, -2877628, 6972880, -14162655, -13507672, 5677947, -6521908, 10159745, 3736622, - -8222715, -14306536, -358630, -4013647, -6994354, -2806761, 1612760, 2372970, -3388729, 12337294, - 635655, -1172526, -5160403, 4232691, 4636417, 5063767, 5373004, -618475, -3206193, -1159641, - 3173981, -201863, 3835406, -3569118, -1432372, -1196148, 4449586, 3624953, -3906273, 5113159, - -2821794, -3481071, 438087, -1556926, -3345780, 3502546, -3957812, -483184, 1026497, -916976, - -1593433, 949188, 3354370, -2020782, 3225521, -2598455, 2188286, -1428077, -1586990, -1000727, - 39582420, 34628172, 7333657, 9193377, -1775969, 11252814, 9159018, 11332271, -408022, 4494684, - 2813204, -10819023, -9023726, 4885526, 1022202, -7782481, -8072391, -4640712, 560493, 4496831, - 1382980, 10735271, 9936407, 4226248, -2265595, -2523293, 6577743, 6019397, 500364, 5254893, - -1730872, 6749541, 388695, -1612760, 9560597, 4844723, 7836168, 4928475, 1711545, 5362267, - 2750927, 1767379, 5072357, -2937758, 992137, 6616397, -103079, -4514011, 3981435, 3831111, - 2815351, -3227668, -124554, 3773129, 5884105, -3148211, 7121056, 8025147, -1490354, -4627828, - 691490, 1694365, 1200443, 3403762, -96637, 1086627, 2692945, 47699908, 4131759, -1578401, - 3609920, 2091649, -7630010, 1836099, 2366527, -212601, 5334350, 7106024, 11186242, -5106716, - -4724464, -7960722, -6034429, 6854768, -324270, 9994389, -2224793, -2692945, 4443144, 8656507, - 3755949, -9124658, 7284265, -2815351, 5871221, -3154654, 4608500, -5579163, 3519726, -642098, - 5364414, 414464, 3152506, 1370095, -8819715, -5179731, -627065, -2035815, -635655, -3023657, - 4567698, 1449552, 9519795, -1647120, -6176163, -3923453, -446677, 350040, -6904160, 2183991, - -2231236, -526134, -513249, -4352950, 3938485, 6998649, -2115272, 3493956, 1005022, -4271345, - -253403, -4082367, -3092377, 408022, 6474663, 657130, -2619930, -6438156, 1879048, -2372970, - 13840532, -3317862, -13215614, -8948564, -11916387, 11001559, -8804683, 2424509, 13453985, -612033, - -13666586, 916976, -14347338, 11927124, -4168266, 11884175, 70867, -4556961, 10237055, 358630, - 2121714, -7730941, -9740986, -1591285, 3418794, 2065879, -1909113, -4520453, 4518306, -1417339, - 3371549, 5175436, 6309307, 2892661, 3483219, -12859132, 1052267, -2942053, -4404489, 1722282, - 6335077, -5392332, -9878425, -4385162, 2856153, 1088774, -8690866, -3564823, 3998615, 5871221, - -5246303, -3420942, -4054449, 6010807, 7965017, 1591285, -2763812, 880468, 5675800, -2780991, - -309238, -48593260, -48730700, -8177618, -23753316, -15133317, -8257075, -13550622, -1348620, 9833328, - -21678848, 7808251, -4206921, 7112466, 1561221, 4286378, -8802535, 2119566, -828929, -4937065, - -19819126, -4286378, -10142565, -12983686, -996432, 3066607, 1030792, -4518306, 3148211, -4290673, - -856846, 10546292, 150324, -3706557, 1056562, 6861211, 9805410, 6171868, 416612, 4909148, - 6240588, -687195, 491774, -10574209, 4292820, -8750996, 2078764, 8239895, -5267778, -10563472, - 3513283, -5961415, -5111011, 1080184, 433792, -5035849, 2946348, -1245541, 11834782, 6277095, - 4022237, 1342177, 4726612, -457414, 1853278, -4483946, -7372312, -1348620, -28321014, 52971980, - 42309724, 2179696, 8914205, 2942053, 9670119, 13720273, 3607773, 13299366, 2830384, -14980846, - 9983651, 11117523, 3764539, 2967823, 8993662, 10924249, -11154030, 9012989, -5763846, 7842611, - 1516124, -7494718, 1589138, 8916352, 5604933, -11828340, 5662915, -5179731, 16550656, -1952063, - 3992172, -3105261, -10406706, 10048076, 10711648, 4443144, 2806761, -1088774, 3899830, 10664404, - 2697240, 7436736, 1060857, 4962835, 3085934, -1406602, 6113886, -8061654, -11512660, -5738077, - -8808978, -8123931, -3876208, -8338679, 10170483, 6579890, 762357, -2566243, -3824669, -1947768, - -468151, -672162, 261993, 670015, 1853278, 420907, -571231, 70796096, -27270894, -15923591, - 3332895, -899796, -2806761, -20605106, -7750269, 4329327, -231928, -3590593, -3158949, 2310693, - -15605764, -5415954, 9210557, 15154792, 9399536, 6380174, -4376572, -5596343, -8686571, 10204842, - -14763950, -3476776, 4550518, -10980084, 4054449, 3599183, 13172665, -19849192, -897648, -1138166, - -3238405, 4254165, -16943646, -10022306, 20128364, 11963631, 3360812, -4166118, 12298639, -4239133, - -811749, 1312113, 9764608, 4367982, -4924180, 322123, -2592013, 6556268, -11209865, -6249178, - -6521908, -8480413, 15234249, 3075197, 2486786, -7355132, 141734, -3120294, -1887638, -7690139, - 1765232, -7350837, 410169, 1228361, 6296422, -10666551, -6017249, -9532680, -1904818, 20927228, - 49261128, 7705172, 18992346, 16535624, 16501264, 5065914, 12412455, 7106024, -3199751, -10286447, - -6002217, -3227668, 14160507, -12204150, -12809740, -1271310, -298500, -5744519, -9740986, 29278792, - 28162100, 20579336, 1324997, -12375948, 2418067, 1576253, -5677947, 6405944, 4666482, 11538430, - 1685775, 4445291, -277025, -8695161, 13859859, 10780368, 8405251, -2422362, -10462540, 165356, - -530428, -3513283, -21672404, 15305116, -9713069, 17712446, 1344325, 9309342, -1791001, 10301479, - 16849156, 2692945, -7170448, -1196148, 3352222, -6122476, 3231963, -2821794, -6693707, -4589173, - 2639258, -2495376, 7279970, 1612760, -11377368, -165356, -1245541, -13619341, -2596308, 1464584, - -4425964, 4791036, -51077900, -7121056, -31714038, 70867, 5965710, -11156178, -18399640, -21940840, - -20201378, -12429635, -16404628, -4365835, -781684, -4582730, 5744519, -3584150, 1464584, 12914967, - 6287832, -1529008, 31505732, -7052337, 6633577, -4763119, 3021510, 4312147, 2076617, -1943473, - 5001490, 14383845, 4829691, 4982162, 2089502, 5660767, 12773233, 16799764, 5811091, 20429012, - -5014375, -17877802, 18429704, -5811091, -3242700, -3728032, 10677289, 15618649, 12414603, -392990, - -3498251, -9073118, -22329534, 14070313, 16685948, 11321534, -13037373, 8267812, 2832531, -1382980, - 13728863, 2218351, 9500468, -7213398, 5076652, -8972187, 2147, 7969312, -1346472, 6068789, - -216896, -3085934, -2091649, -89446992, -40851580, 18799072, -3985730, -2581275, 2727304, -10758893, - -10359461, -2871186, -4928475, -15229954, 10657961, 1741609, 23053236, -12607876, -11735998, -18687402, - -11205570, -19252190, 1170379, 7801808, -30000346, 19628000, 15972983, -1778117, 2843268, 13005161, - 1417339, 11523397, -22821308, -21942988, -12923557, -14171245, -11793980, 37164352, 11510512, -7404524, - -13507672, -18051748, 8484708, 5699422, -9257802, 7986492, 6833293, -12485470, 871878, 3676492, - 10037339, -11501922, 29746944, -12406013, -10844792, 5499706, -3560528, 665720, -9365176, -2559801, - 654983, 20014548, -6197638, 28486370, 5645735, 2776696, 2888366, 8390219, -8407398, -1883343, - -10947872, -7625715, -8317204, 1211181, 14989436, -8321499, 14164802, 45481556, 23308788, 14493367, - 9756018, -16043850, 1488206, -13020193, 20059644, -2302103, -2877628, 6736656, 4230543, 4531191, - -858993, 6927782, 2291365, 7295002, -6526203, 19501300, 2319282, -2087354, 58875412, 2907693, - -4941360, -15522012, 8373039, -14493367, 12741020, 31505732, -3025805, 7368017, 7307887, -16913582, - -18981608, 34360, -251256, 13475460, -9773198, -75162, -1696512, 9715216, 9869835, 17126182, - 5866926, 5478231, 6498286, 25770, 10808285, 4707284, -22561464, 3826816, -12156905, -28546500, - -3485366, 6929930, -1007170, 1417339, -4902705, -401579, -2183991, -1118839, 2115272, -399432, - 11160473, -8604967, -2744484, 1389422, 970663, -730144, -6672232, 7623567, 12848395, 64939904, - -17733920, -9070971, -16385300, 31821412, 14020921, 1041530, 8467528, -6637872, -6174016, 10060961, - 2744484, -13391708, 4657892, -17111150, -9975062, -1011465, -13911399, 330712, 6710887, -13282186, - -18577882, 122407, 2718714, 11871290, 24096914, 13838385, -8905615, -1995012, 15579994, 23643794, - -25061134, 8216273, -3380139, -2308545, -10546292, -18998788, 3094524, 13471165, 6154688, 4971425, - 11353746, -2987150, 8141111, -3474629, 6302865, 7909183, -16136192, -14450417, 29379724, -4189741, - 848256, -8269960, 12788265, 33822868, 10726681, 3365107, 13413183, -11491185, -8832600, -2065879, - -6085969, -22625888, 15148350, -405874, -8239895, 3524021, 5177583, -7943542, -7419556, 10945724, - -2089502, -17703856, 10000831, 5209796, 56446608, 54350664, -18019536, 15131170, 3955665, 11836930, - 28421946, -3169686, -15614354, -4913443, 55338508, -31035434, -6517613, -15210627, -13030931, -25110526, - 27367532, -7743826, -38568808, -28005334, -35257388, -13005161, 30075508, -3375844, 13857712, -5164698, - -16320876, 13926431, 3384434, 17553532, -17364552, 15627239, 11572789, 6517613, 6427419, -27111982, - 7159711, -22621592, 18556406, 40913860, 11078868, 12382391, -26684632, 36610300, 9004399, -3706557, - -6427419, -7337952, 10642929, 18292266, 3633542, -4230543, -1879048, 4928475, -9655086, -6350109, - -9330816, -6633577, -1539746, 13260712, -9803263, 19834158, 6337224, 12040941, -4995047, -28870770, - -20036022, 7020124, 1148904, -8888435, 9949292, -953483, -1606318, 5242008, -4413079, -54438712, - -30958124, 6826851, 5201206, -1099512, -22477712, 13204877, 8989367, -14890652, -37336152, 30771294, - 8927090, 11078868, 19056770, 9938554, -3717294, 5257040, -8308614, 25673168, -20274394, -37986840, - 289910, -2207613, -16234976, -41137196, 2948495, -8624294, -19739670, -12010876, -4915590, 9030169, - 3420942, 14959371, 32018982, -12777528, -22804128, 7894150, -792421, 435939, 14512694, -17405354, - -13793287, -1898376, 16902844, -18695992, 18326626, -5046587, 33137820, -3837553, -6893423, -2987150, - 2961380, 6818261, -32040456, 5845451, -27206470, 31830002, 3300682, 20413980, 14882062, -10739566, - 1937030, -14482630, 11345156, -367220, 9957882, 7258495, -16733193, -1561221, -15723875, -7110319, - 13651554, -4183298, -7185481, 7984344, -71092448, -37263136, -9431748, -11400991, 747324, 4638565, - -22769770, -21683142, 9850507, -24820616, 9833328, -27236536, -4514011, -26456998, -25082610, 26480620, - 15311558, 1221918, 1204738, -27788438, -38583840, 17454748, -51535312, 16460462, 3777424, -20800526, - 5832566, -14192719, 7129646, 34589520, -16157667, -5439576, -38010460, 28774134, -6569153, 11196980, - -11482595, -8319352, -392990, -5080947, 22009560, 2982855, 42659764, 44126492, -2072322, -2954938, - -12848395, -1939178, -3206193, 3695819, 18165564, -1926293, 37512244, 5914170, -9880572, 1582696, - 10146860, -3809636, 560493, -3015067, 29280940, -23791972, -36483600, -20532092, 3650722, 4883378, - 9966472, 15264314, 1151051, 3682935, -6792491, -20959440, -18668076, -22988812, 5126044, -8121783, - 95328944, 41304700, 29965986, 11192685, -9964324, -18107582, -28716152, 15410343, 29029684, 10711648, - -12496207, 32373316, 19503446, 32341104, 2967823, -25179246, -8684424, 49020608, -51623360, -11841225, - 35227320, -21607980, -10853382, 79746808, -9528385, 21945136, 73959336, -12979391, -4230543, -3382287, - 9698036, -5336497, 32373316, 19155554, 26772678, -19885698, -42780020, 15955804, -16552804, 19417548, - -7582765, 6124624, 31419834, 16421807, 2342905, 12079596, 6798933, 11536282, 30399778, 15247134, - -2634963, 27399744, 12732431, 2467459, 7490423, 51750060, 32686848, -1705102, 29787746, -14675903, - 37538016, -11059541, 8890582, -12406013, 5272073, 19091130, -10722386, -2944200, -919123, 5121749, - 2269890, -16172699, 2499671, -14392435, 121090160, 55967720, -25567940, 11506217, 62139588, 2325725, - 44626856, -12534862, 17115444, 38764228, -29469918, 4275640, 65302832, 60273424, 47502340, 17905718, - 40666896, 7797513, 35534412, 13503377, 10118943, -22000970, -27661736, -37276020, -76300096, 24792698, - -23622, -19711752, -8130373, 26830660, -18053896, -1855426, 2025077, 15393163, -67718752, -10086731, - 47556024, 38036232, -14405320, 25363930, 20145544, 14353781, -9101036, -14841259, -7651484, -9764608, - -7668664, -24000278, -21865678, 17779018, -42513732, 14450417, 33264522, -9451076, -25239376, -37280316, - 34748432, -418759, -18837726, -11042361, -9047349, -12281459, 6685117, -5224828, -14033806, 14385993, - 54668492, -26746908, -17401060, 8190503, -11474005, 14141180, -152471, 30322470, 4870493, 2873333, - -47568912, -14100378, -57322780, -13275744, -57307748, 27120570, -54597624, 28948080, -9038759, -32669668, - -9159018, -15710990, 67927056, 9676561, -48681308, 137439, -31651762, -26130582, 33644628, -38356204, - -34284576, -40020504, 59214716, -8821863, 39200168, -60786672, -31580894, 22870700, -27582280, 21745420, - 65429532, 41781440, 40583144, 5877663, -6646462, -32669668, -44708464, -3487514, 10232760, -42769284, - 1129576, -25692494, 12255689, 17224966, -47476568, -41689100, -74519832, -12919262, 5302137, -33386928, - -46044196, 44208100, 2467459, 45406396, 46011984, -7022272, -6352257, -20055350, 26598732, 21464100, - 3453154, 9833328, -3586298, -3874061, 22589380, -7460358, -25930866, -21708912, -32590212, -29280940, - -9586367, -2800319, -3343632, -43121472, -83951576, -12571369, 5564130, -6008659, -1597728, 23837068, - -19980188, 21339546, 16967268, -11497627, 23564338, -33812132, 42359116, 31776316, -392990, -31082678, - 670015, 22971632, -98152888, 21311628, 37179384, -67529768, 26257282, -33947420, -52654152, -44762148, - 21206402, -10247792, -74038792, 39827232, 18348100, -42256036, -75000864, 15891379, 6143951, -21704618, - -7773891, -36185100, 32527934, 30103426, 48417168, -39769248, 3927748, -53203908, -23349590, 10417443, - -37634652, 15470472, -7325067, -26242250, -44096428, -43297564, 61516816, -42696268, -24030342, -15494095, - -816044, 30666066, 13947906, 22591528, -3657165, 26259430, -12635794, 4902705, -15105400, -26031796, - 687195, 58287000, 3974992, 2074469, -5587753, -36346160, 18167712, 39275328, 33554432, -55918328, - -27775554, -58982784, 17693118, -11523397, 24167780, -17003776, 12111808, 17611514, -18066780, -34241628, - 50425064, -14194867, -20671678, 55832428, -10511932, -14617921, 66546224, -39086348, 10857677, 14669461, - 6337224, -58903328, 1438814, -9730248, -33363306, 18451180, -25941602, 35287452, -5199058, 39423504, - -43368432, 26381836, -77749648, -493921, -41845868, 46731392, -6146098, 5190468, -7011534, -45243184, - -1902671, 36801428, 102121440, 6027987, 7640747, 20003810, 35774932, -7279970, -8385924, 1713692, - -386547, 87230784, -6676527, 12208445, 36992552, -36013300, -57662084, -1269163, -60986388, -9113921, - -30567282, -24427626, -10988674, -27771258, 16436840, 20605106, -34662532, 44601088, 39966820, -6616397, - -7395934, -38414188, 28623810, 8903467, 95039040, 103530184, 770947, -31765578, -25479894, 86741160, - -56972740, -64965676, 67665064, -61351460, 39571680, 12071006, 54793044, 50495932, 34162168, 5549098, - -34361884, -29684666, 71152576, -30056182, -2894808, 17439714, 60687888, 87701088, -2456721, 59970628, - -48752172, -51002736, 6051609, -18728204, 28565828, 18103288, -43342664, 6158983, 28157806, 72241352, - 24998858, 29753386, 27567248, 32465658, 8832600, -2263448, 46299748, 8330089, 37207300, 58847496, - 12940736, -23753316, -19649476, 53113712, 14710263, 108615424, 26246546, 43054900, -43072080, -69009384, - -5482526, -80618680, -50609748, -18021682, -26231512, 3530463, -2452426, 1159641, 3015067, -60084444, - -48022028, -25965224, -49312668, 19488414, 23572928, -15180562, -392990, -47734268, -2894808, 14061723, - -6515466, }, + 365072, -2740189, 2707977, -1516124, -457414, 828929, 1941325, -371515, 1939178, 813896, + 642098, -96637, -139586, 294205, 208306, -979253, -515396, -1848983, 839666, -577673, + -77309, 1911261, 717260, 251256, 261993, 545461, 21475, -326418, -12885, -204011, + -133144, -566936, -302795, -178241, -137439, 103079, 143881, 2147, 4295, 2147, + -77309, -34360, 49392, 178241, -60130, 7786776, 4277788, 2156074, 2637110, 1483911, + 2231236, 4514011, 259846, 128849, -470299, -1114544, 2342905, 27917, -165356, 2486786, + -962073, -1153199, 687195, 249108, 1069447, 259846, 410169, 1123134, -751619, 753767, + -223338, -165356, -564788, 380105, 1490354, 790274, 938450, 785979, -94489, 612033, + 882616, -362925, 745177, -1251983, 1565516, -629213, 466004, 83752, 225486, -300648, + -279173, 3910568, -4475356, -603443, -818191, -1116692, 732292, -2229088, 760209, -53687, + 1020055, 886911, -1758789, -629213, 2699387, -283468, 581968, -500364, 1178969, 2469606, + 2862596, 485331, 1239098, -40802, -2244121, -66572, 253403, -485331, 17180, 1245541, + -1284195, -1735167, 768799, -837519, -766652, -1215476, -42950, 1288490, 332860, -373662, + -453119, -504659, 4295, 292058, -676457, 261993, -773094, -11222750, -7986492, -3886946, + -2942053, -2239826, -2321430, -785979, -1715839, -517544, -1080184, -2763812, 528281, 1438814, + -238371, 828929, -543313, -1421634, -1451699, -2156074, -749472, 545461, 57982, -1202591, + 820339, -1458141, -1464584, 985695, -6442, 75162, 768799, 899796, 229781, -309238, + -435939, -545461, 296353, 182536, -766652, 442382, -1522566, -624918, -375810, -124554, + -1084479, -184684, -397284, -15927886, -2181844, 1271310, 199716, 1202591, 88047, -841814, + 541166, -639950, -790274, -1393717, -1245541, 616328, -489626, 1056562, -1022202, 53687, + -989990, 337155, 1580548, -388695, 1163936, 103079, -1151051, -188979, 1428077, 773094, + 912681, 1118839, -1574106, 1067299, -667867, -92342, -869731, -360777, 403727, 695785, + 311385, -337155, 1140314, 1056562, 571231, -322123, -809601, 139586, -674310, 18796924, + 14995878, 3528316, 6719477, 1597728, 5199058, 3624953, 1131724, 3648575, 1481764, 2759517, + 1215476, -1035087, 2800319, 1943473, -755914, -279173, -5188321, -586263, 270583, 3139621, + 365072, 92342, 1619203, 96637, 1462436, 1312113, 219043, -141734, 515396, 2126009, + 1657857, 1357210, -137439, -594853, 90194, 962073, -380105, -148176, 1118839, 326418, + -558346, -73014, 236223, -1151051, 1374390, 33066954, 12139725, 5832566, 3498251, 2091649, + 2158221, 1999307, 3397319, 801011, 5529771, 727997, 517544, 2340757, -1282048, 541166, + -569083, -622770, -914828, 3517578, 1958505, -317828, 2701535, -1883343, -474594, -680752, + 4168266, -414464, 1494649, 307090, 2037962, 332860, -616328, 1052267, 1391569, -667867, + 487479, 549756, 362925, 826781, -289910, 951335, 865436, -2703682, 569083, 289910, + 491774, 12685186, -9378061, -3302830, -4333622, -2714419, -2570538, 1733019, -1464584, -3927748, + -970663, -5220533, -1209033, -2278480, -4980015, -1282048, 1136019, -3171833, -1045825, 474594, + -3515431, -173946, 4069482, 895501, 590558, -1879048, 83752, 1404454, 36507, -1726577, + -1806034, 1853278, -158914, -2426657, 231928, -1035087, 2959233, -92342, 1335735, -483184, + 2559801, -1685775, 1028645, 337155, 603443, 27917, 659278, -73014, -813896, 1556926, + -34866544, -19722490, -4026532, -4915590, -3371549, -4297115, -6058052, -556198, 169651, -1778117, + 1524713, -1649268, 264141, -169651, -1977833, -2192581, -3453154, -1209033, 3435974, -3246995, + -345745, 3096672, 1997160, -489626, 1163936, -453119, -3330747, -1672890, -2727304, -936303, + 163209, -691490, 1636383, -2946348, -2289218, -92342, -2817499, -2211908, -1977833, -2347200, + 2523293, -725850, -2963528, -957778, 882616, 944893, -962073, -1533303, -633508, -21388938, + 12277164, 4599910, 2007897, 2102387, 1868311, 934155, -2297808, 603443, -1372242, -395137, + 3816079, 2345052, 3283503, 3380139, 3468186, -2905546, 1455994, 3753802, 586263, 3268470, + -3880503, 730144, -996432, -261993, -1468879, 1380832, -526134, 55835, 3377992, -3515431, + -1090922, 1335735, 1930588, -921271, 1602023, -1395864, -2342905, 2735894, -1406602, -124554, + -805306, 1026497, -390842, 1254131, -1406602, -530428, -1279900, -352187, -1127429, 2029372, + 141734, 644245, 31810676, 13035226, 2753074, 7258495, 5677947, 1103807, 2536178, 6863358, + 3126736, -167504, 1464584, 850404, -1017907, 1960653, 5892695, 1378685, 7033009, 3414499, + -5811091, 1080184, 195421, 1187559, 5186173, 2920578, 2080912, -468151, -826781, -715112, + -895501, 798864, -1157494, 1720134, 502511, 2345052, -500364, -618475, 843961, 1911261, + 1026497, -225486, -2572686, -1090922, -1440962, 2257005, 1619203, 2549063, 1391569, 367220, + 337155, 2175401, 1705102, 1421634, 199716, 35540856, 10196252, 4436701, 5555540, 906238, + 5366562, -880468, -2059437, -126702, 1370095, 558346, -176094, 1005022, 5465346, -822486, + -3438121, -2418067, 2639258, 657130, 3077344, 4879083, 4277788, -317828, 2845416, -3143916, + 326418, -2450279, 3279208, 1857573, -3738769, 2134599, -1788854, 223338, -1449552, 2158221, + -1398012, 2716567, 2177549, 1735167, 3539053, 1116692, -96637, -923418, -15032, 429497, + 3917010, -163209, 77309, 223338, 1881196, 1213328, 118112, -551903, 4879083, -15094663, + -6171868, -2422362, -3487514, -1541893, -1329292, 264141, 2143189, -2177549, -4112431, 3852586, + -4937065, -4649302, -880468, -1052267, 2115272, -1294933, -122407, -4490389, -2723009, -5426691, + -6021544, -6637872, -947040, 1591285, -4685810, -1217623, 646393, 539018, 182536, -562641, + -4645007, -2836826, 1990717, 818191, -1099512, 4419522, -2952790, -1273458, 1069447, 2727304, + 2168959, -335007, -687195, 1101659, 622770, -2789581, 234076, -1617055, -783832, 270583, + -1178969, 210453, 1902671, -38590280, -12219182, -7247758, -3081639, -5199058, -4249870, -1178969, + -3049427, -1191853, -4052302, -5342940, -3917010, -1264868, -8048769, -1859721, -3309272, -4793184, + -654983, 889058, 2546916, -2780991, -4052302, -1421634, 3219078, 4262755, 5104569, 2823941, + -204011, -2493229, -1221918, 88047, -3208341, 1374390, 2070174, 2753074, -1896228, -1505386, + -1529008, -659278, -687195, -1037235, 2016487, -543313, 1279900, -2602750, -4696547, -1874753, + -251256, 2385854, -4078072, 1393717, -1999307, 1947768, -2035815, 1189706, -22192096, 5914170, + 1644973, 23622, 3891240, -3728032, 1000727, -8577050, -2787434, 2989297, 2119566, 5538361, + -399432, 6043019, -3515431, -880468, 2894808, -5244155, -1921998, -3081639, 5894843, -362925, + -4868346, 2467459, 4702989, -4159676, -3171833, -3743064, 1099512, -861141, 2037962, -1421634, + -1181116, -989990, -2267743, 3341485, -2660732, 665720, 2192581, -249108, 2531883, -1432372, + 5523328, 854699, -534723, -1896228, -1894081, 118112, -2181844, -2649995, -1647120, 472446, + 1906966, -214748, 545461, -2293513, -2319282, -3285650, -1297080, -1002875, -841814, 19284404, + 27455578, 9573482, 9472550, 13121125, 9350144, -1267015, 1801739, -972810, 1685775, 1647120, + 2325725, 1808181, 4627828, 1833951, 2869038, 944893, 9206262, 2194728, 4471061, 2710124, + 2306398, 7327214, 1644973, 9171903, 4647155, -1870458, 6373732, 1681480, 3085934, 6448894, + 1209033, 3822521, -2080912, -710817, 1702955, 2860448, -4080219, 3322157, -2420214, -4367982, + -2675765, 3478924, 5186173, 3957812, -936303, 1209033, 1065152, 1885491, 2628520, 1490354, + 2985002, 1788854, -3240553, -236223, 2012192, 2911988, 687195, 822486, 294205, -3240553, + 65925600, 5252745, -3618510, 5581310, -3852586, 7745974, 2001455, 8121783, -4138201, 1005022, + -219043, 4984310, -8604967, 1898376, 5113159, -869731, -1488206, 7174743, 10606422, -4256313, + -2772402, 1591285, 5117454, -2126009, 3238405, 444529, -3751654, -2649995, -3040837, 2568391, + 3053722, 4075924, -2987150, 4468914, -2959233, 4348655, 3431679, -670015, -2682207, 1672890, + -4161823, -5267778, 1000727, -3517578, 1324997, 661425, 377957, 2632815, -264141, 3137474, + -30065, -3493956, 1273458, -710817, 1565516, -2482491, -777389, 695785, 1668595, -1241246, + -5001490, -22578644, -21897890, -4969277, 1720134, -974958, -3283503, -3571265, -4868346, -1303523, + 3657165, -1174674, -1198296, -5033702, 5357972, -296353, -4322885, -3749507, 9266392, -8315057, + 921271, 6137509, -654983, 1045825, -7975755, 2613488, -3373697, 1977833, -5510443, -3599183, + 1011465, 1554778, -2514703, -2856153, 384400, -1118839, 515396, -3332895, -1814624, 3682935, + -259846, -1569811, -874026, 4672925, 2162516, -2465311, -3801046, -3375844, 1355062, -390842, + -1490354, 543313, 942745, -1765232, 5611375, 3115999, -350040, -227633, -1181116, 854699, + -1337882, -1359357, -1372242, -92342, -2787434, -2190433, -8562017, -7838316, -8819715, -6783901, + -4501126, -3423089, 966368, -332860, -2040110, -1153199, 2422362, 7630010, -6605660, 3210488, + -2044404, -4559108, 5802501, -704375, 1357210, 7065221, 1333587, 2847563, -4312147, -1303523, + -13045963, -1735167, 2789581, 1434519, 1423782, 1140314, 2147484, -3158949, -3710852, 2843268, + -68719, 2677912, 1733019, -3710852, 3182571, -487479, -9152575, -7965017, -1015760, -7546258, + 1247688, 2106682, -210453, -2078764, -551903, 141734, -1874753, -869731, -133144, -1466731, + 2579128, 423054, 1047972, -1507534, -663572, 3440269, 1239098, -2538326, 2798171, -768799, + -1404454, -4015795, 373662, -43033424, -9859097, 678605, -8604967, 3502546, 818191, 10378788, + -4872641, 661425, -2877628, 6972880, -14162655, -13507672, 5677947, -6521908, 10159745, 3736622, + -8222715, -14306536, -358630, -4013647, -6994354, -2806761, 1612760, 2372970, -3388729, 12337294, + 635655, -1172526, -5160403, 4232691, 4636417, 5063767, 5373004, -618475, -3206193, -1159641, + 3173981, -201863, 3835406, -3569118, -1432372, -1196148, 4449586, 3624953, -3906273, 5113159, + -2821794, -3481071, 438087, -1556926, -3345780, 3502546, -3957812, -483184, 1026497, -916976, + -1593433, 949188, 3354370, -2020782, 3225521, -2598455, 2188286, -1428077, -1586990, -1000727, + 39582420, 34628172, 7333657, 9193377, -1775969, 11252814, 9159018, 11332271, -408022, 4494684, + 2813204, -10819023, -9023726, 4885526, 1022202, -7782481, -8072391, -4640712, 560493, 4496831, + 1382980, 10735271, 9936407, 4226248, -2265595, -2523293, 6577743, 6019397, 500364, 5254893, + -1730872, 6749541, 388695, -1612760, 9560597, 4844723, 7836168, 4928475, 1711545, 5362267, + 2750927, 1767379, 5072357, -2937758, 992137, 6616397, -103079, -4514011, 3981435, 3831111, + 2815351, -3227668, -124554, 3773129, 5884105, -3148211, 7121056, 8025147, -1490354, -4627828, + 691490, 1694365, 1200443, 3403762, -96637, 1086627, 2692945, 47699908, 4131759, -1578401, + 3609920, 2091649, -7630010, 1836099, 2366527, -212601, 5334350, 7106024, 11186242, -5106716, + -4724464, -7960722, -6034429, 6854768, -324270, 9994389, -2224793, -2692945, 4443144, 8656507, + 3755949, -9124658, 7284265, -2815351, 5871221, -3154654, 4608500, -5579163, 3519726, -642098, + 5364414, 414464, 3152506, 1370095, -8819715, -5179731, -627065, -2035815, -635655, -3023657, + 4567698, 1449552, 9519795, -1647120, -6176163, -3923453, -446677, 350040, -6904160, 2183991, + -2231236, -526134, -513249, -4352950, 3938485, 6998649, -2115272, 3493956, 1005022, -4271345, + -253403, -4082367, -3092377, 408022, 6474663, 657130, -2619930, -6438156, 1879048, -2372970, + 13840532, -3317862, -13215614, -8948564, -11916387, 11001559, -8804683, 2424509, 13453985, -612033, + -13666586, 916976, -14347338, 11927124, -4168266, 11884175, 70867, -4556961, 10237055, 358630, + 2121714, -7730941, -9740986, -1591285, 3418794, 2065879, -1909113, -4520453, 4518306, -1417339, + 3371549, 5175436, 6309307, 2892661, 3483219, -12859132, 1052267, -2942053, -4404489, 1722282, + 6335077, -5392332, -9878425, -4385162, 2856153, 1088774, -8690866, -3564823, 3998615, 5871221, + -5246303, -3420942, -4054449, 6010807, 7965017, 1591285, -2763812, 880468, 5675800, -2780991, + -309238, -48593260, -48730700, -8177618, -23753316, -15133317, -8257075, -13550622, -1348620, 9833328, + -21678848, 7808251, -4206921, 7112466, 1561221, 4286378, -8802535, 2119566, -828929, -4937065, + -19819126, -4286378, -10142565, -12983686, -996432, 3066607, 1030792, -4518306, 3148211, -4290673, + -856846, 10546292, 150324, -3706557, 1056562, 6861211, 9805410, 6171868, 416612, 4909148, + 6240588, -687195, 491774, -10574209, 4292820, -8750996, 2078764, 8239895, -5267778, -10563472, + 3513283, -5961415, -5111011, 1080184, 433792, -5035849, 2946348, -1245541, 11834782, 6277095, + 4022237, 1342177, 4726612, -457414, 1853278, -4483946, -7372312, -1348620, -28321014, 52971980, + 42309724, 2179696, 8914205, 2942053, 9670119, 13720273, 3607773, 13299366, 2830384, -14980846, + 9983651, 11117523, 3764539, 2967823, 8993662, 10924249, -11154030, 9012989, -5763846, 7842611, + 1516124, -7494718, 1589138, 8916352, 5604933, -11828340, 5662915, -5179731, 16550656, -1952063, + 3992172, -3105261, -10406706, 10048076, 10711648, 4443144, 2806761, -1088774, 3899830, 10664404, + 2697240, 7436736, 1060857, 4962835, 3085934, -1406602, 6113886, -8061654, -11512660, -5738077, + -8808978, -8123931, -3876208, -8338679, 10170483, 6579890, 762357, -2566243, -3824669, -1947768, + -468151, -672162, 261993, 670015, 1853278, 420907, -571231, 70796096, -27270894, -15923591, + 3332895, -899796, -2806761, -20605106, -7750269, 4329327, -231928, -3590593, -3158949, 2310693, + -15605764, -5415954, 9210557, 15154792, 9399536, 6380174, -4376572, -5596343, -8686571, 10204842, + -14763950, -3476776, 4550518, -10980084, 4054449, 3599183, 13172665, -19849192, -897648, -1138166, + -3238405, 4254165, -16943646, -10022306, 20128364, 11963631, 3360812, -4166118, 12298639, -4239133, + -811749, 1312113, 9764608, 4367982, -4924180, 322123, -2592013, 6556268, -11209865, -6249178, + -6521908, -8480413, 15234249, 3075197, 2486786, -7355132, 141734, -3120294, -1887638, -7690139, + 1765232, -7350837, 410169, 1228361, 6296422, -10666551, -6017249, -9532680, -1904818, 20927228, + 49261128, 7705172, 18992346, 16535624, 16501264, 5065914, 12412455, 7106024, -3199751, -10286447, + -6002217, -3227668, 14160507, -12204150, -12809740, -1271310, -298500, -5744519, -9740986, 29278792, + 28162100, 20579336, 1324997, -12375948, 2418067, 1576253, -5677947, 6405944, 4666482, 11538430, + 1685775, 4445291, -277025, -8695161, 13859859, 10780368, 8405251, -2422362, -10462540, 165356, + -530428, -3513283, -21672404, 15305116, -9713069, 17712446, 1344325, 9309342, -1791001, 10301479, + 16849156, 2692945, -7170448, -1196148, 3352222, -6122476, 3231963, -2821794, -6693707, -4589173, + 2639258, -2495376, 7279970, 1612760, -11377368, -165356, -1245541, -13619341, -2596308, 1464584, + -4425964, 4791036, -51077900, -7121056, -31714038, 70867, 5965710, -11156178, -18399640, -21940840, + -20201378, -12429635, -16404628, -4365835, -781684, -4582730, 5744519, -3584150, 1464584, 12914967, + 6287832, -1529008, 31505732, -7052337, 6633577, -4763119, 3021510, 4312147, 2076617, -1943473, + 5001490, 14383845, 4829691, 4982162, 2089502, 5660767, 12773233, 16799764, 5811091, 20429012, + -5014375, -17877802, 18429704, -5811091, -3242700, -3728032, 10677289, 15618649, 12414603, -392990, + -3498251, -9073118, -22329534, 14070313, 16685948, 11321534, -13037373, 8267812, 2832531, -1382980, + 13728863, 2218351, 9500468, -7213398, 5076652, -8972187, 2147, 7969312, -1346472, 6068789, + -216896, -3085934, -2091649, -89446992, -40851580, 18799072, -3985730, -2581275, 2727304, -10758893, + -10359461, -2871186, -4928475, -15229954, 10657961, 1741609, 23053236, -12607876, -11735998, -18687402, + -11205570, -19252190, 1170379, 7801808, -30000346, 19628000, 15972983, -1778117, 2843268, 13005161, + 1417339, 11523397, -22821308, -21942988, -12923557, -14171245, -11793980, 37164352, 11510512, -7404524, + -13507672, -18051748, 8484708, 5699422, -9257802, 7986492, 6833293, -12485470, 871878, 3676492, + 10037339, -11501922, 29746944, -12406013, -10844792, 5499706, -3560528, 665720, -9365176, -2559801, + 654983, 20014548, -6197638, 28486370, 5645735, 2776696, 2888366, 8390219, -8407398, -1883343, + -10947872, -7625715, -8317204, 1211181, 14989436, -8321499, 14164802, 45481556, 23308788, 14493367, + 9756018, -16043850, 1488206, -13020193, 20059644, -2302103, -2877628, 6736656, 4230543, 4531191, + -858993, 6927782, 2291365, 7295002, -6526203, 19501300, 2319282, -2087354, 58875412, 2907693, + -4941360, -15522012, 8373039, -14493367, 12741020, 31505732, -3025805, 7368017, 7307887, -16913582, + -18981608, 34360, -251256, 13475460, -9773198, -75162, -1696512, 9715216, 9869835, 17126182, + 5866926, 5478231, 6498286, 25770, 10808285, 4707284, -22561464, 3826816, -12156905, -28546500, + -3485366, 6929930, -1007170, 1417339, -4902705, -401579, -2183991, -1118839, 2115272, -399432, + 11160473, -8604967, -2744484, 1389422, 970663, -730144, -6672232, 7623567, 12848395, 64939904, + -17733920, -9070971, -16385300, 31821412, 14020921, 1041530, 8467528, -6637872, -6174016, 10060961, + 2744484, -13391708, 4657892, -17111150, -9975062, -1011465, -13911399, 330712, 6710887, -13282186, + -18577882, 122407, 2718714, 11871290, 24096914, 13838385, -8905615, -1995012, 15579994, 23643794, + -25061134, 8216273, -3380139, -2308545, -10546292, -18998788, 3094524, 13471165, 6154688, 4971425, + 11353746, -2987150, 8141111, -3474629, 6302865, 7909183, -16136192, -14450417, 29379724, -4189741, + 848256, -8269960, 12788265, 33822868, 10726681, 3365107, 13413183, -11491185, -8832600, -2065879, + -6085969, -22625888, 15148350, -405874, -8239895, 3524021, 5177583, -7943542, -7419556, 10945724, + -2089502, -17703856, 10000831, 5209796, 56446608, 54350664, -18019536, 15131170, 3955665, 11836930, + 28421946, -3169686, -15614354, -4913443, 55338508, -31035434, -6517613, -15210627, -13030931, -25110526, + 27367532, -7743826, -38568808, -28005334, -35257388, -13005161, 30075508, -3375844, 13857712, -5164698, + -16320876, 13926431, 3384434, 17553532, -17364552, 15627239, 11572789, 6517613, 6427419, -27111982, + 7159711, -22621592, 18556406, 40913860, 11078868, 12382391, -26684632, 36610300, 9004399, -3706557, + -6427419, -7337952, 10642929, 18292266, 3633542, -4230543, -1879048, 4928475, -9655086, -6350109, + -9330816, -6633577, -1539746, 13260712, -9803263, 19834158, 6337224, 12040941, -4995047, -28870770, + -20036022, 7020124, 1148904, -8888435, 9949292, -953483, -1606318, 5242008, -4413079, -54438712, + -30958124, 6826851, 5201206, -1099512, -22477712, 13204877, 8989367, -14890652, -37336152, 30771294, + 8927090, 11078868, 19056770, 9938554, -3717294, 5257040, -8308614, 25673168, -20274394, -37986840, + 289910, -2207613, -16234976, -41137196, 2948495, -8624294, -19739670, -12010876, -4915590, 9030169, + 3420942, 14959371, 32018982, -12777528, -22804128, 7894150, -792421, 435939, 14512694, -17405354, + -13793287, -1898376, 16902844, -18695992, 18326626, -5046587, 33137820, -3837553, -6893423, -2987150, + 2961380, 6818261, -32040456, 5845451, -27206470, 31830002, 3300682, 20413980, 14882062, -10739566, + 1937030, -14482630, 11345156, -367220, 9957882, 7258495, -16733193, -1561221, -15723875, -7110319, + 13651554, -4183298, -7185481, 7984344, -71092448, -37263136, -9431748, -11400991, 747324, 4638565, + -22769770, -21683142, 9850507, -24820616, 9833328, -27236536, -4514011, -26456998, -25082610, 26480620, + 15311558, 1221918, 1204738, -27788438, -38583840, 17454748, -51535312, 16460462, 3777424, -20800526, + 5832566, -14192719, 7129646, 34589520, -16157667, -5439576, -38010460, 28774134, -6569153, 11196980, + -11482595, -8319352, -392990, -5080947, 22009560, 2982855, 42659764, 44126492, -2072322, -2954938, + -12848395, -1939178, -3206193, 3695819, 18165564, -1926293, 37512244, 5914170, -9880572, 1582696, + 10146860, -3809636, 560493, -3015067, 29280940, -23791972, -36483600, -20532092, 3650722, 4883378, + 9966472, 15264314, 1151051, 3682935, -6792491, -20959440, -18668076, -22988812, 5126044, -8121783, + 95328944, 41304700, 29965986, 11192685, -9964324, -18107582, -28716152, 15410343, 29029684, 10711648, + -12496207, 32373316, 19503446, 32341104, 2967823, -25179246, -8684424, 49020608, -51623360, -11841225, + 35227320, -21607980, -10853382, 79746808, -9528385, 21945136, 73959336, -12979391, -4230543, -3382287, + 9698036, -5336497, 32373316, 19155554, 26772678, -19885698, -42780020, 15955804, -16552804, 19417548, + -7582765, 6124624, 31419834, 16421807, 2342905, 12079596, 6798933, 11536282, 30399778, 15247134, + -2634963, 27399744, 12732431, 2467459, 7490423, 51750060, 32686848, -1705102, 29787746, -14675903, + 37538016, -11059541, 8890582, -12406013, 5272073, 19091130, -10722386, -2944200, -919123, 5121749, + 2269890, -16172699, 2499671, -14392435, 121090160, 55967720, -25567940, 11506217, 62139588, 2325725, + 44626856, -12534862, 17115444, 38764228, -29469918, 4275640, 65302832, 60273424, 47502340, 17905718, + 40666896, 7797513, 35534412, 13503377, 10118943, -22000970, -27661736, -37276020, -76300096, 24792698, + -23622, -19711752, -8130373, 26830660, -18053896, -1855426, 2025077, 15393163, -67718752, -10086731, + 47556024, 38036232, -14405320, 25363930, 20145544, 14353781, -9101036, -14841259, -7651484, -9764608, + -7668664, -24000278, -21865678, 17779018, -42513732, 14450417, 33264522, -9451076, -25239376, -37280316, + 34748432, -418759, -18837726, -11042361, -9047349, -12281459, 6685117, -5224828, -14033806, 14385993, + 54668492, -26746908, -17401060, 8190503, -11474005, 14141180, -152471, 30322470, 4870493, 2873333, + -47568912, -14100378, -57322780, -13275744, -57307748, 27120570, -54597624, 28948080, -9038759, -32669668, + -9159018, -15710990, 67927056, 9676561, -48681308, 137439, -31651762, -26130582, 33644628, -38356204, + -34284576, -40020504, 59214716, -8821863, 39200168, -60786672, -31580894, 22870700, -27582280, 21745420, + 65429532, 41781440, 40583144, 5877663, -6646462, -32669668, -44708464, -3487514, 10232760, -42769284, + 1129576, -25692494, 12255689, 17224966, -47476568, -41689100, -74519832, -12919262, 5302137, -33386928, + -46044196, 44208100, 2467459, 45406396, 46011984, -7022272, -6352257, -20055350, 26598732, 21464100, + 3453154, 9833328, -3586298, -3874061, 22589380, -7460358, -25930866, -21708912, -32590212, -29280940, + -9586367, -2800319, -3343632, -43121472, -83951576, -12571369, 5564130, -6008659, -1597728, 23837068, + -19980188, 21339546, 16967268, -11497627, 23564338, -33812132, 42359116, 31776316, -392990, -31082678, + 670015, 22971632, -98152888, 21311628, 37179384, -67529768, 26257282, -33947420, -52654152, -44762148, + 21206402, -10247792, -74038792, 39827232, 18348100, -42256036, -75000864, 15891379, 6143951, -21704618, + -7773891, -36185100, 32527934, 30103426, 48417168, -39769248, 3927748, -53203908, -23349590, 10417443, + -37634652, 15470472, -7325067, -26242250, -44096428, -43297564, 61516816, -42696268, -24030342, -15494095, + -816044, 30666066, 13947906, 22591528, -3657165, 26259430, -12635794, 4902705, -15105400, -26031796, + 687195, 58287000, 3974992, 2074469, -5587753, -36346160, 18167712, 39275328, 33554432, -55918328, + -27775554, -58982784, 17693118, -11523397, 24167780, -17003776, 12111808, 17611514, -18066780, -34241628, + 50425064, -14194867, -20671678, 55832428, -10511932, -14617921, 66546224, -39086348, 10857677, 14669461, + 6337224, -58903328, 1438814, -9730248, -33363306, 18451180, -25941602, 35287452, -5199058, 39423504, + -43368432, 26381836, -77749648, -493921, -41845868, 46731392, -6146098, 5190468, -7011534, -45243184, + -1902671, 36801428, 102121440, 6027987, 7640747, 20003810, 35774932, -7279970, -8385924, 1713692, + -386547, 87230784, -6676527, 12208445, 36992552, -36013300, -57662084, -1269163, -60986388, -9113921, + -30567282, -24427626, -10988674, -27771258, 16436840, 20605106, -34662532, 44601088, 39966820, -6616397, + -7395934, -38414188, 28623810, 8903467, 95039040, 103530184, 770947, -31765578, -25479894, 86741160, + -56972740, -64965676, 67665064, -61351460, 39571680, 12071006, 54793044, 50495932, 34162168, 5549098, + -34361884, -29684666, 71152576, -30056182, -2894808, 17439714, 60687888, 87701088, -2456721, 59970628, + -48752172, -51002736, 6051609, -18728204, 28565828, 18103288, -43342664, 6158983, 28157806, 72241352, + 24998858, 29753386, 27567248, 32465658, 8832600, -2263448, 46299748, 8330089, 37207300, 58847496, + 12940736, -23753316, -19649476, 53113712, 14710263, 108615424, 26246546, 43054900, -43072080, -69009384, + -5482526, -80618680, -50609748, -18021682, -26231512, 3530463, -2452426, 1159641, 3015067, -60084444, + -48022028, -25965224, -49312668, 19488414, 23572928, -15180562, -392990, -47734268, -2894808, 14061723, + -6515466, }, }; #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES @@ -59929,65 +59992,65 @@ const float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = #endif Word32 sine_table_Q31 [361] = { - 187, - -37478868, -74946000, -112390808, -149800880, -187165824, -224473232, -261712288, -298872128, -335940416, -372906880, - -409759232, -446486784, -483078848, -519523232, -555809856, -591926720, -627863744, -663609024, -699152192, -734482816, - -769589248, -804461760, -839088768, -873460160, -907565952, -941394816, -974937344, -1008182528, -1041120576, -1073741952, - -1106035712, -1137993088, -1169603456, -1200857856, -1231746048, -1262259072, -1292388096, -1322122880, -1351455488, -1380375936, - -1408875904, -1436947072, -1464580224, -1491767680, -1518500224, -1544770688, -1570570112, -1595891328, -1620726528, -1645067904, - -1668908416, -1692240256, -1715056640, -1737350784, -1759115520, -1780344704, -1801031296, -1821169280, -1840752768, -1859775360, - -1878231552, -1896115456, -1913422080, -1930145536, -1946281088, -1961824000, -1976769152, -1991112192, -2004848768, -2017974528, - -2030485760, -2042378368, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, - -2121044608, -2126584448, -2131476608, -2135719552, -2139311872, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, - -2147156608, -2146175488, -2144540544, -2142252544, -2139311872, -2135719552, -2131476608, -2126584448, -2121044608, -2114858496, - -2108028288, -2100556032, -2092443776, -2083694208, -2074309888, -2064293760, -2053648768, -2042378368, -2030485632, -2017974528, - -2004848640, -1991112192, -1976769024, -1961824000, -1946281216, -1930145536, -1913421952, -1896115456, -1878231552, -1859775488, - -1840752768, -1821169408, -1801031296, -1780344576, -1759115648, -1737350784, -1715056768, -1692240128, -1668908160, -1645067904, - -1620726400, -1595891456, -1570570112, -1544770432, -1518500224, -1491767552, -1464580352, -1436947072, -1408876032, -1380375808, - -1351455232, -1322123008, -1292387840, -1262259200, -1231746048, -1200857600, -1169603456, -1137992960, -1106035840, -1073741824, - -1041120704, -1008182528, -974937152, -941394880, -907565824, -873460288, -839088704, -804461504, -769589312, -734482624, - -699152256, -663608960, -627863424, -591926720, -555809664, -519523328, -483078688, -446486976, -409759200, -372906624, - -335940480, -298871968, -261712432, -224473168, -187165520, -149800880, -112390616, -74946096, -37478756, 0, - 37478756, 74946096, 112390616, 149800880, 187165520, 224473168, 261712432, 298871968, 335940480, 372906624, - 409759200, 446486976, 483078688, 519523328, 555809664, 591926720, 627863424, 663608960, 699152256, 734482624, - 769589312, 804461504, 839088704, 873460288, 907565824, 941394880, 974937152, 1008182528, 1041120704, 1073741824, - 1106035840, 1137992960, 1169603456, 1200857600, 1231746048, 1262259200, 1292387840, 1322123008, 1351455232, 1380375808, - 1408876032, 1436947072, 1464580352, 1491767552, 1518500224, 1544770432, 1570570112, 1595891456, 1620726400, 1645067904, - 1668908160, 1692240128, 1715056768, 1737350784, 1759115648, 1780344576, 1801031296, 1821169408, 1840752768, 1859775488, - 1878231552, 1896115456, 1913421952, 1930145536, 1946281216, 1961824000, 1976769024, 1991112192, 2004848640, 2017974528, - 2030485632, 2042378368, 2053648768, 2064293760, 2074309888, 2083694208, 2092443776, 2100556032, 2108028288, 2114858496, - 2121044608, 2126584448, 2131476608, 2135719552, 2139311872, 2142252544, 2144540544, 2146175488, 2147156608, 2147483647, - 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, - 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648768, 2042378368, 2030485760, 2017974528, - 2004848768, 1991112192, 1976769152, 1961824000, 1946281088, 1930145536, 1913422080, 1896115456, 1878231552, 1859775360, - 1840752768, 1821169280, 1801031296, 1780344704, 1759115520, 1737350784, 1715056640, 1692240256, 1668908416, 1645067904, - 1620726528, 1595891328, 1570570112, 1544770688, 1518500224, 1491767680, 1464580224, 1436947072, 1408875904, 1380375936, - 1351455488, 1322122880, 1292388096, 1262259072, 1231746048, 1200857856, 1169603456, 1137993088, 1106035712, 1073741952, - 1041120576, 1008182528, 974937344, 941394816, 907565952, 873460160, 839088768, 804461760, 769589248, 734482816, - 699152192, 663609024, 627863744, 591926720, 555809856, 519523232, 483078848, 446486784, 409759232, 372906880, - 335940416, 298872128, 261712288, 224473232, 187165824, 149800880, 112390808, 74946000, 37478868, -187, + 187, + -37478868, -74946000, -112390808, -149800880, -187165824, -224473232, -261712288, -298872128, -335940416, -372906880, + -409759232, -446486784, -483078848, -519523232, -555809856, -591926720, -627863744, -663609024, -699152192, -734482816, + -769589248, -804461760, -839088768, -873460160, -907565952, -941394816, -974937344, -1008182528, -1041120576, -1073741952, + -1106035712, -1137993088, -1169603456, -1200857856, -1231746048, -1262259072, -1292388096, -1322122880, -1351455488, -1380375936, + -1408875904, -1436947072, -1464580224, -1491767680, -1518500224, -1544770688, -1570570112, -1595891328, -1620726528, -1645067904, + -1668908416, -1692240256, -1715056640, -1737350784, -1759115520, -1780344704, -1801031296, -1821169280, -1840752768, -1859775360, + -1878231552, -1896115456, -1913422080, -1930145536, -1946281088, -1961824000, -1976769152, -1991112192, -2004848768, -2017974528, + -2030485760, -2042378368, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, + -2121044608, -2126584448, -2131476608, -2135719552, -2139311872, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, + -2147156608, -2146175488, -2144540544, -2142252544, -2139311872, -2135719552, -2131476608, -2126584448, -2121044608, -2114858496, + -2108028288, -2100556032, -2092443776, -2083694208, -2074309888, -2064293760, -2053648768, -2042378368, -2030485632, -2017974528, + -2004848640, -1991112192, -1976769024, -1961824000, -1946281216, -1930145536, -1913421952, -1896115456, -1878231552, -1859775488, + -1840752768, -1821169408, -1801031296, -1780344576, -1759115648, -1737350784, -1715056768, -1692240128, -1668908160, -1645067904, + -1620726400, -1595891456, -1570570112, -1544770432, -1518500224, -1491767552, -1464580352, -1436947072, -1408876032, -1380375808, + -1351455232, -1322123008, -1292387840, -1262259200, -1231746048, -1200857600, -1169603456, -1137992960, -1106035840, -1073741824, + -1041120704, -1008182528, -974937152, -941394880, -907565824, -873460288, -839088704, -804461504, -769589312, -734482624, + -699152256, -663608960, -627863424, -591926720, -555809664, -519523328, -483078688, -446486976, -409759200, -372906624, + -335940480, -298871968, -261712432, -224473168, -187165520, -149800880, -112390616, -74946096, -37478756, 0, + 37478756, 74946096, 112390616, 149800880, 187165520, 224473168, 261712432, 298871968, 335940480, 372906624, + 409759200, 446486976, 483078688, 519523328, 555809664, 591926720, 627863424, 663608960, 699152256, 734482624, + 769589312, 804461504, 839088704, 873460288, 907565824, 941394880, 974937152, 1008182528, 1041120704, 1073741824, + 1106035840, 1137992960, 1169603456, 1200857600, 1231746048, 1262259200, 1292387840, 1322123008, 1351455232, 1380375808, + 1408876032, 1436947072, 1464580352, 1491767552, 1518500224, 1544770432, 1570570112, 1595891456, 1620726400, 1645067904, + 1668908160, 1692240128, 1715056768, 1737350784, 1759115648, 1780344576, 1801031296, 1821169408, 1840752768, 1859775488, + 1878231552, 1896115456, 1913421952, 1930145536, 1946281216, 1961824000, 1976769024, 1991112192, 2004848640, 2017974528, + 2030485632, 2042378368, 2053648768, 2064293760, 2074309888, 2083694208, 2092443776, 2100556032, 2108028288, 2114858496, + 2121044608, 2126584448, 2131476608, 2135719552, 2139311872, 2142252544, 2144540544, 2146175488, 2147156608, 2147483647, + 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, + 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648768, 2042378368, 2030485760, 2017974528, + 2004848768, 1991112192, 1976769152, 1961824000, 1946281088, 1930145536, 1913422080, 1896115456, 1878231552, 1859775360, + 1840752768, 1821169280, 1801031296, 1780344704, 1759115520, 1737350784, 1715056640, 1692240256, 1668908416, 1645067904, + 1620726528, 1595891328, 1570570112, 1544770688, 1518500224, 1491767680, 1464580224, 1436947072, 1408875904, 1380375936, + 1351455488, 1322122880, 1292388096, 1262259072, 1231746048, 1200857856, 1169603456, 1137993088, 1106035712, 1073741952, + 1041120576, 1008182528, 974937344, 941394816, 907565952, 873460160, 839088768, 804461760, 769589248, 734482816, + 699152192, 663609024, 627863744, 591926720, 555809856, 519523232, 483078848, 446486784, 409759232, 372906880, + 335940416, 298872128, 261712288, 224473232, 187165824, 149800880, 112390808, 74946000, 37478868, -187, }; Word32 cosine_table_Q31 [181] = { - 2147483647, - 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, - 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648896, 2042378368, 2030485632, 2017974528, - 2004848640, 1991112192, 1976769152, 1961823872, 1946281088, 1930145536, 1913421952, 1896115456, 1878231552, 1859775360, - 1840752768, 1821169408, 1801031296, 1780344704, 1759115648, 1737350784, 1715056768, 1692240256, 1668908160, 1645067904, - 1620726528, 1595891328, 1570570112, 1544770432, 1518500224, 1491767552, 1464580352, 1436946944, 1408876032, 1380375936, - 1351455360, 1322123008, 1292387968, 1262259328, 1231746048, 1200857600, 1169603456, 1137992960, 1106035840, 1073741760, - 1041120640, 1008182592, 974937216, 941394880, 907565760, 873460224, 839088832, 804461632, 769589376, 734482688, - 699152256, 663608896, 627863616, 591926784, 555809728, 519523328, 483078688, 446486880, 409759328, 372906720, - 335940512, 298871968, 261712384, 224473072, 187165664, 149800960, 112390648, 74946096, 37478708, -93, - -37478640, -74946024, -112390576, -149800896, -187165584, -224473264, -261712304, -298871904, -335940416, -372906656, - -409759264, -446486816, -483078592, -519523264, -555809664, -591926720, -627863552, -663608832, -699152192, -734482624, - -769589312, -804461568, -839088768, -873460160, -907565952, -941394816, -974936960, -1008182528, -1041120576, -1073741952, - -1106035712, -1137993088, -1169603456, -1200857472, -1231746048, -1262259072, -1292388096, -1322122880, -1351455104, -1380375936, - -1408875904, -1436947200, -1464580224, -1491767296, -1518500224, -1544770304, -1570570240, -1595891328, -1620726656, -1645067904, - -1668908032, -1692240256, -1715056640, -1737350912, -1759115648, -1780344448, -1801031296, -1821169280, -1840752768, -1859775360, - -1878231680, -1896115456, -1913421824, -1930145536, -1946281088, -1961824000, -1976769152, -1991112064, -2004848768, -2017974528, - -2030485760, -2042378240, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, - -2121044608, -2126584448, -2131476608, -2135719552, -2139311744, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, + 2147483647, + 2147156608, 2146175488, 2144540544, 2142252544, 2139311872, 2135719552, 2131476608, 2126584448, 2121044608, 2114858496, + 2108028288, 2100556032, 2092443776, 2083694208, 2074309888, 2064293760, 2053648896, 2042378368, 2030485632, 2017974528, + 2004848640, 1991112192, 1976769152, 1961823872, 1946281088, 1930145536, 1913421952, 1896115456, 1878231552, 1859775360, + 1840752768, 1821169408, 1801031296, 1780344704, 1759115648, 1737350784, 1715056768, 1692240256, 1668908160, 1645067904, + 1620726528, 1595891328, 1570570112, 1544770432, 1518500224, 1491767552, 1464580352, 1436946944, 1408876032, 1380375936, + 1351455360, 1322123008, 1292387968, 1262259328, 1231746048, 1200857600, 1169603456, 1137992960, 1106035840, 1073741760, + 1041120640, 1008182592, 974937216, 941394880, 907565760, 873460224, 839088832, 804461632, 769589376, 734482688, + 699152256, 663608896, 627863616, 591926784, 555809728, 519523328, 483078688, 446486880, 409759328, 372906720, + 335940512, 298871968, 261712384, 224473072, 187165664, 149800960, 112390648, 74946096, 37478708, -93, + -37478640, -74946024, -112390576, -149800896, -187165584, -224473264, -261712304, -298871904, -335940416, -372906656, + -409759264, -446486816, -483078592, -519523264, -555809664, -591926720, -627863552, -663608832, -699152192, -734482624, + -769589312, -804461568, -839088768, -873460160, -907565952, -941394816, -974936960, -1008182528, -1041120576, -1073741952, + -1106035712, -1137993088, -1169603456, -1200857472, -1231746048, -1262259072, -1292388096, -1322122880, -1351455104, -1380375936, + -1408875904, -1436947200, -1464580224, -1491767296, -1518500224, -1544770304, -1570570240, -1595891328, -1620726656, -1645067904, + -1668908032, -1692240256, -1715056640, -1737350912, -1759115648, -1780344448, -1801031296, -1821169280, -1840752768, -1859775360, + -1878231680, -1896115456, -1913421824, -1930145536, -1946281088, -1961824000, -1976769152, -1991112064, -2004848768, -2017974528, + -2030485760, -2042378240, -2053648768, -2064293760, -2074309888, -2083694208, -2092443776, -2100556032, -2108028288, -2114858496, + -2121044608, -2126584448, -2131476608, -2135719552, -2139311744, -2142252544, -2144540544, -2146175488, -2147156608, -2147483647, }; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index bcc470ead..8cdb3d007 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1334,7 +1334,12 @@ typedef struct ivas_hrtfs_structure UWord16 index_frequency_max_diffuse; Word16 max_num_ir; Word16 max_num_iterations; +#ifdef FIX_INV_DIFFUSE_WEIGHT + Word16 inv_diffuse_weight_fx[BINAURAL_CHANNELS][MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ + Word16 same_inv_diffuse_weight; +#else Word16 inv_diffuse_weight_fx[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] Q15 */ +#endif Word32 latency_s_fx; #ifdef NONBE_FIX_BINARY_BINAURAL_READING Word16 init_from_rom; @@ -1346,8 +1351,13 @@ typedef struct ivas_crend_state_t { Word32 *freq_buffer_re_fx[MAX_INTERN_CHANNELS]; Word32 *freq_buffer_im_fx[MAX_INTERN_CHANNELS]; +#ifdef FIX_INV_DIFFUSE_WEIGHT + Word32 *freq_buffer_re_diffuse_fx[BINAURAL_CHANNELS]; + Word32 *freq_buffer_im_diffuse_fx[BINAURAL_CHANNELS]; +#else Word32 *freq_buffer_re_diffuse_fx; Word32 *freq_buffer_im_diffuse_fx; +#endif Word32 *prev_out_buffer_fx[BINAURAL_CHANNELS]; Word32 *lfe_delay_line_fx; Word32 m_fYaw_fx; @@ -1468,6 +1478,10 @@ typedef struct ivas_hrtfs_parambin_struct Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + Word16 allocatedFromFile; +#endif + } HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 8f7f60e59..34f644c90 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1366,13 +1366,25 @@ static ivas_error create_HRTF_from_rawdata( hrtf_data_rptr += sizeof( UWord16 ); /* inv_diffuse_weight */ +#ifdef FIX_INV_DIFFUSE_WEIGHT + FOR( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + ( *hHRTF )->inv_diffuse_weight_fx[0][i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); + hrtf_data_rptr += sizeof( float ); + } + FOR( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + ( *hHRTF )->inv_diffuse_weight_fx[1][i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); + hrtf_data_rptr += sizeof( float ); + } +#else for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { //( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); hrtf_data_rptr += sizeof( float ); } - +#endif /* max_total_num_fsamp_per_iteration */ max_total_num_fsamp_per_iteration = *( (UWord16 *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( UWord16 ); @@ -2266,6 +2278,7 @@ ivas_error create_SetOfHRTF_from_binary( { if ( read_hrtf_binary_header( &hrtf_header, f_hrtf ) != IVAS_ERR_OK ) { + free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); } @@ -2318,6 +2331,7 @@ ivas_error create_SetOfHRTF_from_binary( /* Create the HRTF reading the raw data from the binary file */ if ( ( create_HRTF_from_rawdata( hHRTF, hrtf_data ) ) != IVAS_ERR_OK ) { + free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); } } @@ -2405,6 +2419,31 @@ static ivas_error destroy_HRTF return IVAS_ERR_OK; #endif } + +#ifdef FIX_OLD_BINARY_FORMAT +/*---------------------------------------------------------------------* + * cleanup_SetOfHRTF() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ + +void cleanup_SetOfHRTF( + HRTFS_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +) +{ + if ( ( hSetOfHRTF != NULL ) && ( *hSetOfHRTF != NULL ) ) + { + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_combined ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_hoa3 ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_hoa2 ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_foa ) ); + destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_brir_combined ) ); + } + + return; +} +#endif + /*---------------------------------------------------------------------* * destroy_SetOfHRTF() * diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 96bb09736..d1abd9b75 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -119,6 +119,17 @@ ivas_error create_SetOfHRTF_from_binary( int32_t output_Fs /* i : Output sampling frequency */ ); +#ifdef FIX_OLD_BINARY_FORMAT +/*---------------------------------------------------------------------* + * cleanup_SetOfHRTF() + * + * Destroy the HRTF data set. + *---------------------------------------------------------------------*/ + +void cleanup_SetOfHRTF( + IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ +); +#endif /*---------------------------------------------------------------------* * destroy_SetOfHRTF() -- GitLab From 8b5e97ea53d1e52c6b09f5c24796d7cfbda19613 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 15 May 2025 12:38:43 +0530 Subject: [PATCH 0586/1310] Precision improvement in wb_vad_ivas_fx --- lib_enc/init_enc_fx.c | 2 + lib_enc/ivas_core_pre_proc_front_fx.c | 35 ++-- lib_enc/ivas_front_vad_fx.c | 14 +- lib_enc/nois_est_fx.c | 16 +- lib_enc/pitch_ol_fx.c | 13 +- lib_enc/prot_fx_enc.h | 2 +- lib_enc/stat_enc.h | 6 +- lib_enc/vad_fx.c | 258 ++++++++++++++------------ 8 files changed, 182 insertions(+), 164 deletions(-) diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 97cd57308..543a6fab9 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -377,6 +377,8 @@ ivas_error init_encoder_fx( move16(); st_fx->hVAD->L_snr_sum_vad_fx = 0; move32(); + st_fx->hVAD->q_L_snr_sum_vad = Q31; + move16(); } ELSE { diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index e883d9ec1..d358f7099 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -223,6 +223,7 @@ ivas_error pre_proc_front_ivas_fx( Word16 res_cod_SNR_M_fx_e[STEREO_DFT_BAND_MAX]; Word16 Qfact_PS, q_lf_E_fx; Word16 enerBuffer_fx_exp_buf[CLDFB_NO_CHANNELS_MAX]; + Word32 bckr_temp[NB_BANDS]; #ifdef DEBUG_MODE_INFO Word32 *in_buff_temp; Word16 in_q_temp; @@ -781,21 +782,9 @@ ivas_error pre_proc_front_ivas_fx( move16(); } - Word16 scale = add( L_norm_arr( st->hNoiseEst->enrO_fx, NB_BANDS ), st->hNoiseEst->q_enrO ); - scale = s_min( scale, fr_bands_fx_q ); - - scale_sig32( st->hNoiseEst->enrO_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_enrO ) ); - st->hNoiseEst->q_enrO = scale; - move16(); - - scale_sig32( fr_bands_fx, 2 * NB_BANDS, sub( scale, fr_bands_fx_q ) ); - fr_bands_fx_q = scale; - move16(); - st->vad_flag = wb_vad_ivas_fx( st, fr_bands_fx, fr_bands_fx_q, &i, &i, &i, &snr_sum_he_fx, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -MAX_16, -MAX_16 ); //-100000f == max 16bit float move16(); - #ifdef DEBUG_FORCE_DIR if ( st->force_dir[0] != '\0' ) { @@ -919,13 +908,13 @@ ivas_error pre_proc_front_ivas_fx( *----------------------------------------------------------------*/ noise_est_down_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, &st->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, - &st->hNoiseEst->totalNoise_fx, Etot_fx, &st->hNoiseEst->Etot_last_32fx, &st->hNoiseEst->Etot_v_h2_fx ); + &st->hNoiseEst->totalNoise_fx, Etot_fx, &st->hNoiseEst->Etot_last_32fx, &st->hNoiseEst->Etot_v_h2_32fx ); test(); IF( lr_vad_enabled && st->idchan == 0 ) { - noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[0] ), &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx ); - noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[1] ), &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[0] ), &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[1] ), &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx ); corr_shiftL_fx = correlation_shift_fx( hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx ); // Q15 corr_shiftR_fx = correlation_shift_fx( hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx ); // Q15 @@ -1249,7 +1238,7 @@ ivas_error pre_proc_front_ivas_fx( * Update estimated noise energy and voicing cut-off frequency *-----------------------------------------------------------------*/ - scale = s_min( Q31, s_min( add( q_tmpN, L_norm_arr( tmpN_fx, NB_BANDS ) ), add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ) ) ); + Word16 scale = s_min( Q31, s_min( add( q_tmpN, L_norm_arr( tmpN_fx, NB_BANDS ) ), add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ) ) ); scale = sub( scale, 1 ); // guard bits scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); scale_sig32( tmpN_fx, NB_BANDS, sub( scale, q_tmpN ) ); @@ -1278,7 +1267,7 @@ ivas_error pre_proc_front_ivas_fx( noise_est_ivas_fx( st, old_pitch1, tmpN_fx, epsP_fx, extract_h( Etot_fx ), *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, &ncharX_fx, &sp_div_fx, &q_sp_div, &non_staX_fx, loc_harm, lf_E_fx, q_lf_E_fx, &st->hNoiseEst->harm_cor_cnt, extract_h( st->hNoiseEst->Etot_l_lp_32fx ), - st->hNoiseEst->Etot_v_h2_fx, &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, + extract_h( st->hNoiseEst->Etot_v_h2_32fx ), &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, hStereoClassif, NULL, st->ini_frame ); test(); @@ -1321,14 +1310,14 @@ ivas_error pre_proc_front_ivas_fx( noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[0], epsP_fx, Etot_LR_fx[0], sub( Etot_LR_fx[0], hCPE->hFrontVad[0]->lp_speech_fx ), corr_shiftL_fx, tmpE_LR_fx[0], q_tmpE_LR[0], fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], &cor_map_sum_LR_fx[0], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[0], lf_E_LR_fx_q, &hCPE->hFrontVad[0]->hNoiseEst->harm_cor_cnt, - extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_32fx ), extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx ), &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[0], hCPE->hFrontVad[0]->ini_frame ); /* Note: the index [0] in the last argument is intended, the ini_frame counter is only maintained in the zero-th channel's VAD handle */ noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[1], epsP_fx, Etot_LR_fx[1], sub( Etot_LR_fx[1], hCPE->hFrontVad[1]->lp_speech_fx ), corr_shiftR_fx, tmpE_LR_fx[1], q_tmpE_LR[1], fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], &cor_map_sum_LR_fx[1], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[1], lf_E_LR_fx_q, &hCPE->hFrontVad[1]->hNoiseEst->harm_cor_cnt, - extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx, &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_32fx ), extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx ), &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[1], hCPE->hFrontVad[0]->ini_frame ); } @@ -1346,14 +1335,14 @@ ivas_error pre_proc_front_ivas_fx( * Find spectral tilt * UC and VC frame selection *-----------------------------------------------------------------*/ + scale = s_min( Q31, s_min( add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ), add( fr_bands_fx_q, L_norm_arr( fr_bands_fx, 2 * NB_BANDS ) ) ) ); scale_sig32( fr_bands_fx, 2 * NB_BANDS, sub( scale, fr_bands_fx_q ) ); - scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); - st->hNoiseEst->q_bckr = fr_bands_fx_q = scale; - move16(); + Copy_Scale_sig32( st->hNoiseEst->bckr_fx, bckr_temp, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); + fr_bands_fx_q = scale; move16(); - find_tilt_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, st->hNoiseEst->q_bckr, ee_fx, st->pitch, st->voicing_fx, lf_E_fx, q_lf_E_fx, + find_tilt_ivas_fx( fr_bands_fx, fr_bands_fx_q, bckr_temp, scale, ee_fx, st->pitch, st->voicing_fx, lf_E_fx, q_lf_E_fx, corr_shift_fx, st->input_bwidth, st->max_band, hp_E_fx, MODE1, &( st->bckr_tilt_lt ), st->Opt_SC_VBR ); st->coder_type = find_uv_ivas_fx( st, pitch_fr_fx, voicing_fr_fx, inp_12k8_fx, ee_fx, &dE1X_fx, corr_shift_fx, *relE_fx, extract_h( Etot_fx ), hp_E_fx, diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index ab090edb8..b3c563863 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -282,16 +282,6 @@ ivas_error front_vad_fx( move16(); /* wb_vad */ - Word16 scale = s_min( q_fr_bands[n], add( hFrontVads[n]->hNoiseEst->q_enrO, L_norm_arr( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS ) ) ); - - scale_sig32( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS, sub( scale, hFrontVads[n]->hNoiseEst->q_enrO ) ); // scale - hFrontVads[n]->hNoiseEst->q_enrO = scale; - move16(); - - scale_sig32( fr_bands_fx[n], 2 * NB_BANDS, sub( scale, q_fr_bands[n] ) ); // scale - q_fr_bands[n] = scale; - move16(); - hFrontVad->hVAD->vad_flag = wb_vad_ivas_fx( sts[n], fr_bands_fx[n], q_fr_bands[n], &dummy, &dummy, &dummy, &snr_sum_he_fx, &localVAD_HE_SAD[n], &dummy_short, hFrontVad->hVAD, hFrontVad->hNoiseEst, hFrontVad->lp_speech_fx, hFrontVad->lp_noise_fx ); // Q0 @@ -613,7 +603,7 @@ ivas_error front_vad_spar_fx( Word16 q_tmpN, q_tmpE; noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, &hFrontVad->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, - &hFrontVad->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_fx[0] ) /*q8->q24*/, &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx ); + &hFrontVad->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_fx[0] ) /*q8->q24*/, &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_32fx ); corr_shift_fx = correlation_shift_fx( hFrontVad->hNoiseEst->totalNoise_fx ); /* Q15 */ @@ -755,7 +745,7 @@ ivas_error front_vad_spar_fx( noise_est_ivas_fx( st, old_pitch, tmpN_fx, epsP_fx, Etot_fx[0], sub( Etot_fx[0], hFrontVad->lp_speech_fx ), corr_shift_fx, tmpE_fx, hFrontVad->hNoiseEst->ave_enr_q, fr_bands_fx[0], q_fr_bands[0], &cor_map_sum_fx, NULL, &sp_div_fx, &Q_sp_div, &non_staX_fx, &loc_harm, - lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, extract_h( hFrontVad->hNoiseEst->Etot_l_lp_32fx ), hFrontVad->hNoiseEst->Etot_v_h2_fx, + lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, extract_h( hFrontVad->hNoiseEst->Etot_l_lp_32fx ), extract_h( hFrontVad->hNoiseEst->Etot_v_h2_32fx ), &hFrontVad->hNoiseEst->bg_cnt, st->lgBin_E_fx, &sp_floor, S_map_fx, NULL, hFrontVad, hFrontVad->ini_frame ); MVR2R_WORD16( st->pitch, st->pitch, 3 ); diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 733576975..4f178214f 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -361,13 +361,13 @@ void noise_est_init_ivas_fx( hNoiseEst->Etot_l_fx = 0; hNoiseEst->Etot_l_lp_32fx = 0; hNoiseEst->Etot_last_32fx = 0; - hNoiseEst->Etot_v_h2_fx = 0; + hNoiseEst->Etot_v_h2_32fx = 0; hNoiseEst->sign_dyn_lp_fx = 0; move16(); move16(); move16(); move16(); - move16(); + move32(); move32(); move32(); @@ -514,8 +514,8 @@ void noise_est_pre_32fx( move32(); hNoiseEst->Etot_last_32fx = Etot; // Q24 move32(); - hNoiseEst->Etot_v_h2_fx = 0; - move16(); + hNoiseEst->Etot_v_h2_32fx = 0; + move32(); Etot_lp_32fx = Etot; move32(); hNoiseEst->sign_dyn_lp_fx = 0; @@ -750,7 +750,7 @@ void noise_est_down_ivas_fx( Word16 *totalNoise, /* o : noise estimate over all critical bands */ Word32 Etot, /* i : Energy of current frame Q24*/ Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ - Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ + Word32 *Etot_v_h2 /* i/o: Energy variations of noise frames Q24 */ ) { @@ -773,7 +773,7 @@ void noise_est_down_ivas_fx( L_Etot = Etot; /*Q24 for later AR1 computations*/ move32(); L_Etot_last = *Etot_last; - L_Etot_v_h2 = L_shl( *Etot_v_h2, 16 ); + L_Etot_v_h2 = *Etot_v_h2; /*-----------------------------------------------------------------* * Estimate total noise energy @@ -901,7 +901,7 @@ void noise_est_down_ivas_fx( L_Etot_v_h2 = Madd_32_16( L_tmp, L_Etot_v_h2, 32113 /* 0.98 in Q15 */ ); // Q24 /* if (*Etot_v_h2 < 0.1f) { *Etot_v_h2 = 0.1f; } */ - *Etot_v_h2 = s_max( round_fx( L_Etot_v_h2 ), 26 /* 0.1 in Q8*/ ); // Q8 + *Etot_v_h2 = L_max( L_Etot_v_h2, 1677722 /* 0.1 in Q24*/ ); // Q24 move16(); return; @@ -3494,7 +3494,7 @@ void noise_est_ivas_fx( ) */ ELSE IF( ( LT_16( hNoiseEst->act_pred_fx, 26214 /* 0.8 in Q15*/ ) && ( ( aE_bgd != 0 ) || ( PAU != 0 ) ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 3277 /* 0.1 in q15*/ ) ) ) || ( ( LT_16( hNoiseEst->act_pred_fx, 22938 /* 0.70 in Q15 */ ) ) && ( ( aE_bgd != 0 ) || ( LT_16( non_staB, 17 * 256 /* 17.0 in Q8 */ ) ) ) && ( PAU != 0 ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 4915 /* 0.15 in Q15 */ ) ) ) || - ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) && GT_16( hNoiseEst->totalNoise_fx, 5 * 256 /* 5.0 in Q8 */ ) && LT_16( Etot, s_max( 1 * 256, add( Etot_l_lp, add( hNoiseEst->Etot_v_h2_fx, shr( hNoiseEst->Etot_v_h2_fx, 1 ) ) /* 1.5= 1.0+.5 */ ) ) ) ) || + ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) && GT_16( hNoiseEst->totalNoise_fx, 5 * 256 /* 5.0 in Q8 */ ) && LT_16( Etot, s_max( 1 * 256, add( Etot_l_lp, extract_h( L_add( hNoiseEst->Etot_v_h2_32fx, L_shr( hNoiseEst->Etot_v_h2_32fx, 1 ) ) ) /* 1.5= 1.0+.5 */ ) ) ) ) || ( GT_16( hNoiseEst->harm_cor_cnt, 50 ) && GT_16( hNoiseEst->first_noise_updt, 30 ) && ( aE_bgd != 0 ) && GT_16( hNoiseEst->lt_aEn_zero_fx, 16384 /*.5 in Q15*/ ) ) || ( tn_ini != 0 ) ) { updt_step = 3277; diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c index 91181714a..fdadcd318 100644 --- a/lib_enc/pitch_ol_fx.c +++ b/lib_enc/pitch_ol_fx.c @@ -1686,13 +1686,17 @@ void pitch_ol_ivas_fx( move16(); /* enr1 = dotp( pt2, pt2, len[j] ) + 0.01f; */ - temp = 167772 /*0.01f in Q24*/; + temp = 0; move64(); FOR( m = 0; m < len[j]; m++ ) { temp = W_mac0_16_16( temp, pt2[m], pt2[m] ); // 2*qwsp } + temp = W_shl( temp, sub( Q24, shl( qwsp, 1 ) ) ); // Q24 + + temp = W_add( temp, 167772 ); /*0.01f in Q24*/ + enr1_exp = W_norm( temp ); enr1 = W_extract_h( W_shl( temp, enr1_exp ) ); // enr1_exp+24-32 enr1_exp = sub( 39, enr1_exp ); // 31-(enr1_exp+24-32) @@ -1724,13 +1728,18 @@ void pitch_ol_ivas_fx( move16(); /* enr1 = dotp(pt4, pt4, len1[j]) + 0.01f; */ - temp = 167772 /*0.01f in Q24*/; + temp = 0; + move64(); move64(); FOR( m = 0; m < len1[j]; m++ ) { temp = W_mac0_16_16( temp, pt4[m], pt4[m] ); // 2*qwsp } + temp = W_shl( temp, sub( Q24, shl( qwsp, 1 ) ) ); // Q24 + + temp = W_add( temp, 167772 ); /*0.01f in Q24*/ + enr1_exp = W_norm( temp ); enr1 = W_extract_h( W_shl( temp, enr1_exp ) ); // enr1_exp+24-32 enr1_exp = sub( 39, enr1_exp ); // 31-(enr1_exp+24-32) diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 05bb16832..1d85ae6de 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -371,7 +371,7 @@ void noise_est_down_ivas_fx( Word16 *totalNoise, /* o : noise estimate over all critical bands */ Word32 Etot, /* i : Energy of current frame Q24*/ Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ - Word16 *Etot_v_h2 /* i/o: Energy variations of noise frames Q8 */ + Word32 *Etot_v_h2 /* i/o: Energy variations of noise frames Q24 */ ); void noise_est_fx( diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 3d6f23dd3..1097c6a27 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -224,7 +224,8 @@ typedef struct vad_structure Word16 trigger_SID; Word16 snr_sum_vad_fx; /*Q15 */ Word16 running_avg_fx; /*Q15 */ - Word32 L_snr_sum_vad_fx; /*Q4*/ + Word32 L_snr_sum_vad_fx; // EVS:Q4, IVAS:q_L_snr_sum_vad + Word16 q_L_snr_sum_vad; Word16 hangover_terminate_flag; /* CNG and DTX - flag indicating whether to early terminate DTX hangover */ Word16 vad_flag; /* VAD flag */ @@ -564,7 +565,8 @@ typedef struct noise_estimation_structure Word16 lt_aEn_zero_fx; /* Q15 */ Word16 Etot_v_h2_fx; - Word16 sign_dyn_lp_fx; /*Q8*/ + Word32 Etot_v_h2_32fx; /* Q24 */ + Word16 sign_dyn_lp_fx; /*Q8*/ Word16 Etot_st_est_fx; /* Q8 Noise estimation - short term estimate of E{ Etot } */ Word16 Etot_sq_st_est_fx; /* Q2 Noise estimation - short term estimate of E{ Etot^2 } */ diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 531265236..721a6e348 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -142,6 +142,8 @@ void wb_vad_init_ivas_fx( { hVAD->L_snr_sum_vad_fx = 0; move32(); + hVAD->q_L_snr_sum_vad = Q31; + move16(); hVAD->hangover_cnt = 0; move16(); /* Hangover counter initialized to 0 */ hVAD->nb_active_frames = ACTIVE_FRAMES_FX; @@ -1918,7 +1920,8 @@ Word16 wb_vad_ivas_fx( ) { Word16 i, flag = 0, hangover_short; - Word16 snr_sum, thr1 = 0, thr1_nb_mod, thr2 = 0, nk = 0, nc = 0, th_clean = 0; + Word16 snr_sum, thr1 = 0, thr1_nb_mod, thr2 = 0, nk = 0, th_clean = 0; + Word32 nc; Word16 lp_snr; /* Q8 */ const Word32 *pt1; const Word32 *pt2; @@ -1927,8 +1930,8 @@ Word16 wb_vad_ivas_fx( Word16 min_snr, sign_thr; Word32 L_snr, L_snr_sum; - Word32 ftmp, ftmp1, ftmp2; - Word16 m_noise_local, e_noise, e_num, m_num, snr_tmp, shift_snr, q_snr_tmp, q_snr; + Word32 ener, fr_enr, ftmp, ftmp1; + Word16 m_noise_local, e_noise, e_num, m_num, q_snr_tmp, q_snr; Word32 L_snr_tmp; Word16 snr_sumt; Word32 L_vad_thr; @@ -1947,7 +1950,7 @@ Word16 wb_vad_ivas_fx( Word16 nb_sig_snr; /* Q0 */ Word16 nv; - Word16 nv_ofs; /* Q8 */ + Word32 nv_ofs; /* Q24 */ Word32 L_snr_sum_HE_SAD; /* Q4 */ Word16 snr_sum_HE_SAD; /*Q8 log */ Word16 sign_thr_HE_SAD, min_snr_HE_SAD; @@ -1957,13 +1960,14 @@ Word16 wb_vad_ivas_fx( Word32 L_snr_sum_ol; Word16 snr_sum_ol; /* Q8 log */ - Word32 L_snr_outlier; + Word32 L_snr_outlier, L_snr_outlier_Q4; Word16 snr_outlier_index; Word32 L_accum_ener_L; Word32 L_accum_ener_H; Word16 vad_bwidth_fx; Word16 last_7k2_coder_type; - Word16 q_shift; + Word16 q_shift, q_ener, q_diff1, q_diff2; + Word16 q_L_snr_sum_ol, e_snr, f_snr; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); @@ -1978,7 +1982,7 @@ Word16 wb_vad_ivas_fx( move16(); /*thr1*/ move16(); /*thr2*/ move16(); /*nk*/ - move16(); /*nc*/ + move32(); /*nc*/ move16(); /*th_clean*/ move16(); /*flag*/ @@ -2051,12 +2055,12 @@ Word16 wb_vad_ivas_fx( { nk = 3277; move16(); /*0.1 Q15 */ - nc = 4122; - move16(); /*16.1 Q8 */ - nv = 525; - move16(); /* 2.05 Q8*/ - nv_ofs = 422; - move16(); /* 1.65 Q8*/ + nc = 270113178; + move32(); /*16.1 Q24 */ + nv = 8397; + move16(); /* 2.05 Q12*/ + nv_ofs = 27682406; + move32(); /* 1.65 Q24*/ th_clean = TH16_2_FX; move16(); /* 35 Q8 */ sign_thr = 21; @@ -2085,12 +2089,12 @@ Word16 wb_vad_ivas_fx( // move16(); nk = 3277; move16(); /* 0.1 Q15 */ - nc = 4096; - move16(); /* 16.0 Q8 */ - nv = 1024; - move16(); /* 4.0 Q8 */ - nv_ofs = 294; - move16(); /*1.15 Q8*/ + nc = 268435456; + move32(); /* 16.0 Q24 */ + nv = 16384; + move16(); /* 4.0 Q12 */ + nv_ofs = 19293798; + move32(); /*1.15 Q24*/ th_clean = TH8_1_FX; move16(); /*20 Q8 */ sign_thr = 28; @@ -2203,10 +2207,6 @@ Word16 wb_vad_ivas_fx( nb_sig_snr = 20; move16(); - pt1 = fr_bands; - pt2 = fr_bands + NB_BANDS; - pt3 = hNoiseEst->bckr_fx; - L_snr_sum = L_deposit_l( 0 ); L_snr_sum_HE_SAD = L_deposit_l( 0 ); Word16 q_snr_sum = 0; @@ -2226,81 +2226,89 @@ Word16 wb_vad_ivas_fx( q_snr = 0; move16(); move16(); - q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 14 - 4 ); + + pt1 = fr_bands; + pt2 = fr_bands + NB_BANDS; + pt3 = hNoiseEst->bckr_fx; + + q_ener = s_min( q_fr_bands, hNoiseEst->q_enrO ); + q_diff1 = sub( q_ener, hNoiseEst->q_enrO ); + q_diff2 = sub( q_ener, q_fr_bands ); + q_shift = add( Q31 + Q1, sub( q_ener, hNoiseEst->q_bckr ) ); + FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) { - ftmp = L_add( *pt1++, 0 ); - ftmp1 = L_add( *pt2++, 0 ); - ftmp2 = L_add( *pt3++, 0 ); + ener = L_shl( hNoiseEst->enrO_fx[i], q_diff1 ); // q_ener + ftmp = L_shl( *pt1++, q_diff2 ); // q_ener + ftmp1 = L_shl( *pt2++, q_diff2 ); // q_ener /*fr_enr = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 );*/ - L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 6554 ); /* L_tmp(high word) = Qenr0fx*Q15+1 -16 -> Qener0 */ - L_tmp1 = Madd_32_16( L_tmp, ftmp, 13107 ); /* 13107 = .4 in Q15 */ - L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 13107 ); /* L_tmp1 re_used a bit later for final snr[i]*/ - - L_tmp2 = Madd_32_16( L_tmp, ftmp, 9830 ); /* 9830 = 0.3 in Q15 */ - L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -16384 ); /* -16384= -0.5 in Q15 */ + L_tmp = Mpy_32_16_1( ener, 13107 /* 0.2 in Q16 */ ); // q_ener+1 + fr_enr = Madd_32_16( Madd_32_16( L_tmp, ftmp, 26214 /* 0.4 in Q16 */ ), ftmp1, 26214 /* 0.4 in Q16 */ ); // q_ener+1 IF( GT_32( ftmp, ftmp1 ) ) { - /*snr[i] = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 ) / ftmp2 ;*/ - /*snr[i] = L_tmp1/(ftmp2) */ - IF( ftmp2 != 0 ) + /* snr[i] = ( 0.2f * hNoiseEst->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 ) / *pt3++; */ + IF( *pt3 != 0 ) { - e_num = norm_l( L_tmp1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 - - e_noise = norm_l( ftmp2 ); - m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 + /* Since fr_enr = 0.2f * hNoiseEst->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 */ + e_num = sub( norm_l( fr_enr ), 1 ); + m_num = extract_h( L_shl( fr_enr, e_num ) ); // q_ener+1+e_num-16 - m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 - shift_snr = add( sub( e_num, e_noise ), q_shift ); + e_noise = norm_l( *pt3 ); + m_noise_local = extract_h( L_shl( *pt3++, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr = L_deposit_h( div_s( m_num, m_noise_local ) ); // 31+(q_ener+1+e_num-16)-(hNoiseEst->q_bckr+e_noise-16) + q_snr_tmp = add( q_shift, sub( e_num, e_noise ) ); } ELSE { - L_snr = L_shl_o( L_tmp1, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 + L_snr = Mpy_32_16_1( fr_enr, 18286 /* (1/E_MIN) in Q6 */ ); // q_ener+1+6-15 + q_snr_tmp = sub( q_ener, 8 ); } } ELSE { - /*snr[i] = ( 0.2f * st->enrO[i] + 0.3f * ftmp + 0.5f * ftmp1 ) / ftmp2 ;*/ - /*snr[i] =L_tmp2/( ftmp2 ) */ - IF( ftmp2 != 0 ) - { - e_num = norm_l( L_tmp2 ); - m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+e_num-16 + /* snr[i] = ( 0.2f * hNoiseEst->enrO[i] + 0.3f * ftmp + 0.5f * ftmp1 ) / *pt3++; */ + /* Since, L_tmp = 0.2f * hNoiseEst->enrO[i] */ + L_tmp = Msub_32_16( Madd_32_16( L_tmp, ftmp, 19661 /* 0.3 in Q16 */ ), ftmp1, -32768 /* -0.5 in Q16 */ ); // q_ener+1 - e_noise = norm_l( ftmp2 ); - m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 + IF( *pt3 != 0 ) + { + e_num = sub( norm_l( L_tmp ), 1 ); + m_num = extract_h( L_shl( L_tmp, e_num ) ); // q_ener+1+e_num-16 - m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 - shift_snr = add( sub( e_num, e_noise ), q_shift ); + e_noise = norm_l( *pt3 ); + m_noise_local = extract_h( L_shl( *pt3++, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr = L_deposit_h( div_s( m_num, m_noise_local ) ); // 31+(q_ener+1+e_num-16)-(hNoiseEst->q_bckr+e_noise-16) + q_snr_tmp = add( q_shift, sub( e_num, e_noise ) ); } ELSE { - L_snr = L_shl_o( L_tmp2, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 + L_snr = Mpy_32_16_1( L_tmp, 18286 /* (1/E_MIN) in Q6 */ ); // q_ener+1+6-15 + q_snr_tmp = sub( q_ener, 8 ); } } - IF( LT_32( L_snr, 2 * ( 1 << 4 ) ) ) + if ( LT_32( L_snr, L_shl_sat( 2, q_snr_tmp ) ) ) { nb_sig_snr = sub( nb_sig_snr, 1 ); /* nb_sig_snr--; */ } - L_snr = L_max( L_snr, 1 * ( 1 << 4 ) ); /* if ( snr[i] < 1 ){snr[i] = 1;}*/ - + IF( LT_32( L_snr, L_shl_sat( 1, q_snr_tmp ) ) ) + { + L_snr = ONE_IN_Q30; + q_snr_tmp = Q30; + move32(); + move16(); + } /* snr[i] = (float)log10(snr[i]); */ Word16 exp = norm_l( L_snr ); Word16 val = Log2_norm_lc( L_shl( L_snr, exp ) ); - exp = sub( sub( 30, exp ), Q4 ); - L_snr = L_mac( L_deposit_h( exp ), val, 1 ); // Q16 - L_snr = Mpy_32_16_1( L_snr, 9864 /* log2 in Q15 */ ); // Q16 + exp = sub( sub( 30, exp ), q_snr_tmp ); + L_snr = L_mac( val, exp, ONE_IN_Q14 ); // Q15 + L_snr = Mpy_32_16_1( L_snr, 19728 /* log2 in Q16 */ ); // Q16 /* snr_sumt += snr[i];*/ L_snr_sumt = L_add( L_snr_sumt, L_snr ); // Q16 @@ -2373,22 +2381,22 @@ Word16 wb_vad_ivas_fx( L_mssnr_hov = BASOP_Util_Add_Mant32Exp( L_mssnr_hov, L_mssnr_hov_e, L_msnr, L_msnr_e, &L_mssnr_hov_e ); /*L_mssnr_hov_e mssnr_hov += msnr; */ /* recompute after he1 modifications */ - /* snr[i] = fr_enr / st->bckr[i] = L_tmp1/st->bckr[i];*/ + /* snr[i] = fr_enr / st->bckr[i] ;*/ IF( hNoiseEst->bckr_fx[i] != 0 ) { - e_num = sub( norm_l( L_tmp1 ), 1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 + e_num = sub( norm_l( fr_enr ), 1 ); + m_num = extract_h( L_shl( fr_enr, e_num ) ); // q_ener+1+e_num-16 e_noise = norm_l( hNoiseEst->bckr_fx[i] ); m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - L_snr_tmp = L_deposit_h( div_s( m_num, m_noise_local ) ); // 32+q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise - q_snr_tmp = add( 31, sub( add( q_fr_bands, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); + L_snr_tmp = L_deposit_h( div_s( m_num, m_noise_local ) ); // 31+q_ener+1+e_num-hNoiseEst->q_bckr-e_noise + q_snr_tmp = add( 32, sub( add( q_ener, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); } ELSE { - L_snr_tmp = Mpy_32_16_1( L_tmp1, 18286 /* 1/E_MIN in Q6 */ ); // q_fr_bands-9 - q_snr_tmp = sub( q_fr_bands, 9 ); + L_snr_tmp = Mpy_32_16_1( fr_enr, 18286 /* 1/E_MIN in Q6 */ ); // q_ener+1+6-15 + q_snr_tmp = sub( q_ener, 8 ); } /* conditional snrsum, snr_sum = snr_sum + snr[i];*/ @@ -2446,11 +2454,9 @@ Word16 wb_vad_ivas_fx( move16(); } } /* end of band loop */ - L_snr_sum = L_shl_o( L_snr_sum, sub( 4, q_snr_sum ), &Overflow ); // q_snr_sum->q4 L_snr_sum_HE_SAD = L_shl_o( L_snr_sum_HE_SAD, sub( 4, q_snr_sum_HE_SAD ), &Overflow ); // q_snr_sum_HE_SAD->q4 - L_snr_outlier = L_shl_sat( L_snr_outlier, sub( Q4, q_snr ) ); // q_snr -> Q4 - snr_sumt = extract_h( L_shl( L_snr_sumt, Q4 ) ); // Q16 -> Q4 + snr_sumt = extract_h( L_shl( L_snr_sumt, Q4 ) ); // Q16 -> Q4 test(); test(); @@ -2482,51 +2488,66 @@ Word16 wb_vad_ivas_fx( } } + L_snr_outlier_Q4 = L_shl_sat( L_snr_outlier, sub( Q4, q_snr ) ); // Q4 /* Separated SNR_SUM outlier modification */ - L_snr_sum_ol = L_snr_sum; /* snr_sum_ol = snr_sum; */ + /* snr_sum_ol = snr_sum; */ + L_snr_sum_ol = L_snr_sum; // q_snr_sum + q_L_snr_sum_ol = q_snr_sum; move32(); + move16(); test(); test(); test(); - IF( ( EQ_16( st_fx->max_band, 19 ) ) && LT_32( L_snr_outlier, MAX_SNR_OUTLIER_3_FX ) && GT_16( snr_outlier_index, 3 ) && LT_16( snr_outlier_index, MAX_SNR_OUTLIER_IND_FX ) ) + IF( ( EQ_16( st_fx->max_band, 19 ) ) && LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_3_FX ) && GT_16( snr_outlier_index, 3 ) && LT_16( snr_outlier_index, MAX_SNR_OUTLIER_IND_FX ) ) { + q_L_snr_sum_ol = s_min( add( norm_l( L_snr_sum_ol ), q_snr_sum ), add( norm_l( L_snr_outlier ), q_snr ) ); + L_tmp1 = L_shl( L_snr_sum_ol, sub( q_L_snr_sum_ol, q_snr_sum ) ); // q_L_snr_sum_ol + L_tmp2 = L_shl( L_snr_outlier, sub( q_L_snr_sum_ol, q_snr ) ); // q_L_snr_sum_ol test(); test(); IF( LT_32( L_accum_ener_H, Mult_32_16( L_accum_ener_L, INV_OUTLIER_THR_1_FX ) ) /* float:: (accum_ener_L*INV_OUTLIER_THR_1 > accum_ener_H ) !!! */ - || LT_32( L_snr_outlier, MAX_SNR_OUTLIER_1_FX ) ) + || LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_1_FX ) ) { - /* as weight1 is 1.0 we do not need to multiply here , i.e. no need to loose any precisison */ - L_snr_sum_ol = L_sub( L_snr_sum_ol, L_snr_outlier ); /*Q4 */ + /* snr_sum_ol = SNR_OUTLIER_WGHT_1 * ( snr_sum_ol - snr_outlier ); + As SNR_OUTLIER_WGHT_1 is 1.0f we do not need to multiply here , i.e. no need to loose any precisison */ + L_snr_sum_ol = L_sub( L_tmp1, L_tmp2 ); // q_L_snr_sum_ol } ELSE IF( LT_32( L_accum_ener_H, Mult_32_16( L_accum_ener_L, INV_OUTLIER_THR_2_FX ) ) /* float:: (accum_ener_L *INV_OUTLIER_THR_2 > accum_ener_H ) !!! */ - || LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) + || LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_2_FX ) ) { - /* L_snr_sum = SNR_OUTLIER_WGHT_2 * (snr_sum - snr_outlier); */ - - /* 1.01*x -> (1*x + 0.01*x) to not drop down to Q3 */ - L_tmp = L_sub( L_snr_sum_ol, L_snr_outlier ); - L_tmp2 = Mult_32_16( L_tmp, 20972 ); /* 0.01(in Q21)= 20972 Q4*Q21+1-16 -> Q10 */ - L_snr_sum_ol = L_add( L_tmp, L_shr( L_tmp2, 6 ) ); /* Q4 */ + /* snr_sum_ol = SNR_OUTLIER_WGHT_2 * (snr_sum_ol - snr_outlier); */ + L_snr_sum_ol = Mpy_32_32( 1084479242 /* 1.01f in Q30 */, L_sub( L_tmp1, L_tmp2 ) ); // q_L_snr_sum_ol+30-31 + q_L_snr_sum_ol = sub( q_L_snr_sum_ol, 1 ); } ELSE { - /* L_snr_sum = SNR_OUTLIER_WGHT_3 * (snr_sum - snr_outlier);*/ - /* 1.02*x -> (1*x + 0.02*x) to not drop down to Q3 */ - L_tmp = L_sub( L_snr_sum_ol, L_snr_outlier ); - L_tmp2 = Mult_32_16( L_tmp, 20972 ); /* 0.02(in Q20)= 20972 Q4*Q20+1-16 -> Q9 */ - L_snr_sum_ol = L_add( L_tmp, L_shr( L_tmp2, 5 ) ); /* Q4 */ + /* snr_sum_ol = SNR_OUTLIER_WGHT_2 * (snr_sum_ol - snr_outlier); */ + L_snr_sum_ol = Mpy_32_32( 1095216660 /* 1.02f in Q30 */, L_sub( L_tmp1, L_tmp2 ) ); // q_L_snr_sum_ol+30-31 + q_L_snr_sum_ol = sub( q_L_snr_sum_ol, 1 ); } } /*st_fx->snr_sum_vad_fx = 0.5f * st->snr_sum_vad + 0.5f * snr_sum_ol;*/ - hVAD->L_snr_sum_vad_fx = L_shr( L_add_o( hVAD->L_snr_sum_vad_fx, L_snr_sum_ol, &Overflow ), 1 ); /*Q4*/ + q_snr_tmp = s_min( add( hVAD->q_L_snr_sum_vad, norm_l( hVAD->L_snr_sum_vad_fx ) ), add( norm_l( L_snr_sum_ol ), q_L_snr_sum_ol ) ); + /* 0.5f * st->snr_sum_vad */ + L_tmp1 = L_shl( hVAD->L_snr_sum_vad_fx, sub( sub( q_snr_tmp, 1 ), hVAD->q_L_snr_sum_vad ) ); // q_snr_tmp + /* 0.5f * snr_sum_ol */ + L_tmp2 = L_shl( L_snr_sum_ol, sub( sub( q_snr_tmp, 1 ), q_L_snr_sum_ol ) ); // q_snr_tmp + hVAD->L_snr_sum_vad_fx = L_add( L_tmp1, L_tmp2 ); // q_snr_tmp + hVAD->q_L_snr_sum_vad = q_snr_tmp; move32(); + move16(); /* snr_sum_ol = 10.0f * (float)log10( snr_sum_ol ); */ - snr_sum_ol = vad_snr_log_fx( L_snr_sum_ol, LG10 ); + e_snr = norm_l( L_snr_sum_ol ); + f_snr = Log2_norm_lc( L_shl( L_snr_sum_ol, e_snr ) ); // Q15 + e_snr = sub( sub( 30, e_snr ), q_L_snr_sum_ol ); + L_tmp = L_mac( f_snr, e_snr, ONE_IN_Q14 ); // Q15 + L_snr_sum_ol = Mpy_32_16_1( L_tmp, 24660 /* 10*log(2) in Q13 */ ); // Q13 + snr_sum_ol = extract_h( L_shl( L_snr_sum_ol, Q24 - Q13 ) ); // Q8 snr_sum = snr_sum_ol; move16(); /* note for NB no outlier modification */ @@ -2555,9 +2576,9 @@ Word16 wb_vad_ivas_fx( /*thr1 = nk * lp_snr + nc*1.0 + nv * ( st->Etot_v_h2 - nv_ofs); */ /* Linear function for noisy speech */ - L_tmp = L_shl( L_mult( sub( hNoiseEst->Etot_v_h2_fx, nv_ofs ), nv ), 7 ); /* Q8+Q8+1 +7 --> Q24 */ - L_tmp = L_mac( L_tmp, nc, (Word16) 32767 ); /* Q8+Q15+1 = Q24 */ - thr1 = mac_r( L_tmp, lp_snr, nk ); /* Q8+Q15+1 - 16 --> Q8 */ + L_tmp = L_shl( Mpy_32_16_1( L_sub( hNoiseEst->Etot_v_h2_32fx, nv_ofs ), nv ), 3 ); // Q24 (24+12-15+3) + L_tmp = L_add( L_tmp, nc ); // Q24 + thr1 = mac_r( L_tmp, lp_snr, nk ); // Q24 test(); IF( st_fx->element_mode > EVS_MONO && LT_16( hNoiseEst->first_noise_updt_cnt, 100 ) ) @@ -2624,33 +2645,38 @@ Word16 wb_vad_ivas_fx( test(); IF( ( LE_16( snr_outlier_index, 4 ) && ( st_fx->last_coder_type > UNVOICED ) && !st_fx->Opt_SC_VBR ) || ( LE_16( snr_outlier_index, 4 ) && ( last_7k2_coder_type > UNVOICED ) && st_fx->Opt_SC_VBR ) ) - - { - thr1_ol = sub( thr1_ol, (Word16) ( 1 << 8 ) ); /*thr1_ol = thr1 - 1.0f ; */ + /*thr1_ol = thr1 - 1.0f ; */ + thr1_ol = sub( thr1, ONE_IN_Q8 ); // Q8 + /*snr_sum_ol = 10.0f * (float)log10( hVAD->L_snr_sum_vad_fx );*/ - snr_sum_ol = vad_snr_log_fx( hVAD->L_snr_sum_vad_fx, LG10 ); /* snr in Q8 */ + e_snr = norm_l( hVAD->L_snr_sum_vad_fx ); + f_snr = Log2_norm_lc( L_shl( hVAD->L_snr_sum_vad_fx, e_snr ) ); // Q15 + e_snr = sub( sub( 30, e_snr ), hVAD->q_L_snr_sum_vad ); + L_tmp = L_mac( f_snr, e_snr, ONE_IN_Q14 ); // Q15 + L_snr_sum_ol = Mpy_32_16_1( L_tmp, 24660 /* 10*log(2) in Q13 */ ); // Q13 + snr_sum_ol = round_fx( L_shl( L_snr_sum_ol, Q24 - Q13 ) ); // Q8 } - ELSE IF( ( ( LE_16( st_fx->last_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR == 0 ) ) || - ( ( LE_16( last_7k2_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR != 0 ) ) ) - + ELSE IF( ( ( LE_16( st_fx->last_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR == 0 ) ) || + ( ( LE_16( last_7k2_coder_type, UNVOICED ) ) && ( LT_32( L_snr_outlier_Q4, MAX_SNR_OUTLIER_2_FX ) ) && ( st_fx->Opt_SC_VBR != 0 ) ) ) { /* thr1_ol = thr1 + (float)(1.0f - 0.04f * snr_outlier); */ - L_tmp2 = Msub_32_16( (Word32) ( 1 << ( 24 - 16 ) ), L_snr_outlier, 20972 ); /* (1.0)Q24(Q8 in high 32bit word) - Q4*Q19+1 */ - tmp2 = round_fx( L_shl( L_tmp2, 16 ) ); /* high word is in Q8 */ - thr1_ol = add( thr1_ol, tmp2 ); /* (Q8 , Q8) */ + L_tmp = Mpy_32_16_1( L_snr_outlier, 20972 /*0.04f in Q19*/ ); // q_snr+19-15 + L_tmp = L_shl( L_tmp, sub( Q24 - 4, q_snr ) ); // Q24 (24-(q_nsr+4)) + tmp2 = round_fx( L_sub( ONE_IN_Q24, L_tmp ) ); // Q8 + thr1_ol = add( thr1, tmp2 ); // Q8 } ELSE { - /*thr1_ol = thr1 + max(0, (float)(0.6f - 0.01f * L_snr_outlier)); */ - thr1_ol = thr1; - move16(); - L_tmp2 = Msub_32_16( (Word32) 614, L_snr_outlier, 20972 ); /* .6*1024= */ /* 0.6 Q26(Q10 in high word) - Q4*Q21+1 */ - tmp2 = round_fx( L_shl_o( L_tmp2, 14, &Overflow ) ); /* Q10(high word)+ 14 -16 --> Q8*/ - IF( L_tmp2 > 0 ) - { - thr1_ol = add( thr1_ol, tmp2 ); /* Q24 >>16 + Q8 */ - } + /*thr1_ol = thr1 + max(0, (float)(0.6f - 0.01f * snr_outlier)); */ + /* Saturation is added in the below step for 0.04f * snr_outlier in Q24. + In case of saturation, 0.04f * snr_outlier will be much greater than 0.6f and (0.6f - 0.01f * snr_outlier) becomes negative. + max(0, (float)(0.6f - 0.01f * snr_outlier)) gives zero. Hence addition of saturation has no impact */ + L_tmp = Mpy_32_16_1( L_snr_outlier, 20972 /*0.04f in Q21*/ ); // q_snr+21-15 + L_tmp = L_shl_sat( L_tmp, sub( Q24 - 6, q_snr ) ); // Q24 (24-(q_nsr+6)) + tmp2 = round_fx( L_sub( 10066330 /* 0.6 in Q24*/, L_tmp ) ); // Q8 + tmp2 = s_max( 0, tmp2 ); // Q8 + thr1_ol = add( thr1, tmp2 ); // Q8 } } -- GitLab From 0d81dfcd22ce7ba9e51ebc2b674238a55027bde0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 15 May 2025 12:44:47 +0530 Subject: [PATCH 0587/1310] Clang formatting changes --- lib_enc/stat_enc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 1097c6a27..caca3173e 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -565,8 +565,8 @@ typedef struct noise_estimation_structure Word16 lt_aEn_zero_fx; /* Q15 */ Word16 Etot_v_h2_fx; - Word32 Etot_v_h2_32fx; /* Q24 */ - Word16 sign_dyn_lp_fx; /*Q8*/ + Word32 Etot_v_h2_32fx; /* Q24 */ + Word16 sign_dyn_lp_fx; /*Q8*/ Word16 Etot_st_est_fx; /* Q8 Noise estimation - short term estimate of E{ Etot } */ Word16 Etot_sq_st_est_fx; /* Q2 Noise estimation - short term estimate of E{ Etot^2 } */ -- GitLab From 0bab7023b415c556ad5ba898472b6ce2cad2347f Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 15 May 2025 10:40:04 +0200 Subject: [PATCH 0588/1310] Increase headroom for ACELP ZIR in TCX/ACELP transition. --- lib_dec/dec_tcx_fx.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 1eee95a3b..1553664d5 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3450,7 +3450,18 @@ void IMDCT_ivas_fx( acelp_mem_len = 0; move16(); } + #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && ( LE_32( st->last_core_brate, SID_2k40 ) || st->last_core == ACELP_CORE ) && ( fullbandScale == 0 ) ) + { + /* Increase headroom because if the ACELP ZIR is used below, the synthesis filter gain is unknown. */ + IF ( allow_qwin_change ) { + allow_qwin_change = 0; + move16(); + q_win = s_max( -2, sub( q_win, 2 ) ); + } + } + IF( EQ_16( kernel_type, MDST_IV ) ) { TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, &q_win, allow_qwin_change ); -- GitLab From f67e5519cf5d942a4064961c1cc638d8a12b7215 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 15 May 2025 10:47:14 +0200 Subject: [PATCH 0589/1310] clang format --- lib_dec/dec_tcx_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 1553664d5..2637f52d7 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3455,7 +3455,8 @@ void IMDCT_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && ( LE_32( st->last_core_brate, SID_2k40 ) || st->last_core == ACELP_CORE ) && ( fullbandScale == 0 ) ) { /* Increase headroom because if the ACELP ZIR is used below, the synthesis filter gain is unknown. */ - IF ( allow_qwin_change ) { + IF( allow_qwin_change ) + { allow_qwin_change = 0; move16(); q_win = s_max( -2, sub( q_win, 2 ) ); -- GitLab From 7e2672a529a79cc7e8a5f1037fb6b8295926e431 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 15 May 2025 14:23:40 +0530 Subject: [PATCH 0590/1310] Fix for 3GPP issue 1531: Low-bitrate OMASA shows a bit high MLD (over 10) in BASOP decoder rendering to binaural Link #1531 --- lib_dec/FEC_clas_estim_fx.c | 16 ++++-- .../ivas_dirac_dec_binaural_functions_fx.c | 49 ++++++++++++++---- lib_rend/ivas_dirac_rend_fx.c | 51 ++++++++++++------- 3 files changed, 85 insertions(+), 31 deletions(-) diff --git a/lib_dec/FEC_clas_estim_fx.c b/lib_dec/FEC_clas_estim_fx.c index e56a77be1..2bd38153a 100644 --- a/lib_dec/FEC_clas_estim_fx.c +++ b/lib_dec/FEC_clas_estim_fx.c @@ -285,7 +285,17 @@ void FEC_clas_estim_fx( Corre( &pt1[pos], &pt1[pos - T0], T0, &cor_max[0] ); - T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + IF( NE_16( st_fx->element_mode, EVS_MONO ) ) + { + IF( LT_16( sub( pos, T0 ), sub( L_frame, L_SUBFR ) ) ) + { + T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + } + } + ELSE + { + T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + } pos_limit = sub( L_frame, L_SUBFR ); j = s_min( 1, s_max( 0, sub( pos, pos_limit ) ) ); Ltmp = L_deposit_l( cor_max[0] ); @@ -725,8 +735,8 @@ void FEC_clas_estim_fx( } /* Do the classification only - - MODE1: when the class is not transmitted in the bitstream - - MODE2: on good frames (classifier is also called for bfi=1) */ + - MODE1: when the class is not transmitted in the bitstream + - MODE2: on good frames (classifier is also called for bfi=1) */ /* update the memory of synthesis for frame class estimation */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 16fefa3bb..c47052d5f 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3584,24 +3584,53 @@ static void matrixTransp1Mul_fx( Word16 chA, chB; Word16 size = i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ); + Word64 tmp_outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word64 tmp_outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 q_tmp_outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 q_tmp_outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word64 tmp64_1, tmp64_2; + Word16 tmp16, q_common = 63; + move16(); + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { - outRe_fx[chA][chB] = Madd_32_32( Madd_32_32( Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bre_fx[0][chB] ), - Are_fx[1][chA], Bre_fx[1][chB] ), - Aim_fx[0][chA], Bim_fx[0][chB] ), - Aim_fx[1][chA], Bim_fx[1][chB] ); + tmp64_1 = W_mac_32_32( W_mult_32_32( Are_fx[0][chA], Bre_fx[0][chB] ), Are_fx[1][chA], Bre_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp64_2 = W_mac_32_32( W_mult_32_32( Aim_fx[0][chA], Bim_fx[0][chB] ), Aim_fx[1][chA], Bim_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp_outRe_fx[chA][chB] = W_add( tmp64_1, tmp64_2 ); // Q: add( add( q_A, q_B ), 1 ) + move64(); + tmp16 = W_norm( tmp_outRe_fx[chA][chB] ); + tmp_outRe_fx[chA][chB] = W_shl( tmp_outRe_fx[chA][chB], tmp16 ); // Q:add( tmp16, add( add( q_A, q_B ), 1 ) ) + move64(); + q_tmp_outRe_fx[chA][chB] = add( tmp16, add( add( q_A, q_B ), 1 ) ); + move16(); + q_common = s_min( q_tmp_outRe_fx[chA][chB], q_common ); + + + tmp64_1 = W_mac_32_32( W_mult_32_32( Are_fx[0][chA], Bim_fx[0][chB] ), Are_fx[1][chA], Bim_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp64_2 = W_mac_32_32( W_mult_32_32( Aim_fx[0][chA], Bre_fx[0][chB] ), Aim_fx[1][chA], Bre_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp_outIm_fx[chA][chB] = W_sub( tmp64_1, tmp64_2 ); // Q: add( add( q_A, q_B ), 1 ) + move64(); + tmp16 = W_norm( tmp_outIm_fx[chA][chB] ); + tmp_outIm_fx[chA][chB] = W_shl( tmp_outIm_fx[chA][chB], tmp16 ); // Q:add( tmp16, add( add( q_A, q_B ), 1 ) ) + move64(); + q_tmp_outIm_fx[chA][chB] = add( tmp16, add( add( q_A, q_B ), 1 ) ); + move16(); + q_common = s_min( q_tmp_outIm_fx[chA][chB], q_common ); + } + } + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe_fx[chA][chB] = W_extract_h( W_shl( tmp_outRe_fx[chA][chB], sub( q_common, q_tmp_outRe_fx[chA][chB] ) ) ); move32(); - outIm_fx[chA][chB] = Msub_32_32( Msub_32_32( Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bim_fx[0][chB] ), - Are_fx[1][chA], Bim_fx[1][chB] ), - Aim_fx[0][chA], Bre_fx[0][chB] ), - Aim_fx[1][chA], Bre_fx[1][chB] ); + outIm_fx[chA][chB] = W_extract_h( W_shl( tmp_outIm_fx[chA][chB], sub( q_common, q_tmp_outIm_fx[chA][chB] ) ) ); move32(); } } - *q_out = sub( add( q_A, q_B ), 31 ); - + *q_out = sub( q_common, 32 ); move16(); if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) { diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 06b37ff5a..063c70f66 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -1754,7 +1754,7 @@ void protoSignalComputation2_fx( Word32 RealSubtract_fx, ImagSubtract_fx; Word32 left_bb_power_fx, right_bb_power_fx, total_bb_power_fx, lr_bb_power_fx; Word32 left_hi_power_fx, right_hi_power_fx, total_hi_power_fx, lr_hi_power_fx; - Word32 sum_power_fx, Left_power_fx, Right_power_fx; + Word32 sum_power_fx, Left_power_fx, Right_power_fx, Total_power_fx; Word16 q_lr_bb_power, q_lr_hi_power; Word32 lr_total_bb_ratio_fx, lr_total_hi_ratio_fx; Word32 min_sum_total_ratio_fx, min_sum_total_ratio_db_fx; @@ -2120,7 +2120,10 @@ void protoSignalComputation2_fx( #else q_Left_Right_power = add( shl( add( q_cldfb, min_q_shift ), 1 ), sub( head_room, 32 ) ); #endif - + Word16 exp_left_hi_power = 0, exp_right_hi_power = 0, exp_total_hi_power = 0, exp_temppp; + move16(); + move16(); + move16(); FOR( l = 0; l < num_freq_bands; l++ ) { #ifdef FIX_867_CLDFB_NRG_SCALE @@ -2164,19 +2167,30 @@ void protoSignalComputation2_fx( left_bb_power_fx = L_add( left_bb_power_fx, Left_power_fx ); // q_Left_Right_power right_bb_power_fx = L_add( right_bb_power_fx, Right_power_fx ); // q_Left_Right_power // total_bb_power_fx = L_add( total_bb_power_fx, reference_power_fx[l] ); - total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power + total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power #endif - IF( GT_16( l, MASA_HI_FREQ_START_BIN ) ) { - left_hi_power_fx = L_add( left_hi_power_fx, Left_power_fx ); // q_Left_Right_power - right_hi_power_fx = L_add( right_hi_power_fx, Right_power_fx ); // q_Left_Right_power - // total_hi_power_fx = L_add( total_hi_power_fx, reference_power_fx[l] ); -#ifdef FIX_867_CLDFB_NRG_SCALE - total_hi_power_fx = L_add( total_hi_power_fx, W_extract_h( W_shl( reference_power_64fx[l], sub( head_room, total_shift[qidx] ) ) ) ); // q_Left_Right_power -#else - total_hi_power_fx = L_add( total_hi_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power -#endif + W_tmp1 = W_add( W_mult0_32_32( RealBuffer_fx[0][0][l], RealBuffer_fx[0][0][l] ), W_mult0_32_32( ImagBuffer_fx[0][0][l], ImagBuffer_fx[0][0][l] ) ); + q_shift = W_norm( W_tmp1 ); + Left_power_fx = W_extract_h( W_shl( W_tmp1, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + left_hi_power_fx = BASOP_Util_Add_Mant32Exp( left_hi_power_fx, exp_left_hi_power, Left_power_fx, exp_temppp, &exp_left_hi_power ); // exp:exp_left_hi_power + + W_tmp2 = W_add( W_mult0_32_32( RealBuffer_fx[1][0][l], RealBuffer_fx[1][0][l] ), W_mult0_32_32( ImagBuffer_fx[1][0][l], ImagBuffer_fx[1][0][l] ) ); + q_shift = W_norm( W_tmp2 ); + Right_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + right_hi_power_fx = BASOP_Util_Add_Mant32Exp( right_hi_power_fx, exp_right_hi_power, Right_power_fx, exp_temppp, &exp_right_hi_power ); // exp:exp_right_hi_power + + W_tmp2 = W_add( W_tmp1, W_tmp2 ); + q_shift = W_norm( W_tmp2 ); + Total_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + total_hi_power_fx = BASOP_Util_Add_Mant32Exp( total_hi_power_fx, exp_total_hi_power, Total_power_fx, exp_temppp, &exp_total_hi_power ); // exp:exp_total_hi_power } IF( LT_16( l, s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) ) @@ -2185,8 +2199,8 @@ void protoSignalComputation2_fx( re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift[0] ) ); // q_cldfb+temp_q_shift im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift[0] ) ); // q_cldfb+temp_q_shift #else - re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift - im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift + re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift + im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift #endif sum_power_fx = Madd_32_32( Mpy_32_32( re_aux, re_aux ), im_aux, im_aux ); // 2*(q_cldfb+temp_q_shift)-31 @@ -2216,7 +2230,7 @@ void protoSignalComputation2_fx( move32(); } #else - temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31 + temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31 IF( LT_16( q_temp, stereo_type_detect->q_total_power ) ) { stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp ) ) ); // q_temp @@ -2704,15 +2718,16 @@ void protoSignalComputation2_fx( lr_total_bb_ratio_fx = Mpy_32_16_1( temp, 20480 ); // Q21 #ifdef FIX_867_CLDFB_NRG_SCALE - stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); + stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), exp_left_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); move32(); stereo_type_detect->q_left_hi_power = sub( 31, stereo_type_detect->q_left_hi_power ); move16(); - stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power ); + + stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), exp_right_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power ); move32(); stereo_type_detect->q_right_hi_power = sub( 31, stereo_type_detect->q_right_hi_power ); move16(); - stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power ); + stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), exp_total_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power ); move32(); #else stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); -- GitLab From dd2dc9c9d2b82b9a51bae57f11211c15c46cbedb Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 25 Apr 2025 09:56:03 +0200 Subject: [PATCH 0591/1310] replaced the down mix channel floating point code with 64 bit fix point. WMOPS went from total 150.00 263.631 365.398 357.230 to total 150.00 244.736 315.064 308.406 for ./IVAS_cod -mc 7_1_4 128000 48 scripts/testv/stv714MC48c.wav out.128 --- lib_enc/ivas_mc_param_enc_fx.c | 123 +++++++++++++++++++++++++++------ 1 file changed, 103 insertions(+), 20 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 0c996b25a..e8e3fd61a 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -29,7 +29,8 @@ the United Nations Convention on Contracts on the International Sales of Goods. *******************************************************************************************************/ - +#define MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#define CONVERT64( x_64, y_fx, y_e ) { Word16 norm; norm=W_norm(x_64); y_fx = W_extract_h( W_shl( x_64, norm ) ); y_e = sub( sub( 35, gb ), norm ); } #include #include #include "options.h" @@ -649,10 +650,15 @@ static void ivas_param_mc_param_est_enc_fx( Word32 *p_slot_frame_f_real_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - real part */ Word32 *p_slot_frame_f_imag_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - imag part */ +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + Word64 dmx_real_64[PARAM_MC_MAX_TRANSPORT_CHANS]; + Word64 dmx_imag_64[PARAM_MC_MAX_TRANSPORT_CHANS]; +#else Word32 dmx_real_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Real Part */ Word16 dmx_real_e[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Real Part */ Word32 dmx_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Imag Part */ Word16 dmx_imag_e[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Imag Part */ +#endif Word32 a_fx, b_fx, c_fx, d_fx; /* Tmp complex values */ Word16 a_e, b_e, c_e, d_e; /* Tmp complex values */ #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE @@ -774,6 +780,26 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + Word64 real_64; + Word64 imag_64; + + real_64 = 0; + imag_64 = 0; + move64(); + move64(); + FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) + { + real_64 = W_add( real_64, W_mult0_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); + imag_64 = W_add( imag_64, W_mult0_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); + p_dmx_fac_fx++; + } + dmx_real_64[ch_idx1] = real_64; + dmx_imag_64[ch_idx1] = imag_64; + move64(); + move64(); + +#else #ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE dmx_real_fx[ch_idx1] = 0; move32(); @@ -814,14 +840,33 @@ static void ivas_param_mc_param_est_enc_fx( move16(); move32(); move16(); +#endif + #endif } /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + CONVERT64(dmx_real_64[ch_idx1], a_fx, a_e ); + CONVERT64(dmx_imag_64[ch_idx1], b_fx, b_e ); + move32(); + move32(); + move16(); + move16(); +#endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + CONVERT64(dmx_real_64[ch_idx2], c_fx, c_e ); + CONVERT64(dmx_imag_64[ch_idx2], d_fx, d_e ); + move32(); + move32(); + move16(); + move16(); + +#else a_fx = dmx_real_fx[ch_idx1]; move32(); a_e = dmx_real_e[ch_idx1]; @@ -838,6 +883,7 @@ static void ivas_param_mc_param_est_enc_fx( move32(); d_e = dmx_imag_e[ch_idx2]; move16(); +#endif /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); @@ -858,7 +904,6 @@ static void ivas_param_mc_param_est_enc_fx( move32(); FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { - Word16 norm; c_fx = slot_frame_f_real_fx[ch_idx2][cur_cldfb_band]; d_fx = slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band]; move32(); @@ -870,10 +915,6 @@ static void ivas_param_mc_param_est_enc_fx( W_sub( W_mult0_32_32( a_fx, d_fx ), W_mult0_32_32( b_fx, c_fx ) ) ); move64(); - // convert the 64 bit fixpoint back into the 48 bit float format - norm = W_norm( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] ); - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = W_extract_h( W_shl( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], norm ) ); - Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] = sub( sub( 62, gb ), norm ); } } #else @@ -953,6 +994,26 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + Word64 real_64; + Word64 imag_64; + + real_64 = 0; + imag_64 = 0; + move64(); + move64(); + + FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) + { + real_64 = W_add( real_64, W_mult0_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); + imag_64 = W_add( imag_64, W_mult0_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ) ); + p_dmx_fac_fx++; + } + dmx_real_64[ch_idx1] = real_64; + dmx_imag_64[ch_idx1] = imag_64; + move64(); + move64(); +#else #ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE dmx_real_fx[ch_idx1] = 0; move32(); @@ -997,12 +1058,22 @@ static void ivas_param_mc_param_est_enc_fx( move32(); dmx_imag_e[ch_idx1] = imag_e; move16(); +#endif + #endif } /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + CONVERT64( dmx_real_64[ch_idx1], a_fx, a_e ); + CONVERT64( dmx_imag_64[ch_idx1], b_fx, b_e ); + move32(); + move32(); + move16(); + move16(); +#else #ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE a_fx = dmx_real_fx[ch_idx1]; move32(); @@ -1012,9 +1083,24 @@ static void ivas_param_mc_param_est_enc_fx( move32(); b_e = dmx_imag_e[ch_idx1]; move16(); +#endif + #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + CONVERT64( dmx_real_64[ch_idx2], c_fx, c_e ); + CONVERT64( dmx_imag_64[ch_idx2], d_fx, d_e ); + move32(); + move32(); + move16(); + move16(); + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); + Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cx_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, + &Cx_sum_e[cur_param_band][ch_idx1][ch_idx2] ); +#else #ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE a_fx = dmx_real_fx[ch_idx1]; move32(); @@ -1042,6 +1128,7 @@ static void ivas_param_mc_param_est_enc_fx( L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, dmx_real_fx[ch_idx2] ), add( a_e, dmx_real_e[ch_idx2] ), Mpy_32_32( b_fx, dmx_imag_fx[ch_idx2] ), add( b_e, dmx_imag_e[ch_idx2] ), &tmp_e ); Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cx_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, &Cx_sum_e[cur_param_band][ch_idx1][ch_idx2] ); +#endif #endif move32(); } @@ -1075,7 +1162,6 @@ static void ivas_param_mc_param_est_enc_fx( move32(); FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { - Word16 norm; c_fx = slot_frame_f_real_fx[ch_idx2][cur_cldfb_band]; d_fx = slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band]; move32(); @@ -1084,10 +1170,6 @@ static void ivas_param_mc_param_est_enc_fx( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] = W_add( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], W_add( W_mult0_32_32( a_fx, c_fx ), W_mult0_32_32( b_fx, d_fx ) ) ); move64(); - // convert the 64 bit fixpoint back into the 48 bit float format - norm = W_norm( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] ); - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = W_extract_h( W_shl( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], norm ) ); - Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] = sub( sub( 62, gb ), norm ); } #else FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) @@ -1135,14 +1217,6 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { - Cy_sum_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move32(); - Cy_sum_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move16(); - Cy_sum_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move32(); - Cy_sum_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move16(); #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Cy_sum_real_64[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; move64(); @@ -1153,6 +1227,14 @@ static void ivas_param_mc_param_est_enc_fx( Cy_sum_imag_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; move64(); #else + Cy_sum_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; + move32(); + Cy_sum_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; + move16(); + Cy_sum_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; + move32(); + Cy_sum_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; + move16(); Cy_sum_imag_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; move32(); Cy_sum_imag_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; @@ -1174,7 +1256,7 @@ static void ivas_param_mc_param_est_enc_fx( move64(); Cy_sum_real_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; move64(); -#endif +#else Cy_sum_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; move32(); Cy_sum_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; @@ -1183,6 +1265,7 @@ static void ivas_param_mc_param_est_enc_fx( move32(); Cy_sum_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; move16(); +#endif } } } -- GitLab From dcb916fba996abeea2e53e2a2097283282b6dc6a Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 25 Apr 2025 10:03:19 +0200 Subject: [PATCH 0592/1310] applied the clang patch --- lib_enc/ivas_mc_param_enc_fx.c | 37 +++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index e8e3fd61a..270fbeebd 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -29,8 +29,14 @@ the United Nations Convention on Contracts on the International Sales of Goods. *******************************************************************************************************/ -#define MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE -#define CONVERT64( x_64, y_fx, y_e ) { Word16 norm; norm=W_norm(x_64); y_fx = W_extract_h( W_shl( x_64, norm ) ); y_e = sub( sub( 35, gb ), norm ); } +#define MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#define CONVERT64( x_64, y_fx, y_e ) \ + { \ + Word16 norm; \ + norm = W_norm( x_64 ); \ + y_fx = W_extract_h( W_shl( x_64, norm ) ); \ + y_e = sub( sub( 35, gb ), norm ); \ + } #include #include #include "options.h" @@ -650,7 +656,7 @@ static void ivas_param_mc_param_est_enc_fx( Word32 *p_slot_frame_f_real_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - real part */ Word32 *p_slot_frame_f_imag_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - imag part */ -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE Word64 dmx_real_64[PARAM_MC_MAX_TRANSPORT_CHANS]; Word64 dmx_imag_64[PARAM_MC_MAX_TRANSPORT_CHANS]; #else @@ -659,8 +665,8 @@ static void ivas_param_mc_param_est_enc_fx( Word32 dmx_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Imag Part */ Word16 dmx_imag_e[PARAM_MC_MAX_TRANSPORT_CHANS]; /* Downmix channel - Imag Part */ #endif - Word32 a_fx, b_fx, c_fx, d_fx; /* Tmp complex values */ - Word16 a_e, b_e, c_e, d_e; /* Tmp complex values */ + Word32 a_fx, b_fx, c_fx, d_fx; /* Tmp complex values */ + Word16 a_e, b_e, c_e, d_e; /* Tmp complex values */ #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word64 Cy_sum_real_64[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; Word64 Cy_sum_imag_64[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; @@ -780,7 +786,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE Word64 real_64; Word64 imag_64; @@ -848,9 +854,9 @@ static void ivas_param_mc_param_est_enc_fx( /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE - CONVERT64(dmx_real_64[ch_idx1], a_fx, a_e ); - CONVERT64(dmx_imag_64[ch_idx1], b_fx, b_e ); +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + CONVERT64( dmx_real_64[ch_idx1], a_fx, a_e ); + CONVERT64( dmx_imag_64[ch_idx1], b_fx, b_e ); move32(); move32(); move16(); @@ -858,9 +864,9 @@ static void ivas_param_mc_param_est_enc_fx( #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE - CONVERT64(dmx_real_64[ch_idx2], c_fx, c_e ); - CONVERT64(dmx_imag_64[ch_idx2], d_fx, d_e ); +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE + CONVERT64( dmx_real_64[ch_idx2], c_fx, c_e ); + CONVERT64( dmx_imag_64[ch_idx2], d_fx, d_e ); move32(); move32(); move16(); @@ -914,7 +920,6 @@ static void ivas_param_mc_param_est_enc_fx( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2] = W_add( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2], W_sub( W_mult0_32_32( a_fx, d_fx ), W_mult0_32_32( b_fx, c_fx ) ) ); move64(); - } } #else @@ -994,7 +999,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE Word64 real_64; Word64 imag_64; @@ -1066,7 +1071,7 @@ static void ivas_param_mc_param_est_enc_fx( /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE CONVERT64( dmx_real_64[ch_idx1], a_fx, a_e ); CONVERT64( dmx_imag_64[ch_idx1], b_fx, b_e ); move32(); @@ -1088,7 +1093,7 @@ static void ivas_param_mc_param_est_enc_fx( #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE CONVERT64( dmx_real_64[ch_idx2], c_fx, c_e ); CONVERT64( dmx_imag_64[ch_idx2], d_fx, d_e ); move32(); -- GitLab From 17ea3a460bdc04b7a9bd55d8cc947e792dfcaefe Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 25 Apr 2025 10:13:55 +0200 Subject: [PATCH 0593/1310] removed a warning. --- lib_enc/ivas_mc_param_enc_fx.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 270fbeebd..f7f274b48 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -752,7 +752,10 @@ static void ivas_param_mc_param_est_enc_fx( #if defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE ) || defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE ) Word16 gb = find_guarded_bits_fx( l_ts ); +#ifndef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE Word16 add20gb = add( 20, gb ); +#endif + #endif FOR( ts = start_ts; ts < num_time_slots; ts++ ) -- GitLab From 0f7493762b47726945321f8656eb9462934a8a6d Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 25 Apr 2025 12:49:17 +0200 Subject: [PATCH 0594/1310] moved the define for the merge request into options.h. --- lib_com/options.h | 1 + lib_enc/ivas_mc_param_enc_fx.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index cbc77b6e7..8cb4f0368 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,6 +86,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ +#define MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of dmx calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Requires MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index f7f274b48..184a982d5 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -29,7 +29,6 @@ the United Nations Convention on Contracts on the International Sales of Goods. *******************************************************************************************************/ -#define MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE #define CONVERT64( x_64, y_fx, y_e ) \ { \ Word16 norm; \ -- GitLab From 5babfdc8bba989670937eef2dd6d8f3ae5e4a0f3 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Mon, 28 Apr 2025 10:32:56 +0200 Subject: [PATCH 0595/1310] macro names. --- lib_com/options.h | 2 +- lib_enc/ivas_mc_param_enc_fx.c | 60 ++++++++++++++++------------------ 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8cb4f0368..1b5760f40 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,7 +86,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ -#define MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of dmx calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Requires MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ +#define MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of dmx calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Requires MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 184a982d5..41d15c241 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -29,7 +29,16 @@ the United Nations Convention on Contracts on the International Sales of Goods. *******************************************************************************************************/ -#define CONVERT64( x_64, y_fx, y_e ) \ + +// helper macros to convert the 64 bitt accumulators into the 48 bit float format +#define CONVERT_CY( x_64, y_fx, y_e ) \ + { \ + Word16 norm; \ + norm = W_norm( x_64 ); \ + y_fx = W_extract_h( W_shl( x_64, norm ) ); \ + y_e = sub( sub( 62, gb ), norm ); \ + } +#define CONVERT_DMX( x_64, y_fx, y_e ) \ { \ Word16 norm; \ norm = W_norm( x_64 ); \ @@ -655,7 +664,7 @@ static void ivas_param_mc_param_est_enc_fx( Word32 *p_slot_frame_f_real_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - real part */ Word32 *p_slot_frame_f_imag_fx[MAX_CICP_CHANNELS]; /* Output of the MDFT FB - imag part */ -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word64 dmx_real_64[PARAM_MC_MAX_TRANSPORT_CHANS]; Word64 dmx_imag_64[PARAM_MC_MAX_TRANSPORT_CHANS]; #else @@ -751,7 +760,7 @@ static void ivas_param_mc_param_est_enc_fx( #if defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE ) || defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE ) Word16 gb = find_guarded_bits_fx( l_ts ); -#ifndef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifndef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word16 add20gb = add( 20, gb ); #endif @@ -788,7 +797,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word64 real_64; Word64 imag_64; @@ -856,9 +865,9 @@ static void ivas_param_mc_param_est_enc_fx( /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE - CONVERT64( dmx_real_64[ch_idx1], a_fx, a_e ); - CONVERT64( dmx_imag_64[ch_idx1], b_fx, b_e ); +#ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE + CONVERT_DMX( dmx_real_64[ch_idx1], a_fx, a_e ); + CONVERT_DMX( dmx_imag_64[ch_idx1], b_fx, b_e ); move32(); move32(); move16(); @@ -866,9 +875,9 @@ static void ivas_param_mc_param_est_enc_fx( #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE - CONVERT64( dmx_real_64[ch_idx2], c_fx, c_e ); - CONVERT64( dmx_imag_64[ch_idx2], d_fx, d_e ); +#ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE + CONVERT_DMX( dmx_real_64[ch_idx2], c_fx, c_e ); + CONVERT_DMX( dmx_imag_64[ch_idx2], d_fx, d_e ); move32(); move32(); move16(); @@ -1001,7 +1010,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE +#ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word64 real_64; Word64 imag_64; @@ -1073,9 +1082,9 @@ static void ivas_param_mc_param_est_enc_fx( /* Cx for transport channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_transport; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE - CONVERT64( dmx_real_64[ch_idx1], a_fx, a_e ); - CONVERT64( dmx_imag_64[ch_idx1], b_fx, b_e ); +#ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE + CONVERT_DMX( dmx_real_64[ch_idx1], a_fx, a_e ); + CONVERT_DMX( dmx_imag_64[ch_idx1], b_fx, b_e ); move32(); move32(); move16(); @@ -1095,9 +1104,9 @@ static void ivas_param_mc_param_est_enc_fx( #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { -#ifdef MERGE_REQUEST_1472_SPEEDUIP_ivas_mc_param_enc_fx_NONBE - CONVERT64( dmx_real_64[ch_idx2], c_fx, c_e ); - CONVERT64( dmx_imag_64[ch_idx2], d_fx, d_e ); +#ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE + CONVERT_DMX( dmx_real_64[ch_idx2], c_fx, c_e ); + CONVERT_DMX( dmx_imag_64[ch_idx2], d_fx, d_e ); move32(); move32(); move16(); @@ -1310,11 +1319,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( k = 0; k < nchan_input; ++k ) { #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE - Word16 norm; - // convert the 64 bit fixpoint back into the 48 bit float format - norm = W_norm( Cy_sum_real_64[cur_param_band][k][k] ); - Nrg_fx[k] = W_extract_h( W_shl( Cy_sum_real_64[cur_param_band][k][k], norm ) ); - Nrg_e[k] = sub( sub( 62, gb ), norm ); + CONVERT_CY( Cy_sum_real_64[cur_param_band][k][k], Nrg_fx[k], Nrg_e[k] ); #else Nrg_fx[k] = Cy_sum_fx[cur_param_band][k][k]; move32(); @@ -1451,10 +1456,7 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = 0; ch_idx2 < MAX_CICP_CHANNELS; ch_idx2++ ) { - Word16 norm; - norm = W_norm( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] ); - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = W_extract_h( W_shl( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], norm ) ); - Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] = sub( sub( 62, gb ), norm ); + CONVERT_CY( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); } } } @@ -1497,11 +1499,7 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ch_idx2++ ) { #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE - Word16 norm; - // convert the 64 bit fixpoint back into the 48 bit float format - norm = W_norm( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2] ); - imag_part_fx = W_extract_h( W_shl( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2], norm ) ); - imag_part_e = sub( sub( 62, gb ), norm ); + CONVERT_CY( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2], imag_part_fx, imag_part_e ); #else imag_part_fx = Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2]; move32(); -- GitLab From 5251c4791f48fa8ded63157ade33db356f7a9c8b Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Mon, 28 Apr 2025 10:42:27 +0200 Subject: [PATCH 0596/1310] clang patch applied. --- lib_enc/ivas_mc_param_enc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 41d15c241..41d35f8e3 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -31,14 +31,14 @@ *******************************************************************************************************/ // helper macros to convert the 64 bitt accumulators into the 48 bit float format -#define CONVERT_CY( x_64, y_fx, y_e ) \ +#define CONVERT_CY( x_64, y_fx, y_e ) \ { \ Word16 norm; \ norm = W_norm( x_64 ); \ y_fx = W_extract_h( W_shl( x_64, norm ) ); \ y_e = sub( sub( 62, gb ), norm ); \ } -#define CONVERT_DMX( x_64, y_fx, y_e ) \ +#define CONVERT_DMX( x_64, y_fx, y_e ) \ { \ Word16 norm; \ norm = W_norm( x_64 ); \ -- GitLab From 43fb033f99043f6723c40178cb5916e183dd7ed5 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Tue, 29 Apr 2025 10:56:24 +0200 Subject: [PATCH 0597/1310] applied some patches. --- lib_enc/ivas_mc_param_enc_fx.c | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 41d35f8e3..bf7e49cbb 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -36,14 +36,14 @@ Word16 norm; \ norm = W_norm( x_64 ); \ y_fx = W_extract_h( W_shl( x_64, norm ) ); \ - y_e = sub( sub( 62, gb ), norm ); \ + y_e = sub( sub62gb, norm ); \ } #define CONVERT_DMX( x_64, y_fx, y_e ) \ { \ Word16 norm; \ norm = W_norm( x_64 ); \ y_fx = W_extract_h( W_shl( x_64, norm ) ); \ - y_e = sub( sub( 35, gb ), norm ); \ + y_e = sub( sub35gb, norm ); \ } #include #include @@ -678,6 +678,8 @@ static void ivas_param_mc_param_est_enc_fx( #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word64 Cy_sum_real_64[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; Word64 Cy_sum_imag_64[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; + Word16 sub62gb; + Word16 sub35gb; #else Word32 Cy_sum_imag_fx[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; Word16 Cy_sum_imag_e[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; @@ -764,6 +766,10 @@ static void ivas_param_mc_param_est_enc_fx( Word16 add20gb = add( 20, gb ); #endif +#endif +#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE + sub35gb = sub( 35, find_guarded_bits_fx( l_ts ) ); + sub62gb = sub( 62, find_guarded_bits_fx( l_ts ) ); #endif FOR( ts = start_ts; ts < num_time_slots; ts++ ) @@ -868,21 +874,12 @@ static void ivas_param_mc_param_est_enc_fx( #ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_DMX( dmx_real_64[ch_idx1], a_fx, a_e ); CONVERT_DMX( dmx_imag_64[ch_idx1], b_fx, b_e ); - move32(); - move32(); - move16(); - move16(); #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) { #ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_DMX( dmx_real_64[ch_idx2], c_fx, c_e ); CONVERT_DMX( dmx_imag_64[ch_idx2], d_fx, d_e ); - move32(); - move32(); - move16(); - move16(); - #else a_fx = dmx_real_fx[ch_idx1]; move32(); @@ -1085,10 +1082,6 @@ static void ivas_param_mc_param_est_enc_fx( #ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_DMX( dmx_real_64[ch_idx1], a_fx, a_e ); CONVERT_DMX( dmx_imag_64[ch_idx1], b_fx, b_e ); - move32(); - move32(); - move16(); - move16(); #else #ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE a_fx = dmx_real_fx[ch_idx1]; @@ -1107,10 +1100,6 @@ static void ivas_param_mc_param_est_enc_fx( #ifdef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_DMX( dmx_real_64[ch_idx2], c_fx, c_e ); CONVERT_DMX( dmx_imag_64[ch_idx2], d_fx, d_e ); - move32(); - move32(); - move16(); - move16(); /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); @@ -1320,6 +1309,8 @@ static void ivas_param_mc_param_est_enc_fx( { #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_CY( Cy_sum_real_64[cur_param_band][k][k], Nrg_fx[k], Nrg_e[k] ); + move32(); + move16(); #else Nrg_fx[k] = Cy_sum_fx[cur_param_band][k][k]; move32(); @@ -1457,6 +1448,8 @@ static void ivas_param_mc_param_est_enc_fx( FOR( ch_idx2 = 0; ch_idx2 < MAX_CICP_CHANNELS; ch_idx2++ ) { CONVERT_CY( Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2], Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); + move32(); + move16(); } } } @@ -1500,6 +1493,8 @@ static void ivas_param_mc_param_est_enc_fx( { #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_CY( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2], imag_part_fx, imag_part_e ); + move32(); + move16(); #else imag_part_fx = Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2]; move32(); -- GitLab From 38547d2ea286f5d0cadcb8a30ab33dbcae3f93b0 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Tue, 29 Apr 2025 12:09:06 +0200 Subject: [PATCH 0598/1310] applied the clang patch. --- lib_enc/ivas_mc_param_enc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index bf7e49cbb..3058f87f3 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -36,14 +36,14 @@ Word16 norm; \ norm = W_norm( x_64 ); \ y_fx = W_extract_h( W_shl( x_64, norm ) ); \ - y_e = sub( sub62gb, norm ); \ + y_e = sub( sub62gb, norm ); \ } #define CONVERT_DMX( x_64, y_fx, y_e ) \ { \ Word16 norm; \ norm = W_norm( x_64 ); \ y_fx = W_extract_h( W_shl( x_64, norm ) ); \ - y_e = sub( sub35gb, norm ); \ + y_e = sub( sub35gb, norm ); \ } #include #include -- GitLab From 40b6da870308be6baf24239922ed5d668769b8ca Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Mon, 12 May 2025 10:40:07 +0200 Subject: [PATCH 0599/1310] inling the matrix multiplication in ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx(). --- lib_com/options.h | 1 + lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 70 ++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index cbc77b6e7..af3a65d47 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -86,6 +86,7 @@ //#define HARM_SCE_INIT #define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ #define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ +#define MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE /* FhG: reduce WMOPS by inlining the matrix multiplications for the smoothing operation. */ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index 6d367538d..4d4f37a02 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -30,6 +30,8 @@ *******************************************************************************************************/ +#define MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE + #include #include #include @@ -516,10 +518,14 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( Word16 mixing_matrix_buffer_e; Word32 input_f_real_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 input_f_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; +#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE + +#else Word32 output_f_real_fx[MAX_CICP_CHANNELS]; Word32 output_f_imag_fx[MAX_CICP_CHANNELS]; Word16 output_f_real_e; Word16 output_f_imag_e; +#endif Word32 diff_f_real_fx[MAX_CICP_CHANNELS]; Word32 diff_f_imag_fx[MAX_CICP_CHANNELS]; @@ -527,8 +533,12 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( set_zero_fx( input_f_real_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero_fx( input_f_imag_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); +#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE + +#else set_zero_fx( output_f_real_fx, MAX_CICP_CHANNELS ); set_zero_fx( output_f_imag_fx, MAX_CICP_CHANNELS ); +#endif set_zero_fx( diff_f_real_fx, MAX_CICP_CHANNELS ); set_zero_fx( diff_f_imag_fx, MAX_CICP_CHANNELS ); @@ -592,6 +602,36 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( } /* apply residual mixing */ +#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE + { + Word16 shifter; + + shifter=31-mixing_matrix_res_smooth_e; + FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) + { + int i; + Word16 idx; + Word64 temp_real, temp_imag; + + + idx = ch_idx; + temp_real = 0; + temp_imag = 0; + move64(); + move64(); + for (i=0;i Date: Mon, 12 May 2025 10:45:14 +0200 Subject: [PATCH 0600/1310] applied the clang patch. --- lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 106 +++++++++---------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index 4d4f37a02..e17f6fd1e 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -30,7 +30,7 @@ *******************************************************************************************************/ -#define MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE +#define MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE #include #include @@ -518,7 +518,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( Word16 mixing_matrix_buffer_e; Word32 input_f_real_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 input_f_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; -#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE +#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE #else Word32 output_f_real_fx[MAX_CICP_CHANNELS]; @@ -533,7 +533,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( set_zero_fx( input_f_real_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero_fx( input_f_imag_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); -#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE +#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE #else set_zero_fx( output_f_real_fx, MAX_CICP_CHANNELS ); @@ -603,32 +603,32 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( /* apply residual mixing */ #ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE - { - Word16 shifter; - - shifter=31-mixing_matrix_res_smooth_e; - FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) - { - int i; - Word16 idx; - Word64 temp_real, temp_imag; - - - idx = ch_idx; - temp_real = 0; - temp_imag = 0; - move64(); - move64(); - for (i=0;i Date: Mon, 12 May 2025 12:49:35 +0200 Subject: [PATCH 0601/1310] the index calculation of the matrix multiplication does not require BASOP. --- lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index e17f6fd1e..bd95f6f54 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -623,7 +623,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( { temp_real = W_add( temp_real, W_mult0_32_32( mixing_matrix_res_smooth_fx[idx], diff_f_real_fx[i] ) ); temp_imag = W_add( temp_imag, W_mult0_32_32( mixing_matrix_res_smooth_fx[idx], diff_f_imag_fx[i] ) ); - idx = add( idx, nY ); + idx += nY; } Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = W_extract_l( W_shr( temp_real, shifter ) ); Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = W_extract_l( W_shr( temp_imag, shifter ) ); @@ -692,7 +692,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( { temp_real = W_add( temp_real, W_mult0_32_32( mixing_matrix_smooth_fx[idx], input_f_real_fx[i] ) ); temp_imag = W_add( temp_imag, W_mult0_32_32( mixing_matrix_smooth_fx[idx], input_f_imag_fx[i] ) ); - idx = add( idx, nY ); + idx += nY; } Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_real, shifter ) ) ); Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_imag, shifter ) ) ); -- GitLab From 053425f3c77a6bc6c2e8e81187d51d061c726ca4 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 May 2025 12:03:56 +0200 Subject: [PATCH 0602/1310] add missing move32() instructions --- lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index bd95f6f54..5b31e31a4 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -695,7 +695,9 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( idx += nY; } Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_real, shifter ) ) ); + move32(); Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_imag, shifter ) ) ); + move32(); } } #else -- GitLab From 99d73e309b999f9e14503ad9d50227b2ecd336c8 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 May 2025 12:11:42 +0200 Subject: [PATCH 0603/1310] formatting --- lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index 5b31e31a4..caddb5c5c 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -695,9 +695,9 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( idx += nY; } Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_real, shifter ) ) ); - move32(); + move32(); Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band], W_extract_l( W_shr( temp_imag, shifter ) ) ); - move32(); + move32(); } } #else -- GitLab From 38607bcaf059cd0a3e2e206cbf2e61ad139bdcca Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 15 May 2025 12:05:41 +0200 Subject: [PATCH 0604/1310] chnage switch for BE pipeline --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1e8036f6b..7ba71d0cc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,7 +106,7 @@ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ #define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ -#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES -- GitLab From 546a923f070e69fc70b062e7b684fc16b19e423e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 15 May 2025 16:53:59 +0530 Subject: [PATCH 0605/1310] Macros cleanup --- lib_com/cng_exc_fx.c | 28 -- lib_com/codec_tcx_common.c | 134 ------- lib_com/fd_cng_com_fx.c | 98 ----- lib_com/lsf_tools_fx.c | 294 +-------------- lib_com/prot_fx.h | 49 +-- lib_dec/ACcontextMapping_dec_fx.c | 6 - lib_dec/TonalComponentDetection_fx.c | 38 +- lib_dec/bass_psfilter_fx.c | 107 ------ lib_dec/dec_higher_acelp_fx.c | 7 - lib_dec/dec_prm_fx.c | 7 +- lib_dec/dlpc_avq_fx.c | 54 +-- lib_dec/er_dec_tcx_fx.c | 46 +-- lib_dec/er_util_fx.c | 7 +- lib_dec/hf_synth_fx.c | 4 - lib_dec/lsf_msvq_ma_dec_fx.c | 9 - lib_dec/swb_bwe_dec_hr_fx.c | 13 - lib_dec/tonalMDCTconcealment_fx.c | 49 +-- lib_enc/ACcontextMapping_enc_fx.c | 516 -------------------------- lib_enc/gs_enc_fx.c | 8 +- lib_enc/ivas_core_pre_proc_front_fx.c | 67 ---- lib_enc/lsf_msvq_ma_enc_fx.c | 12 - 21 files changed, 19 insertions(+), 1534 deletions(-) diff --git a/lib_com/cng_exc_fx.c b/lib_com/cng_exc_fx.c index b314357ad..e335e9435 100644 --- a/lib_com/cng_exc_fx.c +++ b/lib_com/cng_exc_fx.c @@ -598,11 +598,6 @@ void cng_params_postupd_fx( const Word16 *const cng_Qexc_buf, /* i : Q_exc buffer Q0 */ const Word32 *const cng_brate_buf, /* i : bit rate buffer Q0 */ Word32 ho_env_circ[] /* i/o: Envelope buffer Q6 */ -#ifdef IVAS_CODE_CNG_COM - , - const Word16 element_mode, /* i : Element mode */ - const Word16 bwidth /* i : Audio bandwidth */ -#endif ) { Word16 i, j; @@ -662,15 +657,6 @@ void cng_params_postupd_fx( } Copy32( sp, env, NUM_ENV_CNG ); -#ifdef IVAS_CODE_CNG_COM - if ( element_mode == IVAS_SCE || element_mode == IVAS_CPE_DFT ) - { - att = 0.0f; - apply_scale( &att, bwidth, last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); - att = powf( 10, att / 10.0f ); - } - else -#endif { CNG_mode = get_cng_mode( last_active_brate ); @@ -860,11 +846,6 @@ void cng_params_upd_fx( Word16 cng_Qexc_buf[], /* i/o: Q_exc buffer Q0 */ Word32 cng_brate_buf[], /* i/o: last_active_brate buffer Q0 */ const Word32 last_active_brate /* i : Last active bit rate Q0 */ -#ifdef IVAS_CODE_CNG_COM - , - const Word16 element_mode, /* i : Element mode */ - const Word16 bwidth /* i : Audio bandwidth */ -#endif ) { Word32 L_ener, L_tmp; @@ -986,15 +967,6 @@ void cng_params_upd_fx( } Copy32( sp, env, NUM_ENV_CNG ); -#ifdef IVAS_CODE_CNG_COM - if ( element_mode == IVAS_SCE || element_mode == IVAS_CPE_DFT ) - { - att = 0.0f; - apply_scale( &att, bwidth, last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); - att = powf( 10, att / 10.0f ); - } - else -#endif { CNG_mode = get_cng_mode( last_active_brate ); /* att = 1/pow(2,ENR_ATT_fx[CNG_mode]); */ diff --git a/lib_com/codec_tcx_common.c b/lib_com/codec_tcx_common.c index 1ebc2829c..52c7d0614 100644 --- a/lib_com/codec_tcx_common.c +++ b/lib_com/codec_tcx_common.c @@ -469,140 +469,6 @@ void tcxInvertWindowGrouping( } } -#ifdef IVAS_CODE_TCX_COM - -/*-------------------------------------------------------------------* - * tcx5SpectrumInterleaving() - * - * - *-------------------------------------------------------------------*/ - -void tcx5SpectrumInterleaving( - const int16_t tcx5Size, - float *spectrum ) -{ - int16_t i; - float interleaveBuf[N_TCX10_MAX]; - - set_f( interleaveBuf, 0.0f, N_TCX10_MAX ); - - /* group sub-windows: interleave bins according to their frequencies */ - for ( i = 0; i < tcx5Size; i++ ) - { - interleaveBuf[2 * i] = spectrum[i]; - interleaveBuf[2 * i + 1] = spectrum[tcx5Size + i]; - } - - mvr2r( interleaveBuf, spectrum, 2 * tcx5Size ); - - return; -} - - -/*-------------------------------------------------------------------* - * tcx5SpectrumDeinterleaving() - * - * - *-------------------------------------------------------------------*/ - -void tcx5SpectrumDeinterleaving( - const int16_t tcx5Size, - float *spectrum ) -{ - int16_t i; - float interleaveBuf[N_TCX10_MAX]; - - set_f( interleaveBuf, 0.0f, N_TCX10_MAX ); - - /* ungroup sub-windows: interleave bins according to their frequencies */ - for ( i = 0; i < tcx5Size; i++ ) - { - interleaveBuf[i] = spectrum[2 * i]; - interleaveBuf[tcx5Size + i] = spectrum[2 * i + 1]; - } - - mvr2r( interleaveBuf, spectrum, 2 * tcx5Size ); - - return; -} - - -/*-------------------------------------------------------------------* - * tcx5TnsGrouping() - * - * - *-------------------------------------------------------------------*/ - -void tcx5TnsGrouping( - const int16_t L_frame, /* i : frame length (TCX5) */ - const int16_t L_spec, /* i : coded spec length (TCX5, derived from filter borders*/ - float *spectrum ) -{ - /* rearrange LF sub-window lines prior to TNS synthesis filtering */ - if ( L_spec < L_frame ) - { - mvr2r( spectrum + 8, spectrum + 16, L_spec - 8 ); - mvr2r( spectrum + L_frame, spectrum + 8, 8 ); - mvr2r( spectrum + L_frame + 8, spectrum + L_spec + 8, L_spec - 8 ); - } - else - { - float buff[8]; /* Buffer for the rearrangement of LF TCX5 */ - mvr2r( spectrum + L_spec, buff, 8 ); - mvr2r( spectrum + 8, spectrum + 16, L_spec - 8 ); - mvr2r( buff, spectrum + 8, 8 ); - } - - return; -} - - -/*-------------------------------------------------------------------* - * tcx5TnsUngrouping() - * - * - *-------------------------------------------------------------------*/ - -void tcx5TnsUngrouping( - const int16_t L_frame, /* i : frame length (TCX5) */ - const int16_t L_spec, /* i : coded spec length (TCX5, derived from filter borders*/ - float *spectrum, - const int16_t enc_dec /* i : 0: encoder, else decoder */ -) -{ - /* undo rearrangement of LF sub-window lines prior to TNS analysis */ - if ( L_spec < L_frame ) - { - mvr2r( spectrum + L_spec + 8, spectrum + L_frame + 8, L_spec - 8 ); - mvr2r( spectrum + 8, spectrum + L_frame, 8 ); - mvr2r( spectrum + 16, spectrum + 8, L_spec - 8 ); - set_zero( spectrum + L_spec, L_frame - L_spec ); - set_zero( spectrum + L_frame + L_spec, L_frame - L_spec ); - } - else - { - float buff[8]; /* Buffer for the rearrangement of LF TCX5 */ - - mvr2r( spectrum + 8, buff, 8 ); - - if ( enc_dec == ENC ) - { - mvr2r( spectrum + 16, spectrum + 8, L_frame - 8 ); - mvr2r( buff, spectrum + L_frame, 8 ); - } - else - { - mvr2r( spectrum + 16, spectrum + 8, L_spec - 8 ); - mvr2r( buff, spectrum + L_spec, 8 ); - } - } - - return; -} - -#endif - - /*-------------------------------------------------------------------* * tcx5SpectrumInterleaving() * diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 78809ed2c..872c180b5 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -1109,12 +1109,6 @@ void minimum_statistics( move16(); } } -#ifdef IVAS_CODE_CNG_COM - if ( enc_dec == DEC && element_mode == IVAS_CPE_TD ) - { - v_multc( msNoiseEst, 1.4125f, msNoiseEst, NPART_SHAPING ); - } -#endif /* Collect buffers */ Copy( msPeriodog, msPeriodogBuf + len * ( *msPeriodogBufPtr ), len ); @@ -2624,18 +2618,6 @@ void SynthesisSTFT( move16(); } /* Generate excitation */ -#ifdef IVAS_CODE_CNG_COM - PME() - if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) - { - for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) - { - buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4]; - } - v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); - } - else -#endif { FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ ) { @@ -2749,18 +2731,6 @@ void SynthesisSTFT_ivas_fx( move16(); } /* Generate excitation */ -#ifdef IVAS_CODE_CNG_COM - PME() - if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) - { - for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) - { - buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4]; - } - v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); - } - else -#endif { FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ ) { @@ -2788,74 +2758,6 @@ void SynthesisSTFT_ivas_fx( } } -#ifdef IVAS_CODE_CNG_COM -/*------------------------------------------------------------------- - * SynthesisSTFT_dirac() - * - * STFT synthesis filterbank - *-------------------------------------------------------------------*/ - -void SynthesisSTFT_dirac( - float *fftBuffer, /* i : FFT bins */ - float *timeDomainOutput, - float *olapBuffer, - const float *olapWin, - const int16_t samples_out, - HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ -) -{ - int16_t i; - float buf[M + 1 + 320], tmp; - - /* Perform IFFT */ - RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, 1 ); - - /* Handle overlap in P/S domain for stereo */ - mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); - set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ - - for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4]; - } - for ( ; i < 5 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] = fftBuffer[i]; - } - - for ( ; i < 7 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] = fftBuffer[i]; - } - - for ( ; i < hFdCngCom->fftlen; i++ ) - { - olapBuffer[i] = 0; - } - - /* Get time-domain signal */ - v_multc( olapBuffer + hFdCngCom->frameSize / 4, (float) ( hFdCngCom->fftlen / 2 ), timeDomainOutput, samples_out ); - - /* Get excitation */ - v_multc( olapBuffer + hFdCngCom->frameSize / 4 - ( M + 1 ), (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); - tmp = buf[0]; - preemph( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); - residu( hFdCngCom->A_cng, M, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize ); - - /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/ - if ( samples_out < hFdCngCom->frameSize ) - { - mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 ); - } - for ( i = 5 * hFdCngCom->frameSize / 4; i < 7 * hFdCngCom->frameSize / 4; i++ ) - { - olapBuffer[i] *= olapWin[i - 3 * hFdCngCom->frameSize / 4]; - } - - return; -} -#endif - /************************************************************************************** * Compute some values used in the bias correction of the minimum statistics algorithm * **************************************************************************************/ diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index 5f0b3b57b..d60d0e999 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -3301,71 +3301,6 @@ Word16 tcxlpc_get_cdk( return cdk; } -#ifdef IVAS_MSVQ -/*--------------------------------------------------------------------------* - * dec_FDCNG_MSVQ_stage1() - * - * - *--------------------------------------------------------------------------*/ - -void dec_FDCNG_MSVQ_stage1( - int16_t j_full, /* i : index full range */ - int16_t n, /* i : dimension to generate */ - const float *invTrfMatrix, /* i : IDCT matrix for synthesis */ - const DCTTYPE idcttype, /* i : specify which IDCT */ - float *uq, /* o : synthesized stage1 vector */ - Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ -) -{ - int16_t col, segm_ind, j; - float dct_vec[FDCNG_VQ_MAX_LEN]; - float idct_vec[FDCNG_VQ_MAX_LEN]; - const Word8 *cbpW8; - const Word16 *dct_col_shift_tab; - - assert( n <= FDCNG_VQ_MAX_LEN ); - assert( n >= FDCNG_VQ_DCT_MINTRUNC ); - - segm_ind = 0; - for ( col = 1; col <= FDCNG_VQ_DCT_NSEGM; col++ ) - { - if ( j_full >= cdk1_ivas_cum_entries_per_segment[col] ) - { - segm_ind++; - } - } - - j = j_full - cdk1_ivas_cum_entries_per_segment[segm_ind]; /* j is the local segment index */ - - assert( j < cdk1_ivas_entries_per_segment[segm_ind] ); - - /* Word8 column variable Qx storage*/ - cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm_ind]; /* Word8 storage fixed ptr_init */ - cbpW8 += j * cdk1_ivas_cols_per_segment[segm_ind]; /* adaptive ptr init */ - dct_col_shift_tab = stage1_dct_col_syn_shift[segm_ind]; - - for ( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ ) - { - dct_vec[col] = (float) shl( (Word16) cbpW8[col], dct_col_shift_tab[col] ); - /* LOGIC( 1 ) , SHIFT( 1 ); - in BASOP: s_and(for W8->W16), shl() - */ - } - dctT2_N_apply_matrix( (const float *) dct_vec, idct_vec, cdk1_ivas_cols_per_segment[segm_ind], n, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, idcttype ); - - /*scale down to original fdcngvq domain and move to Q0 */ - v_multc( idct_vec, fdcng_dct_scaleF[1], idct_vec, n ); - /* fdcng_dct_scaleF[1] --> 0.0625-->scale down from search Q4 domain to Q0 , - not really relevant for BASOP loop */ - - /*add common mid fdcng vector, in fdcng bands domain */ - v_add( idct_vec, cdk1r_tr_midQ_truncQ, uq, n ); - assert( uq_ind == NULL ); - - return; -} - -#endif void msvq_dec( const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) (14Q1*1.28)*/ const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -3374,11 +3309,7 @@ void msvq_dec( const Word16 N, /* i : Vector dimension */ const Word16 maxN, /* i : Codebook dimension */ const Word16 Idx[], /* i : Indices */ -#ifdef IVAS_MSVQ - const int16_t applyIDCT_flag, /* i : applyIDCT flag */ - const float *invTrfMatrix, /* i : matrix for IDCT synthesis */ -#endif - Word16 *uq /* o : quantized vector (14Q1*1.28)*/ + Word16 *uq /* o : quantized vector (14Q1*1.28)*/ ) { Word16 i, j, offset; @@ -3414,15 +3345,6 @@ void msvq_dec( start = offs[i]; move16(); } -#ifdef IVAS_MSVQ - test(); - IF( i == 0 && applyIDCT_flag != 0 ) - { - assert( start == 0 ); - dec_FDCNG_MSVQ_stage1( Idx[0], N, invTrfMatrix, IDCT_T2_XX_24, uq, uq_ind ); /* IDCT_T2 N=24 used for all synthesis */ - } - ELSE -#endif { /*vr_add( uq+start, cb[i]+Idx[i]*maxn, uq+start, n );, where uq = a zero vector*/ offset = i_mult2( Idx[i], N34 ); @@ -4499,217 +4421,3 @@ void create_IDCT_N_Matrix_fx( return; } -#ifdef IVAS_MSVQ - -/*-------------------------------------------------------------------* - * dctT2_N_apply_matrix() - * - * dct/idct truncated matrix appl. for DCT basis vector lengths of N - *-------------------------------------------------------------------*/ - -void dctT2_N_apply_matrix( - const float *input, /* i : input in fdcng or DCT(fdcng) domain */ - float *output, /* o : output in DCT(fdcng) or fdcng ordomain */ - const int16_t dct_dim, /* i : dct processing dim possibly truncated */ - const int16_t fdcngvq_dim, /* i : fdcng domain length */ - const float *matrix, /* i : IDCT matrix */ - const int16_t matrix_row_dim, /* i : */ - const DCTTYPE dcttype /* i : matrix operation type */ -) -{ - int16_t i, j, dim_in, dim_out; - int16_t mat_step_col, mat_step_row, mat_step_col_flag; - const float *pt_x, *pt_A; - float tmp_y[FDCNG_VQ_MAX_LEN]; - float *pt_y; - - /* non-square DCT_N and IDCT_N matrix application, - using a stored format of an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ - /* efficiently parallelized in SIMD */ - - assert( dct_dim <= FDCNG_VQ_DCT_MAXTRUNC ); - assert( fdcngvq_dim <= FDCNG_VQ_MAX_LEN ); - - if ( ( dcttype & 1 ) == 0 ) /* even entries are DCTs */ - { - /* DCT_typeII 24,21 -> XX in worst case */ - dim_in = fdcngvq_dim; - dim_out = dct_dim; - mat_step_col = matrix_row_dim; /* matrix maximum storage size dependent, width of first row in matrix */ - mat_step_row = 0; - mat_step_col_flag = 1; - assert( dcttype == DCT_T2_21_XX || dcttype == DCT_T2_24_XX ); - } - else - { - assert( ( dcttype & 1 ) != 0 ); /* idct */ - dim_in = dct_dim; - dim_out = fdcngvq_dim; - mat_step_col = 1; - mat_step_row = matrix_row_dim; - mat_step_col_flag = 0; - assert( dcttype == IDCT_T2_XX_24 ); - } - - pt_y = tmp_y; - for ( i = 0; i < dim_out; i++ ) - { - pt_x = input; - *pt_y = 0; - - /* +i(DCT) or +i*maxTrunc(IDCT) */ -#define WMC_TOOL_SKIP - pt_A = &( matrix[i * ( mat_step_row + mat_step_col_flag )] ); /* ptr indexing */ - PTR_INIT( 1 ); -#undef WMC_TOOL_SKIP - for ( j = 0; j < dim_in; j++ ) - { -#define WMC_TOOL_SKIP - *pt_y += ( *pt_x++ ) * ( *pt_A ); - pt_A += mat_step_col; /* step +maxtrunc or +1 */ /* ptr indexing*/ - MAC( 1 ); -#undef WMC_TOOL_SKIP - } - pt_y++; - } - - mvr2r( tmp_y, output, dim_out ); - - return; -} - - -/*-------------------------------------------------------------------* - * extend_dctN_input() - * - * (inputN, dctN) -> idct(N_ext) idct_N matrix application loop for - * extending, extrapolating a DCT basis vector length of N to N_ext - *-------------------------------------------------------------------*/ - -void extend_dctN_input( - const float *input, /* i : input in fdcng domain */ - const float *dct_input, /* i : input in dctN(fdcng) domain */ - const int16_t in_dim, /* i : in_dim == N */ - float *ext_sig, /* o : extended output in fdcng domain */ - const int16_t out_dim, /* i : output total dim */ - float *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ - const int16_t n_cols, /* i : number of columns == DCT truncation length */ - const DCTTYPE dcttype /* i : matrix operation type */ -) -{ - int16_t i, j, i_rev; - const float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix; - - /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ - assert( in_dim < FDCNG_VQ_MAX_LEN ); - assert( out_dim <= FDCNG_VQ_MAX_LEN ); - assert( out_dim > in_dim ); - assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/ - assert( ( dcttype & 1 ) != 0 ); /* idct tables always in use for this basis vector extension */ - - mvr2r( input, ext_sig, in_dim ); /* copy initial part, i.e. only last/tail parts are extended */ - set_f( &( ext_sig[in_dim] ), 0.0, out_dim - in_dim ); - - i_rev = in_dim; /*ptr init*/ - for ( i = in_dim; i < out_dim; i++ ) - { /* for each extension sample */ - /* i = 21 22 23; - i_rev = 20 19 18; for odd dctII reflect basis vector - */ - i_rev--; - - for ( j = 0; j < n_cols; j++ ) /* for each available DCT coeff */ - { - /* DCTcoeff * reflected basis vector */ -#define WMC_TOOL_SKIP - /* pure ptr MAC operations */ - ext_sig[i] += dct_input[j] * ptr[i_rev][j]; /* sum up scaled and extended basis vector */ - MAC( 1 ); -#undef WMC_TOOL_SKIP - } - } - - return; -} - - -/*-------------------------------------------------------------------* - * create_IDCT_N_Matrix() - * - * inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in - * RAM from a quantized compressed ROM format - *-------------------------------------------------------------------*/ - -void create_IDCT_N_Matrix( - float *inv_matrixFloatQ, /* i/o: RAM buffer */ - const int16_t N, /* i : DCT length, number of time samples */ - const int16_t n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ - const int16_t alloc_size /* i : RAM buffer size in elements */ -) -{ - int16_t c, c1, r, r_flip, W16_val; - int16_t len; - int16_t mat_cpy_size; - const Word16 *absval_ptr; - const Word8 *idx_ptr; - Word16 idx; - float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) inv_matrixFloatQ; /* fixed number of columns pointers, to simplifies adressing in ANSIC */ - - absval_ptr = unique_idctT2_24coeffsQ16; - idx_ptr = idctT2_24_compressed_idx; - len = FDCNG_VQ_MAX_LEN; - - if ( N == FDCNG_VQ_MAX_LEN_WB ) - { - absval_ptr = unique_idctT2_21coeffsQ16; - idx_ptr = idctT2_21_compressed_idx; - len = N; - } - - assert( alloc_size >= ( n_cols * len ) ); /* enough space for the full expanded IDCT matrix */ - assert( N <= len ); - - mat_cpy_size = ( n_cols ) * ( len >> 1 ); /* NB integer division of "len" */ - - if ( ( len & 1 ) != 0 ) - { /* odd sized DCT with a non-reflected center row */ - mat_cpy_size += n_cols; - } - - for ( c = 0; c < mat_cpy_size; c++ ) - { - idx = (Word16) ( idx_ptr[c] ); - W16_val = absval_ptr[abs( idx )]; - - if ( idx < 0 ) - { - W16_val = -( W16_val ); - } - inv_matrixFloatQ[c] = ( +1.52587890625e-05f ) * ( (float) W16_val ); /* 1.0/2.^16 scaling to a float-"Q0" , a scaling that is not done in BASOP */ - } - - /* for even number of coeffs DCT24, - flip symmetry for odd, even is used to save 50% IDCT Table ROM */ - /* for an odd DCT center is not flipped e.g for DCT21 */ - - assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); - assert( ( n_cols & 1 ) == 0 ); - - for ( c = 0; c < ( n_cols ); c += 2 ) - { - c1 = c + 1; - r_flip = len - 1; - for ( r = 0; r < ( len / 2 ); r++, r_flip-- ) - { -#define WMC_TOOL_SKIP - ptr[r_flip][c] = ptr[r][c]; /* flipped */ - ptr[r_flip][c1] = -( ptr[r][c1] ); /* flipped and sign swapped */ - MOVE( 2 ); - MULT( 1 ); /* for negate */ -#undef WMC_TOOL_SKIP - } - } - - return; -} -#endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index bbd5416da..ecd190f69 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -916,11 +916,7 @@ void msvq_dec( const Word16 N, /* i : Vector dimension */ const Word16 maxN, /* i : Codebook dimension */ const Word16 Idx[], /* i : Indices */ -#ifdef IVAS_MSVQ - const int16_t applyIDCT_flag, /* i : applyIDCT flag */ - const float *invTrfMatrix, /* i : matrix for IDCT synthesis */ -#endif - Word16 *uq /* o : quantized vector (3Q12) */ + Word16 *uq /* o : quantized vector (3Q12) */ ); Word16 tcxlpc_get_cdk( @@ -6449,12 +6445,7 @@ void DetectTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -); + Word16 element_mode ); void RefineTonalComponents( Word16 indexOfTonalPeak[], @@ -6474,12 +6465,7 @@ void RefineTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins */ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -); + Word16 element_mode ); void ivas_RefineTonalComponents_fx( Word16 indexOfTonalPeak[], @@ -6561,20 +6547,13 @@ void TonalMDCTConceal_Detect( const Word32 pitchLag, /*IN */ Word16 *umIndices, /*OUT*/ Word16 element_mode /* IN */ -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif ); void TonalMDCTConceal_Apply( - const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32* mdctSpectrum, /*IN/OUT*/ - Word16* mdctSpectrum_exp /*IN */ -#ifdef IVAS_CODE_MDCT_GSHAPE - , const PsychoacousticParameters* psychParamsCurrent) -#endif - ); + const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, /*IN/OUT*/ + Word16 *mdctSpectrum_exp /*IN */ +); void TonalMDCTConceal_Apply_ivas_fx( TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ @@ -9137,15 +9116,8 @@ Word16 decode_lpc_avq_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16 *param_lpc /* o : lpc parameters */ -#ifdef IVAS_CODE_AVQ_LPC - , - const Word16 ch, /* i : channel */ - const Word16 element_mode, /* i : element mode */ - const Word16 sns_low_br_mode /* i : SNS low-bitrate mode */ -#endif ); -// decode_lpc_avq_ivas_fx declaration with IVAS_CODE_AVQ_LPC enabled Word16 decode_lpc_avq_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ @@ -9369,13 +9341,6 @@ void modify_lsf( void con_tcx_fx( Decoder_State *st, /* i/o: coder memory state */ Word16 synth[] /* i/o: synth[] */ /*Q0 */ -#ifdef IVAS_CODE_CON_TCX - , - const Word16 coh, /* i : coherence of stereo signal */ - Word16 *noise_seed, /* i/o: noise seed for stereo */ - const Word16 only_left /* i : TD-PLC only in left channel */ -#endif - ); // er_scale_sync.c diff --git a/lib_dec/ACcontextMapping_dec_fx.c b/lib_dec/ACcontextMapping_dec_fx.c index 22e9fff01..acf372565 100644 --- a/lib_dec/ACcontextMapping_dec_fx.c +++ b/lib_dec/ACcontextMapping_dec_fx.c @@ -328,9 +328,6 @@ Word16 ACcontextMapping_decode2_no_mem_s17_LC( return resQBits; } -#define IVAS_CONTEXT_MAPPING -#ifdef IVAS_CONTEXT_MAPPING - /*-------------------------------------------------------------------* * RCcontextMapping_decode2_no_mem_s17_LCS() * @@ -737,6 +734,3 @@ Word16 RCcontextMapping_decode2_no_mem_s17_LCS_fx( return resQBits; } - -#endif -#undef IVAS_CONTEXT_MAPPING diff --git a/lib_dec/TonalComponentDetection_fx.c b/lib_dec/TonalComponentDetection_fx.c index 4b2cf0213..409b975f5 100644 --- a/lib_dec/TonalComponentDetection_fx.c +++ b/lib_dec/TonalComponentDetection_fx.c @@ -140,33 +140,13 @@ void DetectTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins Q0*/ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word16 F0; Word16 thresholdModification[L_FRAME_MAX], lastMDCTSpect_exp; Word32 pScaledMdctSpectrum[L_FRAME_MAX]; -#ifdef IVAS_CODE_MDCT_GSHAPE - Word16 nBands; - IF( psychParamsCurrent == NULL ) - { - nBands = FDNS_NPTS; - PMT( "add nBands argument to mdct_shaping_16" ) -#endif - mdct_shaping_16( lastMDCTSpectrum, nSamplesCore, nSamples, scaleFactors, scaleFactors_exp, scaleFactors_max_e, pScaledMdctSpectrum ); -#ifdef IVAS_CODE_MDCT_GSHAPE - } - ELSE - { - sns_shape_spectrum( pScaledMdctSpectrum, psychParamsCurrent, scaleFactors, nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif + mdct_shaping_16( lastMDCTSpectrum, nSamplesCore, nSamples, scaleFactors, scaleFactors_exp, scaleFactors_max_e, pScaledMdctSpectrum ); lastMDCTSpect_exp = add( lastMDCTSpectrum_exp, scaleFactors_max_e ); @@ -208,12 +188,7 @@ void RefineTonalComponents( const Word16 nSamples, const Word16 nSamplesCore, const Word16 floorPowerSpectrum, /* i: lower limit for power spectrum bins Q0*/ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word16 newIndexOfTonalPeak[MAX_NUMBER_OF_IDX]; /*Q0*/ Word16 newLowerIndex[MAX_NUMBER_OF_IDX]; /*Q0*/ @@ -224,12 +199,7 @@ void RefineTonalComponents( DetectTonalComponents( newIndexOfTonalPeak, newLowerIndex, newUpperIndex, &newNumIndexes, lastPitchLag, currentPitchLag, lastMDCTSpectrum, - lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, nSamples, nSamplesCore, floorPowerSpectrum, element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - psychParamsCurrent -#endif - ); + lastMDCTSpectrum_exp, scaleFactors, scaleFactors_exp, scaleFactors_max_e, secondLastPowerSpectrum, nSamples, nSamplesCore, floorPowerSpectrum, element_mode ); nPreservedPeaks = 0; move16(); diff --git a/lib_dec/bass_psfilter_fx.c b/lib_dec/bass_psfilter_fx.c index 45cf7feed..4a5ef9328 100644 --- a/lib_dec/bass_psfilter_fx.c +++ b/lib_dec/bass_psfilter_fx.c @@ -1124,110 +1124,3 @@ void bpf_pitch_coherence_ivas_fx( return; } - - -#ifdef ADD_BPF_ADAPT -/*---------------------------------------------------------------------* - * res_bpf_adapt() - * - * Analyze BPF output and decide if it should be applied on DFT stereo - * residual signal - *---------------------------------------------------------------------*/ - -/*! r: Decision to enable or disable BPF on DFT stereo residual */ -int16_t res_bpf_adapt( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ - const float *bpf_error_signal_8k, /* i : BPF modification signal */ - float res_buf[STEREO_DFT_BUF_MAX] /* i : residual buffer */ -) -{ - float error_nrg; - float tmp; - float res_hb_nrg; - float bpf_error_ratio; - int16_t res_bpf_flag; - int16_t i; - int16_t i_start; - int16_t i_end; - float bw_inv; - - if ( hStereoDft->res_cod_band_max == 6 ) - { - i_start = 39; - i_end = 64; - bw_inv = 0.04f; /* 1/(64 - 39) */ - } - else - { - i_start = 28; - i_end = 40; - bw_inv = 0.083f; /* 1/(40 - 28) */ - } - - /* Measure energy of high frequency band in MDCT domain */ - res_hb_nrg = EPSILON; - for ( i = i_start; i < i_end; i++ ) - { - res_hb_nrg += res_buf[i] * res_buf[i]; - } - res_hb_nrg *= bw_inv; - res_hb_nrg = STEREO_DFT_BPF_ADAPT_ALPHA * res_hb_nrg + ( 1 - STEREO_DFT_BPF_ADAPT_ALPHA ) * hStereoDft->res_hb_nrg_mem; - hStereoDft->res_hb_nrg_mem = res_hb_nrg; - - /* Measure energy of discontinuities at subframe boundaries */ - error_nrg = 0; - for ( i = 0; i < L_FRAME8k; i += STEREO_DFT_L_SUBFR_8k ) - { - tmp = bpf_error_signal_8k[i] - hStereoDft->bpf_error_signal_last; - error_nrg += tmp * tmp; - hStereoDft->bpf_error_signal_last = bpf_error_signal_8k[i + STEREO_DFT_L_SUBFR_8k - 1]; - } - error_nrg *= 0.2f; /* Division by 5 for average value */ - bpf_error_ratio = min( 2, error_nrg / res_hb_nrg ); /* Form decision variable and apply limit */ - bpf_error_ratio = STEREO_DFT_BPF_ADAPT_BETA * bpf_error_ratio + ( 1 - STEREO_DFT_BPF_ADAPT_BETA ) * hStereoDft->bpf_error_ratio_mem; - hStereoDft->bpf_error_ratio_mem = bpf_error_ratio; - - res_bpf_flag = bpf_error_ratio < 1; - - return res_bpf_flag; -} - -/*---------------------------------------------------------------------* - * bpf_pitch_coherence() - * - * Analyse pitch coherence - *---------------------------------------------------------------------*/ -void bpf_pitch_coherence( - Decoder_State *st, /* i/o: decoder state structure */ - const float pitch_buf[] /* i : pitch for every subfr [0,1,2,3] */ -) -{ - int16_t nb_subfr; - float pc, pcn1, pcn2, pcn3; - - nb_subfr = st->L_frame / L_SUBFR; - - if ( st->clas_dec > UNVOICED_CLAS && st->element_mode != EVS_MONO ) - { - pc = (float) fabs( st->old_pitch_buf[nb_subfr + 3] + st->old_pitch_buf[nb_subfr + 2] - st->old_pitch_buf[nb_subfr] - st->old_pitch_buf[nb_subfr + 1] ) * 256.0f / (float) st->L_frame; - pcn1 = K_PC_DEC * pc + C_PC_DEC; - pcn1 = max( min( pcn1, 1.0f ), 0.0f ); - - pc = (float) fabs( pitch_buf[nb_subfr - 1] + pitch_buf[nb_subfr - 2] - pitch_buf[1] - pitch_buf[0] ) * 256.0f / (float) st->L_frame; - pcn2 = K_PC_DEC * pc + C_PC_DEC; - pcn2 = max( min( pcn2, 1.0f ), 0.0f ); - - pc = (float) fabs( st->old_pitch_buf[nb_subfr + 3] + st->old_pitch_buf[nb_subfr + 2] - pitch_buf[1] - pitch_buf[0] ) * 256.0f / (float) st->L_frame; - pcn3 = K_PC_DEC * pc + C_PC_DEC; - pcn3 = max( min( pcn3, 1.0f ), 0.0f ); - - if ( pcn1 + pcn2 + pcn3 < 2.5f ) - { - st->hBPF->psf_att = 0.4f; - set_s( &st->hBPF->Track_on_hist[L_TRACK_HIST - nb_subfr], 1, nb_subfr ); - } - } - - return; -} -#endif diff --git a/lib_dec/dec_higher_acelp_fx.c b/lib_dec/dec_higher_acelp_fx.c index aff7e5656..6144765a8 100644 --- a/lib_dec/dec_higher_acelp_fx.c +++ b/lib_dec/dec_higher_acelp_fx.c @@ -8,7 +8,6 @@ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ -#define IVAS_CODE_AVQ /*-----------------------------------------------------------------* * transf_cdbk_dec() * Transform domain contribution decoding @@ -129,7 +128,6 @@ void transf_cdbk_dec_fx( * Demultiplex and decode subvectors from bit-stream *--------------------------------------------------------------*/ -#ifdef IVAS_CODE_AVQ AVQ_demuxdec_fx( st_fx, code_preQ, &nBits, 8, nq, avq_bit_sFlag, trgtSvPos ); Word16 q_Code_preQ; IF( ( st_fx->element_mode == EVS_MONO ) ) @@ -142,9 +140,6 @@ void transf_cdbk_dec_fx( q_Code_preQ = Q_AVQ_OUT; move16(); } -#else - AVQ_demuxdec_fx( st_fx, code_preQ, &nBits, 8, nq ); -#endif FOR( i = 0; i < L_SUBFR; i++ ) { code_preQ[i] = shl_o( code_preQ[i], q_Code_preQ, &Overflow ); @@ -185,7 +180,6 @@ void transf_cdbk_dec_fx( st_fx->last_nq_preQ = nq[7]; move16(); -#ifdef IVAS_CODE_AVQ /* TD pre-quantizer: in extreme cases at subframe boundaries, lower the preemphasis memory to avoid a saturation */ test(); test(); @@ -209,7 +203,6 @@ void transf_cdbk_dec_fx( st_fx->last_code_preq = code_preQ[L_SUBFR - 1]; // q_Code_preQ move16(); -#endif PREEMPH_FX( code_preQ, FAC_PRE_AVQ_FX, L_SUBFR, &st_fx->mem_preemp_preQ_fx ); /*--------------------------------------------------------------* * Compute normalized prequantizer excitation gain for FEC diff --git a/lib_dec/dec_prm_fx.c b/lib_dec/dec_prm_fx.c index 3d277807d..16e588396 100644 --- a/lib_dec/dec_prm_fx.c +++ b/lib_dec/dec_prm_fx.c @@ -1003,12 +1003,7 @@ void dec_prm_fx( { IF( st->lpcQuantization == 0 ) { - decode_lpc_avq_fx( st, st->numlpc, param_lpc -#ifdef IVAS_CODE_AVQ_LPC - , - , , -#endif - ); + decode_lpc_avq_fx( st, st->numlpc, param_lpc ); move16(); } ELSE IF( EQ_16( st->lpcQuantization, 1 ) ) diff --git a/lib_dec/dlpc_avq_fx.c b/lib_dec/dlpc_avq_fx.c index 3d9a00b7f..07f1ea6f2 100644 --- a/lib_dec/dlpc_avq_fx.c +++ b/lib_dec/dlpc_avq_fx.c @@ -149,20 +149,11 @@ Word16 decode_lpc_avq_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ Word16 *param_lpc /* o : lpc parameters */ -#ifdef IVAS_CODE_AVQ_LPC - , - const Word16 ch, /* i : channel */ - const Word16 element_mode, /* i : element mode */ - const Word16 sns_low_br_mode /* i : SNS low-bitrate mode */ -#endif ) { Word16 k, j; Word16 nb, qn1, qn2, avqBits, q_type; Word16 start_bit_pos; -#ifdef IVAS_CODE_AVQ_LPC - Word16 stereo_mode = 0; -#endif move16(); move16(); move16(); @@ -189,41 +180,11 @@ Word16 decode_lpc_avq_fx( param_lpc[j] = q_type; j = add( j, 1 ); } -#ifdef IVAS_CODE_AVQ_LPC - test(); - IF( EQ_16( element_mode, IVAS_CPE_MDCT ) && k == 0 ) - { - stereo_mode = ch; - move16(); - if ( ch == 0 ) - { - stereo_mode = param_lpc[j]; - move16(); - } - param_lpc[j++] = stereo_mode; - move16(); - } -#endif /* Decode quantization indices */ IF( q_type == 0 ) { /* Absolute quantizer with 1st stage stochastic codebook */ -#ifdef IVAS_CODE_AVQ_LPC - IF( EQ_16( element_mode, IVAS_CPE_MDCT ) ) - { - IF( NE_16( stereo_mode, 3 ) ) - { - param_lpc[j] = get_next_indice_fx( st, SNS_ABS_QUANT_BITS ); - } - ELSE - { - param_lpc[j] = sub( get_next_indice_fx( st, 1 ), 2 ); - } - move16(); - } - ELSE -#endif { move16(); param_lpc[j] = get_next_indice_fx( st, 8 ); @@ -235,9 +196,6 @@ Word16 decode_lpc_avq_fx( * - we are in low bitrate mode and no joint SNS coding is used * - OR the side-SNS-is-zero flag is set for joint SNS */ -#ifdef IVAS_CODE_AVQ_LPC - IF( NE_16( element_mode, IVAS_CPE_MDCT ) || ( !( sns_low_br_mode && ( EQ_16( stereo_mode, 0 ) || EQ_16( stereo_mode, 1 ) ) && !( EQ_16( q_type, 0 ) && EQ_16( param_lpc[j - 1], -2 ) ) ) ) ) -#endif { /* 2 bits to specify Q2,Q3,Q4,ext */ qn1 = add( 2, get_next_indice_fx( st, 2 ) ); @@ -321,21 +279,11 @@ Word16 decode_lpc_avq_fx( pack4bits_fx( avqBits, st, ¶m_lpc[j] ); j = add( j, qn2 ); } -#ifdef IVAS_CODE_AVQ_LPC - ELSE - { - param_lpc[j] = 0; - j = add( j, 1 ); - param_lpc[j] = 0; - j = add( j, 1 ); - move16(); - move16(); - } -#endif } return sub( st->next_bit_pos, start_bit_pos ); } + Word16 decode_lpc_avq_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 numlpc, /* i : Number of sets of lpc */ diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 161cefe76..3d0eab815 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -121,13 +121,6 @@ con_tcx void con_tcx_fx( Decoder_State *st, /* i/o: coder memory state */ Word16 synth[] /* i/o: synth[] Q0*/ -#ifdef IVAS_CODE_CON_TCX - , - const Word16 coh, /* i : coherence of stereo signal Q14*/ - Word16 *noise_seed, /* i/o: noise seed for stereo Q0*/ - const Word16 only_left /* i : TD-PLC only in left channel Q0*/ -#endif - ) { Word16 i, s, c, L_frame, L_subfr, fLowPassFilter, T0; @@ -558,43 +551,7 @@ void con_tcx_fx( /*-----------------------------------------------------------------* * Construct the random part of excitation *-----------------------------------------------------------------*/ -#ifdef IVAS_CODE_CON_TCX - if ( coh != -1.f ) - { - int16_t tmpSeed1; - float alpha_coh; - float random1, random2; - - tmpSeed1 = *noise_seed; - noise = buf; - - alpha_coh = sqrtf( ( 1 - coh ) / ( 1 + coh ) ); - if ( st->idchan == 1 ) - { - alpha_coh = -alpha_coh; - } - - for ( i = 0; i < L_frame + L_FIR_FER2 - 1; i++ ) - { - random1 = (float) own_random( &tmpSeed1 ); - random2 = (float) own_random( &tmpSeed1 ); - noise[i] = random1 + alpha_coh * random2; - } - - if ( st->idchan == 1 || only_left ) - { - *noise_seed = tmpSeed1; - } - for ( ; i < L_frame + ( L_frame / 2 ) + 2 * L_FIR_FER2; i++ ) - { - random1 = (float) own_random( &tmpSeed1 ); - random2 = (float) own_random( &tmpSeed1 ); - noise[i] = random1 + alpha_coh * random2; - } - } - else -#endif /*IVAS_CODE_CON_TCX*/ { tmpSeed = st->seed_acelp; move16(); @@ -1427,7 +1384,7 @@ void con_tcx_ivas_fx( /*-----------------------------------------------------------------* * Construct the random part of excitation *-----------------------------------------------------------------*/ -#ifndef IVAS_CODE_CON_TCX + IF( NE_16( coh, -16384 ) ) { Word16 tmpSeed1; @@ -1477,7 +1434,6 @@ void con_tcx_ivas_fx( } } ELSE -#endif /*IVAS_CODE_CON_TCX*/ { tmpSeed = st->seed_acelp; /*Q0*/ move16(); diff --git a/lib_dec/er_util_fx.c b/lib_dec/er_util_fx.c index 9735129ec..cecbad294 100644 --- a/lib_dec/er_util_fx.c +++ b/lib_dec/er_util_fx.c @@ -579,12 +579,7 @@ Word16 GetPLCModeDecision_fx( pitch = L_add( st->old_fpitch, 0 ); /*Q16*/ } - TonalMDCTConceal_Detect( st->hTonalMDCTConc, pitch, &numIndices, st->element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ) -#endif - ); + TonalMDCTConceal_Detect( st->hTonalMDCTConc, pitch, &numIndices, st->element_mode ); test(); test(); diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c index 94c7d4c62..65c2e9290 100644 --- a/lib_dec/hf_synth_fx.c +++ b/lib_dec/hf_synth_fx.c @@ -182,11 +182,7 @@ static void hf_synthesis_fx( * calculate energy scaling factor to respect tilt of synth12k8 * (tilt: 1=voiced, -1=unvoiced) *-----------------------------------------------------------------*/ -#ifdef EVS_MONO hp400_12k8_fx( synth, L_SUBFR, hBWE_zero->mem_hp400_fx ); -#else - hp400_12k8_ivas_fx( synth, L_SUBFR, hBWE_zero->mem_hp400_fx ); -#endif /* i: mem_hp400 in Q_syn */ /* i: synth in Q_syn */ /* o: synth in Q_syn-3 */ diff --git a/lib_dec/lsf_msvq_ma_dec_fx.c b/lib_dec/lsf_msvq_ma_dec_fx.c index 61e338c9c..1b5d79c68 100644 --- a/lib_dec/lsf_msvq_ma_dec_fx.c +++ b/lib_dec/lsf_msvq_ma_dec_fx.c @@ -185,9 +185,6 @@ Word16 D_lsf_tcxlpc( M, M, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_q ); NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); /* Q0 */ @@ -208,9 +205,6 @@ Word16 D_lsf_tcxlpc( M, M, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_rem_q_ind ); NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); /* Q0 */ @@ -287,9 +281,6 @@ Word16 dec_lsf_tcxlpc( M, M, flag + 1, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_q_ind ); /* Update flag */ diff --git a/lib_dec/swb_bwe_dec_hr_fx.c b/lib_dec/swb_bwe_dec_hr_fx.c index 9fae1ded5..ff4d8bee6 100644 --- a/lib_dec/swb_bwe_dec_hr_fx.c +++ b/lib_dec/swb_bwe_dec_hr_fx.c @@ -11,7 +11,6 @@ #define Q_GUARD 1 #define Q_32_BITS 14 /* scaling of 't_audio32' */ #define MAKE_PSEUDO_FLT( v, e ) ( ( ( (Word32) ( v ) ) << 16 ) + ( e ) ) -#define AVQ_DEMUX /*-----------------------------------------------------------* * Gain_Dequant_HR() * @@ -595,11 +594,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB Nsv = ( NUM_TRANS_END_FREQ_COEF - NUM_TRANS_START_FREQ_COEF ) / WIDTH_BAND; move16(); -#ifdef AVQ_DEMUX AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq, 0, sub( Nsv, 1 ) ); -#else - AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq ); -#endif temp = add( len, NUM_TRANS_START_FREQ_COEF ); /* 't_audio' in Q8 */ t_audio_exp = 8; @@ -848,11 +843,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB /* Nsv = i / WIDTH_BAND */ Nsv = shr( i, 3 ); -#ifdef AVQ_DEMUX AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq, 0, sub( Nsv, 1 ) ); -#else - AVQ_demuxdec_fx( st_fx, x_norm, &nBits, Nsv, nq ); -#endif /*---------------------------------------------------------------------* * second stage decoding *---------------------------------------------------------------------*/ @@ -889,11 +880,7 @@ Word16 swb_bwe_dec_hr_fx( /* o : Exponent of SHB } nBits = sub( nBits, NBITS_GLOB_GAIN_BWE_HR ); -#ifdef AVQ_DEMUX AVQ_demuxdec_fx( st_fx, x_norm1, &nBits, Nsv2, nq2, 0, sub( Nsv2, 1 ) ); -#else - AVQ_demuxdec_fx( st_fx, x_norm1, &nBits, Nsv2, nq2 ); -#endif } /*---------------------------------------------------------------------* diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index f33a6c84f..fd6cf7835 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -873,12 +873,7 @@ static void CalcPowerSpecAndDetectTonalComponents( Word32 secondLastMDCT[], // Q31-secondLastMDCT_exp Word16 secondLastMDCT_exp, Word32 const pitchLag, /*15Q16*/ - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word16 nSamples; Word16 i; @@ -968,20 +963,9 @@ static void CalcPowerSpecAndDetectTonalComponents( /* here mdct_shaping() is intentionally used rather then mdct_shaping_16() */ -#ifdef IVAS_CODE_MDCT_GSHAPE - IF( psychParamsCurrent == NULL ) -#endif { mdct_shaping( powerSpectrum, hTonalMDCTConc->nSamplesCore, invScaleFactors, invScaleFactors_exp ); } -#ifdef IVAS_CODE_MDCT_GSHAPE - ELSE - { - PMTE() - sns_shape_spectrum( powerSpectrum, psychParamsCurrent, invScaleFactors, hTonalMDCTConc->nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif FOR( i = hTonalMDCTConc->nSamplesCore; i < nSamples; i++ ) { powerSpectrum[i] = L_shl_sat( Mpy_32_16_1( powerSpectrum[i], invScaleFactors[FDNS_NPTS - 1] ), invScaleFactors_exp[FDNS_NPTS - 1] ); // powerSpectrum_exp+ 2*invScaleFactors_exp -15 @@ -1034,12 +1018,7 @@ void TonalMDCTConceal_Detect( const TonalMDCTConcealPtr hTonalMDCTConc, const Word32 pitchLag, /*15Q16*/ Word16 *numIndices, - Word16 element_mode -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif -) + Word16 element_mode ) { Word32 secondLastMDST[L_FRAME_MAX]; Word32 secondLastMDCT[L_FRAME_MAX]; @@ -1111,9 +1090,6 @@ void TonalMDCTConceal_Detect( { /* If the second last frame was also lost, it is expected that pastTimeSignal could hold a bit different signal (e.g. including fade-out) from the one stored in TonalMDCTConceal_SaveTimeSignal. */ /* That is why we reuse the already stored information about the concealed spectrum in the second last frame */ -#ifdef IVAS_CODE_MDCT_GSHAPE - IF( psychParamsCurrent == NULL ) -#endif { nSamples = hTonalMDCTConc->nNonZeroSamples; move16(); @@ -1121,13 +1097,6 @@ void TonalMDCTConceal_Detect( hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp, hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, powerSpectrum ); } -#ifdef IVAS_CODE_MDCT_GSHAPE - ELSE - { - sns_shape_spectrum( powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif powerSpectrum_exp = getScaleFactor32( powerSpectrum, nSamples ); powerSpectrum_exp = sub( powerSpectrum_exp, 3 ); /*extra 3 bits of headroom for MA filter in getEnvelope*/ @@ -2532,10 +2501,6 @@ void TonalMDCTConceal_Apply( const TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ Word16 *mdctSpectrum_exp /*IN */ -#ifdef IVAS_CODE_MDCT_GSHAPE - , - const PsychoacousticParameters *psychParamsCurrent -#endif ) { Word16 i, l, exp; @@ -2553,22 +2518,12 @@ void TonalMDCTConceal_Apply( move16(); assert( hTonalMDCTConc->pTCI->upperIndex[hTonalMDCTConc->pTCI->numIndexes - 1] < nSamples ); -#ifdef IVAS_CODE_MDCT_GSHAPE - IF( psychParamsCurrent == NULL ) -#endif { mdct_shaping_16( hTonalMDCTConc->secondLastPowerSpectrum, hTonalMDCTConc->nSamplesCore, nSamples, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp, hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, powerSpectrum ); } -#ifdef IVAS_CODE_MDCT_GSHAPE - ELSE - { - sns_shape_spectrum( powerSpectrum, psychParamsCurrent, hTonalMDCTConc->secondLastBlockData.scaleFactors, hTonalMDCTConc->nSamplesCore ); - nBands = psychParamsCurrent->nBands; - } -#endif phaseDiff = hTonalMDCTConc->pTCI->phaseDiff; /* if multiple frame loss occurs use the phase from the last frame and continue rotating */ pCurrentPhase = hTonalMDCTConc->pTCI->phase_currentFramePredicted; diff --git a/lib_enc/ACcontextMapping_enc_fx.c b/lib_enc/ACcontextMapping_enc_fx.c index 43bd30fd4..5003712b7 100644 --- a/lib_enc/ACcontextMapping_enc_fx.c +++ b/lib_enc/ACcontextMapping_enc_fx.c @@ -1826,519 +1826,3 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( return bandBits; } - - -#ifdef IVAS_CODE_RANGE_CODER - -/*-------------------------------------------------------------------* - * RCcontextMapping_encode2_estimate_no_mem_s17_LCS() - * - * Range coder bit-estimation - *-------------------------------------------------------------------*/ - -int16_t RCcontextMapping_encode2_estimate_no_mem_s17_LCS( - int16_t *x, /* Spectral coefficients */ - const int16_t nt, /* L - size of spectrum (no. of spectral coefficients) */ - int16_t *lastnz_out, - int16_t *nEncoded, /* No. of spectral coefficients that can be coded without an overflow occuring */ - const int16_t target, /* Target bits */ - int16_t *stop, - int16_t mode, - CONTEXT_HM_CONFIG *hm_cfg /* context-based harmonic model configuration */ -) -{ - /* Common variables */ - int16_t a1, b1; - int16_t k, pki, lev1; - uint16_t t; - int16_t lastnz, lastnz2; - int16_t rateFlag; - float bit_estimate; - int16_t symbol; - const uint8_t *lookup; - float nbits2; - - /* Initialization */ - bit_estimate = 2.0f; - nbits2 = 0.f; - - /* bits to encode lastnz */ - k = 1; - - while ( k < nt / 2 ) - { - bit_estimate++; - k = k << 1; - /* check while condition */ - } - - nbits2 = bit_estimate; - - if ( hm_cfg ) - { - int16_t a1_i, b1_i; - int16_t stop2; - int16_t total_output_bits; - int16_t nt_half; - int32_t c[2], *ctx; - int32_t p1, p2; - int16_t ii[2]; - int16_t idx1, idx2, idx; - int16_t numPeakIndicesOrig = 0, numHoleIndices = 0; /* only to avoid compiler warning */ - - /* Rate flag */ - if ( target > 400 ) - { - rateFlag = 2 << NBITS_CONTEXT; /* Select context-A for higher bitrates */ - } - else - { - rateFlag = 0; /* Select context-B for lower bitrates */ - } - - nt_half = nt >> 1; - stop2 = 0; - c[0] = c[1] = 0; - - /* Find last non-zero tuple in the mapped domain signal */ - lastnz = find_last_nz_pair( x, nt, hm_cfg ); - - lastnz2 = 2; - - /* mapped domain */ - numPeakIndicesOrig = hm_cfg->numPeakIndices; - hm_cfg->numPeakIndices = min( hm_cfg->numPeakIndices, lastnz ); - numHoleIndices = lastnz - hm_cfg->numPeakIndices; - - /* Mark hole indices beyond lastnz as pruned */ - for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) - { - hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] + nt; - } - - ii[0] = numPeakIndicesOrig; - ii[1] = 0; - - p1 = p2 = 0; /* to avoid compilation warnings */ - - /* Main Loop through the 2-tuples */ - for ( k = 0; k < lastnz; k += 2 ) - { - a1_i = get_next_coeff_mapped( ii, &p1, &idx1, hm_cfg ); - b1_i = get_next_coeff_mapped( ii, &p2, &idx2, hm_cfg ); - - idx = min( idx1, idx2 ); - - /* Get context */ - ctx = &c[p1 | p2]; - - t = (uint16_t) ( *ctx + rateFlag ); - t += ( nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); - - /* Init current 2-tuple encoding */ - a1 = (int16_t) abs( x[a1_i] ); - b1 = (int16_t) abs( x[b1_i] ); - lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* Signs Bits */ - bit_estimate += min( a1, 1 ); - bit_estimate += min( b1, 1 ); - - /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ - lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* check while condition */ - /* MSBs coding */ - while ( max( a1, b1 ) >= A_THRES ) - { - pki = lookup[lev1]; /* ESC symbol */ - - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; - bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */ - - ( a1 ) >>= 1; - ( b1 ) >>= 1; - - lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* check while condition */ - } - - pki = lookup[lev1]; - - symbol = a1 + A_THRES * b1; - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; - - /* Should we truncate? */ - if ( bit_estimate > target ) - { - stop2 = 1; - - if ( *stop ) - { - break; - } - } - else - { - lastnz2 = b1_i + 1; - nbits2 = bit_estimate; - } - - /* Update context for next 2-tuple */ - if ( p1 == p2 ) /* peak-peak or hole-hole context */ - { - lev1 >>= NBITS_CONTEXT + NBITS_RATEQ; - - if ( lev1 <= 0 ) - { - t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); - } - else - { - t = 13 + lev1; - } - - *ctx = ( *ctx & 0xf ) * 16 + t; - } - else - { - /* mixed context */ - - if ( idx1 & 1 ) - { - /* update first context */ - c[p1] = update_mixed_context( c[p1], (int16_t) abs( x[a1_i] ) ); - } - - if ( idx2 & 1 ) - { - /* update second context */ - c[p2] = update_mixed_context( c[p2], (int16_t) abs( x[b1_i] ) ); - } - } - - } /*end of the 2-tuples loop*/ - - total_output_bits = (int16_t) ( bit_estimate + 0.5f ); - if ( *stop ) - { - total_output_bits = (int16_t) ( nbits2 + 0.5f ); - } - - if ( stop2 ) - { - stop2 = total_output_bits; - } - *nEncoded = lastnz2; - *stop = stop2; /* If zero, it means no overflow occured during bit-estimation */ - *lastnz_out = lastnz; - - /* Restore hole indices beyond lastnz */ - for ( k = numHoleIndices; k < hm_cfg->numHoleIndices; ++k ) - { - hm_cfg->holeIndices[k] = hm_cfg->holeIndices[k] - nt; - } - hm_cfg->numPeakIndices = numPeakIndicesOrig; - - return (int16_t) ( nbits2 + 0.5f ); - } - else /* if (!hm_cfg) */ - { - int16_t esc_nb, cp, rateQ; - uint16_t s; - int16_t tot_bits2; - int16_t overflow_flag = 0; - - /* Rate flag */ - if ( target > 400 ) - { - rateFlag = 2; - } - else - { - rateFlag = 0; /* Select context-B for lower bitrates */ - } - - t = 0; - s = 0; - cp = 0; - lastnz = 1; - lastnz2 = 0; - tot_bits2 = 0; - - /* Find last non-zero tuple in the mapped domain signal */ - for ( lastnz = ( nt - 2 ); lastnz >= 0; lastnz -= 2 ) - { - if ( ( x[lastnz] != 0 ) || ( x[lastnz + 1] != 0 ) ) - { - break; - } - } - lastnz += 2; - if ( lastnz < 2 ) - { - lastnz = 2; /* At least one tuple is coded */ - } - - lastnz2 = 2; - - /* Main Loop through the 2-tuples */ - for ( k = 0; k < lastnz; k += 2 ) - { - /* Init current 2-tuple encoding */ - a1 = (int16_t) abs( x[k] ); - b1 = (int16_t) abs( x[k + 1] ); - lev1 = 0; - esc_nb = 0; - rateQ = rateFlag + ( k > ( nt >> 1 ) ); - - /* Signs Bits */ - bit_estimate += min( a1, 1 ); - bit_estimate += min( b1, 1 ); - - /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ - lookup = &ari_lookup_s17_LC[t + ( rateQ << NBITS_CONTEXT )]; - - /* check while condition */ - /* MSBs coding */ - while ( max( a1, b1 ) >= A_THRES ) - { - pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; - - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; - bit_estimate += 2; /* Add 2 LSB bits corresponding to the bit-plane */ - - ( a1 ) >>= 1; - ( b1 ) >>= 1; - - lev1++; - esc_nb = min( lev1, 3 ); - - /* check while condition */ - } - - pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; - - symbol = a1 + A_THRES * b1; - bit_estimate = bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; - - /* Should we truncate? */ - if ( bit_estimate > target ) /* Overflow occured */ - { - overflow_flag = 1; - } - else - { - if ( abs( x[k] ) || abs( x[k + 1] ) ) /* No overflow & non-zero tuple */ - { - nbits2 = bit_estimate; - lastnz2 = k + 2; - } - } - - /* Update context for next 2-tuple */ - if ( esc_nb < 2 ) - { - cp = 1 + ( a1 + b1 ) * ( esc_nb + 1 ); - } - else - { - cp = 12 + esc_nb; - } - /*shift old bits and replace last 4 bits*/ - s = ( s << 4 ) + cp; - t = s & 0xFF; - - } /*end of the 2-tuples loop*/ - - tot_bits2 = (int16_t) ( nbits2 + 0.5f ); - if ( lastnz2 < lastnz ) /* Overflow occured because unable to code all tuples */ - { - overflow_flag = 1; - } - if ( mode == -1 ) - { - tot_bits2 = (int16_t) ( bit_estimate + 0.5f ); - } - if ( overflow_flag == 0 ) /* No overflow */ - { - *stop = 0; - } - else /* Overflow */ - { - if ( *stop ) - { - *stop = tot_bits2; - } - else - { - *stop = (int16_t) ( bit_estimate + 0.5f ); - } - } - - *lastnz_out = lastnz; - *nEncoded = lastnz2; - /* Safety mechanism to avoid overflow */ - if ( lastnz2 == 2 && overflow_flag == 1 ) - { - for ( k = 0; k < lastnz2; k++ ) - { - x[k] = 0; - } - } - - return tot_bits2; - } -} - -/*-------------------------------------------------------------------* - * RCcontextMapping_encode2_estimate_bandWise_start() - * - * Range coder - start bandwise bit-estimation - *-------------------------------------------------------------------*/ - -int16_t RCcontextMapping_encode2_estimate_bandWise_start( - int16_t *x, - const int16_t nt, - const int16_t target, - HANDLE_RC_CONTEXT_MEM hContextMem ) -{ - int16_t i, k; - - /* Rate flag */ - if ( target > 400 ) - { - hContextMem->rateFlag = 2 << NBITS_CONTEXT; - } - else - { - hContextMem->rateFlag = 0; - } - - hContextMem->bit_estimate = 2.0f; - - /* Init */ - hContextMem->nt_half = nt >> 1; - - /* bits to encode lastnz */ - k = 1; - - while ( k < hContextMem->nt_half ) - { - hContextMem->bit_estimate++; - - k = k << 1; - /* check while condition */ - } - - /* bits to encode lastnz */ - hContextMem->nbits_old = (int16_t) hContextMem->bit_estimate; - - hContextMem->ctx = 0; - hContextMem->lastnz = 2; - - /* Find last non-zero tuple */ - - for ( i = nt; i >= 4; i -= 2 ) - { - - if ( x[i - 2] != 0 || x[i - 1] != 0 ) - { - hContextMem->lastnz = i; - break; - } - } - - return (int16_t) hContextMem->bit_estimate; -} - -/*-------------------------------------------------------------------* - * RCcontextMapping_encode2_estimate_bandWise() - * - * Range coder - bandwise bit-estimation - *-------------------------------------------------------------------*/ - -int16_t RCcontextMapping_encode2_estimate_bandWise( - int16_t *x, - const int16_t start_line, - const int16_t end_line, - HANDLE_RC_CONTEXT_MEM hContextMem ) -{ - int16_t a1, b1, a1_i, b1_i; - int16_t k, pki, lev1; - uint16_t t; - int16_t bandBits = 0; - int16_t total_output_bits; /* No. of bits after finalization */ - int16_t symbol; - const uint8_t *lookup; - int16_t idx; - - /* Main Loop through the 2-tuples */ - /*hContextMem->nt_half = end_line >> 1;*/ - for ( k = start_line; k < min( hContextMem->lastnz, end_line ); k += 2 ) - { - a1_i = k; - b1_i = k + 1; - - idx = k; - - /* Get context */ - t = hContextMem->ctx + hContextMem->rateFlag; - t += ( hContextMem->nt_half >= idx ) ? 0 : ( 1 << NBITS_CONTEXT ); - - /* Init current 2-tuple encoding */ - a1 = (int16_t) abs( x[a1_i] ); - b1 = (int16_t) abs( x[b1_i] ); - lev1 = -( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* Signs Bits */ - hContextMem->bit_estimate += min( a1, 1 ); - hContextMem->bit_estimate += min( b1, 1 ); - - /* pre-compute address of ari_pk_s17_LC_ext[0][Val_esc] to avoid doing it multiple times inside the loop */ - lookup = &ari_lookup_s17_LC[t] + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - - /* check while condition */ - /* MSBs coding */ - while ( max( a1, b1 ) >= A_THRES ) - { - pki = lookup[lev1]; - hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; - hContextMem->bit_estimate += 2; /* Add the 2 LSB bits that were shifted out */ - - ( a1 ) >>= 1; - ( b1 ) >>= 1; - - lev1 = min( lev1 + ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); - /* check while condition */ - } - - pki = lookup[lev1]; - symbol = a1 + A_THRES * b1; /* MSB symbol */ - hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; - - /* Update context */ - lev1 >>= NBITS_CONTEXT + NBITS_RATEQ; - - if ( lev1 <= 0 ) - { - t = 1 + ( a1 + b1 ) * ( lev1 + 2 ); - } - else - { - t = 13 + lev1; - } - - hContextMem->ctx = ( hContextMem->ctx & 0xf ) * 16 + t; - - } /*end of the 2-tuples loop*/ - total_output_bits = (int16_t) ( hContextMem->bit_estimate + 0.5f ); - - bandBits = total_output_bits - hContextMem->nbits_old; - hContextMem->nbits_old = total_output_bits; - - return bandBits; -} - -#endif diff --git a/lib_enc/gs_enc_fx.c b/lib_enc/gs_enc_fx.c index 77470c255..7bf52970d 100644 --- a/lib_enc/gs_enc_fx.c +++ b/lib_enc/gs_enc_fx.c @@ -78,13 +78,7 @@ void encod_audio_fx( * Encode GSC attack flag (used to reduce possible pre-echo) * Encode GSC SWB speech flag *---------------------------------------------------------------*/ -#ifdef GSC_IVAS // TVB -->>>>>> - test(); - IF( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 ) - { - push_indice( hBstr, IND_GSC_IVAS_SP, st_fx->GSC_IVAS_mode, 2 ); - } -#endif + IF( attack_flag > 0 ) { push_indice( hBstr, IND_GSC_ATTACK, 1, 1 ); diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index d358f7099..76640e7a7 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -58,10 +58,6 @@ static void calculate_energy_buffer_ivas_fx( CPE_ENC_HANDLE hCPE, Word32 enerBuffer_dft[], const Word16 no_channels, const Word32 input_Fs, Word16 enerBuffer_dft_e[] ); -#ifdef IVAS_FIXED_ENC -static void calculate_energy_buffer_fx( CPE_ENC_HANDLE hCPE, Word64 enerBuffer_dft_fx[], Word16 *enerBuffer_dft_q_fx, const Word16 no_channels, const Word32 input_Fs ); -#endif - /*-------------------------------------------------------------------* * pre_proc_front_ivas() * @@ -1684,69 +1680,6 @@ ivas_error pre_proc_front_ivas_fx( return error; } -#ifdef IVAS_FIXED_ENC -/*-------------------------------------------------------------------* - * calculate_energy_buffer_fx() - * - * calculate DFT-based energies - *--------------------------------------------------------------------*/ - -static void calculate_energy_buffer_fx( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - Word64 enerBuffer_dft_fx[], /* o : energy buffer */ - Word16 *enerBuffer_dft_q_fx, - const Word16 no_channels, /* i : no. of used CLDFB channels */ - const Word32 input_Fs /* i : input sampling rate */ -) -{ - Word16 i, j; - Word64 nrg_DMX_fx[CLDFB_NO_CHANNELS_MAX]; - Word64 *p_nrg_DMX_fx; - Word32 *pDFT_DMX_fx; - Word16 *pDFT_DMX_q_fx; - Word32 chan_width_bins_fx; - Word16 band_res_dft_fx, chan_width_f_fx, start, stop; - - Word16 temp_q1 = norm_l( input_Fs ) - 1; - Word16 temp_q2 = norm_s( hCPE->hStereoDft->NFFT ); - - band_res_dft_fx = div_l( L_shl( input_Fs, temp_q1 ), shl( hCPE->hStereoDft->NFFT, temp_q2 ) ); - chan_width_f_fx = 24000 / CLDFB_NO_CHANNELS_MAX; - chan_width_bins_fx = L_shl( (Word32) div_s( chan_width_f_fx, band_res_dft_fx ), ( sub( add( temp_q1, 1 ), temp_q2 ) ) ); // Q16 - - pDFT_DMX_fx = hCPE->hStereoDft->DFT_fx[0]; - pDFT_DMX_q_fx = hCPE->hStereoDft->DFT_q_fx; - start = 1; - p_nrg_DMX_fx = nrg_DMX_fx; - - *p_nrg_DMX_fx = Mpy_32_32( pDFT_DMX_fx[0], pDFT_DMX_fx[0] ); - - FOR( i = 0; i < no_channels; i++ ) - { - stop = (Word16) ( L_add( Mpy_32_16_1( chan_width_bins_fx, add( i, 1 ) ), 1 ) >> 1 ); - FOR( j = start; j < stop; j++ ) - { - *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, Mpy_32_32( pDFT_DMX_fx[2 * j], pDFT_DMX_fx[2 * j] ) ); - *p_nrg_DMX_fx = W_add( *p_nrg_DMX_fx, Mpy_32_32( pDFT_DMX_fx[2 * j + 1], pDFT_DMX_fx[2 * j + 1] ) ); - } - enerBuffer_dft_q_fx[i] = 2 * pDFT_DMX_q_fx[i] - 31; - start = stop; - p_nrg_DMX_fx++; - } - - FOR( i = 0; i < no_channels; i++ ) /* Consider only used channels, dependent on Fs */ - { - enerBuffer_dft_fx[i] = nrg_DMX_fx[i] / 3; - } - - /* Set remaining entries of enerBuffer to zero */ - FOR( ; i < CLDFB_NO_CHANNELS_MAX; i++ ) - { - enerBuffer_dft_fx[i] = 0; - } - return; -} -#endif /*-------------------------------------------------------------------* * calculate_energy_buffer() * diff --git a/lib_enc/lsf_msvq_ma_enc_fx.c b/lib_enc/lsf_msvq_ma_enc_fx.c index 8f6a21d03..593efa784 100644 --- a/lib_enc/lsf_msvq_ma_enc_fx.c +++ b/lib_enc/lsf_msvq_ma_enc_fx.c @@ -570,9 +570,6 @@ Word16 Q_lsf_tcxlpc_fx( lpcorder, lpcorder, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_q ); NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); @@ -617,9 +614,6 @@ Word16 Q_lsf_tcxlpc_fx( lpcorder, lpcorder, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_rem_q_ind ); NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); @@ -724,9 +718,6 @@ Word16 Q_lsf_tcxlpc_ivas_fx( lpcorder, lpcorder, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_q ); NumIndices = add( NumIndices, TCXLPC_NUMSTAGES ); @@ -772,9 +763,6 @@ Word16 Q_lsf_tcxlpc_ivas_fx( lpcorder, lpcorder, indices + NumIndices, -#ifdef IVAS_MSVQ - 0, NULL, -#endif lsf_rem_q_ind ); NumIndices = add( NumIndices, TCXLPC_IND_NUMSTAGES ); -- GitLab From 3fa130bab9a069fe719266955e142002ab8e3253 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 15 May 2025 15:17:39 +0200 Subject: [PATCH 0606/1310] Correct asignments of Q_syn_OverlFB which was wrong or missing at some places. --- lib_dec/core_dec_init_fx.c | 17 ++++++++++++++++- lib_dec/er_dec_acelp_fx.c | 4 ++++ lib_dec/er_dec_tcx_fx.c | 20 ++++++++++++++++++++ lib_dec/evs_dec_fx.c | 2 +- lib_dec/ivas_core_dec_fx.c | 3 ++- lib_dec/ivas_mdct_core_dec_fx.c | 12 ++++++------ lib_dec/ivas_stereo_switching_dec_fx.c | 4 ++++ 7 files changed, 53 insertions(+), 9 deletions(-) diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index 3ddecdbd5..b83fa8398 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -396,8 +396,15 @@ void open_decoder_LPD_fx( move16(); Copy( hHQ_core->fer_samples_fx + delay_comp, hTcxDec->syn_OverlFB, shr( hTcxDec->L_frameTCX, 1 ) ); /* hHQ_core->Q_fer_samples*/ - +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hTcxDec->Q_syn_OverlFB = hHQ_core->Q_fer_samples; + move16(); +#endif lerp( hHQ_core->fer_samples_fx + delay_comp, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( hTcxDec->L_frameTCX, 1 ) ); /*Q0: ACELP(bfi)->TCX(rect)*/ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hTcxDec->Q_syn_Overl = hHQ_core->Q_fer_samples; + move16(); +#endif /*old_out needed for MODE1 routine and syn_Overl_TDAC for MODE2 routine*/ hHQ_core->Q_old_wtda = -1; @@ -1070,7 +1077,15 @@ void acelp_plc_mdct_transition_fx( move16(); /*CLDFB delay*/ Copy( st->hHQ_core->fer_samples_fx + delay_comp, st->hTcxDec->syn_OverlFB, shr( st->hTcxDec->L_frameTCX, 1 ) ); /* Q_fer_samples */ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hTcxDec->Q_syn_OverlFB = st->hHQ_core->Q_fer_samples; + move16(); +#endif lerp( st->hHQ_core->fer_samples_fx + delay_comp, st->hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( st->hTcxDec->L_frameTCX, 1 ) ); /*ACELP(bfi)->TCX(rect)*/ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hTcxDec->Q_syn_Overl = st->hHQ_core->Q_fer_samples; + move16(); +#endif /*old_out needed for MODE1 routine and syn_Overl_TDAC for MODE2 routine*/ st->hHQ_core->Q_old_wtda = -1; move16(); diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index e1321d9aa..bcbff9b76 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -1104,6 +1104,10 @@ void con_acelp_fx( st->hTcxDec->Q_syn_Overl_TDACFB = st->hTcxDec->Q_syn_Overl_TDAC; move16(); lerp( hTcxDec->syn_Overl, hTcxDec->syn_OverlFB, shr( hTcxDec->L_frameTCX, 1 ), shr( st->L_frame, 1 ) ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hTcxDec->Q_syn_OverlFB = hTcxDec->Q_syn_Overl; + move16(); +#endif lerp( hHQ_core->old_out_LB_fx, hHQ_core->old_out_fx, hTcxDec->L_frameTCX, st->L_frame ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index f5b8a1359..912bd9e9d 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -910,7 +910,13 @@ void con_tcx_fx( bufferCopyFx( syn, synth, L_frame, Q_syn, 0, 0, 0 ); /*Q_syn*/ BASOP_SATURATE_WARNING_ON_EVS +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), sub( 0, Q_syn ) ); /*Q0*/ + hTcxDec->Q_syn_OverlFB = 0; + move16(); +#else Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), negate( Q_syn ) ); /*Q0*/ +#endif /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */ IF( st->hWIDec != NULL ) @@ -973,6 +979,10 @@ void con_tcx_fx( /* update memory for low band */ Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/ lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hTcxDec->Q_syn_Overl = hTcxDec->Q_syn_OverlFB; + move16(); +#endif lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); @@ -1865,7 +1875,13 @@ void con_tcx_ivas_fx( bufferCopyFx( syn, synth, L_frame, Q_syn, 0, 0, 0 ); /*Q_syn*/ BASOP_SATURATE_WARNING_ON_EVS +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), sub( 0, Q_syn ) ); /*Q0*/ + hTcxDec->Q_syn_OverlFB = 0; + move16(); +#else Copy_Scale_sig( syn + L_frame, hTcxDec->syn_OverlFB, shr( L_frame, 1 ), negate( Q_syn ) ); /*Q0*/ +#endif /* copy total excitation exc2 as 16kHz for acelp mode1 decoding */ IF( st->hWIDec != NULL ) @@ -1934,6 +1950,10 @@ void con_tcx_ivas_fx( st->hTcxDec->Q_old_syn_Overl = -1; #endif lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hTcxDec->Q_syn_Overl = hTcxDec->Q_syn_OverlFB; + move16(); +#endif lerp( hTcxDec->syn_Overl_TDACFB, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 9f08a281b..38bd7de24 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -167,7 +167,7 @@ ivas_error evs_dec_fx( tmp1 = extract_l( L_shr_r( f, s ) ); /*Q14 - s*/ FOR( i = 0; i < st_fx->hTcxCfg->tcx_mdct_window_lengthFB; i++ ) { - hTcxDec->syn_OverlFB[i] = shl_sat( mult_sat( tmp1, hTcxDec->syn_OverlFB[i] ), add( s, 1 ) ); /*hTcxDec->Q_syn_Overl*/ + hTcxDec->syn_OverlFB[i] = shl_sat( mult_sat( tmp1, hTcxDec->syn_OverlFB[i] ), add( s, 1 ) ); /*hTcxDec->Q_syn_OverlFB*/ move16(); } s = norm_l( f ); diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index a27213b6e..e4fb48f4a 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -707,6 +707,7 @@ ivas_error ivas_core_dec_fx( st->hHQ_core->Q_fer_samples = 0; move16(); } +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT IF( NE_16( st->core, st->last_core ) ) { IF( st->hTcxDec ) @@ -716,7 +717,7 @@ ivas_error ivas_core_dec_fx( st->Q_syn = 0; move16(); } - +#endif st->prev_Q_syn = st->Q_syn; move16(); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 1776f82e8..e66704cd2 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1295,8 +1295,8 @@ void ivas_mdct_core_reconstruct_fx( move16(); } - Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth - Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) ); + Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // q_win + Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) ); // q_winFB test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) @@ -1331,7 +1331,8 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_Overl = st->Q_syn; Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn - Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); + //Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); + Scale_sig( st->syn, M + 1, sub( st->Q_syn, q_win ) ); #else test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) @@ -1377,9 +1378,8 @@ void ivas_mdct_core_reconstruct_fx( move16(); #endif #endif -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - Scale_sig( st->mem_syn2_fx, M, sub( -2, q_win ) ); - // Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD_NO + Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, q_win ) ); // q_win -> Q_syn #endif } ELSE /*ACELP core for ACELP-PLC */ diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 454395648..706b9b568 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -68,6 +68,10 @@ static ivas_error allocate_CoreCoder_TCX_fx( reset_tcx_overl_buf_fx( st->hTcxDec ); // st->hTcxDec->CngLevelBackgroundTrace_bfi = 0; //initializing to avoid garbage overflow; set16_fx( st->hTcxDec->syn_OverlFB, 0, L_FRAME48k / 2 ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hTcxDec->Q_syn_OverlFB = 0; + move16(); +#endif set16_fx( st->hTcxDec->old_synth, 0, OLD_SYNTH_INTERNAL_DEC ); st->hTcxDec->q_old_synth = 0; move16(); -- GitLab From dfc50802bda62c6b840317904bc9b11c45ff1c16 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 15 May 2025 15:20:32 +0200 Subject: [PATCH 0607/1310] clang format --- lib_dec/core_dec_init_fx.c | 2 +- lib_dec/ivas_mdct_core_dec_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/core_dec_init_fx.c b/lib_dec/core_dec_init_fx.c index b83fa8398..d5a1dfeb0 100644 --- a/lib_dec/core_dec_init_fx.c +++ b/lib_dec/core_dec_init_fx.c @@ -1076,7 +1076,7 @@ void acelp_plc_mdct_transition_fx( delay_comp = NS2SA_FX2( st->output_Fs, DELAY_CLDFB_NS ); move16(); /*CLDFB delay*/ - Copy( st->hHQ_core->fer_samples_fx + delay_comp, st->hTcxDec->syn_OverlFB, shr( st->hTcxDec->L_frameTCX, 1 ) ); /* Q_fer_samples */ + Copy( st->hHQ_core->fer_samples_fx + delay_comp, st->hTcxDec->syn_OverlFB, shr( st->hTcxDec->L_frameTCX, 1 ) ); /* Q_fer_samples */ #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT st->hTcxDec->Q_syn_OverlFB = st->hHQ_core->Q_fer_samples; move16(); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index e66704cd2..2940a169b 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1331,7 +1331,7 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_Overl = st->Q_syn; Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn - //Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); + // Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->syn, M + 1, sub( st->Q_syn, q_win ) ); #else test(); -- GitLab From 9794aa2354b81a26a823e6d62f76051849667e8b Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 15 May 2025 17:28:28 +0200 Subject: [PATCH 0608/1310] Increase headroom in q_win calculation. Fixes regression for MASA_2dir_2TC_bitrate_switching_from_13_2_kbps_to_512_kbps_48kHz_in_48kHz_out_EXT_out_JBM_Prof_5 --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 2637f52d7..b51493262 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3396,7 +3396,7 @@ void IMDCT_ivas_fx( // sub( q_xn_buf_fx_32, q_win ) == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_xn_buf_fx_32 - q_win == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 - q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 1 ); + q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 2 ); } IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif -- GitLab From cd5178b3818c86d3bd2b1668cb03ec2ffd9da4cb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 08:59:14 +0530 Subject: [PATCH 0609/1310] Fix for 3GPP issue 1583: Very high MLD for ParamMC 5.1+4 at 96kbps 16kHz input Link #1583 --- lib_enc/ivas_mc_param_enc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 3058f87f3..7f74f78f9 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -768,8 +768,8 @@ static void ivas_param_mc_param_est_enc_fx( #endif #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE - sub35gb = sub( 35, find_guarded_bits_fx( l_ts ) ); - sub62gb = sub( 62, find_guarded_bits_fx( l_ts ) ); + sub35gb = sub( 32, sub( 11, find_guarded_bits_fx( l_ts ) ) ); // 31 - (((11 - gb) + 31 + norm) - 32) + sub62gb = sub( 63, shl( sub( 11, find_guarded_bits_fx( l_ts ) ), 1 ) ); // 31 - ((2*(11 - gb) + norm) - 32) #endif FOR( ts = start_ts; ts < num_time_slots; ts++ ) -- GitLab From 4ed5935ef4fe8baca2b1119da638f3ad497fbdb1 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 15 May 2025 17:49:55 +0530 Subject: [PATCH 0610/1310] Fix for 3GPP issue 1517: SBA Decoder: Differences for binaural rendered signals at 64 kbit/s Link #1517 --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 16fefa3bb..e7881ba53 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -1265,12 +1265,14 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric temp64 = W_add( W_mult0_32_32( tempRe, tempRe ), W_mult0_32_32( tempIm, tempIm ) ); // 2q exp1 = W_norm( temp64 ); temp64 = W_shl( temp64, exp1 ); // 2q + exp1 - subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameTotalEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameTotalEne_e[bin] ); + subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameSumEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameSumEne_e[bin] ); move32(); } } FOR( bin = 0; bin < nBins; bin++ ) { + subFrameTotalEne_e[bin] = sub( subFrameTotalEne_e[bin], 1 ); + move16(); temp = L_shl_sat( subFrameTotalEne_fx[bin], sub( subFrameTotalEne_e[bin], subFrameSumEne_e[bin] ) ); // subFrameSumEne_e[bin] IF( GT_32( subFrameSumEne_fx[bin], temp ) ) { -- GitLab From 8b3835aed14dd4a3aa0d3436db146b0a3fb1f8f7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 12:26:14 +0530 Subject: [PATCH 0611/1310] Fix for 3GPP issue 1469: Somewhat high MLD on a single MASA selection test material case with BASOP decoder Link #1469 --- lib_com/prot_fx.h | 2 +- lib_com/stat_noise_uv_mod_fx.c | 58 +++++++++++++++++++--------------- lib_dec/acelp_core_dec_fx.c | 6 ++++ lib_dec/stat_noise_uv_dec_fx.c | 2 +- lib_enc/acelp_core_enc_fx.c | 5 +-- lib_enc/prot_fx_enc.h | 2 +- lib_enc/stat_noise_uv_enc_fx.c | 2 +- 7 files changed, 45 insertions(+), 32 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 6d3e28de2..a1e633c17 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8234,7 +8234,7 @@ void stat_noise_uv_mod_ivas_fx( const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ Word16 *uv_count, /* i/o: unvoiced counter */ diff --git a/lib_com/stat_noise_uv_mod_fx.c b/lib_com/stat_noise_uv_mod_fx.c index 67ca21cd2..c259745f2 100644 --- a/lib_com/stat_noise_uv_mod_fx.c +++ b/lib_com/stat_noise_uv_mod_fx.c @@ -330,7 +330,6 @@ void stat_noise_uv_mod_fx( } } } - /*--------------------------------------------------------------------* * stat_noise_uv_mod() * @@ -345,7 +344,7 @@ void stat_noise_uv_mod_ivas_fx( const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ Word16 *uv_count, /* i/o: unvoiced counter */ @@ -370,8 +369,9 @@ void stat_noise_uv_mod_ivas_fx( Word16 oldlsp_mix[M]; Word16 midlsp_mix[M]; Word16 newlsp_mix[M]; - Word16 beta; /* Q15 */ - Word16 Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ + Word16 beta; /* Q15 */ + Word16 Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ + Word32 L_Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ /* noimix_fax * x <-> x + Noimix_fract * x */ Word16 i_subfr; Word16 i, k; @@ -382,7 +382,8 @@ void stat_noise_uv_mod_ivas_fx( Word32 L_tmp_res, L_tmp, L_tmp3, L_Ge; Word16 En_shift, Tmp; - Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ + Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ + Word32 L_Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); @@ -437,9 +438,9 @@ void stat_noise_uv_mod_ivas_fx( Copy( exc2, Exc2_local, L_FRAME ); /* bound Q for internal use, optimization possible */ - Q_local = s_min( 11, s_max( -1, Q_exc ) ); + Q_local = s_min( 11, s_max( -1, *Q_exc ) ); /* local excitation Q and incoming excitation Q*/ - Qdiff = sub( Q_local, Q_exc ); + Qdiff = sub( Q_local, *Q_exc ); /* only shift if incoming Q is outside [11..-1] shift is done in energy calculations aswell */ Scale_sig( Exc2_local, L_FRAME, Qdiff ); /* current excitation Q and previous stat_noise states Q */ @@ -539,14 +540,11 @@ void stat_noise_uv_mod_ivas_fx( L_tmp_res = L_mac( 0, alpha, alpha ); L_tmp_res = L_mac( L_tmp_res, alpha_m1, alpha_m1 ); tmp_den = round_fx( L_Frac_sqrtQ31( L_tmp_res ) ); - - tmp_nom = sub( 32767, tmp_den ); - tmp_shift = norm_s( tmp_den ); - tmp_den = shl( tmp_den, tmp_shift ); - tmp_res = div_s( tmp_nom, tmp_den ); - - Noimix_fract = shr( tmp_res, tmp_shift ); /* float value is in range 0.0 to 0.42 */ - + Word16 exp_sqr = 0; + move16(); + tmp_res = BASOP_Util_Divide1616_Scale( 32767, tmp_den, &exp_sqr ); // 15-exp_sqr + Noimix_fract = tmp_res; // 15-exp_sqr + move16(); /* L_Ge might be 0 in unvoiced WB */ L_Ge = L_max( L_Ge, 1 ); tmp_shift = norm_l( L_Ge ); @@ -555,9 +553,7 @@ void stat_noise_uv_mod_ivas_fx( L_tmp_res = Mult_32_16( *ge_sm, tmp_res ); /* Q_stat_noise_ge+45-Q_local-Q_ge-tmp_shift-15 */ L_tmp_res = Mult_32_16( L_tmp_res, sub( 32767, beta ) ); /*30-Q_local-tmp_shift+15-15 */ L_tmp_res = L_add_sat( L_shl_sat( L_tmp_res, sub( add( Q_local, tmp_shift ), 15 ) ), beta ); /* Q15 */ - tmp_res = extract_h( L_shl_o( L_tmp_res, 15, &Overflow ) ); /* 15+15-16=14 */ - - Noimix_fract = extract_l( Mult_32_16( L_tmp_res, Noimix_fract ) ); /*15+15-15 */ + L_Noimix_fract = Mult_32_16( L_tmp_res, Noimix_fract ); /*15+15-exp_sqr-15 =15-exp_sqr */ FOR( i = 0; i < L_FRAME; i++ ) { @@ -573,18 +569,27 @@ void stat_noise_uv_mod_ivas_fx( randval = mult_r( 28378, randval ); /* Q downscaled by 2 bits ends up in Q14 */ /*sqrt(12.0f) in Q13*/ randval = extract_l( L_shl( Mult_32_16( L_Ge, randval ), sub( 1, *Q_stat_noise_ge ) ) ); /*Q_local+Q_ge+14-15+1-Q_ge=Q_local */ - L_tmp = L_mult( Exc2_local[i], alpha ); /* Q_local + 16 */ - L_tmp = L_mac( L_tmp, randval, alpha_m1 ); /* Q_local + 16 */ - L_tmp3 = Mult_32_16( L_tmp, Noimix_fract ); /* Q_local+16+15-15 */ - L_tmp = L_add_sat( L_tmp3, L_shl_sat( Mult_32_16( L_tmp, tmp_res ), 1 ) ); /* Q_local+16+14-15+1 */ - Exc2_local[i] = extract_h( L_tmp ); /*Q_local */ + L_tmp = L_mult( Exc2_local[i], alpha ); /* Q_local + 16 */ + L_tmp = L_mac( L_tmp, randval, alpha_m1 ); /* Q_local + 16 */ + L_tmp3 = Mult_32_32( L_tmp, L_Noimix_fract ); /* Q_local+16+15-exp_sqr-15 =Q_local +1 */ + L_Exc2_local[i] = L_add( L_shr( L_tmp3, 1 ), Mpy_32_32( L_tmp, L_tmp_res ) ); // Q_local + 16 +15 -31 = Q_local + move32(); + } + Word32 max_val; + maximum_abs_32_fx( L_Exc2_local, L_FRAME, &max_val ); + Word16 shift = 0; + move16(); + IF( GT_32( max_val, ONE_IN_Q15 ) ) + { + shift = norm_l( max_val ); + shift = sub( Q31 - Q15, shift ); + *Q_exc = sub( Q_local, shift ); // Q_exc = Q_local -shift move16(); } *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ move16(); - Qdiff = sub( Q_exc, Q_local ); /* local excitation and incoming excitation */ - Scale_sig( Exc2_local, L_FRAME, Qdiff ); - Copy( Exc2_local, exc2, L_FRAME ); + + Copy_Scale_sig_32_16( L_Exc2_local, exc2, L_FRAME, negate( shift ) ); // Q_exc /*--------------------------------------------------------------------* * Generate low-pass filtered version of ISP coefficients @@ -635,6 +640,7 @@ void stat_noise_uv_mod_ivas_fx( } } } + /*---------------------------------------------------------------------------* * calc_tilt() * diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 2c72bba78..2fff712f9 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -1165,7 +1165,13 @@ ivas_error acelp_core_dec_fx( test(); IF( !( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) && NE_16( st->nelp_mode_dec, 1 ) && !( EQ_16( st->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) { + Word16 temp_q_exc = st->Q_exc; + move16(); stat_noise_uv_dec_fx( st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); + IF( NE_16( temp_q_exc, st->Q_exc ) ) + { + scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM + st->L_frame, sub( st->Q_exc, temp_q_exc ) ); + } } /*------------------------------------------------------------* diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index d2fa36b9b..4e4d7ca30 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -76,7 +76,7 @@ void stat_noise_uv_dec_fx( IF( !st_fx->Opt_AMR_WB ) { - stat_noise_uv_mod_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index ceba860a1..6ba21136e 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -1449,8 +1449,9 @@ ivas_error acelp_core_enc_ivas_fx( { /* exc2 buffer is needed only for updating of Aq[] which is needed for core switching */ Copy( exc_fx, exc2_fx, st->L_frame ); // Q_new - - stat_noise_uv_enc_ivas_fx( st, epsP, lsp_new, lsp_mid, Aq, exc2_fx, uc_two_stage_flag, Q_new ); + Word16 q_exc2 = Q_new; + move16(); + stat_noise_uv_enc_ivas_fx( st, epsP, lsp_new, lsp_mid, Aq, exc2_fx, uc_two_stage_flag, &q_exc2 ); } /*-----------------------------------------------------------------* diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 968ab0082..72137bdce 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -2189,7 +2189,7 @@ void stat_noise_uv_enc_ivas_fx( Word16 *Aq, /* i : A(z) quantized for the 4 subframes Q=12 */ Word16 *exc2, /* i/o: excitation buffer Q=Q_stat_noise */ const Word16 uc_two_stage_flag, /* o : flag undicating two-stage UC */ - Word16 Q_new ); + Word16 *Q_new ); void analy_sp_fx( const Word16 element_mode, /* i : element mode */ diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index 1445559a1..24932542c 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -118,7 +118,7 @@ void stat_noise_uv_enc_ivas_fx( Word16 *Aq, /* i : A(z) quantized for the 4 subframes Q=12 */ Word16 *exc2, /* i/o: excitation buffer Q=Q_stat_noise */ const Word16 uc_two_stage_flag, /* o : flag undicating two-stage UC */ - Word16 Q_new ) + Word16 *Q_new ) { Word16 noisiness = 0; move16(); -- GitLab From 2af7b50f076aabae91b52c2ba32beca40c9b892a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 12:32:36 +0530 Subject: [PATCH 0612/1310] Clang formatting changes --- lib_com/prot_fx.h | 2 +- lib_dec/stat_noise_uv_dec_fx.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index a1e633c17..c7d35daca 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8234,7 +8234,7 @@ void stat_noise_uv_mod_ivas_fx( const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ Word16 *uv_count, /* i/o: unvoiced counter */ diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index 4e4d7ca30..e2dc1460e 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -77,9 +77,9 @@ void stat_noise_uv_dec_fx( IF( !st_fx->Opt_AMR_WB ) { stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, - st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, - &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); } -- GitLab From 0a38b3a4e97fbdf7641bec3ca9173bf1e4131295 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 14:45:18 +0530 Subject: [PATCH 0613/1310] Fix for EVS bitexactness issue --- lib_dec/stat_noise_uv_dec_fx.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index e2dc1460e..c87e30ffe 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -76,10 +76,20 @@ void stat_noise_uv_dec_fx( IF( !st_fx->Opt_AMR_WB ) { - stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, - st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, - &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + IF( st_fx->element_mode > EVS_MONO ) + { + stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + } + ELSE + { + stat_noise_uv_mod_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + } } -- GitLab From 701d1978b19ceae4fce47a162ae9816f690320d0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 30 Apr 2025 10:52:39 +0530 Subject: [PATCH 0614/1310] Optimizations for SBA path functions --- lib_com/cldfb.c | 450 +++++++++- lib_com/ivas_dirac_com_fx.c | 25 + lib_com/ivas_prot_fx.h | 20 +- lib_com/ivas_transient_det_fx.c | 19 +- lib_com/options.h | 2 + lib_com/rom_com.c | 773 ++++++++++++++++++ lib_com/rom_com_fx.h | 21 +- lib_com/stat_com.h | 7 +- lib_dec/ivas_dirac_dec_fx.c | 47 +- lib_dec/ivas_mct_core_dec_fx.c | 71 +- lib_dec/ivas_mct_dec_mct_fx_fx.c | 33 +- lib_dec/ivas_mdct_core_dec_fx.c | 4 + lib_dec/ivas_stereo_mdct_core_dec_fx.c | 6 + lib_dec/ivas_stereo_mdct_stereo_dec_fx.c | 20 +- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 345 +++++++- 15 files changed, 1779 insertions(+), 64 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index bf832b640..607d1bf9f 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -104,8 +104,12 @@ void cldfbAnalysis_ivas_fx( Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX]; const Word32 *rot_vctr_re_fx; const Word32 *rot_vctr_im_fx; +#ifdef OPT_IVAS_FILTER_ROM + const Word32 *ptr_pf_fx; +#else /* OPT_IVAS_FILTER_ROM */ const Word16 *ptr_pf_fx; Word16 ptr_pf_sf; +#endif /* OPT_IVAS_FILTER_ROM */ Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; @@ -147,8 +151,12 @@ void cldfbAnalysis_ivas_fx( rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx; +#ifdef OPT_IVAS_FILTER_ROM + ptr_pf_fx = h_cldfb->p_filter_32; +#else /* OPT_IVAS_FILTER_ROM */ ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ move16(); FOR( i = 0; i < no_col; i++ ) @@ -156,6 +164,32 @@ void cldfbAnalysis_ivas_fx( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx @@ -180,10 +214,11 @@ void cldfbAnalysis_ivas_fx( i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // Qx - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // Qx - 1 + r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // Qx - 1 + r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 + i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // Qx - 1 + i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // Qx - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_sub( r1_fx, r2_fx ); // Qx - 1 @@ -207,6 +242,31 @@ void cldfbAnalysis_ivas_fx( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // Qx + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // Qx + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // Qx + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // Qx +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // Qx r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // Qx r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // Qx @@ -235,6 +295,7 @@ void cldfbAnalysis_ivas_fx( r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // Qx - 1 i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // Qx - 1 i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // Qx - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_add( r1_fx, r2_fx ); // Qx - 1 @@ -323,8 +384,12 @@ void cldfbAnalysis_ts_fx( const Word32 *rot_vctr_im_fx; const Word32 *rot_vctr_delay_re_fx; const Word32 *rot_vctr_delay_im_fx; +#ifdef OPT_IVAS_FILTER_ROM + const Word32 *ptr_pf_fx; +#else /* OPT_IVAS_FILTER_ROM */ const Word16 *ptr_pf_fx; Word16 ptr_pf_sf; +#endif /* OPT_IVAS_FILTER_ROM */ Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; @@ -371,8 +436,12 @@ void cldfbAnalysis_ts_fx( rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31 rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31 +#ifdef OPT_IVAS_FILTER_ROM + ptr_pf_fx = h_cldfb->p_filter_32; +#else /* OPT_IVAS_FILTER_ROM */ ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ move16(); FOR( i = 0; i < no_col; i++ ) @@ -380,6 +449,31 @@ void cldfbAnalysis_ts_fx( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q @@ -404,10 +498,11 @@ void cldfbAnalysis_ts_fx( i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 + r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 + i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 + i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 @@ -417,8 +512,8 @@ void cldfbAnalysis_ts_fx( rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -431,8 +526,8 @@ void cldfbAnalysis_ts_fx( iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -441,6 +536,31 @@ void cldfbAnalysis_ts_fx( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q @@ -465,10 +585,11 @@ void cldfbAnalysis_ts_fx( i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 + r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 + i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 + i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 @@ -640,8 +761,12 @@ void cldfbAnalysis_ts_fx_var_q( const Word32 *rot_vctr_im_fx; const Word32 *rot_vctr_delay_re_fx; const Word32 *rot_vctr_delay_im_fx; +#ifdef OPT_IVAS_FILTER_ROM + const Word32 *ptr_pf_fx; +#else /* OPT_IVAS_FILTER_ROM */ const Word16 *ptr_pf_fx; Word16 ptr_pf_sf; +#endif /* OPT_IVAS_FILTER_ROM */ Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize; @@ -705,8 +830,12 @@ void cldfbAnalysis_ts_fx_var_q( rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31 rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31 +#ifdef OPT_IVAS_FILTER_ROM + ptr_pf_fx = h_cldfb->p_filter_32; +#else /* OPT_IVAS_FILTER_ROM */ ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ move16(); FOR( i = 0; i < no_col; i++ ) @@ -714,6 +843,31 @@ void cldfbAnalysis_ts_fx_var_q( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q @@ -738,10 +892,11 @@ void cldfbAnalysis_ts_fx_var_q( i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 + r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 + i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 + i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 @@ -765,6 +920,32 @@ void cldfbAnalysis_ts_fx_var_q( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q @@ -793,6 +974,7 @@ void cldfbAnalysis_ts_fx_var_q( r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 @@ -911,8 +1093,12 @@ void cldfbAnalysis_ts_fx_fixed_q( const Word32 *rot_vctr_im_fx; const Word32 *rot_vctr_delay_re_fx; const Word32 *rot_vctr_delay_im_fx; +#ifdef OPT_IVAS_FILTER_ROM + const Word32 *ptr_pf_fx; +#else /* OPT_IVAS_FILTER_ROM */ const Word16 *ptr_pf_fx; Word16 ptr_pf_sf; +#endif /* OPT_IVAS_FILTER_ROM */ Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; Word16 offset, frameSize, gb, hr, shift; @@ -958,8 +1144,12 @@ void cldfbAnalysis_ts_fx_fixed_q( rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31 rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31 +#ifdef OPT_IVAS_FILTER_ROM + ptr_pf_fx = h_cldfb->p_filter_32; +#else /* OPT_IVAS_FILTER_ROM */ ptr_pf_fx = h_cldfb->p_filter; - ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 + ptr_pf_sf = h_cldfb->p_filter_sf; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ move16(); FOR( i = 0; i < no_col; i++ ) @@ -967,6 +1157,31 @@ void cldfbAnalysis_ts_fx_fixed_q( FOR( k = 0; k < M4; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q @@ -991,10 +1206,11 @@ void cldfbAnalysis_ts_fx_fixed_q( i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 + r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 + i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 + i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 @@ -1018,6 +1234,31 @@ void cldfbAnalysis_ts_fx_fixed_q( FOR( k = M4; k < M2; k++ ) { /* prototype filter */ +#ifdef OPT_IVAS_FILTER_ROM + r1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + r1_fx = Msub_32_32( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + r2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + r2_fx = Msub_32_32( r2_fx, timeBuffer_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )] ); // q + + i1_fx = Msub_32_32( 0, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )] ); // q + i1_fx = Msub_32_32( i1_fx, timeBuffer_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )] ); // q + + i2_fx = Msub_32_32( 0, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q + i2_fx = Msub_32_32( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q +#else /* OPT_IVAS_FILTER_ROM */ r1_fx = Msub_32_16( 0, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )] ); // q r1_fx = Msub_32_16( r1_fx, timeBuffer_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )] ); // q @@ -1046,6 +1287,7 @@ void cldfbAnalysis_ts_fx_fixed_q( r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 +#endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 @@ -1203,8 +1445,12 @@ void cldfbSynthesis_ivas_fx( Word32 new_samples_fx[2 * CLDFB_NO_CHANNELS_MAX]; Word32 *ptr_time_out_fx; +#ifdef OPT_IVAS_FILTER_ROM + const Word32 *p_filter_32; +#else /* OPT_IVAS_FILTER_ROM */ const Word16 *p_filter; Word16 p_filter_sf; +#endif /* OPT_IVAS_FILTER_ROM */ Word32 accu0, accu1, accu2, accu3, accu4; Word16 no_col = h_cldfb->no_col; @@ -1234,9 +1480,12 @@ void cldfbSynthesis_ivas_fx( synthesisBuffer_fx = buffer_fx; Copy32( h_cldfb->cldfb_state_fx, synthesisBuffer_fx + i_mult( M1, no_col ), h_cldfb->p_filter_length ); +#ifdef OPT_IVAS_FILTER_ROM + p_filter_32 = h_cldfb->p_filter_32; +#else /* OPT_IVAS_FILTER_ROM */ p_filter = h_cldfb->p_filter; - p_filter_sf = h_cldfb->p_filter_sf; // Q14 - move16(); + p_filter_sf = h_cldfb->p_filter_sf; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ ptr_time_out_fx = timeOut_fx; /*synthesisBuffer += M1 * h_cldfb->no_col;*/ @@ -1347,11 +1596,19 @@ void cldfbSynthesis_ivas_fx( { FOR( i = 0; i < L2; i++ ) { +#ifdef OPT_IVAS_FILTER_ROM + accu0 = Madd_32_32( synthesisBuffer_fx[i], new_samples_fx[L2 - 1 - i], p_filter_32[i] ); // Qx - 1 + accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 1 * L2 + i )] ); // Qx - 1 + accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 2 * L2 + i )] ); // Qx - 1 + accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 3 * L2 + i )] ); // Qx - 1 + accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], new_samples_fx[L2 - 1 - i], p_filter_32[( 4 * L2 + i )] ); // Qx - 1 +#else /* OPT_IVAS_FILTER_ROM */ accu0 = Madd_32_16( synthesisBuffer_fx[i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[i] ), p_filter_sf ); // Qx - 1 accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 1 * L2 + i )] ), p_filter_sf ); // Qx - 1 accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 2 * L2 + i )] ), p_filter_sf ); // Qx - 1 accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 3 * L2 + i )] ), p_filter_sf ); // Qx - 1 accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter[( 4 * L2 + i )] ), p_filter_sf ); // Qx - 1 +#endif /* OPT_IVAS_FILTER_ROM */ synthesisBuffer_fx[i] = accu0; move32(); @@ -1370,12 +1627,21 @@ void cldfbSynthesis_ivas_fx( FOR( i = 0; i < L2; i++ ) { +#ifdef OPT_IVAS_FILTER_ROM + Word32 prod = L_shl_sat( ( new_samples_fx[L2 - 1 - i] ), shift ); + accu0 = Madd_32_32( synthesisBuffer_fx[i], prod, p_filter_32[i] ); // Qx -1 + shift + accu1 = Madd_32_32( synthesisBuffer_fx[1 * L2 + i], prod, p_filter_32[( 1 * L2 + i )] ); // Qx -1 + shift + accu2 = Madd_32_32( synthesisBuffer_fx[2 * L2 + i], prod, p_filter_32[( 2 * L2 + i )] ); // Qx -1 + shift + accu3 = Madd_32_32( synthesisBuffer_fx[3 * L2 + i], prod, p_filter_32[( 3 * L2 + i )] ); // Qx -1 + shift + accu4 = Madd_32_32( synthesisBuffer_fx[4 * L2 + i], prod, p_filter_32[( 4 * L2 + i )] ); // Qx -1 + shift +#else /* OPT_IVAS_FILTER_ROM */ Word32 prod = L_shl_sat( Mpy_32_16_1( new_samples_fx[L2 - 1 - i], p_filter_sf ), shift ); accu0 = Madd_32_16( synthesisBuffer_fx[i], prod, p_filter[i] ); // Qx -1 + shift accu1 = Madd_32_16( synthesisBuffer_fx[1 * L2 + i], prod, p_filter[( 1 * L2 + i )] ); // Qx -1 + shift accu2 = Madd_32_16( synthesisBuffer_fx[2 * L2 + i], prod, p_filter[( 2 * L2 + i )] ); // Qx -1 + shift accu3 = Madd_32_16( synthesisBuffer_fx[3 * L2 + i], prod, p_filter[( 3 * L2 + i )] ); // Qx -1 + shift accu4 = Madd_32_16( synthesisBuffer_fx[4 * L2 + i], prod, p_filter[( 4 * L2 + i )] ); // Qx -1 + shift +#endif /* OPT_IVAS_FILTER_ROM */ synthesisBuffer_fx[i] = accu0; move32(); @@ -1848,8 +2114,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; - hs->p_filter_sf = (Word16) 17036; // Q14 +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_10_fx; +#else /* OPT_IVAS_FILTER_ROM */ + hs->p_filter_sf = (Word16) 17036; // Q14 hs->p_filter = CLDFB80_10_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = CLDFB80_10_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1860,8 +2130,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_10_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15388; // Q14 hs->p_filter = LDQMF_10_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = LDQMF_10_SCALE_FX_Q8; } BREAK; @@ -1879,8 +2153,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_16_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17051; // Q14 hs->p_filter = CLDFB80_16_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = CLDFB80_16_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1891,8 +2169,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_16_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15388; // Q14 hs->p_filter = LDQMF_16_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = LDQMF_16_SCALE_FX_Q8; } BREAK; @@ -1910,8 +2192,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_20_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17050; // Q14 hs->p_filter = CLDFB80_20_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = CLDFB80_20_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1922,8 +2208,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_20_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15390; // Q14 hs->p_filter = LDQMF_20_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = LDQMF_20_SCALE_FX_Q8; } BREAK; @@ -1941,8 +2231,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_30_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17051; // Q14 hs->p_filter = CLDFB80_30_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = CLDFB80_30_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1953,8 +2247,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_30_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15388; // Q14 hs->p_filter = LDQMF_30_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = LDQMF_30_SCALE_FX_Q8; } BREAK; @@ -1972,8 +2270,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_32_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17050; // Q14 hs->p_filter = CLDFB80_32_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = CLDFB80_32_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -1984,8 +2286,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_32_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15392; // Q14 hs->p_filter = LDQMF_32_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = LDQMF_32_SCALE_FX_Q8; } BREAK; @@ -2003,8 +2309,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_40_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17051; // Q14 hs->p_filter = CLDFB80_40_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = CLDFB80_40_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -2015,8 +2325,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_40_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15391; // Q14 hs->p_filter = LDQMF_40_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = LDQMF_40_SCALE_FX_Q8; } BREAK; @@ -2034,8 +2348,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_60_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17051; // Q14 hs->p_filter = CLDFB80_60_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = CLDFB80_60_SCALE_FX_Q8; } ELSE IF( EQ_32( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) @@ -2046,8 +2364,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_60_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15391; // Q14 hs->p_filter = LDQMF_60_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = LDQMF_60_SCALE_FX_Q8; } BREAK; @@ -2094,11 +2416,15 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17036; // Q14 hs->scale = cldfb_scale_2_5ms[0]; move16(); move16(); +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_10_fx; +#else /* OPT_IVAS_FILTER_ROM */ + hs->p_filter_sf = (Word16) 17036; // Q14 hs->p_filter = CLDFB80_10_fx; +#endif /* OPT_IVAS_FILTER_ROM */ } ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) { @@ -2110,8 +2436,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_10_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15388; // Q14 hs->p_filter = LDQMF_10_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_5_0ms[0]; move16(); move16(); @@ -2139,8 +2469,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_16_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17051; // Q14 hs->p_filter = CLDFB80_16_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_2_5ms[1]; move16(); move16(); @@ -2155,8 +2489,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_16_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15388; // Q14 hs->p_filter = LDQMF_16_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_5_0ms[1]; move16(); move16(); @@ -2191,8 +2529,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_20_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17050; // Q14 hs->p_filter = CLDFB80_20_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_2_5ms[2]; move16(); move16(); @@ -2207,8 +2549,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_20_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15390; // Q14 hs->p_filter = LDQMF_20_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_5_0ms[2]; move16(); move16(); @@ -2242,9 +2588,13 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 hs->scale = cldfb_scale_2_5ms[6]; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_30_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter = CLDFB80_30_fx; + hs->p_filter_sf = (Word16) 17051; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ } ELSE IF( EQ_16( hs->prototype, CLDFB_PROTOTYPE_5_00MS ) ) { @@ -2256,9 +2606,13 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15388; // Q14 hs->scale = cldfb_scale_5_0ms[6]; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_30_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter = LDQMF_30_fx; + hs->p_filter_sf = (Word16) 15388; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ move16(); move16(); } @@ -2285,8 +2639,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_32_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17050; // Q14 hs->p_filter = CLDFB80_32_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_2_5ms[3]; move16(); move16(); @@ -2301,9 +2659,13 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; - hs->p_filter_sf = (Word16) 15392; // Q14 hs->scale = cldfb_scale_5_0ms[3]; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_32_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter = LDQMF_32_fx; + hs->p_filter_sf = (Word16) 15392; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ move16(); move16(); } @@ -2336,9 +2698,13 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; - hs->p_filter_sf = (Word16) 17051; // Q14 hs->scale = cldfb_scale_2_5ms[4]; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_40_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter = CLDFB80_40_fx; + hs->p_filter_sf = (Word16) 17051; // Q14 +#endif /* OPT_IVAS_FILTER_ROM */ move16(); move16(); } @@ -2352,8 +2718,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_40_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15391; // Q14 hs->p_filter = LDQMF_40_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_5_0ms[4]; move16(); move16(); @@ -2387,8 +2757,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = NULL; hs->rot_vec_syn_delay_re_fx = NULL; hs->rot_vec_syn_delay_im_fx = NULL; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = CLDFB80_60_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 17051; // Q14 hs->p_filter = CLDFB80_60_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_2_5ms[5]; move16(); move16(); @@ -2403,8 +2777,12 @@ static void cldfb_init_proto_and_twiddles_enc_fx( hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; hs->rot_vec_syn_delay_re_fx = rot_vec_delay_re_LDQMF_fx; hs->rot_vec_syn_delay_im_fx = rot_vec_delay_im_LDQMF_fx; +#ifdef OPT_IVAS_FILTER_ROM + hs->p_filter_32 = LDQMF_60_fx; +#else /* OPT_IVAS_FILTER_ROM */ hs->p_filter_sf = (Word16) 15391; // Q14 hs->p_filter = LDQMF_60_fx; +#endif /* OPT_IVAS_FILTER_ROM */ hs->scale = cldfb_scale_5_0ms[5]; move16(); move16(); diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 4279065b0..eb5de9460 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -1026,6 +1026,7 @@ void computeDiffuseness_fixed( q_intensity_slow = sub( add( q_intensity, q_intensity ), 31 ); /* Compute Diffuseness */ +#ifndef OPT_SBA_DEC_PATH p_tmp = intensity_slow_abs; exp2 = 0; move16(); @@ -1064,6 +1065,30 @@ void computeDiffuseness_fixed( move32(); } } +#else /* OPT_SBA_DEC_PATH */ + Word16 diff = sub( 62, q_ene ); + p_tmp = intensity_slow_abs; + FOR( i = 0; i < num_freq_bands; ++i ) + { + + exp1 = sub( 31, q_intensity_slow ); + tmp = Sqrt32( p_tmp[i], &exp1 ); + + tmp = BASOP_Util_Divide3232_Scale_newton( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); + q_tmp = sub( diff, add( exp1, exp2 ) ); + // bring to Q30 + tmp = L_shl_sat( tmp, sub( Q30, q_tmp ) ); + diffuseness[i] = L_sub( ONE_IN_Q30, tmp ); + move32(); + + if ( LT_32( diffuseness[i], 0 ) ) + { + diffuseness[i] = 0; + move32(); + } + } + +#endif /* OPT_SBA_DEC_PATH */ *q_diffuseness = Q30; move16(); diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 8b6cdcac9..10d6b1629 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1092,10 +1092,14 @@ void ivas_mct_dec_mct_fx( ); void apply_MCT_dec_fx( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequan. spect. input to MCT */ - Word16 q_x[MCT_MAX_CHANNELS] ); + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + Word32 *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ +#ifndef OPT_SBA_DEC_PATH + , + Word16 q_x[MCT_MAX_CHANNELS] +#endif /* OPT_SBA_DEC_PATH */ +); void mctStereoIGF_dec_fx( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ @@ -1129,9 +1133,13 @@ void stereo_decoder_tcx_fx( const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ const Word16 last_core_l, /* i : last core for left channel */ const Word16 last_core_r, /* i : last core for right channel */ - const Word16 tmp_plc_upmix, /* i : indicates temp upmix for PLC decision */ + const Word16 tmp_plc_upmix /* i : indicates temp upmix for PLC decision */ +#ifndef OPT_SBA_DEC_PATH + , Word16 *q_x_ch2, - Word16 *q_x_ch1 ); + Word16 *q_x_ch1 +#endif /* OPT_SBA_DEC_PATH */ +); void v_multc_acc_32_16( const Word32 x[], /* i : Input vector */ diff --git a/lib_com/ivas_transient_det_fx.c b/lib_com/ivas_transient_det_fx.c index fb8679ebc..02f8713a8 100644 --- a/lib_com/ivas_transient_det_fx.c +++ b/lib_com/ivas_transient_det_fx.c @@ -43,8 +43,12 @@ * Local constants *------------------------------------------------------------------------------------------*/ -#define IVAS_TDET_PARM_ENV_EPS ( 1e-5f ) -#define IVAS_TDET_PARM_ENV_EPS_fx 21474 // Q31 +#define IVAS_TDET_PARM_ENV_EPS ( 1e-5f ) +#ifndef OPT_SBA_DEC_PATH +#define IVAS_TDET_PARM_ENV_EPS_fx 21474 // Q31 +#else /* OPT_SBA_DEC_PATH */ +#define IVAS_TDET_PARM_ENV_EPS_fx ( 1407374884 ) // Q47 +#endif /* OPT_SBA_DEC_PATH */ #define IVAS_TDET_DUCK_MULT_FAC ( 590558003 ) // Q29 #define IVAS_TDET_PARM_TRANS_THR ( 107374182 ) // Q30 @@ -403,8 +407,19 @@ void ivas_td_decorr_get_ducking_gains_fx( FOR( i = 0; i < frame_len; i++ ) { // e_fast_fx[i] = L_add( L_abs( e_fast_fx[i] ), L_shr( IVAS_TDET_PARM_ENV_EPS_fx, q_factor_diff ) ); /*Q14*/ +#ifndef OPT_SBA_DEC_PATH e_fast_fx[i] = BASOP_Util_Add_Mant32Exp( L_abs( e_fast_fx[i] ), e_fast_e[i], IVAS_TDET_PARM_ENV_EPS_fx, 0, &e_fast_e[i] ); move32(); +#else /* OPT_SBA_DEC_PATH */ + Word32 tmp = L_abs( e_fast_fx[i] ); + Word16 nrm = norm_l( tmp ); + Word16 max_e = s_max( sub( e_fast_e[i], nrm ), 31 - 47 ); + max_e = add( max_e, 1 ); // 1 for headroom + e_fast_fx[i] = L_add( L_shr( tmp, sub( max_e, e_fast_e[i] ) ), L_shr( IVAS_TDET_PARM_ENV_EPS_fx, sub( max_e, 31 - 47 ) ) ); + move32(); + e_fast_e[i] = max_e; + move16(); +#endif /* OPT_SBA_DEC_PATH */ e_slow_fx[i] = e_fast_fx[i]; move32(); e_slow_e[i] = e_fast_e[i]; diff --git a/lib_com/options.h b/lib_com/options.h index 75323cf13..cfa652ea7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -76,6 +76,8 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ #define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ +#define OPT_SBA_DEC_PATH /* Optimization made in SBA decoding path */ +#define OPT_IVAS_FILTER_ROM /* Optimization made in IVAS filter table */ #define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ #define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ /* Both following 2 macros (IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST*) are independent from each other, they refer to different code blocks */ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index a5c8a3b7c..d1a1564cb 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -5197,6 +5197,7 @@ const Word16 freqTable[2] = {20, 40}; // Q0 /* SNR: 109.44, PHASE: 3.500000000000000 */ /* SNR: 109.44, PHASE: 3.500000000000000 */ +#ifndef OPT_IVAS_FILTER_ROM const Word16 CLDFB80_10_fx[100] = // q = 15 sf = 17036 qsf = 14 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7, -2, 0, 0, 0, -1, 0, 0, 0, -8, -31, @@ -5432,6 +5433,778 @@ const Word16 LDQMF_60_fx[] = // q = 15 sf = 15391 qsf = 14 -142, -123, -104, -88, -72, -57, -44, -28, }; +#else /* OPT_IVAS_FILTER_ROM */ + +const Word32 CLDFB80_10_fx[100] = // q = 30 +{ + 3584, -2500, -706, 157, -1170, -1037, +-11, -1944, -1380, 1837, 14726, -9095, +-1690, -266, 3897, -4704, 419, 4651, +5274, -6638, -243746, -72520, -17070, 14830, +-23631, -38285, 18452, -20884, -6244, -281514, +-1070487, -153328, -20195, -4337, -209847, 194011, +24972, -5105, -34468, 1151401, -2164680, -832327, +376719, 1686598, 1844777, 1697324, 2356307, 3037446, +3248821, 1779295, -1533240, -1713947, 833815, 2751562, +2421811, 284255, -3540922, -6991555, -10248264, -14642952, +20031906, 26043234, 34417552, 45928496, 60756732, 78698864, +98151832, 116245496, 129823136, 136344976, 134601568, 122059576, +95304000, 53433792, -3371364, -74987256, -160511088, -258343120, +-366360320, -481533344, 599091264, 714631872, 823505600, 920768896, +1001735168, 1062249792, 1100603392, 1116473216, 1114030976, 1091249536, +1031959808, 939413760, 835792512, 727712064, 614651648, 499141824, +382288320, 266885408, 148867680, 44714176 +}; + + +/* SNR: 292.49, PHASE: 2.000000000000000 */ +const Word32 CLDFB80_16_fx[160] = // q = 30 +{ 591, -823, -251, 103, 63, -1, +-19, 2357, 3221, -17, -2, 75, +36, -82, -596, 808, 2242, -3034, +-755, 254, 126, -434, 106, -19349, +26445, -100, 482, -149, -90, 246, +2196, -3062, -344116, -158536, -67239, -47926, +-21714, 16230, 6227, 48320, 46493, 5448, +17932, -33783, -26258, -13467, -97910, -469416, +-1317170, -563405, -199455, -118497, -43264, 11679, +-61886, 64705, -248885, 55868, 3767, 67210, +64791, 39611, 345777, 1796799, -2314105, -1658357, +-815220, -115680, 761412, 1616442, 1931089, 1230669, +1712205, 1949652, 2418775, 2970521, 3179526, 3272215, +2739045, 1383590, -1186344, -2091283, -1594461, -20541, +1561481, 2685864, 2822045, 2243697, 1007269, -1321111, +-3774214, -5979353, -7970746, -10025660, -12576468, -15588057, +19092548, 22464968, 26489252, 31480652, 37681832, 45115060, +53868456, 63884792, 75139712, 87185504, 99355152, 110921760, +121117896, 129158840, 134480400, 136595408, 135565040, 130704096, +120827352, 105296200, 83827480, 56486836, 23319760, -15680647, +-60454808, -110775264, -166285472, -226570624, -291114656, -359358976, +-430528992, -503583200, 577127680, 650096768, 721690560, 790528896, +855345280, 915113088, 968648896, 1014713216, 1052549440, 1081848192, +1102232576, 1113723648, 1117499392, 1114694144, 1104247168, 1084392960, +1047294336, 993703296, 933123072, 868665920, 802559168, 734628416, +664562240, 593135168, 520952544, 448011680, 375024864, 302909728, +230463232, 156264608, 85568040, 29877076 +}; + + +/* SNR: 89.77, PHASE: 1.500000000000000 */ +const Word32 CLDFB80_20_fx[200] = // q = 30 +{ 1767, -5031, -87, -195, 25, 203, +-253, -754, -8, 5224, 7568, 3, +160, -101, 462, -84, -114, 1650, +-2693, 4754, 4945, -22236, -523, -657, +64, 468, -401, -1020, 719, -9361, +12272, -827, -312, 169, -1088, 201, +406, -7057, 12038, -3892, -327043, -222151, +-35479, -70712, -44739, -22286, -4949, 10391, +-6975, 55398, 27634, -7373, 3144, -22480, +-20585, -25326, -30792, 63870, -118589, -531211, +-1262671, -706692, -140674, -191397, -107626, -49945, +-20211, 30609, -145958, 302171, -516943, 139837, +-27637, 62098, 52143, 58316, 81974, -160536, +375017, 1963205, -2140127, -2009648, -925313, -652848, +-36271, 664399, 1339893, 1799274, 1945125, 831664, +1777055, 1828829, 2078398, 2585600, 2993432, 3154609, +3289692, 3034094, 2356141, 1146722, -993260, -1911081, +-2021484, -1182252, 157140, 1427332, 2466904, 2979249, +2692828, 2193128, 1283653, -616498, -2589952, -4472528, +-6187298, -7776616, -9380603, -11192438, -13438549, -15899665, +18725886, 21392202, 24336266, 27874318, 32044188, 37006492, +42749912, 49318540, 56747120, 64938688, 73960840, 83528888, +93302528, 102923904, 112017456, 120184144, 127010856, 132191136, +135478896, 136610544, 135791440, 132663544, 126439184, 116783968, +103416816, 86239880, 65299188, 40633116, 12229525, -19893306, +-55715672, -95119752, -137902624, -183892768, -232841840, -284483936, +-338536576, -394642624, -452297696, -510956224, 569805312, 628294144, +686151296, 742695360, 797209408, 849073920, 897777728, 942743488, +983299712, 1018874944, 1049145600, 1073975296, 1093176448, 1106582656, +1114420736, 1117424512, 1116238848, 1110577792, 1099271424, 1081958528, +1052270720, 1010577920, 964128448, 914037760, 862118336, 809238464, +755241024, 699830528, 643231744, 585949312, 528205504, 469954944, +411440896, 353300032, 295721536, 237791168, 178588864, 119772248, +66882256, 25081918 +}; + + +/* SNR: 89.29, PHASE: 0.833333333333333 */ +const Word32 CLDFB80_30_fx[300] = // q = 30 +{ -297, 3584, 1941, -855, -2500, -17, +107, -706, 30, 15, 157, 303, +45, -1170, 5206, 7620, -1037, 38, +475, -11, -28, -11, -1944, 58, +-3, -1380, -659, 1052, 1837, -2898, +-12991, 14726, 8111, -3475, -9095, -22, +265, -1690, 45, -32, -266, 592, +210, 3897, 9064, -12976, -4704, -177, +-1102, 419, 158, 60, 4651, -142, +-10, 5274, 2753, -4425, -6638, 19638, +-341194, -243746, -157895, -76328, -72520, -65718, +-49274, -17070, -21325, -4817, 14830, 27865, +-1521, -23631, 5019, -51348, -38285, -877, +59535, 18452, -11250, -36821, -20884, -26546, +-28596, -6244, -16612, -92408, -281514, -679649, +-1089988, -1070487, -687312, -252029, -153328, -178006, +-122647, -20195, -41359, -29532, -4337, 53190, +-112252, -209847, 617831, -803951, 194011, 106900, +-106998, 24972, 64775, 70953, -5105, 66493, +77725, -34468, 24004, 399486, 1151401, 2091330, +-1945866, -2164680, -1871141, -1133489, -832327, -560634, +-144700, 376719, 793102, 1258629, 1686598, 1843271, +1942367, 1844777, 286874, 1790714, 1697324, 1882734, +2048236, 2356307, 2670961, 2960783, 3037446, 3187787, +3282833, 3248821, 2972460, 2561469, 1779295, 779689, +-670109, -1533240, -2023874, -2068453, -1713947, -979306, +-79111, 833815, 1606493, 2311180, 2751562, 2948542, +2758276, 2421811, 2144317, 1669907, 284255, -925660, +-2240403, -3540922, -4767758, -5909822, -6991555, -8035796, +-9103931, -10248264, -11549851, -13052389, -14642952, -16334399, +18220558, 20031906, 21872604, 23814234, 26043234, 28516756, +31295850, 34417552, 37909524, 41736344, 45928496, 50500180, +55453996, 60756732, 66352956, 72392624, 78698864, 85151696, +91671536, 98151832, 104484224, 110553528, 116245496, 121424144, +125981624, 129823136, 132872256, 135069696, 136344976, 136548112, +135995744, 134601568, 131846392, 127706624, 122059576, 114818808, +105909512, 95304000, 83010216, 69049472, 53433792, 36159948, +17222988, -3371364, -25594396, -49478012, -74987256, -102019216, +-130543792, -160511088, -191851984, -224489536, -258343120, -293333280, +-329374368, -366360320, -404158112, -442603456, -481533344, -520813312, +560055680, 599091264, 637996480, 676579264, 714631872, 751940864, +788293056, 823505600, 857424640, 889902848, 920768896, 949826944, +976873792, 1001735168, 1024295104, 1044475456, 1062249792, 1077572608, +1090377088, 1100603392, 1108260608, 1113474048, 1116473216, 1117510400, +1116725248, 1114030976, 1109119488, 1101598848, 1091249536, 1078932736, +1059134272, 1031959808, 1003169408, 972174976, 939413760, 905472960, +870845632, 835792512, 800328576, 764335744, 727712064, 690466496, +652724672, 614651648, 576357376, 537862912, 499141824, 460206112, +421184800, 382288320, 343676096, 305305440, 266885408, 228014720, +188521408, 148867680, 110353960, 74971128, 44714176, 18455688 +}; + + +const Word32 CLDFB80_32_fx[320] = // q = 30 +{ + -1093, 2019, -1499, 75, -3258, -199, +1, 86, -306, -6, -371, -406, +685, 39, -1685, 4713, 6814, -1488, +47, 777, -40, -130, 24, -872, +225, -4, -115, -555, -123, -750, +1333, -5815, -17695, 8208, -6988, 238, +-11912, -668, 1, 205, -738, 0, +-579, -811, 1616, 569, 3827, 10109, +-14334, -4600, -627, -1934, 179, 185, +-69, 2086, -538, 14, 407, 1523, +584, 3600, -4501, 26170, -348871, -274412, +-191283, -101650, -55022, -71745, -57838, -39469, +-16489, -17154, -4617, 1541, 27531, -4837, +-24078, -6040, -61575, -45938, -4350, 52992, +-21466, -30551, -47623, -16878, -16327, -28525, +-30774, 45781, -47860, -103960, -321282, -704887, +-1065517, -1123684, -707166, -371532, -86308, -196314, +-147629, -95796, -26567, -30200, -12084, -23645, +30175, -133296, -186725, 644643, -823105, 165913, +127128, -77847, 76138, 59764, 84596, 13695, +44920, 72596, 82826, -180229, 163870, 385659, +1272551, 2097219, -1940583, -2216917, -1963534, -1312194, +-811283, -684818, -332127, 81208, 566323, 995811, +1374732, 1743252, 1885232, 1944745, 1791356, 230889, +1776037, 1693754, 1848743, 2021967, 2237951, 2554531, +2866857, 3010232, 3111818, 3235821, 3289504, 3179983, +2912034, 2438977, 1724392, 733946, -625865, -1486531, +-1958889, -2094027, -1863598, -1255187, -454123, 425746, +1212702, 1901282, 2517749, 2869908, 2908450, 2719155, +2384774, 2140991, 1717492, 398306, -731735, -1939479, +-3196994, -4359654, -5453402, -6492968, -7485700, -8462297, +-9485345, -10586349, -11872517, -13293064, -14799378, -16391634, +18159074, 19878216, 21572990, 23372214, 25384474, 27638258, +30127980, 32911950, 36012916, 39421380, 43135868, 47172528, +51552328, 56259572, 61272356, 66530936, 72196904, 78102488, +84136944, 90243120, 96340328, 102334376, 108124720, 113633800, +118743656, 123354504, 127384760, 130768192, 133428752, 135331936, +136411184, 136532064, 136012736, 134791376, 132367184, 128735088, +123803096, 117494272, 109734136, 100486232, 89749032, 77539936, +63866580, 48743548, 32160198, 14114131, -5387418, -26313940, +-48704924, -72531920, -97696000, -124178280, -151940320, -180929216, +-211078752, -242327632, -274608448, -307853568, -341987136, -376916512, +-412518528, -448658976, -485200704, -522047808, 558838528, 595432000, +631934592, 668176768, 703995904, 739213504, 773652800, 807151808, +839574912, 870801792, 900704320, 929133248, 955922048, 980906240, +1003949120, 1024962240, 1043881152, 1060686784, 1075342592, 1087794688, +1097989248, 1105913344, 1111637504, 1115325568, 1117191552, 1117410816, +1116024960, 1112890624, 1107711872, 1100166016, 1090143104, 1078585600, +1060024128, 1034545088, 1007817280, 979127552, 948772416, 917237312, +884973248, 852271488, 819225472, 785777536, 751820160, 717295872, +682246976, 646793792, 611070144, 575157504, 539069056, 502781984, +466300064, 429718016, 393203360, 356913536, 320878656, 284927936, +248740064, 212036736, 174863904, 137843808, 102263632, 69872776, +42173520, 17586372 +}; + + +/* SNR: 81.55, PHASE: 0.500000000000000 */ +const Word32 CLDFB80_40_fx[400] = // q = 30 +{ +-4459, -418, -3626, 1423, -337, -2077, +302, 18, 81, 158, -711, 8, +12, -288, -781, 598, -25, 260, +-439, 2799, 3757, -185, 230, -43, +681, -21, -75, -28, -54, -1949, +416, 55, 15, 232, 886, -479, +680, -2718, -568, -16447, -33103, -1653, +-16423, 6274, -1401, -7536, 1255, 81, +201, 378, -1703, -5, -26, -664, +-1194, 1294, -17, 118, -11444, 11395, +-15922, 16042, 174, 77, -1654, 102, +374, 132, 160, 4663, -995, -137, +-67, -969, -4392, 2058, -3082, 11738, +-993, 52507, -372469, -339964, -238019, -154668, +-91226, -39704, -68193, -63465, -52270, -36720, +-12971, -20430, -6924, 7426, -2360, 29241, +919, -11368, 13935, -42083, -90219, 4459, +-7455, 294, 60570, -36065, -9835, -23629, +-40549, -22838, -11572, -27316, -28142, -21798, +74246, -37442, -94760, -175260, -418504, -781460, +-995764, -1274141, -822204, -644197, -320592, -79371, +-211045, -170431, -131251, -90675, -8614, -38864, +-25805, 10490, -21114, 43834, -93771, -212051, +-80066, 687823, -841077, -28318, 196054, 89800, +-98757, 81412, 22561, 71309, 76947, -1234, +38817, 69236, 75947, 74312, -220677, 108139, +388007, 614410, 1602908, 2104013, -1945961, -2345233, +-2073810, -1788973, -1237041, -801096, -773094, -511060, +-205271, 126459, 548962, 854331, 1215259, 1516757, +1754372, 1867886, 1938796, 1938331, 1525725, 104198, +1696967, 1687207, 1745904, 1910501, 2033618, 2194667, +2472077, 2712787, 2937868, 3012595, 3095693, 3204092, +3274807, 3283756, 3148591, 2939051, 2641685, 2031331, +1549502, 597843, -490013, -1328870, -1713435, -2059616, +-2084878, -1903964, -1464478, -873102, -195310, 513855, +1135792, 1697317, 2228107, 2629045, 2909610, 2926213, +2785542, 2569873, 2293849, 2134484, 1852516, 752396, +-164139, -1082527, -2067571, -3082100, -4010647, -4913512, +-5770452, -6592736, -7388101, -8166445, -8966356, -9806266, +-10700961, -11733450, -12861255, -14030459, -15273330, -16566203, +17977196, 19420796, 20683474, 22109952, 23560036, 25167814, +26942868, 28845886, 30930688, 33206692, 35686848, 38368864, +41237952, 44313740, 47594052, 51099240, 54815852, 58726668, +62834600, 67067844, 71610536, 76321632, 81103048, 85964624, +90855304, 95735248, 100552568, 105257896, 109812680, 114164760, +118253480, 122029112, 125449296, 128468360, 131068744, 133194984, +134844544, 135983552, 136548480, 136476080, 136056288, 135290432, +133727152, 131405624, 128303264, 124356992, 119537688, 113797504, +107116320, 99479544, 90889712, 81356080, 70886368, 59482072, +47150368, 33884192, 19681098, 4546189, -11521655, -28482206, +-46395036, -65246120, -84945856, -105504280, -126897840, -149107856, +-172107808, -195862240, -220341504, -245510512, -271335616, -297782912, +-324814976, -352387008, -380449280, -408931776, -437767552, -466890752, +-496221408, -525752320, 555187200, 584450368, 613710272, 642840512, +671780800, 700438528, 728721728, 756541312, 783807872, 810444608, +836384512, 861566464, 885927424, 909395008, 931888896, 953321728, +973609216, 992677120, 1010468928, 1026949632, 1042084096, 1055868544, +1068286464, 1079312512, 1088916480, 1097072128, 1103772032, 1109042176, +1112948608, 1115590912, 1117080960, 1117511680, 1116923264, 1115280512, +1112471040, 1108330880, 1102691712, 1095455872, 1086748672, 1077537920, +1062688064, 1042243712, 1021432192, 999408768, 976158720, 951869952, +926793472, 901173760, 875200384, 848982208, 822546624, 795860992, +768868224, 741522368, 713812928, 685772416, 657463808, 628958848, +600314432, 571556608, 542686272, 513690592, 484561600, 455329056, +426060320, 396846880, 367771776, 338869952, 310096864, 281325184, +252379520, 223109248, 193485184, 163693120, 134192648, 105710896, +79151352, 55383672, 34725716, 14899882 +}; + + +/* SNR: 85.15, PHASE: 0.166666666666667 */ +const Word32 CLDFB80_60_fx[600] = // q = 30 +{ -11637, 1767, -122, 1627, -5031, -195, +160, -87, -3544, 136, -195, 20, +35, 25, 131, -1128, 203, 11, +-29, -253, -96, -286, -754, 688, +-55, -8, 214, -1583, 5224, -169, +-595, 7568, -1361, 190, 3, -67, +788, 160, -43, -19, -101, -32, +-9, 462, -3064, 321, -84, 23, +12, -114, 150, -968, 1650, -22, +-258, -2693, -28, 67, 4754, -32802, +-51846, 4945, -595, 6085, -22236, -387, +577, -523, -12973, 672, -657, 65, +91, 64, 313, -2699, 468, 12, +-68, -401, -518, -689, -1020, 1669, +-23, 719, 448, -2322, -9361, 9537, +-13566, 12272, 3729, -157, -827, 60, +-1977, -312, 206, 461, 169, 83, +40, -1088, 7330, -767, 201, -59, +-41, 406, -660, 3231, -7057, 161, +770, 12038, 198, -1291, -3892, 106546, +-387363, -327043, -319712, -213952, -222151, -158503, +-105318, -35479, -59682, -66732, -70712, -61609, +-55170, -44739, -31711, -9899, -22286, -19251, +-9917, -4949, 14171, 3110, 10391, 26566, +4085, -6975, -13331, -9891, 55398, -89244, +-120821, 27634, -30750, -9362, -7373, 2810, +49557, 3144, -15960, 10651, -22480, -39334, +-43080, -20585, -29742, -8097, -25326, -28070, +-28127, -30792, -15878, 36413, 63870, -51034, +-98422, -118589, -196780, -380752, -531211, -867079, +-924260, -1262671, -1211187, -909700, -706692, -590140, +-387712, -140674, -90592, -207147, -191397, -163115, +-139419, -107626, -77449, 8619, -49945, -36329, +-21445, -20211, 13294, -23388, 30609, 24764, +-73158, -145958, -228347, -136170, 302171, 622362, +-742756, -516943, 79532, 208728, 139837, 68780, +-69176, -27637, 72365, 6203, 62098, 78719, +81230, 52143, -15435, 27781, 58316, 71170, +74613, 81974, 55367, -164495, -160536, 180917, +362005, 375017, 795458, 1461875, 1963205, 2095155, +-1983049, -2140127, -2301660, -2078197, -2009648, -1702454, +-1336745, -925313, -815553, -803612, -652848, -461550, +-265137, -36271, 196856, 518313, 664399, 915382, +1166217, 1339893, 1585569, 1738976, 1799274, 1890534, +1933937, 1945125, 1923994, 1665860, 831664, 77564, +1488037, 1777055, 1688417, 1721974, 1828829, 1937199, +2017936, 2078398, 2252451, 2437196, 2585600, 2754364, +2909841, 2993432, 3016599, 3074265, 3154609, 3219375, +3265044, 3289692, 3277126, 3189837, 3034094, 2902601, +2709098, 2356141, 1938985, 1632226, 1146722, 418214, +-305018, -993260, -1403823, -1653091, -1911081, -2083225, +-2096448, -2021484, -1849083, -1552143, -1182252, -764155, +-310624, 157140, 627282, 1032600, 1427332, 1788413, +2142931, 2466904, 2666628, 2856089, 2979249, 2902476, +2810289, 2692828, 2523008, 2330295, 2193128, 2132549, +2001086, 1283653, 592122, -15236, -616498, -1241114, +-1897102, -2589952, -3235046, -3852857, -4472528, -5058432, +-5630303, -6187298, -6725205, -7257094, -7776616, -8297674, +-8829816, -9380603, -9952123, -10548511, -11192438, -11919065, +-12671172, -13438549, -14232061, -15062200, -15899665, -16802572, +17739412, 18725886, 19625418, 20458448, 21392202, 22346532, +23310144, 24336266, 25457146, 26639572, 27874318, 29180440, +30570936, 32044188, 33604364, 35257056, 37006492, 38833420, +40745368, 42749912, 44846596, 47032812, 49318540, 51704112, +54183000, 56747120, 59397304, 62137772, 64938688, 67793344, +70831448, 73960840, 77111768, 80298224, 83528888, 86778376, +90039080, 93302528, 96541856, 99755032, 102923904, 106027616, +109066040, 112017456, 114866184, 117592440, 120184144, 122624224, +124905544, 127010856, 128931552, 130666344, 132191136, 133505016, +134605360, 135478896, 136120576, 136498544, 136610544, 136390896, +136106368, 135791440, 135081680, 134039064, 132663544, 130943336, +128876128, 126439184, 123615464, 120403880, 116783968, 112750168, +108296544, 103416816, 98114136, 92387688, 86239880, 79676032, +72697184, 65299188, 57491652, 49271324, 40633116, 31582262, +22113356, 12229525, 1933214, -8779568, -19893306, -31396530, +-43338216, -55715672, -68469528, -81601800, -95119752, -109012544, +-123274624, -137902624, -152887216, -168220960, -183892768, -199892672, +-216212560, -232841840, -249770272, -266987040, -284483936, -302248800, +-320270592, -338536576, -357031680, -375740448, -394642624, -413715328, +-432939744, -452297696, -471766976, -491319872, -510956224, -530689568, +550314688, 569805312, 589331520, 608841280, 628294144, 647679424, +666974528, 686151296, 705180416, 724037376, 742695360, 761126400, +779305216, 797209408, 814818048, 832112192, 849073920, 865685504, +881927232, 897777728, 913213888, 928211072, 942743488, 956784768, +970310720, 983299712, 995732352, 1007593856, 1018874944, 1029566592, +1039655360, 1049145600, 1058033856, 1066312576, 1073975296, 1081012992, +1087415680, 1093176448, 1098289920, 1102755712, 1106582656, 1109785856, +1112388096, 1114420736, 1115916544, 1116907776, 1117424512, 1117484800, +1117091968, 1116238848, 1114897920, 1113026048, 1110577792, 1107500160, +1103739520, 1099271424, 1094099328, 1088271360, 1081958528, 1076012800, +1066112832, 1052270720, 1038832960, 1024980800, 1010577920, 995613248, +980113280, 964128448, 947737280, 931017344, 914037760, 896864896, +879548544, 862118336, 844591360, 826968768, 809238464, 791384896, +773390848, 755241024, 736928896, 718455680, 699830528, 681070912, +662197568, 643231744, 624193216, 605096768, 585949312, 566752640, +547506176, 528205504, 508844544, 489425088, 469954944, 450450944, +430937408, 411440896, 391989376, 372605984, 353300032, 334067616, +314888448, 295721536, 276517248, 257224080, 237791168, 218193616, +198443888, 178588864, 158737840, 139063920, 119772248, 101121944, +83411368, 66882256, 51724928, 38009000, 25081918, 11097560 +}; + + +/* 5ms delay prototype */ +const Word32 LDQMF_10_fx[] = // q = 30 +{ + 136778, 68195, -70890, -226890, -352352, -420071, +-436801, -444542, -506660, -672814, -980067, -1367880, +-1747442, -2041058, -2171766, -2084001, -1756845, -1205000, +-470032, 391658, -1352314, -2311011, -3225024, -4068759, +-4825636, -5483930, -6033974, -6472204, -6808584, -7075060, +-7325811, -7636334, -8074046, -8676456, -9424478, -10219283, +-10865228, -11073811, -10475044, -8652076, 5180200, -339903, +-8224782, -18673422, -31726070, -47229416, -64809980, -83846512, +-103451368, -122477480, -139540384, -153063904, -161342016, -162639632, +-155309920, -137908720, -109304704, -68777832, -16099735, 48410956, +-123867744, -208812656, -301278944, -398795360, -498505440, -597277184, +-691834048, -778907776, -855407232, -918606592, -966152640, -996390080, +-1008509056, -1002265344, -978191040, -937540800, -882190336, -814525888, +-737309056, -653527872, 566225280, 478344672, 392910464, 312395584, +238918544, 174094816, 118926376, 73749168, 38239292, 11438051, +-6809585, -17473586, -23179288, -24893300, -23497172, -19904868, +-15070633, -9938406, -5364480, -2000461 +}; + + +const Word32 LDQMF_16_fx[] = // q = 30 +{ +135840, 119104, 61025, -23300, -120395, -217571, +-303688, -369787, -411985, -431913, -436959, -439365, +-455120, -500073, -585815, -716338, -910646, -1146409, +-1392576, -1634244, -1852284, -2026745, -2138911, -2173115, +-2118583, -1970210, -1728614, -1399459, -992562, -520339, +3268, 562388, -1169899, -1774887, -2369780, -2945925, +-3497147, -4018445, -4506031, -4956920, -5368525, -5738269, +-6064625, -6347063, -6587229, -6790047, -6964111, -7121373, +-7276727, -7449879, -7659373, -7920485, -8244153, -8633965, +-9083566, -9574508, -10074442, -10534940, -10894573, -11076715, +-10992408, -10543848, -9627864, -8139160, 5976363, 3037886, +-760648, -5491840, -11209240, -17943616, -25700144, -34454400, +-44150032, -54695840, -65964980, -77789648, -89960896, -102229872, +-114308392, -125871952, -136561440, -145990880, -153753088, -159424128, +-162577504, -162794960, -159676832, -152853360, -141995744, -126825840, +-107126032, -82747424, -53617472, -19744928, 18775524, 61761592, +-108947912, -159965984, -214394832, -271716064, -331337920, -392605120, +-454808224, -517194272, -578978880, -639359104, -697528768, -752693376, +-804086912, -850989824, -892747136, -928791232, -958536704, -981563328, +-997684800, -1006698432, -1008520640, -1003187328, -990852800, -971782976, +-946346880, -915003328, -878295040, -836832960, -791284544, -742359104, +-690793664, -637338560, 582754624, 527645440, 472906400, 419190784, +367113152, 317241312, 270082016, 226065808, 185534960, 148735312, +115810224, 86800312, 61646000, 40190228, 22181636, 7245162, +-4169366, -12156084, -17964338, -21866804, -24101958, -24886370, +-24433336, -22962478, -20701850, -17885954, -14749119, -11519968, +-8412224, -5619924, -3298610, -1524160 +}; + + +const Word32 LDQMF_20_fx[] = // q = 30 +{ +132094, 130053, 94117, 37811, -32618, -110470, +-188996, -262715, -325880, -375095, -408842, -427924, +-435582, -437285, -440061, -452481, -482692, -537287, +-620380, -731564, -887814, -1074239, -1268925, -1466394, +-1657422, -1832122, -1980123, -2091723, -2157945, -2171781, +-2128229, -2024637, -1860817, -1638684, -1362085, -1036417, +-668022, -263993, 167951, 619488, -1109006, -1594302, +-2074062, -2544891, -3002258, -3443306, -3865449, -4266665, +-4645247, -4999899, -5329217, -5631868, -5906959, -6153951, +-6372928, -6565000, -6732690, -6880012, -7012400, -7136776, +-7260809, -7394870, -7549042, -7731643, -7949918, -8208793, +-8510223, -8852171, -9227619, -9624792, -10025312, -10404401, +-10731825, -10971712, -11081824, -11015548, -10722771, -10150872, +-9246198, -7954791, 6226193, 4006048, 1251053, -2079213, +-6018495, -10592059, -15815707, -21694928, -28223572, -35382820, +-43140436, -51449560, -60249600, -69462792, -78994976, -88734976, +-98555328, -108312432, -117847120, -126986608, -135542896, -143318016, +-150106768, -155693424, -159859744, -162387488, -163062224, -161676800, +-158034768, -151954128, -143271408, -131843832, -117553208, -100308496, +-80048728, -56744644, -30400730, -1056327, 31212950, 66296312, +-104051416, -144280880, -186784688, -231313168, -277585056, -325290400, +-374093504, -423635840, -473540064, -523412928, -572850304, -621440576, +-668770368, -714429248, -758014656, -799138176, -837430848, -872549376, +-904183040, -932063424, -955866112, -975368256, -990502784, -1001141248, +-1007204608, -1008661952, -1005531712, -997881088, -985824192, -969518976, +-949164608, -924995776, -897283008, -866326016, -832450624, -796003264, +-757347840, -716859456, -674920448, -631918336, 588261568, 544170240, +500187776, 456655456, 413899520, 372230592, 331939808, 293293792, +256529792, 221851008, 189423392, 159373024, 131783696, 106697088, +84113256, 63991576, 46252108, 30775584, 17400960, 5897691, +-3242831, -10003035, -15315395, -19324048, -22161874, -23947232, +-24790774, -24801182, -24088950, -22768174, -20956786, -18774960, +-16343248, -13780261, -11200397, -8711802, -6413877, -4393110, +-2713517, -1364254 +}; + + +const Word32 LDQMF_30_fx[] = // q = 30 +{ +121571, 136778, 125654, 101703, 68195, 26874, +-20212, -70890, -123705, -176137, -226890, -274105, +-316252, -352352, -381787, -404296, -420071, -429892, +-434876, -436801, -437431, -439162, -444542, -456065, +-476087, -506660, -549090, -604537, -672814, -752813, +-858037, -980067, -1106184, -1235997, -1367880, -1498944, +-1626464, -1747442, -1858910, -1957741, -2041058, -2106142, +-2150372, -2171766, -2168618, -2139642, -2084001, -2001494, +-1892254, -1756845, -1596235, -1411744, -1205000, -977797, +-732072, -470032, -193707, 94398, 391658, 694988, +-1028102, -1352314, -1674660, -1994502, -2311011, -2622127, +-2927092, -3225024, -3515027, -3796479, -4068759, -4331383, +-4583784, -4825636, -5056603, -5276176, -5483930, -5679644, +-5863044, -6033974, -6192384, -6338347, -6472204, -6594554, +-6706284, -6808584, -6902958, -6991107, -7075060, -7157331, +-7239857, -7325811, -7418950, -7521576, -7636334, -7765374, +-7910813, -8074046, -8256088, -8457071, -8676456, -8912695, +-9163169, -9424478, -9691922, -9959316, -10219283, -10463412, +-10682245, -10865228, -11000298, -11074417, -11073811, -10983892, +-10789539, -10475044, -10024687, -9422374, -8652076, -7698110, +6547449, 5180200, 3585184, 1749124, -339903, -2692689, +-5318486, -8224782, -11417230, -14899579, -18673422, -22738288, +-27091010, -31726070, -36635292, -41807760, -47229416, -52884028, +-58751904, -64809980, -71032152, -77388632, -83846512, -90369776, +-96918936, -103451368, -109921528, -116280640, -122477480, -128458624, +-134165992, -139540384, -144523760, -149052944, -153063904, -156492352, +-159273296, -161342016, -162634320, -163087360, -162639632, -161231616, +-158806368, -155309920, -150691824, -144905568, -137908720, -129663752, +-120138088, -109304704, -97142448, -83636416, -68777832, -52564528, +-35001268, -16099735, 4121304, 25635912, 48410956, 72407360, +-97584200, -123867744, -151213264, -179552912, -208812656, -238912112, +-269764832, -301278944, -333357440, -365898336, -398795360, -431938528, +-465214080, -498505440, -531693760, -564658432, -597277184, -629427584, +-660987072, -691834048, -721848128, -750911168, -778907776, -805726528, +-831260224, -855407232, -878071616, -899164800, -918606592, -936328128, +-952202112, -966152640, -978197888, -988289792, -996390080, -1002471040, +-1006513664, -1008509056, -1008457600, -1006369728, -1002265344, -996173888, +-988133504, -978191040, -966401920, -952828672, -937540800, -920615360, +-902135488, -882190336, -860873664, -838284672, -814525888, -789704064, +-763927872, -737309056, -709960000, -681994880, -653527872, -624673024, +595607552, 566225280, 536822976, 507495872, 478344672, 449466912, +420958208, 392910464, 365412224, 338547584, 312395584, 287029856, +262517344, 238918544, 216286160, 194665808, 174094816, 154602160, +136208672, 118926376, 102759984, 87704592, 73749168, 60872400, +49048000, 38239292, 28404982, 19492542, 11438051, 4150852, +-1959298, -6809585, -10983833, -14524688, -17473586, -19875174, +-21764768, -23179288, -24150308, -24711158, -24893300, -24729546, +-24252922, -23497172, -22497182, -21287720, -19904868, -18383770, +-16760795, -15070633, -13348427, -11626766, -9938406, -8313092, +-6779951, -5364480, -4088470, -2966834, -2000461, -1134160 +}; + + +const Word32 LDQMF_32_fx[] = // q = 30 +{ +119696, 137151, 128519, 107723, 78399, 41835, +-441, -46740, -95596, -145201, -193804, -240597, +-283800, -322315, -355411, -382593, -403699, -418861, +-428699, -434120, -436480, -437237, -438149, -441391, +-449044, -463039, -485346, -517325, -560091, -614347, +-679871, -755579, -854378, -968457, -1086190, -1207328, +-1330798, -1454135, -1575271, -1691703, -1801098, -1900762, +-1988262, -2061316, -2117677, -2155275, -2172542, -2168110, +-2140952, -2090356, -2016155, -1918413, -1797518, -1654211, +-1489464, -1304576, -1100939, -880095, -643754, -393647, +-131597, 140302, 419876, 704519, -1017921, -1322020, +-1624457, -1924757, -2222508, -2515834, -2804014, -3086295, +-3361992, -3630425, -3891163, -4143615, -4387486, -4622276, +-4847760, -5063642, -5269495, -5464962, -5649875, -5823970, +-5987171, -6139337, -6280536, -6410931, -6530942, -6641149, +-6742438, -6835854, -6922708, -7004444, -7082802, -7159902, +-7237255, -7317480, -7403833, -7498177, -7602711, -7719257, +-7849651, -7995244, -8157012, -8335468, -8530447, -8741283, +-8966383, -9203373, -9449370, -9700315, -9951033, -10195449, +-10426707, -10637019, -10818085, -10960053, -11052529, -11084311, +-11043675, -10918394, -10695736, -10362793, -9906464, -9313511, +-8570674, -7665161, 6586646, 5317833, 3849978, 2171971, +273875, -1853534, -4218327, -6827111, -9685347, -12796811, +-16163952, -19787344, -23665996, -27796800, -32174812, -36793016, +-41642268, -46710992, -51985904, -57451192, -63088408, -68876552, +-74792144, -80808992, -86898528, -93029584, -99168576, -105279432, +-111323816, -117260928, -123048216, -128641440, -133992400, -139052160, +-143773440, -148104208, -151991888, -155383600, -158225792, -160465072, +-162048320, -162923104, -163038096, -162343200, -160789920, -158332016, +-154925376, -150528912, -145104496, -138617152, -131035664, -122332640, +-112485024, -101474136, -89286032, -75911456, -61346324, -45591780, +-28653996, -10544916, 8718141, 29112362, 50609392, 73176464, +-96780680, -121357544, -146873168, -173272304, -200494976, -228475968, +-257145792, -286430368, -316251616, -346527296, -377172096, -408096800, +-439210240, -470417824, -501623072, -532727936, -563632832, -594237184, +-624439872, -654140096, -683237312, -711632192, -739226496, -765924288, +-791632320, -816260416, -839722176, -861935360, -882823040, -902313408, +-920341952, -936853184, -951735680, -964924736, -976443584, -986251200, +-994314944, -1000609792, -1005117952, -1007828864, -1008739392, -1007854080, +-1005185024, -1000751488, -994580096, -986704064, -977163328, -966004416, +-953279168, -939044864, -923364608, -906306368, -887942656, -868349888, +-847608448, -825801792, -803016512, -779341120, -754867072, -729686080, +-703891520, -677576896, -650837184, -623766656, 596524928, 568982144, +541414592, 513899552, 486520032, 459356832, 432489472, 405994688, +379947008, 354417408, 329473600, 305178976, 281592608, 258768368, +236754960, 215594992, 195325728, 175977920, 157575920, 140137536, +123674336, 108191456, 93687496, 80154992, 67580128, 55943780, +45219876, 35377480, 26377892, 18179138, 10724362, 3937154, +-1793746, -6383128, -10375463, -13802420, -16701194, -19108980, +-21056298, -22573612, -23687536, -24425978, -24814642, -24880884, +-24650790, -24152456, -23413234, -22462376, -21328340, -20040900, +-18629038, -17122794, -15550818, -13942058, -12323783, -10723672, +-9166937, -7678114, -6278687, -4990172, -3829056, -2807490, +-1918387, -1103400 +}; + + +const Word32 LDQMF_40_fx[] = // q = 30 +{ +113205, 137253, 134424, 123146, 105210, 81666, +53560, 21301, -14069, -51498, -90644, -130324, +-169687, -208132, -245092, -279677, -311295, -339564, +-364227, -384972, -401866, -414904, -424383, -430758, +-434461, -436342, -437085, -437525, -438797, -441921, +-448028, -458055, -473038, -493888, -521095, -555299, +-596905, -645667, -701530, -764070, -843494, -933719, +-1026834, -1122238, -1219597, -1318430, -1417239, -1515132, +-1610824, -1702996, -1790556, -1872014, -1946187, -2011805, +-2067737, -2112858, -2146050, -2166538, -2173557, -2166437, +-2144725, -2108000, -2056210, -1989294, -1907357, -1810627, +-1699503, -1574446, -1436053, -1285027, -1122102, -948052, +-763729, -570120, -367947, -158283, 57836, 279329, +505114, 733496, -987128, -1230885, -1473412, -1714779, +-1954662, -2192913, -2428355, -2660606, -2889345, -3114178, +-3334741, -3550687, -3761781, -3967792, -4168400, -4363502, +-4552805, -4736194, -4913551, -5084693, -5249383, -5407420, +-5558752, -5703240, -5840789, -5971350, -6094838, -6211307, +-6320773, -6423390, -6519395, -6609078, -6692852, -6771221, +-6844809, -6914280, -6980362, -7043920, -7105964, -7167615, +-7229469, -7292853, -7359780, -7431208, -7508135, -7591745, +-7682926, -7782628, -7891679, -8010673, -8140087, -8280181, +-8430924, -8592083, -8763179, -8943293, -9131195, -9325472, +-9524332, -9725493, -9926142, -10123188, -10313198, -10492333, +-10656603, -10801577, -10922158, -11013175, -11068951, -11083709, +-11051345, -10965628, -10820070, -10607987, -10322919, -9958035, +-9506509, -8961670, -8316717, -7565183, 6702942, 5718827, +4609516, 3369112, 1992224, 473872, -1190731, -3005819, +-4975066, -7101637, -9388180, -11836610, -14448347, -17224060, +-20163764, -23266722, -26531342, -29955288, -33535422, -37267720, +-41147260, -45168140, -49323552, -53606284, -58007508, -62517548, +-67125584, -71820016, -76587808, -81415152, -86287160, -91187832, +-96100320, -101006496, -105887512, -110723520, -115493552, -120176040, +-124748632, -129188288, -133469680, -137567456, -141458352, -145116032, +-148513808, -151624560, -154421360, -156876704, -158963328, -160653808, +-161921024, -162738128, -163078752, -162916896, -162227280, -160985216, +-159167008, -156749920, -153712208, -150033328, -145694224, -140676912, +-134964928, -128543672, -121399776, -113521832, -104900488, -95527920, +-85398544, -74508560, -62856444, -50442808, -37270156, -23343566, +-8670189, 6740501, 22876916, 39724980, 57268860, 75490816, +-94376496, -113883272, -134001320, -154702832, -175958544, -197737504, +-220006032, -242729312, -265870144, -289389664, -313247648, -337401888, +-361809024, -386424256, -411201216, -436093120, -461051360, -486026816, +-510969600, -535829088, -560554240, -585093440, -609395008, -633407296, +-657078592, -680357568, -703193408, -725535424, -747334272, -768541184, +-789108672, -808990656, -828142272, -846520832, -864084928, -880795968, +-896616960, -911514304, -925457216, -938417536, -950324992, -961141376, +-970896128, -979566976, -987136576, -993587776, -998908288, -1003088128, +-1006120192, -1008000960, -1008729280, -1008307648, -1006741504, -1004039168, +-1000212096, -995274560, -989243584, -982139008, -973983296, -964801472, +-954620608, -943470016, -931381312, -918388608, -904527488, -889835648, +-874352128, -858117568, -841174400, -823565824, -805336512, -786531904, +-767198144, -747382720, -727132672, -706495808, -685520512, -664254656, +-642746560, -621047616, 599273536, 577248256, 555196416, 533150944, +511154144, 489249568, 467478368, 445881248, 424498464, 403368608, +382529632, 362017792, 341868224, 322114240, 302787552, 283917824, +265532592, 247657504, 230315568, 213527440, 197311648, 181683920, +166657488, 152242496, 138447232, 125276624, 112733328, 100817520, +89526080, 78854768, 68795096, 59337532, 50469688, 42175888, +34440516, 27241264, 20558124, 14361678, 8619497, 3303076, +-1288525, -5070930, -8454926, -11459781, -14115485, -16433949, +-18436136, -20138626, -21555150, -22702724, -23593500, -24242222, +-24662498, -24867088, -24870766, -24686354, -24328404, -23811232, +-23148884, -22356736, -21449164, -20441404, -19348716, -18185774, +-16968062, -15710186, -14426756, -13132428, -11840736, -10565599, +-9320040, -8115961, -6965903, -5879984, -4867949, -3939392, +-3097321, -2346408, -1680051, -1007770 +}; + + +const Word32 LDQMF_60_fx[] = // q = 30 +{ 102335, 132094, 137435, 135348, 130053, 120487, +108540, 94117, 77296, 58569, 37811, 15642, +-7974, -32618, -57896, -84046, -110470, -136942, +-163210, -188996, -214437, -239090, -262715, -285164, +-306246, -325880, -343923, -360378, -375095, -388053, +-399325, -408842, -416724, -423037, -427924, -431547, +-433999, -435582, -436522, -437004, -437285, -437643, +-438481, -440061, -442702, -446766, -452481, -460181, +-470154, -482692, -497967, -516093, -537287, -561714, +-589463, -620380, -654511, -691824, -731564, -775910, +-829205, -887814, -949147, -1011178, -1074239, -1138340, +-1203245, -1268925, -1334920, -1400801, -1466394, -1531259, +-1595081, -1657422, -1717943, -1776349, -1832122, -1884920, +-1934396, -1980123, -2021834, -2059138, -2091723, -2119241, +-2141377, -2157945, -2168655, -2173352, -2171781, -2163852, +-2149388, -2128229, -2100421, -2065895, -2024637, -1976676, +-1922047, -1860817, -1793098, -1719007, -1638684, -1552285, +-1460012, -1362085, -1258675, -1150049, -1036417, -918024, +-795131, -668022, -536993, -402188, -263993, -122679, +21420, 167951, 316689, 467104, 619488, 773429, +-945238, -1109006, -1271451, -1433049, -1594302, -1754861, +-1914784, -2074062, -2232362, -2389327, -2544891, -2698989, +-2851488, -3002258, -3151251, -3298295, -3443306, -3586211, +-3726943, -3865449, -4001599, -4135335, -4266665, -4395461, +-4521664, -4645247, -4766175, -4884419, -4999899, -5112604, +-5222403, -5329217, -5433113, -5533999, -5631868, -5726641, +-5818340, -5906959, -5992421, -6074745, -6153951, -6230036, +-6303010, -6372928, -6439842, -6503844, -6565000, -6623434, +-6679269, -6732690, -6783803, -6832855, -6880012, -6925505, +-6969547, -7012400, -7054335, -7095679, -7136776, -7177903, +-7219119, -7260809, -7303731, -7348340, -7394870, -7443617, +-7494881, -7549042, -7606393, -7667166, -7731643, -7800141, +-7872826, -7949918, -8031500, -8117778, -8208793, -8304569, +-8405066, -8510223, -8619935, -8734017, -8852171, -8974106, +-9099397, -9227619, -9358364, -9490965, -9624792, -9759051, +-9892867, -10025312, -10155439, -10282162, -10404401, -10520844, +-10630426, -10731825, -10823502, -10903968, -10971712, -11025073, +-11062346, -11081824, -11081759, -11060277, -11015548, -10945697, +-10848751, -10722771, -10565739, -10375810, -10150872, -9888970, +-9588053, -9246198, -8861297, -8431401, -7954791, -7429283, +6854949, 6226193, 5542799, 4803353, 4006048, 3149248, +2231398, 1251053, 206699, -902968, -2079213, -3323232, +-4636016, -6018495, -7471561, -8995894, -10592059, -12260527, +-14001671, -15815707, -17702624, -19662438, -21694928, -23799650, +-25976100, -28223572, -30541232, -32928052, -35382820, -37904240, +-40490688, -43140436, -45851544, -48621904, -51449560, -54331840, +-57266136, -60249600, -63279032, -66351236, -69462792, -72609920, +-75788648, -78994976, -82224448, -85472704, -88734976, -92006232, +-95281520, -98555328, -101822272, -105076584, -108312432, -111523680, +-114704032, -117847120, -120946376, -123995120, -126986608, -129913560, +-132768248, -135542896, -138230992, -140825344, -143318016, -145701104, +-147966688, -150106768, -152113232, -153978192, -155693424, -157250816, +-158642336, -159859744, -160895152, -161740352, -162387488, -162828688, +-163056176, -163062224, -162839296, -162379936, -161676800, -160722816, +-159511024, -158034768, -156287280, -154262480, -151954128, -149356496, +-146464032, -143271408, -139773568, -135965808, -131843832, -127403488, +-122641048, -117553208, -112136840, -106389392, -100308496, -93892368, +-87139520, -80048728, -72619504, -64851416, -56744644, -48299972, +-39518100, -30400730, -20949652, -11167261, -1056327, 9379870, +20137698, 31212950, 42601076, 54297248, 66296312, 78593112, +-91185600, -104051416, -117194704, -130607064, -144280880, -158207776, +-172378736, -186784688, -201415824, -216262032, -231313168, -246558128, +-261985952, -277585056, -293343616, -309249600, -325290400, -341453376, +-357725472, -374093504, -390543744, -407062432, -423635840, -440249504, +-456889088, -473540064, -490187584, -506816896, -523412928, -539960640, +-556444864, -572850304, -589161600, -605363456, -621440576, -637377600, +-653159232, -668770368, -684195712, -699420352, -714429248, -729207616, +-743740992, -758014656, -772014784, -785727168, -799138176, -812234496, +-825002880, -837430848, -849505856, -861215872, -872549376, -883495616, +-894043456, -904183040, -913905152, -923200640, -932063424, -940477696, +-948417216, -955866112, -962841216, -969345024, -975368256, -980905536, +-985952256, -990502784, -994553344, -998100544, -1001141248, -1003673344, +-1005694720, -1007204608, -1008202304, -1008687808, -1008661952, -1008125952, +-1007081664, -1005531712, -1003479040, -1000927424, -997881088, -994344832, +-990323904, -985824192, -980852096, -975414528, -969518976, -963173312, +-956385600, -949164608, -941519424, -933459776, -924995776, -916137728, +-906896448, -897283008, -887308928, -876985984, -866326016, -855341824, +-844045696, -832450624, -820569472, -808415936, -796003264, -783345088, +-770455104, -757347840, -744036608, -730535808, -716859456, -703022272, +-689038016, -674920448, -660685696, -646345600, -631918336, -617424704, +602927232, 588261568, 573575488, 558872576, 544170240, 529480224, +514815008, 500187776, 485610624, 471095904, 456655456, 442301536, +428045760, 413899520, 399874240, 385981024, 372230592, 358633472, +345199872, 331939808, 318862624, 305977728, 293293792, 280819232, +268562016, 256529792, 244729552, 233167968, 221851008, 210784624, +199973840, 189423392, 179137440, 169119664, 159373024, 149900064, +140703152, 131783696, 123142424, 114780232, 106697088, 98892400, +91364808, 84113256, 77135992, 70429688, 63991576, 57819020, +51907328, 46252108, 40848248, 35691672, 30775584, 26091894, +21637068, 17400960, 13374445, 9548629, 5897691, 2475271, +-592184, -3242831, -5659969, -7917455, -10003035, -11926348, +-13696880, -15315395, -16789184, -18123694, -19324048, -20394110, +-21338122, -22161874, -22868630, -23462238, -23947232, -24327810, +-24607834, -24790774, -24881324, -24883598, -24801182, -24638338, +-24399474, -24088950, -23710470, -23268668, -22768174, -22213084, +-21607820, -20956786, -20264828, -19536176, -18774960, -17986262, +-17174228, -16343248, -15497611, -14641749, -13780261, -12916498, +-12055168, -11200397, -10355588, -9525147, -8711802, -7920384, +-7153631, -6413877, -5706098, -5031208, -4393110, -3792571, +-3230785, -2713517, -2227976, -1784735, -1364254, -871386 +}; + +#endif /* OPT_IVAS_FILTER_ROM */ + const Word32 rot_vec_delay_re_LDQMF_fx[60] = // q = 31 { -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, diff --git a/lib_com/rom_com_fx.h b/lib_com/rom_com_fx.h index 29e763757..9bf335aac 100644 --- a/lib_com/rom_com_fx.h +++ b/lib_com/rom_com_fx.h @@ -70,7 +70,7 @@ extern const Word16 sin_twiddle_table_25_5_5[25]; // Q15 extern const Word16 cos_twiddle_table_16_8_2[16]; // Q15 extern const Word16 sin_twiddle_table_16_8_2[16]; // Q15 - +#ifndef OPT_IVAS_FILTER_ROM extern const Word16 CLDFB80_10_fx[100]; // Q15 extern const Word16 CLDFB80_16_fx[160]; // Q15 extern const Word16 CLDFB80_20_fx[200]; // Q15 @@ -87,6 +87,25 @@ extern const Word16 LDQMF_30_fx[300]; // Q15 extern const Word16 LDQMF_32_fx[320]; // Q15 extern const Word16 LDQMF_40_fx[400]; // Q15 extern const Word16 LDQMF_60_fx[600]; // Q15 +#else /* OPT_IVAS_FILTER_ROM */ + +extern const Word32 CLDFB80_10_fx[100]; // Q30 +extern const Word32 CLDFB80_16_fx[160]; // Q30 +extern const Word32 CLDFB80_20_fx[200]; // Q30 +extern const Word32 CLDFB80_30_fx[300]; // Q30 +extern const Word32 CLDFB80_32_fx[320]; // Q30 +extern const Word32 CLDFB80_40_fx[400]; // Q30 +extern const Word32 CLDFB80_60_fx[600]; // Q30 + +/*5ms delay*/ +extern const Word32 LDQMF_10_fx[100]; // Q30 +extern const Word32 LDQMF_16_fx[160]; // Q30 +extern const Word32 LDQMF_20_fx[200]; // Q30 +extern const Word32 LDQMF_30_fx[300]; // Q30 +extern const Word32 LDQMF_32_fx[320]; // Q30 +extern const Word32 LDQMF_40_fx[400]; // Q30 +extern const Word32 LDQMF_60_fx[600]; // Q30 +#endif /* OPT_IVAS_FILTER_ROM */ /* Not used anywhere extern const Word16 LDQMF_10_enc_fx[100]; extern const Word16 LDQMF_16_enc_fx[160]; diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index f99d49802..8603beb49 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -617,8 +617,11 @@ typedef struct cldfb_filter_bank_struct Word16 da; /* delay analysis */ CLDFB_PROTOTYPE prototype; const Word16 *p_filter; /*!< Pointer to filter coefficients */ // Q15 - Word16 p_filter_sf; // Q0 - +#ifdef OPT_IVAS_FILTER_ROM + const Word32 *p_filter_32; /*!< Pointer to filter coefficients */ // Q15 +#else /* OPT_IVAS_FILTER_ROM */ + Word16 p_filter_sf; // Q0 +#endif /* OPT_IVAS_FILTER_ROM */ /* rotation vectors */ const Word32 *rot_vec_syn_re_fx; // Q29 diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 7fecb7ca7..1ff772953 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1750,31 +1750,68 @@ void ivas_qmetadata_to_dirac_fx( } ELSE { +#ifndef OPT_SBA_DEC_PATH Word16 tmp1, tmp4; +#endif /* OPT_SBA_DEC_PATH */ Word16 a, b_tmp; Word16 exp_factor = 0; move16(); a = rand_triangular_signed_fx( seed_ptr, &exp_factor ); // q = exp_factor +#ifndef OPT_SBA_DEC_PATH tmp1 = mult( a, dirac_dithering_azi_scale_fx[diff_idx] ); // exp_factor + 5 Word32 tmp1_32 = L_deposit_h( tmp1 ); +#else /* OPT_SBA_DEC_PATH */ + Word32 tmp1_32 = L_mult( a, dirac_dithering_azi_scale_fx[diff_idx] ); // exp_factor + 5 +#endif /* OPT_SBA_DEC_PATH */ Word16 final_1_exp; - Word32 final_1_32 = BASOP_Util_Add_Mant32Exp( azimuth_fx, 9, tmp1_32, exp_factor + 5, &final_1_exp ); - b_tmp = rand_triangular_signed_fx( seed_ptr, &exp_factor ); // q = exp_factor + Word32 final_1_32; +#ifndef OPT_SBA_DEC_PATH + final_1_32 = BASOP_Util_Add_Mant32Exp( azimuth_fx, 9, tmp1_32, add( exp_factor, 5 ), &final_1_exp ); +#else /* OPT_SBA_DEC_PATH */ + Word16 norm_op1 = norm_l( azimuth_fx ); + Word16 norm_op2 = norm_l( tmp1_32 ); + Word16 op2_e = add( exp_factor, 5 ); + final_1_exp = add( s_max( s_max( sub( 9, norm_op1 ), sub( op2_e, norm_op2 ) ), 0 ), 2 ); // 2 for headroom + final_1_32 = L_add( L_shr( azimuth_fx, sub( final_1_exp, 9 ) ), L_shr( tmp1_32, sub( final_1_exp, op2_e ) ) ); + +#endif /* OPT_SBA_DEC_PATH */ + b_tmp = rand_triangular_signed_fx( seed_ptr, &exp_factor ); // q = exp_factor +#ifndef OPT_SBA_DEC_PATH tmp4 = mult( b_tmp, dirac_dithering_ele_scale_fx[diff_idx] ); // exp_factor + 4 Word32 tmp4_32 = L_deposit_h( tmp4 ); - Word16 final_2_exp; - Word32 final_2_32 = BASOP_Util_Add_Mant32Exp( elevation_fx, 9, tmp4_32, exp_factor + 4, &final_2_exp ); - +#else /* OPT_SBA_DEC_PATH */ + Word32 tmp4_32 = L_mult( b_tmp, dirac_dithering_ele_scale_fx[diff_idx] ); // exp_factor + 4 +#endif /* OPT_SBA_DEC_PATH */ + Word16 final_2_exp; + Word32 final_2_32; +#ifndef OPT_SBA_DEC_PATH + final_2_32 = BASOP_Util_Add_Mant32Exp( elevation_fx, 9, tmp4_32, add( exp_factor, 4 ), &final_2_exp ); +#else /* OPT_SBA_DEC_PATH */ + norm_op1 = norm_l( elevation_fx ); + norm_op2 = norm_l( tmp4_32 ); + op2_e = add( exp_factor, 4 ); + final_2_exp = add( s_max( s_max( sub( 9, norm_op1 ), sub( op2_e, norm_op2 ) ), 0 ), 2 ); // 2 for headroom + final_2_32 = L_add( L_shr( elevation_fx, sub( final_2_exp, 9 ) ), L_shr( tmp4_32, sub( final_2_exp, op2_e ) ) ); +#endif /* OPT_SBA_DEC_PATH */ + +#ifndef OPT_SBA_DEC_PATH final_1_32 = BASOP_Util_Add_Mant32Exp( final_1_32, final_1_exp, ONE_IN_Q30, 0, &final_1_exp ); /*0.5 in q31*/ final_2_32 = BASOP_Util_Add_Mant32Exp( final_2_32, final_2_exp, ONE_IN_Q30, 0, &final_2_exp ); azi = extract_h( L_shr( final_1_32, sub( sub( 31, final_1_exp ), 16 ) ) ); ele = extract_h( L_shr( final_2_32, sub( sub( 31, final_2_exp ), 16 ) ) ); +#else /* OPT_SBA_DEC_PATH */ + final_1_32 = L_add( final_1_32, L_shl( 1, sub( 30, final_1_exp ) ) ); /*0.5 in q31*/ + final_2_32 = L_add( final_2_32, L_shl( 1, sub( 30, final_2_exp ) ) ); + azi = extract_h( L_shr( final_1_32, sub( 15, final_1_exp ) ) ); + ele = extract_h( L_shr( final_2_32, sub( 15, final_2_exp ) ) ); +#endif /* OPT_SBA_DEC_PATH */ + /*addition of one to compensate precision loss*/ if ( azi < 0 ) diff --git a/lib_dec/ivas_mct_core_dec_fx.c b/lib_dec/ivas_mct_core_dec_fx.c index b42eb534b..08359826a 100644 --- a/lib_dec/ivas_mct_core_dec_fx.c +++ b/lib_dec/ivas_mct_core_dec_fx.c @@ -198,7 +198,10 @@ void ivas_mct_core_dec( Word16 tcx_offset; Word16 tcx_offsetFB; Word16 left_rect; - Word16 L_spec, scale, tmp1, tmp2; + Word16 L_spec; +#ifndef OPT_SBA_DEC_PATH + Word16 scale, tmp1, tmp2; +#endif /* OPT_SBA_DEC_PATH */ #ifdef DEBUG_MCT float nrg[MCT_MAX_CHANNELS]; #endif @@ -218,11 +221,18 @@ void ivas_mct_core_dec( move16(); FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { +#ifndef OPT_SBA_DEC_PATH FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; i = add( i, 1 ); } +#else /* OPT_SBA_DEC_PATH */ + FOR( ch = 0; ch < CPE_CHANNELS; ( ch++, i++ ) ) + { + sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; + } +#endif /* OPT_SBA_DEC_PATH */ } i = 0; @@ -268,7 +278,61 @@ void ivas_mct_core_dec( { CONTINUE; } +#ifdef OPT_SBA_DEC_PATH + IF( EQ_16( st->core, TCX_10_CORE ) ) + { + Word16 L_frame_2 = shr( st->L_frame, 1 ); + Word16 L_frameTCX_2 = shr( st->hTcxDec->L_frameTCX, 1 ); + nSubframes = NB_DIV; // assuming NB_DIV is 2. Below logic needs to be modified if NB_DIV changes. + move16(); + FOR( k = 0; k < nSubframes; k++ ) + { + L_spec = shr( st->hTcxCfg->tcx_coded_lines, 1 ); + move32(); + init_tcx_info_fx( st, L_frame_2, L_frameTCX_2, k, bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); + + Word16 x_e, x_len; + /* mono or dual mono IGF decoding */ + x_e = sub( 31, q_x[ch] ); + decoder_tcx_IGF_mono_fx( st, x_fx[ch][k], &x_e, &x_len, L_frame, left_rect, bfi, k ); + q_x[ch] = sub( 31 - 12, x_e ); // Shift to bring x to Q12 + move16(); + FOR( i = 0; i < x_len; i++ ) + { + x_fx[ch][k][i] = L_shr( x_fx[ch][k][i], q_x[ch] ); + move32(); + } + q_x[ch] = Q12; + move16(); + } + } + ELSE + { + nSubframes = 1; + move16(); + { + L_spec = st->hTcxCfg->tcx_coded_lines; + move32(); + + init_tcx_info_fx( st, st->L_frame, st->hTcxDec->L_frameTCX, 0, bfi, &tcx_offset, &tcx_offsetFB, &L_frame, &L_frameTCX, &left_rect, &L_spec ); + + Word16 x_e, x_len; + /* mono or dual mono IGF decoding */ + x_e = sub( 31, q_x[ch] ); + decoder_tcx_IGF_mono_fx( st, x_fx[ch][0], &x_e, &x_len, L_frame, left_rect, bfi, 0 ); + q_x[ch] = sub( 31 - 12, x_e ); // Shift to bring x to Q12 + move16(); + FOR( i = 0; i < x_len; i++ ) + { + x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], q_x[ch] ); + move32(); + } + q_x[ch] = Q12; + move16(); + } + } +#else /* OPT_SBA_DEC_PATH */ IF( EQ_16( st->core, TCX_10_CORE ) ) { nSubframes = NB_DIV; @@ -304,6 +368,7 @@ void ivas_mct_core_dec( q_x[ch] = Q12; move16(); } +#endif /* OPT_SBA_DEC_PATH */ } } ELSE @@ -318,6 +383,9 @@ void ivas_mct_core_dec( * MCT processing *--------------------------------------------------------------------------------*/ +#ifdef OPT_SBA_DEC_PATH + apply_MCT_dec_fx( hMCT, sts, x_fx ); +#else /* OPT_SBA_DEC_PATH */ apply_MCT_dec_fx( hMCT, sts, x_fx, q_x ); FOR( ch = 0; ch < nChannels; ch++ ) { @@ -331,6 +399,7 @@ void ivas_mct_core_dec( q_x[ch] = Q12; move16(); } +#endif /* OPT_SBA_DEC_PATH */ } pop_wmops(); diff --git a/lib_dec/ivas_mct_dec_mct_fx_fx.c b/lib_dec/ivas_mct_dec_mct_fx_fx.c index 0f20c1ec0..0d998b355 100644 --- a/lib_dec/ivas_mct_dec_mct_fx_fx.c +++ b/lib_dec/ivas_mct_dec_mct_fx_fx.c @@ -165,8 +165,12 @@ void ivas_mct_dec_mct_fx( static void applyGlobalILD_fx( Decoder_State **sts, MCT_DEC_HANDLE hMCT, - Word32 *x[MCT_MAX_CHANNELS][NB_DIV], - Word16 q_x[MCT_MAX_CHANNELS] ) + Word32 *x[MCT_MAX_CHANNELS][NB_DIV] +#ifndef OPT_SBA_DEC_PATH + , + Word16 q_x[MCT_MAX_CHANNELS] +#endif /* OPT_SBA_DEC_PATH */ +) { Word16 ch, k; Word16 nSubframes, L_subframeTCX; @@ -207,9 +211,14 @@ static void applyGlobalILD_fx( FOR( k = 0; k < nSubframes; k++ ) { v_multc_fixed( x[ch][k], qratio, x[ch][k], L_subframeTCX ); // Qx - 5 + q_qratio +#ifdef OPT_SBA_DEC_PATH + scale_sig32( x[ch][k], L_subframeTCX, sub( 5, q_qratio ) ); +#endif /* OPT_SBA_DEC_PATH */ } +#ifndef OPT_SBA_DEC_PATH q_x[ch] = add( sub( q_x[ch], 5 ), q_qratio ); move16(); +#endif /* OPT_SBA_DEC_PATH */ } ELSE { @@ -228,10 +237,14 @@ static void applyGlobalILD_fx( *----------------------------------------------------------*/ void apply_MCT_dec_fx( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequan. spect. input to MCT */ - Word16 q_x[MCT_MAX_CHANNELS] ) + MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ + Decoder_State **sts, /* i/o: decoder state structure */ + Word32 *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ +#ifndef OPT_SBA_DEC_PATH + , + Word16 q_x[MCT_MAX_CHANNELS] +#endif /* OPT_SBA_DEC_PATH */ +) { Word16 pair; MCT_DEC_BLOCK_DATA_HANDLE hBlock; @@ -240,10 +253,18 @@ void apply_MCT_dec_fx( { hBlock = hMCT->hBlockData[pair]; +#ifndef OPT_SBA_DEC_PATH stereo_decoder_tcx_fx( hBlock->hStereoMdct, hBlock->mask, &x[hBlock->ch2][0], &x[hBlock->ch1][0], &x[hBlock->ch2][0], hBlock->hStereoMdct->mdct_stereo_mode, sts[hBlock->ch1]->core, sts[hBlock->ch2]->core, sts[0]->igf, sts[0]->hTcxDec->L_frameTCX, sts[1]->hTcxDec->L_frameTCX, 1, TCX_20_CORE, TCX_20_CORE, 0, &q_x[hBlock->ch2], &q_x[hBlock->ch1] ); +#else /* OPT_SBA_DEC_PATH */ + stereo_decoder_tcx_fx( hBlock->hStereoMdct, hBlock->mask, &x[hBlock->ch2][0], &x[hBlock->ch1][0], &x[hBlock->ch2][0], hBlock->hStereoMdct->mdct_stereo_mode, sts[hBlock->ch1]->core, sts[hBlock->ch2]->core, sts[0]->igf, sts[0]->hTcxDec->L_frameTCX, sts[1]->hTcxDec->L_frameTCX, 1, TCX_20_CORE, TCX_20_CORE, 0 ); +#endif /* OPT_SBA_DEC_PATH */ } +#ifndef OPT_SBA_DEC_PATH applyGlobalILD_fx( sts, hMCT, x, q_x ); +#else /* OPT_SBA_DEC_PATH */ + applyGlobalILD_fx( sts, hMCT, x ); +#endif /* OPT_SBA_DEC_PATH */ return; } diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index fabebede4..4e90792fb 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -737,7 +737,11 @@ void ivas_mdct_core_invQ_fx( q_r = sub( 30, sts[1]->hTonalMDCTConc->lastBlockData.spectralData_exp ); /* both input in same Q */ +#ifndef OPT_SBA_DEC_PATH stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0[1], &spectralData_tmp[0], &spectralData_tmp[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 1, &q_r, &q_l ); +#else /* OPT_SBA_DEC_PATH */ + stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0[1], &spectralData_tmp[0], &spectralData_tmp[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 1 ); +#endif /* OPT_SBA_DEC_PATH */ Copy_Scale_sig_32_16( spectralData_tmp[0], sts[0]->hTonalMDCTConc->lastBlockData.spectralData, L_frameTCX[0], -15 ); // q_l - 15 Copy_Scale_sig_32_16( spectralData_tmp[1], sts[1]->hTonalMDCTConc->lastBlockData.spectralData, L_frameTCX[1], -15 ); // q_r - 15 diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 89cb92a4d..85ae00c90 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -465,9 +465,11 @@ void stereo_mdct_core_dec_fx( test(); IF( ( !bfi || ( sts[0]->core != ACELP_CORE || sts[1]->core != ACELP_CORE ) ) && !hCPE->hStereoMdct->isSBAStereoMode ) { +#ifndef OPT_SBA_DEC_PATH Word16 q_x_1 = 11, q_x_0 = 11; move16(); move16(); +#endif /* OPT_SBA_DEC_PATH */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -477,7 +479,11 @@ void stereo_mdct_core_dec_fx( move16(); } } +#ifdef OPT_SBA_DEC_PATH + stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0_fx[1], x_fx[0], x_fx[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0 ); +#else /* OPT_SBA_DEC_PATH */ stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0_fx[1], x_fx[0], x_fx[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0, &q_x_1, &q_x_0 ); +#endif /* OPT_SBA_DEC_PATH */ } ivas_mdct_core_tns_ns_fx( hCPE, fUseTns, tnsData, x_fx, Aq_fx_32, 0, x_e ); diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c index 8842a6792..492060a67 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec_fx.c @@ -313,9 +313,13 @@ void stereo_decoder_tcx_fx( const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ const Word16 last_core_l, /* i : last core for left channel Q0*/ const Word16 last_core_r, /* i : last core for right channel Q0*/ - const Word16 tmp_plc_upmix, /* i : indicates temp upmix for PLC decision Q0*/ + const Word16 tmp_plc_upmix /* i : indicates temp upmix for PLC decision Q0*/ +#ifndef OPT_SBA_DEC_PATH + , Word16 *q_x_ch2, - Word16 *q_x_ch1 ) + Word16 *q_x_ch1 +#endif /* OPT_SBA_DEC_PATH */ +) { Word16 i, k, sfb, nSubframes; STEREO_MDCT_BAND_PARAMETERS *sfbConf = NULL; @@ -361,10 +365,12 @@ void stereo_decoder_tcx_fx( } } inverseMS_fx( sfbConf->sfbOffset[sfbConf->nBandsStereoCore], spec_l[k], spec_r[k], SQRT2_OVER_2_FIXED ); +#ifndef OPT_SBA_DEC_PATH *q_x_ch2 = *q_x_ch2; move16(); *q_x_ch1 = *q_x_ch1; move16(); +#endif /* OPT_SBA_DEC_PATH */ } ELSE IF( EQ_16( mdct_stereo_mode[k], SMDCT_BW_MS ) ) { @@ -381,10 +387,12 @@ void stereo_decoder_tcx_fx( } } inverseBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2_FIXED ); +#ifndef OPT_SBA_DEC_PATH *q_x_ch2 = *q_x_ch2; move16(); *q_x_ch1 = *q_x_ch1; move16(); +#endif /* OPT_SBA_DEC_PATH */ } } } @@ -402,10 +410,12 @@ void stereo_decoder_tcx_fx( } } inverseMS_fx( sub( sfbConf->sfbOffset[sfbConf->sfbCnt], sfbConf->sfbOffset[sfbConf->nBandsStereoCore] ), &spec_l[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], &spec_r[k][sfbConf->sfbOffset[sfbConf->nBandsStereoCore]], SQRT2_OVER_2_FIXED ); +#ifndef OPT_SBA_DEC_PATH *q_x_ch2 = *q_x_ch2; move16(); *q_x_ch1 = *q_x_ch1; move16(); +#endif /* OPT_SBA_DEC_PATH */ } ELSE IF( EQ_16( hStereoMdct->IGFStereoMode[k], SMDCT_BW_MS ) ) { @@ -422,10 +432,12 @@ void stereo_decoder_tcx_fx( } } inverseBwMS_fx( sfbConf->sfbOffset[sfb], sfbConf->sfbOffset[sfb + 1], spec_l[k], spec_r[k], SQRT2_OVER_2_FIXED ); +#ifndef OPT_SBA_DEC_PATH *q_x_ch2 = *q_x_ch2; move16(); *q_x_ch1 = *q_x_ch1; move16(); +#endif /* OPT_SBA_DEC_PATH */ } } } @@ -483,8 +495,10 @@ void stereo_decoder_tcx_fx( nrgRatio = L_shl( nrgRatio, shift ); /* Q26 + shift */ v_multc_fixed( spec_r[k], nrgRatio, spec_r[k], L_frameTCX_r ); /* spec_r will be in Qx + shift - Q5 */ Scale_sig32( spec_r[k], L_frameTCX_r, sub( 5, shift ) ); /* Qx */ +#ifndef OPT_SBA_DEC_PATH *q_x_ch2 = *q_x_ch2; move16(); +#endif /* OPT_SBA_DEC_PATH */ } ELSE IF( ( LT_32( nrgRatio, ONE_IN_Q26 ) ) && ( LT_16( k, tmp2 ) ) ) { @@ -492,8 +506,10 @@ void stereo_decoder_tcx_fx( shift = sub( 5, tmp_e ); v_multc_fixed( spec_l[k], inv_nrgRatio, spec_l[k], L_frameTCX_l ); /* spec_r will be in Qx - tmp_e */ Scale_sig32( spec_l[k], L_frameTCX_l, sub( 5, shift ) ); /* Qx */ +#ifndef OPT_SBA_DEC_PATH *q_x_ch1 = *q_x_ch1; move16(); +#endif /* OPT_SBA_DEC_PATH */ } } } /* for k */ diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 622ebf89a..093fdf7c3 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -663,7 +663,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 num_freq_bands_diff, num_channels_diff; Word16 ch_idx; Word32 aux_buf[CLDFB_NO_CHANNELS_MAX]; - Word16 diff_start_band, tmp16; + Word16 diff_start_band; DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; @@ -816,12 +816,341 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( ONE_IN_Q29 /*0.25f Q31*/, h_dirac_output_synthesis_state->diffuse_power_factor_fx, num_freq_bands ); /*h_dirac_output_synthesis_state->diffuse_power_factor_q+Q31-Q31->h_dirac_output_synthesis_state->diffuse_power_factor_q*/ +#ifdef OPT_SBA_DEC_PATH + /*Direct gain*/ + + Word16 *exp_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) ); + Word16 cy_cross_dir_smooth_e = sub( 31, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ); + + FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ ) + { + exp_temp_cy_cross_dir_smooth_fx[kk] = cy_cross_dir_smooth_e; // h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + move16(); + } + + Word16 q_temp = sub( add( shl( h_dirac_output_synthesis_state->direct_responses_q, 1 ), q_diffuseness ), 62 ); + Word32 one_in_qdiff = L_shl( 1, q_diffuseness ); + Word32 c1 = Madd_32_16( ONE_IN_Q29 /*1 Q29*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ), 5461 /*1.0 / 6.0 Q15*/ ); /*Diffuseness modellling nrg compensation*/ /*Q29*/ + Word16 q_diff_c = sub( q_diffuseness, 2 ); + + FOR( ch_idx = 0; ch_idx < s_min( 4, nchan_transport ); ch_idx++ ) + { + Word16 k; + IF( ch_idx != 0 ) + { + Word32 a, c; + Word16 b, b_exp, sqr_exp, q_diff_aab; // , q_diff_c; + Word32 mpy_a_a_b, mpy_diff_c, mpy_diff_aab; + Word32 sqr_inp, sqr; + + /*Directonal sound gain nrg compensation*/ + FOR( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses + move32(); + + + b_exp = 0; + move16(); + + b = 0; + move16(); + + if ( 0 == reference_power[k + ( ch_idx + 1 ) * num_freq_bands] ) + { + b = MAX_16; + move16(); + } + + test(); + IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] && reference_power[k + num_freq_bands] ) + { + b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*Q(15-b_exp)*/ + } + + + mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q(q_diff_aab) = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 + mpy_diff_c = Mpy_32_32( diffuseness[k], c1 ); // Q(q_diff_c) = q_diffuseness - 2 + + q_diff_aab = sub( q_temp, b_exp ); // add( sub( add( h_dirac_output_synthesis_state->direct_responses_q, sub( 15, b_exp ) ), 15 ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); + + Word16 minq = sub( s_min( q_diff_aab, q_diff_c ), 1 ); + Word32 op1 = L_shr( mpy_diff_aab, sub( q_diff_aab, minq ) ); + Word32 op2 = L_shr( mpy_diff_c, sub( q_diff_c, minq ) ); + sqr_inp = L_add( op1, op2 ); + sqr_exp = sub( 31, minq ); + sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ + sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) + { + IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth-> (31-sqr_exp) */ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + ELSE + { + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*( 31- sqr_exp )-> h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ + } + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx*/ + move32(); + } + ELSE + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr; // L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*31-sqr_exp*/ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + } + c = Madd_32_16( ONE_IN_Q27 /*1 Q27*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_fx, ONE_IN_Q27 /*1 Q27*/ ), 5461 ); /*Diffuseness modellling nrg compensation*/ /* 1.0 / 6.0 = 5461 in Q15*/ /*Q27*/ + Word16 diff_c_exp = sub( q_diffuseness, 4 ); +#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot + FOR( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses + move32(); + IF( reference_power[k + num_freq_bands] == 0 ) + { + sqr_inp = Mpy_32_32( diffuseness[k], c ); + sqr_exp = sub( 31 + 4, q_diffuseness ); + } + ELSE + { + Word16 diff_aab_exp; + IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 ) + { + mpy_a_a_b = Mpy_32_32( a, a ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - 31 + q_diffuseness -31 + mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 4 + diff_aab_exp = q_temp; + move16(); + } + ELSE + { + b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*q(15-b_exp)*/ + + mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + mpy_diff_aab = Mpy_32_32( L_sub( one_in_qdiff, diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 + mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 4 + diff_aab_exp = sub( q_temp, b_exp ); // sub(sub(add(sub(31 + 62, h_dirac_output_synthesis_state->direct_responses_q), b_exp), h_dirac_output_synthesis_state->direct_responses_q), q_diffuseness); + } + Word16 minq = sub( s_min( diff_aab_exp, diff_c_exp ), 1 ); + Word32 op1 = L_shr( mpy_diff_aab, sub( diff_aab_exp, minq ) ); + Word32 op2 = L_shr( mpy_diff_c, sub( diff_c_exp, minq ) ); + sqr_inp = L_add( op1, op2 ); + sqr_exp = sub( 31, minq ); + } + sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ + sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ + + + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) + { + IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + ELSE + { + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ + } + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ + move32(); + } + ELSE + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; + move16(); + } + } + +#else + FOR( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses + move32(); + IF( reference_power[k + num_freq_bands] == 0 ) + { + b = 0; + move16(); + b_exp = 0; + move16(); + } + ELSE + { + IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 ) + { + b = MAX_16; + move16(); + b_exp = 0; + move16(); + } + ELSE + { + b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*q(15-b_exp)*/ + } + } + + mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 + mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 + mpy_diff_c = Mpy_32_32( diffuseness[k], c2 ); // Q = q_diffuseness - 4 + + q_diff_aab = add( add( h_dirac_output_synthesis_state->direct_responses_q, sub( sub( 15, b_exp ), 15 ) ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); + q_diff_c = sub( q_diffuseness, 4 ); + Word16 minq = sub( s_min( q_diff_aab, q_diff_c ), 1 ); + Word32 op1 = L_shr( mpy_diff_aab, sub( q_diff_aab, minq ) ); + Word32 op2 = L_shr( mpy_diff_c, sub( q_diff_c, minq ) ); + sqr_inp = L_add( op1, op2 ); + sqr_exp = sub( 31, minq ); + sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ + sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) + { + IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ + move32(); + Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + ELSE + { + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ + } + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ + move32(); + } + ELSE + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/ + move32(); + Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + } +#endif + } + ELSE + { + Word32 sqr_inp, sqr; + Word16 sqr_exp; + Word32 One_in_qdiff = L_shl( 1, sub( q_diffuseness, 1 ) ); + Word32 diff = L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx /*q29=0.5 * q30*/, ONE_IN_Q29 /*0.5 Q30*/ ); // Q30 + Word16 sq_e = sub( 32, q_diffuseness ); // 31-(q_diffuseness-1) + /*Diffuseness modellling nrg compensation*/ + FOR( k = 0; k < num_freq_bands_diff; k++ ) + { + /*diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) )*/ + sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], diff ); // Q = q_diffuseness - 1 + sqr_exp = sq_e; + move16(); + sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ + sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) + { + IF( LT_16( cy_cross_dir_smooth_e, sqr_exp ) ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q(31- sqr_exp)*/ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + ELSE + { + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31-sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ + } + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ + move32(); + } + ELSE + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr; /*Q(31-sqr_exp)*/ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + } + FOR( ; k < num_freq_bands; k++ ) + { + sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ) ); // Q = q_diffuseness - 1 + sqr_exp = sq_e; + move16(); + sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ + sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ + IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) + { + IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, Q( 31- sqr_exp )*/ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); + move16(); + } + ELSE + { + sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q( 31- sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ + } + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ + move32(); + } + ELSE + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31-sqr_exp)*/ + move32(); + exp_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; + move16(); + } + } + } + } + Word16 temp = exp_temp_cy_cross_dir_smooth_fx[0]; /*q0*/ + move16(); + FOR( Word16 kk = 1; kk < ( num_freq_bands * num_channels_dir ); kk++ ) + { + temp = s_max( exp_temp_cy_cross_dir_smooth_fx[kk], temp ); + } + + /*Directional gain (panning)*/ + Word16 temp_q = sub( add( h_dirac_output_synthesis_state->direct_power_factor_q, h_dirac_output_synthesis_state->direct_responses_q ), 31 ); + Word16 temp_exp = sub( 31, temp_q ); + + IF( LT_16( temp, temp_exp ) ) + { + FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( exp_temp_cy_cross_dir_smooth_fx[kk], temp_exp ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ->temp_q*/ + move32(); + } + h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q; + move16(); + } + ELSE + { + FOR( Word16 kk = 0; kk < ( num_freq_bands * num_channels_dir ); kk++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( exp_temp_cy_cross_dir_smooth_fx[kk], temp ) ); /*exp_temp_cy_cross_dir_smooth_fx[kk]->temp*/ + move32(); + } + h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = sub( 31, temp ); + move16(); + } + free( exp_temp_cy_cross_dir_smooth_fx ); +#else /* OPT_SBA_DEC_PATH */ /*Direct gain*/ Word16 *Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) ); - tmp16 = imult1616( num_freq_bands, num_channels_dir ); + Word16 tmp16 = imult1616( num_freq_bands, num_channels_dir ); FOR( Word16 kk = 0; kk < tmp16; kk++ ) { Q_temp_cy_cross_dir_smooth_fx[kk] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; @@ -1175,6 +1504,8 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp_q; move16(); } +#endif /* OPT_SBA_DEC_PATH */ + Word16 temp_q1 = sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, temp_q ); FOR( ch_idx = s_min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { @@ -1570,7 +1901,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( } q_shift = sub( 26, h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev ); - move16(); /* Direct gains */ IF( hodirac_flag ) @@ -1686,11 +2016,20 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd_fx( /*Direct input->output*/ p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev_fx; // (p_gains_dir_q) p_gains_dir_prev = h_dirac_output_synthesis_state.gains_dir_prev_fx; +#ifdef OPT_SBA_DEC_PATH + q_shift = sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev_q ); +#endif /* OPT_SBA_DEC_PATH */ FOR( ch_idx = 0; ch_idx < num_channels_dir; ch_idx++ ) { +#ifdef OPT_SBA_DEC_PATH + Scale_sig32( &h_dirac_output_synthesis_state.gains_dir_prev_fx[ch_idx * num_freq_bands], + num_freq_bands, + q_shift ); /*h_dirac_output_synthesis_state.gains_dir_prev_q->h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev*/ +#else /* OPT_SBA_DEC_PATH */ Scale_sig32( &h_dirac_output_synthesis_state.gains_dir_prev_fx[ch_idx * num_freq_bands], num_freq_bands, sub( h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev_q ) ); /*h_dirac_output_synthesis_state.gains_dir_prev_q->h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev*/ +#endif /* OPT_SBA_DEC_PATH */ } h_dirac_output_synthesis_state.gains_dir_prev_q = h_dirac_output_synthesis_state.q_cy_cross_dir_smooth_prev; move16(); -- GitLab From 533f0fbb9e54249bb09f3c2a5cad76a30f9309d8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 16:04:25 +0530 Subject: [PATCH 0615/1310] Fix for spectral hole issue --- lib_com/rom_com.c | 718 +++++++++++++++++++++++----------------------- 1 file changed, 359 insertions(+), 359 deletions(-) diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index d1a1564cb..2b18d8254 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -5437,19 +5437,19 @@ const Word16 LDQMF_60_fx[] = // q = 15 sf = 15391 qsf = 14 const Word32 CLDFB80_10_fx[100] = // q = 30 { - 3584, -2500, -706, 157, -1170, -1037, --11, -1944, -1380, 1837, 14726, -9095, --1690, -266, 3897, -4704, 419, 4651, -5274, -6638, -243746, -72520, -17070, 14830, --23631, -38285, 18452, -20884, -6244, -281514, --1070487, -153328, -20195, -4337, -209847, 194011, -24972, -5105, -34468, 1151401, -2164680, -832327, -376719, 1686598, 1844777, 1697324, 2356307, 3037446, -3248821, 1779295, -1533240, -1713947, 833815, 2751562, -2421811, 284255, -3540922, -6991555, -10248264, -14642952, + 3584, -2501, -707, 157, -1170, -1038, +-11, -1944, -1380, 1837, 14727, -9096, +-1691, -267, 3897, -4705, 419, 4651, +5275, -6639, -243747, -72521, -17071, 14831, +-23632, -38285, 18452, -20885, -6245, -281515, +-1070487, -153329, -20195, -4338, -209848, 194011, +24972, -5106, -34468, 1151402, -2164680, -832327, +376720, 1686598, 1844777, 1697325, 2356308, 3037447, +3248821, 1779296, -1533240, -1713947, 833816, 2751563, +2421812, 284255, -3540922, -6991555, -10248264, -14642952, 20031906, 26043234, 34417552, 45928496, 60756732, 78698864, 98151832, 116245496, 129823136, 136344976, 134601568, 122059576, -95304000, 53433792, -3371364, -74987256, -160511088, -258343120, +95304000, 53433792, -3371365, -74987256, -160511088, -258343120, -366360320, -481533344, 599091264, 714631872, 823505600, 920768896, 1001735168, 1062249792, 1100603392, 1116473216, 1114030976, 1091249536, 1031959808, 939413760, 835792512, 727712064, 614651648, 499141824, @@ -5459,22 +5459,22 @@ const Word32 CLDFB80_10_fx[100] = // q = 30 /* SNR: 292.49, PHASE: 2.000000000000000 */ const Word32 CLDFB80_16_fx[160] = // q = 30 -{ 591, -823, -251, 103, 63, -1, --19, 2357, 3221, -17, -2, 75, -36, -82, -596, 808, 2242, -3034, --755, 254, 126, -434, 106, -19349, -26445, -100, 482, -149, -90, 246, -2196, -3062, -344116, -158536, -67239, -47926, --21714, 16230, 6227, 48320, 46493, 5448, -17932, -33783, -26258, -13467, -97910, -469416, --1317170, -563405, -199455, -118497, -43264, 11679, --61886, 64705, -248885, 55868, 3767, 67210, -64791, 39611, 345777, 1796799, -2314105, -1658357, --815220, -115680, 761412, 1616442, 1931089, 1230669, -1712205, 1949652, 2418775, 2970521, 3179526, 3272215, -2739045, 1383590, -1186344, -2091283, -1594461, -20541, -1561481, 2685864, 2822045, 2243697, 1007269, -1321111, --3774214, -5979353, -7970746, -10025660, -12576468, -15588057, +{ 592, -824, -251, 104, 64, -2, +-19, 2357, 3222, -18, -2, 75, +37, -82, -596, 808, 2242, -3035, +-755, 254, 126, -435, 107, -19350, +26445, -100, 482, -149, -91, 247, +2196, -3062, -344117, -158537, -67240, -47926, +-21715, 16231, 6227, 48320, 46494, 5449, +17932, -33783, -26258, -13467, -97911, -469416, +-1317171, -563405, -199456, -118497, -43264, 11679, +-61886, 64706, -248886, 55869, 3768, 67211, +64791, 39611, 345778, 1796799, -2314105, -1658358, +-815220, -115680, 761413, 1616443, 1931089, 1230669, +1712206, 1949652, 2418775, 2970521, 3179526, 3272216, +2739046, 1383591, -1186345, -2091284, -1594461, -20541, +1561481, 2685864, 2822045, 2243697, 1007270, -1321111, +-3774214, -5979353, -7970747, -10025660, -12576468, -15588057, 19092548, 22464968, 26489252, 31480652, 37681832, 45115060, 53868456, 63884792, 75139712, 87185504, 99355152, 110921760, 121117896, 129158840, 134480400, 136595408, 135565040, 130704096, @@ -5491,26 +5491,26 @@ const Word32 CLDFB80_16_fx[160] = // q = 30 /* SNR: 89.77, PHASE: 1.500000000000000 */ const Word32 CLDFB80_20_fx[200] = // q = 30 -{ 1767, -5031, -87, -195, 25, 203, --253, -754, -8, 5224, 7568, 3, -160, -101, 462, -84, -114, 1650, --2693, 4754, 4945, -22236, -523, -657, -64, 468, -401, -1020, 719, -9361, -12272, -827, -312, 169, -1088, 201, -406, -7057, 12038, -3892, -327043, -222151, --35479, -70712, -44739, -22286, -4949, 10391, --6975, 55398, 27634, -7373, 3144, -22480, --20585, -25326, -30792, 63870, -118589, -531211, --1262671, -706692, -140674, -191397, -107626, -49945, --20211, 30609, -145958, 302171, -516943, 139837, --27637, 62098, 52143, 58316, 81974, -160536, -375017, 1963205, -2140127, -2009648, -925313, -652848, --36271, 664399, 1339893, 1799274, 1945125, 831664, -1777055, 1828829, 2078398, 2585600, 2993432, 3154609, -3289692, 3034094, 2356141, 1146722, -993260, -1911081, --2021484, -1182252, 157140, 1427332, 2466904, 2979249, -2692828, 2193128, 1283653, -616498, -2589952, -4472528, --6187298, -7776616, -9380603, -11192438, -13438549, -15899665, +{ 1767, -5032, -88, -196, 26, 203, +-254, -755, -8, 5224, 7569, 3, +161, -101, 462, -85, -115, 1651, +-2694, 4755, 4946, -22236, -524, -658, +65, 469, -402, -1021, 719, -9362, +12273, -828, -312, 170, -1089, 201, +407, -7058, 12038, -3893, -327043, -222151, +-35479, -70712, -44739, -22286, -4950, 10391, +-6975, 55398, 27635, -7373, 3144, -22481, +-20586, -25326, -30793, 63871, -118589, -531211, +-1262671, -706692, -140675, -191397, -107627, -49946, +-20212, 30609, -145958, 302172, -516943, 139838, +-27637, 62099, 52144, 58317, 81974, -160536, +375017, 1963206, -2140127, -2009648, -925313, -652848, +-36271, 664400, 1339893, 1799274, 1945125, 831665, +1777056, 1828829, 2078398, 2585601, 2993432, 3154609, +3289693, 3034094, 2356141, 1146722, -993260, -1911082, +-2021484, -1182252, 157141, 1427332, 2466905, 2979250, +2692828, 2193128, 1283653, -616499, -2589952, -4472529, +-6187298, -7776617, -9380603, -11192438, -13438549, -15899665, 18725886, 21392202, 24336266, 27874318, 32044188, 37006492, 42749912, 49318540, 56747120, 64938688, 73960840, 83528888, 93302528, 102923904, 112017456, 120184144, 127010856, 132191136, @@ -5530,35 +5530,35 @@ const Word32 CLDFB80_20_fx[200] = // q = 30 /* SNR: 89.29, PHASE: 0.833333333333333 */ const Word32 CLDFB80_30_fx[300] = // q = 30 -{ -297, 3584, 1941, -855, -2500, -17, -107, -706, 30, 15, 157, 303, -45, -1170, 5206, 7620, -1037, 38, -475, -11, -28, -11, -1944, 58, --3, -1380, -659, 1052, 1837, -2898, --12991, 14726, 8111, -3475, -9095, -22, -265, -1690, 45, -32, -266, 592, -210, 3897, 9064, -12976, -4704, -177, +{ -298, 3584, 1941, -855, -2501, -18, +108, -707, 31, 15, 157, 303, +46, -1170, 5206, 7621, -1038, 39, +476, -11, -29, -11, -1944, 58, +-3, -1380, -660, 1053, 1837, -2898, +-12992, 14727, 8112, -3476, -9096, -22, +265, -1691, 46, -32, -267, 593, +210, 3897, 9064, -12976, -4705, -177, -1102, 419, 158, 60, 4651, -142, --10, 5274, 2753, -4425, -6638, 19638, --341194, -243746, -157895, -76328, -72520, -65718, --49274, -17070, -21325, -4817, 14830, 27865, --1521, -23631, 5019, -51348, -38285, -877, -59535, 18452, -11250, -36821, -20884, -26546, --28596, -6244, -16612, -92408, -281514, -679649, --1089988, -1070487, -687312, -252029, -153328, -178006, --122647, -20195, -41359, -29532, -4337, 53190, --112252, -209847, 617831, -803951, 194011, 106900, --106998, 24972, 64775, 70953, -5105, 66493, -77725, -34468, 24004, 399486, 1151401, 2091330, --1945866, -2164680, -1871141, -1133489, -832327, -560634, --144700, 376719, 793102, 1258629, 1686598, 1843271, -1942367, 1844777, 286874, 1790714, 1697324, 1882734, -2048236, 2356307, 2670961, 2960783, 3037446, 3187787, -3282833, 3248821, 2972460, 2561469, 1779295, 779689, --670109, -1533240, -2023874, -2068453, -1713947, -979306, --79111, 833815, 1606493, 2311180, 2751562, 2948542, -2758276, 2421811, 2144317, 1669907, 284255, -925660, --2240403, -3540922, -4767758, -5909822, -6991555, -8035796, +-11, 5275, 2753, -4425, -6639, 19639, +-341195, -243747, -157895, -76329, -72521, -65719, +-49275, -17071, -21325, -4817, 14831, 27866, +-1522, -23632, 5019, -51348, -38285, -878, +59536, 18452, -11251, -36822, -20885, -26546, +-28596, -6245, -16613, -92408, -281515, -679650, +-1089989, -1070487, -687312, -252030, -153329, -178007, +-122647, -20195, -41359, -29533, -4338, 53191, +-112253, -209848, 617831, -803951, 194011, 106901, +-106999, 24972, 64775, 70954, -5106, 66493, +77725, -34468, 24005, 399486, 1151402, 2091330, +-1945866, -2164680, -1871142, -1133490, -832327, -560635, +-144700, 376720, 793103, 1258629, 1686598, 1843272, +1942367, 1844777, 286874, 1790714, 1697325, 1882734, +2048236, 2356308, 2670961, 2960784, 3037447, 3187788, +3282834, 3248821, 2972461, 2561469, 1779296, 779690, +-670109, -1533240, -2023874, -2068454, -1713947, -979306, +-79112, 833816, 1606493, 2311180, 2751563, 2948543, +2758276, 2421812, 2144318, 1669907, 284255, -925661, +-2240403, -3540922, -4767759, -5909822, -6991555, -8035796, -9103931, -10248264, -11549851, -13052389, -14642952, -16334399, 18220558, 20031906, 21872604, 23814234, 26043234, 28516756, 31295850, 34417552, 37909524, 41736344, 45928496, 50500180, @@ -5567,7 +5567,7 @@ const Word32 CLDFB80_30_fx[300] = // q = 30 125981624, 129823136, 132872256, 135069696, 136344976, 136548112, 135995744, 134601568, 131846392, 127706624, 122059576, 114818808, 105909512, 95304000, 83010216, 69049472, 53433792, 36159948, -17222988, -3371364, -25594396, -49478012, -74987256, -102019216, +17222988, -3371365, -25594396, -49478012, -74987256, -102019216, -130543792, -160511088, -191851984, -224489536, -258343120, -293333280, -329374368, -366360320, -404158112, -442603456, -481533344, -520813312, 560055680, 599091264, 637996480, 676579264, 714631872, 751940864, @@ -5585,37 +5585,37 @@ const Word32 CLDFB80_30_fx[300] = // q = 30 const Word32 CLDFB80_32_fx[320] = // q = 30 { - -1093, 2019, -1499, 75, -3258, -199, -1, 86, -306, -6, -371, -406, -685, 39, -1685, 4713, 6814, -1488, -47, 777, -40, -130, 24, -872, -225, -4, -115, -555, -123, -750, -1333, -5815, -17695, 8208, -6988, 238, --11912, -668, 1, 205, -738, 0, --579, -811, 1616, 569, 3827, 10109, --14334, -4600, -627, -1934, 179, 185, --69, 2086, -538, 14, 407, 1523, -584, 3600, -4501, 26170, -348871, -274412, --191283, -101650, -55022, -71745, -57838, -39469, --16489, -17154, -4617, 1541, 27531, -4837, --24078, -6040, -61575, -45938, -4350, 52992, --21466, -30551, -47623, -16878, -16327, -28525, --30774, 45781, -47860, -103960, -321282, -704887, --1065517, -1123684, -707166, -371532, -86308, -196314, --147629, -95796, -26567, -30200, -12084, -23645, -30175, -133296, -186725, 644643, -823105, 165913, -127128, -77847, 76138, 59764, 84596, 13695, -44920, 72596, 82826, -180229, 163870, 385659, -1272551, 2097219, -1940583, -2216917, -1963534, -1312194, --811283, -684818, -332127, 81208, 566323, 995811, -1374732, 1743252, 1885232, 1944745, 1791356, 230889, -1776037, 1693754, 1848743, 2021967, 2237951, 2554531, -2866857, 3010232, 3111818, 3235821, 3289504, 3179983, -2912034, 2438977, 1724392, 733946, -625865, -1486531, --1958889, -2094027, -1863598, -1255187, -454123, 425746, -1212702, 1901282, 2517749, 2869908, 2908450, 2719155, -2384774, 2140991, 1717492, 398306, -731735, -1939479, --3196994, -4359654, -5453402, -6492968, -7485700, -8462297, + -1093, 2020, -1500, 75, -3259, -200, +2, 86, -307, -6, -372, -406, +686, 39, -1685, 4713, 6814, -1488, +47, 778, -40, -130, 24, -872, +225, -5, -116, -556, -123, -751, +1334, -5815, -17696, 8208, -6989, 239, +-11912, -669, 1, 206, -738, 0, +-579, -811, 1617, 569, 3828, 10109, +-14335, -4601, -628, -1935, 180, 186, +-69, 2086, -538, 14, 408, 1524, +585, 3601, -4502, 26170, -348871, -274413, +-191283, -101650, -55023, -71745, -57839, -39470, +-16489, -17154, -4618, 1542, 27531, -4838, +-24078, -6041, -61576, -45939, -4350, 52992, +-21467, -30551, -47624, -16879, -16327, -28526, +-30774, 45781, -47861, -103961, -321282, -704888, +-1065517, -1123685, -707166, -371532, -86309, -196314, +-147630, -95796, -26567, -30201, -12085, -23646, +30175, -133297, -186726, 644643, -823106, 165914, +127129, -77847, 76139, 59764, 84597, 13696, +44921, 72597, 82827, -180230, 163871, 385660, +1272552, 2097220, -1940583, -2216918, -1963534, -1312195, +-811283, -684818, -332127, 81208, 566324, 995811, +1374732, 1743252, 1885233, 1944746, 1791356, 230889, +1776037, 1693755, 1848743, 2021967, 2237951, 2554532, +2866858, 3010232, 3111818, 3235821, 3289505, 3179984, +2912034, 2438977, 1724392, 733947, -625866, -1486531, +-1958890, -2094028, -1863598, -1255187, -454123, 425746, +1212702, 1901282, 2517750, 2869908, 2908450, 2719155, +2384774, 2140992, 1717492, 398307, -731735, -1939480, +-3196994, -4359654, -5453402, -6492968, -7485701, -8462297, -9485345, -10586349, -11872517, -13293064, -14799378, -16391634, 18159074, 19878216, 21572990, 23372214, 25384474, 27638258, 30127980, 32911950, 36012916, 39421380, 43135868, 47172528, @@ -5624,7 +5624,7 @@ const Word32 CLDFB80_32_fx[320] = // q = 30 118743656, 123354504, 127384760, 130768192, 133428752, 135331936, 136411184, 136532064, 136012736, 134791376, 132367184, 128735088, 123803096, 117494272, 109734136, 100486232, 89749032, 77539936, -63866580, 48743548, 32160198, 14114131, -5387418, -26313940, +63866580, 48743548, 32160198, 14114131, -5387419, -26313940, -48704924, -72531920, -97696000, -124178280, -151940320, -180929216, -211078752, -242327632, -274608448, -307853568, -341987136, -376916512, -412518528, -448658976, -485200704, -522047808, 558838528, 595432000, @@ -5645,45 +5645,45 @@ const Word32 CLDFB80_32_fx[320] = // q = 30 /* SNR: 81.55, PHASE: 0.500000000000000 */ const Word32 CLDFB80_40_fx[400] = // q = 30 { --4459, -418, -3626, 1423, -337, -2077, -302, 18, 81, 158, -711, 8, -12, -288, -781, 598, -25, 260, --439, 2799, 3757, -185, 230, -43, -681, -21, -75, -28, -54, -1949, -416, 55, 15, 232, 886, -479, -680, -2718, -568, -16447, -33103, -1653, --16423, 6274, -1401, -7536, 1255, 81, -201, 378, -1703, -5, -26, -664, --1194, 1294, -17, 118, -11444, 11395, --15922, 16042, 174, 77, -1654, 102, -374, 132, 160, 4663, -995, -137, --67, -969, -4392, 2058, -3082, 11738, --993, 52507, -372469, -339964, -238019, -154668, --91226, -39704, -68193, -63465, -52270, -36720, --12971, -20430, -6924, 7426, -2360, 29241, -919, -11368, 13935, -42083, -90219, 4459, --7455, 294, 60570, -36065, -9835, -23629, --40549, -22838, -11572, -27316, -28142, -21798, -74246, -37442, -94760, -175260, -418504, -781460, --995764, -1274141, -822204, -644197, -320592, -79371, --211045, -170431, -131251, -90675, -8614, -38864, --25805, 10490, -21114, 43834, -93771, -212051, --80066, 687823, -841077, -28318, 196054, 89800, --98757, 81412, 22561, 71309, 76947, -1234, -38817, 69236, 75947, 74312, -220677, 108139, -388007, 614410, 1602908, 2104013, -1945961, -2345233, --2073810, -1788973, -1237041, -801096, -773094, -511060, --205271, 126459, 548962, 854331, 1215259, 1516757, -1754372, 1867886, 1938796, 1938331, 1525725, 104198, -1696967, 1687207, 1745904, 1910501, 2033618, 2194667, -2472077, 2712787, 2937868, 3012595, 3095693, 3204092, -3274807, 3283756, 3148591, 2939051, 2641685, 2031331, -1549502, 597843, -490013, -1328870, -1713435, -2059616, --2084878, -1903964, -1464478, -873102, -195310, 513855, -1135792, 1697317, 2228107, 2629045, 2909610, 2926213, -2785542, 2569873, 2293849, 2134484, 1852516, 752396, --164139, -1082527, -2067571, -3082100, -4010647, -4913512, --5770452, -6592736, -7388101, -8166445, -8966356, -9806266, +-4459, -419, -3627, 1424, -337, -2077, +303, 18, 81, 159, -711, 9, +12, -289, -782, 599, -26, 261, +-439, 2799, 3758, -185, 230, -43, +682, -21, -75, -29, -55, -1950, +416, 56, 16, 233, 887, -479, +680, -2718, -569, -16448, -33103, -1653, +-16424, 6275, -1401, -7536, 1256, 82, +202, 378, -1703, -5, -27, -665, +-1194, 1295, -18, 118, -11445, 11396, +-15922, 16043, 175, 78, -1655, 102, +374, 132, 161, 4663, -995, -137, +-67, -970, -4393, 2058, -3082, 11739, +-993, 52507, -372470, -339964, -238020, -154668, +-91227, -39704, -68193, -63466, -52270, -36721, +-12972, -20431, -6925, 7426, -2361, 29241, +920, -11369, 13936, -42084, -90219, 4460, +-7456, 295, 60570, -36066, -9836, -23630, +-40550, -22839, -11573, -27317, -28142, -21799, +74247, -37443, -94761, -175261, -418504, -781461, +-995765, -1274142, -822204, -644197, -320592, -79371, +-211045, -170432, -131251, -90676, -8615, -38865, +-25806, 10490, -21115, 43834, -93771, -212052, +-80067, 687824, -841077, -28319, 196054, 89800, +-98757, 81413, 22561, 71310, 76947, -1234, +38817, 69237, 75947, 74313, -220677, 108139, +388007, 614410, 1602908, 2104013, -1945962, -2345233, +-2073811, -1788974, -1237042, -801097, -773094, -511061, +-205272, 126459, 548962, 854332, 1215260, 1516757, +1754373, 1867886, 1938796, 1938332, 1525725, 104199, +1696967, 1687208, 1745905, 1910502, 2033618, 2194668, +2472078, 2712787, 2937869, 3012596, 3095693, 3204093, +3274808, 3283756, 3148592, 2939051, 2641685, 2031332, +1549503, 597843, -490013, -1328870, -1713436, -2059616, +-2084878, -1903964, -1464478, -873102, -195311, 513856, +1135793, 1697317, 2228107, 2629045, 2909611, 2926214, +2785543, 2569874, 2293850, 2134485, 1852516, 752397, +-164140, -1082527, -2067571, -3082101, -4010647, -4913513, +-5770452, -6592737, -7388101, -8166445, -8966356, -9806266, -10700961, -11733450, -12861255, -14030459, -15273330, -16566203, 17977196, 19420796, 20683474, 22109952, 23560036, 25167814, 26942868, 28845886, 30930688, 33206692, 35686848, 38368864, @@ -5694,7 +5694,7 @@ const Word32 CLDFB80_40_fx[400] = // q = 30 134844544, 135983552, 136548480, 136476080, 136056288, 135290432, 133727152, 131405624, 128303264, 124356992, 119537688, 113797504, 107116320, 99479544, 90889712, 81356080, 70886368, 59482072, -47150368, 33884192, 19681098, 4546189, -11521655, -28482206, +47150368, 33884192, 19681098, 4546190, -11521655, -28482206, -46395036, -65246120, -84945856, -105504280, -126897840, -149107856, -172107808, -195862240, -220341504, -245510512, -271335616, -297782912, -324814976, -352387008, -380449280, -408931776, -437767552, -466890752, @@ -5717,64 +5717,64 @@ const Word32 CLDFB80_40_fx[400] = // q = 30 /* SNR: 85.15, PHASE: 0.166666666666667 */ const Word32 CLDFB80_60_fx[600] = // q = 30 -{ -11637, 1767, -122, 1627, -5031, -195, -160, -87, -3544, 136, -195, 20, -35, 25, 131, -1128, 203, 11, --29, -253, -96, -286, -754, 688, --55, -8, 214, -1583, 5224, -169, --595, 7568, -1361, 190, 3, -67, -788, 160, -43, -19, -101, -32, --9, 462, -3064, 321, -84, 23, -12, -114, 150, -968, 1650, -22, --258, -2693, -28, 67, 4754, -32802, --51846, 4945, -595, 6085, -22236, -387, -577, -523, -12973, 672, -657, 65, -91, 64, 313, -2699, 468, 12, --68, -401, -518, -689, -1020, 1669, --23, 719, 448, -2322, -9361, 9537, --13566, 12272, 3729, -157, -827, 60, --1977, -312, 206, 461, 169, 83, -40, -1088, 7330, -767, 201, -59, --41, 406, -660, 3231, -7057, 161, -770, 12038, 198, -1291, -3892, 106546, --387363, -327043, -319712, -213952, -222151, -158503, --105318, -35479, -59682, -66732, -70712, -61609, --55170, -44739, -31711, -9899, -22286, -19251, --9917, -4949, 14171, 3110, 10391, 26566, -4085, -6975, -13331, -9891, 55398, -89244, --120821, 27634, -30750, -9362, -7373, 2810, -49557, 3144, -15960, 10651, -22480, -39334, --43080, -20585, -29742, -8097, -25326, -28070, --28127, -30792, -15878, 36413, 63870, -51034, --98422, -118589, -196780, -380752, -531211, -867079, +{ -11638, 1767, -122, 1628, -5032, -196, +161, -88, -3545, 137, -196, 21, +36, 26, 132, -1128, 203, 12, +-29, -254, -97, -286, -755, 689, +-55, -8, 215, -1583, 5224, -169, +-595, 7569, -1361, 190, 3, -67, +788, 161, -43, -20, -101, -32, +-10, 462, -3064, 321, -85, 24, +12, -115, 151, -968, 1651, -22, +-258, -2694, -28, 68, 4755, -32803, +-51846, 4946, -596, 6086, -22236, -388, +578, -524, -12974, 673, -658, 65, +91, 65, 314, -2699, 469, 12, +-69, -402, -518, -689, -1021, 1669, +-23, 719, 449, -2322, -9362, 9537, +-13566, 12273, 3730, -157, -828, 61, +-1978, -312, 206, 462, 170, 84, +41, -1089, 7330, -768, 201, -60, +-41, 407, -660, 3231, -7058, 161, +771, 12038, 198, -1291, -3893, 106546, +-387363, -327043, -319712, -213953, -222151, -158504, +-105319, -35479, -59682, -66733, -70712, -61610, +-55171, -44739, -31711, -9900, -22286, -19252, +-9917, -4950, 14172, 3111, 10391, 26566, +4086, -6975, -13332, -9892, 55398, -89244, +-120822, 27635, -30751, -9363, -7373, 2810, +49557, 3144, -15960, 10651, -22481, -39335, +-43081, -20586, -29742, -8098, -25326, -28071, +-28128, -30793, -15878, 36414, 63871, -51035, +-98423, -118589, -196780, -380753, -531211, -867079, -924260, -1262671, -1211187, -909700, -706692, -590140, --387712, -140674, -90592, -207147, -191397, -163115, --139419, -107626, -77449, 8619, -49945, -36329, --21445, -20211, 13294, -23388, 30609, 24764, --73158, -145958, -228347, -136170, 302171, 622362, --742756, -516943, 79532, 208728, 139837, 68780, --69176, -27637, 72365, 6203, 62098, 78719, -81230, 52143, -15435, 27781, 58316, 71170, -74613, 81974, 55367, -164495, -160536, 180917, -362005, 375017, 795458, 1461875, 1963205, 2095155, --1983049, -2140127, -2301660, -2078197, -2009648, -1702454, --1336745, -925313, -815553, -803612, -652848, -461550, --265137, -36271, 196856, 518313, 664399, 915382, -1166217, 1339893, 1585569, 1738976, 1799274, 1890534, -1933937, 1945125, 1923994, 1665860, 831664, 77564, -1488037, 1777055, 1688417, 1721974, 1828829, 1937199, -2017936, 2078398, 2252451, 2437196, 2585600, 2754364, -2909841, 2993432, 3016599, 3074265, 3154609, 3219375, -3265044, 3289692, 3277126, 3189837, 3034094, 2902601, -2709098, 2356141, 1938985, 1632226, 1146722, 418214, --305018, -993260, -1403823, -1653091, -1911081, -2083225, --2096448, -2021484, -1849083, -1552143, -1182252, -764155, --310624, 157140, 627282, 1032600, 1427332, 1788413, -2142931, 2466904, 2666628, 2856089, 2979249, 2902476, -2810289, 2692828, 2523008, 2330295, 2193128, 2132549, -2001086, 1283653, 592122, -15236, -616498, -1241114, --1897102, -2589952, -3235046, -3852857, -4472528, -5058432, --5630303, -6187298, -6725205, -7257094, -7776616, -8297674, +-387713, -140675, -90592, -207147, -191397, -163116, +-139419, -107627, -77449, 8620, -49946, -36329, +-21446, -20212, 13295, -23389, 30609, 24765, +-73159, -145958, -228347, -136170, 302172, 622362, +-742756, -516943, 79533, 208728, 139838, 68780, +-69177, -27637, 72365, 6204, 62099, 78720, +81230, 52144, -15436, 27781, 58317, 71170, +74613, 81974, 55368, -164496, -160536, 180918, +362005, 375017, 795458, 1461875, 1963206, 2095155, +-1983049, -2140127, -2301661, -2078197, -2009648, -1702455, +-1336746, -925313, -815553, -803613, -652848, -461551, +-265137, -36271, 196856, 518314, 664400, 915382, +1166217, 1339893, 1585569, 1738976, 1799274, 1890535, +1933937, 1945125, 1923994, 1665861, 831665, 77564, +1488037, 1777056, 1688417, 1721975, 1828829, 1937199, +2017937, 2078398, 2252451, 2437196, 2585601, 2754365, +2909842, 2993432, 3016599, 3074266, 3154609, 3219375, +3265044, 3289693, 3277126, 3189837, 3034094, 2902602, +2709099, 2356141, 1938986, 1632226, 1146722, 418214, +-305018, -993260, -1403823, -1653092, -1911082, -2083225, +-2096449, -2021484, -1849083, -1552144, -1182252, -764155, +-310625, 157141, 627282, 1032601, 1427332, 1788414, +2142931, 2466905, 2666629, 2856089, 2979250, 2902477, +2810289, 2692828, 2523008, 2330296, 2193128, 2132550, +2001086, 1283653, 592123, -15236, -616499, -1241115, +-1897102, -2589952, -3235046, -3852858, -4472529, -5058432, +-5630304, -6187298, -6725206, -7257095, -7776617, -8297675, -8829816, -9380603, -9952123, -10548511, -11192438, -11919065, -12671172, -13438549, -14232061, -15062200, -15899665, -16802572, 17739412, 18725886, 19625418, 20458448, 21392202, 22346532, @@ -5791,7 +5791,7 @@ const Word32 CLDFB80_60_fx[600] = // q = 30 128876128, 126439184, 123615464, 120403880, 116783968, 112750168, 108296544, 103416816, 98114136, 92387688, 86239880, 79676032, 72697184, 65299188, 57491652, 49271324, 40633116, 31582262, -22113356, 12229525, 1933214, -8779568, -19893306, -31396530, +22113356, 12229525, 1933215, -8779568, -19893306, -31396530, -43338216, -55715672, -68469528, -81601800, -95119752, -109012544, -123274624, -137902624, -152887216, -168220960, -183892768, -199892672, -216212560, -232841840, -249770272, -266987040, -284483936, -302248800, @@ -5822,14 +5822,14 @@ const Word32 CLDFB80_60_fx[600] = // q = 30 /* 5ms delay prototype */ const Word32 LDQMF_10_fx[] = // q = 30 -{ - 136778, 68195, -70890, -226890, -352352, -420071, --436801, -444542, -506660, -672814, -980067, -1367880, --1747442, -2041058, -2171766, -2084001, -1756845, -1205000, --470032, 391658, -1352314, -2311011, -3225024, -4068759, --4825636, -5483930, -6033974, -6472204, -6808584, -7075060, --7325811, -7636334, -8074046, -8676456, -9424478, -10219283, --10865228, -11073811, -10475044, -8652076, 5180200, -339903, +{ + 136778, 68195, -70890, -226890, -352352, -420072, +-436802, -444543, -506661, -672815, -980068, -1367880, +-1747442, -2041059, -2171766, -2084001, -1756846, -1205000, +-470033, 391658, -1352314, -2311012, -3225024, -4068760, +-4825637, -5483931, -6033975, -6472204, -6808585, -7075060, +-7325812, -7636335, -8074047, -8676456, -9424478, -10219283, +-10865228, -11073811, -10475044, -8652076, 5180201, -339904, -8224782, -18673422, -31726070, -47229416, -64809980, -83846512, -103451368, -122477480, -139540384, -153063904, -161342016, -162639632, -155309920, -137908720, -109304704, -68777832, -16099735, 48410956, @@ -5839,24 +5839,24 @@ const Word32 LDQMF_10_fx[] = // q = 30 -737309056, -653527872, 566225280, 478344672, 392910464, 312395584, 238918544, 174094816, 118926376, 73749168, 38239292, 11438051, -6809585, -17473586, -23179288, -24893300, -23497172, -19904868, --15070633, -9938406, -5364480, -2000461 +-15070633, -9938406, -5364481, -2000462 }; const Word32 LDQMF_16_fx[] = // q = 30 { -135840, 119104, 61025, -23300, -120395, -217571, --303688, -369787, -411985, -431913, -436959, -439365, --455120, -500073, -585815, -716338, -910646, -1146409, --1392576, -1634244, -1852284, -2026745, -2138911, -2173115, --2118583, -1970210, -1728614, -1399459, -992562, -520339, -3268, 562388, -1169899, -1774887, -2369780, -2945925, --3497147, -4018445, -4506031, -4956920, -5368525, -5738269, --6064625, -6347063, -6587229, -6790047, -6964111, -7121373, --7276727, -7449879, -7659373, -7920485, -8244153, -8633965, +135840, 119105, 61025, -23300, -120396, -217572, +-303688, -369787, -411986, -431913, -436960, -439365, +-455121, -500073, -585815, -716339, -910646, -1146410, +-1392576, -1634245, -1852285, -2026746, -2138911, -2173116, +-2118583, -1970211, -1728614, -1399460, -992562, -520340, +3268, 562389, -1169900, -1774888, -2369781, -2945925, +-3497147, -4018445, -4506032, -4956920, -5368526, -5738270, +-6064626, -6347064, -6587229, -6790047, -6964112, -7121373, +-7276728, -7449880, -7659373, -7920485, -8244154, -8633965, -9083566, -9574508, -10074442, -10534940, -10894573, -11076715, --10992408, -10543848, -9627864, -8139160, 5976363, 3037886, --760648, -5491840, -11209240, -17943616, -25700144, -34454400, +-10992408, -10543848, -9627864, -8139161, 5976364, 3037887, +-760649, -5491840, -11209240, -17943616, -25700144, -34454400, -44150032, -54695840, -65964980, -77789648, -89960896, -102229872, -114308392, -125871952, -136561440, -145990880, -153753088, -159424128, -162577504, -162794960, -159676832, -152853360, -141995744, -126825840, @@ -5869,34 +5869,34 @@ const Word32 LDQMF_16_fx[] = // q = 30 -690793664, -637338560, 582754624, 527645440, 472906400, 419190784, 367113152, 317241312, 270082016, 226065808, 185534960, 148735312, 115810224, 86800312, 61646000, 40190228, 22181636, 7245162, --4169366, -12156084, -17964338, -21866804, -24101958, -24886370, +-4169367, -12156084, -17964338, -21866804, -24101958, -24886370, -24433336, -22962478, -20701850, -17885954, -14749119, -11519968, --8412224, -5619924, -3298610, -1524160 +-8412224, -5619924, -3298610, -1524161 }; const Word32 LDQMF_20_fx[] = // q = 30 { -132094, 130053, 94117, 37811, -32618, -110470, --188996, -262715, -325880, -375095, -408842, -427924, --435582, -437285, -440061, -452481, -482692, -537287, --620380, -731564, -887814, -1074239, -1268925, -1466394, --1657422, -1832122, -1980123, -2091723, -2157945, -2171781, --2128229, -2024637, -1860817, -1638684, -1362085, -1036417, --668022, -263993, 167951, 619488, -1109006, -1594302, --2074062, -2544891, -3002258, -3443306, -3865449, -4266665, --4645247, -4999899, -5329217, -5631868, -5906959, -6153951, --6372928, -6565000, -6732690, -6880012, -7012400, -7136776, --7260809, -7394870, -7549042, -7731643, -7949918, -8208793, +132095, 130054, 94118, 37811, -32619, -110471, +-188997, -262715, -325880, -375095, -408842, -427924, +-435582, -437285, -440062, -452482, -482692, -537287, +-620381, -731564, -887814, -1074239, -1268925, -1466394, +-1657422, -1832122, -1980124, -2091724, -2157946, -2171782, +-2128230, -2024638, -1860817, -1638685, -1362085, -1036418, +-668022, -263994, 167952, 619489, -1109006, -1594302, +-2074063, -2544892, -3002259, -3443307, -3865450, -4266665, +-4645248, -4999899, -5329217, -5631869, -5906959, -6153951, +-6372928, -6565001, -6732690, -6880012, -7012401, -7136777, +-7260809, -7394870, -7549043, -7731644, -7949919, -8208793, -8510223, -8852171, -9227619, -9624792, -10025312, -10404401, -10731825, -10971712, -11081824, -11015548, -10722771, -10150872, --9246198, -7954791, 6226193, 4006048, 1251053, -2079213, --6018495, -10592059, -15815707, -21694928, -28223572, -35382820, +-9246198, -7954792, 6226194, 4006049, 1251053, -2079213, +-6018496, -10592059, -15815707, -21694928, -28223572, -35382820, -43140436, -51449560, -60249600, -69462792, -78994976, -88734976, -98555328, -108312432, -117847120, -126986608, -135542896, -143318016, -150106768, -155693424, -159859744, -162387488, -163062224, -161676800, -158034768, -151954128, -143271408, -131843832, -117553208, -100308496, --80048728, -56744644, -30400730, -1056327, 31212950, 66296312, +-80048728, -56744644, -30400730, -1056328, 31212950, 66296312, -104051416, -144280880, -186784688, -231313168, -277585056, -325290400, -374093504, -423635840, -473540064, -523412928, -572850304, -621440576, -668770368, -714429248, -758014656, -799138176, -837430848, -872549376, @@ -5906,38 +5906,38 @@ const Word32 LDQMF_20_fx[] = // q = 30 -757347840, -716859456, -674920448, -631918336, 588261568, 544170240, 500187776, 456655456, 413899520, 372230592, 331939808, 293293792, 256529792, 221851008, 189423392, 159373024, 131783696, 106697088, -84113256, 63991576, 46252108, 30775584, 17400960, 5897691, --3242831, -10003035, -15315395, -19324048, -22161874, -23947232, +84113256, 63991576, 46252108, 30775584, 17400960, 5897692, +-3242832, -10003035, -15315395, -19324048, -22161874, -23947232, -24790774, -24801182, -24088950, -22768174, -20956786, -18774960, --16343248, -13780261, -11200397, -8711802, -6413877, -4393110, --2713517, -1364254 +-16343248, -13780261, -11200397, -8711802, -6413878, -4393110, +-2713518, -1364255 }; const Word32 LDQMF_30_fx[] = // q = 30 { -121571, 136778, 125654, 101703, 68195, 26874, --20212, -70890, -123705, -176137, -226890, -274105, --316252, -352352, -381787, -404296, -420071, -429892, --434876, -436801, -437431, -439162, -444542, -456065, --476087, -506660, -549090, -604537, -672814, -752813, --858037, -980067, -1106184, -1235997, -1367880, -1498944, --1626464, -1747442, -1858910, -1957741, -2041058, -2106142, --2150372, -2171766, -2168618, -2139642, -2084001, -2001494, --1892254, -1756845, -1596235, -1411744, -1205000, -977797, --732072, -470032, -193707, 94398, 391658, 694988, --1028102, -1352314, -1674660, -1994502, -2311011, -2622127, --2927092, -3225024, -3515027, -3796479, -4068759, -4331383, --4583784, -4825636, -5056603, -5276176, -5483930, -5679644, --5863044, -6033974, -6192384, -6338347, -6472204, -6594554, --6706284, -6808584, -6902958, -6991107, -7075060, -7157331, --7239857, -7325811, -7418950, -7521576, -7636334, -7765374, --7910813, -8074046, -8256088, -8457071, -8676456, -8912695, + 121571, 136778, 125655, 101704, 68195, 26875, +-20212, -70890, -123705, -176138, -226890, -274106, +-316253, -352352, -381787, -404297, -420072, -429892, +-434876, -436802, -437431, -439163, -444543, -456066, +-476087, -506661, -549091, -604538, -672815, -752814, +-858037, -980068, -1106184, -1235998, -1367880, -1498945, +-1626464, -1747442, -1858910, -1957741, -2041059, -2106142, +-2150372, -2171766, -2168618, -2139643, -2084001, -2001495, +-1892255, -1756846, -1596236, -1411745, -1205000, -977797, +-732072, -470033, -193708, 94399, 391658, 694989, +-1028102, -1352314, -1674661, -1994503, -2311012, -2622127, +-2927093, -3225024, -3515027, -3796480, -4068760, -4331384, +-4583784, -4825637, -5056603, -5276176, -5483931, -5679645, +-5863044, -6033975, -6192384, -6338348, -6472204, -6594554, +-6706284, -6808585, -6902959, -6991107, -7075060, -7157331, +-7239857, -7325812, -7418951, -7521577, -7636335, -7765375, +-7910813, -8074047, -8256089, -8457071, -8676456, -8912695, -9163169, -9424478, -9691922, -9959316, -10219283, -10463412, -10682245, -10865228, -11000298, -11074417, -11073811, -10983892, --10789539, -10475044, -10024687, -9422374, -8652076, -7698110, -6547449, 5180200, 3585184, 1749124, -339903, -2692689, --5318486, -8224782, -11417230, -14899579, -18673422, -22738288, +-10789539, -10475044, -10024687, -9422374, -8652076, -7698111, +6547450, 5180201, 3585185, 1749124, -339904, -2692689, +-5318487, -8224782, -11417230, -14899579, -18673422, -22738288, -27091010, -31726070, -36635292, -41807760, -47229416, -52884028, -58751904, -64809980, -71032152, -77388632, -83846512, -90369776, -96918936, -103451368, -109921528, -116280640, -122477480, -128458624, @@ -5960,40 +5960,40 @@ const Word32 LDQMF_30_fx[] = // q = 30 420958208, 392910464, 365412224, 338547584, 312395584, 287029856, 262517344, 238918544, 216286160, 194665808, 174094816, 154602160, 136208672, 118926376, 102759984, 87704592, 73749168, 60872400, -49048000, 38239292, 28404982, 19492542, 11438051, 4150852, --1959298, -6809585, -10983833, -14524688, -17473586, -19875174, +49048000, 38239292, 28404982, 19492542, 11438051, 4150853, +-1959299, -6809585, -10983833, -14524688, -17473586, -19875174, -21764768, -23179288, -24150308, -24711158, -24893300, -24729546, -24252922, -23497172, -22497182, -21287720, -19904868, -18383770, -16760795, -15070633, -13348427, -11626766, -9938406, -8313092, --6779951, -5364480, -4088470, -2966834, -2000461, -1134160 +-6779951, -5364481, -4088471, -2966834, -2000462, -1134160 }; const Word32 LDQMF_32_fx[] = // q = 30 { -119696, 137151, 128519, 107723, 78399, 41835, --441, -46740, -95596, -145201, -193804, -240597, --283800, -322315, -355411, -382593, -403699, -418861, +119697, 137151, 128520, 107723, 78400, 41836, +-442, -46740, -95597, -145201, -193804, -240598, +-283800, -322316, -355411, -382593, -403699, -418862, -428699, -434120, -436480, -437237, -438149, -441391, --449044, -463039, -485346, -517325, -560091, -614347, --679871, -755579, -854378, -968457, -1086190, -1207328, --1330798, -1454135, -1575271, -1691703, -1801098, -1900762, --1988262, -2061316, -2117677, -2155275, -2172542, -2168110, --2140952, -2090356, -2016155, -1918413, -1797518, -1654211, --1489464, -1304576, -1100939, -880095, -643754, -393647, --131597, 140302, 419876, 704519, -1017921, -1322020, --1624457, -1924757, -2222508, -2515834, -2804014, -3086295, --3361992, -3630425, -3891163, -4143615, -4387486, -4622276, --4847760, -5063642, -5269495, -5464962, -5649875, -5823970, --5987171, -6139337, -6280536, -6410931, -6530942, -6641149, --6742438, -6835854, -6922708, -7004444, -7082802, -7159902, --7237255, -7317480, -7403833, -7498177, -7602711, -7719257, --7849651, -7995244, -8157012, -8335468, -8530447, -8741283, +-449045, -463039, -485346, -517326, -560092, -614348, +-679872, -755580, -854379, -968457, -1086190, -1207329, +-1330799, -1454135, -1575271, -1691704, -1801098, -1900763, +-1988263, -2061316, -2117677, -2155275, -2172543, -2168111, +-2140952, -2090356, -2016155, -1918414, -1797519, -1654212, +-1489464, -1304576, -1100939, -880095, -643755, -393648, +-131597, 140303, 419876, 704520, -1017921, -1322020, +-1624457, -1924758, -2222508, -2515835, -2804014, -3086295, +-3361992, -3630425, -3891163, -4143616, -4387487, -4622276, +-4847761, -5063642, -5269495, -5464963, -5649876, -5823971, +-5987172, -6139337, -6280537, -6410931, -6530943, -6641149, +-6742439, -6835855, -6922708, -7004445, -7082802, -7159902, +-7237256, -7317480, -7403834, -7498178, -7602711, -7719257, +-7849652, -7995245, -8157013, -8335469, -8530447, -8741283, -8966383, -9203373, -9449370, -9700315, -9951033, -10195449, -10426707, -10637019, -10818085, -10960053, -11052529, -11084311, -11043675, -10918394, -10695736, -10362793, -9906464, -9313511, --8570674, -7665161, 6586646, 5317833, 3849978, 2171971, -273875, -1853534, -4218327, -6827111, -9685347, -12796811, +-8570674, -7665161, 6586647, 5317833, 3849979, 2171972, +273875, -1853535, -4218327, -6827112, -9685347, -12796811, -16163952, -19787344, -23665996, -27796800, -32174812, -36793016, -41642268, -46710992, -51985904, -57451192, -63088408, -68876552, -74792144, -80808992, -86898528, -93029584, -99168576, -105279432, @@ -6019,45 +6019,45 @@ const Word32 LDQMF_32_fx[] = // q = 30 236754960, 215594992, 195325728, 175977920, 157575920, 140137536, 123674336, 108191456, 93687496, 80154992, 67580128, 55943780, 45219876, 35377480, 26377892, 18179138, 10724362, 3937154, --1793746, -6383128, -10375463, -13802420, -16701194, -19108980, +-1793747, -6383129, -10375463, -13802420, -16701194, -19108980, -21056298, -22573612, -23687536, -24425978, -24814642, -24880884, -24650790, -24152456, -23413234, -22462376, -21328340, -20040900, -18629038, -17122794, -15550818, -13942058, -12323783, -10723672, --9166937, -7678114, -6278687, -4990172, -3829056, -2807490, --1918387, -1103400 +-9166937, -7678115, -6278687, -4990172, -3829056, -2807491, +-1918388, -1103400 }; const Word32 LDQMF_40_fx[] = // q = 30 { -113205, 137253, 134424, 123146, 105210, 81666, -53560, 21301, -14069, -51498, -90644, -130324, --169687, -208132, -245092, -279677, -311295, -339564, +113206, 137254, 134425, 123146, 105211, 81666, +53560, 21302, -14069, -51499, -90644, -130324, +-169687, -208133, -245093, -279677, -311296, -339564, -364227, -384972, -401866, -414904, -424383, -430758, --434461, -436342, -437085, -437525, -438797, -441921, --448028, -458055, -473038, -493888, -521095, -555299, --596905, -645667, -701530, -764070, -843494, -933719, --1026834, -1122238, -1219597, -1318430, -1417239, -1515132, --1610824, -1702996, -1790556, -1872014, -1946187, -2011805, --2067737, -2112858, -2146050, -2166538, -2173557, -2166437, --2144725, -2108000, -2056210, -1989294, -1907357, -1810627, --1699503, -1574446, -1436053, -1285027, -1122102, -948052, --763729, -570120, -367947, -158283, 57836, 279329, +-434462, -436342, -437086, -437526, -438798, -441921, +-448029, -458055, -473038, -493889, -521096, -555299, +-596905, -645667, -701531, -764070, -843495, -933719, +-1026835, -1122239, -1219597, -1318430, -1417239, -1515133, +-1610824, -1702996, -1790556, -1872015, -1946188, -2011806, +-2067738, -2112859, -2146050, -2166539, -2173557, -2166437, +-2144725, -2108000, -2056211, -1989295, -1907357, -1810628, +-1699503, -1574446, -1436054, -1285028, -1122103, -948052, +-763730, -570121, -367947, -158284, 57837, 279329, 505114, 733496, -987128, -1230885, -1473412, -1714779, --1954662, -2192913, -2428355, -2660606, -2889345, -3114178, --3334741, -3550687, -3761781, -3967792, -4168400, -4363502, --4552805, -4736194, -4913551, -5084693, -5249383, -5407420, --5558752, -5703240, -5840789, -5971350, -6094838, -6211307, --6320773, -6423390, -6519395, -6609078, -6692852, -6771221, --6844809, -6914280, -6980362, -7043920, -7105964, -7167615, --7229469, -7292853, -7359780, -7431208, -7508135, -7591745, --7682926, -7782628, -7891679, -8010673, -8140087, -8280181, +-1954662, -2192913, -2428356, -2660607, -2889345, -3114179, +-3334742, -3550687, -3761781, -3967793, -4168400, -4363503, +-4552806, -4736194, -4913551, -5084693, -5249383, -5407420, +-5558753, -5703241, -5840790, -5971350, -6094838, -6211308, +-6320774, -6423390, -6519396, -6609079, -6692852, -6771222, +-6844809, -6914280, -6980363, -7043921, -7105964, -7167616, +-7229469, -7292854, -7359781, -7431209, -7508135, -7591745, +-7682927, -7782628, -7891680, -8010673, -8140087, -8280182, -8430924, -8592083, -8763179, -8943293, -9131195, -9325472, -9524332, -9725493, -9926142, -10123188, -10313198, -10492333, -10656603, -10801577, -10922158, -11013175, -11068951, -11083709, -11051345, -10965628, -10820070, -10607987, -10322919, -9958035, --9506509, -8961670, -8316717, -7565183, 6702942, 5718827, -4609516, 3369112, 1992224, 473872, -1190731, -3005819, +-9506509, -8961670, -8316717, -7565184, 6702942, 5718827, +4609517, 3369113, 1992225, 473872, -1190731, -3005819, -4975066, -7101637, -9388180, -11836610, -14448347, -17224060, -20163764, -23266722, -26531342, -29955288, -33535422, -37267720, -41147260, -45168140, -49323552, -53606284, -58007508, -62517548, @@ -6069,7 +6069,7 @@ const Word32 LDQMF_40_fx[] = // q = 30 -159167008, -156749920, -153712208, -150033328, -145694224, -140676912, -134964928, -128543672, -121399776, -113521832, -104900488, -95527920, -85398544, -74508560, -62856444, -50442808, -37270156, -23343566, --8670189, 6740501, 22876916, 39724980, 57268860, 75490816, +-8670189, 6740502, 22876916, 39724980, 57268860, 75490816, -94376496, -113883272, -134001320, -154702832, -175958544, -197737504, -220006032, -242729312, -265870144, -289389664, -313247648, -337401888, -361809024, -386424256, -411201216, -436093120, -461051360, -486026816, @@ -6089,61 +6089,62 @@ const Word32 LDQMF_40_fx[] = // q = 30 265532592, 247657504, 230315568, 213527440, 197311648, 181683920, 166657488, 152242496, 138447232, 125276624, 112733328, 100817520, 89526080, 78854768, 68795096, 59337532, 50469688, 42175888, -34440516, 27241264, 20558124, 14361678, 8619497, 3303076, +34440516, 27241264, 20558124, 14361678, 8619497, 3303077, -1288525, -5070930, -8454926, -11459781, -14115485, -16433949, -18436136, -20138626, -21555150, -22702724, -23593500, -24242222, -24662498, -24867088, -24870766, -24686354, -24328404, -23811232, -23148884, -22356736, -21449164, -20441404, -19348716, -18185774, -16968062, -15710186, -14426756, -13132428, -11840736, -10565599, --9320040, -8115961, -6965903, -5879984, -4867949, -3939392, --3097321, -2346408, -1680051, -1007770 +-9320040, -8115962, -6965903, -5879984, -4867950, -3939393, +-3097321, -2346408, -1680052, -1007771 }; const Word32 LDQMF_60_fx[] = // q = 30 -{ 102335, 132094, 137435, 135348, 130053, 120487, -108540, 94117, 77296, 58569, 37811, 15642, --7974, -32618, -57896, -84046, -110470, -136942, --163210, -188996, -214437, -239090, -262715, -285164, --306246, -325880, -343923, -360378, -375095, -388053, --399325, -408842, -416724, -423037, -427924, -431547, --433999, -435582, -436522, -437004, -437285, -437643, --438481, -440061, -442702, -446766, -452481, -460181, --470154, -482692, -497967, -516093, -537287, -561714, --589463, -620380, -654511, -691824, -731564, -775910, --829205, -887814, -949147, -1011178, -1074239, -1138340, --1203245, -1268925, -1334920, -1400801, -1466394, -1531259, --1595081, -1657422, -1717943, -1776349, -1832122, -1884920, --1934396, -1980123, -2021834, -2059138, -2091723, -2119241, --2141377, -2157945, -2168655, -2173352, -2171781, -2163852, --2149388, -2128229, -2100421, -2065895, -2024637, -1976676, --1922047, -1860817, -1793098, -1719007, -1638684, -1552285, --1460012, -1362085, -1258675, -1150049, -1036417, -918024, --795131, -668022, -536993, -402188, -263993, -122679, -21420, 167951, 316689, 467104, 619488, 773429, --945238, -1109006, -1271451, -1433049, -1594302, -1754861, --1914784, -2074062, -2232362, -2389327, -2544891, -2698989, --2851488, -3002258, -3151251, -3298295, -3443306, -3586211, --3726943, -3865449, -4001599, -4135335, -4266665, -4395461, --4521664, -4645247, -4766175, -4884419, -4999899, -5112604, --5222403, -5329217, -5433113, -5533999, -5631868, -5726641, +{ + 102336, 132095, 137435, 135349, 130054, 120487, +108540, 94118, 77297, 58570, 37811, 15643, +-7974, -32619, -57897, -84046, -110471, -136942, +-163210, -188997, -214438, -239091, -262715, -285164, +-306247, -325880, -343923, -360378, -375095, -388054, +-399325, -408842, -416725, -423037, -427924, -431547, +-434000, -435582, -436522, -437005, -437285, -437644, +-438481, -440062, -442703, -446767, -452482, -460182, +-470154, -482692, -497967, -516093, -537287, -561715, +-589463, -620381, -654511, -691825, -731564, -775911, +-829205, -887814, -949148, -1011179, -1074239, -1138341, +-1203246, -1268925, -1334921, -1400802, -1466394, -1531260, +-1595082, -1657422, -1717943, -1776350, -1832122, -1884921, +-1934396, -1980124, -2021834, -2059138, -2091724, -2119241, +-2141378, -2157946, -2168655, -2173353, -2171782, -2163852, +-2149388, -2128230, -2100421, -2065896, -2024638, -1976676, +-1922048, -1860817, -1793099, -1719008, -1638685, -1552286, +-1460012, -1362085, -1258676, -1150050, -1036418, -918024, +-795131, -668022, -536993, -402188, -263994, -122679, +21420, 167952, 316690, 467104, 619489, 773430, +-945239, -1109006, -1271451, -1433050, -1594302, -1754861, +-1914784, -2074063, -2232363, -2389328, -2544892, -2698989, +-2851488, -3002259, -3151251, -3298296, -3443307, -3586211, +-3726943, -3865450, -4001599, -4135335, -4266665, -4395461, +-4521664, -4645248, -4766175, -4884420, -4999899, -5112604, +-5222404, -5329217, -5433113, -5533999, -5631869, -5726641, -5818340, -5906959, -5992421, -6074745, -6153951, -6230036, --6303010, -6372928, -6439842, -6503844, -6565000, -6623434, --6679269, -6732690, -6783803, -6832855, -6880012, -6925505, --6969547, -7012400, -7054335, -7095679, -7136776, -7177903, --7219119, -7260809, -7303731, -7348340, -7394870, -7443617, --7494881, -7549042, -7606393, -7667166, -7731643, -7800141, --7872826, -7949918, -8031500, -8117778, -8208793, -8304569, +-6303010, -6372928, -6439843, -6503845, -6565001, -6623435, +-6679269, -6732690, -6783804, -6832855, -6880012, -6925506, +-6969547, -7012401, -7054336, -7095680, -7136777, -7177903, +-7219120, -7260809, -7303731, -7348340, -7394870, -7443617, +-7494881, -7549043, -7606393, -7667166, -7731644, -7800142, +-7872827, -7949919, -8031501, -8117779, -8208793, -8304570, -8405066, -8510223, -8619935, -8734017, -8852171, -8974106, -9099397, -9227619, -9358364, -9490965, -9624792, -9759051, -9892867, -10025312, -10155439, -10282162, -10404401, -10520844, -10630426, -10731825, -10823502, -10903968, -10971712, -11025073, -11062346, -11081824, -11081759, -11060277, -11015548, -10945697, -10848751, -10722771, -10565739, -10375810, -10150872, -9888970, --9588053, -9246198, -8861297, -8431401, -7954791, -7429283, -6854949, 6226193, 5542799, 4803353, 4006048, 3149248, -2231398, 1251053, 206699, -902968, -2079213, -3323232, --4636016, -6018495, -7471561, -8995894, -10592059, -12260527, +-9588053, -9246198, -8861297, -8431401, -7954792, -7429283, +6854949, 6226194, 5542800, 4803353, 4006049, 3149248, +2231398, 1251053, 206700, -902968, -2079213, -3323232, +-4636016, -6018496, -7471561, -8995894, -10592059, -12260527, -14001671, -15815707, -17702624, -19662438, -21694928, -23799650, -25976100, -28223572, -30541232, -32928052, -35382820, -37904240, -40490688, -43140436, -45851544, -48621904, -51449560, -54331840, @@ -6159,7 +6160,7 @@ const Word32 LDQMF_60_fx[] = // q = 30 -146464032, -143271408, -139773568, -135965808, -131843832, -127403488, -122641048, -117553208, -112136840, -106389392, -100308496, -93892368, -87139520, -80048728, -72619504, -64851416, -56744644, -48299972, --39518100, -30400730, -20949652, -11167261, -1056327, 9379870, +-39518100, -30400730, -20949652, -11167261, -1056328, 9379870, 20137698, 31212950, 42601076, 54297248, 66296312, 78593112, -91185600, -104051416, -117194704, -130607064, -144280880, -158207776, -172378736, -186784688, -201415824, -216262032, -231313168, -246558128, @@ -6190,8 +6191,8 @@ const Word32 LDQMF_60_fx[] = // q = 30 140703152, 131783696, 123142424, 114780232, 106697088, 98892400, 91364808, 84113256, 77135992, 70429688, 63991576, 57819020, 51907328, 46252108, 40848248, 35691672, 30775584, 26091894, -21637068, 17400960, 13374445, 9548629, 5897691, 2475271, --592184, -3242831, -5659969, -7917455, -10003035, -11926348, +21637068, 17400960, 13374445, 9548629, 5897692, 2475272, +-592184, -3242832, -5659970, -7917455, -10003035, -11926348, -13696880, -15315395, -16789184, -18123694, -19324048, -20394110, -21338122, -22161874, -22868630, -23462238, -23947232, -24327810, -24607834, -24790774, -24881324, -24883598, -24801182, -24638338, @@ -6199,10 +6200,9 @@ const Word32 LDQMF_60_fx[] = // q = 30 -21607820, -20956786, -20264828, -19536176, -18774960, -17986262, -17174228, -16343248, -15497611, -14641749, -13780261, -12916498, -12055168, -11200397, -10355588, -9525147, -8711802, -7920384, --7153631, -6413877, -5706098, -5031208, -4393110, -3792571, --3230785, -2713517, -2227976, -1784735, -1364254, -871386 +-7153632, -6413878, -5706099, -5031208, -4393110, -3792571, +-3230785, -2713518, -2227977, -1784736, -1364255, -871387 }; - #endif /* OPT_IVAS_FILTER_ROM */ const Word32 rot_vec_delay_re_LDQMF_fx[60] = // q = 31 -- GitLab From edf16d3595f305d00d4c2a70b2ae48b4f2b7ed93 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 16:15:17 +0530 Subject: [PATCH 0616/1310] Fix for 3GPP issue 1533: Slightly high MLD for one case of MASA LTV EXT output in BASOP decoder Link #1533 --- lib_dec/ivas_stereo_cng_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 6b8a8f949..8ec147ff7 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -1368,8 +1368,8 @@ static void FindEmEs_fx( temp_q = 0; move16(); } - log_res = BASOP_Util_Log2( square_res ); - es_em_fx = Mpy_32_32( log_res, 1616107501 ); // 25+30-31 + log_res = L_add( BASOP_Util_Log2( square_res ), L_shl( temp_q, Q25 ) ); + es_em_fx = Mpy_32_32( log_res, 1616107501 /* 5 * (ln(2)/ln(10)) */ ); // 25+30-31 /* long-term estimate */ *lt_es_em_fx = L_add( Mpy_32_32( 858993459, *lt_es_em_fx ), Mpy_32_32( 1288490188, es_em_fx ) ); /* Q24 */ move32(); -- GitLab From fefa52c6b7a9fbfa267a18ad8b031900930c3f4c Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 May 2025 12:21:52 +0200 Subject: [PATCH 0617/1310] port float MR !1357 --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec_fx.c | 4 ++++ lib_dec/ivas_osba_dec_fx.c | 15 ++++++++++++++- lib_rend/ivas_output_init.c | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 25c48c3c5..2e8fa8802 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -121,6 +121,7 @@ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ +#define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 246befb84..fa0a1e630 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1877,7 +1877,11 @@ ivas_error ivas_jbm_dec_render_fx( { FOR( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) { +#ifdef NONBE_FIX_979_OSBA_STEREO_5MS + p_tc_fx[n] = &p_output_fx[n][st_ivas->hTcBuffer->n_samples_rendered]; +#else p_tc_fx[n] = p_output_fx[n]; +#endif } FOR( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c index c96a91d58..8445d96a3 100644 --- a/lib_dec/ivas_osba_dec_fx.c +++ b/lib_dec/ivas_osba_dec_fx.c @@ -297,10 +297,23 @@ ivas_error ivas_osba_render_sf_fx( p_output_ism[n] = &output_ism[n][0]; } - FOR( n = 0; n < st_ivas->nchan_ism; n++ ) +#ifdef NONBE_FIX_979_OSBA_STEREO_5MS + if ( !st_ivas->hDecoderConfig->Opt_tsm ) { + int16_t tc_offset; + tc_offset = st_ivas->hTcBuffer->n_samples_rendered; +#endif + for ( n = 0; n < st_ivas->nchan_ism; n++ ) + { +#ifdef NONBE_FIX_979_OSBA_STEREO_5MS + v_shr( &p_output[n][tc_offset], Q11 - Q11, &output_ism[n][tc_offset], nSamplesAsked ); // Q11 +#else v_shr( p_output[n], Q11 - Q11, output_ism[n], nSamplesAsked ); // Q11 +#endif + } +#ifdef NONBE_FIX_979_OSBA_STEREO_5MS } +#endif IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output ) ), IVAS_ERR_OK ) ) { diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index c5271d065..ed51fbdd2 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -386,6 +386,12 @@ Word16 ivas_get_nchan_buffers_dec( { nchan_out_buff = shl( CPE_CHANNELS, 1 ); } +#ifdef NONBE_FIX_979_OSBA_STEREO_5MS + else if ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( shl( BINAURAL_CHANNELS, 1 ), 2 ) ); + } +#endif ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); -- GitLab From f697ed7d50ad46cbf0f0957fcf9c12d10e00ed2f Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 May 2025 15:08:10 +0200 Subject: [PATCH 0618/1310] port float MR !1364 --- lib_com/options.h | 1 + lib_dec/ivas_ism_param_dec_fx.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2e8fa8802..f7e1e062a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,6 +122,7 @@ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ +#define FIX_983_DISC_ISM_DIGEST_NUM_OBJS /* FhG: issue #983: the discrete ISM digest function uses the wrong number of objects */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index d7ec5b6e7..8af9b8cec 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -939,7 +939,11 @@ void ivas_ism_dec_digest_tc_fx( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) { - Word16 i, num_objects; +#ifdef FIX_983_DISC_ISM_DIGEST_NUM_OBJS + int16_t i; +#else + int16_t i, num_objects; +#endif Word32 azimuth_fx, elevation_fx; /* we have a full frame interpolator, adapt it */ @@ -981,9 +985,14 @@ void ivas_ism_dec_digest_tc_fx( } /* also get the gains here */ +#ifdef FIX_983_DISC_ISM_DIGEST_NUM_OBJS + FOR ( i = 0; i < st_ivas->nchan_ism; i++ ) +#else num_objects = st_ivas->nchan_transport; move16(); - FOR( i = 0; i < num_objects; i++ ) + FOR ( i = 0; i < num_objects; i++ ) +#endif + FOR( i = 0; i < num_objects; i++ ) { Copy32( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); -- GitLab From 10846450a3c531c5002be4cf5eeb0ea61eabdde9 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 16 May 2025 15:22:29 +0200 Subject: [PATCH 0619/1310] port float MR 1318 to main-pc --- lib_com/ivas_prot_fx.h | 10 ++--- lib_com/options.h | 1 + lib_dec/fd_cng_dec_fx.c | 38 ++++++++++++++++++- lib_dec/ivas_dirac_dec_fx.c | 8 ++++ lib_dec/ivas_sba_dec_fx.c | 4 ++ .../ivas_dirac_dec_binaural_functions_fx.c | 16 ++++++++ lib_rend/lib_rend.c | 2 + 7 files changed, 70 insertions(+), 9 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 6c9166111..1d593881a 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4999,13 +4999,9 @@ void generate_masking_noise_lb_dirac_fx( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered */ - const Word16 cna_flag /* i : CNA flag for LB and HB */ -); - -void generate_masking_noise_lb_dirac_fx( - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ - const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered */ +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i : common spatial rendering parameters handle */ +#endif const Word16 cna_flag /* i : CNA flag for LB and HB */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 25c48c3c5..5e6b03299 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -121,6 +121,7 @@ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ +#define NONBE_FIX_951_MCMASA_5MS_RENDERING /* Nokia: issue #951: Differences for 5ms and 20ms rendering for McMASA at 13.2 kbps to BINAURAL */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 4c42a7959..6d73aa28c 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -5447,7 +5447,10 @@ void generate_masking_noise_lb_dirac_fx( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA Q11*/ const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered Q0*/ - const Word16 cna_flag /* i : CNA flag for LB and HB Q0*/ +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i : common spatial rendering parameters handle */ +#endif + const Word16 cna_flag /* i : CNA flag for LB and HB Q0*/ ) { Word16 i; @@ -5465,7 +5468,7 @@ void generate_masking_noise_lb_dirac_fx( /* Init */ scale = 0; move32(); - n_samples_out = i_mult( shr( hFdCngCom->frameSize, 4 ), nCldfbTs ); + n_samples_out = i_mult( shr( hFdCngCom->frameSize, 4 /* DEFAULT_JBM_CLDFB_TIMESLOTS */ ), nCldfbTs ); n_samples_start = 0; move16(); Word16 exp_out = Q11; @@ -5498,6 +5501,13 @@ void generate_masking_noise_lb_dirac_fx( test(); IF( cna_flag && tdBuffer != NULL ) { +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + Word16 cur_subframe; + Word16 cur_subframe_start_outfs; + Word16 cur_subframe_start_cngfs; + Word16 slot_size_cng; +#endif + WHILE( n_samples_out > 0 ) { n_samples_out_loop = s_min( hFdCngCom->frameSize, n_samples_out ); @@ -5569,6 +5579,30 @@ void generate_masking_noise_lb_dirac_fx( n_samples_out = sub( n_samples_out, hFdCngCom->frameSize ); n_samples_start = add( n_samples_start, hFdCngCom->frameSize ); } + +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + /* move generated noise to the 5ms subframe starts in the tc buffer according to the output sampling frequency to avoid + overwriting it with the synthesis in case of shared tc and synth channel memory, i.e. non-TSM mode */ + slot_size_cng = shr( hFdCngCom->frameSize, 4 /* DEFAULT_JBM_CLDFB_TIMESLOTS */ ); + /* move start indices forward to the end of the last subframe */ + cur_subframe_start_outfs = mult( nCldfbTs, hSpatParamRendCom->slot_size ); + cur_subframe_start_cngfs = mult( nCldfbTs, slot_size_cng ); + + /* go from the last subframe back and move the LB noise */ + FOR( cur_subframe = sub( hSpatParamRendCom->nb_subframes, 1 ); cur_subframe >= 0; cur_subframe-- ) + { + Word16 move_size, subframe_size_outfs; + move_size = mult( slot_size_cng, hSpatParamRendCom->subframe_nbslots[cur_subframe] ); + subframe_size_outfs = mult( hSpatParamRendCom->subframe_nbslots[cur_subframe], hSpatParamRendCom->slot_size ); + cur_subframe_start_outfs = sub( cur_subframe_start_outfs, mult( hSpatParamRendCom->subframe_nbslots[cur_subframe], hSpatParamRendCom->slot_size ) ); + cur_subframe_start_cngfs = sub( cur_subframe_start_cngfs, mult( hSpatParamRendCom->subframe_nbslots[cur_subframe], slot_size_cng ) ); + /* move cna */ + Copy32( tdBuffer + cur_subframe_start_cngfs, tdBuffer + cur_subframe_start_outfs, move_size ); + + /* set everything else to zero */ + set_zero_fx( tdBuffer + cur_subframe_start_outfs + move_size, sub( subframe_size_outfs, move_size ) ); + } +#endif } pop_wmops(); diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 44a024e54..feca814c8 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2871,10 +2871,18 @@ void ivas_dirac_dec_render_sf_fx( test(); generate_masking_noise_dirac_ivas_fx( st->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + &st_ivas->hTcBuffer->tc_fx[1][hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->slots_rendered], +#else st_ivas->hTcBuffer->tc_fx[1], +#endif Cldfb_RealBuffer_fx[1][0], Cldfb_ImagBuffer_fx[1][0], +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + slot_idx, +#else index_slot, +#endif st->cna_dirac_flag && st->flag_cna, ( ( ( st->core_brate == FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) ) && EQ_16( st->cng_type, FD_CNG ) && st->cng_sba_flag, Q_input, &q_temp_cldfb ); Scale_sig32( Cldfb_RealBuffer_fx[1][0], CLDFB_NO_CHANNELS_MAX, sub( Q6, q_temp_cldfb ) ); // Q6 diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index b5d494eae..cc78652e6 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -894,7 +894,11 @@ void ivas_sba_dec_digest_tc_fx( Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ), 2 ) ); /*Q12 -> Q13*/ +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + generate_masking_noise_lb_dirac_fx( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st_ivas->hSpatParamRendCom, st->cna_dirac_flag && st->flag_cna ); +#else generate_masking_noise_lb_dirac_fx( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); +#endif } return; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 32bcb732e..408f1cb1b 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -830,17 +830,29 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { Word16 numCoreBands, b; +#ifndef NONBE_FIX_951_MCMASA_5MS_RENDERING Word16 slotInFrame; +#endif numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; move16(); +#ifndef NONBE_FIX_951_MCMASA_5MS_RENDERING slotInFrame = add( hSpatParamRendCom->slots_rendered, slot ); +#endif generate_masking_noise_dirac_ivas_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + &st_ivas->hTcBuffer->tc_fx[nchan_transport][hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->slots_rendered], +#else st_ivas->hTcBuffer->tc_fx[nchan_transport], +#endif Cldfb_RealBuffer_in_fx[2][slot], Cldfb_ImagBuffer_in_fx[2][slot], +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + slot, +#else slotInFrame, +#endif st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, 11, &q_cldfb[2][slot] ); @@ -849,7 +861,11 @@ static void ivas_dirac_dec_binaural_internal_fx( st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ NULL, Cldfb_RealBuffer_in_fx[1][slot], Cldfb_ImagBuffer_in_fx[1][slot], +#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING + slot, +#else slotInFrame, +#endif st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, 0, &q_cldfb[1][slot] ); diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 4b4d5c456..c3be6c73b 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -525,6 +525,7 @@ static void accumulate2dArrayToBuffer_fx( * In-place saturation control for multichannel buffers with adaptive release time *-------------------------------------------------------------------*/ +#ifndef DISABLE_LIMITER /*! r: number of clipped output samples */ static Word32 limitRendererOutput_fx( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ @@ -568,6 +569,7 @@ static Word32 limitRendererOutput_fx( return numClipping; } +#endif /*-------------------------------------------------------------------* * validateOutputAudioConfig() -- GitLab From 7e900aab167a3fae3c04afe2dce83068b804a76b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 May 2025 16:10:14 +0200 Subject: [PATCH 0620/1310] fix formatting --- lib_dec/ivas_ism_param_dec_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index 8af9b8cec..a192625fa 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -986,13 +986,13 @@ void ivas_ism_dec_digest_tc_fx( /* also get the gains here */ #ifdef FIX_983_DISC_ISM_DIGEST_NUM_OBJS - FOR ( i = 0; i < st_ivas->nchan_ism; i++ ) + FOR( i = 0; i < st_ivas->nchan_ism; i++ ) #else num_objects = st_ivas->nchan_transport; move16(); - FOR ( i = 0; i < num_objects; i++ ) + FOR( i = 0; i < num_objects; i++ ) #endif - FOR( i = 0; i < num_objects; i++ ) + FOR( i = 0; i < num_objects; i++ ) { Copy32( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); -- GitLab From e80a50ee2068a6262882ec0af8a9ed6cc8e4e470 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 16 May 2025 16:25:47 +0200 Subject: [PATCH 0621/1310] fix compile error --- lib_dec/ivas_ism_param_dec_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index a192625fa..1485c09c1 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -992,7 +992,6 @@ void ivas_ism_dec_digest_tc_fx( move16(); FOR( i = 0; i < num_objects; i++ ) #endif - FOR( i = 0; i < num_objects; i++ ) { Copy32( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); -- GitLab From 74a6561c0a271bc16fef1ad997c70111b4edcc4a Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Fri, 16 May 2025 17:43:40 +0200 Subject: [PATCH 0622/1310] Aligned on branch 947-issues_with_stereo_dmx_evs. --- lib_com/options.h | 12 +- lib_enc/ivas_rom_enc.h | 6 + lib_enc/ivas_rom_enc_fx.c | 66 +++++++++- lib_enc/ivas_stereo_dmx_evs_fx.c | 200 +++++++++++++++++++++++++++++-- 4 files changed, 272 insertions(+), 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 25c48c3c5..dbffb4547 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,8 +119,16 @@ #endif -#define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ -#define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ +#define BE_FIX_567_DOUBLE_STEREO_DMX /* NTT: Fix formal issues */ +#define NONBE_FIX_567_DOUBLE_STEREO_DMX /* Orange: Double-precision replaced by single-precision */ +#define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC +#define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ +#endif +#define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA +#define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ +#endif /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 27fa27463..bc62b251a 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -112,9 +112,15 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC +#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT +extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2]; +extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2]; +extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 2]; +#else extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1]; extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1]; +#endif #else extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4]; diff --git a/lib_enc/ivas_rom_enc_fx.c b/lib_enc/ivas_rom_enc_fx.c index 9b1b4dd23..520dbe928 100644 --- a/lib_enc/ivas_rom_enc_fx.c +++ b/lib_enc/ivas_rom_enc_fx.c @@ -509,7 +509,67 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ - #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + +#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT +// Q31 + const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2] = { + 204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, + 24639688, 29301856, 34361688, 39817260, 45666492, 51907160, 58536884, 65553148, 72953272, 80734440, + 88893688, 97427912, 106333872, 115608160, 125247248, 135247472, 145605040, 156315968, 167376224, 178781552, + 190527648, 202610016, 215024064, 227765072, 240828160, 254208400, 267900656, 281899744, 296200320, 310796928, + 325684032, 340855968, 356306944, 372031072, 388022368, 404274752, 420782016, 437537920, 454536032, 471769920, + 489232992, 506918624, 524820096, 542930496, 561243072, 579750720, 598446528, 617323264, 636373760, 655590784, + 674967040, 694495104, 714167552, 733976960, 753915712, 773976192, 794150848, 814431936, 834811776, 855282624, + 875836544, 896465920, 917162752, 937919168, 958727360, 979579264, 1000467072, 1021382784, 1042318400, 1063266048 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2] = { + 51423, 205686, 462776, 822667, 1285325, 1850705, 2518754, 3289407, 4162591, 5138222, + 6216206, 7396441, 8678813, 10063200, 11549468, 13137475, 14827070, 16618091, 18510366, 20503712, + 22597942, 24792852, 27088232, 29483864, 31979518, 34574956, 37269924, 40064172, 42957428, 45949412, + 49039844, 52228420, 55514844, 58898792, 62379948, 65957972, 69632528, 73403256, 77269800, 81231792, + 85288840, 89440576, 93686584, 98026464, 102459800, 106986176, 111605144, 116316264, 121119096, 126013168, + 130998016, 136073168, 141238128, 146492400, 151835488, 157266880, 162786064, 168392496, 174085632, 179864960, + 185729888, 191679888, 197714368, 203832752, 210034448, 216318896, 222685456, 229133536, 235662512, 242271760, + 248960656, 255728544, 262574784, 269498720, 276499680, 283577024, 290730048, 297958048, 305260384, 312636288, + 320085120, 327606144, 335198624, 342861856, 350595072, 358397568, 366268576, 374207360, 382213120, 390285152, + 398422624, 406624768, 414890848, 423220000, 431611456, 440064448, 448578112, 457151680, 465784288, 474475136, + 483223360, 492028160, 500888704, 509804096, 518773504, 527796064, 536870912, 545997184, 555174016, 564400512, + 573675776, 582998976, 592369152, 601785472, 611246976, 620752768, 630301952, 639893568, 649526784, 659200640, + 668914176, 678666496, 688456704, 698283776, 708146816, 718044864, 727976960, 737942208, 747939584, 757968192, + 768027072, 778115200, 788231680, 798375424, 808545600, 818741184, 828961216, 839204672, 849470528, 859757952, + 870065856, 880393216, 890739136, 901102592, 911482560, 921878080, 932288192, 942711808, 953147968, 963595648, + 974053952, 984521728, 994998080, 1005481984, 1015972480, 1026468416, 1036968960, 1047472960, 1057979520, 1068487552 + }; + // Q31 + const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 2] = { + 22902, 91608, 206114, 366416, 572507, 824378, 1122018, 1465415, 1854554, 2289418, + 2769989, 3296246, 3868167, 4485728, 5148901, 5857660, 6611973, 7411808, 8257132, 9147909, + 10084099, 11065664, 12092561, 13164746, 14282175, 15444799, 16652568, 17905432, 19203336, 20546226, + 21934042, 23366728, 24844222, 26366462, 27933380, 29544910, 31200986, 32901534, 34646484, 36435760, + 38269288, 40146984, 42068776, 44034576, 46044300, 48097868, 50195188, 52336168, 54520724, 56748756, + 59020172, 61334876, 63692768, 66093744, 68537712, 71024552, 73554176, 76126456, 78741304, 81398592, + 84098208, 86840048, 89623984, 92449904, 95317680, 98227200, 101178336, 104170952, 107204936, 110280144, + 113396456, 116553736, 119751848, 122990656, 126270024, 129589808, 132949864, 136350064, 139790240, 143270256, + 146789968, 150349232, 153947888, 157585760, 161262736, 164978624, 168733280, 172526544, 176358256, 180228256, + 184136368, 188082416, 192066256, 196087712, 200146592, 204242752, 208376000, 212546160, 216753072, 220996528, + 225276352, 229592384, 233944432, 238332288, 242755792, 247214752, 251708960, 256238240, 260802384, 265401216, + 270034528, 274702112, 279403808, 284139392, 288908640, 293711360, 298547360, 303416448, 308318400, 313252960, + 318220000, 323219264, 328250528, 333313632, 338408288, 343534304, 348691488, 353879616, 359098432, 364347744, + 369627296, 374936928, 380276320, 385645312, 391043680, 396471168, 401927520, 407412544, 412925984, 418467616, + 424037216, 429634528, 435259328, 440911328, 446590336, 452296128, 458028416, 463786944, 469571520, 475381856, + 481217728, 487078848, 492965024, 498875968, 504811424, 510771168, 516754912, 522762432, 528793440, 534847712, + 540924928, 547024960, 553147392, 559292032, 565458624, 571646912, 577856640, 584087488, 590339264, 596611584, + 602904320, 609217152, 615549760, 621901888, 628273344, 634663808, 641072960, 647500608, 653946432, 660410176, + 666891520, 673390208, 679906048, 686438592, 692987712, 699553088, 706134400, 712731392, 719343808, 725971328, + 732613696, 739270592, 745941760, 752626880, 759325760, 766038016, 772763456, 779501696, 786252480, 793015488, + 799790528, 806577216, 813375360, 820184576, 827004608, 833835136, 840675968, 847526656, 854387072, 861256832, + 868135616, 875023168, 881919232, 888823488, 895735616, 902655296, 909582336, 916516352, 923457088, 930404224, + 937357504, 944316544, 951281152, 958250944, 965225728, 972205056, 979188800, 986176512, 993168000, 1000162880, + 1007160960, 1014161856, 1021165248, 1028170944, 1035178560, 1042187776, 1049198400, 1056210048, 1063222464, 1070235328 + }; +#else // Q31 const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1] = { 204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, @@ -615,7 +675,9 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q 2138335743, 2139226495, 2140071807, 2140871679, 2141625983, 2142334719, 2142997887, 2143615487, 2144187391, 2144713599, 2145194239, 2145629055, 2146018175, 2146361599, 2146659327, 2146911103, 2147117183, 2147277567, 2147391999, 2147460735 }; - #else +#endif + +#else // Q31 const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4] = { 3309988, 29667578, 81733728, 158226416, 257262128, 376402368, 512713184, 662838656, 823081792, 989497088, diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index f8731bd0b..e81ec3413 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -101,7 +101,10 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA -#define STEREO_DMX_EVS_FAD_R 3 +#define STEREO_DMX_EVS_FAD_R 3 +#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT +#define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ +#endif #define STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 29491 // 0.9f #define STEREO_DMX_EVS_SGC_GR_S 32919 // 1.00461543f #define STEREO_DMX_EVS_SGC_GIR_S 32617 // 1/1.00461543f @@ -1933,14 +1936,60 @@ static void weighted_ave_fx( const Word32 wnd_fx[] /* i : window coef Q31 */ ) { +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + +#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT + Word16 i, j, len, len2; + Word32 gain_tmp_fx = 0, gain_sub_fx; + move32(); + + len = shr( input_frame, 1 ); + len2 = shr( input_frame, 2 ); + gain_sub_fx = L_sub( gain_fx, old_gain_fx ); + + FOR( i = 0; i < len2; i++ ) + { + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 + dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 + move32(); + } + FOR( ; i < len; i++ ) + { + j = add( i, 1 ); + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, L_sub( MAX_32, wnd_fx[sub( len, j )] ) ) ); // Q31 + dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 + move32(); + } + FOR( ; i < input_frame; i++ ) + { + dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 + move32(); + } +#else Word16 i, len; Word32 gain_tmp_fx = 0, gain_sub_fx; move32(); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC len = shr( input_frame, 1 ); + gain_sub_fx = L_sub( gain_fx, old_gain_fx ); + FOR( i = 0; i < len; i++ ) + { + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 + dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 + move32(); + } + FOR( ; i < input_frame; i++ ) + { + dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 + move32(); + } +#endif + #else + + Word16 i, len; + Word32 gain_tmp_fx = 0, gain_sub_fx; + move32(); len = shr( input_frame, 4 ); -#endif gain_sub_fx = L_sub( gain_fx, old_gain_fx ); FOR( i = 0; i < len; i++ ) { @@ -1954,6 +2003,8 @@ static void weighted_ave_fx( move32(); } +#endif + return; } @@ -2144,14 +2195,64 @@ static void adapt_gain_fx( const Word32 wnd_fx[] /* i : window coef Q31 */ ) { +#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC + +#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT + Word16 i, j, len, len2; + Word32 gain_tmp_fx, gain_sub_fx; + + len = shr( input_frame, 1 ); + len2 = shr( input_frame, 2 ); + gain_sub_fx = L_sub( gain_fx, old_gain_fx ); + + FOR( i = 0; i < len2; i++ ) + { + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 + dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx ); // Q16 + move32(); + } + FOR( ; i < len; i++ ) + { + j = add( i, 1 ); + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, L_sub( MAX_32, wnd_fx[sub( len, j )] ) ) ); // Q31 + dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx ); // Q16 + move32(); + } + FOR( ; i < input_frame; i++ ) + { + dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16 + move32(); + } +#else Word16 i, len; Word32 gain_tmp_fx, gain_sub_fx; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC len = shr( input_frame, 1 ); + + // gain_sub = gain - old_gain; + gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 + + FOR( i = 0; i < len; i++ ) + { + // gain_tmp = old_gain + gain_sub * wnd[i]; + gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 // dst[i] = src[i] * gain_tmp; + dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx ); // Q16 + move32(); + } + FOR( ; i < input_frame; i++ ) + { + // dst[i] = src[i] * gain; + dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16 + move32(); + } +#endif + #else + + Word16 i, len; + Word32 gain_tmp_fx, gain_sub_fx; + len = shr( input_frame, 4 ); -#endif // gain_sub = gain - old_gain; gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 @@ -2169,6 +2270,7 @@ static void adapt_gain_fx( dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16 move32(); } +#endif return; } @@ -2327,10 +2429,16 @@ void stereo_dmx_evs_enc_fx( { #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA Word16 n; - Word16 dmx_weight, corr; // Q15 - Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 + Word16 dmx_weight, corr; // Q15 +#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT + Word16 k, m, pha_len, fad_len, sbfad_len; +#else Word16 k, m, pha_len, fad_len; +#endif + + Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 + Word32 mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; // Q11 Word32 *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; @@ -2725,6 +2833,9 @@ void stereo_dmx_evs_enc_fx( ELSE { hStereoDmxEVS->hPHA->n_fad_g = sub( input_frame, add( hStereoDmxEVS->hPHA->n_fad_g, 1 ) ); +#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT + hStereoDmxEVS->hPHA->n_fad_cnt = 0; +#else IF( EQ_16( is_transient, 1 ) ) { hStereoDmxEVS->hPHA->n_fad_cnt = 0; @@ -2734,6 +2845,7 @@ void stereo_dmx_evs_enc_fx( { hStereoDmxEVS->hPHA->n_fad_cnt = sub( n_fad_r, hStereoDmxEVS->hPHA->n_fad_cnt ); } +#endif } } ELSE IF( is_transient ) @@ -2754,6 +2866,73 @@ void stereo_dmx_evs_enc_fx( move16(); m_fad_g = sub( input_frame, add( n_fad_g, 1 ) ); +#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT + IF( EQ_16( n_fad_r, 1 ) ) + { + n_fad_cnt = 0; + move16(); + FOR( n = 0; n < fad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + n_fad_g = add( n_fad_g, 1 ); + + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + m_fad_g = sub( m_fad_g, 1 ); + } + } + ELSE + { + n = 0; + sbfad_len = 0; + move16(); + move16(); + IF( NE_16( n_fad_cnt, 0 ) ) + { + sbfad_len = s_min( fad_len, sub( n_fad_r, n_fad_cnt ) ); + FOR( ; n < sbfad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + } + n_fad_cnt = 0; + move16(); + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } + + sbfad_len = sub( fad_len, sbfad_len ); + IF( EQ_16( n_fad_r, STEREO_DMX_EVS_FAD_R ) ) + { + sbfad_len = L_mult( sbfad_len, STEREO_DMX_EVS_FAD_IR ) >> 16; + } + + FOR( k = 0; k < sbfad_len; k++ ) + { + FOR( m = 0; m < n_fad_r; m++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + n = add( n, 1 ); + } + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } + + FOR( ; n < fad_len; n++ ) + { + p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; + p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 + n_fad_cnt = add( n_fad_cnt, 1 ); + IF( GE_16( n_fad_cnt, n_fad_r ) ) + { + n_fad_cnt = 0; + move16(); + n_fad_g = add( n_fad_g, 1 ); + m_fad_g = sub( m_fad_g, 1 ); + } + } + } +#else FOR( n = 0; n < fad_len; n++ ) { p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; @@ -2768,6 +2947,7 @@ void stereo_dmx_evs_enc_fx( m_fad_g = sub( m_fad_g, 1 ); } } +#endif hStereoDmxEVS->hPHA->n_fad_g = n_fad_g; hStereoDmxEVS->hPHA->n_fad_cnt = n_fad_cnt; @@ -3558,9 +3738,13 @@ ivas_error stereo_dmx_evs_init_encoder_fx( IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); BREAK; } -#endif + fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + move16(); +#else fad_len = input_frame; move16(); +#endif + fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; move32(); // fad_r = 1.0f / (float) ( fad_len + 1 ); -- GitLab From 720708ed980a4b3b7974661673a6a13b924bedac Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 19 May 2025 11:35:14 +0530 Subject: [PATCH 0623/1310] Removal of unused float functions and replacing C datatypes with Basop Datatypes --- lib_com/bitstream.c | 66 ++--- lib_com/core_com_config.c | 6 +- lib_com/ivas_cnst.h | 8 +- lib_com/longarith.c | 4 +- lib_com/prot_fx.h | 463 +++++++++++++------------------- lib_com/tns_base.c | 82 +----- lib_com/tools.c | 195 +++----------- lib_com/tools_fx.c | 14 +- lib_dec/dec_acelp_tcx_main_fx.c | 2 +- lib_enc/acelp_core_enc_fx.c | 3 - lib_enc/evs_enc_fx.c | 2 +- lib_enc/prot_fx_enc.h | 1 - lib_enc/rom_enc.h | 1 - lib_rend/ivas_rom_rend.h | 4 - lib_rend/ivas_rom_rend_fx.c | 36 --- 15 files changed, 290 insertions(+), 597 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d8d4563ed..385000139 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -100,7 +100,7 @@ static Word16 rate2AMRWB_IOmode( *-------------------------------------------------------------------*/ Word16 rate2EVSmode_float( const Word32 brate, /* i : bitrate */ - int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ + Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ) { if ( is_amr_wb != NULL ) @@ -575,8 +575,8 @@ Word16 get_ivas_max_num_indices_fx( *-----------------------------------------------------------------------*/ /*! r: maximum number of indices */ -int16_t get_BWE_max_num_indices( - const int32_t extl_brate /* i : extensiona layer bitrate */ +Word16 get_BWE_max_num_indices( + const Word32 extl_brate /* i : extensiona layer bitrate */ ) { /* set the maximum number of indices in the BWE */ @@ -787,10 +787,10 @@ Word16 get_ivas_max_num_indices_metadata_fx( void move_indices( INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ - const int16_t nb_indices /* i : number of moved indices */ + const Word16 nb_indices /* i : number of moved indices */ ) { - int16_t i; + Word16 i; if ( new_ind_list < old_ind_list ) { @@ -1092,14 +1092,14 @@ ivas_error push_next_bits( *-------------------------------------------------------------------*/ /*! r: result: index of the indice in the list, -1 if not found */ -int16_t find_indice( +Word16 find_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ + const Word16 id, /* i : ID of the indice */ + UWord16 *value, /* o : value of the quantized indice */ + Word16 *nb_bits /* o : number of bits used to quantize the indice */ ) { - int16_t i; + Word16 i; for ( i = 0; i < hBstr->nb_ind_tot; i++ ) { @@ -1122,12 +1122,12 @@ int16_t find_indice( *-------------------------------------------------------------------*/ /*! r: number of deleted indices */ -uint16_t delete_indice( +UWord16 delete_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id /* i : ID of the indice */ + const Word16 id /* i : ID of the indice */ ) { - int16_t i, j; + Word16 i, j; j = 0; for ( i = 0; i < hBstr->nb_ind_tot; i++ ) @@ -1168,14 +1168,14 @@ uint16_t delete_indice( *-------------------------------------------------------------------*/ /*! r: value of the indice */ -uint16_t get_next_indice( +UWord16 get_next_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { - uint16_t value; - int16_t i; - int32_t nbits_total; + UWord16 value; + Word16 i; + Word32 nbits_total; assert( nb_bits <= 16 ); @@ -1207,11 +1207,11 @@ uint16_t get_next_indice( *-------------------------------------------------------------------*/ /*! r: value of the indice */ -uint16_t get_next_indice_1( +UWord16 get_next_indice_1( Decoder_State *st /* i/o: decoder state structure */ ) { - int32_t nbits_total; + Word32 nbits_total; nbits_total = st->total_brate / FRAMES_PER_SEC; /* detect corrupted bitstream */ if ( ( st->next_bit_pos + 1 > nbits_total && st->codec_mode == MODE1 ) || @@ -1233,7 +1233,7 @@ uint16_t get_next_indice_1( void get_next_indice_tmp( Decoder_State *st, /* o : decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { /* update the position in the bitstream */ @@ -1249,15 +1249,15 @@ void get_next_indice_tmp( *-------------------------------------------------------------------*/ /*! r: value of the indice */ -uint16_t get_indice( +UWord16 get_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t pos, /* i : absolute position in the bitstream (update after the read) */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 pos, /* i : absolute position in the bitstream (update after the read) */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { - uint16_t value; - int16_t i; - int32_t nbits_total; + UWord16 value; + Word16 i; + Word32 nbits_total; assert( nb_bits <= 16 ); @@ -1584,9 +1584,9 @@ ivas_error write_indices_ivas_fx( *-------------------------------------------------------------------*/ static void decoder_selectCodec( - Decoder_State *st, /* i/o: decoder state structure */ - const int32_t total_brate, /* i : total bitrate */ - const int16_t bit0 /* i : first bit */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 total_brate, /* i : total bitrate */ + const Word16 bit0 /* i : first bit */ ) { /* set the AMR-WB IO flag */ @@ -1724,7 +1724,7 @@ void ivas_set_bitstream_pointers( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - int16_t k, num_bits; + Word16 k, num_bits; Decoder_State **sts; num_bits = 0; @@ -1734,7 +1734,7 @@ void ivas_set_bitstream_pointers( { sts = st_ivas->hSCE[k]->hCoreCoder; sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (int16_t) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); + num_bits += (Word16) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); } /* set bitstream pointers for CPEs */ @@ -1742,7 +1742,7 @@ void ivas_set_bitstream_pointers( { sts = st_ivas->hCPE[k]->hCoreCoder; sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (int16_t) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); + num_bits += (Word16) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); } return; diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index f75f28a18..152870be7 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -492,12 +492,12 @@ Word16 sr2fscale_fx( return extract_l( Mpy_32_16_1( sr_core, FSCALE_DENOM_BY_12800_Q15 ) ); /*Q0*/ } -int16_t sr2fscale( - const int32_t sr_core /* i : internal sampling rate */ +Word16 sr2fscale( + const Word32 sr_core /* i : internal sampling rate */ ) { - return (int16_t) ( ( FSCALE_DENOM * sr_core ) / 12800 ); + return (Word16) ( ( FSCALE_DENOM * sr_core ) / 12800 ); } Word32 getCoreSamplerateMode2( diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9243b3f50..097ba1789 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -509,8 +509,8 @@ enum #define STEREO_DFT32MS_N_NS FRAME_SIZE_NS /* 20 ms */ #define STEREO_DFT32MS_OVL_NS 3125000L /* 3.125ms - Overlap for the outer edges of windows on decoder */ #define STEREO_DFT32MS_OVL2_NS 9375000L /* 9.375ms - Overlap for the inner edges of windows on decoder */ -#define STEREO_DFT32MS_WIN_CENTER_NS ( int32_t )( ( FRAME_SIZE_NS + STEREO_DFT32MS_OVL_NS ) * 0.5f ) /* 11.5625ms - mid point of the two windows wrt the left edge of overlap */ -#define STEREO_DFT32MS_ZP_NS ( int32_t )( 0.5f * ( STEREO_DFT32MS_N_NS - STEREO_DFT32MS_WIN_CENTER_NS - ( STEREO_DFT32MS_OVL2_NS * 0.5f ) ) ) /* 2 sided zp calculated such that window size is satisfied */ +#define STEREO_DFT32MS_WIN_CENTER_NS ( Word32 )( ( FRAME_SIZE_NS + STEREO_DFT32MS_OVL_NS ) * 0.5f ) /* 11.5625ms - mid point of the two windows wrt the left edge of overlap */ +#define STEREO_DFT32MS_ZP_NS ( Word32 )( 0.5f * ( STEREO_DFT32MS_N_NS - STEREO_DFT32MS_WIN_CENTER_NS - ( STEREO_DFT32MS_OVL2_NS * 0.5f ) ) ) /* 2 sided zp calculated such that window size is satisfied */ #define STEREO_DFT32MS_OVL_MAX NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) #define STEREO_DFT32MS_OVL2_MAX NS2SA( 48000, STEREO_DFT32MS_OVL2_NS ) @@ -799,7 +799,7 @@ enum fea_names #define L_DEC_MEM_LEN_ICA L_NCSHIFTMAX + ( N_MAX_SHIFT_CHANGE + 1 ) + SINC_ORDER1 / INTERP_FACTOR1 #define L_FRAME_DS NS2SA( CORR_INTER_FS, FRAME_SIZE_NS ) #define L_XCORRMEM_DS NS2SA( CORR_INTER_FS, 2 * ( ACELP_LOOK_NS ) ) -#define L_NCSHIFT_DS ( int16_t )( ( ( int32_t )(CORR_INTER_FS) *L_NCSHIFTMAX ) / 48000L ) +#define L_NCSHIFT_DS ( Word16 )( ( ( Word32 )(CORR_INTER_FS) *L_NCSHIFTMAX ) / 48000L ) #define L_SAMPLES_LA_NS 625000L #define L_MEM_RECALC_TBE_16K NS2SA( 16000, L_MEM_RECALC_TBE_NS ) @@ -1446,7 +1446,7 @@ typedef struct { typedef struct { Word32 value[81]; - unsigned short length[81]; + UWord16 length[81]; } HUFF_ELEMENTS; typedef struct { diff --git a/lib_com/longarith.c b/lib_com/longarith.c index 72a763de3..c5ace652c 100644 --- a/lib_com/longarith.c +++ b/lib_com/longarith.c @@ -64,14 +64,14 @@ void longadd( assert( lena >= lenb ); for ( h = 0; h < lenb; h++ ) { - carry += ( (uint32_t) a[h] ) + ( (uint32_t) b[h] ); + carry += ( (UWord32) a[h] ) + ( (UWord32) b[h] ); a[h] = (UWord16) carry; carry = carry >> 16; } for ( ; h < lena; h++ ) { - carry = ( (uint32_t) a[h] ) + carry; + carry = ( (UWord32) a[h] ) + carry; a[h] = (UWord16) carry; carry = carry >> 16; } diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index c7d35daca..498be3137 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -72,9 +72,6 @@ #define max( x, y ) ( ( x ) > ( y ) ? ( x ) : ( y ) ) #endif -#define log_base_2( x ) ( (double) log( (double) ( x ) ) * 1.4426950408889634074f ) -#define round_f( x ) ( ( ( x ) > 0 ) ? (int32_t) ( ( x ) + 0.5f ) : ( -(int32_t) ( ( -x ) + 0.5f ) ) ) - #ifndef ABSVAL #define ABSVAL( a ) ( ( a ) >= 0 ? ( a ) : ( -( a ) ) ) #endif @@ -1576,19 +1573,19 @@ Word16 gsc_gainQ_fx( ); Word16 gsc_gainQ_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ const Word16 y_gain4[], /* i : Energy per band */ // Q12 Word16 y_gainQ[], /* o : quantized energy per band */ // Q12 - const int32_t core_brate, /* i : Core rate */ - const int16_t coder_type, /* i : coding type */ - const int16_t bwidth, /* i : input signal bandwidth */ - const int16_t L_frame, /* i : frame length */ - const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const int32_t core_brate_inp /* i : true core bitrate */ + const Word32 core_brate, /* i : Core rate */ + const Word16 coder_type, /* i : coding type */ + const Word16 bwidth, /* i : input signal bandwidth */ + const Word16 L_frame, /* i : frame length */ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word32 core_brate_inp /* i : true core bitrate */ ); // frame_ener.c @@ -1779,7 +1776,7 @@ void Ener_per_band_comp_ivas_fx( const Word16 Q_exc, /* i : frame length */ const Word16 Mband, /* i : Max band */ const Word16 Eflag, /* i : flag of highest band */ - const int16_t L_frame /* i : frame length */ + const Word16 L_frame /* i : frame length */ ); void Ener_per_band_comp_ivas_fx_2( const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ @@ -2633,7 +2630,7 @@ void Interpolate_allpass_steep_fx( void Interpolate_allpass_steep_fx32( const Word32 *in_fx, /* i : input array of size N */ Word32 *mem_fx, /* i/o: memory */ - const int16_t N, /* i : number of input samples */ + const Word16 N, /* i : number of input samples */ Word32 *out_fx /* o : output array of size 2*N */ ); @@ -2647,7 +2644,7 @@ void interpolate_3_over_2_allpass_fx( void interpolate_3_over_2_allpass_fx32( const Word32 *input, /* i : input signal Qx */ - const int16_t len, /* i : number of input samples */ + const Word16 len, /* i : number of input samples */ Word32 *out, /* o : output signal */ Word32 *mem /* i/o: memory */ ); @@ -2931,16 +2928,16 @@ void tbe_celp_exc( ); void tbe_celp_exc_ivas( - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - const Word16 L_frame_fx, /* i : Frame lenght */ - const int16_t L_subfr, /* i : subframe length */ - const Word16 i_subfr_fx, /* i : sub frame */ - const Word16 T0_fx, /* i : Integer pitch */ - const Word16 T0_frac_fx, /* i : Fractional part of the pitch */ - Word16 *error_fx, /* i/o: Error */ - Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 L_frame_fx, /* i : Frame lenght */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : sub frame */ + const Word16 T0_fx, /* i : Integer pitch */ + const Word16 T0_frac_fx, /* i : Fractional part of the pitch */ + Word16 *error_fx, /* i/o: Error */ + Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ ); void flip_and_downmix_generic_fx( @@ -3159,8 +3156,8 @@ void GenSHBSynth_fx32( Word32 *shb_syn_speech_32k, /* o : output highband component */ Word32 Hilbert_Mem[], /* i/o: memory */ Word32 state_lsyn_filt_shb_local[], /* i/o: memory */ - const int16_t L_frame, /* i : ACELP frame length */ - int16_t *syn_dm_phase ); + const Word16 L_frame, /* i : ACELP frame length */ + Word16 *syn_dm_phase ); void ScaleShapedSHB_fx( const Word16 length, /* i : SHB overlap length */ @@ -3245,7 +3242,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - const int16_t element_mode, + const Word16 element_mode, #endif Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -3280,7 +3277,7 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , - int16_t element_mode + Word16 element_mode #endif ); @@ -3747,8 +3744,8 @@ void const *GetTnsEnabledSingleFilter( void const *p, const Word16 index, Word16 void *SetTnsEnabledSingleFilter( void *p, const Word16 index, const Word16 value ); -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ); -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ); +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ); +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ); /*tns_base.h*/ /** Reset TNS data. @@ -4113,8 +4110,8 @@ void cng_params_upd_ivas_fx( const Word16 element_mode, /* i : Element mode */ const Word16 bwidth /* i : Audio bandwidth */ ); -int16_t get_cng_mode( - const int32_t last_active_brate /* i : last active bitrate */ +Word16 get_cng_mode( + const Word32 last_active_brate /* i : last active bitrate */ ); // core_com_config.c @@ -4301,12 +4298,12 @@ void lpc2mdct( void lpc2mdct_2( Word16 *lpcCoeffs, - const int16_t lpcOrder, + const Word16 lpcOrder, Word16 mdct_gains_fx[], Word16 mdct_gains_e[], Word16 mdct_inv_gains_fx[], Word16 mdct_inv_gains_e[], - const int16_t length ); + const Word16 length ); void mdct_shaping( Word32 x[], @@ -4941,25 +4938,25 @@ void cb_shape_fx( // longarith.c void longadd( - uint16_t a[], /* i/o: vector of the length lena */ - const uint16_t b[], /* i/o: vector of the length lenb */ - const int16_t lena, /* i/o: length of vector a[] */ - const int16_t lenb /* i/o: length of vector b[] */ + UWord16 a[], /* i/o: vector of the length lena */ + const UWord16 b[], /* i/o: vector of the length lenb */ + const Word16 lena, /* i/o: length of vector a[] */ + const Word16 lenb /* i/o: length of vector b[] */ ); void longshiftright( - uint16_t a[], /* i : vector of the length lena */ - const int16_t b, /* i : number of bit positions to shift right */ - uint16_t d[], /* o : vector of the length lend */ - int16_t lena, /* i : length of vector a[] */ - const int16_t lend /* i : length of vector d[] */ + UWord16 a[], /* i : vector of the length lena */ + const Word16 b, /* i : number of bit positions to shift right */ + UWord16 d[], /* o : vector of the length lend */ + Word16 lena, /* i : length of vector a[] */ + const Word16 lend /* i : length of vector d[] */ ); void longshiftleft( - const uint16_t a[], /* i : vector of the length len */ - const int16_t b, /* i : number of bit positions to shift left */ - uint16_t d[], /* o : vector of the length len */ - const int16_t len /* i : length of vector a[] and d[] */ + const UWord16 a[], /* i : vector of the length len */ + const Word16 b, /* i : number of bit positions to shift left */ + UWord16 d[], /* o : vector of the length len */ + const Word16 len /* i : length of vector a[] and d[] */ ); void longshr( @@ -5637,7 +5634,7 @@ void enhancer_fx( void enhancer_ivas_fx( const Word16 codec_mode, /* i : flag indicating Codec Mode */ const Word32 core_brate, /* i : decoder bitrate */ - const int16_t cbk_index, /* i : */ + const Word16 cbk_index, /* i : */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ const Word16 coder_type, /* i : coder type */ const Word16 i_subfr, /* i : subframe number */ @@ -6398,11 +6395,11 @@ void ivas_RefineTonalComponents_fx( const PsychoacousticParameters *psychParamsCurrent ); ivas_error PsychoacousticParameters_Init( - const int32_t sr_core, /* i : sampling rate of core-coder */ - const int16_t nBins, /* i : Number of bins (spectral lines) */ - const int8_t nBands, /* i : Number of spectrum subbands */ - const int16_t isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ - const int16_t isWarped, /* i : Flag indicating if the scale is linear or warped */ + const Word32 sr_core, /* i : sampling rate of core-coder */ + const Word16 nBins, /* i : Number of bins (spectral lines) */ + const Word8 nBands, /* i : Number of spectrum subbands */ + const Word16 isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ + const Word16 isWarped, /* i : Flag indicating if the scale is linear or warped */ PsychoacousticParameters *pPsychParams ); // TonalIMDCTconcealment_fx.c @@ -8279,17 +8276,17 @@ Word16 FEC_synchro_exc_fx( ); void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const int16_t uc_two_stage_flag, /* i : flag indicating two-stage UC */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ + const Word16 uc_two_stage_flag, /* i : flag indicating two-stage UC */ + const Word16 coder_type, /* Q0 i : coding type */ + Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ + Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ + Word16 *voice_factors_fx, /* Q15 o : voicing factors */ + Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ + Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ + Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ Word16 *gain_buf ); // gaus_dec_fx.c @@ -8473,10 +8470,10 @@ void mode_switch_decoder_LPD_ivas_fx( // ari_hm_dec.c -int16_t DecodeIndex( +Word16 DecodeIndex( Decoder_State *st, - const int16_t Bandwidth, /* o : NB, 1: (S)WB */ - int16_t *PeriodicityIndex ); + const Word16 Bandwidth, /* o : NB, 1: (S)WB */ + Word16 *PeriodicityIndex ); Word16 DecodeIndex_fx( Decoder_State *st, @@ -8553,7 +8550,7 @@ void IGFSCFDecoderReset( void IGFSCFDecoderDecode( IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ Decoder_State *st, /* i/o: pointer to decoder state */ - int16_t *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ + Word16 *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ const Word16 indepFlag /* i : if 1 on input the decoder will be forced to reset, if 0 on input the decoder will be forced to encode without a reset */ @@ -8681,11 +8678,11 @@ Word16 DecodeTnsData_ivas_fx( // parametr_bitmapping.c using ivas void GetParameters( ParamsBitMap const *paramsBitMap, - const int16_t nParams, + const Word16 nParams, void const *pParameter, - int16_t **pStream, - int16_t *pnSize, - int16_t *pnBits ); + Word16 **pStream, + Word16 *pnSize, + Word16 *pnBits ); void GetParameters_fx( ParamsBitMap const *paramsBitMap, @@ -8705,10 +8702,10 @@ void EncodeTnsData_ivas_fx( void SetParameters( ParamsBitMap const *paramsBitMap, - const int16_t nParams, + const Word16 nParams, void *pParameter, - const int16_t **pStream, - int16_t *pnSize ); + const Word16 **pStream, + Word16 *pnSize ); void SetParameters_fx( ParamsBitMap const *paramsBitMap, @@ -8719,18 +8716,18 @@ void SetParameters_fx( void WriteToBitstream( ParamsBitMap const *paramsBitMap, - const int16_t nParams, - const int16_t **pStream, - int16_t *pnSize, + const Word16 nParams, + const Word16 **pStream, + Word16 *pnSize, BSTR_ENC_HANDLE hBstr, - int16_t *pnBits ); + Word16 *pnBits ); void ReadFromBitstream( ParamsBitMap const *paramsBitMap, - const int16_t nArrayLength, + const Word16 nArrayLength, Decoder_State *st, - int16_t **pStream, - int16_t *pnSize ); + Word16 **pStream, + Word16 *pnSize ); void ReadFromBitstream_fx( ParamsBitMap const *paramsBitMap, @@ -9289,7 +9286,7 @@ void v_add_fx( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const int16_t N /* i : Vector length */ + const Word16 N /* i : Vector length */ ); void v_shr_16( @@ -9343,10 +9340,10 @@ void configureCldfb_ivas_fx( ); // dec4t64.c void dec_acelp_fast_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const int16_t cdk_index, /* i : codebook index */ - Word16 code[], /* o : algebraic (fixed) codebook excitation */ - const int16_t L_subfr /* i : subframe length */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 cdk_index, /* i : codebook index */ + Word16 code[], /* o : algebraic (fixed) codebook excitation */ + const Word16 L_subfr /* i : subframe length */ ); // codec_tcx_common.c void tcx5SpectrumInterleaving_fx( @@ -9384,7 +9381,7 @@ void cldfbAnalysis_ivas_fx( const Word32 *timeIn_fx, /* i : time buffer Qx */ Word32 **realBuffer_fx, /* o : real value buffer Qx - 5*/ Word32 **imagBuffer_fx, /* o : imag value buffer QX - 5*/ - const int16_t samplesToProcess, /* i : samples to process */ + const Word16 samplesToProcess, /* i : samples to process */ HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ ); @@ -9403,7 +9400,7 @@ void cldfbSynthesis_ivas_fx( // bass_psfilter.c void addBassPostFilter_ivas_fx( const Word32 *harm_timeIn_fx, - const int16_t samplesToProcess, + const Word16 samplesToProcess, Word32 **rAnalysis_fx, Word32 **iAnalysis_fx, HANDLE_CLDFB_FILTER_BANK cldfb ); @@ -9563,8 +9560,8 @@ void fd_bwe_dec_init_fx( void stereo_dft_dec_open( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const int32_t output_Fs, /* i : output sampling rate */ - const int16_t nchan_transport /* i : number of transport channels */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 nchan_transport /* i : number of transport channels */ ); void ivas_bw_switching_pre_proc_fx( @@ -10260,8 +10257,8 @@ void dctT2_N_apply_matrix_fx( ); Word32 sum2_f_32_fx( - const Word32 *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ Word16 gb ); Word32 sum2_32_fx( @@ -10411,10 +10408,10 @@ void generate_stereo_masking_noise_fx( Word16 Q_syn, Decoder_State *st, /* i/o: decoder state structure */ STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ - const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ - const int16_t fadeOut, /* i : only fade out of previous state */ + const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ + const Word16 fadeOut, /* i : only fade out of previous state */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 nchan_out /* i : number of output channels */ ); void SynthesisSTFT_fx( @@ -10422,10 +10419,10 @@ void SynthesisSTFT_fx( Word32 *timeDomainOutput, Word32 *olapBuffer, const Word16 *olapWin, - const int16_t tcx_transition, + const Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - const int16_t element_mode, /* i : element mode */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 element_mode, /* i : element mode */ + const Word16 nchan_out /* i : number of output channels */ ); void FdCng_decodeSID_ivas_fx( @@ -10807,7 +10804,7 @@ Word16 msvq_stage1_dct_recalc_candidates_fdcng_wb_fx( const Word16 st1_syn_vec_e, /* i : exp for IDCT24 synthesis vectors */ const Word32 *u_fx, /* i : target signal */ const Word16 u_e, /* i : exp for target signal */ - const int16_t maxC_st1, /* i : number of candidates in stage1 */ + const Word16 maxC_st1, /* i : number of candidates in stage1 */ Word32 *dist_ptr_fx, /* i/o: updated MSE vector for stage1 */ Word16 *dist_ptr_e /* i/o: exp for updated MSE vector for stage1 */ ); @@ -10880,69 +10877,42 @@ void WriteToBitstream_ivas_fx( * MODE1 prototypes *----------------------------------------------------------------------------------*/ -/*! r: inverse square root of input value */ -float inv_sqrt( - const float x /* i : input value */ -); - /*! r: output random value */ -int16_t own_random( - int16_t *seed /* i/o: random seed */ -); - -/*! r: sign of x (+1/-1) */ -float sign( - const float x /* i : input value of x */ +Word16 own_random( + Word16 *seed /* i/o: random seed */ ); -/*! r: logarithm2 of x */ -float log2_f( - const float x /* i : input value of x */ -); - -int16_t norm_ul_float( - uint32_t UL_var1 ); +Word16 norm_ul_float( + UWord32 UL_var1 ); /*! r: sum of all vector elements */ -int16_t sum_s( - const int16_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ +Word16 sum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ); /*! r: sum of all vector elements */ -int32_t sum_l( - const int32_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - -/*! r: sum of all squared vector elements */ -float sum2_f( - const float *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ +Word32 sum_l( + const Word32 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ); void set_c( - int8_t y[], /* i/o: Vector to set */ - const int8_t a, /* i : Value to set the vector to */ - const int32_t N /* i : Length of the vector */ + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word32 N /* i : Length of the vector */ ); void set_s( - int16_t y[], /* i/o: Vector to set */ - const int16_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word16 y[], /* i/o: Vector to set */ + const Word16 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ ); void set_l( - int32_t y[], /* i/o: Vector to set */ - const int32_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ -); - -void set_f( - float y[], /* i/o: Vector to set */ - const float a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word32 y[], /* i/o: Vector to set */ + const Word32 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ ); void set_zero_fx( @@ -10959,52 +10929,26 @@ void set16_zero_fx( ); void set_zero( - float *vec, /* o : input vector */ - const int16_t lvec /* i : length of the vector */ + float *vec, /* o : input vector */ + const Word16 lvec /* i : length of the vector */ ); void mvr2r( const float x[], /* i : input vector */ float y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 n /* i : vector size */ ); void mvs2s( - const int16_t x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - -uint32_t mvr2s( - const float x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - -void mvs2r( - const int16_t x[], /* i : input vector */ - float y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 x[], /* i : input vector */ + Word16 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ); void mvl2l( - const int32_t x[], /* i : input vector */ - int32_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - - -/*! r: index of the maximum value in the input vector */ -int16_t maximum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *max_val /* o : maximum value in the input vector */ -); -/*! r: index of the maximum value in the input vector */ -int16_t maximumAbs( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *max_val /* o : maximum value in the input vector */ + const Word32 x[], /* i : input vector */ + Word32 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ); Word16 maximumAbs_l( @@ -11014,63 +10958,22 @@ Word16 maximumAbs_l( ); /*! r: index of the minimum value in the input vector */ -int16_t minimum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *min_val /* o : minimum value in the input vector */ -); - -/*! r: index of the minimum value in the input vector */ -int16_t minimum_s( - const int16_t *vec, /* i : Input vector */ - const int16_t lvec, /* i : Vector length */ - int16_t *min_val /* o : minimum value in the input vector */ -); - -/*! r: return index with max energy value in vector */ -int16_t emaximum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *ener_max /* o : maximum energy value */ -); - -/*! r: vector mean */ -float mean( - const float *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - -/*! r: dot product of x[] and y[] */ -float dotp( - const float x[], /* i : vector x[] */ - const float y[], /* i : vector y[] */ - const int16_t n /* i : vector length */ -); - -void v_add( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 + vector 2 */ - const int16_t N /* i : Vector length */ -); - -void v_sub( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 - vector 2 */ - const int16_t N /* i : Vector length */ +Word16 minimum_s( + const Word16 *vec, /* i : Input vector */ + const Word16 lvec, /* i : Vector length */ + Word16 *min_val /* o : minimum value in the input vector */ ); /*! r: dequanzited gain */ float usdequant( - const int16_t idx, /* i : quantizer index */ - const float qlow, /* i : lowest codebook entry (index 0) */ - const float delta /* i : quantization step */ + const Word16 idx, /* i : quantizer index */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta /* i : quantization step */ ); void sort( - uint16_t *x, /* i/o: Vector to be sorted */ - uint16_t len /* i/o: vector length */ + UWord16 *x, /* i/o: Vector to be sorted */ + UWord16 len /* i/o: vector length */ ); void sort_l( @@ -11081,9 +10984,9 @@ void sort_l( ivas_error push_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ - uint16_t value, /* i : value of the quantized indice */ - int16_t nb_bits /* i : number of bits used to quantize the indice */ + Word16 id, /* i : ID of the indice */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ ); ivas_error push_next_indice( @@ -11105,8 +11008,8 @@ Word16 get_ivas_max_num_indices_fx( ); /*! r: maximum number of indices */ -int16_t get_BWE_max_num_indices( - const int32_t extl_brate /* i : extensiona layer bitrate */ +Word16 get_BWE_max_num_indices( + const Word32 extl_brate /* i : extensiona layer bitrate */ ); /*! r: maximum number of indices */ @@ -11115,9 +11018,9 @@ Word16 get_ivas_max_num_indices_metadata_fx( const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( - INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ - const int16_t max_num_indices, /* i : new maximum number of allowed indices in the list */ - Encoder_Struct *st_ivas /* i : IVAS encoder structure */ + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ ); ivas_error check_ind_list_limits( @@ -11127,44 +11030,44 @@ ivas_error check_ind_list_limits( void move_indices( INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ - const int16_t nb_indices /* i : number of moved indices */ + const Word16 nb_indices /* i : number of moved indices */ ); /*! r: index of the indice in the list, -1 if not found */ -int16_t find_indice( +Word16 find_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ + const Word16 id, /* i : ID of the indice */ + UWord16 *value, /* o : value of the quantized indice */ + Word16 *nb_bits /* o : number of bits used to quantize the indice */ ); /*! r: number of deleted indices */ -uint16_t delete_indice( +UWord16 delete_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const int16_t id /* i : ID of the indice */ + const Word16 id /* i : ID of the indice */ ); /*! r: value of the indice */ -uint16_t get_next_indice( +UWord16 get_next_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); /*! r: value of the indice */ -uint16_t get_next_indice_1( +UWord16 get_next_indice_1( Decoder_State *st /* i/o: decoder state structure */ ); void get_next_indice_tmp( Decoder_State *st, /* o : decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); /*! r: value of the indice */ -uint16_t get_indice( +UWord16 get_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t pos, /* i : absolute position in the bitstream */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 pos, /* i : absolute position in the bitstream */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); void reset_indices_dec( @@ -11173,7 +11076,7 @@ void reset_indices_dec( Word16 rate2EVSmode_float( const Word32 brate, /* i : bitrate */ - int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ + Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ); @@ -11200,13 +11103,13 @@ void mdct_switching_dec_fx( Decoder_State *st /* i/o: decoder state structure */ ); -int16_t print_disclaimer( +Word16 print_disclaimer( FILE *fPtr ); void fft_rel( - float x[], /* i/o: input/output vector */ - const int16_t n, /* i : vector length */ - const int16_t m /* i : log2 of vector length */ + float x[], /* i/o: input/output vector */ + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ ); void preemph_ivas_fx( @@ -11219,8 +11122,8 @@ void preemph_ivas_fx( void create_offset( UWord32 *offset_scale1, UWord32 *offset_scale2, - const int16_t mode, - const int16_t prediction_flag ); + const Word16 mode, + const Word16 prediction_flag ); void BASOP_cfft_ivas( Word32 *re, /* i/o: real part */ @@ -11465,31 +11368,31 @@ void writeTCXWindowing_fx( ); void writeLPCparam( - Encoder_State *st, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const int16_t param_lpc[], /* i : LPC parameters to write */ - const int16_t bits_param_lpc[], /* i : bits per LPC parameter */ - const int16_t no_param_lpc, /* i : number of LPC parameters */ - int16_t *nbits_lpc /* o : LPC bits written */ + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 param_lpc[], /* i : LPC parameters to write */ + const Word16 bits_param_lpc[], /* i : bits per LPC parameter */ + const Word16 no_param_lpc, /* i : number of LPC parameters */ + Word16 *nbits_lpc /* o : LPC bits written */ ); -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ); -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ); -void const *GetNumOfTnsFilters_flt( void const *p, const int16_t index, int16_t *pValue ); -void *SetNumOfTnsFilters_flt( void *p, const int16_t index, const int16_t value ); +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ); +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ); +void const *GetNumOfTnsFilters_flt( void const *p, const Word16 index, Word16 *pValue ); +void *SetNumOfTnsFilters_flt( void *p, const Word16 index, const Word16 value ); -int16_t DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); -int16_t DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); +Word16 DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); -int16_t DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); +Word16 DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t EncodeTnsFilterOrderSWBTCX10_flt( const int16_t value, const int16_t index ); +Word16 EncodeTnsFilterOrderSWBTCX10_flt( const Word16 value, const Word16 index ); -int16_t GetTnsFilterOrderBitsSWBTCX10_flt( const int16_t value, const int16_t index ); -int16_t DecodeTnsFilterOrder_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 GetTnsFilterOrderBitsSWBTCX10_flt( const Word16 value, const Word16 index ); +Word16 DecodeTnsFilterOrder_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); void ResetTnsData_flt( STnsData *pTnsData ); @@ -11542,7 +11445,7 @@ void analysisCldfbEncoder_ivas_fx( ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ - const int32_t sampling_rate, /* i : sampling rate */ + const Word32 sampling_rate, /* i : sampling rate */ CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ ); diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index 82de45023..5e18430be 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -809,43 +809,19 @@ static Word16 DecodeUsingTable( Decoder_State *st, Word16 *pValue /*Q0*/, const /* TNS filter coefficients */ -int16_t DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX20[index], nTnsCoeffCodes ); } -// int16_t GetSWBTCX10TnsFilterCoeffBits_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return GetBitsFromTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); -// } - -// int16_t EncodeSWBTCX10TnsFilterCoeff_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return EncodeUsingTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); -// } - -int16_t DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); } -// int16_t GetWBTCX20TnsFilterCoeffBits_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return GetBitsFromTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); -// } - -// int16_t EncodeWBTCX20TnsFilterCoeff_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return EncodeUsingTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); -// } - -int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); @@ -854,49 +830,25 @@ int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, /* TNS filter order */ -// void const *GetTnsFilterOrder_flt( void const *p, const int16_t index, int16_t *pValue ) -//{ -// *pValue = ( (STnsFilter const *) p )[index].order; -// return ( (STnsFilter const *) p )[index].coefIndex; -// } - -// void *SetTnsFilterOrder_flt( void *p, const int16_t index, const int16_t value ) -//{ -// ( (STnsFilter *) p )[index].order = value; -// return ( (STnsFilter *) p )[index].coefIndex; -// } - -// int16_t GetTnsFilterOrderBitsSWBTCX20_flt( const int16_t value, const int16_t index ) -//{ -// (void) index; -// return GetBitsFromTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); -// } - -// int16_t EncodeTnsFilterOrderSWBTCX20_flt( const int16_t value, const int16_t index ) -//{ -// (void) index; -// return EncodeUsingTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); -// } - -int16_t DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrderTCX20, nTnsOrderCodes ); } -int16_t GetTnsFilterOrderBitsSWBTCX10_flt( const int16_t value, const int16_t index ) +Word16 GetTnsFilterOrderBitsSWBTCX10_flt( const Word16 value, const Word16 index ) { (void) index; return GetBitsFromTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); } -int16_t EncodeTnsFilterOrderSWBTCX10_flt( const int16_t value, const int16_t index ) +Word16 EncodeTnsFilterOrderSWBTCX10_flt( const Word16 value, const Word16 index ) { (void) index; return EncodeUsingTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); } -int16_t DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrderTCX10, nTnsOrderCodes ); @@ -1105,42 +1057,36 @@ void *SetTnsEnabled( void *p, const Word16 index, const Word16 value ) /* Number of TNS filters */ -void const *GetNumOfTnsFilters_flt( void const *p, const int16_t index, int16_t *pValue ) +void const *GetNumOfTnsFilters_flt( void const *p, const Word16 index, Word16 *pValue ) { - *pValue = (int16_t) abs( ( (STnsData const *) p )[index].nFilters ); + *pValue = (Word16) abs( ( (STnsData const *) p )[index].nFilters ); return ( (STnsData const *) p )[index].filter; } -void *SetNumOfTnsFilters_flt( void *p, const int16_t index, const int16_t value ) +void *SetNumOfTnsFilters_flt( void *p, const Word16 index, const Word16 value ) { - ( (STnsData *) p )[index].nFilters = (int16_t) abs( value ); + ( (STnsData *) p )[index].nFilters = (Word16) abs( value ); return ( (STnsData *) p )[index].filter; } -int16_t DecodeTnsFilterOrder_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrder_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrder, nTnsOrderCodes ); } /* TNS on whitened spectra flag */ -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ) +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ) { *pValue = ( (STnsData const *) p )[index].tnsOnWhitenedSpectra > 0 ? 1 : 0; return NULL; } -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ) +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ) { ( (STnsData *) p )[index].tnsOnWhitenedSpectra = value; return NULL; } -// void const *GetTnsEnabledSingleFilter( void const *p, const int16_t index, int16_t *pValue ) -//{ -// *pValue = ( (STnsData const *) p )[index].nFilters != 0 ? 1 : 0; -// return ( (STnsData const *) p )[index].filter; -// } - void const *GetTnsEnabledSingleFilter( void const *p, const Word16 index, Word16 *pValue ) { move16(); diff --git a/lib_com/tools.c b/lib_com/tools.c index f7303c6f3..9166d16eb 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -47,51 +47,23 @@ *------------------------------------------------------------------*/ /*! r: output random value */ -int16_t own_random( - int16_t *seed /* i/o: random seed */ +Word16 own_random( + Word16 *seed /* i/o: random seed */ ) { - *seed = (int16_t) ( *seed * 31821L + 13849L ); + *seed = (Word16) ( *seed * 31821L + 13849L ); return ( *seed ); } /*--------------------------------------------------------------------- - * sign() + * norm_ul_float() * *---------------------------------------------------------------------*/ -/*! r: sign of x (+1/-1) */ -float sign( - const float x /* i : input value of x */ -) +Word16 norm_ul_float( UWord32 UL_var1 ) { - if ( x < 0.0f ) - { - return -1.0f; - } - else - { - return 1.0f; - } -} - -/*--------------------------------------------------------------------- - * log2_f() - * - *---------------------------------------------------------------------*/ - -/*! r: logarithm2 of x */ -float log2_f( - const float x /* i : input value of x */ -) -{ - return (float) ( log( x ) / log( 2.0f ) ); -} - -int16_t norm_ul_float( uint32_t UL_var1 ) -{ - int16_t var_out; + Word16 var_out; if ( UL_var1 == 0 ) { @@ -99,7 +71,7 @@ int16_t norm_ul_float( uint32_t UL_var1 ) } else { - for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) + for ( var_out = 0; UL_var1 < (UWord32) 0x80000000U; var_out++ ) { UL_var1 <<= 1; } @@ -118,13 +90,13 @@ int16_t norm_ul_float( uint32_t UL_var1 ) *---------------------------------------------------------------------*/ /*! r: sum of all vector elements */ -int16_t sum_s( - const int16_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ +Word16 sum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ) { - int16_t i; - int16_t tmp; + Word16 i; + Word16 tmp; tmp = 0; for ( i = 0; i < lvec; i++ ) @@ -182,7 +154,7 @@ Word32 sum2_f_16_gb_fx( const Word16 lvec, /* i : length of input vector */ Word16 gb ) { - int16_t i; + Word16 i; Word32 tmp; tmp = 0; @@ -311,7 +283,6 @@ Word32 sum2_32_fx( /*-------------------------------------------------------------------* * set_c() * set_s() - * set_f() * set_l() * set_d() * @@ -319,12 +290,12 @@ Word32 sum2_32_fx( *-------------------------------------------------------------------*/ void set_c( - int8_t y[], /* i/o: Vector to set */ - const int8_t a, /* i : Value to set the vector to */ - const int32_t N /* i : Length of the vector */ + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word32 N /* i : Length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < N; i++ ) { @@ -336,12 +307,12 @@ void set_c( void set_s( - int16_t y[], /* i/o: Vector to set */ - const int16_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ + Word16 y[], /* i/o: Vector to set */ + const Word16 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < N; i++ ) { @@ -353,28 +324,12 @@ void set_s( void set_l( - int32_t y[], /* i/o: Vector to set */ - const int32_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = a; - } - - return; -} - -void set_f( - float y[], /* i/o: Vector to set */ - const float a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word32 y[], /* i/o: Vector to set */ + const Word32 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < N; i++ ) { @@ -391,11 +346,11 @@ void set_f( *---------------------------------------------------------------------*/ void set_zero( - float *vec, /* o : input vector */ - const int16_t lvec /* i : length of the vector */ + float *vec, /* o : input vector */ + const Word16 lvec /* i : length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < lvec; i++ ) { @@ -409,8 +364,6 @@ void set_zero( /*---------------------------------------------------------------------* * mvr2r() * mvs2s() - * mvr2s() - * mvs2r() * mvr2d() * mvd2r() * @@ -420,10 +373,10 @@ void set_zero( void mvr2r( const float x[], /* i : input vector */ float y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 n /* i : vector size */ ) { - int16_t i; + Word16 i; if ( n <= 0 ) { @@ -450,12 +403,12 @@ void mvr2r( } void mvs2s( - const int16_t x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 x[], /* i : input vector */ + Word16 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ) { - int16_t i; + Word16 i; if ( n <= 0 ) { @@ -482,12 +435,12 @@ void mvs2s( } void mvl2l( - const int32_t x[], /* i : input vector */ - int32_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word32 x[], /* i : input vector */ + Word32 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ) { - int16_t i; + Word16 i; if ( n <= 0 ) { @@ -687,32 +640,6 @@ Word16 minimum_l( return ind; } -/*---------------------------------------------------------------------* - * dotp() - * - * Dot product of vector x[] and vector y[] - *---------------------------------------------------------------------*/ - -/*! r: dot product of x[] and y[] */ -float dotp( - const float x[], /* i : vector x[] */ - const float y[], /* i : vector y[] */ - const int16_t n /* i : vector length */ -) -{ - int16_t i; - float suma; - - suma = x[0] * y[0]; - - for ( i = 1; i < n; i++ ) - { - suma += x[i] * y[i]; - } - - return suma; -} - /*---------------------------------------------------------------------* * dotp() * @@ -800,20 +727,6 @@ Word32 dotp_fixed_32( return W_extract_l( suma ); } -/*---------------------------------------------------------------------* - * inv_sqrt() - * - * Find the inverse square root of the input value - *---------------------------------------------------------------------*/ - -/*! r: inverse square root of input value */ -float inv_sqrt( - const float x /* i : input value */ -) -{ - return (float) ( 1.0 / sqrt( x ) ); -} - /*-------------------------------------------------------------------* * v_add_w64() * @@ -839,32 +752,8 @@ void v_add_w64( return; } - -/*-------------------------------------------------------------------* - * v_sub() - * - * Subtraction of two vectors sample by sample - *-------------------------------------------------------------------*/ - -void v_sub( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 - vector 2 */ - const int16_t N /* i : Vector length */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = x1[i] - x2[i]; - } - - return; -} - /*-------------------------------------------------------------------* - * v_sub() + * v_sub_fixed() * * Subtraction of two vectors sample by sample *-------------------------------------------------------------------*/ @@ -977,9 +866,9 @@ void v_multc_fixed_16_16( *-------------------------------------------------------------------*/ float usdequant( - const int16_t idx, /* i : quantizer index */ - const float qlow, /* i : lowest codebook entry (index 0) */ - const float delta /* i : quantization step */ + const Word16 idx, /* i : quantizer index */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta /* i : quantization step */ ) { float g; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 14a97a034..77e779efd 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -241,9 +241,9 @@ void fix2f_16( Word16 *var_fix, float *var_flt, Word32 expo ) #undef WMC_TOOL_SKIP -int16_t norm_ul( uint32_t UL_var1 ) +Word16 norm_ul( UWord32 UL_var1 ) { - int16_t var_out; + Word16 var_out; if ( UL_var1 == 0 ) { @@ -251,7 +251,7 @@ int16_t norm_ul( uint32_t UL_var1 ) } else { - for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) + for ( var_out = 0; UL_var1 < (UWord32) 0x80000000U; var_out++ ) { UL_var1 <<= 1; } @@ -997,7 +997,7 @@ void scale_sig( } /*---------------------------------------------------------------------* - * mean() + * mean_fx() * *---------------------------------------------------------------------*/ Word16 mean_fx( /* o : mean of vector */ @@ -2171,7 +2171,7 @@ Word16 own_random2_fx( Word16 seed ) } /*--------------------------------------------------------------------- - * sign() + * sign_fx() * *---------------------------------------------------------------------*/ @@ -4207,7 +4207,7 @@ Word16 lin_interp_ivas_fx( } /*--------------------------------------------------------------------- - * sign() + * sign_l() * *---------------------------------------------------------------------*/ @@ -4245,7 +4245,7 @@ void v_mult16_fixed( } /*---------------------------------------------------------------------* - * set_zero() + * set_zero_fx() * * Set a vector vec[] of dimension lvec to zero *---------------------------------------------------------------------*/ diff --git a/lib_dec/dec_acelp_tcx_main_fx.c b/lib_dec/dec_acelp_tcx_main_fx.c index 21bf7cf12..eea558914 100644 --- a/lib_dec/dec_acelp_tcx_main_fx.c +++ b/lib_dec/dec_acelp_tcx_main_fx.c @@ -364,7 +364,7 @@ Word16 dec_acelp_tcx_frame_fx( { /* Copy back parameters from previous frame, because there is a high risk they are corrupt * DO concealment with configuration used in previous frame */ - st->m_frame_type = (uint8_t) m_frame_type; + st->m_frame_type = (UWord8) m_frame_type; move16(); st->bwidth = bwidth; move16(); diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index 6ba21136e..f942a19ff 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -38,7 +38,6 @@ ivas_error acelp_core_enc_fx( Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ Word16 *unbits_fx, /* o : number of unused bits Q0*/ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ const Word16 Q_new, const Word16 shift ) { @@ -107,8 +106,6 @@ ivas_error acelp_core_enc_fx( * Initialization *------------------------------------------------------------------*/ - (void) tdm_lsfQ_PCh; - Es_pred_fx = 0; move16(); diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index 624ec20fc..8e9a82378 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -269,7 +269,7 @@ ivas_error evs_enc_fx( IF( EQ_16( st->core, ACELP_CORE ) ) { acelp_core_enc_fx( st, inp, ener, A, Aw, epsP_h, epsP_l, lsp_new, lsp_mid, vad_hover_flag, - attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL, Q_new, shift ); + attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, Q_new, shift ); } /*---------------------------------------------------------------------* * HQ core encoding diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 72137bdce..d3528370f 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -61,7 +61,6 @@ ivas_error acelp_core_enc_fx( Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ Word16 *unbits_fx, /* o : number of unused bits Q0*/ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ const Word16 Q_new, const Word16 shift diff --git a/lib_enc/rom_enc.h b/lib_enc/rom_enc.h index 35fd3027d..7da1da92a 100644 --- a/lib_enc/rom_enc.h +++ b/lib_enc/rom_enc.h @@ -52,7 +52,6 @@ extern const Word16 W_HIST_S_FX[DTX_HIST_SIZE]; /* CNG & DTX - table for calcula extern const Word16 bwd_start_bin[]; // Q0 extern const Word16 bwd_end_bin[]; // Q0 -extern const float h_fir[]; /* 2nd order fir filter for wsp, decimation by 2 */ extern const Word16 h_fir_fx[]; /* 2nd order fir filter for wsp, decimation by 2 Q15*/ extern const Word16 preemphCompensation_fx[]; // Q11 diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index f62440749..7f9cfb57a 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -121,10 +121,6 @@ extern const Word32 ivas_reverb_default_fc_fx[]; /*Q-16*/ extern const Word32 ivas_reverb_default_RT60_fx[]; /*Q-26*/ extern const Word32 ivas_reverb_default_DSR_fx[]; /*Q-30*/ -extern const float ivas_reverb_default_fc[]; -extern const float ivas_reverb_default_RT60[]; -extern const float ivas_reverb_default_DSR[]; - extern const Word32 release_cnst_table[4][201]; // Q31 /*----------------------------------------------------------------------------------* diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 4f101582c..d14be4afe 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -561,42 +561,6 @@ const Word32 ivas_reverb_default_DSR_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q30*/ = 66, 30, 28 }; -const float ivas_reverb_default_fc[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 20.0f, 25.0f, 31.5f, 40.0f, - 50.0f, 63.0f, 80.0f, 100.0f, - 125.0f, 160.0f, 200.0f, 250.0f, - 315.0f, 400.0f, 500.0f, 630.0f, - 800.0f, 1000.0f, 1250.0f, 1600.0f, - 2000.0f, 2500.0f, 3150.0f, 4000.0f, - 5000.0f, 6300.0f, 8000.0f, 10000.0f, - 12500.0f, 16000.0f, 20000.0f -}; - -const float ivas_reverb_default_RT60[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 1.3622f, 1.4486f, 1.3168f, 1.5787f, - 1.4766f, 1.3954f, 1.2889f, 1.3462f, - 1.0759f, 1.0401f, 1.097f, 1.085f, - 1.091f, 1.0404f, 1.0499f, 1.0699f, - 1.1028f, 1.1714f, 1.1027f, 1.0666f, - 1.055f, 1.0553f, 1.0521f, 1.0569f, - 1.0421f, 0.97822f, 0.80487f, 0.75944f, - 0.71945f, 0.61682f, 0.60031f -}; - -const float ivas_reverb_default_DSR[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 1.8811e-08f, 2.1428e-08f, 1.3972e-08f, 1.51e-08f, - 1.287e-08f, 1.8747e-08f, 2.413e-08f, 3.9927e-08f, - 8.9719e-08f, 1.902e-07f, 3.702e-07f, 6.1341e-07f, - 7.1432e-07f, 6.5331e-07f, 4.6094e-07f, 5.4683e-07f, - 7.0134e-07f, 6.856e-07f, 7.114e-07f, 6.9604e-07f, - 5.2939e-07f, 5.699e-07f, 6.1773e-07f, 5.7488e-07f, - 4.7748e-07f, 2.7213e-07f, 1.3681e-07f, 1.0941e-07f, - 6.2001e-08f, 2.8483e-08f, 2.6267e-08f -}; - const Word32 release_cnst_table[4][201] = // Q31 { { -- GitLab From da2b43248ebe6f50e354ed8846d6f4d8d4421e7e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 19 May 2025 12:01:23 +0530 Subject: [PATCH 0624/1310] Fix for 3GPP issue 1534: BASOP Encoder Distortion for ISM 1 FER at 32kbps, EXT output, high MLD Link #1534 --- lib_enc/mslvq_enc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/mslvq_enc_fx.c b/lib_enc/mslvq_enc_fx.c index 8f8dd4537..4955dede8 100644 --- a/lib_enc/mslvq_enc_fx.c +++ b/lib_enc/mslvq_enc_fx.c @@ -1221,10 +1221,10 @@ Word32 mslvq_ivas_16( } ELSE { - p_sigma = sigma_p_fx[mode]; + p_sigma = sigma_p_ivas_fx[mode]; /* inverse sigma is precomputed to save complexity */ - p_inv_sigma = inv_sigma_p_fx[mode]; + p_inv_sigma = inv_sigma_p_ivas_fx[mode]; p_scales = scales_p_ivas_fx[mode_glb]; -- GitLab From 045831118042045062a1ae656ea51451aed2a72a Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:04 +0200 Subject: [PATCH 0625/1310] [cleanup] accept FIX_955_FASTCONV_REND_IN_ISM --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index e764bc83b..1e87603ff 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -96,7 +96,6 @@ #define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ #define NONBE_FIX_952_MC_PARAMUPMIX_5MS /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/ #define NONBE_FIX_935_EARLY_REFLECTIONS_WRONG_ORDER /* Qualcomm: issue 953: fix order or ER channels in LC mode*/ -#define FIX_955_FASTCONV_REND_IN_ISM /* VA: put FastConv rendering call under DEBUGGING */ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define FIX_959_MASA_LINEAR_REND /* VA: issue 959: remove unused calling of ivas_sba_linear_renderer() in MASA rendering */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index fa0a1e630..2d22849f2 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1984,7 +1984,6 @@ ivas_error ivas_jbm_dec_render_fx( { ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); } -#ifdef FIX_955_FASTCONV_REND_IN_ISM #ifdef DEBUGGING ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) #else @@ -1992,11 +1991,6 @@ ivas_error ivas_jbm_dec_render_fx( #endif { /* Convert to Ambisonics */ -#else - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) - { -/* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ -#endif FOR( i = 0; i < st_ivas->nchan_transport; i++ ) { FOR( j = 0; j < HOA3_CHANNELS; j++ ) -- GitLab From 15a67f9dad66484503a905f0d271af2e0d2e274c Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:07 +0200 Subject: [PATCH 0626/1310] [cleanup] accept FIX_969_USAN_IGF_ARITH --- lib_com/options.h | 1 - lib_dec/igf_scf_dec_fx.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1e87603ff..d92201a15 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,7 +101,6 @@ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_935_SBA_REVERB /* FhG: issue 935: fix MSAN error for SBA related to BINAURAL_ROOM_REVERB */ -#define FIX_969_USAN_IGF_ARITH /* FhG: issue 969: fix USAN error in igf_sce_dec; same issue as #962 */ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ #define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ diff --git a/lib_dec/igf_scf_dec_fx.c b/lib_dec/igf_scf_dec_fx.c index 3db6581da..6478b3f92 100644 --- a/lib_dec/igf_scf_dec_fx.c +++ b/lib_dec/igf_scf_dec_fx.c @@ -189,9 +189,7 @@ static void decode_sfe_vector_fx( { /* (t == 0) && (f == 0) */ /* decode one of the IGF_SYMBOLS_IN_TABLE == 27 alphabet symbols using the new raw AC function */ -#ifdef FIX_969_USAN_IGF_ARITH /* NOTE: the float equivalent uses a tmp variable + explicit cast here to avoid undefined behaviour here. This BASOP version does not need it as it already uses signed Word16 return value here. */ -#endif res = ari_decode_14bits_s27_ext_fx( st, &hPrivateData->acState, (const UWord16 *) hPrivateData->cf_se00 ); pred = arith_decode_bits_fx( hPrivateData, st, 2 ); /* LSBs as 2 bit raw */ -- GitLab From a5680fbef0997f729ab9387387ffbac80c9fe52d Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:10 +0200 Subject: [PATCH 0627/1310] [cleanup] accept FIX_959_MASA_LINEAR_REND --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 17 ----------------- lib_dec/ivas_output_config_fx.c | 4 ---- 3 files changed, 22 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index d92201a15..4c0d6034f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,7 +97,6 @@ #define NONBE_FIX_952_MC_PARAMUPMIX_5MS /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/ #define NONBE_FIX_935_EARLY_REFLECTIONS_WRONG_ORDER /* Qualcomm: issue 953: fix order or ER channels in LC mode*/ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ -#define FIX_959_MASA_LINEAR_REND /* VA: issue 959: remove unused calling of ivas_sba_linear_renderer() in MASA rendering */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_935_SBA_REVERB /* FhG: issue 935: fix MSAN error for SBA related to BINAURAL_ROOM_REVERB */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 2d22849f2..8ae516d7c 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2102,24 +2102,7 @@ ivas_error ivas_jbm_dec_render_fx( } ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { -#ifndef FIX_959_MASA_LINEAR_REND - IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) ) - { - *nSamplesRendered = s_min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); - move16(); - FOR( n = 0; n < nchan_remapped; n++ ) - { - Copy32( st_ivas->hTcBuffer->tc_fx[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output_fx[n], *nSamplesRendered ); - } - IF( NE_32( ( error = ivas_sba_linear_renderer_fx( p_output_fx, *nSamplesRendered, nchan_remapped, 0, output_config, st_ivas->hOutSetup ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) -#else IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) -#endif { ivas_dirac_dec_render_fx( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output_fx ); } diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index 94a1869f4..8afd003be 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -453,11 +453,7 @@ void ivas_renderer_select( *internal_config = IVAS_AUDIO_CONFIG_HOA3; move16(); } -#ifdef FIX_959_MASA_LINEAR_REND *renderer_type = RENDERER_SBA_LINEAR_DEC; -#else - st_ivas->renderer_type = RENDERER_SBA_LINEAR_DEC; -#endif move16(); } ELSE IF( ( EQ_32( ivas_format, MASA_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && EQ_16( st_ivas->nchan_transport, 1 ) ) || -- GitLab From 35850efa8640a21d6ac814ee61f8d456a813b3e0 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:13 +0200 Subject: [PATCH 0628/1310] [cleanup] accept NONBE_FIX_BINARY_BINAURAL_READING --- apps/decoder.c | 70 ---------- apps/renderer.c | 25 ---- lib_com/ivas_cnst.h | 3 - lib_com/ivas_error.h | 4 - lib_com/options.h | 1 - lib_dec/ivas_init_dec.c | 4 - lib_dec/lib_dec.h | 16 --- lib_dec/lib_dec_fx.c | 32 ----- lib_rend/ivas_crend_fx.c | 18 --- lib_rend/ivas_hrtf_fx.c | 4 - lib_rend/ivas_objectRenderer_fx.c | 4 - lib_rend/ivas_objectRenderer_mix_fx.c | 11 -- lib_rend/ivas_stat_rend.h | 14 -- lib_rend/lib_rend.c | 185 -------------------------- lib_rend/lib_rend.h | 4 - lib_util/hrtf_file_reader.c | 184 +------------------------ lib_util/hrtf_file_reader.h | 14 -- 17 files changed, 6 insertions(+), 587 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 64f131206..a59bc5fac 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -174,10 +174,8 @@ int main( RenderConfigReader *renderConfigReader = NULL; int16_t *pcmBuf = NULL; IVAS_RENDER_FRAMESIZE asked_frame_size; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; -#endif #ifdef WMOPS reset_wmops(); @@ -603,16 +601,12 @@ int main( if ( arg.hrtfReaderEnabled ) { -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; -#endif if ( ( error = IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( ( error = load_HRTF_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) @@ -649,16 +643,8 @@ int main( destroy_td_hrtf( hHrtfTD ); } } -#else - if ( ( error = load_HRTF_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } -#endif #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( ( *hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) @@ -667,16 +653,6 @@ int main( goto cleanup; } } -#else - if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } -#endif -#endif -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; #endif if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ) ) != IVAS_ERR_OK ) { @@ -684,7 +660,6 @@ int main( goto cleanup; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) { #ifdef FIX_OLD_BINARY_FORMAT @@ -721,26 +696,14 @@ int main( } #endif } -#else - if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfFileName ); - goto cleanup; - } -#endif -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; -#else - IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL; -#endif if ( ( error = IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfFastConvHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( ( error = load_fastconv_HRTF_from_binary( *hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) @@ -753,26 +716,14 @@ int main( destroy_fastconv_hrtf( hHrtfFastConv ); } } -#else - if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfFileName ); - goto cleanup; - } -#endif -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; -#else - IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL; -#endif if ( ( error = IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfParamBinHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( ( error = load_parambin_HRTF_from_binary( *hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) @@ -785,13 +736,6 @@ int main( destroy_parambin_hrtf( hHrtfParambin ); } } -#else - if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s for parametric binauralizer \n\n", arg.hrtfFileName ); - goto cleanup; - } -#endif } /*------------------------------------------------------------------------------------------* @@ -854,30 +798,16 @@ cleanup: if ( arg.hrtfReaderEnabled ) { -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; -#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( hHrtfTD != NULL ) { destroy_td_hrtf( hHrtfTD ); } -#else - dealloc_HRTF_binary( hHrtfTD ); -#endif -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; -#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( hSetOfHRTF != NULL ) { destroy_SetOfHRTF( hSetOfHRTF ); } -#else - destroy_SetOfHRTF( hSetOfHRTF ); -#endif } IVAS_DEC_Close( &hIvasDec ); diff --git a/apps/renderer.c b/apps/renderer.c index 1ef7473c5..64ef2e5d6 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -762,12 +762,10 @@ int main( #endif Vector3PairFileReader *referenceVectorReader = NULL; hrtfFileReader *hrtfFileReader = NULL; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; -#endif IsmPositionProvider *positionProvider; LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; RenderConfigReader *renderConfigReader = NULL; @@ -912,16 +910,6 @@ int main( } } -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - if ( !isEmptyString( args.customHrtfFilePath ) ) - { - if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) - { - fprintf( stderr, "Error opening file: %s\n", args.customHrtfFilePath ); - exit( -1 ); - } - } -#endif if ( !isEmptyString( args.renderConfigFilePath ) ) { @@ -1009,17 +997,12 @@ int main( Word32 nonDiegeticPanGain_fx = ( args.nonDiegeticPanGain == 1.0f ) ? ONE_IN_Q31 : ( args.nonDiegeticPanGain == -1.0f ) ? L_negate( ONE_IN_Q31 ) : (Word32) ( args.nonDiegeticPanGain * ( 1LL << Q31 ) ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, !isEmptyString( args.customHrtfFilePath ), args.nonDiegeticPan, nonDiegeticPanGain_fx, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) -#else - IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, nonDiegeticPanGain_fx, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( !isEmptyString( args.customHrtfFilePath ) ) { if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) @@ -1165,7 +1148,6 @@ int main( hrtfFileReader_close( &hrtfFileReader ); } -#endif fprintf( stdout, "Input audio file: %s\n", args.inputFilePath ); fprintf( stdout, "Output audio file: %s\n\n", args.outputFilePath ); @@ -2234,9 +2216,7 @@ int main( free( outFloatBuffer ); free( outInt32Buffer ); free( inInt32Buffer ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING cleanup: -#endif #ifdef SPLIT_REND_WITH_HEAD_ROT if ( bitsBufferData != NULL ) @@ -2270,10 +2250,6 @@ cleanup: RotationFileReader_close( &externalOrientationFileReader ); RotationFileReader_close( &referenceRotReader ); Vector3PairFileReader_close( &referenceVectorReader ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - hrtfFileReader_close( &hrtfFileReader ); -#endif -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( hSetOfHRTF != NULL && *hSetOfHRTF != NULL ) { destroy_SetOfHRTF( hSetOfHRTF ); @@ -2282,7 +2258,6 @@ cleanup: { destroy_td_hrtf( hHrtfTD ); } -#endif IVAS_REND_Close( &hIvasRend ); IsmPositionProvider_close( positionProvider ); RenderConfigReader_close( &renderConfigReader ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index ee34014df..97602e73d 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1683,9 +1683,6 @@ typedef enum #define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP ) #define MAX_INTERPOLATION_STEPS 12 -#ifndef NONBE_FIX_BINARY_BINAURAL_READING -#define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) -#endif #define DEG_360_IN_Q22 ( 360 << Q22 ) // Q22 #define DEG_180_IN_Q22 ( 180 << Q22 ) // Q22 diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 4955c7e2c..14c37a593 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -78,9 +78,7 @@ typedef enum IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, IVAS_ERR_INVALID_HRTF, -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA, -#endif IVAS_ERR_INVALID_INPUT_FORMAT, IVAS_ERR_INVALID_INDEX, IVAS_ERR_NOT_SUPPORTED_OPTION, @@ -260,10 +258,8 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Acoustic environment not supported"; case IVAS_ERR_INVALID_HRTF: return "Unsupported HRTF filter set"; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING case IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA: return "Renderer data missing in HRTF binary file"; -#endif case IVAS_ERR_INVALID_INPUT_FORMAT: return "Invalid input format"; case IVAS_ERR_INVALID_INDEX: diff --git a/lib_com/options.h b/lib_com/options.h index 4c0d6034f..f19e13466 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -102,7 +102,6 @@ #define NONBE_FIX_935_SBA_REVERB /* FhG: issue 935: fix MSAN error for SBA related to BINAURAL_ROOM_REVERB */ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ -#define NONBE_FIX_BINARY_BINAURAL_READING /* Orange: Add support for reading binaural binary file */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 69e246164..b4af0ed06 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -3078,11 +3078,7 @@ void ivas_destroy_dec_fx( { ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( st_ivas->hHrtfTD != NULL ) -#else - ELSE IF( st_ivas->hHrtfTD != NULL ) -#endif { BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index f2281b779..b6ce35d90 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -360,39 +360,23 @@ ivas_error IVAS_DEC_FeedCustomLsData( /*! r: error code */ ivas_error IVAS_DEC_GetHrtfHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ -#else - IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ -#endif ); /*! r: error code */ ivas_error IVAS_DEC_GetHrtfCRendHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - #ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ -#else - IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ -#endif ); ivas_error IVAS_DEC_GetHrtfFastConvHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ -#else - IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ -#endif ); ivas_error IVAS_DEC_GetHrtfParamBinHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ -#else - IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ -#endif ); diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index e2bd37600..7ead34cca 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2512,11 +2512,7 @@ ivas_error IVAS_DEC_FeedCustomLsData( ivas_error IVAS_DEC_GetHrtfHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ -#else - IVAS_DEC_HRTF_HANDLE *hHrtfTD /* o : HRTF handle */ -#endif ) { test(); @@ -2526,11 +2522,7 @@ ivas_error IVAS_DEC_GetHrtfHandle( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING *hHrtfTD = &hIvasDec->st_ivas->hHrtfTD; -#else - *hHrtfTD = hIvasDec->st_ivas->hHrtfTD; -#endif return IVAS_ERR_OK; } @@ -2544,11 +2536,7 @@ ivas_error IVAS_DEC_GetHrtfHandle( ivas_error IVAS_DEC_GetHrtfCRendHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ -#else - IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* o : Set of HRTF handle */ -#endif ) { test(); @@ -2558,11 +2546,7 @@ ivas_error IVAS_DEC_GetHrtfCRendHandle( return IVAS_ERR_WRONG_PARAMS; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING *hSetOfHRTF = &hIvasDec->st_ivas->hSetOfHRTF; -#else - *hSetOfHRTF = hIvasDec->st_ivas->hSetOfHRTF; -#endif return IVAS_ERR_OK; } @@ -2576,11 +2560,7 @@ ivas_error IVAS_DEC_GetHrtfCRendHandle( ivas_error IVAS_DEC_GetHrtfFastConvHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ -#else - IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* o : FASTCONV HRTF handle */ -#endif ) { test(); @@ -2590,11 +2570,7 @@ ivas_error IVAS_DEC_GetHrtfFastConvHandle( return IVAS_ERR_WRONG_PARAMS; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING *hHrtfFastConv = &hIvasDec->st_ivas->hHrtfFastConv; -#else - *hHrtfFastConv = hIvasDec->st_ivas->hHrtfFastConv; -#endif return IVAS_ERR_OK; } @@ -2608,11 +2584,7 @@ ivas_error IVAS_DEC_GetHrtfFastConvHandle( ivas_error IVAS_DEC_GetHrtfParamBinHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ -#else - IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* o : Parametric binauralizer HRTF handle */ -#endif ) { test(); @@ -2622,11 +2594,7 @@ ivas_error IVAS_DEC_GetHrtfParamBinHandle( return IVAS_ERR_WRONG_PARAMS; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING *hHrtfParambin = &hIvasDec->st_ivas->hHrtfParambin; -#else - *hHrtfParambin = hIvasDec->st_ivas->hHrtfParambin; -#endif return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 134d02996..36965fc61 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -235,7 +235,6 @@ static ivas_error ivas_rend_initCrend_fx( return IVAS_ERR_INTERNAL_FATAL; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING test(); test(); test(); @@ -258,14 +257,9 @@ static ivas_error ivas_rend_initCrend_fx( ( ( hSetOfHRTF->hHRTF_hrir_foa == NULL ) && ( inConfig == IVAS_AUDIO_CONFIG_FOA ) ) || ( ( hSetOfHRTF->hHRTF_hrir_hoa2 == NULL ) && ( inConfig == IVAS_AUDIO_CONFIG_HOA2 ) ) || ( ( hSetOfHRTF->hHRTF_hrir_hoa3 == NULL ) && ( inConfig == IVAS_AUDIO_CONFIG_HOA3 ) ) ) -#else - IF( hSetOfHRTF == NULL ) -#endif { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING hHrtf->init_from_rom = 1; move16(); -#endif IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { hHrtf->max_num_ir = sub( hHrtf->max_num_ir, 1 ); /* subtract LFE */ @@ -1014,9 +1008,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING hHrtf->init_from_rom = 0; -#endif IF( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { hHrtf->max_num_ir = sub( hHrtf->max_num_ir, 1 ); /* subtract LFE */ @@ -1026,24 +1018,20 @@ static ivas_error ivas_rend_initCrend_fx( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( hSetOfHRTF->hHRTF_brir_combined == NULL ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Invalid command wrong output format" ); } -#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_brir_combined->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_brir_combined->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_brir_combined->index_frequency_max_diffuse; } ELSE { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( hSetOfHRTF->hHRTF_hrir_combined == NULL ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Invalid command wrong output format" ); } -#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_combined->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_combined->index_frequency_max_diffuse; @@ -1152,12 +1140,10 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA3 ) ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( hSetOfHRTF->hHRTF_hrir_hoa3 == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); } -#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; @@ -1203,12 +1189,10 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA2 ) ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( hSetOfHRTF->hHRTF_hrir_hoa2 == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); } -#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse; @@ -1254,12 +1238,10 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_FOA ) ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( hSetOfHRTF->hHRTF_hrir_foa == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Invalid function parameters " ); } -#endif hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse; diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index a9167f95b..0cb8ae505 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -54,9 +54,7 @@ ivas_error ivas_HRTF_binary_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary!" ); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING set_c( (int8_t *) ( *hHrtfTD ), 0, (int32_t) sizeof( TDREND_HRFILT_FiltSet_t ) ); -#endif return IVAS_ERR_OK; } @@ -188,9 +186,7 @@ ivas_error ivas_HRTF_parambin_binary_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for parametric binauralizer HRTF tables!" ); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING set_c( (int8_t *) ( *hHrtfParambin ), 0, (int32_t) sizeof( HRTFS_PARAMBIN ) ); -#endif return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index 8b11d1f7a..da2c3cce9 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -802,11 +802,7 @@ ivas_error ivas_td_binaural_open_ext_fx( { directivity_fx = hRendCfg->directivity_fx; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING return ivas_td_binaural_open_unwrap_fx( pTDRend->hHrtfTD, outFs, nchan_transport, ivas_format, transport_config, directivity_fx, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns, SrcInd ); -#else - return ivas_td_binaural_open_unwrap_fx( &pTDRend->hHrtfTD, outFs, *num_src, ivas_format, transport_config, directivity_fx, hTransSetup, &pTDRend->hBinRendererTd, &pTDRend->binaural_latency_ns, SrcInd ); -#endif } /*---------------------------------------------------------------------* * ivas_td_binaural_renderer_ext() diff --git a/lib_rend/ivas_objectRenderer_mix_fx.c b/lib_rend/ivas_objectRenderer_mix_fx.c index 589baf509..72042975b 100644 --- a/lib_rend/ivas_objectRenderer_mix_fx.c +++ b/lib_rend/ivas_objectRenderer_mix_fx.c @@ -156,12 +156,8 @@ void TDREND_MIX_Dealloc_fx( hBinRendererTd->Listener_p = NULL; } /* Dealloc HR filter set */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING test(); IF( ( *hBinRendererTd->pHrFiltSet_p != NULL ) && ( hBinRendererTd->HrFiltSet_p != NULL ) ) -#else - IF( hBinRendererTd->HrFiltSet_p != NULL ) -#endif { IF( EQ_16( hBinRendererTd->HrFiltSet_p->FilterMethod, TDREND_HRFILT_Method_BSplineModel ) ) { @@ -191,17 +187,12 @@ void TDREND_MIX_Dealloc_fx( } } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( EQ_16( hBinRendererTd->HrFiltSet_p->ModelParams.modelROM, 1 ) ) { free( hBinRendererTd->HrFiltSet_p ); hBinRendererTd->HrFiltSet_p = NULL; *hBinRendererTd->pHrFiltSet_p = NULL; } -#else - free( hBinRendererTd->HrFiltSet_p ); - hBinRendererTd->HrFiltSet_p = NULL; -#endif } return; @@ -266,9 +257,7 @@ ivas_error TDREND_MIX_Init_fx( hBinRendererTd->HrFiltSet_p = *hHrtfTD; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING hBinRendererTd->pHrFiltSet_p = hHrtfTD; -#endif IF( NE_32( hBinRendererTd->HrFiltSet_p->SampleRate, output_Fs ) ) { diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 8cdb3d007..69351bae8 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1296,9 +1296,7 @@ typedef struct ivas_binaural_td_rendering_struct TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING TDREND_HRFILT_FiltSet_t **pHrFiltSet_p; /* pointer to HR filter set */ -#endif Word16 UseCommonDistAttenModel; /* Use common dist atten model (TRUE/FALSE) */ Word16 DistAttenEnabled; /* (TRUE/FALSE) */ @@ -1310,11 +1308,7 @@ typedef struct { Word32 binaural_latency_ns; BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING TDREND_HRFILT_FiltSet_t **hHrtfTD; -#else - TDREND_HRFILT_FiltSet_t *hHrtfTD; -#endif } TDREND_WRAPPER, *TDREND_WRAPPER_HANDLE; @@ -1341,9 +1335,7 @@ typedef struct ivas_hrtfs_structure Word16 inv_diffuse_weight_fx[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] Q15 */ #endif Word32 latency_s_fx; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING Word16 init_from_rom; -#endif Word16 gain_lfe_fx; // Q14 } HRTFS_DATA, *HRTFS_HANDLE; /* Main Crend structure */ @@ -1478,9 +1470,7 @@ typedef struct ivas_hrtfs_parambin_struct Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING Word16 allocatedFromFile; -#endif } HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; @@ -1603,11 +1593,7 @@ typedef struct ivas_masa_external_rendering_struct #endif REVERB_STRUCT_HANDLE hReverb; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING HRTFS_PARAMBIN_HANDLE *hHrtfParambin; -#else - HRTFS_PARAMBIN_HANDLE hHrtfParambin; -#endif VBAP_HANDLE hVBAPdata; Word32 *hoa_dec_mtx; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index c3be6c73b..7c64d0e26 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -57,11 +57,7 @@ /* Maximum buffer length (total) in samples. */ #define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) -#ifdef NONBE_FIX_BINARY_BINAURAL_READING #define MAX_BIN_DELAY_SAMPLES 150 /* Maximum supported rendering latency for binaural IRs */ -#else -#define MAX_BIN_DELAY_SAMPLES 50 /* Maximum supported rendering latency for binaural IRs */ -#endif /*-------------------------------------------------------------------* * Local types @@ -210,7 +206,6 @@ typedef struct MASA_PREREND_HANDLE hMasaPrerend; } input_masa; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING typedef struct hrtf_handles { IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; @@ -218,7 +213,6 @@ typedef struct hrtf_handles IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; IVAS_DEC_HRTF_HANDLE hHrtfTD; } hrtf_handles; -#endif struct IVAS_REND { @@ -251,25 +245,14 @@ struct IVAS_REND RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ Word16 num_subframes; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING hrtf_handles hHrtfs; -#else - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; - IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; - IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; - IVAS_DEC_HRTF_HANDLE hHrtfTD; -#endif }; /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, hrtf_handles *hHrtfs ); -#else -static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig ); -#endif static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE *hMasaExtRendOut ); static void intermidiate_ext_dirac_render( @@ -1442,9 +1425,6 @@ static ivas_error initIsmMasaRendering( IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - inputIsm->tdRendWrapper.hHrtfTD = NULL; -#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -1468,10 +1448,8 @@ static ivas_error setRendInputActiveIsm( const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, RENDER_CONFIG_DATA *hRendCfg -#ifdef NONBE_FIX_BINARY_BINAURAL_READING , hrtf_handles *hrtfs -#endif ) { ivas_error error; @@ -1525,11 +1503,7 @@ static ivas_error setRendInputActiveIsm( #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING inputIsm->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; -#else - inputIsm->splitTdRendWrappers[i] = defaultTdRendWrapper(); -#endif } #endif @@ -1538,9 +1512,7 @@ static ivas_error setRendInputActiveIsm( error = IVAS_ERR_OK; move32(); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING inputIsm->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; -#endif test(); #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -1552,11 +1524,7 @@ static ivas_error setRendInputActiveIsm( #endif { #ifndef SPLIT_REND_WITH_HEAD_ROT -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -1706,11 +1674,7 @@ static ivas_error setRendInputActiveIsm( } ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -1747,18 +1711,12 @@ static void clearInputIsm( IF( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - inputIsm->tdRendWrapper.hHrtfTD = NULL; -#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { ivas_td_binaural_close_fx( &inputIsm->splitTdRendWrappers[i].hBinRendererTd ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - inputIsm->splitTdRendWrappers[i].hHrtfTD = NULL; -#endif } #endif @@ -2537,9 +2495,7 @@ static ivas_error initMcBinauralRendering( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IVAS_DEC_HRTF_CREND_HANDLE hMixconv, -#endif uint8_t reconfigureFlag ) { ivas_error error; @@ -2577,9 +2533,6 @@ static ivas_error initMcBinauralRendering( IF( !reconfigureFlag || ( !useTDRend && inputMc->tdRendWrapper.hBinRendererTd != NULL ) ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - inputMc->tdRendWrapper.hHrtfTD = NULL; -#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2590,9 +2543,6 @@ static ivas_error initMcBinauralRendering( IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - inputMc->splitTdRendWrappers[i].hHrtfTD = NULL; -#endif } } } @@ -2715,30 +2665,15 @@ static ivas_error initMcBinauralRendering( { /* open CREND */ #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - NULL, - outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), - IVAS_ERR_OK ) ) -#endif -#else -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, outSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - NULL, - outSampleRate ) ), - IVAS_ERR_OK ) ) - -#endif #endif { return error; @@ -2795,9 +2730,6 @@ static ivas_error initMcMasaRendering( IF( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - inputMc->tdRendWrapper.hHrtfTD = NULL; -#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2889,10 +2821,8 @@ static ivas_error setRendInputActiveMc( const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, RENDER_CONFIG_DATA *hRendCfg -#ifdef NONBE_FIX_BINARY_BINAURAL_READING , hrtf_handles *hrtfs -#endif ) { #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -2928,15 +2858,11 @@ static ivas_error setRendInputActiveMc( setZeroPanMatrix_fx( inputMc->panGains_fx ); inputMc->customLsInput = defaultCustomLs(); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( hrtfs->hHrtfTD ) { inputMc->tdRendWrapper.binaural_latency_ns = Mult_32_32( hrtfs->hHrtfTD->latency_s_fx, 1000000000 ); } inputMc->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; -#else - inputMc->tdRendWrapper = defaultTdRendWrapper(); -#endif inputMc->crendWrapper = NULL; inputMc->hReverb = NULL; inputMc->hMcMasa = NULL; @@ -2959,15 +2885,11 @@ static ivas_error setRendInputActiveMc( #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( hrtfs->hHrtfTD ) { inputMc->splitTdRendWrappers[i].binaural_latency_ns = Mult_32_32( hrtfs->hHrtfTD->latency_s_fx, 1000000000 ); } inputMc->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; -#else - inputMc->splitTdRendWrappers[i] = defaultTdRendWrapper(); -#endif } IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) @@ -2975,15 +2897,10 @@ static ivas_error setRendInputActiveMc( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, FALSE ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -3035,26 +2952,16 @@ static void clearInputMc( IF( inputMc->tdRendWrapper.hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - inputMc->tdRendWrapper.hHrtfTD = NULL; -#endif } #ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) { ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); inputMc->splitTdRendWrappers[i].hHrtfTD = NULL; } -#else - IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) - { - ivas_td_binaural_close_fx( &inputMc->splitTdRendWrappers[i].hBinRendererTd ); - } -#endif } #endif @@ -3152,18 +3059,11 @@ static ivas_error initSbaPanGainsForSbaOut( return error; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING static ivas_error updateSbaPanGains( input_sba *inputSba, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, IVAS_DEC_HRTF_CREND_HANDLE hMixconv ) -#else -static ivas_error updateSbaPanGains( - input_sba *inputSba, - const AUDIO_CONFIG outConfig, - RENDER_CONFIG_DATA *hRendCfg ) -#endif { ivas_error error; AUDIO_CONFIG inConfig; @@ -3225,21 +3125,12 @@ static ivas_error updateSbaPanGains( else #endif { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif -#else -#ifdef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif - #endif { return error; @@ -3253,18 +3144,10 @@ static ivas_error updateSbaPanGains( { return error; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING #ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif -#else -#ifdef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif #endif { return error; @@ -3316,10 +3199,8 @@ static ivas_error setRendInputActiveSba( const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, RENDER_CONFIG_DATA *hRendCfg -#ifdef NONBE_FIX_BINARY_BINAURAL_READING , hrtf_handles *hrtfs -#endif ) { @@ -3368,9 +3249,7 @@ static ivas_error setRendInputActiveSba( { initRotGains_fx( inputSba->rot_gains_prev_fx[pos_idx] ); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING inputSba->cldfbRendWrapper.hHrtfFastConv = hrtfs->hHrtfFastConv; -#endif #else initRotGains_fx( inputSba->rot_gains_prev_fx ); #endif @@ -3383,11 +3262,7 @@ static ivas_error setRendInputActiveSba( return error; } } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -3427,10 +3302,8 @@ static ivas_error setRendInputActiveMasa( const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, RENDER_CONFIG_DATA *hRendCfg -#ifdef NONBE_FIX_BINARY_BINAURAL_READING , hrtf_handles *hrtfs -#endif ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ { @@ -3483,11 +3356,7 @@ static ivas_error setRendInputActiveMasa( } ELSE { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hrtfs ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -3527,9 +3396,7 @@ ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, const Word32 outputSampleRate, const AUDIO_CONFIG outConfig, -#ifdef NONBE_FIX_BINARY_BINAURAL_READING const bool asHrtfBinary, -#endif const Word16 nonDiegeticPan, const Word32 nonDiegeticPanGain, /* Q31 */ const Word16 num_subframes ) @@ -3681,7 +3548,6 @@ ivas_error IVAS_REND_Open( move16(); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING hIvasRend->hHrtfs.hHrtfFastConv = NULL; hIvasRend->hHrtfs.hHrtfParambin = NULL; hIvasRend->hHrtfs.hHrtfTD = NULL; @@ -3705,7 +3571,6 @@ ivas_error IVAS_REND_Open( return error; } } -#endif return IVAS_ERR_OK; } @@ -3852,11 +3717,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Input inactive, skip. */ CONTINUE; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig, NULL ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -4237,11 +4098,7 @@ ivas_error IVAS_REND_AddInput_fx( Word32 maxNumInputsOfType; void *inputsArray; Word32 inputStructSize; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA *, hrtf_handles *hrtfs ); -#else - ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, RENDER_CONFIG_DATA * ); -#endif Word32 inputIndex; /* Validate function arguments */ @@ -4311,11 +4168,7 @@ ivas_error IVAS_REND_AddInput_fx( *inputId = makeInputId( inConfig, inputIndex ); move16(); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig, &hIvasRend->hHrtfs ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = activateInput( (UWord8 *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, hIvasRend->hRendererConfig ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -4381,15 +4234,10 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, FALSE ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -5220,15 +5068,10 @@ ivas_error IVAS_REND_SetHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, TRUE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -5332,16 +5175,10 @@ ivas_error IVAS_REND_DisableHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, TRUE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, TRUE ) ), - IVAS_ERR_OK ) ) - -#endif { return error; @@ -9498,7 +9335,6 @@ void IVAS_REND_Close( ivas_external_orientation_close_fx( &hIvasRend->hExternalOrientationData ); ivas_combined_orientation_close_fx( &hIvasRend->hCombinedOrientationData ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING /* Fastconv HRTF memories */ ivas_binaural_hrtf_close( &hIvasRend->hHrtfs.hHrtfFastConv ); @@ -9507,7 +9343,6 @@ void IVAS_REND_Close( ivas_HRTF_CRend_binary_close_fx( &( hIvasRend->hHrtfs.hSetOfHRTF ) ); ivas_HRTF_fastconv_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfFastConv ) ); ivas_HRTF_parambin_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfParambin ) ); -#endif free( hIvasRend ); *phIvasRend = NULL; @@ -9653,7 +9488,6 @@ void IVAS_REND_cldfbSynthesis_wrapper( #endif -#ifdef NONBE_FIX_BINARY_BINAURAL_READING /*---------------------------------------------------------------------* * IVAS_REND_GetHrtfHandle( ) * @@ -9740,7 +9574,6 @@ ivas_error IVAS_REND_GetHrtfParamBinHandle( return IVAS_ERR_OK; } -#endif static ivas_error ivas_masa_ext_rend_dirac_rend_init( input_masa *inputMasa ) @@ -10195,11 +10028,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( error = IVAS_ERR_OK; move32(); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING hHrtfParambin = *( inputMasa->hMasaExtRend->hHrtfParambin ); -#else - hHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; -#endif /* Set common variables and defaults */ output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); move32(); @@ -10374,10 +10203,8 @@ static ivas_error ivas_masa_ext_rend_parambin_init( static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig -#ifdef NONBE_FIX_BINARY_BINAURAL_READING , hrtf_handles *hrtfs -#endif ) { Word16 i; @@ -10408,11 +10235,7 @@ static ivas_error initMasaExtRenderer( hMasaExtRend->hDiracDecBin = NULL; #endif hMasaExtRend->hReverb = NULL; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING hMasaExtRend->hHrtfParambin = &hrtfs->hHrtfParambin; -#else - hMasaExtRend->hHrtfParambin = NULL; -#endif hMasaExtRend->hVBAPdata = NULL; hMasaExtRend->hoa_dec_mtx = NULL; @@ -10511,11 +10334,7 @@ static ivas_error initMasaExtRenderer( { IF( NE_16( hMasaExtRend->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &inputMasa->hMasaExtRend->hHrtfParambin ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -10609,11 +10428,7 @@ static void freeMasaExtRenderer( IF( hMasaExtRend->hHrtfParambin != NULL ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING ivas_HRTF_parambin_binary_close_fx( hMasaExtRend->hHrtfParambin ); -#else - ivas_HRTF_parambin_binary_close_fx( &hMasaExtRend->hHrtfParambin ); -#endif } IF( hMasaExtRend->hVBAPdata != NULL ) diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index eea8a9548..50663f936 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -116,9 +116,7 @@ ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ const Word32 outputSampleRate, /* i : output sampling rate */ const IVAS_AUDIO_CONFIG outConfig, /* i : output audio config */ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING const bool asHrtfBinary, /* i : load hrtf binary file */ -#endif const Word16 nonDiegeticPan, /* i : non-diegetic object flag */ const Word32 nonDiegeticPanGain, /* i : non-diegetic panning gain Q31 */ const Word16 num_subframes /* i : number of subframes */ @@ -193,7 +191,6 @@ ivas_error IVAS_REND_GetDelay( int32_t *timeScale /* o : Time scale of the delay, equal to renderer output sampling rate */ ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING /*! r: error code */ ivas_error IVAS_REND_GetHrtfHandle( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ @@ -215,7 +212,6 @@ ivas_error IVAS_REND_GetHrtfParamBinHandle( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ ); -#endif /* Functions to be called during rendering */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 34f644c90..c99e19183 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -824,11 +824,7 @@ static ivas_error load_reverb_from_binary( return header_check_result; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; -#else - return IVAS_ERR_FAILED_FILE_READ; -#endif } return IVAS_ERR_OK; @@ -863,9 +859,6 @@ static ivas_error TDREND_MIX_LoadHRTF( ) { int16_t tmp; -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - ivas_error error; -#endif bool is_tdrend; ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; @@ -874,15 +867,10 @@ static ivas_error TDREND_MIX_LoadHRTF( int32_t hrtf_data_size_max; char *hrtf_data; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING header_check_result = IVAS_ERR_OK; -#else - error = IVAS_ERR_OK; -#endif if ( ( header_check_result = read_and_check_hrtf_binary_file_header( &hrtfs_file_header, f_hrtf ) ) != IVAS_ERR_OK ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING /* try if it is old format for BE tests*/ fseek( f_hrtf, 0, SEEK_SET ); @@ -903,7 +891,6 @@ static ivas_error TDREND_MIX_LoadHRTF( } return header_check_result; -#endif } is_tdrend = FALSE; @@ -961,35 +948,19 @@ static ivas_error TDREND_MIX_LoadHRTF( if ( HrFiltSet_p->FilterMethod != TDREND_HRFILT_Method_BSplineModel ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING header_check_result = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); -#else - error = IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "The HR filter set file is not a supported type." ); -#endif } else { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); -#else - error = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); -#endif } } else { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; -#else - return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "HR filter not found in binary file." ); -#endif } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING return header_check_result; -#else - return error; -#endif } @@ -1080,7 +1051,6 @@ static void HRTF_energy_sections_precalc( return; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING /*---------------------------------------------------------------------* * dealloc_HRTF_binary() * @@ -1161,87 +1131,6 @@ void destroy_td_hrtf( return; } -#else -/*---------------------------------------------------------------------* - * dealloc_HRTF_binary() - * - * Deallocated memory allocated by load_HRTF_binary - *---------------------------------------------------------------------*/ - -ivas_error dealloc_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf /* i/o: HRTF handle */ -) -{ - int16_t i; - ivas_error error; - error = IVAS_ERR_OK; - - if ( hHrtf == NULL ) - { - return error; - } - - if ( !hHrtf->ModelParams.modelROM ) - { - if ( hHrtf->ModelParams.UseItdModel ) - { - free( hHrtf->ModelParamsITD.elevKSeq_dyn_fx ); - free( hHrtf->ModelParamsITD.azimKSeq_dyn_fx ); - free( hHrtf->ModelParamsITD.W_dyn_fx ); - free( hHrtf->ModelParamsITD.azimBsShape_dyn_fx ); - free( hHrtf->ModelParamsITD.elevBsShape_dyn_fx ); - } - free( hHrtf->ModelParams.elevKSeq_dyn_fx ); - free( hHrtf->ModelParams.azim_start_idx_dyn ); - free( hHrtf->ModelParams.azimDim2_dyn ); - free( hHrtf->ModelParams.azimDim3_dyn ); - free( hHrtf->ModelParams.AlphaL_dyn_fx ); - free( hHrtf->ModelParams.AlphaR_dyn_fx ); - free( hHrtf->ModelParams.azimSegSamples_dyn ); - - free( hHrtf->ModelParams.azimShapeIdx_dyn ); - free( hHrtf->ModelParams.azimShapeSampFactor_dyn ); - free( hHrtf->ModelParams.elevBsShape_dyn_fx ); - - for ( i = 0; i < hHrtf->ModelParams.num_unique_azim_splines; i++ ) - { - free( hHrtf->ModelParams.azimBsShape_dyn_fx[i] ); - free( &hHrtf->ModelParams.azimBsShape_dyn_fx[i] ); - } - - free( (void *) hHrtf->ModelParams.azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */ - FOR( i = 0; i < hHrtf->ModelParams.elevDim3; i++ ) - { - free( hHrtf->ModelParams.azimKSeq_fx[i] ); - } - free( hHrtf->ModelParams.azimKSeq_fx ); - - free( hHrtf->ModelParams.EL_dyn_fx ); - free( hHrtf->ModelParams.ER_dyn_fx ); - free( hHrtf->ModelEval.hrfModL_fx ); - free( hHrtf->ModelEval.hrfModR_fx ); - - for ( i = 0; i < 3; i++ ) - { - free( hHrtf->lr_energy_and_iac_dyn_fx[i] ); - } - } -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB - else - { - for ( i = 0; i < 3; i++ ) - { - if ( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ) - { - free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); - } - } - } -#endif - - return error; -} -#endif /*---------------------------------------------------------------------* * create_HRTF_from_rawdata() @@ -1266,11 +1155,7 @@ static ivas_error create_HRTF_from_rawdata( { if ( ( ( *hHRTF ) = (HRTFS_HANDLE) malloc( sizeof( HRTFS_DATA ) ) ) == NULL ) { -#ifdef NONBE_FIX_BINARY_BINAURAL_READING return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF binary data\n" ); -#else - return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Can not allocate memory for HRTF binary data\n" ); -#endif } if ( ( error = ivas_hrtf_init( *hHRTF ) ) != IVAS_ERR_OK ) @@ -1283,9 +1168,7 @@ static ivas_error create_HRTF_from_rawdata( return IVAS_ERR_INTERNAL; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING ( *hHRTF )->init_from_rom = 0; -#endif hrtf_data_rptr = hrtf_data; /* latency_s */ @@ -1573,7 +1456,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( hrtf_data_rptr = hrtf_data; -#if !defined NONBE_FIX_BINARY_BINAURAL_READING || !defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if !defined USE_NEW_HRTF_BINARY_FILE_FORMAT /* BINAURAL_CONVBANDS */ if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { @@ -1592,7 +1475,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( f_tmp = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); ( *hHRTF )->FASTCONV_HRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); -#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1660,7 +1543,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ( *hHRTF )->FASTCONV_HOA3_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); -#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1727,7 +1610,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ( *hHRTF )->FASTCONV_HOA2_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); -#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1795,7 +1678,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ( *hHRTF )->FASTCONV_FOA_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); -#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1863,7 +1746,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( ( *hHRTF )->FASTCONV_BRIR_latency_s_fx = (Word32) ( f_tmp * 1000000000 ); hrtf_data_rptr += sizeof( float ); -#if defined NONBE_FIX_BINARY_BINAURAL_READING && defined USE_NEW_HRTF_BINARY_FILE_FORMAT +#if defined USE_NEW_HRTF_BINARY_FILE_FORMAT if ( BINAURAL_CONVBANDS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_CONVBANDS)" ); @@ -1969,9 +1852,7 @@ ivas_error load_fastconv_HRTF_from_binary( ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING int16_t asFastconv = 0; -#endif f_hrtf = hrtfReader->file; @@ -2021,9 +1902,7 @@ ivas_error load_fastconv_HRTF_from_binary( free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING asFastconv = 1; -#endif } else { @@ -2032,7 +1911,6 @@ ivas_error load_fastconv_HRTF_from_binary( } free( hrtf_data ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( asFastconv ) { return IVAS_ERR_OK; @@ -2041,9 +1919,6 @@ ivas_error load_fastconv_HRTF_from_binary( { return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; } -#else - return IVAS_ERR_OK; -#endif } @@ -2147,9 +2022,7 @@ ivas_error load_parambin_HRTF_from_binary( ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; int16_t hrtf_id; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING int16_t asParam = 0; -#endif f_hrtf = hrtfReader->file; @@ -2203,9 +2076,7 @@ ivas_error load_parambin_HRTF_from_binary( free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create HRTF from binary file" ); } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING asParam = 1; -#endif } else { @@ -2213,7 +2084,6 @@ ivas_error load_parambin_HRTF_from_binary( } } free( hrtf_data ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( asParam ) { return IVAS_ERR_OK; @@ -2222,9 +2092,6 @@ ivas_error load_parambin_HRTF_from_binary( { return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; } -#else - return IVAS_ERR_OK; -#endif } @@ -2338,15 +2205,6 @@ ivas_error create_SetOfHRTF_from_binary( } free( hrtf_data ); -#ifndef NONBE_FIX_BINARY_BINAURAL_READING - if ( ( ( *hSetOfHRTF ).hHRTF_hrir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_brir_combined == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_foa == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 == NULL ) || ( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 == NULL ) ) - { - if ( destroy_SetOfHRTF( hSetOfHRTF ) != IVAS_ERR_OK ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Could not create all the HRTF from binary file" ); - } - } -#endif return IVAS_ERR_OK; } @@ -2356,24 +2214,16 @@ ivas_error create_SetOfHRTF_from_binary( * Destroy the HRTF CRend handle *---------------------------------------------------------------------*/ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING static void destroy_HRTF -#else -static ivas_error destroy_HRTF -#endif ( HRTFS_HANDLE *hHRTF /* i/o: HRTF CRend handle */ ) { uint16_t i, j; -#ifdef NONBE_FIX_BINARY_BINAURAL_READING test(); test(); IF( *hHRTF != NULL && hHRTF != NULL && ( *hHRTF )->init_from_rom == 0 ) -#else - IF( *hHRTF != NULL && hHRTF != NULL ) -#endif { FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { @@ -2413,11 +2263,7 @@ static ivas_error destroy_HRTF *hHRTF = NULL; } -#ifdef NONBE_FIX_BINARY_BINAURAL_READING return; -#else - return IVAS_ERR_OK; -#endif } #ifdef FIX_OLD_BINARY_FORMAT @@ -2449,7 +2295,6 @@ void cleanup_SetOfHRTF( * * Destroy the HRTF data set. *---------------------------------------------------------------------*/ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING void destroy_SetOfHRTF( HRTFS_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ ) @@ -2504,20 +2349,3 @@ void destroy_parambin_hrtf( return; } -#else -ivas_error destroy_SetOfHRTF( - HRTFS_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ -) -{ - if ( hSetOfHRTF != NULL ) - { - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) ); - destroy_HRTF( &( hSetOfHRTF->hHRTF_brir_combined ) ); - } - - return IVAS_ERR_OK; -} -#endif diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index d1abd9b75..9a06a4e3b 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -138,15 +138,9 @@ void cleanup_SetOfHRTF( *---------------------------------------------------------------------*/ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING void destroy_SetOfHRTF( IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ ); -#else -ivas_error destroy_SetOfHRTF( - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF /* i/o: Set of HRTF CRend handle */ -); -#endif /*---------------------------------------------------------------------* * load_fastconv_HRTF_from_binary() @@ -159,7 +153,6 @@ ivas_error load_fastconv_HRTF_from_binary( const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ); -#ifdef NONBE_FIX_BINARY_BINAURAL_READING /*---------------------------------------------------------------------* * destroy_fastconv_hrtf() * @@ -169,7 +162,6 @@ ivas_error load_fastconv_HRTF_from_binary( void destroy_fastconv_hrtf( IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv /* i/o: FastConv HRTF handle */ ); -#endif /*---------------------------------------------------------------------* * load_parambin_HRTF_from_binary() @@ -188,7 +180,6 @@ ivas_error load_parambin_HRTF_from_binary( * * Deallocated memory allocated by load_HRTF_binary *---------------------------------------------------------------------*/ -#ifdef NONBE_FIX_BINARY_BINAURAL_READING /*---------------------------------------------------------------------* * destroy_parambin_hrtf() * @@ -209,9 +200,4 @@ void destroy_td_hrtf( IVAS_DEC_HRTF_HANDLE *hHRTF /* i/o: HRTF handle */ ); -#else -ivas_error dealloc_HRTF_binary( - IVAS_DEC_HRTF_HANDLE hHrtf /* i/o: HRTF handle */ -); -#endif #endif /* IVAS_HRTF_FILE_READER_H */ -- GitLab From 66e7be5f895ff35a1aa115a4cea7428f1b921754 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:16 +0200 Subject: [PATCH 0629/1310] [cleanup] accept NONBE_FIX_935_EARLY_REFLECTIONS_WRONG_ORDER --- lib_com/options.h | 1 - lib_rend/ivas_reflections_fx.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f19e13466..ee3052ee1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,7 +95,6 @@ #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ #define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ #define NONBE_FIX_952_MC_PARAMUPMIX_5MS /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/ -#define NONBE_FIX_935_EARLY_REFLECTIONS_WRONG_ORDER /* Qualcomm: issue 953: fix order or ER channels in LC mode*/ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ diff --git a/lib_rend/ivas_reflections_fx.c b/lib_rend/ivas_reflections_fx.c index 9344a5872..fb3e86585 100644 --- a/lib_rend/ivas_reflections_fx.c +++ b/lib_rend/ivas_reflections_fx.c @@ -56,17 +56,9 @@ static UWord16 LC_mixing_7_1[7] = { 0, 1, 2, 3, 4, 3, 4 }; static UWord16 LC_mixing_5_1_2[7] = { 0, 1, 2, 3, 4, 0, 1 }; -#ifdef NONBE_FIX_935_EARLY_REFLECTIONS_WRONG_ORDER static UWord16 LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 3, 4 }; -#else -static UWord16 LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 2, 3 }; -#endif -#ifdef NONBE_FIX_935_EARLY_REFLECTIONS_WRONG_ORDER static UWord16 LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 3, 4 }; -#else -static UWord16 LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; -#endif /*-----------------------------------------------------------------------------------------* -- GitLab From 6bc30f24638970b35f9b57898c4d8d1259e063aa Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:19 +0200 Subject: [PATCH 0630/1310] [cleanup] accept NONBE_FIX_935_SBA_REVERB --- lib_com/options.h | 1 - lib_dec/ivas_output_config_fx.c | 8 -------- lib_dec/ivas_sba_dec_fx.c | 8 -------- lib_dec/ivas_spar_decoder_fx.c | 6 ------ 4 files changed, 23 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ee3052ee1..133713018 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -98,7 +98,6 @@ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ -#define NONBE_FIX_935_SBA_REVERB /* FhG: issue 935: fix MSAN error for SBA related to BINAURAL_ROOM_REVERB */ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index 8afd003be..bd30680da 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -158,19 +158,11 @@ void ivas_renderer_select( move16(); test(); -#ifdef NONBE_FIX_935_SBA_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) #else IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) #endif -#else -#ifdef SPLIT_REND_WITH_HEAD_ROT - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif -#endif /* NONBE_FIX_935_SBA_REVERB */ { *renderer_type = RENDERER_BINAURAL_FASTCONV; move16(); diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index cc78652e6..24abcb667 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -216,19 +216,11 @@ ivas_error ivas_sba_dec_reconfigure_fx( ELSE { test(); -#ifdef NONBE_FIX_935_SBA_REVERB #ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) #else IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) #endif -#else -#ifdef SPLIT_REND_WITH_HEAD_ROT - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif -#endif /* NONBE_FIX_935_SBA_REVERB */ { renderer_type_new = RENDERER_BINAURAL_FASTCONV; move16(); diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index b95a93678..2c425ad72 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -294,14 +294,8 @@ ivas_error ivas_spar_dec_open_fx( test(); test(); -#ifdef NONBE_FIX_935_SBA_REVERB IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) -#else - test(); - - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) -#endif { /* get correct granularity in case of binaural rendering of the discrete objects with the td obj renderer */ Word32 quo, rem; -- GitLab From 0a4741371d4a5b204ed2d5bbcea673ee306cc028 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:22 +0200 Subject: [PATCH 0631/1310] [cleanup] accept NONBE_FIX_952_MC_PARAMUPMIX_5MS --- lib_com/options.h | 1 - lib_dec/ivas_mc_paramupmix_dec_fx.c | 20 -------------------- 2 files changed, 21 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 133713018..3ec7754da 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -94,7 +94,6 @@ #endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ #define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ -#define NONBE_FIX_952_MC_PARAMUPMIX_5MS /* Dlb : issue 952 : Differences between 5ms and 20ms rendering for ParamUpmix*/ #define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index 0cb6a5796..d05912e6e 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -119,13 +119,11 @@ void ivas_mc_paramupmix_dec_read_BS( } } -#ifdef NONBE_FIX_952_MC_PARAMUPMIX_5MS FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { Copy32( hMCParamUpmix->alpha_prev_fx[i], hMCParamUpmix->alpha_sf_fx[i], IVAS_MAX_NUM_BANDS ); Copy32( hMCParamUpmix->beta_prev_fx[i], hMCParamUpmix->beta_sf_fx[i], IVAS_MAX_NUM_BANDS ); } -#endif hMCParamUpmix->first_frame = 1; move16(); @@ -155,7 +153,6 @@ void ivas_mc_paramupmix_dec_read_BS( move32(); -#ifdef NONBE_FIX_952_MC_PARAMUPMIX_5MS IF( EQ_16( hMCParamUpmix->first_frame, 0 ) ) { FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) @@ -164,7 +161,6 @@ void ivas_mc_paramupmix_dec_read_BS( Copy32( hMCParamUpmix->betas_fx[i], hMCParamUpmix->beta_prev_fx[i], IVAS_MAX_NUM_BANDS ); } } -#endif FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { @@ -189,13 +185,11 @@ void ivas_mc_paramupmix_dec_read_BS( move16(); } -#ifdef NONBE_FIX_952_MC_PARAMUPMIX_5MS FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { Copy32( hMCParamUpmix->alpha_prev_fx[i], hMCParamUpmix->alpha_sf_fx[i], IVAS_MAX_NUM_BANDS ); Copy32( hMCParamUpmix->beta_prev_fx[i], hMCParamUpmix->beta_sf_fx[i], IVAS_MAX_NUM_BANDS ); } -#endif } pop_wmops(); @@ -286,13 +280,6 @@ void ivas_mc_paramupmix_dec_render( } { -#ifndef NONBE_FIX_952_MC_PARAMUPMIX_5MS - FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) - { - Copy32( hMCParamUpmix->alpha_prev_fx[ch], hMCParamUpmix->alpha_sf_fx[ch], IVAS_MAX_NUM_BANDS ); - Copy32( hMCParamUpmix->beta_prev_fx[ch], hMCParamUpmix->beta_sf_fx[ch], IVAS_MAX_NUM_BANDS ); - } -#endif FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { @@ -310,13 +297,6 @@ void ivas_mc_paramupmix_dec_render( ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); } -#ifndef NONBE_FIX_952_MC_PARAMUPMIX_5MS - FOR( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) - { - Copy32( hMCParamUpmix->alphas_fx[ch], hMCParamUpmix->alpha_prev_fx[ch], IVAS_MAX_NUM_BANDS ); - Copy32( hMCParamUpmix->betas_fx[ch], hMCParamUpmix->beta_prev_fx[ch], IVAS_MAX_NUM_BANDS ); - } -#endif } *nSamplesAvailable = imult1616( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), (Word16) slot_size ); -- GitLab From a3fa5fa44bbf894fb2d731cb8d25968accabcb4f Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:25 +0200 Subject: [PATCH 0632/1310] [cleanup] accept NONBE_FIX_967_ISM_MONO_DMX --- lib_com/ivas_prot_fx.h | 4 ---- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 12 ------------ lib_dec/ivas_mono_dmx_renderer_fx.c | 18 ------------------ 4 files changed, 35 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 1d593881a..4edcf0480 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1160,11 +1160,7 @@ void ivas_apply_non_diegetic_panning_fx( const Word16 output_frame /* i : output frame length per channel */ ); -#ifdef NONBE_FIX_967_ISM_MONO_DMX void ivas_ism_mono_dmx_fx( -#else -void ivas_mono_downmix_render_passive_fx( -#endif Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono output */ const Word16 output_frame /* i : output frame length */ diff --git a/lib_com/options.h b/lib_com/options.h index 3ec7754da..92da4f161 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -94,7 +94,6 @@ #endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ #define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ -#define NONBE_FIX_967_ISM_MONO_DMX /* FhG: issue 967: accumulating energies in ISM mono DMX */ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 8ae516d7c..9038dfb4b 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -265,11 +265,7 @@ ivas_error ivas_jbm_dec_tc_fx( test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) { -#ifdef NONBE_FIX_967_ISM_MONO_DMX ivas_ism_mono_dmx_fx( st_ivas, p_output_fx, output_frame ); -#else - ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); -#endif Scale_sig32( p_output_fx[0], L_FRAME48k, 3 ); } @@ -798,11 +794,7 @@ ivas_error ivas_jbm_dec_tc_fx( move16(); IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) { -#ifdef NONBE_FIX_967_ISM_MONO_DMX ivas_ism_mono_dmx_fx( st_ivas, p_output_fx, output_frame ); -#else - ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); -#endif output_q = 8; move16(); @@ -1090,11 +1082,7 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) { -#ifdef NONBE_FIX_967_ISM_MONO_DMX ivas_ism_mono_dmx_fx( st_ivas, p_output_fx, output_frame ); -#else - ivas_mono_downmix_render_passive_fx( st_ivas, p_output_fx, output_frame ); -#endif Scale_sig32( p_output_fx[0], L_FRAME48k, Q11 - Q8 ); // Q11 diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 1d24e0153..52940fc98 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -46,12 +46,7 @@ * Local constants *------------------------------------------------------------------------*/ #define DOWNMIX_ALPHA_FX 31130 /* Smoothing coefficient alpha */ -#ifdef NONBE_FIX_967_ISM_MONO_DMX #define DOWNMIX_ONE_MINUS_ALPHA_FX 1638 /* Smoothing coefficient (1 - alpha) */ -#endif -#ifndef NONBE_FIX_967_ISM_MONO_DMX -#define MONO_DOWNMIX_RENDERER_MAX_INPUT_CHANS 4 -#endif /*------------------------------------------------------------------------- * ivas_mono_dmx_renderer_open() @@ -111,11 +106,7 @@ void ivas_mono_dmx_renderer_close( * * Downmix process *------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_967_ISM_MONO_DMX void ivas_ism_mono_dmx_fx( -#else -void ivas_mono_downmix_render_passive_fx( -#endif Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word32 *output_f_fx[], /* i/o: synthesized core-coder transport channels/mono output Qin = 11/ Qout = 8*/ const Word16 output_frame /* i : output frame length */ @@ -170,13 +161,6 @@ void ivas_mono_downmix_render_passive_fx( v_add_32( output_shr, proto_signal_fx, proto_signal_fx, output_frame ); } -#ifndef NONBE_FIX_967_ISM_MONO_DMX - /* compute the input energy, proto energy after smoothing */ - hDownmix->inputEnergy_fx = Mpy_32_16_1( hDownmix->inputEnergy_fx, DOWNMIX_ALPHA_FX ); - move32(); - hDownmix->protoEnergy_fx = Mpy_32_16_1( hDownmix->protoEnergy_fx, DOWNMIX_ALPHA_FX ); - move32(); -#endif proto_norm = L_norm_arr( proto_signal_fx, output_frame ); @@ -197,7 +181,6 @@ void ivas_mono_downmix_render_passive_fx( } } -#ifdef NONBE_FIX_967_ISM_MONO_DMX hDownmix->inputEnergy_fx = Mpy_32_16_1( hDownmix->inputEnergy_fx, DOWNMIX_ALPHA_FX ); move32(); hDownmix->protoEnergy_fx = Mpy_32_16_1( hDownmix->protoEnergy_fx, DOWNMIX_ALPHA_FX ); @@ -205,7 +188,6 @@ void ivas_mono_downmix_render_passive_fx( protoEner_pre = Mpy_32_16_1( protoEner_pre, DOWNMIX_ONE_MINUS_ALPHA_FX ); inputEner_pre = Mpy_32_16_1( inputEner_pre, DOWNMIX_ONE_MINUS_ALPHA_FX ); -#endif /* compute the eq factor */ -- GitLab From 99cb359a6df468e553a012f76fe736a2b030dcb7 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:32:28 +0200 Subject: [PATCH 0633/1310] [cleanup] accept NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX --- lib_com/options.h | 1 - lib_dec/ivas_ism_renderer_fx.c | 30 ------------------------------ 2 files changed, 31 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 92da4f161..53cac6f84 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -95,7 +95,6 @@ #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ #define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ -#define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 7f4f32731..7fcb10635 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -171,7 +171,6 @@ void ivas_ism_render_sf_fx( Word32 gain_fx, prev_gain_fx; Word32 tc_local_fx[MAX_NUM_OBJECTS][L_FRAME48k]; Word32 *p_tc_fx[MAX_NUM_OBJECTS]; -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX Word16 ism_md_subframe_update_jbm, slots_to_render, first_sf, last_sf, subframe_idx; Word16 n_samples_rendered_loop; @@ -189,7 +188,6 @@ void ivas_ism_render_sf_fx( slots_to_render = sub( slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf] ); last_sf = add( last_sf, 1 ); } -#endif num_objects = st_ivas->nchan_transport; move16(); @@ -207,7 +205,6 @@ void ivas_ism_render_sf_fx( interp_offset = st_ivas->hTcBuffer->n_samples_rendered; move16(); -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* Number of subframes to delay metadata to sync with audio */ IF( st_ivas->hDecoderConfig->Opt_delay_comp ) { @@ -217,7 +214,6 @@ void ivas_ism_render_sf_fx( { ism_md_subframe_update_jbm = sub( st_ivas->hTcBuffer->nb_subframes, 2 ); } -#endif IF( st_ivas->hDecoderConfig->Opt_tsm ) { @@ -241,21 +237,15 @@ void ivas_ism_render_sf_fx( } -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_in_subframe; n_samples_in_subframe = st_ivas->hTcBuffer->n_samples_granularity * st_ivas->hTcBuffer->subframe_nbslots[subframe_idx]; -#endif test(); IF( st_ivas->hCombinedOrientationData && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) { -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_in_subframe, n_samples_in_subframe, st_ivas->hIsmRendererData->interpolator_fx ); -#else - ivas_jbm_dec_get_adapted_linear_interpolator_fx( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator_fx ); -#endif interp_offset = 0; move16(); } @@ -266,7 +256,6 @@ void ivas_ism_render_sf_fx( test(); IF( st_ivas->hCombinedOrientationData != NULL && EQ_16( st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx], 1 ) ) { -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX if ( GE_16( subframe_idx, ism_md_subframe_update_jbm ) ) { rotateAziEle_fx( extract_l( L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, 22 ) ), extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, 22 ) ), &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat_fx[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); @@ -275,9 +264,6 @@ void ivas_ism_render_sf_fx( { rotateAziEle_fx( extract_l( L_shr( st_ivas->hIsmMetaData[i]->last_azimuth_fx, 22 ) ), extract_l( L_shr( st_ivas->hIsmMetaData[i]->last_elevation_fx, 22 ) ), &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat_fx[st_ivas->hCombinedOrientationData->subframe_idx], st_ivas->hIntSetup.is_planar_setup ); } -#else - rotateAziEle_fx( extract_l( L_shr( st_ivas->hIsmMetaData[i]->azimuth_fx, 22 ) ), extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, 22 ) ), &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); -#endif IF( st_ivas->hEFAPdata != NULL ) { @@ -313,18 +299,10 @@ void ivas_ism_render_sf_fx( { g1_fx = &st_ivas->hIsmRendererData->interpolator_fx[interp_offset]; tc_fx = p_tc_fx[i]; -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX FOR( k = 0; k < n_samples_in_subframe; k++ ) -#else - FOR( k = 0; k < n_samples_to_render; k++ ) -#endif { g2_fx = sub( 32767, *g1_fx ); // 32767 = (1.0f in Q15) - 1 -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX output_fx[j2][k + n_samples_rendered_loop] = L_add( output_fx[j2][k + n_samples_rendered_loop], L_shl( Mpy_32_32( L_add( Mpy_32_16_1( gain_fx, *( g1_fx++ ) ), Mpy_32_16_1( prev_gain_fx, g2_fx ) ), *( tc_fx++ ) ), 1 ) ); // Q11( (30+15+1-16) + 11 -31 +1) -#else - output_fx[j2][k] = L_add( output_fx[j2][k], L_shl( Mpy_32_32( L_add( Mpy_32_16_1( gain_fx, *( g1_fx++ ) ), Mpy_32_16_1( prev_gain_fx, g2_fx ) ), *( tc_fx++ ) ), 1 ) ); // Q11( (30+15+1-16) + 11 -31 +1) -#endif move16(); } } @@ -337,19 +315,12 @@ void ivas_ism_render_sf_fx( move32(); } } -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX p_tc_fx[i] += n_samples_in_subframe; -#endif } /* update combined orientation access index */ -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); -#else - ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_to_render ); -#endif -#ifdef NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX n_samples_rendered_loop = add( n_samples_rendered_loop, n_samples_in_subframe ); IF( EQ_16( st_ivas->renderer_type, RENDERER_TD_PANNING ) ) { @@ -359,7 +330,6 @@ void ivas_ism_render_sf_fx( tc_offset = add( tc_offset, n_samples_in_subframe ); interp_offset = add( interp_offset, n_samples_in_subframe ); } -#endif return; } -- GitLab From 8eff3c5b4fe85d4340212e7ee19ccc8d98f6dd18 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 13:34:54 +0200 Subject: [PATCH 0634/1310] formatting --- lib_dec/ivas_ism_renderer_fx.c | 2 +- lib_dec/ivas_mc_paramupmix_dec_fx.c | 1 - lib_dec/ivas_mono_dmx_renderer_fx.c | 4 ++-- lib_dec/lib_dec_fx.c | 8 ++++---- lib_rend/ivas_stat_rend.h | 6 +++--- lib_rend/lib_rend.c | 26 +++++++++----------------- lib_util/hrtf_file_reader.c | 7 +++---- 7 files changed, 22 insertions(+), 32 deletions(-) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 7fcb10635..1a3fc4164 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -301,7 +301,7 @@ void ivas_ism_render_sf_fx( tc_fx = p_tc_fx[i]; FOR( k = 0; k < n_samples_in_subframe; k++ ) { - g2_fx = sub( 32767, *g1_fx ); // 32767 = (1.0f in Q15) - 1 + g2_fx = sub( 32767, *g1_fx ); // 32767 = (1.0f in Q15) - 1 output_fx[j2][k + n_samples_rendered_loop] = L_add( output_fx[j2][k + n_samples_rendered_loop], L_shl( Mpy_32_32( L_add( Mpy_32_16_1( gain_fx, *( g1_fx++ ) ), Mpy_32_16_1( prev_gain_fx, g2_fx ) ), *( tc_fx++ ) ), 1 ) ); // Q11( (30+15+1-16) + 11 -31 +1) move16(); } diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index d05912e6e..eab782f8b 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -296,7 +296,6 @@ void ivas_mc_paramupmix_dec_render( /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_sf ); } - } *nSamplesAvailable = imult1616( sub( st_ivas->hTcBuffer->num_slots, st_ivas->hTcBuffer->slots_rendered ), (Word16) slot_size ); diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 52940fc98..66b14cc56 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -45,8 +45,8 @@ /*------------------------------------------------------------------------- * Local constants *------------------------------------------------------------------------*/ -#define DOWNMIX_ALPHA_FX 31130 /* Smoothing coefficient alpha */ -#define DOWNMIX_ONE_MINUS_ALPHA_FX 1638 /* Smoothing coefficient (1 - alpha) */ +#define DOWNMIX_ALPHA_FX 31130 /* Smoothing coefficient alpha */ +#define DOWNMIX_ONE_MINUS_ALPHA_FX 1638 /* Smoothing coefficient (1 - alpha) */ /*------------------------------------------------------------------------- * ivas_mono_dmx_renderer_open() diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 7ead34cca..63f0ab53f 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2511,7 +2511,7 @@ ivas_error IVAS_DEC_FeedCustomLsData( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ ) { @@ -2535,7 +2535,7 @@ ivas_error IVAS_DEC_GetHrtfHandle( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfCRendHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ ) { @@ -2559,7 +2559,7 @@ ivas_error IVAS_DEC_GetHrtfCRendHandle( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfFastConvHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ ) { @@ -2583,7 +2583,7 @@ ivas_error IVAS_DEC_GetHrtfFastConvHandle( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetHrtfParamBinHandle( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ ) { diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 69351bae8..cc1565943 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -847,7 +847,7 @@ typedef struct ivas_combined_orientation_struct #ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Rmat_prev_fx[MAX_HEAD_ROT_POSES][3][3]; #else - Word32 Rmat_prev_fx[3][3]; /* Q30 */ + Word32 Rmat_prev_fx[3][3]; /* Q30 */ #endif Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ /* Q(q_chEneIIR) */ Word16 q_chEneIIR; @@ -1294,8 +1294,8 @@ typedef struct ivas_binaural_td_rendering_struct TDREND_SRC_t *Sources[MAX_NUM_TDREND_CHANNELS]; Word16 Gain_fx; /* Q14 */ - TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ - TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ + TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ + TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ TDREND_HRFILT_FiltSet_t **pHrFiltSet_p; /* pointer to HR filter set */ Word16 UseCommonDistAttenModel; /* Use common dist atten model (TRUE/FALSE) */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7c64d0e26..12fb2c524 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -56,7 +56,7 @@ *-------------------------------------------------------------------*/ /* Maximum buffer length (total) in samples. */ -#define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) +#define MAX_BUFFER_LENGTH ( MAX_BUFFER_LENGTH_PER_CHANNEL * MAX_INPUT_CHANNELS ) #define MAX_BIN_DELAY_SAMPLES 150 /* Maximum supported rendering latency for binaural IRs */ /*-------------------------------------------------------------------* @@ -1447,10 +1447,8 @@ static ivas_error setRendInputActiveIsm( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg - , - hrtf_handles *hrtfs -) + RENDER_CONFIG_DATA *hRendCfg, + hrtf_handles *hrtfs ) { ivas_error error; rendering_context rendCtx; @@ -2820,10 +2818,8 @@ static ivas_error setRendInputActiveMc( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg - , - hrtf_handles *hrtfs -) + RENDER_CONFIG_DATA *hRendCfg, + hrtf_handles *hrtfs ) { #ifdef SPLIT_REND_WITH_HEAD_ROT Word16 i; @@ -3198,8 +3194,7 @@ static ivas_error setRendInputActiveSba( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg - , + RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hrtfs ) @@ -3301,8 +3296,7 @@ static ivas_error setRendInputActiveMasa( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - RENDER_CONFIG_DATA *hRendCfg - , + RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hrtfs ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ @@ -10202,10 +10196,8 @@ static ivas_error ivas_masa_ext_rend_parambin_init( static ivas_error initMasaExtRenderer( input_masa *inputMasa, - const AUDIO_CONFIG outConfig - , - hrtf_handles *hrtfs -) + const AUDIO_CONFIG outConfig, + hrtf_handles *hrtfs ) { Word16 i; ivas_error error; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index c99e19183..ee103db2d 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -2214,10 +2214,9 @@ ivas_error create_SetOfHRTF_from_binary( * Destroy the HRTF CRend handle *---------------------------------------------------------------------*/ -static void destroy_HRTF - ( - HRTFS_HANDLE *hHRTF /* i/o: HRTF CRend handle */ - ) +static void destroy_HRTF( + HRTFS_HANDLE *hHRTF /* i/o: HRTF CRend handle */ +) { uint16_t i, j; -- GitLab From d775b94ff2ef10a04f44a69eef83ced512a0edb0 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 19 May 2025 16:13:17 +0200 Subject: [PATCH 0635/1310] port MR 1372 from float fix for USAN error in OMASA JBM decoding --- lib_com/options.h | 1 + lib_dec/lib_dec_fx.c | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 53cac6f84..b2fba1dd3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -115,6 +115,7 @@ #define NONBE_FIX_951_MCMASA_5MS_RENDERING /* Nokia: issue #951: Differences for 5ms and 20ms rendering for McMASA at 13.2 kbps to BINAURAL */ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ #define FIX_983_DISC_ISM_DIGEST_NUM_OBJS /* FhG: issue #983: the discrete ISM digest function uses the wrong number of objects */ +#define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 63f0ab53f..9cf06bdfb 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2998,8 +2998,21 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( return IVAS_ERR_INVALID_BITSTREAM; } - /* check if frame contains a partial copy and get its offset */ - evs_dec_previewFrame( au, auSize, &partialCopyFrameType, &partialCopyOffset ); + +#ifdef NONBE_FIX_975_JBM_USAN + partialCopyFrameType = 0; + move16(); + partialCopyOffset = 0; + move16(); + + IF( EQ_16( hIvasDec->mode, (Word16) IVAS_DEC_MODE_EVS ) ) + { +#endif + /* check if frame contains a partial copy and get its offset */ + evs_dec_previewFrame( au, auSize, &partialCopyFrameType, &partialCopyOffset ); +#ifdef NONBE_FIX_975_JBM_USAN + } +#endif /* create data unit for primary copy in the frame */ dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); -- GitLab From ab531da55116475faee463f1bfb15bd477c18e16 Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Mon, 19 May 2025 16:15:35 +0200 Subject: [PATCH 0636/1310] Pointing optimized. --- lib_enc/ivas_stereo_dmx_evs_fx.c | 179 ++++++++++++++++--------------- 1 file changed, 92 insertions(+), 87 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index e81ec3413..4e9bc3da5 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -118,6 +118,7 @@ #define STEREO_DMX_EVS_SGC_GMIN 23170 // 0.7071f #define STEREO_DMX_EVS_IPD_ILD_THRES_Q29 1696512082 // 3.16f (5dB) #define STEREO_DMX_EVS_IPD_SF_THRES_Q31 107374182 // 0.05f + const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, 2027355520, @@ -144,7 +145,9 @@ const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128 }; + #else + const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, @@ -1442,7 +1445,6 @@ static void calc_poc_fx( } } - rfft_buf[0] = L_shr_r( specPOr[0], 10 ); // Q31->Q21 move32(); rfft_buf[1] = L_shr_r( specPOr[n0], 10 ); // Q31->Q21 @@ -2446,6 +2448,8 @@ void stereo_dmx_evs_enc_fx( Word16 n_fad_r, n_fad_g, m_fad_g, n_fad_cnt; STEREO_DMX_EVS_PRC prev_prc; + STEREO_DMX_EVS_PHA_HANDLE hPHA; + Word16 input_subframe, is_transient, dmx_gain_sgc; Word32 *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; Word16 subframe_energy_e[STEREO_DMX_EVS_NB_SBFRM]; @@ -2484,6 +2488,7 @@ void stereo_dmx_evs_enc_fx( BREAK; } move16(); + hPHA = hStereoDmxEVS->hPHA; FOR( n = 0; n < input_frame; n++ ) { @@ -2541,29 +2546,29 @@ void stereo_dmx_evs_enc_fx( W_tmp_q = W_norm( W_tmp ); W_tmp = W_shl( W_tmp, W_tmp_q ); L_tmp1 = W_extract_h( W_tmp ); // Q(31-(30-W_tmp_q)) - L_tmp1_e = sub( 15 * 2, W_tmp_q ); + L_tmp1_e = sub( 15 << 1, W_tmp_q ); subframe_energy[m] = BASOP_Util_Add_Mant32Exp( subframe_energy[m], subframe_energy_e[m], L_tmp1, L_tmp1_e, &subframe_energy_e[m] ); move32(); } - L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Add_Mant32Exp( hPHA->trns_aux_energy_fx[k], hPHA->trns_aux_energy_fx_e[k], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); - // if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) - if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDmxEVS->hPHA->crst_fctr_fx, 31 ) > 0 ) + // if ( subframe_energy[m] / ( hPHA->trns_aux_energy[k] + EPSILON ) > hPHA->crst_fctr ) + if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hPHA->crst_fctr_fx, 31 ) > 0 ) { is_transient = 1; move16(); } - // hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; - hStereoDmxEVS->hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ), hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], Mpy_32_16_1( subframe_energy[m], sub( MAX_16, STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ) ), subframe_energy_e[m], &hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k] ); + // hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; + hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hPHA->trns_aux_energy_fx[k], STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ), hPHA->trns_aux_energy_fx_e[k], Mpy_32_16_1( subframe_energy[m], sub( MAX_16, STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ) ), subframe_energy_e[m], &hPHA->trns_aux_energy_fx_e[k] ); move32(); } FOR( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) { - L_tmp1 = BASOP_Util_Add_Mant32Exp( subframe_energy[m - 1], subframe_energy_e[m - 1], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + L_tmp1 = BASOP_Util_Add_Mant32Exp( subframe_energy[sub( m, 1 )], subframe_energy_e[sub( m, 1 )], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); // if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) @@ -2575,14 +2580,14 @@ void stereo_dmx_evs_enc_fx( } } - estimate_itd_fx( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_fx[0], data_fx[1], &hStereoDmxEVS->itd_fx, input_frame ); + estimate_itd_fx( &corr, hStereoDmxEVS->hPOC, hPHA, data_fx[0], data_fx[1], &hStereoDmxEVS->itd_fx, input_frame ); /* poc */ IF( hStereoDmxEVS->itd_fx ) { // dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; - IF( hStereoDmxEVS->itd_fx > 0 ) + IF( GT_16( hStereoDmxEVS->itd_fx, 0 ) ) { dmx_weight = add( negate( shr( corr, 1 ) ), ONE_IN_Q14 ); } @@ -2607,11 +2612,11 @@ void stereo_dmx_evs_enc_fx( /* pha */ - pha_len = hStereoDmxEVS->hPHA->pha_len; + pha_len = hPHA->pha_len; move16(); - fad_len = hStereoDmxEVS->hPHA->fad_len; + fad_len = hPHA->fad_len; move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_fx; + fad_g = hPHA->fad_g_fx; set_zero_fx( dmx_pha_data, n_samples ); set_zero_fx( mem_prev, fad_len ); @@ -2619,12 +2624,12 @@ void stereo_dmx_evs_enc_fx( FOR( k = 0; k < CPE_CHANNELS; k++ ) { p_data = data_fx[k]; - Copy32( hStereoDmxEVS->hPHA->data_mem_fx[k], data_mem, pha_len ); - Copy32( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem_fx[k], pha_len ); + Copy32( hPHA->data_mem_fx[k], data_mem, pha_len ); + Copy32( &( p_data[sub( n_samples, pha_len )] ), hPHA->data_mem_fx[k], pha_len ); p_data_mem = &( data_mem[pha_len] ); Copy32( p_data, p_data_mem, n_samples ); - p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps_fx[k]; + p_prev_taps = hPHA->p_prev_taps_fx[k]; IF( p_prev_taps ) { FOR( n = 0; n < fad_len; n++ ) @@ -2632,7 +2637,7 @@ void stereo_dmx_evs_enc_fx( FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) { // ftmp += p_data_mem[n - m] * p_prev_taps[m]; - fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_prev_taps[m] ) ); // Q25 + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[sub( n, m )], p_prev_taps[m] ) ); // Q25 } fx_tmp = L_shl( fx_tmp, 1 ); // Q26 mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); @@ -2649,7 +2654,7 @@ void stereo_dmx_evs_enc_fx( } } - p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps_fx[k]; + p_curr_taps = hPHA->p_curr_taps_fx[k]; IF( p_curr_taps ) { FOR( n = 0; n < n_samples; n++ ) @@ -2657,7 +2662,7 @@ void stereo_dmx_evs_enc_fx( FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) { // ftmp += p_data_mem[n - m] * p_curr_taps[m]; - fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_curr_taps[m] ) ); // Q25 + fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[sub( n, m )], p_curr_taps[m] ) ); // Q25 } fx_tmp = L_shl( fx_tmp, 1 ); // Q26 // dmx_pha_data[n] += ftmp * INV_SQRT_2; @@ -2686,59 +2691,59 @@ void stereo_dmx_evs_enc_fx( /* prc switch */ - prev_prc = hStereoDmxEVS->hPHA->curr_prc; + prev_prc = hPHA->curr_prc; move32(); - // if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) - IF( GT_16( abs_s( hStereoDmxEVS->itd_fx ), hStereoDmxEVS->hPHA->prc_thres ) ) + // if ( abs( (int16_t) hStereoDmxEVS->itd ) > hPHA->prc_thres ) + IF( GT_16( abs_s( hStereoDmxEVS->itd_fx ), hPHA->prc_thres ) ) { - IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + IF( NE_32( hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) { - IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_POC ) ) + IF( EQ_32( hPHA->prev_prc, STEREO_DMX_EVS_PRC_POC ) ) { - hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); + hPHA->prc_hys_cnt = add( hPHA->prc_hys_cnt, 1 ); move16(); } ELSE { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + hPHA->prc_hys_cnt = 0; move16(); } - if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) + if ( GE_16( hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; move32(); } } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; + hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; move32(); } ELSE { - IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_PHA ) ) + IF( NE_32( hPHA->curr_prc, STEREO_DMX_EVS_PRC_PHA ) ) { - IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_PHA ) ) + IF( EQ_32( hPHA->prev_prc, STEREO_DMX_EVS_PRC_PHA ) ) { - hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); + hPHA->prc_hys_cnt = add( hPHA->prc_hys_cnt, 1 ); move16(); } ELSE { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + hPHA->prc_hys_cnt = 0; move16(); } - if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) + if ( GE_16( hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; + hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; move32(); } } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; + hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; move32(); } - // if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) + // if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hPHA->p_curr_taps[0] == NULL ) && ( hPHA->p_curr_taps[1] == NULL ) ) ) test(); test(); test(); @@ -2746,60 +2751,60 @@ void stereo_dmx_evs_enc_fx( IF( EQ_16( is_transient, 1 ) || BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[0], hStereoDmxEVS->aux_dmx_energy_fx_e[0], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[1] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[1], 14 ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[1], hStereoDmxEVS->aux_dmx_energy_fx_e[1], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[0] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[0], 14 ) ) > 0 || - EQ_16( hStereoDmxEVS->hPHA->force_poc, TRUE ) ) + EQ_16( hPHA->force_poc, TRUE ) ) { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; move32(); - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + hPHA->prc_hys_cnt = 0; move16(); } - calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); - calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_fx ), &( hPHA->dmx_poc_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_fx ), &( hPHA->dmx_pha_ener_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); - IF( NE_32( prev_prc, hStereoDmxEVS->hPHA->curr_prc ) && EQ_16( is_transient, 0 ) && !( ( BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->hPHA->dmx_pha_ener_fx, hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e, hStereoDmxEVS->hPHA->low_egy_thres_sgc, hStereoDmxEVS->hPHA->low_egy_thres_sgc_e ) < 0 ) && ( BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->hPHA->dmx_poc_ener_fx, hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e, hStereoDmxEVS->hPHA->low_egy_thres_sgc, hStereoDmxEVS->hPHA->low_egy_thres_sgc_e ) < 0 ) ) ) + IF( NE_32( prev_prc, hPHA->curr_prc ) && EQ_16( is_transient, 0 ) && !( ( BASOP_Util_Cmp_Mant32Exp( hPHA->dmx_pha_ener_fx, hPHA->dmx_pha_ener_fx_e, hPHA->low_egy_thres_sgc, hPHA->low_egy_thres_sgc_e ) < 0 ) && ( BASOP_Util_Cmp_Mant32Exp( hPHA->dmx_poc_ener_fx, hPHA->dmx_poc_ener_fx_e, hPHA->low_egy_thres_sgc, hPHA->low_egy_thres_sgc_e ) < 0 ) ) ) { - IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + IF( EQ_32( hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) { - apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); - calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc_fx ), &( hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); - L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->dmx_poc_ener_fx, hStereoDmxEVS->hPHA->dmx_poc_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - BASOP_Util_Divide_MantExp( extract_h( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + L_tmp1 = BASOP_Util_Add_Mant32Exp( hPHA->dmx_poc_ener_fx, hPHA->dmx_poc_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hPHA->dmx_pha_ener_sgc_fx ), hPHA->dmx_pha_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); - hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 - hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_min( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); - hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx = L_max( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + hPHA->dmx_poc_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hPHA->dmx_poc_gain_sgc_fx = L_min( hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hPHA->dmx_poc_gain_sgc_fx = L_max( hPHA->dmx_poc_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); - apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); - calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc_fx ), &( hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); } ELSE { - apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); - calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc_fx ), &( hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); - L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->dmx_pha_ener_fx, hStereoDmxEVS->hPHA->dmx_pha_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - BASOP_Util_Divide_MantExp( extract_h( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); + L_tmp1 = BASOP_Util_Add_Mant32Exp( hPHA->dmx_pha_ener_fx, hPHA->dmx_pha_ener_fx_e, EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); + BASOP_Util_Divide_MantExp( extract_h( hPHA->dmx_poc_ener_sgc_fx ), hPHA->dmx_poc_ener_sgc_fx_e, extract_h( L_tmp1 ), L_tmp1_e, &dmx_gain_sgc, &L_tmp2_e ); dmx_gain_sgc = Sqrt16( dmx_gain_sgc, &L_tmp2_e ); - hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 - hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_min( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); - hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx = L_max( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); + hPHA->dmx_pha_gain_sgc_fx = L_shl( L_deposit_l( dmx_gain_sgc ), L_tmp2_e ); // Q15 + hPHA->dmx_pha_gain_sgc_fx = L_min( hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMAX ); + hPHA->dmx_pha_gain_sgc_fx = L_max( hPHA->dmx_pha_gain_sgc_fx, STEREO_DMX_EVS_SGC_GMIN ); - apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); - calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc_fx ), &( hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); } } ELSE { - apply_gain_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_gain_sgc_fx ), n_samples ); - calc_energy_sgc( dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + apply_gain_sgc( dmx_poc_data, &( hPHA->dmx_poc_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_poc_data, &( hPHA->dmx_poc_ener_sgc_fx ), &( hPHA->dmx_poc_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); - apply_gain_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_gain_sgc_fx ), n_samples ); - calc_energy_sgc( dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx ), &( hStereoDmxEVS->hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); + apply_gain_sgc( dmx_pha_data, &( hPHA->dmx_pha_gain_sgc_fx ), n_samples ); + calc_energy_sgc( dmx_pha_data, &( hPHA->dmx_pha_ener_sgc_fx ), &( hPHA->dmx_pha_ener_sgc_fx_e ), n_samples, STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 ); } - IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) + IF( EQ_32( hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) { p_dmx_data = dmx_poc_data; p_dmx_data_fo = dmx_pha_data; @@ -2821,47 +2826,48 @@ void stereo_dmx_evs_enc_fx( move16(); } - IF( NE_32( prev_prc, hStereoDmxEVS->hPHA->curr_prc ) ) + IF( NE_32( prev_prc, hPHA->curr_prc ) ) { - IF( EQ_16( hStereoDmxEVS->hPHA->n_fad_g, input_frame ) ) + IF( EQ_16( hPHA->n_fad_g, input_frame ) ) { - hStereoDmxEVS->hPHA->n_fad_g = 0; - hStereoDmxEVS->hPHA->n_fad_cnt = 0; + hPHA->n_fad_g = 0; + hPHA->n_fad_cnt = 0; move16(); move16(); } ELSE { - hStereoDmxEVS->hPHA->n_fad_g = sub( input_frame, add( hStereoDmxEVS->hPHA->n_fad_g, 1 ) ); + hPHA->n_fad_g = sub( input_frame, add( hPHA->n_fad_g, 1 ) ); #ifdef NONBE_FIX_947_STEREO_DMX_FADOPT - hStereoDmxEVS->hPHA->n_fad_cnt = 0; + hPHA->n_fad_cnt = 0; + move16(); #else IF( EQ_16( is_transient, 1 ) ) { - hStereoDmxEVS->hPHA->n_fad_cnt = 0; + hPHA->n_fad_cnt = 0; move16(); } ELSE { - hStereoDmxEVS->hPHA->n_fad_cnt = sub( n_fad_r, hStereoDmxEVS->hPHA->n_fad_cnt ); + hPHA->n_fad_cnt = sub( n_fad_r, hPHA->n_fad_cnt ); } #endif } } ELSE IF( is_transient ) { - hStereoDmxEVS->hPHA->n_fad_cnt = 0; + hPHA->n_fad_cnt = 0; move16(); } - fad_len = s_min( n_samples, sub( mult0( input_frame, n_fad_r ), add( mult0( hStereoDmxEVS->hPHA->n_fad_g, n_fad_r ), hStereoDmxEVS->hPHA->n_fad_cnt ) ) ); + fad_len = s_min( n_samples, sub( mult0( input_frame, n_fad_r ), add( mult0( hPHA->n_fad_g, n_fad_r ), hPHA->n_fad_cnt ) ) ); IF( NE_16( fad_len, 0 ) ) { - fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; + fad_g = hPHA->fad_g_prc_fx; move32(); - n_fad_g = hStereoDmxEVS->hPHA->n_fad_g; - n_fad_cnt = hStereoDmxEVS->hPHA->n_fad_cnt; + n_fad_g = hPHA->n_fad_g; + n_fad_cnt = hPHA->n_fad_cnt; move16(); move16(); m_fad_g = sub( input_frame, add( n_fad_g, 1 ) ); @@ -2949,8 +2955,8 @@ void stereo_dmx_evs_enc_fx( } #endif - hStereoDmxEVS->hPHA->n_fad_g = n_fad_g; - hStereoDmxEVS->hPHA->n_fad_cnt = n_fad_cnt; + hPHA->n_fad_g = n_fad_g; + hPHA->n_fad_cnt = n_fad_cnt; move16(); move16(); } @@ -3350,7 +3356,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( Word16 n, input_frame; Word16 m, len, pha_len, fad_len, fad_len2, rfft_ipd_coef_step, n0, input_frame_pha; - Word32 *fad_g, fad_r, *ipd_ff; + Word32 *fad_g, fad_r; Word16 *win; const Word16 *p_ipd_w; Word16 tmp_e; @@ -3608,7 +3614,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); IF( EQ_32( input_Fs, 16000 ) ) { - hStereoDmxEVS->hPHA->win_fx[pha_len - 1] = 7373; /*0.45f in Q14*/ + hStereoDmxEVS->hPHA->win_fx[sub( pha_len, 1 )] = 7373; /*0.45f in Q14*/ move16(); } ELSE IF( EQ_32( input_Fs, 32000 ) || EQ_32( input_Fs, 48000 ) ) @@ -3641,8 +3647,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( /* Compute the forgetting factor */ // replaced below logic with table as it is same for all frame lengths - ipd_ff = hStereoDmxEVS->hPHA->ipd_ff_fx; - Copy32( ipd_ff_Q31, ipd_ff, STEREO_DMX_EVS_NB_SUBBAND_MAX ); + Copy32( ipd_ff_Q31, hStereoDmxEVS->hPHA->ipd_ff_fx, STEREO_DMX_EVS_NB_SUBBAND_MAX ); #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; @@ -3701,7 +3706,7 @@ ivas_error stereo_dmx_evs_init_encoder_fx( { win[n] = p_ipd_w[n * len]; move16(); - win[input_frame_pha - n] = p_ipd_w[n * len]; + win[sub( input_frame_pha, n )] = p_ipd_w[n * len]; move16(); } win[n0] = p_ipd_w[n0 * len]; -- GitLab From 61a827020ef9170c49311882b6f10b95421c0afd Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 19 May 2025 16:54:54 +0200 Subject: [PATCH 0637/1310] port MR 1373 from float fixes for MC encoder crashes with br and bw switching --- lib_com/options.h | 2 ++ lib_enc/bw_detect_fx.c | 23 +++++++++++++++++++++++ lib_enc/ivas_cpe_enc_fx.c | 12 ++++++++++++ lib_enc/ivas_mct_enc_fx.c | 21 +++++++++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 53cac6f84..dd3d2ff21 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -115,6 +115,8 @@ #define NONBE_FIX_951_MCMASA_5MS_RENDERING /* Nokia: issue #951: Differences for 5ms and 20ms rendering for McMASA at 13.2 kbps to BINAURAL */ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ #define FIX_983_DISC_ISM_DIGEST_NUM_OBJS /* FhG: issue #983: the discrete ISM digest function uses the wrong number of objects */ +#define FIX_ACCESS_WITHIN_NULL_STRUCT_MC_BW_SWITCHING /* FhG: fix usan error in MCT with bw swicthing */ +#define NONBE_FIX_986_MC_BW_SWITCHING /* FhG: fix crash in bw and br switching with MC */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 8a150d514..eefd5057c 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -1140,6 +1140,28 @@ Word16 set_bw_mct_fx( bw_changed = 0; move16(); +#ifdef NONBE_FIX_986_MC_BW_SWITCHING + IF( NE_16( mct_bwidth, last_mct_bwidth ) ) + { + bw_changed = 1; + move16(); + } + + /* + * always set bw for all CPEs even if it is the same value as before, + * in case of bw + br switching when changing to MCT, this overwrites + * potentially incorrect initial values + */ + FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = hCPE[cpe_id]->hCoreCoder[ch]; + st->bwidth = mct_bwidth; + move16(); + } + } +#else IF( NE_16( mct_bwidth, last_mct_bwidth ) ) { bw_changed = 1; @@ -1155,5 +1177,6 @@ Word16 set_bw_mct_fx( } } } +#endif return bw_changed; } diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index 826c23fdd..f6885dd81 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -1019,7 +1019,19 @@ ivas_error ivas_cpe_enc_fx( IF( ( NE_32( hCPE->last_element_brate, hCPE->element_brate ) || NE_16( hCPE->element_mode, hCPE->last_element_mode ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( sts[0]->bits_frame_nominal, last_bits_frame_nominal ) ) || NE_16( sts[n]->last_bwidth, sts[n]->bwidth ) ) && ( n == 0 || EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) ) { Word16 igf; +#ifdef NONBE_FIX_986_MC_BW_SWITCHING + Word16 bw; + + /* float uses ternary operator for this: bw = ( hCPE->element_mode == IVAS_CPE_MDCT ) ? sts[n]->bwidth : sts[n]->max_bwidth; */ + bw = sts[n]->max_bwidth; + IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) + { + bw = sts[n]->bwidth; + } + igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), bw, sts[n]->rf_mode ); /* Q0 */ +#else igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->rf_mode ); /* Q0 */ +#endif IF( ( error = IGF_Reconfig_fx( &sts[n]->hIGFEnc, igf, 0, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_mct_enc_fx.c b/lib_enc/ivas_mct_enc_fx.c index 56f5e44db..565b318f5 100644 --- a/lib_enc/ivas_mct_enc_fx.c +++ b/lib_enc/ivas_mct_enc_fx.c @@ -183,7 +183,9 @@ ivas_error ivas_mct_enc_fx( Word32 orig_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; Word16 switch_bw; IVAS_FORMAT ivas_format; +#ifndef NONBE_FIX_986_MC_BW_SWITCHING Word16 max_bwidth; +#endif Word32 ivas_total_brate; ivas_error error; Word32 *pdata_fx[MAX_INPUT_CHANNELS]; @@ -198,7 +200,9 @@ ivas_error ivas_mct_enc_fx( hMCT->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; /* pointer to write MCT side bits */ ivas_format = st_ivas->hEncoderConfig->ivas_format; +#ifndef NONBE_FIX_986_MC_BW_SWITCHING max_bwidth = st_ivas->hEncoderConfig->max_bwidth; +#endif ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; move32(); move16(); @@ -248,6 +252,22 @@ ivas_error ivas_mct_enc_fx( cp_bitrate = L_shl( L_deposit_l( div_l( ivas_total_brate, st_ivas->nchan_transport ) ), 2 ); // a/b => div_l(a, b/2) or (2 * div_l(a, b)) } +#ifdef NONBE_FIX_986_MC_BW_SWITCHING + IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) + { + FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) + { + initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid, 0 ); + } + } + ELSE + { + FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) + { + initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, NULL, 0 ); + } + } +#else IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) { FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) @@ -262,6 +282,7 @@ ivas_error ivas_mct_enc_fx( initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, NULL, 0 ); } } +#endif } /* set coded audio band-width */ -- GitLab From 499840dcbc6cbed623dc7fafa8ba17759034059a Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 19 May 2025 18:40:03 +0200 Subject: [PATCH 0638/1310] port NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN --- lib_com/options.h | 2 ++ lib_dec/ivas_sba_dec_fx.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 53cac6f84..2a87c540b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -115,6 +115,8 @@ #define NONBE_FIX_951_MCMASA_5MS_RENDERING /* Nokia: issue #951: Differences for 5ms and 20ms rendering for McMASA at 13.2 kbps to BINAURAL */ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ #define FIX_983_DISC_ISM_DIGEST_NUM_OBJS /* FhG: issue #983: the discrete ISM digest function uses the wrong number of objects */ +#define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ + /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index 24abcb667..86cd641c0 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -282,7 +282,11 @@ ivas_error ivas_sba_dec_reconfigure_fx( } /* save old */ +#ifdef NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN + IF( NE_16( ism_mode_old, ISM_SBA_MODE_DISC ) && NE_16( st_ivas->hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_BUFFER ) ) +#else IF( NE_16( ism_mode_old, ISM_SBA_MODE_DISC ) ) +#endif { test(); IF( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) -- GitLab From 48f94db17c0b7d5932cd21b09799e0fd5b79f88a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 20 May 2025 07:30:10 +0530 Subject: [PATCH 0639/1310] Renaming and cleanup of files --- Workspace_msvc/lib_com.vcxproj | 51 +- Workspace_msvc/lib_com.vcxproj.filters | 153 +- Workspace_msvc/lib_dec.vcxproj | 24 +- Workspace_msvc/lib_dec.vcxproj.filters | 96 +- Workspace_msvc/lib_enc.vcxproj | 7 +- Workspace_msvc/lib_enc.vcxproj.filters | 17 +- Workspace_msvc/lib_rend.vcxproj | 5 +- Workspace_msvc/lib_rend.vcxproj.filters | 11 +- lib_com/{cldfb_evs.c => cldfb_evs_fx.c} | 0 lib_com/{cldfb.c => cldfb_fx.c} | 0 ...dec_tcx_common.c => codec_tcx_common_fx.c} | 0 ...core_com_config.c => core_com_config_fx.c} | 0 lib_com/{deemph.c => deemph_fx.c} | 0 lib_com/{delay_comp.c => delay_comp_fx.c} | 0 lib_com/{enr_1_az.c => enr_1_az_fx.c} | 0 lib_com/{env_adj.c => env_adj_fx.c} | 0 lib_com/{env_stab.c => env_stab_fx.c} | 0 .../{env_stab_trans.c => env_stab_trans_fx.c} | 0 lib_com/fft.c | 366 -- lib_com/fft_fx.c | 316 +- lib_com/fft_rel.c | 878 ----- lib_com/fft_rel_fx.c | 842 +++++ .../{fill_spectrum.c => fill_spectrum_fx.c} | 0 lib_com/{findpulse.c => findpulse_fx.c} | 0 lib_com/gs_gains.c | 425 --- lib_com/gs_gains_fx.c | 528 ++- lib_com/hq2_core_com.c | 177 - lib_com/hq_conf.c | 303 -- lib_com/hq_conf_fx.c | 261 ++ lib_com/{ifft_rel.c => ifft_rel_fx.c} | 0 lib_com/{int_lsp.c => int_lsp_fx.c} | 0 ...ve_spectrum.c => interleave_spectrum_fx.c} | 0 lib_com/{interpol.c => interpol_fx.c} | 0 ...s_mcmasa_com-fx.c => ivas_mcmasa_com_fx.c} | 0 lib_com/ivas_prot_fx.h | 9 +- lib_com/{lag_wind.c => lag_wind_fx.c} | 0 lib_com/{lerp.c => lerp_fx.c} | 0 lib_com/modif_fs.c | 469 --- lib_com/modif_fs_fx.c | 432 ++- lib_com/mslvq_com.c | 208 -- lib_com/mslvq_com_fx.c | 122 + lib_com/preemph.c | 72 - lib_com/preemph_fx.c | 36 + lib_com/prot_fx.h | 44 +- ...tcx_mdct_window.c => tcx_mdct_window_fx.c} | 0 lib_com/{tec_com.c => tec_com_fx.c} | 0 lib_com/wtda.c | 219 -- lib_com/wtda_fx.c | 146 +- lib_dec/{ari_hm_dec.c => ari_hm_dec_fx.c} | 0 lib_dec/ivas_cpe_dec_fx.c | 2 +- lib_dec/ivas_init_dec.c | 3255 ----------------- lib_dec/ivas_init_dec_fx.c | 3255 +++++++++++++++++ lib_dec/{ivas_rom_dec.c => ivas_rom_dec_fx.c} | 0 ...reo_cng_dec.c => ivas_stereo_cng_dec_fx.c} | 0 lib_dec/ivas_stereo_dft_dec.c | 494 --- lib_dec/ivas_stereo_dft_dec_fx.c | 398 +- lib_dec/ivas_stereo_switching_dec_fx.c | 4 +- ...arbuffer.c => jbm_jb4_circularbuffer_fx.c} | 0 ...inputbuffer.c => jbm_jb4_inputbuffer_fx.c} | 0 lib_dec/{jbm_jb4_jmf.c => jbm_jb4_jmf_fx.c} | 0 lib_dec/{jbm_jb4sb.c => jbm_jb4sb_fx.c} | 0 .../{jbm_pcmdsp_apa.c => jbm_pcmdsp_apa_fx.c} | 0 ...c => jbm_pcmdsp_similarityestimation_fx.c} | 0 ...pcmdsp_window.c => jbm_pcmdsp_window_fx.c} | 0 lib_dec/{rom_dec.c => rom_dec_fx.c} | 0 lib_enc/{cod4t64_fast.c => cod4t64_fast_fx.c} | 0 lib_enc/{lib_enc.c => lib_enc_fx.c} | 0 lib_enc/lsf_msvq_ma_enc.c | 794 ---- lib_enc/lsf_msvq_ma_enc_fx.c | 921 ++++- lib_enc/{rom_enc.c => rom_enc_fx.c} | 0 lib_rend/ivas_output_init.c | 489 --- lib_rend/ivas_output_init_fx.c | 492 ++- lib_rend/{lib_rend.c => lib_rend_fx.c} | 0 73 files changed, 7647 insertions(+), 8674 deletions(-) rename lib_com/{cldfb_evs.c => cldfb_evs_fx.c} (100%) rename lib_com/{cldfb.c => cldfb_fx.c} (100%) rename lib_com/{codec_tcx_common.c => codec_tcx_common_fx.c} (100%) rename lib_com/{core_com_config.c => core_com_config_fx.c} (100%) rename lib_com/{deemph.c => deemph_fx.c} (100%) rename lib_com/{delay_comp.c => delay_comp_fx.c} (100%) rename lib_com/{enr_1_az.c => enr_1_az_fx.c} (100%) rename lib_com/{env_adj.c => env_adj_fx.c} (100%) rename lib_com/{env_stab.c => env_stab_fx.c} (100%) rename lib_com/{env_stab_trans.c => env_stab_trans_fx.c} (100%) delete mode 100644 lib_com/fft.c delete mode 100644 lib_com/fft_rel.c rename lib_com/{fill_spectrum.c => fill_spectrum_fx.c} (100%) rename lib_com/{findpulse.c => findpulse_fx.c} (100%) delete mode 100644 lib_com/gs_gains.c delete mode 100644 lib_com/hq2_core_com.c delete mode 100644 lib_com/hq_conf.c rename lib_com/{ifft_rel.c => ifft_rel_fx.c} (100%) rename lib_com/{int_lsp.c => int_lsp_fx.c} (100%) rename lib_com/{interleave_spectrum.c => interleave_spectrum_fx.c} (100%) rename lib_com/{interpol.c => interpol_fx.c} (100%) rename lib_com/{ivas_mcmasa_com-fx.c => ivas_mcmasa_com_fx.c} (100%) rename lib_com/{lag_wind.c => lag_wind_fx.c} (100%) rename lib_com/{lerp.c => lerp_fx.c} (100%) delete mode 100644 lib_com/modif_fs.c delete mode 100644 lib_com/mslvq_com.c delete mode 100644 lib_com/preemph.c rename lib_com/{tcx_mdct_window.c => tcx_mdct_window_fx.c} (100%) rename lib_com/{tec_com.c => tec_com_fx.c} (100%) delete mode 100644 lib_com/wtda.c rename lib_dec/{ari_hm_dec.c => ari_hm_dec_fx.c} (100%) delete mode 100644 lib_dec/ivas_init_dec.c rename lib_dec/{ivas_rom_dec.c => ivas_rom_dec_fx.c} (100%) rename lib_dec/{ivas_stereo_cng_dec.c => ivas_stereo_cng_dec_fx.c} (100%) delete mode 100644 lib_dec/ivas_stereo_dft_dec.c rename lib_dec/{jbm_jb4_circularbuffer.c => jbm_jb4_circularbuffer_fx.c} (100%) rename lib_dec/{jbm_jb4_inputbuffer.c => jbm_jb4_inputbuffer_fx.c} (100%) rename lib_dec/{jbm_jb4_jmf.c => jbm_jb4_jmf_fx.c} (100%) rename lib_dec/{jbm_jb4sb.c => jbm_jb4sb_fx.c} (100%) rename lib_dec/{jbm_pcmdsp_apa.c => jbm_pcmdsp_apa_fx.c} (100%) rename lib_dec/{jbm_pcmdsp_similarityestimation.c => jbm_pcmdsp_similarityestimation_fx.c} (100%) rename lib_dec/{jbm_pcmdsp_window.c => jbm_pcmdsp_window_fx.c} (100%) rename lib_dec/{rom_dec.c => rom_dec_fx.c} (100%) rename lib_enc/{cod4t64_fast.c => cod4t64_fast_fx.c} (100%) rename lib_enc/{lib_enc.c => lib_enc_fx.c} (100%) delete mode 100644 lib_enc/lsf_msvq_ma_enc.c rename lib_enc/{rom_enc.c => rom_enc_fx.c} (100%) delete mode 100644 lib_rend/ivas_output_init.c rename lib_rend/{lib_rend.c => lib_rend_fx.c} (100%) diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 7a2aa8a7f..91401ee2e 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -136,14 +136,14 @@ - - + + - + - - - + + + @@ -153,21 +153,19 @@ - - - - + + + + - - - - + + @@ -175,7 +173,6 @@ - @@ -183,20 +180,18 @@ - - - + - - - + + + @@ -207,7 +202,7 @@ - + @@ -235,8 +230,8 @@ - - + + @@ -248,9 +243,7 @@ - - @@ -258,7 +251,6 @@ - @@ -283,9 +275,9 @@ - + - + @@ -297,7 +289,6 @@ - diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index 89b47a3fc..3b781aa40 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -115,9 +115,6 @@ common_all_c - - common_all_c - common_all_c @@ -133,9 +130,6 @@ common_all_c - - common_all_c - common_all_c @@ -301,21 +295,9 @@ common_all_c - - common_all_c - common_all_c - - common_all_c - - - common_all_c - - - common_all_c - common_all_c @@ -325,30 +307,6 @@ common_all_c - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - common_all_c @@ -361,33 +319,12 @@ common_all_c - - common_all_c - common_all_c common_all_c - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - common_ivas_c @@ -403,45 +340,21 @@ common_ivas_c - - common_all_c - - - common_all_c - common_all_c - - common_all_c - - - common_all_c - common_all_c - - common_all_c - common_all_c common_all_c - - common_all_c - - - common_all_c - common_all_c - - common_all_c - common_all_c @@ -481,9 +394,6 @@ common_ivas_c - - common_ivas_c - common_ivas_c @@ -535,6 +445,69 @@ common_ivas_c + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_ivas_c + + + common_all_c + + + common_all_c + + + common_all_c + + + common_all_c + diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 12f77b346..1ae8c4d93 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -144,7 +144,7 @@ - + @@ -215,7 +215,6 @@ - @@ -245,7 +244,7 @@ - + @@ -254,8 +253,7 @@ - - + @@ -270,13 +268,13 @@ - - - - - - - + + + + + + + @@ -293,7 +291,7 @@ - + diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index 25079058c..170eada9a 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -74,12 +74,6 @@ decoder_ivas_c - - decoder_ivas_c - - - decoder_ivas_c - decoder_ivas_c @@ -89,9 +83,6 @@ decoder_ivas_c - - decoder_ivas_c - decoder_ivas_c @@ -101,12 +92,6 @@ decoder_ivas_c - - decoder_ivas_c - - - decoder_ivas_c - decoder_ivas_c @@ -122,9 +107,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c @@ -263,27 +245,6 @@ decoder_all_c - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - - - decoder_all_c - decoder_all_c @@ -323,9 +284,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c @@ -515,18 +473,45 @@ decoder_all_c + + decoder_all_c + + + decoder_ivas_c + + + decoder_all_c + + + decoder_ivas_c + + + decoder_ivas_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + + + decoder_all_c + - - decoder_h - - - decoder_h - - - decoder_h - decoder_h @@ -554,6 +539,15 @@ decoder_h + + decoder_h + + + decoder_h + + + decoder_h + diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 86dcef905..af16efedf 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -239,7 +239,7 @@ - + @@ -274,11 +274,10 @@ - + - @@ -318,7 +317,7 @@ - + diff --git a/Workspace_msvc/lib_enc.vcxproj.filters b/Workspace_msvc/lib_enc.vcxproj.filters index 899097163..e8f429f49 100644 --- a/Workspace_msvc/lib_enc.vcxproj.filters +++ b/Workspace_msvc/lib_enc.vcxproj.filters @@ -1,7 +1,6 @@  - encoder_evs_c @@ -152,9 +151,6 @@ encoder_all_c - - encoder_all_c - encoder_all_c @@ -287,9 +283,6 @@ encoder_all_c - - encoder_all_c - encoder_all_c @@ -347,9 +340,6 @@ encoder_all_c - - encoder_all_c - encoder_all_c @@ -602,6 +592,13 @@ encoder_ivas_c + + encoder_all_c + + + + encoder_all_c + diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index e47858ae3..0a00f9331 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -142,7 +142,6 @@ - @@ -159,7 +158,7 @@ - + @@ -176,7 +175,7 @@ - + diff --git a/Workspace_msvc/lib_rend.vcxproj.filters b/Workspace_msvc/lib_rend.vcxproj.filters index 5c4a49011..820a5c044 100644 --- a/Workspace_msvc/lib_rend.vcxproj.filters +++ b/Workspace_msvc/lib_rend.vcxproj.filters @@ -1,13 +1,6 @@ - - - rend_c - - - rend_c - rend_c @@ -122,6 +115,10 @@ rend_c + + rend_c + + diff --git a/lib_com/cldfb_evs.c b/lib_com/cldfb_evs_fx.c similarity index 100% rename from lib_com/cldfb_evs.c rename to lib_com/cldfb_evs_fx.c diff --git a/lib_com/cldfb.c b/lib_com/cldfb_fx.c similarity index 100% rename from lib_com/cldfb.c rename to lib_com/cldfb_fx.c diff --git a/lib_com/codec_tcx_common.c b/lib_com/codec_tcx_common_fx.c similarity index 100% rename from lib_com/codec_tcx_common.c rename to lib_com/codec_tcx_common_fx.c diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config_fx.c similarity index 100% rename from lib_com/core_com_config.c rename to lib_com/core_com_config_fx.c diff --git a/lib_com/deemph.c b/lib_com/deemph_fx.c similarity index 100% rename from lib_com/deemph.c rename to lib_com/deemph_fx.c diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp_fx.c similarity index 100% rename from lib_com/delay_comp.c rename to lib_com/delay_comp_fx.c diff --git a/lib_com/enr_1_az.c b/lib_com/enr_1_az_fx.c similarity index 100% rename from lib_com/enr_1_az.c rename to lib_com/enr_1_az_fx.c diff --git a/lib_com/env_adj.c b/lib_com/env_adj_fx.c similarity index 100% rename from lib_com/env_adj.c rename to lib_com/env_adj_fx.c diff --git a/lib_com/env_stab.c b/lib_com/env_stab_fx.c similarity index 100% rename from lib_com/env_stab.c rename to lib_com/env_stab_fx.c diff --git a/lib_com/env_stab_trans.c b/lib_com/env_stab_trans_fx.c similarity index 100% rename from lib_com/env_stab_trans.c rename to lib_com/env_stab_trans_fx.c diff --git a/lib_com/fft.c b/lib_com/fft.c deleted file mode 100644 index e262f3909..000000000 --- a/lib_com/fft.c +++ /dev/null @@ -1,366 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include -#include "options.h" -#include -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "wmc_auto.h" - -#ifdef _MSC_VER -#pragma warning( disable : 4310 ) -#endif - -/*-----------------------------------------------------------------* - * Low-complexity implementation of FFT - *-----------------------------------------------------------------*/ - -#define WMC_TOOL_SKIP - -#define SHC( x ) ( (Word16) x ) -#define FFTC( x ) WORD322WORD16( (Word32) x ) - -#define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */ -#define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */ - -#define cplxMpy4_8_0( re, im, a, b, c, d ) \ - re = L_shr( L_sub( Mpy_32_16_1( a, c ), Mpy_32_16_1( b, d ) ), 1 ); \ - im = L_shr( L_add( Mpy_32_16_1( a, d ), Mpy_32_16_1( b, c ) ), 1 ); - -#define cplxMpy4_8_1( re, im, a, b ) \ - re = L_shr( a, 1 ); \ - im = L_shr( b, 1 ); - - -/** - * \brief Twiddle factors are unscaled - */ -/*-----------------------------------------------------------------* - * BASOP_fft8() - * - * Function performs a complex 8-point FFT - * The FFT is performed inplace. The result of the FFT - * is scaled by SCALEFACTOR8 bits. - * - * WOPS with 32x16 bit multiplications: 108 cycles - *-----------------------------------------------------------------*/ - -static void BASOP_fft8( - Word32 *re, - Word32 *im, - Word16 s ) -{ - Word32 x00, x01, x02, x03, x04, x05, x06, x07; - Word32 x08, x09, x10, x11, x12, x13, x14, x15; - Word32 t00, t01, t02, t03, t04, t05, t06, t07; - Word32 t08, t09, t10, t11, t12, t13, t14, t15; - Word32 s00, s01, s02, s03, s04, s05, s06, s07; - Word32 s08, s09, s10, s11, s12, s13, s14, s15; - - - /* Pre-additions */ - - x00 = L_shr( re[s * 0], SCALEFACTOR8 ); - x01 = L_shr( im[s * 0], SCALEFACTOR8 ); - x02 = L_shr( re[s * 1], SCALEFACTOR8 ); - x03 = L_shr( im[s * 1], SCALEFACTOR8 ); - x04 = L_shr( re[s * 2], SCALEFACTOR8 ); - x05 = L_shr( im[s * 2], SCALEFACTOR8 ); - x06 = L_shr( re[s * 3], SCALEFACTOR8 ); - x07 = L_shr( im[s * 3], SCALEFACTOR8 ); - x08 = L_shr( re[s * 4], SCALEFACTOR8 ); - x09 = L_shr( im[s * 4], SCALEFACTOR8 ); - x10 = L_shr( re[s * 5], SCALEFACTOR8 ); - x11 = L_shr( im[s * 5], SCALEFACTOR8 ); - x12 = L_shr( re[s * 6], SCALEFACTOR8 ); - x13 = L_shr( im[s * 6], SCALEFACTOR8 ); - x14 = L_shr( re[s * 7], SCALEFACTOR8 ); - x15 = L_shr( im[s * 7], SCALEFACTOR8 ); - - t00 = L_add( x00, x08 ); - t02 = L_sub( x00, x08 ); - t01 = L_add( x01, x09 ); - t03 = L_sub( x01, x09 ); - t04 = L_add( x02, x10 ); - t06 = L_sub( x02, x10 ); - t05 = L_add( x03, x11 ); - t07 = L_sub( x03, x11 ); - t08 = L_add( x04, x12 ); - t10 = L_sub( x04, x12 ); - t09 = L_add( x05, x13 ); - t11 = L_sub( x05, x13 ); - t12 = L_add( x06, x14 ); - t14 = L_sub( x06, x14 ); - t13 = L_add( x07, x15 ); - t15 = L_sub( x07, x15 ); - - /* Pre-additions and core multiplications */ - - s00 = L_add( t00, t08 ); - s04 = L_sub( t00, t08 ); - s01 = L_add( t01, t09 ); - s05 = L_sub( t01, t09 ); - s08 = L_sub( t02, t11 ); - s10 = L_add( t02, t11 ); - s09 = L_add( t03, t10 ); - s11 = L_sub( t03, t10 ); - s02 = L_add( t04, t12 ); - s07 = L_sub( t04, t12 ); - s03 = L_add( t05, t13 ); - s06 = L_sub( t13, t05 ); - - t01 = L_add( t06, t14 ); - t02 = L_sub( t06, t14 ); - t00 = L_add( t07, t15 ); - t03 = L_sub( t07, t15 ); - - s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); - s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); - s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); - s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); - - /* Post-additions */ - - re[s * 0] = L_add( s00, s02 ); - move32(); - re[s * 4] = L_sub( s00, s02 ); - move32(); - im[s * 0] = L_add( s01, s03 ); - move32(); - im[s * 4] = L_sub( s01, s03 ); - move32(); - re[s * 2] = L_sub( s04, s06 ); - move32(); - re[s * 6] = L_add( s04, s06 ); - move32(); - im[s * 2] = L_sub( s05, s07 ); - move32(); - im[s * 6] = L_add( s05, s07 ); - move32(); - re[i_mult( s, 3 )] = L_add( s08, s14 ); - move32(); - re[i_mult( s, 7 )] = L_sub( s08, s14 ); - move32(); - im[i_mult( s, 3 )] = L_add( s09, s15 ); - move32(); - im[i_mult( s, 7 )] = L_sub( s09, s15 ); - move32(); - re[s * 1] = L_add( s10, s12 ); - move32(); - re[i_mult( s, 5 )] = L_sub( s10, s12 ); - move32(); - im[s * 1] = L_add( s11, s13 ); - move32(); - im[i_mult( s, 5 )] = L_sub( s11, s13 ); - move32(); - - return; -} - - -/*-----------------------------------------------------------------* - * fftN2() - * - * Combined FFT - *-----------------------------------------------------------------*/ - -static void BASOP_fftN2( - Word32 *re, /* i/o: real part */ - Word32 *im, /* i/o: imag part */ - const Word16 *W, /* i : rotation factor */ - Word16 dim1, /* i : length of fft1 */ - Word16 dim2, /* i : length of fft2 */ - Word16 sx, /* i : stride real and imag part */ - Word16 sc, /* i : stride phase rotation coefficients */ - Word32 *x, /* tmp: 32-bit workbuffer */ - Word16 Woff /* i : offset for addressing the rotation vector table */ -) -{ - Word16 i, j; - Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; - Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; - Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15; - - FOR( i = 0; i < dim2; i++ ) - { - FOR( j = 0; j < dim1; j++ ) - { - x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; - move32(); - x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; - move32(); - } - } - - /* dim1 == 8 */ - FOR( i = 0; i < dim2; i++ ) - { - BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); - } - - /* dim2 == 8 */ - FOR( i = 0; i < dim1; i++ ) - { - cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] ); - - IF( i == 0 ) - { - cplxMpy4_8_1( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )] ); - cplxMpy4_8_1( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )] ); - } - ELSE - { - cplxMpy4_8_0( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), 1 ), Woff )] ); - cplxMpy4_8_0( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), 1 ), Woff )] ); - } - t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 ); - t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 ); - t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 ); - t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 ); - t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 ); - t06 = L_sub( x02, x10 ); - t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 ); - t07 = L_sub( x03, x11 ); - t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 ); - t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 ); - t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 ); - t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 ); - t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 ); - t14 = L_sub( x06, x14 ); - t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 ); - t15 = L_sub( x07, x15 ); - - s00 = L_add( t00, t08 ); - s04 = L_sub( t00, t08 ); - s01 = L_add( t01, t09 ); - s05 = L_sub( t01, t09 ); - s08 = L_sub( t02, t11 ); - s10 = L_add( t02, t11 ); - s09 = L_add( t03, t10 ); - s11 = L_sub( t03, t10 ); - s02 = L_add( t04, t12 ); - s07 = L_sub( t04, t12 ); - s03 = L_add( t05, t13 ); - s06 = L_sub( t13, t05 ); - - t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 ); - t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 ); - t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 ); - t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 ); - - s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); - s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); - s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); - s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); - - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 ); - move32(); - re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 ); - move32(); - im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 ); - move32(); - } - - return; -} - - -/*-----------------------------------------------------------------* - * BASOP_cfft_ivas() - * - * Complex valued FFT - *-----------------------------------------------------------------*/ - -void BASOP_cfft_ivas( - Word32 *re, /* i/o: real part */ - Word32 *im, /* i/o: imag part */ - Word16 s, /* i : stride real and imag part */ - Word16 *scale /* i : scalefactor */ -) -{ - Word32 x[2 * 64]; - - /* FFT for len = FDNS_NPTS */ - BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 ); - s = add( *scale, SCALEFACTOR64 ); - - *scale = s; - move16(); - - return; -} - - -#undef WMC_TOOL_SKIP diff --git a/lib_com/fft_fx.c b/lib_com/fft_fx.c index 5ee509879..40c978014 100644 --- a/lib_com/fft_fx.c +++ b/lib_com/fft_fx.c @@ -44,9 +44,7 @@ #include "options.h" #include #include "cnst.h" -// #include "prot_fx.h" #include "prot_fx.h" -//#include "cnst_fx.h" #include "rom_com.h" #include "rom_com_fx.h" #include "wmc_auto.h" @@ -7555,3 +7553,317 @@ void rfft_fx( return; } + + +#define WMC_TOOL_SKIP + +#define SHC( x ) ( (Word16) x ) +#define FFTC( x ) WORD322WORD16( (Word32) x ) + +#define C81_FX ( FFTC( 0x5a82799a ) ) /* FL2WORD32( 7.071067811865475e-1) */ +#define C82_FX ( FFTC( 0xa57d8666 ) ) /* FL2WORD32(-7.071067811865475e-1) */ + +#define cplxMpy4_8_0( re, im, a, b, c, d ) \ + re = L_shr( L_sub( Mpy_32_16_1( a, c ), Mpy_32_16_1( b, d ) ), 1 ); \ + im = L_shr( L_add( Mpy_32_16_1( a, d ), Mpy_32_16_1( b, c ) ), 1 ); + +#define cplxMpy4_8_1( re, im, a, b ) \ + re = L_shr( a, 1 ); \ + im = L_shr( b, 1 ); + + +/** + * \brief Twiddle factors are unscaled + */ +/*-----------------------------------------------------------------* + * BASOP_fft8() + * + * Function performs a complex 8-point FFT + * The FFT is performed inplace. The result of the FFT + * is scaled by SCALEFACTOR8 bits. + * + * WOPS with 32x16 bit multiplications: 108 cycles + *-----------------------------------------------------------------*/ + +static void BASOP_fft8( + Word32 *re, + Word32 *im, + Word16 s ) +{ + Word32 x00, x01, x02, x03, x04, x05, x06, x07; + Word32 x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07; + Word32 t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07; + Word32 s08, s09, s10, s11, s12, s13, s14, s15; + + + /* Pre-additions */ + + x00 = L_shr( re[s * 0], SCALEFACTOR8 ); + x01 = L_shr( im[s * 0], SCALEFACTOR8 ); + x02 = L_shr( re[s * 1], SCALEFACTOR8 ); + x03 = L_shr( im[s * 1], SCALEFACTOR8 ); + x04 = L_shr( re[s * 2], SCALEFACTOR8 ); + x05 = L_shr( im[s * 2], SCALEFACTOR8 ); + x06 = L_shr( re[s * 3], SCALEFACTOR8 ); + x07 = L_shr( im[s * 3], SCALEFACTOR8 ); + x08 = L_shr( re[s * 4], SCALEFACTOR8 ); + x09 = L_shr( im[s * 4], SCALEFACTOR8 ); + x10 = L_shr( re[s * 5], SCALEFACTOR8 ); + x11 = L_shr( im[s * 5], SCALEFACTOR8 ); + x12 = L_shr( re[s * 6], SCALEFACTOR8 ); + x13 = L_shr( im[s * 6], SCALEFACTOR8 ); + x14 = L_shr( re[s * 7], SCALEFACTOR8 ); + x15 = L_shr( im[s * 7], SCALEFACTOR8 ); + + t00 = L_add( x00, x08 ); + t02 = L_sub( x00, x08 ); + t01 = L_add( x01, x09 ); + t03 = L_sub( x01, x09 ); + t04 = L_add( x02, x10 ); + t06 = L_sub( x02, x10 ); + t05 = L_add( x03, x11 ); + t07 = L_sub( x03, x11 ); + t08 = L_add( x04, x12 ); + t10 = L_sub( x04, x12 ); + t09 = L_add( x05, x13 ); + t11 = L_sub( x05, x13 ); + t12 = L_add( x06, x14 ); + t14 = L_sub( x06, x14 ); + t13 = L_add( x07, x15 ); + t15 = L_sub( x07, x15 ); + + /* Pre-additions and core multiplications */ + + s00 = L_add( t00, t08 ); + s04 = L_sub( t00, t08 ); + s01 = L_add( t01, t09 ); + s05 = L_sub( t01, t09 ); + s08 = L_sub( t02, t11 ); + s10 = L_add( t02, t11 ); + s09 = L_add( t03, t10 ); + s11 = L_sub( t03, t10 ); + s02 = L_add( t04, t12 ); + s07 = L_sub( t04, t12 ); + s03 = L_add( t05, t13 ); + s06 = L_sub( t13, t05 ); + + t01 = L_add( t06, t14 ); + t02 = L_sub( t06, t14 ); + t00 = L_add( t07, t15 ); + t03 = L_sub( t07, t15 ); + + s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); + s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); + s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); + s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); + + /* Post-additions */ + + re[s * 0] = L_add( s00, s02 ); + move32(); + re[s * 4] = L_sub( s00, s02 ); + move32(); + im[s * 0] = L_add( s01, s03 ); + move32(); + im[s * 4] = L_sub( s01, s03 ); + move32(); + re[s * 2] = L_sub( s04, s06 ); + move32(); + re[s * 6] = L_add( s04, s06 ); + move32(); + im[s * 2] = L_sub( s05, s07 ); + move32(); + im[s * 6] = L_add( s05, s07 ); + move32(); + re[i_mult( s, 3 )] = L_add( s08, s14 ); + move32(); + re[i_mult( s, 7 )] = L_sub( s08, s14 ); + move32(); + im[i_mult( s, 3 )] = L_add( s09, s15 ); + move32(); + im[i_mult( s, 7 )] = L_sub( s09, s15 ); + move32(); + re[s * 1] = L_add( s10, s12 ); + move32(); + re[i_mult( s, 5 )] = L_sub( s10, s12 ); + move32(); + im[s * 1] = L_add( s11, s13 ); + move32(); + im[i_mult( s, 5 )] = L_sub( s11, s13 ); + move32(); + + return; +} + + +/*-----------------------------------------------------------------* + * fftN2() + * + * Combined FFT + *-----------------------------------------------------------------*/ + +static void BASOP_fftN2( + Word32 *re, /* i/o: real part */ + Word32 *im, /* i/o: imag part */ + const Word16 *W, /* i : rotation factor */ + Word16 dim1, /* i : length of fft1 */ + Word16 dim2, /* i : length of fft2 */ + Word16 sx, /* i : stride real and imag part */ + Word16 sc, /* i : stride phase rotation coefficients */ + Word32 *x, /* tmp: 32-bit workbuffer */ + Word16 Woff /* i : offset for addressing the rotation vector table */ +) +{ + Word16 i, j; + Word32 x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15; + Word32 t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15; + Word32 s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15; + + FOR( i = 0; i < dim2; i++ ) + { + FOR( j = 0; j < dim1; j++ ) + { + x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2]; + move32(); + x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2]; + move32(); + } + } + + /* dim1 == 8 */ + FOR( i = 0; i < dim2; i++ ) + { + BASOP_fft8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 ); + } + + /* dim2 == 8 */ + FOR( i = 0; i < dim1; i++ ) + { + cplxMpy4_8_1( x00, x01, x[2 * i + 2 * 0 * dim1], x[2 * i + 2 * 0 * dim1 + 1] ); + + IF( i == 0 ) + { + cplxMpy4_8_1( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )] ); + cplxMpy4_8_1( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )] ); + } + ELSE + { + cplxMpy4_8_0( x02, x03, x[add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 1, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 1, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x04, x05, x[add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 2, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 2, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x06, x07, x[add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 3, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 3, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x08, x09, x[add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 4, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 4, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x10, x11, x[add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 5, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 5, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x12, x13, x[add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 6, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 6, dim1 ) ) ), 1 ), Woff )] ); + cplxMpy4_8_0( x14, x15, x[add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) )], x[add( add( shl( i, 1 ), i_mult( 2 * 7, dim1 ) ), 1 )], W[sub( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), Woff )], W[sub( add( add( i_mult( sc, i ), i_mult( sc, i_mult( 7, dim1 ) ) ), 1 ), Woff )] ); + } + t00 = L_shr( L_add( x00, x08 ), SCALEFACTORN2 - 1 ); + t02 = L_shr( L_sub( x00, x08 ), SCALEFACTORN2 - 1 ); + t01 = L_shr( L_add( x01, x09 ), SCALEFACTORN2 - 1 ); + t03 = L_shr( L_sub( x01, x09 ), SCALEFACTORN2 - 1 ); + t04 = L_shr( L_add( x02, x10 ), SCALEFACTORN2 - 1 ); + t06 = L_sub( x02, x10 ); + t05 = L_shr( L_add( x03, x11 ), SCALEFACTORN2 - 1 ); + t07 = L_sub( x03, x11 ); + t08 = L_shr( L_add( x04, x12 ), SCALEFACTORN2 - 1 ); + t10 = L_shr( L_sub( x04, x12 ), SCALEFACTORN2 - 1 ); + t09 = L_shr( L_add( x05, x13 ), SCALEFACTORN2 - 1 ); + t11 = L_shr( L_sub( x05, x13 ), SCALEFACTORN2 - 1 ); + t12 = L_shr( L_add( x06, x14 ), SCALEFACTORN2 - 1 ); + t14 = L_sub( x06, x14 ); + t13 = L_shr( L_add( x07, x15 ), SCALEFACTORN2 - 1 ); + t15 = L_sub( x07, x15 ); + + s00 = L_add( t00, t08 ); + s04 = L_sub( t00, t08 ); + s01 = L_add( t01, t09 ); + s05 = L_sub( t01, t09 ); + s08 = L_sub( t02, t11 ); + s10 = L_add( t02, t11 ); + s09 = L_add( t03, t10 ); + s11 = L_sub( t03, t10 ); + s02 = L_add( t04, t12 ); + s07 = L_sub( t04, t12 ); + s03 = L_add( t05, t13 ); + s06 = L_sub( t13, t05 ); + + t01 = L_shr( L_add( t06, t14 ), SCALEFACTORN2 - 1 ); + t02 = L_shr( L_sub( t06, t14 ), SCALEFACTORN2 - 1 ); + t00 = L_shr( L_add( t07, t15 ), SCALEFACTORN2 - 1 ); + t03 = L_shr( L_sub( t07, t15 ), SCALEFACTORN2 - 1 ); + + s12 = Mpy_32_16_1( L_add( t00, t02 ), C81_FX ); + s14 = Mpy_32_16_1( L_sub( t00, t02 ), C81_FX ); + s13 = Mpy_32_16_1( L_sub( t03, t01 ), C81_FX ); + s15 = Mpy_32_16_1( L_add( t01, t03 ), C82_FX ); + + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s00, s02 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 0, dim1 ) ) )] = L_add( s01, s03 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s10, s12 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 1, dim1 ) ) )] = L_add( s11, s13 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s04, s06 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 2, dim1 ) ) )] = L_sub( s05, s07 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s08, s14 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 3, dim1 ) ) )] = L_add( s09, s15 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s00, s02 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 4, dim1 ) ) )] = L_sub( s01, s03 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s10, s12 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 5, dim1 ) ) )] = L_sub( s11, s13 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s04, s06 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 6, dim1 ) ) )] = L_add( s05, s07 ); + move32(); + re[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s08, s14 ); + move32(); + im[add( i_mult( sx, i ), i_mult( sx, i_mult( 7, dim1 ) ) )] = L_sub( s09, s15 ); + move32(); + } + + return; +} + + +/*-----------------------------------------------------------------* + * BASOP_cfft_ivas() + * + * Complex valued FFT + *-----------------------------------------------------------------*/ + +void BASOP_cfft_ivas( + Word32 *re, /* i/o: real part */ + Word32 *im, /* i/o: imag part */ + Word16 s, /* i : stride real and imag part */ + Word16 *scale /* i : scalefactor */ +) +{ + Word32 x[2 * 64]; + + /* FFT for len = FDNS_NPTS */ + BASOP_fftN2( re, im, RotVector_256, 8, 8, s, 8, x, 64 ); + s = add( *scale, SCALEFACTOR64 ); + + *scale = s; + move16(); + + return; +} + +#undef WMC_TOOL_SKIP diff --git a/lib_com/fft_rel.c b/lib_com/fft_rel.c deleted file mode 100644 index 1d020cabd..000000000 --- a/lib_com/fft_rel.c +++ /dev/null @@ -1,878 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "wmc_auto.h" - -/*---------------------------------------------------------------------* - * Local constants - *---------------------------------------------------------------------*/ - -#define N_MAX_FFT 1024 -#define N_MAX_DIV2 ( N_MAX_FFT >> 1 ) -#define N_MAX_DIV4 ( N_MAX_DIV2 >> 1 ) -#define INV_SQR2_FX 23170 -#define N_MAX_SAS 256 -/*---------------------------------------------------------------------* - * fft_rel() - * - * Computes the split-radix FFT in place for the real-valued - * signal x of length n. The algorithm has been ported from - * the Fortran code of [1]. - * - * The function needs sine and cosine tables t_sin and t_cos, - * and the constant N_MAX_FFT. The table entries are defined as - * sin(2*pi*i) and cos(2*pi*i) for i = 0, 1, ..., N_MAX_FFT-1. The - * implementation assumes that any entry will not be needed - * outside the tables. Therefore, N_MAX_FFT and n must be properly - * set. The function has been tested with the values n = 16, - * 32, 64, 128, 256, and N_MAX_FFT = 1280. - * - * References - * [1] H.V. Sorensen, D.L. Jones, M.T. Heideman, C.S. Burrus, - * "Real-valued fast Fourier transform algorithm," IEEE - * Trans. on Signal Processing, Vol.35, No.6, pp 849-863, - * 1987. - * - * OUTPUT - * x[0:n-1] Transform coeffients in the order re[0], re[1], - * ..., re[n/2], im[n/2-1], ..., im[1]. - *---------------------------------------------------------------------*/ - -void fft_rel( - float x[], /* i/o: input/output vector */ - const int16_t n, /* i : vector length */ - const int16_t m /* i : log2 of vector length */ -) -{ - int16_t i, j, k, n1, n2, n4; - int16_t step; - float xt, t1, t2; - float *x0, *x1, *x2; - float *xi2, *xi3, *xi4, *xi1; - const float *s, *c; - const int16_t *idx; - - /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ - - float *x2even, *x2odd; - float temp[512]; - - if ( n == 128 || n == 256 || n == 512 ) - { - idx = fft256_read_indexes; - - /* Combined Digit reverse counter & Length two butterflies */ - if ( n == 128 ) - { - x2 = temp; - for ( i = 0; i < 64; i++ ) - { - j = *idx++; - k = *idx++; - - *x2++ = x[j >> 1] + x[k >> 1]; - *x2++ = x[j >> 1] - x[k >> 1]; - } - } - else if ( n == 256 ) - { - x2 = temp; - for ( i = 0; i < 128; i++ ) - { - j = *idx++; - k = *idx++; - - *x2++ = x[j] + x[k]; - *x2++ = x[j] - x[k]; - } - } - else if ( n == 512 ) - { - x2even = temp; - x2odd = temp + 256; - - for ( i = 0; i < 128; i++ ) - { - j = 2 * *idx++; - k = 2 * *idx++; - - *x2even++ = x[j] + x[k]; - *x2even++ = x[j] - x[k]; - *x2odd++ = x[++j] + x[++k]; - *x2odd++ = x[j] - x[k]; - } - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - * Also, it allows to Put the Data from 'temp' back into 'x' due - * to the previous Combined Digit Reverse and Length two butterflies - *-----------------------------------------------------------------*/ - - /*for_ (k = 2; k < 3; k++)*/ - { - x0 = temp; - x1 = x0 + 2; - x2 = x; - - for ( i = 0; i < n; i += 4 ) - { - *x2++ = *x0++ + *x1; /* x[i] = xt + x[i+n2]; */ - *x2++ = *x0; - *x2++ = *--x0 - *x1++; /* x[i+n2] = xt - x[i+n2]; */ - *x2++ = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - else - { - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - x0 = &x[0]; - for ( i = 0; i < n - 1; i++ ) - { - if ( i < j ) - { - xt = x[j]; - x[j] = *x0; - *x0 = xt; - } - x0++; - k = n / 2; - while ( k <= j ) - { - j -= k; - k = k >> 1; - } - j += k; - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &x[0]; - x1 = &x[1]; - for ( i = 0; i < n / 2; i++ ) - { - *x1 = *x0 - *x1; - *x0 = *x0 * 2 - *x1; - - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - *-----------------------------------------------------------------*/ - - /* for_ (k = 2; k < 3; k++) */ - { - x0 = x; - x1 = x0 + 2; - - for ( i = 0; i < n; i += 4 ) - { - *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ - *x0 = *x0 * 2 - *x1++; /* x[i] = xt + x[i+n2]; */ - *x1 = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_FFT must be set properly. - *-----------------------------------------------------------------*/ - - n4 = 1; - n2 = 2; - n1 = 4; - - step = N_MAX_DIV4; - - for ( k = 3; k <= m; k++ ) - { - step >>= 1; - n4 <<= 1; - n2 <<= 1; - n1 <<= 1; - - x0 = x; - x1 = x0 + n2; - x2 = x1 + n4; - - for ( i = 0; i < n; i += n1 ) - { - *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ - *x0 = *x0 * 2 - *x1; /* x[i] = xt + x[i+n2]; */ - *x2 = -*x2; /* x[i+n2+n4] = -x[i+n2+n4]; */ - - s = sincos_t_ext; - c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 */ - xi1 = x0; - xi3 = xi1 + n2; - xi2 = xi3; - x0 += n1; - xi4 = x0; - - for ( j = 1; j < n4; j++ ) - { - xi3++; - xi1++; - xi4--; - xi2--; - c += step; - s += step; /* autoincrement by ar0 */ - - t1 = *xi3 * *c + *xi4 * *s; /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); */ - t2 = *xi3 * *s - *xi4 * *c; /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); */ - - *xi4 = *xi2 - t2; - *xi2 = *xi1 - t1; - *xi1 = *xi1 * 2 - *xi2; - *xi3 = -2 * t2 - *xi4; - } - - x1 += n1; - x2 += n1; - } - } - - return; -} - -void fft_rel_16_32fx( - Word16 x[], /* i/o: input/output vector Qx */ - Word16 *q_x, /* extra scaling added on speech buffer*/ - Word16 i_subfr, - const Word16 n, /* i : vector length */ - const Word16 m /* i : log2 of vector length */ -) -{ - Word16 i, j, k, n1, n2, n4; - Word16 step; - Word32 xt, t1, t2; - Word32 *x0, *x1, *x2; - const Word16 *s, *c; - Word32 *xi2, *xi3, *xi4, *xi1; - - Word32 fft_bff32[L_FFT]; - Copy_Scale_sig_16_32_no_sat( x, fft_bff32, L_FFT, 0 ); // copying x to fft_bff32 without scaling - - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - move16(); - x0 = &fft_bff32[0]; // Qx - FOR( i = 0; i < n - 1; i++ ) - { - IF( LT_16( i, j ) ) - { - xt = fft_bff32[j]; // Qx - move32(); - fft_bff32[j] = *x0; // Qx - move32(); - *x0 = xt; // Qx - move32(); - } - x0++; - k = shr( n, 1 ); - WHILE( ( k <= j ) ) - { - j = sub( j, k ); - k = shr( k, 1 ); - } - j = add( j, k ); - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &fft_bff32[0]; - x1 = &fft_bff32[1]; - FOR( i = 0; i < ( n >> 1 ); i++ ) - { - xt = *x0; - move32(); - *x0 = L_add( xt, *x1 ); - move32(); - *x1 = L_sub( xt, *x1 ); - move32(); - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_SAS must be set properly. - *-----------------------------------------------------------------*/ - - n2 = 1; - move16(); - /* step = N_MAX_SAS/4; */ - FOR( k = 2; k <= m; k++ ) - { - n4 = n2; - move16(); - n2 = shl( n4, 1 ); - n1 = shl( n2, 1 ); - - step = idiv1616( N_MAX_SAS, n1 ); - - x0 = fft_bff32; - x1 = fft_bff32 + n2; - x2 = fft_bff32 + add( n2, n4 ); - FOR( i = 0; i < n; i += n1 ) - { - xt = *x0; - move32(); /* xt = x[i]; */ - *x0 = L_add( xt, *x1 ); - move32(); /* x[i] = xt + x[i+n2]; */ - *x1 = L_sub( xt, *x1 ); - move32(); /* x[i+n2] = xt - x[i+n2]; */ - *x2 = L_negate( *x2 ); - move32(); /* x[i+n2+n4] = -x[i+n2+n4]; */ - - - s = sincos_t_fx + step; // Q15 - c = s + 64; // Q15 - xi1 = fft_bff32 + add( i, 1 ); - xi3 = xi1 + n2; - xi2 = xi3 - 2; - xi4 = xi1 + sub( n1, 2 ); - - FOR( j = 1; j < n4; j++ ) - { - t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ - t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ - *xi4 = L_sub( *xi2, t2 ); - move32(); - *xi3 = L_negate( L_add( *xi2, t2 ) ); - move32(); - *xi2 = L_sub( *xi1, t1 ); - move32(); - *xi1 = L_add( *xi1, t1 ); - move32(); - - xi4--; - xi2--; - xi3++; - xi1++; - c += step; - s += step; /* autoincrement by ar0 */ - } - - x0 += n1; - x1 += n1; - x2 += n1; - } - /* step = shr(step, 1); */ - } - Word16 norm = L_norm_arr( fft_bff32, L_FFT ); - IF( i_subfr == 0 ) - { - Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); - *q_x = sub( norm, 16 ); - move16(); - } - ELSE - { - IF( LT_16( sub( norm, 16 ), *q_x ) ) - { - scale_sig( x - L_FFT, L_FFT, sub( sub( norm, 16 ), *q_x ) ); - Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); - *q_x = sub( norm, 16 ); - move16(); - } - ELSE - { - Copy_Scale_sig32_16( fft_bff32, x, L_FFT, add( 16, *q_x ) ); - } - } - - return; -} - -void fft_rel_fx( - Word16 x[], /* i/o: input/output vector Qx */ - const Word16 n, /* i : vector length */ - const Word16 m /* i : log2 of vector length */ -) -{ - Word16 i, j, k, n1, n2, n4; - Word16 step; - Word16 xt, t1, t2; - Word16 *x0, *x1, *x2; - const Word16 *s, *c; - Word16 *xi2, *xi3, *xi4, *xi1; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - move16(); - x0 = &x[0]; // Qx - move16(); - FOR( i = 0; i < n - 1; i++ ) - { - IF( LT_16( i, j ) ) - { - xt = x[j]; // Qx - move16(); - x[j] = *x0; // Qx - move16(); - *x0 = xt; // Qx - move16(); - } - x0++; - k = shr( n, 1 ); - WHILE( ( k <= j ) ) - { - j = sub( j, k ); - k = shr( k, 1 ); - } - j = add( j, k ); - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &x[0]; - move16(); - x1 = &x[1]; - move16(); - FOR( i = 0; i < ( n >> 1 ); i++ ) - { - xt = *x0; - move16(); - *x0 = add_o( xt, *x1, &Overflow ); - move16(); - *x1 = sub_o( xt, *x1, &Overflow ); - move16(); - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_SAS must be set properly. - *-----------------------------------------------------------------*/ - - n2 = 1; - move16(); - /* step = N_MAX_SAS/4; */ - FOR( k = 2; k <= m; k++ ) - { - n4 = n2; - move16(); - n2 = shl( n4, 1 ); - n1 = shl( n2, 1 ); - - step = idiv1616( N_MAX_SAS, n1 ); - - x0 = x; - x1 = x + n2; - x2 = x + add( n2, n4 ); - FOR( i = 0; i < n; i += n1 ) - { - xt = *x0; - move16(); /* xt = x[i]; */ - *x0 = add_o( xt, *x1, &Overflow ); - move16(); /* x[i] = xt + x[i+n2]; */ - *x1 = sub_o( xt, *x1, &Overflow ); - move16(); /* x[i+n2] = xt - x[i+n2]; */ - *x2 = negate( *x2 ); - move16(); /* x[i+n2+n4] = -x[i+n2+n4]; */ - - - s = sincos_t_fx + step; // Q15 - c = s + 64; // Q15 - xi1 = x + add( i, 1 ); - xi3 = xi1 + n2; - xi2 = xi3 - 2; - xi4 = xi1 + sub( n1, 2 ); - - FOR( j = 1; j < n4; j++ ) - { - t1 = add_o( mult_r( *xi3, *c ), mult_r( *xi4, *s ), &Overflow ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ - t2 = sub_o( mult_r( *xi3, *s ), mult_r( *xi4, *c ), &Overflow ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ - *xi4 = sub_o( *xi2, t2, &Overflow ); - move16(); - *xi3 = negate( add_o( *xi2, t2, &Overflow ) ); - move16(); - *xi2 = sub_o( *xi1, t1, &Overflow ); - move16(); - *xi1 = add_o( *xi1, t1, &Overflow ); - move16(); - - xi4--; - xi2--; - xi3++; - xi1++; - c += step; - s += step; /* autoincrement by ar0 */ - } - - x0 += n1; - x1 += n1; - x2 += n1; - } - /* step = shr(step, 1); */ - } - - return; -} - -void fft_rel_fx32( - Word32 x[], /* i/o: input/output vector Qx */ - const Word16 n, /* i : vector length */ - const Word16 m /* i : log2 of vector length */ -) -{ - Word16 i, j, k, n1, n2, n4; - Word16 step; - Word32 xt, t1, t2; - Word32 *x0, *x1, *x2; - Word32 *xi2, *xi3, *xi4, *xi1; - const Word16 *s, *c; - const Word16 *idx; - - /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ - - Word32 *x2even, *x2odd; - Word32 temp[512]; - - test(); - test(); - IF( EQ_16( n, 128 ) || EQ_16( n, 256 ) || EQ_16( n, 512 ) ) - { - idx = fft256_read_indexes; - - /* Combined Digit reverse counter & Length two butterflies */ - IF( EQ_16( n, 128 ) ) - { - x2 = temp; - FOR( i = 0; i < 64; i++ ) - { - j = *idx++; - move16(); - k = *idx++; - move16(); - - *x2++ = L_add( x[( j >> 1 )], x[( k >> 1 )] ); // Qx - move16(); - *x2++ = L_sub( x[( j >> 1 )], x[( k >> 1 )] ); // Qx - move16(); - } - } - ELSE IF( EQ_16( n, 256 ) ) - { - x2 = temp; - FOR( i = 0; i < 128; i++ ) - { - j = *idx++; - move16(); - k = *idx++; - move16(); - - *x2++ = L_add( x[j], x[k] ); // Qx - move16(); - *x2++ = L_sub( x[j], x[k] ); // Qx - move16(); - } - } - ELSE IF( EQ_16( n, 512 ) ) - { - x2even = temp; - x2odd = temp + 256; - - FOR( i = 0; i < 128; i++ ) - { - j = shl( *idx, 1 ); - idx++; - k = shl( *idx, 1 ); - idx++; - - *x2even++ = L_add( x[j], x[k] ); // Qx - move16(); - *x2even++ = L_sub( x[j], x[k] ); // Qx - move16(); - j = add( j, 1 ); - k = add( k, 1 ); - *x2odd++ = L_add( x[j], x[k] ); // Qx - move16(); - *x2odd++ = L_sub( x[j], x[k] ); // Qx - move16(); - } - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - * Also, it allows to Put the Data from 'temp' back into 'x' due - * to the previous Combined Digit Reverse and Length two butterflies - *-----------------------------------------------------------------*/ - - /*for_ (k = 2; k < 3; k++)*/ - { - x0 = temp; - x1 = x0 + 2; - x2 = x; // Qx - - FOR( i = 0; i < n; i += 4 ) - { - *x2++ = L_add( *x0++, *x1 ); /* x[i] = xt + x[i+n2]; */ - move16(); - *x2++ = *x0; - move16(); - x0--; - *x2++ = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ - move16(); - x1++; - *x2++ = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ - move16(); - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - ELSE - { - /*-----------------------------------------------------------------* - * Digit reverse counter - *-----------------------------------------------------------------*/ - - j = 0; - move16(); - x0 = &x[0]; // Qx - FOR( i = 0; i < ( n - 1 ); i++ ) - { - IF( LT_16( i, j ) ) - { - xt = x[j]; // Qx - move32(); - x[j] = *x0; - move32(); - *x0 = xt; - move32(); - } - x0++; - k = shr( n, 1 ); - WHILE( ( k <= j ) ) - { - j = sub( j, k ); - k = shr( k, 1 ); - } - j = add( j, k ); - } - - /*-----------------------------------------------------------------* - * Length two butterflies - *-----------------------------------------------------------------*/ - - x0 = &x[0]; // Qx - x1 = &x[1]; // Qx - FOR( i = 0; i < ( n >> 1 ); i++ ) - { - *x1 = L_sub( *x0, *x1 ); // Qx - move32(); - *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); //*x0 * 2 - *x1 (Qx) - move32(); - - x0++; - x0++; - x1++; - x1++; - } - - /*-----------------------------------------------------------------* - * 1st Stage Loop has been Unrolled because n4 is '1' and that - * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop - * and the associated pointers initialization. - *-----------------------------------------------------------------*/ - - /* for_ (k = 2; k < 3; k++) */ - { - x0 = x; // Qx - x1 = x0 + 2; - - FOR( i = 0; i < n; i += 4 ) - { - *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; Qx*/ - move32(); - *x0 = L_sub( L_shl( *x0, 1 ), *x1++ ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ - move32(); - *x1 = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx*/ - move32(); - - x0 += 4; - x1 += 3; /* x1 has already advanced */ - } - } - } - - /*-----------------------------------------------------------------* - * Other butterflies - * - * The implementation described in [1] has been changed by using - * table lookup for evaluating sine and cosine functions. The - * variable ind and its increment step are needed to access table - * entries. Note that this implementation assumes n4 to be so - * small that ind will never exceed the table. Thus the input - * argument n and the constant N_MAX_FFT must be set properly. - *-----------------------------------------------------------------*/ - - n4 = 1; - move16(); - n2 = 2; - move16(); - n1 = 4; - move16(); - - step = N_MAX_DIV4; - move16(); - - FOR( k = 3; k <= m; k++ ) - { - step = shr( step, 1 ); - n4 = shl( n4, 1 ); - n2 = shl( n2, 1 ); - n1 = shl( n1, 1 ); - - x0 = x; - x1 = x0 + n2; - x2 = x1 + n4; - - FOR( i = 0; i < n; i += n1 ) - { - *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ - move32(); - *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ - move32(); - *x2 = L_negate( *x2 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx */ - move32(); - - s = sincos_t_ext_fx; // Q15 - c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 Q15*/ - xi1 = x0; - xi3 = xi1 + n2; - xi2 = xi3; - x0 += n1; - xi4 = x0; - - FOR( j = 1; j < n4; j++ ) - { - xi3++; - xi1++; - xi4--; - xi2--; - c += step; - s += step; /* autoincrement by ar0 */ - - t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx*/ - t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx*/ - - *xi4 = L_sub( *xi2, t2 ); - move32(); - *xi2 = L_sub( *xi1, t1 ); - move32(); - *xi1 = L_sub( L_shl( *xi1, 1 ), *xi2 ); // Qx - move32(); - *xi3 = L_negate( L_add( L_shl( t2, 1 ), *xi4 ) ); // Qx - move32(); - } - - x1 += n1; - x2 += n1; - } - } - - return; -} diff --git a/lib_com/fft_rel_fx.c b/lib_com/fft_rel_fx.c index 5461ce55b..a0905cc16 100644 --- a/lib_com/fft_rel_fx.c +++ b/lib_com/fft_rel_fx.c @@ -2,11 +2,24 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ +#include #include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ #include "rom_com.h" /* Static table prototypes */ #include "stl.h" #include "stdint.h" +#include "wmc_auto.h" + +/*---------------------------------------------------------------------* + * Local constants + *---------------------------------------------------------------------*/ + +#define N_MAX_FFT 1024 +#define N_MAX_DIV2 ( N_MAX_FFT >> 1 ) +#define N_MAX_DIV4 ( N_MAX_DIV2 >> 1 ) +#define INV_SQR2_FX 23170 +#define N_MAX_SAS 256 + /*------------------------------------------------------------------ * * This is an implementation of decimation-in-time FFT algorithm for @@ -427,3 +440,832 @@ void r_fft_fx_lc( c_fft_fx( phs_tbl, SIZE, NUM_STAGE, temp, out_ptr, isign ); } } + + +/*---------------------------------------------------------------------* + * fft_rel() + * + * Computes the split-radix FFT in place for the real-valued + * signal x of length n. The algorithm has been ported from + * the Fortran code of [1]. + * + * The function needs sine and cosine tables t_sin and t_cos, + * and the constant N_MAX_FFT. The table entries are defined as + * sin(2*pi*i) and cos(2*pi*i) for i = 0, 1, ..., N_MAX_FFT-1. The + * implementation assumes that any entry will not be needed + * outside the tables. Therefore, N_MAX_FFT and n must be properly + * set. The function has been tested with the values n = 16, + * 32, 64, 128, 256, and N_MAX_FFT = 1280. + * + * References + * [1] H.V. Sorensen, D.L. Jones, M.T. Heideman, C.S. Burrus, + * "Real-valued fast Fourier transform algorithm," IEEE + * Trans. on Signal Processing, Vol.35, No.6, pp 849-863, + * 1987. + * + * OUTPUT + * x[0:n-1] Transform coeffients in the order re[0], re[1], + * ..., re[n/2], im[n/2-1], ..., im[1]. + *---------------------------------------------------------------------*/ + +void fft_rel( + float x[], /* i/o: input/output vector */ + const int16_t n, /* i : vector length */ + const int16_t m /* i : log2 of vector length */ +) +{ + int16_t i, j, k, n1, n2, n4; + int16_t step; + float xt, t1, t2; + float *x0, *x1, *x2; + float *xi2, *xi3, *xi4, *xi1; + const float *s, *c; + const int16_t *idx; + + /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ + + float *x2even, *x2odd; + float temp[512]; + + if ( n == 128 || n == 256 || n == 512 ) + { + idx = fft256_read_indexes; + + /* Combined Digit reverse counter & Length two butterflies */ + if ( n == 128 ) + { + x2 = temp; + for ( i = 0; i < 64; i++ ) + { + j = *idx++; + k = *idx++; + + *x2++ = x[j >> 1] + x[k >> 1]; + *x2++ = x[j >> 1] - x[k >> 1]; + } + } + else if ( n == 256 ) + { + x2 = temp; + for ( i = 0; i < 128; i++ ) + { + j = *idx++; + k = *idx++; + + *x2++ = x[j] + x[k]; + *x2++ = x[j] - x[k]; + } + } + else if ( n == 512 ) + { + x2even = temp; + x2odd = temp + 256; + + for ( i = 0; i < 128; i++ ) + { + j = 2 * *idx++; + k = 2 * *idx++; + + *x2even++ = x[j] + x[k]; + *x2even++ = x[j] - x[k]; + *x2odd++ = x[++j] + x[++k]; + *x2odd++ = x[j] - x[k]; + } + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + * Also, it allows to Put the Data from 'temp' back into 'x' due + * to the previous Combined Digit Reverse and Length two butterflies + *-----------------------------------------------------------------*/ + + /*for_ (k = 2; k < 3; k++)*/ + { + x0 = temp; + x1 = x0 + 2; + x2 = x; + + for ( i = 0; i < n; i += 4 ) + { + *x2++ = *x0++ + *x1; /* x[i] = xt + x[i+n2]; */ + *x2++ = *x0; + *x2++ = *--x0 - *x1++; /* x[i+n2] = xt - x[i+n2]; */ + *x2++ = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + else + { + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + x0 = &x[0]; + for ( i = 0; i < n - 1; i++ ) + { + if ( i < j ) + { + xt = x[j]; + x[j] = *x0; + *x0 = xt; + } + x0++; + k = n / 2; + while ( k <= j ) + { + j -= k; + k = k >> 1; + } + j += k; + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &x[0]; + x1 = &x[1]; + for ( i = 0; i < n / 2; i++ ) + { + *x1 = *x0 - *x1; + *x0 = *x0 * 2 - *x1; + + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + *-----------------------------------------------------------------*/ + + /* for_ (k = 2; k < 3; k++) */ + { + x0 = x; + x1 = x0 + 2; + + for ( i = 0; i < n; i += 4 ) + { + *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ + *x0 = *x0 * 2 - *x1++; /* x[i] = xt + x[i+n2]; */ + *x1 = -*x1; /* x[i+n2+n4] = -x[i+n2+n4]; */ + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_FFT must be set properly. + *-----------------------------------------------------------------*/ + + n4 = 1; + n2 = 2; + n1 = 4; + + step = N_MAX_DIV4; + + for ( k = 3; k <= m; k++ ) + { + step >>= 1; + n4 <<= 1; + n2 <<= 1; + n1 <<= 1; + + x0 = x; + x1 = x0 + n2; + x2 = x1 + n4; + + for ( i = 0; i < n; i += n1 ) + { + *x1 = *x0 - *x1; /* x[i+n2] = xt - x[i+n2]; */ + *x0 = *x0 * 2 - *x1; /* x[i] = xt + x[i+n2]; */ + *x2 = -*x2; /* x[i+n2+n4] = -x[i+n2+n4]; */ + + s = sincos_t_ext; + c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 */ + xi1 = x0; + xi3 = xi1 + n2; + xi2 = xi3; + x0 += n1; + xi4 = x0; + + for ( j = 1; j < n4; j++ ) + { + xi3++; + xi1++; + xi4--; + xi2--; + c += step; + s += step; /* autoincrement by ar0 */ + + t1 = *xi3 * *c + *xi4 * *s; /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); */ + t2 = *xi3 * *s - *xi4 * *c; /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); */ + + *xi4 = *xi2 - t2; + *xi2 = *xi1 - t1; + *xi1 = *xi1 * 2 - *xi2; + *xi3 = -2 * t2 - *xi4; + } + + x1 += n1; + x2 += n1; + } + } + + return; +} + +void fft_rel_16_32fx( + Word16 x[], /* i/o: input/output vector Qx */ + Word16 *q_x, /* extra scaling added on speech buffer*/ + Word16 i_subfr, + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ +) +{ + Word16 i, j, k, n1, n2, n4; + Word16 step; + Word32 xt, t1, t2; + Word32 *x0, *x1, *x2; + const Word16 *s, *c; + Word32 *xi2, *xi3, *xi4, *xi1; + + Word32 fft_bff32[L_FFT]; + Copy_Scale_sig_16_32_no_sat( x, fft_bff32, L_FFT, 0 ); // copying x to fft_bff32 without scaling + + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + move16(); + x0 = &fft_bff32[0]; // Qx + FOR( i = 0; i < n - 1; i++ ) + { + IF( LT_16( i, j ) ) + { + xt = fft_bff32[j]; // Qx + move32(); + fft_bff32[j] = *x0; // Qx + move32(); + *x0 = xt; // Qx + move32(); + } + x0++; + k = shr( n, 1 ); + WHILE( ( k <= j ) ) + { + j = sub( j, k ); + k = shr( k, 1 ); + } + j = add( j, k ); + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &fft_bff32[0]; + x1 = &fft_bff32[1]; + FOR( i = 0; i < ( n >> 1 ); i++ ) + { + xt = *x0; + move32(); + *x0 = L_add( xt, *x1 ); + move32(); + *x1 = L_sub( xt, *x1 ); + move32(); + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_SAS must be set properly. + *-----------------------------------------------------------------*/ + + n2 = 1; + move16(); + /* step = N_MAX_SAS/4; */ + FOR( k = 2; k <= m; k++ ) + { + n4 = n2; + move16(); + n2 = shl( n4, 1 ); + n1 = shl( n2, 1 ); + + step = idiv1616( N_MAX_SAS, n1 ); + + x0 = fft_bff32; + x1 = fft_bff32 + n2; + x2 = fft_bff32 + add( n2, n4 ); + FOR( i = 0; i < n; i += n1 ) + { + xt = *x0; + move32(); /* xt = x[i]; */ + *x0 = L_add( xt, *x1 ); + move32(); /* x[i] = xt + x[i+n2]; */ + *x1 = L_sub( xt, *x1 ); + move32(); /* x[i+n2] = xt - x[i+n2]; */ + *x2 = L_negate( *x2 ); + move32(); /* x[i+n2+n4] = -x[i+n2+n4]; */ + + + s = sincos_t_fx + step; // Q15 + c = s + 64; // Q15 + xi1 = fft_bff32 + add( i, 1 ); + xi3 = xi1 + n2; + xi2 = xi3 - 2; + xi4 = xi1 + sub( n1, 2 ); + + FOR( j = 1; j < n4; j++ ) + { + t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ + t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ + *xi4 = L_sub( *xi2, t2 ); + move32(); + *xi3 = L_negate( L_add( *xi2, t2 ) ); + move32(); + *xi2 = L_sub( *xi1, t1 ); + move32(); + *xi1 = L_add( *xi1, t1 ); + move32(); + + xi4--; + xi2--; + xi3++; + xi1++; + c += step; + s += step; /* autoincrement by ar0 */ + } + + x0 += n1; + x1 += n1; + x2 += n1; + } + /* step = shr(step, 1); */ + } + Word16 norm = L_norm_arr( fft_bff32, L_FFT ); + IF( i_subfr == 0 ) + { + Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); + *q_x = sub( norm, 16 ); + move16(); + } + ELSE + { + IF( LT_16( sub( norm, 16 ), *q_x ) ) + { + scale_sig( x - L_FFT, L_FFT, sub( sub( norm, 16 ), *q_x ) ); + Copy_Scale_sig32_16( fft_bff32, x, L_FFT, norm ); + *q_x = sub( norm, 16 ); + move16(); + } + ELSE + { + Copy_Scale_sig32_16( fft_bff32, x, L_FFT, add( 16, *q_x ) ); + } + } + + return; +} + +void fft_rel_fx( + Word16 x[], /* i/o: input/output vector Qx */ + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ +) +{ + Word16 i, j, k, n1, n2, n4; + Word16 step; + Word16 xt, t1, t2; + Word16 *x0, *x1, *x2; + const Word16 *s, *c; + Word16 *xi2, *xi3, *xi4, *xi1; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + move16(); + x0 = &x[0]; // Qx + move16(); + FOR( i = 0; i < n - 1; i++ ) + { + IF( LT_16( i, j ) ) + { + xt = x[j]; // Qx + move16(); + x[j] = *x0; // Qx + move16(); + *x0 = xt; // Qx + move16(); + } + x0++; + k = shr( n, 1 ); + WHILE( ( k <= j ) ) + { + j = sub( j, k ); + k = shr( k, 1 ); + } + j = add( j, k ); + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &x[0]; + move16(); + x1 = &x[1]; + move16(); + FOR( i = 0; i < ( n >> 1 ); i++ ) + { + xt = *x0; + move16(); + *x0 = add_o( xt, *x1, &Overflow ); + move16(); + *x1 = sub_o( xt, *x1, &Overflow ); + move16(); + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_SAS must be set properly. + *-----------------------------------------------------------------*/ + + n2 = 1; + move16(); + /* step = N_MAX_SAS/4; */ + FOR( k = 2; k <= m; k++ ) + { + n4 = n2; + move16(); + n2 = shl( n4, 1 ); + n1 = shl( n2, 1 ); + + step = idiv1616( N_MAX_SAS, n1 ); + + x0 = x; + x1 = x + n2; + x2 = x + add( n2, n4 ); + FOR( i = 0; i < n; i += n1 ) + { + xt = *x0; + move16(); /* xt = x[i]; */ + *x0 = add_o( xt, *x1, &Overflow ); + move16(); /* x[i] = xt + x[i+n2]; */ + *x1 = sub_o( xt, *x1, &Overflow ); + move16(); /* x[i+n2] = xt - x[i+n2]; */ + *x2 = negate( *x2 ); + move16(); /* x[i+n2+n4] = -x[i+n2+n4]; */ + + + s = sincos_t_fx + step; // Q15 + c = s + 64; // Q15 + xi1 = x + add( i, 1 ); + xi3 = xi1 + n2; + xi2 = xi3 - 2; + xi4 = xi1 + sub( n1, 2 ); + + FOR( j = 1; j < n4; j++ ) + { + t1 = add_o( mult_r( *xi3, *c ), mult_r( *xi4, *s ), &Overflow ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx */ + t2 = sub_o( mult_r( *xi3, *s ), mult_r( *xi4, *c ), &Overflow ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx */ + *xi4 = sub_o( *xi2, t2, &Overflow ); + move16(); + *xi3 = negate( add_o( *xi2, t2, &Overflow ) ); + move16(); + *xi2 = sub_o( *xi1, t1, &Overflow ); + move16(); + *xi1 = add_o( *xi1, t1, &Overflow ); + move16(); + + xi4--; + xi2--; + xi3++; + xi1++; + c += step; + s += step; /* autoincrement by ar0 */ + } + + x0 += n1; + x1 += n1; + x2 += n1; + } + /* step = shr(step, 1); */ + } + + return; +} + +void fft_rel_fx32( + Word32 x[], /* i/o: input/output vector Qx */ + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ +) +{ + Word16 i, j, k, n1, n2, n4; + Word16 step; + Word32 xt, t1, t2; + Word32 *x0, *x1, *x2; + Word32 *xi2, *xi3, *xi4, *xi1; + const Word16 *s, *c; + const Word16 *idx; + + /* !!!! NMAX = 256 is hardcoded here (similar optimizations should be done for NMAX > 256) !!! */ + + Word32 *x2even, *x2odd; + Word32 temp[512]; + + test(); + test(); + IF( EQ_16( n, 128 ) || EQ_16( n, 256 ) || EQ_16( n, 512 ) ) + { + idx = fft256_read_indexes; + + /* Combined Digit reverse counter & Length two butterflies */ + IF( EQ_16( n, 128 ) ) + { + x2 = temp; + FOR( i = 0; i < 64; i++ ) + { + j = *idx++; + move16(); + k = *idx++; + move16(); + + *x2++ = L_add( x[( j >> 1 )], x[( k >> 1 )] ); // Qx + move16(); + *x2++ = L_sub( x[( j >> 1 )], x[( k >> 1 )] ); // Qx + move16(); + } + } + ELSE IF( EQ_16( n, 256 ) ) + { + x2 = temp; + FOR( i = 0; i < 128; i++ ) + { + j = *idx++; + move16(); + k = *idx++; + move16(); + + *x2++ = L_add( x[j], x[k] ); // Qx + move16(); + *x2++ = L_sub( x[j], x[k] ); // Qx + move16(); + } + } + ELSE IF( EQ_16( n, 512 ) ) + { + x2even = temp; + x2odd = temp + 256; + + FOR( i = 0; i < 128; i++ ) + { + j = shl( *idx, 1 ); + idx++; + k = shl( *idx, 1 ); + idx++; + + *x2even++ = L_add( x[j], x[k] ); // Qx + move16(); + *x2even++ = L_sub( x[j], x[k] ); // Qx + move16(); + j = add( j, 1 ); + k = add( k, 1 ); + *x2odd++ = L_add( x[j], x[k] ); // Qx + move16(); + *x2odd++ = L_sub( x[j], x[k] ); // Qx + move16(); + } + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + * Also, it allows to Put the Data from 'temp' back into 'x' due + * to the previous Combined Digit Reverse and Length two butterflies + *-----------------------------------------------------------------*/ + + /*for_ (k = 2; k < 3; k++)*/ + { + x0 = temp; + x1 = x0 + 2; + x2 = x; // Qx + + FOR( i = 0; i < n; i += 4 ) + { + *x2++ = L_add( *x0++, *x1 ); /* x[i] = xt + x[i+n2]; */ + move16(); + *x2++ = *x0; + move16(); + x0--; + *x2++ = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + move16(); + x1++; + *x2++ = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; */ + move16(); + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + ELSE + { + /*-----------------------------------------------------------------* + * Digit reverse counter + *-----------------------------------------------------------------*/ + + j = 0; + move16(); + x0 = &x[0]; // Qx + FOR( i = 0; i < ( n - 1 ); i++ ) + { + IF( LT_16( i, j ) ) + { + xt = x[j]; // Qx + move32(); + x[j] = *x0; + move32(); + *x0 = xt; + move32(); + } + x0++; + k = shr( n, 1 ); + WHILE( ( k <= j ) ) + { + j = sub( j, k ); + k = shr( k, 1 ); + } + j = add( j, k ); + } + + /*-----------------------------------------------------------------* + * Length two butterflies + *-----------------------------------------------------------------*/ + + x0 = &x[0]; // Qx + x1 = &x[1]; // Qx + FOR( i = 0; i < ( n >> 1 ); i++ ) + { + *x1 = L_sub( *x0, *x1 ); // Qx + move32(); + *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); //*x0 * 2 - *x1 (Qx) + move32(); + + x0++; + x0++; + x1++; + x1++; + } + + /*-----------------------------------------------------------------* + * 1st Stage Loop has been Unrolled because n4 is '1' and that + * allows the elimination of the 'for_ (j = 1; j < n4; j++)' loop + * and the associated pointers initialization. + *-----------------------------------------------------------------*/ + + /* for_ (k = 2; k < 3; k++) */ + { + x0 = x; // Qx + x1 = x0 + 2; + + FOR( i = 0; i < n; i += 4 ) + { + *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; Qx*/ + move32(); + *x0 = L_sub( L_shl( *x0, 1 ), *x1++ ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ + move32(); + *x1 = L_negate( *x1 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx*/ + move32(); + + x0 += 4; + x1 += 3; /* x1 has already advanced */ + } + } + } + + /*-----------------------------------------------------------------* + * Other butterflies + * + * The implementation described in [1] has been changed by using + * table lookup for evaluating sine and cosine functions. The + * variable ind and its increment step are needed to access table + * entries. Note that this implementation assumes n4 to be so + * small that ind will never exceed the table. Thus the input + * argument n and the constant N_MAX_FFT must be set properly. + *-----------------------------------------------------------------*/ + + n4 = 1; + move16(); + n2 = 2; + move16(); + n1 = 4; + move16(); + + step = N_MAX_DIV4; + move16(); + + FOR( k = 3; k <= m; k++ ) + { + step = shr( step, 1 ); + n4 = shl( n4, 1 ); + n2 = shl( n2, 1 ); + n1 = shl( n1, 1 ); + + x0 = x; + x1 = x0 + n2; + x2 = x1 + n4; + + FOR( i = 0; i < n; i += n1 ) + { + *x1 = L_sub( *x0, *x1 ); /* x[i+n2] = xt - x[i+n2]; */ + move32(); + *x0 = L_sub( L_shl( *x0, 1 ), *x1 ); /* x[i] = xt + x[i+n2]; */ /**x0 * 2 - *x1 (Qx)*/ + move32(); + *x2 = L_negate( *x2 ); /* x[i+n2+n4] = -x[i+n2+n4]; Qx */ + move32(); + + s = sincos_t_ext_fx; // Q15 + c = s + N_MAX_FFT / 4; /* 1024/4 = 256, 256/4=64 Q15*/ + xi1 = x0; + xi3 = xi1 + n2; + xi2 = xi3; + x0 += n1; + xi4 = x0; + + FOR( j = 1; j < n4; j++ ) + { + xi3++; + xi1++; + xi4--; + xi2--; + c += step; + s += step; /* autoincrement by ar0 */ + + t1 = L_add( Mpy_32_16_1( *xi3, *c ), Mpy_32_16_1( *xi4, *s ) ); /* t1 = *xi3**(pt_c+ind) + *xi4**(pt_s+ind); Qx*/ + t2 = L_sub( Mpy_32_16_1( *xi3, *s ), Mpy_32_16_1( *xi4, *c ) ); /* t2 = *xi3**(pt_s+ind) - *xi4**(pt_c+ind); Qx*/ + + *xi4 = L_sub( *xi2, t2 ); + move32(); + *xi2 = L_sub( *xi1, t1 ); + move32(); + *xi1 = L_sub( L_shl( *xi1, 1 ), *xi2 ); // Qx + move32(); + *xi3 = L_negate( L_add( L_shl( t2, 1 ), *xi4 ) ); // Qx + move32(); + } + + x1 += n1; + x2 += n1; + } + } + + return; +} diff --git a/lib_com/fill_spectrum.c b/lib_com/fill_spectrum_fx.c similarity index 100% rename from lib_com/fill_spectrum.c rename to lib_com/fill_spectrum_fx.c diff --git a/lib_com/findpulse.c b/lib_com/findpulse_fx.c similarity index 100% rename from lib_com/findpulse.c rename to lib_com/findpulse_fx.c diff --git a/lib_com/gs_gains.c b/lib_com/gs_gains.c deleted file mode 100644 index 8fa769475..000000000 --- a/lib_com/gs_gains.c +++ /dev/null @@ -1,425 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "wmc_auto.h" - -static void GSC_gain_DQ_fx( - const Word16 element_mode, /* i : element mode */ - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word16 coder_type, /* i : Coder type */ - const Word16 Mbands_gn, /* i : Number of band */ - const Word32 core_brate, /* i : Core bitrate */ - const Word16 mean_g, /* i : Average gain Q12 */ - const Word16 *Gain_in, /* i : Unquantized gain vector Q12 */ - Word16 *Gain_out /* o : Level adjusted unquantized gain vector Q12 */ -) -{ - Word16 Gain_off; - Word16 i; - - /* Gain adjustment to fit ACELP generic inactive coding gain at low rate */ - Gain_off = 0; - move16(); - - test(); - IF( coder_type == INACTIVE || EQ_16( coder_type, UNVOICED ) ) - { - test(); - IF( LE_32( core_brate, ACELP_5k00 ) && EQ_16( coder_type, UNVOICED ) ) - { - Gain_off = 1843; // 9/20 in Q12 - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_7k20 ) ) - { - Gain_off = 1638; // 8/20 in Q12; /* 0 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_8k00 ) ) - { - Gain_off = 1351; // 6.6f/20 in Q12 /* ~-3.3 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_9k60 ) ) - { - Gain_off = 983; // 4.8f/20 in Q12 /* ~-2.4 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_11k60 ) ) - { - Gain_off = 717; // 3.5f/20 in Q12 /* ~-2.4 dB */ - move16(); - } - ELSE IF( LE_32( core_brate, ACELP_13k20 ) ) - { - Gain_off = 614; // 3.0f/20 in Q12 /* ~-2.4 dB */ - move16(); - } - } - - test(); - IF( coder_type != INACTIVE && NE_16( coder_type, UNVOICED ) ) - { - FOR( i = 0; i < Mbands_gn; i++ ) - { - Gain_out[i] = add( Gain_in[i], mean_g ); // Q12 - move16(); - } - } - ELSE - { - /*mimic ACELP decay of energy for low rates*/ - test(); - IF( element_mode == EVS_MONO && EQ_16( enc_dec, DEC ) ) - { - /* This is to keep EVS mono bit-exact with the standard (there might be a small desynchronization between encoder and decoder but there is no real quality or interop. issue) */ - FOR( i = 0; i < Mbands_gn; i++ ) - { - Gain_out[i] = add( Gain_out[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 - move16(); - // Gain_out[i] += mean_g - i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ); - } - } - ELSE - { - FOR( i = 0; i < Mbands_gn; i++ ) - { - Gain_out[i] = add( Gain_in[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 - move16(); - // Gain_out[i] = Gain_in[i] + mean_g - ( i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ) ); - } - } - } - - return; -} - -Word16 gsc_gainQ_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 y_gain4[], - /* i : Energy per band */ // Q12 - Word16 y_gainQ[], - /* o : quantized energy per band */ // Q12 - const Word32 core_brate, /* i : Core rate */ - const Word16 coder_type, /* i : coding type */ - const Word16 bwidth, /* i : input signal bandwidth */ - const Word16 L_frame, /* i : frame length */ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word32 core_brate_inp /* i : true core bitrate */ -) -{ - Word16 y_gain_tmp[MBANDS_GN16k]; - Word16 y_gain_tmp2[MBANDS_GN16k]; - Word16 i, idx_g = 0; - move16(); - Word16 mean_4g_fx[1], ftmp1_fx; - Word16 Mbands_gn = MBANDS_GN; - move16(); - Word16 y_gain_tmp3[MBANDS_GN]; - Word32 L_tmp; - - if ( EQ_16( L_frame, L_FRAME16k ) ) - { - Mbands_gn = MBANDS_GN16k; - move16(); - } - - mean_4g_fx[0] = 0; - move32(); - - test(); - test(); - IF( ( EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && bwidth == NB ) - { - L_tmp = 0; - move32(); - FOR( i = 0; i < 10; i++ ) - { - L_tmp = L_add( L_tmp, y_gain4[i] ); - } - L_tmp = L_sub( Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ), 2457 /* 0.6f in Q12 */ ); // Q12 - ftmp1_fx = extract_l( L_tmp ); - FOR( i = 0; i < Mbands_gn; i++ ) - { - IF( LT_16( y_gain4[i], ftmp1_fx ) ) - { - y_gain_tmp2[i] = ftmp1_fx; /*Q12*/ - } - ELSE - { - y_gain_tmp2[i] = y_gain4[i]; /*Q12*/ - } - move16(); - } - - /* Quantized mean gain without clipping */ - L_tmp = 0; - move32(); - FOR( i = 0; i < 10; i++ ) - { - L_tmp = L_add( L_tmp, y_gain4[i] ); - } - L_tmp = Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ); // Q12 - mean_4g_fx[0] = extract_l( L_tmp ); // Q12 - move16(); - idx_g = vquant_fx( mean_4g_fx, Gain_meanNB_fx, mean_4g_fx, Gain_mean_dicNB_fx, 1, 64 ); - push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); - - FOR( i = 0; i < Mbands_gn; i++ ) - { - y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 - move16(); - } - - if ( LT_16( y_gain_tmp[9], -1229 /* -0.3f in Q12 */ ) ) - { - y_gain_tmp[9] = -1229; /* -0.3f in Q12 */ - move16(); - } - - set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); - idx_g = vquant_fx( y_gain_tmp, Mean_dic_NB_fx, y_gain_tmp, Gain_dic1_NB_fx, 3, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - IF( LT_32( core_brate, ACELP_9k60 ) ) - { - idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NB_fx, 3, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NB_fx, 4, 16 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); - } - ELSE - { - idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NBHR_fx, 3, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NBHR_fx, 4, 128 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); - } - - test(); - IF( LE_32( core_brate, ACELP_9k60 ) && coder_type == INACTIVE ) - { - /* Some energy is needed in high band for stat_noise_uv_enc() to be functional in inactive speech */ - y_gain_tmp[10] = mean_fx( y_gain_tmp + 6, 3 ); /*Q12*/ - move16(); - y_gain_tmp[11] = mean_fx( y_gain_tmp + 7, 3 ); /*Q12*/ - move16(); - y_gain_tmp[12] = mean_fx( y_gain_tmp + 8, 3 ); /*Q12*/ - move16(); - y_gain_tmp[13] = mean_fx( y_gain_tmp + 9, 3 ); /*Q12*/ - move16(); - y_gain_tmp[14] = mean_fx( y_gain_tmp + 10, 3 ); /*Q12*/ - move16(); - y_gain_tmp[15] = mean_fx( y_gain_tmp + 11, 3 ); /*Q12*/ - move16(); - } - ELSE - { - set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); - } - } - ELSE - { - L_tmp = 0; - move32(); - FOR( i = 0; i < 16; i++ ) - { - L_tmp = L_add( L_tmp, y_gain4[i] ); - } - L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 - ftmp1_fx = extract_l( L_tmp ); - FOR( i = 0; i < Mbands_gn; i++ ) - { - IF( LT_16( y_gain4[i], sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) - { - y_gain_tmp2[i] = sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); - } - ELSE IF( GT_16( y_gain4[i], add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) - { - y_gain_tmp2[i] = add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); - } - ELSE - { - y_gain_tmp2[i] = y_gain4[i]; - } - move16(); - } - - L_tmp = 0; - move32(); - FOR( i = 0; i < 16; i++ ) - { - L_tmp = L_add( L_tmp, y_gain_tmp2[i] ); - } - L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 - mean_4g_fx[0] = extract_l( L_tmp ); // Q12 - move16(); - idx_g = vquant_fx( mean_4g_fx, mean_m_fx, mean_4g_fx, mean_gain_dic_fx, 1, 64 ); - push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); - - /* Subtraction of the average gain */ - FOR( i = 0; i < Mbands_gn; i++ ) - { - y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 - move16(); - } - - IF( LT_32( core_brate, ACELP_9k60 ) ) - { - /* prediction and quantization of the average gain */ - - /*--------------------------------------------------------------------------------------* - * Quantization of the first 8 bands - * Keep only 4 bands out of the last 8 bands - *--------------------------------------------------------------------------------------*/ - - Copy( y_gain_tmp, y_gain_tmp2, 8 ); - - y_gain_tmp2[8] = y_gain_tmp[8]; - move16(); - y_gain_tmp2[9] = y_gain_tmp[10]; - move16(); - y_gain_tmp2[10] = y_gain_tmp[12]; - move16(); - y_gain_tmp2[11] = y_gain_tmp[14]; - move16(); - - idx_g = 0; - move16(); - idx_g = vquant_fx( y_gain_tmp2, YGain_mean_LR_fx, y_gain_tmp2, YGain_dic1_LR_fx, 3, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - test(); - test(); - test(); - IF( !( coder_type == INACTIVE && tdm_LRTD_flag == 0 && EQ_16( idchan, 1 ) ) || GT_32( core_brate_inp, GSC_LRES_GAINQ_LIMIT ) ) - { - idx_g = vquant_fx( y_gain_tmp2 + 3, YGain_mean_LR_fx + 3, y_gain_tmp2 + 3, YGain_dic2_LR_fx, 4, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - /*----------------------------------------------------------------------* - * Vector quantization of the first 8 bands + quantization of the 4 bands out of the last 8 - * Interpolation of the last 4 bands Q to create bands 8-16 - *----------------------------------------------------------------------*/ - - idx_g = vquant_fx( y_gain_tmp2 + 7, YGain_mean_LR_fx + 7, y_gain_tmp2 + 7, YGain_dic3_LR_fx, 5, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - set16_fx( y_gain_tmp2 + 12, 0, MBANDS_GN - 12 ); - - /* Update to quantized vector */ - Copy( y_gain_tmp2, y_gain_tmp, 8 ); - - Copy( y_gain_tmp2 + 8, y_gain_tmp3, 4 ); - set16_fx( y_gain_tmp + 8, 0, 8 ); - fft_rel_fx( y_gain_tmp2 + 8, 4, 2 ); - - Copy( y_gain_tmp2 + 8, y_gain_tmp + 8, 3 ); - y_gain_tmp[15] = y_gain_tmp2[11]; - move16(); - ifft_rel_fx( y_gain_tmp + 8, 8, 3 ); - - FOR( i = 8; i < 16; i++ ) - { - y_gain_tmp[i] = shl( mult( y_gain_tmp[i], 23101 /* 1.41 in Q14 */ ), 1 ); /*Q12*/ - move16(); - } - - y_gain_tmp[8] = y_gain_tmp3[0]; - move16(); - y_gain_tmp[10] = y_gain_tmp3[1]; - move16(); - y_gain_tmp[12] = y_gain_tmp3[2]; - move16(); - y_gain_tmp[14] = y_gain_tmp3[3]; - move16(); - } - ELSE - { - Copy( y_gain_tmp2, y_gain_tmp, 3 ); - set16_fx( y_gain_tmp + 3, 0, MBANDS_GN16k - 3 ); - } - } - ELSE - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - idx_g = vquant_fx( y_gain_tmp, YG_mean16_fx, y_gain_tmp, YG_dicMR_1_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16_fx + 4, y_gain_tmp + 4, YG_dicMR_2_fx, 4, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16_fx + 8, y_gain_tmp + 8, YG_dicMR_3_fx, 4, 32 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); - - idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16_fx + 12, y_gain_tmp + 12, YG_dicMR_4_fx, 4, 16 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); - } - ELSE - { - idx_g = vquant_fx( y_gain_tmp, YG_mean16HR_fx, y_gain_tmp, YG_dicHR_1_fx, 4, 128 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); - - idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16HR_fx + 4, y_gain_tmp + 4, YG_dicHR_2_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16HR_fx + 8, y_gain_tmp + 8, YG_dicHR_3_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16HR_16kHz_fx, y_gain_tmp + 12, YG_dicHR_4_16kHz_fx, 4, 64 ); - push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); - - idx_g = vquant_fx( y_gain_tmp + 16, YG_meanL2G_16kHz_fx, y_gain_tmp + 16, YG_dicL2G_16kHz_fx, 2, 8 ); - push_indice( hBstr, IND_Y_GAIN_HF, idx_g, 3 ); - } - } - } - - GSC_gain_DQ_fx( element_mode, ENC, coder_type, Mbands_gn, core_brate, mean_4g_fx[0], y_gain_tmp, y_gainQ ); - - return mean_4g_fx[0]; -} diff --git a/lib_com/gs_gains_fx.c b/lib_com/gs_gains_fx.c index ecfe9aae0..f28af742f 100644 --- a/lib_com/gs_gains_fx.c +++ b/lib_com/gs_gains_fx.c @@ -34,11 +34,14 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ +#include +#include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" #include "stl.h" +#include "wmc_auto.h" /*-------------------------------------------------------------------* * Local constants @@ -66,6 +69,7 @@ static Word16 VDQ_vec_fx( Word16 *Qvec_out_fx, const Word16 *mean_dic_fx, const /* RETURN ARGUMENTS : */ /* _ None */ /*========================================================================*/ + void Comp_and_apply_gain_fx( Word16 exc_diffQ[], /* i/o: Quantized excitation */ Word16 Ener_per_bd_iQ[], /* i : Target ener per band Q13 */ @@ -264,6 +268,7 @@ void Comp_and_apply_gain_ivas_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*========================================================================*/ + static Word16 Comp_band_log_ener( /* o : Band gain Q12 */ const Word16 *pt_fx, /* i : Dct input Q_sc */ const Word16 Len, /* i : Lenght en energy accumulation */ @@ -363,127 +368,14 @@ void Ener_per_band_comp_ivas_fx( return; } -void Ener_per_band_comp_ivas_fx_2( - const Word16 exc_diff[], /* i : target signal Q_exc */ - Word16 y_gain4[], /* o : Energy per band to quantize Q12 */ - const Word16 Q_exc, - const Word16 Mband, /* i : Max band */ - const Word16 Eflag, /* i : flag of highest band */ - const Word16 L_frame /* i : frame length */ -) -{ - Word32 etmp, L_tmp; - Word16 etmp_e; - const Word16 *pt; - Word16 i, j, tmp; - tmp = add( shl( sub( Q15, Q_exc ), 1 ), 1 ); - pt = exc_diff; - FOR( j = 0; j < 2; j++ ) - { - y_gain4[j] = 0; - move16(); - etmp = 42949673; /* 0.02 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - pt = exc_diff + shl( j, 3 ); - FOR( i = 0; i < 8; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - /* normalized to 16 bins to easy the quantization */ - etmp_e = add( etmp_e, 1 ); - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - - FOR( j = 1; j < Mband - 2; j++ ) - { - etmp = 21474836; /* 0.01 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - pt = exc_diff + shl( j, 4 ); - FOR( i = 0; i < 16; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j + 1] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - - IF( EQ_16( Eflag, 1 ) ) - { - etmp = 21474836; /* 0.01 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - pt = exc_diff + shl( j, 4 ); - FOR( i = 0; i < 32; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - etmp_e = sub( etmp_e, 1 ); - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j + 1] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - etmp = 21474836; /* 0.01 in Q31 */ - move32(); - etmp_e = 0; - move16(); - - FOR( i = 0; i < 32; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - Word16 tmp2 = sub( etmp_e, 1 ); - L_tmp = Sqrt32( etmp, &tmp2 ); - L_tmp = BASOP_Util_Log10( L_tmp, tmp2 ); // Q25 - y_gain4[j + 2] = extract_h( L_shl( L_tmp, 3 ) ); // Q12 - move16(); - - FOR( i = 0; i < 32; i++ ) - { - etmp = BASOP_Util_Add_Mant32Exp( etmp, etmp_e, L_mult0( *pt, *pt ), tmp, &etmp_e ); - pt++; - } - - etmp_e = sub( etmp_e, 1 ); - etmp = Sqrt32( etmp, &etmp_e ); - etmp = BASOP_Util_Log10( etmp, etmp_e ); // Q25 - y_gain4[j + 3] = extract_h( L_shl( etmp, 3 ) ); // Q12 - move16(); - } - - return; -} /*-------------------------------------------------------------------* * gsc_gainQ() * * Quantization of the energy per band *-------------------------------------------------------------------*/ + static void GSC_gain_adj( const Word16 coder_type, /* i : Coder type */ const Word32 core_brate, /* i : Bit rate */ @@ -550,11 +442,13 @@ static void GSC_gain_adj( return; } + /*-------------------------------------------------------------------* * GSC_gain_adj_ivas_fx() * * Quantization of the energy per band *-------------------------------------------------------------------*/ + static void GSC_gain_adj_ivas_fx( const Word16 coder_type, /* i : Coder type */ const Word16 Mbands_gn, /* i : Number of band */ @@ -629,6 +523,404 @@ static void GSC_gain_adj_ivas_fx( return; } + +/*-------------------------------------------------------------------* + * GSC_gain_DQ() + * + * Form the final vector after gain quantization/Dequantization + * Common to both encoder and decoder + *-------------------------------------------------------------------*/ + +static void GSC_gain_DQ_fx( + const Word16 element_mode, /* i : element mode */ + const Word16 enc_dec, /* i : encoder/decoder flag */ + const Word16 coder_type, /* i : Coder type */ + const Word16 Mbands_gn, /* i : Number of band */ + const Word32 core_brate, /* i : Core bitrate */ + const Word16 mean_g, /* i : Average gain Q12 */ + const Word16 *Gain_in, /* i : Unquantized gain vector Q12 */ + Word16 *Gain_out /* o : Level adjusted unquantized gain vector Q12 */ +) +{ + Word16 Gain_off; + Word16 i; + + /* Gain adjustment to fit ACELP generic inactive coding gain at low rate */ + Gain_off = 0; + move16(); + + test(); + IF( coder_type == INACTIVE || EQ_16( coder_type, UNVOICED ) ) + { + test(); + IF( LE_32( core_brate, ACELP_5k00 ) && EQ_16( coder_type, UNVOICED ) ) + { + Gain_off = 1843; // 9/20 in Q12 + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_7k20 ) ) + { + Gain_off = 1638; // 8/20 in Q12; /* 0 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_8k00 ) ) + { + Gain_off = 1351; // 6.6f/20 in Q12 /* ~-3.3 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_9k60 ) ) + { + Gain_off = 983; // 4.8f/20 in Q12 /* ~-2.4 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_11k60 ) ) + { + Gain_off = 717; // 3.5f/20 in Q12 /* ~-2.4 dB */ + move16(); + } + ELSE IF( LE_32( core_brate, ACELP_13k20 ) ) + { + Gain_off = 614; // 3.0f/20 in Q12 /* ~-2.4 dB */ + move16(); + } + } + + test(); + IF( coder_type != INACTIVE && NE_16( coder_type, UNVOICED ) ) + { + FOR( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = add( Gain_in[i], mean_g ); // Q12 + move16(); + } + } + ELSE + { + /*mimic ACELP decay of energy for low rates*/ + test(); + IF( element_mode == EVS_MONO && EQ_16( enc_dec, DEC ) ) + { + /* This is to keep EVS mono bit-exact with the standard (there might be a small desynchronization between encoder and decoder but there is no real quality or interop. issue) */ + FOR( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = add( Gain_out[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 + move16(); + // Gain_out[i] += mean_g - i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ); + } + } + ELSE + { + FOR( i = 0; i < Mbands_gn; i++ ) + { + Gain_out[i] = add( Gain_in[i], sub( mean_g, mult( Gain_off, div_s( i, Mbands_gn ) ) ) ); // Q12 + move16(); + // Gain_out[i] = Gain_in[i] + mean_g - ( i * ( Gain_off / 20.f ) / ( (float) Mbands_gn ) ); + } + } + } + + return; +} + + +/*-------------------------------------------------------------------* + * gsc_gainQ() + * + * Quantization of the energy per band + *-------------------------------------------------------------------*/ + +Word16 gsc_gainQ_ivas_fx( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 y_gain4[], + /* i : Energy per band */ // Q12 + Word16 y_gainQ[], + /* o : quantized energy per band */ // Q12 + const Word32 core_brate, /* i : Core rate */ + const Word16 coder_type, /* i : coding type */ + const Word16 bwidth, /* i : input signal bandwidth */ + const Word16 L_frame, /* i : frame length */ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word32 core_brate_inp /* i : true core bitrate */ +) +{ + Word16 y_gain_tmp[MBANDS_GN16k]; + Word16 y_gain_tmp2[MBANDS_GN16k]; + Word16 i, idx_g = 0; + move16(); + Word16 mean_4g_fx[1], ftmp1_fx; + Word16 Mbands_gn = MBANDS_GN; + move16(); + Word16 y_gain_tmp3[MBANDS_GN]; + Word32 L_tmp; + + if ( EQ_16( L_frame, L_FRAME16k ) ) + { + Mbands_gn = MBANDS_GN16k; + move16(); + } + + mean_4g_fx[0] = 0; + move32(); + + test(); + test(); + IF( ( EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && bwidth == NB ) + { + L_tmp = 0; + move32(); + FOR( i = 0; i < 10; i++ ) + { + L_tmp = L_add( L_tmp, y_gain4[i] ); + } + L_tmp = L_sub( Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ), 2457 /* 0.6f in Q12 */ ); // Q12 + ftmp1_fx = extract_l( L_tmp ); + FOR( i = 0; i < Mbands_gn; i++ ) + { + IF( LT_16( y_gain4[i], ftmp1_fx ) ) + { + y_gain_tmp2[i] = ftmp1_fx; /*Q12*/ + } + ELSE + { + y_gain_tmp2[i] = y_gain4[i]; /*Q12*/ + } + move16(); + } + + /* Quantized mean gain without clipping */ + L_tmp = 0; + move32(); + FOR( i = 0; i < 10; i++ ) + { + L_tmp = L_add( L_tmp, y_gain4[i] ); + } + L_tmp = Mpy_32_16_1( L_tmp, 3277 /* (1/10.0f) in Q15 */ ); // Q12 + mean_4g_fx[0] = extract_l( L_tmp ); // Q12 + move16(); + idx_g = vquant_fx( mean_4g_fx, Gain_meanNB_fx, mean_4g_fx, Gain_mean_dicNB_fx, 1, 64 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + + FOR( i = 0; i < Mbands_gn; i++ ) + { + y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 + move16(); + } + + if ( LT_16( y_gain_tmp[9], -1229 /* -0.3f in Q12 */ ) ) + { + y_gain_tmp[9] = -1229; /* -0.3f in Q12 */ + move16(); + } + + set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); + idx_g = vquant_fx( y_gain_tmp, Mean_dic_NB_fx, y_gain_tmp, Gain_dic1_NB_fx, 3, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + IF( LT_32( core_brate, ACELP_9k60 ) ) + { + idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NB_fx, 3, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NB_fx, 4, 16 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + } + ELSE + { + idx_g = vquant_fx( y_gain_tmp + 3, Mean_dic_NB_fx + 3, y_gain_tmp + 3, Gain_dic2_NBHR_fx, 3, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 6, Mean_dic_NB_fx + 6, y_gain_tmp + 6, Gain_dic3_NBHR_fx, 4, 128 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + } + + test(); + IF( LE_32( core_brate, ACELP_9k60 ) && coder_type == INACTIVE ) + { + /* Some energy is needed in high band for stat_noise_uv_enc() to be functional in inactive speech */ + y_gain_tmp[10] = mean_fx( y_gain_tmp + 6, 3 ); /*Q12*/ + move16(); + y_gain_tmp[11] = mean_fx( y_gain_tmp + 7, 3 ); /*Q12*/ + move16(); + y_gain_tmp[12] = mean_fx( y_gain_tmp + 8, 3 ); /*Q12*/ + move16(); + y_gain_tmp[13] = mean_fx( y_gain_tmp + 9, 3 ); /*Q12*/ + move16(); + y_gain_tmp[14] = mean_fx( y_gain_tmp + 10, 3 ); /*Q12*/ + move16(); + y_gain_tmp[15] = mean_fx( y_gain_tmp + 11, 3 ); /*Q12*/ + move16(); + } + ELSE + { + set16_fx( y_gain_tmp + 10, 0, MBANDS_GN - 10 ); + } + } + ELSE + { + L_tmp = 0; + move32(); + FOR( i = 0; i < 16; i++ ) + { + L_tmp = L_add( L_tmp, y_gain4[i] ); + } + L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 + ftmp1_fx = extract_l( L_tmp ); + FOR( i = 0; i < Mbands_gn; i++ ) + { + IF( LT_16( y_gain4[i], sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) + { + y_gain_tmp2[i] = sub( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); + } + ELSE IF( GT_16( y_gain4[i], add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ) ) ) + { + y_gain_tmp2[i] = add( ftmp1_fx, 2457 /* 0.6 in Q12*/ ); + } + ELSE + { + y_gain_tmp2[i] = y_gain4[i]; + } + move16(); + } + + L_tmp = 0; + move32(); + FOR( i = 0; i < 16; i++ ) + { + L_tmp = L_add( L_tmp, y_gain_tmp2[i] ); + } + L_tmp = Mpy_32_16_1( L_tmp, 2048 /* (1/16.f) in Q15 */ ); // Q12 + mean_4g_fx[0] = extract_l( L_tmp ); // Q12 + move16(); + idx_g = vquant_fx( mean_4g_fx, mean_m_fx, mean_4g_fx, mean_gain_dic_fx, 1, 64 ); + push_indice( hBstr, IND_MEAN_GAIN2, idx_g, 6 ); + + /* Subtraction of the average gain */ + FOR( i = 0; i < Mbands_gn; i++ ) + { + y_gain_tmp[i] = sub( y_gain_tmp2[i], mean_4g_fx[0] ); // Q12 + move16(); + } + + IF( LT_32( core_brate, ACELP_9k60 ) ) + { + /* prediction and quantization of the average gain */ + + /*--------------------------------------------------------------------------------------* + * Quantization of the first 8 bands + * Keep only 4 bands out of the last 8 bands + *--------------------------------------------------------------------------------------*/ + + Copy( y_gain_tmp, y_gain_tmp2, 8 ); + + y_gain_tmp2[8] = y_gain_tmp[8]; + move16(); + y_gain_tmp2[9] = y_gain_tmp[10]; + move16(); + y_gain_tmp2[10] = y_gain_tmp[12]; + move16(); + y_gain_tmp2[11] = y_gain_tmp[14]; + move16(); + + idx_g = 0; + move16(); + idx_g = vquant_fx( y_gain_tmp2, YGain_mean_LR_fx, y_gain_tmp2, YGain_dic1_LR_fx, 3, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + test(); + test(); + test(); + IF( !( coder_type == INACTIVE && tdm_LRTD_flag == 0 && EQ_16( idchan, 1 ) ) || GT_32( core_brate_inp, GSC_LRES_GAINQ_LIMIT ) ) + { + idx_g = vquant_fx( y_gain_tmp2 + 3, YGain_mean_LR_fx + 3, y_gain_tmp2 + 3, YGain_dic2_LR_fx, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + /*----------------------------------------------------------------------* + * Vector quantization of the first 8 bands + quantization of the 4 bands out of the last 8 + * Interpolation of the last 4 bands Q to create bands 8-16 + *----------------------------------------------------------------------*/ + + idx_g = vquant_fx( y_gain_tmp2 + 7, YGain_mean_LR_fx + 7, y_gain_tmp2 + 7, YGain_dic3_LR_fx, 5, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + set16_fx( y_gain_tmp2 + 12, 0, MBANDS_GN - 12 ); + + /* Update to quantized vector */ + Copy( y_gain_tmp2, y_gain_tmp, 8 ); + + Copy( y_gain_tmp2 + 8, y_gain_tmp3, 4 ); + set16_fx( y_gain_tmp + 8, 0, 8 ); + fft_rel_fx( y_gain_tmp2 + 8, 4, 2 ); + + Copy( y_gain_tmp2 + 8, y_gain_tmp + 8, 3 ); + y_gain_tmp[15] = y_gain_tmp2[11]; + move16(); + ifft_rel_fx( y_gain_tmp + 8, 8, 3 ); + + FOR( i = 8; i < 16; i++ ) + { + y_gain_tmp[i] = shl( mult( y_gain_tmp[i], 23101 /* 1.41 in Q14 */ ), 1 ); /*Q12*/ + move16(); + } + + y_gain_tmp[8] = y_gain_tmp3[0]; + move16(); + y_gain_tmp[10] = y_gain_tmp3[1]; + move16(); + y_gain_tmp[12] = y_gain_tmp3[2]; + move16(); + y_gain_tmp[14] = y_gain_tmp3[3]; + move16(); + } + ELSE + { + Copy( y_gain_tmp2, y_gain_tmp, 3 ); + set16_fx( y_gain_tmp + 3, 0, MBANDS_GN16k - 3 ); + } + } + ELSE + { + IF( EQ_16( L_frame, L_FRAME ) ) + { + idx_g = vquant_fx( y_gain_tmp, YG_mean16_fx, y_gain_tmp, YG_dicMR_1_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16_fx + 4, y_gain_tmp + 4, YG_dicMR_2_fx, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16_fx + 8, y_gain_tmp + 8, YG_dicMR_3_fx, 4, 32 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 5 ); + + idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16_fx + 12, y_gain_tmp + 12, YG_dicMR_4_fx, 4, 16 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 4 ); + } + ELSE + { + idx_g = vquant_fx( y_gain_tmp, YG_mean16HR_fx, y_gain_tmp, YG_dicHR_1_fx, 4, 128 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 7 ); + + idx_g = vquant_fx( y_gain_tmp + 4, YG_mean16HR_fx + 4, y_gain_tmp + 4, YG_dicHR_2_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 8, YG_mean16HR_fx + 8, y_gain_tmp + 8, YG_dicHR_3_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 12, YG_mean16HR_16kHz_fx, y_gain_tmp + 12, YG_dicHR_4_16kHz_fx, 4, 64 ); + push_indice( hBstr, IND_Y_GAIN_TMP, idx_g, 6 ); + + idx_g = vquant_fx( y_gain_tmp + 16, YG_meanL2G_16kHz_fx, y_gain_tmp + 16, YG_dicL2G_16kHz_fx, 2, 8 ); + push_indice( hBstr, IND_Y_GAIN_HF, idx_g, 3 ); + } + } + } + + GSC_gain_DQ_fx( element_mode, ENC, coder_type, Mbands_gn, core_brate, mean_4g_fx[0], y_gain_tmp, y_gainQ ); + + return mean_4g_fx[0]; +} + + /*==========================================================================*/ /* FUNCTION : Word16 gsc_gaindec_fx () */ /*--------------------------------------------------------------------------*/ @@ -649,6 +941,7 @@ static void GSC_gain_adj_ivas_fx( /* RETURN ARGUMENTS : */ /* _ (Word16) : average frequency gain */ /*==========================================================================*/ + Word16 gsc_gaindec_fx( /* o : average frequency gain */ Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 y_gainQ_fx[], /* o : quantized gain per band */ @@ -786,6 +1079,7 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai return mean_4g_fx; } + /*==========================================================================*/ /* FUNCTION : Word16 gsc_gaindec_ivas_fx () */ /*--------------------------------------------------------------------------*/ @@ -806,6 +1100,7 @@ Word16 gsc_gaindec_fx( /* o : average frequency gai /* RETURN ARGUMENTS : */ /* _ (Word16) : average frequency gain */ /*==========================================================================*/ + Word16 gsc_gaindec_ivas_fx( /* o : average frequency gain */ Decoder_State *st_fx, /* i/o: decoder state structure */ Word16 y_gainQ_fx[], /* o : quantized gain per band Q12 */ @@ -970,11 +1265,13 @@ Word16 gsc_gaindec_ivas_fx( /* o : average frequenc return mean_4g_fx; } + /*-------------------------------------------------------------------* * gsc_gainQ() * * Quantization of the energy per band *-------------------------------------------------------------------*/ + Word16 gsc_gainQ_fx( /*Q12*/ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 y_gain4[], /* i : Energy per band Q12 */ @@ -1200,11 +1497,14 @@ Word16 gsc_gainQ_fx( /*Q12*/ return mean_4g[0]; /*Q12*/ } + + /*-------------------------------------------------------------------* * VDQ_vec() * * Return the dequantized vector of index *-------------------------------------------------------------------*/ + static Word16 VDQ_vec_fx( Word16 *Qvec_out_fx, /* o: Quanitzed vector */ const Word16 *mean_dic_fx, /* i: average codebook */ diff --git a/lib_com/hq2_core_com.c b/lib_com/hq2_core_com.c deleted file mode 100644 index 121dae06a..000000000 --- a/lib_com/hq2_core_com.c +++ /dev/null @@ -1,177 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "basop_util.h" -#include "basop_proto_func.h" -#include "wmc_auto.h" - - -#define WMC_TOOL_SKIP -void bit_allocation_second_fx2( - Word32 *Rk, /* Q16 */ - Word32 *Rk_sort, /* Q16 */ - Word16 BANDS, /* Q0 */ - const Word16 *band_width, /* Q0 */ - Word16 *k_sort, /* Q0 */ - Word16 *k_num, /* Q0 */ - const Word16 *p2a_flags, /* Q0 */ - const Word16 p2a_bands, /* Q0 */ - const Word16 *last_bitalloc, /* Q0 */ - const Word16 input_frame /* Q0 */ -) -{ - Word16 k, k2 = 0; - Word16 ever_bits[BANDS_MAX], ever_sort[BANDS_MAX]; /*Q12 */ - Word16 class_flag = 0; - Word16 rk_temp = 32767, ever_temp = 32767; /*Q12 */ - Word16 exp; - Word16 tmp; - Word32 L_tmp; - move16(); - move16(); - move16(); - move16(); - - - FOR( k = 0; k < BANDS; k++ ) - { - test(); - test(); - IF( ( ( sub( k_sort[k], sub( BANDS, p2a_bands ) ) >= 0 ) && ( sub( p2a_flags[k_sort[k]], 1 ) == 0 ) ) || - ( ( sub( k_sort[k], ( BANDS - 2 ) ) >= 0 ) && ( sub( last_bitalloc[k_sort[k] - ( BANDS - 2 )], 1 ) == 0 ) ) ) - { - exp = norm_s( band_width[k_sort[k]] ); - tmp = shl( band_width[k_sort[k]], exp ); /*Q(exp) */ - tmp = div_s( 16384, tmp ); /*Q(15+14-exp = 29-exp) */ - L_tmp = Mult_32_16( Rk_sort[k], tmp ); /* Q(16+29-exp-15 = 30-exp) */ - tmp = sub( 18, exp ); - ever_bits[k] = extract_l( L_shr( L_tmp, tmp ) ); /*Q12 */ - if ( sub( ever_bits[k], rk_temp ) < 0 ) - { - rk_temp = ever_bits[k]; /* Q12 */ - k2 = k; - move16(); - move16(); - } - class_flag = 1; - move16(); - } - } - IF( class_flag == 0 || sub( input_frame, L_FRAME8k ) == 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - test(); - IF( sub( k_sort[k], sub( BANDS, p2a_bands ) ) < 0 && Rk_sort[k] > 0 ) - { - exp = norm_s( band_width[k_sort[k]] ); - tmp = shl( band_width[k_sort[k]], exp ); /*Q(exp) */ - tmp = div_s( 16384, tmp ); /*Q(15+14-exp = 29-exp) */ - L_tmp = Mult_32_16( Rk_sort[k], tmp ); /* Q(16+29-exp-15 = 30-exp) */ - tmp = sub( 18, exp ); - ever_sort[k] = extract_l( L_shr( L_tmp, tmp ) ); /*Q12 */ - move16(); - IF( sub( ever_sort[k], ever_temp ) < 0 ) - { - ever_temp = ever_sort[k]; /* Q12 */ - move16(); - k2 = k; - move16(); - } - } - } - } - - k_num[0] = k2; - move16(); - IF( sub( k_sort[k2], sub( BANDS, 1 ) ) == 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], sub( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - ELSE IF( k_sort[k2] == 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], add( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - ELSE - { - IF( L_sub( Rk[sub( k_sort[k2], 1 )], Rk[add( k_sort[k2], 1 )] ) < 0 ) - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], sub( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - ELSE - { - FOR( k = 0; k < BANDS; k++ ) - { - IF( sub( k_sort[k], add( k_sort[k2], 1 ) ) == 0 ) - { - k_num[1] = k; /* Q0 */ - move16(); - } - } - } - } - - return; -} - -#undef WMC_TOOL_SKIP diff --git a/lib_com/hq_conf.c b/lib_com/hq_conf.c deleted file mode 100644 index 90a256cea..000000000 --- a/lib_com/hq_conf.c +++ /dev/null @@ -1,303 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "wmc_auto.h" - - -void hq_configure_fx( - const Word16 length, /* i : Frame length Q0 */ - const Word16 hqswb_clas, /* i : HQ SWB class Q0 */ - const Word32 core_brate, /* i : Codec bitrate Q0 */ - Word16 *num_sfm, /* o : Total number of subbands Q0 */ - Word16 *nb_sfm, /* o : Total number of coded bands Q0 */ - Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */ - Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */ - Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */ - Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */ - Word16 *sfmsize, /* o : Subband bandwidths Q0 */ - Word16 *sfm_start, /* o : Subband start coefficients Q0 */ - Word16 *sfm_end /* o : Subband end coefficients Q0 */ -) -{ - const Word16 *p_sfmsize; - const Word16 *p_sfm_start; - const Word16 *p_sfm_end; - Word16 i, bw_ext; - - bw_ext = 0; - move16(); - - *start_norm = 0; - move16(); - - IF( EQ_16( length, L_SPEC48k ) ) - { - IF( EQ_16( hqswb_clas, HQ_GEN_FB ) ) - { - *num_sfm = NB_SFM; - move16(); - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - - IF( GE_32( core_brate, HQ_32k ) ) - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; - move16(); - *num_env_bands = SFM_N_STA_10k; - move16(); - } - ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/ - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; - *num_env_bands = SFM_N_STA_8k; - move16(); - move16(); - } - *nb_sfm = *num_sfm; - move16(); - } - ELSE - { - IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) - { - *num_sfm = SFM_N_HARM_FB; - move16(); - *nb_sfm = SFM_N_HARM_FB; - move16(); - *num_env_bands = SFM_N_HARM_FB; - move16(); - - p_sfmsize = band_len_harm; /* Q0 */ - p_sfm_start = band_start_harm; /* Q0 */ - p_sfm_end = band_end_harm; /* Q0 */ - } - ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) - { - IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) - { - *num_sfm = SFM_N_HARM_FB; - move16(); - *nb_sfm = HVQ_THRES_SFM_24k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); - move16(); - *start_norm = HVQ_THRES_SFM_24k; - move16(); - } - ELSE - { - *num_sfm = SFM_N_HARM_FB; - move16(); - *nb_sfm = HVQ_THRES_SFM_32k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); - move16(); - *start_norm = HVQ_THRES_SFM_32k; - move16(); - } - p_sfmsize = band_len_harm; /* Q0 */ - p_sfm_start = band_start_harm; /* Q0 */ - p_sfm_end = band_end_harm; /* Q0 */ - } - ELSE - { - *num_sfm = NB_SFM; - move16(); - *nb_sfm = *num_sfm; /* Q0 */ - move16(); - *num_env_bands = NB_SFM; - move16(); - - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - } - } - } - ELSE IF( EQ_16( length, L_SPEC32k ) ) - { - IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) - { - *num_sfm = SFM_N_HARM; - move16(); - *nb_sfm = SFM_N_HARM; - move16(); - *num_env_bands = SFM_N_HARM; - move16(); - - p_sfmsize = band_len_harm; /* Q0 */ - p_sfm_start = band_start_harm; /* Q0 */ - p_sfm_end = band_end_harm; /* Q0 */ - } - ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) - { - IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) - { - *num_sfm = SFM_N_HARM; - move16(); - *nb_sfm = HVQ_THRES_SFM_24k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ - move16(); - - *start_norm = HVQ_THRES_SFM_24k; - move16(); - } - ELSE - { - *num_sfm = SFM_N_HARM; - move16(); - *nb_sfm = HVQ_THRES_SFM_32k; - move16(); - *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ - move16(); - - *start_norm = HVQ_THRES_SFM_32k; - move16(); - } - p_sfmsize = band_len_harm; - p_sfm_start = band_start_harm; - p_sfm_end = band_end_harm; - } - ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) ) - { - *num_sfm = SFM_N_SWB; - move16(); - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - - IF( GE_32( core_brate, HQ_32k ) ) - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; - move16(); - *num_env_bands = SFM_N_STA_10k; - move16(); - } - ELSE /*if( EQ_32(core_brate, HQ_24k40))*/ - { - *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; - move16(); - *num_env_bands = SFM_N_STA_8k; - move16(); - } - - *nb_sfm = *num_sfm; - move16(); - } - ELSE - { - /* HQ_NORMAL and HQ_TRANSIENT */ - *num_sfm = SFM_N_SWB; - move16(); - *nb_sfm = *num_sfm; - move16(); - *num_env_bands = SFM_N_SWB; - move16(); - - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - } - } - ELSE IF( EQ_16( length, L_SPEC48k_EXT ) ) - { - bw_ext = 1; - p_sfmsize = band_len_HQ; /* Q0 */ - p_sfm_start = band_start_HQ; /* Q0 */ - p_sfm_end = band_end_HQ; /* Q0 */ - *num_sfm = NB_SFM; - } - ELSE IF( EQ_16( length, L_SPEC16k_EXT ) ) - { - bw_ext = 1; - move16(); - p_sfmsize = band_len_wb; /* Q0 */ - p_sfm_start = band_start_wb; /* Q0 */ - p_sfm_end = band_end_wb; /* Q0 */ - *num_sfm = SFM_N_WB; - move16(); - } - ELSE - { - *num_sfm = SFM_N_WB; - move16(); - *nb_sfm = *num_sfm; /* Q0 */ - move16(); - *num_env_bands = SFM_N_WB; - move16(); - - p_sfmsize = band_len_wb; /* Q0 */ - p_sfm_start = band_start_wb; /* Q0 */ - p_sfm_end = band_end_wb; /* Q0 */ - } - IF( bw_ext ) - { - FOR( i = 0; i < *num_sfm; i++ ) - { - /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/ - sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ - move16(); - /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/ - sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ - move16(); - /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/ - sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ - move16(); - } - *nb_sfm = *num_sfm; /* Q0 */ - *num_env_bands = *num_sfm; /* Q0 */ - move16(); - move16(); - } - ELSE - { - Copy( p_sfmsize, sfmsize, *num_sfm ); - Copy( p_sfm_start, sfm_start, *num_sfm ); - Copy( p_sfm_end, sfm_end, *num_sfm ); - } - - *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) ); - move16(); - - return; -} diff --git a/lib_com/hq_conf_fx.c b/lib_com/hq_conf_fx.c index f6a01adfc..b40062448 100644 --- a/lib_com/hq_conf_fx.c +++ b/lib_com/hq_conf_fx.c @@ -8,6 +8,7 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" +#include "wmc_auto.h" /*--------------------------------------------------------------------------* * hq_configure() @@ -538,3 +539,263 @@ void hq_configure_evs_fx( return; } + +void hq_configure_fx( + const Word16 length, /* i : Frame length Q0 */ + const Word16 hqswb_clas, /* i : HQ SWB class Q0 */ + const Word32 core_brate, /* i : Codec bitrate Q0 */ + Word16 *num_sfm, /* o : Total number of subbands Q0 */ + Word16 *nb_sfm, /* o : Total number of coded bands Q0 */ + Word16 *start_norm, /* o : First norm to be SDE encoded Q0 */ + Word16 *num_env_bands, /* o : Number coded envelope bands Q0 */ + Word16 *numnrmibits, /* o : Number of bits in fall-back norm encoding Q0 */ + Word16 *hq_generic_offset, /* o : Freq offset for HQ GENERIC Q0 */ + Word16 *sfmsize, /* o : Subband bandwidths Q0 */ + Word16 *sfm_start, /* o : Subband start coefficients Q0 */ + Word16 *sfm_end /* o : Subband end coefficients Q0 */ +) +{ + const Word16 *p_sfmsize; + const Word16 *p_sfm_start; + const Word16 *p_sfm_end; + Word16 i, bw_ext; + + bw_ext = 0; + move16(); + + *start_norm = 0; + move16(); + + IF( EQ_16( length, L_SPEC48k ) ) + { + IF( EQ_16( hqswb_clas, HQ_GEN_FB ) ) + { + *num_sfm = NB_SFM; + move16(); + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + + IF( GE_32( core_brate, HQ_32k ) ) + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; + move16(); + *num_env_bands = SFM_N_STA_10k; + move16(); + } + ELSE /*IF(EQ_32(core_brate, HQ_16k40) || EQ_32(core_brate, HQ_24k40))*/ + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; + *num_env_bands = SFM_N_STA_8k; + move16(); + move16(); + } + *nb_sfm = *num_sfm; + move16(); + } + ELSE + { + IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) + { + *num_sfm = SFM_N_HARM_FB; + move16(); + *nb_sfm = SFM_N_HARM_FB; + move16(); + *num_env_bands = SFM_N_HARM_FB; + move16(); + + p_sfmsize = band_len_harm; /* Q0 */ + p_sfm_start = band_start_harm; /* Q0 */ + p_sfm_end = band_end_harm; /* Q0 */ + } + ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) + { + IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) + { + *num_sfm = SFM_N_HARM_FB; + move16(); + *nb_sfm = HVQ_THRES_SFM_24k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); + move16(); + *start_norm = HVQ_THRES_SFM_24k; + move16(); + } + ELSE + { + *num_sfm = SFM_N_HARM_FB; + move16(); + *nb_sfm = HVQ_THRES_SFM_32k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); + move16(); + *start_norm = HVQ_THRES_SFM_32k; + move16(); + } + p_sfmsize = band_len_harm; /* Q0 */ + p_sfm_start = band_start_harm; /* Q0 */ + p_sfm_end = band_end_harm; /* Q0 */ + } + ELSE + { + *num_sfm = NB_SFM; + move16(); + *nb_sfm = *num_sfm; /* Q0 */ + move16(); + *num_env_bands = NB_SFM; + move16(); + + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + } + } + } + ELSE IF( EQ_16( length, L_SPEC32k ) ) + { + IF( EQ_16( hqswb_clas, HQ_HARMONIC ) ) + { + *num_sfm = SFM_N_HARM; + move16(); + *nb_sfm = SFM_N_HARM; + move16(); + *num_env_bands = SFM_N_HARM; + move16(); + + p_sfmsize = band_len_harm; /* Q0 */ + p_sfm_start = band_start_harm; /* Q0 */ + p_sfm_end = band_end_harm; /* Q0 */ + } + ELSE IF( EQ_16( hqswb_clas, HQ_HVQ ) ) + { + IF( LT_32( core_brate, HQ_BWE_CROSSOVER_BRATE ) ) + { + *num_sfm = SFM_N_HARM; + move16(); + *nb_sfm = HVQ_THRES_SFM_24k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ + move16(); + + *start_norm = HVQ_THRES_SFM_24k; + move16(); + } + ELSE + { + *num_sfm = SFM_N_HARM; + move16(); + *nb_sfm = HVQ_THRES_SFM_32k; + move16(); + *num_env_bands = sub( *num_sfm, *nb_sfm ); /* Q0 */ + move16(); + + *start_norm = HVQ_THRES_SFM_32k; + move16(); + } + p_sfmsize = band_len_harm; + p_sfm_start = band_start_harm; + p_sfm_end = band_end_harm; + } + ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) ) + { + *num_sfm = SFM_N_SWB; + move16(); + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + + IF( GE_32( core_brate, HQ_32k ) ) + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_32K; + move16(); + *num_env_bands = SFM_N_STA_10k; + move16(); + } + ELSE /*if( EQ_32(core_brate, HQ_24k40))*/ + { + *hq_generic_offset = HQ_GENERIC_FOFFSET_24K4; + move16(); + *num_env_bands = SFM_N_STA_8k; + move16(); + } + + *nb_sfm = *num_sfm; + move16(); + } + ELSE + { + /* HQ_NORMAL and HQ_TRANSIENT */ + *num_sfm = SFM_N_SWB; + move16(); + *nb_sfm = *num_sfm; + move16(); + *num_env_bands = SFM_N_SWB; + move16(); + + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + } + } + ELSE IF( EQ_16( length, L_SPEC48k_EXT ) ) + { + bw_ext = 1; + p_sfmsize = band_len_HQ; /* Q0 */ + p_sfm_start = band_start_HQ; /* Q0 */ + p_sfm_end = band_end_HQ; /* Q0 */ + *num_sfm = NB_SFM; + } + ELSE IF( EQ_16( length, L_SPEC16k_EXT ) ) + { + bw_ext = 1; + move16(); + p_sfmsize = band_len_wb; /* Q0 */ + p_sfm_start = band_start_wb; /* Q0 */ + p_sfm_end = band_end_wb; /* Q0 */ + *num_sfm = SFM_N_WB; + move16(); + } + ELSE + { + *num_sfm = SFM_N_WB; + move16(); + *nb_sfm = *num_sfm; /* Q0 */ + move16(); + *num_env_bands = SFM_N_WB; + move16(); + + p_sfmsize = band_len_wb; /* Q0 */ + p_sfm_start = band_start_wb; /* Q0 */ + p_sfm_end = band_end_wb; /* Q0 */ + } + IF( bw_ext ) + { + FOR( i = 0; i < *num_sfm; i++ ) + { + /*sfmsize[i] = (int16_t)(1.25f * p_sfmsize[i]);*/ + sfmsize[i] = mult_r( shl( p_sfmsize[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ + move16(); + /*sfm_start[i] = (int16_t)(1.25f * p_sfm_start[i]);*/ + sfm_start[i] = mult_r( shl( p_sfm_start[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ + move16(); + /*sfm_end[i] = (int16_t)(1.25f * p_sfm_end[i]);*/ + sfm_end[i] = mult_r( shl( p_sfm_end[i], 1 ), 20480 /* 1.25 in Q14 */ ); /* Q0 */ + move16(); + } + *nb_sfm = *num_sfm; /* Q0 */ + *num_env_bands = *num_sfm; /* Q0 */ + move16(); + move16(); + } + ELSE + { + Copy( p_sfmsize, sfmsize, *num_sfm ); + Copy( p_sfm_start, sfm_start, *num_sfm ); + Copy( p_sfm_end, sfm_end, *num_sfm ); + } + + *numnrmibits = extract_l( L_mult0( sub( *num_env_bands, 1 ), NORMI_BITS ) ); + move16(); + + return; +} diff --git a/lib_com/ifft_rel.c b/lib_com/ifft_rel_fx.c similarity index 100% rename from lib_com/ifft_rel.c rename to lib_com/ifft_rel_fx.c diff --git a/lib_com/int_lsp.c b/lib_com/int_lsp_fx.c similarity index 100% rename from lib_com/int_lsp.c rename to lib_com/int_lsp_fx.c diff --git a/lib_com/interleave_spectrum.c b/lib_com/interleave_spectrum_fx.c similarity index 100% rename from lib_com/interleave_spectrum.c rename to lib_com/interleave_spectrum_fx.c diff --git a/lib_com/interpol.c b/lib_com/interpol_fx.c similarity index 100% rename from lib_com/interpol.c rename to lib_com/interpol_fx.c diff --git a/lib_com/ivas_mcmasa_com-fx.c b/lib_com/ivas_mcmasa_com_fx.c similarity index 100% rename from lib_com/ivas_mcmasa_com-fx.c rename to lib_com/ivas_mcmasa_com_fx.c diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 8b6cdcac9..928736427 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2127,13 +2127,6 @@ void small_reduction_direction_fx( const Word16 raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], Word16 *diff ); - -void sort_desc_ind_16_fx( - Word16 *s, /* i/o: vector to be sorted Qx*/ - const Word16 len, /* i : vector length */ - Word16 *ind /* o : array of indices */ -); - void sort_desc_ind_32_fx( Word32 *s, /* i/o: vector to be sorted Qx*/ const Word16 len, /* i : vector length */ @@ -6205,7 +6198,7 @@ void ivas_param_ism_compute_noisy_speech_flag_fx( * DFT Stereo prototypes *----------------------------------------------------------------------------------*/ -void stereo_dft_dec_destroy( +void stereo_dft_dec_destroy_fx( STEREO_DFT_DEC_DATA_HANDLE *hStereoDft /* i/o: decoder DFT stereo handle */ ); diff --git a/lib_com/lag_wind.c b/lib_com/lag_wind_fx.c similarity index 100% rename from lib_com/lag_wind.c rename to lib_com/lag_wind_fx.c diff --git a/lib_com/lerp.c b/lib_com/lerp_fx.c similarity index 100% rename from lib_com/lerp.c rename to lib_com/lerp_fx.c diff --git a/lib_com/modif_fs.c b/lib_com/modif_fs.c deleted file mode 100644 index 10e64a57d..000000000 --- a/lib_com/modif_fs.c +++ /dev/null @@ -1,469 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "wmc_auto.h" - - -/* IVAS 32-bit variant */ -void Interpolate_allpass_steep_fx32( - const Word32 *in_fx, /* i : input array of size N Qx */ - Word32 *mem_fx, /* i/o: memory Qx */ - const Word16 N, /* i : number of input samples */ - Word32 *out_fx /* o : output array of size 2*N Qx */ -) -{ - Word16 n, k; - Word32 temp_fx[ALLPASSSECTIONS_STEEP - 1]; - - /* upper allpass filter chain */ - FOR( k = 0; k < N; k++ ) - { - temp_fx[0] = Madd_32_16( mem_fx[0], in_fx[k], AP2_STEEP_FX[0] ); // Qx - move32(); - mem_fx[0] = Msub_32_16( in_fx[k], temp_fx[0], AP2_STEEP_FX[0] ); // Qx - move32(); - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { - temp_fx[n] = Madd_32_16( mem_fx[n], temp_fx[n - 1], AP2_STEEP_FX[n] ); // Qx - move32(); - mem_fx[n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP2_STEEP_FX[n] ); // Qx - move32(); - } - - out_fx[2 * k + 1] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem_fx[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k + 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - } - - /* lower allpass filter chain */ - FOR( k = 0; k < N; k++ ) - { - temp_fx[0] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP], in_fx[k], AP1_STEEP_FX[0] ); // Qx - move32(); - mem_fx[ALLPASSSECTIONS_STEEP] = Msub_32_16( in_fx[k], temp_fx[0], AP1_STEEP_FX[0] ); // Qx - move32(); - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { - temp_fx[n] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP + n], temp_fx[n - 1], AP1_STEEP_FX[n] ); // Qx - move32(); - mem_fx[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP1_STEEP_FX[n] ); // Qx - move32(); - } - - out_fx[2 * k] = Madd_32_16( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - } - - return; -} - -/* IVAS 32-bit variant */ -void Decimate_allpass_steep_fx32( - const Word32 *in, /* i : input array of size N Qx */ - Word32 *mem, /* i/o: memory Qx */ - const Word16 N, /* i : number of input samples */ - Word32 *out /* o : output array of size N/2 Qx */ -) -{ - Word16 n, k; - Word32 temp[ALLPASSSECTIONS_STEEP]; - - /* upper allpass filter chain */ - FOR( k = 0; k < N / 2; k++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[0] = Madd_32_16( mem[0], in[2 * k], AP1_STEEP_FX[0] ); // Qx - move32(); - mem[0] = Msub_32_16( in[2 * k], temp[0], AP1_STEEP_FX[0] ); // Qx - move32(); - - temp[1] = Madd_32_16( mem[1], temp[0], AP1_STEEP_FX[1] ); // Qx - move32(); - mem[1] = Msub_32_16( temp[0], temp[1], AP1_STEEP_FX[1] ); // Qx - move32(); - - out[k] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[0], Mpy_32_16_1( in[2 * k], AP1_STEEP_FX[0] ) ); // Qx - move32(); - mem[0] = L_sub( in[2 * k], Mpy_32_16_1( temp[0], AP1_STEEP_FX[0] ) ); // Qx - move32(); - - temp[1] = L_add( mem[1], Mpy_32_16_1( temp[0], AP1_STEEP_FX[1] ) ); // Qx - move32(); - mem[1] = L_sub( temp[0], Mpy_32_16_1( temp[1], AP1_STEEP_FX[1] ) ); // Qx - move32(); - - out[k] = L_add( mem[ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - } - - /* lower allpass filter chain */ -#ifdef OPT_STEREO_32KBPS_V1 - temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( mem[2 * ALLPASSSECTIONS_STEEP], temp[0], AP2_STEEP_FX[0] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = L_sub( mem[2 * ALLPASSSECTIONS_STEEP], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP + 1] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx - move32(); - /*if ( fabs( temp[n] ) < 1e-12 ) - { - temp[n] = sign( temp[n] ) * 1e-12f; - }*/ - mem[ALLPASSSECTIONS_STEEP + 1] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - } - -#ifdef OPT_STEREO_32KBPS_V1 - temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - - mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - - mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - out[0] = W_round48_L( W_mac_32_16( W_mult_32_16( out[0], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx - move32(); - - FOR( k = 1; k < N / 2; k++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], in[2 * k - 1], AP2_STEEP_FX[0] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( in[2 * k - 1], temp[0], AP2_STEEP_FX[0] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( in[sub( shl( k, 1 ), 1 )], AP2_STEEP_FX[0] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = L_sub( in[sub( shl( k, 1 ), 1 )], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - /* for better performance, unroll this loop */ - FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) - { -#ifdef OPT_STEREO_32KBPS_V1 - temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx - move32(); - /*if ( fabs( temp[n] ) < 1e-12 ) - { - temp[n] = sign( temp[n] ) * 1e-12f; - }*/ - mem[ALLPASSSECTIONS_STEEP + n] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - } - -#ifdef OPT_STEREO_32KBPS_V1 - temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); - mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - out[k] = W_round48_L( W_mac_32_16( W_mult_32_16( out[k], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx - move32(); - } - - /* z^(-1) */ - mem[2 * ALLPASSSECTIONS_STEEP] = in[N - 1]; - move32(); - - return; -} - -/* IVAS 32-bit variant */ -void interpolate_3_over_2_allpass_fx32( - const Word32 *input, /* i : input signal Qx*/ - const Word16 len, /* i : number of input samples */ - Word32 *out, /* o : output signal Qx*/ - Word32 *mem /* i/o: memory Qx*/ -) -{ - Word16 i, loop_len; - Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ - Word32 out1_buff[L_FRAME32k * 3]; - Word32 *out1; - Word32 mem_temp; - const Word16 *filt_coeff = allpass_poles_3_ov_2; // Q15 - - out1 = out1_buff; - - FOR( i = 0; i < len; i++ ) - { - /* Upper branch */ -#ifdef OPT_STEREO_32KBPS_V1 - Vu[0] = Madd_32_16( mem[0], L_sub( input[i], mem[1] ), filt_coeff[0] ); // Qx + Q15 - Q15 -> Qx - move32(); - Vu[1] = Madd_32_16( mem[1], L_sub( Vu[0], mem[2] ), filt_coeff[1] ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[3] = Madd_32_16( mem[2], L_sub( Vu[1], mem[3] ), filt_coeff[2] ); // Qx + Q15 - Q15 -> Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vu[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vu[1] = L_add( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[3] = L_add( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - mem[1] = Vu[0]; // Qx - move32(); - mem[2] = Vu[1]; // Qx - move32(); - *out1++ = mem[3]; // Qx - move32(); - - /* Middle branch */ -#ifdef OPT_STEREO_32KBPS_V1 - Vm[0] = Madd_32_16( mem[0], L_sub( input[i], mem[4] ), filt_coeff[3] ); // Qx + Q15 - Q15 -> Qx - move32(); - Vm[1] = Madd_32_16( mem[4], L_sub( Vm[0], mem[5] ), filt_coeff[4] ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[6] = Madd_32_16( mem[5], L_sub( Vm[1], mem[6] ), filt_coeff[5] ); // Qx + Q15 - Q15 -> Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vm[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vm[1] = L_add( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[6] = L_add( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - mem[4] = Vm[0]; // Qx - move32(); - mem[5] = Vm[1]; // Qx - move32(); - *out1++ = mem[6]; // Qx - move32(); - - /* Lower branch */ -#ifdef OPT_STEREO_32KBPS_V1 - Vl[0] = Madd_32_16( mem[0], L_sub( input[i], mem[7] ), filt_coeff[6] ); // Qx + Q15 - Q15 -> Qx - move32(); - Vl[1] = Madd_32_16( mem[7], L_sub( Vl[0], mem[8] ), filt_coeff[7] ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[9] = Madd_32_16( mem[8], L_sub( Vl[1], mem[9] ), filt_coeff[8] ); // Qx + Q15 - Q15 -> Qx - move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vl[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vl[1] = L_add( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[9] = L_add( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ - - mem[0] = input[i]; // Qx - move32(); - mem[7] = Vl[0]; // Qx - move32(); - mem[8] = Vl[1]; // Qx - move32(); - *out1++ = mem[9]; // Qx - move32(); - } - - loop_len = shr( i_mult( len, 3 ), 1 ); - - /*decimate by 2 and LPF*/ - FOR( i = 0; i < loop_len; i++ ) - { - mem_temp = out1_buff[2 * i]; - move32(); -#ifdef OPT_STEREO_32KBPS_V1 - out[i] = Madd_32_16( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), L_add( mem[11], mem[14] ), -4965 ); // Qx + Q15 - Q15 -> Qx - // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 - out[i] = Madd_32_16( out[i], L_add( mem[12], mem[13] ), 20125 ); - // 0.614152f in Q15 -> 20125 -#else /* OPT_STEREO_32KBPS_V1 */ - out[i] = L_add( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), Mpy_32_16_1( L_add( mem[11], mem[14] ), -4965 ) ); // Qx + Q15 - Q15 -> Qx - // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 - out[i] = L_add( out[i], Mpy_32_16_1( L_add( mem[12], mem[13] ), 20125 ) ); - // 0.614152f in Q15 -> 20125 -#endif /* OPT_STEREO_32KBPS_V1 */ - mem[10] = mem[11]; // Qx - move32(); - mem[11] = mem[12]; // Qx - move32(); - mem[12] = mem[13]; // Qx - move32(); - mem[13] = mem[14]; // Qx - move32(); - mem[14] = mem_temp; // Qx - move32(); - } - - return; -} - -/* IVAS 32-bit variant */ -void interpolate_3_over_1_allpass_fx32( - const Word32 *input, /* i : input signal Qx */ - const Word16 len, /* i : number of input samples */ - Word32 *out, /* o : output signal */ - Word32 *mem /* i/o: memory */ -) -{ - Word16 i, tmp16; - Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ - Word32 *out1; - Word32 mem_temp; - const Word16 *filt_coeff = allpass_poles_3_ov_2; // Qx - - out1 = &out[0]; - - FOR( i = 0; i < len; i++ ) - { - /* Upper branch */ - Vu[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx - move32(); - Vu[1] = L_add_sat( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx - move32(); - mem[3] = L_add_sat( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx - move32(); - - mem[1] = Vu[0]; // Qx - move32(); - mem[2] = Vu[1]; // Qx - move32(); - *out1++ = mem[3]; // Qx - move32(); - - /* Middle branch */ - Vm[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx - move32(); - Vm[1] = L_add_sat( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx - move32(); - mem[6] = L_add_sat( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx - move32(); - - mem[4] = Vm[0]; // Qx - move32(); - mem[5] = Vm[1]; // Qx - move32(); - *out1++ = mem[6]; // Qx - move32(); - - /* Lower branch */ - Vl[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx - move32(); - Vl[1] = L_add_sat( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx - move32(); - mem[9] = L_add_sat( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx - move32(); - - mem[0] = input[i]; // Qx - move32(); - mem[7] = Vl[0]; // Qx - move32(); - mem[8] = Vl[1]; // Qx - move32(); - *out1++ = mem[9]; // Qx - move32(); - } - - /*LPF*/ - tmp16 = imult1616( len, 3 ); - FOR( i = 0; i < tmp16; i++ ) - { - mem_temp = out[i]; // Qx - move32(); - out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2424 ) ); // Qx - // 0.572769 in Q15 -> 18768, 0.074005 in Q15 -> 2424 - move32(); - mem[10] = mem[11]; // Qx - move32(); - mem[11] = mem[12]; // Qx - move32(); - mem[12] = mem_temp; // Qx - move32(); - } - - return; -} diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index bcbff13d5..2e39af523 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -3,6 +3,7 @@ ====================================================================================*/ #include +#include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "prot_fx.h" @@ -11,6 +12,8 @@ #include "rom_enc.h" /* prototypes */ #include "basop_util.h" #include "ivas_prot_fx.h" +#include "wmc_auto.h" + /*-----------------------------------------------------------------* * Local functions @@ -39,6 +42,7 @@ /*------------------------------------------------------------------------------*/ /* CALLED FROM : TX/RX */ /*==============================================================================*/ + Word16 modify_Fs_ivas_fx( /* o : length of output Q0 */ const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ Word16 lg, /* i : length of input Q0 */ @@ -323,6 +327,7 @@ Word16 modify_Fs_ivas_fx( /* o : length of output Q return lg_out; } + Word16 modify_Fs_fx( /* o : length of output Q0 */ const Word16 sigIn_fx[], /* i : signal to decimate Q0 */ Word16 lg, /* i : length of input Q0 */ @@ -599,6 +604,7 @@ Word16 modify_Fs_fx( /* o : length of output Q0 */ return lg_out; } + /*-------------------------------------------------------------------* * modify_Fs_intcub3m_sup() * @@ -911,7 +917,6 @@ Word16 modify_Fs_intcub3m_sup_fx( /* o : length of output /* RETURN ARGUMENTS : _ None. */ /*===================================================================*/ - void Decimate_allpass_steep_fx( const Word16 *in_fx, Word16 mem[], /* array of size: 2*ALLPASSSECTIONS_STEEP+1 */ @@ -1040,6 +1045,158 @@ void Decimate_allpass_steep_fx( move16(); /* Qx */ } +/* IVAS 32-bit variant */ +void Decimate_allpass_steep_fx32( + const Word32 *in, /* i : input array of size N Qx */ + Word32 *mem, /* i/o: memory Qx */ + const Word16 N, /* i : number of input samples */ + Word32 *out /* o : output array of size N/2 Qx */ +) +{ + Word16 n, k; + Word32 temp[ALLPASSSECTIONS_STEEP]; + + /* upper allpass filter chain */ + FOR( k = 0; k < N / 2; k++ ) + { +#ifdef OPT_STEREO_32KBPS_V1 + temp[0] = Madd_32_16( mem[0], in[2 * k], AP1_STEEP_FX[0] ); // Qx + move32(); + mem[0] = Msub_32_16( in[2 * k], temp[0], AP1_STEEP_FX[0] ); // Qx + move32(); + + temp[1] = Madd_32_16( mem[1], temp[0], AP1_STEEP_FX[1] ); // Qx + move32(); + mem[1] = Msub_32_16( temp[0], temp[1], AP1_STEEP_FX[1] ); // Qx + move32(); + + out[k] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + temp[0] = L_add( mem[0], Mpy_32_16_1( in[2 * k], AP1_STEEP_FX[0] ) ); // Qx + move32(); + mem[0] = L_sub( in[2 * k], Mpy_32_16_1( temp[0], AP1_STEEP_FX[0] ) ); // Qx + move32(); + + temp[1] = L_add( mem[1], Mpy_32_16_1( temp[0], AP1_STEEP_FX[1] ) ); // Qx + move32(); + mem[1] = L_sub( temp[0], Mpy_32_16_1( temp[1], AP1_STEEP_FX[1] ) ); // Qx + move32(); + + out[k] = L_add( mem[ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + } + + /* lower allpass filter chain */ +#ifdef OPT_STEREO_32KBPS_V1 + temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( mem[2 * ALLPASSSECTIONS_STEEP], temp[0], AP2_STEEP_FX[0] ); // Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ) ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP] = L_sub( mem[2 * ALLPASSSECTIONS_STEEP], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { +#ifdef OPT_STEREO_32KBPS_V1 + temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP + 1] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx + move32(); + /*if ( fabs( temp[n] ) < 1e-12 ) + { + temp[n] = sign( temp[n] ) * 1e-12f; + }*/ + mem[ALLPASSSECTIONS_STEEP + 1] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + } + +#ifdef OPT_STEREO_32KBPS_V1 + temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + + mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx + move32(); + + mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + out[0] = W_round48_L( W_mac_32_16( W_mult_32_16( out[0], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx + move32(); + + FOR( k = 1; k < N / 2; k++ ) + { +#ifdef OPT_STEREO_32KBPS_V1 + temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], in[2 * k - 1], AP2_STEEP_FX[0] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( in[2 * k - 1], temp[0], AP2_STEEP_FX[0] ); // Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( in[sub( shl( k, 1 ), 1 )], AP2_STEEP_FX[0] ) ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP] = L_sub( in[sub( shl( k, 1 ), 1 )], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { +#ifdef OPT_STEREO_32KBPS_V1 + temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx + move32(); + mem[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx + move32(); + /*if ( fabs( temp[n] ) < 1e-12 ) + { + temp[n] = sign( temp[n] ) * 1e-12f; + }*/ + mem[ALLPASSSECTIONS_STEEP + n] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + } + +#ifdef OPT_STEREO_32KBPS_V1 + temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx + move32(); + mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + out[k] = W_round48_L( W_mac_32_16( W_mult_32_16( out[k], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx + move32(); + } + + /* z^(-1) */ + mem[2 * ALLPASSSECTIONS_STEEP] = in[N - 1]; + move32(); + + return; +} + /*-------------------------------------------------------------------* * Interpolate_allpass_steep() @@ -1122,6 +1279,66 @@ void Interpolate_allpass_steep_fx( return; } +/* IVAS 32-bit variant */ +void Interpolate_allpass_steep_fx32( + const Word32 *in_fx, /* i : input array of size N Qx */ + Word32 *mem_fx, /* i/o: memory Qx */ + const Word16 N, /* i : number of input samples */ + Word32 *out_fx /* o : output array of size 2*N Qx */ +) +{ + Word16 n, k; + Word32 temp_fx[ALLPASSSECTIONS_STEEP - 1]; + + /* upper allpass filter chain */ + FOR( k = 0; k < N; k++ ) + { + temp_fx[0] = Madd_32_16( mem_fx[0], in_fx[k], AP2_STEEP_FX[0] ); // Qx + move32(); + mem_fx[0] = Msub_32_16( in_fx[k], temp_fx[0], AP2_STEEP_FX[0] ); // Qx + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp_fx[n] = Madd_32_16( mem_fx[n], temp_fx[n - 1], AP2_STEEP_FX[n] ); // Qx + move32(); + mem_fx[n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP2_STEEP_FX[n] ); // Qx + move32(); + } + + out_fx[2 * k + 1] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem_fx[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k + 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + } + + /* lower allpass filter chain */ + FOR( k = 0; k < N; k++ ) + { + temp_fx[0] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP], in_fx[k], AP1_STEEP_FX[0] ); // Qx + move32(); + mem_fx[ALLPASSSECTIONS_STEEP] = Msub_32_16( in_fx[k], temp_fx[0], AP1_STEEP_FX[0] ); // Qx + move32(); + + /* for better performance, unroll this loop */ + FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) + { + temp_fx[n] = Madd_32_16( mem_fx[ALLPASSSECTIONS_STEEP + n], temp_fx[n - 1], AP1_STEEP_FX[n] ); // Qx + move32(); + mem_fx[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp_fx[n - 1], temp_fx[n], AP1_STEEP_FX[n] ); // Qx + move32(); + } + + out_fx[2 * k] = Madd_32_16( mem_fx[2 * ALLPASSSECTIONS_STEEP - 1], temp_fx[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + mem_fx[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp_fx[ALLPASSSECTIONS_STEEP - 2], out_fx[2 * k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx + move32(); + } + + return; +} + /*-------------------------------------------------------------------* * interpolate_3_over_2_allpass_fx() @@ -1250,6 +1467,133 @@ void interpolate_3_over_2_allpass_fx( return; } +/* IVAS 32-bit variant */ +void interpolate_3_over_2_allpass_fx32( + const Word32 *input, /* i : input signal Qx*/ + const Word16 len, /* i : number of input samples */ + Word32 *out, /* o : output signal Qx*/ + Word32 *mem /* i/o: memory Qx*/ +) +{ + Word16 i, loop_len; + Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ + Word32 out1_buff[L_FRAME32k * 3]; + Word32 *out1; + Word32 mem_temp; + const Word16 *filt_coeff = allpass_poles_3_ov_2; // Q15 + + out1 = out1_buff; + + FOR( i = 0; i < len; i++ ) + { + /* Upper branch */ +#ifdef OPT_STEREO_32KBPS_V1 + Vu[0] = Madd_32_16( mem[0], L_sub( input[i], mem[1] ), filt_coeff[0] ); // Qx + Q15 - Q15 -> Qx + move32(); + Vu[1] = Madd_32_16( mem[1], L_sub( Vu[0], mem[2] ), filt_coeff[1] ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[3] = Madd_32_16( mem[2], L_sub( Vu[1], mem[3] ), filt_coeff[2] ); // Qx + Q15 - Q15 -> Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + Vu[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx + Q15 - Q15 -> Qx + move32(); + Vu[1] = L_add( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[3] = L_add( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx + Q15 - Q15 -> Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + + mem[1] = Vu[0]; // Qx + move32(); + mem[2] = Vu[1]; // Qx + move32(); + *out1++ = mem[3]; // Qx + move32(); + + /* Middle branch */ +#ifdef OPT_STEREO_32KBPS_V1 + Vm[0] = Madd_32_16( mem[0], L_sub( input[i], mem[4] ), filt_coeff[3] ); // Qx + Q15 - Q15 -> Qx + move32(); + Vm[1] = Madd_32_16( mem[4], L_sub( Vm[0], mem[5] ), filt_coeff[4] ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[6] = Madd_32_16( mem[5], L_sub( Vm[1], mem[6] ), filt_coeff[5] ); // Qx + Q15 - Q15 -> Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + Vm[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx + Q15 - Q15 -> Qx + move32(); + Vm[1] = L_add( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[6] = L_add( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx + Q15 - Q15 -> Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + + mem[4] = Vm[0]; // Qx + move32(); + mem[5] = Vm[1]; // Qx + move32(); + *out1++ = mem[6]; // Qx + move32(); + + /* Lower branch */ +#ifdef OPT_STEREO_32KBPS_V1 + Vl[0] = Madd_32_16( mem[0], L_sub( input[i], mem[7] ), filt_coeff[6] ); // Qx + Q15 - Q15 -> Qx + move32(); + Vl[1] = Madd_32_16( mem[7], L_sub( Vl[0], mem[8] ), filt_coeff[7] ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[9] = Madd_32_16( mem[8], L_sub( Vl[1], mem[9] ), filt_coeff[8] ); // Qx + Q15 - Q15 -> Qx + move32(); +#else /* OPT_STEREO_32KBPS_V1 */ + Vl[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx + Q15 - Q15 -> Qx + move32(); + Vl[1] = L_add( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx + Q15 - Q15 -> Qx + move32(); + mem[9] = L_add( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx + Q15 - Q15 -> Qx + move32(); +#endif /* OPT_STEREO_32KBPS_V1 */ + + mem[0] = input[i]; // Qx + move32(); + mem[7] = Vl[0]; // Qx + move32(); + mem[8] = Vl[1]; // Qx + move32(); + *out1++ = mem[9]; // Qx + move32(); + } + + loop_len = shr( i_mult( len, 3 ), 1 ); + + /*decimate by 2 and LPF*/ + FOR( i = 0; i < loop_len; i++ ) + { + mem_temp = out1_buff[2 * i]; + move32(); +#ifdef OPT_STEREO_32KBPS_V1 + out[i] = Madd_32_16( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), L_add( mem[11], mem[14] ), -4965 ); // Qx + Q15 - Q15 -> Qx + // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 + out[i] = Madd_32_16( out[i], L_add( mem[12], mem[13] ), 20125 ); + // 0.614152f in Q15 -> 20125 +#else /* OPT_STEREO_32KBPS_V1 */ + out[i] = L_add( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), Mpy_32_16_1( L_add( mem[11], mem[14] ), -4965 ) ); // Qx + Q15 - Q15 -> Qx + // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 + out[i] = L_add( out[i], Mpy_32_16_1( L_add( mem[12], mem[13] ), 20125 ) ); + // 0.614152f in Q15 -> 20125 +#endif /* OPT_STEREO_32KBPS_V1 */ + mem[10] = mem[11]; // Qx + move32(); + mem[11] = mem[12]; // Qx + move32(); + mem[12] = mem[13]; // Qx + move32(); + mem[13] = mem[14]; // Qx + move32(); + mem[14] = mem_temp; // Qx + move32(); + } + + return; +} + /*-------------------------------------------------------------------* * interpolate_3_over_1_allpass_fx() @@ -1445,6 +1789,92 @@ void interpolate_3_over_1_allpass_fx( return; } +/* IVAS 32-bit variant */ +void interpolate_3_over_1_allpass_fx32( + const Word32 *input, /* i : input signal Qx */ + const Word16 len, /* i : number of input samples */ + Word32 *out, /* o : output signal */ + Word32 *mem /* i/o: memory */ +) +{ + Word16 i, tmp16; + Word32 Vu[2], Vm[2], Vl[2]; /* Outputs of three cascaded allpass stages (upper, middle, and lower) */ + Word32 *out1; + Word32 mem_temp; + const Word16 *filt_coeff = allpass_poles_3_ov_2; // Qx + + out1 = &out[0]; + + FOR( i = 0; i < len; i++ ) + { + /* Upper branch */ + Vu[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx + move32(); + Vu[1] = L_add_sat( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx + move32(); + mem[3] = L_add_sat( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx + move32(); + + mem[1] = Vu[0]; // Qx + move32(); + mem[2] = Vu[1]; // Qx + move32(); + *out1++ = mem[3]; // Qx + move32(); + + /* Middle branch */ + Vm[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx + move32(); + Vm[1] = L_add_sat( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx + move32(); + mem[6] = L_add_sat( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx + move32(); + + mem[4] = Vm[0]; // Qx + move32(); + mem[5] = Vm[1]; // Qx + move32(); + *out1++ = mem[6]; // Qx + move32(); + + /* Lower branch */ + Vl[0] = L_add_sat( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx + move32(); + Vl[1] = L_add_sat( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx + move32(); + mem[9] = L_add_sat( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx + move32(); + + mem[0] = input[i]; // Qx + move32(); + mem[7] = Vl[0]; // Qx + move32(); + mem[8] = Vl[1]; // Qx + move32(); + *out1++ = mem[9]; // Qx + move32(); + } + + /*LPF*/ + tmp16 = imult1616( len, 3 ); + FOR( i = 0; i < tmp16; i++ ) + { + mem_temp = out[i]; // Qx + move32(); + out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2424 ) ); // Qx + // 0.572769 in Q15 -> 18768, 0.074005 in Q15 -> 2424 + move32(); + mem[10] = mem[11]; // Qx + move32(); + mem[11] = mem[12]; // Qx + move32(); + mem[12] = mem_temp; // Qx + move32(); + } + + return; +} + /*-------------------------------------------------------------------* * decimate_3_over_2_allpass_fx() diff --git a/lib_com/mslvq_com.c b/lib_com/mslvq_com.c deleted file mode 100644 index 12234a4c0..000000000 --- a/lib_com/mslvq_com.c +++ /dev/null @@ -1,208 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - -/*-----------------------------------------------------------------* - * Local function prototypes - *-----------------------------------------------------------------*/ - -static void make_offset_scale( - const UWord32 tab_no_cv[], - const Word8 *no_ld, - const Word16 no_scl, - UWord32 *offset_scale ) -{ - Word16 i; - - offset_scale[0] = 1; - move32(); - FOR( i = 1; i <= no_scl; i++ ) - { - offset_scale[i] = UL_addNsD( offset_scale[i - 1], tab_no_cv[(Word16) no_ld[i - 1]] ); - move32(); - } - - return; -} - -/*-----------------------------------------------------------------* - * create_offset() - * - * - *-----------------------------------------------------------------*/ - -void create_offset( - UWord32 *offset_scale1, - UWord32 *offset_scale2, - const Word16 mode, - const Word16 prediction_flag ) -{ - Word16 tmp, tmp1; - - if ( prediction_flag == 0 ) - { - /* safety_net */ - tmp = no_lead_idx[mode][0]; - if ( ( tmp <= LIMIT_LEADER ) && ( tmp < no_lead_idx[mode][1] - 2 ) ) - { - tmp += DELTA_LEADER; - } - make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); - make_offset_scale( table_no_cv, leaders_short[no_lead_idx[mode][1]], MAX_NO_SCALES, offset_scale2 ); - } - else - { - tmp = no_lead_p_idx[mode][0]; - tmp1 = no_lead_p_idx[mode][1]; - if ( ( tmp <= LIMIT_LEADER ) && ( tmp < tmp1 - 2 ) ) - { - tmp += DELTA_LEADER; - } - - if ( ( tmp == LIMIT_LEADER ) && ( tmp1 == 0 ) ) - { - tmp += DELTA_LEADER; - tmp1 = DELTA_LEADER; - } - - make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); - make_offset_scale( table_no_cv, leaders_short[tmp1], MAX_NO_SCALES, offset_scale2 ); - } - - return; -} - -/*-----------------------------------------------------------------* - * sort_desc_ind() - * - * sorts in descending order and computes indices in the sorted vector - *-----------------------------------------------------------------*/ -void sort_desc_ind_16_fx( - Word16 *s, /* i/o: vector to be sorted Qx*/ - const Word16 len, /* i : vector length */ - Word16 *ind /* o : array of indices */ -) -{ - Word16 i, k, sorted, a; - Word16 t; - - FOR( i = 0; i < len; i++ ) - { - ind[i] = i; - move16(); - } - sorted = 0; - move16(); - FOR( k = len - 1; k && !sorted; k-- ) - { - sorted = 1; - move16(); - FOR( i = 0; i < k; i++ ) - { - IF( LT_16( s[i], s[i + 1] ) ) - { - sorted = 0; - move16(); - t = s[i]; - move16(); - s[i] = s[i + 1]; - move16(); - s[i + 1] = t; - move16(); - a = ind[i]; - move16(); - ind[i] = ind[i + 1]; - move16(); - ind[i + 1] = a; - move16(); - } - } - } - - return; -} - -void sort_desc_ind_32_fx( - Word32 *s, /* i/o: vector to be sorted Qx*/ - const Word16 len, /* i : vector length */ - Word16 *ind /* o : array of indices */ -) -{ - Word16 i, k, sorted, a; - Word32 t; - - FOR( i = 0; i < len; i++ ) - { - ind[i] = i; - move16(); - } - sorted = 0; - move16(); - FOR( k = len - 1; k && !sorted; k-- ) - { - sorted = 1; - move16(); - FOR( i = 0; i < k; i++ ) - { - IF( LT_32( s[i], s[i + 1] ) ) - { - sorted = 0; - move16(); - t = s[i]; - move16(); - s[i] = s[i + 1]; - move16(); - s[i + 1] = t; - move16(); - a = ind[i]; - move16(); - ind[i] = ind[i + 1]; - move16(); - ind[i + 1] = a; - move16(); - } - } - } - - return; -} diff --git a/lib_com/mslvq_com_fx.c b/lib_com/mslvq_com_fx.c index 7fcf36bfc..8d5e8adf2 100644 --- a/lib_com/mslvq_com_fx.c +++ b/lib_com/mslvq_com_fx.c @@ -30,11 +30,16 @@ *******************************************************************************************************/ +#include #include "options.h" +#include "cnst.h" #include "prot_fx.h" #include "ivas_cnst.h" #include "stl.h" #include "rom_com.h" +#include "ivas_prot_fx.h" +#include "wmc_auto.h" + /*-----------------------------------------------------------------* * Local functions @@ -260,6 +265,25 @@ static void make_offset_scale_fx( return; } +static void make_offset_scale( + const UWord32 tab_no_cv[], + const Word8 *no_ld, + const Word16 no_scl, + UWord32 *offset_scale ) +{ + Word16 i; + + offset_scale[0] = 1; + move32(); + FOR( i = 1; i <= no_scl; i++ ) + { + offset_scale[i] = UL_addNsD( offset_scale[i - 1], tab_no_cv[(Word16) no_ld[i - 1]] ); + move32(); + } + + return; +} + void init_offset_fx( Word32 offset_scale1[][MAX_NO_SCALES + 1], /* o: lattice truncation index offset for the first LSF subvector - safety net structures*/ Word32 offset_scale2[][MAX_NO_SCALES + 1], /* o: lattice truncation index offset for the second LSF subvector - safety net structures*/ @@ -1310,6 +1334,104 @@ static void put_value_fx( return; } +/*-----------------------------------------------------------------* + * create_offset() + * + * + *-----------------------------------------------------------------*/ + +void create_offset( + UWord32 *offset_scale1, + UWord32 *offset_scale2, + const Word16 mode, + const Word16 prediction_flag ) +{ + Word16 tmp, tmp1; + + if ( prediction_flag == 0 ) + { + /* safety_net */ + tmp = no_lead_idx[mode][0]; + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < no_lead_idx[mode][1] - 2 ) ) + { + tmp += DELTA_LEADER; + } + make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); + make_offset_scale( table_no_cv, leaders_short[no_lead_idx[mode][1]], MAX_NO_SCALES, offset_scale2 ); + } + else + { + tmp = no_lead_p_idx[mode][0]; + tmp1 = no_lead_p_idx[mode][1]; + if ( ( tmp <= LIMIT_LEADER ) && ( tmp < tmp1 - 2 ) ) + { + tmp += DELTA_LEADER; + } + + if ( ( tmp == LIMIT_LEADER ) && ( tmp1 == 0 ) ) + { + tmp += DELTA_LEADER; + tmp1 = DELTA_LEADER; + } + + make_offset_scale( table_no_cv, leaders_short[tmp], MAX_NO_SCALES, offset_scale1 ); + make_offset_scale( table_no_cv, leaders_short[tmp1], MAX_NO_SCALES, offset_scale2 ); + } + + return; +} + +/*-----------------------------------------------------------------* + * sort_desc_ind() + * + * sorts in descending order and computes indices in the sorted vector + *-----------------------------------------------------------------*/ + +void sort_desc_ind_32_fx( + Word32 *s, /* i/o: vector to be sorted Qx*/ + const Word16 len, /* i : vector length */ + Word16 *ind /* o : array of indices */ +) +{ + Word16 i, k, sorted, a; + Word32 t; + + FOR( i = 0; i < len; i++ ) + { + ind[i] = i; + move16(); + } + sorted = 0; + move16(); + FOR( k = len - 1; k && !sorted; k-- ) + { + sorted = 1; + move16(); + FOR( i = 0; i < k; i++ ) + { + IF( LT_32( s[i], s[i + 1] ) ) + { + sorted = 0; + move16(); + t = s[i]; + move16(); + s[i] = s[i + 1]; + move16(); + s[i + 1] = t; + move16(); + a = ind[i]; + move16(); + ind[i] = ind[i + 1]; + move16(); + ind[i + 1] = a; + move16(); + } + } + } + + return; +} + void deindex_lvq_SHB_fx( UWord32 index, Word16 *out, diff --git a/lib_com/preemph.c b/lib_com/preemph.c deleted file mode 100644 index 9ebc0f72a..000000000 --- a/lib_com/preemph.c +++ /dev/null @@ -1,72 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "prot_fx.h" -#include "wmc_auto.h" - -/*-------------------------------------------------------------* - * preemph_ivas_fx() - * - * Preemphasis: filtering through 1 - mu z^-1 - *-------------------------------------------------------------*/ - -void preemph_ivas_fx( - Word32 *signal, /* i/o: signal Qx*/ - const Word16 mu, /* i : preemphasis factor Q15*/ - const Word16 L, /* i : vector size Q0*/ - Word32 *mem /* i/o: memory (x[-1]) Qx*/ -) -{ - Word16 i; - Word32 temp; - - temp = signal[L - 1]; /* Qx */ - move32(); - FOR( i = L - 1; i > 0; i-- ) - { - signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */ - move32(); - } - - signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */ - move32(); - *mem = temp; /* Qx */ - move32(); - - return; -} diff --git a/lib_com/preemph_fx.c b/lib_com/preemph_fx.c index 0790f6c3f..b7886cb65 100644 --- a/lib_com/preemph_fx.c +++ b/lib_com/preemph_fx.c @@ -1,14 +1,18 @@ /*==================================================================================== EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ + #include #include "options.h" /* Compilation switches */ #include "prot_fx.h" +#include "wmc_auto.h" + /*-------------------------------------------------------------* * preemph_copy_fx() * * Preemphasis: filtering through 1 - mu z^-1 *-------------------------------------------------------------*/ + void preemph_copy_fx( const Word16 x[], /* i : input signal Qx */ Word16 y[], /* o : output signal Qx */ @@ -63,6 +67,38 @@ void preemph_copy_32fx( move16(); } +/*-------------------------------------------------------------* + * preemph_ivas_fx() + * + * Preemphasis: filtering through 1 - mu z^-1 + *-------------------------------------------------------------*/ + +void preemph_ivas_fx( + Word32 *signal, /* i/o: signal Qx*/ + const Word16 mu, /* i : preemphasis factor Q15*/ + const Word16 L, /* i : vector size Q0*/ + Word32 *mem /* i/o: memory (x[-1]) Qx*/ +) +{ + Word16 i; + Word32 temp; + + temp = signal[L - 1]; /* Qx */ + move32(); + FOR( i = L - 1; i > 0; i-- ) + { + signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */ + move32(); + } + + signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */ + move32(); + *mem = temp; /* Qx */ + move32(); + + return; +} + /* * E_UTIL_f_preemph2 * diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 498be3137..935139e42 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -1778,13 +1778,7 @@ void Ener_per_band_comp_ivas_fx( const Word16 Eflag, /* i : flag of highest band */ const Word16 L_frame /* i : frame length */ ); -void Ener_per_band_comp_ivas_fx_2( - const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ - Word16 y_gain4_fx[], /* o : Energy per band to quantize Q12 */ - const Word16 Q_exc, /* i : frame length */ - const Word16 Mband, /* i : Max band */ - const Word16 Eflag, /* i : flag of highest band */ - const Word16 L_frame ); + void Comp_and_apply_gain_fx( Word16 exc_diffQ[], /* i/o: Quantized excitation */ Word16 Ener_per_bd_iQ[], /* i : Target ener per band Q13 */ @@ -1844,17 +1838,6 @@ void wtda_fx( const Word16 L /* i : length */ ); -void wtda_ivas_fx( - Word16 *new_audio, /* i : input audio Q0 */ - Word16 *Q, /* i/o : Q of input/Output Audio */ - Word16 *wtda_audio, /* o : windowed audio Qout */ - Word16 *old_wtda, /* i/o: windowed audio from previous frame Qout */ - Word16 *Qold_wtda, - const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ - const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ - const Word16 L /* i : length */ -); - void wtda_ext_fx( const Word16 *new_audio, /* i : input audio (Q_in) */ Word16 *wtda_audio, /* o : windowed audio (Q_in) */ @@ -11144,31 +11127,6 @@ Word32 Mult_32_32( Word32 a, Word32 b ); - -void bit_allocation_second_fx2( - Word32 *Rk, - Word32 *Rk_sort, - Word16 BANDS, - const Word16 *band_width, - Word16 *k_sort, - Word16 *k_num, - const Word16 *p2a_flags, - const Word16 p2a_bands, - const Word16 *last_bitalloc, - const Word16 input_frame ); - -void bit_allocation_second_fx2( - Word32 *Rk, - Word32 *Rk_sort, - Word16 BANDS, - const Word16 *band_width, - Word16 *k_sort, - Word16 *k_num, - const Word16 *p2a_flags, - const Word16 p2a_bands, - const Word16 *last_bitalloc, - const Word16 input_frame ); - #ifdef DEBUGGING void read_next_force( int16_t *force, /* i/o: force value (0/1, 0 = speech, 1 = music)*/ diff --git a/lib_com/tcx_mdct_window.c b/lib_com/tcx_mdct_window_fx.c similarity index 100% rename from lib_com/tcx_mdct_window.c rename to lib_com/tcx_mdct_window_fx.c diff --git a/lib_com/tec_com.c b/lib_com/tec_com_fx.c similarity index 100% rename from lib_com/tec_com.c rename to lib_com/tec_com_fx.c diff --git a/lib_com/wtda.c b/lib_com/wtda.c deleted file mode 100644 index 3fb408138..000000000 --- a/lib_com/wtda.c +++ /dev/null @@ -1,219 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include -#include "wmc_auto.h" - - -void wtda_fx32( - const Word32 *new_audio, /* i : input audio Q11 */ - Word32 *wtda_audio, /* o : windowed audio Q11 */ - Word32 *old_wtda, /* i/o: windowed audio from previous frame */ - const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ - const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ - const Word16 L /* i : length */ -) -{ - Word16 i, decimate, decay; - Word16 idx1, idx2, idx3, idx4; - Word16 n, windecay48, windecay16; - const Word32 *allsig_l, *allsig_r; - Word16 win_right[R2_48]; - Word16 win_int_left[R1_16]; - Word16 win_left[R1_48]; - Word16 win_int_right[R2_16]; - - tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); - - decimate = 1; /* L_FRAME 48k */ - move16(); - decay = 0; - move16(); - windecay48 = extract_l( WINDECAY48 ); // (int16_t)(2 * ((float)L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_48 - - test(); - IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) ) - { - decimate = 3; - move16(); - decay = 1; - move16(); - } - ELSE IF( EQ_16( L, L_FRAME8k ) ) - { - decimate = 6; - move16(); - decay = 2; - move16(); - } - - SWITCH( L ) // (int16_t)((float)L * N_ZERO_MDCT_NS / FRAME_SIZE_NS) - { - case L_FRAME16k: - n = 90; - move16(); - BREAK; - case L_FRAME32k: - n = 180; - move16(); - BREAK; - case L_FRAME48k: - n = 270; - move16(); - BREAK; - default: - n = (Word16) ( ( L * N_ZERO_MDCT_NS ) / FRAME_SIZE_NS ); - move16(); - BREAK; - } - - windecay16 = extract_l( WINDECAY16 ); // (int16_t)(2 * ((float)L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_16; - - /* algorithmic delay reduction */ - i = 0; - move16(); - - IF( old_wtda == NULL ) - { - allsig_r = new_audio + n; - allsig_l = new_audio + n - L; - } - ELSE - { - allsig_r = new_audio + n; - allsig_l = old_wtda + n; - } - - IF( EQ_16( L, L_FRAME32k ) ) - { - FOR( i = 0; i < ( L / 2 - n ); i += 2 ) - { - idx1 = sub( sub( shr( L, 1 ), i ), 1 ); - idx2 = sub( sub( 3 * L_FRAME16k / 2 - 1, shr( i, 1 ) ), windecay16 ); - idx3 = add( shr( L, 1 ), i ); - idx4 = sub( add( 3 * L_FRAME16k / 2, shr( i, 1 ) ), windecay16 ); - wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_int_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_int_right[idx4] ) ); - move32(); - - idx1 = sub( sub( shr( L, 1 ), add( i, 1 ) ), 1 ); - idx2 = sub( add( i_mult( ( sub( sub( 3 * L_FRAME16k / 2, shr( i, 1 ) ), 1 ) ), decimate ), decay ), windecay48 ); - idx3 = add( add( shr( L, 1 ), i ), 1 ); - idx4 = sub( sub( sub( i_mult( ( add( 3 * L_FRAME16k / 2 + 1, shr( i, 1 ) ) ), decimate ), decay ), 1 ), windecay48 ); - wtda_audio[i + 1] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); - move32(); - } - - FOR( i = L / 2 - n; i < L / 2; i += 2 ) - { - wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); - move32(); - wtda_audio[i + 1] = L_negate( allsig_r[( ( ( L >> 1 ) - ( i + 1 ) ) - 1 )] ); - move32(); - } - FOR( i = 0; i < n; i += 2 ) - { - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( ( i >> 1 ) * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); - move32(); - wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[i + 1], win_int_left[i / 2] ), new_audio[( ( n - ( i + 1 ) ) - 1 )] ); - move32(); - } - - FOR( i = n; i < L / 2; i += 2 ) - { - idx1 = i; - move16(); - idx2 = add( i_mult( shr( i, 1 ), decimate ), decay ); - idx3 = sub( sub( L, i ), 1 ); - idx4 = sub( sub( i_mult( sub( shr( L, 1 ), shr( i, 1 ) ), decimate ), 1 ), decay ); - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); - move32(); - - idx1 = add( i, 1 ); - idx2 = shr( i, 1 ); - idx3 = sub( sub( L, add( i, 1 ) ), 1 ); - idx4 = sub( sub( shr( L, 1 ), shr( i, 1 ) ), 1 ); - wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_int_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_int_left[idx4] ) ); - move32(); - } - } - ELSE - { - FOR( i = 0; i < L / 2 - n; i++ ) - { - idx1 = sub( sub( shr( L, 1 ), i ), 1 ); - idx2 = sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); - idx3 = add( shr( L, 1 ), i ); - idx4 = sub( sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), 1 ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); - wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); - move32(); - } - - FOR( i = L / 2 - n; i < L / 2; i++ ) - { - wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); - move32(); - } - - FOR( i = 0; i < n; i++ ) - { - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( i * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); - move32(); - } - - FOR( i = n; i < L / 2; i++ ) - { - idx1 = i; - move16(); - idx2 = add( i_mult( i, decimate ), decay ); - idx3 = sub( sub( L, i ), 1 ); - idx4 = sub( sub( sub( i_mult( L, decimate ), i_mult( i, decimate ) ), 1 ), decay ); - wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); - move32(); - } - } - - IF( old_wtda != NULL ) - { - Copy32( new_audio, old_wtda, L ); - } - - return; -} diff --git a/lib_com/wtda_fx.c b/lib_com/wtda_fx.c index e060984df..7943a87c5 100644 --- a/lib_com/wtda_fx.c +++ b/lib_com/wtda_fx.c @@ -2,11 +2,14 @@ EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 ====================================================================================*/ #include +#include #include "options.h" /* Compilation switches */ #include "cnst.h" /* Common constants */ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* required by wmc_tool */ #include "stat_com.h" +#include "wmc_auto.h" + /*--------------------------------------------------------------------------* * mvr2r_inv() * @@ -412,21 +415,19 @@ void wtda_fx( return; } - -void wtda_ivas_fx( - Word16 *new_audio, /* i : input audio Q0 */ - Word16 *Q, /* i/o : Q of input/Output Audio */ - Word16 *wtda_audio, /* o : windowed audio Qout */ - Word16 *old_wtda, /* i/o: windowed audio from previous frame Qout */ - Word16 *Qold_wtda, +void wtda_fx32( + const Word32 *new_audio, /* i : input audio Q11 */ + Word32 *wtda_audio, /* o : windowed audio Q11 */ + Word32 *old_wtda, /* i/o: windowed audio from previous frame */ const Word16 left_mode, /* i : window overlap of previous frame (0: full, 2: none, or 3: half) */ const Word16 right_mode, /* i : window overlap of current frame (0: full, 2: none, or 3: half) */ const Word16 L /* i : length */ ) { Word16 i, decimate, decay; + Word16 idx1, idx2, idx3, idx4; Word16 n, windecay48, windecay16; - const Word16 *allsig_l, *allsig_r; + const Word32 *allsig_l, *allsig_r; Word16 win_right[R2_48]; Word16 win_int_left[R1_16]; Word16 win_left[R1_48]; @@ -434,12 +435,11 @@ void wtda_ivas_fx( tcx_get_windows_mode1( left_mode, right_mode, win_left, win_right, win_int_left, win_int_right, L ); - decimate = 1; /* L_FRAME48k */ + decimate = 1; /* L_FRAME 48k */ move16(); decay = 0; move16(); - windecay48 = ( 2 * ( (Word64) L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_48; - move16(); + windecay48 = extract_l( WINDECAY48 ); // (int16_t)(2 * ((float)L_FRAME48k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_48 test(); IF( EQ_16( L, L_FRAME32k ) || EQ_16( L, L_FRAME16k ) ) @@ -457,10 +457,27 @@ void wtda_ivas_fx( move16(); } - n = extract_l( Mpy_32_32( L, 603979776 /* N_ZERO_MDCT_NS / FRAME_SIZE_NS in Q31 */ ) ); + SWITCH( L ) // (int16_t)((float)L * N_ZERO_MDCT_NS / FRAME_SIZE_NS) + { + case L_FRAME16k: + n = 90; + move16(); + BREAK; + case L_FRAME32k: + n = 180; + move16(); + BREAK; + case L_FRAME48k: + n = 270; + move16(); + BREAK; + default: + n = (Word16) ( ( L * N_ZERO_MDCT_NS ) / FRAME_SIZE_NS ); + move16(); + BREAK; + } - windecay16 = ( 2 * ( L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS ) ) + R1_16; - move16(); + windecay16 = extract_l( WINDECAY16 ); // (int16_t)(2 * ((float)L_FRAME16k * N_ZERO_MDCT_NS / FRAME_SIZE_NS)) + R1_16; /* algorithmic delay reduction */ i = 0; @@ -473,103 +490,106 @@ void wtda_ivas_fx( } ELSE { - /* Rescale signals if Q are not identical */ - IF( GT_16( *Qold_wtda, *Q ) ) - { - Copy_Scale_sig( old_wtda, old_wtda, L, sub( *Q, *Qold_wtda ) ); - *Qold_wtda = *Q; - move16(); - } - ELSE IF( LT_16( *Qold_wtda, *Q ) ) - { - Copy_Scale_sig( new_audio, new_audio, L, sub( *Qold_wtda, *Q ) ); - *Q = *Qold_wtda; - move16(); - } - allsig_r = new_audio + n; allsig_l = old_wtda + n; } IF( EQ_16( L, L_FRAME32k ) ) { - FOR( i = 0; i < L / 2 - n; i += 2 ) + FOR( i = 0; i < ( L / 2 - n ); i += 2 ) { - wtda_audio[i] = round_fx( L_msu0( L_mult0( negate( allsig_r[L / 2 - i - 1] ), win_int_right[3 * L_FRAME16k / 2 - i / 2 - 1 - windecay16] ), - allsig_r[L / 2 + i], win_int_right[3 * L_FRAME16k / 2 + i / 2 - windecay16] ) ); - move16(); - wtda_audio[i + 1] = round_fx( L_msu0( L_mult0( negate( allsig_r[L / 2 - ( i + 1 ) - 1] ), win_right[( 3 * L_FRAME16k / 2 - i / 2 - 1 ) * decimate + decay - windecay48] ), - allsig_r[L / 2 + i + 1], win_right[( 3 * L_FRAME16k / 2 + 1 + i / 2 ) * decimate - decay - 1 - windecay48] ) ); - move16(); + idx1 = sub( sub( shr( L, 1 ), i ), 1 ); + idx2 = sub( sub( 3 * L_FRAME16k / 2 - 1, shr( i, 1 ) ), windecay16 ); + idx3 = add( shr( L, 1 ), i ); + idx4 = sub( add( 3 * L_FRAME16k / 2, shr( i, 1 ) ), windecay16 ); + wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_int_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_int_right[idx4] ) ); + move32(); + + idx1 = sub( sub( shr( L, 1 ), add( i, 1 ) ), 1 ); + idx2 = sub( add( i_mult( ( sub( sub( 3 * L_FRAME16k / 2, shr( i, 1 ) ), 1 ) ), decimate ), decay ), windecay48 ); + idx3 = add( add( shr( L, 1 ), i ), 1 ); + idx4 = sub( sub( sub( i_mult( ( add( 3 * L_FRAME16k / 2 + 1, shr( i, 1 ) ) ), decimate ), decay ), 1 ), windecay48 ); + wtda_audio[i + 1] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); + move32(); } FOR( i = L / 2 - n; i < L / 2; i += 2 ) { - wtda_audio[i] = shr( negate( allsig_r[L / 2 - i - 1] ), 1 ); - move16(); - wtda_audio[i + 1] = shr( negate( allsig_r[L / 2 - ( i + 1 ) - 1] ), 1 ); - move16(); + wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); + move32(); + wtda_audio[i + 1] = L_negate( allsig_r[( ( ( L >> 1 ) - ( i + 1 ) ) - 1 )] ); + move32(); } - FOR( i = 0; i < n; i += 2 ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[( i / 2 ) * decimate + decay] ), - new_audio[n - i - 1], MAX16B ) ); - move16(); - wtda_audio[i + L / 2 + 1] = round_fx( L_msu0( L_mult0( allsig_l[i + 1], win_int_left[i / 2] ), - new_audio[n - ( i + 1 ) - 1], MAX16B ) ); - move16(); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( ( i >> 1 ) * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); + move32(); + wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[i + 1], win_int_left[i / 2] ), new_audio[( ( n - ( i + 1 ) ) - 1 )] ); + move32(); } FOR( i = n; i < L / 2; i += 2 ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[( i / 2 ) * decimate + decay] ), - allsig_l[L - i - 1], win_left[( L / 2 - i / 2 ) * decimate - 1 - decay] ) ); - move16(); - wtda_audio[i + L / 2 + 1] = round_fx( L_msu0( L_mult0( allsig_l[i + 1], win_int_left[i / 2] ), - allsig_l[L - ( i + 1 ) - 1], win_int_left[L / 2 - i / 2 - 1] ) ); + idx1 = i; move16(); + idx2 = add( i_mult( shr( i, 1 ), decimate ), decay ); + idx3 = sub( sub( L, i ), 1 ); + idx4 = sub( sub( i_mult( sub( shr( L, 1 ), shr( i, 1 ) ), decimate ), 1 ), decay ); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); + move32(); + + idx1 = add( i, 1 ); + idx2 = shr( i, 1 ); + idx3 = sub( sub( L, add( i, 1 ) ), 1 ); + idx4 = sub( sub( shr( L, 1 ), shr( i, 1 ) ), 1 ); + wtda_audio[( ( i + ( L >> 1 ) ) + 1 )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_int_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_int_left[idx4] ) ); + move32(); } } ELSE { FOR( i = 0; i < L / 2 - n; i++ ) { - wtda_audio[i] = round_fx( L_msu0( L_mult0( negate( allsig_r[L / 2 - i - 1] ), win_right[3 * L / 2 * decimate - ( i + 1 ) * decimate + decay - windecay48] ), - allsig_r[L / 2 + i], win_right[3 * L / 2 * decimate - 1 + ( i + 1 ) * decimate - decay - windecay48] ) ); - move16(); + idx1 = sub( sub( shr( L, 1 ), i ), 1 ); + idx2 = sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); + idx3 = add( shr( L, 1 ), i ); + idx4 = sub( sub( add( sub( i_mult( i_mult( 3, shr( L, 1 ) ), decimate ), 1 ), i_mult( add( i, 1 ), decimate ) ), decay ), windecay48 ); + wtda_audio[i] = L_sub_sat( Mpy_32_16_1( -allsig_r[idx1], win_right[idx2] ), Mpy_32_16_1( allsig_r[idx3], win_right[idx4] ) ); + move32(); } FOR( i = L / 2 - n; i < L / 2; i++ ) { - wtda_audio[i] = shr( negate( allsig_r[L / 2 - i - 1] ), 1 ); - move16(); + wtda_audio[i] = L_negate( allsig_r[( ( ( L >> 1 ) - i ) - 1 )] ); + move32(); } FOR( i = 0; i < n; i++ ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[i * decimate + decay] ), - new_audio[n - i - 1], MAX16B ) ); - move16(); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[i], win_left[( ( i * decimate ) + decay )] ), new_audio[( ( n - i ) - 1 )] ); + move32(); } FOR( i = n; i < L / 2; i++ ) { - wtda_audio[i + L / 2] = round_fx( L_msu0( L_mult0( allsig_l[i], win_left[i * decimate + decay] ), - allsig_l[L - i - 1], win_left[L * decimate - i * decimate - 1 - decay] ) ); + idx1 = i; move16(); + idx2 = add( i_mult( i, decimate ), decay ); + idx3 = sub( sub( L, i ), 1 ); + idx4 = sub( sub( sub( i_mult( L, decimate ), i_mult( i, decimate ) ), 1 ), decay ); + wtda_audio[( i + ( L >> 1 ) )] = L_sub_sat( Mpy_32_16_1( allsig_l[idx1], win_left[idx2] ), Mpy_32_16_1( allsig_l[idx3], win_left[idx4] ) ); + move32(); } } IF( old_wtda != NULL ) { - Copy( new_audio, old_wtda, L ); + Copy32( new_audio, old_wtda, L ); } return; } - void wtda_ext_fx( const Word16 *new_audio, /* i : input audio (Q_in) */ Word16 *wtda_audio, /* o : windowed audio (Q_in - 1) */ diff --git a/lib_dec/ari_hm_dec.c b/lib_dec/ari_hm_dec_fx.c similarity index 100% rename from lib_dec/ari_hm_dec.c rename to lib_dec/ari_hm_dec_fx.c diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index c10c6beda..e26a56c1b 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -1264,7 +1264,7 @@ void destroy_cpe_dec( IF( hCPE->hStereoDft != NULL ) { - stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + stereo_dft_dec_destroy_fx( &( hCPE->hStereoDft ) ); hCPE->hStereoDft = NULL; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c deleted file mode 100644 index 4770d2193..000000000 --- a/lib_dec/ivas_init_dec.c +++ /dev/null @@ -1,3255 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include -#include -#include "options.h" -#include "ivas_cnst.h" -#include "ivas_prot_rend_fx.h" -#include "rom_com.h" -#include "ivas_rom_com.h" -#include "ivas_stat_enc.h" -#include "prot_fx.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - - -/*-------------------------------------------------------------------* - * Local function prototypes - *-------------------------------------------------------------------*/ - -static ivas_error ivas_read_format( Decoder_Struct *st_ivas, Word16 *num_bits_read ); - -static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); - - -/*-------------------------------------------------------------------* - * ivas_dec_setup() - * - * IVAS decoder setup - *-------------------------------------------------------------------*/ - -ivas_error ivas_dec_setup( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - Word16 *data /* o : output synthesis signal */ -) -{ - Word16 k, idx, num_bits_read; - Word16 nchan_ism, element_mode_flag; - Decoder_State *st; - Word32 ivas_total_brate; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - num_bits_read = 0; - move16(); - element_mode_flag = 0; - move16(); - - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - - /*-------------------------------------------------------------------* - * Read IVAS format - *-------------------------------------------------------------------*/ - - ivas_read_format( st_ivas, &num_bits_read ); - - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src = 0; - move16(); - - /*-------------------------------------------------------------------* - * Read other signling (ISM/MC mode, number of channels, etc.) - *-------------------------------------------------------------------*/ - - IF( is_DTXrate( ivas_total_brate ) == 0 ) - { - /*-------------------------------------------------------------------* - * Read IVAS format related signaling: - * - in ISM : read number of objects - * - in SBA : read SBA planar flag and SBA order - * - in MASA : read number of TC - * - in MC : read LS setup - *-------------------------------------------------------------------*/ - - IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - element_mode_flag = 1; - move16(); - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - /* read the number of objects */ - st_ivas->nchan_transport = 1; - move16(); - nchan_ism = 1; - move16(); - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - k = extract_l( L_sub( res_dec, 1 ) ); - - WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) - { - nchan_ism = add( nchan_ism, 1 ); - k = sub( k, 1 ); - } - - st_ivas->nchan_ism = nchan_ism; - move16(); - - IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - /* read Ambisonic (SBA) planar flag */ - st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; - move16(); - num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); - - /* read Ambisonic (SBA) order */ - st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; - move16(); - st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); - move16(); - num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); - test(); - test(); - IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) - { - IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - /* set Ambisonic (SBA) order used for analysis and coding */ - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); - move16(); - ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - /* read number of MASA transport channels */ - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( st_ivas->bit_stream[res_dec - 1] ) - { - st_ivas->nchan_transport = 2; - move16(); - element_mode_flag = 1; - move16(); - } - ELSE - { - st_ivas->nchan_transport = 1; - move16(); - } - - IF( st_ivas->ini_frame > 0 ) - { - /* reconfigure in case a change of operation mode is detected */ - test(); - test(); - IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) - { - IF( EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) - { - test(); - test(); - test(); - IF( ( st_ivas->ini_active_frame == 0 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) - { - st_ivas->hCPE[0]->nchan_out = 1; - move16(); - } - ELSE - { - IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - ELSE - { - IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - st_ivas->nchan_transport = 2; /* always 2 MASA transport channels */ - move16(); - /* for the DISC mode the number of objects are written at the end of the bitstream, in the MASA metadata */ - - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[res_dec - 1], 1 ), st_ivas->bit_stream[res_dec - 2] ), 1 ); - move16(); - st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, st_ivas->nchan_ism ); - move16(); - IF( st_ivas->ini_frame > 0 ) - { - /* reconfigure in case a change of operation mode is detected */ - test(); - test(); - IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) - { - IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - /* the number of objects is written at the end of the bitstream, in the SBA metadata */ - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[res_dec - 1], 1 ), st_ivas->bit_stream[res_dec - 2] ), 1 ); - move16(); - - test(); - IF( LT_32( ivas_total_brate, IVAS_24k4 ) || GE_32( ivas_total_brate, IVAS_256k ) ) - { - /* read Ambisonic (SBA) planar flag */ - st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; - move16(); - num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); - } - - st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; - move16(); - st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); - move16(); - num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); - - /* read Ambisonic (SBA) order */ - if ( LT_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->sba_order = 3; - move16(); - } - - test(); - IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ) - { - IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - /* set Ambisonic (SBA) order used for analysis and coding */ - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); - move16(); - - ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); - - /*correct number of CPEs for discrete ISM coding*/ - test(); - IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); - move16(); - } - } - - IF( GE_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->ism_mode = ISM_SBA_MODE_DISC; - move32(); - } - ELSE - { - st_ivas->ism_mode = ISM_MODE_NONE; - move32(); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - /* read MC configuration */ - idx = 0; - move16(); - FOR( k = 0; k < MC_LS_SETUP_BITS; k++ ) - { - IF( st_ivas->bit_stream[num_bits_read + k] ) - { - idx = add( idx, shl( 1, sub( ( MC_LS_SETUP_BITS - 1 ), k ) ) ); - } - } - num_bits_read = add( num_bits_read, MC_LS_SETUP_BITS ); - - /* select MC format mode; reconfigure the MC format decoder */ - IF( NE_32( ( error = ivas_mc_dec_config_fx( st_ivas, idx, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Read element mode - *-------------------------------------------------------------------*/ - - IF( st_ivas->ini_frame == 0 && element_mode_flag ) - { - /* read stereo technology info */ - IF( LT_32( ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) - { - /* 1 bit */ - IF( st_ivas->bit_stream[num_bits_read] ) - { - st_ivas->element_mode_init = add( 1, IVAS_CPE_DFT ); - move16(); - } - ELSE - { - st_ivas->element_mode_init = add( 0, IVAS_CPE_DFT ); - move16(); - } - } - ELSE - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - } - } - ELSE IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) - { - SWITCH( st_ivas->sid_format ) - { - case SID_DFT_STEREO: - st_ivas->element_mode_init = IVAS_CPE_DFT; - move16(); - BREAK; - case SID_MDCT_STEREO: - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - BREAK; - case SID_ISM: - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_MASA_1TC: - st_ivas->element_mode_init = IVAS_SCE; - move16(); - st_ivas->nchan_transport = 1; - move16(); - BREAK; - case SID_MASA_2TC:; // empyt statement for declaration - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( EQ_16( st_ivas->bit_stream[( res_dec - 1 ) - SID_FORMAT_NBITS], 1 ) ) - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - ELSE - { - st_ivas->element_mode_init = IVAS_CPE_DFT; - move16(); - } - st_ivas->nchan_transport = 2; - move16(); - BREAK; - case SID_SBA_1TC: - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_SBA_2TC: - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - BREAK; - } - - test(); - IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - Word16 nchan_transport_old, nchan_transport; - nchan_transport_old = st_ivas->nchan_transport; - move16(); - IF( ( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) ) - { - nchan_transport = 2; - } - ELSE - { - nchan_transport = 1; - } - move16(); - - IF( NE_16( nchan_transport_old, nchan_transport ) ) - { - /*Setting the default bitrate for the reconfig function*/ - IF( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) - { - st_ivas->hDecoderConfig->ivas_total_brate = IVAS_48k; - move16(); - } - ELSE - { - st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; - move16(); - } - - IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->last_active_ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; - move32(); - } - } - - IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - ISM_MODE last_ism_mode = st_ivas->ism_mode; - move32(); - /* read the number of objects */ - st_ivas->nchan_transport = 1; - move16(); - nchan_ism = 1; - move16(); - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - k = extract_l( L_sub( L_sub( res_dec, 1 ), SID_FORMAT_NBITS ) ); - move16(); - - WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) - { - nchan_ism = add( nchan_ism, 1 ); - k = sub( k, 1 ); - } - k = sub( k, 1 ); - - test(); - IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); - } - - st_ivas->nchan_ism = nchan_ism; - move16(); - /* read ism_mode */ - st_ivas->ism_mode = ISM_MODE_DISC; - move32(); - IF( GT_16( nchan_ism, 2 ) ) - { - k = sub( k, nchan_ism ); /* SID metadata flags */ - idx = st_ivas->bit_stream[k]; - move16(); - st_ivas->ism_mode = (ISM_MODE) add( idx, 1 ); - move32(); - } - - if ( st_ivas->ini_frame == 0 ) - { - last_ism_mode = st_ivas->ism_mode; - move32(); - } - - IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - /*-------------------------------------------------------------------* - * Initialize decoder in the first good frame based on IVAS format - * and number of transport channels - *-------------------------------------------------------------------*/ - test(); - IF( st_ivas->ini_frame == 0 && NE_32( st_ivas->ivas_format, UNDEFINED_FORMAT ) ) - { - IF( NE_32( ( error = doSanityChecks_IVAS( st_ivas ) ), IVAS_ERR_OK ) ) - { - return IVAS_ERROR( error, "Sanity checks failed" ); - } - - IF( NE_32( ( error = ivas_init_decoder_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - - /*----------------------------------------------------------------* - * Reset bitstream pointers - *----------------------------------------------------------------*/ - - ivas_set_bitstream_pointers( st_ivas ); - - reset_elements( st_ivas ); - - /* update bitstream buffer pointer -> take into account already read bits */ - test(); - IF( ( st_ivas->nSCE > 0 ) || ( st_ivas->nCPE > 0 ) ) - { - IF( st_ivas->nSCE > 0 ) - { - st = st_ivas->hSCE[0]->hCoreCoder[0]; - } - ELSE - { - st = st_ivas->hCPE[0]->hCoreCoder[0]; - } - st->next_bit_pos = num_bits_read; - move16(); - st->total_brate = ACELP_8k00; /* only temporary initialization - this is needed for get_next_indice() in the frame following NO_DATA frame */ - move32(); - } - - return error; -} - - -/*-------------------------------------------------------------------* - * ivas_read_format() - * - * Read IVAS format signaling - *-------------------------------------------------------------------*/ - -static ivas_error ivas_read_format( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word16 *num_bits_read /* o : number of IVAS signaling bits read from the bitstream */ -) -{ - Word16 k, idx; - Word32 ivas_total_brate; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - move32(); - - *num_bits_read = 0; - move16(); - test(); - test(); - IF( !st_ivas->bfi && is_DTXrate( ivas_total_brate ) == 0 ) - { - /* read IVAS format */ - k = 0; - move16(); - if ( st_ivas->bit_stream[*num_bits_read] ) - { - k = 1; - move16(); - } - k = shl( k, 1 ); - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - if ( st_ivas->bit_stream[*num_bits_read] ) - { - k = add( k, 1 ); - } - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - SWITCH( k ) - { - case 0: - st_ivas->ivas_format = STEREO_FORMAT; - move32(); - BREAK; - case 1: - st_ivas->ivas_format = MC_FORMAT; - move32(); - BREAK; - case 2: - st_ivas->ivas_format = ISM_FORMAT; - move32(); - - IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) - { - IF( st_ivas->bit_stream[*num_bits_read] ) - { - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - IF( st_ivas->bit_stream[*num_bits_read] ) - { - st_ivas->ivas_format = SBA_ISM_FORMAT; - move32(); - } - ELSE - { - st_ivas->ivas_format = MASA_ISM_FORMAT; - move32(); - } - } - - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - } - BREAK; - case 3: - IF( st_ivas->bit_stream[*num_bits_read] ) - { - st_ivas->ivas_format = MASA_FORMAT; - move32(); - } - ELSE - { - st_ivas->ivas_format = SBA_FORMAT; - move32(); - /* read Ambisonic (SBA) planar flag */ - st_ivas->sba_planar = st_ivas->bit_stream[( *num_bits_read ) + 1]; - move16(); - - /* read Ambisonic (SBA) order */ - st_ivas->sba_order = st_ivas->bit_stream[( *num_bits_read ) + 2 + SBA_PLANAR_BITS]; - move16(); - st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[( *num_bits_read ) + 1 + SBA_PLANAR_BITS], 1 ) ); - move16(); - if ( st_ivas->sba_order == 0 ) - { - st_ivas->ivas_format = SBA_ISM_FORMAT; - move32(); - } - } - ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); - move16(); - - BREAK; - } - } - ELSE IF( ( st_ivas->bfi == 0 ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) - { - /* read IVAS format in SID frame */ - idx = 0; - move16(); - FOR( k = 0; k < SID_FORMAT_NBITS; k++ ) - { - idx += st_ivas->bit_stream[k] << ( SID_FORMAT_NBITS - 1 - k ); - } - - ( *num_bits_read ) = add( *num_bits_read, SID_FORMAT_NBITS ); - move16(); - st_ivas->sid_format = idx; - move16(); - - SWITCH( idx ) - { - case SID_DFT_STEREO: - case SID_MDCT_STEREO: - st_ivas->ivas_format = STEREO_FORMAT; - move32(); - BREAK; - case SID_ISM: - st_ivas->ivas_format = ISM_FORMAT; - move32(); - BREAK; - case SID_MULTICHANNEL: - st_ivas->ivas_format = MC_FORMAT; - move32(); - BREAK; - case SID_SBA_1TC: - st_ivas->ivas_format = SBA_FORMAT; - move32(); - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_SBA_2TC: - st_ivas->ivas_format = SBA_FORMAT; - move32(); - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - BREAK; - case SID_MASA_1TC: - st_ivas->ivas_format = MASA_FORMAT; - move32(); - st_ivas->element_mode_init = IVAS_SCE; - move16(); - BREAK; - case SID_MASA_2TC: - st_ivas->ivas_format = MASA_FORMAT; - move32(); - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); - IF( EQ_32( st_ivas->bit_stream[res_dec - 1], 1 ) ) - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - ELSE - { - st_ivas->element_mode_init = IVAS_CPE_DFT; - move16(); - } - BREAK; - default: - /* This should actually be impossible, since only 3 bits are read, so if this happens something is broken */ - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); - } - - IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - if ( st_ivas->sba_analysis_order == 0 ) - { - st_ivas->sba_analysis_order = SBA_FOA_ORDER; - move16(); - } - } - - /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ - st_ivas->bit_stream = st_ivas->bit_stream + ( *num_bits_read ); - ( *num_bits_read ) = 0; - move16(); - } - ELSE - { - /* In SID/NO_DATA frames, use the previous frame IVAS format */ - } - - return error; -} - - -/*-------------------------------------------------------------------* - * getNumChanSynthesis() - * - * get number of output channels used for synthesis/decoding - * (often different from number of output channels!) - *-------------------------------------------------------------------*/ - -/*! r: number of channels to be synthesised */ - -Word16 getNumChanSynthesis( - Decoder_Struct *st_ivas /* i : IVAS decoder structure */ -) -{ - Word16 n; - - n = add( st_ivas->nSCE, imult1616( CPE_CHANNELS, st_ivas->nCPE ) ); - test(); - test(); - IF( st_ivas->sba_dirac_stereo_flag ) - { - n = CPE_CHANNELS; - move16(); - } - ELSE IF( ( st_ivas->hMCT != NULL || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) && NE_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - n = st_ivas->nchan_transport; - move16(); - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - n = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); - } - ELSE - { - n = st_ivas->nchan_transport; - move16(); - } - } - - return n; -} - -/*-------------------------------------------------------------------* - * copy_decoder_config() - * - * Copy IVAS configuration structure to the CoreCoder state structure - *-------------------------------------------------------------------*/ - -void copy_decoder_config( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - Decoder_State *st /* o : decoder state structure */ -) -{ - st->output_Fs = st_ivas->hDecoderConfig->output_Fs; - move32(); - st->Opt_AMR_WB = st_ivas->hDecoderConfig->Opt_AMR_WB; - move16(); - st->codec_mode = st_ivas->codec_mode; - move16(); - st->ini_frame = st_ivas->ini_frame; - move16(); - - st->bfi = st_ivas->bfi; - move16(); - - st->writeFECoffset = st_ivas->writeFECoffset; - move16(); - - st->element_mode = st_ivas->element_mode_init; - move16(); - - return; -} - -/*-------------------------------------------------------------------* - * ivas_init_decoder_front() - * - * Set decoder parameters to initial values - *-------------------------------------------------------------------*/ -ivas_error ivas_init_decoder_front( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - /*-----------------------------------------------------------------* - * Resets - *-----------------------------------------------------------------*/ - - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->nchan_transport = -1; - move16(); - st_ivas->ism_mode = ISM_MODE_NONE; - move32(); - st_ivas->mc_mode = MC_MODE_NONE; - move32(); - st_ivas->sba_dirac_stereo_flag = 0; - move16(); - - /* HRTF binauralization latency in ns */ - st_ivas->binaural_latency_ns = 0; - move32(); - - /*-------------------------------------------------------------------* - * Allocate and initialize Custom loudspeaker layout handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_LsCustom ) - { - IF( EQ_32( ( error = ivas_ls_custom_open_fx( &( st_ivas->hLsSetupCustom ) ) ), IVAS_ERR_OK ) ) - { - set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_azimuth_fx, MAX_OUTPUT_CHANNELS ); - set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_elevation_fx, MAX_OUTPUT_CHANNELS ); - } - ELSE - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate and initialize Head-Tracking handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_Headrotation ) - { - IF( NE_32( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ); - IF( NE_32( ( error ), IVAS_ERR_OK ) ) - { - return error; - } - } - /*-------------------------------------------------------------------* - * Allocate and initialize external orientation handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) - { - IF( NE_32( ( error = ivas_external_orientation_open( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate and initialize combined orientation handle - *--------------------------------------------------------------------*/ - test(); - IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) - { - IF( NE_32( ( error = ivas_combined_orientation_open( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate HRTF binary handle - *--------------------------------------------------------------------*/ - - IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) - { - IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /*-------------------------------------------------------------------* - * Allocate and initialize Binaural Renderer configuration handle - *--------------------------------------------------------------------*/ - test(); - test(); - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - return error; -} - - -/*-------------------------------------------------------------------* - * ivas_init_decoder() - * - * Initialize IVAS decoder state structure - *-------------------------------------------------------------------*/ -ivas_error ivas_init_decoder_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 i, n, k; - Word16 sce_id, cpe_id; - Word16 numCldfbAnalyses, numCldfbSyntheses; - Word16 granularity, n_channels_transport_jbm; - Word32 output_Fs, ivas_total_brate; - Word32 binauralization_delay_ns; - AUDIO_CONFIG output_config; - DECODER_CONFIG_HANDLE hDecoderConfig; - ivas_error error; - Word32 ism_total_brate; - - error = IVAS_ERR_OK; - move32(); - output_Fs = st_ivas->hDecoderConfig->output_Fs; - move32(); - hDecoderConfig = st_ivas->hDecoderConfig; - output_config = hDecoderConfig->output_config; - ivas_total_brate = hDecoderConfig->ivas_total_brate; - move32(); - hDecoderConfig->last_ivas_total_brate = ivas_total_brate; - move32(); - st_ivas->last_active_ivas_total_brate = ivas_total_brate; - move32(); - /*-----------------------------------------------------------------* - * Set number of output channels for EXTERNAL output config. - *-----------------------------------------------------------------*/ - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); - move16(); - hDecoderConfig->nchan_out = add( hDecoderConfig->nchan_out, st_ivas->nchan_ism ); - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - hDecoderConfig->nchan_out = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); - move16(); - } - ELSE IF( !EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - hDecoderConfig->nchan_out = st_ivas->nchan_transport; - move16(); - } - - st_ivas->hOutSetup.nchan_out_woLFE = hDecoderConfig->nchan_out; - move16(); - } - - /*-----------------------------------------------------------------* - * Set output and intern setup & renderer selection - *-----------------------------------------------------------------*/ - - st_ivas->intern_config = output_config; - move32(); - ivas_output_init( &( st_ivas->hOutSetup ), output_config ); - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; - move16(); - st_ivas->intern_config = IVAS_AUDIO_CONFIG_7_1_4; - move32(); - st_ivas->hOutSetup.output_config = st_ivas->intern_config; - move32(); - st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( st_ivas->intern_config ); - move16(); - } - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; - move32(); - st_ivas->intern_config = IVAS_AUDIO_CONFIG_HOA3; - move32(); - st_ivas->hOutSetup.output_config = IVAS_AUDIO_CONFIG_HOA3; - move32(); - st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); - move16(); - } - - /* Only initialize transport setup if it is used */ - IF( NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); - } - - test(); - IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); - - ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); - } - - ivas_renderer_select( st_ivas ); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( EQ_16( ( error = ivas_ls_custom_output_init_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - st_ivas->hOutSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; - move32(); - st_ivas->hOutSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; - move32(); - st_ivas->hIntSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; - move32(); - st_ivas->hIntSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; - move32(); - } - ELSE - { - return error; - } - } - - ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); - - test(); - IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); - - test(); - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled ) - { - st_ivas->hLsSetupCustom->separate_ch_found = 0; - move16(); - IF( GE_16( st_ivas->hOutSetup.nchan_out_woLFE, MCMASA_MIN_SPEAKERS_SEPARATE_CENTER ) ) - { - /* check for a speaker at (0, 0) if minimum speaker count is available */ - FOR( i = 0; i < st_ivas->hOutSetup.nchan_out_woLFE; i++ ) - { - test(); - IF( ( L_shr( st_ivas->hOutSetup.ls_azimuth_fx[i], Q22 ) == 0 ) && ( L_shr( st_ivas->hOutSetup.ls_elevation_fx[i], Q22 ) == 0 ) ) - { - st_ivas->hIntSetup.separateChannelIndex = i; - move16(); - st_ivas->hLsSetupCustom->separate_ch_found = 1; - move16(); - BREAK; - } - } - } - } - } - - - /*-----------------------------------------------------------------* - * Allocate and initialize SCE/CPE and other handles - *-----------------------------------------------------------------*/ - - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->nchan_transport = 1; - move16(); - sce_id = 0; - move16(); - - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - st_ivas->nchan_transport = CPE_CHANNELS; - move16(); - st_ivas->intern_config = IVAS_AUDIO_CONFIG_STEREO; - move32(); - - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ - move16(); - st_ivas->nCPE_old = 0; - move16(); - cpe_id = 0; - move16(); - - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < st_ivas->nchan_transport; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - - /* init EFAP for custom LS output and set hTransSetup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth_fx, st_ivas->hOutSetup.ls_elevation_fx, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - ivas_output_init( &( st_ivas->hTransSetup ), IVAS_AUDIO_CONFIG_STEREO ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - Word32 element_brate_tmp[MAX_NUM_OBJECTS]; - - st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */ - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; - move16(); - st_ivas->nSCE = MAX_PARAM_ISM_WAVE; - move16(); - - IF( NE_32( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nSCE, element_brate_tmp ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, element_brate_tmp[sce_id] ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - - st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; - move16(); - } - - st_ivas->hISMDTX.sce_id_dtx = 0; - move16(); - - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3; - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) ) - { - FOR( sce_id = 0; sce_id < st_ivas->nSCE; ++sce_id ) - { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = add( 2, sce_id ); - move16(); - } - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - set16_fx( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 0, CLDFB_NO_COL_MAX ); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) - { - IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); - IF( hodirac_flag ) - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - - test(); - test(); - IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; - move16(); - } - ELSE - { - Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; - - st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - move16(); - IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) - { - st_ivas->hSpar->enc_param_start_band = 0; - move16(); - set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); - st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; - move16(); - } - - ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); - } - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - move16(); - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, (res_dec) *CPE_CHANNELS ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* create CPE element for DFT Stereo like upmix */ - test(); - IF( st_ivas->sba_dirac_stereo_flag && ( st_ivas->nCPE == 0 ) ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ - st_ivas->hCPE[0]->hCoreCoder[1] = NULL; - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* set CNA/CNG flags */ - ivas_sba_set_cna_cng_flag( st_ivas ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - /* if we start in ISM_MODE_NONE in MASA_ISM, that appears as normal MASA, but we may change to a mode with ISMs */ - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* set CNA/CNG flags */ - ivas_sba_set_cna_cng_flag( st_ivas ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - Word32 temp_brate[MAX_SCE]; - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - move16(); - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) - { - IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); - IF( hodirac_flag ) - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - - test(); - test(); - IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; - move16(); - } - ELSE - { - Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; - - st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - move16(); - IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) - { - st_ivas->hSpar->enc_param_start_band = 0; - move16(); - set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); - st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; - move16(); - } - - ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - st_ivas->nCPE_old = st_ivas->nCPE; - move16(); - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); - move16(); - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* create CPE element for DFT Stereo like upmix */ - test(); - IF( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ - st_ivas->hCPE[0]->hCoreCoder[1] = NULL; - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_osba_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* set CNA/CNG flags */ - ivas_sba_set_cna_cng_flag( st_ivas ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - st_ivas->ism_extmeta_active = -1; - move16(); - st_ivas->ism_extmeta_cnt = 0; - move16(); - - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - k = 0; - move16(); - ism_total_brate = 0; - move32(); - - WHILE( ( k < SIZE_IVAS_BRATE_TBL ) && ( ivas_total_brate != ivas_brate_tbl[k] ) ) - { - k = add( k, 1 ); - } - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) - { - /* one separated object */ - st_ivas->nSCE = 1; - move16(); - ism_total_brate = sep_object_brate[k - 2][0]; - move32(); - IF( NE_32( ( error = create_sce_dec( st_ivas, 0, ism_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); - - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - Word32 temp_brate[MAX_SCE]; - st_ivas->nSCE = st_ivas->nchan_ism; /* number of objects */ - move16(); - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - temp_brate[sce_id] = sep_object_brate[k - 2][st_ivas->nSCE - 1]; - move32(); - ism_total_brate = L_add( ism_total_brate, temp_brate[sce_id] ); - - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_omasa_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate - ism_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[0]->hCoreCoder[n] ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) - { - /* init EFAP for custom LS setup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ) ); - move16(); - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = shr( st_ivas->nchan_transport, 1 ); - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - /* init EFAP for custom LS setup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - st_ivas->nSCE = 0; - move16(); - st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS >> 1; - move16(); - st_ivas->nCPE_old = 0; - move16(); - st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; - move16(); - - IF( NE_32( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->element_mode_init = IVAS_CPE_MDCT; - move16(); - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - /* init EFAP for custom LS setup */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - IF( NE_32( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hParamMC->proto_matrix_int_e = 0; - move16(); - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - Word32 brate_sce, brate_cpe; - - ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); - - IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - - { - return error; - } - - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - move16(); - test(); - IF( NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - test(); - test(); - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled && !st_ivas->hLsSetupCustom->separate_ch_found ) - { - /* If no speaker matching the separated channel, compute panning gains for the separated channel. */ - IF( st_ivas->hVBAPdata == NULL ) - { - /* Distribute signal to all channels if VBAP is not properly initialized. */ - Word16 inv_sqr, sqr, exp = 15, exp_sqr; - move16(); - IF( EQ_16( st_ivas->hLsSetupCustom->num_spk, 1 ) ) - { - inv_sqr = 32767; // (1.0f in Q15)-1 - move16(); - } - ELSE - { - sqr = Sqrt16( st_ivas->hLsSetupCustom->num_spk, &exp ); - inv_sqr = BASOP_Util_Divide1616_Scale( 32767, sqr, &exp_sqr ); - exp_sqr = sub( exp_sqr, exp ); - IF( ( exp < 0 ) ) - { - inv_sqr = shr( inv_sqr, exp ); // exp_sqr - } - ELSE - { - inv_sqr = shl( inv_sqr, exp ); // exp_sqr - } - } - set16_fx( st_ivas->hLsSetupCustom->separate_ch_gains_fx, inv_sqr, st_ivas->hLsSetupCustom->num_spk ); - } - } - - - ivas_mcmasa_split_brate_fx( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ), IVAS_ERR_OK ) ) - { - return error; - } - - reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - st_ivas->element_mode_init = IVAS_CPE_MDCT; /* element_mode_init was IVAS_SCE for SCE initialization */ - move16(); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, brate_cpe ) ), IVAS_ERR_OK ) ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); - } - } - - /* create CPE element for DFT Stereo like upmix */ - IF( st_ivas->sba_dirac_stereo_flag ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); - IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ - st_ivas->hCPE[0]->hCoreCoder[1] = NULL; - } - - /* set CNA/CNG flags */ - test(); - test(); - IF( EQ_16( st_ivas->nchan_transport, 1 ) && ( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; - move16(); - st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; - move16(); - } - } - } - - - /*-----------------------------------------------------------------* - * Allocate and initialize HP20 filter memories - *-----------------------------------------------------------------*/ - - /* set number of output channels used for synthesis/decoding */ - n = getNumChanSynthesis( st_ivas ); - - IF( n > 0 ) - { - IF( ( st_ivas->mem_hp20_out_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - } - ELSE - { - st_ivas->mem_hp20_out_fx = NULL; - } - - FOR( i = 0; i < n; i++ ) - { - IF( ( st_ivas->mem_hp20_out_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - set32_fx( st_ivas->mem_hp20_out_fx[i], 0, L_HP20_MEM + 2 ); - } - - /*-------------------------------------------------------------------* - * Allocate and initialize rendering handles - *--------------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - /* ParamISM is handled separately from other common config */ - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) ) - { - IF( NE_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) - { - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); - test(); - IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - if ( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - - IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); - - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) - { - IF( NE_32( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) - { - IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) - { - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && EQ_32( st_ivas->ivas_format, MC_FORMAT ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) - { - IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) - { - return error; - } - - st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; - move32(); - - test(); - IF( ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) && ( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) ) - { - granularity = NS2SA_FX2( output_Fs, CLDFB_SLOT_NS ); - - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, MC_PARAMUPMIX_MAX_INPUT_CHANS, MC_PARAMUPMIX_MAX_INPUT_CHANS, granularity ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE - { - granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); - - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - /* Allocate TD renderer for the objects in DISC mode */ - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); - test(); - if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - if ( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - - /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - test(); - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) - { - /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ - IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && - ( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) && - ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || - EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) || - EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || - EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || - EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || - EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || - EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) - { - IF( NE_32( ( error = ivas_ism_renderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - test(); - test(); - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - /* Allocate TD renderer for the objects in DISC mode */ - Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; - Word16 num_src; - IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); - - test(); - if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; - if ( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - } - } - - /*-----------------------------------------------------------------* - * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay - *-----------------------------------------------------------------*/ - test(); - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - binauralization_delay_ns = st_ivas->binaural_latency_ns; - move32(); - IF( st_ivas->hBinRenderer != NULL ) - { - IF( st_ivas->hBinRenderer->render_lfe ) - { - { - /* Account for filterbank delay */ - binauralization_delay_ns = L_add( binauralization_delay_ns, IVAS_FB_DEC_DELAY_NS ); - } - } - ELSE - { - binauralization_delay_ns = 0; - move32(); - } - } - - IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ), IVAS_ERR_OK ) ) - { - return error; - } - - set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); - set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); - } - - /*-----------------------------------------------------------------* - * CLDFB handles for rendering - *-----------------------------------------------------------------*/ - - ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); - - FOR( i = 0; i < numCldfbAnalyses; i++ ) - { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - FOR( ; i < MAX_INTERN_CHANNELS; i++ ) - { - st_ivas->cldfbAnaDec[i] = NULL; - } - - FOR( i = 0; i < numCldfbSyntheses; i++ ) - { - IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - FOR( ; i < MAX_OUTPUT_CHANNELS; i++ ) - { - st_ivas->cldfbSynDec[i] = NULL; - } - - /* CLDFB Interpolation weights */ - test(); - test(); - test(); - IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && !st_ivas->sba_dirac_stereo_flag && NE_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) - { - Word16 Q_cldfbSynDec = Q11; - move16(); - ivas_spar_get_cldfb_gains_fx( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); - - FOR( i = 0; i < st_ivas->cldfbAnaDec[0]->cldfb_state_length; i++ ) - { - st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i], 16 ); // Scaling down from 27 to 11 - move32(); - } - st_ivas->cldfbAnaDec[0]->Q_cldfb_state = Q11; - move16(); - FOR( i = 0; i < st_ivas->cldfbSynDec[0]->cldfb_state_length; i++ ) - { - st_ivas->cldfbSynDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbSynDec[0]->cldfb_state_fx[i], sub( 21, Q_cldfbSynDec ) ); // Scaling down from 21 to Q_cldfbSynDec - move32(); - } - st_ivas->cldfbSynDec[0]->Q_cldfb_state = Q11; - move16(); - } - - /*-----------------------------------------------------------------* - * Allocate and initialize limiter struct - *-----------------------------------------------------------------*/ - - IF( NE_32( ( error = ivas_limiter_open_fx( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /*-----------------------------------------------------------------* - * Allocate and initialize JBM struct + buffer - *-----------------------------------------------------------------*/ - - IF( st_ivas->hTcBuffer == NULL ) - - { - /* no module has yet open the TC buffer, open a default one */ - n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); - - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( st_ivas->hTcBuffer == NULL ) - { - /* we need the handle anyway, but without the buffer*/ - IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - IF( st_ivas->hJbmMetadata == NULL ) - { - IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - IF( NE_32( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - } - - /*-----------------------------------------------------------------* - * Allocate floating-point output audio buffers - *-----------------------------------------------------------------*/ - st_ivas->p_out_len = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); - FOR( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) - { - /* note: these are intra-frame heap memories */ - IF( ( st_ivas->p_output_fx[n] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); - } - set32_fx( st_ivas->p_output_fx[n], 0, 48000 / FRAMES_PER_SEC ); - } - - FOR( ; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) - { - st_ivas->p_output_fx[n] = NULL; - } - return error; -} - -/*------------------------------------------------------------------------- - * destroy_core_dec() - * - * Close core decoder handles - *-------------------------------------------------------------------------*/ - -void destroy_core_dec_fx( - DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ -) -{ - IF( EQ_16( hCoreCoder->element_mode, EVS_MONO ) ) - { - destroy_cldfb_decoder_fx( hCoreCoder ); - } - ELSE - { - destroy_cldfb_decoder_ivas_fx( hCoreCoder ); - } - - IF( hCoreCoder->hGSCDec != NULL ) - { - free( hCoreCoder->hGSCDec ); - hCoreCoder->hGSCDec = NULL; - } - - IF( hCoreCoder->hPFstat != NULL ) - { - free( hCoreCoder->hPFstat ); - hCoreCoder->hPFstat = NULL; - } - - IF( hCoreCoder->hMusicPF != NULL ) - { - free( hCoreCoder->hMusicPF ); - hCoreCoder->hMusicPF = NULL; - } - - IF( hCoreCoder->hBPF != NULL ) - { - free( hCoreCoder->hBPF ); - hCoreCoder->hBPF = NULL; - } - - IF( hCoreCoder->hBWE_zero != NULL ) - { - free( hCoreCoder->hBWE_zero ); - hCoreCoder->hBWE_zero = NULL; - } - - IF( hCoreCoder->hTdCngDec != NULL ) - { - free( hCoreCoder->hTdCngDec ); - hCoreCoder->hTdCngDec = NULL; - } - - IF( hCoreCoder->hSC_VBR != NULL ) - { - free( hCoreCoder->hSC_VBR ); - hCoreCoder->hSC_VBR = NULL; - } - - IF( hCoreCoder->hAmrwb_IO != NULL ) - { - free( hCoreCoder->hAmrwb_IO ); - hCoreCoder->hAmrwb_IO = NULL; - } - - IF( hCoreCoder->hBWE_TD != NULL ) - { - free( hCoreCoder->hBWE_TD ); - hCoreCoder->hBWE_TD = NULL; - } - - IF( hCoreCoder->hBWE_FD != NULL ) - { - free( hCoreCoder->hBWE_FD ); - hCoreCoder->hBWE_FD = NULL; - } - - IF( hCoreCoder->hBWE_FD_HR != NULL ) - { - free( hCoreCoder->hBWE_FD_HR ); - hCoreCoder->hBWE_FD_HR = NULL; - } - - IF( hCoreCoder->hWIDec != NULL ) - { - free( hCoreCoder->hWIDec ); - hCoreCoder->hWIDec = NULL; - } - - IF( hCoreCoder->hTECDec != NULL ) - { - free( hCoreCoder->hTECDec ); - hCoreCoder->hTECDec = NULL; - } - - IF( hCoreCoder->hTcxLtpDec != NULL ) - { - free( hCoreCoder->hTcxLtpDec ); - hCoreCoder->hTcxLtpDec = NULL; - } - - IF( hCoreCoder->hTcxDec != NULL ) - { - free( hCoreCoder->hTcxDec ); - hCoreCoder->hTcxDec = NULL; - } - - IF( hCoreCoder->hTcxCfg != NULL ) - { - free( hCoreCoder->hTcxCfg ); - hCoreCoder->hTcxCfg = NULL; - } - - IF( hCoreCoder->hTonalMDCTConc != NULL ) - { - free( hCoreCoder->hTonalMDCTConc ); - hCoreCoder->hTonalMDCTConc = NULL; - } - - IF( hCoreCoder->hIGFDec != NULL ) - { - free( hCoreCoder->hIGFDec ); - hCoreCoder->hIGFDec = NULL; - } - - IF( hCoreCoder->hPlcInfo != NULL ) - { - free( hCoreCoder->hPlcInfo ); - hCoreCoder->hPlcInfo = NULL; - } - - IF( hCoreCoder->hHQ_core != NULL ) - { - free( hCoreCoder->hHQ_core ); - hCoreCoder->hHQ_core = NULL; - } - - IF( hCoreCoder->hHQ_nbfec != NULL ) - { - free( hCoreCoder->hHQ_nbfec ); - hCoreCoder->hHQ_nbfec = NULL; - } - - return; -} - -/*------------------------------------------------------------------------- - * ivas_initialize_handles_dec() - * - * NULL initialization of handles - *-------------------------------------------------------------------------*/ - -void ivas_initialize_handles_dec( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word16 i; - - FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - st_ivas->cldfbAnaDec[i] = NULL; - } - - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - st_ivas->cldfbSynDec[i] = NULL; - } - - /* SCE handles */ - FOR( i = 0; i < MAX_SCE; i++ ) - { - st_ivas->hSCE[i] = NULL; - } - - /* CPE handles */ - FOR( i = 0; i < MAX_CPE; i++ ) - { - st_ivas->hCPE[i] = NULL; - } - - st_ivas->bit_stream = NULL; - st_ivas->mem_hp20_out_fx = NULL; - st_ivas->hLimiter = NULL; - - /* ISM metadata handles */ - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) - { - st_ivas->hIsmMetaData[i] = NULL; - } - - /* spatial coding handles */ - st_ivas->hDirAC = NULL; - st_ivas->hParamIsmDec = NULL; - st_ivas->hSpar = NULL; - st_ivas->hMasa = NULL; - st_ivas->hQMetaData = NULL; - st_ivas->hMCT = NULL; - st_ivas->hMCParamUpmix = NULL; - st_ivas->hParamMC = NULL; - st_ivas->hLFE = NULL; - - /* rendering handles */ - st_ivas->hBinRenderer = NULL; - st_ivas->hDiracDecBin = NULL; - st_ivas->hDirACRend = NULL; - st_ivas->hSpatParamRendCom = NULL; - st_ivas->hLsSetUpConversion = NULL; - st_ivas->hEFAPdata = NULL; - st_ivas->hVBAPdata = NULL; - st_ivas->hIsmRendererData = NULL; - st_ivas->hBinRendererTd = NULL; - st_ivas->hMonoDmxRenderer = NULL; - st_ivas->hCrendWrapper = NULL; - st_ivas->hReverb = NULL; - st_ivas->hSetOfHRTF = NULL; - st_ivas->hHrtfFastConv = NULL; - st_ivas->hHrtfParambin = NULL; - st_ivas->hoa_dec_mtx = NULL; - st_ivas->hMasaIsmData = NULL; - st_ivas->hSbaIsmData = NULL; - - st_ivas->hHeadTrackData = NULL; - st_ivas->hHrtfTD = NULL; - st_ivas->hLsSetupCustom = NULL; - st_ivas->hRenderConfig = NULL; - st_ivas->hExtOrientationData = NULL; - st_ivas->hCombinedOrientationData = NULL; - - - /* JBM handles */ - st_ivas->hTcBuffer = NULL; - st_ivas->hJbmMetadata = NULL; - - /* floating-point output audio buffers */ - FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) - { - st_ivas->p_output_fx[i] = NULL; - } - - return; -} - - -/*------------------------------------------------------------------------- - * ivas_destroy_dec() - * - * Close IVAS decoder handles - *-------------------------------------------------------------------------*/ - -void ivas_destroy_dec_fx( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ -) -{ - Word16 i; - - /* CLDFB handles */ - FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) - { - IF( st_ivas->cldfbAnaDec[i] != NULL ) - { - deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ) ); - } - } - - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - IF( st_ivas->cldfbSynDec[i] != NULL ) - { - deleteCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ) ); - } - } - - /* SCE handles */ - FOR( i = 0; i < MAX_SCE; i++ ) - { - IF( st_ivas->hSCE[i] != NULL ) - { - destroy_sce_dec( st_ivas->hSCE[i] ); - st_ivas->hSCE[i] = NULL; - } - } - - /* CPE handles */ - FOR( i = 0; i < MAX_CPE; i++ ) - { - IF( st_ivas->hCPE[i] != NULL ) - { - /* set pointer to NULL as core coder already deallocated in destroy_sce_dec() */ - test(); - IF( st_ivas->sba_dirac_stereo_flag && EQ_16( st_ivas->nchan_transport, 1 ) ) - { - st_ivas->hCPE[i]->hCoreCoder[0] = NULL; - st_ivas->hCPE[i]->hCoreCoder[1] = NULL; - } - destroy_cpe_dec( st_ivas->hCPE[i] ); - st_ivas->hCPE[i] = NULL; - } - } - - /* HP20 filter handles */ - IF( st_ivas->mem_hp20_out_fx != NULL ) - { - FOR( i = 0; i < getNumChanSynthesis( st_ivas ); i++ ) - { - free( st_ivas->mem_hp20_out_fx[i] ); - st_ivas->mem_hp20_out_fx[i] = NULL; - } - free( st_ivas->mem_hp20_out_fx ); - st_ivas->mem_hp20_out_fx = NULL; - } - - /* ISM metadata handles */ - ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); - - /* ISM renderer handle */ - ivas_ism_renderer_close( &( st_ivas->hIsmRendererData ) ); - - /* DirAC handle */ - IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); - } - ELSE - { - ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); - ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); - ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); - } - - /* SPAR handle */ - ivas_spar_dec_close_fx( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); - - /* HOA decoder matrix */ - IF( st_ivas->hoa_dec_mtx != NULL ) - { - free( st_ivas->hoa_dec_mtx ); - st_ivas->hoa_dec_mtx = NULL; - } - - /* MASA decoder structure */ - - ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); - /* Qmetadata handle */ - ivas_qmetadata_close_fx( &st_ivas->hQMetaData ); - - /* MCT handle */ - ivas_mct_dec_close( &st_ivas->hMCT ); - - /* LFE handle */ - ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); - - /* Param-Upmix MC handle */ - ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); - - /* Parametric MC handle */ - ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); - - /* EFAP handle */ - efap_free_data_fx( &st_ivas->hEFAPdata ); - - /* VBAP handle */ - vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); - /* Fastconv binaural renderer handle */ - ivas_binRenderer_close_fx( &st_ivas->hBinRenderer ); - - /* Parametric binaural renderer handle */ - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); - - /* Crend handle */ - - ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); - - /* Reverb handle */ - ivas_reverb_close( &st_ivas->hReverb ); - - /* LS config converter handle */ - - ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); - /* Custom LS configuration handle */ - IF( st_ivas->hLsSetupCustom != NULL ) - { - free( st_ivas->hLsSetupCustom ); - st_ivas->hLsSetupCustom = NULL; - } - - /* Mono downmix structure */ - ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); - - /* OSBA structure */ - - ivas_osba_data_close_fx( &st_ivas->hSbaIsmData ); - - /* OMASA structure */ - ivas_omasa_data_close_fx( &st_ivas->hMasaIsmData ); - /* Head track data handle */ - ivas_headTrack_close_fx( &st_ivas->hHeadTrackData ); - - /* External orientation data handle */ - ivas_external_orientation_close_fx( &st_ivas->hExtOrientationData ); - - /* Combined orientation data handle */ - ivas_combined_orientation_close_fx( &st_ivas->hCombinedOrientationData ); - - /* Time Domain binaural renderer handle */ - IF( st_ivas->hBinRendererTd != NULL ) - { - ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); - } - ELSE IF( st_ivas->hHrtfTD != NULL ) - { - BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); - ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); - } - - /* CRend binaural renderer handle */ - ivas_HRTF_CRend_binary_close_fx( &st_ivas->hSetOfHRTF ); - - /* Fastconv HRTF memories */ - ivas_binaural_hrtf_close( &st_ivas->hHrtfFastConv ); - - /* Fastconv HRTF filters */ - ivas_HRTF_fastconv_binary_close_fx( &st_ivas->hHrtfFastConv ); - - /* Parametric binauralizer HRTF filters */ - ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); - - /* Config. Renderer */ - ivas_render_config_close( &( st_ivas->hRenderConfig ) ); - - /* Limiter struct */ - ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); - - IF( st_ivas->hDecoderConfig != NULL ) - { - free( st_ivas->hDecoderConfig ); - st_ivas->hDecoderConfig = NULL; - } - - ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer ); - - IF( st_ivas->hJbmMetadata != NULL ) - { - free( st_ivas->hJbmMetadata ); - st_ivas->hJbmMetadata = NULL; - } - - /* floating-point output audio buffers */ - FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) - { - - IF( st_ivas->p_output_fx[i] != NULL ) - { - free( st_ivas->p_output_fx[i] ); - st_ivas->p_output_fx[i] = NULL; - } - } - - /* main IVAS handle */ - free( st_ivas ); - - return; -} - - -/*-------------------------------------------------------------------* - * ivas_init_dec_get_num_cldfb_instances() - * - * Return number of CLDFB analysis & synthesis instances - *-------------------------------------------------------------------*/ - -/*! r: number of cldfb instances */ -void ivas_init_dec_get_num_cldfb_instances( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - Word16 *numCldfbAnalyses, /* o : number of needed CLDFB analysis instances */ - Word16 *numCldfbSyntheses /* o : number of needed CLDFB synthesis instances */ -) -{ - IVAS_FORMAT ivas_format; - *numCldfbAnalyses = st_ivas->nchan_transport; - move16(); - *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; - move16(); - - test(); - IF( ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) ) - { - ivas_format = SBA_FORMAT; - move32(); - } - ELSE - { - ivas_format = st_ivas->ivas_format; - move32(); - } - - SWITCH( st_ivas->renderer_type ) - { - case RENDERER_BINAURAL_PARAMETRIC: - case RENDERER_BINAURAL_PARAMETRIC_ROOM: - case RENDERER_STEREO_PARAMETRIC: - IF( EQ_16( st_ivas->nchan_transport, 1 ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - - test(); - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) && st_ivas->hOutSetup.separateChannelEnabled ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - - IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) - { - *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); - move16(); - } - } - - IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) - { - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - } - IF( st_ivas->hDiracDecBin->useTdDecorr ) - { - *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); - move16(); - } - BREAK; - case RENDERER_NON_DIEGETIC_DOWNMIX: - case RENDERER_MONO_DOWNMIX: - test(); - test(); - IF( EQ_32( ivas_format, ISM_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - BREAK; - case RENDERER_DIRAC: - IF( EQ_32( ivas_format, SBA_FORMAT ) ) - { - *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; - move16(); - - test(); - IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) - { - *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; - move16(); - } - ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) - { - *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; - move16(); - } - ELSE - { - *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; - move16(); - } - } - IF( NE_32( ivas_format, SBA_FORMAT ) ) - { - test(); - test(); - IF( GT_16( st_ivas->nchan_transport, 2 ) && ( st_ivas->sba_planar != 0 ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_32( st_ivas->hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); - move16(); - } - } - BREAK; - case RENDERER_MC_PARAMMC: - IF( LE_16( st_ivas->hDecoderConfig->nchan_out, 2 ) ) - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - ELSE - { - *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); - move16(); - } - BREAK; - case RENDERER_PARAM_ISM: - /* Already correct with no exception */ - BREAK; - case RENDERER_DISABLE: - /* CLDFB not used */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - BREAK; - case RENDERER_MC: - case RENDERER_SBA_LINEAR_DEC: - case RENDERER_TD_PANNING: - case RENDERER_BINAURAL_OBJECTS_TD: - case RENDERER_MCMASA_MONO_STEREO: - case RENDERER_BINAURAL_MIXER_CONV: - case RENDERER_BINAURAL_MIXER_CONV_ROOM: - case RENDERER_BINAURAL_FASTCONV: - case RENDERER_BINAURAL_FASTCONV_ROOM: - case RENDERER_OSBA_STEREO: - case RENDERER_OSBA_AMBI: - case RENDERER_OSBA_LS: - test(); - IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - IF( st_ivas->sba_dirac_stereo_flag != 0 ) - { - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - ELSE - { - *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; - move16(); - - test(); - IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) - { - *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; - move16(); - } - ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) - { - *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; - move16(); - } - ELSE - { - *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; - move16(); - } - test(); - IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - *numCldfbAnalyses = add( st_ivas->nchan_ism, st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans ); - move16(); - } - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - /* do nothing for ParamMC */ - } - ELSE - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - BREAK; - case RENDERER_SBA_LINEAR_ENC: - IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); - move16(); - } - ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); - move16(); - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - *numCldfbAnalyses = st_ivas->nchan_transport; - move16(); - *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); - move16(); - } - ELSE - { - /* CLDFB not used in rendering */ - *numCldfbAnalyses = 0; - move16(); - *numCldfbSyntheses = 0; - move16(); - } - BREAK; - default: - assert( 0 && "Renderer not handled for CLDFB reservation." ); - } - test(); - test(); - IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) - { - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MAX_INPUT_CHANS, *numCldfbAnalyses ); - move16(); - } - ELSE - { - *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); - move16(); - } - *numCldfbSyntheses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); - move16(); - } - - return; -} - - -/*---------------------------------------------------------------------* - * doSanityChecks_IVAS() - * - * Sanity checks - verify if the decoder set-up parameters are - * not in conflict with the IVAS format - *---------------------------------------------------------------------*/ - -static ivas_error doSanityChecks_IVAS( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - Word32 output_Fs; - AUDIO_CONFIG output_config; - - output_Fs = st_ivas->hDecoderConfig->output_Fs; - move32(); - output_config = st_ivas->hDecoderConfig->output_config; - move32(); - /*-----------------------------------------------------------------* - * Sanity checks - *-----------------------------------------------------------------*/ - - IF( EQ_32( output_Fs, 8000 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz output sampling rate is not supported in IVAS." ); - } - - assert( st_ivas->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); - assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); - - /* Verify output configuration compatible with non-diegetic panning */ - test(); - test(); - IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && NE_32( st_ivas->ivas_format, MONO_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_ISM1 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); - } - - /* Verify stereo output configuration */ - IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Wrong output configuration specified for Stereo!" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - /* Verify ISM output configuration */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for ISM" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - /* Verify SBA output coniguration */ - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for SBA" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for MASA!" ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - /* Verify MC output configuration */ - test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for Multi-channel" ); - } - } - - - IF( st_ivas->hDecoderConfig->Opt_Headrotation ) - { - test(); - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) - { - return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); - } - } - - IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) - { - test(); - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) - { - return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); - } - } - - IF( st_ivas->hDecoderConfig->Opt_dpid_on ) - { - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) - { - return IVAS_ERROR( IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, "Wrong set-up: Directivity is not supported in this output configuration." ); - } - } - - IF( st_ivas->hDecoderConfig->Opt_aeid_on ) - { - IF( NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); - } - } - - IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - test(); - IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - - return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); - } - } - - - return IVAS_ERR_OK; -} diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index ecd38aabe..463bc22fc 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -1,4 +1,3120 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "options.h" +#include "ivas_cnst.h" +#include "ivas_prot_rend_fx.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#include "ivas_stat_enc.h" +#include "prot_fx.h" +#include "wmc_auto.h" #include "ivas_prot_fx.h" + + +/*-------------------------------------------------------------------* + * Local function prototypes + *-------------------------------------------------------------------*/ + +static ivas_error ivas_read_format( Decoder_Struct *st_ivas, Word16 *num_bits_read ); + +static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); + + +/*-------------------------------------------------------------------* + * ivas_dec_setup() + * + * IVAS decoder setup + *-------------------------------------------------------------------*/ + +ivas_error ivas_dec_setup( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + UWord16 *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + Word16 *data /* o : output synthesis signal */ +) +{ + Word16 k, idx, num_bits_read; + Word16 nchan_ism, element_mode_flag; + Decoder_State *st; + Word32 ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + num_bits_read = 0; + move16(); + element_mode_flag = 0; + move16(); + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + + /*-------------------------------------------------------------------* + * Read IVAS format + *-------------------------------------------------------------------*/ + + ivas_read_format( st_ivas, &num_bits_read ); + + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src = 0; + move16(); + + /*-------------------------------------------------------------------* + * Read other signling (ISM/MC mode, number of channels, etc.) + *-------------------------------------------------------------------*/ + + IF( is_DTXrate( ivas_total_brate ) == 0 ) + { + /*-------------------------------------------------------------------* + * Read IVAS format related signaling: + * - in ISM : read number of objects + * - in SBA : read SBA planar flag and SBA order + * - in MASA : read number of TC + * - in MC : read LS setup + *-------------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + element_mode_flag = 1; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + /* read the number of objects */ + st_ivas->nchan_transport = 1; + move16(); + nchan_ism = 1; + move16(); + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + k = extract_l( L_sub( res_dec, 1 ) ); + + WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) + { + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + + IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; + move16(); + num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + move16(); + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); + test(); + test(); + IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) && GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + /* set Ambisonic (SBA) order used for analysis and coding */ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); + move16(); + ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + /* read number of MASA transport channels */ + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + IF( st_ivas->bit_stream[res_dec - 1] ) + { + st_ivas->nchan_transport = 2; + move16(); + element_mode_flag = 1; + move16(); + } + ELSE + { + st_ivas->nchan_transport = 1; + move16(); + } + + IF( st_ivas->ini_frame > 0 ) + { + /* reconfigure in case a change of operation mode is detected */ + test(); + test(); + IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) + { + IF( EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) + { + test(); + test(); + test(); + IF( ( st_ivas->ini_active_frame == 0 ) && NE_32( ivas_total_brate, FRAME_NO_DATA ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) && EQ_16( st_ivas->nCPE, 1 ) ) + { + st_ivas->hCPE[0]->nchan_out = 1; + move16(); + } + ELSE + { + IF( NE_32( ( error = ivas_masa_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE + { + IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + st_ivas->nchan_transport = 2; /* always 2 MASA transport channels */ + move16(); + /* for the DISC mode the number of objects are written at the end of the bitstream, in the MASA metadata */ + + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[res_dec - 1], 1 ), st_ivas->bit_stream[res_dec - 2] ), 1 ); + move16(); + st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, st_ivas->nchan_ism ); + move16(); + IF( st_ivas->ini_frame > 0 ) + { + /* reconfigure in case a change of operation mode is detected */ + test(); + test(); + IF( ( GT_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_32( ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) || ( st_ivas->ini_active_frame == 0 ) ) + { + IF( NE_32( ( error = ivas_omasa_dec_config_fx( st_ivas, nSamplesRendered, &num_src, SrcInd, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + /* the number of objects is written at the end of the bitstream, in the SBA metadata */ + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + st_ivas->nchan_ism = add( add( shl( st_ivas->bit_stream[res_dec - 1], 1 ), st_ivas->bit_stream[res_dec - 2] ), 1 ); + move16(); + + test(); + IF( LT_32( ivas_total_brate, IVAS_24k4 ) || GE_32( ivas_total_brate, IVAS_256k ) ) + { + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[num_bits_read]; + move16(); + num_bits_read = add( num_bits_read, SBA_PLANAR_BITS ); + } + + st_ivas->sba_order = st_ivas->bit_stream[num_bits_read + 1]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); + move16(); + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); + + /* read Ambisonic (SBA) order */ + if ( LT_32( ivas_total_brate, IVAS_256k ) ) + { + st_ivas->sba_order = 3; + move16(); + } + + test(); + IF( st_ivas->ini_frame > 0 && NE_32( ivas_total_brate, st_ivas->last_active_ivas_total_brate ) ) + { + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + /* set Ambisonic (SBA) order used for analysis and coding */ + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->sba_order ); + move16(); + + ivas_sba_config_fx( ivas_total_brate, st_ivas->sba_analysis_order, -1, &( st_ivas->nchan_transport ), st_ivas->sba_planar, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init ); + + /*correct number of CPEs for discrete ISM coding*/ + test(); + IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); + move16(); + } + } + + IF( GE_32( ivas_total_brate, IVAS_256k ) ) + { + st_ivas->ism_mode = ISM_SBA_MODE_DISC; + move32(); + } + ELSE + { + st_ivas->ism_mode = ISM_MODE_NONE; + move32(); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + /* read MC configuration */ + idx = 0; + move16(); + FOR( k = 0; k < MC_LS_SETUP_BITS; k++ ) + { + IF( st_ivas->bit_stream[num_bits_read + k] ) + { + idx = add( idx, shl( 1, sub( ( MC_LS_SETUP_BITS - 1 ), k ) ) ); + } + } + num_bits_read = add( num_bits_read, MC_LS_SETUP_BITS ); + + /* select MC format mode; reconfigure the MC format decoder */ + IF( NE_32( ( error = ivas_mc_dec_config_fx( st_ivas, idx, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Read element mode + *-------------------------------------------------------------------*/ + + IF( st_ivas->ini_frame == 0 && element_mode_flag ) + { + /* read stereo technology info */ + IF( LT_32( ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) + { + /* 1 bit */ + IF( st_ivas->bit_stream[num_bits_read] ) + { + st_ivas->element_mode_init = add( 1, IVAS_CPE_DFT ); + move16(); + } + ELSE + { + st_ivas->element_mode_init = add( 0, IVAS_CPE_DFT ); + move16(); + } + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + } + } + ELSE IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + SWITCH( st_ivas->sid_format ) + { + case SID_DFT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + BREAK; + case SID_MDCT_STEREO: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + case SID_ISM: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_MASA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + st_ivas->nchan_transport = 1; + move16(); + BREAK; + case SID_MASA_2TC:; // empyt statement for declaration + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + IF( EQ_16( st_ivas->bit_stream[( res_dec - 1 ) - SID_FORMAT_NBITS], 1 ) ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + } + st_ivas->nchan_transport = 2; + move16(); + BREAK; + case SID_SBA_1TC: + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_SBA_2TC: + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + } + + test(); + IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + Word16 nchan_transport_old, nchan_transport; + nchan_transport_old = st_ivas->nchan_transport; + move16(); + IF( ( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) ) + { + nchan_transport = 2; + } + ELSE + { + nchan_transport = 1; + } + move16(); + + IF( NE_16( nchan_transport_old, nchan_transport ) ) + { + /*Setting the default bitrate for the reconfig function*/ + IF( EQ_16( st_ivas->sid_format, SID_SBA_2TC ) ) + { + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_48k; + move16(); + } + ELSE + { + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; + move16(); + } + + IF( NE_32( ( error = ivas_sba_dec_reconfigure_fx( st_ivas, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->last_active_ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + st_ivas->hDecoderConfig->ivas_total_brate = ivas_total_brate; + move32(); + } + } + + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + ISM_MODE last_ism_mode = st_ivas->ism_mode; + move32(); + /* read the number of objects */ + st_ivas->nchan_transport = 1; + move16(); + nchan_ism = 1; + move16(); + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + k = extract_l( L_sub( L_sub( res_dec, 1 ), SID_FORMAT_NBITS ) ); + move16(); + + WHILE( st_ivas->bit_stream[k] && ( nchan_ism < MAX_NUM_OBJECTS ) ) + { + nchan_ism = add( nchan_ism, 1 ); + k = sub( k, 1 ); + } + k = sub( k, 1 ); + + test(); + IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); + } + + st_ivas->nchan_ism = nchan_ism; + move16(); + /* read ism_mode */ + st_ivas->ism_mode = ISM_MODE_DISC; + move32(); + IF( GT_16( nchan_ism, 2 ) ) + { + k = sub( k, nchan_ism ); /* SID metadata flags */ + idx = st_ivas->bit_stream[k]; + move16(); + st_ivas->ism_mode = (ISM_MODE) add( idx, 1 ); + move32(); + } + + if ( st_ivas->ini_frame == 0 ) + { + last_ism_mode = st_ivas->ism_mode; + move32(); + } + + IF( NE_32( ( error = ivas_ism_dec_config_fx( st_ivas, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + /*-------------------------------------------------------------------* + * Initialize decoder in the first good frame based on IVAS format + * and number of transport channels + *-------------------------------------------------------------------*/ + test(); + IF( st_ivas->ini_frame == 0 && NE_32( st_ivas->ivas_format, UNDEFINED_FORMAT ) ) + { + IF( NE_32( ( error = doSanityChecks_IVAS( st_ivas ) ), IVAS_ERR_OK ) ) + { + return IVAS_ERROR( error, "Sanity checks failed" ); + } + + IF( NE_32( ( error = ivas_init_decoder_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + + /*----------------------------------------------------------------* + * Reset bitstream pointers + *----------------------------------------------------------------*/ + + ivas_set_bitstream_pointers( st_ivas ); + + reset_elements( st_ivas ); + + /* update bitstream buffer pointer -> take into account already read bits */ + test(); + IF( ( st_ivas->nSCE > 0 ) || ( st_ivas->nCPE > 0 ) ) + { + IF( st_ivas->nSCE > 0 ) + { + st = st_ivas->hSCE[0]->hCoreCoder[0]; + } + ELSE + { + st = st_ivas->hCPE[0]->hCoreCoder[0]; + } + st->next_bit_pos = num_bits_read; + move16(); + st->total_brate = ACELP_8k00; /* only temporary initialization - this is needed for get_next_indice() in the frame following NO_DATA frame */ + move32(); + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_read_format() + * + * Read IVAS format signaling + *-------------------------------------------------------------------*/ + +static ivas_error ivas_read_format( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Word16 *num_bits_read /* o : number of IVAS signaling bits read from the bitstream */ +) +{ + Word16 k, idx; + Word32 ivas_total_brate; + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + move32(); + + *num_bits_read = 0; + move16(); + test(); + test(); + IF( !st_ivas->bfi && is_DTXrate( ivas_total_brate ) == 0 ) + { + /* read IVAS format */ + k = 0; + move16(); + if ( st_ivas->bit_stream[*num_bits_read] ) + { + k = 1; + move16(); + } + k = shl( k, 1 ); + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + if ( st_ivas->bit_stream[*num_bits_read] ) + { + k = add( k, 1 ); + } + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + SWITCH( k ) + { + case 0: + st_ivas->ivas_format = STEREO_FORMAT; + move32(); + BREAK; + case 1: + st_ivas->ivas_format = MC_FORMAT; + move32(); + BREAK; + case 2: + st_ivas->ivas_format = ISM_FORMAT; + move32(); + + IF( GE_32( ivas_total_brate, IVAS_24k4 ) ) + { + IF( st_ivas->bit_stream[*num_bits_read] ) + { + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + IF( st_ivas->bit_stream[*num_bits_read] ) + { + st_ivas->ivas_format = SBA_ISM_FORMAT; + move32(); + } + ELSE + { + st_ivas->ivas_format = MASA_ISM_FORMAT; + move32(); + } + } + + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + } + BREAK; + case 3: + IF( st_ivas->bit_stream[*num_bits_read] ) + { + st_ivas->ivas_format = MASA_FORMAT; + move32(); + } + ELSE + { + st_ivas->ivas_format = SBA_FORMAT; + move32(); + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[( *num_bits_read ) + 1]; + move16(); + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[( *num_bits_read ) + 2 + SBA_PLANAR_BITS]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[( *num_bits_read ) + 1 + SBA_PLANAR_BITS], 1 ) ); + move16(); + if ( st_ivas->sba_order == 0 ) + { + st_ivas->ivas_format = SBA_ISM_FORMAT; + move32(); + } + } + ( *num_bits_read ) = add( ( *num_bits_read ), 1 ); + move16(); + + BREAK; + } + } + ELSE IF( ( st_ivas->bfi == 0 ) && EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) + { + /* read IVAS format in SID frame */ + idx = 0; + move16(); + FOR( k = 0; k < SID_FORMAT_NBITS; k++ ) + { + idx += st_ivas->bit_stream[k] << ( SID_FORMAT_NBITS - 1 - k ); + } + + ( *num_bits_read ) = add( *num_bits_read, SID_FORMAT_NBITS ); + move16(); + st_ivas->sid_format = idx; + move16(); + + SWITCH( idx ) + { + case SID_DFT_STEREO: + case SID_MDCT_STEREO: + st_ivas->ivas_format = STEREO_FORMAT; + move32(); + BREAK; + case SID_ISM: + st_ivas->ivas_format = ISM_FORMAT; + move32(); + BREAK; + case SID_MULTICHANNEL: + st_ivas->ivas_format = MC_FORMAT; + move32(); + BREAK; + case SID_SBA_1TC: + st_ivas->ivas_format = SBA_FORMAT; + move32(); + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_SBA_2TC: + st_ivas->ivas_format = SBA_FORMAT; + move32(); + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + BREAK; + case SID_MASA_1TC: + st_ivas->ivas_format = MASA_FORMAT; + move32(); + st_ivas->element_mode_init = IVAS_SCE; + move16(); + BREAK; + case SID_MASA_2TC: + st_ivas->ivas_format = MASA_FORMAT; + move32(); + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &res_dec, &res_frac, 0 ); + IF( EQ_32( st_ivas->bit_stream[res_dec - 1], 1 ) ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + ELSE + { + st_ivas->element_mode_init = IVAS_CPE_DFT; + move16(); + } + BREAK; + default: + /* This should actually be impossible, since only 3 bits are read, so if this happens something is broken */ + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); + } + + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + if ( st_ivas->sba_analysis_order == 0 ) + { + st_ivas->sba_analysis_order = SBA_FOA_ORDER; + move16(); + } + } + + /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ + st_ivas->bit_stream = st_ivas->bit_stream + ( *num_bits_read ); + ( *num_bits_read ) = 0; + move16(); + } + ELSE + { + /* In SID/NO_DATA frames, use the previous frame IVAS format */ + } + + return error; +} + + +/*-------------------------------------------------------------------* + * getNumChanSynthesis() + * + * get number of output channels used for synthesis/decoding + * (often different from number of output channels!) + *-------------------------------------------------------------------*/ + +/*! r: number of channels to be synthesised */ + +Word16 getNumChanSynthesis( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +) +{ + Word16 n; + + n = add( st_ivas->nSCE, imult1616( CPE_CHANNELS, st_ivas->nCPE ) ); + test(); + test(); + IF( st_ivas->sba_dirac_stereo_flag ) + { + n = CPE_CHANNELS; + move16(); + } + ELSE IF( ( st_ivas->hMCT != NULL || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) && NE_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + n = st_ivas->nchan_transport; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + n = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + } + ELSE + { + n = st_ivas->nchan_transport; + move16(); + } + } + + return n; +} + +/*-------------------------------------------------------------------* + * copy_decoder_config() + * + * Copy IVAS configuration structure to the CoreCoder state structure + *-------------------------------------------------------------------*/ + +void copy_decoder_config( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + Decoder_State *st /* o : decoder state structure */ +) +{ + st->output_Fs = st_ivas->hDecoderConfig->output_Fs; + move32(); + st->Opt_AMR_WB = st_ivas->hDecoderConfig->Opt_AMR_WB; + move16(); + st->codec_mode = st_ivas->codec_mode; + move16(); + st->ini_frame = st_ivas->ini_frame; + move16(); + + st->bfi = st_ivas->bfi; + move16(); + + st->writeFECoffset = st_ivas->writeFECoffset; + move16(); + + st->element_mode = st_ivas->element_mode_init; + move16(); + + return; +} + +/*-------------------------------------------------------------------* + * ivas_init_decoder_front() + * + * Set decoder parameters to initial values + *-------------------------------------------------------------------*/ +ivas_error ivas_init_decoder_front( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + move32(); + /*-----------------------------------------------------------------* + * Resets + *-----------------------------------------------------------------*/ + + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = 0; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->nchan_transport = -1; + move16(); + st_ivas->ism_mode = ISM_MODE_NONE; + move32(); + st_ivas->mc_mode = MC_MODE_NONE; + move32(); + st_ivas->sba_dirac_stereo_flag = 0; + move16(); + + /* HRTF binauralization latency in ns */ + st_ivas->binaural_latency_ns = 0; + move32(); + + /*-------------------------------------------------------------------* + * Allocate and initialize Custom loudspeaker layout handle + *--------------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_LsCustom ) + { + IF( EQ_32( ( error = ivas_ls_custom_open_fx( &( st_ivas->hLsSetupCustom ) ) ), IVAS_ERR_OK ) ) + { + set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_azimuth_fx, MAX_OUTPUT_CHANNELS ); + set_zero_fx( ( st_ivas->hLsSetupCustom )->ls_elevation_fx, MAX_OUTPUT_CHANNELS ); + } + ELSE + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize Head-Tracking handle + *--------------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + IF( NE_32( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + error = ivas_orient_trk_SetTrackingType_fx( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ); + IF( NE_32( ( error ), IVAS_ERR_OK ) ) + { + return error; + } + } + /*-------------------------------------------------------------------* + * Allocate and initialize external orientation handle + *--------------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + IF( NE_32( ( error = ivas_external_orientation_open( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize combined orientation handle + *--------------------------------------------------------------------*/ + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + IF( NE_32( ( error = ivas_combined_orientation_open( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_framesize ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate HRTF binary handle + *--------------------------------------------------------------------*/ + + IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) + { + IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize Binaural Renderer configuration handle + *--------------------------------------------------------------------*/ + test(); + test(); + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + return error; +} + + +/*-------------------------------------------------------------------* + * ivas_init_decoder() + * + * Initialize IVAS decoder state structure + *-------------------------------------------------------------------*/ +ivas_error ivas_init_decoder_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i, n, k; + Word16 sce_id, cpe_id; + Word16 numCldfbAnalyses, numCldfbSyntheses; + Word16 granularity, n_channels_transport_jbm; + Word32 output_Fs, ivas_total_brate; + Word32 binauralization_delay_ns; + AUDIO_CONFIG output_config; + DECODER_CONFIG_HANDLE hDecoderConfig; + ivas_error error; + Word32 ism_total_brate; + + error = IVAS_ERR_OK; + move32(); + output_Fs = st_ivas->hDecoderConfig->output_Fs; + move32(); + hDecoderConfig = st_ivas->hDecoderConfig; + output_config = hDecoderConfig->output_config; + ivas_total_brate = hDecoderConfig->ivas_total_brate; + move32(); + hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + move32(); + st_ivas->last_active_ivas_total_brate = ivas_total_brate; + move32(); + /*-----------------------------------------------------------------* + * Set number of output channels for EXTERNAL output config. + *-----------------------------------------------------------------*/ + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); + move16(); + hDecoderConfig->nchan_out = add( hDecoderConfig->nchan_out, st_ivas->nchan_ism ); + move16(); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + hDecoderConfig->nchan_out = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + move16(); + } + ELSE IF( !EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + hDecoderConfig->nchan_out = st_ivas->nchan_transport; + move16(); + } + + st_ivas->hOutSetup.nchan_out_woLFE = hDecoderConfig->nchan_out; + move16(); + } + + /*-----------------------------------------------------------------* + * Set output and intern setup & renderer selection + *-----------------------------------------------------------------*/ + + st_ivas->intern_config = output_config; + move32(); + ivas_output_init( &( st_ivas->hOutSetup ), output_config ); + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) + { + st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + move16(); + st_ivas->intern_config = IVAS_AUDIO_CONFIG_7_1_4; + move32(); + st_ivas->hOutSetup.output_config = st_ivas->intern_config; + move32(); + st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( st_ivas->intern_config ); + move16(); + } + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + st_ivas->hOutSetup.ambisonics_order = SBA_HOA3_ORDER; + move32(); + st_ivas->intern_config = IVAS_AUDIO_CONFIG_HOA3; + move32(); + st_ivas->hOutSetup.output_config = IVAS_AUDIO_CONFIG_HOA3; + move32(); + st_ivas->hOutSetup.nchan_out_woLFE = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); + move16(); + } + + /* Only initialize transport setup if it is used */ + IF( NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_INVALID ) ) + { + ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); + } + + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hOutSetup.separateChannelEnabled ), &( st_ivas->hOutSetup.separateChannelIndex ), ivas_total_brate ); + } + + ivas_renderer_select( st_ivas ); + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( EQ_16( ( error = ivas_ls_custom_output_init_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + st_ivas->hOutSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; + move32(); + st_ivas->hOutSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; + move32(); + st_ivas->hIntSetup.ls_azimuth_fx = st_ivas->hLsSetupCustom->ls_azimuth_fx; + move32(); + st_ivas->hIntSetup.ls_elevation_fx = st_ivas->hLsSetupCustom->ls_elevation_fx; + move32(); + } + ELSE + { + return error; + } + } + + ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); + + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + ivas_mcmasa_set_separate_channel_mode_fx( &( st_ivas->hIntSetup.separateChannelEnabled ), &( st_ivas->hIntSetup.separateChannelIndex ), ivas_total_brate ); + + test(); + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled ) + { + st_ivas->hLsSetupCustom->separate_ch_found = 0; + move16(); + IF( GE_16( st_ivas->hOutSetup.nchan_out_woLFE, MCMASA_MIN_SPEAKERS_SEPARATE_CENTER ) ) + { + /* check for a speaker at (0, 0) if minimum speaker count is available */ + FOR( i = 0; i < st_ivas->hOutSetup.nchan_out_woLFE; i++ ) + { + test(); + IF( ( L_shr( st_ivas->hOutSetup.ls_azimuth_fx[i], Q22 ) == 0 ) && ( L_shr( st_ivas->hOutSetup.ls_elevation_fx[i], Q22 ) == 0 ) ) + { + st_ivas->hIntSetup.separateChannelIndex = i; + move16(); + st_ivas->hLsSetupCustom->separate_ch_found = 1; + move16(); + BREAK; + } + } + } + } + } + + + /*-----------------------------------------------------------------* + * Allocate and initialize SCE/CPE and other handles + *-----------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ + move16(); + st_ivas->nCPE = 0; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->nchan_transport = 1; + move16(); + sce_id = 0; + move16(); + + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + st_ivas->nchan_transport = CPE_CHANNELS; + move16(); + st_ivas->intern_config = IVAS_AUDIO_CONFIG_STEREO; + move32(); + + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ + move16(); + st_ivas->nCPE_old = 0; + move16(); + cpe_id = 0; + move16(); + + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < st_ivas->nchan_transport; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + + /* init EFAP for custom LS output and set hTransSetup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hOutSetup.ls_azimuth_fx, st_ivas->hOutSetup.ls_elevation_fx, st_ivas->hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + + ivas_output_init( &( st_ivas->hTransSetup ), IVAS_AUDIO_CONFIG_STEREO ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + Word32 element_brate_tmp[MAX_NUM_OBJECTS]; + + st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */ + move16(); + st_ivas->nCPE = 0; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; + move16(); + st_ivas->nSCE = MAX_PARAM_ISM_WAVE; + move16(); + + IF( NE_32( ( error = ivas_param_ism_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nSCE, element_brate_tmp ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, element_brate_tmp[sce_id] ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + + st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; + move16(); + } + + st_ivas->hISMDTX.sce_id_dtx = 0; + move16(); + + IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3; + move16(); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) ) + { + FOR( sce_id = 0; sce_id < st_ivas->nSCE; ++sce_id ) + { + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2 = add( 2, sce_id ); + move16(); + } + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + set16_fx( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, 0, CLDFB_NO_COL_MAX ); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) + { + IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); + IF( hodirac_flag ) + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + + test(); + test(); + IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + move16(); + } + ELSE + { + Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; + + st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + move16(); + set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + move16(); + } + + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + } + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + move16(); + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, (res_dec) *CPE_CHANNELS ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + test(); + IF( st_ivas->sba_dirac_stereo_flag && ( st_ivas->nCPE == 0 ) ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + IF( GT_16( st_ivas->nCPE, 1 ) ) + { + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + /* if we start in ISM_MODE_NONE in MASA_ISM, that appears as normal MASA, but we may change to a mode with ISMs */ + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + Word32 temp_brate[MAX_SCE]; + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + move16(); + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_spar_dec_open_fx( st_ivas, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_DEC ) && st_ivas->hOutSetup.is_loudspeaker_setup ) + { + IF( NE_32( ( error = ivas_sba_get_hoa_dec_matrix_fx( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + Word16 hodirac_flag = ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ); + IF( hodirac_flag ) + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, IVAS_MAX_NUM_BANDS, st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + + test(); + test(); + IF( NE_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + move16(); + } + ELSE + { + Word16 band_grouping[IVAS_MAX_NUM_BANDS + 1]; + + st_ivas->hSpar->enc_param_start_band = s_min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + move16(); + IF( ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + move16(); + set8_fx( (Word8 *) st_ivas->hQMetaData->twoDirBands, (Word8) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (UWord8) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + move16(); + } + + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + } + + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + st_ivas->nCPE_old = st_ivas->nCPE; + move16(); + st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->nchan_ism, 1 ), 1 ) ); + move16(); + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + } + + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + test(); + IF( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + IF( GT_16( st_ivas->nCPE, 1 ) ) + { + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_osba_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + /* set CNA/CNG flags */ + ivas_sba_set_cna_cng_flag( st_ivas ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + st_ivas->ism_extmeta_active = -1; + move16(); + st_ivas->ism_extmeta_cnt = 0; + move16(); + + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + k = 0; + move16(); + ism_total_brate = 0; + move32(); + + WHILE( ( k < SIZE_IVAS_BRATE_TBL ) && ( ivas_total_brate != ivas_brate_tbl[k] ) ) + { + k = add( k, 1 ); + } + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* one separated object */ + st_ivas->nSCE = 1; + move16(); + ism_total_brate = sep_object_brate[k - 2][0]; + move32(); + IF( NE_32( ( error = create_sce_dec( st_ivas, 0, ism_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[0]->hCoreCoder[0] ); + + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + Word32 temp_brate[MAX_SCE]; + st_ivas->nSCE = st_ivas->nchan_ism; /* number of objects */ + move16(); + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + temp_brate[sce_id] = sep_object_brate[k - 2][st_ivas->nSCE - 1]; + move32(); + ism_total_brate = L_add( ism_total_brate, temp_brate[sce_id] ); + + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, temp_brate[sce_id] ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + IF( NE_32( ( error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, temp_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_omasa_data_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate - ism_total_brate ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[0]->hCoreCoder[n] ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) + { + /* init EFAP for custom LS setup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( st_ivas->transport_config ) ); + move16(); + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = shr( st_ivas->nchan_transport, 1 ); + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) + { + /* init EFAP for custom LS setup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + st_ivas->nSCE = 0; + move16(); + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS >> 1; + move16(); + st_ivas->nCPE_old = 0; + move16(); + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + move16(); + + IF( NE_32( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->element_mode_init = IVAS_CPE_MDCT; + move16(); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, sub( st_ivas->nchan_transport, 1 ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, L_shl( res_dec, 1 ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) + { + /* init EFAP for custom LS setup */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth_fx, st_ivas->hLsSetupCustom->ls_elevation_fx, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + IF( NE_32( ( error = ivas_param_mc_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hParamMC->proto_matrix_int_e = 0; + move16(); + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + IF( GT_16( st_ivas->nCPE, 1 ) ) + { + IF( NE_32( ( error = create_mct_dec_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + Word32 brate_sce, brate_cpe; + + ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( st_ivas->element_mode_init ), ivas_total_brate ); + + IF( NE_32( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_masa_dec_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + + { + return error; + } + + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + move16(); + test(); + IF( NE_32( st_ivas->renderer_type, RENDERER_DISABLE ) && NE_32( st_ivas->renderer_type, RENDERER_MCMASA_MONO_STEREO ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + test(); + test(); + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && st_ivas->hOutSetup.separateChannelEnabled && !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* If no speaker matching the separated channel, compute panning gains for the separated channel. */ + IF( st_ivas->hVBAPdata == NULL ) + { + /* Distribute signal to all channels if VBAP is not properly initialized. */ + Word16 inv_sqr, sqr, exp = 15, exp_sqr; + move16(); + IF( EQ_16( st_ivas->hLsSetupCustom->num_spk, 1 ) ) + { + inv_sqr = 32767; // (1.0f in Q15)-1 + move16(); + } + ELSE + { + sqr = Sqrt16( st_ivas->hLsSetupCustom->num_spk, &exp ); + inv_sqr = BASOP_Util_Divide1616_Scale( 32767, sqr, &exp_sqr ); + exp_sqr = sub( exp_sqr, exp ); + IF( ( exp < 0 ) ) + { + inv_sqr = shr( inv_sqr, exp ); // exp_sqr + } + ELSE + { + inv_sqr = shl( inv_sqr, exp ); // exp_sqr + } + } + set16_fx( st_ivas->hLsSetupCustom->separate_ch_gains_fx, inv_sqr, st_ivas->hLsSetupCustom->num_spk ); + } + } + + + ivas_mcmasa_split_brate_fx( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); + + FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) + { + IF( NE_32( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ), IVAS_ERR_OK ) ) + { + return error; + } + + reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); + } + + FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + st_ivas->element_mode_init = IVAS_CPE_MDCT; /* element_mode_init was IVAS_SCE for SCE initialization */ + move16(); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, brate_cpe ) ), IVAS_ERR_OK ) ) + { + return error; + } + + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + /* create CPE element for DFT Stereo like upmix */ + IF( st_ivas->sba_dirac_stereo_flag ) + { + Word32 res_dec, res_frac; + iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nSCE, st_ivas->nCPE ), &res_dec, &res_frac, 0 ); + IF( NE_32( ( error = create_cpe_dec( st_ivas, cpe_id, res_dec ) ), IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ + st_ivas->hCPE[0]->hCoreCoder[1] = NULL; + } + + /* set CNA/CNG flags */ + test(); + test(); + IF( EQ_16( st_ivas->nchan_transport, 1 ) && ( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; + move16(); + st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; + move16(); + } + } + } + + + /*-----------------------------------------------------------------* + * Allocate and initialize HP20 filter memories + *-----------------------------------------------------------------*/ + + /* set number of output channels used for synthesis/decoding */ + n = getNumChanSynthesis( st_ivas ); + + IF( n > 0 ) + { + IF( ( st_ivas->mem_hp20_out_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + } + ELSE + { + st_ivas->mem_hp20_out_fx = NULL; + } + + FOR( i = 0; i < n; i++ ) + { + IF( ( st_ivas->mem_hp20_out_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); + } + set32_fx( st_ivas->mem_hp20_out_fx[i], 0, L_HP20_MEM + 2 ); + } + + /*-------------------------------------------------------------------* + * Allocate and initialize rendering handles + *--------------------------------------------------------------------*/ + test(); + test(); + test(); + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + /* ParamISM is handled separately from other common config */ + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) && ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) ) + { + IF( NE_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) + { + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + Word16 nchan_rend = num_src; + move16(); + test(); + IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; + if ( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + + IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); + + + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) ) + { + IF( NE_32( ( error = ivas_ls_setup_conversion_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) + { + IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) + { + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && EQ_32( st_ivas->ivas_format, MC_FORMAT ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) + { + IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth_fx, st_ivas->hIntSetup.ls_elevation_fx, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), + IVAS_ERR_OK ) ) + { + return error; + } + + st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + move32(); + + test(); + IF( ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) && ( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) ) + { + granularity = NS2SA_FX2( output_Fs, CLDFB_SLOT_NS ); + + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); + + + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, MC_PARAMUPMIX_MAX_INPUT_CHANS, MC_PARAMUPMIX_MAX_INPUT_CHANS, granularity ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE + { + granularity = NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); + + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + /* Allocate TD renderer for the objects in DISC mode */ + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + Word16 nchan_rend = num_src; + move16(); + test(); + if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; + if ( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + test(); + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && ( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + IF( NE_32( ( error = ivas_omasa_separate_object_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && + ( EQ_32( st_ivas->ism_mode, ISM_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) && + ( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || + EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) || + EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || + EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) + { + IF( NE_32( ( error = ivas_ism_renderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + test(); + test(); + IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + /* Allocate TD renderer for the objects in DISC mode */ + Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; + Word16 num_src; + IF( NE_32( ( error = ivas_td_binaural_open_fx( st_ivas, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + Word16 nchan_rend = num_src; + move16(); + + test(); + if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = st_ivas->hBinRendererTd->Sources[SrcInd[nS]]; + if ( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = st_ivas->hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + } + } + + /*-----------------------------------------------------------------* + * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay + *-----------------------------------------------------------------*/ + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) || EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) + { + binauralization_delay_ns = st_ivas->binaural_latency_ns; + move32(); + IF( st_ivas->hBinRenderer != NULL ) + { + IF( st_ivas->hBinRenderer->render_lfe ) + { + { + /* Account for filterbank delay */ + binauralization_delay_ns = L_add( binauralization_delay_ns, IVAS_FB_DEC_DELAY_NS ); + } + } + ELSE + { + binauralization_delay_ns = 0; + move32(); + } + } + + IF( NE_32( ( error = ivas_create_lfe_dec_fx( &st_ivas->hLFE, output_Fs, binauralization_delay_ns ) ), IVAS_ERR_OK ) ) + { + return error; + } + + set32_fx( st_ivas->hLFE->prevsynth_buf_fx, 0, LFE_PLC_BUFLEN ); + set32_fx( st_ivas->hLFE->prior_out_buffer_fx, 0, L_FRAME48k ); + } + + /*-----------------------------------------------------------------* + * CLDFB handles for rendering + *-----------------------------------------------------------------*/ + + ivas_init_dec_get_num_cldfb_instances_ivas_fx( st_ivas, &numCldfbAnalyses, &numCldfbSyntheses ); + + FOR( i = 0; i < numCldfbAnalyses; i++ ) + { + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ), CLDFB_ANALYSIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + FOR( ; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + FOR( i = 0; i < numCldfbSyntheses; i++ ) + { + IF( NE_32( ( error = openCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ), CLDFB_SYNTHESIS, output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + FOR( ; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* CLDFB Interpolation weights */ + test(); + test(); + test(); + IF( ( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && !st_ivas->sba_dirac_stereo_flag && NE_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) + { + Word16 Q_cldfbSynDec = Q11; + move16(); + ivas_spar_get_cldfb_gains_fx( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); + + FOR( i = 0; i < st_ivas->cldfbAnaDec[0]->cldfb_state_length; i++ ) + { + st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbAnaDec[0]->cldfb_state_fx[i], 16 ); // Scaling down from 27 to 11 + move32(); + } + st_ivas->cldfbAnaDec[0]->Q_cldfb_state = Q11; + move16(); + FOR( i = 0; i < st_ivas->cldfbSynDec[0]->cldfb_state_length; i++ ) + { + st_ivas->cldfbSynDec[0]->cldfb_state_fx[i] = L_shr( st_ivas->cldfbSynDec[0]->cldfb_state_fx[i], sub( 21, Q_cldfbSynDec ) ); // Scaling down from 21 to Q_cldfbSynDec + move32(); + } + st_ivas->cldfbSynDec[0]->Q_cldfb_state = Q11; + move16(); + } + + /*-----------------------------------------------------------------* + * Allocate and initialize limiter struct + *-----------------------------------------------------------------*/ + + IF( NE_32( ( error = ivas_limiter_open_fx( &st_ivas->hLimiter, hDecoderConfig->nchan_out, output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + + /*-----------------------------------------------------------------* + * Allocate and initialize JBM struct + buffer + *-----------------------------------------------------------------*/ + + IF( st_ivas->hTcBuffer == NULL ) + + { + /* no module has yet open the TC buffer, open a default one */ + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); + + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA_FX2( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( st_ivas->hTcBuffer == NULL ) + { + /* we need the handle anyway, but without the buffer*/ + IF( NE_32( ( error = ivas_jbm_dec_tc_buffer_open_fx( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( st_ivas->hJbmMetadata == NULL ) + { + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + IF( NE_32( ( error = ivas_jbm_dec_metadata_open( st_ivas ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + } + + /*-----------------------------------------------------------------* + * Allocate floating-point output audio buffers + *-----------------------------------------------------------------*/ + st_ivas->p_out_len = ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); + move16(); + FOR( n = 0; n < ivas_get_nchan_buffers_dec( st_ivas, st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); n++ ) + { + /* note: these are intra-frame heap memories */ + IF( ( st_ivas->p_output_fx[n] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + set32_fx( st_ivas->p_output_fx[n], 0, 48000 / FRAMES_PER_SEC ); + } + + FOR( ; n < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) + { + st_ivas->p_output_fx[n] = NULL; + } + return error; +} + +/*------------------------------------------------------------------------- + * destroy_core_dec() + * + * Close core decoder handles + *-------------------------------------------------------------------------*/ + +void destroy_core_dec_fx( + DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ +) +{ + IF( EQ_16( hCoreCoder->element_mode, EVS_MONO ) ) + { + destroy_cldfb_decoder_fx( hCoreCoder ); + } + ELSE + { + destroy_cldfb_decoder_ivas_fx( hCoreCoder ); + } + + IF( hCoreCoder->hGSCDec != NULL ) + { + free( hCoreCoder->hGSCDec ); + hCoreCoder->hGSCDec = NULL; + } + + IF( hCoreCoder->hPFstat != NULL ) + { + free( hCoreCoder->hPFstat ); + hCoreCoder->hPFstat = NULL; + } + + IF( hCoreCoder->hMusicPF != NULL ) + { + free( hCoreCoder->hMusicPF ); + hCoreCoder->hMusicPF = NULL; + } + + IF( hCoreCoder->hBPF != NULL ) + { + free( hCoreCoder->hBPF ); + hCoreCoder->hBPF = NULL; + } + + IF( hCoreCoder->hBWE_zero != NULL ) + { + free( hCoreCoder->hBWE_zero ); + hCoreCoder->hBWE_zero = NULL; + } + + IF( hCoreCoder->hTdCngDec != NULL ) + { + free( hCoreCoder->hTdCngDec ); + hCoreCoder->hTdCngDec = NULL; + } + + IF( hCoreCoder->hSC_VBR != NULL ) + { + free( hCoreCoder->hSC_VBR ); + hCoreCoder->hSC_VBR = NULL; + } + + IF( hCoreCoder->hAmrwb_IO != NULL ) + { + free( hCoreCoder->hAmrwb_IO ); + hCoreCoder->hAmrwb_IO = NULL; + } + + IF( hCoreCoder->hBWE_TD != NULL ) + { + free( hCoreCoder->hBWE_TD ); + hCoreCoder->hBWE_TD = NULL; + } + + IF( hCoreCoder->hBWE_FD != NULL ) + { + free( hCoreCoder->hBWE_FD ); + hCoreCoder->hBWE_FD = NULL; + } + + IF( hCoreCoder->hBWE_FD_HR != NULL ) + { + free( hCoreCoder->hBWE_FD_HR ); + hCoreCoder->hBWE_FD_HR = NULL; + } + + IF( hCoreCoder->hWIDec != NULL ) + { + free( hCoreCoder->hWIDec ); + hCoreCoder->hWIDec = NULL; + } + + IF( hCoreCoder->hTECDec != NULL ) + { + free( hCoreCoder->hTECDec ); + hCoreCoder->hTECDec = NULL; + } + + IF( hCoreCoder->hTcxLtpDec != NULL ) + { + free( hCoreCoder->hTcxLtpDec ); + hCoreCoder->hTcxLtpDec = NULL; + } + + IF( hCoreCoder->hTcxDec != NULL ) + { + free( hCoreCoder->hTcxDec ); + hCoreCoder->hTcxDec = NULL; + } + + IF( hCoreCoder->hTcxCfg != NULL ) + { + free( hCoreCoder->hTcxCfg ); + hCoreCoder->hTcxCfg = NULL; + } + + IF( hCoreCoder->hTonalMDCTConc != NULL ) + { + free( hCoreCoder->hTonalMDCTConc ); + hCoreCoder->hTonalMDCTConc = NULL; + } + + IF( hCoreCoder->hIGFDec != NULL ) + { + free( hCoreCoder->hIGFDec ); + hCoreCoder->hIGFDec = NULL; + } + + IF( hCoreCoder->hPlcInfo != NULL ) + { + free( hCoreCoder->hPlcInfo ); + hCoreCoder->hPlcInfo = NULL; + } + + IF( hCoreCoder->hHQ_core != NULL ) + { + free( hCoreCoder->hHQ_core ); + hCoreCoder->hHQ_core = NULL; + } + + IF( hCoreCoder->hHQ_nbfec != NULL ) + { + free( hCoreCoder->hHQ_nbfec ); + hCoreCoder->hHQ_nbfec = NULL; + } + + return; +} + +/*------------------------------------------------------------------------- + * ivas_initialize_handles_dec() + * + * NULL initialization of handles + *-------------------------------------------------------------------------*/ + +void ivas_initialize_handles_dec( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i; + + FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + st_ivas->cldfbAnaDec[i] = NULL; + } + + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + st_ivas->cldfbSynDec[i] = NULL; + } + + /* SCE handles */ + FOR( i = 0; i < MAX_SCE; i++ ) + { + st_ivas->hSCE[i] = NULL; + } + + /* CPE handles */ + FOR( i = 0; i < MAX_CPE; i++ ) + { + st_ivas->hCPE[i] = NULL; + } + + st_ivas->bit_stream = NULL; + st_ivas->mem_hp20_out_fx = NULL; + st_ivas->hLimiter = NULL; + + /* ISM metadata handles */ + FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + st_ivas->hIsmMetaData[i] = NULL; + } + + /* spatial coding handles */ + st_ivas->hDirAC = NULL; + st_ivas->hParamIsmDec = NULL; + st_ivas->hSpar = NULL; + st_ivas->hMasa = NULL; + st_ivas->hQMetaData = NULL; + st_ivas->hMCT = NULL; + st_ivas->hMCParamUpmix = NULL; + st_ivas->hParamMC = NULL; + st_ivas->hLFE = NULL; + + /* rendering handles */ + st_ivas->hBinRenderer = NULL; + st_ivas->hDiracDecBin = NULL; + st_ivas->hDirACRend = NULL; + st_ivas->hSpatParamRendCom = NULL; + st_ivas->hLsSetUpConversion = NULL; + st_ivas->hEFAPdata = NULL; + st_ivas->hVBAPdata = NULL; + st_ivas->hIsmRendererData = NULL; + st_ivas->hBinRendererTd = NULL; + st_ivas->hMonoDmxRenderer = NULL; + st_ivas->hCrendWrapper = NULL; + st_ivas->hReverb = NULL; + st_ivas->hSetOfHRTF = NULL; + st_ivas->hHrtfFastConv = NULL; + st_ivas->hHrtfParambin = NULL; + st_ivas->hoa_dec_mtx = NULL; + st_ivas->hMasaIsmData = NULL; + st_ivas->hSbaIsmData = NULL; + + st_ivas->hHeadTrackData = NULL; + st_ivas->hHrtfTD = NULL; + st_ivas->hLsSetupCustom = NULL; + st_ivas->hRenderConfig = NULL; + st_ivas->hExtOrientationData = NULL; + st_ivas->hCombinedOrientationData = NULL; + + + /* JBM handles */ + st_ivas->hTcBuffer = NULL; + st_ivas->hJbmMetadata = NULL; + + /* floating-point output audio buffers */ + FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) + { + st_ivas->p_output_fx[i] = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_destroy_dec() + * + * Close IVAS decoder handles + *-------------------------------------------------------------------------*/ + +void ivas_destroy_dec_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +) +{ + Word16 i; + + /* CLDFB handles */ + FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) + { + IF( st_ivas->cldfbAnaDec[i] != NULL ) + { + deleteCldfb_ivas_fx( &( st_ivas->cldfbAnaDec[i] ) ); + } + } + + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + IF( st_ivas->cldfbSynDec[i] != NULL ) + { + deleteCldfb_ivas_fx( &( st_ivas->cldfbSynDec[i] ) ); + } + } + + /* SCE handles */ + FOR( i = 0; i < MAX_SCE; i++ ) + { + IF( st_ivas->hSCE[i] != NULL ) + { + destroy_sce_dec( st_ivas->hSCE[i] ); + st_ivas->hSCE[i] = NULL; + } + } + + /* CPE handles */ + FOR( i = 0; i < MAX_CPE; i++ ) + { + IF( st_ivas->hCPE[i] != NULL ) + { + /* set pointer to NULL as core coder already deallocated in destroy_sce_dec() */ + test(); + IF( st_ivas->sba_dirac_stereo_flag && EQ_16( st_ivas->nchan_transport, 1 ) ) + { + st_ivas->hCPE[i]->hCoreCoder[0] = NULL; + st_ivas->hCPE[i]->hCoreCoder[1] = NULL; + } + destroy_cpe_dec( st_ivas->hCPE[i] ); + st_ivas->hCPE[i] = NULL; + } + } + + /* HP20 filter handles */ + IF( st_ivas->mem_hp20_out_fx != NULL ) + { + FOR( i = 0; i < getNumChanSynthesis( st_ivas ); i++ ) + { + free( st_ivas->mem_hp20_out_fx[i] ); + st_ivas->mem_hp20_out_fx[i] = NULL; + } + free( st_ivas->mem_hp20_out_fx ); + st_ivas->mem_hp20_out_fx = NULL; + } + + /* ISM metadata handles */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + /* ISM renderer handle */ + ivas_ism_renderer_close( &( st_ivas->hIsmRendererData ) ); + + /* DirAC handle */ + IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); + } + ELSE + { + ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); + ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); + ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); + } + + /* SPAR handle */ + ivas_spar_dec_close_fx( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); + + /* HOA decoder matrix */ + IF( st_ivas->hoa_dec_mtx != NULL ) + { + free( st_ivas->hoa_dec_mtx ); + st_ivas->hoa_dec_mtx = NULL; + } + + /* MASA decoder structure */ + + ivas_masa_dec_close_fx( &( st_ivas->hMasa ) ); + /* Qmetadata handle */ + ivas_qmetadata_close_fx( &st_ivas->hQMetaData ); + + /* MCT handle */ + ivas_mct_dec_close( &st_ivas->hMCT ); + + /* LFE handle */ + ivas_lfe_dec_close_fx( &( st_ivas->hLFE ) ); + + /* Param-Upmix MC handle */ + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + + /* Parametric MC handle */ + ivas_param_mc_dec_close_fx( &st_ivas->hParamMC ); + + /* EFAP handle */ + efap_free_data_fx( &st_ivas->hEFAPdata ); + + /* VBAP handle */ + vbap_free_data_fx( &( st_ivas->hVBAPdata ) ); + /* Fastconv binaural renderer handle */ + ivas_binRenderer_close_fx( &st_ivas->hBinRenderer ); + + /* Parametric binaural renderer handle */ + ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); + + /* Crend handle */ + + ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); + + /* Reverb handle */ + ivas_reverb_close( &st_ivas->hReverb ); + + /* LS config converter handle */ + + ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); + /* Custom LS configuration handle */ + IF( st_ivas->hLsSetupCustom != NULL ) + { + free( st_ivas->hLsSetupCustom ); + st_ivas->hLsSetupCustom = NULL; + } + + /* Mono downmix structure */ + ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); + + /* OSBA structure */ + + ivas_osba_data_close_fx( &st_ivas->hSbaIsmData ); + + /* OMASA structure */ + ivas_omasa_data_close_fx( &st_ivas->hMasaIsmData ); + /* Head track data handle */ + ivas_headTrack_close_fx( &st_ivas->hHeadTrackData ); + + /* External orientation data handle */ + ivas_external_orientation_close_fx( &st_ivas->hExtOrientationData ); + + /* Combined orientation data handle */ + ivas_combined_orientation_close_fx( &st_ivas->hCombinedOrientationData ); + + /* Time Domain binaural renderer handle */ + IF( st_ivas->hBinRendererTd != NULL ) + { + ivas_td_binaural_close_fx( &st_ivas->hBinRendererTd ); + } + ELSE IF( st_ivas->hHrtfTD != NULL ) + { + BSplineModelEvalDealloc_fx( &st_ivas->hHrtfTD->ModelParams, &st_ivas->hHrtfTD->ModelEval ); + ivas_HRTF_binary_close_fx( &st_ivas->hHrtfTD ); + } + + /* CRend binaural renderer handle */ + ivas_HRTF_CRend_binary_close_fx( &st_ivas->hSetOfHRTF ); + + /* Fastconv HRTF memories */ + ivas_binaural_hrtf_close( &st_ivas->hHrtfFastConv ); + + /* Fastconv HRTF filters */ + ivas_HRTF_fastconv_binary_close_fx( &st_ivas->hHrtfFastConv ); + + /* Parametric binauralizer HRTF filters */ + ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); + + /* Config. Renderer */ + ivas_render_config_close( &( st_ivas->hRenderConfig ) ); + + /* Limiter struct */ + ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); + + IF( st_ivas->hDecoderConfig != NULL ) + { + free( st_ivas->hDecoderConfig ); + st_ivas->hDecoderConfig = NULL; + } + + ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer ); + + IF( st_ivas->hJbmMetadata != NULL ) + { + free( st_ivas->hJbmMetadata ); + st_ivas->hJbmMetadata = NULL; + } + + /* floating-point output audio buffers */ + FOR( i = 0; i < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; i++ ) + { + + IF( st_ivas->p_output_fx[i] != NULL ) + { + free( st_ivas->p_output_fx[i] ); + st_ivas->p_output_fx[i] = NULL; + } + } + + /* main IVAS handle */ + free( st_ivas ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_init_dec_get_num_cldfb_instances() + * + * Return number of CLDFB analysis & synthesis instances + *-------------------------------------------------------------------*/ + +/*! r: number of cldfb instances */ +void ivas_init_dec_get_num_cldfb_instances( + Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + Word16 *numCldfbAnalyses, /* o : number of needed CLDFB analysis instances */ + Word16 *numCldfbSyntheses /* o : number of needed CLDFB synthesis instances */ +) +{ + IVAS_FORMAT ivas_format; + *numCldfbAnalyses = st_ivas->nchan_transport; + move16(); + *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; + move16(); + + test(); + IF( ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) ) + { + ivas_format = SBA_FORMAT; + move32(); + } + ELSE + { + ivas_format = st_ivas->ivas_format; + move32(); + } + + SWITCH( st_ivas->renderer_type ) + { + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + case RENDERER_STEREO_PARAMETRIC: + IF( EQ_16( st_ivas->nchan_transport, 1 ) ) + { + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); + } + + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) && st_ivas->hOutSetup.separateChannelEnabled ) + { + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); + } + + IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) + { + IF( EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) ) + { + *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); + move16(); + } + } + + IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) + { + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + *numCldfbAnalyses = add( *numCldfbAnalyses, st_ivas->nchan_ism ); + move16(); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); + } + } + IF( st_ivas->hDiracDecBin->useTdDecorr ) + { + *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); + move16(); + } + BREAK; + case RENDERER_NON_DIEGETIC_DOWNMIX: + case RENDERER_MONO_DOWNMIX: + test(); + test(); + IF( EQ_32( ivas_format, ISM_FORMAT ) || EQ_32( ivas_format, MASA_ISM_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + move16(); + *numCldfbSyntheses = 0; + move16(); + } + BREAK; + case RENDERER_DIRAC: + IF( EQ_32( ivas_format, SBA_FORMAT ) ) + { + *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + move16(); + + test(); + IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) + { + *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + move16(); + } + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) + { + *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + move16(); + } + ELSE + { + *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + move16(); + } + } + IF( NE_32( ivas_format, SBA_FORMAT ) ) + { + test(); + test(); + IF( GT_16( st_ivas->nchan_transport, 2 ) && ( st_ivas->sba_planar != 0 ) ) + { + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); + } + ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_32( st_ivas->hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) + { + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + move16(); + } + } + BREAK; + case RENDERER_MC_PARAMMC: + IF( LE_16( st_ivas->hDecoderConfig->nchan_out, 2 ) ) + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + move16(); + *numCldfbSyntheses = 0; + move16(); + } + ELSE + { + *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); + move16(); + } + BREAK; + case RENDERER_PARAM_ISM: + /* Already correct with no exception */ + BREAK; + case RENDERER_DISABLE: + /* CLDFB not used */ + *numCldfbAnalyses = 0; + move16(); + *numCldfbSyntheses = 0; + move16(); + BREAK; + case RENDERER_MC: + case RENDERER_SBA_LINEAR_DEC: + case RENDERER_TD_PANNING: + case RENDERER_BINAURAL_OBJECTS_TD: + case RENDERER_MCMASA_MONO_STEREO: + case RENDERER_BINAURAL_MIXER_CONV: + case RENDERER_BINAURAL_MIXER_CONV_ROOM: + case RENDERER_BINAURAL_FASTCONV: + case RENDERER_BINAURAL_FASTCONV_ROOM: + case RENDERER_OSBA_STEREO: + case RENDERER_OSBA_AMBI: + case RENDERER_OSBA_LS: + test(); + IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) + { + IF( st_ivas->sba_dirac_stereo_flag != 0 ) + { + *numCldfbAnalyses = 0; + move16(); + *numCldfbSyntheses = 0; + move16(); + } + ELSE + { + *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; + move16(); + + test(); + IF( st_ivas->hOutSetup.is_loudspeaker_setup && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) + { + *numCldfbSyntheses = st_ivas->hOutSetup.nchan_out_woLFE; + move16(); + } + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) ) + { + *numCldfbSyntheses = st_ivas->hSpar->hFbMixer->fb_cfg->num_out_chans; + move16(); + } + ELSE + { + *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; + move16(); + } + test(); + IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + *numCldfbAnalyses = add( st_ivas->nchan_ism, st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans ); + move16(); + } + } + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) + { + /* do nothing for ParamMC */ + } + ELSE + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + move16(); + *numCldfbSyntheses = 0; + move16(); + } + BREAK; + case RENDERER_SBA_LINEAR_ENC: + IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) + { + *numCldfbSyntheses = param_mc_get_num_cldfb_syntheses_fx( st_ivas ); + move16(); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) + { + *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); + move16(); + } + ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) + { + *numCldfbAnalyses = st_ivas->nchan_transport; + move16(); + *numCldfbSyntheses = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); + move16(); + } + ELSE + { + /* CLDFB not used in rendering */ + *numCldfbAnalyses = 0; + move16(); + *numCldfbSyntheses = 0; + move16(); + } + BREAK; + default: + assert( 0 && "Renderer not handled for CLDFB reservation." ); + } + test(); + test(); + IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) + { + test(); + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) + { + *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MAX_INPUT_CHANS, *numCldfbAnalyses ); + move16(); + } + ELSE + { + *numCldfbAnalyses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); + move16(); + } + *numCldfbSyntheses = s_max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); + move16(); + } + + return; +} + void ivas_init_dec_get_num_cldfb_instances_ivas_fx( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ Word16 *numCldfbAnalyses, /* o : number of needed CLDFB analysis instances */ @@ -260,3 +3376,142 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( return; } + + +/*---------------------------------------------------------------------* + * doSanityChecks_IVAS() + * + * Sanity checks - verify if the decoder set-up parameters are + * not in conflict with the IVAS format + *---------------------------------------------------------------------*/ + +static ivas_error doSanityChecks_IVAS( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word32 output_Fs; + AUDIO_CONFIG output_config; + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + move32(); + output_config = st_ivas->hDecoderConfig->output_config; + move32(); + /*-----------------------------------------------------------------* + * Sanity checks + *-----------------------------------------------------------------*/ + + IF( EQ_32( output_Fs, 8000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz output sampling rate is not supported in IVAS." ); + } + + assert( st_ivas->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); + assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); + + /* Verify output configuration compatible with non-diegetic panning */ + test(); + test(); + IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && NE_32( st_ivas->ivas_format, MONO_FORMAT ) && NE_32( st_ivas->transport_config, IVAS_AUDIO_CONFIG_ISM1 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); + } + + /* Verify stereo output configuration */ + IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( NE_32( output_config, IVAS_AUDIO_CONFIG_MONO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_2 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_5_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_7_1_4 ) && NE_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Wrong output configuration specified for Stereo!" ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + /* Verify ISM output configuration */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for ISM" ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + /* Verify SBA output coniguration */ + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for SBA" ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for MASA!" ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + /* Verify MC output configuration */ + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_INVALID ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for Multi-channel" ); + } + } + + + IF( st_ivas->hDecoderConfig->Opt_Headrotation ) + { + test(); + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + { + return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); + } + } + + IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + test(); + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + { + return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); + } + } + + IF( st_ivas->hDecoderConfig->Opt_dpid_on ) + { + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + { + return IVAS_ERROR( IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED, "Wrong set-up: Directivity is not supported in this output configuration." ); + } + } + + IF( st_ivas->hDecoderConfig->Opt_aeid_on ) + { + IF( NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + return IVAS_ERROR( IVAS_ERR_ACOUSTIC_ENVIRONMENT_NOT_SUPPORTED, "Wrong set-up: Acoustic environment is not supported in this output configuration." ); + } + } + + IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + test(); + IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) && EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); + } + } + + + return IVAS_ERR_OK; +} diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec_fx.c similarity index 100% rename from lib_dec/ivas_rom_dec.c rename to lib_dec/ivas_rom_dec_fx.c diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec_fx.c similarity index 100% rename from lib_dec/ivas_stereo_cng_dec.c rename to lib_dec/ivas_stereo_cng_dec_fx.c diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c deleted file mode 100644 index 92ae9159c..000000000 --- a/lib_dec/ivas_stereo_dft_dec.c +++ /dev/null @@ -1,494 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include -#include "options.h" -#include -#include "cnst.h" -#include "rom_com.h" -#include "rom_dec.h" -#include "prot_fx.h" -#include "ivas_cnst.h" -#include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" -#include "ivas_rom_dec.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - -/*-------------------------------------------------------------------* - * Local constants - *-------------------------------------------------------------------*/ - -#define STEFI_DELAY_IND( d, buf_ind ) ( ( buf_ind ) + STEREO_DFT_PAST_MAX - ( d ) + 1 ) % STEREO_DFT_PAST_MAX - -#define STEREO_DFT_RES_RATIO_LIMIT_FX ( Word32 )( 0x170A3D71 ) -#define STEREO_DFT_STEFFI_DELAY_SHORT 2 -#define STEREO_DFT_STEFFI_DELAY_LONG 4 -#define STEREO_DFT_STEFFI_DELAY_OFFSET 2 - - -#define STEREO_DFT_BPF_SIZE 40 /* BPF: Number of weights for BPF in DFT: 40*40Hz=1.6kHz*/ - - -/*------------------------------------------------------------------------- - * Local function prototypes - *-------------------------------------------------------------------------*/ - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_create() - * - * Create DFT stereo handle - *------------------------------------------------------------------------*/ - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_open() - * - * Open DFT decoder stereo handle - *-------------------------------------------------------------------------*/ - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_reset() - * - * Reset DFT stereo memories - *------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------- - * stereo_dft_dec_update() - * - * Update DFT memories for new frame - *-------------------------------------------------------------------------*/ - -/*------------------------------------------------------------------------- - * stereo_dft_dec_destroy() - * - * destroy DFT stereo handle - *-------------------------------------------------------------------------*/ - -void stereo_dft_dec_destroy( - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */ -) -{ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft; - - hStereoDft = *hStereoDft_glob; - - IF( hStereoDft->hConfig != NULL ) - { - free( hStereoDft->hConfig ); - hStereoDft->hConfig = NULL; - } - - IF( hStereoDft->hBpf != NULL ) - { - free( hStereoDft->hBpf ); - hStereoDft->hBpf = NULL; - } - - IF( hStereoDft->hTcxLtpDec != NULL ) - { - free( hStereoDft->hTcxLtpDec ); - hStereoDft->hTcxLtpDec = NULL; - } - - free( hStereoDft ); - hStereoDft = NULL; - - return; -} - - -/*------------------------------------------------------------------------- - * stereo_dft_dec_analyze() - * - * DFT analysis on a 20ms frame - *-------------------------------------------------------------------------*/ - -void stereo_dft_dec_analyze_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 *input_fx, /* i : input signal q*/ - Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/ - const Word16 chan, /* i : channel number Q0*/ - const Word16 input_frame, /* i : input frame size Q0*/ - const Word16 output_frame, /* i : output frame size Q0*/ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ - const Word16 k_offset, /* i : offset of DFT Q0*/ - const Word16 delay, /* i : delay in samples FOR input signal Q0*/ - Word16 *q, - Word16 *q_out_DFT ) -{ - - Word16 i, k; - STEREO_DFT_DEC_DATA_HANDLE hStereoDft; - Word32 *pInput_fx, *pInput_buff_fx; - Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; - Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx; - Word16 NFFT, NFFT_core, ovl, zp; - Word16 offset; - Word32 fac_fx; - const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx; - Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1]; - Word16 trigo_step; - Word32 inputFs; - Word16 delay_dec; - Word16 mem_size; - Word16 ovl2; - - push_wmops( "DFT_analysis" ); - - hStereoDft = hCPE->hStereoDft; - - assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N ); - - /*-----------------------------------------------------------------* - * Initialization - *-----------------------------------------------------------------*/ - - IF( EQ_16( input_frame, output_frame ) ) - { - trigo_fx = hStereoDft->dft_trigo_fx; - trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */ - win_right_fx = hStereoDft->win32ms_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_fx; /* Q15 */ - - test(); - IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); - mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) - { - mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ - } - ELSE - { - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - } - ELSE IF( EQ_16( input_frame, L_FRAME ) ) - { - trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */ - trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; - move16(); - win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_12k8_fx; /* Q15 */ - - test(); - IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); - mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) - { - mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ - } - ELSE - { - assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" ); - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - } - ELSE IF( EQ_16( input_frame, L_FRAME16k ) ) - { - trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */ - trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - move16(); - win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_16k_fx; /* Q15 */ - - test(); - IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); - mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) - { - mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ - } - ELSE - { - assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" ); - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - } - ELSE IF( EQ_16( input_frame, L_FRAME8k ) ) - { - assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" ); - trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */ - trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; - move16(); - win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ - win_left_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ - win2_fx = hStereoDft->win232ms_8k_fx; /* Q15 */ - mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ - } - ELSE - { - IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" ); - mem_fx = NULL; /* to avoid compilation warning */ - trigo_fx = NULL; /* to avoid compilation warning */ - trigo_step = -1; /* to avoid compilation warning */ - move16(); - win_right_fx = NULL; /* to avoid compilation warning */ - win_left_fx = NULL; /* to avoid compilation warning */ - win2_fx = NULL; /* to avoid compilation warning */ - } - - inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */ - delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); - move16(); - zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS ); - move16(); - ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); - move16(); - NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS ); - Word16 qfac_fx; - fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */ - qfac_fx = sub( 31, qfac_fx ); - ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS ); - move16(); - - /* Offset FOR the time buffers */ - assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) ); - mem_size = add( delay_dec, delay ); - - /* Update buffers */ - Copy32( mem_fx, input_buff_fx, mem_size ); /* Q11 */ - Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */ - Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); /* q */ - pInput_buff_fx = input_buff_fx; /* q */ - - test(); - IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) - { - pop_wmops(); - return; - } - - - /*-----------------------------------------------------------------* - * DFT Analysis: loop over frame - *-----------------------------------------------------------------*/ - - assert( ( k_offset <= STEREO_DFT_NBDIV ) ); - - FOR( i = 0; i < NFFT / 4; i++ ) - { - trigo_dec_fx[i] = trigo_fx[i * trigo_step]; - move16(); - trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step]; - move16(); - } - trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step]; - move16(); - - FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) - { - set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX ); - IF( k == 0 ) - { - offset = 0; - move16(); - } - ELSE - { - /* If OVL2 = OVL offset = 10ms */ - offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); - move16(); - } - - pInput_fx = pInput_buff_fx + offset; /* q */ - pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */ - - /*Forwards FFT: L and R*/ - /* Zero Padding & Flat Portion */ - Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */ - - /* Overlapping portions */ - IF( k == 0 ) - { - FOR( i = 0; i < ovl; i++ ) - { - DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */ - move32(); - } - FOR( i = 0; i < ovl2; i++ ) - { - DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */ - move32(); - } - } - ELSE - { - FOR( i = 0; i < ovl2; i++ ) - { - DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */ - move32(); - } - FOR( i = 0; i < ovl; i++ ) - { - DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */ - move32(); - } - } - Word16 q_DFT, q_shift, guarded_bits; - q_DFT = *q; - move16(); - guarded_bits = find_guarded_bits_fx( NFFT ); - q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits ); - - FOR( Word16 j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/ - move32(); - } - - q_DFT = add( q_DFT, q_shift ); - - rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 ); - - q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) ); - FOR( Word16 j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */ - move32(); - } - q_DFT = add( q_DFT, q_shift ); - IF( sub( q_out_DFT[chan], q_DFT ) > 0 ) - { - FOR( Word32 j = 0; j < NFFT; j++ ) - { - out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */ - move32(); - } - q_out_DFT[chan] = q_DFT; - move16(); - } - ELSE - { - FOR( Word32 j = 0; j < NFFT; j++ ) - { - DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */ - move32(); - } - q_DFT = q_out_DFT[chan]; - move16(); - } - - /*Resampling: filtering+scaling*/ - test(); - test(); - IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) ) - { - pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */ - move32(); - IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ - { - pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ - move32(); - } - ELSE - { - pDFT_out_fx[1] = 0; - move32(); - } - FOR( i = 2; i < NFFT; i++ ) - { - pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ - move32(); - } - FOR( i = NFFT; i < hStereoDft->NFFT; i++ ) - { - pDFT_out_fx[i] = 0; /* qDFT */ - move32(); - } - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) - { - pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */ - move32(); - - FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) - { - pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ - move32(); - pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ - move32(); - } - } - ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) ) - { - NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */ - move16(); - - FOR( i = NFFT_core; i < NFFT; i++ ) - { - pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ - move32(); - } - } - ELSE - { - pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */ - move32(); - IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ - { - pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */ - move32(); - } - FOR( i = 2; i < NFFT; i++ ) - { - pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ - move32(); - } - } - } - - pop_wmops(); - return; -} - - -/*--------------------------------------------------------------- - * stereo_dft_dec_smooth_parameters() - * - * - * ---------------------------------------------------------------*/ diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index f1ccc1d7f..914c7fad1 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -268,7 +268,7 @@ void stereo_dft_dec_reset_fx( } /*------------------------------------------------------------------------- - * stereo_dft_dec_open() + * stereo_dft_dec_open_fx() * * Open DFT decoder stereo handle *-------------------------------------------------------------------------*/ @@ -684,6 +684,402 @@ void stereo_dft_dec_update_fx( return; } +/*------------------------------------------------------------------------- + * stereo_dft_dec_destroy_fx() + * + * destroy DFT stereo handle + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_destroy_fx( + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft_glob /* i/o: decoder DFT stereo handle */ +) +{ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + + hStereoDft = *hStereoDft_glob; + + IF( hStereoDft->hConfig != NULL ) + { + free( hStereoDft->hConfig ); + hStereoDft->hConfig = NULL; + } + + IF( hStereoDft->hBpf != NULL ) + { + free( hStereoDft->hBpf ); + hStereoDft->hBpf = NULL; + } + + IF( hStereoDft->hTcxLtpDec != NULL ) + { + free( hStereoDft->hTcxLtpDec ); + hStereoDft->hTcxLtpDec = NULL; + } + + free( hStereoDft ); + hStereoDft = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * stereo_dft_dec_analyze_fx() + * + * DFT analysis on a 20ms frame + *-------------------------------------------------------------------------*/ + +void stereo_dft_dec_analyze_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + const Word32 *input_fx, /* i : input signal q*/ + Word32 out_DFT_fx[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers q_out_DFT*/ + const Word16 chan, /* i : channel number Q0*/ + const Word16 input_frame, /* i : input frame size Q0*/ + const Word16 output_frame, /* i : output frame size Q0*/ + const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : type of signal to analyse */ + const Word16 k_offset, /* i : offset of DFT Q0*/ + const Word16 delay, /* i : delay in samples FOR input signal Q0*/ + Word16 *q, + Word16 *q_out_DFT ) +{ + + Word16 i, k; + STEREO_DFT_DEC_DATA_HANDLE hStereoDft; + Word32 *pInput_fx, *pInput_buff_fx; + Word32 *mem_fx, input_buff_fx[STEREO_DFT32MS_OVL_MAX + L_FRAME48k]; + Word32 DFT_fx[STEREO_DFT32MS_N_MAX], *pDFT_out_fx; + Word16 NFFT, NFFT_core, ovl, zp; + Word16 offset; + Word32 fac_fx; + const Word16 *trigo_fx, *win_left_fx, *win_right_fx, *win2_fx; + Word16 trigo_dec_fx[STEREO_DFT32MS_N_MAX / 2 + 1]; + Word16 trigo_step; + Word32 inputFs; + Word16 delay_dec; + Word16 mem_size; + Word16 ovl2; + + push_wmops( "DFT_analysis" ); + + hStereoDft = hCPE->hStereoDft; + + assert( output_frame == STEREO_DFT_NBDIV * hStereoDft->N ); + + /*-----------------------------------------------------------------* + * Initialization + *-----------------------------------------------------------------*/ + + IF( EQ_16( input_frame, output_frame ) ) + { + trigo_fx = hStereoDft->dft_trigo_fx; + trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */ + win_right_fx = hStereoDft->win32ms_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_fx; /* Q15 */ + + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); + mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) + { + mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ + } + ELSE + { + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + } + ELSE IF( EQ_16( input_frame, L_FRAME ) ) + { + trigo_fx = hStereoDft->dft_trigo_12k8_fx; /* Q15 */ + trigo_step = STEREO_DFT_TRIGO_SRATE_12k8_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); + win_right_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_12k8_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_12k8_fx; /* Q15 */ + + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); + mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) + { + mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ + } + ELSE + { + assert( ( chan == 1 ) && "12.8kHz sampling rate only FOR second channel, i.e. residual coding or allpass signal" ); + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + } + ELSE IF( EQ_16( input_frame, L_FRAME16k ) ) + { + trigo_fx = hStereoDft->dft_trigo_16k_fx; /* Q15 */ + trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); + win_right_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_16k_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_16k_fx; /* Q15 */ + + test(); + IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + assert( ( chan == 0 ) && "DFT stereo: BPF memory only FOR M channel" ); + mem_fx = hCPE->input_mem_BPF_fx[chan]; /* Q11 */ + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB_ADD ) ) + { + mem_fx = hCPE->input_mem_LB_fx[chan]; /* Q11 */ + } + ELSE + { + assert( ( chan == 1 ) && ( hCPE->hStereoDft->hConfig->res_pred_mode == STEREO_DFT_RESPRED_ESF ) && "16kHz sampling rate only FOR second channel with allpass signal" ); + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + } + ELSE IF( EQ_16( input_frame, L_FRAME8k ) ) + { + assert( ( chan == 1 ) && "DFT stereo: 8kHz analysis only FOR residual coding" ); + trigo_fx = hStereoDft->dft_trigo_8k_fx; /* Q15 */ + trigo_step = STEREO_DFT_TRIGO_SRATE_8k_STEP * STEREO_DFT_TRIGO_DEC_STEP; + move16(); + win_right_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ + win_left_fx = hStereoDft->win32ms_8k_fx; /* Q15 */ + win2_fx = hStereoDft->win232ms_8k_fx; /* Q15 */ + mem_fx = hCPE->input_mem_fx[chan]; /* Q11 */ + } + ELSE + { + IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error in DFT stereo: sampling rate not supported" ); + mem_fx = NULL; /* to avoid compilation warning */ + trigo_fx = NULL; /* to avoid compilation warning */ + trigo_step = -1; /* to avoid compilation warning */ + move16(); + win_right_fx = NULL; /* to avoid compilation warning */ + win_left_fx = NULL; /* to avoid compilation warning */ + win2_fx = NULL; /* to avoid compilation warning */ + } + + inputFs = L_mult0( input_frame, FRAMES_PER_SEC ); /* Q0 */ + delay_dec = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); + move16(); + zp = NS2SA_FX2( inputFs, STEREO_DFT32MS_ZP_NS ); + move16(); + ovl = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL_NS ); + move16(); + NFFT = NS2SA_FX2( inputFs, STEREO_DFT32MS_N_NS ); + Word16 qfac_fx; + fac_fx = BASOP_Util_Divide3232_Scale_newton( hStereoDft->NFFT, NFFT, &qfac_fx ); /* qfac_fx */ + qfac_fx = sub( 31, qfac_fx ); + ovl2 = NS2SA_FX2( inputFs, STEREO_DFT32MS_OVL2_NS ); + move16(); + + /* Offset FOR the time buffers */ + assert( ( delay >= -NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_DELAY_DEC_BWE_NS + STEREO_DFT_OVL_NS / 2 ) ) && ( delay <= NS2SA( input_frame * FRAMES_PER_SEC, STEREO_DFT_OVL_NS ) ) ); + mem_size = add( delay_dec, delay ); + + /* Update buffers */ + Copy32( mem_fx, input_buff_fx, mem_size ); /* Q11 */ + Copy32( input_fx, input_buff_fx + mem_size, input_frame ); /* q */ + Copy32( input_buff_fx + input_frame, mem_fx, mem_size ); /* q */ + pInput_buff_fx = input_buff_fx; /* q */ + + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && ( hCPE->hStereoDft->hConfig->res_cod_mode == STEREO_DFT_RES_COD_OFF ) ) + { + pop_wmops(); + return; + } + + + /*-----------------------------------------------------------------* + * DFT Analysis: loop over frame + *-----------------------------------------------------------------*/ + + assert( ( k_offset <= STEREO_DFT_NBDIV ) ); + + FOR( i = 0; i < NFFT / 4; i++ ) + { + trigo_dec_fx[i] = trigo_fx[i * trigo_step]; + move16(); + trigo_dec_fx[NFFT / 2 - i] = trigo_fx[i * trigo_step]; + move16(); + } + trigo_dec_fx[NFFT / 4] = trigo_fx[NFFT / 4 * trigo_step]; + move16(); + + FOR( k = 0; k < STEREO_DFT_NBDIV - k_offset; k++ ) + { + set32_fx( DFT_fx, 0, STEREO_DFT32MS_N_MAX ); + IF( k == 0 ) + { + offset = 0; + move16(); + } + ELSE + { + /* If OVL2 = OVL offset = 10ms */ + offset = NS2SA_FX2( inputFs, STEREO_DFT32MS_WIN_CENTER_NS - STEREO_DFT32MS_OVL2_NS / 2 ); + move16(); + } + + pInput_fx = pInput_buff_fx + offset; /* q */ + pDFT_out_fx = out_DFT_fx[chan] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* q_out_DFT */ + + /*Forwards FFT: L and R*/ + /* Zero Padding & Flat Portion */ + Copy32( pInput_fx, DFT_fx + zp, sub( NFFT, i_mult( 2, zp ) ) ); /* q */ + + /* Overlapping portions */ + IF( k == 0 ) + { + FOR( i = 0; i < ovl; i++ ) + { + DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win_left_fx[STEREO_DFT32MS_STEP * i] ); /* q */ + move32(); + } + FOR( i = 0; i < ovl2; i++ ) + { + DFT_fx[NFFT - zp - 1 - i] = Mpy_32_16_1( DFT_fx[NFFT - zp - 1 - i], win2_fx[i] ); /* q */ + move32(); + } + } + ELSE + { + FOR( i = 0; i < ovl2; i++ ) + { + DFT_fx[i + zp] = Mpy_32_16_1( DFT_fx[i + zp], win2_fx[i] ); /* q */ + move32(); + } + FOR( i = 0; i < ovl; i++ ) + { + DFT_fx[NFFT - zp - i - 1] = Mpy_32_16_1( DFT_fx[NFFT - zp - i - 1], win_right_fx[STEREO_DFT32MS_STEP * i] ); /* q */ + move32(); + } + } + Word16 q_DFT, q_shift, guarded_bits; + q_DFT = *q; + move16(); + guarded_bits = find_guarded_bits_fx( NFFT ); + q_shift = sub( L_norm_arr( DFT_fx, NFFT ), guarded_bits ); + + FOR( Word16 j = 0; j < NFFT; j++ ) + { + DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift*/ + move32(); + } + + q_DFT = add( q_DFT, q_shift ); + + rfft_fx( DFT_fx, trigo_dec_fx, NFFT, -1 ); + + q_shift = sub( L_norm_arr( DFT_fx, NFFT ), sub( 31, qfac_fx ) ); + FOR( Word16 j = 0; j < NFFT; j++ ) + { + DFT_fx[j] = L_shl( DFT_fx[j], q_shift ); /* q + q_shift */ + move32(); + } + q_DFT = add( q_DFT, q_shift ); + IF( sub( q_out_DFT[chan], q_DFT ) > 0 ) + { + FOR( Word32 j = 0; j < NFFT; j++ ) + { + out_DFT_fx[chan][j] = L_shr( out_DFT_fx[chan][j], sub( q_out_DFT[chan], q_DFT ) ); /* q_DFT */ + move32(); + } + q_out_DFT[chan] = q_DFT; + move16(); + } + ELSE + { + FOR( Word32 j = 0; j < NFFT; j++ ) + { + DFT_fx[j] = L_shr( DFT_fx[j], sub( q_DFT, q_out_DFT[chan] ) ); /* q_DFT */ + move32(); + } + q_DFT = q_out_DFT[chan]; + move16(); + } + + /*Resampling: filtering+scaling*/ + test(); + test(); + IF( ( ana_type == DFT_STEREO_DEC_ANA_FB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_LB ) || EQ_32( ana_type, DFT_STEREO_DEC_ANA_NOCORE ) ) + { + pDFT_out_fx[0] = L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ); /*DC*/ /* qDFT */ + move32(); + IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ + { + pDFT_out_fx[1] = L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ + move32(); + } + ELSE + { + pDFT_out_fx[1] = 0; + move32(); + } + FOR( i = 2; i < NFFT; i++ ) + { + pDFT_out_fx[i] = L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ); /* qDFT */ + move32(); + } + FOR( i = NFFT; i < hStereoDft->NFFT; i++ ) + { + pDFT_out_fx[i] = 0; /* qDFT */ + move32(); + } + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_BPF ) ) + { + pDFT_out_fx[0] = L_sub( pDFT_out_fx[0], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[0], fac_fx ), dft_bpf_weights_fx[0] ), sub( 32, qfac_fx ) ) ); /* qDFT */ + move32(); + + FOR( i = 1; i < STEREO_DFT_BPF_SIZE; i++ ) + { + pDFT_out_fx[2 * i] = L_sub( pDFT_out_fx[2 * i], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ + move32(); + pDFT_out_fx[2 * i + 1] = L_sub( pDFT_out_fx[2 * i + 1], L_shl( Mpy_32_32( Mpy_32_32( DFT_fx[2 * i + 1], fac_fx ), dft_bpf_weights_fx[i] ), sub( 32, qfac_fx ) ) ); /* qDFT */ + move32(); + } + } + ELSE IF( EQ_32( ana_type, DFT_STEREO_DEC_ANA_HB_ADD ) ) + { + NFFT_core = NS2SA_FX2( L_mult0( hCPE->hCoreCoder[0]->L_frame, FRAMES_PER_SEC ), STEREO_DFT32MS_N_NS ); /* Q0 */ + move16(); + + FOR( i = NFFT_core; i < NFFT; i++ ) + { + pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ + move32(); + } + } + ELSE + { + pDFT_out_fx[0] = L_add( pDFT_out_fx[0], L_shl( Mpy_32_32( DFT_fx[0], fac_fx ), sub( 31, qfac_fx ) ) ); /*DC*/ /* qDFT */ + move32(); + IF( EQ_16( NFFT, hStereoDft->NFFT ) ) /*Nyquist*/ + { + pDFT_out_fx[1] = L_add( L_shl( Mpy_32_32( DFT_fx[1], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[1] ); /* qDFT */ + move32(); + } + FOR( i = 2; i < NFFT; i++ ) + { + pDFT_out_fx[i] = L_add( L_shl( Mpy_32_32( DFT_fx[i], fac_fx ), sub( 31, qfac_fx ) ), pDFT_out_fx[i] ); /* qDFT */ + move32(); + } + } + } + + pop_wmops(); + return; +} + + /*------------------------------------------------------------------------- * stereo_dft_dec_synthesize_fx() * diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 677c91ef0..522e741e8 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -512,7 +512,7 @@ ivas_error stereo_memory_dec_fx( /* deallocate data structure of the previous CPE mode */ IF( hCPE->hStereoDft != NULL ) { - stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + stereo_dft_dec_destroy_fx( &( hCPE->hStereoDft ) ); hCPE->hStereoDft = NULL; } @@ -684,7 +684,7 @@ ivas_error stereo_memory_dec_fx( /* deallocate data structure of the previous CPE mode */ IF( hCPE->hStereoDft != NULL ) { - stereo_dft_dec_destroy( &( hCPE->hStereoDft ) ); + stereo_dft_dec_destroy_fx( &( hCPE->hStereoDft ) ); hCPE->hStereoDft = NULL; } diff --git a/lib_dec/jbm_jb4_circularbuffer.c b/lib_dec/jbm_jb4_circularbuffer_fx.c similarity index 100% rename from lib_dec/jbm_jb4_circularbuffer.c rename to lib_dec/jbm_jb4_circularbuffer_fx.c diff --git a/lib_dec/jbm_jb4_inputbuffer.c b/lib_dec/jbm_jb4_inputbuffer_fx.c similarity index 100% rename from lib_dec/jbm_jb4_inputbuffer.c rename to lib_dec/jbm_jb4_inputbuffer_fx.c diff --git a/lib_dec/jbm_jb4_jmf.c b/lib_dec/jbm_jb4_jmf_fx.c similarity index 100% rename from lib_dec/jbm_jb4_jmf.c rename to lib_dec/jbm_jb4_jmf_fx.c diff --git a/lib_dec/jbm_jb4sb.c b/lib_dec/jbm_jb4sb_fx.c similarity index 100% rename from lib_dec/jbm_jb4sb.c rename to lib_dec/jbm_jb4sb_fx.c diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa_fx.c similarity index 100% rename from lib_dec/jbm_pcmdsp_apa.c rename to lib_dec/jbm_pcmdsp_apa_fx.c diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c similarity index 100% rename from lib_dec/jbm_pcmdsp_similarityestimation.c rename to lib_dec/jbm_pcmdsp_similarityestimation_fx.c diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window_fx.c similarity index 100% rename from lib_dec/jbm_pcmdsp_window.c rename to lib_dec/jbm_pcmdsp_window_fx.c diff --git a/lib_dec/rom_dec.c b/lib_dec/rom_dec_fx.c similarity index 100% rename from lib_dec/rom_dec.c rename to lib_dec/rom_dec_fx.c diff --git a/lib_enc/cod4t64_fast.c b/lib_enc/cod4t64_fast_fx.c similarity index 100% rename from lib_enc/cod4t64_fast.c rename to lib_enc/cod4t64_fast_fx.c diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc_fx.c similarity index 100% rename from lib_enc/lib_enc.c rename to lib_enc/lib_enc_fx.c diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c deleted file mode 100644 index 60375ddcc..000000000 --- a/lib_enc/lsf_msvq_ma_enc.c +++ /dev/null @@ -1,794 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ - -#include -#include "options.h" -#include "cnst.h" -#include "prot_fx.h" -#include "rom_com.h" -#include "rom_enc.h" -#include "basop_proto_func.h" -#include "wmc_auto.h" - -#ifndef swap -#define swap( x, y, type ) \ - { \ - type u__p; \ - u__p = x; \ - x = y; \ - y = u__p; \ - } -#endif - -/*--------------------------------------------------------------------------* - * Local constants - *--------------------------------------------------------------------------*/ - -#define kMaxC 8 - -/*--------------------------------------------------------------------------* - * msvq_encmsvq_stage1_dct_search() - * - * stage1 search in a segmentwise truncated dct N domain without weights - *--------------------------------------------------------------------------*/ - -/*! r: (p_max , best candidate sofar ) */ -Word16 msvq_stage1_dct_search_fx( - const Word32 *u_fx, /* i : target exp : u_e */ - const Word16 u_e, /* i : exp for target Q0 */ - const Word16 N, /* i : target length and IDCT synthesis length */ - const Word16 maxC_st1, /* i : number of final stage 1 candidates to provide */ - const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ - const Word16 max_dct_trunc, /* i : maximum of truncation lenghts */ - Word32 *invTrfMatrix_fx, /* i : IDCT synthesis matrix for dim N Q31 */ - const Word16 *midQ_truncQ_fx, /* i : midQ vector */ - const Word32 *dct_scaleF_fx, /* i : global scale factors Q10 */ - const Word16 n_segm, /* i : number of segments */ - const Word16 *cols_per_segment, /* i : remaining length per segment */ - const Word16 *trunc_dct_cols_per_segment, /* i : trunc length per segment */ - const Word16 *entries_per_segment, /* i : number of rows per segment */ - const Word16 *cum_entries_per_segment, /* i : number of cumulative entries */ - const Word8 *const W8Qx_dct_sections[], /* i : Word8(byte) segment table ptrs */ - const Word16 *col_syn_shift[], /* i : columnwise syn shift tables */ - const Word8 *segm_neighbour_fwd, /* i : circular neighbour list fwd */ - const Word8 *segm_neighbour_rev, /* i : circular neighbour list reverse */ - const Word16 npost_check, /* i : number of neigbours to check , should be even */ - Word32 *st1_mse_ptr_fx, /* i : dynRAM buffer for MSEs exp : u_e */ - Word16 *indices_st1_local, /* o : selected cand indices */ - Word32 *st1_syn_vec_ptr_fx, /* i/o: buffer for IDCT24 synthesis i :exp : u_e */ - Word32 *dist1_ptr_fx, /* o : resulting stage 1 MSEs in DCT-N domain */ - Word16 *dist1_ptr_e ) -{ - Word32 dct_target_fx[FDCNG_VQ_DCT_MAXTRUNC]; // Q20 - Word32 u_mr_fx[FDCNG_VQ_MAX_LEN]; - Word16 dist1_ptr_e_buf[2 * LSFMBEST_MAX]; - Word64 mse_trunc_segm_fx[FDCNG_VQ_DCT_NSEGM]; - Word32 tmp_fx, check_mse; - Word16 tmp_e, check_mse_e; - Word64 mse_fx; /* Word64 in BASOP */ - - Word16 p_max, c, c2, segm, j_full, j, i; - Word16 n_ana, p_mins[2], idx_min[2]; - - Word16 st1_mse_ptr_e[128]; - - const Word8 *cbpW8; - const Word16 *dct_col_shift_tab; - - Word32 *st1_mse_pair_fx; - Word16 *st1_mse_pair_e; - Word16 *st1_idx_pair; - - Word32 tmp2_fx; - Word16 check_ind[FDCNG_VQ_DCT_NPOST]; - assert( ( npost_check % 2 == 0 ) && ( npost_check <= FDCNG_VQ_DCT_NPOST ) ); - - assert( n_segm <= FDCNG_VQ_DCT_NSEGM ); - - n_ana = N; /* VQ stage#1 core is currently always using stored DCT N coeffs */ - move16(); - assert( n_ana >= max_dct_trunc ); /* check for FDCNGVQ WB , SWB, FB operation */ - - /* remove mid stage#1 vector, in original input domain */ - tmp_e = s_max( 12, u_e ); - FOR( i = 0; i < n_ana; i++ ) - { - u_mr_fx[i] = L_sub( L_shl( u_fx[i], sub( u_e, tmp_e ) ), L_shl( midQ_truncQ_fx[i], sub( Q31 - Q10, tmp_e ) ) ); // tmp_e - move32(); - } - - dctT2_N_apply_matrix_fx( (const Word32 *) u_mr_fx, dct_target_fx, s_min( max_dct_trunc, n_ana ), n_ana, invTrfMatrix_fx, max_dct_trunc, dcttype ); // exp : tmp_e - - /* init search state ptr's at the top */ - set32_fx( dist1_ptr_fx, MAX_32, maxC_st1 ); - set16_fx( dist1_ptr_e_buf, 32, maxC_st1 ); - st1_mse_pair_fx = &( dist1_ptr_fx[0] ); /* req. ptr post upd +=2 */ // st1_mse_pair_e - st1_mse_pair_e = &( dist1_ptr_e_buf[0] ); /* req. ptr post upd +=2 */ - st1_idx_pair = &( indices_st1_local[0] ); /* req. ptr post upd +=2 */ - set64_fx( mse_trunc_segm_fx, 0, n_segm ); - - // set16_fx( mse_trunc_segm_e, u_e, FDCNG_VQ_DCT_NSEGM ); - - FOR( segm = 0; segm < n_segm; segm++ ) - { /* point to a new paired location for each segment */ - p_max = 0; /* req. to point to one of 1 or 0, this init can potentially be omitted here,as p_max is always 1 or 0 */ - move16(); - - /* compute segment common trunction error in dctN domain */ - - FOR( i = 0; i < trunc_dct_cols_per_segment[segm]; i++ ) - { - mse_trunc_segm_fx[segm] = W_mac_32_32( mse_trunc_segm_fx[segm], dct_target_fx[cols_per_segment[segm] + i], dct_target_fx[cols_per_segment[segm] + i] ); // Q41 - move64(); - } - - cbpW8 = W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage , table ptr init */ - - FOR( j = 0; j < entries_per_segment[segm]; j++ ) - { - /* unweighted segmented search DCT domain loop */ - j_full = add( j, cum_entries_per_segment[segm] ); /* or simply use j_full++ */ - - mse_fx = mse_trunc_segm_fx[segm]; /* init mse with with common mse truncation part, in BASOP a move32() */ // Q41 - move64(); - - dct_col_shift_tab = col_syn_shift[segm]; /* ptr init */ - - FOR( c2 = 0; c2 < cols_per_segment[segm]; c2++ ) - { -#define WMC_TOOL_SKIP - tmp_fx = L_sub( dct_target_fx[c2], Mpy_32_32( L_shl( cbpW8[c2], add( sub( Q31, tmp_e ), dct_col_shift_tab[c2] ) ), dct_scaleF_fx[1] ) ); /* note: BASOP shift left defined for signed integers */ - LOGIC( 1 ); - SHIFT( 1 ); - ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ -#undef WMC_TOOL_SKIP - mse_fx = W_mac_32_32( mse_fx, tmp_fx, tmp_fx ); /* L_mac or L_mac0() square Word16 -> Word32*/ // Q41 - } - Word16 L_tmp = W_norm( mse_fx ); - st1_mse_ptr_fx[j_full] = W_extract_h( W_lshl( mse_fx, L_tmp ) ); /* save MSE in shared dynamic RAM, move32() in BASOP */ // st1_mse_ptr_e - move32(); - st1_mse_ptr_e[j_full] = sub( shl( tmp_e, 1 ), L_tmp ); - move16(); - -#define WMC_TOOL_SKIP - cbpW8 += cols_per_segment[segm]; /* fixed pointer increment for each segment */ -#undef WMC_TOOL_SKIP - - /* overwrite with a new worst index at p_max */ - - /* Note: The three inner loop if's below are not 100% properly instrumented by WMC tool */ - // if ( st1_mse_ptr_fx[j_full] < st1_mse_pair_fx[p_max] ) /* L_sub */ - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_ptr_fx[j_full], st1_mse_ptr_e[j_full], st1_mse_pair_fx[p_max], st1_mse_pair_e[p_max] ), -1 ) ) /* L_sub */ - { - st1_idx_pair[p_max] = j_full; /* move16, single BASOP */ - move16(); - } /* BASOP 2 ops */ - - IF( EQ_16( st1_idx_pair[p_max], j_full ) ) - { /* idx updated --> also update mse */ - st1_mse_pair_fx[p_max] = st1_mse_ptr_fx[j_full]; /* move32(), single BASOP */ - move32(); - st1_mse_pair_e[p_max] = st1_mse_ptr_e[j_full]; /* move32(), single BASOP */ - move16(); - } /* BASOP 3 ops */ - - /* avoid WC costly candidate list management by always updating p_max, - as we have only a pair in each segment to maintain */ - p_max = 0; - move16(); - if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_pair_fx[0], st1_mse_pair_e[0], st1_mse_pair_fx[1], st1_mse_pair_e[1] ), -1 ) ) /* L_sub()*/ - { - p_max = 1; /* move16() */ - move16(); - } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ - - /* Note: logical shift right not available in ANSI-C */ - /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ - /* in java logical shift right is available as >>> , in BASOP it is available as L_lshr */ - - /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ - } /* j in section */ - - st1_mse_pair_fx += 2; /* req. ptr init */ - st1_mse_pair_e += 2; /* req. ptr init */ - st1_idx_pair += 2; /* req. ptr init */ - - } /* next segment */ - - tmp_e = 0; - move16(); - FOR( j = 0; j < maxC_st1; j++ ) - { - /* compute_full mse using stored DCT24 domain MSE's */ - /* calculate MSE from stage1 inner using existing inner DCT domain variables */ - tmp_e = s_max( dist1_ptr_e_buf[j], tmp_e ); - } - - FOR( j = 0; j < maxC_st1; j++ ) - { - /* compute_full mse using stored DCT24 domain MSE's */ - /* calculate MSE from stage1 inner using existing inner DCT domain variables */ - dist1_ptr_fx[j] = L_shr( dist1_ptr_fx[j], sub( tmp_e, dist1_ptr_e_buf[j] ) ); - move32(); - *dist1_ptr_e = tmp_e; - move16(); - } - - - assert( ( maxC_st1 >= 3 ) ); - assert( ( maxC_st1 <= 8 ) ); - - p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish current worst candidate for MSVQ stage#2 among all maxC_st1 candidates so far */ - - p_mins[0] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find best entry among all maxC_pre */ - move16(); - tmp_fx = dist1_ptr_fx[p_mins[0]]; - move32(); - dist1_ptr_fx[p_mins[0]] = MAX_32; /* exclude 1st */ - move32(); - - p_mins[1] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find 2nd best entry */ - move16(); - tmp2_fx = dist1_ptr_fx[p_mins[1]]; - move32(); - dist1_ptr_fx[p_mins[1]] = MAX_32; /* exclude 2nd */ - move32(); - - dist1_ptr_fx[p_mins[0]] = tmp_fx; /* restore 1st */ - move32(); - dist1_ptr_fx[p_mins[1]] = tmp2_fx; /* restore 2nd */ - move32(); - - idx_min[0] = indices_st1_local[p_mins[0]]; - move16(); - idx_min[1] = indices_st1_local[p_mins[1]]; - move16(); - - - /* use global exclusion list to never reselect the two (best) global MSE values sofar */ - st1_mse_ptr_fx[idx_min[0]] = MAX_32; /* move32() */ - move32(); - st1_mse_ptr_e[idx_min[0]] = MAX_16; - move16(); - st1_mse_ptr_fx[idx_min[1]] = MAX_32; /* move32() */ - move32(); - st1_mse_ptr_e[idx_min[1]] = MAX_16; - move16(); - - /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ - /* using both 1st and 2nd best neighbours in fwd and rev directions */ - check_ind[0] = segm_neighbour_fwd[idx_min[0]]; - move16(); - check_ind[1] = segm_neighbour_rev[idx_min[0]]; - move16(); - - check_ind[2] = segm_neighbour_fwd[idx_min[1]]; - move16(); - check_ind[3] = segm_neighbour_rev[idx_min[1]]; - move16(); - - check_ind[4] = segm_neighbour_fwd[check_ind[0]]; - move16(); - check_ind[5] = segm_neighbour_rev[check_ind[1]]; - move16(); - - check_ind[6] = segm_neighbour_fwd[check_ind[2]]; - move16(); - check_ind[FDCNG_VQ_DCT_NPOST - 1] = segm_neighbour_rev[check_ind[3]]; - move16(); - - FOR( i = 0; i < npost_check; i++ ) - { - /* move MSE from DCT-inner loop search to input synthesis domain */ - /* multiplication by fdcng_dct_scaleF[2] to get the float outer loop scale correct in IDCT synthesis domain */ - check_mse = st1_mse_ptr_fx[check_ind[i]]; - move32(); - check_mse_e = st1_mse_ptr_e[check_ind[i]]; - move16(); - - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( check_mse, check_mse_e, dist1_ptr_fx[p_max], *dist1_ptr_e ), -1 ) ) - { /* new winner , replace worst */ - dist1_ptr_fx[p_max] = L_shl( check_mse, sub( check_mse_e, *dist1_ptr_e ) ); - move32(); - indices_st1_local[p_max] = check_ind[i]; - move16(); - st1_mse_ptr_fx[check_ind[i]] = MAX_32; /* exclude, BASOP: move32() */ - move32(); - st1_mse_ptr_e[check_ind[i]] = MAX_16; - move16(); - p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish a new current worst candidate among all maxC */ - } - } - - /* extract the selected stage one vectors in DCT_N domain , apply IDCT_N and scale up */ - /* always extract full length signal(e.g. 24) to be able to update WB(e.g. N_in==21) candidate MSE values */ - /* in the case that only a part of the IDCT N vector is in final use */ - - /* note: synthesis not yet fully parameterized/generalized for other IDCT lengths */ - assert( N == 24 ); - { - FOR( c = 0; c < maxC_st1; c++ ) - { - dec_FDCNG_MSVQ_stage1_fx( indices_st1_local[c], N, invTrfMatrix_fx, dcttype + 1, &( st1_syn_vec_ptr_fx[c * N] ), NULL ); // Q11 : output - scale_sig32( &( st1_syn_vec_ptr_fx[c * N] ), N, sub( 11, s_max( u_e, 12 ) ) ); - } - } - - return p_max; /*ptr to worst performing candidate */ -} - - -/*--------------------------------------------------------------------------* - * msvq_stage1_dct_recalc_candidates_fdcng_wb() - * - * recalc MSE for fdcng WB(0..20) coeffs , - essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, - excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages - *--------------------------------------------------------------------------*/ - -/*! r: (updated p_max) */ -Word16 msvq_stage1_dct_recalc_candidates_fdcng_wb_fx( - const Word32 *st1_syn_vec_ptr_fx, /* i : IDCT24 synthesis vectors st1_syn_vec_e*/ - const Word16 st1_syn_vec_e, /* i : exp for IDCT24 synthesis vectors */ - const Word32 *u_fx, /* i : target signal u_e*/ - const Word16 u_e, /* i : exp for target signal */ - const Word16 maxC_st1, /* i : number of candidates in stage1 */ - Word32 *dist_ptr_fx, /* i/o: updated MSE vector for stage1 */ - Word16 *dist_ptr_e /* i/o: exp for updated MSE vector for stage1 */ -) -{ - Word16 i; - Word16 p_max_local, c; - const Word32 *p2_fx; - Word16 tmp_e; - Word32 res24_fx, high_diff_fx[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; - Word64 acc; - Word16 res24_e[FD_CNG_maxC_37bits]; - Word16 dist_e; - - dist_e = *dist_ptr_e; - move16(); - FOR( c = 0; c < maxC_st1; c++ ) - { /* point to extended synthesis part */ - p2_fx = (const Word32 *) &( st1_syn_vec_ptr_fx[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init to synthesis candidate c */ - tmp_e = s_max( st1_syn_vec_e, u_e ); - tmp_e = add( tmp_e, 1 ); - /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */ - FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) - { - high_diff_fx[i] = L_sub( L_shr( p2_fx[i], sub( tmp_e, st1_syn_vec_e ) ), L_shr( u_fx[FDCNG_VQ_MAX_LEN_WB + i], sub( tmp_e, u_e ) ) ); // tmp_e - move32(); - } - acc = 0; - move64(); - FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) - { - acc = W_mac_32_32( acc, high_diff_fx[i], high_diff_fx[i] ); - } - res24_e[c] = tmp_e; - move16(); - tmp_e = W_norm( acc ); - res24_fx = W_extract_h( W_shl( acc, tmp_e ) ); - - res24_e[c] = sub( shl( res24_e[c], 1 ), tmp_e ); - move16(); - - dist_ptr_fx[c] = BASOP_Util_Add_Mant32Exp( dist_ptr_fx[c], *dist_ptr_e, L_negate( res24_fx ), res24_e[c], &res24_e[c] ); /* remove DCT24 high band error contribution */ - move32(); - dist_e = s_max( dist_e, res24_e[c] ); - move16(); - } - - - FOR( c = 0; c < maxC_st1; c++ ) - { - dist_ptr_fx[c] = L_shl( dist_ptr_fx[c], sub( res24_e[c], dist_e ) ); - move32(); - } - *dist_ptr_e = dist_e; - move16(); - /* finally update p_max, as it may potentially change, - due to the core DCT24 search originally optimizing over the longer basis vectors than DCT21 */ - p_max_local = maximum_32_fx( dist_ptr_fx, maxC_st1, NULL ); - - return p_max_local; -} - - -/*--------------------------------------------------------------------------* - * msvq_enc() - * - * MSVQ encoder - *--------------------------------------------------------------------------*/ - - -void msvq_enc_ivas_fx( - const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) Q_cb */ - const Word16 Q_cb, /* i : Codebook Q */ - const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const Word16 offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const Word32 u_fx[], /* i : Vector to be encoded (prediction and mean removed) (exp : u_e) */ - const Word16 u_e, /* i : Exponent for Vector to be encoded */ - const Word16 *levels, /* i : Number of levels in each stage */ - const Word16 maxC, /* i : Tree search size (number of candidates kept from from one stage to the next == M-best) */ - const Word16 stages, /* i : Number of stages */ - const Word16 w[], /* i : Weights Q8 */ - const Word16 N, /* i : Vector dimension */ - const Word16 maxN, /* i : Codebook dimension */ - const Word16 applyDCT_flag, /* i : applyDCT flag */ - Word32 *invTrfMatrix_fx, /* i/o: synthesis matrix Q31 */ - Word16 Idx[] /* o : Indices */ -) -{ - Word16 j; - const Word16 *cbp, *cb_stage; - Word32 resid_buf_fx[2 * LSFMBEST_MAX * M_MAX], *resid_fx[2]; - Word32 *pTmp, *p1, *p2; // pTmp_e - Word16 pTmp_e; - Word16 *indices[2], m, s, c, c2, p_max, i; - Word16 idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; - Word32 dist_buf_fx[2 * LSFMBEST_MAX], *dist_fx[2], tmp, en, ss2, Tmp[M_MAX]; - Word16 dist_buf_e[2 * LSFMBEST_MAX], *dist_e[2]; - Word16 tmp_e, tmp_n, en_e; - Word16 resid_e; - Word16 n, maxn, start; - Word64 W_acc; /*64 bit accumulator*/ - - Word32 *st1_syn_vec_ptr_fx = &( resid_buf_fx[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; - Word32 *st1_mse_ptr_fx = &( resid_buf_fx[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); - Word16 indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; - - /*----------------------------------------------------------------* - * Allocate memory for previous (parent) and current nodes. - * Parent node is indexed [0], current node is indexed [1]. - *----------------------------------------------------------------*/ - indices[0] = idx_buf; - indices[1] = idx_buf + maxC * stages; /*move16();*/ - /*vr_iset(0, idx_buf, 2*stages*maxC);*/ - set16_fx( idx_buf, 0, (Word16) ( 2 * stages * maxC ) ); - - resid_fx[0] = resid_buf_fx; - resid_fx[1] = resid_buf_fx + maxC * N; /*move16();*/ - - dist_fx[0] = dist_buf_fx; - dist_e[0] = dist_buf_e; - dist_fx[1] = dist_buf_fx + maxC; - dist_e[1] = dist_buf_e + maxC; - - /*vr_iset(0, parents, maxC);*/ - set16_fx( parents, 0, maxC ); - - /*----------------------------------------------------------------* - * LSF weights are normalized, so it is always better to multiply it first - * Set up inital distance vector - *----------------------------------------------------------------*/ - W_acc = W_mult_32_32( Mpy_32_16_1( u_fx[0], shl( w[0], 2 ) ), u_fx[0] ); // 2*Qu - 6 + 1 - FOR( j = 1; j < N; j++ ) - { - W_acc = W_mac_32_32( W_acc, Mpy_32_16_1( u_fx[j], shl( w[j], 2 ) ), u_fx[j] ); // 2*Qu - 6 + 1 - } - - tmp_n = W_norm( W_acc ); - ss2 = W_extract_h( W_shl( W_acc, tmp_n ) ); - tmp_e = sub( add( shl( u_e, 1 ), 5 ), tmp_n ); - - /* Set up inital error (residual) vectors */ - pTmp = resid_fx[1]; /*move16();*/ - resid_e = u_e; - move16(); - IF( applyDCT_flag != 0 ) - { - resid_e = s_max( u_e, 12 ); - } - FOR( c = 0; c < maxC; c++ ) - { - Copy32( u_fx, pTmp + c * N, N ); - test(); - IF( applyDCT_flag != 0 && LT_16( u_e, 12 ) ) - { - scale_sig32( pTmp + c * N, N, sub( u_e, resid_e ) ); - } - dist_fx[1][c] = ss2; - move32(); - dist_e[1][c] = tmp_e; - move16(); - } - - /* Loop over all stages */ - m = 1; - move16(); - FOR( s = 0; s < stages; s++ ) - { - /* codebook pointer is set to point to first stage */ - cbp = cb[s]; /*Q_cb*/ - cb_stage = cbp; - - /* Set up pointers to parent and current nodes */ - swap( indices[0], indices[1], Word16 * ); - move16(); - move16(); - move16(); - swap( resid_fx[0], resid_fx[1], Word32 * ); - move32(); - move32(); - move32(); - swap( dist_fx[0], dist_fx[1], Word32 * ); - swap( dist_e[0], dist_e[1], Word16 * ); - move32(); - move32(); - move32(); - move16(); - move16(); - move16(); - - /* p_max points to maximum distortion node (worst of best) */ - p_max = 0; - move16(); - - n = N; - move16(); - maxn = maxN; - move16(); - if ( dims ) - { - n = dims[s]; - move16(); - } - if ( dims ) - { - maxn = n; - move16(); - } - - assert( ( maxn % 4 ) == 0 ); - - start = 0; - move16(); - if ( offs ) - { - start = offs[s]; - move16(); - } - - set32_fx( Tmp, 0, start ); - set32_fx( Tmp + start + n, 0, sub( N, add( start, n ) ) ); - - /* Set distortions to a large value */ - FOR( j = 0; j < maxC; j++ ) - { - dist_fx[1][j] = MAX_32; - move32(); - dist_e[1][j] = MAX_16 / 2; - move16(); - } - - test(); - IF( !s && applyDCT_flag != 0 ) /* means: m==1 */ - { - /* stage 1 candidates search in truncated dct24 domain without any weights */ - assert( N == FDCNG_VQ_MAX_LEN || N == FDCNG_VQ_MAX_LEN_WB ); /* 21 and 24 allowed */ - assert( maxC == 2 * FDCNG_VQ_DCT_NSEGM ); - p_max = msvq_stage1_dct_search_fx( u_fx, u_e, FDCNG_VQ_MAX_LEN, maxC, DCT_T2_24_XX, FDCNG_VQ_DCT_MAXTRUNC, (Word32 *) invTrfMatrix_fx, cdk1r_tr_midQ_truncQ_fx, fdcng_dct_scaleF_fx, FDCNG_VQ_DCT_NSEGM, - cdk1_ivas_cols_per_segment, cdk1_ivas_trunc_dct_cols_per_segment, cdk1_ivas_entries_per_segment, cdk1_ivas_cum_entries_per_segment, cdk_37bits_ivas_stage1_W8Qx_dct_sections, - stage1_dct_col_syn_shift, cdk1_ivas_segm_neighbour_fwd, cdk1_ivas_segm_neighbour_rev, FDCNG_VQ_DCT_NPOST, st1_mse_ptr_fx, indices_st1_local, st1_syn_vec_ptr_fx, dist_fx[1], &dist_e[1][0] ); - - /* move established stage#1 indices to the global MSVQ list structure */ - set16_fx( dist_e[1], dist_e[1][0], maxC ); - FOR( c = 0; c < maxC; c++ ) - { - indices[1][c * stages] = indices_st1_local[c]; - move16(); - } - } - ELSE - { - FOR( j = 0; j < levels[s]; j++ ) - { - /* Compute weighted codebook element and its energy */ - en = 0; - move32(); - en_e = 0; - move16(); - W_acc = 0; - move64(); - FOR( c2 = 0; c2 < n; c2++ ) - { - Tmp[start + c2] = L_mult0( shl( w[start + c2], 2 ), cbp[c2] ); - move32(); - W_acc = W_mac_32_16( W_acc, Tmp[start + c2], cbp[c2] ); - } - - tmp_n = W_norm( W_acc ); - - en = W_extract_h( W_shl( W_acc, tmp_n ) ); - en_e = sub( sub( 52, shl( Q_cb, 1 ) ), tmp_n ); - - cbp += maxn; /* pointer is incremented */ - - /* Iterate over all parent nodes */ - FOR( c = 0; c < m; c++ ) - { - pTmp = &resid_fx[0][c * N]; - pTmp_e = resid_e; - move16(); - /*tmp = (*pTmp++) * Tmp[0];*/ - W_acc = W_mult_32_32( pTmp[0], Tmp[0] ); - - FOR( i = 1; i < N; i++ ) - { - W_acc = W_mac_32_32( W_acc, pTmp[i], Tmp[i] ); - } - tmp_n = W_norm( W_acc ); - tmp = W_extract_h( W_shl( W_acc, tmp_n ) ); - tmp_e = sub( add( pTmp_e, sub( Q31 - Q10, Q_cb ) ), tmp_n ); - - - tmp_n = s_max( tmp_e, en_e ); - tmp_n = s_max( dist_e[0][c], tmp_n ); - - IF( NE_16( dist_e[0][c], MAX_16 / 2 ) ) - { - tmp_n = add( tmp_n, 2 ); - tmp = L_sub( L_shl( en, sub( en_e, tmp_n ) ), L_shl( tmp, add( sub( tmp_e, tmp_n ), 1 ) ) ); - tmp = L_add( tmp, L_shl( dist_fx[0][c], sub( dist_e[0][c], tmp_n ) ) ); - } - ELSE - { - tmp = MAX_32 - 1; - move32(); - tmp_n = MAX_16 / 2; - move32(); - } - - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tmp, tmp_n, dist_fx[1][p_max], dist_e[1][p_max] ), -1 ) ) - { - /* Replace worst */ - dist_fx[1][p_max] = tmp; - move32(); - dist_e[1][p_max] = tmp_n; - move16(); - indices[1][p_max * stages + s] = j; - move16(); - parents[p_max] = c; - move16(); - - p_max = 0; - move16(); - tmp_e = p_max; - move16(); - - tmp_n = dist_e[1][0]; - move16(); - FOR( c2 = 1; c2 < maxC; c2++ ) - { - if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( dist_fx[1][c2], dist_e[1][c2], dist_fx[1][p_max], dist_e[1][p_max] ), 1 ) ) - { - p_max = c2; - move16(); - } - test(); - if ( GT_16( dist_e[1][c2], tmp_n ) && NE_16( dist_e[1][c2], MAX_16 / 2 ) ) - { - tmp_n = dist_e[1][c2]; - move16(); - } - } - FOR( c2 = 0; c2 < maxC; c2++ ) - { - IF( NE_16( dist_e[1][c2], MAX_16 / 2 ) ) - { - dist_fx[1][c2] = L_shl( dist_fx[1][c2], sub( dist_e[1][c2], tmp_n ) ); - move32(); - dist_e[1][c2] = tmp_n; - move16(); - } - } - } /*IF (L_sub(tmp,dist[1][p_max]) < 0) */ - } /* FOR (c=0; c= max_dct_trunc ); /* check for FDCNGVQ WB , SWB, FB operation */ + + /* remove mid stage#1 vector, in original input domain */ + tmp_e = s_max( 12, u_e ); + FOR( i = 0; i < n_ana; i++ ) + { + u_mr_fx[i] = L_sub( L_shl( u_fx[i], sub( u_e, tmp_e ) ), L_shl( midQ_truncQ_fx[i], sub( Q31 - Q10, tmp_e ) ) ); // tmp_e + move32(); + } + + dctT2_N_apply_matrix_fx( (const Word32 *) u_mr_fx, dct_target_fx, s_min( max_dct_trunc, n_ana ), n_ana, invTrfMatrix_fx, max_dct_trunc, dcttype ); // exp : tmp_e + + /* init search state ptr's at the top */ + set32_fx( dist1_ptr_fx, MAX_32, maxC_st1 ); + set16_fx( dist1_ptr_e_buf, 32, maxC_st1 ); + st1_mse_pair_fx = &( dist1_ptr_fx[0] ); /* req. ptr post upd +=2 */ // st1_mse_pair_e + st1_mse_pair_e = &( dist1_ptr_e_buf[0] ); /* req. ptr post upd +=2 */ + st1_idx_pair = &( indices_st1_local[0] ); /* req. ptr post upd +=2 */ + set64_fx( mse_trunc_segm_fx, 0, n_segm ); + + // set16_fx( mse_trunc_segm_e, u_e, FDCNG_VQ_DCT_NSEGM ); + + FOR( segm = 0; segm < n_segm; segm++ ) + { /* point to a new paired location for each segment */ + p_max = 0; /* req. to point to one of 1 or 0, this init can potentially be omitted here,as p_max is always 1 or 0 */ + move16(); + + /* compute segment common trunction error in dctN domain */ + + FOR( i = 0; i < trunc_dct_cols_per_segment[segm]; i++ ) + { + mse_trunc_segm_fx[segm] = W_mac_32_32( mse_trunc_segm_fx[segm], dct_target_fx[cols_per_segment[segm] + i], dct_target_fx[cols_per_segment[segm] + i] ); // Q41 + move64(); + } + + cbpW8 = W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage , table ptr init */ + + FOR( j = 0; j < entries_per_segment[segm]; j++ ) + { + /* unweighted segmented search DCT domain loop */ + j_full = add( j, cum_entries_per_segment[segm] ); /* or simply use j_full++ */ + + mse_fx = mse_trunc_segm_fx[segm]; /* init mse with with common mse truncation part, in BASOP a move32() */ // Q41 + move64(); + + dct_col_shift_tab = col_syn_shift[segm]; /* ptr init */ + + FOR( c2 = 0; c2 < cols_per_segment[segm]; c2++ ) + { +#define WMC_TOOL_SKIP + tmp_fx = L_sub( dct_target_fx[c2], Mpy_32_32( L_shl( cbpW8[c2], add( sub( Q31, tmp_e ), dct_col_shift_tab[c2] ) ), dct_scaleF_fx[1] ) ); /* note: BASOP shift left defined for signed integers */ + LOGIC( 1 ); + SHIFT( 1 ); + ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ +#undef WMC_TOOL_SKIP + mse_fx = W_mac_32_32( mse_fx, tmp_fx, tmp_fx ); /* L_mac or L_mac0() square Word16 -> Word32*/ // Q41 + } + Word16 L_tmp = W_norm( mse_fx ); + st1_mse_ptr_fx[j_full] = W_extract_h( W_lshl( mse_fx, L_tmp ) ); /* save MSE in shared dynamic RAM, move32() in BASOP */ // st1_mse_ptr_e + move32(); + st1_mse_ptr_e[j_full] = sub( shl( tmp_e, 1 ), L_tmp ); + move16(); + +#define WMC_TOOL_SKIP + cbpW8 += cols_per_segment[segm]; /* fixed pointer increment for each segment */ +#undef WMC_TOOL_SKIP + + /* overwrite with a new worst index at p_max */ + + /* Note: The three inner loop if's below are not 100% properly instrumented by WMC tool */ + // if ( st1_mse_ptr_fx[j_full] < st1_mse_pair_fx[p_max] ) /* L_sub */ + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_ptr_fx[j_full], st1_mse_ptr_e[j_full], st1_mse_pair_fx[p_max], st1_mse_pair_e[p_max] ), -1 ) ) /* L_sub */ + { + st1_idx_pair[p_max] = j_full; /* move16, single BASOP */ + move16(); + } /* BASOP 2 ops */ + + IF( EQ_16( st1_idx_pair[p_max], j_full ) ) + { /* idx updated --> also update mse */ + st1_mse_pair_fx[p_max] = st1_mse_ptr_fx[j_full]; /* move32(), single BASOP */ + move32(); + st1_mse_pair_e[p_max] = st1_mse_ptr_e[j_full]; /* move32(), single BASOP */ + move16(); + } /* BASOP 3 ops */ + + /* avoid WC costly candidate list management by always updating p_max, + as we have only a pair in each segment to maintain */ + p_max = 0; + move16(); + if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( st1_mse_pair_fx[0], st1_mse_pair_e[0], st1_mse_pair_fx[1], st1_mse_pair_e[1] ), -1 ) ) /* L_sub()*/ + { + p_max = 1; /* move16() */ + move16(); + } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ + + /* Note: logical shift right not available in ANSI-C */ + /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ + /* in java logical shift right is available as >>> , in BASOP it is available as L_lshr */ + + /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ + } /* j in section */ + + st1_mse_pair_fx += 2; /* req. ptr init */ + st1_mse_pair_e += 2; /* req. ptr init */ + st1_idx_pair += 2; /* req. ptr init */ + + } /* next segment */ + + tmp_e = 0; + move16(); + FOR( j = 0; j < maxC_st1; j++ ) + { + /* compute_full mse using stored DCT24 domain MSE's */ + /* calculate MSE from stage1 inner using existing inner DCT domain variables */ + tmp_e = s_max( dist1_ptr_e_buf[j], tmp_e ); + } + + FOR( j = 0; j < maxC_st1; j++ ) + { + /* compute_full mse using stored DCT24 domain MSE's */ + /* calculate MSE from stage1 inner using existing inner DCT domain variables */ + dist1_ptr_fx[j] = L_shr( dist1_ptr_fx[j], sub( tmp_e, dist1_ptr_e_buf[j] ) ); + move32(); + *dist1_ptr_e = tmp_e; + move16(); + } + + + assert( ( maxC_st1 >= 3 ) ); + assert( ( maxC_st1 <= 8 ) ); + + p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish current worst candidate for MSVQ stage#2 among all maxC_st1 candidates so far */ + + p_mins[0] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find best entry among all maxC_pre */ + move16(); + tmp_fx = dist1_ptr_fx[p_mins[0]]; + move32(); + dist1_ptr_fx[p_mins[0]] = MAX_32; /* exclude 1st */ + move32(); + + p_mins[1] = minimum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* find 2nd best entry */ + move16(); + tmp2_fx = dist1_ptr_fx[p_mins[1]]; + move32(); + dist1_ptr_fx[p_mins[1]] = MAX_32; /* exclude 2nd */ + move32(); + + dist1_ptr_fx[p_mins[0]] = tmp_fx; /* restore 1st */ + move32(); + dist1_ptr_fx[p_mins[1]] = tmp2_fx; /* restore 2nd */ + move32(); + + idx_min[0] = indices_st1_local[p_mins[0]]; + move16(); + idx_min[1] = indices_st1_local[p_mins[1]]; + move16(); + + + /* use global exclusion list to never reselect the two (best) global MSE values sofar */ + st1_mse_ptr_fx[idx_min[0]] = MAX_32; /* move32() */ + move32(); + st1_mse_ptr_e[idx_min[0]] = MAX_16; + move16(); + st1_mse_ptr_fx[idx_min[1]] = MAX_32; /* move32() */ + move32(); + st1_mse_ptr_e[idx_min[1]] = MAX_16; + move16(); + + /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ + /* using both 1st and 2nd best neighbours in fwd and rev directions */ + check_ind[0] = segm_neighbour_fwd[idx_min[0]]; + move16(); + check_ind[1] = segm_neighbour_rev[idx_min[0]]; + move16(); + + check_ind[2] = segm_neighbour_fwd[idx_min[1]]; + move16(); + check_ind[3] = segm_neighbour_rev[idx_min[1]]; + move16(); + + check_ind[4] = segm_neighbour_fwd[check_ind[0]]; + move16(); + check_ind[5] = segm_neighbour_rev[check_ind[1]]; + move16(); + + check_ind[6] = segm_neighbour_fwd[check_ind[2]]; + move16(); + check_ind[FDCNG_VQ_DCT_NPOST - 1] = segm_neighbour_rev[check_ind[3]]; + move16(); + + FOR( i = 0; i < npost_check; i++ ) + { + /* move MSE from DCT-inner loop search to input synthesis domain */ + /* multiplication by fdcng_dct_scaleF[2] to get the float outer loop scale correct in IDCT synthesis domain */ + check_mse = st1_mse_ptr_fx[check_ind[i]]; + move32(); + check_mse_e = st1_mse_ptr_e[check_ind[i]]; + move16(); + + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( check_mse, check_mse_e, dist1_ptr_fx[p_max], *dist1_ptr_e ), -1 ) ) + { /* new winner , replace worst */ + dist1_ptr_fx[p_max] = L_shl( check_mse, sub( check_mse_e, *dist1_ptr_e ) ); + move32(); + indices_st1_local[p_max] = check_ind[i]; + move16(); + st1_mse_ptr_fx[check_ind[i]] = MAX_32; /* exclude, BASOP: move32() */ + move32(); + st1_mse_ptr_e[check_ind[i]] = MAX_16; + move16(); + p_max = maximum_32_fx( dist1_ptr_fx, maxC_st1, NULL ); /* establish a new current worst candidate among all maxC */ + } + } + + /* extract the selected stage one vectors in DCT_N domain , apply IDCT_N and scale up */ + /* always extract full length signal(e.g. 24) to be able to update WB(e.g. N_in==21) candidate MSE values */ + /* in the case that only a part of the IDCT N vector is in final use */ + + /* note: synthesis not yet fully parameterized/generalized for other IDCT lengths */ + assert( N == 24 ); + { + FOR( c = 0; c < maxC_st1; c++ ) + { + dec_FDCNG_MSVQ_stage1_fx( indices_st1_local[c], N, invTrfMatrix_fx, dcttype + 1, &( st1_syn_vec_ptr_fx[c * N] ), NULL ); // Q11 : output + scale_sig32( &( st1_syn_vec_ptr_fx[c * N] ), N, sub( 11, s_max( u_e, 12 ) ) ); + } + } + + return p_max; /*ptr to worst performing candidate */ +} + + +/*--------------------------------------------------------------------------* + * msvq_stage1_dct_recalc_candidates_fdcng_wb() + * + * recalc MSE for fdcng WB(0..20) coeffs , + essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, + excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages + *--------------------------------------------------------------------------*/ + +/*! r: (updated p_max) */ +Word16 msvq_stage1_dct_recalc_candidates_fdcng_wb_fx( + const Word32 *st1_syn_vec_ptr_fx, /* i : IDCT24 synthesis vectors st1_syn_vec_e*/ + const Word16 st1_syn_vec_e, /* i : exp for IDCT24 synthesis vectors */ + const Word32 *u_fx, /* i : target signal u_e*/ + const Word16 u_e, /* i : exp for target signal */ + const Word16 maxC_st1, /* i : number of candidates in stage1 */ + Word32 *dist_ptr_fx, /* i/o: updated MSE vector for stage1 */ + Word16 *dist_ptr_e /* i/o: exp for updated MSE vector for stage1 */ +) +{ + Word16 i; + Word16 p_max_local, c; + const Word32 *p2_fx; + Word16 tmp_e; + Word32 res24_fx, high_diff_fx[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; + Word64 acc; + Word16 res24_e[FD_CNG_maxC_37bits]; + Word16 dist_e; + + dist_e = *dist_ptr_e; + move16(); + FOR( c = 0; c < maxC_st1; c++ ) + { /* point to extended synthesis part */ + p2_fx = (const Word32 *) &( st1_syn_vec_ptr_fx[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init to synthesis candidate c */ + tmp_e = s_max( st1_syn_vec_e, u_e ); + tmp_e = add( tmp_e, 1 ); + /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */ + FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) + { + high_diff_fx[i] = L_sub( L_shr( p2_fx[i], sub( tmp_e, st1_syn_vec_e ) ), L_shr( u_fx[FDCNG_VQ_MAX_LEN_WB + i], sub( tmp_e, u_e ) ) ); // tmp_e + move32(); + } + acc = 0; + move64(); + FOR( i = 0; i < FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB; i++ ) + { + acc = W_mac_32_32( acc, high_diff_fx[i], high_diff_fx[i] ); + } + res24_e[c] = tmp_e; + move16(); + tmp_e = W_norm( acc ); + res24_fx = W_extract_h( W_shl( acc, tmp_e ) ); + + res24_e[c] = sub( shl( res24_e[c], 1 ), tmp_e ); + move16(); + + dist_ptr_fx[c] = BASOP_Util_Add_Mant32Exp( dist_ptr_fx[c], *dist_ptr_e, L_negate( res24_fx ), res24_e[c], &res24_e[c] ); /* remove DCT24 high band error contribution */ + move32(); + dist_e = s_max( dist_e, res24_e[c] ); + move16(); + } + + + FOR( c = 0; c < maxC_st1; c++ ) + { + dist_ptr_fx[c] = L_shl( dist_ptr_fx[c], sub( res24_e[c], dist_e ) ); + move32(); + } + *dist_ptr_e = dist_e; + move16(); + /* finally update p_max, as it may potentially change, + due to the core DCT24 search originally optimizing over the longer basis vectors than DCT21 */ + p_max_local = maximum_32_fx( dist_ptr_fx, maxC_st1, NULL ); + + return p_max_local; +} + + /*--------------------------------------------------------------------------* * depack_mul_values_fx() * *--------------------------------------------------------------------------*/ + static Word32 depack_mul_values_fx( Word16 *Tmp, const Word16 *w, const Word16 *cbp, const Word16 N ) { Word16 i, val0, val1, val2, val3; @@ -65,10 +440,13 @@ static Word32 depack_mul_values_fx( Word16 *Tmp, const Word16 *w, const Word16 * return en; } + + /*--------------------------------------------------------------------------* * depack_sub_values() * *--------------------------------------------------------------------------*/ + static void depack_sub_values_fx( Word16 *pTmp, const Word16 *p1, const Word16 *cbp, const Word16 N ) { Word16 j, val0, val1, val2, val3; @@ -88,11 +466,14 @@ static void depack_sub_values_fx( Word16 *pTmp, const Word16 *p1, const Word16 * move16(); /*3Q12*1.28*/ } } + + /*--------------------------------------------------------------------------* * msvq_enc_find_p_max_8() * * Unroll of inner search loop for maxC == 8 *--------------------------------------------------------------------------*/ + static Word16 msvq_enc_find_p_max_8_fx( Word32 dist[] ) { Word16 p_max; @@ -139,11 +520,14 @@ static Word16 msvq_enc_find_p_max_8_fx( Word32 dist[] ) BASOP_SATURATE_WARNING_ON_EVS return p_max; } + + /*--------------------------------------------------------------------------* * msvq_enc_find_p_max_6() * * Unroll of inner search loop for maxC == 6 *--------------------------------------------------------------------------*/ + static Word16 msvq_enc_find_p_max_6_fx( Word32 dist[] ) { Word16 p_max; @@ -180,11 +564,14 @@ static Word16 msvq_enc_find_p_max_6_fx( Word32 dist[] ) BASOP_SATURATE_WARNING_ON_EVS return p_max; } + + /*--------------------------------------------------------------------------* * msvq_enc_fx() * * MSVQ encoder *--------------------------------------------------------------------------*/ + void msvq_enc_fx( const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) (0Q15) */ const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -400,6 +787,449 @@ void msvq_enc_fx( return; } + +/*--------------------------------------------------------------------------* + * msvq_enc_ivas_fx() + * + * MSVQ encoder + *--------------------------------------------------------------------------*/ + +void msvq_enc_ivas_fx( + const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) Q_cb */ + const Word16 Q_cb, /* i : Codebook Q */ + const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const Word16 offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const Word32 u_fx[], /* i : Vector to be encoded (prediction and mean removed) (exp : u_e) */ + const Word16 u_e, /* i : Exponent for Vector to be encoded */ + const Word16 *levels, /* i : Number of levels in each stage */ + const Word16 maxC, /* i : Tree search size (number of candidates kept from from one stage to the next == M-best) */ + const Word16 stages, /* i : Number of stages */ + const Word16 w[], /* i : Weights Q8 */ + const Word16 N, /* i : Vector dimension */ + const Word16 maxN, /* i : Codebook dimension */ + const Word16 applyDCT_flag, /* i : applyDCT flag */ + Word32 *invTrfMatrix_fx, /* i/o: synthesis matrix Q31 */ + Word16 Idx[] /* o : Indices */ +) +{ + Word16 j; + const Word16 *cbp, *cb_stage; + Word32 resid_buf_fx[2 * LSFMBEST_MAX * M_MAX], *resid_fx[2]; + Word32 *pTmp, *p1, *p2; // pTmp_e + Word16 pTmp_e; + Word16 *indices[2], m, s, c, c2, p_max, i; + Word16 idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; + Word32 dist_buf_fx[2 * LSFMBEST_MAX], *dist_fx[2], tmp, en, ss2, Tmp[M_MAX]; + Word16 dist_buf_e[2 * LSFMBEST_MAX], *dist_e[2]; + Word16 tmp_e, tmp_n, en_e; + Word16 resid_e; + Word16 n, maxn, start; + Word64 W_acc; /*64 bit accumulator*/ + + Word32 *st1_syn_vec_ptr_fx = &( resid_buf_fx[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; + Word32 *st1_mse_ptr_fx = &( resid_buf_fx[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); + Word16 indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; + + /*----------------------------------------------------------------* + * Allocate memory for previous (parent) and current nodes. + * Parent node is indexed [0], current node is indexed [1]. + *----------------------------------------------------------------*/ + indices[0] = idx_buf; + indices[1] = idx_buf + maxC * stages; /*move16();*/ + /*vr_iset(0, idx_buf, 2*stages*maxC);*/ + set16_fx( idx_buf, 0, (Word16) ( 2 * stages * maxC ) ); + + resid_fx[0] = resid_buf_fx; + resid_fx[1] = resid_buf_fx + maxC * N; /*move16();*/ + + dist_fx[0] = dist_buf_fx; + dist_e[0] = dist_buf_e; + dist_fx[1] = dist_buf_fx + maxC; + dist_e[1] = dist_buf_e + maxC; + + /*vr_iset(0, parents, maxC);*/ + set16_fx( parents, 0, maxC ); + + /*----------------------------------------------------------------* + * LSF weights are normalized, so it is always better to multiply it first + * Set up inital distance vector + *----------------------------------------------------------------*/ + W_acc = W_mult_32_32( Mpy_32_16_1( u_fx[0], shl( w[0], 2 ) ), u_fx[0] ); // 2*Qu - 6 + 1 + FOR( j = 1; j < N; j++ ) + { + W_acc = W_mac_32_32( W_acc, Mpy_32_16_1( u_fx[j], shl( w[j], 2 ) ), u_fx[j] ); // 2*Qu - 6 + 1 + } + + tmp_n = W_norm( W_acc ); + ss2 = W_extract_h( W_shl( W_acc, tmp_n ) ); + tmp_e = sub( add( shl( u_e, 1 ), 5 ), tmp_n ); + + /* Set up inital error (residual) vectors */ + pTmp = resid_fx[1]; /*move16();*/ + resid_e = u_e; + move16(); + IF( applyDCT_flag != 0 ) + { + resid_e = s_max( u_e, 12 ); + } + FOR( c = 0; c < maxC; c++ ) + { + Copy32( u_fx, pTmp + c * N, N ); + test(); + IF( applyDCT_flag != 0 && LT_16( u_e, 12 ) ) + { + scale_sig32( pTmp + c * N, N, sub( u_e, resid_e ) ); + } + dist_fx[1][c] = ss2; + move32(); + dist_e[1][c] = tmp_e; + move16(); + } + + /* Loop over all stages */ + m = 1; + move16(); + FOR( s = 0; s < stages; s++ ) + { + /* codebook pointer is set to point to first stage */ + cbp = cb[s]; /*Q_cb*/ + cb_stage = cbp; + + /* Set up pointers to parent and current nodes */ + swap( indices[0], indices[1], Word16 * ); + move16(); + move16(); + move16(); + swap( resid_fx[0], resid_fx[1], Word32 * ); + move32(); + move32(); + move32(); + swap( dist_fx[0], dist_fx[1], Word32 * ); + swap( dist_e[0], dist_e[1], Word16 * ); + move32(); + move32(); + move32(); + move16(); + move16(); + move16(); + + /* p_max points to maximum distortion node (worst of best) */ + p_max = 0; + move16(); + + n = N; + move16(); + maxn = maxN; + move16(); + if ( dims ) + { + n = dims[s]; + move16(); + } + if ( dims ) + { + maxn = n; + move16(); + } + + assert( ( maxn % 4 ) == 0 ); + + start = 0; + move16(); + if ( offs ) + { + start = offs[s]; + move16(); + } + + set32_fx( Tmp, 0, start ); + set32_fx( Tmp + start + n, 0, sub( N, add( start, n ) ) ); + + /* Set distortions to a large value */ + FOR( j = 0; j < maxC; j++ ) + { + dist_fx[1][j] = MAX_32; + move32(); + dist_e[1][j] = MAX_16 / 2; + move16(); + } + + test(); + IF( !s && applyDCT_flag != 0 ) /* means: m==1 */ + { + /* stage 1 candidates search in truncated dct24 domain without any weights */ + assert( N == FDCNG_VQ_MAX_LEN || N == FDCNG_VQ_MAX_LEN_WB ); /* 21 and 24 allowed */ + assert( maxC == 2 * FDCNG_VQ_DCT_NSEGM ); + p_max = msvq_stage1_dct_search_fx( u_fx, u_e, FDCNG_VQ_MAX_LEN, maxC, DCT_T2_24_XX, FDCNG_VQ_DCT_MAXTRUNC, (Word32 *) invTrfMatrix_fx, cdk1r_tr_midQ_truncQ_fx, fdcng_dct_scaleF_fx, FDCNG_VQ_DCT_NSEGM, + cdk1_ivas_cols_per_segment, cdk1_ivas_trunc_dct_cols_per_segment, cdk1_ivas_entries_per_segment, cdk1_ivas_cum_entries_per_segment, cdk_37bits_ivas_stage1_W8Qx_dct_sections, + stage1_dct_col_syn_shift, cdk1_ivas_segm_neighbour_fwd, cdk1_ivas_segm_neighbour_rev, FDCNG_VQ_DCT_NPOST, st1_mse_ptr_fx, indices_st1_local, st1_syn_vec_ptr_fx, dist_fx[1], &dist_e[1][0] ); + + /* move established stage#1 indices to the global MSVQ list structure */ + set16_fx( dist_e[1], dist_e[1][0], maxC ); + FOR( c = 0; c < maxC; c++ ) + { + indices[1][c * stages] = indices_st1_local[c]; + move16(); + } + } + ELSE + { + FOR( j = 0; j < levels[s]; j++ ) + { + /* Compute weighted codebook element and its energy */ + en = 0; + move32(); + en_e = 0; + move16(); + W_acc = 0; + move64(); + FOR( c2 = 0; c2 < n; c2++ ) + { + Tmp[start + c2] = L_mult0( shl( w[start + c2], 2 ), cbp[c2] ); + move32(); + W_acc = W_mac_32_16( W_acc, Tmp[start + c2], cbp[c2] ); + } + + tmp_n = W_norm( W_acc ); + + en = W_extract_h( W_shl( W_acc, tmp_n ) ); + en_e = sub( sub( 52, shl( Q_cb, 1 ) ), tmp_n ); + + cbp += maxn; /* pointer is incremented */ + + /* Iterate over all parent nodes */ + FOR( c = 0; c < m; c++ ) + { + pTmp = &resid_fx[0][c * N]; + pTmp_e = resid_e; + move16(); + /*tmp = (*pTmp++) * Tmp[0];*/ + W_acc = W_mult_32_32( pTmp[0], Tmp[0] ); + + FOR( i = 1; i < N; i++ ) + { + W_acc = W_mac_32_32( W_acc, pTmp[i], Tmp[i] ); + } + tmp_n = W_norm( W_acc ); + tmp = W_extract_h( W_shl( W_acc, tmp_n ) ); + tmp_e = sub( add( pTmp_e, sub( Q31 - Q10, Q_cb ) ), tmp_n ); + + + tmp_n = s_max( tmp_e, en_e ); + tmp_n = s_max( dist_e[0][c], tmp_n ); + + IF( NE_16( dist_e[0][c], MAX_16 / 2 ) ) + { + tmp_n = add( tmp_n, 2 ); + tmp = L_sub( L_shl( en, sub( en_e, tmp_n ) ), L_shl( tmp, add( sub( tmp_e, tmp_n ), 1 ) ) ); + tmp = L_add( tmp, L_shl( dist_fx[0][c], sub( dist_e[0][c], tmp_n ) ) ); + } + ELSE + { + tmp = MAX_32 - 1; + move32(); + tmp_n = MAX_16 / 2; + move32(); + } + + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tmp, tmp_n, dist_fx[1][p_max], dist_e[1][p_max] ), -1 ) ) + { + /* Replace worst */ + dist_fx[1][p_max] = tmp; + move32(); + dist_e[1][p_max] = tmp_n; + move16(); + indices[1][p_max * stages + s] = j; + move16(); + parents[p_max] = c; + move16(); + + p_max = 0; + move16(); + tmp_e = p_max; + move16(); + + tmp_n = dist_e[1][0]; + move16(); + FOR( c2 = 1; c2 < maxC; c2++ ) + { + if ( EQ_16( BASOP_Util_Cmp_Mant32Exp( dist_fx[1][c2], dist_e[1][c2], dist_fx[1][p_max], dist_e[1][p_max] ), 1 ) ) + { + p_max = c2; + move16(); + } + test(); + if ( GT_16( dist_e[1][c2], tmp_n ) && NE_16( dist_e[1][c2], MAX_16 / 2 ) ) + { + tmp_n = dist_e[1][c2]; + move16(); + } + } + FOR( c2 = 0; c2 < maxC; c2++ ) + { + IF( NE_16( dist_e[1][c2], MAX_16 / 2 ) ) + { + dist_fx[1][c2] = L_shl( dist_fx[1][c2], sub( dist_e[1][c2], tmp_n ) ); + move32(); + dist_e[1][c2] = tmp_n; + move16(); + } + } + } /*IF (L_sub(tmp,dist[1][p_max]) < 0) */ + } /* FOR (c=0; c -#include "options.h" -#include "ivas_cnst.h" -#include "prot_fx.h" -#include "ivas_prot_rend_fx.h" -#include "ivas_rom_com.h" -#include "ivas_rom_com_fx.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" -/*-------------------------------------------------------------------------* - * audioCfg2channels() - * - * Map Audio configuration to number of channels - *-------------------------------------------------------------------------*/ - -/*! r: number of audio channels */ -Word16 audioCfg2channels( - AUDIO_CONFIG output_config /* i : output audio configuration */ -) -{ - Word16 nchan_out; - - SWITCH( output_config ) - { - case IVAS_AUDIO_CONFIG_MONO: - nchan_out = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_STEREO: - nchan_out = 2; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1: - nchan_out = 6; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1: - nchan_out = 8; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_2: - nchan_out = 8; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_4: - nchan_out = 10; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1_4: - nchan_out = 12; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_FOA: - nchan_out = 4; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA2: - nchan_out = 9; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA3: - nchan_out = 16; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_OBA: - nchan_out = 8; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_BINAURAL: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: - nchan_out = 2; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM1: - nchan_out = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM2: - nchan_out = 2; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM3: - nchan_out = 3; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_ISM4: - nchan_out = 4; - move16(); - BREAK; - default: - IVAS_ERROR( IVAS_ERR_INTERNAL, "Error: illegal output configuration\n" ); - nchan_out = -1; - move16(); - BREAK; - } - - return ( nchan_out ); -} - -/*-------------------------------------------------------------------------* - * ivas_output_init() - * - * Initialize and configure IVAS output parameters - *-------------------------------------------------------------------------*/ -void ivas_output_init( - IVAS_OUTPUT_SETUP *hOutSetup, /* o : IVAS output setup structure */ - const AUDIO_CONFIG output_config /* i : output audio configuration */ -) -{ - Word16 nchan_out; - - /* set general default values */ - hOutSetup->output_config = output_config; - move16(); - hOutSetup->is_loudspeaker_setup = 0; - move16(); - hOutSetup->is_binaural_setup = 0; - move16(); - hOutSetup->ambisonics_order = -1; - move16(); - hOutSetup->separateChannelEnabled = 0; - move16(); - hOutSetup->separateChannelIndex = 0; - move16(); - - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - hOutSetup->is_loudspeaker_setup = 1; - move16(); - /* set in ivas_init_decoder: */ - /* hOutSetup->ls_azimuth */ - /* hOutSetup->ls_elevation */ - /* hOutSetup->num_lfe */ - /* hOutSetup->index_lfe[0] */ - /* hOutSetup->is_planar_setup */ - } - ELSE - { - /* Set default values for all other than custom LS setup */ - hOutSetup->ls_azimuth_fx = NULL; - hOutSetup->ls_elevation_fx = NULL; - hOutSetup->num_lfe = 0; - move16(); - hOutSetup->index_lfe[0] = -1; - move16(); - hOutSetup->is_planar_setup = 0; - move16(); - - /* set output setup specific values */ - SWITCH( output_config ) - { - case IVAS_AUDIO_CONFIG_MONO: - hOutSetup->is_loudspeaker_setup = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_STEREO: - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP2_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP2_fx; // Q22 - BREAK; - case IVAS_AUDIO_CONFIG_FOA: - hOutSetup->ambisonics_order = SBA_FOA_ORDER; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA2: - hOutSetup->ambisonics_order = SBA_HOA2_ORDER; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_HOA3: - hOutSetup->ambisonics_order = SBA_HOA3_ORDER; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP6_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP6_fx; // Q22 - hOutSetup->is_planar_setup = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP12_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP12_fx; // Q22 - hOutSetup->is_planar_setup = 1; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_2: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP14_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP14_fx; // Q22 - hOutSetup->is_planar_setup = 0; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_5_1_4: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP16_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP16_fx; // Q22 - hOutSetup->is_planar_setup = 0; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_7_1_4: - hOutSetup->num_lfe = 1; - move16(); - hOutSetup->index_lfe[0] = 3; - move16(); - hOutSetup->is_loudspeaker_setup = 1; - move16(); - hOutSetup->ls_azimuth_fx = ls_azimuth_CICP19_fx; // Q22 - hOutSetup->ls_elevation_fx = ls_elevation_CICP19_fx; // Q22 - hOutSetup->is_planar_setup = 0; - move16(); - BREAK; - case IVAS_AUDIO_CONFIG_BINAURAL: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: - case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: - case IVAS_AUDIO_CONFIG_ISM1: - case IVAS_AUDIO_CONFIG_ISM2: - case IVAS_AUDIO_CONFIG_ISM3: - case IVAS_AUDIO_CONFIG_ISM4: - hOutSetup->is_binaural_setup = 1; - move16(); - case IVAS_AUDIO_CONFIG_EXTERNAL: - /* Default values are used */ - BREAK; - default: - return; - } - } - - test(); - IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && NE_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out = audioCfg2channels( output_config ); - hOutSetup->nchan_out_woLFE = sub( nchan_out, hOutSetup->num_lfe ); - move16(); - } - - return; -} - - -/*-----------------------------------------------------------------* - * ivas_get_nchan_buffers_dec() - * - * Return number of decoder audio buffers - *-----------------------------------------------------------------*/ - -/*! r: number of decoder buffers */ -Word16 ivas_get_nchan_buffers_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ - const Word32 ivas_total_brate /* i : total IVAS bitrate */ -) -{ - Word16 nchan_out_buff; - AUDIO_CONFIG output_config; - - output_config = st_ivas->hDecoderConfig->output_config; - move16(); - - nchan_out_buff = MAX_OUTPUT_CHANNELS; - move16(); - - IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) - { - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; - move16(); - } - ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) - { - nchan_out_buff = s_max( st_ivas->hDecoderConfig->nchan_out, CPE_CHANNELS ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) - { - nchan_out_buff = st_ivas->nchan_ism; - move16(); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) - { - Word16 nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; - move16(); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE - { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - nchan_out_buff = s_max( nchan_out_buff, nchan_internal ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) - { - nchan_out_buff = CPE_CHANNELS; - move16(); - - test(); - test(); - test(); - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - nchan_out_buff = shl( CPE_CHANNELS, 1 ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) - { - nchan_out_buff = add( st_ivas->nchan_ism, CPE_CHANNELS ); - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - Word16 nchan_internal; - nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); - nchan_out_buff = add( st_ivas->nchan_ism, st_ivas->nchan_transport ); - - IF( st_ivas->hMCT != NULL ) - { - nchan_out_buff = shl( shr( add( nchan_out_buff, 1 ), 1 ), 1 ); /* ensure odd number of channels in MCT */ - } - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) ) - { - nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_sba_upmixer_renderer() */ - } - ELSE - { - nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_spar_dec_upmixer_sf() which is based on 'nchan_out' */ - } - } - ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) - { - nchan_out_buff = add( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism ); /*take into account sba_ch_idx' in ivas_dec() */ - } - - test(); - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( nchan_internal, st_ivas->nchan_ism ) ); - } - nchan_out_buff = s_min( nchan_out_buff, MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); - } - ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) - { - nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; - - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); - } - ELSE - { - nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); - nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); - } - } - - - return nchan_out_buff; -} - -/*-------------------------------------------------------------------* - * ivas_output_buff_dec() - * - * Allocate/reallocate output audio buffers - *-------------------------------------------------------------------*/ -ivas_error ivas_output_buff_dec_fx( - Word32 *p_output_f[], /* i/o: output audio buffers */ - const Word16 nchan_out_buff_old, /* i : previous frame number of output channels */ - const Word16 nchan_out_buff /* i : number of output channels */ -) -{ - Word16 ch; - IF( GT_16( nchan_out_buff, nchan_out_buff_old ) ) - { - FOR( ch = nchan_out_buff_old; ch < nchan_out_buff; ch++ ) - { - /* note: these are intra-frame heap memories */ - IF( ( p_output_f[ch] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); - } - } - } - ELSE - { - FOR( ch = nchan_out_buff; ch < nchan_out_buff_old; ch++ ) - { - free( p_output_f[ch] ); - p_output_f[ch] = NULL; - } - } - return IVAS_ERR_OK; -} diff --git a/lib_rend/ivas_output_init_fx.c b/lib_rend/ivas_output_init_fx.c index 3b01f62ca..057161c7c 100644 --- a/lib_rend/ivas_output_init_fx.c +++ b/lib_rend/ivas_output_init_fx.c @@ -1,7 +1,459 @@ +/****************************************************************************************************** -#include "ivas_prot_fx.h" -#include "ivas_prot_rend_fx.h" + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include #include +#include "options.h" +#include "ivas_cnst.h" +#include "prot_fx.h" +#include "ivas_prot_rend_fx.h" +#include "ivas_rom_com.h" +#include "ivas_rom_com_fx.h" +#include "wmc_auto.h" +#include "ivas_prot_fx.h" +/*-------------------------------------------------------------------------* + * audioCfg2channels() + * + * Map Audio configuration to number of channels + *-------------------------------------------------------------------------*/ + +/*! r: number of audio channels */ +Word16 audioCfg2channels( + AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + Word16 nchan_out; + + SWITCH( output_config ) + { + case IVAS_AUDIO_CONFIG_MONO: + nchan_out = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_STEREO: + nchan_out = 2; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1: + nchan_out = 6; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1: + nchan_out = 8; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_2: + nchan_out = 8; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_4: + nchan_out = 10; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1_4: + nchan_out = 12; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_FOA: + nchan_out = 4; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA2: + nchan_out = 9; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA3: + nchan_out = 16; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_OBA: + nchan_out = 8; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + nchan_out = 2; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM1: + nchan_out = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM2: + nchan_out = 2; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM3: + nchan_out = 3; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_ISM4: + nchan_out = 4; + move16(); + BREAK; + default: + IVAS_ERROR( IVAS_ERR_INTERNAL, "Error: illegal output configuration\n" ); + nchan_out = -1; + move16(); + BREAK; + } + + return ( nchan_out ); +} + +/*-------------------------------------------------------------------------* + * ivas_output_init() + * + * Initialize and configure IVAS output parameters + *-------------------------------------------------------------------------*/ +void ivas_output_init( + IVAS_OUTPUT_SETUP *hOutSetup, /* o : IVAS output setup structure */ + const AUDIO_CONFIG output_config /* i : output audio configuration */ +) +{ + Word16 nchan_out; + + /* set general default values */ + hOutSetup->output_config = output_config; + move16(); + hOutSetup->is_loudspeaker_setup = 0; + move16(); + hOutSetup->is_binaural_setup = 0; + move16(); + hOutSetup->ambisonics_order = -1; + move16(); + hOutSetup->separateChannelEnabled = 0; + move16(); + hOutSetup->separateChannelIndex = 0; + move16(); + + IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + hOutSetup->is_loudspeaker_setup = 1; + move16(); + /* set in ivas_init_decoder: */ + /* hOutSetup->ls_azimuth */ + /* hOutSetup->ls_elevation */ + /* hOutSetup->num_lfe */ + /* hOutSetup->index_lfe[0] */ + /* hOutSetup->is_planar_setup */ + } + ELSE + { + /* Set default values for all other than custom LS setup */ + hOutSetup->ls_azimuth_fx = NULL; + hOutSetup->ls_elevation_fx = NULL; + hOutSetup->num_lfe = 0; + move16(); + hOutSetup->index_lfe[0] = -1; + move16(); + hOutSetup->is_planar_setup = 0; + move16(); + + /* set output setup specific values */ + SWITCH( output_config ) + { + case IVAS_AUDIO_CONFIG_MONO: + hOutSetup->is_loudspeaker_setup = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_STEREO: + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP2_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP2_fx; // Q22 + BREAK; + case IVAS_AUDIO_CONFIG_FOA: + hOutSetup->ambisonics_order = SBA_FOA_ORDER; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA2: + hOutSetup->ambisonics_order = SBA_HOA2_ORDER; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_HOA3: + hOutSetup->ambisonics_order = SBA_HOA3_ORDER; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP6_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP6_fx; // Q22 + hOutSetup->is_planar_setup = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP12_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP12_fx; // Q22 + hOutSetup->is_planar_setup = 1; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_2: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP14_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP14_fx; // Q22 + hOutSetup->is_planar_setup = 0; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_5_1_4: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP16_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP16_fx; // Q22 + hOutSetup->is_planar_setup = 0; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_7_1_4: + hOutSetup->num_lfe = 1; + move16(); + hOutSetup->index_lfe[0] = 3; + move16(); + hOutSetup->is_loudspeaker_setup = 1; + move16(); + hOutSetup->ls_azimuth_fx = ls_azimuth_CICP19_fx; // Q22 + hOutSetup->ls_elevation_fx = ls_elevation_CICP19_fx; // Q22 + hOutSetup->is_planar_setup = 0; + move16(); + BREAK; + case IVAS_AUDIO_CONFIG_BINAURAL: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + case IVAS_AUDIO_CONFIG_ISM1: + case IVAS_AUDIO_CONFIG_ISM2: + case IVAS_AUDIO_CONFIG_ISM3: + case IVAS_AUDIO_CONFIG_ISM4: + hOutSetup->is_binaural_setup = 1; + move16(); + case IVAS_AUDIO_CONFIG_EXTERNAL: + /* Default values are used */ + BREAK; + default: + return; + } + } + + test(); + IF( NE_16( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && NE_16( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out = audioCfg2channels( output_config ); + hOutSetup->nchan_out_woLFE = sub( nchan_out, hOutSetup->num_lfe ); + move16(); + } + + return; +} + + +/*-----------------------------------------------------------------* + * ivas_get_nchan_buffers_dec() + * + * Return number of decoder audio buffers + *-----------------------------------------------------------------*/ + +/*! r: number of decoder buffers */ +Word16 ivas_get_nchan_buffers_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 sba_analysis_order, /* i : SBA order evaluated in SBA decoder */ + const Word32 ivas_total_brate /* i : total IVAS bitrate */ +) +{ + Word16 nchan_out_buff; + AUDIO_CONFIG output_config; + + output_config = st_ivas->hDecoderConfig->output_config; + move16(); + + nchan_out_buff = MAX_OUTPUT_CHANNELS; + move16(); + + IF( EQ_32( st_ivas->ivas_format, MONO_FORMAT ) ) + { + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + move16(); + } + ELSE IF( EQ_32( st_ivas->ivas_format, STEREO_FORMAT ) ) + { + nchan_out_buff = s_max( st_ivas->hDecoderConfig->nchan_out, CPE_CHANNELS ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) + { + nchan_out_buff = st_ivas->nchan_ism; + move16(); + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + } + ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) + { + Word16 nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + move16(); + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + } + ELSE + { + nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + nchan_out_buff = s_max( nchan_out_buff, nchan_internal ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) + { + nchan_out_buff = CPE_CHANNELS; + move16(); + + test(); + test(); + test(); + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + } + ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + nchan_out_buff = shl( CPE_CHANNELS, 1 ); + } + ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) + { + nchan_out_buff = add( st_ivas->nchan_ism, CPE_CHANNELS ); + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + } + ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) + { + Word16 nchan_internal; + nchan_internal = ivas_sba_get_nchan_metadata_fx( sba_analysis_order, ivas_total_brate ); + nchan_out_buff = add( st_ivas->nchan_ism, st_ivas->nchan_transport ); + + IF( st_ivas->hMCT != NULL ) + { + nchan_out_buff = shl( shr( add( nchan_out_buff, 1 ), 1 ), 1 ); /* ensure odd number of channels in MCT */ + } + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + } + ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + + test(); + IF( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) ) + { + nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_sba_upmixer_renderer() */ + } + ELSE + { + nchan_out_buff = s_max( add( nchan_out_buff, st_ivas->nchan_ism ), audioCfg2channels( output_config ) ); /* needed for ivas_spar_dec_upmixer_sf() which is based on 'nchan_out' */ + } + } + ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + nchan_out_buff = add( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_ism ); /*take into account sba_ch_idx' in ivas_dec() */ + } + + test(); + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( nchan_internal, st_ivas->nchan_ism ) ); + } + nchan_out_buff = s_min( nchan_out_buff, MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); + } + ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) + { + nchan_out_buff = st_ivas->hDecoderConfig->nchan_out; + + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); + } + ELSE + { + nchan_out_buff = s_max( audioCfg2channels( st_ivas->transport_config ), audioCfg2channels( st_ivas->intern_config ) ); + nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( output_config ) ); + } + } + + + return nchan_out_buff; +} Word16 ivas_get_nchan_buffers_dec_ivas_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -159,6 +611,42 @@ Word16 ivas_get_nchan_buffers_dec_ivas_fx( return nchan_out_buff; } + +/*-------------------------------------------------------------------* + * ivas_output_buff_dec() + * + * Allocate/reallocate output audio buffers + *-------------------------------------------------------------------*/ +ivas_error ivas_output_buff_dec_fx( + Word32 *p_output_f[], /* i/o: output audio buffers */ + const Word16 nchan_out_buff_old, /* i : previous frame number of output channels */ + const Word16 nchan_out_buff /* i : number of output channels */ +) +{ + Word16 ch; + IF( GT_16( nchan_out_buff, nchan_out_buff_old ) ) + { + FOR( ch = nchan_out_buff_old; ch < nchan_out_buff; ch++ ) + { + /* note: these are intra-frame heap memories */ + IF( ( p_output_f[ch] = (Word32 *) malloc( ( 48000 / FRAMES_PER_SEC ) * sizeof( Word32 ) ) ) == NULL ) /* note: 32000 == max internal sampling rate */ + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point output audio buffer!\n" ) ); + } + } + } + ELSE + { + FOR( ch = nchan_out_buff; ch < nchan_out_buff_old; ch++ ) + { + free( p_output_f[ch] ); + p_output_f[ch] = NULL; + } + } + return IVAS_ERR_OK; +} + + /*---------------------------------------------------------------------* * get_channel_config() * diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend_fx.c similarity index 100% rename from lib_rend/lib_rend.c rename to lib_rend/lib_rend_fx.c -- GitLab From 4ff9c1fb44db5179b04df33e5fb1d880318ac8ad Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 May 2025 15:30:43 +0200 Subject: [PATCH 0640/1310] port float MR 1361 --- lib_com/ivas_cnst.h | 3 + lib_com/options.h | 2 + lib_dec/ivas_ism_renderer_fx.c | 2 + lib_dec/ivas_jbm_dec_fx.c | 27 +++++++++ lib_dec/ivas_omasa_dec_fx.c | 55 ++++++++++++++----- .../ivas_dirac_dec_binaural_functions_fx.c | 5 ++ 6 files changed, 81 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 97602e73d..cb52138f6 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1318,6 +1318,9 @@ enum #define MASA_BIT_REDUCT_PARAM 10 #define MASA_MAXIMUM_TWO_DIR_BANDS 24 #define NBITS_HR_COH 4 +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS +#define OMASA_TDREND_MATCHING_GAIN_FX 26026 +#endif #define MASA_INV_ANGLE_AT_EQUATOR_DEG_Q30 (1453366656l) diff --git a/lib_com/options.h b/lib_com/options.h index 2a87c540b..97065fb0e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -118,6 +118,8 @@ #define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ +#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ + /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 1a3fc4164..4d1678cb9 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -611,6 +611,7 @@ void ivas_omasa_separate_object_render_jbm_fx( FOR( obj = 0; obj < num_objects; obj++ ) { /* Delay the signal to match CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS IF( slots_rendered == 0 ) { Word16 tcBufferSize; @@ -620,6 +621,7 @@ void ivas_omasa_separate_object_render_jbm_fx( } offsetSamples = 0; move16(); +#endif FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 9038dfb4b..15fa2489f 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1728,6 +1728,33 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( { ivas_ism_dec_digest_tc_fx( st_ivas ); } + +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) + { + int16_t num_objects; + + /* Delay the signal to match CLDFB delay. Delay the whole buffer. */ + num_objects = 0; + IF ( ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC ) + { + num_objects = 1; + } + ELSE IF ( EQ_16(st_ivas->ism_mode, ISM_MASA_MODE_DISC) ) + { + num_objects = st_ivas->nchan_ism; + } + FOR ( n = 0; n < num_objects; n++ ) + { + if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) + { + v_multc_fixed_16( st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], OMASA_TDREND_MATCHING_GAIN_FX, st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available ); + } + delay_signal32_fx( st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size ); + } + } +#endif + } ELSE IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) { diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index 2e7d5e47b..a220cd661 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -45,7 +45,9 @@ * Local constants *------------------------------------------------------------------------*/ +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS #define OMASA_TDREND_MATCHING_GAIN_FX 26026 +#endif /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -700,18 +702,39 @@ void ivas_omasa_dirac_rend_jbm_fx( Word16 n; Word32 data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) - { - Copy32( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); - } - ELSE - { - FOR( n = 0; n < st_ivas->nchan_ism; n++ ) - { - Copy32( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); - } - } +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + test(); + if (!st_ivas->hDecoderConfig->Opt_tsm) + { + *nSamplesRendered = min(nSamplesAsked, st_ivas->hTcBuffer->n_samples_available); +#endif + + + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + Copy32(&output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered); +#else + Copy32( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); +#endif + } + ELSE + { + FOR( n = 0; n < st_ivas->nchan_ism; n++ ) + { +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + Copy32(&output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered); +#else + Copy32( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); +#endif + } + } + +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + } +#endif + subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; move16(); @@ -751,10 +774,14 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( ) { Word16 n; +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS Word16 gain_fx = OMASA_TDREND_MATCHING_GAIN_FX; // Q15 +#endif move16(); ivas_error error; +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; +#endif Word32 *p_sepobj_fx[MAX_NUM_OBJECTS]; // Q11 Word32 data_separated_objects_fx[MAX_NUM_OBJECTS][L_FRAME48k]; move16(); @@ -771,7 +798,8 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( } /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ - IF( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) +#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + IF( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) { Word16 tcBufferSize; @@ -785,6 +813,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( delay_signal32_fx( tc_local_fx[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size ); } } +#endif ivas_dirac_dec_binaural_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_fx ); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 408f1cb1b..4ad3c5288 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3262,7 +3262,12 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_tmp_sq = sub( 31, exp ); IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { +#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS + Word32 ginfactor_fx = L_shl( (Word32) OMASA_TDREND_MATCHING_GAIN_FX, Q16 ); // constant in Q31 as Word32 + gainFactor_fx = Mpy_32_32(ginfactor_fx , tmp1); // 1705746262 = 0.7943f in Q31 +#else gainFactor_fx = Mpy_32_32( 1705746262, tmp1 ); // 1705746262 = 0.7943f in Q31 +#endif } ELSE { -- GitLab From d9488106a5e0471a5e19ff9c65c56f6209c517cc Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 May 2025 15:57:56 +0200 Subject: [PATCH 0641/1310] fix formatting --- lib_dec/ivas_jbm_dec_fx.c | 7 ++-- lib_dec/ivas_omasa_dec_fx.c | 40 +++++++++---------- .../ivas_dirac_dec_binaural_functions_fx.c | 4 +- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 15fa2489f..c85e36d8e 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1736,15 +1736,15 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( /* Delay the signal to match CLDFB delay. Delay the whole buffer. */ num_objects = 0; - IF ( ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC ) + IF( ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC ) { num_objects = 1; } - ELSE IF ( EQ_16(st_ivas->ism_mode, ISM_MASA_MODE_DISC) ) + ELSE IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { num_objects = st_ivas->nchan_ism; } - FOR ( n = 0; n < num_objects; n++ ) + FOR( n = 0; n < num_objects; n++ ) { if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC && st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC ) { @@ -1754,7 +1754,6 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( } } #endif - } ELSE IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) { diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index a220cd661..4bfc6e13e 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -703,36 +703,36 @@ void ivas_omasa_dirac_rend_jbm_fx( Word32 data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - test(); - if (!st_ivas->hDecoderConfig->Opt_tsm) - { - *nSamplesRendered = min(nSamplesAsked, st_ivas->hTcBuffer->n_samples_available); + test(); + if ( !st_ivas->hDecoderConfig->Opt_tsm ) + { + *nSamplesRendered = min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); #endif - test(); - IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) - { + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - Copy32(&output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered); + Copy32( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered ); #else - Copy32( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); + Copy32( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); #endif - } - ELSE - { - FOR( n = 0; n < st_ivas->nchan_ism; n++ ) - { + } + ELSE + { + FOR( n = 0; n < st_ivas->nchan_ism; n++ ) + { #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - Copy32(&output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered); + Copy32( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); #else - Copy32( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); + Copy32( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); #endif - } - } + } + } #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - } + } #endif @@ -799,7 +799,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ #ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - IF( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) + IF( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) { Word16 tcBufferSize; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 4ad3c5288..3f24bfd85 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3263,8 +3263,8 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { #ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - Word32 ginfactor_fx = L_shl( (Word32) OMASA_TDREND_MATCHING_GAIN_FX, Q16 ); // constant in Q31 as Word32 - gainFactor_fx = Mpy_32_32(ginfactor_fx , tmp1); // 1705746262 = 0.7943f in Q31 + Word32 gainfactor_fx = L_shl( (Word32) OMASA_TDREND_MATCHING_GAIN_FX, Q16 ); // constant in Q31 as Word32 + gainFactor_fx = Mpy_32_32( gainfactor_fx, tmp1 ); // 1705746262 = 0.7943f in Q31 #else gainFactor_fx = Mpy_32_32( 1705746262, tmp1 ); // 1705746262 = 0.7943f in Q31 #endif -- GitLab From 4abbef72c79621c414e1e771aaa0304079bfb43d Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 19 May 2025 16:42:04 +0200 Subject: [PATCH 0642/1310] fix ifndef in ivas_ism_renderer_fx.c --- lib_dec/ivas_ism_renderer_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 4d1678cb9..c3904d136 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -619,9 +619,9 @@ void ivas_omasa_separate_object_render_jbm_fx( tcBufferSize = i_mult( hSpatParamRendCom->num_slots, hSpatParamRendCom->slot_size ); delay_signal32_fx( input_fx[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[obj], st_ivas->hMasaIsmData->delayBuffer_size ); } +#endif offsetSamples = 0; move16(); -#endif FOR( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { -- GitLab From 4614fa4003dc911c5eb596f994bc5df7f29ccb1a Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 14 Apr 2025 15:47:57 +0200 Subject: [PATCH 0643/1310] tentatively delete IND_SHB_RES_GS5 from the index list --- lib_com/cnst.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index ae84dbd2c..7b204a8e2 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -537,7 +537,6 @@ enum IND_SHB_RES_GS2, IND_SHB_RES_GS3, IND_SHB_RES_GS4, - IND_SHB_RES_GS5, IND_SHB_VF, #else IND_SHB_VF = IND_SHB_RES_GS + 5, -- GitLab From 1606acd85f7093197ad262ecf7c7eff0b12c560b Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 16 Apr 2025 16:19:37 +0200 Subject: [PATCH 0644/1310] port bitstream debugging functionality from bitstream_debugging_float --- apps/encoder.c | 6 +- lib_com/bitstream.c | 2022 +++++++++++++++++++++- lib_com/options.h | 4 + lib_com/prot_fx.h | 28 +- lib_enc/ivas_corecoder_enc_reconfig_fx.c | 13 + lib_enc/ivas_init_enc_fx.c | 10 + lib_enc/ivas_qmetadata_enc_fx.c | 15 + lib_enc/ivas_spar_md_enc_fx.c | 6 +- lib_enc/lib_enc.c | 18 +- lib_enc/lib_enc.h | 8 + lib_enc/prot_fx_enc.h | 4 + lib_enc/stat_enc.h | 3 + 12 files changed, 2124 insertions(+), 13 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index af9554589..1dc6c56ed 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -758,7 +758,11 @@ int main( } /* *** Encode one frame *** */ - if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits +#ifdef BITSTREAM_ANALYSIS + , frame +#endif + ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); goto cleanup; diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 385000139..08bf87ee2 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -48,7 +48,9 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" - +#ifdef BITSTREAM_ANALYSIS +#include +#endif #define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ @@ -199,6 +201,9 @@ ivas_error ind_list_realloc( { new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].value = old_ind_list[i].value; +#ifdef BITSTREAM_ANALYSIS + strncpy(new_ind_list[i].function_name, old_ind_list[i].function_name, 100); +#endif move16(); move16(); } @@ -210,6 +215,9 @@ ivas_error ind_list_realloc( FOR( ; i < max_num_indices; i++ ) { new_ind_list[i].nb_bits = -1; +#ifdef BITSTREAM_ANALYSIS + sprintf(new_ind_list[i].function_name, "RESET in ind_list_realloc"); +#endif move16(); } @@ -800,6 +808,9 @@ void move_indices( new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; +#ifdef BITSTREAM_ANALYSIS + strncpy(new_ind_list[i].function_name, old_ind_list[i].function_name, 100); +#endif old_ind_list[i].nb_bits = -1; } } @@ -810,8 +821,14 @@ void move_indices( new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; +#ifdef BITSTREAM_ANALYSIS + strncpy(new_ind_list[i].function_name, old_ind_list[i].function_name, 100); +#endif old_ind_list[i].nb_bits = -1; +#ifdef BITSTREAM_ANALYSIS + sprintf(old_ind_list[i].function_name, "RESET in move_indices"); +#endif } } @@ -880,6 +897,1882 @@ ivas_error check_ind_list_limits( return error; } +#ifdef BITSTREAM_ANALYSIS +const char *named_indices_table[] = +{ +"IND_IVAS_FORMAT", +"IND_SMODE_OMASA", +"IND_SMODE", +"IND_SID_TYPE", +"IND_BWIDTH", +"IND_CORE", +"IND_PPP_NELP_MODE", +"IND_ACELP_16KHZ", +"IND_ACELP_SIGNALLING", +"IND_SHARP_FLAG", +"IND_MDCT_CORE", +"IND_TCX_CORE", +"IND_BWE_FLAG", +"IND_HQ_SWITCHING_FLG", +"IND_LAST_L_FRAME", +"IND_VAD_FLAG", +"IND_HQ_BWIDTH", +"IND_TC_SUBFR", +"IND_TC_SUBFR", +"IND_TC_SUBFR", +"IND_TC_SUBFR", +"IND_GSC_IVAS_SP", +"IND_LSF_PREDICTOR_SELECT_BIT", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_LSF", +"IND_MID_FRAME_LSF_INDEX", +"IND_ISF_0_0", +"IND_ISF_0_1", +"IND_ISF_0_2", +"IND_ISF_0_3", +"IND_ISF_0_4", +"IND_ISF_1_0", +"IND_ISF_1_1", +"IND_ISF_1_2", +"IND_ISF_1_3", +"IND_ISF_1_4", +"IND_IC_LSF_PRED", +"IND_GSC_ATTACK", +"IND_GSC_SWB_SPEECH", +"IND_NOISE_LEVEL", +"IND_HF_NOISE", +"IND_PIT_CONTR_IDX", +"IND_FEC_CLAS", +"IND_FEC_ENR", +"IND_FEC_POS", +"IND_ES_PRED", +"IND_HARM_FLAG_ACELP", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"IND_ALG_CDBK_4T64_2_24KBIT", +"TAG_ALG_CDBK_4T64_24KBIT_END", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"IND_HF_GAIN_MODIFICATION", +"TAG_ACELP_SUBFR_LOOP_END", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_MEAN_GAIN2", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_TMP", +"IND_Y_GAIN_HF", +"IND_HQ_VOICING_FLAG", +"IND_HQ_SWB_CLAS", +"IND_NF_IDX", +"IND_LC_MODE", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_YNRM", +"IND_SWB_FENV_HQ", +"IND_SWB_FENV_HQ", +"IND_SWB_FENV_HQ", +"IND_SWB_FENV_HQ", +"IND_SWB_FENV_HQ", +"IND_FB_FENV_HQ", +"IND_FB_FENV_HQ", +"IND_FB_FENV_HQ", +"IND_FB_FENV_HQ", +"IND_FB_FENV_HQ", +"IND_DELTA_ENV_HQ", +"IND_HVQ_BWE_NL", +"IND_HVQ_BWE_NL", +"IND_NUM_PEAKS", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_POS_IDX", +"IND_FLAGN", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_PG_IDX", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_PEAKS", +"IND_HVQ_NF_GAIN", +"IND_HVQ_NF_GAIN", +"IND_HQ2_SWB_CLAS", +"IND_HQ2_DENG_MODE", +"IND_HQ2_DENG_8SMODE", +"IND_HQ2_DENG_8SMODE_N0", +"IND_HQ2_DENG_8SMODE_N1", +"IND_HQ2_DENG_8SPOS", +"IND_HQ2_DENG_8SDEPTH", +"IND_HQ2_DENG_HMODE", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_DIFF_ENERGY", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_P2A_FLAGS", +"IND_HQ2_LAST_BA_MAX_BAND", +"IND_HQ2_LAST_BA_MAX_BAND", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_START", +"IND_RC_END", +"IND_HVQ_PVQ_GAIN", +"IND_HVQ_PVQ_GAIN", +"IND_HVQ_PVQ_GAIN", +"IND_HVQ_PVQ_GAIN", +"IND_HVQ_PVQ_GAIN", +"IND_HVQ_PVQ_GAIN", +"IND_HVQ_PVQ_GAIN", +"IND_HVQ_PVQ_GAIN", +"IND_NOISINESS", +"IND_ENERGY", +"IND_CNG_HO", +"IND_SID_BW", +"IND_CNG_ENV1", +"IND_WB_FENV", +"IND_WB_CLASS", +"IND_IG1", +"IND_IG2A", +"IND_IG2B", +"IND_NELP_FID", +"IND_DELTALAG", +"IND_POWER", +"IND_AMP0", +"IND_AMP1", +"IND_GLOBAL_ALIGNMENT", +"IND_PVQ_FINE_GAIN", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_UV_FLAG", +"IND_SHB_SUBGAIN", +"IND_SHB_FRAMEGAIN", +"IND_STEREO_ICBWE_MSFLAG", +"IND_SHB_ENER_SF", +"IND_SHB_RES_GS", +"IND_SHB_RES_GS", +"IND_SHB_RES_GS", +"IND_SHB_RES_GS", +"IND_SHB_RES_GS", +"IND_SHB_VF", +"IND_SHB_LSF", +"IND_SHB_LSF", +"IND_SHB_LSF", +"IND_SHB_LSF", +"IND_SHB_LSF", +"IND_SHB_MIRROR", +"IND_SHB_GRID", +"IND_SWB_CLASS", +"IND_SWB_TENV", +"IND_SWB_TENV", +"IND_SWB_TENV", +"IND_SWB_TENV", +"IND_SWB_FENV", +"IND_SWB_FENV", +"IND_SWB_FENV", +"IND_SWB_FENV", +"IND_SHB_CNG_GAIN", +"IND_DITHERING", +"IND_FB_SLOPE", +"IND_HQ2_SPT_SHORTEN", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_TCQ", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_SUBBAND_GAIN", +"IND_HQ2_DUMMY", +"IND_LAGINDICES", +"IND_NOISEG", +"IND_AUDIO_GAIN", +"IND_AUDIO_DELAY", +"IND_AUDIO_DELAY", +"IND_AUDIO_DELAY", +"IND_AUDIO_DELAY", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"IND_NQ2", +"TAG_HR_BWE_LOOP_END", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_CELP_SUBFRAME", +"IND_CORE_SWITCHING_AUDIO_DELAY", +"IND_CORE_SWITCHING_AUDIO_GAIN", +"IND_STEREO_ICBWE_REF", +"IND_STEREO_ICBWE_SP", +"IND_STEREO_ICBWE_GS", +"IND_STEREO_REFCHAN", +"IND_STEREO_CORRSTATS", +"IND_STEREO_GD", +"IND_STEREO_LRTD_FLAG", +"IND_STEREO_LPC_REUSE", +"IND_STEREO_TD_ALPHA", +"IND_STEREO_2ND_CODER_T", +"IND_UNUSED" +}; +#endif + /*-------------------------------------------------------------------* * push_indice() @@ -925,6 +2818,9 @@ ivas_error push_indice( hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; +#ifdef BITSTREAM_ANALYSIS + strncpy(hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100); +#endif move16(); move16(); move16(); @@ -936,6 +2832,9 @@ ivas_error push_indice( hBstr->ind_list[i].id = id; hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; +#ifdef BITSTREAM_ANALYSIS + strncpy(hBstr->ind_list[i].function_name, named_indices_table[id], 100); +#endif move16(); move16(); move16(); @@ -954,7 +2853,10 @@ ivas_error push_indice( * * Push a new indice into the buffer at the next position *-------------------------------------------------------------------*/ -ivas_error push_next_indice( +ivas_error push_next_indice_( +#ifdef BITSTREAM_ANALYSIS + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ UWord16 value, /* i : value of the quantized indice */ Word16 nb_bits /* i : number of bits used to quantize the indice */ @@ -992,6 +2894,10 @@ ivas_error push_next_indice( move16(); move16(); +#ifdef BITSTREAM_ANALYSIS + strncpy(hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100); +#endif + /* updates */ hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); @@ -1005,7 +2911,10 @@ ivas_error push_next_indice( * push_next_bits() * Push a bit buffer into the buffer at the next position *-------------------------------------------------------------------*/ -ivas_error push_next_bits( +ivas_error push_next_bits_( +#ifdef BITSTREAM_ANALYSIS + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ const Word16 nb_bits /* i : number of bits to pack */ @@ -1049,6 +2958,9 @@ ivas_error push_next_bits( ptr->value = code; ptr->nb_bits = 16; ptr->id = prev_id; +#ifdef BITSTREAM_ANALYSIS + strncpy(ptr->function_name, caller, 100); +#endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); move16(); move16(); @@ -1070,6 +2982,9 @@ ivas_error push_next_bits( ptr->value = bits[i]; ptr->nb_bits = 1; ptr->id = prev_id; +#ifdef BITSTREAM_ANALYSIS + strncpy(ptr->function_name, caller, 100); +#endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); move16(); move16(); @@ -1144,6 +3059,9 @@ UWord16 delete_indice( hBstr->ind_list[j].id = hBstr->ind_list[i].id; hBstr->ind_list[j].value = hBstr->ind_list[i].value; hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; +#ifdef BITSTREAM_ANALYSIS + strncpy(hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100); +#endif } j++; @@ -1155,6 +3073,9 @@ UWord16 delete_indice( { /* reset the shifted indices at the end of the list */ hBstr->ind_list[j].nb_bits = -1; +#ifdef BITSTREAM_ANALYSIS + sprintf(hBstr->ind_list[j].function_name, "RESET in delete_indice"); +#endif } return i - j; @@ -1391,6 +3312,10 @@ static ivas_error write_indices_element_fx( UWord16 **pt_stream, /* i : pointer to bitstream buffer */ const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ const Word16 element_id /* i : id of the SCE or CPE */ +#ifdef BITSTREAM_ANALYSIS + , + int32_t frame +#endif ) { Word16 ch; @@ -1497,6 +3422,79 @@ static ivas_error write_indices_element_fx( } } +#ifdef BITSTREAM_ANALYSIS + if (is_SCE) /* EVS and SCE */ + { + static FILE *f1 = 0; + + if (f1 == 0) + f1 = fopen("bitstream_text", "w"); + + for (int16_t i = 0; i < sts[0]->hBstr->nb_ind_tot; i++) + { + Indice *ind_list = sts[0]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf(f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value); + + } + + if (st_ivas->hSCE[element_id]->hMetaData != NULL) + { + for (int16_t i = 0; i < st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; i++) + { + Indice *ind_list = st_ivas->hSCE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf(f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value); + + } + } + + } + else + { + static FILE *f1 = 0; + + if (f1 == 0) + f1 = fopen("bitstream_text", "w"); + + + for (n = 0; n < n_channels; n++) + { + for (int16_t i = 0; i < sts[n]->hBstr->nb_ind_tot; i++) + { + Indice *ind_list = sts[n]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf(f1, "%d %d %d %d %s %d %d\n", frame, element_id, n, i, function_name, nb_bits, value); + + } + + } + + if (st_ivas->hCPE[element_id]->hMetaData != NULL) + { + for (int16_t i = 0; i < st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; i++) + { + Indice *ind_list = st_ivas->hCPE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; + + fprintf(f1, "%d %d %d %d %s %d %d\n", frame, element_id, -1, i, function_name, nb_bits, value); + + } + } + } +#endif + /*----------------------------------------------------------------* * Clearing of indices * Reset index pointers @@ -1540,6 +3538,10 @@ ivas_error write_indices_ivas_fx( Encoder_Struct *st_ivas, /* i/o: encoder state structure */ UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ +#ifdef BITSTREAM_ANALYSIS + , + int32_t frame +#endif ) { Word16 i, n; @@ -1563,12 +3565,22 @@ ivas_error write_indices_ivas_fx( FOR( n = 0; n < st_ivas->nSCE; n++ ) { - write_indices_element_fx( st_ivas, &pt_stream, 1, n ); + write_indices_element_fx( st_ivas, &pt_stream, 1, n +#ifdef BITSTREAM_ANALYSIS + , + frame +#endif + ); } FOR( n = 0; n < st_ivas->nCPE; n++ ) { - write_indices_element_fx( st_ivas, &pt_stream, 0, n ); + write_indices_element_fx( st_ivas, &pt_stream, 0, n +#ifdef BITSTREAM_ANALYSIS + , + frame +#endif + ); } *num_bits = (UWord16) ( pt_stream - bit_stream ); diff --git a/lib_com/options.h b/lib_com/options.h index 75323cf13..d55309bc9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -98,4 +98,8 @@ #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ #define TEST_HR +#define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ + +/*#define BITSTREAM_ANALYSIS*/ + #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 498be3137..f1fbf8fc0 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10661,13 +10661,27 @@ ivas_error config_acelp1_fx( const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ); -ivas_error push_next_indice( +#ifdef BITSTREAM_ANALYSIS +#define push_next_indice( ... ) push_next_indice_( __func__, __VA_ARGS__ ) +#define push_next_bits( ... ) push_next_bits_( __func__, __VA_ARGS__ ); +#else +#define push_next_indice( ... ) push_next_indice_( __VA_ARGS__ ) +#define push_next_bits( ... ) push_next_bits_( __VA_ARGS__ ); +#endif + +ivas_error push_next_indice_( +#ifdef BITSTREAM_ANALYSIS + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, UWord16 value, /* i : value of the quantized indice */ Word16 nb_bits /* i : number of bits used to quantize the indice */ ); -ivas_error push_next_bits( +ivas_error push_next_bits_( +#ifdef BITSTREAM_ANALYSIS + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ const Word16 nb_bits /* i : number of bits to pack */ @@ -10989,13 +11003,19 @@ ivas_error push_indice( Word16 nb_bits /* i : number of bits used to quantize the indice */ ); -ivas_error push_next_indice( +ivas_error push_next_indice_( +#ifdef BITSTREAM_ANALYSIS + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, UWord16 value, /* i : value of the quantized indice */ Word16 nb_bits /* i : number of bits used to quantize the indice */ ); -ivas_error push_next_bits( +ivas_error push_next_bits_( +#ifdef BITSTREAM_ANALYSIS + const char *caller, +#endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ const Word16 nb_bits /* i : number of bits to pack */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig_fx.c b/lib_enc/ivas_corecoder_enc_reconfig_fx.c index a8698bacc..7e7db6e0e 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig_fx.c +++ b/lib_enc/ivas_corecoder_enc_reconfig_fx.c @@ -38,6 +38,10 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "math.h" +#include "wmc_auto.h" +#ifdef BITSTREAM_ANALYSIS +#include +#endif /*-------------------------------------------------------------------* * ivas_corecoder_enc_reconfig() * @@ -192,6 +196,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; /* Q0 */ move16(); +#ifdef BITSTREAM_ANALYSIS + strncpy(temp_ind_list[i].function_name, hBstr->ind_list[i].function_name, 100); +#endif hBstr->ind_list[i].nb_bits = -1; /* Q0 */ move16(); } @@ -545,6 +552,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); +#ifdef BITSTREAM_ANALYSIS + strncpy(st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100); +#endif } nb_bits = add( nb_bits, temp_ind_list[i].nb_bits ); /* Q0 */ @@ -569,6 +579,9 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); +#ifdef BITSTREAM_ANALYSIS + strncpy(st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100); +#endif } nb_bits = add( nb_bits, temp_ind_list[i].nb_bits ); /* Q0 */ diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 04b99f039..ce87b0571 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -41,6 +41,9 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" +#ifdef BITSTREAM_ANALYSIS +#include +#endif /*-------------------------------------------------------------------* @@ -1175,6 +1178,13 @@ ivas_error ivas_init_encoder_fx( move16(); } +#ifdef BITSTERAM_ANALYSIS + for (i = 0; i < st_ivas->ivas_max_num_indices; i++) + { + memset(st_ivas->ind_list[i].function_name, 'A', 100 * sizeof(char)); + } +#endif + /* set the maximum allowed number of metadata indices in the list */ st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata_fx( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); /* Q0 */ move16(); diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 744d2c067..15e0db269 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -43,6 +43,9 @@ #include "basop_util.h" #include "ivas_rom_com_fx.h" +#ifdef BITSTREAM_ANALYSIS +#include +#endif /*-----------------------------------------------------------------------* * Local function prototypes @@ -1192,14 +1195,23 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); +#ifdef BITSTREAM_ANALYSIS + sprintf(hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial"); +#endif } FOR( ( j = 0, i = next_ind_sid ); i < last_ind_sid; ( i++, j++ ) ) { hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; +#ifdef BITSTREAM_ANALYSIS + strncpy(hMetaData->ind_list[j].function_name, hMetaData->ind_list[i].function_name, 100); +#endif hMetaData->nb_bits_tot = add( hMetaData->nb_bits_tot, hMetaData->ind_list[j].nb_bits ); hMetaData->ind_list[i].nb_bits = -1; +#ifdef BISTREAM_ANALYSIS + sprintf(hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial"); +#endif move16(); move16(); move16(); @@ -2007,6 +2019,9 @@ void restore_metadata_buffer_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); +#ifdef BITSTREAM_ANALYSIS + sprintf(hMetaData->ind_list[i].function_name, "RESET in restore_metadata_buffer"); +#endif } hMetaData->nb_bits_tot = bit_pos_start; move16(); diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index 9c4fcc937..d179b1263 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -439,7 +439,11 @@ static void write_metadata_buffer_fx( FOR( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) { - push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); +#ifdef BITSTREAM_ANALYSIS + push_next_indice_(hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits); +#else + push_next_indice(hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits); +#endif } return; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index f90b2d8ec..dd4097fff 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1660,6 +1660,10 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() Q0*/ UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME Q0*/ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value Q0*/ +#ifdef BITSTREAM_ANALYSIS + , + int32_t frame +#endif ) { Encoder_Struct *st_ivas; @@ -1783,7 +1787,12 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( st_ivas->ind_list[i].nb_bits = -1; move16(); } - +#ifdef BITSTREAM_ANALYSIS + for (i = 0; i < st_ivas->ivas_max_num_indices; i++) + { + memset(st_ivas->ind_list[i].function_name, 'A', 100 * sizeof(char)); + } +#endif /* de-allocate old buffer of metadata indices */ IF( st_ivas->ind_list_metadata != NULL ) { @@ -1923,7 +1932,12 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( ELSE #endif { - write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits ); + write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits +#ifdef BITSTREAM_ANALYSIS + , + frame +#endif + ); } /* Reset switching flag before next call - can be set to "true" by some setters */ hIvasEnc->switchingActive = false; diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 8cf6be1cd..51a6e5821 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -302,6 +302,10 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME */ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value */ +#ifdef BITSTREAM_ANALYSIS + , + int32_t frame +#endif ); /*! r: error code */ @@ -311,6 +315,10 @@ ivas_error IVAS_ENC_EncodeFrameToCompact( const Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ UWord8 *outputBitStream, /* o : pointer to compact output bitstream. The array must already be allocated. */ UWord16 *numOutBits /* o : number of bits written to output bitstream */ +#ifdef BITSTREAM_ANALYSIS + , + int32_t frame +#endif ); /* Setter functions - apply changes to encoder configuration */ diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index d3528370f..b1b14afc6 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -4808,5 +4808,9 @@ ivas_error write_indices_ivas_fx( Encoder_Struct *st_ivas, /* i/o: encoder state structure */ UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ +#ifdef BITSTREAM_ANALYSIS + , + int32_t frame +#endif ); #endif diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index caca3173e..3a4acc101 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -54,6 +54,9 @@ typedef struct Word16 id; /* id of the indice */ UWord16 value; /* value of the quantized indice */ Word16 nb_bits; /* number of bits used for the quantization of the indice */ +#ifdef BITSTREAM_ANALYSIS + char function_name[100]; +#endif } Indice, *INDICE_HANDLE; typedef struct -- GitLab From a4e7e7f9ea3e1638e71e50f485b3c3b0b9beee0c Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 16 Apr 2025 16:23:30 +0200 Subject: [PATCH 0645/1310] fix formatting --- apps/encoder.c | 7 +- lib_com/bitstream.c | 3907 +++++++++++----------- lib_com/prot_fx.h | 8 +- lib_enc/ivas_corecoder_enc_reconfig_fx.c | 6 +- lib_enc/ivas_init_enc_fx.c | 8 +- lib_enc/ivas_qmetadata_enc_fx.c | 8 +- lib_enc/ivas_spar_md_enc_fx.c | 4 +- lib_enc/lib_enc.c | 20 +- lib_enc/prot_fx_enc.h | 4 +- lib_enc/stat_enc.h | 2 +- 10 files changed, 1984 insertions(+), 1990 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 1dc6c56ed..a98c9f5f2 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -758,11 +758,12 @@ int main( } /* *** Encode one frame *** */ - if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits + if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits #ifdef BITSTREAM_ANALYSIS - , frame + , + frame #endif - ) ) != IVAS_ERR_OK ) + ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); goto cleanup; diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 08bf87ee2..b4e62566d 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -202,7 +202,7 @@ ivas_error ind_list_realloc( new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].value = old_ind_list[i].value; #ifdef BITSTREAM_ANALYSIS - strncpy(new_ind_list[i].function_name, old_ind_list[i].function_name, 100); + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif move16(); move16(); @@ -216,7 +216,7 @@ ivas_error ind_list_realloc( { new_ind_list[i].nb_bits = -1; #ifdef BITSTREAM_ANALYSIS - sprintf(new_ind_list[i].function_name, "RESET in ind_list_realloc"); + sprintf( new_ind_list[i].function_name, "RESET in ind_list_realloc" ); #endif move16(); } @@ -809,7 +809,7 @@ void move_indices( new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; #ifdef BITSTREAM_ANALYSIS - strncpy(new_ind_list[i].function_name, old_ind_list[i].function_name, 100); + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif old_ind_list[i].nb_bits = -1; } @@ -822,12 +822,12 @@ void move_indices( new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; #ifdef BITSTREAM_ANALYSIS - strncpy(new_ind_list[i].function_name, old_ind_list[i].function_name, 100); + strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif old_ind_list[i].nb_bits = -1; #ifdef BITSTREAM_ANALYSIS - sprintf(old_ind_list[i].function_name, "RESET in move_indices"); + sprintf( old_ind_list[i].function_name, "RESET in move_indices" ); #endif } } @@ -898,1878 +898,1877 @@ ivas_error check_ind_list_limits( } #ifdef BITSTREAM_ANALYSIS -const char *named_indices_table[] = -{ -"IND_IVAS_FORMAT", -"IND_SMODE_OMASA", -"IND_SMODE", -"IND_SID_TYPE", -"IND_BWIDTH", -"IND_CORE", -"IND_PPP_NELP_MODE", -"IND_ACELP_16KHZ", -"IND_ACELP_SIGNALLING", -"IND_SHARP_FLAG", -"IND_MDCT_CORE", -"IND_TCX_CORE", -"IND_BWE_FLAG", -"IND_HQ_SWITCHING_FLG", -"IND_LAST_L_FRAME", -"IND_VAD_FLAG", -"IND_HQ_BWIDTH", -"IND_TC_SUBFR", -"IND_TC_SUBFR", -"IND_TC_SUBFR", -"IND_TC_SUBFR", -"IND_GSC_IVAS_SP", -"IND_LSF_PREDICTOR_SELECT_BIT", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_LSF", -"IND_MID_FRAME_LSF_INDEX", -"IND_ISF_0_0", -"IND_ISF_0_1", -"IND_ISF_0_2", -"IND_ISF_0_3", -"IND_ISF_0_4", -"IND_ISF_1_0", -"IND_ISF_1_1", -"IND_ISF_1_2", -"IND_ISF_1_3", -"IND_ISF_1_4", -"IND_IC_LSF_PRED", -"IND_GSC_ATTACK", -"IND_GSC_SWB_SPEECH", -"IND_NOISE_LEVEL", -"IND_HF_NOISE", -"IND_PIT_CONTR_IDX", -"IND_FEC_CLAS", -"IND_FEC_ENR", -"IND_FEC_POS", -"IND_ES_PRED", -"IND_HARM_FLAG_ACELP", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"IND_ALG_CDBK_4T64_2_24KBIT", -"TAG_ALG_CDBK_4T64_24KBIT_END", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"IND_HF_GAIN_MODIFICATION", -"TAG_ACELP_SUBFR_LOOP_END", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_MEAN_GAIN2", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_TMP", -"IND_Y_GAIN_HF", -"IND_HQ_VOICING_FLAG", -"IND_HQ_SWB_CLAS", -"IND_NF_IDX", -"IND_LC_MODE", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_YNRM", -"IND_SWB_FENV_HQ", -"IND_SWB_FENV_HQ", -"IND_SWB_FENV_HQ", -"IND_SWB_FENV_HQ", -"IND_SWB_FENV_HQ", -"IND_FB_FENV_HQ", -"IND_FB_FENV_HQ", -"IND_FB_FENV_HQ", -"IND_FB_FENV_HQ", -"IND_FB_FENV_HQ", -"IND_DELTA_ENV_HQ", -"IND_HVQ_BWE_NL", -"IND_HVQ_BWE_NL", -"IND_NUM_PEAKS", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_POS_IDX", -"IND_FLAGN", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_PG_IDX", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_PEAKS", -"IND_HVQ_NF_GAIN", -"IND_HVQ_NF_GAIN", -"IND_HQ2_SWB_CLAS", -"IND_HQ2_DENG_MODE", -"IND_HQ2_DENG_8SMODE", -"IND_HQ2_DENG_8SMODE_N0", -"IND_HQ2_DENG_8SMODE_N1", -"IND_HQ2_DENG_8SPOS", -"IND_HQ2_DENG_8SDEPTH", -"IND_HQ2_DENG_HMODE", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_DIFF_ENERGY", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_P2A_FLAGS", -"IND_HQ2_LAST_BA_MAX_BAND", -"IND_HQ2_LAST_BA_MAX_BAND", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_START", -"IND_RC_END", -"IND_HVQ_PVQ_GAIN", -"IND_HVQ_PVQ_GAIN", -"IND_HVQ_PVQ_GAIN", -"IND_HVQ_PVQ_GAIN", -"IND_HVQ_PVQ_GAIN", -"IND_HVQ_PVQ_GAIN", -"IND_HVQ_PVQ_GAIN", -"IND_HVQ_PVQ_GAIN", -"IND_NOISINESS", -"IND_ENERGY", -"IND_CNG_HO", -"IND_SID_BW", -"IND_CNG_ENV1", -"IND_WB_FENV", -"IND_WB_CLASS", -"IND_IG1", -"IND_IG2A", -"IND_IG2B", -"IND_NELP_FID", -"IND_DELTALAG", -"IND_POWER", -"IND_AMP0", -"IND_AMP1", -"IND_GLOBAL_ALIGNMENT", -"IND_PVQ_FINE_GAIN", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_UV_FLAG", -"IND_SHB_SUBGAIN", -"IND_SHB_FRAMEGAIN", -"IND_STEREO_ICBWE_MSFLAG", -"IND_SHB_ENER_SF", -"IND_SHB_RES_GS", -"IND_SHB_RES_GS", -"IND_SHB_RES_GS", -"IND_SHB_RES_GS", -"IND_SHB_RES_GS", -"IND_SHB_VF", -"IND_SHB_LSF", -"IND_SHB_LSF", -"IND_SHB_LSF", -"IND_SHB_LSF", -"IND_SHB_LSF", -"IND_SHB_MIRROR", -"IND_SHB_GRID", -"IND_SWB_CLASS", -"IND_SWB_TENV", -"IND_SWB_TENV", -"IND_SWB_TENV", -"IND_SWB_TENV", -"IND_SWB_FENV", -"IND_SWB_FENV", -"IND_SWB_FENV", -"IND_SWB_FENV", -"IND_SHB_CNG_GAIN", -"IND_DITHERING", -"IND_FB_SLOPE", -"IND_HQ2_SPT_SHORTEN", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_TCQ", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_SUBBAND_GAIN", -"IND_HQ2_DUMMY", -"IND_LAGINDICES", -"IND_NOISEG", -"IND_AUDIO_GAIN", -"IND_AUDIO_DELAY", -"IND_AUDIO_DELAY", -"IND_AUDIO_DELAY", -"IND_AUDIO_DELAY", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"IND_NQ2", -"TAG_HR_BWE_LOOP_END", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_CELP_SUBFRAME", -"IND_CORE_SWITCHING_AUDIO_DELAY", -"IND_CORE_SWITCHING_AUDIO_GAIN", -"IND_STEREO_ICBWE_REF", -"IND_STEREO_ICBWE_SP", -"IND_STEREO_ICBWE_GS", -"IND_STEREO_REFCHAN", -"IND_STEREO_CORRSTATS", -"IND_STEREO_GD", -"IND_STEREO_LRTD_FLAG", -"IND_STEREO_LPC_REUSE", -"IND_STEREO_TD_ALPHA", -"IND_STEREO_2ND_CODER_T", -"IND_UNUSED" +const char *named_indices_table[] = { + "IND_IVAS_FORMAT", + "IND_SMODE_OMASA", + "IND_SMODE", + "IND_SID_TYPE", + "IND_BWIDTH", + "IND_CORE", + "IND_PPP_NELP_MODE", + "IND_ACELP_16KHZ", + "IND_ACELP_SIGNALLING", + "IND_SHARP_FLAG", + "IND_MDCT_CORE", + "IND_TCX_CORE", + "IND_BWE_FLAG", + "IND_HQ_SWITCHING_FLG", + "IND_LAST_L_FRAME", + "IND_VAD_FLAG", + "IND_HQ_BWIDTH", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_TC_SUBFR", + "IND_GSC_IVAS_SP", + "IND_LSF_PREDICTOR_SELECT_BIT", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_LSF", + "IND_MID_FRAME_LSF_INDEX", + "IND_ISF_0_0", + "IND_ISF_0_1", + "IND_ISF_0_2", + "IND_ISF_0_3", + "IND_ISF_0_4", + "IND_ISF_1_0", + "IND_ISF_1_1", + "IND_ISF_1_2", + "IND_ISF_1_3", + "IND_ISF_1_4", + "IND_IC_LSF_PRED", + "IND_GSC_ATTACK", + "IND_GSC_SWB_SPEECH", + "IND_NOISE_LEVEL", + "IND_HF_NOISE", + "IND_PIT_CONTR_IDX", + "IND_FEC_CLAS", + "IND_FEC_ENR", + "IND_FEC_POS", + "IND_ES_PRED", + "IND_HARM_FLAG_ACELP", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "IND_ALG_CDBK_4T64_2_24KBIT", + "TAG_ALG_CDBK_4T64_24KBIT_END", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "IND_HF_GAIN_MODIFICATION", + "TAG_ACELP_SUBFR_LOOP_END", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_MEAN_GAIN2", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_TMP", + "IND_Y_GAIN_HF", + "IND_HQ_VOICING_FLAG", + "IND_HQ_SWB_CLAS", + "IND_NF_IDX", + "IND_LC_MODE", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_YNRM", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_SWB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_FB_FENV_HQ", + "IND_DELTA_ENV_HQ", + "IND_HVQ_BWE_NL", + "IND_HVQ_BWE_NL", + "IND_NUM_PEAKS", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_POS_IDX", + "IND_FLAGN", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_PG_IDX", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_PEAKS", + "IND_HVQ_NF_GAIN", + "IND_HVQ_NF_GAIN", + "IND_HQ2_SWB_CLAS", + "IND_HQ2_DENG_MODE", + "IND_HQ2_DENG_8SMODE", + "IND_HQ2_DENG_8SMODE_N0", + "IND_HQ2_DENG_8SMODE_N1", + "IND_HQ2_DENG_8SPOS", + "IND_HQ2_DENG_8SDEPTH", + "IND_HQ2_DENG_HMODE", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_DIFF_ENERGY", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_P2A_FLAGS", + "IND_HQ2_LAST_BA_MAX_BAND", + "IND_HQ2_LAST_BA_MAX_BAND", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_START", + "IND_RC_END", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_HVQ_PVQ_GAIN", + "IND_NOISINESS", + "IND_ENERGY", + "IND_CNG_HO", + "IND_SID_BW", + "IND_CNG_ENV1", + "IND_WB_FENV", + "IND_WB_CLASS", + "IND_IG1", + "IND_IG2A", + "IND_IG2B", + "IND_NELP_FID", + "IND_DELTALAG", + "IND_POWER", + "IND_AMP0", + "IND_AMP1", + "IND_GLOBAL_ALIGNMENT", + "IND_PVQ_FINE_GAIN", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_UV_FLAG", + "IND_SHB_SUBGAIN", + "IND_SHB_FRAMEGAIN", + "IND_STEREO_ICBWE_MSFLAG", + "IND_SHB_ENER_SF", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_RES_GS", + "IND_SHB_VF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_LSF", + "IND_SHB_MIRROR", + "IND_SHB_GRID", + "IND_SWB_CLASS", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_TENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SWB_FENV", + "IND_SHB_CNG_GAIN", + "IND_DITHERING", + "IND_FB_SLOPE", + "IND_HQ2_SPT_SHORTEN", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_TCQ", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_SUBBAND_GAIN", + "IND_HQ2_DUMMY", + "IND_LAGINDICES", + "IND_NOISEG", + "IND_AUDIO_GAIN", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_AUDIO_DELAY", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "IND_NQ2", + "TAG_HR_BWE_LOOP_END", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_CELP_SUBFRAME", + "IND_CORE_SWITCHING_AUDIO_DELAY", + "IND_CORE_SWITCHING_AUDIO_GAIN", + "IND_STEREO_ICBWE_REF", + "IND_STEREO_ICBWE_SP", + "IND_STEREO_ICBWE_GS", + "IND_STEREO_REFCHAN", + "IND_STEREO_CORRSTATS", + "IND_STEREO_GD", + "IND_STEREO_LRTD_FLAG", + "IND_STEREO_LPC_REUSE", + "IND_STEREO_TD_ALPHA", + "IND_STEREO_2ND_CODER_T", + "IND_UNUSED" }; #endif @@ -2819,7 +2818,7 @@ ivas_error push_indice( hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; #ifdef BITSTREAM_ANALYSIS - strncpy(hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100); + strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100 ); #endif move16(); move16(); @@ -2833,7 +2832,7 @@ ivas_error push_indice( hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; #ifdef BITSTREAM_ANALYSIS - strncpy(hBstr->ind_list[i].function_name, named_indices_table[id], 100); + strncpy( hBstr->ind_list[i].function_name, named_indices_table[id], 100 ); #endif move16(); move16(); @@ -2855,7 +2854,7 @@ ivas_error push_indice( *-------------------------------------------------------------------*/ ivas_error push_next_indice_( #ifdef BITSTREAM_ANALYSIS - const char *caller, + const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ UWord16 value, /* i : value of the quantized indice */ @@ -2895,7 +2894,7 @@ ivas_error push_next_indice_( move16(); #ifdef BITSTREAM_ANALYSIS - strncpy(hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100); + strncpy( hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100 ); #endif /* updates */ @@ -2913,7 +2912,7 @@ ivas_error push_next_indice_( *-------------------------------------------------------------------*/ ivas_error push_next_bits_( #ifdef BITSTREAM_ANALYSIS - const char *caller, + const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ @@ -2959,7 +2958,7 @@ ivas_error push_next_bits_( ptr->nb_bits = 16; ptr->id = prev_id; #ifdef BITSTREAM_ANALYSIS - strncpy(ptr->function_name, caller, 100); + strncpy( ptr->function_name, caller, 100 ); #endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); move16(); @@ -2983,7 +2982,7 @@ ivas_error push_next_bits_( ptr->nb_bits = 1; ptr->id = prev_id; #ifdef BITSTREAM_ANALYSIS - strncpy(ptr->function_name, caller, 100); + strncpy( ptr->function_name, caller, 100 ); #endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); move16(); @@ -3060,7 +3059,7 @@ UWord16 delete_indice( hBstr->ind_list[j].value = hBstr->ind_list[i].value; hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; #ifdef BITSTREAM_ANALYSIS - strncpy(hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100); + strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100 ); #endif } @@ -3074,7 +3073,7 @@ UWord16 delete_indice( /* reset the shifted indices at the end of the list */ hBstr->ind_list[j].nb_bits = -1; #ifdef BITSTREAM_ANALYSIS - sprintf(hBstr->ind_list[j].function_name, "RESET in delete_indice"); + sprintf( hBstr->ind_list[j].function_name, "RESET in delete_indice" ); #endif } @@ -3313,8 +3312,8 @@ static ivas_error write_indices_element_fx( const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ const Word16 element_id /* i : id of the SCE or CPE */ #ifdef BITSTREAM_ANALYSIS - , - int32_t frame + , + int32_t frame #endif ) { @@ -3423,76 +3422,70 @@ static ivas_error write_indices_element_fx( } #ifdef BITSTREAM_ANALYSIS - if (is_SCE) /* EVS and SCE */ - { - static FILE *f1 = 0; - - if (f1 == 0) - f1 = fopen("bitstream_text", "w"); - - for (int16_t i = 0; i < sts[0]->hBstr->nb_ind_tot; i++) - { - Indice *ind_list = sts[0]->hBstr->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; - - fprintf(f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value); - - } - - if (st_ivas->hSCE[element_id]->hMetaData != NULL) - { - for (int16_t i = 0; i < st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; i++) - { - Indice *ind_list = st_ivas->hSCE[element_id]->hMetaData->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; - - fprintf(f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value); + if ( is_SCE ) /* EVS and SCE */ + { + static FILE *f1 = 0; - } - } + if ( f1 == 0 ) + f1 = fopen( "bitstream_text", "w" ); - } - else - { - static FILE *f1 = 0; + for ( int16_t i = 0; i < sts[0]->hBstr->nb_ind_tot; i++ ) + { + Indice *ind_list = sts[0]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; - if (f1 == 0) - f1 = fopen("bitstream_text", "w"); + fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); + } + if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) + { + for ( int16_t i = 0; i < st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; i++ ) + { + Indice *ind_list = st_ivas->hSCE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; - for (n = 0; n < n_channels; n++) - { - for (int16_t i = 0; i < sts[n]->hBstr->nb_ind_tot; i++) - { - Indice *ind_list = sts[n]->hBstr->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; + fprintf( f1, "%d %d %d %s %d %d\n", frame, element_id, i, function_name, nb_bits, value ); + } + } + } + else + { + static FILE *f1 = 0; - fprintf(f1, "%d %d %d %d %s %d %d\n", frame, element_id, n, i, function_name, nb_bits, value); + if ( f1 == 0 ) + f1 = fopen( "bitstream_text", "w" ); - } - } + for ( n = 0; n < n_channels; n++ ) + { + for ( int16_t i = 0; i < sts[n]->hBstr->nb_ind_tot; i++ ) + { + Indice *ind_list = sts[n]->hBstr->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; - if (st_ivas->hCPE[element_id]->hMetaData != NULL) - { - for (int16_t i = 0; i < st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; i++) - { - Indice *ind_list = st_ivas->hCPE[element_id]->hMetaData->ind_list; - int16_t value = ind_list[i].value; - int16_t nb_bits = ind_list[i].nb_bits; - char *function_name = ind_list[i].function_name; + fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, n, i, function_name, nb_bits, value ); + } + } - fprintf(f1, "%d %d %d %d %s %d %d\n", frame, element_id, -1, i, function_name, nb_bits, value); + if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) + { + for ( int16_t i = 0; i < st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; i++ ) + { + Indice *ind_list = st_ivas->hCPE[element_id]->hMetaData->ind_list; + int16_t value = ind_list[i].value; + int16_t nb_bits = ind_list[i].nb_bits; + char *function_name = ind_list[i].function_name; - } - } - } + fprintf( f1, "%d %d %d %d %s %d %d\n", frame, element_id, -1, i, function_name, nb_bits, value ); + } + } + } #endif /*----------------------------------------------------------------* @@ -3539,8 +3532,8 @@ ivas_error write_indices_ivas_fx( UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ #ifdef BITSTREAM_ANALYSIS - , - int32_t frame + , + int32_t frame #endif ) { @@ -3565,22 +3558,22 @@ ivas_error write_indices_ivas_fx( FOR( n = 0; n < st_ivas->nSCE; n++ ) { - write_indices_element_fx( st_ivas, &pt_stream, 1, n + write_indices_element_fx( st_ivas, &pt_stream, 1, n #ifdef BITSTREAM_ANALYSIS - , - frame + , + frame #endif - ); + ); } FOR( n = 0; n < st_ivas->nCPE; n++ ) { - write_indices_element_fx( st_ivas, &pt_stream, 0, n + write_indices_element_fx( st_ivas, &pt_stream, 0, n #ifdef BITSTREAM_ANALYSIS - , - frame + , + frame #endif - ); + ); } *num_bits = (UWord16) ( pt_stream - bit_stream ); diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index f1fbf8fc0..4c1a01b0f 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10671,7 +10671,7 @@ ivas_error config_acelp1_fx( ivas_error push_next_indice_( #ifdef BITSTREAM_ANALYSIS - const char *caller, + const char *caller, #endif BSTR_ENC_HANDLE hBstr, UWord16 value, /* i : value of the quantized indice */ @@ -10680,7 +10680,7 @@ ivas_error push_next_indice_( ivas_error push_next_bits_( #ifdef BITSTREAM_ANALYSIS - const char *caller, + const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ @@ -11005,7 +11005,7 @@ ivas_error push_indice( ivas_error push_next_indice_( #ifdef BITSTREAM_ANALYSIS - const char *caller, + const char *caller, #endif BSTR_ENC_HANDLE hBstr, UWord16 value, /* i : value of the quantized indice */ @@ -11014,7 +11014,7 @@ ivas_error push_next_indice_( ivas_error push_next_bits_( #ifdef BITSTREAM_ANALYSIS - const char *caller, + const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig_fx.c b/lib_enc/ivas_corecoder_enc_reconfig_fx.c index 7e7db6e0e..b3b471e1d 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig_fx.c +++ b/lib_enc/ivas_corecoder_enc_reconfig_fx.c @@ -197,7 +197,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; /* Q0 */ move16(); #ifdef BITSTREAM_ANALYSIS - strncpy(temp_ind_list[i].function_name, hBstr->ind_list[i].function_name, 100); + strncpy( temp_ind_list[i].function_name, hBstr->ind_list[i].function_name, 100 ); #endif hBstr->ind_list[i].nb_bits = -1; /* Q0 */ move16(); @@ -553,7 +553,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); #ifdef BITSTREAM_ANALYSIS - strncpy(st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100); + strncpy( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); #endif } @@ -580,7 +580,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); #ifdef BITSTREAM_ANALYSIS - strncpy(st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100); + strncpy( st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); #endif } diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index ce87b0571..c7ab7eb08 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -1179,10 +1179,10 @@ ivas_error ivas_init_encoder_fx( } #ifdef BITSTERAM_ANALYSIS - for (i = 0; i < st_ivas->ivas_max_num_indices; i++) - { - memset(st_ivas->ind_list[i].function_name, 'A', 100 * sizeof(char)); - } + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + memset( st_ivas->ind_list[i].function_name, 'A', 100 * sizeof( char ) ); + } #endif /* set the maximum allowed number of metadata indices in the list */ diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 15e0db269..b67b9d690 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -1196,7 +1196,7 @@ void reset_metadata_spatial_fx( hMetaData->ind_list[i].nb_bits = -1; move16(); #ifdef BITSTREAM_ANALYSIS - sprintf(hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial"); + sprintf( hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial" ); #endif } @@ -1205,12 +1205,12 @@ void reset_metadata_spatial_fx( hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; #ifdef BITSTREAM_ANALYSIS - strncpy(hMetaData->ind_list[j].function_name, hMetaData->ind_list[i].function_name, 100); + strncpy( hMetaData->ind_list[j].function_name, hMetaData->ind_list[i].function_name, 100 ); #endif hMetaData->nb_bits_tot = add( hMetaData->nb_bits_tot, hMetaData->ind_list[j].nb_bits ); hMetaData->ind_list[i].nb_bits = -1; #ifdef BISTREAM_ANALYSIS - sprintf(hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial"); + sprintf( hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial" ); #endif move16(); move16(); @@ -2020,7 +2020,7 @@ void restore_metadata_buffer_fx( hMetaData->ind_list[i].nb_bits = -1; move16(); #ifdef BITSTREAM_ANALYSIS - sprintf(hMetaData->ind_list[i].function_name, "RESET in restore_metadata_buffer"); + sprintf( hMetaData->ind_list[i].function_name, "RESET in restore_metadata_buffer" ); #endif } hMetaData->nb_bits_tot = bit_pos_start; diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index d179b1263..140a62c63 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -440,9 +440,9 @@ static void write_metadata_buffer_fx( FOR( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) { #ifdef BITSTREAM_ANALYSIS - push_next_indice_(hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits); + push_next_indice_( hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); #else - push_next_indice(hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits); + push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); #endif } diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index dd4097fff..f6188fe1a 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1661,8 +1661,8 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME Q0*/ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value Q0*/ #ifdef BITSTREAM_ANALYSIS - , - int32_t frame + , + int32_t frame #endif ) { @@ -1788,10 +1788,10 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( move16(); } #ifdef BITSTREAM_ANALYSIS - for (i = 0; i < st_ivas->ivas_max_num_indices; i++) - { - memset(st_ivas->ind_list[i].function_name, 'A', 100 * sizeof(char)); - } + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + memset( st_ivas->ind_list[i].function_name, 'A', 100 * sizeof( char ) ); + } #endif /* de-allocate old buffer of metadata indices */ IF( st_ivas->ind_list_metadata != NULL ) @@ -1932,12 +1932,12 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( ELSE #endif { - write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits + write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits #ifdef BITSTREAM_ANALYSIS - , - frame + , + frame #endif - ); + ); } /* Reset switching flag before next call - can be set to "true" by some setters */ hIvasEnc->switchingActive = false; diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index b1b14afc6..9be9df333 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -4809,8 +4809,8 @@ ivas_error write_indices_ivas_fx( UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ #ifdef BITSTREAM_ANALYSIS - , - int32_t frame + , + int32_t frame #endif ); #endif diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 3a4acc101..f5f819241 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -55,7 +55,7 @@ typedef struct UWord16 value; /* value of the quantized indice */ Word16 nb_bits; /* number of bits used for the quantization of the indice */ #ifdef BITSTREAM_ANALYSIS - char function_name[100]; + char function_name[100]; #endif } Indice, *INDICE_HANDLE; -- GitLab From 3568f0a5871190556cb4fa43f65a199e8f61fdba Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 16 Apr 2025 16:24:53 +0200 Subject: [PATCH 0646/1310] fix compilation errors with the instrumented code --- lib_com/bitstream.c | 8 ++++++++ lib_com/prot_fx.h | 11 ++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index b4e62566d..3431a2f1d 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -2852,7 +2852,11 @@ ivas_error push_indice( * * Push a new indice into the buffer at the next position *-------------------------------------------------------------------*/ +#ifdef BITSTREAM_ANALYSIS ivas_error push_next_indice_( +#else +ivas_error push_next_indice( +#endif #ifdef BITSTREAM_ANALYSIS const char *caller, #endif @@ -2910,7 +2914,11 @@ ivas_error push_next_indice_( * push_next_bits() * Push a bit buffer into the buffer at the next position *-------------------------------------------------------------------*/ +#ifdef BITSTREAM_ANALYSIS ivas_error push_next_bits_( +#else +ivas_error push_next_bits( +#endif #ifdef BITSTREAM_ANALYSIS const char *caller, #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 4c1a01b0f..99f3972c8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10664,12 +10664,13 @@ ivas_error config_acelp1_fx( #ifdef BITSTREAM_ANALYSIS #define push_next_indice( ... ) push_next_indice_( __func__, __VA_ARGS__ ) #define push_next_bits( ... ) push_next_bits_( __func__, __VA_ARGS__ ); -#else -#define push_next_indice( ... ) push_next_indice_( __VA_ARGS__ ) -#define push_next_bits( ... ) push_next_bits_( __VA_ARGS__ ); #endif +#ifdef BITSTREAM_ANALYSIS ivas_error push_next_indice_( +#else +ivas_error push_next_indice( +#endif #ifdef BITSTREAM_ANALYSIS const char *caller, #endif @@ -10678,7 +10679,11 @@ ivas_error push_next_indice_( Word16 nb_bits /* i : number of bits used to quantize the indice */ ); +#ifdef BITSTREAM_ANALYSIS ivas_error push_next_bits_( +#else +ivas_error push_next_bits( +#endif #ifdef BITSTREAM_ANALYSIS const char *caller, #endif -- GitLab From 3c4a44ec383d919b88eb4821244e2fe00c7a1044 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 14 May 2025 14:47:15 +0200 Subject: [PATCH 0647/1310] move the new define to the DEBUGGING section --- apps/encoder.c | 2 +- lib_com/bitstream.c | 46 ++++++++++++------------ lib_com/options.h | 3 +- lib_com/prot_fx.h | 14 ++++---- lib_enc/ivas_corecoder_enc_reconfig_fx.c | 8 ++--- lib_enc/ivas_init_enc_fx.c | 2 +- lib_enc/ivas_qmetadata_enc_fx.c | 8 ++--- lib_enc/ivas_spar_md_enc_fx.c | 2 +- lib_enc/lib_enc.c | 6 ++-- lib_enc/lib_enc.h | 4 +-- lib_enc/prot_fx_enc.h | 2 +- lib_enc/stat_enc.h | 2 +- 12 files changed, 49 insertions(+), 50 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index a98c9f5f2..0d557ede8 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -759,7 +759,7 @@ int main( /* *** Encode one frame *** */ if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , frame #endif diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 3431a2f1d..8ebfd6fa7 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -48,7 +48,7 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS #include #endif @@ -201,7 +201,7 @@ ivas_error ind_list_realloc( { new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].value = old_ind_list[i].value; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif move16(); @@ -215,7 +215,7 @@ ivas_error ind_list_realloc( FOR( ; i < max_num_indices; i++ ) { new_ind_list[i].nb_bits = -1; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS sprintf( new_ind_list[i].function_name, "RESET in ind_list_realloc" ); #endif move16(); @@ -808,7 +808,7 @@ void move_indices( new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif old_ind_list[i].nb_bits = -1; @@ -821,12 +821,12 @@ void move_indices( new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif old_ind_list[i].nb_bits = -1; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS sprintf( old_ind_list[i].function_name, "RESET in move_indices" ); #endif } @@ -897,7 +897,7 @@ ivas_error check_ind_list_limits( return error; } -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS const char *named_indices_table[] = { "IND_IVAS_FORMAT", "IND_SMODE_OMASA", @@ -2817,7 +2817,7 @@ ivas_error push_indice( hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100 ); #endif move16(); @@ -2831,7 +2831,7 @@ ivas_error push_indice( hBstr->ind_list[i].id = id; hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( hBstr->ind_list[i].function_name, named_indices_table[id], 100 ); #endif move16(); @@ -2852,12 +2852,12 @@ ivas_error push_indice( * * Push a new indice into the buffer at the next position *-------------------------------------------------------------------*/ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS ivas_error push_next_indice_( #else ivas_error push_next_indice( #endif -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -2897,7 +2897,7 @@ ivas_error push_next_indice( move16(); move16(); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100 ); #endif @@ -2914,12 +2914,12 @@ ivas_error push_next_indice( * push_next_bits() * Push a bit buffer into the buffer at the next position *-------------------------------------------------------------------*/ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS ivas_error push_next_bits_( #else ivas_error push_next_bits( #endif -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -2965,7 +2965,7 @@ ivas_error push_next_bits( ptr->value = code; ptr->nb_bits = 16; ptr->id = prev_id; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( ptr->function_name, caller, 100 ); #endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); @@ -2989,7 +2989,7 @@ ivas_error push_next_bits( ptr->value = bits[i]; ptr->nb_bits = 1; ptr->id = prev_id; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( ptr->function_name, caller, 100 ); #endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); @@ -3066,7 +3066,7 @@ UWord16 delete_indice( hBstr->ind_list[j].id = hBstr->ind_list[i].id; hBstr->ind_list[j].value = hBstr->ind_list[i].value; hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100 ); #endif } @@ -3080,7 +3080,7 @@ UWord16 delete_indice( { /* reset the shifted indices at the end of the list */ hBstr->ind_list[j].nb_bits = -1; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS sprintf( hBstr->ind_list[j].function_name, "RESET in delete_indice" ); #endif } @@ -3319,7 +3319,7 @@ static ivas_error write_indices_element_fx( UWord16 **pt_stream, /* i : pointer to bitstream buffer */ const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ const Word16 element_id /* i : id of the SCE or CPE */ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , int32_t frame #endif @@ -3429,7 +3429,7 @@ static ivas_error write_indices_element_fx( } } -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS if ( is_SCE ) /* EVS and SCE */ { static FILE *f1 = 0; @@ -3539,7 +3539,7 @@ ivas_error write_indices_ivas_fx( Encoder_Struct *st_ivas, /* i/o: encoder state structure */ UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , int32_t frame #endif @@ -3567,7 +3567,7 @@ ivas_error write_indices_ivas_fx( FOR( n = 0; n < st_ivas->nSCE; n++ ) { write_indices_element_fx( st_ivas, &pt_stream, 1, n -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , frame #endif @@ -3577,7 +3577,7 @@ ivas_error write_indices_ivas_fx( FOR( n = 0; n < st_ivas->nCPE; n++ ) { write_indices_element_fx( st_ivas, &pt_stream, 0, n -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , frame #endif diff --git a/lib_com/options.h b/lib_com/options.h index d55309bc9..20a1dc555 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -43,6 +43,7 @@ /*#define DEBUGGING*/ /* Allows debugging message to be printed out during runtime */ #ifdef DEBUGGING +/*#define DBG_BITSTREAM_ANALYSIS*/ /* Write bitstream with annotations to a text file */ #define DEBUG_MODE_INFO /* Define to output most important parameters to the subdirectory "res/" */ #define DEBUG_MODE_INFO_TWEAK /* Enable command line switch to specify subdirectory for debug info output inside "./res/" */ #define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stereo 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ @@ -100,6 +101,4 @@ #define TEST_HR #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ -/*#define BITSTREAM_ANALYSIS*/ - #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 99f3972c8..870e60a8d 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10661,17 +10661,17 @@ ivas_error config_acelp1_fx( const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS #define push_next_indice( ... ) push_next_indice_( __func__, __VA_ARGS__ ) #define push_next_bits( ... ) push_next_bits_( __func__, __VA_ARGS__ ); #endif -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS ivas_error push_next_indice_( #else ivas_error push_next_indice( #endif -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS const char *caller, #endif BSTR_ENC_HANDLE hBstr, @@ -10679,12 +10679,12 @@ ivas_error push_next_indice( Word16 nb_bits /* i : number of bits used to quantize the indice */ ); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS ivas_error push_next_bits_( #else ivas_error push_next_bits( #endif -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -11009,7 +11009,7 @@ ivas_error push_indice( ); ivas_error push_next_indice_( -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS const char *caller, #endif BSTR_ENC_HANDLE hBstr, @@ -11018,7 +11018,7 @@ ivas_error push_next_indice_( ); ivas_error push_next_bits_( -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig_fx.c b/lib_enc/ivas_corecoder_enc_reconfig_fx.c index b3b471e1d..6a2748e1c 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig_fx.c +++ b/lib_enc/ivas_corecoder_enc_reconfig_fx.c @@ -39,7 +39,7 @@ #include "ivas_prot_fx.h" #include "math.h" #include "wmc_auto.h" -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS #include #endif /*-------------------------------------------------------------------* @@ -196,7 +196,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; /* Q0 */ move16(); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( temp_ind_list[i].function_name, hBstr->ind_list[i].function_name, 100 ); #endif hBstr->ind_list[i].nb_bits = -1; /* Q0 */ @@ -552,7 +552,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); #endif } @@ -579,7 +579,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); #endif } diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index c7ab7eb08..7d88b1264 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -41,7 +41,7 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS #include #endif diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index b67b9d690..9a7c4038b 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -43,7 +43,7 @@ #include "basop_util.h" #include "ivas_rom_com_fx.h" -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS #include #endif @@ -1195,7 +1195,7 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS sprintf( hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial" ); #endif } @@ -1204,7 +1204,7 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS strncpy( hMetaData->ind_list[j].function_name, hMetaData->ind_list[i].function_name, 100 ); #endif hMetaData->nb_bits_tot = add( hMetaData->nb_bits_tot, hMetaData->ind_list[j].nb_bits ); @@ -2019,7 +2019,7 @@ void restore_metadata_buffer_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS sprintf( hMetaData->ind_list[i].function_name, "RESET in restore_metadata_buffer" ); #endif } diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index 140a62c63..a293b870a 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -439,7 +439,7 @@ static void write_metadata_buffer_fx( FOR( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) { -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS push_next_indice_( hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); #else push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index f6188fe1a..1771f875a 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1660,7 +1660,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() Q0*/ UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME Q0*/ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value Q0*/ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , int32_t frame #endif @@ -1787,7 +1787,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( st_ivas->ind_list[i].nb_bits = -1; move16(); } -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) { memset( st_ivas->ind_list[i].function_name, 'A', 100 * sizeof( char ) ); @@ -1933,7 +1933,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( #endif { write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , frame #endif diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 51a6e5821..16fc9fe4b 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -302,7 +302,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME */ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value */ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , int32_t frame #endif @@ -315,7 +315,7 @@ ivas_error IVAS_ENC_EncodeFrameToCompact( const Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ UWord8 *outputBitStream, /* o : pointer to compact output bitstream. The array must already be allocated. */ UWord16 *numOutBits /* o : number of bits written to output bitstream */ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , int32_t frame #endif diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 9be9df333..8e323af82 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -4808,7 +4808,7 @@ ivas_error write_indices_ivas_fx( Encoder_Struct *st_ivas, /* i/o: encoder state structure */ UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS , int32_t frame #endif diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index f5f819241..41383f109 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -54,7 +54,7 @@ typedef struct Word16 id; /* id of the indice */ UWord16 value; /* value of the quantized indice */ Word16 nb_bits; /* number of bits used for the quantization of the indice */ -#ifdef BITSTREAM_ANALYSIS +#ifdef DBG_BITSTREAM_ANALYSIS char function_name[100]; #endif } Indice, *INDICE_HANDLE; -- GitLab From 5203c88f1e2dde214c63cb3811ff6160652c3042 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 20 May 2025 10:04:03 +0200 Subject: [PATCH 0648/1310] Increase headroom for Q_syn, fixes regression in +10dB case Multi_channel_5_1_at_384_kbps_48kHz_in_48kHz_out_7_1_4_out_JBM_Prof_5. --- lib_dec/ivas_mdct_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 2940a169b..0cec3dd72 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1308,7 +1308,7 @@ void ivas_mdct_core_reconstruct_fx( // norm(synth_buf) >= q_syn - q_win // norm(synth_buf) + q_win >= q_syn sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) ); - q_syn = add( sf, s_min( q_win, q_winFB ) ); + q_syn = add( sub( sf, 1 ), s_min( q_win, q_winFB ) ); st->Q_syn = q_syn; move16(); -- GitLab From e8218c37649e47fd0e6579797e0a522c86f85c6c Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 17 Apr 2025 15:49:28 +0200 Subject: [PATCH 0649/1310] accept REMOVE_EVS_DUPLICATES --- Workspace_msvc/lib_dec.vcxproj | 3 - Workspace_msvc/lib_dec.vcxproj.filters | 3 - lib_com/bits_alloc_fx.c | 1313 +-------------- lib_com/gs_inact_switching_fx.c | 134 +- lib_com/gs_noisefill_fx.c | 10 +- lib_com/ivas_prot_fx.h | 2 +- lib_com/lsf_tools_fx.c | 220 +-- lib_com/options.h | 2 +- lib_com/prot_fx.h | 577 ++----- lib_com/swb_tbe_com_fx.c | 247 +-- lib_dec/FEC_fx.c | 15 +- lib_dec/FEC_scale_syn_fx.c | 574 +------ lib_dec/acelp_core_dec_fx.c | 2075 +++++++++++++++++------- lib_dec/acelp_core_dec_ivas_fx.c | 107 +- lib_dec/acelp_core_switch_dec_fx.c | 12 +- lib_dec/amr_wb_dec_fx.c | 33 +- lib_dec/cng_dec_fx.c | 683 +------- lib_dec/dec_LPD_fx.c | 4 - lib_dec/dec_ace_fx.c | 22 +- lib_dec/dec_amr_wb_fx.c | 6 +- lib_dec/dec_gen_voic_fx.c | 534 +----- lib_dec/dec_pit_exc_fx.c | 432 +---- lib_dec/dec_post_fx.c | 241 +-- lib_dec/dec_ppp_fx.c | 17 +- lib_dec/dec_tran_fx.c | 12 +- lib_dec/dec_uv_fx.c | 100 +- lib_dec/evs_dec_fx.c | 12 +- lib_dec/fd_cng_dec_fx.c | 485 +----- lib_dec/gain_dec_fx.c | 390 +---- lib_dec/gs_dec_fx.c | 693 +------- lib_dec/ivas_core_dec_fx.c | 2 +- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 4 +- lib_dec/ivas_tcx_core_dec_fx.c | 7 +- lib_dec/ivas_td_low_rate_dec_fx.c | 20 +- lib_dec/lsf_dec_fx.c | 276 +--- lib_dec/pit_dec_fx.c | 256 +-- lib_dec/post_dec_fx.c | 18 +- lib_enc/acelp_core_enc_fx.c | 40 +- lib_enc/acelp_core_switch_enc_fx.c | 37 +- lib_enc/analy_lp_fx.c | 150 +- lib_enc/cod_ace_fx.c | 11 +- lib_enc/enc_gen_voic_fx.c | 23 +- lib_enc/enc_tran_fx.c | 15 +- lib_enc/ivas_core_pre_proc_front_fx.c | 7 +- lib_enc/ivas_core_pre_proc_fx.c | 13 +- lib_enc/ivas_front_vad_fx.c | 6 +- lib_enc/ivas_td_low_rate_enc_fx.c | 4 +- lib_enc/lsf_enc_fx.c | 7 +- lib_enc/pre_proc_fx.c | 14 +- lib_enc/prot_fx_enc.h | 104 +- lib_enc/transition_enc_fx.c | 41 +- 51 files changed, 2129 insertions(+), 7884 deletions(-) diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2d06d29aa..2839a5812 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -139,9 +139,6 @@ false - - false - diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index 8a4fc4605..ebf15bd4c 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -119,9 +119,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c diff --git a/lib_com/bits_alloc_fx.c b/lib_com/bits_alloc_fx.c index e9abb7651..3bfcd0c20 100644 --- a/lib_com/bits_alloc_fx.c +++ b/lib_com/bits_alloc_fx.c @@ -434,174 +434,12 @@ static Word16 fcb_table( } /*-------------------------------------------------------------------* - * acelp_FCB_allocator() + * acelp_FCB_allocator_fx() * * Routine to allocate fixed innovation codebook bit-budget *--------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES -static ivas_error acelp_FCB_allocator( - Word16 *nBits, /* i/o: available bit-budget */ - Word16 fixed_cdk_index[], /* o : codebook index Q0 */ - Word16 nb_subfr, /* i : number of subframes */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 coder_type, /* i : coder type */ - const Word16 tc_subfr, /* i : TC subframe index */ - const Word16 fix_first /* i : flag to indicate whether the first subframe bit-budget was fixed */ -) -{ - Word16 cdbk, sfr, step; - Word16 nBits_tmp; - Word16 *p_fixed_cdk_index; - Word16 max_n; - ivas_error error; - // PMT("Not floating point computation, but fixed point operator are still missing ") - - error = IVAS_ERR_OK; - move32(); - - cdbk = coder_type; /* just to avoid warning when DEBUGGING is deactivated */ - move16(); - - p_fixed_cdk_index = fixed_cdk_index; - - /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse not in the first subframe */ - test(); - IF( GE_16( tc_subfr, L_SUBFR ) && fix_first ) - { - Word16 i; - - FOR( i = 0; i < nb_subfr; i++ ) - { - *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[i] ) ); - move16(); - } - return error; - } - - /* TRANSITION coding: first subframe bit-budget was already fixed, glottal pulse in the first subframe */ - sfr = 0; - move16(); - IF( fix_first ) - { - *nBits = sub( *nBits, ACELP_FIXED_CDK_BITS( fixed_cdk_index[0] ) ); - move16(); - sfr = 1; - move16(); - p_fixed_cdk_index++; - nb_subfr = 3; - move16(); - } - - /* distribute the bit-budget equally between subframes */ - IF( GT_16( L_subfr, L_SUBFR ) ) /* access fast_FCB_bits_2sfr */ - { - max_n = 6; - move16(); - } - ELSE - { - max_n = ACELP_FIXED_CDK_NB; - move16(); - } - FOR( cdbk = 0; cdbk < max_n; cdbk++ ) - { - IF( GT_32( L_mult0( fcb_table( cdbk, L_subfr ), nb_subfr ), L_deposit_l( *nBits ) ) ) - { - BREAK; - } - } - cdbk = sub( cdbk, 1 ); - -#ifdef DEBUGGING - if ( cdbk < 0 && coder_type != TRANSITION ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bit-budget for fixed innovation codebook (frame = %d). Exiting! \n" ); - } - if ( ( L_subfr == L_SUBFR && cdbk >= ACELP_FIXED_CDK_NB ) || ( L_subfr == 2 * L_SUBFR && fcb_table( cdbk, L_subfr ) == 128 /*stop value*/ ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too high bit-budget for fixed innovation codebook (frame = %d). Exiting! \n" ); - } -#endif - - set16_fx( p_fixed_cdk_index, cdbk, nb_subfr ); - nBits_tmp = 0; - move16(); - IF( cdbk >= 0 ) - { - nBits_tmp = fcb_table( cdbk, L_subfr ); - } - ELSE - { - nBits_tmp = 0; - move16(); - } - *nBits = sub( *nBits, i_mult( nBits_tmp, nb_subfr ) ); - move16(); - - /* try to increase the FCB bit-budget of the first subframe(s) */ - IF( LT_16( cdbk, ACELP_FIXED_CDK_NB - 1 ) ) - { - step = sub( fcb_table( add( cdbk, 1 ), L_subfr ), nBits_tmp ); - WHILE( *nBits >= step ) - { - ( *p_fixed_cdk_index )++; - *nBits = sub( *nBits, step ); - move16(); - p_fixed_cdk_index++; - } - - /* try to increase the FCB of the first subframe in cases when the next step is lower than the current step */ - step = sub( fcb_table( add( fixed_cdk_index[sfr], 1 ), L_subfr ), fcb_table( fixed_cdk_index[sfr], L_subfr ) ); - test(); - IF( GE_16( *nBits, step ) && cdbk >= 0 ) - { - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - test(); - IF( GE_16( *nBits, step ) && EQ_16( fixed_cdk_index[sfr + 1], sub( fixed_cdk_index[sfr], 1 ) ) ) - { - sfr = add( sfr, 1 ); - fixed_cdk_index[sfr] = add( fixed_cdk_index[sfr], 1 ); - move16(); - *nBits = sub( *nBits, step ); - move16(); - } - } - } - /* TRANSITION coding: allocate highest FCBQ bit-budget to the subframe with the glottal-shape codebook */ - IF( GE_16( tc_subfr, L_SUBFR ) ) - { - Word16 tempr; - - SWAP( fixed_cdk_index[0], fixed_cdk_index[tc_subfr / L_SUBFR] ); - - /* TRANSITION coding: allocate second highest FCBQ bit-budget to the last subframe */ - IF( idiv1616( tc_subfr, L_SUBFR ) < sub( nb_subfr, 1 ) ) - { - SWAP( fixed_cdk_index[( tc_subfr - L_SUBFR ) / L_SUBFR], fixed_cdk_index[nb_subfr - 1] ); - } - } - - /* when subframe length > L_SUBFR, number of bits instead of codebook index is signalled */ - IF( GT_16( L_subfr, L_SUBFR ) ) - { - Word16 i, j; - FOR( i = 0; i < nb_subfr; i++ ) - { - j = fixed_cdk_index[i]; - move16(); - fixed_cdk_index[i] = fast_FCB_bits_2sfr[j]; - move16(); - } - } - - return error; -} -#endif -static ivas_error acelp_FCB_allocator_ivas( +static ivas_error acelp_FCB_allocator_fx( Word16 *nBits, /* i/o: available bit-budget */ Word16 fixed_cdk_index[], /* o : codebook index Q0 */ Word16 nb_subfr, /* i : number of subframes */ @@ -754,1141 +592,16 @@ static ivas_error acelp_FCB_allocator_ivas( return error; } + /*-------------------------------------------------------------------* - * config_acelp1() + * config_acelp1_fx() * * Configure ACELP bit allocation * - should be in range of <6700; 24350> for ACELP@12.8kHz * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz *--------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES -ivas_error config_acelp1( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signalling_bits, /* i : number of signalling bits */ - const Word16 coder_type, /* i : coder type */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ -) -{ - Word16 i, bits, nb_subfr; - Word16 flag_hardcoded, coder_type_sw, fix_first; - Word32 core_brate; -#ifdef DEBUGGING - (void) active_cnt; -#endif - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - // PMT("Not floating point computation, but fixed point operator are still missing ") - /*-----------------------------------------------------------------* - * Set the flag indicating two-stage Unvoiced (UC) frame - *-----------------------------------------------------------------*/ - - *uc_two_stage_flag = 0; - move16(); - IF( EQ_16( coder_type, UNVOICED ) ) - { - test(); - test(); - test(); - test(); - test(); - if ( GE_32( total_brate, MIN_UNVOICED_TWO_STAGE_BRATE ) && element_mode > EVS_MONO && ( idchan == 0 || ( ( GE_32( total_brate, 8500 ) || extl_brate == 0 ) && EQ_16( tdm_LRTD_flag, 1 ) ) ) ) - { - *uc_two_stage_flag = 1; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Set the number of subframes - *-----------------------------------------------------------------*/ - - IF( EQ_16( L_frame, L_FRAME ) ) - { - nb_subfr = NB_SUBFR; - move16(); - -#ifdef DEBUGGING - if ( ( ( core_brate_inp < 5900 && coder_type > UNVOICED ) && !( core_brate_inp < MIN_TC_BRATE && coder_type == TRANSITION ) ) && !( idchan > 0 && element_mode == IVAS_CPE_TD ) && !( element_mode == IVAS_SCE && tdm_low_rate_mode ) ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bitrate (%d bps) for ACELP@12k8 in frame %d. Exiting!\n", core_brate_inp ); - } - - if ( core_brate_inp > ACELP_12k8_HIGH_LIMIT && core == ACELP_CORE ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too high bitrate (%d bps) for ACELP@12k8 in frame %d. Exiting!\n", core_brate_inp ); - } -#endif - } - ELSE /* L_frame == L_FRAME16k */ - { - nb_subfr = NB_SUBFR16k; - move16(); - -#ifdef DEBUGGING - if ( core_brate_inp < ACELP_16k_LOW_LIMIT && core == ACELP_CORE ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Too low bitrate (%d bps) for ACELP@16k in frame %d. Exiting!\n", core_brate_inp ); - } -#endif - } - - coder_type_sw = coder_type; - move16(); - IF( core != ACELP_CORE ) - { - /* used in acelp_core_switch_enc() */ - nb_subfr = 1; - move16(); - if ( EQ_16( L_frame, L_FRAME ) ) - { - coder_type_sw = TRANSITION; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Check if the core_brate is hard coded (to keep BE for mono core) or not - *-----------------------------------------------------------------*/ - - flag_hardcoded = 0; - move16(); - i = 0; - move16(); - - WHILE( i < SIZE_BRATE_INTERMED_TBL ) - { - IF( EQ_32( core_brate_inp, brate_intermed_tbl[i] ) ) - { - flag_hardcoded = 1; - move16(); - BREAK; - } - - IF( LT_32( core_brate_inp, brate_intermed_tbl[i] ) ) - { - flag_hardcoded = 0; - move16(); - BREAK; - } - - i = add( i, 1 ); - } - - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( coder_type, AUDIO ) && - LE_32( core_brate_inp, STEREO_GSC_BIT_RATE_ALLOC ) && EQ_32( brate_intermed_tbl[i], ACELP_9k60 ) ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ - { - i = sub( i, 1 ); - } - - core_brate = brate_intermed_tbl[i]; - move32(); - - if ( element_mode > EVS_MONO ) - { - flag_hardcoded = 0; /* use automatic and flexible ACELP bit-budget allocation */ - move16(); - } - - test(); - if ( ( core != ACELP_CORE ) && ( element_mode == EVS_MONO ) ) /* needed for mode1 core switching in EVS mono */ - { - flag_hardcoded = 1; - move16(); - } - - /*-----------------------------------------------------------------* - * ACELP bit allocation - *-----------------------------------------------------------------*/ - test(); - test(); - IF( !( EQ_16( coder_type, TRANSITION ) && NE_16( tc_subfr, -1 ) ) || EQ_16( enc_dec, DEC ) ) - { - /* Set the bit-budget */ - bits = extract_l( Mpy_32_32( core_brate_inp, ONE_BY_FRAMES_PER_SEC_Q31 ) ); // Q0 - - test(); - test(); - IF( EQ_16( coder_type, TRANSITION ) && EQ_16( enc_dec, DEC ) && EQ_16( tc_call, 1 ) ) - { - bits = add( bits, *nBits_es_Pred ); /* equalize for 4th signaling bit estimated at the encoder in TC_0_192 */ - } - - /* Subtract signalling bits */ - test(); - test(); - IF( EQ_16( enc_dec, DEC ) && EQ_16( idchan, 1 ) && element_mode > EVS_MONO ) - { - bits = sub( bits, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); - - IF( EQ_16( tdm_LRTD_flag, 1 ) ) - { - bits = add( bits, STEREO_BITS_TCA ); - } - - /* subtract TBE/BWE flag */ - test(); - test(); - test(); - test(); - test(); - test(); - IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) - { - bits = sub( bits, 1 ); - } - } - ELSE - { - /* Subtract signalling bits */ - bits = sub( bits, signalling_bits ); - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( extl_brate > 0 && ( EQ_16( extl, WB_TBE ) || EQ_16( extl, SWB_TBE ) || EQ_16( extl, FB_TBE ) || EQ_16( extl, WB_BWE ) || EQ_16( extl, SWB_BWE ) || EQ_16( extl, FB_BWE ) ) ) - { - /* extension layer signalling bit is counted in the extension layer bitbudget */ - bits = add( bits, 1 ); - } - - /*-----------------------------------------------------------------* - * LSF Q bit-budget - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - IF( !tdm_lp_reuse_flag || idchan == 0 ) - { - /* LSF Q bit-budget */ - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - - IF( !flag_hardcoded ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) - { - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - } - ELSE IF( ( LT_32( total_brate, 7200 ) || coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( idchan, 1 ) ) - { - /* TD stereo, secondary channel: do nothing */ - acelp_cfg->lsf_bits = LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - } - ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) && LT_32( brate_intermed_tbl[i], ACELP_9k60 ) ) - { - /* primary channel: do nothing */ - } - ELSE IF( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] >= ACELP_9k60*/ ) - { - acelp_cfg->lsf_bits = 42; - move16(); - } - ELSE IF( LE_32( total_brate, 9600 ) || EQ_16( coder_type, UNVOICED ) ) - { - acelp_cfg->lsf_bits = 31; - move16(); - } - ELSE IF( LE_32( total_brate, 20000 ) ) - { - acelp_cfg->lsf_bits = 36; - move16(); - } - ELSE - { - acelp_cfg->lsf_bits = 41; - move16(); - } - } - ELSE /* L_frame == L_FRAME16k */ - { - acelp_cfg->lsf_bits = 41; - move16(); - } - } - - bits = sub( bits, acelp_cfg->lsf_bits ); - - /* mid-LSF Q bit-budget */ - acelp_cfg->mid_lsf_bits = mid_LSF_bits_tbl[LSF_BIT_ALLOC_IDX_fx( core_brate, coder_type )]; - move16(); - - test(); - if ( element_mode > EVS_MONO && EQ_16( coder_type, AUDIO ) /*&& brate_intermed_tbl[i] < ACELP_9k60*/ ) - { - acelp_cfg->mid_lsf_bits = 5; - move16(); - /* primary channel: do nothing */ - } - - bits = sub( bits, acelp_cfg->mid_lsf_bits ); - } - ELSE IF( EQ_16( tdm_lp_reuse_flag, 1 ) && EQ_16( idchan, 1 ) && NE_16( active_cnt, 1 ) ) - { - bits = sub( bits, TDM_IC_LSF_PRED_BITS ); - } - /* gain Q bit-budget - part 1: 'Es_pred' of memory-less gain Q */ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( NE_16( coder_type, UNVOICED ) && NE_16( coder_type, AUDIO ) && coder_type != INACTIVE && !( LE_32( core_brate, ACELP_8k00 ) && NE_16( coder_type, TRANSITION ) ) ) /* mid bitrates in GC and VC, low+mid bitrates in TC */ || - ( coder_type == INACTIVE && !inactive_coder_type_flag ) /* AVQ inactive */ - ) - { - *nBits_es_Pred = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, -1 )]; - move16(); - bits = sub( bits, *nBits_es_Pred ); - } - ELSE IF( *uc_two_stage_flag ) - { - *nBits_es_Pred = 4; - move16(); - bits = sub( bits, *nBits_es_Pred ); - } - } - ELSE - { - bits = *unbits; - move16(); - } - - test(); - IF( EQ_16( coder_type, TRANSITION ) && tc_call == 0 ) - { - *unbits = bits; - return error; - } - - /*-----------------------------------------------------------------* - * Low-rate mode - bits are allocated in tdm_low_rate_enc() - *-----------------------------------------------------------------*/ - test(); - IF( EQ_16( element_mode, IVAS_SCE ) && tdm_low_rate_mode ) - { - acelp_cfg->FEC_mode = 0; - acelp_cfg->ltf_mode = FULL_BAND; - *nBits_es_Pred = 0; - *unbits = 0; - acelp_cfg->ubits = 0; - move16(); - move16(); - move16(); - move16(); - move16(); - - return error; - } - - /*-----------------------------------------------------------------* - * Supplementary information for FEC - *-----------------------------------------------------------------*/ - - acelp_cfg->FEC_mode = 0; - move16(); - test(); - test(); - IF( GE_32( core_brate, ACELP_11k60 ) && ( idchan == 0 || element_mode == EVS_MONO ) ) - { - acelp_cfg->FEC_mode = 1; - move16(); - - test(); - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) && NE_16( coder_type, VOICED ) ) - { - bits = sub( bits, FEC_BITS_CLS ); - } - - IF( NE_16( coder_type, TRANSITION ) ) - { - IF( GE_32( total_brate, ACELP_16k40 ) ) - { - acelp_cfg->FEC_mode = 2; - move16(); - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) - { - bits = sub( bits, FEC_BITS_ENR ); - } - } - - IF( GE_32( total_brate, ACELP_32k ) ) - { - acelp_cfg->FEC_mode = 3; - move16(); - - test(); - IF( GT_16( coder_type, UNVOICED ) && LT_16( coder_type, AUDIO ) ) - { - bits = sub( bits, FEC_BITS_POS ); - } - } - } - } - - /*-----------------------------------------------------------------* - * LP filtering of the adaptive excitation - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( idchan > 0 && element_mode > EVS_MONO ) - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE IF( EQ_16( coder_type, UNVOICED ) ) - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) && LT_32( core_brate, ACELP_11k60 ) ) - { - acelp_cfg->ltf_mode = LOW_PASS; - move16(); - } - ELSE IF( GE_32( core_brate, ACELP_11k60 ) && ( NE_16( coder_type, AUDIO ) && !( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME ) ) ) ) - { - test(); - test(); - IF( coder_type == INACTIVE && EQ_16( L_frame, L_FRAME16k ) && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - ELSE - { - acelp_cfg->ltf_mode = NORMAL_OPERATION; - move16(); - IF( coder_type != TRANSITION ) - { - bits = sub( bits, nb_subfr ); - } - } - } - ELSE - { - acelp_cfg->ltf_mode = FULL_BAND; - move16(); - } - - /*-----------------------------------------------------------------* - * UC bit-budget - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_9k60 ) ) ) && ( idchan == 0 || element_mode == EVS_MONO ) ) - { - bits = sub( bits, NBITS_NOISENESS ); /* noiseness */ - } - IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) - { - bits = sub( bits, 3 * NB_SUBFR ); /* tilt factor */ - } - - /*-----------------------------------------------------------------* - * TC bit-budget - *-----------------------------------------------------------------*/ - - fix_first = 0; - move16(); - IF( EQ_16( coder_type, TRANSITION ) ) - { - if ( EQ_16( tc_call, 2 ) ) - { - fix_first = 1; - move16(); - } - - /* TC signalling */ - IF( EQ_16( L_frame, L_FRAME ) ) - { - IF( EQ_16( tc_subfr, TC_0_0 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 1 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 3 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_64 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 3 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_128 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 2 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, TC_0_192 ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 3 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, 1 ); /* LP filtering flag */ - } - } - ELSE IF( EQ_16( tc_subfr, L_SUBFR ) ) - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 3 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, idiv1616( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - } - ELSE - { - IF( enc_dec == ENC ) - { - bits = sub( bits, 4 ); /* TC signalling */ - } - - IF( EQ_16( acelp_cfg->ltf_mode, NORMAL_OPERATION ) ) - { - bits = sub( bits, idiv1616_1( sub( L_FRAME - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - } - } - ELSE /* L_frame == L_FRAME16k */ - { - IF( enc_dec == ENC ) - { - IF( LE_16( tc_subfr, 2 * L_SUBFR ) ) - { - bits = sub( bits, 2 ); /* TC signalling */ - } - ELSE - { - bits = sub( bits, 3 ); /* TC signalling */ - } - } - - // bits -= ( L_FRAME16k - tc_subfr - L_SUBFR ) / L_SUBFR; /* LP filtering flag */ - bits = sub( bits, idiv1616_1( sub( L_FRAME16k - L_SUBFR, tc_subfr ), L_SUBFR ) ); /* LP filtering flag */ - } - - /* glottal-shape codebook bits */ - bits = sub( bits, 3 + 6 + 1 + 3 ); - } - - /*-----------------------------------------------------------------* - * pitch, innovation, gains bit-budget - *-----------------------------------------------------------------*/ - - acelp_cfg->fcb_mode = 0; - move16(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) && EQ_16( tdm_low_rate_mode, 1 ) && ( coder_type != INACTIVE ) && NE_16( coder_type, UNVOICED ) ) /* GENERIC low rate mode for secondary channel */ - { - set16_fx( acelp_cfg->pitch_bits, 0, NB_SUBFR16k ); - set16_fx( acelp_cfg->gains_mode, 0, NB_SUBFR16k ); - - FOR( i = 0; i < 2; i++ ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - IF( tdm_Pitch_reuse_flag == 0 ) - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( 2 * L_SUBFR, i ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - bits = sub( bits, acelp_cfg->pitch_bits[i] ); - } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, GENERIC, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - bits = sub( bits, acelp_cfg->gains_mode[i] ); - } - acelp_cfg->fcb_mode = 1; - move16(); - -#ifdef DEBUGGING - if ( bits >= 55 ) - { - printf( "too much bits -> %d, LPC = %d and pitch = %d\n", bits, tdm_lp_reuse_flag, tdm_Pitch_reuse_flag ); - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - } - else -#endif - IF( GE_16( bits, 16 ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - } - ELSE - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - } - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || /* @12.8kHz core except of GSC */ - ( EQ_16( nb_subfr, NB_SUBFR16k ) && ( !inactive_coder_type_flag || coder_type != INACTIVE ) ) /* @16kHz core GC, TC, AVQ inactive */ || - EQ_16( core, HQ_CORE ) /* ACELP -> HQ switching in EVS */ - ) - { - /* pitch Q & gain Q bit-budget - part 2*/ - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - test(); - IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE /* L_frame == L_FRAME16k */ - { - test(); - IF( EQ_16( tdm_Pitch_reuse_flag, 1 ) && EQ_16( idchan, 1 ) ) - { - acelp_cfg->pitch_bits[i] = 0; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - acelp_cfg->gains_mode[i] = gain_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type_sw, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - - bits = sub( bits, acelp_cfg->pitch_bits[i] ); - - test(); - IF( coder_type == INACTIVE && EQ_16( acelp_cfg->gains_mode[i], 6 ) /* VQ vs. SQ threshold @32 kbps */ ) - { - bits = sub( bits, 5 ); - } - ELSE - { - if ( EQ_16( *uc_two_stage_flag, 1 ) ) - { - acelp_cfg->gains_mode[i] = 7; - move16(); - } - - bits = sub( bits, acelp_cfg->gains_mode[i] ); - } - } - - /* algebraic codebook bit-budget */ - test(); - test(); - test(); - test(); - test(); - test(); - IF( flag_hardcoded /* EVS */ || - ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || - ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) - { - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE /* L_frame == L_FRAME16k */ - { - acelp_cfg->fixed_cdk_index[i] = FCB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - } - bits = sub( bits, acelp_cfg->fixed_cdk_index[i] ); - } - } - ELSE IF( !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) - { - test(); - IF( EQ_16( coder_type, UNVOICED ) && !( *uc_two_stage_flag ) ) - { - i = idiv1616( bits, NB_SUBFR ); - IF( s_and( i, 1 ) == 0 ) - { - i = sub( i, 1 ); /* must be odd */ - } - i = s_min( i, 13 ); -#ifdef DEBUG_MODE_TD - if ( i < 0 ) - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR::: UC negative index should not happen at frame %d\n" ); -#endif - i = s_max( i, 0 ); /* If i == 0-> random noise generator will be used as FCB */ - set16_fx( acelp_cfg->fixed_cdk_index, i, NB_SUBFR ); - bits = sub( bits, i_mult( i, NB_SUBFR ) ); - } - ELSE - { - - acelp_cfg->fcb_mode = 1; - move16(); - test(); - test(); - IF( EQ_16( element_mode, IVAS_CPE_TD ) ) - { - IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), ( nb_subfr ) ) ) ) /* enough bits for all fcb */ - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 1 ) ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr - 1, L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( GE_16( bits, i_mult( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 2 ) ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; - move16(); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE IF( GE_16( bits, ACELP_FIXED_CDK_BITS( 0 ) ) ) - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); - acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; - move16(); - acelp_cfg->fixed_cdk_index[0] = -1; - move16(); - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - ELSE /* No FCB */ - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "WARNING!!!, No bit allocated to FCB, check frame %d\n" ); -#endif - acelp_cfg->fixed_cdk_index[0] = -1; - move16(); - acelp_cfg->fixed_cdk_index[1] = -1; - move16(); - acelp_cfg->fixed_cdk_index[2] = -1; - move16(); - acelp_cfg->fixed_cdk_index[3] = -1; - move16(); - } - } - ELSE IF( NE_16( element_mode, IVAS_CPE_TD ) && GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) - { - bits = 100; /* 9 kbps for fcb */ - move16(); - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - ELSE - { - acelp_FCB_allocator( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); - } - } - } - - /* AVQ codebook */ - test(); - test(); - test(); - IF( ( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && coder_type != INACTIVE ) /* high-birate ACELP except IC */ || - ( !inactive_coder_type_flag && coder_type == INACTIVE ) /* AVQ inactive */ ) - { - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( flag_hardcoded ) - { - acelp_cfg->AVQ_cdk_bits[i] = AVQ_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( core_brate, coder_type, i_mult( i, L_SUBFR ), TC_SUBFR2IDX_16KHZ_fx( tc_subfr ) )]; - move16(); - { - bits = sub( bits, acelp_cfg->AVQ_cdk_bits[i] ); - } - } - - bits = sub( bits, G_AVQ_BITS ); - } - - test(); - test(); - IF( GE_32( core_brate_inp, MIN_BRATE_AVQ_EXC ) && LE_32( core_brate_inp, MAX_BRATE_AVQ_EXC_TD ) && EQ_16( coder_type, GENERIC ) ) - { - /* harm. flag ACELP AVQ */ - bits = sub( bits, 1 ); - } - - IF( !flag_hardcoded ) - { - Word16 bit_tmp; - - bit_tmp = idiv1616( bits, nb_subfr ); - set16_fx( acelp_cfg->AVQ_cdk_bits, bit_tmp, nb_subfr ); - bits = sub( bits, i_mult( bit_tmp, nb_subfr ) ); - - bit_tmp = bits % nb_subfr; - move16(); - acelp_cfg->AVQ_cdk_bits[0] = add( acelp_cfg->AVQ_cdk_bits[0], bit_tmp ); - move16(); - bits = sub( bits, bit_tmp ); - } - } - } - ELSE IF( ( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) /* LBR secondary channel in TD stereo */ || - ( ( coder_type == INACTIVE || EQ_16( coder_type, AUDIO ) ) && EQ_16( nb_subfr, NB_SUBFR ) ) /* GSC @12.8kHz */ || - ( coder_type == INACTIVE && inactive_coder_type_flag ) /* AVQ inactive */ ) - { - Word32 Local_BR, Pitch_BR; - Word16 Pitch_CT; - - /* as defined at the beginning of [enc,dec]_pit_exc() */ - test(); - test(); - IF( GSC_IVAS_mode > 0 && ( GSC_noisy_speech || GT_32( core_brate, GSC_H_RATE_STG ) ) ) - { - Local_BR = ACELP_8k00; - move32(); - Pitch_CT = GENERIC; - move16(); - Pitch_BR = ACELP_8k00; - move32(); - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - Local_BR = ACELP_14k80; - move32(); - test(); - if ( GSC_IVAS_mode > 0 && LT_32( core_brate, IVAS_24k4 ) ) - { - Local_BR = ACELP_9k60; - move32(); - } - Pitch_BR = core_brate; - move32(); - } - } - ELSE IF( GSC_noisy_speech ) - { - Local_BR = ACELP_7k20; - move32(); - Pitch_CT = GENERIC; - move16(); - Pitch_BR = ACELP_7k20; - move32(); - if ( EQ_16( L_frame, L_FRAME16k ) ) - { - Pitch_BR = core_brate; - move32(); - } - } - ELSE - { - Local_BR = ACELP_7k20; - move32(); - Pitch_CT = AUDIO; - move16(); - Pitch_BR = core_brate; - move32(); - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - Local_BR = ACELP_13k20; - move32(); - Pitch_CT = GENERIC; - move16(); - } - } - - FOR( i = 0; i < nb_subfr; i++ ) - { - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - acelp_cfg->pitch_bits[i] = ACB_bits_16kHz_tbl[BIT_ALLOC_IDX_16KHZ_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - } - ELSE - { - acelp_cfg->pitch_bits[i] = ACB_bits_tbl[BIT_ALLOC_IDX_fx( Pitch_BR, Pitch_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->fixed_cdk_index[i] = FCB_bits_tbl[BIT_ALLOC_IDX_fx( Local_BR, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - acelp_cfg->gains_mode[i] = gain_bits_tbl[BIT_ALLOC_IDX_fx( ACELP_7k20, LOCAL_CT, i_mult( i, L_SUBFR ), 0 )]; - move16(); - } - } - } - - test(); - test(); - test(); - IF( EQ_16( coder_type, TRANSITION ) && ( EQ_16( tc_call, 1 ) && tc_subfr == 0 && EQ_16( L_frame, L_FRAME ) ) ) - { - return error; - } - - /*-----------------------------------------------------------------* - * unused bits handling - *-----------------------------------------------------------------*/ - - acelp_cfg->ubits = 0; /* these bits could be reused for something else */ - move16(); - - test(); - IF( flag_hardcoded && NE_32( core_brate, PPP_NELP_2k80 ) ) - { - test(); - test(); - /* unused bits */ - IF( EQ_16( coder_type, AUDIO ) || ( coder_type == INACTIVE && LE_32( core_brate, ACELP_24k40 ) ) ) - { - acelp_cfg->ubits = 0; - move16(); - } - ELSE IF( EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->ubits = reserved_bits_tbl[BIT_ALLOC_IDX_fx( core_brate, coder_type, -1, TC_SUBFR2IDX_fx( tc_subfr ) )]; - move16(); - } - ELSE - { - acelp_cfg->ubits = 0; - move16(); - } - - bits = sub( bits, acelp_cfg->ubits ); - } - - /* sanity check */ - test(); - test(); - test(); - IF( ( coder_type != INACTIVE && EQ_16( nb_subfr, NB_SUBFR ) && NE_16( coder_type, AUDIO ) ) || EQ_16( nb_subfr, NB_SUBFR16k ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_16( L_frame, L_FRAME16k ) && coder_type == INACTIVE && inactive_coder_type_flag ) /* GSC Inactive @16kHz */ || - ( GSC_IVAS_mode > 0 && EQ_16( L_frame, L_FRAME16k ) ) ) /* IVAS GSC @16kHz */ - { - acelp_cfg->ubits = 0; - move16(); - } - ELSE IF( flag_hardcoded && core == ACELP_CORE && bits != 0 ) - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); -#endif - } - ELSE IF( bits > 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) - { - test(); - test(); - test(); - test(); - IF( idchan > 0 && EQ_16( element_mode, IVAS_CPE_TD ) ) - { - IF( !tdm_lp_reuse_flag ) - { - acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ - move16(); - bits = 0; - move16(); - } - ELSE - { - Word16 nb_prm = 4; - move16(); - if ( EQ_16( tdm_low_rate_mode, 1 ) ) - { - nb_prm = 2; - move16(); - } - /* First add remaining bits on gains */ - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode ) ); - - /* Then, Increase pitch bit budget */ - test(); - IF( tdm_Pitch_reuse_flag == 0 && bits > 0 ) - { - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits ) ); - } - - /* Increase mid-lsf bit budget */ - test(); - IF( tdm_lp_reuse_flag == 0 && bits > 0 ) - { - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits ) ); - bits = sub( bits, allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ) ); - } - } - -#ifdef DEBUGGING - if ( idchan > 0 && bits > 0 && ( coder_type > UNVOICED || tdm_low_rate_mode == 0 ) ) - { - IVAS_ERROR( IVAS_ERR_INTERNAL, "WARNING !! Unused bits in secondary channel at frame %d\n" ); - } -#endif - } - - ELSE IF( core == ACELP_CORE && GE_16( coder_type, UNVOICED ) && LE_16( coder_type, GENERIC ) && EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->lsf_bits = add( acelp_cfg->lsf_bits, bits ); /* increase LSF Q bits */ - move16(); - - test(); - IF( GT_16( acelp_cfg->lsf_bits, 46 ) ) - { - acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 46 ); - move16(); - acelp_cfg->lsf_bits = 46; - move16(); - } - ELSE IF( GT_16( acelp_cfg->lsf_bits, 42 ) && EQ_16( L_frame, L_FRAME ) ) - { - acelp_cfg->ubits = sub( acelp_cfg->lsf_bits, 42 ); - move16(); - acelp_cfg->lsf_bits = 42; - move16(); - } - } - ELSE - { - acelp_cfg->ubits = bits; - move16(); - } - } - ELSE IF( bits < 0 && !( EQ_16( coder_type, UNVOICED ) && EQ_16( tdm_low_rate_mode, 1 ) && EQ_16( element_mode, IVAS_CPE_TD ) ) ) - { -#ifdef DEBUGGING - IVAS_ERROR( IVAS_ERR_INTERNAL, "ERROR: bit-budget incorrect (%d bits) in frame %d.\n", (Word32) bits ); -#endif - } - } - - return error; -} - -/*-------------------------------------------------------------------* - * config_acelp1_IVAS() - * - * Configure ACELP bit allocation - * - should be in range of <6700; 24350> for ACELP@12.8kHz - * - per channel bitrate minimum is 13250 kbps for ACELP@16kHz - *--------------------------------------------------------------------*/ -#endif -ivas_error config_acelp1_IVAS( +ivas_error config_acelp1_fx( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ const Word32 core_brate_inp, /* i : core bitrate */ @@ -2511,11 +1224,11 @@ ivas_error config_acelp1_IVAS( IF( GE_16( bits, 16 ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); } ELSE { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 2, 2 * L_SUBFR, GENERIC, -1, 0 ); acelp_cfg->fixed_cdk_index[1] = -1; move16(); } @@ -2634,17 +1347,17 @@ ivas_error config_acelp1_IVAS( { IF( GE_16( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), nb_subfr ) ) ) /* enough bits for all fcb */ { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } ELSE IF( GE_16( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 1 ) ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 1 ), L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 1 ), L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[3] = -1; move16(); } ELSE IF( GE_32( bits, imult1616( ACELP_FIXED_CDK_BITS( 0 ), sub( nb_subfr, 2 ) ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, sub( nb_subfr, 2 ), L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[2] = acelp_cfg->fixed_cdk_index[1]; move16(); acelp_cfg->fixed_cdk_index[1] = -1; @@ -2654,7 +1367,7 @@ ivas_error config_acelp1_IVAS( } ELSE IF( GE_32( bits, ACELP_FIXED_CDK_BITS( 0 ) ) ) { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, 1, L_SUBFR, coder_type, tc_subfr, fix_first ); acelp_cfg->fixed_cdk_index[1] = acelp_cfg->fixed_cdk_index[0]; move16(); acelp_cfg->fixed_cdk_index[0] = -1; @@ -2680,11 +1393,11 @@ ivas_error config_acelp1_IVAS( { bits = 100; /* 9 kbps for fcb */ move16(); - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } ELSE { - acelp_FCB_allocator_ivas( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); + acelp_FCB_allocator_fx( &bits, acelp_cfg->fixed_cdk_index, nb_subfr, L_SUBFR, coder_type, tc_subfr, fix_first ); } } } diff --git a/lib_com/gs_inact_switching_fx.c b/lib_com/gs_inact_switching_fx.c index 582fd3c8a..119811275 100644 --- a/lib_com/gs_inact_switching_fx.c +++ b/lib_com/gs_inact_switching_fx.c @@ -33,144 +33,24 @@ /*------------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ /*------------------------------------------------------------------------*/ - /*------------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* _ None */ /*========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES -void Inac_swtch_ematch_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ - const Word16 L_frame, /* i : Frame lenght */ - const Word32 core_brate, /* i : Core bit rate */ - const Word16 Q_exc /* i : input and output format of exc2 */ - , - const Word16 bfi /* i : frame lost indicator */ - , - const Word16 last_core, /* i : Last core used */ - const Word16 last_codec_mode /* i : Last codec mode */ -) -{ - Word16 Ener_per_bd[MBANDS_GN]; - Word16 ftmp; - Word16 *pt_exc; - Word16 j, i; - - Word16 exp, frac; - Word32 L_tmp; - - /*-------------------------------------------------------------------------- - * average energy per band - *--------------------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( coder_type, AUDIO ) && bfi == 0 ) - { - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* reset long-term energy per band */ - FOR( i = 0; i < MBANDS_GN; i++ ) - { - lt_ener_per_band[i] = Ener_per_bd[i]; - move16(); - } - } - ELSE IF( EQ_16( coder_type, VOICED ) || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || ( last_core != ACELP_CORE ) || NE_16( last_codec_mode, MODE1 ) ) - { - /* Find spectrum and energy per band for GC and VC frames */ - edct_16fx( exc2, dct_exc_tmp, L_frame, 5, EVS_MONO ); - - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* reset long-term energy per band */ - FOR( i = 0; i < MBANDS_GN; i++ ) - { - lt_ener_per_band[i] = Ener_per_bd[i]; - move16(); - } - } - ELSE IF( ( coder_type == INACTIVE ) && LE_32( core_brate, ACELP_24k40 ) ) - { - /* Find spectrum and energy per band for inactive frames */ - edct_16fx( exc2, dct_exc_tmp, L_frame, 5, EVS_MONO ); - Ener_per_band_comp_fx( dct_exc_tmp, Ener_per_bd, Q_exc, MBANDS_GN, 1 ); - - /* More agressive smoothing in the first 50 frames */ - pt_exc = dct_exc_tmp; - move16(); - FOR( i = 0; i < MBANDS_GN; i++ ) - { - /* Compute smoothing gain to apply with gain limitation */ - L_tmp = L_mult( ALPHA0_FX, lt_ener_per_band[i] ); /*Q(15+12+1)=Q(28) */ - L_tmp = L_mac( L_tmp, BETA0_FX, Ener_per_bd[i] ); /*Q28 */ - lt_ener_per_band[i] = round_fx( L_tmp ); /*Q12 */ - move16(); - - ftmp = sub( lt_ener_per_band[i], Ener_per_bd[i] ); /*Q12 */ - - /* ftmp = (float)pow(10, ftmp);= pow(2,3.321928*ftmp);*/ - - L_tmp = L_mult( 27213, ftmp ); /*Q(13+12+1)=Q26 ; 27213=3.321928 in Q13 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp ); /* Extract exponent of ftmp */ - ftmp = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - - exp = sub( exp, 14 ); - IF( LT_16( i, 2 ) ) - { - FOR( j = 0; j < 8; j++ ) - { - L_tmp = L_mult( *pt_exc, ftmp ); /* Q_exc*Q0 -> Q(Q_exc+1) */ - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); - move16(); - pt_exc++; - } - } - ELSE - { - FOR( j = 0; j < 16; j++ ) - { - L_tmp = L_mult( *pt_exc, ftmp ); /* Q_exc*Q0 -> Q(Q_exc+1) */ - L_tmp = L_shl_sat( L_tmp, add( exp, 15 ) ); /* Q(Q_exc+1) -> Q(16+Q_exc)*/ - *pt_exc = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - pt_exc++; - } - } - } - - /* Going back to time */ - edct_16fx( dct_exc_tmp, exc2, L_frame, 5, EVS_MONO ); - } - - return; -} -#endif -void Inac_switch_ematch_ivas_fx( +void Inac_switch_ematch_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ const Word16 coder_type, /* i : Coding mode */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ + const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ const Word16 L_frame, /* i : Frame lenght */ const Word16 Q_exc, /* i : input and output format of exc2 */ const Word16 bfi, /* i : frame lost indicator */ const Word16 last_core, /* i : Last core used */ const Word16 last_codec_mode, /* i : Last codec mode */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ - const Word16 element_mode /* i : element mode */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 element_mode /* i : element mode */ ) { Word16 Ener_per_bd[MBANDS_GN16k]; @@ -251,7 +131,6 @@ void Inac_switch_ematch_ivas_fx( exp = sub( exp, 14 ); IF( LT_16( i, 2 ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( element_mode, EVS_MONO ) ) { FOR( j = 0; j < 8; j++ ) @@ -264,7 +143,6 @@ void Inac_switch_ematch_ivas_fx( } } ELSE -#endif { FOR( j = 0; j < 8; j++ ) { @@ -278,7 +156,6 @@ void Inac_switch_ematch_ivas_fx( } ELSE { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( element_mode, EVS_MONO ) ) { FOR( j = 0; j < 16; j++ ) @@ -291,7 +168,6 @@ void Inac_switch_ematch_ivas_fx( } } ELSE -#endif { FOR( j = 0; j < 16; j++ ) { @@ -306,9 +182,7 @@ void Inac_switch_ematch_ivas_fx( } /* Going back to time */ -#ifdef REMOVE_EVS_DUPLICATES IF( GT_16( element_mode, EVS_MONO ) ) -#endif { Scale_sig( dct_exc_tmp, 240, 1 ); // Q_exc Scale_sig( exc2, 240, 1 ); // Q_exc diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 1198fb793..208f20569 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -1332,8 +1332,6 @@ void highband_exc_dct_in_ivas_fx( } } - -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( element_mode, EVS_MONO ) ) { Comp_and_apply_gain_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, *Q_exc ); @@ -1346,7 +1344,6 @@ void highband_exc_dct_in_ivas_fx( } ELSE { -#endif Word16 Q_tmp = *Q_exc; move16(); Word16 Q_old = *Q_exc; @@ -1373,9 +1370,7 @@ void highband_exc_dct_in_ivas_fx( { Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); } -#ifdef REMOVE_EVS_DUPLICATES } -#endif /*--------------------------------------------------------------------------------------* * add the correction layer to the LF bins, @@ -1416,13 +1411,10 @@ void highband_exc_dct_in_ivas_fx( Q_hb_exc = 0; move16(); envelop_modify_fx( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ, *Q_exc, &Q_hb_exc ); -#ifdef REMOVE_EVS_DUPLICATES + test(); test(); IF( GT_16( *Q_exc, Q_hb_exc ) && GT_16( element_mode, EVS_MONO ) && exc_wo_nf != NULL ) -#else - IF( GT_16( *Q_exc, Q_hb_exc ) ) -#endif { Scale_sig( exc_wo_nf, L_frame, sub( Q_hb_exc, *Q_exc ) ); *Q_exc = Q_hb_exc; diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 48a28a397..e6afe35a2 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -3973,7 +3973,7 @@ ivas_error ivas_core_dec_fx( const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); -void decod_gen_2sbfr_ivas_fx( +void decod_gen_2sbfr_fx( Decoder_State *st, /* i/o: decoder static memory */ const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ const Word16 *Aq, /* i : LP filter coefficient Q12*/ diff --git a/lib_com/lsf_tools_fx.c b/lib_com/lsf_tools_fx.c index d60d0e999..a41e10713 100644 --- a/lib_com/lsf_tools_fx.c +++ b/lib_com/lsf_tools_fx.c @@ -2863,40 +2863,39 @@ Word16 qlsf_ARSN_tcvq_Dec_16k_fx( } /*======================================================================*/ -/* FUNCTION : lsf_syn_mem_backup_fx */ +/* FUNCTION : lsf_syn_mem_backup_fx */ /*----------------------------------------------------------------------*/ /* PURPOSE : back-up synthesis filter memory and LSF qunatizer memories */ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*) lsp_new : LSP vector to quantize */ -/* _ (Word16*) lsf_new : quantized LSF vector */ -/* _ (Word16*) lsp_mid : mid-frame LSP vector */ -/* _ (Encoder_State) st_fx : Encoder state Structure */ -/*-----------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16) clip_var : pitch clipping state var */ -/* _ (Word16*) mem_AR : quantizer memory for AR model */ -/* _ (Word16*) mem_MA : quantizer memory for MA model */ -/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ -/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ -/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ +/* INPUT ARGUMENTS : */ +/* _ (Word16*) lsp_new : LSP vector to quantize */ +/* _ (Word16*) lsf_new : quantized LSF vector */ +/* _ (Word16*) lsp_mid : mid-frame LSP vector */ +/* _ (Encoder_State) st_fx : Encoder state Structure */ +/*----------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16) clip_var : pitch clipping state var */ +/* _ (Word16*) mem_AR : quantizer memory for AR model */ +/* _ (Word16*) mem_MA : quantizer memory for MA model */ +/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ +/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ +/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ /* _ (Word16) mCb1 :counter for stationary frame after a transition frame */ -/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ -/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ -/* _ (Word16*) mem_syn_bck : synthesis filter memory */ -/* _ (Word16) mem_w0_bck : memory of the weighting filter */ -/* _ (Word16) streaklimit : LSF quantizer */ -/* _ (Word16) pstreaklen : LSF quantizer */ -/*-----------------------------------------------------------------------*/ - -/* _ None */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ +/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ +/* _ (Word16*) mem_syn_bck : synthesis filter memory */ +/* _ (Word16) mem_w0_bck : memory of the weighting filter */ +/* _ (Word16) streaklimit : LSF quantizer */ +/* _ (Word16) pstreaklen : LSF quantizer */ +/*----------------------------------------------------------------------*/ +/* _ None */ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ void lsf_syn_mem_backup_fx( Encoder_State *st_fx, /* o: state structure */ @@ -2904,23 +2903,22 @@ void lsf_syn_mem_backup_fx( Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* i: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* i: */ - - Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ - Word16 *lsf_new, /* i: quantized LSF vector Q15 */ - Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* i: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* i: quantizer memory for AR model 2.56 */ - Word16 *mem_MA, /* i: quantizer memory for MA model 2.56 */ - Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ - Word16 *lsf_new_bck, /* o: quantized LSF vector - backup Q15 */ - Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ - Word16 *mCb1, /* o: counter for stationary frame after a transition frame */ - Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets q_bin */ - Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets q_bin */ - Word16 *mem_syn_bck, /* i: synthesis filter memory q */ - Word16 *mem_w0_bck, /* i: memory of the weighting filter q */ - Word16 *streaklimit, /* i:LSF quantizer Q15 */ - Word16 *pstreaklen /* i:LSF quantizer */ + Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ + Word16 *lsf_new, /* i: quantized LSF vector Q15 */ + Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* i: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* i: quantizer memory for AR model 2.56 */ + Word16 *mem_MA, /* i: quantizer memory for MA model 2.56 */ + Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ + Word16 *lsf_new_bck, /* o: quantized LSF vector - backup Q15 */ + Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ + Word16 *mCb1, /* o: counter for stationary frame after a transition frame */ + Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets q_bin */ + Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets q_bin */ + Word16 *mem_syn_bck, /* i: synthesis filter memory q */ + Word16 *mem_w0_bck, /* i: memory of the weighting filter q */ + Word16 *streaklimit, /* i:LSF quantizer Q15 */ + Word16 *pstreaklen /* i:LSF quantizer */ ) { Word16 i; @@ -2985,25 +2983,31 @@ void lsf_syn_mem_backup_fx( return; } + +/*-------------------------------------------------------------------* + * lsf_syn_mem_backup_fx() + * + * + *--------------------------------------------------------------------*/ + void lsf_syn_mem_backup_ivas_fx( Encoder_State *st_fx, /* i: state structure */ Word16 *btilt_code_fx, /* i: tilt code Q15 */ Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* o: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* o: */ - - Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ - Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ - Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ - Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *streaklimit, /* Q15 */ + Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ + Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ + Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ + Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *streaklimit, /* Q15 */ Word16 *pstreaklen ) { Word16 i; @@ -3079,66 +3083,68 @@ void lsf_update_memory( move16(); mem_MA[i] = sub( sub( qlsf[i], lsf_means[narrowband][i] ), mult_r( MU_MA_FX, old_mem_MA[i] ) ); } + + return; } + /*======================================================================*/ -/* FUNCTION : lsf_syn_mem_restore_fx */ +/* FUNCTION : lsf_syn_mem_restore_fx */ /*----------------------------------------------------------------------*/ /* PURPOSE : restore synthesis filter memory and LSF quantizer memories*/ /*----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) clip_var : pitch clipping state var */ -/* _ (Word16*) mem_AR : quantizer memory for AR model */ -/* _ (Word16*) mem_MA : quantizer memory for MA model */ -/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ -/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ -/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ +/* INPUT ARGUMENTS : */ +/* _ (Word16) clip_var : pitch clipping state var */ +/* _ (Word16*) mem_AR : quantizer memory for AR model */ +/* _ (Word16*) mem_MA : quantizer memory for MA model */ +/* _ (Word16*) lsp_new_bck : LSP vector to quantize- backup */ +/* _ (Word16*) lsf_new_bck : quantized LSF vector - backup */ +/* _ (Word16*) lsp_mid_bck : mid-frame LSP vector - backup */ /* _ (Word16) mCb1 :counter for stationary frame after a transition frame */ -/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ -/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ -/* _ (Word16*) mem_syn_bck : synthesis filter memory */ -/* _ (Word16) mem_w0_bck : memory of the weighting filter */ -/* _ (Word16) streaklimit : LSF quantizer */ -/* _ (Word16) pstreaklen : LSF quantizer */ -/*-----------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _None */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) lsp_new : LSP vector to quantize */ -/* _ (Word16*) lsf_new : quantized LSF vector */ -/* _ (Word16*) lsp_mid : mid-frame LSP vector */ -/* _ (Encoder_State) st_fx : Encoder state Structure */ -/*-----------------------------------------------------------------------*/ - -/* _ None */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*=======================================================================*/ +/* _ (Word32*) Bin_E : FFT Bin energy 128 *2 sets */ +/* _ (Word32*) Bin_E_old : FFT Bin energy 128 *2 sets */ +/* _ (Word16*) mem_syn_bck : synthesis filter memory */ +/* _ (Word16) mem_w0_bck : memory of the weighting filter */ +/* _ (Word16) streaklimit : LSF quantizer */ +/* _ (Word16) pstreaklen : LSF quantizer */ +/*----------------------------------------------------------------------*/ +/* INPUT/OUTPUT ARGUMENTS : */ +/* _None */ +/*----------------------------------------------------------------------*/ +/* OUTPUT ARGUMENTS : */ +/* _ (Word16*) lsp_new : LSP vector to quantize */ +/* _ (Word16*) lsf_new : quantized LSF vector */ +/* _ (Word16*) lsp_mid : mid-frame LSP vector */ +/* _ (Encoder_State) st_fx : Encoder state Structure */ +/*----------------------------------------------------------------------*/ +/* _ None */ +/*----------------------------------------------------------------------*/ +/* RETURN ARGUMENTS : */ +/* _ None */ +/*======================================================================*/ + void lsf_syn_mem_restore_fx( Encoder_State *st_fx, /* o: state structure */ Word16 btilt_code_fx, /* i: Q15 */ Word32 gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* i: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 next_force_sf_bck_fx, /* i: */ - - Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ - Word16 *lsf_new, /* o: quantized LSF vector Q15 */ - Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ - Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ - Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ - Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ - Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ - Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ - Word16 mCb1, /* i: counter for stationary frame after a transition frame */ - Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 streaklimit, /* i:LSF quantizer Q15 */ - Word16 pstreaklen /* i:LSF quantizer */ + Word16 *lsp_new, /* o: LSP vector to quantize Q15 */ + Word16 *lsf_new, /* o: quantized LSF vector Q15 */ + Word16 *lsp_mid, /* o: mid-frame LSP vector Q15 */ + Word16 clip_var, /* i: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* i: quantizer memory for AR model Q15 */ + Word16 *mem_MA, /* i: quantizer memory for MA model Q15 */ + Word16 *lsp_new_bck, /* i: LSP vector to quantize- backup Q15 */ + Word16 *lsf_new_bck, /* i: quantized LSF vector - backup Q15 */ + Word16 *lsp_mid_bck, /* i: mid-frame LSP vector - backup Q15 */ + Word16 mCb1, /* i: counter for stationary frame after a transition frame */ + Word32 *Bin_E, /* i: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* i: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* i: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 mem_w0_bck, /* i: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 streaklimit, /* i:LSF quantizer Q15 */ + Word16 pstreaklen /* i:LSF quantizer */ ) { Word16 i; diff --git a/lib_com/options.h b/lib_com/options.h index 921d05b1c..bcee4b8fe 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -99,10 +99,10 @@ #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ #define TEST_HR -#define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ #define FIX_1348_BIT_PRECISION_IMPROVEMENT #define FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN #define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD //#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF + #endif diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 36cb671cc..43010af04 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3284,52 +3284,33 @@ void synthesise_fb_high_band_fx( #endif ); -#ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate /* i :core bitrate */ -); -#endif - -void prep_tbe_exc_ivas_fx( - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 L_subfr, - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate, /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ -); - -Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ - const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ - Word16 *tilt_mem /* i/o: Tilt smoothing memory */ + const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + Word16 T0, /* i : integer pitch variables Q0 */ + Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ +); + +/*! r: Formant filter strength [0,1] */ +Word16 swb_formant_fac_fx( + const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ + Word16 *tilt_mem /* i/o: Tilt smoothing memory */ ); void wb_tbe_extras_reset_fx( @@ -4833,35 +4814,6 @@ Word16 BITS_ALLOC_config_acelp( const Word16 narrowband, const Word16 nb_subfr ); -#ifndef REMOVE_EVS_DUPLICATES -ivas_error config_acelp1( - const Word16 enc_dec, /* i : encoder/decoder flag */ - const Word32 total_brate, /* i : total bitrate */ - const Word32 core_brate_inp, /* i : core bitrate */ - const Word16 core, /* i : core */ - const Word16 extl, /* i : extension layer */ - const Word32 extl_brate, /* i : extension layer bitrate */ - const Word16 L_frame, /* i : frame length at internal Fs */ - const Word16 GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const Word16 signalling_bits, /* i : number of signalling bits */ - const Word16 coder_type, /* i : coder type */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ - const Word16 tc_subfr, /* i : TC subfr ID */ - const Word16 tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - Word16 *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - Word16 *unbits, /* o : number of unused bits */ - const Word16 element_mode, /* i : element mode */ - Word16 *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag (can be 1 only with secondary channel */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const Word16 idchan, /* i : stereo channel ID */ - const Word16 active_cnt, /* i : Active frame counter */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag*/ - const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ -); -#endif Word16 set_ACELP_flag( const Word16 element_mode, /* i : element mode */ const Word32 element_brate, /* i : element bitrate */ @@ -5808,35 +5760,19 @@ void tcx_ltp_post_fx32( Word32 *tcx_buf, /* sig_q */ Word16 sig_q ); -#ifndef REMOVE_EVS_DUPLICATES -// gs_inact_switching_fx.c -void Inac_swtch_ematch_fx( - Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ - Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ - Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ - const Word16 coder_type, /* i : Coding mode */ - const Word16 L_frame, /* i : Frame lenght */ - const Word32 core_brate, /* i : Core bit rate */ - const Word16 Q_exc, /* i : i and output format of exc2 */ - const Word16 bfi, /* i : frame lost indicator */ - const short last_core, /* i : Last core used */ - const short last_codec_mode /* i : Last codec mode */ -); -#endif - -void Inac_switch_ematch_ivas_fx( +void Inac_switch_ematch_fx( Word16 exc2[], /* i/o: CELP/GSC excitation buffer Q_exc*/ Word16 dct_exc_tmp[], /* i : GSC excitation in DCT domain */ Word16 lt_ener_per_band[], /* i/o: Long term energy per band Q12 */ const Word16 coder_type, /* i : Coding mode */ - const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ + const Word16 inactive_coder_type_flag, /* i : AVQ (0) or GSC (1) IC flag */ const Word16 L_frame, /* i : Frame lenght */ const Word16 Q_exc, /* i : input and output format of exc2 */ const Word16 bfi, /* i : frame lost indicator */ const Word16 last_core, /* i : Last core used */ const Word16 last_codec_mode, /* i : Last codec mode */ - const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag*/ - const Word16 element_mode /* i : element mode */ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const Word16 element_mode /* i : element mode */ ); // igf_base_fx.c @@ -6069,32 +6005,16 @@ void td_bwe_dec_init_fx( const Word32 output_Fs /* i : output sampling rate */ ); -#ifndef REMOVE_EVS_DUPLICATES -// lsf_dec_fx.c void lsf_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ -); -#endif -void lsf_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + Decoder_State *st_fx, /* i/o: State structure */ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ + Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ + Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ); /*! r: index of the maximum value in the input vector */ @@ -6257,21 +6177,9 @@ void lsf_mid_dec_fx( Word16 lsp_mid[] /* o : quantized LSPs Q15*/ ); -#ifndef REMOVE_EVS_DUPLICATES -// cng_dec_fx.c void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ - Word16 Aq[], /* o : LP coefficients Q12 */ - Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ - Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ - Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0 */ - Word32 *q_env ); -#endif -void CNG_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ + const Word16 last_element_mode, /* i : last element mode Q0 */ Word16 Aq[], /* o : LP coefficients Q12 */ Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ @@ -6656,12 +6564,12 @@ void hf_synth_amr_wb_fx( // dec_post_fx void Init_post_filter_fx( PFSTAT_HANDLE hPFstat /* i : core decoder parameters */ -); /* (i) : core decoder parameters */ +); /* i : core decoder parameters */ void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *psf_lp_noise, /* i : Long term noise Q8 */ const Word16 tmp_noise, /* i : noise energy Q0 */ Word16 *Synth, /* i : 12k8 synthesis Qsyn */ @@ -6672,27 +6580,15 @@ void nb_post_filt_fx( const Word16 disable_hpf /* i : flag to diabled HPF */ ); -#ifndef REMOVE_EVS_DUPLICATES void formant_post_filt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient */ - Word16 *synth_out, /* i/o: i signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 rate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ -); -#endif -void formant_post_filt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient */ - Word16 *synth_out, /* i/o: i signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 rate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ + Word16 *Aq, /* i : LP filter coefficient Q12 */ + Word16 *synth_out, /* i/o: input signal */ + const Word16 L_frame, /* i : frame length */ + const Word32 lp_noise, /* (i) : background noise energy (15Q16) */ + const Word32 brate, /* (i) : bit-rate */ + const Word16 off_flag /* i : off flag */ ); void Filt_mu_fx( Word16 *sig_in, /* i : signal (beginning at sample -1) */ @@ -6858,65 +6754,34 @@ void PulseResynchronization_fx( Word32 /*float*/ const pitchEnd /*i Q16*/ ); -#ifndef REMOVE_EVS_DUPLICATES -// gs_dec_fx.c void decod_audio_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf /*Q14*/ -); -#endif -void decod_audio_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf, /*Q14*/ + Decoder_State *st_fx, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag Q0*/ const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6*/ ); -#ifndef REMOVE_EVS_DUPLICATES void gsc_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ - Word16 Q_exc ); -#endif -void gsc_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ + Decoder_State *st_fx, /* i/o: State structure */ + Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ const Word16 coder_type, /* i : coding type Q0*/ Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ + const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ Word16 *Q_exc ); void GSC_dec_init( @@ -6927,18 +6792,15 @@ void GSC_dec_init_ivas_fx( GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ ); - -// gain_dec_fx.c - void Es_pred_dec_fx( - Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ - const Word16 enr_idx, /* i : indice */ - const Word16 nb_bits, /* i : number of bits */ - const Word16 no_ltp /* i : no LTP flag */ + Word16 *Es_pred, /* o : predicited scaled innovation energy Q8*/ + const Word16 enr_idx, /* i : indice */ + const Word16 nb_bits, /* i : number of bits */ + const Word16 no_ltp /* i : no LTP flag */ ); void gain_dec_tc_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ + Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 *code_fx, /* i : algebraic code excitation */ const Word16 i_subfr_fx, /* i : subframe number */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ @@ -6973,7 +6835,6 @@ void gain_dec_mless_fx( Word32 *norm_gain_code_fx /* o : norm. gain of the codebook excitation Q16*/ ); -#ifndef REMOVE_EVS_DUPLICATES void gain_dec_lbr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ @@ -6984,25 +6845,8 @@ void gain_dec_lbr_fx( Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[] /* i/o: gain_pitch from previous subframes */ - , - const Word16 L_subfr /* i : subfr lenght */ -); -#endif - -void gain_dec_lbr_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - const Word16 i_subfr, /* i : subframe index */ - const Word16 *code_fx, /* i : algebraic excitation Q9 */ - Word16 *gain_pit_fx, /* o : quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes */ - Word16 gp_mem[] /* i/o: gain_pitch from previous subframes */ - , - const Word16 L_subfr /* i : subfr lenght */ + Word16 gp_mem[], /* i/o: gain_pitch from previous subframes */ + const Word16 L_subfr /* i : subfr lenght */ ); void lp_gain_updt_fx( @@ -7023,13 +6867,14 @@ void lp_gain_updt_ivas_fx( const Word16 L_frame /* i : length of the frame */ ); -Word32 gain_dec_gaus_fx( /* o : quantized codebook gain Q16 */ - Word16 index, /* i : quantization index */ - const Word16 bits, /* i : number of bits to quantize */ - const Word16 lowBound, /* i : lower bound of quantizer (dB) */ - const Word16 topBound, /* i : upper bound of quantizer (dB) */ - const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ +/*! r: quantized codebook gain Q16 */ +Word32 gain_dec_gaus_fx( + Word16 index, /* i : quantization index */ + const Word16 bits, /* i : number of bits to quantize */ + const Word16 lowBound, /* i : lower bound of quantizer (dB) */ + const Word16 topBound, /* i : upper bound of quantizer (dB) */ + const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ ); void gain_dec_SQ_fx( @@ -7123,23 +6968,7 @@ void re8_PPV_fx( Word16 y[] /* o : point in RE8 (8-dimensional integer vector) Q0 */ ); -#ifndef REMOVE_EVS_DUPLICATES -// dec_pit_exc_fx.c void dec_pit_exc_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 coder_type, /* i : coding type */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *code_fx, /* o : innovation */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - const Word16 nb_subfr_fx /* i : Number of subframe considered */ - , - Word16 *gain_buf /*Q14*/ -); -#endif -void dec_pit_exc_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ const Word16 coder_type, /* i : coding type */ @@ -7149,7 +6978,7 @@ void dec_pit_exc_ivas_fx( Word16 *exc_fx, /* i/o: adapt. excitation exc */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ const Word16 nb_subfr_fx, /* i : Number of subframe considered */ - Word16 *gain_buf, /*Q14*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ); @@ -7193,24 +7022,8 @@ void Mode2_delta_pit_dec( Word16 **pt_indice /* i/o: pointer to Vector of Q indexes */ ); -#ifndef REMOVE_EVS_DUPLICATES -Word16 pit_decode_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr /* i : subframe length */ -); -#endif /* o : floating pitch value */ -Word16 pit_decode_ivas_fx( +Word16 pit_decode_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word32 core_brate, /* i : core bitrate */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ @@ -7571,9 +7384,8 @@ void configureFdCngDec_fx( const Word16 Last_L_frame, const Word16 element_mode ); -#ifndef REMOVE_EVS_DUPLICATES -/* Apply the CLDFB-based CNG */ Word16 ApplyFdCng_fx( +<<<<<<< HEAD Word16 *timeDomainInput, /* i : pointer to time domain i */ Word16 Q, Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer */ @@ -7584,6 +7396,8 @@ Word16 ApplyFdCng_fx( Word16 is_music ); #endif Word16 ApplyFdCng_ivas_fx( +======= +>>>>>>> 2afc0761 (accept REMOVE_EVS_DUPLICATES) Word16 *timeDomainInput, /* i : pointer to time domain input */ Word16 Q, Word32 *powerSpectrum, @@ -8172,14 +7986,11 @@ void FEC_pitch_estim_fx( const Word32 old_pitch_buf[], /* i : buffer of old subframe pitch values 15Q16 */ Word16 *bfi_pitch, /* i/o: update of the estimated pitch for FEC */ Word16 *bfi_pitch_frame, /* o : frame length when pitch was updated */ - Word16 *upd_cnt /* i/o: update counter */ - , - const Word16 coder_type, /* i : coder_type */ - Word16 element_mode /* i : element mode */ + Word16 *upd_cnt, /* i/o: update counter */ + const Word16 coder_type, /* i : coder_type */ + Word16 element_mode /* i : element mode */ ); -#ifndef REMOVE_EVS_DUPLICATES -// FEC_scale_sync_fx.c void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ @@ -8206,69 +8017,37 @@ void FEC_scale_syn_fx( Word16 *mem_syn, /* o: initial synthesis filter states */ Word16 Q_exc, Word16 Q_syn, + const Word16 element_mode, /* i : element mode */ const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ -); -#endif -void FEC_scale_syn_ivas_fx( - const Word16 L_frame, /* i : length of the frame */ - Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ - Word16 clas, /* i/o: frame classification */ - const Word16 last_good, /* i: last good frame classification */ - Word16 *synth, /* i/o: synthesized speech at Fs = 12k8 Hz */ - const Word16 *pitch, /* i: pitch values for each subframe */ - Word32 L_enr_old, /* i: energy at the end of previous frame */ - Word32 L_enr_q, /* i: transmitted energy for current frame */ - const Word16 coder_type, /* i: coder type */ - const Word16 LSF_Q_prediction, /* i : LSF prediction mode */ - Word16 *scaling_flag, /* i/o: flag to indicate energy control of syn */ - Word32 *lp_ener_FEC_av, /* i/o: averaged voiced signal energy */ - Word32 *lp_ener_FEC_max, /* i/o: averaged voiced signal energy */ - const Word16 bfi, /* i: current frame BFI */ - const Word32 total_brate, /* i: total bitrate */ - const Word16 prev_bfi, /* i: previous frame BFI */ - const Word32 last_core_brate, /* i: previous frame core bitrate */ - Word16 *exc, /* i/o: excitation signal without enhancement */ - Word16 *exc2, /* i/o: excitation signal with enhancement */ - Word16 Aq[], /* i/o: LP filter coefs (can be modified if BR) */ - Word16 *old_enr_LP, /* i/o: LP filter E of last good voiced frame */ - const Word16 *mem_tmp, /* i: temp. initial synthesis filter states */ - Word16 *mem_syn, /* o: initial synthesis filter states */ - Word16 Q_exc, - Word16 Q_syn, -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif - const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ + const Word16 force_scaling /* i : force scaling */ ); // LD_music_post_filter_fx.c void LD_music_post_filter_fx( - MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ - const Word16 dtc_in[], /* i : i synthesis Qdct */ - Word16 dtc_out[], /* o : output synthesis Qdct */ - const Word32 core_brate, /* i : core bitrate Q0 */ - Word16 *Old_ener_Q, /* i/o : Old energy scaling factor */ - const Word16 coder_type, /* i : Coder type : -1 in case of IO Q0 */ - const Word16 Last_coder_type, /* i : i scaling Q0 */ - const Word16 Qdct /* i : i scaling Q0 */ + MUSIC_POSTFILT_HANDLE hMusicPF, /* i/o: LD music postfilter handle */ + const Word16 dtc_in[], /* i : i synthesis Qdct */ + Word16 dtc_out[], /* o : output synthesis Qdct */ + const Word32 core_brate, /* i : core bitrate Q0 */ + Word16 *Old_ener_Q, /* i/o: Old energy scaling factor */ + const Word16 coder_type, /* i : Coder type : -1 in case of IO Q0 */ + const Word16 Last_coder_type, /* i : i scaling Q0 */ + const Word16 Qdct /* i : i scaling Q0 */ ); void Prep_music_postP_fx( - Word16 exc_buffer_in[], /* i/o: excitation buffer Q_exc*/ - Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ - Word16 filt_lfE[], /* i/o: long term spectrum energy Q15 */ - const Word16 last_core, /* i : last core */ - const Word16 element_mode, /* i : element mode */ - const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ - Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per bin FFT Q15*/ - const Word16 Q_exc, /* i : excitation scaling */ - Word16 *qdct /* o : Scaling factor of dct coefficient */ + Word16 exc_buffer_in[], /* i/o: excitation buffer Q_exc*/ + Word16 dct_buffer_out[], /* o : DCT output buffer (qdct)*/ + Word16 filt_lfE[], /* i/o: long term spectrum energy Q15 */ + const Word16 last_core, /* i : last core */ + const Word16 element_mode, /* i : element mode */ + const Word16 *pitch_buf, /* i : current frame pitch information Q6*/ + Word16 *LDm_enh_lp_gbin, /* o : smoothed suppression gain, per bin FFT Q15*/ + const Word16 Q_exc, /* i : excitation scaling */ + Word16 *qdct /* o : Scaling factor of dct coefficient */ ); void Post_music_postP_fx( - Word16 dct_buffer_in[], /* i/o: excitation buffer */ + Word16 dct_buffer_in[], /* i/o: excitation buffer */ Word16 *exc2, /* i/o: Current excitation to be overwriten */ const Word16 *mem_tmp, /* i : previous frame synthesis memory */ Word16 *st_mem_syn2, /* i/o: current frame synthesis memory */ @@ -8278,15 +8057,14 @@ void Post_music_postP_fx( Word16 *prev_Q_syn, /* i : previsous frame synthesis scaling */ Word16 *Q_syn, /* i : Current frame synthesis scaling */ Word16 *mem_syn_clas_estim_fx, /* i : old 12k8 synthesis used for frame classification*/ - const Word16 IsIO, /* i: Flag to indicate IO mode */ - Word16 *mem_deemph, /* i/o: speech deemph filter memory */ - Word16 *st_pst_old_syn_fx, /* i/o: psfiler */ - Word16 *st_pst_mem_deemp_err_fx, /* i/o: psfiler */ + const Word16 IsIO, /* i : Flag to indicate IO mode */ + Word16 *mem_deemph, /* i/o: speech deemph filter memory */ + Word16 *st_pst_old_syn_fx, /* i/o: psfiler */ + Word16 *st_pst_mem_deemp_err_fx, /* i/o: psfiler */ Word16 *mem_agc, - PFSTAT *pf_stat, /* i/o: All memories related to NB post filter */ - const Word16 *tmp_buffer /* tmp_buffer in Q-1 */ - , - Word16 *mem_tmp2 /* Temporary memory used with scale_syn */ + PFSTAT *pf_stat, /* i/o: All memories related to NB post filter */ + const Word16 *tmp_buffer, /* tmp_buffer in Q-1 */ + Word16 *mem_tmp2 /* Temporary memory used with scale_syn */ ); void music_postfilt_init( @@ -8503,29 +8281,17 @@ Word16 FEC_enhACB_fx( const Word16 puls_pos, /* i : decoder position of the last glottal pulses decoded in the previous frame */ const Word16 bfi_pitch /* i : Q6 pitch used for concealment */ ); -Word16 FEC_synchro_exc_fx( /* o : do_WI flag */ - const Word16 L_frame, /* i : length of the frame */ - Word16 *exc, /* i/o: exc vector to modify */ - const Word16 desire_puls_pos, /* i : Pulse position send by the encoder */ - const Word16 true_puls_pos, /* i : Present pulse location */ - const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ + +/*! r: do_WI flag */ +Word16 FEC_synchro_exc_fx( + const Word16 L_frame, /* i : length of the frame */ + Word16 *exc, /* i/o: exc vector to modify */ + const Word16 desire_puls_pos, /* i : Pulse position send by the encoder */ + const Word16 true_puls_pos, /* i : Present pulse location */ + const Word16 Old_pitch /* i : Pitch use to create temporary adaptive codebook */ ); -#ifndef REMOVE_EVS_DUPLICATES -// dec_uv_fx.c void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q5 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ - Word16 *gain_buf ); -#endif -void decod_unvoiced_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ @@ -8568,38 +8334,20 @@ void gaus_L2_dec( Word16 *seed_acelp /*i/o : random seed Q0 */ ); -#ifndef REMOVE_EVS_DUPLICATES -// dec_gen_voic_fx.c ivas_error decod_gen_voic_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* o : voicing factors */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf /*Q14*/ -); -#endif -ivas_error decod_gen_voic_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *voice_factors_fx, /* o : voicing factors */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf, + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 sharpFlag_fx, /* i : formant sharpening flag */ + const Word16 *Aq_fx, /* i : LP filter coefficient */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ + const Word16 do_WI_fx, /* i : do interpolation after a FER */ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ + Word16 *voice_factors_fx, /* o : voicing factors */ + Word16 *exc_fx, /* i/o: adapt. excitation exc */ + Word16 *exc2_fx, /* i/o: adapt. excitation/total exc */ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ + Word16 *unbits, /* number of unused bits */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ); @@ -9501,33 +9249,6 @@ void d_gain_pred_fx( Word16 **pt_indice /* i/o: pointer to the buffer of indices */ ); -#ifndef REMOVE_EVS_DUPLICATES -// acelp_core_dec_fx.c -ivas_error acelp_core_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 output[], /* o : synthesis @internal Fs */ - Word16 synth_out[], /* o : synthesis */ - Word16 save_hb_synth[], /* o : HB synthesis */ - Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation */ - Word16 *voice_factors, /* o : voicing factors */ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis for SWB BWE */ - Word16 sharpFlag, - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe */ - Word16 *unbits, /* o : number of unused bits */ - Word16 *sid_bw /* o : 0-NB/WB, 1-SWB SID */ - , - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const Word16 last_element_mode, /* i : last element mode */ - const Word32 last_element_brate, /* i : last element bitrate */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - const Word16 nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const Word16 read_sid_info /* i : read SID info flag */ -); -#endif // evs_dec_fx.c ivas_error evs_dec_fx( Decoder_State *st_fx, /* i/o : Decoder state structure */ @@ -10617,7 +10338,7 @@ Word16 swb_bwe_dec_fx32( Word16 output_frame /* i : frame length */ ); -ivas_error acelp_core_dec_ivas_fx( +ivas_error acelp_core_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 output_fx[], /* o : synthesis @internal Fs */ Word16 synth_fx16[], /* o : synthesis */ @@ -10914,6 +10635,7 @@ Word16 ari_decode_14bits_pow_ivas( Word16 *res, Tastat *s, UWord16 base ); + Word16 ari_decode_14bits_sign_ivas( Word16 *ptr, Word16 bp, @@ -10927,22 +10649,21 @@ void lsf_syn_mem_backup_ivas_fx( Word32 *gc_threshold_fx, /* i: Q16 */ Word16 *clip_var_bck_fx, /* o: Q(2.56), Q14, Q7, Q0, Q14, Q14 */ Word16 *next_force_sf_bck_fx, /* o: */ - - Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ - Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ - Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ - Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ - Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ - Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ - Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ - Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ - Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ - Word16 *streaklimit, /* Q15 */ + Word16 *lsp_new, /* i: LSP vector to quantize Q15 */ + Word16 *lsp_mid, /* i: mid-frame LSP vector Q15 */ + Word16 *clip_var, /* o: pitch clipping state var Q(2.56) */ + Word16 *mem_AR, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *mem_MA, /* o: quantizer memory for AR model Q(2.56) */ + Word16 *lsp_new_bck, /* o: LSP vector to quantize- backup Q15 */ + Word16 *lsp_mid_bck, /* o: mid-frame LSP vector - backup Q15 */ + Word32 *Bin_E, /* o: FFT Bin energy 128 *2 sets Q_new + Q_SCALE - 2 */ + Word32 *Bin_E_old, /* o: FFT Bin energy 128 sets Q_new + Q_SCALE - 2 */ + Word16 *mem_syn_bck, /* o: synthesis filter memory ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *mem_w0_bck, /* o: memory of the weighting filter ( 15 - st_fx->hLPDmem->e_mem_syn ) */ + Word16 *streaklimit, /* Q15 */ Word16 *pstreaklen ); -ivas_error config_acelp1_IVAS( +ivas_error config_acelp1_fx( const Word16 enc_dec, /* i : encoder/decoder flag */ const Word32 total_brate, /* i : total bitrate */ const Word32 core_brate_inp, /* i : core bitrate */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index d3f671631..08bbd6362 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7023,50 +7023,6 @@ void synthesise_fb_high_band_fx( tmp3 = add( sub( Qout, add( sub( 1, exp ), exp_tmp ) ), 16 ); /*Qout - (1 -exp +exp_tmp) + 16 */ FOR( i = 0; i < L_FRAME48k; i++ ) { -#ifdef FIX_1439_SPEEDUP_synthesise_fb_high_band_fx - L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ - Word32 L_tmp32 = L_add( 0, 0 ); - Word16 tmp16 = add( 0, 0 ); - - // if (L_tmp < 0) - if ( L_tmp < 0 ) - { - L_tmp32 = L_negate( L_tmp ); - } - if ( L_tmp < 0 ) - { - L_tmp32 = L_shl_sat( L_tmp32, tmp3 ); - } - if ( L_tmp < 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - if ( L_tmp < 0 ) - { - tmp16 = negate( tmp16 ); - } - - // if (L_tmp == 0) - if ( L_tmp == 0 ) - { - tmp16 = 0; - move16(); - } - - // if (L_tmp > 0) - if ( L_tmp > 0 ) - { - L_tmp32 = L_shl_sat( L_tmp, tmp3 ); - } - if ( L_tmp > 0 ) - { - tmp16 = extract_h( L_tmp32 ); - } - - output[i] = tmp16; - move16(); - -#else L_tmp = Mult_32_16( ratio2, tmp[i] ); /* Q(16-exp+exp_tmp-15 = 1-exp+exp_tmp) */ IF( L_tmp < 0 ) { @@ -7078,7 +7034,6 @@ void synthesise_fb_high_band_fx( output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); } -#endif } return; } @@ -7253,180 +7208,34 @@ void Estimate_mix_factors_fx( /* INPUT/OUTPUT ARGUMENTS : */ /* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ /*--------------------------------------------------------------------------------------*/ - /* _ None */ /*--------------------------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void prep_tbe_exc_fx( - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate ) -{ - Word16 i; - Word16 tmp_code_fx[2 * L_SUBFR * HIBND_ACB_L_FAC]; - Word16 tmp_code_preInt_fx[L_SUBFR]; - Word16 gain_code16 = 0; - move16(); - Word16 tmp /*, tmp1, tmp2*/; - /*Word16 random_code[L_SUBFR * HIBND_ACB_L_FAC];*/ - Word16 pitch; - - Word32 L_tmp, Ltemp1, Ltemp2; - Word32 tempQ31; - Word16 tempQ15; - Word16 L_subfr = L_SUBFR; - move16(); -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - /**voice_factors = VF_0th_PARAM + VF_1st_PARAM * voice_fac + VF_2nd_PARAM * voice_fac * voice_fac; - = VF_0th_PARAM + voice_fac * (VF_1st_PARAM + VF_2nd_PARAM * voice_fac ) - *voice_factors = min( max_val(0.0f, *voice_factors), 1.0f); */ - tempQ31 = L_deposit_h( VF_1st_PARAM_FX ); - tempQ15 = mac_r( tempQ31, VF_2nd_PARAM_FX, voice_fac_fx ); - tempQ31 = L_deposit_h( VF_0th_PARAM_FX ); - *voice_factors_fx = mac_r( tempQ31, voice_fac_fx, tempQ15 ); - move16(); - tmp = MAX_16; - move16(); - - pitch = shl_o( add( shl_o( T0, 2, &Overflow ), T0_frac ), 5, &Overflow ); /* Q7 */ + const Word16 L_frame_fx, /* i : length of the frame */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : subframe index */ + const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ + const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ + const Word16 code_fx[], /* i : algebraic excitation Q9*/ + const Word16 voice_fac_fx, /* i : voicing factor Q15*/ + Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ + Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ + const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ + const Word16 code_preQ_fx[], /* i : prequantizer excitation */ + const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ + const Word16 T0, /* i : integer pitch variables Q0 */ + const Word16 T0_frac, /* i : Fractional pitch variables Q0*/ + const Word16 coder_type, /* i : coding type */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ - test(); - test(); - IF( ( ( EQ_16( coder_type, VOICED ) ) || ( GT_16( pitch, 14784 /* 115.5 in Q7 */ ) ) ) && ( GT_32( core_brate, ACELP_8k00 ) ) ) - { - tmp = MAX_16; - move16(); - *voice_factors_fx = mult_r( *voice_factors_fx, tmp ); - move16(); - } - - *voice_factors_fx = s_min( s_max( *voice_factors_fx, 0 ), MAX_16 ); - move16(); - IF( EQ_16( L_frame_fx, L_FRAME ) ) - { - interp_code_5over2_fx( code_fx, tmp_code_fx, L_subfr ); /* code: Q9, tmp_code: Q9 */ - gain_code16 = round_fx_o( L_shl_o( gain_code_fx, Q_exc, &Overflow ), &Overflow ); /*Q_exc */ - FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) - { - L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ - L_tmp = L_shl_sat( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ - L_tmp = L_mac_sat( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] ); /*Q15+Q_exc */ - L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ - bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ - move16(); - } - } - ELSE - { - IF( gain_preQ_fx != 0 ) - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ - - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ - - tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ - move16(); - } - } - ELSE - { - FOR( i = 0; i < L_subfr; i++ ) - { - /*code in the encoder is Q9 and there is no <<1 with Mult_32_16 Q16 * Q9 -> Q9 */ - Ltemp1 = Mult_32_16( gain_code_fx, code_fx[i] ); /* Q16 + Q9 + 1 - 16 = Q10 */ - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - tmp_code_preInt_fx[i] = round_fx_o( Ltemp1, &Overflow ); /* Q_exc */ - move16(); - } - } - - interp_code_4over2_fx( tmp_code_preInt_fx, tmp_code_fx, L_subfr ); /* o: tmp_code in Q_exc */ - FOR( i = 0; i < L_subfr * 2; i++ ) - { - L_tmp = L_mult( gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * 2] ); /*Q14+Q_exc+1 */ - tmp = round_fx_o( L_shl_o( L_tmp, 1 /* (Q_exc+16)-(14+Q_exc+1)*/, &Overflow ), &Overflow ); /* tmp in Q_exc */ - bwe_exc_fx[i + i_subfr_fx * 2] = add_o( tmp, tmp_code_fx[i], &Overflow ); /*Q_exc */ - move16(); - } - } - - return; -} - -/*======================================================================================*/ -/* FUNCTION : prep_tbe_exc_ivas_fx() */ -/*--------------------------------------------------------------------------------------*/ -/* PURPOSE : Prepare TBE excitation */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) L_frame_fx : length of the frame */ -/* _ (Word16) i_subfr_fx : subframe index */ -/* _ (Word16) gain_pit_fx : Pitch gain (14) */ -/* _ (Word32) gain_code_fx : algebraic codebook gain (Q(16+Q_exc)) */ -/* _ (Word16*[]) code_fx : algebraic excitation (Q9) */ -/* _ (Word16) voice_fac_fx : voicing factor (Q15) */ -/* _ (Word16) gain_preQ_fx : prequantizer excitation gain */ -/* _ (Word16[]) code_preQ_fx : prequantizer excitation */ -/*--------------------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*[]) voice_factors_fx : TBE voicing factor (Q15) */ -/*--------------------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ (Word16[]) bwe_exc_fx : excitation for TBE (Q_exc) */ -/*--------------------------------------------------------------------------------------*/ - -/* _ None */ -/*--------------------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================================*/ -#endif -void prep_tbe_exc_ivas_fx( - const Word16 L_frame_fx, /* i : length of the frame */ - const Word16 L_subfr, - const Word16 i_subfr_fx, /* i : subframe index */ - const Word16 gain_pit_fx, /* i : Pitch gain Q14*/ - const Word32 gain_code_fx, /* i : algebraic codebook gain 16+Q_exc*/ - const Word16 code_fx[], /* i : algebraic excitation Q9*/ - const Word16 voice_fac_fx, /* i : voicing factor Q15*/ - Word16 *voice_factors_fx, /* o : TBE voicing factor Q15*/ - Word16 bwe_exc_fx[], /* i/o: excitation for TBE Q_exc*/ - const Word16 gain_preQ_fx, /* i : prequantizer excitation gain */ - const Word16 code_preQ_fx[], /* i : prequantizer excitation */ - const Word16 Q_exc, /* i : Excitation, bwe_exc Q-factor */ - Word16 T0, /* i : integer pitch variables Q0 */ - Word16 T0_frac, /* i : Fractional pitch variables Q0*/ - const Word16 coder_type, /* i : coding type */ - Word32 core_brate, /* i : core bitrate */ - const Word16 element_mode, /* i : element mode */ - const Word16 idchan, /* i : channel ID */ - const Word16 flag_TD_BWE, /* i : flag indicating whether hTD_BWE exists */ - const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ ) { Word16 i; @@ -7543,6 +7352,7 @@ void prep_tbe_exc_ivas_fx( return; } + /*=============================================================================*/ /* FUNCTION : void swb_formant_fac_fx ( ) */ /*------------------------------------------------------------------------------*/ @@ -7562,9 +7372,10 @@ void prep_tbe_exc_ivas_fx( /* CALLED FROM : */ /*==============================================================================*/ -Word16 swb_formant_fac_fx( /* o : Formant filter strength [0,1] */ - const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ - Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ +/*! r: Formant filter strength [0,1] */ +Word16 swb_formant_fac_fx( + const Word16 lpc_shb2, /* Q12 i : 2nd HB LPC coefficient */ + Word16 *tilt_mem /* i/o: Tilt smoothing memory (Q12) */ ) { Word16 formant_fac; @@ -7584,7 +7395,6 @@ Word16 swb_formant_fac_fx( /* o : Formant filter strength tmp = sub( tmp, SWB_TILT_LOW_FX ); /* Q12 */ formant_fac = mult_r( tmp, SWB_TILT_DELTA_FX ); /* Q12 */ - IF( GT_16( formant_fac, 4096 /* 1 in Q12 */ ) ) { formant_fac = 4096; /* 1 in Q12 */ @@ -7604,6 +7414,12 @@ Word16 swb_formant_fac_fx( /* o : Formant filter strength } +/*-------------------------------------------------------------------* + * wb_tbe_extras_reset_fx() + * + * + *-------------------------------------------------------------------*/ + void wb_tbe_extras_reset_fx( Word16 mem_genSHBexc_filt_down_wb2[], Word16 mem_genSHBexc_filt_down_wb3[] ) @@ -7620,7 +7436,6 @@ void wb_tbe_extras_reset_fx( * Determine TBE bit consumption per frame from bitrate * *-------------------------------------------------------------------*/ - Word16 get_tbe_bits_fx( const Word32 total_brate, /* o : TBE bit consumption per frame */ const Word16 bwidth, /* i : overall bitrate */ diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index a23c9aa90..48d91a87a 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -510,19 +510,10 @@ void FEC_exc_estim_fx( move16(); /* st_fx->L_frame / L_SUBFR */ tmp = shr( st_fx->L_frame, 6 ); + /* Replication of the last spectrum, with a slight downscaling of its dynamic */ -#ifdef REMOVE_EVS_DUPLICATES - gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); -#else - IF( st_fx->element_mode == EVS_MONO ) - { - gsc_dec_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, st_fx->Q_exc ); - } - ELSE - { - gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); - } -#endif + gsc_dec_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); + *tmp_noise = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ move16(); /* Transform back to time domain */ diff --git a/lib_dec/FEC_scale_syn_fx.c b/lib_dec/FEC_scale_syn_fx.c index 714a60166..7f4586083 100644 --- a/lib_dec/FEC_scale_syn_fx.c +++ b/lib_dec/FEC_scale_syn_fx.c @@ -50,7 +50,6 @@ /* _ None */ /*========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void FEC_scale_syn_fx( const Word16 L_frame, /* i : length of the frame */ Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ @@ -77,574 +76,7 @@ void FEC_scale_syn_fx( Word16 *mem_syn, /* o: initial synthesis filter states Q_syn*/ Word16 Q_exc, Word16 Q_syn, - const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ - const Word16 force_scaling /* i: force scaling */ -) -{ - Word16 i; - Word32 L_enr1, L_enr2; - Word16 gain1, gain2, enr_LP; - Word16 tmp, tmp2, exp, exp2; - Word16 tmp3; - Word32 L_tmp; - Word16 scaling; - Word32 ener_max, L_enr2_av, L_ener2_max; - Word16 h1[L_FRAME / 2], tilt, pitch_dist, mean_pitch; - Word16 k; - Word32 L_mean_pitch; - - enr_LP = 0; - move16(); - gain2 = 0; - move16(); - gain1 = 0; - move16(); - *update_flg = 0; - move16(); - L_enr_old = L_max( 1, L_enr_old ); /* to avoid division by zero (*L_enr_old is always >= 0) */ - scaling = 16384; - move16(); /* Q14*/ - - /*-----------------------------------------------------------------* - * Find the synthesis filter impulse response on voiced - *-----------------------------------------------------------------*/ - test(); - IF( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - IF( EQ_16( L_frame, L_FRAME ) ) - { - enr_LP = Enr_1_Az_fx( Aq + ( NB_SUBFR - 1 ) * ( M + 1 ), L_SUBFR ); - } - ELSE /* L_frame == L_FRAME16k */ - { - enr_LP = Enr_1_Az_fx( Aq + ( NB_SUBFR16k - 1 ) * ( M + 1 ), L_SUBFR ); /*Q3*/ - } - } - - /*-----------------------------------------------------------------* - * Define when to scale the synthesis - *-----------------------------------------------------------------*/ - - IF( bfi ) - { - *scaling_flag = 1; - move16(); /* Always check synthesis on bad frames */ - } - ELSE IF( prev_bfi ) - { - test(); - IF( ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) || ( EQ_16( LSF_Q_prediction, MOVING_AVERAGE ) ) ) - { - *scaling_flag = 2; - move16(); /* Decoded LSFs affected */ - } - ELSE IF( NE_16( coder_type, TRANSITION ) ) - { - *scaling_flag = 1; - move16(); /* SN, but not TC mode - LSF still affected by the interpolation */ - } - ELSE - { - *scaling_flag = 0; - move16(); /* LSF still possibly affected due to interpolation */ - } - scaling = 24576; /*1.5 Q14*/ - move16(); - } - ELSE - { - test(); - IF( ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) && ( EQ_16( *scaling_flag, 2 ) ) ) - { - *scaling_flag = 2; - move16(); /* Continue with energy control till the end of AR prediction */ - } - ELSE IF( *scaling_flag > 0 ) - { - ( *scaling_flag ) = sub( *scaling_flag, 1 ); /* If scaling flag was equal to 2, add one control frame to account for the LSF interpolation */ - move16(); - } - scaling = 32767; /*2.0 Q14*/ - move16(); - } - - /*-----------------------------------------------------------------* - * Find the energy/gain at the end of the frame - *-----------------------------------------------------------------*/ - - frame_ener_fx( L_frame, clas, synth, pitch[( L_frame >> 6 ) - 1], &L_enr2 /*Q0*/, 1, Q_syn, 3, 0 ); - - - test(); - test(); - IF( bfi || ( EQ_32( total_brate, ACELP_7k20 ) ) || ( EQ_32( total_brate, ACELP_8k00 ) ) ) - { - /* previous frame erased and no TC frame */ - IF( *scaling_flag > 0 ) - { - /*enr2 += 0.01f;*/ - L_enr2 = L_max( L_enr2, 1 ); /* L_enr2 is in Q0 */ - - IF( bfi ) /* In all bad frames, limit the gain to 1 */ - { - /* gain2 = (float)sqrt( enr_old / enr2 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr2, 0, &exp2 ); - gain2 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain2 > 1.0f )gain2 = 1.0f;*/ - gain2 = s_min( gain2, 16384 ); - - /* find the energy/gain at the beginning of the frame */ - frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1 /*Q0*/, 1, Q_syn, 3, 0 ); - - /*enr1 += 0.1f;*/ - L_enr1 = L_max( L_enr1, 1 ); /* L_enr2 is in Q0 */ - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr1, 0, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain1 > 1.0f )gain1 = 1.0f;*/ - gain1 = s_min( gain1, 16384 ); /*Q14*/ - } - ELSE /* good frame */ - { - IF( L_enr_q == 0 ) /* If E info (FEC protection bits) is not available in the bitstream */ - { - L_enr_q = L_enr2; /*Q0*/ - set16_fx( h1, 0, L_FRAME / 2 ); - h1[0] = 1024; /*1.0f in Q10*/ - move16(); - /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); - - /*Compute tilt */ - /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ - /*rr1 = dotp( h1, h1+1, L_FRAME/2-1 );*/ - /*tilt = rr1 / rr0;*/ - tilt = extract_h( L_shl_sat( get_gain( h1 + 1, h1, L_FRAME / 2 - 1 ), 15 ) ); /*Q15*/ - pitch_dist = 0; - move16(); - L_mean_pitch = L_mult( pitch[0], 8192 /*1.0f in Q13*/ ); /*Q14*/ - FOR( k = 0; k < ( NB_SUBFR - 1 ); k++ ) - { - pitch_dist = add( pitch_dist, abs_s( sub( pitch[k + 1], pitch[k] ) ) ); /*Q0*/ - L_mean_pitch = L_mac( L_mean_pitch, pitch[k + 1], 8192 ); /*Q14*/ - } - /*pitch_dist /= (float)(NB_SUBFR-1); */ - pitch_dist = mult_r( shl( pitch_dist, 4 ), 10923 /*1/(float)(NB_SUBFR-1) in Q15*/ ); /*Q4*/ - /*mean_pitch /= (float)(NB_SUBFR);*/ - mean_pitch = extract_h( L_shl( L_mean_pitch, 4 ) ); /*Q4*/ - - - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ - ( ( GT_16( pitch_dist, 8 << 4 ) ) || ( LT_16( mean_pitch, PIT_MIN << 4 ) ) ) && /* pitch unstable or very short */ - ( ( prev_bfi ) || ( ( EQ_16( coder_type, GENERIC ) ) && ( EQ_16( LSF_Q_prediction, AUTO_REGRESSIVE ) ) ) ) ) - { - /*if( enr_q > scaling * enr_old ){enr_q = scaling * enr_old;}*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( L_enr_old, scaling ), 1 ) ); /* scaling in Q14*/ - } - ELSE - { - ener_max = *lp_ener_FEC_max; /*Q0*/ - move32(); - test(); - if ( EQ_16( clas, VOICED_TRANSITION ) || ( GE_16( clas, INACTIVE_CLAS ) ) ) - { - ener_max = *lp_ener_FEC_av; /*Q0*/ - move32(); - } - /*if( enr_old > ener_max )ener_max = enr_old;*/ - ener_max = L_max( ener_max, L_enr_old ); - - /*if( enr_q > scaling * ener_max ){enr_q = scaling * ener_max;}*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( ener_max, scaling ), 1 ) ); /* scaling in Q14*/ - } - } - /*gain2 = (float)sqrt( enr_q / enr2 );*/ - L_enr_q = L_max( L_enr_q, 1 ); /* L_enr2 is in Q0 */ - L_tmp = Sqrt_Ratio32( L_enr_q, 0, L_enr2, 0, &exp2 ); - gain2 = round_fx( L_shl( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*-----------------------------------------------------------------* - * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) && - prev_bfi ) - { - /* voiced -> unvoiced signal transition */ - /* CNG -> active signal transition */ - gain1 = gain2; /*Q14*/ - move16(); - } - ELSE - { - /* find the energy at the beginning of the frame */ - frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1 /*Q0*/, 1, Q_syn, 3, 0 ); - - /*enr1 += 0.1f;*/ - L_enr1 = L_max( L_enr1, 1 ); /* L_enr1 is in Q0 */ - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - L_tmp = Sqrt_Ratio32( L_enr_old, 0, L_enr1, 0, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - - /*if( gain1 > 1.2f )gain1 = 1.2f;*/ - /* prevent clipping */ - gain1 = s_min( gain1, 19661 /*1.2f in Q14*/ ); - - /* prevent amplifying the unvoiced or inactive part of the frame in case an offset is followed by an onset */ - test(); - test(); - if ( EQ_16( clas, ONSET ) && GT_16( gain1, gain2 ) && prev_bfi ) - { - gain1 = gain2; /*Q14*/ - move16(); - } - } - - L_enr2 = L_enr_q; /*Q0*/ - move32(); /* Set the end frame energy to the scaled energy, to be used in the lp_ener_FEC */ - } - - /*------------------------------------------------------------------------------* - * Smooth the energy evolution by exponentially evolving from gain1 to gain2 - *------------------------------------------------------------------------------*/ - - /*gain2 *= ( 1.0f - AGC );*/ - L_tmp = L_mult( gain2, (Word16) ( 32768 /*Q15*/ - AGC_FX ) ); /*Q30*/ - FOR( i = 0; i < L_frame; i++ ) - { - /*gain1 = gain1 * AGC + gain2;*/ - gain1 = mac_r( L_tmp, gain1, AGC_FX ); /* in Q14 */ - /*exc[i] *= gain1;*/ - exc[i] = mac_r( L_mult( exc[i], gain1 ), exc[i], gain1 ); - move16(); - /*exc2[i] *= gain1;*/ - exc2[i] = mac_r_sat( L_mult( exc2[i], gain1 ), exc2[i], gain1 ); - move16(); - } - /* smoothing is done in excitation domain, so redo synthesis */ - Copy( mem_tmp, mem_syn, M ); /* Q_syn */ - syn_12k8_fx( L_frame, Aq, exc2, synth, mem_syn, 1, Q_exc, Q_syn ); - *update_flg = 1; - move16(); - } - } - ELSE - { - /* previous frame erased and no TC frame */ - test(); - IF( prev_bfi && NE_16( coder_type, TRANSITION ) ) - { - IF( L_enr_q == 0 ) - { - L_enr_q = L_max( 1, L_enr2 ); /* sets to 'L_enr2' in 1 clock */ - set16_fx( h1, 0, L_FRAME / 2 ); - h1[0] = 1024; /*1.0f in Q10*/ - move16(); - /*syn_filt( Aq+(3*(M+1)), M, h1, h1, L_FRAME/2, h1+(M+1), 0 );*/ - E_UTIL_synthesis( 1, Aq + ( 3 * ( M + 1 ) ), h1, h1, L_FRAME / 2, h1 + ( M + 1 ), 0, M ); - /*Compute tilt */ - /*rr0 = dotp( h1, h1, L_FRAME/2-1 ) + 0.1f;*/ - /*rr1 = dotp( h1, h1+1, L_FRAME/2-1 );*/ - /*tilt = rr1 / rr0;*/ - tilt = extract_h( L_shl_sat( get_gain( h1 + 1, h1, L_FRAME / 2 - 1 ), 15 ) ); /*Q15*/ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( ( EQ_32( total_brate, ACELP_13k20 ) ) || ( EQ_32( total_brate, ACELP_12k85 ) ) || ( EQ_32( total_brate, ACELP_12k15 ) ) || ( EQ_32( total_brate, ACELP_11k60 ) ) || - ( EQ_32( total_brate, ACELP_9k60 ) ) ) && - ( GT_16( tilt, 22938 ) ) && /* HF resonnant filter */ - ( ( ( clas == UNVOICED_CLAS ) ) || ( EQ_16( clas, INACTIVE_CLAS ) ) ) ) ) /* unvoiced classification */ - { - /*if( enr_q > scaling * enr_old )enr_q = scaling * enr_old;*/ - L_enr_q = L_min( L_enr_q, L_shl_sat( Mult_32_16( L_enr_old, scaling ), 1 ) ); /* scaling in Q14*/ - } - ELSE IF( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - /* Voiced-voiced recovery */ - test(); - IF( *old_enr_LP != 0 && GT_16( enr_LP, shl_sat( *old_enr_LP, 1 ) ) ) - { - /* enr_q /= enr_LP */ - exp = norm_l( L_enr_q ); - tmp = extract_h( L_shl( L_enr_q, exp ) ); - - exp2 = norm_s( enr_LP ); - tmp2 = shl( enr_LP, exp2 ); - - exp = sub( exp2, exp ); - - tmp3 = sub( tmp, tmp2 ); - IF( tmp3 > 0 ) - { - tmp = shr( tmp, 1 ); - exp = add( exp, 1 ); - } - tmp = div_s( tmp, tmp2 ); - - /* L_enr_q *= 2 * *old_enr_LP */ - L_enr_q = L_shl( L_mult( tmp, shl( *old_enr_LP, 1 ) ), exp ); - } - - ELSE - { - test(); - IF( avoid_lpc_burst_on_recovery && GT_16( enr_LP, 160 /*20.0f in Q3*/ ) ) - { - exp = norm_s( enr_LP ); - tmp = shl( enr_LP, exp ); - - exp2 = 7; - move16(); - tmp2 = 160 << 7; /* 160 = 20.0f in Q3 */ - move16(); - exp = sub( exp2, exp ); - - IF( GT_16( tmp, tmp2 ) ) - { - tmp = shr( tmp, 1 ); - exp = add( exp, 1 ); - } - tmp = div_s( tmp, tmp2 ); /* tmp*2^exp = enr_LP/20.0 */ - L_tmp = Isqrt_lc( L_deposit_h( tmp ), &exp ); /* L_tmp*2^exp = sqrt(20.0/enr_LP) */ - L_enr_q = L_shl( Mpy_32_32( L_enr_q, L_tmp ), exp ); - } - } - } - - test(); - test(); - test(); - test(); - IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) || force_scaling ) - { - - IF( GT_32( L_enr_q, L_enr_old ) ) /* Prevent energy to increase on voiced */ - { - L_enr_q = L_add( Mpy_32_16_1( L_enr_old, 32767 - SCLSYN_LAMBDA ), Mpy_32_16_1( L_enr_q, SCLSYN_LAMBDA ) ); /*Q0*/ - } - } - } - - L_enr_q = L_max( 1, L_enr_q ); - - /* gain2 = (float)sqrt( enr_q / enr2 );*/ - exp = norm_l( L_enr_q ); - tmp = extract_h( L_shl( L_enr_q, exp ) ); - - exp2 = norm_l( L_enr2 ); - tmp2 = extract_h( L_shl( L_enr2, exp2 ) ); - - exp2 = sub( exp, exp2 ); /* Denormalize and substract */ - - tmp3 = sub( tmp2, tmp ); - IF( tmp3 > 0 ) - { - tmp2 = shr( tmp2, 1 ); - exp2 = add( exp2, 1 ); - } - - tmp = div_s( tmp2, tmp ); - - L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp2 ); - gain2 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - /*-----------------------------------------------------------------* - * Clipping of the smoothing gain at the frame end - *-----------------------------------------------------------------*/ - - gain2 = s_min( gain2, 19661 /*1.2f in Q14*/ ); /* Gain modification clipping */ - if ( LT_32( L_enr_q, 2 ) ) - { - gain2 = s_min( gain2, 16384 /*1.0f in Q14*/ ); /* Gain modification clipping */ - } - - /*-----------------------------------------------------------------* - * Find the energy/gain at the beginning of the frame to ensure smooth transition after erasure(s) - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( clas, SIN_ONSET ) ) /* slow increase */ - { - gain1 = shr( gain2, 1 ); /*0.5f * gain2*/ - } - /*------------------------------------------------------------* - * voiced->unvoiced transition recovery - *------------------------------------------------------------*/ - ELSE IF( ( GE_16( last_good, VOICED_TRANSITION ) && LT_16( last_good, INACTIVE_CLAS ) && ( clas == UNVOICED_CLAS || EQ_16( clas, INACTIVE_CLAS ) ) ) || /* voiced->unvoiced transition recovery */ - EQ_32( last_core_brate, SID_1k75 ) || EQ_32( last_core_brate, SID_2k40 ) || last_core_brate == FRAME_NO_DATA ) /* CNG -> active signal transition */ - { - gain1 = gain2; /*Q14*/ - move16(); - } - ELSE - { - /*--------------------------------------------------------* - * Find the energy at the beginning of the frame - *--------------------------------------------------------*/ - tmp = frame_ener_fx( L_frame, clas, synth, pitch[0], &L_enr1, 0, Q_syn, 3, 0 ); - - /*gain1 = (float)sqrt( enr_old / enr1 );*/ - exp = norm_l( L_enr_old ); - tmp = extract_h( L_shl( L_enr_old, exp ) ); - exp2 = norm_l( L_enr1 ); - tmp2 = extract_h( L_shl( L_enr1, exp2 ) ); - - exp2 = sub( exp, exp2 ); /* Denormalize and substract */ - - tmp3 = sub( tmp2, tmp ); - - IF( tmp3 > 0 ) - { - tmp2 = shr( tmp2, 1 ); - exp2 = add( exp2, 1 ); - } - - tmp = div_s( tmp2, tmp ); - - L_tmp = L_deposit_h( tmp ); - L_tmp = Isqrt_lc( L_tmp, &exp2 ); - gain1 = round_fx_sat( L_shl_sat( L_tmp, sub( exp2, 1 ) ) ); /* in Q14 */ - /* exp2 is always <= 1 */ - - gain1 = s_min( gain1, 19661 /*1.2F in Q14*/ ); - - test(); - test(); - if ( avoid_lpc_burst_on_recovery && ( GT_16( enr_LP, 160 ) ) && ( LE_16( enr_LP, shl_sat( *old_enr_LP, 1 ) ) ) ) - { - gain1 = s_min( gain1, 16384 /*1.0f in Q14*/ ); - } - - /*--------------------------------------------------------* - * Prevent a catastrophy in case of offset followed by onset - *--------------------------------------------------------*/ - test(); - if ( ( EQ_16( clas, ONSET ) ) && ( GT_16( gain1, gain2 ) ) ) - { - gain1 = gain2; /*Q14*/ - move16(); - } - } - /*-----------------------------------------------------------------* - * Smooth the energy evolution by exponentially evolving from - * gain1 to gain2 - *-----------------------------------------------------------------*/ - - L_tmp = L_mult( gain2, (Word16) ( 32768 /*Q15*/ - AGC_FX ) ); - - FOR( i = 0; i < L_frame; i++ ) - { - gain1 = mac_r( L_tmp, gain1, AGC_FX ); /* in Q14 */ - exc[i] = mac_r_sat( L_mult_sat( exc[i], gain1 ), exc[i], gain1 ); - move16(); - exc2[i] = mac_r_sat( L_mult_sat( exc2[i], gain1 ), exc2[i], gain1 ); - move16(); - } - - Copy( mem_tmp, mem_syn, M ); /* Q_syn */ - syn_12k8_fx( L_frame, Aq, exc2, synth, mem_syn, 1, Q_exc, Q_syn ); - *update_flg = 1; - move16(); - } - } - /*-----------------------------------------------------------------* - * Update low-pass filtered energy for voiced frames - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( !bfi && ( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) ) - { - IF( EQ_16( clas, VOICED_TRANSITION ) ) - { - L_enr2_av = L_enr2; /*Q0*/ - move32(); - frame_ener_fx( L_frame, VOICED_CLAS, synth, pitch[sub( shr( L_frame, 6 ), 1 )], &L_ener2_max /*Q0*/, 1, Q_syn, 3, 0 ); - } - ELSE - { - L_ener2_max = L_enr2; /*Q0*/ - move32(); - frame_ener_fx( L_frame, UNVOICED_CLAS, synth, pitch[sub( shr( L_frame, 6 ), 1 )], &L_enr2_av /*Q0*/, 1, Q_syn, 3, 0 ); - } - - /**lp_ener_FEC_av = 0.2f * enr2_av + 0.8f * *lp_ener_FEC_av; move32();*/ - *lp_ener_FEC_av = Madd_32_16( Mult_32_16( *lp_ener_FEC_av, 31130 /*0.95f in Q15*/ ), L_enr2_av, 1638 /*0.05F Q15*/ ); /*Q0*/ - move32(); - /**lp_ener_FEC_max = 0.2f * enr2_max + 0.8f * *lp_ener_FEC_max; move32();*/ - *lp_ener_FEC_max = Madd_32_16( Mult_32_16( *lp_ener_FEC_max, 31130 /*0.95f in Q15*/ ), L_ener2_max, 1638 /*0.05F Q15*/ ); /*Q0*/ - move32(); - } - - /*-----------------------------------------------------------------* - * Update the LP filter energy for voiced frames - *-----------------------------------------------------------------*/ - test(); - if ( GE_16( clas, VOICED_TRANSITION ) && LT_16( clas, INACTIVE_CLAS ) ) - { - *old_enr_LP = enr_LP; /*Q3*/ - move16(); - } - - return; -} -#endif -void FEC_scale_syn_ivas_fx( - const Word16 L_frame, /* i : length of the frame */ - Word16 *update_flg, /* o: flag indicating re-synthesis after scaling*/ - Word16 clas, /* i/o: frame classification */ - const Word16 last_good, /* i: last good frame classification */ - Word16 *synth, /* i/o: synthesized speech at Fs = 12k8 Hz Q_syn*/ - const Word16 *pitch, /* i: pitch values for each subframe Q0*/ - Word32 L_enr_old, /* i: energy at the end of previous frame */ - Word32 L_enr_q, /* i: transmitted energy for current frame */ - const Word16 coder_type, /* i: coder type */ - const Word16 LSF_Q_prediction, /* i : LSF prediction mode */ - Word16 *scaling_flag, /* i/o: flag to indicate energy control of syn */ - Word32 *lp_ener_FEC_av, /* i/o: averaged voiced signal energy Q0*/ - Word32 *lp_ener_FEC_max, /* i/o: averaged voiced signal energy Q0*/ - const Word16 bfi, /* i: current frame BFI */ - const Word32 total_brate, /* i: total bitrate */ - const Word16 prev_bfi, /* i: previous frame BFI */ - const Word32 last_core_brate, /* i: previous frame core bitrate */ - Word16 *exc, /* i/o: excitation signal without enhancement */ - Word16 *exc2, /* i/o: excitation signal with enhancement */ - Word16 Aq[], /* i/o: LP filter coefs (can be modified if BR) Q12*/ - Word16 *old_enr_LP, /* i/o: LP filter E of last good voiced frame Q3*/ - const Word16 *mem_tmp, /* i: temp. initial synthesis filter states Q_syn*/ - Word16 *mem_syn, /* o: initial synthesis filter states Q_syn*/ - Word16 Q_exc, - Word16 Q_syn, -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif + const Word16 element_mode, /* i : element mode */ const Word16 avoid_lpc_burst_on_recovery, /* i : if true the excitation energy is limited if LP has big gain */ const Word16 force_scaling /* i: force scaling */ ) @@ -742,12 +174,8 @@ void FEC_scale_syn_ivas_fx( tmp = sub( 3, getScaleFactor16( synth, L_frame ) ); -#ifdef REMOVE_EVS_DUPLICATES test(); IF( tmp > 0 && GT_16( element_mode, EVS_MONO ) ) -#else - IF( tmp > 0 ) -#endif { Word16 synth_tmp[L_FRAME16k]; Copy_Scale_sig( synth, synth_tmp, L_frame, -tmp ); // Q_synth - tmp diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 3570ce86d..32aab2bb0 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -1,57 +1,72 @@ +/****************************************************************************************************** + + (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + /*==================================================================================== - EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0 + EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 ====================================================================================*/ - #include #include -#include "options.h" /* Compilation switches */ -#include "rom_com.h" /* Static table prototypes */ -#include "prot_fx.h" /* Function prototypes */ +#include +#include "options.h" +#include "cnst.h" +#include "rom_com.h" +#include "prot_fx.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "wmc_auto.h" #include "ivas_prot_fx.h" -#include "ivas_cnst.h" /* Common constants */ -#include "cnst.h" /* Common constants */ - -#ifndef REMOVE_EVS_DUPLICATES -/*==========================================================================*/ -/* FUNCTION : void acelp_core_dec_fx () */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : ACELP core decoder */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ Word16 coder_type i : coder type */ - -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ Word16 *voice_factors o : voicing factors Q15 */ -/* _ Word16 old_syn_12k8_16k[] o : intermediate ACELP Q_syn2-1 */ -/* synthesis at 12.8kHz or 16kHz to be used by SWB BWE */ -/* _ Word16 synth_out[] o : synthesis Q_syn2-1 */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* _ Decoder_State_fx *st_fx: */ -/* _ Word16 bwe_exc_extended[] i/o: bandwidth extended excitation Q0*/ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* CALLED FROM : RX */ -/*==========================================================================*/ + + +/*-------------------------------------------------------------------* + * acelp_core_dec_fx() + * + * ACELP core decoder + *-------------------------------------------------------------------*/ ivas_error acelp_core_dec_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - Word16 output[], /* o : synthesis @internal Fs */ - Word16 synth_out[], /* o : synthesis Q_syn2-1*/ - Word16 save_hb_synth[], /* o : HB synthesis */ - Word32 bwe_exc_extended[], /* i/o: bandwidth extended excitation Q0*/ - Word16 *voice_factors, /* o : voicing factors Q15 */ - Word16 old_syn_12k8_16k[], /* o : intermediate ACELP synthesis for SWB BWE Q_syn2-1*/ - Word16 sharpFlag, - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ + Decoder_State *st, /* i/o: decoder state structure */ + Word16 output_fx[], /* o : synthesis @internal Fs Q_syn*/ + Word16 synth_fx16[], /* o : synthesis Q_syn2*/ + Word16 save_hb_synth_fx16[], /* o : HB synthesis Q0*/ + Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation 2*Q_exc*/ + Word16 *voice_factors_fx, /* o : voicing factors Q15*/ + Word16 old_syn_12k8_16k_fx[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE Q_syn2-1*/ + const Word16 sharpFlag, /* i : formant sharpening flag */ + Word16 pitch_buf_fx[NB_SUBFR16k], /* o : Word16 pitch for each subframe Q6*/ Word16 *unbits, /* o : number of unused bits */ Word16 *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const Word16 tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle Qlog2(2.56)*/ + const Word16 tdm_lspQ_PCh_fx[M], /* i : Q LSPs for primary channel Q15*/ + const Word16 tdm_lsfQ_PCh_fx[M], /* i : Q LSFs for primary channel */ const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ const Word16 last_element_mode, /* i : last element mode */ const Word32 last_element_brate, /* i : last element bitrate */ @@ -61,96 +76,158 @@ ivas_error acelp_core_dec_fx( const Word16 read_sid_info /* i : read SID info flag */ ) { - Word16 old_exc_fx[L_EXC_DEC] = { 0 }, *exc_fx; /* excitation signal buffer (Q0) */ - Word16 syn_fx_tmp[L_FRAME_16k + L_SUBFR], *syn_fx; /* synthesis signal buffer */ - Word16 temp_buf[L_FRAME16k + L_SYN_MEM]; + Word32 synth_fx[960], save_hb_synth_fx[960] /*, bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]*/; + Word16 old_exc_fx[L_EXC_DEC], *exc_fx; /* excitation signal buffer */ + Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ Word16 output_frame; /* frame length at output sampling freq. */ + Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ + Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ + Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ + Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ + Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ Word32 enr_q_fx; /* E information for FER protection */ Word16 tmp_noise_fx; /* Long term temporary noise energy */ - Word16 i, int_fs; - Word16 tc_subfr_fx; - Word16 allow_cn_step_fx; + Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ + Word16 FEC_pitch_fx; /* FEC pitch */ + Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ + Word16 *bwe_exc_fx; /* Excitation for SWB TBE */ + Word16 i, j, int_fs; + Word16 tc_subfr; + Word16 allow_cn_step; Word16 temp_buf_fx[L_FRAME16k + L_SYN_MEM]; - - Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )] = { 0 }; /*Q12*/ - Word16 Es_pred_fx; /*Q8*/ - Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )] = { 0 }; /* excitation buffer Q_exc*/ - Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ - Word16 *bwe_exc_fx; - Word16 lsf_new_fx[M]; /* LSFs at the end of the frame */ - Word16 lsp_new_fx[M]; /* LSPs at the end of the frame */ - Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ - Word16 FEC_pitch_fx; /*Q6*/ Word16 last_pulse_pos; Word16 T0_tmp; - Word16 do_WI_fx; + Word16 do_WI; Word16 dct_buffer_fx[DCT_L_POST]; Word16 exc_buffer_fx[DCT_L_POST]; - Word16 dct_exc_tmp[L_FRAME16k]; - Word16 qdct; - Word16 delta_mem_scale; - Word16 bpf_error_signal[L_FRAME16k]; - CLDFB_SCALE_FACTOR scaleFactor; - Word32 workBuffer[128 * 3]; - Word32 q_env[20]; - Word16 exc3_fx[L_FRAME16k]; - Word16 syn1_fx_tmp[L_FRAME16k + 2], *syn1_fx; - Word32 *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; - Word16 gain_buf[NB_SUBFR16k]; /*Q14*/ + Word16 dct_exc_tmp_fx[L_FRAME16k]; + Word16 nb_bits; /* number of bits */ + Word16 indice; /* parameter indices to write */ + Word16 gain_buf_fx[NB_SUBFR16k]; Word16 syn_fx_tmp2[L_FRAME_16k]; Word16 pitch_buf_tmp[NB_SUBFR16k]; - Word16 k; Word16 update_flg; - Word32 realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word16 LSF_Q_prediction; /* o : LSF prediction mode */ + Word32 q_env_fx[20]; + Word16 exc3_fx[L_FRAME16k]; + Word16 syn1_tmp_fx[L_FRAME16k + 2], *syn1_fx; + Word32 *realBuffer_fx[CLDFB_NO_COL_MAX], *imagBuffer_fx[CLDFB_NO_COL_MAX]; + Word32 realBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 LSF_Q_prediction; /* LSF prediction mode */ Word16 avoid_lpc_burst_on_recovery; - Word16 uc_two_stage_flag, dec; - Word16 nb_bits, indice; + Word16 tmpF_fx; + Word16 uc_two_stage_flag; Word16 tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; - MUSIC_POSTFILT_HANDLE hMusicPF; - BPF_DEC_HANDLE hBPF; - TD_BWE_DEC_HANDLE hBWE_TD; - FD_BWE_DEC_HANDLE hBWE_FD; - TCX_DEC_HANDLE hTcxDec; + Word16 *old_exc_s_fx; /* Start of last excitation frame */ + Word16 *p_tdm_Pri_pitch_buf_fx; + Word16 tmp, exp, local_element_mode; ivas_error error; - (void) ( tdm_lspQ_PCh ); - (void) ( tdm_lsfQ_PCh ); - (void) ( use_cldfb_for_dft ); - (void) ( last_element_mode ); - (void) ( last_element_brate ); - (void) ( flag_sec_CNA ); - (void) ( nchan_out ); - (void) ( save_hb_synth ); - (void) ( output ); - (void) ( read_sid_info ); - (void) hStereoCng; - hMusicPF = st_fx->hMusicPF; - hBPF = st_fx->hBPF; - hBWE_TD = st_fx->hBWE_TD; - hBWE_FD = st_fx->hBWE_FD; - hTcxDec = st_fx->hTcxDec; + Word32 bpf_error_signal_fx[L_FRAME16k]; + Word16 bpf_error_signal_16fx[L_FRAME16k]; + Word16 Q_real; + Word32 max_real, max_imag, max_val; + + set32_fx( bpf_error_signal_fx, 0, L_FRAME16k ); + set16_fx( bpf_error_signal_16fx, 0, L_FRAME16k ); + set16_fx( Aq_fx, 0, NB_SUBFR16k * ( M + 1 ) ); + set16_fx( old_bwe_exc_fx, 0, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ) ); + error = IVAS_ERR_OK; move32(); - // IF ( EQ_16(st_fx->element_mode, IVAS_CPE_MDCT) && EQ_16(nchan_out, 1) && EQ_16(st_fx->idchan, 1) && LE_32(last_element_brate, IVAS_SID_4k4) ) + test(); test(); test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st_fx->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) { /* In MDCT-Stereo DTX with mono output, we can skip CNG for the second channel, except for the first inactive frame following an active period */ return error; } + push_wmops( "acelp_core_dec" ); + + /* output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); */ + output_frame = extract_l( Mpy_32_32( st->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); + + /*----------------------------------------------------------------* + * stereo SID and CNG frames processing + *----------------------------------------------------------------*/ + + test(); + test(); + IF( LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_16( nchan_out, 2 ) ) + { + IF( EQ_16( st->cng_type, FD_CNG ) ) + { + configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + + Word16 old_NoiseEstExp; + old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; + move16(); + + /* Only run parameter decoding in SID frames */ + IF( EQ_32( st->core_brate, SID_2k40 ) ) + { + FdCng_decodeSID_ivas_fx( st ); + + Word16 n1, n2; + n1 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART ); + n2 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART ); + + Word16 common_e = s_max( sub( old_NoiseEstExp, n2 ), sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, n1 ) ); + scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, common_e ) ); + scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( old_NoiseEstExp, common_e ) ); + st->hFdCngDec->hFdCngCom->sidNoiseEstExp = common_e; + move16(); + } + + FOR( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), + STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); + move32(); + } + + ApplyFdCng_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); + } + ELSE + { + configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); + + /* decode CNG parameters */ + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + + /* comfort noise generation */ + CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); + + Copy( Aq_fx, st->Aq_cng, M + 1 ); /*Q12*/ + + /* update old LSP and LSF vector */ + Copy( lsf_new_fx, st->lsf_old_fx, M ); /*Qlog2(2.56)*/ + Copy( lsp_new_fx, st->lsp_old_fx, M ); /*Q15*/ + } + + set16_fx( output_fx, 0, output_frame ); /* output and synth are not used in DFT domain CNG generation and the decoder output is unaffected if they are left uninitalized */ + set16_fx( synth_fx16, 0, output_frame ); /* They are however read in a few places which causes errors in the valgrind tests. Simplest solution from a code perspective was to set them to zero. */ + + /* CN generation done in DFT domain */ + pop_wmops(); + + return error; + } + + /*----------------------------------------------------------------* + * Active frames processing + *----------------------------------------------------------------*/ + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) { - set32_fx( realBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( imagBufferTmp[i], 0, CLDFB_NO_CHANNELS_MAX ); - realBuffer[i] = realBufferTmp[i]; - move32(); - imagBuffer[i] = imagBufferTmp[i]; - move32(); + set32_fx( realBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( imagBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer_fx[i] = realBufferTmp_fx[i]; + imagBuffer_fx[i] = imagBufferTmp_fx[i]; } /*----------------------------------------------------------------* @@ -159,54 +236,61 @@ ivas_error acelp_core_dec_fx( LSF_Q_prediction = -1; move16(); - set16_fx( syn_fx_tmp, 0, L_SUBFR ); - syn_fx = syn_fx_tmp + L_SUBFR; - syn1_fx_tmp[0] = 0; + set16_fx( syn_tmp_fx, 0, L_SUBFR ); + psyn_fx = syn_tmp_fx + L_SUBFR; + syn1_tmp_fx[0] = 0; move16(); - syn1_fx_tmp[1] = 0; + syn1_tmp_fx[1] = 0; move16(); - syn1_fx = syn1_fx_tmp + 2; - /*output_frame = (Word16)(st_fx->output_Fs_fx / 50); move16();*/ - output_frame = st_fx->output_frame_fx; - move16(); - st_fx->bpf_off = 0; + syn1_fx = syn1_tmp_fx + 2; + st->bpf_off = 0; move16(); + test(); test(); test(); test(); test(); test(); - IF( EQ_16( st_fx->last_core, HQ_CORE ) || EQ_16( st_fx->last_core, TCX_20_CORE ) || EQ_16( st_fx->last_core, TCX_10_CORE ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_DFT ) && LE_32( st_fx->last_core_brate, SID_2k40 ) ) || ( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && LE_32( st_fx->last_core_brate, SID_2k40 ) ) ) + IF( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && LE_32( st->last_core_brate, SID_2k40 ) ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LE_32( st->last_core_brate, SID_2k40 ) ) ) { /* in case of HQ->ACELP switching, do not apply BPF */ - st_fx->bpf_off = 1; + st->bpf_off = 1; move16(); - /* in case of core switching, reset post-filter memories */ - if ( st_fx->hPFstat != NULL ) + if ( st->hPFstat != NULL ) { - st_fx->hPFstat->on = 0; + /* in case of core switching, reset post-filter memories */ + st->hPFstat->on = 0; move16(); } - /* reset the GSC pre echo energy threshold in case of switching */ - if ( st_fx->hGSCDec != NULL ) + if ( st->hGSCDec != NULL ) { - st_fx->hGSCDec->Last_frame_ener_fx = MAX_32; + /* reset the GSC pre echo energy threshold in case of switching */ + st->hGSCDec->Last_frame_ener_fx = MAX_32; move32(); } } - IF( st_fx->prev_bfi > 0 ) + + test(); + if ( st->hGSCDec != NULL && ( st->prev_bfi > 0 ) ) { /* reset the GSC pre echo energy threshold in case of FEC */ - if ( st_fx->hGSCDec != NULL ) - { - st_fx->hGSCDec->Last_frame_ener_fx = MAX_32; + st->hGSCDec->Last_frame_ener_fx = MAX_32; move32(); } + + test(); + test(); + test(); + test(); + IF( st->hFdCngDec != NULL && ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || st->last_core_brate == FRAME_NO_DATA ) ) + { + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); } - st_fx->clas_dec = st_fx->last_good; + st->clas_dec = st->last_good; move16(); enr_q_fx = 0; move32(); @@ -214,21 +298,22 @@ ivas_error acelp_core_dec_fx( move16(); tmp_noise_fx = 0; move16(); - Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); // Q_exc + Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ exc_fx = old_exc_fx + L_EXC_MEM_DEC; - IF( st_fx->hWIDec != NULL ) + IF( st->hWIDec != NULL ) { - Copy( st_fx->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); + Copy( st->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); } ELSE { set16_fx( old_exc2_fx, 0, L_EXC_MEM ); } exc2_fx = old_exc2_fx + L_EXC_MEM; - IF( st_fx->hBWE_TD != NULL ) + + IF( st->hBWE_TD != NULL ) { - Copy( hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); // Q_exc + Copy( st->hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); /*Q_exc*/ bwe_exc_fx = old_bwe_exc_fx + PIT16k_MAX * 2; } ELSE @@ -238,271 +323,270 @@ ivas_error acelp_core_dec_fx( last_pulse_pos = 0; move16(); - do_WI_fx = 0; + do_WI = 0; move16(); - st_fx->GSC_noisy_speech = 0; + st->GSC_noisy_speech = 0; move16(); - st_fx->relax_prev_lsf_interp = 0; + st->relax_prev_lsf_interp = 0; move16(); + set16_fx( gain_buf_fx, 0, NB_SUBFR16k ); - set16_fx( gain_buf, 0, NB_SUBFR16k ); - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - st_fx->gamma = GAMMA1; + st->gamma = GAMMA1; move16(); - st_fx->preemph_fac = PREEMPH_FAC; + st->inv_gamma = GAMMA1_INV; move16(); - int_fs = INT_FS_FX; + st->preemph_fac = PREEMPH_FAC; + move16(); + int_fs = INT_FS_12k8; move16(); } ELSE { - st_fx->gamma = GAMMA16k; + st->gamma = GAMMA16k; + move16(); + st->inv_gamma = GAMMA16k_INV; move16(); - st_fx->preemph_fac = PREEMPH_FAC_16k; + st->preemph_fac = PREEMPH_FAC_16k; move16(); int_fs = INT_FS_16k; move16(); } - /* reset post-filter in case post-filtering was off in previous frame */ - IF( st_fx->hPFstat != NULL ) - { - if ( st_fx->hPFstat->on == 0 ) + test(); + /* reset post-filter in case of switching */ + if ( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) { - st_fx->hPFstat->reset = 1; + st->hPFstat->reset = 1; move16(); } - } + avoid_lpc_burst_on_recovery = 0; move16(); test(); test(); - if ( st_fx->last_con_tcx && NE_16( st_fx->L_frameTCX_past, st_fx->L_frame ) && st_fx->last_core != 0 ) + if ( st->last_con_tcx && NE_16( st->L_frameTCX_past, st->L_frame ) && ( st->last_core != 0 ) ) { avoid_lpc_burst_on_recovery = 1; move16(); } - /* TD stereo parameters */ test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && st_fx->idchan == 1 ) + + /* TD stereo parameters */ + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) { tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; - tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; - tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; - move16(); move16(); + tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; move16(); + tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; move16(); + p_tdm_Pri_pitch_buf_fx = hStereoTD->tdm_Pri_pitch_buf_fx; } ELSE { tdm_lp_reuse_flag = 0; - tdm_low_rate_mode = 0; move16(); + tdm_low_rate_mode = 0; move16(); test(); - if ( EQ_16( st_fx->element_mode, IVAS_SCE ) && st_fx->low_rate_mode ) + if ( EQ_16( st->element_mode, IVAS_SCE ) && st->low_rate_mode ) { tdm_low_rate_mode = 1; move16(); } tdm_Pitch_reuse_flag = 0; move16(); + p_tdm_Pri_pitch_buf_fx = NULL; } + /*----------------------------------------------------------------* * Updates in case of internal sampling rate switching *----------------------------------------------------------------*/ + test(); test(); - IF( NE_16( st_fx->last_L_frame, st_fx->L_frame ) && ( st_fx->last_core == ACELP_CORE || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) + IF( NE_16( st->last_L_frame, st->L_frame ) && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { - IF( st_fx->hPFstat->on != 0 ) + Word16 dec; + + IF( ( st->hPFstat->on != 0 ) ) { Word16 mem_syn_r_size_old, mem_syn_r_size_new; - - mem_syn_r_size_old = shr( st_fx->last_L_frame, 4 ); - mem_syn_r_size_new = shr( st_fx->L_frame, 4 ); - lerp( st_fx->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_old, st_fx->hPFstat->mem_stp + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st_fx->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_old, st_fx->hPFstat->mem_pf_in + L_SYN_MEM - mem_syn_r_size_new, mem_syn_r_size_new, mem_syn_r_size_old ); + mem_syn_r_size_old = mult_r( 2048, st->last_L_frame ); /* 1.25/20.f = 2048 (Q15)*/ + mem_syn_r_size_new = mult_r( 2048, st->L_frame ); /* 1.25/20.f = 2048 (Q15)*/ + lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); + lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); } + /* convert quantized LSP vector */ - st_fx->rate_switching_reset = lsp_convert_poly_fx( st_fx->lsp_old_fx, st_fx->L_frame, 0 ); + st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 ); move16(); + /* convert old quantized LSF vector */ - lsp2lsf_fx( st_fx->lsp_old_fx, st_fx->lsf_old_fx, M, int_fs ); + lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, int_fs ); /* FEC - update adaptive LSF mean vector */ - Copy( st_fx->lsf_old_fx, st_fx->lsfoldbfi1_fx, M ); // Qlog2(2.56) - Copy( st_fx->lsf_old_fx, st_fx->lsfoldbfi0_fx, M ); // Qlog2(2.56) - Copy( st_fx->lsf_old_fx, st_fx->lsf_adaptive_mean_fx, M ); // Qlog2(2.56) + Copy( st->lsf_old_fx, st->lsfoldbfi1_fx, M ); /*Qlog2(2.56)*/ + Copy( st->lsf_old_fx, st->lsfoldbfi0_fx, M ); /*Qlog2(2.56)*/ + Copy( st->lsf_old_fx, st->lsf_adaptive_mean_fx, M ); /*Qlog2(2.56)*/ /* Reset LPC mem */ - IF( EQ_32( st_fx->sr_core, INT_FS_16k ) ) + IF( EQ_32( st->sr_core, INT_FS_16k ) ) { - Copy( GEWB2_Ave_fx, st_fx->mem_AR_fx, M ); // Qlog2(2.56) + Copy( GEWB2_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ } ELSE { - Copy( GEWB_Ave_fx, st_fx->mem_AR_fx, M ); // Qlog2(2.56) + Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ } - set16_fx( st_fx->mem_MA_fx, 0, M ); + set16_fx( st->mem_MA_fx, 0, M ); + /* update synthesis filter memories */ dec = DEC; move16(); - IF( NE_16( st_fx->element_mode, EVS_MONO ) ) + if ( st->element_mode != EVS_MONO ) { dec = DEC_IVAS; move16(); } - - /* update synthesis filter memories */ - synth_mem_updt2( st_fx->L_frame, st_fx->last_L_frame, st_fx->old_exc_fx, st_fx->mem_syn_r, st_fx->mem_syn2_fx, NULL, dec ); - - Copy( st_fx->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); // Q_exc - Copy_Scale_sig( st_fx->mem_syn2_fx, st_fx->mem_syn1_fx, M, sub( -1, st_fx->Q_syn ) ); /*Q-1*/ - - Copy( st_fx->mem_syn2_fx, st_fx->mem_syn3_fx, M ); + ivas_synth_mem_updt2_fx( st->L_frame, st->last_L_frame, st->old_exc_fx, st->mem_syn_r, st->mem_syn2_fx, NULL, dec ); + Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ + Copy_Scale_sig( st->mem_syn2_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); /*Q-1*/ + Copy( st->mem_syn2_fx, st->mem_syn3_fx, M ); /*Q_syn*/ } - IF( NE_16( st_fx->last_L_frame, st_fx->L_frame ) ) + /* update buffer of old subframe pitch values */ + IF( NE_16( st->last_L_frame, st->L_frame ) ) { - /* update buffer of old subframe pitch values */ - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - - IF( EQ_16( st_fx->last_L_frame, L_FRAME32k ) ) + IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) { - /* (float)12800/(float)32000; */ - k = 13107; // Q15 + tmpF_fx = 13107; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->last_L_frame, 512 ) ) + ELSE IF( EQ_16( st->last_L_frame, 512 ) ) { - /* (float)12800/(float)25600; */ - k = 16384; // Q15 + tmpF_fx = 16384; // Q15 move16(); } ELSE /* st->last_L_frame == L_FRAME16k */ { - /* (float)12800/(float)16000; */ - k = 26214; // Q15 + tmpF_fx = 26214; // Q15 move16(); } FOR( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) { - st_fx->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ); // Q(15+15+1-16) + st->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 move32(); } FOR( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) { - st_fx->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ); // Q15 + st->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 move32(); } } ELSE { - - IF( EQ_16( st_fx->last_L_frame, L_FRAME32k ) ) + exp = 0; + move16(); + IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) { - /* (float)16000/(float)32000; */ - k = -16384; // -0.5 in Q15 + tmpF_fx = 16384; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->last_L_frame, 512 ) ) + ELSE IF( EQ_16( st->last_L_frame, 512 ) ) { - /* tmpF = (float)16000/(float)25600; */ - k = -12288; //-0.375 in Q15 + tmpF_fx = 20480; // Q15 move16(); } ELSE /* st->last_L_frame == L_FRAME12k8 */ { - /* tmpF = (float)16000/(float)12800; */ - k = 8192; //.25 in Q15 + tmpF_fx = 20480; // Q14 + move16(); + exp = 1; move16(); } - FOR( i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i-- ) { - st_fx->old_pitch_buf_fx[i + 2] = L_add( st_fx->old_pitch_buf_fx[i], Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ) ); // Q15 + st->old_pitch_buf_fx[i + 2] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 move32(); } - st_fx->old_pitch_buf_fx[NB_SUBFR + 1] = st_fx->old_pitch_buf_fx[NB_SUBFR + 2]; + st->old_pitch_buf_fx[NB_SUBFR + 1] = st->old_pitch_buf_fx[NB_SUBFR + 2]; move32(); FOR( i = NB_SUBFR - 1; i >= 0; i-- ) { - st_fx->old_pitch_buf_fx[i + 1] = L_add( st_fx->old_pitch_buf_fx[i], Mpy_32_16_1( st_fx->old_pitch_buf_fx[i], k ) ); // Q15 + st->old_pitch_buf_fx[i + 1] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 move32(); } - st_fx->old_pitch_buf_fx[0] = st_fx->old_pitch_buf_fx[1]; + st->old_pitch_buf_fx[0] = st->old_pitch_buf_fx[1]; move32(); } } - IF( NE_16( st_fx->bfi_pitch_frame, st_fx->L_frame ) ) + IF( NE_16( st->bfi_pitch_frame, st->L_frame ) ) { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - - IF( EQ_16( st_fx->bfi_pitch_frame, L_FRAME32k ) ) + IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) { - /* (float)12800/(float)32000; */ - k = 13107; // Q15 + tmpF_fx = 13107; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->bfi_pitch_frame, 512 ) ) + ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) { - /* (float)12800/(float)25600; */ - k = 16384; // Q15 + tmpF_fx = 16384; // Q15 move16(); } ELSE /* st->bfi_pitch_frame == L_FRAME16k */ { - /* (float)12800/(float)16000; */ - k = 26214; // Q15 + tmpF_fx = 26214; // Q15 move16(); } - st_fx->bfi_pitch_fx = mult_r( k, st_fx->bfi_pitch_fx ); + st->bfi_pitch_fx = mult_r( st->bfi_pitch_fx, tmpF_fx ); move16(); - st_fx->bfi_pitch_frame = L_FRAME; + st->bfi_pitch_frame = L_FRAME; move16(); } ELSE { - - IF( EQ_16( st_fx->bfi_pitch_frame, L_FRAME32k ) ) + exp = 0; + move16(); + IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) { - /* (float)16000/(float)32000; */ - k = -16384; //-0.5 in Q15 + tmpF_fx = 16384; // Q15 move16(); } - ELSE IF( EQ_16( st_fx->bfi_pitch_frame, 512 ) ) + ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) { - /* tmpF = (float)16000/(float)25600; */ - k = -12288; // -0.375 in Q15 + tmpF_fx = 20480; // Q15 move16(); } ELSE /* st->bfi_pitch_frame == L_FRAME12k8 */ { - /* tmpF = (float)16000/(float)12800; */ - k = 8192; // .25 in Q15 + tmpF_fx = 20480; // Q14 + move16(); + exp = 1; move16(); } - st_fx->bfi_pitch_fx = add( st_fx->bfi_pitch_fx, mult_r( st_fx->bfi_pitch_fx, k ) ); + + st->bfi_pitch_fx = mult_r( shl_sat( st->bfi_pitch_fx, exp ), tmpF_fx ); move16(); - st_fx->bfi_pitch_frame = L_FRAME16k; + st->bfi_pitch_frame = L_FRAME16k; move16(); } } test(); test(); - if ( EQ_16( st_fx->last_bwidth, NB ) && NE_16( st_fx->bwidth, NB ) && st_fx->ini_frame != 0 ) + if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && ( st->ini_frame != 0 ) ) { - st_fx->rate_switching_reset = 1; + st->rate_switching_reset = 1; move16(); } @@ -510,36 +594,35 @@ ivas_error acelp_core_dec_fx( * GOOD frame *----------------------------------------------------------------------*/ - IF( !st_fx->bfi ) + IF( !st->bfi ) { /*----------------------------------------------------------------* * Decoding of TC subframe classification *----------------------------------------------------------------*/ - tc_subfr_fx = -1; + tc_subfr = -1; move16(); - IF( EQ_16( st_fx->coder_type, TRANSITION ) ) + IF( EQ_16( st->coder_type, TRANSITION ) ) { - tc_subfr_fx = tc_classif_fx( st_fx, st_fx->L_frame ); + tc_subfr = tc_classif_fx( st, st->L_frame ); } /*----------------------------------------------------------------* * Decoding of GSC IVAS mode *----------------------------------------------------------------*/ - st_fx->GSC_IVAS_mode = 0; - move16(); + test(); test(); test(); test(); - IF( ( st_fx->element_mode > EVS_MONO ) && st_fx->idchan == 0 && !( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) + IF( st->element_mode > EVS_MONO && st->idchan == 0 && !( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) { test(); test(); - IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->total_brate, MAX_GSC_INACTIVE_BRATE ) ) ) + IF( EQ_16( st->coder_type, AUDIO ) || ( EQ_16( st->coder_type, INACTIVE ) && EQ_16( st->inactive_coder_type_flag, 1 ) ) ) { - st_fx->GSC_IVAS_mode = get_next_indice( st_fx, 2 ); + st->GSC_IVAS_mode = get_next_indice_fx( st, 2 ); move16(); } } @@ -547,88 +630,215 @@ ivas_error acelp_core_dec_fx( /*----------------------------------------------------------------* * Decoding of inactive CNG frames *----------------------------------------------------------------*/ + test(); - IF( st_fx->core_brate == FRAME_NO_DATA || EQ_32( st_fx->core_brate, SID_2k40 ) ) + IF( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) { /* decode CNG parameters */ - IF( st_fx->cng_type == LP_CNG ) + IF( st->cng_type == LP_CNG ) { - - CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step_fx, sid_bw, q_env ); + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + Copy( Aq_fx, st->Aq_cng, add( M, 1 ) ); /* comfort noise generation */ - CNG_exc_fx( st_fx->core_brate, st_fx->L_frame, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate, - &st_fx->first_CNG, &( st_fx->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step_fx, &st_fx->hTdCngDec->last_allow_cn_step, st_fx->prev_Q_exc, st_fx->Q_exc, st_fx->hTdCngDec->num_ho, - q_env, st_fx->hTdCngDec->lp_env_fx, st_fx->hTdCngDec->old_env_fx, st_fx->hTdCngDec->exc_mem_fx, st_fx->hTdCngDec->exc_mem1_fx, sid_bw, &st_fx->hTdCngDec->cng_ener_seed1, exc3_fx, st_fx->Opt_AMR_WB, st_fx->element_mode ); + local_element_mode = st->element_mode; + move16(); - Copy( Aq_fx, st_fx->Aq_cng, M + 1 ); // Q12 + test(); + test(); + if ( ( EQ_16( nchan_out, 1 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) || EQ_16( st->masa_sid_format, 1 ) ) + { + local_element_mode = IVAS_SCE; /* For DFT Stereo mono decoding, run CNG_exc as in SCE */ + move16(); + } + CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3_fx, st->Opt_AMR_WB, local_element_mode ); } ELSE { test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + { + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + FdCng_decodeSID_fx( st->hFdCngDec->hFdCngCom, st ); + } + ELSE { - FdCng_decodeSID_fx( st_fx->hFdCngDec->hFdCngCom, st_fx ); + Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; + move16(); + + FdCng_decodeSID_ivas_fx( st ); + + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); + Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ), Q2 ) ); // Qx + } + *sid_bw = 0; move16(); } - generate_comfort_noise_dec_fx( NULL, NULL, NULL, st_fx, &( st_fx->Q_exc ), 2, -1 ); + IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) + { + assert( nchan_out == 1 ); + + FOR( i = 0; i < NPART; i++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), + STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); + move32(); + } + + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + + Word16 new_sidNoiseEstExp = 31 - Q4; + move16(); + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) + Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) + st->hFdCngDec->hFdCngCom->sidNoiseEstExp = new_sidNoiseEstExp; + move16(); + Word16 new_cngNoiseLevelExp = 31 - Q4; + move16(); + Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, new_cngNoiseLevelExp ) ); // Q(31-cngNoiseLevelExp) + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = new_cngNoiseLevelExp; + move16(); + + test(); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); + + IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) + { + Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); // Q(31-cngNoiseLevelExp) + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; + move16(); + } + } + + IF( !read_sid_info ) + { + Word32 noise_lvl_highest_fx; + + noise_lvl_highest_fx = st->hFdCngDec->hFdCngCom->cngNoiseLevel[( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) - 1]; + move32(); + + FOR( Word16 b = ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); b < st->hFdCngDec->hFdCngCom->stopBand; b++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel[b] = noise_lvl_highest_fx; + move32(); + } + } + + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + generate_comfort_noise_dec_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 2, -1 ); + } + ELSE + { + generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); + } - FdCng_exc( st_fx->hFdCngDec->hFdCngCom, &st_fx->CNG_mode, st_fx->L_frame, st_fx->lsp_old_fx, st_fx->first_CNG, st_fx->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); + FdCng_exc( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old_fx, st->first_CNG, st->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); - Copy( exc2_fx, exc3_fx, st_fx->L_frame ); + Copy( exc2_fx, exc3_fx, st->L_frame ); } - delta_mem_scale = 3; + Word16 delta_mem_scale = 3; move16(); test(); - if ( LT_32( st_fx->lp_ener_fx, 40 ) && ( st_fx->cng_type == LP_CNG ) ) /* very low energy frames, less than 0.3125 */ + if ( LT_32( st->lp_ener_fx, 40 ) && st->cng_type == LP_CNG ) /* very low energy frames, less than 0.3125 */ { delta_mem_scale = 0; move16(); } - i = st_fx->Q_exc; + i = st->Q_exc; move16(); - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, - st_fx->L_frame * HIBND_ACB_L_FAC, 0, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, 0, INACTIVE ); - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, delta_mem_scale, - &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 0, 0, NULL ); - Copy_Scale_sig( exc2_fx, exc2_fx, st_fx->L_frame, sub( st_fx->Q_exc, i ) ); // Q_exc + + test(); + IF( st->hMusicPF && st->hGSCDec ) + { + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV: should 'st_fx->L_frame * HIBND_ACB_L_FAC' be corrected in EVS? + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, + st->L_frame * HIBND_ACB_L_FAC, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); + } + ELSE + { + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, + L_FRAME32k, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); + } + } + + IF( st->hPFstat != NULL ) + { + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, + &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 0, 0, NULL ); + } + ELSE + { + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, + &st->mem_deemph_fx, NULL, NULL, &st->agc_mem_fx[1], NULL, 0, 0, NULL ); + } + + Copy_Scale_sig( exc2_fx, exc2_fx, st->L_frame, sub( st->Q_exc, i ) ); // Q_exc /* update past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) + IF( st->hMusicPF != NULL ) { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + /* Update music post processing values */ /* Filter energies update */ + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + FOR( i = 0; i < DCT_L_POST; i++ ) + { + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); + move16(); + } + } + ELSE + { FOR( i = 0; i < DCT_L_POST; i++ ) { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + st->hMusicPF->filt_lfE_fx[i] = add( 9830, mult_r( 22937, st->hMusicPF->filt_lfE_fx[i] ) ); // Q15, 9830 =.3f in Q15, 22937=.7f in Q15 move16(); } } + } + /* synthesis at 12.8kHz sampling rate */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc3_fx, syn1_fx, st_fx->mem_syn3_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); + move16(); + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); + syn_12k8_fx( st->L_frame, Aq_fx, exc3_fx, syn1_fx, st->mem_syn3_fx, 1, st->Q_exc, st->Q_syn ); /* reset the decoder */ - CNG_reset_dec_fx( st_fx, pitch_buf_fx, voice_factors ); + CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { /* update st_fx->mem_syn1 for ACELP core switching */ - Copy( st_fx->mem_syn3_fx, st_fx->mem_syn1_fx, M ); + Copy( st->mem_syn3_fx, st->mem_syn1_fx, M ); + } + ELSE + { + st->Q_syn_cng = st->Q_syn; + move16(); + st->Q_exc_cng = st->Q_exc; + move16(); - /* update old synthesis for classification */ - Copy( syn1_fx + st_fx->L_frame - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); + /* update st->mem_syn1 for ACELP core switching */ + Copy_Scale_sig( st->mem_syn3_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); // Q(-1) + } + /* update old synthesis for classification */ + Copy( syn1_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); /* save and delay synthesis to be used by SWB BWE */ - Copy_Scale_sig( syn1_fx, temp_buf_fx, st_fx->L_frame, sub( -1, st_fx->Q_syn ) ); // Q_syn -> Q(-1) - IF( hBWE_FD != NULL ) + Copy_Scale_sig( syn1_fx, temp_buf_fx, st->L_frame, sub( -1, st->Q_syn ) ); // Q_syn -> Q(-1) + IF( st->hBWE_FD != NULL ) { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); } } @@ -638,21 +848,24 @@ ivas_error acelp_core_dec_fx( ELSE { + /*-----------------------------------------------------------------* * Configure ACELP bit allocation *-----------------------------------------------------------------*/ + nb_bits = 0; - st_fx->acelp_cfg.FEC_mode = 0; - uc_two_stage_flag = 0; move16(); + st->acelp_cfg.FEC_mode = 0; move16(); + uc_two_stage_flag = 0; move16(); + test(); - IF( !st_fx->nelp_mode_dec && !st_fx->ppp_mode_dec ) + IF( !st->nelp_mode_dec && !st->ppp_mode_dec ) { Word16 tc_subfr_tmp; - tc_subfr_tmp = tc_subfr_fx; + tc_subfr_tmp = tc_subfr; move16(); if ( LT_16( tc_subfr_tmp, L_SUBFR ) ) { @@ -660,19 +873,19 @@ ivas_error acelp_core_dec_fx( move16(); } - if ( EQ_16( tc_subfr_fx, TC_0_192 ) ) + if ( EQ_16( tc_subfr, TC_0_192 ) ) { nb_bits = -1; move16(); } - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); test(); test(); - IF( EQ_16( st_fx->coder_type, TRANSITION ) && LT_16( tc_subfr_fx, L_SUBFR ) && EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->coder_type, TRANSITION ) && LT_16( tc_subfr, L_SUBFR ) && EQ_16( st->L_frame, L_FRAME ) ) { - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, TRANSITION, -1, tc_subfr_fx, 2, &nb_bits, unbits, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } } @@ -682,51 +895,126 @@ ivas_error acelp_core_dec_fx( test(); test(); - IF( st_fx->hTdCngDec != NULL && ( st_fx->last_core_brate == FRAME_NO_DATA || EQ_32( st_fx->last_core_brate, SID_2k40 ) ) ) + IF( st->hTdCngDec != NULL && ( st->last_core_brate == FRAME_NO_DATA || EQ_32( st->last_core_brate, SID_2k40 ) ) ) { - Copy( st_fx->lspCNG_fx, st_fx->lsp_old_fx, M ); // Q15 - - lsp2lsf_fx( st_fx->lspCNG_fx, st_fx->lsf_old_fx, M, int_fs ); + Copy( st->lspCNG_fx, st->lsp_old_fx, M ); /*Q15*/ + lsp2lsf_fx( st->lspCNG_fx, st->lsf_old_fx, M, int_fs ); } /*-----------------------------------------------------------------* * Reset higher ACELP pre-quantizer in case of switching *-----------------------------------------------------------------*/ - IF( !st_fx->use_acelp_preq ) + IF( !st->use_acelp_preq ) { - st_fx->mem_preemp_preQ_fx = 0; + st->mem_preemp_preQ_fx = 0; + move16(); + st->last_nq_preQ = 0; move16(); - st_fx->last_nq_preQ = 0; + st->last_code_preq = 0; move16(); } - st_fx->use_acelp_preq = 0; + st->use_acelp_preq = 0; move16(); /*-----------------------------------------------------------------* * LSF de-quantization and interpolation *-----------------------------------------------------------------*/ - lsf_dec_fx( st_fx, tc_subfr_fx, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, - tdm_lsfQ_PCh ); + IF( !tdm_lp_reuse_flag ) + { + lsf_dec_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); + } + ELSE + { + const Word16 *pt_interp_2_fx; + + IF( NE_16( st->active_cnt, 1 ) ) + { + Word16 beta_index; + + beta_index = get_next_indice_fx( st, TDM_IC_LSF_PRED_BITS ); + tdm_SCh_lsf_reuse_fx( DEC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, NULL, &beta_index ); + } + ELSE + { + Copy( tdm_lspQ_PCh_fx, lsp_new_fx, M ); + Copy( tdm_lsfQ_PCh_fx, lsf_new_fx, M ); + } + + IF( st->rate_switching_reset ) + { + /* extrapolation in case of unstable LSF convert */ + Copy( lsp_new_fx, st->lsp_old_fx, M ); + Copy( lsf_new_fx, st->lsf_old_fx, M ); + } + + pt_interp_2_fx = interpol_frac_fx; + test(); + if ( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( st->coder_type, UNVOICED ) ) + { + pt_interp_2_fx = interpol_frac2_fx; + } + + IF( EQ_16( st->active_cnt, 1 ) ) + { + Copy( lsp_new_fx, st->lsp_old_fx, M ); + lsp2lsf_fx( lsp_new_fx, st->lsf_old_fx, M, st->sr_core ); + } + + /* LSP interpolation and conversion of LSPs to A(z) */ + int_lsp_fx( st->L_frame, st->lsp_old_fx, lsp_new_fx, Aq_fx, M, pt_interp_2_fx, 0 ); + + /* Check LSF stability (distance between old LSFs and current LSFs) */ + st->stab_fac_fx = lsf_stab_ivas_fx( lsf_new_fx, st->lsf_old_fx, 0, st->L_frame ); + move16(); + } + + test(); + IF( EQ_16( st->last_core, HQ_CORE ) && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory from last HQ frame */ + old_exc_s_fx = st->old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ); + tmpF_fx = *old_exc_s_fx; + st->mem_deemph_fx = shl_sat( old_exc_s_fx[st->L_frame - 1], st->Q_syn ); /* Q0 -> Q_syn */ + move16(); + PREEMPH_FX( old_exc_s_fx, st->preemph_fac, L_FRAME16k, &tmpF_fx ); + Copy( old_exc_s_fx + sub( st->L_frame, M ), st->mem_syn2_fx, M ); + Scale_sig( st->mem_syn2_fx, M, st->Q_syn ); /* Q0 -> Q_syn */ + Residu3_fx( Aq_fx, old_exc_s_fx, old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, 0 ); + Scale_sig( old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, st->Q_exc ); /* Q0 -> Q_exc */ + } + + test(); + IF( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) + { + /* Prepare ACB memory of old_bwe_exc */ + IF( EQ_16( st->L_frame, L_FRAME ) ) + { + lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); + } + ELSE + { + lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC << 1, L_EXC_MEM_DEC ); + } + } /*-----------------------------------------------------------------* * FEC - first good frame after lost frame(s) (possibility to correct the ACB) *-----------------------------------------------------------------*/ - IF( st_fx->acelp_cfg.FEC_mode > 0 ) + IF( st->acelp_cfg.FEC_mode > 0 ) { last_pulse_pos = 0; move16(); /* decode the last glottal pulse position */ - T0_tmp = FEC_pos_dec_fx( st_fx, &last_pulse_pos, &enr_q_fx, nb_bits ); - + T0_tmp = FEC_pos_dec_fx( st, &last_pulse_pos, &enr_q_fx, nb_bits ); test(); test(); - IF( NE_16( st_fx->last_core, HQ_CORE ) || ( EQ_16( st_fx->last_core, HQ_CORE ) && st_fx->last_con_tcx ) ) + IF( NE_16( st->last_core, HQ_CORE ) || ( EQ_16( st->last_core, HQ_CORE ) && st->last_con_tcx ) ) { test(); test(); @@ -734,16 +1022,13 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - test(); - IF( EQ_16( st_fx->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st_fx->prev_bfi, 1 ) ) + IF( EQ_16( st->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st->prev_bfi, 1 ) ) { - st_fx->Q_exc = - FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st_fx->L_frame, st_fx->Q_exc ); - move16(); + FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st->L_frame, st->Q_exc ); } - ELSE IF( ( EQ_16( st_fx->coder_type, GENERIC ) || EQ_16( st_fx->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st_fx->old_bfi_cnt, 1 ) && EQ_16( output_frame, L_FRAME16k ) && st_fx->hWIDec != NULL ) + ELSE IF( ( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st->old_bfi_cnt, 1 ) && st->hWIDec != NULL ) { - do_WI_fx = FEC_enhACB_fx( st_fx->L_frame, st_fx->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st_fx->bfi_pitch_fx ); + do_WI = FEC_enhACB_fx( st->L_frame, st->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch_fx ); } } } @@ -752,16 +1037,16 @@ ivas_error acelp_core_dec_fx( * In case of first frame after an erasure and transition from voiced to unvoiced or inactive * redo the LPC interpolation *------------------------------------------------------------*/ + test(); test(); test(); test(); test(); test(); - IF( st_fx->stab_fac_fx == 0 && st_fx->old_bfi_cnt > 0 && NE_16( st_fx->clas_dec, VOICED_CLAS ) && NE_16( st_fx->clas_dec, ONSET ) && - st_fx->relax_prev_lsf_interp == 0 && !( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && EQ_16( st_fx->idchan, 1 ) ) ) + IF( ( st->stab_fac_fx == 0 ) && ( st->old_bfi_cnt > 0 ) && NE_16( st->clas_dec, VOICED_CLAS ) && NE_16( st->clas_dec, ONSET ) && ( st->relax_prev_lsf_interp == 0 ) && !( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) ) { - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); + int_lsp4_ivas_fx( st->L_frame, st->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); } /*---------------------------------------------------------------* @@ -770,7 +1055,7 @@ ivas_error acelp_core_dec_fx( IF( nb_bits > 0 ) { - indice = get_next_indice( st_fx, nb_bits ); + indice = get_next_indice_fx( st, nb_bits ); Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); } @@ -780,79 +1065,113 @@ ivas_error acelp_core_dec_fx( test(); test(); - IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) + IF( tdm_low_rate_mode ) /* tdm stereo low rate mode */ { - /* SC-VBR - NELP frames */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; + IF( LE_16( st->coder_type, UNVOICED ) ) + { + tdm_low_rate_dec_fx( st, dct_exc_tmp_fx /*, &tmp_noise*/, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx ); + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + } + ELSE /* GENERIC */ + { + decod_gen_2sbfr_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ + } + } + } + ELSE IF( st->nelp_mode_dec ) + { + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 + st->Q_exc = 0; move16(); - decod_nelp_fx( st_fx, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors, bwe_exc_fx, &st_fx->Q_exc, st_fx->bfi, gain_buf ); - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); + /* SC-VBR - NELP frames */ + decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); + + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); } - ELSE IF( EQ_16( st_fx->coder_type, UNVOICED ) ) + ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) { /* UNVOICED frames */ - decod_unvoiced_fx( st_fx, Aq_fx, st_fx->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, gain_buf ); + decod_unvoiced_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); + + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } - ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) + ELSE IF( st->ppp_mode_dec ) { - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 + st->Q_exc = 0; move16(); + /* SC-VBR - PPP frames */ - IF( NE_32( ( error = decod_ppp_fx( st_fx, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st_fx->bfi, gain_buf, voice_factors, bwe_exc_fx ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = decod_ppp_fx( st, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st->bfi, gain_buf_fx, voice_factors_fx, bwe_exc_fx ) ), IVAS_ERR_OK ) ) { return error; } - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); } - ELSE IF( EQ_16( st_fx->coder_type, TRANSITION ) ) + ELSE IF( EQ_16( st->coder_type, TRANSITION ) ) { - decod_tran_fx( st_fx, st_fx->L_frame, tc_subfr_fx, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf ); + decod_tran_fx( st, st->L_frame, tc_subfr, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf_fx ); } - ELSE IF( EQ_16( st_fx->coder_type, AUDIO ) || ( ( st_fx->coder_type == INACTIVE ) && LE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) ) ) + ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( ( st->coder_type == INACTIVE ) && st->inactive_coder_type_flag ) ) { - decod_audio_fx( st_fx, dct_exc_tmp, Aq_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf ); - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ + /* AUDIO and INACTIVE frames (coded by GSC technology) */ + decod_audio_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, + tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } ELSE { - IF( NE_32( ( error = decod_gen_voic_fx( st_fx, st_fx->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI_fx, pitch_buf_fx, voice_factors, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf /*, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf*/ ) ), IVAS_ERR_OK ) ) + /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ + IF( NE_32( ( error = decod_gen_voic_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } } /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); + syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); + /* save and delay synthesis to be used by SWB BWE */ - IF( hBWE_FD != NULL ) + IF( st->hBWE_FD != NULL ) { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); } /*-----------------------------------------------------------------* * Apply energy matching when switching to inactive frames *-----------------------------------------------------------------*/ - Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + /*------------------------------------------------------------* * Decode information and modify the excitation signal of stationary unvoiced frames *------------------------------------------------------------*/ + test(); test(); test(); test(); - IF( !( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) && NE_16( st_fx->nelp_mode_dec, 1 ) && !( EQ_16( st_fx->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) + IF( !( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) && NE_16( st->nelp_mode_dec, 1 ) && !( EQ_16( st->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) { - stat_noise_uv_dec_fx( st_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); + Word16 temp_q_exc = st->Q_exc; + move16(); + stat_noise_uv_dec_fx( st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); + IF( NE_16( temp_q_exc, st->Q_exc ) ) + { + scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM + st->L_frame, sub( st->Q_exc, temp_q_exc ) ); + } } /*------------------------------------------------------------* @@ -861,80 +1180,92 @@ ivas_error acelp_core_dec_fx( *------------------------------------------------------------*/ /* update past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) + IF( st->hMusicPF != NULL ) { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - Copy( hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( st->hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); } + test(); test(); test(); - test(); - IF( hMusicPF != NULL && ( ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) || ( GE_16( st_fx->GSC_IVAS_mode, 1 ) && EQ_16( st_fx->L_frame, L_FRAME ) ) ) ) + IF( ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && EQ_16( st->L_frame, L_FRAME ) ) ) { - - Word16 last_coder_type = st_fx->last_coder_type; + Word16 last_coder_type = st->last_coder_type; move16(); + test(); test(); test(); - if ( ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st_fx->GSC_IVAS_mode, 1 ) && st_fx->GSC_noisy_speech == 0 ) ) + if ( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && ( st->GSC_noisy_speech == 0 ) ) ) { last_coder_type = AUDIO; move16(); } - /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - qdct = 0; + + Word16 qdct = 0; move16(); -#ifdef _DIFF_FLOAT_FIX_ /* FLoat point using last_core which fits with the inner part of the function */ - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_core, st_fx->element_mode, pitch_buf_fx, - hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct ); -#else - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, hMusicPF->filt_lfE_fx, st_fx->last_coder_type, st_fx->element_mode, pitch_buf_fx, - hMusicPF->LDm_enh_lp_gbin_fx, st_fx->Q_exc, &qdct ); -#endif + + /* Extrapolation of the last future part, windowing and high resolution DCT transform */ + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV: this is likely a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_coder_type, st->element_mode, pitch_buf_fx, + st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); + } + ELSE + { + Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); + } + /* LD music post-filter */ - LD_music_post_filter_fx( hMusicPF, dct_buffer_fx, dct_buffer_fx, st_fx->core_brate, - &hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); + LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ - Post_music_postP_fx( dct_buffer_fx, exc2_fx, st_fx->mem_syn2_fx, st_fx->mem_syn2_fx, Aq_fx, syn_fx, &st_fx->Q_exc, &st_fx->prev_Q_syn, - &st_fx->Q_syn, st_fx->mem_syn_clas_estim_fx, 0, &st_fx->mem_deemph_fx, hBPF->pst_old_syn_fx, - &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, temp_buf_fx, mem_tmp_fx ); + IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBC whether needed in IVAS + { + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ + } + + Post_music_postP_fx( dct_buffer_fx, exc2_fx, st->mem_syn2_fx, st->mem_syn2_fx, Aq_fx, psyn_fx, &st->Q_exc, &st->prev_Q_syn, + &st->Q_syn, st->mem_syn_clas_estim_fx, 0, &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, + &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, temp_buf_fx, mem_tmp_fx ); } ELSE { /* Core synthesis at 12.8kHz or 16kHz */ i = 1; move16(); - if ( st_fx->coder_type == INACTIVE ) + test(); + if ( st->coder_type == INACTIVE && st->element_mode == EVS_MONO ) { i = 0; move16(); } + /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - k = 0; + Word16 k = 0; move16(); test(); test(); - if ( ( st_fx->coder_type == INACTIVE ) && st_fx->flag_cna && GE_16( round_fx( L_shl( st_fx->lp_noise, 1 ) ), 15 << 7 ) ) + if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) { k = 1; move16(); } - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, - hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, i, k, temp_buf_fx ); - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); // Q_syn + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, + st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, i, k, temp_buf_fx ); + + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - IF( hMusicPF != NULL ) + IF( st->hMusicPF != NULL ) { FOR( i = 0; i < DCT_L_POST; i++ ) { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); move16(); } } @@ -944,43 +1275,35 @@ ivas_error acelp_core_dec_fx( * FEC - Estimate the classification information *------------------------------------------------------------*/ - FEC_clas_estim_fx( st_fx, st_fx->Opt_AMR_WB, st_fx->L_frame, &st_fx->clas_dec, st_fx->coder_type, pitch_buf_fx, - syn_fx, &st_fx->lp_ener_FER_fx, &st_fx->decision_hyst, - NULL, NULL, NULL, NULL, 0, NULL, st_fx->Q_syn, temp_buf_fx, - st_fx->mem_syn_clas_estim_fx, &st_fx->classifier_Q_mem_syn, - 0, 0, 0, st_fx->last_core_brate, st_fx->acelp_cfg.FEC_mode ); + FEC_clas_estim_fx( st, st->Opt_AMR_WB, st->L_frame, &st->clas_dec, st->coder_type, pitch_buf_fx, psyn_fx, &st->lp_ener_FER_fx, &st->decision_hyst, + NULL, NULL, NULL, NULL, 0, NULL, st->Q_syn, temp_buf_fx, st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_mode ); + /*------------------------------------------------------------* * FEC - Estimate pitch *------------------------------------------------------------*/ - FEC_pitch_estim_fx( st_fx->Opt_AMR_WB, st_fx->last_core, st_fx->L_frame, st_fx->clas_dec, st_fx->last_good, pitch_buf_fx, st_fx->old_pitch_buf_fx, - &st_fx->bfi_pitch_fx, &st_fx->bfi_pitch_frame, &st_fx->upd_cnt, st_fx->coder_type, st_fx->element_mode ); + FEC_pitch_estim_fx( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf_fx, st->old_pitch_buf_fx, + &st->bfi_pitch_fx, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type, st->element_mode ); /*------------------------------------------------------------* * FEC - Smooth the speech energy evolution when recovering after a BAD frame * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); test(); test(); test(); test(); - IF( ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && LE_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) + /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ + IF( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && LE_32( st->total_brate, ACELP_7k20 ) ) || EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) { - frame_ener_fx( st_fx->L_frame, st_fx->clas_dec, syn_fx, pitch_buf_tmp[sub( shr( st_fx->L_frame, 6 ), 1 )], &st_fx->enr_old_fx, st_fx->L_frame, st_fx->Q_syn, 3, 0 ); + frame_ener_fx( st->L_frame, st->clas_dec, psyn_fx, pitch_buf_tmp[( ( st->L_frame ) >> 6 ) - 1], &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); } } @@ -989,206 +1312,188 @@ ivas_error acelp_core_dec_fx( /*----------------------------------------------------------------* * BAD frame *----------------------------------------------------------------*/ + ELSE { /* SC-VBR */ - if ( EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) + if ( EQ_16( st->last_nelp_mode_dec, 1 ) ) { - st_fx->nelp_mode_dec = 1; + st->nelp_mode_dec = 1; move16(); } - /* long burst frame erasures */ test(); test(); - if ( GT_16( st_fx->nbLostCmpt, 5 ) && GE_16( st_fx->clas_dec, VOICED_CLAS ) && LT_16( st_fx->clas_dec, INACTIVE_CLAS ) ) + /* long burst frame erasures */ + if ( GT_16( st->nbLostCmpt, 5 ) && GE_16( st->clas_dec, VOICED_CLAS ) && LT_16( st->clas_dec, INACTIVE_CLAS ) ) { - st_fx->last_good = VOICED_TRANSITION; + st->last_good = VOICED_TRANSITION; move16(); } /* LSF estimation and A(z) calculation */ - lsf_dec_bfi( MODE1, lsf_new_fx, st_fx->lsf_old_fx, st_fx->lsf_adaptive_mean_fx, NULL, st_fx->mem_MA_fx, st_fx->mem_AR_fx, - st_fx->stab_fac_fx, st_fx->last_coder_type, st_fx->L_frame, st_fx->last_good, - st_fx->nbLostCmpt, 0, NULL, NULL, NULL, st_fx->hGSCDec->Last_GSC_pit_band_idx, st_fx->Opt_AMR_WB, 0, st_fx->bwidth ); + lsf_dec_bfi( MODE1, lsf_new_fx, st->lsf_old_fx, st->lsf_adaptive_mean_fx, NULL, st->mem_MA_fx, st->mem_AR_fx, st->stab_fac_fx, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, 0, st->bwidth ); - FEC_lsf2lsp_interp( st_fx, st_fx->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); - - IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) + FEC_lsf2lsp_interp( st, st->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); + IF( EQ_16( st->nelp_mode_dec, 1 ) ) { /* SC-VBR */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st_fx->Q_exc ) ); // Q0 - st_fx->Q_exc = 0; + Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 + st->Q_exc = 0; move16(); - decod_nelp_fx( st_fx, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors, bwe_exc_fx, &st_fx->Q_exc, st_fx->bfi, gain_buf ); + decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); FEC_pitch_fx = pitch_buf_fx[3]; move16(); - - Rescale_exc( hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, L_FRAME, st_fx->coder_type ); + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); } ELSE { /* calculation of excitation signal */ + FEC_exc_estim_fx( st, st->L_frame, exc_fx, exc2_fx, dct_exc_tmp_fx, pitch_buf_fx, voice_factors_fx, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st->Q_exc, &tmp_noise_fx ); - FEC_exc_estim_fx( st_fx, st_fx->L_frame, exc_fx, exc2_fx, dct_exc_tmp, pitch_buf_fx, voice_factors, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st_fx->Q_exc, &tmp_noise_fx ); - - Rescale_exc( NULL, exc_fx, bwe_exc_fx, st_fx->hGSCDec->last_exc_dct_in_fx, st_fx->L_frame, L_FRAME32k, (Word32) 0, - &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, st_fx->L_frame, st_fx->last_coder_type ); + Rescale_exc( NULL, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, (Word32) 0, + &( st->Q_exc ), st->Q_subfr, exc2_fx, st->L_frame, st->last_coder_type ); - tmp_noise_fx = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ + tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = st_fx->lp_gainp_fx; - move16(); /*Q14*/ + st->prev_gain_pit_dec_fx = st->lp_gainp_fx; + move16(); } /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc_fx, temp_buf_fx, st_fx->mem_syn1_fx, 1, st_fx->Q_exc, -1 ); /*old_syn_12k8_16k directly in q-1*/ + syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); /* save and delay synthesis to be used by SWB BWE */ - IF( hBWE_FD != NULL ) + IF( st->hBWE_FD != NULL ) { - save_old_syn_fx( st_fx->L_frame, temp_buf_fx, old_syn_12k8_16k, hBWE_FD->old_syn_12k8_16k_fx, st_fx->preemph_fac, &hBWE_FD->mem_deemph_old_syn_fx ); + save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); } + /* Apply energy matching when switching to inactive frames */ - Inac_swtch_ematch_fx( exc2_fx, dct_exc_tmp, st_fx->hGSCDec->lt_ener_per_band_fx, st_fx->coder_type, st_fx->L_frame, st_fx->core_brate, st_fx->Q_exc, st_fx->bfi, st_fx->last_core, st_fx->last_codec_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); - /* udate past excitation signals for LD music post-filter */ - IF( hMusicPF != NULL ) + /* update past excitation signals for LD music post-filter */ + IF( st->hMusicPF != NULL ) { - Copy( hMusicPF->dct_post_old_exc_fx + L_FRAME, hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); + Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); + /* Update music post processing values */ /* Filter energies update */ FOR( i = 0; i < DCT_L_POST; i++ ) { - /*st_fx->filt_lfE_fx[i] = 0.3f + 0.7f * st_fx->filt_lfE_fx[i];*/ - hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, hMusicPF->filt_lfE_fx[i] ) ); + st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( 1228 << 16, 22938, st->hMusicPF->filt_lfE_fx[i] ) ); move16(); } + /* Update circular buffer, keep last energy difference unchanged */ FOR( i = 1; i < MAX_LT; i++ ) { - hMusicPF->LDm_lt_diff_etot_fx[i - 1] = hMusicPF->LDm_lt_diff_etot_fx[i]; + st->hMusicPF->LDm_lt_diff_etot_fx[i - 1] = st->hMusicPF->LDm_lt_diff_etot_fx[i]; move16(); } } + /* synthesis at 12k8 Hz sampling rate */ /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - k = 0; + Word16 k = 0; move16(); test(); test(); - if ( ( st_fx->coder_type == INACTIVE ) && st_fx->flag_cna && GE_16( round_fx( L_shl( st_fx->lp_noise, 1 ) ), 15 << 7 ) ) + if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) { k = 1; move16(); } - Rescale_mem( st_fx->Q_exc, &st_fx->prev_Q_syn, &st_fx->Q_syn, st_fx->mem_syn2_fx, st_fx->mem_syn_clas_estim_fx, 4, &st_fx->mem_deemph_fx, - hBPF->pst_old_syn_fx, &hBPF->pst_mem_deemp_err_fx, &st_fx->agc_mem_fx[1], st_fx->hPFstat, 1, k, temp_buf_fx ); + Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, + st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 1, k, temp_buf_fx ); test(); - IF( ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) + IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) { - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); // Q_syn + Copy( st->mem_syn2_fx, mem_tmp_fx, M ); } - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_fx, st_fx->mem_syn2_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); + syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); /* update buffer for classifier */ - IF( st_fx->hWIDec != NULL ) + IF( st->hWIDec != NULL ) { - Copy( exc2_fx + st_fx->L_frame - L_EXC_MEM, st_fx->hWIDec->old_exc2_fx, L_EXC_MEM ); - Copy( syn_fx + st_fx->L_frame - L_EXC_MEM, st_fx->hWIDec->old_syn2_fx, L_EXC_MEM ); + Copy( exc2_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_exc2_fx, L_EXC_MEM ); + Copy( psyn_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_syn2_fx, L_EXC_MEM ); } - st_fx->prev_Q_exc_fr = st_fx->Q_exc; - move16(); - st_fx->prev_Q_syn_fr = st_fx->Q_syn; - move16(); - - Copy( syn_fx + st_fx->L_frame - L_SYN_MEM_CLAS_ESTIM, st_fx->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - - test(); - IF( ( EQ_32( st_fx->total_brate, ACELP_7k20 ) ) || ( EQ_32( st_fx->total_brate, ACELP_8k00 ) ) ) - { - k = 0; + st->prev_Q_exc_fr = st->Q_exc; move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) + st->prev_Q_syn_fr = st->Q_syn; move16(); - k = add( k, 1 ); - } + Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM_CLAS_ESTIM ), st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); /*------------------------------------------------------------* * FEC - Smooth the speech energy evolution when recovering after a BAD frame * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ - FEC_scale_syn_fx( st_fx->L_frame, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, enr_q_fx, st_fx->coder_type, LSF_Q_prediction, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); + test(); + IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) + { + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 + + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - /* fer_energy( st_fx->L_frame, st_fx->last_good, syn_fx, FEC_pitch_fx, &st_fx->enr_old_fx, st_fx->L_frame ); */ - frame_ener_fx( st_fx->L_frame, st_fx->last_good, syn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st_fx->enr_old_fx, st_fx->L_frame, st_fx->Q_syn, 3, 0 ); + frame_ener_fx( st->L_frame, st->last_good, psyn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); - IF( st_fx->nelp_mode_dec != 1 ) + IF( NE_16( st->nelp_mode_dec, 1 ) ) { /* modify the excitation signal of stationary unvoiced frames */ - stat_noise_uv_mod_fx( st_fx->coder_type, 0, st_fx->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st_fx->Q_exc, 1, &st_fx->ge_sm_fx, - &st_fx->uv_count, &st_fx->act_count, st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + stat_noise_uv_mod_fx( st->coder_type, 0, st->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st->Q_exc, 1, &st->ge_sm_fx, + &st->uv_count, &st->act_count, st->lspold_s_fx, &st->noimix_seed, &st->min_alpha_fx, + &st->exc_pe_fx, st->core_brate, st->bwidth, &st->Q_stat_noise, &st->Q_stat_noise_ge ); + } } - /* SC-VBR */ - st_fx->hSC_VBR->FadeScale_fx = mult( st_fx->hSC_VBR->FadeScale_fx, 24576 ); /*24576 in Q15*/ - move16(); - } - IF( hBWE_TD != NULL ) + IF( st->hBWE_TD != NULL ) { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - Copy( Aq_fx + 2 * ( M + 1 ), hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); // Q12 + Copy( Aq_fx + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } ELSE { - Copy( Aq_fx + 3 * ( M + 1 ), hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); // Q12 + Copy( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); } } + /*--------------------------------------------------------* * Apply NB postfilter in case of 8kHz output *--------------------------------------------------------*/ + test(); - IF( EQ_16( st_fx->last_bwidth, NB ) && st_fx->hPFstat != NULL ) + IF( st->last_bwidth == NB && st->hPFstat != NULL ) { - k = 0; - move16(); - FOR( i = 0; i < st_fx->L_frame; i += L_SUBFR ) - { - pitch_buf_tmp[k] = mult_r( pitch_buf_fx[k], 512 ); // Q0(6+9-15) , (512 = 1.0f in Q9) - move16(); - k = add( k, 1 ); - } + Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - IF( EQ_16( st_fx->bwidth, NB ) ) + IF( st->bwidth == NB ) { - st_fx->hPFstat->on = 1; + st->hPFstat->on = 1; move16(); - nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, st_fx->coder_type, st_fx->BER_detect, 0 ); + nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, st->coder_type, st->BER_detect, 0 ); } ELSE { - st_fx->hPFstat->on = 0; + st->hPFstat->on = 0; move16(); - nb_post_filt_fx( st_fx->L_frame, st_fx->hPFstat, &st_fx->psf_lp_noise_fx, tmp_noise_fx, syn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st_fx->BER_detect, 0 ); + nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st->BER_detect, 0 ); } } ELSE { - st_fx->psf_lp_noise_fx = round_fx( L_shl( st_fx->lp_noise, 1 ) ); + st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); move16(); } @@ -1196,137 +1501,255 @@ ivas_error acelp_core_dec_fx( * Perform fixed deemphasis through 1/(1 - g*z^-1) *-----------------------------------------------------------------*/ - /* Update old synthesis buffer - needed for ACELP internal sampling rate switching */ - Copy( syn_fx + st_fx->L_frame - L_SYN_MEM, st_fx->mem_syn_r, L_SYN_MEM ); - deemph_fx( syn_fx, st_fx->preemph_fac, st_fx->L_frame, &( st_fx->mem_deemph_fx ) ); - unscale_AGC( syn_fx, st_fx->Q_syn, syn_fx_tmp2, st_fx->agc_mem_fx, st_fx->L_frame ); - Copy( syn_fx_tmp2, syn_fx, st_fx->L_frame ); - - /* Update MODE2 memories*/ - IF( hTcxDec != NULL ) + /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ + Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); + deemph_fx( psyn_fx, st->preemph_fac, st->L_frame, &( st->mem_deemph_fx ) ); + unscale_AGC( psyn_fx, st->Q_syn, syn_fx_tmp2, st->agc_mem_fx, st->L_frame ); + Copy( syn_fx_tmp2, psyn_fx, st->L_frame ); + IF( st->hTcxDec != NULL ) { - Copy_Scale_sig( syn_fx + shr( st_fx->L_frame, 1 ), hTcxDec->old_syn_Overl, shr( st_fx->L_frame, 1 ), sub( -1, st_fx->Q_syn ) ); /*Q-1*/ + Copy_Scale_sig( psyn_fx + shr( st->L_frame, 1 ), st->hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, st->Q_syn ) ); /*Q-1*/ + st->hTcxDec->Q_old_syn_Overl = -1; } - Copy_Scale_sig( syn_fx + st_fx->L_frame - M - 1, st_fx->syn, M + 1, sub( 0, st_fx->Q_syn ) ); /*Q0*/ + Copy_Scale_sig( psyn_fx + sub( st->L_frame, M + 1 ), st->syn, M + 1, sub( 0, st->Q_syn ) ); /*Q0*/ /*------------------------------------------------------------------* * Formant post-filter *-----------------------------------------------------------------*/ - IF( st_fx->hPFstat != NULL ) - { test(); test(); test(); - IF( GE_16( st_fx->last_bwidth, WB ) && ( GT_32( st_fx->core_brate, ACELP_24k40 ) || ( st_fx->element_mode > EVS_MONO ) ) && LE_32( st_fx->core_brate, ACELP_32k ) ) + test(); + IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) && ( GT_32( st->core_brate, ACELP_24k40 ) || st->element_mode > EVS_MONO ) && LE_32( st->core_brate, ACELP_32k ) ) { - Copy( syn_fx, temp_buf + L_SYN_MEM, L_FRAME16k ); - st_fx->hPFstat->on = 1; + st->hPFstat->on = 1; move16(); - formant_post_filt_fx( st_fx->hPFstat, temp_buf + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME16k, st_fx->lp_noise, st_fx->total_brate, 0 ); + Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); + set16_fx( st->hPFstat->mem_zero, 0, M ); + + formant_post_filt_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); } - ELSE IF( GE_16( st_fx->last_bwidth, WB ) ) + ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) { - IF( st_fx->hPFstat->on ) + IF( st->hPFstat->on ) { - Copy( st_fx->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf, M ); - Copy( syn_fx, temp_buf + M, L_SUBFR ); - Residu3_fx( Aq_fx, temp_buf + M, temp_buf + M + L_SUBFR, L_SUBFR, 1 ); - E_UTIL_synthesis( 1, Aq_fx, temp_buf + M + L_SUBFR, temp_buf, L_SUBFR, st_fx->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - scale_st_fx( syn_fx, temp_buf, &st_fx->hPFstat->gain_prec, L_SUBFR ); - Copy( temp_buf, syn_fx, L_SUBFR / 2 ); - blend_subfr2_fx( temp_buf + L_SUBFR / 2, syn_fx + L_SUBFR / 2, syn_fx + L_SUBFR / 2 ); + Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf_fx, M ); + Copy( psyn_fx, temp_buf_fx + M, L_SUBFR ); + + Residu3_fx( Aq_fx, temp_buf_fx + M, temp_buf_fx + M + L_SUBFR, L_SUBFR, 1 ); + E_UTIL_synthesis( 1, Aq_fx, temp_buf_fx + M + L_SUBFR, temp_buf_fx, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); + scale_st_fx( psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR ); + Copy( temp_buf_fx, psyn_fx, ( L_SUBFR >> 1 ) ); + blend_subfr2_fx( temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2 ); } - st_fx->hPFstat->on = 0; + st->hPFstat->on = 0; move16(); } - } + /*----------------------------------------------------------------* * Comfort noise addition *----------------------------------------------------------------*/ test(); test(); - IF( ( st_fx->hFdCngDec != NULL || EQ_16( st_fx->idchan, 1 ) ) && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( ( st->hFdCngDec != NULL || EQ_16( st->idchan, 1 ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { test(); test(); test(); test(); test(); - IF( EQ_16( st_fx->element_mode, IVAS_CPE_TD ) || st_fx->flag_cna || ( EQ_16( st_fx->cng_type, FD_CNG ) && LE_32( st_fx->total_brate, ACELP_32k ) ) || ( ( st_fx->cng_type == LP_CNG ) && LE_32( st_fx->total_brate, SID_2k40 ) ) ) + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) { /*VAD only for non inactive frame*/ test(); - st_fx->VAD = st_fx->VAD && ( st_fx->coder_type != INACTIVE ); + st->VAD = st->VAD && st->coder_type != INACTIVE; move16(); test(); test(); test(); test(); test(); - IF( st_fx->idchan == 0 && ( st_fx->flag_cna || ( EQ_16( st_fx->cng_type, FD_CNG ) && LE_32( st_fx->total_brate, ACELP_32k ) ) || - ( EQ_16( st_fx->cng_type, LP_CNG ) && LE_32( st_fx->total_brate, SID_2k40 ) ) ) ) + IF( st->idchan == 0 && ( st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) ) { /*Noisy speech detector*/ - noisy_speech_detection_fx( st_fx->hFdCngDec, st_fx->VAD, syn_fx, st_fx->Q_syn ); + noisy_speech_detection_fx( st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn ); - st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); move16(); - IF( st_fx->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) + IF( st->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) { - st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st_fx->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); move16(); } + move32(); } - if ( st_fx->idchan == 0 ) + + if ( st->idchan == 0 ) { - st_fx->lp_noise = st_fx->hFdCngDec->lp_noise; + st->lp_noise = st->hFdCngDec->lp_noise; move32(); } - /*Noise estimate*/ - IF( NE_16( st_fx->element_mode, IVAS_CPE_TD ) /* && !st->cng_ism_flag IVAS_CODE */ ) + + test(); + IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) { - ApplyFdCng_fx( syn_fx, st_fx->Q_syn, realBuffer, imagBuffer, NULL, st_fx, 0, ( EQ_16( st_fx->coder_type, AUDIO ) && st_fx->GSC_noisy_speech == 0 ) ); - } - /* CNA: Generate additional comfort noise to mask potential coding artefacts */ + /* Noise estimate */ + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } + IF( !st->cna_dirac_flag ) + { + test(); + test(); test(); test(); test(); test(); - IF( st_fx->flag_cna && NE_16( st_fx->coder_type, AUDIO ) ) + test(); + test(); + test(); + /* CNA: Generate additional comfort noise to mask potential coding artefacts */ + IF( st->flag_cna && !( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) + { + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) + { + IF( hStereoCng->flag_cna_fade ) { - generate_masking_noise_fx( syn_fx, st_fx->Q_syn, st_fx->hFdCngDec->hFdCngCom, st_fx->hFdCngDec->hFdCngCom->frameSize, 0 ); + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 0; + move16(); } - ELSE IF( st_fx->flag_cna && EQ_16( st_fx->coder_type, AUDIO ) && st_fx->last_core == ACELP_CORE && NE_16( st_fx->last_coder_type, AUDIO ) ) + ELSE + { + test(); + IF( NE_16( st->element_mode, last_element_mode ) && ( st->idchan == 0 ) ) { - FOR( i = 0; i < st_fx->hFdCngDec->hFdCngCom->frameSize / 2; i++ ) + /* Clear memory for secondary channel CNA */ + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ) ); + } + + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); + } + } + ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) { - syn_fx[i] = add( syn_fx[i], shr_r( mult_r( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st_fx->hFdCngDec->hFdCngCom->frameSize / 4], st_fx->hFdCngDec->hFdCngCom->fftlenFac ), -st_fx->Q_syn ) ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); + } + ELSE + { + IF( st->idchan == 0 ) + { + IF( NE_16( st->element_mode, last_element_mode ) ) + { + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); + } + + Word32 psyn_32_fx[L_FRAME16k]; + Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 + Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); // Q15 + + generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + + Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn + Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 + } + } + } + } + ELSE IF( st->flag_cna && EQ_16( st->coder_type, AUDIO ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) + { + test(); + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) + { + generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); + hStereoCng->flag_cna_fade = 1; + move16(); + } + ELSE + { + FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), negate( st->Q_syn ) ) ); + move16(); + } + } + } + ELSE + { + IF( hStereoCng != NULL ) + { + hStereoCng->flag_cna_fade = 1; + move16(); + hStereoCng->enableSecCNA = 0; move16(); } } + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + test(); + test(); + test(); + /*Noise estimate*/ + IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) ) + { + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + } + } + } + } + + IF( !st->cna_dirac_flag ) + { + test(); test(); test(); test(); test(); test(); - IF( st_fx->flag_cna == 0 && EQ_16( st_fx->L_frame, L_FRAME16k ) && EQ_16( st_fx->last_flag_cna, 1 ) && ( ( st_fx->last_core == ACELP_CORE && NE_16( st_fx->last_coder_type, AUDIO ) ) || EQ_16( st_fx->last_core, AMR_WB_CORE ) ) ) + test(); + IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) + { + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + // VE: TBV - is it correct in EVS? in FLP, it is: + // v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, temp_buf, st->L_frame / 2 ); + // v_add( temp_buf, syn, syn, st->L_frame / 2 ); + FOR( i = 0; i < st->L_frame / 2; i++ ) + { + psyn_fx[i] = add( psyn_fx[i], shr_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st->L_frame / 4], negate( st->Q_syn ) ) ); + move16(); + } + } + ELSE { - FOR( i = 0; i < st_fx->L_frame / 2; i++ ) + FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) { - syn_fx[i] = add( syn_fx[i], shr_r( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st_fx->L_frame / 4], negate( st_fx->Q_syn ) ) ); + psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); move16(); } } + } test(); - IF( st_fx->flag_cna == 0 || EQ_16( st_fx->coder_type, AUDIO ) ) + test(); + test(); + IF( ( st->flag_cna == 0 ) || ( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) + { + IF( st->idchan == 0 ) + { + set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); + } + IF( hStereoCng != NULL && ( st->idchan == 0 ) ) { - set16_fx( st_fx->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st_fx->hFdCngDec->hFdCngCom->fftlen ); + set16_fx( hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); + } + } } } @@ -1335,45 +1758,44 @@ ivas_error acelp_core_dec_fx( * Bass post-filter *----------------------------------------------------------------*/ + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + CLDFB_SCALE_FACTOR scaleFactor; + Word32 workBuffer[128 * 3]; + /* check if the CLDFB works on the right sample rate */ - IF( ( st_fx->cldfbAna->usb * st_fx->cldfbAna->no_col ) != st_fx->L_frame ) + IF( ( st->cldfbAna->usb * st->cldfbAna->no_col ) != st->L_frame ) { /* resample to ACELP internal sampling rate */ - Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st_fx->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb( st_fx->cldfbAna, newCldfbBands, st_fx->L_frame, 0 ); - resampleCldfb( st_fx->cldfbBPF, newCldfbBands, st_fx->L_frame, 0 ); + Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + resampleCldfb( st->cldfbAna, newCldfbBands, st->L_frame, 0 ); + resampleCldfb( st->cldfbBPF, newCldfbBands, st->L_frame, 0 ); - IF( st_fx->ini_frame > 0 ) + IF( st->ini_frame > 0 ) { - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); move16(); } } test(); - IF( !( EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->bpf_off ) ) + IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) { - test(); - IF( NE_16( st_fx->L_frame, st_fx->last_L_frame ) && NE_16( st_fx->last_codec_mode, MODE2 ) ) + IF( EQ_16( st->L_frame, L_FRAME ) ) { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - retro_interp5_4_fx( hBPF->pst_old_syn_fx ); + retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); } - ELSE IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) + ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) { - retro_interp4_5_fx( syn_fx, hBPF->pst_old_syn_fx ); + retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); } } - bass_psfilter_fx( st_fx->hBPF, st_fx->Opt_AMR_WB, syn_fx, st_fx->L_frame, pitch_buf_fx, st_fx->bpf_off, - st_fx->stab_fac_fx, &st_fx->stab_fac_smooth_fx, st_fx->coder_type, st_fx->Q_syn, bpf_error_signal ); - } - test(); - IF( NE_16( st_fx->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) - { + bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, + st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); + /* analysis of the synthesis at internal sampling rate */ - cldfbAnalysis_fx( st_fx->cldfbAna, realBuffer, imagBuffer, &scaleFactor, syn_fx, negate( st_fx->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); + cldfbAnalysis_fx( st->cldfbAna, realBuffer_fx, imagBuffer_fx, &scaleFactor, psyn_fx, negate( st->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); scaleFactor.hb_scale = scaleFactor.lb_scale; move16(); @@ -1381,25 +1803,26 @@ ivas_error acelp_core_dec_fx( /* analysis and add the BPF error signal */ i = 0; move16(); - if ( st_fx->bpf_off == 0 ) + if ( st->bpf_off == 0 ) { i = CLDFB_NO_COL_MAX; move16(); } - addBassPostFilter_fx( bpf_error_signal, realBuffer, imagBuffer, st_fx->cldfbBPF, workBuffer, negate( st_fx->Q_syn ), - i, st_fx->cldfbAna->no_col, st_fx->cldfbAna->no_channels, &scaleFactor ); + + addBassPostFilter_fx( bpf_error_signal_16fx, realBuffer_fx, imagBuffer_fx, st->cldfbBPF, workBuffer, negate( st->Q_syn ), + i, st->cldfbAna->no_col, st->cldfbAna->no_channels, &scaleFactor ); /* set output mask for upsampling */ - IF( EQ_16( st_fx->bwidth, NB ) ) + IF( EQ_16( st->bwidth, NB ) ) { /* set NB mask for upsampling */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, 10 ); + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); move16(); } - ELSE IF( NE_16( st_fx->cldfbSyn->bandsToZero, sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ) ) ) + ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) { /* in case of BW switching, re-init to default */ - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->cldfbAna->no_channels ); + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); move16(); } @@ -1407,47 +1830,447 @@ ivas_error acelp_core_dec_fx( scaleFactor.hb_scale = scaleFactor.lb_scale; move16(); + test(); + test(); + test(); + IF( ( ( st->core_brate == FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) + { + generate_comfort_noise_dec_hf_fx( realBuffer_fx, imagBuffer_fx, &scaleFactor.hb_scale, st ); + + st->cldfbSyn->bandsToZero = 0; + move16(); + IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); + move16(); + } + st->cldfbSyn->lsb = st->cldfbAna->no_channels; + move16(); + } + + /* synthesis of the combined signal */ + st->Q_syn2 = st->Q_syn; + move16(); + cldfbSynthesis_fx( st->cldfbSyn, realBuffer_fx, imagBuffer_fx, &scaleFactor, synth_fx16, negate( st->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); + + /* Bring CLDFB output to Q0 */ + Scale_sig( synth_fx16, output_frame, negate( st->Q_syn2 ) ); + st->Q_syn2 = 0; + move16(); + + /* save synthesis - needed in case of core switching */ + Copy( synth_fx16, st->previoussynth_fx, output_frame ); + } + ELSE + { + /* check if the CLDFB works on the right sample rate */ + IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) + { + resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); + + IF( st->ini_frame > 0 ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } + } + + /* analyze pitch coherence for bass post-filter */ + Word32 pitch_buf_fx_q20[12]; + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) + Word16 lim = shr( st->L_frame, 6 ); + FOR( Word16 lp = 0; lp < lim; lp++ ) + { + pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); + move32(); + } + bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); + Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); // Qx + + test(); + IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) + { + test(); + IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) + { + IF( EQ_16( st->L_frame, L_FRAME ) ) + { + retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); + } + ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) + { + retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); + } + } + + bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, + st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); + } + + Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; + set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); + syn_32_fx = syn_tmp_32_fx + L_SUBFR; + test(); + IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) + { + /* analysis of the synthesis at internal sampling rate */ + Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + pRealSave_fx[i] = realBufferSave_fx[i]; + pImagSave_fx[i] = imagBufferSave_fx[i]; + } + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 + } + + FOR( i = 0; i < st->L_frame; i++ ) + { + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 + move32(); + } + + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; + move16(); + + cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); + + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; + move16(); + /* analysis and add the BPF error signal */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + + q_bpf_error_signal = Q6; + move16(); + Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + } + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + move16(); + tmp = -1; + move16(); + if ( st->bpf_off ) + { + tmp = 0; + move16(); + } + + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; + move16(); + /* set output mask for upsampling */ + IF( EQ_16( st->bwidth, NB ) ) + { + /* set NB mask for upsampling */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); + move16(); + } + ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) + { + /* in case of BW switching, re-init to default */ + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); + move16(); + } test(); - IF( !st_fx->cng_sba_flag || EQ_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { test(); test(); test(); - IF( ( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) && ( EQ_16( st_fx->cng_type, FD_CNG ) ) && ( LT_16( st_fx->hFdCngDec->hFdCngCom->numCoreBands, st_fx->cldfbSyn->no_channels ) ) ) + /*WB/SWB-FD_CNG*/ + IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) + { + Word16 tmpBufferScale = 0; + move16(); + generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); + + FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) { - generate_comfort_noise_dec_hf_fx( realBuffer, imagBuffer, &scaleFactor.hb_scale, st_fx ); + Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 + Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 + } - st_fx->cldfbSyn->bandsToZero = 0; + IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) + { + st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); move16(); - IF( LT_16( st_fx->hFdCngDec->hFdCngCom->regularStopBand, st_fx->cldfbSyn->no_channels ) ) + } + ELSE { - st_fx->cldfbSyn->bandsToZero = sub( st_fx->cldfbSyn->no_channels, st_fx->hFdCngDec->hFdCngCom->regularStopBand ); + st->cldfbSyn->bandsToZero = 0; move16(); } - st_fx->cldfbSyn->lsb = st_fx->cldfbAna->no_channels; + } + } + + IF( save_hb_synth_fx16 != NULL ) + { + /* save and then zero-out lowband */ + max_real = 0; + max_imag = 0; + move32(); + move32(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + max_val = L_max( max_real, max_imag ); + Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + } +#ifndef OPT_AVOID_STATE_BUF_RESCALE +#ifdef OPT_STEREO_32KBPS_V1 + scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) +#else /* OPT_STEREO_32KBPS_V1 */ + scale_sig32_r( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) +#endif /* OPT_STEREO_32KBPS_V1 */ + st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); move16(); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBufferSave_fx[i][j] = realBuffer_fx[i][j]; + imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; + move32(); + move32(); + IF( LT_16( j, st->hFdCngDec->hFdCngCom->numCoreBands ) && LT_16( i, st->hFdCngDec->hFdCngCom->numSlots ) ) + { + realBuffer_fx[i][j] = 0; + imagBuffer_fx[i][j] = 0; + move32(); + move32(); + } + } + } + +#ifdef OPT_AVOID_STATE_BUF_RESCALE + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSynHB ); +#else /* OPT_AVOID_STATE_BUF_RESCALE */ + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, 0, st->cldfbSynHB ); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + +#ifndef OPT_AVOID_STATE_BUF_RESCALE + Scale_sig32( save_hb_synth_fx, L_FRAME48k, negate( ( sub( Q_real, 1 ) ) ) ); // Q0 + Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSynHB->Q_cldfb_state = Q10; + move16(); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + /* restore lowband */ + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + realBuffer_fx[i][j] = realBufferSave_fx[i][j]; + imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; + move32(); + move32(); } } +#ifndef OPT_AVOID_STATE_BUF_RESCALE + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 + st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); + move16(); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + +#ifdef OPT_AVOID_STATE_BUF_RESCALE + cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSyn ); +#else /* OPT_AVOID_STATE_BUF_RESCALE */ + cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, 0, st->cldfbSyn ); + Scale_sig32( synth_fx, L_FRAME48k, negate( sub( Q_real, 1 ) ) ); // Q0 + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSynHB->Q_cldfb_state = Q10; + move16(); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + } + ELSE + { /* synthesis of the combined signal */ - st_fx->Q_syn2 = st_fx->Q_syn; + max_real = 0; + max_imag = 0; + move32(); + move32(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + max_val = L_max( max_real, max_imag ); + Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + } +#ifdef OPT_STEREO_32KBPS_V1 + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) +#else /* OPT_STEREO_32KBPS_V1 */ + scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) +#endif /* OPT_STEREO_32KBPS_V1 */ + st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); + move16(); + +#ifdef OPT_AVOID_STATE_BUF_RESCALE + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, 0, st->cldfbSyn ); +#else /* OPT_AVOID_STATE_BUF_RESCALE */ + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, st->cldfbSyn ); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSyn->Q_cldfb_state = Q10; move16(); + } + + /* save synthesis - needed in case of core switching */ + Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 + } + ELSE { - cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate( st_fx->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); + Word16 nSamples = NS2SA_FX2( i_mult( st->L_frame, FRAMES_PER_SEC ), FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ + + /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ + FOR( i = 0; i < st->L_frame; i++ ) + { + syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); + move32(); } - /* Bring CLDFB output to Q0 */ - Scale_sig( synth_out, output_frame, negate( st_fx->Q_syn2 ) ); - st_fx->Q_syn2 = 0; + + Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 + st->cldfbAna->Q_cldfb_state = Q12; + move16(); + + cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); + + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 + st->cldfbAna->Q_cldfb_state = Q11; + move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ + Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; + Word16 q_bpf_error_signal; + Word16 cldfb_state_offset; + cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); + + // Get Q-factor + q_bpf_error_signal = Q6; + move16(); + Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 + } + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) + st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; + move16(); + tmp = 0; + move16(); + if ( !st->bpf_off ) + { + tmp = nSamples; + move16(); + } + + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 + st->cldfbBPF->Q_cldfb_state = Q10; + move16(); + /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ + max_real = 0; + max_imag = 0; + move32(); + move32(); + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + { + max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); + max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); + } + } + max_val = L_max( max_real, max_imag ); + Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; + FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real + } +#ifndef OPT_AVOID_STATE_BUF_RESCALE +#ifdef OPT_STEREO_32KBPS_V1 + scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) +#else /* OPT_STEREO_32KBPS_V1 */ + scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) +#endif /* OPT_STEREO_32KBPS_V1 */ +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + +#ifdef OPT_AVOID_STATE_BUF_RESCALE + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), sub( Q10, sub( Q_real, 1 ) ), -10, st->cldfbSyn ); +#else /* OPT_AVOID_STATE_BUF_RESCALE */ + cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), 0, st->cldfbSyn ); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + +#ifndef OPT_AVOID_STATE_BUF_RESCALE + Scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 + Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 + st->cldfbSyn->Q_cldfb_state = Q10; move16(); +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + IF( st->p_bpf_noise_buf_32 ) + { + Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 + Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - /* save synthesis - needed in case of core switching */ - Copy( synth_out, st_fx->previoussynth_fx, output_frame ); + Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 + } + + set32_fx( synth_fx, 0, output_frame ); + } + + /* Copy output signal */ + Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), negate( st->Q_syn ) ); // Q0 + IF( st->element_mode > EVS_MONO ) + { + Copy( psyn_fx, output_fx, st->L_frame ); /*Q_syn*/ + } + + st->Q_syn2 = 0; + move16(); } /*-----------------------------------------------------------------* * Bandwidth extension 6kHz-7kHz *-----------------------------------------------------------------*/ - IF( st_fx->hBWE_zero != NULL ) + + IF( st->hBWE_zero != NULL ) { test(); test(); @@ -1456,14 +2279,27 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - IF( ( EQ_16( st_fx->L_frame, L_FRAME ) && NE_16( st_fx->bwidth, NB ) && GE_16( output_frame, L_FRAME16k ) && - ( EQ_16( st_fx->extl, -1 ) || EQ_16( st_fx->extl, SWB_CNG ) || ( EQ_16( st_fx->extl, WB_BWE ) && st_fx->extl_brate == 0 && NE_16( st_fx->coder_type, AUDIO ) ) ) ) ) + IF( ( EQ_16( st->L_frame, L_FRAME ) && ( st->bwidth != NB ) && GE_16( output_frame, L_FRAME16k ) && + ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) { - hf_synth_fx( st_fx->hBWE_zero, st_fx->core_brate, output_frame, Aq_fx, exc2_fx, syn_fx, synth_out, st_fx->Q_exc, st_fx->Q_syn2 ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); + } + ELSE + { + Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 + hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); + Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 ); + } } ELSE { - hf_synth_reset_fx( st_fx->hBWE_zero ); + hf_synth_reset_fx( st->hBWE_zero ); + IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but condition is here to keep EVS bit-exact for the moment + { + set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); + } } } @@ -1471,8 +2307,7 @@ ivas_error acelp_core_dec_fx( * Populate parameters for SWB TBE *-----------------------------------------------------------------*/ - /* Apply a non linearity to the SHB excitation */ - IF( hBWE_TD != NULL ) + IF( st->hBWE_TD != NULL ) { test(); test(); @@ -1486,11 +2321,11 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - IF( ( !st_fx->bfi && ( st_fx->prev_bfi ) ) || ( ( EQ_16( st_fx->last_vbr_hw_BWE_disable_dec, 1 ) ) && ( st_fx->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st_fx->extl, SWB_TBE ) || EQ_16( st_fx->extl, WB_TBE ) || EQ_16( st_fx->extl, FB_TBE ) ) && NE_16( st_fx->last_extl, SWB_TBE ) && NE_16( st_fx->last_extl, WB_TBE ) && NE_16( st_fx->last_extl, FB_TBE ) ) || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && !st_fx->tdm_LRTD_flag ) ) + IF( ( !st->bfi && st->prev_bfi ) || ( EQ_16( st->last_vbr_hw_BWE_disable_dec, 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, WB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && !st->tdm_LRTD_flag ) ) { - hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); + st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move32(); - set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + set16_fx( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); } test(); @@ -1498,42 +2333,70 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - IF( !st_fx->ppp_mode_dec && ( st_fx->idchan == 0 || NE_16( st_fx->element_mode, IVAS_CPE_TD ) || ( EQ_16( st_fx->idchan, 1 ) && EQ_16( st_fx->element_mode, IVAS_CPE_TD ) && st_fx->tdm_LRTD_flag ) ) ) + IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) + { + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); + } + ELSE { - non_linearity_fx( bwe_exc_fx, bwe_exc_extended, L_FRAME32k, &hBWE_TD->bwe_non_lin_prev_scale_fx, st_fx->Q_exc, - st_fx->coder_type, voice_factors, st_fx->L_frame ); + Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); + Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + } } test(); - IF( ( st_fx->core_brate == FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) + if ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) { - hBWE_TD->bwe_non_lin_prev_scale_fx = L_deposit_l( 0 ); + st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move32(); } } + /*----------------------------------------------------------------------* * Updates *----------------------------------------------------------------------*/ - updt_dec_fx( st_fx, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors, old_bwe_exc_fx, gain_buf ); + updt_dec_fx( st, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors_fx, old_bwe_exc_fx, gain_buf_fx ); test(); test(); - IF( GT_32( st_fx->core_brate, SID_2k40 ) && st_fx->hTdCngDec != NULL && st_fx->hFdCngDec != NULL ) + IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) { /* update CNG parameters in active frames */ - cng_params_upd_fx( lsp_new_fx, exc_fx, st_fx->L_frame, &st_fx->hTdCngDec->ho_circ_ptr, st_fx->hTdCngDec->ho_ener_circ_fx, &st_fx->hTdCngDec->ho_circ_size, st_fx->hTdCngDec->ho_lsp_circ_fx, - st_fx->Q_exc, DEC, st_fx->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st_fx->last_active_brate ); + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + cng_params_upd_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, + st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate ); + } + ELSE + { + cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, + st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, + st->hFdCngDec->hFdCngCom->CngBandwidth ); + } + /* Set 16k LSP flag for CNG buffer */ - st_fx->hTdCngDec->ho_16k_lsp[st_fx->hTdCngDec->ho_circ_ptr] = 0; + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; move16(); - if ( NE_16( st_fx->L_frame, L_FRAME ) ) + if ( NE_16( st->L_frame, L_FRAME ) ) { - st_fx->hTdCngDec->ho_16k_lsp[st_fx->hTdCngDec->ho_circ_ptr] = 1; + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; move16(); } } - return IVAS_ERR_OK; + IF( NE_16( st->element_mode, EVS_MONO ) ) + { + IF( save_hb_synth_fx16 ) + { + Copy_Scale_sig_32_16( save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0 ); // Q0 + } + Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q_syn2 + } + + pop_wmops(); + return error; } -#endif diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c index ad8ca9b50..2c72bba78 100644 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ b/lib_dec/acelp_core_dec_ivas_fx.c @@ -47,12 +47,12 @@ /*-------------------------------------------------------------------* - * acelp_core_dec_ivas_fx() + * acelp_core_dec_fx() * * ACELP core decoder *-------------------------------------------------------------------*/ -ivas_error acelp_core_dec_ivas_fx( +ivas_error acelp_core_dec_fx( Decoder_State *st, /* i/o: decoder state structure */ Word16 output_fx[], /* o : synthesis @internal Fs Q_syn*/ Word16 synth_fx16[], /* o : synthesis Q_syn2*/ @@ -81,14 +81,14 @@ ivas_error acelp_core_dec_ivas_fx( Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ Word16 output_frame; /* frame length at output sampling freq. */ Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ - Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ + Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ Word32 enr_q_fx; /* E information for FER protection */ Word16 tmp_noise_fx; /* Long term temporary noise energy */ - Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ + Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ Word16 FEC_pitch_fx; /* FEC pitch */ Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ Word16 *bwe_exc_fx; /* Excitation for SWB TBE */ @@ -181,6 +181,7 @@ ivas_error acelp_core_dec_ivas_fx( st->hFdCngDec->hFdCngCom->sidNoiseEstExp = common_e; move16(); } + FOR( i = 0; i < NPART; i++ ) { st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), @@ -188,14 +189,14 @@ ivas_error acelp_core_dec_ivas_fx( move32(); } - ApplyFdCng_ivas_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); + ApplyFdCng_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); } ELSE { configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); /* decode CNG parameters */ - CNG_dec_ivas_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); /* comfort noise generation */ CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); @@ -636,7 +637,7 @@ ivas_error acelp_core_dec_ivas_fx( /* decode CNG parameters */ IF( st->cng_type == LP_CNG ) { - CNG_dec_ivas_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); + CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); Copy( Aq_fx, st->Aq_cng, add( M, 1 ) ); /* comfort noise generation */ @@ -657,13 +658,11 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { FdCng_decodeSID_fx( st->hFdCngDec->hFdCngCom, st ); } ELSE -#endif { Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; move16(); @@ -689,7 +688,7 @@ ivas_error acelp_core_dec_ivas_fx( move32(); } - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); Word16 new_sidNoiseEstExp = 31 - Q4; move16(); @@ -704,7 +703,7 @@ ivas_error acelp_core_dec_ivas_fx( move16(); test(); - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) { @@ -728,13 +727,11 @@ ivas_error acelp_core_dec_ivas_fx( } } -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_comfort_noise_dec_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 2, -1 ); } ELSE -#endif { generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); } @@ -758,7 +755,6 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( st->hMusicPF && st->hGSCDec ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { // VE: TBV: should 'st_fx->L_frame * HIBND_ACB_L_FAC' be corrected in EVS? @@ -766,7 +762,6 @@ ivas_error acelp_core_dec_ivas_fx( st->L_frame * HIBND_ACB_L_FAC, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); } ELSE -#endif { Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); @@ -794,7 +789,6 @@ ivas_error acelp_core_dec_ivas_fx( /* Update music post processing values */ /* Filter energies update */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { FOR( i = 0; i < DCT_L_POST; i++ ) @@ -804,7 +798,6 @@ ivas_error acelp_core_dec_ivas_fx( } } ELSE -#endif { FOR( i = 0; i < DCT_L_POST; i++ ) { @@ -822,15 +815,12 @@ ivas_error acelp_core_dec_ivas_fx( /* reset the decoder */ CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); - -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { /* update st_fx->mem_syn1 for ACELP core switching */ Copy( st->mem_syn3_fx, st->mem_syn1_fx, M ); } ELSE -#endif { st->Q_syn_cng = st->Q_syn; move16(); @@ -889,13 +879,13 @@ ivas_error acelp_core_dec_ivas_fx( move16(); } - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); test(); test(); IF( EQ_16( st->coder_type, TRANSITION ) && LT_16( tc_subfr, L_SUBFR ) && EQ_16( st->L_frame, L_FRAME ) ) { - config_acelp1_IVAS( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } } @@ -934,7 +924,7 @@ ivas_error acelp_core_dec_ivas_fx( IF( !tdm_lp_reuse_flag ) { - lsf_dec_ivas_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); + lsf_dec_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); } ELSE { @@ -1084,7 +1074,7 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE /* GENERIC */ { - decod_gen_2sbfr_ivas_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + decod_gen_2sbfr_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { @@ -1106,7 +1096,7 @@ ivas_error acelp_core_dec_ivas_fx( ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) { /* UNVOICED frames */ - decod_unvoiced_ivas_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); + decod_unvoiced_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } @@ -1131,15 +1121,15 @@ ivas_error acelp_core_dec_ivas_fx( ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( ( st->coder_type == INACTIVE ) && st->inactive_coder_type_flag ) ) { /* AUDIO and INACTIVE frames (coded by GSC technology) */ - decod_audio_ivas_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, - tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); + decod_audio_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, + tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ } ELSE { /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ - IF( NE_32( ( error = decod_gen_voic_ivas_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = decod_gen_voic_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -1163,7 +1153,7 @@ ivas_error acelp_core_dec_ivas_fx( * Apply energy matching when switching to inactive frames *-----------------------------------------------------------------*/ - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); /*------------------------------------------------------------* * Decode information and modify the excitation signal of stationary unvoiced frames @@ -1212,7 +1202,6 @@ ivas_error acelp_core_dec_ivas_fx( move16(); /* Extrapolation of the last future part, windowing and high resolution DCT transform */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { // VE: TBV: this is likely a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' @@ -1220,7 +1209,6 @@ ivas_error acelp_core_dec_ivas_fx( st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); } ELSE -#endif { Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); } @@ -1229,9 +1217,7 @@ ivas_error acelp_core_dec_ivas_fx( LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBC whether needed in IVAS -#endif { Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ } @@ -1300,13 +1286,9 @@ ivas_error acelp_core_dec_ivas_fx( Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, -#ifdef REMOVE_EVS_DUPLICATES - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); -#else - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); test(); test(); @@ -1384,7 +1366,7 @@ ivas_error acelp_core_dec_ivas_fx( } /* Apply energy matching when switching to inactive frames */ - Inac_switch_ematch_ivas_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); + Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); /* update past excitation signals for LD music post-filter */ IF( st->hMusicPF != NULL ) @@ -1452,13 +1434,9 @@ ivas_error acelp_core_dec_ivas_fx( { Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, -#ifdef REMOVE_EVS_DUPLICATES - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); -#else - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif + FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, + &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, + exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); } /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ @@ -1544,7 +1522,7 @@ ivas_error acelp_core_dec_ivas_fx( Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); set16_fx( st->hPFstat->mem_zero, 0, M ); - formant_post_filt_ivas_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); + formant_post_filt_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); } ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) { @@ -1612,7 +1590,7 @@ ivas_error acelp_core_dec_ivas_fx( IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) { /* Noise estimate */ - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } IF( !st->cna_dirac_flag ) @@ -1652,13 +1630,11 @@ ivas_error acelp_core_dec_ivas_fx( } ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); } ELSE -#endif { IF( st->idchan == 0 ) { @@ -1666,10 +1642,13 @@ ivas_error acelp_core_dec_ivas_fx( { set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); } + Word32 psyn_32_fx[L_FRAME16k]; Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); // Q15 + generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); + Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 } @@ -1713,7 +1692,7 @@ ivas_error acelp_core_dec_ivas_fx( /*Noise estimate*/ IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) ) { - ApplyFdCng_ivas_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } } } @@ -1730,7 +1709,6 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { // VE: TBV - is it correct in EVS? in FLP, it is: @@ -1743,7 +1721,6 @@ ivas_error acelp_core_dec_ivas_fx( } } ELSE -#endif { FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) { @@ -1775,7 +1752,6 @@ ivas_error acelp_core_dec_ivas_fx( * Bass post-filter *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { CLDFB_SCALE_FACTOR scaleFactor; @@ -1880,7 +1856,6 @@ ivas_error acelp_core_dec_ivas_fx( Copy( synth_fx16, st->previoussynth_fx, output_frame ); } ELSE -#endif { /* check if the CLDFB works on the right sample rate */ IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) @@ -1896,9 +1871,7 @@ ivas_error acelp_core_dec_ivas_fx( } /* analyze pitch coherence for bass post-filter */ - Word32 pitch_buf_fx_q20[12]; - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) Word16 lim = shr( st->L_frame, 6 ); FOR( Word16 lp = 0; lp < lim; lp++ ) @@ -1961,7 +1934,9 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 st->cldfbAna->Q_cldfb_state = Q12; move16(); + cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); + Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 st->cldfbAna->Q_cldfb_state = Q11; move16(); @@ -1990,6 +1965,7 @@ ivas_error acelp_core_dec_ivas_fx( } addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 st->cldfbBPF->Q_cldfb_state = Q10; move16(); @@ -2186,6 +2162,7 @@ ivas_error acelp_core_dec_ivas_fx( Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 st->cldfbAna->Q_cldfb_state = Q12; move16(); + cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 @@ -2215,8 +2192,8 @@ ivas_error acelp_core_dec_ivas_fx( tmp = nSamples; move16(); } - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); + addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 st->cldfbBPF->Q_cldfb_state = Q10; @@ -2299,13 +2276,11 @@ ivas_error acelp_core_dec_ivas_fx( IF( ( EQ_16( st->L_frame, L_FRAME ) && ( st->bwidth != NB ) && GE_16( output_frame, L_FRAME16k ) && ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); } ELSE -#endif { Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); @@ -2315,9 +2290,7 @@ ivas_error acelp_core_dec_ivas_fx( ELSE { hf_synth_reset_fx( st->hBWE_zero ); -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but condition is here to keep EVS bit-exact for the moment -#endif { set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); } @@ -2356,13 +2329,11 @@ ivas_error acelp_core_dec_ivas_fx( test(); IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); } ELSE -#endif { Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); @@ -2389,14 +2360,12 @@ ivas_error acelp_core_dec_ivas_fx( IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) { /* update CNG parameters in active frames */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { cng_params_upd_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate ); } ELSE -#endif { cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, @@ -2413,9 +2382,7 @@ ivas_error acelp_core_dec_ivas_fx( } } -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( st->element_mode, EVS_MONO ) ) -#endif { IF( save_hb_synth_fx16 ) { diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 6d3d0b381..363db8202 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -128,11 +128,7 @@ ivas_error acelp_core_switch_dec_fx( * Excitation decoding *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); -#else - config_acelp1( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); -#endif + config_acelp1_fx( DEC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &decode_bwe /* dummy */, &i, st_fx->element_mode, &i /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, 0, 0 ); decod_gen_voic_core_switch_fx( st_fx, L_frame_for_cs, 0, Aq, exc, cbrate, &st_fx->Q_exc ); @@ -920,11 +916,7 @@ static void decod_gen_voic_core_switch_fx( * Decode pitch lag *----------------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - pitch = pit_decode_ivas_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*Q6*/ -#else - pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); /*Q6*/ -#endif + pitch = pit_decode_fx( st_fx, core_brate, 0, L_frame, 0, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*Q6*/ /*--------------------------------------------------------------* * Find the adaptive codebook vector. diff --git a/lib_dec/amr_wb_dec_fx.c b/lib_dec/amr_wb_dec_fx.c index 971af2b56..96ae82dde 100644 --- a/lib_dec/amr_wb_dec_fx.c +++ b/lib_dec/amr_wb_dec_fx.c @@ -373,11 +373,7 @@ ivas_error amr_wb_dec_fx( IF( EQ_32( st_fx->core_brate, FRAME_NO_DATA ) || EQ_32( st_fx->core_brate, SID_1k75 ) ) { /* decode CNG parameters */ -#ifdef REMOVE_EVS_DUPLICATES - CNG_dec_ivas_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); -#else CNG_dec_fx( st_fx, EVS_MONO, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, &sid_bw, q_env ); -#endif /* comfort noise generation */ CNG_exc_fx( st_fx->core_brate, L_FRAME, &st_fx->hTdCngDec->Enew_fx, &st_fx->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st_fx->lp_ener_fx, st_fx->last_core_brate, @@ -630,15 +626,9 @@ ivas_error amr_wb_dec_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, - &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); -#else FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, avoid_lpc_burst_on_recovery, 0 ); -#endif + exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, 0 ); frame_ener_fx( L_FRAME, st_fx->clas_dec, syn_fx, pitch_buf_tmp[3], &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); } @@ -717,17 +707,10 @@ ivas_error amr_wb_dec_fx( * (smoothing is performed in the excitation domain and signal is resynthesized after) *------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, - MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, - st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, - st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, 0, 0 ); -#else FEC_scale_syn_fx( L_FRAME, &update_flg, st_fx->clas_dec, st_fx->last_good, syn_fx, pitch_buf_tmp, st_fx->enr_old_fx, L_enr_q_fx, -1, MOVING_AVERAGE, &st_fx->scaling_flag, &st_fx->lp_ener_FEC_av, &st_fx->lp_ener_FEC_max, st_fx->bfi, st_fx->total_brate, st_fx->prev_bfi, st_fx->last_core_brate, exc_fx, exc2_fx, Aq_fx, &st_fx->old_enr_LP, mem_tmp_fx, st_fx->mem_syn2_fx, - st_fx->Q_exc, st_fx->Q_syn, 0, 0 ); -#endif + st_fx->Q_exc, st_fx->Q_syn, EVS_MONO, 0, 0 ); /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ frame_ener_fx( L_FRAME, st_fx->last_good, syn_fx, shr( FEC_pitch_fx, 6 ), &st_fx->enr_old_fx, L_FRAME, st_fx->Q_syn, 3, 0 ); @@ -785,11 +768,7 @@ ivas_error amr_wb_dec_fx( st_fx->hPFstat->on = 1; move16(); test(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, sub( amr_io_class, AUDIO_CLAS ) == 0 ); -#else formant_post_filt_fx( st_fx->hPFstat, tmp_buffer_fx + L_SYN_MEM, Aq_fx, syn_fx, L_FRAME, L_shl( st_fx->psf_lp_noise_fx, 15 ), st_fx->total_brate, sub( amr_io_class, AUDIO_CLAS ) == 0 ); -#endif } /*----------------------------------------------------------------* @@ -813,11 +792,9 @@ ivas_error amr_wb_dec_fx( st_fx->VAD = 0; move16(); } -#ifdef REMOVE_EVS_DUPLICATES - ApplyFdCng_ivas_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); -#else - ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, NULL, NULL, st_fx, 0, 0 ); -#endif + + ApplyFdCng_fx( syn_fx, st_fx->Q_syn, NULL, 0, NULL, NULL, NULL, st_fx, 0, 0 ); + st_fx->hFdCngDec->hFdCngCom->frame_type_previous = st_fx->m_frame_type; move16(); diff --git a/lib_dec/cng_dec_fx.c b/lib_dec/cng_dec_fx.c index ce6ad6568..fdb6488db 100644 --- a/lib_dec/cng_dec_fx.c +++ b/lib_dec/cng_dec_fx.c @@ -22,19 +22,19 @@ static void shb_CNG_decod_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word static void shb_CNG_decod_ivas_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word16 *shb_synth_fx, const Word16 sid_bw, const Word16 Qsyn ); /*-----------------------------------------------------------------* + * CNG_dec_fx() + * * Decode residual signal energy *-----------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES void CNG_dec_fx( Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ + const Word16 last_element_mode, /* i : last element mode Q0 */ Word16 Aq[], /* o : LP coefficients Q12 */ Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw /* i : 0-NB/WB, 1-SWB SID Q0 */ - , + Word16 *sid_bw, /* i : 0-NB/WB, 1-SWB SID Q0 */ Word32 *q_env ) { Word16 istep; @@ -72,7 +72,6 @@ void CNG_dec_fx( Word16 exp_pow; Word16 tmp_loop; Word16 enr_new, Aq_tmp[M + 1]; - Word16 LSF_Q_prediction; /* o : LSF prediction mode - just temporary variable in CNG */ TD_CNG_DEC_HANDLE hTdCngDec; #ifdef BASOP_NOGLOB_DECLARE_LOCAL @@ -108,681 +107,9 @@ void CNG_dec_fx( } ELSE { - lsf_dec_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, - NULL ); - /* check IF LSPs may trigger too much synthesis energy */ - - E_LPC_f_lsp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - - IF( shr( enr_new, 14 ) > 0 ) - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - } - } - ELSE - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - - /* Initialize the CNG spectral envelope in case of the very first CNG frame */ - IF( st_fx->first_CNG == 0 ) - { - Copy( st_fx->lsp_old_fx, st_fx->lspCNG_fx, M ); /* Q15 */ - } - - /*-----------------------------------------------------------------* - * Decode residual signal energy - *-----------------------------------------------------------------*/ - - *allow_cn_step = 0; - move16(); - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - istep = ISTEP_AMR_WB_SID_FX; /* Q15 */ - move16(); - if ( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - istep = ISTEP_SID_FX; /* Q15 */ - move16(); - } - - /* initialize the energy quantization parameters */ - num_bits = 6; - move16(); - if ( st_fx->Opt_AMR_WB == 0 ) - { - num_bits = 7; - move16(); - } - - /* decode the energy index */ - L_enr_index = get_next_indice_fx( st_fx, num_bits ); - - IF( LE_32( st_fx->last_core_brate, SID_2k40 ) || EQ_16( st_fx->prev_bfi, 1 ) ) - { - tmp1 = add( hTdCngDec->old_enr_index, 20 ); - } - ELSE - { - tmp1 = add( hTdCngDec->old_enr_index, 40 ); - } - IF( GT_16( L_enr_index, tmp1 ) && hTdCngDec->old_enr_index >= 0 ) /* Likely bit error and not startup */ - { - L_enr_index = tmp1; - move16(); - L_enr_index = s_min( L_enr_index, 127 ); /* Q0 */ - IF( st_fx->Opt_AMR_WB ) - { - L_enr_index = s_min( L_enr_index, 63 ); /* Q0 */ - } - } - - test(); - test(); - test(); - IF( GT_32( st_fx->last_core_brate, SID_1k75 ) && - NE_16( st_fx->first_CNG, 0 ) && - GE_16( hTdCngDec->old_enr_index, 0 ) && - GT_16( L_enr_index, add( hTdCngDec->old_enr_index, 1 ) ) ) - { - *allow_cn_step = 1; - move16(); - } - - hTdCngDec->old_enr_index = L_enr_index; - move16(); - if ( !L_enr_index ) - { - L_enr_index = -5; - move16(); - } - /* st_fx->Enew = L_enr_index / step - 2.0f;*/ - L_ener = L_mult( L_enr_index, istep ); /* Q16 (0+15) */ - /* subtract by 2 not done to leave Energy in Q2 */ - - /* extract integral and fractional parts */ - ener_fra = L_Extract_lc( L_ener, &ener_int ); - ener_int = add( ener_int, 4 ); /* Q2 to Q6 */ - - /* find the new energy value */ - hTdCngDec->Enew_fx = Pow2( ener_int, ener_fra ); - move32(); - - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - burst_ho_cnt = get_next_indice_fx( st_fx, 3 ); /* 3bit */ - - *sid_bw = get_next_indice_fx( st_fx, 1 ); - move16(); - IF( *sid_bw == 0 ) - { - env_idx[0] = get_next_indice_fx( st_fx, 6 ); - move16(); - - /* get quantized res_env_details */ - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - q_env[i] = L_deposit_l( CNG_details_codebook_fx[env_idx[0]][i] ); - move32(); - } - } - } - /* Reset CNG history IF CNG frame length is changed */ - test(); - test(); - IF( EQ_16( st_fx->bwidth, WB ) && NE_16( st_fx->first_CNG, 0 ) && NE_16( st_fx->L_frame, st_fx->last_CNG_L_frame ) ) - { - hTdCngDec->ho_hist_size = 0; - move16(); - } - } - - /*---------------------------------------------------------------------* - * CNG spectral envelope update - * Find A(z) coefficients - *---------------------------------------------------------------------*/ - test(); - test(); - test(); - IF( LE_32( st_fx->last_core_brate, SID_2k40 ) ) - { - /* Reset hangover counter if not first SID period */ - if ( GT_32( st_fx->core_brate, FRAME_NO_DATA ) ) - { - hTdCngDec->num_ho = 0; - move16(); - } - /* Update LSPs IF last SID energy not outliers or insufficient number of hangover frames */ - test(); - IF( LT_16( hTdCngDec->num_ho, 3 ) || LT_32( Mult_32_16( hTdCngDec->Enew_fx, 21845 /*1/1.5f, Q15*/ ), st_fx->lp_ener_fx ) ) - { - FOR( i = 0; i < M; i++ ) - { - /* AR low-pass filter */ - st_fx->lspCNG_fx[i] = mac_r( L_mult( CNG_ISF_FACT_FX, st_fx->lspCNG_fx[i] ), 32768 - CNG_ISF_FACT_FX, lsp_new[i] ); - move16(); /* Q15 (15+15+1-16) */ - } - } - } - ELSE - { - /* Update CNG_mode IF allowed */ - test(); - test(); - test(); - IF( ( st_fx->Opt_AMR_WB || EQ_16( st_fx->bwidth, WB ) ) && ( !st_fx->first_CNG || GE_16( hTdCngDec->act_cnt2, MIN_ACT_CNG_UPD ) ) ) - { - IF( GT_32( st_fx->last_active_brate, ACELP_16k40 ) ) - { - st_fx->CNG_mode = -1; - move16(); - } - ELSE - { - st_fx->CNG_mode = get_cng_mode( st_fx->last_active_brate ); - move16(); - } - } - - /* If first sid after active burst update LSF history from circ buffer */ - burst_ho_cnt = s_min( burst_ho_cnt, hTdCngDec->ho_circ_size ); /* MODE1_DTX_IN_CODEC_B_FIX Q0*/ - hTdCngDec->act_cnt = 0; - move16(); - s_ptr = add( sub( hTdCngDec->ho_circ_ptr, burst_ho_cnt ), 1 ); - IF( s_ptr < 0 ) - { - s_ptr = add( s_ptr, hTdCngDec->ho_circ_size ); - } - - FOR( ll = burst_ho_cnt; ll > 0; ll-- ) - { - hTdCngDec->ho_hist_ptr = add( hTdCngDec->ho_hist_ptr, 1 ); /* Q0 */ - move16(); - if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_ptr = 0; - move16(); - } - - /* Conversion between 12.8k and 16k LSPs */ - test(); - test(); - test(); - IF( ( EQ_16( st_fx->L_frame, L_FRAME16k ) && hTdCngDec->ho_16k_lsp[s_ptr] == 0 ) || ( EQ_16( st_fx->L_frame, L_FRAME ) && EQ_16( hTdCngDec->ho_16k_lsp[s_ptr], 1 ) ) ) - { - /* Conversion from 16k LPSs to 12k8 */ - lsp_convert_poly_fx( &( hTdCngDec->ho_lsp_circ_fx[s_ptr * M] ), st_fx->L_frame, 0 ); - } - /* update the circular buffers */ - Copy( &( hTdCngDec->ho_lsp_circ_fx[s_ptr * M] ), &( hTdCngDec->ho_lsp_hist_fx[hTdCngDec->ho_hist_ptr * M] ), M ); /* Qx */ - Copy32( &( hTdCngDec->ho_ener_circ_fx[s_ptr] ), &( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] ), 1 ); /* Q6 */ - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); - move32(); - Copy32( &( hTdCngDec->ho_env_circ_fx[s_ptr * NUM_ENV_CNG] ), &( hTdCngDec->ho_env_hist_fx[hTdCngDec->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); /* Qx */ - - hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); - move16(); - - if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_size = HO_HIST_SIZE; - move16(); - } - - s_ptr = add( s_ptr, 1 ); - if ( EQ_16( s_ptr, hTdCngDec->ho_circ_size ) ) - { - s_ptr = 0; - move16(); - } - } - - IF( hTdCngDec->ho_hist_size > 0 ) /* can be -1 at init MODE1_DTX_IN_CODEC_B_FIX */ - { - /* *allow_cn_step |= ( st_fx->ho_ener_hist[st_fx->ho_hist_ptr] > 4.0f * st_fx->lp_ener );*/ - L_tmp1 = L_shr( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr], 2 ); - L_tmp1 = L_sub( L_tmp1, st_fx->lp_ener_fx ); + lsf_dec_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, NULL ); - test(); - test(); - IF( ( L_tmp1 > 0 && ( st_fx->first_CNG || st_fx->element_mode == EVS_MONO ) ) ) - { - *allow_cn_step = s_or( *allow_cn_step, 1 ); - move16(); - } - } - IF( EQ_16( last_element_mode, IVAS_CPE_TD ) ) - { - *allow_cn_step = 1; - move16(); - } - test(); - IF( EQ_16( *allow_cn_step, 0 ) && GT_16( hTdCngDec->ho_hist_size, 0 ) ) - { - /* Use average of energies below last energy */ - ptr = hTdCngDec->ho_hist_ptr; - move16(); - Copy( &( hTdCngDec->ho_lsp_hist_fx[ptr * M] ), tmp, M ); /* Qx */ - m1 = 0; - move16(); - IF( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x1 ) == 0 ) - { - Copy32( &hTdCngDec->ho_env_hist_fx[ptr * NUM_ENV_CNG], tmp_env, NUM_ENV_CNG ); - m1 = 1; - move16(); - } - L_enr = Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], W_DTX_HO_FX[0] ); /* Q6+15-15->Q6 */ - - weights = W_DTX_HO_FX[0]; /* Q15 */ - move16(); - - m = 1; - move16(); - FOR( k = 1; k < hTdCngDec->ho_hist_size; k++ ) - { - ptr--; - if ( ptr < 0 ) - { - ptr = HO_HIST_SIZE - 1; - move16(); - } - - test(); - IF( LT_32( Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], ONE_OVER_BUF_H_NRG_FX ), hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] ) && - GT_32( hTdCngDec->ho_ener_hist_fx[ptr], Mult_32_16( hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr], BUF_L_NRG_FX ) ) ) - { - /*enr += W_DTX_HO[k] * st_fx->ho_ener_hist[ptr];*/ - L_tmp1 = Mult_32_16( hTdCngDec->ho_ener_hist_fx[ptr], W_DTX_HO_FX[k] ); /* Q6+15-15->Q6 */ - L_enr = L_add( L_enr, L_tmp1 ); /* Q6 */ - - /*weights += W_DTX_HO[k];*/ - weights = add( weights, W_DTX_HO_FX[k] ); /* Q15 */ - - Copy( &hTdCngDec->ho_lsp_hist_fx[ptr * M], &tmp[m * M], M ); /* Qx */ - IF( EQ_32( L_and( hTdCngDec->ho_sid_bw, L_shl( (Word32) 0x1, k ) ), 0 ) ) - { - Copy32( &hTdCngDec->ho_env_hist_fx[ptr * NUM_ENV_CNG], &tmp_env[m1 * NUM_ENV_CNG], NUM_ENV_CNG ); /* Qx */ - m1++; - } - m++; - } - } - - /*enr /= weights;*/ - exp = norm_s( weights ); - tmp1 = div_s( shl( 1, sub( 14, exp ) ), weights ); /* Q(15+14-exp-15) */ - L_tmp1 = Mult_32_16( L_enr, tmp1 ); /* Q(14-exp+6-15)->Q(5-exp) */ - L_enr = L_shl( L_tmp1, add( exp, 1 ) ); /* Q6 */ - - st_fx->lp_ener_fx = L_enr; /* Q6 */ - move32(); - set32_fx( max_val, 0, 2 ); - set16_fx( max_idx, 0, 2 ); - - FOR( i = 0; i < m; i++ ) - { - IF( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - lsp2lsf_fx( &tmp[i * M], lsf_tmp, M, INT_FS_FX ); - ftmp_fx = 964; - move16(); /*X2.56 */ - tmpv = sub( 16384, add( lsf_tmp[M - 1], ftmp_fx ) ); /*QX2.56*/ - L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ - } - ELSE - { - lsp2lsf_fx( &tmp[i * M], lsf_tmp, M, INT_FS_16k_FX ); - ftmp_fx = 1205; - move16(); /*QX2.56*/ - tmpv = sub( 20480, add( lsf_tmp[M - 1], ftmp_fx ) ); /*QX2.56*/ - L_tmp = L_mult0( tmpv, tmpv ); /*QX6.5536*/ - } - - tmpv = sub( lsf_tmp[0], ftmp_fx ); /*QX2.56*/ - L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ - FOR( j = 0; j < M - 1; j++ ) - { - tmpv = sub( sub( lsf_tmp[j + 1], lsf_tmp[j] ), ftmp_fx ); /*QX2.56*/ - L_tmp = L_mac0( L_tmp, tmpv, tmpv ); /*QX6.5536*/ - } - - C[i] = Mpy_32_16_1( L_tmp, 1928 ); /*QX6.5536*/ - move32(); - - IF( GT_32( C[i], max_val[0] ) ) - { - max_val[1] = max_val[0]; - move32(); - max_idx[1] = max_idx[0]; - move16(); - max_val[0] = C[i]; - move32(); - max_idx[0] = i; - move16(); - } - ELSE IF( GT_32( C[i], max_val[1] ) ) - { - max_val[1] = C[i]; - move32(); - max_idx[1] = i; - move16(); - } - } - - IF( EQ_16( m, 1 ) ) - { - Copy( tmp, lsp_tmp, M ); /* Qx */ - } - ELSE IF( LT_16( m, 4 ) ) - { - FOR( i = 0; i < M; i++ ) - { - L_tmp1 = 0; - move32(); - FOR( j = 0; j < m; j++ ) - { - L_tmp1 = L_add( L_tmp1, L_deposit_l( tmp[j * M + i] ) ); - } - - L_tmp1 = L_sub( L_tmp1, L_deposit_l( tmp[max_idx[0] * M + i] ) ); - tmpv = div_s( 1, sub( m, 1 ) ); /*Q15*/ - L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ - lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ - move16(); - } - } - ELSE - { - FOR( i = 0; i < M; i++ ) - { - L_tmp1 = 0; - move32(); - FOR( j = 0; j < m; j++ ) - { - L_tmp1 = L_add( L_tmp1, L_deposit_l( tmp[j * M + i] ) ); - } - - L_tmp1 = L_sub( L_tmp1, L_add( L_deposit_l( tmp[max_idx[0] * M + i] ), L_deposit_l( tmp[max_idx[1] * M + i] ) ) ); /*Q15*/ - tmpv = div_s( 1, sub( m, 2 ) ); /*Q15*/ - L_tmp1 = Mpy_32_16_1( L_tmp1, tmpv ); /*Q15*/ - lsp_tmp[i] = extract_l( L_tmp1 ); /*Q15*/ - move16(); - } - } - - dist = 0; - move16(); /*Q15*/ - max_dev = 0; - move16(); /*Q15*/ - FOR( i = 0; i < M; i++ ) - { - dev = abs_s( sub( lsp_tmp[i], lsp_new[i] ) ); /*Q15*/ - dist = add_o( dist, dev, &Overflow ); /*Q15*/ - if ( GT_16( dev, max_dev ) ) - { - max_dev = dev; - move16(); - } - } - - test(); - IF( GT_16( dist, 13107 ) || GT_16( max_dev, 3277 ) ) /* 0.4 and 0.1 in Q15 */ - { - FOR( i = 0; i < M; i++ ) - { - st_fx->lspCNG_fx[i] = lsp_tmp[i]; - move16(); /*Q15*/ - } - } - ELSE - { - FOR( i = 0; i < M; i++ ) - { - /* AR low-pass filter */ - st_fx->lspCNG_fx[i] = add( mult_r( 26214, lsp_tmp[i] ), mult_r( 6554, lsp_new[i] ) ); /* Q15 */ - move16(); - } - } - IF( m1 > 0 ) - { - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - L_tmp = L_deposit_l( 0 ); - FOR( j = 0; j < m1; j++ ) - { - /* env[i] += tmp_env[j*NUM_ENV_CNG+i];*/ - L_tmp = L_add_sat( L_tmp, tmp_env[j * NUM_ENV_CNG + i] ); - } - /* env[i] /= (float)m1; */ - /* env[i] = env[i] - 2*st_fx->lp_ener_fx; */ - IF( EQ_16( m1, 1 ) ) - { - L_tmp = L_sub_sat( L_tmp, L_add_sat( st_fx->lp_ener_fx, st_fx->lp_ener_fx ) ); /* Q6 */ - } - ELSE - { - tmp1 = div_s( 1, m1 ); - L_tmp = Mult_32_16( L_tmp, tmp1 ); /* Q6 */ - L_tmp = L_sub_sat( L_tmp, L_add_sat( st_fx->lp_ener_fx, st_fx->lp_ener_fx ) ); /* Q6 */ - } - env[i] = L_tmp; /* Q6 */ - move32(); - } - - Copy32( env, hTdCngDec->lp_env_fx, NUM_ENV_CNG ); /* Q6 */ - } - } - ELSE - { - Copy( lsp_new, st_fx->lspCNG_fx, M ); /* use newly analyzed ISFs */ /* Q15 */ - } - } - - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* Update hangover memory during CNG */ - test(); - IF( ( *allow_cn_step == 0 ) && LT_32( hTdCngDec->Enew_fx, L_add_sat( st_fx->lp_ener_fx, L_shr( st_fx->lp_ener_fx, 1 ) ) ) ) - { - /* update the pointer to circular buffer of old LSP vectors */ - hTdCngDec->ho_hist_ptr++; - move16(); - if ( EQ_16( hTdCngDec->ho_hist_ptr, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_ptr = 0; - move16(); - } - - /* update the circular buffer of old LSP vectors with the new LSP vector */ - Copy( lsp_new, &( hTdCngDec->ho_lsp_hist_fx[( hTdCngDec->ho_hist_ptr ) * M] ), M ); /* Q15 */ - - /* update the hangover energy buffer */ - hTdCngDec->ho_ener_hist_fx[hTdCngDec->ho_hist_ptr] = hTdCngDec->Enew_fx; /* Q6 */ - move32(); - test(); - IF( EQ_32( st_fx->core_brate, SID_2k40 ) && ( *sid_bw == 0 ) ) - { - /* enr1 = (float)log10( st->Enew*L_frame + 0.1f ) / (float)log10( 2.0f );*/ - exp = norm_l( hTdCngDec->Enew_fx ); - L_tmp = L_shl( hTdCngDec->Enew_fx, exp ); /*Q(exp+6)*/ - L_tmp = Mult_32_16( L_tmp, shl( st_fx->L_frame, 5 ) ); /*Q(exp+6+5-15=exp-4)*/ - L_tmp = L_shr_sat( L_tmp, sub( exp, 10 ) ); /*Q6*/ - exp = norm_l( L_tmp ); - fra = Log2_norm_lc( L_shl( L_tmp, exp ) ); - exp = sub( sub( 30, exp ), 6 ); - L_tmp = L_Comp( exp, fra ); - enr1 = L_shr( L_tmp, 10 ); /* Q6 */ - - FOR( i = 0; i < NUM_ENV_CNG; i++ ) - { - /* get quantized envelope */ - /* env[i] = pow(2.0f,(enr1 - q_env[i])) + 2*st->Enew;*/ - L_tmp = L_sub( enr1, q_env[i] ); /* Q6 */ - L_tmp = L_shl( L_tmp, 10 ); /* 16 */ - temp_lo_fx = L_Extract_lc( L_tmp, &temp_hi_fx ); - - exp_pow = sub( 14, temp_hi_fx ); - L_tmp = Pow2( 14, temp_lo_fx ); /* Qexp_pow */ - env[i] = L_shl( L_tmp, sub( 6, exp_pow ) ); /* Q6 */ - move32(); - L_tmp = L_add( hTdCngDec->Enew_fx, hTdCngDec->Enew_fx ); - env[i] = L_add( env[i], L_tmp ); /* Q6 */ - move32(); - } - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); /* Q0 */ - move32(); - Copy32( env, &( hTdCngDec->ho_env_hist_fx[hTdCngDec->ho_hist_ptr * NUM_ENV_CNG] ), NUM_ENV_CNG ); /* Q6 */ - } - ELSE IF( ( *sid_bw != 0 ) ) - { - hTdCngDec->ho_sid_bw = L_shl( L_and( hTdCngDec->ho_sid_bw, (Word32) 0x3fffffffL ), 1 ); /* Q0 */ - move32(); - hTdCngDec->ho_sid_bw = L_or( hTdCngDec->ho_sid_bw, 0x1L ); /* Q0 */ - move32(); - } - - hTdCngDec->ho_hist_size = add( hTdCngDec->ho_hist_size, 1 ); - move16(); - if ( GT_16( hTdCngDec->ho_hist_size, HO_HIST_SIZE ) ) - { - hTdCngDec->ho_hist_size = HO_HIST_SIZE; - move16(); - } - } - /* Update the frame length memory */ - st_fx->last_CNG_L_frame = st_fx->L_frame; - move16(); - - if ( NE_32( st_fx->core_brate, SID_1k75 ) ) - { - hTdCngDec->num_ho = m; - move16(); - } - } - - IF( st_fx->element_mode == EVS_MONO ) - { - st_fx->last_CNG_L_frame = st_fx->L_frame; - move16(); - - IF( NE_32( st_fx->core_brate, SID_1k75 ) ) - { - hTdCngDec->num_ho = m; - move16(); - } - } - IF( st_fx->Opt_AMR_WB ) - { - E_LPC_f_isp_a_conversion( st_fx->lspCNG_fx, Aq, M ); - } - ELSE - { - E_LPC_f_lsp_a_conversion( st_fx->lspCNG_fx, Aq, M ); - } - - tmp_loop = shr( st_fx->L_frame, 6 ); - FOR( i = 1; i < tmp_loop; i++ ) /* L_frame/L_SUBFR */ - { - Copy( Aq, &Aq[i * ( M + 1 )], add( M, 1 ) ); /* Q12 */ - } - - return; -} -#endif -void CNG_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 last_element_mode, /* i : last element mode Q0 */ - Word16 Aq[], /* o : LP coefficients Q12 */ - Word16 *lsp_new, /* i/o: current frame LSPs Q15 */ - Word16 *lsf_new, /* i/o: current frame LSFs Qlog2(2.56) */ - Word16 *allow_cn_step, /* o : allow CN step Q0 */ - Word16 *sid_bw /* i : 0-NB/WB, 1-SWB SID Q0 */ - , - Word32 *q_env ) -{ - Word16 istep; - Word16 i, L_enr_index; - Word32 L_ener; - Word16 ener_fra, ener_int; - Word16 num_bits; - Word16 weights, ptr, j, k; - Word16 m1; - Word16 m = 0; - move16(); - Word16 tmp[HO_HIST_SIZE * M]; - Word16 burst_ho_cnt = 0; - move16(); - Word16 ll, s_ptr; - Word32 L_enr, L_tmp1; - Word16 tmp1, exp; - Word16 lsf_tmp[M]; - Word32 C[M]; - Word32 max_val[2]; - Word16 max_idx[2]; - Word16 ftmp_fx; - Word16 lsp_tmp[M]; - Word16 dev; - Word16 max_dev; - Word16 dist; - Word16 tmpv; - Word16 env_idx[2]; - Word32 enr1; - Word32 env[NUM_ENV_CNG]; - Word32 tmp_env[HO_HIST_SIZE * NUM_ENV_CNG]; - Word32 L_tmp; - Word16 fra; - Word16 temp_lo_fx, temp_hi_fx; - Word16 exp_pow; - Word16 tmp_loop; - Word16 enr_new, Aq_tmp[M + 1]; - - Word16 LSF_Q_prediction; /* o : LSF prediction mode - just temporary variable in CNG */ - TD_CNG_DEC_HANDLE hTdCngDec; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - hTdCngDec = st_fx->hTdCngDec; - - m = 0; - move16(); - /*-----------------------------------------------------------------* - * Decode CNG spectral envelope (only in SID frame) - *-----------------------------------------------------------------*/ - test(); - IF( EQ_32( st_fx->core_brate, SID_1k75 ) || EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* de-quantize the LSF vector */ - IF( st_fx->Opt_AMR_WB != 0 ) - { - /* Flt function */ - isf_dec_amr_wb_fx( st_fx, Aq, lsf_new, lsp_new ); - /* check IF ISPs may trigger too much synthesis energy */ - - E_LPC_f_isp_a_conversion( lsp_new, Aq_tmp, M ); - enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); - - IF( ( shr( enr_new, 14 ) > 0 ) ) - { - /* Use old LSP vector */ - Copy( st_fx->lsp_old_fx, lsp_new, M ); /* Q15 */ - Copy( st_fx->lsf_old_fx, lsf_new, M ); /* Q2.56 */ - } - } - ELSE - { - lsf_dec_ivas_fx( st_fx, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, - NULL ); /* check IF LSPs may trigger too much synthesis energy */ - E_LPC_f_lsp_a_conversion( lsp_new, Aq_tmp, M ); enr_new = Enr_1_Az_fx( Aq_tmp, 2 * L_SUBFR ); diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index c04ee9dc5..b638a36e5 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -556,11 +556,7 @@ void decoder_LPD_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES int_lsp4_ivas_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); -#else - int_lsp4_fx( L_frame, &lsp[0], lspmid, &lsp[M], Aq, M, st->relax_prev_lsf_interp ); -#endif } ELSE { diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index ad89ca556..9c366e3f3 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -532,27 +532,24 @@ void decoder_acelp_fx( move16(); IF( st->igf != 0 ) { -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, - gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); -#else - prep_tbe_exc_fx( st->L_frame, - i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, - gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate ); -#endif + prep_tbe_exc_fx( st->L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, st->voice_fac, &voice_factors[idx], bwe_exc, + gain_preQ, code_preQ, st->Q_exc, T0, T0_frac, st->coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, 0 ); } /*---------------------------------------------------------* * Enhance the excitation * *---------------------------------------------------------*/ + E_UTIL_enhancer( st->voice_fac, stab_fac, st->past_gcode, gain_inov, &( st->gc_threshold_fx ), code, &exc2[i_subfr], gain_pit, &st->dm_fx.prev_gain_code, st->dm_fx.prev_gain_pit, &st->dm_fx.prev_state, st->coder_type, acelp_cfg.fixed_cdk_index[idx], L_SUBFR, st->L_frame, st->Q_exc ); } /* !RF_NELP frame partial copy */ + /*----------------------------------------------------------* * - compute the synthesis speech * *----------------------------------------------------------*/ + rescale_mem( &st->Q_exc, &prev_Q_syn, &st->Q_syn, mem_syn, syn, M, i_subfr ); E_UTIL_synthesis( sub( st->Q_exc, st->Q_syn ), p_A, &exc2[i_subfr], &syn[i_subfr], L_SUBFR, mem_syn, 1, M ); @@ -678,16 +675,11 @@ void decoder_acelp_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES - FEC_scale_syn_ivas_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, syn, pBuf_scaleSyn, st->enr_old_fx, 0, - st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, force_scale_syn ); -#else FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, syn, pBuf_scaleSyn, st->enr_old_fx, 0, st->coder_type, LSF_Q_prediction, &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, avoid_lpc_burst_on_recovery, force_scale_syn ); -#endif + exc, exc2, A, &( st->old_enr_LP ), mem_back, mem_syn, st->Q_exc, st->Q_syn, EVS_MONO, avoid_lpc_burst_on_recovery, force_scale_syn ); } + /* update ACELP synthesis memory */ Copy( mem_syn, st->mem_syn2_fx, M ); Copy( syn + st->L_frame - L_SYN_MEM, st->mem_syn_r, L_SYN_MEM ); diff --git a/lib_dec/dec_amr_wb_fx.c b/lib_dec/dec_amr_wb_fx.c index b03b6d69c..500fe34ba 100644 --- a/lib_dec/dec_amr_wb_fx.c +++ b/lib_dec/dec_amr_wb_fx.c @@ -71,11 +71,7 @@ void decod_amr_wb_fx( * Decode pitch lag *----------------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); -#else - *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR ); -#endif + *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 1, L_FRAME, i_subfr, -1, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, L_SUBFR, 0, NULL ); /*--------------------------------------------------------------* * Find the adaptive codebook vector diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 7411d59f2..3e42d9535 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -18,8 +18,7 @@ /*----------------------------------------------------------------------*/ /* GLOBAL INPUT ARGUMENTS : */ /* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ - +/* _ (Word16) L_frame : length of the frame */ /* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ /* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ /* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ @@ -29,503 +28,30 @@ /* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ /* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /*----------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------*/ /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES ivas_error decod_gen_voic_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient Q12 */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6 */ - Word16 *voice_factors_fx, /* o : voicing factors Q15 */ - Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf /*Q14*/ -) -{ - - - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx = 0; /* pitch gain Q14 */ - move16(); - Word32 gain_code_fx = 0; /* gain/normalized gain of the algebraic excitation Q16 */ - move32(); - Word32 norm_gain_code_fx = 0; /* normalized gain of the algebraic excitation Q16 */ - move32(); - Word16 gain_inov_fx = 0; /* Innovation gain Q12 */ - move16(); - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ - Word16 voice_fac_fx; /* voicing factor Q15 */ - Word16 code_fx[L_SUBFR]; /* algebraic codevector Q12 */ - - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to floating pitch Q6 */ - Word16 i_subfr_fx, i; /* tmp variables */ - Word16 error_fx = 0; - move16(); - Word16 gain_preQ_fx = 0; /* Gain of prequantizer excitation */ - move16(); - Word16 code_preQ_fx[L_SUBFR]; /* Prequantizer excitation */ - Word32 norm_gain_preQ_fx; - Word16 pitch_limit_flag_fx; - - Word16 tmp1_fx, gain_code16; - Word32 L_tmp_GC; - Word32 L_tmp; - - Word16 harm_flag_acelp; - - Word16 shft_prev, ph_offset_fx; - Word32 prev_res_nrg; - Word32 prev_spch_nrg; - Word32 curr_res_nrg; - Word32 curr_spch_nrg; - Word16 rint_bfi_pitch, rint_pitch; - Word16 fraca, fracb, expa, expb, scale, exp1; - Word16 *p_exc; - Word16 mem_tmp_fx[M]; - Word16 syn_tmp_fx[L_FRAME16k]; - Word16 shft_curr; - Word16 *p_syn; - Word16 sp_enratio, Qsp_enratio; - Word16 enratio, Qenratio; - DTFS_STRUCTURE *PREVP, *CURRP; - Word16 S_fx[PIT_MAX * 4 + 1], C_fx[PIT_MAX * 4 + 1]; - Word16 dummy2[2]; - Word16 out_fx[L_FRAME16k]; - - Word16 pf_temp1[MAXLAG_WI]; /*may not need more than MAXLAG_WI/2+1 */ - Word16 pf_temp2[MAXLAG_WI]; - Word16 pf_temp[MAXLAG_WI]; - Word16 pf_n2[MAXLAG_WI]; - MUSIC_POSTFILT_HANDLE hMusicPF; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif - - hMusicPF = st_fx->hMusicPF; - - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - ivas_error error; - - error = IVAS_ERR_OK; - move32(); - - T0_fx = PIT_MIN; - move16(); - T0_frac_fx = 0; - move16(); - - /* read harmonicity flag */ - harm_flag_acelp = 0; - move16(); - test(); - test(); - IF( ( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && LE_32( st_fx->core_brate, MAX_BRATE_AVQ_EXC_TD ) ) && EQ_16( st_fx->coder_type, GENERIC ) ) - { - harm_flag_acelp = (Word16) get_next_indice( st_fx, 1 ); - } - - /*------------------------------------------------------------------* - * ACELP subframe loop - *------------------------------------------------------------------*/ - - p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ - norm_gain_preQ_fx = 0; - move32(); - gain_preQ_fx = 0; - move16(); - set16_fx( code_preQ_fx, 0, L_SUBFR ); - - FOR( i_subfr_fx = 0; i_subfr_fx < L_frame; i_subfr_fx += L_SUBFR ) - { - /*----------------------------------------------------------------------* - * Decode pitch lag - *----------------------------------------------------------------------*/ - - *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR ); - move16(); /*Q6*/ - - /*--------------------------------------------------------------* - * Find the adaptive codebook vector - *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - - tbe_celp_exc( L_frame, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx ); - - /*--------------------------------------------------------------* - * LP filtering of the adaptive excitation - *--------------------------------------------------------------*/ - lp_filt_exc_dec_fx( st_fx, MODE1, i_subfr_fx, L_SUBFR, L_frame, st_fx->acelp_cfg.ltf_mode, exc_fx ); - /*-----------------------------------------------------------------* - * Transform-domain contribution decoding (active frames) - *-----------------------------------------------------------------*/ - - test(); - IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) && ( st_fx->coder_type != INACTIVE ) ) - { - gain_code_fx = 0; - move16(); - transf_cdbk_dec_fx( st_fx, harm_flag_acelp, i_subfr_fx, Es_pred_fx, gain_code_fx, &gain_preQ_fx, &norm_gain_preQ_fx, code_preQ_fx, unbits ); - } - - /*--------------------------------------------------------------* - * Innovation decoding - *--------------------------------------------------------------*/ - - inov_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, sharpFlag_fx, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_SUBFR ); - - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) - { - gain_dec_lbr_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); - } - ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) - { - gain_dec_SQ_fx( st_fx, i_subfr_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - } - ELSE - { - gain_dec_mless_fx( st_fx, L_frame, st_fx->coder_type, i_subfr_fx, -1, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - } - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, st_fx->Q_exc ); // Q15 - move16(); - - /*-----------------------------------------------------------------* - * Transform domain contribution decoding - *-----------------------------------------------------------------*/ - test(); - IF( GE_32( st_fx->core_brate, MAX_GSC_INACTIVE_BRATE ) && ( st_fx->coder_type == INACTIVE ) ) - { - transf_cdbk_dec_fx( st_fx, harm_flag_acelp, i_subfr_fx, Es_pred_fx, gain_code_fx, &gain_preQ_fx, &norm_gain_preQ_fx, code_preQ_fx, unbits ); - } - - /* update LP filtered gains for the case of frame erasures */ - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); - - /*----------------------------------------------------------------------* - * Find the total excitation - *----------------------------------------------------------------------*/ - - IF( EQ_16( L_frame, L_FRAME ) ) /* Rescaling for 12.8k core */ - { - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[i_subfr_fx * HIBND_ACB_L_FAC], hGSCDec->last_exc_dct_in_fx, - L_SUBFR, L_SUBFR * HIBND_ACB_L_FAC, gain_code_fx, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, i_subfr_fx, st_fx->coder_type ); - } - ELSE /* Rescaling for 16k core */ - { - - L_tmp_GC = L_max( gain_code_fx, L_shl( gain_preQ_fx, 16 ) ); /* Chose the maximum of gain_code or the prequantizer excitation x4 to keep some room*/ - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[i_subfr_fx * 2], hGSCDec->last_exc_dct_in_fx, - L_SUBFR, L_SUBFR * 2, L_tmp_GC, &( st_fx->Q_exc ), st_fx->Q_subfr, exc2_fx, i_subfr_fx, st_fx->coder_type ); - } - - gain_code16 = round_fx( L_shl( gain_code_fx, st_fx->Q_exc ) ); /*Q_exc*/ - - /*-----------------------------------------------------------------* - * Add the ACELP pre-quantizer contribution - *-----------------------------------------------------------------*/ - - IF( gain_preQ_fx != 0 ) - { - IF( st_fx->element_mode == EVS_MONO ) - { - tmp1_fx = add( 15 - Q_AVQ_OUT_DEC - 2, st_fx->Q_exc ); - } - ELSE - { - tmp1_fx = add( 15 - Q_AVQ_OUT - 2, st_fx->Q_exc ); - } - FOR( i = 0; i < L_SUBFR; i++ ) - { - Word32 Ltmp1; - /* Contribution from AVQ layer */ - Ltmp1 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /* Q2 + Q6 -> Q9*/ - Ltmp1 = L_shl_sat( Ltmp1, tmp1_fx ); /* Q16 + Q_exc */ - - /* Compute exc2 */ - L_tmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); // Q_exc+Q14+1+1 - exc2_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( L_tmp, Ltmp1 ) ); // Q_exc - move16(); - /* gain_pit in Q14 */ - L_tmp = L_mult( gain_code16, code_fx[i] ); // Q_exc+Q9+1 - L_tmp = L_shl_sat( L_tmp, 5 ); // Q_exc+Q9+1+5 - L_tmp = L_mac_sat( L_tmp, exc_fx[i + i_subfr_fx], gain_pit_fx ); // Q_exc+Q15 +1 - L_tmp = L_shl_sat( L_tmp, 1 ); /* saturation can occur here */ - - exc_fx[i + i_subfr_fx] = round_fx_sat( L_add_sat( L_tmp, Ltmp1 ) ); // Q_exc - move16(); - } - } - ELSE - { - Acelp_dec_total_exc( exc_fx, exc2_fx, gain_code16, gain_pit_fx, i_subfr_fx, code_fx, L_SUBFR ); - } - - /*-----------------------------------------------------------------* - * Prepare TBE excitation - *-----------------------------------------------------------------*/ - - Word16 idx = 0; - move16(); - IF( i_subfr_fx != 0 ) - { - idx = idiv1616( i_subfr_fx, L_SUBFR ); - } - - prep_tbe_exc_fx( L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate ); - - - /*----------------------------------------------------------------* - * Excitation enhancements (update of total excitation signal) - *----------------------------------------------------------------*/ - - test(); - IF( GT_32( st_fx->core_brate, ACELP_32k ) || ( st_fx->coder_type == INACTIVE ) ) - { - Copy( exc_fx + i_subfr_fx, exc2_fx + i_subfr_fx, L_SUBFR ); - } - ELSE - { - enhancer_fx( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); - } - - p_Aq_fx += ( M + 1 ); - pt_pitch_fx++; - gain_buf[idx] = gain_pit_fx; // Q14 - move16(); - } - - /* FEC fast recovery */ - - IF( do_WI_fx ) - { - /* shft_prev = L_EXC_MEM - rint_new_fx(st_fx->bfi_pitch_fx);*/ - L_tmp = L_shl( L_deposit_l( st_fx->bfi_pitch_fx ), 10 ); /*Q16*/ - rint_bfi_pitch = rint_new_fx( L_tmp ); /*Q0*/ - shft_prev = sub( L_EXC_MEM, rint_bfi_pitch ); /*Q0*/ - - p_exc = st_fx->hWIDec->old_exc2_fx + shft_prev; - p_syn = st_fx->hWIDec->old_syn2_fx + shft_prev; - move16(); - move16(); - - prev_res_nrg = L_deposit_l( 1 ); - prev_spch_nrg = L_deposit_l( 1 ); - FOR( i = 0; i < rint_bfi_pitch; i++ ) - { - prev_res_nrg = L_mac0_sat( prev_res_nrg, *p_exc, *p_exc ); /* 2*st_fx->prev_Q_exc_fr */ - prev_spch_nrg = L_mac0_sat( prev_spch_nrg, *p_syn, *p_syn ); /* 2*st_fx->prev_Q_syn_fr */ - p_exc++; - p_syn++; - } - - Copy( st_fx->mem_syn2_fx, mem_tmp_fx, M ); - - syn_12k8_fx( st_fx->L_frame, Aq_fx, exc2_fx, syn_tmp_fx, mem_tmp_fx, 1, st_fx->Q_exc, st_fx->Q_syn ); - - L_tmp = L_shl( L_deposit_l( pitch_buf_fx[NB_SUBFR16k - 1] ), 10 ); /*Q16*/ - rint_pitch = rint_new_fx( L_tmp ); /*Q0*/ - shft_curr = sub( st_fx->L_frame, rint_pitch ); /*Q0*/ - - p_exc = exc2_fx + shft_curr; - p_syn = syn_tmp_fx + shft_curr; - - curr_res_nrg = L_deposit_l( 1 ); - curr_spch_nrg = L_deposit_l( 1 ); - FOR( i = 0; i < rint_pitch; i++ ) - { - curr_res_nrg = L_mac0_sat( curr_res_nrg, *p_exc, *p_exc ); /* 2*st_fx->Q_exc */ - curr_spch_nrg = L_mac0_sat( curr_spch_nrg, *p_syn, *p_syn ); /* 2*st_fx->Q_syn */ - p_exc++; - p_syn++; - } - - /* enratio = (curr_res_nrg / prev_res_nrg); */ - IF( prev_res_nrg > 0 ) - { - expa = norm_l( prev_res_nrg ); - fraca = extract_h( L_shl( prev_res_nrg, expa ) ); /* 2*st_fx->prev_Q_exc_fr -16+expa +1*/ - expa = sub( 30, add( expa, ( shl( st_fx->prev_Q_exc_fr, 1 ) ) ) ); - - expb = norm_l( curr_res_nrg ); - fracb = round_fx_sat( L_shl_sat( curr_res_nrg, expb ) ); /* 2*st_fx->Q_exc +expb+1 -16*/ - expb = sub( 30, add( expb, shl( st_fx->Q_exc, 1 ) ) ); - - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl( fracb, scale ); // Q(15-expb)+scale - expb = sub( expb, scale ); - - enratio = div_s( fracb, fraca ); // Q(15-(expb-expa)) - exp1 = sub( expb, expa ); - Qenratio = sub( 15, exp1 ); - } - ELSE - { - enratio = 0; - move16(); - Qenratio = 0; - move16(); - } - - /* sp_enratio = curr_spch_nrg/prev_spch_nrg */ - IF( prev_spch_nrg > 0 ) - { - expa = norm_l( prev_spch_nrg ); - fraca = extract_h( L_shl( prev_spch_nrg, expa ) ); /* 2*st_fx->prev_Q_syn_fr +expa+1-16*/ - expa = sub( 30, add( expa, shl( st_fx->prev_Q_syn_fr, 1 ) ) ); - - expb = norm_l( curr_spch_nrg ); - fracb = round_fx_sat( L_shl_sat( curr_spch_nrg, expb ) ); /* 2*st_fx->Q_syn +expb-16 */ - expb = sub( 30, add( expb, shl( st_fx->Q_syn, 1 ) ) ); - - scale = shr( sub( fraca, fracb ), 15 ); - fracb = shl( fracb, scale ); // Q(15-expb) +scale - expb = sub( expb, scale ); - - sp_enratio = div_s( fracb, fraca ); // Q(15-(expb-expa)) - exp1 = sub( expb, expa ); - Qsp_enratio = sub( 15, exp1 ); - } - ELSE - { - sp_enratio = 0; - move16(); - Qsp_enratio = 0; - move16(); - } - - test(); - test(); - test(); - test(); - IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( shl_ro( sp_enratio, sub( 15, Qsp_enratio ), &Overflow ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[NB_SUBFR16k - 1], 9600 ) ) /*Q6*/ - { - IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( NE_32( ( error = DTFS_new_fx( &CURRP ) ), IVAS_ERR_OK ) ) - { - return error; - } - - GetSinCosTab_fx( rint_bfi_pitch, S_fx, C_fx ); - DTFS_to_fs_fx( st_fx->hWIDec->old_exc2_fx + shft_prev, rint_bfi_pitch, PREVP, (Word16) st_fx->output_Fs, do_WI_fx, S_fx, C_fx ); - PREVP->Q = add( PREVP->Q, st_fx->prev_Q_exc_fr ); - move16(); - - GetSinCosTab_fx( rint_pitch, S_fx, C_fx ); - DTFS_to_fs_fx( exc2_fx + shft_curr, rint_pitch, CURRP, (Word16) st_fx->output_Fs, do_WI_fx, S_fx, C_fx ); - CURRP->Q = add( CURRP->Q, st_fx->Q_exc ); - move16(); - - ph_offset_fx = 0; - move16(); - IF( NE_32( ( error = WIsyn_fx( *PREVP, CURRP, dummy2, &( ph_offset_fx ), out_fx, (Word16) st_fx->L_frame, 1, S_fx, C_fx, pf_temp1, pf_temp2, pf_temp, pf_n2 ) ), IVAS_ERR_OK ) ) - { - return error; - } - - - Copy_Scale_sig( out_fx, exc2_fx, st_fx->L_frame, st_fx->Q_exc ); // Q_exc - Copy_Scale_sig( out_fx, exc_fx, st_fx->L_frame, st_fx->Q_exc ); // Q_exc - - /* update bwe_exc for SWB-TBE */ - FOR( i_subfr_fx = 0; i_subfr_fx < L_frame; i_subfr_fx += L_SUBFR ) - { - interp_code_4over2_fx( exc_fx + i_subfr_fx, bwe_exc_fx + shl( i_subfr_fx, 1 ), L_SUBFR ); - } - - free( PREVP ); - free( CURRP ); - } - } - - /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = gain_pit_fx; - move16(); /*Q14*/ - st_fx->prev_tilt_code_dec_fx = st_fx->tilt_code_fx; - move16(); /*Q15*/ - - return error; -} - -/*======================================================================*/ -/* FUNCTION : decod_gen_voic_ivas_fx() */ -/*----------------------------------------------------------------------*/ -/* PURPOSE : Decode generic (GC), voiced (VC) and AMR-WB IO frames */ -/* */ -/*----------------------------------------------------------------------*/ -/* GLOBAL INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ - -/* _ (Word16[]) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) Es_pred_fx : predicted scaled innov. energy Q8 */ -/* _ (Word16[]) pitch_buf_fx : floating pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ -/*----------------------------------------------------------------------*/ - - -/*----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*======================================================================*/ -#endif -ivas_error decod_gen_voic_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 L_frame, /* i : length of the frame */ - const Word16 sharpFlag_fx, /* i : formant sharpening flag */ - const Word16 *Aq_fx, /* i : LP filter coefficient Q12*/ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ - const Word16 do_WI_fx, /* i : do interpolation after a FER */ - Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15 */ - Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ - Word16 *unbits, /* number of unused bits */ - Word16 *gain_buf, - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 L_frame, /* i : length of the frame */ + const Word16 sharpFlag_fx, /* i : formant sharpening flag */ + const Word16 *Aq_fx, /* i : LP filter coefficient Q12 */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy Q8 */ + const Word16 do_WI_fx, /* i : do interpolation after a FER */ + Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe Q6 */ + Word16 *voice_factors_fx, /* o : voicing factors Q15 */ + Word16 *exc_fx, /* i/o: adapt. excitation exc Q_exc */ + Word16 *exc2_fx, /* i/o: adapt. excitation/total exc Q_exc */ + Word16 *bwe_exc_fx, /* o : excitation for SWB TBE Q_exc */ + Word16 *unbits, /* number of unused bits */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14 */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ ) { - - - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ + Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ Word16 gain_pit_fx; /* pitch gain Q14 */ Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ @@ -536,7 +62,7 @@ ivas_error decod_gen_voic_ivas_fx( Word16 code_fx[L_SUBFR]; /* algebraic codevector Q12 */ const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ + Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ Word16 i_subfr_fx, i; /* tmp variables */ Word16 error_fx; Word16 gain_preQ_fx; /* Gain of prequantizer excitation */ @@ -633,10 +159,8 @@ ivas_error decod_gen_voic_ivas_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - /**pt_pitch_fx = pit_decode_fx(st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR);*/ - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, - &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + *pt_pitch_fx = pit_decode_fx( st_fx, st_fx->core_brate, 0, L_frame, i_subfr_fx, st_fx->coder_type, &pitch_limit_flag_fx, + &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); move16(); /*Q6*/ /*--------------------------------------------------------------* @@ -677,7 +201,7 @@ ivas_error decod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { - gain_dec_lbr_ivas_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); + gain_dec_lbr_fx( st_fx, st_fx->coder_type, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_SUBFR ); } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { @@ -700,13 +224,11 @@ ivas_error decod_gen_voic_ivas_fx( } /* update LP filtered gains for the case of frame erasures */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); } ELSE -#endif { lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, L_add( norm_gain_code_fx, norm_gain_preQ_fx ), &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_frame ); } @@ -790,10 +312,6 @@ ivas_error decod_gen_voic_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - /*prep_tbe_exc_fx(L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate);*/ - Word16 idx; idx = 0; move16(); @@ -802,10 +320,10 @@ ivas_error decod_gen_voic_ivas_fx( idx = idiv1616( i_subfr_fx, L_SUBFR ); } - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[idx], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, + st_fx->Q_exc, T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*----------------------------------------------------------------* @@ -819,14 +337,12 @@ ivas_error decod_gen_voic_ivas_fx( } ELSE { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { enhancer_fx( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); } ELSE -#endif { enhancer_ivas_fx2( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index fe7d2daaf..a18029cdc 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -14,13 +14,13 @@ /*--------------------------------------------------------------------------*/ /* INPUT ARGUMENTS : */ /* _ (Word16*) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ +/* _ (Word16) coder_type : coding type Q0 */ /* _ (Word16) nb_subfr_fx :Number of subframe considered */ /* _ (Word16) Es_pred_fx :predicted scaled innov. energy */ /*--------------------------------------------------------------------------*/ /* OUTPUT ARGUMENTS : */ /* _ (Word16*) pitch_buf_fx : floating pitch values for each subframe Q6 */ -/* _ (Word16*) code_fx : innovation Q12 */ +/* _ (Word16*) code_fx : innovation Q12 */ /*--------------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ /* Decoder_State_fx *st_fx : decoder state structure */ @@ -30,438 +30,29 @@ /* _ None */ /*==========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void dec_pit_exc_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* i : LP filter coefficient */ - const Word16 coder_type, /* i : coding type */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe */ - Word16 *code_fx, /* o : innovation */ - Word16 *exc_fx, /* i/o: adapt. excitation exc */ - Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ - const Word16 nb_subfr_fx /* i : Number of subframe considered */ - , - Word16 *gain_buf /*Q14*/ -) -{ - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx; /* pitch gain Q14 */ - Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ - Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ - Word16 gain_inov_fx; /* Innovation gain Q12 */ - Word16 voice_fac_fx; /* voicing factor Q15 */ - Word16 L_subfr_fx, pit_idx_fx; - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ - Word16 *pt_pitch_fx; /* pointer to floating pitch Q6 */ - Word16 i_subfr_fx, i; /* tmp variables */ - Word32 Local_BR_fx, Pitch_BR_fx; - Word16 pitch_limit_flag, Pitch_CT_fx; - Word16 exc2_bidon[L_SUBFR]; - Word16 *pt_gain; /* Pointer to floating gain values for each subframe */ - - Word16 gain_code16, gain_pitx2; - Word32 L_tmp; - Word16 nbits; - GSC_DEC_HANDLE hGSCDec; - gain_pit_fx = 0; - move16(); - hGSCDec = st_fx->hGSCDec; - - MUSIC_POSTFILT_HANDLE hMusicPF; - hMusicPF = st_fx->hMusicPF; - - Word16 use_fcb; - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move16(); -#endif - - use_fcb = 0; - move16(); - test(); - test(); - IF( ( st_fx->GSC_IVAS_mode > 0 ) && ( EQ_16( st_fx->GSC_noisy_speech, 1 ) || GT_32( st_fx->core_brate, GSC_H_RATE_STG ) ) ) - { - Local_BR_fx = ACELP_8k00; - Pitch_CT_fx = GENERIC; - Pitch_BR_fx = ACELP_8k00; - move32(); - move32(); - move16(); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Local_BR_fx = ACELP_14k80; - move32(); - if ( st_fx->GSC_IVAS_mode > 0 ) - { - Local_BR_fx = ACELP_9k60; - move32(); - } - Pitch_BR_fx = st_fx->core_brate; - move32(); - } - } - ELSE IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) ) - { - Local_BR_fx = ACELP_7k20; - move32(); - Pitch_CT_fx = GENERIC; - move16(); - Pitch_BR_fx = ACELP_7k20; - move32(); - if ( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Pitch_BR_fx = st_fx->core_brate; - move32(); - } - } - ELSE - { - Local_BR_fx = ACELP_7k20; - move32(); - Pitch_CT_fx = AUDIO; - move16(); - Pitch_BR_fx = st_fx->core_brate; - move32(); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - Pitch_BR_fx = ACELP_13k20; - move32(); - Pitch_CT_fx = GENERIC; - move16(); - } - } - L_subfr_fx = mult_r( st_fx->L_frame, div_s( 1, nb_subfr_fx ) ); /* TV2Opt : this could be less complex with 2 ifs*/ - - - gain_code_fx = 0; - move16(); - pitch_limit_flag = 1; - move16(); /* always extended pitch Q range */ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( ( GE_32( st_fx->core_brate, MIN_RATE_FCB ) || ( EQ_16( st_fx->GSC_noisy_speech, 1 ) && ( ( EQ_16( st_fx->L_frame, L_FRAME ) && GE_32( st_fx->core_brate, ACELP_13k20 ) ) || ( EQ_16( st_fx->L_frame, L_FRAME16k ) && GE_32( st_fx->core_brate, GSC_H_RATE_STG ) ) || st_fx->GSC_IVAS_mode == 0 ) ) ) && EQ_16( L_subfr_fx, L_SUBFR ) ) ) - { - use_fcb = 1; - move16(); - } - ELSE IF( ( st_fx->GSC_IVAS_mode > 0 ) && EQ_16( L_subfr_fx, 2 * L_SUBFR ) && LT_16( st_fx->GSC_IVAS_mode, 3 ) ) - { - use_fcb = 2; - st_fx->acelp_cfg.fcb_mode = 1; - move16(); - move16(); - set16_fx( st_fx->acelp_cfg.gains_mode, 6, 4 ); - set16_fx( st_fx->acelp_cfg.pitch_bits, 9, 4 ); - set16_fx( st_fx->acelp_cfg.fixed_cdk_index, 14, 5 ); - } - /*------------------------------------------------------------------* - * ACELP subframe loop - *------------------------------------------------------------------*/ - p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ - pt_gain = gain_buf; /* pointer to the gain buffer */ - FOR( i_subfr_fx = 0; i_subfr_fx < st_fx->L_frame; i_subfr_fx += L_subfr_fx ) - { - /*----------------------------------------------------------------------* - * Decode pitch lag - *----------------------------------------------------------------------*/ - *pt_pitch_fx = pit_decode_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx ); - move16(); - - /*--------------------------------------------------------------* - * Find the adaptive codebook vector. - *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - - /*--------------------------------------------------------------* - * Innovation decoding - *--------------------------------------------------------------*/ - - IF( EQ_16( use_fcb, 1 ) ) - { - inov_decode_fx( st_fx, Local_BR_fx, 0, st_fx->L_frame, 1, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_subfr_fx ); - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - gain_dec_mless_fx( st_fx, st_fx->L_frame, LOCAL_CT, i_subfr_fx, -1, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx ); - - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0 ); - move16(); - } - ELSE IF( EQ_16( use_fcb, 2 ) ) /* IVAS only */ - { - inov_decode_fx( st_fx, Local_BR_fx, 0, st_fx->L_frame, 1, i_subfr_fx, p_Aq_fx, st_fx->tilt_code_fx, *pt_pitch_fx, code_fx, L_subfr_fx ); - /*--------------------------------------------------------------* - * Gain decoding - * Estimate spectrum tilt and voicing - *--------------------------------------------------------------*/ - - gain_dec_lbr_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); - - st_fx->tilt_code_fx = est_tilt_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0 ); - move16(); - } - ELSE - { - nbits = 5; - move16(); - if ( LT_32( st_fx->core_brate, MIN_RATE_FCB ) ) - { - nbits = 4; - move16(); - } - - set16_fx( code_fx, 0, L_SUBFR ); - gain_code_fx = L_deposit_l( 0 ); - st_fx->tilt_code_fx = 0; - move16(); - pit_idx_fx = (Word16) get_next_indice( st_fx, nbits ); - move16(); - - gain_pit_fx = add( 9590, dic_gp_fx[pit_idx_fx] ); - move16(); /*Q14 0.5853 in Q14 9590*/ - - if ( st_fx->BER_detect ) /* Bitstream is corrupted, use the past pitch gain */ - { - gain_pit_fx = st_fx->lp_gainp_fx; - move16(); - } - gain_code_fx = L_mult0( s_max( sub( 32767, shl_o( gain_pit_fx, 1, &Overflow ) ), 16384 ), st_fx->lp_gainc_fx ); /* Use gain pitch and past gain code as an indicator to help finding the best scaling value. gain_code_fx used a temp var*/ - } - - /*----------------------------------------------------------------------* - * Find the total excitation - *----------------------------------------------------------------------*/ - - Rescale_exc( hMusicPF->dct_post_old_exc_fx, &exc_fx[i_subfr_fx], &bwe_exc_fx[( i_subfr_fx * ( 2 * HIBND_ACB_L_FAC ) ) / 2], hGSCDec->last_exc_dct_in_fx, - L_subfr_fx, shr( imult1616( L_subfr_fx, 2 * HIBND_ACB_L_FAC ), 1 ), gain_code_fx, &( st_fx->Q_exc ), st_fx->Q_subfr, NULL, i_subfr_fx, coder_type ); - - gain_code16 = round_fx( L_shl( gain_code_fx, st_fx->Q_exc ) ); /*Q_exc*/ - - IF( use_fcb != 0 ) - { - Acelp_dec_total_exc( exc_fx, exc2_bidon - i_subfr_fx, gain_code16, gain_pit_fx, i_subfr_fx, code_fx, L_subfr_fx ); - } - ELSE - { - IF( norm_s( s_or( gain_pit_fx, 1 ) ) == 0 ) - { - FOR( i = 0; i < L_subfr_fx; i++ ) - { - L_tmp = L_shl_sat( L_mult( gain_pit_fx, exc_fx[i + i_subfr_fx] ), 1 ); /*Q16+Q_exc*/ - exc_fx[i + i_subfr_fx] = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - } - } - ELSE - { - gain_pitx2 = shl( gain_pit_fx, 1 ); /*Q15*/ - - FOR( i = 0; i < L_subfr_fx; i++ ) - { - L_tmp = L_mult( gain_pitx2, exc_fx[i + i_subfr_fx] ); /*Q16+Q_exc*/ - exc_fx[i + i_subfr_fx] = round_fx_sat( L_tmp ); /*Q_exc*/ - move16(); - } - } - } - - IF( EQ_16( L_subfr_fx, L_FRAME16k ) ) - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = gain_pit_fx; - move16(); - st_fx->lp_gainc_fx = 0; - move32(); - - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - move16(); - move16(); - move16(); - move16(); - p_Aq_fx += 5 * ( M + 1 ); - } - ELSE IF( EQ_16( L_subfr_fx, L_FRAME16k / 2 ) ) - { - IF( i_subfr_fx == 0 ) - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - p_Aq_fx += 2 * ( M + 1 ); - move16(); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 6554, gain_pit_fx ) ); /*Q14 (3/15 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - ELSE - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - pt_pitch_fx++; - p_Aq_fx += 3 * ( M + 1 ); - move16(); - move16(); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 26214, gain_pit_fx ) ); /*Q14 (12/15 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - } - ELSE IF( EQ_16( L_subfr_fx, 128 ) ) /*2*L_SUBFR*/ - { - p_Aq_fx += 2 * ( M + 1 ); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - IF( i_subfr_fx == 0 ) - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 9830, gain_pit_fx ) ); /*Q14 (3/10 in Q15 9830)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - ELSE - { - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = extract_h( L_mult( 22938, gain_pit_fx ) ); /*Q14 (7/10 in Q15 22938)*/ - st_fx->lp_gainc_fx = 0; - move16(); - move16(); - } - } - ELSE IF( EQ_16( L_subfr_fx, 256 ) ) /*4*L_SUBFR*/ - { - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_pitch_fx = *( pt_pitch_fx - 1 ); - move16(); - pt_pitch_fx++; - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - *pt_gain = *( pt_gain - 1 ); - move16(); - pt_gain++; - p_Aq_fx += 4 * ( M + 1 ); - - /* update gains for FEC - equivalent to lp_gain_updt() */ - st_fx->lp_gainp_fx = gain_pit_fx; - move16(); - st_fx->lp_gainc_fx = 0; - move16(); - } - ELSE - { - p_Aq_fx += ( M + 1 ); - move16(); - pt_pitch_fx++; - move16(); - *pt_gain = gain_pit_fx; - move16(); - pt_gain++; - - lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, 0, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, st_fx->L_frame ); - } - } - - return; -} - -/*==========================================================================*/ -/* FUNCTION : void dec_pit_exc_ivas_fx() */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Decode pitch only contribution */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16*) Aq_fx : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) nb_subfr_fx :Number of subframe considered */ -/* _ (Word16) Es_pred_fx :predicted scaled innov. energy */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) pitch_buf_fx : Word16 pitch values for each subframe Q6 */ -/* _ (Word16*) code_fx : innovation */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State_fx *st_fx : decoder state structure */ -/* _ (Word16*) exc_fx : adapt. excitation exc */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==========================================================================*/ -#endif -void dec_pit_exc_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* i : LP filter coefficient */ const Word16 coder_type, /* i : coding type */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe */ + Word16 *pitch_buf_fx, /* o : Word16 pitch values for each subframe */ Word16 *code_fx, /* o : innovation */ Word16 *exc_fx, /* i/o: adapt. excitation exc */ Word16 *bwe_exc_fx, /* o : excitation for SWB TBE */ const Word16 nb_subfr_fx, /* i : Number of subframe considered */ - Word16 *gain_buf, /*Q14*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer */ ) { - Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ - Word16 gain_pit_fx; /* pitch gain Q14 */ - Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ + Word16 T0_fx, T0_frac_fx, T0_min_fx, T0_max_fx; /* integer pitch variables */ + Word16 gain_pit_fx; /* pitch gain Q14 */ + Word32 gain_code_fx; /* gain/normalized gain of the algebraic excitation Q16 */ Word32 norm_gain_code_fx; /* normalized gain of the algebraic excitation Q16 */ - Word16 gain_inov_fx; /* Innovation gain Q12 */ + Word16 gain_inov_fx; /* Innovation gain Q12 */ Word16 voice_fac_fx; /* voicing factor Q15 */ Word16 L_subfr_fx, pit_idx_fx; - const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ + const Word16 *p_Aq_fx; /* Pointer to frame LP coefficient Q12 */ Word16 *pt_pitch_fx; /* pointer to Word16 pitch Q6 */ Word16 i_subfr_fx, i; /* tmp variables */ Word32 Local_BR_fx, Pitch_BR_fx; @@ -578,13 +169,14 @@ void dec_pit_exc_ivas_fx( p_Aq_fx = Aq_fx; /* pointer to interpolated LPC parameters */ pt_pitch_fx = pitch_buf_fx; /* pointer to the pitch buffer */ pt_gain = gain_buf; /* pointer to the gain buffer */ + FOR( i_subfr_fx = 0; i_subfr_fx < st_fx->L_frame; i_subfr_fx += L_subfr_fx ) { /*----------------------------------------------------------------------* * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch_fx = pit_decode_ivas_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + *pt_pitch_fx = pit_decode_fx( st_fx, Pitch_BR_fx, 0, st_fx->L_frame, i_subfr_fx, Pitch_CT_fx, &pitch_limit_flag, &T0_fx, &T0_frac_fx, &T0_min_fx, &T0_max_fx, L_subfr_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); move16(); /*--------------------------------------------------------------* @@ -621,7 +213,7 @@ void dec_pit_exc_ivas_fx( * Estimate spectrum tilt and voicing *--------------------------------------------------------------*/ - gain_dec_lbr_ivas_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); + gain_dec_lbr_fx( st_fx, GENERIC, i_subfr_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, gc_mem, gp_mem, L_subfr_fx ); st_fx->tilt_code_fx = est_tilt_ivas_fx( exc_fx + i_subfr_fx, gain_pit_fx, code_fx, gain_code_fx, &voice_fac_fx, 0, L_subfr_fx, 0 ); move16(); diff --git a/lib_dec/dec_post_fx.c b/lib_dec/dec_post_fx.c index 281281ed6..37d088a8f 100644 --- a/lib_dec/dec_post_fx.c +++ b/lib_dec/dec_post_fx.c @@ -33,10 +33,7 @@ static void calc_st_filt_local_fx( Word16 *apond2, Word16 *apond1, Word16 *parco static void modify_pst_param_fx( const Word16 lp_noise, Word16 *g1, Word16 *g2, const Word16 coder_type, Word16 *gain_factor ); -#ifndef REMOVE_EVS_DUPLICATES static void Dec_formant_postfilt_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); -#endif -static void Dec_formant_postfilt_ivas_fx( PFSTAT_HANDLE hPFstat, Word16 *signal_ptr, Word16 *coeff, Word16 *sig_out, Word16 gamma1, Word16 gamma2 ); static void calc_st_filt_ivas_fx( Word16 *apond2, Word16 *apond1, Word16 *parcor0, Word16 *sig_ltp_ptr, Word16 *mem_zero, const Word16 extl ); @@ -82,7 +79,7 @@ void Init_post_filter_fx( *--------------------------------------------------------------------------*/ void nb_post_filt_fx( const Word16 L_frame, /* i : frame length */ - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *psf_lp_noise, /* i : Long term noise Q8 */ const Word16 tmp_noise, /* i : noise energy Q0 */ Word16 *Synth, /* i : 12k8 synthesis Qsyn */ @@ -257,22 +254,20 @@ static void Dec_postfilt_fx( * Main routine to perform formant post filtering *--------------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES void formant_post_filt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient Q12 */ + Word16 *Aq, /* i : LP filter coefficient Q12 */ Word16 *synth_out, /* i/o: input signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 brate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ + const Word16 L_frame, /* i : frame length */ + const Word32 lp_noise, /* (i) : background noise energy (15Q16) */ + const Word32 brate, /* (i) : bit-rate */ + const Word16 off_flag /* i : off flag */ ) { Word16 i_subfr; Word16 *p_Aq; - Word16 post_G1, post_G2; // Q15 - + Word16 post_G1, post_G2; /*default parameter for noisy speech and high bit-rates*/ IF( EQ_16( L_frame, L_FRAME ) ) @@ -381,134 +376,13 @@ void formant_post_filt_fx( Dec_formant_postfilt_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); p_Aq += ( M + 1 ); } -} -#endif -void formant_post_filt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *synth_in, /* i : 12k8 synthesis */ - Word16 *Aq, /* i : LP filter coefficient Q12 */ - Word16 *synth_out, /* i/o: input signal */ - Word16 L_frame, - Word32 lp_noise, /* (i) : background noise energy (15Q16) */ - Word32 brate, /* (i) : bit-rate */ - const Word16 off_flag /* i : off flag */ -) -{ - Word16 i_subfr; - Word16 *p_Aq; - Word16 post_G1, post_G2; - - - /*default parameter for noisy speech and high bit-rates*/ - IF( EQ_16( L_frame, L_FRAME ) ) - { - post_G2 = 22938 /*0.7f Q15*/; - move16(); - IF( LT_32( lp_noise, LP_NOISE_THRESH ) ) - { - /*Clean speech*/ - IF( LT_32( brate, ACELP_13k20 ) ) - { - /*Low rates*/ - - post_G1 = 26214 /*0.8f Q15*/; - move16(); - } - ELSE IF( LT_32( brate, ACELP_24k40 ) ) - { - /*Low rates*/ - - post_G1 = 24576 /*0.75f Q15*/; - move16(); - } - ELSE - { - post_G1 = 23593 /*0.72f Q15*/; - move16(); - } - } - ELSE /*Noisy speech*/ - { - post_G1 = 22938 /*0.7f Q15*/; - move16(); - if ( LT_32( brate, ACELP_15k85 ) ) - { - /*Low rates*/ - post_G1 = 24576 /*0.75f Q15*/; - move16(); - } - } - } - ELSE - { - post_G2 = 24904 /*0.76f Q15*/; - move16(); - test(); - IF( GE_32( lp_noise, LP_NOISE_THRESH ) ) - { - post_G1 = 24904 /*0.76f Q15*/; - } - ELSE IF( EQ_32( brate, ACELP_13k20 ) ) - { - post_G1 = 26870 /*0.82f Q15*/; - move16(); - } - ELSE IF( EQ_32( brate, ACELP_16k40 ) ) - { - post_G1 = 26214 /*0.80f Q15*/; - move16(); - } - ELSE IF( EQ_32( brate, ACELP_24k40 ) || EQ_32( brate, ACELP_32k ) ) - { - post_G1 = 25559 /*0.78f Q15*/; - move16(); - } - ELSE - { - post_G1 = 24904 /*0.76f Q15*/; - move16(); - } - } - /* Switch off post-filter */ - if ( off_flag != 0 ) - { - post_G1 = post_G2; - move16(); - } - - /* Reset post filter */ - IF( hPFstat->reset != 0 ) - { - post_G1 = MAX16B; - move16(); - post_G2 = MAX16B; - move16(); - hPFstat->reset = 0; - move16(); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_stp, L_SYN_MEM ); - hPFstat->gain_prec = 16384; // 1.Q14 - move16(); - Copy( synth_in, synth_out, L_frame ); - - return; - } + return; +} - /* input memory*/ - Copy( hPFstat->mem_pf_in, synth_in - L_SYN_MEM, L_SYN_MEM ); - Copy( &synth_in[L_frame - L_SYN_MEM], hPFstat->mem_pf_in, L_SYN_MEM ); - move16(); - p_Aq = Aq; // Q12 - FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += L_SUBFR ) - { - Dec_formant_postfilt_ivas_fx( hPFstat, &synth_in[i_subfr], p_Aq, &synth_out[i_subfr], post_G1, post_G2 ); - p_Aq += ( M + 1 ); - } -} /*---------------------------------------------------------------------------- - * Dec_formant_postfilt_fx + * Dec_formant_postfilt_fx() * * Post - adaptive postfilter main function * Short term postfilter : @@ -522,93 +396,14 @@ void formant_post_filt_ivas_fx( * k1 = 1st parcor calculated on {hi} * gamma3 = gamma3_minus if k1<0, gamma3_plus if k1>0 *----------------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES -static void Dec_formant_postfilt_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ - Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ - Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ -) -{ - /* Local variables and arrays */ - Word16 apond1[M + 1]; /* s.t. denominator coeff. Q12*/ - Word16 apond2[LONG_H_ST]; // Q12 - Word16 res2[L_SUBFR]; // Q14 - Word16 resynth[L_SUBFR + 1]; // Qy - Word16 parcor0; // Q15 - Word16 i, max; - Word16 scale_down; - - /* Compute weighted LPC coefficients */ - weight_a_fx( coeff, apond1, gamma1, M ); - weight_a_fx( coeff, apond2, gamma2, M ); - set16_fx( &apond2[M + 1], 0, LONG_H_ST - ( M + 1 ) ); - max = abs_s( signal_ptr[0] ); // Q14 - FOR( i = 1; i < L_SUBFR; i++ ) - { - max = s_max( max, abs_s( signal_ptr[i] ) ); - } - scale_down = 0; - move16(); - if ( GT_16( max, 16384 /*1.Q14*/ ) ) - { - scale_down = 1; - move16(); - } - - /* Compute A(gamma2) residual */ - IF( !scale_down ) - { - Residu3_fx( apond2, signal_ptr, res2, L_SUBFR, 1 ); - } - ELSE - { - Residu3_fx( apond2, signal_ptr, res2, L_SUBFR, 0 ); - Scale_sig( hPFstat->mem_stp, L_SYN_MEM, -1 ); - } - - /* Controls short term pst filter gain and compute parcor0 */ - calc_st_filt_local_fx( apond2, apond1, &parcor0, res2, hPFstat->mem_zero ); - - /* 1/A(gamma1) filtering, mem_stp is updated */ - resynth[0] = *( hPFstat->mem_stp + sub( L_SYN_MEM, 1 ) ); - move16(); - - E_UTIL_synthesis( 1, apond1, res2, &( resynth[1] ), L_SUBFR, hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - - IF( !scale_down ) - { - Copy( &( resynth[1] ) + L_SUBFR - L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM ); - } - ELSE - { - Copy_Scale_sig( &( resynth[1] ) + L_SUBFR - L_SYN_MEM, hPFstat->mem_stp, L_SYN_MEM, 1 ); - } - - /* Tilt filtering */ - Filt_mu_fx( resynth, sig_out, parcor0, L_SUBFR ); - IF( scale_down ) - { - Scale_sig( sig_out, L_SUBFR, 1 ); - } - - /* Gain control */ - scale_st_fx( signal_ptr, sig_out, &hPFstat->gain_prec, L_SUBFR ); - - - return; -} -#endif -static void Dec_formant_postfilt_ivas_fx( - PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ - Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ - Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ - Word16 *sig_out, /* o : postfiltered output */ - Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ - Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ +static void Dec_formant_postfilt_fx( + PFSTAT_HANDLE hPFstat, /* i : core decoder parameters */ + Word16 *signal_ptr, /* i : input signal (pointer to current subframe Q14*/ + Word16 *coeff, /* i : LPC coefficients for current subframe Q12 */ + Word16 *sig_out, /* o : postfiltered output */ + Word16 gamma1, /* i : short term postfilt. den. weighting factor Q15*/ + Word16 gamma2 /* i : short term postfilt. num. weighting factor Q15*/ ) { /* Local variables and arrays */ diff --git a/lib_dec/dec_ppp_fx.c b/lib_dec/dec_ppp_fx.c index 4849e147a..4b3f4f554 100644 --- a/lib_dec/dec_ppp_fx.c +++ b/lib_dec/dec_ppp_fx.c @@ -6,6 +6,7 @@ #include #include "options.h" /* Compilation switches */ #include "prot_fx.h" /* Function prototypes */ + /*===================================================================*/ /* FUNCTION : void decod_ppp_fx () */ /*-------------------------------------------------------------------*/ @@ -45,20 +46,20 @@ /*-------------------------------------------------------------------*/ /* CALLED FROM : RX */ /*===================================================================*/ + ivas_error decod_ppp_fx( - Decoder_State *st_fx, /* i/o: state structure */ - const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ - Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ - Word16 *exc_fx, /* i/o: current non-enhanced excitation */ - Word16 *exc2_fx, /* i/o: current enhanced excitation */ - Word16 bfi, /* i : bad frame indicator */ - Word16 *gain_buf, + Decoder_State *st_fx, /* i/o: state structure */ + const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ + Word16 *pitch_buf_fx, /* i/o: fixed pitch values for each subframe */ + Word16 *exc_fx, /* i/o: current non-enhanced excitation */ + Word16 *exc2_fx, /* i/o: current enhanced excitation */ + Word16 bfi, /* i : bad frame indicator */ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ Word16 *voice_factors, /* o : voicing factors */ Word16 *bwe_exc_fx /* o : excitation for SWB TBE */ ) { Word16 k; - Word16 LPC_de_curr_fx[M + 1], p_Aq_curr_fx[M], p_Aq_old_fx[M + 1]; Word16 excQ_ppp_fx[L_FRAME], pitch_fx[NB_SUBFR], LPC_de_old_fx[M + 1]; ivas_error error; diff --git a/lib_dec/dec_tran_fx.c b/lib_dec/dec_tran_fx.c index c5b06724a..de3a1ff3f 100644 --- a/lib_dec/dec_tran_fx.c +++ b/lib_dec/dec_tran_fx.c @@ -254,16 +254,10 @@ void decod_tran_fx( tmp_idx_2 = idiv1616( i_subfr, L_SUBFR ); } -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[tmp_idx_2], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, - st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); -#endif + st_fx->Q_exc, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*----------------------------------------------------------------* * Excitation enhancements (update of total excitation signal) diff --git a/lib_dec/dec_uv_fx.c b/lib_dec/dec_uv_fx.c index fcc2600a3..f1ba21979 100644 --- a/lib_dec/dec_uv_fx.c +++ b/lib_dec/dec_uv_fx.c @@ -25,96 +25,7 @@ static void gain_dec_gacelp_uv_fx( * Decode unvoiced (UC) frames *-------------------------------------------------------------------*/ -#ifndef REMOVE_EVS_DUPLICATES void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ - Word16 *gain_buf ) -{ - Word16 gain_pit_fx; /* Quantized pitch gain */ - Word32 gain_code_fx; /* Quantized algebraic codeebook gain */ - Word16 gain_inov_fx; /* inovation gain */ - Word32 norm_gain_code_fx; /* normalized algebraic codeebook gain */ - Word16 voice_fac_fx; /* Voicing factor */ - Word16 code_fx[L_SUBFR]; /* algebraic codevector */ - Word16 i_subfr_fx; - const Word16 *p_Aq_fx; - Word16 *pt_pitch_fx; - - gain_pit_fx = 0; - move16(); - - test(); - IF( EQ_16( st_fx->last_ppp_mode_dec, 1 ) || EQ_16( st_fx->last_nelp_mode_dec, 1 ) ) - { - /* SC_VBR - reset the decoder, to avoid memory not updated issue for this unrealistic case */ - CNG_reset_dec_fx( st_fx, pitch_buf_fx, voice_factors_fx ); - } - - p_Aq_fx = Aq_fx; - move16(); /*Q12*/ /* pointer to interpolated LPC parameters */ - pt_pitch_fx = pitch_buf_fx; - move16(); /* pointer to the pitch buffer */ - - FOR( i_subfr_fx = 0; i_subfr_fx < L_FRAME; i_subfr_fx += L_SUBFR ) - { - /*----------------------------------------------------------------* - * Unvoiced subframe processing - *----------------------------------------------------------------*/ - - gaus_dec_fx( st_fx, i_subfr_fx, code_fx, &norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, &gain_inov_fx, &st_fx->tilt_code_fx, - &voice_fac_fx, &gain_pit_fx, pt_pitch_fx, exc_fx, &gain_code_fx, exc2_fx, bwe_exc_fx, &( st_fx->Q_exc ), st_fx->Q_subfr ); - - *tmp_noise_fx = extract_h( norm_gain_code_fx ); /*Q16*/ - move16(); - - /*----------------------------------------------------------------* - * Excitation enhancements (update of total excitation signal) - *----------------------------------------------------------------*/ - - enhancer_fx( st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); - - Word16 tmp_idx = 0; - move16(); - IF( i_subfr_fx != 0 ) - { - tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); - } - voice_factors_fx[tmp_idx] = 0; - move16(); - - interp_code_5over2_fx( &exc_fx[i_subfr_fx], &bwe_exc_fx[( ( i_subfr_fx * 2 * HIBND_ACB_L_FAC ) >> 1 )], L_SUBFR ); - - p_Aq_fx += ( M + 1 ); - pt_pitch_fx++; - st_fx->tilt_code_dec_fx[tmp_idx] = st_fx->tilt_code_fx; - move16(); - } - - /* SC-VBR */ - st_fx->prev_gain_pit_dec_fx = gain_pit_fx; - move16(); - - set16_fx( gain_buf, 0, NB_SUBFR ); - - return; -} - -/*-------------------------------------------------------------------* - * decod_unvoiced() - * - * Decode unvoiced (UC) frames - *-------------------------------------------------------------------*/ -#endif -void decod_unvoiced_ivas_fx( Decoder_State *st_fx, /* i/o: decoder static memory */ const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ @@ -208,13 +119,11 @@ void decod_unvoiced_ivas_fx( move16(); /* update LP filtered gains for the case of frame erasures */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { lp_gain_updt_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); } ELSE -#endif { lp_gain_updt_ivas_fx( i_subfr_fx, gain_pit_fx, norm_gain_code_fx, &st_fx->lp_gainp_fx, &st_fx->lp_gainc_fx, L_FRAME ); } @@ -250,6 +159,7 @@ void decod_unvoiced_ivas_fx( } // Scale_sig(code_fx, L_SUBFR, 3); //Q12 } + *tmp_noise_fx = extract_h( norm_gain_code_fx ); /*Q16*/ move16(); @@ -257,14 +167,12 @@ void decod_unvoiced_ivas_fx( * Excitation enhancements (update of total excitation signal) *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { enhancer_fx( st_fx->core_brate, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); } ELSE -#endif { enhancer_ivas_fx( MODE1, st_fx->core_brate, uc_two_stage_flag, 0, coder_type, i_subfr_fx, L_FRAME, voice_fac_fx, st_fx->stab_fac_fx, norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx /*Q9/Q12?*/, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); @@ -276,12 +184,6 @@ void decod_unvoiced_ivas_fx( IF( i_subfr_fx != 0 ) { tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); -#ifdef REMOVE_EVS_DUPLICATES - IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) - { - tmp_idx = idiv1616( i_subfr_fx, L_SUBFR ); - } -#endif } voice_factors_fx[tmp_idx] = 0; move16(); diff --git a/lib_dec/evs_dec_fx.c b/lib_dec/evs_dec_fx.c index 38bd7de24..6411eb477 100644 --- a/lib_dec/evs_dec_fx.c +++ b/lib_dec/evs_dec_fx.c @@ -332,11 +332,7 @@ ivas_error evs_dec_fx( IF( EQ_16( st_fx->core, ACELP_CORE ) ) { /* ACELP core decoder */ -#ifdef REMOVE_EVS_DUPLICATES - IF( ( error = acelp_core_dec_ivas_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -#else IF( ( error = acelp_core_dec_fx( st_fx, NULL, synth_fx, NULL, bwe_exc_extended_fx, voice_factors_fx, old_syn_12k8_16k_fx, sharpFlag, pitch_buf_fx, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -957,11 +953,9 @@ ivas_error evs_dec_fx( } st_fx->lp_noise = hFdCngDec->lp_noise; /*Q9.23*/ move32(); -#ifdef REMOVE_EVS_DUPLICATES - ApplyFdCng_ivas_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); -#else - ApplyFdCng_fx( output_sp, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); -#endif + + ApplyFdCng_fx( output_sp, 0, NULL, 0, realBuffer, imagBuffer, &st_fx->scaleFactor.hb_scale, st_fx, concealWholeFrame, 0 ); + /* Generate additional comfort noise to mask potential coding artefacts */ test(); IF( EQ_16( st_fx->m_frame_type, ACTIVE_FRAME ) && st_fx->flag_cna ) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 3fe93854e..cc83eeca3 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -555,463 +555,7 @@ void deleteFdCngDec_fx( HANDLE_FD_CNG_DEC *hFdCngDec ) error */ -#ifndef REMOVE_EVS_DUPLICATES Word16 ApplyFdCng_fx( - Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ - Word16 Q, - Word32 **cldfbBufferReal, /* i/o: real part of the CLDFB buffer cldfbBufferScale*/ - Word32 **cldfbBufferImag, /* i/o: imaginary part of the CLDFB buffer cldfbBufferScale*/ - Word16 *cldfbBufferScale, /* o : pointer to the scalefactor for real and imaginary part of the CLDFB buffer */ - Decoder_State *st, - const Word16 concealWholeFrame, /* i : binary flag indicating frame loss Q0*/ - Word16 is_music /*Q0*/ ) -{ - Word16 j, k, nBins; - Word16 s, s1, s2, num, denom; - Word32 *cngNoiseLevel; - Word16 *cngNoiseLevel_exp; - Word32 L_tmp; - Word16 L_tmp_exp; - Word16 facTab[NPART]; - Word16 facTabExp[NPART]; - Word16 tmp_loop; - Word32 L_c; - Word16 lsp_cng[M]; - HANDLE_FD_CNG_DEC hFdCngDec; - HANDLE_FD_CNG_COM hFdCngCom; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - Flag Carry = 0; - move16(); - move16(); -#endif - - hFdCngDec = st->hFdCngDec; - hFdCngCom = hFdCngDec->hFdCngCom; - - - if ( EQ_16( hFdCngCom->frame_type_previous, ACTIVE_FRAME ) ) - { - hFdCngCom->inactive_frame_counter = 0; - move16(); - } - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - hFdCngDec->flag_dtx_mode = hFdCngDec->flag_dtx_mode || st->first_CNG; - test(); - move16(); - } - cngNoiseLevel = hFdCngCom->cngNoiseLevel; /*Q31 - hFdCngCom->cngNoiseLevelExp*/ - move32(); - cngNoiseLevel_exp = &hFdCngCom->cngNoiseLevelExp; - move16(); - nBins = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - - SWITCH( st->m_frame_type ) - { - case ACTIVE_FRAME: - - /************************** - * ACTIVE_FRAME at DECODER * - **************************/ - - hFdCngCom->inactive_frame_counter = 0; - move16(); - hFdCngCom->sid_frame_counter = 0; - move16(); - - /* set noise estimation inactive during concealment, as no update with noise generated by concealment should be performed. */ - /* set noise estimation inactive during concealment, no update with noise generated by concealment should be performed. */ - - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( - ( concealWholeFrame == 0 ) && - ( LT_16( *timeDomainInput, MAXVAL_WORD16 ) ) && GT_16( *timeDomainInput, MINVAL_WORD16 ) && ( LT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MAXVAL_WORD16 ) ) && GT_16( *( timeDomainInput + sub( hFdCngCom->frameSize, 1 ) ), MINVAL_WORD16 ) && ( ( ( hFdCngDec->flag_dtx_mode == 0 ) && ( st->VAD != 0 ) ) == 0 ) && ( ( ( st->cng_type == LP_CNG ) && ( hFdCngDec->flag_dtx_mode != 0 ) ) == 0 ) && ( is_music == 0 ) && ( st->BER_detect == 0 ) ) - { - /* Perform noise estimation at the decoder */ - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); - - /* Update the shaping parameters */ - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); - } - hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - move16(); - - - /* Update CNG levels */ - test(); - IF( hFdCngDec->flag_dtx_mode != 0 && EQ_16( st->cng_type, FD_CNG ) ) - { - /* This needs to be done only once per inactive phase */ - bandcombinepow( - hFdCngDec->bandNoiseShape, - hFdCngDec->bandNoiseShape_exp, - nBins, - hFdCngCom->part, - hFdCngCom->nFFTpart, - hFdCngCom->psize_inv, - hFdCngDec->partNoiseShape, - &hFdCngDec->partNoiseShape_exp ); - - - j = 0; - move16(); - s2 = -( WORD32_BITS - 1 ); - move16(); - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - assert( hFdCngDec->partNoiseShape[k] >= 0 ); - assert( hFdCngCom->sidNoiseEst[k] >= 0 ); - - /* add DELTA as it is done in FLC version, in order to avoid num > denom */ - facTab[k] = 0; - move16(); - IF( hFdCngDec->partNoiseShape[k] != 0 ) - { - s1 = norm_l( hFdCngCom->sidNoiseEst[k] ); - L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 ); /*Q31 - hFdCngCom->sidNoiseEstExp + s1*/ - L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - L_tmp = L_shr( L_tmp, 1 ); - s = add( L_tmp_exp, 1 ); - num = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - s1 = norm_l( hFdCngDec->partNoiseShape[k] ); - L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 ); /*Q31 - hFdCngDec->partNoiseShape_exp + s1*/ - L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - s = sub( s, L_tmp_exp ); - denom = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - facTab[k] = div_s( num, denom ); /*Q15 - s*/ - move16(); - facTabExp[k] = s; - move16(); - } - /* Set unique exponent, if mantissa is equal to zero */ - if ( facTab[k] == 0 ) - { - facTabExp[k] = -( WORD32_BITS - 1 ); - move16(); - } - s2 = s_max( s2, facTabExp[k] ); - } - - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - s = sub( facTabExp[k], s2 ); - s = s_max( s_min( s, WORD32_BITS - 1 ), -( WORD32_BITS - 1 ) ); - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - move32(); - } - } - - /* adapt scaling for rest of the buffer */ - IF( NE_16( s2, -( WORD32_BITS - 1 ) ) ) - { - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) - { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } - } - - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); - move16(); - } - } - ELSE - { - /* This sets the new CNG levels until a SID update overwrites it */ - test(); - test(); - test(); - IF( !( EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( EQ_16( st->element_mode, IVAS_CPE_TD ) && !hFdCngDec->flag_dtx_mode && !st->VAD ) ) - { - Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, nBins ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; - move16(); - } - } - /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs( L_c, 0, 0 ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ - L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - - L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ - - L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ - - st->cngTDLevel = round_fx_sat( Sqrt32( L_tmp, &L_tmp_exp ) ); /*Q15 - L_tmp_exp*/ - st->cngTDLevel_e = L_tmp_exp; - move16(); - } - ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - IF( hFdCngCom->active_frame_counter > 0 ) - { - /* Perform noise estimation in active frames in the decoder for downward updates */ - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); - } - } - test(); - test(); - L_tmp = 0; - FOR( j = hFdCngCom->startBand; j < hFdCngCom->stopFFTbin; j++ ) - { - L_tmp = L_add( L_tmp, L_shr( cngNoiseLevel[j], 16 ) ); - } - L_tmp_exp = add( *cngNoiseLevel_exp, 16 ); - test(); - test(); - IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( GT_32( L_shl_o( L_tmp, L_tmp_exp, &Overflow ), 21474836 ) /*0.01f Q31*/ ) ) - { - /* update isf cng estimate for concealment. Do that during concealment, in order to avoid addition clean channel complexity*/ - lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0 ); - E_LPC_a_lsp_conversion( hFdCngCom->A_cng, lsp_cng, st->lspold_cng, M ); - Copy( lsp_cng, st->lspold_cng, M ); /*Q15*/ - - lsp2lsf_fx( lsp_cng, st->lsf_cng, M, st->sr_core ); - st->plcBackgroundNoiseUpdated = 1; - move16(); - } - BREAK; - - case SID_FRAME: - - hFdCngDec->flag_dtx_mode = 1; - move16(); - /* no break */ - - case ZERO_FRAME: - - test(); - IF( st != NULL && st->cng_type == LP_CNG ) - { - /* Perform noise estimation on inactive phase at the decoder */ - perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); - /* Update the shaping parameters */ - - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); - } - hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - move16(); - /* This sets the new CNG levels until a SID update overwrites it */ - Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it Q31 - hFdCngDec->bandNoiseShape_exp*/ - *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; - move16(); - /*st->cngTDLevel = (float)sqrt( (sumFLOAT(cngNoiseLevel, hFdCngCom->stopFFTbin - hFdCngCom->startBand) / 2 * hFdCngCom->fftlen) / st->Mode2_L_frame);*/ - tmp_loop = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); - L_tmp = L_deposit_h( 0 ); - L_c = L_deposit_h( 0 ); - FOR( j = 0; j < tmp_loop; j++ ) - { - - Carry = 0; - move16(); - L_tmp = L_add_co( L_tmp, *( cngNoiseLevel + j ), &Carry, &Overflow ); /*Q31*/ - Overflow = 0; - move16(); - - IF( *( cngNoiseLevel + j ) < 0 ) - { - L_c = L_msuNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - IF( *( cngNoiseLevel + j ) >= 0 ) - { - L_c = L_macNs_co( L_c, 0, 0, &Carry, &Overflow ); /*Q-1*/ - } - } - L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); /*Q31 - L_tmp_exp*/ - L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - - L_tmp = Mpy_32_16_1( L_tmp, hFdCngCom->fftlen ); /*Q16 - L_tmp_exp*/ - - L_tmp = Mpy_32_16_1( L_tmp, T_DIV_L_Frame[L_shl( L_mac( -28000, st->L_frame, 95 ), 1 - 15 )] ); /*Q16,exp -7*/ - L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ - L_tmp_exp = add( L_tmp_exp, 31 - 16 ); /*->Q31, L_tmp_exp*/ - - st->cngTDLevel = round_fx_o( Sqrt32( L_tmp, &L_tmp_exp ), &Overflow ); /*Q15 - L_tmp_exp*/ - move16(); - st->cngTDLevel_e = L_tmp_exp; - move16(); - BREAK; - } - hFdCngCom->inactive_frame_counter = add( hFdCngCom->inactive_frame_counter, 1 ); - move16(); - - /************************************* - * SID_FRAME or ZERO_FRAME at DECODER * - *************************************/ - - /* Detect first non-active frame */ - IF( EQ_16( hFdCngCom->inactive_frame_counter, 1 ) ) - { - /* Compute the fine spectral structure of the comfort noise shape using the decoder-side noise estimates */ - bandcombinepow( - hFdCngDec->bandNoiseShape, - hFdCngDec->bandNoiseShape_exp, - nBins, - hFdCngCom->part, - hFdCngCom->nFFTpart, - hFdCngCom->psize_inv, - hFdCngDec->partNoiseShape, - &hFdCngDec->partNoiseShape_exp ); - } - - IF( EQ_16( st->m_frame_type, SID_FRAME ) ) - { - IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) - { - /* At initialization, interpolate the bin/band-wise levels from the partition levels */ - scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); - *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; - move16(); - } - ELSE - { - if ( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - } - - /* Interpolate the CLDFB band levels from the SID (partition) levels */ - IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) - { - scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, - hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); - *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; - move16(); - } - - s2 = -( WORD32_BITS - 1 ); - move16(); - /* Shape the SID noise levels in each FFT bin */ - j = 0; - move16(); - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - assert( hFdCngDec->partNoiseShape[k] >= 0 ); - - /* add DELTA as it is done in FLC version, in order to avoid num > denom */ - facTab[k] = 0; - move16(); - IF( hFdCngDec->partNoiseShape[k] != 0 ) - { - s1 = norm_l( hFdCngCom->sidNoiseEst[k] ); - L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 ); /*Q31 - hFdCngCom->sidNoiseEstExp + s1*/ - L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( hFdCngCom->sidNoiseEst[k], hFdCngCom->sidNoiseEstExp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - L_tmp = L_shr( L_tmp, 1 ); - s = add( L_tmp_exp, 1 ); - num = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - s1 = norm_l( hFdCngDec->partNoiseShape[k] ); - L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 ); /*Q31 - hFdCngDec->partNoiseShape_exp + s1*/ - L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 ); - L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); - s = sub( s, L_tmp_exp ); - denom = extract_h( L_tmp ); /*Q15 - L_tmp_exp*/ - - facTab[k] = div_s( num, denom ); /*Q15 - s*/ - move16(); - facTabExp[k] = s; - move16(); - } - /* Set unique exponent, if mantissa is equal to zero */ - if ( facTab[k] == 0 ) - { - facTabExp[k] = -( WORD32_BITS - 1 ); - move16(); - } - s2 = s_max( s2, facTabExp[k] ); - } - - FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) - { - s = sub( facTabExp[k], s2 ); - s = s_max( s_min( s, WORD32_BITS - 1 ), -( WORD32_BITS - 1 ) ); - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ - move32(); - } - } - /* adapt scaling for rest of the buffer */ - s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); - FOR( ; k < hFdCngCom->npart; k++ ) - { - FOR( ; j <= hFdCngCom->part[k]; j++ ) - { - cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); /*Q31 - hFdCngDec->bandNoiseShape_exp + s*/ - move32(); - } - } - *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); - move16(); - } - } - - IF( EQ_16( st->codec_mode, MODE2 ) ) - { - /* Generate comfort noise during SID or zero frames */ - generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); - } - - BREAK; - - default: - return -1; - } - - - return 0; -} -#endif -Word16 ApplyFdCng_ivas_fx( Word16 *timeDomainInput, /* i : pointer to time domain input Q*/ Word16 Q, Word32 *powerSpectrum, /*Q_power_spectrum*/ @@ -1113,27 +657,22 @@ Word16 ApplyFdCng_ivas_fx( ( !st->BER_detect ) ) { /* Perform noise estimation at the decoder */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); } ELSE -#endif { perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } /* Update the shaping parameters */ test(); -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } - ELSE -#endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + ELSE IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, nBins, hFdCngDec->bandNoiseShape, 1 ); } @@ -1369,13 +908,11 @@ Word16 ApplyFdCng_ivas_fx( IF( hFdCngCom->active_frame_counter > 0 ) { /* Perform noise estimation in active frames in the decoder for downward updates */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); } ELSE -#endif { perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } @@ -1436,44 +973,37 @@ Word16 ApplyFdCng_ivas_fx( IF( st != NULL && EQ_16( st->cng_type, LP_CNG ) ) { /* Perform noise estimation on inactive phase at the decoder */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { perform_noise_estimation_dec_fx( timeDomainInput, Q, hFdCngDec ); } ELSE -#endif { perform_noise_estimation_dec_ivas_fx( timeDomainInput, Q, powerSpectrum, Q_power_spectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); } /* Update the shaping parameters */ - test(); -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } - ELSE -#endif - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) + ELSE IF( NE_16( st->element_mode, IVAS_CPE_TD ) && NE_16( st->element_mode, IVAS_CPE_DFT ) ) { scalebands_fx( hFdCngDec->msNoiseEst, hFdCngDec->part_shaping, hFdCngDec->nFFTpart_shaping, hFdCngDec->midband_shaping, hFdCngDec->nFFTpart_shaping, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), hFdCngDec->bandNoiseShape, 1 ); } hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; move16(); + /* This sets the new CNG levels until a SID update overwrites it */ Copy32( hFdCngDec->bandNoiseShape, cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); /* This sets the new CNG levels until a SID update overwrites it */ /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { *cngNoiseLevel_exp = hFdCngDec->bandNoiseShape_exp; move16(); } ELSE -#endif { Word16 shift1 = L_norm_arr( cngNoiseLevel, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ); Word16 shift2 = L_norm_arr( cngNoiseLevel + sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), sub( FFTCLDFBLEN, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ) ) ); @@ -1554,16 +1084,15 @@ Word16 ApplyFdCng_ivas_fx( IF( LT_32( hFdCngCom->msFrCnt_init_counter, L_deposit_l( hFdCngCom->msFrCnt_init_thresh ) ) ) { /* At initialization, interpolate the bin/band-wise levels from the partition levels */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); } ELSE -#endif { scalebands_fx( hFdCngCom->sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 1 ); } + *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } @@ -1576,13 +1105,11 @@ Word16 ApplyFdCng_ivas_fx( /* Interpolate the CLDFB band levels from the SID (partition) levels */ IF( GT_16( hFdCngCom->regularStopBand, hFdCngCom->numCoreBands ) ) { -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { scalebands( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); } ELSE -#endif { scalebands_fx( sidNoiseEst, hFdCngCom->part, hFdCngCom->npart, hFdCngCom->midband, hFdCngCom->nFFTpart, sub( hFdCngCom->stopBand, hFdCngCom->startBand ), cngNoiseLevel, 0 ); } @@ -1649,7 +1176,6 @@ Word16 ApplyFdCng_ivas_fx( } } -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { /* adapt scaling for rest of the buffer */ @@ -1666,7 +1192,6 @@ Word16 ApplyFdCng_ivas_fx( move16(); } ELSE -#endif { Word16 shift1 = L_norm_arr( cngNoiseLevel, j ); Word16 shift2 = L_norm_arr( &cngNoiseLevel[j], sub( FFTCLDFBLEN, j ) ); @@ -1755,13 +1280,11 @@ Word16 ApplyFdCng_ivas_fx( IF( EQ_16( st->codec_mode, MODE2 ) ) { /* Generate comfort noise during SID or zero frames */ -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_comfort_noise_dec_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); } ELSE -#endif { generate_comfort_noise_dec_ivas_fx( cldfbBufferReal, cldfbBufferImag, cldfbBufferScale, st, &( st->Q_exc ), 2, -1 ); } diff --git a/lib_dec/gain_dec_fx.c b/lib_dec/gain_dec_fx.c index 00eca187d..db325cd80 100644 --- a/lib_dec/gain_dec_fx.c +++ b/lib_dec/gain_dec_fx.c @@ -602,7 +602,6 @@ void gain_dec_mless_fx( /* _ None */ /*==================================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void gain_dec_lbr_fx( Decoder_State *st_fx, /* i/o: decoder state structure */ const Word16 coder_type, /* i : coding type */ @@ -653,375 +652,6 @@ void gain_dec_lbr_fx( ctype = shl( sub( coder_type, 1 ), 1 ); - /*-----------------------------------------------------------------* - * calculate prediction of gcode - * search for the best codeword - *-----------------------------------------------------------------*/ - IF( i_subfr == 0 ) - { - b_fx = b_1sfr_fx; - move16(); - n_pred = 2; - move16(); - cdbk_fx = gp_gamma_1sfr_6b_fx; - SWITCH( nBits ) - { - case 8: - { - cdbk_fx = gp_gamma_1sfr_8b_fx; /* Q14/Q9*/ - BREAK; - } - case 7: - { - cdbk_fx = gp_gamma_1sfr_7b_fx; /* Q14/Q9*/ - BREAK; - } - case 6: - { - cdbk_fx = gp_gamma_1sfr_6b_fx; /* Q14/Q9*/ - BREAK; - } - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); - gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); - gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ - - e_tmp = norm_l( L_tmp2 ); - f_tmp = Log2_norm_lc( L_shl( L_tmp2, e_tmp ) ); /*Q15*/ - e_tmp = sub( expg2, add( 1, e_tmp ) ); - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 12330 ); /* Q13 */ /* 10*log10(2) in Q12*/ - - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 160 ); /*Q13, 20 in Q3*/ - L_tmp = L_sub( L_tmp, L_tmp1 ); /*Q13*/ - - gcode0_fx = round_fx( L_shl( L_tmp, 11 ) ); /* Q8 */ - - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) - * = pow(2, 3.321928*gcode0/20) - * = pow(2, 0.166096*gcode0) - *-----------------------------------------------------------------*/ - - L_tmp = L_mult( gcode0_fx, 21771 ); /* *0.166096 in Q17 -> Q26 */ - L_tmp = L_shr( L_tmp, 10 ); /* From Q26 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - /*index = (Word16)get_indice( st_fx,"gain", i_subfr, ACELP_CORE);move16();*/ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - - *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ - move16(); - - gc_mem[0] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[0] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, L_SUBFR ) || EQ_16( L_subfr, 2 * L_SUBFR ) ) - { - b_fx = b_2sfr_fx; /*Q12*/ - move16(); - n_pred = 4; - move16(); - - cdbk_fx = gp_gamma_1sfr_6b_fx; /*Q14/Q9 */ - SWITCH( nBits ) - { - case 7: - { - cdbk_fx = gp_gamma_2sfr_7b_fx; /* Q14/Q9*/ - BREAK; - } - case 6: - { - cdbk_fx = gp_gamma_2sfr_6b_fx; /* Q14/Q9*/ - BREAK; - } - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux_fx[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[3] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - - *gain_pit_fx = cdbk_fx[index * 2]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ - move16(); - - gc_mem[1] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[1] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - b_fx = b_3sfr_fx; - move16(); - n_pred = 6; - move16(); - - cdbk_fx = gp_gamma_3sfr_6b_fx; /*Q14/Q9 */ - - if ( EQ_16( nBits, 7 ) ) - { - cdbk_fx = gp_gamma_3sfr_7b_fx; /*Q14*/ - // PMT("verify if gp_gamma_3sfr_7b_fx is correct") - } - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux_fx[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[4] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - aux_fx[5] = shr( gp_mem[1], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); - move16(); - - *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /* Q10 -> Q16*/ - move32(); - gc_mem[2] = *gain_code_fx; /*Q16*/ - move32(); - gp_mem[2] = *gain_pit_fx; /*Q14*/ - move16(); - } - ELSE IF( EQ_16( i_subfr, 3 * L_SUBFR ) ) - { - b_fx = b_4sfr_fx; /*Q12*/ - n_pred = 8; - move16(); - - - cdbk_fx = gp_gamma_4sfr_6b_fx; /*Q14*/ -#ifdef IVAS_GAIN_MOD - IF( EQ_16( nBits, 7 ) ) - { - cdbk_fx = gp_gamma_4sfr_7b_fx; - PMT( "verify if gp_gamma_4sfr_7b_fx is correct" ) - } -#endif - - /* calculate predicted gain */ - aux_fx[0] = 4096; /*Q12*/ - move16(); - aux_fx[1] = shl( ctype, 12 ); /*Q12*/ - move16(); - - /*aux[2] = (float)log10(gc_mem[0]); - = log2(gc_mem[0])*log10(2);*/ - e_tmp = norm_l( gc_mem[0] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[0], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[0])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[2] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[3] = (float)log10(gc_mem[1]); - = log2(gc_mem[1])*log10(2);*/ - e_tmp = norm_l( gc_mem[1] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[1], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[1])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[3] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - /*aux[4] = (float)log10(gc_mem[2]); - = log2(gc_mem[2])*log10(2);*/ - e_tmp = norm_l( gc_mem[2] ); - f_tmp = Log2_norm_lc( L_shl( gc_mem[2], e_tmp ) ); /*Q15*/ - e_tmp = sub( sub( 30, e_tmp ), 16 ); /*Q_format(gc_mem[2])=16*/ - L_tmp1 = Mpy_32_16( e_tmp, f_tmp, 9864 ); /* Q16 */ - aux_fx[4] = round_fx( L_shl( L_tmp1, 12 ) ); /* Q12 */ - move16(); - - aux_fx[5] = shr( gp_mem[0], 2 ); /*Q12*/ - move16(); - aux_fx[6] = shr( gp_mem[1], 2 ); /*Q12*/ - move16(); - aux_fx[7] = shr( gp_mem[2], 2 ); /*Q12*/ - move16(); - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, dotp(b, aux, n_pred) - * = pow(2, 3.321928*dotp(b, aux, n_pred) - *-----------------------------------------------------------------*/ - L_tmp = Dot_product( b_fx, aux_fx, n_pred ); /*Q25*/ - L_tmp = Mult_32_16( L_tmp, 27213 ); /* *3.321928 in Q13 -> Q23 */ - L_tmp = L_shr( L_tmp, 7 ); /* From Q23 to Q16 */ - frac = L_Extract_lc( L_tmp, &exp_gcode0 ); /* Extract exponent of gcode0 */ - - gcode0_fx = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 = sub( exp_gcode0, 14 ); - - /* retrieve the codebook index and calculate both gains */ - index = (Word16) get_next_indice_fx( st_fx, nBits ); /*Q0*/ - move16(); - *gain_pit_fx = cdbk_fx[( index * 2 )]; /*Q14*/ - move16(); - - L_tmp = L_mult( cdbk_fx[( ( index * 2 ) + 1 )], gcode0_fx ); /* Q9*Q0 -> Q10 */ - *gain_code_fx = L_shl_sat( L_tmp, add( exp_gcode0, 6 ) ); /*Q16*/ - move32(); - } - - /* *norm_gain_code = *gain_code / *gain_inov; */ - expg = sub( norm_s( *gain_inov_fx ), 1 ); - expg = s_max( expg, 0 ); - - tmp_fx = div_s( shr( 8192, expg ), *gain_inov_fx ); /*Q15*/ - *norm_gain_code_fx = L_shr( Mult_32_16( *gain_code_fx, tmp_fx ), sub( 1, expg ) ); /*Q16*/ - move32(); - - return; -} -#endif -void gain_dec_lbr_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word16 coder_type, /* i : coding type */ - const Word16 i_subfr, /* i : subframe index */ - const Word16 *code_fx, /* i : algebraic excitation Q9 */ - Word16 *gain_pit_fx, /* o : quantized pitch gain Q14*/ - Word32 *gain_code_fx, /* o : quantized codebook gain Q16*/ - Word16 *gain_inov_fx, /* o : gain of the innovation (used for normalization) Q12*/ - Word32 *norm_gain_code_fx, /* o : norm. gain of the codebook excitation Q16*/ - Word32 gc_mem[], /* i/o: gain_code from previous subframes Q16*/ - Word16 gp_mem[], /* i/o: gain_pitch from previous subframes Q14*/ - const Word16 L_subfr /* i : subfr lenght */ -) -{ - Word16 index, nBits, n_pred, ctype; - Word16 gcode0_fx, aux_fx[10]; - Word32 L_tmp, L_tmp1, L_tmp2; - Word16 expg, expg2, e_tmp, exp_gcode0, f_tmp, frac, tmp_fx; - const Word16 *b_fx, *cdbk_fx = 0; - /* Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; - *gain_inov = 1.0f / (float)sqrt(Ecode); */ - Word16 shift_L_subfr; - shift_L_subfr = 6; - move16(); // for *cdbk_fx - move16(); - if ( GT_16( L_subfr, L_SUBFR ) ) - { - shift_L_subfr = add( shift_L_subfr, 1 ); - } - L_tmp = Dot_product12( code_fx, code_fx, L_subfr, &expg ); /*Q31 - expg*/ - expg = sub( expg, add( 18, shift_L_subfr ) ); /* exp: -18 (code in Q9), -6 (/L_SUBFR) */ - - expg2 = expg; - move16(); - L_tmp2 = L_tmp; /* sets to 'L_tmp' in 1 clock */ - move32(); - L_tmp = Isqrt_lc( L_tmp, &expg ); /*Q31 - expg*/ - - *gain_inov_fx = extract_h( L_shl_sat( L_tmp, sub( expg, 3 ) ) ); /* gain_inov in Q12 */ - move16(); - - /*-----------------------------------------------------------------* - * select the codebook, size and number of bits - * set the gains searching range - *-----------------------------------------------------------------*/ - nBits = st_fx->acelp_cfg.gains_mode[shr( i_subfr, shift_L_subfr )]; - move16(); - - ctype = shl( sub( coder_type, 1 ), 1 ); - /*-----------------------------------------------------------------* * calculate prediction of gcode * search for the best codeword @@ -1583,24 +1213,28 @@ void lp_gain_updt_ivas_fx( } /*-------------------------------------------------* - * Gain_dec_gaus_vbr + * gain_dec_gaus_fx() * * Decode gains of purely unvoiced sounds *-------------------------------------------------*/ -Word32 gain_dec_gaus_fx( /* o : quantized codebook gain Q16 */ - Word16 index, /* i : quantization index */ - const Word16 bits, /* i : number of bits to quantize */ - const Word16 lowBound, /* i : lower bound of quantizer (dB) */ - const Word16 topBound, /* i : upper bound of quantizer (dB) */ - const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ - Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ + +/*! r: quantized codebook gain Q16 */ +Word32 gain_dec_gaus_fx( + Word16 index, /* i : quantization index */ + const Word16 bits, /* i : number of bits to quantize */ + const Word16 lowBound, /* i : lower bound of quantizer (dB) */ + const Word16 topBound, /* i : upper bound of quantizer (dB) */ + const Word16 inv_gain_inov, /* o : unscaled innovation gain Q12 */ + Word32 *L_norm_gain_code /* o : gain of normalized gaussian excitation Q16 */ ) { Word16 stepSize, gain, expg, frac, expi, tmp_igi; Word32 L_tmp, L_enr_q, L_gain; Word16 stepSize_Exp; + stepSize_Exp = 14; move16(); + /*------------------------------------------------------------------------------------------* * Quantize linearly the log E *------------------------------------------------------------------------------------------*/ diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index cf0fabc76..70639810c 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -23,7 +23,7 @@ /* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ /*--------------------------------------------------------------------------*/ /* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx : decoder memory structure */ +/* Decoder_State *st_fx : decoder memory structure */ /* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ /* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ /*--------------------------------------------------------------------------*/ @@ -31,439 +31,17 @@ /* _ None */ /*==========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void decod_audio_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : floating pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf /*Q14*/ -) -{ - Word16 tmp_nb_bits_tot, pit_band_idx; - Word16 code[4 * L_SUBFR]; - Word16 Diff_len, nb_subfr, i; - Word16 nb_frame_flg; - Word16 Es_pred = 0; - Word16 Len, max_len; - Word16 gsc_attack_flag; - - Word16 low_pit; - Word16 last_bin; - Word16 nbits; - - Word16 exc_wo_nf[L_FRAME16k]; - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - - - /*---------------------------------------------------------------* - * Initialization - *---------------------------------------------------------------*/ - move16(); // corresponding to initialization of Es_pred - Diff_len = 0; - move16(); - - /* decode GSC attack flag (used to reduce possible pre-echo) */ - gsc_attack_flag = (Word16) get_next_indice_fx( st_fx, 1 ); /* Q0 */ - move16(); - - /* decode GSC SWB speech flag */ - test(); - IF( st_fx->coder_type != INACTIVE && GE_32( st_fx->total_brate, ACELP_13k20 ) ) - { - st_fx->GSC_noisy_speech = (Word16) get_next_indice_fx( st_fx, 1 ); /* Q0 */ - move16(); - } - - /* safety check in case of bit errors */ - test(); - test(); - IF( st_fx->GSC_noisy_speech && LT_16( st_fx->bwidth, SWB ) && st_fx->GSC_IVAS_mode == 0 ) - { - st_fx->BER_detect = 1; /* Q0 */ - move16(); - st_fx->GSC_noisy_speech = 0; /* Q0 */ - move16(); - } - - /* set bit-allocation */ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, 0, 0, st_fx->idchan, st_fx->active_cnt, 0, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); -#endif - - /*---------------------------------------------------------------* - * Decode energy dynamics - *---------------------------------------------------------------*/ - - IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) ) - { - nb_subfr = NB_SUBFR; /* Q0 */ - move16(); - hGSCDec->cor_strong_limit = 0; - move16(); - hGSCDec->noise_lev = NOISE_LEVEL_SP3; /* Q0 */ - move16(); - } - ELSE - { - IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) - { - hGSCDec->noise_lev = add( (Word16) get_next_indice_fx( st_fx, 2 ), NOISE_LEVEL_SP2 ); /* Q0 */ - move16(); - } - ELSE - { - hGSCDec->noise_lev = add( (Word16) get_next_indice_fx( st_fx, 3 ), NOISE_LEVEL_SP0 ); /* Q0 */ - move16(); - } - - /*---------------------------------------------------------------* - * Decode number of subframes - *---------------------------------------------------------------*/ - - - hGSCDec->cor_strong_limit = 1; /* Q0 */ - move16(); - nb_subfr = SWNB_SUBFR; - move16(); - - IF( GE_32( st_fx->core_brate, ACELP_9k60 ) ) - { - nbits = 1; - move16(); - nb_frame_flg = (Word16) get_next_indice_fx( st_fx, nbits ); /* Q0 */ - move16(); - - IF( s_and( nb_frame_flg, 0x1 ) == 0 ) - { - nb_subfr = 2 * SWNB_SUBFR; /* Q0 */ - move16(); - hGSCDec->cor_strong_limit = 0; - move16(); - } - } - } - - /*---------------------------------------------------------------* - * Decode the last band where the adaptive (pitch) contribution is significant - *---------------------------------------------------------------*/ - - IF( LT_32( st_fx->core_brate, CFREQ_BITRATE ) ) - { - nbits = 3; /* Q0 */ - move16(); - test(); - if ( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type == INACTIVE ) - { - nbits = 1; /* Q0 */ - move16(); - } - } - ELSE - { - nbits = 4; /* Q0 */ - move16(); - } - test(); - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) && st_fx->coder_type != INACTIVE ) - { - pit_band_idx = 1; /* Q0 */ - move16(); - } - ELSE - { - pit_band_idx = (Word16) get_next_indice_fx( st_fx, nbits ); /* Q0 */ - move16(); - } - - IF( pit_band_idx != 0 ) - { - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) - { - pit_band_idx = 7 + BAND1k2; /* Q0 */ - move16(); /* At low rate, if pitch model is chosen, then for to be use on extented and constant frequency range */ - } - ELSE - { - pit_band_idx = add( pit_band_idx, BAND1k2 ); /* Q0 */ - } - - /* detect bit errors in the bitstream */ - IF( GT_16( pit_band_idx, 13 ) ) /* The maximum decodable index is 10 + BAND1k2 (3) = 13 */ - { - pit_band_idx = 13; /* Q0 */ - move16(); - st_fx->BER_detect = 1; /* Q0 */ - move16(); - } - Diff_len = mfreq_loc_div_25[pit_band_idx]; /* Q0 */ - move16(); - } - hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; /* Q0 */ - move16(); - - - /*--------------------------------------------------------------------------------------* - * Decode adaptive (pitch) excitation contribution - * Reset unvaluable part of the adaptive (pitch) excitation contribution - *--------------------------------------------------------------------------------------*/ - IF( GT_16( pit_band_idx, BAND1k2 ) ) - { - /*---------------------------------------------------------------* - * Decode adaptive (pitch) excitation contribution - *---------------------------------------------------------------*/ - test(); - IF( EQ_16( st_fx->GSC_noisy_speech, 1 ) && EQ_16( nb_subfr, NB_SUBFR ) ) - { - Word16 indice; - nbits = Es_pred_bits_tbl[BIT_ALLOC_IDX_fx( st_fx->core_brate, GENERIC, -1, -1 )]; /* Q0 */ - move16(); - if ( st_fx->element_mode > EVS_MONO ) - { - nbits = 5; - move16(); - } - - indice = get_next_indice_fx( st_fx, nbits ); /* Q0 */ - - Es_pred_dec_fx( &Es_pred, indice, nbits, 0 ); - } - - dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf ); - - IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) - { - minimum_fx( pitch_buf, shr( st_fx->L_frame, 6 ), &low_pit ); - low_pit = shr( low_pit, 6 ); /*Q6 -> Q0 */ - - IF( LT_16( low_pit, 64 ) ) - { - pit_band_idx = 9 + BAND1k2; /* Q0 */ - move16(); - if ( st_fx->bwidth == NB ) - { - pit_band_idx = 7 + BAND1k2; /* Q0 */ - move16(); - } - } - ELSE IF( LT_16( low_pit, 128 ) ) - { - pit_band_idx = 5 + BAND1k2; /* Q0 */ - move16(); - } - ELSE - { - pit_band_idx = 3 + BAND1k2; /* Q0 */ - move16(); - } - - Diff_len = mfreq_loc_div_25[pit_band_idx]; /* Q0 */ - move16(); - hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; /* Q0 */ - move16(); - } - - /*---------------------------------------------------------------* - * DCT transform - *---------------------------------------------------------------*/ - edct_16fx( exc, dct_epit, st_fx->L_frame, 7, st_fx->element_mode ); - - /*---------------------------------------------------------------* - * Reset unvaluable part of the adaptive (pitch) excitation contribution - *---------------------------------------------------------------*/ - - max_len = sub( st_fx->L_frame, Diff_len ); /* Q0 */ - - if ( st_fx->bwidth == NB ) - { - max_len = sub( 160, Diff_len ); /* Q0 */ - } - - Len = 80; - move16(); - if ( LT_16( max_len, 80 ) ) - { - Len = max_len; /* Q0 */ - move16(); - } - - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && NE_16( st_fx->bwidth, NB ) ) - { - FOR( i = 0; i < max_len; i++ ) - { - dct_epit[i + Diff_len] = 0; - move16(); - } - } - ELSE - { - FOR( i = 0; i < Len; i++ ) - { - dct_epit[i + Diff_len] = mult_r( dct_epit[i + Diff_len], sm_table_fx[i] ); /* Qx */ - move16(); - } - - FOR( ; i < max_len; i++ ) - { - dct_epit[i + Diff_len] = 0; - move16(); - } - } - // PMT("in the rare case of 4 subfr, bfi_pitch_fx might be wrong") - st_fx->bfi_pitch_fx = mean_fx( pitch_buf, nb_subfr ); /* Q6 */ - move16(); - st_fx->bfi_pitch_frame = st_fx->L_frame; /* Q0 */ - move16(); - - Diff_len = add( Diff_len, 1 ); /* Q0 */ - st_fx->bpf_off = 0; - move16(); - } - ELSE - { - /* No adaptive (pitch) excitation contribution */ - st_fx->bpf_off = 1; /* Q0 */ - move16(); - set16_fx( dct_epit, 0, st_fx->L_frame ); - - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - set16_fx( pitch_buf, L_SUBFR16k * 64, NB_SUBFR16k ); - } - ELSE - { - set16_fx( pitch_buf, L_SUBFR * 64, NB_SUBFR ); - } - - set16_fx( gain_buf, 0, NB_SUBFR16k ); - - st_fx->bfi_pitch_fx = L_SUBFR * 64; - move16(); - st_fx->bfi_pitch_frame = st_fx->L_frame; /* Q0 */ - move16(); - st_fx->lp_gainp_fx = 0; - move16(); - st_fx->lp_gainc_fx = 0; - move16(); - st_fx->tilt_code_fx = 0; - move16(); - pit_band_idx = 0; - move16(); - Diff_len = 0; - move16(); - } - - /*--------------------------------------------------------------------------------------* - * GSC decoder - *--------------------------------------------------------------------------------------*/ - - /* find the current total number of bits used */ - - tmp_nb_bits_tot = st_fx->next_bit_pos; /* Q0 */ - move16(); - - if ( st_fx->extl_brate > 0 ) - { - /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ - tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); /* Q0 */ - } - - test(); - if ( st_fx->coder_type == INACTIVE && LE_32( st_fx->core_brate, ACELP_9k60 ) ) - { - tmp_nb_bits_tot = add( tmp_nb_bits_tot, 5 ); /* Q0 */ - } - - gsc_dec_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, st_fx->Q_exc ); - /*--------------------------------------------------------------------------------------* - * iDCT transform - *--------------------------------------------------------------------------------------*/ - - edct_16fx( dct_epit, exc, st_fx->L_frame, 7, st_fx->element_mode ); - edct_16fx( exc_wo_nf, exc_wo_nf, st_fx->L_frame, 7, st_fx->element_mode ); - /*----------------------------------------------------------------------* - * Remove potential pre-echo in case an onset has been detected - *----------------------------------------------------------------------*/ - - pre_echo_att_fx( &hGSCDec->Last_frame_ener_fx, exc, gsc_attack_flag, st_fx->Q_exc, st_fx->last_coder_type, st_fx->L_frame ); - - /*--------------------------------------------------------------------------------------* - * Update BWE excitation - *--------------------------------------------------------------------------------------*/ - - IF( st_fx->hBWE_TD != NULL ) - { - set16_fx( voice_factors, 0, NB_SUBFR16k ); - IF( EQ_16( st_fx->L_frame, L_FRAME16k ) ) - { - interp_code_4over2_fx( exc, bwe_exc, st_fx->L_frame ); - } - ELSE - { - interp_code_5over2_fx( exc, bwe_exc, L_FRAME ); - } - } - /*--------------------------------------------------------------------------------------* - * Updates - *--------------------------------------------------------------------------------------*/ - - Copy( exc, exc2, st_fx->L_frame ); /* Q_exc */ - Copy( exc_wo_nf, exc, st_fx->L_frame ); /* Q_exc */ - - /*--------------------------------------------------------------------------------------* - * Channel aware mode parameters - *--------------------------------------------------------------------------------------*/ - - set16_fx( st_fx->tilt_code_dec_fx, 0, NB_SUBFR16k ); - - return; -} - -/*=========================================================================*/ -/* FUNCTION : void decod_audio_ivas_fx(); */ -/*-------------------------------------------------------------------------*/ -/* PURPOSE : Decode audio (AC) frames */ -/*-------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16[]) Aq : LP filter coefficient Q12 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _(Word16) Q_exc :Q format of excitation */ -/*-------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16[]) pitch_buf_fx : Word16 pitch values for each subframe Q6*/ -/* _ (Word16[]) voice_factors_fx: frame error rate Q15 */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx : decoder memory structure */ -/* _ (Word16[]) exc_fx : adapt. excitation exc (Q_exc) */ -/* _ (Word16[]) exc2_fx : adapt. excitation/total exc (Q_exc) */ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*==========================================================================*/ -#endif -void decod_audio_ivas_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ - const Word16 *Aq, /* i : LP filter coefficient Q12*/ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ - Word16 *voice_factors, /* o : voicing factors Q15*/ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ - Word16 *lsf_new /* i : ISFs at the end of the frame Qx*/ - , - Word16 *gain_buf, /*Q14*/ + Decoder_State *st_fx, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Qx*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ const Word16 tdm_lp_reuse_flag, /* i : LPC reuse flag Q0*/ const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ @@ -525,7 +103,7 @@ void decod_audio_ivas_fx( } /* set bit-allocation */ - config_acelp1_IVAS( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( DEC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl_orig, st_fx->extl_brate_orig, st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), st_fx->next_bit_pos, st_fx->coder_type, st_fx->inactive_coder_type_flag, -1, 1, &nbits, NULL, st_fx->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_cnt, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); /*---------------------------------------------------------------* * Decode energy dynamics @@ -735,7 +313,7 @@ void decod_audio_ivas_fx( Es_pred_dec_fx( &Es_pred, indice, nbits, 0 ); } - dec_pit_exc_ivas_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + dec_pit_exc_fx( st_fx, Aq, st_fx->coder_type, Es_pred, pitch_buf, code, exc, bwe_exc, nb_subfr, gain_buf, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); IF( LT_32( st_fx->core_brate, ACELP_9k60 ) ) { @@ -894,7 +472,7 @@ void decod_audio_ivas_fx( Word16 Q_exc_old = st_fx->Q_exc; move16(); - gsc_dec_ivas_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); + gsc_dec_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); IF( NE_16( Q_exc_old, st_fx->Q_exc ) ) { @@ -976,250 +554,17 @@ void decod_audio_ivas_fx( /* _None */ /*==========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void gsc_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ - const Word16 pit_band_idx, /* i : bin position of the cut-off frequency Q0*/ - const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ - const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ - const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ - const Word16 coder_type, /* i : coding type Q0*/ - Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ - Word16 Q_exc ) -{ - Word16 i, j, bit, nb_subbands, pvq_len; - Word16 bitallocation_band[MBANDS_GN_BITALLOC16k]; - Word16 bitallocation_exc[2]; - Word16 Ener_per_bd_iQ[MBANDS_GN_BITALLOC16k]; - Word16 max_ener_band[MBANDS_GN_BITALLOC16k]; - Word16 exc_diffQ[L_FRAME16k]; - Word16 bits_per_bands[MBANDS_GN_BITALLOC16k]; - Word16 concat_out[L_FRAME16k]; - Word16 inpulses_fx[NB_SFM]; - Word16 imaxpulse_fx[NB_SFM]; - Word16 mean_gain; - Word16 Mbands_gn = 16; - Word16 Qexc_diffQ = Q_PVQ_OUT; - Word32 L_tmp; - Word16 Q_tmp; - Word16 seed_init; - GSC_DEC_HANDLE hGSCDec; - hGSCDec = st_fx->hGSCDec; - move16(); - move16(); - - move16(); // for Mbands_gn - move16(); // for Qexc_diffQ - set16_fx( inpulses_fx, 0, NB_SFM ); - set16_fx( imaxpulse_fx, 0, NB_SFM ); - - /*--------------------------------------------------------------------------------------* - * Initialization - *--------------------------------------------------------------------------------------*/ - bit = bits_used; - move16(); - - set16_fx( exc_diffQ, 0, st_fx->L_frame ); - - /*--------------------------------------------------------------------------------------* - * Gain decoding - *--------------------------------------------------------------------------------------*/ - - test(); - IF( st_fx->bfi || st_fx->BER_detect ) - { - /* copy old gain */ - Copy( hGSCDec->old_y_gain_fx, Ener_per_bd_iQ, Mbands_gn ); /* Q_old_gain */ - mean_gain = mult_r( st_fx->lp_gainc_fx, 3277 ); /*Q3*/ - FOR( i = 0; i < Mbands_gn; i++ ) - { - Ener_per_bd_iQ[i] = add( Ener_per_bd_iQ[i], shl( mean_gain, 9 ) ); /*Q12*/ - move16(); - } - - st_fx->lp_gainc_fx = mult_r( st_fx->lp_gainc_fx, 32112 ); /*Q3*/ - move16(); - } - ELSE - { - mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, st_fx->core_brate, hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q12 */ - - st_fx->lp_gainc_fx = mult_r( 640, mean_gain ); /*10 in Q6 x Q12 -> lp_gainc in Q3 */ - move16(); - } - - *last_bin = 0; - move16(); - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) - { - bitallocation_exc[0] = 0; - move16(); - bitallocation_exc[1] = 0; - move16(); - } - - set16_fx( bitallocation_band, 0, MBANDS_GN ); - - test(); - IF( ( EQ_16( st_fx->bfi, 1 ) ) || st_fx->BER_detect ) - { - /*--------------------------------------------------------------------------------------* - * Copy old spectrum - * reduce spectral dynamic - * save spectrum - *--------------------------------------------------------------------------------------*/ - - test(); - IF( EQ_16( st_fx->last_good, INACTIVE_CLAS ) || EQ_16( st_fx->Last_GSC_noisy_speech_flag, 1 ) ) - { - FOR( i = 0; i < st_fx->L_frame; i++ ) - { - L_tmp = L_shr( L_mult( Random( &hGSCDec->seed_tcx ), 26214 ), 5 ); /*Q10*/ - L_tmp = L_mac( L_tmp, hGSCDec->Last_GSC_spectrum_fx[i], 6554 ); /* Q10 */ - hGSCDec->Last_GSC_spectrum_fx[i] = round_fx( L_tmp ); /*Q10*/ - move16(); - } - } - - Copy( hGSCDec->Last_GSC_spectrum_fx, exc_diffQ, st_fx->L_frame ); /* Q10 */ - - FOR( i = 0; i < st_fx->L_frame; i++ ) - { - hGSCDec->Last_GSC_spectrum_fx[i] = mult_r( hGSCDec->Last_GSC_spectrum_fx[i], 24576 ); /*Q10*/ - move16(); - } - } - ELSE - { - /*--------------------------------------------------------------------------------------* - * PVQ decoder - *--------------------------------------------------------------------------------------*/ - - bands_and_bit_alloc_fx( hGSCDec->cor_strong_limit, hGSCDec->noise_lev, st_fx->core_brate, Diff_len, bit, &bit, Ener_per_bd_iQ, - max_ener_band, bits_per_bands, &nb_subbands, NULL, NULL, &pvq_len, coder_type, st_fx->bwidth, st_fx->GSC_noisy_speech, - st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); - - { - pvq_core_dec_fx( st_fx, gsc_sfm_start, gsc_sfm_end, gsc_sfm_size, concat_out, &Q_tmp, bit, nb_subbands, bits_per_bands, NULL, inpulses_fx, imaxpulse_fx, ACELP_CORE ); - Scale_sig( concat_out, gsc_sfm_end[nb_subbands - 1], sub( Q_PVQ_OUT, Q_tmp ) ); /* Q_PVQ_OUT */ - } - seed_init = 0; - move16(); - - /* Reorder Q bands */ - FOR( j = 0; j < nb_subbands; j++ ) - { - Copy( concat_out + shl( j, 4 ), exc_diffQ + shl( max_ener_band[j], 4 ), 16 ); /* Q_PVQ_OUT */ - - *last_bin = s_max( *last_bin, max_ener_band[j] ); /* Q0 */ - move16(); - - bitallocation_band[max_ener_band[j]] = 1; /* Q0 */ - move16(); - - seed_init = add( seed_init, inpulses_fx[j] ); /* Q0 */ - } - test(); - IF( NE_16( st_fx->last_coder_type, AUDIO ) /* First audio frame */ - && NE_16( st_fx->last_coder_type, UNVOICED ) ) /* last_coder_type == INACTIVE is overwritten in update_dec to UNVOICED */ - { - FOR( j = 0; j < nb_subbands * 16; j++ ) - { - IF( concat_out[j] > 0 ) - { - seed_init = extract_l( L_shl( seed_init, 3 ) ); /* Q0 */ - } - if ( concat_out[j] < 0 ) - { - seed_init = add( seed_init, 3 ); /* Q0 */ - move16(); - } - } - - hGSCDec->seed_tcx = seed_init; /* Q0 */ - move16(); - } - test(); - IF( EQ_32( st_fx->core_brate, ACELP_8k00 ) && st_fx->bwidth != NB ) - { - if ( exc_diffQ[L_FRAME8k - 2] != 0 ) - { - bitallocation_exc[0] = 1; /* Q0 */ - move16(); - } - - if ( exc_diffQ[L_FRAME8k - 1] != 0 ) - { - bitallocation_exc[1] = 1; /* Q0 */ - move16(); - } - } - - Copy( exc_diffQ, hGSCDec->Last_GSC_spectrum_fx, st_fx->L_frame ); /* Q_PVQ_OUT */ - - /*--------------------------------------------------------------------------------------* - * Skip adaptive (pitch) contribution frequency band (no noise added over the time contribution) - * Find x pulses between 1.6-3.2kHz to code in the spectrum of the residual signal - * Gain is based on the inter-correlation gain between the pulses found and residual signal - *--------------------------------------------------------------------------------------*/ - - freq_dnw_scaling_fx( hGSCDec->cor_strong_limit, st_fx->coder_type, hGSCDec->noise_lev, st_fx->core_brate, exc_diffQ, Qexc_diffQ, st_fx->L_frame ); - } - - /*--------------------------------------------------------------------------------------* - * Estimate noise level - *--------------------------------------------------------------------------------------*/ - - highband_exc_dct_in_fx( st_fx->core_brate, mfreq_bindiv_loc, *last_bin, Diff_len, hGSCDec->noise_lev, pit_band_idx, exc_diffQ, - &hGSCDec->seed_tcx, Ener_per_bd_iQ, nb_subfr, exc_dct_in, st_fx->last_coder_type, bitallocation_band, lsf_new, - hGSCDec->last_exc_dct_in_fx, &hGSCDec->last_ener_fx, hGSCDec->last_bitallocation_band, bitallocation_exc, st_fx->bfi, coder_type, - st_fx->bwidth, exc_wo_nf, Qexc_diffQ, Q_exc, st_fx->GSC_noisy_speech, hGSCDec->lt_ener_per_band_fx, st_fx->L_frame, st_fx->element_mode, st_fx->GSC_IVAS_mode ); - - exc_dct_in[0] = 0; - move16(); - - return; -} - -/*==========================================================================*/ -/* FUNCTION : void gsc_dec_ivas_fx () */ -/*--------------------------------------------------------------------------*/ -/* PURPOSE : Generic audio signal decoder */ -/*--------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word16) pit_band_idx : bin position of the cut-off frequency Q0 */ -/* _ (Word16) Diff_len : Lenght of the difference signal Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) bits_used : Number of bit used before frequency Q Q0 */ -/* _ (Word16) nb_subfr : Number of subframe considered Q0 */ -/* _ (Word16) Qexc : Q format of exc_dct_in */ -/*--------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ None */ -/*--------------------------------------------------------------------------*/ -/* INPUT/OUTPUT ARGUMENTS : */ -/* Decoder_State *st_fx:Decoder State Structure */ -/* _ (Word16[]) exc_dct_in : dctof pitch-only excitation / total excitation Qexc*/ -/*--------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _None */ -/*==========================================================================*/ -#endif -void gsc_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ + Decoder_State *st_fx, /* i/o: State structure */ + Word16 exc_dct_in[], /* i/o: dct of pitch-only excitation / total excitation Q_exc*/ const Word16 pit_band_idx, /* i : bin position of the cut-off frequency ` Q0*/ const Word16 Diff_len, /* i : Lenght of the difference signal (before pure spectral) Q0*/ const Word16 bits_used, /* i : Number of bit used before frequency Q Q0*/ const Word16 nb_subfr, /* i : Number of subframe considered Q0*/ const Word16 coder_type, /* i : coding type Q0*/ Word16 *last_bin, /* i : last bin of bit allocation Q0*/ - const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ - Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ + const Word16 *lsf_new, /* i : ISFs at the end of the frame Qx*/ + Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill Q_exc*/ Word16 *Q_exc ) { Word16 i, j, bit, nb_subbands, pvq_len; @@ -1310,13 +655,11 @@ void gsc_dec_ivas_fx( i--; } -#ifdef REMOVE_EVS_DUPLICATES IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { mean_gain = gsc_gaindec_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ } ELSE -#endif { mean_gain = gsc_gaindec_ivas_fx( st_fx, Ener_per_bd_iQ, brate_intermed_tbl[i], hGSCDec->old_y_gain_fx, coder_type, st_fx->bwidth ); /* Q3 */ } diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index e4fb48f4a..cf3d8c468 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -520,7 +520,7 @@ ivas_error ivas_core_dec_fx( Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, add( M, 1 ), sub( norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ), 3 ) ); // Qx } - IF( NE_32( ( error = acelp_core_dec_ivas_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = acelp_core_dec_fx( st, output_16_fx[n], synth_16_fx[n], save_hb_synth_16_fx, bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k_fx_16, sharpFlag[n], pitch_buf_fx[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh_fx, tdm_lsfQ_PCh_fx, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hStereoCng, read_sid_info ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 890e5fc9e..89cb92a4d 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -1097,8 +1097,8 @@ static void run_min_stats_fx( { arr_tmp = power_spec; } - ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, power_spec_q, NULL, NULL, NULL, st, st->bfi, 0 ); - /*=================================================*/ + + ApplyFdCng_fx( NULL, 0, arr_tmp, power_spec_q, NULL, NULL, NULL, st, st->bfi, 0 ); } /* restore VAD (see above) */ diff --git a/lib_dec/ivas_tcx_core_dec_fx.c b/lib_dec/ivas_tcx_core_dec_fx.c index aa5a379e8..0be01f7b8 100644 --- a/lib_dec/ivas_tcx_core_dec_fx.c +++ b/lib_dec/ivas_tcx_core_dec_fx.c @@ -875,11 +875,11 @@ void stereo_tcx_core_dec_fx( { Word16 buffer[L_FRAME16k]; lerp( signal_outFB_fx, buffer, st->L_frame, hTcxDec->L_frameTCX ); - ApplyFdCng_ivas_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( buffer, 0 /* Q of buffer */, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } ELSE { - ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -915,7 +915,7 @@ void stereo_tcx_core_dec_fx( test(); IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && st->idchan == 0 ) { - ApplyFdCng_ivas_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); + ApplyFdCng_fx( signal_out_fx, 0, NULL, 0, NULL, NULL, NULL, st, st->bfi, 0 ); } } @@ -923,6 +923,7 @@ void stereo_tcx_core_dec_fx( return; } + static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( Decoder_State *st, /* i/o: decoder state structure */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ diff --git a/lib_dec/ivas_td_low_rate_dec_fx.c b/lib_dec/ivas_td_low_rate_dec_fx.c index 3191a8b4a..8f09c1c7d 100644 --- a/lib_dec/ivas_td_low_rate_dec_fx.c +++ b/lib_dec/ivas_td_low_rate_dec_fx.c @@ -127,7 +127,7 @@ void tdm_low_rate_dec_fx( tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); /* Q0 */ } - gsc_dec_ivas_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); + gsc_dec_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); /*--------------------------------------------------------------------------------------* * iDCT transform @@ -193,14 +193,9 @@ void tdm_low_rate_dec_fx( * * Decode generic (GC), 2 subframes mode *---------------------------------------------------------------------*/ -/*---------------------------------------------------------------------* - * decod_gen_2sbfr_ivas_fx() - * - * Decode generic (GC), 2 subframes mode - *---------------------------------------------------------------------*/ -void decod_gen_2sbfr_ivas_fx( - Decoder_State *st, /* i/o: decoder static memory */ +void decod_gen_2sbfr_fx( + Decoder_State *st, /* i/o: decoder static memory */ const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ const Word16 *Aq, /* i : LP filter coefficient Q12*/ Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ @@ -263,7 +258,7 @@ void decod_gen_2sbfr_ivas_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch = pit_decode_ivas_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ + *pt_pitch = pit_decode_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ test(); test(); @@ -295,7 +290,7 @@ void decod_gen_2sbfr_ivas_fx( * Estimate spectrum tilt and voicing *--------------------------------------------------------------*/ - gain_dec_lbr_ivas_fx( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gc_mem, gp_mem, 2 * L_SUBFR ); + gain_dec_lbr_fx( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gc_mem, gp_mem, 2 * L_SUBFR ); st->tilt_code_fx = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, st->Q_exc, 2 * L_SUBFR, 0 ); /* Q15 */ move16(); @@ -312,10 +307,12 @@ void decod_gen_2sbfr_ivas_fx( Word16 gain_code16 = round_fx( L_shl( gain_code, st->Q_exc ) ); /*Q_exc*/ Acelp_dec_total_exc( exc, exc2, gain_code16, gain_pit, i_subfr, code, 2 * L_SUBFR ); + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, 2 * L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/], bwe_exc, 0, NULL, st->Q_exc, T0, T0_frac, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + + prep_tbe_exc_fx( L_frame, 2 * L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/], bwe_exc, 0, NULL, st->Q_exc, T0, T0_frac, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/]; /* Q15 */ move16(); @@ -323,6 +320,7 @@ void decod_gen_2sbfr_ivas_fx( * Excitation enhancements (update of total excitation signal) * called twice because adapting it to double the subfr length would need lot of modifications *----------------------------------------------------------------*/ + enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code, exc2, gain_pit, &st->dm_fx, st->Q_exc ); enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code + L_SUBFR, exc2 + L_SUBFR, gain_pit, &st->dm_fx, st->Q_exc ); diff --git a/lib_dec/lsf_dec_fx.c b/lib_dec/lsf_dec_fx.c index 9b7f77c79..913543db8 100644 --- a/lib_dec/lsf_dec_fx.c +++ b/lib_dec/lsf_dec_fx.c @@ -8,9 +8,11 @@ #include "rom_com.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "ivas_prot_fx.h" + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ + static void dqlsf_CNG_fx( Decoder_State *st_fx, Word16 *lsf_q ); /*--------------------------------------------------------------------------------------* @@ -88,7 +90,6 @@ static void dqlsf_CNG_fx( /* _ (Word16*) lsp_new : LP filter coefficient Q15 */ /* _ (Word16*) lsp_mid : LP filter coefficient Q15 */ /*---------------------------------------------------------------------------*/ - /* _ (Word16[]) st_fx->lsf_adaptive_mean_fx : FEC - adaptive mean LSF */ /* vector for FEC Q(x2.56) */ /* _ (Word16[]) st_fx->mem_AR_fx : AR memory of LSF quantizer */ @@ -99,271 +100,16 @@ static void dqlsf_CNG_fx( /* _ None */ /*===========================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES void lsf_dec_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ -) -{ - Word16 i; - Word16 no_param_lpc; - Word16 param_lpc[NPRM_LPC_NEW]; - Word32 L_tmp; - Word16 nBits = 0; - move16(); - Word16 tmp_old[M + 1], tmp_new[M + 1]; - Word16 enr_old = 0, enr_new = 0; - move16(); - move16(); - Word16 lsf_diff, coder_type; - - /* initialize */ - coder_type = st_fx->coder_type; - if ( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - coder_type = INACTIVE; /* Q0 */ - move16(); - } - test(); - if ( EQ_16( coder_type, AUDIO ) && st_fx->GSC_IVAS_mode > 0 ) - { - coder_type = GENERIC; /* Q0 */ - move16(); - } - no_param_lpc = 0; - nBits = 0; - move16(); - move16(); - - /* Find the number of bits for LSF quantization */ - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - nBits = LSF_BITS_CNG; /* Q0 */ - move16(); - } - ELSE - { - test(); - IF( st_fx->nelp_mode_dec == 0 && st_fx->ppp_mode_dec == 0 ) - { - nBits = st_fx->acelp_cfg.lsf_bits; /* Q0 */ - move16(); - } - ELSE IF( EQ_16( st_fx->nelp_mode_dec, 1 ) ) - { - IF( EQ_16( coder_type, UNVOICED ) ) - { - nBits = 30; /* Q0 */ - move16(); - if ( st_fx->bwidth == NB ) - { - nBits = 32; /* Q0 */ - move16(); - } - } - } - ELSE IF( EQ_16( st_fx->ppp_mode_dec, 1 ) ) - { - nBits = 26; /* Q0 */ - move16(); - } - } - - /* LSF de-quantization */ - lsf_end_dec_fx( st_fx, 0, coder_type, st_fx->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc, - tdm_lsfQ_PCh ); - - /* convert quantized LSFs to LSPs */ - - lsf2lsp_fx( lsf_new, lsp_new, M, st_fx->sr_core ); - /* set seed_acelp used in UC mode */ - test(); - IF( EQ_16( coder_type, UNVOICED ) && GT_16( st_fx->element_mode, EVS_MONO ) ) - { - st_fx->seed_acelp = 0; - move16(); - FOR( i = no_param_lpc - 1; i >= 0; i-- ) - { - /* rightshift before *seed_acelp+param_lpc[i] to avoid overflows*/ - st_fx->seed_acelp = extract_l( L_add( imult3216( 31821L /* Q0 */, add( shr( ( st_fx->seed_acelp ), 1 ), param_lpc[i] ) ), 13849L /* Q0 */ ) ); /* Q0 */ - move16(); - } - } - IF( EQ_32( st_fx->core_brate, SID_2k40 ) ) - { - /* return if SID frame (conversion to A(z) done in the calling function) */ - return; - } - - /*-------------------------------------------------------------------------------------* - * FEC - update adaptive LSF mean vector - *-------------------------------------------------------------------------------------*/ - - FOR( i = 0; i < M; i++ ) - { - L_tmp = L_mult( lsf_new[i], 10922 ); /*Q(x2.56+16)*/ - L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi1_fx[i], 10922 ); /*Q(x2.56+16)*/ - L_tmp = L_mac( L_tmp, st_fx->lsfoldbfi0_fx[i], 10922 ); /*Q(x2.56+16)*/ - st_fx->lsf_adaptive_mean_fx[i] = round_fx( L_tmp ); /*Q(x2.56)*/ - move16(); - } - - test(); - test(); - IF( ( st_fx->prev_bfi && ( EQ_16( coder_type, TRANSITION ) ) && ( EQ_16( tc_subfr, sub( st_fx->L_frame, L_SUBFR ) ) ) ) ) - { - lsf_diff = 1205; - move16(); /*int_fs / (float)(2*(M+1)); = 470.588 -> 1205 in Q2.56 */ - if ( EQ_16( st_fx->L_frame, L_FRAME ) ) - { - lsf_diff = 964; - move16(); /*int_fs / (float)(2*(M+1)); = 376.47 -> 964 in Q2.56 */ - } - st_fx->lsf_old_fx[0] = lsf_diff; - move16(); - - FOR( i = 1; i < M; i++ ) - { - st_fx->lsf_old_fx[i] = add( st_fx->lsf_old_fx[i - 1], lsf_diff ); /* Q2.56 */ - move16(); - } - lsf2lsp_fx( st_fx->lsf_old_fx, st_fx->lsp_old_fx, M, st_fx->sr_core ); - } - /*-------------------------------------------------------------------------------------* - * Mid-frame LSF decoding - * LSP interpolation and conversion of LSPs to A(z) - *-------------------------------------------------------------------------------------*/ - IF( st_fx->rate_switching_reset ) - { - /*extrapolation in case of unstable LSF convert*/ - Copy( lsp_new, st_fx->lsp_old_fx, M ); /* Q15 */ - Copy( lsf_new, st_fx->lsf_old_fx, M ); /* Q2.56 */ - } - { - /* Mid-frame LSF decoding */ - lsf_mid_dec_fx( st_fx, lsp_new, coder_type, lsp_mid ); - } - test(); - test(); - IF( !( st_fx->prev_bfi && ( EQ_16( coder_type, TRANSITION ) ) && ( EQ_16( tc_subfr, sub( st_fx->L_frame, L_SUBFR ) ) ) ) ) - { - IF( st_fx->prev_bfi ) - { - /* check, if LSP interpolation can be relaxed */ - E_LPC_f_lsp_a_conversion( st_fx->lsp_old_fx, tmp_old, M ); - enr_old = Enr_1_Az_fx( tmp_old, 2 * L_SUBFR ); /* Q3 */ - - E_LPC_f_lsp_a_conversion( lsp_new, tmp_new, M ); - enr_new = Enr_1_Az_fx( tmp_new, 2 * L_SUBFR ); /* Q3 */ - - IF( LT_16( enr_new, mult_r( 9830 /*0.3 Q15*/, enr_old ) ) ) - { - /* OLD CODE : if( st->safety_net == 1), replaced with a decision similar to MODE2 */ - st_fx->relax_prev_lsf_interp = -1; - move16(); - test(); - test(); - test(); - test(); - if ( st_fx->clas_dec == UNVOICED_CLAS || EQ_16( st_fx->clas_dec, SIN_ONSET ) || st_fx->clas_dec == INACTIVE_CLAS || EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) ) - { - st_fx->relax_prev_lsf_interp = 1; - move16(); - } - } - } - } - test(); - IF( EQ_16( st_fx->last_core, HQ_CORE ) && st_fx->core == ACELP_CORE ) - { - /* update old LSPs/LSFs in case of HQ->ACELP core switching */ - Copy( lsp_mid, st_fx->lsp_old_fx, M ); /* Q15 */ - lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core ); /* Q15 */ - } - test(); - IF( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( coder_type, UNVOICED ) ) - { - // PMT("To be verified") - IF( EQ_16( st_fx->active_cnt, 1 ) ) - { - Copy( lsp_mid, st_fx->lsp_old_fx, M ); /* Q15 */ - lsp2lsf_fx( lsp_mid, st_fx->lsf_old_fx, M, st_fx->sr_core ); /* Q15 */ - Copy( lsp_new, lsp_mid, M ); /* Q15 */ - } - - /* LSP interpolation and conversion of LSPs to A(z) - two-subframe mode */ - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, -2 ); - } - ELSE - { - /* LSP interpolation and conversion of LSPs to A(z) */ - int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, st_fx->relax_prev_lsf_interp ); - } - /*------------------------------------------------------------------* - * Check LSF stability (distance between old LSFs and current LSFs) - *------------------------------------------------------------------*/ - - IF( st_fx->element_mode == EVS_MONO ) - { - st_fx->stab_fac_fx = lsf_stab_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); /*Q15*/ - move16(); - } - ELSE - { - st_fx->stab_fac_fx = lsf_stab_ivas_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); /* Q15 */ - move16(); - } - - return; -} - -/*===========================================================================*/ -/* FUNCTION : lsf_dec_ivas_fx() */ -/*---------------------------------------------------------------------------*/ -/* PURPOSE : LSF decoder */ -/*---------------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Struct) st_fx : decoder static memory */ -/* _ (Word16) L_frame : length of the frame */ -/* _ (Word16) coder_type : coding type */ -/* _ (Word16) bwidth : input signal bandwidth */ -/*---------------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16*) Aq : LP filter coefficient Q12 */ -/* _ (Word16*) lsf_new : LP filter coefficient Q(x2.56) */ -/* _ (Word16*) lsp_new : LP filter coefficient Q15 */ -/* _ (Word16*) lsp_mid : LP filter coefficient Q15 */ -/*---------------------------------------------------------------------------*/ - -/* _ (Word16[]) st_fx->lsf_adaptive_mean_fx : FEC - adaptive mean LSF */ -/* vector for FEC Q(x2.56) */ -/* _ (Word16[]) st_fx->mem_AR_fx : AR memory of LSF quantizer */ -/* (past quantized LSFs without mean) Q(x2.56) */ -/* _ (Word16) st_fx->stab_fac_fx : LSF stability factor Q15 */ -/*---------------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ None */ -/*===========================================================================*/ -#endif -void lsf_dec_ivas_fx( - Decoder_State *st_fx, /* i/o: State structure */ - const Word16 tc_subfr, /* i : TC subframe index Q0*/ - Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ - Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ - Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ - Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ - Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ - const Word16 tdm_low_rate_mode /* i : secondary channel low rate mode flag Q0*/ - , - const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ + Decoder_State *st_fx, /* i/o: State structure */ + const Word16 tc_subfr, /* i : TC subframe index Q0*/ + Word16 *Aq, /* o : quantized A(z) for 4 subframes Q12*/ + Word16 *LSF_Q_prediction, /* o : LSF prediction mode Q0*/ + Word16 *lsf_new, /* o : de-quantized LSF vector Q(x2.56)*/ + Word16 *lsp_new, /* o : de-quantized LSP vector Q15*/ + Word16 *lsp_mid, /* o : de-quantized mid-frame LSP vector Q15*/ + const Word16 tdm_low_rate_mode, /* i : secondary channel low rate mode flag Q0*/ + const Word16 tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel Qx*/ ) { Word16 i; diff --git a/lib_dec/pit_dec_fx.c b/lib_dec/pit_dec_fx.c index e8cebedbd..38ec41cb2 100644 --- a/lib_dec/pit_dec_fx.c +++ b/lib_dec/pit_dec_fx.c @@ -319,246 +319,22 @@ void Mode2_delta_pit_dec( /* _ (Word16 ) pitch : close loop integer pitch Q6 */ /*=======================================================================*/ -#ifndef REMOVE_EVS_DUPLICATES -Word16 pit_decode_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr /* i : subframe length */ -) -{ - Word16 pitch; /*Q2*/ - Word16 pitch_index, nBits, pit_flag; - - pitch_index = 0; - move16(); - - /*----------------------------------------------------------------* - * Set pit_flag = 0 for every subframe with absolute pitch search - *----------------------------------------------------------------*/ - pit_flag = i_subfr; - move16(); - - if ( EQ_16( i_subfr, PIT_DECODE_2XL_SUBFR ) ) - { - pit_flag = 0; - move16(); - } - - /*-------------------------------------------------------* - * Retrieve the pitch index - *-------------------------------------------------------*/ - IF( !Opt_AMR_WB ) - { - /*----------------------------------------------------------------* - * pitch Q: Set limit_flag to 0 for restrained limits, and 1 for extended limits - *----------------------------------------------------------------*/ - test(); - test(); - IF( i_subfr == 0 ) - { - *limit_flag = 1; - move16(); - - if ( EQ_16( coder_type, VOICED ) ) - { - *limit_flag = 2; - move16(); /* double-extended limits */ - } - test(); - if ( EQ_16( coder_type, GENERIC ) && EQ_32( core_brate, ACELP_7k20 ) ) - { - *limit_flag = 0; - move16(); - } - } - ELSE IF( EQ_16( i_subfr, 2 * L_SUBFR ) && EQ_32( coder_type, GENERIC ) && LE_32( core_brate, ACELP_13k20 ) ) - { - if ( GT_16( *T0, shr( add( PIT_FR1_EXTEND_8b, PIT_MIN ), 1 ) ) ) - { - *limit_flag = 0; - move16(); - } - } - - /*-------------------------------------------------------* - * Retrieve the number of Q bits - *-------------------------------------------------------*/ - - nBits = 0; - move16(); - IF( NE_16( coder_type, AUDIO ) ) - { - /* find the number of bits */ - nBits = st_fx->acelp_cfg.pitch_bits[shr( i_subfr, 6 )]; - move16(); - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - } - - /*-------------------------------------------------------* - * Pitch decoding in AUDIO mode - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - IF( EQ_16( coder_type, AUDIO ) ) - { - test(); - if ( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 ) - { - pit_flag = L_SUBFR; - move16(); - } - if ( pit_flag == 0 ) - { - nBits = 10; - move16(); - } - if ( pit_flag != 0 ) - { - nBits = 6; - move16(); - } - - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - - test(); - test(); - IF( EQ_16( L_subfr, L_FRAME / 2 ) && i_subfr != 0 && GE_16( pitch_index, 32 ) ) /* safety check in case of bit errors */ - { - pitch_index = shr( pitch_index, 1 ); - st_fx->BER_detect = 1; - move16(); - } - - pit_Q_dec_fx( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE IF( EQ_16( coder_type, VOICED ) ) - { - /*-------------------------------------------------------* - * Pitch decoding in VOICED mode - * (ACELP@12k8 core only) - *-------------------------------------------------------*/ - if ( EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - pit_flag = i_subfr; - move16(); - } - - pit_Q_dec_fx( 0, pitch_index, nBits, 4, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE - { - /*-------------------------------------------------------* - * Pitch decoding in GENERIC mode - * (both ACELP@12k8 and ACELP@16k cores) - *-------------------------------------------------------*/ - IF( EQ_16( L_frame, L_FRAME ) ) - { - pit_Q_dec_fx( 0, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - ELSE - { - pit16k_Q_dec_fx( pitch_index, nBits, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - } - } - - /*-------------------------------------------------------* - * Pitch decoding in AMR-WB IO mode - *-------------------------------------------------------*/ - - ELSE - { - *limit_flag = 0; - move16(); - test(); - test(); - IF( i_subfr == 0 || ( EQ_16( i_subfr, 2 * L_SUBFR ) && EQ_32( core_brate, ACELP_8k85 ) ) ) - { - nBits = 8; - move16(); - } - ELSE - { - nBits = 5; - move16(); - } - IF( GT_32( core_brate, ACELP_8k85 ) ) - { - nBits = 6; - move16(); - test(); - if ( i_subfr == 0 || EQ_16( i_subfr, 2 * L_SUBFR ) ) - { - nBits = 9; - move16(); - } - } - - pitch_index = (Word16) get_next_indice_fx( st_fx, nBits ); - - pit_Q_dec_fx( 1, pitch_index, nBits, 8, pit_flag, *limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); - } - - /*-------------------------------------------------------* - * Compute floating pitch output - *-------------------------------------------------------*/ - - pitch = shl( add( shl( *T0, 2 ), *T0_frac ), 4 ); /* save subframe pitch values Q6 */ - - return pitch; -} - -/*======================================================================*/ -/* FUNCTION : pit_decode_ivas_fx() */ -/*-----------------------------------------------------------------------*/ -/* PURPOSE : calculate pitch value */ -/* */ -/*-----------------------------------------------------------------------*/ -/* INPUT ARGUMENTS : */ -/* _ (Word32) core_brate : Core bitrate Q0 */ -/* _ (Word16) Opt_AMR_WB : flag indicating AMR-WB IO mode Q0 */ -/* _ (Word16) L_frame : length of the frame Q0 */ -/* _ (Word16) i_subfr : length of the frame Q0 */ -/* _ (Word16) coder_type : coding type Q0 */ -/* _ (Word16) L_subfr : subframe length */ -/*-----------------------------------------------------------------------*/ -/* OUTPUT ARGUMENTS : */ -/* _ (Word16 *) T0 : close loop integer pitch */ -/* _ (Word16 *) T0_frac : close loop fractional part of the pitch */ -/* _ (Word16 ) pitch : pitch value Q6 */ -/*-----------------------------------------------------------------------*/ -/* INPUT OUTPUT ARGUMENTS */ -/* _ (Word16 *) T0_min : delta search min for sf 2 & 4 */ -/* _ (Word16 *) T0_max : delta search max for sf 2 & 4 */ -/*-----------------------------------------------------------------------*/ -/* RETURN ARGUMENTS : */ -/* _ (Word16 ) pitch : close loop integer pitch Q6 */ -/*=======================================================================*/ - -#endif -Word16 pit_decode_ivas_fx( /* o : floating pitch value */ - Decoder_State *st_fx, /* i/o: decoder state structure */ - const Word32 core_brate, /* i : core bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 L_frame, /* i : length of the frame */ - Word16 i_subfr, /* i : subframe index */ - const Word16 coder_type, /* i : coding type */ - Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ - Word16 *T0, /* o : close loop integer pitch */ - Word16 *T0_frac, /* o : close loop fractional part of the pitch */ - Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ - Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ - const Word16 L_subfr, /* i : subframe length */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ +/*! r: floating pitch value */ +Word16 pit_decode_fx( + Decoder_State *st_fx, /* i/o: decoder state structure */ + const Word32 core_brate, /* i : core bitrate */ + const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ + const Word16 L_frame, /* i : length of the frame */ + Word16 i_subfr, /* i : subframe index */ + const Word16 coder_type, /* i : coding type */ + Word16 *limit_flag, /* i/o: restrained(0) or extended(1) Q limits */ + Word16 *T0, /* o : close loop integer pitch */ + Word16 *T0_frac, /* o : close loop fractional part of the pitch */ + Word16 *T0_min, /* i/o: delta search min for sf 2 & 4 */ + Word16 *T0_max, /* i/o: delta search max for sf 2 & 4 */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ + const Word16 tdm_Pri_pitch_buf[] /* i : primary channel pitch buffer Q6 */ ) { Word16 pitch; /*Q2*/ diff --git a/lib_dec/post_dec_fx.c b/lib_dec/post_dec_fx.c index b5d56d8fb..cbcb225bc 100644 --- a/lib_dec/post_dec_fx.c +++ b/lib_dec/post_dec_fx.c @@ -139,21 +139,13 @@ void post_decoder( { st->hPFstat->on = 1; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#endif } ELSE { st->hPFstat->on = 0; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#endif } } @@ -176,10 +168,10 @@ void post_decoder( /* Update synth2 memory */ Copy( synth_buf2 + L_frame, hBPF->pst_old_syn_fx, NBPSF_PIT_MAX ); - return; } + void post_decoder_ivas_fx( Decoder_State *st, Word16 synth_buf[], // Q0 @@ -310,21 +302,13 @@ void post_decoder_ivas_fx( { st->hPFstat->on = 1; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 0 ); -#endif } ELSE { st->hPFstat->on = 0; move16(); -#ifdef REMOVE_EVS_DUPLICATES - formant_post_filt_ivas_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#else formant_post_filt_fx( st->hPFstat, synth, st->mem_Aq, synth2, L_frame, st->lp_noise, bitrate, 1 ); -#endif } } diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index 4c3f7152c..ceba860a1 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -394,14 +394,10 @@ ivas_error acelp_core_enc_fx( test(); IF( !nelp_mode && !ppp_mode ) { -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, - tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, - tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, st_fx->GSC_noisy_speech, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, + tc_subfr_fx, 0, &nb_bits, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, + tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } /*-----------------------------------------------------------------* @@ -464,19 +460,16 @@ ivas_error acelp_core_enc_fx( { tc_classif_enc_fx( Q_new, st_fx->L_frame, &tc_subfr_fx, &position, attack_flag, st_fx->pitch[0], res_fx ); -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#endif - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, - tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr_fx, 1, NULL, unbits_fx, st_fx->element_mode, &uc_two_stage_flag, + tdm_lp_reuse_flag, tdm_low_rate_mode, st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); } /*---------------------------------------------------------------* * Calculation of prediction for scaled innovation energy * (for memory-less gain quantizer) *---------------------------------------------------------------*/ + IF( nb_bits > 0 ) { Es_pred_enc_fx( &Es_pred_fx, &indice, st_fx->L_frame, res_fx, st_fx->voicing_fx, nb_bits, 0, Q_new ); @@ -521,13 +514,9 @@ ivas_error acelp_core_enc_fx( lsp_mid_bck_fx, mCb1_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen_fx ); /* Configure ACELP bit allocation */ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, -#endif - -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, - st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, st_fx->L_frame, + -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, st_fx->coder_type, st_fx->inactive_coder_type_flag, tc_subfr_fx, 0, &nb_bits, unbits_fx, 0, &uc_two_stage_flag, 0, 0, + st_fx->idchan, st_fx->active_fr_cnt_fx, tdm_Pitch_reuse_flag, st_fx->tdm_LRTD_flag, st_fx->GSC_IVAS_mode ); /* redo LSF quantization */ lsf_enc_fx( st_fx, lsf_new_fx, lsp_new_fx, lsp_mid_fx, Aq_fx, st_fx->Nb_ACELP_frames, tdm_low_rate_mode, st_fx->GSC_IVAS_mode, Q_new ); @@ -1185,7 +1174,7 @@ ivas_error acelp_core_enc_ivas_fx( test(); IF( !nelp_mode && !ppp_mode ) { - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*-----------------------------------------------------------------* @@ -1322,7 +1311,7 @@ ivas_error acelp_core_enc_ivas_fx( { tc_classif_enc_fx( Q_new, st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res_fx ); - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } /*---------------------------------------------------------------* @@ -1381,7 +1370,7 @@ ivas_error acelp_core_enc_ivas_fx( lsf_syn_mem_restore_ivas_fx( st, tilt_code_bck_fx, gc_threshold_bck_fx, clip_var_bck_fx, next_force_sf_bck, lsp_new, lsp_mid, clip_var_fx, mem_AR_fx, mem_MA_fx, lsp_new_bck_fx, lsp_mid_bck_fx, Bin_E_fx, Bin_E_old_fx, mem_syn_bck_fx, mem_w0_bck_fx, streaklimit_fx, pstreaklen ); /* Configure ACELP bit allocation */ - config_acelp1_IVAS( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); + config_acelp1_fx( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, st->inactive_coder_type_flag, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); /* redo LSF quantization */ lsf_enc_ivas_fx( st, lsf_new_fx, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL, Q_new ); @@ -1390,6 +1379,7 @@ ivas_error acelp_core_enc_ivas_fx( calc_residu_fx( st, inp, res_fx, Aq ); st->hTdCngEnc->burst_ho_cnt = 0; move16(); + /* VOICED frames in SC-VBR */ encod_gen_voic_ivas_fx( st, inp, Aw, Aq, Es_pred_fx, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf, voice_factors_fx, bwe_exc_fx, unbits, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf_fx, 0, Q_new ); } diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index bad70b08c..76fa6f151 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -10,32 +10,17 @@ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ #include "basop_util.h" /* Function prototypes */ + /*---------------------------------------------------------------------* * Local function prototypes *---------------------------------------------------------------------*/ -static void encod_gen_voic_core_switch_fx( Encoder_State *st_fx, - const Word16 L_frame_fx, - const Word16 inp_fx[], - const Word16 Aq_fx[], - const Word16 A_fx[], - const Word16 T_op[], - Word16 *exc_fx, - const Word32 core_bitrate_fx, - Word16 shift, - Word16 Q_new ); -static void encod_gen_voic_core_switch_ivas_fx( Encoder_State *st_fx, - const Word16 L_frame_fx, - const Word16 inp_fx[], - const Word16 Aq_fx[], - const Word16 A_fx[], - const Word16 T_op[], - Word16 *exc_fx, - const Word32 core_bitrate_fx, - Word16 shift, - Word16 Q_new ); +static void encod_gen_voic_core_switch_fx( Encoder_State *st_fx, const Word16 L_frame_fx, const Word16 inp_fx[], const Word16 Aq_fx[], const Word16 A_fx[], const Word16 T_op[], Word16 *exc_fx, const Word32 core_bitrate_fx, Word16 shift, Word16 Q_new ); + +static void encod_gen_voic_core_switch_ivas_fx( Encoder_State *st_fx, const Word16 L_frame_fx, const Word16 inp_fx[], const Word16 Aq_fx[], const Word16 A_fx[], const Word16 T_op[], Word16 *exc_fx, const Word32 core_bitrate_fx, Word16 shift, Word16 Q_new ); static void bwe_switch_enc_fx( Encoder_State *st_fx, const Word16 *new_speech ); + static void bwe_switch_enc_ivas_fx( Encoder_State *st_fx, const Word16 *new_speech ); static Word16 dotprod_satcont( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len, Word16 delta ); @@ -150,12 +135,8 @@ void acelp_core_switch_enc_fx( * Excitation encoding *----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, -#else - config_acelp1( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, -#endif - GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, + GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); encod_gen_voic_core_switch_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); @@ -278,8 +259,8 @@ void acelp_core_switch_enc_ivas_fx( * Excitation encoding *----------------------------------------------------------------*/ - config_acelp1_IVAS( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, - GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, cbrate, st_fx->core, -1, -1, st_fx->last_L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, + GENERIC, st_fx->inactive_coder_type_flag, -1, -1, &j, &i, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); encod_gen_voic_core_switch_ivas_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); diff --git a/lib_enc/analy_lp_fx.c b/lib_enc/analy_lp_fx.c index 78a02eeec..9b6ff2108 100644 --- a/lib_enc/analy_lp_fx.c +++ b/lib_enc/analy_lp_fx.c @@ -3,17 +3,16 @@ ====================================================================================*/ #include -#include "options.h" /* Compilation switches */ -#include "cnst.h" /* Common constants */ -#include "rom_com_fx.h" /* Static table prototypes */ -#include "rom_com.h" /* Static table prototypes */ -#include "rom_enc.h" /* Static table prototypes */ -//#include "prot_fx.h" /* Function prototypes */ +#include "options.h" /* Compilation switches */ +#include "cnst.h" /* Common constants */ +#include "rom_com_fx.h" /* Static table prototypes */ +#include "rom_com.h" /* Static table prototypes */ +#include "rom_enc.h" /* Static table prototypes */ #include "prot_fx.h" /* Function prototypes */ #include "prot_fx_enc.h" /* Function prototypes */ /*-------------------------------------------------------------------* - * analy_lp() + * analy_lp_fx() * * Perform LP analysis * @@ -23,26 +22,26 @@ * - find interpolated LSPs and convert back to A(z) for all subframes * - update LSPs for the next frame *-------------------------------------------------------------------*/ -void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ - Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif - const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ - Word16 Q_new, /*i: stores Q for speech*/ - Word16 *Q_r /*stores q for ener*/ ) + +void analy_lp_fx( + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ + Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 element_mode, /* i : element mode */ + const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ + Word16 Q_new, /* i : stores Q for speech */ + Word16 *Q_r /*stores q for ener*/ +) { Word16 r_h[M + 1]; /* Autocorrelations of windowed speech MSB */ Word16 r_l[M + 1]; /* Autocorrelations of windowed speech LSB */ @@ -77,9 +76,7 @@ void analy_lp_ivas_fx( /* Autocorrelations */ autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); -#ifdef REMOVE_EVS_DUPLICATES IF( NE_16( element_mode, EVS_MONO ) ) -#endif { /*if ( r[0] < 100.0f && no_thr == 0 )*/ /*r[0] = 100.0f*/ @@ -132,101 +129,6 @@ void analy_lp_ivas_fx( return; } -#ifndef REMOVE_EVS_DUPLICATES -void analy_lp_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 L_look, /* i : look-ahead Q0*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 lsp_new[], /* o : current frame LSPs Q15*/ - Word16 lsp_mid[], /* o : current mid-frame LSPs Q15*/ - Word16 lsp_old[], /* i/o: previous frame unquantized LSPs Q15*/ - const Word16 Top[2], /* i : open loop pitch lag Q0*/ - const Word16 Tnc[2], /* i : open loop pitch gain Q15*/ - const Word32 Core_sr, /* i : Internal core sampling rate Q0*/ - const Word16 sec_chan_low_rate, /* i : flag to signal second channel Q0*/ - Word16 Q_new, - Word16 *Q_r ) -{ - Word16 r_h[M + 1]; /* Autocorrelations of windowed speech MSB */ - Word16 r_l[M + 1]; /* Autocorrelations of windowed speech LSB */ - Word32 LepsP[M + 1]; - Word16 i, i_subfr, wind_length = 0; - Word16 *lsp; - const Word16 *wind = NULL; - const Word16 *pt; - Word16 half_frame; - - IF( EQ_16( L_frame, L_FRAME ) ) - { - wind_length = L_LP; - move16(); - wind = Assym_window_W16fx; /* Q15 */ - } - ELSE /* L_frame == L_FRAME16k */ - { - wind_length = L_LP_16k; - move16(); - wind = assym_window_16k_fx; /* Q15 */ - } - lsp = lsp_mid; /* Q15 */ - half_frame = shr( L_frame, 1 ); - - FOR( i_subfr = 0; i_subfr <= 1; i_subfr++ ) - { - pt = speech + sub( add( half_frame, L_look ), wind_length ); - half_frame = shl( half_frame, 1 ); - - /* Autocorrelations */ - autocorr_fx( pt, M, r_h, r_l, &Q_r[1 - i_subfr], wind_length, wind, 0, 0 ); - - /* Lag windowing */ - adapt_lag_wind( r_h, r_l, M, Top[i_subfr], Tnc[i_subfr], Core_sr ); - - /* Levinson-Durbin */ - E_LPC_lev_dur( r_h, r_l, A, LepsP, M, NULL ); - FOR( i = 0; i <= M; i++ ) - { - L_Extract( LepsP[i], &epsP_h[i], &epsP_l[i] ); - } - /*Q_r[... might not be needed from external...*/ - Q_r[1 - i_subfr] = add( Q_r[1 - i_subfr], shl( Q_new, 1 ) ); - move16(); - - /* Conversion of A(z) to LSPs */ - E_LPC_a_lsp_conversion( A, lsp, lsp_old, M ); - - lsp = lsp_new; /* Q15 */ - } - IF( EQ_16( sec_chan_low_rate, 1 ) ) - { - /* LSP interpolation */ -#ifdef REMOVE_EVS_DUPLICATES - int_lsp4_ivas_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); -#else - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, -2 ); -#endif - } - ELSE - { - /* LSP interpolation */ -#ifdef REMOVE_EVS_DUPLICATES - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); -#else - int_lsp4_fx( L_frame, lsp_old, lsp_mid, lsp_new, A, M, 0 ); -#endif - } - Copy( lsp_new, lsp_old, M ); /* Q15 */ - *ener = L_Comp( epsP_h[M], epsP_l[M] ); /* Q_r */ - move32(); - - return; -} -#endif - /*-------------------------------------------------------------------* * analy_lp_AMR_WB() * diff --git a/lib_enc/cod_ace_fx.c b/lib_enc/cod_ace_fx.c index b5c18d44b..e1914aeb5 100644 --- a/lib_enc/cod_ace_fx.c +++ b/lib_enc/cod_ace_fx.c @@ -366,14 +366,9 @@ Word16 coder_acelp_fx( /* o : SEGSNR for CL decision * IF( st->igf != 0 ) { -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate, - st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate ); -#endif + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc, gain_preQ, code_preQ, Q_new, T0, T0_frac, st->coder_type, st->core_brate, + st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); } /*---------------------------------------------------------* diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 3ff99812f..a485a1bf3 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -363,20 +363,15 @@ void encod_gen_voic_fx( exc_fx[i + i_subfr_fx] = round_fx_o( Ltmp, &Overflow ); /* Q0 */ } } + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate ); -#endif + T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. @@ -405,9 +400,11 @@ void encod_gen_voic_fx( hSC_VBR->prev_tilt_code_fx = hLPDmem->tilt_code; /* Q15 */ move16(); } + return; } + void encod_gen_voic_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 speech_fx[], /* i : input speech Qnew -1 */ @@ -763,10 +760,10 @@ void encod_gen_voic_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, - &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, - T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr_fx, gain_pit_fx, gain_code_fx, code_fx, voice_fac_fx, + &voice_factors_fx[i_subfr_fx / L_SUBFR], bwe_exc_fx, gain_preQ_fx, code_preQ_fx, Q_new, + T0_fx, T0_frac_fx, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index dde834b2b..9802dc15b 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -308,13 +308,8 @@ Word16 encod_tran_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ -#ifdef REMOVE_EVS_DUPLICATES - prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); -#else - prep_tbe_exc_fx( L_frame_fx, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate ); -#endif + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. @@ -719,9 +714,9 @@ Word16 encod_tran_ivas_fx( * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], - bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, - st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame_fx, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], + bwe_exc_fx, gain_preQ, code_preQ, Q_new, T0, T0_frac, st_fx->coder_type, st_fx->core_brate, + st_fx->element_mode, st_fx->idchan, st_fx->hBWE_TD != NULL, st_fx->tdm_LRTD_flag ); /*-----------------------------------------------------------------* * Synthesize speech to update mem_syn[]. diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 76640e7a7..f1e6b2193 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1104,12 +1104,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); } -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, *Q_new, Q_r ); -#else - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, - INT_FS_12k8, i, *Q_new, Q_r ); -#endif + analy_lp_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, *Q_new, Q_r ); FOR( Word16 idx = 0; idx < M + 1; idx++ ) { diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 41e409456..938ab9964 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -1140,20 +1140,11 @@ ivas_error ivas_compute_core_buffers_fx( IF( Q_new ) { -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, sub( *Q_new, 1 ), Q_r ); -#else - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, sub( *Q_new, 1 ), Q_r ); -#endif + analy_lp_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, sub( *Q_new, 1 ), Q_r ); } ELSE { -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, -1, Q_r ); - -#else - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, -1, Q_r ); -#endif + analy_lp_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, element_mode, 0, -1, Q_r ); } /*--------------------------------------------------------------* diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index b3c563863..f2b3adece 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -629,11 +629,7 @@ ivas_error front_vad_spar_fx( hFrontVad->q_buffer_12k8 = Q_inp_12k8; move16(); -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, st->element_mode, 0, Q_inp_12k8, Q_r ); -#else - analy_lp_ivas_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, 0 /* <-- sec_chan_low_rate */, Q_inp_12k8, Q_r ); -#endif + analy_lp_fx( inp_12k8_fx, L_FRAME, L_LOOK_12k8, &res_energy_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, st->element_mode, 0, Q_inp_12k8, Q_r ); FOR( Word16 i = 0; i <= M; i++ ) { diff --git a/lib_enc/ivas_td_low_rate_enc_fx.c b/lib_enc/ivas_td_low_rate_enc_fx.c index 77ddb35aa..d10527a24 100644 --- a/lib_enc/ivas_td_low_rate_enc_fx.c +++ b/lib_enc/ivas_td_low_rate_enc_fx.c @@ -365,11 +365,12 @@ void encod_gen_2sbfr( move16(); move16(); } + /*-----------------------------------------------------------------* * Prepare TBE excitation *-----------------------------------------------------------------*/ - prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q_new, T0, T0_frac, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); + prep_tbe_exc_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q_new, T0, T0_frac, coder_type, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR]; /* Q15 */ move16(); @@ -378,6 +379,7 @@ void encod_gen_2sbfr( * Synthesize speech to update mem_syn_flt[]. * Update A(z) filters *-----------------------------------------------------------------*/ + Syn_filt_s( 1, p_Aq, M, &exc[i_subfr], &syn[i_subfr], 2 * L_SUBFR, hLPDmem->mem_syn, 1 ); p_Aw += 2 * ( M + 1 ); p_Aq += 2 * ( M + 1 ); diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index 8fe425d74..b26532b15 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -289,13 +289,16 @@ void lsf_enc_fx( { int_lsp4_fx( st_fx->L_frame, st_fx->lsp_old_fx, lsp_mid, lsp_new, Aq, M, 0 ); } + /*------------------------------------------------------------------* * Check LSF stability (distance between old LSFs and current LSFs) *------------------------------------------------------------------*/ + IF( NE_32( st_fx->core_brate, SID_2k40 ) ) { st_fx->stab_fac_fx = lsf_stab_fx( lsf_new, st_fx->lsf_old_fx, 0, st_fx->L_frame ); } + return; } @@ -1982,7 +1985,7 @@ static void first_VQstages( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ @@ -2172,7 +2175,7 @@ static void first_VQstages_ivas_fx( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index e8d4a0722..cc8b64ca4 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -213,7 +213,7 @@ void pre_proc_fx( /*----------------------------------------------------------------* * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ) ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, (const Word16) ( EQ_16( st->max_bwidth, NB ) ) ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* @@ -414,11 +414,7 @@ void pre_proc_fx( alw_voicing[1] = st->voicing_fx[2]; move16(); -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, EVS_MONO, 0, *Q_new, Q_r ); -#else - analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); -#endif + analy_lp_fx( inp_12k8, L_FRAME, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing, INT_FS_12k8, EVS_MONO, 0, *Q_new, Q_r ); lsp2lsf_fx( lsp_new, lsf_new, M, INT_FS_12k8 ); stab_fac = lsf_stab_fx( lsf_new, st->lsf_old1_fx, 0, L_FRAME ); @@ -1131,11 +1127,7 @@ void pre_proc_fx( Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); } -#ifdef REMOVE_EVS_DUPLICATES - analy_lp_ivas_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, EVS_MONO, 0, *Q_new, Q_r ); -#else - analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, -1 /*IVAS_CODE !! LowRateFlag*/, *Q_new, Q_r ); -#endif + analy_lp_fx( inp_16k, L_FRAME16k, L_look, ener, A, epsP_h, epsP_l, lsp_new, lsp_mid, st->lspold_enc_fx, st->pitch, st->voicing_fx, 16000, EVS_MONO, 0, *Q_new, Q_r ); /*--------------------------------------------------------------* * Compute Weighted Input diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 1d85ae6de..968ab0082 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -41,9 +41,8 @@ #include "ivas_error_utils.h" #include "complex_basop.h" #include "ivas_stat_enc.h" -/*----------------------------------------------------------------------------------* - * Prototypes of RAM counting tool macros - *----------------------------------------------------------------------------------*/ + + ivas_error acelp_core_enc_fx( Encoder_State *st_fx, /* i/o: encoder state structure */ const Word16 inp_fx[], /* i : input signal of the current frame Q_new*/ @@ -68,57 +67,37 @@ ivas_error acelp_core_enc_fx( ); -void analy_lp_ivas_fx( - const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ - const Word16 L_frame, /* i :(q0) length of the frame */ - const Word16 L_look, /* i :(q0) look-ahead */ - Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ - Word16 A[], /* o :(q14) A(z) filter coefficients */ - Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ - Word16 lsp_new[], /* o :(q15) current frame LSPs */ - Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ - Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ - const Word16 Top[2], /* i :(q0) open loop pitch lag */ - const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ - const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ -#ifdef REMOVE_EVS_DUPLICATES - const Word16 element_mode, /* i : element mode */ -#endif - const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ - Word16 Q_new, /*i: stores Q for speech*/ - Word16 *Q_r /*stores q for ener*/ ); - -#ifndef REMOVE_EVS_DUPLICATES void analy_lp_fx( - const Word16 speech[], /* i : pointer to the speech frame Q_new*/ - const Word16 L_frame, /* i : length of the frame Q0*/ - const Word16 L_look, /* i : look-ahead Q0*/ - Word32 *ener, /* o : residual energy from Levinson-Durbin Q_r*/ - Word16 A[], /* o : A(z) filter coefficients Q14*/ - Word16 epsP_h[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 epsP_l[], /* o : LP analysis residual energies for each iteration Q_r*/ - Word16 lsp_new[], /* o : current frame LSPs Q15*/ - Word16 lsp_mid[], /* o : current mid-frame LSPs Q15*/ - Word16 lsp_old[], /* i/o: previous frame unquantized LSPs Q15*/ - const Word16 Top[2], /* i : open loop pitch lag Q0*/ - const Word16 Tnc[2], /* i : open loop pitch gain Q15*/ - const Word32 Core_sr, /* i : Internal core sampling rate Q0*/ - const Word16 sec_chan_low_rate, /* i : flag to signal second channel Q0*/ - Word16 Q_new, - Word16 *Q_r ); -#endif - -void AVQ_cod_fx( /* o: comfort noise gain factor */ - const Word16 xri[], /* i: vector to quantize */ - Word16 xriq[], /* o: quantized normalized vector (assuming the bit budget is enough) */ - const Word16 NB_BITS, /* i: number of allocated bits */ - const Word16 Nsv, /* i: number of subvectors (lg=Nsv*8) */ - const Word16 Q_in_ref /* i: Scaling i */ + const Word16 speech[], /* i :(Q_new) pointer to the speech frame */ + const Word16 L_frame, /* i :(q0) length of the frame */ + const Word16 L_look, /* i :(q0) look-ahead */ + Word32 *ener, /* o :(Q_r) residual energy from Levinson-Durbin */ + Word16 A[], /* o :(q14) A(z) filter coefficients */ + Word16 epsP_h[], /* o :(high part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 epsP_l[], /* o :(low part of epsP(Q_r)) LP analysis residual energies for each iteration */ + Word16 lsp_new[], /* o :(q15) current frame LSPs */ + Word16 lsp_mid[], /* o :(q15) current mid-frame LSPs */ + Word16 lsp_old[], /* i/o:(q15) previous frame unquantized LSPs */ + const Word16 Top[2], /* i :(q0) open loop pitch lag */ + const Word16 Tnc[2], /* i :(q15) open loop pitch gain */ + const Word32 Core_sr, /* i :(q0) Internal core sampling rate */ + const Word16 element_mode, /* i : element mode */ + const Word16 sec_chan_low_rate, /* i :(q0) flag to signal second channel */ + Word16 Q_new, /* i : stores Q for speech */ + Word16 *Q_r /*stores q for ener*/ +); + +/*1 r: comfort noise gain factor */ +void AVQ_cod_fx( + const Word16 xri[], /* i: vector to quantize */ + Word16 xriq[], /* o: quantized normalized vector (assuming the bit budget is enough) */ + const Word16 NB_BITS, /* i: number of allocated bits */ + const Word16 Nsv, /* i: number of subvectors (lg=Nsv*8) */ + const Word16 Q_in_ref /* i: Scaling i */ ); void AVQ_encmux_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 extl, /* i : extension layer */ Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ @@ -130,7 +109,7 @@ void AVQ_encmux_fx( ); void AVQ_encmux_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ const Word16 extl, /* i : extension layer */ Word16 xriq[], /* i/o: rounded subvectors [0..8*Nsv-1] followed by rounded bit allocations [8*Nsv..8*Nsv+Nsv-1] */ @@ -151,15 +130,15 @@ void bw_detect_fx( const Word16 mct_on, /* i : flag MCT mode */ const Word16 Q_spec ); -void core_switching_post_enc_fx( /*done */ - Encoder_State *st_fx, /* i/o: encoder state structure */ - const Word16 inp12k8[], /* i : i signal @12.8 kHz Qinp*/ - const Word16 inp16k[], /* i : i signal @16 kHz Qinp*/ - const Word16 A[], /* i : unquant. LP filter coefs. (Q12) */ - Word16 Qshift, - Word16 Q_new, - const Word16 Qsp, /* i/o : Q from acelp synthsis */ - Word16 *Qmus /* i/o : Q from mdct synthsis / Q of output synthesis */ +void core_switching_post_enc_fx( + Encoder_State *st_fx, /* i/o: encoder state structure */ + const Word16 inp12k8[], /* i : i signal @12.8 kHz Qinp*/ + const Word16 inp16k[], /* i : i signal @16 kHz Qinp*/ + const Word16 A[], /* i : unquant. LP filter coefs. (Q12) */ + Word16 Qshift, + Word16 Q_new, + const Word16 Qsp, /* i/o : Q from acelp synthsis */ + Word16 *Qmus /* i/o : Q from mdct synthsis / Q of output synthesis */ ); void core_switching_pre_enc_fx( @@ -170,8 +149,9 @@ void core_switching_pre_enc_fx( const Word16 last_element_mode /* i : last_element_mode Q0*/ ); -Word16 correlation_shift_fx( /* o : noise dependent voicing correction Q15 */ - const Word16 totalNoise_fx /* i/o: noise estimate over all critical bands Q8 */ +/*! r: noise dependent voicing correction Q15 */ +Word16 correlation_shift_fx( + const Word16 totalNoise_fx /* i/o: noise estimate over all critical bands Q8 */ ); void dtx_fx( diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index c724ffd6c..d0d627697 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -212,13 +212,9 @@ void transition_enc_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { /* this is called only to compute unused bits */ -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, - st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, + st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } *clip_gain = gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, TRANSITION, xn_fx, gp_cl_fx, sub( shift_wsp, 1 ) ); @@ -328,13 +324,9 @@ void transition_enc_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, - unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, + unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } /*-----------------------------------------------------------------* @@ -1040,14 +1032,9 @@ void transition_enc_ivas_fx( IF( EQ_16( *tc_subfr, TC_0_0 ) ) { /* this is called only to compute unused bits */ - -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, - st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + L_FRAME, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, TC_0_0, 3, NULL, unbits_ACELP, + st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } @@ -1158,13 +1145,9 @@ void transition_enc_ivas_fx( IF( LE_16( sub( i_subfr, *tc_subfr ), L_SUBFR ) ) { -#ifdef REMOVE_EVS_DUPLICATES - config_acelp1_IVAS( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#else - config_acelp1( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, -#endif - st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, - unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); + config_acelp1_fx( ENC, st_fx->total_brate, st_fx->core_brate, st_fx->core, st_fx->extl, st_fx->extl_brate, + st_fx->L_frame, -1, &( st_fx->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, -1, *tc_subfr, 2, NULL, + unbits_ACELP, st_fx->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st_fx->idchan, st_fx->active_fr_cnt_fx, 0 /*tdm_Pitch_reuse_flag*/, st_fx->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); } /*-----------------------------------------------------------------* -- GitLab From ac901c58364fb528358a4f130523acb2d166a1a8 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 17 Apr 2025 15:52:49 +0200 Subject: [PATCH 0650/1310] rename file --- Workspace_msvc/lib_dec.vcxproj | 2 +- Workspace_msvc/lib_dec.vcxproj.filters | 6 +- lib_dec/acelp_core_dec_fx.c | 68 +- lib_dec/acelp_core_dec_ivas_fx.c | 2396 ------------------------ lib_dec/ivas_td_low_rate_dec_fx.c | 14 +- 5 files changed, 49 insertions(+), 2437 deletions(-) delete mode 100644 lib_dec/acelp_core_dec_ivas_fx.c diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 2839a5812..12f77b346 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -139,7 +139,7 @@ false - + diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index ebf15bd4c..25079058c 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -119,9 +119,6 @@ decoder_all_c - - decoder_all_c - decoder_all_c @@ -515,6 +512,9 @@ decoder_ivas_c + + decoder_all_c + diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 32aab2bb0..f518ef712 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -79,7 +79,7 @@ ivas_error acelp_core_dec_fx( Word32 synth_fx[960], save_hb_synth_fx[960] /*, bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]*/; Word16 old_exc_fx[L_EXC_DEC], *exc_fx; /* excitation signal buffer */ Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ - Word16 output_frame; /* frame length at output sampling freq. */ + Word16 output_frame; /* frame length at output sampling freq. */ Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ @@ -259,7 +259,7 @@ ivas_error acelp_core_dec_fx( move16(); if ( st->hPFstat != NULL ) { - /* in case of core switching, reset post-filter memories */ + /* in case of core switching, reset post-filter memories */ st->hPFstat->on = 0; move16(); } @@ -277,8 +277,8 @@ ivas_error acelp_core_dec_fx( { /* reset the GSC pre echo energy threshold in case of FEC */ st->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } + move32(); + } test(); test(); @@ -357,10 +357,10 @@ ivas_error acelp_core_dec_fx( test(); /* reset post-filter in case of switching */ if ( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) - { + { st->hPFstat->reset = 1; - move16(); - } + move16(); + } avoid_lpc_burst_on_recovery = 0; move16(); @@ -663,7 +663,7 @@ ivas_error acelp_core_dec_fx( FdCng_decodeSID_fx( st->hFdCngDec->hFdCngCom, st ); } ELSE - { + { Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; move16(); @@ -817,7 +817,7 @@ ivas_error acelp_core_dec_fx( IF( EQ_16( st->element_mode, EVS_MONO ) ) { - /* update st_fx->mem_syn1 for ACELP core switching */ + /* update st_fx->mem_syn1 for ACELP core switching */ Copy( st->mem_syn3_fx, st->mem_syn1_fx, M ); } ELSE @@ -1529,11 +1529,11 @@ ivas_error acelp_core_dec_fx( set16_fx( st->hPFstat->mem_zero, 0, M ); formant_post_filt_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); - } + } ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) - { + { IF( st->hPFstat->on ) - { + { Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf_fx, M ); Copy( psyn_fx, temp_buf_fx + M, L_SUBFR ); @@ -1604,9 +1604,9 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - test(); - test(); - test(); + test(); + test(); + test(); test(); test(); test(); @@ -1626,7 +1626,7 @@ ivas_error acelp_core_dec_fx( { test(); IF( NE_16( st->element_mode, last_element_mode ) && ( st->idchan == 0 ) ) - { + { /* Clear memory for secondary channel CNA */ set16_fx( hStereoCng->olapBufferSynth22_fx, 0, shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ) ); } @@ -1710,8 +1710,8 @@ ivas_error acelp_core_dec_fx( test(); test(); test(); - test(); - test(); + test(); + test(); test(); IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) { @@ -1746,7 +1746,7 @@ ivas_error acelp_core_dec_fx( set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); } IF( hStereoCng != NULL && ( st->idchan == 0 ) ) - { + { set16_fx( hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); } } @@ -1763,26 +1763,26 @@ ivas_error acelp_core_dec_fx( CLDFB_SCALE_FACTOR scaleFactor; Word32 workBuffer[128 * 3]; - /* check if the CLDFB works on the right sample rate */ + /* check if the CLDFB works on the right sample rate */ IF( ( st->cldfbAna->usb * st->cldfbAna->no_col ) != st->L_frame ) - { - /* resample to ACELP internal sampling rate */ + { + /* resample to ACELP internal sampling rate */ Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st->L_frame, FRAMES_PER_SEC ) ); resampleCldfb( st->cldfbAna, newCldfbBands, st->L_frame, 0 ); resampleCldfb( st->cldfbBPF, newCldfbBands, st->L_frame, 0 ); IF( st->ini_frame > 0 ) - { + { st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); + move16(); + } } - } - test(); + test(); IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) { + IF( EQ_16( st->L_frame, L_FRAME ) ) + { retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); } ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) @@ -2091,8 +2091,8 @@ ivas_error acelp_core_dec_fx( imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; move32(); move32(); - } - } + } + } #ifndef OPT_AVOID_STATE_BUF_RESCALE Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); @@ -2147,7 +2147,7 @@ ivas_error acelp_core_dec_fx( scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 st->cldfbSyn->Q_cldfb_state = Q10; - move16(); + move16(); } /* save synthesis - needed in case of core switching */ @@ -2159,10 +2159,10 @@ ivas_error acelp_core_dec_fx( /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ FOR( i = 0; i < st->L_frame; i++ ) - { + { syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); move32(); - } + } Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 @@ -2340,7 +2340,7 @@ ivas_error acelp_core_dec_fx( non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); } ELSE - { + { Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc diff --git a/lib_dec/acelp_core_dec_ivas_fx.c b/lib_dec/acelp_core_dec_ivas_fx.c deleted file mode 100644 index 2c72bba78..000000000 --- a/lib_dec/acelp_core_dec_ivas_fx.c +++ /dev/null @@ -1,2396 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -/*==================================================================================== - EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0 - ====================================================================================*/ -#include -#include -#include -#include "options.h" -#include "cnst.h" -#include "rom_com.h" -#include "prot_fx.h" -#include "ivas_cnst.h" -#include "ivas_rom_com.h" -#include "wmc_auto.h" -#include "ivas_prot_fx.h" - - -/*-------------------------------------------------------------------* - * acelp_core_dec_fx() - * - * ACELP core decoder - *-------------------------------------------------------------------*/ - -ivas_error acelp_core_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - Word16 output_fx[], /* o : synthesis @internal Fs Q_syn*/ - Word16 synth_fx16[], /* o : synthesis Q_syn2*/ - Word16 save_hb_synth_fx16[], /* o : HB synthesis Q0*/ - Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation 2*Q_exc*/ - Word16 *voice_factors_fx, /* o : voicing factors Q15*/ - Word16 old_syn_12k8_16k_fx[], /* o : intermediate ACELP synthesis at 12.8kHz or 16kHz to be used by SWB BWE Q_syn2-1*/ - const Word16 sharpFlag, /* i : formant sharpening flag */ - Word16 pitch_buf_fx[NB_SUBFR16k], /* o : Word16 pitch for each subframe Q6*/ - Word16 *unbits, /* o : number of unused bits */ - Word16 *sid_bw, /* o : 0-NB/WB, 1-SWB SID */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle Qlog2(2.56)*/ - const Word16 tdm_lspQ_PCh_fx[M], /* i : Q LSPs for primary channel Q15*/ - const Word16 tdm_lsfQ_PCh_fx[M], /* i : Q LSFs for primary channel */ - const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const Word16 last_element_mode, /* i : last element mode */ - const Word32 last_element_brate, /* i : last element bitrate */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - const Word16 nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const Word16 read_sid_info /* i : read SID info flag */ -) -{ - Word32 synth_fx[960], save_hb_synth_fx[960] /*, bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]*/; - Word16 old_exc_fx[L_EXC_DEC], *exc_fx; /* excitation signal buffer */ - Word16 syn_tmp_fx[L_FRAME16k + L_SUBFR], *psyn_fx; /* synthesis signal buffer */ - Word16 output_frame; /* frame length at output sampling freq. */ - Word16 lsf_new_fx[M]; /* LSFs at the end of the frame Qlog2(2.56) */ - Word16 lsp_new_fx[M]; /* LSPs at the end of the frame Q15 */ - Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ - Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ - Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ - Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ - Word32 enr_q_fx; /* E information for FER protection */ - Word16 tmp_noise_fx; /* Long term temporary noise energy */ - Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ - Word16 FEC_pitch_fx; /* FEC pitch */ - Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ - Word16 *bwe_exc_fx; /* Excitation for SWB TBE */ - Word16 i, j, int_fs; - Word16 tc_subfr; - Word16 allow_cn_step; - Word16 temp_buf_fx[L_FRAME16k + L_SYN_MEM]; - Word16 last_pulse_pos; - Word16 T0_tmp; - Word16 do_WI; - Word16 dct_buffer_fx[DCT_L_POST]; - Word16 exc_buffer_fx[DCT_L_POST]; - Word16 dct_exc_tmp_fx[L_FRAME16k]; - Word16 nb_bits; /* number of bits */ - Word16 indice; /* parameter indices to write */ - Word16 gain_buf_fx[NB_SUBFR16k]; - Word16 syn_fx_tmp2[L_FRAME_16k]; - Word16 pitch_buf_tmp[NB_SUBFR16k]; - Word16 update_flg; - Word32 q_env_fx[20]; - Word16 exc3_fx[L_FRAME16k]; - Word16 syn1_tmp_fx[L_FRAME16k + 2], *syn1_fx; - Word32 *realBuffer_fx[CLDFB_NO_COL_MAX], *imagBuffer_fx[CLDFB_NO_COL_MAX]; - Word32 realBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word16 LSF_Q_prediction; /* LSF prediction mode */ - Word16 avoid_lpc_burst_on_recovery; - Word16 tmpF_fx; - Word16 uc_two_stage_flag; - Word16 tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag; - Word16 *old_exc_s_fx; /* Start of last excitation frame */ - Word16 *p_tdm_Pri_pitch_buf_fx; - Word16 tmp, exp, local_element_mode; - ivas_error error; - Word32 bpf_error_signal_fx[L_FRAME16k]; - Word16 bpf_error_signal_16fx[L_FRAME16k]; - Word16 Q_real; - Word32 max_real, max_imag, max_val; - - set32_fx( bpf_error_signal_fx, 0, L_FRAME16k ); - set16_fx( bpf_error_signal_16fx, 0, L_FRAME16k ); - set16_fx( Aq_fx, 0, NB_SUBFR16k * ( M + 1 ) ); - set16_fx( old_bwe_exc_fx, 0, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ) ); - - error = IVAS_ERR_OK; - move32(); - - test(); - test(); - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) - { - /* In MDCT-Stereo DTX with mono output, we can skip CNG for the second channel, except for the first inactive frame following an active period */ - return error; - } - - push_wmops( "acelp_core_dec" ); - - /* output_frame = (int16_t) ( st->output_Fs / FRAMES_PER_SEC ); */ - output_frame = extract_l( Mpy_32_32( st->output_Fs, ONE_BY_FRAMES_PER_SEC_Q31 ) ); - - /*----------------------------------------------------------------* - * stereo SID and CNG frames processing - *----------------------------------------------------------------*/ - - test(); - test(); - IF( LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_16( nchan_out, 2 ) ) - { - IF( EQ_16( st->cng_type, FD_CNG ) ) - { - configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); - - Word16 old_NoiseEstExp; - old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; - move16(); - - /* Only run parameter decoding in SID frames */ - IF( EQ_32( st->core_brate, SID_2k40 ) ) - { - FdCng_decodeSID_ivas_fx( st ); - - Word16 n1, n2; - n1 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART ); - n2 = L_norm_arr( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART ); - - Word16 common_e = s_max( sub( old_NoiseEstExp, n2 ), sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, n1 ) ); - scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, common_e ) ); - scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( old_NoiseEstExp, common_e ) ); - st->hFdCngDec->hFdCngCom->sidNoiseEstExp = common_e; - move16(); - } - - FOR( i = 0; i < NPART; i++ ) - { - st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), - STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); - move32(); - } - - ApplyFdCng_fx( NULL, 0, NULL, 0, NULL, NULL, NULL, st, 0, 0 ); - } - ELSE - { - configureFdCngDec_fx( st->hFdCngDec, st->bwidth, ACELP_14k25, st->L_frame, st->last_L_frame, st->element_mode ); - - /* decode CNG parameters */ - CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); - - /* comfort noise generation */ - CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, NULL, NULL, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), NULL, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, NULL, st->Opt_AMR_WB, st->element_mode ); - - Copy( Aq_fx, st->Aq_cng, M + 1 ); /*Q12*/ - - /* update old LSP and LSF vector */ - Copy( lsf_new_fx, st->lsf_old_fx, M ); /*Qlog2(2.56)*/ - Copy( lsp_new_fx, st->lsp_old_fx, M ); /*Q15*/ - } - - set16_fx( output_fx, 0, output_frame ); /* output and synth are not used in DFT domain CNG generation and the decoder output is unaffected if they are left uninitalized */ - set16_fx( synth_fx16, 0, output_frame ); /* They are however read in a few places which causes errors in the valgrind tests. Simplest solution from a code perspective was to set them to zero. */ - - /* CN generation done in DFT domain */ - pop_wmops(); - - return error; - } - - /*----------------------------------------------------------------* - * Active frames processing - *----------------------------------------------------------------*/ - - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - set32_fx( realBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( imagBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); - realBuffer_fx[i] = realBufferTmp_fx[i]; - imagBuffer_fx[i] = imagBufferTmp_fx[i]; - } - - /*----------------------------------------------------------------* - * Initialization - *----------------------------------------------------------------*/ - - LSF_Q_prediction = -1; - move16(); - set16_fx( syn_tmp_fx, 0, L_SUBFR ); - psyn_fx = syn_tmp_fx + L_SUBFR; - syn1_tmp_fx[0] = 0; - move16(); - syn1_tmp_fx[1] = 0; - move16(); - syn1_fx = syn1_tmp_fx + 2; - st->bpf_off = 0; - move16(); - - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || ( EQ_16( st->element_mode, IVAS_CPE_DFT ) && LE_32( st->last_core_brate, SID_2k40 ) ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && LE_32( st->last_core_brate, SID_2k40 ) ) ) - { - /* in case of HQ->ACELP switching, do not apply BPF */ - st->bpf_off = 1; - move16(); - if ( st->hPFstat != NULL ) - { - /* in case of core switching, reset post-filter memories */ - st->hPFstat->on = 0; - move16(); - } - - if ( st->hGSCDec != NULL ) - { - /* reset the GSC pre echo energy threshold in case of switching */ - st->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } - } - - test(); - if ( st->hGSCDec != NULL && ( st->prev_bfi > 0 ) ) - { - /* reset the GSC pre echo energy threshold in case of FEC */ - st->hGSCDec->Last_frame_ener_fx = MAX_32; - move32(); - } - - test(); - test(); - test(); - test(); - IF( st->hFdCngDec != NULL && ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && ( EQ_32( st->last_core_brate, SID_2k40 ) || st->last_core_brate == FRAME_NO_DATA ) ) - { - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, FFTLEN ); - set16_fx( hStereoCng->olapBufferSynth22_fx, 0, FFTLEN ); - } - - st->clas_dec = st->last_good; - move16(); - enr_q_fx = 0; - move32(); - Es_pred_fx = 0; - move16(); - tmp_noise_fx = 0; - move16(); - Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ - exc_fx = old_exc_fx + L_EXC_MEM_DEC; - - IF( st->hWIDec != NULL ) - { - Copy( st->hWIDec->old_exc2_fx, old_exc2_fx, L_EXC_MEM ); - } - ELSE - { - set16_fx( old_exc2_fx, 0, L_EXC_MEM ); - } - exc2_fx = old_exc2_fx + L_EXC_MEM; - - IF( st->hBWE_TD != NULL ) - { - Copy( st->hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); /*Q_exc*/ - bwe_exc_fx = old_bwe_exc_fx + PIT16k_MAX * 2; - } - ELSE - { - bwe_exc_fx = NULL; - } - - last_pulse_pos = 0; - move16(); - do_WI = 0; - move16(); - st->GSC_noisy_speech = 0; - move16(); - st->relax_prev_lsf_interp = 0; - move16(); - set16_fx( gain_buf_fx, 0, NB_SUBFR16k ); - - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - st->gamma = GAMMA1; - move16(); - st->inv_gamma = GAMMA1_INV; - move16(); - st->preemph_fac = PREEMPH_FAC; - move16(); - int_fs = INT_FS_12k8; - move16(); - } - ELSE - { - st->gamma = GAMMA16k; - move16(); - st->inv_gamma = GAMMA16k_INV; - move16(); - st->preemph_fac = PREEMPH_FAC_16k; - move16(); - int_fs = INT_FS_16k; - move16(); - } - - test(); - /* reset post-filter in case of switching */ - if ( st->hPFstat != NULL && ( st->hPFstat->on == 0 ) ) - { - st->hPFstat->reset = 1; - move16(); - } - - avoid_lpc_burst_on_recovery = 0; - move16(); - test(); - test(); - if ( st->last_con_tcx && NE_16( st->L_frameTCX_past, st->L_frame ) && ( st->last_core != 0 ) ) - { - avoid_lpc_burst_on_recovery = 1; - move16(); - } - test(); - - /* TD stereo parameters */ - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) - { - tdm_lp_reuse_flag = hStereoTD->tdm_lp_reuse_flag; - move16(); - tdm_low_rate_mode = hStereoTD->tdm_low_rate_mode; - move16(); - tdm_Pitch_reuse_flag = hStereoTD->tdm_Pitch_reuse_flag; - move16(); - p_tdm_Pri_pitch_buf_fx = hStereoTD->tdm_Pri_pitch_buf_fx; - } - ELSE - { - tdm_lp_reuse_flag = 0; - move16(); - tdm_low_rate_mode = 0; - move16(); - test(); - if ( EQ_16( st->element_mode, IVAS_SCE ) && st->low_rate_mode ) - { - tdm_low_rate_mode = 1; - move16(); - } - tdm_Pitch_reuse_flag = 0; - move16(); - p_tdm_Pri_pitch_buf_fx = NULL; - } - - /*----------------------------------------------------------------* - * Updates in case of internal sampling rate switching - *----------------------------------------------------------------*/ - - test(); - test(); - IF( NE_16( st->last_L_frame, st->L_frame ) && ( st->last_core == ACELP_CORE || EQ_16( st->last_core, AMR_WB_CORE ) ) ) - { - Word16 dec; - - IF( ( st->hPFstat->on != 0 ) ) - { - Word16 mem_syn_r_size_old, mem_syn_r_size_new; - mem_syn_r_size_old = mult_r( 2048, st->last_L_frame ); /* 1.25/20.f = 2048 (Q15)*/ - mem_syn_r_size_new = mult_r( 2048, st->L_frame ); /* 1.25/20.f = 2048 (Q15)*/ - lerp( st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_stp + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - lerp( st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_old ), st->hPFstat->mem_pf_in + sub( L_SYN_MEM, mem_syn_r_size_new ), mem_syn_r_size_new, mem_syn_r_size_old ); - } - - /* convert quantized LSP vector */ - st->rate_switching_reset = lsp_convert_poly_fx( st->lsp_old_fx, st->L_frame, 0 ); - move16(); - - /* convert old quantized LSF vector */ - lsp2lsf_fx( st->lsp_old_fx, st->lsf_old_fx, M, int_fs ); - - /* FEC - update adaptive LSF mean vector */ - Copy( st->lsf_old_fx, st->lsfoldbfi1_fx, M ); /*Qlog2(2.56)*/ - Copy( st->lsf_old_fx, st->lsfoldbfi0_fx, M ); /*Qlog2(2.56)*/ - Copy( st->lsf_old_fx, st->lsf_adaptive_mean_fx, M ); /*Qlog2(2.56)*/ - - /* Reset LPC mem */ - IF( EQ_32( st->sr_core, INT_FS_16k ) ) - { - Copy( GEWB2_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ - } - ELSE - { - Copy( GEWB_Ave_fx, st->mem_AR_fx, M ); /*Qlog2(2.56)*/ - } - set16_fx( st->mem_MA_fx, 0, M ); - - /* update synthesis filter memories */ - dec = DEC; - move16(); - if ( st->element_mode != EVS_MONO ) - { - dec = DEC_IVAS; - move16(); - } - ivas_synth_mem_updt2_fx( st->L_frame, st->last_L_frame, st->old_exc_fx, st->mem_syn_r, st->mem_syn2_fx, NULL, dec ); - Copy( st->old_exc_fx, old_exc_fx, L_EXC_MEM_DEC ); /*Q_exc*/ - Copy_Scale_sig( st->mem_syn2_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); /*Q-1*/ - Copy( st->mem_syn2_fx, st->mem_syn3_fx, M ); /*Q_syn*/ - } - - /* update buffer of old subframe pitch values */ - IF( NE_16( st->last_L_frame, st->L_frame ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) - { - tmpF_fx = 13107; // Q15 - move16(); - } - ELSE IF( EQ_16( st->last_L_frame, 512 ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE /* st->last_L_frame == L_FRAME16k */ - { - tmpF_fx = 26214; // Q15 - move16(); - } - - FOR( i = NB_SUBFR16k - NB_SUBFR; i < NB_SUBFR16k; i++ ) - { - st->old_pitch_buf_fx[i - 1] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 - move32(); - } - - FOR( i = 2 * NB_SUBFR16k - NB_SUBFR; i < 2 * NB_SUBFR16k; i++ ) - { - st->old_pitch_buf_fx[i - 2] = Mpy_32_16_1( st->old_pitch_buf_fx[i], tmpF_fx ); // Q16 - move32(); - } - } - ELSE - { - exp = 0; - move16(); - IF( EQ_16( st->last_L_frame, L_FRAME32k ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE IF( EQ_16( st->last_L_frame, 512 ) ) - { - tmpF_fx = 20480; // Q15 - move16(); - } - ELSE /* st->last_L_frame == L_FRAME12k8 */ - { - tmpF_fx = 20480; // Q14 - move16(); - exp = 1; - move16(); - } - FOR( i = 2 * NB_SUBFR - 1; i >= NB_SUBFR; i-- ) - { - st->old_pitch_buf_fx[i + 2] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 - move32(); - } - st->old_pitch_buf_fx[NB_SUBFR + 1] = st->old_pitch_buf_fx[NB_SUBFR + 2]; - move32(); - - FOR( i = NB_SUBFR - 1; i >= 0; i-- ) - { - st->old_pitch_buf_fx[i + 1] = Mpy_32_16_1( L_shl( st->old_pitch_buf_fx[i], exp ), tmpF_fx ); // Q15 - move32(); - } - st->old_pitch_buf_fx[0] = st->old_pitch_buf_fx[1]; - move32(); - } - } - - IF( NE_16( st->bfi_pitch_frame, st->L_frame ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) - { - tmpF_fx = 13107; // Q15 - move16(); - } - ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE /* st->bfi_pitch_frame == L_FRAME16k */ - { - tmpF_fx = 26214; // Q15 - move16(); - } - st->bfi_pitch_fx = mult_r( st->bfi_pitch_fx, tmpF_fx ); - move16(); - st->bfi_pitch_frame = L_FRAME; - move16(); - } - ELSE - { - exp = 0; - move16(); - IF( EQ_16( st->bfi_pitch_frame, L_FRAME32k ) ) - { - tmpF_fx = 16384; // Q15 - move16(); - } - ELSE IF( EQ_16( st->bfi_pitch_frame, 512 ) ) - { - tmpF_fx = 20480; // Q15 - move16(); - } - ELSE /* st->bfi_pitch_frame == L_FRAME12k8 */ - { - tmpF_fx = 20480; // Q14 - move16(); - exp = 1; - move16(); - } - - st->bfi_pitch_fx = mult_r( shl_sat( st->bfi_pitch_fx, exp ), tmpF_fx ); - move16(); - st->bfi_pitch_frame = L_FRAME16k; - move16(); - } - } - - test(); - test(); - if ( EQ_16( st->last_bwidth, NB ) && NE_16( st->bwidth, NB ) && ( st->ini_frame != 0 ) ) - { - st->rate_switching_reset = 1; - move16(); - } - - /*----------------------------------------------------------------------* - * GOOD frame - *----------------------------------------------------------------------*/ - - IF( !st->bfi ) - { - - /*----------------------------------------------------------------* - * Decoding of TC subframe classification - *----------------------------------------------------------------*/ - - tc_subfr = -1; - move16(); - IF( EQ_16( st->coder_type, TRANSITION ) ) - { - tc_subfr = tc_classif_fx( st, st->L_frame ); - } - - /*----------------------------------------------------------------* - * Decoding of GSC IVAS mode - *----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - IF( st->element_mode > EVS_MONO && st->idchan == 0 && !( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && !tdm_low_rate_mode ) - { - test(); - test(); - IF( EQ_16( st->coder_type, AUDIO ) || ( EQ_16( st->coder_type, INACTIVE ) && EQ_16( st->inactive_coder_type_flag, 1 ) ) ) - { - st->GSC_IVAS_mode = get_next_indice_fx( st, 2 ); - move16(); - } - } - - /*----------------------------------------------------------------* - * Decoding of inactive CNG frames - *----------------------------------------------------------------*/ - - test(); - IF( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) - { - /* decode CNG parameters */ - IF( st->cng_type == LP_CNG ) - { - CNG_dec_fx( st, last_element_mode, Aq_fx, lsp_new_fx, lsf_new_fx, &allow_cn_step, sid_bw, q_env_fx ); - Copy( Aq_fx, st->Aq_cng, add( M, 1 ) ); - - /* comfort noise generation */ - local_element_mode = st->element_mode; - move16(); - - test(); - test(); - if ( ( EQ_16( nchan_out, 1 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) ) || EQ_16( st->masa_sid_format, 1 ) ) - { - local_element_mode = IVAS_SCE; /* For DFT Stereo mono decoding, run CNG_exc as in SCE */ - move16(); - } - CNG_exc_fx( st->core_brate, st->L_frame, &st->hTdCngDec->Enew_fx, &st->hTdCngDec->cng_seed, exc_fx, exc2_fx, &st->lp_ener_fx, st->last_core_brate, &st->first_CNG, &( st->hTdCngDec->cng_ener_seed ), bwe_exc_fx, allow_cn_step, &st->hTdCngDec->last_allow_cn_step, st->prev_Q_exc, st->Q_exc, st->hTdCngDec->num_ho, q_env_fx, st->hTdCngDec->lp_env_fx, st->hTdCngDec->old_env_fx, st->hTdCngDec->exc_mem_fx, st->hTdCngDec->exc_mem1_fx, sid_bw, &st->hTdCngDec->cng_ener_seed1, exc3_fx, st->Opt_AMR_WB, local_element_mode ); - } - ELSE - { - test(); - IF( EQ_32( st->core_brate, SID_2k40 ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - FdCng_decodeSID_fx( st->hFdCngDec->hFdCngCom, st ); - } - ELSE - { - Word16 old_NoiseEstExp = st->hFdCngDec->hFdCngCom->sidNoiseEstExp; - move16(); - - FdCng_decodeSID_ivas_fx( st ); - - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( old_NoiseEstExp, st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); - Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ), Q2 ) ); // Qx - } - - *sid_bw = 0; - move16(); - } - - IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - assert( nchan_out == 1 ); - - FOR( i = 0; i < NPART; i++ ) - { - st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] = Madd_32_32( Mpy_32_32( STEREO_DFT_FD_FILT_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEstLp[i] ), - STEREO_DFT_FD_FILT_COMP_Q31, st->hFdCngDec->hFdCngCom->sidNoiseEst[i] ); - move32(); - } - - ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - - Word16 new_sidNoiseEstExp = 31 - Q4; - move16(); - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEstLp, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) - Scale_sig32( st->hFdCngDec->hFdCngCom->sidNoiseEst, NPART, sub( st->hFdCngDec->hFdCngCom->sidNoiseEstExp, new_sidNoiseEstExp ) ); // Q(31-sidNoiseEstExp) - st->hFdCngDec->hFdCngCom->sidNoiseEstExp = new_sidNoiseEstExp; - move16(); - Word16 new_cngNoiseLevelExp = 31 - Q4; - move16(); - Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp, new_cngNoiseLevelExp ) ); // Q(31-cngNoiseLevelExp) - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = new_cngNoiseLevelExp; - move16(); - - test(); - ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) ); - - IF( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp < 0 ) - { - Scale_sig32( st->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ); // Q(31-cngNoiseLevelExp) - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 0; - move16(); - } - } - - IF( !read_sid_info ) - { - Word32 noise_lvl_highest_fx; - - noise_lvl_highest_fx = st->hFdCngDec->hFdCngCom->cngNoiseLevel[( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) - 1]; - move32(); - - FOR( Word16 b = ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); b < st->hFdCngDec->hFdCngCom->stopBand; b++ ) - { - st->hFdCngDec->hFdCngCom->cngNoiseLevel[b] = noise_lvl_highest_fx; - move32(); - } - } - - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - generate_comfort_noise_dec_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 2, -1 ); - } - ELSE - { - generate_comfort_noise_dec_ivas_fx( NULL, NULL, NULL, st, &( st->Q_exc ), 1, nchan_out ); - } - - FdCng_exc( st->hFdCngDec->hFdCngCom, &st->CNG_mode, st->L_frame, st->lsp_old_fx, st->first_CNG, st->lspCNG_fx, Aq_fx, lsp_new_fx, lsf_new_fx, exc_fx, exc2_fx, bwe_exc_fx ); - - Copy( exc2_fx, exc3_fx, st->L_frame ); - } - - Word16 delta_mem_scale = 3; - move16(); - test(); - if ( LT_32( st->lp_ener_fx, 40 ) && st->cng_type == LP_CNG ) /* very low energy frames, less than 0.3125 */ - { - delta_mem_scale = 0; - move16(); - } - i = st->Q_exc; - move16(); - - test(); - IF( st->hMusicPF && st->hGSCDec ) - { - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - // VE: TBV: should 'st_fx->L_frame * HIBND_ACB_L_FAC' be corrected in EVS? - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, - st->L_frame * HIBND_ACB_L_FAC, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); - } - ELSE - { - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, - L_FRAME32k, 0, &( st->Q_exc ), st->Q_subfr, NULL, 0, INACTIVE ); - } - } - - IF( st->hPFstat != NULL ) - { - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, - &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 0, 0, NULL ); - } - ELSE - { - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, delta_mem_scale, - &st->mem_deemph_fx, NULL, NULL, &st->agc_mem_fx[1], NULL, 0, 0, NULL ); - } - - Copy_Scale_sig( exc2_fx, exc2_fx, st->L_frame, sub( st->Q_exc, i ) ); // Q_exc - - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) - { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - - /* Update music post processing values */ - /* Filter energies update */ - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - } - ELSE - { - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = add( 9830, mult_r( 22937, st->hMusicPF->filt_lfE_fx[i] ) ); // Q15, 9830 =.3f in Q15, 22937=.7f in Q15 - move16(); - } - } - } - - /* synthesis at 12.8kHz sampling rate */ - move16(); - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - syn_12k8_fx( st->L_frame, Aq_fx, exc3_fx, syn1_fx, st->mem_syn3_fx, 1, st->Q_exc, st->Q_syn ); - - /* reset the decoder */ - CNG_reset_dec_fx( st, pitch_buf_fx, voice_factors_fx ); - - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - /* update st_fx->mem_syn1 for ACELP core switching */ - Copy( st->mem_syn3_fx, st->mem_syn1_fx, M ); - } - ELSE - { - st->Q_syn_cng = st->Q_syn; - move16(); - st->Q_exc_cng = st->Q_exc; - move16(); - - /* update st->mem_syn1 for ACELP core switching */ - Copy_Scale_sig( st->mem_syn3_fx, st->mem_syn1_fx, M, sub( -1, st->Q_syn ) ); // Q(-1) - } - - /* update old synthesis for classification */ - Copy( syn1_fx + st->L_frame - L_SYN_MEM_CLAS_ESTIM, st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - - /* save and delay synthesis to be used by SWB BWE */ - Copy_Scale_sig( syn1_fx, temp_buf_fx, st->L_frame, sub( -1, st->Q_syn ) ); // Q_syn -> Q(-1) - IF( st->hBWE_FD != NULL ) - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } - } - - /*----------------------------------------------------------------* - * Decoding of all other frames - *----------------------------------------------------------------*/ - - ELSE - { - - /*-----------------------------------------------------------------* - * Configure ACELP bit allocation - *-----------------------------------------------------------------*/ - - nb_bits = 0; - move16(); - st->acelp_cfg.FEC_mode = 0; - move16(); - uc_two_stage_flag = 0; - move16(); - - test(); - IF( !st->nelp_mode_dec && !st->ppp_mode_dec ) - { - Word16 tc_subfr_tmp; - - tc_subfr_tmp = tc_subfr; - move16(); - if ( LT_16( tc_subfr_tmp, L_SUBFR ) ) - { - tc_subfr_tmp = 0; - move16(); - } - - if ( EQ_16( tc_subfr, TC_0_192 ) ) - { - nb_bits = -1; - move16(); - } - - config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, st->inactive_coder_type_flag, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); - - test(); - test(); - IF( EQ_16( st->coder_type, TRANSITION ) && LT_16( tc_subfr, L_SUBFR ) && EQ_16( st->L_frame, L_FRAME ) ) - { - config_acelp1_fx( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, TRANSITION, -1, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); - } - } - - /*-----------------------------------------------------------------* - * After CNG period, use the most up-to-date LSPs - *-----------------------------------------------------------------*/ - - test(); - test(); - IF( st->hTdCngDec != NULL && ( st->last_core_brate == FRAME_NO_DATA || EQ_32( st->last_core_brate, SID_2k40 ) ) ) - { - Copy( st->lspCNG_fx, st->lsp_old_fx, M ); /*Q15*/ - lsp2lsf_fx( st->lspCNG_fx, st->lsf_old_fx, M, int_fs ); - } - - /*-----------------------------------------------------------------* - * Reset higher ACELP pre-quantizer in case of switching - *-----------------------------------------------------------------*/ - - IF( !st->use_acelp_preq ) - { - st->mem_preemp_preQ_fx = 0; - move16(); - st->last_nq_preQ = 0; - move16(); - st->last_code_preq = 0; - move16(); - } - - st->use_acelp_preq = 0; - move16(); - - /*-----------------------------------------------------------------* - * LSF de-quantization and interpolation - *-----------------------------------------------------------------*/ - - IF( !tdm_lp_reuse_flag ) - { - lsf_dec_fx( st, tc_subfr, Aq_fx, &LSF_Q_prediction, lsf_new_fx, lsp_new_fx, lsp_mid_fx, tdm_low_rate_mode, tdm_lsfQ_PCh_fx ); - } - ELSE - { - const Word16 *pt_interp_2_fx; - - IF( NE_16( st->active_cnt, 1 ) ) - { - Word16 beta_index; - - beta_index = get_next_indice_fx( st, TDM_IC_LSF_PRED_BITS ); - tdm_SCh_lsf_reuse_fx( DEC, st->element_brate, lsf_new_fx, lsp_new_fx, tdm_lsfQ_PCh_fx, NULL, &beta_index ); - } - ELSE - { - Copy( tdm_lspQ_PCh_fx, lsp_new_fx, M ); - Copy( tdm_lsfQ_PCh_fx, lsf_new_fx, M ); - } - - IF( st->rate_switching_reset ) - { - /* extrapolation in case of unstable LSF convert */ - Copy( lsp_new_fx, st->lsp_old_fx, M ); - Copy( lsf_new_fx, st->lsf_old_fx, M ); - } - - pt_interp_2_fx = interpol_frac_fx; - test(); - if ( EQ_16( tdm_low_rate_mode, 1 ) && GT_16( st->coder_type, UNVOICED ) ) - { - pt_interp_2_fx = interpol_frac2_fx; - } - - IF( EQ_16( st->active_cnt, 1 ) ) - { - Copy( lsp_new_fx, st->lsp_old_fx, M ); - lsp2lsf_fx( lsp_new_fx, st->lsf_old_fx, M, st->sr_core ); - } - - /* LSP interpolation and conversion of LSPs to A(z) */ - int_lsp_fx( st->L_frame, st->lsp_old_fx, lsp_new_fx, Aq_fx, M, pt_interp_2_fx, 0 ); - - /* Check LSF stability (distance between old LSFs and current LSFs) */ - st->stab_fac_fx = lsf_stab_ivas_fx( lsf_new_fx, st->lsf_old_fx, 0, st->L_frame ); - move16(); - } - - test(); - IF( EQ_16( st->last_core, HQ_CORE ) && st->element_mode > EVS_MONO ) - { - /* Prepare ACB memory from last HQ frame */ - old_exc_s_fx = st->old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ); - tmpF_fx = *old_exc_s_fx; - st->mem_deemph_fx = shl_sat( old_exc_s_fx[st->L_frame - 1], st->Q_syn ); /* Q0 -> Q_syn */ - move16(); - PREEMPH_FX( old_exc_s_fx, st->preemph_fac, L_FRAME16k, &tmpF_fx ); - Copy( old_exc_s_fx + sub( st->L_frame, M ), st->mem_syn2_fx, M ); - Scale_sig( st->mem_syn2_fx, M, st->Q_syn ); /* Q0 -> Q_syn */ - Residu3_fx( Aq_fx, old_exc_s_fx, old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, 0 ); - Scale_sig( old_exc_fx + sub( L_EXC_MEM_DEC, st->L_frame ), st->L_frame, st->Q_exc ); /* Q0 -> Q_exc */ - } - - test(); - IF( st->last_core != ACELP_CORE && st->element_mode > EVS_MONO ) - { - /* Prepare ACB memory of old_bwe_exc */ - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC * HIBND_ACB_L_FAC, L_EXC_MEM_DEC ); - } - ELSE - { - lerp( old_exc_fx, old_bwe_exc_fx, L_EXC_MEM_DEC << 1, L_EXC_MEM_DEC ); - } - } - - /*-----------------------------------------------------------------* - * FEC - first good frame after lost frame(s) (possibility to correct the ACB) - *-----------------------------------------------------------------*/ - - IF( st->acelp_cfg.FEC_mode > 0 ) - { - last_pulse_pos = 0; - move16(); - - /* decode the last glottal pulse position */ - T0_tmp = FEC_pos_dec_fx( st, &last_pulse_pos, &enr_q_fx, nb_bits ); - - test(); - test(); - IF( NE_16( st->last_core, HQ_CORE ) || ( EQ_16( st->last_core, HQ_CORE ) && st->last_con_tcx ) ) - { - test(); - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->clas_dec, SIN_ONSET ) && last_pulse_pos != 0 && EQ_16( st->prev_bfi, 1 ) ) - { - FEC_SinOnset_fx( old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, last_pulse_pos, T0_tmp, enr_q_fx, Aq_fx, st->L_frame, st->Q_exc ); - } - ELSE IF( ( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) ) && last_pulse_pos != 0 && EQ_16( st->old_bfi_cnt, 1 ) && st->hWIDec != NULL ) - { - do_WI = FEC_enhACB_fx( st->L_frame, st->last_L_frame, old_exc_fx + L_EXC_MEM_DEC - L_EXC_MEM, T0_tmp, last_pulse_pos, st->bfi_pitch_fx ); - } - } - } - - /*------------------------------------------------------------* - * In case of first frame after an erasure and transition from voiced to unvoiced or inactive - * redo the LPC interpolation - *------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( st->stab_fac_fx == 0 ) && ( st->old_bfi_cnt > 0 ) && NE_16( st->clas_dec, VOICED_CLAS ) && NE_16( st->clas_dec, ONSET ) && ( st->relax_prev_lsf_interp == 0 ) && !( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( st->idchan, 1 ) ) ) - { - int_lsp4_ivas_fx( st->L_frame, st->lsp_old_fx, lsp_mid_fx, lsp_new_fx, Aq_fx, M, 2 ); - } - - /*---------------------------------------------------------------* - * Decoding of the scaled predicted innovation energy - *---------------------------------------------------------------*/ - - IF( nb_bits > 0 ) - { - indice = get_next_indice_fx( st, nb_bits ); - Es_pred_dec_fx( &Es_pred_fx, indice, nb_bits, uc_two_stage_flag ); - } - - /*------------------------------------------------------------* - * Decode excitation according to coding type - *------------------------------------------------------------*/ - - test(); - test(); - IF( tdm_low_rate_mode ) /* tdm stereo low rate mode */ - { - IF( LE_16( st->coder_type, UNVOICED ) ) - { - tdm_low_rate_dec_fx( st, dct_exc_tmp_fx /*, &tmp_noise*/, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx ); - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - ELSE /* GENERIC */ - { - decod_gen_2sbfr_fx( st, sharpFlag, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - } - } - ELSE IF( st->nelp_mode_dec ) - { - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 - st->Q_exc = 0; - move16(); - - /* SC-VBR - NELP frames */ - decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); - - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE IF( EQ_16( st->coder_type, UNVOICED ) ) - { - /* UNVOICED frames */ - decod_unvoiced_fx( st, Aq_fx, Es_pred_fx, uc_two_stage_flag, st->coder_type, &tmp_noise_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, gain_buf_fx ); - - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - ELSE IF( st->ppp_mode_dec ) - { - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 - st->Q_exc = 0; - move16(); - - /* SC-VBR - PPP frames */ - IF( NE_32( ( error = decod_ppp_fx( st, Aq_fx, pitch_buf_fx, exc_fx, exc2_fx, st->bfi, gain_buf_fx, voice_factors_fx, bwe_exc_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } - - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE IF( EQ_16( st->coder_type, TRANSITION ) ) - { - decod_tran_fx( st, st->L_frame, tc_subfr, Aq_fx, Es_pred_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, sharpFlag, gain_buf_fx ); - } - ELSE IF( EQ_16( st->coder_type, AUDIO ) || ( ( st->coder_type == INACTIVE ) && st->inactive_coder_type_flag ) ) - { - /* AUDIO and INACTIVE frames (coded by GSC technology) */ - decod_audio_fx( st, dct_exc_tmp_fx, Aq_fx, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, lsf_new_fx, gain_buf_fx, - tdm_lp_reuse_flag, tdm_low_rate_mode, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ); - - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - ELSE - { - /* GENERIC, VOICED and INACTIVE frames (coded by AVQ technology) */ - IF( NE_32( ( error = decod_gen_voic_fx( st, st->L_frame, sharpFlag, Aq_fx, Es_pred_fx, do_WI, pitch_buf_fx, voice_factors_fx, exc_fx, exc2_fx, bwe_exc_fx, unbits, gain_buf_fx, tdm_Pitch_reuse_flag, p_tdm_Pri_pitch_buf_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - } - } - - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); - - /* save and delay synthesis to be used by SWB BWE */ - IF( st->hBWE_FD != NULL ) - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } - - /*-----------------------------------------------------------------* - * Apply energy matching when switching to inactive frames - *-----------------------------------------------------------------*/ - - Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); - - /*------------------------------------------------------------* - * Decode information and modify the excitation signal of stationary unvoiced frames - *------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - IF( !( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) && NE_16( st->nelp_mode_dec, 1 ) && !( EQ_16( st->element_mode, IVAS_SCE ) && tdm_low_rate_mode ) ) - { - stat_noise_uv_dec_fx( st, lsp_new_fx, lsp_mid_fx, Aq_fx, exc2_fx, uc_two_stage_flag ); - } - - /*------------------------------------------------------------* - * Save filter memory in case the synthesis is redone after scaling - * Synthesis at 12k8 Hz sampling rate - *------------------------------------------------------------*/ - - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) - { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - Copy( st->hMusicPF->dct_post_old_exc_fx, exc_buffer_fx, DCT_L_POST - OFFSET2 ); - } - - test(); - test(); - test(); - IF( ( EQ_16( st->coder_type, AUDIO ) && !st->GSC_noisy_speech ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && EQ_16( st->L_frame, L_FRAME ) ) ) - { - Word16 last_coder_type = st->last_coder_type; - move16(); - - test(); - test(); - test(); - if ( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) ) || ( GE_16( st->GSC_IVAS_mode, 1 ) && ( st->GSC_noisy_speech == 0 ) ) ) - { - last_coder_type = AUDIO; - move16(); - } - - Word16 qdct = 0; - move16(); - - /* Extrapolation of the last future part, windowing and high resolution DCT transform */ - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - // VE: TBV: this is likely a bug in EVS - 'st->last_coder_type' should be replaced by 'st->core_brate' - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_coder_type, st->element_mode, pitch_buf_fx, - st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); - } - ELSE - { - Prep_music_postP_fx( exc_buffer_fx, dct_buffer_fx, st->hMusicPF->filt_lfE_fx, st->last_core, st->element_mode, pitch_buf_fx, st->hMusicPF->LDm_enh_lp_gbin_fx, st->Q_exc, &qdct ); - } - - /* LD music post-filter */ - LD_music_post_filter_fx( st->hMusicPF, dct_buffer_fx, dct_buffer_fx, st->core_brate, &st->hMusicPF->Old_ener_Q, AUDIO, last_coder_type, qdct ); - - /* Inverse DCT transform, retrieval of the aligned excitation, re-synthesis */ - IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBC whether needed in IVAS - { - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ - } - - Post_music_postP_fx( dct_buffer_fx, exc2_fx, st->mem_syn2_fx, st->mem_syn2_fx, Aq_fx, psyn_fx, &st->Q_exc, &st->prev_Q_syn, - &st->Q_syn, st->mem_syn_clas_estim_fx, 0, &st->mem_deemph_fx, st->hBPF->pst_old_syn_fx, - &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, temp_buf_fx, mem_tmp_fx ); - } - ELSE - { - /* Core synthesis at 12.8kHz or 16kHz */ - i = 1; - move16(); - test(); - if ( st->coder_type == INACTIVE && st->element_mode == EVS_MONO ) - { - i = 0; - move16(); - } - - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - Word16 k = 0; - move16(); - test(); - test(); - if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) - { - k = 1; - move16(); - } - - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, - st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, i, k, temp_buf_fx ); - - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); /*Q_syn*/ - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - - IF( st->hMusicPF != NULL ) - { - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( ( 1228 << ( 16 ) ), 22938, st->hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - } - } - - /*------------------------------------------------------------* - * FEC - Estimate the classification information - *------------------------------------------------------------*/ - - FEC_clas_estim_fx( st, st->Opt_AMR_WB, st->L_frame, &st->clas_dec, st->coder_type, pitch_buf_fx, psyn_fx, &st->lp_ener_FER_fx, &st->decision_hyst, - NULL, NULL, NULL, NULL, 0, NULL, st->Q_syn, temp_buf_fx, st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, 0, 0, 0, st->last_core_brate, st->acelp_cfg.FEC_mode ); - - /*------------------------------------------------------------* - * FEC - Estimate pitch - *------------------------------------------------------------*/ - - FEC_pitch_estim_fx( st->Opt_AMR_WB, st->last_core, st->L_frame, st->clas_dec, st->last_good, pitch_buf_fx, st->old_pitch_buf_fx, - &st->bfi_pitch_fx, &st->bfi_pitch_frame, &st->upd_cnt, st->coder_type, st->element_mode ); - - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - - FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); - - test(); - test(); - test(); - test(); - /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - IF( ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && LE_32( st->total_brate, ACELP_7k20 ) ) || EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - frame_ener_fx( st->L_frame, st->clas_dec, psyn_fx, pitch_buf_tmp[( ( st->L_frame ) >> 6 ) - 1], &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); - } - } - - } /* End of GOOD FRAME */ - - /*----------------------------------------------------------------* - * BAD frame - *----------------------------------------------------------------*/ - - ELSE - { - /* SC-VBR */ - if ( EQ_16( st->last_nelp_mode_dec, 1 ) ) - { - st->nelp_mode_dec = 1; - move16(); - } - - test(); - test(); - /* long burst frame erasures */ - if ( GT_16( st->nbLostCmpt, 5 ) && GE_16( st->clas_dec, VOICED_CLAS ) && LT_16( st->clas_dec, INACTIVE_CLAS ) ) - { - st->last_good = VOICED_TRANSITION; - move16(); - } - - /* LSF estimation and A(z) calculation */ - lsf_dec_bfi( MODE1, lsf_new_fx, st->lsf_old_fx, st->lsf_adaptive_mean_fx, NULL, st->mem_MA_fx, st->mem_AR_fx, st->stab_fac_fx, st->last_coder_type, st->L_frame, st->last_good, st->nbLostCmpt, 0, NULL, NULL, NULL, st->hGSCDec->Last_GSC_pit_band_idx, st->Opt_AMR_WB, 0, st->bwidth ); - - FEC_lsf2lsp_interp( st, st->L_frame, Aq_fx, lsf_new_fx, lsp_new_fx ); - IF( EQ_16( st->nelp_mode_dec, 1 ) ) - { - /* SC-VBR */ - Scale_sig( exc_fx - L_EXC_MEM, L_EXC_MEM, negate( st->Q_exc ) ); // Q0 - st->Q_exc = 0; - move16(); - - decod_nelp_fx( st, &tmp_noise_fx, pitch_buf_fx, exc_fx, exc2_fx, voice_factors_fx, bwe_exc_fx, &st->Q_exc, st->bfi, gain_buf_fx ); - FEC_pitch_fx = pitch_buf_fx[3]; - move16(); - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, exc_fx, NULL, st->hGSCDec->last_exc_dct_in_fx, L_FRAME, 0, (Word32) 0, &( st->Q_exc ), st->Q_subfr, exc2_fx, L_FRAME, st->coder_type ); - } - ELSE - { - /* calculation of excitation signal */ - FEC_exc_estim_fx( st, st->L_frame, exc_fx, exc2_fx, dct_exc_tmp_fx, pitch_buf_fx, voice_factors_fx, &FEC_pitch_fx, bwe_exc_fx, lsf_new_fx, &st->Q_exc, &tmp_noise_fx ); - - Rescale_exc( NULL, exc_fx, bwe_exc_fx, st->hGSCDec->last_exc_dct_in_fx, st->L_frame, L_FRAME32k, (Word32) 0, - &( st->Q_exc ), st->Q_subfr, exc2_fx, st->L_frame, st->last_coder_type ); - - tmp_noise_fx = shr_r( st->lp_gainc_fx, 3 ); /*Q0*/ - - /* SC-VBR */ - st->prev_gain_pit_dec_fx = st->lp_gainp_fx; - move16(); - } - - /* synthesis for ACELP core switching and SWB BWE */ - syn_12k8_fx( st->L_frame, Aq_fx, exc_fx, temp_buf_fx, st->mem_syn1_fx, 1, st->Q_exc, -1 ); - - /* save and delay synthesis to be used by SWB BWE */ - IF( st->hBWE_FD != NULL ) - { - save_old_syn_fx( st->L_frame, temp_buf_fx, old_syn_12k8_16k_fx, st->hBWE_FD->old_syn_12k8_16k_fx, st->preemph_fac, &st->hBWE_FD->mem_deemph_old_syn_fx ); - } - - /* Apply energy matching when switching to inactive frames */ - Inac_switch_ematch_fx( exc2_fx, dct_exc_tmp_fx, st->hGSCDec->lt_ener_per_band_fx, st->coder_type, st->inactive_coder_type_flag, st->L_frame, st->Q_exc, st->bfi, st->last_core, st->last_codec_mode, tdm_low_rate_mode, st->element_mode ); - - /* update past excitation signals for LD music post-filter */ - IF( st->hMusicPF != NULL ) - { - Copy( st->hMusicPF->dct_post_old_exc_fx + L_FRAME, st->hMusicPF->dct_post_old_exc_fx, DCT_L_POST - L_FRAME - OFFSET2 ); - Copy( exc2_fx, st->hMusicPF->dct_post_old_exc_fx + ( DCT_L_POST - L_FRAME - OFFSET2 ), L_FRAME ); - - /* Update music post processing values */ - /* Filter energies update */ - FOR( i = 0; i < DCT_L_POST; i++ ) - { - st->hMusicPF->filt_lfE_fx[i] = round_fx( L_mac( 1228 << 16, 22938, st->hMusicPF->filt_lfE_fx[i] ) ); - move16(); - } - - /* Update circular buffer, keep last energy difference unchanged */ - FOR( i = 1; i < MAX_LT; i++ ) - { - st->hMusicPF->LDm_lt_diff_etot_fx[i - 1] = st->hMusicPF->LDm_lt_diff_etot_fx[i]; - move16(); - } - } - - /* synthesis at 12k8 Hz sampling rate */ - /* add extra headroom in case a CNA addition is likely (i.e. st_fx->psf_lp_noise_fx is close to the threshold) */ - Word16 k = 0; - move16(); - test(); - test(); - if ( st->coder_type == INACTIVE && st->flag_cna && GE_16( round_fx( L_shl( st->lp_noise, 1 ) ), 15 << 7 ) ) - { - k = 1; - move16(); - } - - Rescale_mem( st->Q_exc, &st->prev_Q_syn, &st->Q_syn, st->mem_syn2_fx, st->mem_syn_clas_estim_fx, 4, &st->mem_deemph_fx, - st->hBPF->pst_old_syn_fx, &st->hBPF->pst_mem_deemp_err_fx, &st->agc_mem_fx[1], st->hPFstat, 1, k, temp_buf_fx ); - - test(); - IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - Copy( st->mem_syn2_fx, mem_tmp_fx, M ); - } - syn_12k8_fx( st->L_frame, Aq_fx, exc2_fx, psyn_fx, st->mem_syn2_fx, 1, st->Q_exc, st->Q_syn ); - - /* update buffer for classifier */ - IF( st->hWIDec != NULL ) - { - Copy( exc2_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_exc2_fx, L_EXC_MEM ); - Copy( psyn_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_syn2_fx, L_EXC_MEM ); - } - st->prev_Q_exc_fr = st->Q_exc; - move16(); - st->prev_Q_syn_fr = st->Q_syn; - move16(); - Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM_CLAS_ESTIM ), st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ - - test(); - IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) - { - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - - FEC_scale_syn_fx( st->L_frame, &update_flg, st->clas_dec, st->last_good, psyn_fx, pitch_buf_tmp, st->enr_old_fx, enr_q_fx, st->coder_type, LSF_Q_prediction, - &st->scaling_flag, &st->lp_ener_FEC_av, &st->lp_ener_FEC_max, st->bfi, st->total_brate, st->prev_bfi, st->last_core_brate, - exc_fx, exc2_fx, Aq_fx, &st->old_enr_LP, mem_tmp_fx, st->mem_syn2_fx, st->Q_exc, st->Q_syn, st->element_mode, avoid_lpc_burst_on_recovery, 0 ); - } - - /* estimate the pitch-synchronous speech energy per sample to be used when normal operation recovers */ - frame_ener_fx( st->L_frame, st->last_good, psyn_fx, shr( add( FEC_pitch_fx, 32 ), 6 ), &st->enr_old_fx, st->L_frame, st->Q_syn, 3, 0 ); - - IF( NE_16( st->nelp_mode_dec, 1 ) ) - { - /* modify the excitation signal of stationary unvoiced frames */ - stat_noise_uv_mod_fx( st->coder_type, 0, st->lsp_old_fx, lsp_new_fx, lsp_new_fx, Aq_fx, exc2_fx, st->Q_exc, 1, &st->ge_sm_fx, - &st->uv_count, &st->act_count, st->lspold_s_fx, &st->noimix_seed, &st->min_alpha_fx, - &st->exc_pe_fx, st->core_brate, st->bwidth, &st->Q_stat_noise, &st->Q_stat_noise_ge ); - } - } - - IF( st->hBWE_TD != NULL ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - Copy( Aq_fx + 2 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); - } - ELSE - { - Copy( Aq_fx + 3 * ( M + 1 ), st->hBWE_TD->cur_sub_Aq_fx, ( M + 1 ) ); - } - } - - /*--------------------------------------------------------* - * Apply NB postfilter in case of 8kHz output - *--------------------------------------------------------*/ - - test(); - IF( st->last_bwidth == NB && st->hPFstat != NULL ) - { - Copy_Scale_sig( pitch_buf_fx, pitch_buf_tmp, st->nb_subfr, -Q6 ); // Q0 - - IF( st->bwidth == NB ) - { - st->hPFstat->on = 1; - move16(); - nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, st->coder_type, st->BER_detect, 0 ); - } - ELSE - { - st->hPFstat->on = 0; - move16(); - nb_post_filt_fx( st->L_frame, st->hPFstat, &st->psf_lp_noise_fx, tmp_noise_fx, psyn_fx, Aq_fx, pitch_buf_tmp, AUDIO, st->BER_detect, 0 ); - } - } - ELSE - { - st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); - move16(); - } - - /*------------------------------------------------------------------* - * Perform fixed deemphasis through 1/(1 - g*z^-1) - *-----------------------------------------------------------------*/ - - /* update old synthesis buffer - needed for ACELP internal sampling rate switching */ - Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM ), st->mem_syn_r, L_SYN_MEM ); - deemph_fx( psyn_fx, st->preemph_fac, st->L_frame, &( st->mem_deemph_fx ) ); - unscale_AGC( psyn_fx, st->Q_syn, syn_fx_tmp2, st->agc_mem_fx, st->L_frame ); - Copy( syn_fx_tmp2, psyn_fx, st->L_frame ); - IF( st->hTcxDec != NULL ) - { - Copy_Scale_sig( psyn_fx + shr( st->L_frame, 1 ), st->hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, st->Q_syn ) ); /*Q-1*/ - st->hTcxDec->Q_old_syn_Overl = -1; - } - Copy_Scale_sig( psyn_fx + sub( st->L_frame, M + 1 ), st->syn, M + 1, sub( 0, st->Q_syn ) ); /*Q0*/ - - /*------------------------------------------------------------------* - * Formant post-filter - *-----------------------------------------------------------------*/ - - test(); - test(); - test(); - test(); - IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) && ( GT_32( st->core_brate, ACELP_24k40 ) || st->element_mode > EVS_MONO ) && LE_32( st->core_brate, ACELP_32k ) ) - { - st->hPFstat->on = 1; - move16(); - Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); - set16_fx( st->hPFstat->mem_zero, 0, M ); - - formant_post_filt_fx( st->hPFstat, temp_buf_fx + L_SYN_MEM, Aq_fx, psyn_fx, st->L_frame, st->lp_noise, st->total_brate, 0 ); - } - ELSE IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) ) - { - IF( st->hPFstat->on ) - { - Copy( st->hPFstat->mem_pf_in + L_SYN_MEM - M, temp_buf_fx, M ); - Copy( psyn_fx, temp_buf_fx + M, L_SUBFR ); - - Residu3_fx( Aq_fx, temp_buf_fx + M, temp_buf_fx + M + L_SUBFR, L_SUBFR, 1 ); - E_UTIL_synthesis( 1, Aq_fx, temp_buf_fx + M + L_SUBFR, temp_buf_fx, L_SUBFR, st->hPFstat->mem_stp + L_SYN_MEM - M, 0, M ); - scale_st_fx( psyn_fx, temp_buf_fx, &st->hPFstat->gain_prec, L_SUBFR ); - Copy( temp_buf_fx, psyn_fx, ( L_SUBFR >> 1 ) ); - blend_subfr2_fx( temp_buf_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2, psyn_fx + L_SUBFR / 2 ); - } - st->hPFstat->on = 0; - move16(); - } - - /*----------------------------------------------------------------* - * Comfort noise addition - *----------------------------------------------------------------*/ - - test(); - test(); - IF( ( st->hFdCngDec != NULL || EQ_16( st->idchan, 1 ) ) && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - test(); - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) || st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) - { - /*VAD only for non inactive frame*/ - test(); - st->VAD = st->VAD && st->coder_type != INACTIVE; - move16(); - test(); - test(); - test(); - test(); - test(); - IF( st->idchan == 0 && ( st->flag_cna || ( EQ_16( st->cng_type, FD_CNG ) && LE_32( st->total_brate, ACELP_32k ) ) || ( st->cng_type == LP_CNG && LE_32( st->core_brate, SID_2k40 ) ) ) ) - { - /*Noisy speech detector*/ - noisy_speech_detection_fx( st->hFdCngDec, st->VAD, psyn_fx, st->Q_syn ); - - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = mult_r( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 32440 /*0.99 Q15*/ ); - move16(); - IF( st->hFdCngDec->hFdCngCom->flag_noisy_speech != 0 ) - { - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = add( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech, 328 /*0.01 Q15*/ ); - move16(); - } - move32(); - } - - if ( st->idchan == 0 ) - { - st->lp_noise = st->hFdCngDec->lp_noise; - move32(); - } - - test(); - IF( NE_16( st->element_mode, IVAS_CPE_TD ) && !st->cng_ism_flag ) - { - /* Noise estimate */ - ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - } - - IF( !st->cna_dirac_flag ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - /* CNA: Generate additional comfort noise to mask potential coding artefacts */ - IF( st->flag_cna && !( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) - { - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) - { - IF( hStereoCng->flag_cna_fade ) - { - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); - hStereoCng->flag_cna_fade = 0; - move16(); - } - ELSE - { - test(); - IF( NE_16( st->element_mode, last_element_mode ) && ( st->idchan == 0 ) ) - { - /* Clear memory for secondary channel CNA */ - set16_fx( hStereoCng->olapBufferSynth22_fx, 0, shr( st->hFdCngDec->hFdCngCom->frameSize, 1 ) ); - } - - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 0, hStereoCng, nchan_out ); - } - } - ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); - } - ELSE - { - IF( st->idchan == 0 ) - { - IF( NE_16( st->element_mode, last_element_mode ) ) - { - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - - Word32 psyn_32_fx[L_FRAME16k]; - Copy_Scale_sig_16_32_no_sat( psyn_fx, psyn_32_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( Q6, st->Q_syn ) ); // Q6 - Copy_Scale_sig_16_32_no_sat( st->hFdCngDec->hFdCngCom->olapBufferSynth2, st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), Q15 ); // Q15 - - generate_masking_noise_ivas_fx( psyn_32_fx, &exp, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0, 0, 0, st->element_mode, hStereoCng, nchan_out ); - - Copy_Scale_sig_32_16( psyn_32_fx, psyn_fx, st->hFdCngDec->hFdCngCom->frameSize, sub( st->Q_syn, exp ) ); // Q = st->Q_syn - Copy_Scale_sig_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth2_fx, st->hFdCngDec->hFdCngCom->olapBufferSynth2, shl( st->hFdCngDec->hFdCngCom->frameSize, 1 ), -Q15 ); // Q0 - } - } - } - } - ELSE IF( st->flag_cna && EQ_16( st->coder_type, AUDIO ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) - { - test(); - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) && EQ_16( nchan_out, 2 ) ) - { - generate_stereo_masking_noise_fx( psyn_fx, st->Q_syn, st, hStereoTD, flag_sec_CNA, 1, hStereoCng, nchan_out ); - hStereoCng->flag_cna_fade = 1; - move16(); - } - ELSE - { - FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) - { - psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), negate( st->Q_syn ) ) ); - move16(); - } - } - } - ELSE - { - IF( hStereoCng != NULL ) - { - hStereoCng->flag_cna_fade = 1; - move16(); - hStereoCng->enableSecCNA = 0; - move16(); - } - } - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - test(); - test(); - test(); - /*Noise estimate*/ - IF( ( st->idchan == 0 ) && ( EQ_16( nchan_out, 2 ) || ( st->core_brate != FRAME_NO_DATA && NE_32( st->core_brate, SID_2k40 ) ) ) ) - { - ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - } - } - } - } - - IF( !st->cna_dirac_flag ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( st->flag_cna == 0 ) && EQ_16( st->L_frame, L_FRAME16k ) && EQ_16( st->last_flag_cna, 1 ) && ( ( st->last_core == ACELP_CORE && !( EQ_16( st->last_coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->Last_GSC_noisy_speech_flag ) ) ) || EQ_16( st->last_core, AMR_WB_CORE ) ) ) - { - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - // VE: TBV - is it correct in EVS? in FLP, it is: - // v_multc( st->hFdCngDec->hFdCngCom->olapBufferSynth2 + 5 * st->L_frame / 4, 256.f, temp_buf, st->L_frame / 2 ); - // v_add( temp_buf, syn, syn, st->L_frame / 2 ); - FOR( i = 0; i < st->L_frame / 2; i++ ) - { - psyn_fx[i] = add( psyn_fx[i], shr_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * st->L_frame / 4], negate( st->Q_syn ) ) ); - move16(); - } - } - ELSE - { - FOR( i = 0; i < ( st->hFdCngDec->hFdCngCom->frameSize ) / 2; i++ ) - { - psyn_fx[i] = add( psyn_fx[i], shr_r( mult_r( st->hFdCngDec->hFdCngCom->olapBufferSynth2[i + 5 * ( st->hFdCngDec->hFdCngCom->frameSize / 4 )], st->hFdCngDec->hFdCngCom->fftlenFac ), -st->Q_syn ) ); - move16(); - } - } - } - - test(); - test(); - test(); - IF( ( st->flag_cna == 0 ) || ( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) - { - IF( st->idchan == 0 ) - { - set16_fx( st->hFdCngDec->hFdCngCom->olapBufferSynth2, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - IF( hStereoCng != NULL && ( st->idchan == 0 ) ) - { - set16_fx( hStereoCng->olapBufferSynth22_fx, 0, st->hFdCngDec->hFdCngCom->fftlen ); - } - } - } - } - - /*----------------------------------------------------------------* - * Resample to the output sampling rate (8/16/32/48 kHz) - * Bass post-filter - *----------------------------------------------------------------*/ - - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - CLDFB_SCALE_FACTOR scaleFactor; - Word32 workBuffer[128 * 3]; - - /* check if the CLDFB works on the right sample rate */ - IF( ( st->cldfbAna->usb * st->cldfbAna->no_col ) != st->L_frame ) - { - /* resample to ACELP internal sampling rate */ - Word16 newCldfbBands = CLDFB_getNumChannels( L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb( st->cldfbAna, newCldfbBands, st->L_frame, 0 ); - resampleCldfb( st->cldfbBPF, newCldfbBands, st->L_frame, 0 ); - - IF( st->ini_frame > 0 ) - { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); - } - } - - test(); - IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); - } - ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) - { - retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); - } - } - - bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, - st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); - - /* analysis of the synthesis at internal sampling rate */ - cldfbAnalysis_fx( st->cldfbAna, realBuffer_fx, imagBuffer_fx, &scaleFactor, psyn_fx, negate( st->Q_syn ), CLDFB_NO_COL_MAX, workBuffer ); - - scaleFactor.hb_scale = scaleFactor.lb_scale; - move16(); - - /* analysis and add the BPF error signal */ - i = 0; - move16(); - if ( st->bpf_off == 0 ) - { - i = CLDFB_NO_COL_MAX; - move16(); - } - - addBassPostFilter_fx( bpf_error_signal_16fx, realBuffer_fx, imagBuffer_fx, st->cldfbBPF, workBuffer, negate( st->Q_syn ), - i, st->cldfbAna->no_col, st->cldfbAna->no_channels, &scaleFactor ); - - /* set output mask for upsampling */ - IF( EQ_16( st->bwidth, NB ) ) - { - /* set NB mask for upsampling */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); - move16(); - } - ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) - { - /* in case of BW switching, re-init to default */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); - } - - /*WB/SWB-FD_CNG*/ - scaleFactor.hb_scale = scaleFactor.lb_scale; - move16(); - - test(); - test(); - test(); - IF( ( ( st->core_brate == FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) - { - generate_comfort_noise_dec_hf_fx( realBuffer_fx, imagBuffer_fx, &scaleFactor.hb_scale, st ); - - st->cldfbSyn->bandsToZero = 0; - move16(); - IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) - { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); - move16(); - } - st->cldfbSyn->lsb = st->cldfbAna->no_channels; - move16(); - } - - /* synthesis of the combined signal */ - st->Q_syn2 = st->Q_syn; - move16(); - cldfbSynthesis_fx( st->cldfbSyn, realBuffer_fx, imagBuffer_fx, &scaleFactor, synth_fx16, negate( st->Q_syn2 ), CLDFB_NO_COL_MAX, workBuffer ); - - /* Bring CLDFB output to Q0 */ - Scale_sig( synth_fx16, output_frame, negate( st->Q_syn2 ) ); - st->Q_syn2 = 0; - move16(); - - /* save synthesis - needed in case of core switching */ - Copy( synth_fx16, st->previoussynth_fx, output_frame ); - } - ELSE - { - /* check if the CLDFB works on the right sample rate */ - IF( NE_16( imult1616( st->cldfbAna->no_channels, st->cldfbAna->no_col ), st->L_frame ) ) - { - resampleCldfb_ivas_fx( st->cldfbAna, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - resampleCldfb_ivas_fx( st->cldfbBPF, L_mult0( st->L_frame, FRAMES_PER_SEC ) ); - - IF( st->ini_frame > 0 ) - { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); - } - } - - /* analyze pitch coherence for bass post-filter */ - Word32 pitch_buf_fx_q20[12]; - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, Q4 ); // Q(x+4) - Word16 lim = shr( st->L_frame, 6 ); - FOR( Word16 lp = 0; lp < lim; lp++ ) - { - pitch_buf_fx_q20[lp] = L_shl( pitch_buf_fx[lp], Q14 ); - move32(); - } - bpf_pitch_coherence_ivas_fx( st, pitch_buf_fx_q20 ); - Scale_sig32( st->old_pitch_buf_fx, 2 * NB_SUBFR16k + 2, -Q4 ); // Qx - - test(); - IF( !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->bpf_off ) ) - { - test(); - IF( NE_16( st->L_frame, st->last_L_frame ) && NE_16( st->last_codec_mode, MODE2 ) ) - { - IF( EQ_16( st->L_frame, L_FRAME ) ) - { - retro_interp5_4_fx( st->hBPF->pst_old_syn_fx ); - } - ELSE IF( EQ_16( st->L_frame, L_FRAME16k ) ) - { - retro_interp4_5_fx( psyn_fx, st->hBPF->pst_old_syn_fx ); - } - } - - bass_psfilter_fx( st->hBPF, st->Opt_AMR_WB, psyn_fx, st->L_frame, pitch_buf_fx, st->bpf_off, - st->stab_fac_fx, &st->stab_fac_smooth_fx, st->coder_type, st->Q_syn, bpf_error_signal_16fx ); - } - - Word32 syn_tmp_32_fx[L_FRAME16k + L_SUBFR], *syn_32_fx; - set32_fx( syn_tmp_32_fx, 0, L_FRAME16k + L_SUBFR ); - syn_32_fx = syn_tmp_32_fx + L_SUBFR; - test(); - IF( NE_16( st->element_mode, IVAS_CPE_DFT ) || use_cldfb_for_dft ) - { - /* analysis of the synthesis at internal sampling rate */ - Word32 realBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 imagBufferSave_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - Word32 *pRealSave_fx[CLDFB_NO_COL_MAX], *pImagSave_fx[CLDFB_NO_COL_MAX]; - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - pRealSave_fx[i] = realBufferSave_fx[i]; - pImagSave_fx[i] = imagBufferSave_fx[i]; - } - IF( st->p_bpf_noise_buf_32 ) - { - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 - } - - FOR( i = 0; i < st->L_frame; i++ ) - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); // Q12 - move32(); - } - - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; - move16(); - - cldfbAnalysis_ivas_fx( syn_32_fx, realBuffer_fx, imagBuffer_fx, -1, st->cldfbAna ); - - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); - /* analysis and add the BPF error signal */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - - q_bpf_error_signal = Q6; - move16(); - Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, st->L_frame, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; - move16(); - tmp = -1; - move16(); - if ( st->bpf_off ) - { - tmp = 0; - move16(); - } - - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx, tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); - - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( ( sub( q_bpf_error_signal, Q10 ) ) ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; - move16(); - /* set output mask for upsampling */ - IF( EQ_16( st->bwidth, NB ) ) - { - /* set NB mask for upsampling */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, 10 ); - move16(); - } - ELSE IF( NE_16( st->cldfbSyn->bandsToZero, sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ) ) ) - { - /* in case of BW switching, re-init to default */ - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); - move16(); - } - test(); - IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); - test(); - /*WB/SWB-FD_CNG*/ - IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) - { - Word16 tmpBufferScale = 0; - move16(); - generate_comfort_noise_dec_hf_ivas_fx( realBuffer_fx, imagBuffer_fx, /*realBuffer, imagBuffer,*/ &tmpBufferScale, st->hFdCngDec->hFdCngCom, st->cng_ism_flag ); - - FOR( i = 0; i < st->hFdCngDec->hFdCngCom->numSlots; i++ ) - { - Scale_sig32( realBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - Scale_sig32( imagBuffer_fx[i] + st->hFdCngDec->hFdCngCom->numCoreBands, sub( st->hFdCngDec->hFdCngCom->regularStopBand, st->hFdCngDec->hFdCngCom->numCoreBands ), sub( add( tmpBufferScale, 15 ), Q31 ) ); // Q0 - } - - IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) - { - st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); - move16(); - } - ELSE - { - st->cldfbSyn->bandsToZero = 0; - move16(); - } - } - } - - IF( save_hb_synth_fx16 != NULL ) - { - /* save and then zero-out lowband */ - max_real = 0; - max_imag = 0; - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - max_val = L_max( max_real, max_imag ); - Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - } -#ifndef OPT_AVOID_STATE_BUF_RESCALE -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) -#endif /* OPT_STEREO_32KBPS_V1 */ - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - realBufferSave_fx[i][j] = realBuffer_fx[i][j]; - imagBufferSave_fx[i][j] = imagBuffer_fx[i][j]; - move32(); - move32(); - IF( LT_16( j, st->hFdCngDec->hFdCngCom->numCoreBands ) && LT_16( i, st->hFdCngDec->hFdCngCom->numSlots ) ) - { - realBuffer_fx[i][j] = 0; - imagBuffer_fx[i][j] = 0; - move32(); - move32(); - } - } - } - -#ifdef OPT_AVOID_STATE_BUF_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSynHB ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, 0, st->cldfbSynHB ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( save_hb_synth_fx, L_FRAME48k, negate( ( sub( Q_real, 1 ) ) ) ); // Q0 - Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - /* restore lowband */ - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - realBuffer_fx[i][j] = realBufferSave_fx[i][j]; - imagBuffer_fx[i][j] = imagBufferSave_fx[i][j]; - move32(); - move32(); - } - } -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - -#ifdef OPT_AVOID_STATE_BUF_RESCALE - cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, 0, st->cldfbSyn ); - Scale_sig32( synth_fx, L_FRAME48k, negate( sub( Q_real, 1 ) ) ); // Q0 - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - } - ELSE - { - /* synthesis of the combined signal */ - max_real = 0; - max_imag = 0; - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - max_val = L_max( max_real, max_imag ); - Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - } -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) -#endif /* OPT_STEREO_32KBPS_V1 */ - st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); - move16(); - -#ifdef OPT_AVOID_STATE_BUF_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, 0, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, st->cldfbSyn ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSyn->Q_cldfb_state = Q10; - move16(); - } - - /* save synthesis - needed in case of core switching */ - Copy32( synth_fx, st->previoussynth_fx_32, output_frame ); // Q0 - } - ELSE - { - Word16 nSamples = NS2SA_FX2( i_mult( st->L_frame, FRAMES_PER_SEC ), FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ); /* IVAS-64: optimization is likely possible here (don't resample the whole frame) */ - - /* analysis of the synthesis at internal sampling rate - needed for DFT stereo -> TD stereo switching */ - FOR( i = 0; i < st->L_frame; i++ ) - { - syn_32_fx[i] = L_shr( L_deposit_h( psyn_fx[i] ), add( 4, st->Q_syn ) ); - move32(); - } - - Word16 offset = sub( st->cldfbAna->p_filter_length, st->cldfbAna->no_channels ); - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, 1 ); // Q12 - st->cldfbAna->Q_cldfb_state = Q12; - move16(); - - cldfbAnalysis_ivas_fx( syn_32_fx + sub( st->L_frame, nSamples ), realBuffer_fx, imagBuffer_fx, nSamples, st->cldfbAna ); - - Scale_sig32( st->cldfbAna->cldfb_state_fx, offset, -1 ); // Q11 - st->cldfbAna->Q_cldfb_state = Q11; - move16(); /* analysis and add the BPF error signal - needed for DFT stereo -> TD stereo switching */ - Word32 tmp_bpf_error_signal_fx[L_FRAME16k]; - Word16 q_bpf_error_signal; - Word16 cldfb_state_offset; - cldfb_state_offset = sub( st->cldfbBPF->p_filter_length, st->cldfbBPF->no_channels ); - - // Get Q-factor - q_bpf_error_signal = Q6; - move16(); - Copy_Scale_sig_16_32_no_sat( bpf_error_signal_16fx, tmp_bpf_error_signal_fx, L_FRAME16k, sub( q_bpf_error_signal, st->Q_syn ) ); // Q6 - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - Scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - Scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, -Q7 ); // Q0 - } - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, sub( q_bpf_error_signal, Q10 ) ); // q_bpf_error_signal (Q6) - st->cldfbBPF->Q_cldfb_state = q_bpf_error_signal; - move16(); - tmp = 0; - move16(); - if ( !st->bpf_off ) - { - tmp = nSamples; - move16(); - } - - addBassPostFilter_ivas_fx( tmp_bpf_error_signal_fx + sub( st->L_frame, nSamples ), tmp, realBuffer_fx, imagBuffer_fx, st->cldfbBPF ); - - Scale_sig32( st->cldfbBPF->cldfb_state_fx, cldfb_state_offset, negate( sub( q_bpf_error_signal, Q10 ) ) ); // Q10 - st->cldfbBPF->Q_cldfb_state = Q10; - move16(); - /* synthesis of the combined signal - needed for DFT stereo -> TD stereo switching */ - max_real = 0; - max_imag = 0; - move32(); - move32(); - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - max_real = L_max( max_real, L_abs( realBuffer_fx[i][j] ) ); - max_imag = L_max( max_imag, L_abs( imagBuffer_fx[i][j] ) ); - } - } - max_val = L_max( max_real, max_imag ); - Q_real = sub( norm_l( max_val ), 3 ) /* Guard bits */; - FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ ) - { - scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real - } -#ifndef OPT_AVOID_STATE_BUF_RESCALE -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) -#endif /* OPT_STEREO_32KBPS_V1 */ -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - -#ifdef OPT_AVOID_STATE_BUF_RESCALE - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), sub( Q10, sub( Q_real, 1 ) ), -10, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), 0, st->cldfbSyn ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSyn->Q_cldfb_state = Q10; - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - IF( st->p_bpf_noise_buf_32 ) - { - Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 - Copy32( bpf_error_signal_fx, st->p_bpf_noise_buf_32, st->L_frame ); - - Scale_sig32( st->p_bpf_noise_buf_32, st->L_frame, sub( Q11, sub( st->Q_syn, 1 ) ) ); // Q11 - } - - set32_fx( synth_fx, 0, output_frame ); - } - - /* Copy output signal */ - Scale_sig( syn_tmp_fx, add( st->L_frame, L_SUBFR ), negate( st->Q_syn ) ); // Q0 - IF( st->element_mode > EVS_MONO ) - { - Copy( psyn_fx, output_fx, st->L_frame ); /*Q_syn*/ - } - - st->Q_syn2 = 0; - move16(); - } - - /*-----------------------------------------------------------------* - * Bandwidth extension 6kHz-7kHz - *-----------------------------------------------------------------*/ - - IF( st->hBWE_zero != NULL ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( EQ_16( st->L_frame, L_FRAME ) && ( st->bwidth != NB ) && GE_16( output_frame, L_FRAME16k ) && - ( EQ_16( st->extl, -1 ) || EQ_16( st->extl, SWB_CNG ) || ( EQ_16( st->extl, WB_BWE ) && st->extl_brate == 0 && NE_16( st->coder_type, AUDIO ) ) ) ) ) - { - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); - } - ELSE - { - Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 - hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); - Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 ); - } - } - ELSE - { - hf_synth_reset_fx( st->hBWE_zero ); - IF( NE_16( st->element_mode, EVS_MONO ) ) // VE: TBV: tmp hack - it is a bug in EVS but condition is here to keep EVS bit-exact for the moment - { - set16_fx( st->hBWE_zero->mem_hp400_fx, 0, 6 ); - } - } - } - - /*-----------------------------------------------------------------* - * Populate parameters for SWB TBE - *-----------------------------------------------------------------*/ - - IF( st->hBWE_TD != NULL ) - { - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( ( !st->bfi && st->prev_bfi ) || ( EQ_16( st->last_vbr_hw_BWE_disable_dec, 1 ) && ( st->vbr_hw_BWE_disable_dec == 0 ) ) || ( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && NE_16( st->last_extl, SWB_TBE ) && NE_16( st->last_extl, WB_TBE ) && NE_16( st->last_extl, FB_TBE ) ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && !st->tdm_LRTD_flag ) ) - { - st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - move32(); - set16_fx( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); - } - - test(); - test(); - test(); - test(); - test(); - IF( !st->ppp_mode_dec && ( st->idchan == 0 || NE_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->idchan, 1 ) && EQ_16( st->element_mode, IVAS_CPE_TD ) && st->tdm_LRTD_flag ) ) ) - { - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - non_linearity_fx( bwe_exc_fx, bwe_exc_extended_fx, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); - } - ELSE - { - Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc - non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); - Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc - } - } - - test(); - if ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) - { - st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; - move32(); - } - } - - /*----------------------------------------------------------------------* - * Updates - *----------------------------------------------------------------------*/ - - updt_dec_fx( st, old_exc_fx, pitch_buf_fx, Es_pred_fx, Aq_fx, lsf_new_fx, lsp_new_fx, voice_factors_fx, old_bwe_exc_fx, gain_buf_fx ); - - test(); - test(); - IF( GT_32( st->core_brate, SID_2k40 ) && st->hTdCngDec != NULL && st->hFdCngDec != NULL ) - { - /* update CNG parameters in active frames */ - IF( EQ_16( st->element_mode, EVS_MONO ) ) - { - cng_params_upd_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, st->hTdCngDec->ho_lsp_circ_fx, - st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate ); - } - ELSE - { - cng_params_upd_ivas_fx( lsp_new_fx, exc_fx, st->L_frame, &st->hTdCngDec->ho_circ_ptr, st->hTdCngDec->ho_ener_circ_fx, &st->hTdCngDec->ho_circ_size, - st->hTdCngDec->ho_lsp_circ_fx, st->Q_exc, DEC, st->hTdCngDec->ho_env_circ_fx, NULL, NULL, NULL, NULL, st->last_active_brate, st->element_mode, - st->hFdCngDec->hFdCngCom->CngBandwidth ); - } - - /* Set 16k LSP flag for CNG buffer */ - st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 0; - move16(); - if ( NE_16( st->L_frame, L_FRAME ) ) - { - st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; - move16(); - } - } - - IF( NE_16( st->element_mode, EVS_MONO ) ) - { - IF( save_hb_synth_fx16 ) - { - Copy_Scale_sig_32_16( save_hb_synth_fx, save_hb_synth_fx16, L_FRAME48k, 0 ); // Q0 - } - Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q_syn2 - } - - pop_wmops(); - return error; -} diff --git a/lib_dec/ivas_td_low_rate_dec_fx.c b/lib_dec/ivas_td_low_rate_dec_fx.c index 8f09c1c7d..6419f8517 100644 --- a/lib_dec/ivas_td_low_rate_dec_fx.c +++ b/lib_dec/ivas_td_low_rate_dec_fx.c @@ -40,6 +40,13 @@ #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" + +/*-------------------------------------------------------------------* + * tdm_low_rate_dec_fx() + * + * Low-bitrate decoder + *-------------------------------------------------------------------*/ + void tdm_low_rate_dec_fx( Decoder_State *st, /* i/o: decoder static memory */ Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ @@ -188,6 +195,7 @@ void tdm_low_rate_dec_fx( return; } + /*---------------------------------------------------------------------* * decod_gen_2sbfr() * @@ -217,12 +225,12 @@ void decod_gen_2sbfr_fx( move32(); Word16 gain_inov = 0; /* Innovation gain */ move16(); - Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ - Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ + Word32 gc_mem[NB_SUBFR - 1]; /* gain_code from previous subframes */ + Word16 gp_mem[NB_SUBFR - 1]; /* gain_pitch from previous subframes */ Word16 voice_fac; /* voicing factor */ Word16 code[2 * L_SUBFR]; /* algebraic codevector */ const Word16 *p_Aq; /* Pointer to frame LP coefficient */ - Word16 *pt_pitch; /* pointer to Word16 pitch */ + Word16 *pt_pitch; /* pointer to Word16 pitch */ Word16 i_subfr; /* tmp variables */ Word16 L_frame; Word16 pitch_limit_flag; -- GitLab From ed6b68d54da95ac03180412a2185a155b8ee1a9c Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 17 Apr 2025 16:04:05 +0200 Subject: [PATCH 0651/1310] clang-format --- lib_enc/lsf_enc_fx.c | 4 ++-- lib_enc/pre_proc_fx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/lsf_enc_fx.c b/lib_enc/lsf_enc_fx.c index b26532b15..23ed7d0c2 100644 --- a/lib_enc/lsf_enc_fx.c +++ b/lib_enc/lsf_enc_fx.c @@ -1985,7 +1985,7 @@ static void first_VQstages( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ @@ -2175,7 +2175,7 @@ static void first_VQstages_ivas_fx( dist[1] = dist_buf + maxC; move16(); - set16_fx( idx_buf, 0, (const Word16) ( 2 * stagesVQ * maxC ) ); + set16_fx( idx_buf, 0, ( const Word16 )( 2 * stagesVQ * maxC ) ); set16_fx( parents, 0, maxC ); /* Set up inital distance vector */ diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index cc8b64ca4..f7ebc8298 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -213,7 +213,7 @@ void pre_proc_fx( /*----------------------------------------------------------------* * Change the sampling frequency to 12.8 kHz *----------------------------------------------------------------*/ - modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, (const Word16) ( EQ_16( st->max_bwidth, NB ) ) ); + modify_Fs_fx( signal_in, input_frame, st->input_Fs, new_inp_12k8, INT_FS_12k8, st->mem_decim_fx, ( const Word16 )( EQ_16( st->max_bwidth, NB ) ) ); Copy( new_inp_12k8, st->buf_speech_enc + L_FRAME32k, L_FRAME ); Scale_sig( st->buf_speech_enc + L_FRAME32k, L_FRAME, 1 ); /*------------------------------------------------------------------* -- GitLab From 99e3a8baf5352b85a3355956f08fe26c0f6f7a62 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 12:38:38 +0200 Subject: [PATCH 0652/1310] deactivcate FIX_1439_SPEEDUP_synthesise_fb_high_band_fx --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index bcee4b8fe..2d587c82a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -91,7 +91,7 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ +//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ -- GitLab From 378f5fab6bad83e506234a3d329864c8ea0660cd Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 14:40:11 +0200 Subject: [PATCH 0653/1310] delete FIX_1439_SPEEDUP_synthesise_fb_high_band_fx wrapped code --- lib_com/swb_tbe_com_fx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 08bbd6362..4dfaa0a5a 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7033,6 +7033,7 @@ void synthesise_fb_high_band_fx( { output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); + } } return; -- GitLab From 0e507b7d884abe27cf73c197c59339377cbdf581 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 15:31:17 +0200 Subject: [PATCH 0654/1310] apply clang patch --- lib_com/swb_tbe_com_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 4dfaa0a5a..08bbd6362 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7033,7 +7033,6 @@ void synthesise_fb_high_band_fx( { output[i] = extract_h( L_shl_sat( L_tmp, tmp3 ) ); /*Qout*/ move16(); - } } return; -- GitLab From 097eff41e0a3e169e135036e69a4f900ea5b3044 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 13 May 2025 14:57:45 +0000 Subject: [PATCH 0655/1310] delete FIX_1439_SPEEDUP_synthesise_fb_high_band_fx from options --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2d587c82a..2ddb2b138 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -91,7 +91,6 @@ #define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -//#define FIX_1439_SPEEDUP_synthesise_fb_high_band_fx /*FhG: reduces WMOPS - bit-exact*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ #define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ #define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ -- GitLab From 98e06bacaad4879d0663e8b751973f92b7f5ae47 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 08:59:14 +0530 Subject: [PATCH 0656/1310] Fix for 3GPP issue 1583: Very high MLD for ParamMC 5.1+4 at 96kbps 16kHz input Link #1583 --- lib_enc/ivas_mc_param_enc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 3058f87f3..7f74f78f9 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -768,8 +768,8 @@ static void ivas_param_mc_param_est_enc_fx( #endif #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE - sub35gb = sub( 35, find_guarded_bits_fx( l_ts ) ); - sub62gb = sub( 62, find_guarded_bits_fx( l_ts ) ); + sub35gb = sub( 32, sub( 11, find_guarded_bits_fx( l_ts ) ) ); // 31 - (((11 - gb) + 31 + norm) - 32) + sub62gb = sub( 63, shl( sub( 11, find_guarded_bits_fx( l_ts ) ), 1 ) ); // 31 - ((2*(11 - gb) + norm) - 32) #endif FOR( ts = start_ts; ts < num_time_slots; ts++ ) -- GitLab From 9600ad0128c5b0bfbc8b9a7c7c904111e2a501c4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 16:15:17 +0530 Subject: [PATCH 0657/1310] Fix for 3GPP issue 1533: Slightly high MLD for one case of MASA LTV EXT output in BASOP decoder Link #1533 --- lib_dec/ivas_stereo_cng_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 6b8a8f949..8ec147ff7 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -1368,8 +1368,8 @@ static void FindEmEs_fx( temp_q = 0; move16(); } - log_res = BASOP_Util_Log2( square_res ); - es_em_fx = Mpy_32_32( log_res, 1616107501 ); // 25+30-31 + log_res = L_add( BASOP_Util_Log2( square_res ), L_shl( temp_q, Q25 ) ); + es_em_fx = Mpy_32_32( log_res, 1616107501 /* 5 * (ln(2)/ln(10)) */ ); // 25+30-31 /* long-term estimate */ *lt_es_em_fx = L_add( Mpy_32_32( 858993459, *lt_es_em_fx ), Mpy_32_32( 1288490188, es_em_fx ) ); /* Q24 */ move32(); -- GitLab From d784008387fe458ba8f6c4fcd8a5943587e80718 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 12:26:14 +0530 Subject: [PATCH 0658/1310] Fix for 3GPP issue 1469: Somewhat high MLD on a single MASA selection test material case with BASOP decoder Link #1469 --- lib_com/prot_fx.h | 2 +- lib_com/stat_noise_uv_mod_fx.c | 58 +++++++++++++++++++--------------- lib_dec/stat_noise_uv_dec_fx.c | 2 +- lib_enc/acelp_core_enc_fx.c | 5 +-- lib_enc/prot_fx_enc.h | 2 +- lib_enc/stat_noise_uv_enc_fx.c | 2 +- 6 files changed, 39 insertions(+), 32 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 43010af04..d5e52e046 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8247,7 +8247,7 @@ void stat_noise_uv_mod_ivas_fx( const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ Word16 *uv_count, /* i/o: unvoiced counter */ diff --git a/lib_com/stat_noise_uv_mod_fx.c b/lib_com/stat_noise_uv_mod_fx.c index 67ca21cd2..c259745f2 100644 --- a/lib_com/stat_noise_uv_mod_fx.c +++ b/lib_com/stat_noise_uv_mod_fx.c @@ -330,7 +330,6 @@ void stat_noise_uv_mod_fx( } } } - /*--------------------------------------------------------------------* * stat_noise_uv_mod() * @@ -345,7 +344,7 @@ void stat_noise_uv_mod_ivas_fx( const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ Word16 *uv_count, /* i/o: unvoiced counter */ @@ -370,8 +369,9 @@ void stat_noise_uv_mod_ivas_fx( Word16 oldlsp_mix[M]; Word16 midlsp_mix[M]; Word16 newlsp_mix[M]; - Word16 beta; /* Q15 */ - Word16 Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ + Word16 beta; /* Q15 */ + Word16 Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ + Word32 L_Noimix_fract; /* (noimix_fac - 1.0) in Q15 */ /* noimix_fax * x <-> x + Noimix_fract * x */ Word16 i_subfr; Word16 i, k; @@ -382,7 +382,8 @@ void stat_noise_uv_mod_ivas_fx( Word32 L_tmp_res, L_tmp, L_tmp3, L_Ge; Word16 En_shift, Tmp; - Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ + Word16 Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ + Word32 L_Exc2_local[L_FRAME]; /* local_copy in scaled Q_local*/ #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); @@ -437,9 +438,9 @@ void stat_noise_uv_mod_ivas_fx( Copy( exc2, Exc2_local, L_FRAME ); /* bound Q for internal use, optimization possible */ - Q_local = s_min( 11, s_max( -1, Q_exc ) ); + Q_local = s_min( 11, s_max( -1, *Q_exc ) ); /* local excitation Q and incoming excitation Q*/ - Qdiff = sub( Q_local, Q_exc ); + Qdiff = sub( Q_local, *Q_exc ); /* only shift if incoming Q is outside [11..-1] shift is done in energy calculations aswell */ Scale_sig( Exc2_local, L_FRAME, Qdiff ); /* current excitation Q and previous stat_noise states Q */ @@ -539,14 +540,11 @@ void stat_noise_uv_mod_ivas_fx( L_tmp_res = L_mac( 0, alpha, alpha ); L_tmp_res = L_mac( L_tmp_res, alpha_m1, alpha_m1 ); tmp_den = round_fx( L_Frac_sqrtQ31( L_tmp_res ) ); - - tmp_nom = sub( 32767, tmp_den ); - tmp_shift = norm_s( tmp_den ); - tmp_den = shl( tmp_den, tmp_shift ); - tmp_res = div_s( tmp_nom, tmp_den ); - - Noimix_fract = shr( tmp_res, tmp_shift ); /* float value is in range 0.0 to 0.42 */ - + Word16 exp_sqr = 0; + move16(); + tmp_res = BASOP_Util_Divide1616_Scale( 32767, tmp_den, &exp_sqr ); // 15-exp_sqr + Noimix_fract = tmp_res; // 15-exp_sqr + move16(); /* L_Ge might be 0 in unvoiced WB */ L_Ge = L_max( L_Ge, 1 ); tmp_shift = norm_l( L_Ge ); @@ -555,9 +553,7 @@ void stat_noise_uv_mod_ivas_fx( L_tmp_res = Mult_32_16( *ge_sm, tmp_res ); /* Q_stat_noise_ge+45-Q_local-Q_ge-tmp_shift-15 */ L_tmp_res = Mult_32_16( L_tmp_res, sub( 32767, beta ) ); /*30-Q_local-tmp_shift+15-15 */ L_tmp_res = L_add_sat( L_shl_sat( L_tmp_res, sub( add( Q_local, tmp_shift ), 15 ) ), beta ); /* Q15 */ - tmp_res = extract_h( L_shl_o( L_tmp_res, 15, &Overflow ) ); /* 15+15-16=14 */ - - Noimix_fract = extract_l( Mult_32_16( L_tmp_res, Noimix_fract ) ); /*15+15-15 */ + L_Noimix_fract = Mult_32_16( L_tmp_res, Noimix_fract ); /*15+15-exp_sqr-15 =15-exp_sqr */ FOR( i = 0; i < L_FRAME; i++ ) { @@ -573,18 +569,27 @@ void stat_noise_uv_mod_ivas_fx( randval = mult_r( 28378, randval ); /* Q downscaled by 2 bits ends up in Q14 */ /*sqrt(12.0f) in Q13*/ randval = extract_l( L_shl( Mult_32_16( L_Ge, randval ), sub( 1, *Q_stat_noise_ge ) ) ); /*Q_local+Q_ge+14-15+1-Q_ge=Q_local */ - L_tmp = L_mult( Exc2_local[i], alpha ); /* Q_local + 16 */ - L_tmp = L_mac( L_tmp, randval, alpha_m1 ); /* Q_local + 16 */ - L_tmp3 = Mult_32_16( L_tmp, Noimix_fract ); /* Q_local+16+15-15 */ - L_tmp = L_add_sat( L_tmp3, L_shl_sat( Mult_32_16( L_tmp, tmp_res ), 1 ) ); /* Q_local+16+14-15+1 */ - Exc2_local[i] = extract_h( L_tmp ); /*Q_local */ + L_tmp = L_mult( Exc2_local[i], alpha ); /* Q_local + 16 */ + L_tmp = L_mac( L_tmp, randval, alpha_m1 ); /* Q_local + 16 */ + L_tmp3 = Mult_32_32( L_tmp, L_Noimix_fract ); /* Q_local+16+15-exp_sqr-15 =Q_local +1 */ + L_Exc2_local[i] = L_add( L_shr( L_tmp3, 1 ), Mpy_32_32( L_tmp, L_tmp_res ) ); // Q_local + 16 +15 -31 = Q_local + move32(); + } + Word32 max_val; + maximum_abs_32_fx( L_Exc2_local, L_FRAME, &max_val ); + Word16 shift = 0; + move16(); + IF( GT_32( max_val, ONE_IN_Q15 ) ) + { + shift = norm_l( max_val ); + shift = sub( Q31 - Q15, shift ); + *Q_exc = sub( Q_local, shift ); // Q_exc = Q_local -shift move16(); } *Q_stat_noise = Q_local; /* update for next call, routine can only be called once every frame */ move16(); - Qdiff = sub( Q_exc, Q_local ); /* local excitation and incoming excitation */ - Scale_sig( Exc2_local, L_FRAME, Qdiff ); - Copy( Exc2_local, exc2, L_FRAME ); + + Copy_Scale_sig_32_16( L_Exc2_local, exc2, L_FRAME, negate( shift ) ); // Q_exc /*--------------------------------------------------------------------* * Generate low-pass filtered version of ISP coefficients @@ -635,6 +640,7 @@ void stat_noise_uv_mod_ivas_fx( } } } + /*---------------------------------------------------------------------------* * calc_tilt() * diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index d2fa36b9b..4e4d7ca30 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -76,7 +76,7 @@ void stat_noise_uv_dec_fx( IF( !st_fx->Opt_AMR_WB ) { - stat_noise_uv_mod_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index ceba860a1..6ba21136e 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -1449,8 +1449,9 @@ ivas_error acelp_core_enc_ivas_fx( { /* exc2 buffer is needed only for updating of Aq[] which is needed for core switching */ Copy( exc_fx, exc2_fx, st->L_frame ); // Q_new - - stat_noise_uv_enc_ivas_fx( st, epsP, lsp_new, lsp_mid, Aq, exc2_fx, uc_two_stage_flag, Q_new ); + Word16 q_exc2 = Q_new; + move16(); + stat_noise_uv_enc_ivas_fx( st, epsP, lsp_new, lsp_mid, Aq, exc2_fx, uc_two_stage_flag, &q_exc2 ); } /*-----------------------------------------------------------------* diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 968ab0082..72137bdce 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -2189,7 +2189,7 @@ void stat_noise_uv_enc_ivas_fx( Word16 *Aq, /* i : A(z) quantized for the 4 subframes Q=12 */ Word16 *exc2, /* i/o: excitation buffer Q=Q_stat_noise */ const Word16 uc_two_stage_flag, /* o : flag undicating two-stage UC */ - Word16 Q_new ); + Word16 *Q_new ); void analy_sp_fx( const Word16 element_mode, /* i : element mode */ diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index 1445559a1..24932542c 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -118,7 +118,7 @@ void stat_noise_uv_enc_ivas_fx( Word16 *Aq, /* i : A(z) quantized for the 4 subframes Q=12 */ Word16 *exc2, /* i/o: excitation buffer Q=Q_stat_noise */ const Word16 uc_two_stage_flag, /* o : flag undicating two-stage UC */ - Word16 Q_new ) + Word16 *Q_new ) { Word16 noisiness = 0; move16(); -- GitLab From 9189bfaf27589723c02d76e3ce20751f18f9c5e3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 12:32:36 +0530 Subject: [PATCH 0659/1310] Clang formatting changes --- lib_com/prot_fx.h | 2 +- lib_dec/stat_noise_uv_dec_fx.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index d5e52e046..85ece0cab 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8247,7 +8247,7 @@ void stat_noise_uv_mod_ivas_fx( const Word16 *lsp_mid, /* i : LSP vector at 2nd sfr Q=15*/ Word16 *Aq, /* o : A(z) quantized for the 4 subframes Q=12*/ Word16 *exc2, /* i/o: excitation buffer Q=Q_exc*/ - Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ + Word16 *Q_exc, /* i : Q of exc2 excitation buffer [11..-1] expected */ const Word16 bfi, /* i : Bad frame indicator */ Word32 *ge_sm, /* i/o: smoothed excitation gain Q=Q_stat_noise_ge (6)*/ Word16 *uv_count, /* i/o: unvoiced counter */ diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index 4e4d7ca30..e2dc1460e 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -77,9 +77,9 @@ void stat_noise_uv_dec_fx( IF( !st_fx->Opt_AMR_WB ) { stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, - st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, - &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); } -- GitLab From e4d93a77b8d75f4b46e2a9b4a0a9cf52b1e38c29 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 16 May 2025 14:45:18 +0530 Subject: [PATCH 0660/1310] Fix for EVS bitexactness issue --- lib_dec/stat_noise_uv_dec_fx.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib_dec/stat_noise_uv_dec_fx.c b/lib_dec/stat_noise_uv_dec_fx.c index e2dc1460e..c87e30ffe 100644 --- a/lib_dec/stat_noise_uv_dec_fx.c +++ b/lib_dec/stat_noise_uv_dec_fx.c @@ -76,10 +76,20 @@ void stat_noise_uv_dec_fx( IF( !st_fx->Opt_AMR_WB ) { - stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, - st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, - &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, - &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + IF( st_fx->element_mode > EVS_MONO ) + { + stat_noise_uv_mod_ivas_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, &st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + } + ELSE + { + stat_noise_uv_mod_fx( coder_type, noisiness, st_fx->lsp_old_fx, lsp_new, lsp_mid, Aq, exc2, st_fx->Q_exc, 0, &st_fx->ge_sm_fx, &st_fx->uv_count, &st_fx->act_count, + st_fx->lspold_s_fx, &st_fx->noimix_seed, &st_fx->min_alpha_fx, + &st_fx->exc_pe_fx, st_fx->core_brate, st_fx->bwidth, + &st_fx->Q_stat_noise, &st_fx->Q_stat_noise_ge ); + } } -- GitLab From a9b30958a324d74b2ecc91462fa31d1a9b2dff1e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 15 May 2025 14:23:40 +0530 Subject: [PATCH 0661/1310] Fix for 3GPP issue 1531: Low-bitrate OMASA shows a bit high MLD (over 10) in BASOP decoder rendering to binaural Link #1531 --- lib_dec/FEC_clas_estim_fx.c | 16 ++++-- .../ivas_dirac_dec_binaural_functions_fx.c | 49 ++++++++++++++---- lib_rend/ivas_dirac_rend_fx.c | 51 ++++++++++++------- 3 files changed, 85 insertions(+), 31 deletions(-) diff --git a/lib_dec/FEC_clas_estim_fx.c b/lib_dec/FEC_clas_estim_fx.c index e56a77be1..2bd38153a 100644 --- a/lib_dec/FEC_clas_estim_fx.c +++ b/lib_dec/FEC_clas_estim_fx.c @@ -285,7 +285,17 @@ void FEC_clas_estim_fx( Corre( &pt1[pos], &pt1[pos - T0], T0, &cor_max[0] ); - T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + IF( NE_16( st_fx->element_mode, EVS_MONO ) ) + { + IF( LT_16( sub( pos, T0 ), sub( L_frame, L_SUBFR ) ) ) + { + T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + } + } + ELSE + { + T0 = mult_r_sat( add_sat( pitch[2], pitch[3] ), 256 ); + } pos_limit = sub( L_frame, L_SUBFR ); j = s_min( 1, s_max( 0, sub( pos, pos_limit ) ) ); Ltmp = L_deposit_l( cor_max[0] ); @@ -725,8 +735,8 @@ void FEC_clas_estim_fx( } /* Do the classification only - - MODE1: when the class is not transmitted in the bitstream - - MODE2: on good frames (classifier is also called for bfi=1) */ + - MODE1: when the class is not transmitted in the bitstream + - MODE2: on good frames (classifier is also called for bfi=1) */ /* update the memory of synthesis for frame class estimation */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 16fefa3bb..c47052d5f 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3584,24 +3584,53 @@ static void matrixTransp1Mul_fx( Word16 chA, chB; Word16 size = i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ); + Word64 tmp_outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word64 tmp_outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 q_tmp_outRe_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word16 q_tmp_outIm_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; + Word64 tmp64_1, tmp64_2; + Word16 tmp16, q_common = 63; + move16(); + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { - outRe_fx[chA][chB] = Madd_32_32( Madd_32_32( Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bre_fx[0][chB] ), - Are_fx[1][chA], Bre_fx[1][chB] ), - Aim_fx[0][chA], Bim_fx[0][chB] ), - Aim_fx[1][chA], Bim_fx[1][chB] ); + tmp64_1 = W_mac_32_32( W_mult_32_32( Are_fx[0][chA], Bre_fx[0][chB] ), Are_fx[1][chA], Bre_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp64_2 = W_mac_32_32( W_mult_32_32( Aim_fx[0][chA], Bim_fx[0][chB] ), Aim_fx[1][chA], Bim_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp_outRe_fx[chA][chB] = W_add( tmp64_1, tmp64_2 ); // Q: add( add( q_A, q_B ), 1 ) + move64(); + tmp16 = W_norm( tmp_outRe_fx[chA][chB] ); + tmp_outRe_fx[chA][chB] = W_shl( tmp_outRe_fx[chA][chB], tmp16 ); // Q:add( tmp16, add( add( q_A, q_B ), 1 ) ) + move64(); + q_tmp_outRe_fx[chA][chB] = add( tmp16, add( add( q_A, q_B ), 1 ) ); + move16(); + q_common = s_min( q_tmp_outRe_fx[chA][chB], q_common ); + + + tmp64_1 = W_mac_32_32( W_mult_32_32( Are_fx[0][chA], Bim_fx[0][chB] ), Are_fx[1][chA], Bim_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp64_2 = W_mac_32_32( W_mult_32_32( Aim_fx[0][chA], Bre_fx[0][chB] ), Aim_fx[1][chA], Bre_fx[1][chB] ); // Q: add( add( q_A, q_B ), 1 ) + tmp_outIm_fx[chA][chB] = W_sub( tmp64_1, tmp64_2 ); // Q: add( add( q_A, q_B ), 1 ) + move64(); + tmp16 = W_norm( tmp_outIm_fx[chA][chB] ); + tmp_outIm_fx[chA][chB] = W_shl( tmp_outIm_fx[chA][chB], tmp16 ); // Q:add( tmp16, add( add( q_A, q_B ), 1 ) ) + move64(); + q_tmp_outIm_fx[chA][chB] = add( tmp16, add( add( q_A, q_B ), 1 ) ); + move16(); + q_common = s_min( q_tmp_outIm_fx[chA][chB], q_common ); + } + } + FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) + { + FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) + { + outRe_fx[chA][chB] = W_extract_h( W_shl( tmp_outRe_fx[chA][chB], sub( q_common, q_tmp_outRe_fx[chA][chB] ) ) ); move32(); - outIm_fx[chA][chB] = Msub_32_32( Msub_32_32( Madd_32_32( Mpy_32_32( Are_fx[0][chA], Bim_fx[0][chB] ), - Are_fx[1][chA], Bim_fx[1][chB] ), - Aim_fx[0][chA], Bre_fx[0][chB] ), - Aim_fx[1][chA], Bre_fx[1][chB] ); + outIm_fx[chA][chB] = W_extract_h( W_shl( tmp_outIm_fx[chA][chB], sub( q_common, q_tmp_outIm_fx[chA][chB] ) ) ); move32(); } } - *q_out = sub( add( q_A, q_B ), 31 ); - + *q_out = sub( q_common, 32 ); move16(); if ( L_and( is_zero_arr( outRe_fx[0], size ), is_zero_arr( outIm_fx[0], size ) ) ) { diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 06b37ff5a..063c70f66 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -1754,7 +1754,7 @@ void protoSignalComputation2_fx( Word32 RealSubtract_fx, ImagSubtract_fx; Word32 left_bb_power_fx, right_bb_power_fx, total_bb_power_fx, lr_bb_power_fx; Word32 left_hi_power_fx, right_hi_power_fx, total_hi_power_fx, lr_hi_power_fx; - Word32 sum_power_fx, Left_power_fx, Right_power_fx; + Word32 sum_power_fx, Left_power_fx, Right_power_fx, Total_power_fx; Word16 q_lr_bb_power, q_lr_hi_power; Word32 lr_total_bb_ratio_fx, lr_total_hi_ratio_fx; Word32 min_sum_total_ratio_fx, min_sum_total_ratio_db_fx; @@ -2120,7 +2120,10 @@ void protoSignalComputation2_fx( #else q_Left_Right_power = add( shl( add( q_cldfb, min_q_shift ), 1 ), sub( head_room, 32 ) ); #endif - + Word16 exp_left_hi_power = 0, exp_right_hi_power = 0, exp_total_hi_power = 0, exp_temppp; + move16(); + move16(); + move16(); FOR( l = 0; l < num_freq_bands; l++ ) { #ifdef FIX_867_CLDFB_NRG_SCALE @@ -2164,19 +2167,30 @@ void protoSignalComputation2_fx( left_bb_power_fx = L_add( left_bb_power_fx, Left_power_fx ); // q_Left_Right_power right_bb_power_fx = L_add( right_bb_power_fx, Right_power_fx ); // q_Left_Right_power // total_bb_power_fx = L_add( total_bb_power_fx, reference_power_fx[l] ); - total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power + total_bb_power_fx = L_add( total_bb_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power #endif - IF( GT_16( l, MASA_HI_FREQ_START_BIN ) ) { - left_hi_power_fx = L_add( left_hi_power_fx, Left_power_fx ); // q_Left_Right_power - right_hi_power_fx = L_add( right_hi_power_fx, Right_power_fx ); // q_Left_Right_power - // total_hi_power_fx = L_add( total_hi_power_fx, reference_power_fx[l] ); -#ifdef FIX_867_CLDFB_NRG_SCALE - total_hi_power_fx = L_add( total_hi_power_fx, W_extract_h( W_shl( reference_power_64fx[l], sub( head_room, total_shift[qidx] ) ) ) ); // q_Left_Right_power -#else - total_hi_power_fx = L_add( total_hi_power_fx, W_extract_h( W_shl( reference_power_64fx[l], head_room ) ) ); // q_Left_Right_power -#endif + W_tmp1 = W_add( W_mult0_32_32( RealBuffer_fx[0][0][l], RealBuffer_fx[0][0][l] ), W_mult0_32_32( ImagBuffer_fx[0][0][l], ImagBuffer_fx[0][0][l] ) ); + q_shift = W_norm( W_tmp1 ); + Left_power_fx = W_extract_h( W_shl( W_tmp1, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + left_hi_power_fx = BASOP_Util_Add_Mant32Exp( left_hi_power_fx, exp_left_hi_power, Left_power_fx, exp_temppp, &exp_left_hi_power ); // exp:exp_left_hi_power + + W_tmp2 = W_add( W_mult0_32_32( RealBuffer_fx[1][0][l], RealBuffer_fx[1][0][l] ), W_mult0_32_32( ImagBuffer_fx[1][0][l], ImagBuffer_fx[1][0][l] ) ); + q_shift = W_norm( W_tmp2 ); + Right_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + right_hi_power_fx = BASOP_Util_Add_Mant32Exp( right_hi_power_fx, exp_right_hi_power, Right_power_fx, exp_temppp, &exp_right_hi_power ); // exp:exp_right_hi_power + + W_tmp2 = W_add( W_tmp1, W_tmp2 ); + q_shift = W_norm( W_tmp2 ); + Total_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + total_hi_power_fx = BASOP_Util_Add_Mant32Exp( total_hi_power_fx, exp_total_hi_power, Total_power_fx, exp_temppp, &exp_total_hi_power ); // exp:exp_total_hi_power } IF( LT_16( l, s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) ) @@ -2185,8 +2199,8 @@ void protoSignalComputation2_fx( re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift[0] ) ); // q_cldfb+temp_q_shift im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift[0] ) ); // q_cldfb+temp_q_shift #else - re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift - im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift + re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift + im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift #endif sum_power_fx = Madd_32_32( Mpy_32_32( re_aux, re_aux ), im_aux, im_aux ); // 2*(q_cldfb+temp_q_shift)-31 @@ -2216,7 +2230,7 @@ void protoSignalComputation2_fx( move32(); } #else - temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31 + temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31 IF( LT_16( q_temp, stereo_type_detect->q_total_power ) ) { stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp ) ) ); // q_temp @@ -2704,15 +2718,16 @@ void protoSignalComputation2_fx( lr_total_bb_ratio_fx = Mpy_32_16_1( temp, 20480 ); // Q21 #ifdef FIX_867_CLDFB_NRG_SCALE - stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); + stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), exp_left_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); move32(); stereo_type_detect->q_left_hi_power = sub( 31, stereo_type_detect->q_left_hi_power ); move16(); - stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power ); + + stereo_type_detect->right_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, right_hi_power_fx ), exp_right_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->right_hi_power_fx ), sub( 31, stereo_type_detect->q_right_hi_power ), &stereo_type_detect->q_right_hi_power ); move32(); stereo_type_detect->q_right_hi_power = sub( 31, stereo_type_detect->q_right_hi_power ); move16(); - stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), sub( 31, q_temp_total ), Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power ); + stereo_type_detect->total_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, total_hi_power_fx ), exp_total_hi_power, Mpy_32_32( b2_fx, stereo_type_detect->total_hi_power_fx ), sub( 31, stereo_type_detect->q_total_hi_power ), &stereo_type_detect->q_total_hi_power ); move32(); #else stereo_type_detect->left_hi_power_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a2_fx, left_hi_power_fx ), sub( 31, q_temp ), Mpy_32_32( b2_fx, stereo_type_detect->left_hi_power_fx ), sub( 31, stereo_type_detect->q_left_hi_power ), &stereo_type_detect->q_left_hi_power ); -- GitLab From 6c05b75d00462181e32686beb85e777c53c5332f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 15 May 2025 17:49:55 +0530 Subject: [PATCH 0662/1310] Fix for 3GPP issue 1517: SBA Decoder: Differences for binaural rendered signals at 64 kbit/s Link #1517 --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index c47052d5f..9ea964bcb 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -1265,12 +1265,14 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric temp64 = W_add( W_mult0_32_32( tempRe, tempRe ), W_mult0_32_32( tempIm, tempIm ) ); // 2q exp1 = W_norm( temp64 ); temp64 = W_shl( temp64, exp1 ); // 2q + exp1 - subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameTotalEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameTotalEne_e[bin] ); + subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameSumEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameSumEne_e[bin] ); move32(); } } FOR( bin = 0; bin < nBins; bin++ ) { + subFrameTotalEne_e[bin] = sub( subFrameTotalEne_e[bin], 1 ); + move16(); temp = L_shl_sat( subFrameTotalEne_fx[bin], sub( subFrameTotalEne_e[bin], subFrameSumEne_e[bin] ) ); // subFrameSumEne_e[bin] IF( GT_32( subFrameSumEne_fx[bin], temp ) ) { -- GitLab From 15b9ec52fb8fdfa82c596a8ac8764ef3bf86c44b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 19 May 2025 11:35:14 +0530 Subject: [PATCH 0663/1310] Removal of unused float functions and replacing C datatypes with Basop Datatypes --- lib_com/bitstream.c | 66 ++--- lib_com/core_com_config.c | 6 +- lib_com/ivas_cnst.h | 8 +- lib_com/longarith.c | 4 +- lib_com/prot_fx.h | 463 +++++++++++++------------------- lib_com/tns_base.c | 82 +----- lib_com/tools.c | 195 +++----------- lib_com/tools_fx.c | 14 +- lib_dec/dec_acelp_tcx_main_fx.c | 2 +- lib_enc/acelp_core_enc_fx.c | 3 - lib_enc/evs_enc_fx.c | 2 +- lib_enc/prot_fx_enc.h | 1 - lib_enc/rom_enc.h | 1 - lib_rend/ivas_rom_rend.h | 4 - lib_rend/ivas_rom_rend_fx.c | 36 --- 15 files changed, 290 insertions(+), 597 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d8d4563ed..385000139 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -100,7 +100,7 @@ static Word16 rate2AMRWB_IOmode( *-------------------------------------------------------------------*/ Word16 rate2EVSmode_float( const Word32 brate, /* i : bitrate */ - int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ + Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ) { if ( is_amr_wb != NULL ) @@ -575,8 +575,8 @@ Word16 get_ivas_max_num_indices_fx( *-----------------------------------------------------------------------*/ /*! r: maximum number of indices */ -int16_t get_BWE_max_num_indices( - const int32_t extl_brate /* i : extensiona layer bitrate */ +Word16 get_BWE_max_num_indices( + const Word32 extl_brate /* i : extensiona layer bitrate */ ) { /* set the maximum number of indices in the BWE */ @@ -787,10 +787,10 @@ Word16 get_ivas_max_num_indices_metadata_fx( void move_indices( INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ - const int16_t nb_indices /* i : number of moved indices */ + const Word16 nb_indices /* i : number of moved indices */ ) { - int16_t i; + Word16 i; if ( new_ind_list < old_ind_list ) { @@ -1092,14 +1092,14 @@ ivas_error push_next_bits( *-------------------------------------------------------------------*/ /*! r: result: index of the indice in the list, -1 if not found */ -int16_t find_indice( +Word16 find_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ + const Word16 id, /* i : ID of the indice */ + UWord16 *value, /* o : value of the quantized indice */ + Word16 *nb_bits /* o : number of bits used to quantize the indice */ ) { - int16_t i; + Word16 i; for ( i = 0; i < hBstr->nb_ind_tot; i++ ) { @@ -1122,12 +1122,12 @@ int16_t find_indice( *-------------------------------------------------------------------*/ /*! r: number of deleted indices */ -uint16_t delete_indice( +UWord16 delete_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id /* i : ID of the indice */ + const Word16 id /* i : ID of the indice */ ) { - int16_t i, j; + Word16 i, j; j = 0; for ( i = 0; i < hBstr->nb_ind_tot; i++ ) @@ -1168,14 +1168,14 @@ uint16_t delete_indice( *-------------------------------------------------------------------*/ /*! r: value of the indice */ -uint16_t get_next_indice( +UWord16 get_next_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { - uint16_t value; - int16_t i; - int32_t nbits_total; + UWord16 value; + Word16 i; + Word32 nbits_total; assert( nb_bits <= 16 ); @@ -1207,11 +1207,11 @@ uint16_t get_next_indice( *-------------------------------------------------------------------*/ /*! r: value of the indice */ -uint16_t get_next_indice_1( +UWord16 get_next_indice_1( Decoder_State *st /* i/o: decoder state structure */ ) { - int32_t nbits_total; + Word32 nbits_total; nbits_total = st->total_brate / FRAMES_PER_SEC; /* detect corrupted bitstream */ if ( ( st->next_bit_pos + 1 > nbits_total && st->codec_mode == MODE1 ) || @@ -1233,7 +1233,7 @@ uint16_t get_next_indice_1( void get_next_indice_tmp( Decoder_State *st, /* o : decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { /* update the position in the bitstream */ @@ -1249,15 +1249,15 @@ void get_next_indice_tmp( *-------------------------------------------------------------------*/ /*! r: value of the indice */ -uint16_t get_indice( +UWord16 get_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t pos, /* i : absolute position in the bitstream (update after the read) */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 pos, /* i : absolute position in the bitstream (update after the read) */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ) { - uint16_t value; - int16_t i; - int32_t nbits_total; + UWord16 value; + Word16 i; + Word32 nbits_total; assert( nb_bits <= 16 ); @@ -1584,9 +1584,9 @@ ivas_error write_indices_ivas_fx( *-------------------------------------------------------------------*/ static void decoder_selectCodec( - Decoder_State *st, /* i/o: decoder state structure */ - const int32_t total_brate, /* i : total bitrate */ - const int16_t bit0 /* i : first bit */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word32 total_brate, /* i : total bitrate */ + const Word16 bit0 /* i : first bit */ ) { /* set the AMR-WB IO flag */ @@ -1724,7 +1724,7 @@ void ivas_set_bitstream_pointers( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { - int16_t k, num_bits; + Word16 k, num_bits; Decoder_State **sts; num_bits = 0; @@ -1734,7 +1734,7 @@ void ivas_set_bitstream_pointers( { sts = st_ivas->hSCE[k]->hCoreCoder; sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (int16_t) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); + num_bits += (Word16) ( st_ivas->hSCE[k]->element_brate / FRAMES_PER_SEC ); } /* set bitstream pointers for CPEs */ @@ -1742,7 +1742,7 @@ void ivas_set_bitstream_pointers( { sts = st_ivas->hCPE[k]->hCoreCoder; sts[0]->bit_stream = st_ivas->bit_stream + num_bits; - num_bits += (int16_t) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); + num_bits += (Word16) ( st_ivas->hCPE[k]->element_brate / FRAMES_PER_SEC ); } return; diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index f75f28a18..152870be7 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -492,12 +492,12 @@ Word16 sr2fscale_fx( return extract_l( Mpy_32_16_1( sr_core, FSCALE_DENOM_BY_12800_Q15 ) ); /*Q0*/ } -int16_t sr2fscale( - const int32_t sr_core /* i : internal sampling rate */ +Word16 sr2fscale( + const Word32 sr_core /* i : internal sampling rate */ ) { - return (int16_t) ( ( FSCALE_DENOM * sr_core ) / 12800 ); + return (Word16) ( ( FSCALE_DENOM * sr_core ) / 12800 ); } Word32 getCoreSamplerateMode2( diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9243b3f50..097ba1789 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -509,8 +509,8 @@ enum #define STEREO_DFT32MS_N_NS FRAME_SIZE_NS /* 20 ms */ #define STEREO_DFT32MS_OVL_NS 3125000L /* 3.125ms - Overlap for the outer edges of windows on decoder */ #define STEREO_DFT32MS_OVL2_NS 9375000L /* 9.375ms - Overlap for the inner edges of windows on decoder */ -#define STEREO_DFT32MS_WIN_CENTER_NS ( int32_t )( ( FRAME_SIZE_NS + STEREO_DFT32MS_OVL_NS ) * 0.5f ) /* 11.5625ms - mid point of the two windows wrt the left edge of overlap */ -#define STEREO_DFT32MS_ZP_NS ( int32_t )( 0.5f * ( STEREO_DFT32MS_N_NS - STEREO_DFT32MS_WIN_CENTER_NS - ( STEREO_DFT32MS_OVL2_NS * 0.5f ) ) ) /* 2 sided zp calculated such that window size is satisfied */ +#define STEREO_DFT32MS_WIN_CENTER_NS ( Word32 )( ( FRAME_SIZE_NS + STEREO_DFT32MS_OVL_NS ) * 0.5f ) /* 11.5625ms - mid point of the two windows wrt the left edge of overlap */ +#define STEREO_DFT32MS_ZP_NS ( Word32 )( 0.5f * ( STEREO_DFT32MS_N_NS - STEREO_DFT32MS_WIN_CENTER_NS - ( STEREO_DFT32MS_OVL2_NS * 0.5f ) ) ) /* 2 sided zp calculated such that window size is satisfied */ #define STEREO_DFT32MS_OVL_MAX NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) #define STEREO_DFT32MS_OVL2_MAX NS2SA( 48000, STEREO_DFT32MS_OVL2_NS ) @@ -799,7 +799,7 @@ enum fea_names #define L_DEC_MEM_LEN_ICA L_NCSHIFTMAX + ( N_MAX_SHIFT_CHANGE + 1 ) + SINC_ORDER1 / INTERP_FACTOR1 #define L_FRAME_DS NS2SA( CORR_INTER_FS, FRAME_SIZE_NS ) #define L_XCORRMEM_DS NS2SA( CORR_INTER_FS, 2 * ( ACELP_LOOK_NS ) ) -#define L_NCSHIFT_DS ( int16_t )( ( ( int32_t )(CORR_INTER_FS) *L_NCSHIFTMAX ) / 48000L ) +#define L_NCSHIFT_DS ( Word16 )( ( ( Word32 )(CORR_INTER_FS) *L_NCSHIFTMAX ) / 48000L ) #define L_SAMPLES_LA_NS 625000L #define L_MEM_RECALC_TBE_16K NS2SA( 16000, L_MEM_RECALC_TBE_NS ) @@ -1446,7 +1446,7 @@ typedef struct { typedef struct { Word32 value[81]; - unsigned short length[81]; + UWord16 length[81]; } HUFF_ELEMENTS; typedef struct { diff --git a/lib_com/longarith.c b/lib_com/longarith.c index 72a763de3..c5ace652c 100644 --- a/lib_com/longarith.c +++ b/lib_com/longarith.c @@ -64,14 +64,14 @@ void longadd( assert( lena >= lenb ); for ( h = 0; h < lenb; h++ ) { - carry += ( (uint32_t) a[h] ) + ( (uint32_t) b[h] ); + carry += ( (UWord32) a[h] ) + ( (UWord32) b[h] ); a[h] = (UWord16) carry; carry = carry >> 16; } for ( ; h < lena; h++ ) { - carry = ( (uint32_t) a[h] ) + carry; + carry = ( (UWord32) a[h] ) + carry; a[h] = (UWord16) carry; carry = carry >> 16; } diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 85ece0cab..f833640e0 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -72,9 +72,6 @@ #define max( x, y ) ( ( x ) > ( y ) ? ( x ) : ( y ) ) #endif -#define log_base_2( x ) ( (double) log( (double) ( x ) ) * 1.4426950408889634074f ) -#define round_f( x ) ( ( ( x ) > 0 ) ? (int32_t) ( ( x ) + 0.5f ) : ( -(int32_t) ( ( -x ) + 0.5f ) ) ) - #ifndef ABSVAL #define ABSVAL( a ) ( ( a ) >= 0 ? ( a ) : ( -( a ) ) ) #endif @@ -1576,19 +1573,19 @@ Word16 gsc_gainQ_fx( ); Word16 gsc_gainQ_ivas_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ const Word16 y_gain4[], /* i : Energy per band */ // Q12 Word16 y_gainQ[], /* o : quantized energy per band */ // Q12 - const int32_t core_brate, /* i : Core rate */ - const int16_t coder_type, /* i : coding type */ - const int16_t bwidth, /* i : input signal bandwidth */ - const int16_t L_frame, /* i : frame length */ - const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const int32_t core_brate_inp /* i : true core bitrate */ + const Word32 core_brate, /* i : Core rate */ + const Word16 coder_type, /* i : coding type */ + const Word16 bwidth, /* i : input signal bandwidth */ + const Word16 L_frame, /* i : frame length */ + const Word16 tdm_LRTD_flag, /* i : LRTD stereo mode flag */ + const Word32 core_brate_inp /* i : true core bitrate */ ); // frame_ener.c @@ -1779,7 +1776,7 @@ void Ener_per_band_comp_ivas_fx( const Word16 Q_exc, /* i : frame length */ const Word16 Mband, /* i : Max band */ const Word16 Eflag, /* i : flag of highest band */ - const int16_t L_frame /* i : frame length */ + const Word16 L_frame /* i : frame length */ ); void Ener_per_band_comp_ivas_fx_2( const Word16 exc_diff_fx[], /* i : target signal Q_exc_diff */ @@ -2633,7 +2630,7 @@ void Interpolate_allpass_steep_fx( void Interpolate_allpass_steep_fx32( const Word32 *in_fx, /* i : input array of size N */ Word32 *mem_fx, /* i/o: memory */ - const int16_t N, /* i : number of input samples */ + const Word16 N, /* i : number of input samples */ Word32 *out_fx /* o : output array of size 2*N */ ); @@ -2647,7 +2644,7 @@ void interpolate_3_over_2_allpass_fx( void interpolate_3_over_2_allpass_fx32( const Word32 *input, /* i : input signal Qx */ - const int16_t len, /* i : number of input samples */ + const Word16 len, /* i : number of input samples */ Word32 *out, /* o : output signal */ Word32 *mem /* i/o: memory */ ); @@ -2931,16 +2928,16 @@ void tbe_celp_exc( ); void tbe_celp_exc_ivas( - const int16_t element_mode, /* i : element mode */ - const int16_t idchan, /* i : channel ID */ - const Word16 L_frame_fx, /* i : Frame lenght */ - const int16_t L_subfr, /* i : subframe length */ - const Word16 i_subfr_fx, /* i : sub frame */ - const Word16 T0_fx, /* i : Integer pitch */ - const Word16 T0_frac_fx, /* i : Fractional part of the pitch */ - Word16 *error_fx, /* i/o: Error */ - Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal */ - const int16_t tdm_LRTD_flag /* i : LRTD stereo mode flag */ + const Word16 element_mode, /* i : element mode */ + const Word16 idchan, /* i : channel ID */ + const Word16 L_frame_fx, /* i : Frame lenght */ + const Word16 L_subfr, /* i : subframe length */ + const Word16 i_subfr_fx, /* i : sub frame */ + const Word16 T0_fx, /* i : Integer pitch */ + const Word16 T0_frac_fx, /* i : Fractional part of the pitch */ + Word16 *error_fx, /* i/o: Error */ + Word16 *bwe_exc_fx, /* i/o: bandwitdh extension signal */ + const Word16 tdm_LRTD_flag /* i : LRTD stereo mode flag */ ); void flip_and_downmix_generic_fx( @@ -3159,8 +3156,8 @@ void GenSHBSynth_fx32( Word32 *shb_syn_speech_32k, /* o : output highband component */ Word32 Hilbert_Mem[], /* i/o: memory */ Word32 state_lsyn_filt_shb_local[], /* i/o: memory */ - const int16_t L_frame, /* i : ACELP frame length */ - int16_t *syn_dm_phase ); + const Word16 L_frame, /* i : ACELP frame length */ + Word16 *syn_dm_phase ); void ScaleShapedSHB_fx( const Word16 length, /* i : SHB overlap length */ @@ -3245,7 +3242,7 @@ void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_ls #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 - const int16_t element_mode, + const Word16 element_mode, #endif Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ @@ -3280,7 +3277,7 @@ void synthesise_fb_high_band_fx( Word16 Qout #ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , - int16_t element_mode + Word16 element_mode #endif ); @@ -3747,8 +3744,8 @@ void const *GetTnsEnabledSingleFilter( void const *p, const Word16 index, Word16 void *SetTnsEnabledSingleFilter( void *p, const Word16 index, const Word16 value ); -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ); -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ); +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ); +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ); /*tns_base.h*/ /** Reset TNS data. @@ -4113,8 +4110,8 @@ void cng_params_upd_ivas_fx( const Word16 element_mode, /* i : Element mode */ const Word16 bwidth /* i : Audio bandwidth */ ); -int16_t get_cng_mode( - const int32_t last_active_brate /* i : last active bitrate */ +Word16 get_cng_mode( + const Word32 last_active_brate /* i : last active bitrate */ ); // core_com_config.c @@ -4301,12 +4298,12 @@ void lpc2mdct( void lpc2mdct_2( Word16 *lpcCoeffs, - const int16_t lpcOrder, + const Word16 lpcOrder, Word16 mdct_gains_fx[], Word16 mdct_gains_e[], Word16 mdct_inv_gains_fx[], Word16 mdct_inv_gains_e[], - const int16_t length ); + const Word16 length ); void mdct_shaping( Word32 x[], @@ -4941,25 +4938,25 @@ void cb_shape_fx( // longarith.c void longadd( - uint16_t a[], /* i/o: vector of the length lena */ - const uint16_t b[], /* i/o: vector of the length lenb */ - const int16_t lena, /* i/o: length of vector a[] */ - const int16_t lenb /* i/o: length of vector b[] */ + UWord16 a[], /* i/o: vector of the length lena */ + const UWord16 b[], /* i/o: vector of the length lenb */ + const Word16 lena, /* i/o: length of vector a[] */ + const Word16 lenb /* i/o: length of vector b[] */ ); void longshiftright( - uint16_t a[], /* i : vector of the length lena */ - const int16_t b, /* i : number of bit positions to shift right */ - uint16_t d[], /* o : vector of the length lend */ - int16_t lena, /* i : length of vector a[] */ - const int16_t lend /* i : length of vector d[] */ + UWord16 a[], /* i : vector of the length lena */ + const Word16 b, /* i : number of bit positions to shift right */ + UWord16 d[], /* o : vector of the length lend */ + Word16 lena, /* i : length of vector a[] */ + const Word16 lend /* i : length of vector d[] */ ); void longshiftleft( - const uint16_t a[], /* i : vector of the length len */ - const int16_t b, /* i : number of bit positions to shift left */ - uint16_t d[], /* o : vector of the length len */ - const int16_t len /* i : length of vector a[] and d[] */ + const UWord16 a[], /* i : vector of the length len */ + const Word16 b, /* i : number of bit positions to shift left */ + UWord16 d[], /* o : vector of the length len */ + const Word16 len /* i : length of vector a[] and d[] */ ); void longshr( @@ -5637,7 +5634,7 @@ void enhancer_fx( void enhancer_ivas_fx( const Word16 codec_mode, /* i : flag indicating Codec Mode */ const Word32 core_brate, /* i : decoder bitrate */ - const int16_t cbk_index, /* i : */ + const Word16 cbk_index, /* i : */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ const Word16 coder_type, /* i : coder type */ const Word16 i_subfr, /* i : subframe number */ @@ -6398,11 +6395,11 @@ void ivas_RefineTonalComponents_fx( const PsychoacousticParameters *psychParamsCurrent ); ivas_error PsychoacousticParameters_Init( - const int32_t sr_core, /* i : sampling rate of core-coder */ - const int16_t nBins, /* i : Number of bins (spectral lines) */ - const int8_t nBands, /* i : Number of spectrum subbands */ - const int16_t isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ - const int16_t isWarped, /* i : Flag indicating if the scale is linear or warped */ + const Word32 sr_core, /* i : sampling rate of core-coder */ + const Word16 nBins, /* i : Number of bins (spectral lines) */ + const Word8 nBands, /* i : Number of spectrum subbands */ + const Word16 isTCX20, /* i : Flag indicating if the subband division is for TCX20 or TCX10 */ + const Word16 isWarped, /* i : Flag indicating if the scale is linear or warped */ PsychoacousticParameters *pPsychParams ); // TonalIMDCTconcealment_fx.c @@ -8292,17 +8289,17 @@ Word16 FEC_synchro_exc_fx( ); void decod_unvoiced_fx( - Decoder_State *st_fx, /* i/o: decoder static memory */ - const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ - const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ - const int16_t uc_two_stage_flag, /* i : flag indicating two-stage UC */ - const Word16 coder_type, /* Q0 i : coding type */ - Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ - Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ - Word16 *voice_factors_fx, /* Q15 o : voicing factors */ - Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ - Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ - Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ + Decoder_State *st_fx, /* i/o: decoder static memory */ + const Word16 *Aq_fx, /* Q12 i : LP filter coefficient */ + const Word16 Es_pred_fx, /* i : predicted scaled innov. energy */ + const Word16 uc_two_stage_flag, /* i : flag indicating two-stage UC */ + const Word16 coder_type, /* Q0 i : coding type */ + Word16 *tmp_noise_fx, /* Q0 o : long term temporary noise energy */ + Word16 *pitch_buf_fx, /* Q6 o : floating pitch values for each subframe*/ + Word16 *voice_factors_fx, /* Q15 o : voicing factors */ + Word16 *exc_fx, /* Q_X o : adapt. excitation exc */ + Word16 *exc2_fx, /* Q_X o : adapt. excitation/total exc */ + Word16 *bwe_exc_fx, /* Q_X i/o: excitation for SWB TBE */ Word16 *gain_buf ); // gaus_dec_fx.c @@ -8486,10 +8483,10 @@ void mode_switch_decoder_LPD_ivas_fx( // ari_hm_dec.c -int16_t DecodeIndex( +Word16 DecodeIndex( Decoder_State *st, - const int16_t Bandwidth, /* o : NB, 1: (S)WB */ - int16_t *PeriodicityIndex ); + const Word16 Bandwidth, /* o : NB, 1: (S)WB */ + Word16 *PeriodicityIndex ); Word16 DecodeIndex_fx( Decoder_State *st, @@ -8566,7 +8563,7 @@ void IGFSCFDecoderReset( void IGFSCFDecoderDecode( IGFSCFDEC_INSTANCE_HANDLE hPublicData, /* i/o: handle to public data or NULL in case there was no instance created */ Decoder_State *st, /* i/o: pointer to decoder state */ - int16_t *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ + Word16 *sfe, /* o : ptr to an array which will contain the decoded quantized coefficients */ const Word16 igfGridIdx, /* i : igf grid index see declaration of IGF_GRID_IDX for details */ const Word16 indepFlag /* i : if 1 on input the decoder will be forced to reset, if 0 on input the decoder will be forced to encode without a reset */ @@ -8694,11 +8691,11 @@ Word16 DecodeTnsData_ivas_fx( // parametr_bitmapping.c using ivas void GetParameters( ParamsBitMap const *paramsBitMap, - const int16_t nParams, + const Word16 nParams, void const *pParameter, - int16_t **pStream, - int16_t *pnSize, - int16_t *pnBits ); + Word16 **pStream, + Word16 *pnSize, + Word16 *pnBits ); void GetParameters_fx( ParamsBitMap const *paramsBitMap, @@ -8718,10 +8715,10 @@ void EncodeTnsData_ivas_fx( void SetParameters( ParamsBitMap const *paramsBitMap, - const int16_t nParams, + const Word16 nParams, void *pParameter, - const int16_t **pStream, - int16_t *pnSize ); + const Word16 **pStream, + Word16 *pnSize ); void SetParameters_fx( ParamsBitMap const *paramsBitMap, @@ -8732,18 +8729,18 @@ void SetParameters_fx( void WriteToBitstream( ParamsBitMap const *paramsBitMap, - const int16_t nParams, - const int16_t **pStream, - int16_t *pnSize, + const Word16 nParams, + const Word16 **pStream, + Word16 *pnSize, BSTR_ENC_HANDLE hBstr, - int16_t *pnBits ); + Word16 *pnBits ); void ReadFromBitstream( ParamsBitMap const *paramsBitMap, - const int16_t nArrayLength, + const Word16 nArrayLength, Decoder_State *st, - int16_t **pStream, - int16_t *pnSize ); + Word16 **pStream, + Word16 *pnSize ); void ReadFromBitstream_fx( ParamsBitMap const *paramsBitMap, @@ -9302,7 +9299,7 @@ void v_add_fx( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ - const int16_t N /* i : Vector length */ + const Word16 N /* i : Vector length */ ); void v_shr_16( @@ -9356,10 +9353,10 @@ void configureCldfb_ivas_fx( ); // dec4t64.c void dec_acelp_fast_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const int16_t cdk_index, /* i : codebook index */ - Word16 code[], /* o : algebraic (fixed) codebook excitation */ - const int16_t L_subfr /* i : subframe length */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 cdk_index, /* i : codebook index */ + Word16 code[], /* o : algebraic (fixed) codebook excitation */ + const Word16 L_subfr /* i : subframe length */ ); // codec_tcx_common.c void tcx5SpectrumInterleaving_fx( @@ -9397,7 +9394,7 @@ void cldfbAnalysis_ivas_fx( const Word32 *timeIn_fx, /* i : time buffer Qx */ Word32 **realBuffer_fx, /* o : real value buffer Qx - 5*/ Word32 **imagBuffer_fx, /* o : imag value buffer QX - 5*/ - const int16_t samplesToProcess, /* i : samples to process */ + const Word16 samplesToProcess, /* i : samples to process */ HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ ); @@ -9416,7 +9413,7 @@ void cldfbSynthesis_ivas_fx( // bass_psfilter.c void addBassPostFilter_ivas_fx( const Word32 *harm_timeIn_fx, - const int16_t samplesToProcess, + const Word16 samplesToProcess, Word32 **rAnalysis_fx, Word32 **iAnalysis_fx, HANDLE_CLDFB_FILTER_BANK cldfb ); @@ -9590,8 +9587,8 @@ void fd_bwe_dec_init_fx( void stereo_dft_dec_open( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const int32_t output_Fs, /* i : output sampling rate */ - const int16_t nchan_transport /* i : number of transport channels */ + const Word32 output_Fs, /* i : output sampling rate */ + const Word16 nchan_transport /* i : number of transport channels */ ); void ivas_bw_switching_pre_proc_fx( @@ -10287,8 +10284,8 @@ void dctT2_N_apply_matrix_fx( ); Word32 sum2_f_32_fx( - const Word32 *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ + const Word32 *vec, /* i : input vector */ + const Word16 lvec, /* i : length of input vector */ Word16 gb ); Word32 sum2_32_fx( @@ -10438,10 +10435,10 @@ void generate_stereo_masking_noise_fx( Word16 Q_syn, Decoder_State *st, /* i/o: decoder state structure */ STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i : TD stereo structure */ - const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ - const int16_t fadeOut, /* i : only fade out of previous state */ + const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ + const Word16 fadeOut, /* i : only fade out of previous state */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 nchan_out /* i : number of output channels */ ); void SynthesisSTFT_fx( @@ -10449,10 +10446,10 @@ void SynthesisSTFT_fx( Word32 *timeDomainOutput, Word32 *olapBuffer, const Word16 *olapWin, - const int16_t tcx_transition, + const Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - const int16_t element_mode, /* i : element mode */ - const int16_t nchan_out /* i : number of output channels */ + const Word16 element_mode, /* i : element mode */ + const Word16 nchan_out /* i : number of output channels */ ); void FdCng_decodeSID_ivas_fx( @@ -10834,7 +10831,7 @@ Word16 msvq_stage1_dct_recalc_candidates_fdcng_wb_fx( const Word16 st1_syn_vec_e, /* i : exp for IDCT24 synthesis vectors */ const Word32 *u_fx, /* i : target signal */ const Word16 u_e, /* i : exp for target signal */ - const int16_t maxC_st1, /* i : number of candidates in stage1 */ + const Word16 maxC_st1, /* i : number of candidates in stage1 */ Word32 *dist_ptr_fx, /* i/o: updated MSE vector for stage1 */ Word16 *dist_ptr_e /* i/o: exp for updated MSE vector for stage1 */ ); @@ -10907,69 +10904,42 @@ void WriteToBitstream_ivas_fx( * MODE1 prototypes *----------------------------------------------------------------------------------*/ -/*! r: inverse square root of input value */ -float inv_sqrt( - const float x /* i : input value */ -); - /*! r: output random value */ -int16_t own_random( - int16_t *seed /* i/o: random seed */ -); - -/*! r: sign of x (+1/-1) */ -float sign( - const float x /* i : input value of x */ +Word16 own_random( + Word16 *seed /* i/o: random seed */ ); -/*! r: logarithm2 of x */ -float log2_f( - const float x /* i : input value of x */ -); - -int16_t norm_ul_float( - uint32_t UL_var1 ); +Word16 norm_ul_float( + UWord32 UL_var1 ); /*! r: sum of all vector elements */ -int16_t sum_s( - const int16_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ +Word16 sum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ); /*! r: sum of all vector elements */ -int32_t sum_l( - const int32_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - -/*! r: sum of all squared vector elements */ -float sum2_f( - const float *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ +Word32 sum_l( + const Word32 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ); void set_c( - int8_t y[], /* i/o: Vector to set */ - const int8_t a, /* i : Value to set the vector to */ - const int32_t N /* i : Length of the vector */ + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word32 N /* i : Length of the vector */ ); void set_s( - int16_t y[], /* i/o: Vector to set */ - const int16_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word16 y[], /* i/o: Vector to set */ + const Word16 a, /* i : Value to set the vector to */ + const Word16 N /* i : Lenght of the vector */ ); void set_l( - int32_t y[], /* i/o: Vector to set */ - const int32_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ -); - -void set_f( - float y[], /* i/o: Vector to set */ - const float a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word32 y[], /* i/o: Vector to set */ + const Word32 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ ); void set_zero_fx( @@ -10986,52 +10956,26 @@ void set16_zero_fx( ); void set_zero( - float *vec, /* o : input vector */ - const int16_t lvec /* i : length of the vector */ + float *vec, /* o : input vector */ + const Word16 lvec /* i : length of the vector */ ); void mvr2r( const float x[], /* i : input vector */ float y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 n /* i : vector size */ ); void mvs2s( - const int16_t x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - -uint32_t mvr2s( - const float x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - -void mvs2r( - const int16_t x[], /* i : input vector */ - float y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 x[], /* i : input vector */ + Word16 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ); void mvl2l( - const int32_t x[], /* i : input vector */ - int32_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - - -/*! r: index of the maximum value in the input vector */ -int16_t maximum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *max_val /* o : maximum value in the input vector */ -); -/*! r: index of the maximum value in the input vector */ -int16_t maximumAbs( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *max_val /* o : maximum value in the input vector */ + const Word32 x[], /* i : input vector */ + Word32 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ); Word16 maximumAbs_l( @@ -11041,63 +10985,22 @@ Word16 maximumAbs_l( ); /*! r: index of the minimum value in the input vector */ -int16_t minimum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *min_val /* o : minimum value in the input vector */ -); - -/*! r: index of the minimum value in the input vector */ -int16_t minimum_s( - const int16_t *vec, /* i : Input vector */ - const int16_t lvec, /* i : Vector length */ - int16_t *min_val /* o : minimum value in the input vector */ -); - -/*! r: return index with max energy value in vector */ -int16_t emaximum( - const float *vec, /* i : input vector */ - const int16_t lvec, /* i : length of input vector */ - float *ener_max /* o : maximum energy value */ -); - -/*! r: vector mean */ -float mean( - const float *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ -); - -/*! r: dot product of x[] and y[] */ -float dotp( - const float x[], /* i : vector x[] */ - const float y[], /* i : vector y[] */ - const int16_t n /* i : vector length */ -); - -void v_add( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 + vector 2 */ - const int16_t N /* i : Vector length */ -); - -void v_sub( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 - vector 2 */ - const int16_t N /* i : Vector length */ +Word16 minimum_s( + const Word16 *vec, /* i : Input vector */ + const Word16 lvec, /* i : Vector length */ + Word16 *min_val /* o : minimum value in the input vector */ ); /*! r: dequanzited gain */ float usdequant( - const int16_t idx, /* i : quantizer index */ - const float qlow, /* i : lowest codebook entry (index 0) */ - const float delta /* i : quantization step */ + const Word16 idx, /* i : quantizer index */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta /* i : quantization step */ ); void sort( - uint16_t *x, /* i/o: Vector to be sorted */ - uint16_t len /* i/o: vector length */ + UWord16 *x, /* i/o: Vector to be sorted */ + UWord16 len /* i/o: vector length */ ); void sort_l( @@ -11108,9 +11011,9 @@ void sort_l( ivas_error push_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ - uint16_t value, /* i : value of the quantized indice */ - int16_t nb_bits /* i : number of bits used to quantize the indice */ + Word16 id, /* i : ID of the indice */ + UWord16 value, /* i : value of the quantized indice */ + Word16 nb_bits /* i : number of bits used to quantize the indice */ ); ivas_error push_next_indice( @@ -11132,8 +11035,8 @@ Word16 get_ivas_max_num_indices_fx( ); /*! r: maximum number of indices */ -int16_t get_BWE_max_num_indices( - const int32_t extl_brate /* i : extensiona layer bitrate */ +Word16 get_BWE_max_num_indices( + const Word32 extl_brate /* i : extensiona layer bitrate */ ); /*! r: maximum number of indices */ @@ -11142,9 +11045,9 @@ Word16 get_ivas_max_num_indices_metadata_fx( const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( - INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ - const int16_t max_num_indices, /* i : new maximum number of allowed indices in the list */ - Encoder_Struct *st_ivas /* i : IVAS encoder structure */ + INDICE_HANDLE old_ind_list, /* i : pointer to the beginning of the old buffer of indices */ + const Word16 max_num_indices, /* i : new maximum number of allowed indices in the list */ + Encoder_Struct *st_ivas /* i : IVAS encoder structure */ ); ivas_error check_ind_list_limits( @@ -11154,44 +11057,44 @@ ivas_error check_ind_list_limits( void move_indices( INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ - const int16_t nb_indices /* i : number of moved indices */ + const Word16 nb_indices /* i : number of moved indices */ ); /*! r: index of the indice in the list, -1 if not found */ -int16_t find_indice( +Word16 find_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - const int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ + const Word16 id, /* i : ID of the indice */ + UWord16 *value, /* o : value of the quantized indice */ + Word16 *nb_bits /* o : number of bits used to quantize the indice */ ); /*! r: number of deleted indices */ -uint16_t delete_indice( +UWord16 delete_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const int16_t id /* i : ID of the indice */ + const Word16 id /* i : ID of the indice */ ); /*! r: value of the indice */ -uint16_t get_next_indice( +UWord16 get_next_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); /*! r: value of the indice */ -uint16_t get_next_indice_1( +UWord16 get_next_indice_1( Decoder_State *st /* i/o: decoder state structure */ ); void get_next_indice_tmp( Decoder_State *st, /* o : decoder state structure */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); /*! r: value of the indice */ -uint16_t get_indice( +UWord16 get_indice( Decoder_State *st, /* i/o: decoder state structure */ - int16_t pos, /* i : absolute position in the bitstream */ - int16_t nb_bits /* i : number of bits that were used to quantize the indice */ + Word16 pos, /* i : absolute position in the bitstream */ + Word16 nb_bits /* i : number of bits that were used to quantize the indice */ ); void reset_indices_dec( @@ -11200,7 +11103,7 @@ void reset_indices_dec( Word16 rate2EVSmode_float( const Word32 brate, /* i : bitrate */ - int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ + Word16 *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ ); @@ -11227,13 +11130,13 @@ void mdct_switching_dec_fx( Decoder_State *st /* i/o: decoder state structure */ ); -int16_t print_disclaimer( +Word16 print_disclaimer( FILE *fPtr ); void fft_rel( - float x[], /* i/o: input/output vector */ - const int16_t n, /* i : vector length */ - const int16_t m /* i : log2 of vector length */ + float x[], /* i/o: input/output vector */ + const Word16 n, /* i : vector length */ + const Word16 m /* i : log2 of vector length */ ); void preemph_ivas_fx( @@ -11246,8 +11149,8 @@ void preemph_ivas_fx( void create_offset( UWord32 *offset_scale1, UWord32 *offset_scale2, - const int16_t mode, - const int16_t prediction_flag ); + const Word16 mode, + const Word16 prediction_flag ); void BASOP_cfft_ivas( Word32 *re, /* i/o: real part */ @@ -11492,31 +11395,31 @@ void writeTCXWindowing_fx( ); void writeLPCparam( - Encoder_State *st, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - const int16_t param_lpc[], /* i : LPC parameters to write */ - const int16_t bits_param_lpc[], /* i : bits per LPC parameter */ - const int16_t no_param_lpc, /* i : number of LPC parameters */ - int16_t *nbits_lpc /* o : LPC bits written */ + Encoder_State *st, /* i/o: encoder state structure */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + const Word16 param_lpc[], /* i : LPC parameters to write */ + const Word16 bits_param_lpc[], /* i : bits per LPC parameter */ + const Word16 no_param_lpc, /* i : number of LPC parameters */ + Word16 *nbits_lpc /* o : LPC bits written */ ); -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ); -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ); -void const *GetNumOfTnsFilters_flt( void const *p, const int16_t index, int16_t *pValue ); -void *SetNumOfTnsFilters_flt( void *p, const int16_t index, const int16_t value ); +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ); +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ); +void const *GetNumOfTnsFilters_flt( void const *p, const Word16 index, Word16 *pValue ); +void *SetNumOfTnsFilters_flt( void *p, const Word16 index, const Word16 value ); -int16_t DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); -int16_t DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); +Word16 DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); -int16_t DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); +Word16 DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); -int16_t EncodeTnsFilterOrderSWBTCX10_flt( const int16_t value, const int16_t index ); +Word16 EncodeTnsFilterOrderSWBTCX10_flt( const Word16 value, const Word16 index ); -int16_t GetTnsFilterOrderBitsSWBTCX10_flt( const int16_t value, const int16_t index ); -int16_t DecodeTnsFilterOrder_flt( Decoder_State *st, const int16_t index, int16_t *pValue ); +Word16 GetTnsFilterOrderBitsSWBTCX10_flt( const Word16 value, const Word16 index ); +Word16 DecodeTnsFilterOrder_flt( Decoder_State *st, const Word16 index, Word16 *pValue ); void ResetTnsData_flt( STnsData *pTnsData ); @@ -11569,7 +11472,7 @@ void analysisCldfbEncoder_ivas_fx( ivas_error openCldfb_ivas( HANDLE_CLDFB_FILTER_BANK *h_cldfb, /* i/o: filter bank handle */ CLDFB_TYPE type, /* i : analysis or synthesis */ - const int32_t sampling_rate, /* i : sampling rate */ + const Word32 sampling_rate, /* i : sampling rate */ CLDFB_PROTOTYPE prototype /* i : CLDFB version (1.25ms/5ms delay) */ ); diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index 82de45023..5e18430be 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -809,43 +809,19 @@ static Word16 DecodeUsingTable( Decoder_State *st, Word16 *pValue /*Q0*/, const /* TNS filter coefficients */ -int16_t DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeSWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX20[index], nTnsCoeffCodes ); } -// int16_t GetSWBTCX10TnsFilterCoeffBits_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return GetBitsFromTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); -// } - -// int16_t EncodeSWBTCX10TnsFilterCoeff_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return EncodeUsingTable( value, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); -// } - -int16_t DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeSWBTCX10TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffSWBTCX10[index], nTnsCoeffCodes ); } -// int16_t GetWBTCX20TnsFilterCoeffBits_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return GetBitsFromTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); -// } - -// int16_t EncodeWBTCX20TnsFilterCoeff_flt( const int16_t value, const int16_t index ) -//{ -// assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); -// return EncodeUsingTable( value, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); -// } - -int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { assert( ( index >= 0 ) && ( index < nTnsCoeffTables ) ); return DecodeUsingTable( st, pValue, codesTnsCoeffWBTCX20[index], nTnsCoeffCodes ); @@ -854,49 +830,25 @@ int16_t DecodeWBTCX20TnsFilterCoeff_flt( Decoder_State *st, const int16_t index, /* TNS filter order */ -// void const *GetTnsFilterOrder_flt( void const *p, const int16_t index, int16_t *pValue ) -//{ -// *pValue = ( (STnsFilter const *) p )[index].order; -// return ( (STnsFilter const *) p )[index].coefIndex; -// } - -// void *SetTnsFilterOrder_flt( void *p, const int16_t index, const int16_t value ) -//{ -// ( (STnsFilter *) p )[index].order = value; -// return ( (STnsFilter *) p )[index].coefIndex; -// } - -// int16_t GetTnsFilterOrderBitsSWBTCX20_flt( const int16_t value, const int16_t index ) -//{ -// (void) index; -// return GetBitsFromTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); -// } - -// int16_t EncodeTnsFilterOrderSWBTCX20_flt( const int16_t value, const int16_t index ) -//{ -// (void) index; -// return EncodeUsingTable( value - 1, codesTnsOrderTCX20, nTnsOrderCodes ); -// } - -int16_t DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrderSWBTCX20_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrderTCX20, nTnsOrderCodes ); } -int16_t GetTnsFilterOrderBitsSWBTCX10_flt( const int16_t value, const int16_t index ) +Word16 GetTnsFilterOrderBitsSWBTCX10_flt( const Word16 value, const Word16 index ) { (void) index; return GetBitsFromTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); } -int16_t EncodeTnsFilterOrderSWBTCX10_flt( const int16_t value, const int16_t index ) +Word16 EncodeTnsFilterOrderSWBTCX10_flt( const Word16 value, const Word16 index ) { (void) index; return EncodeUsingTable( value - 1, codesTnsOrderTCX10, nTnsOrderCodes ); } -int16_t DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrderSWBTCX10_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrderTCX10, nTnsOrderCodes ); @@ -1105,42 +1057,36 @@ void *SetTnsEnabled( void *p, const Word16 index, const Word16 value ) /* Number of TNS filters */ -void const *GetNumOfTnsFilters_flt( void const *p, const int16_t index, int16_t *pValue ) +void const *GetNumOfTnsFilters_flt( void const *p, const Word16 index, Word16 *pValue ) { - *pValue = (int16_t) abs( ( (STnsData const *) p )[index].nFilters ); + *pValue = (Word16) abs( ( (STnsData const *) p )[index].nFilters ); return ( (STnsData const *) p )[index].filter; } -void *SetNumOfTnsFilters_flt( void *p, const int16_t index, const int16_t value ) +void *SetNumOfTnsFilters_flt( void *p, const Word16 index, const Word16 value ) { - ( (STnsData *) p )[index].nFilters = (int16_t) abs( value ); + ( (STnsData *) p )[index].nFilters = (Word16) abs( value ); return ( (STnsData *) p )[index].filter; } -int16_t DecodeTnsFilterOrder_flt( Decoder_State *st, const int16_t index, int16_t *pValue ) +Word16 DecodeTnsFilterOrder_flt( Decoder_State *st, const Word16 index, Word16 *pValue ) { (void) index; return DecodeUsingTable( st, pValue, codesTnsOrder, nTnsOrderCodes ); } /* TNS on whitened spectra flag */ -void const *GetTnsOnWhite( void const *p, const int16_t index, int16_t *pValue ) +void const *GetTnsOnWhite( void const *p, const Word16 index, Word16 *pValue ) { *pValue = ( (STnsData const *) p )[index].tnsOnWhitenedSpectra > 0 ? 1 : 0; return NULL; } -void *SetTnsOnWhite( void *p, const int16_t index, const int16_t value ) +void *SetTnsOnWhite( void *p, const Word16 index, const Word16 value ) { ( (STnsData *) p )[index].tnsOnWhitenedSpectra = value; return NULL; } -// void const *GetTnsEnabledSingleFilter( void const *p, const int16_t index, int16_t *pValue ) -//{ -// *pValue = ( (STnsData const *) p )[index].nFilters != 0 ? 1 : 0; -// return ( (STnsData const *) p )[index].filter; -// } - void const *GetTnsEnabledSingleFilter( void const *p, const Word16 index, Word16 *pValue ) { move16(); diff --git a/lib_com/tools.c b/lib_com/tools.c index f7303c6f3..9166d16eb 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -47,51 +47,23 @@ *------------------------------------------------------------------*/ /*! r: output random value */ -int16_t own_random( - int16_t *seed /* i/o: random seed */ +Word16 own_random( + Word16 *seed /* i/o: random seed */ ) { - *seed = (int16_t) ( *seed * 31821L + 13849L ); + *seed = (Word16) ( *seed * 31821L + 13849L ); return ( *seed ); } /*--------------------------------------------------------------------- - * sign() + * norm_ul_float() * *---------------------------------------------------------------------*/ -/*! r: sign of x (+1/-1) */ -float sign( - const float x /* i : input value of x */ -) +Word16 norm_ul_float( UWord32 UL_var1 ) { - if ( x < 0.0f ) - { - return -1.0f; - } - else - { - return 1.0f; - } -} - -/*--------------------------------------------------------------------- - * log2_f() - * - *---------------------------------------------------------------------*/ - -/*! r: logarithm2 of x */ -float log2_f( - const float x /* i : input value of x */ -) -{ - return (float) ( log( x ) / log( 2.0f ) ); -} - -int16_t norm_ul_float( uint32_t UL_var1 ) -{ - int16_t var_out; + Word16 var_out; if ( UL_var1 == 0 ) { @@ -99,7 +71,7 @@ int16_t norm_ul_float( uint32_t UL_var1 ) } else { - for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) + for ( var_out = 0; UL_var1 < (UWord32) 0x80000000U; var_out++ ) { UL_var1 <<= 1; } @@ -118,13 +90,13 @@ int16_t norm_ul_float( uint32_t UL_var1 ) *---------------------------------------------------------------------*/ /*! r: sum of all vector elements */ -int16_t sum_s( - const int16_t *vec, /* i : input vector */ - const int16_t lvec /* i : length of input vector */ +Word16 sum_s( + const Word16 *vec, /* i : input vector */ + const Word16 lvec /* i : length of input vector */ ) { - int16_t i; - int16_t tmp; + Word16 i; + Word16 tmp; tmp = 0; for ( i = 0; i < lvec; i++ ) @@ -182,7 +154,7 @@ Word32 sum2_f_16_gb_fx( const Word16 lvec, /* i : length of input vector */ Word16 gb ) { - int16_t i; + Word16 i; Word32 tmp; tmp = 0; @@ -311,7 +283,6 @@ Word32 sum2_32_fx( /*-------------------------------------------------------------------* * set_c() * set_s() - * set_f() * set_l() * set_d() * @@ -319,12 +290,12 @@ Word32 sum2_32_fx( *-------------------------------------------------------------------*/ void set_c( - int8_t y[], /* i/o: Vector to set */ - const int8_t a, /* i : Value to set the vector to */ - const int32_t N /* i : Length of the vector */ + Word8 y[], /* i/o: Vector to set */ + const Word8 a, /* i : Value to set the vector to */ + const Word32 N /* i : Length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < N; i++ ) { @@ -336,12 +307,12 @@ void set_c( void set_s( - int16_t y[], /* i/o: Vector to set */ - const int16_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ + Word16 y[], /* i/o: Vector to set */ + const Word16 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < N; i++ ) { @@ -353,28 +324,12 @@ void set_s( void set_l( - int32_t y[], /* i/o: Vector to set */ - const int32_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Length of the vector */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = a; - } - - return; -} - -void set_f( - float y[], /* i/o: Vector to set */ - const float a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ + Word32 y[], /* i/o: Vector to set */ + const Word32 a, /* i : Value to set the vector to */ + const Word16 N /* i : Length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < N; i++ ) { @@ -391,11 +346,11 @@ void set_f( *---------------------------------------------------------------------*/ void set_zero( - float *vec, /* o : input vector */ - const int16_t lvec /* i : length of the vector */ + float *vec, /* o : input vector */ + const Word16 lvec /* i : length of the vector */ ) { - int16_t i; + Word16 i; for ( i = 0; i < lvec; i++ ) { @@ -409,8 +364,6 @@ void set_zero( /*---------------------------------------------------------------------* * mvr2r() * mvs2s() - * mvr2s() - * mvs2r() * mvr2d() * mvd2r() * @@ -420,10 +373,10 @@ void set_zero( void mvr2r( const float x[], /* i : input vector */ float y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 n /* i : vector size */ ) { - int16_t i; + Word16 i; if ( n <= 0 ) { @@ -450,12 +403,12 @@ void mvr2r( } void mvs2s( - const int16_t x[], /* i : input vector */ - int16_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word16 x[], /* i : input vector */ + Word16 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ) { - int16_t i; + Word16 i; if ( n <= 0 ) { @@ -482,12 +435,12 @@ void mvs2s( } void mvl2l( - const int32_t x[], /* i : input vector */ - int32_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const Word32 x[], /* i : input vector */ + Word32 y[], /* o : output vector */ + const Word16 n /* i : vector size */ ) { - int16_t i; + Word16 i; if ( n <= 0 ) { @@ -687,32 +640,6 @@ Word16 minimum_l( return ind; } -/*---------------------------------------------------------------------* - * dotp() - * - * Dot product of vector x[] and vector y[] - *---------------------------------------------------------------------*/ - -/*! r: dot product of x[] and y[] */ -float dotp( - const float x[], /* i : vector x[] */ - const float y[], /* i : vector y[] */ - const int16_t n /* i : vector length */ -) -{ - int16_t i; - float suma; - - suma = x[0] * y[0]; - - for ( i = 1; i < n; i++ ) - { - suma += x[i] * y[i]; - } - - return suma; -} - /*---------------------------------------------------------------------* * dotp() * @@ -800,20 +727,6 @@ Word32 dotp_fixed_32( return W_extract_l( suma ); } -/*---------------------------------------------------------------------* - * inv_sqrt() - * - * Find the inverse square root of the input value - *---------------------------------------------------------------------*/ - -/*! r: inverse square root of input value */ -float inv_sqrt( - const float x /* i : input value */ -) -{ - return (float) ( 1.0 / sqrt( x ) ); -} - /*-------------------------------------------------------------------* * v_add_w64() * @@ -839,32 +752,8 @@ void v_add_w64( return; } - -/*-------------------------------------------------------------------* - * v_sub() - * - * Subtraction of two vectors sample by sample - *-------------------------------------------------------------------*/ - -void v_sub( - const float x1[], /* i : Input vector 1 */ - const float x2[], /* i : Input vector 2 */ - float y[], /* o : Output vector that contains vector 1 - vector 2 */ - const int16_t N /* i : Vector length */ -) -{ - int16_t i; - - for ( i = 0; i < N; i++ ) - { - y[i] = x1[i] - x2[i]; - } - - return; -} - /*-------------------------------------------------------------------* - * v_sub() + * v_sub_fixed() * * Subtraction of two vectors sample by sample *-------------------------------------------------------------------*/ @@ -977,9 +866,9 @@ void v_multc_fixed_16_16( *-------------------------------------------------------------------*/ float usdequant( - const int16_t idx, /* i : quantizer index */ - const float qlow, /* i : lowest codebook entry (index 0) */ - const float delta /* i : quantization step */ + const Word16 idx, /* i : quantizer index */ + const float qlow, /* i : lowest codebook entry (index 0) */ + const float delta /* i : quantization step */ ) { float g; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 14a97a034..77e779efd 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -241,9 +241,9 @@ void fix2f_16( Word16 *var_fix, float *var_flt, Word32 expo ) #undef WMC_TOOL_SKIP -int16_t norm_ul( uint32_t UL_var1 ) +Word16 norm_ul( UWord32 UL_var1 ) { - int16_t var_out; + Word16 var_out; if ( UL_var1 == 0 ) { @@ -251,7 +251,7 @@ int16_t norm_ul( uint32_t UL_var1 ) } else { - for ( var_out = 0; UL_var1 < (uint32_t) 0x80000000U; var_out++ ) + for ( var_out = 0; UL_var1 < (UWord32) 0x80000000U; var_out++ ) { UL_var1 <<= 1; } @@ -997,7 +997,7 @@ void scale_sig( } /*---------------------------------------------------------------------* - * mean() + * mean_fx() * *---------------------------------------------------------------------*/ Word16 mean_fx( /* o : mean of vector */ @@ -2171,7 +2171,7 @@ Word16 own_random2_fx( Word16 seed ) } /*--------------------------------------------------------------------- - * sign() + * sign_fx() * *---------------------------------------------------------------------*/ @@ -4207,7 +4207,7 @@ Word16 lin_interp_ivas_fx( } /*--------------------------------------------------------------------- - * sign() + * sign_l() * *---------------------------------------------------------------------*/ @@ -4245,7 +4245,7 @@ void v_mult16_fixed( } /*---------------------------------------------------------------------* - * set_zero() + * set_zero_fx() * * Set a vector vec[] of dimension lvec to zero *---------------------------------------------------------------------*/ diff --git a/lib_dec/dec_acelp_tcx_main_fx.c b/lib_dec/dec_acelp_tcx_main_fx.c index 21bf7cf12..eea558914 100644 --- a/lib_dec/dec_acelp_tcx_main_fx.c +++ b/lib_dec/dec_acelp_tcx_main_fx.c @@ -364,7 +364,7 @@ Word16 dec_acelp_tcx_frame_fx( { /* Copy back parameters from previous frame, because there is a high risk they are corrupt * DO concealment with configuration used in previous frame */ - st->m_frame_type = (uint8_t) m_frame_type; + st->m_frame_type = (UWord8) m_frame_type; move16(); st->bwidth = bwidth; move16(); diff --git a/lib_enc/acelp_core_enc_fx.c b/lib_enc/acelp_core_enc_fx.c index 6ba21136e..f942a19ff 100644 --- a/lib_enc/acelp_core_enc_fx.c +++ b/lib_enc/acelp_core_enc_fx.c @@ -38,7 +38,6 @@ ivas_error acelp_core_enc_fx( Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ Word16 *unbits_fx, /* o : number of unused bits Q0*/ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ const Word16 Q_new, const Word16 shift ) { @@ -107,8 +106,6 @@ ivas_error acelp_core_enc_fx( * Initialization *------------------------------------------------------------------*/ - (void) tdm_lsfQ_PCh; - Es_pred_fx = 0; move16(); diff --git a/lib_enc/evs_enc_fx.c b/lib_enc/evs_enc_fx.c index 624ec20fc..8e9a82378 100644 --- a/lib_enc/evs_enc_fx.c +++ b/lib_enc/evs_enc_fx.c @@ -269,7 +269,7 @@ ivas_error evs_enc_fx( IF( EQ_16( st->core, ACELP_CORE ) ) { acelp_core_enc_fx( st, inp, ener, A, Aw, epsP_h, epsP_l, lsp_new, lsp_mid, vad_hover_flag, - attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL, Q_new, shift ); + attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, Q_new, shift ); } /*---------------------------------------------------------------------* * HQ core encoding diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 72137bdce..d3528370f 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -61,7 +61,6 @@ ivas_error acelp_core_enc_fx( Word16 pitch_buf_fx[NB_SUBFR16k], /* o : floating pitch for each subframe Q6*/ Word16 *unbits_fx, /* o : number of unused bits Q0*/ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ const Word16 Q_new, const Word16 shift diff --git a/lib_enc/rom_enc.h b/lib_enc/rom_enc.h index 35fd3027d..7da1da92a 100644 --- a/lib_enc/rom_enc.h +++ b/lib_enc/rom_enc.h @@ -52,7 +52,6 @@ extern const Word16 W_HIST_S_FX[DTX_HIST_SIZE]; /* CNG & DTX - table for calcula extern const Word16 bwd_start_bin[]; // Q0 extern const Word16 bwd_end_bin[]; // Q0 -extern const float h_fir[]; /* 2nd order fir filter for wsp, decimation by 2 */ extern const Word16 h_fir_fx[]; /* 2nd order fir filter for wsp, decimation by 2 Q15*/ extern const Word16 preemphCompensation_fx[]; // Q11 diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index f62440749..7f9cfb57a 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -121,10 +121,6 @@ extern const Word32 ivas_reverb_default_fc_fx[]; /*Q-16*/ extern const Word32 ivas_reverb_default_RT60_fx[]; /*Q-26*/ extern const Word32 ivas_reverb_default_DSR_fx[]; /*Q-30*/ -extern const float ivas_reverb_default_fc[]; -extern const float ivas_reverb_default_RT60[]; -extern const float ivas_reverb_default_DSR[]; - extern const Word32 release_cnst_table[4][201]; // Q31 /*----------------------------------------------------------------------------------* diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 4f101582c..d14be4afe 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -561,42 +561,6 @@ const Word32 ivas_reverb_default_DSR_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q30*/ = 66, 30, 28 }; -const float ivas_reverb_default_fc[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 20.0f, 25.0f, 31.5f, 40.0f, - 50.0f, 63.0f, 80.0f, 100.0f, - 125.0f, 160.0f, 200.0f, 250.0f, - 315.0f, 400.0f, 500.0f, 630.0f, - 800.0f, 1000.0f, 1250.0f, 1600.0f, - 2000.0f, 2500.0f, 3150.0f, 4000.0f, - 5000.0f, 6300.0f, 8000.0f, 10000.0f, - 12500.0f, 16000.0f, 20000.0f -}; - -const float ivas_reverb_default_RT60[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 1.3622f, 1.4486f, 1.3168f, 1.5787f, - 1.4766f, 1.3954f, 1.2889f, 1.3462f, - 1.0759f, 1.0401f, 1.097f, 1.085f, - 1.091f, 1.0404f, 1.0499f, 1.0699f, - 1.1028f, 1.1714f, 1.1027f, 1.0666f, - 1.055f, 1.0553f, 1.0521f, 1.0569f, - 1.0421f, 0.97822f, 0.80487f, 0.75944f, - 0.71945f, 0.61682f, 0.60031f -}; - -const float ivas_reverb_default_DSR[IVAS_REVERB_DEFAULT_N_BANDS] = -{ - 1.8811e-08f, 2.1428e-08f, 1.3972e-08f, 1.51e-08f, - 1.287e-08f, 1.8747e-08f, 2.413e-08f, 3.9927e-08f, - 8.9719e-08f, 1.902e-07f, 3.702e-07f, 6.1341e-07f, - 7.1432e-07f, 6.5331e-07f, 4.6094e-07f, 5.4683e-07f, - 7.0134e-07f, 6.856e-07f, 7.114e-07f, 6.9604e-07f, - 5.2939e-07f, 5.699e-07f, 6.1773e-07f, 5.7488e-07f, - 4.7748e-07f, 2.7213e-07f, 1.3681e-07f, 1.0941e-07f, - 6.2001e-08f, 2.8483e-08f, 2.6267e-08f -}; - const Word32 release_cnst_table[4][201] = // Q31 { { -- GitLab From b69b11e39f8edd19a63de476efb0648647896393 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 20 May 2025 10:23:30 +0200 Subject: [PATCH 0664/1310] Add missing assignment of Q values of overlap add buffers. --- lib_dec/dec_ace_fx.c | 4 ++++ lib_dec/er_dec_acelp_fx.c | 9 ++++++++- lib_dec/er_dec_tcx_fx.c | 10 ++++++++++ lib_dec/updt_dec_fx.c | 4 ++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib_dec/dec_ace_fx.c b/lib_dec/dec_ace_fx.c index 9c366e3f3..edc429459 100644 --- a/lib_dec/dec_ace_fx.c +++ b/lib_dec/dec_ace_fx.c @@ -690,6 +690,10 @@ void decoder_acelp_fx( E_UTIL_deemph2( st->Q_syn, syn, st->preemph_fac, st->L_frame, &tmp_deemph ); /* tmp_deemph and syn in Q0 starting from here*/ bufferCopyFx( syn + shr( st->L_frame, 1 ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hTcxDec->Q_old_syn_Overl = sub( st->Q_syn, 1 ); + move16(); +#endif Copy( syn + sub( st->L_frame, M + 1 ), st->syn, 1 + M ); /*Q0*/ diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index bcbff9b76..18c930269 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -1018,6 +1018,10 @@ void con_acelp_fx( Copy( syn, synth, st->L_frame ); bufferCopyFx( syn + sub( st->L_frame, shr( st->L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hTcxDec->Q_old_syn_Overl = sub( Qf_syn, 1 ); + move16(); +#endif /* save last half frame if next frame is TCX */ bufferCopyFx( syn + st->L_frame, hTcxDec->syn_Overl_TDAC, shr( st->L_frame, 1 ), 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); @@ -1057,7 +1061,10 @@ void con_acelp_fx( move16(); } set16_fx( &hHQ_core->old_out_LB_fx[( W1 + n )], 0, n ); -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hHQ_core->Q_old_wtda_LB = st->Q_syn; + move16(); +#else hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; move16(); #endif diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 48e290217..a1907b44c 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -843,7 +843,15 @@ void con_tcx_fx( lerp( syn + sub( L_frame, shr( L_frame, 1 ) ), hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hTcxDec->Q_old_syn_Overl = Q_syn; + move16(); +#endif Copy( syn + sub( L_frame, n ), hHQ_core->old_out_fx, sub( L_frame, n ) ); /*Q_syn*/ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hHQ_core->Q_old_wtda = Q_syn; + move16(); +#endif FOR( i = 0; i < W12; i++ ) { @@ -934,7 +942,9 @@ void con_tcx_fx( move16(); /* update memory for low band */ +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/ +#endif lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT hTcxDec->Q_syn_Overl = hTcxDec->Q_syn_OverlFB; diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index 81046fb19..d1fe01b42 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -1207,6 +1207,10 @@ void update_decoder_LPD_cng( Copy( hTcxDec->old_synth + st->L_frame, hTcxDec->old_synth, sub( hTcxDec->old_synth_len, st->L_frame ) ); Copy( synth, hTcxDec->old_synth + sub( hTcxDec->old_synth_len, st->L_frame ), st->L_frame ); bufferCopyFx( synth + sub( st->L_frame, ( st->L_frame / 2 ) ), hTcxDec->old_syn_Overl, st->L_frame / 2, 0 /*Qf_syn*/, -1 /*Qf_old_xnq*/, 0, 0 /*Q_old_xnq*/ ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + st->hTcxDec->Q_old_syn_Overl = sub( st->Q_syn, 1 ); + move16(); +#endif hTcxDec->tcxltp_last_gain_unmodified = 0; move16(); -- GitLab From 25546392018d5ba6856a515ce08641b910fb7777 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 20 May 2025 10:54:07 +0200 Subject: [PATCH 0665/1310] clang format. --- lib_dec/acelp_core_dec_fx.c | 64 ++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 0ba5d5caf..ef5c04774 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -85,9 +85,9 @@ ivas_error acelp_core_dec_fx( Word16 lsp_mid_fx[M]; /* LSPs in the middle of the frame */ Word16 Aq_fx[NB_SUBFR16k * ( M + 1 )]; /* A(q) quantized for the 4 subframes */ Word16 old_exc2_fx[L_FRAME16k + L_EXC_MEM], *exc2_fx; /* total excitation buffer */ - Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ - Word32 enr_q_fx; /* E information for FER protection */ - Word16 tmp_noise_fx; /* Long term temporary noise energy */ + Word16 mem_tmp_fx[M]; /* temporary synthesis filter memory */ + Word32 enr_q_fx; /* E information for FER protection */ + Word16 tmp_noise_fx; /* Long term temporary noise energy */ Word16 Es_pred_fx; /* predicted scaled innov. energy Q8 */ Word16 FEC_pitch_fx; /* FEC pitch */ Word16 old_bwe_exc_fx[( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 )]; /* excitation buffer */ @@ -266,7 +266,7 @@ ivas_error acelp_core_dec_fx( if ( st->hGSCDec != NULL ) { - /* reset the GSC pre echo energy threshold in case of switching */ + /* reset the GSC pre echo energy threshold in case of switching */ st->hGSCDec->Last_frame_ener_fx = MAX_32; move32(); } @@ -1425,15 +1425,15 @@ ivas_error acelp_core_dec_fx( Copy( psyn_fx + sub( st->L_frame, L_EXC_MEM ), st->hWIDec->old_syn2_fx, L_EXC_MEM ); } st->prev_Q_exc_fr = st->Q_exc; - move16(); + move16(); st->prev_Q_syn_fr = st->Q_syn; - move16(); + move16(); Copy( psyn_fx + sub( st->L_frame, L_SYN_MEM_CLAS_ESTIM ), st->mem_syn_clas_estim_fx, L_SYN_MEM_CLAS_ESTIM ); - /*------------------------------------------------------------* - * FEC - Smooth the speech energy evolution when recovering after a BAD frame - * (smoothing is performed in the excitation domain and signal is resynthesized after) - *------------------------------------------------------------*/ + /*------------------------------------------------------------* + * FEC - Smooth the speech energy evolution when recovering after a BAD frame + * (smoothing is performed in the excitation domain and signal is resynthesized after) + *------------------------------------------------------------*/ test(); IF( EQ_32( st->total_brate, ACELP_7k20 ) || EQ_32( st->total_brate, ACELP_8k00 ) ) @@ -1455,7 +1455,7 @@ ivas_error acelp_core_dec_fx( &st->uv_count, &st->act_count, st->lspold_s_fx, &st->noimix_seed, &st->min_alpha_fx, &st->exc_pe_fx, st->core_brate, st->bwidth, &st->Q_stat_noise, &st->Q_stat_noise_ge ); } - } + } IF( st->hBWE_TD != NULL ) { @@ -1517,14 +1517,14 @@ ivas_error acelp_core_dec_fx( * Formant post-filter *-----------------------------------------------------------------*/ - test(); - test(); - test(); + test(); + test(); + test(); test(); IF( st->hPFstat != NULL && GE_16( st->last_bwidth, WB ) && ( GT_32( st->core_brate, ACELP_24k40 ) || st->element_mode > EVS_MONO ) && LE_32( st->core_brate, ACELP_32k ) ) - { + { st->hPFstat->on = 1; - move16(); + move16(); Copy( psyn_fx, temp_buf_fx + L_SYN_MEM, L_FRAME16k ); set16_fx( st->hPFstat->mem_zero, 0, M ); @@ -1597,13 +1597,13 @@ ivas_error acelp_core_dec_fx( { /* Noise estimate */ ApplyFdCng_fx( psyn_fx, st->Q_syn, NULL, 0, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); - } + } IF( !st->cna_dirac_flag ) { test(); test(); - test(); + test(); test(); test(); test(); @@ -1635,7 +1635,7 @@ ivas_error acelp_core_dec_fx( } } ELSE IF( NE_16( st->element_mode, IVAS_CPE_DFT ) ) - { + { IF( EQ_16( st->element_mode, EVS_MONO ) ) { generate_masking_noise_fx( psyn_fx, st->Q_syn, st->hFdCngDec->hFdCngCom, st->hFdCngDec->hFdCngCom->frameSize, 0 ); @@ -1736,9 +1736,9 @@ ivas_error acelp_core_dec_fx( } } - test(); - test(); - test(); + test(); + test(); + test(); IF( ( st->flag_cna == 0 ) || ( EQ_16( st->coder_type, AUDIO ) && !( st->element_mode > EVS_MONO && st->GSC_noisy_speech ) ) ) { IF( st->idchan == 0 ) @@ -1988,12 +1988,12 @@ ivas_error acelp_core_dec_fx( st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->cldfbAna->no_channels ); move16(); } - test(); - IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - test(); - test(); test(); + IF( !st->cng_sba_flag || EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) + { + test(); + test(); + test(); /*WB/SWB-FD_CNG*/ IF( ( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) ) && ( EQ_16( st->cng_type, FD_CNG ) ) && ( LT_16( st->hFdCngDec->hFdCngCom->numCoreBands, st->cldfbSyn->no_channels ) ) ) { @@ -2010,13 +2010,13 @@ ivas_error acelp_core_dec_fx( IF( LT_16( st->hFdCngDec->hFdCngCom->regularStopBand, st->cldfbSyn->no_channels ) ) { st->cldfbSyn->bandsToZero = sub( st->cldfbSyn->no_channels, st->hFdCngDec->hFdCngCom->regularStopBand ); - move16(); + move16(); } ELSE - { + { st->cldfbSyn->bandsToZero = 0; - move16(); - } + move16(); + } } } @@ -2111,7 +2111,7 @@ ivas_error acelp_core_dec_fx( } ELSE { - /* synthesis of the combined signal */ + /* synthesis of the combined signal */ max_real = 0; max_imag = 0; move32(); -- GitLab From 9aea06c25b2c29176d923abc0b808b11f01c149f Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 20 May 2025 11:02:33 +0200 Subject: [PATCH 0666/1310] Restore changes lost because of merge conflict. --- lib_com/prot_fx.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 498be3137..2fc32b008 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9472,8 +9472,15 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T void IMDCT_ivas_fx( Word32 *x_fx, Word16 q_x, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 *old_syn_overl_fx, + Word16 *Q_old_syn_overl_fx, Word16 *syn_Overl_TDAC_fx, + Word16 *Q_syn_Overl_TDAC_fx, +#else + Word16 *old_syn_overl_fx, + Word16 *syn_Overl_TDAC_fx, +#endif Word16 *xn_buf_fx, const Word16 *tcx_aldo_window_1_fx, const PWord16 *tcx_aldo_window_1_trunc_fx, @@ -9495,11 +9502,18 @@ void IMDCT_ivas_fx( const Word16 frame_cnt, const Word16 bfi, Word16 *old_out_fx, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD + Word16 *q_old_out_fx, +#endif const Word16 FB_flag, Decoder_State *st, const Word16 fullbandScale, Word16 *acelp_zir_fx, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *pq_win ); +#else Word16 q_win ); +#endif void v_mult16_fixed( const Word16 x1[], /* i : Input vector 1 */ -- GitLab From ecc6cd719249410b546b166a50e4f072dfaf3236 Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Tue, 20 May 2025 12:32:02 +0200 Subject: [PATCH 0667/1310] push_wmops/pop_wmops added to stereo_dmx_evs_enc. Fix 1511 added. --- lib_com/options.h | 2 -- lib_enc/ivas_stereo_dmx_evs_fx.c | 53 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b02cd8561..eb5ea7c73 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,8 +114,6 @@ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ #define FIX_983_DISC_ISM_DIGEST_NUM_OBJS /* FhG: issue #983: the discrete ISM digest function uses the wrong number of objects */ -#define BE_FIX_567_DOUBLE_STEREO_DMX /* NTT: Fix formal issues */ -#define NONBE_FIX_567_DOUBLE_STEREO_DMX /* Orange: Double-precision replaced by single-precision */ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 4e9bc3da5..ba5ae0c2a 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -100,6 +100,9 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 +#define STEREO_DMX_EVS_POC_RENORM_TH 33554432 // 65536 << 9 +#define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 + #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define STEREO_DMX_EVS_FAD_R 3 #ifdef NONBE_FIX_947_STEREO_DMX_FADOPT @@ -474,6 +477,17 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } + specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -486,6 +500,17 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } + specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[j] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -506,6 +531,18 @@ static void calc_poc_fx( Li = L_add( L_sub( specLi[i], Mpy_32_32_r( specRr[i], eps_sin ) ), Mpy_32_32_r( specRi[i], eps_cos ) ); Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); + + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } + specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -516,6 +553,18 @@ static void calc_poc_fx( Li = L_sub( L_sub( specLi[j], Mpy_32_32_r( specRr[j], eps_sin ) ), Mpy_32_32_r( specRi[j], eps_cos ) ); Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); + + IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && + ( LT_32( L_abs( Ri ), STEREO_DMX_EVS_POC_RENORM_TH ) ) ) + { + Lr = L_shl( Lr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Li = L_shl( Li, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); + } + specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); specPOi[j] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) ); // 2*spec_e @@ -2462,6 +2511,8 @@ void stereo_dmx_evs_enc_fx( Word64 W_tmp; Word16 W_tmp_q; + push_wmops( "stereo_dmx_evs_enc" ); + if ( is_binaural ) { /* use of is_binaural flag is to be considered */ @@ -3338,6 +3389,8 @@ void stereo_dmx_evs_enc_fx( Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 #endif + pop_wmops(); + return; } -- GitLab From fd4b0334910148839c12b249f7a121bd0e82f677 Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Tue, 20 May 2025 16:40:11 +0200 Subject: [PATCH 0668/1310] push_wmops/pop_wmops corrected for stereo_dmx_evs_enc. --- lib_enc/ivas_stereo_dmx_evs_fx.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index ba5ae0c2a..0c54e0d07 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -3014,7 +3014,10 @@ void stereo_dmx_evs_enc_fx( Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 + pop_wmops(); + #else + Word16 n; Word16 dmx_weight, corr; // Q15 Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 @@ -3037,6 +3040,8 @@ void stereo_dmx_evs_enc_fx( Word64 W_tmp; Word16 W_tmp_q; + push_wmops( "stereo_dmx_evs_enc" ); + if ( is_binaural ) { /* use of is_binaural flag is to be considered */ @@ -3387,10 +3392,11 @@ void stereo_dmx_evs_enc_fx( } Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 -#endif pop_wmops(); +#endif + return; } -- GitLab From 26225ecf79f751bea8dfd8751369e1f6ae6012be Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 20 May 2025 17:07:48 +0200 Subject: [PATCH 0669/1310] port float MR 1391 - remove deactivated code --- lib_dec/ivas_output_config_fx.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index bd30680da..4a3362cd2 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -265,16 +265,6 @@ void ivas_renderer_select( move16(); } -#if 0 // def DEBUGGING /*temp disabling this as paramMC crashes with CREND*/ - IF ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_CREND ) - { - *renderer_type = RENDERER_BINAURAL_MIXER_CONV; - } - ELSE IF ( st_ivas->hRenderConfig->renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) - { - *renderer_type = RENDERER_BINAURAL_FASTCONV; - } -#endif test(); IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { -- GitLab From a0561069fe9c1a961d5aeb010b63a9246c475385 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 20 May 2025 17:23:23 +0200 Subject: [PATCH 0670/1310] port FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec_fx.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 48c7534d6..0ddb06df4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,6 +119,7 @@ #define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ +#define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index c85e36d8e..8db29e4df 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -175,6 +175,7 @@ ivas_error ivas_jbm_dec_tc_fx( { hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } +#ifndef FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) && EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) @@ -192,6 +193,7 @@ ivas_error ivas_jbm_dec_tc_fx( Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 } } +#endif } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { -- GitLab From 5c952379c4f4ad97331bff350d24e6f3f5404bd1 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 20 May 2025 17:31:58 +0200 Subject: [PATCH 0671/1310] port FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN --- lib_com/options.h | 1 + lib_dec/ivas_ism_dec_fx.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 48c7534d6..ed43bcb65 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,6 +119,7 @@ #define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ +#define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 18c6953f2..a4294558e 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -369,6 +369,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( tc_nchan_full_new = tc_nchan_tc_new; move16(); +#ifndef FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN test(); test(); IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) @@ -379,6 +380,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( move16(); } +#endif test(); test(); test(); -- GitLab From ea2c44232376f796ebbba3b68d27a2fa0f265028 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 21 May 2025 13:20:12 +0530 Subject: [PATCH 0672/1310] Fix for 3GPP issue 1590: Very high MLD for ParamISM (ISM4) 24.4kbps SWB with +10dB input and DTX enabled Link #1590 --- lib_enc/speech_music_classif_fx.c | 42 ++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 65000a7b3..817e5fb70 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -2612,7 +2612,7 @@ static Word16 attack_det_ivas_fx( /* o : attack flag Word16 *last_strong_attack /* i/o: last strong attack flag */ ) { - Word16 i, j, tmp, tmp1, attack, exp1; + Word16 i, j, tmp, tmp1, attack, exp1, etmp_e, etmp2_e, s; Word32 L_tmp, etmp, etmp2, finc[ATT_NSEG], mean_finc; Word16 att_3lsub_pos; Word16 attack1; @@ -2665,29 +2665,42 @@ static Word16 attack_det_ivas_fx( /* o : attack flag exp1 = norm_s( att_3lsub_pos ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), att_3lsub_pos ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[0], Qx, &Overflow ); /*Qx */ - - FOR( i = 1; i < att_3lsub_pos; i++ ) + W_tmp = 0; + move64(); + FOR( i = 0; i < att_3lsub_pos; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr_o( finc[i], Qx, &Overflow ), &Overflow ); /*Qx */ + W_tmp = W_add( W_tmp, finc[i] ); /* *q_ finc_prev */ } - L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ - etmp = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ + s = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, s ) ); // *q_finc_prev + s - 32 + + L_tmp = Mpy_32_16_1( L_tmp, tmp ); /* *q_finc_prev + s - 32 + Q29 - exp1 - 15 => *q_finc_prev + s - exp1 - 18 */ + etmp = L_tmp; + move32(); + etmp_e = sub( 31, add( *q_finc_prev, sub( s, add( exp1, 18 ) ) ) ); + tmp1 = sub( ATT_NSEG, attack ); exp1 = norm_s( tmp1 ); tmp = div_s( shl( 1, sub( 14, exp1 ) ), tmp1 ); /*Q(29-exp1) */ - L_tmp = L_shr_o( finc[attack], Qx, &Overflow ); /*Qx */ - FOR( i = 1; i < tmp1; i++ ) + W_tmp = 0; + move64(); + FOR( i = 0; i < tmp1; i++ ) { - L_tmp = L_add_o( L_tmp, L_shr_o( finc[i + attack], Qx, &Overflow ), &Overflow ); /*Qx */ + W_tmp = W_add( W_tmp, finc[i + attack] ); /* *q_finc_prev */ } - L_tmp = Mult_32_16( L_tmp, tmp ); /*Q(14-exp1+Qx) */ - etmp2 = L_shl( L_tmp, sub( exp1, 14 ) ); /*Qx */ + s = W_norm( W_tmp ); + L_tmp = W_extract_h( W_shl( W_tmp, s ) ); // *q_finc_prev + s - 32 + + L_tmp = Mpy_32_16_1( L_tmp, tmp ); /* *q_finc_prev + s - 32 + Q29 - exp1 - 15 => *q_finc_prev + s - exp1 - 18 */ + etmp2 = L_tmp; + move32(); + etmp2_e = sub( 31, add( *q_finc_prev, sub( s, add( exp1, 18 ) ) ) ); /* and compare them */ - if ( GT_32( etmp, L_shr( etmp2, 3 ) ) ) + /* if ( etmp * 8 > etmp2 ) */ + if ( BASOP_Util_Cmp_Mant32Exp( etmp, add( etmp_e, 3 ), etmp2, etmp2_e ) > 0 ) { /* stop, if the attack is not sufficiently strong */ attack = 0; @@ -2695,7 +2708,8 @@ static Word16 attack_det_ivas_fx( /* o : attack flag } test(); - if ( EQ_16( last_clas, VOICED_CLAS ) && GT_32( L_add( L_shl( etmp, 4 ), L_shl( etmp, 2 ) ), etmp2 ) ) + /* if ( last_clas == VOICED_CLAS && etmp * 20 > etmp2 ) */ + if ( EQ_16( last_clas, VOICED_CLAS ) && BASOP_Util_Cmp_Mant32Exp( etmp, etmp_e, Mpy_32_16_1( etmp2, 1638 /* 1/20 in Q15 */ ), etmp2_e ) > 0 ) { /* stop, if the signal was voiced and the attack is not sufficiently strong */ attack = 0; -- GitLab From 83f7cc6dd069f1a4e2f8946f7293119f44f1bf04 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 21 May 2025 16:05:35 +0200 Subject: [PATCH 0673/1310] add define FIX_1001_ARI_HM_OVERFLOW for completeness --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index 848e56e37..94687d479 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -121,6 +121,7 @@ #define FIX_ACCESS_WITHIN_NULL_STRUCT_MC_BW_SWITCHING /* FhG: fix usan error in MCT with bw swicthing */ #define NONBE_FIX_986_MC_BW_SWITCHING /* FhG: fix crash in bw and br switching with MC */ #define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ +#define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ /* #################### End BASOP porting switches ############################ */ -- GitLab From 362a5935f4a97e0d2913eeb06bb169d574a21618 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 21 May 2025 16:23:49 +0200 Subject: [PATCH 0674/1310] port NONBE_FIX_999_JBM_MCT_FLUSH --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec_fx.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 3e4dae0d5..bffb21a18 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,6 +128,7 @@ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #endif +#define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index c85e36d8e..f8936a44c 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2818,7 +2818,11 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( ivas_binaural_add_LFE_fx( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } +#ifdef NONBE_FIX_999_JBM_MCT_FLUSH + ELSE IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_OBJECTS_TD ) ) +#else ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) +#endif { IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, hTcBuffer->n_samples_granularity ) ), IVAS_ERR_OK ) ) { @@ -2826,6 +2830,12 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( } ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } +#ifdef NONBE_FIX_999_JBM_MCT_FLUSH + ELSE + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong renderer in MCT VoIP renderer flushing!" ); + } +#endif } ELSE { -- GitLab From 1ab5a24fd0b1dea352dc5122a22256a8ef0a3854 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 21 May 2025 17:59:39 +0200 Subject: [PATCH 0675/1310] Add scaling correction of xn_buf_fx, which was missing. --- lib_com/prot_fx.h | 3 + lib_dec/dec_tcx_fx.c | 131 +++++++++++++++++++------------- lib_dec/ivas_mdct_core_dec_fx.c | 7 +- 3 files changed, 87 insertions(+), 54 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 2fc32b008..7d6f3e55e 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9482,6 +9482,9 @@ void IMDCT_ivas_fx( Word16 *syn_Overl_TDAC_fx, #endif Word16 *xn_buf_fx, +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_xn_buf_fx, +#endif const Word16 *tcx_aldo_window_1_fx, const PWord16 *tcx_aldo_window_1_trunc_fx, const PWord16 *tcx_aldo_window_2_fx, diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index b51493262..49886cecf 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2588,29 +2588,17 @@ static Word16 IMDCT_ivas_fx_calc_qwin( const Word16 L_frameTCX, const Word16 FB_flag ) { -#if 0 Word16 oldLength; - oldLength = L_FRAME32k; + oldLength = s_min( L_FRAME32k, L_frame ); move16(); if ( FB_flag ) { - oldLength = L_FRAME48k; + oldLength = s_min( L_FRAME48k, L_frameTCX ); move16(); } -#else - Word16 oldLength; - oldLength = L_frame; - move16(); - if ( FB_flag ) - { - oldLength = L_frameTCX; - move16(); - } -#endif - - q_win = 4; + q_win = 6; move16(); // q_win == norm + Q_syn_Overl_TDAC @@ -2625,6 +2613,8 @@ static Word16 IMDCT_ivas_fx_calc_qwin( } static void IMDCT_ivas_fx_rescale( + Word16 *xn_buf_fx, + Word16 *q_xn_buf_fx, Word16 *syn_Overl_TDAC, Word16 *Q_syn_Overl_TDAC, Word16 *syn_Overl, @@ -2647,6 +2637,9 @@ static void IMDCT_ivas_fx_rescale( } #if 1 + Scale_sig(xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub ( q_win, *q_xn_buf_fx ) ); + *q_xn_buf_fx = q_win; + move16(); Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win *Q_syn_Overl_TDAC = q_win; move16(); @@ -2937,6 +2930,9 @@ void IMDCT_ivas_fx( Word16 *syn_Overl_TDAC_fx, // Q(-2) #endif Word16 *xn_buf_fx, // Q(-2) +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_xn_buf_fx, +#endif const Word16 *tcx_aldo_window_1_fx, // Q(15) const PWord16 *tcx_aldo_window_1_trunc_fx, // Q(15) const PWord16 *tcx_aldo_window_2_fx, // Q(15) @@ -2983,10 +2979,12 @@ void IMDCT_ivas_fx( move16(); move16(); x_e_hdrm = sub( Q16, q_x ); +#if 0 IF( *pq_win == 0 ) { allow_qwin_change = 0; } +#endif IF( allow_qwin_change ) { // q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); @@ -3086,6 +3084,9 @@ void IMDCT_ivas_fx( test(); L_spec_TCX5_tmp = imult1616( w, L_spec_TCX5 ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + // Assume that xn_buf_fx has no headroom. + q_win = s_min( q_xn_buf_fx, q_win ); + IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) { TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, allow_qwin_change ); @@ -3099,7 +3100,7 @@ void IMDCT_ivas_fx( TCX_MDCT_Inverse_qwin_fx( x_fx + L_spec_TCX5_tmp, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, st->element_mode, &q_win, allow_qwin_change ); } - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) || s_and( kernel_type, w ) ) { @@ -3155,6 +3156,10 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win_prev; +#if 0 + // Assume that xn_buf_fx has no headroom. + q_win = s_min( q_xn_buf_fx, q_win ); +#endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( allow_qwin_change ) { @@ -3199,8 +3204,11 @@ void IMDCT_ivas_fx( /* copy new sub-window region not overlapping with previous window */ Copy( win_fx + L_win, xn_buf_fx + shr( overlap, 1 ), add( L_win, shr( L_ola, 1 ) ) ); - /* 2nd TCX-5 window, regular MDCT with minimum overlap on both sides */ #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + q_xn_buf_fx = q_win; + move16(); + + /* 2nd TCX-5 window, regular MDCT with minimum overlap on both sides */ IF( s_and( kernel_type, 1 ) ) { TCX_MDST_Inverse_qwin_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola, &q_win, allow_qwin_change ); @@ -3212,8 +3220,9 @@ void IMDCT_ivas_fx( assert( q_win_prev == q_win ); - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else + /* 2nd TCX-5 window, regular MDCT with minimum overlap on both sides */ IF( s_and( kernel_type, 1 ) ) { TCX_MDST_Inverse_fx( x_fx + L_spec_TCX5, x_e_hdrm, win_fx, L_ola, sub( L_win, L_ola ), L_ola ); @@ -3270,8 +3279,11 @@ void IMDCT_ivas_fx( { TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, st->element_mode, &q_win, allow_qwin_change ); } + // Because xn_buf_fx is overwritten above. + q_xn_buf_fx = q_win; + move16(); - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) { @@ -3334,7 +3346,7 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN // q_win < norm + q_tmp_fx_32 - 16 q_win = s_min( q_win, L_norm_arr( tmp_fx_32, L_frame ) + q_tmp_fx_32 - 16 ); - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 diff = sub( q_tmp_fx_32, q_win ); @@ -3363,8 +3375,8 @@ void IMDCT_ivas_fx( assert( extract_h( L_shr( old_out_fx_32[ind], diff ) ) == 0 || extract_h( L_shr( old_out_fx_32[ind], diff ) ) == -1 ); old_out_fx[ind] = extract_l( L_shr( old_out_fx_32[ind], diff ) ); #endif - xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) ); assert( extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == 0 || extract_h( L_shr( xn_buf_fx_32[ind], diff ) ) == -1 ); + xn_buf_fx[ind] = extract_l( L_shr( xn_buf_fx_32[ind], diff ) ); move16(); move16(); } @@ -3398,7 +3410,7 @@ void IMDCT_ivas_fx( // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 2 ); } - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 q_diff = sub( q_xn_buf_fx_32, q_win ); @@ -3459,7 +3471,7 @@ void IMDCT_ivas_fx( { allow_qwin_change = 0; move16(); - q_win = s_max( -2, sub( q_win, 2 ) ); + q_win = s_max( -2, sub( q_win, 1 ) ); } } @@ -3475,8 +3487,11 @@ void IMDCT_ivas_fx( { TCX_MDCT_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, L_frame - overlap, overlap, st->element_mode, &q_win, allow_qwin_change ); } + // Because xn_buf_fx is overwritten above. + q_xn_buf_fx = q_win; + move16(); - IMDCT_ivas_fx_rescale( syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #else IF( EQ_16( kernel_type, MDST_IV ) ) { @@ -3547,15 +3562,15 @@ void IMDCT_ivas_fx( IF( hTcxCfg->last_aldo != 0 ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) Word16 tmp_old_out; Word16 q_diff = sub( *q_old_out_fx, q_win ); #endif FOR( i = 0; i < sub( overlap, tcx_mdct_window_min_length ); i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); - xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], tmp_old_out ); // Q(-2) + xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], tmp_old_out ); // q_win #else xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], old_out_fx[( i + nz )] ); // Q(-2) #endif @@ -3571,31 +3586,31 @@ void IMDCT_ivas_fx( // tested FOR( ; i < overlap; i++ ) /* perfectly reconstructing ALDO shortening */ { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tmp_old_out ); // Q(-2) + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tmp_old_out ); // q_win #else - xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], old_out_fx[( i + nz )] ); // Q(-2) + xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], old_out_fx[( i + nz )] ); // q_win #endif move16(); } FOR( i = 0; i < ( tcx_mdct_window_min_length / 2 ); i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); - xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[i].v.re ) ); // q_win #else - xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[i].v.re ) ); // Q(-2) + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[i].v.re ) ); // q_win #endif move16(); } FOR( ; i < tcx_mdct_window_min_length; i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); - xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // Q(-2) + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // q_win #else - xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // Q(-2) + xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( old_out_fx[( ( i + nz ) + overlap )], tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // q_win #endif move16(); } @@ -3604,7 +3619,7 @@ void IMDCT_ivas_fx( { FOR( ; i < ( overlap - ( tcx_mdct_window_min_length / 2 ) ); i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) #else @@ -3614,7 +3629,7 @@ void IMDCT_ivas_fx( } FOR( ; i < overlap; i++ ) { -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) #else @@ -4182,6 +4197,7 @@ void decoder_tcx_ivas_fx( Copy_Scale_sig_16_32_no_sat( st->old_Aq_12_8_fx, st->old_Aq_12_8_fx_32, M + 1, ( sub( 28, ( sub( 15, norm_s( sub( st->old_Aq_12_8_fx[0], 1 ) ) ) ) ) ) ); Word16 q_win, q_winFB; + q_win = st->Q_syn; move16(); q_winFB = st->Q_syn; @@ -4189,12 +4205,12 @@ void decoder_tcx_ivas_fx( assert( q_win == 0 ); + Scale_sig( synth_fx, L_frame_glob, sub( q_win, st->Q_syn ) ); // Scaling to Q_syn + Scale_sig( synthFB_fx, L_frameTCX_glob, sub( q_winFB, st->Q_syn ) ); // Scaling to Q_syn + decoder_tcx_imdct_fx( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x_fx[0], q_x, xn_buf_fx, &q_win, &q_winFB, MDCT_IV, fUseTns, &synth_fx[0], &synthFB_fx[0], bfi, frame_cnt, sba_dirac_stereo_flag ); - assert( q_win == 0 ); - assert( q_win == q_winFB ); - /* Scaling up again */ Scale_sig( synth_fx, L_frame_glob, sub( st->Q_syn, q_win ) ); Scale_sig( synthFB_fx, L_frameTCX_glob, sub( st->Q_syn, q_winFB ) ); @@ -5827,7 +5843,7 @@ void decoder_tcx_imdct_fx( { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, + IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, *q_win, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, #else IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, #endif @@ -5857,7 +5873,7 @@ void decoder_tcx_imdct_fx( { Copy32( x_fx, xn_bufFB_fx, s_max( L_spec, s_max( L_frame, L_frameTCX ) ) ); // q_x #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, + IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, &hTcxDec->Q_syn_Overl, hTcxDec->syn_Overl_TDAC, &hTcxDec->Q_syn_Overl_TDAC, xn_buf_fx, *q_win, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, #else IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, #endif @@ -5869,12 +5885,17 @@ void decoder_tcx_imdct_fx( } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 shift_q = sub( q_x, *q_winFB ); + Word16 shift_q, q_x16; + + shift_q = L_norm_arr( xn_bufFB_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); + shift_q = sub( 16, shift_q ); + q_x16 = sub( q_x, shift_q ); #endif FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { - xn_bufFB_fx_16[ind] = extract_l( L_shr( xn_bufFB_fx[ind], shift_q ) ); // q_x + assert( extract_h( L_shr( xn_bufFB_fx[ind], shift_q ) ) == 0 || extract_h( L_shr( xn_bufFB_fx[ind], shift_q ) ) == -1 ); + xn_bufFB_fx_16[ind] = extract_l( L_shr( xn_bufFB_fx[ind], shift_q ) ); // q_x16 move16(); } @@ -5885,7 +5906,7 @@ void decoder_tcx_imdct_fx( IF( st->element_mode != EVS_MONO ) { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, + IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, q_x16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, #else IMDCT_ivas_fx( x_tmp_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, #endif @@ -5899,7 +5920,7 @@ void decoder_tcx_imdct_fx( ELSE { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, + IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, &hTcxDec->Q_syn_OverlFB, hTcxDec->syn_Overl_TDACFB, &hTcxDec->Q_syn_Overl_TDACFB, xn_bufFB_fx_16, q_x16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #else IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #endif @@ -5911,12 +5932,13 @@ void decoder_tcx_imdct_fx( } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - shift_q = sub( q_x, *q_winFB ); + shift_q = 16; + move16(); #endif FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { - xn_bufFB_fx[ind] = L_shl( L_deposit_l( xn_bufFB_fx_16[ind] ), shift_q ); // Q_x + xn_bufFB_fx[ind] = L_shl( L_deposit_l( xn_bufFB_fx_16[ind] ), shift_q ); // q_winFB } IF( ( bfi == 0 ) ) @@ -5958,18 +5980,21 @@ void decoder_tcx_imdct_fx( /* Update old_syn_overl */ IF( hTcxCfg->last_aldo == 0 ) { - Copy( xn_buf_fx + L_frame, hTcxDec->syn_Overl, overlap ); // Q(-2) + Copy( xn_buf_fx + L_frame, hTcxDec->syn_Overl, overlap ); // q_win FOR( Word16 ind = 0; ind < overlapFB; ind++ ) { - hTcxDec->syn_OverlFB[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ); // q_x + assert( extract_h( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ) == 0 || extract_h( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ) == -1 ); + hTcxDec->syn_OverlFB[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + L_frameTCX )], shift_q ) ); // q_winFB } } /* Output */ - Copy( xn_buf_fx + sub( shr( overlap, 1 ), tcx_offset ), synth_fx, L_frame_glob ); // Q(-2) + Copy( xn_buf_fx + sub( shr( overlap, 1 ), tcx_offset ), synth_fx, L_frame_glob ); // q_win FOR( Word16 ind = 0; ind < L_frameTCX_glob; ind++ ) { - synthFB_fx[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ); // q_x + assert( extract_h( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ) == 0 || + extract_h( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ) == -1 ); + synthFB_fx[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ); // q_winFB } diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 0cec3dd72..00946b77d 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1316,7 +1316,7 @@ void ivas_mdct_core_reconstruct_fx( // norm(old_out) + q_win >= st->Q_syn sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); st->Q_syn = add( sf, s_min( q_win, q_winFB ) ); - +#if 0 Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDACFB ) ); // q_winFB -> Q(-1 - st->Q_syn) st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn ); move16(); @@ -1329,6 +1329,11 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; +#else + //Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( -2, st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) + //st->hTcxDec->Q_old_syn_Overl = -2; +#endif + Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn // Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); -- GitLab From 12f8828888afdfbc5d207497a210fa04634481e7 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 21 May 2025 18:04:13 +0200 Subject: [PATCH 0676/1310] clang format --- lib_dec/dec_tcx_fx.c | 22 +++++++++++----------- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 49886cecf..f5929c853 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2637,7 +2637,7 @@ static void IMDCT_ivas_fx_rescale( } #if 1 - Scale_sig(xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub ( q_win, *q_xn_buf_fx ) ); + Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( q_win, *q_xn_buf_fx ) ); *q_xn_buf_fx = q_win; move16(); Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win @@ -2929,7 +2929,7 @@ void IMDCT_ivas_fx( Word16 *old_syn_overl_fx, // Q(-2) Word16 *syn_Overl_TDAC_fx, // Q(-2) #endif - Word16 *xn_buf_fx, // Q(-2) + Word16 *xn_buf_fx, // Q(-2) #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_xn_buf_fx, #endif @@ -3562,13 +3562,13 @@ void IMDCT_ivas_fx( IF( hTcxCfg->last_aldo != 0 ) { -#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) Word16 tmp_old_out; Word16 q_diff = sub( *q_old_out_fx, q_win ); #endif FOR( i = 0; i < sub( overlap, tcx_mdct_window_min_length ); i++ ) { -#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )], tmp_old_out ); // q_win #else @@ -3586,7 +3586,7 @@ void IMDCT_ivas_fx( // tested FOR( ; i < overlap; i++ ) /* perfectly reconstructing ALDO shortening */ { -#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], tmp_old_out ); // q_win #else @@ -3596,7 +3596,7 @@ void IMDCT_ivas_fx( } FOR( i = 0; i < ( tcx_mdct_window_min_length / 2 ); i++ ) { -#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[i].v.re ) ); // q_win #else @@ -3606,7 +3606,7 @@ void IMDCT_ivas_fx( } FOR( ; i < tcx_mdct_window_min_length; i++ ) { -#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) tmp_old_out = shr_sat( old_out_fx[( ( i + nz ) + overlap )], q_diff ); xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )] = add_sat( xn_buf_fx[( ( ( i + ( overlap / 2 ) ) - tcx_offset ) + overlap )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( tcx_mdct_window_min_length - ( 1 + i ) )].v.im ) ); // q_win #else @@ -3619,7 +3619,7 @@ void IMDCT_ivas_fx( { FOR( ; i < ( overlap - ( tcx_mdct_window_min_length / 2 ) ); i++ ) { -#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( ( tcx_mdct_window_min_length - overlap ) + i )].v.re ) ); // Q(-2) #else @@ -3629,7 +3629,7 @@ void IMDCT_ivas_fx( } FOR( ; i < overlap; i++ ) { -#if defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD) && !defined(FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN) +#if defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD ) && !defined( FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN ) tmp_old_out = shr_sat( old_out_fx[( i + nz )], q_diff ); xn_buf_fx[( i + ( ( overlap / 2 ) - tcx_offset ) )] = add_sat( xn_buf_fx[( ( i + ( overlap / 2 ) ) - tcx_offset )], mult_r( tmp_old_out, tcx_mdct_window_minimum_fx[( overlap - ( 1 + i ) )].v.im ) ); // Q(-2) #else @@ -4205,7 +4205,7 @@ void decoder_tcx_ivas_fx( assert( q_win == 0 ); - Scale_sig( synth_fx, L_frame_glob, sub( q_win, st->Q_syn ) ); // Scaling to Q_syn + Scale_sig( synth_fx, L_frame_glob, sub( q_win, st->Q_syn ) ); // Scaling to Q_syn Scale_sig( synthFB_fx, L_frameTCX_glob, sub( q_winFB, st->Q_syn ) ); // Scaling to Q_syn decoder_tcx_imdct_fx( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x_fx[0], q_x, xn_buf_fx, &q_win, &q_winFB, MDCT_IV, @@ -5993,7 +5993,7 @@ void decoder_tcx_imdct_fx( FOR( Word16 ind = 0; ind < L_frameTCX_glob; ind++ ) { assert( extract_h( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ) == 0 || - extract_h( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ) == -1 ); + extract_h( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ) == -1 ); synthFB_fx[ind] = extract_l( L_shr( xn_bufFB_fx[( ind + ( ( overlapFB >> 1 ) - tcx_offsetFB ) )], shift_q ) ); // q_winFB } diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 00946b77d..dbfc46b7f 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1330,8 +1330,8 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; #else - //Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( -2, st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) - //st->hTcxDec->Q_old_syn_Overl = -2; + // Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( -2, st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) + // st->hTcxDec->Q_old_syn_Overl = -2; #endif Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn -- GitLab From c8dcc6d69ad9f19b4e70904ad882461034f3f46a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 22 May 2025 10:27:06 +0900 Subject: [PATCH 0677/1310] Add NONBE_FIX_978_MC_TDREND_REVERB to enable reverb for TD rend with MC --- lib_com/options.h | 1 + lib_dec/ivas_init_dec.c | 4 ++++ lib_dec/ivas_ism_dec_fx.c | 4 ++++ lib_dec/ivas_objectRenderer_internal_fx.c | 8 ++++++++ 4 files changed, 17 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 3e4dae0d5..33574099d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,6 +128,7 @@ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #endif +#define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b4af0ed06..69eed516c 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2272,7 +2272,11 @@ ivas_error ivas_init_decoder_fx( move16(); } +#ifdef NONBE_FIX_978_MC_TDREND_REVERB + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#else IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#endif { IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 18c6953f2..18b054759 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -218,7 +218,11 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( { return error; } +#ifdef NONBE_FIX_978_MC_TDREND_REVERB + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#else IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#endif { IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index 71b16a6c6..48cbd21c7 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -237,7 +237,11 @@ ivas_error ivas_td_binaural_renderer_sf_fx( } test(); +#ifdef NONBE_FIX_978_MC_TDREND_REVERB + IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#else IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#endif { FOR( i = 0; i < nchan_ism_internal; ++i ) { @@ -269,7 +273,11 @@ ivas_error ivas_td_binaural_renderer_sf_fx( } test(); +#ifdef NONBE_FIX_978_MC_TDREND_REVERB + IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#else IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#endif { /* add reverb to rendered signals */ v_add_32( reverb_signal_fx[0], output_fx_local[0], output_fx_local[0], output_frame ); // Q11 -- GitLab From 5b318766d533bb1b76dd930426751c13a0c46187 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 21 May 2025 15:15:28 +0530 Subject: [PATCH 0678/1310] Fix for 3GPP issue 1584: Accuracy of spatial metadata in ivas_mcmasa_enc_fx compared to the floating point equivalent Link #1584 --- lib_com/prot_fx.h | 1 + lib_com/tools_fx.c | 12 +++++ lib_enc/ivas_mcmasa_enc_fx.c | 91 ++++++++++++++++++++++++++++-------- 3 files changed, 85 insertions(+), 19 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 044a06b5b..b00894190 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -4646,6 +4646,7 @@ Word16 get_min_scalefactor( Word32 x, Word32 y ); Flag is_zero_arr( Word32 *arr, Word16 size ); Flag is_zero_arr16( Word16 *arr, Word16 size ); +Flag is_zero_arr64( Word64 *arr, Word16 size ); void edct2_fx_ivas( const Word16 n, diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 77e779efd..e8549ce9f 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -4738,6 +4738,18 @@ Flag is_zero_arr16( Word16 *arr, Word16 size ) return 1; } +Flag is_zero_arr64( Word64 *arr, Word16 size ) +{ + FOR( Word16 i = 0; i < size; i++ ) + { + IF( arr[i] != 0 ) + { + return 0; + } + } + return 1; +} + void Scale_sig64( Word64 x[], /* i/o: signal to scale Qx */ Word16 len, /* i : size of x[] Q0 */ diff --git a/lib_enc/ivas_mcmasa_enc_fx.c b/lib_enc/ivas_mcmasa_enc_fx.c index 7a5718e99..b89424e76 100644 --- a/lib_enc/ivas_mcmasa_enc_fx.c +++ b/lib_enc/ivas_mcmasa_enc_fx.c @@ -81,7 +81,16 @@ static void compute_cov_mtx_fx( CovarianceMatrix *COVls, /* o : Output matrix, contains upper part of cov mtx */ Word16 inp_exp /*Stores exponent for temp*/ ); -static void computeIntensityVector_enc_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], const Word16 enc_param_start_band, const Word16 num_frequency_bands, Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ); + +static void computeIntensityVector_enc_fx( + const Word16 *band_grouping, + Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], + const Word16 enc_param_start_band, /* i : first band to process */ + const Word16 num_frequency_bands, + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], + Word16 *exp_intensity_real, + Word16 inp_q ); static void computeVerticalDiffuseness_fx( Word32 **buffer_intensity, /* i : Intensity vectors */ @@ -737,7 +746,7 @@ void ivas_mcmasa_enc_fx( move32(); hQMeta->q_direction[0].band_data[i].elevation_fx[j] = elevation_m_values_fx[j][i]; // Q22 move32(); - hQMeta->q_direction[0].band_data[i].energy_ratio_fx[j] = energyRatio_fx[k][i]; // Q30 + hQMeta->q_direction[0].band_data[i].energy_ratio_fx[j] = energyRatio_fx[k][i]; // Q31 move32(); hQMeta->q_direction[0].band_data[i].distance[j] = fixedDistance; move16(); @@ -938,7 +947,7 @@ void ivas_mcmasa_param_est_enc_fx( Word32 renormalization_factor_coh_fx[MASA_FREQUENCY_BANDS]; // renormalization_factor_coh_e Word16 renormalization_factor_coh_e[MASA_FREQUENCY_BANDS]; Word16 surroundingCoherence_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 numAnalysisChannels; + Word16 numAnalysisChannels, shift; FOR( i = 0; i < MCMASA_MAX_ANA_CHANS; i++ ) { @@ -1168,7 +1177,7 @@ void ivas_mcmasa_param_est_enc_fx( Foa_ImagBuffer_fx, 0, num_freq_bands, - intensity_real_fx ); + intensity_real_fx, &c_e, inp_q ); computeDirectionVectors_fixed( intensity_real_fx[0], @@ -1188,7 +1197,8 @@ void ivas_mcmasa_param_est_enc_fx( FoaEven_ImagBuffer_fx, 0, num_freq_bands, - intensity_even_real_fx ); + intensity_even_real_fx, &shift, inp_q ); + Word16 ref_e = 0; move16(); computeReferencePower_enc_fx( hMcMasa->band_grouping, @@ -1211,7 +1221,7 @@ void ivas_mcmasa_param_est_enc_fx( /* only real part needed */ Copy32( intensity_even_real_fx[i], &( hMcMasa->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); // hMcMasa->buffer_intensity_real_q } - hMcMasa->buffer_intensity_real_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_q[index - 1] = sub( 31, shift ); move16(); Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); // ref_e hMcMasa->buffer_energy_q[index - 1] = sub( Q31, ref_e ); @@ -1227,7 +1237,7 @@ void ivas_mcmasa_param_est_enc_fx( IF( !hMcMasa->isHorizontalSetup ) { Copy32( intensity_real_fx[2], &( hMcMasa->buffer_intensity_real_vert_fx[index - 1][0] ), num_freq_bands ); - hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( 31, c_e ); move16(); computeVerticalDiffuseness_fx( hMcMasa->buffer_intensity_real_vert_fx, hMcMasa->buffer_energy_fx, hMcMasa->no_col_avg_diff, num_freq_bands, vertical_diffuseness_vector_fx, hMcMasa->buffer_intensity_real_vert_q, hMcMasa->buffer_energy_q ); v_min_fx( diffuseness_vector_fx, out_exp, vertical_diffuseness_vector_fx, q_vdv, diffuseness_vector_fx, out_exp, num_freq_bands ); @@ -2071,21 +2081,30 @@ static void compute_cov_mtx_fx( return; } + static void computeIntensityVector_enc_fx( const Word16 *band_grouping, - Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], - const Word16 enc_param_start_band, /* i : first band to process */ + Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/ + const Word16 enc_param_start_band, /* i : first band to process */ const Word16 num_frequency_bands, - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] ) + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ + Word16 *exp_intensity_real, + Word16 inp_q ) { - /* Reminder - * X = a + ib; Y = c + id - * X*Y = ac - bd + i(ad +bc) - */ Word16 i, j; Word32 real, img; - Word16 brange[2]; + Word16 brange[2], shift = 63; + move16(); + Flag is_zero = 0; + move16(); + + Word64 intensity_real64[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + set64_fx( intensity_real64[i], 0, MASA_FREQUENCY_BANDS ); + } FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; i++ ) { @@ -2108,17 +2127,51 @@ static void computeIntensityVector_enc_fx( img = Cldfb_ImagBuffer[0][j]; move32(); /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real[0][i] = L_add( intensity_real[0][i], L_add( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), Mpy_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q -31 + intensity_real64[0][i] = W_add( intensity_real64[0][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q move32(); - intensity_real[1][i] = L_add( intensity_real[1][i], L_add( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), Mpy_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q -31 + intensity_real64[1][i] = W_add( intensity_real64[1][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q move32(); - intensity_real[2][i] = L_add( intensity_real[2][i], L_add( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), Mpy_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q -31 + intensity_real64[2][i] = W_add( intensity_real64[2][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q move32(); } } + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + is_zero = is_zero_arr64( intensity_real64[i], MASA_FREQUENCY_BANDS ); + IF( is_zero == 0 ) + { + BREAK; + } + } + IF( is_zero == 0 ) + { + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + shift = s_min( shift, W_norm_arr( intensity_real64[i], MASA_FREQUENCY_BANDS ) ); + } + + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + { + intensity_real[i][j] = W_extract_h( W_shl( intensity_real64[i][j], shift ) ); + move32(); + } + } + + *exp_intensity_real = sub( 31, sub( add( shift, shl( inp_q, 1 ) ), 32 ) ); + move16(); + } + ELSE + { + *exp_intensity_real = 0; + move16(); + } + return; } + static void computeVerticalDiffuseness_fx( Word32 **buffer_intensity, /* i : Intensity vectors */ const Word32 *buffer_energy, /* i : Energy */ -- GitLab From bb0b3cc44f4b2844a19b09d7cbf3a77e968e34ec Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 22 May 2025 10:55:58 +0200 Subject: [PATCH 0679/1310] Added switches and definitions in options.h and common_api_types.h --- lib_com/common_api_types.h | 3 +++ lib_com/options.h | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 3200cb21d..e1114a4f3 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -182,6 +182,9 @@ typedef struct TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_HANDLE; typedef struct ivas_hrtfs_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE; typedef struct ivas_hrtfs_fastconv_struct *IVAS_DEC_HRTF_FASTCONV_HANDLE; typedef struct ivas_hrtfs_parambin_struct *IVAS_DEC_HRTF_PARAMBIN_HANDLE; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +typedef struct ivas_hrtfs_statistics_struct *IVAS_DEC_HRTF_STATISTICS_HANDLE; +#endif typedef struct cldfb_filter_bank_struct *IVAS_CLDFB_FILTER_BANK_HANDLE; typedef struct ivas_LS_setup_custom *IVAS_LSSETUP_CUSTOM_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index 2a87c540b..a5abfb012 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -99,6 +99,13 @@ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT +#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format */ +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#define NONBE_FIX_AVG_IAC_CLDFB_REVERB +#endif +#endif #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #define NONBE_FIX_AVG_IAC_CLDFB_REVERB -- GitLab From 8483d61d58aa68a3efec8df2147e671cb0cb4da6 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 22 May 2025 11:15:36 +0200 Subject: [PATCH 0680/1310] port float MR 1406 --- lib_com/options.h | 4 ++- lib_dec/ivas_mct_dec_fx.c | 58 ++++++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3e4dae0d5..e0a120754 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,7 +127,9 @@ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ -#endif +#endif +#define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ + /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index db9cddc39..c42df1943 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1022,31 +1022,39 @@ static ivas_error ivas_mc_dec_reconfig_fx( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); /* transfer subframe info from DirAC or ParamMC to central tc buffer */ - test(); - IF( EQ_16( last_mc_mode, MC_MODE_PARAMMC ) ) - { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; - move16(); - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; - move16(); - st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; - move16(); - st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; - move16(); - Copy( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } - ELSE IF( EQ_16( last_mc_mode, MC_MODE_MCMASA ) && st_ivas->hSpatParamRendCom != NULL ) - { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; - move16(); - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; - move16(); - st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; - move16(); - st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; - move16(); - Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } + +#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE + if (st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER) + { +#endif + test(); + IF( EQ_16( last_mc_mode, MC_MODE_PARAMMC ) ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + move16(); + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + move16(); + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + move16(); + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + move16(); + Copy( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + ELSE IF( EQ_16( last_mc_mode, MC_MODE_MCMASA ) && st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + move16(); + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + move16(); + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + move16(); + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + move16(); + Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } +#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE + } +#endif /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv render what still fits in the new granularity */ -- GitLab From 40b4db53fa0abe119a30fc66a42f92da7fee4a94 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 22 May 2025 11:22:27 +0200 Subject: [PATCH 0681/1310] fix formatting --- lib_dec/ivas_mct_dec_fx.c | 56 +++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index c42df1943..5550c4ea1 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1024,36 +1024,36 @@ static ivas_error ivas_mc_dec_reconfig_fx( /* transfer subframe info from DirAC or ParamMC to central tc buffer */ #ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE - if (st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER) - { + if ( st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER ) + { #endif - test(); - IF( EQ_16( last_mc_mode, MC_MODE_PARAMMC ) ) - { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; - move16(); - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; - move16(); - st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; - move16(); - st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; - move16(); - Copy( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } - ELSE IF( EQ_16( last_mc_mode, MC_MODE_MCMASA ) && st_ivas->hSpatParamRendCom != NULL ) - { - st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; - move16(); - st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; - move16(); - st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; - move16(); - st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; - move16(); - Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); - } + test(); + IF( EQ_16( last_mc_mode, MC_MODE_PARAMMC ) ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + move16(); + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + move16(); + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + move16(); + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + move16(); + Copy( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + ELSE IF( EQ_16( last_mc_mode, MC_MODE_MCMASA ) && st_ivas->hSpatParamRendCom != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpatParamRendCom->nb_subframes; + move16(); + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; + move16(); + st_ivas->hTcBuffer->num_slots = st_ivas->hSpatParamRendCom->num_slots; + move16(); + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpatParamRendCom->slots_rendered; + move16(); + Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } #ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE - } + } #endif /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv -- GitLab From 58369307c2ca3af4bd89c864b40d0c9a3502fd38 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 22 May 2025 11:26:15 +0200 Subject: [PATCH 0682/1310] move define --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 795ba138c..91172d59a 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -96,7 +96,6 @@ #define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ -#define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT @@ -120,6 +119,7 @@ #define FIX_ACCESS_WITHIN_NULL_STRUCT_MC_BW_SWITCHING /* FhG: fix usan error in MCT with bw swicthing */ #define NONBE_FIX_986_MC_BW_SWITCHING /* FhG: fix crash in bw and br switching with MC */ #define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ +#define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC -- GitLab From 7c69312e25c9a50fe377c92041f935b774961d96 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 22 May 2025 11:28:53 +0200 Subject: [PATCH 0683/1310] Undo wrong change to Q_old_wtda_LB. --- lib_dec/er_dec_acelp_fx.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index 18c930269..3ffbcd139 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -1061,10 +1061,7 @@ void con_acelp_fx( move16(); } set16_fx( &hHQ_core->old_out_LB_fx[( W1 + n )], 0, n ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - hHQ_core->Q_old_wtda_LB = st->Q_syn; - move16(); -#else +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; move16(); #endif -- GitLab From 423d89c59dac6f17a8e1b08e45dc56b260fc220a Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 22 May 2025 12:04:26 +0200 Subject: [PATCH 0684/1310] increase split rendering job timeout to 60 minutes --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 27535f94c..7e06c92b3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1379,7 +1379,7 @@ split-rendering-pytest-on-merge-request: - .test-job-linux-needs-testv-dir - .rules-merge-request-to-main-pc needs: ["build-codec-linux-make"] - timeout: "45 minutes" + timeout: "60 minutes" stage: compare script: - *print-common-info -- GitLab From 555f98cfaf0d8f72419236b2799bd8e41610bb65 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 22 May 2025 12:12:20 +0200 Subject: [PATCH 0685/1310] all changes in lib_util + imp declarations in lib_rend and lib_dec --- lib_com/options.h | 2 +- lib_dec/ivas_stat_dec.h | 3 ++ lib_dec/lib_dec.h | 6 +++ lib_dec/lib_dec_fx.c | 23 ++++++++++++ lib_rend/ivas_stat_rend.h | 15 +++++++- lib_util/hrtf_file_reader.c | 75 +++++++++++++++++++++++++++++++++++-- lib_util/hrtf_file_reader.h | 12 ++++++ 7 files changed, 131 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a5abfb012..17eeaec92 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,7 +97,7 @@ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ -//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index d86ece7c8..c6f06f142 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1155,6 +1155,9 @@ typedef struct Decoder_Struct HRTFS_CREND_HANDLE hSetOfHRTF; /* Set of HRTFs handle (CRend) */ HRTFS_FASTCONV_HANDLE hHrtfFastConv; /* FASTCONV HRTF tables for binaural rendering */ HRTFS_PARAMBIN_HANDLE hHrtfParambin; /* HRTF tables for parametric binauralizer */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + HRTFS_STATISTICS_HANDLE hHrtfStatistics; /* HRTF statistics handle */ +#endif LSSETUP_CUSTOM_HANDLE hLsSetupCustom; /* Custom LS configuration handle */ Word32 *hoa_dec_mtx; /* Pointer to decoder matrix for SBA */ HEAD_TRACK_DATA_HANDLE hHeadTrackData; /* Head tracking data structure */ diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index b6ce35d90..eca274491 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -379,6 +379,12 @@ ivas_error IVAS_DEC_GetHrtfParamBinHandle( IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +ivas_error IVAS_DEC_GetHrtfStatisticsHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ +); +#endif /*! r: error code*/ ivas_error IVAS_DEC_GetRenderConfig( diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 63f0ab53f..eee250751 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2599,6 +2599,29 @@ ivas_error IVAS_DEC_GetHrtfParamBinHandle( return IVAS_ERR_OK; } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*---------------------------------------------------------------------* + * IVAS_DEC_GetHrtfStatisticsHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetHrtfStatisticsHandle( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ +) +{ + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasDec->st_ivas->hHrtfStatistics == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hHrtfStatistics = &hIvasDec->st_ivas->hHrtfStatistics; + + return IVAS_ERR_OK; +} +#endif + /*---------------------------------------------------------------------* * copyRendererConfigStruct( ) * diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index cc1565943..d8dd14034 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1200,9 +1200,11 @@ typedef struct TDREND_HRFILT_FiltSet_struct ModelParamsITD_t ModelParamsITD; TDREND_HRFILT_Method_t FilterMethod; /* HR filtering method */ Word32 latency_s_fx; /* Q31 */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#else const Word32 *lr_energy_and_iac_fx[3]; /* left/right energy and interaural coherence for late reverb */ Word32 *lr_energy_and_iac_dyn_fx[3]; - +#endif } TDREND_HRFILT_FiltSet_t; /* Distance attenuation */ @@ -1474,6 +1476,17 @@ typedef struct ivas_hrtfs_parambin_struct } HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +typedef struct ivas_hrtfs_statistics_struct +{ + float *average_energy_l; + float *average_energy_r; + float *inter_aural_coherence; + int16_t fromROM; /* Flag that indicates that the pointers point to tables in ROM (controls init/dealloc).*/ +} HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; +#endif + #ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------------------* diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index ee103db2d..fd53eb631 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -577,6 +577,7 @@ static ivas_error LoadBSplineBinary( } #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-------------------------------------------------------------------* * set_default_reverb_iac_energy() * @@ -689,6 +690,7 @@ static ivas_error set_default_reverb_iac_energy( return IVAS_ERR_OK; } +#endif #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES @@ -699,11 +701,18 @@ static ivas_error set_default_reverb_iac_energy( --------------------------------------------------------------------*/ static ivas_error load_reverb_from_binary( +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ + int32_t sampleRate, /* i : sample rate */ +#else IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ - FILE *f_hrtf /* i : HR filter data file handle */ +#endif + FILE *f_hrtf /* i : HR filter data file handle */ ) { +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES int16_t i; +#endif bool is_reverb; ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; @@ -715,13 +724,21 @@ static ivas_error load_reverb_from_binary( int16_t lr_iac_len; float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if ( hHrtfStatistics == NULL ) +#else if ( HrFiltSet_p == NULL ) +#endif { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } lr_iac_len = LR_IAC_LENGTH_NR_FC; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if ( sampleRate == 16000 ) +#else if ( HrFiltSet_p->SampleRate == 16000 ) +#endif { lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; } @@ -779,6 +796,21 @@ static ivas_error load_reverb_from_binary( if ( is_reverb ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + hHrtfStatistics->average_energy_l = (float *) malloc( lr_iac_len * sizeof( float ) ); + hHrtfStatistics->average_energy_r = (float *) malloc( lr_iac_len * sizeof( float ) ); + hHrtfStatistics->inter_aural_coherence = (float *) malloc( lr_iac_len * sizeof( float ) ); + + if ( hHrtfStatistics->average_energy_l == NULL || hHrtfStatistics->average_energy_r == NULL || hHrtfStatistics->inter_aural_coherence == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + fread( hHrtfStatistics->average_energy_l, sizeof( const float ), lr_iac_len, f_hrtf ); + fread( hHrtfStatistics->average_energy_r, sizeof( const float ), lr_iac_len, f_hrtf ); + fread( hHrtfStatistics->inter_aural_coherence, sizeof( const float ), lr_iac_len, f_hrtf ); + + hHrtfStatistics->fromROM = FALSE; +#else /* left/right energy and interaural coherence for late reverb */ FOR( i = 0; i < 3; i++ ) { @@ -816,14 +848,17 @@ static ivas_error load_reverb_from_binary( HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; #endif } +#endif } else { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#else if ( ( header_check_result = set_default_reverb_iac_energy( HrFiltSet_p ) ) != IVAS_ERR_OK ) { return header_check_result; } - +#endif return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; } @@ -838,13 +873,22 @@ static ivas_error load_reverb_from_binary( *---------------------------------------------------------------------*/ ivas_error load_reverb_binary( - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ + int32_t sampleRate, /* i : sample rate */ +#else + IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ +#endif const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ) { fseek( hrtfReader->file, 0, SEEK_SET ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + return load_reverb_from_binary( hHrtfStatistics, sampleRate, hrtfReader->file ); +#else return load_reverb_from_binary( hHrtf, hrtfReader->file ); +#endif } #endif /*-------------------------------------------------------------------* @@ -1109,10 +1153,12 @@ void destroy_td_hrtf( free( ( *hHrtf )->ModelEval.hrfModL_fx ); free( ( *hHrtf )->ModelEval.hrfModR_fx ); +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES for ( i = 0; i < 3; i++ ) { free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); } +#endif } #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB else @@ -2314,6 +2360,29 @@ void destroy_SetOfHRTF( } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*---------------------------------------------------------------------* + * destroy_hrtf_statistics() + * + * Destroy the HRTF statistics set. + *---------------------------------------------------------------------*/ + +ivas_error destroy_hrtf_statistics( + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ +) +{ + if ( hHrtfStatistics != NULL && ( *hHrtfStatistics )->fromROM == FALSE ) + { + free( ( *hHrtfStatistics )->average_energy_l ); + free( ( *hHrtfStatistics )->average_energy_r ); + free( ( *hHrtfStatistics )->inter_aural_coherence ); + } + ivas_HRTF_statistics_close( hHrtfStatistics ); + return IVAS_ERR_OK; +} +#endif + + /*---------------------------------------------------------------------* * destroy_fastconv_hrtf() * diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 9a06a4e3b..51c321352 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -190,6 +190,18 @@ void destroy_parambin_hrtf( IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* i/o: Parambin HRTF handle */ ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*---------------------------------------------------------------------* + * destroy_hrtf_statistics() + * + * free memory allocated for HRTF statistics binary data + *---------------------------------------------------------------------*/ + +ivas_error destroy_hrtf_statistics( + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ +); +#endif + /*---------------------------------------------------------------------* * destroy_td_hrtf() * -- GitLab From 9f805bb9f29a243e826083a07cd25290a810aad1 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 22 May 2025 13:09:10 +0200 Subject: [PATCH 0686/1310] Fix asser failure (saturation alarm) for stereo_at_64_kbps_32kHz_in_32kHz_out_bandwidth_switching -10dB case. --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index f5929c853..579d89968 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3351,7 +3351,7 @@ void IMDCT_ivas_fx( Word16 diff = sub( q_tmp_fx_32, q_win ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); + Word16 q_old_out_diff = s_max( sub( q_tmp_fx_32, *q_old_out_fx ), 0 ); #endif FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -- GitLab From cfe8d30d8c35295601e96369fae85f0a8caf431d Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 22 May 2025 14:38:13 +0200 Subject: [PATCH 0687/1310] Fix EVS BE case stv8c_dtx_24400_8kHz.f06.COD stv8c_dtx_24400_8kHz.f06 --- lib_dec/er_dec_tcx_fx.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index a1907b44c..775be6489 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -942,8 +942,10 @@ void con_tcx_fx( move16(); /* update memory for low band */ -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT Scale_sig( hTcxDec->old_syn_Overl, shr( st->L_frame, 1 ), sub( -1, Q_syn ) ); /*Q_syn*/ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + hTcxDec->Q_old_syn_Overl = -1; + move16(); #endif lerp( hTcxDec->syn_OverlFB, hTcxDec->syn_Overl, shr( st->L_frame, 1 ), shr( L_frame, 1 ) ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT @@ -954,7 +956,7 @@ void con_tcx_fx( hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_NO hHQ_core->Q_old_wtda_LB = hHQ_core->Q_old_wtda; move16(); #endif -- GitLab From f938177b94b9ecb1425468f5d4321ccad45a49b2 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 22 May 2025 16:03:22 +0200 Subject: [PATCH 0688/1310] Add missing adaption of Q_syn_OverlFB for error concealment case. This is likely an old bug that only now become more visible. --- lib_dec/ivas_mdct_core_dec_fx.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index dbfc46b7f..bc4482837 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1421,6 +1421,11 @@ void ivas_mdct_core_reconstruct_fx( st->Q_syn = q_syn; move16(); st->hTcxDec->Q_old_syn_Overl = add( st->hTcxDec->Q_old_syn_Overl, q_syn ); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + move16(); + st->hTcxDec->Q_syn_OverlFB = add( st->hTcxDec->Q_syn_OverlFB, q_syn ); + move16(); +#endif IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || ( st->hTcxDec->tcxConceal_recalc_exc != 0 ) ) { -- GitLab From e22f1a9fa3653a7224d7a219851b39ef4d3cb651 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 22 May 2025 17:07:14 +0200 Subject: [PATCH 0689/1310] lib_rend header and .c with changes --- lib_rend/lib_rend.c | 387 +++++++++++++++++++++++++----------- lib_rend/lib_rend.h | 15 +- lib_util/hrtf_file_reader.c | 1 - 3 files changed, 281 insertions(+), 122 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 12fb2c524..ecab18225 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -212,6 +212,9 @@ typedef struct hrtf_handles IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; IVAS_DEC_HRTF_HANDLE hHrtfTD; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics; +#endif } hrtf_handles; struct IVAS_REND @@ -251,8 +254,11 @@ struct IVAS_REND /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ - +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, const RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hHrtfs ); +#else static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, hrtf_handles *hHrtfs ); +#endif static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE *hMasaExtRendOut ); static void intermidiate_ext_dirac_render( @@ -1522,10 +1528,13 @@ static ivas_error setRendInputActiveIsm( #endif { #ifndef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - { - return error; - } +#endif { + return error; + } #else IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { @@ -1585,53 +1594,57 @@ static ivas_error setRendInputActiveIsm( } } #endif - } - ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) +} +ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) +{ + IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { - IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - { - return error; - } + return error; } - ELSE - { +} +ELSE +{ #ifndef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + Word16 nchan_rend = num_src; + move16(); - test(); - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) + { + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) { - TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) + IF( Src_p->SrcSpatial_p != NULL ) { - IF( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; + Src_p->SrcSpatial_p->q_Pos_p = Q31; move16(); } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; + move16(); } + } - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_reverb_open( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ) IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#endif { - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - { - return error; - } + return error; } + } #else IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { @@ -1665,22 +1678,30 @@ static ivas_error setRendInputActiveIsm( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_reverb_open( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) { - return error; - } +#endif + return error; } - ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) - { + } + ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) - { - return error; - } - } #endif + { + return error; + } } +#endif +} - return IVAS_ERR_OK; +return IVAS_ERR_OK; } static void clearInputIsm( @@ -2494,6 +2515,9 @@ static ivas_error initMcBinauralRendering( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, IVAS_DEC_HRTF_CREND_HANDLE hMixconv, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + HRTFS_STATISTICS_HANDLE hHrtfStatistics, +#endif uint8_t reconfigureFlag ) { ivas_error error; @@ -2653,69 +2677,82 @@ static ivas_error initMcBinauralRendering( test(); IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb == NULL ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_reverb_open( &( inputMc->hReverb ), hHrtfStatistics, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) - { - return error; - } +#endif { + return error; } } - ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) - { - /* open CREND */ +} +ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) +{ + /* open CREND */ #ifdef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - hMixconv, - outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), - IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, + outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), + IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - hMixconv, - outSampleRate ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + hMixconv, + outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), + IVAS_ERR_OK ) ) #endif - { - return error; - } +#else +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, outSampleRate ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + hMixconv, + outSampleRate ) ), + IVAS_ERR_OK ) ) +#endif +#endif + { + return error; } +} - /* Initialise the EFAP handle for rotation on input layout */ - test(); - test(); - IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) +/* Initialise the EFAP handle for rotation on input layout */ +test(); +test(); +IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) +{ + IF( NE_32( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ), IVAS_ERR_OK ) ) { - IF( NE_32( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ), IVAS_ERR_OK ) ) - { - return error; - } + return error; } +} - /* determine binaural delay ( used for aligning LFE to output signal ) */ +/* determine binaural delay ( used for aligning LFE to output signal ) */ - IF( ( inputMc->crendWrapper != NULL ) ) - { - binauralDelayNs = inputMc->crendWrapper->binaural_latency_ns; - } - ELSE - { - binauralDelayNs = 0; - } - move32(); +IF( ( inputMc->crendWrapper != NULL ) ) +{ + binauralDelayNs = inputMc->crendWrapper->binaural_latency_ns; +} +ELSE +{ + binauralDelayNs = 0; +} +move32(); - binauralDelayNs = L_max( binauralDelayNs, inputMc->tdRendWrapper.binaural_latency_ns ); - Word16 exp = 0; - move16(); - Word16 var1 = BASOP_Util_Divide3232_Scale( *inputMc->base.ctx.pOutSampleRate, 1000000000, &exp ); - Word32 var2 = L_shr_r( Mpy_32_32( binauralDelayNs, L_deposit_h( var1 ) ), negate( exp ) ); /* Q0 */ - inputMc->binauralDelaySmp = extract_l( var2 ); - move16(); - // inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); +binauralDelayNs = L_max( binauralDelayNs, inputMc->tdRendWrapper.binaural_latency_ns ); +Word16 exp = 0; +move16(); +Word16 var1 = BASOP_Util_Divide3232_Scale( *inputMc->base.ctx.pOutSampleRate, 1000000000, &exp ); +Word32 var2 = L_shr_r( Mpy_32_32( binauralDelayNs, L_deposit_h( var1 ) ), negate( exp ) ); /* Q0 */ +inputMc->binauralDelaySmp = extract_l( var2 ); +move16(); +// inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); - IF( GT_16( inputMc->binauralDelaySmp, MAX_BIN_DELAY_SAMPLES ) ) - { - return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)" ); - } +IF( GT_16( inputMc->binauralDelaySmp, MAX_BIN_DELAY_SAMPLES ) ) +{ + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)" ); +} - return IVAS_ERR_OK; +return IVAS_ERR_OK; } static ivas_error initMcMasaRendering( @@ -2893,10 +2930,15 @@ static ivas_error setRendInputActiveMc( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -3059,7 +3101,13 @@ static ivas_error updateSbaPanGains( input_sba *inputSba, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, - IVAS_DEC_HRTF_CREND_HANDLE hMixconv ) + IVAS_DEC_HRTF_CREND_HANDLE hMixconv +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + , + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics +#endif + +) { ivas_error error; AUDIO_CONFIG inConfig; @@ -3122,11 +3170,17 @@ static ivas_error updateSbaPanGains( #endif { #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) - +#endif +#else +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - +#endif #endif { return error; @@ -3141,9 +3195,17 @@ static ivas_error updateSbaPanGains( return error; } #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#endif +#else +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) +#endif #endif { return error; @@ -3257,13 +3319,16 @@ static ivas_error setRendInputActiveSba( return error; } } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF ) ), IVAS_ERR_OK ) ) - { - return error; - } - +#endif { return error; } + +return error; +} static void clearInputSba( input_sba *inputSba ) { @@ -3298,8 +3363,11 @@ static ivas_error setRendInputActiveMasa( const IVAS_REND_InputId id, RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hrtfs - +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +) +#else ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ +#endif { ivas_error error; rendering_context rendCtx; @@ -3311,7 +3379,9 @@ static ivas_error setRendInputActiveMasa( rendCtx = inputMasa->base.ctx; outConfig = *rendCtx.pOutConfig; move32(); +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES (void) hRendCfg; /* Suppress warning */ +#endif IF( !isIoConfigPairSupported( inConfig, outConfig ) ) { @@ -3350,15 +3420,18 @@ static ivas_error setRendInputActiveMasa( } ELSE { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hRendCfg, hrtfs ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hrtfs ) ), IVAS_ERR_OK ) ) - { - return error; - } - inputMasa->metadataHasBeenFed = false; - move16(); +#endif { + return error; } + inputMasa->metadataHasBeenFed = false; + move16(); +} - return IVAS_ERR_OK; +return IVAS_ERR_OK; } static void clearInputMasa( @@ -3546,6 +3619,9 @@ ivas_error IVAS_REND_Open( hIvasRend->hHrtfs.hHrtfParambin = NULL; hIvasRend->hHrtfs.hHrtfTD = NULL; hIvasRend->hHrtfs.hSetOfHRTF = NULL; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + hIvasRend->hHrtfs.hHrtfStatistics = NULL; +#endif IF( asHrtfBinary ) { IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfTD ) ) ), IVAS_ERR_OK ) ) @@ -3564,10 +3640,23 @@ ivas_error IVAS_REND_Open( { return error; } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &( hIvasRend->hHrtfs.hHrtfStatistics ) ) ), IVAS_ERR_OK ) ) + { + return error; + } +#endif } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_HRTF_statistics_init( &( hIvasRend->hHrtfs.hHrtfStatistics ), hIvasRend->sampleRateOut ) ), IVAS_ERR_OK ) ) + { + return error; + } +#endif return IVAS_ERR_OK; } + static LSSETUP_CUSTOM_STRUCT makeCustomLsSetup( const IVAS_CUSTOM_LS_DATA rendCustomLsLayout ) { @@ -3711,7 +3800,11 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Input inactive, skip. */ CONTINUE; } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig, NULL, NULL ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig, NULL ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -4228,8 +4321,14 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, + IF( NE_32( ( error = initMcBinauralRendering( inputMc, + inputMc->base.inConfig, + hIvasRend->outputConfig, + hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + hIvasRend->hHrtfs.hHrtfStatistics, +#endif FALSE ) ), IVAS_ERR_OK ) ) { @@ -5062,8 +5161,14 @@ ivas_error IVAS_REND_SetHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], + hIvasRend->inputsMc[i].base.inConfig, + hIvasRend->outputConfig, + hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + hIvasRend->hHrtfs.hHrtfStatistics, +#endif TRUE ) ), IVAS_ERR_OK ) ) { @@ -5169,8 +5274,14 @@ ivas_error IVAS_REND_DisableHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], + hIvasRend->inputsMc[i].base.inConfig, + hIvasRend->outputConfig, + hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + hIvasRend->hHrtfs.hHrtfStatistics, +#endif TRUE ) ), IVAS_ERR_OK ) ) { @@ -9337,6 +9448,9 @@ void IVAS_REND_Close( ivas_HRTF_CRend_binary_close_fx( &( hIvasRend->hHrtfs.hSetOfHRTF ) ); ivas_HRTF_fastconv_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfFastConv ) ); ivas_HRTF_parambin_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfParambin ) ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + ivas_HRTF_statistics_close( &( hIvasRend->hHrtfs.hHrtfStatistics ) ); +#endif free( hIvasRend ); *phIvasRend = NULL; @@ -9569,6 +9683,30 @@ ivas_error IVAS_REND_GetHrtfParamBinHandle( return IVAS_ERR_OK; } + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*---------------------------------------------------------------------* + * IVAS_REND_GetHrtfStatisticsHandle( ) + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetHrtfStatisticsHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ +) +{ + if ( hIvasRend == NULL || hIvasRend->hHrtfs.hHrtfStatistics == NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + + *hHrtfStatistics = &hIvasRend->hHrtfs.hHrtfStatistics; + + return IVAS_ERR_OK; +} +#endif + static ivas_error ivas_masa_ext_rend_dirac_rend_init( input_masa *inputMasa ) { @@ -9998,7 +10136,13 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( static ivas_error ivas_masa_ext_rend_parambin_init( +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + input_masa *inputMasa, /* i/o: MASA external renderer structure */ + const RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration data handle */ + HRTFS_STATISTICS_HANDLE hHrtfStatistics /* i : HRTF statistics */ +#else input_masa *inputMasa /* i/o: MASA external renderer structure */ +#endif ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; @@ -10137,9 +10281,12 @@ static ivas_error ivas_masa_ext_rend_parambin_init( IF( hDiracDecBin->hReverb == NULL ) #endif { - /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) - { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ) , IVAS_ERR_OK ) ) +#else + /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ + IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ) , IVAS_ERR_OK ) ) +#endif { return error; } } @@ -10197,6 +10344,9 @@ static ivas_error ivas_masa_ext_rend_parambin_init( static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const RENDER_CONFIG_DATA *hRendCfg, +#endif hrtf_handles *hrtfs ) { Word16 i; @@ -10331,9 +10481,12 @@ static ivas_error initMasaExtRenderer( return error; } } - +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa, hRendCfg, hrtfs->hHrtfStatistics ) ) , IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa ) ), IVAS_ERR_OK ) ) - { +#endif + { return error; } } diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 50663f936..9615a170d 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -193,26 +193,33 @@ ivas_error IVAS_REND_GetDelay( /*! r: error code */ ivas_error IVAS_REND_GetHrtfHandle( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS rendder handle */ IVAS_DEC_HRTF_HANDLE **hHrtfTD /* o : HRTF handle */ ); /*! r: error code */ ivas_error IVAS_REND_GetHrtfCRendHandle( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS render handle */ IVAS_DEC_HRTF_CREND_HANDLE **hSetOfHRTF /* o : Set of HRTF handle */ ); ivas_error IVAS_REND_GetHrtfFastConvHandle( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS render handle */ IVAS_DEC_HRTF_FASTCONV_HANDLE **hHrtfFastConv /* o : FASTCONV HRTF handle */ ); ivas_error IVAS_REND_GetHrtfParamBinHandle( - IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS decoder handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS render handle */ IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +ivas_error IVAS_REND_GetHrtfStatisticsHandle( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ +); +#endif + /* Functions to be called during rendering */ ivas_error IVAS_REND_FeedInputAudio_fx( diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index fd53eb631..7f58cfc94 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -2359,7 +2359,6 @@ void destroy_SetOfHRTF( return; } - #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*---------------------------------------------------------------------* * destroy_hrtf_statistics() -- GitLab From 06917878414b2d8de2b02254c4589458fff3b8bb Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 22 May 2025 17:29:16 +0200 Subject: [PATCH 0690/1310] All reverb .c files from lib_rend --- lib_rend/ivas_reverb_filter_design_fx.c | 4 ++ lib_rend/ivas_reverb_fx.c | 88 ++++++++++++++++++++++--- lib_rend/ivas_reverb_utils_fx.c | 51 ++++++++++++-- 3 files changed, 130 insertions(+), 13 deletions(-) diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index 62c97f88f..ba6a53c7a 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -919,6 +919,9 @@ void ivas_reverb_interpolate_acoustic_data_fx( return; } + + +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-------------------------------------------------------------------* * ivas_reverb_get_hrtf_set_properties() * @@ -1174,3 +1177,4 @@ void ivas_reverb_get_hrtf_set_properties_fx( return; } +#endif diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 9b149940c..09af39bb6 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1264,21 +1264,32 @@ static void set_fft_and_datablock_sizes_fx( static void set_reverb_acoustic_data_fx( ivas_reverb_params_t *pParams, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#else const AUDIO_CONFIG input_audio_config, const HRTFS_HANDLE hHrtf, +#endif IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics, +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const Word16 subframe_len, +#endif const Word16 nr_fc_input, const Word16 nr_fc_fft_filter ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + int16_t bin_idx; +#else Word16 nr_out_ch, hrtf_idx, offset, iter_idx, bin_idx; +#endif + Word32 ln_1e6_inverted_fx, delay_diff_fx, L_tmp; + Word16 exp_argument_fx, tmp, tmp_flag, exp_argument_e; + Word16 pow_exp; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#else Word32 *pHrtf_set_l_re_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_l_im_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_r_re_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_r_im_fx[MAX_INTERN_CHANNELS]; - Word32 ln_1e6_inverted_fx, delay_diff_fx, L_tmp; - Word16 exp_argument_fx, tmp, tmp_flag, exp_argument_e; - Word16 pow_exp; Word32 *pFc_input_fx = pRoomAcoustics->pFc_input_fx; Word32 *pAcoustic_rt60_fx = pRoomAcoustics->pAcoustic_rt60_fx; @@ -1330,7 +1341,7 @@ static void set_reverb_acoustic_data_fx( pParams->pHrtf_avg_pwr_response_r_const_fx = (const Word32 *) pParams->pHrtf_avg_pwr_response_r_fx; pParams->pHrtf_inter_aural_coherence_const_fx = (const Word32 *) pParams->pHrtf_inter_aural_coherence_fx; } - +#endif /* interpolate input table data for T60 and DSR to the FFT filter grid */ ivas_reverb_interpolate_acoustic_data_fx( nr_fc_input, pFc_input_fx, pAcoustic_rt60_fx, pAcoustic_dsr_fx, nr_fc_fft_filter, pFc_fx, pRt60_fx, pDsr_fx, pRt60_e, pDsr_e ); @@ -1461,13 +1472,16 @@ static ivas_error setup_FDN_branches_fx( *------------------------------------------------------------------------*/ ivas_error ivas_reverb_open_fx( - REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ +#else const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ - RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ - const Word32 output_Fs /* i : output sampling rate */ -) +#endif + RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ + const int32_t output_Fs ) { ivas_error error; REVERB_HANDLE pState = NULL; @@ -1541,6 +1555,13 @@ ivas_error ivas_reverb_open_fx( } test(); + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + set_reverb_acoustic_data( ¶ms, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter ); + params.pHrtf_avg_pwr_response_l_const = hHrtfStatistics->average_energy_l; + params.pHrtf_avg_pwr_response_r_const = hHrtfStatistics->average_energy_r; + params.pHrtf_inter_aural_coherence_const = hHrtfStatistics->inter_aural_coherence; +#else IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) { params.pHrtf_avg_pwr_response_l_const_fx = lr_energy_and_iac_fx[0]; @@ -1564,6 +1585,7 @@ ivas_error ivas_reverb_open_fx( params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] ); move32(); } +#endif /* set reverb acoustic configuration based on renderer config */ pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; @@ -2416,6 +2438,55 @@ static ivas_error ivas_binaural_reverb_open_fx( return IVAS_ERR_OK; } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*------------------------------------------------------------------------- + * ivas_binaural_reverb_init() + * + * Allocate and initialize binaural room reverberator handle + * for CLDFB renderers + *------------------------------------------------------------------------*/ +ivas_error ivas_binaural_reverb_init( + REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ + const int16_t numBins, /* i : number of CLDFB bins */ + const int16_t numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ + const int32_t sampling_rate, /* i : sampling rate */ + const float *defaultTimes, /* i : default reverberation times */ + const float *defaultEne /* i : default reverberation energies */ +) +{ + ivas_error error; + const float *revTimes; + const float *revEne; + float t60[CLDFB_NO_CHANNELS_MAX]; + float ene[CLDFB_NO_CHANNELS_MAX]; + int16_t preDelay; + + error = IVAS_ERR_OK; + + if ( ( roomAcoustics != NULL ) && roomAcoustics->override ) + { + revTimes = t60; + revEne = ene; + + if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) + { + return error; + } + preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); + } + else + { + revTimes = defaultTimes; + revEne = defaultEne; + preDelay = 10; + } + + error = ivas_binaural_reverb_open( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); + + return error; +} /*------------------------------------------------------------------------- * ivas_binaural_reverb_open_fastconv() * @@ -2515,6 +2586,7 @@ ivas_error ivas_binaural_reverb_open_parambin( return error; } +#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_close() diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index b3e1e72fa..53d4cf355 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -64,8 +64,11 @@ typedef struct cldfb_convolver_state float filter_states_im[BINAURAL_CONVBANDS][CLDFB_CONVOLVER_NTAPS_MAX]; } cldfb_convolver_state; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +static void ivas_reverb_set_energies( const float *avg_pwr_l, const float *avg_pwr_r, const int32_t sampling_rate, float *avg_pwr_l_out, float *avg_pwr_r_out ); +#else static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ); - +#endif /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_prepare_cldfb_params() @@ -74,10 +77,15 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCO *-----------------------------------------------------------------------------------------*/ ivas_error ivas_reverb_prepare_cldfb_params( +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, +#else IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, +#endif const int32_t output_Fs, float *pOutput_t60, float *pOutput_ene ) @@ -89,7 +97,9 @@ ivas_error ivas_reverb_prepare_cldfb_params( float delay_diff, ln_1e6_inverted, exp_argument; const float dist = DEFAULT_SRC_DIST; const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; +#endif for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { @@ -133,11 +143,14 @@ ivas_error ivas_reverb_prepare_cldfb_params( exp_argument = max( exp_argument, -23.0f ); pOutput_ene[idx] *= expf( exp_argument ); } - +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right ); +#else if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) { return error; } +#endif for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { @@ -147,13 +160,13 @@ ivas_error ivas_reverb_prepare_cldfb_params( return IVAS_ERR_OK; } - +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-----------------------------------------------------------------------------------------* * Function ivas_cldfb_convolver() * * Function for convolving CLDFB-domain data with filter taps *-----------------------------------------------------------------------------------------*/ - +#endif /*-----------------------------------------------------------------------------------------* * Function get_IR_from_filter_taps() @@ -260,7 +273,18 @@ static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( return IVAS_ERR_OK; } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*-----------------------------------------------------------------------------------------* + * Function ivas_reverb_set_energies() + * + * Function gets the precalculated left/right energies and computes average + * left/right energies to CLDFB bin center frequencies. + *-----------------------------------------------------------------------------------------*/ +static void ivas_reverb_set_energies( + const float *avg_pwr_l, + const float *avg_pwr_r, +#else /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_get_fastconv_hrtf_set_energies() * @@ -273,21 +297,34 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, +#endif const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ) { int16_t freq_idx; +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES float avg_pwr_left_fft[FFT_SPECTRUM_SIZE]; float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; +#endif float input_fc[FFT_SPECTRUM_SIZE]; +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; +#endif +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const int16_t avg_pwr_len = sampling_rate == 16000 ? LR_IAC_LENGTH_NR_FC_16KHZ : LR_IAC_LENGTH_NR_FC; + + for ( freq_idx = 0; freq_idx < avg_pwr_len; freq_idx++ ) + { + input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( avg_pwr_len - 1 ) ); + } +#else for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ ) { input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( FFT_SPECTRUM_SIZE - 1 ) ); } - +#endif if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) { @@ -315,6 +352,9 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( output_fc_fx[i] = (Word32) input_fc[i] * ONE_IN_Q16; } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + ivas_reverb_interpolate_acoustic_data( avg_pwr_len, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right ); +#else ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_left_fft_fx, avg_pwr_right_fft_fx, CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); for ( int i = 0; i < 257; i++ ) @@ -331,4 +371,5 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( free( avg_pwr_right_fx ); free( avg_pwr_right_e ); return IVAS_ERR_OK; +#endif } -- GitLab From 7db5ca7ab1cc6d938407c459da9da7612302fa72 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 22 May 2025 18:16:38 +0200 Subject: [PATCH 0691/1310] All remaining headers and functions from lib_rend --- lib_rend/ivas_crend_fx.c | 13 ++- .../ivas_dirac_dec_binaural_functions_fx.c | 11 ++- lib_rend/ivas_hrtf_fx.c | 98 +++++++++++++++++++ lib_rend/ivas_objectRenderer_mix_fx.c | 3 + lib_rend/ivas_prot_rend_fx.h | 54 +++++++++- 5 files changed, 174 insertions(+), 5 deletions(-) diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 36965fc61..66dca6cfd 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -1669,7 +1669,11 @@ ivas_error ivas_rend_openMultiBinCrend( ivas_error error; #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, NULL /* hHrtfStatistics */, output_Fs, pMultiBinPoseData->num_poses ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, output_Fs, pMultiBinPoseData->num_poses ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, output_Fs ) ) != IVAS_ERR_OK ) #endif @@ -1693,6 +1697,9 @@ ivas_error ivas_rend_openCrend( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, HRTFS_CREND_HANDLE hSetOfHRTF, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + HRTFS_STATISTICS_HANDLE hHrtfStatistics, +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT const Word32 output_Fs, const Word16 num_poses @@ -1867,8 +1874,12 @@ ivas_error ivas_rend_openCrend( IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if( ( NE_32( error = ivas_reverb_open( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ) , IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) - { +#endif + { return error; } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 408f1cb1b..bdead9cbd 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -315,9 +315,14 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( IF( hDiracDecBin->hReverb == NULL ) #endif { - /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes, st_ivas->hHrtfParambin->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK ) +#else + /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ + if ( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) +#endif + { return error; } } diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 0cb8ae505..873b632fa 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -33,6 +33,9 @@ #include #include "options.h" #include "prot_fx.h" +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#include "ivas_rom_binaural_crend_head.h" +#endif #include "ivas_prot_rend_fx.h" #include "ivas_error.h" #include "wmc_auto.h" @@ -212,3 +215,98 @@ void ivas_HRTF_parambin_binary_close_fx( return; } + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*-----------------------------------------------------------------------* + * ivas_HRTF_statistics_binary_open() + * + * Allocate HRTF binary handle for statistics handler + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_statistics_binary_open( + HRTFS_STATISTICS **hHrtfStatistics ) +{ + *hHrtfStatistics = (HRTFS_STATISTICS *) malloc( sizeof( HRTFS_STATISTICS ) ); + if ( *hHrtfStatistics == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for statistics HRTF tables!" ); + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_HRTF_statistics_close() + * + * Close HRTF binary handle for statistics handler + *-----------------------------------------------------------------------*/ + +void ivas_HRTF_statistics_close( + HRTFS_STATISTICS **hHrtfStatistics ) +{ + if ( hHrtfStatistics == NULL || *hHrtfStatistics == NULL ) + { + return; + } + + free( *hHrtfStatistics ); + *hHrtfStatistics = NULL; + + return; +} + +/*-----------------------------------------------------------------------* + * ivas_HRTF_statistics_init() + * + * Allocates HRTF statistics handle and initializes from ROM + *-----------------------------------------------------------------------*/ + +ivas_error ivas_HRTF_statistics_init( + HRTFS_STATISTICS_HANDLE *hHrtfStatistics, + int32_t sampleRate ) +{ + HRTFS_STATISTICS *HrtfStatistics; + + if ( hHrtfStatistics != NULL && *hHrtfStatistics != NULL ) + { + /* Tables already loaded from file */ + return IVAS_ERR_OK; + } + + /* Initialise tables from ROM */ + if ( ( HrtfStatistics = (HRTFS_STATISTICS *) malloc( sizeof( HRTFS_STATISTICS ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for statistics HRTF tables!" ); + } + + HrtfStatistics->average_energy_l = NULL; + HrtfStatistics->average_energy_r = NULL; + HrtfStatistics->inter_aural_coherence = NULL; + + switch ( sampleRate ) + { + case 48000: + HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz; + HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz; + HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_48kHz; + break; + case 32000: + HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_32kHz; + HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_32kHz; + HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz; + break; + case 16000: + HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz; + HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz; + HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz; + break; + } + HrtfStatistics->fromROM = TRUE; + + *hHrtfStatistics = HrtfStatistics; + + + return IVAS_ERR_OK; +} +#endif \ No newline at end of file diff --git a/lib_rend/ivas_objectRenderer_mix_fx.c b/lib_rend/ivas_objectRenderer_mix_fx.c index 72042975b..c46ca25db 100644 --- a/lib_rend/ivas_objectRenderer_mix_fx.c +++ b/lib_rend/ivas_objectRenderer_mix_fx.c @@ -409,6 +409,8 @@ static ivas_error DefaultBSplineModel_fx( model = &( HrFiltSet_p->ModelParams ); modelITD = &( HrFiltSet_p->ModelParamsITD ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#else SWITCH( output_Fs ) { case 48000: @@ -444,6 +446,7 @@ static ivas_error DefaultBSplineModel_fx( #endif BREAK; } +#endif /* Set ROM flag for correct deallocation */ model->modelROM = TRUE; diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 4e23011b4..1513ff29b 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -620,6 +620,21 @@ void ivas_HRTF_CRend_binary_close_fx( HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +ivas_error ivas_HRTF_statistics_init( + HRTFS_STATISTICS_HANDLE *hHrtfStatistics, /* i/o: HRTF statistics structure */ + int32_t sampleRate /* i : Sample rate */ +); + +void ivas_HRTF_statistics_close( + HRTFS_STATISTICS **hHrtfStatistics /* i/o: HRTF statistics structure */ +); + +ivas_error ivas_HRTF_statistics_binary_open( + HRTFS_STATISTICS **hHrtfStatistics /* i/o: HRTF statistics structure */ +); + +#endif /*----------------------------------------------------------------------------------* * TD object renderer @@ -865,6 +880,9 @@ ivas_error ivas_rend_openCrend( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, HRTFS_CREND_HANDLE hSetOfHRTF, +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + HRTFS_STATISTICS_HANDLE hHrtfStatistics, +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT const Word32 output_Fs, const Word16 num_poses @@ -919,16 +937,35 @@ ivas_error ivas_rend_crendProcessSubframe( * Reverberator *----------------------------------------------------------------------------------*/ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +ivas_error ivas_binaural_reverb_init( +#else ivas_error ivas_binaural_reverb_open_fastconv_fx( +#endif REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ +#else +#endif const Word16 numBins, /* i : number of CLDFB bins */ const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ +#else IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ const AUDIO_CONFIG internal_config, /* i : internal audio config for FastConv */ +#endif const Word32 sampling_rate, /* i : sampling rate */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const float *defaultTimes, /* i : default reverberation times */ + const float *defaultEne /* i : default reverberation energies */ +#else const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ +#endif ); + +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error ivas_binaural_reverb_open_parambin( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ const Word16 numBins, /* i : number of CLDFB bins Q0 */ @@ -937,6 +974,7 @@ ivas_error ivas_binaural_reverb_open_parambin( const Word32 sampling_rate, /* i : sampling rate Q0 */ const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ ); +#endif void ivas_binaural_reverb_close_fx( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ @@ -957,9 +995,13 @@ void ivas_binaural_reverb_processSubframe_fx( ivas_error ivas_reverb_open_fx( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ +#else const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ +#endif RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ const Word32 output_Fs /* i : output sampling rate */ ); @@ -1105,6 +1147,14 @@ void ivas_reverb_calc_color_levels_fx( const Word32 *pT60_filter_coeff, //input in Q31 Word32 *pTarget_color_L, //output in Q30 Word32 *pTarget_color_R); //output in Q30 +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +ivas_error ivas_reverb_prepare_cldfb_params( + const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, + const HRTFS_STATISTICS_HANDLE hHrtfStatistics, + const int32_t output_Fs, + float *pOutput_t60, + float *pOutput_ene ); +#else ivas_error ivas_reverb_prepare_cldfb_params( IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_FASTCONV_HANDLE hHrtfFastConv, @@ -1113,6 +1163,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( const int32_t output_Fs, float *pOutput_t60, float *pOutput_ene ); +#endif void ivas_reverb_interpolate_acoustic_data_fx( const Word16 input_table_size, const Word32 *pInput_fc, //input in Q16 @@ -1125,6 +1176,7 @@ void ivas_reverb_interpolate_acoustic_data_fx( Word16 *pOutput_t60_e, //output e Word16 *pOutput_dsr_e //output e ); +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES void ivas_reverb_get_hrtf_set_properties_fx( Word32 **ppHrtf_set_L_re, Word32 **ppHrtf_set_L_im, @@ -1138,7 +1190,7 @@ void ivas_reverb_get_hrtf_set_properties_fx( Word32 *pOut_avg_pwr_R, //output in Q23 Word32 *out_i_a_coherence //output in Q27 ); - +#endif /*---------------------------------------------------------------------------------* * Shoebox Prototypes *-----------------------------------------------------------------------------------*/ -- GitLab From bd92de35e214fa7201ec3818c3f72f3938d97faf Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 22 May 2025 18:43:36 +0200 Subject: [PATCH 0692/1310] All functions lib_dec --- lib_dec/ivas_binRenderer_internal_fx.c | 6 +++- lib_dec/ivas_init_dec.c | 45 +++++++++++++++++++++++++- lib_dec/ivas_ism_dec_fx.c | 18 +++++++++-- lib_dec/ivas_mct_dec_fx.c | 8 +++++ 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 9b7bd86b6..5431fcece 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1418,8 +1418,12 @@ ivas_error ivas_binRenderer_open_fx( test(); IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_binaural_reverb_init( &( hBinRenderer->hReverb ), st_ivas->hHrtfStatistics, hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv->fastconvReverberationTimes, st_ivas->hHrtfFastConv->fastconvReverberationEneCorrections ) ) , IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_binaural_reverb_open_fastconv_fx( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hIntSetup.output_config, st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) - { +#endif + { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b4af0ed06..e752080f8 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1179,6 +1179,13 @@ ivas_error ivas_init_decoder_front( } } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ) , IVAS_ERR_OK ) ) + { + return error; + } +#endif + /*-------------------------------------------------------------------* * Allocate and initialize Binaural Renderer configuration handle *--------------------------------------------------------------------*/ @@ -1364,6 +1371,20 @@ ivas_error ivas_init_decoder_fx( } } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + /*--------------------------------------------------------------------* + * Allocate and initialize HRTF Statistics handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hOutSetup.output_config == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_HRTF_statistics_init( &st_ivas->hHrtfStatistics, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + #ifdef SPLIT_REND_WITH_HEAD_ROT /*-----------------------------------------------------------------* * Initialize binuaral split rendering @@ -2274,8 +2295,12 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) - { +#endif + { return error; } } @@ -2318,13 +2343,23 @@ ivas_error ivas_init_decoder_fx( } #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ) , IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#endif +#else +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) +#endif #endif { return error; @@ -2862,6 +2897,9 @@ void ivas_initialize_handles_dec( st_ivas->hSetOfHRTF = NULL; st_ivas->hHrtfFastConv = NULL; st_ivas->hHrtfParambin = NULL; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + st_ivas->hHrtfStatistics = NULL; +#endif st_ivas->hoa_dec_mtx = NULL; st_ivas->hMasaIsmData = NULL; st_ivas->hSbaIsmData = NULL; @@ -3096,6 +3134,11 @@ void ivas_destroy_dec_fx( /* Parametric binauralizer HRTF filters */ ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + /* HRTF statistics */ + ivas_HRTF_statistics_close( &st_ivas->hHrtfStatistics ); +#endif + /* Config. Renderer */ ivas_render_config_close( &( st_ivas->hRenderConfig ) ); diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 18c6953f2..c8863947f 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -220,8 +220,12 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) - { +#endif + { return error; } } @@ -248,13 +252,21 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( /* Open Crend Binaural renderer */ #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ) , IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) - { +#endif +#else +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) + { return error; } #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) - { +#endif + { return error; } #endif diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index db9cddc39..825478479 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1576,9 +1576,17 @@ static ivas_error ivas_mc_dec_reconfig_fx( ELSE IF( st_ivas->hCrendWrapper == NULL && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) { #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) +#else IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) +#endif +#else +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) #else IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) +#endif #endif { return error; -- GitLab From e90663ed2e8f6f2017b5c0b373a81a05d22b5688 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 22 May 2025 18:57:34 +0200 Subject: [PATCH 0693/1310] All functions decoder.c and renderer.c --- apps/decoder.c | 34 ++++++++++++++++++++++++++++++++++ apps/renderer.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/apps/decoder.c b/apps/decoder.c index a59bc5fac..3f30f4520 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -176,6 +176,9 @@ int main( IVAS_RENDER_FRAMESIZE asked_frame_size; IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; +#endif #ifdef WMOPS reset_wmops(); @@ -644,6 +647,7 @@ int main( } } +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( *hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) { @@ -653,6 +657,7 @@ int main( goto cleanup; } } +#endif #endif if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ) ) != IVAS_ERR_OK ) { @@ -736,6 +741,35 @@ int main( destroy_parambin_hrtf( hHrtfParambin ); } } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef NONBE_FIX_BINARY_BINAURAL_READING + if ( ( error = IVAS_DEC_GetHrtfStatisticsHandle( hIvasDec, &hHrtfStatistics ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + if ( ( error = load_reverb_binary( *hHrtfStatistics, arg.output_Fs, hrtfReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } + else + { + destroy_hrtf_statistics( hHrtfStatistics ); + } + } +#else + if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } +#endif +#endif +#endif } /*------------------------------------------------------------------------------------------* diff --git a/apps/renderer.c b/apps/renderer.c index 64ef2e5d6..fa716c892 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -766,6 +766,9 @@ int main( IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; +#endif IsmPositionProvider *positionProvider; LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; RenderConfigReader *renderConfigReader = NULL; @@ -1054,6 +1057,7 @@ int main( } } +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfFileReader ) ) != IVAS_ERR_OK ) { @@ -1063,6 +1067,7 @@ int main( goto cleanup; } } +#endif #endif if ( ( error = IVAS_REND_GetHrtfCRendHandle( hIvasRend, &hSetOfHRTF ) ) != IVAS_ERR_OK ) @@ -1146,6 +1151,28 @@ int main( } } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + if ( ( error = IVAS_REND_GetHrtfStatisticsHandle( hIvasRend, &hHrtfStatistics ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_REND_GetHrtfStatisticsHandle failed\n\n" ); + goto cleanup; + } + if ( ( error = load_reverb_binary( *hHrtfStatistics, args.sampleRate, hrtfFileReader ) ) != IVAS_ERR_OK ) + { + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", args.customHrtfFilePath ); + goto cleanup; + } + else + { + destroy_hrtf_statistics( hHrtfStatistics ); + } + } +#endif +#endif + hrtfFileReader_close( &hrtfFileReader ); } @@ -2258,6 +2285,9 @@ cleanup: { destroy_td_hrtf( hHrtfTD ); } +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + destroy_hrtf_statistics( hHrtfStatistics ); +#endif IVAS_REND_Close( &hIvasRend ); IsmPositionProvider_close( positionProvider ); RenderConfigReader_close( &renderConfigReader ); -- GitLab From fcda84a8ee56a78ea0a27eb67be04d8e67c539bc Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 23 May 2025 15:33:13 +0900 Subject: [PATCH 0694/1310] Add NONBE_FIX_1006_PAST_DMX_NRG_ERROR --- lib_com/options.h | 1 + lib_dec/ivas_stereo_dft_dec_dmx_fx.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 91172d59a..fc61d4726 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -129,6 +129,7 @@ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #endif +#define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index e82005965..2d0c3b4aa 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -376,10 +376,15 @@ void stereo_dft_unify_dmx_fx( Word16 idx_k0, idx_k1; Word16 q_shift0; Word16 q_shift1; +#ifdef NONBE_FIX_1006_PAST_DMX_NRG_ERROR + idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */ + idx_k1 = add( idx_k0, 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); +#else idx_k0 = ( add( hStereoDft->past_DMX_pos, 1 ) ) % STEREO_DFT_PAST_MAX; move16(); idx_k1 = ( add( idx_k0, 1 ) ) % STEREO_DFT_PAST_MAX; move16(); +#endif q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] ); q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] ); -- GitLab From 238ff2ba228072d2e755047194103a93da3323b4 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Fri, 23 May 2025 09:38:57 +0200 Subject: [PATCH 0695/1310] fix some compiling error --- lib_dec/ivas_binRenderer_internal_fx.c | 6 +- lib_dec/ivas_init_dec.c | 12 +- lib_dec/ivas_ism_dec_fx.c | 12 +- lib_dec/ivas_mct_dec_fx.c | 4 +- lib_rend/ivas_crend_fx.c | 6 +- .../ivas_dirac_dec_binaural_functions_fx.c | 7 +- lib_rend/ivas_hrtf_fx.c | 20 +- lib_rend/ivas_reverb_fx.c | 3 +- lib_rend/ivas_stat_rend.h | 12 +- lib_rend/lib_rend.c | 247 +++++++++--------- 10 files changed, 169 insertions(+), 160 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 5431fcece..d53d6c76d 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1419,11 +1419,11 @@ ivas_error ivas_binRenderer_open_fx( IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_binaural_reverb_init( &( hBinRenderer->hReverb ), st_ivas->hHrtfStatistics, hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv->fastconvReverberationTimes, st_ivas->hHrtfFastConv->fastconvReverberationEneCorrections ) ) , IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_binaural_reverb_init( &( hBinRenderer->hReverb ), st_ivas->hHrtfStatistics, hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv->fastconvReverberationTimes_fx, st_ivas->hHrtfFastConv->fastconvReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_binaural_reverb_open_fastconv_fx( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hIntSetup.output_config, st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) -#endif - { +#endif + { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index e752080f8..05efe8207 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1180,7 +1180,7 @@ ivas_error ivas_init_decoder_front( } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ) , IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ), IVAS_ERR_OK ) ) { return error; } @@ -2296,11 +2296,11 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) #endif - { + { return error; } } @@ -2345,7 +2345,8 @@ ivas_error ivas_init_decoder_fx( #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ) , IVAS_ERR_OK ) ) + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ), + IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), @@ -2354,7 +2355,8 @@ ivas_error ivas_init_decoder_fx( #else #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), + IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index c8863947f..4f900a6de 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -221,11 +221,11 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) #endif - { + { return error; } } @@ -253,20 +253,20 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( /* Open Crend Binaural renderer */ #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ) , IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #endif #else #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) , IVAS_ERR_OK ) ) - { + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) + { return error; } #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) #endif - { + { return error; } #endif diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 825478479..d3268bda3 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1577,13 +1577,13 @@ static ivas_error ivas_mc_dec_reconfig_fx( { #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) #else IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) #endif #else #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF ( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) #else IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 66dca6cfd..b293e8c00 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -1875,11 +1875,11 @@ ivas_error ivas_rend_openCrend( IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if( ( NE_32( error = ivas_reverb_open( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ) , IVAS_ERR_OK ) ) + IF( ( NE_32( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) -#endif - { +#endif + { return error; } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index d0c4397e5..5c4d55488 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -317,13 +317,14 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes, st_ivas->hHrtfParambin->parametricReverberationEneCorrections ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes_fx, st_ivas->hHrtfParambin->parametricReverberationEneCorrections_fx ) ) != IVAS_ERR_OK ) #else /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ if ( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) -#endif - { +#endif + { return error; + x } } } diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 873b632fa..0e535170b 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -287,19 +287,19 @@ ivas_error ivas_HRTF_statistics_init( switch ( sampleRate ) { case 48000: - HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz; - HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz; - HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_48kHz; + HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz_fx; + HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz_fx; + HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_48kHz_fx; break; case 32000: - HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_32kHz; - HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_32kHz; - HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz; + HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_32kHz_fx; + HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_32kHz_fx; + HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz_fx; break; case 16000: - HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz; - HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz; - HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz; + HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz_fx; + HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz_fx; + HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz_fx; break; } HrtfStatistics->fromROM = TRUE; @@ -309,4 +309,4 @@ ivas_error ivas_HRTF_statistics_init( return IVAS_ERR_OK; } -#endif \ No newline at end of file +#endif diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 09af39bb6..f1393148d 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2487,6 +2487,8 @@ ivas_error ivas_binaural_reverb_init( return error; } +#endif + /*------------------------------------------------------------------------- * ivas_binaural_reverb_open_fastconv() * @@ -2586,7 +2588,6 @@ ivas_error ivas_binaural_reverb_open_parambin( return error; } -#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_close() diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index d8dd14034..77d3bcc35 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -847,7 +847,7 @@ typedef struct ivas_combined_orientation_struct #ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Rmat_prev_fx[MAX_HEAD_ROT_POSES][3][3]; #else - Word32 Rmat_prev_fx[3][3]; /* Q30 */ + Word32 Rmat_prev_fx[3][3]; /* Q30 */ #endif Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ /* Q(q_chEneIIR) */ Word16 q_chEneIIR; @@ -1198,8 +1198,8 @@ typedef struct TDREND_HRFILT_FiltSet_struct ModelParams_t ModelParams; ModelEval_t ModelEval; ModelParamsITD_t ModelParamsITD; - TDREND_HRFILT_Method_t FilterMethod; /* HR filtering method */ - Word32 latency_s_fx; /* Q31 */ + TDREND_HRFILT_Method_t FilterMethod; /* HR filtering method */ + Word32 latency_s_fx; /* Q31 */ #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #else const Word32 *lr_energy_and_iac_fx[3]; /* left/right energy and interaural coherence for late reverb */ @@ -1480,9 +1480,9 @@ typedef struct ivas_hrtfs_parambin_struct #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES typedef struct ivas_hrtfs_statistics_struct { - float *average_energy_l; - float *average_energy_r; - float *inter_aural_coherence; + Word32 *average_energy_l; + Word32 *average_energy_r; + Word32 *inter_aural_coherence; int16_t fromROM; /* Flag that indicates that the pointers point to tables in ROM (controls init/dealloc).*/ } HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index ecab18225..7c2e4115d 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1532,9 +1532,10 @@ static ivas_error setRendInputActiveIsm( IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { - return error; - } +#endif + { + return error; + } #else IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { @@ -1594,57 +1595,57 @@ static ivas_error setRendInputActiveIsm( } } #endif -} -ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) -{ - IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - { - return error; } -} -ELSE -{ -#ifndef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { - return error; + IF( NE_32( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + { + return error; + } } - Word16 nchan_rend = num_src; - move16(); - - test(); - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + ELSE { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } +#ifndef SPLIT_REND_WITH_HEAD_ROT + IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) + { + return error; + } + Word16 nchan_rend = num_src; + move16(); - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) + test(); + IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ + } + + FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) { - IF( Src_p->SrcSpatial_p != NULL ) + TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; + IF( Src_p != NULL ) { - Src_p->SrcSpatial_p->q_Pos_p = Q31; + IF( Src_p->SrcSpatial_p != NULL ) + { + Src_p->SrcSpatial_p->q_Pos_p = Q31; + move16(); + } + TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; + SrcSpatial_p->q_Pos_p = Q31; move16(); } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); } - } - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { + IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ) IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ) IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif - { - return error; + { + return error; + } } - } #else IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { @@ -1679,29 +1680,29 @@ ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) - { #endif - return error; + { + return error; + } } - } - ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) - { + ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #endif - { - return error; + { + return error; + } } - } #endif -} + } -return IVAS_ERR_OK; + return IVAS_ERR_OK; } static void clearInputIsm( @@ -2681,78 +2682,79 @@ static ivas_error initMcBinauralRendering( IF( NE_32( ( error = ivas_reverb_open( &( inputMc->hReverb ), hHrtfStatistics, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) -#endif { - return error; +#endif + { + return error; + } } } -} -ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) -{ - /* open CREND */ + ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) + { + /* open CREND */ #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, - outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, + outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), + IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - hMixconv, - outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + hMixconv, + outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), + IVAS_ERR_OK ) ) #endif #else #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, outSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, outSampleRate ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - hMixconv, - outSampleRate ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, + hMixconv, + outSampleRate ) ), + IVAS_ERR_OK ) ) #endif #endif - { - return error; + { + return error; + } } -} -/* Initialise the EFAP handle for rotation on input layout */ -test(); -test(); -IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) -{ - IF( NE_32( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ), IVAS_ERR_OK ) ) + /* Initialise the EFAP handle for rotation on input layout */ + test(); + test(); + IF( NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) && inputMc->base.ctx.pHeadRotData->headRotEnabled && inputMc->efapInWrapper.hEfap == NULL ) { - return error; + IF( NE_32( ( error = initEfap( &inputMc->efapInWrapper, inConfig, NULL ) ), IVAS_ERR_OK ) ) + { + return error; + } } -} -/* determine binaural delay ( used for aligning LFE to output signal ) */ + /* determine binaural delay ( used for aligning LFE to output signal ) */ -IF( ( inputMc->crendWrapper != NULL ) ) -{ - binauralDelayNs = inputMc->crendWrapper->binaural_latency_ns; -} -ELSE -{ - binauralDelayNs = 0; -} -move32(); + IF( ( inputMc->crendWrapper != NULL ) ) + { + binauralDelayNs = inputMc->crendWrapper->binaural_latency_ns; + } + ELSE + { + binauralDelayNs = 0; + } + move32(); -binauralDelayNs = L_max( binauralDelayNs, inputMc->tdRendWrapper.binaural_latency_ns ); -Word16 exp = 0; -move16(); -Word16 var1 = BASOP_Util_Divide3232_Scale( *inputMc->base.ctx.pOutSampleRate, 1000000000, &exp ); -Word32 var2 = L_shr_r( Mpy_32_32( binauralDelayNs, L_deposit_h( var1 ) ), negate( exp ) ); /* Q0 */ -inputMc->binauralDelaySmp = extract_l( var2 ); -move16(); -// inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); + binauralDelayNs = L_max( binauralDelayNs, inputMc->tdRendWrapper.binaural_latency_ns ); + Word16 exp = 0; + move16(); + Word16 var1 = BASOP_Util_Divide3232_Scale( *inputMc->base.ctx.pOutSampleRate, 1000000000, &exp ); + Word32 var2 = L_shr_r( Mpy_32_32( binauralDelayNs, L_deposit_h( var1 ) ), negate( exp ) ); /* Q0 */ + inputMc->binauralDelaySmp = extract_l( var2 ); + move16(); + // inputMc->binauralDelaySmp = (int16_t) roundf( (float) binauralDelayNs * *inputMc->base.ctx.pOutSampleRate / 1000000000.f ); -IF( GT_16( inputMc->binauralDelaySmp, MAX_BIN_DELAY_SAMPLES ) ) -{ - return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)" ); -} + IF( GT_16( inputMc->binauralDelaySmp, MAX_BIN_DELAY_SAMPLES ) ) + { + return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid delay for LFE binaural rendering!)" ); + } -return IVAS_ERR_OK; + return IVAS_ERR_OK; } static ivas_error initMcMasaRendering( @@ -3323,11 +3325,12 @@ static ivas_error setRendInputActiveSba( IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF ) ), IVAS_ERR_OK ) ) -#endif { - return error; -} +#endif + { + return error; + } -return error; + return error; } static void clearInputSba( input_sba *inputSba ) @@ -3424,14 +3427,15 @@ static ivas_error setRendInputActiveMasa( IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hRendCfg, hrtfs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hrtfs ) ), IVAS_ERR_OK ) ) -#endif { - return error; +#endif + { + return error; + } + inputMasa->metadataHasBeenFed = false; + move16(); } - inputMasa->metadataHasBeenFed = false; - move16(); -} -return IVAS_ERR_OK; + return IVAS_ERR_OK; } static void clearInputMasa( @@ -10276,17 +10280,18 @@ static ivas_error ivas_masa_ext_rend_parambin_init( move16(); #ifdef SPLIT_REND_WITH_HEAD_ROT - if ( hDiracDecBin->hReverb == NULL && pos_idx == 0 ) /* open reverb only for the main direction */ + IF( hDiracDecBin->hReverb == NULL && pos_idx == 0 ) /* open reverb only for the main direction */ #else IF( hDiracDecBin->hReverb == NULL ) #endif { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ) , IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes_fx, hHrtfParambin->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #else /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ) , IVAS_ERR_OK ) ) -#endif { + IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) +#endif + { return error; } } @@ -10306,7 +10311,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( } #ifdef SPLIT_REND_WITH_HEAD_ROT - if ( pos_idx == 0 ) /* open decorrelator only for the main direction */ + IF( pos_idx == 0 ) /* open decorrelator only for the main direction */ { #endif /* Always open frequency domain decorrelator */ @@ -10482,11 +10487,11 @@ static ivas_error initMasaExtRenderer( } } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa, hRendCfg, hrtfs->hHrtfStatistics ) ) , IVAS_ERR_OK ) ) + if ( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa, hRendCfg, hrtfs->hHrtfStatistics ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa ) ), IVAS_ERR_OK ) ) -#endif - { +#endif + { return error; } } -- GitLab From c501f1f5044db13c8128677e85749f508ed6ef31 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 23 May 2025 10:14:30 +0200 Subject: [PATCH 0696/1310] port NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER --- lib_com/options.h | 3 ++- lib_dec/ivas_jbm_dec_fx.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 91172d59a..09c753209 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,8 @@ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ -#endif +#endif +#define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index c85e36d8e..d402fb1e3 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2668,8 +2668,12 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( Word16 n_slots_still_available; Word16 n_samples_to_render; DECODER_TC_BUFFER_HANDLE hTcBuffer; +#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER + Word32 *p_output_fx[MAX_CICP_CHANNELS + MAX_NUM_OBJECTS]; +#else Word32 output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; +#endif Word16 nchan_in, nchan_out; IF( !st_ivas->hDecoderConfig->Opt_tsm ) { @@ -2729,10 +2733,17 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( move16(); move16(); +#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER + FOR( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + p_output_fx[ch_idx] = st_ivas->p_output_fx[ch_idx]; + } +#else FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) { p_output_fx[ch_idx] = output_fx[ch_idx]; } +#endif test(); IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) ) -- GitLab From 4ee97743e1866257069d05b4d7c2c1d2c0e7a273 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Fri, 23 May 2025 10:41:01 +0200 Subject: [PATCH 0697/1310] changed float to word32 in hrtf_file_reader.c --- lib_util/hrtf_file_reader.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 7f58cfc94..364afc813 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -797,17 +797,17 @@ static ivas_error load_reverb_from_binary( if ( is_reverb ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - hHrtfStatistics->average_energy_l = (float *) malloc( lr_iac_len * sizeof( float ) ); - hHrtfStatistics->average_energy_r = (float *) malloc( lr_iac_len * sizeof( float ) ); - hHrtfStatistics->inter_aural_coherence = (float *) malloc( lr_iac_len * sizeof( float ) ); + hHrtfStatistics->average_energy_l = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + hHrtfStatistics->average_energy_r = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + hHrtfStatistics->inter_aural_coherence = (Word32 *) malloc( lr_iac_len * sizeof( Word32) ); if ( hHrtfStatistics->average_energy_l == NULL || hHrtfStatistics->average_energy_r == NULL || hHrtfStatistics->inter_aural_coherence == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - fread( hHrtfStatistics->average_energy_l, sizeof( const float ), lr_iac_len, f_hrtf ); - fread( hHrtfStatistics->average_energy_r, sizeof( const float ), lr_iac_len, f_hrtf ); - fread( hHrtfStatistics->inter_aural_coherence, sizeof( const float ), lr_iac_len, f_hrtf ); + fread( hHrtfStatistics->average_energy_l, sizeof( const Word32 ), lr_iac_len, f_hrtf ); + fread( hHrtfStatistics->average_energy_r, sizeof( const Word32 ), lr_iac_len, f_hrtf ); + fread( hHrtfStatistics->inter_aural_coherence, sizeof( const Word32 ), lr_iac_len, f_hrtf ); hHrtfStatistics->fromROM = FALSE; #else -- GitLab From 849959bb0865274dbd793106ab8610959abd59e3 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Fri, 23 May 2025 11:02:35 +0200 Subject: [PATCH 0698/1310] bug fixes + additions in hrtf_file_reader.h --- lib_rend/ivas_crend_fx.c | 2 +- .../ivas_dirac_dec_binaural_functions_fx.c | 1 - lib_util/hrtf_file_reader.h | 20 +++++++++++++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index b293e8c00..392d8ea99 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -1875,7 +1875,7 @@ ivas_error ivas_rend_openCrend( IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( ( NE_32( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) #endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 5c4d55488..023adcf7d 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -324,7 +324,6 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( #endif { return error; - x } } } diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 51c321352..4b9806eb8 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -102,8 +102,13 @@ ivas_error load_HRTF_binary( *---------------------------------------------------------------------*/ ivas_error load_reverb_binary( - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ - const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ + int32_t sampleRate, /* i : sample rate */ +#else + IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ +#endif + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); #endif @@ -174,6 +179,17 @@ ivas_error load_parambin_HRTF_from_binary( const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +/*---------------------------------------------------------------------* + * destroy_hrtf_statistics() + * + * free memory allocated for HRTF statistics binary data + *---------------------------------------------------------------------*/ + +ivas_error destroy_hrtf_statistics( + IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ +); +#endif /*---------------------------------------------------------------------* * dealloc_HRTF_binary() -- GitLab From 352d293b56d22dd40cb9eb63cac75fe027f71871 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 23 May 2025 14:39:12 +0530 Subject: [PATCH 0699/1310] Precision improvements and bug fixes to remove tonal lines in ParamISM --- lib_com/fd_cng_com_fx.c | 68 +++++++---- lib_com/prot_fx.h | 18 +++ lib_com/stat_com.h | 3 +- lib_com/tools_fx.c | 52 +++++++++ lib_dec/acelp_core_dec_fx.c | 4 +- lib_dec/fd_cng_dec_fx.c | 19 +++- lib_dec/hf_synth_fx.c | 207 ++++++++++++++++++++++++++++++++++ lib_dec/ivas_ism_dtx_dec_fx.c | 8 +- 8 files changed, 343 insertions(+), 36 deletions(-) diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 872c180b5..207925724 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -120,6 +120,8 @@ void ivas_initFdCngCom_fx( HANDLE_FD_CNG_COM hFdCngCom, Word16 scale ) move16(); hFdCngCom->CngBitrate = -1; move16(); + hFdCngCom->olapBufferSynth_exp = 0; + move16(); /* Initialize noise estimation algorithm */ set32_fx( hFdCngCom->periodog, 0, PERIODOGLEN ); @@ -2653,9 +2655,10 @@ void SynthesisSTFT_ivas_fx( const Word16 nchan_out /* i : number of output channels */ ) { - Word16 i, len, scale, tmp; + Word16 i, len, scale, tmp, sft, exp, tmp1; Word16 len2, len3, len4; Word16 buf[M + 1 + L_FRAME16k]; + Word32 L_olapBuffer[FFTLEN]; /* Perform IFFT */ @@ -2666,6 +2669,12 @@ void SynthesisSTFT_ivas_fx( hFdCngCom->fftBuffer_exp = fftBufferExp; move16(); + sft = getScaleFactor32( fftBuffer, hFdCngCom->fftlen ); + scale_sig32( fftBuffer, hFdCngCom->fftlen, sft ); + fftBufferExp = sub( fftBufferExp, sft ); + hFdCngCom->fftBuffer_exp = fftBufferExp; + move16(); + fftBufferExp = add( fftBufferExp, hFdCngCom->fftlenShift ); /* Perform overlap-add */ @@ -2679,48 +2688,58 @@ void SynthesisSTFT_ivas_fx( } ELSE { - Copy( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); + Copy_Scale_sig_16_32_no_sat( olapBuffer + hFdCngCom->frameSize, L_olapBuffer, hFdCngCom->frameSize, add( sub( hFdCngCom->olapBufferSynth_exp, sub( 15, hFdCngCom->fftlenShift ) ), 16 ) ); /* exp: hFdCngCom->olapBufferSynth_exp -> (15 - fftlenShift) */ set16_fx( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize ); } len2 = shr( hFdCngCom->fftlen, 2 ); len4 = shr( hFdCngCom->fftlen, 3 ); len3 = add( len2, len4 ); len = add( hFdCngCom->frameSize, len4 ); + tmp1 = sub( fftBufferExp, 15 ); IF( tcx_transition ) { FOR( i = 0; i < len; i++ ) { - olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); // Q(15 - fftBufferExp) - move16(); + L_olapBuffer[i] = L_shl_sat( fftBuffer[i], tmp1 ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } } ELSE { FOR( i = 0; i < len4; i++ ) { - olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); - move16(); - olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); - move16(); + L_olapBuffer[i + 1 * len4] = Madd_32_16( L_olapBuffer[i + 1 * len4], L_shl_sat( fftBuffer[i + 1 * len4], tmp1 ), olapWin[i].v.im ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); + L_olapBuffer[i + 2 * len4] = Madd_32_16( L_olapBuffer[i + 2 * len4], L_shl_sat( fftBuffer[i + 2 * len4], tmp1 ), olapWin[len4 - 1 - i].v.re ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } FOR( i = len3; i < len; i++ ) { - olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); + L_olapBuffer[i] = L_shl_sat( fftBuffer[i], tmp1 ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } } FOR( i = 0; i < len4; i++ ) { - olapBuffer[i + 5 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 5 * len4], fftBufferExp - 15 ) ), olapWin[i].v.re ); - move16(); - olapBuffer[i + 6 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 6 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.im ); - move16(); + L_olapBuffer[i + 5 * len4] = Mpy_32_16_1( L_shl_sat( fftBuffer[i + 5 * len4], tmp1 ), olapWin[i].v.re ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); + L_olapBuffer[i + 6 * len4] = Mpy_32_16_1( L_shl_sat( fftBuffer[i + 6 * len4], tmp1 ), olapWin[len4 - 1 - i].v.im ); /* Q(31 - (15 - fftlenShift) ) */ + move32(); } len = add( len, len2 ); FOR( i = len; i < hFdCngCom->fftlen; i++ ) { - olapBuffer[i] = 0; + L_olapBuffer[i] = 0; + move32(); + } + + sft = L_norm_arr( L_olapBuffer, hFdCngCom->fftlen ); + IF( NE_16( sft, 31 ) ) + { + Copy_Scale_sig32_16( L_olapBuffer, olapBuffer, hFdCngCom->fftlen, sft ); + hFdCngCom->olapBufferSynth_exp = sub( sub( 15, hFdCngCom->fftlenShift ), sft ); move16(); } @@ -2737,24 +2756,23 @@ void SynthesisSTFT_ivas_fx( buf[i] = mult_r( olapBuffer[i + len4 - M - 1], hFdCngCom->fftlenFac ); move16(); } + exp = add( hFdCngCom->olapBufferSynth_exp, hFdCngCom->fftlenShift ); tmp = buf[0]; } IF( EQ_16( gen_exc, 1 ) ) { - Word16 s = getScaleFactor16( buf + 1, M + hFdCngCom->frameSize ); - if ( GT_16( *Q_new, s ) ) - { - *Q_new = s; - move16(); - } - - E_UTIL_f_preemph2( *Q_new - 1, buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); - Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); + E_UTIL_f_preemph2( 0, buf + 1, PREEMPH_FAC, add( M, hFdCngCom->frameSize ), &tmp ); + Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 0 ); + *Q_new = sub( 15, exp ); + move16(); } IF( EQ_16( gen_exc, 2 ) ) { - *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp, 1 ); - Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); + *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, add( M, hFdCngCom->frameSize ), &tmp, 0 ); + move16(); + Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, negate( *Q_new ) ); + *Q_new = sub( 15, exp ); + move16(); } } diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 044a06b5b..9a2597db6 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -6512,6 +6512,18 @@ void hf_synth_fx( const Word16 Q_syn2 /* i : synthesis scaling */ ); +void hf_synth_ivas_fx( + ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ + const Word16 *Aq, /* i : quantized Az Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ + Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ + Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/ + const Word16 Q_exc, /* i : excitation scaling */ + const Word16 Q_syn2 /* i : synthesis scaling */ +); + void hf_synth_amr_wb_init_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO /* i/o: AMR-WB IO data handle */ ); @@ -10139,6 +10151,12 @@ void hp400_12k8_fx( Word16 mem[] /* i/o: filter memory [6] */ ); +void hp400_12k8_ivas_fx( + Word16 signal[], /* i/o: input signal / output is divided by 16 */ + const Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o: filter memory [6] */ +); + Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len ); void E_UTIL_f_convolve( const Word16 x[], const Word16 h[], Word16 y[], const Word16 size ); diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index f99d49802..80822f59e 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -377,7 +377,8 @@ typedef struct Word16 *olapBufferAna; /* q_olapBufferAna */ /* points to FD_CNG_DEC->olapBufferAna[FFTLEN] in case of decoder */ Word16 olapBufferAna_fx[FFTLEN]; /* q_olapBufferAna_fx */ /* points to FD_CNG_DEC->olapBufferAna[FFTLEN] in case of decoder */ Word16 olapBufferSynth[FFTLEN]; /* q_olapBuffer */ - Word16 *olapBufferSynth2; /*Q_syn*/ /* points to FD_CNG_DEC->olapBufferSynth2[FFTLEN] in case of decoder */ + Word16 olapBufferSynth_exp; + Word16 *olapBufferSynth2; /*Q_syn*/ /* points to FD_CNG_DEC->olapBufferSynth2[FFTLEN] in case of decoder */ const PWord16 *olapWinAna; const PWord16 *olapWinSyn; diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 77e779efd..b3471e50c 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -3864,6 +3864,58 @@ void hp400_12k8_fx( return; } +void hp400_12k8_ivas_fx( + Word16 signal[], /* i/o: input signal / output is divided by 16 */ + const Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o: filter memory [6] */ +) +{ + Word16 i; + Word16 x0, x1, x2; + Word32 L_tmp, yy1, y2; + + yy1 = L_Comp( mem[2], mem[3] ); /* Q_syn + 13 */ + y2 = L_Comp( mem[0], mem[1] ); /* Q_syn + 13 */ + x0 = mem[4]; /* Q_syn */ + move16(); + x1 = mem[5]; /* Q_syn */ + move16(); + + FOR( i = 0; i < lg; i++ ) + { + x2 = x1; /* Q_syn */ + move16(); + x1 = x0; /* Q_syn */ + move16(); + x0 = signal[i]; /* Q_syn */ + move16(); + + L_tmp = Mpy_32_16_1( yy1, a_hp400_ivas_fx[1] ); /*yy1 * a_hp400[1]*/ /* Qx(Q_of_yy1) + 10 ---->( (Q_syn+13) + 12 - 15)*/ + L_tmp = Madd_32_16( L_tmp, y2, a_hp400_ivas_fx[2] ); /*y2 * a_hp400[2]*/ /* Qx + 10 ---->( (Q_syn+13) + 12 - 15)*/ + L_tmp = L_shl( L_tmp, 3 ); /* shifting by 3 to maintain same Q (Q_syn+13) */ + + L_tmp = L_mac( L_tmp, x0, b_hp400_fx[0] ); /* Q_syn + 13 */ + L_tmp = L_mac( L_tmp, x1, b_hp400_fx[1] ); /* Q_syn + 13 */ + L_tmp = L_mac( L_tmp, x2, b_hp400_fx[2] ); /* Q_syn + 13 */ + + y2 = yy1; /* Q_syn + 13 */ + move32(); + yy1 = L_tmp; /* Q_syn + 13 */ + move32(); + + signal[i] = round_fx( L_tmp ); /* Q_syn - 3 */ + move16(); + } + + L_Extract( yy1, &mem[2], &mem[3] ); + L_Extract( y2, &mem[0], &mem[1] ); + mem[4] = x0; /* Q_syn */ + mem[5] = x1; /* Q_syn */ + move16(); + move16(); + return; +} + Word16 dot_prod_satcontr( const Word16 *x, const Word16 *y, Word16 qx, Word16 qy, Word16 *qo, Word16 len ) { Word16 tmp_tab_x[L_FRAME16k]; diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 2fff712f9..b627b3f47 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -2284,12 +2284,12 @@ ivas_error acelp_core_dec_fx( { IF( EQ_16( st->element_mode, EVS_MONO ) ) { - hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); + hf_synth_ivas_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); } ELSE { Copy_Scale_sig_32_16( synth_fx, synth_fx16, output_frame, 0 ); // Q0 - hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); + hf_synth_ivas_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); Copy_Scale_sig_16_32_DEPREC( synth_fx16, synth_fx, output_frame, 0 ); } } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index cc83eeca3..99d202870 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -2968,7 +2968,9 @@ void generate_comfort_noise_dec_ivas_fx( Word32 tmp1, tmp2; Word16 scaleCldfb; Word32 *fftBuffer = hFdCngCom->fftBuffer; /*hFdCngCom->fftBuffer_exp*/ - Word16 fftBuffer_exp = hFdCngCom->fftBuffer_exp; + Word16 fftBuffer_exp, fftBuffer_exp2; + fftBuffer_exp = hFdCngCom->fftBuffer_exp; + move16(); Word16 fftBuffer_temp_exp[FFTLEN]; Word16 *timeDomainOutput = hFdCngCom->timeDomainBuffer; Word16 temp; @@ -3001,6 +3003,8 @@ void generate_comfort_noise_dec_ivas_fx( hFdCngCom->fftBuffer_exp = fftBuffer_exp; move16(); set16_fx( fftBuffer_temp_exp, fftBuffer_exp, FFTLEN ); + fftBuffer_exp2 = fftBuffer_exp; + move16(); fftBuffer_exp = 0; move16(); @@ -3158,9 +3162,16 @@ void generate_comfort_noise_dec_ivas_fx( /* Perform STFT synthesis */ SynthesisSTFT_ivas_fx( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, - tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out ); - scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp, hFdCngCom->fftBuffer_exp ) ); /*Q31 - fftBuffer_exp*/ - + tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out ); /* fftBuffer in hfDCngCom->fftBuffer_exp */ + /* fftBuffer now in different Qs [0 to fftlen - 1] = hfDCngCom->fftBuffer_exp and [fftlen to FFTLEN(640)] = fftBuffer_exp2, bringing it in common exponent */ + Word16 shift1 = L_norm_arr( fftBuffer, hFdCngCom->fftlen ); + Word16 shift2 = L_norm_arr( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ) ); + Word16 shift = s_max( sub( hFdCngCom->fftBuffer_exp, shift1 ), sub( fftBuffer_exp2, shift2 ) ); + + scale_sig32( fftBuffer, hFdCngCom->fftlen, sub( hFdCngCom->fftBuffer_exp, shift ) ); + scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp2, shift ) ); + hFdCngCom->fftBuffer_exp = shift; + move16(); { Word32 Lener, att; Word16 exp; diff --git a/lib_dec/hf_synth_fx.c b/lib_dec/hf_synth_fx.c index 65c2e9290..27d768f63 100644 --- a/lib_dec/hf_synth_fx.c +++ b/lib_dec/hf_synth_fx.c @@ -21,6 +21,7 @@ static void filt_6k_7k_scale_fx( Word16 signal[], Word16 lg, Word16 mem[], Word16 fact, Word16 exp ); static void hf_synthesis_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn ); +static void hf_synthesis_ivas_fx( ZERO_BWE_DEC_HANDLE hBWE_zero, const Word32 core_brate, const Word16 output_subfr, const Word16 Aq[], const Word16 exc[], const Word16 Q_exc, Word16 synth[], Word16 synth16k[], const Word16 Q_syn ); static void hf_synthesis_amr_wb_fx( const Word32 core_brate, const Word16 output_subfr, const Word16 Ap[], Word16 exc16k[], Word16 synth_out[], Word16 *mem_syn_hf, Word16 *delay_syn_hf, Word16 *mem_hp_interp, Word16 p_r, Word16 HF_corr_gain, Word16 til, Word16 voice_factors, const Word16 exc[], const Word16 Q_exc, const Word16 Q_out, Word16 qhf ); static void envelope_fx( AMRWB_IO_DEC_HANDLE hAmrwb_IO, const Word32 core_brate, const Word16 Aq[], Word16 Ap[], Word16 *r, Word16 tilt0, Word16 tilt, Word16 voice_factor ); static void AdaptiveStartBand_fx( Word16 *start_band, const Word32 rate, const Word16 *lsf, const Word16 voicing_fac, const Word16 clas, Word16 *voicing_flag, Word16 *start_band_old, Word32 *OptCrit_old ); @@ -291,7 +292,213 @@ static void hf_synthesis_fx( { Copy( HF_syn, upsampled_HF_syn, L_SUBFR16k ); /* Q_syn */ } + Vr_add( synth16k, upsampled_HF_syn, synth16k, output_subfr ); + + return; +} + +void hf_synth_ivas_fx( + ZERO_BWE_DEC_HANDLE hBWE_zero, /* i/o: handle to 0 bit BWE parameters */ + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ + const Word16 *Aq, /* i : quantized Az Q12*/ + const Word16 *exc, /* i : excitation at 12.8 kHz Q_exc*/ + Word16 *synth, /* i : 12.8kHz synthesis signal Q_syn2*/ + Word16 *synth16k, /* o : 16kHz synthesis signal Q_syn2*/ + const Word16 Q_exc, /* i : excitation scaling */ + const Word16 Q_syn2 /* i : synthesis scaling */ +) +{ + const Word16 *p_Aq; + Word16 i_subfr, output_subfr; + + output_subfr = shr( output_frame, 2 ); + + p_Aq = Aq; /* Q12 */ + FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + hf_synthesis_ivas_fx( hBWE_zero, core_brate, output_subfr, p_Aq, &exc[i_subfr], Q_exc, &synth[i_subfr], &synth16k[i_subfr * output_subfr / L_SUBFR], Q_syn2 ); + + p_Aq += ( M + 1 ); /* Q12 */ + } + + return; +} + +static void hf_synthesis_ivas_fx( + ZERO_BWE_DEC_HANDLE hBWE_zero, + const Word32 core_brate, /* i : core bitrate Q0*/ + const Word16 output_subfr, /* i : output sub-frame length Q0*/ + const Word16 Aq[], /* i : quantized Az Q12*/ + const Word16 exc[], /* i : excitation at 12.8 kHz Q_exc*/ + const Word16 Q_exc, /* i : excitation scaling */ + Word16 synth[], /* i : 12.8kHz synthesis signal Q_syn*/ + Word16 synth16k[], /* i/o: 16kHz synthesis signal Q_syn*/ + const Word16 Q_syn /* i : synthesis scaling */ +) +{ + Word16 i, s; + Word16 HF_syn[L_SUBFR16k], upsampled_HF_syn[L_FRAME48k / NB_SUBFR]; + Word16 HF_exc[L_SUBFR16k]; + Word16 exp1, exp2, scale, tmp, ener, Q_tmp, Q_ener, sft; + Word32 L_tmp, ONE, P_ONE; + Word16 Ap[M16k + 1]; + Word64 prod; + + /*-----------------------------------------------------------------* + * generate white noise vector + *-----------------------------------------------------------------*/ + + Random_Fill( &hBWE_zero->seed2, L_SUBFR16k, HF_exc, 3 ); /* 3 = Shift Right by 3 */ + + /* o: HF_exc in Q(-3) */ + + /*-----------------------------------------------------------------* + * calculate energy scaling factor so that white noise would have the + * same energy as exc12k8 + *-----------------------------------------------------------------*/ + + /*ener = sum2_f( exc, L_SUBFR ) + 0.01f*/ + ener = extract_h( Dot_product12( exc, exc, L_SUBFR, &exp2 ) ); + exp2 = sub( exp2, add( Q_exc, Q_exc ) ); // ener exponent + + /*tmp = round_fx(Dot_product12(HF_exc, HF_exc, output_subfr, &exp1)); */ + L_tmp = Dot_product12( HF_exc, HF_exc, L_SUBFR16k, &exp1 ); + tmp = round_fx( L_tmp ); + exp1 = add( exp1, 6 ); /* tmp exponent */ + + ener = shr( ener, 1 ); /* to avoid the assertion in div_s() further*/ + exp2 = add( exp2, 1 ); + + tmp = div_s( ener, tmp ); + exp1 = sub( exp2, exp1 ); + + scale = Sqrt16( tmp, &exp1 ); /* scale exponent = exp1 */ + + /*-----------------------------------------------------------------* + * calculate energy scaling factor to respect tilt of synth12k8 + * (tilt: 1=voiced, -1=unvoiced) + *-----------------------------------------------------------------*/ + + hp400_12k8_ivas_fx( synth, L_SUBFR, hBWE_zero->mem_hp400_fx ); + + /* i: mem_hp400 in Q_syn */ + /* i: synth in Q_syn */ + /* o: synth in Q_syn-3 */ + prod = W_mac0_16_16( 1L, synth[0], synth[0] ); /* 2*(Q_syn-3) */ + FOR( i = 1; i < L_SUBFR; i++ ) + { + prod = W_mac0_16_16( prod, synth[i], synth[i] ); /* 2*(Q_syn-3) */ + } + sft = W_norm( prod ); + ener = extract_h( W_extract_h( W_shl( prod, sft ) ) ); + Q_ener = sub( add( shl( sub( Q_syn, 3 ), 1 ), sft ), 48 ); + + prod = W_mac0_16_16( 1L, synth[1], synth[0] ); /* 2*(Q_syn-3) */ + FOR( i = 2; i < L_SUBFR; i++ ) + { + prod = W_mac0_16_16( prod, synth[i], synth[i - 1] ); /* 2*(Q_syn-3) */ + } + sft = sub( W_norm( prod ), 1 ); + tmp = extract_h( W_extract_h( W_shl( prod, sft ) ) ); + Q_tmp = sub( add( shl( sub( Q_syn, 3 ), 1 ), sft ), 48 ); + tmp = s_max( 0, tmp ); + IF( tmp > 0 ) + { + tmp = div_s( tmp, ener ); + Q_tmp = add( 15, sub( Q_tmp, Q_ener ) ); + } + + /*-----------------------------------------------------------------* + * modify energy of white noise according to synthesis tilt + *-----------------------------------------------------------------*/ + /* tmp = 1.0 - fac */ + ONE = L_shl( 1, Q_tmp ); + P_ONE = L_shl( 3277 /* 0.1 in Q15 */, sub( Q_tmp, 15 ) ); + L_tmp = L_msu0( ONE, tmp, 1 ); + test(); + if ( core_brate == FRAME_NO_DATA || EQ_32( core_brate, SID_2k40 ) ) + { + /* emphasize HF noise in CNG */ + /*fac *= 2.0f;*/ + L_tmp = L_add( L_tmp, L_tmp ); + } + L_tmp = L_max( L_tmp, P_ONE ); + L_tmp = L_min( L_tmp, ONE ); + + sft = norm_l( L_tmp ); + L_tmp = L_shl( L_tmp, sft ); + + tmp = round_fx( L_tmp ); + Q_tmp = sub( add( Q_tmp, sft ), 16 ); + + /*scale *= fac;*/ + tmp = mult_r( scale, tmp ); /* Q = (15 - exp1) + Q_tmp - 15 */ + Q_tmp = sub( Q_tmp, exp1 ); + /*-----------------------------------------------------------------* + * modify HF excitation according to both calculated scaling factors + * high pass filtering (0.94ms of delay) + *-----------------------------------------------------------------*/ + + exp2 = sub( hBWE_zero->memExp1, exp1 ); + hBWE_zero->memExp1 = exp1; + move16(); + + filt_6k_7k_scale_fx( HF_exc, L_SUBFR16k, hBWE_zero->mem_hf_fx, tmp, exp2 ); + /* i: HF_exc in Q(-3) */ + /* o: HF_exc in ((-3) + Q_tmp - 17) */ + /* o: hBWE_zero->mem_hf_fx in Q(HF_exc)-2 */ + + /*-----------------------------------------------------------------* + * synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz + *-----------------------------------------------------------------*/ + + /*weight_a( Aq, Ap, 0.6f, M );*/ + weight_a_lc_fx( Aq, Ap, Gamma_19661_Tbl_fx, M ); + /* o: Ap in Q14 */ + + Syn_filt_s( 0, Ap, M, HF_exc, HF_syn, L_SUBFR16k, hBWE_zero->mem_syn_hf_fx, 1 ); + /* o: HF_syn in same Q as HF_exc */ + /* o: mem_syn_hf_fx same Q as HF_syn */ + + Scale_sig( HF_syn, L_SUBFR16k, ( add( Q_syn, exp1 ) ) ); /* bring HF_syn to (Q_syn+exp1) */ + + /*-----------------------------------------------------------------* + * add filtered HF noise to speech synthesis + *-----------------------------------------------------------------*/ + + /* delay by 5 samples @16kHz to compensate CLDFB resampling delay (20samples) and HP filtering delay (roughly 15 samples) */ + delay_signal_fx( HF_syn, L_SUBFR16k, hBWE_zero->delay_syn_hf_fx, NS2SA_FX2( 16000, DELAY_CLDFB_NS ) - 15 ); + + /* interpolate the HF synthesis */ + IF( EQ_16( output_subfr, L_SUBFR48k ) ) /* 48kHz sampled output */ + { + s = s_max( s_min( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN - 3 ) ), 3 ), + sub( Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx + INTERP_3_1_MEM_LEN - 3, 3 ), 1 ) ), + 0 ); + Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, s ); /* Qx + s */ + interpolate_3_over_1_allpass_fx( HF_syn, L_SUBFR16k, upsampled_HF_syn, hBWE_zero->mem_hp_interp_fx ); + Scale_sig( upsampled_HF_syn, 3 * L_SUBFR16k, -s ); /* Q_syn + exp1 + s */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, INTERP_3_1_MEM_LEN, -s ); /* Qx */ + Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */ + Scale_sig( upsampled_HF_syn, L_SUBFR48k, -1 ); + } + ELSE IF( EQ_16( output_subfr, L_SUBFR32k ) ) /* 32kHz sampled output */ + { + s = s_max( sub( s_min( Find_Max_Norm16( HF_syn, L_SUBFR16k ), Find_Max_Norm16( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP ) ), 2 ), 0 ); + Scale_sig( HF_syn, L_SUBFR16k, s ); /* Q_syn+exp1+s */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, s ); /* Qx + s */ + Interpolate_allpass_steep_fx( HF_syn, hBWE_zero->mem_hp_interp_fx, L_SUBFR16k, upsampled_HF_syn ); + Scale_sig( upsampled_HF_syn, 2 * L_SUBFR16k, -s ); /* Q_syn + exp1 */ + Scale_sig( hBWE_zero->mem_hp_interp_fx, 2 * ALLPASSSECTIONS_STEEP, -s ); /* Qx */ + Scale_sig( HF_syn, L_SUBFR16k, -s ); /* Q_syn+exp1 */ + } + ELSE /* 16kHz sampled output */ + { + Copy( HF_syn, upsampled_HF_syn, L_SUBFR16k ); /* Q_syn */ + } Vr_add( synth16k, upsampled_HF_syn, synth16k, output_subfr ); return; diff --git a/lib_dec/ivas_ism_dtx_dec_fx.c b/lib_dec/ivas_ism_dtx_dec_fx.c index 73ea5cd1f..d5943a90c 100644 --- a/lib_dec/ivas_ism_dtx_dec_fx.c +++ b/lib_dec/ivas_ism_dtx_dec_fx.c @@ -161,7 +161,7 @@ void ivas_ism_dtx_limit_noise_energy_for_near_silence_fx( ) { Word32 fac_fx, cng_noise_nrg_obj_fx, cng_noise_nrg_dominant_fx; - Word16 ch, cng_noise_level_len, Q_cng_noise_nrg_dominant, Q_fac; + Word16 ch, cng_noise_level_len, Q_cng_noise_nrg_dominant, exp; HANDLE_FD_CNG_COM hFdCngCom; hFdCngCom = hSCE[sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom; cng_noise_level_len = sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ); @@ -193,10 +193,10 @@ void ivas_ism_dtx_limit_noise_energy_for_near_silence_fx( Q_temp = sub( Q_temp, 1 ); temp = L_shr( temp, 1 ); } - fac_fx = getSqrtWord32( temp ); /*Resultant Q=Q_temp/2*/ - Q_fac = shr( Q_temp, 1 ); + exp = sub( 31, Q_temp ); + fac_fx = Sqrt32( temp, &exp ); v_multc_fixed( hFdCngCom->cngNoiseLevel, fac_fx, hFdCngCom->cngNoiseLevel, cng_noise_level_len ); /*Resultant Q of cngNoiseLevel is Q_cngNoiseLevel for ch*/ - scale_sig32( hFdCngCom->cngNoiseLevel, cng_noise_level_len, negate( sub( 31, Q_fac ) ) ); /*Restoring Q of hFdCngCom->cngNoiseLevel to Q_cngNoiseLevel */ + scale_sig32( hFdCngCom->cngNoiseLevel, cng_noise_level_len, exp ); /*Restoring Q of hFdCngCom->cngNoiseLevel to Q_cngNoiseLevel */ } } } -- GitLab From e2cf5b321499d899bc7bb0d96a9f4eddc614a896 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 23 May 2025 10:58:33 +0200 Subject: [PATCH 0700/1310] port FIX_998_UNUSED_FUNCTION --- lib_com/options.h | 3 +- lib_dec/ivas_dirac_dec_fx.c | 34 +++++++++++++++++++ lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 22 +++++++++--- lib_rend/ivas_dirac_rend_fx.c | 4 +++ lib_rend/ivas_prot_rend_fx.h | 4 +++ 5 files changed, 62 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 91172d59a..d6b22d17d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,8 @@ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ -#endif +#endif +#define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index feca814c8..058897119 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2738,6 +2738,7 @@ void ivas_dirac_dec_render_sf_fx( { masa_band_mapping = st_ivas->hMasa->data.band_mapping; } +#ifndef FIX_998_UNUSED_FUNCTION test(); test(); IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && EQ_16( st_ivas->hCombinedOrientationData->shd_rot_max_order, 1 ) ) @@ -2772,6 +2773,20 @@ void ivas_dirac_dec_render_sf_fx( NULL, hodirac_flag ); } +#else + ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + masa_band_mapping, + st_ivas->hMasaIsmData, + azimuth, + elevation, + md_idx, + surCohRatio_fx, + surCohRatio_q_fx, + hodirac_flag ); + +#endif } test(); @@ -3291,6 +3306,7 @@ void ivas_dirac_dec_render_sf_fx( move16(); } +#ifndef FIX_998_UNUSED_FUNCTION test(); test(); IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) @@ -3333,6 +3349,24 @@ void ivas_dirac_dec_render_sf_fx( hodirac_flag, hDirAC->hConfig->dec_param_estim ); } +#else + ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fx, + DirAC_mem.reference_power_q, + p_onset_filter_fx, + azimuth, + elevation, + hSpatParamRendCom->diffuseness_vector_fx[md_idx], + hSpatParamRendCom->q_diffuseness_vector, + hSpatParamRendCom, + hDirACRend, + st_ivas->hVBAPdata, + hDirACRend->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag, + hDirAC->hConfig->dec_param_estim ); + +#endif IF( hDirAC->hConfig->dec_param_estim ) { diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 7b446a80e..70719a185 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -650,8 +650,10 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 q_diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ +#ifndef FIX_998_UNUSED_FUNCTION const Word16 sh_rot_max_order, - const Word32 *p_Rmat, /* i : rotation matrix Q30*/ + const Word32 *p_Rmat, /* i : rotation matrix Q30*/ +#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const Word16 nchan_transport, /* i : number of transport channels*/ @@ -705,8 +707,10 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( md_idx, NULL, 0, +#ifndef FIX_998_UNUSED_FUNCTION 2, p_Rmat, +#endif hodirac_flag ); { @@ -777,8 +781,10 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( md_idx, NULL, 0, +#ifndef FIX_998_UNUSED_FUNCTION sh_rot_max_order, p_Rmat, +#endif hodirac_flag ); { @@ -2778,6 +2784,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( return; } +#ifndef FIX_998_UNUSED_FUNCTION /*------------------------------------------------------------------------- * ivas_dirac_dec_get_response_split_order() @@ -3061,6 +3068,7 @@ static void ivas_dirac_dec_get_response_split_order_fx( return; } +#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_compute_directional_responses() @@ -3079,9 +3087,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( const Word16 md_idx, const Word32 *surCohRatio_fx, /*i:Q_surCohRatio*/ Word16 Q_surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION const Word16 shd_rot_max_order, /* i : split-order rotation method */ const Word32 *p_Rmat, /* i : rotation matrix Q30*/ - const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ +#endif + const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { Word16 k, l, i; @@ -3194,6 +3204,7 @@ void ivas_dirac_dec_compute_directional_responses_fx( exp_direct_response_dir2 = 0; move16(); +#ifndef FIX_998_UNUSED_FUNCTION IF( p_Rmat != 0 ) { ivas_dirac_dec_get_response_split_order_fx( azimuth[k], elevation[k], direct_response_hoa_fx, shd_rot_max_order, p_Rmat, &Q_direct_response_hoa ); @@ -3205,10 +3216,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( } ELSE { +#endif #ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx ivas_dirac_dec_get_response_fx_29( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order ); #else - ivas_dirac_dec_get_response_fx( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_hoa ); + ivas_dirac_dec_get_response_fx( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_hoa ); #endif IF( hodirac_flag ) @@ -3216,10 +3228,12 @@ void ivas_dirac_dec_compute_directional_responses_fx( #ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx ivas_dirac_dec_get_response_fx_29( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order ); #else - ivas_dirac_dec_get_response_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_dir2 ); + ivas_dirac_dec_get_response_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_dir2 ); #endif } +#ifndef FIX_998_UNUSED_FUNCTION } +#endif test(); test(); diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index f67f3761b..708fe8b20 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4223,8 +4223,10 @@ static void ivas_masa_ext_dirac_render_sf_fx( md_idx, surCohRatio_fx, Q_surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION 0, NULL, +#endif 0 ); Word16 proto_direct_buffer_f_temp_q[60]; @@ -4599,8 +4601,10 @@ static void ivas_masa_ext_dirac_render_sf_fx( hSpatParamRendCom->q_diffuseness_vector, hSpatParamRendCom, hDirACRend, +#ifndef FIX_998_UNUSED_FUNCTION 0, 0, +#endif hMasaExtRend->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 4e23011b4..ba7ca8458 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -472,8 +472,10 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 q_diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ +#ifndef FIX_998_UNUSED_FUNCTION const Word16 sh_rot_max_order, const Word32 *p_Rmat, /* i : rotation matrix */ +#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const Word16 nchan_transport, /* i : number of transport channels*/ @@ -545,8 +547,10 @@ void ivas_dirac_dec_compute_directional_responses_fx( const Word16 md_idx, const Word32 *surCohRatio_fx, Word16 Q_surCohRatio, +#ifndef FIX_998_UNUSED_FUNCTION const Word16 shd_rot_max_order, /* i : split-order rotation method */ const Word32 *p_Rmat, /* i : rotation matrix */ +#endif const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); -- GitLab From 889b7fd5f512305821befc78e178b03e33466446 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Fri, 23 May 2025 12:38:27 +0200 Subject: [PATCH 0701/1310] Fixed declarations and refs --- lib_rend/ivas_stat_rend.h | 9 ++++++--- lib_util/hrtf_file_reader.c | 39 ++++++++++++++++++++++++------------- lib_util/hrtf_file_reader.h | 16 ++------------- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 77d3bcc35..0443d1854 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1480,9 +1480,12 @@ typedef struct ivas_hrtfs_parambin_struct #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES typedef struct ivas_hrtfs_statistics_struct { - Word32 *average_energy_l; - Word32 *average_energy_r; - Word32 *inter_aural_coherence; + const Word32 *average_energy_l; + const Word32 *average_energy_r; + const Word32 *inter_aural_coherence; + Word32 *average_energy_l_dyn; + Word32 *average_energy_r_dyn; + Word32 *inter_aural_coherence_dyn; int16_t fromROM; /* Flag that indicates that the pointers point to tables in ROM (controls init/dealloc).*/ } HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; #endif diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 364afc813..890d488bf 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -797,17 +797,21 @@ static ivas_error load_reverb_from_binary( if ( is_reverb ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - hHrtfStatistics->average_energy_l = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); - hHrtfStatistics->average_energy_r = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); - hHrtfStatistics->inter_aural_coherence = (Word32 *) malloc( lr_iac_len * sizeof( Word32) ); + hHrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + hHrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + hHrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32) ); - if ( hHrtfStatistics->average_energy_l == NULL || hHrtfStatistics->average_energy_r == NULL || hHrtfStatistics->inter_aural_coherence == NULL ) + if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_r_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - fread( hHrtfStatistics->average_energy_l, sizeof( const Word32 ), lr_iac_len, f_hrtf ); - fread( hHrtfStatistics->average_energy_r, sizeof( const Word32 ), lr_iac_len, f_hrtf ); - fread( hHrtfStatistics->inter_aural_coherence, sizeof( const Word32 ), lr_iac_len, f_hrtf ); + hHrtfStatistics->average_energy_l = hHrtfStatistics->average_energy_l_dyn; + hHrtfStatistics->average_energy_r = hHrtfStatistics->average_energy_r_dyn; + hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; + fread( hHrtfStatistics->average_energy_l_dyn, sizeof( const Word32 ), lr_iac_len, f_hrtf ); + fread( hHrtfStatistics->average_energy_r_dyn, sizeof( const Word32 ), lr_iac_len, f_hrtf ); + fread( hHrtfStatistics->inter_aural_coherence_dyn, sizeof( const Word32 ), lr_iac_len, f_hrtf ); + hHrtfStatistics->fromROM = FALSE; #else @@ -2366,18 +2370,27 @@ void destroy_SetOfHRTF( * Destroy the HRTF statistics set. *---------------------------------------------------------------------*/ -ivas_error destroy_hrtf_statistics( +void destroy_hrtf_statistics( IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ ) { - if ( hHrtfStatistics != NULL && ( *hHrtfStatistics )->fromROM == FALSE ) + if ( ( hHrtfStatistics != NULL ) && ( *hHrtfStatistics != NULL ) && ( ( *hHrtfStatistics )->fromROM == FALSE ) ) { - free( ( *hHrtfStatistics )->average_energy_l ); - free( ( *hHrtfStatistics )->average_energy_r ); - free( ( *hHrtfStatistics )->inter_aural_coherence ); + if ( ( *hHrtfStatistics )->average_energy_l != NULL ) + { + free( ( *hHrtfStatistics )->average_energy_l_dyn ); + } + if ( ( *hHrtfStatistics )->average_energy_r != NULL ) + { + free( ( *hHrtfStatistics )->average_energy_r_dyn ); + } + if ( ( *hHrtfStatistics )->inter_aural_coherence != NULL ) + { + free( ( *hHrtfStatistics )->inter_aural_coherence_dyn ); + } + } ivas_HRTF_statistics_close( hHrtfStatistics ); - return IVAS_ERR_OK; } #endif diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 4b9806eb8..302a90dee 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -96,7 +96,7 @@ ivas_error load_HRTF_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES /*---------------------------------------------------------------------* - * load_reverb_from_binary() + * load_reverb_binary() * * Load reverb binary data into the HRTF handle *---------------------------------------------------------------------*/ @@ -186,7 +186,7 @@ ivas_error load_parambin_HRTF_from_binary( * free memory allocated for HRTF statistics binary data *---------------------------------------------------------------------*/ -ivas_error destroy_hrtf_statistics( +void destroy_hrtf_statistics( IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ ); #endif @@ -206,18 +206,6 @@ void destroy_parambin_hrtf( IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin /* i/o: Parambin HRTF handle */ ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -/*---------------------------------------------------------------------* - * destroy_hrtf_statistics() - * - * free memory allocated for HRTF statistics binary data - *---------------------------------------------------------------------*/ - -ivas_error destroy_hrtf_statistics( - IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ -); -#endif - /*---------------------------------------------------------------------* * destroy_td_hrtf() * -- GitLab From 7d27a1f4b85ec132993021f9d441d693ac7687ca Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Fri, 23 May 2025 13:02:06 +0200 Subject: [PATCH 0702/1310] deactivated switch --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0542d2be6..c257150a2 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,7 +97,7 @@ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ -#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -- GitLab From 447118dcd8dad57143b0607fa6ea81e818eee165 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 23 May 2025 17:42:32 +0530 Subject: [PATCH 0703/1310] Fix for EVS BE differences --- lib_dec/acelp_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index b627b3f47..fd0c8ce2d 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -2284,7 +2284,7 @@ ivas_error acelp_core_dec_fx( { IF( EQ_16( st->element_mode, EVS_MONO ) ) { - hf_synth_ivas_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); + hf_synth_fx( st->hBWE_zero, st->core_brate, output_frame, Aq_fx, exc2_fx, psyn_fx, synth_fx16, st->Q_exc, st->Q_syn2 ); } ELSE { -- GitLab From 21cfaa4b9c28ce68dbc421edec4ee3363202d47c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 23 May 2025 14:32:18 +0200 Subject: [PATCH 0704/1310] port MR 1425 from float fix msan error for OSBA to stereo decoding --- lib_com/options.h | 2 ++ lib_dec/ivas_ism_renderer_fx.c | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4fd97b2d4..1d23ec23f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -132,6 +132,8 @@ #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #endif +#define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ + /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index c3904d136..efb022919 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -183,6 +183,11 @@ void ivas_ism_render_sf_fx( n_samples_rendered_loop = 0; move16(); +#ifdef DEBUGGING + assert( slots_to_render == 0 ); + assert( last_sf <= st_ivas->hTcBuffer->nb_subframes ); +#endif + WHILE( slots_to_render > 0 ) { slots_to_render = sub( slots_to_render, st_ivas->hTcBuffer->subframe_nbslots[last_sf] ); @@ -322,7 +327,13 @@ void ivas_ism_render_sf_fx( ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); n_samples_rendered_loop = add( n_samples_rendered_loop, n_samples_in_subframe ); +#ifdef NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO + /* update rendered subframe and slots info for all cases apart from a following crend call, the update will + then happen in the crend call*/ + if ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) +#else IF( EQ_16( st_ivas->renderer_type, RENDERER_TD_PANNING ) ) +#endif { st_ivas->hTcBuffer->subframes_rendered = add( st_ivas->hTcBuffer->subframes_rendered, 1 ); st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] ); -- GitLab From a2f8fbf18f04e7660cc87a609fea23d3ce1a7372 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 23 May 2025 17:46:17 +0530 Subject: [PATCH 0705/1310] Fix for 3GPP issue 1475: 160 kbit/s ISM4 Encoder: FB BWE lacking energy Link #1475 --- lib_enc/swb_tbe_enc_fx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 903f3a46c..a4230db46 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7548,7 +7548,7 @@ void fb_tbe_enc_ivas_fx( move16(); temp2 = sum2_fx_no_sat( input_fhb, L_FRAME48k / 2 ); // 2*q_input_fhb /* Q(2*Q_input_fhb-8) */ - temp2 = W_add( temp2, W_shl( hBWE_TD->prev_fb_energy_fx, sub( q_input_fhb, hBWE_TD->prev_fb_energy_fx_Q ) ) ); // 2*q_input_fhb + temp2 = W_add( temp2, W_shl( hBWE_TD->prev_fb_energy_fx, sub( shl( q_input_fhb, 1 ), hBWE_TD->prev_fb_energy_fx_Q ) ) ); // 2*q_input_fhb temp1 = sum2_fx_no_sat( input_fhb + L_FRAME48k / 2, L_FRAME48k / 2 ); // 2*q_input_fhb exp = W_norm( temp1 ); @@ -7605,7 +7605,6 @@ void fb_tbe_enc_ivas_fx( { push_indice( st->hBstr, IND_FB_SLOPE, idxGain, 4 ); } - return; } void tbe_write_bitstream_fx( -- GitLab From e26eb7288617bc285cf2e2ec22cd02f2183b8664 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 23 May 2025 18:15:50 +0530 Subject: [PATCH 0706/1310] Clang formatting changes --- lib_enc/swb_tbe_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index a4230db46..9d0f16ee9 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -7547,7 +7547,7 @@ void fb_tbe_enc_ivas_fx( hBWE_TD->old_input_fhb_fx_Q = exp_temp; move16(); - temp2 = sum2_fx_no_sat( input_fhb, L_FRAME48k / 2 ); // 2*q_input_fhb /* Q(2*Q_input_fhb-8) */ + temp2 = sum2_fx_no_sat( input_fhb, L_FRAME48k / 2 ); // 2*q_input_fhb /* Q(2*Q_input_fhb-8) */ temp2 = W_add( temp2, W_shl( hBWE_TD->prev_fb_energy_fx, sub( shl( q_input_fhb, 1 ), hBWE_TD->prev_fb_energy_fx_Q ) ) ); // 2*q_input_fhb temp1 = sum2_fx_no_sat( input_fhb + L_FRAME48k / 2, L_FRAME48k / 2 ); // 2*q_input_fhb -- GitLab From 71126a82078ca01bf6c38a9e3cdd20e8502820aa Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 23 May 2025 15:28:28 +0200 Subject: [PATCH 0707/1310] port MR 1382 from float correct energy for BINAURAL_ROOM_REVERB output with head rotation for parameteric multichannel modes --- lib_com/options.h | 1 + lib_dec/ivas_binRenderer_internal_fx.c | 65 +++++++++++++++++++------- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a0c7f4f3f..06952c341 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -132,6 +132,7 @@ #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #endif #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ +#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 9b7bd86b6..33cf0c9e2 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1095,28 +1095,54 @@ static void ivas_binaural_obtain_DMX_fx( set32_fx( outRealRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( outImagRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + /*Ambisonics input requires different processing*/ + if ( EQ_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) ) { - Word32 foa_const_fx = L_shl( hBinRenderer->hReverb->foa_enc_fx[chIdx][1], 1 ); // Q30 - Word32 one_add_foa_const, one_sub_foa_const; + Word32 *inRealPtr_W, *inImagPtr_W; + Word32 *inRealPtr_Y, *inImagPtr_Y; - one_add_foa_const = L_add( ONE_IN_Q30, foa_const_fx ); // Q30 - one_sub_foa_const = L_sub_sat( ONE_IN_Q30, foa_const_fx ); // Q30 + inRealPtr_W = (Word32 *) &( RealBuffer[0][k][0] ); + inImagPtr_W = (Word32 *) &( ImagBuffer[0][k][0] ); - inRealPtr_fx = (Word32 *) &( RealBuffer[chIdx][k][0] ); - inImagPtr_fx = (Word32 *) &( ImagBuffer[chIdx][k][0] ); + inRealPtr_Y = (Word32 *) &( RealBuffer[1][k][0] ); + inImagPtr_Y = (Word32 *) &( ImagBuffer[1][k][0] ); FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - outRealLeftPtr_fx[bandIdx] = L_add( outRealLeftPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 - move32(); - outImagLeftPtr_fx[bandIdx] = L_add( outImagLeftPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 - move32(); + outRealLeftPtr_fx[bandIdx] = L_add( inRealPtr_W[bandIdx], inRealPtr_Y[bandIdx] ); + outImagLeftPtr_fx[bandIdx] = L_add( inImagPtr_W[bandIdx], inImagPtr_Y[bandIdx] ); - outRealRightPtr_fx[bandIdx] = L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 - move32(); - outImagRightPtr_fx[bandIdx] = L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 - move32(); + outRealRightPtr_fx[bandIdx] = L_sub( inRealPtr_W[bandIdx], inRealPtr_Y[bandIdx] ); + outImagRightPtr_fx[bandIdx] = L_sub( inImagPtr_W[bandIdx], inImagPtr_Y[bandIdx] ); + } + } + else +#endif + { + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + Word32 foa_const_fx = L_shl( hBinRenderer->hReverb->foa_enc_fx[chIdx][1], 1 ); // Q30 + Word32 one_add_foa_const, one_sub_foa_const; + + one_add_foa_const = L_add( ONE_IN_Q30, foa_const_fx ); // Q30 + one_sub_foa_const = L_sub_sat( ONE_IN_Q30, foa_const_fx ); // Q30 + + inRealPtr_fx = (Word32 *) &( RealBuffer[chIdx][k][0] ); + inImagPtr_fx = (Word32 *) &( ImagBuffer[chIdx][k][0] ); + + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + outRealLeftPtr_fx[bandIdx] = L_add( outRealLeftPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 + move32(); + outImagLeftPtr_fx[bandIdx] = L_add( outImagLeftPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_add_foa_const ) ); // Q_in - 1 + move32(); + + outRealRightPtr_fx[bandIdx] = L_add( outRealRightPtr_fx[bandIdx], Mpy_32_32( inRealPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 + move32(); + outImagRightPtr_fx[bandIdx] = L_add( outImagRightPtr_fx[bandIdx], Mpy_32_32( inImagPtr_fx[bandIdx], one_sub_foa_const ) ); // Q_in - 1 + move32(); + } } } } @@ -1462,8 +1488,15 @@ ivas_error ivas_binRenderer_open_fx( { test(); test(); - /* NOTE to future self by @kiene: this should have been changed by NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM, but the BASOP repo code is not at that point yet, so not change needed here */ +#ifdef NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM + IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) +#else +#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING + IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && NE_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) ) +#else IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) +#endif +#endif { FOR( k = 0; k < 11; k++ ) { -- GitLab From 61c61ffbcbb1863eae0f7de1eea1f54765a7a863 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Fri, 23 May 2025 16:51:53 +0200 Subject: [PATCH 0708/1310] fixed syntax in lib_rend.c, solved build errors locally in windows --- lib_rend/lib_rend.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7c2e4115d..09894c319 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4319,22 +4319,17 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( test(); test(); + #ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) #else IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { - IF( NE_32( ( error = initMcBinauralRendering( inputMc, - inputMc->base.inConfig, - hIvasRend->outputConfig, - hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - hIvasRend->hHrtfs.hHrtfStatistics, -#endif - FALSE ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -5170,11 +5165,20 @@ ivas_error IVAS_REND_SetHeadRotation( hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, + TRUE ) ), + IVAS_ERR_OK ) ) #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - hIvasRend->hHrtfs.hHrtfStatistics, + + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], + hIvasRend->inputsMc[i].base.inConfig, + hIvasRend->outputConfig, + hIvasRend->hRendererConfig, + hIvasRend->hHrtfs.hSetOfHRTF, + hIvasRend->hHrtfs.hHrtfStatistics, + TRUE ) ), + IVAS_ERR_OK ) ) #endif - TRUE ) ), - IVAS_ERR_OK ) ) + { return error; } @@ -5283,11 +5287,20 @@ ivas_error IVAS_REND_DisableHeadRotation( hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, + TRUE ) ), + IVAS_ERR_OK ) ) #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], + hIvasRend->inputsMc[i].base.inConfig, + hIvasRend->outputConfig, + hIvasRend->hRendererConfig, + hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, -#endif TRUE ) ), - IVAS_ERR_OK ) ) + IVAS_ERR_OK ) ) +#endif + + { return error; -- GitLab From 2091110cbf8217c44fc3c6e24ca8e55456113d8e Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Fri, 23 May 2025 17:05:11 +0200 Subject: [PATCH 0709/1310] draft: activated compiler switch and added code for converting float binary hrtf data to word32 (needs debugigng) --- lib_com/options.h | 2 +- lib_util/hrtf_file_reader.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c257150a2..0542d2be6 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,7 +97,7 @@ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ -//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 890d488bf..30921e7fe 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -808,9 +808,15 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->average_energy_l = hHrtfStatistics->average_energy_l_dyn; hHrtfStatistics->average_energy_r = hHrtfStatistics->average_energy_r_dyn; hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; - fread( hHrtfStatistics->average_energy_l_dyn, sizeof( const Word32 ), lr_iac_len, f_hrtf ); - fread( hHrtfStatistics->average_energy_r_dyn, sizeof( const Word32 ), lr_iac_len, f_hrtf ); - fread( hHrtfStatistics->inter_aural_coherence_dyn, sizeof( const Word32 ), lr_iac_len, f_hrtf ); + + fread( hHrtfStatistics->average_energy_l_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, lr_iac_len ); + + fread( hHrtfStatistics->average_energy_r_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, lr_iac_len ); + + fread( hHrtfStatistics->inter_aural_coherence_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, lr_iac_len ); hHrtfStatistics->fromROM = FALSE; -- GitLab From 7c54695c08f961c2e460cd8db6b8d47bdcf2716e Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Fri, 23 May 2025 17:08:59 +0200 Subject: [PATCH 0710/1310] Added code for converting float binary hrtf to word32. Build failed, needs debugging --- lib_util/hrtf_file_reader.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 30921e7fe..e10e49870 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -810,13 +810,13 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; fread( hHrtfStatistics->average_energy_l_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, lr_iac_len ); + floatToFixed_arr32( hHrtfStatistics->average_energy_l_dyn, hHrtfStatistics->average_energy_l, Q27, lr_iac_len ); fread( hHrtfStatistics->average_energy_r_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, lr_iac_len ); + floatToFixed_arr32( hHrtfStatistics->average_energy_r_dyn, hHrtfStatistics->average_energy_r, Q27, lr_iac_len ); fread( hHrtfStatistics->inter_aural_coherence_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, lr_iac_len ); + floatToFixed_arr32( hHrtfStatistics->inter_aural_coherence_dyn, hHrtfStatistics->inter_aural_coherence, Q23, lr_iac_len ); hHrtfStatistics->fromROM = FALSE; -- GitLab From f866ba3f8b09e41b6ba9c9e788e8b4cc953aa4df Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 26 May 2025 08:23:55 +0200 Subject: [PATCH 0711/1310] Remove unnecessary change. The assignment hHQ_core->Q_old_wtda = Q_syn to be excpected here is found a few lines further away. --- lib_dec/er_dec_tcx_fx.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 775be6489..374e4c3a6 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -848,10 +848,6 @@ void con_tcx_fx( move16(); #endif Copy( syn + sub( L_frame, n ), hHQ_core->old_out_fx, sub( L_frame, n ) ); /*Q_syn*/ -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT - hHQ_core->Q_old_wtda = Q_syn; - move16(); -#endif FOR( i = 0; i < W12; i++ ) { -- GitLab From 00fc2426fc83bcdd98ceff35f48c508bcbc14397 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 11:29:35 +0200 Subject: [PATCH 0712/1310] port FIX_1024_REMOVE_PARAMMC_MIXING_MAT --- lib_com/options.h | 1 + lib_dec/ivas_mc_param_dec_fx.c | 2 ++ lib_dec/ivas_out_setup_conversion_fx.c | 8 ++++++++ 3 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 7b19fc92a..91fa26a53 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,6 +135,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ +#define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index b59623113..3ee471861 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -3085,6 +3085,7 @@ static void ivas_param_mc_get_mixing_matrices_fx( return; } +#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT /*------------------------------------------------------------------------- * ivas_param_mc_get_mono_stereo_mixing_matrices() @@ -3093,6 +3094,7 @@ static void ivas_param_mc_get_mixing_matrices_fx( * for mono and stereo output *------------------------------------------------------------------------*/ +#endif /*------------------------------------------------------------------------- * param_mc_update_mixing_matrices() diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 93a7c204e..5ce1f08f1 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -1190,7 +1190,11 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( set_zero_fx( cy_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); set_zero_fx( Nrqq_fx, MAX_OUTPUT_CHANNELS ); set_zero_fx( target_ch_ener_fx, MAX_OUTPUT_CHANNELS ); +#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT + /* Step 1.2, get target channel energies for the transported format, Nrqq calculation */ +#else /* Step 1.2, get target channel energies for the transported format as in ivas_param_mc_get_mono_stereo_mixing_matrices(), Nrqq calculation */ +#endif ild_q_fx = hParamMC->icld_q_fx + imult1616( bandIdx, hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); move16(); FOR( chInIdx = 0; chInIdx < nchan_transport_format; chInIdx++ ) @@ -1212,7 +1216,11 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( move32(); } +#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT + /* Step 1.3 get target Cy () (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ +#else /* Step 1.3 get target Cy like in ivas_param_mc_get_mono_stereo_mixing_matrices() (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ +#endif FOR( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) { FOR( i = 0; i < nchan_transport_format; i++ ) -- GitLab From 2f8b36395a72b58254886986570bb82a64dc3953 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Mon, 26 May 2025 12:07:31 +0200 Subject: [PATCH 0713/1310] Float to fixed point conversion for binary hrtf data + compiler switch bug fixes --- lib_com/options.h | 8 +--- lib_dec/ivas_init_dec.c | 2 +- lib_rend/ivas_reverb_fx.c | 12 +++--- lib_rend/ivas_reverb_utils_fx.c | 9 +++-- lib_util/hrtf_file_reader.c | 72 +++++++++++++++++---------------- 5 files changed, 53 insertions(+), 50 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0542d2be6..efcf2546b 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -99,13 +99,7 @@ #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT -#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format */ -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES -#define NONBE_FIX_AVG_IAC_CLDFB_REVERB -#endif -#endif +#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #define NONBE_FIX_AVG_IAC_CLDFB_REVERB diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 05efe8207..f30c7c891 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2345,7 +2345,7 @@ ivas_error ivas_init_decoder_fx( #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend.splitrend.multiBinPoseData.num_poses ) ), + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index f1393148d..9d71653fe 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1284,8 +1284,6 @@ static void set_reverb_acoustic_data_fx( Word32 ln_1e6_inverted_fx, delay_diff_fx, L_tmp; Word16 exp_argument_fx, tmp, tmp_flag, exp_argument_e; Word16 pow_exp; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#else Word32 *pHrtf_set_l_re_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_l_im_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_r_re_fx[MAX_INTERN_CHANNELS]; @@ -1300,6 +1298,8 @@ static void set_reverb_acoustic_data_fx( Word16 *pRt60_e = pParams->pRt60_e; Word32 *pDsr_fx = pParams->pDsr_fx; Word16 *pDsr_e = pParams->pDsr_e; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#else /* use crend hrtf filters */ IF( hHrtf != NULL ) @@ -1558,9 +1558,9 @@ ivas_error ivas_reverb_open_fx( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES set_reverb_acoustic_data( ¶ms, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter ); - params.pHrtf_avg_pwr_response_l_const = hHrtfStatistics->average_energy_l; - params.pHrtf_avg_pwr_response_r_const = hHrtfStatistics->average_energy_r; - params.pHrtf_inter_aural_coherence_const = hHrtfStatistics->inter_aural_coherence; + params.pHrtf_avg_pwr_response_l_const_fx = hHrtfStatistics->average_energy_l; + params.pHrtf_avg_pwr_response_r_const_fx = hHrtfStatistics->average_energy_r; + params.pHrtf_inter_aural_coherence_const_fx = hHrtfStatistics->inter_aural_coherence; #else IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) { @@ -1749,8 +1749,10 @@ ivas_error ivas_reverb_open_fx( { return error; } +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES free( pDsr_e ); free( pRt60_e ); +#endif *hReverb = pState; return error; diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 53d4cf355..6c055ab2a 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -308,6 +308,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; #endif float input_fc[FFT_SPECTRUM_SIZE]; + float output_fc[CLDFB_NO_CHANNELS_MAX]; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif @@ -326,10 +327,15 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( } #endif +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + ivas_reverb_interpolate_acoustic_data( avg_pwr_len, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right ); +#else + if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) { return error; } + Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); Word32 *avg_pwr_left_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); Word32 *avg_pwr_right_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); @@ -352,9 +358,6 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( output_fc_fx[i] = (Word32) input_fc[i] * ONE_IN_Q16; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - ivas_reverb_interpolate_acoustic_data( avg_pwr_len, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right ); -#else ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_left_fft_fx, avg_pwr_right_fft_fx, CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); for ( int i = 0; i < 257; i++ ) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index e10e49870..c34eaf220 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -722,7 +722,9 @@ static ivas_error load_reverb_from_binary( char *hrtf_data; #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB int16_t lr_iac_len; +#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; +#endif #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( hHrtfStatistics == NULL ) @@ -799,9 +801,10 @@ static ivas_error load_reverb_from_binary( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES hHrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); hHrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); - hHrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32) ); + hHrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + float *hrtf_prop_local = (float *) malloc( lr_iac_len * sizeof( float ) ); - if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_r_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL ) + if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_r_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL || hrtf_prop_local == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } @@ -809,17 +812,17 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->average_energy_r = hHrtfStatistics->average_energy_r_dyn; hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; - fread( hHrtfStatistics->average_energy_l_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hHrtfStatistics->average_energy_l_dyn, hHrtfStatistics->average_energy_l, Q27, lr_iac_len ); - - fread( hHrtfStatistics->average_energy_r_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hHrtfStatistics->average_energy_r_dyn, hHrtfStatistics->average_energy_r, Q27, lr_iac_len ); + fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_l, Q27, lr_iac_len ); - fread( hHrtfStatistics->inter_aural_coherence_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hHrtfStatistics->inter_aural_coherence_dyn, hHrtfStatistics->inter_aural_coherence, Q23, lr_iac_len ); + fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_r, Q27, lr_iac_len ); + fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->inter_aural_coherence, Q23, lr_iac_len ); hHrtfStatistics->fromROM = FALSE; + free( hrtf_prop_local ); #else /* left/right energy and interaural coherence for late reverb */ FOR( i = 0; i < 3; i++ ) @@ -1168,7 +1171,6 @@ void destroy_td_hrtf( { free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); } -#endif } #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB else @@ -1182,6 +1184,9 @@ void destroy_td_hrtf( } } #endif +#else + } +#endif ivas_HRTF_binary_close_fx( hHrtf ); @@ -1317,12 +1322,12 @@ static ivas_error create_HRTF_from_rawdata( hrtf_data_rptr += sizeof( float ); } #else - for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) - { - //( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); - hrtf_data_rptr += sizeof( float ); - } + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + //( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); + ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); + hrtf_data_rptr += sizeof( float ); + } #endif /* max_total_num_fsamp_per_iteration */ max_total_num_fsamp_per_iteration = *( (UWord16 *) ( hrtf_data_rptr ) ); @@ -1470,7 +1475,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES HRTF_READER_RENDERER_TYPE rend_type, /* i : Renderer type */ #else - RENDERER_TYPE rend_type, /* i : Renderer type */ + RENDERER_TYPE rend_type, /* i : Renderer type */ #endif BINAURAL_INPUT_AUDIO_CONFIG input_cfg /* i : Input binaural config */ ) @@ -1507,7 +1512,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "renderer type not compliant" ); } #else - ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, rend_type, ( *hHRTF )->allocate_init_flag ); + ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, rend_type, ( *hHRTF )->allocate_init_flag ); #endif hrtf_data_rptr = hrtf_data; @@ -1525,7 +1530,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #else - if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #endif { f_tmp = *( (float *) ( hrtf_data_rptr ) ); @@ -1591,7 +1596,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #endif { /* HRIR_HOA3 */ @@ -1658,7 +1663,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) #endif { /* HRIR_HOA2 */ @@ -1726,7 +1731,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) #endif { /* HRIR_FOA */ @@ -1795,7 +1800,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #endif { f_tmp = *( (float *) ( hrtf_data_rptr ) ); @@ -1877,13 +1882,13 @@ static ivas_error create_fastconv_HRTF_from_rawdata( hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #else - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #endif } @@ -1943,7 +1948,7 @@ ivas_error load_fastconv_HRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) ) #else - if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) #endif { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) @@ -2117,7 +2122,7 @@ ivas_error load_parambin_HRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ #else - if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ + if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ #endif { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) @@ -2211,7 +2216,7 @@ ivas_error create_SetOfHRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV ) #else - if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) + if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) #endif { if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) @@ -2234,7 +2239,7 @@ ivas_error create_SetOfHRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM ) #else - else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) #endif { if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) @@ -2394,7 +2399,6 @@ void destroy_hrtf_statistics( { free( ( *hHrtfStatistics )->inter_aural_coherence_dyn ); } - } ivas_HRTF_statistics_close( hHrtfStatistics ); } -- GitLab From e9f84b0b944f2405c3c498c6393ef8a053e4fe13 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 26 May 2025 13:54:32 +0200 Subject: [PATCH 0714/1310] Remove wrong change. --- lib_dec/er_dec_acelp_fx.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index 3ffbcd139..5f75b21bf 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -1061,10 +1061,8 @@ void con_acelp_fx( move16(); } set16_fx( &hHQ_core->old_out_LB_fx[( W1 + n )], 0, n ); -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT hHQ_core->Q_old_wtda = hHQ_core->Q_old_wtda_LB; move16(); -#endif FOR( i = 0; i < W2; i++ ) { -- GitLab From e972f4265c8e015240a303ccb29c589f52e69a87 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Mon, 26 May 2025 14:01:48 +0200 Subject: [PATCH 0715/1310] Corrected function names per fixed point --- apps/decoder.c | 2 - lib_rend/ivas_reverb_filter_design_fx.c | 2 +- lib_rend/ivas_reverb_fx.c | 4 +- lib_rend/ivas_reverb_utils_fx.c | 2 +- lib_rend/lib_rend.c | 58 ++++++------------------- 5 files changed, 18 insertions(+), 50 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 3f30f4520..cdd5e3096 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -743,7 +743,6 @@ int main( } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES -#ifdef NONBE_FIX_BINARY_BINAURAL_READING if ( ( error = IVAS_DEC_GetHrtfStatisticsHandle( hIvasDec, &hHrtfStatistics ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -768,7 +767,6 @@ int main( goto cleanup; } #endif -#endif #endif } diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index ba6a53c7a..0e4252655 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -839,7 +839,7 @@ void ivas_reverb_calc_color_levels_fx( } /*-------------------------------------------------------------------* - * ivas_reverb_interpolate_acoustic_data() + * ivas_reverb_interpolate_acoustic_data_fx() * * Interpolates data from the input T60 and DSR tables to the FFT pFilter uniform grid * Note: the fc frequencies both for the input and the output must be in the ascending order diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 9d71653fe..44add03bd 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1257,7 +1257,7 @@ static void set_fft_and_datablock_sizes_fx( } /*-----------------------------------------------------------------------------------------* - * Function set_reverb_acoustic_data() + * Function set_reverb_acoustic_data_fx() * * Sets reverb acoustic data (room acoustics and HRTF), interpolating it to the filter grid *-----------------------------------------------------------------------------------------*/ @@ -1557,7 +1557,7 @@ ivas_error ivas_reverb_open_fx( test(); #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - set_reverb_acoustic_data( ¶ms, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter ); + set_reverb_acoustic_data_fx( ¶ms, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter ); params.pHrtf_avg_pwr_response_l_const_fx = hHrtfStatistics->average_energy_l; params.pHrtf_avg_pwr_response_r_const_fx = hHrtfStatistics->average_energy_r; params.pHrtf_inter_aural_coherence_const_fx = hHrtfStatistics->inter_aural_coherence; diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 6c055ab2a..15fb2ee25 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -328,7 +328,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #endif #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - ivas_reverb_interpolate_acoustic_data( avg_pwr_len, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right ); + ivas_reverb_interpolate_acoustic_data_fx( avg_pwr_len, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right ); #else if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 09894c319..63b13e67b 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1638,7 +1638,7 @@ static ivas_error setRendInputActiveIsm( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ) IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ) IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) #endif @@ -2679,7 +2679,7 @@ static ivas_error initMcBinauralRendering( IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb == NULL ) { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open( &( inputMc->hReverb ), hHrtfStatistics, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), hHrtfStatistics, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) #endif @@ -2936,10 +2936,7 @@ static ivas_error setRendInputActiveMc( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) #else - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, - hrtfs->hSetOfHRTF, - FALSE ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -4326,10 +4323,11 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) -#endif +#else + IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -5160,25 +5158,11 @@ ivas_error IVAS_REND_SetHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], - hIvasRend->inputsMc[i].base.inConfig, - hIvasRend->outputConfig, - hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, - TRUE ) ), - IVAS_ERR_OK ) ) #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], - hIvasRend->inputsMc[i].base.inConfig, - hIvasRend->outputConfig, - hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, - hIvasRend->hHrtfs.hHrtfStatistics, - TRUE ) ), - IVAS_ERR_OK ) ) -#endif - + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, TRUE ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -5282,25 +5266,11 @@ ivas_error IVAS_REND_DisableHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], - hIvasRend->inputsMc[i].base.inConfig, - hIvasRend->outputConfig, - hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, - TRUE ) ), - IVAS_ERR_OK ) ) #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], - hIvasRend->inputsMc[i].base.inConfig, - hIvasRend->outputConfig, - hIvasRend->hRendererConfig, - hIvasRend->hHrtfs.hSetOfHRTF, - hIvasRend->hHrtfs.hHrtfStatistics, - TRUE ) ), - IVAS_ERR_OK ) ) -#endif - - + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ), IVAS_ERR_OK ) ) +#else + IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, TRUE ) ), IVAS_ERR_OK ) ) +#endif { return error; -- GitLab From 9eec50d7c0171bd3c607af72efc172b4e94d1208 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:58:52 +0200 Subject: [PATCH 0716/1310] [cleanup] accept FIX_963_USAN_ERROR --- lib_com/options.h | 1 - lib_enc/ivas_stereo_dft_enc_itd_fx.c | 21 --------------------- 2 files changed, 22 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 94d22ec45..2a90fa944 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -93,7 +93,6 @@ #define FIX_1372_ISAR_POST_REND #endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ -#define FIX_963_USAN_ERROR /* Eri: Issue 963: USAN error in Stereo CNG, division by zero */ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c index fabc35985..4e030ba01 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c @@ -1662,7 +1662,6 @@ void stereo_dft_enc_compute_itd_fx( move16(); } // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); -#ifdef FIX_963_USAN_ERROR IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) == 0 ) { cng_xcorr_filt = CORR_FILT_Q31; @@ -1675,11 +1674,6 @@ void stereo_dft_enc_compute_itd_fx( cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 } -#else - cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); - cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 - cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 -#endif hStereoDft->currentNumUpdates = add( hStereoDft->currentNumUpdates, 1 ); move16(); FOR( i = 1; i < NFFT / 4; i++ ) @@ -1735,7 +1729,6 @@ void stereo_dft_enc_compute_itd_fx( { /* expectedNumUpdates updated after call to dtx() in SID frames */ // cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L ); -#ifdef FIX_963_USAN_ERROR IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) == 0 ) { cng_xcorr_filt = CORR_FILT_Q31; @@ -1748,20 +1741,6 @@ void stereo_dft_enc_compute_itd_fx( cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 } -#else - IF( add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ) != 0 ) - { - cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); - cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 - cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 - } - ELSE - { - cng_xcorr_filt = CORR_FILT_Q31; - move32(); - cng_xcorr_filt = L_max( cng_xcorr_filt, sfm_L ); // Q31 - } -#endif hStereoDft->currentNumUpdates = add( hStereoDft->currentNumUpdates, 1 ); move16(); hStereoDft->sfm_fx = cng_xcorr_filt; -- GitLab From c0f2ff2e49237af9a2d9d99275438b8c2c4453a8 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:58:58 +0200 Subject: [PATCH 0717/1310] [cleanup] accept FIX_ACCESS_WITHIN_NULL_STRUCT_MC_BW_SWITCHING --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2a90fa944..b3e558742 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -116,7 +116,6 @@ #define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ -#define FIX_ACCESS_WITHIN_NULL_STRUCT_MC_BW_SWITCHING /* FhG: fix usan error in MCT with bw swicthing */ #define NONBE_FIX_986_MC_BW_SWITCHING /* FhG: fix crash in bw and br switching with MC */ #define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ -- GitLab From d27a73343d69df3efd1f66cb5e05fee2b0c47294 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:59:01 +0200 Subject: [PATCH 0718/1310] [cleanup] accept FIX_983_DISC_ISM_DIGEST_NUM_OBJS --- lib_com/options.h | 1 - lib_dec/ivas_ism_param_dec_fx.c | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b3e558742..bd1b075e4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -111,7 +111,6 @@ #define NONBE_FIX_951_MCMASA_5MS_RENDERING /* Nokia: issue #951: Differences for 5ms and 20ms rendering for McMASA at 13.2 kbps to BINAURAL */ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ -#define FIX_983_DISC_ISM_DIGEST_NUM_OBJS /* FhG: issue #983: the discrete ISM digest function uses the wrong number of objects */ #define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index 1485c09c1..5552b3dc2 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -939,11 +939,7 @@ void ivas_ism_dec_digest_tc_fx( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_STEREO ) || ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) { -#ifdef FIX_983_DISC_ISM_DIGEST_NUM_OBJS int16_t i; -#else - int16_t i, num_objects; -#endif Word32 azimuth_fx, elevation_fx; /* we have a full frame interpolator, adapt it */ @@ -985,13 +981,7 @@ void ivas_ism_dec_digest_tc_fx( } /* also get the gains here */ -#ifdef FIX_983_DISC_ISM_DIGEST_NUM_OBJS FOR( i = 0; i < st_ivas->nchan_ism; i++ ) -#else - num_objects = st_ivas->nchan_transport; - move16(); - FOR( i = 0; i < num_objects; i++ ) -#endif { Copy32( st_ivas->hIsmRendererData->gains_fx[i], st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); -- GitLab From 2a5711eaff11d6f8618ce466e9d30ec6bfca31e3 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:59:07 +0200 Subject: [PATCH 0719/1310] [cleanup] accept NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN --- lib_com/options.h | 1 - lib_dec/ivas_sba_dec_fx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index bd1b075e4..39eca1ba5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -112,7 +112,6 @@ #define NONBE_FIX_951_MCMASA_5MS_RENDERING /* Nokia: issue #951: Differences for 5ms and 20ms rendering for McMASA at 13.2 kbps to BINAURAL */ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ -#define NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN /* FhG : issue #974: usan in mono and stereo output in OSBA JBM RS */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #define NONBE_FIX_986_MC_BW_SWITCHING /* FhG: fix crash in bw and br switching with MC */ diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index 86cd641c0..5fed861dc 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -282,11 +282,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( } /* save old */ -#ifdef NONBE_FIX_974_OSBA_JBM_MONO_RS_USAN IF( NE_16( ism_mode_old, ISM_SBA_MODE_DISC ) && NE_16( st_ivas->hTcBuffer->tc_buffer_mode, TC_BUFFER_MODE_BUFFER ) ) -#else - IF( NE_16( ism_mode_old, ISM_SBA_MODE_DISC ) ) -#endif { test(); IF( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) -- GitLab From 744a16aa78da8edc0148f9fce9516c1c4d417135 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:59:11 +0200 Subject: [PATCH 0720/1310] [cleanup] accept NONBE_FIX_973_HODIRAC_BAND_GROUPING --- lib_com/ivas_dirac_com_fx.c | 7 ------- lib_com/options.h | 1 - 2 files changed, 8 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index c3ba55b50..a5fd4821b 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -578,14 +578,7 @@ ivas_error ivas_dirac_sba_config_fx( { hQMetaData->useLowerBandRes = 0; move16(); -#ifndef NONBE_FIX_973_HODIRAC_BAND_GROUPING - IF( hodirac_flag == 0 ) - { - nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */ - } -#else nbands_coded = sub( nbands, 1 ); /* always combine the last two bands */ -#endif } { diff --git a/lib_com/options.h b/lib_com/options.h index 39eca1ba5..597eef4c0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -94,7 +94,6 @@ #endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ -#define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT -- GitLab From 8aa4644f1ca06aab23da7af6124c13f31e8399d2 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:59:14 +0200 Subject: [PATCH 0721/1310] [cleanup] accept NONBE_FIX_951_MCMASA_5MS_RENDERING --- lib_com/ivas_prot_fx.h | 2 -- lib_com/options.h | 1 - lib_dec/fd_cng_dec_fx.c | 6 ------ lib_dec/ivas_dirac_dec_fx.c | 8 -------- lib_dec/ivas_sba_dec_fx.c | 4 ---- .../ivas_dirac_dec_binaural_functions_fx.c | 18 ------------------ 6 files changed, 39 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 4edcf0480..4f011abe8 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4995,9 +4995,7 @@ void generate_masking_noise_lb_dirac_fx( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered */ -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i : common spatial rendering parameters handle */ -#endif const Word16 cna_flag /* i : CNA flag for LB and HB */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 597eef4c0..03070046d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -108,7 +108,6 @@ #endif -#define NONBE_FIX_951_MCMASA_5MS_RENDERING /* Nokia: issue #951: Differences for 5ms and 20ms rendering for McMASA at 13.2 kbps to BINAURAL */ #define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 6d73aa28c..bf82854fd 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -5447,9 +5447,7 @@ void generate_masking_noise_lb_dirac_fx( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA Q11*/ const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered Q0*/ -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i : common spatial rendering parameters handle */ -#endif const Word16 cna_flag /* i : CNA flag for LB and HB Q0*/ ) { @@ -5501,12 +5499,10 @@ void generate_masking_noise_lb_dirac_fx( test(); IF( cna_flag && tdBuffer != NULL ) { -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING Word16 cur_subframe; Word16 cur_subframe_start_outfs; Word16 cur_subframe_start_cngfs; Word16 slot_size_cng; -#endif WHILE( n_samples_out > 0 ) { @@ -5580,7 +5576,6 @@ void generate_masking_noise_lb_dirac_fx( n_samples_start = add( n_samples_start, hFdCngCom->frameSize ); } -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING /* move generated noise to the 5ms subframe starts in the tc buffer according to the output sampling frequency to avoid overwriting it with the synthesis in case of shared tc and synth channel memory, i.e. non-TSM mode */ slot_size_cng = shr( hFdCngCom->frameSize, 4 /* DEFAULT_JBM_CLDFB_TIMESLOTS */ ); @@ -5602,7 +5597,6 @@ void generate_masking_noise_lb_dirac_fx( /* set everything else to zero */ set_zero_fx( tdBuffer + cur_subframe_start_outfs + move_size, sub( subframe_size_outfs, move_size ) ); } -#endif } pop_wmops(); diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index feca814c8..cda02a24a 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2871,18 +2871,10 @@ void ivas_dirac_dec_render_sf_fx( test(); generate_masking_noise_dirac_ivas_fx( st->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING &st_ivas->hTcBuffer->tc_fx[1][hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->slots_rendered], -#else - st_ivas->hTcBuffer->tc_fx[1], -#endif Cldfb_RealBuffer_fx[1][0], Cldfb_ImagBuffer_fx[1][0], -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING slot_idx, -#else - index_slot, -#endif st->cna_dirac_flag && st->flag_cna, ( ( ( st->core_brate == FRAME_NO_DATA ) || EQ_32( st->core_brate, SID_2k40 ) ) ) && EQ_16( st->cng_type, FD_CNG ) && st->cng_sba_flag, Q_input, &q_temp_cldfb ); Scale_sig32( Cldfb_RealBuffer_fx[1][0], CLDFB_NO_CHANNELS_MAX, sub( Q6, q_temp_cldfb ) ); // Q6 diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index 5fed861dc..121b8a795 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -886,11 +886,7 @@ void ivas_sba_dec_digest_tc_fx( Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; Scale_sig( st->hFdCngDec->hFdCngCom->A_cng, M + 1, sub( norm_s( sub( st->hFdCngDec->hFdCngCom->A_cng[0], 1 ) ), 2 ) ); /*Q12 -> Q13*/ -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING generate_masking_noise_lb_dirac_fx( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st_ivas->hSpatParamRendCom, st->cna_dirac_flag && st->flag_cna ); -#else - generate_masking_noise_lb_dirac_fx( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc_fx[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); -#endif } return; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 3f24bfd85..1545ecd0c 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -830,29 +830,15 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { Word16 numCoreBands, b; -#ifndef NONBE_FIX_951_MCMASA_5MS_RENDERING - Word16 slotInFrame; -#endif numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; move16(); -#ifndef NONBE_FIX_951_MCMASA_5MS_RENDERING - slotInFrame = add( hSpatParamRendCom->slots_rendered, slot ); -#endif generate_masking_noise_dirac_ivas_fx( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING &st_ivas->hTcBuffer->tc_fx[nchan_transport][hSpatParamRendCom->num_freq_bands * hSpatParamRendCom->slots_rendered], -#else - st_ivas->hTcBuffer->tc_fx[nchan_transport], -#endif Cldfb_RealBuffer_in_fx[2][slot], Cldfb_ImagBuffer_in_fx[2][slot], -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING slot, -#else - slotInFrame, -#endif st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, 11, &q_cldfb[2][slot] ); @@ -861,11 +847,7 @@ static void ivas_dirac_dec_binaural_internal_fx( st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ NULL, Cldfb_RealBuffer_in_fx[1][slot], Cldfb_ImagBuffer_in_fx[1][slot], -#ifdef NONBE_FIX_951_MCMASA_5MS_RENDERING slot, -#else - slotInFrame, -#endif st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag, 0, &q_cldfb[1][slot] ); -- GitLab From db41d47daf4c9ef54bcb8302b8edff6cd5bbf49c Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:59:17 +0200 Subject: [PATCH 0722/1310] [cleanup] accept NONBE_FIX_979_OSBA_STEREO_5MS --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 4 ---- lib_dec/ivas_osba_dec_fx.c | 8 -------- lib_rend/ivas_output_init.c | 2 -- 4 files changed, 15 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 03070046d..6e1a7dffe 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -108,7 +108,6 @@ #endif -#define NONBE_FIX_979_OSBA_STEREO_5MS /* FhG : issue #979 : 5ms and 20ms output different for OSBA and stereo */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 5afbc3acb..e80e24226 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1893,11 +1893,7 @@ ivas_error ivas_jbm_dec_render_fx( { FOR( n = 0; n < st_ivas->hTcBuffer->nchan_buffer_full; n++ ) { -#ifdef NONBE_FIX_979_OSBA_STEREO_5MS p_tc_fx[n] = &p_output_fx[n][st_ivas->hTcBuffer->n_samples_rendered]; -#else - p_tc_fx[n] = p_output_fx[n]; -#endif } FOR( n = 0; n < MAX_TRANSPORT_CHANNELS + MAX_NUM_OBJECTS; n++ ) diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c index 8445d96a3..87805290b 100644 --- a/lib_dec/ivas_osba_dec_fx.c +++ b/lib_dec/ivas_osba_dec_fx.c @@ -297,23 +297,15 @@ ivas_error ivas_osba_render_sf_fx( p_output_ism[n] = &output_ism[n][0]; } -#ifdef NONBE_FIX_979_OSBA_STEREO_5MS if ( !st_ivas->hDecoderConfig->Opt_tsm ) { int16_t tc_offset; tc_offset = st_ivas->hTcBuffer->n_samples_rendered; -#endif for ( n = 0; n < st_ivas->nchan_ism; n++ ) { -#ifdef NONBE_FIX_979_OSBA_STEREO_5MS v_shr( &p_output[n][tc_offset], Q11 - Q11, &output_ism[n][tc_offset], nSamplesAsked ); // Q11 -#else - v_shr( p_output[n], Q11 - Q11, output_ism[n], nSamplesAsked ); // Q11 -#endif } -#ifdef NONBE_FIX_979_OSBA_STEREO_5MS } -#endif IF( NE_32( ( error = ivas_sba_dec_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailableNext, p_output ) ), IVAS_ERR_OK ) ) { diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index ed51fbdd2..816193253 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -386,12 +386,10 @@ Word16 ivas_get_nchan_buffers_dec( { nchan_out_buff = shl( CPE_CHANNELS, 1 ); } -#ifdef NONBE_FIX_979_OSBA_STEREO_5MS else if ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { nchan_out_buff = s_max( nchan_out_buff, add( shl( BINAURAL_CHANNELS, 1 ), 2 ) ); } -#endif ELSE IF( NE_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { nchan_out_buff = s_max( nchan_out_buff, audioCfg2channels( st_ivas->intern_config ) ); -- GitLab From bdb1439758fde7b38355ee020a0039b6a65e180c Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:59:20 +0200 Subject: [PATCH 0723/1310] [cleanup] accept NONBE_FIX_986_MC_BW_SWITCHING --- lib_com/options.h | 1 - lib_enc/bw_detect_fx.c | 18 ------------------ lib_enc/ivas_cpe_enc_fx.c | 4 ---- lib_enc/ivas_mct_enc_fx.c | 23 ----------------------- 4 files changed, 46 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6e1a7dffe..5c6c344f0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -111,7 +111,6 @@ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ -#define NONBE_FIX_986_MC_BW_SWITCHING /* FhG: fix crash in bw and br switching with MC */ #define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index eefd5057c..c79931e45 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -1140,7 +1140,6 @@ Word16 set_bw_mct_fx( bw_changed = 0; move16(); -#ifdef NONBE_FIX_986_MC_BW_SWITCHING IF( NE_16( mct_bwidth, last_mct_bwidth ) ) { bw_changed = 1; @@ -1161,22 +1160,5 @@ Word16 set_bw_mct_fx( move16(); } } -#else - IF( NE_16( mct_bwidth, last_mct_bwidth ) ) - { - bw_changed = 1; - move16(); - - FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) - { - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = hCPE[cpe_id]->hCoreCoder[ch]; - st->bwidth = mct_bwidth; - move16(); - } - } - } -#endif return bw_changed; } diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index f6885dd81..849c7d7d5 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -1019,7 +1019,6 @@ ivas_error ivas_cpe_enc_fx( IF( ( NE_32( hCPE->last_element_brate, hCPE->element_brate ) || NE_16( hCPE->element_mode, hCPE->last_element_mode ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( sts[0]->bits_frame_nominal, last_bits_frame_nominal ) ) || NE_16( sts[n]->last_bwidth, sts[n]->bwidth ) ) && ( n == 0 || EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) ) { Word16 igf; -#ifdef NONBE_FIX_986_MC_BW_SWITCHING Word16 bw; /* float uses ternary operator for this: bw = ( hCPE->element_mode == IVAS_CPE_MDCT ) ? sts[n]->bwidth : sts[n]->max_bwidth; */ @@ -1029,9 +1028,6 @@ ivas_error ivas_cpe_enc_fx( bw = sts[n]->bwidth; } igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), bw, sts[n]->rf_mode ); /* Q0 */ -#else - igf = getIgfPresent_fx( sts[n]->element_mode, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->rf_mode ); /* Q0 */ -#endif IF( ( error = IGF_Reconfig_fx( &sts[n]->hIGFEnc, igf, 0, L_mult0( sts[n]->bits_frame_nominal, FRAMES_PER_SEC ), sts[n]->max_bwidth, sts[n]->element_mode, sts[n]->rf_mode ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_mct_enc_fx.c b/lib_enc/ivas_mct_enc_fx.c index 565b318f5..bb98e6163 100644 --- a/lib_enc/ivas_mct_enc_fx.c +++ b/lib_enc/ivas_mct_enc_fx.c @@ -183,9 +183,6 @@ ivas_error ivas_mct_enc_fx( Word32 orig_spectrum_long_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][L_FRAME48k]; Word16 switch_bw; IVAS_FORMAT ivas_format; -#ifndef NONBE_FIX_986_MC_BW_SWITCHING - Word16 max_bwidth; -#endif Word32 ivas_total_brate; ivas_error error; Word32 *pdata_fx[MAX_INPUT_CHANNELS]; @@ -200,9 +197,6 @@ ivas_error ivas_mct_enc_fx( hMCT->hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; /* pointer to write MCT side bits */ ivas_format = st_ivas->hEncoderConfig->ivas_format; -#ifndef NONBE_FIX_986_MC_BW_SWITCHING - max_bwidth = st_ivas->hEncoderConfig->max_bwidth; -#endif ivas_total_brate = st_ivas->hEncoderConfig->ivas_total_brate; move32(); move16(); @@ -252,7 +246,6 @@ ivas_error ivas_mct_enc_fx( cp_bitrate = L_shl( L_deposit_l( div_l( ivas_total_brate, st_ivas->nchan_transport ) ), 2 ); // a/b => div_l(a, b/2) or (2 * div_l(a, b)) } -#ifdef NONBE_FIX_986_MC_BW_SWITCHING IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) { FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) @@ -267,22 +260,6 @@ ivas_error ivas_mct_enc_fx( initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, st_ivas->hCPE[0]->hCoreCoder[0]->bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, NULL, 0 ); } } -#else - IF( st_ivas->hCPE[0]->hCoreCoder[0]->igf ) - { - FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) - { - initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, st_ivas->hCPE[0]->hCoreCoder[0]->hIGFEnc->igfData.igfInfo.grid, 0 ); - } - } - ELSE - { - FOR( n = 0; n < shr( hMCT->nchan_out_woLFE, 1 ); n++ ) - { - initMdctStereoEncData_fx( hMCT->hBlockData[n]->hStereoMdct, ivas_format, IVAS_CPE_MDCT, cp_bitrate, max_bwidth, st_ivas->hCPE[0]->hCoreCoder[0]->igf, NULL, 0 ); - } - } -#endif } /* set coded audio band-width */ -- GitLab From 236f13738816b416466ba5d0a879961809e3bd3a Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 15:59:23 +0200 Subject: [PATCH 0724/1310] [cleanup] accept NONBE_FIX_975_JBM_USAN --- lib_com/options.h | 1 - lib_dec/lib_dec_fx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5c6c344f0..34a9e4858 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -111,7 +111,6 @@ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ -#define NONBE_FIX_975_JBM_USAN /* FhG: Fix issue #975, USAN in JBM decoding ad 13.2kbps */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 9cf06bdfb..628256729 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2999,7 +2999,6 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( } -#ifdef NONBE_FIX_975_JBM_USAN partialCopyFrameType = 0; move16(); partialCopyOffset = 0; @@ -3007,12 +3006,9 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( IF( EQ_16( hIvasDec->mode, (Word16) IVAS_DEC_MODE_EVS ) ) { -#endif /* check if frame contains a partial copy and get its offset */ evs_dec_previewFrame( au, auSize, &partialCopyFrameType, &partialCopyOffset ); -#ifdef NONBE_FIX_975_JBM_USAN } -#endif /* create data unit for primary copy in the frame */ dataUnit = JB4_AllocDataUnit( hIvasDec->hVoIP->hJBM ); -- GitLab From 8a53dae7d59aa87876225556d9c68497113c9ca0 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 16:08:13 +0200 Subject: [PATCH 0725/1310] formatting --- lib_dec/fd_cng_dec_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index bf82854fd..e53c81209 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -5444,11 +5444,11 @@ void generate_stereo_masking_noise_fx( return; } void generate_masking_noise_lb_dirac_fx( - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA Q11*/ - const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered Q0*/ + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + Word32 *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA Q11*/ + const Word16 nCldfbTs, /* i : number of CLDFB slots that will be rendered Q0*/ SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i : common spatial rendering parameters handle */ - const Word16 cna_flag /* i : CNA flag for LB and HB Q0*/ + const Word16 cna_flag /* i : CNA flag for LB and HB Q0*/ ) { Word16 i; -- GitLab From 0825873d6c981cd46cfb3435d4785340932400cc Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 May 2025 16:47:06 +0200 Subject: [PATCH 0726/1310] port float MR 1433 --- lib_com/options.h | 1 + lib_dec/ivas_ism_renderer_fx.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 7b19fc92a..efff11d1b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,6 +135,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ +#define NONBE_FIX_1021_ISM_BRIR_RS_FLUSH /* FhG: issue #1021: fix ISM with JBM and RS renderer flushing*/ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index c3904d136..25e40ea63 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -189,6 +189,9 @@ void ivas_ism_render_sf_fx( last_sf = add( last_sf, 1 ); } +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + num_objects = st_ivas->nchan_ism; +#else num_objects = st_ivas->nchan_transport; move16(); if ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) @@ -196,6 +199,7 @@ void ivas_ism_render_sf_fx( num_objects = st_ivas->nchan_ism; move16(); } +#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; move16(); -- GitLab From 68a13f7959af3a58f05a9a847845ad00aa656aea Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Mon, 26 May 2025 17:23:38 +0200 Subject: [PATCH 0727/1310] fix formatting --- lib_dec/ivas_ism_renderer_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 25e40ea63..877ef8ed7 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -190,7 +190,7 @@ void ivas_ism_render_sf_fx( } #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH - num_objects = st_ivas->nchan_ism; + num_objects = st_ivas->nchan_ism; #else num_objects = st_ivas->nchan_transport; move16(); -- GitLab From 8bd18a6151695305858cbaed38b9359dadaf19be Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Mon, 26 May 2025 17:30:59 +0200 Subject: [PATCH 0728/1310] port FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI --- lib_com/options.h | 1 + lib_dec/dec_LPD_fx.c | 8 ++++++++ lib_dec/dec_tcx_fx.c | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 94d22ec45..a7ae61df3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,6 +135,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ +#define FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI /* FhG: move setting of pointers for parameter decoding so they are skipped in lost frames when they are not needed */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/dec_LPD_fx.c b/lib_dec/dec_LPD_fx.c index d5294eb7a..bfaacd2c6 100644 --- a/lib_dec/dec_LPD_fx.c +++ b/lib_dec/dec_LPD_fx.c @@ -721,12 +721,20 @@ void decoder_LPD_fx( FOR( k = 0; k < 2; k++ ) { +#ifndef FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI /* Set pointer to parameters */ prm = param + ( k * DEC_NPRM_DIV ); /* Stability Factor */ +#endif IF( bfi == 0 ) { +#ifdef FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI + /* Set pointer to parameters */ + prm = param + ( k * DEC_NPRM_DIV ); + + /* Stability Factor */ +#endif st->stab_fac_fx = lsf_stab_fx( &lsf[( ( k + 1 ) ) * M], &lsf[k * M], 0, L_FRAME ); move16(); } diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index af80ee1f5..9d8a6efd2 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3693,7 +3693,15 @@ void decoder_tcx_invQ_fx( tnsSize = 0; move16(); +#ifndef FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI prm_target = NULL; /* just to suppress MSVC warnigs */ +#else + /* just to suppress MSVC warnigs */ + prm_target = NULL; + prm_ltp = NULL; + prm_tns = NULL; + prm_sqQ = NULL; +#endif /*-----------------------------------------------------------------* * Initializations @@ -3717,8 +3725,10 @@ void decoder_tcx_invQ_fx( move16(); } +#ifndef FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI prm_ltp = &prm[1 + NOISE_FILL_RANGES]; prm_tns = prm_ltp + LTPSIZE; +#endif gainCompensate = ONE_IN_Q14; move16(); @@ -3734,6 +3744,10 @@ void decoder_tcx_invQ_fx( IF( !bfi ) { +#ifdef FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI + prm_ltp = &prm[1 + NOISE_FILL_RANGES]; + prm_tns = prm_ltp + LTPSIZE; +#endif index = prm[0]; move16(); @@ -3755,9 +3769,11 @@ void decoder_tcx_invQ_fx( move16(); } +#ifndef FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI prm_hm = prm_tns + tnsSize; prm_sqQ = prm_hm + NPRM_CTX_HM; *prm_sqQ1 = prm_sqQ; +#endif /*-----------------------------------------------------------* * Spectrum data * @@ -3765,6 +3781,11 @@ void decoder_tcx_invQ_fx( IF( !bfi ) { +#ifdef FIX_1038_OFFSET_TO_NULL_PTR_IN_EVS_TCX_BFI + prm_hm = prm_tns + tnsSize; + prm_sqQ = prm_hm + NPRM_CTX_HM; + *prm_sqQ1 = prm_sqQ; +#endif /*-----------------------------------------------------------* * Context HM * *-----------------------------------------------------------*/ -- GitLab From fcb912776046556313cd96c5e26b828fed633dfc Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Mon, 26 May 2025 14:58:39 -0400 Subject: [PATCH 0729/1310] possible fix to 1713, icBWE exp --- lib_com/options.h | 2 ++ lib_enc/ivas_stereo_icbwe_enc_fx.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 20a1dc555..0932d2434 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,4 +101,6 @@ #define TEST_HR #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ +#define FIX_1713_EXP /* VA: proposed correction to exp in ic-BWE*/ + #endif diff --git a/lib_enc/ivas_stereo_icbwe_enc_fx.c b/lib_enc/ivas_stereo_icbwe_enc_fx.c index eba30f762..706cac13f 100644 --- a/lib_enc/ivas_stereo_icbwe_enc_fx.c +++ b/lib_enc/ivas_stereo_icbwe_enc_fx.c @@ -828,7 +828,11 @@ void stereo_icBWE_enc_ivas_fx( ELSE { +#ifndef FIX_1713_EXP max_e = s_max( hStereoICBWE->mem_shb_speech_nonref_e, shb_speech_nonref_e ); +#else + max_e = s_max( hStereoICBWE->mem_shb_speech_ref_e, shb_speech_ref_e ); +#endif Copy_Scale_sig( hStereoICBWE->mem_shb_speech_ref_fx, hStereoICBWE->mem_shb_speech_ref_fx, L_LOOK_16k, negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ) ); // mem_shb_speech_ref_e set32_fx( shb_frame_ref_fx, 0, L_LOOK_16k + L_FRAME16k ); @@ -854,8 +858,11 @@ void stereo_icBWE_enc_ivas_fx( /* shb_frame_ref_ICBWE @ (8.75 - shb_speech_delay (=1.25) ms) after shb_speech */ Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ +#ifndef FIX_1713_EXP Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e - +#else + Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e +#endif /* core switching reset */ test(); -- GitLab From ae6c1839a8830c6d8eabd56e8c359399c01400dd Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Mon, 26 May 2025 15:03:08 -0400 Subject: [PATCH 0730/1310] clang format --- lib_enc/ivas_stereo_icbwe_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_icbwe_enc_fx.c b/lib_enc/ivas_stereo_icbwe_enc_fx.c index 706cac13f..95c49aeae 100644 --- a/lib_enc/ivas_stereo_icbwe_enc_fx.c +++ b/lib_enc/ivas_stereo_icbwe_enc_fx.c @@ -857,7 +857,7 @@ void stereo_icBWE_enc_ivas_fx( move16(); /* shb_frame_ref_ICBWE @ (8.75 - shb_speech_delay (=1.25) ms) after shb_speech */ - Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ + Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ #ifndef FIX_1713_EXP Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e #else -- GitLab From 154655090009ce7b37fb71734c27c5d5e4e1f8e6 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 27 May 2025 10:27:03 +0200 Subject: [PATCH 0731/1310] port float MR 1498 --- lib_com/options.h | 5 +++-- lib_dec/waveadjust_fec_dec_fx.c | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 34a9e4858..caad90fb8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -123,9 +123,10 @@ #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #endif #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ -#define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ -#define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ +#define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ +#define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ +#define NON_BE_FIX_EVS_USAN_ERR_IN_WAVEADJUST /* FhG: address issue 1037 */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/waveadjust_fec_dec_fx.c b/lib_dec/waveadjust_fec_dec_fx.c index 75a514cc2..42b297903 100644 --- a/lib_dec/waveadjust_fec_dec_fx.c +++ b/lib_dec/waveadjust_fec_dec_fx.c @@ -930,8 +930,23 @@ void concealment_decode_fix( /* sign randomization */ FOR( i = 0; i < N; i++ ) { +#ifdef NON_BE_FIX_EVS_USAN_ERR_IN_WAVEADJUST + Word16 rnd; + rnd = own_random_fix( seed ); + IF ( GE_16(rnd,0) ) + { + sign = 1; + move16(); + } + ELSE IF( LT_16(rnd, 0) ) + { + sign = -1; + move16(); + } +#else sign = add( shl( shr( own_random_fix( seed ), 15 ), 1 ), 1 ); - if ( EQ_16( sign, -1 ) ) +#endif + if ( EQ_16( sign, -1 ) ) { invkoef[i] = L_negate( invkoef[i] ); move32(); -- GitLab From 9c78c2e9d4eb5b001f11495a6b96faac63d3df27 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 27 May 2025 10:27:39 +0200 Subject: [PATCH 0732/1310] fix formatting --- lib_dec/waveadjust_fec_dec_fx.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib_dec/waveadjust_fec_dec_fx.c b/lib_dec/waveadjust_fec_dec_fx.c index 42b297903..0e5898d64 100644 --- a/lib_dec/waveadjust_fec_dec_fx.c +++ b/lib_dec/waveadjust_fec_dec_fx.c @@ -931,22 +931,22 @@ void concealment_decode_fix( FOR( i = 0; i < N; i++ ) { #ifdef NON_BE_FIX_EVS_USAN_ERR_IN_WAVEADJUST - Word16 rnd; - rnd = own_random_fix( seed ); - IF ( GE_16(rnd,0) ) - { - sign = 1; - move16(); - } - ELSE IF( LT_16(rnd, 0) ) - { - sign = -1; - move16(); - } + Word16 rnd; + rnd = own_random_fix( seed ); + IF( GE_16( rnd, 0 ) ) + { + sign = 1; + move16(); + } + ELSE IF( LT_16( rnd, 0 ) ) + { + sign = -1; + move16(); + } #else sign = add( shl( shr( own_random_fix( seed ), 15 ), 1 ), 1 ); #endif - if ( EQ_16( sign, -1 ) ) + if ( EQ_16( sign, -1 ) ) { invkoef[i] = L_negate( invkoef[i] ); move32(); -- GitLab From 3d0146a0395fb64d526a477e9979ffa223b757d4 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 27 May 2025 10:29:21 +0200 Subject: [PATCH 0733/1310] [cleanup] accept NONBE_FIX_947_STEREO_DMX_EVS_POC --- lib_com/options.h | 3 --- lib_enc/ivas_rom_enc.h | 6 ----- lib_enc/ivas_rom_enc_fx.c | 24 ----------------- lib_enc/ivas_stereo_dmx_evs_fx.c | 46 -------------------------------- 4 files changed, 79 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b4e512c2e..0815b6edd 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,10 +114,7 @@ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ -#define NONBE_FIX_947_STEREO_DMX_EVS_POC /* Orange: Fix clicks on POC */ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ -#endif #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index bc62b251a..465eb29e9 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -111,7 +111,6 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2]; @@ -121,11 +120,6 @@ extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1]; extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1]; #endif -#else -extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4]; -extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4]; -extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4]; -#endif extern const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k]; extern const Word32 Stereo_dmx_wnd_coef_48k_fx[L_FRAME48k]; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_rom_enc_fx.c b/lib_enc/ivas_rom_enc_fx.c index 520dbe928..8533d1538 100644 --- a/lib_enc/ivas_rom_enc_fx.c +++ b/lib_enc/ivas_rom_enc_fx.c @@ -509,7 +509,6 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT // Q31 @@ -677,29 +676,6 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q }; #endif -#else -// Q31 -const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4] = { - 3309988, 29667578, 81733728, 158226416, 257262128, 376402368, 512713184, 662838656, 823081792, 989497088, - 1157986560, 1324401920, 1484645120, 1634770560, 1771081600, 1890221568, 1989257344, 2065750016, 2117816064, 2144173568 -}; -// Q31 -const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4] = { - 827816, 7442688, 20631648, 40313376, 66366540, 98630536, 136906352, 180958112, 230514208, 285269056, - 344885056, 408994752, 477202848, 549088896, 624209472, 702101440, 782284928, 864265344, 947537088, 1031587008, - 1115896832, 1199946752, 1283218432, 1365198592, 1445382400, 1523274368, 1598395136, 1670280960, 1738488832, 1802598528, - 1862214528, 1916969472, 1966525568, 2010577280, 2048853120, 2081117056, 2107170304, 2126851968, 2140040960, 2146655872 -}; -// Q31 -const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 4] = { - 367944, 3309988, 9186011, 17979908, 29667578, 44216976, 61588232, 81733728, 104598264, 130119136, - 158226416, 188843056, 221885136, 257262128, 294876992, 334626720, 376402368, 420089216, 465567840, 512713184, - 561396544, 611484032, 662838656, 715319488, 768782656, 823081792, 878067904, 933590528, 989497088, 1045634688, - 1101849216, 1157986560, 1213893504, 1269415808, 1324401920, 1378700928, 1432164224, 1484645120, 1535999488, 1586087424, - 1634770560, 1681915904, 1727394560, 1771081600, 1812856960, 1852606720, 1890221568, 1925598592, 1958640640, 1989257344, - 2017364480, 2042885504, 2065750016, 2085895424, 2103266688, 2117816064, 2129503616, 2138297728, 2144173568, 2147115776 -}; -#endif // Q31 const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k] = { diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 0c54e0d07..70605040d 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -1987,7 +1987,6 @@ static void weighted_ave_fx( const Word32 wnd_fx[] /* i : window coef Q31 */ ) { -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT Word16 i, j, len, len2; @@ -2035,26 +2034,6 @@ static void weighted_ave_fx( } #endif -#else - - Word16 i, len; - Word32 gain_tmp_fx = 0, gain_sub_fx; - move32(); - len = shr( input_frame, 4 ); - gain_sub_fx = L_sub( gain_fx, old_gain_fx ); - FOR( i = 0; i < len; i++ ) - { - gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 - dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 - move32(); - } - FOR( ; i < input_frame; i++ ) - { - dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 - move32(); - } - -#endif return; } @@ -2246,7 +2225,6 @@ static void adapt_gain_fx( const Word32 wnd_fx[] /* i : window coef Q31 */ ) { -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC #ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT Word16 i, j, len, len2; @@ -2298,30 +2276,6 @@ static void adapt_gain_fx( } #endif -#else - - Word16 i, len; - Word32 gain_tmp_fx, gain_sub_fx; - - len = shr( input_frame, 4 ); - - // gain_sub = gain - old_gain; - gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 - - FOR( i = 0; i < len; i++ ) - { - // gain_tmp = old_gain + gain_sub * wnd[i]; - gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 // dst[i] = src[i] * gain_tmp; - dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx ); // Q16 - move32(); - } - FOR( ; i < input_frame; i++ ) - { - // dst[i] = src[i] * gain; - dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16 - move32(); - } -#endif return; } -- GitLab From 73a2bb54cd190274733e57759737fef7f22d123a Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 27 May 2025 10:29:24 +0200 Subject: [PATCH 0734/1310] [cleanup] accept NONBE_FIX_947_STEREO_DMX_ROMOPT --- lib_com/options.h | 1 - lib_enc/ivas_rom_enc.h | 6 -- lib_enc/ivas_rom_enc_fx.c | 108 ------------------------------- lib_enc/ivas_stereo_dmx_evs_fx.c | 43 ------------ 4 files changed, 158 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0815b6edd..c89c3b750 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,7 +114,6 @@ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ -#define NONBE_FIX_947_STEREO_DMX_ROMOPT /* Orange: ROM optimisation for POC*/ #define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ #ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index 465eb29e9..d1e644a93 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -111,15 +111,9 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE] /*----------------------------------------------------------------------------------* * Stereo downmix to EVS ROM tables *----------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2]; extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2]; extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 2]; -#else -extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1]; -extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1]; -extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1]; -#endif extern const Word32 Stereo_dmx_wnd_coef_32k_fx[L_FRAME32k]; extern const Word32 Stereo_dmx_wnd_coef_48k_fx[L_FRAME48k]; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_rom_enc_fx.c b/lib_enc/ivas_rom_enc_fx.c index 8533d1538..793546c7a 100644 --- a/lib_enc/ivas_rom_enc_fx.c +++ b/lib_enc/ivas_rom_enc_fx.c @@ -510,7 +510,6 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q *----------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT // Q31 const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2] = { 204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, @@ -568,113 +567,6 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q 937357504, 944316544, 951281152, 958250944, 965225728, 972205056, 979188800, 986176512, 993168000, 1000162880, 1007160960, 1014161856, 1021165248, 1028170944, 1035178560, 1042187776, 1049198400, 1056210048, 1063222464, 1070235328 }; -#else -// Q31 - const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1] = { - 204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, - 24639688, 29301856, 34361688, 39817260, 45666492, 51907160, 58536884, 65553148, 72953272, 80734440, - 88893688, 97427912, 106333872, 115608160, 125247248, 135247472, 145605040, 156315968, 167376224, 178781552, - 190527648, 202610016, 215024064, 227765072, 240828160, 254208400, 267900656, 281899744, 296200320, 310796928, - 325684032, 340855968, 356306944, 372031072, 388022368, 404274752, 420782016, 437537920, 454536032, 471769920, - 489232992, 506918624, 524820096, 542930496, 561243072, 579750720, 598446528, 617323264, 636373760, 655590784, - 674967040, 694495104, 714167552, 733976960, 753915712, 773976192, 794150848, 814431936, 834811776, 855282624, - 875836544, 896465920, 917162752, 937919168, 958727360, 979579264, 1000467072, 1021382784, 1042318400, 1063266048, - 1084217599, 1105165183, 1126100863, 1147016575, 1167904383, 1188756351, 1209564415, 1230320895, 1251017727, 1271647103, - 1292201087, 1312671871, 1333051647, 1353332735, 1373507455, 1393567999, 1413506687, 1433316095, 1452988543, 1472516607, - 1491892863, 1511109887, 1530160383, 1549037183, 1567732863, 1586240511, 1604553087, 1622663551, 1640564991, 1658250623, - 1675713663, 1692947583, 1709945727, 1726701567, 1743208959, 1759461247, 1775452543, 1791176703, 1806627711, 1821799551, - 1836686719, 1851283327, 1865583871, 1879582975, 1893275263, 1906655487, 1919718527, 1932459519, 1944873599, 1956956031, - 1968702079, 1980107391, 1991167615, 2001878655, 2012236159, 2022236415, 2031875455, 2041149823, 2050055679, 2058589951, - 2066749183, 2074530431, 2081930495, 2088946815, 2095576447, 2101817215, 2107666431, 2113121919, 2118181759, 2122843903, - 2127106687, 2130968319, 2134427519, 2137482751, 2140132991, 2142377215, 2144214655, 2145644415, 2146666111, 2147279231 - }; - // Q31 - const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1] = { - 51423, 205686, 462776, 822667, 1285325, 1850705, 2518754, 3289407, 4162591, 5138222, - 6216206, 7396441, 8678813, 10063200, 11549468, 13137475, 14827070, 16618091, 18510366, 20503712, - 22597942, 24792852, 27088232, 29483864, 31979518, 34574956, 37269924, 40064172, 42957428, 45949412, - 49039844, 52228420, 55514844, 58898792, 62379948, 65957972, 69632528, 73403256, 77269800, 81231792, - 85288840, 89440576, 93686584, 98026464, 102459800, 106986176, 111605144, 116316264, 121119096, 126013168, - 130998016, 136073168, 141238128, 146492400, 151835488, 157266880, 162786064, 168392496, 174085632, 179864960, - 185729888, 191679888, 197714368, 203832752, 210034448, 216318896, 222685456, 229133536, 235662512, 242271760, - 248960656, 255728544, 262574784, 269498720, 276499680, 283577024, 290730048, 297958048, 305260384, 312636288, - 320085120, 327606144, 335198624, 342861856, 350595072, 358397568, 366268576, 374207360, 382213120, 390285152, - 398422624, 406624768, 414890848, 423220000, 431611456, 440064448, 448578112, 457151680, 465784288, 474475136, - 483223360, 492028160, 500888704, 509804096, 518773504, 527796064, 536870912, 545997184, 555174016, 564400512, - 573675776, 582998976, 592369152, 601785472, 611246976, 620752768, 630301952, 639893568, 649526784, 659200640, - 668914176, 678666496, 688456704, 698283776, 708146816, 718044864, 727976960, 737942208, 747939584, 757968192, - 768027072, 778115200, 788231680, 798375424, 808545600, 818741184, 828961216, 839204672, 849470528, 859757952, - 870065856, 880393216, 890739136, 901102592, 911482560, 921878080, 932288192, 942711808, 953147968, 963595648, - 974053952, 984521728, 994998080, 1005481984, 1015972480, 1026468416, 1036968960, 1047472960, 1057979520, 1068487552, - 1078996095, 1089504127, 1100010751, 1110514687, 1121015167, 1131511167, 1142001663, 1152485503, 1162961919, 1173429759, - 1183887999, 1194335743, 1204771839, 1215195519, 1225605503, 1236001023, 1246381055, 1256744447, 1267090431, 1277417855, - 1287725695, 1298013055, 1308279039, 1318522495, 1328742399, 1338937983, 1349108223, 1359251967, 1369368447, 1379456639, - 1389515391, 1399544063, 1409541503, 1419506687, 1429438847, 1439336831, 1449199871, 1459026943, 1468817151, 1478569471, - 1488283007, 1497956863, 1507590015, 1517181695, 1526730879, 1536236671, 1545698175, 1555114495, 1564484735, 1573807871, - 1583083135, 1592309631, 1601486463, 1610612735, 1619687551, 1628710143, 1637679615, 1646594943, 1655455487, 1664260223, - 1673008511, 1681699327, 1690332031, 1698905471, 1707419135, 1715872127, 1724263679, 1732592767, 1740858879, 1749060991, - 1757198463, 1765270527, 1773276287, 1781215103, 1789086079, 1796888575, 1804621823, 1812285055, 1819877503, 1827398527, - 1834847359, 1842223231, 1849525631, 1856753663, 1863906687, 1870983935, 1877984895, 1884908927, 1891755135, 1898523007, - 1905211903, 1911821183, 1918350079, 1924798207, 1931164799, 1937449215, 1943650943, 1949769343, 1955803775, 1961753727, - 1967618687, 1973398015, 1979091199, 1984697599, 1990216703, 1995648127, 2000991231, 2006245503, 2011410431, 2016485631, - 2021470463, 2026364543, 2031167359, 2035878527, 2040497535, 2045023871, 2049457151, 2053797119, 2058043135, 2062194815, - 2066251903, 2070213887, 2074080383, 2077851135, 2081525631, 2085103743, 2088584831, 2091968767, 2095255167, 2098443775, - 2101534207, 2104526207, 2107419519, 2110213759, 2112908671, 2115504127, 2117999743, 2120395391, 2122690815, 2124885759, - 2126979967, 2128973311, 2130865535, 2132656639, 2134346111, 2135934207, 2137420415, 2138804863, 2140087167, 2141267455, - 2142345471, 2143321087, 2144194303, 2144964863, 2145632895, 2146198271, 2146660991, 2147020927, 2147277951, 2147432191 - }; - // Q31 - const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1] = { - 22902, 91608, 206114, 366416, 572507, 824378, 1122018, 1465415, 1854554, 2289418, - 2769989, 3296246, 3868167, 4485728, 5148901, 5857660, 6611973, 7411808, 8257132, 9147909, - 10084099, 11065664, 12092561, 13164746, 14282175, 15444799, 16652568, 17905432, 19203336, 20546226, - 21934042, 23366728, 24844222, 26366462, 27933380, 29544910, 31200986, 32901534, 34646484, 36435760, - 38269288, 40146984, 42068776, 44034576, 46044300, 48097868, 50195188, 52336168, 54520724, 56748756, - 59020172, 61334876, 63692768, 66093744, 68537712, 71024552, 73554176, 76126456, 78741304, 81398592, - 84098208, 86840048, 89623984, 92449904, 95317680, 98227200, 101178336, 104170952, 107204936, 110280144, - 113396456, 116553736, 119751848, 122990656, 126270024, 129589808, 132949864, 136350064, 139790240, 143270256, - 146789968, 150349232, 153947888, 157585760, 161262736, 164978624, 168733280, 172526544, 176358256, 180228256, - 184136368, 188082416, 192066256, 196087712, 200146592, 204242752, 208376000, 212546160, 216753072, 220996528, - 225276352, 229592384, 233944432, 238332288, 242755792, 247214752, 251708960, 256238240, 260802384, 265401216, - 270034528, 274702112, 279403808, 284139392, 288908640, 293711360, 298547360, 303416448, 308318400, 313252960, - 318220000, 323219264, 328250528, 333313632, 338408288, 343534304, 348691488, 353879616, 359098432, 364347744, - 369627296, 374936928, 380276320, 385645312, 391043680, 396471168, 401927520, 407412544, 412925984, 418467616, - 424037216, 429634528, 435259328, 440911328, 446590336, 452296128, 458028416, 463786944, 469571520, 475381856, - 481217728, 487078848, 492965024, 498875968, 504811424, 510771168, 516754912, 522762432, 528793440, 534847712, - 540924928, 547024960, 553147392, 559292032, 565458624, 571646912, 577856640, 584087488, 590339264, 596611584, - 602904320, 609217152, 615549760, 621901888, 628273344, 634663808, 641072960, 647500608, 653946432, 660410176, - 666891520, 673390208, 679906048, 686438592, 692987712, 699553088, 706134400, 712731392, 719343808, 725971328, - 732613696, 739270592, 745941760, 752626880, 759325760, 766038016, 772763456, 779501696, 786252480, 793015488, - 799790528, 806577216, 813375360, 820184576, 827004608, 833835136, 840675968, 847526656, 854387072, 861256832, - 868135616, 875023168, 881919232, 888823488, 895735616, 902655296, 909582336, 916516352, 923457088, 930404224, - 937357504, 944316544, 951281152, 958250944, 965225728, 972205056, 979188800, 986176512, 993168000, 1000162880, - 1007160960, 1014161856, 1021165248, 1028170944, 1035178560, 1042187776, 1049198400, 1056210048, 1063222464, 1070235328, - 1077248383, 1084261119, 1091273599, 1098285183, 1105295871, 1112305151, 1119312767, 1126318335, 1133321855, 1140322687, - 1147320703, 1154315647, 1161307135, 1168294911, 1175278591, 1182257919, 1189232639, 1196202495, 1203167103, 1210126207, - 1217079423, 1224026495, 1230967295, 1237901311, 1244828287, 1251748095, 1258660223, 1265564415, 1272460415, 1279348095, - 1286226815, 1293096575, 1299956991, 1306807679, 1313648511, 1320479103, 1327299071, 1334108287, 1340906367, 1347693183, - 1354468095, 1361231231, 1367981951, 1374720255, 1381445631, 1388157823, 1394856703, 1401541887, 1408213119, 1414870015, - 1421512319, 1428139903, 1434752255, 1441349247, 1447930623, 1454495871, 1461044991, 1467577599, 1474093439, 1480592127, - 1487073535, 1493537151, 1499982975, 1506410623, 1512819839, 1519210239, 1525581695, 1531933951, 1538266495, 1544579327, - 1550872063, 1557144447, 1563396095, 1569627007, 1575836671, 1582024959, 1588191615, 1594336255, 1600458751, 1606558719, - 1612635903, 1618690175, 1624721279, 1630728703, 1636712447, 1642672255, 1648607743, 1654518655, 1660404735, 1666265983, - 1672101759, 1677912191, 1683696639, 1689455231, 1695187583, 1700893311, 1706572287, 1712224383, 1717849087, 1723446399, - 1729016063, 1734557695, 1740071167, 1745556095, 1751012479, 1756439935, 1761838335, 1767207295, 1772546687, 1777856383, - 1783135871, 1788385151, 1793604095, 1798792191, 1803949311, 1809075327, 1814169983, 1819233151, 1824264319, 1829263615, - 1834230655, 1839165311, 1844067199, 1848936319, 1853772287, 1858574975, 1863344255, 1868079871, 1872781567, 1877449087, - 1882082431, 1886681215, 1891245439, 1895774719, 1900268927, 1904727807, 1909151359, 1913539199, 1917891199, 1922207231, - 1926487167, 1930730623, 1934937471, 1939107583, 1943240831, 1947337087, 1951395967, 1955417343, 1959401215, 1963347327, - 1967255423, 1971125375, 1974957055, 1978750335, 1982504959, 1986220927, 1989897855, 1993535743, 1997134463, 2000693631, - 2004213375, 2007693439, 2011133567, 2014533759, 2017893887, 2021213567, 2024493055, 2027731839, 2030929919, 2034087167, - 2037203455, 2040278655, 2043312639, 2046305279, 2049256447, 2052166015, 2055033727, 2057859711, 2060643583, 2063385471, - 2066085119, 2068742399, 2071357183, 2073929471, 2076459135, 2078945919, 2081389951, 2083790847, 2086148735, 2088463487, - 2090734847, 2092962943, 2095147519, 2097288447, 2099385727, 2101439359, 2103449087, 2105414911, 2107336703, 2109214335, - 2111047935, 2112837119, 2114582143, 2116282623, 2117938687, 2119550207, 2121117183, 2122639487, 2124116863, 2125549567, - 2126937471, 2128280319, 2129578239, 2130831103, 2132038911, 2133201535, 2134318847, 2135391103, 2136418047, 2137399551, - 2138335743, 2139226495, 2140071807, 2140871679, 2141625983, 2142334719, 2142997887, 2143615487, 2144187391, 2144713599, - 2145194239, 2145629055, 2146018175, 2146361599, 2146659327, 2146911103, 2147117183, 2147277567, 2147391999, 2147460735 - }; -#endif // Q31 diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 70605040d..3c92a645c 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -1988,7 +1988,6 @@ static void weighted_ave_fx( ) { -#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT Word16 i, j, len, len2; Word32 gain_tmp_fx = 0, gain_sub_fx; move32(); @@ -2015,24 +2014,6 @@ static void weighted_ave_fx( dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 move32(); } -#else - Word16 i, len; - Word32 gain_tmp_fx = 0, gain_sub_fx; - move32(); - len = shr( input_frame, 1 ); - gain_sub_fx = L_sub( gain_fx, old_gain_fx ); - FOR( i = 0; i < len; i++ ) - { - gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 - dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 - move32(); - } - FOR( ; i < input_frame; i++ ) - { - dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16 - move32(); - } -#endif return; @@ -2226,7 +2207,6 @@ static void adapt_gain_fx( ) { -#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT Word16 i, j, len, len2; Word32 gain_tmp_fx, gain_sub_fx; @@ -2252,29 +2232,6 @@ static void adapt_gain_fx( dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16 move32(); } -#else - Word16 i, len; - Word32 gain_tmp_fx, gain_sub_fx; - - len = shr( input_frame, 1 ); - - // gain_sub = gain - old_gain; - gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31 - - FOR( i = 0; i < len; i++ ) - { - // gain_tmp = old_gain + gain_sub * wnd[i]; - gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31 // dst[i] = src[i] * gain_tmp; - dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx ); // Q16 - move32(); - } - FOR( ; i < input_frame; i++ ) - { - // dst[i] = src[i] * gain; - dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16 - move32(); - } -#endif return; -- GitLab From 2fab46b15f8841ee15278d927e73dd0932c70f87 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 27 May 2025 10:29:27 +0200 Subject: [PATCH 0735/1310] [cleanup] accept NONBE_FIX_947_STEREO_DMX_EVS_PHA --- lib_com/options.h | 3 - lib_enc/ivas_stat_enc.h | 7 - lib_enc/ivas_stereo_dmx_evs_fx.c | 677 ------------------------------- 3 files changed, 687 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c89c3b750..42a9dbd7e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,10 +114,7 @@ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ -#define NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Orange: Fix issues on PHA */ -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ -#endif #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 85450a697..126bc61f6 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1178,9 +1178,6 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure typedef struct stereo_dmx_evs_correlation_filter_structure { -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - Word16 init_frmCntr; -#endif Word32 isd_rate_s_fx; // Q31 Word32 iccr_s_fx; // Q31 @@ -1204,7 +1201,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure STEREO_DMX_EVS_PHA prev_pha; Word16 pha_hys_cnt; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA STEREO_DMX_EVS_PHA proc_pha; Word16 force_poc; @@ -1214,7 +1210,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure Word16 pha_ipd_chan_thresh; Word16 pha_ipd_chanswitch; Word16 pha_ipd_chanswitch_allowed; -#endif Word16 prc_thres; STEREO_DMX_EVS_PRC curr_prc; @@ -1228,7 +1223,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure Word16 trns_aux_energy_fx_e[CPE_CHANNELS]; Word32 crst_fctr_fx; // Q0 -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA Word16 n_fad_g; Word16 n_fad_cnt; @@ -1247,7 +1241,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure Word32 low_egy_thres_sgc; Word16 low_egy_thres_sgc_e; -#endif } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 3c92a645c..d06b98cc7 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -88,9 +88,6 @@ #define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA -#define STEREO_DMX_EVS_FADE_LEN_PRC_Q0 20 -#endif #define STEREO_DMX_EVS_NB_SBFRM 5 #define STEREO_DMX_EVS_TRNS_DTC_INST_Q0 75 @@ -103,7 +100,6 @@ #define STEREO_DMX_EVS_POC_RENORM_TH 33554432 // 65536 << 9 #define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA #define STEREO_DMX_EVS_FAD_R 3 #ifdef NONBE_FIX_947_STEREO_DMX_FADOPT #define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ @@ -149,35 +145,6 @@ const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128, 1841888128 }; -#else - -const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { - 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, - 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, - 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, - 2027355264, 2023718656, 2020082048, 2016445440, 2012808832, 2009172224, 2005535616, 2001899008, 1998262400, 1994625664, - 1990989056, 1987352448, 1983715840, 1980079232, 1976442624, 1972806016, 1969169408, 1965532800, 1961896192, 1958259584, - 1954622976, 1950986368, 1947349760, 1943713152, 1940076544, 1936439936, 1932803328, 1929166592, 1925529984, 1921893376, - 1918256768, 1914620160, 1910983552, 1907346944, 1903710336, 1900073728, 1896437120, 1892800512, 1889163904, 1885527296, - 1881890688, 1878254080, 1874617344, 1870980864, 1867344128, 1863707520, 1860070912, 1856434304, 1852797696, 1849161088, - 1845524480, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, - 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872, 1841887872 -}; -#endif /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ @@ -256,13 +223,11 @@ static Word32 find_poc_peak_fx( const Word16 input_frame, /* i : input frame length per channel */ const Word32 ratio_fixed /* i : adapting ratio */ ); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA static Word32 spectral_flatness_fx( const Word32 *sig_fx, /* i : input signal (mantissa) */ const Word16 *sig_fx_e, /* i : input signal (exponent) - can be NULL */ const Word16 sig_length /* i : input signal length */ ); -#endif /*-------------------------------------------------------------------* * estimate_itd_wnd_fft() * @@ -368,11 +333,7 @@ static void calc_poc_fx( Word16 cos_step, cos_max; Word32 eps_cos, eps_sin, EPS; -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha, pha_ipd_ild_chan2rephase; -#else - Word16 isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; -#endif Word32 Nr, Ni, Dr, Di, tPr, tPi, Pn, energy; Word16 Nr_e, Ni_e, tPr_e, tPi_e, Pn_e, energy_e; Word16 isd_rate, isd_rate_e; @@ -678,15 +639,6 @@ static void calc_poc_fx( specPOr[n0] = imult3216( Mpy_32_32_r( wnd[i * step + bias], gamma ), sign_fx( Mpy_32_32_r( specLr[n0], specRr[n0] ) ) ); // Q31 move32(); -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - hPHA->init_frmCntr = sub( hPHA->init_frmCntr, 1 ); - move16(); - if ( hPHA->init_frmCntr < 0 ) - { - hPHA->init_frmCntr = 0; - move16(); - } -#endif freq_8k = L_FRAME16k / 2; move16(); // freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) ); @@ -911,7 +863,6 @@ static void calc_poc_fx( tPr = L_shl_sat( Mpy_32_32_r( tPr, Pn ), add( tPr_e, Pn_e ) ); // Q31 tPi = L_shl_sat( Mpy_32_32_r( tPi, Pn ), add( tPi_e, Pn_e ) ); // Q31 -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); move32(); Pi[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pi[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPi ) ); @@ -926,37 +877,10 @@ static void calc_poc_fx( move32(); Pi[n] = L_shl_sat( Mpy_32_32_r( Pi[n], Pn ), Pn_e ); // Q31 move32(); -#else - IF( hPHA->init_frmCntr == 0 ) - { - Pr[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pr[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPr ) ); - move32(); - Pi[n] = L_add( Mpy_32_32_r( ipd_ff[n], Pi[n] ), Mpy_32_32_r( L_sub( MAX_32, ipd_ff[n] ), tPi ) ); - move32(); - - // Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); - Pn = L_add( L_shr( Mpy_32_32_r( Pr[n], Pr[n] ), 1 ), L_shr( Mpy_32_32_r( Pi[n], Pi[n] ), 1 ) ); - Pn = BASOP_Util_Add_Mant32Exp( Pn, 1, EPSILON_FX_M, EPSILON_FX_E, &Pn_e ); - Pn = Isqrt_lc( Pn, &Pn_e ); - - Pr[n] = L_shl_sat( Mpy_32_32_r( Pr[n], Pn ), Pn_e ); // Q31 - move32(); - Pi[n] = L_shl_sat( Mpy_32_32_r( Pi[n], Pn ), Pn_e ); // Q31 - move32(); - } - ELSE - { - Pr[n] = tPr; - move32(); - Pi[n] = tPi; - move32(); - } -#endif // Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; // Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /* Computes Spectral flatness on one channel */ tmp1 = spectral_flatness_fx( &tEl[1], &tEl_e[1], nsbd - 1 ); IF( LT_32( tmp1, STEREO_DMX_EVS_IPD_SF_THRES_Q31 ) ) @@ -969,7 +893,6 @@ static void calc_poc_fx( hPHA->pha_ipd_chanswitch_allowed = 1; move16(); } -#endif // ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); L_tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32_r( Nr, Nr ), shl( Nr_e, 1 ), Mpy_32_32_r( Ni, Ni ), shl( Ni_e, 1 ), &L_tmp1_e ); @@ -984,7 +907,6 @@ static void calc_poc_fx( hPHA->iccr_s_fx = L_add( Mpy_32_32_r( STEREO_DMX_EVS_ICCR_FORGETTING_Q31, hPHA->iccr_s_fx ), Mpy_32_32_r( MAX_32 - STEREO_DMX_EVS_ICCR_FORGETTING_Q31, ICCr ) ); // Q31 move32(); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA IF( EQ_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) { @@ -1293,176 +1215,6 @@ static void calc_poc_fx( move32(); } } -#else - IF( EQ_32( hPHA->curr_pha, STEREO_DMX_EVS_PHA_IPD ) ) - { - hPHA->p_curr_taps_fx[0] = NULL; - hPHA->p_curr_taps_fx[1] = hPHA->curr_taps_fx[1]; - - rfft_pha_buf[0] = ONE_IN_Q22; - move32(); - rfft_pha_buf[1] = ONE_IN_Q22; - move32(); - - ild_cnt = 0; - move16(); - FOR( i = 1; i < nsbd; i++ ) - { - rfft_pha_buf[i * 2] = L_shr_r( Pr[i], 9 ); // Q31->Q22 - move32(); - rfft_pha_buf[i * 2 + 1] = L_shr_r( Pi[i], 9 ); // Q31->Q22 - move32(); - // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) - test(); - IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) - { - ild_cnt = add( ild_cnt, 1 ); - tEr[i] = MAX_32; - move32(); - tEr_e[i] = 0; - move16(); - } - ELSE - { - tEr[i] = MIN_32; - move32(); - tEr_e[i] = 0; - move16(); - } - } - IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) - { - FOR( i = 1; i < nsbd; i++ ) - { - IF( tEr[i] > 0 ) - { - rfft_pha_buf[i * 2] = ONE_IN_Q22; - move32(); - rfft_pha_buf[i * 2 + 1] = 0; - move32(); - } - } - } - - rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); - // mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); - Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 - } - ELSE - { - test(); - test(); - IF( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_L_Q31 ) || ( LT_32( hPHA->iccr_s_fx, STEREO_DMX_EVS_ICCR_HYST_H_Q31 ) && ( hPHA->p_curr_taps_fx[0] != NULL ) ) ) - { - /* IPDn */ - - set32_fx( &( Pr[freq_ipd_max] ), MAX_32, sub( nsbd, freq_ipd_max ) ); - set32_fx( &( Pi[freq_ipd_max] ), 0, sub( nsbd, freq_ipd_max ) ); - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - hPHA->p_curr_taps_fx[n] = hPHA->curr_taps_fx[n]; - } - - rfft_pha_buf[0] = ONE_IN_Q22; - move32(); - rfft_pha_buf[1] = ONE_IN_Q22; - move32(); - - ild_cnt = 0; - move16(); - isd_rate = BASOP_Util_Divide1616_Scale( isd_cnt_l, freq_8k, &isd_rate_e ); - // Saturation to handle values close to 1.0f - isd_rate = shl_sat( isd_rate, isd_rate_e ); // Q15 - FOR( i = 1; i < nsbd; i++ ) - { - // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); - L_tmp = L_add( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); - L_tmp_e = 0; - move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 - move32(); - // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); - L_tmp = L_sub_sat( ONE_IN_Q30, L_shr( Pr[i], 1 ) ); // saturating as Pr does not exceed 1.0f - L_tmp_e = 0; - move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( Pi[i] ) ); // Q22 - move32(); - IF( GT_16( isd_rate, STEREO_DMX_EVS_ISD_DIST_THRES_IPD_Q15 ) ) - { - // rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); - L_tmp = L_sub( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); - L_tmp_e = 9; - move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2 + 1] = imult3216( L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ), sign_fx( rfft_pha_buf[i * 2 + 1] ) ); // Q22 - move32(); - // rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); - L_tmp = L_add( ONE_IN_Q21, L_shr( rfft_pha_buf[i * 2], 1 ) ); // Q22 - L_tmp_e = 9; - move16(); - L_tmp = Sqrt32( L_tmp, &L_tmp_e ); - rfft_pha_buf[i * 2] = L_shl_r( L_tmp, sub( L_tmp_e, 9 ) ); // Q22 - move32(); - } - - // if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) - test(); - IF( BASOP_Util_Cmp_Mant32Exp( tEr[i], tEr_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEl[i] ), add( 4, tEl_e[i] ) ) > 0 || BASOP_Util_Cmp_Mant32Exp( tEl[i], tEl_e[i], Mpy_32_32_r( STEREO_DMX_EVS_LR_EGY_Q27, tEr[i] ), add( 4, tEr_e[i] ) ) > 0 ) - { - ild_cnt = add( ild_cnt, 1 ); - tEr[i] = MAX_32; - move32(); - tEr_e[i] = 0; - move16(); - } - ELSE - { - tEr[i] = MIN_32; - move32(); - tEr_e[i] = 0; - move16(); - } - } - IF( GT_16( ild_cnt, mult_r( nsbd, STEREO_DMX_EVS_ILD_PRC_Q15 ) ) ) - { - FOR( i = 1; i < nsbd; i++ ) - { - IF( tEr[i] > 0 ) - { - rfft_pha_buf[i * 2] = ONE_IN_Q22; - move32(); - rfft_pha_buf[i * 2 + 1] = 0; - move32(); - } - } - } - - rfft_fx( rfft_pha_buf, hPHA->rfft_ipd_coef_fx, input_frame_pha, +1 ); - // mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); - Copy_Scale_sig32( rfft_pha_buf, hPHA->p_curr_taps_fx[1], hPHA->pha_len, 9 ); // Q22->Q31 - - /* PHA L2R */ - p_curr_taps = hPHA->p_curr_taps_fx[0]; - p_curr_taps[0] = L_shl( rfft_pha_buf[0], 9 ); // Q22->Q31 - move32(); - FOR( i = 1; i < hPHA->pha_len; i++ ) - { - p_curr_taps[i] = L_shl( rfft_pha_buf[input_frame_pha - i], 9 ); // Q22->Q31 - move32(); - } - } - ELSE - { - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - hPHA->p_curr_taps_fx[n] = NULL; - } - } - } -#endif FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -2019,7 +1771,6 @@ static void weighted_ave_fx( return; } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* * spectral_flatness_fx() * @@ -2071,7 +1822,6 @@ static Word32 spectral_flatness_fx( return L_shl_sat( L_deposit_h( sf ), L_tmp_e ); } -#endif /*-------------------------------------------------------------------* * calc_energy() @@ -2154,7 +1904,6 @@ static void calc_energy_fx( return; } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* * calc_energy_sgc() * @@ -2190,7 +1939,6 @@ static void calc_energy_sgc( return; } -#endif /*-------------------------------------------------------------------* * adapt_gain() @@ -2330,7 +2078,6 @@ static void create_M_signal_fx( return; } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA /*-------------------------------------------------------------------* * apply_gain_sgc() * @@ -2374,7 +2121,6 @@ static void apply_gain_sgc( return; } -#endif /*-------------------------------------------------------------------* * stereo_dmx_evs_enc() @@ -2389,7 +2135,6 @@ void stereo_dmx_evs_enc_fx( const bool is_binaural /* i : indication that input is binaural audio */ ) { -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA Word16 n; Word16 dmx_weight, corr; // Q15 @@ -2927,386 +2672,6 @@ void stereo_dmx_evs_enc_fx( pop_wmops(); -#else - - Word16 n; - Word16 dmx_weight, corr; // Q15 - Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 - - Word16 k, m, pha_len, fad_len; - Word32 mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; // Q11 - Word32 *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; - Word32 dmx_poc_data[L_FRAME48k] /*Q11*/, dmx_pha_data[L_FRAME48k] /*Q11*/, *p_dmx_data, fx_tmp; - Word16 fx_tmp_e; - STEREO_DMX_EVS_PRC curr_prc; - Word16 input_subframe, is_transient; - Word32 *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; - Word16 subframe_energy_e[STEREO_DMX_EVS_NB_SBFRM]; - - Word16 input_frame; - - Word32 L_tmp1, L_tmp2; - Word16 L_tmp1_e, L_tmp2_e; - - Word64 W_tmp; - Word16 W_tmp_q; - - push_wmops( "stereo_dmx_evs_enc" ); - - if ( is_binaural ) - { - /* use of is_binaural flag is to be considered */ - } - - // input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); - SWITCH( input_Fs ) - { - case 8000: - input_frame = 160; - BREAK; - case 16000: - input_frame = 320; - BREAK; - case 32000: - input_frame = 640; - BREAK; - case 48000: - input_frame = 960; - BREAK; - default: - input_frame = 960; - IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); - BREAK; - } - move16(); - - FOR( n = 0; n < input_frame; n++ ) - { - data_fx[0][n] = L_deposit_h( data[2 * n] ); - move32(); - data_fx[1][n] = L_deposit_h( data[2 * n + 1] ); - move32(); - } - IF( LT_16( n_samples, input_frame ) ) - { - set32_fx( data_fx[0] + n_samples, 0, sub( input_frame, n_samples ) ); - set32_fx( data_fx[1] + n_samples, 0, sub( input_frame, n_samples ) ); - } - - - // input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; - IF( EQ_16( n_samples, L_FRAME16k ) ) - { - input_subframe = 64; - move16(); - } - ELSE IF( EQ_16( n_samples, L_FRAME32k ) ) - { - input_subframe = 128; - move16(); - } - ELSE IF( EQ_16( n_samples, L_FRAME48k ) ) - { - input_subframe = 192; - move16(); - } - ELSE - { - input_subframe = 192; - move16(); - IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid frame length\n" ); - } - - is_transient = 0; - move16(); - FOR( k = 0; k < CPE_CHANNELS; k++ ) - { - fx_tmp = 0; - move32(); - fx_tmp_e = 0; - move16(); - FOR( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) - { - p_sub_frame = &( data_fx[k][m * input_subframe] ); - subframe_energy[m] = 0; - move32(); - subframe_energy_e[m] = 0; - move16(); - FOR( n = 0; n < input_subframe; n++ ) - { - // subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; - W_tmp = W_mult_32_32( p_sub_frame[n], p_sub_frame[n] ); - W_tmp_q = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, W_tmp_q ); - L_tmp1 = W_extract_h( W_tmp ); // Q(31-(30-W_tmp_q)) - L_tmp1_e = sub( 15 * 2, W_tmp_q ); - subframe_energy[m] = BASOP_Util_Add_Mant32Exp( subframe_energy[m], subframe_energy_e[m], L_tmp1, L_tmp1_e, &subframe_energy_e[m] ); - move32(); - } - - L_tmp1 = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); - L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); - // if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) - if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, hStereoDmxEVS->hPHA->crst_fctr_fx, 31 ) > 0 ) - { - is_transient = 1; - move16(); - } - - IF( hStereoDmxEVS->hPHA->init_frmCntr == 0 ) - { - // hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; - hStereoDmxEVS->hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ), hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], Mpy_32_16_1( subframe_energy[m], sub( MAX_16, STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 ) ), subframe_energy_e[m], &hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k] ); - move32(); - } - ELSE - { - // hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5f * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5f * subframe_energy[m]; - hStereoDmxEVS->hPHA->trns_aux_energy_fx[k] = BASOP_Util_Add_Mant32Exp( hStereoDmxEVS->hPHA->trns_aux_energy_fx[k], add( hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k], 1 ), subframe_energy[m], add( subframe_energy_e[m], 1 ), &hStereoDmxEVS->hPHA->trns_aux_energy_fx_e[k] ); - move32(); - } - - fx_tmp = BASOP_Util_Add_Mant32Exp( fx_tmp, fx_tmp_e, subframe_energy[m], subframe_energy_e[m], &fx_tmp_e ); - } - - FOR( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) - { - L_tmp1 = BASOP_Util_Add_Mant32Exp( subframe_energy[m - 1], subframe_energy_e[m - 1], EPSILON_FX_M, EPSILON_FX_E, &L_tmp1_e ); - L_tmp2 = BASOP_Util_Divide3232_Scale_cadence( subframe_energy[m], L_tmp1, &L_tmp2_e ); - L_tmp2_e = add( L_tmp2_e, sub( subframe_energy_e[m], L_tmp1_e ) ); - // if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) - if ( BASOP_Util_Cmp_Mant32Exp( L_tmp2, L_tmp2_e, STEREO_DMX_EVS_TRNS_DTC_INST_Q0, 31 ) > 0 ) - { - is_transient = 1; - move16(); - } - } - } - - estimate_itd_fx( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_fx[0], data_fx[1], &hStereoDmxEVS->itd_fx, input_frame ); - - /* poc */ - - IF( hStereoDmxEVS->itd_fx ) - { - // dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; - IF( hStereoDmxEVS->itd_fx > 0 ) - { - dmx_weight = add( negate( shr( corr, 1 ) ), ONE_IN_Q14 ); - } - ELSE - { - dmx_weight = add( shr( corr, 1 ), ONE_IN_Q14 ); - } - } - ELSE - { - dmx_weight = ONE_IN_Q14; - move16(); - } - - create_M_signal_fx( data_fx[0], data_fx[1], dmx_poc_data, L_deposit_h( dmx_weight ), input_frame, hStereoDmxEVS->s_wnd_fx, - hStereoDmxEVS->dmx_weight_fx, hStereoDmxEVS->pre_dmx_energy_fx, hStereoDmxEVS->pre_dmx_energy_fx_e, hStereoDmxEVS->aux_dmx_energy_fx, hStereoDmxEVS->aux_dmx_energy_fx_e ); - - // Downscaling signals to avoid accumulation overflows - scale_sig32( data_fx[0], input_frame, -5 ); // Q31->Q26 - scale_sig32( data_fx[1], input_frame, -5 ); // Q31->Q26 - scale_sig32( dmx_poc_data, input_frame, -5 ); // Q31->Q26 - - /* pha */ - - pha_len = hStereoDmxEVS->hPHA->pha_len; - move16(); - fad_len = hStereoDmxEVS->hPHA->fad_len; - move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_fx; - - set_zero_fx( dmx_pha_data, n_samples ); - set_zero_fx( mem_prev, fad_len ); - - FOR( k = 0; k < CPE_CHANNELS; k++ ) - { - p_data = data_fx[k]; - Copy32( hStereoDmxEVS->hPHA->data_mem_fx[k], data_mem, pha_len ); - Copy32( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem_fx[k], pha_len ); - p_data_mem = &( data_mem[pha_len] ); - Copy32( p_data, p_data_mem, n_samples ); - - p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps_fx[k]; - IF( p_prev_taps ) - { - FOR( n = 0; n < fad_len; n++ ) - { - FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) - { - // ftmp += p_data_mem[n - m] * p_prev_taps[m]; - fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_prev_taps[m] ) ); // Q25 - } - fx_tmp = L_shl( fx_tmp, 1 ); // Q26 - mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); - move32(); - } - } - ELSE - { - FOR( n = 0; n < fad_len; n++ ) - { - // mem_prev[n] += p_data[n] * INV_SQRT_2; - mem_prev[n] = L_add( mem_prev[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 - move32(); - } - } - - p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps_fx[k]; - IF( p_curr_taps ) - { - FOR( n = 0; n < n_samples; n++ ) - { - FOR( ( fx_tmp = 0, m = 0 ); m < pha_len; m++ ) - { - // ftmp += p_data_mem[n - m] * p_curr_taps[m]; - fx_tmp = L_add( fx_tmp, Mpy_32_32( p_data_mem[n - m], p_curr_taps[m] ) ); // Q25 - } - fx_tmp = L_shl( fx_tmp, 1 ); // Q26 - // dmx_pha_data[n] += ftmp * INV_SQRT_2; - dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( fx_tmp, INV_SQRT_2_Q31 ) ); // Q26 - move32(); - } - } - ELSE - { - FOR( n = 0; n < n_samples; n++ ) - { - // dmx_pha_data[n] += p_data[n] * INV_SQRT_2; - dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( p_data[n], INV_SQRT_2_Q31 ) ); // Q26 - move32(); - } - } - } - - FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len; ( n++, m-- ) ) - { - dmx_pha_data[n] = Mpy_32_32( dmx_pha_data[n], fad_g[n] ); - move32(); - dmx_pha_data[n] = L_add( dmx_pha_data[n], Mpy_32_32( mem_prev[n], fad_g[m] ) ); // Q26 - move32(); - } - - /* prc switch */ - - curr_prc = hStereoDmxEVS->hPHA->curr_prc; - move32(); - // if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) - IF( GT_16( abs_s( hStereoDmxEVS->itd_fx ), hStereoDmxEVS->hPHA->prc_thres ) ) - { - IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) - { - IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_POC ) ) - { - hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); - move16(); - } - ELSE - { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - move16(); - } - - if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; - move32(); - } - } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; - move32(); - } - ELSE - { - IF( NE_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_PHA ) ) - { - IF( EQ_32( hStereoDmxEVS->hPHA->prev_prc, STEREO_DMX_EVS_PRC_PHA ) ) - { - hStereoDmxEVS->hPHA->prc_hys_cnt = add( hStereoDmxEVS->hPHA->prc_hys_cnt, 1 ); - move16(); - } - ELSE - { - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - move16(); - } - - if ( GE_16( hStereoDmxEVS->hPHA->prc_hys_cnt, STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; - move32(); - } - } - hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; - move32(); - } - - // if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) - test(); - test(); - test(); - test(); - IF( EQ_16( is_transient, 1 ) || - BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[0], hStereoDmxEVS->aux_dmx_energy_fx_e[0], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[1] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[1], 14 ) ) > 0 || - BASOP_Util_Cmp_Mant32Exp( hStereoDmxEVS->aux_dmx_energy_fx[1], hStereoDmxEVS->aux_dmx_energy_fx_e[1], Mpy_32_32( STEREO_DMX_EVS_ILDS_EGY_Q17, hStereoDmxEVS->aux_dmx_energy_fx[0] ), add( hStereoDmxEVS->aux_dmx_energy_fx_e[0], 14 ) ) > 0 || - ( ( hStereoDmxEVS->hPHA->p_curr_taps_fx[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps_fx[1] == NULL ) ) ) - { - hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; - move32(); - hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - move16(); - } - - IF( EQ_32( hStereoDmxEVS->hPHA->curr_prc, STEREO_DMX_EVS_PRC_POC ) ) - { - p_dmx_data = dmx_poc_data; - - IF( NE_32( curr_prc, hStereoDmxEVS->hPHA->curr_prc ) ) - { - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; - move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; - - FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len; ( n++, m-- ) ) - { - p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n] ); // Q26 - move32(); - p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m], dmx_pha_data[n] ) ); // Q26 - move32(); - } - } - } - ELSE - { - p_dmx_data = dmx_pha_data; - - IF( NE_32( curr_prc, hStereoDmxEVS->hPHA->curr_prc ) ) - { - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; - move16(); - fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; - - FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len; ( n++, m-- ) ) - { - p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n] ); // Q26 - move32(); - p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m], dmx_poc_data[n] ) ); // Q26 - move32(); - } - } - } - - Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 - - pop_wmops(); - -#endif return; } @@ -3517,12 +2882,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_16_Q0; move32(); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_16; hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; move32(); move16(); -#endif } ELSE IF( EQ_32( input_Fs, 32000 ) ) { @@ -3534,12 +2897,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_32_Q0; move32(); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_32; hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; move32(); move16(); -#endif } ELSE IF( EQ_32( input_Fs, 48000 ) ) { @@ -3551,12 +2912,10 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->crst_fctr_fx = STEREO_DMX_EVS_CRST_FCTR_48_Q0; move32(); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->low_egy_thres_sgc = STEREO_DMX_EVS_SGC_LEGY_THRES_48; hStereoDmxEVS->hPHA->low_egy_thres_sgc_e = STEREO_DMX_EVS_SGC_LEGY_THRES_E; move32(); move16(); -#endif } ELSE { @@ -3565,10 +2924,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->pha_len = shr( len, 1 ); move16(); -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - hStereoDmxEVS->hPHA->init_frmCntr = 10; // (int16_t)(FRAMES_PER_SEC * 0.2f) - move16(); -#endif hStereoDmxEVS->hPHA->isd_rate_s_fx = 0; move32(); hStereoDmxEVS->hPHA->iccr_s_fx = 0; @@ -3619,7 +2974,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( // replaced below logic with table as it is same for all frame lengths Copy32( ipd_ff_Q31, hStereoDmxEVS->hPHA->ipd_ff_fx, STEREO_DMX_EVS_NB_SUBBAND_MAX ); -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->proc_pha = STEREO_DMX_EVS_PHA_IPD; hStereoDmxEVS->hPHA->force_poc = FALSE; move16(); @@ -3637,7 +2991,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); hStereoDmxEVS->hPHA->pha_ipd_chanswitch_allowed = 0; move16(); -#endif set32_fx( hStereoDmxEVS->hPHA->Pr_fx, MAX_32, STEREO_DMX_EVS_NB_SUBBAND_MAX ); set_zero_fx( hStereoDmxEVS->hPHA->Pi_fx, STEREO_DMX_EVS_NB_SUBBAND_MAX ); @@ -3689,36 +3042,8 @@ ivas_error stereo_dmx_evs_init_encoder_fx( hStereoDmxEVS->hPHA->prc_hys_cnt = 0; move16(); -#ifndef NONBE_FIX_947_STEREO_DMX_EVS_PHA - // hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f ); - SWITCH( input_Fs ) - { - case 8000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 8; - move16(); - BREAK; - case 16000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 16; - move16(); - BREAK; - case 32000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 32; - move16(); - BREAK; - case 48000: - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 48; - move16(); - BREAK; - default: - IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" ); - BREAK; - } - fad_len = hStereoDmxEVS->hPHA->fad_len_prc; - move16(); -#else fad_len = input_frame; move16(); -#endif fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; move32(); @@ -3742,7 +3067,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); } -#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA hStereoDmxEVS->hPHA->dmx_poc_ener_fx = 0; move32(); @@ -3772,7 +3096,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); move16(); -#endif *hStereoDmxEVS_out = hStereoDmxEVS; -- GitLab From 4bbe1428b9e20dfa460cadde9808cd8ee21bbb21 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 27 May 2025 10:29:30 +0200 Subject: [PATCH 0736/1310] [cleanup] accept NONBE_FIX_947_STEREO_DMX_FADOPT --- lib_com/options.h | 1 - lib_enc/ivas_stereo_dmx_evs_fx.c | 35 -------------------------------- 2 files changed, 36 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 42a9dbd7e..b062055e1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,7 +114,6 @@ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ -#define NONBE_FIX_947_STEREO_DMX_FADOPT /* Orange: Fading optimisation */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index d06b98cc7..b0c95f8db 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -101,9 +101,7 @@ #define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 #define STEREO_DMX_EVS_FAD_R 3 -#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT #define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ -#endif #define STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 29491 // 0.9f #define STEREO_DMX_EVS_SGC_GR_S 32919 // 1.00461543f #define STEREO_DMX_EVS_SGC_GIR_S 32617 // 1/1.00461543f @@ -2138,11 +2136,7 @@ void stereo_dmx_evs_enc_fx( Word16 n; Word16 dmx_weight, corr; // Q15 -#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT Word16 k, m, pha_len, fad_len, sbfad_len; -#else - Word16 k, m, pha_len, fad_len; -#endif Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11 @@ -2545,20 +2539,8 @@ void stereo_dmx_evs_enc_fx( ELSE { hPHA->n_fad_g = sub( input_frame, add( hPHA->n_fad_g, 1 ) ); -#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT hPHA->n_fad_cnt = 0; move16(); -#else - IF( EQ_16( is_transient, 1 ) ) - { - hPHA->n_fad_cnt = 0; - move16(); - } - ELSE - { - hPHA->n_fad_cnt = sub( n_fad_r, hPHA->n_fad_cnt ); - } -#endif } } ELSE IF( is_transient ) @@ -2579,7 +2561,6 @@ void stereo_dmx_evs_enc_fx( move16(); m_fad_g = sub( input_frame, add( n_fad_g, 1 ) ); -#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT IF( EQ_16( n_fad_r, 1 ) ) { n_fad_cnt = 0; @@ -2645,22 +2626,6 @@ void stereo_dmx_evs_enc_fx( } } } -#else - FOR( n = 0; n < fad_len; n++ ) - { - p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26; - p_dmx_data[n] = L_add_sat( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26 - - n_fad_cnt = add( n_fad_cnt, 1 ); - IF( GE_16( n_fad_cnt, n_fad_r ) ) - { - n_fad_cnt = 0; - move16(); - n_fad_g = add( n_fad_g, 1 ); - m_fad_g = sub( m_fad_g, 1 ); - } - } -#endif hPHA->n_fad_g = n_fad_g; hPHA->n_fad_cnt = n_fad_cnt; -- GitLab From f3a303770558fc377782ece12350ec8bfe2a600a Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 27 May 2025 10:29:33 +0200 Subject: [PATCH 0737/1310] [cleanup] accept NONBE_FIX_982_OMASA_DELAY_COMP_5MS --- lib_com/ivas_cnst.h | 2 - lib_com/options.h | 1 - lib_dec/ivas_ism_renderer_fx.c | 9 ----- lib_dec/ivas_jbm_dec_fx.c | 2 - lib_dec/ivas_omasa_dec_fx.c | 37 ------------------- .../ivas_dirac_dec_binaural_functions_fx.c | 4 -- 6 files changed, 55 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index cb52138f6..36f0bf571 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1318,9 +1318,7 @@ enum #define MASA_BIT_REDUCT_PARAM 10 #define MASA_MAXIMUM_TWO_DIR_BANDS 24 #define NBITS_HR_COH 4 -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS #define OMASA_TDREND_MATCHING_GAIN_FX 26026 -#endif #define MASA_INV_ANGLE_AT_EQUATOR_DEG_Q30 (1453366656l) diff --git a/lib_com/options.h b/lib_com/options.h index b062055e1..01070b127 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,7 +110,6 @@ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ -#define NONBE_FIX_982_OMASA_DELAY_COMP_5MS /* FhG : issue #982 : 5ms and 20ms output different for OMASA */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index c3904d136..31fafde5a 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -611,15 +611,6 @@ void ivas_omasa_separate_object_render_jbm_fx( FOR( obj = 0; obj < num_objects; obj++ ) { /* Delay the signal to match CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - IF( slots_rendered == 0 ) - { - Word16 tcBufferSize; - - tcBufferSize = i_mult( hSpatParamRendCom->num_slots, hSpatParamRendCom->slot_size ); - delay_signal32_fx( input_fx[obj], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[obj], st_ivas->hMasaIsmData->delayBuffer_size ); - } -#endif offsetSamples = 0; move16(); diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index e80e24226..c184ef8c2 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1731,7 +1731,6 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( ivas_ism_dec_digest_tc_fx( st_ivas ); } -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) { int16_t num_objects; @@ -1755,7 +1754,6 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( delay_signal32_fx( st_ivas->hTcBuffer->tc_fx[CPE_CHANNELS + n], st_ivas->hTcBuffer->n_samples_available, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size ); } } -#endif } ELSE IF( EQ_16( st_ivas->ivas_format, MC_FORMAT ) ) { diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index 4bfc6e13e..031ba4343 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -45,9 +45,6 @@ * Local constants *------------------------------------------------------------------------*/ -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS -#define OMASA_TDREND_MATCHING_GAIN_FX 26026 -#endif /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -702,38 +699,26 @@ void ivas_omasa_dirac_rend_jbm_fx( Word16 n; Word32 data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k]; -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS test(); if ( !st_ivas->hDecoderConfig->Opt_tsm ) { *nSamplesRendered = min( nSamplesAsked, st_ivas->hTcBuffer->n_samples_available ); -#endif test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS Copy32( &output_f[CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[0], *nSamplesRendered ); -#else - Copy32( output_f[CPE_CHANNELS], data_separated_objects[0], nSamplesAsked ); -#endif } ELSE { FOR( n = 0; n < st_ivas->nchan_ism; n++ ) { -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS Copy32( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); -#else - Copy32( output_f[n + CPE_CHANNELS], data_separated_objects[n], nSamplesAsked ); -#endif } } -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS } -#endif subframes_rendered = st_ivas->hSpatParamRendCom->subframes_rendered; @@ -774,14 +759,8 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( ) { Word16 n; -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - Word16 gain_fx = OMASA_TDREND_MATCHING_GAIN_FX; // Q15 -#endif move16(); ivas_error error; -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - Word32 *tc_local_fx[MAX_TRANSPORT_CHANNELS]; -#endif Word32 *p_sepobj_fx[MAX_NUM_OBJECTS]; // Q11 Word32 data_separated_objects_fx[MAX_NUM_OBJECTS][L_FRAME48k]; move16(); @@ -798,22 +777,6 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( } /* Delay the object signals to match the CLDFB delay. Delay the whole buffer with the first rendering call of the stretched buffer. */ -#ifndef NONBE_FIX_982_OMASA_DELAY_COMP_5MS - IF( st_ivas->hSpatParamRendCom->slots_rendered == 0 ) - { - Word16 tcBufferSize; - - tcBufferSize = imult1616( st_ivas->hSpatParamRendCom->num_slots, st_ivas->hSpatParamRendCom->slot_size ); - - FOR( n = 0; n < st_ivas->nchan_ism; n++ ) - { - tc_local_fx[n] = st_ivas->hTcBuffer->tc_fx[n + 2]; // Q11 - v_multc_fixed_16( tc_local_fx[n], gain_fx, tc_local_fx[n], tcBufferSize ); - - delay_signal32_fx( tc_local_fx[n], tcBufferSize, st_ivas->hMasaIsmData->delayBuffer_fx[n], st_ivas->hMasaIsmData->delayBuffer_size ); - } - } -#endif ivas_dirac_dec_binaural_render_fx( st_ivas, nSamplesAsked, nSamplesRendered, nSamplesAvailable, nchan_transport, output_fx ); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 1545ecd0c..79f506fd4 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3244,12 +3244,8 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_tmp_sq = sub( 31, exp ); IF( EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { -#ifdef NONBE_FIX_982_OMASA_DELAY_COMP_5MS Word32 gainfactor_fx = L_shl( (Word32) OMASA_TDREND_MATCHING_GAIN_FX, Q16 ); // constant in Q31 as Word32 gainFactor_fx = Mpy_32_32( gainfactor_fx, tmp1 ); // 1705746262 = 0.7943f in Q31 -#else - gainFactor_fx = Mpy_32_32( 1705746262, tmp1 ); // 1705746262 = 0.7943f in Q31 -#endif } ELSE { -- GitLab From efbc15fddd07ea60c11b5e6c6346012a7d6ccb83 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 27 May 2025 10:30:13 +0200 Subject: [PATCH 0738/1310] formatting --- lib_dec/ivas_omasa_dec_fx.c | 1 - lib_enc/ivas_stereo_dmx_evs_fx.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index 031ba4343..9d8b43515 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -717,7 +717,6 @@ void ivas_omasa_dirac_rend_jbm_fx( Copy32( &output_f[n + CPE_CHANNELS][st_ivas->hTcBuffer->n_samples_rendered], data_separated_objects[n], *nSamplesRendered ); } } - } diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index b0c95f8db..08dc2da2f 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -100,8 +100,8 @@ #define STEREO_DMX_EVS_POC_RENORM_TH 33554432 // 65536 << 9 #define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 -#define STEREO_DMX_EVS_FAD_R 3 -#define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ +#define STEREO_DMX_EVS_FAD_R 3 +#define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */ #define STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 29491 // 0.9f #define STEREO_DMX_EVS_SGC_GR_S 32919 // 1.00461543f #define STEREO_DMX_EVS_SGC_GIR_S 32617 // 1/1.00461543f -- GitLab From 73cf73e918b255999d4c863453905925523d25ad Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 27 May 2025 15:25:44 +0530 Subject: [PATCH 0739/1310] Fix for wrong q-updation for LEtot in analy_sp, ltv crash fix --- lib_com/swb_tbe_com_fx.c | 4 ++-- lib_enc/analy_sp_fx.c | 2 +- lib_enc/ivas_core_pre_proc_front_fx.c | 2 +- lib_enc/ivas_front_vad_fx.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 08bbd6362..96d07e7ef 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -5971,7 +5971,7 @@ void non_linearity_ivas_fx( } - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + IF( GT_16( max_val, shl_sat( 1, Q_inp ) ) ) { exp = norm_s( max_val ); tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ @@ -6045,7 +6045,7 @@ void non_linearity_ivas_fx( max_val = s_max( max_val, tmp ); } - IF( GT_16( max_val, shl( 1, Q_inp ) ) ) + IF( GT_16( max_val, shl_sat( 1, Q_inp ) ) ) { exp = norm_s( max_val ); tmp = div_s( shl( 1, sub( 14, exp ) ), max_val ); /* Q(29-exp-Q_inp) */ diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index dc59ec752..7062a3090 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -860,7 +860,7 @@ static void ivas_find_enr( * Find the total energy over the input bandwidth *-----------------------------------------------------------------*/ - etot = *LEtot; // *q_band + etot = *LEtot; // *q_band+1 move64(); FOR( i = min_band; i <= max_band; i++ ) { diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index f1e6b2193..be208296d 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1453,7 +1453,7 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( lr_vad_enabled && st->idchan == 0 ) { - ivas_long_enr_fx( st, -1, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR_fx ); + ivas_long_enr_fx( st, -256 /*-1 q8*/, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR_fx ); Copy32( fr_bands_LR_fx[0] + NB_BANDS, hCPE->hFrontVad[0]->hNoiseEst->enrO_fx, NB_BANDS ); // fr_bands_LR_fx_q hCPE->hFrontVad[0]->hNoiseEst->q_enrO = fr_bands_LR_fx_q[0]; diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index f2b3adece..a4baf6a00 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -758,7 +758,7 @@ ivas_error front_vad_spar_fx( ivas_smc_gmm_fx( st, NULL, localVAD_HE_SAD[0], Etot_fx_0, lsp_new_fx, cor_map_sum_fx, epsP_fx, PS_fx, non_sta_fx, relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, Q_esp, hSpMusClas->past_PS_Q ); /* long-term energy update */ - ivas_long_enr_fx( st, -1, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot_fx ); + ivas_long_enr_fx( st, -256 /*-1 q8*/, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot_fx ); /* increase ini_frame counter */ hFrontVad->ini_frame = s_min( add( hFrontVad->ini_frame, 1 ), MAX_FRAME_COUNTER ); /* Q0 */ -- GitLab From c5e06f1c533114862683b701a40c4687cbe821c8 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 27 May 2025 12:08:32 +0200 Subject: [PATCH 0740/1310] Fixed point data type changes --- lib_rend/ivas_reverb_utils_fx.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 15fb2ee25..dabbcfd82 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -119,7 +119,16 @@ ivas_error ivas_reverb_prepare_cldfb_params( ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX, fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); - + const Word16 input_table_size, + const Word32 *pInput_fc, // input in Q16 + const Word32 *pInput_t60, // input in Q26 + const Word32 *pInput_dsr, // input in Q30 + const Word16 output_table_size, + const Word32 *pOutput_fc, // Q16 + Word32 *pOutput_t60, // pOutput_t60_e + Word32 *pOutput_dsr, // pOutput_dsr_e + Word16 *pOutput_t60_e, // output e + Word16 *pOutput_dsr_e // output e /* adjust DSR for the delay difference */ delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx ); @@ -282,8 +291,8 @@ static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( *-----------------------------------------------------------------------------------------*/ static void ivas_reverb_set_energies( - const float *avg_pwr_l, - const float *avg_pwr_r, + const Word32 *avg_pwr_l, + const Word32 *avg_pwr_r, #else /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_get_fastconv_hrtf_set_energies() @@ -299,16 +308,16 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const int16_t use_brir, #endif const int32_t sampling_rate, - float *avg_pwr_left, - float *avg_pwr_right ) + Word32 *avg_pwr_left, + Word32 *avg_pwr_right ) { int16_t freq_idx; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES float avg_pwr_left_fft[FFT_SPECTRUM_SIZE]; float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; #endif - float input_fc[FFT_SPECTRUM_SIZE]; - float output_fc[CLDFB_NO_CHANNELS_MAX]; + Word32 input_fc[FFT_SPECTRUM_SIZE]; + Word32 output_fc[CLDFB_NO_CHANNELS_MAX]; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif -- GitLab From dfc2e7fbc1871252c5226a0a7bcc6e99a8f90bac Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 27 May 2025 12:45:18 +0200 Subject: [PATCH 0741/1310] apply clang-format --- lib_com/cldfb.c | 24 ++++++++++++------------ lib_dec/acelp_core_dec_fx.c | 2 +- lib_rend/lib_rend.c | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index 211feb305..bf832b640 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -417,8 +417,8 @@ void cldfbAnalysis_ts_fx( rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -431,8 +431,8 @@ void cldfbAnalysis_ts_fx( iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -478,8 +478,8 @@ void cldfbAnalysis_ts_fx( rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -492,8 +492,8 @@ void cldfbAnalysis_ts_fx( iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -562,8 +562,8 @@ void cldfbAnalysis_ts_fx( imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 + imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 + imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -589,8 +589,8 @@ void cldfbAnalysis_ts_fx( cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5 imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 - imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 + cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 + imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ realBuffer_fx[k] = cplx_aux_fx; move32(); diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 80d56b2bc..2fff712f9 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -2228,7 +2228,7 @@ ivas_error acelp_core_dec_fx( #ifdef OPT_STEREO_32KBPS_V1 scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) #else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) + scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) #endif /* OPT_STEREO_32KBPS_V1 */ #endif /* OPT_AVOID_STATE_BUF_RESCALE */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index d4d38f405..4276b8146 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -6826,9 +6826,9 @@ static ivas_error renderLfeToBinaural_fx( move32(); #ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( writePtr, tmpLfeBuffer, writePtr, frame_size ); /* Q(out_q) */ -#else /* VEC_ARITH_OPT_v1 */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( writePtr, tmpLfeBuffer, writePtr, frame_size, 0 ); /* Q(out_q) */ -#endif /* VEC_ARITH_OPT_v1 */ +#endif /* VEC_ARITH_OPT_v1 */ } #endif -- GitLab From 8f822fd08d807e24616497295fb206587325de62 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 27 May 2025 14:59:03 +0200 Subject: [PATCH 0742/1310] fix compilation --- lib_com/ivas_limiter_fx.c | 2 +- lib_com/ivas_rom_com.c | 821 --------------------------- lib_com/ivas_rom_com.h | 2 - lib_com/ivas_rom_com_fx.c | 818 ++++++++++++++++++++++++++ lib_com/ivas_rom_com_fx.h | 6 + lib_com/tools_fx.c | 20 - lib_dec/ivas_dirac_dec_fx.c | 18 +- lib_dec/ivas_jbm_dec_fx.c | 8 +- lib_enc/ivas_stereo_dft_enc_itd_fx.c | 6 - lib_enc/ivas_stereo_dmx_evs_fx.c | 1 + lib_rend/ivas_rom_rend.h | 2 - lib_rend/ivas_rom_rend_fx.c | 819 -------------------------- 12 files changed, 847 insertions(+), 1676 deletions(-) diff --git a/lib_com/ivas_limiter_fx.c b/lib_com/ivas_limiter_fx.c index 4250d7a7a..60982f3f2 100644 --- a/lib_com/ivas_limiter_fx.c +++ b/lib_com/ivas_limiter_fx.c @@ -36,7 +36,7 @@ #include "prot_fx.h" #include "ivas_prot_rend_fx.h" #include "ivas_rom_rend.h" -#include "ivas_rom_com.h" +#include "ivas_rom_com_fx.h" #include "wmc_auto.h" #include #include "ivas_prot_fx.h" diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index c7977001b..5d4de33b4 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -52,827 +52,6 @@ const Word32 ivas_brate_tbl[SIZE_IVAS_BRATE_TBL] = IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k }; -/*----------------------------------------------------------------------------------* - * IVAS limiter table - *----------------------------------------------------------------------------------*/ -const Word32 release_cnst_table[4][201] = // Q31 -{ - { - 1913946752, - 1919716352, - 1925351680, - 1930855552, - 1936230784, - 1941479808, - 1946605312, - 1951609728, - 1956495744, - 1961265792, - 1965922304, - 1970467584, - 1974904320, - 1979234560, - 1983460736, - 1987585024, - 1991609856, - 1995537280, - 1999369344, - 2003108480, - 2006756480, - 2010315520, - 2013787520, - 2017174528, - 2020478464, - 2023701248, - 2026844672, - 2029910656, - 2032900992, - 2035817344, - 2038661376, - 2041435008, - 2044139648, - 2046777088, - 2049348864, - 2051856384, - 2054301440, - 2056685312, - 2059009536, - 2061275520, - 2063484672, - 2065638272, - 2067737856, - 2069784448, - 2071779584, - 2073724416, - 2075620096, - 2077467904, - 2079268992, - 2081024512, - 2082735488, - 2084403200, - 2086028416, - 2087612544, - 2089156352, - 2090660864, - 2092127104, - 2093555968, - 2094948480, - 2096305408, - 2097627776, - 2098916352, - 2100172032, - 2101395584, - 2102587776, - 2103749504, - 2104881408, - 2105984384, - 2107059072, - 2108106112, - 2109126400, - 2110120448, - 2111088896, - 2112032512, - 2112951808, - 2113847552, - 2114720128, - 2115570304, - 2116398592, - 2117205504, - 2117991552, - 2118757504, - 2119503616, - 2120230400, - 2120938496, - 2121628288, - 2122300288, - 2122954880, - 2123592576, - 2124213760, - 2124818944, - 2125408384, - 2125982592, - 2126541952, - 2127086848, - 2127617664, - 2128134656, - 2128638336, - 2129128832, - 2129606784, - 2130072192, - 2130525568, - 2130967296, - 2131397376, - 2131816448, - 2132224640, - 2132622080, - 2133009408, - 2133386496, - 2133753856, - 2134111744, - 2134460288, - 2134799744, - 2135130368, - 2135452416, - 2135766144, - 2136071680, - 2136369152, - 2136659072, - 2136941312, - 2137216256, - 2137484160, - 2137744896, - 2137998976, - 2138246400, - 2138487424, - 2138722176, - 2138950656, - 2139173376, - 2139390208, - 2139601408, - 2139807104, - 2140007424, - 2140202624, - 2140392576, - 2140577664, - 2140758016, - 2140933504, - 2141104512, - 2141271040, - 2141433216, - 2141591168, - 2141745024, - 2141894912, - 2142040832, - 2142182912, - 2142321408, - 2142456192, - 2142587392, - 2142715264, - 2142839808, - 2142961152, - 2143079296, - 2143194240, - 2143306240, - 2143415424, - 2143521664, - 2143625216, - 2143725952, - 2143824128, - 2143919744, - 2144012800, - 2144103424, - 2144191744, - 2144277760, - 2144361472, - 2144443136, - 2144522496, - 2144599936, - 2144675200, - 2144748544, - 2144820096, - 2144889600, - 2144957440, - 2145023488, - 2145087744, - 2145150336, - 2145211264, - 2145270656, - 2145328512, - 2145384832, - 2145439616, - 2145493120, - 2145545088, - 2145595776, - 2145645056, - 2145693184, - 2145739904, - 2145785472, - 2145829888, - 2145873152, - 2145915136, - 2145956224, - 2145996032, - 2146034944, - 2146072832, - 2146109696, - 2146145664, - 2146180608, - 2146214656, - 2146247808, - }, - { - 2027355264, - 2030408704, - 2033386624, - 2036290944, - 2039123328, - 2041885440, - 2044578944, - 2047205376, - 2049766528, - 2052263680, - 2054698496, - 2057072384, - 2059387008, - 2061643520, - 2063843328, - 2065987968, - 2068078720, - 2070116864, - 2072103552, - 2074040192, - 2075927936, - 2077767936, - 2079561472, - 2081309568, - 2083013376, - 2084673920, - 2086292352, - 2087869696, - 2089406976, - 2090905216, - 2092365184, - 2093788032, - 2095174528, - 2096525824, - 2097842432, - 2099125632, - 2100375808, - 2101594240, - 2102781312, - 2103938048, - 2105065216, - 2106163456, - 2107233536, - 2108276096, - 2109292032, - 2110281728, - 2111246080, - 2112185728, - 2113101056, - 2113992960, - 2114861824, - 2115708288, - 2116532992, - 2117336448, - 2118119168, - 2118881792, - 2119624704, - 2120348416, - 2121053440, - 2121740288, - 2122409344, - 2123061120, - 2123696128, - 2124314624, - 2124917120, - 2125504128, - 2126075776, - 2126632832, - 2127175296, - 2127703808, - 2128218624, - 2128720000, - 2129208448, - 2129684352, - 2130147712, - 2130599168, - 2131038976, - 2131467264, - 2131884416, - 2132290816, - 2132686592, - 2133072256, - 2133447680, - 2133813504, - 2134169856, - 2134516864, - 2134854784, - 2135184000, - 2135504640, - 2135816960, - 2136121216, - 2136417536, - 2136706048, - 2136987136, - 2137260928, - 2137527552, - 2137787264, - 2138040192, - 2138286592, - 2138526464, - 2138760192, - 2138987776, - 2139209472, - 2139425408, - 2139635712, - 2139840512, - 2140039936, - 2140234240, - 2140423424, - 2140607744, - 2140787200, - 2140962048, - 2141132288, - 2141298048, - 2141459584, - 2141616896, - 2141769984, - 2141919232, - 2142064512, - 2142205952, - 2142343808, - 2142478080, - 2142608768, - 2142736128, - 2142860032, - 2142980864, - 2143098368, - 2143212928, - 2143324544, - 2143433088, - 2143538944, - 2143641984, - 2143742336, - 2143840000, - 2143935232, - 2144027904, - 2144118144, - 2144206080, - 2144291712, - 2144375168, - 2144456320, - 2144535424, - 2144612480, - 2144687488, - 2144760448, - 2144831616, - 2144900992, - 2144968448, - 2145034112, - 2145098112, - 2145160448, - 2145221248, - 2145280256, - 2145337856, - 2145393920, - 2145448576, - 2145501696, - 2145553536, - 2145603968, - 2145653120, - 2145700992, - 2145747456, - 2145792896, - 2145837056, - 2145880064, - 2145922048, - 2145962880, - 2146002560, - 2146041344, - 2146078976, - 2146115712, - 2146151424, - 2146186240, - 2146220160, - 2146253184, - 2146285312, - 2146316672, - 2146347136, - 2146376832, - 2146405760, - 2146433920, - 2146461440, - 2146488192, - 2146514176, - 2146539520, - 2146564224, - 2146588160, - 2146611584, - 2146634368, - 2146656640, - 2146678272, - 2146699264, - 2146719744, - 2146739712, - 2146759168, - 2146778112, - 2146796544, - 2146814464, - 2146832000, - 2146849024, - 2146865664, - }, - { - 2086555136, - 2088125824, - 2089656576, - 2091148416, - 2092602240, - 2094018944, - 2095399680, - 2096745088, - 2098056192, - 2099333888, - 2100578816, - 2101792000, - 2102974080, - 2104125824, - 2105248128, - 2106341760, - 2107407232, - 2108445440, - 2109456896, - 2110442496, - 2111402624, - 2112338176, - 2113249664, - 2114137728, - 2115002880, - 2115845760, - 2116666880, - 2117466880, - 2118246272, - 2119005568, - 2119745280, - 2120465920, - 2121167872, - 2121851776, - 2122517888, - 2123166976, - 2123799168, - 2124414976, - 2125014912, - 2125599360, - 2126168704, - 2126723200, - 2127263360, - 2127789568, - 2128302208, - 2128801408, - 2129287808, - 2129761536, - 2130222976, - 2130672512, - 2131110272, - 2131536768, - 2131952128, - 2132356736, - 2132750848, - 2133134720, - 2133508736, - 2133872896, - 2134227584, - 2134573184, - 2134909696, - 2135237504, - 2135556736, - 2135867648, - 2136170624, - 2136465536, - 2136752896, - 2137032832, - 2137305344, - 2137570816, - 2137829376, - 2138081280, - 2138326528, - 2138565504, - 2138798080, - 2139024768, - 2139245440, - 2139460480, - 2139669888, - 2139873792, - 2140072320, - 2140265856, - 2140454144, - 2140637696, - 2140816384, - 2140990464, - 2141159936, - 2141325056, - 2141485824, - 2141642368, - 2141794944, - 2141943424, - 2142088064, - 2142228992, - 2142366208, - 2142499840, - 2142630016, - 2142756736, - 2142880128, - 2143000448, - 2143117440, - 2143231488, - 2143342592, - 2143450752, - 2143556096, - 2143658624, - 2143758592, - 2143855872, - 2143950592, - 2144043008, - 2144132864, - 2144220416, - 2144305664, - 2144388608, - 2144469504, - 2144548224, - 2144624896, - 2144699648, - 2144772352, - 2144843264, - 2144912256, - 2144979328, - 2145044864, - 2145108480, - 2145170560, - 2145231104, - 2145289856, - 2145347200, - 2145403008, - 2145457408, - 2145510400, - 2145561984, - 2145612160, - 2145661056, - 2145708672, - 2145755136, - 2145800192, - 2145844224, - 2145887104, - 2145928832, - 2145969408, - 2146008960, - 2146047616, - 2146085120, - 2146121600, - 2146157184, - 2146191872, - 2146225664, - 2146258560, - 2146290560, - 2146321792, - 2146352128, - 2146381696, - 2146410496, - 2146438528, - 2146465920, - 2146492416, - 2146518400, - 2146543616, - 2146568192, - 2146592128, - 2146615424, - 2146638080, - 2146660224, - 2146681728, - 2146702720, - 2146723072, - 2146743040, - 2146762368, - 2146781184, - 2146799616, - 2146817408, - 2146834816, - 2146851840, - 2146868352, - 2146884352, - 2146900096, - 2146915328, - 2146930176, - 2146944640, - 2146958720, - 2146972416, - 2146985856, - 2146998784, - 2147011456, - 2147023872, - 2147035904, - 2147047552, - 2147058944, - 2147070080, - 2147080832, - 2147091456, - 2147101696, - 2147111680, - 2147121408, - 2147130880, - 2147140096, - 2147149056, - 2147157760, - 2147166336, - 2147174656, - }, - { - 2106670080, - 2107727232, - 2108757120, - 2109760640, - 2110738432, - 2111691008, - 2112619136, - 2113523328, - 2114404352, - 2115262592, - 2116098816, - 2116913408, - 2117707136, - 2118480256, - 2119233536, - 2119967360, - 2120682240, - 2121378688, - 2122057088, - 2122717952, - 2123361792, - 2123988992, - 2124599936, - 2125195136, - 2125774848, - 2126339584, - 2126889728, - 2127425536, - 2127947520, - 2128456064, - 2128951296, - 2129433856, - 2129903744, - 2130361600, - 2130807424, - 2131241728, - 2131664768, - 2132076928, - 2132478208, - 2132869248, - 2133250048, - 2133620992, - 2133982208, - 2134334080, - 2134676864, - 2135010688, - 2135335936, - 2135652608, - 2135961088, - 2136261504, - 2136554112, - 2136839168, - 2137116800, - 2137387136, - 2137650560, - 2137907072, - 2138156928, - 2138400256, - 2138637184, - 2138867968, - 2139092864, - 2139311744, - 2139524992, - 2139732736, - 2139934976, - 2140131968, - 2140323840, - 2140510720, - 2140692736, - 2140870016, - 2141042688, - 2141210752, - 2141374592, - 2141534080, - 2141689344, - 2141840640, - 2141987968, - 2142131456, - 2142271232, - 2142407424, - 2142539904, - 2142669056, - 2142794752, - 2142917248, - 2143036544, - 2143152640, - 2143265792, - 2143375872, - 2143483264, - 2143587712, - 2143689472, - 2143788544, - 2143885056, - 2143979136, - 2144070656, - 2144159872, - 2144246656, - 2144331264, - 2144413568, - 2144493824, - 2144571904, - 2144647936, - 2144722048, - 2144794240, - 2144864512, - 2144932864, - 2144999552, - 2145064448, - 2145127680, - 2145189248, - 2145249152, - 2145307520, - 2145364480, - 2145419776, - 2145473792, - 2145526272, - 2145577472, - 2145627264, - 2145675776, - 2145723008, - 2145768960, - 2145813760, - 2145857408, - 2145899904, - 2145941376, - 2145981696, - 2146020864, - 2146059136, - 2146096384, - 2146132608, - 2146167936, - 2146202368, - 2146235776, - 2146268416, - 2146300160, - 2146331136, - 2146361216, - 2146390528, - 2146419200, - 2146446976, - 2146474112, - 2146500480, - 2146526208, - 2146551168, - 2146575488, - 2146599296, - 2146622464, - 2146644864, - 2146666880, - 2146688128, - 2146708992, - 2146729216, - 2146748928, - 2146768128, - 2146786816, - 2146805120, - 2146822784, - 2146840064, - 2146856960, - 2146873344, - 2146889216, - 2146904832, - 2146919936, - 2146934656, - 2146948992, - 2146962944, - 2146976640, - 2146989824, - 2147002752, - 2147015296, - 2147027584, - 2147039488, - 2147051136, - 2147062400, - 2147073408, - 2147084160, - 2147094528, - 2147104768, - 2147114624, - 2147124352, - 2147133696, - 2147142912, - 2147151744, - 2147160448, - 2147168896, - 2147177088, - 2147185152, - 2147192960, - 2147200512, - 2147207936, - 2147215104, - 2147222144, - 2147229056, - 2147235712, - 2147242112, - 2147248384, - 2147254656, - 2147260544, - 2147266432, - 2147272064, - 2147277568, - }, - - -}; - /*------------------------------------------------------------------------- * DFT Stereo ROM tables *------------------------------------------------------------------------*/ diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 6cd11215d..865382410 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -327,7 +327,5 @@ extern const Word16 sns_1st_means_32k[2][16]; extern const Word16 ivas_param_upmx_mx_qmap[33]; -extern const Word32 release_cnst_table[4][201]; // Q31 - /* IVAS_ROM_COM_H */ #endif diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index e7ee30e8d..3d85f546f 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -5125,4 +5125,822 @@ const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN] = { }; +const Word32 release_cnst_table[4][201] = // Q31 + { + { + 1913946752, + 1919716352, + 1925351680, + 1930855552, + 1936230784, + 1941479808, + 1946605312, + 1951609728, + 1956495744, + 1961265792, + 1965922304, + 1970467584, + 1974904320, + 1979234560, + 1983460736, + 1987585024, + 1991609856, + 1995537280, + 1999369344, + 2003108480, + 2006756480, + 2010315520, + 2013787520, + 2017174528, + 2020478464, + 2023701248, + 2026844672, + 2029910656, + 2032900992, + 2035817344, + 2038661376, + 2041435008, + 2044139648, + 2046777088, + 2049348864, + 2051856384, + 2054301440, + 2056685312, + 2059009536, + 2061275520, + 2063484672, + 2065638272, + 2067737856, + 2069784448, + 2071779584, + 2073724416, + 2075620096, + 2077467904, + 2079268992, + 2081024512, + 2082735488, + 2084403200, + 2086028416, + 2087612544, + 2089156352, + 2090660864, + 2092127104, + 2093555968, + 2094948480, + 2096305408, + 2097627776, + 2098916352, + 2100172032, + 2101395584, + 2102587776, + 2103749504, + 2104881408, + 2105984384, + 2107059072, + 2108106112, + 2109126400, + 2110120448, + 2111088896, + 2112032512, + 2112951808, + 2113847552, + 2114720128, + 2115570304, + 2116398592, + 2117205504, + 2117991552, + 2118757504, + 2119503616, + 2120230400, + 2120938496, + 2121628288, + 2122300288, + 2122954880, + 2123592576, + 2124213760, + 2124818944, + 2125408384, + 2125982592, + 2126541952, + 2127086848, + 2127617664, + 2128134656, + 2128638336, + 2129128832, + 2129606784, + 2130072192, + 2130525568, + 2130967296, + 2131397376, + 2131816448, + 2132224640, + 2132622080, + 2133009408, + 2133386496, + 2133753856, + 2134111744, + 2134460288, + 2134799744, + 2135130368, + 2135452416, + 2135766144, + 2136071680, + 2136369152, + 2136659072, + 2136941312, + 2137216256, + 2137484160, + 2137744896, + 2137998976, + 2138246400, + 2138487424, + 2138722176, + 2138950656, + 2139173376, + 2139390208, + 2139601408, + 2139807104, + 2140007424, + 2140202624, + 2140392576, + 2140577664, + 2140758016, + 2140933504, + 2141104512, + 2141271040, + 2141433216, + 2141591168, + 2141745024, + 2141894912, + 2142040832, + 2142182912, + 2142321408, + 2142456192, + 2142587392, + 2142715264, + 2142839808, + 2142961152, + 2143079296, + 2143194240, + 2143306240, + 2143415424, + 2143521664, + 2143625216, + 2143725952, + 2143824128, + 2143919744, + 2144012800, + 2144103424, + 2144191744, + 2144277760, + 2144361472, + 2144443136, + 2144522496, + 2144599936, + 2144675200, + 2144748544, + 2144820096, + 2144889600, + 2144957440, + 2145023488, + 2145087744, + 2145150336, + 2145211264, + 2145270656, + 2145328512, + 2145384832, + 2145439616, + 2145493120, + 2145545088, + 2145595776, + 2145645056, + 2145693184, + 2145739904, + 2145785472, + 2145829888, + 2145873152, + 2145915136, + 2145956224, + 2145996032, + 2146034944, + 2146072832, + 2146109696, + 2146145664, + 2146180608, + 2146214656, + 2146247808, + }, + { + 2027355264, + 2030408704, + 2033386624, + 2036290944, + 2039123328, + 2041885440, + 2044578944, + 2047205376, + 2049766528, + 2052263680, + 2054698496, + 2057072384, + 2059387008, + 2061643520, + 2063843328, + 2065987968, + 2068078720, + 2070116864, + 2072103552, + 2074040192, + 2075927936, + 2077767936, + 2079561472, + 2081309568, + 2083013376, + 2084673920, + 2086292352, + 2087869696, + 2089406976, + 2090905216, + 2092365184, + 2093788032, + 2095174528, + 2096525824, + 2097842432, + 2099125632, + 2100375808, + 2101594240, + 2102781312, + 2103938048, + 2105065216, + 2106163456, + 2107233536, + 2108276096, + 2109292032, + 2110281728, + 2111246080, + 2112185728, + 2113101056, + 2113992960, + 2114861824, + 2115708288, + 2116532992, + 2117336448, + 2118119168, + 2118881792, + 2119624704, + 2120348416, + 2121053440, + 2121740288, + 2122409344, + 2123061120, + 2123696128, + 2124314624, + 2124917120, + 2125504128, + 2126075776, + 2126632832, + 2127175296, + 2127703808, + 2128218624, + 2128720000, + 2129208448, + 2129684352, + 2130147712, + 2130599168, + 2131038976, + 2131467264, + 2131884416, + 2132290816, + 2132686592, + 2133072256, + 2133447680, + 2133813504, + 2134169856, + 2134516864, + 2134854784, + 2135184000, + 2135504640, + 2135816960, + 2136121216, + 2136417536, + 2136706048, + 2136987136, + 2137260928, + 2137527552, + 2137787264, + 2138040192, + 2138286592, + 2138526464, + 2138760192, + 2138987776, + 2139209472, + 2139425408, + 2139635712, + 2139840512, + 2140039936, + 2140234240, + 2140423424, + 2140607744, + 2140787200, + 2140962048, + 2141132288, + 2141298048, + 2141459584, + 2141616896, + 2141769984, + 2141919232, + 2142064512, + 2142205952, + 2142343808, + 2142478080, + 2142608768, + 2142736128, + 2142860032, + 2142980864, + 2143098368, + 2143212928, + 2143324544, + 2143433088, + 2143538944, + 2143641984, + 2143742336, + 2143840000, + 2143935232, + 2144027904, + 2144118144, + 2144206080, + 2144291712, + 2144375168, + 2144456320, + 2144535424, + 2144612480, + 2144687488, + 2144760448, + 2144831616, + 2144900992, + 2144968448, + 2145034112, + 2145098112, + 2145160448, + 2145221248, + 2145280256, + 2145337856, + 2145393920, + 2145448576, + 2145501696, + 2145553536, + 2145603968, + 2145653120, + 2145700992, + 2145747456, + 2145792896, + 2145837056, + 2145880064, + 2145922048, + 2145962880, + 2146002560, + 2146041344, + 2146078976, + 2146115712, + 2146151424, + 2146186240, + 2146220160, + 2146253184, + 2146285312, + 2146316672, + 2146347136, + 2146376832, + 2146405760, + 2146433920, + 2146461440, + 2146488192, + 2146514176, + 2146539520, + 2146564224, + 2146588160, + 2146611584, + 2146634368, + 2146656640, + 2146678272, + 2146699264, + 2146719744, + 2146739712, + 2146759168, + 2146778112, + 2146796544, + 2146814464, + 2146832000, + 2146849024, + 2146865664, + }, + { + 2086555136, + 2088125824, + 2089656576, + 2091148416, + 2092602240, + 2094018944, + 2095399680, + 2096745088, + 2098056192, + 2099333888, + 2100578816, + 2101792000, + 2102974080, + 2104125824, + 2105248128, + 2106341760, + 2107407232, + 2108445440, + 2109456896, + 2110442496, + 2111402624, + 2112338176, + 2113249664, + 2114137728, + 2115002880, + 2115845760, + 2116666880, + 2117466880, + 2118246272, + 2119005568, + 2119745280, + 2120465920, + 2121167872, + 2121851776, + 2122517888, + 2123166976, + 2123799168, + 2124414976, + 2125014912, + 2125599360, + 2126168704, + 2126723200, + 2127263360, + 2127789568, + 2128302208, + 2128801408, + 2129287808, + 2129761536, + 2130222976, + 2130672512, + 2131110272, + 2131536768, + 2131952128, + 2132356736, + 2132750848, + 2133134720, + 2133508736, + 2133872896, + 2134227584, + 2134573184, + 2134909696, + 2135237504, + 2135556736, + 2135867648, + 2136170624, + 2136465536, + 2136752896, + 2137032832, + 2137305344, + 2137570816, + 2137829376, + 2138081280, + 2138326528, + 2138565504, + 2138798080, + 2139024768, + 2139245440, + 2139460480, + 2139669888, + 2139873792, + 2140072320, + 2140265856, + 2140454144, + 2140637696, + 2140816384, + 2140990464, + 2141159936, + 2141325056, + 2141485824, + 2141642368, + 2141794944, + 2141943424, + 2142088064, + 2142228992, + 2142366208, + 2142499840, + 2142630016, + 2142756736, + 2142880128, + 2143000448, + 2143117440, + 2143231488, + 2143342592, + 2143450752, + 2143556096, + 2143658624, + 2143758592, + 2143855872, + 2143950592, + 2144043008, + 2144132864, + 2144220416, + 2144305664, + 2144388608, + 2144469504, + 2144548224, + 2144624896, + 2144699648, + 2144772352, + 2144843264, + 2144912256, + 2144979328, + 2145044864, + 2145108480, + 2145170560, + 2145231104, + 2145289856, + 2145347200, + 2145403008, + 2145457408, + 2145510400, + 2145561984, + 2145612160, + 2145661056, + 2145708672, + 2145755136, + 2145800192, + 2145844224, + 2145887104, + 2145928832, + 2145969408, + 2146008960, + 2146047616, + 2146085120, + 2146121600, + 2146157184, + 2146191872, + 2146225664, + 2146258560, + 2146290560, + 2146321792, + 2146352128, + 2146381696, + 2146410496, + 2146438528, + 2146465920, + 2146492416, + 2146518400, + 2146543616, + 2146568192, + 2146592128, + 2146615424, + 2146638080, + 2146660224, + 2146681728, + 2146702720, + 2146723072, + 2146743040, + 2146762368, + 2146781184, + 2146799616, + 2146817408, + 2146834816, + 2146851840, + 2146868352, + 2146884352, + 2146900096, + 2146915328, + 2146930176, + 2146944640, + 2146958720, + 2146972416, + 2146985856, + 2146998784, + 2147011456, + 2147023872, + 2147035904, + 2147047552, + 2147058944, + 2147070080, + 2147080832, + 2147091456, + 2147101696, + 2147111680, + 2147121408, + 2147130880, + 2147140096, + 2147149056, + 2147157760, + 2147166336, + 2147174656, + }, + { + 2106670080, + 2107727232, + 2108757120, + 2109760640, + 2110738432, + 2111691008, + 2112619136, + 2113523328, + 2114404352, + 2115262592, + 2116098816, + 2116913408, + 2117707136, + 2118480256, + 2119233536, + 2119967360, + 2120682240, + 2121378688, + 2122057088, + 2122717952, + 2123361792, + 2123988992, + 2124599936, + 2125195136, + 2125774848, + 2126339584, + 2126889728, + 2127425536, + 2127947520, + 2128456064, + 2128951296, + 2129433856, + 2129903744, + 2130361600, + 2130807424, + 2131241728, + 2131664768, + 2132076928, + 2132478208, + 2132869248, + 2133250048, + 2133620992, + 2133982208, + 2134334080, + 2134676864, + 2135010688, + 2135335936, + 2135652608, + 2135961088, + 2136261504, + 2136554112, + 2136839168, + 2137116800, + 2137387136, + 2137650560, + 2137907072, + 2138156928, + 2138400256, + 2138637184, + 2138867968, + 2139092864, + 2139311744, + 2139524992, + 2139732736, + 2139934976, + 2140131968, + 2140323840, + 2140510720, + 2140692736, + 2140870016, + 2141042688, + 2141210752, + 2141374592, + 2141534080, + 2141689344, + 2141840640, + 2141987968, + 2142131456, + 2142271232, + 2142407424, + 2142539904, + 2142669056, + 2142794752, + 2142917248, + 2143036544, + 2143152640, + 2143265792, + 2143375872, + 2143483264, + 2143587712, + 2143689472, + 2143788544, + 2143885056, + 2143979136, + 2144070656, + 2144159872, + 2144246656, + 2144331264, + 2144413568, + 2144493824, + 2144571904, + 2144647936, + 2144722048, + 2144794240, + 2144864512, + 2144932864, + 2144999552, + 2145064448, + 2145127680, + 2145189248, + 2145249152, + 2145307520, + 2145364480, + 2145419776, + 2145473792, + 2145526272, + 2145577472, + 2145627264, + 2145675776, + 2145723008, + 2145768960, + 2145813760, + 2145857408, + 2145899904, + 2145941376, + 2145981696, + 2146020864, + 2146059136, + 2146096384, + 2146132608, + 2146167936, + 2146202368, + 2146235776, + 2146268416, + 2146300160, + 2146331136, + 2146361216, + 2146390528, + 2146419200, + 2146446976, + 2146474112, + 2146500480, + 2146526208, + 2146551168, + 2146575488, + 2146599296, + 2146622464, + 2146644864, + 2146666880, + 2146688128, + 2146708992, + 2146729216, + 2146748928, + 2146768128, + 2146786816, + 2146805120, + 2146822784, + 2146840064, + 2146856960, + 2146873344, + 2146889216, + 2146904832, + 2146919936, + 2146934656, + 2146948992, + 2146962944, + 2146976640, + 2146989824, + 2147002752, + 2147015296, + 2147027584, + 2147039488, + 2147051136, + 2147062400, + 2147073408, + 2147084160, + 2147094528, + 2147104768, + 2147114624, + 2147124352, + 2147133696, + 2147142912, + 2147151744, + 2147160448, + 2147168896, + 2147177088, + 2147185152, + 2147192960, + 2147200512, + 2147207936, + 2147215104, + 2147222144, + 2147229056, + 2147235712, + 2147242112, + 2147248384, + 2147254656, + 2147260544, + 2147266432, + 2147272064, + 2147277568, + }, + + + }; + /* clang-format on */ diff --git a/lib_com/ivas_rom_com_fx.h b/lib_com/ivas_rom_com_fx.h index 3344a35d2..54a620b15 100644 --- a/lib_com/ivas_rom_com_fx.h +++ b/lib_com/ivas_rom_com_fx.h @@ -292,4 +292,10 @@ extern const Word32 ivas_fb_fr_12band_1ms_re_fx[IVAS_FB_12_1MS_LEN]; extern const Word32 ivas_fb_fr_12band_1ms_im_fx[IVAS_FB_12_1MS_LEN]; +/*----------------------------------------------------------------------* + * Limiter tables + *-----------------------------------------------------------------------*/ + +extern const Word32 release_cnst_table[4][201]; // Q31 + #endif diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 77e779efd..8d205a318 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -241,26 +241,6 @@ void fix2f_16( Word16 *var_fix, float *var_flt, Word32 expo ) #undef WMC_TOOL_SKIP -Word16 norm_ul( UWord32 UL_var1 ) -{ - Word16 var_out; - - if ( UL_var1 == 0 ) - { - var_out = 0; - } - else - { - for ( var_out = 0; UL_var1 < (UWord32) 0x80000000U; var_out++ ) - { - UL_var1 <<= 1; - } - } - BASOP_CHECK(); - - return ( var_out ); -} - /*-------------------------------------------------------------------* * usdequant_fx() * diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 43972fdb4..185317332 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1918,8 +1918,8 @@ void ivas_qmetadata_to_dirac_fx( } /* for ( block =...) */ - } /* for ( band = ...) */ - } /* for ( idx_sec = ...)*/ + } /* for ( band = ...) */ + } /* for ( idx_sec = ...)*/ /* Bands not transmitted -> zeroed*/ FOR( b = band_grouping[band]; b < hSpatParamRendCom->num_freq_bands; b++ ) @@ -2296,6 +2296,19 @@ void ivas_dirac_dec_render_sf_fx( } } +#ifdef SPLIT_REND_WITH_HEAD_ROT + FOR( Word16 p = 0; p < MAX_HEAD_ROT_POSES; p++ ) + { + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + set32_fx( Cldfb_RealBuffer_Binaural_fx[p][i][j], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( Cldfb_RealBuffer_Binaural_fx[p][i][j], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + } +#else FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) @@ -2304,6 +2317,7 @@ void ivas_dirac_dec_render_sf_fx( set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); } } +#endif /* local copies of azi, ele, diffuseness */ Word16 azimuth[CLDFB_NO_CHANNELS_MAX]; diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index f71801085..beb6535a2 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2670,7 +2670,10 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( DECODER_TC_BUFFER_HANDLE hTcBuffer; Word32 output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; - Word16 nchan_in, nchan_out, gd_bits, n_chan_inp, i, shift; + Word16 nchan_in, nchan_out; +#ifndef SPLIT_REND_WITH_HEAD_ROT + Word16 gd_bits, shift, n_chan_inp, i; +#endif IF( !st_ivas->hDecoderConfig->Opt_tsm ) { return IVAS_ERR_OK; @@ -2791,7 +2794,6 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( { return error; } -#endif FOR( i = 0; i < n_chan_inp; i++ ) { @@ -2799,7 +2801,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( } *st_ivas->hCrendWrapper->p_io_qfactor = Q11; move16(); ->>>>>>> 2805f2da05bf6a0aa6cf155d214db90e4067f547 +#endif } } ELSE diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c index ca5079e25..1beacd19a 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c @@ -1734,12 +1734,6 @@ void stereo_dft_enc_compute_itd_fx( move32(); cng_xcorr_filt = L_max( cng_xcorr_filt, sfm_L ); // Q31 } - ELSE - { - cng_xcorr_filt = BASOP_Util_Divide3232_Scale_cadence( 8 /*10.0f * CORR_FILT*/, add( hStereoDft->expectedNumUpdates, hStereoDft->currentNumUpdates ), &cng_xcorr_filt_e ); - cng_xcorr_filt = L_shl_sat( cng_xcorr_filt, cng_xcorr_filt_e ); // Q31 - cng_xcorr_filt = L_max( L_min( CORR_FILT_Q31, cng_xcorr_filt ), sfm_L ); // Q31 - } hStereoDft->currentNumUpdates = add( hStereoDft->currentNumUpdates, 1 ); move16(); hStereoDft->sfm_fx = cng_xcorr_filt; diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 2b391aee7..8e960d71e 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -88,6 +88,7 @@ #define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 +#define STEREO_DMX_EVS_FADE_LEN_PRC_Q0 20 #define STEREO_DMX_EVS_NB_SBFRM 5 #define STEREO_DMX_EVS_TRNS_DTC_INST_Q0 75 diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index 852d0ce54..f4aecc837 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -129,8 +129,6 @@ extern const Word32 ivas_reverb_default_fc_fx[]; /*Q-16*/ extern const Word32 ivas_reverb_default_RT60_fx[]; /*Q-26*/ extern const Word32 ivas_reverb_default_DSR_fx[]; /*Q-30*/ -extern const Word32 release_cnst_table[4][201]; // Q31 - /*----------------------------------------------------------------------------------* * Renderer SBA & MC enc/dec matrices *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 0dde1aa65..75bd01756 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -563,825 +563,6 @@ const Word32 ivas_reverb_default_DSR_fx[IVAS_REVERB_DEFAULT_N_BANDS] /*Q30*/ = 66, 30, 28 }; -const Word32 release_cnst_table[4][201] = // Q31 - { - { - 1913946752, - 1919716352, - 1925351680, - 1930855552, - 1936230784, - 1941479808, - 1946605312, - 1951609728, - 1956495744, - 1961265792, - 1965922304, - 1970467584, - 1974904320, - 1979234560, - 1983460736, - 1987585024, - 1991609856, - 1995537280, - 1999369344, - 2003108480, - 2006756480, - 2010315520, - 2013787520, - 2017174528, - 2020478464, - 2023701248, - 2026844672, - 2029910656, - 2032900992, - 2035817344, - 2038661376, - 2041435008, - 2044139648, - 2046777088, - 2049348864, - 2051856384, - 2054301440, - 2056685312, - 2059009536, - 2061275520, - 2063484672, - 2065638272, - 2067737856, - 2069784448, - 2071779584, - 2073724416, - 2075620096, - 2077467904, - 2079268992, - 2081024512, - 2082735488, - 2084403200, - 2086028416, - 2087612544, - 2089156352, - 2090660864, - 2092127104, - 2093555968, - 2094948480, - 2096305408, - 2097627776, - 2098916352, - 2100172032, - 2101395584, - 2102587776, - 2103749504, - 2104881408, - 2105984384, - 2107059072, - 2108106112, - 2109126400, - 2110120448, - 2111088896, - 2112032512, - 2112951808, - 2113847552, - 2114720128, - 2115570304, - 2116398592, - 2117205504, - 2117991552, - 2118757504, - 2119503616, - 2120230400, - 2120938496, - 2121628288, - 2122300288, - 2122954880, - 2123592576, - 2124213760, - 2124818944, - 2125408384, - 2125982592, - 2126541952, - 2127086848, - 2127617664, - 2128134656, - 2128638336, - 2129128832, - 2129606784, - 2130072192, - 2130525568, - 2130967296, - 2131397376, - 2131816448, - 2132224640, - 2132622080, - 2133009408, - 2133386496, - 2133753856, - 2134111744, - 2134460288, - 2134799744, - 2135130368, - 2135452416, - 2135766144, - 2136071680, - 2136369152, - 2136659072, - 2136941312, - 2137216256, - 2137484160, - 2137744896, - 2137998976, - 2138246400, - 2138487424, - 2138722176, - 2138950656, - 2139173376, - 2139390208, - 2139601408, - 2139807104, - 2140007424, - 2140202624, - 2140392576, - 2140577664, - 2140758016, - 2140933504, - 2141104512, - 2141271040, - 2141433216, - 2141591168, - 2141745024, - 2141894912, - 2142040832, - 2142182912, - 2142321408, - 2142456192, - 2142587392, - 2142715264, - 2142839808, - 2142961152, - 2143079296, - 2143194240, - 2143306240, - 2143415424, - 2143521664, - 2143625216, - 2143725952, - 2143824128, - 2143919744, - 2144012800, - 2144103424, - 2144191744, - 2144277760, - 2144361472, - 2144443136, - 2144522496, - 2144599936, - 2144675200, - 2144748544, - 2144820096, - 2144889600, - 2144957440, - 2145023488, - 2145087744, - 2145150336, - 2145211264, - 2145270656, - 2145328512, - 2145384832, - 2145439616, - 2145493120, - 2145545088, - 2145595776, - 2145645056, - 2145693184, - 2145739904, - 2145785472, - 2145829888, - 2145873152, - 2145915136, - 2145956224, - 2145996032, - 2146034944, - 2146072832, - 2146109696, - 2146145664, - 2146180608, - 2146214656, - 2146247808, - }, - { - 2027355264, - 2030408704, - 2033386624, - 2036290944, - 2039123328, - 2041885440, - 2044578944, - 2047205376, - 2049766528, - 2052263680, - 2054698496, - 2057072384, - 2059387008, - 2061643520, - 2063843328, - 2065987968, - 2068078720, - 2070116864, - 2072103552, - 2074040192, - 2075927936, - 2077767936, - 2079561472, - 2081309568, - 2083013376, - 2084673920, - 2086292352, - 2087869696, - 2089406976, - 2090905216, - 2092365184, - 2093788032, - 2095174528, - 2096525824, - 2097842432, - 2099125632, - 2100375808, - 2101594240, - 2102781312, - 2103938048, - 2105065216, - 2106163456, - 2107233536, - 2108276096, - 2109292032, - 2110281728, - 2111246080, - 2112185728, - 2113101056, - 2113992960, - 2114861824, - 2115708288, - 2116532992, - 2117336448, - 2118119168, - 2118881792, - 2119624704, - 2120348416, - 2121053440, - 2121740288, - 2122409344, - 2123061120, - 2123696128, - 2124314624, - 2124917120, - 2125504128, - 2126075776, - 2126632832, - 2127175296, - 2127703808, - 2128218624, - 2128720000, - 2129208448, - 2129684352, - 2130147712, - 2130599168, - 2131038976, - 2131467264, - 2131884416, - 2132290816, - 2132686592, - 2133072256, - 2133447680, - 2133813504, - 2134169856, - 2134516864, - 2134854784, - 2135184000, - 2135504640, - 2135816960, - 2136121216, - 2136417536, - 2136706048, - 2136987136, - 2137260928, - 2137527552, - 2137787264, - 2138040192, - 2138286592, - 2138526464, - 2138760192, - 2138987776, - 2139209472, - 2139425408, - 2139635712, - 2139840512, - 2140039936, - 2140234240, - 2140423424, - 2140607744, - 2140787200, - 2140962048, - 2141132288, - 2141298048, - 2141459584, - 2141616896, - 2141769984, - 2141919232, - 2142064512, - 2142205952, - 2142343808, - 2142478080, - 2142608768, - 2142736128, - 2142860032, - 2142980864, - 2143098368, - 2143212928, - 2143324544, - 2143433088, - 2143538944, - 2143641984, - 2143742336, - 2143840000, - 2143935232, - 2144027904, - 2144118144, - 2144206080, - 2144291712, - 2144375168, - 2144456320, - 2144535424, - 2144612480, - 2144687488, - 2144760448, - 2144831616, - 2144900992, - 2144968448, - 2145034112, - 2145098112, - 2145160448, - 2145221248, - 2145280256, - 2145337856, - 2145393920, - 2145448576, - 2145501696, - 2145553536, - 2145603968, - 2145653120, - 2145700992, - 2145747456, - 2145792896, - 2145837056, - 2145880064, - 2145922048, - 2145962880, - 2146002560, - 2146041344, - 2146078976, - 2146115712, - 2146151424, - 2146186240, - 2146220160, - 2146253184, - 2146285312, - 2146316672, - 2146347136, - 2146376832, - 2146405760, - 2146433920, - 2146461440, - 2146488192, - 2146514176, - 2146539520, - 2146564224, - 2146588160, - 2146611584, - 2146634368, - 2146656640, - 2146678272, - 2146699264, - 2146719744, - 2146739712, - 2146759168, - 2146778112, - 2146796544, - 2146814464, - 2146832000, - 2146849024, - 2146865664, - }, - { - 2086555136, - 2088125824, - 2089656576, - 2091148416, - 2092602240, - 2094018944, - 2095399680, - 2096745088, - 2098056192, - 2099333888, - 2100578816, - 2101792000, - 2102974080, - 2104125824, - 2105248128, - 2106341760, - 2107407232, - 2108445440, - 2109456896, - 2110442496, - 2111402624, - 2112338176, - 2113249664, - 2114137728, - 2115002880, - 2115845760, - 2116666880, - 2117466880, - 2118246272, - 2119005568, - 2119745280, - 2120465920, - 2121167872, - 2121851776, - 2122517888, - 2123166976, - 2123799168, - 2124414976, - 2125014912, - 2125599360, - 2126168704, - 2126723200, - 2127263360, - 2127789568, - 2128302208, - 2128801408, - 2129287808, - 2129761536, - 2130222976, - 2130672512, - 2131110272, - 2131536768, - 2131952128, - 2132356736, - 2132750848, - 2133134720, - 2133508736, - 2133872896, - 2134227584, - 2134573184, - 2134909696, - 2135237504, - 2135556736, - 2135867648, - 2136170624, - 2136465536, - 2136752896, - 2137032832, - 2137305344, - 2137570816, - 2137829376, - 2138081280, - 2138326528, - 2138565504, - 2138798080, - 2139024768, - 2139245440, - 2139460480, - 2139669888, - 2139873792, - 2140072320, - 2140265856, - 2140454144, - 2140637696, - 2140816384, - 2140990464, - 2141159936, - 2141325056, - 2141485824, - 2141642368, - 2141794944, - 2141943424, - 2142088064, - 2142228992, - 2142366208, - 2142499840, - 2142630016, - 2142756736, - 2142880128, - 2143000448, - 2143117440, - 2143231488, - 2143342592, - 2143450752, - 2143556096, - 2143658624, - 2143758592, - 2143855872, - 2143950592, - 2144043008, - 2144132864, - 2144220416, - 2144305664, - 2144388608, - 2144469504, - 2144548224, - 2144624896, - 2144699648, - 2144772352, - 2144843264, - 2144912256, - 2144979328, - 2145044864, - 2145108480, - 2145170560, - 2145231104, - 2145289856, - 2145347200, - 2145403008, - 2145457408, - 2145510400, - 2145561984, - 2145612160, - 2145661056, - 2145708672, - 2145755136, - 2145800192, - 2145844224, - 2145887104, - 2145928832, - 2145969408, - 2146008960, - 2146047616, - 2146085120, - 2146121600, - 2146157184, - 2146191872, - 2146225664, - 2146258560, - 2146290560, - 2146321792, - 2146352128, - 2146381696, - 2146410496, - 2146438528, - 2146465920, - 2146492416, - 2146518400, - 2146543616, - 2146568192, - 2146592128, - 2146615424, - 2146638080, - 2146660224, - 2146681728, - 2146702720, - 2146723072, - 2146743040, - 2146762368, - 2146781184, - 2146799616, - 2146817408, - 2146834816, - 2146851840, - 2146868352, - 2146884352, - 2146900096, - 2146915328, - 2146930176, - 2146944640, - 2146958720, - 2146972416, - 2146985856, - 2146998784, - 2147011456, - 2147023872, - 2147035904, - 2147047552, - 2147058944, - 2147070080, - 2147080832, - 2147091456, - 2147101696, - 2147111680, - 2147121408, - 2147130880, - 2147140096, - 2147149056, - 2147157760, - 2147166336, - 2147174656, - }, - { - 2106670080, - 2107727232, - 2108757120, - 2109760640, - 2110738432, - 2111691008, - 2112619136, - 2113523328, - 2114404352, - 2115262592, - 2116098816, - 2116913408, - 2117707136, - 2118480256, - 2119233536, - 2119967360, - 2120682240, - 2121378688, - 2122057088, - 2122717952, - 2123361792, - 2123988992, - 2124599936, - 2125195136, - 2125774848, - 2126339584, - 2126889728, - 2127425536, - 2127947520, - 2128456064, - 2128951296, - 2129433856, - 2129903744, - 2130361600, - 2130807424, - 2131241728, - 2131664768, - 2132076928, - 2132478208, - 2132869248, - 2133250048, - 2133620992, - 2133982208, - 2134334080, - 2134676864, - 2135010688, - 2135335936, - 2135652608, - 2135961088, - 2136261504, - 2136554112, - 2136839168, - 2137116800, - 2137387136, - 2137650560, - 2137907072, - 2138156928, - 2138400256, - 2138637184, - 2138867968, - 2139092864, - 2139311744, - 2139524992, - 2139732736, - 2139934976, - 2140131968, - 2140323840, - 2140510720, - 2140692736, - 2140870016, - 2141042688, - 2141210752, - 2141374592, - 2141534080, - 2141689344, - 2141840640, - 2141987968, - 2142131456, - 2142271232, - 2142407424, - 2142539904, - 2142669056, - 2142794752, - 2142917248, - 2143036544, - 2143152640, - 2143265792, - 2143375872, - 2143483264, - 2143587712, - 2143689472, - 2143788544, - 2143885056, - 2143979136, - 2144070656, - 2144159872, - 2144246656, - 2144331264, - 2144413568, - 2144493824, - 2144571904, - 2144647936, - 2144722048, - 2144794240, - 2144864512, - 2144932864, - 2144999552, - 2145064448, - 2145127680, - 2145189248, - 2145249152, - 2145307520, - 2145364480, - 2145419776, - 2145473792, - 2145526272, - 2145577472, - 2145627264, - 2145675776, - 2145723008, - 2145768960, - 2145813760, - 2145857408, - 2145899904, - 2145941376, - 2145981696, - 2146020864, - 2146059136, - 2146096384, - 2146132608, - 2146167936, - 2146202368, - 2146235776, - 2146268416, - 2146300160, - 2146331136, - 2146361216, - 2146390528, - 2146419200, - 2146446976, - 2146474112, - 2146500480, - 2146526208, - 2146551168, - 2146575488, - 2146599296, - 2146622464, - 2146644864, - 2146666880, - 2146688128, - 2146708992, - 2146729216, - 2146748928, - 2146768128, - 2146786816, - 2146805120, - 2146822784, - 2146840064, - 2146856960, - 2146873344, - 2146889216, - 2146904832, - 2146919936, - 2146934656, - 2146948992, - 2146962944, - 2146976640, - 2146989824, - 2147002752, - 2147015296, - 2147027584, - 2147039488, - 2147051136, - 2147062400, - 2147073408, - 2147084160, - 2147094528, - 2147104768, - 2147114624, - 2147124352, - 2147133696, - 2147142912, - 2147151744, - 2147160448, - 2147168896, - 2147177088, - 2147185152, - 2147192960, - 2147200512, - 2147207936, - 2147215104, - 2147222144, - 2147229056, - 2147235712, - 2147242112, - 2147248384, - 2147254656, - 2147260544, - 2147266432, - 2147272064, - 2147277568, - }, - - - }; - - /*----------------------------------------------------------------------------------* * Renderer SBA & MC enc/dec matrices *----------------------------------------------------------------------------------*/ -- GitLab From 6c708dc8c7a49b947b2568226ef9ad772ed1c2e4 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 27 May 2025 15:00:52 +0200 Subject: [PATCH 0743/1310] run clang-format --- lib_dec/ivas_dirac_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 185317332..ff02d813d 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1918,8 +1918,8 @@ void ivas_qmetadata_to_dirac_fx( } /* for ( block =...) */ - } /* for ( band = ...) */ - } /* for ( idx_sec = ...)*/ + } /* for ( band = ...) */ + } /* for ( idx_sec = ...)*/ /* Bands not transmitted -> zeroed*/ FOR( b = band_grouping[band]; b < hSpatParamRendCom->num_freq_bands; b++ ) -- GitLab From 0cb138bde49f6c03365bf81495ccb16f59bb3ad0 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 27 May 2025 15:28:20 +0200 Subject: [PATCH 0744/1310] set FLOAT_REF_BRANCH to float-pc if name check if skipped --- .gitlab-ci.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e06c92b3..d630d11ba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1455,11 +1455,15 @@ split-rendering-pytest-on-merge-request: # --------------------------------------------------------------- .set-reference-for-basop-port-branch: &set-reference-for-basop-port-branch - - if [ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME = "main-pc" ] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then - - *update-scripts-repo + - if [ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME = "main-pc" ]; then + - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then + - *update-scripts-repo # a bit awkward: write to file + standard out first so that the error message is visivle in case of failure. Then fill the variable from the file - - ci/get_float_ref_branch_name.sh $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME | tee tmp_ref_branch.txt - - FLOAT_REF_BRANCH=$(cat tmp_ref_branch.txt) + - ci/get_float_ref_branch_name.sh $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME | tee tmp_ref_branch.txt + - FLOAT_REF_BRANCH=$(cat tmp_ref_branch.txt) + - else + - FLOAT_REF_BRANCH="float-pc" + - fi - fi ### jobs that check for bitexactness of fx encoder and decoder -- GitLab From 61b13180cfb63bb395a79895087e03ec3a2e1c74 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 27 May 2025 16:11:51 +0200 Subject: [PATCH 0745/1310] Changed float to Word32 in function header --- lib_rend/ivas_reverb_utils_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index dabbcfd82..bb781f282 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -65,7 +65,7 @@ typedef struct cldfb_convolver_state } cldfb_convolver_state; #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -static void ivas_reverb_set_energies( const float *avg_pwr_l, const float *avg_pwr_r, const int32_t sampling_rate, float *avg_pwr_l_out, float *avg_pwr_r_out ); +static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, const int32_t sampling_rate, float *avg_pwr_l_out, float *avg_pwr_r_out ); #else static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ); #endif -- GitLab From b4efde697c6415f8e84af5afca752f85dc3a5426 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 27 May 2025 16:43:37 +0200 Subject: [PATCH 0746/1310] fixed function reverb_set_energies --- lib_rend/ivas_reverb_utils_fx.c | 51 ++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index bb781f282..57e6960dc 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -119,7 +119,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX, fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); - const Word16 input_table_size, + const Word16 input_table_size, const Word32 *pInput_fc, // input in Q16 const Word32 *pInput_t60, // input in Q26 const Word32 *pInput_dsr, // input in Q30 @@ -308,19 +308,20 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const int16_t use_brir, #endif const int32_t sampling_rate, - Word32 *avg_pwr_left, - Word32 *avg_pwr_right ) + float *avg_pwr_left, + float *avg_pwr_right ) { int16_t freq_idx; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES float avg_pwr_left_fft[FFT_SPECTRUM_SIZE]; float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; #endif - Word32 input_fc[FFT_SPECTRUM_SIZE]; - Word32 output_fc[CLDFB_NO_CHANNELS_MAX]; -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + float input_fc[FFT_SPECTRUM_SIZE]; + +#ifndef NON_BE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif + #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const int16_t avg_pwr_len = sampling_rate == 16000 ? LR_IAC_LENGTH_NR_FC_16KHZ : LR_IAC_LENGTH_NR_FC; @@ -329,7 +330,6 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( avg_pwr_len - 1 ) ); } #else - for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ ) { input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( FFT_SPECTRUM_SIZE - 1 ) ); @@ -337,14 +337,42 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #endif #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - ivas_reverb_interpolate_acoustic_data_fx( avg_pwr_len, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right ); -#else + Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); + Word32 *avg_pwr_left_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); + Word32 *avg_pwr_right_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); + + Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); + Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); + Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); + Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); + Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); + + for ( int i = 0; i < 60; i++ ) + { + input_fc_fx[i] = (Word32) input_fc[i] * ( 1 << 16 ); + } + + for ( int i = 0; i < 257; i++ ) + { + output_fc_fx[i] = (Word32) input_fc[i] * ONE_IN_Q16; + } + + ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_l, avg_pwr_r, + CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); + + free( input_fc_fx ); + free( output_fc_fx ); + free( avg_pwr_left_fx ); + free( avg_pwr_left_e ); + free( avg_pwr_right_fx ); + free( avg_pwr_right_e ); + +#else if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) { return error; } - Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); Word32 *avg_pwr_left_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); Word32 *avg_pwr_right_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); @@ -374,6 +402,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( avg_pwr_left[i] = (float) fabs( me2f( avg_pwr_left_fx[i], avg_pwr_left_e[i] ) ); avg_pwr_right[i] = (float) fabs( me2f( avg_pwr_right_fx[i], avg_pwr_right_e[i] ) ); } + free( input_fc_fx ); free( avg_pwr_left_fft_fx ); free( avg_pwr_right_fft_fx ); @@ -384,4 +413,4 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( free( avg_pwr_right_e ); return IVAS_ERR_OK; #endif -} +} \ No newline at end of file -- GitLab From 7ca302ea72d669df9565f0890d8c7cdb9c837926 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 27 May 2025 16:49:54 +0200 Subject: [PATCH 0747/1310] fixed declarations ivas_reverb_utils --- lib_rend/ivas_reverb_utils_fx.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 57e6960dc..3be26195a 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -119,16 +119,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX, fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); - const Word16 input_table_size, - const Word32 *pInput_fc, // input in Q16 - const Word32 *pInput_t60, // input in Q26 - const Word32 *pInput_dsr, // input in Q30 - const Word16 output_table_size, - const Word32 *pOutput_fc, // Q16 - Word32 *pOutput_t60, // pOutput_t60_e - Word32 *pOutput_dsr, // pOutput_dsr_e - Word16 *pOutput_t60_e, // output e - Word16 *pOutput_dsr_e // output e + /* adjust DSR for the delay difference */ delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx ); -- GitLab From 72b541aa7d46660251538225381a3ea45650368b Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 27 May 2025 16:59:22 +0200 Subject: [PATCH 0748/1310] changed function name to ivas_reverb_open_fx(). local build successful --- lib_rend/ivas_reverb_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 44add03bd..0c991ad93 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2485,7 +2485,7 @@ ivas_error ivas_binaural_reverb_init( preDelay = 10; } - error = ivas_binaural_reverb_open( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); + error = ivas_binaural_reverb_open_fx( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); return error; } -- GitLab From d269d126b9f279baa324fafe7125f7352a8f6d41 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 27 May 2025 17:03:44 +0200 Subject: [PATCH 0749/1310] deactivated compiler switch --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index efcf2546b..8abc918af 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,7 +97,7 @@ #define NONBE_FIX_973_HODIRAC_BAND_GROUPING /* FhG: issue 973: empty parameter band in DirAC */ -#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ -- GitLab From fc47fee1306b2b89175bbeca194f4001e7b6c6df Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 27 May 2025 17:11:49 +0200 Subject: [PATCH 0750/1310] merge !1610 --- lib_dec/ivas_init_dec_fx.c | 308 ++++++++++++++++++++++++++++++++- lib_rend/ivas_output_init_fx.c | 21 ++- 2 files changed, 324 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 1517c66c3..842bdbcdc 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -42,6 +42,11 @@ #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" +#ifdef SPLIT_REND_WITH_HEAD_ROT +#include "lib_isar_pre_rend.h" +#include "isar_prot.h" +#include "isar_stat.h" +#endif /*-------------------------------------------------------------------* @@ -52,6 +57,214 @@ static ivas_error ivas_read_format( Decoder_Struct *st_ivas, Word16 *num_bits_re static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); +#ifdef SPLIT_REND_WITH_HEAD_ROT +static ivas_error ivas_dec_reconfig_split_rend( Decoder_Struct *st_ivas ); + + +/*-------------------------------------------------------------------* + * ivas_dec_reconfig_split_rend() + * + * IVAS decoder split rend reconfig + *-------------------------------------------------------------------*/ + +static ivas_error ivas_dec_reconfig_split_rend( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +) +{ + ivas_error error; + Word16 cldfb_in_flag, num_ch, ch, isCldfbNeeded, i, pcm_out_flag; + SPLIT_REND_WRAPPER *hSplitRendWrapper; + + hSplitRendWrapper = &st_ivas->hSplitBinRend->splitrend; + move16(); + pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; + move16(); + cldfb_in_flag = 0; + move16(); + + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + cldfb_in_flag = 1; + move16(); + } + + ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &hSplitRendWrapper->multiBinPoseData, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->sr_pose_pred_axis : DEFAULT_AXIS ); + + isCldfbNeeded = 0; + move16(); + + IF( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) || + ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) + { + cldfb_in_flag = 0; + move16(); + } + + IF( NE_16( st_ivas->renderer_type, RENDERER_DISABLE ) ) + { + IF( EQ_16( cldfb_in_flag, 0 ) ) + { + isCldfbNeeded = 1; + move16(); + } + ELSE IF( EQ_16( st_ivas->hRenderConfig->split_rend_config.codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) && cldfb_in_flag ) + { + isCldfbNeeded = 1; + move16(); + } + ELSE IF( pcm_out_flag && cldfb_in_flag ) + { + isCldfbNeeded = 1; + move16(); + } + } + ELSE IF( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + isCldfbNeeded = 1; + move16(); + } + + IF( EQ_16( isCldfbNeeded, 1 ) && hSplitRendWrapper->hCldfbHandles == NULL ) + { + IF( ( hSplitRendWrapper->hCldfbHandles = (CLDFB_HANDLES_WRAPPER_HANDLE) malloc( sizeof( CLDFB_HANDLES_WRAPPER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CLDFB handles\n" ) ); + } + + num_ch = i_mult( MAX_HEAD_ROT_POSES, BINAURAL_CHANNELS ); + move16(); + FOR( ch = 0; ch < num_ch; ch++ ) + { + hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] = NULL; + move16(); + } + + num_ch = i_mult( hSplitRendWrapper->multiBinPoseData.num_poses, BINAURAL_CHANNELS ); + move16(); + + FOR( ch = 0; ch < num_ch; ch++ ) + { + IF( ( error = openCldfb_ivas_fx( &( hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] ), CLDFB_ANALYSIS, st_ivas->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not open CLDFB handles\n" ) ); + } + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + if ( ( error = openCldfb_ivas_fx( &( hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] ), CLDFB_SYNTHESIS, st_ivas->hDecoderConfig->output_Fs, CLDFB_PROTOTYPE_5_00MS, DEC ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + ELSE IF( EQ_16( isCldfbNeeded, 0 ) && hSplitRendWrapper->hCldfbHandles != NULL ) + { + num_ch = i_mult( MAX_HEAD_ROT_POSES, BINAURAL_CHANNELS ); + move16(); + FOR( ch = 0; ch < num_ch; ch++ ) + { + IF( hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] != NULL ) + { + deleteCldfb_ivas_fx( &hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] ); + hSplitRendWrapper->hCldfbHandles->cldfbAna[ch] = NULL; + move32(); + } + } + + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + IF( hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] != NULL ) + { + deleteCldfb_ivas_fx( &hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] ); + hSplitRendWrapper->hCldfbHandles->cldfbSyn[ch] = NULL; + move32(); + } + } + + free( hSplitRendWrapper->hCldfbHandles ); + hSplitRendWrapper->hCldfbHandles = NULL; + move32(); + } + + IF( ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) && + ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && + !( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) /* td-rend not needed? */ + { + FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + IF( st_ivas->hTdRendHandles[i] != NULL ) + { + st_ivas->hTdRendHandles[i]->HrFiltSet_p = NULL; + move32(); + ivas_td_binaural_close_fx( &st_ivas->hTdRendHandles[i] ); + } + } + } + + return IVAS_ERR_OK; +} + + +/*-------------------------------------------------------------------* + * ivas_dec_init_split_rend() + * + * IVAS decoder split rend init + *-------------------------------------------------------------------*/ + +static ivas_error ivas_dec_init_split_rend( + Decoder_Struct *st_ivas /* i : IVAS decoder structure */ +) +{ + ivas_error error; + Word16 cldfb_in_flag, pcm_out_flag; + Word16 mixed_td_cldfb_flag; + + pcm_out_flag = ( st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0; + cldfb_in_flag = 0; + move16(); + + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || + EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + cldfb_in_flag = 1; + move16(); + } + + ISAR_PRE_REND_GetMultiBinPoseData( &st_ivas->hRenderConfig->split_rend_config, &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->sr_pose_pred_axis : DEFAULT_AXIS ); + + IF( EQ_16( cldfb_in_flag, 1 ) && ( EQ_16( st_ivas->hSplitBinRend->splitrend.multiBinPoseData.poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) ) + { + IF( ( st_ivas->hSplitBinRend->hCldfbDataOut = (ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA_HANDLE) malloc( sizeof( ISAR_DEC_SPLIT_REND_CLDFB_OUT_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for cldfb data out buffer\n" ) ); + } + } + + mixed_td_cldfb_flag = 0; + move16(); + IF( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) || + ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) ) + { + mixed_td_cldfb_flag = 1; + move16(); + } + +#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS + error = ISAR_PRE_REND_open( &st_ivas->hSplitBinRend->splitrend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hDecoderConfig->output_Fs, cldfb_in_flag, pcm_out_flag, st_ivas->hDecoderConfig->render_framesize, mixed_td_cldfb_flag ); + move16(); +#else + error = ISAR_PRE_REND_open( &st_ivas->hSplitBinRend->splitrend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hDecoderConfig->output_Fs, cldfb_in_flag, pcm_out_flag, (int16_t) st_ivas->hDecoderConfig->render_framesize, mixed_td_cldfb_flag ); + move16(); +#endif + return error; +} +#endif /*-------------------------------------------------------------------* * ivas_dec_setup() @@ -521,6 +734,19 @@ ivas_error ivas_dec_setup( } } +#ifdef SPLIT_REND_WITH_HEAD_ROT + /*-----------------------------------------------------------------* + * reconfig split rendering as renderer might change after bitrate switching + *-----------------------------------------------------------------*/ + + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + if ( ( error = ivas_dec_reconfig_split_rend( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif /*----------------------------------------------------------------* * Reset bitstream pointers @@ -956,7 +1182,12 @@ ivas_error ivas_init_decoder_front( *--------------------------------------------------------------------*/ test(); test(); +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) +#else IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#endif { IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) { @@ -1131,6 +1362,20 @@ ivas_error ivas_init_decoder_fx( } } +#ifdef SPLIT_REND_WITH_HEAD_ROT + /*-----------------------------------------------------------------* + * Initialize binuaral split rendering + *-----------------------------------------------------------------*/ + + IF( st_ivas->hSplitBinRend != NULL && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan && EQ_16( st_ivas->hRenderConfig->split_rend_config.dof, 0 ) ) ) ) + { + IF( ( error = ivas_dec_init_split_rend( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles @@ -1321,7 +1566,7 @@ ivas_error ivas_init_decoder_fx( } ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); move16(); @@ -1511,7 +1756,7 @@ ivas_error ivas_init_decoder_fx( } ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); } FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) @@ -2067,9 +2312,15 @@ ivas_error ivas_init_decoder_fx( } } +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), + IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -2233,6 +2484,9 @@ ivas_error ivas_init_decoder_fx( { IF( st_ivas->hBinRenderer->render_lfe ) { +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( NE_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) +#endif { /* Account for filterbank delay */ binauralization_delay_ns = L_add( binauralization_delay_ns, IVAS_FB_DEC_DELAY_NS ); @@ -2582,7 +2836,14 @@ void ivas_initialize_handles_dec( /* rendering handles */ st_ivas->hBinRenderer = NULL; +#ifdef SPLIT_REND_WITH_HEAD_ROT + for ( i = 0; i < MAX_HEAD_ROT_POSES; i++ ) + { + st_ivas->hDiracDecBin[i] = NULL; + } +#else st_ivas->hDiracDecBin = NULL; +#endif st_ivas->hDirACRend = NULL; st_ivas->hSpatParamRendCom = NULL; st_ivas->hLsSetUpConversion = NULL; @@ -2607,7 +2868,13 @@ void ivas_initialize_handles_dec( st_ivas->hExtOrientationData = NULL; st_ivas->hCombinedOrientationData = NULL; - +#ifdef SPLIT_REND_WITH_HEAD_ROT + st_ivas->hSplitBinRend = NULL; + for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + st_ivas->hTdRendHandles[i] = NULL; + } +#endif /* JBM handles */ st_ivas->hTcBuffer = NULL; st_ivas->hJbmMetadata = NULL; @@ -2744,12 +3011,31 @@ void ivas_destroy_dec_fx( /* Fastconv binaural renderer handle */ ivas_binRenderer_close_fx( &st_ivas->hBinRenderer ); +#ifdef SPLIT_REND_WITH_HEAD_ROT + /* TD binaural renderer handles */ + for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) + { + if ( st_ivas->hTdRendHandles[i] != NULL ) + { + st_ivas->hTdRendHandles[i]->HrFiltSet_p = NULL; + ivas_td_binaural_close_fx( &st_ivas->hTdRendHandles[i] ); + } + } +#endif + /* Parametric binaural renderer handle */ +#ifdef SPLIT_REND_WITH_HEAD_ROT + ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); +#else ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); +#endif /* Crend handle */ - +#ifdef SPLIT_REND_WITH_HEAD_ROT + ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ), ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ); +#else ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); +#endif /* Reverb handle */ ivas_reverb_close( &st_ivas->hReverb ); @@ -2915,7 +3201,11 @@ void ivas_init_dec_get_num_cldfb_instances( move16(); } } +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( st_ivas->hDiracDecBin[0]->useTdDecorr ) +#else IF( st_ivas->hDiracDecBin->useTdDecorr ) +#endif { *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); move16(); @@ -3468,12 +3758,22 @@ static ivas_error doSanityChecks_IVAS( } } +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && NE_32( output_Fs, 48000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); + } +#endif IF( st_ivas->hDecoderConfig->Opt_Headrotation ) { test(); test(); +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) +#else IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) +#endif { return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); } diff --git a/lib_rend/ivas_output_init_fx.c b/lib_rend/ivas_output_init_fx.c index 057161c7c..7bcf6e37d 100644 --- a/lib_rend/ivas_output_init_fx.c +++ b/lib_rend/ivas_output_init_fx.c @@ -100,6 +100,10 @@ Word16 audioCfg2channels( move16(); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: +#ifdef SPLIT_REND_WITH_HEAD_ROT + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: +#endif case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: nchan_out = 2; @@ -266,6 +270,10 @@ void ivas_output_init( move16(); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: +#ifdef SPLIT_REND_WITH_HEAD_ROT + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: + case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: +#endif case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: case IVAS_AUDIO_CONFIG_ISM1: @@ -370,7 +378,12 @@ Word16 ivas_get_nchan_buffers_dec( { nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); } - ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + ELSE if ( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) +#ifdef SPLIT_REND_WITH_HEAD_ROT + || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) +#endif + ) { nchan_out_buff = shl( CPE_CHANNELS, 1 ); } @@ -451,6 +464,12 @@ Word16 ivas_get_nchan_buffers_dec( } } +#ifdef SPLIT_REND_WITH_HEAD_ROT + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + { + nchan_out_buff = max( nchan_out_buff, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses * BINAURAL_CHANNELS ); + } +#endif return nchan_out_buff; } -- GitLab From 6f5f8204c758fecf133dacde4d169cb71788fc83 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 27 May 2025 17:18:18 +0200 Subject: [PATCH 0751/1310] applied patch to fix clang editing --- lib_rend/ivas_reverb_utils_fx.c | 2 +- lib_util/hrtf_file_reader.c | 46 ++++++++++++++++----------------- lib_util/hrtf_file_reader.h | 4 +-- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 3be26195a..689670477 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -404,4 +404,4 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( free( avg_pwr_right_e ); return IVAS_ERR_OK; #endif -} \ No newline at end of file +} diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index c34eaf220..7a74e8e88 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1322,12 +1322,12 @@ static ivas_error create_HRTF_from_rawdata( hrtf_data_rptr += sizeof( float ); } #else - for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) - { - //( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); - ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); - hrtf_data_rptr += sizeof( float ); - } + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + //( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); + ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); + hrtf_data_rptr += sizeof( float ); + } #endif /* max_total_num_fsamp_per_iteration */ max_total_num_fsamp_per_iteration = *( (UWord16 *) ( hrtf_data_rptr ) ); @@ -1475,7 +1475,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES HRTF_READER_RENDERER_TYPE rend_type, /* i : Renderer type */ #else - RENDERER_TYPE rend_type, /* i : Renderer type */ + RENDERER_TYPE rend_type, /* i : Renderer type */ #endif BINAURAL_INPUT_AUDIO_CONFIG input_cfg /* i : Input binaural config */ ) @@ -1512,7 +1512,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "renderer type not compliant" ); } #else - ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, rend_type, ( *hHRTF )->allocate_init_flag ); + ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, rend_type, ( *hHRTF )->allocate_init_flag ); #endif hrtf_data_rptr = hrtf_data; @@ -1530,7 +1530,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #else - if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #endif { f_tmp = *( (float *) ( hrtf_data_rptr ) ); @@ -1596,7 +1596,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #endif { /* HRIR_HOA3 */ @@ -1663,7 +1663,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) #endif { /* HRIR_HOA2 */ @@ -1731,7 +1731,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) #endif { /* HRIR_FOA */ @@ -1800,7 +1800,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) + else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #endif { f_tmp = *( (float *) ( hrtf_data_rptr ) ); @@ -1882,13 +1882,13 @@ static ivas_error create_fastconv_HRTF_from_rawdata( hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #else - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); + memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #endif } @@ -1948,7 +1948,7 @@ ivas_error load_fastconv_HRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) ) #else - if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) #endif { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) @@ -2122,7 +2122,7 @@ ivas_error load_parambin_HRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ #else - if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ + if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ #endif { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) @@ -2216,7 +2216,7 @@ ivas_error create_SetOfHRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV ) #else - if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) + if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) #endif { if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) @@ -2239,7 +2239,7 @@ ivas_error create_SetOfHRTF_from_binary( #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES else if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM ) #else - else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) #endif { if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 302a90dee..14ac33e9d 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -107,8 +107,8 @@ ivas_error load_reverb_binary( int32_t sampleRate, /* i : sample rate */ #else IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ -#endif - const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ +#endif + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); #endif -- GitLab From 49308ae4d1d49b906de1a68bc35cbb0de68d3b6e Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 27 May 2025 17:55:01 +0200 Subject: [PATCH 0752/1310] Increase range for norm_arr() analysis for syn_Overl and old_out_fx. Skip scaling xn_buf_fx in cases where it is not applicable. --- lib_dec/dec_tcx_fx.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 579d89968..1d35db9cc 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2588,13 +2588,15 @@ static Word16 IMDCT_ivas_fx_calc_qwin( const Word16 L_frameTCX, const Word16 FB_flag ) { - Word16 oldLength; + Word16 oldLength, t; oldLength = s_min( L_FRAME32k, L_frame ); + t = L_FRAME32k; move16(); if ( FB_flag ) { oldLength = s_min( L_FRAME48k, L_frameTCX ); + t = L_FRAME48k; move16(); } @@ -2603,10 +2605,18 @@ static Word16 IMDCT_ivas_fx_calc_qwin( // q_win == norm + Q_syn_Overl_TDAC q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, oldLength / 2 ) + Q_syn_Overl_TDAC ); - q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); + //q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); + q_win = s_min( q_win, norm_arr( syn_Overl, t / 2 ) + Q_syn_Overl ); q_win = s_min( q_win, norm_arr( old_syn_Overl, oldLength / 2 ) + Q_old_syn_Overl ); - q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); + //q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); + q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); +#if 0 + set16_zero_fx(syn_Overl_TDAC + oldLength / 2, (t-oldLength)/2 ); + //set16_zero_fx(syn_Overl + oldLength / 2, (t-oldLength)/2 ); + set16_zero_fx(old_syn_Overl + oldLength / 2, (t-oldLength)/2 ); + //set16_zero_fx(old_out_fx + oldLength, (t-oldLength) ); +#endif q_win = s_max( -3, sub( q_win, 2 ) ); return q_win; @@ -2637,9 +2647,11 @@ static void IMDCT_ivas_fx_rescale( } #if 1 - Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( q_win, *q_xn_buf_fx ) ); - *q_xn_buf_fx = q_win; - move16(); + IF ( xn_buf_fx != NULL ) { + Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( q_win, *q_xn_buf_fx ) ); + *q_xn_buf_fx = q_win; + move16(); + } Scale_sig( syn_Overl_TDAC, oldLength / 2, sub( q_win, *Q_syn_Overl_TDAC ) ); // st->hTcxDec->Q_syn_Overl_TDAC -> q_win *Q_syn_Overl_TDAC = q_win; move16(); @@ -3346,7 +3358,7 @@ void IMDCT_ivas_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN // q_win < norm + q_tmp_fx_32 - 16 q_win = s_min( q_win, L_norm_arr( tmp_fx_32, L_frame ) + q_tmp_fx_32 - 16 ); - IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( NULL, NULL, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 diff = sub( q_tmp_fx_32, q_win ); @@ -3410,7 +3422,7 @@ void IMDCT_ivas_fx( // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 2 ); } - IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( NULL, NULL, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 q_diff = sub( q_xn_buf_fx_32, q_win ); -- GitLab From 812204af885a47f6bb9cb07b2b9ada632c864f58 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 27 May 2025 17:58:06 +0200 Subject: [PATCH 0753/1310] clang format --- lib_dec/dec_tcx_fx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 1d35db9cc..172f32685 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2605,10 +2605,10 @@ static Word16 IMDCT_ivas_fx_calc_qwin( // q_win == norm + Q_syn_Overl_TDAC q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, oldLength / 2 ) + Q_syn_Overl_TDAC ); - //q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); + // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); q_win = s_min( q_win, norm_arr( syn_Overl, t / 2 ) + Q_syn_Overl ); q_win = s_min( q_win, norm_arr( old_syn_Overl, oldLength / 2 ) + Q_old_syn_Overl ); - //q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); + // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); #if 0 @@ -2647,7 +2647,8 @@ static void IMDCT_ivas_fx_rescale( } #if 1 - IF ( xn_buf_fx != NULL ) { + IF( xn_buf_fx != NULL ) + { Scale_sig( xn_buf_fx, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX, sub( q_win, *q_xn_buf_fx ) ); *q_xn_buf_fx = q_win; move16(); -- GitLab From 966a2204943bc48070efc527da4c43202d3193a5 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 27 May 2025 18:02:25 +0200 Subject: [PATCH 0754/1310] fix missing #ifdef --- lib_dec/ivas_init_dec_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 842bdbcdc..fea9c5b97 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -2267,7 +2267,11 @@ ivas_error ivas_init_decoder_fx( move16(); } +#ifdef NONBE_FIX_978_MC_TDREND_REVERB + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#else IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#endif { IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { -- GitLab From 3f865db7ccf62c5f370c6f27d1e9816121f051e6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 27 May 2025 22:42:16 +0530 Subject: [PATCH 0755/1310] Precision improvement changes to improve the vad flag selection --- lib_enc/analy_sp_fx.c | 33 ++++++++++++++------------- lib_enc/ivas_core_pre_proc_front_fx.c | 7 +++--- lib_enc/ivas_front_vad_fx.c | 2 +- lib_enc/nois_est_fx.c | 26 ++++++++++----------- lib_enc/prot_fx_enc.h | 2 +- lib_enc/stat_enc.h | 1 + 6 files changed, 36 insertions(+), 35 deletions(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 7062a3090..dbd656dec 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -569,6 +569,8 @@ void ivas_analy_sp_fx( *Etot = L_shl( Ltmp, Q24 - Q21 ); // Q24 move16(); } + *q_band_energies = *q_fr_bands; + move16(); } ELSE { @@ -578,10 +580,10 @@ void ivas_analy_sp_fx( set32_fx( lf_E, 0, 2 * VOIC_BINS ); set32_fx( band_energies, 0, 2 * NB_BANDS ); set32_fx( fr_bands, E_MIN_FXQ31, 2 * NB_BANDS ); // Q31 (*q_fr_bands) - - LEtot = W_shl( W_mult_32_16( E_MIN_FXQ31, add( sub( max_band, min_band ), 1 ) ), 1 ); // Q32 (*q_fr_bands+1) + *Etot = -193760400; // Q24 *q_fr_bands = Q31; *q_lf_E = *q_fr_bands; + move32(); move16(); move16(); } @@ -596,25 +598,24 @@ void ivas_analy_sp_fx( MVR2R_WORD32( Bin_E, Bin_E + ( L_FFT / 2 ), L_FFT / 2 ); MVR2R_WORD32( band_energies, band_energies + NB_BANDS, NB_BANDS ); MVR2R_WORD32( pt_bands, pt_bands + NB_BANDS, NB_BANDS ); - } - /* Average total log energy over both half-frames */ - *Etot = -838860800 /* 10.f * log10f(0.00001f) in Q24 : This is when LEtot is 0*/; - move16(); - IF( LEtot != 0 ) - { - exp = W_norm( LEtot ); - LEtot = W_shl( LEtot, exp ); // q_fr_bands+exp - Ltmp = BASOP_Util_Log10( W_extract_h( LEtot ), sub( 62, add( *q_fr_bands, exp ) ) /* 31-(q_fr_bands+1+exp-32) */ ); // Q25 - Ltmp = Mpy_32_32( Ltmp, 1342177280 /* 10.f in Q27 */ ); // (Q25, Q27) -> Q21 - *Etot = L_shl( Ltmp, Q24 - Q21 ); // Q24 + /* Average total log energy over both half-frames */ + *Etot = -838860800 /* 10.f * log10f(0.00001f) in Q24 : This is when LEtot is 0*/; move16(); + IF( LEtot != 0 ) + { + exp = W_norm( LEtot ); + LEtot = W_shl( LEtot, exp ); // q_fr_bands+exp + Ltmp = BASOP_Util_Log10( W_extract_h( LEtot ), sub( 62, add( *q_fr_bands, exp ) ) /* 31-(q_fr_bands+1+exp-32) */ ); // Q25 + Ltmp = Mpy_32_32( Ltmp, 1342177280 /* 10.f in Q27 */ ); // (Q25, Q27) -> Q21 + *Etot = L_shl( Ltmp, Q24 - Q21 ); // Q24 + move16(); + } } + *q_band_energies = *q_fr_bands; + move16(); } - *q_band_energies = *q_fr_bands; - move16(); - exp = sub( getScaleFactor32( fr_bands, 2 * NB_BANDS ), 1 ); scale_sig32( fr_bands, 2 * NB_BANDS, exp ); /* q_fr_bands + exp */ *q_fr_bands = add( *q_fr_bands, exp ); diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index be208296d..106d7c387 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1258,8 +1258,7 @@ ivas_error pre_proc_front_ivas_fx( noise_est_ivas_fx( st, old_pitch1, tmpN_fx, epsP_fx, extract_h( Etot_fx ), *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, &ncharX_fx, &sp_div_fx, &q_sp_div, &non_staX_fx, loc_harm, lf_E_fx, q_lf_E_fx, &st->hNoiseEst->harm_cor_cnt, extract_h( st->hNoiseEst->Etot_l_lp_32fx ), - extract_h( st->hNoiseEst->Etot_v_h2_32fx ), &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, - hStereoClassif, NULL, st->ini_frame ); + st->hNoiseEst->Etot_v_h2_32fx, &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, hStereoClassif, NULL, st->ini_frame ); test(); IF( lr_vad_enabled && st->idchan == 0 ) @@ -1301,14 +1300,14 @@ ivas_error pre_proc_front_ivas_fx( noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[0], epsP_fx, Etot_LR_fx[0], sub( Etot_LR_fx[0], hCPE->hFrontVad[0]->lp_speech_fx ), corr_shiftL_fx, tmpE_LR_fx[0], q_tmpE_LR[0], fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], &cor_map_sum_LR_fx[0], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[0], lf_E_LR_fx_q, &hCPE->hFrontVad[0]->hNoiseEst->harm_cor_cnt, - extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_32fx ), extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx ), &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx, &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[0], hCPE->hFrontVad[0]->ini_frame ); /* Note: the index [0] in the last argument is intended, the ini_frame counter is only maintained in the zero-th channel's VAD handle */ noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[1], epsP_fx, Etot_LR_fx[1], sub( Etot_LR_fx[1], hCPE->hFrontVad[1]->lp_speech_fx ), corr_shiftR_fx, tmpE_LR_fx[1], q_tmpE_LR[1], fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], &cor_map_sum_LR_fx[1], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[1], lf_E_LR_fx_q, &hCPE->hFrontVad[1]->hNoiseEst->harm_cor_cnt, - extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_32fx ), extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx ), &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, + extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx, &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[1], hCPE->hFrontVad[0]->ini_frame ); } diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index a4baf6a00..a6054a841 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -741,7 +741,7 @@ ivas_error front_vad_spar_fx( noise_est_ivas_fx( st, old_pitch, tmpN_fx, epsP_fx, Etot_fx[0], sub( Etot_fx[0], hFrontVad->lp_speech_fx ), corr_shift_fx, tmpE_fx, hFrontVad->hNoiseEst->ave_enr_q, fr_bands_fx[0], q_fr_bands[0], &cor_map_sum_fx, NULL, &sp_div_fx, &Q_sp_div, &non_staX_fx, &loc_harm, - lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, extract_h( hFrontVad->hNoiseEst->Etot_l_lp_32fx ), extract_h( hFrontVad->hNoiseEst->Etot_v_h2_32fx ), + lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, extract_h( hFrontVad->hNoiseEst->Etot_l_lp_32fx ), hFrontVad->hNoiseEst->Etot_v_h2_32fx, &hFrontVad->hNoiseEst->bg_cnt, st->lgBin_E_fx, &sp_floor, S_map_fx, NULL, hFrontVad, hFrontVad->ini_frame ); MVR2R_WORD16( st->pitch, st->pitch, 3 ); diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 4f178214f..7534a5159 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -358,14 +358,14 @@ void noise_est_init_ivas_fx( move16(); hNoiseEst->Etot_lp_fx = 0; hNoiseEst->Etot_h_fx = 0; - hNoiseEst->Etot_l_fx = 0; + hNoiseEst->Etot_l_32fx = 0; hNoiseEst->Etot_l_lp_32fx = 0; hNoiseEst->Etot_last_32fx = 0; hNoiseEst->Etot_v_h2_32fx = 0; hNoiseEst->sign_dyn_lp_fx = 0; move16(); move16(); - move16(); + move32(); move16(); move32(); move32(); @@ -528,7 +528,7 @@ void noise_est_pre_32fx( Etot_h_32fx = L_sub( L_deposit_h( hNoiseEst->Etot_h_fx ), 671089 ); /* 671089=0.04 in Q24 */ Etot_h_32fx = L_max( Etot_h_32fx, Etot ); - Etot_l_32fx = L_add( L_deposit_h( hNoiseEst->Etot_l_fx ), 1342177 ); /* 1342177 = .08 in Q24 */ + Etot_l_32fx = L_add( hNoiseEst->Etot_l_32fx, 1342177 ); /* 1342177 = .08 in Q24 */ /* Could even be higher but it also delays first entry to DTX */ IF( GT_16( hNoiseEst->harm_cor_cnt, HE_LT_CNT_PRE_FX ) ) @@ -590,10 +590,10 @@ void noise_est_pre_32fx( move16(); } - hNoiseEst->Etot_l_fx = extract_h( Etot_l_32fx ); // Q8 + hNoiseEst->Etot_l_32fx = Etot_l_32fx; // Q24 hNoiseEst->Etot_h_fx = extract_h( Etot_h_32fx ); // Q8 hNoiseEst->Etot_lp_fx = extract_h( Etot_lp_32fx ); // Q8 - move16(); + move32(); move16(); move16(); @@ -2213,7 +2213,7 @@ void noise_est_ivas_fx( const Word16 q_lf_E, /* i : Q of lf_E Q0 */ Word16 *st_harm_cor_cnt, /* i/o : 1st harm correlation timer Q0 */ const Word16 Etot_l_lp, /* i : Smoothed low energy Q8 */ - const Word16 Etot_v_h2, /* i : Energy variations Q8 */ + const Word32 Etot_v_h2, /* i : Energy variations Q24 */ Word16 *bg_cnt, /* i : Background burst length timer Q0 */ Word16 EspecdB[], /* i/o: log E spectrum (with f=0) of the current frame Q7 for multi harm */ Word16 *sp_floor, /* o : noise floor estimate Q7 */ @@ -3176,14 +3176,14 @@ void noise_est_ivas_fx( haco_ev_max = s_max( tmp, hNoiseEst->lt_haco_ev_fx ); /* Q15 */ /* Etot_l_lp_thr = st->Etot_l_lp + (1.5f + 1.5f * (st->Etot_lp<50.0f))*st->Etot_v_h2; */ - tmp = 12288; - move16(); /* 1.5 Q13 */ + L_tmp = 49152; /* 1.5 Q15 */ + move32(); if ( LT_16( hNoiseEst->Etot_lp_fx, 12800 ) ) /* 50.0 in Q8 */ { - tmp = shl( tmp, 1 ); /*1.5 + 1.5 Q13 */ + L_tmp = L_shl( L_tmp, 1 ); /*1.5 + 1.5 Q15 */ } - Ltmp = hNoiseEst->Etot_l_lp_32fx; - Etot_l_lp_thr = round_fx( L_add( Ltmp, L_shl( L_mult( tmp, Etot_v_h2 ), 2 ) ) ); /* Q13+Q8+1 +2 = Q24 -> Q8*/ + temp = W_mac_32_32( W_mult_32_32( hNoiseEst->Etot_l_lp_32fx, ONE_IN_Q15 ), Etot_v_h2, L_tmp ); // Q40(24+15+1) + Etot_l_lp_thr = W_round32_s( temp ); // Q8 /* enr_bgd = Etot < Etot_l_lp_thr; */ enr_bgd = 0; @@ -3367,8 +3367,8 @@ void noise_est_ivas_fx( move16(); test(); test(); - if ( ( GT_16( hNoiseEst->sign_dyn_lp_fx, 15 * 256 ) ) /* 15 in Q8 */ - && ( LT_16( sub( Etot, extract_h( hNoiseEst->Etot_l_lp_32fx ) ), shl( Etot_v_h2, 1 ) ) ) /* Q8 , Etot_v_h2 has limited dynmics can be upscaled*/ + if ( ( GT_16( hNoiseEst->sign_dyn_lp_fx, 15 * 256 ) ) /* 15 in Q8 */ + && ( LT_32( L_sub( L_deposit_h( Etot ), hNoiseEst->Etot_l_lp_32fx ), L_shl( Etot_v_h2, 1 ) ) ) /* Q24 , Etot_v_h2 has limited dynmics can be upscaled*/ && ( GT_16( *st_harm_cor_cnt, 20 ) ) ) { sd1_bgd = 1; diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 8e323af82..59d2fdf9a 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -404,7 +404,7 @@ void noise_est_ivas_fx( const Word16 q_lf_E, /* i : Q of lf_E Q0 */ Word16 *st_harm_cor_cnt, /* i/o : 1st harm correlation timer Q0 */ const Word16 Etot_l_lp, /* i : Smoothed low energy Q8 */ - const Word16 Etot_v_h2, /* i : Energy variations Q8 */ + const Word32 Etot_v_h2, /* i : Energy variations Q24 */ Word16 *bg_cnt, /* i : Background burst length timer Q0 */ Word16 EspecdB[], /* i/o: log E spectrum (with f=0) of the current frame Q7 for multi harm */ Word16 *sp_floor, /* o : noise floor estimate Q7 */ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 41383f109..b9c515eea 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -549,6 +549,7 @@ typedef struct noise_estimation_structure Word16 bg_cnt; /* Noise estimator - pause length counter */ Word16 Etot_l_fx; /* Q8 Noise estimator - Track energy from below */ Word16 Etot_h_fx; /* Q8 Noise estimator - Track energy from above */ + Word32 Etot_l_32fx; /* Q24 Noise estimator - Track energy from below */ Word16 Etot_l_lp_fx; /* EVS- Q8 Noise estimator - Smoothed low energy */ Word32 Etot_l_lp_32fx; /* IVAS-Q24 Noise estimator - Smoothed low energy */ Word16 Etot_last_fx; /*EVS- Q8*/ -- GitLab From 76177d803521693ee1d7fffbff3ed4fc64e4c648 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 09:33:22 +0530 Subject: [PATCH 0756/1310] Optimizations in renderer and SBA encoder --- lib_com/ivas_fb_mixer_fx.c | 36 +++ lib_com/ivas_spar_com_fx.c | 78 ++++++- lib_com/options.h | 3 + lib_dec/ivas_binRenderer_internal_fx.c | 139 ++++++++++++ lib_dec/ivas_dirac_dec_fx.c | 19 +- lib_dec/ivas_mc_param_dec_fx.c | 2 + lib_dec/ivas_mc_paramupmix_dec_fx.c | 2 + lib_dec/ivas_sba_rendering_internal_fx.c | 22 +- lib_enc/ivas_enc_cov_handler_fx.c | 51 ++++- .../ivas_dirac_dec_binaural_functions_fx.c | 205 ++++++++++++++++-- lib_rend/ivas_reverb_fx.c | 11 + lib_rend/ivas_sba_rendering_fx.c | 71 +++++- 12 files changed, 605 insertions(+), 34 deletions(-) diff --git a/lib_com/ivas_fb_mixer_fx.c b/lib_com/ivas_fb_mixer_fx.c index d5cd8d4f1..0d8a74514 100644 --- a/lib_com/ivas_fb_mixer_fx.c +++ b/lib_com/ivas_fb_mixer_fx.c @@ -759,6 +759,13 @@ void ivas_fb_mixer_process_fx( pMdft_out_fx[0] = Mdft_out_0_fx; pMdft_out_fx[1] = Mdft_out_1_fx; +#ifdef OPT_SBA_ENC_V1_BE + Word16 total_guard = find_guarded_bits_fx( num_bands ); + Word16 total_guard_2 = find_guarded_bits_fx( shl( frame_len, 1 ) ); + Word16 tmp_q = sub( sub( *q_mixer_mat_fx, total_guard ), 32 ); // Q30 + hFbMixer->q_prior_mixer_fx - 31 - total_guard - 31 + Word16 len = shl( frame_len, 1 ); + Word16 res_q, q_check; +#endif FOR( ch = ( hFbMixer->fb_cfg->active_w_mixing == 0 ); ch < hFbMixer->fb_cfg->num_out_chans; ch++ ) { /* Run a loop of 2 to calculate current frame's filterbank output and prev frame's output */ @@ -773,6 +780,12 @@ void ivas_fb_mixer_process_fx( IF( in_out_mixer_map[ch][j] != 0 ) { +#ifdef OPT_SBA_ENC_V1_BE + res_q = add( tmp_q, hFbMixer->q_ppFilterbank_inFR[j] ); + q_check = s_min( q_pOut_fr_fx, res_q ); + scale_sig32( pOut_fr_re_fx, frame_len, sub( q_check, q_pOut_fr_fx ) ); + scale_sig32( pOut_fr_im_fx, frame_len, sub( q_check, q_pOut_fr_fx ) ); +#endif Word32 filterbank_mixer_bins_re_fx[L_FRAME48k]; Word32 filterbank_mixer_bins_im_fx[L_FRAME48k]; Word32 *pFb_inFR_re_fx = hFbMixer->ppFilterbank_inFR_re_fx[j]; // Q(hFbMixer->q_ppFilterbank_inFR_re_fx) @@ -781,8 +794,10 @@ void ivas_fb_mixer_process_fx( set_zero_fx( filterbank_mixer_bins_re_fx, frame_len ); set_zero_fx( filterbank_mixer_bins_im_fx, frame_len ); +#ifndef OPT_SBA_ENC_V1_BE Word16 total_guard = find_guarded_bits_fx( num_bands ); move16(); +#endif FOR( i = 0; i < num_bands; i++ ) { Word16 start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; @@ -808,15 +823,19 @@ void ivas_fb_mixer_process_fx( hFbMixer->prior_mixer_fx[ch][j][i] = mixer_mat_fx[ch][j][i]; // Q(q_mixer_mat_fx) move32(); } +#ifndef OPT_SBA_ENC_V1_BE Word16 res_q = 0; move16(); +#endif FOR( k = 0; k < frame_len; k++ ) { Word32 temp_out_re_fx, temp_out_im_fx; ivas_cmult_fix( filterbank_mixer_bins_re_fx[k], filterbank_mixer_bins_im_fx[k], pFb_inFR_re_fx[k], pFb_inFR_im_fx[k], &temp_out_re_fx, &temp_out_im_fx ); +#ifndef OPT_SBA_ENC_V1_BE res_q = sub( add( sub( sub( add( 30, *q_mixer_mat_fx ), 31 ), total_guard ), hFbMixer->q_ppFilterbank_inFR[j] ), 31 ); + Word16 q_check = s_min( q_pOut_fr_fx, res_q ); IF( NE_16( q_check, q_pOut_fr_fx ) ) { @@ -825,31 +844,48 @@ void ivas_fb_mixer_process_fx( pOut_fr_im_fx[k] = L_shr( pOut_fr_im_fx[k], sub( q_pOut_fr_fx, q_check ) ); // q_pOut_fr_fx -> q_check move32(); } +#endif IF( NE_16( q_check, res_q ) ) { temp_out_re_fx = L_shr( temp_out_re_fx, sub( res_q, q_check ) ); // res_q -> q_check temp_out_im_fx = L_shr( temp_out_im_fx, sub( res_q, q_check ) ); // res_q -> q_check } +#ifndef OPT_SBA_ENC_V1_BE res_q = q_check; move16(); +#endif + pOut_fr_re_fx[k] = L_add_sat( pOut_fr_re_fx[k], temp_out_re_fx ); // res_q move32(); pOut_fr_im_fx[k] = L_add_sat( pOut_fr_im_fx[k], temp_out_im_fx ); // res_q move32(); } +#ifdef OPT_SBA_ENC_V1_BE + q_pOut_fr_fx = q_check; +#else q_pOut_fr_fx = res_q; move16(); +#endif } } +#ifndef OPT_SBA_ENC_V1_BE Word16 scale = sub( s_min( L_norm_arr( pOut_fr_re_fx, frame_len ), L_norm_arr( pOut_fr_im_fx, frame_len ) ), find_guarded_bits_fx( shl( frame_len, 1 ) ) ); +#else + Word16 scale = sub( s_min( L_norm_arr( pOut_fr_re_fx, frame_len ), L_norm_arr( pOut_fr_im_fx, frame_len ) ), total_guard_2 ); +#endif scale_sig32( pOut_fr_re_fx, frame_len, scale ); scale_sig32( pOut_fr_im_fx, frame_len, scale ); ivas_imdft_fx( pOut_fr_re_fx, pOut_fr_im_fx, pMdft_out_fx[hist], frame_len ); q_pMdft_out_fx[hist] = add( q_pOut_fr_fx, scale ); move16(); } +#ifdef OPT_SBA_ENC_V1_BE + scale_sig32( pMdft_out_fx[0], len, sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[0] ) ); + scale_sig32( pMdft_out_fx[1], len, sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[1] ) ); +#else scale_sig32( pMdft_out_fx[0], shl( frame_len, 1 ), sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[0] ) ); scale_sig32( pMdft_out_fx[1], shl( frame_len, 1 ), sub( s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ), q_pMdft_out_fx[1] ) ); +#endif ivas_fb_mixer_cross_fading_fx( hFbMixer, ppOut_pcm_fx, pMdft_out_fx[0], pMdft_out_fx[1], ch, frame_len, frame_len ); q_ppOut_pcm_fx[ch] = s_min( q_pMdft_out_fx[0], q_pMdft_out_fx[1] ); move16(); diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index c2ad11e26..ef549a2ae 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -1995,15 +1995,23 @@ static void ivas_calc_post_pred_per_band_enc_fx( Word16 *q_postpred_cov_re ) { Word16 i, j, k; +#ifndef OPT_SBA_ENC_V1_BE Word32 dmx_mat_conj[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; - Word16 temp_mat_e[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word16 q_postpred_cov_re_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word16 min_val; +#else + Word16 max_val; + Word16 temp; + Word32 temp_add; + Word16 e_postpred_cov_re_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; +#endif + Word32 temp_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + Word16 temp_mat_e[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; Word32 tmp_re; Word16 tmp_q; Word16 tmp_e; +#ifndef OPT_SBA_ENC_V1_BE FOR( i = 0; i < num_ch; i++ ) { FOR( j = 0; j < num_ch; j++ ) @@ -2013,25 +2021,40 @@ static void ivas_calc_post_pred_per_band_enc_fx( } } + FOR( i = 0; i < num_ch; i++ ) { set32_fx( temp_mat[i], 0, num_ch ); set32_fx( postpred_cov_re[i], 0, num_ch ); } +#endif +#ifdef OPT_SBA_ENC_V1_BE + max_val = MIN16B; + move16(); + temp = sub( 62, q_mixer_mat ); +#else min_val = MAX16B; move16(); +#endif + /* num_ch x num_ch mult */ FOR( i = 0; i < num_ch; i++ ) { FOR( j = 0; j < num_ch; j++ ) { +#ifndef OPT_SBA_ENC_V1_BE temp_mat[i][j] = 0; +#else + temp_add = 0; +#endif move32(); temp_mat_e[i][j] = 0; move16(); + FOR( k = 0; k < num_ch; k++ ) { +#ifndef OPT_SBA_ENC_V1_BE tmp_re = Mpy_32_32( cov_real[i][k][band_idx], dmx_mat_conj[k][j] ); tmp_e = sub( 62, add( q_cov_real[i][k][band_idx], q_mixer_mat ) ); IF( tmp_re ) @@ -2039,34 +2062,71 @@ static void ivas_calc_post_pred_per_band_enc_fx( temp_mat[i][j] = BASOP_Util_Add_Mant32Exp( temp_mat[i][j], temp_mat_e[i][j], tmp_re, tmp_e, &temp_mat_e[i][j] ); move32(); } +#else + tmp_re = Mpy_32_32( cov_real[i][k][band_idx], mixer_mat[j][k][band_idx] ); + tmp_e = sub( temp, q_cov_real[i][k][band_idx] ); + IF( tmp_re ) + { + temp_add = BASOP_Util_Add_Mant32Exp( temp_add, temp_mat_e[i][j], tmp_re, tmp_e, &temp_mat_e[i][j] ); + } +#endif } +#ifdef OPT_SBA_ENC_V1_BE + temp_mat[i][j] = temp_add; + move32(); +#endif } } + tmp_e = sub( Q31, q_mixer_mat ); /* num_ch x num_ch mult */ FOR( i = 0; i < num_ch; i++ ) { FOR( j = i; j < num_ch; j++ ) { +#ifdef OPT_SBA_ENC_V1_BE + temp_add = 0; + move32(); + e_postpred_cov_re_buf[i][j] = sub( 31, *q_postpred_cov_re ); +#else q_postpred_cov_re_buf[i][j] = *q_postpred_cov_re; +#endif move16(); FOR( k = 0; k < num_ch; k++ ) { tmp_re = Mpy_32_32( mixer_mat[i][k][band_idx], temp_mat[k][j] ); +#ifdef OPT_SBA_ENC_V1_BE + tmp_q = add( tmp_e, temp_mat_e[k][j] ); +#else tmp_q = sub( q_mixer_mat, temp_mat_e[k][j] ); +#endif IF( tmp_re ) { +#ifndef OPT_SBA_ENC_V1_BE tmp_e = sub( 31, q_postpred_cov_re_buf[i][j] ); postpred_cov_re[i][j] = BASOP_Util_Add_Mant32Exp( postpred_cov_re[i][j], tmp_e, tmp_re, sub( Q31, tmp_q ), &tmp_e ); move32(); q_postpred_cov_re_buf[i][j] = sub( 31, tmp_e ); move16(); +#else + temp_add = BASOP_Util_Add_Mant32Exp( temp_add, e_postpred_cov_re_buf[i][j], tmp_re, tmp_q, &e_postpred_cov_re_buf[i][j] ); +#endif } } +#ifndef OPT_SBA_ENC_V1_BE IF( postpred_cov_re[i][j] ) { min_val = s_min( min_val, q_postpred_cov_re_buf[i][j] ); +#else + if ( temp_add ) + { + max_val = s_max( max_val, e_postpred_cov_re_buf[i][j] ); +#endif } +#ifdef OPT_SBA_ENC_V1_BE + postpred_cov_re[i][j] = temp_add; + move32(); +#endif } } @@ -2077,7 +2137,11 @@ static void ivas_calc_post_pred_per_band_enc_fx( { IF( postpred_cov_re[i][j] ) { +#ifdef OPT_SBA_ENC_V1_BE + postpred_cov_re[i][j] = L_shr( postpred_cov_re[i][j], sub( max_val, e_postpred_cov_re_buf[i][j] ) ); +#else postpred_cov_re[i][j] = L_shl( postpred_cov_re[i][j], sub( min_val, q_postpred_cov_re_buf[i][j] ) ); +#endif move32(); } } @@ -2092,13 +2156,21 @@ static void ivas_calc_post_pred_per_band_enc_fx( move32(); } } - +#ifdef OPT_SBA_ENC_V1_BE + if ( EQ_16( max_val, MIN16B ) ) + { + max_val = 0; + move16(); + } + *q_postpred_cov_re = sub( Q31, max_val ); +#else if ( EQ_16( min_val, MAX16B ) ) { min_val = Q31; move16(); } *q_postpred_cov_re = min_val; +#endif move16(); return; diff --git a/lib_com/options.h b/lib_com/options.h index 20a1dc555..09765b959 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -75,6 +75,9 @@ #define FIX_1379_MASA_ANGLE_ROUND /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_SBA_ENC_V1_BE +#define OPT_BIN_RENDERER_V1 +#define OPT_BIN_RENDERER_V2 #define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ #define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ #define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index c05b8beb2..ee6304e6e 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -54,7 +54,137 @@ * * *-------------------------------------------------------------------------*/ +#ifdef OPT_BIN_RENDERER_V2 +static void ivas_binRenderer_filterModule_fx( + Word32 out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals Q6 */ + Word32 out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals Q6 */ + Word32 CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals Q_curr*/ + Word32 CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals Q_curr*/ + const Word16 numTimeSlots, /* i : number of time slots to process */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ + Word16 Q_curr ) +{ + Word16 bandIdx, k, chIdx, tapIdx; + Word32 *filterStatesLeftRealPtr_fx, *filterStatesLeftImagPtr_fx; + Word16 Q_filterStates; + const Word32 *filterTapsLeftRealPtr_fx, *filterTapsLeftImagPtr_fx, *filterTapsRightRealPtr_fx, *filterTapsRightImagPtr_fx; + Word16 shift_q; + Word16 shift_q6 = sub( -29 + 6, Q_curr ); + Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStatesLeft; + move16(); + + // to be checked: feasibility with 32 bit buffers + Word64 Cldfb_RealBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; + Word64 Cldfb_ImagBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; + + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + set64_fx( &Cldfb_RealBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); + set64_fx( &Cldfb_ImagBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); + + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx][0] ); + filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx][0] ); + + filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 + filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 + filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 + filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 + + FOR( k = 0; k < numTimeSlots; k++ ) + { + Word64 outRealLeft_fx = 0, outRealRight_fx = 0, outImagLeft_fx = 0, outImagRight_fx = 0; + move64(); + move64(); + move64(); + move64(); + + FOR( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) + { + filterStatesLeftRealPtr_fx[tapIdx] = filterStatesLeftRealPtr_fx[tapIdx - 1]; + move32(); + filterStatesLeftImagPtr_fx[tapIdx] = filterStatesLeftImagPtr_fx[tapIdx - 1]; + move32(); + Word32 neg_filterStatesLeftImagPtr_fx = L_negate( filterStatesLeftImagPtr_fx[tapIdx] ); + + + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, neg_filterStatesLeftImagPtr_fx, filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + + outRealRight_fx = W_mac_32_32( outRealRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealRight_fx = W_mac_32_32( outRealRight_fx, neg_filterStatesLeftImagPtr_fx, filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + } + + shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); + + IF( shift_q != 0 ) + { + outRealLeft_fx = W_shr( outRealLeft_fx, shift_q ); // Q_curr + Q29 + outImagLeft_fx = W_shr( outImagLeft_fx, shift_q ); // Q_curr + Q29 + outRealRight_fx = W_shr( outRealRight_fx, shift_q ); // Q_curr + Q29 + outImagRight_fx = W_shr( outImagRight_fx, shift_q ); // Q_curr + Q29 + hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; + move16(); + } + + filterStatesLeftRealPtr_fx[0] = CLDFB_real[chIdx][k][bandIdx]; + move32(); + filterStatesLeftImagPtr_fx[0] = CLDFB_imag[chIdx][k][bandIdx]; + move32(); + + + /* Left Real and Imag */ + + Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); // Q_curr -1 + Word32 temp2 = L_shr( filterStatesLeftImagPtr_fx[0], 1 ); // Q_curr -1 + Word32 neg_temp2 = L_negate( temp2 ); // Q_curr -1 + + + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, temp1, filterTapsLeftRealPtr_fx[0] ); + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, neg_temp2, filterTapsLeftImagPtr_fx[0] ); + Cldfb_RealBuffer_64fx[0][k] = W_add( Cldfb_RealBuffer_64fx[0][k], outRealLeft_fx ); // Q29 + Q_curr + move64(); + + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp1, filterTapsLeftImagPtr_fx[0] ); + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp2, filterTapsLeftRealPtr_fx[0] ); + Cldfb_ImagBuffer_64fx[0][k] = W_add( Cldfb_ImagBuffer_64fx[0][k], outImagLeft_fx ); // Q29 + Q_curr + move64(); + + /* Right Real and Imag */ + outRealRight_fx = W_mac_32_32( outRealRight_fx, temp1, filterTapsRightRealPtr_fx[0] ); + outRealRight_fx = W_mac_32_32( outRealRight_fx, neg_temp2, filterTapsRightImagPtr_fx[0] ); + Cldfb_RealBuffer_64fx[1][k] = W_add( Cldfb_RealBuffer_64fx[1][k], outRealRight_fx ); // Q29 + Q_curr + move64(); + + outImagRight_fx = W_mac_32_32( outImagRight_fx, temp1, filterTapsRightImagPtr_fx[0] ); + outImagRight_fx = W_mac_32_32( outImagRight_fx, temp2, filterTapsRightRealPtr_fx[0] ); + Cldfb_ImagBuffer_64fx[1][k] = W_add( Cldfb_ImagBuffer_64fx[1][k], outImagRight_fx ); // Q29 + Q_curr + move64(); + } + } + FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) + { + FOR( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) + { + out_Conv_CLDFB_real[chIdx][k][bandIdx] = W_shl_sat_l( Cldfb_RealBuffer_64fx[chIdx][k], shift_q6 ); // Q6 + move32(); + out_Conv_CLDFB_imag[chIdx][k][bandIdx] = W_shl_sat_l( Cldfb_ImagBuffer_64fx[chIdx][k], shift_q6 ); // Q6 + move32(); + } + } + } + + + return; +} +#else /* OPT_BIN_RENDERER_V2 */ static void ivas_binRenderer_filterModule_fx( Word64 out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals Q29 */ Word64 out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals Q29 */ @@ -164,6 +294,7 @@ static void ivas_binRenderer_filterModule_fx( return; } +#endif /* OPT_BIN_RENDERER_V2 */ /*------------------------------------------------------------------------- * ivas_binRenderer_convModuleOpen() @@ -1482,9 +1613,11 @@ void ivas_binRenderer_fx( ) { Word16 chIdx, i, j, k; +#ifndef OPT_BIN_RENDERER_V2 // to be checked: feasibility with 32 bit buffers Word64 Cldfb_RealBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word64 Cldfb_ImagBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; +#endif /* OPT_BIN_RENDERER_V2 */ push_wmops( "fastconv_binaural_rendering" ); /* Compute Convolution */ @@ -1495,8 +1628,10 @@ void ivas_binRenderer_fx( { set32_fx( Cldfb_RealBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( Cldfb_ImagBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); +#ifndef OPT_BIN_RENDERER_V2 set64_fx( Cldfb_RealBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); set64_fx( Cldfb_ImagBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); +#endif /* OPT_BIN_RENDERER_V2 */ } } @@ -1536,6 +1671,9 @@ void ivas_binRenderer_fx( ivas_sba2mc_cldfb_fixed( *( hBinRenderer->hInputSetup ), RealBuffer_fx, ImagBuffer_fx, hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); } +#ifdef OPT_BIN_RENDERER_V2 + ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, *Q_in ); +#else /* OPT_BIN_RENDERER_V2 */ ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_64fx, Cldfb_ImagBuffer_Binaural_64fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, *Q_in ); FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) @@ -1551,6 +1689,7 @@ void ivas_binRenderer_fx( } } } +#endif /* OPT_BIN_RENDERER_V2 */ /* Obtain the binaural dmx and compute the reverb */ IF( hBinRenderer->hReverb != NULL ) { diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 7fecb7ca7..f29133d92 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2227,6 +2227,7 @@ void ivas_dirac_dec_render_sf_fx( } } +#ifndef OPT_BIN_RENDERER_V2 FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) @@ -2235,6 +2236,7 @@ void ivas_dirac_dec_render_sf_fx( set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); } } +#endif /* OPT_BIN_RENDERER_V2 */ /* local copies of azi, ele, diffuseness */ Word16 azimuth[CLDFB_NO_CHANNELS_MAX]; @@ -3931,8 +3933,8 @@ void ivas_dirac_dec_render_sf_fx( const Word32 azi_fx = L_shl( az1_32, Q22 - Q16 ); // Q16 -> Q22 const Word32 ele_fx = L_shl( el1_32, Q22 - Q16 ); // Q16 -> Q22 #else - const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 - const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 + const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 + const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 #endif efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azi_fx, ele_fx, EFAP_MODE_EFAP ); } @@ -3973,9 +3975,19 @@ void ivas_dirac_dec_render_sf_fx( { Word32 g_fx; w2_fx = sub( MAX16B, *w1_fx ); +#ifdef OPT_BIN_RENDERER_V2 + g_fx = Madd_32_16( Mpy_32_16_1( gain_fx, *w1_fx ), prev_gain_fx, w2_fx ); // Q15 +#else /* OPT_BIN_RENDERER_V2 */ g_fx = L_add( Mpy_32_16_1( gain_fx, *w1_fx ), Mpy_32_16_1( prev_gain_fx, w2_fx ) ); // Q15 +#endif /* OPT_BIN_RENDERER_V2 */ FOR( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) { +#ifdef OPT_BIN_RENDERER_V2 + Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = Madd_32_32( Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], g_fx, *tc_re_fx ); + move32(); + tc_re_fx++; + Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = Madd_32_32( Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], g_fx, *tc_im_fx ); +#else /* OPT_BIN_RENDERER_V2 */ Word32 tmp; tmp = Mpy_32_32( g_fx, *tc_re_fx ); Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); @@ -3983,6 +3995,7 @@ void ivas_dirac_dec_render_sf_fx( tc_re_fx++; tmp = Mpy_32_32( g_fx, *tc_im_fx ); Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); +#endif /* OPT_BIN_RENDERER_V2 */ move32(); tc_re_fx++; } @@ -4012,8 +4025,10 @@ void ivas_dirac_dec_render_sf_fx( Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, &input_q ); +#ifndef OPT_BIN_RENDERER_V2 Scale_sig32( Cldfb_RealBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 +#endif /* OPT_BIN_RENDERER_V2 */ /* Inverse CLDFB*/ FOR( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index e0671eea0..0e2de6c01 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -2151,6 +2151,7 @@ void ivas_param_mc_dec_render_fx( } } +#ifndef OPT_BIN_RENDERER_V2 FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) { FOR( Word16 idx2 = 0; idx2 < hParamMC->subframe_nbslots[subframe_idx]; idx2++ ) @@ -2159,6 +2160,7 @@ void ivas_param_mc_dec_render_fx( Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( Q6, input_q ) ); // Q6 } } +#endif /* OPT_BIN_RENDERER_V2 */ /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); } diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index 783b94940..7a1ef1126 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -847,6 +847,7 @@ static void ivas_mc_paramupmix_dec_sf( Cldfb_RealBuffer_subfr_fx, Cldfb_ImagBuffer_subfr_fx, &input_q ); +#ifndef OPT_BIN_RENDERER_V2 FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) { FOR( Word16 idx2 = 0; idx2 < MAX_PARAM_SPATIAL_SUBFRAMES; idx2++ ) @@ -855,6 +856,7 @@ static void ivas_mc_paramupmix_dec_sf( Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( 6, input_q ) ); // Q6 } } +#endif /* OPT_BIN_RENDERER_V2 */ /* Implement CLDFB synthesis */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { diff --git a/lib_dec/ivas_sba_rendering_internal_fx.c b/lib_dec/ivas_sba_rendering_internal_fx.c index bbe63e965..d9ee47c84 100644 --- a/lib_dec/ivas_sba_rendering_internal_fx.c +++ b/lib_dec/ivas_sba_rendering_internal_fx.c @@ -77,7 +77,11 @@ void ivas_sba2mc_cldfb_fixed( FOR( m = 0; m < nb_channels_in; m++ ) { - g_fx = hoa_dec_mtx[( ( SBA_NHARM_HOA3 * n ) + m )]; // Q29 +#ifdef OPT_BIN_RENDERER_V2 + g_fx = L_shl_sat( hoa_dec_mtx[( ( SBA_NHARM_HOA3 * n ) + m )], Q2 ); +#else /* OPT_BIN_RENDERER_V2 */ + g_fx = hoa_dec_mtx[( ( SBA_NHARM_HOA3 * n ) + m )]; // Q29 +#endif /* OPT_BIN_RENDERER_V2 */ p_realOut_fx = realOut_fx[n]; p_imagOut_fx = imagOut_fx[n]; @@ -87,9 +91,15 @@ void ivas_sba2mc_cldfb_fixed( p_imag_fx = ImagBuffer[m][iBlock]; /*Q_imag*/ FOR( iBand = 0; iBand < nb_bands; iBand++ ) { +#ifdef OPT_BIN_RENDERER_V2 + *p_realOut_fx = Madd_32_32( *p_realOut_fx, g_fx, *( p_real_fx++ ) ); // Q_real + move32(); + *p_imagOut_fx = Madd_32_32( *p_imagOut_fx, g_fx, *( p_imag_fx++ ) ); // Q_imag +#else /* OPT_BIN_RENDERER_V2 */ *p_realOut_fx = L_add( *p_realOut_fx, Mpy_32_32( L_shl_sat( g_fx, Q2 ), *( p_real_fx++ ) ) ); // Q_real move32(); - *p_imagOut_fx = L_add( *p_imagOut_fx, Mpy_32_32( L_shl_sat( g_fx, Q2 ), *( p_imag_fx++ ) ) ); // Q_imag + *p_imagOut_fx = L_add( *p_imagOut_fx, Mpy_32_32( L_shl_sat( g_fx, Q2 ), *( p_imag_fx++ ) ) ); // Q_imag +#endif /* OPT_BIN_RENDERER_V2 */ move32(); p_realOut_fx++; p_imagOut_fx++; @@ -167,7 +177,11 @@ void ivas_mc2sba_fx( /* Add LFE to omni W with gain*/ FOR( k = 0; k < output_frame; k++ ) { +#ifdef OPT_BIN_RENDERER_V2 + buffer_tmp_fx[0][k] = Madd_32_16( buffer_tmp_fx[0][k], L_shl( in_buffer_td_fx[i][k], 1 ), gain_lfe_fx ); /*Q+14-15+1==Q*/ +#else /* OPT_BIN_RENDERER_V2 */ buffer_tmp_fx[0][k] = L_add( buffer_tmp_fx[0][k], L_shl( Mult_32_16( in_buffer_td_fx[i][k], gain_lfe_fx ), 1 ) ); /*Q+14-15+1==Q*/ +#endif /* OPT_BIN_RENDERER_V2 */ move32(); } } @@ -196,7 +210,11 @@ void ivas_mc2sba_fx( { FOR( k = 0; k < output_frame; k++ ) { +#ifdef OPT_BIN_RENDERER_V2 + buffer_tmp_fx[j][k] = Madd_32_32( buffer_tmp_fx[j][k], L_shl( in_buffer_td_fx[i][k], 2 ), gains_fx[j] ); /*Q+29-31+2==Q*/ +#else /* OPT_BIN_RENDERER_V2 */ buffer_tmp_fx[j][k] = L_add( buffer_tmp_fx[j][k], L_shl( Mult_32_32( in_buffer_td_fx[i][k], gains_fx[j] ), 2 ) ); /*Q+29-31+2==Q*/ +#endif /* OPT_BIN_RENDERER_V2 */ move32(); } } diff --git a/lib_enc/ivas_enc_cov_handler_fx.c b/lib_enc/ivas_enc_cov_handler_fx.c index 59c38aa5d..495e6caa1 100644 --- a/lib_enc/ivas_enc_cov_handler_fx.c +++ b/lib_enc/ivas_enc_cov_handler_fx.c @@ -514,6 +514,9 @@ static void ivas_band_cov_fx( Word16 q_shift, q_shift_tmp; Word16 m, start_bin, active_bins; Word16 num_blocks; +#ifdef OPT_SBA_ENC_V1_BE + Word16 shift_conv, q_shift_cov[IVAS_MAX_NUM_BANDS][IVAS_MAX_NUM_BANDS]; +#endif num_blocks = idiv1616( num_bins, stride ); /* Q0 */ FOR( i = 0; i < num_chans; i++ ) @@ -525,13 +528,24 @@ static void ivas_band_cov_fx( move16(); move16(); +#ifdef OPT_SBA_ENC_V1_BE + q_shift = 31; + move16(); +#endif FOR( k = 0; k < num_bins; k++ ) { pV_re_64bit[k] = W_add( W_mult0_32_32( ppIn_FR_real[i1][k], ppIn_FR_real[j1][k] ), W_mult0_32_32( ppIn_FR_imag[i1][k], ppIn_FR_imag[j1][k] ) ); //(q_In_FR[i1], q_In_FR[j1]) -> (q_In_FR[i1] + q_In_FR[j1]) move64(); +#ifdef OPT_SBA_ENC_V1_BE + q_shift_tmp = W_norm( pV_re_64bit[k] ); + if ( pV_re_64bit[k] != 0 ) + { + q_shift = s_min( q_shift, q_shift_tmp ); + } +#endif } - +#ifndef OPT_SBA_ENC_V1_BE q_shift = 31; move16(); FOR( k = 0; k < num_bins; k++ ) @@ -542,11 +556,17 @@ static void ivas_band_cov_fx( q_shift = s_min( q_shift, q_shift_tmp ); } } +#endif q_shift_tmp = sub( q_shift, 32 ); FOR( k = 0; k < num_bins; k++ ) { +#ifdef OPT_SBA_ENC_V1_BE + pV_re[k] = W_shl_sat_l( pV_re_64bit[k], q_shift_tmp ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) + move32(); +#else pV_re[k] = W_extract_l( W_shl_nosat( pV_re_64bit[k], q_shift_tmp ) ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) move32(); +#endif /* perform rounding towards lower value for negative results */ if ( pV_re[k] < 0 ) { @@ -554,6 +574,10 @@ static void ivas_band_cov_fx( } } +#ifdef OPT_SBA_ENC_V1_BE + q_shift_cov[i][j] = Q31; + move16(); +#endif FOR( k = start_band; k < end_band; k++ ) { Word64 temp; @@ -575,7 +599,11 @@ static void ivas_band_cov_fx( /* optional: add temporal weight here */ FOR( m = 0; m < active_bins; m++ ) { +#ifdef OPT_SBA_ENC_V1_BE + temp = W_mac_32_32( temp, cov_ptr[m], p_bin_to_band[m] ); // ((q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32), Q22) + 1-> (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 9) +#else temp = W_add( temp, W_mult0_32_32( cov_ptr[m], p_bin_to_band[m] ) ); // ((q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32), Q22) -> (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 10) +#endif } cov_ptr += stride; move16(); @@ -584,8 +612,19 @@ static void ivas_band_cov_fx( cov_real_64bit[i][j][k] = temp * (Word64) ( num_blocks ); // (q_In_FR[i1] + q_In_FR[j1] + (q_shift - 10) - guard_bits move64(); move64(); // conservative estimation of a 64 bit multiplication +#ifdef OPT_SBA_ENC_V1_BE + shift_conv = W_norm( cov_real_64bit[i][j][k] ); + if ( cov_real_64bit[i][j][k] != 0 ) + { + q_shift_cov[i][j] = s_min( q_shift_cov[i][j], shift_conv ); + } +#endif } +#ifdef OPT_SBA_ENC_V1_BE + q_cov_real[i][j] = add( add( q_In_FR, q_In_FR ), sub( q_shift, Q9 ) ); +#else q_cov_real[i][j] = add( add( q_In_FR, q_In_FR ), sub( q_shift, Q10 ) ); +#endif move16(); } } @@ -594,6 +633,7 @@ static void ivas_band_cov_fx( { FOR( j = i; j < num_chans; j++ ) { +#ifndef OPT_SBA_ENC_V1_BE q_shift = 31; move16(); FOR( k = start_band; k < end_band; k++ ) @@ -605,10 +645,19 @@ static void ivas_band_cov_fx( } } q_shift_tmp = sub( q_shift, 32 ); +#else + q_shift_tmp = sub( q_shift_cov[i][j], 32 ); +#endif FOR( k = start_band; k < end_band; k++ ) { +#ifdef OPT_SBA_ENC_V1_BE + + cov_real[i][j][k] = W_shl_sat_l( cov_real_64bit[i][j][k], q_shift_tmp ); /* q_cov_real[i][j] + q_shift - 32 */ + move32(); +#else cov_real[i][j][k] = W_extract_l( W_shl_nosat( cov_real_64bit[i][j][k], q_shift_tmp ) ); /* q_cov_real[i][j] + q_shift - 32 */ move32(); +#endif } q_cov_real[i][j] = add( q_cov_real[i][j], q_shift_tmp ); move16(); diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 9ea964bcb..2db86d6eb 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -694,7 +694,9 @@ static void ivas_dirac_dec_binaural_internal_fx( move32(); move32(); move32(); - +#ifdef OPT_BIN_RENDERER_V1 + Word16 ch_len = s_max( 4, numInChannels ); +#endif /* OPT_BIN_RENDERER_V1 */ FOR( i = 0; i < 6; i++ ) { FOR( j = 0; j < 4; j++ ) @@ -854,19 +856,39 @@ static void ivas_dirac_dec_binaural_internal_fx( Scale_sig( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, CLDFB_NO_COL_MAX, Q15 - st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q ); st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q = Q15; move16(); +#ifndef OPT_BIN_RENDERER_V1 FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q31 - Q22 ); /*Q31 to Q22*/ } +#endif /* OPT_BIN_RENDERER_V1 */ ivas_sba_prototype_renderer_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_cldfb, subframe ); +#ifndef OPT_BIN_RENDERER_V1 FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q22 - Q31 ); /*Q31 to Q22*/ } +#endif /* OPT_BIN_RENDERER_V1 */ } Word16 q_inp = Q6; move16(); +#ifdef OPT_BIN_RENDERER_V1 + FOR( Word16 cha = 0; cha < ch_len; cha++ ) + { + FOR( slot = 0; slot < 4; slot++ ) + { + Word16 q_diff = sub( q_inp, q_cldfb[cha][slot] ); + IF( q_diff != 0 ) + { + Scale_sig32( Cldfb_RealBuffer_in_fx[cha][slot], 60, q_diff ); // Q6 + Scale_sig32( Cldfb_ImagBuffer_in_fx[cha][slot], 60, q_diff ); // Q6 + q_cldfb[cha][slot] = 6; + } + move16(); + } + } +#else /* OPT_BIN_RENDERER_V1 */ FOR( Word16 cha = 0; cha < 6; cha++ ) { FOR( slot = 0; slot < 4; slot++ ) @@ -877,6 +899,7 @@ static void ivas_dirac_dec_binaural_internal_fx( move16(); } } +#endif /* OPT_BIN_RENDERER_V1 */ test(); test(); @@ -1853,6 +1876,76 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_CrEne = Q31; move16(); +#ifdef OPT_BIN_RENDERER_V1 + Word16 q_diff = sub( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ); + + IF( q_diff > 0 ) + { + hDiracDecBin->ChEne_fx[1][bin] = L_shr( hDiracDecBin->ChEne_fx[1][bin], q_diff ); + hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[0][bin] ); + hDiracDecBin->ChEne_e[1][bin] = hDiracDecBin->ChEne_e[0][bin]; + } + ELSE + { + hDiracDecBin->ChEne_fx[0][bin] = L_shl( hDiracDecBin->ChEne_fx[0][bin], q_diff ); + hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[1][bin] ); + hDiracDecBin->ChEne_e[0][bin] = hDiracDecBin->ChEne_e[1][bin]; + } + move32(); + move16(); + move16(); + + q_diff = sub( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ); + IF( q_diff > 0 ) + { + hDiracDecBin->ChEneOut_fx[1][bin] = L_shr( hDiracDecBin->ChEneOut_fx[1][bin], q_diff ); + hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[0][bin] ); + hDiracDecBin->ChEneOut_e[1][bin] = hDiracDecBin->ChEneOut_e[0][bin]; + } + ELSE + { + hDiracDecBin->ChEneOut_fx[0][bin] = L_shl( hDiracDecBin->ChEneOut_fx[0][bin], q_diff ); + hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[1][bin] ); + hDiracDecBin->ChEneOut_e[0][bin] = hDiracDecBin->ChEneOut_e[1][bin]; + } + move32(); + move16(); + move16(); + + q_diff = sub( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ); + IF( q_diff > 0 ) + { + hDiracDecBin->ChCrossIm_fx[bin] = L_shr( hDiracDecBin->ChCrossIm_fx[bin], q_diff ); + hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossRe_e[bin] ); + hDiracDecBin->ChCrossIm_e[bin] = hDiracDecBin->ChCrossRe_e[bin]; + } + ELSE + { + hDiracDecBin->ChCrossRe_fx[bin] = L_shl( hDiracDecBin->ChCrossRe_fx[bin], q_diff ); + hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossIm_e[bin] ); + hDiracDecBin->ChCrossRe_e[bin] = hDiracDecBin->ChCrossIm_e[bin]; + } + move32(); + move16(); + move16(); + + q_diff = sub( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ); + IF( q_diff > 0 ) + { + hDiracDecBin->ChCrossImOut_fx[bin] = L_shr( hDiracDecBin->ChCrossImOut_fx[bin], q_diff ); + hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossReOut_e[bin] ); + hDiracDecBin->ChCrossImOut_e[bin] = hDiracDecBin->ChCrossReOut_e[bin]; + } + ELSE + { + hDiracDecBin->ChCrossReOut_fx[bin] = L_shl( hDiracDecBin->ChCrossReOut_fx[bin], q_diff ); + hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossImOut_e[bin] ); + hDiracDecBin->ChCrossReOut_e[bin] = hDiracDecBin->ChCrossImOut_e[bin]; + } + move32(); + move16(); + move16(); +#else /* OPT_BIN_RENDERER_V1 */ IF( GT_16( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ) { hDiracDecBin->ChEne_fx[1][bin] = L_shr( hDiracDecBin->ChEne_fx[1][bin], sub( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ); @@ -1912,6 +2005,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( } move32(); move16(); +#endif /* OPT_BIN_RENDERER_V1 */ formulate2x2MixingMatrix_fx( hDiracDecBin->ChEne_fx[0][bin], hDiracDecBin->ChEne_fx[1][bin], hDiracDecBin->q_ChEne, @@ -2286,9 +2380,9 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { - hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin]; move16(); - hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin]; move16(); } q_processMtxPrev_SCCR[bin] = q_processMtx_bin; @@ -2296,13 +2390,13 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked ); - hDiracDecBin->processMtxRe_fx[0][add( chB, 2 )][bin] = extract_h( Mpy_32_32( lRealp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxRe_fx[0][chB + 2][bin] = extract_h( Mpy_32_32( lRealp_fx, gainFactor_fx ) ); move16(); - hDiracDecBin->processMtxIm_fx[0][add( chB, 2 )][bin] = extract_h( Mpy_32_32( lImagp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxIm_fx[0][chB + 2][bin] = extract_h( Mpy_32_32( lImagp_fx, gainFactor_fx ) ); move16(); - hDiracDecBin->processMtxRe_fx[1][add( chB, 2 )][bin] = extract_h( Mpy_32_32( rRealp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxRe_fx[1][chB + 2][bin] = extract_h( Mpy_32_32( rRealp_fx, gainFactor_fx ) ); move16(); - hDiracDecBin->processMtxIm_fx[1][add( chB, 2 )][bin] = extract_h( Mpy_32_32( rImagp_fx, gainFactor_fx ) ); + hDiracDecBin->processMtxIm_fx[1][chB + 2][bin] = extract_h( Mpy_32_32( rImagp_fx, gainFactor_fx ) ); move16(); q_processMtx_SCCR[bin] = sub( sub( add( Q28, q_gain ), 31 ), 16 ); move16(); @@ -2311,9 +2405,9 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( { FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { - hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin]; move16(); - hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin] = hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin]; + hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin] = hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin]; move16(); } q_processMtxPrev_SCCR[bin] = q_processMtx_SCCR[bin]; @@ -2368,13 +2462,13 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( { FOR( chB = 0; chB < nchanSeparateChannels; chB++ ) { - hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxRe_fx[chA][add( chB, 2 )][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx + hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxRe_fx[chA][chB + 2][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx move16(); - hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxIm_fx[chA][add( chB, 2 )][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx + hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxIm_fx[chA][chB + 2][bin], sub( q_processMtx_SCCR[bin], hDiracDecBin->q_processMtx ) ); // hDiracDecBin->q_processMtx move16(); - hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxRePrev_fx[chA][add( chB, 2 )][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev + hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxRePrev_fx[chA][chB + 2][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev move16(); - hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin] = shr( hDiracDecBin->processMtxImPrev_fx[chA][add( chB, 2 )][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev + hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin] = shr( hDiracDecBin->processMtxImPrev_fx[chA][chB + 2][bin], sub( q_processMtxPrev_SCCR[bin], hDiracDecBin->q_processMtxPrev ) ); // hDiracDecBin->q_processMtxPrev move16(); } } @@ -2421,6 +2515,10 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word32 *decSlotImPointer_fx; Word16 q_inp_mix, q_reverb = 31; move16(); +#ifdef OPT_BIN_RENDERER_V1 + Word16 ch_len = s_max( 4, numInChannels ); + Word16 eff_q; +#endif /* OPT_BIN_RENDERER_V1 */ IF( processReverb ) @@ -2434,7 +2532,11 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word16 shift = s_min( L_norm_arr( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length ), L_norm_arr( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length ) ); q_inp_mix = 31; move16(); +#ifdef OPT_BIN_RENDERER_V1 + FOR( Word16 i = 0; i < ch_len; i++ ) +#else /* OPT_BIN_RENDERER_V1 */ FOR( Word16 i = 0; i < 6; i++ ) +#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < nSlots; j++ ) { @@ -2461,7 +2563,14 @@ static void ivas_dirac_dec_binaural_process_output_fx( move16(); } + +#ifdef OPT_BIN_RENDERER_V1 + eff_q = sub( add( q_inp_mix, q_mat ), 15 ); + + FOR( Word16 i = 0; i < ch_len; i++ ) +#else /* OPT_BIN_RENDERER_V1 */ FOR( Word16 i = 0; i < 6; i++ ) +#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < nSlots; j++ ) { @@ -2471,8 +2580,13 @@ static void ivas_dirac_dec_binaural_process_output_fx( test(); IF( processReverb && LT_16( i, 2 ) ) { +#ifdef OPT_BIN_RENDERER_V1 + scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, eff_q ); /*q_inp_mix+q_mat-15*/ + scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, eff_q ); /*q_inp_mix+q_mat-15*/ +#else /* OPT_BIN_RENDERER_V1 */ scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ +#endif /* OPT_BIN_RENDERER_V1 */ } } } @@ -2636,7 +2750,11 @@ static void adaptTransportSignalsHeadtracked_fx( move16(); move16(); +#ifdef OPT_BIN_RENDERER_V1 + FOR( i = 0; i < 2; i++ ) +#else /* OPT_BIN_RENDERER_V1 */ FOR( i = 0; i < 6; i++ ) +#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < nSlots; j++ ) { @@ -3658,7 +3776,7 @@ static void matrixTransp2Mul_fx( { Word16 chA, chB; Word16 min_q_shift; - Word16 size = i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ); + Word16 size = BINAURAL_CHANNELS * BINAURAL_CHANNELS; IF( Ascale == 1 ) { @@ -4107,10 +4225,18 @@ static void formulate2x2MixingMatrix_fx( Sx_fx[1] = Sqrt32( Sx_fx[1], &exp1 ); move32(); q_Sx = sub( 31, s_max( exp, exp1 ) ); +#ifdef OPT_BIN_RENDERER_V1 + Word16 q_diff = sub( 31, q_Sx ); + Sx_fx[0] = L_shr( Sx_fx[0], sub( q_diff, exp ) ); // q_Sx + move32(); + Sx_fx[1] = L_shr( Sx_fx[1], sub( q_diff, exp1 ) ); // q_Sx + move32(); +#else /* OPT_BIN_RENDERER_V1 */ Sx_fx[0] = L_shr( Sx_fx[0], sub( sub( 31, exp ), q_Sx ) ); // q_Sx move32(); Sx_fx[1] = L_shr( Sx_fx[1], sub( sub( 31, exp1 ), q_Sx ) ); // q_Sx move32(); +#endif /* OPT_BIN_RENDERER_V1 */ matrixDiagMul_fx( Uxre_fx, Uxim_fx, q_Ux, Sx_fx, q_Sx, Kxre_fx, Kxim_fx, &q_Kx ); @@ -4178,11 +4304,18 @@ static void formulate2x2MixingMatrix_fx( move32(); q_Ghat = sub( 31, s_max( exp, exp1 ) ); - +#ifdef OPT_BIN_RENDERER_V1 + q_diff = sub( 31, q_Ghat ); + Ghat_fx[0] = L_shr( Ghat_fx[0], sub( q_diff, exp ) ); // q_Ghat + move32(); + Ghat_fx[1] = L_shr( Ghat_fx[1], sub( q_diff, exp1 ) ); // q_Ghat + move32(); +#else /* OPT_BIN_RENDERER_V1 */ Ghat_fx[0] = L_shr( Ghat_fx[0], sub( sub( 31, exp ), q_Ghat ) ); // q_Ghat move32(); Ghat_fx[1] = L_shr( Ghat_fx[1], sub( sub( 31, exp1 ), q_Ghat ) ); // q_Ghat move32(); +#endif /* OPT_BIN_RENDERER_V1 */ /* Matrix multiplication, tmp = Ky' * G_hat * Q */ FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -4195,8 +4328,8 @@ static void formulate2x2MixingMatrix_fx( q_GhatQ = sub( add( Q31, q_Ghat ), 31 ); exp = sub( s_min( L_norm_arr( KyRe_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ), L_norm_arr( KyIm_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ) ) ), 1 ); - scale_sig32( KyRe_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); - scale_sig32( KyIm_fx[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), exp ); + scale_sig32( KyRe_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); + scale_sig32( KyIm_fx[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, exp ); q_ky = add( q_ky, exp ); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -4204,7 +4337,7 @@ static void formulate2x2MixingMatrix_fx( FOR( chB = 0; chB < BINAURAL_CHANNELS; chB++ ) { tmpRe_fx[chA][chB] = Madd_32_32( Mpy_32_32( KyRe_fx[0][chA], GhatQ_fx[0][chB] ), KyRe_fx[1][chA], GhatQ_fx[1][chB] ); - tmpIm_fx[chA][chB] = Msub_32_32( Mpy_32_32( -KyIm_fx[0][chA], GhatQ_fx[0][chB] ), KyIm_fx[1][chA], GhatQ_fx[1][chB] ); + tmpIm_fx[chA][chB] = Msub_32_32( Mpy_32_32( L_negate( KyIm_fx[0][chA] ), GhatQ_fx[0][chB] ), KyIm_fx[1][chA], GhatQ_fx[1][chB] ); move32(); move32(); } @@ -4254,6 +4387,11 @@ static void formulate2x2MixingMatrix_fx( move32(); // 1310720000 = 10,000.0f in Q17 +#ifdef OPT_BIN_RENDERER_V1 + Word32 thresh = L_shl_sat( 1310720000, sub( q_div, Q17 ) ); // q_div + div_fx[0] = L_min( div_fx[0], thresh ); // q_div + div_fx[1] = L_min( div_fx[1], thresh ); // q_div +#else /* OPT_BIN_RENDERER_V1 */ IF( LT_16( q_div, Q17 ) ) { div_fx[0] = L_min( L_shr( 1310720000, sub( Q17, q_div ) ), div_fx[0] ); // q_div @@ -4270,6 +4408,7 @@ static void formulate2x2MixingMatrix_fx( q_div = Q17; move16(); } +#endif /* OPT_BIN_RENDERER_V1 */ matrixMul_fx( Are_fx, Aim_fx, &q_A, Ure_fx, Uim_fx, &q_U, tmpRe_fx, tmpIm_fx, &q_temp ); @@ -4286,6 +4425,13 @@ static void formulate2x2MixingMatrix_fx( W_tmp = W_mult0_32_32( tmpRe_fx[chA][chB], div_fx[chB] ); IF( W_tmp != 0 ) { +#ifdef OPT_BIN_RENDERER_V1 + Word16 hdrm = sub( W_norm( W_tmp ), 32 ); + tmpRe_fx[chA][chB] = W_shl_sat_l( W_tmp, hdrm ); + move32(); + hdrm_re[chA][chB] = add( add( q_temp, q_div ), hdrm ); + move16(); +#else /* OPT_BIN_RENDERER_V1 */ hdrm_re[chA][chB] = sub( W_norm( W_tmp ), 0 ); move16(); W_tmp = W_shl( W_tmp, hdrm_re[chA][chB] ); @@ -4293,6 +4439,7 @@ static void formulate2x2MixingMatrix_fx( move32(); hdrm_re[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_re[chA][chB] ), 32 ); move16(); +#endif /* OPT_BIN_RENDERER_V1 */ } ELSE { @@ -4303,6 +4450,14 @@ static void formulate2x2MixingMatrix_fx( W_tmp = W_mult0_32_32( tmpIm_fx[chA][chB], div_fx[chB] ); IF( W_tmp != 0 ) { +#ifdef OPT_BIN_RENDERER_V1 + Word16 hdrm = sub( W_norm( W_tmp ), 32 ); + move16(); + tmpIm_fx[chA][chB] = W_shl_sat_l( W_tmp, hdrm ); + move32(); + hdrm_im[chA][chB] = add( add( q_temp, q_div ), hdrm ); + move16(); +#else /* OPT_BIN_RENDERER_V1 */ hdrm_im[chA][chB] = sub( W_norm( W_tmp ), 0 ); move16(); W_tmp = W_shl( W_tmp, hdrm_im[chA][chB] ); @@ -4310,6 +4465,7 @@ static void formulate2x2MixingMatrix_fx( move32(); hdrm_im[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_im[chA][chB] ), 32 ); move16(); +#endif /* OPT_BIN_RENDERER_V1 */ } ELSE { @@ -4322,8 +4478,11 @@ static void formulate2x2MixingMatrix_fx( minimum_s( hdrm_re[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); q_temp = exp; move16(); - minimum_s( hdrm_im[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); + minimum_s( hdrm_im[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, &exp ); q_temp = s_min( q_temp, exp ); +#ifdef OPT_BIN_RENDERER_V1 + q_temp = sub( q_temp, 1 ); +#endif /* OPT_BIN_RENDERER_V1 */ FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { @@ -4337,7 +4496,11 @@ static void formulate2x2MixingMatrix_fx( } matrixTransp2Mul_fx( tmpRe_fx, tmpIm_fx, &q_temp, Ure_fx, Uim_fx, &q_U, +#ifdef OPT_BIN_RENDERER_V1 + 0 /*int Ascale*/, +#else /* OPT_BIN_RENDERER_V1 */ 1 /*int Ascale*/, +#endif /* OPT_BIN_RENDERER_V1 */ 0 /*int Bscale*/, Pre_fx, Pim_fx, &q_P ); /* Nearest orthonormal matrix P to matrix A formulated */ @@ -4454,9 +4617,9 @@ static void formulate2x2MixingMatrix_fx( move16(); } #endif - minimum_s( q_Pre[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); + minimum_s( q_Pre[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, &exp ); q_P = s_min( q_P, exp ); - minimum_s( q_Pim[0], i_mult( BINAURAL_CHANNELS, BINAURAL_CHANNELS ), &exp ); + minimum_s( q_Pim[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, &exp ); q_P = s_min( q_P, exp ); FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 12b94b1a2..b9b897f4a 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2271,6 +2271,16 @@ void ivas_binaural_reverb_processSubframe_fx( { Word32 leftRe_fx, rightRe_fx, leftIm_fx, rightIm_fx; +#ifdef OPT_BIN_RENDERER_V2 + leftRe_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ); // Q_in + rightRe_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ); // Q_in + leftIm_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ); // Q_in + rightIm_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), + hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ); // Q_in +#else /* OPT_BIN_RENDERER_V2 */ leftRe_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ), Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ) ); // Q_in rightRe_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ), @@ -2279,6 +2289,7 @@ void ivas_binaural_reverb_processSubframe_fx( Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ) ); // Q_in rightIm_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ) ); // Q_in +#endif /* OPT_BIN_RENDERER_V2 */ hReverb->outputBufferReal_fx[bin][0][sample] = leftRe_fx; // Q_in move32(); diff --git a/lib_rend/ivas_sba_rendering_fx.c b/lib_rend/ivas_sba_rendering_fx.c index 5e097ab2b..896742151 100644 --- a/lib_rend/ivas_sba_rendering_fx.c +++ b/lib_rend/ivas_sba_rendering_fx.c @@ -87,7 +87,11 @@ void ivas_sba_prototype_renderer_fx( Word16 norm_q = 31; // to handle overflow move16(); +#ifdef OPT_BIN_RENDERER_V1 + FOR( Word16 i = 0; i < 2; i++ ) +#else /* OPT_BIN_RENDERER_V1 */ FOR( Word16 i = 0; i < 6; i++ ) +#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { @@ -95,22 +99,39 @@ void ivas_sba_prototype_renderer_fx( } } norm_q = sub( sub( 31, norm_q ), 2 ); // to handle overflow - Word16 q_inp[6][CLDFB_SLOTS_PER_SUBFRAME]; + Word16 q_inp[2][CLDFB_SLOTS_PER_SUBFRAME]; +#ifdef OPT_BIN_RENDERER_V1 + FOR( Word16 i = 0; i < 2; i++ ) +#else /* OPT_BIN_RENDERER_V1 */ FOR( Word16 i = 0; i < 6; i++ ) +#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { +#ifdef OPT_BIN_RENDERER_V1 + q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], num_cldfb_bands ), L_norm_arr( inIm_fx[i][j], num_cldfb_bands ) ); +#else /* OPT_BIN_RENDERER_V1 */ q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], CLDFB_NO_CHANNELS_MAX ), L_norm_arr( inIm_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ); +#endif /* OPT_BIN_RENDERER_V1 */ move16(); norm_q = s_min( q_inp[i][j], norm_q ); } } +#ifdef OPT_BIN_RENDERER_V1 + FOR( Word16 i = 0; i < 2; i++ ) +#else /* OPT_BIN_RENDERER_V1 */ FOR( Word16 i = 0; i < 6; i++ ) +#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { - scale_sig32( inRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q - scale_sig32( inIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q +#ifdef OPT_BIN_RENDERER_V1 + scale_sig32( inRe_fx[i][j], num_cldfb_bands, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q + scale_sig32( inIm_fx[i][j], num_cldfb_bands, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q +#else /* OPT_BIN_RENDERER_V1 */ + scale_sig32( inRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q + scale_sig32( inIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q +#endif /* OPT_BIN_RENDERER_V1 */ q_cldfb[i][j] = sub( add( q_cldfb[i][j], norm_q ), 2 ); move16(); } @@ -178,12 +199,21 @@ void ivas_sba_prototype_renderer_fx( FOR( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) { /* accumulate contributions from all SPAR bands */ +#ifdef OPT_BIN_RENDERER_V1 + cldfb_par_fx = Madd_32_32( cldfb_par_fx, mixer_mat_fx[out_ch][in_ch][spar_band], L_shl_sat( bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band], 9 ) ); // hMdDec->Q_mixer_matrix +#else /* OPT_BIN_RENDERER_V1 */ cldfb_par_fx = L_add( cldfb_par_fx, Mpy_32_32( mixer_mat_fx[out_ch][in_ch][spar_band], bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band] ) ); // hMdDec->Q_mixer_matrix +#endif /* OPT_BIN_RENDERER_V1 */ } } - out_re_fx[out_ch] = L_add( out_re_fx[out_ch], Mpy_32_32( inRe_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 - out_im_fx[out_ch] = L_add( out_im_fx[out_ch], Mpy_32_32( inIm_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 +#ifdef OPT_BIN_RENDERER_V1 + out_re_fx[out_ch] = Madd_32_32( out_re_fx[out_ch], inRe_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 + out_im_fx[out_ch] = Madd_32_32( out_im_fx[out_ch], inIm_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 +#else /* OPT_BIN_RENDERER_V1 */ + out_re_fx[out_ch] = L_add( out_re_fx[out_ch], Mpy_32_32( inRe_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 + out_im_fx[out_ch] = L_add( out_im_fx[out_ch], Mpy_32_32( inIm_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 +#endif /* OPT_BIN_RENDERER_V1 */ move32(); move32(); } @@ -242,11 +272,41 @@ void ivas_sba_prototype_renderer_fx( { IF( EQ_16( st_ivas->nchan_transport, 1 ) ) /* Dual mono */ { +#ifdef OPT_BIN_RENDERER_V1 + Copy32( inRe_fx[0][ts], inRe_fx[1][ts], num_cldfb_bands ); + Copy32( inIm_fx[0][ts], inIm_fx[1][ts], num_cldfb_bands ); +#else /* OPT_BIN_RENDERER_V1 */ Copy32( inRe_fx[0][ts], inRe_fx[1][ts], CLDFB_NO_CHANNELS_MAX ); Copy32( inIm_fx[0][ts], inIm_fx[1][ts], CLDFB_NO_CHANNELS_MAX ); +#endif /* OPT_BIN_RENDERER_V1 */ } ELSE IF( EQ_16( st_ivas->nchan_transport, 2 ) ) /* Opposing cardioids */ { +#ifdef OPT_BIN_RENDERER_V1 + Word32 temp_signal_fx; + FOR( Word16 idx = 0; idx < num_cldfb_bands; idx++ ) + { + Word32 op1 = L_shr( inRe_fx[0][ts][idx], 1 ); + Word32 op2 = L_shr( inRe_fx[1][ts][idx], 1 ); + temp_signal_fx = L_add( op1, op2 ); // q_cldfb[][]-1 + inRe_fx[1][ts][idx] = L_sub( op1, op2 ); // q_cldfb[][]-1 + move32(); + inRe_fx[0][ts][idx] = temp_signal_fx; + move32(); + } + + FOR( Word16 idx = 0; idx < num_cldfb_bands; idx++ ) + { + Word32 op1 = L_shr( inIm_fx[0][ts][idx], 1 ); + Word32 op2 = L_shr( inIm_fx[1][ts][idx], 1 ); + temp_signal_fx = L_add( op1, op2 ); // q_cldfb[][]-1 + move32(); + inIm_fx[1][ts][idx] = L_sub( op1, op2 ); // q_cldfb[][]-1 + move32(); + inIm_fx[0][ts][idx] = temp_signal_fx; + move32(); + } +#else /* OPT_BIN_RENDERER_V1 */ Word32 temp_signal_fx[CLDFB_NO_CHANNELS_MAX]; FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { @@ -267,6 +327,7 @@ void ivas_sba_prototype_renderer_fx( inIm_fx[0][ts][idx] = temp_signal_fx[idx]; move32(); } +#endif /* OPT_BIN_RENDERER_V1 */ } } } -- GitLab From a50df063f2a379c7abb1ab96dc4c36a6675820f7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 09:59:19 +0530 Subject: [PATCH 0757/1310] Clang formatting changes --- lib_dec/ivas_binRenderer_internal_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index ee6304e6e..ae16bf7b5 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -144,7 +144,7 @@ static void ivas_binRenderer_filterModule_fx( Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); // Q_curr -1 Word32 temp2 = L_shr( filterStatesLeftImagPtr_fx[0], 1 ); // Q_curr -1 - Word32 neg_temp2 = L_negate( temp2 ); // Q_curr -1 + Word32 neg_temp2 = L_negate( temp2 ); // Q_curr -1 outRealLeft_fx = W_mac_32_32( outRealLeft_fx, temp1, filterTapsLeftRealPtr_fx[0] ); -- GitLab From d5d3ed62850d25c0751ed0df4ec83259374379c9 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 11:31:01 +0530 Subject: [PATCH 0758/1310] Fix for 3GPP issue 1457: Stereo Encoder 32 kbps: More rattling artifcats in 16 kHz LTVs Link #1457 --- lib_enc/ivas_cpe_enc_fx.c | 10 +++-- lib_enc/ivas_stereo_dft_enc_itd_fx.c | 26 ++++++++++- lib_enc/ivas_stereo_dft_td_itd_fx.c | 66 +++++++++++++++++++++------- 3 files changed, 79 insertions(+), 23 deletions(-) diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index d0a33ed09..0cd7532d5 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -649,10 +649,11 @@ ivas_error ivas_cpe_enc_fx( hCPE->hStereoDft->Spd_R_smooth_fx_e = sub( hCPE->hStereoDft->Spd_R_smooth_fx_e, temp ); move16(); - + q_com = MAX_16; + move16(); FOR( n = 0; n < CPE_CHANNELS; n++ ) { - q_com = sub( add( L_norm_arr( sts[n]->input32_fx, input_frame ), sts[n]->q_inp32 ), 16 ); + q_com = s_min( q_com, sub( add( L_norm_arr( sts[n]->input32_fx, input_frame ), sts[n]->q_inp32 ), 16 ) ); q_com = s_min( q_com, sub( add( L_norm_arr( sts[n]->old_input_signal32_fx, input_frame ), sts[n]->q_old_inp32 ), 16 ) ); q_com = s_min( q_com, add( norm_arr( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl ), hCPE->q_input_mem[n] ) ); @@ -661,7 +662,9 @@ ivas_error ivas_cpe_enc_fx( q_com = 0; move16(); } - + } + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { Copy_Scale_sig_32_16( sts[n]->input32_fx, sts[n]->input_fx, input_frame, sub( q_com, sts[n]->q_inp32 ) ); sts[n]->q_inp = q_com; move16(); @@ -674,7 +677,6 @@ ivas_error ivas_cpe_enc_fx( hCPE->q_input_mem[n] = q_com; move16(); } - stereo_dft_hybrid_ITD_flag_fx( hCPE->hStereoDft->hConfig, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max ); /* Time Domain ITD compensation using extrapolation */ diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c index 1beacd19a..28bac9e8b 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c @@ -169,7 +169,8 @@ static void stereo_dft_quantize_itd_fx( Word16 *ind ) { Word16 itd; - + Word16 input_fs_by_stereo_dft_itd_fs = 0; + move16(); // itd = (int16_t) ( sign( in ) * 0.5f + in ); itd = in; move16(); @@ -188,9 +189,30 @@ static void stereo_dft_quantize_itd_fx( move16(); } + SWITCH( input_Fs ) + { + case 8000: + input_fs_by_stereo_dft_itd_fs = 1; // Q2 + move16(); + BREAK; + case 16000: + input_fs_by_stereo_dft_itd_fs = 2; // Q2 + move16(); + BREAK; + case 32000: + input_fs_by_stereo_dft_itd_fs = 4; // Q2 + move16(); + BREAK; + case 48000: + input_fs_by_stereo_dft_itd_fs = 6; // Q2 + move16(); + BREAK; + default: + assert( 0 ); + } /*Convert back @ fs*/ //*out = (float) ( itd * input_Fs ) / ( (float) ( STEREO_DFT_ITD_FS ) ); - *out = Mpy_32_32( L_shl( itd * input_Fs, 2 ), 1099511628 /*Q45*/ ); // Q45+Q2-Q31 = Q16 + *out = L_shl( L_mult( itd, input_fs_by_stereo_dft_itd_fs ), Q13 ); // Q16 move32(); return; diff --git a/lib_enc/ivas_stereo_dft_td_itd_fx.c b/lib_enc/ivas_stereo_dft_td_itd_fx.c index 309ec3377..33763d4cc 100644 --- a/lib_enc/ivas_stereo_dft_td_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_td_itd_fx.c @@ -50,9 +50,9 @@ #define STEREO_DFT_CHANNEL_EXTR_LPC_ORDER 10 #define STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT 320 -#define FLR_FX 16384 // Q15 -#define ONE_HALF 24576 // Q14 -const Word16 wac_swb_h_fx[LPC_SHB_ORDER + 1] = { // Q15 +#define FLR_FX 1073741824 // Q31 +#define ONE_HALF 24576 // Q14 +const Word16 wac_swb_h_fx[LPC_SHB_ORDER + 1] = { // Q15 32767, 32758, 32731, @@ -95,7 +95,12 @@ static void stereo_td_get_td_itd_fx( { /* *td_itd is the closest integer to itd that transforms into an integer value * * under the transform x -> (32000/fs) x. */ - Word16 d, d_e; + Word32 inverse_input_fs_by_16k = 0; + move32(); + Word64 tmp64; + Word16 d = 0, shift = 0; + move16(); + move16(); IF( EQ_32( input_Fs, 32000 ) ) { @@ -106,24 +111,51 @@ static void stereo_td_get_td_itd_fx( ELSE { assert( ( input_Fs % 16000 ) == 0 && "sampling frequency should be divisible by 16000" ); - Word16 temp_div, temp_e, temp_add; - d = BASOP_Util_Divide3232_Scale( input_Fs, 16000, &d_e ); - temp_div = BASOP_Util_Divide3232_Scale( itd, L_deposit_h( d ), &temp_e ); - temp_e = add( temp_e, sub( sub( 31, q_itd ), d_e ) ); // e+(e1-e2)// - temp_add = add_sat( temp_div, shr_sat( FLR_FX, temp_e ) ); - - IF( itd != 0 ) + IF( itd == 0 ) { - *td_itd_32 = extract_l( L_shl( L_shr( L_add( temp_add, EPSILON_FX ), sub( 15, temp_e ) ), 1 ) ); + *td_itd_32 = *td_itd = 0; + move16(); + move16(); } ELSE { - *td_itd_32 = shl( shr( temp_add, sub( 15, temp_e ) ), 1 ); - } - move16(); + SWITCH( input_Fs ) + { + case 16000: + inverse_input_fs_by_16k = 1073741824; // Q30 /* This is in Q30, because 2147483648 cannot be represnt in Word32*/ + move32(); + d = 1; // Q0 + move16(); + shift = 1; + move16(); + BREAK; + case 32000: + inverse_input_fs_by_16k = 1073741824; // Q31 + move32(); + d = 2; // Q0 + move16(); + BREAK; + case 48000: + inverse_input_fs_by_16k = 715827883; // Q31 + move32(); + d = 3; // Q0 + move16(); + if (itd < 0 ) + { + inverse_input_fs_by_16k = 715827882; /* Reducing the precision by 1 to handle multiplication of negative case*/ + move32(); + } + BREAK; + default: + assert( 0 ); + } + tmp64 = W_add( W_mult0_32_32( itd, inverse_input_fs_by_16k ), W_shl( FLR_FX, sub( q_itd, shift ) ) ); // Q: q_itd - shift + 31 + *td_itd_32 = shl( extract_l( W_extract_l( W_shr( tmp64, add( sub( q_itd, shift ), Q31 ) ) ) ), 1 ); // Q0 + move16(); - *td_itd = i_mult( shr( *td_itd_32, 1 ), shr( d, sub( 15, d_e ) ) ); - move16(); + *td_itd = i_mult( shr( *td_itd_32, 1 ), d ); // Q0 + move16(); + } } return; -- GitLab From 306f26e2237a46381b687aaf4c6ae86243ea5077 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 11:34:05 +0530 Subject: [PATCH 0759/1310] Clang formatting changes --- lib_enc/ivas_stereo_dft_td_itd_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_dft_td_itd_fx.c b/lib_enc/ivas_stereo_dft_td_itd_fx.c index 33763d4cc..a0d49176f 100644 --- a/lib_enc/ivas_stereo_dft_td_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_td_itd_fx.c @@ -140,7 +140,7 @@ static void stereo_td_get_td_itd_fx( move32(); d = 3; // Q0 move16(); - if (itd < 0 ) + if ( itd < 0 ) { inverse_input_fs_by_16k = 715827882; /* Reducing the precision by 1 to handle multiplication of negative case*/ move32(); -- GitLab From 67f74ae7d4354cfb68eac5ca5b4746d60694c5ed Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 11:36:09 +0530 Subject: [PATCH 0760/1310] Fix for 3GPP issue 1504: BASOP decoder to MONO output for MASA 2TC LTV input exhibits higher MLD Link #1504 --- lib_rend/ivas_dirac_rend_fx.c | 122 ++++++++++++---------------------- lib_rend/ivas_stat_rend.h | 4 +- 2 files changed, 44 insertions(+), 82 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 063c70f66..99a84bf52 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -1759,17 +1759,19 @@ void protoSignalComputation2_fx( Word32 lr_total_bb_ratio_fx, lr_total_hi_ratio_fx; Word32 min_sum_total_ratio_fx, min_sum_total_ratio_db_fx; Word32 sum_total_ratio_fx[MASA_SUM_FREQ_RANGE_BINS]; - Word16 q_sum_total_ratio; + Word16 exp_sum_total_ratio_fx[MASA_SUM_FREQ_RANGE_BINS]; + Word16 q_sum_total_ratio = 0; + move16(); Word32 a_fx, b_fx, a2_fx, b2_fx; Word16 interpolatorSpaced_fx, interpolatorDmx_fx; Word32 tempSpaced_fx, tempDmx_fx; #ifdef FIX_867_CLDFB_NRG_SCALE - Word16 q_shift, min_q_shift[2], exp, q_temp[2], temp_q_shift, q_temp2; + Word16 q_shift, min_q_shift[2], exp, q_temp[2]; #else Word16 q_shift, min_q_shift, exp, q_temp, temp_q_shift, q_temp2; #endif Word32 temp; - Word64 W_tmp1, W_tmp2; + Word64 W_tmp1, W_tmp2, W_tmp3; Word64 reference_power_64fx[CLDFB_NO_CHANNELS_MAX]; Word16 q_reference_power_64fx; Word16 head_room, q_Left_Right_power; @@ -1786,9 +1788,7 @@ void protoSignalComputation2_fx( min_q_shift = Q31; move16(); #endif - temp_q_shift = Q31; - move16(); - q_sum_total_ratio = Q31; + q_sum_total_ratio = 0; move16(); exp = 0; move16(); @@ -1813,7 +1813,6 @@ void protoSignalComputation2_fx( min_q_shift = s_min( min_q_shift, q_shift ); #endif q_shift = s_min( L_norm_arr( RealBuffer_fx[l][0], s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ), L_norm_arr( ImagBuffer_fx[l][0], s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) ); - temp_q_shift = s_min( temp_q_shift, q_shift ); } #ifdef FIX_867_CLDFB_NRG_SCALE @@ -1822,7 +1821,6 @@ void protoSignalComputation2_fx( #else min_q_shift = sub( min_q_shift, 2 ); // guard bits #endif - temp_q_shift = sub( temp_q_shift, 2 ); // guard bits /* Upscaling of the buffer proto_power_smooth_fx */ #ifdef FIX_867_CLDFB_NRG_SCALE @@ -2072,7 +2070,7 @@ void protoSignalComputation2_fx( } #ifdef FIX_867_CLDFB_NRG_SCALE - Word16 total_shift[2], q_temp_total; + Word16 total_shift[2]; /* total_shift shift required to get common Q of sum power values */ total_shift[0] = shl( s_max( 0, sub( min_q_shift[0], min_q_shift[1] ) ), 1 ); total_shift[1] = shl( s_max( 0, sub( min_q_shift[1], min_q_shift[0] ) ), 1 ); @@ -2080,13 +2078,11 @@ void protoSignalComputation2_fx( min_q_shift[1] = sub( min_q_shift[1], idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) ); q_temp[0] = sub( add( add( q_cldfb, min_q_shift[0] ), add( q_cldfb, min_q_shift[0] ) ), 31 ); q_temp[1] = sub( add( add( q_cldfb, min_q_shift[1] ), add( q_cldfb, min_q_shift[1] ) ), 31 ); - q_temp_total = s_min( q_temp[0], q_temp[1] ); #else min_q_shift = sub( min_q_shift, idiv1616( find_guarded_bits_fx( num_freq_bands ), 2 ) ); q_temp = sub( add( add( q_cldfb, min_q_shift ), add( q_cldfb, min_q_shift ) ), 31 ); #endif - q_temp2 = sub( add( add( q_cldfb, temp_q_shift ), add( q_cldfb, temp_q_shift ) ), 31 ); head_room = 63; move16(); @@ -2195,77 +2191,50 @@ void protoSignalComputation2_fx( IF( LT_16( l, s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ) ) ) { -#ifdef FIX_867_CLDFB_NRG_SCALE - re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift[0] ) ); // q_cldfb+temp_q_shift - im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift[0] ) ); // q_cldfb+temp_q_shift -#else - re_aux = L_shl( Real_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift - im_aux = L_shl( Imag_aux_fx, sub( temp_q_shift, min_q_shift ) ); // q_cldfb+temp_q_shift -#endif + re_aux = L_add( L_shr( RealBuffer_fx[0][0][l], 1 ), L_shr( RealBuffer_fx[1][0][l], 1 ) ); + im_aux = L_add( L_shr( ImagBuffer_fx[0][0][l], 1 ), L_shr( ImagBuffer_fx[1][0][l], 1 ) ); - sum_power_fx = Madd_32_32( Mpy_32_32( re_aux, re_aux ), im_aux, im_aux ); // 2*(q_cldfb+temp_q_shift)-31 - temp = Mpy_32_32( a_fx, sum_power_fx ); // 2*(q_cldfb+temp_q_shift)-31 + W_tmp3 = W_add( W_mult0_32_32( re_aux, re_aux ), W_mult0_32_32( im_aux, im_aux ) ); + q_shift = W_norm( W_tmp3 ); + sum_power_fx = W_extract_h( W_shl( W_tmp3, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( sub( q_cldfb, 1 ), 1 ), q_shift ), 32 ) ); - IF( LT_16( q_temp2, stereo_type_detect->q_sum_power ) ) - { - stereo_type_detect->sum_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->sum_power_fx[l] ), sub( stereo_type_detect->q_sum_power, q_temp2 ) ) ); // q_temp2 - move32(); - } - ELSE - { - stereo_type_detect->sum_power_fx[l] = L_add( L_shr( temp, sub( q_temp2, stereo_type_detect->q_sum_power ) ), Mpy_32_32( b_fx, stereo_type_detect->sum_power_fx[l] ) ); // stereo_type_detect->q_sum_power - move32(); - } + stereo_type_detect->sum_power_fx[l] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, sum_power_fx ), exp_temppp, Mpy_32_32( b_fx, stereo_type_detect->sum_power_fx[l] ), stereo_type_detect->exp_sum_power[l], &stereo_type_detect->exp_sum_power[l] ); + move32(); + W_tmp1 = W_add( W_mult0_32_32( RealBuffer_fx[0][0][l], RealBuffer_fx[0][0][l] ), W_mult0_32_32( ImagBuffer_fx[0][0][l], ImagBuffer_fx[0][0][l] ) ); + W_tmp2 = W_add( W_mult0_32_32( RealBuffer_fx[1][0][l], RealBuffer_fx[1][0][l] ), W_mult0_32_32( ImagBuffer_fx[1][0][l], ImagBuffer_fx[1][0][l] ) ); -#ifdef FIX_867_CLDFB_NRG_SCALE - temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], add( 31, total_shift[qidx] ) ) ) ); // 2*(q_cldfb+min_q_shift) -31 - IF( LT_16( q_temp_total, stereo_type_detect->q_total_power ) ) - { - stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp_total ) ) ); // q_temp - move32(); - } - ELSE - { - stereo_type_detect->total_power_fx[l] = L_add( L_shr( temp, sub( q_temp_total, stereo_type_detect->q_total_power ) ), Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ) ); // stereo_type_detect->q_total_power - move32(); - } -#else - temp = Mpy_32_32( a_fx, W_extract_l( W_shr( reference_power_64fx[l], 31 ) ) ); // 2*(q_cldfb+min_q_shift) -31 - IF( LT_16( q_temp, stereo_type_detect->q_total_power ) ) - { - stereo_type_detect->total_power_fx[l] = L_add( temp, L_shr( Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), sub( stereo_type_detect->q_total_power, q_temp ) ) ); // q_temp - move32(); - } - ELSE - { - stereo_type_detect->total_power_fx[l] = L_add( L_shr( temp, sub( q_temp, stereo_type_detect->q_total_power ) ), Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ) ); // stereo_type_detect->q_total_power - move32(); - } -#endif + W_tmp2 = W_add( W_tmp1, W_tmp2 ); + q_shift = W_norm( W_tmp2 ); + Total_power_fx = W_extract_h( W_shl( W_tmp2, q_shift ) ); + exp_temppp = sub( 31, sub( add( shl( q_cldfb, 1 ), q_shift ), 32 ) ); + + stereo_type_detect->total_power_fx[l] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, Total_power_fx ), exp_temppp, Mpy_32_32( b_fx, stereo_type_detect->total_power_fx[l] ), stereo_type_detect->exp_total_power[l], &stereo_type_detect->exp_total_power[l] ); + move32(); test(); IF( ( stereo_type_detect->sum_power_fx[l] == 0 ) && ( stereo_type_detect->total_power_fx[l] == 0 ) ) { sum_total_ratio_fx[l] = MAX_32; // q15 move32(); + exp_sum_total_ratio_fx[l] = 16; + move16(); } ELSE IF( stereo_type_detect->total_power_fx[l] == 0 ) { sum_total_ratio_fx[l] = MAX_32; // q15 move32(); + exp_sum_total_ratio_fx[l] = 16; + move16(); } ELSE { - sum_total_ratio_fx[l] = BASOP_Util_Divide3232_Scale( stereo_type_detect->sum_power_fx[l], stereo_type_detect->total_power_fx[l], &exp ); // 15-(exp+s_min( stereo_type_detect->q_total_power, q_temp )-s_min( stereo_type_detect->q_sum_power, q_temp2 )) - move32(); -#ifdef FIX_867_CLDFB_NRG_SCALE - q_sum_total_ratio = add( sub( 15, exp ), sub( s_min( stereo_type_detect->q_sum_power, q_temp2 ), s_min( stereo_type_detect->q_total_power, q_temp_total ) ) ); -#else - q_sum_total_ratio = add( sub( 15, exp ), sub( s_min( stereo_type_detect->q_sum_power, q_temp2 ), s_min( stereo_type_detect->q_total_power, q_temp ) ) ); -#endif - sum_total_ratio_fx[l] = L_shl( sum_total_ratio_fx[l], sub( Q15, q_sum_total_ratio ) ); // q15 + sum_total_ratio_fx[l] = BASOP_Util_Divide3232_Scale_newton( stereo_type_detect->sum_power_fx[l], stereo_type_detect->total_power_fx[l], &exp ); // 15-(exp+s_min( stereo_type_detect->q_total_power, q_temp )-s_min( stereo_type_detect->q_sum_power, q_temp2 )) move32(); + exp_sum_total_ratio_fx[l] = add( exp, sub( stereo_type_detect->exp_sum_power[l], stereo_type_detect->exp_total_power[l] ) ); + move16(); } + q_sum_total_ratio = s_max( q_sum_total_ratio, exp_sum_total_ratio_fx[l] ); } IF( l == 0 ) @@ -2626,18 +2595,6 @@ void protoSignalComputation2_fx( move32(); } - stereo_type_detect->q_sum_power = s_min( stereo_type_detect->q_sum_power, q_temp2 ); - move16(); -#ifdef FIX_867_CLDFB_NRG_SCALE - stereo_type_detect->q_total_power = s_min( stereo_type_detect->q_total_power, q_temp_total ); - move16(); -#else - stereo_type_detect->q_total_power = s_min( stereo_type_detect->q_total_power, q_temp ); - move16(); -#endif - q_sum_total_ratio = Q15; - move16(); - IF( stereo_type_detect->interpolator > 0 ) { stereo_type_detect->interpolator++; @@ -2767,8 +2724,15 @@ void protoSignalComputation2_fx( // 20480 = 10 in Q11 lr_total_hi_ratio_fx = Mpy_32_16_1( temp, 20480 ); // Q21 + FOR( Word16 i = 0; i < s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ); i++ ) + { + sum_total_ratio_fx[i] = L_shl( sum_total_ratio_fx[i], sub( exp_sum_total_ratio_fx[i], q_sum_total_ratio ) ); + move32(); + } + minimum_l( sum_total_ratio_fx, s_min( num_freq_bands, MASA_SUM_FREQ_RANGE_BINS ), &min_sum_total_ratio_fx ); // q_sum_total_ratio - exp = sub( 31, q_sum_total_ratio ); + exp = q_sum_total_ratio; + move16(); temp = BASOP_Util_Log2( min_sum_total_ratio_fx ); // q25 IF( NE_32( temp, MIN_32 ) ) { @@ -3537,10 +3501,8 @@ void ivas_masa_init_stereotype_detection_fx( set32_fx( stereo_type_detect->sum_power_fx, 0, MASA_SUM_FREQ_RANGE_BINS ); set32_fx( stereo_type_detect->total_power_fx, 0, MASA_SUM_FREQ_RANGE_BINS ); - stereo_type_detect->q_sum_power = Q31; - move16(); - stereo_type_detect->q_total_power = Q31; - move16(); + set16_fx( stereo_type_detect->exp_sum_power, 0, MASA_SUM_FREQ_RANGE_BINS ); + set16_fx( stereo_type_detect->exp_total_power, 0, MASA_SUM_FREQ_RANGE_BINS ); stereo_type_detect->subtract_power_y_fx = 0; move32(); diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 90e4f5d69..a13ee27e7 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -395,9 +395,9 @@ typedef struct Word16 q_total_hi_power; Word32 sum_power_fx[MASA_SUM_FREQ_RANGE_BINS]; /* Q(q_sum_power) */ - Word16 q_sum_power; + Word16 exp_sum_power[MASA_SUM_FREQ_RANGE_BINS]; Word32 total_power_fx[MASA_SUM_FREQ_RANGE_BINS]; /* Q(q_total_power) */ - Word16 q_total_power; + Word16 exp_total_power[MASA_SUM_FREQ_RANGE_BINS]; Word32 subtract_power_y_fx; /* Q(q_subtract_power_y) */ Word16 q_subtract_power_y; -- GitLab From 30a34f9e30c460771ea363c3a283f80e5f7794c3 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 09:05:34 +0200 Subject: [PATCH 0761/1310] activated compiler switch --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index b6ae74594..8b312e21b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,7 +110,7 @@ #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ -//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ -- GitLab From 5132711f954eb053dbb6134abf728ea517be653a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 12:37:41 +0530 Subject: [PATCH 0762/1310] Fix for 3GPP issue 1715: Possible typo in array initialization in function ivas_dirac_render_sf_fx() Link #1715 --- lib_dec/ivas_dirac_dec_fx.c | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index f29133d92..03bc7ee12 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2217,27 +2217,6 @@ void ivas_dirac_dec_render_sf_fx( move16(); move16(); - - FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - set32_fx( Cldfb_RealBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( Cldfb_ImagBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - } - } - -#ifndef OPT_BIN_RENDERER_V2 - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - } - } -#endif /* OPT_BIN_RENDERER_V2 */ - /* local copies of azi, ele, diffuseness */ Word16 azimuth[CLDFB_NO_CHANNELS_MAX]; Word16 elevation[CLDFB_NO_CHANNELS_MAX]; @@ -2288,6 +2267,27 @@ void ivas_dirac_dec_render_sf_fx( push_wmops( "ivas_dirac_dec_render" ); /* Initialize aux buffers */ + + FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + set32_fx( Cldfb_RealBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( Cldfb_ImagBuffer_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + } + } + +#ifndef OPT_BIN_RENDERER_V2 + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( Cldfb_ImagBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); + } + } +#endif /* OPT_BIN_RENDERER_V2 */ + hDirAC = st_ivas->hDirAC; hDirACRend = st_ivas->hDirACRend; hSpatParamRendCom = st_ivas->hSpatParamRendCom; -- GitLab From 3ace968fd0ecc07f2ada5201f57474ddbb2aeac5 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Wed, 28 May 2025 09:11:00 +0200 Subject: [PATCH 0763/1310] delete move16 where it is not required --- lib_dec/waveadjust_fec_dec_fx.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib_dec/waveadjust_fec_dec_fx.c b/lib_dec/waveadjust_fec_dec_fx.c index 0e5898d64..e0c599e23 100644 --- a/lib_dec/waveadjust_fec_dec_fx.c +++ b/lib_dec/waveadjust_fec_dec_fx.c @@ -936,12 +936,10 @@ void concealment_decode_fix( IF( GE_16( rnd, 0 ) ) { sign = 1; - move16(); } ELSE IF( LT_16( rnd, 0 ) ) { sign = -1; - move16(); } #else sign = add( shl( shr( own_random_fix( seed ), 15 ), 1 ), 1 ); -- GitLab From cf1db1c57390b424eb7c5e0e2f0dcde6892ca068 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 13:53:18 +0530 Subject: [PATCH 0764/1310] Fix for 3GPP issue 1267: High MLD for ParamMC 5.1 at 80 kbps with +10dB Input gain Link #1267 --- lib_enc/ivas_core_enc_fx.c | 15 ++++++++++----- lib_enc/ivas_core_pre_proc_front_fx.c | 4 ++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib_enc/ivas_core_enc_fx.c b/lib_enc/ivas_core_enc_fx.c index 6fcb8abd0..ad998beb3 100644 --- a/lib_enc/ivas_core_enc_fx.c +++ b/lib_enc/ivas_core_enc_fx.c @@ -113,7 +113,7 @@ ivas_error ivas_core_enc_fx( Word16 diff_nBits; ivas_error error; Word16 max_num_indices_BWE; - Word16 i; + Word16 i, shift, Q_min; set32_fx( new_swb_speech_buffer_fx, 0, L_FRAME48k + STEREO_DFT_OVL_MAX ); set16_fx( new_swb_speech_buffer_fx_16, 0, L_FRAME48k + STEREO_DFT_OVL_MAX ); @@ -531,11 +531,16 @@ ivas_error ivas_core_enc_fx( st->hTcxEnc->exp_buf_speech_ltp = st->exp_buf_speech_enc; move16(); } - Scale_sig( st->input_fx, input_frame, sub( -1, st->q_inp ) ); - Scale_sig( st->input_fx - input_frame, input_frame, sub( -1, st->q_old_inp ) ); - st->q_inp = -1; + shift = norm_arr( st->input_fx, input_frame ); + Q_min = s_max( -2, add( st->q_inp, shift ) ); + scale_sig( st->input_fx, input_frame, sub( Q_min, st->q_inp ) ); + st->q_inp = Q_min; move16(); - st->q_old_inp = -1; + + shift = norm_arr( st->input_fx - input_frame, input_frame ); + Q_min = s_max( -2, add( st->q_old_inp, shift ) ); + scale_sig( st->input_fx - input_frame, input_frame, sub( Q_min, st->q_old_inp ) ); + st->q_old_inp = Q_min; move16(); } diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 106d7c387..3e7bf2464 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -232,7 +232,7 @@ ivas_error pre_proc_front_ivas_fx( Word16 Q_min = add( sub( 15, st->exp_old_inp_12k8 ), norm_arr( st->old_inp_12k8_fx, L_INP_MEM ) ); Word16 input_frame_full = shl( input_frame, 1 ); //(old frame input length + new frame input length) Q_min = s_min( Q_min, sub( add( getScaleFactor32( st->input32_fx - input_frame, input_frame_full ), st->q_inp32 ), 16 ) ); - Q_min = s_max( -1, Q_min ); + Q_min = s_max( -2, Q_min ); Copy_Scale_sig_32_16( st->input32_fx - input_frame, st->input_fx - input_frame, input_frame_full, sub( Q_min, st->q_inp32 ) ); // Q_min st->q_inp = Q_min; move16(); @@ -682,7 +682,7 @@ ivas_error pre_proc_front_ivas_fx( } st->mem_preemph_fx = shl_sat( st->mem_preemph_fx_q_inp, sub( -1, st->q_inp ) ); /*Q(-1) saturation added as float value goes above 65536 for +10 dB test (ltv48_MC512.wav and ltv48_MC51.wav) */ move16(); - st->mem_preemph_DFT_fx = shl( st->mem_preemph_DFT_fx_q_inp, sub( -1, st->q_inp ) ); /*Q(-1)*/ + st->mem_preemph_DFT_fx = shl_sat( st->mem_preemph_DFT_fx_q_inp, sub( -1, st->q_inp ) ); /*Q(-1)*/ move16(); st->mem_preemph_q = st->q_inp; move16(); -- GitLab From 3a4574860727f24356cd52fe6a5c20ab4fad68df Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 28 May 2025 10:42:02 +0200 Subject: [PATCH 0765/1310] Revert not rescaling of xn_buf_fx in case of MDCT TCX20. --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 172f32685..4ab18e102 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3423,7 +3423,7 @@ void IMDCT_ivas_fx( // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 2 ); } - IMDCT_ivas_fx_rescale( NULL, NULL, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); + IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif Word16 q_diff = sub( q_xn_buf_fx_32, q_win ); -- GitLab From 75dbe8183bd4e28198f366cf6635be3cba4572cb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 28 May 2025 14:49:05 +0530 Subject: [PATCH 0766/1310] Warning fix --- lib_enc/ivas_core_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_core_enc_fx.c b/lib_enc/ivas_core_enc_fx.c index ad998beb3..5737aad2f 100644 --- a/lib_enc/ivas_core_enc_fx.c +++ b/lib_enc/ivas_core_enc_fx.c @@ -712,7 +712,7 @@ ivas_error ivas_core_enc_fx( Word16 Q_shb_spch_16 = Q_shb_spch; move16(); - Word16 shift = add( getScaleFactor16( shb_speech_fx, L_FRAME16k ), Q16 ); + shift = add( getScaleFactor16( shb_speech_fx, L_FRAME16k ), Q16 ); Copy_Scale_sig_16_32_no_sat( shb_speech_fx, shb_speech_fx32, L_FRAME16k, shift ); // Q_shb_spch Q_shb_spch = add( Q_shb_spch, shift ); -- GitLab From 87603b32350da5f42cb1296de1e52003a7f0fe23 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 11:29:56 +0200 Subject: [PATCH 0767/1310] fixed formatting - compiler switch --- lib_dec/ivas_init_dec_fx.c | 82 +++++++++++++++++----- lib_rend/ivas_prot_rend_fx.h | 4 +- lib_rend/ivas_rom_binaural_crend_head_fx.c | 2 +- 3 files changed, 66 insertions(+), 22 deletions(-) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index fea9c5b97..a697fc407 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -1156,8 +1156,7 @@ ivas_error ivas_init_decoder_front( IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) { - IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ) - { + IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ){ return error; } @@ -1175,32 +1174,39 @@ ivas_error ivas_init_decoder_front( { return error; } + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ), IVAS_ERR_OK ) ) + { + return error; + } +#endif } - /*-------------------------------------------------------------------* - * Allocate and initialize Binaural Renderer configuration handle - *--------------------------------------------------------------------*/ - test(); - test(); +/*-------------------------------------------------------------------* + * Allocate and initialize Binaural Renderer configuration handle + *--------------------------------------------------------------------*/ +test(); +test(); #ifdef SPLIT_REND_WITH_HEAD_ROT - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || - ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) +IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) #else - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif +{ + IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) { - IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) - { - return error; - } + return error; + } - IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) + { + return error; } +} - return error; +return error; } @@ -1362,6 +1368,21 @@ ivas_error ivas_init_decoder_fx( } } + +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + /*--------------------------------------------------------------------* + * Allocate and initialize HRTF Statistics handle + *--------------------------------------------------------------------*/ + + IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) + { + IF( NE_32( ( error = ivas_HRTF_statistics_init( &st_ivas->hHrtfStatistics, output_Fs ) ), IVAS_ERR_OK ) ) + { + return error; + } + } +#endif + #ifdef SPLIT_REND_WITH_HEAD_ROT /*-----------------------------------------------------------------* * Initialize binuaral split rendering @@ -2273,7 +2294,11 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif { +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if ( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -2317,13 +2342,24 @@ ivas_error ivas_init_decoder_fx( } #ifdef SPLIT_REND_WITH_HEAD_ROT +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), + IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) +#endif +#else +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + if( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) +#endif #endif { return error; @@ -2861,6 +2897,9 @@ void ivas_initialize_handles_dec( st_ivas->hSetOfHRTF = NULL; st_ivas->hHrtfFastConv = NULL; st_ivas->hHrtfParambin = NULL; +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + st_ivas->hHrtfStatistics = NULL; +#endif st_ivas->hoa_dec_mtx = NULL; st_ivas->hMasaIsmData = NULL; st_ivas->hSbaIsmData = NULL; @@ -3095,6 +3134,11 @@ void ivas_destroy_dec_fx( /* Parametric binauralizer HRTF filters */ ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); +#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + /* HRTF statistics */ + ivas_HRTF_statistics_close( &st_ivas->hHrtfStatistics ); +#endif + /* Config. Renderer */ ivas_render_config_close( &( st_ivas->hRenderConfig ) ); diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index ca1d3ccdc..a7f52eb32 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -957,8 +957,8 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( #endif const Word32 sampling_rate, /* i : sampling rate */ #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - const float *defaultTimes, /* i : default reverberation times */ - const float *defaultEne /* i : default reverberation energies */ + const Word32 *defaultTimes, /* i : default reverberation times */ + const Word32 *defaultEne /* i : default reverberation energies */ #else const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ #endif diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index b4ebfe6e5..71a98fb0e 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -59838,7 +59838,7 @@ const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 2790378,2355663,2029237,1865240,1832432 }; -#ifndef NONBE_FIX_AVG_IAC_CLDFB_REVERB +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, -- GitLab From d8e0abccf35f5f41b80678308c013472b07aec19 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 12:11:15 +0200 Subject: [PATCH 0768/1310] verified Word32 type assignments --- lib_rend/ivas_reverb_utils_fx.c | 2 +- lib_rend/ivas_rom_binaural_crend_head.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 689670477..28eb69141 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -309,7 +309,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #endif float input_fc[FFT_SPECTRUM_SIZE]; -#ifndef NON_BE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 1d18ec02a..9e40c49ba 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -358,9 +358,9 @@ extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; / extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB -extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ -extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ #else extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -- GitLab From 75d6a4cd9faf425020eca5ed44b8b0d16b27bd41 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 12:35:19 +0200 Subject: [PATCH 0769/1310] fixed definitions of type Word32 --- lib_rend/ivas_prot_rend_fx.h | 4 ++-- lib_rend/ivas_reverb_fx.c | 20 ++++++++++---------- lib_rend/ivas_reverb_utils_fx.c | 2 -- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index a7f52eb32..fa74d0f0e 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -1152,8 +1152,8 @@ ivas_error ivas_reverb_prepare_cldfb_params( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_STATISTICS_HANDLE hHrtfStatistics, const int32_t output_Fs, - float *pOutput_t60, - float *pOutput_ene ); + Word32 *pOutput_t60, + Word32 *pOutput_ene ); #else ivas_error ivas_reverb_prepare_cldfb_params( IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index a7a3e5039..473a1e701 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2480,20 +2480,20 @@ static ivas_error ivas_binaural_reverb_open_fx( ivas_error ivas_binaural_reverb_init( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ - const int16_t numBins, /* i : number of CLDFB bins */ - const int16_t numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + const Word16 numBins, /* i : number of CLDFB bins */ + const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const int32_t sampling_rate, /* i : sampling rate */ - const float *defaultTimes, /* i : default reverberation times */ - const float *defaultEne /* i : default reverberation energies */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word32 *defaultTimes, /* i : default reverberation times */ + const Word32 *defaultEne /* i : default reverberation energies */ ) { ivas_error error; - const float *revTimes; - const float *revEne; - float t60[CLDFB_NO_CHANNELS_MAX]; - float ene[CLDFB_NO_CHANNELS_MAX]; - int16_t preDelay; + const Word32 *revTimes; + const Word32 *revEne; + Word32 t60[CLDFB_NO_CHANNELS_MAX]; + Word32 ene[CLDFB_NO_CHANNELS_MAX]; + Word16 preDelay; error = IVAS_ERR_OK; diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 28eb69141..2cead56f1 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -330,8 +330,6 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - Word32 *avg_pwr_left_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - Word32 *avg_pwr_right_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); -- GitLab From 714426d6e864e74ec550fa7ccbc6859082d9b244 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 28 May 2025 13:40:13 +0300 Subject: [PATCH 0770/1310] Implement MR1400 changes to main-pc. Not including changes in split rendering off path. --- lib_com/options.h | 1 + lib_dec/ivas_dirac_dec_fx.c | 4 + lib_dec/ivas_init_dec_fx.c | 4 + lib_dec/ivas_ism_dec_fx.c | 8 ++ .../ivas_dirac_dec_binaural_functions_fx.c | 92 ++++++++++++++++++- lib_rend/ivas_prot_rend_fx.h | 4 + lib_rend/ivas_stat_rend.h | 20 ++++ lib_rend/lib_rend_fx.c | 24 ++++- 8 files changed, 150 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 73a8f082f..9c2c217ea 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,6 +135,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ +#define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index ff02d813d..5f8d1512b 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1150,7 +1150,11 @@ ivas_error ivas_dirac_dec_config_fx( IF( st_ivas->hDiracDecBin == NULL ) #endif { +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#endif { return error; } diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index fea9c5b97..ee4a6b4fe 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -2234,7 +2234,11 @@ ivas_error ivas_init_decoder_fx( } } +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#endif { return error; } diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index f0ad208f5..3cc423910 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -291,7 +291,11 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( return error; } +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -322,7 +326,11 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( return error; } +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) +#else IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#endif { return error; } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index ac387c5cc..11467f008 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -128,9 +128,17 @@ static void adaptTransportSignalsHeadtracked_fx( COMBINED_ORIENTATION_HANDLE hHe static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( COMBINED_ORIENTATION_HANDLE hHeadTrackData, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 nBins, const Word16 nSlots, Word32 Rmat[3][3] /*Q30*/ ); - +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF +static void hrtfShGetHrtf_fx( const Word16 bin, const Word16 aziDeg, const Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 useCachedValue, HRTFS_PARAMBIN_HANDLE hHrtfParambin ); +#else static void hrtfShGetHrtf_fx( const Word16 bin, const Word16 aziDeg, const Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 useCachedValue ); +#endif + +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF +static void getDirectPartGains_fx( const Word16 bin, Word16 aziDeg, Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, const UWord8 renderStereoOutputInsteadOfBinaural, Word32 Rmat[3][3] /*Q30*/, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 isHeadtracked, HRTFS_PARAMBIN_HANDLE hHrtfParambin ); +#else static void getDirectPartGains_fx( const Word16 bin, Word16 aziDeg, Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, const UWord8 renderStereoOutputInsteadOfBinaural, Word32 Rmat[3][3] /*Q30*/, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 isHeadtracked ); +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaExtRend, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[] /*Q11*/, const Word16 subframe, const SPLIT_REND_WRAPPER *hSplitRendWrapper, Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ); @@ -162,7 +170,11 @@ static void matrixTransp2Mul_fx( *------------------------------------------------------------------------*/ ivas_error ivas_dirac_dec_init_binaural_data_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i : HRTF structure for rendering */ +#else HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ +#endif ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; @@ -206,6 +218,9 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( hDiracDecBin->hReverb = NULL; hDiracDecBin->h_freq_domain_decorr_ap_params = NULL; hDiracDecBin->h_freq_domain_decorr_ap_state = NULL; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + hDiracDecBin->phHrtfParambin = NULL; +#endif } output_Fs = st_ivas->hDecoderConfig->output_Fs; @@ -297,7 +312,11 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( } ELSE IF( EQ_32( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ { +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); +#else Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); +#endif hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */ @@ -315,8 +334,11 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( IF( hDiracDecBin->hReverb == NULL ) #endif { - /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ), IVAS_ERR_OK) ) +#else + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes, st_ivas->hHrtfParambin->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -390,6 +412,10 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); /* Q14 */ move16(); +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + hDiracDecBin->phHrtfParambin = phHrtfParambin; +#endif + #ifdef SPLIT_REND_WITH_HEAD_ROT st_ivas->hDiracDecBin[pos_idx] = hDiracDecBin; } @@ -1797,7 +1823,11 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( spreadCoh_fx = s_max( spreadCoh_fx, altSpreadCoh_fx ); } +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked, *hDiracDecBin->phHrtfParambin ); +#else getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked ); +#endif Word16 q_lr = Q28; move16(); @@ -1848,7 +1878,11 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( rImagp_fx = Mpy_32_32( rImagp_fx, centerMul_fx ); // Q25 /* Apply the gain for the left source of the three coherent sources */ +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked, *hDiracDecBin->phHrtfParambin ); +#else getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); +#endif hrtfEneSides_fx = L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 L_add( Mpy_32_32( lImagpTmp_fx, lImagpTmp_fx ), // Q25 @@ -1862,7 +1896,11 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( /* Apply the gain for the right source of the three coherent sources. * -30 degrees to 330 wrapping due to internal functions. */ +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked, *hDiracDecBin->phHrtfParambin ); +#else getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked ); +#endif hrtfEneSides_fx = L_add( hrtfEneSides_fx, L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 @@ -3308,7 +3346,11 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_processMtxPrev_SCCR[bin] = q_processMtx_bin; move16(); +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked, *hDiracDecBin->phHrtfParambin ); +#else getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked ); +#endif hDiracDecBin->processMtxRe_fx[0][add( chB, 2 )][bin] = extract_h( Mpy_32_32( lRealp_fx, gainFactor_fx ) ); move16(); @@ -5598,7 +5640,13 @@ static void getDirectPartGains_fx( const UWord8 renderStereoOutputInsteadOfBinaural, Word32 Rmat[3][3], /*Q30*/ PARAMBIN_HRTF_GAIN_CACHE *gainCache, - const Word16 isHeadtracked ) +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + const Word16 isHeadtracked, + HRTFS_PARAMBIN_HANDLE hHrtfParambin +#else + const Word16 isHeadtracked +#endif +) { // float aziRad, eleRad; Word32 y, mappedX; @@ -5727,7 +5775,11 @@ static void getDirectPartGains_fx( test(); IF( EQ_16( aziDeg, gainCache->azi ) && EQ_16( eleDeg, gainCache->ele ) ) { +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE, hHrtfParambin ); +#else hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE ); +#endif } ELSE { @@ -5742,7 +5794,11 @@ static void getDirectPartGains_fx( // eleDeg = L_shr(eleDeg_32, 22); // aziDeg = L_shr(aziDeg_32, 22); } +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE, hHrtfParambin ); +#else hrtfShGetHrtf_fx( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE ); +#endif } } @@ -5758,9 +5814,21 @@ static void hrtfShGetHrtf_fx( Word32 *rRealp, Word32 *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, - const Word16 useCachedValue ) +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + const Word16 useCachedValue, + HRTFS_PARAMBIN_HANDLE hHrtfParambin +#else + const Word16 useCachedValue +#endif +) { Word16 k; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + Word32( *hrtfShCoeffsReInt_fx )[16][60]; + Word32( *hrtfShCoeffsImInt_fx )[16][60]; + hrtfShCoeffsReInt_fx = hHrtfParambin->hrtfShCoeffsRe_fx; + hrtfShCoeffsImInt_fx = hHrtfParambin->hrtfShCoeffsIm_fx; +#endif *lRealp = 0; *lImagp = 0; @@ -5778,10 +5846,17 @@ static void hrtfShGetHrtf_fx( FOR( k = 0; k < HRTF_SH_CHANNELS; k++ ) { +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsReInt_fx[0][k][bin] ); // Q28 + *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsImInt_fx[0][k][bin] ); // Q28 + *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsReInt_fx[1][k][bin] ); // Q28 + *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsImInt_fx[1][k][bin] ); // Q28 +#else *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsRe_fx[0][k][bin] ); // Q28 *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsIm_fx[0][k][bin] ); // Q28 *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsRe_fx[1][k][bin] ); // Q28 *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsIm_fx[1][k][bin] ); // Q28 +#endif move32(); move32(); move32(); @@ -5800,10 +5875,17 @@ static void hrtfShGetHrtf_fx( FOR( k = 0; k < HRTF_SH_CHANNELS; k++ ) { +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsReInt_fx[0][k][bin] ); // Q28 + *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsImInt_fx[0][k][bin] ); // Q28 + *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsReInt_fx[1][k][bin] ); // Q28 + *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsImInt_fx[1][k][bin] ); // Q28 +#else *lRealp = Madd_32_16( *lRealp, shVec[k], hrtfShCoeffsRe_fx[0][k][bin] ); // Q28 *lImagp = Madd_32_16( *lImagp, shVec[k], hrtfShCoeffsIm_fx[0][k][bin] ); // Q28 *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsRe_fx[1][k][bin] ); // Q28 *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsIm_fx[1][k][bin] ); // Q28 +#endif gainCache->shVec_fx[k] = shVec[k]; // Q29 move32(); move32(); diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 7ab5288cc..17791d33b 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -231,7 +231,11 @@ void ivas_masa_ext_rend_parambin_render_fx( ); ivas_error ivas_dirac_dec_init_binaural_data_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i : HRTF structure for rendering */ +#else HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ +#endif ); void ivas_dirac_dec_close_binaural_data( diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index b7acbca2c..c2368a028 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -604,6 +604,20 @@ typedef struct ivas_diffuse_distribution_data_structure } DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF +typedef struct ivas_hrtfs_parambin_struct +{ + Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ + Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ + + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ + + Word16 allocatedFromFile; /* Unused variable that should not be here. Remove in cleanup. */ + +} HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; +#endif /* Parametric binaural data structure */ typedef struct ivas_dirac_dec_binaural_data_structure @@ -668,6 +682,10 @@ typedef struct ivas_dirac_dec_binaural_data_structure ivas_td_decorr_state_t *hTdDecorr; Word16 reqularizationFactor_fx; /* Q14 */ +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + HRTFS_PARAMBIN_HANDLE *phHrtfParambin; +#endif + DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; @@ -1461,6 +1479,7 @@ typedef struct ivas_hrtfs_fastconv_struct } HRTFS_FASTCONV, *HRTFS_FASTCONV_HANDLE; +#ifndef NONBE_FIX_991_PARAMBIN_BINARY_HRTF typedef struct ivas_hrtfs_parambin_struct { Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ @@ -1473,6 +1492,7 @@ typedef struct ivas_hrtfs_parambin_struct Word16 allocatedFromFile; } HRTFS_PARAMBIN, *HRTFS_PARAMBIN_HANDLE; +#endif #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 4276b8146..3152955ed 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -10010,7 +10010,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + HRTFS_PARAMBIN_HANDLE *phHrtfParambin; +#else HRTFS_PARAMBIN_HANDLE hHrtfParambin; +#endif Word16 nBins; Word32 output_Fs; RENDERER_TYPE renderer_type; @@ -10030,7 +10034,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( error = IVAS_ERR_OK; move32(); +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + phHrtfParambin = inputMasa->hMasaExtRend->hHrtfParambin; +#else hHrtfParambin = *( inputMasa->hMasaExtRend->hHrtfParambin ); +#endif /* Set common variables and defaults */ output_Fs = *( inputMasa->base.ctx.pOutSampleRate ); move32(); @@ -10135,7 +10143,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( } ELSE IF( EQ_16( renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) /* Indication of binaural rendering with room effect */ { +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); +#else Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); +#endif hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); @@ -10145,8 +10157,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( IF( hDiracDecBin->hReverb == NULL ) #endif { - /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) +#else + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) +#endif { return error; } @@ -10192,6 +10207,11 @@ static ivas_error ivas_masa_ext_rend_parambin_init( /* External renderer uses constant regularization factor */ hDiracDecBin->reqularizationFactor_fx = 6554; /* 0.4f in Q14 */ move16(); + +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + hDiracDecBin->phHrtfParambin = phHrtfParambin; +#endif + #ifdef SPLIT_REND_WITH_HEAD_ROT inputMasa->hMasaExtRend->hDiracDecBin[pos_idx] = hDiracDecBin; } -- GitLab From a86062998f069b84c01dcb57f619c90e5fc325c6 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 12:41:41 +0200 Subject: [PATCH 0771/1310] clang formatting patch --- lib_dec/ivas_init_dec_fx.c | 44 +++++++++++++++++++------------------- lib_rend/ivas_reverb_fx.c | 10 ++++----- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index a697fc407..44e20c645 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -1154,34 +1154,33 @@ ivas_error ivas_init_decoder_front( * Allocate HRTF binary handle *--------------------------------------------------------------------*/ - IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) - { + IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ){ IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ){ return error; - } +} - IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) - { - return error; - } +IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) +{ + return error; +} - IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) - { - return error; - } +IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) +{ + return error; +} - IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) - { - return error; - } +IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) +{ + return error; +} #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ), IVAS_ERR_OK ) ) - { - return error; - } +IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ), IVAS_ERR_OK ) ) +{ + return error; +} #endif - } +} /*-------------------------------------------------------------------* * Allocate and initialize Binaural Renderer configuration handle @@ -2353,8 +2352,9 @@ ivas_error ivas_init_decoder_fx( #endif #else #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) + if ( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), + IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 473a1e701..acfd656c5 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2480,12 +2480,12 @@ static ivas_error ivas_binaural_reverb_open_fx( ivas_error ivas_binaural_reverb_init( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ - const Word16 numBins, /* i : number of CLDFB bins */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ + const Word16 numBins, /* i : number of CLDFB bins */ + const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const Word32 sampling_rate, /* i : sampling rate */ - const Word32 *defaultTimes, /* i : default reverberation times */ - const Word32 *defaultEne /* i : default reverberation energies */ + const Word32 sampling_rate, /* i : sampling rate */ + const Word32 *defaultTimes, /* i : default reverberation times */ + const Word32 *defaultEne /* i : default reverberation energies */ ) { ivas_error error; -- GitLab From a33ee61c7caeca010d3ac040a3c63ec33b7bd06c Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 28 May 2025 14:00:01 +0300 Subject: [PATCH 0772/1310] Clang format --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 10 +++++----- lib_rend/lib_rend_fx.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 11467f008..fb403cfb7 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -169,7 +169,7 @@ static void matrixTransp2Mul_fx( * Initialize parametric binaural renderer *------------------------------------------------------------------------*/ ivas_error ivas_dirac_dec_init_binaural_data_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF HRTFS_PARAMBIN_HANDLE *phHrtfParambin /* i : HRTF structure for rendering */ #else @@ -315,7 +315,7 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #else - Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); + Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #endif hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); @@ -335,9 +335,9 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( #endif { #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ), IVAS_ERR_OK) ) + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) #else - if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes, st_ivas->hHrtfParambin->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes, st_ivas->hHrtfParambin->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -5886,7 +5886,7 @@ static void hrtfShGetHrtf_fx( *rRealp = Madd_32_16( *rRealp, shVec[k], hrtfShCoeffsRe_fx[1][k][bin] ); // Q28 *rImagp = Madd_32_16( *rImagp, shVec[k], hrtfShCoeffsIm_fx[1][k][bin] ); // Q28 #endif - gainCache->shVec_fx[k] = shVec[k]; // Q29 + gainCache->shVec_fx[k] = shVec[k]; // Q29 move32(); move32(); move32(); diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 3152955ed..dde950181 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -10146,7 +10146,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #else - Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); + Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #endif hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); @@ -10160,7 +10160,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes, ( *phHrtfParambin )->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) #else - if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ) ), IVAS_ERR_OK ) ) #endif { return error; -- GitLab From 831320b11388d274145054faf7197c593f66624a Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 28 May 2025 13:10:22 +0200 Subject: [PATCH 0773/1310] remove ivas_prot.h + update MSVC project wrt. added files --- Workspace_msvc/lib_com.vcxproj.filters | 52 +- lib_com/ivas_prot.h | 4068 ------------------------ 2 files changed, 40 insertions(+), 4080 deletions(-) delete mode 100644 lib_com/ivas_prot.h diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index f1d860f1a..8860ccd56 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -508,6 +508,12 @@ common_all_c + + common_ivas_c + + + common_ivas_c + @@ -588,17 +594,39 @@ common_h - - - - - - - - - - - + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + + + common_h + @@ -614,4 +642,4 @@ {b95b7bed-a666-4a00-9332-2b528638503e} - + \ No newline at end of file diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h deleted file mode 100644 index 9ee17fed6..000000000 --- a/lib_com/ivas_prot.h +++ /dev/null @@ -1,4068 +0,0 @@ -/****************************************************************************************************** - - (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#ifndef IVAS_PROT_H -#define IVAS_PROT_H - -#include -#include "options.h" -#include -#include "typedef.h" -#include "stat_enc.h" -#include "stat_dec.h" -#include "stat_com.h" -#include "ivas_stat_enc.h" -#include "ivas_stat_dec.h" -#include "ivas_stat_rend.h" -#include "ivas_stat_com.h" -#include "ivas_error_utils.h" - -#define IVAS_FLOAT_FIXED_TO_BE_REMOVED - -/* clang-format off */ - -/*----------------------------------------------------------------------------------* - * General IVAS prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_enc( - Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ - const int16_t *data, /* i : input signal */ - const int16_t n_samples /* i : number of input samples */ -); - -void stereo_dmx_evs_enc( - STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ - const int32_t input_Fs, /* i : input sampling rate */ - int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ - const int16_t n_samples, /* i : number of input samples */ - const bool is_binaural /* i : indication that input is binaural audio */ -); - -/*! r: number of channels to be analysed */ - -void copy_encoder_config_ivas_fx( - Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ - Encoder_State *st, /* o : encoder state structure */ - const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ -); - - - -ivas_error create_sce_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t sce_id, /* i : SCE # identifier */ - const int32_t element_brate /* i : element bitrate */ -); - -ivas_error create_cpe_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t cpe_id, /* i : CPE # identifier */ - const int32_t element_brate /* i : element bitrate */ -); - -ivas_error create_mct_enc_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -void destroy_cpe_enc( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structure */ -); - -void ivas_mct_enc_close_fx( - MCT_ENC_HANDLE *hMCT /* i/o: MCT encoder structure */ -); - -ivas_error ivas_corecoder_enc_reconfig( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t nSCE_old, /* i : number of SCEs in previous frame */ - const int16_t nCPE_old, /* i : number of CPEs in previous frame */ - const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ - const int32_t brate_SCE, /* i : bitrate to be set for the SCEs */ - const int32_t brate_CPE, /* i : bitrate to be set for the CPEs */ - const MC_MODE last_mc_mode /* i : switching between MC modes: last mode */ -); - -ivas_error ivas_sce_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t sce_id, /* i : SCE # identifier */ - const float data_f[], /* i : input signal for single channel */ - const int16_t input_frame, /* i : input frame length per channel */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - - -ivas_error ivas_cpe_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const Word16 cpe_id, /* i : CPE # identifier */ - float data_f_ch0[], /* i : input signal for channel 0 */ - float data_f_ch1[], /* i : input signal for channel 1 */ - const Word16 input_frame, /* i : input frame length per channel */ - const Word16 nb_bits_metadata /* i : number of metadata bits */ -); - -ivas_error ivas_mct_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - float *data[MCT_MAX_CHANNELS], /* i : input signal buffers */ - const int16_t input_frame, /* i : input frame length per channel */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - -ivas_error pre_proc_front_ivas( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const int32_t element_brate, /* i : SCE/CPE element bitrate */ - const int16_t nb_bits_metadata, /* i : number of metadata bits */ - const int16_t input_frame, /* i : frame length */ - const int16_t n, /* i : channel number */ - float old_inp_12k8[], /* o : buffer of old input signal */ - float old_inp_16k[], /* o : buffer of old input signal @16kHz */ - float *ener, /* o : residual energy from Levinson-Durbin */ - float *relE, /* o : frame relative energy */ - float A[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes */ - float Aw[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes */ - float epsP[M + 1], /* o : LP prediction errors */ - float lsp_new[M], /* o : LSPs at the end of the frame */ - float lsp_mid[M], /* o : LSPs in the middle of the frame */ - int16_t *vad_hover_flag, /* o : VAD hangover flag */ - int16_t *attack_flag, /* o : flag signaling attack */ - float realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer */ - float imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer */ - float old_wsp[], /* o : weighted input signal buffer */ - float pitch_fr[NB_SUBFR], /* o : fractional pitch values */ - float voicing_fr[NB_SUBFR], /* o : fractional pitch gains */ - int16_t *loc_harm, /* o : harmonicity flag */ - float *cor_map_sum, /* o : speech/music clasif. parameter */ - int16_t *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO */ - float enerBuffer[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer */ - float fft_buff[2 * L_FFT], /* o : FFT buffer */ - const float tdm_A_PCh[M + 1], /* i : unq. LP coeff. of primary channel */ - const float tdm_lsp_new_PCh[M], /* i : unq. LSPs of primary channel */ - const float currFlatness, /* i : flatness parameter */ - const int16_t tdm_ratio_idx, /* i : Current Ratio_L index */ - float fr_bands_LR[][2 * NB_BANDS], /* i : energy in frequency bands */ - const float Etot_LR[], /* i : total energy Left & Right channel */ - float lf_E_LR[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ - const int16_t localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels */ - float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN */ - const int16_t flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz */ - const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ - const int16_t force_front_vad, /* i : flag to force VAD decision */ - const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -); - -ivas_error pre_proc_front_ivas_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const Word32 element_brate, /* i : SCE/CPE element bitrate Q0*/ - const Word16 nb_bits_metadata, /* i : number of metadata bits Q0*/ - const Word16 input_frame, /* i : frame length Q0*/ - const Word16 n, /* i : channel number Q0*/ - Word16 old_inp_12k8_fx[], /* o : buffer of old input signal Q_new-1*/ - Word16 old_inp_16k_fx[], /* o : buffer of old input signal @16kHz Q_new-1*/ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 *relE_fx, /* o : frame relative energy Q8*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* o : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* o : weighted A(z) unquantized for subframes Q12*/ - Word32 epsP_fx[M + 1], /* o : LP prediction errors epsP_fx_q*/ - Word16 *epsP_fx_q, - Word16 lsp_new_fx[M], /* o : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* o : LSPs in the middle of the frame Q15*/ - Word16 *vad_hover_flag, /* o : VAD hangover flag Q0*/ - Word16 *attack_flag, /* o : flag signaling attack Q0*/ - Word32 realBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer Q(q_re_im_buf)*/ - Word32 imagBuffer_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer Q(q_re_im_buf)*/ - Word16 *q_re_im_buf, /* i/o: Q-factor of real and imag buffer */ - Word16 old_wsp_fx[], /* o : weighted input signal buffer q_old_wsp*/ - Word16 *q_old_wsp, - Word16 pitch_fr_fx[NB_SUBFR], /* o : fractional pitch values Q6*/ - Word16 voicing_fr_fx[NB_SUBFR], /* o : fractional pitch gains Q15*/ - Word16 *loc_harm, /* o : harmonicity flag Q0*/ - Word16 *cor_map_sum_fx, /* o : speech/music clasif. parameter Q8*/ - Word16 *vad_flag_dtx, /* o : HE-SAD flag with additional DTX HO Q0*/ - Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ - Word16 *enerBuffer_fx_exp, /* o : energy buffer */ - Word16 fft_buff_fx[2 * L_FFT], /* o : FFT buffer fft_buff_fx_q*/ - Word16 *fft_buff_fx_q, /* o : FFT buffer */ - const Word16 tdm_A_PCh_fx[M + 1], /* i : unq. LP coeff. of primary channel Q12*/ - const Word16 tdm_lsp_new_PCh_fx[M], /* i : unq. LSPs of primary channel Q15*/ - const Word16 currFlatness_fx, /* i : flatness parameter Q7*/ - const Word16 tdm_ratio_idx, /* i : Current Ratio_L index Q0*/ - Word32 fr_bands_LR_fx[][2 * NB_BANDS], /* i : energy in frequency bands (fr_bands_LR_fx_q) fr_bands_LR_fx_q*/ - Word16 fr_bands_LR_fx_q[CPE_CHANNELS], - const Word16 Etot_LR_fx[], /* i : total energy Left & Right channel Q8*/ - Word32 lf_E_LR_fx[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels (lf_E_LR_fx_q)*/ - Word16 lf_E_LR_fx_q, - const Word16 localVAD_HE_SAD_LR[], /* i : HE-SAD flag without hangover, LR channels Q0*/ - Word32 band_energies_LR_fx[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN (band_energies_LR_fx_q)*/ - Word16 band_energies_LR_fx_q, - const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ - const Word16 front_vad_flag, /* i : front-VAD flag to overwrite VAD decision Q0*/ - const Word16 force_front_vad, /* i : flag to force VAD decision Q0*/ - const Word16 front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision Q0*/ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ -#ifdef NONBE_1211_DTX_BR_SWITCHING - const Word32 last_ivas_total_brate, /* i : last IVAS total bitrate Q0*/ -#endif - const Word32 ivas_total_brate, /* i : IVAS total bitrate - for setting the DTX Q0*/ - Word16 *Q_new -#ifdef DEBUG_MODE_INFO - , - const Word16 ch_idx -#endif -); -ivas_error pre_proc_ivas_fx( - Encoder_State *st, /* i/o: encoder state structure */ - const Word16 last_element_mode, /* i : last element mode Q0*/ - const Word32 element_brate, /* i : element bitrate Q0*/ - const Word32 last_element_brate, /* i : last element bitrate Q0*/ - const Word16 input_frame, /* i : frame length Q0*/ - Word16 old_inp_12k8_fx[], /* i/o: buffer of old input signal Q_new-1 */ - Word16 old_inp_16k_fx[], /* i/o: buffer of old input signal @ 16kHz Q_new-1 */ - Word16 **inp_fx, /* o : ptr. to inp. signal in the current frame Q_new*/ - Word32 *ener_fx, /* o : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 A_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[NB_SUBFR16k * ( M + 1 )], /* i/o: weighted A(z) unquantized for subframes Q14*/ - Word32 epsP_fx[M + 1], /* i : LP prediction errors epsP_fx_q*/ - Word16 *epsP_fx_q, /* i : LP prediction errors */ - Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame Q15*/ - Word16 *new_inp_resamp16k_fx, /* o : new input signal @16kHz, non pre-emphasised, used by the WB TBE/BWE Q_new-1*/ - Word16 *Voicing_flag, /* o : voicing flag for HQ FEC Q0*/ - Word16 old_wsp_fx[], /* i : weighted input signal buffer e_old_wsp*/ - Word16 e_old_wsp, - const Word16 loc_harm, /* i : harmonicity flag Q0*/ - const Word16 vad_flag_dtx, /* i : HE-SAD flag with additional DTX HO Q0*/ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ - const Word16 vad_hover_flag, /* i : VAD hangover flag Q0*/ - const Word16 flag_16k_smc, /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ - Word32 enerBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* e_enerBuffer */ - Word16 e_enerBuffer, - Word16 fft_buff_fx[2 * L_FFT], /* Qx */ - Word16 cor_map_sum_fx, /* Q8 */ - Word16 *Q_new -); -/*! r: number of clipped samples */ -void ivas_initialize_handles_enc_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -void ivas_destroy_enc_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -ivas_error ivas_initialize_MD_bstr_enc_fx( - BSTR_ENC_HANDLE *hBstr, /* o : encoder MD bitstream handle */ - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -void ivas_destroy_MD_bstr_enc_fx( - BSTR_ENC_HANDLE *hMetaData /* i/o: encoder MD bitstream handle */ -); - -ivas_error ivas_init_decoder_front( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_init_decoder( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_output_buff_dec( - float *p_output_f[], /* i/o: output audio buffers */ - const int16_t nchan_out_buff_old, /* i : previous frame number of output channels*/ - const int16_t nchan_out_buff /* i : number of output channels */ -); -#endif - -ivas_error stereo_dmx_evs_init_encoder( - STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS, /* o : Stereo downmix for EVS encoder handle */ - const int32_t input_Fs /* i : input sampling rate */ -); - -void stereo_dmx_evs_close_encoder( - STEREO_DMX_EVS_ENC_HANDLE *hStereoDmxEVS /* i/o: Stereo downmix for EVS encoder handle */ -); - -ivas_error ivas_dec( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - int16_t *data /* o : output synthesis signal */ -); - - -ivas_error mct_dec_reconfigure( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const uint16_t b_nchan_change /* i : flag indicating different channel count */ -); - - -void ivas_mct_dec_close( - MCT_DEC_HANDLE *hMCT /* i/o: MCT decoder structure */ -); - -ivas_error ivas_corecoder_dec_reconfig( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nSCE_old, /* i : number of SCEs in previous frame */ - int16_t nCPE_old, /* i : number of CPEs in previous frame */ - const int16_t nchan_transport_old, /* i : number of TCs in previous frame */ - const int16_t sba_dirac_stereo_flag_old, /* i : signal stereo rendering using DFT upmix in previous frame */ - const int32_t brate_SCE, /* i : bitrate to be set for the SCEs */ - const int32_t brate_CPE /* i : bitrate to be set for the CPEs */ -); - -ivas_error ivas_hp20_dec_reconfig( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nchan_hp20_old /* i : number of HP20 filters in previous frame*/ -); - -ivas_error ivas_sce_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t sce_id, /* i : SCE # identifier */ - float *output[1], /* o : output synthesis signal */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - -ivas_error ivas_cpe_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t cpe_id, /* i : CPE # identifier */ - float *output[CPE_CHANNELS], /* o : output synthesis signal */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - -ivas_error ivas_mct_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* o : output synthesis signal */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - -/*! r: number of channels to be synthesised */ - -void copy_decoder_config( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - Decoder_State *st /* o : decoder state structure */ -); - -void destroy_core_dec( - DEC_CORE_HANDLE hCoreCoder /* i/o: core decoder structure */ -); - - -void ivas_initialize_handles_dec( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_core_enc_fx( - SCE_ENC_HANDLE hSCE, /* i/o: SCE encoder structure */ - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - const Word16 n_CoreChannels, /* i : number of core channels to be coded Q0*/ - Word16 old_inp_12k8_fx[][L_INP_12k8], /* i : buffer of old input signal Q_new-1*/ - Word16 old_inp_16k_fx[][L_INP], /* i : buffer of old input signal Q_new-1*/ - Word16 Q_new[], - Word32 ener_fx[], /* i : residual energy from Levinson-Durbin epsP_fx_q*/ - Word16 A_fx[][NB_SUBFR16k * ( M + 1 )], /* i : A(z) unquantized for the 4 subframes Q12*/ - Word16 Aw_fx[][NB_SUBFR16k * ( M + 1 )], /* i : weighted A(z) unquantized for subframes Q12*/ - Word32 epsP_fx[][M + 1], /* i : LP prediction errors epsP_fx_q*/ - Word16 epsP_fx_q[], /* i : LP prediction errors */ - Word16 lsp_new_fx[][M], /* i : LSPs at the end of the frame Q15*/ - Word16 lsp_mid_fx[][M], /* i : LSPs in the middle of the frame Q15*/ - const Word16 vad_hover_flag[], /* i : VAD hanglover flag Q0*/ - Word16 attack_flag[], /* i : attack flag (GSC or TC) Q0*/ - Word32 realBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: real buffer q_re_im_buf*/ - Word32 imagBuffer_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: imag buffer q_re_im_buf*/ - Word16 *q_re_im_buf, - Word16 old_wsp_fx[][L_WSP], /* i : weighted input signal buffer e_old_wsp*/ - Word16 e_old_wsp[], - const Word16 loc_harm[], /* i : harmonicity flag Q0*/ - const Word16 cor_map_sum_fx[], /* i : speech/music clasif. parameter Q8*/ - const Word16 vad_flag_dtx[], /* i : HE-SAD flag with additional DTX HO Q0*/ - Word32 enerBuffer_fx[][CLDFB_NO_CHANNELS_MAX], /* o : energy buffer enerBuffer_fx_exp*/ - Word16 enerBuffer_fx_exp[], /* o : energy buffer */ - Word16 fft_buff_fx[][2 * L_FFT], /* i : FFT buffer Qx*/ - const Word16 tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag Q0*/ - const Word16 ivas_format, /* i : IVAS format Q0*/ - const Word16 flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz Q0*/ -); - - - -void decod_gen_2sbfr( - Decoder_State *st, /* i/o: decoder static memory */ - const int16_t sharpFlag, /* i : formant sharpening flag */ - const float *Aq, /* i : LP filter coefficient */ - float *pitch_buf, /* o : floating pitch values for each subframe */ - float *voice_factors, /* o : voicing factors */ - float *exc, /* i/o: adapt. excitation exc */ - float *exc2, /* i/o: adapt. excitation/total exc */ - float *bwe_exc, /* o : excitation for SWB TBE */ - float *gain_buf, /* o : floating pitch gain for each subframe */ - const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const float tdm_Pri_pitch_buf[] /* i : pitch values for primary channel */ -); - -void synchro_synthesis( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ - const int16_t output_frame, /* i : Number of samples */ - const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ -); - -void synchro_synthesis_fixed( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ - const int16_t output_frame, /* i : Number of samples */ - const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ -); - -void stereo_tcx_init_enc( - Encoder_State *st /* i/o: encoder state structure */ -); - - - - -void stereo_tcx_init_dec( - Decoder_State *st, /* i/o: decoder state structure */ - const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const int16_t last_element_mode /* i : element mode of previous frame */ -); - -/*! r: S/M decision (0 = speech or noise, 1 = unclear, 2 = music) */ -int16_t ivas_smc_gmm( - Encoder_State *st, /* i/o: encoder state structure */ - STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - const int16_t localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ - const float Etot, /* i : total frame energy */ - const float lsp_new[M], /* i : LSPs in current frame */ - const float cor_map_sum, /* i : correlation map sum (from multi-harmonic anal.) */ - const float epsP[M + 1], /* i : LP prediciton error */ - const float PS[], /* i : energy spectrum */ - const float non_sta, /* i : unbound non-stationarity */ - const float relE, /* i : relative frame energy */ - int16_t *high_lpn_flag, /* i/o: sp/mus LPN flag */ - const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ -); - -void ivas_smc_mode_selection( - Encoder_State *st, /* i/o: encoder state structure */ - const int32_t element_brate, /* i : element bitrate */ - int16_t smc_dec, /* i : raw decision of the 1st stage classifier */ - const float relE, /* i : relative frame energy */ - const float Etot, /* i : total frame energy */ - int16_t *attack_flag, /* i/o: attack flag (GSC or TC) */ - const float *inp, /* i : input signal */ - const float S_map[], /* i : short-term correlation map */ - const int16_t flag_spitch /* i : flag to indicate very short stable pitch */ -); - -/*! r: S/M decision (0=speech or noise,1=unclear,2=music) */ -int16_t ivas_acelp_tcx20_switching( - Encoder_State *st, /* i/o: encoder state structure */ - const float *inp, /* i : new input signal */ - const float *wsp, /* i : input weighted signal */ - const float non_staX, /* i : unbound non-stationarity for sp/mu clas */ - const float *pitch_fr, /* i : fraction pitch values */ - const float *voicing_fr, /* i : fractional voicing values */ - const float currFlatness, /* i : flatness */ - const float lsp_mid[M], /* i : LSPs at the middle of the frame */ - const float stab_fac, /* i : LP filter stability */ - float *res_cod_SNR_M, - const int16_t flag_16k_smc /* i : flag to indicate if the OL SMC is run at 16 kHz */ -); - - - -void ivas_decision_matrix_dec( - Decoder_State *st, /* i/o: decoder state structure */ - int16_t *sharpFlag, /* o : formant sharpening flag */ - int16_t *core_switching_flag, /* o : ACELP->HQ switching frame flag */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t nchan_out /* i : Number of output channels */ -); - -void set_bw_stereo( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder structures */ -); - -/*! r: flag indicating whether the coded BW has changed */ -int16_t set_bw_mct( - CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ - const int16_t nCPE /* i : number of CPEs */ -); -void dec_acelp_fast( - Decoder_State *st, /* i/o: decoder state structure */ - const int16_t cdk_index, /* i : codebook index */ - float code[], /* o : algebraic (fixed) codebook excitation */ - const int16_t L_subfr /* i : subframe length */ -); - -void set_transient_stereo( - CPE_ENC_HANDLE hCPE, /* i : CPE structure */ - float currFlatness[] /* i/o: current flatness */ -); - -/*! r: preliminary flag to force ACELP */ -int16_t transient_analysis( - TRAN_DET_HANDLE hTranDet, /* i : handle transient detection */ - const float cor_map_LT[], /* i : LT correlation map */ - const float multi_harm_limit /* i : multi harminic threshold */ -); - -void ivas_post_proc( - SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const int16_t n, /* i : channel number */ - float synth[], /* i/o: output synthesis signal */ - float *output[CPE_CHANNELS], /* i/o: output synthesis signal */ - const int16_t output_frame, /* i : output frame length */ - const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ -); - -void ivas_renderer_select( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_mc_enc_config_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -ivas_error ivas_mc_dec_config( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t idx, /* i : LS config. index */ - uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ - int16_t *data /* o : output synthesis signal */ -); - -/*! r: MC format mode (MCT, McMASA, ParamMC) */ -MC_MODE ivas_mc_mode_select( - const MC_LS_SETUP mc_ls_setup, /* i : MC loudspeaker setup */ - const int32_t total_brate /* i : IVAS total bitrate */ -); - -/*! r: number of loudspeaker channels */ -int16_t ivas_mc_ls_setup_get_num_channels( - const MC_LS_SETUP mc_ls_setup /* i : loudspeaker setup (CICP) */ -); - -/*! r: output configuration*/ -AUDIO_CONFIG ivas_mc_map_ls_setup_to_output_config( - const MC_LS_SETUP mc_ls_setup /* i : multi channel loudspeaker setup */ -); - -/*! r: multi channel loudspeaker setup */ -MC_LS_SETUP ivas_mc_map_output_config_to_mc_ls_setup( - const AUDIO_CONFIG output_config /* i : output audio configuration */ -); - -void smooth_dft2td_transition( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output[CPE_CHANNELS], /* i/o: synthesis @external Fs */ - const int16_t output_frame /* i : output frame length */ -); - - -/*! r: flag indicating a valid bitrate */ -Word16 is_IVAS_bitrate_fx( - const Word32 ivas_total_brate /* i : IVAS total bitrate */ -); - -int16_t is_DTXrate( - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -); - - -void TonalMdctConceal_create_concealment_noise_ivas( - float concealment_noise[L_FRAME48k], - CPE_DEC_HANDLE hCPE, - const int16_t L_frameTCX, - const int16_t L_frame, - const int16_t idchan, - const int16_t subframe_idx, - const int16_t core, - const float crossfade_gain, - const TONALMDCTCONC_NOISE_GEN_MODE noise_gen_mode -); - -void TonalMdctConceal_whiten_noise_shape_ivas( - Decoder_State *st, - const int16_t L_frame, - const TONALMDCTCONC_NOISE_SHAPE_WHITENING_MODE -); - -void dtx_read_padding_bits( - DEC_CORE_HANDLE st, - const int16_t num_bits -); - - - -/*----------------------------------------------------------------------------------* - * JBM prototypes - *----------------------------------------------------------------------------------*/ - - - -ivas_error ivas_jbm_dec_flush_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t tc_granularity_new, /* i : new renderer granularity */ - const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ - const AUDIO_CONFIG intern_config_old, /* i : old internal config */ - const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ - const MC_MODE mc_mode_old, /* i : old MC mode */ - const ISM_MODE ism_mode_old, /* i : old ISM mode */ - uint16_t *nSamplesRendered, /* o : number of samples flushed */ - int16_t *data /* o : output synthesis signal */ -); - -void ivas_jbm_dec_feed_tc_to_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ - int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ - float *data /* i/o: transport channels/output synthesis signal */ -); - -ivas_error ivas_jbm_dec_set_discard_samples( - Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ -); - -void ivas_jbm_dec_get_adapted_linear_interpolator( - const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ - const int16_t interp_length, /* i : length of the interpolator to be created */ - float *interpolator /* o : the interpolator */ -); - - - -int16_t ivas_jbm_dec_get_num_tc_channels( - Decoder_Struct *st_ivas /* i : IVAS decoder handle */ -); - -void ivas_jbm_dec_copy_tc_no_tsm( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *tc[], /* i : transport channels */ - const int16_t output_frame /* i : output frame size */ -); - - -TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( - Decoder_Struct *st_ivas /* i : IVAS decoder handle */ -); - -/*! r: render granularity */ -int16_t ivas_jbm_dec_get_render_granularity_flt( - const RENDERER_TYPE rendererType, /* i : renderer type */ - const IVAS_FORMAT ivas_format, /* i : ivas format */ - const MC_MODE mc_mode, /* i : MC mode */ - const int32_t output_Fs /* i : sampling rate */ -); - -ivas_error ivas_jbm_dec_tc_buffer_open( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ - const int16_t nchan_transport_jbm, /* i : number of real transport channels */ - const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ - const int16_t nchan_full, /* i : number of channels to fully store */ - const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ -); - -ivas_error ivas_jbm_dec_tc_buffer_reconfigure( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ - const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ - const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ - const int16_t nchan_full, /* i : new number of channels to fully store */ - const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ -); - -void ivas_jbm_dec_tc_buffer_close( - DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ -); - -void ivas_jbm_dec_td_renderers_adapt_subframes( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_jbm_dec_metadata_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -void ivas_jbm_masa_sf_to_sf_map( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - - -/*----------------------------------------------------------------------------------* - * ISM prototypes - *----------------------------------------------------------------------------------*/ - -void bitbudget_to_brate( - const Word16 x[], /* i : bitbudgets Q0 */ - Word32 y[], /* o : bitrates Q0 */ - const Word16 N /* i : number of entries to be converted */ -); - -void ivas_ism_reset_metadata( - ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ -); - -void ivas_ism_reset_metadata_enc( - ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ -); -void ivas_ism_reset_metadata_API( - ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handles */ -); - -/*! r: index of the winning codeword */ -Word16 ism_quant_meta_fx( - const Word32 val, /* i : scalar value to quantize Q22 */ - Word32 *valQ, /* o : quantized value Q22 */ - const Word32 borders_fx[], /* i : level borders Q22 */ - const Word32 q_step_fx, /* i : quantization step Q22 */ - const Word32 q_step_border_fx, /* i : quantization step at the border Q22 */ - const Word16 cbsize /* i : codebook size */ -); - -ivas_error ivas_ism_metadata_enc_create_fx( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t n_ISms, /* i : number of objects */ - int32_t element_brate_tmp[] /* o : element bitrate per object */ -); - -ivas_error ivas_ism_metadata_dec_create( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t n_ISms, /* i : number of objects */ - int32_t element_brate_tmp[] /* o : element bitrate per object */ -); - -ivas_error ivas_ism_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - float *data[], /* i : input signal [channels][samples] */ - const int16_t input_frame, /* i : input frame length per channel */ - int16_t *nb_bits_metadata, /* i : number of metadata bits */ - const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ -); - -ivas_error ivas_ism_metadata_dec( - const int32_t ism_total_brate, /* i : ISM total bitrate */ - const int16_t nchan_ism, /* i : number of ISM channels */ - int16_t *nchan_transport, /* o : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ - const int16_t bfi, /* i : bfi flag */ - int16_t nb_bits_metadata[], /* o : number of metadata bits */ - ISM_MODE ism_mode, /* i : ISM mode */ - ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ - const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ - int16_t *ism_extended_metadata_flag, /* i/o: Extended metadata active in renderer */ - int16_t *ism_extmeta_cnt, /* i/o: Number of change frames observed */ - DEC_CORE_HANDLE st0 /* i : core-coder handle */ -); - - -/*----------------------------------------------------------------------------------* - * Parametric ISM prototypes - *----------------------------------------------------------------------------------*/ - -/*! r: ISM format mode */ - -ivas_error ivas_param_ism_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -void ivas_param_ism_enc_close_fx( - PARAM_ISM_CONFIG_HANDLE *hParamIsm, /* i/o: ParamISM handle */ - const int32_t input_Fs /* i : input sampling_rate */ -); - -void ivas_ism_metadata_close( - ISM_METADATA_HANDLE hIsmMetaData[], /* i/o : object metadata handles */ - const int16_t first_idx /* i : index of first handle to deallocate */ -); - - -ivas_error ivas_ism_enc_config( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - - - - -void ivas_param_ism_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -); - -void ivas_ism_dec_digest_tc( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - - - -void ivas_param_ism_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ -); - -void ivas_param_ism_params_to_masa_param_mapping( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - - -/*----------------------------------------------------------------------------------* - * ISM DTX prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_ism_dtx_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -/*! r: indication of DTX frame */ -int16_t ivas_ism_dtx_enc( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - SCE_ENC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t nchan_ism, /* i : number of objects */ - const int16_t nchan_transport, /* i : number of transport channels */ - int16_t vad_flag[MAX_NUM_OBJECTS], /* i : VAD flag */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - int16_t md_diff_flag[], /* o : metadata differential flag */ - int16_t *sid_flag /* o : indication of SID frame */ -); - -void ivas_ism_dtx_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t *nb_bits_metadata /* o : number of metadata bits */ -); - -void ivas_ism_metadata_sid_enc_fx( - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - const int16_t flag_noisy_speech, /* i : noisy speech flag */ - const int16_t nchan_ism, /* i : number of objects */ - const int16_t nchan_transport, /* i : number of transport channels */ - const ISM_MODE ism_mode, /* i : ISM mode */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const int16_t sid_flag, /* i : indication of SID frame */ - const int16_t md_diff_flag[], /* i : metadata differental flag */ - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - int16_t nb_bits_metadata[] /* o : number of metadata bits */ -); - -void ivas_ism_metadata_sid_dec( - SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE decoder structure */ - const int32_t ism_total_brate, /* i : ISM total bitrate */ - const int16_t bfi, /* i : bfi flag */ - const int16_t nchan_ism, /* i : number of objects */ - const int16_t nchan_transport, /* i : number of transport channels */ - const ISM_MODE ism_mode, /* i : ISM mode */ - int16_t *flag_noisy_speech, /* o : noisy speech flag */ - int16_t *sce_id_dtx, /* o : SCE DTX ID */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - int16_t nb_bits_metadata[] /* o : number of metadata bits */ -); - - -void ivas_param_ism_compute_noisy_speech_flag_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - - -void update_last_metadata( - const int16_t nchan_ism, /* i : number of objects */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const int16_t updt_flag[] /* i : last metadata update flag */ -); - -void ivas_ism_dtx_limit_noise_energy_for_near_silence( - SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder structures */ - const int16_t sce_id_dtx, /* i : SCE DTX ID */ - const int16_t nchan_transport /* i : number of transport channels */ -); - -/*----------------------------------------------------------------------------------* - * DFT Stereo prototypes - *----------------------------------------------------------------------------------*/ - - -void stereo_dft_enc_analyze( - Encoder_State **sts, /* i/o: encoder state structure */ - const int16_t n_channels, /* i : number of input channels */ - const int16_t input_frame, /* i : input frame length */ - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: encoder MDCT stereo handle */ - float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC], /* o : DFT buffers */ - float *input_mem[CPE_CHANNELS] /* i/o: input buffer memory */ -); - -float stereo_dft_enc_synthesize( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ - float *output, /* o : output synthesis */ - const int16_t chan, /* i : channel number */ - const int32_t input_Fs, /* i : input sampling rate */ - const int32_t output_sampling_rate, /* i : output sampling rate */ - const int16_t L_frame /* i : frame length at internal Fs */ -); - - - - -void stereo_dtf_cng( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ - const int16_t output_frame /* i : output frame size */ -); - -void stereo_dft_cng_side_gain( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo encoder handle */ - STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const int32_t core_brate, /* i : core bitrate */ - const int32_t last_core_brate, /* i : last core bitrate */ - const int16_t bwidth /* i : audio band-width */ -); - - -void stereo_dft_dequantize_itd( - int16_t *ind, - float *out, - const int32_t output_Fs -); - - - -void stereo_dft_dec_sid_coh( - Decoder_State *st, /* i/o: decoder state structure */ - const int16_t nbands, /* i : number of DFT stereo bands */ - float *coh, /* i/o: coherence */ - int16_t *nb_bits /* i/o: number of bits read */ -); - -ivas_error stereo_dft_dec_create( - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ - const int32_t element_brate, /* i : element bitrate */ - const int32_t output_Fs, /* i : output sampling rate */ - const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const int16_t nchan_transport /* i : number of transport channels */ -); - -void stereo_dft_dec_reset( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: decoder DFT stereo handle */ -); - -void stereo_dft_dec_update( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const int16_t output_frame, /* i : output frame length */ - const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ -); - -void stereo_dft_dec_destroy( - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft /* i/o: decoder DFT stereo handle */ -); - -void stereo_dft_dec_analyze( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const float *input, /* i : input signal */ - float out_DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - const int16_t chan, /* i : channel number */ - const int16_t input_frame, /* i : input frame size */ - const int16_t output_frame, /* i : output frame size */ - const DFT_STEREO_DEC_ANA_TYPE ana_type, /* i : signal type to analyze */ - const int16_t k_offset, /* i : offset of DFT */ - const int16_t delay /* i : delay in samples for input signal */ -); - -void stereo_dft_dec_synthesize( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ - const int16_t chan, /* i : channel number */ - float output[L_FRAME48k], /* o : output synthesis signal */ - const int16_t output_frame /* i : output frame length */ -); - - -void stereo_dft_res_ecu( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ - float *pDFT_RES, /* i/o: residual signal */ - float *const DFT_PRED_RES, /* i/o: residual prediction signal */ - const int16_t k, /* i : Subframe index */ - const int16_t output_frame, /* i : Output frame length */ - const int16_t prev_bfi, /* i : Previous BFI */ - const float dmx_nrg, /* i : Down-mix energy */ - int16_t *num_plocs, /* i/o: Number of peak locations */ - int16_t *plocs, /* i/o: Peak locations (bin) */ - float *plocsi, /* i/o: Peak locations (fractional) */ - float *input_mem /* o : Residual DFT buffer input mem */ -); - -void stereo_dft_res_subst_spec( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ - float *pDFT_RES, /* i/o: residual signal */ - const float *const DFT_PRED_RES, /* i : residual prediction signal */ - const int16_t time_offs, /* i : Time offset for phase adjustm. */ - const int16_t L_res, /* i : bandwidth of residual signal */ - const int16_t L_ana, /* i : Length of FFT analysis */ - const int16_t k, /* i : Subframe index */ - int16_t *num_plocs, /* i/o: Number of peak locations */ - int16_t *plocs, /* i/o: Peak locations (bin) */ - float *plocsi, /* i/o: Peak locations (fractional) */ - const int16_t analysis_flag /* i : Flag for running peak analysis */ -); - -void stereo_dft_res_ecu_burst_att( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: Decoder DFT stereo handle */ - float *pDFT_RES, /* i/o: residual signal /att. residual */ - const float dmx_nrg, /* i : dmx energy of current frame */ - const int16_t L_res, /* i : Bandwidth of residual */ - const int16_t L_ana /* i : Length of FFT analysis */ -); - -/*! r: total energy of downmix with maximum swb bandwidth max */ -float stereo_dft_dmx_swb_nrg( - const float *dmx_k0, /* i : first subframe spectrum */ - const float *dmx_k1, /* i : second subframe spectrum */ - const int16_t frame_length /* i : frame lanegth */ -); - -int16_t stereo_dft_sg_recovery( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i/o: Decoder DFT stereo handle */ -); - -void stereo_dft_dec_res( - CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ - float res_buf[STEREO_DFT_N_8k], /* i : residual buffer */ - float *output /* o : output frame */ -); - -/*! r: Decision to enable or disable BPF on DFT stereo residual */ - -void bpf_pitch_coherence( - Decoder_State *st, /* i/o: decoder state structure */ - const float pitch_buf[] /* i : pitch for each subframe [0,1,2,3] */ -); - -void stereo_dft_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int32_t element_brate, /* i : element bitrate */ - int32_t *total_brate, /* o : total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const int16_t bwidth, /* i : bandwidth */ - const int16_t output_frame, /* i : output frame length */ - float res_buf[STEREO_DFT_N_8k], /* o : residual buffer */ - int16_t *nb_bits, /* o : number of bits read */ - float *coh, /* i/o: Coherence */ - const int16_t ivas_format /* i : ivas format */ -); - -void stereo_dft_dec_smooth_parameters( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const int16_t prev_sid_nodata, /* i : Previous SID/No data indicator */ - const int16_t active_frame_counter, /* i : Active frame counter */ - const int32_t element_brate /* i : Element bitrate */ -); - -void stereo_dft_generate_res_pred( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const float samp_ratio, /* i : sampling ratio */ - float *pDFT_DMX, /* i : downmix signal */ - float *DFT_PRED_RES, /* o : residual prediction signal */ - float *pPredGain, /* i : residual prediction gains */ - const int16_t k, /* i : subframe index */ - float *ap_filt_DMX, /* i : enhanced stereo filling signal */ - int16_t *stop, /* o : last FD stereo filling bin */ - const int16_t bfi /* i : BFI flag */ -); - -void stereo_dft_dec_core_switching( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float output[], /* i/o: synthesis @internal Fs */ - float synth[], /* i : synthesis @output Fs */ - float hb_synth[], /* i/o: hb synthesis */ - float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* o : DFT buffers */ - const int16_t output_frame, /* i : output frame length */ - const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ - const int16_t sba_dirac_stereo_dtx_flag /* i : DTX indicator for SBA DirAC stereo */ -); - -void init_basic_allpass( - basic_allpass_t *ap, /* i/o: basic allpass structure */ - const float *gains, /* i : allpass filter gains */ - const int16_t *delays /* i : allpass filter delays */ -); - -void filter_with_allpass( - const float *sig, /* i : allpass input signal */ - float *out, /* o : filtered output */ - const int16_t len, /* i : length of input */ - basic_allpass_t *ap /* i/o: basic allpass structure */ -); - -/*! r: used GR order */ - -/*! r: used GR order */ - - -/*! r: number of bits written */ - -/*! r: number of bits written */ - - -void stereo_dft_enc_compute_itd( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - float *DFT_L, - float *DFT_R, - const int16_t k_offset, - const int16_t input_frame, - const int16_t vad_flag_dtx[], - const int16_t vad_hover_flag[], - float *bin_nrgL, - float *bin_nrgR -); - -void stereo_dft_config( - STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ - const int32_t brate, /* i : IVAS/CPE/nominal total bitrate */ - int16_t *bits_frame_nominal, /* o : primary channel nominal bits per frame */ - int16_t *bits_frame_nominal_2 /* o : secondary channel nominal bits per frame*/ -); - -int16_t stereo_dft_band_config( - int16_t *band_limits, /* o : DFT band limits */ - const int16_t band_res, /* i : DFT band resolution */ - const int16_t NFFT, /* i : analysis/synthesis window length */ - const int16_t enc_dec /* i : flag to indicate enc vs dec */ -); - -void stereo_dft_dmx_out_reset( - STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx /* i/o: DFT stereo DMX decoder */ -); - -void stereo_dft_unify_dmx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ - float DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ - float *input_mem, /* i/o: mem of buffer DFT analysis */ - const int16_t prev_sid_nodata /* i : Previous SID/No data indicator */ -); - -void add_HB_to_mono_dmx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float output[L_FRAME48k], /* i/o: output synthesis */ - float outputHB[L_FRAME48k], /* i : HB synthesis */ - const int16_t last_core, /* i : last core, primary channel */ - const int16_t output_frame /* i : frame length */ -); - -/*----------------------------------------------------------------------------------* - * Range Coder prototypes - *----------------------------------------------------------------------------------*/ - -void rc_uni_dec_init( - RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ - uint16_t *bit_buffer, /* i : Bit buffer */ - const int16_t max_available_bits /* i : Total maximum bits available */ -); - -/*! r: Read symbol */ -uint16_t rc_uni_dec_read_symbol_fastS( - RangeUniDecState *rc_st_dec, /* i/o: Decoder State */ - const uint16_t cum_freq_table[], /* i : Cumulative frequency up to symbol */ - const uint16_t sym_freq_table[], /* i : Symbol frequency */ - const uint16_t alphabet_size, /* i : Number of symbols in the alphabet */ - const uint16_t tot_shift /* i : Total frequency as a power of 2 */ -); - -/*! r: Read bit */ -uint16_t rc_uni_dec_read_bit( - RangeUniDecState *rc_st_dec /* i/o: RC state handle */ -); - -/*! r: Read bit */ -uint16_t rc_uni_dec_read_bit_prob_fast( - RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ - const int16_t freq0, /* i : Frequency for symbol 0 */ - const uint16_t tot_shift /* i : Total frequency as a power of 2 */ -); - -/*! r: Read bits */ -uint16_t rc_uni_dec_read_bits( - RangeUniDecState *rc_st_dec, /* i/o: RC state handle */ - const int16_t bits /* i : Number of bits */ -); - -/*! r: Total number of bits consumed */ -int16_t rc_uni_dec_virtual_finish( - RangeUniDecState *rc_st_dec /* i/o: RC state handle */ -); - -/*! r: Total number of bits consumed */ -int16_t rc_uni_dec_finish( - RangeUniDecState *rc_st_dec /* i/o: RC state handle */ -); - - -/*----------------------------------------------------------------------------------* - * ECLVQ Stereo prototypes - *----------------------------------------------------------------------------------*/ - -float ECSQ_dequantize_gain( - const int16_t index -); - - - -void ECSQ_init_instance( - ECSQ_instance *ecsq_inst, - const int16_t config_index, - void *ac_handle -); - - - -void ECSQ_dequantize_vector( - const int16_t *input, - const float global_gain, - const int16_t N, - float *output -); - - -/*----------------------------------------------------------------------------------* - * ICA Stereo prototypes - *----------------------------------------------------------------------------------*/ - -void stereo_tca_init_enc( - STEREO_TCA_ENC_HANDLE hStereoTCA, /* i/o: Stereo TCA encoder handle */ - const int32_t input_Fs /* i : input sampling frequency */ -); - -void stereo_tca_enc( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - const int16_t input_frame /* i : length of a frame per channel */ -); - -void stereo_tca_init_dec( - STEREO_TCA_DEC_HANDLE hStereoTCA /* i/o: Stereo TCA handle */ -); - -void stereo_tca_dec( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *synth[CPE_CHANNELS], /* i/o: output synth */ - const int16_t output_frame /* i : length of a frame per channel */ -); - -void stereo_tca_scale_R_channel( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output, /* i/o: output synthesis, R channel */ - const int16_t output_frame /* i : frame length */ -); - -void adjustTargetSignal( - float *target, - const int16_t prevShift, - const int16_t currShift, - const int16_t L_shift_adapt, - const int16_t method -); - -/*----------------------------------------------------------------------------------* - * IC-BWE Stereo prototypes - *----------------------------------------------------------------------------------*/ - - -void stereo_icBWE_preproc( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const int16_t input_frame, /* i : input frame length */ - float shb_speech_nonref[] /* o : SHB speech non-ref channel */ -); - -void stereo_icBWE_enc( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const float shb_speech_ref[], /* i : SHB speech ref channel */ - float shb_speech_nonref[], /* i/o: SHB speech non-ref channel */ - const float *voice_factors /* i : voicing factors */ -); - -void stereo_icBWE_init_dec( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ -); - -void stereo_icBWE_dec( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *synthRef, /* i/o: Reference channel HB synthesis at output Fs */ - float *synth, /* o : Non reference channel HB synthesis at output Fs */ - const float *fb_synth_ref, /* i : ref. high-band synthesis 16-20 kHz */ - const float *voice_factors, /* i : voicing factors */ - const int16_t output_frame /* i : frame length */ -); - -void stereo_icBWE_decproc( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output[CPE_CHANNELS], /* i/o: output symthesis */ - float outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ - const int16_t last_core, /* i : last core, primary channel */ - const int16_t last_bwidth, /* i : last bandwidth */ - const int16_t output_frame /* i : frame length */ -); - - -/*----------------------------------------------------------------------------------* - * Stereo classifiers prototypes - *----------------------------------------------------------------------------------*/ - -void stereo_classifier_features( - STEREO_CLASSIF_HANDLE hStereoClassif, /* i/o: stereo classifier structure */ - const int16_t idchan, /* i : channel ID */ - const int16_t element_mode, /* i : element mode */ - const int16_t vad_flag, /* i : VAD flag */ - const float lsf_new[], /* i : LSFs at the end of the frame */ - const float epsP[], /* i : LP analysis residual energies for each iteration*/ - const int16_t pitch[], /* i : open-loop pitch values for quantiz. */ - const float voicing[], /* i : OL maximum normalized correlation */ - const float cor_map_sum, /* i : speech/music clasif. parameter */ - const float non_staX, /* i : unbound non-stationarity for sp/mu clas. */ - const float sp_div, /* i : spectral diversity feature */ - const int16_t clas /* i : signal class */ -); - - -void xtalk_classifier_dft( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - const int16_t itd, /* i : ITD from DFT stereo - used as a feature */ - const float gcc_phat[] /* i : GPHAT cross-channel correlation function */ -); - -/*----------------------------------------------------------------------------------* - * TD Stereo prototypes - *----------------------------------------------------------------------------------*/ - -void stereo_td_init_enc( - STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const int16_t last_element_mode /* i : last element mode */ -); - - - -void stereo_tdm_downmix( - STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i : TD stereo IVAS encoder structure */ - float *Left_in, /* i/o: Left channel -> Primary channel */ - float *Right_in, /* i/o: Right channel -> Secondary channel */ - const int16_t input_frame, /* i : Number of samples */ - const int16_t tdm_ratio_idx, /* i : TDM ratio index */ - const int16_t tdm_SM_flag, /* i : channel combination scheme flag */ - const int16_t tdm_ratio_idx_SM /* i : TDM ratio index for SM mode */ -); - -void stereo_td_init_dec( - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const int16_t last_element_mode /* i : last element mode */ -); - -void tdm_configure_dec( - const int16_t ivas_format, /* i : IVAS format */ - const int16_t ism_mode, /* i : ISM mode in combined format */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - int16_t *tdm_ratio_idx, /* o : ratio index */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - -void tdm_upmix_plain( - float Left[], /* o : left channel */ - float Right[], /* o : right channel */ - const float PCh_2_L[], /* i : primary channel */ - const float SCh_2_R[], /* i : secondary channel */ - const float LR_ratio, /* i : mixing ratio */ - const float inv_den_LR_ratio, /* i : inverse mixing ration */ - const int16_t start_index, /* i : start index */ - const int16_t end_index, /* i : end index */ - const int16_t plus_minus_flag /* i : plus/minus flag */ -); - -void stereo_tdm_combine( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *PCh_2_L, /* i/o: Primary channel -> output as L channel */ - float *SCh_2_R, /* i/o: Seconday channel -> output as R channel */ - const int16_t output_frame, /* i : Number of samples */ - const int16_t flag_HB, /* i : flag to distinguish between core (0) and HB (1) synthesis */ - const int16_t tdm_ratio_idx /* i : TDM ratio index */ -); - -/*! r: replication decision; 1 = Use old LP */ -void tdm_ol_pitch_comparison( - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - float pitch_fr[CPE_CHANNELS][NB_SUBFR], /* i/o: fractional pitch values */ - float voicing_fr[CPE_CHANNELS][NB_SUBFR] /* i/o: fractional pitch gains */ -); - -void tdm_configure_enc( - const int16_t ivas_format, /* i : IVAS format */ - const int16_t ism_mode, /* i : ISM mode in combined format */ - CPE_ENC_HANDLE hCPE, /* i : CPE encoder structure */ - const float Etot_last[CPE_CHANNELS], /* i/o: Energy of last frame */ - const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ - const int16_t tdm_ratio_idx, /* i : ratio index */ - const int16_t tdm_ratio_idx_SM, /* i : ratio index in SM mode */ - const int16_t attack_flag, /* i : Primary channel attack flag */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - - -void tdm_bit_alloc( - const int16_t ivas_format, /* i : IVAS format */ - const int16_t ism_mode, /* i : ISM mode in combined format */ - const int32_t element_brate_wo_meta, /* i : element bitrate without metadata */ - const int16_t tdm_lp_reuse_flag, /* i : LPC reusage flag */ - int32_t *total_brate_pri, /* o : Allocated primary channel bitrate */ - int32_t *total_brate_sec, /* o : Allocated secondary channel bitrate */ - int16_t *tdm_low_rate_mode, /* o : secondary channel low rate mode flag */ - const int16_t coder_type, /* i : secondary channel coder type */ - const int16_t ener_ratio_idx, /* i : correlation ratio indexe */ - const int16_t tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const int16_t bwidth_pri, /* i : bandwidth of the primary channel */ - const int16_t bwidth_sec, /* i : bandwidth of the secondary channel */ - const int16_t flag_ACELP16k_pri, /* i : ACELP@16kHz core flag, primary chan. */ - const int16_t tdm_LRTD_flag, /* i : LRTD stereo mode flag */ - const int16_t coder_type0, /* i : coder type (temporary in the encoder, from bitstream in decoder) */ - const int16_t tdm_inst_ratio_idx /* i : instantaneous correlation ratio index */ -); - - -/*! r: value of the indice */ -uint16_t get_indice_st( - Decoder_State *st, /* i/o: decoder state structure */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t pos, /* i : absolute position in the bitstream */ - const int16_t nb_bits /* i : number of bits to quantize the indice */ -); - -void tdm_low_rate_dec( - Decoder_State *st, /* i/o: decoder static memory */ - float dct_epit[], /* o : GSC excitation in DCT domain */ - float *tmp_noise, /* o : long term temporary noise energy */ - float *pitch_buf, /* o : floating pitch values for each subframe */ - float *voice_factors, /* o : voicing factors */ - float *exc, /* i/o: adapt. excitation exc */ - float *exc2, /* i/o: adapt. excitation/total exc */ - float *bwe_exc, /* o : excitation for SWB TBE */ - const float *lsf_new /* i : ISFs at the end of the frame */ -); - -void tdm_SCh_LSF_intra_pred( - const int32_t element_brate, /* i : element bitrate */ - const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ - float *pred_lsf_SCh /* o : predicted secondary channel LSFs */ -); - - -void first_VQstages( - const float *const *cb, - const float u[], /* i : vector to be encoded (prediction and mean removed) */ - const int16_t *levels, /* i : number of levels in each stage */ - const int16_t stagesVQ, /* i : number of stages */ - const float w[], /* i : weights */ - const int16_t N, /* i : vector dimension */ - const int16_t max_inner, /* i : maximum number of swaps in inner loop */ - int16_t indices_VQstage[] -); - - -void deindex_lvq_SHB( - UWord32 index, - float *out, - const int16_t nbits, - const int16_t mode -); - -/*----------------------------------------------------------------------------------* - * MDCT Stereo prototypes - *----------------------------------------------------------------------------------*/ - -void stereo_td_itd_mdct_stereo( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder handle */ - const int16_t vad_flag_dtx[], /* i : VAD dtx flags */ - const int16_t vad_hover_flag[], /* i : VAD hangover flags */ - const int16_t input_frame /* i : frame length */ -); - -void QuantizeTCXSpectrum( - Encoder_State *st, /* i : state handle */ - const int16_t frame_cnt, /* i : frame counter in the super_frame */ - const float *x_orig, /* i : shaped MDCT spectrum */ - const float *gainlpc, /* i : FDNS gains */ - const Word16 *Aqind, /* i : frame-independent quantized coefficients (M+1) */ - const int16_t tnsSize, /* i : number of tns parameters put into prm */ - const int16_t nb_bits, /* i : bit budget */ - const int16_t vad_hover_flag, /* i : VAD hangover flag */ - int16_t *pL_frameTCX, /* o : full frame length */ - int16_t *pL_frame, /* o : frame length */ - int16_t *pL_spec, /* o : length of the coded spectrum */ - int16_t *ptcx_offset, /* o : folding point offset relative to the end of the previous frame */ - int16_t *pnoiseFillingBorder, /* o : noise filling border */ - float spectrum[], /* o : quantized MDCT spectrum */ - CONTEXT_HM_CONFIG *hm_cfg, /* o : Context-based harmonic model configuration */ - int16_t *hm_active, /* o : flag indicating if the harmonic model is active */ - float lf_deemph_fact[], /* o : low frequency deemphasis factors */ - int16_t *nf_seed, /* o : noise filling random seed */ - float *ener, /* o : energy of the quantized spectrum */ - float *gain_tcx, /* o : global gain */ - int16_t prm[] /* o : tcx parameters */ -); - -void EstimateStereoTCXNoiseLevel( - Encoder_State **sts, /* i : state handle */ - float *q_spectrum[CPE_CHANNELS][NB_DIV], /* i : quantized MDCT spectrum */ - float gain_tcx[][NB_DIV], /* i : global gain */ - int16_t L_frame[][NB_DIV], /* i : frame length */ - int16_t noiseFillingBorder[][NB_DIV], /* i : noise filling border */ - int16_t hm_active[][NB_DIV], /* i : flag indicating if the harmonic model is active */ - const int16_t ignore_chan[], /* i : flag indicating whether the channel should be ignored */ - float fac_ns[][NB_DIV], /* o : noise filling level */ - int16_t param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -); - -void TNSAnalysisStereo( - Encoder_State **sts, /* i : state handle */ - float *mdst_spectrum[CPE_CHANNELS][NB_DIV], /* o : MDST spectrum */ - const int16_t bWhitenedDomain, /* i : whitened domain flag */ - int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : number of tns parameters put into prm */ - int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : number of tns bits in the frame */ - int16_t param_core[][NB_DIV * NPRM_DIV], /* o : quantized noise filling level */ - const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ -); - -void InternalTCXDecoder( - Encoder_State *st, /* i/o: state handle */ - const int16_t frame_cnt, /* i : frame counter in the super_frame */ - const int16_t L_frameTCX, /* i : full frame length */ - const int16_t L_frame, /* i : frame length */ - const int16_t L_spec, /* i : length of the coded spectrum */ - const int16_t tcx_offset, /* i : folding point offset relative to the end of the previous frame */ - const int16_t noiseFillingBorder, /* i : noise filling border */ - const float *x_quant, /* i : quantized spectrum */ - const float ener, /* i : energy of the quantized spectrum */ - float lf_deemph_fact[], /* i/o: low frequency deemphasis factors */ - const float fac_ns, /* i : noise filling level */ - const int16_t nf_seed, /* i : noise filling random seed */ - const float *A, /* i : LPC representation of the FDNS gains */ - float *gainlpc, /* i/o: FDNS gains */ - const int16_t hm_active, /* i : flag indicating if the harmonic model is active */ - float gain_tcx, /* i/o: global gain / quantized global gain */ - float spectrum[], /* o : dequantized spectrum */ - float synth[], /* o : time domain signal */ - int16_t *gain_tcx_q /* o : quantized global gain (at low bitrates) */ -); - -void stereo_mdct_core_enc_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - Word16 new_samples[CPE_CHANNELS][L_INP], /* i : new samples Q0*/ - Word16 old_wsp[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP Qx*/ - Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k] /* o : floating pitch for each subframe Q6*/ -); - -void initMdctStereoEncData( - STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int16_t element_mode, /* i : element mode */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t bwidth, /* i : bandwidth */ - const int16_t igf, /* i : flag indicating IGF activity */ - const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ - const int16_t mem_init /* i : initialize memory after malloc */ -); - -ivas_error initMdctItdHandling( - STEREO_MDCT_ENC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const int32_t input_Fs /* i : input sampling rate */ -); - -void stereo_mdct_enc_destroy( - STEREO_MDCT_ENC_DATA_HANDLE *hStereoMdct /* i/o: encoder MDCT stereo handle */ -); - -void initMdctStereoDecData( - STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: mdct stereo parameters structure */ - const int16_t igf, /* i : flag indicating IGF activity */ - const H_IGF_GRID igfGrid, /* i : IGF grid configuration */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t bwidth /* i : audio bandwidth */ -); - -void stereo_mdct_init_bands( - const int16_t L_frame, /* i : frame length */ - const int16_t tmp_tcx_mode, /* i : tcx mode (TCX10, TCX 20), -1 if transition frame */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t igf, /* i : flag indicating if IGF is used */ - const H_IGF_GRID hIgfGrid, /* i : IGF grid setup */ - int16_t *sfbOffset, /* o : sfb offset table */ - int16_t *sfbCnt /* o : number of sfbs */ -); - -void stereo_mdct_init_igf_start_band( - STEREO_MDCT_BAND_PARAMETERS *stbParams, /* i/o: stereo frequency band parameters */ - const float transFac, /* i : transform factor */ - const int16_t bwidth, /* i : audio bandwidth */ - const int32_t element_brate /* i : element bitrate */ -); - -void init_tcx_enc_info( - Encoder_State *st, /* i : coder memory state */ - int16_t *L_frame, - int16_t *L_frameTCX, - int16_t *L_spec -); - -void decoder_tcx_invQ( - Decoder_State *st, /* i/o: coder memory state */ - int16_t prm[], /* i : parameters */ - float A[], /* i : coefficients NxAz[M+1] */ - Word16 Aind[], /* i : frame-independent coefficients Az[M+1] */ - const int16_t L_spec, - const int16_t L_frame, - const int16_t L_frameTCX, - float x[], - float gainlpc2[], - float xn_buf[], - int16_t *fUseTns, /* o : flag that is set if TNS data is present */ - STnsData *tnsData, - float *gain_tcx, - const int16_t **prm_sqQ, - int16_t *nf_seed, - const int16_t bfi, /* i : Bad frame indicator */ - const int16_t frame_cnt /* i : frame counter in the super frame */ -); - -void decoder_tcx_noisefilling( - Decoder_State *st, /* i/o: coder memory state */ - float concealment_noise[L_FRAME48k], - const float A[], /* i : coefficients NxAz[M+1] */ - const int16_t L_frameTCX_glob, - const int16_t L_spec, - const int16_t L_frame, - const int16_t L_frameTCX, - float x[], - float gainlpc2[], - int16_t *temp_concealment_method, - const float gain_tcx, - const int16_t *prm_sqQ, - int16_t nf_seed, - const int16_t bfi, /* i : Bad frame indicator */ - const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const int16_t frame_cnt /* i : frame counter in the super frame */ -); - -void decoder_tcx_noiseshaping_igf( - Decoder_State *st, /* i/o: coder memory state */ - const int16_t L_spec, - const int16_t L_frame, - const int16_t L_frameTCX, - const int16_t left_rect, - float x[], - const float gainlpc2[], - int16_t *temp_concealment_method, - const int16_t bfi /* i : Bad frame indicator */ -); - -void decoder_tcx_tns( - Decoder_State *st, /* i/o: coder memory state */ - const int16_t L_frame_glob, - const int16_t L_spec, - const int16_t L_frame, - const int16_t L_frameTCX, - float x[N_MAX], - const int16_t fUseTns, /* i : flag that is set if TNS data is present */ - STnsData *tnsData, - const int16_t bfi, /* i : Bad frame indicator */ - const int16_t frame_cnt, /* i : frame counter in the super frame */ - const int16_t whitenedDomain -); - -void decoder_tcx_imdct( - Decoder_State *st, /* i/o: coder memory state */ - const int16_t L_frame_glob, /* i : frame length */ - const int16_t L_frameTCX_glob, - const int16_t L_spec, - const int16_t tcx_offset, - const int16_t tcx_offsetFB, - const int16_t L_frame, - const int16_t L_frameTCX, - const int16_t left_rect, - float x[N_MAX], - float xn_buf[], - const uint16_t kernelType, /* i : TCX transform kernel type */ - const int16_t fUseTns, /* i : flag that is set if TNS data is present */ - float synth[], /* i/o: synth[-M..L_frame] */ - float synthFB[], - const int16_t bfi, /* i : Bad frame indicator */ - const int16_t frame_cnt, /* i : frame counter in the super frame */ - const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ -); - -void init_tcx_info( - Decoder_State *st, /* i/o: coder memory state */ - const int16_t L_frame_glob, /* i : global frame length */ - const int16_t L_frameTCX_glob, /* i : FB global frame length */ - const int16_t frame_cnt, /* i : frame counter in the super_frame */ - const int16_t bfi, /* i : bad frame indicator */ - int16_t *tcx_offset, /* o : folding point offset relative to the end of the previous frame */ - int16_t *tcx_offsetFB, /* o : FB folding point offset relative to the end of the previous frame*/ - int16_t *L_frame, /* o : frame length */ - int16_t *L_frameTCX, /* o : TCX frame length */ - int16_t *left_rect, /* o : left part is rectangular */ - int16_t *L_spec /* o : spectrum length */ -); - -void decoder_tcx_IGF_mono( - Decoder_State *st, /* i/o: coder memory state */ - float x[], /* o : de-quatized coefficients */ - const int16_t L_frame, /* i : frame length */ - const int16_t left_rect, /* i : left part is rectangular */ - const int16_t bfi, /* i : bad frame indicator */ - const int16_t frame_cnt /* i : frame counter in the super_frame */ -); - -void decoder_tcx_IGF_stereo( - Decoder_State **sts, /* i/o: coder memory states */ - STEREO_MDCT_DEC_DATA_HANDLE hStereoMdct, /* i/o: MDCT stereo structure */ - int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - float *x[CPE_CHANNELS][NB_DIV], /* o : de-quatized coefficients */ - const int16_t L_frame, /* i : frame length */ - const int16_t left_rect, /* i : left part is rectangular */ - const int16_t k, /* i : Subframe index */ - const int16_t bfi, /* i : bad frame indicator */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -); - -void ms_processing( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ - Encoder_State **sts, /* i/o: Encoder state structure */ - int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - const int16_t iSubframe, /* i : subframe number */ - float x_0[], /* i/o: spectrum 1 */ - float x_1[], /* i/o: spectrum 2 */ - int16_t maxSfb /* i : number of stereo frequency bands */ -); - -void ms_inv_mask_processing( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ - Encoder_State **sts, /* i/o: Encoder state structure */ - int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - const int16_t iSubframe, /* i : subframe number */ - const float x_0[], /* i : spectrum 1 */ - const float x_1[], /* i : spectrum 2 */ - float x_inv_0[], /* o : inverse spectrum 1 */ - float x_inv_1[], /* o : inverse spectrum 2 */ - int16_t maxSfb /* i : number of stereo frequency bands */ -); - -void IGFDecApplyStereo_flt( - const IGF_DEC_INSTANCE_HANDLE hIGFDecL, /* i : instance handle of IGF Decoder */ - const IGF_DEC_INSTANCE_HANDLE hIGFDecR, /* i : instance handle of IGF Decoder */ - float *spectrumL, /* i/o: L MDCT spectrum */ - float *spectrumR, /* i/o: R MDCT spectrum */ - const int16_t igfGridIdx, /* i : in case of CELP->TCX switching, use 1.25 framelength */ - const int16_t *coreMsMask, - const int16_t restrict_hopsize, - const int16_t bfi, /* i : frame loss == 1, frame good == 0 */ - const int16_t bfi_apply_damping /* i : decoder element mode */ -); - -void IGFEncStereoEncoder( - STEREO_MDCT_BAND_PARAMETERS *sfbParam, /* i/o: sfb parameters for the right channel */ - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : IGF handle */ - const float *mdctSpectrumL, /* i : left spectrum */ - const float *mdctSpectrumR, /* i : right spectrum */ - int16_t *msMask, /* i/o: MS mask */ - int16_t *igfStereoMode, /* o : IGF stereo mode */ - const int16_t mdct_stereo_mode, /* i : MDCT stereo mode */ - const int16_t isTCX20, /* i : flag for indicating TCX20 */ - const int16_t isTransition /* i : flag for transtition */ -); - -void IGFDecReplicateTCX10State_flt( - IGF_DEC_INSTANCE_HANDLE hIGFDec /* i/o: instance handle of IGF Decoder */ -); - - -void InitPsychLPC( - const int32_t sr_core, /* i : sampling rate of core-coder */ - const int16_t L_frame, /* i : frame length */ - const TCX_CONFIG_HANDLE hTcxCfg /* i : TCX configuration handle */ -); - - -void stereo_coder_tcx( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: MDCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - float *mdst_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ - float *inv_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ - float *inv_mdst_spectrum[CPE_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ - const int16_t mct_on /* i : flag mct block (1) or stereo (0) */ -); - -void stereo_decoder_tcx( - STEREO_MDCT_DEC_DATA *hStereoMdct, /* i/o: MDCT stereo decoder structure */ - int16_t ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask */ - float *spec_r_0[NB_DIV], /* i/o: spectrum right channel */ - float *spec_l[], /* i/o: spectrum left channel [NB_DIV][N] */ - float *spec_r[], /* i/o: spectrum right channel [NB_DIV][N] */ - const int16_t mdct_stereo_mode[], /* i : stereo mode (FB/band wise MS, dual mono */ - const int16_t core_l, /* i : core for left channel (TCX20/TCX10) */ - const int16_t core_r, /* i : core for right channel (TCX20/TCX10) */ - const int16_t igf, /* i : flag for IGF activity */ - const int16_t L_frameTCX_l, /* i : TCX frame length of left channel */ - const int16_t L_frameTCX_r, /* i : TCX frame length of right channel */ - const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ - const int16_t last_core_l, /* i : last core for left channel */ - const int16_t last_core_r, /* i : last core for right channel */ - const int16_t tmp_plc_upmix /* i : indicates temp upmix for PLC decision */ -); - -void stereo_mdct_core_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *signal_out[CPE_CHANNELS], /* o : synthesis @internal_FS */ - float signal_outFB[CPE_CHANNELS][L_FRAME48k] /* o : synthesis @output_FS */ -); - -void splitAvailableBits( - const int16_t total_bits, /* i : total available bits for TCX coding */ - const int16_t split_ratio, /* i : split ratio */ - const int16_t isSBAStereoMode, /* i : signal core coding for SBA */ - int16_t *bits_ch0, /* o : bits for channel 0 */ - int16_t *bits_ch1 /* o : bits for channel 1 */ -); - -Word16 write_stereo_to_bitstream_fx -( - STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct, /* i/o: Stereo MDCT encoder structure */ - Encoder_State **sts, /* i/o: Encoder state structure */ - Word16 ms_mask[NB_DIV][MAX_SFB], /* i : bandwise MS mask Q0*/ - const Word16 mct_on, /* i : flag mct block (1) or stereo (0) Q0*/ - BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ -); - - - -void ComputeSpectrumNoiseMeasure( - const float *powerSpec, - const int16_t L_frame, - const int16_t startLine, - const int16_t resetMemory, - int8_t *noiseFlags, - const int16_t lowpassLine -); - -void IGFSaveSpectrumForITF( - IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i/o: instance handle of IGF Encoder */ - const int16_t igfGridIdx, /* i : IGF grid index */ - const float *pITFSpectrum /* i : MDCT spectrum */ -); - -void convert_coeffs_to_higher_res( - const float *in1, /* i : first subframe input */ - const float *in2, /* i : second subframe input */ - float *out, /* o : converted output */ - const int16_t len /* i : length of subframes */ -); - -int16_t quantize_sns( - float sns_in[CPE_CHANNELS][NB_DIV][M], - float snsQ_out[CPE_CHANNELS][NB_DIV][M], - Encoder_State **sts, - int16_t *indices, - int16_t *zero_side_flag, - int16_t *sns_stereo_mode -); - -void dequantize_sns( - int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW], - float snsQ_out[CPE_CHANNELS][NB_DIV][M], - Decoder_State **sts -); - -void sns_avq_dec( - int16_t *index, /* i : Quantization indices */ - float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ - const int16_t L_frame, /* i : frame length */ - const int16_t numlpc /* i : Number of sets of lpc */ -); - -void sns_avq_dec_stereo( - int16_t *indexl, /* i : Quantization indices (left channel) */ - int16_t *indexr, /* i : Quantization indices (right channe) */ - const int16_t L_frame, /* i : frame length */ - float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ - float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ -); - -void convertToMS( - const int16_t L_frame, /* i : frame length */ - float x0[], /* i/o: mid/left channel coefficients */ - float x1[], /* i/o: side/right channel coefficients */ - const float norm_fac /* i : normalization factor */ -); - -void inverseMS( - const int16_t L_frame, /* i : frame length */ - float x0[], /* i/o: mid/left channel coefficients */ - float x1[], /* i/o: side/right channel coefficients */ - const float norm_fac /* i : normalization factor */ -); - -void stereoFdCngCoherence( - Encoder_State **sts, /* i/o: core encoder structures */ - const int16_t last_element_mode, /* i : last element mode */ - float fft_buff[CPE_CHANNELS][2 * L_FFT] /* i : fft buffers for L and R channels */ -); - -void FdCngEncodeMDCTStereoSID( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ -); - -void FdCngDecodeMDCTStereoSID( - CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ -); - -ivas_error initMdctStereoDtxData( - CPE_DEC_HANDLE hCPE /* i/o: CPE decoder handle */ -); - -void synchonize_channels_mdct_sid( - Decoder_State *sts[CPE_CHANNELS], /* i/o: decoder state structure */ - const int16_t n /* i : channel number */ -); - -void updateBuffersForDmxMdctStereo( - CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ - const int16_t output_frame, /* i : output frame length */ - float *output[CPE_CHANNELS], /* i/o: decoder output */ - float synth[CPE_CHANNELS][L_FRAME48k] /* i/o: decoder synthesis */ -); - -void applyDmxMdctStereo( - const CPE_DEC_HANDLE hCPE, /* i : CPE handle */ - float *output[CPE_CHANNELS], /* o : output from core decoder */ - const int16_t output_frame /* i : output frame length */ -); - -/*----------------------------------------------------------------------------------* - * Front-VAD prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error front_vad_create( - FRONT_VAD_ENC_HANDLE *hFrontVad, /* i/o: front-VAD handle */ - const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ -); - -void front_vad_destroy( - FRONT_VAD_ENC_HANDLE *hFrontVad /* i/o: front-VAD handle */ -); - -ivas_error front_vad( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure, nullable */ - Encoder_State *st, /* i/o: encoder state structure */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - FRONT_VAD_ENC_HANDLE *hFrontVads, /* i/o: front-VAD handles */ - const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const int16_t input_frame, /* i : frame length */ - int16_t vad_flag_dtx[], /* o : HE-SAD flag with additional DTX HO */ - float fr_bands[][2 * NB_BANDS], /* i : energy in frequency bands */ - float Etot_LR[], /* o : total energy Left & Right channel */ - float lf_E[][2 * VOIC_BINS], /* i : per bin spectrum energy in lf, LR channels */ - int16_t localVAD_HE_SAD[], /* o : HE-SAD flag without hangover, LR channels */ - int16_t vad_hover_flag[], /* o : VAD hangover flag */ - float band_energies_LR[2 * NB_BANDS], /* o : energy in critical bands without minimum noise floor E_MIN */ - float *PS_out, /* o : energy spectrum */ - float *Bin_E_out /* o : log-energy spectrum of the current frame*/ -); - -ivas_error front_vad_spar( - SPAR_ENC_HANDLE hSpar, /* i/o: SPAR encoder structure */ - const float *omni_in, /* i : omnidirectional input signal */ - ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : encoder configuration handle */ - const int16_t input_frame /* i : input frame length */ -); - - -/*----------------------------------------------------------------------------------* - * Stereo CNG prototypes - *----------------------------------------------------------------------------------*/ - -void stereo_enc_cng_init( - STEREO_CNG_ENC_HANDLE hStereoCng /* i/o: stereo CNG encoder structure */ -); - -void stereo_cng_upd_counters( - STEREO_CNG_ENC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const int32_t element_mode, /* i : element mode */ - const int16_t nbands, /* i : Number of bands in active */ - const float sidSideGain[], /* i : SID side gains */ - const int16_t burst_ho_count, /* i : Hang-over count */ - int16_t *coh_fade_counter /* i : Coherence fade counter */ -); - -void stereo_cng_init_dec( - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: stereo CNG decoder structure */ - const int16_t *frameSize /* i : pointer to frameSize of channel 0 to be used for channel 1 */ -); - -void stereo_cng_compute_PScorr( - float *output[CPE_CHANNELS], /* i : Output signal */ - float *c_PS_LT, /* i/o: Correlation */ - const int16_t L_frame_0, /* i : L_frame channel 0 */ - const int16_t L_frame_1 /* i : L_frame channel 1 */ -); - -void stereo_cng_dec_update( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const int32_t ivas_total_brate /* i : IVAS total bitrate Q0*/ -); - -void stereo_cna_update_params( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output[CPE_CHANNELS], /* i : Output signal */ - const int16_t output_frame, /* i : Output frame length */ - const int16_t tdm_ratio_idx /* i : TDM ratio index */ -); - -void dtx_enc_init( - Encoder_State *st, /* i : Encoder state handle */ - const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ - const int16_t interval_SID /* i : interval for SID update */ -); - - -/*----------------------------------------------------------------------------------* - * Framework general prototypes - *----------------------------------------------------------------------------------*/ - -void mvc2c( - const uint8_t x[], /* i : input vector */ - uint8_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ -); - -/*! r: Adjusted value */ -ivas_error stereo_memory_dec( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - CPE_DEC_HANDLE hCPE, /* i : CPE decoder structure */ - const int16_t nb_bits_metadata, /* i : number of metadata bits */ - const int32_t output_Fs, /* i : output sampling rate */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const MC_MODE mc_mode, /* i : MC mode */ - const int16_t nchan_transport /* i : number of transport channels */ -); - -void stereo_switching_dec( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const Word32 ivas_total_brate /* i : IVAS total bitrate Q0*/ -); - -void stereo_td2dft_update( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - const int16_t n, /* i : channel number */ - float output[], /* i/o: synthesis @internal Fs */ - float synth[], /* i/o: synthesis @output Fs */ - float hb_synth[], /* i/o: hb synthesis */ - const int16_t output_frame /* i : frame length */ -); - -void stereo_mdct2dft_update( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float output0[], /* i/o: synthesis @internal Fs, ch0 */ - float synth0[] /* i/o: synthesis @output Fs, ch0 */ -); - - -/*! r: number of bits written */ - - - -/*----------------------------------------------------------------------------------* - * MCT prototypes - *----------------------------------------------------------------------------------*/ -void ivas_mdct_core_whitening_enc_fx( - CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ - Word16 new_samples_fx[CPE_CHANNELS][L_INP], /* i : new samples */ - Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ - Word16 pitch_buf[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ - Word32 *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ - int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ - Word32 *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ - int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */ - int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ - const int16_t nChannels, /* i : total number of coded channels */ -Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV], -Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV] -); -void ivas_mct_core_enc( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - CPE_ENC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE encoder structures */ - const int16_t nChannels, /* i : number of channels to be coded */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t switch_bw, /* i : flag bandwidth switch occurance */ - const int16_t lfe_bits, /* i : bits spent for LFE */ - const int16_t sba_order /* i : Ambisonic (SBA) order */ -); - -void ivas_mdct_quant_coder( - CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ - int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */ - int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */ - int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -); - -void apply_MCT_enc( - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - float *mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: MDST spectrum */ - float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse spectrum */ - float *inv_mdst_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i/o: inverse MDST spectrum */ - const int16_t nchan /* i : number of channels */ -); - -void write_mct_bitstream( - Encoder_State **sts, /* i/o: encoder state structure */ - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - const int16_t nchan /* i : number of channels */ -); - -void splitAvailableBitsMCT_fx( - void **sts, /* i/o: encoder/decoder state structure */ - const Word16 total_bits, /* i : total number of available bits */ - const Word16 split_ratio[MCT_MAX_CHANNELS], /* i : ratio for splitting the bits Q0 */ - const Word16 enc_dec, /* i : encoder or decoder flag */ - const Word16 nchan /* i : number of channels */ -); - -void getChannelEnergies( - Encoder_State **sts, /* i : Encoder state structure */ - float nrg[MCT_MAX_CHANNELS], /* o : energies */ - const int16_t nchan /* i : number of channels */ -); - -void mctStereoIGF_enc( - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ - Encoder_State **sts, /* i/o: encoder state structure */ - float *orig_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : MDCT spectrum for ITF */ - float powerSpec[MCT_MAX_CHANNELS][L_FRAME48k], /* i/o: MDCT^2 + MDST^2 spectrum,or estimate */ - float *powerSpecMsInv[MCT_MAX_CHANNELS][NB_DIV], /* i : same as above but for inverse spect. */ - float *inv_spectrum[MCT_MAX_CHANNELS][NB_DIV], /* i : inverse spectrum */ - const int16_t sp_aud_decision0[MCT_MAX_CHANNELS] /* i : speech audio decision */ -); - -void ivas_mdct_dec_side_bits_frame_channel( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ - int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ - Decoder_State *st0, /* i : pointer to bitstream handle */ - int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */ - int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */ - const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - const int16_t odd_channel_cpe /* i : flag cpe with odd nb of tc channels */ -); - -void ivas_mct_side_bits( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - CPE_DEC_HANDLE hCPE[MCT_MAX_BLOCKS], /* i/o: CPE decoder structure */ - const int16_t nCPE, /* i : number of CPEs */ - Decoder_State *st0, /* i : decoder handle for Bstr */ - const int16_t bfi, /* i : BFI flag */ - uint16_t *bitstream, /* o : bitstream indices */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t nb_bits_metadata /* i : number of metadata bits */ -); - -void ivas_mdct_core_invQ( - CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ - int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */ - int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */ - int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */ - int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i : param buffer */ - int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ - STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ - float *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ - float *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ - float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients */ - int16_t ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -); - -void ivas_mdct_core_reconstruct( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *x[][NB_DIV], /* i/o: pointers to synthesis @internal_FS */ - float signal_outFB[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS */ - int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -); - -void ivas_mdct_core_tns_ns( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ - STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */ - float *x[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ - float Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* o : LP coefficients */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -); - - -void ivas_mct_dec_mct( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - const int16_t nchan /* i : number of channels */ -); - -void apply_MCT_dec( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - float *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ -); - -void mctStereoIGF_dec( - MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ - Decoder_State **sts, /* i/o: decoder state structure */ - float *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequantized spectrum */ - const int16_t bfi /* i : bad frame flag */ -); - -void enc_prm_igf_mdct( - Encoder_State *st, /* i : Encoder state handle */ - BSTR_ENC_HANDLE hBstr /* i/o: Bitstream handle */ -); - -void mdct_read_IGF_bits( - Decoder_State *st, /* i/o: Encoder state handle */ - Decoder_State *st0 /* i : pointer to handle where bstr is read */ -); - - -/*----------------------------------------------------------------------------------* - * Q Metadata prototypes for DirAC and MASA - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_qmetadata_enc_encode( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData, /* i/o: q_metadata handle */ - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -); - -ivas_error ivas_qmetadata_enc_encode_hr_384_512( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ - const int16_t bits_sph_idx, - const int16_t bits_sp_coh -); - -void deindex_sph_idx( - const uint16_t sphIndex, /* i : Spherical index */ - const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ - float *theta, /* o : Elevation */ - float *phi /* o : Azimuth */ -); - -/*! r: output index for direction */ -uint16_t index_theta_phi_16( - float * p_theta, /* i/o: input elevation to be indexed */ - float * p_phi, /* i/o: input azimuth to be indexed */ - const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ -); - -void reset_metadata_spatial( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - const int32_t element_brate, /* i : element bitrate */ - int32_t *total_brate, /* o : total bitrate */ - const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata /* i : number of meatdata bits */ -); - -/*! r: number of bits written */ - -/*! r: number of bits read */ -int16_t ivas_qmetadata_dec_decode( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, /* i/o: bitstream position */ - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -); - -/*! r: number of bits read */ -int16_t ivas_qmetadata_dec_decode_hr_384_512( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, /* i/o: bitstream position */ - const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ - const int16_t bits_sph_idx, - const int16_t bits_sp_coh, - const uint8_t ncoding_bands_config -); - -/*! r: number of bits read */ -int16_t ivas_qmetadata_dec_sid_decode( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index, /* i/o: bitstream position */ - const int16_t nchan_transport, /* i : number of transport channels */ - int16_t *element_mode, /* o : element mode */ - const int16_t ivas_format /* i : IVAS format */ -); - - - - -void restore_metadata_buffer( - BSTR_ENC_HANDLE hMetaData, - const int16_t next_ind_start, - const int16_t bit_pos_start -); - -/*! r: codeword index */ -int16_t masa_sq( - const float in, /* i : input value */ - const float *threshold, /* i : partition */ - const int16_t cb_sz /* i : codebook size */ -); - -void ivas_qmetadata_azimuth_elevation_to_direction_vector( - const float az, /* i : azimuth */ - const float el, /* i : elevation */ - float *dv /* o : direction vector */ -); - -ivas_error only_reduce_bits_direction( - int16_t *reduce_bits_out, - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ - int16_t reduce_bits, - const int16_t coding_subbands, - const int16_t no_subframes, - int16_t *ind_order -); - -void quantize_direction_frame( - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ - float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ -); - -/*! r: quantized spherical index */ -uint16_t quantize_direction( - const float theta, /* i : input elevation value */ - float phi, /* i : input azimuth value */ - const int16_t no_bits, /* i : number of bits */ - float *theta_q, /* o : quantized elevation */ - float *phi_q, /* o : quantized azimuth */ - uint16_t *index_theta, /* o : quantized elevation index */ - uint16_t *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ -); - -int16_t quantize_direction2D( - float phi, /* i : input azimuth value */ - const int16_t no_cw, /* i : number of bits */ - float *phi_q, /* o : quantized azimuth value */ - uint16_t *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ -); - -void quantize_direction_frame2D( - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ - float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* i : input azimuth values */ - float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] /* i : input elevation values */ -); - -void small_requantize_direction_frame( - IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ - float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* i : input azimuth values */ - float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], /* i : input elevation values */ - const int16_t raw_flag[MASA_MAXIMUM_CODING_SUBBANDS], /* i : raw/EC encoding mode for each subband */ - int16_t bits_dir_bands[MASA_MAXIMUM_CODING_SUBBANDS], /* i/o: number of bits per subband */ - int16_t *diff /* i/o: number of bits to be reduced */ -); - -/*! r: index azimuth */ -int16_t quantize_phi( - float phi, /* i : azimuth value */ - const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - float *phi_hat, /* o : quantized azimuth */ - const int16_t n /* i : azimuth codebook size */ -); - -/*! r: decoded elevation value */ -float deindex_elevation( - uint16_t *id_th, /* i : input index */ - const int16_t no_bits, /* i : number of bits for the spherical grid */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ -); - -float deindex_azimuth( - int16_t id_phi, /* i : index */ - const int16_t no_bits, /* i : number of bits for the spherical grid */ - const int16_t id_th, /* i : elevation index */ - const int16_t remap, /* i : remapping flag */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ -); - -UWord16 ivas_qmetadata_reorder_generic_fx( - const Word16 signed_value -); - -void ivas_sba_config( - const int32_t sba_total_brate, /* i : SBA total bitrate */ - int16_t sba_order, /* i : Ambisonic (SBA) order */ - int16_t nb_channels, /* i : Number of Ambisonic (SBA) channels */ - int16_t *nchan_transport, /* o : number of transport channels */ - const int16_t sba_planar, /* i : SBA planar flag */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ - int16_t *element_mode /* o : element mode of the core coder */ -); - -void ivas_sba_set_cna_cng_flag( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_sba_dec_reconfigure( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - uint16_t *nSamplesFlushed, /* o : number of samples flushed */ - int16_t *data /* o : output synthesis signal */ -); - -ivas_error ivas_sba_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nCldfbSlots, /* i : number of CLDFB slots */ - const int16_t nSamplesForRendering, /* i : number of samples provided */ - float *data[] /* i : transport channel samples */ -); - - - -/*! r: Ambisonic (SBA) order */ -int16_t ivas_sba_get_order( - const int16_t nb_channels, /* i : Number of ambisonic channels */ - const int16_t sba_planar /* i : SBA planar flag */ -); - -/*! r: number of Ambisonic channels */ -int16_t ivas_sba_get_nchan( - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int16_t sba_planar /* i : SBA planar flag */ -); - -/*! r: number of ambisonics metadata channels */ - -void ivas_sba_getTCs( - float *sba_data[], /* i : SBA signals */ - Encoder_Struct *st_ivas, /* i/o: Encoder struct */ - const int16_t input_frame /* i : frame length */ -); - -int16_t ivas_sba_remapTCs( - float *sba_data[], /* i/o: SBA signals */ - Decoder_Struct *st_ivas, /* i/o: decoder struct */ - const int16_t output_frame /* i : frame length */ -); - -void ivas_sba_dirac_stereo_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[CPE_CHANNELS], /* o : output synthesis signal */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t mcmasa /* i : McMASA flag */ -); - -void ivas_sba_dirac_stereo_config( - STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */ -); - - -Word16 ivas_get_sba_dirac_stereo_flag( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -void ivas_sba_dirac_stereo_smooth_parameters( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ - const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ - const int32_t output_Fs, /* i : Fs for delay calculation */ - const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ -); - - -/*----------------------------------------------------------------------------------* - * DirAC prototypes - *----------------------------------------------------------------------------------*/ - - -ivas_error ivas_dirac_enc_reconfigure( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -); - - - -ivas_error ivas_dirac_config( - void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ - const int16_t enc_dec /* i : encoder or decoder flag */ -); - -void ivas_dirac_config_bands( - int16_t *band_grouping, /* o : band grouping */ - const int16_t nbands, /* i : number of bands */ - const int16_t max_band, /* i : maximal band index +1 */ - int16_t *dirac_to_spar_md_bands, /* o : mapping of DirAC parameter band index to SPAR FB band index */ - const int8_t useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ - const int16_t enc_param_start_band, /* i : band index of first DirAC parameter band */ - IVAS_FB_MIXER_HANDLE hFbMdft -); - -void ivas_get_dirac_sba_max_md_bits( - const int32_t sba_total_brate, - int16_t *bits_frame_nominal, - int16_t *metadata_max_bits, - int16_t *qmetadata_max_bit_req, - const int16_t nbands - , - IVAS_FORMAT ivas_format -); - -ivas_error ivas_dirac_sba_config( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - int16_t *element_mode, /* o : element mode of the core coder */ - int32_t sba_total_brate, /* i : SBA total bitrate */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int16_t nbands /* i : number of frequency bands */ - , - IVAS_FORMAT ivas_format -); - -ivas_error ivas_dirac_dec_config( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ -); - -void ivas_dirac_dec_close( - DIRAC_DEC_HANDLE *hDirAC_out -); - -void ivas_dirac_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder Core state structure */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial rendering data handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ - int16_t *nb_bits, /* o : number of bits read */ - const int16_t last_bit_pos, /* i : last read bitstream position */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ -); - -void generate_masking_noise_lb_dirac( - HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ - float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ - const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ - const int16_t cna_flag /* i : CNA flag for LB and HB */ -); - - -void ivas_dirac_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ -); - -void ivas_dirac_dec_render_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ - const int16_t nchan_transport, /* i : number of transport channels */ - float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] -); - - -void computeDirectionVectors( - float *intensity_real_x, - float *intensity_real_y, - float *intensity_real_z, - const int16_t enc_param_start_band, - const int16_t num_frequency_bands, - float *direction_vector_x, - float *direction_vector_y, - float *direction_vector_z -); - -void computeDiffuseness( - float *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], - const float *buffer_energy, - const int16_t num_freq_bands, - float *diffuseness -); - -void ivas_dirac_dec_get_response( - const int16_t azimuth, - const int16_t elevation, - float *response, - const int16_t ambisonics_order -); - - - -ivas_error ivas_mc_paramupmix_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -); - -void ivas_mc_paramupmix_enc_close_fx( - MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ - const int32_t input_Fs /* i : input sampling rate */ -); - -ivas_error ivas_mc_paramupmix_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -void ivas_mc_paramupmix_dec_close( - MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ -); - -void ivas_mc_paramupmix_dec_read_BS( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Decoder_State *st, /* i/o: decoder state structure */ - MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ - int16_t *nb_bits /* o : number of bits written */ -); - -void ivas_mc_paramupmix_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - const int16_t nSamplesForRendering /* i : number of samples provided */ -); - -void ivas_param_mc_set_coded_bands_fx( - HANDLE_IVAS_PARAM_MC_METADATA hMetadataPMC /* i/o: handle for the Parametric MC parameter coding state */ -); - -/*! r: number of IVAS transport channels */ - -ivas_error ivas_param_mc_enc_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -); - -ivas_error ivas_param_mc_enc_reconfig( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -); - -void ivas_param_mc_enc_close( - PARAM_MC_ENC_HANDLE *hParamMC, /* i/o: Parametric MC encoder handle */ - const int32_t input_Fs /* i : input sampling rate */ -); - -void ivas_param_mc_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ - float *data_f[], /* i/o: input/transport MC data */ - const int16_t input_frame /* i : input frame length */ -); - -ivas_error ivas_param_mc_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_param_mc_dec_reconfig( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - - - -void ivas_param_mc_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ - float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output*/ -); - -void ivas_param_mc_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ -); - -void ivas_param_mc_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -); - -/*! r: number of cldfb synthesis instances */ -int16_t param_mc_get_num_cldfb_syntheses( - Decoder_Struct *st_ivas /* i : IVAS decoder structure */ -); - -UWord16 ivas_param_mc_get_configuration_index_fx( - const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ - const Word32 ivas_total_brate /* i : IVAS total bitrate */ -); - -ivas_error ivas_dirac_dec_output_synthesis_cov_open( - DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ - DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: handle for the covariance synthesis state */ - const int16_t max_band_decorr, /* i : uppermost frequency band where decorrelation is applied */ - const int16_t interp_length, /* i : length for interpolating the mixing matrices in time slots */ - const int16_t num_param_bands, /* i : number of parameter bands */ - const int16_t num_param_bands_residual, /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ - const int16_t nchan_in, /* i : number of input (transport) channels */ - const int16_t nchan_out, /* i : number of output channels */ - const float *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ -); - -void ivas_dirac_dec_output_synthesis_get_interpolator( - DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ - const uint16_t interp_length /* i : interpolator length */ -); - -void ivas_dirac_dec_output_synthesis_cov_init( - DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ - const int16_t nchan_in, /* i : number of input (tranport) channels */ - const int16_t nchan_out, /* i : number of output channels */ - const int16_t n_param_bands, /* i : number of total parameter bands */ - const int16_t n_param_bands_res /* i : number of parameter bands with a residual mixing matrix (i.e. decorrelation */ -); - -void ivas_dirac_dec_output_synthesis_cov_close( - DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i : handle for the covariance synthesis parameters */ - DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state /* i/o: handle for the covariance synthesis state */ -); - - -void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( - float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ - float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ - float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ - float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ - float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ - float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ - const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const int16_t nX, /* i : number of input channels */ - const int16_t nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ -); - - -void FdCngEncodeDiracMDCTStereoSID( - CPE_ENC_HANDLE hCPE /* i/o: CPE encoder state structure */ -); - -void FdCngDecodeDiracMDCTStereoSID( - CPE_DEC_HANDLE hCPE /* i/o: CPE decoder state structure */ -); - - -/*----------------------------------------------------------------------------------* - * SPAR prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_spar_enc_open( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder handle */ - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -); - -ivas_error ivas_spar_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - float *data_f[], /* i/o: input/transport audio channels */ - const int16_t input_frame, /* i : input frame length */ - int16_t *nb_bits_metadata, /* i : number of MD bits written */ - BSTR_ENC_HANDLE hMetaData /* o : MetaData handle */ -); - -ivas_error ivas_spar_dec_open( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -); - - -ivas_error ivas_spar_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - int16_t *nb_bits_read /* o : number of MD bits read */ -); - -void ivas_spar_config( - int32_t ivas_total_brate, /* i : codec total bitrate */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - int16_t *nchan_transport, /* o : number of transport channels */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ - int32_t *core_nominal_brate, /* o : core-coding nominal bitrate */ - const int16_t sid_format /* i : IVAS format indicator from SID frame */ -); - -ivas_error ivas_sba_linear_renderer( - float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t nchan_in, /* i : number of input ambisonics channels */ - const int16_t nchan_ism, /* i : number of objects */ - const AUDIO_CONFIG output_config, /* i : output audio configuration */ - const IVAS_OUTPUT_SETUP output_setup /* i : output format setup */ -); - -void ivas_sba_mix_matrix_determiner( - SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ - float *output[], /* i/o: transport/output audio channels */ - const int16_t bfi, /* i : BFI flag */ - const int16_t nchan_remapped, /* i : num channels after remapping of TCs */ - const int16_t output_frame, /* i : output frame length */ - const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ -); - -/* AGC */ -/*! r: AGC enable flag */ - -ivas_error ivas_spar_agc_enc_open( - ivas_agc_enc_state_t **hAgcEnc, /* i/o: AGC decoder handle */ - const int32_t input_Fs, /* i : input sampling rate */ - const int16_t nchan_inp /* i : number of input channels */ -); - -void ivas_spar_agc_enc_close( - ivas_agc_enc_state_t **hAgcEnc /* i/o: AGC encoder handle */ -); - -void ivas_agc_enc_process( - ivas_agc_enc_state_t *hAgcEnc, /* i/o: AGC encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: MetaData handle */ - float **ppPcm_in, /* i : input audio channels */ - float **ppPcm_out, /* o : output audio channels */ - const int16_t n_channels, /* i : number of channels */ - const ENCODER_CONFIG_HANDLE hEncoderConfig /* i : configuration structure */ -); - -ivas_error ivas_spar_agc_dec_open( - ivas_agc_dec_state_t **hAgcDec, /* i/o: AGC decoder handle */ - const int32_t output_Fs /* i : output sampling rate */ -); - -void ivas_spar_agc_dec_close( - ivas_agc_dec_state_t **hAgcDec /* i/o: AGC decoder handle */ -); - - -void ivas_agc_dec_process( - ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ - float *pcm_in[], /* i : input audio channels */ - float *pcm_out[], /* o : output audio channels */ - const int16_t n_channels, /* i : number of channels */ - const int16_t output_Fs /* i : output sampling rate */ -); - -void ivas_agc_read_bits( - ivas_agc_dec_state_t *hAgcDec, /* i/o: AGC decoder handle */ - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ - const int16_t n_channels, /* i : number of channels */ - const int16_t AGC_flag /* i : AGC on/off flag */ -); - -void ivas_agc_initWindowFunc( - float *pWinFunc, - const int16_t length -); - -void ivas_agc_calcGainParams( - uint16_t *absEmin, - uint16_t *betaE, - uint16_t *maxAttExp, - const int16_t numCoeffs -); - -float ivas_get_mdct_scaling_gain( - const int16_t dct_len_by_2 -); - -void ivas_get_twid_factors( - const int16_t length, - const float **pTwid_re, - const float **pTwid_im -); - -int16_t ivas_get_bw_idx_from_sample_rate( - const int32_t sampling_rate /* i : sampling rate */ -); - -/*! r: config. table index */ -int16_t ivas_get_spar_table_idx( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t sba_order, /* i : IVAS SBA order */ - const int16_t bwidth, /* i : audio bandwidth */ - int16_t *bitlen, /* o : number of bits */ - int16_t *ind /* o : indice */ -); - -/*! r: number of transport channels */ -int16_t ivas_get_sba_num_TCs( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t sba_order /* i : IVAS SBA order */ -); - - -void ivas_spar_bitrate_dist( - int32_t core_brates_act[], /* o : bitrates per core-coder */ - const int16_t nAvailBits, /* i : number of available bits */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int16_t bwidth /* i : audio bandwidth */ -); - -void ivas_mdct( - const float *pIn, - float *pOut, - const int16_t length -); - -void ivas_dct_windowing( - const int16_t fade_len, - const int16_t full_len, - const int16_t dct_len, - const int16_t zero_pad_len, - const float *pWindow_coeffs, - const int16_t frame_len, - float *pOut_buf, - float *pBuffer_prev, - float *pTemp_lfe -); - -void ivas_tda( - const float *pIn, - float *pOut, - const int16_t length -); - -void ivas_imdct( - const float *pIn, - float *pOut, - const int16_t length -); - -void ivas_itda( - const float *re, - float *pOut, - const int16_t length -); - -void ivas_spar_get_cldfb_gains( - SPAR_DEC_HANDLE hSpar, - HANDLE_CLDFB_FILTER_BANK cldfbAnaDec0, - HANDLE_CLDFB_FILTER_BANK cldfbSynDec0, - const DECODER_CONFIG_HANDLE hDecoderConfig -); - -/*! r: 1 if prediction residual channel */ - -void ivas_spar_dec_agc_pca( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* i/o: input/output audio channels */ - const Word16 output_frame /* i : output frame length */ -); - -void ivas_spar_dec_set_render_map( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t nCldfbTs /* i : number of CLDFB time slots */ -); - -void ivas_spar_dec_set_render_params( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ -); - -void ivas_spar_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nCldfbSlots, /* i : number of CLDFB slots */ - const int16_t nSamplesForRendering /* i : number of samples provided */ -); - -void ivas_sba_dec_digest_tc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const int16_t nCldfbSlots, /* i : number of CLDFB slots */ - const int16_t nSamplesForRendering /* i : number of samples provided */ -); - -ivas_error ivas_sba_dec_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ -); - -void ivas_spar_dec_upmixer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* o : output audio channels */ - const int16_t nchan_internal /* i : number of internal channels */ -); - -void ivas_spar_dec_upmixer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float *output[], /* i/o: input/output audio channels */ - const int16_t nchan_internal, /* i : number of internal channels */ - const int16_t output_frame /* i : output frame length */ -); - -/* MD module */ - -void ivas_spar_md_enc_close( - ivas_spar_md_enc_state_t **hMdEnc /* i/o: SPAR MD encoder handle */ -); - -void ivas_compute_spar_params( - float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - const int16_t i_ts, - float ***mixer_mat, - const int16_t start_band, - const int16_t end_band, - const int16_t dtx_vad, - const int16_t num_ch, - const int16_t bands_bw, - const int16_t active_w, - const int16_t active_w_vlbr, - ivas_spar_md_com_cfg *hSparCfg, - ivas_spar_md_t *hSparMd, - float *pWscale, - const int16_t from_dirac, - const int16_t dyn_active_w_flag -); - -void ivas_create_fullr_dmx_mat( - float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], - float ***mixer_mat, - const int16_t in_chans, - const int16_t start_band, - const int16_t end_band, - const int16_t active_w, - ivas_spar_md_com_cfg *hMdCfg -); - -void ivas_calc_c_p_coeffs( - ivas_spar_md_t *pSparMd, - float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], - const int16_t i_ts, - float ***mixer_mat, - const int16_t num_ch, - const int16_t num_dmx, - const int16_t band_idx, - const int16_t dtx_vad, - const int16_t compute_p_flag, - const int16_t dyn_active_w_flag -); - -void ivas_get_spar_md_from_dirac( - float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float diffuseness[IVAS_MAX_NUM_BANDS], - const int16_t n_ts, - float ***mixer_mat, - ivas_spar_md_t *hSpar_md, - ivas_spar_md_com_cfg *hSpar_md_cfg, - const int16_t start_band, - const int16_t end_band, - const int16_t order, - const int16_t dtx_vad, - float Wscale_d[IVAS_MAX_NUM_BANDS], - const uint8_t useLowerRes, - const int16_t active_w_vlbr, - const int16_t dyn_active_w_flag -); - -/*! r: number of MD subframes */ - -ivas_error ivas_spar_md_dec_matrix_open( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_channels, /* i : number of internal channels */ - const int16_t num_md_sub_frames -); - -void ivas_spar_md_dec_matrix_close( - ivas_spar_md_dec_state_t *hMdDecoder, /* i/o: SPAR MD decoder handle */ - const int16_t num_channels /* i : number of internal channels */ -); - -ivas_error ivas_spar_md_dec_open( - ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ - const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t num_channels, /* i : number of internal channels */ - const int16_t sba_order, /* i : SBA order */ - const int16_t sid_format, /* i : SID format */ - const int32_t last_active_ivas_total_brate /* i : IVAS last active bitrate */ -); - -void ivas_spar_md_dec_close( - ivas_spar_md_dec_state_t **hMdDec /* i/o: SPAR MD decoder handle */ -); - -void ivas_spar_get_parameters( - SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ - const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t ts, /* i : time slot index */ - const int16_t num_ch_out, /* i : number of channels out */ - const int16_t num_ch_in, /* i : number of channels in */ - const int16_t num_spar_bands, /* i : number of SPAR bands */ - float par_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS] /* o : mixing matrix */ -); - -ivas_error ivas_spar_md_dec_init( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ - const int16_t num_channels, /* i : number of internal channels */ - const int16_t sba_order /* i : SBA order */ -); - -void ivas_spar_md_dec_process( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t sba_order /* i : SBA order */ -); - -void ivas_spar_to_dirac( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t dtx_vad, /* i : DTX frame flag */ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t bw, /* i : band joining factor */ - const int16_t dyn_active_w_flag /* i : dynamic active W flag */ -); - -void ivas_spar_update_md_hist( - ivas_spar_md_dec_state_t *hMdDec /* i/o: SPAR MD decoder handle */ -); - -int16_t ivas_spar_chk_zero_coefs( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ -); - -void ivas_spar_smooth_md_dtx( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t num_md_sub_frames /* i : number of metadata subframes */ -); - -void ivas_spar_setup_md_smoothing( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t num_md_sub_frames /* i : number of metadata subframes */ -); - -void ivas_spar_dec_gen_umx_mat( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t num_bands_out, /* i : number of output bands */ - const int16_t bfi, /* i : bad frame indicator */ - const int16_t num_md_sub_frames -); - - - - - -/* Transient detector module */ -ivas_error ivas_transient_det_open_fx( - ivas_trans_det_state_t **hTranDet, /* i/o: Transient detector handle */ - const Word32 sampling_rate /* i : sampling rate */ -); - -void ivas_transient_det_close_fx( - ivas_trans_det_state_t **hTranDet /* i/o: Transient detector handle */ -); - -void ivas_transient_det_process( - ivas_trans_det_state_t *hTranDet, /* i/o: SPAR TD handle */ - float *pIn_pcm, /* i : input audio channels */ - const int16_t frame_len, /* i : frame length in samples */ - int16_t transient_det[2] /* o : transient det outputs */ -); - -void ivas_td_decorr_get_ducking_gains( - ivas_trans_det_state_t *hTranDet, /* i/o: Transient detector handle */ - float *pIn_pcm, - float *pIn_duck_gains, - float *pOut_duck_gains, - const int16_t frame_len, - const int16_t tdet_flag -); - -#define IVAS_CMULT_FLOAT( in1_re, in1_im, in2_re, in2_im, out1_re, out1_im ) \ - out1_re = ( in1_re * in2_re ) - ( in1_im * in2_im ); \ - out1_im = ( in1_re * in2_im ) + ( in2_re * in1_im ); - -#define IVAS_CALCULATE_ABS( re, im, out ) \ - out = sqrtf( ( re * re ) + ( im * im ) ); - -#define IVAS_CALCULATE_RABS( re, out ) \ - out = sqrtf( re * re ); - -#define IVAS_CALCULATE_SQ_ABS( re, im, out ) \ - out = (float) ( ( re * re ) + ( im * im ) ); - -#define IVAS_RMULT_DOUBLE( in1_re, in2_re, out1_re ) \ - out1_re = ( in1_re * in2_re ); \ - -#define IVAS_CALCULATE_SQ_ABS_N( re, out ) \ - out = (float) ( re * re ); - -#define IVAS_RMULT_FLOAT( in1_re, in2_re, out1_re ) \ - out1_re = ( in1_re * in2_re ); - - -/* PCA */ -void ivas_pca_enc_init( - PCA_ENC_STATE *hPCA /* i/o: PCA encoder structure */ -); - -void ivas_pca_read_bits( - Decoder_State *st0, /* i/o: decoder state structure - for bitstream handling*/ - PCA_DEC_STATE *hPCA /* i/o: PCA encoder structure */ -); - -void ivas_pca_dec_init( - PCA_DEC_STATE *hPCA /* i/o: PCA decoder structure */ -); - -void ivas_pca_dec( - PCA_DEC_STATE *hPCA, /* i/o: PCA decoder structure */ - const int16_t n_samples, /* i : output frame length */ - const int16_t n_channels, /* i : number of channels */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int32_t last_ivas_total_brate, /* i : last IVAS total bitrate */ - const int16_t bfi, /* i : bad frame indicator */ - float *pcm_out[] /* o : output audio channels */ -); - -void pca_dec_s3( - const int32_t index, - float *q -); - - -void ivas_huffman_encode_fx( - ivas_huffman_cfg_t *huff_cfg, - Word16 in, - Word16 *hcode, - Word16 *hlen -); - - - -ivas_error ivas_huffman_decode( - ivas_huffman_cfg_t *huff_cfg, - Decoder_State *st0, - int16_t *dec_out -); - -void ivas_arith_decode_cmplx_cell_array( - ivas_arith_t *pArith_re, - ivas_arith_t *pArith_re_diff, - Decoder_State *st0, - ivas_cell_dim_t *pCell_dims, - int16_t *pDo_diff, const int16_t nB, - int16_t *pSymbol_re, - int16_t *pSymbol_re_old -); - - - - -void ivas_ari_done_encoding_14bits( - BSTR_ENC_HANDLE hBstr, Tastat *s -); - - -void ivas_wrap_arround( - int16_t *pArr, - const int16_t min_val, - const int16_t max_val, - const int16_t length -); - -void ivas_get_cum_freq_model( - const int16_t *pFreq_model, - const int16_t length, - int16_t *pCum_freq_model -); - -int16_t ivas_map_num_pred_r_to_idx( - const int16_t num_quant_points_pred_r, - const int16_t active_w_flag -); - -int16_t ivas_map_num_drct_r_to_idx( - const int16_t num_quant_points_drct_r -); - -int16_t ivas_map_num_decd_r_to_idx( - const int16_t num_quant_points_decd_r -); - -/* Quantization utilities */ -void ivas_quantise_real_values( - const float *values, - const int16_t q_levels, - const float min_value, - const float max_value, - int16_t *index, - float *quant, - const int16_t dim -); - - -void ivas_spar_quant_dtx_init( - ivas_spar_md_t *spar_md, - float *min_max -); - -void ivas_map_prior_coeffs_quant( - ivas_spar_md_prev_t *pSpar_md_prior, - ivas_spar_md_com_cfg *pSpar_md_cfg, - const int16_t qsi, - const int16_t nB -); - - -void ivas_clear_band_coeffs( - ivas_band_coeffs_t *pband_coeffs, - const uint16_t num_bands -); - -void ivas_clear_band_coeff_idx( - ivas_band_coeffs_ind_t *pband_coeff_idx, - const uint16_t num_bands -); - - -/*----------------------------------------------------------------------------------* - * MASA prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_masa_decode( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - Decoder_State *st, /* i/o: decoder state structure */ - int16_t *nb_bits_read /* o : number of bits read */ -); - -void generate_gridEq( - SPHERICAL_GRID_DATA *data /* o : data structure for grid */ -); - -ivas_error ivas_masa_enc_open_fx( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -); - -void ivas_masa_enc_close_fx( - MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ -); - -void ivas_masa_enc_reconfigure( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); - -ivas_error ivas_masa_dec_reconfigure( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - int16_t *data /* o : output synthesis signal */ -); - -ivas_error ivas_masa_encode( - MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - int16_t *nb_bits_metadata, /* o : number of metadata bits written */ - const int16_t nchan_transport, /* i : number of MASA input/transport channels */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t Opt_DTX_ON, /* i : DTX on flag */ - const int16_t element_mode, /* i : element mode */ - const ISM_MODE ism_mode, /* i : ISM format mode */ - const int16_t nchan_ism, /* i : number of ISM channels */ - ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata handle */ - const int16_t idx_separated_object, /* i : index of the separated object */ - OMASA_ENC_HANDLE hOMasa, /* i : OMASA encoder handle */ - const int16_t ism_imp, /* i : importance of separated object */ - const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ -); - -void ivas_masa_estimate_energy( - MASA_ENCODER_HANDLE hMasa, /* i/o: MASA encoder structure */ - float *data_f[], /* i : Input audio channels */ - const int16_t input_frame, /* i : frame length */ - const int16_t nchan_transport /* i : number of MASA input/transport channels */ -); - - -void ivas_masa_set_elements( - const int32_t ivas_total_brate, /* i : codec total bitrate */ - const int16_t mc_mode, /* i : MC format mode */ - const int16_t nchan_transport, /* i : number of MASA input/transport channels */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - int16_t *element_mode, /* o : element mode */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ - const int16_t ivas_format, /* i : IVAS format */ - const ISM_MODE ism_mode, /* i : ISM mode */ - const int32_t ism_total_brate /* i : initial ISM total bitrate */ -); - -/*! r: valid or not 1/0 */ -int16_t valid_ratio_index( - int16_t index, /* i : index to be checked */ - const int16_t K, /* i : L1 norm to check against */ - const int16_t len /* i : vector length */ -); - -void reconstruct_ism_ratios( - int16_t *ratio_ism_idx, - const int16_t nchan_ism, - const float step, - float *q_energy_ratio_ism -); - -void distribute_evenly_ism( - int16_t *idx, - const int16_t K, - const int16_t nchan_ism -); - - -int16_t ivas_qmetadata_encode_extended_gr_length_fx( - const uint16_t value, - const uint16_t alphabet_size, - const int16_t gr_param); - -void ivas_qmetadata_encode_extended_gr_fx( - BSTR_ENC_HANDLE hMetaData, /* i/o: q_metadata handle */ - const uint16_t value, /* i : value to be encoded */ - const uint16_t alphabet_size, /* i : alphabet size */ - const int16_t gr_param); /* i : GR order */ - -/*! r: CPE bitrate value */ -int32_t calculate_cpe_brate_MASA_ISM( - const ISM_MODE ism_mode, /* i : ism mode */ - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t nchan_ism /* i : number of objects */ -); - -void ivas_merge_masa_metadata( - MASA_ENCODER_HANDLE hMasa, /* i/o: MASA enc handle. source for MASA metadata and combined metadata will be here */ - OMASA_SPATIAL_META_HANDLE hOMasaMeta /* i : ISM-object metadata to be merged with the MASA metadata */ -); - - -/*!r : number of bits for ISM ratio index */ -int16_t bits_index_ism_ratio( - const int16_t nchan_ism /* i : number of objects */ -); - -void calculate_nbits_meta( - const int16_t nchan_ism, - float q_energy_ratio_ism[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], - float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], - const int16_t numSf, - const int16_t numCodingBands, - int16_t* bits_ism, - const int16_t idx_sep_obj, - const int16_t ism_imp -); - -/*! r: limitation flag */ -int16_t calculate_brate_limit_flag( - const int16_t ism_imp[], /* i : ISM importance flags */ - const int16_t nchan_ism /* i : number of objects */ -); - -void ivas_masa_set_coding_config( - MASA_CODEC_CONFIG* config, /* i/o: MASA coding config structure */ - int16_t* band_mapping, /* o : Band mapping used */ - const int32_t ivas_total_brate, /* i : codec total bitrate */ - const int16_t nchan_transport, /* i : number of transport channel (mono/stereo) */ - const uint8_t isMcMasa /* i : toggle for selecting McMASA specific config */ -); - -/*! r: Surround coherence significant flag */ -uint8_t ivas_masa_surrcoh_signicant( - float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Surround coherence */ - float diffuse_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : Diffuse to total ratio */ - const int16_t nSubFrames, /* i : Number of sub frames */ - const int16_t nBands /* i : Number of frequency bands */ -); - -void masa_compensate_two_dir_energy_ratio_index( - const int16_t ratio_index_1, /* i : Input ratio for direction 1 */ - const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ - int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ - int16_t *ratio_index_mod2, /* o : Output modified ratio for direction 2 */ - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ -); - -void ivas_set_qmetadata_maxbit_req_fx( - IVAS_QMETADATA_HANDLE hQMetaData, /* o : qmetadata structure where the requirement value is set */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ -); - -void masa_sample_rate_band_correction( - MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ - int16_t *band_mapping, /* i/o: Band mapping used and modified */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const uint8_t maxBand, /* i : max band */ - uint8_t is_encoder, /* i : signals if called at encoder */ - MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ -); - -void invdct4_transform( - float *v, /* i : input vector */ - uint8_t *invdct_v /* o : transformed vector */ -); - - -void ivas_spar_param_to_masa_param_mapping( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t subframe /* i : Subframe to map */ -); - -/*---------------------------------------------------------------------------------* - * Binaural FastConv Renderer Prototypes -*-----------------------------------------------------------------------------------*/ - - -void ivas_binaural_hrtf_close( - HRTFS_FASTCONV_HANDLE *hHrtfFastConv /* i/o: decoder binaural hrtf handle */ -); - -void ivas_binRenderer( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ - const int16_t numTimeSlots, /* i : number of time slots to process */ - float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ - float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ - float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ - float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] /* i : LS signals */ -); - -void ivas_binaural_add_LFE( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t output_frame, /* i : length of input frame */ - float *input_f[], /* i : transport channels */ - float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ -); - -/*----------------------------------------------------------------------------------* - * renderer prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_ism_renderer_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -void ivas_ism_renderer_close( - ISM_RENDERER_HANDLE *hIsmRendererData /* i/o: ISM renderer handle */ -); - -void ivas_ism_render_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[], /* i/o: core-coder transport channels/object output */ - const int16_t n_samples_to_render /* i : output frame length per channel */ -); - - -void ivas_mc2sba( - IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ - float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ - float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t sba_order, /* i : SBA order */ - const float gain_lfe /* i : gain for LFE, 0=ignore LFE */ -); - -void ivas_param_mc_mc2sba_cldfb( - IVAS_OUTPUT_SETUP hTransSetup, /* i : transported MC Format */ - float *hoa_encoder, /* i : HOA3 encoder for the transported MC format */ - const int16_t slot_idx, /* i : current slot in the subframe */ - float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: Contains the MC signals (on input) and the HOA3 (on output) */ - float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: Contains the MC signals (on input) and the HOA3 (on output) */ - const int16_t nBands, /* i : number of synth CLDFB bands */ - const float gain_lfe /* i : gain applied to LFE */ -); - - -/*----------------------------------------------------------------------------------* - * Amplitude Panning VBAP prototypes - *----------------------------------------------------------------------------------*/ - -void panning_wrap_angles( - const float azi_deg, /* i : azimuth in degrees for panning direction (positive left) */ - const float ele_deg, /* i : elevation in degrees for panning direction (positive up) */ - float *azi_wrapped, /* o : wrapped azimuth component */ - float *ele_wrapped /* o : wrapped elevation component */ -); - -/*----------------------------------------------------------------------------------* - * LS Renderer prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_ls_setup_conversion_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -void ivas_ls_setup_conversion_close( - LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */ -); - - -void ivas_ls_setup_conversion( - Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ - const int16_t input_chans, /* i : number of input channels to the renderer */ - const int16_t output_frame, /* i : frame length */ - float *input[], /* i : LS input/output synthesis signal */ - float *output[] /* i/o: LS input/output synthesis signal */ -); - -void ivas_ls_setup_conversion_process_mdct( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[] /* i/o: output synthesis signal */ -); - -void ivas_ls_setup_conversion_process_mdct_param_mc( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *x[][NB_DIV] /* i/o: output synthesis signal */ -); - -void ivas_lssetupconversion_process_param_mc( - Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ - const int16_t num_timeslots, /* i : number of time slots to process */ - float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ - float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ - int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ -); - - -/*----------------------------------------------------------------------------------* - * Custom loudspeaker setup prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_ls_custom_open( - LSSETUP_CUSTOM_HANDLE *hLsSetupCustom /* o : Custom loudspeaker setup handle */ -); - - - -/*----------------------------------------------------------------------------------* - * McMASA prototypes - *----------------------------------------------------------------------------------*/ - - -ivas_error ivas_mcmasa_dec_reconfig( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ -); - -void ivas_mcmasa_setNumTransportChannels( - int16_t* nchan_transport, /* o : Pointer to number of transport channels to be set */ - int16_t* element_mode, /* o : Pointer to element mode to be set */ - const int32_t ivas_total_brate /* i : Total bitrate of IVAS */ -); - -void ivas_mcmasa_set_separate_channel_mode( - uint8_t *separateChannelEnabled, /* o : Pointer to separate channel toggle */ - int16_t *separateChannelIndex, /* o : Pointer to separate channel index */ - const int32_t ivas_total_brate /* i : Total bitrate of IVAS */ -); - -void ivas_mcmasa_split_brate( - const uint8_t separateChannelEnabled, /* i : Transport running in "separate channel" mode */ - const int32_t ivas_total_brate, /* i : Total bitrate available to be split */ - const int16_t nSCE, /* i : Number of SCEs in use (0 or 1) */ - const int16_t nCPE, /* i : Number of CPEs in use (0 or 1) */ - int32_t *brate_sce, /* o : Pointer to SCE element bitrate */ - int32_t *brate_cpe /* o : Pointer to CPE element bitrate */ -); - - -void ivas_mcmasa_dmx_modify_fx( - const Word16 n_samples, /* i : input frame length in samples */ - Word32 dmx_fx[][L_FRAME48k + NS2SA(48000, IVAS_FB_ENC_DELAY_NS)], /* i/o: downmix signal to be transformed into another format Qx*/ - Word16 dmx_Q[], /* i/o : Q of the intput signal which is being transformed*/ - const Word16 n_chnls_dmx_old, /* i : number of downmix channels in the old format Q0 */ - const Word16 n_chnls_dmx_new /* i : number of downmix channels in the target format Q0*/ -); - -ivas_error ivas_mono_dmx_renderer_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - - -void ivas_mono_dmx_renderer_close( - MONO_DOWNMIX_RENDERER_HANDLE *hMonoDmxRenderer /* i/ i/o: Mono downmix structure */ -); - -void ivas_mono_downmix_render_passive( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[], /* i/o: synthesized core-coder transport channels/mono output */ - const int16_t output_frame /* i : output frame length */ -); - - -/*----------------------------------------------------------------------------------* - * LFE encoder low pass filter prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_create_lfe_lpf_enc( - ivas_filters_process_state_t **hLfeLpf, /* o : LFE LPF handle */ - const int32_t input_Fs /* i : input sampling rate */ -); - -void ivas_lfe_lpf_enc_close_fx( - ivas_filters_process_state_t **hLfeLpf /* i/o: LFE LPF handle */ -); - -void ivas_lfe_lpf_enc_apply( - ivas_filters_process_state_t *hLfeLpf, /* i/o: LFE LPF handle */ - float data_lfe_ch[], /* i/o: LFE signal */ - const int16_t input_frame /* i : input frame length per channel */ -); - - -/*----------------------------------------------------------------------------------* - * LFE Coding prototypes - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_create_lfe_enc_fx( - LFE_ENC_HANDLE *hLFE, /* o : IVAS LFE encoder structure */ - const int32_t input_Fs /* i : input sampling rate */ -); - -void ivas_lfe_enc_close_fx( - LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ -); - -void ivas_lfe_enc( - LFE_ENC_HANDLE hLFE, /* i/o: LFE encoder handle */ - float data_lfe_ch[], /* i : input LFE signal */ - const int16_t input_frame, /* i : input frame length per channel */ - BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ -); - -void ivas_lfe_tdplc( - LFE_DEC_HANDLE hLFE, /* i/o: LFE decoder handle */ - float *prevsynth, /* i : previous frame synthesis */ - float *ytda, /* o : output time-domain buffer */ - const int16_t output_frame /* i : output frame length */ -); -void ivas_lfe_window_init( - LFE_WINDOW_HANDLE hLFEWindow, /* i/o: LFE window handle */ - const int32_t sampling_rate, /* i : sampling rate */ - const int16_t frame_len /* i : frame length in samples */ -); - -void ivas_lfe_lpf_select_filt_coeff( - const int32_t sampling_rate, /* i : sampling rate */ - const int16_t order, /* i : filter order */ - const float **ppFilt_coeff /* o : filter coefficients */ -); - -void ivas_filters_init( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - const float *filt_coeff, /* i : filter coefficients */ - const int16_t order /* i : filter order */ -); - -void ivas_filters_init_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - const Word32 *filt_coeff_fx, /* i : filter coefficients Q31- *filt_coeff_e */ - const Word16 *filt_coeff_e, /* i : exponents of filter coefficients */ - const Word16 order ) ; - -void ivas_filter_process( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - float *pIn_Out, /* i : signal subject to filtering */ - const int16_t length /* i : filter order */ -); - -void ivas_filter_process_fx( - ivas_filters_process_state_t *filter_state, /* i/o: filter state handle */ - Word32 *pIn_Out_fx, /* i/o: signal subject to filtering Q(q_factor) */ - const Word16 length, /* i : filter order */ - Word16 q_factor ); - -/*----------------------------------------------------------------------------------* - * OSBA prototypes - *----------------------------------------------------------------------------------*/ -ivas_error ivas_osba_enc_reconfig( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -); -ivas_error ivas_osba_data_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ -); - -ivas_error ivas_osba_dirac_td_binaural_jbm( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ - uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ - uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ - float *output_f[] /* o : rendered time signal */ -); - - -void ivas_osba_data_close( - SBA_ISM_DATA_HANDLE *hSbaIsmData /* i/o: OSBA rendering handle */ -); - - -/*----------------------------------------------------------------------------------* -* OMASA prototypes -*---------------------------------------------------------------------------------*/ - -ivas_error ivas_omasa_enc_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ -); - -void ivas_omasa_enc_close( - OMASA_ENC_HANDLE *hOMasa /* i/o: encoder OMASA handle */ -); - - -ivas_error ivas_omasa_dec_config( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ - int16_t *data /* o : output synthesis signal */ -); - - - - -void ivas_set_surplus_brate_enc( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -#ifdef DEBUG_MODE_INFO - , - const int16_t *nb_bits_metadata /* i : number of metadata bits */ -#endif -); - -void ivas_set_surplus_brate_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int32_t *ism_total_brate /* i : ISM total bitrate */ -); - - -void ivas_set_ism_importance_interformat( - const int32_t ism_total_brate, /* i/o: ISms total bitrate */ - const int16_t nchan_transport, /* i : number of transported channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - const float lp_noise_CPE, /* i : LP filtered total noise estimation */ - int16_t ism_imp[] /* o : ISM importance flags */ -); - - -/*! r: adjusted bitrate */ -int32_t ivas_interformat_brate( - const ISM_MODE ism_mode, /* i : ISM mode */ - const int16_t nchan_ism, /* i : number of ISM channels */ - const int32_t element_brate, /* i : element bitrate */ - const int16_t ism_imp, /* i : ISM importance flag */ - const int16_t limit_flag /* i : flag to limit the bitrate increase */ -); - -void ivas_combined_format_brate_sanity( - const int32_t element_brate, /* i : element bitrate */ - const int16_t core, /* i : core */ - const int32_t total_brate, /* i : total bitrate */ - int32_t *core_brate, /* i/o: core bitrate */ - int16_t *inactive_coder_type_flag, /* o : inactive coder_type flag */ - int16_t *diff_nBits /* o : number of differential bits */ -); - -ISM_MODE ivas_omasa_ism_mode_select( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const int16_t nchan_ism /* i : number of input ISM's */ -); - -void ivas_set_omasa_TC( - const ISM_MODE ism_mode, /* i : ISM mode */ - const int16_t nchan_ism, /* i : number of input ISMs */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE /* o : number of CPEs */ -); - -void ivas_merge_masa_transports( - float data_in_f1[][L_FRAME48k], /* i : Transport audio signals 1 */ - float *data_in_f2[], /* i : Transport audio signals 2 */ - float *data_out_f[], /* o : Merged transport audio signals */ - const int16_t input_frame, /* i : Input frame size */ - const int16_t num_transport_channels /* i : Number of transport audio signals */ -); - - -ivas_error ivas_omasa_ism_metadata_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int32_t ism_total_brate, /* i : ISM total bitrate */ - int16_t *nchan_ism, /* o : number of ISM separated channels */ - int16_t *nchan_transport_ism, /* o : number of ISM TCs */ - const int16_t dirac_bs_md_write_idx, /* i : DirAC bitstream write index */ - int16_t nb_bits_metadata[] /* o : number of ISM metadata bits */ -); - -void ivas_omasa_preProcessStereoTransportsForMovedObjects( - Decoder_Struct *st_ivas, - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], - const int16_t nBins, - const int16_t subframe -); - -ivas_error ivas_omasa_separate_object_renderer_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -void ivas_omasa_separate_object_renderer_close( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -void ivas_omasa_separate_object_render_jbm( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const uint16_t nSamplesRendered, /* i : number of samples rendered */ - float input_f[][L_FRAME48k], /* i : separated object signal */ - float *output_f[], /* o : rendered time signal */ - const int16_t subframes_rendered, /* i : number of subframes rendered */ - const int16_t slots_rendered /* i : number of CLDFB slots rendered */ -); - -void ivas_omasa_encode_masa_to_total( - float masa_to_total_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], - BSTR_ENC_HANDLE hMetaData, - const int16_t low_bitrate_mode, - const int16_t nbands, - const int16_t nblocks -); - -void ivas_omasa_decode_masa_to_total( - uint16_t *bit_stream, - int16_t *index, - float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], - const int16_t nbands, - const int16_t nblocks -); - -void ivas_omasa_modify_masa_energy_ratios( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_MAXIMUM_CODING_SUBBANDS] -); - - -/*----------------------------------------------------------------------------------* - * TD Binaural Object renderer - *----------------------------------------------------------------------------------*/ - -#ifndef FIX_910_REMOVE_DUPLICATION_TD_REND -ivas_error ivas_td_binaural_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ -); -#endif -ivas_error ivas_td_binaural_renderer_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ -); - -/*----------------------------------------------------------------------------------* - * Filter-bank (FB) Mixer - *----------------------------------------------------------------------------------*/ - -ivas_error ivas_fb_set_cfg( - IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ - const int16_t ivas_format, /* i : IVAS format */ - const int16_t num_in_chans, /* i : number of FB input channels */ - const int16_t num_out_chans, /* i : number of FB output channels */ - const int16_t active_w_mixing, /* i : active_w_mixing flag */ - const int32_t sampling_Fs, /* i : sampling rate */ - const int16_t nachan_dirac_ana /* i : number of DirAR analysis channels */ -); - -void ivas_fb_mixer_pcm_ingest( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - float *pcm_in[], /* i : input audio channels */ - float **ppOut_pcm, /* o : output audio channels */ - const int16_t frame_length, /* i : frame length */ - const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] -); - -void ivas_fb_mixer_update_prior_input( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - float *pcm_in[], /* i : input audio channels */ - const int16_t length, /* i : length of time slot */ - const int16_t nchan_fb_in /* i : number of analysis channels */ -); - -void ivas_fb_mixer_get_windowed_fr( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - float *pcm_in[], /* i : input audio channels */ - float *frame_f_real[], /* o : real freq domain values */ - float *frame_f_imag[], /* o : imag freq domain values */ - const int16_t length, /* i : number of new samples in time slot */ - const int16_t mdft_len, /* i : MDFT frame length */ - const int16_t nchan_fb_in /* i : number of analysis channels */ -); - -/*! r: number of spectral bands */ - -/* clang-format on */ -- GitLab From 192977759c0c595e524a0384b0bbad1613ce34a6 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 28 May 2025 15:16:56 +0300 Subject: [PATCH 0774/1310] Port MR1418 from float to main-pc --- lib_com/options.h | 1 + lib_dec/ivas_masa_dec_fx.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 73a8f082f..84d277e27 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,6 +135,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ +#define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index eb010c146..e87683562 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -166,6 +166,16 @@ ivas_error ivas_masa_decode_fx( } move16(); +#ifdef NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS + test(); + test(); + IF( EQ_32( ivas_format, MASA_FORMAT ) && ( EQ_32( masa_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) ) + { + hMasa->config.numberOfDirections = 1; + move16(); + } +#endif + test(); test(); test(); -- GitLab From c4a3bacfd658f504ce06a655832e929fde2387e5 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 14:45:33 +0200 Subject: [PATCH 0775/1310] fixed definitions of type float --- lib_rend/ivas_reverb_fx.c | 8 +++++--- lib_rend/ivas_reverb_utils_fx.c | 26 ++++++++++++++------------ lib_util/hrtf_file_reader.c | 6 +++--- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index acfd656c5..1cbbf367b 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1284,10 +1284,12 @@ static void set_reverb_acoustic_data_fx( Word32 ln_1e6_inverted_fx, delay_diff_fx, L_tmp; Word16 exp_argument_fx, tmp, tmp_flag, exp_argument_e; Word16 pow_exp; +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES Word32 *pHrtf_set_l_re_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_l_im_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_r_re_fx[MAX_INTERN_CHANNELS]; Word32 *pHrtf_set_r_im_fx[MAX_INTERN_CHANNELS]; +#endif Word32 *pFc_input_fx = pRoomAcoustics->pFc_input_fx; Word32 *pAcoustic_rt60_fx = pRoomAcoustics->pAcoustic_rt60_fx; @@ -1298,9 +1300,8 @@ static void set_reverb_acoustic_data_fx( Word16 *pRt60_e = pParams->pRt60_e; Word32 *pDsr_fx = pParams->pDsr_fx; Word16 *pDsr_e = pParams->pDsr_e; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#else +#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* use crend hrtf filters */ IF( hHrtf != NULL ) { @@ -2519,7 +2520,7 @@ ivas_error ivas_binaural_reverb_init( return error; } -#endif +#else /*------------------------------------------------------------------------- * ivas_binaural_reverb_open_fastconv() @@ -2621,6 +2622,7 @@ ivas_error ivas_binaural_reverb_open_parambin( return error; } +#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_close() * diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 2cead56f1..e463b3498 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -65,7 +65,7 @@ typedef struct cldfb_convolver_state } cldfb_convolver_state; #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, const int32_t sampling_rate, float *avg_pwr_l_out, float *avg_pwr_r_out ); +static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, const int32_t sampling_rate, Word32 *avg_pwr_l_out, Word32 *avg_pwr_r_out ); #else static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ); #endif @@ -76,19 +76,24 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCO * Prepares reverb parameters for CLDFB-based reverberator *-----------------------------------------------------------------------------------------*/ -ivas_error ivas_reverb_prepare_cldfb_params( + #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +ivas_error ivas_reverb_prepare_cldfb_params( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_STATISTICS_HANDLE hHrtfStatistics, + const int32_t output_Fs, + float *pOutput_t60, + float *pOutput_ene ) #else +ivas_error ivas_reverb_prepare_cldfb_params( IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, -#endif const int32_t output_Fs, float *pOutput_t60, float *pOutput_ene ) +#endif { int16_t idx; float fc[CLDFB_NO_CHANNELS_MAX]; @@ -96,14 +101,14 @@ ivas_error ivas_reverb_prepare_cldfb_params( float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; float delay_diff, ln_1e6_inverted, exp_argument; const float dist = DEFAULT_SRC_DIST; - const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; + const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { - fc[idx] = ( (float) idx + 0.5f ) * ( (float) MAX_SAMPLING_RATE / (float) ( 2 * CLDFB_NO_CHANNELS_MAX ) ); + fc[idx] = ( idx + 0.5f ) * ( MAX_SAMPLING_RATE / ( 2 * CLDFB_NO_CHANNELS_MAX ) ); } Word32 *fc_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); Word32 *pOutput_t60_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); @@ -144,6 +149,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( pOutput_ene[idx] *= expf( exp_argument ); } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right ); #else if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) @@ -299,8 +305,8 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const int16_t use_brir, #endif const int32_t sampling_rate, - float *avg_pwr_left, - float *avg_pwr_right ) + Word32 *avg_pwr_left, + Word32 *avg_pwr_right ) { int16_t freq_idx; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES @@ -332,9 +338,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); - Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); for ( int i = 0; i < 60; i++ ) @@ -348,13 +352,11 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( } ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_l, avg_pwr_r, - CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); + CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left, avg_pwr_right, avg_pwr_left_e, avg_pwr_right_e ); free( input_fc_fx ); free( output_fc_fx ); - free( avg_pwr_left_fx ); free( avg_pwr_left_e ); - free( avg_pwr_right_fx ); free( avg_pwr_right_e ); #else diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 7a74e8e88..5832296c8 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -813,13 +813,13 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_l, Q27, lr_iac_len ); + floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_l_dyn, Q27, lr_iac_len ); fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_r, Q27, lr_iac_len ); + floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_r_dyn, Q27, lr_iac_len ); fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->inter_aural_coherence, Q23, lr_iac_len ); + floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->inter_aural_coherence_dyn, Q23, lr_iac_len ); hHrtfStatistics->fromROM = FALSE; free( hrtf_prop_local ); -- GitLab From 336ac2ab53ac9f5d0ea4ec0775db11b1586bf088 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 14:48:21 +0200 Subject: [PATCH 0776/1310] clang formatting patch --- lib_rend/ivas_reverb_utils_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index e463b3498..2c9180927 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -101,7 +101,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; float delay_diff, ln_1e6_inverted, exp_argument; const float dist = DEFAULT_SRC_DIST; - const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; + const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif -- GitLab From 44e0af3b81d3e8f57f0018fc7d77120148ce9583 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 28 May 2025 15:58:06 +0300 Subject: [PATCH 0777/1310] Port MR1418 to main-pc --- lib_com/ivas_cnst.h | 4 ++++ lib_com/options.h | 1 + lib_enc/ivas_masa_enc_fx.c | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 24d396d2a..4d94cdbe6 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1286,7 +1286,11 @@ enum #define MASA_RATIO_TOLERANCE 0.1f #define MASA_RATIO_THRESHOLD 0.1f #define MASA_ANGLE_TOLERANCE 0.5f +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS +#define MASA_RATIO_THRESHOLD_FX 322122547 // 0.15 in Q31 +#else #define MASA_RATIO_THRESHOLD_FX 214748365 // 0.1 in Q31 +#endif #define MASA_RATIO_TOLERANCE_FX 107374182 // 0.1 in Q30 #define MASA_ANGLE_TOLERANCE_FX ONE_IN_Q21 // 0.5 in Q22 #define MASA_LIMIT_NO_BANDS_SUR_COH 8 diff --git a/lib_com/options.h b/lib_com/options.h index 73a8f082f..fc5a6ab3c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -135,6 +135,7 @@ #define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ +#define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 9d0579d12..6d53d1d09 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -1857,6 +1857,9 @@ void ivas_masa_combine_directions_fx( hMeta->directional_meta[1].energy_ratio_fx[j][i] = 0; // Q30 move16(); move16(); +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + hMeta->common_meta.diffuse_to_total_ratio_fx[j][i] = L_sub( ONE_IN_Q30, hMeta->directional_meta[0].energy_ratio_fx[j][i] ); // Q30 +#endif IF( computeCoherence ) { @@ -2104,6 +2107,10 @@ static void detect_metadata_composition_fx( { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; + move16(); +#endif hMeta->directional_meta[0].azimuth_fx[sf][band] = hMeta->directional_meta[1].azimuth_fx[sf][band]; /*q22*/ hMeta->directional_meta[0].elevation_fx[sf][band] = hMeta->directional_meta[1].elevation_fx[sf][band]; /*q22*/ hMeta->directional_meta[0].energy_ratio_fx[sf][band] = hMeta->directional_meta[1].energy_ratio_fx[sf][band]; /*q30*/ @@ -2228,7 +2235,12 @@ static void compensate_energy_ratios_fx( UWord8 numDirs; hMeta = &( hMasa->masaMetadata ); +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + numDirs = hMasa->config.numberOfDirections; + move16(); +#else numDirs = (UWord8) add( hMeta->descriptive_meta.numberOfDirections, 1 ); +#endif FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { @@ -3137,10 +3149,20 @@ static void copy_masa_metadata_subframe_fx( ) { UWord8 dir; +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + UWord8 band; +#endif /* directional metadata */ FOR( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) { +#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS + FOR ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + hMetaTo->directional_meta[dir].spherical_index[sfTo][band] = hMetaFrom->directional_meta[dir].spherical_index[sfFrom][band]; + move16(); + } +#endif Copy32( hMetaFrom->directional_meta[dir].azimuth_fx[sfFrom], hMetaTo->directional_meta[dir].azimuth_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q22 Copy32( hMetaFrom->directional_meta[dir].elevation_fx[sfFrom], hMetaTo->directional_meta[dir].elevation_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q22 Copy32( hMetaFrom->directional_meta[dir].energy_ratio_fx[sfFrom], hMetaTo->directional_meta[dir].energy_ratio_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q30 -- GitLab From ec728f38f51222f987c7bfc695d48223a903be6e Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 15:02:50 +0200 Subject: [PATCH 0778/1310] fixed data type definition --- lib_rend/ivas_prot_rend_fx.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index fa74d0f0e..a7f52eb32 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -1152,8 +1152,8 @@ ivas_error ivas_reverb_prepare_cldfb_params( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_STATISTICS_HANDLE hHrtfStatistics, const int32_t output_Fs, - Word32 *pOutput_t60, - Word32 *pOutput_ene ); + float *pOutput_t60, + float *pOutput_ene ); #else ivas_error ivas_reverb_prepare_cldfb_params( IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, -- GitLab From 089fc29b1ad6da87905bc9594a8e2945d6add67c Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 28 May 2025 15:26:15 +0200 Subject: [PATCH 0779/1310] type reassignments --- lib_rend/ivas_reverb_utils_fx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 2c9180927..a385ef359 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -172,7 +172,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( * * Function for convolving CLDFB-domain data with filter taps *-----------------------------------------------------------------------------------------*/ -#endif + /*-----------------------------------------------------------------------------------------* * Function get_IR_from_filter_taps() @@ -279,6 +279,8 @@ static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( return IVAS_ERR_OK; } +#endif + #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_set_energies() -- GitLab From 06b479d714a02229678e6722742af738c9a63f67 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 29 May 2025 15:46:18 +0530 Subject: [PATCH 0780/1310] IGF caclulate envelop precision enhancement, bug fix: sharpflag in encod_unvoiced, minimum statistics improvements --- lib_com/fd_cng_com_fx.c | 104 ++++++++++++++++++++++++++++++---------- lib_com/prot_fx.h | 10 +++- lib_dec/fd_cng_dec_fx.c | 10 ++-- lib_dec/stat_dec.h | 6 ++- lib_enc/enc_uv_fx.c | 2 +- lib_enc/fd_cng_enc_fx.c | 10 ++-- lib_enc/igf_enc.c | 2 +- lib_enc/stat_enc.h | 6 ++- 8 files changed, 109 insertions(+), 41 deletions(-) diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index 207925724..7cc536822 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -483,6 +483,54 @@ void expand_range( move16(); } +void expand_range_fx( + Word32 *in, // Q25 + Word32 *out, // exp:out_exp + Word16 *out_exp, + const Word16 len ) +{ + Word16 i, tmp_e; + Word32 maxVal, tmp32; + Word16 maxOutExp; + + const Word32 low_lim = 726940; /* 0.0003385080526823181f in Q31 */ + move32(); + + /* Find max possible output exponent. */ + maxVal = 0; + move32(); + FOR( i = 0; i < len; i++ ) + { + maxVal = L_max( maxVal, in[i] ); + } + tmp32 = BASOP_util_Pow2( maxVal, Q31 - Q25, &tmp_e ); + maxOutExp = tmp_e; + move16(); + + /* out = (2^(in) - 1) */ + FOR( i = 0; i < len; i++ ) + { + tmp32 = BASOP_util_Pow2( in[i], Q31 - Q25, &tmp_e ); // 2^x + tmp32 = L_sub( tmp32, L_shl( 1, sub( 31, tmp_e ) ) ); // 2^x - 1 + tmp32 = L_shr( tmp32, sub( maxOutExp, tmp_e ) ); // make exp same as maxExpOut + + out[i] = tmp32; + move32(); + + Word32 tmp_low_lim = L_shr( low_lim, maxOutExp ); + if ( LT_32( out[i], tmp_low_lim ) ) + { + out[i] = tmp_low_lim; + move32(); + } + } + + *out_exp = maxOutExp; + move16(); + + return; +} + /*------------------------------------------------------------------- * expand_range_var_e() * @@ -1145,10 +1193,10 @@ void minimum_statistics( void minimum_statistics_fx( Word16 len, /* i : Total number of partitions (CLDFB or FFT) */ Word16 lenFFT, /* i : Number of FFT partitions */ - Word16 *psize, /* i : Partition sizes, fractional */ + Word16 *psize, /* i : Partition sizes, fractional Q9*/ Word16 *msPeriodog, /* i : Periodogram (energies) */ - Word16 *msNoiseFloor, /* i/o: Noise floors (energies) */ - Word16 *msNoiseEst, /* i/o: Noise estimates (energies) */ + Word32 *msNoiseFloor, /* i/o: Noise floors (energies) Q25*/ + Word32 *msNoiseEst, /* i/o: Noise estimates (energies) Q25*/ Word32 *msAlpha, /* i/o: Forgetting factors */ Word16 *msPsd, /* i/o: Power Spectral Density (smoothed periodogram => energies) */ Word16 *msPsdFirstMoment, /* i/o: PSD statistics of 1st order (energy means) */ @@ -1222,10 +1270,10 @@ void minimum_statistics_fx( /* No minimum statistics at initialization */ IF( LT_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) { - Copy( msPeriodog, msPsd, len ); /* 6Q9 */ - Copy( msPeriodog, msNoiseFloor, len ); /* 6Q9 */ - Copy( msPeriodog, msNoiseEst, len ); /* 6Q9 */ - Copy( msPeriodog, msPsdFirstMoment, len ); /* 6Q9 */ + Copy( msPeriodog, msPsd, len ); /* 6Q9 */ + Copy_Scale_sig_16_32_no_sat( msPeriodog, msNoiseFloor, len, Q16 ); /* Q25 */ + Copy_Scale_sig_16_32_no_sat( msPeriodog, msNoiseEst, len, Q16 ); /* Q25 */ + Copy( msPeriodog, msPsdFirstMoment, len ); /* 6Q9 */ set32_fx( msPsdSecondMoment, 0l /*0.0 Q31*/, len ); msPeriodogSum[0] = dotp_s_fx( msPeriodog, psize, lenFFT, CNG_HS ); @@ -1335,7 +1383,16 @@ void minimum_statistics_fx( /* Compute SNR */ /* msPeriodogSum[cnt] with format 16Q15 */ - snr = dotp_s_fx( msNoiseFloor + start, psize + start, current_len, CNG_HS ); + Word16 msNoiseFloor16tmp[NPART_SHAPING]; + IF( enc_dec == ENC ) + { + Copy_Scale_sig32_16( msNoiseFloor, msNoiseFloor16tmp, NPART, 0 ); + } + ELSE + { + Copy_Scale_sig32_16( msNoiseFloor, msNoiseFloor16tmp, NPART_SHAPING, 0 ); + } + snr = dotp_s_fx( &msNoiseFloor16tmp[start], psize + start, current_len, CNG_HS ); IF( GT_32( L_shr( Mpy_32_16_1( msPsdSum[cnt], 18431 /*0.56246299817 Q15*/ ), 13 ), snr ) ) { @@ -1366,16 +1423,16 @@ void minimum_statistics_fx( /* calculate scalar2 with normalized msNoiseFloor[j], exponent -2*s1 */ s1 = WORD16_BITS - 1; move16(); - if ( msNoiseFloor[j] != 0 ) + if ( msNoiseFloor16tmp[j] != 0 ) { - s1 = norm_s( msNoiseFloor[j] ); + s1 = norm_s( msNoiseFloor16tmp[j] ); } - msNoiseFloor16 = shl( msNoiseFloor[j], s1 ); + msNoiseFloor16 = shl( msNoiseFloor16tmp[j], s1 ); scalar2 = L_mult( msNoiseFloor16, msNoiseFloor16 ); /* calculate difference, both elements in 6Q9 format, use absolute value to avoid -1.0 x -1.0 multiplications later */ - scalar316 = abs_s( sub( msPsd[j], msNoiseFloor[j] ) ); + scalar316 = abs_s( sub( msPsd[j], msNoiseFloor16tmp[j] ) ); s2 = WORD16_BITS - 1; move16(); @@ -1475,7 +1532,7 @@ void minimum_statistics_fx( IF( msNoiseFloor[j] != 0 /*0.0 Q15*/ ) { - tmp = L_mult( msNoiseFloor[j], msNoiseFloor[j] ); + tmp = Mpy_32_32( msNoiseFloor[j], msNoiseFloor[j] ); tmp16 = BASOP_Util_Divide3232_uu_1616_Scale( msPsdSecondMoment[j], tmp, &s ); /* consider factor of 2 */ s = s_min( s_max( sub( s, 1 ), -( WORD16_BITS - 1 ) ), ( WORD16_BITS - 1 ) ); @@ -1586,7 +1643,7 @@ void minimum_statistics_fx( } } /* Get the current noise floor */ - Copy_Scale_sig_32_16( msCurrentMinOut, msNoiseFloor, len, -16 ); + Copy32( msCurrentMinOut, msNoiseFloor, len ); } ELSE /* sub window complete */ { @@ -1644,7 +1701,7 @@ void minimum_statistics_fx( set32_fx( msCurrentMin, 2147483647l /*1.0 Q31*/, len ); /* Get the current noise floor */ - Copy_Scale_sig_32_16( msCurrentMinOut, msNoiseFloor, len, -16 ); + Copy32( msCurrentMinOut, msNoiseFloor, len ); } } @@ -1701,18 +1758,19 @@ void minimum_statistics_fx( hFdCngCom->msFrCnt = add( hFdCngCom->msFrCnt, 1 ); move16(); } - + Word64 tmp64; /* Smooth noise estimate during CNG phases */ FOR( j = 0; j < len; j++ ) { - msNoiseEst[j] = round_fx( L_mac( L_mult( 31130 /*0.95 Q15*/, msNoiseEst[j] ), 1638 /*0.05 Q15*/, msNoiseFloor[j] ) ); - move16(); + tmp64 = W_add( W_mult_32_16( msNoiseEst[j], 31130 /*0.95 Q15*/ ), W_mult_32_16( msNoiseFloor[j], 1638 /*0.05 Q15*/ ) ); + msNoiseEst[j] = W_extract_h( W_shl( tmp64, 16 ) ); // Q25 + move32(); } } IF( EQ_16( enc_dec, DEC ) && EQ_16( element_mode, IVAS_CPE_TD ) ) { // v_multc(msNoiseEst, 1.4125f, msNoiseEst, NPART_SHAPING); - v_multc_att( msNoiseEst, 23142, msNoiseEst, NPART_SHAPING ); + v_multc_att32( msNoiseEst, 23142, msNoiseEst, NPART_SHAPING ); } /* Collect buffers */ Copy( msPeriodog, msPeriodogBuf + len * ( *msPeriodogBufPtr ), len ); @@ -1734,17 +1792,15 @@ void minimum_statistics_fx( { scalar = L_mac( scalar, msPeriodogBuf[i], 6554 /*1.0/MSBUFLEN Q15*/ ); } - scalar16 = round_fx( scalar ); - if ( GT_16( msNoiseEst[j], scalar16 ) /*0.0 Q15*/ ) + if ( GT_32( msNoiseEst[j], scalar ) /*0.0 Q15*/ ) { - msNoiseEst[j] = scalar16; - move16(); + msNoiseEst[j] = scalar; + move32(); } assert( msNoiseEst[j] >= 0 /*0.0 Q15*/ ); } } - /*------------------------------------------------------------------- * apply_scale() * diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 26999f048..b2df3a736 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -5163,6 +5163,12 @@ void expand_range( Word16 *out_exp, const Word16 len ); +void expand_range_fx( + Word32 *in, // Q25 + Word32 *out, // exp:out_exp + Word16 *out_exp, + const Word16 len ); + void expand_range_var_exp( Word16 *in, Word16 in_exp, @@ -5198,8 +5204,8 @@ void minimum_statistics_fx( Word16 lenFFT, /* i : Number of FFT partitions */ Word16 *psize, /* i : Partition sizes, fractional */ Word16 *msPeriodog, /* i : Periodogram (energies) */ - Word16 *msNoiseFloor, /* i/o: Noise floors (energies) */ - Word16 *msNoiseEst, /* i/o: Noise estimates (energies) */ + Word32 *msNoiseFloor, /* i/o: Noise floors (energies) Q25*/ + Word32 *msNoiseEst, /* i/o: Noise estimates (energies) Q25*/ Word32 *msAlpha, /* i/o: Forgetting factors */ Word16 *msPsd, /* i/o: Power Spectral Density (smoothed periodogram => energies) */ Word16 *msPsdFirstMoment, /* i/o: PSD statistics of 1st order (energy means) */ diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 99d202870..1d8185601 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -117,7 +117,7 @@ void initFdCngDec_ivas_fx( set16_fx( hFdCngDec->msPsd, 0, NPART_SHAPING ); set32_fx( hFdCngDec->msPsd_fx, 0, NPART_SHAPING ); - set16_fx( hFdCngDec->msNoiseFloor, 0, NPART_SHAPING ); + set32_fx( hFdCngDec->msNoiseFloor_32fx, 0, NPART_SHAPING ); set32_fx( hFdCngDec->msNoiseEst, 0, NPART_SHAPING ); set16_fx( &hFdCngDec->msNoiseEst_exp, 0, 1 ); @@ -142,7 +142,7 @@ void initFdCngDec_ivas_fx( move16(); set16_fx( hFdCngDec->msLogPeriodog, 0, NPART_SHAPING ); - set16_fx( hFdCngDec->msLogNoiseEst, 0, NPART_SHAPING ); + set32_fx( hFdCngDec->msLogNoiseEst_32fx, 0, NPART_SHAPING ); set16_fx( hFdCngDec->psize_shaping, 0, NPART_SHAPING ); hFdCngDec->nFFTpart_shaping = 0; @@ -2231,8 +2231,8 @@ void perform_noise_estimation_dec_ivas_fx( nFFTpart, psize_norm, hFdCngDec->msLogPeriodog, - hFdCngDec->msNoiseFloor, - hFdCngDec->msLogNoiseEst, + hFdCngDec->msNoiseFloor_32fx, + hFdCngDec->msLogNoiseEst_32fx, hFdCngDec->msAlpha, hFdCngDec->msPsd, hFdCngDec->msPsdFirstMoment, @@ -2259,7 +2259,7 @@ void perform_noise_estimation_dec_ivas_fx( move16(); /* Expand MS outputs */ - expand_range( hFdCngDec->msLogNoiseEst, hFdCngDec->msNoiseEst, &hFdCngDec->msNoiseEst_exp, npart ); + expand_range_fx( hFdCngDec->msLogNoiseEst_32fx, hFdCngDec->msNoiseEst, &hFdCngDec->msNoiseEst_exp, npart ); } } diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index fcd5142a4..4e4e33c36 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -94,11 +94,13 @@ typedef struct Word16 msPsdFirstMoment[NPART_SHAPING]; Word32 msPsdSecondMoment[NPART_SHAPING]; - Word16 msNoiseFloor[NPART_SHAPING]; /* Estimated noise floor */ - Word32 msNoiseEst[NPART_SHAPING]; /* Estimated noise level */ + Word16 msNoiseFloor[NPART_SHAPING]; /* Estimated noise floor */ + Word32 msNoiseFloor_32fx[NPART_SHAPING]; /* IVAS: Estimated noise floor Q25*/ + Word32 msNoiseEst[NPART_SHAPING]; /* Estimated noise level */ Word16 msNoiseEst_exp; Word16 msLogPeriodog[NPART_SHAPING]; Word16 msLogNoiseEst[NPART_SHAPING]; + Word32 msLogNoiseEst_32fx[NPART_SHAPING]; /*IVAS: Q25*/ Word16 npart_shaping; /* Number of partitions */ Word16 nFFTpart_shaping; /* Number of hybrid spectral partitions */ diff --git a/lib_enc/enc_uv_fx.c b/lib_enc/enc_uv_fx.c index a8612725b..887b4afb8 100644 --- a/lib_enc/enc_uv_fx.c +++ b/lib_enc/enc_uv_fx.c @@ -358,7 +358,7 @@ void encod_unvoiced_ivas_fx( // E_ACELP_innovative_codebook_fx( exc_fx, *pt_pitch_fx, 0, 1, gain_pit_fx, hLPDmem->tilt_code, acelp_cfg, i_subfr, p_Aq_fx, h1_fx, xn_fx, cn_fx, y1, y2_fx, (Word8) st_fx->acelp_autocorr, &prm, code_fx, shift, st_fx->L_frame, st_fx->last_L_frame, st_fx->total_brate, st_fx->element_mode ); inov_encode_ivas_fx( st_fx, st_fx->core_brate, 0, L_FRAME, st_fx->last_L_frame, - UNVOICED, st_fx->bwidth, st_fx->sharpFlag, i_subfr, -1, p_Aq_fx, + UNVOICED, st_fx->bwidth, 1, i_subfr, -1, p_Aq_fx, gain_pit_fx, cn_fx, exc_fx, h2_fx, hLPDmem->tilt_code, *pt_pitch_fx, xn_fx, code_fx, y2_fx, &unbits_PI, L_SUBFR, shift, Q_new ); E_ACELP_xy2_corr( xn_fx, y1, y2_fx, &g_corr, L_SUBFR, Q_xn ); diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c index a7339e653..fe5839565 100644 --- a/lib_enc/fd_cng_enc_fx.c +++ b/lib_enc/fd_cng_enc_fx.c @@ -130,8 +130,10 @@ void initFdCngEnc_fx( move16(); set16_fx( hsEnc->msLogPeriodog_fx, 0, NPART ); set16_fx( hsEnc->msLogNoiseEst_fx, 0, NPART ); + set32_fx( hsEnc->msLogNoiseEst_32fx, 0, NPART ); set16_fx( hsEnc->msPsd_fx, 0, NPART ); set16_fx( hsEnc->msNoiseFloor_fx, 0, NPART ); + set32_fx( hsEnc->msNoiseFloor_32fx, 0, NPART ); set32_fx( hsEnc->msMinBuf_fx, 2147483647l /*1.0 Q31*/, MSNUMSUBFR * NPART ); set32_fx( hsEnc->msCurrentMin_fx, 2147483647l /*1.0 Q31*/, NPART ); set32_fx( hsEnc->msCurrentMinOut_fx, 2147483647l /*1.0 Q31*/, NPART ); @@ -2240,12 +2242,12 @@ void perform_noise_estimation_enc_ivas_fx( Word16 nCLDFBpart = hFdCngEnc->hFdCngCom->nCLDFBpart; /* Q0 */ move16(); - Word16 *psize = hFdCngEnc->hFdCngCom->psize; // 6Q9 + Word16 *psize_norm = hFdCngEnc->hFdCngCom->psize_norm; // 6Q9 Word32 *msPeriodog_fx = hFdCngEnc->msPeriodog_fx; Word32 *msNoiseEst_fx = hFdCngEnc->msNoiseEst_fx; /* exp(msNoiseEst_fx_exp) */ Word16 *msLogPeriodog_fx = hFdCngEnc->msLogPeriodog_fx; - Word16 *msLogNoiseEst_fx = hFdCngEnc->msLogNoiseEst_fx; + Word32 *msLogNoiseEst_fx = hFdCngEnc->msLogNoiseEst_32fx; Word32 scaleEB_fx = 0; move32(); @@ -2387,12 +2389,12 @@ void perform_noise_estimation_enc_ivas_fx( /* Call the minimum statistics routine for noise estimation */ - minimum_statistics_fx( npart, nFFTpart, psize, msLogPeriodog_fx, hFdCngEnc->msNoiseFloor_fx, msLogNoiseEst_fx, hFdCngEnc->msAlpha_fx, hFdCngEnc->msPsd_fx, hFdCngEnc->msPsdFirstMoment_fx, + minimum_statistics_fx( npart, nFFTpart, psize_norm, msLogPeriodog_fx, hFdCngEnc->msNoiseFloor_32fx, msLogNoiseEst_fx, hFdCngEnc->msAlpha_fx, hFdCngEnc->msPsd_fx, hFdCngEnc->msPsdFirstMoment_fx, hFdCngEnc->msPsdSecondMoment_fx, hFdCngEnc->msMinBuf_fx, hFdCngEnc->msBminWin_fx, hFdCngEnc->msBminSubWin_fx, hFdCngEnc->msCurrentMin_fx, hFdCngEnc->msCurrentMinOut_fx, hFdCngEnc->msCurrentMinSubWindow_fx, hFdCngEnc->msLocalMinFlag, hFdCngEnc->msNewMinFlag, hFdCngEnc->msPeriodogBuf_fx, &( hFdCngEnc->msPeriodogBufPtr ), hFdCngEnc->hFdCngCom, ENC, ( hCPE == NULL ) ? 0 : hCPE->element_mode ); /* Expand MS outputs */ - expand_range( msLogNoiseEst_fx, msNoiseEst_fx, &hFdCngEnc->msNoiseEst_fx_exp, hFdCngEnc->hFdCngCom->npart ); + expand_range_fx( msLogNoiseEst_fx, msNoiseEst_fx, &hFdCngEnc->msNoiseEst_fx_exp, hFdCngEnc->hFdCngCom->npart ); return; } diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 18995bd1d..91e1b8520 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -521,7 +521,7 @@ static void IGF_CalculateEnvelope_ivas_fx( { IF( LT_32( 1, pPowerSpectrum_fx[sb] ) ) { - hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( e_ps[sb], Q25 ) ), Q25 ) ); + hPrivateData->logSpec[sb] = s_max( 0, extract_l( W_extract_l( W_shr( W_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), W_shl( e_ps[sb], Q25 ) ), Q25 ) ) ) ); move16(); } ELSE diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index b9c515eea..2fbec12bd 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -381,8 +381,9 @@ typedef struct fd_cng_enc_structure Word16 msNewMinFlag[NPART]; Word16 msPsdFirstMoment_fx[NPART]; Word32 msPsdSecondMoment_fx[NPART]; - Word16 msNoiseFloor_fx[NPART]; /* Estimated noise floor */ - Word32 msNoiseEst_fx[NPART]; /* Estimated noise level */ + Word16 msNoiseFloor_fx[NPART]; /* Estimated noise floor */ + Word32 msNoiseFloor_32fx[NPART]; /* Estimated noise floor IVAS: Q25*/ + Word32 msNoiseEst_fx[NPART]; /* Estimated noise level */ Word16 msNoiseEst_fx_exp; Word32 energy_ho_fx[NPART]; Word16 energy_ho_fx_exp; @@ -399,6 +400,7 @@ typedef struct fd_cng_enc_structure Word16 partDec[NPART]; Word16 msLogPeriodog_fx[NPART]; Word16 msLogNoiseEst_fx[NPART]; + Word32 msLogNoiseEst_32fx[NPART]; /*IVAS: Q25*/ Word32 mem_coherence_fx[4]; Word16 mem_coherence_exp[4]; -- GitLab From 41ab0d527dbb7945e032f20c3cca6170435bb11c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 29 May 2025 15:53:53 +0530 Subject: [PATCH 0781/1310] Fix for 3GPP issue 1720: Memory allocation in ivas_dirac_dec_output_synthesis_process_slot_fx() Link #1720 --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 51 +++++++++++-------- lib_rend/ivas_stat_rend.h | 2 + 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 622ebf89a..872d89c34 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -200,6 +200,12 @@ ivas_error ivas_dirac_dec_output_synthesis_open_fx( } dirac_output_synthesis_state->cy_cross_dir_smooth_prev_len = size; move16(); + + IF( ( dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( hSpatParamRendCom->num_freq_bands * hDirACRend->num_outputs_dir * sizeof( Word32 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); + } + IF( EQ_32( hDirACRend->synthesisConf, DIRAC_SYNTHESIS_GAIN_SHD ) ) { dirac_output_synthesis_state->cy_auto_dir_smooth_prev_fx = NULL; @@ -609,6 +615,11 @@ void ivas_dirac_dec_output_synthesis_close_fx( free( ( dirac_output_synthesis_state )->cy_cross_dir_smooth_prev_fx ); ( dirac_output_synthesis_state )->cy_cross_dir_smooth_prev_fx = NULL; } + IF( ( dirac_output_synthesis_state )->Q_temp_cy_cross_dir_smooth_fx != NULL ) + { + free( ( dirac_output_synthesis_state )->Q_temp_cy_cross_dir_smooth_fx ); + ( dirac_output_synthesis_state )->Q_temp_cy_cross_dir_smooth_fx = NULL; + } IF( ( dirac_output_synthesis_state )->cy_auto_diff_smooth_prev_fx != NULL ) { free( ( dirac_output_synthesis_state )->cy_auto_diff_smooth_prev_fx ); @@ -818,13 +829,10 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( num_freq_bands ); /*h_dirac_output_synthesis_state->diffuse_power_factor_q+Q31-Q31->h_dirac_output_synthesis_state->diffuse_power_factor_q*/ /*Direct gain*/ - - Word16 *Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) ); - tmp16 = imult1616( num_freq_bands, num_channels_dir ); FOR( Word16 kk = 0; kk < tmp16; kk++ ) { - Q_temp_cy_cross_dir_smooth_fx[kk] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[kk] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); } @@ -901,13 +909,13 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth-> (31-sqr_exp) */ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*( 31- sqr_exp )-> h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx*/ @@ -917,7 +925,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*31-sqr_exp*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } } @@ -969,13 +977,13 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ @@ -985,7 +993,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } } @@ -1051,13 +1059,13 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ @@ -1067,7 +1075,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } } @@ -1092,13 +1100,13 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q(31- sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q(31-sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ @@ -1108,7 +1116,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31-sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } } @@ -1125,13 +1133,13 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, Q( 31- sqr_exp )*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } ELSE { sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q( 31- sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; move16(); } h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ @@ -1141,7 +1149,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31-sqr_exp)*/ move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); + h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); move16(); } } @@ -1152,16 +1160,15 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( tmp16 = imult1616( num_freq_bands, num_channels_dir ); FOR( Word16 kk = 0; kk < tmp16; kk++ ) { - temp = s_min( Q_temp_cy_cross_dir_smooth_fx[kk], temp ); + temp = s_min( h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[kk], temp ); } h_dirac_output_synthesis_state->q_cy_cross_dir_smooth = temp; move16(); FOR( Word16 kk = 0; kk < tmp16; kk++ ) { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( temp, Q_temp_cy_cross_dir_smooth_fx[kk] ) ); /*Q_temp_cy_cross_dir_smooth_fx[kk]->temp*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk] = L_shl( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[kk], sub( temp, h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[kk] ) ); /*Q_temp_cy_cross_dir_smooth_fx[kk]->temp*/ move32(); } - free( Q_temp_cy_cross_dir_smooth_fx ); /*Directional gain (panning)*/ Word16 temp_q = sub( add( h_dirac_output_synthesis_state->direct_power_factor_q, h_dirac_output_synthesis_state->direct_responses_q ), 31 ); IF( LT_16( temp_q, h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index a13ee27e7..00fbc2549 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -352,6 +352,8 @@ typedef struct dirac_output_synthesis_state_structure Word16 q_cy_cross_dir_smooth; /* Target cross PSD of direct sound. Size: num_freq_bands*num_channels. */ Word16 q_cy_auto_diff_smooth; /* Target auto PSD of diffuse sound. Size: num_freq_bands*num_channels. */ + Word16 *Q_temp_cy_cross_dir_smooth_fx; + Word16 cy_auto_dir_smooth_len; /* Target auto PSD of direct sound. Size: num_freq_bands*num_channels. */ Word16 cy_cross_dir_smooth_len; /* Target cross PSD of direct sound. Size: num_freq_bands*num_channels. */ Word16 cy_auto_diff_smooth_len; /* Target auto PSD of diffuse sound. Size: num_freq_bands*num_channels. */ -- GitLab From f602e97871c026176fa68e63304c08a248a1de68 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 30 May 2025 15:42:13 +0530 Subject: [PATCH 0782/1310] Precision improvements for lp_noise, totalNoise; saturation resolution for non_staX --- lib_com/cnst.h | 1 + lib_com/ivas_prot_fx.h | 4 +-- lib_enc/bw_detect_fx.c | 13 +++++++- lib_enc/dtx_fx.c | 8 ++--- lib_enc/fd_cng_enc_fx.c | 12 +++++-- lib_enc/find_uv_fx.c | 6 ++-- lib_enc/init_enc_fx.c | 6 ++-- lib_enc/ivas_core_pre_proc_front_fx.c | 28 ++++++++-------- lib_enc/ivas_core_pre_proc_fx.c | 2 +- lib_enc/ivas_front_vad_fx.c | 11 +++---- lib_enc/ivas_ism_dtx_enc_fx.c | 2 +- lib_enc/ivas_ism_metadata_enc_fx.c | 2 +- lib_enc/ivas_masa_enc_fx.c | 4 +-- lib_enc/ivas_omasa_enc_fx.c | 2 +- lib_enc/ivas_stereo_classifier_fx.c | 2 +- lib_enc/ivas_stereo_td_analysis_fx.c | 2 +- lib_enc/ivas_tcx_core_enc_fx.c | 4 +-- lib_enc/long_enr_fx.c | 44 ++++++++++++------------- lib_enc/nois_est_fx.c | 47 ++++++++++++++++++--------- lib_enc/prot_fx_enc.h | 13 ++++++-- lib_enc/speech_music_classif_fx.c | 6 ++-- lib_enc/stat_enc.h | 13 +++++--- lib_enc/vad_fx.c | 4 +-- 23 files changed, 140 insertions(+), 96 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 7b204a8e2..a2d051d87 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -759,6 +759,7 @@ enum #define PIT_FIR_SIZE6_2 ( PIT_UP_SAMP6 * PIT_L_INTERPOL6_2 + 1 ) #define E_MIN 0.0035f /* minimum allowable energy */ #define E_MIN_Q11_FX 7 /* minimum allowable energy in Q11*/ +#define E_MIN_Q27_FX 469762 /* minimum allowable energy in Q27*/ #define STEP_DELTA 0.0625f /* quantization step for tilt compensation of gaussian cb. excitation */ #define GAMMA_EV 0.92f /* weighting factor for core synthesis error weighting */ #define FORMANT_SHARPENING_NOISE_THRESHOLD 21.0f /* lp_noise level above which formant sharpening is deactivated */ diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 928736427..d9ca855be 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2960,7 +2960,7 @@ Word16 ivas_acelp_tcx20_switching_fx( Word16 *inp_fx, /* i : new input signal */ Word16 q_inp, /* i : i/p Q */ Word16 *wsp, /* i : input weighted signal */ - Word16 non_staX, /* i : unbound non-stationarity for sp/mu clas */ + Word32 non_staX, /* i : unbound non-stationarity for sp/mu clas */ Word16 *pitch_fr, /* i : fraction pitch values */ Word16 *voicing_fr, /* i : fractional voicing values */ Word32 currFlatness, /* i : flatness */ @@ -3984,7 +3984,7 @@ Word16 ivas_smc_gmm_fx( const Word16 cor_map_sum_fx, /* i : correlation map sum (from multi-harmonic anal.) Q8 */ const Word32 epsP_fx[M + 1], /* i : LP prediciton error */ const Word32 PS_fx[], /* i : energy spectrum */ - const Word16 non_sta_fx, /* i : unbound non-stationarity Q8 */ + const Word32 non_sta_fx, /* i : unbound non-stationarity Q20 */ const Word16 relE_fx, /* i : relative frame energy Q8 */ Word16 *high_lpn_flag, /* i/o: sp/mus LPN flag */ const Word16 flag_spitch, /* i : flag to indicate very short stable pitch */ diff --git a/lib_enc/bw_detect_fx.c b/lib_enc/bw_detect_fx.c index 050adbf01..94ed49129 100644 --- a/lib_enc/bw_detect_fx.c +++ b/lib_enc/bw_detect_fx.c @@ -71,6 +71,7 @@ void bw_detect_fx( Flag Overflow = 0; move32(); #endif + Word16 lp_noise_fx; bwd_count_wider_bw = BWD_COUNT_WIDER_BW; move16(); @@ -532,7 +533,17 @@ void bw_detect_fx( /*if( localVAD || st->lp_noise > 30 )*/ test(); - IF( st->localVAD || GT_16( st->lp_noise_fx, 7680 /*30 in Q8*/ ) ) + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + lp_noise_fx = st->lp_noise_fx; + move16(); + } + ELSE + { + lp_noise_fx = extract_h( st->lp_noise_32fx ); + } + + IF( st->localVAD || GT_32( ( lp_noise_fx ), 7680 /*30 in Q8*/ ) ) { /*st->lt_mean_NB_fx = ALPHA_BWD * st->lt_mean_NB_fx + (1-ALPHA_BWD) * mean_NB;*/ L_tmp = L_mult( ALPHA_BWD_FX, st->lt_mean_NB_fx ); /* Q15 * Q11 -> Q27 */ diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index 6d8a29795..7966fc7d8 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -95,7 +95,7 @@ void dtx_ivas_fx( test(); test(); test(); - last_br_cng_flag = LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_EVS ) || LT_16( st_fx->lp_noise_fx, DTX_THR * 256 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_IVAS ) ); + last_br_cng_flag = LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_EVS ) || LT_32( ( st_fx->lp_noise_32fx ), DTX_THR * 16777216 ) || ( EQ_16( st_fx->element_mode, IVAS_SCE ) && LE_32( st_fx->last_total_brate_cng, MAX_BRATE_DTX_IVAS ) ); test(); test(); @@ -103,7 +103,7 @@ void dtx_ivas_fx( last_br_flag = ( st_fx->element_mode == EVS_MONO && LE_32( st_fx->last_total_brate, MAX_BRATE_DTX_EVS ) ) || ( st_fx->element_mode != EVS_MONO && LE_32( last_ivas_total_brate, MAX_BRATE_DTX_IVAS ) ) || - LT_16( st_fx->lp_noise_fx, DTX_THR * 256 ); + LT_32( ( st_fx->lp_noise_32fx ), DTX_THR * 16777216 ); } /* Initialization */ @@ -211,7 +211,7 @@ void dtx_ivas_fx( test(); br_dtx_flag = ( ( st_fx->element_mode == EVS_MONO ) && LE_32( st_fx->total_brate, MAX_BRATE_DTX_EVS ) ) || ( ( st_fx->element_mode != EVS_MONO ) && LE_32( ivas_total_brate, MAX_BRATE_DTX_IVAS ) ) || - LT_16( st_fx->lp_noise_fx, DTX_THR * 256 ); + LT_16( extract_h( st_fx->lp_noise_32fx ), DTX_THR * 256 ); } test(); test(); @@ -403,7 +403,7 @@ void dtx_ivas_fx( st_fx->cng_type = FD_CNG; move16(); } - ELSE IF( EQ_16( st_fx->cng_type, FD_CNG ) && ( LT_32( st_fx->bckr_tilt_lt, fd_thresh ) ) && ( GT_16( st_fx->lp_noise_fx, 512 /* 2 in Q8 */ ) ) ) + ELSE IF( EQ_16( st_fx->cng_type, FD_CNG ) && ( LT_32( st_fx->bckr_tilt_lt, fd_thresh ) ) && ( GT_32( st_fx->lp_noise_32fx, 67108864 /* 2 in Q24 */ ) ) ) { st_fx->cng_type = LP_CNG; move16(); diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c index fe5839565..9298c8634 100644 --- a/lib_enc/fd_cng_enc_fx.c +++ b/lib_enc/fd_cng_enc_fx.c @@ -447,8 +447,16 @@ void resetFdCngEnc_fx( /* st->totalNoise_fx; Q8 Noise estimator - total noise energy */ /* Detect fast increase of totalNoise */ - totalNoiseIncrease = sub( hNoiseEst->totalNoise_fx, st->last_totalNoise_fx ); // Q8 - st->last_totalNoise_fx = hNoiseEst->totalNoise_fx; // Q8 + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + totalNoiseIncrease = sub( hNoiseEst->totalNoise_fx, st->last_totalNoise_fx ); // Q8 + st->last_totalNoise_fx = hNoiseEst->totalNoise_fx; // Q8 + } + ELSE + { + totalNoiseIncrease = sub( extract_h( hNoiseEst->totalNoise_32fx ), st->last_totalNoise_fx ); // Q8 + st->last_totalNoise_fx = extract_h( hNoiseEst->totalNoise_32fx ); // Q8 + } move16(); IF( totalNoiseIncrease > 0 ) { diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index c4fe2e895..61de9ca7d 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -853,11 +853,11 @@ Word16 find_uv_ivas_fx( /* o : coding typ IF( st_fx->input_bwidth != NB ) { /*relE_thres = 0.700f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16) */ - L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 22938 /* 0.7 in Q15 */, st_fx->lp_noise_fx ); // Q24 + L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 22938 /* 0.7 in Q15 */, extract_h( st_fx->lp_noise_32fx ) ); // Q24 IF( Last_Resort == 0 ) { /*relE_thres = 0.650f * st->lp_noise - 33.5f; (lp_noise in Q8, constant Q8<<16)*/ - L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 21299 /* 0.650f in Q15 */, st_fx->lp_noise_fx ); // Q24 + L_tmp = L_mac( -562036736 /* 33.5f in Q24 */, 21299 /* 0.650f in Q15 */, extract_h( st_fx->lp_noise_32fx ) ); // Q24 } relE_thres = round_fx( L_tmp ); } @@ -865,7 +865,7 @@ Word16 find_uv_ivas_fx( /* o : coding typ { /*relE_thres = 0.60f * st->lp_noise - 28.2f; (lp_noise in Q8, constant Q8<<16)*/ - L_tmp = L_mac( -473117491 /* 28.2f in Q24 */, 19661 /* 0.6f in Q15 */, st_fx->lp_noise_fx ); // Q24 + L_tmp = L_mac( -473117491 /* 28.2f in Q24 */, 19661 /* 0.6f in Q15 */, extract_h( st_fx->lp_noise_32fx ) ); // Q24 relE_thres = round_fx( L_tmp ); } relE_thres = s_max( relE_thres, -6400 /* -25.0f in Q8 */ ); /* Q8 */ diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index 543a6fab9..ba1d47f79 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -1572,9 +1572,9 @@ ivas_error init_encoder_ivas_fx( * DTX *-----------------------------------------------------------------*/ - st->lp_speech_fx = 11520; /*Q8 (45.0) */ /* Initialize the long-term active speech level in dB */ - move16(); - st->lp_noise_fx = 0; + st->lp_speech_32fx = 754974720; /*Q24 (45.0) */ /* Initialize the long-term active speech level in dB */ + move32(); + st->lp_noise_32fx = 0; move16(); st->flag_noisy_speech_snr = 0; move16(); diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 3e7bf2464..fbd207e26 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -158,7 +158,7 @@ ivas_error pre_proc_front_ivas_fx( Word16 high_lpn_flag; Word16 lsf_new_fx[M]; // Q2.56 Word16 localVAD_HE_SAD; - Word16 non_staX_fx; + Word32 non_staX_fx; Word16 alw_pitch_lag_12k8[2]; Word16 alw_voicing_fx[2]; Word16 last_core_orig; @@ -191,7 +191,7 @@ ivas_error pre_proc_front_ivas_fx( Word16 ncharX_fx; Word16 ncharX_LR_fx; /* noise character for sp/mus classifier */ Word16 loc_harmLR_fx[CPE_CHANNELS]; /* harmonicity flag */ - Word16 non_staX_LR_fx; /* non-stationarity for sp/mus classifier */ + Word32 non_staX_LR_fx; /* non-stationarity for sp/mus classifier */ Word16 sp_div_fx; Word16 q_sp_div; Word16 sp_div_LR_fx; @@ -742,7 +742,7 @@ ivas_error pre_proc_front_ivas_fx( IF( hStereoClassif != NULL ) { - IF( GT_32( sub( st->lp_speech_fx, extract_h( Etot_fx ) ), 25 << Q8 ) ) /*Q8*/ + IF( GT_32( L_sub( st->lp_speech_32fx, Etot_fx ), 25 << Q24 ) ) /*Q8*/ { hStereoClassif->silence_flag = 2; move16(); @@ -806,7 +806,7 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( ( hCPE != NULL && !( lr_vad_enabled && st->idchan == 0 ) ) || hSCE != NULL ) { - *vad_flag_dtx = ivas_dtx_hangover_addition_fx( st, st->vad_flag, sub( st->lp_speech_fx, st->lp_noise_fx ), 0, vad_hover_flag, NULL, NULL, NULL ); /* Q0 */ + *vad_flag_dtx = ivas_dtx_hangover_addition_fx( st, st->vad_flag, extract_h( L_sub( st->lp_speech_32fx, st->lp_noise_32fx ) ), 0, vad_hover_flag, NULL, NULL, NULL ); /* Q0 */ move16(); } ELSE @@ -904,21 +904,21 @@ ivas_error pre_proc_front_ivas_fx( *----------------------------------------------------------------*/ noise_est_down_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, &st->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, - &st->hNoiseEst->totalNoise_fx, Etot_fx, &st->hNoiseEst->Etot_last_32fx, &st->hNoiseEst->Etot_v_h2_32fx ); + &st->hNoiseEst->totalNoise_32fx, Etot_fx, &st->hNoiseEst->Etot_last_32fx, &st->hNoiseEst->Etot_v_h2_32fx ); test(); IF( lr_vad_enabled && st->idchan == 0 ) { - noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[0] ), &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx ); - noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_LR_fx[1] ), &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_32fx, L_deposit_h( Etot_LR_fx[0] ), &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx ); + noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_32fx, L_deposit_h( Etot_LR_fx[1] ), &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_32fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx ); - corr_shiftL_fx = correlation_shift_fx( hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx ); // Q15 - corr_shiftR_fx = correlation_shift_fx( hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx ); // Q15 + corr_shiftL_fx = correlation_shift_fx( extract_h( hCPE->hFrontVad[0]->hNoiseEst->totalNoise_32fx ) ); // Q15 + corr_shiftR_fx = correlation_shift_fx( extract_h( hCPE->hFrontVad[1]->hNoiseEst->totalNoise_32fx ) ); // Q15 } - *relE_fx = sub( extract_h( Etot_fx ), st->lp_speech_fx ); // Q8 + *relE_fx = sub( extract_h( Etot_fx ), extract_h( st->lp_speech_32fx ) ); // Q8 move16(); - corr_shift_fx = correlation_shift_fx( st->hNoiseEst->totalNoise_fx ); /* Q15 */ + corr_shift_fx = correlation_shift_fx( extract_h( st->hNoiseEst->totalNoise_32fx ) ); /* Q15 */ /*----------------------------------------------------------------* * FD-CNG Noise Estimator @@ -1397,7 +1397,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); stereo_classifier_features_ivas_fx( hStereoClassif, st->idchan, element_mode, localVAD_HE_SAD, lsf_new_fx, epsP_fx, st->pitch, st->voicing_fx, *cor_map_sum_fx, non_staX_fx, sp_div_fx, - st->clas, sub( 31, *epsP_fx_q ), ( 31 - Q8 ) /* exp of cor_map_sum */, ( 31 - Q8 ) /* exp of non_staX_fx */, sub( 15, q_sp_div ) ); + st->clas, sub( 31, *epsP_fx_q ), ( 31 - Q8 ) /* exp of cor_map_sum */, ( 31 - Q20 ) /* exp of non_staX_fx */, sub( 15, q_sp_div ) ); } /*----------------------------------------------------------------* @@ -1443,7 +1443,7 @@ ivas_error pre_proc_front_ivas_fx( * Update of old per-band energy spectrum *----------------------------------------------------------------*/ - ivas_long_enr_fx( st, extract_h( Etot_fx ), localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); + ivas_long_enr_fx( st, Etot_fx, localVAD_HE_SAD, high_lpn_flag, NULL, 1, NULL, NULL ); Copy32( fr_bands_fx + NB_BANDS, st->hNoiseEst->enrO_fx, NB_BANDS ); /* fr_bands_fx_q */ st->hNoiseEst->q_enrO = fr_bands_fx_q; @@ -1452,7 +1452,7 @@ ivas_error pre_proc_front_ivas_fx( test(); IF( lr_vad_enabled && st->idchan == 0 ) { - ivas_long_enr_fx( st, -256 /*-1 q8*/, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR_fx ); + ivas_long_enr_fx( st, -16777216 /*-1 << 24*/, localVAD_HE_SAD, high_lpn_flag, hCPE->hFrontVad, CPE_CHANNELS, localVAD_HE_SAD_LR, Etot_LR_fx ); Copy32( fr_bands_LR_fx[0] + NB_BANDS, hCPE->hFrontVad[0]->hNoiseEst->enrO_fx, NB_BANDS ); // fr_bands_LR_fx_q hCPE->hFrontVad[0]->hNoiseEst->q_enrO = fr_bands_LR_fx_q[0]; diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 938ab9964..623b38e68 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -462,7 +462,7 @@ ivas_error pre_proc_ivas_fx( IF( EQ_16( st->coder_type, GENERIC ) || EQ_16( st->coder_type, VOICED ) || EQ_16( st->coder_type, TRANSITION ) ) { test(); - IF( GE_32( element_brate, FRMT_SHP_MIN_BRATE_IVAS ) && GT_16( st->lp_noise_fx, FORMANT_SHARPENING_NOISE_THRESHOLD_FX ) ) + IF( GE_32( element_brate, FRMT_SHP_MIN_BRATE_IVAS ) && GT_32( st->lp_noise_32fx, FORMANT_SHARPENING_NOISE_THRESHOLD_FX << 16 ) ) { st->sharpFlag = 0; move16(); diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index a6054a841..963e363b2 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -492,7 +492,7 @@ ivas_error front_vad_spar_fx( Word16 sp_div_fx; Word16 Q_sp_div; - Word16 non_staX_fx; + Word32 non_staX_fx; Word16 sp_floor; Word16 cor_map_sum_fx; @@ -603,9 +603,9 @@ ivas_error front_vad_spar_fx( Word16 q_tmpN, q_tmpE; noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, &hFrontVad->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band, - &hFrontVad->hNoiseEst->totalNoise_fx, L_deposit_h( Etot_fx[0] ) /*q8->q24*/, &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_32fx ); + &hFrontVad->hNoiseEst->totalNoise_32fx, L_deposit_h( Etot_fx[0] ) /*q8->q24*/, &hFrontVad->hNoiseEst->Etot_last_32fx, &hFrontVad->hNoiseEst->Etot_v_h2_32fx ); - corr_shift_fx = correlation_shift_fx( hFrontVad->hNoiseEst->totalNoise_fx ); /* Q15 */ + corr_shift_fx = correlation_shift_fx( extract_h( hFrontVad->hNoiseEst->totalNoise_32fx ) ); /* Q15 */ dtx_ivas_fx( st, hEncoderConfig->last_ivas_total_brate, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8_fx, Q_inp_12k8 ); @@ -637,7 +637,7 @@ ivas_error front_vad_spar_fx( move32(); } - relE_fx = sub( Etot_fx[0], st->lp_speech_fx ); + relE_fx = sub( Etot_fx[0], extract_h( st->lp_speech_32fx ) ); Scale_sig( A_fx, ( L_FRAME / L_SUBFR ) * ( M + 1 ), -2 ); // Q12 st->mem_wsp_fx = (Word16) shl_sat( st->mem_wsp_fx, Q_inp_12k8 - st->mem_wsp_q ); /* Q_inp_12k8 */ @@ -749,13 +749,12 @@ ivas_error front_vad_spar_fx( /* 1st stage speech/music classification (GMM model) */ /* run only to get 'high_lpn_flag' parameter */ SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; - Word16 non_sta_fx = shr( non_staX_fx, Q2 ); // Q8->Q6 Word16 Etot_fx_0 = Etot_fx[0]; move16(); scale = getScaleFactor32( PS_fx, 128 ); Qfact_PS = add( Qfact_PS, scale ); Scale_sig32( PS_fx, 128, scale ); - ivas_smc_gmm_fx( st, NULL, localVAD_HE_SAD[0], Etot_fx_0, lsp_new_fx, cor_map_sum_fx, epsP_fx, PS_fx, non_sta_fx, relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, Q_esp, hSpMusClas->past_PS_Q ); + ivas_smc_gmm_fx( st, NULL, localVAD_HE_SAD[0], Etot_fx_0, lsp_new_fx, cor_map_sum_fx, epsP_fx, PS_fx, non_staX_fx, relE_fx, &high_lpn_flag, flag_spitch, Qfact_PS, Q_esp, hSpMusClas->past_PS_Q ); /* long-term energy update */ ivas_long_enr_fx( st, -256 /*-1 q8*/, localVAD_HE_SAD[0], high_lpn_flag, &hFrontVad, 1, localVAD_HE_SAD, Etot_fx ); diff --git a/lib_enc/ivas_ism_dtx_enc_fx.c b/lib_enc/ivas_ism_dtx_enc_fx.c index b06acfbac..bc2c83de1 100644 --- a/lib_enc/ivas_ism_dtx_enc_fx.c +++ b/lib_enc/ivas_ism_dtx_enc_fx.c @@ -143,7 +143,7 @@ Word16 ivas_ism_dtx_enc_fx( /* one of the channels is active -> no DTX */ FOR( ch = 0; ch < nchan_transport; ch++ ) { - lp_noise_fx[ch] = hSCE[ch]->hCoreCoder[0]->lp_noise_fx; /*Q8*/ + lp_noise_fx[ch] = extract_h( hSCE[ch]->hCoreCoder[0]->lp_noise_32fx ); /*Q8*/ move16(); } diff --git a/lib_enc/ivas_ism_metadata_enc_fx.c b/lib_enc/ivas_ism_metadata_enc_fx.c index 1efbb2123..594871b29 100644 --- a/lib_enc/ivas_ism_metadata_enc_fx.c +++ b/lib_enc/ivas_ism_metadata_enc_fx.c @@ -277,7 +277,7 @@ ivas_error ivas_ism_metadata_enc_fx( /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ test(); test(); - hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || GT_16( hSCE[ch]->hCoreCoder[0]->lp_noise_fx, 2560 /*10 Q8*/ ) || hSCE[ch]->hCoreCoder[0]->tcxonly; + hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || GT_32( hSCE[ch]->hCoreCoder[0]->lp_noise_32fx, 167772160 /*10 Q24*/ ) || hSCE[ch]->hCoreCoder[0]->tcxonly; move16(); } diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 9d0579d12..303d11698 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -1195,12 +1195,12 @@ ivas_error ivas_masa_enc_config_fx( test(); IF( EQ_16( st_ivas->hCPE[0]->element_mode, IVAS_CPE_DFT ) || LT_16( st_ivas->hMasa->data.hOmasaData->omasa_stereo_sw_cnt, OMASA_STEREO_SW_CNT_MAX ) ) { - st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_fx; /*Q8*/ + st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = extract_h( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_32fx ); /*Q8*/ } ELSE { /* ( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise + st_ivas->hCPE[0]->hCoreCoder[1]->lp_noise ) / CPE_CHANNELS; */ - st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = extract_h( L_mac( L_mult( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_fx, ONE_IN_Q14 ), st_ivas->hCPE[0]->hCoreCoder[1]->lp_noise_fx, ONE_IN_Q14 ) ); /*Q8*/ + st_ivas->hMasa->data.hOmasaData->lp_noise_CPE_fx = extract_h( L_mac( L_mult( extract_h( st_ivas->hCPE[0]->hCoreCoder[0]->lp_noise_32fx ), ONE_IN_Q14 ), extract_h( st_ivas->hCPE[0]->hCoreCoder[1]->lp_noise_32fx ), ONE_IN_Q14 ) ); /*Q8*/ } move16(); } diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index b5b592582..b88bb69a1 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -795,7 +795,7 @@ void ivas_set_ism_importance_interformat_fx( IF( active_flag == 0 ) { test(); - if ( GT_16( st->lp_noise_fx, 3840 /* 15 in Q8 */ ) || LT_16( sub( lp_noise_CPE_fx, st->lp_noise_fx ), 7680 /* 30 in Q8 */ ) ) + if ( GT_32( st->lp_noise_32fx, 251658240 /* 15 in Q24 */ ) || LT_16( sub( lp_noise_CPE_fx, extract_h( st->lp_noise_32fx ) ), 7680 /* 30 in Q8 */ ) ) { active_flag = 1; move16(); diff --git a/lib_enc/ivas_stereo_classifier_fx.c b/lib_enc/ivas_stereo_classifier_fx.c index 3a040517a..2c1bc0317 100644 --- a/lib_enc/ivas_stereo_classifier_fx.c +++ b/lib_enc/ivas_stereo_classifier_fx.c @@ -1507,7 +1507,7 @@ void xtalk_classifier_dft_fx( hStereoClassif->xtalk_decision = 1; move16(); } - ELSE IF( GE_32( hCPE->element_brate, IVAS_16k4 ) && hStereoClassif->xtalk_decision == 0 && GT_16( abs_s( itd ), STEREO_DFT_ITD_MAX ) && GT_16( sub( hCPE->hCoreCoder[0]->lp_speech_fx, hCPE->hCoreCoder[0]->lp_noise_fx ), 25 << 8 ) ) + ELSE IF( GE_32( hCPE->element_brate, IVAS_16k4 ) && hStereoClassif->xtalk_decision == 0 && GT_16( abs_s( itd ), STEREO_DFT_ITD_MAX ) && GT_32( L_sub( hCPE->hCoreCoder[0]->lp_speech_32fx, hCPE->hCoreCoder[0]->lp_noise_32fx ), 25 << 24 ) ) { hStereoClassif->xtalk_decision = 1; move16(); diff --git a/lib_enc/ivas_stereo_td_analysis_fx.c b/lib_enc/ivas_stereo_td_analysis_fx.c index 909d0c206..de47ea8e2 100644 --- a/lib_enc/ivas_stereo_td_analysis_fx.c +++ b/lib_enc/ivas_stereo_td_analysis_fx.c @@ -564,7 +564,7 @@ Word16 stereo_tdm_ener_analysis_fx( } } - IF( LT_16( sub( sts[1]->lp_speech_fx, sts[1]->lp_noise_fx ), 12800 /*50.0f in Q8*/ ) ) /* likely presence of noisy content */ + IF( LT_32( L_sub( sts[1]->lp_speech_32fx, sts[1]->lp_noise_32fx ), 838860800 /*50.0f in Q24*/ ) ) /* likely presence of noisy content */ { /* pointing in the right direction, inverse it else do nothing */ test(); diff --git a/lib_enc/ivas_tcx_core_enc_fx.c b/lib_enc/ivas_tcx_core_enc_fx.c index 5f2e9a8e0..da141f473 100644 --- a/lib_enc/ivas_tcx_core_enc_fx.c +++ b/lib_enc/ivas_tcx_core_enc_fx.c @@ -715,7 +715,7 @@ Word16 ivas_acelp_tcx20_switching_fx( Word16 *inp_fx, Word16 q_inp, Word16 *wsp, /*q_inp i : input weighted signal */ - Word16 non_staX, /*Q8 i : unbound non-stationarity for sp/mu clas*/ + Word32 non_staX, /*Q20 i : unbound non-stationarity for sp/mu clas*/ Word16 *pitch_fr, /*Q6 i : fraction pitch values */ Word16 *voicing_fr, /*Q15 i : fractional voicing values */ Word32 currFlatness, /*Q21 i : flatness */ @@ -1276,7 +1276,7 @@ Word16 ivas_acelp_tcx20_switching_fx( test(); test(); test(); - if ( ( !flag_16k_smc ) && ( LT_32( offset_tcx, 0x18950F ) ) && GT_16( non_staX, 1280 /*5.0f Q8*/ ) && ( GE_32( snr_acelp, L_sub( tcx_snr, 262144 /*4.0f in Q16*/ ) ) ) && GE_16( st->Nb_ACELP_frames, 1 ) && ( ( GT_16( st->hSpMusClas->lps_fx, st->hSpMusClas->lpm_fx ) && GE_32( mean_voicing_fr, /* 0.3 in Q30 */ 322122547 ) ) || ( GE_16( st->Nb_ACELP_frames, 6 ) && GT_16( st->hSpMusClas->lps_fx, sub( st->hSpMusClas->lpm_fx, 192 /*1.5in Q7*/ ) ) ) ) && ( st->sp_aud_decision0 == 0 ) && st->vad_flag ) + if ( ( !flag_16k_smc ) && ( LT_32( offset_tcx, 0x18950F ) ) && GT_32( non_staX, 5242880 /*5.0f Q20*/ ) && ( GE_32( snr_acelp, L_sub( tcx_snr, 262144 /*4.0f in Q16*/ ) ) ) && GE_16( st->Nb_ACELP_frames, 1 ) && ( ( GT_16( st->hSpMusClas->lps_fx, st->hSpMusClas->lpm_fx ) && GE_32( mean_voicing_fr, /* 0.3 in Q30 */ 322122547 ) ) || ( GE_16( st->Nb_ACELP_frames, 6 ) && GT_16( st->hSpMusClas->lps_fx, sub( st->hSpMusClas->lpm_fx, 192 /*1.5in Q7*/ ) ) ) ) && ( st->sp_aud_decision0 == 0 ) && st->vad_flag ) { /* Fine tuned across various databases based on various metrics to detect TCX frames in speech.*/ dsnr = 262144; /*4.0f Q16*/ diff --git a/lib_enc/long_enr_fx.c b/lib_enc/long_enr_fx.c index 60c40b3fe..93918b81e 100644 --- a/lib_enc/long_enr_fx.c +++ b/lib_enc/long_enr_fx.c @@ -17,7 +17,7 @@ *-------------------------------------------------------------------*/ void ivas_long_enr_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q8 */ + const Word32 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q24 */ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover Q0*/ Word16 high_lpn_flag, /* i : sp/mus LPN flag Q0*/ FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ @@ -28,7 +28,7 @@ void ivas_long_enr_fx( ) { Word16 tmp; - Word16 alpha; + Word32 alpha; NOISE_EST_HANDLE hNoiseEst = st_fx->hNoiseEst; /*-----------------------------------------------------------------* @@ -42,7 +42,7 @@ void ivas_long_enr_fx( { FOR( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->lp_noise_fx = hFrontVad[n]->hNoiseEst->totalNoise_fx; /* Q8 */ + hFrontVad[n]->lp_noise_fx = extract_h( hFrontVad[n]->hNoiseEst->totalNoise_32fx ); /* Q8 */ move16(); tmp = add( hFrontVad[n]->lp_noise_fx, 2560 ); /* Q8 */ @@ -74,7 +74,7 @@ void ivas_long_enr_fx( FOR( n = 0; n < n_chan; n++ ) { - hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, hFrontVad[n]->hNoiseEst->totalNoise_fx ) ); /* Q8 */ + hFrontVad[n]->lp_noise_fx = add( mult_r( smooth_prev, hFrontVad[n]->lp_noise_fx ), mult_r( smooth_curr, extract_h( hFrontVad[n]->hNoiseEst->totalNoise_32fx ) ) ); /* Q8 */ move16(); test(); IF( localVAD_HE_SAD_LR[n] && !high_lpn_flag ) @@ -102,11 +102,11 @@ void ivas_long_enr_fx( { IF( LT_16( st_fx->ini_frame, 4 ) ) { - st_fx->lp_noise_fx = hNoiseEst->totalNoise_fx; /* Q8 */ - move16(); - tmp = add( st_fx->lp_noise_fx, 2560 ); /*10.0 in Q8*/ - st_fx->lp_speech_fx = s_max( st_fx->lp_speech_fx, tmp ); - move16(); + st_fx->lp_noise_32fx = hNoiseEst->totalNoise_32fx; /* Q24 */ + move32(); + Word32 tmp1 = L_add( st_fx->lp_noise_32fx, 167772160 ); /*10.0 in Q24*/ + st_fx->lp_speech_32fx = L_max( st_fx->lp_speech_32fx, tmp1 ); + move32(); } ELSE { @@ -115,34 +115,34 @@ void ivas_long_enr_fx( } else { st->lp_noise = 0.98f * st->lp_noise + 0.02f * st->totalNoise; } */ - alpha = 655; /* 0.02 Q15 */ - move16(); + alpha = 42949673; /* 0.02 Q31 */ + move32(); if ( LT_16( st_fx->ini_frame, 150 ) ) /* should match HE_LT_CNT_INIT_FX */ { - alpha = 1638; - move16(); /* 0.05 Q15 */ + alpha = 107374182; + move32(); /* 0.05 Q31 */ } - st_fx->lp_noise_fx = noise_est_AR1_Qx( hNoiseEst->totalNoise_fx, st_fx->lp_noise_fx, alpha ); /* Q8 state, alpha in Q15 */ - move16(); + st_fx->lp_noise_32fx = noise_est_AR1_Qx_32( hNoiseEst->totalNoise_32fx, st_fx->lp_noise_32fx, alpha ); /* Q24 state, alpha in Q31 */ + move32(); test(); IF( ( localVAD_HE_SAD != 0 ) && ( high_lpn_flag == 0 ) ) { - IF( LT_16( sub( st_fx->lp_speech_fx, Etot ), 2560 ) ) /* 10.0 in Q8 */ + IF( LT_32( L_sub( st_fx->lp_speech_32fx, Etot ), 167772160 ) ) /* 10.0 in Q24 */ { /* st->lp_speech = 0.98f * st->lp_speech + 0.02f * Etot; */ - st_fx->lp_speech_fx = noise_est_AR1_Qx( Etot, st_fx->lp_speech_fx, 655 ); /* Q8 state, 0.02 in Q15 */ - move16(); + st_fx->lp_speech_32fx = noise_est_AR1_Qx_32( Etot, st_fx->lp_speech_32fx, 42949673 ); /* Q24 state, 0.02 in Q31 */ + move32(); } ELSE { - st_fx->lp_speech_fx = sub( st_fx->lp_speech_fx, 13 ); /* st->lp_speech = st->lp_speech - 0.05f; linear decay*/ - move16(); + st_fx->lp_speech_32fx = L_sub( st_fx->lp_speech_32fx, 838861 ); /* st->lp_speech = st->lp_speech - 0.05f; linear decay*/ + move32(); } } } /* Update */ - st_fx->hNoiseEst->Etot_last_32fx = L_deposit_h( Etot ); /* Q24 */ - move16(); + st_fx->hNoiseEst->Etot_last_32fx = Etot; /* Q24 */ + move32(); } /*-----------------------------------------------------------------* diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 7534a5159..676696fd6 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -75,6 +75,20 @@ Word16 noise_est_AR1_Qx( /* o : Qx y(n) */ return mac_r( L_mult( y, alpham1 ), x, alpha ); } +Word32 noise_est_AR1_Qx_32( /* o : Qx y(n) */ + Word32 x, /* i : Qx x(n) */ + Word32 y, /* i : Qx y(n-1) */ + Word32 alpha /*i : Q15 scaling of driving x(n) */ +) +{ + Word32 alpham1; + /*alpham1 = negate(add((Word16)-32768, alpha)); */ + alpham1 = L_sub( MAX_32, alpha ); /* one cycle less */ + alpham1++; + + return Madd_32_32( Mpy_32_32( y, alpham1 ), x, alpha ); +} + /*-----------------------------------------------------------------* * noise_est_ln_q8_fx() * @@ -280,7 +294,7 @@ void noise_est_init_ivas_fx( move32(); /*Q7//E_MIN; */ hNoiseEst->enrO_fx[i] = E_MIN_Q11_FX; move32(); - hNoiseEst->bckr_fx[i] = E_MIN_Q11_FX; + hNoiseEst->bckr_fx[i] = E_MIN_Q27_FX; move32(); hNoiseEst->ave_enr_fx[i] = E_MIN_Q11_FX; move32(); @@ -289,14 +303,14 @@ void noise_est_init_ivas_fx( move16(); /*1e-5f; */ hNoiseEst->q_enrO = Q11; move16(); - hNoiseEst->q_bckr = Q11; + hNoiseEst->q_bckr = Q27; move16(); hNoiseEst->ave_enr_q = Q11; move16(); move16(); - hNoiseEst->totalNoise_fx = 0; - move16(); + hNoiseEst->totalNoise_32fx = 0; + move32(); hNoiseEst->first_noise_updt = 0; move16(); hNoiseEst->first_noise_updt_cnt = 0; @@ -747,7 +761,7 @@ void noise_est_down_ivas_fx( Word16 *q_enr, const Word16 min_band, /* i : minimum critical band */ const Word16 max_band, /* i : maximum critical band */ - Word16 *totalNoise, /* o : noise estimate over all critical bands */ + Word32 *totalNoise, /* o : noise estimate over all critical bands */ Word32 Etot, /* i : Energy of current frame Q24*/ Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ Word32 *Etot_v_h2 /* i/o: Energy variations of noise frames Q24 */ @@ -803,8 +817,8 @@ void noise_est_down_ivas_fx( Ltmp = L_mac( L_deposit_h( e_Noise ), f_Noise, 1 ); // Q16 Ltmp = Mpy_32_16_1( Ltmp, LG10 ); // Q14 (16+13-15) Ltmp = L_shl( Ltmp, 10 ); // Q26 - *totalNoise = round_fx( Ltmp ); /*Q8*/ - move16(); + *totalNoise = ( Ltmp ); /*Q24*/ + move32(); /*-----------------------------------------------------------------* * Average energy per frame for each frequency band @@ -2207,7 +2221,7 @@ void noise_est_ivas_fx( Word16 *ncharX, /* o : Q11 */ Word16 *sp_div, /* o : Q_sp_div */ Word16 *Q_sp_div, /* o : Q factor for sp_div */ - Word16 *non_staX, /* o : non-stationarity for sp/mus classifier Q8 */ + Word32 *non_staX, /* o : non-stationarity for sp/mus classifier Q20 */ Word16 *loc_harm, /* o : multi-harmonicity flag for UV classifier */ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E */ const Word16 q_lf_E, /* i : Q of lf_E Q0 */ @@ -2728,7 +2742,7 @@ void noise_est_ivas_fx( Ltmp1 = Mpy_32_16_1( Ltmp1, 22713 ); // Q15 log_enr16 = round_fx( L_shl( Ltmp1, 9 ) ); /* Q8 */ wtmp = abs_s( sub( log_enr16, hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] ) ); - *non_staX = add_o( *non_staX, wtmp, &Overflow ); + *non_staX = L_add( *non_staX, wtmp ); move16(); /* Q8 */ hSpMusClas->past_log_enr_fx[i - START_BAND_SPMUS] = log_enr16; move16(); @@ -2773,8 +2787,9 @@ void noise_est_ivas_fx( } } - } /* end of band loop FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) */ - + } /* end of band loop FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) */ + *non_staX = L_shl( *non_staX, 12 ); // Q20 + move32(); IF( LT_16( Etot, -1280 /* -5.0f in Q8 */ ) ) { non_sta = L_deposit_l( 1024 ); /* 1.0 in Q10 */ @@ -2974,7 +2989,7 @@ void noise_est_ivas_fx( * long term extensions of frame features *-----------------------------------------------------------------*/ - tmp = sub( Etot, hNoiseEst->totalNoise_fx ); /* Q8 */ + tmp = sub( Etot, extract_h( hNoiseEst->totalNoise_32fx ) ); /* Q8 */ /* st->lt_tn_track = 0.03f* (Etot - st->totalNoise < 10) + 0.97f*st->lt_tn_track; */ tmp2 = 0; move16(); @@ -3471,7 +3486,7 @@ void noise_est_ivas_fx( test(); test(); IF( ( LT_16( hNoiseEst->act_pred_fx, 27853 /* 0.85 in Q15 */ ) && ( aE_bgd != 0 ) && ( LT_16( hNoiseEst->lt_Ellp_dist_fx, 10 * 256 /* 10 in Q8*/ ) || ( sd1_bgd != 0 ) ) && ( LT_16( hNoiseEst->lt_tn_dist_fx, 40 * 256 ) ) /* 40.0 in Q8*/ - && LT_16( sub( Etot, hNoiseEst->totalNoise_fx ), 10 * 256 /* 10 in Q8 */ ) /* 10.0 in Q8*/ ) || + && LT_16( sub( Etot, extract_h( hNoiseEst->totalNoise_32fx ) ), 10 * 256 /* 10 in Q8 */ ) /* 10.0 in Q8*/ ) || ( ( hNoiseEst->first_noise_updt == 0 ) && GT_16( hNoiseEst->harm_cor_cnt, 80 ) && ( aE_bgd != 0 ) && GT_16( hNoiseEst->lt_aEn_zero_fx, 16384 /* 0.5 in Q15 */ ) ) || ( ( tn_ini != 0 ) && ( ( aE_bgd != 0 ) || LT_16( non_staB, 10 * 256 /* 10 in Q8*/ ) || GT_16( hNoiseEst->harm_cor_cnt, 80 ) ) ) ) { @@ -3494,7 +3509,7 @@ void noise_est_ivas_fx( ) */ ELSE IF( ( LT_16( hNoiseEst->act_pred_fx, 26214 /* 0.8 in Q15*/ ) && ( ( aE_bgd != 0 ) || ( PAU != 0 ) ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 3277 /* 0.1 in q15*/ ) ) ) || ( ( LT_16( hNoiseEst->act_pred_fx, 22938 /* 0.70 in Q15 */ ) ) && ( ( aE_bgd != 0 ) || ( LT_16( non_staB, 17 * 256 /* 17.0 in Q8 */ ) ) ) && ( PAU != 0 ) && ( LT_16( hNoiseEst->lt_haco_ev_fx, 4915 /* 0.15 in Q15 */ ) ) ) || - ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) && GT_16( hNoiseEst->totalNoise_fx, 5 * 256 /* 5.0 in Q8 */ ) && LT_16( Etot, s_max( 1 * 256, add( Etot_l_lp, extract_h( L_add( hNoiseEst->Etot_v_h2_32fx, L_shr( hNoiseEst->Etot_v_h2_32fx, 1 ) ) ) /* 1.5= 1.0+.5 */ ) ) ) ) || + ( GT_16( hNoiseEst->harm_cor_cnt, 80 ) && GT_16( extract_h( hNoiseEst->totalNoise_32fx ), 5 * 256 /* 5.0 in Q8 */ ) && LT_16( Etot, s_max( 1 * 256, add( Etot_l_lp, extract_h( L_add( hNoiseEst->Etot_v_h2_32fx, L_shr( hNoiseEst->Etot_v_h2_32fx, 1 ) ) ) /* 1.5= 1.0+.5 */ ) ) ) ) || ( GT_16( hNoiseEst->harm_cor_cnt, 50 ) && GT_16( hNoiseEst->first_noise_updt, 30 ) && ( aE_bgd != 0 ) && GT_16( hNoiseEst->lt_aEn_zero_fx, 16384 /*.5 in Q15*/ ) ) || ( tn_ini != 0 ) ) { updt_step = 3277; @@ -3513,7 +3528,7 @@ void noise_est_ivas_fx( test(); if ( ( aE_bgd == 0 ) && LT_16( hNoiseEst->harm_cor_cnt, 50 ) && ( GT_16( hNoiseEst->act_pred_fx, 19661 /* 0.6 in Q15*/ ) || - ( ( tn_ini == 0 ) && LT_16( sub( Etot_l_lp, hNoiseEst->totalNoise_fx ), 10 * 256 /* 10.0 in Q8 */ ) && GT_16( non_staB, 8 * 256 /* 8.0 in in Q8*/ ) ) ) ) + ( ( tn_ini == 0 ) && LT_16( sub( Etot_l_lp, extract_h( hNoiseEst->totalNoise_32fx ) ), 10 * 256 /* 10.0 in Q8 */ ) && GT_16( non_staB, 8 * 256 /* 8.0 in in Q8*/ ) ) ) ) { updt_step = 328; move16(); /* 0.01 Q15 */ @@ -3543,7 +3558,7 @@ void noise_est_ivas_fx( /* If in music lower bckr to drop further */ test(); test(); - IF( GT_16( hNoiseEst->low_tn_track_cnt, 300 ) && GT_16( hNoiseEst->lt_haco_ev_fx, 29491 /* 0.9 in Q15 */ ) && ( hNoiseEst->totalNoise_fx > 0 ) ) + IF( GT_16( hNoiseEst->low_tn_track_cnt, 300 ) && GT_16( hNoiseEst->lt_haco_ev_fx, 29491 /* 0.9 in Q15 */ ) && ( hNoiseEst->totalNoise_32fx > 0 ) ) { updt_step = -655; move16(); /* for debug purposes */ diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 59d2fdf9a..c433dcb2c 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -304,7 +304,7 @@ void long_enr_fx( Word16 high_lpn_flag ); void ivas_long_enr_fx( Encoder_State *st_fx, /* i/o: state structure */ - const Word16 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q=8*/ + const Word32 Etot, /* i : total channel E (see lib_enc\analy_sp.c) Q=24*/ const Word16 localVAD_HE_SAD, /* i : HE-SAD flag without hangover */ Word16 high_lpn_flag, /* i : sp/mus LPN flag */ FRONT_VAD_ENC_HANDLE hFrontVad[], /* i/o: front-VAD handles */ @@ -347,7 +347,7 @@ void noise_est_down_ivas_fx( Word16 *q_enr, const Word16 min_band, /* i : minimum critical band */ const Word16 max_band, /* i : maximum critical band */ - Word16 *totalNoise, /* o : noise estimate over all critical bands */ + Word32 *totalNoise, /* o : noise estimate over all critical bands */ Word32 Etot, /* i : Energy of current frame Q24*/ Word32 *Etot_last, /* i/o: Energy of last frame Q24 */ Word32 *Etot_v_h2 /* i/o: Energy variations of noise frames Q24 */ @@ -398,7 +398,7 @@ void noise_est_ivas_fx( Word16 *ncharX, /* o : Q11 */ Word16 *sp_div, /* o : Q_sp_div */ Word16 *Q_sp_div, /* o : Q factor for sp_div */ - Word16 *non_staX, /* o : non-stationarity for sp/mus classifier */ + Word32 *non_staX, /* o : non-stationarity for sp/mus classifier */ Word16 *loc_harm, /* o : multi-harmonicity flag for UV classifier */ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E */ const Word16 q_lf_E, /* i : Q of lf_E Q0 */ @@ -4465,6 +4465,13 @@ Word16 noise_est_AR1_Qx( /* o: Qx y(n) */ Word16 y, /* i : Qx y(n-1) */ Word16 alpha /*i : Q15 scaling of driving x(n) */ ); + +Word32 noise_est_AR1_Qx_32( /* o: Qx y(n) */ + Word32 x, /* i : Qx x(n) */ + Word32 y, /* i : Qx y(n-1) */ + Word32 alpha /*i : Q15 scaling of driving x(n) */ +); + void FEC_lsf_estim_enc_fx( Encoder_State *st_fx, /* i : Encoder static memory */ Word16 *lsf /* o : estimated LSF vector Qlog2(2.56)*/ diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index 817e5fb70..fd983741b 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -1588,7 +1588,7 @@ Word16 ivas_smc_gmm_fx( const Word16 cor_map_sum_fx, /* i : correlation map sum (from multi-harmonic anal.) Q8 */ const Word32 epsP_fx[M + 1], /* i : LP prediciton error */ const Word32 PS_fx[], /* i : energy spectrum */ - const Word16 non_sta_fx, /* i : unbound non-stationarity Q8 */ + const Word32 non_sta_fx, /* i : unbound non-stationarity Q20 */ const Word16 relE_fx, /* i : relative frame energy Q8 */ Word16 *high_lpn_flag, /* i/o: sp/mus LPN flag */ const Word16 flag_spitch, /* i : flag to indicate very short stable pitch */ @@ -1879,7 +1879,7 @@ Word16 ivas_smc_gmm_fx( move32(); /* [8] non_sta */ - *pFV_fx++ = L_shl( non_sta_fx, Q12 ); /*scaling from Q8 to Q20*/ + *pFV_fx++ = non_sta_fx; /*Q20*/ move32(); /* [9] epsP */ @@ -3161,7 +3161,7 @@ void ivas_smc_mode_selection_fx( test(); test(); test(); - if ( EQ_16( st->vad_flag, 1 ) && LE_32( element_brate, IVAS_16k4 ) && GT_16( st->lp_noise_fx, 7680 /* 30.0f in Q8 */ ) && st->sp_aud_decision1 == 0 && GE_16( st->bwidth, SWB ) && EQ_16( st->coder_type_raw, UNVOICED ) ) + if ( EQ_16( st->vad_flag, 1 ) && LE_32( element_brate, IVAS_16k4 ) && GT_32( st->lp_noise_32fx, 503316480 /* 30.0f in Q24 */ ) && st->sp_aud_decision1 == 0 && GE_16( st->bwidth, SWB ) && EQ_16( st->coder_type_raw, UNVOICED ) ) { st->GSC_noisy_speech = 1; move16(); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 2fbec12bd..0647b6ebc 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -542,8 +542,9 @@ typedef struct noise_estimation_structure Word32 ave_enr_fx[NB_BANDS]; /* Q_new + Q_SCALE Noise estimator - long-term average energy per critical band ave_enr_q */ Word16 ave_enr_q; - Word16 aEn; /* Noise estimator - noise estimator adaptation flag */ - Word16 totalNoise_fx; /* Q8 Noise estimator - total noise energy */ + Word16 aEn; /* Noise estimator - noise estimator adaptation flag */ + Word16 totalNoise_fx; /* Q8 Noise estimator - total noise energy */ + Word32 totalNoise_32fx; /* Q24 Noise estimator - total noise energy */ Word16 first_noise_updt; /* Noise estimator - flag used to determine if the first noise update frame */ Word16 first_noise_updt_cnt; /* Noise estimator - counter of frame after first noise update */ @@ -1522,9 +1523,11 @@ typedef struct enc_core_structure Word16 sharpFlag; Word16 localVAD; /* i : local VAD flag */ - Word32 bckr_tilt_lt; /* Q16 */ - Word16 lp_speech_fx; /* Q8 */ - Word16 lp_noise_fx; /* CNG and DTX - LP filtered total noise estimation Q8 */ + Word32 bckr_tilt_lt; /* Q16 */ + Word16 lp_speech_fx; /* Q8 */ + Word16 lp_noise_fx; /* CNG and DTX - LP filtered total noise estimation Q24 */ + Word32 lp_speech_32fx; /* Q24 */ + Word32 lp_noise_32fx; /* CNG and DTX - LP filtered total noise estimation Q24 */ Word16 Opt_HE_SAD_ON_fx; Word16 nb_active_frames_HE_SAD_fx; Word16 voicing_old_fx; diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 721a6e348..1cf7a5de8 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -1997,13 +1997,13 @@ Word16 wb_vad_ivas_fx( } if ( LT_16( lp_speech_fx, -100 * 256 ) ) { - lp_speech_fx = st_fx->lp_speech_fx; /*Q8*/ + lp_speech_fx = extract_h( st_fx->lp_speech_32fx ); /*Q8*/ move16(); } if ( LT_16( lp_noise_fx, -100 * 256 ) ) { - lp_noise_fx = st_fx->lp_noise_fx; /*Q8*/ + lp_noise_fx = extract_h( st_fx->lp_noise_32fx ); /*Q8*/ move16(); } -- GitLab From a31c149eb178bd9c5938164fb31a67c5343ed6ab Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 30 May 2025 18:10:18 +0530 Subject: [PATCH 0783/1310] Fix for 3GPP issue 1123: MLD in the range of 5 to 12 between signals decoded from 256kbps encoded SBA bitstreams at input level -16LKFS Link #1123 --- lib_enc/tcx_utils_enc_fx.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 680a69fa5..2d3c7ce47 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -1392,25 +1392,33 @@ void tcx_scalar_quantization_ivas_fx( s = sub( add( x_e, gain_e ), 15 ); } - /* substract 0x8000 to affect the mac_r in the following loop - so it acts like extract_h. the 0x4000 will be multiplied by 2 - by the mac_r to get to 0x8000 and disable the round. */ - offset = sub( offset, 0x4000 ); - FOR( ; i >= 0; i-- ) { - offs32 = Mpy_32_16_1( L_abs( x[i] ), gain ); /* multiply */ - offs32 = L_shl_sat( offs32, s ); /* convert to 15Q16 */ - tmp16 = mac_r_sat( offs32, offset, 1 ); /* add offset and truncate */ - IF( x[i] < 0 ) + offs32 = Mpy_32_16_1( x[i], gain ); /* multiply */ + offs32 = L_shl_sat( offs32, s ); /* convert to 15Q16 */ + IF( x[i] > 0 ) { - tmp16 = negate( tmp16 ); /* restore sign */ + offs32 = L_add_sat( offs32, L_shl( offset, 1 ) ); + tmp16 = extract_h( offs32 ); + IF( GT_32( L_deposit_h( tmp16 ), offs32 ) ) + { + tmp16 = sub( tmp16, 1 ); + } + } + ELSE + { + offs32 = L_add_sat( offs32, L_shl( negate( offset ), 1 ) ); + tmp16 = extract_h( offs32 ); + IF( LT_32( L_deposit_h( tmp16 ), offs32 ) ) + { + tmp16 = add( tmp16, 1 ); + } } - xq[i] = tmp16; move16(); } + IF( alfe_flag == 0 ) { AdaptLowFreqEmph_fx( x, x_e, xq, gain, gain_e, -- GitLab From 2ba1cea8d687da5ee683e1a375132ded4738fa74 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 30 May 2025 18:13:46 +0530 Subject: [PATCH 0784/1310] Fix for 3GPP issue 1201: BASOP encoder ParamISM: high MLD and audible artifacts Link #1201 --- lib_com/swb_tbe_com_fx.c | 3 +++ lib_enc/swb_tbe_enc_fx.c | 48 ++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 96d07e7ef..e4d84ef23 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -3309,6 +3309,9 @@ void GenShapedSHBExcitation_ivas_enc_fx( move16(); move16(); + scale_sig( White_exc16k, L_FRAME16k, -1 /* guard bit to prevent saturation in deemph*/ ); + Q_White_exc16k = sub( Q_White_exc16k, 1 ); + Word16 tbe_demph_fx = shl_sat( *tbe_demph, sub( Q_White_exc16k, *Q_bwe_exc ) ); // Q_White_exc16k deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, &tbe_demph_fx ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 9d0f16ee9..b001f8693 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -77,7 +77,8 @@ static void EstimateSHBGainShape_fx( const Word16 length, const Word16 Q_synSHB, Word16 *subgain, const Word16 *subwin, - Word16 *n_subfr_saturation ); + Word16 *n_subfr_saturation, + const Flag limit_min_gain ); static Word32 pow_off_pk_fx( Word16 a[], Word16 len, Word16 step ); @@ -1072,7 +1073,7 @@ void wb_tbe_enc_fx( Copy( shaped_wb_excitation + L_FRAME16k / 4, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD / 4 ); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN / 2, hb_frame, Q_ns, - shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL ); + shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL, 1 ); /* Gain frame adjustment factor */ test(); @@ -1707,7 +1708,7 @@ void wb_tbe_enc_ivas_fx( Copy( shaped_wb_excitation + L_FRAME16k / 4, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD / 4 ); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN / 2, hb_frame, Q_ns, - shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL ); + shaped_wb_excitation, Q_bwe_exc_ext, GainShape, subwin_wb_fx, NULL, 1 ); /* Gain frame adjustment factor */ test(); @@ -2552,7 +2553,7 @@ void swb_tbe_enc_fx( n_subfr_saturation = 0; move16(); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN, shb_frame_fx, Q_shb, shaped_shb_excitation_fx, - Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation ); + Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation, 1 ); /* Gain shape BWS/high band low energy fix */ IF( LT_16( hBWE_TD->cldfbHBLT, 8192 /*1.0f Q13*/ ) ) /* cldfbHBLT in Q13 */ @@ -3857,7 +3858,7 @@ void swb_tbe_enc_ivas_fx( n_subfr_saturation = 0; move16(); EstimateSHBGainShape_fx( SHB_OVERLAP_LEN, shb_frame_fx, Q_shb, shaped_shb_excitation_fx, - Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation ); + Q_bwe_exc, GainShape_fx, subwin_shb_fx, &n_subfr_saturation, 0 ); test(); IF( EQ_32( st_fx->extl_brate, SWB_TBE_1k10 ) || EQ_32( st_fx->extl_brate, SWB_TBE_1k75 ) ) @@ -4931,14 +4932,15 @@ static Word32 pow_off_pk_corrected_fx( Word16 a[], Word16 len, Word16 step ) /*--------------------------------------------------------------------------*/ static void EstimateSHBGainShape_fx( - const Word16 length, /* i : SHB overlap length */ - const Word16 *oriSHB, /* i : target original SHB frame Q(Q_oriSHB) */ - const Word16 Q_oriSHB, /* i : Q of target original SHB frame */ - const Word16 *synSHB, /* i : shaped SHB excitation Q(Q_synSHB) */ - const Word16 Q_synSHB, /* i : Q of shaped SHB excitation */ - Word16 *subgain, /* o : estimate of gain shape Q15 */ - const Word16 *subwin, /* i : SHB subframe window Q15 */ - Word16 *n_subfr_saturation /* o : Number of subframes which saturated while calculating oriNrg */ + const Word16 length, /* i : SHB overlap length */ + const Word16 *oriSHB, /* i : target original SHB frame Q(Q_oriSHB) */ + const Word16 Q_oriSHB, /* i : Q of target original SHB frame */ + const Word16 *synSHB, /* i : shaped SHB excitation Q(Q_synSHB) */ + const Word16 Q_synSHB, /* i : Q of shaped SHB excitation */ + Word16 *subgain, /* o : estimate of gain shape Q15 */ + const Word16 *subwin, /* i : SHB subframe window Q15 */ + Word16 *n_subfr_saturation, /* o : Number of subframes which saturated while calculating oriNrg */ + const Flag limit_min_gain /* i : gain shape limiting flag */ ) { const Word16 *skip; @@ -5152,11 +5154,23 @@ static void EstimateSHBGainShape_fx( n = sub( 31, add( n, ( sub( 28, shl( n_max, 1 ) ) ) ) ); normFact = Isqrt_lc( L_sum_gain, &n ); - FOR( i = 0; i < num_gains; i++ ) + IF( limit_min_gain ) { - L_tmp = Mpy_32_16_1( normFact, subgain[i] ); /*Q(31-n) * Q(31-norm[i]) */ /* Q(30-n-n_max) */ - subgain[i] = s_max( round_fx_o( L_shl_o( L_tmp, add( n, n_max + 1 ), &Overflow ), &Overflow ), 3277 /*0.1f Q15*/ ); /* Q15 */ - move16(); + FOR( i = 0; i < num_gains; i++ ) + { + L_tmp = Mpy_32_16_1( normFact, subgain[i] ); /*Q(31-n) * Q(31-norm[i]) */ /* Q(30-n-n_max) */ + subgain[i] = s_max( round_fx_o( L_shl_o( L_tmp, add( n, n_max + 1 ), &Overflow ), &Overflow ), 3277 /*0.1f Q15*/ ); /* Q15 */ + move16(); + } + } + ELSE + { + FOR( i = 0; i < num_gains; i++ ) + { + L_tmp = Mpy_32_16_1( normFact, subgain[i] ); /*Q(31-n) * Q(31-norm[i]) */ /* Q(30-n-n_max) */ + subgain[i] = round_fx_o( L_shl_o( L_tmp, add( n, n_max + 1 ), &Overflow ), &Overflow ); /* Q15 */ + move16(); + } } return; -- GitLab From 4dd8fd4a022d0f04240331de6407854c58696974 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Sun, 1 Jun 2025 18:07:20 +0200 Subject: [PATCH 0785/1310] Added floating-point to fixed-point conversions (and vice-versa) to resolve build warnings --- lib_rend/ivas_crend_fx.c | 1 + lib_rend/ivas_reverb_fx.c | 8 ++++++-- lib_rend/ivas_reverb_utils_fx.c | 9 +++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 392d8ea99..f827020af 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -1741,6 +1741,7 @@ ivas_error ivas_rend_openCrend( #ifdef SPLIT_REND_WITH_HEAD_ROT for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) #endif { #ifdef SPLIT_REND_WITH_HEAD_ROT diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 1cbbf367b..ebb3af4af 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2502,8 +2502,12 @@ ivas_error ivas_binaural_reverb_init( { revTimes = t60; revEne = ene; - - if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) + float t60_temp[CLDFB_NO_CHANNELS_MAX]; + float ene_temp[CLDFB_NO_CHANNELS_MAX]; + fixedToFloat_arrL(t60, t60_temp, Q15, CLDFB_NO_CHANNELS_MAX ); + fixedToFloat_arrL(ene, ene_temp, Q15, CLDFB_NO_CHANNELS_MAX ); + //if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60_temp, ene_temp ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index a385ef359..e6cddc5e3 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -101,7 +101,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; float delay_diff, ln_1e6_inverted, exp_argument; const float dist = DEFAULT_SRC_DIST; - const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; + const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; // Represent in fixed point #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif @@ -150,7 +150,12 @@ ivas_error ivas_reverb_prepare_cldfb_params( } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right ); + Word32 avg_pwr_left_temp[CLDFB_NO_CHANNELS_MAX]; + Word32 avg_pwr_right_temp[CLDFB_NO_CHANNELS_MAX]; + //floatToFixed_arr32(avg_pwr_left, avg_pwr_left_temp, Q15, CLDFB_NO_CHANNELS_MAX); + //floatToFixed_arr32(avg_pwr_right, avg_pwr_right_temp, Q15, CLDFB_NO_CHANNELS_MAX); + + ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left_temp, avg_pwr_right_temp); #else if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) { -- GitLab From 6f1c7d19c215ef7e87a8b3014f1b8f98686eb9be Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Sun, 1 Jun 2025 18:10:18 +0200 Subject: [PATCH 0786/1310] clang formatting patch --- lib_rend/ivas_crend_fx.c | 244 ++++++++++++++++---------------- lib_rend/ivas_reverb_fx.c | 6 +- lib_rend/ivas_reverb_utils_fx.c | 6 +- 3 files changed, 128 insertions(+), 128 deletions(-) diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index f827020af..c180c59a8 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -1741,64 +1741,64 @@ ivas_error ivas_rend_openCrend( #ifdef SPLIT_REND_WITH_HEAD_ROT for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) - for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) + for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) #endif - { + { #ifdef SPLIT_REND_WITH_HEAD_ROT - hCrend = ( *pCrend )->hCrend[pos_idx]; + hCrend = ( *pCrend )->hCrend[pos_idx]; #else hCrend = ( *pCrend )->hCrend; #endif - hHrtf = ( *pCrend )->hHrtfCrend; + hHrtf = ( *pCrend )->hHrtfCrend; - IF( hHrtf != NULL ) - { - max_total_ir_len = L_mult0( hHrtf->max_num_iterations, subframe_length ); - - FOR( i = 0; i < hHrtf->max_num_ir; i++ ) + IF( hHrtf != NULL ) { - IF( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_zero2_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len ); + max_total_ir_len = L_mult0( hHrtf->max_num_iterations, subframe_length ); - IF( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + IF( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero2_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len ); + + IF( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero2_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len ); } - set_zero2_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len ); - } - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - IF( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + IF( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length ); } - set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length ); - } - max_total_ir_len = L_mult0( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length ); + max_total_ir_len = L_mult0( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length ); - IF( max_total_ir_len > 0 ) - { -#ifdef FIX_INV_DIFFUSE_WEIGHT - IF( ( hCrend->freq_buffer_re_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - IF( hHrtf->same_inv_diffuse_weight == 0 ) + IF( max_total_ir_len > 0 ) { - IF( ( hCrend->freq_buffer_re_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) +#ifdef FIX_INV_DIFFUSE_WEIGHT + IF( ( hCrend->freq_buffer_re_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - } - ELSE - { - hCrend->freq_buffer_re_diffuse_fx[1] = NULL; - } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_re_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + } + ELSE + { + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + } #else IF( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { @@ -1806,30 +1806,30 @@ ivas_error ivas_rend_openCrend( } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT - set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[0], max_total_ir_len ); - IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) - { - set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[1], max_total_ir_len ); - } + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[1], max_total_ir_len ); + } #else set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx, max_total_ir_len ); #endif #ifdef FIX_INV_DIFFUSE_WEIGHT - IF( ( hCrend->freq_buffer_im_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - IF( hHrtf->same_inv_diffuse_weight == 0 ) - { - IF( ( hCrend->freq_buffer_im_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + IF( ( hCrend->freq_buffer_im_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - } - ELSE - { - hCrend->freq_buffer_im_diffuse_fx[1] = NULL; - } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_im_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + } + ELSE + { + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; + } #else IF( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { @@ -1837,109 +1837,109 @@ ivas_error ivas_rend_openCrend( } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT - set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[0], max_total_ir_len ); - IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) - { - set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[1], max_total_ir_len ); - } + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[1], max_total_ir_len ); + } #else set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx, max_total_ir_len ); #endif - } - ELSE - { + } + ELSE + { #ifdef FIX_INV_DIFFUSE_WEIGHT - hCrend->freq_buffer_re_diffuse_fx[0] = NULL; - hCrend->freq_buffer_im_diffuse_fx[0] = NULL; - hCrend->freq_buffer_re_diffuse_fx[1] = NULL; - hCrend->freq_buffer_im_diffuse_fx[1] = NULL; + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; #else hCrend->freq_buffer_re_diffuse_fx = NULL; hCrend->freq_buffer_im_diffuse_fx = NULL; #endif - } + } - max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ - IF( max_total_ir_len > 0 ) - { - IF( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ + IF( max_total_ir_len > 0 ) { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + IF( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero2_fx( hCrend->lfe_delay_line_fx, max_total_ir_len ); + } + ELSE + { + hCrend->lfe_delay_line_fx = NULL; } - set_zero2_fx( hCrend->lfe_delay_line_fx, max_total_ir_len ); - } - ELSE - { - hCrend->lfe_delay_line_fx = NULL; - } - IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { + IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) #endif - { - return error; - } - - IF( EQ_16( hRendCfg->roomAcoustics.use_er, 1 ) ) - { - - /* Allocate memory for reflections */ - hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); - IF( !hCrend->reflections ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); - } - IF( NE_32( ( error = ivas_er_init_handle( hCrend->reflections ) ), IVAS_ERR_OK ) ) { return error; } - hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; - hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; - move16(); - move32(); + IF( EQ_16( hRendCfg->roomAcoustics.use_er, 1 ) ) + { - /* Set sample rate and frame size */ + /* Allocate memory for reflections */ + hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); + IF( !hCrend->reflections ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); + } + IF( NE_32( ( error = ivas_er_init_handle( hCrend->reflections ) ), IVAS_ERR_OK ) ) + { + return error; + } - hCrend->reflections->output_Fs_fx = output_Fs; // Q0 - move32(); + hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; + hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; + move16(); + move32(); - hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); - move32(); + /* Set sample rate and frame size */ + + hCrend->reflections->output_Fs_fx = output_Fs; // Q0 + move32(); + + hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); + move32(); - /* Init Shoebox */ - ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); + /* Init Shoebox */ + ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); - /* Init and compute Reflections */ - IF( NE_32( ( error = ivas_er_init( hCrend->reflections, inConfig ) ), IVAS_ERR_OK ) ) + /* Init and compute Reflections */ + IF( NE_32( ( error = ivas_er_init( hCrend->reflections, inConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE { - return error; + hCrend->reflections = NULL; } } ELSE { - hCrend->reflections = NULL; + hCrend->hReverb = NULL; } - } - ELSE - { - hCrend->hReverb = NULL; - } - ( *pCrend )->binaural_latency_ns = Mult_32_32( ( *pCrend )->hHrtfCrend->latency_s_fx, (Word32) 1000000000 ); - move32(); - } + ( *pCrend )->binaural_latency_ns = Mult_32_32( ( *pCrend )->hHrtfCrend->latency_s_fx, (Word32) 1000000000 ); + move32(); + } #ifdef SPLIT_REND_WITH_HEAD_ROT - ( *pCrend )->hCrend[pos_idx] = hCrend; + ( *pCrend )->hCrend[pos_idx] = hCrend; #else ( *pCrend )->hCrend = hCrend; #endif - } + } return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index ebb3af4af..71f04a9c1 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2504,9 +2504,9 @@ ivas_error ivas_binaural_reverb_init( revEne = ene; float t60_temp[CLDFB_NO_CHANNELS_MAX]; float ene_temp[CLDFB_NO_CHANNELS_MAX]; - fixedToFloat_arrL(t60, t60_temp, Q15, CLDFB_NO_CHANNELS_MAX ); - fixedToFloat_arrL(ene, ene_temp, Q15, CLDFB_NO_CHANNELS_MAX ); - //if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) + fixedToFloat_arrL( t60, t60_temp, Q15, CLDFB_NO_CHANNELS_MAX ); + fixedToFloat_arrL( ene, ene_temp, Q15, CLDFB_NO_CHANNELS_MAX ); + // if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60_temp, ene_temp ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index e6cddc5e3..93e565c59 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -152,10 +152,10 @@ ivas_error ivas_reverb_prepare_cldfb_params( Word32 avg_pwr_left_temp[CLDFB_NO_CHANNELS_MAX]; Word32 avg_pwr_right_temp[CLDFB_NO_CHANNELS_MAX]; - //floatToFixed_arr32(avg_pwr_left, avg_pwr_left_temp, Q15, CLDFB_NO_CHANNELS_MAX); - //floatToFixed_arr32(avg_pwr_right, avg_pwr_right_temp, Q15, CLDFB_NO_CHANNELS_MAX); + // floatToFixed_arr32(avg_pwr_left, avg_pwr_left_temp, Q15, CLDFB_NO_CHANNELS_MAX); + // floatToFixed_arr32(avg_pwr_right, avg_pwr_right_temp, Q15, CLDFB_NO_CHANNELS_MAX); - ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left_temp, avg_pwr_right_temp); + ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left_temp, avg_pwr_right_temp ); #else if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) { -- GitLab From a3cd93a0971a687c4a2839c86f67e5bf917c5997 Mon Sep 17 00:00:00 2001 From: Adriana Vasilache Date: Mon, 2 Jun 2025 11:19:03 +0300 Subject: [PATCH 0787/1310] dummy commit to trigger CI -- GitLab From 32ed4e67d8746710fa23813e04a56b1b790dce62 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Mon, 2 Jun 2025 11:52:33 +0200 Subject: [PATCH 0788/1310] changes - fixed point data members --- lib_rend/ivas_reverb_fx.c | 4 ++-- lib_rend/ivas_reverb_utils_fx.c | 24 +++++++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 71f04a9c1..228e399e2 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2504,8 +2504,8 @@ ivas_error ivas_binaural_reverb_init( revEne = ene; float t60_temp[CLDFB_NO_CHANNELS_MAX]; float ene_temp[CLDFB_NO_CHANNELS_MAX]; - fixedToFloat_arrL( t60, t60_temp, Q15, CLDFB_NO_CHANNELS_MAX ); - fixedToFloat_arrL( ene, ene_temp, Q15, CLDFB_NO_CHANNELS_MAX ); + // fixedToFloat_arrL( t60, t60_temp, Q15, CLDFB_NO_CHANNELS_MAX ); + // fixedToFloat_arrL( ene, ene_temp, Q15, CLDFB_NO_CHANNELS_MAX ); // if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60_temp, ene_temp ) ) != IVAS_ERR_OK ) { diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 93e565c59..ec2001527 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -65,7 +65,7 @@ typedef struct cldfb_convolver_state } cldfb_convolver_state; #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, const int32_t sampling_rate, Word32 *avg_pwr_l_out, Word32 *avg_pwr_r_out ); +static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, const int32_t sampling_rate, float *avg_pwr_l_out, float *avg_pwr_r_out ); #else static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ); #endif @@ -150,12 +150,10 @@ ivas_error ivas_reverb_prepare_cldfb_params( } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - Word32 avg_pwr_left_temp[CLDFB_NO_CHANNELS_MAX]; - Word32 avg_pwr_right_temp[CLDFB_NO_CHANNELS_MAX]; - // floatToFixed_arr32(avg_pwr_left, avg_pwr_left_temp, Q15, CLDFB_NO_CHANNELS_MAX); - // floatToFixed_arr32(avg_pwr_right, avg_pwr_right_temp, Q15, CLDFB_NO_CHANNELS_MAX); + //Word32 avg_pwr_left_temp[CLDFB_NO_CHANNELS_MAX]; + //Word32 avg_pwr_right_temp[CLDFB_NO_CHANNELS_MAX]; - ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left_temp, avg_pwr_right_temp ); + ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right); #else if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) { @@ -312,8 +310,8 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const int16_t use_brir, #endif const int32_t sampling_rate, - Word32 *avg_pwr_left, - Word32 *avg_pwr_right ) + float *avg_pwr_left, + float *avg_pwr_right ) { int16_t freq_idx; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES @@ -347,6 +345,8 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); + Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); + Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); for ( int i = 0; i < 60; i++ ) { @@ -359,7 +359,13 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( } ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_l, avg_pwr_r, - CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left, avg_pwr_right, avg_pwr_left_e, avg_pwr_right_e ); + CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); + + for ( int i = 0; i < 257; i++ ) + { + avg_pwr_left[i] = (float) fabs( me2f( avg_pwr_left_fx[i], avg_pwr_left_e[i] ) ); + avg_pwr_right[i] = (float) fabs( me2f( avg_pwr_right_fx[i], avg_pwr_right_e[i] ) ); + } free( input_fc_fx ); free( output_fc_fx ); -- GitLab From 3adc971e8bd85d85d2996fb4fe5aa2ad4cb4d2d3 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Mon, 2 Jun 2025 12:01:08 +0200 Subject: [PATCH 0789/1310] clang patch --- lib_rend/ivas_reverb_utils_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index ec2001527..7263545b7 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -150,10 +150,10 @@ ivas_error ivas_reverb_prepare_cldfb_params( } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - //Word32 avg_pwr_left_temp[CLDFB_NO_CHANNELS_MAX]; - //Word32 avg_pwr_right_temp[CLDFB_NO_CHANNELS_MAX]; + // Word32 avg_pwr_left_temp[CLDFB_NO_CHANNELS_MAX]; + // Word32 avg_pwr_right_temp[CLDFB_NO_CHANNELS_MAX]; - ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right); + ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right ); #else if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) { @@ -361,7 +361,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); - for ( int i = 0; i < 257; i++ ) + for ( int i = 0; i < 257; i++ ) { avg_pwr_left[i] = (float) fabs( me2f( avg_pwr_left_fx[i], avg_pwr_left_e[i] ) ); avg_pwr_right[i] = (float) fabs( me2f( avg_pwr_right_fx[i], avg_pwr_right_e[i] ) ); -- GitLab From dd2547843d55bebccc43249166d162daed28f9ca Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 2 Jun 2025 12:21:19 +0200 Subject: [PATCH 0790/1310] Remove asignment of Q value that leads to wrong old EXC and subsequently wrong BWE_TD EXC signals. --- lib_dec/ivas_core_dec_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/ivas_core_dec_fx.c b/lib_dec/ivas_core_dec_fx.c index cf3d8c468..4def2242a 100644 --- a/lib_dec/ivas_core_dec_fx.c +++ b/lib_dec/ivas_core_dec_fx.c @@ -604,8 +604,10 @@ ivas_error ivas_core_dec_fx( stereo_tcx_core_dec_fx( st, frameMode[n], output_16_fx[n], synth_16_fx[n], pitch_buf_fx[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hStereoCng, nchan_out, ivas_format ); +#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN st->hHQ_core->Q_old_wtda_LB = st->hHQ_core->Q_old_wtda; move16(); +#endif Copy_Scale_sig_16_32_DEPREC( output_16_fx[n], output_32_fx[n], output_frame, Q11 ); // Q11 IF( st->hTcxDec ) -- GitLab From ca88578e2454e6d793b55193dcb6e85f40a41f50 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:26:43 +0200 Subject: [PATCH 0791/1310] Change FIX_732 to only address noise floor in msPeriodog calculation --- lib_dec/fd_cng_dec_fx.c | 56 +++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index a9965d601..ef4659552 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1117,11 +1117,7 @@ Word16 ApplyFdCng_fx( *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } -#ifdef FIX_732 - s2 = ( sub( WORD32_BITS, 1 ) ); -#else s2 = -( ( WORD32_BITS - 1 ) ); -#endif move16(); /* Shape the SID noise levels in each FFT bin */ j = 0; @@ -1161,11 +1157,7 @@ Word16 ApplyFdCng_fx( facTabExp[k] = -( ( WORD32_BITS - 1 ) ); move16(); } -#ifdef FIX_732 - s2 = s_min( s2, facTabExp[k] ); -#else s2 = s_max( s2, facTabExp[k] ); -#endif } if ( EQ_16( s2, -31 ) ) { @@ -1178,11 +1170,7 @@ Word16 ApplyFdCng_fx( s = s_max( s_min( s, ( WORD32_BITS - 1 ) ), -( ( WORD32_BITS - 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { -#ifdef FIX_732 - cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#endif move32(); } } @@ -1220,11 +1208,7 @@ Word16 ApplyFdCng_fx( { IF( !( LT_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) ) { -#ifdef FIX_732 - s2 = ( sub( WORD32_BITS, 1 ) ); -#else s2 = -( ( WORD32_BITS - 1 ) ); -#endif /* Shape the SID noise levels in each FFT bin */ j = 0; move16(); @@ -1263,11 +1247,7 @@ Word16 ApplyFdCng_fx( facTabExp[k] = -( WORD32_BITS - 1 ); move16(); } -#ifdef FIX_732 - s2 = s_min( s2, facTabExp[k] ); -#else s2 = s_max( s2, facTabExp[k] ); -#endif } IF( EQ_16( s2, -31 ) ) { @@ -1280,11 +1260,7 @@ Word16 ApplyFdCng_fx( s = s_max( s_min( s, sub( WORD32_BITS, 1 ) ), negate( sub( WORD32_BITS, 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { -#ifdef FIX_732 - cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#endif move32(); } } @@ -1320,6 +1296,14 @@ Word16 ApplyFdCng_fx( } + dbgwrite( hFdCngDec->bandNoiseShape, sizeof( Word32 ), 320, 1, "bandNoiseShape.int" ); + dbgwrite( &hFdCngDec->bandNoiseShape_exp, sizeof( short ), 1, 1, "bandNoiseShape_exp.short" ); + + dbgwrite( cngNoiseLevel, sizeof( Word32 ), 340, 1, "cngNoiseLevel.int" ); + dbgwrite( cngNoiseLevel_exp, sizeof( short ), 1, 1, "cngNoiseLevel_exp.short" ); + dbgwrite( &frame, sizeof( int ), 1, 1, "frame.int" ); + + return 0; } @@ -1523,6 +1507,9 @@ void perform_noise_estimation_dec_ivas_fx( Word32 enr, enr_tot, enr_tot0; Word16 enr_e, enr_ratio, alpha; Word32 *msPeriodog; +#ifdef FIX_732 + Word32 msPeriodog_floor; +#endif Word32 *msNoiseEst; Word32 *reIter; Word32 rescale_fac = 0; @@ -1728,10 +1715,18 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); - +#ifdef FIX_732 + msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); + IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) +#else IF( LT_32( msPeriodog[p], L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ) ) +#endif { +#ifdef FIX_732 + msPeriodog[p] = msPeriodog_floor; +#else msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ +#endif move32(); } } @@ -2105,6 +2100,13 @@ void perform_noise_estimation_dec_ivas_fx( /* Expand partitions into bins of power spectrum */ scalebands_fx( msNoiseEst, part, nFFTpart, hFdCngDec->midband_shaping, nFFTpart, sub( stopFFTbin, startBand ), hFdCngDec->bandNoiseShape, 1 ); hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; + + dbgwrite( msNoiseEst, sizeof( int ), 62, 1, "msNoiseEst.int" ); + dbgwrite( &hFdCngDec->msNoiseEst_exp, sizeof( short ), 1, 1, "msNoiseEst_exp.short" ); + dbgwrite( msPeriodog, sizeof( int ), 62, 1, "msPeriodog.int" ); + dbgwrite( &hFdCngDec->msPeriodog_exp, sizeof( short ), 1, 1, "msPeriodog_exp.short" ); + + move16(); Copy32( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd_fx[startBand], sub( stopFFTbin, startBand ) ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ hFdCngDec->smoothed_psd_exp = hFdCngDec->bandNoiseShape_exp; @@ -4739,9 +4741,9 @@ void generate_masking_noise_ivas_fx( { #ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ) ); /*Q31 - *exp_out*/ -#else /* VEC_ARITH_OPT_v1 */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ), 0 ); /*Q31 - *exp_out*/ -#endif /* VEC_ARITH_OPT_v1 */ +#endif /* VEC_ARITH_OPT_v1 */ } return; -- GitLab From edbb3c704becbfa533e95a3995e342d323b01f55 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:34:38 +0200 Subject: [PATCH 0792/1310] Rename switch to FIX_732_MS_PERIODOG_FLOOR --- lib_com/options.h | 2 +- lib_dec/fd_cng_dec_fx.c | 26 ++++++-------------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index db3dc4a20..5a25cca53 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -67,7 +67,7 @@ #ifndef BASOP_NOGLOB_DEV_USE_GLOBALS #define BASOP_NOGLOB_DECLARE_LOCAL #endif -#define FIX_732 /* Eri: Fix for precision issue in CNG generation -- still work in progress */ +#define FIX_732_MS_PERIODOG_FLOOR /* Eri: Issue-732: Dynamic range of msPeriodog leads to minimum value 1e-5 being truncated to zero. This uses the smallest non-zero value instead. */ #define FIX_867_CLDFB_NRG_SCALE diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index d9ffedf72..30164c404 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1117,6 +1117,7 @@ Word16 ApplyFdCng_fx( *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } + s2 = -( ( WORD32_BITS - 1 ) ); move16(); /* Shape the SID noise levels in each FFT bin */ @@ -1296,14 +1297,6 @@ Word16 ApplyFdCng_fx( } - dbgwrite( hFdCngDec->bandNoiseShape, sizeof( Word32 ), 320, 1, "bandNoiseShape.int" ); - dbgwrite( &hFdCngDec->bandNoiseShape_exp, sizeof( short ), 1, 1, "bandNoiseShape_exp.short" ); - - dbgwrite( cngNoiseLevel, sizeof( Word32 ), 340, 1, "cngNoiseLevel.int" ); - dbgwrite( cngNoiseLevel_exp, sizeof( short ), 1, 1, "cngNoiseLevel_exp.short" ); - dbgwrite( &frame, sizeof( int ), 1, 1, "frame.int" ); - - return 0; } @@ -1507,7 +1500,7 @@ void perform_noise_estimation_dec_ivas_fx( Word32 enr, enr_tot, enr_tot0; Word16 enr_e, enr_ratio, alpha; Word32 *msPeriodog; -#ifdef FIX_732 +#ifdef FIX_732_MS_PERIODOG_FLOOR Word32 msPeriodog_floor; #endif Word32 *msNoiseEst; @@ -1715,14 +1708,14 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); -#ifdef FIX_732 +#ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) #else IF( LT_32( msPeriodog[p], L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ) ) #endif { -#ifdef FIX_732 +#ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog[p] = msPeriodog_floor; #else msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ @@ -2100,13 +2093,6 @@ void perform_noise_estimation_dec_ivas_fx( /* Expand partitions into bins of power spectrum */ scalebands_fx( msNoiseEst, part, nFFTpart, hFdCngDec->midband_shaping, nFFTpart, sub( stopFFTbin, startBand ), hFdCngDec->bandNoiseShape, 1 ); hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - - dbgwrite( msNoiseEst, sizeof( int ), 62, 1, "msNoiseEst.int" ); - dbgwrite( &hFdCngDec->msNoiseEst_exp, sizeof( short ), 1, 1, "msNoiseEst_exp.short" ); - dbgwrite( msPeriodog, sizeof( int ), 62, 1, "msPeriodog.int" ); - dbgwrite( &hFdCngDec->msPeriodog_exp, sizeof( short ), 1, 1, "msPeriodog_exp.short" ); - - move16(); Copy32( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd_fx[startBand], sub( stopFFTbin, startBand ) ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ hFdCngDec->smoothed_psd_exp = hFdCngDec->bandNoiseShape_exp; @@ -4752,9 +4738,9 @@ void generate_masking_noise_ivas_fx( { #ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ) ); /*Q31 - *exp_out*/ -#else /* VEC_ARITH_OPT_v1 */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ), 0 ); /*Q31 - *exp_out*/ -#endif /* VEC_ARITH_OPT_v1 */ +#endif /* VEC_ARITH_OPT_v1 */ } return; -- GitLab From eb884a3884a78139685c0a34fc966397775f04ee Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:50:04 +0200 Subject: [PATCH 0793/1310] Clang format --- lib_dec/fd_cng_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 30164c404..de5aa20bb 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1718,7 +1718,7 @@ void perform_noise_estimation_dec_ivas_fx( #ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog[p] = msPeriodog_floor; #else - msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ + msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ #endif move32(); } -- GitLab From 9ee4902bc29e6b5785e5d222aca54663b880afd8 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:51:47 +0200 Subject: [PATCH 0794/1310] Add missing comment --- lib_dec/fd_cng_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index de5aa20bb..4855ab00e 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1709,7 +1709,7 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); #ifdef FIX_732_MS_PERIODOG_FLOOR - msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); + msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); /*Q31 - hFdCngDec->msPeriodog_exp*/ IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) #else IF( LT_32( msPeriodog[p], L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ) ) -- GitLab From fffed9a8a89288deba88b1a5dd49e362b73c6650 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:01:23 +0200 Subject: [PATCH 0795/1310] bug fixes --- lib_rend/ivas_reverb_fx.c | 7 +++++-- lib_rend/ivas_reverb_utils_fx.c | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 228e399e2..79b599746 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2500,8 +2500,6 @@ ivas_error ivas_binaural_reverb_init( if ( ( roomAcoustics != NULL ) && roomAcoustics->override ) { - revTimes = t60; - revEne = ene; float t60_temp[CLDFB_NO_CHANNELS_MAX]; float ene_temp[CLDFB_NO_CHANNELS_MAX]; // fixedToFloat_arrL( t60, t60_temp, Q15, CLDFB_NO_CHANNELS_MAX ); @@ -2511,6 +2509,11 @@ ivas_error ivas_binaural_reverb_init( { return error; } + floatToFixed_arrL32(t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX); + floatToFixed_arrL32(t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX); + revTimes = t60; + revEne = ene; + preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); } else diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 7263545b7..b1a4a82ab 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -371,6 +371,8 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( free( output_fc_fx ); free( avg_pwr_left_e ); free( avg_pwr_right_e ); + free( avg_pwr_left_fx ); + free( avg_pwr_left_fx ); #else if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) -- GitLab From 3678c34b1c15a8a981ae8d35c439ec330c799079 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:04:29 +0200 Subject: [PATCH 0796/1310] clang patch --- lib_rend/ivas_reverb_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 79b599746..336b9da3f 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2509,8 +2509,8 @@ ivas_error ivas_binaural_reverb_init( { return error; } - floatToFixed_arrL32(t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX); - floatToFixed_arrL32(t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX); + floatToFixed_arrL32( t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL32( t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX ); revTimes = t60; revEne = ene; -- GitLab From 36c5c06501f379b942be8c0d6af87f77b14aac55 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 14:53:32 +0200 Subject: [PATCH 0797/1310] Add new fx-fx job --- .gitlab-ci.yml | 49 ++++++++++++++++++++++++++++++++++++++++ .gitlab-ci/variables.yml | 1 + 2 files changed, 50 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9f37f50f2..b743f7a03 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -36,6 +36,9 @@ workflow: variables: IVAS_PIPELINE_NAME: 'Run encoder dmx comparison against float ref: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long' + variables: + IVAS_PIPELINE_NAME: 'Run comparison tools against float ref FX-FX (long test vectors): $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long-fx-fx' variables: IVAS_PIPELINE_NAME: 'Run comparison tools against float ref (long test vectors): $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-to-input' @@ -133,6 +136,15 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' when: never +.rules-pytest-long-fx-fx: + rules: + - if: $PYTEST_MLD_LONG # Set by scheduled pipeline + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-long-fx-fx" + - if: $CI_PIPELINE_SOURCE == 'push' + when: never + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + when: never + .rules-coverage: rules: - if: $COVERAGE_TEST # Set by scheduled pipeline @@ -1336,6 +1348,43 @@ ivas-pytest-compare_ref-long-dec-lev+10: - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor +ivas-pytest-compare_ref-long-fx-fx: + extends: + - .rules-pytest-long-fx-fx + - .test-job-linux + before_script: + - USE_LTV=1 + - REF_ENCODER_PATH=./$DUT_ENCODER_PATH + - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" + - LEVEL_SCALING=1.0 + - SPLIT_COMPARISON="true" + <<: *ivas-pytest-anchor + +ivas-pytest-compare_ref-long-fx-fx-lev-10: + extends: + - .rules-pytest-long-fx-fx + - .test-job-linux + before_script: + - USE_LTV=1 + - REF_ENCODER_PATH=./$DUT_ENCODER_PATH + - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" + - LEVEL_SCALING=0.3162 + - SPLIT_COMPARISON="true" + <<: *ivas-pytest-anchor + +ivas-pytest-compare_ref-long-fx-fx-lev+10: + extends: + - .rules-pytest-long-fx-fx + - .test-job-linux + before_script: + - USE_LTV=1 + - REF_ENCODER_PATH=./$DUT_ENCODER_PATH + - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" + - LEVEL_SCALING=3.162 + - SPLIT_COMPARISON="true" + <<: *ivas-pytest-anchor + + ivas-smoke-test-saturation: extends: - .rules-pytest-saturation-smoke-test diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 94bb71fb3..0c212d312 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -54,6 +54,7 @@ variables: - 'pytest-compare' - 'pytest-compare-enc-dmx' - 'pytest-compare-long' + - 'pytest-compare-long-fx-fx' - 'pytest-compare-to-input' - 'pytest-saturation-smoke-test' - 'evs-26444' -- GitLab From d3cb8fcc06723b39a623cdb91c8776937d2f8483 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:02:43 +0200 Subject: [PATCH 0798/1310] deactivated compiler switch --- lib_com/options.h | 2 +- lib_rend/ivas_reverb_utils_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3e4902d59..2e075ab32 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -112,7 +112,7 @@ #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ -#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index b1a4a82ab..6b9ecf3ab 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -101,7 +101,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; float delay_diff, ln_1e6_inverted, exp_argument; const float dist = DEFAULT_SRC_DIST; - const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; // Represent in fixed point + const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; // Represent in fixed point? #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif -- GitLab From 6ae2d5245bfa225979f06b9bdef6a7d76eda909c Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 2 Jun 2025 17:55:55 +0200 Subject: [PATCH 0799/1310] Change q_win values from -2 to Q15 for the case that a channel is skipped to avoid less precision in other channel of a CPE. --- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index bc4482837..a8e97b0cf 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1256,9 +1256,9 @@ void ivas_mdct_core_reconstruct_fx( ELSE { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - q_win = -2; + q_win = Q15; move16(); - q_winFB = -2; + q_winFB = Q15; move16(); #endif set16_fx( &synth_fx[k * L_frame[ch]], 0, L_frame[ch] ); -- GitLab From 4f34d8e44d3a7b41bb78e94818fc4b13c959f056 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 3 Jun 2025 08:32:21 +0200 Subject: [PATCH 0800/1310] Correct variable for scheduled FX-FX job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b743f7a03..d10993ad6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -138,7 +138,7 @@ workflow: .rules-pytest-long-fx-fx: rules: - - if: $PYTEST_MLD_LONG # Set by scheduled pipeline + - if: $PYTEST_MLD_LONG_FX_FX # Set by scheduled pipeline - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-long-fx-fx" - if: $CI_PIPELINE_SOURCE == 'push' when: never -- GitLab From 6ac062f2ead46c7911f87844c13e354f3a53978f Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 3 Jun 2025 10:38:29 +0200 Subject: [PATCH 0801/1310] restart pipeline after test case edits -- GitLab From b23adcfa2a66c74e90e308ec043e079f178bb719 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 3 Jun 2025 14:37:51 +0200 Subject: [PATCH 0802/1310] port MR 1223 from float fix for JBM control getting the wrong info for non-20ms framesizes --- apps/decoder.c | 93 ++++++++++++++ lib_com/options.h | 3 + lib_dec/lib_dec_fx.c | 282 +++++++++++++++++++++++++++++-------------- 3 files changed, 286 insertions(+), 92 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 1c59a02e7..fdfc42054 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2462,7 +2462,14 @@ static ivas_error decodeVoIP( } vec_pos_update = ( vec_pos_update + 1 ) % vec_pos_len; frame++; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + if ( vec_pos_update == 0 ) + { + systemTime_ms += vec_pos_len * systemTimeInc_ms; + } +#else systemTime_ms += systemTimeInc_ms; +#endif #ifdef WMOPS update_mem(); @@ -2470,6 +2477,92 @@ static ivas_error decodeVoIP( #endif } +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + int16_t nSamplesFlushed = 0; + + /* decode and get samples */ +#ifdef SPLIT_REND_WITH_HEAD_ROT + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, IVAS_DEC_PCM_INT16, (void *) pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesFlushed ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( nSamplesFlushed ) + { + /* Write current frame */ + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ || bsFormat == IVAS_DEC_BS_MASA_ISM || bsFormat == IVAS_DEC_BS_SBA_ISM ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + + if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) + { + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples is zeroed, and delayNumSamples_orig is updated only on first good frame, so need to re-fetch delay info */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + } +#endif + /*------------------------------------------------------------------------------------------* * Add zeros at the end to have equal length of synthesized signals *------------------------------------------------------------------------------------------*/ diff --git a/lib_com/options.h b/lib_com/options.h index a5d5a4846..26b572056 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -50,6 +50,7 @@ /*#define DEBUG_FORCE_DIR*/ /* Force modes/parameters by reading from external binary files */ /*#define DBG_WAV_WRITER*/ /* Enable dbgwrite_wav() function for generating ".wav" files */ #define SUPPORT_FORCE_TCX10_TCX20 /* VA: Enable -force tcx10|tcx20 command-line option */ +/*#define DEBUG_MODE_JBM */ /* define to output JBM relevant parameters */ #endif #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ @@ -106,4 +107,6 @@ #define FIX_1713_EXP /* VA: proposed correction to exp in ic-BWE*/ +#define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ + #endif diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 421137631..d16f862ec 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -58,6 +58,9 @@ struct IVAS_DEC_VOIP UWord16 lastDecodedWasActive; JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ UWord16 *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + Word16 nSamplesRendered20ms; /* how many samples have been rendered since the last 20ms render border*/ +#endif #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -79,6 +82,9 @@ struct IVAS_DEC bool Opt_VOIP; /* flag indicating VOIP mode with JBM */ Word16 tsm_scale; /* scale for TSM operation */ Word16 tsm_max_scaling; +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + Word16 timeScalingDone; /* have we done already one TSM in a 20ms frame? */ +#endif Word32 *apaExecBuffer_fx; /* Buffer for APA scaling */ Word16 tsm_quality; /*Q14*/ PCMDSP_APA_HANDLE hTimeScaler; @@ -112,6 +118,9 @@ static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, cons static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const UWord16 nSamplesForRendering, UWord16 *nSamplesRendered, UWord16 *nSamplesAvailableNext, Word16 *pcmBuf ); static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, Word16 *nSamplesBuffered ); static Word16 get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE +static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const Word16 nSamplesRendered ); +#endif /*---------------------------------------------------------------------* @@ -149,6 +158,9 @@ ivas_error IVAS_DEC_Open( hIvasDec->tsm_scale = 100; hIvasDec->tsm_max_scaling = 0; hIvasDec->tsm_quality = ONE_IN_Q14; /*1.f Q14*/ +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->timeScalingDone = 0; +#endif hIvasDec->needNewFrame = false; hIvasDec->nTransportChannelsOld = 0; hIvasDec->nSamplesAvailableNext = 0; @@ -171,6 +183,9 @@ ivas_error IVAS_DEC_Open( move16(); move16(); move16(); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + move16(); +#endif hIvasDec->mode = mode; move16(); @@ -805,6 +820,10 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->hCurrentDataUnit = NULL; hIvasDec->hVoIP->nSamplesFrame = (UWord16) Mpy_32_16_1( hDecoderConfig->output_Fs, INV_FRAME_PER_SEC_Q15 ); move16(); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->hVoIP->nSamplesRendered20ms = 0; + move16(); +#endif #define WMC_TOOL_SKIP /* Bitstream conversion is not counted towards complexity and memory usage */ @@ -1043,123 +1062,136 @@ ivas_error IVAS_DEC_GetSamples( { /* check if we need to run the setup function */ test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ){ + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + { /* setup */ - IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ){ - return error; - } -} -{ - /* check if we need to run the setup function, tc decoding and feeding the renderer */ - test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) - { - Word16 nResidualSamples, nSamplesTcsScaled; - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - - test(); - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) - { - IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) { return error; } } - - /* IVAS decoder */ - IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) { - return error; - } - - /* JBM */ - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) - { - IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + /* check if we need to run the setup function, tc decoding and feeding the renderer */ + test(); + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { - return IVAS_ERR_UNKNOWN; - } + Word16 nResidualSamples, nSamplesTcsScaled; + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - // tmp apaExecBuffer - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) - { - Word16 tmp_apaExecBuffer[APA_BUF]; - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + test(); + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) { - tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 + IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) + { + return error; + } } - IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) + + /* IVAS decoder */ + IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) { - return IVAS_ERR_UNKNOWN; + return error; + } + + /* JBM */ + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + // tmp apaExecBuffer + IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + Word16 tmp_apaExecBuffer[APA_BUF]; + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + { + tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 + } + IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + { + hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 + } + } + ELSE + { + IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); + nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->timeScalingDone = 1; + move16(); +#endif } - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + ELSE { - hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 + nSamplesTcsScaled = hIvasDec->nSamplesFrame; + move16(); } - } - ELSE - { - IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) +#ifdef DEBUG_MODE_JBM + dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); +#endif + + /* Feed decoded transport channels samples to the renderer */ + IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) { - return IVAS_ERR_UNKNOWN; + return error; + } +#ifdef DEBUG_MODE_JBM + dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); +#endif + + + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + /* feed residual samples to TSM for the next call */ + IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } } + hIvasDec->hasBeenFedFrame = false; + move16(); } - assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); - nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); - } - ELSE - { - nSamplesTcsScaled = hIvasDec->nSamplesFrame; - move16(); - } - /* Feed decoded transport channels samples to the renderer */ - IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* render IVAS frames directly to the output buffer */ + nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); + IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) + { + return error; + } - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) - { - /* feed residual samples to TSM for the next call */ - IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); + IF( hIvasDec->nSamplesAvailableNext == 0 ) { - return IVAS_ERR_UNKNOWN; + *needNewFrame = true; + hIvasDec->needNewFrame = true; + move16(); + move16(); + } + ELSE + { + *needNewFrame = false; + move16(); } } - hIvasDec->hasBeenFedFrame = false; - move16(); - } - - /* render IVAS frames directly to the output buffer */ - nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); - IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); - IF( hIvasDec->nSamplesAvailableNext == 0 ) - { - *needNewFrame = true; - hIvasDec->needNewFrame = true; - move16(); - move16(); } - ELSE - { - *needNewFrame = false; - move16(); - } -} -} -*nOutSamples = nSamplesRendered; -move16(); + *nOutSamples = nSamplesRendered; + move16(); -return IVAS_ERR_OK; + return IVAS_ERR_OK; } @@ -1559,6 +1591,9 @@ static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( if ( hIvasDec->st_ivas->hTcBuffer != NULL ) { *nSamplesBuffered = sub( hIvasDec->st_ivas->hTcBuffer->n_samples_buffered, hIvasDec->st_ivas->hTcBuffer->n_samples_rendered ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + *nSamplesBuffered = add( *nSamplesBuffered, hIvasDec->hVoIP->nSamplesRendered20ms ); +#endif move16(); } @@ -2685,7 +2720,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples( UWord32 extBufferedTime_ms, scale, maxScaling; JB4_DATAUNIT_HANDLE dataUnit; UWord16 extBufferedSamples; +#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE Word16 timeScalingDone; +#endif Word16 result; ivas_error error; Word16 nSamplesRendered; @@ -2694,7 +2731,9 @@ ivas_error IVAS_DEC_VoIP_GetSamples( st_ivas = hIvasDec->st_ivas; hDecoderConfig = st_ivas->hDecoderConfig; hVoIP = hIvasDec->hVoIP; +#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE timeScalingDone = 0; +#endif nOutChannels = (UWord8) st_ivas->hDecoderConfig->nchan_out; nSamplesRendered = 0; move16(); @@ -2745,19 +2784,31 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } maxScaling = Mult_32_32( imult3216( hDecoderConfig->output_Fs, (Word16) maxScaling ), INV_1000_Q31 ); +#ifdef DEBUG_MODE_JBM + dbgwrite( &extBufferedSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_extBufferedSamples.dat" ); + dbgwrite( &systemTimestamp_ms, sizeof( uint32_t ), 1, 1, "./res/JBM_systemTimestamp.dat" ); + dbgwrite( &scale, sizeof( uint32_t ), 1, 1, "./res/JBM_scale.dat" ); + dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); +#endif /* avoid time scaling multiple times in one sound card slot */ IF( NE_64( scale, 100U ) ) { +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + IF( hIvasDec->timeScalingDone ) +#else IF( timeScalingDone ) +#endif { scale = 100; move32(); } +#ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE ELSE { timeScalingDone = 1; move16(); } +#endif } /* limit scale to range supported by time scaler */ @@ -2850,6 +2901,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); move16(); move16(); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + + update_voip_rendered20ms( hIvasDec, nSamplesToZero ); +#endif } ELSE { @@ -2864,12 +2919,40 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + + update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); +#endif } } return IVAS_ERR_OK; } +// #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + +/*---------------------------------------------------------------------* + * update_voip_rendered20ms( ) + * + * Function to flush remaining audio in VoIP + *---------------------------------------------------------------------*/ + +static void update_voip_rendered20ms( + IVAS_DEC_HANDLE hIvasDec, + const Word16 nSamplesRendered ) +{ + Word16 nSamplesRenderedTotal; + nSamplesRenderedTotal = add( hIvasDec->hVoIP->nSamplesRendered20ms, nSamplesRendered ); + /* we have crossed a 20ms border, reset the time scaling done flag */ + IF( GE_16( nSamplesRenderedTotal, hIvasDec->hVoIP->nSamplesFrame ) ) + { + hIvasDec->timeScalingDone = 0; + move16(); + } + hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal % hIvasDec->hVoIP->nSamplesFrame; +} + +#endif /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_Flush( ) @@ -2895,7 +2978,22 @@ ivas_error IVAS_DEC_Flush( move16(); /* render IVAS frames */ - error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + error = IVAS_ERR_OK; + + test(); + IF( GE_16( nSamplesToRender, 0 ) && NE_16( hIvasDec->st_ivas->ivas_format, MONO_FORMAT ) ) + { +#endif + error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + } + ELSE + { + *nSamplesFlushed = 0; + move16(); + } +#endif return error; } -- GitLab From 0be4d09161d0577eef1ac26aa707c29314ad83f0 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 3 Jun 2025 14:45:14 +0200 Subject: [PATCH 0803/1310] apply formatting patch --- lib_dec/lib_dec_fx.c | 413 +++++++++++++++++++++---------------------- 1 file changed, 205 insertions(+), 208 deletions(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index d16f862ec..78d00bc34 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1062,136 +1062,134 @@ ivas_error IVAS_DEC_GetSamples( { /* check if we need to run the setup function */ test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) - { + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ){ /* setup */ - IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ){ + return error; + } +} +{ + /* check if we need to run the setup function, tc decoding and feeding the renderer */ + test(); + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + { + Word16 nResidualSamples, nSamplesTcsScaled; + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + + test(); + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) + { + IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) { return error; } } + + /* IVAS decoder */ + IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) { - /* check if we need to run the setup function, tc decoding and feeding the renderer */ - test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + return error; + } + + /* JBM */ + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) { - Word16 nResidualSamples, nSamplesTcsScaled; - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + return IVAS_ERR_UNKNOWN; + } - test(); - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) + // tmp apaExecBuffer + IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + Word16 tmp_apaExecBuffer[APA_BUF]; + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) { - IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) - { - return error; - } + tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 } - - /* IVAS decoder */ - IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) + IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) { - return error; + return IVAS_ERR_UNKNOWN; } - - /* JBM */ - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) { - IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - - // tmp apaExecBuffer - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) - { - Word16 tmp_apaExecBuffer[APA_BUF]; - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) - { - tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 - } - IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) - { - hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 - } - } - ELSE - { - IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - } - assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); - nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - hIvasDec->timeScalingDone = 1; - move16(); -#endif + hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 } - ELSE + } + ELSE + { + IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) { - nSamplesTcsScaled = hIvasDec->nSamplesFrame; - move16(); + return IVAS_ERR_UNKNOWN; } + } + assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); + nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->timeScalingDone = 1; + move16(); +#endif + } + ELSE + { + nSamplesTcsScaled = hIvasDec->nSamplesFrame; + move16(); + } #ifdef DEBUG_MODE_JBM - dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); + dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); #endif - /* Feed decoded transport channels samples to the renderer */ - IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* Feed decoded transport channels samples to the renderer */ + IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) + { + return error; + } #ifdef DEBUG_MODE_JBM - dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); + dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); #endif - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) - { - /* feed residual samples to TSM for the next call */ - IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - } - hIvasDec->hasBeenFedFrame = false; - move16(); - } - - /* render IVAS frames directly to the output buffer */ - nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); - IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); - IF( hIvasDec->nSamplesAvailableNext == 0 ) - { - *needNewFrame = true; - hIvasDec->needNewFrame = true; - move16(); - move16(); - } - ELSE + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + /* feed residual samples to TSM for the next call */ + IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) { - *needNewFrame = false; - move16(); + return IVAS_ERR_UNKNOWN; } } + hIvasDec->hasBeenFedFrame = false; + move16(); } - *nOutSamples = nSamplesRendered; - move16(); + /* render IVAS frames directly to the output buffer */ + nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); + IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) + { + return error; + } - return IVAS_ERR_OK; + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); + IF( hIvasDec->nSamplesAvailableNext == 0 ) + { + *needNewFrame = true; + hIvasDec->needNewFrame = true; + move16(); + move16(); + } + ELSE + { + *needNewFrame = false; + move16(); + } +} +} + +*nOutSamples = nSamplesRendered; +move16(); + +return IVAS_ERR_OK; } @@ -2791,142 +2789,141 @@ ivas_error IVAS_DEC_VoIP_GetSamples( dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); #endif /* avoid time scaling multiple times in one sound card slot */ - IF( NE_64( scale, 100U ) ) - { + IF( NE_64( scale, 100U ) ){ #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE IF( hIvasDec->timeScalingDone ) #else IF( timeScalingDone ) #endif - { - scale = 100; - move32(); - } + { + scale = 100; + move32(); + } #ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - ELSE - { - timeScalingDone = 1; - move16(); - } + ELSE + { + timeScalingDone = 1; + move16(); + } #endif - } + } - /* limit scale to range supported by time scaler */ - IF( LT_32( scale, APA_MIN_SCALE ) ) - { - scale = APA_MIN_SCALE; - move32(); - } - ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) - { - scale = APA_MAX_SCALE; - move32(); - } + /* limit scale to range supported by time scaler */ + IF( LT_32( scale, APA_MIN_SCALE ) ) + { + scale = APA_MIN_SCALE; + move32(); + } + ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) + { + scale = APA_MAX_SCALE; + move32(); + } - IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) + { + return error; + } - /* copy bitstream into decoder state */ - IF( dataUnit ) - { - hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + /* copy bitstream into decoder state */ + IF( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; - bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) - { - /* Decoder has been initialized with first good frame - do PLC */ - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } #ifdef SUPPORT_JBM_TRACEFILE - /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ - test(); - IF( jbmWriterFn != NULL && jbmWriter != NULL ) - { - /* write JBM trace data entry */ - store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); - IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError writing JBM Trace data to file\n" ); - return IVAS_ERR_UNKNOWN; - } - } + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + test(); + IF( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } #endif - IF( dataUnit ) - { - IF( dataUnit->partial_frame != 0 ) - { - hVoIP->lastDecodedWasActive = 1; - } - ELSE - { - hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; - } - move16(); + IF( dataUnit ) + { + IF( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + ELSE + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + move16(); - /* data unit memory is no longer used */ - JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); - } + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; - hIvasDec->nSamplesRendered = 0; - move16(); - move16(); - } - } + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; + hIvasDec->nSamplesRendered = 0; + move16(); + move16(); + } +} - /* decode */ - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - /* codec mode to use not known yet - simply output silence */ - /* directly set output zero */ - Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); - set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); - nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); - move16(); - move16(); +/* decode */ +IF( !hIvasDec->hasBeenFedFirstGoodFrame ) +{ + /* codec mode to use not known yet - simply output silence */ + /* directly set output zero */ + Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); + nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); + move16(); + move16(); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesToZero ); + update_voip_rendered20ms( hIvasDec, nSamplesToZero ); #endif - } - ELSE - { - Word16 nSamplesToRender, nSamplesRendered_loop; - bool tmp; - nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); +} +ELSE +{ + Word16 nSamplesToRender, nSamplesRendered_loop; + bool tmp; + nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); - /* render IVAS frames directly to the output buffer */ - IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* render IVAS frames directly to the output buffer */ + IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) + { + return error; + } - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); + update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); #endif - } - } +} +} - return IVAS_ERR_OK; +return IVAS_ERR_OK; } // #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE -- GitLab From 267a755e431645aadc587910346391446055b1e9 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 3 Jun 2025 15:17:37 +0200 Subject: [PATCH 0804/1310] fix typo --- lib_dec/lib_dec_fx.c | 415 ++++++++++++++++++++++--------------------- 1 file changed, 209 insertions(+), 206 deletions(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 78d00bc34..a77f2a632 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1062,134 +1062,136 @@ ivas_error IVAS_DEC_GetSamples( { /* check if we need to run the setup function */ test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ){ + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + { /* setup */ - IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ){ - return error; - } -} -{ - /* check if we need to run the setup function, tc decoding and feeding the renderer */ - test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) - { - Word16 nResidualSamples, nSamplesTcsScaled; - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - - test(); - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) - { - IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) { return error; } } - - /* IVAS decoder */ - IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) - { - return error; - } - - /* JBM */ - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) { - IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + /* check if we need to run the setup function, tc decoding and feeding the renderer */ + test(); + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) { - return IVAS_ERR_UNKNOWN; - } + Word16 nResidualSamples, nSamplesTcsScaled; + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - // tmp apaExecBuffer - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) - { - Word16 tmp_apaExecBuffer[APA_BUF]; - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + test(); + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) { - tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 + IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) + { + return error; + } } - IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) + + /* IVAS decoder */ + IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) { - return IVAS_ERR_UNKNOWN; + return error; } - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + + /* JBM */ + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) { - hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 + IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + + // tmp apaExecBuffer + IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + Word16 tmp_apaExecBuffer[APA_BUF]; + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + { + tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 + } + IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) + { + hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 + } + } + ELSE + { + IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); + nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->timeScalingDone = 1; + move16(); +#endif } - } - ELSE - { - IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) + ELSE { - return IVAS_ERR_UNKNOWN; + nSamplesTcsScaled = hIvasDec->nSamplesFrame; + move16(); } - } - assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); - nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - hIvasDec->timeScalingDone = 1; - move16(); -#endif - } - ELSE - { - nSamplesTcsScaled = hIvasDec->nSamplesFrame; - move16(); - } #ifdef DEBUG_MODE_JBM - dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); + dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); #endif - /* Feed decoded transport channels samples to the renderer */ - IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* Feed decoded transport channels samples to the renderer */ + IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) + { + return error; + } #ifdef DEBUG_MODE_JBM - dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); + dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); #endif - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) - { - /* feed residual samples to TSM for the next call */ - IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + /* feed residual samples to TSM for the next call */ + IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + hIvasDec->hasBeenFedFrame = false; + move16(); } - } - hIvasDec->hasBeenFedFrame = false; - move16(); - } - /* render IVAS frames directly to the output buffer */ - nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); - IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* render IVAS frames directly to the output buffer */ + nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); + IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) + { + return error; + } - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); - IF( hIvasDec->nSamplesAvailableNext == 0 ) - { - *needNewFrame = true; - hIvasDec->needNewFrame = true; - move16(); - move16(); - } - ELSE - { - *needNewFrame = false; - move16(); + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); + IF( hIvasDec->nSamplesAvailableNext == 0 ) + { + *needNewFrame = true; + hIvasDec->needNewFrame = true; + move16(); + move16(); + } + ELSE + { + *needNewFrame = false; + move16(); + } + } } -} -} -*nOutSamples = nSamplesRendered; -move16(); + *nOutSamples = nSamplesRendered; + move16(); -return IVAS_ERR_OK; + return IVAS_ERR_OK; } @@ -2789,144 +2791,145 @@ ivas_error IVAS_DEC_VoIP_GetSamples( dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); #endif /* avoid time scaling multiple times in one sound card slot */ - IF( NE_64( scale, 100U ) ){ + IF( NE_64( scale, 100U ) ) + { #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE IF( hIvasDec->timeScalingDone ) #else IF( timeScalingDone ) #endif - { - scale = 100; - move32(); - } + { + scale = 100; + move32(); + } #ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - ELSE - { - timeScalingDone = 1; - move16(); - } + ELSE + { + timeScalingDone = 1; + move16(); + } #endif - } + } - /* limit scale to range supported by time scaler */ - IF( LT_32( scale, APA_MIN_SCALE ) ) - { - scale = APA_MIN_SCALE; - move32(); - } - ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) - { - scale = APA_MAX_SCALE; - move32(); - } + /* limit scale to range supported by time scaler */ + IF( LT_32( scale, APA_MIN_SCALE ) ) + { + scale = APA_MIN_SCALE; + move32(); + } + ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) + { + scale = APA_MAX_SCALE; + move32(); + } - IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) + { + return error; + } - /* copy bitstream into decoder state */ - IF( dataUnit ) - { - hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + /* copy bitstream into decoder state */ + IF( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; - bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) - { - /* Decoder has been initialized with first good frame - do PLC */ - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } #ifdef SUPPORT_JBM_TRACEFILE - /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ - test(); - IF( jbmWriterFn != NULL && jbmWriter != NULL ) - { - /* write JBM trace data entry */ - store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); - IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError writing JBM Trace data to file\n" ); - return IVAS_ERR_UNKNOWN; - } - } + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + test(); + IF( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } #endif - IF( dataUnit ) - { - IF( dataUnit->partial_frame != 0 ) - { - hVoIP->lastDecodedWasActive = 1; - } - ELSE - { - hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; - } - move16(); + IF( dataUnit ) + { + IF( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + ELSE + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + move16(); - /* data unit memory is no longer used */ - JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); - } + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; - hIvasDec->nSamplesRendered = 0; - move16(); - move16(); - } -} + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; + hIvasDec->nSamplesRendered = 0; + move16(); + move16(); + } + } -/* decode */ -IF( !hIvasDec->hasBeenFedFirstGoodFrame ) -{ - /* codec mode to use not known yet - simply output silence */ - /* directly set output zero */ - Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); - set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); - nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); - move16(); - move16(); + /* decode */ + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + /* codec mode to use not known yet - simply output silence */ + /* directly set output zero */ + Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); + nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); + move16(); + move16(); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesToZero ); + update_voip_rendered20ms( hIvasDec, nSamplesToZero ); #endif -} -ELSE -{ - Word16 nSamplesToRender, nSamplesRendered_loop; - bool tmp; - nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); + } + ELSE + { + Word16 nSamplesToRender, nSamplesRendered_loop; + bool tmp; + nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); - /* render IVAS frames directly to the output buffer */ - IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* render IVAS frames directly to the output buffer */ + IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) + { + return error; + } - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); + update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); #endif -} -} + } + } -return IVAS_ERR_OK; + return IVAS_ERR_OK; } -// #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE /*---------------------------------------------------------------------* * update_voip_rendered20ms( ) -- GitLab From dbce6e5deb7e531db0649a10fa10fea8ed1d24ca Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 3 Jun 2025 16:32:43 +0200 Subject: [PATCH 0805/1310] run formatter again --- lib_dec/lib_dec_fx.c | 413 +++++++++++++++++++++---------------------- 1 file changed, 205 insertions(+), 208 deletions(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index a77f2a632..abb182425 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1062,136 +1062,134 @@ ivas_error IVAS_DEC_GetSamples( { /* check if we need to run the setup function */ test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) - { + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ){ /* setup */ - IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ){ + return error; + } +} +{ + /* check if we need to run the setup function, tc decoding and feeding the renderer */ + test(); + IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + { + Word16 nResidualSamples, nSamplesTcsScaled; + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + + test(); + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) + { + IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) { return error; } } + + /* IVAS decoder */ + IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) { - /* check if we need to run the setup function, tc decoding and feeding the renderer */ - test(); - IF( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) + return error; + } + + /* JBM */ + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) { - Word16 nResidualSamples, nSamplesTcsScaled; - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + return IVAS_ERR_UNKNOWN; + } - test(); - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm && NE_16( (Word16) nTransportChannels, hIvasDec->nTransportChannelsOld ) ) + // tmp apaExecBuffer + IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) + { + Word16 tmp_apaExecBuffer[APA_BUF]; + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) { - IF( NE_32( ( error = IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ) ), IVAS_ERR_OK ) ) - { - return error; - } + tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 } - - /* IVAS decoder */ - IF( NE_32( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hIvasDec->apaExecBuffer_fx, &nOutSamplesElse ) ), IVAS_ERR_OK ) ) + IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) { - return error; + return IVAS_ERR_UNKNOWN; } - - /* JBM */ - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) { - IF( apa_set_scale_fx( hIvasDec->hTimeScaler, hIvasDec->tsm_scale ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - - // tmp apaExecBuffer - IF( EQ_16( (Word16) hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) - { - Word16 tmp_apaExecBuffer[APA_BUF]; - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) - { - tmp_apaExecBuffer[i] = extract_l( L_shr( hIvasDec->apaExecBuffer_fx[i], Q11 ) ); // Q0 - } - IF( apa_exec_fx( hIvasDec->hTimeScaler, tmp_apaExecBuffer, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, tmp_apaExecBuffer, &nTimeScalerOutSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - FOR( Word32 i = 0; i < APA_BUF_PER_CHANNEL * nTransportChannels; ++i ) - { - hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 - } - } - ELSE - { - IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - } - assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); - nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); -#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - hIvasDec->timeScalingDone = 1; - move16(); -#endif + hIvasDec->apaExecBuffer_fx[i] = L_shl( tmp_apaExecBuffer[i], Q11 ); // Q11 } - ELSE + } + ELSE + { + IF( apa_exec_ivas_fx( hIvasDec->hTimeScaler, hIvasDec->apaExecBuffer_fx, (UWord16) imult3216( hIvasDec->nSamplesFrame, nTransportChannels ), (UWord16) hIvasDec->tsm_max_scaling, hIvasDec->apaExecBuffer_fx, &nTimeScalerOutSamples ) != 0 ) { - nSamplesTcsScaled = hIvasDec->nSamplesFrame; - move16(); + return IVAS_ERR_UNKNOWN; } + } + assert( LE_32( (Word32) nTimeScalerOutSamples, APA_BUF ) ); + nSamplesTcsScaled = idiv1616U( extract_l( nTimeScalerOutSamples ), nTransportChannels ); +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + hIvasDec->timeScalingDone = 1; + move16(); +#endif + } + ELSE + { + nSamplesTcsScaled = hIvasDec->nSamplesFrame; + move16(); + } #ifdef DEBUG_MODE_JBM - dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); + dbgwrite( &nTimeScalerOutSamples, sizeof( uint16_t ), 1, 1, "./res/JBM_nTimeScaleOutSamples.dat" ); #endif - /* Feed decoded transport channels samples to the renderer */ - IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* Feed decoded transport channels samples to the renderer */ + IF( NE_32( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hIvasDec->apaExecBuffer_fx ) ), IVAS_ERR_OK ) ) + { + return error; + } #ifdef DEBUG_MODE_JBM - dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); + dbgwrite( &nResidualSamples, sizeof( int16_t ), 1, 1, "./res/JBM_nResidualSamples.dat" ); #endif - IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) - { - /* feed residual samples to TSM for the next call */ - IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } - } - hIvasDec->hasBeenFedFrame = false; - move16(); - } - - /* render IVAS frames directly to the output buffer */ - nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); - IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); - nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); - IF( hIvasDec->nSamplesAvailableNext == 0 ) - { - *needNewFrame = true; - hIvasDec->needNewFrame = true; - move16(); - move16(); - } - ELSE + IF( hIvasDec->st_ivas->hDecoderConfig->Opt_tsm ) + { + /* feed residual samples to TSM for the next call */ + IF( apa_set_renderer_residual_samples( hIvasDec->hTimeScaler, (UWord16) nResidualSamples ) != 0 ) { - *needNewFrame = false; - move16(); + return IVAS_ERR_UNKNOWN; } } + hIvasDec->hasBeenFedFrame = false; + move16(); } - *nOutSamples = nSamplesRendered; - move16(); + /* render IVAS frames directly to the output buffer */ + nSamplesToRender = sub( nSamplesAsked, nSamplesRendered ); + IF( NE_32( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hIvasDec->nSamplesAvailableNext, pcmBuf + imult3216( nSamplesRendered, nOutChannels ) ) ), IVAS_ERR_OK ) ) + { + return error; + } - return IVAS_ERR_OK; + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesToRender = sub( nSamplesToRender, nSamplesRendered_loop ); + IF( hIvasDec->nSamplesAvailableNext == 0 ) + { + *needNewFrame = true; + hIvasDec->needNewFrame = true; + move16(); + move16(); + } + ELSE + { + *needNewFrame = false; + move16(); + } +} +} + +*nOutSamples = nSamplesRendered; +move16(); + +return IVAS_ERR_OK; } @@ -2791,142 +2789,141 @@ ivas_error IVAS_DEC_VoIP_GetSamples( dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); #endif /* avoid time scaling multiple times in one sound card slot */ - IF( NE_64( scale, 100U ) ) - { + IF( NE_64( scale, 100U ) ){ #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE IF( hIvasDec->timeScalingDone ) #else IF( timeScalingDone ) #endif - { - scale = 100; - move32(); - } + { + scale = 100; + move32(); + } #ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - ELSE - { - timeScalingDone = 1; - move16(); - } + ELSE + { + timeScalingDone = 1; + move16(); + } #endif - } + } - /* limit scale to range supported by time scaler */ - IF( LT_32( scale, APA_MIN_SCALE ) ) - { - scale = APA_MIN_SCALE; - move32(); - } - ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) - { - scale = APA_MAX_SCALE; - move32(); - } + /* limit scale to range supported by time scaler */ + IF( LT_32( scale, APA_MIN_SCALE ) ) + { + scale = APA_MIN_SCALE; + move32(); + } + ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) + { + scale = APA_MAX_SCALE; + move32(); + } - IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) + { + return error; + } - /* copy bitstream into decoder state */ - IF( dataUnit ) - { - hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + /* copy bitstream into decoder state */ + IF( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; - bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) - { - /* Decoder has been initialized with first good frame - do PLC */ - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } #ifdef SUPPORT_JBM_TRACEFILE - /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ - test(); - IF( jbmWriterFn != NULL && jbmWriter != NULL ) - { - /* write JBM trace data entry */ - store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); - IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError writing JBM Trace data to file\n" ); - return IVAS_ERR_UNKNOWN; - } - } + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + test(); + IF( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } #endif - IF( dataUnit ) - { - IF( dataUnit->partial_frame != 0 ) - { - hVoIP->lastDecodedWasActive = 1; - } - ELSE - { - hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; - } - move16(); + IF( dataUnit ) + { + IF( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + ELSE + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + move16(); - /* data unit memory is no longer used */ - JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); - } + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; - hIvasDec->nSamplesRendered = 0; - move16(); - move16(); - } - } + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; + hIvasDec->nSamplesRendered = 0; + move16(); + move16(); + } +} - /* decode */ - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - /* codec mode to use not known yet - simply output silence */ - /* directly set output zero */ - Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); - set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); - nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); - move16(); - move16(); +/* decode */ +IF( !hIvasDec->hasBeenFedFirstGoodFrame ) +{ + /* codec mode to use not known yet - simply output silence */ + /* directly set output zero */ + Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); + nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); + move16(); + move16(); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesToZero ); + update_voip_rendered20ms( hIvasDec, nSamplesToZero ); #endif - } - ELSE - { - Word16 nSamplesToRender, nSamplesRendered_loop; - bool tmp; - nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); +} +ELSE +{ + Word16 nSamplesToRender, nSamplesRendered_loop; + bool tmp; + nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); - /* render IVAS frames directly to the output buffer */ - IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* render IVAS frames directly to the output buffer */ + IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) + { + return error; + } - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); + update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); #endif - } - } +} +} - return IVAS_ERR_OK; +return IVAS_ERR_OK; } #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE -- GitLab From 7f30144ba1767174ab29777070380b4df55cf488 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 4 Jun 2025 10:49:42 +0530 Subject: [PATCH 0806/1310] Fix for 3GPP issue 1722: Assert in BASOP renderer when rendering ISM to certain custom LS setup Link #1722 Increased precision in in_tri function fixes the issue --- lib_rend/ivas_efap_fx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_efap_fx.c b/lib_rend/ivas_efap_fx.c index 4fb88643b..3a4ddde1e 100644 --- a/lib_rend/ivas_efap_fx.c +++ b/lib_rend/ivas_efap_fx.c @@ -2490,7 +2490,8 @@ static Word16 in_tri_fx( Word32 tmpDot1[2], tmpDot2[2]; Word32 matInv[2][2]; Word32 invFactor; - Word16 tmp16, tmp_e; + Word16 tmp_e; + Word32 tmp32; Word64 S[2]; /* Threshold adjusted */ Word64 thresh_int = 35184640; // 1e-6f in Q45 @@ -2520,8 +2521,8 @@ static Word16 in_tri_fx( } /* invFactor = 1.f / invFactor; */ - tmp16 = BASOP_Util_Divide3232_Scale( ONE_IN_Q13, invFactor, &tmp_e ); /*15-tmp_e*/ - invFactor = L_shl_sat( tmp16, add( Q16, tmp_e ) ); /* Q31 */ + tmp32 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q13, invFactor, &tmp_e ); /*31-tmp_e*/ + invFactor = L_shl_sat( tmp32, tmp_e ); /* Q31 */ Word16 invFactor_exp = norm_l( invFactor ); invFactor = L_shl( invFactor, invFactor_exp ); // 31+invFactor_exp -- GitLab From 9281becbefa13ab56fce58ddcd9ecfee17dbc0a2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 4 Jun 2025 10:54:36 +0530 Subject: [PATCH 0807/1310] Clang formatting changes --- lib_rend/ivas_efap_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_efap_fx.c b/lib_rend/ivas_efap_fx.c index 3a4ddde1e..fbcfdfe77 100644 --- a/lib_rend/ivas_efap_fx.c +++ b/lib_rend/ivas_efap_fx.c @@ -2522,7 +2522,7 @@ static Word16 in_tri_fx( /* invFactor = 1.f / invFactor; */ tmp32 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q13, invFactor, &tmp_e ); /*31-tmp_e*/ - invFactor = L_shl_sat( tmp32, tmp_e ); /* Q31 */ + invFactor = L_shl_sat( tmp32, tmp_e ); /* Q31 */ Word16 invFactor_exp = norm_l( invFactor ); invFactor = L_shl( invFactor, invFactor_exp ); // 31+invFactor_exp -- GitLab From 7ef8ea8a57c6b04c40eb4502f9722e11fff507bd Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 4 Jun 2025 12:52:12 +0530 Subject: [PATCH 0808/1310] Cleanup of synth_fx_32 buffer in ivas_mct_dec_fx, enhancer_ivas_fx function --- lib_com/enhancer_fx.c | 221 ++---------------------------- lib_com/prot_fx.h | 22 +-- lib_dec/dec_gen_voic_fx.c | 4 +- lib_dec/ivas_mct_dec_fx.c | 5 +- lib_dec/ivas_td_low_rate_dec_fx.c | 4 +- 5 files changed, 16 insertions(+), 240 deletions(-) diff --git a/lib_com/enhancer_fx.c b/lib_com/enhancer_fx.c index 7df474a5d..620904d08 100644 --- a/lib_com/enhancer_fx.c +++ b/lib_com/enhancer_fx.c @@ -299,10 +299,11 @@ void enhancer_fx( /* RETURN ARGUMENTS : */ /* _ None */ /*======================================================================================*/ + void enhancer_ivas_fx( - const Word16 codec_mode, /* i : flag indicating Codec Mode */ - const Word32 core_brate, /* i : decoder bitrate */ - const Word16 cbk_index, /* i : */ + const Word16 codec_mode, /* i : flag indicating Codec Mode */ + const Word32 core_brate, /* i : decoder bitrate */ + const Word16 cbk_index, const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ const Word16 coder_type, /* i : coder type */ const Word16 i_subfr, /* i : subframe number */ @@ -322,9 +323,11 @@ void enhancer_ivas_fx( Word16 tmp, fac, *pt_exc2; Word16 i; Word32 L_tmp; + Word32 L_tmp1, L_tmp2; Word16 gain_code_hi; Word16 pit_sharp, tmp16; Word16 excp[L_SUBFR], sc; + Word64 w_temp; pit_sharp = gain_pit; @@ -400,215 +403,6 @@ void enhancer_ivas_fx( phase_dispersion_fx( norm_gain_code, gain_pit, code, i, dm_fx ); - /*------------------------------------------------------------ - * noise enhancer - * - * - Enhance excitation on noise. (modify gain of code) - * If signal is noisy and LPC filter is stable, move gain - * of code 1.5 dB toward gain of code threshold. - * This decreases by 3 dB noise energy variation. - *-----------------------------------------------------------*/ - - /* tmp = 0.5f * (1.0f - voice_fac) */ - tmp = msu_r_sat( 0x40000000 /*0.5.Q31*/, voice_fac, 16384 /*0.5.Q14*/ ); /*Q15 */ /* 1=unvoiced, 0=voiced */ - /* fac = stab_fac * tmp */ - fac = mult( stab_fac, tmp ); /*Q15*/ - - IF( LT_32( norm_gain_code, *gc_threshold ) ) - { - L_tmp = Madd_32_16( norm_gain_code, norm_gain_code, 6226 /*0.19.Q15*/ ); /*Q16 */ - L_tmp = L_min( L_tmp, *gc_threshold ); /*Q16 */ - } - ELSE - { - L_tmp = Mult_32_16( norm_gain_code, 27536 /*0.84.Q15*/ ); /*Q16 */ - L_tmp = L_max( L_tmp, *gc_threshold ); /*Q16 */ - } - *gc_threshold = L_tmp; - move32(); /*Q16 */ - - /* gain_code = (fac * tmp) + (1.0 - fac) * gain_code ==> fac * (tmp - gain_code) + gain_code */ - L_tmp = L_sub( L_tmp, norm_gain_code ); /*Q16 */ - norm_gain_code = Madd_32_16( norm_gain_code, L_tmp, fac ); /*Q16 */ - - /* gain_code *= gain_inov - Inverse the normalization */ - L_tmp = Mult_32_16( norm_gain_code, gain_inov ); /*Q13*/ /* gain_inov in Q12 */ - - sc = 6; - move16(); - - gain_code_hi = round_fx( L_shl( L_tmp, add( Q_exc, 3 ) ) ); /* in Q_exc */ - - /*------------------------------------------------------------* - * pitch enhancer - * - * - Enhance excitation on voiced. (HP filtering of code) - * On voiced signal, filtering of code by a smooth fir HP - * filter to decrease energy of code at low frequency. - *------------------------------------------------------------*/ - test(); - IF( !Opt_AMR_WB && EQ_16( coder_type, UNVOICED ) ) - { - /* Copy(code, exc2, L_SUBFR) */ - FOR( i = 0; i < L_SUBFR; i++ ) - { - pt_exc2[i] = round_fx( L_shl( L_mult( gain_code_hi, code[i] ), sc ) ); /*Q0 */ /* code in Q12 (Q9 for encoder) */ - move16(); - } - } - ELSE - { - test(); - test(); - IF( Opt_AMR_WB && ( EQ_32( core_brate, ACELP_8k85 ) || EQ_32( core_brate, ACELP_6k60 ) ) ) - { - pit_sharp = shl_sat( gain_pit, 1 ); /* saturation can occur here Q14 -> Q15 */ - /* saturation takes care of "if (pit_sharp > 1.0) { pit_sharp=1.0; }" */ - IF( GT_16( pit_sharp, 16384 /*0.5.Q15*/ ) ) - { - tmp16 = mult( pit_sharp, 8192 /*0.25.Q15*/ ); - FOR( i = 0; i < L_SUBFR; i++ ) - { - /* excp[i] = pt_exc2[i] * pit_sharp * 0.25 */ - excp[i] = mult_r( pt_exc2[i], tmp16 ); - move16(); - } - } - } - - IF( EQ_16( L_frame, L_FRAME16k ) ) - { - /* tmp = 0.150 * (1.0 + voice_fac) */ - /* 0.30=voiced, 0=unvoiced */ - tmp = mac_r( 0x13333333L /*0.150.Q31*/, voice_fac, 4915 /*0.150.Q15*/ ); /*Q15 */ - } - ELSE - { - /* tmp = 0.125 * (1.0 + voice_fac) */ - /* 0.25=voiced, 0=unvoiced */ - tmp = mac_r( 0x10000000L /*0.125.Q31*/, voice_fac, 4096 ); /*Q15 */ - } - - /*----------------------------------------------------------------- - * Do a simple noncasual "sharpening": effectively an FIR - * filter with coefs [-tmp 1.0 -tmp] where tmp=0...0.25. - * This is applied to code and add_fxed to exc2 - *-----------------------------------------------------------------*/ - /* pt_exc2[0] += code[0] - tmp * code[1] */ - L_tmp = L_deposit_h( code[0] ); /* if Enc :Q9 * Q15 -> Q25 */ - L_tmp = L_msu( L_tmp, code[1], tmp ); /* Q12 * Q15 -> Q28 */ - L_tmp = L_shl( L_mult( gain_code_hi, extract_h( L_tmp ) ), sc ); - pt_exc2[0] = msu_r( L_tmp, -32768, pt_exc2[0] ); - move16(); /* in Q_exc */ - - FOR( i = 1; i < L_SUBFR - 1; i++ ) - { - /* pt_exc2[i] += code[i] - tmp * code[i-1] - tmp * code[i+1] */ - L_tmp = L_msu( -32768, code[i], -32768 ); - L_tmp = L_msu( L_tmp, code[i + 1], tmp ); - tmp16 = msu_r( L_tmp, code[i - 1], tmp ); - L_tmp = L_shl( L_mult( gain_code_hi, tmp16 ), sc ); - pt_exc2[i] = msu_r_sat( L_tmp, -32768, pt_exc2[i] ); - move16(); /* in Q_exc */ - } - - /* pt_exc2[L_SUBFR-1] += code[L_SUBFR-1] - tmp * code[L_SUBFR-2] */ - L_tmp = L_deposit_h( code[L_SUBFR - 1] ); /*Q28 */ - L_tmp = L_msu( L_tmp, code[L_SUBFR - 2], tmp ); /*Q28 */ - L_tmp = L_shl( L_mult( gain_code_hi, extract_h( L_tmp ) ), sc ); - pt_exc2[L_SUBFR - 1] = msu_r( L_tmp, -32768, pt_exc2[L_SUBFR - 1] ); - move16(); /* in Q_exc */ - test(); - test(); - IF( Opt_AMR_WB && ( EQ_32( core_brate, ACELP_8k85 ) || EQ_32( core_brate, ACELP_6k60 ) ) ) - { - IF( GT_16( pit_sharp, 16384 /*0.5.Q14*/ ) ) - { - FOR( i = 0; i < L_SUBFR; i++ ) - { - /* excp[i] += pt_exc2[i] */ - excp[i] = add( excp[i], pt_exc2[i] ); - move16(); - } - agc2_fx( pt_exc2, excp, L_SUBFR ); - Copy( excp, pt_exc2, L_SUBFR ); - } - } - } -} - -void enhancer_ivas_fx2( - const Word32 core_brate, /* i : decoder bitrate */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 coder_type, /* i : coder type */ - const Word16 i_subfr, /* i : subframe number */ - const Word16 L_frame, /* i : frame size */ - const Word16 voice_fac, /* i : subframe voicing estimation Q15 */ - const Word16 stab_fac, /* i : LP filter stablility measure Q15 */ - Word32 norm_gain_code, /* i : normalised innovative cb. gain Q16 */ - const Word16 gain_inov, /* i : gain of the unscaled innovation Q12 */ - Word32 *gc_threshold, /* i/o: gain code threshold Q16 */ - Word16 *code, /* i/o: innovation Q12 */ - Word16 *exc2, /* i/o: adapt. excitation/total exc. Q_exc*/ - const Word16 gain_pit, /* i : quantized pitch gain Q14 */ - struct dispMem_fx *dm_fx, /* i/o: phase dispersion algorithm memory */ - const Word16 Q_exc /* i : Q of the excitation */ -) -{ - Word16 tmp, fac, *pt_exc2; - Word16 i; - Word32 L_tmp; - Word32 L_tmp1, L_tmp2; - Word16 gain_code_hi; - Word16 pit_sharp, tmp16; - Word16 excp[L_SUBFR], sc; - Word64 w_temp; - - - pit_sharp = gain_pit; - move16(); /* to remove gcc warning */ - pt_exc2 = exc2 + i_subfr; - - /*------------------------------------------------------------* - * Phase dispersion to enhance noise at low bit rate - *------------------------------------------------------------*/ - - i = 2; - move16(); /* no dispersion */ - IF( Opt_AMR_WB ) - { - IF( LE_32( core_brate, ACELP_6k60 ) ) - { - i = 0; - move16(); /* high dispersion */ - } - ELSE IF( LE_32( core_brate, ACELP_8k85 ) ) - { - i = 1; - move16(); /* low dispersion */ - } - } - ELSE IF( NE_16( coder_type, UNVOICED ) ) - - { - test(); - test(); - test(); - test(); - IF( LE_32( core_brate, ACELP_7k20 ) ) - { - i = 0; - move16(); /* high dispersion */ - } - ELSE IF( ( EQ_16( coder_type, GENERIC ) || EQ_16( coder_type, TRANSITION ) || EQ_16( coder_type, AUDIO ) || coder_type == INACTIVE ) && LE_32( core_brate, ACELP_9k60 ) ) - { - i = 1; - move16(); /* low dispersion */ - } - } - - phase_dispersion_fx( norm_gain_code, gain_pit, code, i, dm_fx ); - /*------------------------------------------------------------ * noise enhancer * @@ -656,7 +450,8 @@ void enhancer_ivas_fx2( * filter to decrease energy of code at low frequency. *------------------------------------------------------------*/ test(); - IF( !Opt_AMR_WB && EQ_16( coder_type, UNVOICED ) ) + test(); + IF( !Opt_AMR_WB && EQ_16( codec_mode, MODE1 ) && EQ_16( coder_type, UNVOICED ) ) { /* Copy(code, exc2, L_SUBFR) */ FOR( i = 0; i < L_SUBFR; i++ ) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index b2df3a736..0a11364dc 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -5622,27 +5622,9 @@ void enhancer_fx( ); void enhancer_ivas_fx( - const Word16 codec_mode, /* i : flag indicating Codec Mode */ - const Word32 core_brate, /* i : decoder bitrate */ - const Word16 cbk_index, /* i : */ - const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ - const Word16 coder_type, /* i : coder type */ - const Word16 i_subfr, /* i : subframe number */ - const Word16 L_frame, /* i : frame size */ - const Word16 voice_fac, /* i : subframe voicing estimation Q15 */ - const Word16 stab_fac, /* i : LP filter stablility measure Q15 */ - Word32 norm_gain_code, /* i : normalised innovative cb. gain Q16 */ - const Word16 gain_inov, /* i : gain of the unscaled innovation Q12 */ - Word32 *gc_threshold, /* i/o: gain code threshold Q16 */ - Word16 *code, /* i/o: innovation Q12 */ - Word16 *exc2, /* i/o: adapt. excitation/total exc. Q_exc*/ - const Word16 gain_pit, /* i : quantized pitch gain Q14 */ - struct dispMem_fx *dm_fx, /* i/o: phase dispersion algorithm memory */ - const Word16 Q_exc /* i : Q of the excitation */ -); - -void enhancer_ivas_fx2( + const Word16 codec_mode, /* i : flag indicating Codec Mode */ const Word32 core_brate, /* i : decoder bitrate */ + const Word16 cbk_index, /* i : */ const Word16 Opt_AMR_WB, /* i : flag indicating AMR-WB IO mode */ const Word16 coder_type, /* i : coder type */ const Word16 i_subfr, /* i : subframe number */ diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 3e42d9535..b9f488942 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -344,8 +344,8 @@ ivas_error decod_gen_voic_fx( } ELSE { - enhancer_ivas_fx2( st_fx->core_brate, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, - norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); + enhancer_ivas_fx( MODE1, st_fx->core_brate, -1, 0, st_fx->coder_type, i_subfr_fx, L_frame, voice_fac_fx, st_fx->stab_fac_fx, + norm_gain_code_fx, gain_inov_fx, &st_fx->gc_threshold_fx, code_fx, exc2_fx, gain_pit_fx, &( st_fx->dm_fx ), st_fx->Q_exc ); } } diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index b34ce0c56..ec7b8c697 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -85,7 +85,7 @@ ivas_error ivas_mct_dec_fx( set16_fx( x_len[1], 0, NB_DIV ); Decoder_State **sts; Word32 *p_output_orig_fx[2]; - Word32 synth_32_fx[CPE_CHANNELS][L_FRAME_PLUS]; + Word32 synth_fx_32[CPE_CHANNELS][L_FRAME_PLUS]; Word16 synth_fx[CPE_CHANNELS][L_FRAME_PLUS]; //(Q_synth) Word32 ivas_total_brate; ivas_error error; @@ -168,7 +168,7 @@ ivas_error ivas_mct_dec_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { p_output_orig_fx[n] = output_fx[n]; - output_fx[n] = synth_32_fx[n]; + output_fx[n] = synth_fx_32[n]; } } @@ -390,7 +390,6 @@ ivas_error ivas_mct_dec_fx( /*----------------------------------------------------------------* * CoreCoder Post-processing and updates *----------------------------------------------------------------*/ - Word32 synth_fx_32[CPE_CHANNELS][L_FRAME48k]; FOR( n = 0; n < CPE_CHANNELS; n++ ) { diff --git a/lib_dec/ivas_td_low_rate_dec_fx.c b/lib_dec/ivas_td_low_rate_dec_fx.c index 6419f8517..f48d3fabc 100644 --- a/lib_dec/ivas_td_low_rate_dec_fx.c +++ b/lib_dec/ivas_td_low_rate_dec_fx.c @@ -329,9 +329,9 @@ void decod_gen_2sbfr_fx( * called twice because adapting it to double the subfr length would need lot of modifications *----------------------------------------------------------------*/ - enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code, exc2, gain_pit, &st->dm_fx, st->Q_exc ); + enhancer_ivas_fx( MODE1, st->core_brate, -1, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code, exc2, gain_pit, &st->dm_fx, st->Q_exc ); - enhancer_ivas_fx2( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code + L_SUBFR, exc2 + L_SUBFR, gain_pit, &st->dm_fx, st->Q_exc ); + enhancer_ivas_fx( MODE1, st->core_brate, -1, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code + L_SUBFR, exc2 + L_SUBFR, gain_pit, &st->dm_fx, st->Q_exc ); p_Aq += 2 * ( M + 1 ); /* Q12 */ -- GitLab From 2282b282328e9c151b1d0e62d1650a509f2bb3e2 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 4 Jun 2025 10:42:56 +0200 Subject: [PATCH 0809/1310] replace modulo operator with loop --- lib_dec/lib_dec_fx.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index abb182425..80f7f9685 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2946,7 +2946,14 @@ static void update_voip_rendered20ms( hIvasDec->timeScalingDone = 0; move16(); } - hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal % hIvasDec->hVoIP->nSamplesFrame; + + /* float code was: hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal % hIvasDec->hVoIP->nSamplesFrame; */ + hIvasDec->hVoIP->nSamplesRendered20ms = nSamplesRenderedTotal; + move16(); + WHILE( GE_16( hIvasDec->hVoIP->nSamplesRendered20ms, hIvasDec->hVoIP->nSamplesFrame ) ) + { + hIvasDec->hVoIP->nSamplesRendered20ms = sub( hIvasDec->hVoIP->nSamplesRendered20ms, hIvasDec->hVoIP->nSamplesFrame ); + } } #endif -- GitLab From 36fea33c8cea65cbb0b45c55de2f720f03657d83 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 4 Jun 2025 12:45:38 +0200 Subject: [PATCH 0810/1310] fix comparison typo --- lib_dec/lib_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 80f7f9685..ce7af9ef8 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2986,7 +2986,7 @@ ivas_error IVAS_DEC_Flush( error = IVAS_ERR_OK; test(); - IF( GE_16( nSamplesToRender, 0 ) && NE_16( hIvasDec->st_ivas->ivas_format, MONO_FORMAT ) ) + IF( GT_16( nSamplesToRender, 0 ) && NE_16( (Word16) hIvasDec->st_ivas->ivas_format, (Word16) MONO_FORMAT ) ) { #endif error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hIvasDec->nSamplesAvailableNext, pcmBuf ); -- GitLab From 4b4940d8ab77d42f06026a37c733ed4ff60b385b Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:35:30 +0200 Subject: [PATCH 0811/1310] =?UTF-8?q?=C3=84dded=20compiler=20switch=20+=20?= =?UTF-8?q?logic=20for=20rt60=20and=20dsr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib_com/options.h | 2 +- lib_util/render_config_reader.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3315e495e..50db4e9e5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -126,7 +126,7 @@ #endif - +#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index a1f806d6b..dae55f18c 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2255,7 +2255,11 @@ ivas_error RenderConfigReader_read( /* RT60 */ else if ( strcmp( item, "RT60" ) == 0 ) { +#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE + if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) +#else if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) +#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; @@ -2265,7 +2269,11 @@ ivas_error RenderConfigReader_read( /* DSR */ else if ( strcmp( item, "DSR" ) == 0 ) { +#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE + if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) +#else if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) +#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; -- GitLab From d72e34237b2f0894b607017aa676704f641841a2 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:45:47 +0200 Subject: [PATCH 0812/1310] commit for push --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 50db4e9e5..99013a1c5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -126,7 +126,7 @@ #endif -#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ +//#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ -- GitLab From d82c0de87438e2a1e95de57a7415935886296a9d Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 4 Jun 2025 14:14:07 +0200 Subject: [PATCH 0813/1310] restart CI -- GitLab From 14e3697e827be3335fd55b4a814ea5ac71ffad7e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 5 Jun 2025 08:43:10 +0530 Subject: [PATCH 0814/1310] Fix for 3GPP issue 1020: ParamISM: Binaural: HF click Link #1020 --- lib_dec/acelp_core_dec_fx.c | 12 ++++++++-- lib_dec/stat_dec.h | 3 ++- lib_dec/swb_tbe_dec_fx.c | 46 ++++++++++++++++++++++--------------- lib_dec/updt_dec_fx.c | 2 ++ 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index fd0c8ce2d..37d284346 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -2326,6 +2326,11 @@ ivas_error acelp_core_dec_fx( st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move32(); set16_fx( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + if ( NE_16( st->element_mode, EVS_MONO ) ) + { + st->hBWE_TD->q_old_bwe_exc_extended_fx = 0; + move16(); + } } test(); @@ -2341,9 +2346,12 @@ ivas_error acelp_core_dec_fx( } ELSE { - Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + Copy_Scale_sig_16_32_no_sat( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( st->Q_exc, 1 ), st->hBWE_TD->q_old_bwe_exc_extended_fx ) ) ); /* Q(q_old_bwe_exc_extended_fx) -> Q(2 * Q_exc) */ non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, st->Q_exc, st->coder_type, voice_factors_fx, st->L_frame ); - Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( st->Q_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + exp = sub( L_norm_arr( bwe_exc_extended_fx + L_FRAME32k, NL_BUFF_OFFSET ), 16 ); + Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, exp ); /* Q(2 * Q_exc) -> Q(q_old_bwe_exc_extended_fx) */ + st->hBWE_TD->q_old_bwe_exc_extended_fx = add( shl( st->Q_exc, 1 ), exp ); + move16(); } } diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 4e4e33c36..28a97f072 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -822,7 +822,8 @@ typedef struct td_bwe_dec_structure Word16 old_bwe_exc_fx[PIT16k_MAX * 2]; /*Q_exc*/ Word16 bwe_seed[2]; Word32 bwe_non_lin_prev_scale_fx; - Word16 old_bwe_exc_extended_fx[NL_BUFF_OFFSET]; + Word16 old_bwe_exc_extended_fx[NL_BUFF_OFFSET]; /* EVS : Q(prev_Q_bwe_exc - 16), IVAS : Q(q_old_bwe_exc_extended_fx) */ + Word16 q_old_bwe_exc_extended_fx; Word32 genSHBsynth_Hilbert_Mem_fx[HILBERT_MEM_SIZE]; diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index bd8700063..b005a88bf 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -56,10 +56,13 @@ static void find_max_mem_dec( hBWE_TD = st_fx->hBWE_TD; /* old BWE exc max */ - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - tempQ15 = abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ); - max = s_max( max, tempQ15 ); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + tempQ15 = abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ); + max = s_max( max, tempQ15 ); + } } /* decimate all-pass steep memory */ @@ -232,10 +235,13 @@ static void rescale_genSHB_mem_dec( TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); - move16(); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); + move16(); + } } FOR( i = 0; i < 7; i++ ) @@ -283,9 +289,12 @@ void find_max_mem_wb( Decoder_State *st_fx, Word16 *n_mem ) TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - max = s_max( max, abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ) ); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + max = s_max( max, abs_s( hBWE_TD->old_bwe_exc_extended_fx[i] ) ); + } } FOR( i = 0; i < 7; i++ ) { @@ -362,10 +371,13 @@ void rescale_genWB_mem( Decoder_State *st_fx, Word16 sf ) TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) { - hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); - move16(); + FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) + { + hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); + move16(); + } } FOR( i = 0; i < 10; i++ ) @@ -418,6 +430,8 @@ static void InitSWBdecBuffer_fx( move16(); set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + hBWE_TD->q_old_bwe_exc_extended_fx = 0; + move16(); hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move16(); @@ -5375,12 +5389,6 @@ static void rescale_genSHB_mem_dec_ivas( TD_BWE_DEC_HANDLE hBWE_TD; hBWE_TD = st_fx->hBWE_TD; - FOR( i = 0; i < NL_BUFF_OFFSET; i++ ) - { - hBWE_TD->old_bwe_exc_extended_fx[i] = shl( hBWE_TD->old_bwe_exc_extended_fx[i], sf ); - move16(); - } - FOR( i = 0; i < 7; i++ ) { hBWE_TD->mem_genSHBexc_filt_down_shb_fx[i] = shl( hBWE_TD->mem_genSHBexc_filt_down_shb_fx[i], sf ); @@ -6147,7 +6155,7 @@ void ivas_swb_tbe_dec_fx( /* ----- calculate optimum Q_bwe_exc and rescale memories accordingly ----- */ Lmax = 0; move32(); - FOR( cnt = 0; cnt < L_FRAME32k; cnt++ ) + FOR( cnt = 0; cnt < L_FRAME32k + NL_BUFF_OFFSET; cnt++ ) { Lmax = L_max( Lmax, L_abs( bwe_exc_extended_fx[cnt] ) ); } @@ -6177,7 +6185,7 @@ void ivas_swb_tbe_dec_fx( /* rescale the bwe_exc_extended and bring it to 16-bit single precision with dynamic norm */ sc = sub( Q_bwe_exc, add( Q_exc, Q_exc ) ); - FOR( cnt = 0; cnt < L_FRAME32k; cnt++ ) + FOR( cnt = 0; cnt < L_FRAME32k + NL_BUFF_OFFSET; cnt++ ) { bwe_exc_extended_16[cnt] = round_fx_sat( L_shl_sat( bwe_exc_extended_fx[cnt], sc ) ); move16(); diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index 81046fb19..7af4dec1a 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -240,6 +240,8 @@ void updt_IO_switch_dec_fx( { set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); + hBWE_TD->q_old_bwe_exc_extended_fx = 0; + move16(); hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move16(); -- GitLab From 799da60a2c5a1bd2b5b3b6afc937dd4abbdc6fa5 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 22 May 2025 09:41:47 +0200 Subject: [PATCH 0815/1310] port MR 1411 from float fix different external target extrapolation between framesizes --- lib_com/options.h | 2 ++ lib_rend/ivas_rotation_fx.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 3315e495e..1801f330c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -138,6 +138,8 @@ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ +#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ + /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index aaae3e199..154dab321 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1379,6 +1379,7 @@ ivas_error ivas_combined_orientation_open( move32(); ( *hCombinedOrientationData )->interpolationIncrement_fx = ONE_IN_Q30; // Q30 move32(); +#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION IF( EQ_16( num_subframes, 1 ) ) { ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 2000; @@ -1386,9 +1387,12 @@ ivas_error ivas_combined_orientation_open( } ELSE { +#endif ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; move16(); +#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION } +#endif ( *hCombinedOrientationData )->lrSwitchedNext = 0; move16(); ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; -- GitLab From b7cb47dc09e7ce88dc1f2552bbb09dd88076c748 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 5 Jun 2025 12:47:31 +0530 Subject: [PATCH 0816/1310] Review comments addressing --- lib_dec/acelp_core_dec_fx.c | 2 +- lib_dec/swb_tbe_dec_fx.c | 2 +- lib_dec/updt_dec_fx.c | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 37d284346..847e16594 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -2328,7 +2328,7 @@ ivas_error acelp_core_dec_fx( set16_fx( st->hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); if ( NE_16( st->element_mode, EVS_MONO ) ) { - st->hBWE_TD->q_old_bwe_exc_extended_fx = 0; + st->hBWE_TD->q_old_bwe_exc_extended_fx = Q15; move16(); } } diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index b005a88bf..1234e2853 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -430,7 +430,7 @@ static void InitSWBdecBuffer_fx( move16(); set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); - hBWE_TD->q_old_bwe_exc_extended_fx = 0; + hBWE_TD->q_old_bwe_exc_extended_fx = Q15; move16(); hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move16(); diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index 7af4dec1a..81046fb19 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -240,8 +240,6 @@ void updt_IO_switch_dec_fx( { set16_fx( hBWE_TD->old_bwe_exc_fx, 0, PIT16k_MAX * 2 ); set16_fx( hBWE_TD->old_bwe_exc_extended_fx, 0, NL_BUFF_OFFSET ); - hBWE_TD->q_old_bwe_exc_extended_fx = 0; - move16(); hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move16(); -- GitLab From f874b377fb9be35147ceda399fb2653038557d1f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 5 Jun 2025 09:31:10 +0200 Subject: [PATCH 0817/1310] Add FIX_USAN_BASOP_UTIL_DIVIDE3232 to address USAN in BASOP_Util_Divide3232_Scale_newton --- lib_com/basop_util.c | 4 ++++ lib_com/options.h | 1 + 2 files changed, 5 insertions(+) diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index e52f404f6..3d6324783 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -1409,7 +1409,11 @@ Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, Word32 y, Word16 *s ) *s = 0; return ( (Word32) 0 ); } +#ifdef FIX_USAN_BASOP_UTIL_DIVIDE3232 + IF( EQ_32( y, (Word32) 0x80000000 ) ) +#else IF( EQ_32( y, 0x80000000 ) ) +#endif { /* Division by -1.0: same as negation of numerator */ /* Return normalized negated numerator */ diff --git a/lib_com/options.h b/lib_com/options.h index a5d5a4846..fe44eae00 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -105,5 +105,6 @@ #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ #define FIX_1713_EXP /* VA: proposed correction to exp in ic-BWE*/ +#define FIX_USAN_BASOP_UTIL_DIVIDE3232 /* Eri: Fix USAN error in BASOP_Util_Divide3232_Scale_newton by adding explicit type cast for -1 in hex */ #endif -- GitLab From 9a6b8df96f3a92e5592c223c8bb6a81325b44bfb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 5 Jun 2025 14:47:00 +0530 Subject: [PATCH 0818/1310] Fix for 3GPP issue 1728: Renderer crash with assertion in OMASA to MASA output (renderIsmToMasa) Link #1728, #1729 This change fixes issue #1729 as well --- lib_rend/lib_rend_fx.c | 45 +++++++++++------------------------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index e39b9a61e..4b98684fb 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5530,53 +5530,32 @@ static void renderIsmToMasa( Word16 *exp ) { Word32 tmpRendBuffer_fx[MAX_NUM_OBJECTS][L_FRAME48k]; - Word16 i, j; - Word16 q_fact; + Word16 i, guard_bits, q_min, q_diff; push_wmops( "renderIsmToMasa" ); - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) - { - set32_fx( tmpRendBuffer_fx[i], 0, L_FRAME48k ); - } - copyBufferTo2dArray_fx( ismInput->base.inputBuffer, tmpRendBuffer_fx ); - Word16 input_e[MAX_NUM_OBJECTS], max_e; - - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) - { - input_e[i] = sub( 31, add( getScaleFactor32( tmpRendBuffer_fx[i], L_FRAME48k ), *outAudio.pq_fact ) ); - move16(); - } - Word16 guard_bits = find_guarded_bits_fx( L_FRAME48k ); - max_e = input_e[0]; + q_min = MAX_16; move16(); - FOR( i = 1; i < MAX_NUM_OBJECTS; i++ ) + FOR( i = 0; i < ismInput->base.inputBuffer.config.numChannels; i++ ) { - if ( LT_16( max_e, input_e[0] ) ) - { - max_e = input_e[i]; - move16(); - } + q_min = s_min( q_min, L_norm_arr( tmpRendBuffer_fx[i], ismInput->base.inputBuffer.config.numSamplesPerChannel ) ); } - FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) + guard_bits = find_guarded_bits_fx( ismInput->base.inputBuffer.config.numSamplesPerChannel ); + q_min = sub( add( q_min, *outAudio.pq_fact ), guard_bits ); + q_diff = sub( q_min, *outAudio.pq_fact ); + + FOR( i = 0; i < ismInput->base.inputBuffer.config.numChannels; i++ ) { - FOR( j = 0; j < L_FRAME48k; j++ ) - { - tmpRendBuffer_fx[i][j] = L_shr( tmpRendBuffer_fx[i][j], add( sub( max_e, sub( 31, *outAudio.pq_fact ) ), guard_bits ) ); /* Q(31 - (max_e + guard_bits)) */ - move32(); - } + scale_sig32( tmpRendBuffer_fx[i], ismInput->base.inputBuffer.config.numSamplesPerChannel, q_diff ); // *outAudio.pq_fact -> q_min } - max_e = add( max_e, guard_bits ); - q_fact = sub( Q31, max_e ); - - ivas_omasa_ana_fx( ismInput->hOMasa, tmpRendBuffer_fx, &q_fact, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels ); + ivas_omasa_ana_fx( ismInput->hOMasa, tmpRendBuffer_fx, &q_min, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels ); - *exp = q_fact; + *exp = q_min; move16(); accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio ); -- GitLab From 26272dddb88b8a15defd8167d6786e05a2e752b7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 5 Jun 2025 14:50:39 +0530 Subject: [PATCH 0819/1310] Fix for 3GPP issue 1726: Renderer crash with assert for OMASA to MONO (renderBufferChannelLerp_fx) Link #1726 --- lib_com/cnst.h | 18 ++++++++++-------- lib_rend/lib_rend_fx.c | 6 ++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index a2d051d87..17dbc31c4 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -45,20 +45,22 @@ #define MATRIX_CONSTANT (759250113) #define NUM_SAMPLES_960 (960) #define NUM_SAMPLES_720 (720) +#define NUM_SAMPLES_640 (640) #define NUM_SAMPLES_320 (320) #define NUM_SAMPLES_160 (160) #define L_SUBFRAME_48k (240) #define L_SUBFRAME_32k (180) #define L_SUBFRAME_16k (80) #define L_SUBFRAME_8k (40) -#define Q31_BY_NUM_SAMPLES_960 ( 2239294 ) -#define Q31_BY_NUM_SAMPLES_720 ( 2986764 ) -#define Q31_BY_NUM_SAMPLES_320 ( 6731924 ) -#define Q31_BY_NUM_SAMPLES_160 ( 13506186 ) -#define Q31_BY_SUB_FRAME_240 ( 8985287 ) -#define Q31_BY_SUB_FRAME_180 ( 11997115 ) -#define Q31_BY_SUB_FRAME_80 ( 27183337 ) -#define Q31_BY_SUB_FRAME_40 ( 55063683 ) +#define Q31_BY_NUM_SAMPLES_960 ( 2239294 ) /* 1/959 in Q31 */ +#define Q31_BY_NUM_SAMPLES_720 ( 2986764 ) /* 1/719 in Q31 */ +#define Q31_BY_NUM_SAMPLES_640 ( 3360694 ) /* 1/639 in Q31 */ +#define Q31_BY_NUM_SAMPLES_320 ( 6731924 ) /* 1/319 in Q31 */ +#define Q31_BY_NUM_SAMPLES_160 ( 13506186 ) /* 1/159 in Q31 */ +#define Q31_BY_SUB_FRAME_240 ( 8985287 ) /* 1/239 in Q31 */ +#define Q31_BY_SUB_FRAME_180 ( 11997115 ) /* 1/179 in Q31 */ +#define Q31_BY_SUB_FRAME_80 ( 27183337 ) /* 1/79 in Q31 */ +#define Q31_BY_SUB_FRAME_40 ( 55063683 ) /* 1/39 in Q31 */ /*----------------------------------------------------------------------------------* diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index e39b9a61e..2b70c2e21 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -4579,6 +4579,12 @@ static void renderBufferChannelLerp_fx( move32(); move32(); BREAK; + case NUM_SAMPLES_640: + tmp = Q31_BY_NUM_SAMPLES_640; + tmp1 = 639; /* NUM_SAMPLES_640 - 1 */ + move32(); + move32(); + BREAK; case NUM_SAMPLES_320: tmp = Q31_BY_NUM_SAMPLES_320; tmp1 = 319; /* NUM_SAMPLES_320 - 1 */ -- GitLab From ea1c1cd3b9b8581c9be393f63c503a3e51b1b76b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 5 Jun 2025 14:57:34 +0530 Subject: [PATCH 0820/1310] Fix for 3GPP issue 1727: Renderer crash with assert for OMASA to MASA output (ivas_create_masa_out_meta_fx) Link #1727 --- lib_com/ivas_dirac_com_fx.c | 115 ------------- lib_com/ivas_prot_fx.h | 12 -- lib_rend/ivas_dirac_ana_fx.c | 270 ++++++++++------------------- lib_rend/ivas_masa_merge_fx.c | 4 +- lib_rend/ivas_omasa_ana_fx.c | 308 +++++++++++----------------------- lib_rend/ivas_stat_rend.h | 10 +- lib_rend/lib_rend_fx.c | 9 +- 7 files changed, 198 insertions(+), 530 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 4279065b0..2be3f8ace 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -778,121 +778,6 @@ void computeDirectionVectors_fx( return; } -/*------------------------------------------------------------------------- - * computeDiffuseness() - * - * - *------------------------------------------------------------------------*/ - -void computeDiffuseness_fx( - Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], // i: Q(q_factor_intensity) - const Word32 *buffer_energy, // i: Q(q_factor_energy) - const Word16 num_freq_bands, - Word32 *diffuseness, // o: exp(out_exp) - Word16 q_factor_intensity, - Word16 q_factor_energy, - Word16 *out_exp /*Ouput Q*/ -) -{ - Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; - Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; - Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; - Word16 i, j, k; - Word32 tmp = 0, tmp_1; - move32(); - Word32 *p_tmp; - const Word32 *p_tmp_c; - - /* Compute Intensity slow and energy slow */ - - set32_fx( intensity_slow, 0, DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ); - set32_fx( intensity_slow_abs, 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( energy_slow, 0, CLDFB_NO_CHANNELS_MAX ); - - FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) - { - /* Energy slow */ - p_tmp_c = buffer_energy + i * num_freq_bands; - FOR( k = 0; k < num_freq_bands; k++ ) - { - energy_slow[k] = L_add( *( p_tmp_c++ ), energy_slow[k] ); // Q(q_factor_energy) - move32(); - } - - /* Intensity slow */ - FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) - { - p_tmp = buffer_intensity[j][i]; - - FOR( k = 0; k < num_freq_bands; k++ ) - { - intensity_slow[j * num_freq_bands + k] = L_add( *( p_tmp++ ), intensity_slow[j * num_freq_bands + k] ); - move32(); - } - } - } - - /* intensity_slow.^2 + intensity_slow_abs*/ - FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) - { - p_tmp = intensity_slow + j * num_freq_bands; - - FOR( k = 0; k < num_freq_bands; k++ ) - { - *( p_tmp ) = Mpy_32_32( *p_tmp, *( p_tmp ) ); // Q( 2*(q_factor_intensity + scale_fact - 1) -31 ) - intensity_slow_abs[k] = L_add( *( p_tmp++ ), intensity_slow_abs[k] ); - move32(); - move32(); - } - } - Word16 init_exp = sub( 62, shl( q_factor_intensity, 1 ) ); // 31 - ( 2 * q_factor_intensity - 31 ) - Word16 exp; - - Word16 exp1 = 0, exp2; - move16(); - /* Compute Diffuseness */ - p_tmp = intensity_slow_abs; - FOR( i = 0; i < num_freq_bands; ++i ) - { - exp = init_exp; - move16(); - Word32 temp = *( p_tmp++ ); - move32(); - tmp_1 = Sqrt32( temp, &exp ); - tmp = L_deposit_h( BASOP_Util_Divide3232_Scale( tmp_1, L_add( energy_slow[i], 1 ), &exp1 ) ); - exp2 = add( sub( 31, exp1 ), sub( sub( 31, exp ), q_factor_energy ) ); - IF( GT_32( exp2, 30 ) ) - { - tmp = L_shr( tmp, sub( exp2, 30 ) ); - exp2 = sub( exp2, sub( exp2, 30 ) ); - } - tmp = L_sub( L_shl( 1, exp2 ), tmp ); - // diffuseness[i] = ( ( tmp < L_shl( 1, exp2 ) ) ? ( ( tmp < 0 ) ? 0 : tmp ) : L_shl( 1, exp2 ) ); - - IF( LT_32( tmp, L_shl( 1, exp2 ) ) ) - { - IF( tmp < 0 ) - { - diffuseness[i] = 0; - } - ELSE - { - diffuseness[i] = tmp; - } - } - ELSE - { - diffuseness[i] = L_shl( 1, exp2 ); - } - out_exp[i] = exp2; - - move32(); - move16(); - } - return; -} - - /*------------------------------------------------------------------------- * computeDiffuseness() * diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index d9ca855be..4bea59632 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4951,18 +4951,6 @@ void computeDirectionVectors_fx( Word32 *direction_vector_z, Word16 *q_factor ); - -void computeDiffuseness_fx( - Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], - const Word32 *buffer_energy, - const Word16 num_freq_bands, - Word32 *diffuseness, - Word16 q_factor_intensity, - Word16 q_factor_energy, - Word16 *out_exp - -); - void computeDiffuseness_fixed( Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], const Word32 *buffer_energy, diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index c2430d008..0e3686197 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -127,7 +127,20 @@ ivas_error ivas_dirac_ana_open_fx( } set32_fx( hDirAC->direction_vector_m_fx[i][j], 0, MASA_FREQUENCY_BANDS ); } + IF( ( hDirAC->direction_vector_e[i] = (Word16 **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word16 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + IF( ( hDirAC->direction_vector_e[i][j] = (Word16 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word16 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + } } + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) @@ -140,7 +153,8 @@ ivas_error ivas_dirac_ana_open_fx( } } set32_fx( hDirAC->buffer_energy_fx, 0, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); - + set16_fx( hDirAC->buffer_intensity_real_q, 31, DIRAC_NO_COL_AVG_DIFF ); + set16_fx( hDirAC->buffer_energy_q, 31, DIRAC_NO_COL_AVG_DIFF ); hDirAC->index_buffer_intensity = 0; move16(); @@ -194,6 +208,12 @@ void ivas_dirac_ana_close_fx( free( ( *hDirAC )->direction_vector_m_fx[i] ); ( *hDirAC )->direction_vector_m_fx[i] = NULL; + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hDirAC )->direction_vector_e[i][j] ); + ( *hDirAC )->direction_vector_e[i][j] = NULL; + } + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { free( ( *hDirAC )->buffer_intensity_real_fx[i][j] ); @@ -231,15 +251,10 @@ void ivas_dirac_ana_fx( Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energyRatio_q, surroundingCoherence_q = 0, spreadCoherence_q = 0; - move16(); - move16(); /* Estimate MASA parameters from the SBA signals */ ivas_dirac_param_est_ana_fx( hDirAC, data_fx, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); - energyRatio_q = 30; - move16(); /* Create MASA metadata buffer from the estimated values */ - ivas_create_masa_out_meta_fx( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, energyRatio_q, spreadCoherence_q, surroundingCoherence_q ); + ivas_create_masa_out_meta_fx( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, Q31, Q31, Q31 ); /* Downmix */ ivas_dirac_dmx_fx( data_fx, input_frame, nchan_transport ); // output Q of data_fx is same as that of input @@ -256,38 +271,37 @@ void ivas_dirac_ana_fx( static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, Word32 data_fx[][L_FRAME48k], /* Q7 */ - Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ - Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ - Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q30 */ - Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ - Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ + Word32 elevation_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ + Word32 azimuth_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ + Word32 energyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q30 */ + Word32 spreadCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ + Word32 surroundingCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ const Word16 input_frame ) { Word32 reference_power_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word16 ts, i, d, j; Word16 num_freq_bands, index; - Word32 dir_v[DIRAC_NUM_DIMS]; - Word16 dir_q; + Word32 dir_v_fx[DIRAC_NUM_DIMS]; + Word16 dir_v_q; Word16 l_ts; Word32 Foa_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 Foa_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; - Word16 diffuseness_vector_exp[MASA_FREQUENCY_BANDS]; Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word32 diffuseness_m_fx[MASA_FREQUENCY_BANDS]; - + Word16 diffuseness_e[MASA_FREQUENCY_BANDS]; + Word16 diffuseness_q = 0; + move16(); Word16 band_m_idx, block_m_idx; Word32 renormalization_factor_diff_fx[MASA_FREQUENCY_BANDS]; + Word16 renormalization_factor_diff_e[MASA_FREQUENCY_BANDS]; Word32 norm_tmp_fx; Word16 mrange[2]; Word16 brange[2]; Word16 numAnalysisChannels; - Word16 io_q; - Word16 scale_fact, scale_fact2; - Word16 q_factor_intensity, q_factor_intensity_old = 0; - Word16 q_factor_energy = 0, q_factor_energy_old = 0; - Word16 exp = 0, exp_div = 0; + Word16 inp_q; + Word16 intensity_q, reference_power_q; num_freq_bands = hDirAC->nbands; /* l_ts = input_frame / CLDFB_NO_COL_MAX; */ l_ts = shr( input_frame, 4 ); @@ -327,24 +341,25 @@ static void ivas_dirac_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { + Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + inp_q = Q7; // Input Q of data_fx + move16(); + move16(); + move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - io_q = Q7; // Input Q of data_fx - move16(); - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][imult1616( l_ts, ts )] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &io_q ); + cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][imult1616( l_ts, ts )] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); + cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + ci_q = s_min( ci_q, getScaleFactor32( Foa_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); } - scale_fact = getScaleFactor32( (const Word32 *) Foa_RealBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); - scale_fact = s_min( getScaleFactor32( (const Word32 *) Foa_ImagBuffer_fx, FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ), scale_fact ); - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + sf = sub( s_min( cr_q, ci_q ), 4 ); + FOR( i = 0; i < numAnalysisChannels; i++ ) { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - Foa_RealBuffer_fx[i][j] = L_shl( Foa_RealBuffer_fx[i][j], sub( scale_fact, Q3 ) ); // Q( scale_fact + Q1 ) - move32(); - Foa_ImagBuffer_fx[i][j] = L_shl( Foa_ImagBuffer_fx[i][j], sub( scale_fact, Q3 ) ); // Q( scale_fact + Q1 ) - move32(); - } + scale_sig32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf + scale_sig32( Foa_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf } + inp_q = add( inp_q, sf ); + c_e = sub( 31, inp_q ); /* Compute omni energy for metadata processing */ FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) { @@ -354,191 +369,82 @@ static void ivas_dirac_param_est_ana_fx( move16(); FOR( j = brange[0]; j < brange[1]; j++ ) { - hDirAC->energy_fx[block_m_idx][band_m_idx] = ( L_add( hDirAC->energy_fx[block_m_idx][band_m_idx], L_add( Mpy_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Mpy_32_32( Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ) ) ) ); // 2*( scale_fact + Q1 )-31 + Word32 temp = L_add( Mult_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Mult_32_32( Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e + hDirAC->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->energy_fx[block_m_idx][band_m_idx], hDirAC->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hDirAC->energy_e[block_m_idx][band_m_idx] ); move32(); } } /* Direction estimation */ - computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); // 2 * ( scale_fact + Q1 ) - 31 - exp = sub( shl( sub( scale_fact, Q1 ), 1 ), 31 ); - - computeDirectionVectors_fx( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], &exp ); + computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ + intensity_q = sub(31 ,shl ( c_e, 1)); + computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), NULL ); /* Power estimation for diffuseness */ computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 ); // computeReferencePower_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); - + reference_power_q = sub( shl( inp_q, 1 ), 30 ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ move16(); index = hDirAC->index_buffer_intensity; move16(); - Word16 guard_bits = find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ); - scale_fact2 = getScaleFactor32( (const Word32 *) intensity_real_fx, DIRAC_NUM_DIMS * MASA_FREQUENCY_BANDS ); - IF( GT_16( guard_bits, scale_fact2 ) ) - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], sub( guard_bits, scale_fact2 ) ); - move32(); - } - } - q_factor_intensity = sub( sub( shl( sub( scale_fact, 1 ), 1 ), 31 ), sub( guard_bits, scale_fact2 ) ); - } - ELSE - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real_fx[i][j] = L_shl( intensity_real_fx[i][j], sub( scale_fact2, guard_bits ) ); - move32(); - } - } - q_factor_intensity = add( sub( shl( sub( scale_fact, 1 ), 1 ), 31 ), sub( scale_fact2, guard_bits ) ); - } - scale_fact2 = getScaleFactor32( reference_power_fx[ts], MASA_FREQUENCY_BANDS ); - IF( GT_16( guard_bits, scale_fact2 ) ) - { - - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], sub( guard_bits, scale_fact2 ) ); - move32(); - } - - q_factor_energy = sub( sub( shl( scale_fact, 1 ), 31 ), sub( guard_bits, scale_fact2 ) ); - } - ELSE - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - reference_power_fx[ts][j] = L_shl( reference_power_fx[ts][j], sub( scale_fact2, guard_bits ) ); - move32(); - } - - q_factor_energy = add( sub( shl( scale_fact, 1 ), 31 ), sub( scale_fact2, guard_bits ) ); - } - - IF( q_factor_intensity_old != 0 ) - { - - IF( LT_16( q_factor_intensity_old, q_factor_intensity ) ) - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real_fx[i][j] = L_shr( intensity_real_fx[i][j], sub( q_factor_intensity, q_factor_intensity_old ) ); - move32(); - } - } - q_factor_intensity = q_factor_intensity_old; - move16(); - } - ELSE - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < index - 1; j++ ) - { - /* only real part needed */ - FOR( Word16 k = 0; k < num_freq_bands; k++ ) - { - hDirAC->buffer_intensity_real_fx[i][j][k] = L_shr( hDirAC->buffer_intensity_real_fx[i][j][k], sub( q_factor_intensity_old, q_factor_intensity ) ); - move32(); - } - } - } - } - } - IF( q_factor_energy_old != 0 ) - { - - IF( LT_16( q_factor_energy_old, q_factor_energy ) ) - { - - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - reference_power_fx[ts][j] = L_shr( reference_power_fx[ts][j], sub( q_factor_energy, q_factor_energy_old ) ); - move32(); - } - - q_factor_energy = q_factor_energy_old; - move16(); - } - ELSE - { - FOR( i = 0; i < index - 1; i++ ) - { - FOR( j = 0; j < num_freq_bands; j++ ) - { - FOR( Word16 k = 0; k < num_freq_bands; k++ ) - { - hDirAC->buffer_energy_fx[add( imult1616( i, j ), k )] = L_shr( hDirAC->buffer_energy_fx[add( imult1616( i, j ), k )], sub( q_factor_energy_old, q_factor_energy_old ) ); - move32(); - } - } - } - } - } - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { /* only real part needed */ - Copy32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); + Copy32( intensity_real_fx[i], &( hDirAC->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); // intensity_q } - Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[imult1616( sub( index, 1 ), num_freq_bands )] ), num_freq_bands ); - - computeDiffuseness_fx( hDirAC->buffer_intensity_real_fx, hDirAC->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, q_factor_intensity, q_factor_energy, diffuseness_vector_exp ); - q_factor_intensity_old = q_factor_intensity; + hDirAC->buffer_intensity_real_q[index - 1] = intensity_q; move16(); - q_factor_energy_old = q_factor_energy; + Copy32( reference_power_fx[ts], &( hDirAC->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + hDirAC->buffer_energy_q[index - 1] = reference_power_q; move16(); - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - if ( LT_16( diffuseness_vector_exp[j], 10 ) ) - { - diffuseness_vector_fx[j] = 0; - move16(); - } - } + computeDiffuseness_fixed( hDirAC->buffer_intensity_real_fx, hDirAC->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hDirAC->buffer_intensity_real_q, hDirAC->buffer_energy_q, &diffuseness_q ); FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - norm_tmp_fx = Mpy_32_32( reference_power_fx[ts][band_m_idx], ( L_sub( ONE_IN_Q30, L_shr( diffuseness_vector_fx[band_m_idx], sub( 30, diffuseness_vector_exp[band_m_idx] ) ) ) ) ); // q_factor_energy-1 + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2*inp_q-30*/ - hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx], hDirAC->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[0][block_m_idx][band_m_idx] ); move32(); - hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx], hDirAC->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[1][block_m_idx][band_m_idx] ); move32(); - hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_add( Mpy_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] ); // Q (q_factor_energy + exp -32) + hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] ); move32(); - - diffuseness_m_fx[band_m_idx] = L_add( diffuseness_m_fx[band_m_idx], Mpy_32_32( reference_power_fx[ts][band_m_idx], L_shr( diffuseness_vector_fx[band_m_idx], sub( 30, diffuseness_vector_exp[band_m_idx] ) ) ) ); // Qq_factor_energy-1 + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] ); move32(); - renormalization_factor_diff_fx[band_m_idx] = L_add( renormalization_factor_diff_fx[band_m_idx], reference_power_fx[ts][band_m_idx] ); // Qq_factor_energy + + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); move32(); + } + } - FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { + Word16 max_e = MIN_16; + move16(); FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { - dir_v[d] = hDirAC->direction_vector_m_fx[d][block_m_idx][band_m_idx]; + max_e = s_max( max_e, hDirAC->direction_vector_e[d][block_m_idx][band_m_idx] ); + } + max_e = add( max_e, 1 ); /*1 as guard bit to prevent overflow*/ + FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v_fx[d] = L_shr( hDirAC->direction_vector_m_fx[d][block_m_idx][band_m_idx], sub( max_e, hDirAC->direction_vector_e[d][block_m_idx][band_m_idx] ) ); move32(); } - dir_q = add( q_factor_energy, sub( exp, 32 ) ); - ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v, dir_q, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + dir_v_q = sub( 31, max_e ); + ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v_fx, dir_v_q, &azimuth_m_values_fx[block_m_idx][band_m_idx], &elevation_m_values_fx[block_m_idx][band_m_idx] ); } /* Determine energy ratios */ FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { + Word16 diffuseness_m_e; IF( GT_32( renormalization_factor_diff_fx[band_m_idx], EPSILON_FX ) ) { - diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &exp_div ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &diffuseness_m_e ); + move32(); + diffuseness_m_e = add( diffuseness_m_e, sub( diffuseness_e[band_m_idx], renormalization_factor_diff_e[band_m_idx] ) ); + diffuseness_m_fx[band_m_idx] = L_shl_sat( diffuseness_m_fx[band_m_idx], add( 16, diffuseness_m_e ) ); // Q31 move32(); } ELSE @@ -546,16 +452,14 @@ static void ivas_dirac_param_est_ana_fx( diffuseness_m_fx[band_m_idx] = 0; move32(); } - exp_div = sub( 30, exp_div ); - energyRatio[block_m_idx][band_m_idx] = L_sub( L_shl( 1, 30 ), L_shl( diffuseness_m_fx[band_m_idx], sub( 30, exp_div ) ) ); // Q30 + energyRatio_fx[block_m_idx][band_m_idx] = L_sub( ONE_IN_Q31, diffuseness_m_fx[band_m_idx] ); move32(); } - FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - spreadCoherence[block_m_idx][band_m_idx] = 0; + spreadCoherence_fx[block_m_idx][band_m_idx] = 0; move32(); - surroundingCoherence[block_m_idx][band_m_idx] = 0; + surroundingCoherence_fx[block_m_idx][band_m_idx] = 0; move32(); } } diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index fd20a9fab..65829e1c8 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -209,7 +209,7 @@ void diffuse_meta_merge_1x1_fx( tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( EPSILON_FX, total_nrg_fx ), &scale ); scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); - dir_nrg_ratio_fx = L_sub( L_shl( 1, scale ), L_deposit_h( tmp ) ); + dir_nrg_ratio_fx = L_sub( L_shl_sat( 1, sub( 31, scale ) ), L_deposit_h( tmp ) ); dir_nrg_ratio_e = scale; move16(); @@ -239,7 +239,7 @@ void diffuse_meta_merge_1x1_fx( { new_diff_ratio_fx = L_sub( L_shl( 1, sub( 31, new_dir_ratio_e ) ), new_dir_ratio_fx ); /* Q(31 - new_dir_ratiio_e) */ } - outMeta->diffuseToTotalRatio[sf][band] = (UWord8) imult1616( extract_l( L_shr( new_diff_ratio_fx, new_dir_ratio_e ) ), UINT8_MAX ); + outMeta->diffuseToTotalRatio[sf][band] = (UWord8) imult1616( extract_l( L_shr( new_diff_ratio_fx, sub( 31, new_dir_ratio_e ) ) ), UINT8_MAX ); move16(); } ELSE diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 7b7f64c84..1a579aece 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -159,6 +159,18 @@ ivas_error ivas_omasa_ana_open( } set_zero_fx( hOMasa->direction_vector_m_fx[i][j], MASA_FREQUENCY_BANDS ); } + IF( ( hOMasa->direction_vector_e[i] = (Word16 **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( Word16 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + IF( ( hOMasa->direction_vector_e[i][j] = (Word16 *) malloc( MASA_FREQUENCY_BANDS * sizeof( Word16 ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); + } + } } FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) @@ -172,7 +184,8 @@ ivas_error ivas_omasa_ana_open( set_zero_fx( hOMasa->buffer_intensity_real_fx[i][j], MASA_FREQUENCY_BANDS ); } } - + set16_fx( hOMasa->buffer_intensity_real_q, 31, DIRAC_NO_COL_AVG_DIFF ); + set16_fx( hOMasa->buffer_energy_q, 31, DIRAC_NO_COL_AVG_DIFF ); set_zero_fx( hOMasa->buffer_energy_fx, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) @@ -249,6 +262,12 @@ void ivas_omasa_ana_close( ( *hOMasa )->direction_vector_m_fx[i][j] = NULL; } + FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hOMasa )->direction_vector_e[i][j] ); + ( *hOMasa )->direction_vector_e[i][j] = NULL; + } + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { free( ( *hOMasa )->buffer_intensity_real_fx[i][j] ); @@ -298,7 +317,7 @@ void ivas_omasa_ana_fx( /* Create MASA metadata buffer from the estimated values */ - ivas_create_masa_out_meta_fx( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, energyRatio_q, spreadCoherence_q, sorroundingCoherence_q ); + ivas_create_masa_out_meta_fx( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, Q31, Q31, Q31 ); /* Downmix */ ivas_omasa_dmx_fx( data_in_f_fx, data_in_q, input_frame, nchan_transport, nchan_ism, hOMasa->ism_azimuth_fx, hOMasa->ism_elevation_fx, hOMasa->prev_object_dm_gains_fx, hOMasa->interpolator_fx ); @@ -332,7 +351,7 @@ static void ivas_omasa_param_est_ana_fx( Word16 num_freq_bins, num_freq_bands, index; Word16 l_ts; - Word32 reference_power_fx[MASA_FREQUENCY_BANDS]; + Word32 reference_power_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word32 Chnl_RealBuffer_fx[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; Word16 Chnl_RealBuffer_q[MAX_NUM_OBJECTS]; Word16 Chnl_ImagBuffer_q[MAX_NUM_OBJECTS]; @@ -344,20 +363,16 @@ static void ivas_omasa_param_est_ana_fx( Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word16 diffuseness_q = 0; move16(); + Word16 diffuseness_e[MASA_FREQUENCY_BANDS]; Word32 diffuseness_m_fx[MASA_FREQUENCY_BANDS]; - Word16 diffuseness_m_q = 0; - move16(); + Word32 renormalization_factor_diff_fx[MASA_FREQUENCY_BANDS]; - Word16 renormalization_factor_diff_q = 0; - move16(); + Word16 renormalization_factor_diff_e[MASA_FREQUENCY_BANDS]; Word32 norm_tmp_fx; - Word16 scale; Word16 tmp_ener_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32 dir_v_fx[DIRAC_NUM_DIMS], L_tmp1, L_tmp2; - Word16 dir_v_q, norm_tmp_q; - Word16 foa_q; - + Word32 dir_v_fx[DIRAC_NUM_DIMS]/*, L_tmp1, L_tmp2*/; + Word16 dir_v_q/*, norm_tmp_q*/; Word16 band_m_idx, block_m_idx; Word16 mrange[2]; @@ -367,13 +382,10 @@ static void ivas_omasa_param_est_ana_fx( move16(); num_freq_bands = hOMasa->nbands; move16(); - - // l_ts = input_frame / CLDFB_NO_COL_MAX; l_ts = shr( input_frame, 4 ); - move16(); Word16 intensity_q; - Word16 direction_q, reference_power_q; + Word16 reference_power_q; set16_zero_fx( Chnl_RealBuffer_q, MAX_NUM_OBJECTS ); set16_zero_fx( Chnl_ImagBuffer_q, MAX_NUM_OBJECTS ); @@ -381,37 +393,15 @@ static void ivas_omasa_param_est_ana_fx( /* Compute ISM to FOA matrices */ FOR( i = 0; i < nchan_ism; i++ ) { - Word16 tmp, tmp1; - // 180 in Q22 754974720 - hOMasa->chnlToFoaMtx_fx[0][i] = 32767; // 1 in Q15 - move16(); - - tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_azimuth_fx[i], 754974720, &scale ); - tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - tmp = getSinWord16( tmp ); // Q15 sine value - - tmp1 = BASOP_Util_Divide3232_Scale( hOMasa->ism_elevation_fx[i], 754974720, &scale ); - tmp1 = mult( tmp1, EVS_PI_FX ); - tmp1 = getCosWord16( tmp1 ); - hOMasa->chnlToFoaMtx_fx[1][i] = shl( mult( tmp, tmp1 ), 1 ); // Q14 + Q15 - Q15 + Q1 -> Q15 - move16(); - - tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_elevation_fx[i], 754974720, &scale ); - tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - hOMasa->chnlToFoaMtx_fx[2][i] = getSinWord16( tmp ); // Q15 - move16(); - - tmp = BASOP_Util_Divide3232_Scale( hOMasa->ism_azimuth_fx[i], 754974720, &scale ); - tmp = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - tmp = getCosWord16( tmp ); // Q14 - - - tmp1 = BASOP_Util_Divide3232_Scale( hOMasa->ism_elevation_fx[i], 754974720, &scale ); - tmp1 = mult( tmp, EVS_PI_FX ); // Q13 + Q15 - Q15 --> Q13 - tmp1 = getCosWord16( tmp ); // Q14 + hOMasa->chnlToFoaMtx_fx[0][i] = ONE_IN_Q31; + move32(); + hOMasa->chnlToFoaMtx_fx[1][i] = L_mult( getSineWord16R2( extract_l( Mpy_32_32( hOMasa->ism_azimuth_fx[i], 46603 /*32767/360*/ ) /*Q22+Q24-31=>Q15*/ ) ), getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_elevation_fx[i], 46603 /*2^24/360*/ ) ) ) ); // Q31 + move32(); + hOMasa->chnlToFoaMtx_fx[2][i] = L_shl( getSineWord16R2( extract_l( Mpy_32_32( hOMasa->ism_elevation_fx[i], 46603 /*2^24/360*/ ) ) ), 16 ); // Q31 + move32(); + hOMasa->chnlToFoaMtx_fx[3][i] = L_mult( getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_azimuth_fx[i], 46603 /*2^24/360*/ ) ) ), getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_elevation_fx[i], 46603 /*2^24/360*/ ) ) ) ); // Q31 + move32(); - hOMasa->chnlToFoaMtx_fx[3][i] = shl( mult( tmp, tmp1 ), 2 ); // Q14 + Q14 - Q15 + Q2-> Q13 + Q2 -> Q15 - move16(); } /* do processing over all CLDFB time slots */ @@ -442,63 +432,29 @@ static void ivas_omasa_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { + Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + move16(); + move16(); + Word16 inp_q = data_f_q; + move16(); FOR( i = 0; i < nchan_ism; i++ ) { - Word16 in_q = Q11; + + inp_q = data_f_q; move16(); + cldfbAnalysis_ts_fx_fixed_q( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &inp_q ); - /* Keep input to cldfbAnalysis_ts_fx in Q11 */ - IF( NE_16( in_q, data_f_q ) ) - { - scale_sig32( &( data_f_fx[i][i_mult( l_ts, ts )] ), l_ts, sub( in_q, data_f_q ) ); /* Q11 */ - } - - cldfbAnalysis_ts_fx( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &in_q ); - - /* Restore data_f_fx to it's original Q */ - IF( NE_16( data_f_q, Q11 ) ) - { - scale_sig32( &( data_f_fx[i][i_mult( l_ts, ts )] ), l_ts, sub( data_f_q, Q11 ) ); /* Q(data_f_q) */ - } - - FOR( Word16 ind = 0; ind < CLDFB_NO_CHANNELS_MAX; ind++ ) - { - Chnl_RealBuffer_fx[i][ind] = L_shr( Chnl_RealBuffer_fx[i][ind], 4 ); // Q: in_q - 4 - move32(); - Chnl_ImagBuffer_fx[i][ind] = L_shr( Chnl_ImagBuffer_fx[i][ind], 4 ); // Q: in_q - 4 - move32(); - } - - Chnl_RealBuffer_q[i] = sub( in_q, 4 ); - move16(); - Chnl_ImagBuffer_q[i] = sub( in_q, 4 ); - move16(); + cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); } - - IF( GT_16( nchan_ism, 1 ) ) + sf = sub( s_min( cr_q, ci_q ), 4 ); + FOR( i = 0; i < nchan_ism; i++ ) { - Word16 anaBuf_com_q; - minimum_fx( Chnl_RealBuffer_q, nchan_ism, &anaBuf_com_q ); - - FOR( i = 0; i < nchan_ism; i++ ) - { - IF( NE_16( anaBuf_com_q, Chnl_RealBuffer_q[i] ) ) - { - FOR( Word16 ind = 0; ind < CLDFB_NO_CHANNELS_MAX; ind++ ) - { - Chnl_RealBuffer_fx[i][ind] = L_shr( Chnl_RealBuffer_fx[i][ind], sub( Chnl_RealBuffer_q[i], anaBuf_com_q ) ); // Q: anaBuf_com_q - move32(); - Chnl_ImagBuffer_fx[i][ind] = L_shr( Chnl_ImagBuffer_fx[i][ind], sub( Chnl_ImagBuffer_q[i], anaBuf_com_q ) ); // Q: anaBuf_com_q - move32(); - } - Chnl_ImagBuffer_q[i] = anaBuf_com_q; - move16(); - Chnl_RealBuffer_q[i] = anaBuf_com_q; - move16(); - } - } + scale_sig32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf } - + inp_q = add( inp_q, sf ); + c_e = sub( 31, inp_q ); /* Compute channel-based energy for metadata processing */ FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) @@ -510,21 +466,9 @@ static void ivas_omasa_param_est_ana_fx( FOR( j = brange[0]; j < brange[1]; j++ ) { FOR( i = 0; i < nchan_ism; i++ ) - { - Word16 tmp_e, tmp_r_q, tmp_i_q; - Word32 tmp_r, tmp_i, L_tmp_sum; - tmp_r_q = norm_l( Chnl_RealBuffer_fx[i][j] ); - tmp_r = L_shl( Chnl_RealBuffer_fx[i][j], tmp_r_q ); /* Q(Chnl_RealBuffer_q[i] + tmp_r_q) */ - tmp_r_q = add( tmp_r_q, Chnl_RealBuffer_q[i] ); - L_tmp1 = Mpy_32_32( tmp_r, tmp_r ); /* Q(2*tmp_r_q - 31)*/ - tmp_r_q = sub( add( tmp_r_q, tmp_r_q ), 31 ); - tmp_i_q = norm_l( Chnl_ImagBuffer_fx[i][j] ); - tmp_i = L_shl( Chnl_ImagBuffer_fx[i][j], tmp_i_q ); /* Q(Chnl_ImagBuffer_q[i] + tmp_i_q)*/ - tmp_i_q = add( tmp_i_q, Chnl_ImagBuffer_q[i] ); - tmp_i_q = sub( add( tmp_i_q, tmp_i_q ), 31 ); - L_tmp2 = Mpy_32_32( tmp_i, tmp_i ); /* Q(2*tmp_i_q - 31) */ - L_tmp_sum = BASOP_Util_Add_Mant32Exp( L_tmp1, sub( 31, tmp_r_q ), L_tmp2, sub( 31, tmp_i_q ), &tmp_e ); /* Q(31 - tmp_e) */ - hOMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->energy_fx[block_m_idx][band_m_idx], tmp_ener_e[block_m_idx][band_m_idx], L_tmp_sum, tmp_e, &tmp_ener_e[block_m_idx][band_m_idx] ); /* Q(31 - tmp_ener_e[block_m_idx][band_m_idx]) */ + { + Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e + hOMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->energy_fx[block_m_idx][band_m_idx], hOMasa->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hOMasa->energy_e[block_m_idx][band_m_idx] ); move32(); } } @@ -533,8 +477,8 @@ static void ivas_omasa_param_est_ana_fx( /* Compute FOA */ /* W */ - Copy32( Chnl_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins ); - Copy32( Chnl_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins ); + Copy32( Chnl_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins );//inp_q + Copy32( Chnl_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins );//inp_q FOR( i = 1; i < nchan_ism; i++ ) { @@ -549,59 +493,42 @@ static void ivas_omasa_param_est_ana_fx( /* Y */ - v_multc_fixed( Chnl_RealBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[1][0] ), Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[1][0] ), Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[1][0], Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { - v_multc_acc_32_16( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_acc_32_16( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_RealBuffer_fx[1], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[1][i], Foa_ImagBuffer_fx[1], num_freq_bins ); // Q: Chnl_ImagBuffer_q } /* Z */ - v_multc_fixed( Chnl_RealBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[2][0] ), Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[2][0] ), Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0] , Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0] , Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { - v_multc_acc_32_16( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_acc_32_16( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q } - v_multc_fixed( Chnl_RealBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[3][0] ), Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], L_deposit_h( hOMasa->chnlToFoaMtx_fx[3][0] ), Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0] , Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0] , Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { - v_multc_acc_32_16( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_acc_32_16( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q - } - - /* Direction estimation */ - FOR( i = 0; i < FOA_CHANNELS; i++ ) - { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) - { - Foa_RealBuffer_fx[i][j] = L_shr( Foa_RealBuffer_fx[i][j], 5 ); // Q: ( Chnl_RealBuffer_q - 5 ) - move32(); - Foa_ImagBuffer_fx[i][j] = L_shr( Foa_ImagBuffer_fx[i][j], 5 ); // Q: ( Chnl_RealBuffer_q - 5 ) - move32(); - } + v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q } - foa_q = sub( Chnl_ImagBuffer_q[0], 5 ); - computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); - - intensity_q = sub( shl( add( foa_q, Q1 ), 1 ), 31 ); - direction_q = intensity_q; - move16(); - - computeDirectionVectors_fx( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], &direction_q ); + computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx );/* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ + intensity_q = sub( 31, shl( c_e, 1 ) ); + computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), NULL ); /* Q direction_vector_fx = Q30*/ /* Power estimation for diffuseness */ - computeReferencePower_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx, num_freq_bands ); // 2 * inputq - 30 - reference_power_q = sub( shl( Chnl_ImagBuffer_q[0], 1 ), 30 ); + computeReferencePower_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); // 2 * inputq - 30 + reference_power_q = sub( shl( inp_q, 1 ), 30 ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hOMasa->index_buffer_intensity = add( ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ @@ -616,68 +543,61 @@ static void ivas_omasa_param_est_ana_fx( } hOMasa->buffer_intensity_real_q[index - 1] = intensity_q; move16(); - Copy32( reference_power_fx, &( hOMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + Copy32( reference_power_fx[ts], &( hOMasa->buffer_energy_fx[( index - 1 ) * num_freq_bands] ), num_freq_bands ); hOMasa->buffer_energy_q[index - 1] = reference_power_q; move16(); - computeDiffuseness_fixed( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &diffuseness_q ); + computeDiffuseness_fixed( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &diffuseness_q );//diffuseness_q=Q30 FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { - norm_tmp_fx = Mpy_32_32( reference_power_fx[band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ); // reference_power_q + 30 - 31 - norm_tmp_q = sub( add( reference_power_q, 30 ), 31 ); + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2*inp_q-30*/ - hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ) ); // Q: hOMasa->direction_vector_m_q: ( ( norm_tmp_q + direction_q ) - 31 ) + hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hOMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); move32(); - - hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ) ); // Q: hOMasa->direction_vector_m_q: ( ( norm_tmp_q + direction_q ) - 31 ) + hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hOMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); move32(); - hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = L_add( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], Mpy_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ) ); // Q: hOMasa->direction_vector_m_q: ( ( norm_tmp_q + direction_q ) - 31 ) + hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hOMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); move32(); - hOMasa->direction_vector_m_q = sub( add( norm_tmp_q, direction_q ), 31 ); - - - diffuseness_m_fx[band_m_idx] = L_add( diffuseness_m_fx[band_m_idx], Mpy_32_32( reference_power_fx[band_m_idx], diffuseness_vector_fx[band_m_idx] ) ); // diffuseness_m_q: ( ( reference_power_q + diffuseness_q ) - 31 ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] ); move32(); - diffuseness_m_q = sub( add( reference_power_q, diffuseness_q ), 31 ); - renormalization_factor_diff_fx[band_m_idx] = L_add( renormalization_factor_diff_fx[band_m_idx], reference_power_fx[band_m_idx] ); + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); move32(); - renormalization_factor_diff_q = reference_power_q; - move16(); + } } FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { + Word16 max_e = MIN_16; + move16(); FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { - dir_v_fx[d] = hOMasa->direction_vector_m_fx[d][block_m_idx][band_m_idx]; - move32(); + max_e = s_max( max_e, hOMasa->direction_vector_e[d][block_m_idx][band_m_idx] ); } - dir_v_q = hOMasa->direction_vector_m_q; - move16(); - - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + max_e = add( max_e, 1 ); /*1 as guard bit to prevent overflow*/ + FOR( d = 0; d < DIRAC_NUM_DIMS; d++ ) { - dir_v_fx[i] = L_shr( dir_v_fx[i], 1 ); + dir_v_fx[d] = L_shr( hOMasa->direction_vector_m_fx[d][block_m_idx][band_m_idx], sub( max_e, hOMasa->direction_vector_e[d][block_m_idx][band_m_idx] ) ); move32(); } + dir_v_q = sub( 31, max_e ); - dir_v_q = sub( dir_v_q, 1 ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v_fx, dir_v_q, &azimuth_m_values_fx[block_m_idx][band_m_idx], &elevation_m_values_fx[block_m_idx][band_m_idx] ); + } /* Determine energy ratios */ FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { - IF( BASOP_Util_Cmp_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], sub( 31, renormalization_factor_diff_q ), L_deposit_h( EPSILON_FX ), 2 ) > 0 ) + Word16 diffuseness_m_e; + IF( GT_32( renormalization_factor_diff_fx[band_m_idx], EPSILON_FX ) ) { - diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &scale ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Divide3232_Scale( diffuseness_m_fx[band_m_idx], renormalization_factor_diff_fx[band_m_idx], &diffuseness_m_e ); move32(); - scale = add( scale, sub( sub( 31, diffuseness_m_q ), sub( 31, renormalization_factor_diff_q ) ) ); - - diffuseness_m_fx[band_m_idx] = L_shr( diffuseness_m_fx[band_m_idx], sub( 31, add( scale, diffuseness_m_q ) ) ); + diffuseness_m_e = add( diffuseness_m_e, sub( diffuseness_e[band_m_idx], renormalization_factor_diff_e[band_m_idx] ) ); + diffuseness_m_fx[band_m_idx] = L_shl_sat( diffuseness_m_fx[band_m_idx], add( 16, diffuseness_m_e ) ); // Q31 move32(); } ELSE @@ -685,7 +605,7 @@ static void ivas_omasa_param_est_ana_fx( diffuseness_m_fx[band_m_idx] = 0; move32(); } - energyRatio_fx[block_m_idx][band_m_idx] = L_sub( L_shl( 1, diffuseness_m_q ), diffuseness_m_fx[band_m_idx] ); // Q: diffuseness_m_q + energyRatio_fx[block_m_idx][band_m_idx] = L_sub( ONE_IN_Q31, diffuseness_m_fx[band_m_idx] ); move32(); } @@ -698,40 +618,12 @@ static void ivas_omasa_param_est_ana_fx( move32(); } } - - Word16 q_ener_min = MAX_16; + *energyRatio_q = Q31; + *spreadCoherence_q = Q31; + *surroundingCoherence_q = Q31; move16(); - FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) - { - Word16 e_max; - maximum_fx( tmp_ener_e[block_m_idx], num_freq_bands, &e_max ); - e_max = sub( 31, e_max ); - if ( GT_16( q_ener_min, e_max ) ) - { - q_ener_min = e_max; - move16(); - } - } - - FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) - { - FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) - { - hOMasa->energy_fx[block_m_idx][band_m_idx] = L_shr( hOMasa->energy_fx[block_m_idx][band_m_idx], sub( sub( 31, tmp_ener_e[block_m_idx][band_m_idx] ), q_ener_min ) ); /* Q(q_ener_min) */ - move32(); - } - } - - hOMasa->energy_q = q_ener_min; - move16(); - - *spreadCoherence_q = 0; - move16(); - *surroundingCoherence_q = 0; move16(); - *energyRatio_q = 0; move16(); - return; } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 00fbc2549..588e416ca 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1597,13 +1597,14 @@ typedef struct ivas_omasa_ana_data_structure SPHERICAL_GRID_DATA *sph_grid16; Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ - Word16 direction_vector_m_q; /* Average direction vector */ + Word16 **direction_vector_e[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Average direction vector */ Word32 ism_azimuth_fx[MAX_NUM_OBJECTS]; Word32 ism_elevation_fx[MAX_NUM_OBJECTS]; Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 energy_q; - Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word16 energy_exp[MAX_PARAM_SPATIAL_SUBFRAMES]; Word16 interpolator_fx[L_FRAME48k]; Word32 prev_object_dm_gains_fx[MAX_NUM_OBJECTS][MASA_MAX_TRANSPORT_CHANNELS]; @@ -1611,7 +1612,7 @@ typedef struct ivas_omasa_ana_data_structure Word32 buffer_energy_fx[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; Word16 buffer_intensity_real_q[DIRAC_NO_COL_AVG_DIFF]; Word16 buffer_energy_q[DIRAC_NO_COL_AVG_DIFF]; - Word16 chnlToFoaMtx_fx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; // Q15 + Word32 chnlToFoaMtx_fx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; // Q15 } OMASA_ANA_DATA, *OMASA_ANA_HANDLE; @@ -1629,13 +1630,16 @@ typedef struct ivas_dirac_ana_data_structure /* DirAC parameter estimation */ Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ + Word16 **direction_vector_e[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Average direction vector */ Word16 band_grouping[MASA_FREQUENCY_BANDS + 1]; Word16 block_grouping[5]; /* diffuseness */ Word16 index_buffer_intensity; Word32 *buffer_intensity_real_fx[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + Word16 buffer_intensity_real_q[DIRAC_NO_COL_AVG_DIFF]; Word32 buffer_energy_fx[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + Word16 buffer_energy_q[DIRAC_NO_COL_AVG_DIFF]; MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index e39b9a61e..9a0f2a522 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5644,11 +5644,6 @@ static ivas_error renderInputIsm( BREAK; case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: renderIsmToMasa( ismInput, outAudio, &exp ); - FOR( Word16 block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) - { - ismInput->hOMasa->energy_e[block_m_idx] = sub( 31, ismInput->hOMasa->energy_q ); - move16(); - } BREAK; default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; @@ -7097,7 +7092,7 @@ ivas_error IVAS_REND_MergeMasaMetadata( { *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; inEne1_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne1_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); + inEne1_e = ( hIvasRend->inputsIsm->hOMasa->energy_exp ); } ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { @@ -7127,7 +7122,7 @@ ivas_error IVAS_REND_MergeMasaMetadata( { inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; inEne2_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne2_e = ( hIvasRend->inputsIsm->hOMasa->energy_e ); + inEne2_e = ( hIvasRend->inputsIsm->hOMasa->energy_exp ); } ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { -- GitLab From c3e19ed30cc04e5265ea976872bf5f4d5d3c0251 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 5 Jun 2025 11:31:37 +0200 Subject: [PATCH 0821/1310] Add missing change from the corresponding float branch --- lib_dec/lib_dec_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index ce7af9ef8..aa8b6c873 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2759,7 +2759,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } } +#ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + extBufferedSamples = nSamplesBuffered; +#else extBufferedSamples = add( nSamplesRendered, nSamplesBuffered ); +#endif Word16 exp; extBufferedTime_ms = BASOP_Util_Divide3232_Scale( imult3216( extBufferedSamples, 1000 ), hDecoderConfig->output_Fs, &exp ); extBufferedTime_ms = (UWord32) W_shr( extBufferedTime_ms, sub( 15, exp ) ); // Q0 -- GitLab From 8c7ba7805ab6638db39d919ffc1e65c17c719288 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 5 Jun 2025 11:44:05 +0200 Subject: [PATCH 0822/1310] Fix braces in if statement and indentation --- lib_dec/lib_dec_fx.c | 215 ++++++++++++++++++++++--------------------- 1 file changed, 108 insertions(+), 107 deletions(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index aa8b6c873..318129f6d 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2793,141 +2793,142 @@ ivas_error IVAS_DEC_VoIP_GetSamples( dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); #endif /* avoid time scaling multiple times in one sound card slot */ - IF( NE_64( scale, 100U ) ){ + IF( NE_64( scale, 100U ) ) + { #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE IF( hIvasDec->timeScalingDone ) #else IF( timeScalingDone ) #endif - { - scale = 100; - move32(); - } + { + scale = 100; + move32(); + } #ifndef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - ELSE - { - timeScalingDone = 1; - move16(); - } + ELSE + { + timeScalingDone = 1; + move16(); + } #endif - } + } - /* limit scale to range supported by time scaler */ - IF( LT_32( scale, APA_MIN_SCALE ) ) - { - scale = APA_MIN_SCALE; - move32(); - } - ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) - { - scale = APA_MAX_SCALE; - move32(); - } + /* limit scale to range supported by time scaler */ + IF( LT_32( scale, APA_MIN_SCALE ) ) + { + scale = APA_MIN_SCALE; + move32(); + } + ELSE IF( GT_32( scale, APA_MAX_SCALE ) ) + { + scale = APA_MAX_SCALE; + move32(); + } - IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) - { - return error; - } + IF( NE_32( ( error = IVAS_DEC_VoIP_SetScale( hIvasDec, (Word16) maxScaling, (Word16) scale ) ), IVAS_ERR_OK ) ) + { + return error; + } - /* copy bitstream into decoder state */ - IF( dataUnit ) - { - hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + /* copy bitstream into decoder state */ + IF( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; - bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) - { - /* Decoder has been initialized with first good frame - do PLC */ - IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } + ELSE IF( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + IF( NE_32( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ) ), IVAS_ERR_OK ) ) + { + return error; + } + } #ifdef SUPPORT_JBM_TRACEFILE - /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ - test(); - IF( jbmWriterFn != NULL && jbmWriter != NULL ) - { - /* write JBM trace data entry */ - store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); - IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError writing JBM Trace data to file\n" ); - return IVAS_ERR_UNKNOWN; - } - } + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + test(); + IF( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + IF( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } #endif - IF( dataUnit ) - { - IF( dataUnit->partial_frame != 0 ) - { - hVoIP->lastDecodedWasActive = 1; - } - ELSE - { - hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; - } - move16(); + IF( dataUnit ) + { + IF( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + ELSE + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + move16(); - /* data unit memory is no longer used */ - JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); - } + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } - IF( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; - hIvasDec->nSamplesRendered = 0; - move16(); - move16(); - } -} + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->nSamplesAvailableNext = hIvasDec->nSamplesFrame; + hIvasDec->nSamplesRendered = 0; + move16(); + move16(); + } + } -/* decode */ -IF( !hIvasDec->hasBeenFedFirstGoodFrame ) -{ - /* codec mode to use not known yet - simply output silence */ - /* directly set output zero */ - Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); - set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); - nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); - hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); - move16(); - move16(); + /* decode */ + IF( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + /* codec mode to use not known yet - simply output silence */ + /* directly set output zero */ + Word16 nSamplesToZero = s_min( nSamplesPerChannel, hIvasDec->nSamplesAvailableNext ); + set16_fx( pcmBuf + imult1616( nSamplesRendered, nOutChannels ), 0, imult1616( nSamplesToZero, nOutChannels ) ); + nSamplesRendered = add( nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesRendered = add( hIvasDec->nSamplesRendered, nSamplesToZero ); + hIvasDec->nSamplesAvailableNext = sub( hIvasDec->nSamplesAvailableNext, nSamplesToZero ); + move16(); + move16(); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesToZero ); + update_voip_rendered20ms( hIvasDec, nSamplesToZero ); #endif -} -ELSE -{ - Word16 nSamplesToRender, nSamplesRendered_loop; - bool tmp; - nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); + } + ELSE + { + Word16 nSamplesToRender, nSamplesRendered_loop; + bool tmp; + nSamplesToRender = sub( nSamplesPerChannel, nSamplesRendered ); - /* render IVAS frames directly to the output buffer */ - IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) - { - return error; - } + /* render IVAS frames directly to the output buffer */ + IF( NE_32( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, pcmBuf + imult1616( nSamplesRendered, nOutChannels ), &nSamplesRendered_loop, &tmp ) ), IVAS_ERR_OK ) ) + { + return error; + } - nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); + nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); + update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); #endif -} -} + } + } -return IVAS_ERR_OK; + return IVAS_ERR_OK; } #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE -- GitLab From bcb13845eb74b07d83331f1dde7b34e13853494c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 5 Jun 2025 15:28:46 +0530 Subject: [PATCH 0823/1310] Clang formatting changes --- lib_rend/ivas_dirac_ana_fx.c | 8 +++----- lib_rend/ivas_omasa_ana_fx.c | 29 +++++++++++++---------------- lib_rend/ivas_stat_rend.h | 4 ++-- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 0e3686197..4fd86c9fe 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -270,7 +270,7 @@ void ivas_dirac_ana_fx( /* Estimate MASA parameters from the SBA signals */ static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, - Word32 data_fx[][L_FRAME48k], /* Q7 */ + Word32 data_fx[][L_FRAME48k], /* Q7 */ Word32 elevation_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ Word32 azimuth_m_values_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q22 */ Word32 energyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q30 */ @@ -355,7 +355,7 @@ static void ivas_dirac_param_est_ana_fx( sf = sub( s_min( cr_q, ci_q ), 4 ); FOR( i = 0; i < numAnalysisChannels; i++ ) { - scale_sig32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf + scale_sig32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf scale_sig32( Foa_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); @@ -376,7 +376,7 @@ static void ivas_dirac_param_est_ana_fx( } /* Direction estimation */ computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ - intensity_q = sub(31 ,shl ( c_e, 1)); + intensity_q = sub( 31, shl( c_e, 1 ) ); computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), NULL ); /* Power estimation for diffuseness */ @@ -414,9 +414,7 @@ static void ivas_dirac_param_est_ana_fx( renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); move32(); - } - } FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 1a579aece..f82ac12bd 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -371,8 +371,8 @@ static void ivas_omasa_param_est_ana_fx( Word32 norm_tmp_fx; Word16 tmp_ener_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word32 dir_v_fx[DIRAC_NUM_DIMS]/*, L_tmp1, L_tmp2*/; - Word16 dir_v_q/*, norm_tmp_q*/; + Word32 dir_v_fx[DIRAC_NUM_DIMS] /*, L_tmp1, L_tmp2*/; + Word16 dir_v_q /*, norm_tmp_q*/; Word16 band_m_idx, block_m_idx; Word16 mrange[2]; @@ -401,7 +401,6 @@ static void ivas_omasa_param_est_ana_fx( move32(); hOMasa->chnlToFoaMtx_fx[3][i] = L_mult( getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_azimuth_fx[i], 46603 /*2^24/360*/ ) ) ), getCosWord16R2( extract_l( Mpy_32_32( hOMasa->ism_elevation_fx[i], 46603 /*2^24/360*/ ) ) ) ); // Q31 move32(); - } /* do processing over all CLDFB time slots */ @@ -439,7 +438,7 @@ static void ivas_omasa_param_est_ana_fx( move16(); FOR( i = 0; i < nchan_ism; i++ ) { - + inp_q = data_f_q; move16(); cldfbAnalysis_ts_fx_fixed_q( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &inp_q ); @@ -466,8 +465,8 @@ static void ivas_omasa_param_est_ana_fx( FOR( j = brange[0]; j < brange[1]; j++ ) { FOR( i = 0; i < nchan_ism; i++ ) - { - Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e + { + Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e hOMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->energy_fx[block_m_idx][band_m_idx], hOMasa->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hOMasa->energy_e[block_m_idx][band_m_idx] ); move32(); } @@ -477,8 +476,8 @@ static void ivas_omasa_param_est_ana_fx( /* Compute FOA */ /* W */ - Copy32( Chnl_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins );//inp_q - Copy32( Chnl_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins );//inp_q + Copy32( Chnl_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins ); // inp_q + Copy32( Chnl_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins ); // inp_q FOR( i = 1; i < nchan_ism; i++ ) { @@ -504,8 +503,8 @@ static void ivas_omasa_param_est_ana_fx( /* Z */ - v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0] , Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0] , Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_RealBuffer_fx[2], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[2][0], Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { @@ -513,15 +512,15 @@ static void ivas_omasa_param_est_ana_fx( v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[2][i], Foa_ImagBuffer_fx[2], num_freq_bins ); // Q: Chnl_ImagBuffer_q } - v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0] , Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q - v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0] , Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q + v_multc_fixed( Chnl_RealBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q + v_multc_fixed( Chnl_ImagBuffer_fx[0], hOMasa->chnlToFoaMtx_fx[3][0], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q FOR( i = 1; i < nchan_ism; i++ ) { v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q } - computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx );/* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ + computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ intensity_q = sub( 31, shl( c_e, 1 ) ); computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), NULL ); /* Q direction_vector_fx = Q30*/ @@ -547,7 +546,7 @@ static void ivas_omasa_param_est_ana_fx( hOMasa->buffer_energy_q[index - 1] = reference_power_q; move16(); - computeDiffuseness_fixed( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &diffuseness_q );//diffuseness_q=Q30 + computeDiffuseness_fixed( hOMasa->buffer_intensity_real_fx, hOMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hOMasa->buffer_intensity_real_q, hOMasa->buffer_energy_q, &diffuseness_q ); // diffuseness_q=Q30 FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { @@ -564,7 +563,6 @@ static void ivas_omasa_param_est_ana_fx( move32(); renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); move32(); - } } @@ -585,7 +583,6 @@ static void ivas_omasa_param_est_ana_fx( dir_v_q = sub( 31, max_e ); ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( dir_v_fx, dir_v_q, &azimuth_m_values_fx[block_m_idx][band_m_idx], &elevation_m_values_fx[block_m_idx][band_m_idx] ); - } /* Determine energy ratios */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 588e416ca..2654e5a53 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1596,7 +1596,7 @@ typedef struct ivas_omasa_ana_data_structure MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; - Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ + Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ Word16 **direction_vector_e[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Average direction vector */ Word32 ism_azimuth_fx[MAX_NUM_OBJECTS]; Word32 ism_elevation_fx[MAX_NUM_OBJECTS]; @@ -1629,7 +1629,7 @@ typedef struct ivas_dirac_ana_data_structure HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[DIRAC_MAX_ANA_CHANS]; /* DirAC parameter estimation */ - Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ + Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ Word16 **direction_vector_e[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Average direction vector */ Word16 band_grouping[MASA_FREQUENCY_BANDS + 1]; Word16 block_grouping[5]; -- GitLab From dea11c9dfa834a7625eb7cf65dfa558291b54e1a Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 5 Jun 2025 12:02:05 +0200 Subject: [PATCH 0824/1310] Whitespace changes to minimise diff wrt original changes --- apps/decoder.c | 2 ++ lib_dec/lib_dec_fx.c | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index fdfc42054..2cc639e6a 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2477,6 +2477,7 @@ static ivas_error decodeVoIP( #endif } + #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE int16_t nSamplesFlushed = 0; @@ -2563,6 +2564,7 @@ static ivas_error decodeVoIP( } #endif + /*------------------------------------------------------------------------------------------* * Add zeros at the end to have equal length of synthesized signals *------------------------------------------------------------------------------------------*/ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 318129f6d..e1989effe 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -85,8 +85,8 @@ struct IVAS_DEC #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE Word16 timeScalingDone; /* have we done already one TSM in a 20ms frame? */ #endif - Word32 *apaExecBuffer_fx; /* Buffer for APA scaling */ Word16 tsm_quality; /*Q14*/ + Word32 *apaExecBuffer_fx; /* Buffer for APA scaling */ PCMDSP_APA_HANDLE hTimeScaler; bool needNewFrame; bool hasBeenFedFrame; @@ -2792,6 +2792,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( dbgwrite( &scale, sizeof( uint32_t ), 1, 1, "./res/JBM_scale.dat" ); dbgwrite( &maxScaling, sizeof( uint32_t ), 1, 1, "./res/JBM_maxScale.dat" ); #endif + /* avoid time scaling multiple times in one sound card slot */ IF( NE_64( scale, 100U ) ) { @@ -2904,7 +2905,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( move16(); move16(); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesToZero ); #endif } @@ -2922,7 +2922,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesRendered = add( nSamplesRendered, nSamplesRendered_loop ); #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - update_voip_rendered20ms( hIvasDec, nSamplesRendered_loop ); #endif } @@ -2932,7 +2931,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE - /*---------------------------------------------------------------------* * update_voip_rendered20ms( ) * -- GitLab From 57d62ec2f79460805c660881288008c1962adae1 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 5 Jun 2025 12:07:07 +0200 Subject: [PATCH 0825/1310] Add missing move16 counter --- lib_dec/lib_dec_fx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index e1989effe..5c8f8ac08 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2761,6 +2761,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE extBufferedSamples = nSamplesBuffered; + move16(); #else extBufferedSamples = add( nSamplesRendered, nSamplesBuffered ); #endif -- GitLab From 4272cc79608cb23134b2d8260f1c2eede5d4e8d4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 5 Jun 2025 15:55:30 +0530 Subject: [PATCH 0826/1310] Added missed pointer freeing in renderer --- lib_rend/ivas_dirac_ana_fx.c | 5 ++++- lib_rend/ivas_omasa_ana_fx.c | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 4fd86c9fe..f282e8390 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -214,6 +214,9 @@ void ivas_dirac_ana_close_fx( ( *hDirAC )->direction_vector_e[i][j] = NULL; } + free( ( *hDirAC )->direction_vector_e[i] ); + ( *hDirAC )->direction_vector_e[i] = NULL; + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { free( ( *hDirAC )->buffer_intensity_real_fx[i][j] ); @@ -348,7 +351,7 @@ static void ivas_dirac_param_est_ana_fx( move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][imult1616( l_ts, ts )] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); + cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][( l_ts * ts )] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); ci_q = s_min( ci_q, getScaleFactor32( Foa_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); } diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index f82ac12bd..bce8870c8 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -276,6 +276,9 @@ void ivas_omasa_ana_close( free( ( *hOMasa )->direction_vector_m_fx[i] ); ( *hOMasa )->direction_vector_m_fx[i] = NULL; + + free( ( *hOMasa )->direction_vector_e[i] ); + ( *hOMasa )->direction_vector_e[i] = NULL; } free( ( *hOMasa )->hMasaOut ); -- GitLab From 23d04da560255d17065a42947911b5382614e1a4 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 5 Jun 2025 13:13:19 +0200 Subject: [PATCH 0827/1310] Try to prevent clang-format from breaking indentation --- lib_dec/lib_dec_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 5c8f8ac08..10c90f5a9 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2796,10 +2796,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( /* avoid time scaling multiple times in one sound card slot */ IF( NE_64( scale, 100U ) ) - { #ifdef NONBE_FIX_864_JBM_RENDER_FRAMESIZE + { IF( hIvasDec->timeScalingDone ) #else + { IF( timeScalingDone ) #endif { -- GitLab From ddb4020390f158ea1611a013ff6d87829b76b508 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Thu, 5 Jun 2025 13:21:44 +0200 Subject: [PATCH 0828/1310] Apply formatting patch --- lib_dec/lib_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 10c90f5a9..9a60d024f 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2800,8 +2800,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { IF( hIvasDec->timeScalingDone ) #else - { - IF( timeScalingDone ) + { + IF( timeScalingDone ) #endif { scale = 100; -- GitLab From f06c3dbf256859248e191cda8423d9a820faf352 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 5 Jun 2025 14:18:19 +0200 Subject: [PATCH 0829/1310] Modified the length calculation of the old_syn_Overl buffer in q_win computation. --- lib_dec/dec_tcx_fx.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 4ab18e102..6b68ef930 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2575,6 +2575,7 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN static Word16 IMDCT_ivas_fx_calc_qwin( + Decoder_State *st, Word16 *syn_Overl_TDAC, Word16 Q_syn_Overl_TDAC, Word16 *syn_Overl, @@ -2588,7 +2589,7 @@ static Word16 IMDCT_ivas_fx_calc_qwin( const Word16 L_frameTCX, const Word16 FB_flag ) { - Word16 oldLength, t; + Word16 oldLength, t, old_syn_Overl_len; oldLength = s_min( L_FRAME32k, L_frame ); t = L_FRAME32k; @@ -2600,14 +2601,20 @@ static Word16 IMDCT_ivas_fx_calc_qwin( move16(); } + old_syn_Overl_len = st->hTcxCfg->tcx_mdct_window_length; + IF( ( st->prev_bfi && EQ_16( st->last_core_bfi, ACELP_CORE ) ) || EQ_16( st->last_core, ACELP_CORE ) ) + { + old_syn_Overl_len = shr( st->L_frame, 1 ); + } + q_win = 6; move16(); // q_win == norm + Q_syn_Overl_TDAC - q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, oldLength / 2 ) + Q_syn_Overl_TDAC ); + q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, shr(oldLength, 1) ) + Q_syn_Overl_TDAC ); // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); - q_win = s_min( q_win, norm_arr( syn_Overl, t / 2 ) + Q_syn_Overl ); - q_win = s_min( q_win, norm_arr( old_syn_Overl, oldLength / 2 ) + Q_old_syn_Overl ); + q_win = s_min( q_win, norm_arr( syn_Overl, shr(t, 1) ) + Q_syn_Overl ); + q_win = s_min( q_win, norm_arr( old_syn_Overl, old_syn_Overl_len ) + Q_old_syn_Overl ); // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); @@ -3001,7 +3008,7 @@ void IMDCT_ivas_fx( IF( allow_qwin_change ) { // q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); - q_win = IMDCT_ivas_fx_calc_qwin( syn_Overl_TDAC_fx, *Q_syn_Overl_TDAC_fx, old_syn_overl_fx, *Q_old_syn_overl_fx, + q_win = IMDCT_ivas_fx_calc_qwin( st, syn_Overl_TDAC_fx, *Q_syn_Overl_TDAC_fx, old_syn_overl_fx, *Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, q_win, L_frame, L_frameTCX, FB_flag ); } #else -- GitLab From d8a74f2a3593a5c61f259287dcd2a64bb240dce4 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 5 Jun 2025 14:36:27 +0200 Subject: [PATCH 0830/1310] Applied clang formatting patch. --- lib_dec/dec_tcx_fx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 6b68ef930..60c5e078a 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2575,7 +2575,7 @@ void IMDCT_fx( Word32 *x, Word16 x_e, Word16 *old_syn_overl, Word16 *syn_Overl_T #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN static Word16 IMDCT_ivas_fx_calc_qwin( - Decoder_State *st, + Decoder_State *st, Word16 *syn_Overl_TDAC, Word16 Q_syn_Overl_TDAC, Word16 *syn_Overl, @@ -2589,7 +2589,7 @@ static Word16 IMDCT_ivas_fx_calc_qwin( const Word16 L_frameTCX, const Word16 FB_flag ) { - Word16 oldLength, t, old_syn_Overl_len; + Word16 oldLength, t, old_syn_Overl_len; oldLength = s_min( L_FRAME32k, L_frame ); t = L_FRAME32k; @@ -2606,14 +2606,14 @@ static Word16 IMDCT_ivas_fx_calc_qwin( { old_syn_Overl_len = shr( st->L_frame, 1 ); } - + q_win = 6; move16(); // q_win == norm + Q_syn_Overl_TDAC - q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, shr(oldLength, 1) ) + Q_syn_Overl_TDAC ); + q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, shr( oldLength, 1 ) ) + Q_syn_Overl_TDAC ); // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); - q_win = s_min( q_win, norm_arr( syn_Overl, shr(t, 1) ) + Q_syn_Overl ); + q_win = s_min( q_win, norm_arr( syn_Overl, shr( t, 1 ) ) + Q_syn_Overl ); q_win = s_min( q_win, norm_arr( old_syn_Overl, old_syn_Overl_len ) + Q_old_syn_Overl ); // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); -- GitLab From 86af060636474ee4b1b2fa54912cbe2ab355ed4b Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 5 Jun 2025 16:17:55 +0200 Subject: [PATCH 0831/1310] Fix cldfbAnalysis_ts_fx() in regard to the consistency of real/imag output buffers scale respective to q_cldfb. --- lib_com/cldfb_fx.c | 19 +++++++++++++++++++ lib_com/options.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/lib_com/cldfb_fx.c b/lib_com/cldfb_fx.c index bf832b640..06d72668f 100644 --- a/lib_com/cldfb_fx.c +++ b/lib_com/cldfb_fx.c @@ -519,6 +519,7 @@ void cldfbAnalysis_ts_fx( } fft_cldfb_fx( rBuffer_fx, M2 ); +#ifndef FIX_1733_CLDFB_BUG /* post modulation of DST IV */ FOR( k = 0; k < M2; k++ ) { @@ -533,6 +534,7 @@ void cldfbAnalysis_ts_fx( move32(); move32(); } +#endif *q_cldfb = sub( *q_cldfb, 2 ); move16(); @@ -553,6 +555,23 @@ void cldfbAnalysis_ts_fx( move32(); } +#ifdef FIX_1733_CLDFB_BUG + /* post modulation of DST IV */ + FOR( k = 0; k < M2; k++ ) + { + /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ +#ifdef OPT_AVOID_STATE_BUF_RESCALE + realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 + realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 +#else /* OPT_AVOID_STATE_BUF_RESCALE */ + realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 + realBuffer_fx[2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 +#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + move32(); + move32(); + } + +#endif /* post modulation of DCT IV */ FOR( k = 0; k < M2; k++ ) { diff --git a/lib_com/options.h b/lib_com/options.h index a5d5a4846..12580b20d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,4 +106,6 @@ #define FIX_1713_EXP /* VA: proposed correction to exp in ic-BWE*/ +#define FIX_1733_CLDFB_BUG + #endif -- GitLab From 6e410b332207a461eb284ba31d77a6cf928324fa Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 5 Jun 2025 16:21:38 +0200 Subject: [PATCH 0832/1310] clang format --- lib_com/cldfb_fx.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib_com/cldfb_fx.c b/lib_com/cldfb_fx.c index 06d72668f..ede4be78b 100644 --- a/lib_com/cldfb_fx.c +++ b/lib_com/cldfb_fx.c @@ -417,8 +417,8 @@ void cldfbAnalysis_ts_fx( rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -431,8 +431,8 @@ void cldfbAnalysis_ts_fx( iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -478,8 +478,8 @@ void cldfbAnalysis_ts_fx( rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -492,8 +492,8 @@ void cldfbAnalysis_ts_fx( iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -581,8 +581,8 @@ void cldfbAnalysis_ts_fx( imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 + imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 + imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -608,8 +608,8 @@ void cldfbAnalysis_ts_fx( cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5 imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 - imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 + cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 + imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ realBuffer_fx[k] = cplx_aux_fx; move32(); -- GitLab From 7a7d3f5bf0cdd7472472f5191dc903648368d073 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 5 Jun 2025 16:44:43 +0200 Subject: [PATCH 0833/1310] Modified the length calculation of the Q_syn_Overl_TDAC and syn_Overl buffers in q_win computation. --- lib_dec/dec_tcx_fx.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 60c5e078a..62c06a2c5 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2589,7 +2589,7 @@ static Word16 IMDCT_ivas_fx_calc_qwin( const Word16 L_frameTCX, const Word16 FB_flag ) { - Word16 oldLength, t, old_syn_Overl_len; + Word16 oldLength, t, old_syn_Overl_len, syn_Overl_TDAC_len; oldLength = s_min( L_FRAME32k, L_frame ); t = L_FRAME32k; @@ -2602,18 +2602,26 @@ static Word16 IMDCT_ivas_fx_calc_qwin( } old_syn_Overl_len = st->hTcxCfg->tcx_mdct_window_length; + syn_Overl_TDAC_len = s_max( st->hTcxCfg->tcx_mdct_window_length_old, 0 ); + IF( ( st->prev_bfi && EQ_16( st->last_core_bfi, ACELP_CORE ) ) || EQ_16( st->last_core, ACELP_CORE ) ) { old_syn_Overl_len = shr( st->L_frame, 1 ); + syn_Overl_TDAC_len = shr( st->last_L_frame, 1 ); + } + + IF( st->prev_bfi && ( st->last_core_bfi == ACELP_CORE ) ) + { + syn_Overl_TDAC_len = old_syn_Overl_len; } q_win = 6; move16(); // q_win == norm + Q_syn_Overl_TDAC - q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, shr( oldLength, 1 ) ) + Q_syn_Overl_TDAC ); + q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ) + Q_syn_Overl_TDAC ); // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); - q_win = s_min( q_win, norm_arr( syn_Overl, shr( t, 1 ) ) + Q_syn_Overl ); + q_win = s_min( q_win, norm_arr( syn_Overl, old_syn_Overl_len ) + Q_syn_Overl ); q_win = s_min( q_win, norm_arr( old_syn_Overl, old_syn_Overl_len ) + Q_old_syn_Overl ); // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); -- GitLab From b5b3ab48befebdd592664b32917923af91639974 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 5 Jun 2025 16:50:01 +0200 Subject: [PATCH 0834/1310] Applied clang formatting patch. --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 62c06a2c5..3604fa633 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2609,7 +2609,7 @@ static Word16 IMDCT_ivas_fx_calc_qwin( old_syn_Overl_len = shr( st->L_frame, 1 ); syn_Overl_TDAC_len = shr( st->last_L_frame, 1 ); } - + IF( st->prev_bfi && ( st->last_core_bfi == ACELP_CORE ) ) { syn_Overl_TDAC_len = old_syn_Overl_len; -- GitLab From 2a7486511d2ecb39d5ddcd40d509e61545fbdd50 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 5 Jun 2025 17:11:02 +0200 Subject: [PATCH 0835/1310] Removed unused variable to solve linux build failure. --- lib_dec/dec_tcx_fx.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 3604fa633..602aa7bbb 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2589,14 +2589,12 @@ static Word16 IMDCT_ivas_fx_calc_qwin( const Word16 L_frameTCX, const Word16 FB_flag ) { - Word16 oldLength, t, old_syn_Overl_len, syn_Overl_TDAC_len; + Word16 t, old_syn_Overl_len, syn_Overl_TDAC_len; - oldLength = s_min( L_FRAME32k, L_frame ); t = L_FRAME32k; move16(); if ( FB_flag ) { - oldLength = s_min( L_FRAME48k, L_frameTCX ); t = L_FRAME48k; move16(); } -- GitLab From d43e90a0970fea160b9d20cae6ac4c6cee3592b4 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 5 Jun 2025 17:24:24 +0200 Subject: [PATCH 0836/1310] Removed unused variable to solve linux build failure. --- lib_dec/dec_tcx_fx.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 602aa7bbb..c705ebd7a 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2585,8 +2585,6 @@ static Word16 IMDCT_ivas_fx_calc_qwin( Word16 *old_out_fx, Word16 Q_old_out_fx, Word16 q_win, - const Word16 L_frame, - const Word16 L_frameTCX, const Word16 FB_flag ) { Word16 t, old_syn_Overl_len, syn_Overl_TDAC_len; @@ -3015,7 +3013,7 @@ void IMDCT_ivas_fx( { // q_win = IMDCT_ivas_fx_adjust_qwin( *Q_syn_Overl_TDAC_fx, *Q_old_syn_overl_fx, hTcxDec->Q_old_syn_Overl, *q_old_out_fx, q_win ); q_win = IMDCT_ivas_fx_calc_qwin( st, syn_Overl_TDAC_fx, *Q_syn_Overl_TDAC_fx, old_syn_overl_fx, *Q_old_syn_overl_fx, - hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, q_win, L_frame, L_frameTCX, FB_flag ); + hTcxDec->old_syn_Overl, hTcxDec->Q_old_syn_Overl, old_out_fx, *q_old_out_fx, q_win, FB_flag ); } #else x_e_hdrm = add( q_win, sub( Q16, q_x ) ); -- GitLab From 071e71bc8a0a221ae139d836bfc65c74b2981263 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 6 Jun 2025 16:40:25 +0530 Subject: [PATCH 0837/1310] Fix for 3GPP issue 1502: MC 512 decoder with headtracking has high frequency artifacts (issue not seen w/o headtracking) Link #1502 #1040 #1348 --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 883024002..0cb470adc 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2879,7 +2879,7 @@ void IMDCT_ivas_fx( { Word16 q_old_out = q_win; move16(); - edct_fx( x_fx, xn_buf_fx_32 + add( shr( overlap, 1 ), nz ), L_frame, &q_xn_buf_fx_32 ); + edct_ivas_fx( x_fx, xn_buf_fx_32 + add( shr( overlap, 1 ), nz ), L_frame, &q_xn_buf_fx_32 ); Word16 res_m, res_e; res_e = 0; move16(); -- GitLab From 2760d40420779c634b4834cacec998299f2126ad Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Sun, 8 Jun 2025 16:13:22 +0200 Subject: [PATCH 0838/1310] formatting fixes --- lib_rend/ivas_crend_fx.c | 243 ++++++++++++++++---------------- lib_rend/ivas_reverb_fx.c | 5 +- lib_rend/ivas_reverb_utils_fx.c | 6 +- 3 files changed, 123 insertions(+), 131 deletions(-) diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index c180c59a8..392d8ea99 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -1741,64 +1741,63 @@ ivas_error ivas_rend_openCrend( #ifdef SPLIT_REND_WITH_HEAD_ROT for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) - for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) #endif - { + { #ifdef SPLIT_REND_WITH_HEAD_ROT - hCrend = ( *pCrend )->hCrend[pos_idx]; + hCrend = ( *pCrend )->hCrend[pos_idx]; #else hCrend = ( *pCrend )->hCrend; #endif - hHrtf = ( *pCrend )->hHrtfCrend; + hHrtf = ( *pCrend )->hHrtfCrend; - IF( hHrtf != NULL ) - { - max_total_ir_len = L_mult0( hHrtf->max_num_iterations, subframe_length ); + IF( hHrtf != NULL ) + { + max_total_ir_len = L_mult0( hHrtf->max_num_iterations, subframe_length ); - FOR( i = 0; i < hHrtf->max_num_ir; i++ ) + FOR( i = 0; i < hHrtf->max_num_ir; i++ ) + { + IF( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { - IF( ( hCrend->freq_buffer_re_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_zero2_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + set_zero2_fx( hCrend->freq_buffer_re_fx[i], max_total_ir_len ); - IF( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_zero2_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len ); + IF( ( hCrend->freq_buffer_im_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } + set_zero2_fx( hCrend->freq_buffer_im_fx[i], max_total_ir_len ); + } - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + IF( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) { - IF( ( hCrend->prev_out_buffer_fx[i] = (Word32 *) malloc( sizeof( Word32 ) * subframe_length ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length ); + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } + set_zero_fx( hCrend->prev_out_buffer_fx[i], subframe_length ); + } - max_total_ir_len = L_mult0( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length ); + max_total_ir_len = L_mult0( (Word16) hHrtf->num_iterations_diffuse[0], subframe_length ); - IF( max_total_ir_len > 0 ) - { + IF( max_total_ir_len > 0 ) + { #ifdef FIX_INV_DIFFUSE_WEIGHT - IF( ( hCrend->freq_buffer_re_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + IF( ( hCrend->freq_buffer_re_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_re_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - IF( hHrtf->same_inv_diffuse_weight == 0 ) - { - IF( ( hCrend->freq_buffer_re_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - } - ELSE - { - hCrend->freq_buffer_re_diffuse_fx[1] = NULL; - } + } + ELSE + { + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + } #else IF( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { @@ -1806,30 +1805,30 @@ ivas_error ivas_rend_openCrend( } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT - set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[0], max_total_ir_len ); - IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) - { - set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[1], max_total_ir_len ); - } + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[1], max_total_ir_len ); + } #else set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx, max_total_ir_len ); #endif #ifdef FIX_INV_DIFFUSE_WEIGHT - IF( ( hCrend->freq_buffer_im_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + IF( ( hCrend->freq_buffer_im_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); + } + IF( hHrtf->same_inv_diffuse_weight == 0 ) + { + IF( ( hCrend->freq_buffer_im_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } - IF( hHrtf->same_inv_diffuse_weight == 0 ) - { - IF( ( hCrend->freq_buffer_im_diffuse_fx[1] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - } - ELSE - { - hCrend->freq_buffer_im_diffuse_fx[1] = NULL; - } + } + ELSE + { + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; + } #else IF( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { @@ -1837,109 +1836,109 @@ ivas_error ivas_rend_openCrend( } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT - set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[0], max_total_ir_len ); - IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) - { - set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[1], max_total_ir_len ); - } + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[0], max_total_ir_len ); + IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) + { + set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[1], max_total_ir_len ); + } #else set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx, max_total_ir_len ); #endif - } - ELSE - { + } + ELSE + { #ifdef FIX_INV_DIFFUSE_WEIGHT - hCrend->freq_buffer_re_diffuse_fx[0] = NULL; - hCrend->freq_buffer_im_diffuse_fx[0] = NULL; - hCrend->freq_buffer_re_diffuse_fx[1] = NULL; - hCrend->freq_buffer_im_diffuse_fx[1] = NULL; + hCrend->freq_buffer_re_diffuse_fx[0] = NULL; + hCrend->freq_buffer_im_diffuse_fx[0] = NULL; + hCrend->freq_buffer_re_diffuse_fx[1] = NULL; + hCrend->freq_buffer_im_diffuse_fx[1] = NULL; #else hCrend->freq_buffer_re_diffuse_fx = NULL; hCrend->freq_buffer_im_diffuse_fx = NULL; #endif - } + } - max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ - IF( max_total_ir_len > 0 ) - { - IF( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } - set_zero2_fx( hCrend->lfe_delay_line_fx, max_total_ir_len ); - } - ELSE + max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ + IF( max_total_ir_len > 0 ) + { + IF( ( hCrend->lfe_delay_line_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { - hCrend->lfe_delay_line_fx = NULL; + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } + set_zero2_fx( hCrend->lfe_delay_line_fx, max_total_ir_len ); + } + ELSE + { + hCrend->lfe_delay_line_fx = NULL; + } - IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { + IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) #endif + { + return error; + } + + IF( EQ_16( hRendCfg->roomAcoustics.use_er, 1 ) ) + { + + /* Allocate memory for reflections */ + hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); + IF( !hCrend->reflections ) { - return error; + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); } - - IF( EQ_16( hRendCfg->roomAcoustics.use_er, 1 ) ) + IF( NE_32( ( error = ivas_er_init_handle( hCrend->reflections ) ), IVAS_ERR_OK ) ) { + return error; + } - /* Allocate memory for reflections */ - hCrend->reflections = (er_struct_t *) malloc( sizeof( er_struct_t ) ); - IF( !hCrend->reflections ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections" ); - } - IF( NE_32( ( error = ivas_er_init_handle( hCrend->reflections ) ), IVAS_ERR_OK ) ) - { - return error; - } - - hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; - hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; - move16(); - move32(); + hCrend->reflections->use_er = hRendCfg->roomAcoustics.use_er; + hCrend->reflections->lowComplexity = hRendCfg->roomAcoustics.lowComplexity; + move16(); + move32(); - /* Set sample rate and frame size */ + /* Set sample rate and frame size */ - hCrend->reflections->output_Fs_fx = output_Fs; // Q0 - move32(); + hCrend->reflections->output_Fs_fx = output_Fs; // Q0 + move32(); - hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); - move32(); + hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); + move32(); - /* Init Shoebox */ - ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); + /* Init Shoebox */ + ivas_shoebox_config_init( &hCrend->reflections->shoebox_lib.cal, hRendCfg ); - /* Init and compute Reflections */ - IF( NE_32( ( error = ivas_er_init( hCrend->reflections, inConfig ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - ELSE + /* Init and compute Reflections */ + IF( NE_32( ( error = ivas_er_init( hCrend->reflections, inConfig ) ), IVAS_ERR_OK ) ) { - hCrend->reflections = NULL; + return error; } } ELSE { - hCrend->hReverb = NULL; + hCrend->reflections = NULL; } - - ( *pCrend )->binaural_latency_ns = Mult_32_32( ( *pCrend )->hHrtfCrend->latency_s_fx, (Word32) 1000000000 ); - move32(); } + ELSE + { + hCrend->hReverb = NULL; + } + + ( *pCrend )->binaural_latency_ns = Mult_32_32( ( *pCrend )->hHrtfCrend->latency_s_fx, (Word32) 1000000000 ); + move32(); + } #ifdef SPLIT_REND_WITH_HEAD_ROT - ( *pCrend )->hCrend[pos_idx] = hCrend; + ( *pCrend )->hCrend[pos_idx] = hCrend; #else ( *pCrend )->hCrend = hCrend; #endif - } + } return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 336b9da3f..74c2a0c0a 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2502,15 +2502,12 @@ ivas_error ivas_binaural_reverb_init( { float t60_temp[CLDFB_NO_CHANNELS_MAX]; float ene_temp[CLDFB_NO_CHANNELS_MAX]; - // fixedToFloat_arrL( t60, t60_temp, Q15, CLDFB_NO_CHANNELS_MAX ); - // fixedToFloat_arrL( ene, ene_temp, Q15, CLDFB_NO_CHANNELS_MAX ); - // if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60, ene ) ) != IVAS_ERR_OK ) if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60_temp, ene_temp ) ) != IVAS_ERR_OK ) { return error; } floatToFixed_arrL32( t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX ); - floatToFixed_arrL32( t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL32( ene_temp, ene, Q15, CLDFB_NO_CHANNELS_MAX ); revTimes = t60; revEne = ene; diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 6b9ecf3ab..75cc4b816 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -101,7 +101,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; float delay_diff, ln_1e6_inverted, exp_argument; const float dist = DEFAULT_SRC_DIST; - const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; // Represent in fixed point? + const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif @@ -149,10 +149,6 @@ ivas_error ivas_reverb_prepare_cldfb_params( pOutput_ene[idx] *= expf( exp_argument ); } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - - // Word32 avg_pwr_left_temp[CLDFB_NO_CHANNELS_MAX]; - // Word32 avg_pwr_right_temp[CLDFB_NO_CHANNELS_MAX]; - ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right ); #else if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) -- GitLab From 7a59cc5c78501ad0865d315e4af4aab706bb6d9b Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Sun, 8 Jun 2025 16:28:52 +0200 Subject: [PATCH 0839/1310] marked branch as ready, trigger full pipeline -- GitLab From b55b837d06be2c2f160ac01f8c9bc2c8356f6c59 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 9 Jun 2025 11:29:32 +0530 Subject: [PATCH 0840/1310] Fix for 3GPP issue 1731: OMASA BASOP bitstream crashing float decoder (ivas_mdct_core_invQ) Link #1731 --- lib_com/ivas_cnst.h | 2 +- lib_com/ivas_masa_com_fx.c | 6 +++--- lib_com/ivas_prot_fx.h | 2 +- lib_dec/ivas_masa_dec_fx.c | 2 +- lib_enc/ivas_masa_enc_fx.c | 8 +------- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 097ba1789..d3e52ec16 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -383,7 +383,7 @@ typedef enum #define PARAM_ISM_MAX_CHAN 16 #define PARAM_ISM_HYS_BUF_SIZE 10 -#define STEP_PARAM_ISM_POW_RATIO_NBITS_Q15 (4681) /* 1.0f / (float)((1 << PARAM_ISM_POW_RATIO_NBITS) - 1) */ +#define STEP_PARAM_ISM_POW_RATIO_NBITS_Q31 (306783378) /* 1.0f / (float)((1 << PARAM_ISM_POW_RATIO_NBITS) - 1) */ /* ISM DTX */ #define ISM_Q_STEP_FX ( 10485760 ) // Q22 diff --git a/lib_com/ivas_masa_com_fx.c b/lib_com/ivas_masa_com_fx.c index cfed06357..a28e229ff 100644 --- a/lib_com/ivas_masa_com_fx.c +++ b/lib_com/ivas_masa_com_fx.c @@ -1308,7 +1308,7 @@ Word16 valid_ratio_index_fx( void reconstruct_ism_ratios_fx( Word16 *ratio_ism_idx, /* i : index vector Q0 */ const Word16 nchan_ism, /* i : number of components/objects Q0 */ - const Word16 step, /* i : quantization step Q15 */ + const Word32 step, /* i : quantization step Q31 */ Word32 *q_energy_ratio_ism /* o : reconstructed ISM values Q30 */ ) { @@ -1317,10 +1317,10 @@ void reconstruct_ism_ratios_fx( sum = 0; move32(); - + FOR( i = 0; i < nchan_ism - 1; i++ ) { - q_energy_ratio_ism[i] = L_shl( L_mult( ratio_ism_idx[i], step ), 14 ); // q0 + q15 + 1 + 14 = q30; + q_energy_ratio_ism[i] = W_extract_l(W_shr( W_mult_32_16( step, ratio_ism_idx[i] ), 2 )); // q0 + q31 + 1 - 2 = q30; move32(); sum = L_add( sum, q_energy_ratio_ism[i] ); // Q30 diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index d9ca855be..542f9e0e9 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -115,7 +115,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( void reconstruct_ism_ratios_fx( Word16 *ratio_ism_idx, /* i : index vector Q0 */ const Word16 nchan_ism, /* i : number of components/objects Q0 */ - const Word16 step, /* i : quantization step Q15 */ + const Word32 step, /* i : quantization step Q31 */ Word32 *q_energy_ratio_ism /* o : reconstructed ISM values Q30 */ ); diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index 36900867e..e61e51262 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -3097,7 +3097,7 @@ static void decode_ism_ratios_fx( /* reconstructed values */ FOR( band = 0; band < nbands; band++ ) { - reconstruct_ism_ratios_fx( ratio_ism_idx[band], n_ism, STEP_PARAM_ISM_POW_RATIO_NBITS_Q15, ratio_ism[sf][band] ); + reconstruct_ism_ratios_fx( ratio_ism_idx[band], n_ism, STEP_PARAM_ISM_POW_RATIO_NBITS_Q31, ratio_ism[sf][band] ); } test(); diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 303d11698..fb86dee7a 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -4666,7 +4666,6 @@ static void ivas_encode_masaism_metadata_fx( UWord16 index_theta, index_phi; Word16 ratio_ism_fx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; Word16 ratio_ism_idx[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS], ratio_ism_idx_prev_sf[MASA_FREQUENCY_BANDS][MAX_NUM_OBJECTS]; - Word16 step; Word32 energy_ism, energy_ism_ind[MAX_NUM_OBJECTS]; Word16 tmp, rotate, energy_ism_e, energy_ism_ind_e[MAX_NUM_OBJECTS]; Word16 n_ism_tmp, i; @@ -4919,11 +4918,6 @@ static void ivas_encode_masaism_metadata_fx( /* quantize ism_ratios */ IF( GT_16( nchan_ism, 1 ) ) { - /* inv_step = ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ); * - * step = 1.0f / inv_step; */ - step = 4681; // 1.f / ( ( 1 << PARAM_ISM_POW_RATIO_NBITS ) - 1 ) => 1.f / 7 in Q15 - move16(); - rotate = 0; n_ism_tmp = 0; move16(); @@ -4968,7 +4962,7 @@ static void ivas_encode_masaism_metadata_fx( } /* reconstructed values */ - reconstruct_ism_ratios_fx( ratio_ism_idx[band], nchan_ism, step, hMasa->data.hOmasaData->q_energy_ratio_ism_fx[sf][band] ); + reconstruct_ism_ratios_fx( ratio_ism_idx[band], nchan_ism, STEP_PARAM_ISM_POW_RATIO_NBITS_Q31, hMasa->data.hOmasaData->q_energy_ratio_ism_fx[sf][band] ); } test(); IF( GT_16( nchan_ism, 2 ) && EQ_16( idx_separated_object, sub( nchan_ism, 1 ) ) ) -- GitLab From 027d6aa2294158b013f6b2b97126bdbcc040de62 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 9 Jun 2025 11:33:58 +0530 Subject: [PATCH 0841/1310] Clang formatting changes --- lib_com/ivas_masa_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_masa_com_fx.c b/lib_com/ivas_masa_com_fx.c index a28e229ff..a691fb390 100644 --- a/lib_com/ivas_masa_com_fx.c +++ b/lib_com/ivas_masa_com_fx.c @@ -1317,10 +1317,10 @@ void reconstruct_ism_ratios_fx( sum = 0; move32(); - + FOR( i = 0; i < nchan_ism - 1; i++ ) { - q_energy_ratio_ism[i] = W_extract_l(W_shr( W_mult_32_16( step, ratio_ism_idx[i] ), 2 )); // q0 + q31 + 1 - 2 = q30; + q_energy_ratio_ism[i] = W_extract_l( W_shr( W_mult_32_16( step, ratio_ism_idx[i] ), 2 ) ); // q0 + q31 + 1 - 2 = q30; move32(); sum = L_add( sum, q_energy_ratio_ism[i] ); // Q30 -- GitLab From dae6401d9374fdde1bced371758d7d6e6398a9f9 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 9 Jun 2025 19:30:09 +0530 Subject: [PATCH 0842/1310] Fix for 3GPP issue 1730: Rendering MASA LTV has severe audible distortions Link #1730 --- .../ivas_dirac_dec_binaural_functions_fx.c | 107 +++++++++--------- lib_rend/ivas_rotation_fx.c | 9 +- lib_rend/ivas_stat_rend.h | 4 +- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 2db86d6eb..6dc701468 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -2740,14 +2740,12 @@ static void adaptTransportSignalsHeadtracked_fx( Word16 slot, ch, bin, louderCh; Word32 mono_factor_ILD, mono_factor; Word32 y_val, mono_factor_rotation, ene_proc, ene_target, ILD; + Word16 ene_proc_e, ene_target_e; Word16 max_band; Word32 eqVal; Word16 band_idx, bin_lo, bin_hi, norm, shift = 31; - Word16 q_chEneIIR = 0, q_procChEneIIR = 0; Word32 temp_div; - Word16 e_div, tmp, is_zero, i; - move16(); - move16(); + Word16 e_div, is_zero, i; move16(); #ifdef OPT_BIN_RENDERER_V1 @@ -2793,16 +2791,17 @@ static void adaptTransportSignalsHeadtracked_fx( shift = sub( shift, 5 ); // 5 is gaurded bits needed// Word32 re, img, temp; - Word16 q_temp = sub( imult1616( 2, add( q_inp, shift ) ), 31 ); + Word16 s, q_band_nrg, q_temp[2]; FOR( band_idx = 0; band_idx < max_band; band_idx++ ) { - Word32 ch_nrg[2]; /* storage for input signal channel energies */ + Word32 ch_nrg[2]; /* storage for input signal channel energies */ + Word64 W_ch_nrg[2]; /* storage for input signal channel energies */ bin_lo = MASA_band_grouping_24[band_idx]; bin_hi = s_min( MASA_band_grouping_24[band_idx + 1], (Word16) nBins ); FOR( ch = 0; ch < 2; ch++ ) { - ch_nrg[ch] = 0; + W_ch_nrg[ch] = 0; move32(); FOR( slot = 0; slot < nSlots; slot++ ) { @@ -2811,24 +2810,31 @@ static void adaptTransportSignalsHeadtracked_fx( re = L_shl( inRe_fx[ch][slot][bin], shift ); img = L_shl( inIm_fx[ch][slot][bin], shift ); - ch_nrg[ch] = L_add( ch_nrg[ch], ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31 - move32(); + W_ch_nrg[ch] = W_add( W_ch_nrg[ch], ( W_add( W_mult0_32_32( re, re ), W_mult0_32_32( img, img ) ) ) ); // 2(q_inp +shift) + move64(); } } + s = W_norm( W_ch_nrg[ch] ); + ch_nrg[ch] = W_extract_h( W_shl( W_ch_nrg[ch], s ) ); // Q: 2*(q_inp+shift) + s - 32 + q_temp[ch] = sub( add( shl( add( q_inp, shift ), 1 ), s ), 32 ); + move32(); + move16(); + hHeadTrackData->chEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->chEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // q_chEneIIR move32(); - temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); - IF( LT_16( hHeadTrackData->q_chEneIIR, q_temp ) ) + temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); // q_temp[ch] + IF( LT_16( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ) ) { - hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_chEneIIR ) ), hHeadTrackData->chEneIIR_fx[ch][band_idx] ); + hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp[ch], hHeadTrackData->q_chEneIIR[ch][band_idx] ) ), hHeadTrackData->chEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_chEneIIR[ch][band_idx] } ELSE { - hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR, q_temp ) ), temp ); + hHeadTrackData->chEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->chEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ) ), temp ); // q_temp[ch] } move32(); + hHeadTrackData->q_chEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_chEneIIR[ch][band_idx], q_temp[ch] ); + move16(); } - q_chEneIIR = s_min( hHeadTrackData->q_chEneIIR, q_temp ); /* Determine ILD */ IF( EQ_32( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ) ) ) @@ -2839,7 +2845,7 @@ static void adaptTransportSignalsHeadtracked_fx( ELSE { temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( L_max( 1, hHeadTrackData->chEneIIR_fx[0][band_idx] ), L_max( 1, hHeadTrackData->chEneIIR_fx[1][band_idx] ), &e_div ) ); - + e_div = add( e_div, sub( hHeadTrackData->q_chEneIIR[1][band_idx], hHeadTrackData->q_chEneIIR[0][band_idx] ) ); temp = BASOP_Util_Log2( temp_div ); // Q25 IF( e_div > 0 ) { @@ -2853,7 +2859,7 @@ static void adaptTransportSignalsHeadtracked_fx( temp = Mpy_32_32( temp, 646462464 ); // logx base 10 = 0.30103* logx base 2// ILD = L_abs( Mpy_32_16_1( temp, 20480 ) ); // Q21 } - IF( GT_32( hHeadTrackData->chEneIIR_fx[1][band_idx], hHeadTrackData->chEneIIR_fx[0][band_idx] ) ) + IF( BASOP_Util_Cmp_Mant32Exp( hHeadTrackData->chEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[1][band_idx] ), hHeadTrackData->chEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[0][band_idx] ) ) > 0 ) { louderCh = 1; } @@ -2886,8 +2892,9 @@ static void adaptTransportSignalsHeadtracked_fx( { IF( NE_16( ch, louderCh ) ) { - Word32 band_nrg = 0; - move32(); + Word32 band_nrg; + Word64 W_band_nrg = 0; + move64(); FOR( slot = 0; slot < nSlots; slot++ ) { @@ -2898,24 +2905,31 @@ static void adaptTransportSignalsHeadtracked_fx( inIm_fx[ch][slot][bin] = L_add( ( Mpy_32_32( mono_factor, L_add( inIm_fx[0][slot][bin], inIm_fx[1][slot][bin] ) ) ), ( Mpy_32_32( L_sub( ONE_IN_Q31, mono_factor ), inIm_fx[ch][slot][bin] ) ) ); move32(); move32(); - re = L_shl( inRe_fx[ch][slot][bin], shift ); // q_inp +shift - img = L_shl( inIm_fx[ch][slot][bin], shift ); // q_inp +shift - band_nrg = L_add( band_nrg, ( L_add( Mpy_32_32( re, re ), Mpy_32_32( img, img ) ) ) ); // 2(q_inp +shift) -31 + re = L_shl( inRe_fx[ch][slot][bin], shift ); // q_inp +shift + img = L_shl( inIm_fx[ch][slot][bin], shift ); // q_inp +shift + + W_band_nrg = W_add( W_band_nrg, ( W_add( W_mult0_32_32( re, re ), W_mult0_32_32( img, img ) ) ) ); // 2(q_inp + shift) } } - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // q_procChEneIIR + s = W_norm( W_band_nrg ); + band_nrg = W_extract_h( W_shl( W_band_nrg, s ) ); // Q: 2*(q_inp+shift) + s - 32 + q_band_nrg = sub( add( shl( add( q_inp, shift ), 1 ), s ), 32 ); + + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = Mpy_32_16_1( hHeadTrackData->procChEneIIR_fx[ch][band_idx], ADAPT_HTPROTO_IIR_FAC_FX ); // hHeadTrackData->q_procChEneIIR[ch][band_idx] move32(); - temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); - IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) + temp = Mpy_32_16_1( band_nrg, sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); // q_band_nrg + IF( LT_16( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ) ) { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_band_nrg, hHeadTrackData->q_procChEneIIR[ch][band_idx] ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_procChEneIIR[ch][band_idx] } ELSE { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ) ), temp ); // q_band_nrg } move32(); + hHeadTrackData->q_procChEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_band_nrg ); + move16(); } ELSE { @@ -2924,27 +2938,27 @@ static void adaptTransportSignalsHeadtracked_fx( move32(); temp = Mpy_32_16_1( ch_nrg[ch], sub( 32767, ADAPT_HTPROTO_IIR_FAC_FX ) ); - IF( LT_16( hHeadTrackData->q_procChEneIIR, q_temp ) ) + IF( LT_16( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ) ) { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp, hHeadTrackData->q_procChEneIIR ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( temp, sub( q_temp[ch], hHeadTrackData->q_procChEneIIR[ch][band_idx] ) ), hHeadTrackData->procChEneIIR_fx[ch][band_idx] ); // hHeadTrackData->q_procChEneIIR[ch][band_idx] } ELSE { - hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR, q_temp ) ), temp ); + hHeadTrackData->procChEneIIR_fx[ch][band_idx] = L_add( L_shr( hHeadTrackData->procChEneIIR_fx[ch][band_idx], sub( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ) ), temp ); // q_temp[ch] } move32(); + hHeadTrackData->q_procChEneIIR[ch][band_idx] = s_min( hHeadTrackData->q_procChEneIIR[ch][band_idx], q_temp[ch] ); + move16(); } } - q_procChEneIIR = s_min( hHeadTrackData->q_procChEneIIR, q_temp ); - /* Equalize */ - ene_target = L_add( hHeadTrackData->chEneIIR_fx[0][band_idx], hHeadTrackData->chEneIIR_fx[1][band_idx] ); // q_chEneIIR// + ene_target = BASOP_Util_Add_Mant32Exp( hHeadTrackData->chEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[0][band_idx] ), hHeadTrackData->chEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_chEneIIR[1][band_idx] ), &ene_target_e ); - ene_proc = L_add( hHeadTrackData->procChEneIIR_fx[0][band_idx], hHeadTrackData->procChEneIIR_fx[1][band_idx] ); // q_procChEneIIR// + ene_proc = BASOP_Util_Add_Mant32Exp( hHeadTrackData->procChEneIIR_fx[0][band_idx], sub( 31, hHeadTrackData->q_procChEneIIR[0][band_idx] ), hHeadTrackData->procChEneIIR_fx[1][band_idx], sub( 31, hHeadTrackData->q_procChEneIIR[1][band_idx] ), &ene_proc_e ); temp_div = L_deposit_h( BASOP_Util_Divide3232_Scale( ene_target, L_max( 1, ene_proc ), &e_div ) ); - e_div = add( e_div, sub( q_procChEneIIR, q_chEneIIR ) ); + e_div = add( e_div, sub( ene_target_e, ene_proc_e ) ); eqVal = Sqrt32( temp_div, &e_div ); @@ -2994,16 +3008,8 @@ static void adaptTransportSignalsHeadtracked_fx( } IF( is_zero ) { - hHeadTrackData->q_chEneIIR = 31; - move16(); - } - ELSE - { - tmp = sub( s_min( getScaleFactor32( hHeadTrackData->chEneIIR_fx[0], MASA_FREQUENCY_BANDS ), getScaleFactor32( hHeadTrackData->chEneIIR_fx[1], MASA_FREQUENCY_BANDS ) ), 1 ); - scale_sig32( hHeadTrackData->chEneIIR_fx[0], MASA_FREQUENCY_BANDS, tmp ); - scale_sig32( hHeadTrackData->chEneIIR_fx[1], MASA_FREQUENCY_BANDS, tmp ); - hHeadTrackData->q_chEneIIR = add( q_chEneIIR, tmp ); - move16(); + set16_fx( hHeadTrackData->q_chEneIIR[0], 31, MASA_FREQUENCY_BANDS ); + set16_fx( hHeadTrackData->q_chEneIIR[1], 31, MASA_FREQUENCY_BANDS ); } is_zero = 1; @@ -3020,17 +3026,10 @@ static void adaptTransportSignalsHeadtracked_fx( } IF( is_zero ) { - hHeadTrackData->q_procChEneIIR = 31; - move16(); - } - ELSE - { - tmp = sub( s_min( getScaleFactor32( hHeadTrackData->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS ), getScaleFactor32( hHeadTrackData->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS ) ), 1 ); - scale_sig32( hHeadTrackData->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS, tmp ); - scale_sig32( hHeadTrackData->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS, tmp ); - hHeadTrackData->q_procChEneIIR = add( q_procChEneIIR, tmp ); - move16(); + set16_fx( hHeadTrackData->q_procChEneIIR[0], 31, MASA_FREQUENCY_BANDS ); + set16_fx( hHeadTrackData->q_procChEneIIR[1], 31, MASA_FREQUENCY_BANDS ); } + return; } diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index 1633f42d0..b9403e7da 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1439,10 +1439,11 @@ ivas_error ivas_combined_orientation_open( set_zero_fx( ( *hCombinedOrientationData )->chEneIIR_fx[1], MASA_FREQUENCY_BANDS ); set_zero_fx( ( *hCombinedOrientationData )->procChEneIIR_fx[0], MASA_FREQUENCY_BANDS ); set_zero_fx( ( *hCombinedOrientationData )->procChEneIIR_fx[1], MASA_FREQUENCY_BANDS ); - ( *hCombinedOrientationData )->q_chEneIIR = Q31; - move16(); - ( *hCombinedOrientationData )->q_procChEneIIR = Q31; - move16(); + set16_fx( ( *hCombinedOrientationData )->q_chEneIIR[0], Q31, MASA_FREQUENCY_BANDS ); + set16_fx( ( *hCombinedOrientationData )->q_chEneIIR[1], Q31, MASA_FREQUENCY_BANDS ); + set16_fx( ( *hCombinedOrientationData )->q_procChEneIIR[0], Q31, MASA_FREQUENCY_BANDS ); + set16_fx( ( *hCombinedOrientationData )->q_procChEneIIR[1], Q31, MASA_FREQUENCY_BANDS ); + ( *hCombinedOrientationData )->isExtOrientationFrozen = 0; move16(); ( *hCombinedOrientationData )->isHeadRotationFrozen = 0; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 2654e5a53..ddf2b5942 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -837,9 +837,9 @@ typedef struct ivas_combined_orientation_struct Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; /* Q30 */ Word32 Rmat_prev_fx[3][3]; /* Q30 */ Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ /* Q(q_chEneIIR) */ - Word16 q_chEneIIR; + Word16 q_chEneIIR[2][MASA_FREQUENCY_BANDS]; Word32 procChEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* Q(q_procChEneIIR) */ - Word16 q_procChEneIIR; + Word16 q_procChEneIIR[2][MASA_FREQUENCY_BANDS]; Word16 shd_rot_max_order; IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES]; IVAS_QUATERNION Quaternion_frozen_ext; -- GitLab From a7617c8fada6aec8684857bb577d9895033db409 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 10 Jun 2025 09:55:16 +0530 Subject: [PATCH 0843/1310] Disable WMOPS macro in options.h - Fix for MR 1572 --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 940cd1fe7..cd57657b0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -54,7 +54,7 @@ #define SUPPORT_JBM_TRACEFILE /* Support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -#define WMOPS /* Activate complexity and memory counters */ +/*#define WMOPS*/ /* Activate complexity and memory counters */ #ifdef WMOPS #define WMOPS_PER_FRAME /* Output per-frame complexity (writes one float value per frame to the file "wmops_analysis") */ #define WMOPS_DETAIL /* Output detailed complexity printout for every function. Increases runtime overhead */ -- GitLab From 9230c2956c4af8efefae97b3780b37203b808811 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 9 Jun 2025 19:33:07 +0530 Subject: [PATCH 0844/1310] Fix for 3GPP issue 1732: Accuracy of spatial metadata in ivas_omasa_enc_fx compared to the floating point equivalent Link #1732 --- lib_com/ivas_dirac_com_fx.c | 33 ++++++++---- lib_enc/ivas_omasa_enc_fx.c | 101 ++++++++++++++++++++++++++---------- 2 files changed, 96 insertions(+), 38 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 2be3f8ace..0922e0289 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -796,19 +796,23 @@ void computeDiffuseness_fixed( { Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; + Word64 tmp_intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; + Word16 intensity_slow_abs_exp[CLDFB_NO_CHANNELS_MAX]; Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; - Word16 i, j, k; + Word16 i, j, k, tmp16; Word32 tmp = 0; move32(); Word32 *p_tmp; const Word32 *p_tmp_c; Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp; - Word16 q_ene, q_intensity, q_intensity_slow; + Word16 q_ene, q_intensity; /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ - set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); + set_zero_fx( intensity_slow, DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ); set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); + set16_fx( intensity_slow_abs_exp, 0, CLDFB_NO_CHANNELS_MAX ); + set64_fx( tmp_intensity_slow_abs, 0, CLDFB_NO_CHANNELS_MAX ); set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */ @@ -892,10 +896,8 @@ void computeDiffuseness_fixed( q_intensity = s_min( q_intensity, q_tmp ); } - min_q_shift1 = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) ); - min_q_shift1 = sub( min_q_shift1, idiv1616( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 2 ) ); - scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), min_q_shift1 ); - q_intensity = add( q_intensity, min_q_shift1 ); + scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), -2 ); + q_intensity = sub( q_intensity, 2 ); /* intensity_slow.^2 + intensity_slow_abs*/ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) @@ -904,11 +906,19 @@ void computeDiffuseness_fixed( FOR( k = 0; k < num_freq_bands; k++ ) { - intensity_slow_abs[k] = Madd_32_32( intensity_slow_abs[k], p_tmp[k], p_tmp[k] ); - move32(); + tmp_intensity_slow_abs[k] = W_mac_32_32( tmp_intensity_slow_abs[k], p_tmp[k], p_tmp[k] ); + move64(); } } - q_intensity_slow = sub( add( q_intensity, q_intensity ), 31 ); + + FOR( k = 0; k < num_freq_bands; k++ ) + { + tmp16 = W_norm( tmp_intensity_slow_abs[k] ); + intensity_slow_abs[k] = W_extract_h( W_shl( tmp_intensity_slow_abs[k], tmp16 ) ); + move32(); + intensity_slow_abs_exp[k] = sub( 31, sub( add( add( shl( q_intensity, 1 ), 1 ), tmp16 ), 32 ) ); + move16(); + } /* Compute Diffuseness */ p_tmp = intensity_slow_abs; @@ -916,7 +926,8 @@ void computeDiffuseness_fixed( move16(); FOR( i = 0; i < num_freq_bands; ++i ) { - exp1 = sub( 31, q_intensity_slow ); + exp1 = intensity_slow_abs_exp[i]; + move16(); tmp = Sqrt32( p_tmp[i], &exp1 ); tmp = BASOP_Util_Divide3232_Scale_newton( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index b88bb69a1..58ba680d6 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -82,13 +82,14 @@ static void ivas_omasa_dmx_fx( Word16 prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], /*o:q15*/ const Word16 interpolator[L_FRAME48k] /*i:q15*/ ); -static void computeIntensityVector_enc_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ - const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity vector */ - Word16 guard_bits ); +void computeIntensityVector_enc_fx( + const Word16 *band_grouping, + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + const Word16 num_frequency_bands, + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ + Word16 *exp_intensity_real, + Word16 inp_q ); static void computeReferencePower_omasa_ivas_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 *reference_power, const Word16 enc_param_start_band, const Word16 num_freq_bands, Word16 q_Cldfb, Word16 *ref_exp ); /*--------------------------------------------------------------------------* * ivas_omasa_enc_open() @@ -1191,8 +1192,13 @@ static void ivas_omasa_param_est_enc_fx( norm_buff = s_min( norm_buff, L_norm_arr( &Foa_ImagBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ) ); guard_bits = find_guarded_bits_fx( max_band_grouping_diff ); guard_bits = add( guard_bits, sub( 1, norm_buff ) ); - computeIntensityVector_enc_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, guard_bits ); - intensity_real_e = sub( add( 62, guard_bits ), shl( q, 1 ) ); + + scale_sig32( &Foa_RealBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX, negate( guard_bits ) ); + scale_sig32( &Foa_ImagBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX, negate( guard_bits ) ); + + q = sub( q, guard_bits ); + + computeIntensityVector_enc_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, &intensity_real_e, q ); computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], intensity_real_e, NULL ); @@ -1478,20 +1484,27 @@ static void ivas_omasa_dmx_fx( } void computeIntensityVector_enc_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ - const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity vector */ - Word16 guard_bits ) + const Word16 *band_grouping, + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ + const Word16 num_frequency_bands, + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ + Word16 *exp_intensity_real, + Word16 inp_q ) { - /* Reminder - * X = a + ib; Y = c + id - * X*Y = ac - bd + i(ad +bc) - */ Word16 i, j; Word32 real, img; - Word16 brange[2]; + Word16 brange[2], shift = 63; + move16(); + Flag is_zero = 0; + move16(); + + Word64 intensity_real64[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + set64_fx( intensity_real64[i], 0, MASA_FREQUENCY_BANDS ); + } FOR( i = 0; i < num_frequency_bands; i++ ) { @@ -1510,21 +1523,55 @@ void computeIntensityVector_enc_fx( FOR( j = brange[0]; j < brange[1]; j++ ) { real = Cldfb_RealBuffer[0][j]; - img = Cldfb_ImagBuffer[0][j]; - /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real[0][i] = L_add( intensity_real[0][i], L_add( L_shr( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), guard_bits ), L_shr( Mpy_32_32( Cldfb_ImagBuffer[3][j], img ), guard_bits ) ) ); // output Q= 2* input_q -31-guard_bits - move32(); - intensity_real[1][i] = L_add( intensity_real[1][i], L_add( L_shr( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), guard_bits ), L_shr( Mpy_32_32( Cldfb_ImagBuffer[1][j], img ), guard_bits ) ) ); // output Q= 2* input_q -31-guard_bits move32(); - intensity_real[2][i] = L_add( intensity_real[2][i], L_add( L_shr( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), guard_bits ), L_shr( Mpy_32_32( Cldfb_ImagBuffer[2][j], img ), guard_bits ) ) ); // output Q= 2* input_q -31-guard_bits + img = Cldfb_ImagBuffer[0][j]; move32(); + /* Intensity is XYZ order, audio is WYZX order. */ + intensity_real64[0][i] = W_add( intensity_real64[0][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q + move64(); + intensity_real64[1][i] = W_add( intensity_real64[1][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q + move64(); + intensity_real64[2][i] = W_add( intensity_real64[2][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q + move64(); + } + } + + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + is_zero = is_zero_arr64( intensity_real64[i], MASA_FREQUENCY_BANDS ); + IF( is_zero == 0 ) + { + BREAK; } } + IF( is_zero == 0 ) + { + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + shift = s_min( shift, W_norm_arr( intensity_real64[i], MASA_FREQUENCY_BANDS ) ); + } + + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) + { + intensity_real[i][j] = W_extract_h( W_shl( intensity_real64[i][j], shift ) ); + move32(); + } + } + + *exp_intensity_real = sub( 31, sub( add( shift, shl( inp_q, 1 ) ), 32 ) ); + move16(); + } + ELSE + { + *exp_intensity_real = 0; + move16(); + } return; } - static void computeReferencePower_omasa_ivas_fx( const Word16 *band_grouping, /* i : Band grouping for estimation */ Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal Q6*/ -- GitLab From 42eb3f1e3ebd08e695c9c2be9ee1944d7f5fd785 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 10 Jun 2025 11:08:09 +0200 Subject: [PATCH 0845/1310] Fix for fx-fx job --- .gitlab-ci.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d10993ad6..df6069de2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,10 +37,10 @@ workflow: IVAS_PIPELINE_NAME: 'Run encoder dmx comparison against float ref: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long' variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against float ref FX-FX (long test vectors): $CI_COMMIT_BRANCH' + IVAS_PIPELINE_NAME: 'Run comparison tools against float ref (long test vectors): $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long-fx-fx' variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against float ref (long test vectors): $CI_COMMIT_BRANCH' + IVAS_PIPELINE_NAME: 'Run comparison tools against float ref FX-FX (long test vectors): $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-to-input' variables: IVAS_PIPELINE_NAME: 'Run comparison tools against input (pass-through only): $CI_COMMIT_BRANCH' @@ -196,7 +196,7 @@ workflow: .ivas-pytest-anchor: &ivas-pytest-anchor stage: test needs: ["build-codec-linux-make"] - timeout: "360 minutes" + timeout: "15 hours" variables: # keep "mld" in artifact name for backwards compatibility reasons CSV_ARTIFACT_NAME: "mld--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" @@ -1352,6 +1352,8 @@ ivas-pytest-compare_ref-long-fx-fx: extends: - .rules-pytest-long-fx-fx - .test-job-linux + tags: + - ivas-linux before_script: - USE_LTV=1 - REF_ENCODER_PATH=./$DUT_ENCODER_PATH @@ -1364,6 +1366,8 @@ ivas-pytest-compare_ref-long-fx-fx-lev-10: extends: - .rules-pytest-long-fx-fx - .test-job-linux + tags: + - ivas-linux before_script: - USE_LTV=1 - REF_ENCODER_PATH=./$DUT_ENCODER_PATH @@ -1376,6 +1380,8 @@ ivas-pytest-compare_ref-long-fx-fx-lev+10: extends: - .rules-pytest-long-fx-fx - .test-job-linux + tags: + - ivas-linux before_script: - USE_LTV=1 - REF_ENCODER_PATH=./$DUT_ENCODER_PATH -- GitLab From 5575a01485d21a0863a7a228ecca43d917251c47 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 10 Jun 2025 12:28:54 +0200 Subject: [PATCH 0846/1310] Added changes for float MR 1429 - aeid selection --- lib_com/options.h | 1 + lib_util/render_config_reader.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 99013a1c5..4ea8c823c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,6 +127,7 @@ #endif //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ +#define FIX_1020_AEID_SELECTION_ERRORS /* Philips: issue #1020: fix for acoustic environemnt ID selection errors */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index dae55f18c..8a33501af 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2197,7 +2197,11 @@ ivas_error RenderConfigReader_read( return IVAS_ERR_INVALID_RENDER_CONFIG; } idx = strtol( strtok( NULL, ":" ), NULL, 0 ); +#ifdef FIX_1020_AEID_SELECTION_ERRORS + pRenderConfigReader->pAE[acIdx].id = idx; +#else pRenderConfigReader->pAE->id = idx; +#endif aeHasFgIdx = aeHasPredelay = aeHasRt60 = aeHasDsr = FALSE; aeHasERsize = aeHasERabs = FALSE; -- GitLab From 211901e3cdd524c03c565c7f92662e695629732a Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 10 Jun 2025 13:09:47 +0200 Subject: [PATCH 0847/1310] add missing pop_wmops() --- lib_com/options.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index cd57657b0..0da972932 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,12 +101,10 @@ #define VEC_ARITH_OPT_v1 #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ #define FIX_1511_POC_RENORM /* NTT: Fix for issue 1511: Renorm for POC. */ - #define TEST_HR #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ - #define FIX_1713_EXP /* VA: proposed correction to exp in ic-BWE*/ - #define FIX_1733_CLDFB_BUG +#define FIX_1740_MISING_POP_WMOPS /* VA: fix issue 1740: missing pop_wmops() */ #endif -- GitLab From 26f32cac3a02779628f87228700c739b8fe5f665 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 10 Jun 2025 14:38:23 +0200 Subject: [PATCH 0848/1310] enabled compiler switch and changed target branch for CI pipeline --- .gitlab-ci.yml | 2 +- lib_com/options.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d630d11ba..545fe88a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" + BASOP_CI_BRANCH_PC_REPO: "main" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 diff --git a/lib_com/options.h b/lib_com/options.h index 99013a1c5..69d97f02d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -112,7 +112,7 @@ #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ -//#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ +#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ -- GitLab From a043cdb6c6c2ada41713db9da5fe81b192e4988a Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 10 Jun 2025 14:48:37 +0200 Subject: [PATCH 0849/1310] restart pipeline -- GitLab From 24afafdf5f31ec85672e066716e95693accd65b8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 10 Jun 2025 18:35:20 +0530 Subject: [PATCH 0850/1310] Fix for 3GPP issue 1724: Renderer MASA output metadata difference Link #1724 --- lib_com/ivas_dirac_com_fx.c | 39 +++++++++++++++++------------------ lib_rend/ivas_dirac_ana_fx.c | 17 +++++++++++++-- lib_rend/ivas_mcmasa_ana_fx.c | 2 +- lib_rend/ivas_omasa_ana_fx.c | 22 ++++++++++++-------- 4 files changed, 48 insertions(+), 32 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 0922e0289..feea9c5af 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -783,7 +783,6 @@ void computeDirectionVectors_fx( * * *------------------------------------------------------------------------*/ - void computeDiffuseness_fixed( Word32 *buffer_intensity[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF], // i: Q(q_factor_intensity) const Word32 *buffer_energy, // i: Q(q_factor_energy) @@ -796,10 +795,10 @@ void computeDiffuseness_fixed( { Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; - Word64 tmp_intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; - Word16 intensity_slow_abs_exp[CLDFB_NO_CHANNELS_MAX]; + Word64 intensity_slow_abs_64[CLDFB_NO_CHANNELS_MAX]; + Word16 intensity_slow_abs_q[CLDFB_NO_CHANNELS_MAX]; Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; - Word16 i, j, k, tmp16; + Word16 i, j, k; Word32 tmp = 0; move32(); Word32 *p_tmp; @@ -809,10 +808,8 @@ void computeDiffuseness_fixed( /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ - set_zero_fx( intensity_slow, DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ); + set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); - set16_fx( intensity_slow_abs_exp, 0, CLDFB_NO_CHANNELS_MAX ); - set64_fx( tmp_intensity_slow_abs, 0, CLDFB_NO_CHANNELS_MAX ); set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */ @@ -896,27 +893,31 @@ void computeDiffuseness_fixed( q_intensity = s_min( q_intensity, q_tmp ); } - scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), -2 ); - q_intensity = sub( q_intensity, 2 ); - + min_q_shift1 = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) ); + min_q_shift1 = sub( min_q_shift1, idiv1616( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 2 ) ); + scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), min_q_shift1 ); + q_intensity = add( q_intensity, min_q_shift1 ); + FOR( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow_abs_64[k] = 0; + move64(); + } + /* intensity_slow.^2 + intensity_slow_abs*/ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = intensity_slow + j * num_freq_bands; - FOR( k = 0; k < num_freq_bands; k++ ) { - tmp_intensity_slow_abs[k] = W_mac_32_32( tmp_intensity_slow_abs[k], p_tmp[k], p_tmp[k] ); - move64(); + intensity_slow_abs_64[k] = W_add( intensity_slow_abs_64[k], W_mult_32_32( p_tmp[k], p_tmp[k] ) ); // 2*q_intensity+1 } } - FOR( k = 0; k < num_freq_bands; k++ ) { - tmp16 = W_norm( tmp_intensity_slow_abs[k] ); - intensity_slow_abs[k] = W_extract_h( W_shl( tmp_intensity_slow_abs[k], tmp16 ) ); + Word16 shift = W_norm( intensity_slow_abs_64[k] ); + intensity_slow_abs[k] = W_extract_h( W_shl( intensity_slow_abs_64[k], shift ) ); move32(); - intensity_slow_abs_exp[k] = sub( 31, sub( add( add( shl( q_intensity, 1 ), 1 ), tmp16 ), 32 ) ); + intensity_slow_abs_q[k] = sub( add( add( q_intensity, q_intensity ), shift ), 31 ); move16(); } @@ -926,8 +927,7 @@ void computeDiffuseness_fixed( move16(); FOR( i = 0; i < num_freq_bands; ++i ) { - exp1 = intensity_slow_abs_exp[i]; - move16(); + exp1 = sub( 31, intensity_slow_abs_q[i] ); tmp = Sqrt32( p_tmp[i], &exp1 ); tmp = BASOP_Util_Divide3232_Scale_newton( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); @@ -966,7 +966,6 @@ void computeDiffuseness_fixed( return; } - Word32 deindex_azimuth_fx( /* o : output Q22 */ Word16 id_phi, /* i : index */ const Word16 no_bits, /* i : number of bits for the spherical grid */ diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index f282e8390..df75d6d0a 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -138,6 +138,7 @@ ivas_error ivas_dirac_ana_open_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); } + set16_fx( hDirAC->direction_vector_e[i][j], 31, MASA_FREQUENCY_BANDS ); } } @@ -257,6 +258,7 @@ void ivas_dirac_ana_fx( /* Estimate MASA parameters from the SBA signals */ ivas_dirac_param_est_ana_fx( hDirAC, data_fx, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta_fx( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, Q31, Q31, Q31 ); /* Downmix */ @@ -334,13 +336,22 @@ static void ivas_dirac_param_est_ana_fx( move32(); hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = 0; move32(); + + hDirAC->direction_vector_e[0][block_m_idx][band_m_idx] = 0; + move16(); + hDirAC->direction_vector_e[1][block_m_idx][band_m_idx] = 0; + move16(); + hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] = 0; + move16(); } /* Need to initialize renormalization_factors, and variables to be normalized */ set32_fx( renormalization_factor_diff_fx, 0, hDirAC->nbands ); + set16_fx( renormalization_factor_diff_e, 31, hDirAC->nbands ); set32_fx( diffuseness_m_fx, 0, hDirAC->nbands ); + set16_fx( diffuseness_e, 0, hDirAC->nbands ); set32_fx( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); - set32_fx( hDirAC->energy_fx[block_m_idx], 0, MASA_FREQUENCY_BANDS ); + set16_fx( hDirAC->energy_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { @@ -351,7 +362,9 @@ static void ivas_dirac_param_est_ana_fx( move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][( l_ts * ts )] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); + inp_q = Q7; + move16(); + cldfbAnalysis_ts_fx_var_q( &( data_fx[i][l_ts * ts] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); ci_q = s_min( ci_q, getScaleFactor32( Foa_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); } diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index cfdd43116..bce7a4a5a 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -634,7 +634,7 @@ void ivas_mcmasa_param_est_ana_fx( { inp_q = q_data; move16(); - cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); + cldfbAnalysis_ts_fx_var_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); } diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index bce8870c8..d82346d34 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -41,7 +41,6 @@ #include "ivas_rom_com.h" #include "wmc_auto.h" - /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ @@ -170,6 +169,7 @@ ivas_error ivas_omasa_ana_open( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA data\n" ) ); } + set16_fx( hOMasa->direction_vector_e[i][j], 0, MASA_FREQUENCY_BANDS ); } } @@ -319,11 +319,11 @@ void ivas_omasa_ana_fx( ivas_omasa_param_est_ana_fx( hOMasa, data_in_f_fx, *data_in_q, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, &energyRatio_q, spreadCoherence_fx, &spreadCoherence_q, surroundingCoherence_fx, &sorroundingCoherence_q, input_frame, nchan_ism ); /* Create MASA metadata buffer from the estimated values */ - ivas_create_masa_out_meta_fx( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values_fx, azimuth_m_values_fx, energyRatio_fx, spreadCoherence_fx, surroundingCoherence_fx, Q31, Q31, Q31 ); /* Downmix */ ivas_omasa_dmx_fx( data_in_f_fx, data_in_q, input_frame, nchan_transport, nchan_ism, hOMasa->ism_azimuth_fx, hOMasa->ism_elevation_fx, hOMasa->prev_object_dm_gains_fx, hOMasa->interpolator_fx ); + return; } @@ -372,7 +372,6 @@ static void ivas_omasa_param_est_ana_fx( Word32 renormalization_factor_diff_fx[MASA_FREQUENCY_BANDS]; Word16 renormalization_factor_diff_e[MASA_FREQUENCY_BANDS]; Word32 norm_tmp_fx; - Word16 tmp_ener_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word32 dir_v_fx[DIRAC_NUM_DIMS] /*, L_tmp1, L_tmp2*/; Word16 dir_v_q /*, norm_tmp_q*/; @@ -422,15 +421,23 @@ static void ivas_omasa_param_est_ana_fx( move32(); hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = 0; move32(); + + hOMasa->direction_vector_e[0][block_m_idx][band_m_idx] = 0; + move16(); + hOMasa->direction_vector_e[1][block_m_idx][band_m_idx] = 0; + move16(); + hOMasa->direction_vector_e[2][block_m_idx][band_m_idx] = 0; + move16(); } /* Need to initialize renormalization_factors, and variables to be normalized */ set_zero_fx( renormalization_factor_diff_fx, hOMasa->nbands ); + set16_fx( renormalization_factor_diff_e, 0, hOMasa->nbands ); set_zero_fx( diffuseness_m_fx, hOMasa->nbands ); + set16_fx( diffuseness_e, 0, hOMasa->nbands ); set_zero_fx( hOMasa->energy_fx[block_m_idx], MASA_FREQUENCY_BANDS ); - - set16_fx( tmp_ener_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); + set16_fx( hOMasa->energy_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { @@ -441,10 +448,8 @@ static void ivas_omasa_param_est_ana_fx( move16(); FOR( i = 0; i < nchan_ism; i++ ) { - inp_q = data_f_q; - move16(); - cldfbAnalysis_ts_fx_fixed_q( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &inp_q ); + cldfbAnalysis_ts_fx_var_q( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &inp_q ); cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); @@ -554,7 +559,6 @@ static void ivas_omasa_param_est_ana_fx( FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2*inp_q-30*/ - hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hOMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); move32(); hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hOMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); -- GitLab From 9c90a8621750ca145a5ce48112830f527c00f2b7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 10 Jun 2025 18:39:50 +0530 Subject: [PATCH 0851/1310] Clang formatting --- lib_com/ivas_dirac_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index feea9c5af..c08dade43 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -902,7 +902,7 @@ void computeDiffuseness_fixed( intensity_slow_abs_64[k] = 0; move64(); } - + /* intensity_slow.^2 + intensity_slow_abs*/ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { -- GitLab From 9e6ab98f9c12c669a6f4642f2f38b2de8e429a7b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 10 Jun 2025 15:57:30 +0200 Subject: [PATCH 0852/1310] Restore to using basop-ci-branch, just get the new HRTF binary files --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 545fe88a1..aa08ae0f8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "main" + BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 @@ -276,6 +276,9 @@ stages: - git restore . # Just as a precaution - git checkout $BASOP_CI_BRANCH_PC_REPO - git pull origin $BASOP_CI_BRANCH_PC_REPO +# Restore new format of HRTF binary + - git fetch origin main + - git checkout origin/main -- scripts/binauralRenderer_interface/binaural_renderers_hrtf_data - cd - - cp -r $SCRIPTS_DIR/ci . - cp -r $SCRIPTS_DIR/scripts . -- GitLab From 7de08c8f10180f2ff578fbadb88769b437a478f8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 11 Jun 2025 10:22:48 +0530 Subject: [PATCH 0853/1310] Precision improvements for processIGF, in McMASA and OMASA paths --- lib_com/ivas_dirac_com_fx.c | 3 +- lib_com/ivas_prot_fx.h | 6 +- lib_com/prot_fx.h | 4 +- lib_com/rom_com.c | 24 +-- lib_com/stat_com.h | 1 + lib_enc/cod_tcx_fx.c | 8 +- lib_enc/igf_enc.c | 194 +++++++++---------------- lib_enc/igf_enc_fx.c | 85 ++++++++++- lib_enc/ivas_dirac_enc_fx.c | 42 +++--- lib_enc/ivas_mcmasa_enc_fx.c | 136 ++++++++++------- lib_enc/ivas_mct_enc_mct_fx.c | 18 ++- lib_enc/ivas_omasa_enc_fx.c | 142 +++++++++--------- lib_enc/ivas_stereo_mdct_core_enc_fx.c | 23 ++- lib_enc/prot_fx_enc.h | 7 + lib_enc/tcx_utils_enc_fx.c | 2 +- 15 files changed, 377 insertions(+), 318 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 0922e0289..21f5d4995 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -608,8 +608,7 @@ void computeDirectionVectors_fixed( Word32 *direction_vector_x, /* o: Q30*/ Word32 *direction_vector_y, /* o: Q30*/ Word32 *direction_vector_z, /* o: Q30*/ - Word16 i_e /*Exponent of all the intensity buffers*/ - , + Word16 i_e, /*Exponent of all the intensity buffers*/ Word16 *i_e_band ) { Word16 i; diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 00f0ba43b..74e682a4b 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -3230,8 +3230,7 @@ void computeDirectionVectors_fixed( Word32 *direction_vector_x, /*Q30*/ Word32 *direction_vector_y, /*Q30*/ Word32 *direction_vector_z, /*Q30*/ - Word16 i_e /*Exponent of all the intensity buffers*/ - , + Word16 i_e, /*Exponent of all the intensity buffers*/ Word16 *i_e_band ); @@ -3293,8 +3292,7 @@ void computeReferencePower_enc_fx( Word16 ref_power_w, /* i : use 0 if hodirac is enabled */ const Word16 nchan_ana, /* i : number of analysis channels */ Word16 inp_q, /* i : q of cld buffers */ - Word16 *ref_q /* i : output q */ -); + Word16 q_reference_power[DIRAC_NO_FB_BANDS_MAX] ); void computeReferencePower_enc_fx_dirac( const Word16 *band_grouping, /* i : Band grouping for estimation */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 0a11364dc..38a6077e8 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10502,7 +10502,7 @@ void ProcessStereoIGF_fx( Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ @@ -10519,7 +10519,7 @@ void IGFEncApplyStereo_fx( const Word16 igfGridIdx, /* i : IGF grid index */ Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index a5c8a3b7c..9eaf690f1 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -20441,42 +20441,42 @@ const Word16 qGains[2][1 << kTcxHmNumGainBits] = const struct TnsParameters tnsParametersIGF32kHz_LowBR[1] = { - { 600, 3, /*1.85f, 0.075f, 4.4f,*/ 237/*1.85f Q7*/, 2458/*0.075f Q15*/,563 /*4.4f Q7*/ } + { 600, 3, /*1.85f, 0.075f, 4.4f,*/ 237/*1.85f Q7*/, 15518925/*1.85f Q23*/, 2458/*0.075f Q15*/,563 /*4.4f Q7*/ } }; const struct TnsParameters tnsParameters32kHz[2] = { - { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/, 983/*0.0300f Q15*/, 128/*1.0f Q7*/}, - { 600, 1, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/, 2048/*0.0625f Q15*/, 563 /*4.4f Q7*/ } + { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/,11324621/*1.35f Q23*/, 983/*0.0300f Q15*/, 128/*1.0f Q7*/}, + { 600, 1, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/,14680064/*1.75f Q23*/, 2048/*0.0625f Q15*/, 563 /*4.4f Q7*/ } }; const struct TnsParameters tnsParameters32kHz_grouped[2] = { - { 8400, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ }, - { 800, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/} + { 8400, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ }, + { 800, 3, /*1.375f, 0.03125f, 1.0f ,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/} }; const struct TnsParameters tnsParameters16kHz[1] = { - { 600, 3, /*1.5f, 0.05f, 4.4f,*/ 192/*1.5f Q7*/, 1638/*0.05f Q15*/ ,563 /*4.4f Q7*/ } + { 600, 3, /*1.5f, 0.05f, 4.4f,*/ 192/*1.5f Q7*/, 12582912/*1.5f Q23*/, 1638/*0.05f Q15*/ ,563 /*4.4f Q7*/ } }; const struct TnsParameters tnsParameters16kHz_grouped[2] = { - { 4400, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/}, - { 800, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/} + { 4400, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 12582912/*1.5f Q23*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/}, + { 800, 3, /*1.5f, 0.05f, 1.0f,*/ 192/*1.5f Q7*/, 12582912/*1.5f Q23*/, 1638/*0.05f Q15*/ , 128/*1.0f Q7*/} }; const struct TnsParameters tnsParameters48kHz_grouped[2] = { - { 10400, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/}, - { 800, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ } + { 10400, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/}, + { 800, 3, /*1.375f, 0.03125f, 1.0f,*/ 176/*1.375f Q7*/,11534336/*1.375f Q23*/, 1024/*0.03125f Q15*/ , 128/*1.0f Q7*/ } }; const struct TnsParameters tnsParameters32kHz_Stereo[2]= { - { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/, 983/*0.0300f Q15*/ , 128/*1.0f Q7*/}, - { 600, 3, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/, 2048/*0.0625f Q15*/ ,563 /*4.4f Q7*/ } + { 4500, 3, /*1.35f, 0.0300f, 1.0f ,*/ 173/*1.35f Q7*/, 11324621/*1.35f Q23*/, 983/*0.0300f Q15*/ , 128/*1.0f Q7*/}, + { 600, 3, /*1.75f, 0.0625f, 4.4f ,*/ 224/*1.75f Q7*/,14680064/*1.75f Q23*/, 2048/*0.0625f Q15*/ ,563 /*4.4f Q7*/ } }; const Word16 tnsAcfWindow_fx[TNS_MAX_FILTER_ORDER] = diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index 80822f59e..712c1d702 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -561,6 +561,7 @@ struct TnsParameters Word16 startLineFrequency; /* Starting lower frequency of the TNS filter [20..16000] */ Word16 nSubdivisions; /* Number of spectrum subdivisions in which the filter operates [1..8) */ Word16 minPredictionGain; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ + Word32 minPredictionGain_32; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ Word16 minAvgSqrCoef; /* Minimum average square of coefficients required to turn on the TNS filter. Exponent = 0 */ Word16 minEnergyChange; /* Minimum energy change required to turn on the TNS filter. Exponent = 8 */ }; diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index c40db6678..27f3d2aa6 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -4914,8 +4914,8 @@ void TNSAnalysisStereo_fx( test(); test(); test(); - IF( GT_32( pFilter[0]->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters[0]->minPredictionGain ), sub( PRED_GAIN_E, pFilter[0]->predictionGain_e ) ) ) && LT_32( sts[0]->element_brate, IVAS_80k ) && - GT_32( pFilter[1]->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters[1]->minPredictionGain ), sub( PRED_GAIN_E, pFilter[1]->predictionGain_e ) ) ) && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) + IF( GT_32( pFilter[0]->predictionGain32, L_shl_sat( ( pTnsParameters[0]->minPredictionGain_32 ), sub( PRED_GAIN_E, pFilter[0]->predictionGain_e ) ) ) && LT_32( sts[0]->element_brate, IVAS_80k ) && + GT_32( pFilter[1]->predictionGain32, L_shl_sat( ( pTnsParameters[1]->minPredictionGain_32 ), sub( PRED_GAIN_E, pFilter[1]->predictionGain_e ) ) ) && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) { pFilter[0]->predictionGain32 = pFilter[1]->predictionGain32 = meanPredictionGain_fx; /* more TNS filter sync at 48kbps */ move32(); @@ -4947,7 +4947,7 @@ void TNSAnalysisStereo_fx( test(); test(); - IF( GT_32( meanPredictionGain_fx, L_shl_sat( L_deposit_h( pTnsParameters[0]->minPredictionGain ), sub( PRED_GAIN_E, meanPredictionGain_e ) ) ) || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) ) + IF( GT_32( meanPredictionGain_fx, L_shl_sat( ( pTnsParameters[0]->minPredictionGain_32 ), sub( PRED_GAIN_E, meanPredictionGain_e ) ) ) || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) ) { test(); test(); @@ -5245,7 +5245,7 @@ void TNSAnalysisStereo_fx( } test(); - IF( GT_32( pFilter->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters->minPredictionGain ), sub( PRED_GAIN_E, pFilter->predictionGain_e ) ) ) || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) ) + IF( GT_32( pFilter->predictionGain32, L_shl_sat( ( pTnsParameters->minPredictionGain_32 ), sub( PRED_GAIN_E, pFilter->predictionGain_e ) ) ) || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) ) { test(); test(); diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 91e1b8520..db77144df 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -246,94 +246,6 @@ static Word16 IGF_getSFM_new_fx( /*! r: spectral tilt value */ /* Returns value with exponent as 9 and Q as 22*/ -static Word32 IGF_getTNR_fx( - const Word32 *powerSpectrum, /* i : energies */ - const Word16 start, /* i : start subband index */ - const Word16 stop, /* i : stop subband index */ - const Word16 adap, /* i : SFB width adaptation */ - Word16 e_ps, /*Stores exponent for powerSpectrum*/ - Word16 e_adap /*Stores exponent for adap*/ -) -{ - Word16 i; - Word16 width; - Word32 avg; - Word32 tonal; - Word16 tonal_e; /* holds exp for tonal*/ - Word32 noise; - Word16 noise_e; /* holds exp for noise*/ - Word32 tonalToNoise; - Word32 rootSpec[300]; - Word16 rootSpec_e[300]; /*rootSpec_e[i] holds exp for rootSpec[i]*/ - Word16 avg_e; /* holds exp for avg*/ - Word16 tmp_e; - avg = 0; - tonal = 0; - noise = EPSILON_FX; - tonal_e = 0; - noise_e = 0; - avg_e = 0; - tmp_e = 0; - move32(); - move32(); - move32(); - move16(); - move16(); - move16(); - move16(); - - set32_fx( rootSpec, 0, 300 ); - set16_fx( rootSpec_e, 0, 300 ); - - width = sub( stop, start ); - FOR( i = start; i < stop; i++ ) - { - rootSpec_e[i - start] = e_ps; - move16(); - rootSpec[i - start] = Sqrt32( powerSpectrum[i], &rootSpec_e[i - start] ); /*rootSpec[i - start] = sqrtf( powerSpectrum[i] );*/ - move32(); - avg = BASOP_Util_Add_Mant32Exp( avg, avg_e, rootSpec[i - start], rootSpec_e[i - start], &avg_e ); /*avg += rootSpec[i - start];resultant exponent is avg_e*/ - } - avg = BASOP_Util_Divide3216_Scale( avg, width, &tmp_e ); /*avg /= width;*/ - avg_e = add( 16, sub( add( avg_e, tmp_e ), 15 ) ); - - FOR( i = start; i < stop; i++ ) - { - Word16 normSpec_e; /*stores resultant exponent for normSpec*/ - Word16 normSpec = BASOP_Util_Divide3232_Scale( rootSpec[i - start], avg, &normSpec_e ); /*rootSpec[i - start] / avg;*/ - normSpec_e = add( normSpec_e, sub( rootSpec_e[i - start], avg_e ) ); - IF( GT_32( normSpec, L_add( L_shl( 1, sub( 15, normSpec_e ) ), L_shl( adap, sub( e_adap, normSpec_e ) ) ) ) ) - { - tonal = BASOP_Util_Add_Mant32Exp( tonal, tonal_e, rootSpec[i - start], rootSpec_e[i - start], &tonal_e ); /*tonal += rootSpec[i - start];*/ - } - ELSE IF( LT_32( normSpec, L_shl( 1, sub( 15, normSpec_e ) ) ) ) - { - noise = BASOP_Util_Add_Mant32Exp( noise, noise_e, rootSpec[i - start], rootSpec_e[i - start], &noise_e ); /*noise += rootSpec[i - start];*/ - } - } - - /*tonalToNoise = 20.f * log10f( max( 1e-018f, tonal / noise ) )*/ - IF( noise == 0 ) // To handle condition if denom = 0 - { - tonalToNoise = imult3216( L_shr( L_add( L_shl( 18 /* log10f(1e-018f) */, Q25 ), Mpy_32_16_1( L_add( BASOP_Util_Log2( tonal ), L_shl( tonal_e, Q25 ) ) /*Q25*/, INV_Log2_10_Q15 ) /*25+15-15*/ ), 3 ) /*Q22*/, 20 ); - } - ELSE - { - Word16 temp = BASOP_Util_Divide3232_Scale( tonal, noise, &tmp_e ); /*tonal / noise*/ - tmp_e = add( tmp_e, sub( tonal_e, noise_e ) ); - IF( GE_16( temp, 1 ) ) - { - tonalToNoise = imult3216( Mult_32_16( L_add( BASOP_Util_Log2( temp ), L_shl( add( 16, tmp_e ), Q25 ) ) /*Q25*/, INV_Log2_10_Q12 ) /*25+12-15*/, 20 ); /*Q22*/ - } - ELSE - { - tonalToNoise = -1509949440; /*-360.f Q22*/ - move32(); - } - } - - return tonalToNoise; -} static Word32 IGF_getTNR_ivas_fx( const Word32 *powerSpectrum, /* i : energies */ @@ -1000,7 +912,7 @@ static void IGF_CalculateStereoEnvelope_fx( const Word32 *pMDCTSpectrumMsInv_fx, /* i : MDCT spectrum */ Word16 pMDCTSpectrumMsInv_e, /* i : expontent for pMDCTSpectrumMsInv_fx */ const Word32 *pPowerSpectrum_fx, /* i : MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 pPowerSpectrum_e, /* i : exponent for pPowerSpectrum_fx */ + Word16 *pPowerSpectrum_e, /* i : exponent for pPowerSpectrum_fx */ const Word32 *pPowerSpectrumMsInv_fx, /* i : inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv, /* i : Q for pPowerSpectrumMsInv_fx */ const Word16 igfGridIdx, /* i : IGF grid index */ @@ -1033,19 +945,19 @@ static void IGF_CalculateStereoEnvelope_fx( Word16 sfm; Word16 crest; Word16 temp; - Word16 mean_x_e, mean_y_e; /*Stores exponent for mean_x and mean_y respectively*/ - Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/ - Word16 tileSrcSpec_e; /*Exponent for tileSrcSpec_fx*/ - Word16 sfbEnergyTileR_e; /*Exponent for sfbEnergyTileR_fx*/ - Word16 sfbEnergyTileC_e; /*Exponent for sfbEnergyTileC_fx*/ - Word16 sfbEnergyC_e; /*Exponent for sfbEnergyC_fx*/ - Word16 gain_e; /*exponent for gain_fx*/ - Word16 crest_exp; /*stores exponent for output from crest*/ - Word16 sfm_exp; /*stores exponent for ouput from sfm*/ - Word16 tmp_tb_e; /*Stores exponent for tmp_tb_fx*/ - Word16 tmp_sb_e; /*stores exponent for tmp_sb_fx*/ - Word16 slope_e; /*stores exponent for slope_fx*/ - Word16 sfbEnergyR_e; /*stores exponent for sfbEnergyR*/ + Word16 mean_x_e, mean_y_e; /*Stores exponent for mean_x and mean_y respectively*/ + Word16 mean_xy_e, mean_x2_e; /*stores exponent for mean_xy and mean_x2 respectively*/ + Word16 tileSrcSpec_e[MAX_IGF_SFB_LEN]; /*Exponent for tileSrcSpec_fx*/ + Word16 sfbEnergyTileR_e; /*Exponent for sfbEnergyTileR_fx*/ + Word16 sfbEnergyTileC_e; /*Exponent for sfbEnergyTileC_fx*/ + Word16 sfbEnergyC_e; /*Exponent for sfbEnergyC_fx*/ + Word16 gain_e; /*exponent for gain_fx*/ + Word16 crest_exp; /*stores exponent for output from crest*/ + Word16 sfm_exp; /*stores exponent for ouput from sfm*/ + Word16 tmp_tb_e; /*Stores exponent for tmp_tb_fx*/ + Word16 tmp_sb_e; /*stores exponent for tmp_sb_fx*/ + Word16 slope_e; /*stores exponent for slope_fx*/ + Word16 sfbEnergyR_e; /*stores exponent for sfbEnergyR*/ Word16 tmp_e; Word32 temp_pPowerSpectrumMsInv[N_MAX], length; Word16 q_temp_pPowerSpectrumMsInv = Q31, i; @@ -1110,7 +1022,7 @@ static void IGF_CalculateStereoEnvelope_fx( /*hPrivateData->logSpec[sb] = max( 0, (Word16) ( logf( max( FLT_MIN, pPowerSpectrum[sb] ) ) * INV_LOG_2 ) );*/ IF( LE_32( 1, pPowerSpectrum_fx[sb] ) ) { - hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e, Q25 ) ), 25 ) ); + hPrivateData->logSpec[sb] = s_max( 0, (Word16) L_shr( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e[sb], Q25 ) ), 25 ) ); } ELSE { @@ -1152,25 +1064,25 @@ static void IGF_CalculateStereoEnvelope_fx( { IF( NE_16( coreMsMask[sb], coreMsMask[strt_cpy] ) ) { - sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e[sb], &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ norm_exp = norm_l( pMDCTSpectrumMsInv_fx[strt_cpy] ); final_exp = sub( pMDCTSpectrumMsInv_e, norm_exp ); scaled_value = L_shl( pMDCTSpectrumMsInv_fx[strt_cpy], norm_exp ); sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrumMsInv_fx[strt_cpy], sub( 31, q_pPowerSpectrumMsInv[strt_cpy] ), &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ - tileSrcSpec_fx[sub( strt_cpy, tmp )] = temp_pPowerSpectrumMsInv[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ - tileSrcSpec_e = sub( 31, q_temp_pPowerSpectrumMsInv ); + tileSrcSpec_fx[strt_cpy - tmp] = temp_pPowerSpectrumMsInv[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + tileSrcSpec_e[strt_cpy - tmp] = sub( 31, q_temp_pPowerSpectrumMsInv ); } ELSE { - sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e, &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ + sfbEnergyC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyC_fx, sfbEnergyC_e, pPowerSpectrum_fx[sb], pPowerSpectrum_e[sb], &sfbEnergyC_e ); /*resultant exponent is stored in sfbEnergyC_e*/ norm_exp = norm_l( pMDCTSpectrum_fx[strt_cpy] ); final_exp = sub( pMDCTSpectrum_e, norm_exp ); scaled_value = L_shl( pMDCTSpectrum_fx[strt_cpy], norm_exp ); sfbEnergyTileR_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileR_fx, sfbEnergyTileR_e, Mult_32_32( scaled_value, scaled_value ), shl( final_exp, 1 ), &sfbEnergyTileR_e ); /*resultant exponent is stored in sfbEnergyTileR_e*/ - sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e, &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ - tileSrcSpec_fx[sub( strt_cpy, tmp )] = pPowerSpectrum_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ - tileSrcSpec_e = pPowerSpectrum_e; + sfbEnergyTileC_fx = BASOP_Util_Add_Mant32Exp( sfbEnergyTileC_fx, sfbEnergyTileC_e, pPowerSpectrum_fx[strt_cpy], pPowerSpectrum_e[strt_cpy], &sfbEnergyTileC_e ); /*resultant exponent is stored in sfbEnergyTileC_e*/ + tileSrcSpec_fx[strt_cpy - tmp] = pPowerSpectrum_fx[strt_cpy]; /*resultant exponent is stored in tileSrcSpec_e*/ + tileSrcSpec_e[strt_cpy - tmp] = pPowerSpectrum_e[strt_cpy]; } move32(); move16(); @@ -1197,14 +1109,14 @@ static void IGF_CalculateStereoEnvelope_fx( move16(); // tmp_tb = IGF_getSFM_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]) / IGF_getCrest_ivas(pPowerSpectrum, swb_offset[sfb], swb_offset[sfb + 1]); - sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); - crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); + crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, swb_offset[sfb], swb_offset[sfb + 1] ); tmp_tb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); tmp_tb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_tb_fx*/ // tmp_sb = IGF_getSFM_ivas(tileSrcSpec, 0, strt_cpy - tmp) / IGF_getCrest_ivas(tileSrcSpec, 0, strt_cpy - tmp); - sfm = IGF_getSFM_ivas_fx( &sfm_exp, tileSrcSpec_fx, &tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); - crest = IGF_getCrest( &crest_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); + crest = IGF_getCrest_ivas( &crest_exp, tileSrcSpec_fx, tileSrcSpec_e, 0, sub( strt_cpy, tmp ) ); tmp_sb_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &tmp_e ); tmp_sb_e = add( tmp_e, sub( sfm_exp, crest_exp ) ); /*stores the resultant exponent for tmp_sb_fx*/ @@ -1320,7 +1232,7 @@ static void IGF_CalculateStereoEnvelope_fx( } ELSE { - y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e, Q25 ) ) ), INV_Log2_10_Q15 ), 25 ) ) ); /*Q0*/ + y = imult1616( 20, extract_l( L_shr( Mult_32_16( ( L_add( BASOP_Util_Log2( pPowerSpectrum_fx[sb] ), L_shl( pPowerSpectrum_e[sb], Q25 ) ) ), INV_Log2_10_Q15 ), 25 ) ) ); /*Q0*/ } mean_y_fx = add( mean_y_fx, y ); /*Q0*/ mean_xy_fx = L_add( mean_xy_fx, L_mult0( y, x ) ); /*Q0*/ @@ -1348,8 +1260,8 @@ static void IGF_CalculateStereoEnvelope_fx( { Word16 shift = shr( width, 1 ); // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] - shift, swb_offset[sfb + 1] - shift ); - sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); - crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); + crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, sub( swb_offset[sfb], shift ), sub( swb_offset[sfb + 1], shift ) ); shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); } ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( slope_fx, add( slope_e, 16 ), threshold_fx, add( threshold_e, 16 ) ), 1 ) && ( NE_16( sfb, sub( hGrid->sfbWrap[hGrid->nTiles], 1 ) ) ) ) @@ -1357,8 +1269,8 @@ static void IGF_CalculateStereoEnvelope_fx( Word16 shift; shift = shr( width, 1 ); // shiftedSFM = IGF_getSFM_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ) / IGF_getCrest_ivas( pPowerSpectrum, swb_offset[sfb] + shift, swb_offset[sfb + 1] + shift ); - sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, &pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); - crest = IGF_getCrest( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); + sfm = IGF_getSFM_ivas_fx( &sfm_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); + crest = IGF_getCrest_ivas( &crest_exp, pPowerSpectrum_fx, pPowerSpectrum_e, add( swb_offset[sfb], shift ), add( swb_offset[sfb + 1], shift ) ); shiftedSFM_fx = BASOP_Util_Divide1616_Scale( sfm, crest, &shiftedSFM_e ); } IF( shiftedSFM_fx ) @@ -1410,7 +1322,7 @@ static void IGF_CalculateStereoEnvelope_fx( tonalToNoise_e = 9; /*stores exponent for tonalToNoise*/ move16(); adap = BASOP_Util_Divide1616_Scale( width, 30, &adap_e ); - tonalToNoise = IGF_getTNR_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, pPowerSpectrum_e, adap_e ); /*Q22*/ + tonalToNoise = IGF_getTNR_ivas_fx( pPowerSpectrum_fx, swb_offset[sfb], swb_offset[sfb + 1], adap, pPowerSpectrum_e, adap_e ); /*Q22*/ IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tonalToNoise, tonalToNoise_e, L_add( L_shl( 10, sub( 15, adap_e ) ), adap ), add( 16, adap_e ) ), -1 ) ) { // currDampingFactor += 0.1f * ( ( 10 + adap ) - tonalToNoise ); @@ -2564,7 +2476,7 @@ void IGFEncApplyMono_ivas_fx( Word32 common_pPowerSpectrum_fx[N_MAX + L_MDCT_OVLP_MAX]; - set32_fx( common_pPowerSpectrum_fx, 0, N_MAX + L_MDCT_OVLP_MAX ); + set32_fx( common_pPowerSpectrum_fx, 0, N_MAX); Word16 common_pPowerSpectrum_exp = MIN16B; move16(); @@ -2652,7 +2564,7 @@ void IGFEncApplyStereo_fx( const Word16 igfGridIdx, /* i : IGF grid index */ Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ @@ -2662,13 +2574,19 @@ void IGFEncApplyStereo_fx( const Word32 element_brate, /* i : element bitrate */ const Word16 mct_on ) { - Word32 *pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ + Word32 *pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ + Word16 *exp_pPowerSpectrumParameter_fx[NB_DIV]; /* If it is NULL it informs a function that specific handling is needed */ Word32 *pPowerSpectrumParameterMsInv_fx[NB_DIV]; Word16 *q_pPowerSpectrumParameterMsInv_fx[NB_DIV]; Word16 coreMsMask[N_MAX]; Word16 sfb, ch, last_core_acelp; STEREO_MDCT_BAND_PARAMETERS *sfbConf; - Word16 exp_pPowerSpectrum[L_FRAME48k]; + Word32 common_pPowerSpectrum_fx[N_MAX]; + + set32_fx( common_pPowerSpectrum_fx, 0, N_MAX ); + + Word16 common_pPowerSpectrum_exp = MIN16B; + move16(); /* assumptions: stereo filling was already done on the flattened spectra * IGF region is always coded M/S, never L/R (to be done in the encoder) @@ -2705,7 +2623,9 @@ void IGFEncApplyStereo_fx( IF( EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->hTcxEnc->fUseTns[frameno] && !sts[1]->hTcxEnc->fUseTns[frameno] ) { pPowerSpectrumParameter_fx[0] = &pPowerSpectrum_fx[0][0]; + exp_pPowerSpectrumParameter_fx[0] = &exp_pPowerSpectrum_fx[0][0]; pPowerSpectrumParameter_fx[1] = &pPowerSpectrum_fx[1][0]; + exp_pPowerSpectrumParameter_fx[1] = &exp_pPowerSpectrum_fx[1][0]; pPowerSpectrumParameterMsInv_fx[0] = pPowerSpectrumMsInv_fx[0][0]; pPowerSpectrumParameterMsInv_fx[1] = pPowerSpectrumMsInv_fx[1][0]; q_pPowerSpectrumParameterMsInv_fx[0] = q_pPowerSpectrumMsInv_fx[0][0]; @@ -2732,17 +2652,37 @@ void IGFEncApplyStereo_fx( IF( EQ_16( sts[ch]->core, TCX_20_CORE ) ) { pPowerSpectrumParameter_fx[ch] = pPowerSpectrum_fx[ch]; + exp_pPowerSpectrumParameter_fx[ch] = exp_pPowerSpectrum_fx[ch]; } ELSE { pPowerSpectrumParameter_fx[ch] = NULL; } - set16_fx( exp_pPowerSpectrum, exp_pPowerSpectrum_fx[ch], L_FRAME48k ); + IGF_Whitening_ivas_fx( hIGFEnc[ch], pPowerSpectrumParameter_fx[ch], exp_pPowerSpectrumParameter_fx[ch], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); - IGF_Whitening_ivas_fx( hIGFEnc[ch], pPowerSpectrumParameter_fx[ch], &exp_pPowerSpectrum[0], igfGridIdx, sts[ch]->hTranDet->transientDetector.bIsAttackPresent, last_core_acelp, ( sts[0]->hTcxEnc->fUseTns[frameno] || sts[1]->hTcxEnc->fUseTns[frameno] ), sp_aud_decision0, element_brate, sts[ch]->element_mode ); + IF( pPowerSpectrumParameter_fx[ch] ) + { + Word16 length = N_MAX; + move16(); + if ( mct_on ) + { + length = L_FRAME48k; + move16(); + } + FOR( Word16 i = 0; i < length; i++ ) + { + common_pPowerSpectrum_exp = s_max( common_pPowerSpectrum_exp, exp_pPowerSpectrumParameter_fx[ch][i] ); + } - IGF_ErodeSpectrum_ivas_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], pPowerSpectrumParameter_fx[ch], exp_pPowerSpectrum_fx[ch], igfGridIdx, mct_on ); + FOR( Word16 i = 0; i < length; i++ ) + { + common_pPowerSpectrum_fx[i] = L_shl( pPowerSpectrumParameter_fx[ch][i], sub( exp_pPowerSpectrumParameter_fx[ch][i], common_pPowerSpectrum_exp ) ); + move32(); + } + pPowerSpectrumParameter_fx[ch] = common_pPowerSpectrum_fx; + } + IGF_ErodeSpectrum_ivas_fx( hIGFEnc[ch], sts[ch]->hTcxEnc->spectrum_fx[frameno], pPowerSpectrumParameter_fx[ch], common_pPowerSpectrum_exp, igfGridIdx, mct_on ); } return; } diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index f78ad2025..2befbe8ba 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -781,6 +781,87 @@ Word16 IGF_getCrest( /**< ou return crest; } +Word16 IGF_getCrest_ivas( /**< out: Q15| crest factor */ + Word16 *crest_exp, /**< out: | exponent of crest factor */ + const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ + const Word16 *powerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +) +{ + Word16 i; + Word16 x; + Word16 s; + Word32 x_eff32; + Word16 x_max; + Word16 crest; + Word16 tmp; + Word32 tmp32; + + x_eff32 = 0; + move32(); + x_max = 0; + move16(); + crest = 16384 /*.5f Q15*/; + move16(); + *crest_exp = 1; + move16(); + + FOR( i = start; i < stop; i++ ) + { + /*x = max(0, (int)(log(powerSpectrum[i]) * INV_LOG_2));*/ + + /*see IGF_getSFM for more comment */ + x = sub( sub( powerSpectrum_exp[i], norm_l( powerSpectrum[i] ) ), 1 ); /*Q0*/ + if ( powerSpectrum[i] == 0 ) /*special case: energy is zero*/ + { + x = 0; + move16(); + } + x = s_max( 0, x ); + x_eff32 = L_mac0( x_eff32, x, x ); /*Q0*/ + x_max = s_max( x_max, x ); /*Q0*/ + } + + /*x_eff /= (stop - start);*/ + x_eff32 = BASOP_Util_Divide3216_Scale( x_eff32, sub( stop, start ), &s ); /*Q-1, s*/ + s = add( s, 32 ); /*make x_eff Q31*/ + + /*trunkate to int*/ + x_eff32 = L_shr( x_eff32, sub( 31, s ) ); + x_eff32 = L_shl( x_eff32, sub( 31, s ) ); + + test(); + IF( x_eff32 > 0 && x_max > 0 ) + { + /*crest = max(1.f, (float)x_max/sqrt(x_eff));*/ + tmp32 = ISqrt32( x_eff32, &s ); /*Q31, s*/ + tmp32 = Mpy_32_16_1( tmp32 /*Q31, s*/, x_max /*Q0*/ ); /*Q16, s*/ + i = norm_l( tmp32 ); + tmp32 = L_shl( tmp32, i ); /*Q31, s-i+15*/ + crest = extract_h( tmp32 ); + *crest_exp = add( sub( s, i ), 15 ); + move16(); + /* limit crest factor to a lower bound of 1, may overflow */ + BASOP_SATURATE_WARNING_OFF_EVS + tmp = shl_sat( -1, sub( 15, *crest_exp ) ); /* build negative threshold */ + tmp = add_sat( crest, tmp ); + BASOP_SATURATE_WARNING_ON_EVS + if ( tmp < 0 ) + { + crest = 1; + move16(); + } + if ( tmp < 0 ) + { + *crest_exp = 15; + move16(); + } + } + + return crest; +} + /************************************************************************* calculates spectral flatness measurment **************************************************************************/ @@ -932,7 +1013,7 @@ Word16 IGF_getSFM_ivas_fx( /**< out: Q15| SFM value /* n = sub(n,31); */ /*<- -Qx */ /* n = add(n,*energy_exp); */ /*<- +xExp */ - n = sub( sub( *energy_exp, norm_l( energy[i] ) ), 1 ); /*<-- short form*/ + n = sub( sub( energy_exp[i], norm_l( energy[i] ) ), 1 ); /*<-- short form*/ if ( energy[i] == 0 ) /*special case: energy is zero*/ { @@ -943,7 +1024,7 @@ Word16 IGF_getSFM_ivas_fx( /**< out: Q15| SFM value n = s_max( 0, n ); num = L_add( num, L_deposit_l( n ) ); /*Q0*/ - denom = BASOP_Util_Add_Mant32Exp( energy[i], *energy_exp, denom, denom_exp, &denom_exp ); + denom = BASOP_Util_Add_Mant32Exp( energy[i], energy_exp[i], denom, denom_exp, &denom_exp ); } /* calculate SFM only if signal is present */ diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c index 615a6f4b6..be15b5048 100644 --- a/lib_enc/ivas_dirac_enc_fx.c +++ b/lib_enc/ivas_dirac_enc_fx.c @@ -849,16 +849,17 @@ void computeReferencePower_enc_fx( Word16 ref_power_w, /* i : use 0 if hodirac is enabled Q0*/ const Word16 nchan_ana, /* i : number of analysis channels Q0*/ Word16 inp_q, /* i : q of cld buffers */ - Word16 *ref_exp /* i : output q */ -) + Word16 q_reference_power[DIRAC_NO_FB_BANDS_MAX] ) { Word16 brange[2]; Word16 ch_idx, i, j; - Word16 ref_Q = 63; - move16(); + Word16 num_bins, guard_bits, norm; Word64 reference_power_tmp[DIRAC_MAX_NBANDS]; Word64 reference_power_W[DIRAC_MAX_NBANDS]; + + Word16 shift_ref_power = sub( shl( inp_q, 1 ), 31 ); + FOR( i = 0; i < num_freq_bands; i++ ) { brange[0] = band_grouping[i + enc_param_start_band]; /* Q0 */ @@ -871,24 +872,28 @@ void computeReferencePower_enc_fx( move64(); reference_power_tmp[i] = 0; move64(); + + num_bins = sub( brange[1], brange[0] ); + guard_bits = find_guarded_bits_fx( num_bins ); + FOR( j = brange[0]; j < brange[1]; j++ ) { - // 2*inp_q + 1 - reference_power_W[i] = W_add( reference_power_W[i], W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ), Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ) ); + reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ), Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ), guard_bits ) ); // 2*inp_q + 1 - guard_bits move64(); } - reference_power_tmp[i] = W_add( reference_power_tmp[i], reference_power_W[i] ); // 2*inp_q + 1 + reference_power_tmp[i] = W_add( reference_power_tmp[i], reference_power_W[i] ); // 2*inp_q + 1 - guard_bits move64(); FOR( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) { /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { - reference_power_tmp[i] = W_add( reference_power_tmp[i], W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ) ); + reference_power_tmp[i] = W_add( reference_power_tmp[i], W_shr( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), guard_bits ) ); // 2*inp_q + 1 - guard_bits move64(); } - // 2*inp_q + 1 } + q_reference_power[i] = sub( shift_ref_power, guard_bits ); + move16(); } FOR( i = 0; i < num_freq_bands; i++ ) { @@ -908,20 +913,21 @@ void computeReferencePower_enc_fx( } } } + FOR( i = 0; i < num_freq_bands; i++ ) { - ref_Q = s_min( ref_Q, W_norm( reference_power_tmp[i] ) ); - } - FOR( i = 0; i < num_freq_bands; i++ ) - { - reference_power_tmp[i] = W_shl( reference_power_tmp[i], ref_Q ); // 2*inp_q + 1 + ref_Q - move64(); - reference_power[i] = W_extract_h( reference_power_tmp[i] ); // 2*inp_q + ref_Q - 31 + norm = 63; + move16(); + IF( reference_power_tmp[i] != 0 ) + { + norm = W_norm( reference_power_tmp[i] ); + } + reference_power[i] = W_extract_h( W_shl( reference_power_tmp[i], norm ) ); // 2 * inp_q + 1 - guard_bits + norm - 32 move32(); + q_reference_power[i] = add( q_reference_power[i], norm ); + move16(); } - *ref_exp = sub( Q31, ( sub( add( shl( inp_q, Q1 ), ref_Q ), Q31 ) ) ); - move16(); return; } /*------------------------------------------------------------------------- diff --git a/lib_enc/ivas_mcmasa_enc_fx.c b/lib_enc/ivas_mcmasa_enc_fx.c index b89424e76..314424341 100644 --- a/lib_enc/ivas_mcmasa_enc_fx.c +++ b/lib_enc/ivas_mcmasa_enc_fx.c @@ -89,7 +89,7 @@ static void computeIntensityVector_enc_fx( const Word16 enc_param_start_band, /* i : first band to process */ const Word16 num_frequency_bands, Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], - Word16 *exp_intensity_real, + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], Word16 inp_q ); static void computeVerticalDiffuseness_fx( @@ -947,7 +947,9 @@ void ivas_mcmasa_param_est_enc_fx( Word32 renormalization_factor_coh_fx[MASA_FREQUENCY_BANDS]; // renormalization_factor_coh_e Word16 renormalization_factor_coh_e[MASA_FREQUENCY_BANDS]; Word16 surroundingCoherence_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 numAnalysisChannels, shift; + Word16 numAnalysisChannels; + Word16 q_intensity_real_fx[MASA_FREQUENCY_BANDS], q_intensity_even_real_fx[MASA_FREQUENCY_BANDS], q_reference_power_fx[DIRAC_NO_FB_BANDS_MAX]; + Word16 c_e, ref_e, shift; FOR( i = 0; i < MCMASA_MAX_ANA_CHANS; i++ ) { @@ -1038,7 +1040,7 @@ void ivas_mcmasa_param_est_enc_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { - Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + Word16 cr_q = MAX_16, ci_q = MAX_16, sf; Word16 inp_q = q_inp; move16(); move16(); @@ -1062,7 +1064,6 @@ void ivas_mcmasa_param_est_enc_fx( scale_sig32( Chnl_ImagBuffer_fx[i], DIRAC_NO_FB_BANDS_MAX, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); - c_e = sub( 31, inp_q ); /* Compute covariance matrix */ FOR( i = 0; i < num_freq_bands; i++ ) @@ -1177,7 +1178,9 @@ void ivas_mcmasa_param_est_enc_fx( Foa_ImagBuffer_fx, 0, num_freq_bands, - intensity_real_fx, &c_e, inp_q ); + intensity_real_fx, + q_intensity_real_fx, + inp_q ); computeDirectionVectors_fixed( intensity_real_fx[0], @@ -1187,8 +1190,9 @@ void ivas_mcmasa_param_est_enc_fx( num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], - direction_vector_fx[2], c_e, - NULL ); + direction_vector_fx[2], + 0, + q_intensity_real_fx ); /* Power and intensity estimation for diffuseness */ computeIntensityVector_enc_fx( @@ -1197,19 +1201,54 @@ void ivas_mcmasa_param_est_enc_fx( FoaEven_ImagBuffer_fx, 0, num_freq_bands, - intensity_even_real_fx, &shift, inp_q ); + intensity_even_real_fx, + q_intensity_even_real_fx, + inp_q ); - Word16 ref_e = 0; - move16(); - computeReferencePower_enc_fx( hMcMasa->band_grouping, - FoaEven_RealBuffer_fx, - FoaEven_ImagBuffer_fx, - reference_power_fx[ts], - 0, - num_freq_bands, - MC_FORMAT, - 0, - FOA_CHANNELS, inp_q, &ref_e ); + computeReferencePower_enc_fx( + hMcMasa->band_grouping, + FoaEven_RealBuffer_fx, + FoaEven_ImagBuffer_fx, + reference_power_fx[ts], + 0, + num_freq_bands, + MC_FORMAT, + 0, + FOA_CHANNELS, + inp_q, + q_reference_power_fx ); + + minimum_fx( q_intensity_real_fx, num_freq_bands, &c_e ); + minimum_fx( q_intensity_even_real_fx, num_freq_bands, &shift ); + minimum_fx( q_reference_power_fx, num_freq_bands, &ref_e ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( c_e, q_intensity_real_fx[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + + tmp = sub( shift, q_intensity_even_real_fx[i] ); + intensity_even_real_fx[0][i] = L_shl( intensity_even_real_fx[0][i], tmp ); + move32(); + intensity_even_real_fx[1][i] = L_shl( intensity_even_real_fx[1][i], tmp ); + move32(); + intensity_even_real_fx[2][i] = L_shl( intensity_even_real_fx[2][i], tmp ); + move32(); + + tmp = sub( ref_e, q_reference_power_fx[i] ); + reference_power_fx[ts][i] = L_shl( reference_power_fx[ts][i], tmp ); + move32(); + } + + c_e = sub( Q31, c_e ); + shift = sub( Q31, shift ); + ref_e = sub( Q31, ref_e ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = add( ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ), 1 ); /* averaging_length = 32 */ @@ -2089,15 +2128,13 @@ static void computeIntensityVector_enc_fx( const Word16 enc_param_start_band, /* i : first band to process */ const Word16 num_frequency_bands, Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ - Word16 *exp_intensity_real, + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], Word16 inp_q ) { Word16 i, j; Word32 real, img; - Word16 brange[2], shift = 63; - move16(); - Flag is_zero = 0; - move16(); + Word16 brange[2]; + Word16 shift_intensity_real, num_bins, guard_bits, norm; Word64 intensity_real64[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; @@ -2106,6 +2143,8 @@ static void computeIntensityVector_enc_fx( set64_fx( intensity_real64[i], 0, MASA_FREQUENCY_BANDS ); } + shift_intensity_real = sub( shl( inp_q, 1 ), 32 ); + FOR( i = enc_param_start_band; i < enc_param_start_band + num_frequency_bands; i++ ) { brange[0] = band_grouping[i]; @@ -2113,6 +2152,9 @@ static void computeIntensityVector_enc_fx( brange[1] = band_grouping[i + 1]; move16(); + num_bins = sub( brange[1], brange[0] ); + guard_bits = find_guarded_bits_fx( num_bins ); + intensity_real[0][i] = 0; move32(); intensity_real[1][i] = 0; @@ -2127,45 +2169,37 @@ static void computeIntensityVector_enc_fx( img = Cldfb_ImagBuffer[0][j]; move32(); /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real64[0][i] = W_add( intensity_real64[0][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q + intensity_real64[0][i] = W_add( intensity_real64[0][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ), guard_bits ) ); // output Q= 2* input_q - guard_bits move32(); - intensity_real64[1][i] = W_add( intensity_real64[1][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q + intensity_real64[1][i] = W_add( intensity_real64[1][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ), guard_bits ) ); // output Q= 2* input_q - guard_bits move32(); - intensity_real64[2][i] = W_add( intensity_real64[2][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q + intensity_real64[2][i] = W_add( intensity_real64[2][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ), guard_bits ) ); // output Q= 2* input_q - guard_bits move32(); } - } - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - is_zero = is_zero_arr64( intensity_real64[i], MASA_FREQUENCY_BANDS ); - IF( is_zero == 0 ) + norm = 63; + move16(); + IF( intensity_real64[0][i] != 0 ) { - BREAK; + norm = s_min( norm, W_norm( intensity_real64[0][i] ) ); } - } - IF( is_zero == 0 ) - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + IF( intensity_real64[1][i] != 0 ) { - shift = s_min( shift, W_norm_arr( intensity_real64[i], MASA_FREQUENCY_BANDS ) ); + norm = s_min( norm, W_norm( intensity_real64[1][i] ) ); } - - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + IF( intensity_real64[2][i] != 0 ) { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real[i][j] = W_extract_h( W_shl( intensity_real64[i][j], shift ) ); - move32(); - } + norm = s_min( norm, W_norm( intensity_real64[2][i] ) ); } - *exp_intensity_real = sub( 31, sub( add( shift, shl( inp_q, 1 ) ), 32 ) ); - move16(); - } - ELSE - { - *exp_intensity_real = 0; + intensity_real[0][i] = W_extract_h( W_shl( intensity_real64[0][i], norm ) ); /*2 * inp_q - guard_bits + norm - 32*/ + move32(); + intensity_real[1][i] = W_extract_h( W_shl( intensity_real64[1][i], norm ) ); /*2 * inp_q - guard_bits + norm - 32*/ + move32(); + intensity_real[2][i] = W_extract_h( W_shl( intensity_real64[2][i], norm ) ); /*2 * inp_q - guard_bits + norm - 32*/ + move32(); + + q_intensity_real[i] = add( shift_intensity_real, sub( norm, guard_bits ) ); move16(); } diff --git a/lib_enc/ivas_mct_enc_mct_fx.c b/lib_enc/ivas_mct_enc_mct_fx.c index 8ff17ae01..8acbd42fc 100644 --- a/lib_enc/ivas_mct_enc_mct_fx.c +++ b/lib_enc/ivas_mct_enc_mct_fx.c @@ -996,6 +996,7 @@ void mctStereoIGF_enc_fx( Word32 *p_inv_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_orig_spectrum_fx[CPE_CHANNELS][NB_DIV]; Word32 *p_powerSpec_fx[NB_DIV]; + Word16 *p_exp_powerSpec_fx[NB_DIV]; Word16 b, nSubframes, L_subframeTCX; Word16 p_ch[2], n, ch, ch1, ch2; @@ -1004,7 +1005,7 @@ void mctStereoIGF_enc_fx( Encoder_State *st; Word16 singleChEle[MCT_MAX_CHANNELS]; Word16 q_spectrum; - Word16 exp_powerSpec[MCT_MAX_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; + Word16 exp_powerSpec[MCT_MAX_CHANNELS][L_FRAME48k]; L_subframeTCX = 0; /* to avoid compilation warning */ move16(); @@ -1042,7 +1043,9 @@ void mctStereoIGF_enc_fx( } p_powerSpec_fx[0] = powerSpec_fx[ch1]; // q_powerSpec + p_exp_powerSpec_fx[0] = exp_powerSpec[ch1]; // q_powerSpec p_powerSpec_fx[1] = powerSpec_fx[ch2]; + p_exp_powerSpec_fx[1] = exp_powerSpec[ch2]; /* Band-wise M/S for MDST */ nSubframes = NB_DIV; @@ -1072,17 +1075,16 @@ void mctStereoIGF_enc_fx( IF( NE_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], hMCT->hBlockData[b]->hStereoMdct->IGFStereoMode[n] ) || EQ_16( hMCT->hBlockData[b]->hStereoMdct->mdct_stereo_mode[n], SMDCT_BW_MS ) ) { - Word16 exp_powerSpec_fx[CPE_CHANNELS], exp_inv_spectrum_fx[CPE_CHANNELS]; + Word16 exp_inv_spectrum_fx[CPE_CHANNELS]; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - exp_powerSpec_fx[ch] = sub( Q31, q_pS_ch[ch] ); exp_inv_spectrum_fx[ch] = p_st[ch]->hTcxEnc->spectrum_e[n]; move16(); - move16(); } - - ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, q_origSpec, q_origSpec, p_powerSpec_fx, exp_powerSpec_fx, + set16_fx( exp_powerSpec[ch1], sub( Q31, q_pS_ch[0] ), L_FRAME48k ); + set16_fx( exp_powerSpec[ch2], sub( Q31, q_pS_ch[1] ), L_FRAME48k ); + ProcessStereoIGF_fx( hMCT->hBlockData[b]->hStereoMdct, p_st, hMCT->hBlockData[b]->mask, p_orig_spectrum_fx, q_origSpec, q_origSpec, p_powerSpec_fx, p_exp_powerSpec_fx, p_powerSpecMsInv_fx, q_p_powerSpecMsInv_fx, p_inv_spectrum_fx, exp_inv_spectrum_fx, n, sp_aud_decision0[ch1], p_st[0]->total_brate, 1 ); } ELSE @@ -1100,7 +1102,7 @@ void mctStereoIGF_enc_fx( q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); - set16_fx( exp_powerSpec[p_ch[ch]], sub( Q31, q_powerSpec[p_ch[ch]] ), N_MAX + L_MDCT_OVLP_MAX ); + set16_fx( exp_powerSpec[p_ch[ch]], sub( Q31, q_powerSpec[p_ch[ch]] ), L_FRAME48k ); ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[p_ch[ch]][n], q_origSpec, &powerSpec_fx[p_ch[ch]][n * L_subframeTCX], &exp_powerSpec[p_ch[ch]][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); @@ -1141,7 +1143,7 @@ void mctStereoIGF_enc_fx( { q_spectrum = sub( 31, st->hTcxEnc->spectrum_e[n] ); - set16_fx( exp_powerSpec[ch], sub( Q31, q_powerSpec[ch] ), N_MAX + L_MDCT_OVLP_MAX ); + set16_fx( exp_powerSpec[ch], sub( Q31, q_powerSpec[ch] ), L_FRAME48k ); ProcessIGF_ivas_fx( st, L_FRAME48k, st->hTcxEnc->spectrum_fx[n], &q_spectrum, orig_spectrum_fx[ch][n], q_origSpec, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, sp_aud_decision0[ch], 0 ); st->hTcxEnc->spectrum_e[n] = sub( 31, q_spectrum ); diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index 58ba680d6..0b0aa90c5 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -82,14 +82,16 @@ static void ivas_omasa_dmx_fx( Word16 prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], /*o:q15*/ const Word16 interpolator[L_FRAME48k] /*i:q15*/ ); + void computeIntensityVector_enc_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ const Word16 num_frequency_bands, Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ - Word16 *exp_intensity_real, + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], Word16 inp_q ); + static void computeReferencePower_omasa_ivas_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 *reference_power, const Word16 enc_param_start_band, const Word16 num_freq_bands, Word16 q_Cldfb, Word16 *ref_exp ); /*--------------------------------------------------------------------------* * ivas_omasa_enc_open() @@ -1037,6 +1039,7 @@ static void ivas_omasa_param_est_enc_fx( Word16 q; /*stores q for cldfb buffers*/ Word32 temp; Word16 temp_e; + Word16 q_intensity_real_fx[MASA_FREQUENCY_BANDS], q_reference_power_fx[CLDFB_NO_CHANNELS_MAX]; ref_exp = 0; norm_buff = MAX16B; @@ -1188,24 +1191,34 @@ static void ivas_omasa_param_est_enc_fx( v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); /*q*/ } /* Direction estimation */ - norm_buff = L_norm_arr( &Foa_RealBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ); - norm_buff = s_min( norm_buff, L_norm_arr( &Foa_ImagBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX ) ); - guard_bits = find_guarded_bits_fx( max_band_grouping_diff ); - guard_bits = add( guard_bits, sub( 1, norm_buff ) ); + computeIntensityVector_enc_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, q_intensity_real_fx, q ); - scale_sig32( &Foa_RealBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX, negate( guard_bits ) ); - scale_sig32( &Foa_ImagBuffer_fx[0][0], FOA_CHANNELS * CLDFB_NO_CHANNELS_MAX, negate( guard_bits ) ); + computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, q_intensity_real_fx ); - q = sub( q, guard_bits ); + /* Power estimation for diffuseness */ - computeIntensityVector_enc_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, &intensity_real_e, q ); + computeReferencePower_omasa_ivas_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], 0, num_freq_bands, q, q_reference_power_fx ); - computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], intensity_real_e, - NULL ); + minimum_fx( q_intensity_real_fx, num_freq_bands, &intensity_real_e ); + minimum_fx( q_reference_power_fx, num_freq_bands, &ref_exp ); - /* Power estimation for diffuseness */ + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_real_e, q_intensity_real_fx[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); // intensity_real_e + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); // intensity_real_e + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); // intensity_real_e + move32(); + + tmp = sub( ref_exp, q_reference_power_fx[i] ); + reference_power_fx[ts][i] = L_shl( reference_power_fx[ts][i], tmp ); // ref_exp + } - computeReferencePower_omasa_ivas_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], 0, num_freq_bands, q, &ref_exp ); + intensity_real_e = sub( Q31, intensity_real_e ); + ref_exp = sub( Q31, ref_exp ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hOMasa->index_buffer_intensity = add( ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ @@ -1489,15 +1502,13 @@ void computeIntensityVector_enc_fx( Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /*inp_q*/ const Word16 num_frequency_bands, Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ - Word16 *exp_intensity_real, + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], Word16 inp_q ) { Word16 i, j; Word32 real, img; - Word16 brange[2], shift = 63; - move16(); - Flag is_zero = 0; - move16(); + Word16 brange[2]; + Word16 shift_intensity_real, num_bins, guard_bits, norm; Word64 intensity_real64[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; @@ -1506,6 +1517,8 @@ void computeIntensityVector_enc_fx( set64_fx( intensity_real64[i], 0, MASA_FREQUENCY_BANDS ); } + shift_intensity_real = sub( shl( inp_q, 1 ), 32 ); + FOR( i = 0; i < num_frequency_bands; i++ ) { brange[0] = band_grouping[i]; @@ -1513,12 +1526,8 @@ void computeIntensityVector_enc_fx( brange[1] = band_grouping[i + 1]; move16(); - intensity_real[0][i] = 0; - move32(); - intensity_real[1][i] = 0; - move32(); - intensity_real[2][i] = 0; - move32(); + num_bins = sub( brange[1], brange[0] ); + guard_bits = find_guarded_bits_fx( num_bins ); FOR( j = brange[0]; j < brange[1]; j++ ) { @@ -1527,45 +1536,34 @@ void computeIntensityVector_enc_fx( img = Cldfb_ImagBuffer[0][j]; move32(); /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real64[0][i] = W_add( intensity_real64[0][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q= 2* input_q + intensity_real64[0][i] = W_add( intensity_real64[0][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[3][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[3][j], img ) ), guard_bits ) ); // output Q= 2* input_q -guard_bits move64(); - intensity_real64[1][i] = W_add( intensity_real64[1][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q= 2* input_q + intensity_real64[1][i] = W_add( intensity_real64[1][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[1][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[1][j], img ) ), guard_bits ) ); // output Q= 2* input_q - guard_bits move64(); - intensity_real64[2][i] = W_add( intensity_real64[2][i], W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q= 2* input_q + intensity_real64[2][i] = W_add( intensity_real64[2][i], W_shr( W_add( W_mult0_32_32( Cldfb_RealBuffer[2][j], real ), W_mult0_32_32( Cldfb_ImagBuffer[2][j], img ) ), guard_bits ) ); // output Q= 2* input_q - guard_bits move64(); } - } - - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - is_zero = is_zero_arr64( intensity_real64[i], MASA_FREQUENCY_BANDS ); - IF( is_zero == 0 ) + norm = 63; + move16(); + IF( intensity_real64[0][i] != 0 ) { - BREAK; + norm = s_min( norm, W_norm( intensity_real64[0][i] ) ); } - } - IF( is_zero == 0 ) - { - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + IF( intensity_real64[1][i] != 0 ) { - shift = s_min( shift, W_norm_arr( intensity_real64[i], MASA_FREQUENCY_BANDS ) ); + norm = s_min( norm, W_norm( intensity_real64[1][i] ) ); } - - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + IF( intensity_real64[2][i] != 0 ) { - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - intensity_real[i][j] = W_extract_h( W_shl( intensity_real64[i][j], shift ) ); - move32(); - } + norm = s_min( norm, W_norm( intensity_real64[2][i] ) ); } - - *exp_intensity_real = sub( 31, sub( add( shift, shl( inp_q, 1 ) ), 32 ) ); - move16(); - } - ELSE - { - *exp_intensity_real = 0; + intensity_real[0][i] = W_extract_h( W_shl( intensity_real64[0][i], norm ) ); // output Q = 2 * inp_q - guard_bits + norm - 32 + move32(); + intensity_real[1][i] = W_extract_h( W_shl( intensity_real64[1][i], norm ) ); // output Q = 2 * inp_q - guard_bits + norm - 32 + move32(); + intensity_real[2][i] = W_extract_h( W_shl( intensity_real64[2][i], norm ) ); // output Q = 2 * inp_q - guard_bits + norm - 32 + move32(); + q_intensity_real[i] = add( shift_intensity_real, sub( norm, guard_bits ) ); move16(); } @@ -1580,13 +1578,14 @@ static void computeReferencePower_omasa_ivas_fx( const Word16 enc_param_start_band, /* i : first band to process */ const Word16 num_freq_bands, /* i : Number of frequency bands */ Word16 q_Cldfb, - Word16 *ref_exp ) + Word16 q_reference_power[CLDFB_NO_CHANNELS_MAX] ) { Word16 brange[2]; Word16 ch_idx, i, j; Word64 reference_power_tmp[CLDFB_NO_CHANNELS_MAX]; - Word16 ref_Q = 63; - move16(); + Word16 shift_ref_power, num_bins, guard_bits, norm; + + shift_ref_power = sub( shl( q_Cldfb, 1 ), 30 ); FOR( i = 0; i < num_freq_bands; i++ ) { @@ -1599,34 +1598,29 @@ static void computeReferencePower_omasa_ivas_fx( reference_power_tmp[i] = 0; move64(); + num_bins = sub( brange[1], brange[0] ); + guard_bits = find_guarded_bits_fx( num_bins ); + FOR( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) { /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { - reference_power_tmp[i] = W_add( reference_power_tmp[i], W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ) ); // Q13 (Q6+Q6+1) + reference_power_tmp[i] = W_add( reference_power_tmp[i], W_shr( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), guard_bits ) ); // output Q = 2 * q_cldfb + 1 - guard_bits move64(); } } - } - // v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); - FOR( i = 0; i < num_freq_bands; i++ ) - { - reference_power_tmp[i] = W_shr( reference_power_tmp[i], 1 ); - move64(); - ref_Q = s_min( ref_Q, W_norm( reference_power_tmp[i] ) ); - } - - FOR( i = 0; i < num_freq_bands; i++ ) - { - reference_power_tmp[i] = W_shl( reference_power_tmp[i], ref_Q ); // Q13 + ref_Q - move64(); - reference_power[i] = W_extract_h( reference_power_tmp[i] ); // Q13 + ref_Q -32 + norm = 63; + move16(); + IF( reference_power_tmp[i] != 0 ) + { + norm = W_norm( reference_power_tmp[i] ); + } + reference_power[i] = W_extract_h( W_shl( reference_power_tmp[i], norm ) ); // output Q = 2 * q_cldfb + 2 - guard_bits + norm - 32 move32(); + q_reference_power[i] = add( shift_ref_power, sub( norm, guard_bits ) ); + move16(); } - // ref_exp = 31- ((13+ref_Q) -32) - *ref_exp = sub( 31, ( sub( add( ref_Q, 2 * q_Cldfb + 1 ), 32 ) ) ); - move16(); return; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc_fx.c b/lib_enc/ivas_stereo_mdct_core_enc_fx.c index 2a71fc34d..6bb6af1b3 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_core_enc_fx.c @@ -577,9 +577,11 @@ void stereo_mdct_core_enc_fx( { IGF_ENC_INSTANCE_HANDLE hIGFEnc[CPE_CHANNELS]; Word32 powerSpec_fx[CPE_CHANNELS][N_MAX], *p_powerSpec_fx[CPE_CHANNELS]; - Word16 exp_powSpec[CPE_CHANNELS]; + Word16 exp_powSpec[CPE_CHANNELS][N_MAX], *p_exp_powSpec[CPE_CHANNELS]; p_powerSpec_fx[0] = powerSpec_fx[0]; + p_exp_powSpec[0] = exp_powSpec[0]; p_powerSpec_fx[1] = powerSpec_fx[1]; + p_exp_powSpec[1] = exp_powSpec[1]; { /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -598,24 +600,19 @@ void stereo_mdct_core_enc_fx( { length = add( length, shr( length, 2 ) ); } - exp = sub( exp_powerSpec64[ch][0], W_norm_arr( powerSpec64[ch], length ) ); - IF( EQ_16( nsub, 2 ) ) - { - exp = s_max( exp, sub( exp_powerSpec64[ch][1], W_norm_arr( powerSpec64[ch] + length, length ) ) ); - } FOR( n1 = 0; n1 < nsub; n1++ ) { - shift1 = sub( sub( exp_powerSpec64[ch][n1], exp ), 32 ); FOR( i = 0; i < length; i++ ) { /* This doesn't result in saturation */ - powerSpec_fx[ch][i + n1 * length] = W_shl_sat_l( powerSpec64[ch][i + n1 * length], shift1 ); // exp: exp + shift1 = W_norm( powerSpec64[ch][i + n1 * length] ); + powerSpec_fx[ch][i + n1 * length] = W_extract_h( W_shl( powerSpec64[ch][i + n1 * length], shift1 ) ); // exp: exp move32(); + exp_powSpec[ch][i + n1 * length] = sub( exp_powerSpec64[ch][n1], shift1 ); } } set32_fx( powerSpec_fx[ch] + length, 0, sub( N_MAX, length ) ); - exp_powSpec[ch] = exp; // exp: exp - move16(); + set16_fx( exp_powSpec[ch] + length, 0, sub( N_MAX, length ) ); } } @@ -627,13 +624,13 @@ void stereo_mdct_core_enc_fx( move16(); ProcessStereoIGF_fx( hStereoMdct, sts, ms_mask, orig_spectrum_fx, sub( Q31, p_orig_spectrum_e[0] ), sub( Q31, p_orig_spectrum_e[1] ), - p_powerSpec_fx, exp_powSpec, powerSpecMsInv_fx, q_powerSpecMsInv_fx, inv_spectrum_fx, exp_inv_spectrum, + p_powerSpec_fx, p_exp_powSpec, powerSpecMsInv_fx, q_powerSpecMsInv_fx, inv_spectrum_fx, exp_inv_spectrum, n, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->element_brate, 0 ); } ELSE { Word32 powerSpec_fx[CPE_CHANNELS][N_MAX]; // each value has a different exponent - Word16 exp_powerSpec[CPE_CHANNELS][N_MAX + L_MDCT_OVLP_MAX]; + Word16 exp_powerSpec[CPE_CHANNELS][N_MAX]; { /* Copy powerSpec values from 64 bit buffer to 32 bit buffer */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -665,7 +662,7 @@ void stereo_mdct_core_enc_fx( } } set32_fx( powerSpec_fx[ch] + length, 0, sub( N_MAX, length ) ); - set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX + L_MDCT_OVLP_MAX, length ) ); + set16_fx( exp_powerSpec[ch] + length, 0, sub( N_MAX, length ) ); } } FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index c433dcb2c..75f318151 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -3041,6 +3041,13 @@ Word16 IGF_getCrest( /**< out: Q15| crest factor const Word16 start, /**< in: Q0 | start subband index */ const Word16 stop /**< in: Q0 | stop subband index */ ); +Word16 IGF_getCrest_ivas( /**< out: Q15| crest factor */ + Word16 *crest_exp, /**< out: | exponent of crest factor */ + const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ + const Word16 *powerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ +); Word16 IGF_getSFM( /**< out: Q15| SFM value */ Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ const Word32 *energy, /**< in: Q31| energies */ diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 680a69fa5..f8f6f5fac 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -4030,7 +4030,7 @@ void ProcessStereoIGF_fx( Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ -- GitLab From f4b38f0289b69ce443a3cd4c572520b757da1470 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 11 Jun 2025 10:26:51 +0530 Subject: [PATCH 0854/1310] Clang formatting changes --- lib_com/prot_fx.h | 4 ++-- lib_com/stat_com.h | 12 ++++++------ lib_enc/igf_enc.c | 2 +- lib_enc/igf_enc_fx.c | 14 +++++++------- lib_enc/ivas_mct_enc_mct_fx.c | 2 +- lib_enc/prot_fx_enc.h | 12 ++++++------ lib_enc/tcx_utils_enc_fx.c | 2 +- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 38a6077e8..ec2aec450 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10502,7 +10502,7 @@ void ProcessStereoIGF_fx( Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ @@ -10519,7 +10519,7 @@ void IGFEncApplyStereo_fx( const Word16 igfGridIdx, /* i : IGF grid index */ Encoder_State *sts[CPE_CHANNELS], /* i : Encoder state */ Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index 712c1d702..e5081d2be 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -558,12 +558,12 @@ typedef struct ParamsBitMap struct TnsParameters { /* Parameters for each TNS filter */ - Word16 startLineFrequency; /* Starting lower frequency of the TNS filter [20..16000] */ - Word16 nSubdivisions; /* Number of spectrum subdivisions in which the filter operates [1..8) */ - Word16 minPredictionGain; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ - Word32 minPredictionGain_32; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ - Word16 minAvgSqrCoef; /* Minimum average square of coefficients required to turn on the TNS filter. Exponent = 0 */ - Word16 minEnergyChange; /* Minimum energy change required to turn on the TNS filter. Exponent = 8 */ + Word16 startLineFrequency; /* Starting lower frequency of the TNS filter [20..16000] */ + Word16 nSubdivisions; /* Number of spectrum subdivisions in which the filter operates [1..8) */ + Word16 minPredictionGain; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ + Word32 minPredictionGain_32; /* Minimum prediction gain required to turn on the TNS filter. Exponent = PRED_GAIN_E */ + Word16 minAvgSqrCoef; /* Minimum average square of coefficients required to turn on the TNS filter. Exponent = 0 */ + Word16 minEnergyChange; /* Minimum energy change required to turn on the TNS filter. Exponent = 8 */ }; /**********************************************/ diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index db77144df..70b5166df 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -2476,7 +2476,7 @@ void IGFEncApplyMono_ivas_fx( Word32 common_pPowerSpectrum_fx[N_MAX + L_MDCT_OVLP_MAX]; - set32_fx( common_pPowerSpectrum_fx, 0, N_MAX); + set32_fx( common_pPowerSpectrum_fx, 0, N_MAX ); Word16 common_pPowerSpectrum_exp = MIN16B; move16(); diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 2befbe8ba..a7b5eabb3 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -781,12 +781,12 @@ Word16 IGF_getCrest( /**< ou return crest; } -Word16 IGF_getCrest_ivas( /**< out: Q15| crest factor */ - Word16 *crest_exp, /**< out: | exponent of crest factor */ - const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ - const Word16 *powerSpectrum_exp, /**< in: | exponent of power spectrum */ - const Word16 start, /**< in: Q0 | start subband index */ - const Word16 stop /**< in: Q0 | stop subband index */ +Word16 IGF_getCrest_ivas( /**< out: Q15| crest factor */ + Word16 *crest_exp, /**< out: | exponent of crest factor */ + const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ + const Word16 *powerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ ) { Word16 i; @@ -813,7 +813,7 @@ Word16 IGF_getCrest_ivas( /* /*see IGF_getSFM for more comment */ x = sub( sub( powerSpectrum_exp[i], norm_l( powerSpectrum[i] ) ), 1 ); /*Q0*/ - if ( powerSpectrum[i] == 0 ) /*special case: energy is zero*/ + if ( powerSpectrum[i] == 0 ) /*special case: energy is zero*/ { x = 0; move16(); diff --git a/lib_enc/ivas_mct_enc_mct_fx.c b/lib_enc/ivas_mct_enc_mct_fx.c index 8acbd42fc..f28adafa4 100644 --- a/lib_enc/ivas_mct_enc_mct_fx.c +++ b/lib_enc/ivas_mct_enc_mct_fx.c @@ -1042,7 +1042,7 @@ void mctStereoIGF_enc_fx( sts[ch2]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; } - p_powerSpec_fx[0] = powerSpec_fx[ch1]; // q_powerSpec + p_powerSpec_fx[0] = powerSpec_fx[ch1]; // q_powerSpec p_exp_powerSpec_fx[0] = exp_powerSpec[ch1]; // q_powerSpec p_powerSpec_fx[1] = powerSpec_fx[ch2]; p_exp_powerSpec_fx[1] = exp_powerSpec[ch2]; diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 75f318151..6ef6991d4 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -3041,12 +3041,12 @@ Word16 IGF_getCrest( /**< out: Q15| crest factor const Word16 start, /**< in: Q0 | start subband index */ const Word16 stop /**< in: Q0 | stop subband index */ ); -Word16 IGF_getCrest_ivas( /**< out: Q15| crest factor */ - Word16 *crest_exp, /**< out: | exponent of crest factor */ - const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ - const Word16 *powerSpectrum_exp, /**< in: | exponent of power spectrum */ - const Word16 start, /**< in: Q0 | start subband index */ - const Word16 stop /**< in: Q0 | stop subband index */ +Word16 IGF_getCrest_ivas( /**< out: Q15| crest factor */ + Word16 *crest_exp, /**< out: | exponent of crest factor */ + const Word32 *powerSpectrum, /**< in: Q31 | power spectrum */ + const Word16 *powerSpectrum_exp, /**< in: | exponent of power spectrum */ + const Word16 start, /**< in: Q0 | start subband index */ + const Word16 stop /**< in: Q0 | stop subband index */ ); Word16 IGF_getSFM( /**< out: Q15| SFM value */ Word16 *SFM_exp, /**< out: | exponent of SFM Factor */ diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index f8f6f5fac..e1b067ac3 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -4030,7 +4030,7 @@ void ProcessStereoIGF_fx( Word16 q_pITFMDCTSpectrum_1, Word16 q_pITFMDCTSpectrum_2, Word32 *pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: MDCT^2 + MDST^2 spectrum, or estimate */ - Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ + Word16 *exp_pPowerSpectrum_fx[CPE_CHANNELS], /* i/o: exp of pPowerSpectrum_fx */ Word32 *pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i : inverse power spectrum */ Word16 *q_pPowerSpectrumMsInv_fx[CPE_CHANNELS][NB_DIV], /* i/o: Q of pPowerSpectrumMsInv_fx */ Word32 *inv_spectrum_fx[CPE_CHANNELS][NB_DIV], /* i : inverse spectrum */ -- GitLab From 2a9e6640c3f51659821755c412ba4b3b785edb90 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:07:18 +0200 Subject: [PATCH 0855/1310] bug fix : segfault --- lib_dec/ivas_init_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 44e20c645..ad0f7a65c 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -2343,7 +2343,7 @@ ivas_error ivas_init_decoder_fx( #ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, -- GitLab From 4126009526a8add96270b4d392e57f2d7d99c43f Mon Sep 17 00:00:00 2001 From: Adriana Vasilache Date: Wed, 11 Jun 2025 13:38:41 +0300 Subject: [PATCH 0856/1310] 1716_basop_port --- lib_com/options.h | 2 +- lib_dec/ivas_dirac_dec_fx.c | 2 +- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 8 ++++---- lib_rend/lib_rend_fx.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 98e076d36..0cd498a89 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -137,7 +137,7 @@ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ -#define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ +/* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 5f8d1512b..22a7d4993 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1151,7 +1151,7 @@ ivas_error ivas_dirac_dec_config_fx( #endif { #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) #endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index c1c0bf626..d0a5e47d1 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -337,9 +337,9 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - if (NE_32((error = ivas_binaural_reverb_init(&hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &(st_ivas->hRenderConfig->roomAcoustics), output_Fs, (*phHrtfParambin)->parametricReverberationTimes, (*phHrtfParambin)->parametricReverberationEneCorrections)), IVAS_ERR_OK)) + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes_fx, ( *phHrtfParambin )->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #else - if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes_fx, st_ivas->hHrtfParambin->parametricReverberationEneCorrections_fx ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes_fx, st_ivas->hHrtfParambin->parametricReverberationEneCorrections_fx ) ) != IVAS_ERR_OK ) #endif #else /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ @@ -5830,8 +5830,8 @@ static void hrtfShGetHrtf_fx( { Word16 k; #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - Word32( *hrtfShCoeffsReInt_fx )[16][60]; - Word32( *hrtfShCoeffsImInt_fx )[16][60]; + Word16( *hrtfShCoeffsReInt_fx )[16][60]; + Word16( *hrtfShCoeffsImInt_fx )[16][60]; hrtfShCoeffsReInt_fx = hHrtfParambin->hrtfShCoeffsRe_fx; hrtfShCoeffsImInt_fx = hHrtfParambin->hrtfShCoeffsIm_fx; #endif diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 0857a4465..c7bd7b2d6 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -9257,7 +9257,7 @@ static ivas_error getSamplesInternal( hIvasRend->hRendererConfig->split_rend_config.isar_frame_size_ms, #endif hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, - &bits, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0, ro_md_flag, Q_buff, &Q_out[0] ) ) != IVAS_ERR_OK ) + &bits, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0, ro_md_flag, Q_buff, &Q_out[0] ) ) != IVAS_ERR_OK ) { return error; } @@ -10290,7 +10290,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - if (NE_32((error = ivas_binaural_reverb_init(&hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &(hRendCfg->roomAcoustics), output_Fs, (*phHrtfParambin)->parametricReverberationTimes, (*phHrtfParambin)->parametricReverberationEneCorrections)), IVAS_ERR_OK)) + if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes_fx, ( *phHrtfParambin )->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes_fx, hHrtfParambin->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #endif -- GitLab From eb2cb6cfd72389bd3d787c63b8d13b0e453241d8 Mon Sep 17 00:00:00 2001 From: malenov Date: Wed, 11 Jun 2025 12:43:35 +0200 Subject: [PATCH 0857/1310] fix missing pop_wmops() --- lib_rend/lib_rend_fx.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index e92922964..b46d13610 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5715,6 +5715,9 @@ static ivas_error renderLfeToBinaural_fx( ELSE { /* no LFE to render */ +#ifdef FIX_1740_MISING_POP_WMOPS + pop_wmops(); +#endif return IVAS_ERR_OK; } -- GitLab From 2b15315ae96d20deed96d96c6e696f08a6758a73 Mon Sep 17 00:00:00 2001 From: Adriana Vasilache Date: Wed, 11 Jun 2025 13:44:58 +0300 Subject: [PATCH 0858/1310] fixc clang --- lib_dec/ivas_dirac_dec_fx.c | 2 +- lib_rend/lib_rend_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 22a7d4993..e843a82f9 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1151,7 +1151,7 @@ ivas_error ivas_dirac_dec_config_fx( #endif { #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) #endif diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index c7bd7b2d6..562b35a6a 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -9257,7 +9257,7 @@ static ivas_error getSamplesInternal( hIvasRend->hRendererConfig->split_rend_config.isar_frame_size_ms, #endif hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, - &bits, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, (const int16_t) ( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0, ro_md_flag, Q_buff, &Q_out[0] ) ) != IVAS_ERR_OK ) + &bits, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0, ro_md_flag, Q_buff, &Q_out[0] ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 131aedf4654587a27ab2e4ca651a62c150ebf55b Mon Sep 17 00:00:00 2001 From: malenov Date: Wed, 11 Jun 2025 12:49:50 +0200 Subject: [PATCH 0859/1310] fix missing pop_wmops() --- lib_rend/lib_rend_fx.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index e92922964..b46d13610 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5715,6 +5715,9 @@ static ivas_error renderLfeToBinaural_fx( ELSE { /* no LFE to render */ +#ifdef FIX_1740_MISING_POP_WMOPS + pop_wmops(); +#endif return IVAS_ERR_OK; } -- GitLab From 15838fc796dbe1c8f1bbfca869655d8ad5f9c122 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 11 Jun 2025 11:42:00 +0200 Subject: [PATCH 0860/1310] [renderer] add OSBA/OMASA CLI support and update printouts. see float MRs 1908 and 2146. --- apps/renderer.c | 149 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 100 insertions(+), 49 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 47548d438..317713c05 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -149,7 +149,7 @@ typedef struct int32_t sampleRate; InputConfig inConfig; OutputConfig outConfig; - char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; + char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; int16_t numInMetadataFiles; char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; @@ -217,13 +217,13 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_inputFormat, .match = "input_format", .matchShort = "if", - .description = "Audio format of input file (e.g. 5_1 or HOA3 or META, use -l for a list)", + .description = "Audio format of input file (e.g. 5_1 or HOA3 or META,\nuse -l for a list)", }, { .id = CmdLnOptionId_inputMetadata, .match = "input_metadata", .matchShort = "im", - .description = "Space-separated list of path to metadata files for ISM or MASA inputs", + .description = "Space-separated list of path to metadata files for ISM/MASA/OMASA/\nOSBA inputs. \nFor OMASA, ISM files must be specified first.", }, { .id = CmdLnOptionId_outputFile, @@ -241,57 +241,59 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_sampleRate, .match = "sample_rate", .matchShort = "fs", - .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", + .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw\nPCM inputs", }, { .id = CmdLnOptionId_trajFile, .match = "trajectory_file", .matchShort = "T", - .description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Head rotation trajectory file for simulation of head tracking\n(only for binaural outputs)", }, { .id = CmdLnOptionId_refRotFile, .match = "reference_rotation_file", .matchShort = "rf", - .description = "Reference rotation trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Reference rotation trajectory file for simulation of head tracking\n(only for binaural outputs)", }, { .id = CmdLnOptionId_customHrtfFile, .match = "custom_hrtf", .matchShort = "hrtf", - .description = "Custom HRTF file for binaural rendering (only for binaural outputs)", + .description = "Custom HRTF file for binaural rendering\n(only for binaural outputs)", }, { .id = CmdLnOptionId_renderConfigFile, .match = "render_config_parameters", .matchShort = "render_config", - .description = "Binaural renderer configuration parameters in file (only for binaural outputs)", + .description = "Binaural renderer configuration parameters in file\n(only for binaural outputs)", }, { .id = CmdLnOptionId_nonDiegeticPan, .match = "non_diegetic_panning", .matchShort = "non_diegetic_pan", - .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right, center or c or 0 ->middle\n", + .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right,\ncenter or c or 0 ->middle", }, { .id = CmdLnOptionId_orientationTracking, .match = "tracking_type", .matchShort = "otr", - .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs)", + .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec`\nor `ref_vec_lev` (only for binaural outputs)", }, { .id = CmdlnOptionId_lfePosition, .match = "lfe_position", .matchShort = "lp", - .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth, elevation] where gain is linear (like --gain, -g) and azimuth, elevation are in degrees.\nIf specified, overrides the default behavior which attempts to map input to output LFE channel(s)", + .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth,\nelevation] where gain is linear (like --gain, -g) and azimuth,\nelevation are in degrees. If specified, overrides the default\nbehavior which attempts to map input to output LFE channel(s)", + }, + { + .id = CmdlnOptionId_lfeMatrix, + .match = "lfe_matrix", + .matchShort = "lm", + .description = "LFE panning matrix. File (CSV table) containing a matrix of\ndimensions [ num_input_lfe x num_output_channels ] with elements\nspecifying linear routing gain (like --gain, -g). If specified,\noverrides the output LFE position option and the default\nbehavior which attempts to map input to output LFE channel(s)", }, - { .id = CmdlnOptionId_lfeMatrix, - .match = "lfe_matrix", - .matchShort = "lm", - .description = "LFE panning matrix. File (CSV table) containing a matrix of dimensions [ num_input_lfe x num_output_channels ] with elements specifying linear routing gain (like --gain, -g). \nIf specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s)" }, { .id = CmdLnOptionId_noDelayCmp, - .match = "no_delay_comparison", + .match = "no_delay_compensation", .matchShort = "no_delay_cmp", .description = "[flag] Turn off delay compensation", }, @@ -299,7 +301,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_complexityLevel, .match = "complexity_level", .matchShort = "level", - .description = "Complexity level, level = (1, 2, 3), will be defined after characterisation.", + .description = "Complexity level, level = (1, 2, 3), will be defined after\ncharacterisation.", }, { .id = CmdLnOptionId_quietModeEnabled, @@ -323,13 +325,13 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_referenceVectorFile, .match = "reference_vector_file", .matchShort = "rvf", - .description = "Reference vector trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Reference vector trajectory file for simulation of head tracking\n(only for binaural outputs)", }, { .id = CmdLnOptionId_exteriorOrientationFile, .match = "exterior_orientation_file", .matchShort = "exof", - .description = "External orientation trajectory file for simulation of external orientations", + .description = "External orientation trajectory file for simulation of external\norientations", }, { .id = CmdLnOptionId_framing, @@ -341,19 +343,19 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_syncMdDelay, .match = "sync_md_delay", .matchShort = "smd", - .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by 5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", + .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by\n5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", }, { .id = CmdLnOptionId_directivityPatternId, .match = "ism_directivity_pattern_id", .matchShort = "dpid", - .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated list of up to 4 numbers (unsigned integers) can be specified for BINAURAL and BINAURAL_ROOM_REVERB output configuration.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for ISMs 1,2,3 and 4 respectively.\nThis options needs to be accompanied by a render_config file, otherwise a default directivity pattern is used.", + .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated\nlist of up to 4 numbers (unsigned integers) can be specified for\nBINAURAL and BINAURAL_ROOM_REVERB output.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for\nISMs 1,2,3 and 4 respectively. \nThis option needs to be accompanied by a render_config file,\notherwise a default directivity pattern is used.", }, { .id = CmdLnOptionId_acousticEnvironmentId, .match = "acoustic_environment_id", .matchShort = "aeid", - .description = "Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output configuration", + .description = "Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output.", }, }; @@ -368,6 +370,8 @@ static IVAS_AUDIO_CONFIG ambisonicsOrderToEnum( const int16_t order ); static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); +static void parseCombinedFormatInput( InputConfig *inConfig, char **configString ); + static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ); static CmdlnArgs parseCmdlnArgs( const int argc, char **argv ); @@ -584,25 +588,7 @@ static void setupWithSingleFormatInput( strncpy( audioFilePath, args.inputFilePath, FILENAME_MAX - 1 ); /* Depending on input format, prepare metadata reading for ISM or MASA */ - if ( args.inConfig.numMasaBuses != 0 ) - { - if ( args.inConfig.numMasaBuses != args.numInMetadataFiles ) - { - fprintf( stderr, "Error: all MASA inputs must have a corresponding metadata file" ); - exit( -1 ); - } - - for ( int16_t i = 0; i < args.numInMetadataFiles; ++i ) - { - masaReaders[i] = MasaFileReader_open( args.inMetadataFilePaths[i] ); - if ( masaReaders[i] == NULL ) - { - fprintf( stderr, "Could not open MASA metadata file %s\n", args.inMetadataFilePaths[i] ); - exit( -1 ); - } - } - } - else if ( args.inConfig.numAudioObjects != 0 ) + if ( args.inConfig.numAudioObjects != 0 ) { positionProvider->numObjects = args.inConfig.numAudioObjects; for ( int16_t i = 0; i < positionProvider->numObjects; ++i ) @@ -625,6 +611,26 @@ static void setupWithSingleFormatInput( } } } + if ( args.inConfig.numMasaBuses != 0 ) + { + if ( args.inConfig.numMasaBuses != ( args.numInMetadataFiles - args.inConfig.numAudioObjects ) ) + { + fprintf( stderr, "Error: all MASA inputs must have a corresponding metadata file" ); + exit( -1 ); + } + + int16_t reader_idx = 0; + for ( int16_t i = args.inConfig.numAudioObjects; i < args.numInMetadataFiles; ++i ) + { + reader_idx = i - args.inConfig.numAudioObjects; + masaReaders[reader_idx] = MasaFileReader_open( args.inMetadataFilePaths[i] ); + if ( masaReaders[reader_idx] == NULL ) + { + fprintf( stderr, "Could not open MASA metadata file %s\n", args.inMetadataFilePaths[i] ); + exit( -1 ); + } + } + } return; } @@ -1804,16 +1810,11 @@ static bool parseInConfig( inConfig->masaBuses[0].gain_dB = 0.0f; break; case IVAS_AUDIO_CONFIG_OBA: - /* If input format is objects, parse the characters after "ISM" to get number of objects */ + /* If input format is objects, parse the characters after "ISM" to get + * number of objects and check for combined formats. */ { char *ptr = NULL; inConfig->numAudioObjects = (uint16_t) strtol( inFormatStr + 3, &ptr, 10 ); - if ( ptr == NULL || *ptr != '\0' ) - { - /* Failed to parse string as a number */ - fprintf( stderr, "Cannot parse string \"%s\" as a valid input format", inFormatStr ); - return false; - } if ( inConfig->numAudioObjects > RENDERER_MAX_ISM_INPUTS ) { fprintf( stderr, "Too many objects at input. Max %d supported.", RENDERER_MAX_ISM_INPUTS ); @@ -1825,6 +1826,17 @@ static bool parseInConfig( inConfig->audioObjects[i].inputChannelIndex = i; inConfig->audioObjects[i].gain_dB = 0.0f; } + if ( *ptr != '\0' ) + { + /* Try to parse combined format */ + parseCombinedFormatInput( inConfig, &ptr ); + } + if ( ptr == NULL || *ptr != '\0' ) + { + /* Failed to parse string as a number */ + fprintf( stderr, "Cannot parse string \"%s\" as a valid input format", inFormatStr ); + return false; + } } break; case IVAS_AUDIO_CONFIG_INVALID: @@ -2255,7 +2267,7 @@ static void parseOption( } break; case CmdLnOptionId_inputMetadata: - assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS ); + assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS ); for ( int16_t i = 0; i < numOptionValues; ++i ) { strncpy( args->inMetadataFilePaths[i], optionValues[i], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); @@ -3086,6 +3098,41 @@ static void parseMasa( return; } +static void parseCombinedFormatInput( + InputConfig *inConfig, + char **configString ) +{ + IVAS_AUDIO_CONFIG audioConfig; + audioConfig = parseAudioConfig( *configString ); + + if ( audioConfig == IVAS_AUDIO_CONFIG_FOA || audioConfig == IVAS_AUDIO_CONFIG_HOA2 || audioConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + /* OSBA */ + inConfig->numAmbisonicsBuses = 1; + inConfig->ambisonicsBuses[0].audioConfig = audioConfig; + inConfig->ambisonicsBuses[0].inputChannelIndex = inConfig->numAudioObjects; + inConfig->ambisonicsBuses[0].gain_dB = -6.f; + *configString += 4; + + /* Modify input gain for objects too */ + for ( int16_t i = 0; i < inConfig->numAudioObjects; ++i ) + { + inConfig->audioObjects[i].gain_dB = -6.f; + } + } + else if ( audioConfig == IVAS_AUDIO_CONFIG_MASA1 || audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + /* OMASA */ + inConfig->numMasaBuses = 1; + inConfig->masaBuses[0].audioConfig = audioConfig; + inConfig->masaBuses[0].inputChannelIndex = inConfig->numAudioObjects; + inConfig->masaBuses[0].gain_dB = 0.0f; + *configString += 5; + } + + return; +} + static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ) @@ -3302,10 +3349,13 @@ static void printSupportedAudioConfigs( void ) "HOA2", "HOA3", "ISMx (input only)", + "ISMxSBAy (OSBA, input only)", + "ISMxMASAy (OMASA, input only)", "MASAx", "BINAURAL (output only)", "BINAURAL_ROOM_IR (output only)", "BINAURAL_ROOM_REVERB (output only)", + "META (Scene description, input only)", }; fprintf( stdout, "Supported audio formats:\n" ); @@ -3313,6 +3363,7 @@ static void printSupportedAudioConfigs( void ) { fprintf( stdout, "%s\n", supportedFormats[i] ); } + fprintf( stdout, "\n" ); return; } -- GitLab From 3dd6097684d3e9c96c3a05290b1fb0ab988e4f3d Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 11 Jun 2025 13:03:51 +0200 Subject: [PATCH 0861/1310] nullptr bug fixes --- lib_dec/ivas_init_dec_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index ad0f7a65c..3f32d96a1 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -2352,9 +2352,9 @@ ivas_error ivas_init_decoder_fx( #endif #else #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if ( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, + st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), + IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), -- GitLab From 569915ed0eb988fcbdecd3c89fcf44d578ec435d Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 11 Jun 2025 12:34:45 +0200 Subject: [PATCH 0862/1310] [renderer] add OSBA/OMASA CLI support and update printouts. see float MRs 1908 and 2146. --- apps/renderer.c | 149 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 100 insertions(+), 49 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index fa716c892..8bddc7383 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -153,7 +153,7 @@ typedef struct int32_t sampleRate; InputConfig inConfig; OutputConfig outConfig; - char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; + char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; int16_t numInMetadataFiles; #ifdef SPLIT_REND_WITH_HEAD_ROT char outMetadataFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; @@ -231,16 +231,16 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_inputFormat, .match = "input_format", .matchShort = "if", - .description = "Audio format of input file (e.g. 5_1 or HOA3 or META, use -l for a list)", + .description = "Audio format of input file (e.g. 5_1 or HOA3 or META,\nuse -l for a list)", }, { .id = CmdLnOptionId_inputMetadata, .match = "input_metadata", .matchShort = "im", #ifdef SPLIT_REND_WITH_HEAD_ROT - .description = "Space-separated list of path to metadata files for ISM or MASA inputs or BINAURAL_SPLIT_PCM input mode", + .description = "Space-separated list of path to metadata files for ISM/MASA/OMASA/\nOSBA/BINAURAL_SPLIT_PCM inputs. \nFor OMASA, ISM files must be specified first.", #else - .description = "Space-separated list of path to metadata files for ISM or MASA inputs", + .description = "Space-separated list of path to metadata files for ISM/MASA/OMASA/\nOSBA inputs. \nFor OMASA, ISM files must be specified first.", #endif }, { @@ -259,13 +259,13 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_sampleRate, .match = "sample_rate", .matchShort = "fs", - .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", + .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw\nPCM inputs", }, { .id = CmdLnOptionId_trajFile, .match = "trajectory_file", .matchShort = "T", - .description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Head rotation trajectory file for simulation of head tracking\n(only for binaural outputs)", }, #ifdef SPLIT_REND_WITH_HEAD_ROT { @@ -285,42 +285,44 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_refRotFile, .match = "reference_rotation_file", .matchShort = "rf", - .description = "Reference rotation trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Reference rotation trajectory file for simulation of head tracking\n(only for binaural outputs)", }, { .id = CmdLnOptionId_customHrtfFile, .match = "custom_hrtf", .matchShort = "hrtf", - .description = "Custom HRTF file for binaural rendering (only for binaural outputs)", + .description = "Custom HRTF file for binaural rendering\n(only for binaural outputs)", }, { .id = CmdLnOptionId_renderConfigFile, .match = "render_config_parameters", .matchShort = "render_config", - .description = "Binaural renderer configuration parameters in file (only for binaural outputs)", + .description = "Binaural renderer configuration parameters in file\n(only for binaural outputs)", }, { .id = CmdLnOptionId_nonDiegeticPan, .match = "non_diegetic_panning", .matchShort = "non_diegetic_pan", - .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right, center or c or 0 ->middle\n", + .description = "Panning mono non diegetic sound to stereo -90<= pan <= 90\nleft or l or 90->left, right or r or -90->right,\ncenter or c or 0 ->middle", }, { .id = CmdLnOptionId_orientationTracking, .match = "tracking_type", .matchShort = "otr", - .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs)", + .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec`\nor `ref_vec_lev` (only for binaural outputs)", }, { .id = CmdlnOptionId_lfePosition, .match = "lfe_position", .matchShort = "lp", - .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth, elevation] where gain is linear (like --gain, -g) and azimuth, elevation are in degrees.\nIf specified, overrides the default behavior which attempts to map input to output LFE channel(s)", + .description = "Output LFE position. Comma-delimited triplet of [gain, azimuth,\nelevation] where gain is linear (like --gain, -g) and azimuth,\nelevation are in degrees. If specified, overrides the default\nbehavior which attempts to map input to output LFE channel(s)", + }, + { + .id = CmdlnOptionId_lfeMatrix, + .match = "lfe_matrix", + .matchShort = "lm", + .description = "LFE panning matrix. File (CSV table) containing a matrix of\ndimensions [ num_input_lfe x num_output_channels ] with elements\nspecifying linear routing gain (like --gain, -g). If specified,\noverrides the output LFE position option and the default\nbehavior which attempts to map input to output LFE channel(s)", }, - { .id = CmdlnOptionId_lfeMatrix, - .match = "lfe_matrix", - .matchShort = "lm", - .description = "LFE panning matrix. File (CSV table) containing a matrix of dimensions [ num_input_lfe x num_output_channels ] with elements specifying linear routing gain (like --gain, -g). \nIf specified, overrides the output LFE position option and the default behavior which attempts to map input to output LFE channel(s)" }, { .id = CmdLnOptionId_noDelayCmp, .match = "no_delay_compensation", @@ -331,7 +333,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_complexityLevel, .match = "complexity_level", .matchShort = "level", - .description = "Complexity level, level = (1, 2, 3), will be defined after characterisation.", + .description = "Complexity level, level = (1, 2, 3), will be defined after\ncharacterisation.", }, { .id = CmdLnOptionId_quietModeEnabled, @@ -355,13 +357,13 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_referenceVectorFile, .match = "reference_vector_file", .matchShort = "rvf", - .description = "Reference vector trajectory file for simulation of head tracking (only for binaural outputs)", + .description = "Reference vector trajectory file for simulation of head tracking\n(only for binaural outputs)", }, { .id = CmdLnOptionId_exteriorOrientationFile, .match = "exterior_orientation_file", .matchShort = "exof", - .description = "External orientation trajectory file for simulation of external orientations", + .description = "External orientation trajectory file for simulation of external\norientations", }, { .id = CmdLnOptionId_framing, @@ -373,19 +375,19 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_syncMdDelay, .match = "sync_md_delay", .matchShort = "smd", - .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by 5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", + .description = "Metadata Synchronization Delay in ms, Default is 0. Quantized by\n5ms subframes for TDRenderer (13ms -> 10ms -> 2subframes)", }, { .id = CmdLnOptionId_directivityPatternId, .match = "ism_directivity_pattern_id", .matchShort = "dpid", - .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated list of up to 4 numbers (unsigned integers) can be specified for BINAURAL and BINAURAL_ROOM_REVERB output configuration.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for ISMs 1,2,3 and 4 respectively.\nThis options needs to be accompanied by a render_config file, otherwise a default directivity pattern is used.", + .description = "Directivity pattern ID(s) = [ID1, ID2, ID3, ID4]. Space-separated\nlist of up to 4 numbers (unsigned integers) can be specified for\nBINAURAL and BINAURAL_ROOM_REVERB output.\nID1, ID2, ID3, ID4 specify the directivity pattern IDs used for\nISMs 1,2,3 and 4 respectively. \nThis option needs to be accompanied by a render_config file,\notherwise a default directivity pattern is used.", }, { .id = CmdLnOptionId_acousticEnvironmentId, .match = "acoustic_environment_id", .matchShort = "aeid", - .description = "Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output configuration", + .description = "Acoustic environment ID (number >= 0) for BINAURAL_ROOM_REVERB output.", }, }; @@ -400,6 +402,8 @@ static IVAS_AUDIO_CONFIG ambisonicsOrderToEnum( const int16_t order ); static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); +static void parseCombinedFormatInput( InputConfig *inConfig, char **configString ); + static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ); static CmdlnArgs parseCmdlnArgs( const int argc, char **argv ); @@ -649,25 +653,7 @@ static void setupWithSingleFormatInput( strncpy( audioFilePath, args.inputFilePath, FILENAME_MAX - 1 ); /* Depending on input format, prepare metadata reading for ISM or MASA */ - if ( args.inConfig.numMasaBuses != 0 ) - { - if ( args.inConfig.numMasaBuses != args.numInMetadataFiles ) - { - fprintf( stderr, "Error: all MASA inputs must have a corresponding metadata file" ); - exit( -1 ); - } - - for ( int16_t i = 0; i < args.numInMetadataFiles; ++i ) - { - masaReaders[i] = MasaFileReader_open( args.inMetadataFilePaths[i] ); - if ( masaReaders[i] == NULL ) - { - fprintf( stderr, "Could not open MASA metadata file %s\n", args.inMetadataFilePaths[i] ); - exit( -1 ); - } - } - } - else if ( args.inConfig.numAudioObjects != 0 ) + if ( args.inConfig.numAudioObjects != 0 ) { positionProvider->numObjects = args.inConfig.numAudioObjects; for ( int16_t i = 0; i < positionProvider->numObjects; ++i ) @@ -690,6 +676,26 @@ static void setupWithSingleFormatInput( } } } + if ( args.inConfig.numMasaBuses != 0 ) + { + if ( args.inConfig.numMasaBuses != ( args.numInMetadataFiles - args.inConfig.numAudioObjects ) ) + { + fprintf( stderr, "Error: all MASA inputs must have a corresponding metadata file" ); + exit( -1 ); + } + + int16_t reader_idx = 0; + for ( int16_t i = args.inConfig.numAudioObjects; i < args.numInMetadataFiles; ++i ) + { + reader_idx = i - args.inConfig.numAudioObjects; + masaReaders[reader_idx] = MasaFileReader_open( args.inMetadataFilePaths[i] ); + if ( masaReaders[reader_idx] == NULL ) + { + fprintf( stderr, "Could not open MASA metadata file %s\n", args.inMetadataFilePaths[i] ); + exit( -1 ); + } + } + } return; } @@ -2392,16 +2398,11 @@ static bool parseInConfig( inConfig->masaBuses[0].gain_dB = 0.0f; break; case IVAS_AUDIO_CONFIG_OBA: - /* If input format is objects, parse the characters after "ISM" to get number of objects */ + /* If input format is objects, parse the characters after "ISM" to get + * number of objects and check for combined formats. */ { char *ptr = NULL; inConfig->numAudioObjects = (uint16_t) strtol( inFormatStr + 3, &ptr, 10 ); - if ( ptr == NULL || *ptr != '\0' ) - { - /* Failed to parse string as a number */ - fprintf( stderr, "Cannot parse string \"%s\" as a valid input format", inFormatStr ); - return false; - } if ( inConfig->numAudioObjects > RENDERER_MAX_ISM_INPUTS ) { fprintf( stderr, "Too many objects at input. Max %d supported.", RENDERER_MAX_ISM_INPUTS ); @@ -2413,6 +2414,17 @@ static bool parseInConfig( inConfig->audioObjects[i].inputChannelIndex = i; inConfig->audioObjects[i].gain_dB = 0.0f; } + if ( *ptr != '\0' ) + { + /* Try to parse combined format */ + parseCombinedFormatInput( inConfig, &ptr ); + } + if ( ptr == NULL || *ptr != '\0' ) + { + /* Failed to parse string as a number */ + fprintf( stderr, "Cannot parse string \"%s\" as a valid input format", inFormatStr ); + return false; + } } break; case IVAS_AUDIO_CONFIG_INVALID: @@ -2862,7 +2874,7 @@ static void parseOption( } break; case CmdLnOptionId_inputMetadata: - assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS ); + assert( numOptionValues <= RENDERER_MAX_ISM_INPUTS + RENDERER_MAX_MASA_INPUTS ); for ( int16_t i = 0; i < numOptionValues; ++i ) { strncpy( args->inMetadataFilePaths[i], optionValues[i], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); @@ -3703,6 +3715,41 @@ static void parseMasa( return; } +static void parseCombinedFormatInput( + InputConfig *inConfig, + char **configString ) +{ + IVAS_AUDIO_CONFIG audioConfig; + audioConfig = parseAudioConfig( *configString ); + + if ( audioConfig == IVAS_AUDIO_CONFIG_FOA || audioConfig == IVAS_AUDIO_CONFIG_HOA2 || audioConfig == IVAS_AUDIO_CONFIG_HOA3 ) + { + /* OSBA */ + inConfig->numAmbisonicsBuses = 1; + inConfig->ambisonicsBuses[0].audioConfig = audioConfig; + inConfig->ambisonicsBuses[0].inputChannelIndex = inConfig->numAudioObjects; + inConfig->ambisonicsBuses[0].gain_dB = -6.f; + *configString += 4; + + /* Modify input gain for objects too */ + for ( int16_t i = 0; i < inConfig->numAudioObjects; ++i ) + { + inConfig->audioObjects[i].gain_dB = -6.f; + } + } + else if ( audioConfig == IVAS_AUDIO_CONFIG_MASA1 || audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) + { + /* OMASA */ + inConfig->numMasaBuses = 1; + inConfig->masaBuses[0].audioConfig = audioConfig; + inConfig->masaBuses[0].inputChannelIndex = inConfig->numAudioObjects; + inConfig->masaBuses[0].gain_dB = 0.0f; + *configString += 5; + } + + return; +} + static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ) @@ -3919,6 +3966,8 @@ static void printSupportedAudioConfigs( void ) "HOA2", "HOA3", "ISMx (input only)", + "ISMxSBAy (OSBA, input only)", + "ISMxMASAy (OMASA, input only)", "MASAx", "BINAURAL (output only)", #ifdef SPLIT_REND_WITH_HEAD_ROT @@ -3927,6 +3976,7 @@ static void printSupportedAudioConfigs( void ) #endif "BINAURAL_ROOM_IR (output only)", "BINAURAL_ROOM_REVERB (output only)", + "META (Scene description, input only)", }; fprintf( stdout, "Supported audio formats:\n" ); @@ -3934,6 +3984,7 @@ static void printSupportedAudioConfigs( void ) { fprintf( stdout, "%s\n", supportedFormats[i] ); } + fprintf( stdout, "\n" ); return; } -- GitLab From 434325618a140a9cb223199a3f63e6bfd09f484a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 11 Jun 2025 14:15:33 +0200 Subject: [PATCH 0863/1310] Add main to scripts repo to be able to retrieve new format HRTFs --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa08ae0f8..bbebd523e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -272,6 +272,7 @@ stages: - cd $SCRIPTS_DIR - sed -i '/fetch/d' .git/config # Remove all fetch lines to clean out dead links - git remote set-branches --add origin $BASOP_CI_BRANCH_PC_REPO # Add currently used branch + - git remote set-branches --add origin main # Add main to be able to load new format HRTFs - git fetch - git restore . # Just as a precaution - git checkout $BASOP_CI_BRANCH_PC_REPO -- GitLab From d1c76ac6a5ca1dea0910e55ca91010800fe789c0 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:36:02 +0200 Subject: [PATCH 0864/1310] Memeory allocation and fixed point scaling bug fixes for reverb parameters in ivas_reverb_fx.c --- lib_rend/ivas_reverb_fx.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 74c2a0c0a..c5c74ad9f 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1558,10 +1558,28 @@ ivas_error ivas_reverb_open_fx( test(); #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES + /* set up reverb acoustic data on the basis of HRTF data and renderer config */ + Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 2 ); + Word16 *pRt60_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter ); + Word16 *pDsr_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter ); + + params.pRt60_e = pRt60_e; + params.pDsr_e = pDsr_e; + set_reverb_acoustic_data_fx( ¶ms, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter ); + Scale_sig32( params.pFc_fx, nr_fc_fft_filter, -2 ); + FOR( i = 0; i < nr_fc_fft_filter; i++ ) + { + params.pRt60_fx[i] = L_abs( params.pRt60_fx[i] ); + move32(); + params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] ); + move32(); + } + params.pHrtf_avg_pwr_response_l_const_fx = hHrtfStatistics->average_energy_l; params.pHrtf_avg_pwr_response_r_const_fx = hHrtfStatistics->average_energy_r; params.pHrtf_inter_aural_coherence_const_fx = hHrtfStatistics->inter_aural_coherence; + #else IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) { -- GitLab From 0943b9bd324d47a6e189a655f6921c5a29e83b98 Mon Sep 17 00:00:00 2001 From: Adriana Vasilache Date: Thu, 12 Jun 2025 09:31:39 +0300 Subject: [PATCH 0865/1310] fix comment --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0cd498a89..cf71f5da6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -137,7 +137,7 @@ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ -/* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin */ +/* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ /* #################### End BASOP porting switches ############################ */ -- GitLab From 5ef310e6bd42d9ee925174f08ac1c90d500ba2f7 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 12 Jun 2025 08:37:35 +0200 Subject: [PATCH 0866/1310] Update IVAS_CODEC_CI_REF to get HRTF model file restoration update --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index df6069de2..59d11a2e9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 44cb5638949b874ce0f5c3bf4359f9db860d88bc + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 41186736915f5c0a857ac92e8ab438c434e5247d include: - local: .gitlab-ci/variables.yml -- GitLab From 5aa131a4aa7408549efd2bc90a05962faa9c0e15 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 12 Jun 2025 08:54:19 +0200 Subject: [PATCH 0867/1310] Fix for HRTF file loading in CI --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d630d11ba..e35d0e290 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -273,6 +273,7 @@ stages: - sed -i '/fetch/d' .git/config # Remove all fetch lines to clean out dead links - git remote set-branches --add origin $BASOP_CI_BRANCH_PC_REPO # Add currently used branch - git fetch + - git restore --staged . # Needed if HRTF model files were updated. - git restore . # Just as a precaution - git checkout $BASOP_CI_BRANCH_PC_REPO - git pull origin $BASOP_CI_BRANCH_PC_REPO -- GitLab From cde20f9aded676ccd13799996d59e125c3dfe1d4 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 12 Jun 2025 10:59:38 +0200 Subject: [PATCH 0868/1310] Fix wrong s_min which should be s_max for cldfb band range of upper bands. Corrects wrong scaling of reference_power_fx and reference_power_smooth_fx vectors. --- lib_rend/ivas_dirac_rend_fx.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 99a84bf52..6bbdd8a43 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4295,14 +4295,14 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -4371,14 +4371,14 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q } DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { - Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -4445,14 +4445,14 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { - Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -4774,7 +4774,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( move16(); FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); move16(); @@ -4787,7 +4787,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( move16(); FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); move16(); @@ -4823,11 +4823,11 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) FOR( i = 0; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { Scale_sig32( DirAC_mem.reference_power_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), DirAC_mem.reference_power_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) - Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) } hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ); move16(); @@ -4893,14 +4893,14 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } -- GitLab From 8b00348b339aa0f62577b9129991e33506a7c97f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 12 Jun 2025 14:19:51 +0530 Subject: [PATCH 0869/1310] Fix for 3GPP issue 1742: High audio distortion in external rendering OMASA to MASA Link #1742 --- lib_rend/ivas_omasa_ana_fx.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index d82346d34..84f1ff3dc 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -451,8 +451,8 @@ static void ivas_omasa_param_est_ana_fx( inp_q = data_f_q; cldfbAnalysis_ts_fx_var_q( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &inp_q ); - cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); - ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + cr_q = s_min( cr_q, L_norm_arr( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + ci_q = s_min( ci_q, L_norm_arr( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); } sf = sub( s_min( cr_q, ci_q ), 4 ); FOR( i = 0; i < nchan_ism; i++ ) @@ -697,25 +697,25 @@ static void ivas_omasa_dmx_fx( data_out_f_fx[j][k] = BASOP_Util_Add_Mant32Exp( data_out_f_fx[j][k], data_e[j], L_tmp, scale, &in_e[k] ); move32(); } - } - max_e = in_e[0]; - move16(); - FOR( l = 1; l < L_FRAME48k; l++ ) - { - IF( LT_16( max_e, in_e[l] ) ) + max_e = in_e[0]; + move16(); + FOR( l = 1; l < L_FRAME48k; l++ ) { - max_e = in_e[l]; - move16(); + IF( LT_16( max_e, in_e[l] ) ) + { + max_e = in_e[l]; + move16(); + } } - } - FOR( l = 0; l < L_FRAME48k; l++ ) - { - data_out_f_fx[j][l] = L_shr( data_out_f_fx[j][l], sub( max_e, in_e[l] ) ); // exponent: max_e, Q: ( 15 - max_e ) - move32(); + FOR( l = 0; l < L_FRAME48k; l++ ) + { + data_out_f_fx[j][l] = L_shr( data_out_f_fx[j][l], sub( max_e, in_e[l] ) ); // exponent: max_e, Q: ( 15 - max_e ) + move32(); + } + data_e[j] = max_e; + move16(); } - data_e[j] = max_e; - move16(); prev_gains_fx[i][j] = L_deposit_h( gains_fx[j] ); // Q31 move32(); -- GitLab From 30acb8787ed053fdb43503b773896b91ee343f74 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 12 Jun 2025 15:18:30 +0530 Subject: [PATCH 0870/1310] Fix for 3GPP issue 950: High MLD for ParamMC 5.1 at 48/64/80kbps or 7.1+4 at 128kbps Link #950, #1023, #1024 --- lib_dec/ivas_jbm_dec_fx.c | 7 +++++++ lib_dec/ivas_mc_param_dec_fx.c | 13 ++++++++----- lib_dec/ivas_stat_dec.h | 2 +- lib_rend/ivas_dirac_decorr_dec_fx.c | 6 ++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 3f67962dc..6b5023a70 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -4032,6 +4032,13 @@ void ivas_jbm_dec_copy_tc_no_tsm_fx( &cldfb_real_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], &cldfb_imag_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch], &Q_tc ); + IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) MC_FORMAT ) ) + { + st_ivas->hParamMC->Cldfb_RealBuffer_tc_e = sub( 31, Q_tc ); + st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = sub( 31, Q_tc ); + move16(); + move16(); + } } } } diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index 0e2de6c01..f1bbec638 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -106,7 +106,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( const Word32 *proto_mtx, cons static void param_mc_update_mixing_matrices_fx( PARAM_MC_DEC_HANDLE hParamMC, Word32 *mixing_matrix[], Word16 *mixing_matrix_fx, Word32 *mixing_matrix_res[], Word16 *mixing_matrix_res_exp, const UWord16 nX, const UWord16 nY ); -static void param_mc_protoSignalComputation_fx( Word32 *RealBuffer_fx, Word32 *ImagBuffer_fx, Word32 *proto_frame_f_fx, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const Word16 num_freq_bands /*, Word16 RealBuffer_fx_e, Word16 ImagBuffer_fx_e, Word16 *common_e*/ ); +static void param_mc_protoSignalComputation_fx( Word32 *RealBuffer_fx, Word32 *ImagBuffer_fx, Word32 *proto_frame_f_fx, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const Word16 num_freq_bands, Word16 Cldfb_Real_Imag_exp, Word16 *proto_frame_f_fx_q /* Word16 ImagBuffer_fx_e, Word16 *common_e*/ ); /*------------------------------------------------------------------------- * ivas_param_mc_dec_open() @@ -1983,7 +1983,7 @@ void ivas_param_mc_dec_render_fx( param_mc_protoSignalComputation_fx( &hParamMC->Cldfb_RealBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], &hParamMC->Cldfb_ImagBuffer_tc_fx[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], hParamMC->proto_frame_f_fx, hParamMC->diff_proto_info, - hParamMC->num_freq_bands ); + hParamMC->num_freq_bands, hParamMC->Cldfb_RealBuffer_tc_e, &hParamMC->proto_frame_f_fx_q ); /*-----------------------------------------------------------------* * frequency domain decorrelation *-----------------------------------------------------------------*/ @@ -1995,7 +1995,7 @@ void ivas_param_mc_dec_render_fx( DIRAC_SYNTHESIS_COV_MC_LS, nchan_transport, hParamMC->proto_frame_f_fx, - Q5, + hParamMC->proto_frame_f_fx_q, hParamMC->diff_proto_info->num_protos_diff, hParamMC->diff_proto_info->proto_index_diff, hParamMC->proto_frame_dec_f_fx, // output @@ -2321,8 +2321,9 @@ static void param_mc_protoSignalComputation_fx( Word32 *ImagBuffer_fx, /* i : CLDFB samples of the transport channels (imaginary part) */ Word32 *proto_frame_f_fx, /* o : interleaved complex prototype CLDFB samples */ const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ - const Word16 num_freq_bands /* i : number of frequency bands for the prototypes */ -) + const Word16 num_freq_bands, /* i : number of frequency bands for the prototypes */ + const Word16 Cldfb_Real_Imag_exp, /*i: Exponent of real and imag buffers */ + Word16 *proto_frame_f_fx_q ) { Word16 band; Word16 proto_ch_idx, source_ch_cnt; @@ -2367,6 +2368,8 @@ static void param_mc_protoSignalComputation_fx( move32(); p_proto_frame_fx++; } + *proto_frame_f_fx_q = sub( 30, Cldfb_Real_Imag_exp ); + move16(); } } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 891be05be..4eb40f337 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -573,7 +573,7 @@ typedef struct ivas_param_mc_dec_data_structure Word32 *proto_matrix_int_fx; Word16 proto_matrix_int_len; Word16 proto_matrix_int_e; - + Word16 proto_frame_f_fx_q; /*sub-modules*/ HANDLE_DIRAC_DECORR_PARAMS h_freq_domain_decorr_ap_params; HANDLE_DIRAC_DECORR_STATE h_freq_domain_decorr_ap_state; diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index 9b2bf02d7..aa4aed84c 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -482,6 +482,7 @@ void ivas_dirac_dec_decorr_process_fx( q_shift = 0; move16(); } + set32_fx( aux_buffer_fx, 0, 2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX ); FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { v_shr( &input_frame_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], negate( q_shift ), &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], imult1616( 2, num_freq_bands ) ); // Q - q_shift @@ -496,6 +497,11 @@ void ivas_dirac_dec_decorr_process_fx( { v_add_inc_fx( &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) )], 2, &aux_buffer_fx[add( imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) ), 1 )], 2, &aux_buffer_fx[imult1616( ch_idx, max_band_decorr_temp )], 1, max_band_decorr_temp ); // q_aux_buffer } + if ( is_zero_arr( aux_buffer_fx, 2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX ) ) + { + q_aux_buffer = 31; + move16(); + } /* compute onset filter */ max_band_decorr = h_freq_domain_decorr_ap_params->max_band_decorr; move16(); -- GitLab From a1a5235b6e35314ad21b6d9cbce4370e60b56e26 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 12 Jun 2025 17:28:11 +0530 Subject: [PATCH 0871/1310] Clang formatting changes --- lib_dec/ivas_mc_param_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index f1bbec638..b6868dbb1 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -2322,7 +2322,7 @@ static void param_mc_protoSignalComputation_fx( Word32 *proto_frame_f_fx, /* o : interleaved complex prototype CLDFB samples */ const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ const Word16 num_freq_bands, /* i : number of frequency bands for the prototypes */ - const Word16 Cldfb_Real_Imag_exp, /*i: Exponent of real and imag buffers */ + const Word16 Cldfb_Real_Imag_exp, /*i: Exponent of real and imag buffers */ Word16 *proto_frame_f_fx_q ) { Word16 band; -- GitLab From bd7113d89e33139ee17325e8717ece7d22a101a3 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 12 Jun 2025 14:44:48 +0200 Subject: [PATCH 0872/1310] port float MR 1413 --- lib_com/ivas_prot_fx.h | 3 +++ lib_com/options.h | 1 + lib_dec/ivas_jbm_dec_fx.c | 4 ++++ lib_dec/ivas_mono_dmx_renderer_fx.c | 8 ++++++++ 4 files changed, 16 insertions(+) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index b1a03bd2e..3ca3c90c8 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1155,6 +1155,9 @@ void ivas_mono_stereo_downmix_mcmasa_fx( ); void ivas_apply_non_diegetic_panning_fx( +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + float *input_f, /* i : non-diegetic object */ +#endif Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain */ const Word16 output_frame /* i : output frame length per channel */ diff --git a/lib_com/options.h b/lib_com/options.h index 51319adce..27a2da35a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -140,6 +140,7 @@ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ +#define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index beb6535a2..80749ed4a 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1992,7 +1992,11 @@ ivas_error ivas_jbm_dec_render_fx( } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + ivas_apply_non_diegetic_panning_fx(p_tc_fx[0], st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); +#else ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); +#endif } #ifdef DEBUGGING ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 66b14cc56..48cad29f8 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -318,6 +318,9 @@ void ivas_mono_stereo_downmix_mcmasa_fx( *------------------------------------------------------------------------*/ void ivas_apply_non_diegetic_panning_fx( +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + float *input_f, /* i : non-diegetic object */ +#endif Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain Q15*/ const Word16 output_frame /* i : output frame length per channel Q11*/ @@ -328,8 +331,13 @@ void ivas_apply_non_diegetic_panning_fx( pan_left_fx = add( mult( non_diegetic_pan_gain_fx, 16384 ), 16384 ); // 0.5.Q15 = 16384 pan_right_fx = sub( 32767, pan_left_fx ); +#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING + v_multc_fixed( input_f, L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); + v_multc_fixed( input_f, L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); +#else v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); +#endif return; } -- GitLab From 9034d45d6ddeec3b11c4ff7efb5a1abd5e6439ee Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 12 Jun 2025 14:54:32 +0200 Subject: [PATCH 0873/1310] fix formatting --- lib_dec/ivas_jbm_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 80749ed4a..1e5daaf5d 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1993,7 +1993,7 @@ ivas_error ivas_jbm_dec_render_fx( ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - ivas_apply_non_diegetic_panning_fx(p_tc_fx[0], st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); + ivas_apply_non_diegetic_panning_fx( p_tc_fx[0], st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); #else ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); #endif -- GitLab From 67a8805b82ba76a3c3ffa2e05deb158f50dfd89d Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 12 Jun 2025 14:59:04 +0200 Subject: [PATCH 0874/1310] fix compile error --- lib_dec/ivas_jbm_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 1e5daaf5d..64896a1ff 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1993,7 +1993,7 @@ ivas_error ivas_jbm_dec_render_fx( ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - ivas_apply_non_diegetic_panning_fx( p_tc_fx[0], st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); + ivas_apply_non_diegetic_panning_fx( p_tc_fx[0], p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); #else ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); #endif -- GitLab From 16da4e2186c55aea3ce9c2e800ad391101ac8862 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 12 Jun 2025 15:18:24 +0200 Subject: [PATCH 0875/1310] Set HRTF model file version to 78154d0b (Feb 2024) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ecbee063d..d03cba388 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -280,7 +280,7 @@ stages: - git pull origin $BASOP_CI_BRANCH_PC_REPO # Restore new format of HRTF binary - git fetch origin main - - git checkout origin/main -- scripts/binauralRenderer_interface/binaural_renderers_hrtf_data + - git checkout 78154d0b3f1b2c6c8ff8a234f3f7cf865d467d35 -- scripts/binauralRenderer_interface/binaural_renderers_hrtf_data - cd - - cp -r $SCRIPTS_DIR/ci . - cp -r $SCRIPTS_DIR/scripts . -- GitLab From 90ebdced188553f03c754d75a7225b98786acc0d Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 12 Jun 2025 15:36:08 +0200 Subject: [PATCH 0876/1310] fix formatting --- lib_dec/ivas_jbm_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 64896a1ff..57063e7b7 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1993,7 +1993,7 @@ ivas_error ivas_jbm_dec_render_fx( ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - ivas_apply_non_diegetic_panning_fx( p_tc_fx[0], p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); + ivas_apply_non_diegetic_panning_fx( p_tc_fx[0], p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); #else ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); #endif -- GitLab From 59693e942b661393647b79abcdd9f741e35856c9 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 12 Jun 2025 16:00:24 +0200 Subject: [PATCH 0877/1310] fix variable types --- lib_com/ivas_prot_fx.h | 2 +- lib_dec/ivas_mono_dmx_renderer_fx.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 3ca3c90c8..d989a1f68 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1156,7 +1156,7 @@ void ivas_mono_stereo_downmix_mcmasa_fx( void ivas_apply_non_diegetic_panning_fx( #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - float *input_f, /* i : non-diegetic object */ + Word32 *input_f_fx, /* i : non-diegetic object */ #endif Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain */ diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 48cad29f8..7029f8b8d 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -319,7 +319,7 @@ void ivas_mono_stereo_downmix_mcmasa_fx( void ivas_apply_non_diegetic_panning_fx( #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - float *input_f, /* i : non-diegetic object */ + Word32 *input_f_fx, /* i : non-diegetic object */ #endif Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain Q15*/ @@ -332,8 +332,8 @@ void ivas_apply_non_diegetic_panning_fx( pan_right_fx = sub( 32767, pan_left_fx ); #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - v_multc_fixed( input_f, L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); - v_multc_fixed( input_f, L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); + v_multc_fixed( input_f_fx, L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); + v_multc_fixed( input_f_fx, L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); #else v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); -- GitLab From 8cfb2caf8f303f22c4c28f5e2f37907df4db149b Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 12 Jun 2025 17:23:46 +0200 Subject: [PATCH 0878/1310] Encapsulate changes under FIX_1737_FIX_867_CLDFB_NRG_SCALE. Fix additional scaling issues found. Use L_norm_arr instead of getScaleFactor32 for CLDFB normalization because getScaleFactor32 returns 0 for zero signal causing scale values out of range which lead to a crash. --- lib_com/options.h | 1 + lib_rend/ivas_dirac_rend_fx.c | 68 +++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9dc7e7fd1..c5961b2a7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -69,6 +69,7 @@ #endif #define FIX_867_CLDFB_NRG_SCALE +#define FIX_1737_FIX_867_CLDFB_NRG_SCALE #define FIX_1378_ACELP_OUT_OF_BOUNDS diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 6bbdd8a43..1aa0fc587 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -986,7 +986,12 @@ ivas_error ivas_dirac_alloc_mem_fx( } hDirAC_mem->reference_power_len = imult1616( 5, num_freq_bands ); +#ifdef FIX_867_CLDFB_NRG_SCALE set16_fx( hDirAC_mem->reference_power_q, Q31, 2 ); +#else + hDirAC_mem->reference_power_q = Q31; + move16(); +#endif } IF( hDirACRend->proto_signal_decorr_on ) @@ -4295,14 +4300,22 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#else + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#endif } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#else + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -4371,14 +4384,26 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#else + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#endif } +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE + DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; +#else DirAC_mem.reference_power_smooth_q[0] = DirAC_mem.reference_power_q[1]; +#endif move16(); } ELSE { - Scale_sig32( reference_power_fix, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#else + Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -4445,14 +4470,22 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#else + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#endif } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { - Scale_sig32( reference_power_fix, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#else + Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -4774,7 +4807,11 @@ static void ivas_masa_ext_dirac_render_sf_fx( move16(); FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) +#else + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) +#endif } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); move16(); @@ -4787,7 +4824,11 @@ static void ivas_masa_ext_dirac_render_sf_fx( move16(); FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) +#else + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) +#endif } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); move16(); @@ -4823,11 +4864,19 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) +#else + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) +#endif FOR( i = 0; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { Scale_sig32( DirAC_mem.reference_power_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), DirAC_mem.reference_power_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) +#else + Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) +#endif } hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ); move16(); @@ -4893,14 +4942,22 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( i = hSpatParamRendCom->num_freq_bands; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#else + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q +#endif } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; move16(); } ELSE { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#else + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q +#endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); } @@ -4940,10 +4997,17 @@ static void ivas_masa_ext_dirac_render_sf_fx( { FOR( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[subframe_idx]; slot_idx++ ) { +#ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE + scale_factor = s_min( scale_factor, L_norm_arr( Cldfb_RealBuffer_fx[ch][slot_idx], + hSpatParamRendCom->num_freq_bands ) ); + scale_factor = s_min( scale_factor, L_norm_arr( Cldfb_ImagBuffer_fx[ch][slot_idx], + hSpatParamRendCom->num_freq_bands ) ); +#else scale_factor = s_min( scale_factor, getScaleFactor32( Cldfb_RealBuffer_fx[ch][slot_idx], hSpatParamRendCom->num_freq_bands ) ); scale_factor = s_min( scale_factor, getScaleFactor32( Cldfb_ImagBuffer_fx[ch][slot_idx], hSpatParamRendCom->num_freq_bands ) ); +#endif } } scale_factor = sub( scale_factor, find_guarded_bits_fx( hSpatParamRendCom->num_freq_bands ) ); // guard bits -- GitLab From 6086a910d7ef8950b5950ffd6f043f61f20f2f21 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Thu, 12 Jun 2025 17:26:35 +0200 Subject: [PATCH 0879/1310] clang format --- lib_rend/ivas_dirac_rend_fx.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 1aa0fc587..2aa9eb605 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4303,7 +4303,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #else - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #endif } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; @@ -4314,7 +4314,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #else - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); @@ -4402,7 +4402,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #else - Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); @@ -4473,7 +4473,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #else - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #endif } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; @@ -4484,7 +4484,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #else - Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); @@ -4810,7 +4810,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) #else - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) #endif } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); @@ -4863,19 +4863,19 @@ static void ivas_masa_ext_dirac_render_sf_fx( /*Buffer rescaling*/ #ifdef FIX_867_CLDFB_NRG_SCALE - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) #else - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) #endif FOR( i = 0; DirAC_mem.reference_power_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) { - Scale_sig32( DirAC_mem.reference_power_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), DirAC_mem.reference_power_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( DirAC_mem.reference_power_fx + i, s_min( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ), DirAC_mem.reference_power_q[0] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) #else - Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) + Scale_sig32( DirAC_mem.reference_power_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[1], DirAC_mem.reference_power_q[1] ), DirAC_mem.reference_power_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q, DirAC_mem.reference_power_q ) #endif } hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.reference_power_smooth_prev_q[0], DirAC_mem.reference_power_q[0] ); @@ -4945,7 +4945,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #else - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #endif } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; @@ -4956,7 +4956,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #else - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); -- GitLab From d5bf98b49cae75aa0356d6088c3367a19753b3b2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 12 Jun 2025 14:23:20 +0530 Subject: [PATCH 0880/1310] Fix for 3GPP issue 1512: Decoder 160 kbit/s 7.1+4: Binaural Rendering introduces bigger differences Link #1512 --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 883024002..b9084df88 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -5137,7 +5137,7 @@ void decoder_tcx_imdct_fx( } } - ITF_Detect_fx( x_fx + IGF_START_MN, startLine, endLine, 8 /*maxOrder*/, A_itf_fx, &q_a_itf, &predictionGain_fx, &curr_order, shl( x_e, 1 ) ); + ITF_Detect_ivas_fx( x_fx + IGF_START_MN, startLine, endLine, 8 /*maxOrder*/, A_itf_fx, &q_a_itf, &predictionGain_fx, &curr_order, q_x ); ITF_Apply_fx( x_fx, startLine, endLine, A_itf_fx, q_a_itf, curr_order ); -- GitLab From e281e4add6092352c2203716c80bf1a2900f8bef Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 13 Jun 2025 08:58:06 +0200 Subject: [PATCH 0881/1310] fix comments in ivas_mono_dmx_renderer_fx.c --- lib_dec/ivas_mono_dmx_renderer_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 7029f8b8d..1ee8676e2 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -319,9 +319,9 @@ void ivas_mono_stereo_downmix_mcmasa_fx( void ivas_apply_non_diegetic_panning_fx( #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - Word32 *input_f_fx, /* i : non-diegetic object */ + Word32 *input_f_fx, /* i : non-diegetic object */ #endif - Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ + Word32 *output_f_fx[], /* o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain Q15*/ const Word16 output_frame /* i : output frame length per channel Q11*/ ) -- GitLab From 3921fa88ab7dda258e924c1c48263355eb14daed Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 13 Jun 2025 09:09:52 +0200 Subject: [PATCH 0882/1310] fix formatting --- lib_dec/ivas_mono_dmx_renderer_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 1ee8676e2..4f04c4dd8 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -319,7 +319,7 @@ void ivas_mono_stereo_downmix_mcmasa_fx( void ivas_apply_non_diegetic_panning_fx( #ifdef FIX_1009_ISM_NONDIEGETIC_PANNING - Word32 *input_f_fx, /* i : non-diegetic object */ + Word32 *input_f_fx, /* i : non-diegetic object */ #endif Word32 *output_f_fx[], /* o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain Q15*/ -- GitLab From 1876a8248085ce22bd7391de4d679cda9d567534 Mon Sep 17 00:00:00 2001 From: Thomas Dettbarn Date: Fri, 13 Jun 2025 09:42:59 +0200 Subject: [PATCH 0883/1310] in ivas_mc_param_enc_fx.c: initialize the proper arrays. In ivas_dirac_output_synthesis_cov_fx.c: remove the define which was supposed to be set in options.h --- lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 1 - lib_enc/ivas_mc_param_enc_fx.c | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index caddb5c5c..378e4f435 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -30,7 +30,6 @@ *******************************************************************************************************/ -#define MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE #include #include diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 7f74f78f9..ac836b674 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -729,8 +729,8 @@ static void ivas_param_mc_param_est_enc_fx( #ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE set64_fx( Cy_sum_imag_64[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); #else - set32_fx( Cy_sum_fx[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); - set16_fx( Cy_sum_e[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); + set32_fx( Cy_sum_imag_fx[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); + set16_fx( Cy_sum_imag_e[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); #endif } -- GitLab From e441a50059df28bd8452386c75a1ccd18d3f0911 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 10:18:08 +0200 Subject: [PATCH 0884/1310] [fix] apply same fix under DISABLE_LIMITER --- lib_dec/ivas_jbm_dec_fx.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index e6f94c889..f2a7f6549 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2991,9 +2991,15 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( #ifndef DISABLE_LIMITER Word16 ch_idx, exp = 11; move16(); +#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER + FOR( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) + { + p_output_fx[ch_idx] = st_ivas->p_output_fx[ch_idx]; +#else FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) { p_output_fx[ch_idx] = output_fx[ch_idx]; +#endif } ivas_limiter_dec_fx( st_ivas->hLimiter, p_output_fx, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect, exp ); #endif -- GitLab From 9a4a10bade86fc7cf6a8bdb9ce8e71766b558378 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 13 Jun 2025 14:32:22 +0530 Subject: [PATCH 0885/1310] Fix for 3GPP issue 1593: Somewhat high MLD in BASOP decoder for McMASA with rate switching and FER Link #1593 --- lib_com/pred_lt4_fx.c | 57 ++++++++++++++++++++++++++++++ lib_com/prot_fx.h | 10 ++++++ lib_com/rom_com.c | 12 +++++++ lib_com/rom_com.h | 3 +- lib_dec/LD_music_post_filter_fx.c | 9 ++++- lib_dec/acelp_core_switch_dec_fx.c | 21 ++++++++--- lib_dec/dec_gen_voic_fx.c | 10 ++++-- lib_dec/dec_pit_exc_fx.c | 10 ++++-- lib_dec/ivas_td_low_rate_dec_fx.c | 10 ++++-- lib_dec/transition_dec_fx.c | 54 ++++++++++++++++++++++++---- 10 files changed, 177 insertions(+), 19 deletions(-) diff --git a/lib_com/pred_lt4_fx.c b/lib_com/pred_lt4_fx.c index 4f8dd8712..465138bde 100644 --- a/lib_com/pred_lt4_fx.c +++ b/lib_com/pred_lt4_fx.c @@ -20,6 +20,63 @@ * (adaptive codebook excitation) * *-------------------------------------------------------------------*/ +void pred_lt4_ivas_fx( + const Word16 excI[], /* in : excitation buffer Q_exc*/ + Word16 excO[], /* out: excitation buffer Q_exc*/ + const Word16 T0, /* input : integer pitch lag Q0*/ + Word16 frac, /* input : fraction of lag Q0*/ + const Word16 L_subfr, /* input : subframe size Q0*/ + const Word32 *win, /* i : interpolation window Q31*/ + const Word16 nb_coef, /* i : nb of filter coef Q0*/ + const Word16 up_sample /* i : up_sample Q0*/ +) +{ + Word16 i, j; + Word32 s; + const Word16 *x0, *x1, *x2; + const Word32 *c1, *c2; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + x0 = &excI[-T0]; + + frac = negate( frac ); + + IF( frac < 0 ) + { + frac = add( frac, up_sample ); /* Q0 */ + x0--; + } + + FOR( j = 0; j < L_subfr; j++ ) + { + x1 = x0++; /* Q_exc */ + x2 = x1 + 1; /* Q_exc */ + c1 = ( &win[frac] ); /* Q14 */ + c2 = ( &win[up_sample - frac] ); /* Q14 */ + + { + Word64 s64 = 0; + move64(); + FOR( i = 0; i < nb_coef; i++ ) + { + /*s += (*x1--) * (*c1) + (*x2++) * (*c2);*/ + s64 = W_mac_32_32( s64, L_deposit_l( *x1-- ), ( *c1 ) ); /* Q_exc + Q32 */ + s64 = W_mac_32_32( s64, L_deposit_l( *x2++ ), ( *c2 ) ); /* Q_exc + Q32 */ + + c1 += up_sample; + c2 += up_sample; + } + s = W_sat_l( W_shr( s64, 16 ) ); /* Q_exc + Q16 */ + } + + excO[j] = round_fx_o( s, &Overflow ); /* Q_exc */ + move16(); + } + return; +} + void pred_lt4( const Word16 excI[], /* in : excitation buffer Q_exc*/ Word16 excO[], /* out: excitation buffer Q_exc*/ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index ec2aec450..d533c5612 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -7183,6 +7183,16 @@ void pred_lt4( const Word16 up_sample /* i : up_sample Q0*/ ); +void pred_lt4_ivas_fx( + const Word16 excI[], /* in : excitation buffer Q_exc*/ + Word16 excO[], /* out: excitation buffer Q_exc*/ + const Word16 T0, /* input : integer pitch lag Q0*/ + Word16 frac, /* input : fraction of lag Q0*/ + const Word16 L_subfr, /* input : subframe size Q0*/ + const Word32 *win, /* i : interpolation window Q31*/ + const Word16 nb_coef, /* i : nb of filter coef Q0*/ + const Word16 up_sample /* i : up_sample Q0*/ +); void pred_lt4_tc_fx( Word16 exc[], /* i/o: excitation buffer Q0*/ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 9eaf690f1..5d0a7f303 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -1332,6 +1332,18 @@ const Word16 inter4_2_fx[] = }; /* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) */ +const Word32 L_pitch_inter4_2[PIT_FIR_SIZE2] = { /* Q31 */ + 2018634624, 1839083520, 1357785216, 724904576, 126856152, -281447072, + -428193216, -340524320, -121030032, 102233104, 229241728, 222704784, + 111802296, -32603096, -136805440, -158183648, -99851544, -2110976, + 82091856, 114123720, 86026048, 19988778, -46544560, -81104016, + -71266392, -27977416, 22982370, 55621972, 56517476, 29680372, + -7827578, -36105644, -42638288, -27414776, -1138166, 21646636, + 30326764, 22885734, 5570572, -11516955, -20066088, -17396766, + -6833293, 5003637, 12101070, 11944304, 6107443, -1346472, -6427418, + -7219840, -4389456, -249108, 2823941, 3633542, 2471753, 556198, + -895500, -1327144, -932007, -285615, 135291, 210453, 103079, 15032, 0 +}; const Word16 pitch_inter4_2[PIT_FIR_SIZE2] = { /* cut-off frequency at 0.94*fs/2 */ diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index 73156b989..a87ee8d0d 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -175,7 +175,8 @@ extern const Word16 fft256_read_indexes[]; /* FFT Q0*/ extern const Word16 inter4_2_fx_Q15[]; // Q15 /* 1/4 resolution interpolation filter */ extern const Word16 inter4_2_fx[]; extern const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1]; /*1Q14*/ -extern const Word16 pitch_inter4_2[PIT_FIR_SIZE2]; /*1Q14*/ +extern const Word16 pitch_inter4_2[PIT_FIR_SIZE2]; /*Q15*/ +extern const Word32 L_pitch_inter4_2[PIT_FIR_SIZE2]; /*Q31*/ extern const Word16 Assym_window_W16fx[]; // Q15 extern const Word16 assym_window_16k_fx[]; // Q15 extern const Word16 grid50_fx[( GRID50_POINTS - 1 ) / 2 - 1]; // Q15 diff --git a/lib_dec/LD_music_post_filter_fx.c b/lib_dec/LD_music_post_filter_fx.c index 5b48ab472..12a13a4ec 100644 --- a/lib_dec/LD_music_post_filter_fx.c +++ b/lib_dec/LD_music_post_filter_fx.c @@ -832,7 +832,14 @@ void Prep_music_postP_fx( * Extrapolation of the last future part and windowing *------------------------------------------------------------*/ pt1 = exc_buffer_in + DCT_L_POST - OFFSET2; /*Q_exc*/ - pred_lt4( pt1, pt1, s_pit, fr_pit, OFFSET2, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( pt1, pt1, s_pit, fr_pit, OFFSET2, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( pt1, pt1, s_pit, fr_pit, OFFSET2, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*------------------------------------------------------------* * windowing right side *------------------------------------------------------------*/ diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index 363db8202..b12682385 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -921,9 +921,14 @@ static void decod_gen_voic_core_switch_fx( /*--------------------------------------------------------------* * Find the adaptive codebook vector. *--------------------------------------------------------------*/ - - pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); - + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*--------------------------------------------------------------* * LP filtering of the adaptive excitation *--------------------------------------------------------------*/ @@ -991,8 +996,14 @@ static void decod_gen_voic_core_switch_fx( /*-----------------------------------------------------------------* * long term prediction on the 2nd sub frame *-----------------------------------------------------------------*/ - - pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } pt1 = exc + L_SUBFR; FOR( i = 0; i < L_SUBFR; i++ ) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index b9f488942..14d9d1772 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -166,8 +166,14 @@ ivas_error decod_gen_voic_fx( /*--------------------------------------------------------------* * Find the adaptive codebook vector *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } // tbe_celp_exc(L_frame, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx); tbe_celp_exc_ivas( st_fx->element_mode, st_fx->idchan, L_frame, L_SUBFR, i_subfr_fx, T0_fx, T0_frac_fx, &error_fx, bwe_exc_fx, st_fx->tdm_LRTD_flag ); diff --git a/lib_dec/dec_pit_exc_fx.c b/lib_dec/dec_pit_exc_fx.c index a18029cdc..ca6660fab 100644 --- a/lib_dec/dec_pit_exc_fx.c +++ b/lib_dec/dec_pit_exc_fx.c @@ -182,8 +182,14 @@ void dec_pit_exc_fx( /*--------------------------------------------------------------* * Find the adaptive codebook vector. *--------------------------------------------------------------*/ - - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_subfr_fx + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*--------------------------------------------------------------* * Innovation decoding diff --git a/lib_dec/ivas_td_low_rate_dec_fx.c b/lib_dec/ivas_td_low_rate_dec_fx.c index f48d3fabc..fb984f11f 100644 --- a/lib_dec/ivas_td_low_rate_dec_fx.c +++ b/lib_dec/ivas_td_low_rate_dec_fx.c @@ -278,8 +278,14 @@ void decod_gen_2sbfr_fx( /*--------------------------------------------------------------* * Find the adaptive codebook vector *--------------------------------------------------------------*/ - - pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, inter4_2_fx_Q15, L_INTERPOL2, PIT_UP_SAMP ); + IF( st->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } /*--------------------------------------------------------------* * LP filtering of the adaptive excitation diff --git a/lib_dec/transition_dec_fx.c b/lib_dec/transition_dec_fx.c index b9ad17fcf..102a81b9d 100644 --- a/lib_dec/transition_dec_fx.c +++ b/lib_dec/transition_dec_fx.c @@ -209,7 +209,14 @@ void transition_dec_fx( limit_T0_fx( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max */ /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); @@ -239,7 +246,14 @@ void transition_dec_fx( limit_T0_fx( L_FRAME, 8, pit_flag, limit_flag, *T0, 0, T0_min, T0_max ); /* find T0_min and T0_max */ /* Find the adaptive codebook vector. ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -308,7 +322,14 @@ void transition_dec_fx( } /* Find the adaptive codebook vector. ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -330,7 +351,14 @@ void transition_dec_fx( delta_pit_dec_fx( 2, index, T0, T0_frac, *T0_min ); /* Find the adaptive codebook vector. ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -351,7 +379,14 @@ void transition_dec_fx( pit_Q_dec_fx( 0, index, nBits, 8, pit_flag, limit_flag, T0, T0_frac, T0_min, T0_max, &st_fx->BER_detect ); /* Find the adaptive codebook vector */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penality for 2 ptrs initialization */ @@ -544,7 +579,14 @@ void transition_dec_fx( ELSE { /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + IF( st_fx->element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + } offset = tbe_celp_exc_offset( *T0, *T0_frac, L_frame ); move16(); move16(); /* penalty for 2 ptrs initialization */ -- GitLab From 33291b4380479f59bd519e1bb696060a188aff2c Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:21 +0200 Subject: [PATCH 0886/1310] [cleanup] accept FIX_699_FILE_READER_JBM_TSM --- apps/encoder.c | 4 ---- lib_com/options.h | 1 - 2 files changed, 5 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index a7229dff5..8404747dc 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -681,11 +681,7 @@ int main( { if ( ( error = JbmFileReader_readCAconfig( jbmReader, &caConfig ) ) != IVAS_ERR_OK ) { -#ifdef FIX_699_FILE_READER_JBM_TSM fprintf( stderr, "\nError (%s) while reading Channel-Aware Config. from: %s\n\n", IVAS_ENC_GetErrorMessage( error ), JbmFileReader_getFilePath( jbmReader ) ); -#else - fprintf( stderr, "JbmFileReader_readCAconfig() failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); -#endif goto cleanup; } diff --git a/lib_com/options.h b/lib_com/options.h index a7c2f1b53..433b0692e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ -#define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ #define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ -- GitLab From 76a16c4560c001841017d908f26791f941f40531 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:24 +0200 Subject: [PATCH 0887/1310] [cleanup] accept FIX_997_REMOVE_SPAR_DEC_UPMIXER --- lib_com/options.h | 1 - lib_dec/ivas_spar_decoder_fx.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 433b0692e..4d5b8ca68 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ -#define FIX_997_REMOVE_SPAR_DEC_UPMIXER /* VA: issue 997: remove obsolete function ivas_spar_dec_upmixer() */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index b13c6ab7a..530614fe9 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -1534,20 +1534,12 @@ void ivas_spar_dec_set_render_map_fx( return; } -#ifdef FIX_997_REMOVE_SPAR_DEC_UPMIXER /*-------------------------------------------------------------------* * ivas_spar_dec_set_render_params() * * IVAS SPAR set rendering parameters *-------------------------------------------------------------------*/ -#else -/*-------------------------------------------------------------------* - * ivas_spar_dec_upmixer() - * - * IVAS SPAR upmixer - *-------------------------------------------------------------------*/ -#endif void ivas_spar_dec_set_render_params_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ -- GitLab From 9e2b26b22bb7a73f72a7b24d35c5777abe679d16 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:27 +0200 Subject: [PATCH 0888/1310] [cleanup] accept FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 19 ------------------- 2 files changed, 20 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4d5b8ca68..4f77453e2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,7 +127,6 @@ #endif //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -#define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index f2a7f6549..3abf7b2e7 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -175,25 +175,6 @@ ivas_error ivas_jbm_dec_tc_fx( { hp20_fx_32( p_output_fx[n], output_frame, st_ivas->mem_hp20_out_fx[n], output_Fs ); } -#ifndef FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO - - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_MC ) && EQ_16( st_ivas->hDecoderConfig->nchan_out, 1 ) ) - { - s = Q16 - Q11; - move16(); - s = sub( s, find_guarded_bits_fx( st_ivas->nchan_transport ) ); - FOR( i = 0; i < s_max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) - { - Scale_sig32( p_output_fx[i], output_frame, s ); // Q(11+s) - } - ivas_ls_setup_conversion_fx( st_ivas, st_ivas->nchan_transport, output_frame, p_output_fx, p_output_fx ); - FOR( i = 0; i < s_max( st_ivas->hDecoderConfig->nchan_out, st_ivas->nchan_transport ); ++i ) - { - Scale_sig32( p_output_fx[i], output_frame, negate( s ) ); // Q11 - } - } -#endif } ELSE IF( EQ_32( st_ivas->ivas_format, ISM_FORMAT ) ) { -- GitLab From b31d44e0fbc64b60b1dc47d8ec4793d2d01b41f6 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:30 +0200 Subject: [PATCH 0889/1310] [cleanup] accept FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN --- lib_com/options.h | 1 - lib_dec/ivas_ism_dec_fx.c | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4f77453e2..a8836818c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -130,7 +130,6 @@ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ -#define FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN /* FhG: fix for #1003: fix USAN caused by ParamISM reconfig */ #define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index ff4f45eca..16fab99ef 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -393,18 +393,6 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( tc_nchan_full_new = tc_nchan_tc_new; move16(); -#ifndef FIX_1003_PARAMISM_BINAURAL_RECONFIG_USAN - test(); - test(); - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) - { - tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; - move16(); - tc_nchan_full_new = tc_nchan_allocate_new; - move16(); - } - -#endif test(); test(); test(); -- GitLab From 45e2853b2ebc78466c383108142ed611aeae79ff Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:33 +0200 Subject: [PATCH 0890/1310] [cleanup] accept FIX_1001_ARI_HM_OVERFLOW --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index a8836818c..d98b08ca2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -130,7 +130,6 @@ #define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ -#define FIX_1001_ARI_HM_OVERFLOW /* FhG: (no changes needed in BASOP) fix for undef behaviour in in the harmonic TCX model arithmetic coder */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -- GitLab From 9c8d48ff5c12a424bf8b129fa208c59e8eb050e9 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:40 +0200 Subject: [PATCH 0891/1310] [cleanup] accept FIX_1008_EXTORIENT_TARGET_INTERPOLATION --- lib_com/options.h | 1 - lib_rend/ivas_rotation_fx.c | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index d98b08ca2..ea0be205a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -133,7 +133,6 @@ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -#define FIX_1008_EXTORIENT_TARGET_INTERPOLATION /* FhG: issue #1008, external orientation init was wrong for 5ms */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index 154dab321..36f363f83 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1379,20 +1379,8 @@ ivas_error ivas_combined_orientation_open( move32(); ( *hCombinedOrientationData )->interpolationIncrement_fx = ONE_IN_Q30; // Q30 move32(); -#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION - IF( EQ_16( num_subframes, 1 ) ) - { - ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 2000; - move16(); - } - ELSE - { -#endif ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; move16(); -#ifndef FIX_1008_EXTORIENT_TARGET_INTERPOLATION - } -#endif ( *hCombinedOrientationData )->lrSwitchedNext = 0; move16(); ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; -- GitLab From 8c97d14d112672f76953970dbeba3e164cc6714c Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:43 +0200 Subject: [PATCH 0892/1310] [cleanup] accept NONBE_FIX_978_MC_TDREND_REVERB --- lib_com/options.h | 1 - lib_dec/ivas_init_dec_fx.c | 4 ---- lib_dec/ivas_ism_dec_fx.c | 4 ---- lib_dec/ivas_objectRenderer_internal_fx.c | 8 -------- 4 files changed, 17 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ea0be205a..a1fc5e751 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -#define NONBE_FIX_978_MC_TDREND_REVERB /* Eri : activate reverb for TDREND with headtracking */ #define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 312011c73..6643ed423 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -2291,11 +2291,7 @@ ivas_error ivas_init_decoder_fx( move16(); } -#ifdef NONBE_FIX_978_MC_TDREND_REVERB IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 16fab99ef..5f431d63b 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -218,11 +218,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( { return error; } -#ifdef NONBE_FIX_978_MC_TDREND_REVERB IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - IF( EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index 48cbd21c7..1b174493d 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -237,11 +237,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( } test(); -#ifdef NONBE_FIX_978_MC_TDREND_REVERB IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { FOR( i = 0; i < nchan_ism_internal; ++i ) { @@ -273,11 +269,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( } test(); -#ifdef NONBE_FIX_978_MC_TDREND_REVERB IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - IF( st_ivas->hRenderConfig != NULL && EQ_32( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { /* add reverb to rendered signals */ v_add_32( reverb_signal_fx[0], output_fx_local[0], output_fx_local[0], output_frame ); // Q11 -- GitLab From 8b75e5595f09a8fdc58950d7244b3ef2ec1dde57 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:52 +0200 Subject: [PATCH 0893/1310] [cleanup] accept NONBE_FIX_999_JBM_MCT_FLUSH --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a1fc5e751..0255c82a2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -#define NONBE_FIX_999_JBM_MCT_FLUSH /* FhG: issue #999: fix wrong flushing for MCT at a JBM rate switch */ #define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 3abf7b2e7..6a0d49bfe 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2843,11 +2843,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( ivas_binaural_add_LFE_fx( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } -#ifdef NONBE_FIX_999_JBM_MCT_FLUSH ELSE IF( EQ_16( renderer_type_old, RENDERER_BINAURAL_OBJECTS_TD ) ) -#else - ELSE IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) -#endif { IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, hTcBuffer->n_samples_granularity ) ), IVAS_ERR_OK ) ) { @@ -2855,12 +2851,10 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( } ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } -#ifdef NONBE_FIX_999_JBM_MCT_FLUSH ELSE { return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong renderer in MCT VoIP renderer flushing!" ); } -#endif } ELSE { -- GitLab From cc113f025a6d0a4b9b2e5ead1713ba483c655ac7 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:55 +0200 Subject: [PATCH 0894/1310] [cleanup] accept NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE --- lib_com/options.h | 1 - lib_dec/ivas_mct_dec_fx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0255c82a2..fc33b50d9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,7 +128,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -#define NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE /* FhG: issue #1005: fix TC Buffer update at a MC rate switch */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 4545ab61d..5c9deed2d 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1023,10 +1023,8 @@ static ivas_error ivas_mc_dec_reconfig_fx( /* transfer subframe info from DirAC or ParamMC to central tc buffer */ -#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE if ( st_ivas->hTcBuffer->tc_buffer_mode != TC_BUFFER_MODE_BUFFER ) { -#endif test(); IF( EQ_16( last_mc_mode, MC_MODE_PARAMMC ) ) { @@ -1052,9 +1050,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( move16(); Copy( st_ivas->hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } -#ifdef NONBE_FIX_1005_MC_RS_TCBUFFER_UPDATE } -#endif /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv render what still fits in the new granularity */ -- GitLab From 0287dc47fc348f8d56d331dfa7b58846464dc9bf Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:30:58 +0200 Subject: [PATCH 0895/1310] [cleanup] accept SPLIT_REND_POSE_CORRECTION_UNUSED_BITS --- lib_com/options.h | 1 - lib_isar/isar_cnst.h | 4 - lib_isar/isar_prot.h | 8 - lib_isar/isar_splitRendererPost.c | 163 ------------------ lib_isar/isar_splitRendererPre.c | 246 ---------------------------- lib_isar/isar_splitRenderer_utils.c | 58 ------- lib_isar/isar_stat.h | 2 - 7 files changed, 482 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index fc33b50d9..810fefcd4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -105,7 +105,6 @@ #define SPLIT_REND_WITH_HEAD_ROT /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #ifdef SPLIT_REND_WITH_HEAD_ROT -#define SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define ISAR_BITSTREAM_UPDATE_LC3PLUS /* FhG: Multiple improvements to the ISAR bitstream when LC3plus is used. See MR 1456 for details. */ #define FIX_1372_ISAR_POST_REND #endif diff --git a/lib_isar/isar_cnst.h b/lib_isar/isar_cnst.h index 046beabdc..7eae62357 100644 --- a/lib_isar/isar_cnst.h +++ b/lib_isar/isar_cnst.h @@ -76,12 +76,8 @@ typedef enum #define MAX_SPLIT_REND_MD_BANDS 20 #define MAX_SPLIT_MD_SUBFRAMES 1 #define COMPLEX_MD_BAND_THRESH MAX_SPLIT_REND_MD_BANDS -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define COMPLEX_MD_BAND_THRESH_LOW 4 #define COMPLEX_MD_BAND_THRESH_HIGH 10 -#else -#define COMPLEX_MD_BAND_THRESH_LOW 5 -#endif #define SPLIT_REND_RO_MD_BAND_THRESH 4 #define ISAR_SPLIT_REND_PRED_63QUANT_PNTS_LOG2_CEIL 6 diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index 618454f66..b97b81bbc 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -199,14 +199,8 @@ void isar_split_rend_get_quant_params_fx( Word16 bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS], Word16 pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], Word16 pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS const Word16 ro_flag, -#endif Word16 *num_quant_strats -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - , - Word16 *num_complex_bands -#endif ); void isar_split_rend_get_quant_params( @@ -293,7 +287,6 @@ void isar_rend_CldfbSplitPreRendProcess( const Word16 low_res_pre_rend_rot, const Word16 ro_md_flag ); -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word16 isar_renderSplitGetRot_axisNumBits( const Word16 dof ); @@ -305,7 +298,6 @@ Word16 isar_renderSplitGetCodeFromRot_axis( const Word16 dof, const ISAR_SPLIT_REND_ROT_AXIS rot_axis, Word16 *num_bits ); -#endif void isar_init_split_post_rend_handles( ISAR_SPLIT_POST_REND_WRAPPER *hSplitRendWrapper ); diff --git a/lib_isar/isar_splitRendererPost.c b/lib_isar/isar_splitRendererPost.c index 306b47d71..32a230318 100644 --- a/lib_isar/isar_splitRendererPost.c +++ b/lib_isar/isar_splitRendererPost.c @@ -239,22 +239,9 @@ static void ivas_split_rend_unquant_md_fx( quantstep = pred_quant_step; move32(); -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - hMd->pred_mat_re_fx[ch1][ch2] = Mpy_32_16_1( quantstep, extract_l( L_shl( hMd->pred_mat_re_idx[ch1][ch2], Q9 ) ) ); /* Q25 */ - move32(); - hMd->pred_mat_re_fx[ch1][ch2] = L_add( hMd->pred_mat_re_fx[ch1][ch2], L_shr( fix_pos_rot_mat[ch1][ch2], Q6 ) ); /* Q25 */ - move32(); - } - } -#endif IF( real_only ) { -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) { FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) @@ -265,7 +252,6 @@ static void ivas_split_rend_unquant_md_fx( move32(); } } -#endif FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) { @@ -278,7 +264,6 @@ static void ivas_split_rend_unquant_md_fx( } ELSE { -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) { FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) @@ -289,7 +274,6 @@ static void ivas_split_rend_unquant_md_fx( move32(); } } -#endif FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) { @@ -385,34 +369,6 @@ static void isar_splitBinPostRendMdBase2Dec( { IF( EQ_32( hBinHrSplitPostRend->pose_type[pos_idx], ANY_YAW ) ) { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_code_len ) ); - hMd->pred_mat_re_idx[ch1][ch2] = add( code, min_pred_idx ); - move16(); - } - } - } - FOR( b = 0; b < pred_imag_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_code_len ) ); - hMd->pred_mat_im_idx[ch1][ch2] = add( code, min_pred_idx ); - move16(); - } - } - } -#else FOR( b = 0; b < pred_imag_bands_yaw; b++ ) { hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; @@ -450,7 +406,6 @@ static void isar_splitBinPostRendMdBase2Dec( hMd->pred_mat_re_idx[1][0] = 0; move16(); } -#endif FOR( b = 0; b < d_bands_yaw; b++ ) { hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; @@ -474,34 +429,6 @@ static void isar_splitBinPostRendMdBase2Dec( } ELSE { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_roll; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_roll_code_len ) ); - hMd->pred_mat_re_idx[ch1][ch2] = add( code, min_pred_roll_idx ); - move16(); - } - } - } - FOR( b = 0; b < pred_imag_bands_roll; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, pred_roll_code_len ) ); - hMd->pred_mat_im_idx[ch1][ch2] = add( code, min_pred_roll_idx ); - move16(); - } - } - } -#else FOR( b = 0; b < pred_imag_bands_roll; b++ ) { hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; @@ -539,7 +466,6 @@ static void isar_splitBinPostRendMdBase2Dec( hMd->pred_mat_re_idx[1][0] = 0; move16(); } -#endif } } } @@ -599,36 +525,6 @@ static void ivas_splitBinPostRendMdHuffDec( { IF( EQ_32( hBinHrSplitPostRend->pose_type[pos_idx], ANY_YAW ) ) { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred[pred_cb_idx], pBits, pHuff_cfg->pred_idx_trav[pred_cb_idx] ); - move16(); - // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred, pBits ); - } - } - isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, 1, min_pred_idx, max_pred_idx ); - } - FOR( b = 0; b < pred_imag_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred[pred_cb_idx], pBits, pHuff_cfg->pred_idx_trav[pred_cb_idx] ); - move16(); - // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred, pBits ); - } - } - isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_im_idx, -1, min_pred_idx, max_pred_idx ); - } -#else FOR( b = 0; b < pred_imag_bands_yaw; b++ ) { hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; @@ -668,7 +564,6 @@ static void ivas_splitBinPostRendMdHuffDec( move16(); isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, -1, min_pred_idx, max_pred_idx ); } -#endif FOR( b = 0; b < d_bands_yaw; b++ ) { hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; @@ -689,37 +584,6 @@ static void ivas_splitBinPostRendMdHuffDec( } ELSE { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_roll; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred_roll, pBits, pHuff_cfg->pred_roll_idx_trav ); - move16(); - // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred_roll, pBits ); - } - } - isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, 1, min_pred_roll_idx, max_pred_roll_idx ); - } - FOR( b = 0; b < pred_imag_bands_roll; b++ ) - { - hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode_opt( &pHuff_cfg->pred_roll, pBits, pHuff_cfg->pred_roll_idx_trav ); - move16(); - // sym_adj_idx[ch1][ch2] = ivas_split_rend_huffman_decode( &pHuff_cfg->pred_roll, pBits ); - } - } - isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_im_idx, -1, min_pred_roll_idx, max_pred_roll_idx ); - } -#else FOR( b = 0; b < pred_imag_bands_roll; b++ ) { hMd = &hBinHrSplitPostRend->rot_md[pos_idx][sf_idx][b]; @@ -760,7 +624,6 @@ static void ivas_splitBinPostRendMdHuffDec( move16(); isar_SplitRenderer_getdiagdiff( sym_adj_idx, hMd->pred_mat_re_idx, -1, min_pred_roll_idx, max_pred_roll_idx ); } -#endif } } } @@ -789,11 +652,7 @@ void isar_splitBinPostRendMdDec_fx( Word16 pred_real_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; Word16 pred_imag_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; Word16 d_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word16 num_quant_strats; -#else - Word16 num_complex_bands, num_quant_strats; -#endif Word32 quant_strat_bits, is_huff_coding, quant_strat; Word16 pred_quant_pnts_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; Word32 pred_1byquantstep_yaw_fx[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; // Q26 @@ -804,9 +663,7 @@ void isar_splitBinPostRendMdDec_fx( ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; ISAR_SPLIT_REND_CONFIG_DATA split_rend_config; ISAR_SPLIT_REND_ROT_AXIS rot_axis; -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word16 ro_md_flag, num_bits, axis_code; -#endif hBinHrSplitPostRend->low_Res = 1; move16(); @@ -814,7 +671,6 @@ void isar_splitBinPostRendMdDec_fx( split_rend_config.dof = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_DOF_BITS ) ); split_rend_config.hq_mode = extract_l( ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_HQ_MODE_BITS ) ); -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS num_bits = isar_renderSplitGetRot_axisNumBits( split_rend_config.dof ); if ( num_bits > 0 ) { @@ -826,9 +682,6 @@ void isar_splitBinPostRendMdDec_fx( } rot_axis = isar_renderSplitGetRot_axisFromCode( split_rend_config.dof, axis_code ); ro_md_flag = (int16_t) ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_RO_FLAG_BITS ); -#else - rot_axis = (ISAR_SPLIT_REND_ROT_AXIS) ISAR_SPLIT_REND_BITStream_read_int32( pBits, ISAR_SPLIT_REND_ROT_AXIS_BITS ); -#endif isar_renderSplitGetMultiBinPoseData_fx( &split_rend_config, pMultiBinPoseData, rot_axis ); set_fix_rotation_mat_fx( hBinHrSplitPostRend->fix_pos_rot_mat_fx, pMultiBinPoseData ); @@ -862,7 +715,6 @@ void isar_splitBinPostRendMdDec_fx( move32(); } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS isar_split_rend_get_quant_params_fx( MAX_SPLIT_REND_MD_BANDS, pred_real_bands_yaw, @@ -876,21 +728,6 @@ void isar_splitBinPostRendMdDec_fx( pred_imag_bands_roll, ro_md_flag, &num_quant_strats ); -#else - isar_split_rend_get_quant_params_fx( - MAX_SPLIT_REND_MD_BANDS, - pred_real_bands_yaw, - pred_imag_bands_yaw, - pred_quant_pnts_yaw, - pred_quantstep_yaw_fx, - pred_1byquantstep_yaw_fx, - d_bands_yaw, - bands_pitch, - pred_real_bands_roll, - pred_imag_bands_roll, - &num_quant_strats, - &num_complex_bands ); -#endif quant_strat_bits = L_deposit_l( ceil_log_2( num_quant_strats ) ); is_huff_coding = ISAR_SPLIT_REND_BITStream_read_int32( pBits, 1 ); quant_strat = ISAR_SPLIT_REND_BITStream_read_int32( pBits, quant_strat_bits ); diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index 8bdc824f8..e5454e852 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -912,11 +912,7 @@ static void isar_split_rend_quant_md_fx( { int16_t ch1, ch2; int16_t gd_idx_min; -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word32 quant_val; -#else - Word32 sign, quant_val; -#endif #ifdef DEBUG_QUANT_MD_FX float quant_val_flt; Word16 tmp; @@ -931,7 +927,6 @@ static void isar_split_rend_quant_md_fx( #endif IF( real_only == 1 ) { -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) { hMd->pred_mat_re_fx[ch1][ch1] = hMd->pred_mat_re2[ch1]; @@ -948,25 +943,9 @@ static void isar_split_rend_quant_md_fx( hMd->pred_mat_re_idx[ch1][ch2] = (Word16) L_shr_r( Mpy_32_32( onebyquantstep, quant_val ), sub( Q_frame, 5 ) ); // Q25*Q26 = Q20 -> Q16 -> Q0 } } -#else - for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - sign = GE_32( hMd->pred_mat_re_fx[ch1][ch2], 0 ) ? 1 : -1; - Word16 exp_out; - ivas_calculate_abs_fx( hMd->pred_mat_re_fx[ch1][ch2], Q31 - Q_frame, hMd->pred_mat_im_fx[ch1][ch2], Q31 - Q_frame, &hMd->pred_mat_re_fx[ch1][ch2], &exp_out ); - hMd->pred_mat_re_fx[ch1][ch2] = L_shr_r( hMd->pred_mat_re_fx[ch1][ch2], sub( sub( Q31, Q_frame ), exp_out ) ); // Q_frame - hMd->pred_mat_re_fx[ch1][ch2] = (Word32) W_mult0_32_32( hMd->pred_mat_re_fx[ch1][ch2], sign ); - hMd->pred_mat_im_fx[ch1][ch2] = 0; - } - } -#endif } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS else { -#endif for ( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) { for ( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) @@ -986,9 +965,7 @@ static void isar_split_rend_quant_md_fx( #endif } } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS } -#endif if ( real_only == 0 ) { @@ -1067,7 +1044,6 @@ static void isar_split_rend_quant_md_fx( } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS static void get_lr_gains( Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], const Word16 exp_cov_ii_re, Word32 cov_oo_re_fx[][BINAURAL_CHANNELS], @@ -1123,7 +1099,6 @@ static void get_lr_gains( Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], move16(); return; } -#endif static void ComputeCoeffs_fx( Word32 cov_ii_re_fx[][BINAURAL_CHANNELS], @@ -1216,7 +1191,6 @@ static void ComputeCoeffs_fx( { IF( real_only ) { -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word32 gd_tmp_fx[BINAURAL_CHANNELS]; get_lr_gains( cov_ii_re_fx, exp_cov_ii_re, cov_oo_re_fx, exp_cov_oo_re, @@ -1237,77 +1211,12 @@ static void ComputeCoeffs_fx( } -#else - Word32 gd_tmp_fx[BINAURAL_CHANNELS]; - Word16 exp_gd_tmp_buf[BINAURAL_CHANNELS] = { 0 }; - Word16 exp_gd_tmp = 0; - - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - gd_tmp_fx[i] = cov_ii_re_fx[i][i]; - move32(); - exp_gd_tmp_buf[i] = exp_cov_ii_re; - move16(); - - Word16 flag = BASOP_Util_Cmp_Mant32Exp( gd_tmp_fx[i], exp_gd_tmp_buf[i], EPSILON_FX, 0 ); - IF( EQ_16( flag, negate( 1 ) ) ) - { - gd_tmp_fx[i] = ONE_IN_Q25; - move32(); - exp_gd_tmp_buf[i] = 6; - move16(); - } - ELSE - { - Word16 tmp, tmp_sqrt, exp_tmp = 0; - tmp = BASOP_Util_Divide3232_Scale( cov_oo_re_fx[i][i], gd_tmp_fx[i], &exp_tmp ); - exp_tmp = exp_tmp + ( exp_cov_oo_re - exp_gd_tmp_buf[i] ); - tmp_sqrt = Sqrt16( tmp, &exp_tmp ); - gd_tmp_fx[i] = L_deposit_h( tmp_sqrt ); - move32(); - exp_gd_tmp_buf[i] = exp_tmp; - move16(); - } - hMd->pred_mat_re_fx[i][i] = gd_tmp_fx[i]; - move32(); - set32_fx( hMd->pred_mat_im_fx[i], 0, BINAURAL_CHANNELS ); - } - hMd->pred_mat_re_fx[1][0] = 0; - move32(); - hMd->pred_mat_re_fx[0][1] = 0; - move32(); - - Word16 max_gd_exp = MIN16B; - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - max_gd_exp = max( max_gd_exp, exp_gd_tmp_buf[i] ); - } - exp_gd_tmp = max_gd_exp; - - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - hMd->pred_mat_re_fx[i][i] = L_shr( hMd->pred_mat_re_fx[i][i], max_gd_exp - exp_gd_tmp_buf[i] ); - move32(); - } - - exp_pred_re = exp_gd_tmp; - move16(); - exp_pred_im = exp_gd_tmp; - move16(); - - hMd->exp_pred_mat_re = exp_pred_re; - move16(); - hMd->exp_pred_mat_im = exp_pred_im; - move16(); -#endif } ELSE { -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS get_lr_gains( cov_ii_re_fx, exp_cov_ii_re, cov_oo_re_fx, exp_cov_oo_re, hMd->pred_mat_re2, &hMd->exp_pred_mat_re2 ); -#endif Word16 exp_norm_fact = 0; cov_norm_fact_fx = GetNormFact_fx( cov_ii_re_fx, exp_cov_ii_re, cov_ii_im_fx, exp_cov_ii_im, cov_io_re_fx, exp_cov_io_re, cov_io_im_fx, exp_cov_io_im, cov_oo_re_fx, exp_cov_oo_re, &exp_norm_fact ); @@ -1580,19 +1489,12 @@ static void get_base2_bits( pose_type = hBinHrSplitPreRend->pose_type[pose_idx]; IF( EQ_32( pose_type, ANY_YAW ) ) { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_real_bands_yaw[q] ), bin_ch_2_num_sf ) ); - move32(); - base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_imag_bands_yaw[q] ), bin_ch_2_num_sf ) ); - move32(); -#else base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_real_bands_yaw[q] ), bin_ch_num_sf ) ); move32(); base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_imag_bands_yaw[q] ), bin_ch_num_sf ) ); move32(); base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_yaw_bits[q], pred_imag_bands_yaw[q] ), bin_ch_2_num_sf ) ); move32(); -#endif base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( d_gain_bits, d_bands_yaw[q] ), num_subframes ) ); @@ -1607,19 +1509,12 @@ static void get_base2_bits( } ELSE { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_real_bands_roll[q] ), bin_ch_2_num_sf ) ); - move32(); - base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_imag_bands_roll[q] ), bin_ch_2_num_sf ) ); - move32(); -#else base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_real_bands_roll[q] ), bin_ch_num_sf ) ); move32(); base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_imag_bands_roll[q] ), bin_ch_num_sf ) ); move32(); base2bits[q] = L_add( base2bits[q], L_mult0( DEPR_i_mult( pred_roll_bits, pred_imag_bands_roll[q] ), bin_ch_2_num_sf ) ); move32(); -#endif } } } @@ -1683,33 +1578,6 @@ static void isar_SplitRenderer_code_md_base2( { IF( EQ_32( hBinHrSplitPreRend->pose_type[pos_idx], ANY_YAW ) ) { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = L_sub( hMd->pred_mat_re_idx[ch1][ch2], min_pred_idx ); - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_code_len ); - } - } - } - - FOR( b = 0; b < pred_imag_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = L_sub( hMd->pred_mat_im_idx[ch1][ch2], min_pred_idx ); - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_code_len ); - } - } - } -#else FOR( b = 0; b < pred_imag_bands_yaw; b++ ) { hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; @@ -1740,7 +1608,6 @@ static void isar_SplitRenderer_code_md_base2( ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_code_len ); } } -#endif FOR( b = 0; b < d_bands_yaw; b++ ) { hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; @@ -1762,33 +1629,6 @@ static void isar_SplitRenderer_code_md_base2( } ELSE { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_roll; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = L_sub( hMd->pred_mat_re_idx[ch1][ch2], min_pred_roll_idx ); - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_roll_code_len ); - } - } - } - - FOR( b = 0; b < pred_imag_bands_roll; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - code = L_sub( hMd->pred_mat_im_idx[ch1][ch2], min_pred_roll_idx ); - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_roll_code_len ); - } - } - } -#else FOR( b = 0; b < pred_imag_bands_roll; b++ ) { hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; @@ -1819,7 +1659,6 @@ static void isar_SplitRenderer_code_md_base2( ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, pred_roll_code_len ); } } -#endif } } } @@ -1895,35 +1734,6 @@ static void isar_SplitRenderer_code_md_huff( { IF( EQ_32( hBinHrSplitPreRend->pose_type[pos_idx], ANY_YAW ) ) { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - isar_SplitRenderer_getdiagdiff( hMd->pred_mat_re_idx, sym_adj_idx, -1, min_pred_idx, max_pred_idx ); - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - isar_split_rend_huffman_encode( &pHuff_cfg->pred[pred_cb_idx], sym_adj_idx[ch1][ch2], &code, &len ); - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); - } - } - } - FOR( b = 0; b < pred_imag_bands_yaw; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - isar_SplitRenderer_getdiagdiff( hMd->pred_mat_im_idx, sym_adj_idx, 1, min_pred_idx, max_pred_idx ); - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - isar_split_rend_huffman_encode( &pHuff_cfg->pred[pred_cb_idx], sym_adj_idx[ch1][ch2], &code, &len ); - - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); - } - } - } -#else FOR( b = 0; b < pred_imag_bands_yaw; b++ ) { hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; @@ -1958,7 +1768,6 @@ static void isar_SplitRenderer_code_md_huff( ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); } } -#endif FOR( b = 0; b < d_bands_yaw; b++ ) { hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; @@ -1980,34 +1789,6 @@ static void isar_SplitRenderer_code_md_huff( } ELSE { -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - FOR( b = 0; b < pred_real_bands_roll; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - isar_SplitRenderer_getdiagdiff( hMd->pred_mat_re_idx, sym_adj_idx, -1, min_pred_roll_idx, max_pred_roll_idx ); - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - isar_split_rend_huffman_encode( &pHuff_cfg->pred_roll, sym_adj_idx[ch1][ch2], &code, &len ); - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); - } - } - } - FOR( b = 0; b < pred_imag_bands_roll; b++ ) - { - hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; - isar_SplitRenderer_getdiagdiff( hMd->pred_mat_im_idx, sym_adj_idx, 1, min_pred_roll_idx, max_pred_roll_idx ); - FOR( ch1 = 0; ch1 < BINAURAL_CHANNELS; ch1++ ) - { - FOR( ch2 = 0; ch2 < BINAURAL_CHANNELS; ch2++ ) - { - isar_split_rend_huffman_encode( &pHuff_cfg->pred_roll, sym_adj_idx[ch1][ch2], &code, &len ); - ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); - } - } - } -#else FOR( b = 0; b < pred_imag_bands_roll; b++ ) { hMd = &hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b]; @@ -2041,7 +1822,6 @@ static void isar_SplitRenderer_code_md_huff( ISAR_SPLIT_REND_BITStream_write_int32( pBits, code, len ); } } -#endif } } } @@ -2073,17 +1853,11 @@ static void isar_SplitRenderer_quant_code( MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, ISAR_SPLIT_REND_BITS_HANDLE pBits, const Word16 low_res_pre_rend_rot, -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS const int16_t ro_md_flag, -#endif const Word32 target_md_bits, Word16 Q_frame ) { -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word16 q, num_subframes, sf_idx, pos_idx, b, num_quant_strats; -#else - Word16 num_complex_bands, q, num_subframes, sf_idx, pos_idx, b, num_quant_strats; -#endif Word32 overhead_bits, quant_strat_bits, huff_bits, start_bit; Word16 pred_real_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; Word16 pred_imag_bands_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS], pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; @@ -2097,9 +1871,7 @@ static void isar_SplitRenderer_quant_code( float pred_quantstep_yaw[ISAR_SPLIT_REND_NUM_QUANT_STRATS]; #endif ISAR_BIN_HR_SPLIT_REND_MD_HANDLE hMd; -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word16 rot_axis_code, num_bits; -#endif IF( low_res_pre_rend_rot ) { @@ -2114,16 +1886,12 @@ static void isar_SplitRenderer_quant_code( ISAR_SPLIT_REND_BITStream_write_int32( pBits, pMultiBinPoseData->dof, ISAR_SPLIT_REND_DOF_BITS ); ISAR_SPLIT_REND_BITStream_write_int32( pBits, pMultiBinPoseData->hq_mode, ISAR_SPLIT_REND_HQ_MODE_BITS ); -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS rot_axis_code = isar_renderSplitGetCodeFromRot_axis( pMultiBinPoseData->dof, pMultiBinPoseData->rot_axis, &num_bits ); if ( num_bits > 0 ) { ISAR_SPLIT_REND_BITStream_write_int32( pBits, (int32_t) rot_axis_code, num_bits ); } ISAR_SPLIT_REND_BITStream_write_int32( pBits, (int32_t) ro_md_flag, ISAR_SPLIT_REND_RO_FLAG_BITS ); -#else - ISAR_SPLIT_REND_BITStream_write_int32( pBits, (int32_t) pMultiBinPoseData->rot_axis, ISAR_SPLIT_REND_ROT_AXIS_BITS ); -#endif /* code ref pose*/ FOR( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) @@ -2147,15 +1915,9 @@ static void isar_SplitRenderer_quant_code( ISAR_SPLIT_REND_BITStream_write_int32( pBits, angle, ISAR_SPLIT_REND_HEAD_POSE_BITS ); } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS isar_split_rend_get_quant_params_fx( MAX_SPLIT_REND_MD_BANDS, pred_real_bands_yaw, pred_imag_bands_yaw, pred_quant_pnts_yaw, pred_quantstep_yaw_fx, pred_1byquantstep_yaw_fx, d_bands_yaw, bands_pitch, pred_real_bands_roll, pred_imag_bands_roll, ro_md_flag, &num_quant_strats ); -#else - isar_split_rend_get_quant_params_fx( MAX_SPLIT_REND_MD_BANDS, pred_real_bands_yaw, pred_imag_bands_yaw, - pred_quant_pnts_yaw, pred_quantstep_yaw_fx, pred_1byquantstep_yaw_fx, - d_bands_yaw, bands_pitch, pred_real_bands_roll, pred_imag_bands_roll, &num_quant_strats, &num_complex_bands ); -#endif #ifdef DEBUG_QUANT_MD_FX fixedToFloat_arrL( pred_quantstep_yaw_fx, pred_quantstep_yaw, Q31, ISAR_SPLIT_REND_NUM_QUANT_STRATS ); fixedToFloat_arrL( pred_1byquantstep_yaw_fx, pred_1byquantstep_yaw, Q26, ISAR_SPLIT_REND_NUM_QUANT_STRATS ); @@ -2568,9 +2330,7 @@ void isar_rend_CldfbSplitPreRendProcess( ELSE { exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re ); -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re2 ); -#endif exp_frame = s_max( exp_frame, hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_im ); } } @@ -2600,19 +2360,13 @@ void isar_rend_CldfbSplitPreRendProcess( Scale_sig32( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re_fx[i], BINAURAL_CHANNELS, sub( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re, exp_frame ) ); Scale_sig32( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_im_fx[i], BINAURAL_CHANNELS, sub( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_im, exp_frame ) ); } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Scale_sig32( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].pred_mat_re2, BINAURAL_CHANNELS, sub( hBinHrSplitPreRend->rot_md[pos_idx][sf_idx][b].exp_pred_mat_re2, exp_frame ) ); -#endif } } } } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS isar_SplitRenderer_quant_code( hBinHrSplitPreRend, headPosition, pMultiBinPoseData, pBits, low_res_pre_rend_rot, ro_md_flag, target_md_bits, Q_frame ); -#else - isar_SplitRenderer_quant_code( hBinHrSplitPreRend, headPosition, pMultiBinPoseData, pBits, low_res_pre_rend_rot, target_md_bits, Q_frame ); -#endif #ifdef DEBUG_QUANT_CODE_OUT for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) { diff --git a/lib_isar/isar_splitRenderer_utils.c b/lib_isar/isar_splitRenderer_utils.c index 7f21a40c7..daa4c1806 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -961,40 +961,21 @@ ivas_error isar_split_rend_validate_config( ELSE { IF( EQ_16( pSplitRendConfig->dof, 1 ) ){ -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS IF( LT_32( pSplitRendConfig->splitRendBitRate, 34000 ) ){ return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "1DOF metadata needs atleast 34 kbps" ); } -#else - IF( LT_32( pSplitRendConfig->splitRendBitRate, 50000 ) ){ - return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "1DOF metadata needs atleast 50 kbps" ); - } -#endif } ELSE IF( EQ_16( pSplitRendConfig->dof, 2 ) ){ -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS IF( LT_32( pSplitRendConfig->splitRendBitRate, 50000 ) ){ return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "2DOF metadata needs atleast 50 kbps" ); } -#else - IF( LT_32( pSplitRendConfig->splitRendBitRate, 66000 ) ){ - return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "2DOF metadata needs atleast 66 kbps" ); -} -#endif } ELSE IF( EQ_16( pSplitRendConfig->dof, 3 ) ) { -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS IF( LT_32( pSplitRendConfig->splitRendBitRate, 82000 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "3DOF metadata needs atleast 128 kbps" ); } -#else - IF( LT_32( pSplitRendConfig->splitRendBitRate, 128000 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "3DOF metadata needs atleast 128 kbps" ); - } -#endif } } @@ -1019,25 +1000,14 @@ void isar_split_rend_get_quant_params_fx( Word16 bands_pitch[ISAR_SPLIT_REND_NUM_QUANT_STRATS], Word16 pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], Word16 pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS const Word16 ro_flag, -#endif Word16 *num_quant_strats -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - , - Word16 *num_complex_bands -#endif ) { Word16 q; *num_quant_strats = ISAR_SPLIT_REND_NUM_QUANT_STRATS; move16(); -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - *num_complex_bands = COMPLEX_MD_BAND_THRESH_LOW; - move16(); - assert( *num_complex_bands <= num_md_bands ); -#endif pred_quant_pnts_yaw[0] = ISAR_SPLIT_REND_PRED_63QUANT_PNTS; move16(); @@ -1063,24 +1033,6 @@ void isar_split_rend_get_quant_params_fx( move16(); } -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - pred_imag_bands_yaw[0] = num_md_bands; - move16(); - pred_imag_bands_roll[0] = num_md_bands; - move16(); - pred_imag_bands_yaw[1] = num_md_bands; - move16(); - pred_imag_bands_roll[1] = num_md_bands; - move16(); - - FOR( q = 2; q < *num_quant_strats; q++ ) - { - pred_imag_bands_yaw[q] = LT_16( q, sub( *num_quant_strats, 1 ) ) ? num_md_bands : *num_complex_bands; - move16(); - pred_imag_bands_roll[q] = *num_complex_bands; - move16(); - } -#else IF( ro_flag ) { FOR( q = 0; q < *num_quant_strats; q++ ) @@ -1107,7 +1059,6 @@ void isar_split_rend_get_quant_params_fx( pred_imag_bands_roll[q] = SPLIT_REND_RO_MD_BAND_THRESH; move16(); } -#endif FOR( q = 0; q < *num_quant_strats; q++ ) { @@ -1120,7 +1071,6 @@ void isar_split_rend_get_quant_params_fx( return; } -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS /*------------------------------------------------------------------------- * Function isar_renderSplitGetRot_axisNumBits() * @@ -1212,7 +1162,6 @@ Word16 isar_renderSplitGetCodeFromRot_axis( return code; } -#endif /*------------------------------------------------------------------------- * Function isar_renderSplitGetMultiBinPoseData() @@ -1287,10 +1236,6 @@ void isar_renderSplitGetMultiBinPoseData_fx( SWITCH( rot_axis ) { case DEFAULT_AXIS: -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - case YAW: - case PITCH: -#endif case YAW_PITCH: { num_yaw_poses = SPLIT_REND_MAX_YAW_ONLY_POSES; @@ -1299,9 +1244,6 @@ void isar_renderSplitGetMultiBinPoseData_fx( move16(); BREAK; } -#ifndef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS - case ROLL: -#endif case YAW_ROLL: { num_yaw_poses = SPLIT_REND_MAX_YAW_ONLY_POSES; diff --git a/lib_isar/isar_stat.h b/lib_isar/isar_stat.h index fec4a5d80..0b1e1bb07 100644 --- a/lib_isar/isar_stat.h +++ b/lib_isar/isar_stat.h @@ -115,10 +115,8 @@ typedef struct isar_binaural_head_rot_split_rendering_md_struct Word16 exp_pred_mat_re; Word32 pred_mat_im_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS]; /* Q25 */ Word16 exp_pred_mat_im; -#ifdef SPLIT_REND_POSE_CORRECTION_UNUSED_BITS Word32 pred_mat_re2[BINAURAL_CHANNELS]; Word16 exp_pred_mat_re2; -#endif Word32 gd_fx; /* Q25 */ Word32 gd2_fx; /* Q25 */ Word16 exp_gd; -- GitLab From a3804b2deab1746778f9ffabbf9e51d222ee4fcc Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:31:01 +0200 Subject: [PATCH 0896/1310] [cleanup] accept ISAR_BITSTREAM_UPDATE_LC3PLUS --- apps/decoder.c | 16 -- apps/isar_post_rend.c | 17 -- apps/renderer.c | 14 -- lib_com/common_api_types.h | 6 - lib_com/ivas_error.h | 2 - lib_com/options.h | 1 - lib_dec/ivas_init_dec_fx.c | 5 - lib_dec/lib_dec.h | 4 - lib_dec/lib_dec_fx.c | 14 -- lib_isar/isar_cnst.h | 2 - lib_isar/isar_lc3plus_common.c | 2 - lib_isar/isar_lc3plus_common.h | 6 - lib_isar/isar_lc3plus_dec.c | 296 ------------------------ lib_isar/isar_lc3plus_dec.h | 25 -- lib_isar/isar_lc3plus_enc.c | 113 --------- lib_isar/isar_lc3plus_enc.h | 14 -- lib_isar/isar_lc3plus_payload.c | 2 - lib_isar/isar_lc3plus_payload.h | 2 - lib_isar/isar_prot.h | 30 --- lib_isar/isar_splitRendererPre.c | 63 ----- lib_isar/isar_splitRenderer_utils.c | 146 ------------ lib_isar/lib_isar_post_rend.c | 104 --------- lib_isar/lib_isar_post_rend.h | 4 - lib_isar/lib_isar_pre_rend.c | 37 --- lib_isar/lib_isar_pre_rend.h | 6 - lib_rend/ivas_render_config_fx.c | 4 - lib_rend/lib_rend.h | 4 - lib_rend/lib_rend_fx.c | 10 - lib_util/render_config_reader.c | 2 - lib_util/split_render_file_read_write.c | 8 - lib_util/split_render_file_read_write.h | 4 - 31 files changed, 963 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index cdd5e3096..939f21aa7 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -558,11 +558,9 @@ int main( renderConfig.roomAcoustics.override = true; } #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* ISAR frame size is set from command line, not renderer config file. * This will be ignored if output format is not split rendering. */ renderConfig.split_rend_config.isar_frame_size_ms = (int16_t) arg.renderFramesize /* given in number of 5ms subframes */ * 5; -#endif #endif if ( ( error = IVAS_DEC_FeedRenderConfig( hIvasDec, renderConfig ) ) != IVAS_ERR_OK ) @@ -1670,10 +1668,8 @@ static ivas_error initOnFirstGoodFrame( ISAR_SPLIT_REND_CODEC splitRendCodec; int16_t splitRendCodecFrameSizeMs; ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t splitRendIsarFrameSizeMs; int16_t lc3plusHighRes; -#endif if ( ( error = IVAS_DEC_GetDelay( hIvasDec, delayNumSamples_temp, &delayTimeScale_temp ) ) != IVAS_ERR_OK ) { @@ -1684,14 +1680,10 @@ static ivas_error initOnFirstGoodFrame( if ( ( error = IVAS_DEC_GetSplitRendBitstreamHeader( hIvasDec, &splitRendCodec, &poseCorrection, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS &splitRendIsarFrameSizeMs, -#endif &splitRendCodecFrameSizeMs -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , &lc3plusHighRes -#endif ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to get split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); @@ -1707,12 +1699,10 @@ static ivas_error initOnFirstGoodFrame( splitRendCodec, poseCorrection, splitRendCodecFrameSizeMs -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , splitRendIsarFrameSizeMs, arg.output_Fs, lc3plusHighRes -#endif ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to open output split rendering metadata file %s\n", arg.outputWavFilename ); @@ -1734,12 +1724,10 @@ static ivas_error initOnFirstGoodFrame( splitRendCodec, poseCorrection, splitRendCodecFrameSizeMs -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , splitRendIsarFrameSizeMs, arg.output_Fs, lc3plusHighRes -#endif ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to open output split rendering metadata file %s\n", arg.outputWavFilename ); @@ -1776,12 +1764,8 @@ static ivas_error initOnFirstGoodFrame( splitRendBitsZero.buf_len = 0; splitRendBitsZero.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; splitRendBitsZero.pose_correction = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS splitRendBitsZero.codec_frame_size_ms = 0; splitRendBitsZero.isar_frame_size_ms = 20; -#else - splitRendBitsZero.codec_frame_size_ms = 20; -#endif if ( split_rend_write_bitstream_to_file( *splitRendWriter, splitRendBitsZero.bits_buf, &splitRendBitsZero.bits_read, &splitRendBitsZero.bits_written ) != IVAS_ERR_OK ) { diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c index d9095054b..1e041c175 100644 --- a/apps/isar_post_rend.c +++ b/apps/isar_post_rend.c @@ -734,13 +734,9 @@ int main( bitsBuffer.config.bufLenInBytes = 0; bitsBuffer.config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; bitsBuffer.config.poseCorrection = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS bitsBuffer.config.codec_frame_size_ms = 5; bitsBuffer.config.isar_frame_size_ms = 20; bitsBuffer.config.lc3plusHighRes = 0; -#else - bitsBuffer.config.codec_frame_size_ms = 20; -#endif CmdlnArgs args = parseCmdlnArgs( argc, argv ); @@ -764,9 +760,7 @@ int main( SplitRendBFIFileReader_open( args.splitRendBFIFilePath, &splitRendBFIReader ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int32_t inFileSampleRate = 0; -#endif strncpy( audioFilePath, args.inputFilePath, FILENAME_MAX - 1 ); hSplitRendFileReadWrite = NULL; if ( ( args.inConfig.numBinBuses > 0 ) && ( args.inConfig.binBuses[0].audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) @@ -776,12 +770,10 @@ int main( &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, &bitsBuffer.config.codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , &bitsBuffer.config.isar_frame_size_ms, &inFileSampleRate, &bitsBuffer.config.lc3plusHighRes -#endif ); if ( error != IVAS_ERR_OK ) { @@ -804,12 +796,10 @@ int main( &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, &bitsBuffer.config.codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , &bitsBuffer.config.isar_frame_size_ms, &inFileSampleRate, &bitsBuffer.config.lc3plusHighRes -#endif ); if ( error != IVAS_ERR_OK ) { @@ -819,17 +809,12 @@ int main( audioReader = NULL; } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - int32_t inFileSampleRate = 0; -#endif if ( audioReader != NULL ) { error = AudioFileReader_getSamplingRate( audioReader, &inFileSampleRate ); } else -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( hSplitRendFileReadWrite == NULL ) -#endif { inFileSampleRate = args.sampleRate; } @@ -892,11 +877,9 @@ int main( bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , bitsBuffer.config.isar_frame_size_ms, bitsBuffer.config.lc3plusHighRes -#endif ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in getting split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); diff --git a/apps/renderer.c b/apps/renderer.c index fa716c892..0d96f9dea 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -831,13 +831,9 @@ int main( bitsBuffer.config.bufLenInBytes = 0; bitsBuffer.config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; bitsBuffer.config.poseCorrection = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS bitsBuffer.config.codec_frame_size_ms = 5; bitsBuffer.config.isar_frame_size_ms = 20; bitsBuffer.config.lc3plus_highres = 0; -#else - bitsBuffer.config.codec_frame_size_ms = 20; -#endif #endif for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { @@ -1281,11 +1277,9 @@ int main( } #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* ISAR frame size is set from command line, not renderer config file. * This will be ignored if output format is not split rendering. */ renderConfig.split_rend_config.isar_frame_size_ms = (int16_t) args.render_framesize /* given in number of 5ms subframes */ * 5; -#endif #endif if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) @@ -1573,10 +1567,8 @@ int main( &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, &bitsBuffer.config.codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , &bitsBuffer.config.isar_frame_size_ms -#endif ); if ( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK ) @@ -1592,12 +1584,10 @@ int main( bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , bitsBuffer.config.isar_frame_size_ms, args.sampleRate, bitsBuffer.config.lc3plus_highres -#endif ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Could not open split rend metadata file %s\n", args.outputFilePath ); @@ -1614,10 +1604,8 @@ int main( &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, &bitsBuffer.config.codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , &bitsBuffer.config.isar_frame_size_ms -#endif ); if ( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK ) @@ -1633,12 +1621,10 @@ int main( bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, bitsBuffer.config.codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , bitsBuffer.config.isar_frame_size_ms, args.sampleRate, bitsBuffer.config.lc3plus_highres -#endif ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Could not open split rend metadata file %s\n", args.outMetadataFilePath ); diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index e1114a4f3..34facc703 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -276,10 +276,8 @@ typedef struct _ISAR_SPLIT_REND_BITS_DATA int16_t codec_frame_size_ms; ISAR_SPLIT_REND_CODEC codec; ISAR_SPLIT_REND_POSE_CORRECTION_MODE pose_correction; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t isar_frame_size_ms; int16_t lc3plus_highres; -#endif } ISAR_SPLIT_REND_BITS_DATA, *ISAR_SPLIT_REND_BITS_HANDLE; @@ -295,16 +293,12 @@ typedef struct _ISAR_SPLIT_REND_CONFIG 3 - (3dof correction. By default YAW, PITCH and ROLL correction) */ int16_t codec_delay_ms; /*PLACEHOLDER (currently being ignored) : look ahead delay of the codec that is used to code BIN signal output of pre-renderer*/ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t isar_frame_size_ms; /* ISAR bit stream frame size in milliseconds */ -#endif int16_t codec_frame_size_ms; /* Codec frame size in milliseconds, only relevant with LC3plus */ ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode; ISAR_SPLIT_REND_CODEC codec; ISAR_SPLIT_REND_RENDERER_SELECTION rendererSelection; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t lc3plus_highres; -#endif } ISAR_SPLIT_REND_CONFIG_DATA, *ISAR_SPLIT_REND_CONFIG_HANDLE; #endif diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 14c37a593..2f34e6709 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -99,10 +99,8 @@ typedef enum *----------------------------------------*/ IVAS_ERR_INVALID_BITSTREAM = 0x2000, #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS IVAS_ERR_UNEXPECTED_LC3PLUS_BITSTREAM, IVAS_ERR_UNEXPECTED_LC3PLUS_BITSTREAM_CONFIG, -#endif #endif /*----------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index 810fefcd4..e77c5a83b 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -105,7 +105,6 @@ #define SPLIT_REND_WITH_HEAD_ROT /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #ifdef SPLIT_REND_WITH_HEAD_ROT -#define ISAR_BITSTREAM_UPDATE_LC3PLUS /* FhG: Multiple improvements to the ISAR bitstream when LC3plus is used. See MR 1456 for details. */ #define FIX_1372_ISAR_POST_REND #endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 6643ed423..8b0d171d5 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -255,13 +255,8 @@ static ivas_error ivas_dec_init_split_rend( move16(); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS error = ISAR_PRE_REND_open( &st_ivas->hSplitBinRend->splitrend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hDecoderConfig->output_Fs, cldfb_in_flag, pcm_out_flag, st_ivas->hDecoderConfig->render_framesize, mixed_td_cldfb_flag ); move16(); -#else - error = ISAR_PRE_REND_open( &st_ivas->hSplitBinRend->splitrend, &st_ivas->hRenderConfig->split_rend_config, st_ivas->hDecoderConfig->output_Fs, cldfb_in_flag, pcm_out_flag, (int16_t) st_ivas->hDecoderConfig->render_framesize, mixed_td_cldfb_flag ); - move16(); -#endif return error; } #endif diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index eca274491..d7a110a37 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -158,14 +158,10 @@ ivas_error IVAS_DEC_GetSplitRendBitstreamHeader( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ ISAR_SPLIT_REND_CODEC *pCodec, /* o: pointer to codec setting */ ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o: pointer to pose correction mode */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS Word16 *pIsar_frame_size_ms, /* o: pointer to isar frame size setting */ -#endif Word16 *pCodec_frame_size_ms /* o: pointer to codec frame size setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , Word16 *pLc3plusHighRes /* o: pointer to LC3plus High-Res setting */ -#endif ); /*! r: decoder error code */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 9213b11ce..de939c5b0 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -296,10 +296,8 @@ static ivas_error isar_set_split_rend_setup( splitRendBits->codec = ISAR_SPLIT_REND_CODEC_DEFAULT; splitRendBits->pose_correction = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE; splitRendBits->codec_frame_size_ms = 0; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS splitRendBits->isar_frame_size_ms = 0; splitRendBits->lc3plus_highres = 0; -#endif if ( ( hSplitBinRend->hMultiBinCldfbData = (ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA_HANDLE) malloc( sizeof( ISAR_DEC_SPLIT_REND_MULTI_BIN_CLDFB_DATA ) ) ) == NULL ) { @@ -1520,9 +1518,7 @@ IVAS_DEC_GetSplitBinauralBitstream( Quaternion, st_ivas->hRenderConfig->split_rend_config.splitRendBitRate, st_ivas->hRenderConfig->split_rend_config.codec, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS st_ivas->hRenderConfig->split_rend_config.isar_frame_size_ms, -#endif st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms, splitRendBits, Cldfb_RealBuffer_Binaural, @@ -2653,18 +2649,14 @@ static ivas_error copyRendererConfigStruct( hRCout->split_rend_config.dof = 3; hRCout->split_rend_config.hq_mode = 0; hRCout->split_rend_config.codec_delay_ms = 0; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hRCout->split_rend_config.isar_frame_size_ms = 20; move16(); -#endif hRCout->split_rend_config.codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ hRCout->split_rend_config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; hRCout->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; hRCout->split_rend_config.rendererSelection = hRCin->split_rend_config.rendererSelection; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hRCout->split_rend_config.lc3plus_highres = hRCin->split_rend_config.lc3plus_highres; move16(); -#endif move32(); move16(); move16(); @@ -4094,14 +4086,10 @@ IVAS_DEC_GetSplitRendBitstreamHeader( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ ISAR_SPLIT_REND_CODEC *pCodec, /* o: pointer to codec setting */ ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o: pointer to pose correction mode */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS Word16 *pIsar_frame_size_ms, /* o: pointer to isar frame size setting */ -#endif Word16 *pCodec_frame_size_ms /* o: pointer to codec frame size setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , Word16 *pLc3plusHighRes -#endif ) { if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) @@ -4112,10 +4100,8 @@ IVAS_DEC_GetSplitRendBitstreamHeader( *pCodec = hIvasDec->st_ivas->hRenderConfig->split_rend_config.codec; *pCodec_frame_size_ms = hIvasDec->st_ivas->hRenderConfig->split_rend_config.codec_frame_size_ms; *poseCorrection = hIvasDec->st_ivas->hRenderConfig->split_rend_config.poseCorrectionMode; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS *pIsar_frame_size_ms = hIvasDec->st_ivas->hRenderConfig->split_rend_config.isar_frame_size_ms; *pLc3plusHighRes = hIvasDec->st_ivas->hRenderConfig->split_rend_config.lc3plus_highres; -#endif return IVAS_ERR_OK; } diff --git a/lib_isar/isar_cnst.h b/lib_isar/isar_cnst.h index 7eae62357..ad6bf483a 100644 --- a/lib_isar/isar_cnst.h +++ b/lib_isar/isar_cnst.h @@ -136,9 +136,7 @@ typedef enum #define ISAR_SPLIT_REND_ROT_AXIS_BITS 3 #define ISAR_SPLIT_REND_RO_FLAG_BITS 1 -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS #define IVAS_LC3PLUS_MAX_NUM_DECODERS 2 -#endif /*----------------------------------------------------------------------------------* * Split rendering bitrate constants *----------------------------------------------------------------------------------*/ diff --git a/lib_isar/isar_lc3plus_common.c b/lib_isar/isar_lc3plus_common.c index 2e5a31cb6..6a4ef18ed 100644 --- a/lib_isar/isar_lc3plus_common.c +++ b/lib_isar/isar_lc3plus_common.c @@ -57,7 +57,6 @@ ivas_error ISAR_LC3PLUS_LC3plusErrToIvasErr( return IVAS_ERR_INTERNAL; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_error IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( const LC3PLUS_RTP_ERR lc3PlusRtpError ) { switch ( lc3PlusRtpError ) @@ -86,4 +85,3 @@ ivas_error IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( const LC3PLUS_RTP_ERR lc3PlusRtp return IVAS_ERR_UNKNOWN; } #endif -#endif diff --git a/lib_isar/isar_lc3plus_common.h b/lib_isar/isar_lc3plus_common.h index 570609442..6042e8859 100644 --- a/lib_isar/isar_lc3plus_common.h +++ b/lib_isar/isar_lc3plus_common.h @@ -39,9 +39,7 @@ #include "ivas_error.h" #ifdef SPLIT_REND_WITH_HEAD_ROT #include "lc3.h" -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS #include "isar_lc3plus_payload.h" -#endif /*! common configuration parameters between encoder and decoder */ typedef struct LC3PLUS_CONFIG @@ -54,19 +52,15 @@ typedef struct LC3PLUS_CONFIG int32_t samplerate; /*! number of channels */ int16_t channels; -#if defined ISAR_BITSTREAM_UPDATE_LC3PLUS || defined ISAR_BITSTREAM_UPDATE_LC3PLUS /*! high resolution mode enabled (1) or disabled (0)*/ int16_t high_res_mode_enabled; -#endif } LC3PLUS_CONFIG; /*! utility function to convert LC3PLUS_Errors to the suitable ivas_error */ ivas_error ISAR_LC3PLUS_LC3plusErrToIvasErr( const LC3PLUS_Error lc3PlusError ); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /*! utility function to convert LC3PLUS_Errors to the suitable ivas_error */ ivas_error IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( const LC3PLUS_RTP_ERR lc3PlusRtpError ); -#endif #endif /* SPLIT_REND_WITH_HEAD_ROT */ #endif /* ISAR_LC3PLUS_COM_H */ diff --git a/lib_isar/isar_lc3plus_dec.c b/lib_isar/isar_lc3plus_dec.c index fd1adb157..5a82dc13c 100644 --- a/lib_isar/isar_lc3plus_dec.c +++ b/lib_isar/isar_lc3plus_dec.c @@ -42,26 +42,6 @@ #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -/*------------------------------------------------------------------------- - * isar_LC3PLUS_AllocateSubframeDecodingMatrix() - * - * - *------------------------------------------------------------------------*/ - -static void isar_LC3PLUS_DEC_FreeSubframeDecodingMatrix( - int16_t **subframeChannelMatrix ) -{ - for ( int16_t i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - free( subframeChannelMatrix[i] ); - } - - free( subframeChannelMatrix ); - - return; -} -#endif /*------------------------------------------------------------------------- @@ -78,37 +58,22 @@ ivas_error ISAR_LC3PLUS_DEC_Open( LC3PLUS_Error err; int32_t decoder_size; Word32 scratch_size; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t i; if ( 0 == config.lc3plus_frame_duration_us ) { return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid lc3plus_frame_duration_us (0)\n" ); } -#else - int16_t lc3plusFrameIdx; - int16_t numLC3plusFramesPerIvasFrame; - int16_t i; -#endif if ( ( *handle = malloc( sizeof( struct ISAR_LC3PLUS_DEC_HANDLE ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( config.channels > IVAS_LC3PLUS_MAX_NUM_DECODERS ) { return IVAS_ERROR( IVAS_ERR_INIT_ERROR, "Maximum number of channels exceeds IVAS_LC3PLUS_MAX_NUM_DECODERS\n" ); } -#else - - if ( 0 == config.lc3plus_frame_duration_us ) - { - return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid lc3plus_frame_duration_us (0)\n" ); - } - numLC3plusFramesPerIvasFrame = (int16_t) ( config.isar_frame_duration_us / config.lc3plus_frame_duration_us ); -#endif ( *handle )->num_decs = 0; @@ -168,11 +133,7 @@ ivas_error ISAR_LC3PLUS_DEC_Open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS err = lc3plus_dec_init( ( *handle )->handles[iCh], config.samplerate, 1, LC3PLUS_PLC_ADVANCED, config.high_res_mode_enabled ); -#else - err = lc3plus_dec_init( ( *handle )->handles[iCh], config.samplerate, 1, LC3PLUS_PLC_ADVANCED, 0 ); -#endif if ( LC3PLUS_OK != err ) { ISAR_LC3PLUS_DEC_Close( handle ); @@ -193,24 +154,10 @@ ivas_error ISAR_LC3PLUS_DEC_Open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - if ( ( ( *handle )->selective_decoding_states[iCh]->frame_actions = malloc( numLC3plusFramesPerIvasFrame * sizeof( SelectiveDecAction ) ) ) == NULL ) - { - ISAR_LC3PLUS_DEC_Close( handle ); - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); - } -#endif ( *handle )->selective_decoding_states[iCh]->has_skipped_a_frame = 0; ( *handle )->selective_decoding_states[iCh]->shall_decode_cached_frame = 0; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ( *handle )->selective_decoding_states[iCh]->frame_action = DEC_ACTION_DECODE_AND_USE; -#else - for ( lc3plusFrameIdx = 0; lc3plusFrameIdx < numLC3plusFramesPerIvasFrame; lc3plusFrameIdx++ ) - { - ( *handle )->selective_decoding_states[iCh]->frame_actions[lc3plusFrameIdx] = DEC_ACTION_DECODE_AND_USE; - } -#endif /* allocate and configure per LC3plus decoder bitstream cache */ if ( ( ( *handle )->bitstream_caches[iCh] = malloc( sizeof( ISAR_LC3PLUS_DEC_BITSTREAM_CACHE ) ) ) == NULL ) @@ -218,11 +165,7 @@ ivas_error ISAR_LC3PLUS_DEC_Open( ISAR_LC3PLUS_DEC_Close( handle ); return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus decoder\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ( *handle )->bitstream_caches[iCh]->bitstream_cache_capacity = 400 /*LC3plus max non-HR octet count*/; -#else - ( *handle )->bitstream_caches[iCh]->bitstream_cache_capacity = 400 /*LC3plus max non-HR octet count*/ * numLC3plusFramesPerIvasFrame; -#endif if ( ( ( *handle )->bitstream_caches[iCh]->bitstream_cache = malloc( ( *handle )->bitstream_caches[iCh]->bitstream_cache_capacity ) ) == NULL ) { ISAR_LC3PLUS_DEC_Close( handle ); @@ -254,155 +197,6 @@ ivas_error ISAR_LC3PLUS_DEC_Open( return IVAS_ERR_OK; } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -/*------------------------------------------------------------------------- - * ISAR_LC3PLUS_DEC_AllocateSubframeDecodingMatrix() - * - * - *------------------------------------------------------------------------*/ - -ivas_error ISAR_LC3PLUS_DEC_AllocateSubframeDecodingMatrix( - int16_t ***subframeChannelMatrix, - const uint32_t num_decs ) -{ - int16_t i; - - if ( ( *subframeChannelMatrix = malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( int16_t * ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "subframeChannelMatrix allocation failed\n" ); - } - - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - ( *subframeChannelMatrix )[i] = NULL; - } - - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - if ( ( ( *subframeChannelMatrix )[i] = malloc( num_decs * sizeof( int16_t ) ) ) == NULL ) - { - isar_LC3PLUS_DEC_FreeSubframeDecodingMatrix( *subframeChannelMatrix ); - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "subframeChannelMatrix allocation failed\n" ); - } - } - - return IVAS_ERR_OK; -} - - -/*------------------------------------------------------------------------- - * ISAR_LC3PLUS_DEC_SetSelectiveDecodingMatrix() - * - * - *------------------------------------------------------------------------*/ - -ivas_error ISAR_LC3PLUS_DEC_SetSelectiveDecodingMatrix( - ISAR_LC3PLUS_DEC_HANDLE handle, /* i : LC3plus decoder handle */ - int16_t *subframeChannelMatrix[MAX_PARAM_SPATIAL_SUBFRAMES] ) -{ - int16_t numIvasSubFramesPerLC3frame; - uint32_t decIdx; - int16_t ivasSubframeIdx; - int16_t effectiveIsarSubframeDuration; - int16_t actual_num_spatial_subframes; - - if ( NULL == handle ) - { - return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "ISAR_LC3PLUS_DEC_HANDLE is NULL\n" ); - } - - if ( NULL == subframeChannelMatrix ) - { - return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "subframeChannelMatrix is NULL\n" ); - } - - if ( handle->config.lc3plus_frame_duration_us == 0 || handle->config.isar_frame_duration_us % handle->config.lc3plus_frame_duration_us != 0 ) - { - return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "invalid isar_frame_duration_us/lc3plus_frame_duration_us values\n" ); - } - - effectiveIsarSubframeDuration = (int16_t) ( handle->config.isar_frame_duration_us == 20000 ? handle->config.isar_frame_duration_us / MAX_PARAM_SPATIAL_SUBFRAMES : handle->config.isar_frame_duration_us ); - numIvasSubFramesPerLC3frame = (int16_t) handle->config.lc3plus_frame_duration_us / effectiveIsarSubframeDuration; - actual_num_spatial_subframes = (int16_t) handle->config.isar_frame_duration_us / effectiveIsarSubframeDuration; - /* 0.5(0) = 10ms lc3plus, 5ms subframe */ - if ( numIvasSubFramesPerLC3frame != 1 ) - { - return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "Selective decoding is only implemented for aligned IVAS-Subframes & LC3plus \n" ); - } - - /* map subframeChannelMatrix to lc3plus skip states */ - /* 1st pass: Flag the required frames */ - for ( decIdx = 0; decIdx < handle->num_decs; decIdx++ ) - { - for ( ivasSubframeIdx = 0; ivasSubframeIdx < actual_num_spatial_subframes; ivasSubframeIdx++ ) - { - if ( 1 == subframeChannelMatrix[ivasSubframeIdx][decIdx] ) - { - /* subframe needed by the user, definitely decode */ - handle->selective_decoding_states[decIdx]->frame_actions[ivasSubframeIdx] = DEC_ACTION_DECODE_AND_USE; - } - else - { - - /* subframe not needed by the user, but might be required to re-initialize a decoder after inactivity */ - if ( - ( ivasSubframeIdx != actual_num_spatial_subframes - 1 ) && 1 == subframeChannelMatrix[ivasSubframeIdx + 1][decIdx] ) - { - /* ... but if the following subframe is required, it needs to be decoded and dropped */ - handle->selective_decoding_states[decIdx]->frame_actions[ivasSubframeIdx] = DEC_ACTION_DECODE_AND_DROP; - } - else - { - handle->selective_decoding_states[decIdx]->frame_actions[ivasSubframeIdx] = DEC_ACTION_SKIP; - } - } - } - } - - /* if a decoder was paused before, it needs to either: - * - Decode the cached frame (if available) and the first required frame OR - * - Decode the previous LC3plus subframe, even if it isn't needed by the user */ - for ( decIdx = 0; decIdx < handle->num_decs; decIdx++ ) - { - if ( handle->selective_decoding_states[decIdx]->has_skipped_a_frame ) - { - /* find the first frame required by the user */ - for ( ivasSubframeIdx = 0; ivasSubframeIdx < actual_num_spatial_subframes; ivasSubframeIdx++ ) - { - if ( DEC_ACTION_DECODE_AND_USE == handle->selective_decoding_states[decIdx]->frame_actions[ivasSubframeIdx] ) - { - /* The first required frame is the first subframe. To flush the decoder, the cached frame must be decoded and dropped */ - if ( 0 == ivasSubframeIdx ) - { - handle->selective_decoding_states[decIdx]->shall_decode_cached_frame = 1; - break; - } - /* The first required frame is not the first frame, so the cache is useless. Instead we decode & drop the previous frame*/ - else - { - handle->selective_decoding_states[decIdx]->frame_actions[ivasSubframeIdx - 1] = DEC_ACTION_DECODE_AND_DROP; - break; - } - } - } - } - } - - /* if a dec gets paused & caching is activated we need to flag the last useful LC3plus frame for caching */ - for ( decIdx = 0; decIdx < handle->num_decs; decIdx++ ) - { - for ( ivasSubframeIdx = 0; ivasSubframeIdx < actual_num_spatial_subframes; ivasSubframeIdx++ ) - { - if ( handle->selective_decoding_states[decIdx]->frame_actions[ivasSubframeIdx] == DEC_ACTION_SKIP && handle->selective_decoding_states[decIdx]->frame_actions[actual_num_spatial_subframes - 1] != DEC_ACTION_DECODE_AND_USE ) - { - handle->selective_decoding_states[decIdx]->frame_actions[actual_num_spatial_subframes - 1] = DEC_ACTION_CACHE; - } - } - } - - return IVAS_ERR_OK; -} -#endif /*------------------------------------------------------------------------- @@ -472,9 +266,6 @@ void ISAR_LC3PLUS_DEC_Close( if ( NULL != ( *handle )->selective_decoding_states && NULL != ( *handle )->selective_decoding_states[iDec] ) { -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - free( ( *handle )->selective_decoding_states[iDec]->frame_actions ); -#endif free( ( *handle )->selective_decoding_states[iDec] ); } @@ -559,17 +350,10 @@ static ivas_error isar_LC3PLUS_DEC_Decode_or_Conceal_internal( ) { uint32_t iDec; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int32_t config_num_media_times; int32_t iMediaTime; int32_t iFtd; LC3PLUS_RTP_PAYLOAD payload; -#else - int32_t iLc3plusFrame; - int32_t lc3framesPerIvasFrame; - int32_t bitstreamOffsetPerCoder; - uint8_t *bitstream_in_iter = bitstream_in; -#endif int32_t ivasSampleIndex; int16_t numSamplesPerLC3plusChannel; ivas_error err; @@ -600,7 +384,6 @@ static ivas_error isar_LC3PLUS_DEC_Decode_or_Conceal_internal( return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "isar_frame_duration_us must be equal or multiple of lc3plus_frame_duration_us \n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS config_num_media_times = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; if ( !badFrameIndicator ) { @@ -629,25 +412,13 @@ static ivas_error isar_LC3PLUS_DEC_Decode_or_Conceal_internal( return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "LC3plus config change (number of media times per frame data block) in bitstream is not supported\n" ); } } -#endif -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS numSamplesPerLC3plusChannel = (int16_t) ( handle->config.samplerate / ( 1000000 / handle->config.isar_frame_duration_us ) / config_num_media_times ); for ( iDec = 0; iDec < handle->num_decs; iDec++ ) { for ( iMediaTime = 0; iMediaTime < config_num_media_times; iMediaTime++ ) { iFtd = iDec + iMediaTime * handle->num_decs; -#else - lc3framesPerIvasFrame = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; - - numSamplesPerLC3plusChannel = (int16_t) ( handle->config.samplerate / ( 1000000 / handle->config.isar_frame_duration_us ) / lc3framesPerIvasFrame ); - bitstreamOffsetPerCoder = bitstream_in_size / handle->num_decs / lc3framesPerIvasFrame; - for ( iDec = 0; iDec < handle->num_decs; iDec++ ) - { - for ( iLc3plusFrame = 0; iLc3plusFrame < lc3framesPerIvasFrame; iLc3plusFrame++ ) - { -#endif if ( handle->selective_decoding_states[iDec]->shall_decode_cached_frame ) { if ( 0 == handle->bitstream_caches[iDec]->bitstream_cache_size ) @@ -670,27 +441,10 @@ static ivas_error isar_LC3PLUS_DEC_Decode_or_Conceal_internal( handle->bitstream_caches[iDec]->bitstream_cache_size = 0; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS switch ( handle->selective_decoding_states[iDec]->frame_action ) -#else - switch ( handle->selective_decoding_states[iDec]->frame_actions[iLc3plusFrame] ) -#endif { -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - case DEC_ACTION_DECODE_AND_DROP: - { - err = decode_or_conceal_one_lc3plus_frame( handle->handles[iDec], bitstream_in_iter, bitstreamOffsetPerCoder, &handle->pcm_conversion_buffer, badFrameIndicator, handle->scratch ); - if ( err != IVAS_ERR_OK ) - { - return IVAS_ERROR( err, "lc3plus decoding failed\n" ); - } - handle->selective_decoding_states[iDec]->has_skipped_a_frame = 0; - break; - } -#endif case DEC_ACTION_DECODE_AND_USE: { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( badFrameIndicator ) { err = decode_or_conceal_one_lc3plus_frame( handle->handles[iDec], bitstream_in, bitstream_in_size, &handle->pcm_conversion_buffer, badFrameIndicator, handle->scratch ); @@ -717,33 +471,9 @@ static ivas_error isar_LC3PLUS_DEC_Decode_or_Conceal_internal( } handle->selective_decoding_states[iDec]->has_skipped_a_frame = 0; break; -#else - err = decode_or_conceal_one_lc3plus_frame( handle->handles[iDec], bitstream_in_iter, bitstreamOffsetPerCoder, &handle->pcm_conversion_buffer, badFrameIndicator ); - if ( err != IVAS_ERR_OK ) - { - return IVAS_ERROR( err, "lc3plus decoding failed\n" ); - } - - for ( int32_t iSampleInt16 = 0; iSampleInt16 < numSamplesPerLC3plusChannel; iSampleInt16++ ) - { - ivasSampleIndex = iSampleInt16 + iLc3plusFrame * numSamplesPerLC3plusChannel; - pcm_out[iDec][ivasSampleIndex] = handle->pcm_conversion_buffer[iSampleInt16]; - } - handle->selective_decoding_states[iDec]->has_skipped_a_frame = 0; - break; -#endif - } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - case DEC_ACTION_SKIP: - { - /* log that this instance has skipped a frame and must decode twice once reactivated */ - handle->selective_decoding_states[iDec]->has_skipped_a_frame = 1; - break; } -#endif case DEC_ACTION_CACHE: { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( handle->bitstream_caches[iDec]->bitstream_cache_capacity < (int32_t) payload.ftds[iFtd].frame_data_length ) { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "bitstream_cache_capacity is too low for LC3plus frame size\n" ); @@ -754,41 +484,15 @@ static ivas_error isar_LC3PLUS_DEC_Decode_or_Conceal_internal( /* log that this instance has skipped a frame and must decode twice once reactivated */ handle->selective_decoding_states[iDec]->has_skipped_a_frame = 1; break; -#else - if ( handle->bitstream_caches[iDec]->bitstream_cache_capacity < bitstreamOffsetPerCoder ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "bitstream_cache_capacity is too low for LC3plus frame size\n" ); - } - /* store bit rate of cached frame */ - mvc2c( bitstream_in_iter, handle->bitstream_caches[iDec]->bitstream_cache, (int16_t) bitstreamOffsetPerCoder ); - handle->bitstream_caches[iDec]->bitstream_cache_size = bitstreamOffsetPerCoder; - /* log that this instance has skipped a frame and must decode twice once reactivated */ - handle->selective_decoding_states[iDec]->has_skipped_a_frame = 1; - break; -#endif } case DEC_ACTION_NUM_ENUMS: default: return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid LC3plus decoder state\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS } /* for each media time */ /* reset skipping state, must be set by the user before each decode call*/ handle->selective_decoding_states[iDec]->frame_action = DEC_ACTION_DECODE_AND_USE; } /* for each dec/channel */ -#else - - bitstream_in_iter += bitstreamOffsetPerCoder; - } - - /* reset skipping state, must be set by the user before each decode call*/ - for ( iLc3plusFrame = 0; iLc3plusFrame < lc3framesPerIvasFrame; iLc3plusFrame++ ) - { - handle->selective_decoding_states[iDec]->frame_actions[iLc3plusFrame] = DEC_ACTION_DECODE_AND_USE; - } - } - -#endif return IVAS_ERR_OK; } diff --git a/lib_isar/isar_lc3plus_dec.h b/lib_isar/isar_lc3plus_dec.h index 5e297a407..f946a6402 100644 --- a/lib_isar/isar_lc3plus_dec.h +++ b/lib_isar/isar_lc3plus_dec.h @@ -44,13 +44,7 @@ typedef enum { -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - DEC_ACTION_DECODE_AND_DROP = 0, -#endif DEC_ACTION_DECODE_AND_USE, -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - DEC_ACTION_SKIP, -#endif DEC_ACTION_CACHE, DEC_ACTION_NUM_ENUMS } SelectiveDecAction; @@ -60,13 +54,8 @@ typedef struct ISAR_LC3PLUS_DEC_SELECTIVE_DECODING_STATE { /*! indicates that the decoder has skipped one or more frames. This means it must decode two frames to flush algorithmic delay when re-activated */ int16_t has_skipped_a_frame; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /*! action to execute for the next frame */ SelectiveDecAction frame_action; -#else - /*! if set to 1, decoder will skip decoding for the next frame */ - SelectiveDecAction *frame_actions; -#endif /*! if set to 1, decoder will decode the cache before decoding any of current frames */ int16_t shall_decode_cached_frame; } ISAR_LC3PLUS_DEC_SELECTIVE_DECODING_STATE; @@ -104,13 +93,6 @@ void ISAR_LC3PLUS_DEC_Close( ISAR_LC3PLUS_DEC_HANDLE *handle /* i/o: pointer to decoder handle */ ); -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -/*! Sets a matrix[MAX_PARAM_SPATIAL_SUBFRAMES][numLC3plusDecoders] where all require subframes must be flagged with 1, frames that are not required with 0 */ -ivas_error ISAR_LC3PLUS_DEC_SetSelectiveDecodingMatrix( - ISAR_LC3PLUS_DEC_HANDLE handle, /* i : decoder handle */ - int16_t *subframeChannelMatrix[MAX_PARAM_SPATIAL_SUBFRAMES] /* i : */ -); -#endif ivas_error ISAR_LC3PLUS_DEC_Decode( ISAR_LC3PLUS_DEC_HANDLE handle, /* i : decoder handle */ @@ -124,13 +106,6 @@ ivas_error ISAR_LC3PLUS_DEC_Conceal( Word32 **pcm_out /* o : decoded samples */ ); -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -ivas_error ISAR_LC3PLUS_DEC_AllocateSubframeDecodingMatrix( - int16_t ***subframeChannelMatrix, - const uint32_t num_decs ); - -void isar_LC3PLUS_DEC_FreeSubframeDecodingMatrix( int16_t **subframeChannelMatrix ); -#endif #endif /* SPLIT_REND_WITH_HEAD_ROT */ #endif /* ISAR_LC3PLUS_DEC_H */ diff --git a/lib_isar/isar_lc3plus_enc.c b/lib_isar/isar_lc3plus_enc.c index 08ec7c0a8..1de448423 100644 --- a/lib_isar/isar_lc3plus_enc.c +++ b/lib_isar/isar_lc3plus_enc.c @@ -38,11 +38,8 @@ #include "wmc_auto.h" #include "options.h" -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS static const LC3PLUS_RTP_FDL s_fdl_request = LC3PLUS_RTP_FDL_NO_REQ_OR_NO_DATA; -#endif -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS static int32_t limit_per_channel_bitrate( LC3PLUS_CONFIG config, int32_t per_channel_bitrate ) { @@ -79,7 +76,6 @@ static int32_t limit_per_channel_bitrate( LC3PLUS_CONFIG config, assert( false && "unreachable" ); return -1; } -#endif #ifdef SPLIT_REND_WITH_HEAD_ROT /*-------------------------------------------------------------------* @@ -93,19 +89,9 @@ ivas_error ISAR_LC3PLUS_ENC_Open( ISAR_LC3PLUS_ENC_HANDLE *handle /* o : encoder handle */ ) { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int32_t num_lc3plus_media_times_per_ivas_frame; -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - int32_t lc3plus_num_bytes_per_frame; -#endif bool is_last_media_time, is_last_channel; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_error ivas_err; -#endif -#endif -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - int32_t bitsPerSecondPerChannel; -#endif Word32 scratch_size; int32_t encoder_size; LC3PLUS_Error err; @@ -118,10 +104,6 @@ ivas_error ISAR_LC3PLUS_ENC_Open( { return IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid number of channels\n" ); } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - bitsPerSecondPerChannel = bitsPerSecond / config.channels; -#endif -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( config.lc3plus_frame_duration_us != 2500 && config.lc3plus_frame_duration_us != 5000 && config.lc3plus_frame_duration_us != 10000 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid lc3plus_frame_duration_us\n" ); @@ -130,7 +112,6 @@ ivas_error ISAR_LC3PLUS_ENC_Open( { return IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid isar_frame_duration_us\n" ); } -#endif encoder_size = lc3plus_enc_get_size( config.samplerate, 1 ); if ( 0 == encoder_size ) { @@ -141,10 +122,8 @@ ivas_error ISAR_LC3PLUS_ENC_Open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus wrapper handle\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ( *handle )->config = config; ( *handle )->frame_type_descriptors = NULL; -#endif ( *handle )->pcm_conversion_buffer = NULL; ( *handle )->scratch = NULL; @@ -160,7 +139,6 @@ ivas_error ISAR_LC3PLUS_ENC_Open( ( *handle )->handles[i] = NULL; } ( *handle )->num_encs = config.channels; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS num_lc3plus_media_times_per_ivas_frame = config.isar_frame_duration_us / config.lc3plus_frame_duration_us; ( *handle )->fdl_request = s_fdl_request; ( *handle )->num_ftds = config.channels * num_lc3plus_media_times_per_ivas_frame; @@ -170,7 +148,6 @@ ivas_error ISAR_LC3PLUS_ENC_Open( ISAR_LC3PLUS_ENC_Close( handle ); return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus frame_type_descriptors\n" ); } -#endif for ( int32_t iCh = 0; iCh < config.channels; iCh++ ) { @@ -180,11 +157,7 @@ ivas_error ISAR_LC3PLUS_ENC_Open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus encoder\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS err = lc3plus_enc_init( ( *handle )->handles[iCh], config.samplerate, 1, config.high_res_mode_enabled, lfeChans ); -#else - err = lc3plus_enc_init( ( *handle )->handles[iCh], config.samplerate, 1, 0, lfeChans ); -#endif if ( err != LC3PLUS_OK ) { ISAR_LC3PLUS_ENC_Close( handle ); @@ -197,14 +170,6 @@ ivas_error ISAR_LC3PLUS_ENC_Open( ISAR_LC3PLUS_ENC_Close( handle ); return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_enc_set_frame_dms failed\n" ); } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - err = lc3plus_enc_set_bitrate( ( *handle )->handles[iCh], bitsPerSecondPerChannel ); - if ( err != LC3PLUS_OK ) - { - ISAR_LC3PLUS_ENC_Close( handle ); - return IVAS_ERROR( ISAR_LC3PLUS_LC3plusErrToIvasErr( err ), "lc3plus_enc_set_bitrate failed\n" ); - } -#endif } if ( config.isar_frame_duration_us < config.lc3plus_frame_duration_us || config.isar_frame_duration_us % config.lc3plus_frame_duration_us != 0 ) @@ -213,9 +178,6 @@ ivas_error ISAR_LC3PLUS_ENC_Open( return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "Current pcm_conversion_buffer sizing requires that lc3plus uses a shorter or equal frame duration than ivas\n" ); } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - ( *handle )->config = config; -#endif ( *handle )->pcm_conversion_buffer = malloc( sizeof( int16_t ) * config.samplerate * config.lc3plus_frame_duration_us / 1000000 ); if ( NULL == ( *handle )->pcm_conversion_buffer ) { @@ -223,24 +185,13 @@ ivas_error ISAR_LC3PLUS_ENC_Open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for LC3plus encoder wrapper pcm_conversion_buffer\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* update FDI fields */ for ( int32_t iMediaTime = 0; iMediaTime < num_lc3plus_media_times_per_ivas_frame; ++iMediaTime ) { for ( uint32_t iEnc = 0; iEnc < ( *handle )->num_encs; ++iEnc ) { int32_t ftd_index = iEnc + iMediaTime * ( *handle )->num_encs; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ( *handle )->frame_type_descriptors[ftd_index].frame_data_length = 0; /* will be set to the correct value in IVAS_LC3PLUS_ENC_SetBitrate */ -#else - lc3plus_num_bytes_per_frame = lc3plus_enc_get_num_bytes( ( *handle )->handles[iEnc] ); - if ( lc3plus_num_bytes_per_frame <= 0 ) - { - ISAR_LC3PLUS_ENC_Close( handle ); - return IVAS_ERROR( IVAS_ERR_INTERNAL, "lc3plus_enc_get_num_bytes reported invalid result failed\n" ); - } - ( *handle )->frame_type_descriptors[ftd_index].frame_data_length = lc3plus_num_bytes_per_frame; -#endif if ( 0 != LC3PLUS_RTP_ftd_bwr_from_samplerate( &( *handle )->frame_type_descriptors[ftd_index].bwr, config.samplerate, config.high_res_mode_enabled ) ) { ISAR_LC3PLUS_ENC_Close( handle ); @@ -277,15 +228,12 @@ ivas_error ISAR_LC3PLUS_ENC_Open( } } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_err = IVAS_LC3PLUS_ENC_SetBitrate( *handle, bitsPerSecond ); if ( ivas_err != IVAS_ERR_OK ) { ISAR_LC3PLUS_ENC_Close( handle ); return ivas_err; } -#endif -#endif scratch_size = lc3plus_enc_get_scratch_size( ( *handle )->handles[0] ); ( *handle )->scratch = malloc( sizeof( uint8_t ) * scratch_size ); IF( NULL == ( *handle )->scratch ) @@ -297,7 +245,6 @@ ivas_error ISAR_LC3PLUS_ENC_Open( return IVAS_ERR_OK; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /*-------------------------------------------------------------------* * Function IVAS_LC3PLUS_ENC_SetBitrate() * @@ -340,12 +287,10 @@ ivas_error IVAS_LC3PLUS_ENC_SetBitrate( } minPayloadOverhead = fdrLength + ( numSubframes * LC3PLUS_RTP_FTD_MIN_SIZE ); targetLc3PlusBitratePerChannel = ( availableOctetsPerIsarFrame - minPayloadOverhead ) / handle->config.channels * 8 * lc3plusPacketRate / numLc3plusMediaTimesPerIvasFrame; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( targetLc3PlusBitratePerChannel <= 0 ) { return IVAS_ERROR( IVAS_ERR_LC3PLUS_INVALID_BITRATE, "available LC3plus bitrate <= 0\n" ); } -#endif targetLc3PlusBitratePerChannel = limit_per_channel_bitrate( handle->config, targetLc3PlusBitratePerChannel ); targetLc3PlusOctetCount = targetLc3PlusBitratePerChannel / 8 / lc3plusPacketRate; /* check resulting octet count. If it requires larger than 1-byte length fields, decrease the bitrate by enough to make room for the additional length field */ @@ -394,7 +339,6 @@ ivas_error IVAS_LC3PLUS_ENC_SetBitrate( } return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -451,15 +395,11 @@ ivas_error ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( Word32 *bsSize /* o : size of each bitstream frame in bytes */ ) { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS LC3PLUS_RTP_ERR rtp_err; int32_t num_lc3plus_media_times_per_ivas_frame; int32_t iMediaTime; int32_t ftd_frame_data_length_size, lc3plus_frame_data_length; int32_t ftd_index; -#else - int32_t bitstreamSizeMultiplier; -#endif if ( NULL == handle ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3PLUS_Enc_Wrap_Handle is NULL\n" ); @@ -469,7 +409,6 @@ ivas_error ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "bsSize is NULL\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( 0 == handle->config.lc3plus_frame_duration_us ) { return IVAS_ERROR( IVAS_ERR_INIT_ERROR, "lc3plus_frame_duration_us is 0\n" ); @@ -480,9 +419,7 @@ ivas_error ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( } num_lc3plus_media_times_per_ivas_frame = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; -#endif *bsSize = 0; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int32_t fdl_request_length; rtp_err = LC3PLUS_RTP_frame_data_length_get_size( &fdl_request_length, handle->fdl_request ); if ( rtp_err != LC3PLUS_RTP_ERR_NO_ERROR ) @@ -490,14 +427,12 @@ ivas_error ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( return IVAS_ERROR( IVAS_ERR_WRONG_PARAMS, "Invalid LC3plus frame_data_length request\n" ); } *bsSize += fdl_request_length; -#endif for ( uint32_t iEnc = 0; iEnc < handle->num_encs; iEnc++ ) { if ( NULL == handle->handles[iEnc] ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "LC3plus encoder handle is NULL\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS lc3plus_frame_data_length = lc3plus_enc_get_num_bytes( handle->handles[iEnc] ); for ( iMediaTime = 0; iMediaTime < num_lc3plus_media_times_per_ivas_frame; ++iMediaTime ) { @@ -516,18 +451,6 @@ ivas_error ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( *bsSize += ftd_frame_data_length_size; } } -#else - *bsSize += lc3plus_enc_get_num_bytes( handle->handles[iEnc] ); - } - - if ( handle->config.isar_frame_duration_us % handle->config.lc3plus_frame_duration_us != 0 ) - { - return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "isar_frame_duration_us must be equal or multiple of lc3plus_frame_duration_us \n" ); - } - bitstreamSizeMultiplier = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; - - *bsSize *= bitstreamSizeMultiplier; -#endif return IVAS_ERR_OK; } @@ -547,12 +470,10 @@ void ISAR_LC3PLUS_ENC_Close( { return; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( NULL != ( *handle )->frame_type_descriptors ) { free( ( *handle )->frame_type_descriptors ); } -#endif for ( uint32_t iEnc = 0; iEnc < ( *handle )->num_encs; iEnc++ ) { if ( NULL != ( *handle )->handles[iEnc] ) @@ -587,22 +508,13 @@ void ISAR_LC3PLUS_ENC_Close( ivas_error ISAR_LC3PLUS_ENC_Encode( ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ Word32 **pcm_in, /* i : pointer input samples */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS void *bitstream_out, /* o : pointer to bitstream frame */ const Word32 bitstream_out_size, /* i : size of the bitstream_out buffer in bytes. Must be equal to ISAR_LC3PLUS_ENC_GetOutputBitstreamSize. */ -#else - void *bitstream_out /* o : pointer to bitstream frame */ -#endif Word16 q_in[16] ) { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int32_t ftdIndex; LC3PLUS_RTP_ERR rtpErr; uint32_t num_media_times; -#else - uint32_t lc3framesPerIvasFrame; - uint8_t *bitstream_out_iter = bitstream_out; -#endif uint32_t numSamplesPerLC3plusChannel; int32_t ivasSampleIndex; int32_t num_bytes = 0; @@ -627,7 +539,6 @@ ivas_error ISAR_LC3PLUS_ENC_Encode( { return IVAS_ERROR( IVAS_ERR_NOT_IMPLEMENTED, "isar_frame_duration_us must be equal or multiple of lc3plus_frame_duration_us \n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS num_media_times = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; numSamplesPerLC3plusChannel = handle->config.samplerate / ( 1000000 / handle->config.isar_frame_duration_us ) / num_media_times; @@ -637,39 +548,20 @@ ivas_error ISAR_LC3PLUS_ENC_Encode( { return IVAS_ERROR( IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( rtpErr ), "LC3PLUS_RTP_payload_serialize failed\n" ); } -#else - lc3framesPerIvasFrame = handle->config.isar_frame_duration_us / handle->config.lc3plus_frame_duration_us; - - numSamplesPerLC3plusChannel = handle->config.samplerate / ( 1000000 / handle->config.isar_frame_duration_us ) / lc3framesPerIvasFrame; -#endif for ( uint32_t iEnc = 0; iEnc < handle->num_encs; iEnc++ ) { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS for ( uint32_t iMediaTime = 0; iMediaTime < num_media_times; iMediaTime++ ) -#else - for ( uint32_t iLc3plusFrame = 0; iLc3plusFrame < lc3framesPerIvasFrame; iLc3plusFrame++ ) -#endif { for ( uint32_t iSampleInt16 = 0; iSampleInt16 < numSamplesPerLC3plusChannel; iSampleInt16++ ) { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivasSampleIndex = iSampleInt16 + iMediaTime * numSamplesPerLC3plusChannel; -#else - ivasSampleIndex = iSampleInt16 + iLc3plusFrame * numSamplesPerLC3plusChannel; -#endif handle->pcm_conversion_buffer[iSampleInt16] = (Word16) max( INT16_MIN, min( L_shr( pcm_in[iEnc][ivasSampleIndex], q_in[iEnc] ), INT16_MAX ) ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ftdIndex = iMediaTime * handle->num_encs + iEnc; -#endif num_bytes = 0; push_wmops( "lc3plus_enc16" ); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS err = lc3plus_enc16( handle->handles[iEnc], &handle->pcm_conversion_buffer, handle->frame_type_descriptors[ftdIndex].frame_data, &num_bytes, handle->scratch ); -#else - err = lc3plus_enc16( handle->handles[iEnc], &handle->pcm_conversion_buffer, bitstream_out_iter, &num_bytes, NULL ); -#endif pop_wmops(); if ( err != LC3PLUS_OK ) { @@ -679,15 +571,10 @@ ivas_error ISAR_LC3PLUS_ENC_Encode( { return IVAS_ERROR( IVAS_ERR_INTERNAL, "lc3plus_enc16 did not produce output\n" ); } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( num_bytes != (int32_t) handle->frame_type_descriptors[ftdIndex].frame_data_length ) { return IVAS_ERROR( IVAS_ERR_INTERNAL, "payload format and lc3plus enc bitrate are not aligned\n" ); } -#else - - bitstream_out_iter += num_bytes; -#endif } } diff --git a/lib_isar/isar_lc3plus_enc.h b/lib_isar/isar_lc3plus_enc.h index 6d0f47030..5487f712c 100644 --- a/lib_isar/isar_lc3plus_enc.h +++ b/lib_isar/isar_lc3plus_enc.h @@ -39,9 +39,7 @@ #include "lc3.h" #include "isar_lc3plus_common.h" #include "typedef.h" -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS #include "isar_lc3plus_payload.h" -#endif /* encoder wrapper */ typedef struct ISAR_LC3PLUS_ENC_HANDLE @@ -50,30 +48,22 @@ typedef struct ISAR_LC3PLUS_ENC_HANDLE LC3PLUS_Enc **handles; uint32_t num_encs; int16_t *pcm_conversion_buffer; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS LC3PLUS_RTP_FTD *frame_type_descriptors; int32_t num_ftds; LC3PLUS_RTP_FDL fdl_request; -#endif uint8_t *scratch; } * ISAR_LC3PLUS_ENC_HANDLE; ivas_error ISAR_LC3PLUS_ENC_Open( const LC3PLUS_CONFIG config, /* i : encoder configuration */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const uint32_t initialBitsPerSecond, /* i : initial target bit rate */ -#else - const uint32_t bitsPerSecond, /* i : bit rate */ -#endif ISAR_LC3PLUS_ENC_HANDLE *handle /* o : LC3plus encoder handle */ ); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_error IVAS_LC3PLUS_ENC_SetBitrate( ISAR_LC3PLUS_ENC_HANDLE handle, /* o : LC3plus encoder handle */ const uint32_t bitsPerSecond /* i : new target bit rate */ ); -#endif ivas_error ISAR_LC3PLUS_ENC_GetDelay( ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ @@ -92,12 +82,8 @@ void ISAR_LC3PLUS_ENC_Close( ivas_error ISAR_LC3PLUS_ENC_Encode( ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ Word32 **pcm_in, /* i : pointer input samples */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS void *bitstream_out, /* o : pointer to bitstream frame */ const Word32 bitstream_out_size, /* i : size of the bitstream_out buffer in bytes. Must be equal to ISAR_LC3PLUS_ENC_GetOutputBitstreamSize. */ -#else - void *bitstream_out /* o : pointer to bitstream frame */ -#endif Word16 q_in[16] ); #endif diff --git a/lib_isar/isar_lc3plus_payload.c b/lib_isar/isar_lc3plus_payload.c index cd053978d..54895c78b 100644 --- a/lib_isar/isar_lc3plus_payload.c +++ b/lib_isar/isar_lc3plus_payload.c @@ -37,7 +37,6 @@ #include "options.h" #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS static LC3PLUS_RTP_ERR s_frame_duration_ms_from_fdi( int32_t *frame_duration_us, const LC3PLUS_RTP_FTD_FDI fdi ) { if ( NULL == frame_duration_us ) @@ -819,5 +818,4 @@ LC3PLUS_RTP_ERR LC3PLUS_RTP_ftd_fdi_from_frame_duration_us( LC3PLUS_RTP_FTD_FDI return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; } -#endif /* ISAR_BITSTREAM_UPDATE_LC3PLUS */ #endif /* SPLIT_REND_WITH_HEAD_ROT */ diff --git a/lib_isar/isar_lc3plus_payload.h b/lib_isar/isar_lc3plus_payload.h index c225c9159..0eadc96a8 100644 --- a/lib_isar/isar_lc3plus_payload.h +++ b/lib_isar/isar_lc3plus_payload.h @@ -39,7 +39,6 @@ #include "options.h" #ifdef SPLIT_REND_WITH_HEAD_ROT -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* Implementation of the "B.2.6 Table of contents" part of the RTP payload format * for LC3plus as specified in ETSI TS 103 634. */ @@ -211,6 +210,5 @@ LC3PLUS_RTP_ERR LC3PLUS_RTP_payload_deserialize( uint8_t *serialized_buffer, const size_t serialized_buffer_size ); -#endif /* ISAR_BITSTREAM_UPDATE_LC3PLUS */ #endif /* #ifdef SPLIT_REND_WITH_HEAD_ROT */ #endif /* ISAR_LC3PLUS_PAYLOAD_H */ diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index b97b81bbc..6860dda91 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -321,12 +321,6 @@ void isar_set_split_rend_ht_setup_fx( Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3] ); -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -Word32 isar_get_lc3plus_bitrate( - const Word32 SplitRendBitRate, - const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, - const Word16 split_prerender_frame_size_ms ); -#endif ivas_error isar_split_rend_validate_config( const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, @@ -336,37 +330,25 @@ Word32 isar_get_lcld_bitrate( const Word32 SplitRendBitRate, const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode ); -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -Word8 isar_get_lc3plus_bitrate_id( - const Word32 SplitRendBitRate ); -#endif ivas_error splitRendLc3plusEncodeAndWrite( SPLIT_REND_WRAPPER *hSplitBin, ISAR_SPLIT_REND_BITS_HANDLE pBits, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const int32_t available_bits, -#else - const int32_t SplitRendBitRate, -#endif Word32 *in[], Word16 Q_sig ); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_error isar_framesize_to_ms( const IVAS_RENDER_FRAMESIZE frame_size, /* i : frame size enum */ Word16 *ms /* o : frame size in ms */ ); -#endif Word32 isar_get_split_rend_md_target_brate( const Word32 SplitRendBitRate, const Word16 pcm_out_flag ); ivas_error isar_split_rend_choose_default_codec( ISAR_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS Word16 *pIsar_frame_size_ms, /* i/o: pointer to isar frame size setting */ -#endif Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ @@ -385,12 +367,6 @@ Word16 wrap_a( Word16 val, const Word16 min_val, const Word16 max_val ); -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -Word32 isar_get_lc3plus_size_from_id( - const Word8 SplitRendBitRateId, - const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, - const Word16 split_prerender_frame_size_ms ); -#endif void isar_renderSplitUpdateNoCorrectionPoseData( const ISAR_SPLIT_REND_CONFIG_DATA *pSplit_rend_config, @@ -404,11 +380,7 @@ ivas_error split_renderer_open_lc3plus( SPLIT_REND_WRAPPER *hSplitRendWrapper, const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const Word32 OutSampleRate, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const IVAS_RENDER_FRAMESIZE ivas_frame_size -#else - const int16_t num_subframes -#endif ); ISAR_POST_REND_AudioConfigType isar_getAudioConfigType( @@ -421,9 +393,7 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( SPLIT_REND_WRAPPER *hSplitBin, const IVAS_QUATERNION headPosition, const Word32 SplitRendBitRate, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const Word16 isar_frame_size_ms, -#endif const Word16 codec_frame_size_ms, ISAR_SPLIT_REND_BITS_HANDLE pBits, const Word16 max_bands, diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index e5454e852..9b4e470cf 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -2679,51 +2679,32 @@ ivas_error split_renderer_open_lc3plus( SPLIT_REND_WRAPPER *hSplitRendWrapper, const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const Word32 OutSampleRate, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const IVAS_RENDER_FRAMESIZE isar_frame_size -#else - const int16_t num_subframes -#endif ) { ivas_error error; Word16 i, delayBufferLength; LC3PLUS_CONFIG config; -#if defined ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t isar_frame_size_ms; if ( ( error = isar_framesize_to_ms( isar_frame_size, &isar_frame_size_ms ) ) != IVAS_ERR_OK ) { return error; } -#endif -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* Check configuration validity */ if ( isar_frame_size_ms < pSplitRendConfig->codec_frame_size_ms ) { return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "SR codec frame doesn't fit in one output frame" ); } -#endif config.lc3plus_frame_duration_us = pSplitRendConfig->codec_frame_size_ms * 1000; -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - config.ivas_frame_duration_us = ( pSplitRendConfig->dof == 0 ) ? config.lc3plus_frame_duration_us * num_subframes : 20000; -#endif config.samplerate = OutSampleRate; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS config.isar_frame_duration_us = isar_frame_size_ms * 1000; -#endif -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS config.high_res_mode_enabled = ( pSplitRendConfig->lc3plus_highres != 0 ); -#endif config.channels = BINAURAL_CHANNELS; if ( ( error = ISAR_LC3PLUS_ENC_Open( config, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS isar_get_lcld_bitrate( pSplitRendConfig->splitRendBitRate, pSplitRendConfig->poseCorrectionMode ), -#else - isar_get_lc3plus_bitrate( pSplitRendConfig->splitRendBitRate, pSplitRendConfig->poseCorrectionMode, (int16_t) ( config.isar_frame_duration_us / 1000 ) ), -#endif &hSplitRendWrapper->hLc3plusEnc ) ) != IVAS_ERR_OK ) { return error; @@ -2781,13 +2762,7 @@ ivas_error split_renderer_open_lc3plus( ivas_error splitRendLc3plusEncodeAndWrite( SPLIT_REND_WRAPPER *hSplitBin, ISAR_SPLIT_REND_BITS_HANDLE pBits, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const int32_t available_bits, -#endif -#else - const int32_t SplitRendBitRate, -#endif Word32 *in[], Word16 Q_sig ) { @@ -2809,29 +2784,20 @@ ivas_error splitRendLc3plusEncodeAndWrite( channel_ptrs[i] = in[i]; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( ( error = IVAS_LC3PLUS_ENC_SetBitrate( hSplitBin->hLc3plusEnc, available_bits * FRAMES_PER_SEC ) ) != IVAS_ERR_OK ) { return error; } -#endif if ( ( error = ISAR_LC3PLUS_ENC_GetOutputBitstreamSize( hSplitBin->hLc3plusEnc, &lc3plusBitstreamSize ) ) != IVAS_ERR_OK ) { return error; } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - ISAR_SPLIT_REND_BITStream_write_int32( pBits, isar_get_lc3plus_bitrate_id( SplitRendBitRate ), 8 ); -#endif /* Write bitstream */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS set16_fx( Q_in, Q_sig, 16 ); move16(); if ( ( error = ISAR_LC3PLUS_ENC_Encode( hSplitBin->hLc3plusEnc, channel_ptrs, &pBits->bits_buf[pBits->bits_written / 8], lc3plusBitstreamSize, Q_in ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ISAR_LC3PLUS_ENC_Encode( hSplitBin->hLc3plusEnc, channel_ptrs, &pBits->bits_buf[pBits->bits_written / 8] ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -2840,9 +2806,7 @@ ivas_error splitRendLc3plusEncodeAndWrite( pBits->codec = ISAR_SPLIT_REND_CODEC_LC3PLUS; pBits->pose_correction = hSplitBin->multiBinPoseData.poseCorrectionMode; pBits->codec_frame_size_ms = (int16_t) ( hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us / 1000 ); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS pBits->isar_frame_size_ms = (int16_t) ( hSplitBin->hLc3plusEnc->config.isar_frame_duration_us / 1000 ); -#endif return IVAS_ERR_OK; } @@ -2856,9 +2820,7 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( SPLIT_REND_WRAPPER *hSplitBin, const IVAS_QUATERNION headPosition, const Word32 SplitRendBitRate, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const int16_t isar_frame_size_ms, -#endif const Word16 codec_frame_size_ms, ISAR_SPLIT_REND_BITS_HANDLE pBits, const Word16 max_bands, @@ -2870,11 +2832,7 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( const Word16 ro_md_flag ) { ivas_error error; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int32_t bit_len, available_bits, target_md_bits, tmp_32; -#else - Word32 bit_len, available_bits, target_md_bits, actual_md_bits, tmp_32; -#endif Word16 num_cldfb_bands, ch, slot_idx, pos_idx, num_poses; Word16 tmp, tmp_e; Word32 Cldfb_In_BinReal_fx[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] = { 0 }; @@ -2920,10 +2878,6 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( } } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - actual_md_bits = pBits->bits_written; - move32(); -#endif test(); test(); @@ -2997,9 +2951,6 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( tmp_32 = BASOP_Util_Divide3232_Scale_cadence( target_md_bits, 48000, &tmp_e ); target_md_bits = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - actual_md_bits = pBits->bits_written; -#endif /*scaling to max Q*/ Word16 scale_factor = 31; move32(); @@ -3037,34 +2988,20 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( tmp_e = 0; tmp_32 = BASOP_Util_Divide3232_Scale_cadence( available_bits, L_mult0( 16, FRAMES_PER_SEC ), &tmp_e ); available_bits = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS available_bits = L_sub( available_bits, pBits->bits_written ); -#else - actual_md_bits = L_sub( pBits->bits_written, actual_md_bits ); - available_bits = L_sub( available_bits, actual_md_bits ); -#endif pBits->codec_frame_size_ms = codec_frame_size_ms; move16(); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS pBits->isar_frame_size_ms = isar_frame_size_ms; move16(); -#endif isar_splitBinLCLDEncProcess( hSplitBin->hSplitBinLCLDEnc, Cldfb_In_BinReal_fx, Cldfb_In_BinImag_fx, available_bits, pBits, &q_final ); } ELSE { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, available_bits, in_fx, Q_in ) ) != IVAS_ERR_OK ) { return error; } -#else - IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, SplitRendBitRate, in_flt ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } } ELSE diff --git a/lib_isar/isar_splitRenderer_utils.c b/lib_isar/isar_splitRenderer_utils.c index daa4c1806..e8866f421 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -738,135 +738,6 @@ Word32 isar_get_lcld_bitrate( return -1; } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS -/*------------------------------------------------------------------------- - * Function isar_get_lc3plus_bitrate() - * - * - *------------------------------------------------------------------------*/ - -Word32 isar_get_lc3plus_bitrate( - const Word32 SplitRendBitRate, - ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, - const Word16 split_prerender_frame_size_ms ) -{ - IF( EQ_32( poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) ) - { - Word32 inBandMdBps = (Word32) ( 8 * 1000 / split_prerender_frame_size_ms ); - return L_sub( isar_get_lcld_bitrate( SplitRendBitRate, poseCorrectionMode ), inBandMdBps ); - } - - IF( EQ_32( poseCorrectionMode, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) - { - return SplitRendBitRate; - } - - /* Should not be reached */ - assert( 0 ); - return -1; -} - - -/*------------------------------------------------------------------------- - * Function isar_get_lc3plus_bitrate_id() - * - * - *------------------------------------------------------------------------*/ - -Word8 isar_get_lc3plus_bitrate_id( - const Word32 SplitRendBitRate ) -{ - SWITCH( SplitRendBitRate ) - { - case SPLIT_REND_768k: - { - return 4; - } - case SPLIT_REND_512k: - { - return 3; - } - case SPLIT_REND_384k: - { - return 2; - } - case SPLIT_REND_320k: - { - return 1; - } - case SPLIT_REND_256k: - { - return 0; - } - default: - { - BREAK; - } - } - - return -1; -} - - -/*------------------------------------------------------------------------- - * Function ivas_mat_mult_2by2_complex() - * - * - *------------------------------------------------------------------------*/ - -Word32 isar_get_lc3plus_size_from_id( - const Word8 SplitRendBitRateId, - const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, - const Word16 split_prerender_frame_size_ms ) -{ - Word32 bitrate; - - SWITCH( SplitRendBitRateId ) - { - case 4: - { - bitrate = SPLIT_REND_768k; - move32(); - BREAK; - } - case 3: - { - bitrate = SPLIT_REND_512k; - move32(); - BREAK; - } - case 2: - { - bitrate = SPLIT_REND_384k; - move32(); - BREAK; - } - case 1: - { - bitrate = SPLIT_REND_320k; - move32(); - BREAK; - } - case 0: - { - bitrate = SPLIT_REND_256k; - move32(); - BREAK; - } - default: - { - bitrate = -1; - move32(); - BREAK; - } - } - - bitrate = isar_get_lc3plus_bitrate( bitrate, poseCorrectionMode, split_prerender_frame_size_ms ); - - /* Return size in bytes */ - return (Word32) ( bitrate * split_prerender_frame_size_ms / 1000 / 8 ); -} -#endif /*------------------------------------------------------------------------- * Function isar_split_rend_validate_config() @@ -940,20 +811,9 @@ ivas_error isar_split_rend_validate_config( BREAK; case SPLIT_REND_384k: case SPLIT_REND_512k: -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS case SPLIT_REND_768k: -#endif /* Always valid */ BREAK; -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - case SPLIT_REND_768k: - test(); - IF( EQ_16( pSplitRendConfig->dof, 0 ) && EQ_32( pSplitRendConfig->codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "Bitrate is too high for LC3plus with 0 DOF" ); - } - BREAK; -#endif default: return IVAS_ERR_LC3PLUS_INVALID_BITRATE; } @@ -1408,7 +1268,6 @@ void isar_init_multi_bin_pose_data_fx_enc( return; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_error isar_framesize_to_ms( const IVAS_RENDER_FRAMESIZE frame_size, /* i : frame size enum */ int16_t *ms /* o : frame size in ms */ @@ -1431,7 +1290,6 @@ ivas_error isar_framesize_to_ms( return IVAS_ERR_OK; } -#endif /*------------------------------------------------------------------------- * Function isar_split_rend_choose_default_codec() @@ -1441,9 +1299,7 @@ ivas_error isar_framesize_to_ms( ivas_error isar_split_rend_choose_default_codec( ISAR_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t *pIsar_frame_size_ms, /* i/o: pointer to isar frame size setting */ -#endif Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ @@ -1480,12 +1336,10 @@ ivas_error isar_split_rend_choose_default_codec( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Unknown split codec value" ); } } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS IF( *pIsar_frame_size_ms == 0 ) /* isar frame size hasn't been set yet - use default for current configuration */ { *pIsar_frame_size_ms = 20; } -#endif return IVAS_ERR_OK; } diff --git a/lib_isar/lib_isar_post_rend.c b/lib_isar/lib_isar_post_rend.c index 82c01004e..30f24b2b2 100644 --- a/lib_isar/lib_isar_post_rend.c +++ b/lib_isar/lib_isar_post_rend.c @@ -81,18 +81,9 @@ typedef struct { const int32_t *pOutSampleRate; const AUDIO_CONFIG *pOutConfig; -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - const LSSETUP_CUSTOM_STRUCT *pCustomLsOut; - const EFAP_WRAPPER *pEfapOutWrapper; -#endif const ISAR_POST_REND_HeadRotData *pHeadRotData; -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - const RENDER_CONFIG_HANDLE *hhRendererConfig; -#endif const int16_t *pSplitRendBFI; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRenderConfig; -#endif } rendering_context; /* Common base for input structs */ @@ -215,10 +206,8 @@ static void convertBitsBufferToInternalBitsBuff( hBits->codec = outBits.config.codec; hBits->pose_correction = outBits.config.poseCorrection; hBits->codec_frame_size_ms = outBits.config.codec_frame_size_ms; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hBits->isar_frame_size_ms = outBits.config.isar_frame_size_ms; hBits->lc3plus_highres = outBits.config.lc3plusHighRes; -#endif return; } @@ -234,10 +223,8 @@ static void convertInternalBitsBuffToBitsBuffer( hOutBits->config.codec = bits.codec; hOutBits->config.poseCorrection = bits.pose_correction; hOutBits->config.codec_frame_size_ms = bits.codec_frame_size_ms; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hOutBits->config.isar_frame_size_ms = bits.isar_frame_size_ms; hOutBits->config.lc3plusHighRes = bits.lc3plus_highres; -#endif return; } @@ -463,9 +450,7 @@ static rendering_context getRendCtx( ctx.pOutSampleRate = &hIvasRend->sampleRateOut; ctx.pHeadRotData = &hIvasRend->headRotData; ctx.pSplitRendBFI = &hIvasRend->splitRendBFI; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ctx.pSplitRenderConfig = &hIvasRend->splitRenderConfig; -#endif return ctx; } @@ -488,10 +473,6 @@ static ivas_error updateSplitPostRendPanGains( input_split_post_rend *inputSplitPostRend, const AUDIO_CONFIG outConfig, ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - , - int16_t num_subframes -#endif ) { ivas_error error; @@ -504,30 +485,9 @@ static ivas_error updateSplitPostRendPanGains( rendCtx = inputSplitPostRend->base.ctx; isar_renderSplitGetMultiBinPoseData_fx( hRendCfg, &inputSplitPostRend->splitPostRendWrapper.multiBinPoseData, rendCtx.pHeadRotData->sr_pose_pred_axis ); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS config.high_res_mode_enabled = ( hRendCfg->lc3plus_highres != 0 ); -#endif config.lc3plus_frame_duration_us = hRendCfg->codec_frame_size_ms * 1000; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS config.isar_frame_duration_us = hRendCfg->isar_frame_size_ms * 1000; -#else - IF( NE_16( num_subframes, MAX_PARAM_SPATIAL_SUBFRAMES ) ) - { - IF( hRendCfg->codec == ISAR_SPLIT_REND_CODEC_LC3PLUS ) - { - config.ivas_frame_duration_us = ( hRendCfg->poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ? config.lc3plus_frame_duration_us * num_subframes : 20000; - } - ELSE - { - config.ivas_frame_duration_us = ( hRendCfg->poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ? config.lc3plus_frame_duration_us : 20000; - } - iNumLCLDIterationsPerFrame = 1; - } - ELSE - { - config.ivas_frame_duration_us = 20000; - } -#endif IF( GT_16( hRendCfg->codec_frame_size_ms, 0 ) ) { @@ -573,10 +533,6 @@ static ivas_error setRendInputActiveSplitPostRend( const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - , - const int16_t num_subframes -#endif ) { ivas_error error; @@ -598,10 +554,6 @@ static ivas_error setRendInputActiveSplitPostRend( inputSplitPostRend->numCachedSamples = 0; if ( ( error = updateSplitPostRendPanGains( inputSplitPostRend, outConfig, hRendCfg -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - , - num_subframes -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -929,10 +881,6 @@ ivas_error ISAR_POST_REND_AddInput( void *inputsArray; Word32 inputStructSize; ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, ISAR_SPLIT_REND_CONFIG_DATA * -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - , - int16_t -#endif ); Word32 inputIndex; @@ -962,10 +910,6 @@ ivas_error ISAR_POST_REND_AddInput( *inputId = makeInputId( inConfig, inputIndex ); if ( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, &hIvasRend->splitRenderConfig -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - , - hIvasRend->num_subframes -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -1159,9 +1103,7 @@ ivas_error ISAR_POST_REND_InitConfig( hIvasRend->splitRenderConfig.hq_mode = 0; hIvasRend->splitRenderConfig.codec_delay_ms = 0; hIvasRend->splitRenderConfig.codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hIvasRend->splitRenderConfig.isar_frame_size_ms = 0; /* 0 means "use default for selected codec" */ -#endif hIvasRend->splitRenderConfig.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; hIvasRend->splitRenderConfig.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; hIvasRend->splitRenderConfig.rendererSelection = ISAR_SPLIT_REND_RENDERER_SELECTION_DEFAULT; @@ -1194,9 +1136,7 @@ Word16 ISAR_POST_REND_GetRenderConfig( splitRenderConfig->hq_mode = 0; splitRenderConfig->codec_delay_ms = 0; splitRenderConfig->codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS splitRenderConfig->isar_frame_size_ms = 0; /* 0 means "use default for selected codec" */ -#endif splitRenderConfig->codec = ISAR_SPLIT_REND_CODEC_DEFAULT; splitRenderConfig->poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; splitRenderConfig->rendererSelection = hRCin.rendererSelection; @@ -1310,18 +1250,11 @@ static ivas_error splitBinLc3plusDecode( ISAR_SPLIT_POST_REND_WRAPPER *hSplitBin, ISAR_SPLIT_REND_BITS_HANDLE bits, Word32 outputBuffer[BINAURAL_CHANNELS][L_FRAME48k], -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - ISAR_SPLIT_REND_POSE_CORRECTION_MODE pose_correction, -#endif const int16_t SplitRendBFI ) { ivas_error error; Word32 *channel_ptrs[MAX_HEAD_ROT_POSES * 2]; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS Word32 lc3plusBitstreamSize; -#else - Word32 lc3plusBitrateId, lc3plusBitstreamSize; -#endif push_wmops( "splitBinLc3plusDecode" ); assert( hSplitBin->hLc3plusDec != NULL ); @@ -1338,15 +1271,9 @@ static ivas_error splitBinLc3plusDecode( { ++bits->bits_read; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* Size is in bytes */ assert( ( bits->bits_written - bits->bits_read ) % 8 == 0 ); lc3plusBitstreamSize = ( bits->bits_written - bits->bits_read ) / 8; -#else - /* Read LC3plus bitstream size info */ - lc3plusBitrateId = ISAR_SPLIT_REND_BITStream_read_int32( bits, 8 ); - lc3plusBitstreamSize = isar_get_lc3plus_size_from_id( (Word8) lc3plusBitrateId, pose_correction, (Word16) ( hSplitBin->hLc3plusDec->config.ivas_frame_duration_us / 1000 ) ); -#endif if ( ( error = ISAR_LC3PLUS_DEC_Decode( hSplitBin->hLc3plusDec, &bits->bits_buf[bits->bits_read / 8], lc3plusBitstreamSize, channel_ptrs ) ) != IVAS_ERR_OK ) { @@ -1394,9 +1321,6 @@ static ivas_error renderSplitBinauralWithPostRot( Word16 Q_cldfb_final[MAX_PARAM_SPATIAL_SUBFRAMES] = { 0 }; Word16 Q_out[MAX_PARAM_SPATIAL_SUBFRAMES][BINAURAL_CHANNELS] = { 0 }; -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - uint32_t ivas_frame_duration_us; -#endif Word16 iNumBlocksPerFrame, iNumLCLDIterationsPerFrame; const ISAR_POST_REND_HeadRotData *pHeadRotData; @@ -1404,24 +1328,15 @@ static ivas_error renderSplitBinauralWithPostRot( push_wmops( "renderSplitBinauralWithPostRot" ); error = IVAS_ERR_OK; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS if ( outAudio.config.numSamplesPerChannel / *splitBinInput->base.ctx.pOutSampleRate > splitBinInput->hBits->config.isar_frame_size_ms ) { return IVAS_ERR_INTERNAL_FATAL; } -#endif pHeadRotData = splitBinInput->base.ctx.pHeadRotData; hSplitBin = &splitBinInput->splitPostRendWrapper; convertBitsBufferToInternalBitsBuff( *splitBinInput->hBits, &bits ); -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - ivas_frame_duration_us = 20000; - if ( splitBinInput->splitPostRendWrapper.hLc3plusDec != NULL ) - { - ivas_frame_duration_us = splitBinInput->splitPostRendWrapper.hLc3plusDec->config.isar_frame_duration_us; - } -#endif iNumLCLDIterationsPerFrame = 1; iNumBlocksPerFrame = CLDFB_NO_COL_MAX; @@ -1466,13 +1381,7 @@ static ivas_error renderSplitBinauralWithPostRot( { isPostRendInputCldfb = 1; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS numSamplesPerChannelCacheSize = (int16_t) ( *splitBinInput->base.ctx.pOutSampleRate * bits.isar_frame_size_ms / 1000 ) - outBufNumSamplesPerChannel; -#else - preRendFrameSize_ms = (int16_t) ( ivas_frame_duration_us ) / 1000; - - numSamplesPerChannelCacheSize = (int16_t) ( *splitBinInput->base.ctx.pOutSampleRate * ( preRendFrameSize_ms - bits.codec_frame_size_ms ) / 1000 ); -#endif outBufNumColPerChannel = MAX_PARAM_SPATIAL_SUBFRAMES; numColPerChannelCacheSize = sub( DEPR_i_mult( iNumBlocksPerFrame, iNumLCLDIterationsPerFrame ), outBufNumColPerChannel ); @@ -1519,9 +1428,6 @@ static ivas_error renderSplitBinauralWithPostRot( Q_out[sf_idx][0] = 0; Q_out[sf_idx][1] = 0; if ( ( error = splitBinLc3plusDecode( hSplitBin, &bits, tmpCrendBuffer_fx, -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - bits.pose_correction, -#endif SplitRendBFI ) ) != IVAS_ERR_OK ) // Q0 { return error; @@ -1579,11 +1485,7 @@ static ivas_error renderSplitBinauralWithPostRot( copyBufferTo2dArray_fx( splitBinInput->base.inputBuffer, tmpCrendBuffer_fx ); IF( splitBinInput->numCachedSamples == 0 ) { -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS preRendFrameSize_ms = splitBinInput->base.ctx.pSplitRenderConfig->isar_frame_size_ms; -#else - preRendFrameSize_ms = (int16_t) ( ivas_frame_duration_us ) / 1000; -#endif numSamplesPerChannelCacheSize = (Word16) ( *splitBinInput->base.ctx.pOutSampleRate * preRendFrameSize_ms / 1000 ); numSamplesPerChannelCacheSize -= outAudio.config.numSamplesPerChannel; splitBinInput->numCachedSamples = numSamplesPerChannelCacheSize; @@ -1877,11 +1779,9 @@ ivas_error ISAR_REND_SetSplitRendBitstreamHeader( const ISAR_SPLIT_REND_CODEC codec, /* o: codec setting */ const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, /* o: pose correction mode */ const int16_t codec_frame_size_ms /* i: codec frame size setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , const int16_t isar_frame_size_ms, /* i: isar codec frame size setting */ const int16_t lc3plus_highres /* i: LC3plus Hig-Res setting. Ignored if codec is not LC3plus */ -#endif ) { IF( hIvasRend == NULL ) @@ -1889,14 +1789,10 @@ ivas_error ISAR_REND_SetSplitRendBitstreamHeader( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } hIvasRend->splitRenderConfig.codec = codec; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hIvasRend->splitRenderConfig.isar_frame_size_ms = isar_frame_size_ms; -#endif hIvasRend->splitRenderConfig.codec_frame_size_ms = codec_frame_size_ms; hIvasRend->splitRenderConfig.poseCorrectionMode = poseCorrection; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hIvasRend->splitRenderConfig.lc3plus_highres = lc3plus_highres; -#endif return IVAS_ERR_OK; } diff --git a/lib_isar/lib_isar_post_rend.h b/lib_isar/lib_isar_post_rend.h index ef437eaa3..b919bb1d2 100644 --- a/lib_isar/lib_isar_post_rend.h +++ b/lib_isar/lib_isar_post_rend.h @@ -61,10 +61,8 @@ typedef struct ISAR_SPLIT_REND_CODEC codec; ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection; int16_t codec_frame_size_ms; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int16_t isar_frame_size_ms; int16_t lc3plusHighRes; -#endif } ISAR_POST_REND_BitstreamBufferConfig; typedef struct @@ -200,11 +198,9 @@ ivas_error ISAR_REND_SetSplitRendBitstreamHeader( const ISAR_SPLIT_REND_CODEC codec, /* o: codec setting */ const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, /* o: pose correction mode */ const int16_t codec_frame_size_ms /* i: codec frame size setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , const int16_t isar_frame_size_ms, /* i: isar frame size setting */ const int16_t lc3plus_highres /* i: LC3plus Hig-Res setting. Ignored if codec is not LC3plus */ -#endif ); diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index fa3462fdc..55a306a40 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -83,11 +83,7 @@ ivas_error ISAR_PRE_REND_open( const Word32 OutSampleRate, const Word16 cldfb_in_flag, const Word16 pcm_out_flag, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const IVAS_RENDER_FRAMESIZE ivas_frame_size, /* i: IVAS frame size */ -#else - const int16_t num_subframes, /* i: number of subframes */ -#endif const int16_t mixed_td_cldfb_flag ) { ivas_error error, ch, num_ch; @@ -95,17 +91,11 @@ ivas_error ISAR_PRE_REND_open( Word16 cldfb_in_flag_local = cldfb_in_flag; if ( ( error = isar_split_rend_choose_default_codec( &( pSplitRendConfig->codec ), -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS &pSplitRendConfig->isar_frame_size_ms, -#endif &pSplitRendConfig->codec_frame_size_ms, cldfb_in_flag_local, pcm_out_flag, (int16_t) -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_frame_size -#else - num_subframes -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -192,11 +182,7 @@ ivas_error ISAR_PRE_REND_open( IF( EQ_16( pSplitRendConfig->codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) ) { if ( ( error = split_renderer_open_lc3plus( hSplitRendWrapper, pSplitRendConfig, OutSampleRate, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ivas_frame_size -#else - num_subframes -#endif ) ) != IVAS_ERR_OK ) { return error; @@ -323,9 +309,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( const IVAS_QUATERNION headPosition, const Word32 SplitRendBitRate, ISAR_SPLIT_REND_CODEC splitCodec, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const Word16 isar_frame_size_ms, /* i: ISAR framesize */ -#endif Word16 codec_frame_size_ms, ISAR_SPLIT_REND_BITS_HANDLE pBits, Word32 Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -340,11 +324,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( Word16 *Q_out ) { ivas_error error; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS int32_t bit_len, target_md_bits, available_bits, tmp_32; -#else - Word32 bit_len, target_md_bits, actual_md_bits, available_bits, tmp_32; -#endif Word16 q1 = 31, q2 = 31, q_final, Q_cldfb, tmp, tmp_e; Word16 i, j; error = IVAS_ERR_OK; @@ -369,9 +349,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( IF( EQ_16( cldfb_in_flag, 0 ) ) { error = isar_renderMultiTDBinToSplitBinaural( hSplitBin, headPosition, SplitRendBitRate, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS isar_frame_size_ms, -#endif codec_frame_size_ms, pBits, max_bands, pOutput_fx, Q_out[0], low_res_pre_rend_rot, pcm_out_flag, ro_md_flag ); Q_out[1] = Q_out[0]; @@ -390,16 +368,10 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( move16(); } -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - actual_md_bits = pBits->bits_written; -#endif IF( hSplitBin->multiBinPoseData.poseCorrectionMode == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB ) { target_md_bits = isar_get_split_rend_md_target_brate( SplitRendBitRate, pcm_out_flag ) * L_FRAME48k / 48000; -#ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS - actual_md_bits = pBits->bits_written; -#endif /*float2fix, to be removed*/ Word16 Q_Cldfb_re = 31, Q_Cldfb_im = 31; move16(); @@ -439,12 +411,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( tmp_e = 0; tmp_32 = BASOP_Util_Divide3232_Scale_cadence( available_bits, L_mult0( 16, FRAMES_PER_SEC ), &tmp_e ); available_bits = L_shr( tmp_32, sub( 31, tmp_e ) ); // Q0 -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS available_bits = L_sub( available_bits, pBits->bits_written ); -#else - actual_md_bits = L_sub( pBits->bits_written, actual_md_bits ); - available_bits = L_sub( available_bits, actual_md_bits ); -#endif pBits->codec_frame_size_ms = codec_frame_size_ms; q_final = sub( s_min( Q_buff_re, Q_buff_im ), 2 ); FOR( i = 0; i < hSplitBin->hSplitBinLCLDEnc->iChannels; i++ ) @@ -532,12 +499,8 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( } assert( Q_out[0] == Q_out[1] ); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, available_bits, pOutput_fx, Q_out[0] ) ) != IVAS_ERR_OK ) -#else - IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, SplitRendBitRate, pOutput_fx ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_isar/lib_isar_pre_rend.h b/lib_isar/lib_isar_pre_rend.h index a4d03e8a5..41843ec84 100644 --- a/lib_isar/lib_isar_pre_rend.h +++ b/lib_isar/lib_isar_pre_rend.h @@ -47,11 +47,7 @@ ivas_error ISAR_PRE_REND_open( const int32_t output_Fs, /* i: output sampling rate */ const int16_t cldfb_in_flag, /* i: Flag to indicate CLDFB or time doamin input */ const int16_t pcm_out_flag, /* i: Flag to indicate PCM output */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const IVAS_RENDER_FRAMESIZE ivas_frame_size, /* i: IVAS frame size */ -#else - const int16_t num_subframes, /* i: number of subframes */ -#endif const int16_t mixed_td_cldfb_flag /* i: Flag to indicate combined TD and CLDFB input */ ); @@ -71,9 +67,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( const IVAS_QUATERNION headPosition, /* i: head rotation QUATERNION */ const Word32 SplitRendBitRate, /* i: Split renderer bitrate */ ISAR_SPLIT_REND_CODEC splitCodec, /* i/o: Split renderer codec */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS const Word16 isar_frame_size_ms, /* i: ISAR framesize */ -#endif Word16 codec_frame_size_ms, /* i/o: Split renderer codec framesize */ ISAR_SPLIT_REND_BITS_HANDLE pBits, /* i/o: Split renderer bitstream handle */ Word32 Cldfb_In_BinReal_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i/o: CLDFB real buffer */ diff --git a/lib_rend/ivas_render_config_fx.c b/lib_rend/ivas_render_config_fx.c index 0ce576cb3..7f8e96d5c 100644 --- a/lib_rend/ivas_render_config_fx.c +++ b/lib_rend/ivas_render_config_fx.c @@ -146,10 +146,8 @@ ivas_error ivas_render_config_init_from_rom_fx( move16(); ( *hRenderConfig )->split_rend_config.codec_delay_ms = 0; move16(); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ( *hRenderConfig )->split_rend_config.isar_frame_size_ms = 20; move16(); -#endif ( *hRenderConfig )->split_rend_config.codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ move16(); ( *hRenderConfig )->split_rend_config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; @@ -158,10 +156,8 @@ ivas_error ivas_render_config_init_from_rom_fx( move32(); ( *hRenderConfig )->split_rend_config.rendererSelection = ISAR_SPLIT_REND_RENDERER_SELECTION_DEFAULT; move32(); -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS ( *hRenderConfig )->split_rend_config.lc3plus_highres = 0; move16(); -#endif #endif return IVAS_ERR_OK; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 9615a170d..b27c59852 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -65,10 +65,8 @@ typedef struct ISAR_SPLIT_REND_CODEC codec; ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection; Word16 codec_frame_size_ms; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS Word16 isar_frame_size_ms; Word16 lc3plus_highres; -#endif } IVAS_REND_BitstreamBufferConfig; typedef struct { @@ -292,10 +290,8 @@ ivas_error IVAS_REND_GetSplitRendBitstreamHeader( ISAR_SPLIT_REND_CODEC *pCodec, /* o: pointer to codec setting */ ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o: pointer to pose correction mode */ Word16 *pCodec_frame_size_ms /* o: pointer to codec frame size setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , Word16 *pIsar_frame_size_ms /* o: pointer to isar frame size setting */ -#endif ); #endif diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 562b35a6a..eb155a89f 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5014,17 +5014,13 @@ Word16 IVAS_REND_GetRenderConfig( hRCout->split_rend_config.dof = 3; hRCout->split_rend_config.hq_mode = 0; hRCout->split_rend_config.codec_delay_ms = 0; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hRCout->split_rend_config.isar_frame_size_ms = 20; -#endif hRCout->split_rend_config.codec_frame_size_ms = 0; /* 0 means "use default for selected codec" */ hRCout->split_rend_config.codec = ISAR_SPLIT_REND_CODEC_DEFAULT; hRCout->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; hRCout->split_rend_config.rendererSelection = hRCin->split_rend_config.rendererSelection; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hRCout->split_rend_config.lc3plus_highres = 0; #endif -#endif hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; @@ -9253,9 +9249,7 @@ static ivas_error getSamplesInternal( } if ( ( error = ISAR_PRE_REND_MultiBinToSplitBinaural( &hIvasRend->splitRendWrapper, hIvasRend->headRotData.headPositions[0], hIvasRend->hRendererConfig->split_rend_config.splitRendBitRate, hIvasRend->hRendererConfig->split_rend_config.codec, -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS hIvasRend->hRendererConfig->split_rend_config.isar_frame_size_ms, -#endif hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms, &bits, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, ( const int16_t )( ( BINAURAL_MAXBANDS * hIvasRend->sampleRateOut ) / 48000 ), tmpBinaural, 1, cldfb_in_flag, ( hIvasRend->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ? 1 : 0, ro_md_flag, Q_buff, &Q_out[0] ) ) != IVAS_ERR_OK ) { @@ -9355,10 +9349,8 @@ ivas_error IVAS_REND_GetSplitRendBitstreamHeader( ISAR_SPLIT_REND_CODEC *pCodec, /* o: pointer to codec setting */ ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o: pointer to pose correction mode */ int16_t *pCodec_frame_size_ms /* o: pointer to codec frame size setting */ -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , int16_t *pIsar_frame_size_ms /* o: pointer to isar frame size setting */ -#endif ) { if ( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL ) @@ -9367,9 +9359,7 @@ ivas_error IVAS_REND_GetSplitRendBitstreamHeader( } *pCodec = hIvasRend->hRendererConfig->split_rend_config.codec; *pCodec_frame_size_ms = hIvasRend->hRendererConfig->split_rend_config.codec_frame_size_ms; -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS *pIsar_frame_size_ms = hIvasRend->hRendererConfig->split_rend_config.isar_frame_size_ms; -#endif *poseCorrection = hIvasRend->hRendererConfig->split_rend_config.poseCorrectionMode; return IVAS_ERR_OK; } diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index dae55f18c..3c897cc43 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2486,7 +2486,6 @@ ivas_error RenderConfigReader_read( errorHandler( pValue, ERROR_VALUE_INVALID ); } } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS else if ( strcmp( item, "LC3PLUS_HIGHRES" ) == 0 ) { if ( !sscanf( pValue, "%hd", &hRenderConfig->split_rend_config.lc3plus_highres ) ) @@ -2494,7 +2493,6 @@ ivas_error RenderConfigReader_read( errorHandler( item, ERROR_VALUE_INVALID ); } } -#endif #ifdef DEBUGGING else { diff --git a/lib_util/split_render_file_read_write.c b/lib_util/split_render_file_read_write.c index 065300c10..c112863db 100644 --- a/lib_util/split_render_file_read_write.c +++ b/lib_util/split_render_file_read_write.c @@ -67,12 +67,10 @@ ivas_error split_rend_reader_open( ISAR_SPLIT_REND_CODEC *codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, int16_t *codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , int16_t *isar_frame_size_ms, int32_t *sampling_rate, int16_t *lc3plus_highres -#endif ) { SplitFileReadWrite *hSplitRendFileReadWrite; @@ -125,7 +123,6 @@ ivas_error split_rend_reader_open( { return IVAS_ERR_FAILED_FILE_READ; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* read isar bitstream frame size signalling */ if ( fread( isar_frame_size_ms, sizeof( *isar_frame_size_ms ), 1, hSplitRendFileReadWrite->file ) != 1 ) { @@ -141,7 +138,6 @@ ivas_error split_rend_reader_open( { return IVAS_ERR_FAILED_FILE_READ; } -#endif *hhSplitRendFileReadWrite = hSplitRendFileReadWrite; @@ -163,12 +159,10 @@ ivas_error split_rend_writer_open( ISAR_SPLIT_REND_CODEC codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, int16_t codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , const int16_t isar_frame_size_ms, const int32_t sampling_rate, const int16_t lc3plus_highres -#endif ) { SplitFileReadWrite *hSplitRendFileReadWrite; @@ -220,7 +214,6 @@ ivas_error split_rend_writer_open( { return IVAS_ERR_FAILED_FILE_WRITE; } -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS /* Write isar bit stream frame size signalling */ if ( fwrite( &isar_frame_size_ms, sizeof( isar_frame_size_ms ), 1, hSplitRendFileReadWrite->file ) != 1 ) { @@ -236,7 +229,6 @@ ivas_error split_rend_writer_open( { return IVAS_ERR_FAILED_FILE_WRITE; } -#endif *hhSplitRendFileReadWrite = hSplitRendFileReadWrite; diff --git a/lib_util/split_render_file_read_write.h b/lib_util/split_render_file_read_write.h index bdda7e598..125daf94e 100644 --- a/lib_util/split_render_file_read_write.h +++ b/lib_util/split_render_file_read_write.h @@ -45,12 +45,10 @@ ivas_error split_rend_reader_open( ISAR_SPLIT_REND_CODEC *codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, int16_t *codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , int16_t *isar_frame_size_ms, int32_t *sampling_rate, int16_t *lc3plus_highres -#endif ); @@ -63,12 +61,10 @@ ivas_error split_rend_writer_open( ISAR_SPLIT_REND_CODEC codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, int16_t codec_frame_size_ms -#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS , const int16_t isar_frame_size_ms, const int32_t sampling_rate, const int16_t lc3plus_highres -#endif ); -- GitLab From 363a89039256ac5b5e65d7402f80a5ebc0b3da56 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:31:04 +0200 Subject: [PATCH 0897/1310] [cleanup] accept SPLIT_REND_WITH_HEAD_ROT --- apps/decoder.c | 128 --- apps/isar_post_rend.c | 12 - apps/renderer.c | 150 --- lib_com/cnst.h | 5 - lib_com/common_api_types.h | 6 - lib_com/delay_comp_fx.c | 6 - lib_com/ivas_error.h | 6 - lib_com/ivas_prot_fx.h | 9 - lib_com/ivas_rotation_com.c | 2 - lib_com/options.h | 3 - lib_com/prot_fx.h | 2 - lib_dec/ivas_binRenderer_internal_fx.c | 172 ---- lib_dec/ivas_dirac_dec_fx.c | 80 -- lib_dec/ivas_init_dec_fx.c | 56 -- lib_dec/ivas_ism_dec_fx.c | 34 - lib_dec/ivas_ism_param_dec_fx.c | 13 - lib_dec/ivas_jbm_dec_fx.c | 103 -- lib_dec/ivas_masa_dec_fx.c | 44 - lib_dec/ivas_mc_param_dec_fx.c | 27 - lib_dec/ivas_mc_paramupmix_dec_fx.c | 29 - lib_dec/ivas_mct_dec_fx.c | 41 - lib_dec/ivas_objectRenderer_internal_fx.c | 2 - lib_dec/ivas_omasa_dec_fx.c | 14 - lib_dec/ivas_osba_dec_fx.c | 6 - lib_dec/ivas_output_config_fx.c | 28 - lib_dec/ivas_sba_dec_fx.c | 34 - lib_dec/ivas_spar_decoder_fx.c | 5 - lib_dec/ivas_stat_dec.h | 35 - lib_dec/lib_dec.h | 8 - lib_dec/lib_dec_fx.c | 48 - lib_enc/lib_enc_fx.c | 5 - lib_isar/isar_MSPred.c | 2 - lib_isar/isar_NoiseGen.c | 2 - lib_isar/isar_PerceptualModel.c | 2 - lib_isar/isar_PredDecoder.c | 2 - lib_isar/isar_PredEncoder.c | 2 - lib_isar/isar_RMSEnvGrouping.c | 2 - lib_isar/isar_cnst.h | 2 - lib_isar/isar_lc3plus_common.c | 2 - lib_isar/isar_lc3plus_common.h | 2 - lib_isar/isar_lc3plus_dec.c | 2 - lib_isar/isar_lc3plus_dec.h | 2 - lib_isar/isar_lc3plus_enc.c | 2 - lib_isar/isar_lc3plus_enc.h | 2 - lib_isar/isar_lc3plus_payload.c | 2 - lib_isar/isar_lc3plus_payload.h | 2 - lib_isar/isar_lcld_decoder.c | 2 - lib_isar/isar_lcld_encoder.c | 2 - lib_isar/isar_lcld_prot.h | 2 - lib_isar/isar_lcld_rom_tables.c | 2 - lib_isar/isar_prot.h | 2 - lib_isar/isar_rom_post_rend.c | 2 - lib_isar/isar_rom_post_rend.h | 2 - lib_isar/isar_splitRend_lcld_dec.c | 2 - lib_isar/isar_splitRend_lcld_enc.c | 2 - lib_isar/isar_splitRendererPLC.c | 2 - lib_isar/isar_splitRendererPost.c | 2 - lib_isar/isar_splitRendererPre.c | 2 - lib_isar/isar_splitRenderer_utils.c | 2 - lib_isar/isar_stat.h | 2 - lib_isar/lib_isar_post_rend.c | 9 - lib_isar/lib_isar_post_rend.h | 6 - lib_isar/lib_isar_pre_rend.c | 10 - lib_isar/lib_isar_pre_rend.h | 6 - lib_rend/ivas_crend_fx.c | 92 -- .../ivas_dirac_dec_binaural_functions_fx.c | 885 +----------------- lib_rend/ivas_orient_trk_fx.c | 8 - lib_rend/ivas_output_init_fx.c | 8 - lib_rend/ivas_prot_rend_fx.h | 20 - lib_rend/ivas_reflections_fx.c | 4 - lib_rend/ivas_render_config_fx.c | 2 - lib_rend/ivas_rotation_fx.c | 67 -- lib_rend/ivas_stat_rend.h | 28 - lib_rend/lib_rend.h | 10 - lib_rend/lib_rend_fx.c | 497 ---------- lib_util/render_config_reader.c | 8 - lib_util/rotation_file_reader.c | 8 - lib_util/split_rend_bfi_file_reader.c | 2 - lib_util/split_rend_bfi_file_reader.h | 2 - lib_util/split_render_file_read_write.c | 2 - lib_util/split_render_file_read_write.h | 2 - 81 files changed, 22 insertions(+), 2825 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 939f21aa7..b8d4c6596 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -43,9 +43,7 @@ #include "masa_file_writer.h" #include "render_config_reader.h" #include "rotation_file_reader.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "split_render_file_read_write.h" -#endif #include "vector3_pair_file_reader.h" #include "wmc_auto.h" #include "options.h" @@ -117,9 +115,7 @@ typedef struct Word16 non_diegetic_pan_gain_fx; /* Q15 */ bool renderConfigEnabled; char *renderConfigFilename; -#ifdef SPLIT_REND_WITH_HEAD_ROT char *outputMdFilename; -#endif IVAS_DEC_COMPLEXITY_LEVEL complexityLevel; bool tsmEnabled; IVAS_RENDER_FRAMESIZE renderFramesize; @@ -136,11 +132,7 @@ typedef struct static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); -#ifdef SPLIT_REND_WITH_HEAD_ROT static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -#else -static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -#endif static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); @@ -157,10 +149,8 @@ int main( bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ DecArguments arg; ivas_error error = IVAS_ERR_UNKNOWN; -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_BITS_DATA splitRendBits; uint8_t splitRendBitsBuf[ISAR_MAX_SPLIT_REND_BITS_BUFFER_SIZE_IN_BYTES]; -#endif /* Any handles that require cleanup must be declared here and initialized to NULL */ IVAS_DEC_HANDLE hIvasDec = NULL; @@ -185,9 +175,7 @@ int main( reset_mem( USE_BYTES ); #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT splitRendBits.bits_buf = splitRendBitsBuf; -#endif /*------------------------------------------------------------------------------------------* * Parse command-line arguments @@ -235,7 +223,6 @@ int main( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) { fprintf( stdout, "Output metadata file: %s\n", arg.outputWavFilename ); @@ -246,7 +233,6 @@ int main( fprintf( stdout, "Output metadata file: %s\n", arg.outputMdFilename ); } else -#endif { fprintf( stdout, "Output synthesis file: %s\n", arg.outputWavFilename ); } @@ -281,9 +267,7 @@ int main( { /* sanity check */ if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB -#ifdef SPLIT_REND_WITH_HEAD_ROT && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM -#endif ) { fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); @@ -385,10 +369,8 @@ int main( { /* sanity check */ if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB -#ifdef SPLIT_REND_WITH_HEAD_ROT && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM && arg.Opt_non_diegetic_pan == 0 -#endif ) { fprintf( stderr, "\nError: Renderer configuration file cannot be used in this output configuration.\n\n" ); @@ -425,7 +407,6 @@ int main( fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for decoding to EXT!\n" ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*------------------------------------------------------------------------------------------* * Configure Split rendering *------------------------------------------------------------------------------------------*/ @@ -447,7 +428,6 @@ int main( arg.enableHeadRotation = true; } -#endif /*------------------------------------------------------------------------------------------* * Configure VoIP mode @@ -473,7 +453,6 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM && arg.Opt_non_diegetic_pan == 0 ) @@ -481,13 +460,6 @@ int main( fprintf( stderr, "\nExternal Renderer Config is supported only when binaural output configurations is used as output OR when Split rendering mode is enabled. Exiting. \n" ); goto cleanup; } -#else - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - { - fprintf( stderr, "\nExternal Renderer Config is supported only for binaural output configurations. Exiting. \n\n" ); - goto cleanup; - } -#endif if ( ( error = IVAS_DEC_GetRenderConfig( hIvasDec, &renderConfig ) ) != IVAS_ERR_OK ) { @@ -513,7 +485,6 @@ int main( renderConfig.directivity_fx[i * 3 + 2] = (Word16) ( renderConfig.directivity[i * 3 + 2] * ( ( 1u << 15 ) - 1 ) ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { @@ -538,7 +509,6 @@ int main( fprintf( stderr, "\nChanged render framesize, only 20ms are allowed for non-0dof split rendering!\n" ); } } -#endif if ( arg.outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { @@ -557,11 +527,9 @@ int main( } renderConfig.roomAcoustics.override = true; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* ISAR frame size is set from command line, not renderer config file. * This will be ignored if output format is not split rendering. */ renderConfig.split_rend_config.isar_frame_size_ms = (int16_t) arg.renderFramesize /* given in number of 5ms subframes */ * 5; -#endif if ( ( error = IVAS_DEC_FeedRenderConfig( hIvasDec, renderConfig ) ) != IVAS_ERR_OK ) { @@ -791,11 +759,7 @@ int main( } else { -#ifdef SPLIT_REND_WITH_HEAD_ROT error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, &splitRendBits, hIvasDec, pcmBuf ); -#else - error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); -#endif } if ( error == IVAS_ERR_OK || error == IVAS_ERR_END_OF_FILE ) @@ -933,7 +897,6 @@ static IVAS_AUDIO_CONFIG cmdline2config( { output_config = IVAS_AUDIO_CONFIG_BINAURAL; } -#ifdef SPLIT_REND_WITH_HEAD_ROT else if ( strcmp( argv_to_upper, "BINAURAL_SPLIT_CODED" ) == 0 ) { output_config = IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED; @@ -942,7 +905,6 @@ static IVAS_AUDIO_CONFIG cmdline2config( { output_config = IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM; } -#endif else if ( strcmp( argv_to_upper, "BINAURAL_ROOM_IR" ) == 0 ) { output_config = IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR; @@ -1010,9 +972,7 @@ static bool parseCmdlIVAS_dec( arg->renderConfigFilename = NULL; arg->Opt_dpid_on = 0; -#ifdef SPLIT_REND_WITH_HEAD_ROT arg->outputMdFilename = NULL; -#endif arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192; arg->Opt_non_diegetic_pan = 0; @@ -1260,7 +1220,6 @@ static bool parseCmdlIVAS_dec( } i += 2; } -#ifdef SPLIT_REND_WITH_HEAD_ROT else if ( strcmp( argv_to_upper, "-OM" ) == 0 ) { arg->outputMdFilename = argv[i + 1]; @@ -1272,7 +1231,6 @@ static bool parseCmdlIVAS_dec( } i += 2; } -#endif else if ( strcmp( argv_to_upper, "-NON_DIEGETIC_PAN" ) == 0 ) { i++; @@ -1439,14 +1397,12 @@ static bool parseCmdlIVAS_dec( usage_dec(); return false; } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( arg->outputMdFilename != NULL && arg->outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { fprintf( stderr, "Error: Output split rendering metadata file is supported for BINAURAL_SPLIT_PCM output config. only\n\n" ); usage_dec(); return false; } -#endif } else { @@ -1523,13 +1479,8 @@ static void usage_dec( void ) fprintf( stdout, "Mandatory parameters:\n" ); fprintf( stdout, "---------------------\n" ); -#ifdef SPLIT_REND_WITH_HEAD_ROT fprintf( stdout, "OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA,\n" ); fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, BINAURAL_SPLIT_CODED, BINAURAL_SPLIT_PCM, EXT\n" ); -#else - fprintf( stdout, "OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA,\n" ); - fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, EXT\n" ); -#endif fprintf( stdout, " By default, channel order and loudspeaker positions are equal to the\n" ); fprintf( stdout, " encoder. For loudspeaker outputs, OutputConf can be a custom loudspeaker\n" ); fprintf( stdout, " layout file. See readme.txt for details.\n" ); @@ -1569,9 +1520,7 @@ static void usage_dec( void ) fprintf( stdout, "-rvf File : Reference vector specified by external trajectory File\n" ); fprintf( stdout, " works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes\n" ); fprintf( stdout, "-render_config File : Renderer configuration File\n" ); -#ifdef SPLIT_REND_WITH_HEAD_ROT fprintf( stdout, "-om File : Metadata output File for BINAURAL_SPLIT_PCM OutputConf (only for Fs = 48 kHz)\n" ); -#endif fprintf( stdout, "-non_diegetic_pan P : panning mono non-diegetic sound to stereo with paning P, -90<= P <=90,\n" ); fprintf( stdout, " left or l or 90->left, right or r or -90->right, center or c or 0->middle\n" ); fprintf( stdout, "-exof File : External orientation File for external orientation trajectory\n" ); @@ -1601,12 +1550,8 @@ static ivas_error initOnFirstGoodFrame( IVAS_DEC_HANDLE hIvasDec, /* i/o: */ const DecArguments arg, /* i : */ const int16_t numInitialBadFrames, /* i : */ -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t *numOutSamples, /* i/o: */ int16_t *vec_pos_len, /* i/o: */ -#else - const uint16_t numOutSamples, /* i : */ -#endif int16_t *pFullDelayNumSamples, /* o : */ int16_t *pRemainingDelayNumSamples, /* o : */ int32_t *delayTimeScale, /* o : */ @@ -1615,12 +1560,8 @@ static ivas_error initOnFirstGoodFrame( MasaFileWriter **ppMasaWriter, /* o : */ IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], /* o : */ int16_t *pNumOutChannels, /* o : */ -#ifdef SPLIT_REND_WITH_HEAD_ROT uint16_t *pNumObj, /* o : */ SplitFileReadWrite **splitRendWriter -#else - uint16_t *pNumObj /* o : */ -#endif ) { ivas_error error = IVAS_ERR_UNKNOWN; @@ -1632,12 +1573,10 @@ static ivas_error initOnFirstGoodFrame( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( IVAS_DEC_is_split_rendering_enabled( hIvasDec ) ) { pFullDelayNumSamples[0] = 0; } -#endif if ( !arg.delayCompensationEnabled ) { @@ -1659,7 +1598,6 @@ static ivas_error initOnFirstGoodFrame( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( IVAS_DEC_is_split_rendering_enabled( hIvasDec ) ) { /* Open split rendering metadata writer */ @@ -1738,23 +1676,19 @@ static ivas_error initOnFirstGoodFrame( if ( IVAS_DEC_is_split_rendering_coded_out( hIvasDec ) == 0 ) { -#endif /* Open audio writer and write all previously skipped bad frames now that frame size is known */ if ( ( error = AudioFileWriter_open( ppAfWriter, arg.outputWavFilename, arg.output_Fs, *pNumOutChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to open output file %s\n", arg.outputWavFilename ); return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif int16_t *zeroBuf = malloc( pcmFrameSize * sizeof( int16_t ) ); memset( zeroBuf, 0, pcmFrameSize * sizeof( int16_t ) ); for ( int16_t i = 0; i < numInitialBadFrames; ++i ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( *splitRendWriter != NULL ) { ISAR_SPLIT_REND_BITS_DATA splitRendBitsZero; @@ -1775,19 +1709,10 @@ static ivas_error initOnFirstGoodFrame( } else { -#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( *pRemainingDelayNumSamples < *numOutSamples ) -#else - if ( *pRemainingDelayNumSamples < numOutSamples ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, *numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK ) -#else - if ( ( error = AudioFileWriter_write( *ppAfWriter, zeroBuf, numOutSamples * *pNumOutChannels - ( *pRemainingDelayNumSamples * *pNumOutChannels ) ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nOutput audio file writer error\n" ); return error; @@ -1796,15 +1721,9 @@ static ivas_error initOnFirstGoodFrame( } else { -#ifdef SPLIT_REND_WITH_HEAD_ROT *pRemainingDelayNumSamples -= *numOutSamples; -#else - *pRemainingDelayNumSamples -= numOutSamples; -#endif } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif } free( zeroBuf ); @@ -1890,7 +1809,6 @@ static ivas_error initOnFirstGoodFrame( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( *splitRendWriter != NULL ) { if ( numOutSamples == NULL || vec_pos_len == NULL ) @@ -1910,7 +1828,6 @@ static ivas_error initOnFirstGoodFrame( return error; } } -#endif return IVAS_ERR_OK; } @@ -1929,9 +1846,7 @@ static ivas_error decodeG192( RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_BITS_DATA *splitRendBits, -#endif IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ) @@ -1958,9 +1873,7 @@ static ivas_error decodeG192( IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES] = { { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 } }; int16_t vec_pos_update, vec_pos_len; -#ifdef SPLIT_REND_WITH_HEAD_ROT SplitFileReadWrite *splitRendWriter = NULL; -#endif for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) { @@ -2058,7 +1971,6 @@ static ivas_error decodeG192( { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( headRotReader == NULL ) { for ( i = 0; i < num_subframes; i++ ) @@ -2076,7 +1988,6 @@ static ivas_error decodeG192( } else { -#endif for ( i = 0; i < num_subframes; i++ ) { if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) @@ -2085,17 +1996,11 @@ static ivas_error decodeG192( goto cleanup; } } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif for ( i = 0; i < num_subframes; i++ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i, DEFAULT_AXIS ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -2154,7 +2059,6 @@ static ivas_error decodeG192( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( IVAS_DEC_is_split_rendering_enabled( hIvasDec ) ) { if ( ( error = IVAS_DEC_GetSplitBinauralBitstream( hIvasDec, (Word16 *) ( pcmBuf + nOutChannels * nSamplesRendered ), splitRendBits, &nSamplesRendered_loop, &needNewFrame ) ) != IVAS_ERR_OK ) @@ -2168,7 +2072,6 @@ static ivas_error decodeG192( } else { -#endif if ( ( error = IVAS_DEC_GetSamples( hIvasDec, nSamplesToRender, ( pcmBuf + nOutChannels * nSamplesRendered ), &nSamplesRendered_loop, &needNewFrame ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -2176,9 +2079,7 @@ static ivas_error decodeG192( } nSamplesRendered += nSamplesRendered_loop; nSamplesToRender -= nSamplesRendered_loop; -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif if ( needNewFrame ) { @@ -2209,11 +2110,7 @@ static ivas_error decodeG192( /* Once good frame decoded, catch up */ if ( decodedGoodFrame ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, &vec_pos_len, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj, &splitRendWriter ) ) != IVAS_ERR_OK ) -#else - if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, nOutSamples, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj ) ) != IVAS_ERR_OK ) -#endif { goto cleanup; } @@ -2227,7 +2124,6 @@ static ivas_error decodeG192( /* Write current frame */ if ( decodedGoodFrame ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( IVAS_DEC_is_split_rendering_enabled( hIvasDec ) ) { if ( split_rend_write_bitstream_to_file( splitRendWriter, splitRendBits->bits_buf, &splitRendBits->bits_read, &splitRendBits->bits_written ) != IVAS_ERR_OK ) @@ -2239,7 +2135,6 @@ static ivas_error decodeG192( if ( IVAS_DEC_is_split_rendering_coded_out( hIvasDec ) == 0 ) { -#endif if ( delayNumSamples < nOutSamples ) { if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) @@ -2253,9 +2148,7 @@ static ivas_error decodeG192( { delayNumSamples -= nOutSamples; } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif } /* Write ISm metadata to external file(s) */ @@ -2369,11 +2262,7 @@ static ivas_error decodeG192( goto cleanup; } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0, DEFAULT_AXIS ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternion, Pos[0], 0 ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -2493,18 +2382,14 @@ static ivas_error decodeG192( *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( afWriter != NULL ) { -#endif if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); goto cleanup; } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif /*------------------------------------------------------------------------------------------* * Close files and deallocate resources @@ -2514,9 +2399,7 @@ static ivas_error decodeG192( cleanup: -#ifdef SPLIT_REND_WITH_HEAD_ROT split_rend_reader_writer_close( &splitRendWriter ); -#endif AudioFileWriter_close( &afWriter ); MasaFileWriter_close( &masaWriter ); for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) @@ -2763,7 +2646,6 @@ static ivas_error decodeVoIP( { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( headRotReader == NULL ) { for ( i = 0; i < num_subframes; i++ ) @@ -2781,7 +2663,6 @@ static ivas_error decodeVoIP( } else { -#endif for ( i = 0; i < num_subframes; i++ ) { if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) @@ -2791,17 +2672,13 @@ static ivas_error decodeVoIP( goto cleanup; } } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif for ( i = 0; i < num_subframes; i++ ) { if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i -#ifdef SPLIT_REND_WITH_HEAD_ROT , DEFAULT_AXIS -#endif ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -2929,15 +2806,10 @@ static ivas_error decodeVoIP( /* Once good frame decoded, catch up */ if ( decodedGoodFrame ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT SplitFileReadWrite *splitRendWriter = NULL; if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, &nOutSamples, NULL, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj, &splitRendWriter ) ) != IVAS_ERR_OK ) -#else - if ( ( error = initOnFirstGoodFrame( hIvasDec, arg, numInitialBadFrames, nOutSamples, delayNumSamples_orig, &delayNumSamples, &delayTimeScale, - &bsFormat, &afWriter, &masaWriter, ismWriters, &nOutChannels, &numObj ) ) != IVAS_ERR_OK ) -#endif { goto cleanup; } diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c index 1e041c175..e7fd6a05a 100644 --- a/apps/isar_post_rend.c +++ b/apps/isar_post_rend.c @@ -33,17 +33,6 @@ #include "lib_isar_post_rend.h" //#undef IVAS_FLOAT_FIXED -#ifndef SPLIT_REND_WITH_HEAD_ROT - -int main( int argc, char **argv ) -{ - (void) argc; - (void) argv; - ISAR_POST_REND_void_func(); - return 0; -} - -#else #include #include @@ -1242,4 +1231,3 @@ int main( #undef WMC_TOOL_SKIP -#endif /* SPLIT_REND_WITH_HEAD_ROT */ diff --git a/apps/renderer.c b/apps/renderer.c index 0d96f9dea..5ef8cca19 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -45,10 +45,8 @@ #include "masa_file_writer.h" #include "render_config_reader.h" #include "rotation_file_reader.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "split_render_file_read_write.h" #include "split_rend_bfi_file_reader.h" -#endif #include "vector3_pair_file_reader.h" #include "wmc_auto.h" @@ -155,13 +153,9 @@ typedef struct OutputConfig outConfig; char inMetadataFilePaths[RENDERER_MAX_ISM_INPUTS][RENDERER_MAX_CLI_ARG_LENGTH]; int16_t numInMetadataFiles; -#ifdef SPLIT_REND_WITH_HEAD_ROT char outMetadataFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; -#endif char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; -#ifdef SPLIT_REND_WITH_HEAD_ROT char splitRendBFIFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; -#endif char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char externalOrientationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; @@ -208,10 +202,8 @@ typedef enum CmdLnOptionId_inputMetadata, CmdLnOptionId_listFormats, CmdLnOptionId_inputGain, -#ifdef SPLIT_REND_WITH_HEAD_ROT CmdLnOptionId_outputMetadata, CmdLnOptionId_SplitRendBFIFile, -#endif CmdLnOptionId_referenceVectorFile, CmdLnOptionId_exteriorOrientationFile, CmdLnOptionId_framing, @@ -237,11 +229,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_inputMetadata, .match = "input_metadata", .matchShort = "im", -#ifdef SPLIT_REND_WITH_HEAD_ROT .description = "Space-separated list of path to metadata files for ISM or MASA inputs or BINAURAL_SPLIT_PCM input mode", -#else - .description = "Space-separated list of path to metadata files for ISM or MASA inputs", -#endif }, { .id = CmdLnOptionId_outputFile, @@ -267,7 +255,6 @@ static const CmdLnParser_Option cliOptions[] = { .matchShort = "T", .description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", }, -#ifdef SPLIT_REND_WITH_HEAD_ROT { .id = CmdLnOptionId_outputMetadata, .match = "output_metadata", @@ -280,7 +267,6 @@ static const CmdLnParser_Option cliOptions[] = { .matchShort = "prbfi", .description = "Split rendering option: bfi file", }, -#endif { .id = CmdLnOptionId_refRotFile, .match = "reference_rotation_file", @@ -438,44 +424,26 @@ static void printSupportedAudioConfigs( void ); static IVAS_AUDIO_CONFIG parseAudioConfig( const char *configString ); -#ifdef SPLIT_REND_WITH_HEAD_ROT static void convertOutputBuffer_fx( const Word32 *Word32Buffer, const Word16 numSamplesPerChannel, const Word16 numChannels, -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 *intBuffer, const Word16 cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbSyn, Word16 out_q -#else - Word16 *intBuffer, - Word16 out_q -#endif ); static void convertInputBuffer_fx( const Word16 *intBuffer, const Word16 numIntSamplesPerChannel, const Word16 numFloatSamplesPerChannel, const Word16 numChannels, -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 *Word32Buffer, Word16 in_q_factor, const int16_t cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbAna, Word16 *out_q_factor -#else - Word32 *Word32Buffer, - Word16 in_q_factor -#endif ); -#else -static void convertInputBuffer( const int16_t *intBuffer, const int16_t numIntSamplesPerChannel, const int16_t numFloatSamplesPerChannel, const int16_t numChannels, float *floatBuffer ); - -static void convertOutputBuffer( const float *floatBuffer, const int16_t numSamplesPerChannel, const int16_t numChannels, int16_t *intBuffer ); -static void convertOutputBuffer_fx( const Word32 *Word32Buffer, const Word16 numSamplesPerChannel, const Word16 numChannels, Word16 *intBuffer, Word16 q_factor ); -static void convertInputBuffer_fx( const Word16 *intBuffer, const Word16 numIntSamplesPerChannel, const Word16 numFloatSamplesPerChannel, const Word16 numChannels, Word32 *Int32Buffer, Word16 in_q_factor ); -#endif /*------------------------------------------------------------------------------------------* @@ -702,7 +670,6 @@ static float dBToLin( } -#ifdef SPLIT_REND_WITH_HEAD_ROT static int16_t get_cldfb_in_flag( const IVAS_AUDIO_CONFIG audioConfig, const IVAS_RENDER_CONFIG_DATA *renderConfig ) @@ -737,7 +704,6 @@ static int16_t is_split_pre_rend_mode( return flag; } -#endif /*------------------------------------------------------------------------------------------* @@ -754,12 +720,10 @@ int main( RotFileReader *headRotReader = NULL; RotFileReader *externalOrientationFileReader = NULL; RotFileReader *referenceRotReader = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT IVAS_CLDFB_FILTER_BANK_HANDLE cldfbAna[IVAS_MAX_INPUT_CHANNELS]; IVAS_CLDFB_FILTER_BANK_HANDLE cldfbSyn[IVAS_MAX_INPUT_CHANNELS]; int16_t cldfb_in_flag, CLDFBframeSize_smpls; SplitRendBFIFileReader *splitRendBFIReader = NULL; -#endif Vector3PairFileReader *referenceVectorReader = NULL; hrtfFileReader *hrtfFileReader = NULL; IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; @@ -780,9 +744,7 @@ int main( AudioFileWriter *audioWriter; int32_t inBufferSize; int32_t outBufferSize; -#ifdef SPLIT_REND_WITH_HEAD_ROT int32_t bitsBufferSize; -#endif int16_t *inpInt16Buffer; float *inFloatBuffer; int16_t *outInt16Buffer; @@ -790,17 +752,13 @@ int main( Word32 *inInt32Buffer; Word32 gain_fx; float *outFloatBuffer; -#ifdef SPLIT_REND_WITH_HEAD_ROT uint8_t *bitsBufferData = NULL; -#endif IVAS_REND_AudioBuffer inBuffer; IVAS_REND_AudioBuffer outBuffer; -#ifdef SPLIT_REND_WITH_HEAD_ROT IVAS_REND_BitstreamBuffer bitsBuffer; SplitFileReadWrite *hSplitRendFileReadWrite; int16_t delayNumSamples_temp; int32_t delayTimeScale_temp; -#endif int16_t numSamplesRead; int16_t delayNumSamples = -1; int16_t delayNumSamples_orig = 0; @@ -821,7 +779,6 @@ int main( hMasaMetadata[i] = NULL; } -#ifdef SPLIT_REND_WITH_HEAD_ROT hSplitRendFileReadWrite = NULL; CLDFBframeSize_smpls = 0; cldfb_in_flag = 0; @@ -834,7 +791,6 @@ int main( bitsBuffer.config.codec_frame_size_ms = 5; bitsBuffer.config.isar_frame_size_ms = 20; bitsBuffer.config.lc3plus_highres = 0; -#endif for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { lfeRoutingConfigs[i] = NULL; @@ -893,13 +849,11 @@ int main( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( !isEmptyString( args.splitRendBFIFilePath ) ) { convert_backslash( args.splitRendBFIFilePath ); SplitRendBFIFileReader_open( args.splitRendBFIFilePath, &splitRendBFIReader ); } -#endif if ( !isEmptyString( args.externalOrientationFilePath ) ) { if ( RotationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) @@ -1227,28 +1181,16 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && !is_split_pre_rend_mode( &args ) ) { fprintf( stderr, "\nExternal Renderer Config is supported only when binaural output configurations is used as output OR when Split pre-rendering mode is enabled. Exiting. \n" ); exit( -1 ); } -#else - if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { - fprintf( stderr, "\nExternal Renderer Config is only supported for binaural output configurations. Exiting. \n" ); - exit( -1 ); - } -#endif if ( ( error = IVAS_REND_GetRenderConfig( hIvasRend, &renderConfig ) ) != IVAS_ERR_OK ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed: %s\n", ivas_error_to_string( error ) ); -#else - fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed\n" ); -#endif exit( -1 ); } @@ -1276,26 +1218,18 @@ int main( renderConfig.roomAcoustics.override = 1; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* ISAR frame size is set from command line, not renderer config file. * This will be ignored if output format is not split rendering. */ renderConfig.split_rend_config.isar_frame_size_ms = (int16_t) args.render_framesize /* given in number of 5ms subframes */ * 5; -#endif if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT fprintf( stderr, "\nIVAS_REND_FeedRenderConfig failed: %s\n", ivas_error_to_string( error ) ); -#else - fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed\n" ); -#endif exit( -1 ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT CLDFBframeSize_smpls = frameSize_smpls * 2; cldfb_in_flag = get_cldfb_in_flag( args.outConfig.audioConfig, &renderConfig ); -#endif } if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK ) @@ -1550,7 +1484,6 @@ int main( exit( -1 ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( cldfb_in_flag ) { if ( ( error = IVAS_REND_openCldfb( cldfbAna, cldfbSyn, totalNumInChannels, numOutChannels, args.sampleRate ) ) != IVAS_ERR_OK ) @@ -1631,22 +1564,18 @@ int main( exit( -1 ); } } -#endif if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) { fprintf( stderr, "Failed to open file: %s\n", args.outputFilePath ); exit( -1 ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif inBufferSize = frameSize_smpls * totalNumInChannels; outBufferSize = frameSize_smpls * numOutChannels; inpInt16Buffer = malloc( inBufferSize * sizeof( int16_t ) ); -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( cldfb_in_flag == 0 ) { inFloatBuffer = malloc( inBufferSize * sizeof( float ) ); @@ -1708,21 +1637,6 @@ int main( bitsBuffer.config.bitsRead = 0; bitsBuffer.config.bitsWritten = 0; bitsBuffer.config.bufLenInBytes = bitsBufferSize; -#else - inFloatBuffer = malloc( inBufferSize * sizeof( float ) ); - outInt16Buffer = malloc( outBufferSize * sizeof( int16_t ) ); - outInt32Buffer = malloc( outBufferSize * sizeof( Word32 ) ); - inInt32Buffer = malloc( inBufferSize * sizeof( Word32 ) ); - outFloatBuffer = malloc( outBufferSize * sizeof( float ) ); - - inBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; - inBuffer.config.numChannels = (int16_t) totalNumInChannels; - - outBuffer.config.numSamplesPerChannel = (int16_t) frameSize_smpls; - outBuffer.config.numChannels = (int16_t) numOutChannels; - outBuffer.data_fx = outInt32Buffer; - inBuffer.data_fx = inInt32Buffer; -#endif #ifdef WMOPS reset_stack(); @@ -1765,15 +1679,10 @@ int main( } /* Convert from int to float and from interleaved to packed */ -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 Q_out; *outBuffer.pq_fact = 16 - ( gd_bits ); convertInputBuffer_fx( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inInt32Buffer, *outBuffer.pq_fact, inBuffer.config.is_cldfb, cldfbAna, &Q_out ); *outBuffer.pq_fact = Q_out; -#else - *outBuffer.pq_fact = 16 - ( gd_bits ); - convertInputBuffer_fx( inpInt16Buffer, numSamplesRead, inBuffer.config.numSamplesPerChannel, num_in_channels, inInt32Buffer, *outBuffer.pq_fact ); -#endif int16_t num_subframes, sf_idx; num_subframes = (int16_t) args.render_framesize; @@ -1831,11 +1740,7 @@ int main( exit( -1 ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, headRot, Pos, DEFAULT_AXIS, sf_idx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, headRot, Pos, sf_idx ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1988,7 +1893,6 @@ int main( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { if ( ( error = IVAS_REND_GetSplitBinauralBitstream( hIvasRend, outBuffer, &bitsBuffer ) ) != IVAS_ERR_OK ) @@ -1999,30 +1903,19 @@ int main( } else { -#endif if ( ( error = IVAS_REND_GetSamples( hIvasRend, outBuffer ) ) != IVAS_ERR_OK ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT fprintf( stderr, "Error %s\n", ivas_error_to_string( error ) ); -#else - fprintf( stderr, "Error in getting samples\n" ); -#endif exit( -1 ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif int16_t num_out_channels; num_out_channels = outBuffer.config.numChannels; /* Convert from float to int and from packed to interleaved. * Values in outFloatBuffer are guaranteed to be within range INT16_MIN:INT16_MAX */ -#ifdef SPLIT_REND_WITH_HEAD_ROT convertOutputBuffer_fx( outInt32Buffer, outBuffer.config.numSamplesPerChannel, num_out_channels, outInt16Buffer, cldfb_in_flag, cldfbSyn, *outBuffer.pq_fact ); -#else - convertOutputBuffer_fx( outInt32Buffer, outBuffer.config.numSamplesPerChannel, num_out_channels, outInt16Buffer, *outBuffer.pq_fact ); -#endif if ( delayNumSamples == -1 ) { @@ -2044,7 +1937,6 @@ int main( zeroPad = delayNumSamples; } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( is_split_pre_rend_mode( &args ) ) { if ( split_rend_write_bitstream_to_file( hSplitRendFileReadWrite, bitsBuffer.bits, &bitsBuffer.config.bitsRead, @@ -2057,7 +1949,6 @@ int main( if ( audioWriter != NULL ) { -#endif if ( delayNumSamples * num_out_channels < outBufferSize ) { if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) @@ -2072,12 +1963,10 @@ int main( delayNumSamples -= (int16_t) ( outBufferSize / num_out_channels ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT } bitsBuffer.config.bitsRead = 0; bitsBuffer.config.bitsWritten = 0; -#endif /* Write MASA metadata for MASA outputs */ @@ -2183,10 +2072,8 @@ int main( } /* add zeros at the end to have equal length of synthesized signals */ -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( audioWriter != NULL ) { -#endif for ( zeroPadToWrite = zeroPad; zeroPadToWrite > frameSize_smpls; zeroPadToWrite -= frameSize_smpls ) { memset( outInt16Buffer, 0, outBufferSize * sizeof( int16_t ) ); @@ -2204,9 +2091,7 @@ int main( exit( -1 ); } zeroPadToWrite = 0; -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif if ( args.inConfig.numAudioObjects != 0 && ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) @@ -2231,18 +2116,15 @@ int main( free( inInt32Buffer ); cleanup: -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( bitsBufferData != NULL ) { free( bitsBufferData ); } -#endif for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) { MasaFileReader_close( &masaReaders[i] ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( cldfb_in_flag ) { IVAS_REND_closeCldfb( cldfbAna, cldfbSyn ); @@ -2250,7 +2132,6 @@ cleanup: split_rend_reader_writer_close( &hSplitRendFileReadWrite ); SplitRendBFIFileReader_close( &splitRendBFIReader ); -#endif for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { @@ -2560,13 +2441,8 @@ static bool parseOrientationTracking( static IVAS_AUDIO_CONFIG parseAudioConfig( const char *configString ) { -#ifndef SPLIT_REND_WITH_HEAD_ROT - char charBuf[21]; - charBuf[20] = '\0'; -#else char charBuf[25]; charBuf[24] = '\0'; -#endif strncpy( charBuf, configString, sizeof( charBuf ) - 1 ); charBuf[sizeof( charBuf ) - 1] = '\0'; @@ -2641,7 +2517,6 @@ static IVAS_AUDIO_CONFIG parseAudioConfig( { return IVAS_AUDIO_CONFIG_BINAURAL; } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( strcmp( charBuf, "BINAURAL_SPLIT_PCM" ) == 0 ) { return IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM; @@ -2650,7 +2525,6 @@ static IVAS_AUDIO_CONFIG parseAudioConfig( { return IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED; } -#endif if ( strcmp( charBuf, "BINAURAL_ROOM_IR" ) == 0 ) { return IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR; @@ -2783,10 +2657,8 @@ static CmdlnArgs defaultArgs( args.numInMetadataFiles = 0; clearString( args.headRotationFilePath ); -#ifdef SPLIT_REND_WITH_HEAD_ROT clearString( args.outMetadataFilePath ); clearString( args.splitRendBFIFilePath ); -#endif clearString( args.referenceVectorFilePath ); clearString( args.referenceRotationFilePath ); clearString( args.customHrtfFilePath ); @@ -2879,7 +2751,6 @@ static void parseOption( assert( numOptionValues == 1 ); strncpy( args->headRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; -#ifdef SPLIT_REND_WITH_HEAD_ROT case CmdLnOptionId_outputMetadata: assert( numOptionValues == 1 ); strncpy( args->outMetadataFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); @@ -2888,7 +2759,6 @@ static void parseOption( assert( numOptionValues == 1 ); strncpy( args->splitRendBFIFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; -#endif case CmdLnOptionId_referenceVectorFile: assert( numOptionValues == 1 ); strncpy( args->referenceVectorFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); @@ -3907,10 +3777,8 @@ static void printSupportedAudioConfigs( void ) "ISMx (input only)", "MASAx", "BINAURAL (output only)", -#ifdef SPLIT_REND_WITH_HEAD_ROT "BINAURAL_SPLIT_PCM", "BINAURAL_SPLIT_CODED", -#endif "BINAURAL_ROOM_IR (output only)", "BINAURAL_ROOM_REVERB (output only)", }; @@ -4006,23 +3874,17 @@ static void convertInputBuffer_fx( const Word16 numIntSamplesPerChannel, const Word16 numFloatSamplesPerChannel, const Word16 numChannels, -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 *Word32Buffer, Word16 in_q_factor, const int16_t cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbAna, Word16 *out_q_factor -#else - Word32 *Word32Buffer, - Word16 in_q_factor -#endif ) { Word16 chnl, smpl, i; i = 0; -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( cldfb_in_flag ) { Word16 slotIdx, numCldfbBands, numFloatPcmSamples; @@ -4063,7 +3925,6 @@ static void convertInputBuffer_fx( } ELSE { -#endif FOR( smpl = 0; smpl < numFloatSamplesPerChannel; ++smpl ) { FOR( chnl = 0; chnl < numChannels; ++chnl ) @@ -4080,10 +3941,8 @@ static void convertInputBuffer_fx( ++i; } } -#ifdef SPLIT_REND_WITH_HEAD_ROT *out_q_factor = in_q_factor; } -#endif return; } @@ -4100,15 +3959,10 @@ static void convertOutputBuffer_fx( const Word32 *Word32Buffer, const Word16 numSamplesPerChannel, const Word16 numChannels, -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 *intBuffer, const Word16 cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbSyn, Word16 out_q -#else - Word16 *intBuffer, - Word16 out_q -#endif ) { Word16 chnl, smpl, i; @@ -4116,7 +3970,6 @@ static void convertOutputBuffer_fx( Word32 temp_fx1; i = 0; -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( cldfb_in_flag ) { Word16 slotIdx, numCldfbBands, numPcmSamples, b, temp_out_q = 0; @@ -4180,7 +4033,6 @@ static void convertOutputBuffer_fx( } ELSE { -#endif FOR( smpl = 0; smpl < numSamplesPerChannel; ++smpl ) { @@ -4201,9 +4053,7 @@ static void convertOutputBuffer_fx( ++i; } } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif return; } diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 5ffbb56e7..2317dc95e 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -3077,13 +3077,8 @@ enum #define SYNC_BAD_FRAME (UWord16) 0x6B20 /* synchronization word of a "bad" frame */ #define G192_BIN0 (UWord16) 0x007F /* binary "0" according to ITU-T G.192 */ #define G192_BIN1 (UWord16) 0x0081 /* binary "1" according to ITU-T G.192 */ -#ifdef SPLIT_REND_WITH_HEAD_ROT #define DEGREE_180 (Word32)(180.0 *ONE_IN_Q22) #define DEGREE_360 (Word32)(360.0 *ONE_IN_Q22) -#else -#define DEGREE_180 (Word32)(180.0 *ONE_IN_Q23) -#define DEGREE_360 (Word32)(360.0 *ONE_IN_Q23) -#endif extern const Word16 Idx2Freq_Tbl[]; #define chk_fs(fs) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 34facc703..bb6351711 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -219,7 +219,6 @@ typedef struct _IVAS_JBM_TRACE_DATA } IVAS_JBM_TRACE_DATA; -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------------------* * Split rendering API constants, structures, and enums *----------------------------------------------------------------------------------*/ @@ -301,7 +300,6 @@ typedef struct _ISAR_SPLIT_REND_CONFIG int16_t lc3plus_highres; } ISAR_SPLIT_REND_CONFIG_DATA, *ISAR_SPLIT_REND_CONFIG_HANDLE; -#endif /*----------------------------------------------------------------------------------* * Renderer API structures and enums @@ -348,9 +346,7 @@ typedef struct _IVAS_RENDER_CONFIG IVAS_RENDER_TYPE_OVERRIDE renderer_type_override; #endif IVAS_ROOM_ACOUSTICS_CONFIG_DATA roomAcoustics; -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_CONFIG_DATA split_rend_config; -#endif float directivity[IVAS_MAX_NUM_OBJECTS * 3]; Word16 directivity_fx[IVAS_MAX_NUM_OBJECTS * 3]; // has the following q-factor pattern: {6, 6, 15, 6, 6, 15, 6, 6, 15, 6, 6, 15} } IVAS_RENDER_CONFIG_DATA, *IVAS_RENDER_CONFIG_HANDLE; @@ -359,9 +355,7 @@ typedef struct { int16_t numSamplesPerChannel; int16_t numChannels; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t is_cldfb; -#endif } IVAS_REND_AudioBufferConfig; typedef struct diff --git a/lib_com/delay_comp_fx.c b/lib_com/delay_comp_fx.c index 0398eb671..7bc574c3c 100644 --- a/lib_com/delay_comp_fx.c +++ b/lib_com/delay_comp_fx.c @@ -52,10 +52,8 @@ Word32 get_delay_fx( /* o : delay value in ms const Word32 io_fs, /* i : input/output sampling frequency Q0*/ const IVAS_FORMAT ivas_format, /* i : IVAS format */ HANDLE_CLDFB_FILTER_BANK hCldfb /* i : Handle of Cldfb analysis */ -#ifdef SPLIT_REND_WITH_HEAD_ROT , const AUDIO_CONFIG output_config /* i : decoder output config */ -#endif ) { Word32 delay; /*Q0*/ @@ -107,19 +105,15 @@ Word32 get_delay_fx( /* o : delay value in ms delay = IVAS_DEC_DELAY_NS; /*Q0*/ move32(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) { -#endif if ( hCldfb != NULL ) { /* compensate for filterbank delay */ delay = L_add( delay, IVAS_FB_DEC_DELAY_NS ); /*Q0*/ } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif test(); if ( EQ_16( ivas_format, MASA_FORMAT ) || EQ_16( ivas_format, MASA_ISM_FORMAT ) ) { diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 2f34e6709..e46f901c6 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -98,10 +98,8 @@ typedef enum * input data errors * *----------------------------------------*/ IVAS_ERR_INVALID_BITSTREAM = 0x2000, -#ifdef SPLIT_REND_WITH_HEAD_ROT IVAS_ERR_UNEXPECTED_LC3PLUS_BITSTREAM, IVAS_ERR_UNEXPECTED_LC3PLUS_BITSTREAM_CONFIG, -#endif /*----------------------------------------* * hardware errors * @@ -140,10 +138,8 @@ typedef enum IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING, IVAS_ERR_INVALID_ER_PARAM, IVAS_ERR_DIRECTIVITY_PATTERN_ID_MISSING, -#ifdef SPLIT_REND_WITH_HEAD_ROT IVAS_ERR_LC3PLUS_INVALID_BITRATE, IVAS_ERR_INVALID_SPLIT_REND_CONFIG, -#endif /*----------------------------------------* * unknown error * @@ -242,12 +238,10 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Wrong mode"; case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: return "Head rotation not supported"; -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_ERR_LC3PLUS_INVALID_BITRATE: return "Specified split rendering bit rate is not supported"; case IVAS_ERR_INVALID_SPLIT_REND_CONFIG: return "Specified split rendering configuration is invalid"; -#endif case IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED: return "External orientation not supported"; case IVAS_ERR_DIRECTIVITY_NOT_SUPPORTED: diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index d989a1f68..15a44f3b6 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -3699,18 +3699,11 @@ ivas_error ivas_allocate_binaural_hrtf_fx( void ivas_binRenderer_fx( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ -#ifdef SPLIT_REND_WITH_HEAD_ROT const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, -#endif COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ const Word16 numTimeSlots, /* i : number of time slots to render */ -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Cldfb_RealBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ Word32 Cldfb_ImagBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ -#else - Word32 Cldfb_RealBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ - Word32 Cldfb_ImagBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ -#endif Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ Word16 *Q_in /* i : LS signals exp */ @@ -5942,7 +5935,6 @@ float deg2rad( Word32 deg2rad_fx( Word32 degrees ); -#ifdef SPLIT_REND_WITH_HEAD_ROT void Quat2EulerDegree_fx( const IVAS_QUATERNION quat, /* i : quaternion describing the rotation */ Word32 *yaw_fx, /* o : yaw */ @@ -5967,7 +5959,6 @@ void modify_Rmat_q_fx( Word16 q_cur, /* i : current q factor for rotation matrix */ Word16 q_new /* i : target q factor for rotation matrix */ ); -#endif /*=============================================================================================*/ /* clang-format off */ diff --git a/lib_com/ivas_rotation_com.c b/lib_com/ivas_rotation_com.c index 6e31f96d5..f25c796d4 100644 --- a/lib_com/ivas_rotation_com.c +++ b/lib_com/ivas_rotation_com.c @@ -78,7 +78,6 @@ void Euler2Quat_fx( } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*------------------------------------------------------------------------- * Copy_Quat_fx() @@ -234,7 +233,6 @@ void Quat2EulerDegree_fx( return; } -#endif /*------------------------------------------------------------------------- * deg2rad() diff --git a/lib_com/options.h b/lib_com/options.h index e77c5a83b..4574f38d4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -103,10 +103,7 @@ /* #################### Start BASOP porting switches ############################ */ -#define SPLIT_REND_WITH_HEAD_ROT /* Dlb,FhG: Split Rendering contributions 21 and 35 */ -#ifdef SPLIT_REND_WITH_HEAD_ROT #define FIX_1372_ISAR_POST_REND -#endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index e899d32f9..ca754b110 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -1626,10 +1626,8 @@ Word32 get_delay_fx( /* o : delay value in ms const Word32 io_fs, /* i : input/output sampling frequency */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ HANDLE_CLDFB_FILTER_BANK hCldfb /* i : Handle of Cldfb analysis */ -#ifdef SPLIT_REND_WITH_HEAD_ROT , const AUDIO_CONFIG output_config /* i : decoder output config */ -#endif ); diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index d53d6c76d..db871d9cb 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -61,12 +61,8 @@ static void ivas_binRenderer_filterModule_fx( Word32 CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals Q_curr*/ Word32 CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals Q_curr*/ const Word16 numTimeSlots, /* i : number of time slots to process */ -#ifdef SPLIT_REND_WITH_HEAD_ROT BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ const Word16 pos_idx, /* i : pose index */ -#else - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ -#endif Word16 Q_curr ) { Word16 bandIdx, k, chIdx, tapIdx; @@ -74,25 +70,15 @@ static void ivas_binRenderer_filterModule_fx( Word16 Q_filterStates; const Word32 *filterTapsLeftRealPtr_fx, *filterTapsLeftImagPtr_fx, *filterTapsRightRealPtr_fx, *filterTapsRightImagPtr_fx; Word16 shift_q; -#ifdef SPLIT_REND_WITH_HEAD_ROT Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStates[pos_idx]; move16(); -#else - Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStatesLeft; - move16(); -#endif FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[pos_idx][bandIdx][chIdx][0] ); filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[pos_idx][bandIdx][chIdx][0] ); -#else - filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx][0] ); - filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx][0] ); -#endif /* SPLIT_REND_WITH_HEAD_ROT */ filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 @@ -136,11 +122,7 @@ static void ivas_binRenderer_filterModule_fx( outImagLeft_fx = W_shr( outImagLeft_fx, shift_q ); // Q_curr outRealRight_fx = W_shr( outRealRight_fx, shift_q ); // Q_curr outImagRight_fx = W_shr( outImagRight_fx, shift_q ); // Q_curr -#ifdef SPLIT_REND_WITH_HEAD_ROT hBinRenderer->hBinRenConvModule->Q_filterStates[pos_idx] = Q_curr; -#else - hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; -#endif move16(); } @@ -194,18 +176,12 @@ static ivas_error ivas_binRenderer_convModuleOpen( const Word16 renderer_type, const Word16 isLoudspeaker, const AUDIO_CONFIG input_config, -#ifdef SPLIT_REND_WITH_HEAD_ROT const HRTFS_FASTCONV_HANDLE hHrtf, const Word16 num_poses -#else - const HRTFS_FASTCONV_HANDLE hHrtf -#endif ) { Word16 bandIdx, chIdx; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; -#endif BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; @@ -331,7 +307,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( ( hBinRenConvModule->filterStatesLeftReal_fx = (Word32 ****) malloc( num_poses * sizeof( Word32 *** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); @@ -388,45 +363,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( } } -#else - IF( ( hBinRenConvModule->filterStatesLeftReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - IF( ( hBinRenConvModule->filterStatesLeftImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - } - } -#endif /* set memories */ FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { @@ -467,12 +403,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { /* set the memories to zero */ -#ifndef SPLIT_REND_WITH_HEAD_ROT - set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); - set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); - hBinRenConvModule->Q_filterStatesLeft = 31; - move16(); -#endif /* !SPLIT_REND_WITH_HEAD_ROT */ IF( isLoudspeaker ) { hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftBRIRReal_fx[bandIdx][tmp]; @@ -483,13 +413,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( } ELSE { -#ifndef SPLIT_REND_WITH_HEAD_ROT - /* set the memories to zero */ - set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); - set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); - hBinRenConvModule->Q_filterStatesLeft = 31; - move16(); -#endif /* SPLIT_REND_WITH_HEAD_ROT */ IF( isLoudspeaker ) { hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_fx[bandIdx][tmp]; @@ -532,7 +455,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) @@ -567,7 +489,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( } } } -#endif hBinRenderer->hBinRenConvModule = hBinRenConvModule; @@ -1126,7 +1047,6 @@ static void ivas_binaural_obtain_DMX_fx( } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*------------------------------------------------------------------------- * ivas_rend_openCldfbRend() * @@ -1229,7 +1149,6 @@ ivas_error ivas_rend_openCldfbRend( return error; } -#endif /*------------------------------------------------------------------------- * ivas_binRenderer_open() @@ -1268,7 +1187,6 @@ ivas_error ivas_binRenderer_open_fx( move16(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { hBinRenderer->numPoses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; @@ -1279,7 +1197,6 @@ ivas_error ivas_binRenderer_open_fx( hBinRenderer->numPoses = 1; move16(); } -#endif /* Declare some common variables needed for renderer */ /* Which format used for binaural rendering (needed for late reverb) ? MC or SBA */ @@ -1336,17 +1253,10 @@ ivas_error ivas_binRenderer_open_fx( IVAS_OUTPUT_SETUP out_setup; /* Allocate memories and buffers needed for convolutional module in CICP19 */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, 1, IVAS_AUDIO_CONFIG_7_1_4, st_ivas->hHrtfFastConv, hBinRenderer->numPoses ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, 1, IVAS_AUDIO_CONFIG_7_1_4, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) - { - return error; - } -#endif ivas_output_init( &out_setup, IVAS_AUDIO_CONFIG_7_1_4 ); IF( st_ivas->hoa_dec_mtx == NULL ) @@ -1364,17 +1274,10 @@ ivas_error ivas_binRenderer_open_fx( ELSE { /* Allocate memories and buffers needed for convolutional module */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, st_ivas->hHrtfFastConv, hBinRenderer->numPoses ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = ivas_binRenderer_convModuleOpen( hBinRenderer, st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) - { - return error; - } -#endif IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) { @@ -1499,18 +1402,12 @@ ivas_error ivas_binRenderer_open_fx( * Close convolution module handle of fastconv binaural renderer *------------------------------------------------------------------------*/ static void ivas_binRenderer_convModuleClose_fx( -#ifdef SPLIT_REND_WITH_HEAD_ROT BINAURAL_RENDERER_HANDLE *hBinRenderer, /* i/o: fastconv binaural renderer handle */ const Word16 num_poses /* i : number of poses */ -#else - BINAURAL_RENDERER_HANDLE *hBinRenderer /* i/o: fastconv binaural renderer handle */ -#endif ) { Word16 bandIdx, chIdx; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 posIdx; -#endif BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; @@ -1548,7 +1445,6 @@ static void ivas_binRenderer_convModuleClose_fx( free( hBinRenConvModule->filterTapsRightImag_fx ); hBinRenConvModule->filterTapsRightImag_fx = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( posIdx = 0; posIdx < num_poses; posIdx++ ) { FOR( bandIdx = 0; bandIdx < ( *hBinRenderer )->conv_band; bandIdx++ ) @@ -1574,25 +1470,6 @@ static void ivas_binRenderer_convModuleClose_fx( free( hBinRenConvModule->filterStatesLeftImag_fx[posIdx] ); hBinRenConvModule->filterStatesLeftImag_fx[posIdx] = NULL; } -#else - FOR( bandIdx = 0; bandIdx < ( *hBinRenderer )->conv_band; bandIdx++ ) - { - FOR( chIdx = 0; chIdx < ( *hBinRenderer )->nInChannels; chIdx++ ) - { - free( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] ); - hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] = NULL; - - free( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] ); - hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] = NULL; - } - - free( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] ); - hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] = NULL; - - free( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] ); - hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] = NULL; - } -#endif free( hBinRenConvModule->filterStatesLeftReal_fx ); hBinRenConvModule->filterStatesLeftReal_fx = NULL; @@ -1623,11 +1500,7 @@ void ivas_binRenderer_close_fx( IF( ( *hBinRenderer )->hBinRenConvModule != NULL ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_binRenderer_convModuleClose_fx( hBinRenderer, ( *hBinRenderer )->numPoses ); -#else - ivas_binRenderer_convModuleClose_fx( hBinRenderer ); -#endif } IF( ( *hBinRenderer )->hReverb != NULL ) @@ -1798,29 +1671,20 @@ void ivas_binaural_add_LFE_fx( void ivas_binRenderer_fx( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ -#ifdef SPLIT_REND_WITH_HEAD_ROT const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, -#endif COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ const Word16 numTimeSlots, /* i : number of time slots to render */ -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Cldfb_RealBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ Word32 Cldfb_ImagBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ -#else - Word32 Cldfb_RealBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals Q_in*/ - Word32 Cldfb_ImagBuffer_Binaural_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals Q_in*/ -#endif Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ Word16 *Q_in /* i : LS signals exp */ ) { Word16 chIdx, i, j, k; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx, num_poses; Word32 RealBuffer_local[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word32 ImagBuffer_local[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#endif // to be checked: feasibility with 32 bit buffers Word64 Cldfb_RealBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -1828,14 +1692,11 @@ void ivas_binRenderer_fx( push_wmops( "fastconv_binaural_rendering" ); -#ifdef SPLIT_REND_WITH_HEAD_ROT num_poses = hBinRenderer->numPoses; -#endif /* Compute Convolution */ /* memory reset for the binaural output */ -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) @@ -1864,18 +1725,6 @@ void ivas_binRenderer_fx( Copy32( ImagBuffer_fx[chIdx][k], ImagBuffer_local[chIdx][k], CLDFB_NO_CHANNELS_MAX ); } } -#else - FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) - { - FOR( k = 0; k < numTimeSlots; k++ ) - { - set32_fx( Cldfb_RealBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( Cldfb_ImagBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - set64_fx( Cldfb_RealBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - set64_fx( Cldfb_ImagBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - } - } -#endif /* Head rotation in HOA3 or CICPx */ test(); @@ -1914,11 +1763,7 @@ void ivas_binRenderer_fx( hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_64fx, Cldfb_ImagBuffer_Binaural_64fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, 0, *Q_in ); -#else - ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_64fx, Cldfb_ImagBuffer_Binaural_64fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, *Q_in ); -#endif FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) { @@ -1926,22 +1771,14 @@ void ivas_binRenderer_fx( { FOR( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT Cldfb_RealBuffer_Binaural_fx[0][i][j][k] = W_extract_l( W_shr( Cldfb_RealBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 move32(); Cldfb_ImagBuffer_Binaural_fx[0][i][j][k] = W_extract_l( W_shr( Cldfb_ImagBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 move32(); -#else - Cldfb_RealBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_RealBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 - move32(); - Cldfb_ImagBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_ImagBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 - move32(); -#endif } } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( pMultiBinPoseData != NULL ) { IF( GT_16( pMultiBinPoseData->num_poses, 1 ) ) @@ -2032,7 +1869,6 @@ void ivas_binRenderer_fx( } } } -#endif /* Obtain the binaural dmx and compute the reverb */ IF( hBinRenderer->hReverb != NULL ) @@ -2074,18 +1910,12 @@ void ivas_binRenderer_fx( { FOR( k = 0; k < numTimeSlots; k++ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { /* Combine first and second parts to generate binaural output signal with room effect */ v_add_32( Cldfb_RealBuffer_Binaural_fx[pos_idx][chIdx][k], reverbRe_fx[chIdx][k], Cldfb_RealBuffer_Binaural_fx[pos_idx][chIdx][k], hBinRenderer->conv_band ); // Q_in v_add_32( Cldfb_ImagBuffer_Binaural_fx[pos_idx][chIdx][k], reverbIm_fx[chIdx][k], Cldfb_ImagBuffer_Binaural_fx[pos_idx][chIdx][k], hBinRenderer->conv_band ); // Q_in } -#else - /* Combine first and second parts to generate binaural output signal with room effect */ - v_add_32( Cldfb_RealBuffer_Binaural_fx[chIdx][k], reverbRe_fx[chIdx][k], Cldfb_RealBuffer_Binaural_fx[chIdx][k], hBinRenderer->conv_band ); // Q_in - v_add_32( Cldfb_ImagBuffer_Binaural_fx[chIdx][k], reverbIm_fx[chIdx][k], Cldfb_ImagBuffer_Binaural_fx[chIdx][k], hBinRenderer->conv_band ); // Q_in -#endif } } } @@ -2093,7 +1923,6 @@ void ivas_binRenderer_fx( return; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*------------------------------------------------------------------------- * ivas_rend_CldfbMultiBinRendProcess() * @@ -2174,4 +2003,3 @@ void ivas_rend_CldfbMultiBinRendProcess( return; } -#endif diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index e843a82f9..b0bfb9fdc 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -978,9 +978,7 @@ ivas_error ivas_dirac_dec_config_fx( Word16 need_parambin; Word16 dec_param_estim_old; Word16 dec_param_estim_new; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 num_poses, pos_idx; -#endif error = IVAS_ERR_OK; move32(); @@ -1011,7 +1009,6 @@ ivas_error ivas_dirac_dec_config_fx( move16(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT num_poses = 1; move16(); IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) @@ -1019,7 +1016,6 @@ ivas_error ivas_dirac_dec_config_fx( num_poses = st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses; move16(); } -#endif sparfoa_flag = 0; move16(); @@ -1067,11 +1063,7 @@ ivas_error ivas_dirac_dec_config_fx( IF( !need_parambin ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); -#else - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); -#endif } need_dirac_rend = 0; @@ -1144,11 +1136,7 @@ ivas_error ivas_dirac_dec_config_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0] == NULL ) -#else - IF( st_ivas->hDiracDecBin == NULL ) -#endif { #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF IF( NE_32( ( error = ivas_dirac_dec_init_binaural_data_fx( st_ivas, &( st_ivas->hHrtfParambin ) ) ), IVAS_ERR_OK ) ) @@ -1164,75 +1152,41 @@ ivas_error ivas_dirac_dec_config_fx( /* This is required to keep BE in rate switching. This probably means that 1TC and 2TC MASA perform differently. */ test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params != NULL && !( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && st_ivas->nSCE > 0 ) ) -#else - IF( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params != NULL && !( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && st_ivas->nSCE > 0 ) ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_decorr_close_fx( &st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params, &st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_state ); // done -#else - ivas_dirac_dec_decorr_close_fx( &st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params, &st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_state ); // done -#endif } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) -#endif { return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* copy td-decorr flag to split renderer side rendereres */ FOR( pos_idx = 1; pos_idx < num_poses; pos_idx++ ) { st_ivas->hDiracDecBin[pos_idx]->useTdDecorr = st_ivas->hDiracDecBin[0]->useTdDecorr; } IF( !st_ivas->hDiracDecBin[0]->useTdDecorr ) -#else - IF( !st_ivas->hDiracDecBin->useTdDecorr ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params == NULL ) -#else - IF( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params == NULL ) -#endif { Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSpatParamRendCom->num_freq_bands ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params ), &( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_state ), st_ivas->hSpatParamRendCom->num_freq_bands, BINAURAL_CHANNELS, BINAURAL_CHANNELS, DIRAC_SYNTHESIS_PSD_LS, frequency_axis_fx, BINAURAL_CHANNELS, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_params ), &( st_ivas->hDiracDecBin->h_freq_domain_decorr_ap_state ), st_ivas->hSpatParamRendCom->num_freq_bands, BINAURAL_CHANNELS, BINAURAL_CHANNELS, - DIRAC_SYNTHESIS_PSD_LS, frequency_axis_fx, BINAURAL_CHANNELS, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) - { - return error; - } -#endif } } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); move16(); } -#else - st_ivas->hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); -#endif } } } @@ -2279,13 +2233,8 @@ void ivas_dirac_dec_render_sf_fx( /*CLDFB: last output channels reserved to LFT for CICPx*/ Word32 Cldfb_RealBuffer_fx[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_fx[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Cldfb_RealBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#else - Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#endif Word16 index = 0, num_freq_bands = 0; move16(); move16(); @@ -2300,7 +2249,6 @@ void ivas_dirac_dec_render_sf_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( Word16 p = 0; p < MAX_HEAD_ROT_POSES; p++ ) { FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) @@ -2312,16 +2260,6 @@ void ivas_dirac_dec_render_sf_fx( } } } -#else - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - } - } -#endif /* local copies of azi, ele, diffuseness */ Word16 azimuth[CLDFB_NO_CHANNELS_MAX]; @@ -4093,7 +4031,6 @@ void ivas_dirac_dec_render_sf_fx( input_q = Q6; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { IF( st_ivas->hSplitBinRend->hCldfbDataOut != NULL ) @@ -4110,28 +4047,19 @@ void ivas_dirac_dec_render_sf_fx( move16(); } } -#endif ivas_binRenderer_fx( st_ivas->hBinRenderer, -#ifdef SPLIT_REND_WITH_HEAD_ROT ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, -#endif st_ivas->hCombinedOrientationData, hSpatParamRendCom->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, &input_q ); -#ifndef SPLIT_REND_WITH_HEAD_ROT - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 -#else Word16 pos_idx; FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) { Scale_sig32( &Cldfb_RealBuffer_Binaural_fx[pos_idx][0][0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 Scale_sig32( &Cldfb_ImagBuffer_Binaural_fx[pos_idx][0][0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 } -#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) @@ -4146,7 +4074,6 @@ void ivas_dirac_dec_render_sf_fx( } } } -#endif /* Inverse CLDFB*/ FOR( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) @@ -4157,17 +4084,10 @@ void ivas_dirac_dec_render_sf_fx( Word32 *ImagBuffer_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[0][ch][i]; move32(); ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[0][ch][i]; move32(); -#else - RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[ch][i]; - move32(); - ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[ch][i]; - move32(); -#endif } scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( ( Q6 - 1 ), st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); // Q6-1 diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 8b0d171d5..f00ea4676 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -42,11 +42,9 @@ #include "prot_fx.h" #include "wmc_auto.h" #include "ivas_prot_fx.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "lib_isar_pre_rend.h" #include "isar_prot.h" #include "isar_stat.h" -#endif /*-------------------------------------------------------------------* @@ -57,7 +55,6 @@ static ivas_error ivas_read_format( Decoder_Struct *st_ivas, Word16 *num_bits_re static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); -#ifdef SPLIT_REND_WITH_HEAD_ROT static ivas_error ivas_dec_reconfig_split_rend( Decoder_Struct *st_ivas ); @@ -259,7 +256,6 @@ static ivas_error ivas_dec_init_split_rend( move16(); return error; } -#endif /*-------------------------------------------------------------------* * ivas_dec_setup() @@ -729,7 +725,6 @@ ivas_error ivas_dec_setup( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-----------------------------------------------------------------* * reconfig split rendering as renderer might change after bitrate switching *-----------------------------------------------------------------*/ @@ -741,7 +736,6 @@ ivas_error ivas_dec_setup( return error; } } -#endif /*----------------------------------------------------------------* * Reset bitstream pointers @@ -1182,12 +1176,8 @@ IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics *--------------------------------------------------------------------*/ test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) -#else -IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) { @@ -1377,7 +1367,6 @@ ivas_error ivas_init_decoder_fx( } #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-----------------------------------------------------------------* * Initialize binuaral split rendering *-----------------------------------------------------------------*/ @@ -1390,7 +1379,6 @@ ivas_error ivas_init_decoder_fx( return error; } } -#endif /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles @@ -2335,7 +2323,6 @@ ivas_error ivas_init_decoder_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), @@ -2344,17 +2331,6 @@ ivas_error ivas_init_decoder_fx( IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif -#else -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if ( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) -#endif #endif { return error; @@ -2519,9 +2495,7 @@ ivas_error ivas_init_decoder_fx( { IF( st_ivas->hBinRenderer->render_lfe ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#endif { /* Account for filterbank delay */ binauralization_delay_ns = L_add( binauralization_delay_ns, IVAS_FB_DEC_DELAY_NS ); @@ -2871,14 +2845,10 @@ void ivas_initialize_handles_dec( /* rendering handles */ st_ivas->hBinRenderer = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT for ( i = 0; i < MAX_HEAD_ROT_POSES; i++ ) { st_ivas->hDiracDecBin[i] = NULL; } -#else - st_ivas->hDiracDecBin = NULL; -#endif st_ivas->hDirACRend = NULL; st_ivas->hSpatParamRendCom = NULL; st_ivas->hLsSetUpConversion = NULL; @@ -2906,13 +2876,11 @@ void ivas_initialize_handles_dec( st_ivas->hExtOrientationData = NULL; st_ivas->hCombinedOrientationData = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT st_ivas->hSplitBinRend = NULL; for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { st_ivas->hTdRendHandles[i] = NULL; } -#endif /* JBM handles */ st_ivas->hTcBuffer = NULL; st_ivas->hJbmMetadata = NULL; @@ -3049,7 +3017,6 @@ void ivas_destroy_dec_fx( /* Fastconv binaural renderer handle */ ivas_binRenderer_close_fx( &st_ivas->hBinRenderer ); -#ifdef SPLIT_REND_WITH_HEAD_ROT /* TD binaural renderer handles */ for ( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { @@ -3059,21 +3026,12 @@ void ivas_destroy_dec_fx( ivas_td_binaural_close_fx( &st_ivas->hTdRendHandles[i] ); } } -#endif /* Parametric binaural renderer handle */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); -#else - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); -#endif /* Crend handle */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ), ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); -#endif /* Reverb handle */ ivas_reverb_close( &st_ivas->hReverb ); @@ -3244,11 +3202,7 @@ void ivas_init_dec_get_num_cldfb_instances( move16(); } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0]->useTdDecorr ) -#else - IF( st_ivas->hDiracDecBin->useTdDecorr ) -#endif { *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); move16(); @@ -3509,11 +3463,7 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( move16(); } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0]->useTdDecorr ) -#else - IF( st_ivas->hDiracDecBin->useTdDecorr ) -#endif { *numCldfbAnalyses = add( *numCldfbAnalyses, 2 ); move16(); @@ -3801,22 +3751,16 @@ static ivas_error doSanityChecks_IVAS( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && NE_32( output_Fs, 48000 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); } -#endif IF( st_ivas->hDecoderConfig->Opt_Headrotation ) { test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) -#else - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) -#endif { return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); } diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 5f431d63b..13e888af3 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -196,18 +196,10 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( ivas_param_ism_dec_close_fx( &( st_ivas->hParamIsmDec ), &( st_ivas->hSpatParamRendCom ), st_ivas->hDecoderConfig->output_config ); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { /* close the parametric binaural renderer */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); -#else - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); -#endif /* Open the TD Binaural renderer */ test(); IF( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) @@ -244,32 +236,14 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { /* close the parametric binaural renderer */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); -#else - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); -#endif /* Open Crend Binaural renderer */ -#ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #endif -#else -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) - { - return error; - } -#else - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) -#endif - { - return error; - } -#endif st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; move32(); @@ -287,11 +261,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { /* open the parametric binaural renderer */ IF( NE_32( ( error = ivas_dirac_dec_binaural_copy_hrtfs_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) @@ -344,11 +314,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } /* close the crend binaural renderer */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ), ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); -#endif } } diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index 5552b3dc2..09e3c0e6c 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -527,11 +527,7 @@ static ivas_error ivas_param_ism_rendering_init_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) -#else - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) -#endif { /* computation of proto matrix */ ivas_ism_get_proto_matrix_fx( hOutSetup, nchan_transport, hParamIsmRendering->proto_matrix_fx ); @@ -708,13 +704,8 @@ ivas_error ivas_param_ism_dec_open_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) -#else - IF( !( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || - EQ_32( output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) -#endif { /* Initialize efap handle */ IF( NE_32( ( error = efap_init_data_fx( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth_fx, hOutSetup.ls_elevation_fx, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ), IVAS_ERR_OK ) ) @@ -737,11 +728,7 @@ ivas_error ivas_param_ism_dec_open_fx( test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { IF( NE_32( ( error = ivas_dirac_allocate_parameters_fx( hSpatParamRendCom, 1 ) ), IVAS_ERR_OK ) ) { diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 6a0d49bfe..c21f182da 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1623,7 +1623,6 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( test(); test(); /* delay the objects here for all renderers where it is needed */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || @@ -1632,14 +1631,6 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( EQ_16( st_ivas->renderer_type, RENDERER_OSBA_LS ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) && ( NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) -#else - IF( - EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || - EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || - EQ_16( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || - EQ_16( st_ivas->renderer_type, RENDERER_OSBA_LS ) || - EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) -#endif { FOR( n = 0; n < st_ivas->nchan_ism; n++ ) { @@ -1843,9 +1834,7 @@ ivas_error ivas_jbm_dec_render_fx( const Word16 output_q_factor = Q11; move16(); SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 nchan_out_syn_output; -#endif push_wmops( "ivas_dec_render" ); /*----------------------------------------------------------------* @@ -2017,7 +2006,6 @@ ivas_error ivas_jbm_dec_render_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* Binaural rendering */ IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) { @@ -2036,16 +2024,6 @@ ivas_error ivas_jbm_dec_render_fx( } } } -#else - /* Binaural rendering */ - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) - { - IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) - { - return error; - } - } -#endif ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; @@ -2065,17 +2043,10 @@ ivas_error ivas_jbm_dec_render_fx( scale_sig32( p_output_fx[i], *nSamplesRendered, negate( sub( 11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q11 } -#if defined SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, *nSamplesRendered, output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, *nSamplesRendered, output_Fs ) ), IVAS_ERR_OK ) ) - { - return error; - } -#endif FOR( i = 0; i < nchan_out; i++ ) { @@ -2295,7 +2266,6 @@ ivas_error ivas_jbm_dec_render_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { if ( ( error = ivas_rend_crendProcessSubframesSplitBin( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, @@ -2306,28 +2276,16 @@ ivas_error ivas_jbm_dec_render_fx( } else { -#endif -#if defined SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, - &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs ) ), - IVAS_ERR_OK ) ) - { - return error; - } -#endif ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif FOR( i = 0; i < nchan_in; i++ ) { @@ -2351,7 +2309,6 @@ ivas_error ivas_jbm_dec_render_fx( } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { IF( NE_32( ( error = ivas_td_binaural_renderer_sf_splitBinaural( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) @@ -2361,16 +2318,13 @@ ivas_error ivas_jbm_dec_render_fx( } else { -#endif IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) { return error; } ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif } } ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) @@ -2382,10 +2336,8 @@ ivas_error ivas_jbm_dec_render_fx( /* Rendering */ IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) && !st_ivas->hDecoderConfig->Opt_Headrotation ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT /*handled in CLDFB domain already*/ IF( NE_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#endif { ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_output_fx, p_output_fx ); } @@ -2595,7 +2547,6 @@ ivas_error ivas_jbm_dec_render_fx( move16(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { FOR( i = 0; i < st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses * BINAURAL_CHANNELS; i++ ) @@ -2607,7 +2558,6 @@ ivas_error ivas_jbm_dec_render_fx( move16(); IF( st_ivas->hDecoderConfig->Opt_Limiter ) -#endif { IF( NE_32( st_ivas->ivas_format, MONO_FORMAT ) ) { @@ -2617,11 +2567,7 @@ ivas_error ivas_jbm_dec_render_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_syn_output_fx( p_output_fx, output_q_factor, *nSamplesRendered, nchan_out_syn_output, data ); -#else - ivas_syn_output_fx( p_output_fx, output_q_factor, *nSamplesRendered, nchan_out, data ); -#endif *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available; move16(); @@ -2660,9 +2606,6 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; #endif Word16 nchan_in, nchan_out; -#ifndef SPLIT_REND_WITH_HEAD_ROT - Word16 gd_bits, shift, n_chan_inp, i; -#endif IF( !st_ivas->hDecoderConfig->Opt_tsm ) { return IVAS_ERR_OK; @@ -2757,47 +2700,12 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; *st_ivas->hCrendWrapper->p_io_qfactor = 11; move16(); -#if defined SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; } -#else - shift = MAX_16; - move16(); - n_chan_inp = add( st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hIntSetup.num_lfe ); - - FOR( i = 0; i < n_chan_inp; i++ ) - { - shift = s_min( shift, L_norm_arr( p_output_fx[i], hTcBuffer->n_samples_granularity ) ); - } - - gd_bits = sub( find_guarded_bits_fx( imult1616( hTcBuffer->subframe_nbslots[0], hTcBuffer->n_samples_granularity ) ), shift ); - - *st_ivas->hCrendWrapper->p_io_qfactor = sub( *st_ivas->hCrendWrapper->p_io_qfactor, gd_bits ); - move16(); - - FOR( i = 0; i < n_chan_inp; i++ ) - { - scale_sig32( p_output_fx[i], hTcBuffer->n_samples_granularity, sub( *st_ivas->hCrendWrapper->p_io_qfactor, Q11 ) ); // Q(*st_ivas->hCrendWrapper->p_io_qfactor) - } - - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, - NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) - { - return error; - } - - FOR( i = 0; i < n_chan_inp; i++ ) - { - scale_sig32( p_output_fx[i], hTcBuffer->n_samples_granularity, sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ); // Q(11) - } - *st_ivas->hCrendWrapper->p_io_qfactor = Q11; - move16(); -#endif } } ELSE @@ -2825,21 +2733,12 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( *st_ivas->hCrendWrapper->p_io_qfactor = 11; move16(); -#if defined SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs, 0 ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, - hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ), - IVAS_ERR_OK ) ) - { - return error; - } -#endif ivas_binaural_add_LFE_fx( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc_fx, p_output_fx ); } @@ -2957,9 +2856,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( *nSamplesRendered = n_samples_to_render; move16(); /* Only write out the valid data*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDecoderConfig->Opt_Limiter ) -#endif { IF( NE_16( st_ivas->ivas_format, MONO_FORMAT ) ) { diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index e87683562..8bf808ed6 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -1589,9 +1589,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( Word16 numCldfbAnalyses_old, numCldfbSyntheses_old; ivas_error error; Word32 ism_total_brate; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; -#endif error = IVAS_ERR_OK; move16(); @@ -1622,13 +1620,8 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend == NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] == NULL ) ) -#else - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend == NULL ) || - ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin == NULL ) ) -#endif { /* init a new DirAC dec */ if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) @@ -1641,11 +1634,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( IF( st_ivas->hDirAC != NULL ) { /* close all unnecessary parametric decoding and rendering */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); -#else - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); -#endif ivas_dirac_rend_close_fx( &( st_ivas->hDirACRend ) ); ivas_spat_hSpatParamRendCom_close_fx( &( st_ivas->hSpatParamRendCom ) ); ivas_dirac_dec_close_fx( &( st_ivas->hDirAC ) ); @@ -1696,11 +1685,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] != NULL ) -#else - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) -#endif { if ( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ), IVAS_ERR_OK ) ) { @@ -1756,11 +1741,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] != NULL ) ) -#else - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) ) -#endif { if ( NE_32( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ), IVAS_ERR_OK ) ) { @@ -1778,11 +1759,7 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin[0] != NULL ) ) -#else - IF( ( EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) && st_ivas->hDirACRend != NULL ) || ( ( EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) && st_ivas->hDiracDecBin != NULL ) ) -#endif { if ( ( error = ivas_dirac_dec_config_fx( st_ivas, DIRAC_RECONFIGURE ) ) != IVAS_ERR_OK ) { @@ -1792,7 +1769,6 @@ ivas_error ivas_masa_dec_reconfigure_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { IF( st_ivas->hDiracDecBin[pos_idx] != NULL ) @@ -1802,14 +1778,6 @@ ivas_error ivas_masa_dec_reconfigure_fx( move16(); } } -#else - IF( st_ivas->hDiracDecBin != NULL ) - { - /* regularization factor is bitrate-dependent */ - st_ivas->hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); - move16(); - } -#endif test(); IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) /* note: switching within OMASA is handled in ivas_omasa_dec_config() */ @@ -1817,17 +1785,9 @@ ivas_error ivas_masa_dec_reconfigure_fx( /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0] != NULL ) -#else - IF( st_ivas->hDiracDecBin != NULL ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -2064,11 +2024,7 @@ void ivas_spar_param_to_masa_param_mapping_fx( move16(); hSpatParamRendCom->numSimultaneousDirections = 1; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT hDiffuseDist = st_ivas->hDiracDecBin[0]->hDiffuseDist; -#else - hDiffuseDist = st_ivas->hDiracDecBin->hDiffuseDist; -#endif nchan_transport = st_ivas->nchan_transport; move16(); band_grouping = hDirAC->band_grouping; diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index c49978058..1ee6d6ced 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -1849,13 +1849,8 @@ void ivas_param_mc_dec_render_fx( /*CLDFB*/ Word32 Cldfb_RealBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_fx[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Cldfb_RealBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#else - Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#endif Word32 *p_output_f_fx[MAX_OUTPUT_CHANNELS]; FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { @@ -2137,7 +2132,6 @@ void ivas_param_mc_dec_render_fx( Word16 input_q = 6; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { IF( st_ivas->hSplitBinRend->hCldfbDataOut != NULL ) @@ -2154,13 +2148,10 @@ void ivas_param_mc_dec_render_fx( move16(); } } -#endif /* Implement binaural rendering */ ivas_binRenderer_fx( st_ivas->hBinRenderer, -#ifdef SPLIT_REND_WITH_HEAD_ROT ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, -#endif st_ivas->hCombinedOrientationData, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, @@ -2179,7 +2170,6 @@ void ivas_param_mc_dec_render_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) { @@ -2192,18 +2182,7 @@ void ivas_param_mc_dec_render_fx( } } } -#else - FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) - { - FOR( Word16 idx2 = 0; idx2 < hParamMC->subframe_nbslots[subframe_idx]; idx2++ ) - { - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( Q6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( Q6, input_q ) ); // Q6 - } - } -#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) @@ -2218,7 +2197,6 @@ void ivas_param_mc_dec_render_fx( } } } -#endif /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); } @@ -2242,13 +2220,8 @@ void ivas_param_mc_dec_render_fx( { IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[0][ch][i]; // Q6 ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[0][ch][i]; // Q6 -#else - RealBuffer_fx[i] = Cldfb_RealBuffer_Binaural_fx[ch][i]; // Q6 - ImagBuffer_fx[i] = Cldfb_ImagBuffer_Binaural_fx[ch][i]; // Q6 -#endif } ELSE { diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index eab782f8b..89a86d21a 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -732,22 +732,15 @@ static void ivas_mc_paramupmix_dec_sf( Word32 Cldfb_RealBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; Word32 Cldfb_ImagBuffer_subfr_fx[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX] = { 0 }; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Cldfb_RealBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_Binaural_fx[MAX_HEAD_ROT_POSES][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; int16_t slot_index_start; -#else - Word32 Cldfb_RealBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word32 Cldfb_ImagBuffer_Binaural_fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#endif hMCParamUpmix = st_ivas->hMCParamUpmix; assert( hMCParamUpmix ); push_wmops( "ivas_mc_paramupmix_dec_sf" ); -#ifdef SPLIT_REND_WITH_HEAD_ROT slot_index_start = st_ivas->hTcBuffer->slots_rendered; -#endif FOR( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { @@ -864,7 +857,6 @@ static void ivas_mc_paramupmix_dec_sf( Word16 input_q = 6; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT /*LFE handling for split rendering cases*/ IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { @@ -883,20 +875,16 @@ static void ivas_mc_paramupmix_dec_sf( move16(); } } -#endif /* Implement binaural rendering */ ivas_binRenderer_fx( st_ivas->hBinRenderer, -#ifdef SPLIT_REND_WITH_HEAD_ROT ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, -#endif st_ivas->hCombinedOrientationData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, Cldfb_RealBuffer_subfr_fx, Cldfb_ImagBuffer_subfr_fx, &input_q ); -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) { @@ -909,18 +897,7 @@ static void ivas_mc_paramupmix_dec_sf( } } } -#else - FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) - { - FOR( Word16 idx2 = 0; idx2 < MAX_PARAM_SPATIAL_SUBFRAMES; idx2++ ) - { - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( 6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( 6, input_q ) ); // Q6 - } - } -#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { FOR( pos_idx = 0; pos_idx < st_ivas->hBinRenderer->numPoses; pos_idx++ ) @@ -935,7 +912,6 @@ static void ivas_mc_paramupmix_dec_sf( } } } -#endif /* Implement CLDFB synthesis */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) @@ -945,13 +921,8 @@ static void ivas_mc_paramupmix_dec_sf( FOR( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[0][ch][slot_idx]; // Q6 ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[0][ch][slot_idx]; // Q6 -#else - RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch][slot_idx]; // Q6 - ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch][slot_idx]; // Q6 -#endif } #ifndef OPT_AVOID_STATE_BUF_RESCALE scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q5 - Q11 ); // Q11 -> Q5 diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 5c9deed2d..ed43b9991 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1470,11 +1470,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { /* remove unneeded binaural renderers */ test(); @@ -1489,17 +1485,9 @@ static ivas_error ivas_mc_dec_reconfig_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend[0] != NULL ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) || NE_16( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) ) -#else - IF( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) && ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_OBJECTS_TD ) || NE_16( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ), ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); -#endif } test(); @@ -1512,21 +1500,13 @@ static ivas_error ivas_mc_dec_reconfig_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0] != NULL ) -#else - IF( st_ivas->hDiracDecBin != NULL ) -#endif { test(); test(); IF( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) && NE_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); -#else - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); -#endif } } @@ -1551,46 +1531,25 @@ static ivas_error ivas_mc_dec_reconfig_fx( } IF( EQ_16( st_ivas->hIntSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper, 1 ) ) != IVAS_ERR_OK ) -#else - IF( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Wrapper\n" ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT st_ivas->hCrendWrapper->hCrend[0] = NULL; st_ivas->hCrendWrapper->hHrtfCrend = NULL; IF( ( st_ivas->hCrendWrapper->hCrend[0] = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); } -#else - st_ivas->hCrendWrapper->hCrend = NULL; - st_ivas->hCrendWrapper->hHrtfCrend = NULL; - IF( ( st_ivas->hCrendWrapper->hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend\n" ); - } -#endif } } ELSE IF( st_ivas->hCrendWrapper == NULL && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) #else IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) -#else - IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) -#endif #endif { return error; diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index 1b174493d..9c603fa93 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -296,7 +296,6 @@ ivas_error ivas_td_binaural_renderer_sf_fx( return IVAS_ERR_OK; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*---------------------------------------------------------------------* * ivas_td_binaural_renderer_sf_splitBinaural() * @@ -450,4 +449,3 @@ ivas_error ivas_td_binaural_renderer_sf_splitBinaural( return IVAS_ERR_OK; } -#endif diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index 9d8b43515..35f4f1c4b 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -419,17 +419,9 @@ ivas_error ivas_omasa_dec_config_fx( * TD Decorrelator *-----------------------------------------------------------------*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0] != NULL ) -#else - IF( st_ivas->hDiracDecBin != NULL ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -763,12 +755,10 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( Word32 *p_sepobj_fx[MAX_NUM_OBJECTS]; // Q11 Word32 data_separated_objects_fx[MAX_NUM_OBJECTS][L_FRAME48k]; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 slot_idx_start; slot_idx_start = st_ivas->hSpatParamRendCom->slots_rendered; move16(); -#endif FOR( n = 0; n < MAX_NUM_OBJECTS; n++ ) { @@ -782,7 +772,6 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( /* reset combined orientation access index before calling the td renderer */ ivas_combined_orientation_set_to_start_index( st_ivas->hCombinedOrientationData ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { Word16 slot_idx, num_cldfb_bands, nchan_transport_orig, cldfb_slots; @@ -835,7 +824,6 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( } else { -#endif IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) { return error; @@ -845,9 +833,7 @@ ivas_error ivas_omasa_dirac_td_binaural_jbm_fx( { v_add_fx( output_fx[n], p_sepobj_fx[n], output_fx[n], *nSamplesRendered ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c index 87805290b..a8754d84f 100644 --- a/lib_dec/ivas_osba_dec_fx.c +++ b/lib_dec/ivas_osba_dec_fx.c @@ -137,12 +137,10 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( Word32 output_separated_objects_fx[BINAURAL_CHANNELS][L_FRAME48k]; // VE2SB: TBV Word32 *p_sepobj_fx[BINAURAL_CHANNELS]; Word16 channel_offset; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 slot_idx_start; slot_idx_start = st_ivas->hSpatParamRendCom->slots_rendered; move16(); -#endif FOR( Word16 i = 0; i < BINAURAL_CHANNELS; i++ ) { @@ -162,7 +160,6 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { Word16 slot_idx, num_cldfb_bands, b, nchan_transport_orig; @@ -217,7 +214,6 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( } else { -#endif IF( NE_32( ( error = ivas_td_binaural_renderer_sf_fx( st_ivas, p_sepobj_fx, *nSamplesRendered ) ), IVAS_ERR_OK ) ) { return error; @@ -232,9 +228,7 @@ ivas_error ivas_osba_dirac_td_binaural_jbm_fx( move32(); } } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index 4a3362cd2..bdf7b67bc 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -80,11 +80,7 @@ void ivas_renderer_select( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { test(); test(); @@ -95,11 +91,7 @@ void ivas_renderer_select( { IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) -#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; move16(); @@ -113,11 +105,7 @@ void ivas_renderer_select( ELSE /* ISM_MODE_DISC */ { test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; move16(); @@ -137,11 +125,7 @@ void ivas_renderer_select( { *internal_config = output_config; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) -#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; move16(); @@ -158,11 +142,7 @@ void ivas_renderer_select( move16(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) -#endif { *renderer_type = RENDERER_BINAURAL_FASTCONV; move16(); @@ -217,11 +197,7 @@ void ivas_renderer_select( *internal_config = output_config; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) -#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; move16(); @@ -237,11 +213,7 @@ void ivas_renderer_select( *internal_config = transport_config; move16(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { test(); test(); diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index 121b8a795..8f8a7f486 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -183,11 +183,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) -#else - IF( EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) -#endif { RENDERER_TYPE renderer_type_new; Word16 sba_order_internal; @@ -198,11 +194,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( /* copy the logic from ivas_renderer_select(), because calling this function has too many side effects that would affect the flushing */ IF( LE_16( ivas_get_sba_num_TCs_fx( ivas_total_brate, sba_order_internal ), 2 ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) -#endif { renderer_type_new = RENDERER_BINAURAL_PARAMETRIC; move16(); @@ -216,11 +208,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( ELSE { test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) ) -#endif { renderer_type_new = RENDERER_BINAURAL_FASTCONV; move16(); @@ -639,7 +627,6 @@ ivas_error ivas_sba_dec_reconfigure_fx( * TD Decorrelator *-----------------------------------------------------------------*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0] != NULL ) { IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin[0]->hTdDecorr ), &( st_ivas->hDiracDecBin[0]->useTdDecorr ) ) ), IVAS_ERR_OK ) ) @@ -647,15 +634,6 @@ ivas_error ivas_sba_dec_reconfigure_fx( return error; } } -#else - IF( st_ivas->hDiracDecBin != NULL ) - { - IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) - { - return error; - } - } -#endif /*-----------------------------------------------------------------* * CLDFB instances @@ -805,11 +783,7 @@ void ivas_sba_dec_digest_tc_fx( ivas_spar_dec_digest_tc_fx( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering ); } test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0] != NULL && st_ivas->hDiracDecBin[0]->useTdDecorr ) -#else - IF( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) -#endif { Word16 nSamplesLeftForTD, default_frame; Word32 *decorr_signal[BINAURAL_CHANNELS]; @@ -832,17 +806,9 @@ void ivas_sba_dec_digest_tc_fx( { Word16 nSamplesToDecorr = s_min( nSamplesLeftForTD, default_frame ); /*Q0*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( st_ivas->hDiracDecBin[0]->hTdDecorr ) -#else - IF( st_ivas->hDiracDecBin->hTdDecorr ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_td_decorr_process_fx( st_ivas->hDiracDecBin[0]->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); -#else - ivas_td_decorr_process_fx( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); -#endif } FOR( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index 530614fe9..7f12c592e 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -2036,13 +2036,8 @@ void ivas_spar_dec_upmixer_sf_fx( test(); test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) || !( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) && !( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) -#else - IF( ( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_FOA ) || !( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) && - !( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_SBA_MODE_DISC ) && EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) -#endif { FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index c6f06f142..d7736e244 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -860,34 +860,8 @@ typedef struct renderer_struct } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; -#ifndef SPLIT_REND_WITH_HEAD_ROT -/* Fastconv binaural data structure */ -typedef struct ivas_binaural_rendering_struct -{ - /* Common variables for all modules */ - IVAS_OUTPUT_SETUP_HANDLE hInputSetup; /* pointer to input spatial format for binaural renderer*/ - EFAP_HANDLE hEFAPdata; /* EFAP structure*/ - Word32 *hoa_dec_mtx; /* pointer to HOA decoder mtx */ /*Q29*/ - Word8 rotInCldfb; /* Flag to enable rotation within bin Renderer in CLDFB*/ - Word16 max_band; /* band upto which rendering is performed */ - Word16 conv_band; /* band upto which convolution in cldfb domain is performed */ - Word16 timeSlots; /* number of time slots of binaural renderer */ - Word16 nInChannels; /* number input channels */ - Word8 render_lfe; /* Flag to render LFE in binaural rendering*/ - IVAS_FORMAT ivas_format; /* format; corresponds to st_ivas->ivas_format, unless the signal gets transormed to a different domain for rendering */ - - /* Convolution module structure */ - BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; - - /* Variables related to reverberator module */ - Word32 earlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; - REVERB_STRUCT_HANDLE hReverb; - -} BINAURAL_RENDERER, *BINAURAL_RENDERER_HANDLE; -#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------------------* * IVAS decoder specific ISAR wrapper structures *----------------------------------------------------------------------------------*/ @@ -917,7 +891,6 @@ typedef struct Word16 numTdSamplesPerChannelCached; } ISAR_DEC_SPLIT_REND_WRAPPER, *ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE; -#endif /*----------------------------------------------------------------------------------* * MASA decoder structures @@ -1062,9 +1035,7 @@ typedef struct decoder_config_structure Word16 Opt_tsm; /* indicates whether time scaling modification is activated */ IVAS_RENDER_FRAMESIZE render_framesize; Word16 Opt_delay_comp; /* flag indicating delay compensation active */ -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t Opt_Limiter; -#endif } DECODER_CONFIG, *DECODER_CONFIG_HANDLE; @@ -1141,11 +1112,7 @@ typedef struct Decoder_Struct BINAURAL_RENDERER_HANDLE hBinRenderer; /* fastconv binaural renderer handle */ BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd; /* Time domain binaural object renderer handle */ TDREND_HRFILT_FiltSet_t *hHrtfTD; /* pointer to HRTF data for TD renderer */ -#ifdef SPLIT_REND_WITH_HEAD_ROT DIRAC_DEC_BIN_HANDLE hDiracDecBin[MAX_HEAD_ROT_POSES]; /* parametric binaural renderer handle */ -#else - DIRAC_DEC_BIN_HANDLE hDiracDecBin; /* parametric binaural renderer handle */ -#endif LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; /* MC LS configuration convertion handle */ EFAP_HANDLE hEFAPdata; /* EFAP structure */ VBAP_HANDLE hVBAPdata; /* VBAP structure */ @@ -1172,10 +1139,8 @@ typedef struct Decoder_Struct Word16 flag_omasa_brate; -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE hSplitBinRend; /* ISAR split binaural rendering handle */ BINAURAL_TD_OBJECT_RENDERER_HANDLE hTdRendHandles[MAX_HEAD_ROT_POSES - 1]; -#endif /* JBM module */ DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */ diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index d7a110a37..28b8594fe 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -144,7 +144,6 @@ ivas_error IVAS_DEC_GetSamples( bool *needNewFrame /* o : indication that the decoder needs a new frame */ ); -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_error IVAS_DEC_GetSplitBinauralBitstream( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ Word16 *pcmBuf_out, /* o : output synthesis signal for BINAURAL_SPLIT_PCM */ @@ -179,7 +178,6 @@ int16_t IVAS_DEC_is_split_rendering_enabled( int16_t IVAS_DEC_is_split_rendering_coded_out( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ ); -#endif /*! r: error code */ ivas_error IVAS_DEC_GetObjectMetadata( @@ -201,12 +199,8 @@ ivas_error IVAS_DEC_FeedHeadTrackData( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ IVAS_VECTOR3 Pos, /* i : listener position */ -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word16 subframe_idx, /* i : subframe index */ const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : external control for rotation axis for split rendering */ -#else - const Word16 subframe_idx /* i : subframe index */ -#endif ); /*! r: error code */ @@ -283,12 +277,10 @@ ivas_error IVAS_DEC_EnableVoIP( const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ ); -#ifdef SPLIT_REND_WITH_HEAD_ROT /*! r: error code */ ivas_error IVAS_DEC_EnableSplitRendering( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ ); -#endif ivas_error IVAS_DEC_SetRenderFramesize( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index de939c5b0..dd5db0071 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -114,11 +114,9 @@ static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, cons static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const UWord16 nSamplesForRendering, UWord16 *nSamplesRendered, UWord16 *nSamplesAvailableNext, Word16 *pcmBuf ); static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, Word16 *nSamplesBuffered ); static Word16 get_render_frame_size_ms( IVAS_RENDER_FRAMESIZE render_framesize ); -#ifdef SPLIT_REND_WITH_HEAD_ROT static ivas_error isar_set_split_rend_setup( ISAR_DEC_SPLIT_REND_WRAPPER *hSplitBinRend, const ISAR_SPLIT_REND_CONFIG_DATA *hSplitBinConfig, const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, ISAR_SPLIT_REND_BITS_DATA *splitRendBits ); static ivas_error ivas_create_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out ); static void ivas_destroy_handle_isar( ISAR_DEC_SPLIT_REND_WRAPPER_HANDLE *hSplitBinRend_out ); -#endif /*---------------------------------------------------------------------* * IVAS_DEC_Open() @@ -276,7 +274,6 @@ ivas_error IVAS_DEC_Open( return IVAS_ERR_WRONG_PARAMS; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-------------------------------------------------------------------------* * isar_set_split_rend_setup() * @@ -313,7 +310,6 @@ static ivas_error isar_set_split_rend_setup( return IVAS_ERR_OK; } -#endif /*---------------------------------------------------------------------* * init_decoder_config() @@ -336,10 +332,8 @@ static void init_decoder_config( hDecoderConfig->Opt_non_diegetic_pan = 0; hDecoderConfig->non_diegetic_pan_gain_fx = 0; // Q15 hDecoderConfig->Opt_tsm = 0; -#ifdef SPLIT_REND_WITH_HEAD_ROT hDecoderConfig->Opt_Limiter = 1; move16(); -#endif hDecoderConfig->Opt_delay_comp = 0; hDecoderConfig->Opt_ExternalOrientation = 0; hDecoderConfig->Opt_dpid_on = 0; @@ -386,10 +380,8 @@ void IVAS_DEC_Close( ( *phIvasDec )->hVoIP = NULL; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* destroy Split binaural renderer (ISAR) handle */ ivas_destroy_handle_isar( &( *phIvasDec )->st_ivas->hSplitBinRend ); -#endif IF( ( *phIvasDec )->st_ivas ) { @@ -576,13 +568,11 @@ ivas_error IVAS_DEC_Configure( move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { hDecoderConfig->Opt_Headrotation = TRUE; move16(); } -#endif /* Set decoder parameters to initial values */ IF( NE_32( ( error = ivas_init_decoder_front( st_ivas ) ), IVAS_ERR_OK ) ) @@ -590,7 +580,6 @@ ivas_error IVAS_DEC_Configure( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* create ISAR handle */ IF( EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { @@ -599,7 +588,6 @@ ivas_error IVAS_DEC_Configure( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for ISAR handle" ); } } -#endif if ( EQ_16( hIvasDec->mode, IVAS_DEC_MODE_EVS ) ) { @@ -622,7 +610,6 @@ ivas_error IVAS_DEC_Configure( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*---------------------------------------------------------------------* * IVAS_DEC_EnableSplitRendering( ) * @@ -658,7 +645,6 @@ ivas_error IVAS_DEC_EnableSplitRendering( return error; } -#endif /*---------------------------------------------------------------------* * get_render_framesize_ms( ) @@ -1121,7 +1107,6 @@ ivas_error IVAS_DEC_GetSamples( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------* * Binaural split rendering setup *----------------------------------------------------------------*/ @@ -1133,7 +1118,6 @@ ivas_error IVAS_DEC_GetSamples( isar_set_split_rend_ht_setup_fx( &hIvasDec->st_ivas->hSplitBinRend->splitrend, hIvasDec->st_ivas->hCombinedOrientationData->Quaternions, hIvasDec->st_ivas->hCombinedOrientationData->Rmat_fx ); } } -#endif hIvasDec->updateOrientation = false; move16(); @@ -1297,7 +1281,6 @@ return IVAS_ERR_OK; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*---------------------------------------------------------------------* * IVAS_DEC_GetSplitBinauralBitstream( ) * @@ -1555,7 +1538,6 @@ IVAS_DEC_GetSplitBinauralBitstream( return error; } -#endif /*---------------------------------------------------------------------* @@ -2226,12 +2208,8 @@ ivas_error IVAS_DEC_FeedHeadTrackData( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ IVAS_VECTOR3 Pos, /* i : listener position */ -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word16 subframe_idx, /* i : subframe index */ const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : external control for rotation axis for split rendering */ -#else - const Word16 subframe_idx /* i : subframe index */ -#endif ) { HEAD_TRACK_DATA_HANDLE hHeadTrackData; @@ -2252,19 +2230,12 @@ ivas_error IVAS_DEC_FeedHeadTrackData( /* Move head-tracking data to the decoder handle */ /* check for Euler angle signaling */ -#ifdef SPLIT_REND_WITH_HEAD_ROT /* check for Euler angle signaling */ IF( EQ_32( orientation.w_fx, L_negate( 12582912 ) ) && EQ_16( orientation.q_fact, Q22 ) ) { Euler2Quat_fx( deg2rad_fx( orientation.x_fx ), deg2rad_fx( orientation.y_fx ), deg2rad_fx( orientation.z_fx ), &orientation ); modify_Quat_q_fx( &orientation, &orientation, Q29 ); } -#else - IF( EQ_32( orientation.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) - { - Euler2Quat_fx( deg2rad_fx( orientation.x_fx ), deg2rad_fx( orientation.y_fx ), deg2rad_fx( orientation.z_fx ), &orientation ); - } -#endif Word32 updateRate_fx = 1677721600; // value is 200 in Q23 move32(); @@ -2302,10 +2273,8 @@ ivas_error IVAS_DEC_FeedHeadTrackData( move32(); move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT hHeadTrackData->sr_pose_pred_axis = rot_axis; move32(); -#endif hIvasDec->updateOrientation = true; move16(); @@ -2644,7 +2613,6 @@ static ivas_error copyRendererConfigStruct( Copy32( hRCin->roomAcoustics.pAcoustic_dsr_fx, hRCout->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); // Q30 Copy( hRCin->directivity_fx, hRCout->directivity_fx, 3 * MAX_NUM_OBJECTS ); -#ifdef SPLIT_REND_WITH_HEAD_ROT hRCout->split_rend_config.splitRendBitRate = SPLIT_REND_768k; hRCout->split_rend_config.dof = 3; hRCout->split_rend_config.hq_mode = 0; @@ -2665,7 +2633,6 @@ static ivas_error copyRendererConfigStruct( move32(); move32(); move32(); -#endif hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; hRCout->roomAcoustics.lowComplexity = hRCin->roomAcoustics.lowComplexity; @@ -2731,9 +2698,7 @@ ivas_error IVAS_DEC_FeedRenderConfig( ) { RENDER_CONFIG_HANDLE hRenderConfig; -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_error error; -#endif test(); test(); @@ -2772,7 +2737,6 @@ ivas_error IVAS_DEC_FeedRenderConfig( Copy( renderConfig.directivity_fx, hRenderConfig->directivity_fx, 3 * MAX_NUM_OBJECTS ); -#ifdef SPLIT_REND_WITH_HEAD_ROT hRenderConfig->split_rend_config = renderConfig.split_rend_config; /* Overwrite any pose correction settings if 0 DOF (no pose correction) was selected */ @@ -2785,7 +2749,6 @@ ivas_error IVAS_DEC_FeedRenderConfig( { return error; } -#endif return IVAS_ERR_OK; } @@ -2841,13 +2804,8 @@ ivas_error IVAS_DEC_GetDelay( } move32(); -#ifdef SPLIT_REND_WITH_HEAD_ROT nSamples[1] = NS2SA_FX2( hDecoderConfig->output_Fs, get_delay_fx( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0], hDecoderConfig->output_config ) ); move16(); -#else - nSamples[1] = NS2SA_FX2( hDecoderConfig->output_Fs, get_delay_fx( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0] ) ); - move16(); -#endif nSamples[2] = extract_l( W_round64_L( W_mult0_32_32( L_shl( st_ivas->binaural_latency_ns, 1 ), out_fs_fx ) ) ); move16(); nSamples[0] = add( nSamples[1], nSamples[2] ); @@ -3675,11 +3633,7 @@ static ivas_error printConfigInfo_dec( test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) ) -#else - IF( ( EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( (Word16) output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) -#endif { fprintf( stdout, "Render framesize: %dms\n", get_render_frame_size_ms( st_ivas->hDecoderConfig->render_framesize ) ); } @@ -4074,7 +4028,6 @@ static ivas_error IVAS_DEC_VoIP_reconfigure( } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*---------------------------------------------------------------------* * IVAS_DEC_GetSplitRendBitstreamHeader() * @@ -4279,4 +4232,3 @@ Word16 IVAS_DEC_is_split_rendering_coded_out( return isSplitCoded; } -#endif diff --git a/lib_enc/lib_enc_fx.c b/lib_enc/lib_enc_fx.c index 8b20cab7d..32c26be28 100644 --- a/lib_enc/lib_enc_fx.c +++ b/lib_enc/lib_enc_fx.c @@ -1572,13 +1572,8 @@ ivas_error IVAS_ENC_GetDelay( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef SPLIT_REND_WITH_HEAD_ROT *delay = NS2SA_FX2( hEncoderConfig->input_Fs, get_delay_fx( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL, IVAS_AUDIO_CONFIG_INVALID ) ); move16(); -#else - *delay = NS2SA_FX2( hEncoderConfig->input_Fs, get_delay_fx( ENC, hEncoderConfig->input_Fs, hEncoderConfig->ivas_format, NULL ) ); /*Q0*/ - move16(); -#endif *delay = imult1616( *delay, hEncoderConfig->nchan_inp ); /*Q0*/ move16(); diff --git a/lib_isar/isar_MSPred.c b/lib_isar/isar_MSPred.c index 1df47d695..040fcc3a9 100644 --- a/lib_isar/isar_MSPred.c +++ b/lib_isar/isar_MSPred.c @@ -32,7 +32,6 @@ #include "options.h" #include -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "isar_lcld_rom_tables.h" #include "isar_lcld_prot.h" #include "isar_prot.h" @@ -547,4 +546,3 @@ void writeMSPred( return; } #endif -#endif diff --git a/lib_isar/isar_NoiseGen.c b/lib_isar/isar_NoiseGen.c index 7273b0e81..1a6881681 100644 --- a/lib_isar/isar_NoiseGen.c +++ b/lib_isar/isar_NoiseGen.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "prot_fx.h" #include "isar_lcld_prot.h" @@ -55,4 +54,3 @@ void DeleteNoiseGen( NoiseGen *psNoiseGen ) extern float GetNoise( NoiseGen *psNoiseGen ); extern Word32 GetNoise_fx( NoiseGen *psNoiseGen ); -#endif diff --git a/lib_isar/isar_PerceptualModel.c b/lib_isar/isar_PerceptualModel.c index 16558dd36..b9a5b1b33 100644 --- a/lib_isar/isar_PerceptualModel.c +++ b/lib_isar/isar_PerceptualModel.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "isar_lcld_prot.h" #include "prot_fx.h" #include "isar_lcld_rom_tables.h" @@ -466,4 +465,3 @@ void PerceptualModelStereo_fx( return; } -#endif diff --git a/lib_isar/isar_PredDecoder.c b/lib_isar/isar_PredDecoder.c index b30a6e0a8..a202aaa1c 100644 --- a/lib_isar/isar_PredDecoder.c +++ b/lib_isar/isar_PredDecoder.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "prot_fx.h" #include "isar_prot.h" @@ -492,4 +491,3 @@ void ApplyInversePredictors_fx( return; } -#endif diff --git a/lib_isar/isar_PredEncoder.c b/lib_isar/isar_PredEncoder.c index 0cd32b70c..8eed33ca6 100644 --- a/lib_isar/isar_PredEncoder.c +++ b/lib_isar/isar_PredEncoder.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "isar_lcld_prot.h" #include "isar_lcld_rom_tables.h" @@ -1212,4 +1211,3 @@ Word32 WritePredictors( return iBitsWritten; } -#endif diff --git a/lib_isar/isar_RMSEnvGrouping.c b/lib_isar/isar_RMSEnvGrouping.c index 9b5de2574..9a7b2ba54 100644 --- a/lib_isar/isar_RMSEnvGrouping.c +++ b/lib_isar/isar_RMSEnvGrouping.c @@ -34,7 +34,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "prot_fx.h" #include "isar_lcld_prot.h" @@ -961,4 +960,3 @@ void ComputeEnvelopeGrouping( return; } -#endif diff --git a/lib_isar/isar_cnst.h b/lib_isar/isar_cnst.h index ad6bf483a..4aef03cf2 100644 --- a/lib_isar/isar_cnst.h +++ b/lib_isar/isar_cnst.h @@ -38,7 +38,6 @@ /* clang-format off */ -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------------------* * Split Binaural Rendering Constants @@ -147,7 +146,6 @@ typedef enum #define SPLIT_REND_512k 512000 #define SPLIT_REND_768k 768000 -#endif /*SPLIT_REND_WITH_HEAD_ROT */ #endif /*ISAR_CNST_H */ /* clang-format on */ diff --git a/lib_isar/isar_lc3plus_common.c b/lib_isar/isar_lc3plus_common.c index 6a4ef18ed..5c56c0b43 100644 --- a/lib_isar/isar_lc3plus_common.c +++ b/lib_isar/isar_lc3plus_common.c @@ -35,7 +35,6 @@ #include "ivas_error.h" #include "lc3.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-----------------------------------------------------------------------------------------* * Function ISAR_LC3PLUS_LC3plusErrToIvasErr() * @@ -84,4 +83,3 @@ ivas_error IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( const LC3PLUS_RTP_ERR lc3PlusRtp return IVAS_ERR_UNKNOWN; } -#endif diff --git a/lib_isar/isar_lc3plus_common.h b/lib_isar/isar_lc3plus_common.h index 6042e8859..2638ea8a9 100644 --- a/lib_isar/isar_lc3plus_common.h +++ b/lib_isar/isar_lc3plus_common.h @@ -37,7 +37,6 @@ #include #include "options.h" #include "ivas_error.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "lc3.h" #include "isar_lc3plus_payload.h" @@ -62,5 +61,4 @@ ivas_error ISAR_LC3PLUS_LC3plusErrToIvasErr( const LC3PLUS_Error lc3PlusError ); /*! utility function to convert LC3PLUS_Errors to the suitable ivas_error */ ivas_error IVAS_LC3PLUS_LC3plusRtpErrToIvasErr( const LC3PLUS_RTP_ERR lc3PlusRtpError ); -#endif /* SPLIT_REND_WITH_HEAD_ROT */ #endif /* ISAR_LC3PLUS_COM_H */ diff --git a/lib_isar/isar_lc3plus_dec.c b/lib_isar/isar_lc3plus_dec.c index 5a82dc13c..ea19833ba 100644 --- a/lib_isar/isar_lc3plus_dec.c +++ b/lib_isar/isar_lc3plus_dec.c @@ -40,7 +40,6 @@ #include "ivas_error_utils.h" #include "wmc_auto.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT @@ -559,4 +558,3 @@ ivas_error ISAR_LC3PLUS_DEC_Conceal( return isar_LC3PLUS_DEC_Decode_or_Conceal_internal( handle, bitstream_in, 0, badFrameIndicator, pcm_out ); } -#endif /* SPLIT_REND_WITH_HEAD_ROT */ diff --git a/lib_isar/isar_lc3plus_dec.h b/lib_isar/isar_lc3plus_dec.h index f946a6402..f3e969940 100644 --- a/lib_isar/isar_lc3plus_dec.h +++ b/lib_isar/isar_lc3plus_dec.h @@ -35,7 +35,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "lc3.h" #include "ivas_error.h" #include "ivas_cnst.h" @@ -107,5 +106,4 @@ ivas_error ISAR_LC3PLUS_DEC_Conceal( ); -#endif /* SPLIT_REND_WITH_HEAD_ROT */ #endif /* ISAR_LC3PLUS_DEC_H */ diff --git a/lib_isar/isar_lc3plus_enc.c b/lib_isar/isar_lc3plus_enc.c index 1de448423..467db9116 100644 --- a/lib_isar/isar_lc3plus_enc.c +++ b/lib_isar/isar_lc3plus_enc.c @@ -77,7 +77,6 @@ static int32_t limit_per_channel_bitrate( LC3PLUS_CONFIG config, return -1; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-------------------------------------------------------------------* * Function ISAR_LC3PLUS_ENC_Open() * @@ -582,4 +581,3 @@ ivas_error ISAR_LC3PLUS_ENC_Encode( return IVAS_ERR_OK; } -#endif /* SPLIT_REND_WITH_HEAD_ROT */ diff --git a/lib_isar/isar_lc3plus_enc.h b/lib_isar/isar_lc3plus_enc.h index 5487f712c..eeef615fc 100644 --- a/lib_isar/isar_lc3plus_enc.h +++ b/lib_isar/isar_lc3plus_enc.h @@ -35,7 +35,6 @@ #include #include "ivas_error.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "lc3.h" #include "isar_lc3plus_common.h" #include "typedef.h" @@ -85,6 +84,5 @@ ivas_error ISAR_LC3PLUS_ENC_Encode( void *bitstream_out, /* o : pointer to bitstream frame */ const Word32 bitstream_out_size, /* i : size of the bitstream_out buffer in bytes. Must be equal to ISAR_LC3PLUS_ENC_GetOutputBitstreamSize. */ Word16 q_in[16] ); -#endif #endif /* ISAR_LC3PLUS_ENC_H */ diff --git a/lib_isar/isar_lc3plus_payload.c b/lib_isar/isar_lc3plus_payload.c index 54895c78b..291cd9d05 100644 --- a/lib_isar/isar_lc3plus_payload.c +++ b/lib_isar/isar_lc3plus_payload.c @@ -36,7 +36,6 @@ #include "isar_lc3plus_payload.h" #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT static LC3PLUS_RTP_ERR s_frame_duration_ms_from_fdi( int32_t *frame_duration_us, const LC3PLUS_RTP_FTD_FDI fdi ) { if ( NULL == frame_duration_us ) @@ -818,4 +817,3 @@ LC3PLUS_RTP_ERR LC3PLUS_RTP_ftd_fdi_from_frame_duration_us( LC3PLUS_RTP_FTD_FDI return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; } -#endif /* SPLIT_REND_WITH_HEAD_ROT */ diff --git a/lib_isar/isar_lc3plus_payload.h b/lib_isar/isar_lc3plus_payload.h index 0eadc96a8..e95128578 100644 --- a/lib_isar/isar_lc3plus_payload.h +++ b/lib_isar/isar_lc3plus_payload.h @@ -38,7 +38,6 @@ #include "lc3.h" #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT /* Implementation of the "B.2.6 Table of contents" part of the RTP payload format * for LC3plus as specified in ETSI TS 103 634. */ @@ -210,5 +209,4 @@ LC3PLUS_RTP_ERR LC3PLUS_RTP_payload_deserialize( uint8_t *serialized_buffer, const size_t serialized_buffer_size ); -#endif /* #ifdef SPLIT_REND_WITH_HEAD_ROT */ #endif /* ISAR_LC3PLUS_PAYLOAD_H */ diff --git a/lib_isar/isar_lcld_decoder.c b/lib_isar/isar_lcld_decoder.c index a64a12aea..83f6261ee 100644 --- a/lib_isar/isar_lcld_decoder.c +++ b/lib_isar/isar_lcld_decoder.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "isar_lcld_prot.h" #include "isar_lcld_rom_tables.h" #include "prot_fx.h" @@ -1992,4 +1991,3 @@ static void ComputeAllocation( return; } -#endif diff --git a/lib_isar/isar_lcld_encoder.c b/lib_isar/isar_lcld_encoder.c index 48445d080..327edb6ad 100644 --- a/lib_isar/isar_lcld_encoder.c +++ b/lib_isar/isar_lcld_encoder.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include #include "isar_lcld_prot.h" @@ -2139,4 +2138,3 @@ static Word32 ComputeAllocation( } return iBitsUsed; } -#endif diff --git a/lib_isar/isar_lcld_prot.h b/lib_isar/isar_lcld_prot.h index 49e03f5ef..3f79a2c12 100644 --- a/lib_isar/isar_lcld_prot.h +++ b/lib_isar/isar_lcld_prot.h @@ -34,7 +34,6 @@ #define ISAR_LCLD_PROT_H #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "typedef.h" #include "common_api_types.h" #include "isar_lcld_rom_tables.h" @@ -450,7 +449,6 @@ void ComputeEnvelopeGrouping( Word16 q_final ); -#endif /* clang-format on */ #endif /* _LCLD_ENCODER_H_ */ diff --git a/lib_isar/isar_lcld_rom_tables.c b/lib_isar/isar_lcld_rom_tables.c index 8ecf74336..42554611f 100644 --- a/lib_isar/isar_lcld_rom_tables.c +++ b/lib_isar/isar_lcld_rom_tables.c @@ -32,7 +32,6 @@ #include "isar_lcld_rom_tables.h" #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "wmc_auto.h" #include "prot_fx.h" #include "isar_lcld_prot.h" @@ -21204,4 +21203,3 @@ const Word32 c_pfWindowLUT[LCLD_PRED_WIN_LEN] = /* Q31 */ { 190779840, 338280192, 610825408, 966922816, 1352359680, 1708457216, 1981002240, 2128502656, 2128502528, 1981002240, 1708456960, 1352359808, 966922624, 610825152, 338280192, 190779776 }; -#endif diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index 6860dda91..6e8bcaf9f 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -36,7 +36,6 @@ #include "isar_stat.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "options.h" @@ -409,7 +408,6 @@ void lc3plusTimeAlignCldfbPoseCorr( SPLIT_REND_WRAPPER *hSplitBin, Word32 Cldfb_In_BinImag_fx[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word16 *Q_in ); -#endif void ivas_cmult_fix( Word32 in1_re_fx, Word16 exp_re1, Word32 in1_im_fx, Word16 exp_im1, Word32 in2_re_fx, Word16 exp_re2, Word32 in2_im_fx, Word16 exp_im2, Word32 *out1_re_fx, Word32 *out1_im_fx, Word16 *exp_out1_re, Word16 *exp_out1_im ); diff --git a/lib_isar/isar_rom_post_rend.c b/lib_isar/isar_rom_post_rend.c index 99742bc4f..0af50df5c 100644 --- a/lib_isar/isar_rom_post_rend.c +++ b/lib_isar/isar_rom_post_rend.c @@ -43,7 +43,6 @@ /* clang-format off */ -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------* * Binuaral split rendering ROM tables *-----------------------------------------------------------------------*/ @@ -187,7 +186,6 @@ const int32_t ivas_split_rend_huff_roll_pred_consts[ISAR_SPLIT_REND_ROLL_PRED_QU {14,10,1022},{15,10,1023}, }; -#endif /* Tables for split renderer fixed converison */ const Word16 fade_table_fx[4] = diff --git a/lib_isar/isar_rom_post_rend.h b/lib_isar/isar_rom_post_rend.h index b9acd75e1..90bcae60b 100644 --- a/lib_isar/isar_rom_post_rend.h +++ b/lib_isar/isar_rom_post_rend.h @@ -41,7 +41,6 @@ #include "cnst.h" #include "isar_cnst.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------* * Binuaral split rendering ROM tables *-----------------------------------------------------------------------*/ @@ -74,7 +73,6 @@ extern const int32_t ivas_split_rend_huff_roll_pred_consts[ISAR_SPLIT_REND_ROLL_ extern const int32_t ivas_split_rend_huff_p_d_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3]; extern const int32_t ivas_split_rend_huff_p_d_diff_consts[ISAR_SPLIT_REND_D_QUANT_PNTS][3]; extern const int32_t split_rend_brate_tbl[]; -#endif /* Tables for fixed point conversion */ extern const Word16 fade_table_fx[4]; diff --git a/lib_isar/isar_splitRend_lcld_dec.c b/lib_isar/isar_splitRend_lcld_dec.c index ddf9515b9..723888709 100644 --- a/lib_isar/isar_splitRend_lcld_dec.c +++ b/lib_isar/isar_splitRend_lcld_dec.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "isar_prot.h" #include "ivas_prot_fx.h" #include "prot_fx.h" @@ -282,4 +281,3 @@ void isar_splitBinLCLDDecProcess( return; } -#endif diff --git a/lib_isar/isar_splitRend_lcld_enc.c b/lib_isar/isar_splitRend_lcld_enc.c index 6804e97a4..e75910e8c 100644 --- a/lib_isar/isar_splitRend_lcld_enc.c +++ b/lib_isar/isar_splitRend_lcld_enc.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "isar_prot.h" #include "ivas_prot_fx.h" #ifdef DEBUGGING @@ -236,4 +235,3 @@ void isar_splitBinLCLDEncProcess( return; } -#endif diff --git a/lib_isar/isar_splitRendererPLC.c b/lib_isar/isar_splitRendererPLC.c index e3a0ce0e8..c81d0e12f 100644 --- a/lib_isar/isar_splitRendererPLC.c +++ b/lib_isar/isar_splitRendererPLC.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "ivas_prot_fx.h" #include "prot_fx.h" @@ -1294,4 +1293,3 @@ void isar_splitBinRendPLC( return; } -#endif diff --git a/lib_isar/isar_splitRendererPost.c b/lib_isar/isar_splitRendererPost.c index 32a230318..085cae9fc 100644 --- a/lib_isar/isar_splitRendererPost.c +++ b/lib_isar/isar_splitRendererPost.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG #include @@ -1959,4 +1958,3 @@ void isar_init_split_post_rend_handles( return; } -#endif diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index 9b4e470cf..5447aea1e 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #ifdef SPLIT_REND_WITH_HEAD_ROT_DEBUG #include @@ -3137,4 +3136,3 @@ void lc3plusTimeAlignCldfbPoseCorr( return; } -#endif diff --git a/lib_isar/isar_splitRenderer_utils.c b/lib_isar/isar_splitRenderer_utils.c index e8866f421..bfdb1454f 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -32,7 +32,6 @@ #include #include "options.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "ivas_prot_fx.h" #include "prot_fx.h" @@ -1358,4 +1357,3 @@ Word32 get_bit( } -#endif diff --git a/lib_isar/isar_stat.h b/lib_isar/isar_stat.h index 0b1e1bb07..3fc1580e2 100644 --- a/lib_isar/isar_stat.h +++ b/lib_isar/isar_stat.h @@ -38,7 +38,6 @@ #include "options.h" #include "stat_com.h" #include "ivas_stat_com.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include "isar_lcld_prot.h" #include "isar_lc3plus_enc.h" #include "isar_lc3plus_dec.h" @@ -253,6 +252,5 @@ typedef struct Word32 lc3plusDelaySamples; } SPLIT_REND_WRAPPER; -#endif #endif /* ISAR_STAT_H */ diff --git a/lib_isar/lib_isar_post_rend.c b/lib_isar/lib_isar_post_rend.c index 30f24b2b2..8ad605f40 100644 --- a/lib_isar/lib_isar_post_rend.c +++ b/lib_isar/lib_isar_post_rend.c @@ -38,14 +38,6 @@ #include "prot_fx.h" #include "ivas_prot_fx.h" #include "prot_fx.h" -#ifndef SPLIT_REND_WITH_HEAD_ROT - -int32_t ISAR_POST_REND_void_func( void ) -{ - return 0; -} - -#else #include "ivas_prot_rend_fx.h" #include @@ -1822,4 +1814,3 @@ int32_t ISAR_POST_REND_GetCntFramesLimited( #endif -#endif diff --git a/lib_isar/lib_isar_post_rend.h b/lib_isar/lib_isar_post_rend.h index b919bb1d2..70b46f57c 100644 --- a/lib_isar/lib_isar_post_rend.h +++ b/lib_isar/lib_isar_post_rend.h @@ -36,11 +36,6 @@ #include "common_api_types.h" #include -#ifndef SPLIT_REND_WITH_HEAD_ROT - -int32_t ISAR_POST_REND_void_func( void ); - -#else /*---------------------------------------------------------------------* * Renderer constants @@ -214,7 +209,6 @@ int32_t ISAR_POST_REND_GetCntFramesLimited( ); #endif -#endif /* SPLIT_REND_WITH_HEAD_ROT */ /* clang-format on */ diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 55a306a40..32773ef7a 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -47,13 +47,6 @@ #include "wmc_auto.h" -#ifndef SPLIT_REND_WITH_HEAD_ROT -int32_t ISAR_PRE_REND_void_func( void ) -{ - return 0; -} - -#else /*-------------------------------------------------------------------* * Local constants @@ -238,7 +231,6 @@ void ISAR_PRE_REND_close( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { IF( hSplitBinRend->hCldfbHandles->cldfbSyn[ch] != NULL ) @@ -247,7 +239,6 @@ void ISAR_PRE_REND_close( hSplitBinRend->hCldfbHandles->cldfbSyn[ch] = NULL; } } -#endif free( hSplitBinRend->hCldfbHandles ); hSplitBinRend->hCldfbHandles = NULL; @@ -602,4 +593,3 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( return error; } -#endif diff --git a/lib_isar/lib_isar_pre_rend.h b/lib_isar/lib_isar_pre_rend.h index 41843ec84..dd0ad5755 100644 --- a/lib_isar/lib_isar_pre_rend.h +++ b/lib_isar/lib_isar_pre_rend.h @@ -36,11 +36,6 @@ #include "isar_stat.h" #include "isar_prot.h" -#ifndef SPLIT_REND_WITH_HEAD_ROT - -int32_t ISAR_PRE_REND_void_func( void ); - -#else ivas_error ISAR_PRE_REND_open( SPLIT_REND_WRAPPER *hSplitBinRend, /* i/o: Split renderer pre-renerer handle */ ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, /* i/o: Split renderer pre-renerer config */ @@ -81,5 +76,4 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( Word16 Q_buff, Word16 *Q_out ); -#endif #endif /* LIB_ISAR_PRE_REND_H */ diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 392d8ea99..bf27912f7 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -207,9 +207,7 @@ static ivas_error ivas_rend_initCrend_fx( test(); test(); if ( NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#ifdef SPLIT_REND_WITH_HEAD_ROT && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) -#endif ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" ); @@ -1565,19 +1563,13 @@ static ivas_error ivas_er_init_handle( *------------------------------------------------------------------------*/ ivas_error ivas_rend_initCrendWrapper( -#ifdef SPLIT_REND_WITH_HEAD_ROT CREND_WRAPPER_HANDLE *pCrend, const int16_t num_poses -#else - CREND_WRAPPER_HANDLE *pCrend -#endif ) { Word16 i; CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; -#endif IF( pCrend == NULL ) { @@ -1596,9 +1588,7 @@ ivas_error ivas_rend_initCrendWrapper( move16(); ( *pCrend )->p_io_qfactor = &( *pCrend )->io_qfactor; -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) -#endif { hCrend = NULL; IF( ( hCrend = (CREND_HANDLE) malloc( sizeof( CREND_DATA ) ) ) == NULL ) @@ -1642,17 +1632,12 @@ ivas_error ivas_rend_initCrendWrapper( move32(); move32(); -#ifdef SPLIT_REND_WITH_HEAD_ROT ( *pCrend )->hCrend[pos_idx] = hCrend; -#else - ( *pCrend )->hCrend = hCrend; -#endif } return IVAS_ERR_OK; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*------------------------------------------------------------------------- * ivas_rend_openMultiBinCrend() * @@ -1668,14 +1653,10 @@ ivas_error ivas_rend_openMultiBinCrend( { ivas_error error; -#ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, NULL /* hHrtfStatistics */, output_Fs, pMultiBinPoseData->num_poses ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, output_Fs, pMultiBinPoseData->num_poses ) ) != IVAS_ERR_OK ) -#endif -#else - if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, output_Fs ) ) != IVAS_ERR_OK ) #endif { return error; @@ -1683,7 +1664,6 @@ ivas_error ivas_rend_openMultiBinCrend( return error; } -#endif /*------------------------------------------------------------------------- * ivas_rend_openCrend() @@ -1700,12 +1680,8 @@ ivas_error ivas_rend_openCrend( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES HRTFS_STATISTICS_HANDLE hHrtfStatistics, #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word32 output_Fs, const Word16 num_poses -#else - const Word32 output_Fs -#endif ) { Word16 i, subframe_length; @@ -1713,18 +1689,12 @@ ivas_error ivas_rend_openCrend( HRTFS_HANDLE hHrtf; CREND_HANDLE hCrend; ivas_error error; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; -#endif error = IVAS_ERR_OK; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( error = ivas_rend_initCrendWrapper( pCrend, num_poses ) ) != IVAS_ERR_OK ) -#else - IF( NE_32( ( error = ivas_rend_initCrendWrapper( pCrend ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -1739,15 +1709,9 @@ ivas_error ivas_rend_openCrend( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT for ( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = ( *pCrend )->hCrend[pos_idx]; -#else - hCrend = ( *pCrend )->hCrend; -#endif hHrtf = ( *pCrend )->hHrtfCrend; IF( hHrtf != NULL ) @@ -1933,11 +1897,7 @@ ivas_error ivas_rend_openCrend( move32(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ( *pCrend )->hCrend[pos_idx] = hCrend; -#else - ( *pCrend )->hCrend = hCrend; -#endif } return IVAS_ERR_OK; } @@ -1949,18 +1909,12 @@ ivas_error ivas_rend_openCrend( *------------------------------------------------------------------------*/ void ivas_rend_closeCrend( -#ifdef SPLIT_REND_WITH_HEAD_ROT CREND_WRAPPER_HANDLE *pCrend, const Word16 num_poses -#else - CREND_WRAPPER_HANDLE *pCrend -#endif ) { Word16 i; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; -#endif CREND_HANDLE hCrend; test(); @@ -1974,15 +1928,9 @@ void ivas_rend_closeCrend( ivas_hrtf_close( &( *pCrend )->hHrtfCrend ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = ( *pCrend )->hCrend[pos_idx]; -#else - hCrend = ( *pCrend )->hCrend; -#endif IF( hCrend != NULL ) { FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) @@ -2074,11 +2022,7 @@ void ivas_rend_closeCrend( } free( hCrend ); hCrend = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT ( *pCrend )->hCrend[pos_idx] = hCrend; -#else - ( *pCrend )->hCrend = hCrend; -#endif } } @@ -2089,7 +2033,6 @@ void ivas_rend_closeCrend( } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*------------------------------------------------------------------------- * ivas_rend_closeCldfbRend() * @@ -2111,7 +2054,6 @@ void ivas_rend_closeCldfbRend( return; } -#endif /*-----------------------------------------------------------------------------------------* * Function ivas_rend_crendConvolver() @@ -2126,12 +2068,8 @@ static ivas_error ivas_rend_crendConvolver( Word32 *pcm_in[], // Qx Word32 *pcm_out[], // Qx const Word32 output_Fs, -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word16 i_ts, const Word16 pos_idx -#else - const Word16 i_ts -#endif ) { Word16 i, j, k, m; @@ -2152,11 +2090,7 @@ static ivas_error ivas_rend_crendConvolver( CREND_HANDLE hCrend; ivas_error error; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = pCrend->hCrend[pos_idx]; -#else - hCrend = pCrend->hCrend; -#endif IF( NE_32( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ), IVAS_ERR_OK ) ) { @@ -2397,10 +2331,8 @@ ivas_error ivas_rend_crendProcessSubframe( Word32 *output[], /* i/o: input/output audio channels Qx */ const Word16 n_samples_to_render, /* i : output frame length per channel */ const Word32 output_Fs /* i : output sampling rate */ -#ifdef SPLIT_REND_WITH_HEAD_ROT , const Word16 pos_idx -#endif ) { Word16 subframe_idx, subframe_len; @@ -2412,11 +2344,7 @@ ivas_error ivas_rend_crendProcessSubframe( ivas_error error; Word8 combinedOrientationEnabled; CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = pCrend->hCrend[pos_idx]; -#else - hCrend = pCrend->hCrend; -#endif combinedOrientationEnabled = 0; move16(); @@ -2547,16 +2475,11 @@ ivas_error ivas_rend_crendProcessSubframe( test(); IF( EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || EQ_32( inConfigType, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, tc_local_fx, p_pcm_tmp_fx, output_Fs, 0, pos_idx ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_crendConvolver( pCrend, inConfig, outConfig, tc_local_fx, p_pcm_tmp_fx, output_Fs, 0 ) ), IVAS_ERR_OK ) ) -#endif { return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( pCrend->hCrend[0]->hReverb != NULL ) { IF( NE_32( ( error = ivas_reverb_process_fx( pCrend->hCrend[pos_idx]->hReverb, inConfig, 1, tc_local_fx, p_pcm_tmp_fx, 0 ) ), IVAS_ERR_OK ) ) @@ -2564,15 +2487,6 @@ ivas_error ivas_rend_crendProcessSubframe( return error; } } -#else - IF( pCrend->hCrend->hReverb != NULL ) - { - IF( NE_32( ( error = ivas_reverb_process_fx( pCrend->hCrend->hReverb, inConfig, 1, tc_local_fx, p_pcm_tmp_fx, 0 ) ), IVAS_ERR_OK ) ) - { - return error; - } - } -#endif FOR( ch = 0; ch < nchan_in; ch++ ) { @@ -2598,11 +2512,7 @@ ivas_error ivas_rend_crendProcessSubframe( ivas_combined_orientation_update_index( hCombinedOrientationData, subframe_len ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( pCrend->hCrend[0]->hReverb != NULL ) -#else - IF( pCrend->hCrend->hReverb != NULL ) -#endif { *pCrend->p_io_qfactor = sub( *pCrend->p_io_qfactor, 2 ); move16(); @@ -2633,7 +2543,6 @@ ivas_error ivas_rend_crendProcessSubframe( return IVAS_ERR_OK; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-----------------------------------------------------------------------------------------* * Function ivas_rend_crend_ProcessSplitBin() * @@ -2972,4 +2881,3 @@ ivas_error ivas_rend_crendProcessSubframesSplitBin( return IVAS_ERR_OK; } -#endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index d0a5e47d1..1fb026078 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -108,21 +108,13 @@ static void ivas_dirac_dec_binaural_internal_fx( Decoder_Struct *st_ivas, COMBIN static void ivas_dirac_dec_decorrelate_slot_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, const Word16 num_freq_bands, const Word16 slot, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME] /*q_inp*/[CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word16 q_inp, Word32 decRe[][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 decIm[] /*q_inp*/[CLDFB_NO_CHANNELS_MAX] ); -#ifdef SPLIT_REND_WITH_HEAD_ROT static void ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const Word16 subframe, Word32 *subFrameTotalEne, Word16 *subFrameTotalEne_e, Word32 *IIReneLimiter, Word16 q ); static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, const SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, const PARAMBIN_REND_CONFIG_HANDLE hConfig, Word32 Rmat[3][3], const Word16 subframe, const Word16 isHeadtracked, const Word32 *subFrameTotalEne, Word16 *subFrameTotalEne_e, const Word32 *IIReneLimiter, const MASA_ISM_DATA_HANDLE hMasaIsmData ); -#else -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q*/, Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q*/, Word32 Rmat_fx[3][3] /*Q30*/, const Word16 subframe, const Word16 isHeadtracked, const MASA_ISM_DATA_HANDLE hMasaIsmData, Word16 q ); -#endif static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, PARAMBIN_REND_CONFIG_HANDLE hConfig, const Word16 max_band_decorr, Word32 Rmat[3][3] /*Q30*/, const Word16 subframe, const Word16 isHeadtracked, const Word16 nchanSeparateChannels, const MASA_ISM_DATA_HANDLE hMasaIsmData ); -#ifdef SPLIT_REND_WITH_HEAD_ROT static void ivas_dirac_dec_binaural_process_output_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], Word32 *output_fx[] /*q_out*/, Word16 *q_out, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, const Word16 q_inp, const Word16 max_band_decorr, const Word16 numInChannels, const Word16 processReverb, const Word16 subframe, const Word16 q_mat, Word32 outRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 outIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 reverbRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 reverbIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 decorrRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 decorrIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word16 *Q_inp_mix, const Word8 recompute ); -#else -static void ivas_dirac_dec_binaural_process_output_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, HANDLE_CLDFB_FILTER_BANK cldfbSynDec[MAX_OUTPUT_CHANNELS], Word32 *output_fx[] /*q_out*/, Word16 *q_out, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, const Word16 q_inp, const Word16 max_band_decorr, const Word16 numInChannels, const Word16 processReverb, const Word16 subframe, const Word16 q_mat ); -#endif static void adaptTransportSignalsHeadtracked_fx( COMBINED_ORIENTATION_HANDLE hHeadTrackData, Word32 inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word32 inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /*q_inp*/, Word16 q_inp, const Word16 nBins, const Word16 nSlots, Word32 Rmat[3][3] /*Q30*/ ); @@ -140,11 +132,7 @@ static void getDirectPartGains_fx( const Word16 bin, Word16 aziDeg, Word16 eleDe static void getDirectPartGains_fx( const Word16 bin, Word16 aziDeg, Word16 eleDeg, Word32 *lRealp, Word32 *lImagp, Word32 *rRealp, Word32 *rImagp, const UWord8 renderStereoOutputInsteadOfBinaural, Word32 Rmat[3][3] /*Q30*/, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const Word16 isHeadtracked ); #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaExtRend, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[] /*Q11*/, const Word16 subframe, const SPLIT_REND_WRAPPER *hSplitRendWrapper, Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ); -#else -static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaExtRend, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[] /*Q11*/, const Word16 subframe ); -#endif static void formulate2x2MixingMatrix_fx( Word32 Ein1_fx /*q_Ein*/, Word32 Ein2_fx /*q_Ein*/, Word16 q_Ein, Word32 CinRe_fx /*q_Cin*/, Word32 CinIm_fx /*q_Cin*/, Word16 q_Cin, Word32 Eout1_fx /*q_Eout*/, Word32 Eout2_fx /*q_Eout*/, Word16 q_Eout, Word32 CoutRe_fx /*q_Cout*/, Word32 CoutIm_fx /*q_Cout*/, Word16 q_Cout, Word32 Q_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*Q31*/, Word32 Mre_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_M*/, Word32 Mim_fx[BINAURAL_CHANNELS][BINAURAL_CHANNELS] /*q_M*/, Word16 *q_M, const Word16 regularizationFactor_fx /*Q14*/ ); @@ -189,7 +177,6 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( Word16 tmp2; ivas_error error; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 num_poses, pos_idx; num_poses = 1; @@ -203,9 +190,6 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( { hDiracDecBin = st_ivas->hDiracDecBin[pos_idx]; move32(); -#else - hDiracDecBin = st_ivas->hDiracDecBin; -#endif IF( hDiracDecBin == NULL ) { @@ -328,11 +312,7 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( ivas_binaural_reverb_close_fx( &( hDiracDecBin->hReverb ) ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( hDiracDecBin->hReverb == NULL && EQ_16( pos_idx, 0 ) ) /* open reverb only for the main direction */ -#else - IF( hDiracDecBin->hReverb == NULL ) -#endif { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES @@ -377,10 +357,8 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( ivas_dirac_dec_decorr_close_fx( &hDiracDecBin->h_freq_domain_decorr_ap_params, &hDiracDecBin->h_freq_domain_decorr_ap_state ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( pos_idx == 0 ) /* open decorrelator only for the main direction */ { -#endif IF( NE_32( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hDiracDecBin->hTdDecorr ), &( hDiracDecBin->useTdDecorr ) ) ), IVAS_ERR_OK ) ) { return error; @@ -407,13 +385,11 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( return error; } } -#ifdef SPLIT_REND_WITH_HEAD_ROT } else { hDiracDecBin->useTdDecorr = st_ivas->hDiracDecBin[0]->useTdDecorr; /* copy the flag, but the implementation re-uses the decorrelated signal */ } -#endif hDiracDecBin->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); /* Q14 */ move16(); @@ -422,12 +398,8 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( hDiracDecBin->phHrtfParambin = phHrtfParambin; #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT st_ivas->hDiracDecBin[pos_idx] = hDiracDecBin; } -#else - st_ivas->hDiracDecBin = hDiracDecBin; -#endif /* allocate transport channels */ IF( st_ivas->hTcBuffer == NULL ) @@ -468,16 +440,13 @@ void ivas_dirac_dec_close_binaural_data( DIRAC_DEC_BIN_HANDLE *hBinaural /* i/o: decoder DirAC binaural data handle */ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; -#endif test(); IF( hBinaural == NULL || *hBinaural == NULL ) { return; } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { IF( hBinaural[pos_idx] != NULL ) @@ -498,21 +467,6 @@ void ivas_dirac_dec_close_binaural_data( hBinaural[pos_idx] = NULL; } } -#else - IF( ( *hBinaural )->hReverb != NULL ) - { - ivas_binaural_reverb_close_fx( &( ( *hBinaural )->hReverb ) ); - } - - ivas_td_decorr_dec_close( &( ( *hBinaural )->hTdDecorr ) ); - IF( ( *hBinaural )->h_freq_domain_decorr_ap_params != NULL ) - { - ivas_dirac_dec_decorr_close_fx( &( *hBinaural )->h_freq_domain_decorr_ap_params, &( *hBinaural )->h_freq_domain_decorr_ap_state ); - } - - free( *hBinaural ); - *hBinaural = NULL; -#endif return; } @@ -720,7 +674,6 @@ static void ivas_dirac_dec_binaural_internal_fx( Word16 nBins, offsetSamples; Word16 i, j; Word16 q_mat, q_out; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; Word32 tmp_Cldfb_out_re[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; @@ -736,9 +689,6 @@ static void ivas_dirac_dec_binaural_internal_fx( Word16 Q_inp_mix; hDiracDecBin = st_ivas->hDiracDecBin[0]; -#else - hDiracDecBin = st_ivas->hDiracDecBin; -#endif assert( hDiracDecBin ); hSpatParamRendCom = st_ivas->hSpatParamRendCom; nBins = hSpatParamRendCom->num_freq_bands; @@ -1026,18 +976,13 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( EQ_16( nchan_transport, 2 ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT /* in case of split rendering, determine the prototype rotation based on the main direction and use the same prototypes for the offset directions */ -#endif adaptTransportSignalsHeadtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); } } test(); -#ifndef SPLIT_REND_WITH_HEAD_ROT - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, Rmat_fx, subframe, hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, st_ivas->hMasaIsmData, q_inp ); -#endif IF( EQ_32( config_data.ivas_format, ISM_FORMAT ) ) { @@ -1055,13 +1000,11 @@ static void ivas_dirac_dec_binaural_internal_fx( move16(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, subframe, subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, q_inp ); ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Rmat_fx, subframe, hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, st_ivas->hMasaIsmData ); -#endif nchanSeparateChannels = 0; move16(); @@ -1128,7 +1071,6 @@ static void ivas_dirac_dec_binaural_internal_fx( hDiracDecBin->q_processMtxDecPrev = q_mat; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT pMultiBinPoseData = NULL; IF( st_ivas->hSplitBinRend != NULL ) { @@ -1136,11 +1078,7 @@ static void ivas_dirac_dec_binaural_internal_fx( move32(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - if ( pMultiBinPoseData != NULL && pMultiBinPoseData->num_poses > 1 ) -#endif { ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, tmp_Cldfb_out_re, tmp_Cldfb_out_im, reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 1 ); @@ -1159,13 +1097,9 @@ static void ivas_dirac_dec_binaural_internal_fx( ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, NULL, NULL, reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 1 ); } -#else - ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, st_ivas->cldfbSynDec, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat ); -#endif hDiracDecBin->hDiffuseDist = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( pMultiBinPoseData != NULL && pMultiBinPoseData->num_poses > 1 ) { /* quaternion-based rotation from ivas_binRenderer_internal.c:ivas_binRenderer(), but using absolute rotation instead of delta rotations */ @@ -1277,7 +1211,6 @@ static void ivas_dirac_dec_binaural_internal_fx( } /* update this counter only after the last rendering of split directions */ -#endif hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe] ); hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); @@ -1361,7 +1294,6 @@ static void ivas_dirac_dec_decorrelate_slot_fx( } -#ifdef SPLIT_REND_WITH_HEAD_ROT static void ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, @@ -1670,675 +1602,23 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( set32_fx( hDiracDecBin->ChCrossImOut_fx, 0, nBins ); set16_fx( hDiracDecBin->ChCrossReOut_e, 0, nBins ); set16_fx( hDiracDecBin->ChCrossImOut_e, 0, nBins ); - - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - set32_fx( hDiracDecBin->ChEneOut_fx[ch], 0, nBins ); - set16_fx( hDiracDecBin->ChEneOut_e[ch], 0, nBins ); - } - set32_fx( hDiracDecBin->frameMeanDiffuseness_fx, 0, nBins ); - - set32_fx( frameMeanDiffusenessEneWeight_fx, 0, CLDFB_NO_CHANNELS_MAX ); - - FOR( idx = 0; idx < MAX_GAIN_CACHE_SIZE; idx++ ) - { - gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ - move16(); - } - - dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; - - /* Determine target covariance matrix containing target binaural properties */ - FOR( bin = 0; bin < nBins; bin++ ) - { - Word32 diffuseness_fx = ONE_IN_Q30; /* ratio1 and ratio2 are subtracted from diffuseness further below */ - Word32 diffusenessValForDecorrelationReduction_fx = ONE_IN_Q30; - Word32 diffEneValForDecorrelationReduction_fx; - Word16 q_diffEneValForDecorrelationReduction; - Word16 surCoh_fx = 0, spreadCoh_fx = 0; /* Default values if spreadSurroundCoherenceApplied == false */ - Word32 diffEne_fx, dirEne_fx, meanEnePerCh_fx; - Word16 q_meanEnePerCh; - Word16 q_diffEne, q_dirEne; - Word16 dirIndex; - move16(); - move16(); - move32(); - move32(); - - /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. - * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the - * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match - * the early spectrum of the BRIR data, using the spectral correction data in - * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ - meanEnePerCh_fx = Mpy_32_32( hDiracDecBin->earlyPartEneCorrection_fx[bin], subFrameTotalEne_fx[bin] ); // Q( q_meanEnePerCh ) - q_meanEnePerCh = add( sub( q_earlyPartEneCorrection, subFrameTotalEne_e[bin] ), 1 ); // q_earlyPartEneCorrection + 31 - subFrameTotalEne_e[bin] - 31 + Q1(0.5f) - /* Determine direct part target covariance matrix (for 1 or 2 directions) */ - FOR( dirIndex = 0; dirIndex < hSpatParamRendCom->numSimultaneousDirections; dirIndex++ ) - { - Word16 aziDeg, eleDeg; - Word32 lRealp_fx, lImagp_fx, rRealp_fx, rImagp_fx; - Word32 lRealpTmp_fx, lImagpTmp_fx, rRealpTmp_fx, rImagpTmp_fx; - Word32 hrtfEne_fx[BINAURAL_CHANNELS], hrtfCrossRe_fx, hrtfCrossIm_fx, ratio_fx; - UWord8 isIsmDirection = 0; - move16(); - - test(); - test(); - IF( dirIndex == 0 ) /* For first of the two simultaneous directions */ - { - aziDeg = hSpatParamRendCom->azimuth[dirac_read_idx][bin]; - move16(); - eleDeg = hSpatParamRendCom->elevation[dirac_read_idx][bin]; - move16(); - ratio_fx = hSpatParamRendCom->energy_ratio1_fx[dirac_read_idx][bin]; - move32(); - spreadCoh_fx = hSpatParamRendCom->spreadCoherence_fx[dirac_read_idx][bin]; - move16(); - gainCacheBaseIndex = 0; - move16(); - } - ELSE IF( NE_32( ivas_format, MASA_ISM_FORMAT ) || ( EQ_32( ivas_format, MASA_ISM_FORMAT ) && LT_16( dirIndex, hSpatParamRendCom->numParametricDirections ) ) ) /* For second of the two simultaneous directions */ - { - IF( LT_32( ( ratio_fx = hSpatParamRendCom->energy_ratio2_fx[dirac_read_idx][bin] ), 10737418 /* 0.01 in Q30 */ ) ) - { - /* This touches only MASA path where second direction always has smaller ratio and - * for non-2dir it is zero. As the whole direction contribution is multiplied with - * the ratio, a very small ratio does not contribute any energy to output. Thus, - * it is better to save complexity. */ - CONTINUE; - } - aziDeg = hSpatParamRendCom->azimuth2[dirac_read_idx][bin]; - move16(); - eleDeg = hSpatParamRendCom->elevation2[dirac_read_idx][bin]; - move16(); - spreadCoh_fx = hSpatParamRendCom->spreadCoherence2_fx[dirac_read_idx][bin]; - move16(); - gainCacheBaseIndex = 3; - move16(); - } - ELSE /* For object directions of MASA_ISM_FORMAT */ - { - isIsmDirection = 1; - move16(); - UWord16 ismDirIndex; - ismDirIndex = sub( dirIndex, hSpatParamRendCom->numParametricDirections ); - assert( hMasaIsmData != NULL && "hMasaIsmData should not be NULL if we use it" ); - IF( hMasaIsmData->ism_is_edited[ismDirIndex] ) - { - aziDeg = hMasaIsmData->azimuth_ism_edited[ismDirIndex]; - move16(); - eleDeg = hMasaIsmData->elevation_ism_edited[ismDirIndex]; - move16(); - } - ELSE - { - aziDeg = hMasaIsmData->azimuth_ism[ismDirIndex][dirac_read_idx]; - move16(); - eleDeg = hMasaIsmData->elevation_ism[ismDirIndex][dirac_read_idx]; - move16(); - } - ratio_fx = hMasaIsmData->energy_ratio_ism_fx[ismDirIndex][dirac_read_idx][bin]; - move32(); - spreadCoh_fx = 0; - move16(); - gainCacheBaseIndex = add( 6, ismDirIndex ); - } - - diffuseness_fx = L_sub( diffuseness_fx, ratio_fx ); /* diffuseness = 1 - ratio1 - ratio2 */ - - if ( diffuseness_fx < 0 ) - { - diffuseness_fx = 0; - move32(); - } - IF( isIsmDirection ) - { - /* Objects cause lesser decorrelation reduction, to avoid removing all decorrelation when only objects are present */ - diffusenessValForDecorrelationReduction_fx = L_sub( diffusenessValForDecorrelationReduction_fx, L_shr( ratio_fx, 1 ) ); /*Q30*/ - } - ELSE - { - diffusenessValForDecorrelationReduction_fx = L_sub( diffusenessValForDecorrelationReduction_fx, ratio_fx ); /*Q30*/ - } - - IF( separateCenterChannelRendering ) - { - /* In masa + mono rendering mode, the center directions originate from phantom sources, so the - * spread coherence is increased */ - Word16 azi_scaled, ele_scaled; - Word32 doaVectorX_fx, num, den; - Word16 e = 0, spatialAngleDeg_fx, altSpreadCoh_fx; - move16(); - - azi_scaled = i_mult( aziDeg, 91 ); - ele_scaled = i_mult( eleDeg, 91 ); - doaVectorX_fx = L_mult( getCosWord16R2( azi_scaled ), getCosWord16R2( ele_scaled ) ); /*Q31*/ - num = Sqrt32( L_sub( ONE_IN_Q31, Mpy_32_32( doaVectorX_fx, doaVectorX_fx ) ), &e ); - den = doaVectorX_fx; - move32(); - spatialAngleDeg_fx = BASOP_util_atan2( num, den, e ); // Q13 - Word16 numr, num_e = 0, denr, den_e; - move16(); - num_e = sub( norm_s( spatialAngleDeg_fx ), 1 ); - numr = shl( spatialAngleDeg_fx, num_e ); - denr = 17157; - move16(); - den_e = 4; - move16(); - altSpreadCoh_fx = sub( 32767, shl_sat( div_s( numr, denr ), sub( den_e, num_e ) ) ); // 4289 = pi/6 in Q13 - spreadCoh_fx = s_max( spreadCoh_fx, altSpreadCoh_fx ); - } - -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked, *hDiracDecBin->phHrtfParambin ); -#else - getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked ); -#endif - - Word16 q_lr = Q28; - move16(); - if ( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) - { - /* Synthesizing spread coherence is not needed for stereo loudspeaker output, - * as directional sound is reproduced with two loudspeakers in any case */ - spreadCoh_fx = 0; - move32(); - } - - IF( spreadCoh_fx > 0 ) - { - Word32 centerMul_fx, sidesMul_fx; - Word32 hrtfEneCenter_fx, hrtfEneSides_fx, hrtfEneRealized_fx; - Word16 eneCorrectionFactor_fx, eneCorrectionFactor_e; - Word16 w1_fx, w2_fx, w3_fx, eq_fx; - - hrtfEneCenter_fx = L_add( Mpy_32_32( lRealp_fx, lRealp_fx ), // Q25 - L_add( Mpy_32_32( lImagp_fx, lImagp_fx ), // Q25 - L_add( Mpy_32_32( rRealp_fx, rRealp_fx ), // Q25 - Mpy_32_32( rImagp_fx, rImagp_fx ) ) ) ); // Q25 - - /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. - * The following formulas determine the gains for these sources. - * spreadCoh = 0: Only panning - * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) - * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ - IF( LT_16( spreadCoh_fx, 16384 ) ) - { - /* 0.0f < spreadCoh < 0.5f */ - sidesMul_fx = L_mult0( spreadCoh_fx, 9459 ); /* 2*sqrt(1/3) in Q13 = 9459 */ // Q28 - centerMul_fx = L_add( L_sub( ONE_IN_Q28, L_shl( spreadCoh_fx, 14 ) ), sidesMul_fx ); // Q28 - } - ELSE - { - /* 0.5f <= spreadCoh < 1.0f */ - // centerMul = 2.0f - ( 2.0f * spreadCoh ); - centerMul_fx = L_shl( sub( 32767, spreadCoh_fx ), 14 ); // Q28 - sidesMul_fx = Isqrt( L_add( L_shr( centerMul_fx, 22 ), L_shl( 2, Q6 ) ) ); // Q28 - centerMul_fx = L_shl( Mpy_32_32( centerMul_fx, sidesMul_fx ), 3 ); // Q28 - } - - /* Apply the gain for the center source of the three coherent sources */ - lRealp_fx = Mpy_32_32( lRealp_fx, centerMul_fx ); // Q25 - lImagp_fx = Mpy_32_32( lImagp_fx, centerMul_fx ); // Q25 - rRealp_fx = Mpy_32_32( rRealp_fx, centerMul_fx ); // Q25 - rImagp_fx = Mpy_32_32( rImagp_fx, centerMul_fx ); // Q25 - - /* Apply the gain for the left source of the three coherent sources */ -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked, *hDiracDecBin->phHrtfParambin ); -#else - getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); -#endif - - hrtfEneSides_fx = L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 - L_add( Mpy_32_32( lImagpTmp_fx, lImagpTmp_fx ), // Q25 - L_add( Mpy_32_32( rRealpTmp_fx, rRealpTmp_fx ), // Q25 - Mpy_32_32( rImagpTmp_fx, rImagpTmp_fx ) ) ) ); // Q25 - lRealp_fx = L_add( lRealp_fx, Mpy_32_32( sidesMul_fx, lRealpTmp_fx ) ); // Q25 - lImagp_fx = L_add( lImagp_fx, Mpy_32_32( sidesMul_fx, lImagpTmp_fx ) ); // Q25 - rRealp_fx = L_add( rRealp_fx, Mpy_32_32( sidesMul_fx, rRealpTmp_fx ) ); // Q25 - rImagp_fx = L_add( rImagp_fx, Mpy_32_32( sidesMul_fx, rImagpTmp_fx ) ); // Q25 - - /* Apply the gain for the right source of the three coherent sources. - * -30 degrees to 330 wrapping due to internal functions. */ - -#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF - getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked, *hDiracDecBin->phHrtfParambin ); -#else - getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked ); -#endif - - hrtfEneSides_fx = L_add( hrtfEneSides_fx, - L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 - L_add( Mpy_32_32( lImagpTmp_fx, lImagpTmp_fx ), // Q25 - L_add( Mpy_32_32( rRealpTmp_fx, rRealpTmp_fx ), // Q25 - Mpy_32_32( rImagpTmp_fx, rImagpTmp_fx ) ) ) ) ); // Q25 - lRealp_fx = L_add( lRealp_fx, Mpy_32_32( sidesMul_fx, lRealpTmp_fx ) ); // Q25 - lImagp_fx = L_add( lImagp_fx, Mpy_32_32( sidesMul_fx, lImagpTmp_fx ) ); // Q25 - rRealp_fx = L_add( rRealp_fx, Mpy_32_32( sidesMul_fx, rRealpTmp_fx ) ); // Q25 - rImagp_fx = L_add( rImagp_fx, Mpy_32_32( sidesMul_fx, rImagpTmp_fx ) ); // Q25 - - /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ - hrtfEneRealized_fx = L_add( Mpy_32_32( lRealp_fx, lRealp_fx ), // Q19 - L_add( Mpy_32_32( lImagp_fx, lImagp_fx ), // Q19 - L_add( Mpy_32_32( rRealp_fx, rRealp_fx ), // Q19 - Mpy_32_32( rImagp_fx, rImagp_fx ) ) ) ); // Q19 - - eneCorrectionFactor_fx = BASOP_Util_Divide3232_Scale( L_add( Mpy_32_32( hrtfEneSides_fx, Mpy_32_32( sidesMul_fx, sidesMul_fx ) ), - Mpy_32_32( hrtfEneCenter_fx, Mpy_32_32( centerMul_fx, centerMul_fx ) ) ), - L_max( 1, hrtfEneRealized_fx ), &eneCorrectionFactor_e ); - - /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ - IF( LT_16( spreadCoh_fx, 16384 ) ) - { - w1_fx = sub( 32767, shl( spreadCoh_fx, 1 ) ); /*Q15*/ - w2_fx = shl( spreadCoh_fx, 1 ); /*Q15*/ - w3_fx = 0; - move16(); - } - ELSE - { - w1_fx = 0; - move16(); - w2_fx = shl( sub( 32767, spreadCoh_fx ), 1 ); /*Q15*/ - w3_fx = shl( sub( spreadCoh_fx, 16384 ), 1 ); /*Q15*/ - } - - test(); - IF( ( EQ_32( ivas_format, MC_FORMAT ) && EQ_32( mc_mode, MC_MODE_MCMASA ) ) ) - { - idx = s_min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - - /* Apply the target spectrum to the eneCorrectionFactor */ - IF( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ - { - eneCorrectionFactor_fx = mult_r( eneCorrectionFactor_fx, add( mult_r( w1_fx, 8192 ), shr( mult_r( add( w2_fx, w3_fx ), spreadCohEne1_fx[idx] ), 1 ) ) ); - eneCorrectionFactor_e = add( eneCorrectionFactor_e, 2 ); - } - ELSE - { - eneCorrectionFactor_fx = mult_r( eneCorrectionFactor_fx, add( mult_r( w1_fx, 4096 ), add( shr( mult_r( w2_fx, spreadCohEne05_fx[idx] ), 1 ), shr( mult_r( w3_fx, spreadCohEne1_fx[idx] ), 2 ) ) ) ); - eneCorrectionFactor_e = add( eneCorrectionFactor_e, 3 ); - } - } - - /* Equalize the spread coherent combined HRTFs */ - Word16 tmp, tmp_e; - tmp_e = eneCorrectionFactor_e; - move16(); - tmp = Sqrt16( eneCorrectionFactor_fx, &tmp_e ); - IF( GE_16( shr( tmp, sub( 15, tmp_e ) ), 4 ) ) - { - eq_fx = 32767; // Q13 - move16(); - } - ELSE - { - eq_fx = shl( tmp, sub( tmp_e, 2 ) ); // Q13 - } - - lRealp_fx = Mpy_32_16_1( lRealp_fx, eq_fx ); // Q23 - lImagp_fx = Mpy_32_16_1( lImagp_fx, eq_fx ); // Q23 - rRealp_fx = Mpy_32_16_1( rRealp_fx, eq_fx ); // Q23 - rImagp_fx = Mpy_32_16_1( rImagp_fx, eq_fx ); // Q23 - q_lr = Q23; - move16(); - } - - hrtfEne_fx[0] = L_add( Mpy_32_32( lRealp_fx, lRealp_fx ), Mpy_32_32( lImagp_fx, lImagp_fx ) ); // Q( 2*q_lr - 31 ) - hrtfEne_fx[1] = L_add( Mpy_32_32( rRealp_fx, rRealp_fx ), Mpy_32_32( rImagp_fx, rImagp_fx ) ); // Q( 2*q_lr - 31 ) - move32(); - move32(); - hrtfCrossRe_fx = L_add( Mpy_32_32( lRealp_fx, rRealp_fx ), Mpy_32_32( lImagp_fx, rImagp_fx ) ); // Q( 2*q_lr - 31 ) - hrtfCrossIm_fx = L_add( Mpy_32_32( -lImagp_fx, rRealp_fx ), Mpy_32_32( lRealp_fx, rImagp_fx ) ); // Q( 2*q_lr - 31 ) - - /* Add direct part (1 or 2) covariance matrix */ - dirEne_fx = Mpy_32_32( ratio_fx, meanEnePerCh_fx ); // Q(q_meanEnePerCh - 1) - shift = norm_l( dirEne_fx ); - dirEne_fx = L_shl( dirEne_fx, shift ); - q_dirEne = add( sub( q_meanEnePerCh, 1 ), shift ); - - hDiracDecBin->ChEneOut_fx[0][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[0][bin], hDiracDecBin->ChEneOut_e[0][bin], Mpy_32_32( dirEne_fx, hrtfEne_fx[0] ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChEneOut_e[0][bin] ); /* Dir ene part*/ - hDiracDecBin->ChEneOut_fx[1][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[1][bin], hDiracDecBin->ChEneOut_e[1][bin], Mpy_32_32( dirEne_fx, hrtfEne_fx[1] ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChEneOut_e[1][bin] ); - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( dirEne_fx, hrtfCrossRe_fx ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChCrossReOut_e[bin] ); /* Dir cross re */ - hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( dirEne_fx, hrtfCrossIm_fx ), sub( 31, sub( add( q_dirEne, shl( q_lr, 1 ) ), 62 ) ), &hDiracDecBin->ChCrossImOut_e[bin] ); /* Dir cross im */ - move32(); - move32(); - move32(); - move32(); - } - - /* Add diffuse / ambient part covariance matrix */ - diffuseness_fx = L_max( 0, diffuseness_fx ); // Q30 - diffEne_fx = Mpy_32_32( diffuseness_fx, meanEnePerCh_fx ); // Q(2q - 32) - shift = norm_l( diffEne_fx ); - diffEne_fx = L_shl( diffEne_fx, shift ); - q_diffEne = add( shift, sub( q_meanEnePerCh, 1 ) ); - - surCoh_fx = hSpatParamRendCom->surroundingCoherence_fx[dirac_read_idx][bin]; // Q15 - move16(); - - diffusenessValForDecorrelationReduction_fx = L_max( 0, diffusenessValForDecorrelationReduction_fx ); // Q30 - diffEneValForDecorrelationReduction_fx = Mpy_32_32( diffusenessValForDecorrelationReduction_fx, meanEnePerCh_fx ); // resulting Q = q_meanEnePerCh - 1 - q_diffEneValForDecorrelationReduction = sub( q_meanEnePerCh, 1 ); - - test(); - IF( ( EQ_32( ivas_format, MC_FORMAT ) && EQ_32( mc_mode, MC_MODE_MCMASA ) ) ) - { - IF( !hDiracDecBin->renderStereoOutputInsteadOfBinaural ) - { - Word32 spectrumModVal; - - idx = s_min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ - spectrumModVal = L_add( L_sub( ONE_IN_Q29, L_shl( surCoh_fx, 14 ) ), L_mult( surCoh_fx, surCohEne_fx[idx] ) ); // Q29 - diffEne_fx = Mpy_32_32( diffEne_fx, spectrumModVal ); // Q-2 - q_diffEne = sub( q_diffEne, 2 ); - /* Modify also the value for decorrelation reduction */ - diffEneValForDecorrelationReduction_fx = Mpy_32_32( diffEneValForDecorrelationReduction_fx, spectrumModVal ); // Q-2 - q_diffEneValForDecorrelationReduction = sub( q_diffEneValForDecorrelationReduction, 2 ); - } - } - hDiracDecBin->ChEneOut_fx[0][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[0][bin], hDiracDecBin->ChEneOut_e[0][bin], diffEne_fx, sub( 31, q_diffEne ), &hDiracDecBin->ChEneOut_e[0][bin] ); /* Diff ene part*/ - hDiracDecBin->ChEneOut_fx[1][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[1][bin], hDiracDecBin->ChEneOut_e[1][bin], diffEne_fx, sub( 31, q_diffEne ), &hDiracDecBin->ChEneOut_e[1][bin] ); - - move32(); - move32(); - IF( hDiracDecBin->renderStereoOutputInsteadOfBinaural ) - { - /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_16_1( diffEne_fx, surCoh_fx ), sub( 31, q_diffEne ), &hDiracDecBin->ChCrossReOut_e[bin] ); - move32(); - } - ELSE /* When rendering binaural, ambience has frequency dependent ICC. */ - { - test(); - test(); - IF( ( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) && LT_16( bin, BINAURAL_COHERENCE_DIFFERENCE_BINS ) ) - { - Word32 diffuseFieldCoherence_fx; - Word16 tmp_exp; - temp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( hDiracDecBin->hDiffuseDist->diffuseRatioX_fx[bin], hDiracDecBin->diffuseFieldCoherenceX_fx[bin] ), 0, Mpy_32_32( hDiracDecBin->hDiffuseDist->diffuseRatioY_fx[bin], hDiracDecBin->diffuseFieldCoherenceY_fx[bin] ), 0, &tmp_exp ); - diffuseFieldCoherence_fx = BASOP_Util_Add_Mant32Exp( temp, tmp_exp, Mpy_32_32( hDiracDecBin->hDiffuseDist->diffuseRatioZ_fx[bin], hDiracDecBin->diffuseFieldCoherenceZ_fx[bin] ), 0, &tmp_exp ); - temp = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( diffuseFieldCoherence_fx, sub( 32767, surCoh_fx ) ), tmp_exp, L_shl( surCoh_fx, 16 ), 0, &tmp_exp ); - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( temp, diffEne_fx ), add( tmp_exp, sub( 31, q_diffEne ) ), &hDiracDecBin->ChCrossReOut_e[bin] ); - } - ELSE - { - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( L_add( Mpy_32_16_1( hDiracDecBin->diffuseFieldCoherence_fx[bin], sub( 32767, surCoh_fx ) ), L_shl( surCoh_fx, 16 ) ), diffEne_fx ), sub( 31, q_diffEne ), &hDiracDecBin->ChCrossReOut_e[bin] ); - } - move32(); - } - - /* Store parameters for formulating average diffuseness over frame */ - Word32 frameMeanDiffuseness = BASOP_Util_Add_Mant32Exp( hDiracDecBin->frameMeanDiffuseness_fx[bin], 2 /*Q29*/, diffEneValForDecorrelationReduction_fx, sub( 31, q_diffEneValForDecorrelationReduction ), &exp1 ); // exp = exp1 - frameMeanDiffusenessEneWeight_fx[bin] = L_add( frameMeanDiffusenessEneWeight_fx[bin], meanEnePerCh_fx ); - move32(); - - /* Formulate average diffuseness over frame */ - frameMeanDiffuseness = BASOP_Util_Divide3232_Scale_cadence( frameMeanDiffuseness, L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &exp ); // exp = exp + 31 - q_meanEnePerCh - exp1 - exp = sub( exp, sub( sub( 31, q_meanEnePerCh ), exp1 ) ); - hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( frameMeanDiffuseness, sub( exp, 2 ) ); // Q29 - move32(); - } - - FOR( bin = 0; bin < nBins; bin++ ) - { - hDiracDecBin->ChCrossReOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossReOut_fx[bin], qualityBasedSmFactor_fx ); - hDiracDecBin->ChCrossImOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossImOut_fx[bin], qualityBasedSmFactor_fx ); - - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - hDiracDecBin->ChEneOut_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEneOut_fx[ch][bin], qualityBasedSmFactor_fx ); - move32(); - } - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossReOutPrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossReOutPrev_e[bin], &hDiracDecBin->ChCrossReOut_e[bin] ); - hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImOutPrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossImOutPrev_e[bin], &hDiracDecBin->ChCrossImOut_e[bin] ); - move32(); - move32(); - - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - hDiracDecBin->ChEneOut_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[ch][bin], hDiracDecBin->ChEneOut_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEneOutPrev_fx[ch][bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChEneOutPrev_e[ch][bin], &hDiracDecBin->ChEneOut_e[ch][bin] ); - move32(); - } - - - hDiracDecBin->ChCrossReOutPrev_fx[bin] = hDiracDecBin->ChCrossReOut_fx[bin]; - move32(); - hDiracDecBin->ChCrossImOutPrev_fx[bin] = hDiracDecBin->ChCrossImOut_fx[bin]; - move32(); - hDiracDecBin->ChCrossReOutPrev_e[bin] = hDiracDecBin->ChCrossReOut_e[bin]; - move16(); - hDiracDecBin->ChCrossImOutPrev_e[bin] = hDiracDecBin->ChCrossImOut_e[bin]; - move16(); - - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - hDiracDecBin->ChEnePrev_fx[ch][bin] = hDiracDecBin->ChEne_fx[ch][bin]; - move32(); - hDiracDecBin->ChEnePrev_e[ch][bin] = hDiracDecBin->ChEne_e[ch][bin]; - move16(); - hDiracDecBin->ChEneOutPrev_fx[ch][bin] = hDiracDecBin->ChEneOut_fx[ch][bin]; - move32(); - hDiracDecBin->ChEneOutPrev_e[ch][bin] = hDiracDecBin->ChEneOut_e[ch][bin]; - move16(); - } - } - - return; -} - - -#else -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( - DIRAC_DEC_BIN_HANDLE hDiracDecBin, - SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, - PARAMBIN_REND_CONFIG_HANDLE hConfig, - Word32 inRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q*/ - Word32 inIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /*q*/ - Word32 Rmat_fx[3][3], /*Q30*/ - const Word16 subframe, - const Word16 isHeadtracked, - const MASA_ISM_DATA_HANDLE hMasaIsmData, - Word16 q ) -{ - Word16 ch, slot, bin; - Word16 separateCenterChannelRendering; - Word16 nBins, idx, shift; - Word32 frameMeanDiffusenessEneWeight_fx[CLDFB_NO_CHANNELS_MAX]; - Word32 IIReneLimiterFactor_fx; // Q26 - Word32 qualityBasedSmFactor_fx; - Word32 lowBitRateEQ_fx[CLDFB_NO_CHANNELS_MAX]; - UWord8 applyLowBitRateEQ; - Word16 dirac_read_idx; - Word32 subFrameTotalEne_fx[CLDFB_NO_CHANNELS_MAX]; - Word16 subFrameTotalEne_e[CLDFB_NO_CHANNELS_MAX]; - PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE]; - IVAS_FORMAT ivas_format; - MC_MODE mc_mode; - Word32 ivas_total_brate; - Word16 nchan_transport; - Word16 gainCacheBaseIndex; - Word16 q_earlyPartEneCorrection; - Word16 exp, exp1; - Word64 temp64; - Word32 temp; - - separateCenterChannelRendering = hConfig->separateCenterChannelRendering; - move16(); - ivas_format = hConfig->ivas_format; - move32(); - mc_mode = hConfig->mc_mode; - move32(); - ivas_total_brate = hConfig->ivas_total_brate; - move32(); - nchan_transport = hConfig->nchan_transport; - move16(); - qualityBasedSmFactor_fx = hConfig->qualityBasedSmFactor_fx; /*Q31*/ - move32(); - qualityBasedSmFactor_fx = Mpy_32_32( qualityBasedSmFactor_fx, qualityBasedSmFactor_fx ); /*Q31*/ - - nBins = hSpatParamRendCom->num_freq_bands; /* Actually bins */ - move16(); - - q_earlyPartEneCorrection = s_min( Q31, add( getScaleFactor32( hDiracDecBin->earlyPartEneCorrection_fx, nBins ), hDiracDecBin->q_earlyPartEneCorrection ) ); - scale_sig32( hDiracDecBin->earlyPartEneCorrection_fx, nBins, sub( q_earlyPartEneCorrection, hDiracDecBin->q_earlyPartEneCorrection ) ); - hDiracDecBin->q_earlyPartEneCorrection = q_earlyPartEneCorrection; - move16(); - - set32_fx( hDiracDecBin->ChCrossRe_fx, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossIm_fx, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossReOut_fx, 0, nBins ); - set32_fx( hDiracDecBin->ChCrossImOut_fx, 0, nBins ); - - set16_fx( hDiracDecBin->ChCrossRe_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossIm_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossReOut_e, 0, nBins ); - set16_fx( hDiracDecBin->ChCrossImOut_e, 0, nBins ); + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - set32_fx( hDiracDecBin->ChEne_fx[ch], 0, nBins ); set32_fx( hDiracDecBin->ChEneOut_fx[ch], 0, nBins ); - - set16_fx( hDiracDecBin->ChEne_e[ch], 0, nBins ); set16_fx( hDiracDecBin->ChEneOut_e[ch], 0, nBins ); } set32_fx( hDiracDecBin->frameMeanDiffuseness_fx, 0, nBins ); set32_fx( frameMeanDiffusenessEneWeight_fx, 0, CLDFB_NO_CHANNELS_MAX ); - set16_fx( subFrameTotalEne_e, 0, CLDFB_NO_CHANNELS_MAX ); - FOR( idx = 0; idx < MAX_GAIN_CACHE_SIZE; idx++ ) { gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ move16(); } - /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ - applyLowBitRateEQ = 0; - move16(); - test(); - test(); - IF( ( EQ_32( ivas_format, MASA_FORMAT ) || EQ_32( ivas_format, MC_FORMAT ) ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) - { - applyLowBitRateEQ = 1; - move16(); - IF( EQ_32( ivas_total_brate, IVAS_16k4 ) ) - { - FOR( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ_fx[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = L_add( L_shr( lowBitRateBinauralEQ_fx[bin], 1 ), ONE_IN_Q30 ); // Q31 - move32(); - } - } - ELSE - { - FOR( bin = 0; bin < LOW_BIT_RATE_BINAURAL_EQ_BINS; bin++ ) - { - lowBitRateEQ_fx[bin + LOW_BIT_RATE_BINAURAL_EQ_OFFSET] = lowBitRateBinauralEQ_fx[bin]; // Q31 - move32(); - } - } - } - - /* Formulate input and target covariance matrices for this subframe */ - set32_fx( subFrameTotalEne_fx, 0, CLDFB_NO_CHANNELS_MAX ); dirac_read_idx = hSpatParamRendCom->render_to_md_map[subframe]; - move16(); - - exp = sub( 63, shl( q, 1 ) ); // exp for the energy (inRe_fx * inRe_fx + inIm_fx * inIm_fx) computed below - - /* Calculate input covariance matrix */ - FOR( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) - { - FOR( bin = 0; bin < nBins; bin++ ) - { - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - Word32 instEne_fx; - temp64 = W_mult0_32_32( inRe_fx[ch][slot][bin], inRe_fx[ch][slot][bin] ); // 2q - temp64 = W_add( temp64, W_mult0_32_32( inIm_fx[ch][slot][bin], inIm_fx[ch][slot][bin] ) ); // 2q - exp1 = W_norm( temp64 ); - instEne_fx = W_extract_h( W_shl( temp64, exp1 ) ); // 2q - 32 + exp1 - /* exp of instEne_fx = 31 - (2q -32 + exp1) = 63 - 2q - exp1 = exp - exp1*/ - - hDiracDecBin->ChEne_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[ch][bin], hDiracDecBin->ChEne_e[ch][bin], instEne_fx, sub( exp, exp1 ), &hDiracDecBin->ChEne_e[ch][bin] ); - subFrameTotalEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameTotalEne_fx[bin], subFrameTotalEne_e[bin], instEne_fx, sub( exp, exp1 ), &subFrameTotalEne_e[bin] ); - move32(); - move32(); - } - temp64 = W_mult0_32_32( inRe_fx[0][slot][bin], inRe_fx[1][slot][bin] ); // 2q - temp64 = W_add( temp64, W_mult0_32_32( inIm_fx[0][slot][bin], inIm_fx[1][slot][bin] ) ); // 2q - exp1 = W_norm( temp64 ); - temp = W_extract_h( W_shl( temp64, exp1 ) ); // // 2q - 32 + exp1 - hDiracDecBin->ChCrossRe_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossRe_fx[bin], hDiracDecBin->ChCrossRe_e[bin], temp, sub( exp, exp1 ), &hDiracDecBin->ChCrossRe_e[bin] ); - move32(); - - temp64 = W_mult0_32_32( inRe_fx[0][slot][bin], inIm_fx[1][slot][bin] ); // 2q - temp64 = W_sub( temp64, W_mult0_32_32( inIm_fx[0][slot][bin], inRe_fx[1][slot][bin] ) ); // 2q - exp1 = W_norm( temp64 ); - temp = W_extract_h( W_shl( temp64, exp1 ) ); // // 2q - 32 + exp1 - hDiracDecBin->ChCrossIm_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossIm_fx[bin], hDiracDecBin->ChCrossIm_e[bin], temp, sub( exp, exp1 ), &hDiracDecBin->ChCrossIm_e[bin] ); - move32(); - } - } - - /* Apply EQ at low bit rates */ - IF( applyLowBitRateEQ != 0 ) - { - Word16 lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; - - FOR( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) - { - subFrameTotalEne_fx[bin] = Mpy_32_32( subFrameTotalEne_fx[bin], lowBitRateEQ_fx[bin] ); // exp = subFrameTotalEne_e[bin] - move32(); - } - FOR( ; bin < nBins; bin++ ) - { - subFrameTotalEne_fx[bin] = Mpy_32_32( subFrameTotalEne_fx[bin], lowBitRateEQ_fx[lastEqBin] ); // exp = subFrameTotalEne_e[bin] - move32(); - } - } - - test(); - test(); - IF( ( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) && EQ_16( nchan_transport, 2 ) ) - { - Word32 tempRe, tempIm; - Word32 subFrameSumEne_fx[CLDFB_NO_CHANNELS_MAX]; - Word16 subFrameSumEne_e[CLDFB_NO_CHANNELS_MAX]; - - set32_fx( subFrameSumEne_fx, 0, CLDFB_NO_CHANNELS_MAX ); - set16_fx( subFrameSumEne_e, 0, CLDFB_NO_CHANNELS_MAX ); - FOR( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) - { - FOR( bin = 0; bin < nBins; bin++ ) - { - tempRe = L_add( inRe_fx[0][slot][bin], inRe_fx[1][slot][bin] ); // q - tempIm = L_add( inIm_fx[0][slot][bin], inIm_fx[1][slot][bin] ); // q - temp64 = W_add( W_mult0_32_32( tempRe, tempRe ), W_mult0_32_32( tempIm, tempIm ) ); // 2q - exp1 = W_norm( temp64 ); - temp64 = W_shl( temp64, exp1 ); // 2q + exp1 - subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameSumEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameSumEne_e[bin] ); - move32(); - } - } - FOR( bin = 0; bin < nBins; bin++ ) - { - subFrameTotalEne_e[bin] = sub( subFrameTotalEne_e[bin], 1 ); - move16(); - temp = L_shl_sat( subFrameTotalEne_fx[bin], sub( subFrameTotalEne_e[bin], subFrameSumEne_e[bin] ) ); // subFrameSumEne_e[bin] - IF( GT_32( subFrameSumEne_fx[bin], temp ) ) - { - subFrameTotalEne_fx[bin] = subFrameSumEne_fx[bin]; - move32(); - subFrameTotalEne_e[bin] = subFrameSumEne_e[bin]; - move16(); - } - } - } /* Determine target covariance matrix containing target binaural properties */ FOR( bin = 0; bin < nBins; bin++ ) @@ -2481,7 +1761,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric spreadCoh_fx = s_max( spreadCoh_fx, altSpreadCoh_fx ); } +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked, *hDiracDecBin->phHrtfParambin ); +#else getDirectPartGains_fx( bin, aziDeg, eleDeg, &lRealp_fx, &lImagp_fx, &rRealp_fx, &rImagp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex], isHeadtracked ); +#endif Word16 q_lr = Q28; move16(); @@ -2532,7 +1816,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric rImagp_fx = Mpy_32_32( rImagp_fx, centerMul_fx ); // Q25 /* Apply the gain for the left source of the three coherent sources */ +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked, *hDiracDecBin->phHrtfParambin ); +#else getDirectPartGains_fx( bin, add( aziDeg, 30 ), eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); +#endif hrtfEneSides_fx = L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 L_add( Mpy_32_32( lImagpTmp_fx, lImagpTmp_fx ), // Q25 @@ -2546,7 +1834,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply the gain for the right source of the three coherent sources. * -30 degrees to 330 wrapping due to internal functions. */ +#ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF + getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked, *hDiracDecBin->phHrtfParambin ); +#else getDirectPartGains_fx( bin, aziDeg + 330, eleDeg, &lRealpTmp_fx, &lImagpTmp_fx, &rRealpTmp_fx, &rImagpTmp_fx, hDiracDecBin->renderStereoOutputInsteadOfBinaural, Rmat_fx, &gainCache[gainCacheBaseIndex + 2], isHeadtracked ); +#endif hrtfEneSides_fx = L_add( hrtfEneSides_fx, L_add( Mpy_32_32( lRealpTmp_fx, lRealpTmp_fx ), // Q25 @@ -2716,97 +2008,38 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric move32(); /* Formulate average diffuseness over frame */ - frameMeanDiffuseness = BASOP_Util_Divide3232_Scale_newton( frameMeanDiffuseness, L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &exp ); // exp = exp + 31 - q_meanEnePerCh - exp1 + frameMeanDiffuseness = BASOP_Util_Divide3232_Scale_cadence( frameMeanDiffuseness, L_max( EPSILLON_FX, frameMeanDiffusenessEneWeight_fx[bin] ), &exp ); // exp = exp + 31 - q_meanEnePerCh - exp1 exp = sub( exp, sub( sub( 31, q_meanEnePerCh ), exp1 ) ); hDiracDecBin->frameMeanDiffuseness_fx[bin] = L_shl( frameMeanDiffuseness, sub( exp, 2 ) ); // Q29 move32(); } - test(); - /* Temporal IIR-type smoothing of covariance matrices. Also apply encoding quality based smoothing factor. */ - IF( EQ_32( ivas_format, MASA_FORMAT ) && LT_32( ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) - { - IIReneLimiterFactor_fx = L_add( L_shl( 16, Q26 ), L_sub( L_shl( 1, Q26 ), L_shr( qualityBasedSmFactor_fx, 5 ) ) ); // Q26 - } - ELSE - { - IIReneLimiterFactor_fx = L_add( L_shl( 8, Q26 ), L_sub( L_shl( 1, Q26 ), L_shr( qualityBasedSmFactor_fx, 5 ) ) ); // Q26 - } - FOR( bin = 0; bin < nBins; bin++ ) { - Word32 IIReneLimiter_fx; - - /* Temporally smooth cov mtx estimates for resulting mixing matrix stability. The design principle is that - * the energy history (IIR) must not be more than double of the current frame energy. This provides more - * robust performance at energy offsets when compared to typical IIR averaging. */ - Word16 num_e, den_e; - Word32 num, den; - num = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[0][bin], hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_fx[1][bin], hDiracDecBin->ChEne_e[1][bin], &num_e ); - num = Mpy_32_32( num, IIReneLimiterFactor_fx ); /*Q = (31 - num_e + 26 - 31) = (26 - num_e)*/ - den_e = 0; - move16(); - den = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEnePrev_fx[0][bin], hDiracDecBin->ChEnePrev_e[0][bin], hDiracDecBin->ChEnePrev_fx[1][bin], hDiracDecBin->ChEnePrev_e[1][bin], &den_e ); - den = L_max( 1, den ); - IIReneLimiter_fx = BASOP_Util_Divide3232_Scale_newton( num, den, &exp ); - exp = add( sub( num_e, den_e ), add( 5, exp ) ); - IF( L_shr_sat( IIReneLimiter_fx, sub( 31, exp ) ) > 0 ) - { - IIReneLimiter_fx = ONE_IN_Q31; /*Q31*/ - move32(); - } - ELSE - { - IIReneLimiter_fx = L_shl( IIReneLimiter_fx, exp ); /*Q31*/ - } - - hDiracDecBin->ChCrossRe_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossRe_fx[bin], qualityBasedSmFactor_fx ); - hDiracDecBin->ChCrossIm_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossIm_fx[bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChCrossReOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossReOut_fx[bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChCrossImOut_fx[bin] = Mpy_32_32( hDiracDecBin->ChCrossImOut_fx[bin], qualityBasedSmFactor_fx ); - move32(); - move32(); - move32(); - move32(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - hDiracDecBin->ChEne_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEne_fx[ch][bin], qualityBasedSmFactor_fx ); hDiracDecBin->ChEneOut_fx[ch][bin] = Mpy_32_32( hDiracDecBin->ChEneOut_fx[ch][bin], qualityBasedSmFactor_fx ); move32(); - move32(); } - - hDiracDecBin->ChCrossRe_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossRe_fx[bin], hDiracDecBin->ChCrossRe_e[bin], Mpy_32_32( hDiracDecBin->ChCrossRePrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossRePrev_e[bin], &hDiracDecBin->ChCrossRe_e[bin] ); - hDiracDecBin->ChCrossIm_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossIm_fx[bin], hDiracDecBin->ChCrossIm_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossImPrev_e[bin], &hDiracDecBin->ChCrossIm_e[bin] ); - hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossReOutPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossReOutPrev_e[bin], &hDiracDecBin->ChCrossReOut_e[bin] ); - hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImOutPrev_fx[bin], IIReneLimiter_fx ), hDiracDecBin->ChCrossImOutPrev_e[bin], &hDiracDecBin->ChCrossImOut_e[bin] ); - move32(); - move32(); + hDiracDecBin->ChCrossReOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossReOut_fx[bin], hDiracDecBin->ChCrossReOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossReOutPrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossReOutPrev_e[bin], &hDiracDecBin->ChCrossReOut_e[bin] ); + hDiracDecBin->ChCrossImOut_fx[bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChCrossImOut_fx[bin], hDiracDecBin->ChCrossImOut_e[bin], Mpy_32_32( hDiracDecBin->ChCrossImOutPrev_fx[bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChCrossImOutPrev_e[bin], &hDiracDecBin->ChCrossImOut_e[bin] ); move32(); move32(); FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - hDiracDecBin->ChEne_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEne_fx[ch][bin], hDiracDecBin->ChEne_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEnePrev_fx[ch][bin], IIReneLimiter_fx ), hDiracDecBin->ChEnePrev_e[ch][bin], &hDiracDecBin->ChEne_e[ch][bin] ); - hDiracDecBin->ChEneOut_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[ch][bin], hDiracDecBin->ChEneOut_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEneOutPrev_fx[ch][bin], IIReneLimiter_fx ), hDiracDecBin->ChEneOutPrev_e[ch][bin], &hDiracDecBin->ChEneOut_e[ch][bin] ); - move32(); + hDiracDecBin->ChEneOut_fx[ch][bin] = BASOP_Util_Add_Mant32Exp( hDiracDecBin->ChEneOut_fx[ch][bin], hDiracDecBin->ChEneOut_e[ch][bin], Mpy_32_32( hDiracDecBin->ChEneOutPrev_fx[ch][bin], IIReneLimiter_fx[bin] ), hDiracDecBin->ChEneOutPrev_e[ch][bin], &hDiracDecBin->ChEneOut_e[ch][bin] ); move32(); } - /* Store energy values and coefficients for next round */ - hDiracDecBin->ChCrossRePrev_fx[bin] = hDiracDecBin->ChCrossRe_fx[bin]; - move32(); - hDiracDecBin->ChCrossImPrev_fx[bin] = hDiracDecBin->ChCrossIm_fx[bin]; - move32(); + hDiracDecBin->ChCrossReOutPrev_fx[bin] = hDiracDecBin->ChCrossReOut_fx[bin]; move32(); hDiracDecBin->ChCrossImOutPrev_fx[bin] = hDiracDecBin->ChCrossImOut_fx[bin]; move32(); - hDiracDecBin->ChCrossRePrev_e[bin] = hDiracDecBin->ChCrossRe_e[bin]; - move16(); - hDiracDecBin->ChCrossImPrev_e[bin] = hDiracDecBin->ChCrossIm_e[bin]; - move16(); hDiracDecBin->ChCrossReOutPrev_e[bin] = hDiracDecBin->ChCrossReOut_e[bin]; move16(); hDiracDecBin->ChCrossImOutPrev_e[bin] = hDiracDecBin->ChCrossImOut_e[bin]; @@ -2816,10 +2049,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric { hDiracDecBin->ChEnePrev_fx[ch][bin] = hDiracDecBin->ChEne_fx[ch][bin]; move32(); - hDiracDecBin->ChEneOutPrev_fx[ch][bin] = hDiracDecBin->ChEneOut_fx[ch][bin]; - move32(); hDiracDecBin->ChEnePrev_e[ch][bin] = hDiracDecBin->ChEne_e[ch][bin]; move16(); + hDiracDecBin->ChEneOutPrev_fx[ch][bin] = hDiracDecBin->ChEneOut_fx[ch][bin]; + move32(); hDiracDecBin->ChEneOutPrev_e[ch][bin] = hDiracDecBin->ChEneOut_e[ch][bin]; move16(); } @@ -2827,7 +2060,8 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric return; } -#endif + + static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, @@ -3460,7 +2694,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( const Word16 processReverb, const Word16 subframe, const Word16 q_mat -#ifdef SPLIT_REND_WITH_HEAD_ROT , Word32 outRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 outIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], @@ -3470,7 +2703,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word32 decorrIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word16 *Q_inp_mix, const Word8 recompute -#endif ) { Word16 slot, bin, chA, chB; @@ -3487,10 +2719,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word32 decSlotRe_fx[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm_fx[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 outSlotRe_fx[CLDFB_NO_CHANNELS_MAX], outSlotIm_fx[CLDFB_NO_CHANNELS_MAX]; -#ifndef SPLIT_REND_WITH_HEAD_ROT - Word32 reverbRe_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - Word32 reverbIm_fx[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#endif Word16 q_inp[6][CLDFB_SLOTS_PER_SUBFRAME]; Word16 interpVal_fx; Word32 *decSlotRePointer_fx; @@ -3501,21 +2729,15 @@ static void ivas_dirac_dec_binaural_process_output_fx( IF( processReverb ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( recompute == 1 ) { -#endif /* Process second / room effect part of binaural output when needed */ ivas_binaural_reverb_processSubframe_fx( hDiracDecBin->hReverb, numInChannels, nSlots, inRe_fx, inIm_fx, reverbRe_fx, reverbIm_fx ); -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( recompute, 1 ) ) { -#endif // scaling input and reverb to same q// // input scaling is to maintain precision in ivas_dirac_dec_decorrelate_slot fn// Word16 shift = s_min( L_norm_arr( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length ), L_norm_arr( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length ) ); @@ -3528,11 +2750,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], nBins ), L_norm_arr( inIm_fx[i][j], nBins ) ); move16(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( processReverb && EQ_16( recompute, 1 ) ) && LT_16( i, 2 ) ) -#else - IF( ( processReverb ) && LT_16( i, 2 ) ) -#endif { q_reverb = s_min( L_norm_arr( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX ), L_norm_arr( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ); q_inp[i][j] = s_min( q_reverb, q_inp[i][j] ); @@ -3560,11 +2778,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( scale_sig32( inRe_fx[i][j], nBins, q_inp_mix ); /*q_input + q_inp_mix*/ scale_sig32( inIm_fx[i][j], nBins, q_inp_mix ); /*q_input + q_inp_mix*/ test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( processReverb && EQ_16( recompute, 1 ) ) && LT_16( i, 2 ) ) -#else - IF( ( processReverb ) && LT_16( i, 2 ) ) -#endif { scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ @@ -3579,7 +2793,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( cldfbSynDec[1]->Q_cldfb_state = add( cldfbSynDec[1]->Q_cldfb_state, cldfb_state_shift ); move16(); move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT *Q_inp_mix = q_inp_mix; move16(); } @@ -3587,7 +2800,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( { q_inp_mix = *Q_inp_mix; } -#endif q_inp_mix = add( q_inp_mix, q_input ); @@ -3613,12 +2825,9 @@ static void ivas_dirac_dec_binaural_process_output_fx( test(); IF( !hDiracDecBin->useTdDecorr && ( max_band_decorr > 0 ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( recompute == 1 ) { -#endif ivas_dirac_dec_decorrelate_slot_fx( hDiracDecBin, nBins, slot, inRe_fx, inIm_fx, q_inp_mix, decSlotRe_fx, decSlotIm_fx ); -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { Copy32( decSlotRe_fx[chA], decorrRe_fx[chA][slot], CLDFB_NO_CHANNELS_MAX ); @@ -3633,7 +2842,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( Copy32( decorrIm_fx[chA][slot], decSlotIm_fx[chA], CLDFB_NO_CHANNELS_MAX ); } } -#endif } FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -3723,7 +2931,6 @@ static void ivas_dirac_dec_binaural_process_output_fx( outSlotRePr_fx = &( outSlotRe_fx[0] ); outSlotImPr_fx = &( outSlotIm_fx[0] ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( outRe_fx != NULL && outIm_fx != NULL ) { /* provide the data outside in CLDFB domain => mainly for split rendering */ @@ -3743,27 +2950,13 @@ static void ivas_dirac_dec_binaural_process_output_fx( cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 ); move16(); } -#else -#ifdef OPT_AVOID_STATE_BUF_RESCALE - cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, 0, cldfbSynDec[chA] ); -#else - cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, cldfbSynDec[chA] ); -#endif - cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 ); - move16(); -#endif /* SPLIT_REND_WITH_HEAD_ROT */ } } -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( recompute == 1 ) { *q_out = sub( q_result, 1 ); move16(); } -#else - *q_out = sub( q_result, 1 ); - move16(); -#endif return; } @@ -6330,14 +5523,10 @@ static void ivas_masa_ext_rend_parambin_internal_fx( MASA_EXT_REND_HANDLE hMasaExtRend, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, Word32 *output_fx[], /* Q11*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word16 subframe, const SPLIT_REND_WRAPPER *hSplitRendWrapper, Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] -#else - const Word16 subframe -#endif ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; @@ -6349,7 +5538,6 @@ static void ivas_masa_ext_rend_parambin_internal_fx( Word16 i, j; Word16 nchan_transport; Word16 q_mat; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData; Word32 tmp_Cldfb_out_re[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; @@ -6366,9 +5554,6 @@ static void ivas_masa_ext_rend_parambin_internal_fx( Word16 Q_inp_mix; hDiracDecBin = hMasaExtRend->hDiracDecBin[0]; -#else - hDiracDecBin = hMasaExtRend->hDiracDecBin; -#endif hSpatParamRendCom = hMasaExtRend->hSpatParamRendCom; Word32 Cldfb_RealBuffer_in_fx[6][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; @@ -6383,11 +5568,7 @@ static void ivas_masa_ext_rend_parambin_internal_fx( } } Word32 Rmat_fx[3][3]; -#ifdef SPLIT_REND_WITH_HEAD_ROT hDiracDecBin = hMasaExtRend->hDiracDecBin[0]; -#else - hDiracDecBin = hMasaExtRend->hDiracDecBin; -#endif assert( hDiracDecBin ); hSpatParamRendCom = hMasaExtRend->hSpatParamRendCom; nBins = hSpatParamRendCom->num_freq_bands; @@ -6491,29 +5672,21 @@ static void ivas_masa_ext_rend_parambin_internal_fx( IF( EQ_16( nchan_transport, 2 ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT /* in case of split rendering, determine the prototype rotation based on the main direction and use the same prototypes for the offset directions */ -#endif adaptTransportSignalsHeadtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); ivas_dirac_dec_binaural_check_and_switch_transports_headtracked_fx( hCombinedOrientationData, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, nBins, hSpatParamRendCom->subframe_nbslots[subframe], Rmat_fx ); } } test(); -#ifndef SPLIT_REND_WITH_HEAD_ROT - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, Rmat_fx, subframe, - hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, NULL, q_inp ); -#endif /* Always using CLDFB decorrelation in MASA EXT renderer */ max_band_decorr = hDiracDecBin->h_freq_domain_decorr_ap_params->max_band_decorr; -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, subframe, subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, q_inp ); ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, Rmat_fx, subframe, hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, subFrameTotalEne_fx, subFrameTotalEne_e, IIReneLimiter_fx, NULL ); -#endif ivas_dirac_dec_binaural_determine_processing_matrices_fx( hDiracDecBin, hSpatParamRendCom, &config_data, max_band_decorr, Rmat_fx, subframe, hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[hCombinedOrientationData->subframe_idx] > 0, @@ -6564,7 +5737,6 @@ static void ivas_masa_ext_rend_parambin_internal_fx( move16(); move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT pMultiBinPoseData = NULL; if ( hSplitRendWrapper != NULL ) { @@ -6587,13 +5759,9 @@ static void ivas_masa_ext_rend_parambin_internal_fx( ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat, NULL, NULL, reverbRe_fx, reverbIm_fx, decorrRe_fx, decorrIm_fx, &Q_inp_mix, 1 ); } -#else - ivas_dirac_dec_binaural_process_output_fx( hDiracDecBin, hSpatParamRendCom, hMasaExtRend->cldfbSynRend, output_fx, &q_out, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_inp, max_band_decorr, numInChannels, config_data.processReverb, subframe, q_mat ); -#endif hDiracDecBin->hDiffuseDist = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( pMultiBinPoseData != NULL && pMultiBinPoseData->num_poses > 1 ) { /* quaternion-based rotation from ivas_binRenderer_internal.c:ivas_binRenderer(), but using absolute rotation instead of delta rotations */ @@ -6700,7 +5868,6 @@ static void ivas_masa_ext_rend_parambin_internal_fx( } /* update this counter only after the last rendering of split directions */ -#endif hSpatParamRendCom->slots_rendered = add( hSpatParamRendCom->slots_rendered, hSpatParamRendCom->subframe_nbslots[subframe] ); hSpatParamRendCom->subframes_rendered = add( hSpatParamRendCom->subframes_rendered, 1 ); @@ -6721,14 +5888,10 @@ void ivas_masa_ext_rend_parambin_render_fx( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word16 num_subframes, /* i : number of subframes to render */ const SPLIT_REND_WRAPPER *hSplitRendWrapper, /* i : split rendering orientation data */ Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : rendered orientations for split rend. real part of cldfb */ Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* o : rendered orientations for split rend. imag part of cldfb */ -#else - const Word16 num_subframes /* i : number of subframes to render */ -#endif ) { Word16 subframe; @@ -6751,11 +5914,7 @@ void ivas_masa_ext_rend_parambin_render_fx( hSpatParamRendCom->slots_rendered = 0; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_masa_ext_rend_parambin_internal_fx( hMasaExtRend, hCombinedOrientationData, p_output, hSpatParamRendCom->dirac_read_idx, hSplitRendWrapper, Cldfb_Out_Real, Cldfb_Out_Imag ); -#else - ivas_masa_ext_rend_parambin_internal_fx( hMasaExtRend, hCombinedOrientationData, p_output, hSpatParamRendCom->dirac_read_idx ); -#endif FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { p_output[ch] += n_samples_sf; diff --git a/lib_rend/ivas_orient_trk_fx.c b/lib_rend/ivas_orient_trk_fx.c index 5ea170a78..ee91e7060 100644 --- a/lib_rend/ivas_orient_trk_fx.c +++ b/lib_rend/ivas_orient_trk_fx.c @@ -696,20 +696,12 @@ ivas_error ivas_orient_trk_SetReferenceRotation_fx( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* check for Euler angle signaling */ IF( EQ_32( refRot.w_fx, L_negate( 12582912 ) ) && EQ_16( refRot.q_fact, Q22 ) ) { Euler2Quat_fx( deg2rad_fx( refRot.x_fx ), deg2rad_fx( refRot.y_fx ), deg2rad_fx( refRot.z_fx ), &pOTR->refRot ); modify_Quat_q_fx( &pOTR->refRot, &pOTR->refRot, Q29 ); } -#else - /* check for Euler angle signaling */ - IF( EQ_32( refRot.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) - { - Euler2Quat_fx( deg2rad_fx( refRot.x_fx ), deg2rad_fx( refRot.y_fx ), deg2rad_fx( refRot.z_fx ), &pOTR->refRot ); - } -#endif pOTR->refRot = refRot; return IVAS_ERR_OK; diff --git a/lib_rend/ivas_output_init_fx.c b/lib_rend/ivas_output_init_fx.c index 7bcf6e37d..f33ace930 100644 --- a/lib_rend/ivas_output_init_fx.c +++ b/lib_rend/ivas_output_init_fx.c @@ -100,10 +100,8 @@ Word16 audioCfg2channels( move16(); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: -#endif case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: nchan_out = 2; @@ -270,10 +268,8 @@ void ivas_output_init( move16(); BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: -#endif case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: case IVAS_AUDIO_CONFIG_ISM1: @@ -379,10 +375,8 @@ Word16 ivas_get_nchan_buffers_dec( nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); } ELSE if ( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#ifdef SPLIT_REND_WITH_HEAD_ROT || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) -#endif ) { nchan_out_buff = shl( CPE_CHANNELS, 1 ); @@ -464,12 +458,10 @@ Word16 ivas_get_nchan_buffers_dec( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { nchan_out_buff = max( nchan_out_buff, st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses * BINAURAL_CHANNELS ); } -#endif return nchan_out_buff; } diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 90771862e..fec808243 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -220,14 +220,10 @@ void ivas_masa_ext_rend_parambin_render_fx( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word16 num_subframes, /* i : number of subframes to render */ const SPLIT_REND_WRAPPER *hSplitRendWrapper, /* i : split rendering orientation data */ Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : rendered orientations for split rend. real part of cldfb */ Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] /* o : rendered orientations for split rend. imag part of cldfb */ -#else - const Word16 num_subframes /* i : number of subframes to render */ -#endif ); ivas_error ivas_dirac_dec_init_binaural_data_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -887,21 +883,13 @@ ivas_error ivas_rend_openCrend( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES HRTFS_STATISTICS_HANDLE hHrtfStatistics, #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT const Word32 output_Fs, const Word16 num_poses -#else - const Word32 output_Fs -#endif ); void ivas_rend_closeCrend( -#ifdef SPLIT_REND_WITH_HEAD_ROT CREND_WRAPPER_HANDLE *pCrend , const Word16 num_poses -#else - CREND_WRAPPER_HANDLE *pCrend -#endif ); ivas_error ivas_hrtf_init( @@ -909,12 +897,8 @@ ivas_error ivas_hrtf_init( ); ivas_error ivas_rend_initCrendWrapper( -#ifdef SPLIT_REND_WITH_HEAD_ROT CREND_WRAPPER_HANDLE *pCrend, const Word16 num_poses -#else - CREND_WRAPPER_HANDLE *pCrend -#endif ); ivas_error ivas_rend_crendProcessSubframe( @@ -930,10 +914,8 @@ ivas_error ivas_rend_crendProcessSubframe( Word32 *output[], /* i/o: input/output audio channels */ const Word16 n_samples_to_render, /* i : output frame length per channel */ const Word32 output_Fs /* i : output sampling rate */ -#ifdef SPLIT_REND_WITH_HEAD_ROT , const Word16 pos_idx -#endif ); @@ -1569,7 +1551,6 @@ void masaPrerendClose_fx( MASA_PREREND_HANDLE *hMasaPrerendPtr /* i/o: prerenderer handle to be closed */ ); -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------------------* * Split rendering *----------------------------------------------------------------------------------*/ @@ -1648,7 +1629,6 @@ void ivas_rend_closeCldfbRend( CLDFB_REND_WRAPPER *pCldfbRend ); -#endif /* clang-format on */ diff --git a/lib_rend/ivas_reflections_fx.c b/lib_rend/ivas_reflections_fx.c index fb3e86585..44eff1329 100644 --- a/lib_rend/ivas_reflections_fx.c +++ b/lib_rend/ivas_reflections_fx.c @@ -338,17 +338,13 @@ ivas_error ivas_er_encoder_init( p_y_fx = reflections->shoebox_data.az_angle.data_fx[i]; // Q23 move32(); move32(); -#ifdef SPLIT_REND_WITH_HEAD_ROT p_x_fx = L_shr( p_x_fx, 1 ); // Q22 p_y_fx = L_shr( p_y_fx, 1 ); // Q22 -#endif rad_el_angle = deg2rad_fx( p_x_fx ); // Q22 rad_az_angle = deg2rad_fx( p_y_fx ); // Q22 -#ifdef SPLIT_REND_WITH_HEAD_ROT rad_el_angle = L_shl( rad_el_angle, 1 ); // Q23 rad_az_angle = L_shl( rad_az_angle, 1 ); // Q23 -#endif rad_el_angle = L_shr( rad_el_angle, 10 ); // Q13 rad_az_angle = L_shr( rad_az_angle, 10 ); // Q13 diff --git a/lib_rend/ivas_render_config_fx.c b/lib_rend/ivas_render_config_fx.c index 7f8e96d5c..fc5c26351 100644 --- a/lib_rend/ivas_render_config_fx.c +++ b/lib_rend/ivas_render_config_fx.c @@ -137,7 +137,6 @@ ivas_error ivas_render_config_init_from_rom_fx( move16(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ( *hRenderConfig )->split_rend_config.splitRendBitRate = SPLIT_REND_768k; move32(); ( *hRenderConfig )->split_rend_config.dof = 3; @@ -158,7 +157,6 @@ ivas_error ivas_render_config_init_from_rom_fx( move32(); ( *hRenderConfig )->split_rend_config.lc3plus_highres = 0; move16(); -#endif return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index 36f363f83..dc73967cc 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -87,9 +87,7 @@ Word16 square_root30_q12[31] = { static ivas_error combine_external_and_head_orientations( IVAS_QUATERNION *headRotQuaternions, IVAS_VECTOR3 *listenerPos, -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis, /* i : split rend pose prediction axis*/ -#endif EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, COMBINED_ORIENTATION_HANDLE hCombinedOrientationData ); static void external_target_interpolation_fx( @@ -143,10 +141,8 @@ ivas_error ivas_headTrack_open_fx( move32(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ( *hHeadTrackData )->sr_pose_pred_axis = DEFAULT_AXIS; move32(); -#endif set32_fx( ( *hHeadTrackData )->chEneIIR_fx[0], 0, MASA_FREQUENCY_BANDS ); set32_fx( ( *hHeadTrackData )->chEneIIR_fx[1], 0, MASA_FREQUENCY_BANDS ); @@ -196,7 +192,6 @@ void QuatToRotMat_fx( ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( quat.w_fx, L_negate( 12582912 ) ) ) { assert( 0 ); @@ -206,7 +201,6 @@ void QuatToRotMat_fx( } else { -#endif Word32 w = quat.w_fx; // Qx move32(); Word32 x = quat.x_fx; @@ -252,9 +246,7 @@ void QuatToRotMat_fx( move32(); Rmat[2][2] = L_add( L_sub( L_sub( ww, xx ), yy ), zz ); move32(); -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif return; } @@ -731,11 +723,7 @@ void rotateFrame_shd( } /* calculate ambisonics rotation matrices for the previous and current frames */ -#ifdef SPLIT_REND_WITH_HEAD_ROT SHrotmatgen_fx( SHrotmat_prev, hCombinedOrientationData->Rmat_prev_fx[0], shd_rot_max_order ); -#else - SHrotmatgen_fx( SHrotmat_prev, hCombinedOrientationData->Rmat_prev_fx, shd_rot_max_order ); -#endif SHrotmatgen_fx( SHrotmat /*Q14*/, hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx], shd_rot_max_order ); FOR( i = 0; i < subframe_len; i++ ) @@ -796,11 +784,7 @@ void rotateFrame_shd( { Copy32( hCombinedOrientationData->Rmat_fx[subframe_idx][i], -#ifdef SPLIT_REND_WITH_HEAD_ROT hCombinedOrientationData->Rmat_prev_fx[0][i], -#else - hCombinedOrientationData->Rmat_prev_fx[i], -#endif 3 ); // Q14 } @@ -899,11 +883,7 @@ void rotateFrame_sd( } /* gains for previous subframe rotation */ -#ifdef SPLIT_REND_WITH_HEAD_ROT rotateAziEle_fx( extract_l( L_shr( hTransSetup.ls_azimuth_fx[ch_in_woLFE], Q22 ) ), extract_l( L_shr( hTransSetup.ls_elevation_fx[ch_in_woLFE], Q22 ) ), &azimuth, &elevation, hCombinedOrientationData->Rmat_prev_fx[0], hTransSetup.is_planar_setup ); -#else - rotateAziEle_fx( extract_l( L_shr( hTransSetup.ls_azimuth_fx[ch_in_woLFE], Q22 ) ), extract_l( L_shr( hTransSetup.ls_elevation_fx[ch_in_woLFE], Q22 ) ), &azimuth, &elevation, hCombinedOrientationData->Rmat_prev_fx, hTransSetup.is_planar_setup ); -#endif test(); test(); IF( hEFAPdata != NULL && ( NE_16( extract_l( L_shr( hTransSetup.ls_azimuth_fx[ch_in_woLFE], Q22 ) ), azimuth ) || NE_16( extract_l( L_shr( hTransSetup.ls_elevation_fx[ch_in_woLFE], Q22 ) ), elevation ) ) ) @@ -997,11 +977,7 @@ void rotateFrame_sd( { Copy32( hCombinedOrientationData->Rmat_fx[hCombinedOrientationData->subframe_idx][i], // Q30 -#ifdef SPLIT_REND_WITH_HEAD_ROT hCombinedOrientationData->Rmat_prev_fx[0][i], -#else - hCombinedOrientationData->Rmat_prev_fx[i], -#endif 3 ); } /* copy to output */ @@ -1345,9 +1321,7 @@ ivas_error ivas_combined_orientation_open( Word16 j; IVAS_QUATERNION identity; IVAS_VECTOR3 origo; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; -#endif identity.w_fx = ONE_IN_Q31; move32(); identity.x_fx = 0; @@ -1409,7 +1383,6 @@ ivas_error ivas_combined_orientation_open( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { FOR( j = 0; j < 3; j++ ) @@ -1423,14 +1396,6 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->sr_low_res_flag = 0; move32(); move16(); -#else - FOR( j = 0; j < 3; j++ ) - { - set32_fx( ( *hCombinedOrientationData )->Rmat_prev_fx[j], 0, 3 ); - ( *hCombinedOrientationData )->Rmat_prev_fx[j][j] = ONE_IN_Q30; - move32(); - } -#endif ( *hCombinedOrientationData ) ->Quaternion_prev_extOrientation = identity; @@ -1494,9 +1459,7 @@ ivas_error combine_external_and_head_orientations_dec( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; -#endif IVAS_QUATERNION *pHeadRotQuaternion = NULL; IVAS_VECTOR3 *listenerPos = NULL; @@ -1504,20 +1467,14 @@ ivas_error combine_external_and_head_orientations_dec( { pHeadRotQuaternion = hHeadTrackData->Quaternions; listenerPos = hHeadTrackData->Pos; -#ifdef SPLIT_REND_WITH_HEAD_ROT sr_pose_pred_axis = hHeadTrackData->sr_pose_pred_axis; -#endif } -#ifdef SPLIT_REND_WITH_HEAD_ROT ELSE { sr_pose_pred_axis = DEFAULT_AXIS; } -#endif return combine_external_and_head_orientations( pHeadRotQuaternion, listenerPos, -#ifdef SPLIT_REND_WITH_HEAD_ROT sr_pose_pred_axis, -#endif hExtOrientationData, hCombinedOrientationData ); } @@ -1534,16 +1491,12 @@ ivas_error combine_external_and_head_orientations_rend( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; -#endif IVAS_QUATERNION *headRotQuaternions = NULL; IVAS_VECTOR3 *listenerPos = NULL; Word16 i; -#ifdef SPLIT_REND_WITH_HEAD_ROT sr_pose_pred_axis = DEFAULT_AXIS; -#endif IF( hHeadTrackData != NULL ) { @@ -1552,9 +1505,7 @@ ivas_error combine_external_and_head_orientations_rend( headRotQuaternions = hHeadTrackData->headPositions; listenerPos = hHeadTrackData->Pos; } -#ifdef SPLIT_REND_WITH_HEAD_ROT sr_pose_pred_axis = hHeadTrackData->sr_pose_pred_axis; -#endif } ELSE IF( hExtOrientationData != NULL ) { @@ -1570,9 +1521,7 @@ ivas_error combine_external_and_head_orientations_rend( } return combine_external_and_head_orientations( headRotQuaternions, listenerPos, -#ifdef SPLIT_REND_WITH_HEAD_ROT sr_pose_pred_axis, -#endif hExtOrientationData, hCombinedOrientationData ); } @@ -1586,9 +1535,7 @@ ivas_error combine_external_and_head_orientations_rend( ivas_error combine_external_and_head_orientations( IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ IVAS_VECTOR3 *listenerPos, /* i : listener position */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis, /* i : split rend pose prediction axis */ -#endif EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) @@ -1937,9 +1884,7 @@ ivas_error combine_external_and_head_orientations( move16(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT hCombinedOrientationData->sr_pose_pred_axis = sr_pose_pred_axis; -#endif return IVAS_ERR_OK; } @@ -2248,11 +2193,7 @@ static Word32 SHrot_w_fx( IF( m == 0 ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT assert( 0 && "ERROR should not be called\n" ); -#else - printf( "ERROR should not be called\n" ); -#endif return 0; } ELSE @@ -2450,11 +2391,7 @@ void ivas_combined_orientation_update_index( Word16 exp, div_result; IF( hCombinedOrientationData != NULL ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) || hCombinedOrientationData->sr_low_res_flag ) -#else - IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) ) -#endif { /* only one orientation available anyway or split rendering with low resolution*/ hCombinedOrientationData->subframe_idx = 0; @@ -2511,11 +2448,7 @@ void ivas_combined_orientation_update_start_index( { IF( hCombinedOrientationData != NULL ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) || hCombinedOrientationData->sr_low_res_flag ) -#else - IF( EQ_16( hCombinedOrientationData->num_subframes, 1 ) ) -#endif { /* only one orientation available anyway or split rendering with low resolution*/ hCombinedOrientationData->subframe_idx = 0; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index c93f62396..fd1945a3f 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -699,15 +699,9 @@ typedef struct ivas_binaural_rendering_conv_module_struct_fx Word32 ***filterTapsRightReal_fx; Word32 ***filterTapsRightImag_fx; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 ****filterStatesLeftReal_fx; Word32 ****filterStatesLeftImag_fx; Word16 *Q_filterStates; -#else - Word32 ***filterStatesLeftReal_fx; - Word32 ***filterStatesLeftImag_fx; - Word16 Q_filterStatesLeft; -#endif Word16 numTapsArray[BINAURAL_CONVBANDS]; Word16 numTaps; @@ -802,9 +796,7 @@ typedef struct IVAS_QUATERNION headPositions[MAX_PARAM_SPATIAL_SUBFRAMES]; IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; Word32 crossfade_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q31 */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; -#endif ivas_orient_trk_state_t *hOrientationTracker; } IVAS_REND_HeadRotData; @@ -826,9 +818,7 @@ typedef struct ivas_binaural_head_track_struct Word16 shd_rot_max_order; ivas_orient_trk_state_t *OrientationTracker; -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; -#endif } HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; /*----------------------------------------------------------------------------------* @@ -862,21 +852,15 @@ typedef struct ivas_combined_orientation_struct IVAS_QUATERNION Quaternions_ext_interpolation_start; IVAS_QUATERNION Quaternions_ext_interpolation_target; Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; /* Q30 */ -#ifdef SPLIT_REND_WITH_HEAD_ROT Word32 Rmat_prev_fx[MAX_HEAD_ROT_POSES][3][3]; -#else - Word32 Rmat_prev_fx[3][3]; /* Q30 */ -#endif Word32 chEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ /* Q(q_chEneIIR) */ Word16 q_chEneIIR; Word32 procChEneIIR_fx[2][MASA_FREQUENCY_BANDS]; /* Q(q_procChEneIIR) */ Word16 q_procChEneIIR; Word16 shd_rot_max_order; IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef SPLIT_REND_WITH_HEAD_ROT ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis; Word16 sr_low_res_flag; -#endif IVAS_QUATERNION Quaternion_frozen_ext; IVAS_QUATERNION Quaternion_frozen_head; Word8 isExtOrientationFrozen; @@ -1387,18 +1371,13 @@ typedef struct ivas_crend_state_t typedef struct ivas_binaural_crend_wrapper_struct { Word32 binaural_latency_ns; -#ifdef SPLIT_REND_WITH_HEAD_ROT CREND_HANDLE hCrend[MAX_HEAD_ROT_POSES]; -#else - CREND_HANDLE hCrend; -#endif HRTFS_HANDLE hHrtfCrend; Word16 *p_io_qfactor; Word16 io_qfactor; } CREND_WRAPPER, *CREND_WRAPPER_HANDLE; -#ifdef SPLIT_REND_WITH_HEAD_ROT /* Fastconv binaural data structure */ typedef struct ivas_binaural_rendering_struct { @@ -1424,7 +1403,6 @@ typedef struct ivas_binaural_rendering_struct Word16 numPoses; } BINAURAL_RENDERER, *BINAURAL_RENDERER_HANDLE; -#endif /*------------------------------------------------------------------------------------------* * HRTF structures - hrtfs from binary files @@ -1510,7 +1488,6 @@ typedef struct ivas_hrtfs_statistics_struct } HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT /*----------------------------------------------------------------------------------* * CLDFB renderer wrapper @@ -1524,7 +1501,6 @@ typedef struct } CLDFB_REND_WRAPPER; -#endif /*----------------------------------------------------------------------------------* * Limiter structure @@ -1622,11 +1598,7 @@ typedef struct ivas_masa_external_rendering_struct RENDERER_TYPE renderer_type; DIRAC_REND_HANDLE hDirACRend; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; -#ifdef SPLIT_REND_WITH_HEAD_ROT DIRAC_DEC_BIN_HANDLE hDiracDecBin[MAX_HEAD_ROT_POSES]; -#else - DIRAC_DEC_BIN_HANDLE hDiracDecBin; -#endif REVERB_STRUCT_HANDLE hReverb; HRTFS_PARAMBIN_HANDLE *hHrtfParambin; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index b27c59852..1300d6340 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -56,7 +56,6 @@ typedef float IVAS_REND_LfePanMtx[RENDERER_MAX_INPUT_LFE_CHANNELS][IVAS_MAX_OUTPUT_CHANNELS]; typedef Word32 IVAS_REND_LfePanMtx_fx[RENDERER_MAX_INPUT_LFE_CHANNELS][IVAS_MAX_OUTPUT_CHANNELS]; -#ifdef SPLIT_REND_WITH_HEAD_ROT typedef struct { Word32 bufLenInBytes; @@ -73,7 +72,6 @@ typedef struct IVAS_REND_BitstreamBufferConfig config; UWord8 *bits; } IVAS_REND_BitstreamBuffer; -#endif typedef struct { @@ -266,7 +264,6 @@ Word16 IVAS_REND_FeedRenderConfig( const IVAS_RENDER_CONFIG_DATA renderConfig /* i : Render configuration struct */ ); -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_error IVAS_REND_FeedSplitBinauralBitstream( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -293,15 +290,12 @@ ivas_error IVAS_REND_GetSplitRendBitstreamHeader( , Word16 *pIsar_frame_size_ms /* o: pointer to isar frame size setting */ ); -#endif ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ -#ifdef SPLIT_REND_WITH_HEAD_ROT const ISAR_SPLIT_REND_ROT_AXIS rot_axis, /* i : external control for rotation axis for split rendering*/ -#endif const Word16 sf_idx /* i : subframe index */ ); @@ -336,11 +330,9 @@ ivas_error IVAS_REND_SetReferenceVector( const IVAS_VECTOR3 refPos /* i : Reference position */ ); -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_error IVAS_REND_SetSplitRendBFI( IVAS_REND_HANDLE hIvasRend, const Word16 bfi); -#endif ivas_error IVAS_REND_SetExternalOrientation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ @@ -400,7 +392,6 @@ void IVAS_REND_Close( IVAS_REND_HANDLE* phIvasRend /* i/o: Pointer to renderer handle */ ); -#ifdef SPLIT_REND_WITH_HEAD_ROT /* Split binaural rendering functions */ ivas_error IVAS_REND_openCldfb( @@ -433,7 +424,6 @@ void IVAS_REND_cldfbSynthesis_wrapper( IVAS_CLDFB_FILTER_BANK_HANDLE h_cldfb, /* i : filter bank state */ Word16 Q_cldfb, Word16 *Q_out ); -#endif /* Disclaimer and info printing */ diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index eb155a89f..1d019b675 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -95,11 +95,9 @@ typedef struct const LSSETUP_CUSTOM_STRUCT *pCustomLsOut; const EFAP_WRAPPER *pEfapOutWrapper; IVAS_REND_HeadRotData *pHeadRotData; // for now removing the const qualifier TODO: will modify later -#ifdef SPLIT_REND_WITH_HEAD_ROT const RENDER_CONFIG_HANDLE *hhRendererConfig; const Word16 *pSplitRendBFI; const SPLIT_REND_WRAPPER *pSplitRendWrapper; -#endif const COMBINED_ORIENTATION_HANDLE *pCombinedOrientationData; } rendering_context; /* Common base for input structs */ @@ -125,9 +123,7 @@ typedef struct rotation_matrix_fx rot_mat_prev_fx; pan_vector prev_pan_gains; Word8 firstFrameRendered; -#ifdef SPLIT_REND_WITH_HEAD_ROT TDREND_WRAPPER splitTdRendWrappers[MAX_HEAD_ROT_POSES - 1]; /* Additional TD Rend instances used for split rendering */ -#endif Word32 *bufferData_fx; Word16 nonDiegeticPan; Word32 nonDiegeticPanGain_fx; /* Q31 */ @@ -160,15 +156,9 @@ typedef struct EFAP_WRAPPER efapInWrapper; TDREND_WRAPPER tdRendWrapper; CREND_WRAPPER_HANDLE crendWrapper; -#ifdef SPLIT_REND_WITH_HEAD_ROT TDREND_WRAPPER splitTdRendWrappers[MAX_HEAD_ROT_POSES - 1]; /* Additional TD Rend instances used for split rendering */ -#endif REVERB_HANDLE hReverb; -#ifdef SPLIT_REND_WITH_HEAD_ROT rotation_gains_Word32 rot_gains_prev_fx[MAX_HEAD_ROT_POSES]; -#else - rotation_gains_Word32 rot_gains_prev_fx; -#endif Word16 nonDiegeticPan; Word32 nonDiegeticPanGain_fx; lfe_routing lfeRouting; @@ -182,15 +172,9 @@ typedef struct input_base base; // pan_matrix hoaDecMtx; pan_matrix_fx hoaDecMtx_fx; -#ifdef SPLIT_REND_WITH_HEAD_ROT CLDFB_REND_WRAPPER cldfbRendWrapper; -#endif CREND_WRAPPER_HANDLE crendWrapper; -#ifdef SPLIT_REND_WITH_HEAD_ROT rotation_gains_fx rot_gains_prev_fx[MAX_HEAD_ROT_POSES]; -#else - rotation_gains_fx rot_gains_prev_fx; -#endif Word32 *bufferData_fx; DIRAC_ANA_HANDLE hDirAC; } input_sba; @@ -232,14 +216,10 @@ struct IVAS_REND EFAP_WRAPPER efapOutWrapper; IVAS_LSSETUP_CUSTOM_STRUCT customLsOut; -#ifdef SPLIT_REND_WITH_HEAD_ROT SPLIT_REND_WRAPPER splitRendWrapper; IVAS_REND_AudioBuffer splitRendEncBuffer; -#endif IVAS_REND_HeadRotData headRotData; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 splitRendBFI; -#endif EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; @@ -265,7 +245,6 @@ static void intermidiate_ext_dirac_render( MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA renderer structure */ Word16 to_fix ); -#ifdef SPLIT_REND_WITH_HEAD_ROT static ivas_error renderSbaToMultiBinauralCldfb( input_sba *sbaInput, Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -278,7 +257,6 @@ static ivas_error renderSbaToMultiBinaural( input_sba *sbaInput, const AUDIO_CONFIG outConfig, Word32 out[][L_FRAME48k] ); -#endif /*-------------------------------------------------------------------* * Local functions @@ -359,7 +337,6 @@ static Word32 *getSmplPtr_fx( return buffer.data_fx + chnlIdx * buffer.config.numSamplesPerChannel + smplIdx; } -#ifdef SPLIT_REND_WITH_HEAD_ROT static void convertBitsBufferToInternalBitsBuff( const IVAS_REND_BitstreamBuffer outBits, ISAR_SPLIT_REND_BITS_HANDLE hBits ) @@ -461,7 +438,6 @@ static void accumulateCLDFBArrayToBuffer_fx( return; } -#endif static void copyBufferTo2dArray_fx( const IVAS_REND_AudioBuffer buffer, @@ -471,9 +447,7 @@ static void copyBufferTo2dArray_fx( UWord32 chnlIdx; const Word32 *readPtr; -#ifdef SPLIT_REND_WITH_HEAD_ROT assert( ( buffer.config.is_cldfb == 0 ) && "for CLDFB input call copyBufferToCLDFBarray()" ); -#endif readPtr = buffer.data_fx; @@ -583,10 +557,8 @@ static ivas_error validateOutputAudioConfig( case IVAS_AUDIO_CONFIG_HOA2: case IVAS_AUDIO_CONFIG_HOA3: case IVAS_AUDIO_CONFIG_BINAURAL: -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: -#endif case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: case IVAS_AUDIO_CONFIG_MASA1: @@ -669,14 +641,12 @@ static ivas_error validateOutputSampleRate( /* If no binaural rendering, any sampling rate is supported */ return IVAS_ERR_OK; } -#ifdef SPLIT_REND_WITH_HEAD_ROT ELSE IF( ( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && NE_32( sampleRate, 48000 ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); } ELSE { -#endif /* Otherwise rendering to binaural, support the same set as IVAS decoder */ SWITCH( sampleRate ) @@ -689,9 +659,7 @@ ELSE } return IVAS_ERR_INVALID_SAMPLING_RATE; -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif } /*-------------------------------------------------------------------* * getAudioConfigNumChannels() @@ -713,10 +681,8 @@ ivas_error getAudioConfigNumChannels( BREAK; case IVAS_AUDIO_CONFIG_STEREO: case IVAS_AUDIO_CONFIG_BINAURAL: -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: -#endif case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: case IVAS_AUDIO_CONFIG_MASA2: @@ -1226,10 +1192,8 @@ static ivas_error initHeadRotation_fx( hIvasRend->headRotData.headPositions[i] = quaternionInit_fx(); } -#ifdef SPLIT_REND_WITH_HEAD_ROT hIvasRend->headRotData.sr_pose_pred_axis = DEFAULT_AXIS; move32(); -#endif IF( ( hIvasRend->headRotData.hOrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ) ) == NULL ) { @@ -1381,11 +1345,9 @@ static rendering_context getRendCtx( ctx.pCustomLsOut = &hIvasRend->customLsOut; ctx.pEfapOutWrapper = &hIvasRend->efapOutWrapper; ctx.pHeadRotData = &hIvasRend->headRotData; -#ifdef SPLIT_REND_WITH_HEAD_ROT ctx.hhRendererConfig = &hIvasRend->hRendererConfig; ctx.pSplitRendBFI = &hIvasRend->splitRendBFI; ctx.pSplitRendWrapper = &hIvasRend->splitRendWrapper; -#endif ctx.pCombinedOrientationData = &hIvasRend->hCombinedOrientationData; return ctx; @@ -1433,11 +1395,7 @@ static ivas_error initIsmMasaRendering( ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &inputIsm->crendWrapper, inputIsm->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &inputIsm->crendWrapper ); -#endif ivas_reverb_close( &inputIsm->hReverb ); IF( NE_32( ( error = ivas_omasa_ana_open( &inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects ) ), IVAS_ERR_OK ) ) @@ -1460,9 +1418,7 @@ static ivas_error setRendInputActiveIsm( rendering_context rendCtx; AUDIO_CONFIG outConfig; input_ism *inputIsm; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 i; -#endif Word16 SrcInd[MAX_NUM_TDREND_CHANNELS]; Word16 num_src; Word16 ivas_format; @@ -1504,12 +1460,10 @@ static ivas_error setRendInputActiveIsm( set_zero_fx( inputIsm->prev_pan_gains_fx, MAX_OUTPUT_CHANNELS ); -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { inputIsm->splitTdRendWrappers[i].hHrtfTD = &hrtfs->hHrtfTD; } -#endif inputIsm->hOMasa = NULL; @@ -1519,24 +1473,10 @@ static ivas_error setRendInputActiveIsm( inputIsm->tdRendWrapper.hHrtfTD = &hrtfs->hHrtfTD; test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT test(); test(); IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) -#endif { -#ifndef SPLIT_REND_WITH_HEAD_ROT -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif - { - return error; - } -#else IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; @@ -1594,7 +1534,6 @@ static ivas_error setRendInputActiveIsm( } } } -#endif } ELSE IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) { @@ -1605,48 +1544,6 @@ static ivas_error setRendInputActiveIsm( } ELSE { -#ifndef SPLIT_REND_WITH_HEAD_ROT - IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) - { - return error; - } - Word16 nchan_rend = num_src; - move16(); - - test(); - IF( EQ_16( ivas_format, MC_FORMAT ) && NE_32( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) - { - nchan_rend = sub( nchan_rend, 1 ); /* Skip LFE channel -- added to the others */ - } - - FOR( Word16 nS = 0; nS < nchan_rend; nS++ ) - { - TDREND_SRC_t *Src_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[SrcInd[nS]]; - IF( Src_p != NULL ) - { - IF( Src_p->SrcSpatial_p != NULL ) - { - Src_p->SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - TDREND_SRC_SPATIAL_t *SrcSpatial_p = inputIsm->tdRendWrapper.hBinRendererTd->Sources[nS]->SrcSpatial_p; - SrcSpatial_p->q_Pos_p = Q31; - move16(); - } - } - - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) - { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ) IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif - { - return error; - } - } -#else IF( NE_32( ( error = ivas_td_binaural_open_ext_fx( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate, SrcInd, &num_src ) ), IVAS_ERR_OK ) ) { return error; @@ -1699,7 +1596,6 @@ static ivas_error setRendInputActiveIsm( return error; } } -#endif } return IVAS_ERR_OK; @@ -1709,9 +1605,7 @@ static void clearInputIsm( input_ism *inputIsm ) { rendering_context rendCtx; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t i; -#endif rendCtx = inputIsm->base.ctx; @@ -1720,11 +1614,7 @@ static void clearInputIsm( initRendInputBase_fx( &inputIsm->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); /* Free input's internal handles */ -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &inputIsm->crendWrapper, inputIsm->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &inputIsm->crendWrapper ); -#endif ivas_reverb_close( &inputIsm->hReverb ); @@ -1733,12 +1623,10 @@ static void clearInputIsm( ivas_td_binaural_close_fx( &inputIsm->tdRendWrapper.hBinRendererTd ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { ivas_td_binaural_close_fx( &inputIsm->splitTdRendWrappers[i].hBinRendererTd ); } -#endif ivas_omasa_ana_close( &( inputIsm->hOMasa ) ); @@ -2468,10 +2356,8 @@ static ivas_error updateMcPanGains( SWITCH( outConfig ) { case IVAS_AUDIO_CONFIG_BINAURAL: -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: -#endif BREAK; /* Do nothing */ case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: @@ -2525,9 +2411,7 @@ static ivas_error initMcBinauralRendering( Word32 binauralDelayNs; Word32 outSampleRate; Word8 useTDRend; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t i; -#endif /* Allocate TD binaural renderer for custom loudspeaker layouts (regardless of headrotation) or planar MC layouts with headrotation, CREND for the rest */ @@ -2558,7 +2442,6 @@ static ivas_error initMcBinauralRendering( ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( !reconfigureFlag || !useTDRend ) { FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) @@ -2569,16 +2452,11 @@ static ivas_error initMcBinauralRendering( } } } -#endif /* if we need to use TD renderer and CREND was open, close it */ IF( useTDRend ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &inputMc->crendWrapper, inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &inputMc->crendWrapper ); -#endif } test(); @@ -2638,7 +2516,6 @@ static ivas_error initMcBinauralRendering( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { /* Open TD renderer wrappers */ @@ -2673,7 +2550,6 @@ static ivas_error initMcBinauralRendering( } } -#endif test(); IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb == NULL ) @@ -2691,7 +2567,6 @@ static ivas_error initMcBinauralRendering( ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) { /* open CREND */ -#ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), @@ -2701,16 +2576,6 @@ static ivas_error initMcBinauralRendering( hMixconv, outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) -#endif -#else -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, outSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - hMixconv, - outSampleRate ) ), - IVAS_ERR_OK ) ) -#endif #endif { return error; @@ -2769,11 +2634,7 @@ static ivas_error initMcMasaRendering( ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &inputMc->crendWrapper, inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &inputMc->crendWrapper ); -#endif ivas_reverb_close( &inputMc->hReverb ); @@ -2860,16 +2721,12 @@ static ivas_error setRendInputActiveMc( RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hrtfs ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 i; -#endif ivas_error error; rendering_context rendCtx; AUDIO_CONFIG outConfig; input_mc *inputMc; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pos_idx; -#endif inputMc = (input_mc *) input; rendCtx = inputMc->base.ctx; @@ -2902,14 +2759,10 @@ static ivas_error setRendInputActiveMc( inputMc->hReverb = NULL; inputMc->hMcMasa = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { initRotGainsWord32_fx( inputMc->rot_gains_prev_fx[pos_idx] ); } -#else - initRotGainsWord32_fx( inputMc->rot_gains_prev_fx ); -#endif inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); set32_fx( inputMc->lfeDelayBuffer_fx, 0, MAX_BIN_DELAY_SAMPLES ); inputMc->binauralDelaySmp = 0; @@ -2917,7 +2770,6 @@ static ivas_error setRendInputActiveMc( test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { if ( hrtfs->hHrtfTD ) @@ -2928,9 +2780,6 @@ static ivas_error setRendInputActiveMc( } IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) -#else - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES @@ -2963,9 +2812,7 @@ static void clearInputMc( input_mc *inputMc ) { rendering_context rendCtx; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 i; -#endif rendCtx = inputMc->base.ctx; freeMcLfeDelayBuffer_fx( &inputMc->lfeDelayBuffer_fx ); @@ -2978,11 +2825,7 @@ static void clearInputMc( efap_free_data_fx( &inputMc->efapInWrapper.hEfap ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &inputMc->crendWrapper, inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &inputMc->crendWrapper ); -#endif ivas_reverb_close( &inputMc->hReverb ); @@ -2991,7 +2834,6 @@ static void clearInputMc( ivas_td_binaural_close_fx( &inputMc->tdRendWrapper.hBinRendererTd ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) { IF( inputMc->splitTdRendWrappers[i].hBinRendererTd != NULL ) @@ -3000,7 +2842,6 @@ static void clearInputMc( inputMc->splitTdRendWrappers[i].hHrtfTD = NULL; } } -#endif ivas_mcmasa_ana_close( &( inputMc->hMcMasa ) ); @@ -3129,7 +2970,6 @@ static ivas_error updateSbaPanGains( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: SWITCH( outConfig ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: { @@ -3153,10 +2993,8 @@ static ivas_error updateSbaPanGains( } break; } -#endif case IVAS_AUDIO_CONFIG_BINAURAL: { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( hRendCfg->split_rend_config.rendererSelection == ISAR_SPLIT_REND_RENDERER_SELECTION_FASTCONV ) { if ( ( error = ivas_rend_openCldfbRend( &inputSba->cldfbRendWrapper, inConfig, outConfig, @@ -3166,20 +3004,11 @@ static ivas_error updateSbaPanGains( } } else -#endif { -#ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif -#else -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif #endif { return error; @@ -3193,18 +3022,10 @@ static ivas_error updateSbaPanGains( { return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif -#else -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif #endif { return error; @@ -3237,11 +3058,7 @@ static ivas_error initSbaMasaRendering( { ivas_error error; -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &inputSba->crendWrapper, inputSba->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses ); -#else - ivas_rend_closeCrend( &inputSba->crendWrapper ); -#endif IF( NE_32( ( error = ivas_dirac_ana_open_fx( &inputSba->hDirAC, inSampleRate ) ), IVAS_ERR_OK ) ) { @@ -3264,9 +3081,7 @@ static ivas_error setRendInputActiveSba( rendering_context rendCtx; AUDIO_CONFIG outConfig; input_sba *inputSba; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; -#endif inputSba = (input_sba *) input; rendCtx = inputSba->base.ctx; @@ -3278,37 +3093,22 @@ static ivas_error setRendInputActiveSba( return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputSba->bufferData_fx, MAX_CLDFB_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = allocateInputBaseBufferData_fx( &inputSba->bufferData_fx, MAX_BUFFER_LENGTH ) ), IVAS_ERR_OK ) ) - { - return error; - } -#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT initRendInputBase_fx( &inputSba->base, inConfig, id, rendCtx, inputSba->bufferData_fx, MAX_CLDFB_BUFFER_LENGTH ); -#else - initRendInputBase_fx( &inputSba->base, inConfig, id, rendCtx, inputSba->bufferData_fx, MAX_BUFFER_LENGTH ); -#endif setZeroPanMatrix_fx( inputSba->hoaDecMtx_fx ); inputSba->crendWrapper = NULL; inputSba->hDirAC = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( pos_idx = 0; pos_idx < MAX_HEAD_ROT_POSES; pos_idx++ ) { initRotGains_fx( inputSba->rot_gains_prev_fx[pos_idx] ); } inputSba->cldfbRendWrapper.hHrtfFastConv = hrtfs->hHrtfFastConv; -#else - initRotGains_fx( inputSba->rot_gains_prev_fx ); -#endif test(); IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_MASA1 ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_MASA2 ) ) @@ -3340,17 +3140,12 @@ static void clearInputSba( initRendInputBase_fx( &inputSba->base, IVAS_AUDIO_CONFIG_INVALID, 0, rendCtx, NULL, 0 ); -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_rend_closeCrend( &inputSba->crendWrapper, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ); IF( inputSba->cldfbRendWrapper.hCldfbRend != NULL ) { ivas_rend_closeCldfbRend( &inputSba->cldfbRendWrapper ); } -#else - /* Free input's internal handles */ - ivas_rend_closeCrend( &inputSba->crendWrapper ); -#endif ivas_dirac_ana_close_fx( &( inputSba->hDirAC ) ); @@ -3470,9 +3265,7 @@ ivas_error IVAS_REND_Open( const Word16 num_subframes ) { Word16 i; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 j; -#endif IVAS_REND_HANDLE hIvasRend; ivas_error error; Word16 numOutChannels; @@ -3542,10 +3335,8 @@ ivas_error IVAS_REND_Open( } /* Initialize inputs */ -#ifdef SPLIT_REND_WITH_HEAD_ROT isar_init_split_rend_handles( &hIvasRend->splitRendWrapper ); hIvasRend->splitRendEncBuffer.data_fx = NULL; -#endif FOR( i = 0; i < RENDERER_MAX_ISM_INPUTS; ++i ) { @@ -3553,13 +3344,11 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsIsm[i].crendWrapper = NULL; hIvasRend->inputsIsm[i].hReverb = NULL; hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( j = 0; j < MAX_HEAD_ROT_POSES - 1; ++j ) { hIvasRend->inputsIsm[i].splitTdRendWrappers[j].hBinRendererTd = NULL; hIvasRend->inputsIsm[i].splitTdRendWrappers[j].hHrtfTD = NULL; } -#endif hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; move16(); hIvasRend->inputsIsm[i].nonDiegeticPanGain_fx = nonDiegeticPanGain; @@ -3583,13 +3372,11 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsMc[i].nonDiegeticPanGain_fx = nonDiegeticPanGain; move32(); hIvasRend->inputsMc[i].hMcMasa = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT FOR( j = 0; j < MAX_HEAD_ROT_POSES - 1; ++j ) { hIvasRend->inputsMc[i].splitTdRendWrappers[j].hBinRendererTd = NULL; hIvasRend->inputsMc[i].splitTdRendWrappers[j].hHrtfTD = NULL; } -#endif } FOR( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) @@ -3597,10 +3384,8 @@ ivas_error IVAS_REND_Open( initRendInputBase_fx( &hIvasRend->inputsSba[i].base, IVAS_AUDIO_CONFIG_INVALID, 0, getRendCtx( hIvasRend ), NULL, 0 ); hIvasRend->inputsSba[i].crendWrapper = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT hIvasRend->inputsSba[i].cldfbRendWrapper.hCldfbRend = NULL; hIvasRend->inputsSba[i].cldfbRendWrapper.hHrtfFastConv = NULL; -#endif hIvasRend->inputsSba[i].bufferData_fx = NULL; hIvasRend->inputsSba[i].hDirAC = NULL; } @@ -4039,7 +3824,6 @@ static ivas_error findFreeInputSlot_fx( } -#ifdef SPLIT_REND_WITH_HEAD_ROT static Word16 getCldfbRendFlag( IVAS_REND_HANDLE hIvasRend, /* i : Renderer handle */ const IVAS_REND_AudioConfigType new_configType ) @@ -4168,7 +3952,6 @@ static ivas_error ivas_pre_rend_init( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -4196,7 +3979,6 @@ ivas_error IVAS_REND_AddInput_fx( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( ( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && hIvasRend->splitRendEncBuffer.data_fx == NULL && hIvasRend->hRendererConfig != NULL ) { Word16 cldfb_in_flag; @@ -4207,7 +3989,6 @@ ivas_error IVAS_REND_AddInput_fx( return error; } } -#endif SWITCH( getAudioConfigType( inConfig ) ) @@ -4317,11 +4098,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( test(); test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) -#else - IF( EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#endif { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) @@ -4667,7 +4444,6 @@ ivas_error IVAS_REND_GetDelay_fx( { IF( NE_32( hIvasRend->inputsSba[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( hIvasRend->splitRendWrapper.hBinHrSplitPreRend != NULL ) { if ( hIvasRend->hRendererConfig->split_rend_config.rendererSelection == ISAR_SPLIT_REND_RENDERER_SELECTION_FASTCONV ) @@ -4687,7 +4463,6 @@ ivas_error IVAS_REND_GetDelay_fx( max_latency_ns = max( max_latency_ns, latency_ns ); } else -#endif { IF( hIvasRend->inputsSba[i].crendWrapper != NULL ) { @@ -4738,9 +4513,7 @@ ivas_error IVAS_REND_FeedInputAudio_fx( ivas_error error; input_base *inputBase; Word16 numInputChannels; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 cldfb2tdShift; -#endif /* Validate function arguments */ test(); @@ -4750,14 +4523,10 @@ ivas_error IVAS_REND_FeedInputAudio_fx( } test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT cldfb2tdShift = ( inputAudio.config.is_cldfb ) ? 1 : 0; IF( inputAudio.config.numSamplesPerChannel <= 0 || ( MAX_BUFFER_LENGTH_PER_CHANNEL < inputAudio.config.numSamplesPerChannel && inputAudio.config.is_cldfb == 0 ) || ( ( shl( MAX_BUFFER_LENGTH_PER_CHANNEL, cldfb2tdShift ) ) < inputAudio.config.numSamplesPerChannel && inputAudio.config.is_cldfb == 1 ) ) -#else - IF( inputAudio.config.numSamplesPerChannel <= 0 || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, inputAudio.config.numSamplesPerChannel ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Buffer size outside of supported range" ); } @@ -4770,15 +4539,10 @@ ivas_error IVAS_REND_FeedInputAudio_fx( test(); move32(); // move added for typecasting -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) && NE_32( L_shr( L_mult0( inputAudio.config.numSamplesPerChannel, 1000 ), cldfb2tdShift ), (Word32) W_mult0_32_32( L_mult0( BINAURAL_RENDERING_FRAME_SIZE_MS, hIvasRend->num_subframes ), hIvasRend->sampleRateOut ) ) ) -#else - IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && - NE_32( L_mult0( inputAudio.config.numSamplesPerChannel, 1000 ), (Word32) W_mult0_32_32( L_mult0( BINAURAL_RENDERING_FRAME_SIZE_MS, hIvasRend->num_subframes ), hIvasRend->sampleRateOut ) ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); } @@ -4809,11 +4573,7 @@ ivas_error IVAS_REND_FeedInputAudio_fx( MVR2R_WORD32( inputAudio.data_fx, inputBase->inputBuffer.data_fx, inputAudio.config.numSamplesPerChannel * inputAudio.config.numChannels ); -#ifdef SPLIT_REND_WITH_HEAD_ROT inputBase->numNewSamplesPerChannel = shr( inputAudio.config.numSamplesPerChannel, cldfb2tdShift ); -#else - inputBase->numNewSamplesPerChannel = inputAudio.config.numSamplesPerChannel; -#endif move32(); return IVAS_ERR_OK; @@ -5009,7 +4769,6 @@ Word16 IVAS_REND_GetRenderConfig( Copy32( hRCin->roomAcoustics.pAcoustic_rt60_fx, hRCout->roomAcoustics.pAcoustic_rt60_fx, CLDFB_NO_CHANNELS_MAX ); Copy32( hRCin->roomAcoustics.pAcoustic_dsr_fx, hRCout->roomAcoustics.pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX ); -#ifdef SPLIT_REND_WITH_HEAD_ROT hRCout->split_rend_config.splitRendBitRate = SPLIT_REND_768k; hRCout->split_rend_config.dof = 3; hRCout->split_rend_config.hq_mode = 0; @@ -5020,7 +4779,6 @@ Word16 IVAS_REND_GetRenderConfig( hRCout->split_rend_config.poseCorrectionMode = ISAR_SPLIT_REND_POSE_CORRECTION_MODE_CLDFB; hRCout->split_rend_config.rendererSelection = hRCin->split_rend_config.rendererSelection; hRCout->split_rend_config.lc3plus_highres = 0; -#endif hRCout->roomAcoustics.use_er = hRCin->roomAcoustics.use_er; @@ -5044,9 +4802,7 @@ Word16 IVAS_REND_FeedRenderConfig( ) { RENDER_CONFIG_HANDLE hRenderConfig; -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_error error; -#endif test(); IF( hIvasRend == NULL || hIvasRend->hRendererConfig == NULL ) @@ -5082,7 +4838,6 @@ Word16 IVAS_REND_FeedRenderConfig( Copy32( renderConfig.roomAcoustics.AbsCoeff_fx, hRenderConfig->roomAcoustics.AbsCoeff_fx, IVAS_ROOM_ABS_COEFF ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT hRenderConfig->split_rend_config = renderConfig.split_rend_config; /* Overwrite any pose correction settings if 0 DOF (no pose correction) was selected */ IF( EQ_16( hRenderConfig->split_rend_config.dof, 0 ) ) @@ -5110,7 +4865,6 @@ Word16 IVAS_REND_FeedRenderConfig( return error; } } -#endif return IVAS_ERR_OK; } @@ -5124,9 +4878,7 @@ ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ -#ifdef SPLIT_REND_WITH_HEAD_ROT const ISAR_SPLIT_REND_ROT_AXIS rot_axis, /* i : external control for rotation axis for split rendering */ -#endif const Word16 sf_idx /* i : subframe index */ ) { @@ -5165,20 +4917,12 @@ ivas_error IVAS_REND_SetHeadRotation( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* check for Euler angle signaling */ IF( EQ_32( headRot.w_fx, L_negate( 12582912 ) ) && EQ_16( headRot.q_fact, Q22 ) ) { Euler2Quat_fx( deg2rad_fx( headRot.x_fx ), deg2rad_fx( headRot.y_fx ), deg2rad_fx( headRot.z_fx ), &rotQuat ); modify_Quat_q_fx( &rotQuat, &rotQuat, Q29 ); } -#else - /* check for Euler angle signaling */ - IF( EQ_32( headRot.w_fx, -1610612736 /* -3.0f in Q29 */ ) ) - { - Euler2Quat_fx( deg2rad_fx( headRot.x_fx ), deg2rad_fx( headRot.y_fx ), deg2rad_fx( headRot.z_fx ), &rotQuat ); - } -#endif ELSE { rotQuat = headRot; @@ -5225,9 +4969,7 @@ ivas_error IVAS_REND_SetHeadRotation( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT hIvasRend->headRotData.sr_pose_pred_axis = rot_axis; -#endif hIvasRend->headRotData.Pos[sf_idx] = Pos; @@ -5278,7 +5020,6 @@ ivas_error IVAS_REND_DisableHeadRotation( return IVAS_ERR_OK; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-------------------------------------------------------------------* * IVAS_REND_SetSplitRendBFI() * @@ -5294,7 +5035,6 @@ IVAS_REND_SetSplitRendBFI( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -6000,7 +5740,6 @@ static Word16 getNumSubframesInBuffer( const IVAS_REND_AudioBuffer *buffer, const Word32 sampleRate ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 cldfb2tdShift; cldfb2tdShift = buffer->config.is_cldfb ? 1 : 0; @@ -6009,11 +5748,6 @@ static Word16 getNumSubframesInBuffer( temp = BASOP_Util_Divide1616_Scale( buffer->config.numSamplesPerChannel, temp, &scale ); temp = shr( temp, sub( 15, scale ) ); /* Q0 */ temp = shr( temp, cldfb2tdShift ); -#else - Word16 scale, temp = extract_l( Mpy_32_32( sampleRate, 10737418 /* 1 / FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES in Q31 */ ) ); - temp = BASOP_Util_Divide1616_Scale( buffer->config.numSamplesPerChannel, temp, &scale ); - temp = shr( temp, sub( 15, scale ) ); /* Q0 */ -#endif return temp; } @@ -6190,11 +5924,7 @@ static ivas_error renderIsmToBinauralRoom( } // Crend_process porting CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = ismInput->crendWrapper->hCrend[0]; -#else - hCrend = ismInput->crendWrapper->hCrend; -#endif IF( hCrend->reflections != NULL ) { test(); @@ -6210,13 +5940,8 @@ static ivas_error renderIsmToBinauralRoom( move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT /* render 7_1_4 with BRIRs */ IF( NE_32( ( error = ivas_rend_crendProcessSubframe( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, ismInput->base.inputBuffer.config.numSamplesPerChannel, *ismInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) -#else - /* render 7_1_4 with BRIRs */ - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( ismInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, ismInput->base.inputBuffer.config.numSamplesPerChannel, *ismInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -6504,7 +6229,6 @@ static ivas_error renderIsmToSba( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT static ivas_error renderIsmToSplitBinaural( input_ism *ismInput, const IVAS_REND_AudioBuffer outAudio ) @@ -6627,7 +6351,6 @@ static ivas_error renderIsmToSplitBinaural( /* Encoding to split rendering bitstream done at a higher level */ return IVAS_ERR_OK; } -#endif static void renderIsmToMasa( @@ -6741,12 +6464,10 @@ static ivas_error renderInputIsm( case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR: error = renderIsmToBinauralRoom( ismInput, outAudio, &exp ); BREAK; -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: error = renderIsmToSplitBinaural( ismInput, outAudio ); break; -#endif case IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: error = renderIsmToBinauralReverb( ismInput, outAudio ); BREAK; @@ -6817,17 +6538,13 @@ static ivas_error renderActiveInputsIsm( static ivas_error renderLfeToBinaural_fx( const input_mc *mcInput, -#ifdef SPLIT_REND_WITH_HEAD_ROT const AUDIO_CONFIG outConfig, -#endif IVAS_REND_AudioBuffer outAudio, Word16 in_q, Word16 out_q ) { Word16 lfe_idx; -#ifdef SPLIT_REND_WITH_HEAD_ROT Word16 pose_idx, num_poses; -#endif Word32 gain_fx; Word16 ear_idx, i, r_shift; Word32 tmpLfeBuffer[MAX_BUFFER_LENGTH_PER_CHANNEL]; @@ -6835,11 +6552,7 @@ static ivas_error renderLfeToBinaural_fx( const Word32 *lfeInput; Word32 *writePtr; -#ifdef SPLIT_REND_WITH_HEAD_ROT assert( ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && "Must be binaural output" ); -#else - assert( ( outAudio.config.numChannels == 2 ) && "Must be binaural output" ); -#endif push_wmops( "renderLfeToBinaural" ); gain_fx = GAIN_LFE_WORD32; /* 1.88364911f in Q30 */ @@ -6891,7 +6604,6 @@ static ivas_error renderLfeToBinaural_fx( } } -#ifdef SPLIT_REND_WITH_HEAD_ROT /* Copy LFE to left and right binaural channels for all poses */ IF( mcInput->base.ctx.pSplitRendWrapper != NULL ) { @@ -6912,19 +6624,6 @@ static ivas_error renderLfeToBinaural_fx( v_add_fixed( writePtr, tmpLfeBuffer, writePtr, frame_size, 0 ); /* Q(out_q) */ } } -#else /* SPLIT_REND_WITH_HEAD_ROT */ - /* Copy LFE to left and right ears */ - FOR( ear_idx = 0; ear_idx < BINAURAL_CHANNELS; ++ear_idx ) - { - writePtr = getSmplPtr_fx( outAudio, ear_idx, 0 ); - move32(); -#ifdef VEC_ARITH_OPT_v1 - v_add_fixed_no_hdrm( writePtr, tmpLfeBuffer, writePtr, frame_size ); /* Q(out_q) */ -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( writePtr, tmpLfeBuffer, writePtr, frame_size, 0 ); /* Q(out_q) */ -#endif /* VEC_ARITH_OPT_v1 */ - } -#endif pop_wmops(); @@ -7001,11 +6700,7 @@ static ivas_error renderMcToBinaural( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set32_fx( tmpRotBuffer.data_fx, 0, imult1616( tmpRotBuffer.config.numSamplesPerChannel, tmpRotBuffer.config.numChannels ) ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx[0], mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -7022,18 +6717,10 @@ static ivas_error renderMcToBinaural( } // Porting Crend_process function CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = mcInput->crendWrapper->hCrend[0]; -#else - hCrend = mcInput->crendWrapper->hCrend; -#endif /* call CREND */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, p_tmpRendBuffer_fx, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer_fx, p_tmpRendBuffer_fx, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -7046,19 +6733,11 @@ static ivas_error renderMcToBinaural( accumulate2dArrayToBuffer_fx( tmpRendBuffer_fx, &outAudio ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outConfig, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) - - { - return error; - } -#endif *outAudio.pq_fact = exp; move16(); pop_wmops(); @@ -7139,17 +6818,10 @@ static ivas_error renderMcToBinauralRoom( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set32_fx( tmpRotBuffer.data_fx, 0, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx[0], mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, - mcInput->rot_gains_prev_fx, - mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -7165,18 +6837,10 @@ static ivas_error renderMcToBinauralRoom( } // Porting Crend_process function CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = mcInput->crendWrapper->hCrend[0]; -#else - hCrend = mcInput->crendWrapper->hCrend; -#endif /* call CREND */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, mcInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpRendBuffer, p_tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -7189,11 +6853,7 @@ static ivas_error renderMcToBinauralRoom( accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outConfig, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -7251,17 +6911,10 @@ static ivas_error renderMcCustomLsToBinauralRoom( tmpRotBuffer.data_fx = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( Word32 ) ); set32_fx( tmpRotBuffer.data_fx, 0, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, mcInput->rot_gains_prev_fx[0], mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = rotateFrameMc_fx( mcInput->base.inputBuffer, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->base.ctx.pCombinedOrientationData, - mcInput->rot_gains_prev_fx, - mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -7296,18 +6949,10 @@ static ivas_error renderMcCustomLsToBinauralRoom( copyBufferTo2dArray_fx( tmpMcBuffer, tmpCrendBuffer ); CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = mcInput->crendWrapper->hCrend[0]; -#else - hCrend = mcInput->crendWrapper->hCrend; -#endif /* call CREND */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( mcInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, *mcInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -7319,11 +6964,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( accumulate2dArrayToBuffer_fx( tmpCrendBuffer, &outAudio ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outConfig, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = renderLfeToBinaural_fx( mcInput, outAudio, *outAudio.pq_fact, exp ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -7388,7 +7029,6 @@ static void renderMcToMasa( return; } -#ifdef SPLIT_REND_WITH_HEAD_ROT static ivas_error renderMcToSplitBinaural( input_mc *mcInput, const AUDIO_CONFIG outConfig, @@ -7528,11 +7168,7 @@ static ivas_error renderMcToSplitBinaural( } ELSE { -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = mcInput->crendWrapper->hCrend[0]; -#else - hCrend = mcInput->crendWrapper->hCrend; -#endif /* crend processing overview: * 1. rotateFrameMc: inputBuffer to tmpRotBuffer * 2. crend_process: tmpRotBuffer to tmpRendBuffer @@ -7601,7 +7237,6 @@ static ivas_error renderMcToSplitBinaural( pop_wmops(); return IVAS_ERR_OK; } -#endif static ivas_error renderInputMc( @@ -7653,12 +7288,10 @@ static ivas_error renderInputMc( error = renderMcToBinauralRoom( mcInput, outConfig, outAudio ); } BREAK; -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: error = renderMcToSplitBinaural( mcInput, outConfig, outAudio ); break; -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -7736,7 +7369,6 @@ static void renderSbaToSba( } -#ifdef SPLIT_REND_WITH_HEAD_ROT static ivas_error renderSbaToMultiBinaural( input_sba *sbaInput, @@ -7921,7 +7553,6 @@ static ivas_error renderSbaToSplitBinaural( pop_wmops(); return error; } -#endif static ivas_error renderSbaToBinaural( input_sba *sbaInput, @@ -7939,7 +7570,6 @@ static ivas_error renderSbaToBinaural( push_wmops( "renderSbaToBinaural" ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( sbaInput->base.ctx.hhRendererConfig[0]->split_rend_config.rendererSelection, ISAR_SPLIT_REND_RENDERER_SELECTION_FASTCONV ) ) { Word32 Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; @@ -7954,7 +7584,6 @@ static ivas_error renderSbaToBinaural( accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); } ELSE -#endif { FOR( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) @@ -7989,21 +7618,12 @@ static ivas_error renderSbaToBinaural( Copy32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, i_mult( tmpRotBuffer.config.numChannels, tmpRotBuffer.config.numSamplesPerChannel ) ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_16( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx[0], tmpRotBuffer ) ), IVAS_ERR_OK ) ) { return error; } -#else - IF( NE_16( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, - sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx, tmpRotBuffer ) ), - IVAS_ERR_OK ) ) - { - return error; - } -#endif copyBufferTo2dArray_fx( tmpRotBuffer, output_buffer_fx ); free( tmpRotBuffer.data_fx ); @@ -8014,18 +7634,10 @@ static ivas_error renderSbaToBinaural( } // Porting Crend_process function CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = sbaInput->crendWrapper->hCrend[0]; -#else - hCrend = sbaInput->crendWrapper->hCrend; -#endif /* call CREND */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, output_fx, output_fx, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, sbaInput->base.inConfig, outConfig, NULL, NULL, NULL, NULL, NULL, output_fx, output_fx, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -8062,11 +7674,7 @@ static ivas_error renderSbaToBinauralRoom( push_wmops( "renderSbaToBinauralRoom" ); Word16 nchan_out; CREND_HANDLE hCrend; -#ifdef SPLIT_REND_WITH_HEAD_ROT hCrend = sbaInput->crendWrapper->hCrend[0]; -#else - hCrend = sbaInput->crendWrapper->hCrend; -#endif IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &nchan_out ) ), IVAS_ERR_OK ) ) { @@ -8103,19 +7711,11 @@ static ivas_error renderSbaToBinauralRoom( /* copy input for in-place rotation */ Copy32( sbaInput->base.inputBuffer.data_fx, tmpRotBuffer.data_fx, i_mult( tmpRotBuffer.config.numChannels, tmpRotBuffer.config.numSamplesPerChannel ) ); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, sbaInput->base.ctx.pCombinedOrientationData, sbaInput->rot_gains_prev_fx[0], tmpRotBuffer ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = rotateFrameSba_fx( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, - sbaInput->base.ctx.pCombinedOrientationData, - sbaInput->rot_gains_prev_fx, - tmpRotBuffer ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -8150,11 +7750,7 @@ static ivas_error renderSbaToBinauralRoom( // Porting Crend_process function /* call CREND */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate, 0 ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( sbaInput->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, NULL, NULL, NULL, NULL, NULL, p_tmpCrendBuffer, p_tmpCrendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, *sbaInput->base.ctx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -8197,20 +7793,14 @@ static ivas_error renderInputSba( { ivas_error error; IVAS_REND_AudioBuffer inAudio; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t cldfb2tdShift; -#endif error = IVAS_ERR_OK; move32(); inAudio = sbaInput->base.inputBuffer; -#ifdef SPLIT_REND_WITH_HEAD_ROT cldfb2tdShift = outAudio.config.is_cldfb ? 1 : 0; IF( NE_32( L_shl( sbaInput->base.numNewSamplesPerChannel, cldfb2tdShift ), outAudio.config.numSamplesPerChannel ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( NE_32( sbaInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } @@ -8237,12 +7827,10 @@ static ivas_error renderInputSba( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: SWITCH( outConfig ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: error = renderSbaToSplitBinaural( sbaInput, outConfig, outAudio ); break; -#endif case IVAS_AUDIO_CONFIG_BINAURAL: error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); BREAK; @@ -8576,11 +8164,9 @@ static ivas_error renderInputMasa( Word16 maxBin; Word32 *tmpBuffer_fx[MAX_OUTPUT_CHANNELS]; Word32 tmpBuffer_buff_fx[MAX_OUTPUT_CHANNELS][L_FRAME48k]; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t cldfb2tdShift; Word32 Cldfb_RealBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word32 Cldfb_ImagBuffer_Binaural[MAX_HEAD_ROT_POSES * BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; -#endif IF( !masaInput->metadataHasBeenFed ) { @@ -8589,13 +8175,9 @@ static ivas_error renderInputMasa( inAudio = masaInput->base.inputBuffer; -#ifdef SPLIT_REND_WITH_HEAD_ROT cldfb2tdShift = outAudio.config.is_cldfb ? 1 : 0; IF( ( NE_32( L_shl( masaInput->base.numNewSamplesPerChannel, cldfb2tdShift ), outAudio.config.numSamplesPerChannel ) ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( NE_32( masaInput->base.numNewSamplesPerChannel, outAudio.config.numSamplesPerChannel ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Mismatch between the number of input samples vs number of requested output samples - currently not allowed" ); } @@ -8632,7 +8214,6 @@ static ivas_error renderInputMasa( num_subframes = BASOP_Util_Divide3232_Scale( L_mult0( masaInput->base.inputBuffer.config.numSamplesPerChannel, IVAS_NUM_FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ), *masaInput->base.ctx.pOutSampleRate, &exp ); num_subframes = shr( num_subframes, sub( 15, exp ) ); /* Q0 */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) { /* split rendering. use the combined of the first subframe in all subframes */ @@ -8670,7 +8251,6 @@ static ivas_error renderInputMasa( ELSE { /* non-split path */ -#endif SWITCH( masaInput->hMasaExtRend->renderer_type ) { case RENDERER_DIRAC: @@ -8714,11 +8294,7 @@ static ivas_error renderInputMasa( scale_sig32( outAudio.data_fx, i_mult( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ), sub( Q11, *outAudio.pq_fact ) ); -#ifdef SPLIT_REND_WITH_HEAD_ROT ivas_masa_ext_rend_parambin_render_fx( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer_fx, num_subframes, NULL, NULL, NULL ); -#else - ivas_masa_ext_rend_parambin_render_fx( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer_fx, num_subframes ); -#endif *outAudio.pq_fact = Q11; move16(); BREAK; @@ -8728,9 +8304,7 @@ static ivas_error renderInputMasa( return ( IVAS_ERROR( IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED, "Wrong output config for MASA input in external renderer\n" ) ); } accumulate2dArrayToBuffer_fx( tmpBuffer_buff_fx, &outAudio ); -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif } return IVAS_ERR_OK; @@ -8961,20 +8535,14 @@ ivas_error IVAS_REND_SetIsmMetadataDelay( static ivas_error getSamplesInternal( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -#ifdef SPLIT_REND_WITH_HEAD_ROT IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */, IVAS_REND_BitstreamBuffer *hBits /*i/o: buffer for input/output bitstream. Needed in split rendering mode*/ -#else - IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ -#endif ) { ivas_error error; Word16 numOutChannels; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t cldfb2tdSampleShift; IVAS_REND_AudioBuffer outAudioOrig; -#endif /* Validate function arguments */ test(); IF( hIvasRend == NULL || outAudio.data_fx == NULL ) @@ -8983,14 +8551,10 @@ static ivas_error getSamplesInternal( } test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT cldfb2tdSampleShift = ( outAudio.config.is_cldfb ) ? 1 : 0; IF( outAudio.config.numSamplesPerChannel <= 0 || ( MAX_BUFFER_LENGTH_PER_CHANNEL < outAudio.config.numSamplesPerChannel && outAudio.config.is_cldfb == 0 ) || ( ( shl( MAX_BUFFER_LENGTH_PER_CHANNEL, cldfb2tdSampleShift ) ) < outAudio.config.numSamplesPerChannel && outAudio.config.is_cldfb == 1 ) ) -#else - IF( outAudio.config.numSamplesPerChannel <= 0 || LT_16( MAX_BUFFER_LENGTH_PER_CHANNEL, outAudio.config.numSamplesPerChannel ) ) -#endif { return IVAS_ERR_INVALID_BUFFER_SIZE; } @@ -9002,16 +8566,11 @@ static ivas_error getSamplesInternal( } test(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) && NE_32( L_shr( L_mult0( outAudio.config.numSamplesPerChannel, 1000 ), cldfb2tdSampleShift ), imult3216( hIvasRend->sampleRateOut, i_mult( hIvasRend->num_subframes, BINAURAL_RENDERING_FRAME_SIZE_MS ) ) ) ) -#else - IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) && - NE_32( L_mult0( outAudio.config.numSamplesPerChannel, 1000 ), imult3216( hIvasRend->sampleRateOut, i_mult( hIvasRend->num_subframes, BINAURAL_RENDERING_FRAME_SIZE_MS ) ) ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_BUFFER_SIZE, "Binaural rendering requires specific frame size" ); } @@ -9090,11 +8649,7 @@ static ivas_error getSamplesInternal( return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( NE_16( numOutChannels, outAudio.config.numChannels ) && NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) -#else - IF( NE_16( numOutChannels, outAudio.config.numChannels ) ) -#endif { return IVAS_ERR_WRONG_NUM_CHANNELS; } @@ -9102,7 +8657,6 @@ static ivas_error getSamplesInternal( /* Clear original output buffer */ set32_fx( outAudio.data_fx, 0, imult1616( outAudio.config.numChannels, outAudio.config.numSamplesPerChannel ) ); -#ifdef SPLIT_REND_WITH_HEAD_ROT outAudioOrig = outAudio; /* Use internal buffer if outputting split rendering bitstream */ IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || @@ -9121,7 +8675,6 @@ static ivas_error getSamplesInternal( /* Clear output buffer for split rendering bitstream */ set32_fx( outAudio.data_fx, 0, outAudio.config.numChannels * outAudio.config.numSamplesPerChannel ); } -#endif IF( NE_32( ( error = renderActiveInputsIsm( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { @@ -9143,13 +8696,7 @@ static ivas_error getSamplesInternal( test(); test(); -#ifndef SPLIT_REND_WITH_HEAD_ROT - Word32 limiter_thresold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); - limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_thresold, *outAudio.pq_fact ); -#endif - -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { ISAR_SPLIT_REND_BITS_DATA bits; @@ -9276,15 +8823,12 @@ static ivas_error getSamplesInternal( accumulate2dArrayToBuffer_fx( tmpBinaural_buff, &outAudio ); } } -#endif -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( outAudio.config.is_cldfb == 0 ) { Word32 limiter_thresold = L_lshl( IVAS_LIMITER_THRESHOLD, *outAudio.pq_fact ); limitRendererOutput_fx( hIvasRend->hLimiter, outAudio.data_fx, outAudio.config.numSamplesPerChannel, limiter_thresold, *outAudio.pq_fact ); } -#endif /* update global cominbed orientation start index */ ivas_combined_orientation_update_start_index( hIvasRend->hCombinedOrientationData, outAudio.config.numSamplesPerChannel ); @@ -9304,14 +8848,9 @@ ivas_error IVAS_REND_GetSamples( ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT return getSamplesInternal( hIvasRend, outAudio, NULL ); -#else - return getSamplesInternal( hIvasRend, outAudio ); -#endif } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-------------------------------------------------------------------* * IVAS_REND_GetSplitBinauralBitstream() * @@ -9364,7 +8903,6 @@ ivas_error IVAS_REND_GetSplitRendBitstreamHeader( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* * IVAS_REND_Close() @@ -9416,10 +8954,8 @@ void IVAS_REND_Close( ivas_limiter_close_fx( &hIvasRend->hLimiter ); -#ifdef SPLIT_REND_WITH_HEAD_ROT /* Split binaural rendering */ ISAR_PRE_REND_close( &hIvasRend->splitRendWrapper, &hIvasRend->splitRendEncBuffer ); -#endif closeHeadRotation( hIvasRend ); @@ -9443,7 +8979,6 @@ void IVAS_REND_Close( return; } -#ifdef SPLIT_REND_WITH_HEAD_ROT /*-------------------------------------------------------------------* * IVAS_REND_openCldfb() * @@ -9578,7 +9113,6 @@ void IVAS_REND_cldfbSynthesis_wrapper( return; } -#endif /*---------------------------------------------------------------------* @@ -10144,9 +9678,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( Word16 tmpFloat_fx; ivas_error error; Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; -#ifdef SPLIT_REND_WITH_HEAD_ROT int16_t pos_idx; -#endif Word16 tmp; Word16 tmp_e; @@ -10168,13 +9700,9 @@ static ivas_error ivas_masa_ext_rend_parambin_init( renderer_type = inputMasa->hMasaExtRend->renderer_type; move32(); -#ifdef SPLIT_REND_WITH_HEAD_ROT for ( pos_idx = 0; pos_idx < inputMasa->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses; pos_idx++ ) { hDiracDecBin = inputMasa->hMasaExtRend->hDiracDecBin[pos_idx]; -#else - hDiracDecBin = inputMasa->hMasaExtRend->hDiracDecBin; -#endif /* Init assumes that no reconfiguration is required in external renderer. Instead, free and rebuild whole rendering. */ IF( ( hDiracDecBin = (DIRAC_DEC_BIN_HANDLE) malloc( sizeof( DIRAC_DEC_BIN_DATA ) ) ) == NULL ) @@ -10272,11 +9800,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( hDiracDecBin->hReverb == NULL && pos_idx == 0 ) /* open reverb only for the main direction */ -#else - IF( hDiracDecBin->hReverb == NULL ) -#endif { #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF @@ -10307,10 +9831,8 @@ static ivas_error ivas_masa_ext_rend_parambin_init( assert( false ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT IF( pos_idx == 0 ) /* open decorrelator only for the main direction */ { -#endif /* Always open frequency domain decorrelator */ ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, output_Fs, nBins ); @@ -10327,9 +9849,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( { return error; } -#ifdef SPLIT_REND_WITH_HEAD_ROT } -#endif /* External renderer uses constant regularization factor */ hDiracDecBin->reqularizationFactor_fx = 6554; /* 0.4f in Q14 */ move16(); @@ -10338,12 +9858,8 @@ static ivas_error ivas_masa_ext_rend_parambin_init( hDiracDecBin->phHrtfParambin = phHrtfParambin; #endif -#ifdef SPLIT_REND_WITH_HEAD_ROT inputMasa->hMasaExtRend->hDiracDecBin[pos_idx] = hDiracDecBin; } -#else - inputMasa->hMasaExtRend->hDiracDecBin = hDiracDecBin; -#endif return error; } @@ -10375,14 +9891,10 @@ static ivas_error initMasaExtRenderer( move32(); hMasaExtRend->hDirACRend = NULL; hMasaExtRend->hSpatParamRendCom = NULL; -#ifdef SPLIT_REND_WITH_HEAD_ROT for ( i = 0; i < MAX_HEAD_ROT_POSES; i++ ) { hMasaExtRend->hDiracDecBin[i] = NULL; } -#else - hMasaExtRend->hDiracDecBin = NULL; -#endif hMasaExtRend->hReverb = NULL; hMasaExtRend->hHrtfParambin = &hrtfs->hHrtfParambin; hMasaExtRend->hVBAPdata = NULL; @@ -10433,10 +9945,8 @@ static ivas_error initMasaExtRenderer( BREAK; case IVAS_AUDIO_CONFIG_BINAURAL: -#ifdef SPLIT_REND_WITH_HEAD_ROT case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM: case IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED: -#endif hMasaExtRend->renderer_type = RENDERER_BINAURAL_PARAMETRIC; move32(); BREAK; @@ -10557,7 +10067,6 @@ static void freeMasaExtRenderer( ivas_spat_hSpatParamRendCom_close_fx( &hMasaExtRend->hSpatParamRendCom ); } -#ifdef SPLIT_REND_WITH_HEAD_ROT for ( i = 0; i < MAX_HEAD_ROT_POSES; i++ ) { if ( hMasaExtRend->hDiracDecBin[i] != NULL ) @@ -10566,12 +10075,6 @@ static void freeMasaExtRenderer( } } -#else - IF( hMasaExtRend->hDiracDecBin != NULL ) - { - ivas_dirac_dec_close_binaural_data( &hMasaExtRend->hDiracDecBin ); - } -#endif IF( hMasaExtRend->hReverb != NULL ) { diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 3c897cc43..84de1e7b7 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -1073,11 +1073,7 @@ static void strip_spaces( while ( pStr[read_idx] ) { -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( !isspace( (int32_t) pStr[read_idx] ) && !iscntrl( (int32_t) pStr[read_idx] ) ) -#else - if ( !isspace( pStr[read_idx] ) && !iscntrl( pStr[read_idx] ) ) -#endif { pStr[write_idx++] = pStr[read_idx]; } @@ -1841,10 +1837,8 @@ ivas_error RenderConfigReader_read( uint32_t fgHasMethod, fgHasNBands, fgHasFreqs, fgHasDefaultGrid, fgHasStartFreq, fgHasFreqHop; uint32_t aeHasFgIdx, aeHasPredelay, aeHasRt60, aeHasDsr; uint32_t aeHasERsize, aeHasERabs; -#ifdef SPLIT_REND_WITH_HEAD_ROT bool dofProvided = false; bool poseCorrProvided = false; -#endif uint32_t nDP; uint32_t accDPIdx; @@ -2369,7 +2363,6 @@ ivas_error RenderConfigReader_read( free( pValue ); acIdx++; } -#ifdef SPLIT_REND_WITH_HEAD_ROT else if ( strcmp( chapter, "SPLITREND" ) == 0 && strlen( pParams ) != 0 ) { params_idx = 0; @@ -2502,7 +2495,6 @@ ivas_error RenderConfigReader_read( } free( pValue ); } -#endif else if ( strcmp( chapter, "DIRECTIVITYSETTING" ) == 0 && strlen( pParams ) != 0 ) { params_idx = 0; diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c index a3f9544c8..3cd2e798b 100644 --- a/lib_util/rotation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -121,7 +121,6 @@ ivas_error HeadRotationFileReading( ( headRotReader->frameCounter )++; -#ifdef SPLIT_REND_WITH_HEAD_ROT if ( w == -3.0f ) { pQuaternion->w_fx = floatToFixed_32( w, Q22 ); @@ -138,13 +137,6 @@ ivas_error HeadRotationFileReading( pQuaternion->z_fx = floatToFixed_32( z, Q31 ); pQuaternion->q_fact = Q31; } -#else - pQuaternion->w_fx = floatToFixed_32( w, Q31 ); - pQuaternion->x_fx = floatToFixed_32( x, Q31 ); - pQuaternion->y_fx = floatToFixed_32( y, Q31 ); - pQuaternion->z_fx = floatToFixed_32( z, Q31 ); - pQuaternion->q_fact = Q31; -#endif if ( pPos != NULL ) { diff --git a/lib_util/split_rend_bfi_file_reader.c b/lib_util/split_rend_bfi_file_reader.c index 4c5770f45..6b7e1acd3 100644 --- a/lib_util/split_rend_bfi_file_reader.c +++ b/lib_util/split_rend_bfi_file_reader.c @@ -33,7 +33,6 @@ #include #include "options.h" #include "split_rend_bfi_file_reader.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "prot_fx.h" @@ -159,4 +158,3 @@ const char *SplitRendBFIFileReader_getFilePath( return SplitRendBFIReader->file_path; } -#endif /* SPLIT_REND_WITH_HEAD_ROT */ diff --git a/lib_util/split_rend_bfi_file_reader.h b/lib_util/split_rend_bfi_file_reader.h index 679c424a1..0956b6b3d 100644 --- a/lib_util/split_rend_bfi_file_reader.h +++ b/lib_util/split_rend_bfi_file_reader.h @@ -34,7 +34,6 @@ #define IVAS_SR_BFI_FILE_READER_H #include "common_api_types.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT typedef struct SplitRendBFIFileReader SplitRendBFIFileReader; @@ -56,5 +55,4 @@ const char *SplitRendBFIFileReader_getFilePath( ); -#endif /* SPLIT_REND_WITH_HEAD_ROT */ #endif /* IVAS_SR_BFI_FILE_READER_H */ diff --git a/lib_util/split_render_file_read_write.c b/lib_util/split_render_file_read_write.c index c112863db..ff0aa2e1a 100644 --- a/lib_util/split_render_file_read_write.c +++ b/lib_util/split_render_file_read_write.c @@ -33,7 +33,6 @@ #include #include "options.h" #include "split_render_file_read_write.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT #include #include "prot_fx.h" @@ -420,4 +419,3 @@ ivas_error split_rend_read_pre_rend_delay_ns( return IVAS_ERR_OK; } -#endif /* SPLIT_REND_WITH_HEAD_ROT */ diff --git a/lib_util/split_render_file_read_write.h b/lib_util/split_render_file_read_write.h index 125daf94e..b6f32a317 100644 --- a/lib_util/split_render_file_read_write.h +++ b/lib_util/split_render_file_read_write.h @@ -34,7 +34,6 @@ #define SPLIT_RENDER_FILE_READ_WRITE_H #include "common_api_types.h" -#ifdef SPLIT_REND_WITH_HEAD_ROT typedef struct SplitFileReadWrite SplitFileReadWrite; @@ -91,5 +90,4 @@ ivas_error split_rend_read_pre_rend_delay_ns( SplitFileReadWrite *hSplitRendFileReadWrite, uint32_t *delay_ns ); -#endif /* SPLIT_REND_WITH_HEAD_ROT */ #endif /* SPLIT_RENDER_FILE_READ_WRITE_H */ -- GitLab From 3dc61d51fd0c2478ae69a7bd82258be9693c7bf1 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 13 Jun 2025 11:32:06 +0200 Subject: [PATCH 0898/1310] clang-format --- apps/decoder.c | 49 ++++++---------- apps/isar_post_rend.c | 22 +++---- apps/renderer.c | 37 ++++-------- lib_com/common_api_types.h | 22 +++---- lib_com/ivas_rotation_com.c | 1 - lib_com/options.h | 3 - lib_dec/ivas_binRenderer_internal_fx.c | 17 +++--- lib_dec/ivas_stat_dec.h | 1 - lib_dec/lib_dec_fx.c | 13 ++--- lib_isar/isar_lc3plus_dec.c | 3 - lib_isar/isar_lc3plus_enc.c | 4 +- lib_isar/isar_lc3plus_enc.h | 8 +-- lib_isar/isar_lc3plus_payload.c | 1 - lib_isar/isar_lcld_decoder.c | 1 - lib_isar/isar_prot.h | 17 +++--- lib_isar/isar_splitRendererPost.c | 1 - lib_isar/isar_splitRendererPre.c | 6 +- lib_isar/isar_splitRenderer_utils.c | 53 ++++++++--------- lib_isar/lib_isar_post_rend.c | 17 ++---- lib_isar/lib_isar_pre_rend.c | 11 +--- lib_rend/ivas_crend_fx.c | 19 ++---- .../ivas_dirac_dec_binaural_functions_fx.c | 22 +++---- lib_rend/ivas_output_init_fx.c | 6 +- lib_rend/ivas_reflections_fx.c | 4 +- lib_rend/ivas_rotation_fx.c | 10 ++-- lib_rend/lib_rend_fx.c | 58 +++++++++---------- lib_util/split_render_file_read_write.c | 12 ++-- lib_util/split_render_file_read_write.h | 12 ++-- 28 files changed, 172 insertions(+), 258 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index b8d4c6596..76bd23bbf 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -266,9 +266,7 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB - && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM - ) + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) { fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -368,10 +366,8 @@ int main( if ( arg.renderConfigEnabled ) { /* sanity check */ - if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB - && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM && - arg.Opt_non_diegetic_pan == 0 - ) + if ( arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED && arg.outputConfig != IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM && + arg.Opt_non_diegetic_pan == 0 ) { fprintf( stderr, "\nError: Renderer configuration file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -1547,11 +1543,11 @@ static void usage_dec( void ) *---------------------------------------------------------------------*/ static ivas_error initOnFirstGoodFrame( - IVAS_DEC_HANDLE hIvasDec, /* i/o: */ - const DecArguments arg, /* i : */ - const int16_t numInitialBadFrames, /* i : */ - int16_t *numOutSamples, /* i/o: */ - int16_t *vec_pos_len, /* i/o: */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: */ + const DecArguments arg, /* i : */ + const int16_t numInitialBadFrames, /* i : */ + int16_t *numOutSamples, /* i/o: */ + int16_t *vec_pos_len, /* i/o: */ int16_t *pFullDelayNumSamples, /* o : */ int16_t *pRemainingDelayNumSamples, /* o : */ int32_t *delayTimeScale, /* o : */ @@ -1560,9 +1556,8 @@ static ivas_error initOnFirstGoodFrame( MasaFileWriter **ppMasaWriter, /* o : */ IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], /* o : */ int16_t *pNumOutChannels, /* o : */ - uint16_t *pNumObj, /* o : */ - SplitFileReadWrite **splitRendWriter -) + uint16_t *pNumObj, /* o : */ + SplitFileReadWrite **splitRendWriter ) { ivas_error error = IVAS_ERR_UNKNOWN; @@ -1619,10 +1614,8 @@ static ivas_error initOnFirstGoodFrame( &splitRendCodec, &poseCorrection, &splitRendIsarFrameSizeMs, - &splitRendCodecFrameSizeMs - , - &lc3plusHighRes - ) ) != IVAS_ERR_OK ) + &splitRendCodecFrameSizeMs, + &lc3plusHighRes ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to get split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); return error; @@ -1636,12 +1629,10 @@ static ivas_error initOnFirstGoodFrame( delayTimeScale_temp, splitRendCodec, poseCorrection, - splitRendCodecFrameSizeMs - , + splitRendCodecFrameSizeMs, splitRendIsarFrameSizeMs, arg.output_Fs, - lc3plusHighRes - ) ) != IVAS_ERR_OK ) + lc3plusHighRes ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to open output split rendering metadata file %s\n", arg.outputWavFilename ); return error; @@ -1661,12 +1652,10 @@ static ivas_error initOnFirstGoodFrame( delayTimeScale_temp, splitRendCodec, poseCorrection, - splitRendCodecFrameSizeMs - , + splitRendCodecFrameSizeMs, splitRendIsarFrameSizeMs, arg.output_Fs, - lc3plusHighRes - ) ) != IVAS_ERR_OK ) + lc3plusHighRes ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to open output split rendering metadata file %s\n", arg.outputWavFilename ); return error; @@ -2676,10 +2665,8 @@ static ivas_error decodeVoIP( for ( i = 0; i < num_subframes; i++ ) { - if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i - , - DEFAULT_AXIS - ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions[i], Pos[i], i, + DEFAULT_AXIS ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c index e7fd6a05a..4b478f7c2 100644 --- a/apps/isar_post_rend.c +++ b/apps/isar_post_rend.c @@ -758,12 +758,10 @@ int main( args.inMetadataFilePaths[0], &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, - &bitsBuffer.config.codec_frame_size_ms - , + &bitsBuffer.config.codec_frame_size_ms, &bitsBuffer.config.isar_frame_size_ms, &inFileSampleRate, - &bitsBuffer.config.lc3plusHighRes - ); + &bitsBuffer.config.lc3plusHighRes ); if ( error != IVAS_ERR_OK ) { fprintf( stderr, "Could not open split rend metadata file %s\n", args.inMetadataFilePaths[0] ); @@ -784,12 +782,10 @@ int main( args.inputFilePath, &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, - &bitsBuffer.config.codec_frame_size_ms - , + &bitsBuffer.config.codec_frame_size_ms, &bitsBuffer.config.isar_frame_size_ms, &inFileSampleRate, - &bitsBuffer.config.lc3plusHighRes - ); + &bitsBuffer.config.lc3plusHighRes ); if ( error != IVAS_ERR_OK ) { fprintf( stderr, "Could not open split rend metadata file %s\n", args.inputFilePath ); @@ -802,8 +798,7 @@ int main( { error = AudioFileReader_getSamplingRate( audioReader, &inFileSampleRate ); } - else - if ( hSplitRendFileReadWrite == NULL ) + else if ( hSplitRendFileReadWrite == NULL ) { inFileSampleRate = args.sampleRate; } @@ -865,11 +860,9 @@ int main( if ( ( error = ISAR_REND_SetSplitRendBitstreamHeader( hIsarPostRend, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, - bitsBuffer.config.codec_frame_size_ms - , + bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, - bitsBuffer.config.lc3plusHighRes - ) ) != IVAS_ERR_OK ) + bitsBuffer.config.lc3plusHighRes ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in getting split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1230,4 +1223,3 @@ int main( #undef WMC_TOOL_SKIP - diff --git a/apps/renderer.c b/apps/renderer.c index 5ef8cca19..8d7cb86c9 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -431,8 +431,7 @@ static void convertOutputBuffer_fx( Word16 *intBuffer, const Word16 cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbSyn, - Word16 out_q -); + Word16 out_q ); static void convertInputBuffer_fx( const Word16 *intBuffer, const Word16 numIntSamplesPerChannel, @@ -442,8 +441,7 @@ static void convertInputBuffer_fx( Word16 in_q_factor, const int16_t cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbAna, - Word16 *out_q_factor -); + Word16 *out_q_factor ); /*------------------------------------------------------------------------------------------* @@ -1499,10 +1497,8 @@ int main( IVAS_REND_GetSplitRendBitstreamHeader( hIvasRend, &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, - &bitsBuffer.config.codec_frame_size_ms - , - &bitsBuffer.config.isar_frame_size_ms - ); + &bitsBuffer.config.codec_frame_size_ms, + &bitsBuffer.config.isar_frame_size_ms ); if ( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK ) { @@ -1516,12 +1512,10 @@ int main( delayTimeScale_temp, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, - bitsBuffer.config.codec_frame_size_ms - , + bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, args.sampleRate, - bitsBuffer.config.lc3plus_highres - ) ) != IVAS_ERR_OK ) + bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Could not open split rend metadata file %s\n", args.outputFilePath ); exit( -1 ); @@ -1536,10 +1530,8 @@ int main( IVAS_REND_GetSplitRendBitstreamHeader( hIvasRend, &bitsBuffer.config.codec, &bitsBuffer.config.poseCorrection, - &bitsBuffer.config.codec_frame_size_ms - , - &bitsBuffer.config.isar_frame_size_ms - ); + &bitsBuffer.config.codec_frame_size_ms, + &bitsBuffer.config.isar_frame_size_ms ); if ( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK ) { @@ -1553,12 +1545,10 @@ int main( delayTimeScale_temp, bitsBuffer.config.codec, bitsBuffer.config.poseCorrection, - bitsBuffer.config.codec_frame_size_ms - , + bitsBuffer.config.codec_frame_size_ms, bitsBuffer.config.isar_frame_size_ms, args.sampleRate, - bitsBuffer.config.lc3plus_highres - ) ) != IVAS_ERR_OK ) + bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Could not open split rend metadata file %s\n", args.outMetadataFilePath ); exit( -1 ); @@ -1962,7 +1952,6 @@ int main( { delayNumSamples -= (int16_t) ( outBufferSize / num_out_channels ); } - } bitsBuffer.config.bitsRead = 0; @@ -3878,8 +3867,7 @@ static void convertInputBuffer_fx( Word16 in_q_factor, const int16_t cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbAna, - Word16 *out_q_factor -) + Word16 *out_q_factor ) { Word16 chnl, smpl, i; @@ -3962,8 +3950,7 @@ static void convertOutputBuffer_fx( Word16 *intBuffer, const Word16 cldfb_in_flag, IVAS_CLDFB_FILTER_BANK_HANDLE *cldfbSyn, - Word16 out_q -) + Word16 out_q ) { Word16 chnl, smpl, i; Word32 temp_fx; diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index bb6351711..175b23c3b 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -282,17 +282,17 @@ typedef struct _ISAR_SPLIT_REND_BITS_DATA typedef struct _ISAR_SPLIT_REND_CONFIG { - int32_t splitRendBitRate; /*Bit rate for split rendering mode, if "pcm_out" is set then "splitRendBitRate" is used as a limit for MD bitrate */ - int16_t hq_mode; /*High quality 3DOF mode with additional side information. Requires more pre-renditions. */ - int16_t dof; /*flag to specify if pose correction is needed for 1, 2 or 3 degree of freedoms*/ - /*The axis can be set dynamically per frame based on a file input */ - /*possible values: - 1 - (1dof correction. By default YAW correction) - 2 - (2dof correction. By default YAW and PITCH correction) - 3 - (3dof correction. By default YAW, PITCH and ROLL correction) - */ - int16_t codec_delay_ms; /*PLACEHOLDER (currently being ignored) : look ahead delay of the codec that is used to code BIN signal output of pre-renderer*/ - int16_t isar_frame_size_ms; /* ISAR bit stream frame size in milliseconds */ + int32_t splitRendBitRate; /*Bit rate for split rendering mode, if "pcm_out" is set then "splitRendBitRate" is used as a limit for MD bitrate */ + int16_t hq_mode; /*High quality 3DOF mode with additional side information. Requires more pre-renditions. */ + int16_t dof; /*flag to specify if pose correction is needed for 1, 2 or 3 degree of freedoms*/ + /*The axis can be set dynamically per frame based on a file input */ + /*possible values: + 1 - (1dof correction. By default YAW correction) + 2 - (2dof correction. By default YAW and PITCH correction) + 3 - (3dof correction. By default YAW, PITCH and ROLL correction) + */ + int16_t codec_delay_ms; /*PLACEHOLDER (currently being ignored) : look ahead delay of the codec that is used to code BIN signal output of pre-renderer*/ + int16_t isar_frame_size_ms; /* ISAR bit stream frame size in milliseconds */ int16_t codec_frame_size_ms; /* Codec frame size in milliseconds, only relevant with LC3plus */ ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode; ISAR_SPLIT_REND_CODEC codec; diff --git a/lib_com/ivas_rotation_com.c b/lib_com/ivas_rotation_com.c index f25c796d4..78a0837ab 100644 --- a/lib_com/ivas_rotation_com.c +++ b/lib_com/ivas_rotation_com.c @@ -78,7 +78,6 @@ void Euler2Quat_fx( } - /*------------------------------------------------------------------------- * Copy_Quat_fx() * diff --git a/lib_com/options.h b/lib_com/options.h index 4574f38d4..3c1820254 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,7 +106,6 @@ #define FIX_1372_ISAR_POST_REND #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ - //#define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ @@ -118,11 +117,9 @@ #define FIX_OLD_BINARY_FILE /* Orange: current hrtf binary file in ref branch contains wrong values for fastconv value. This switch can be activated to compre running codec with and without hrtf file*/ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ #define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ - #endif //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ - #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index db871d9cb..b37b9bd6d 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -61,8 +61,8 @@ static void ivas_binRenderer_filterModule_fx( Word32 CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals Q_curr*/ Word32 CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals Q_curr*/ const Word16 numTimeSlots, /* i : number of time slots to process */ - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ - const Word16 pos_idx, /* i : pose index */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ + const Word16 pos_idx, /* i : pose index */ Word16 Q_curr ) { Word16 bandIdx, k, chIdx, tapIdx; @@ -177,8 +177,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( const Word16 isLoudspeaker, const AUDIO_CONFIG input_config, const HRTFS_FASTCONV_HANDLE hHrtf, - const Word16 num_poses -) + const Word16 num_poses ) { Word16 bandIdx, chIdx; Word16 pos_idx; @@ -1672,13 +1671,13 @@ void ivas_binaural_add_LFE_fx( void ivas_binRenderer_fx( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ const MULTI_BIN_REND_POSE_DATA *pMultiBinPoseData, - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ - const Word16 numTimeSlots, /* i : number of time slots to render */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle*/ + const Word16 numTimeSlots, /* i : number of time slots to render */ Word32 Cldfb_RealBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ Word32 Cldfb_ImagBuffer_Binaural_fx[][BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Rotated Binaural signals */ - Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ - Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ - Word16 *Q_in /* i : LS signals exp */ + Word32 RealBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ + Word32 ImagBuffer_fx[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals Q_in*/ + Word16 *Q_in /* i : LS signals exp */ ) { Word16 chIdx, i, j, k; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index d7736e244..db23485b8 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -861,7 +861,6 @@ typedef struct renderer_struct } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; - /*----------------------------------------------------------------------------------* * IVAS decoder specific ISAR wrapper structures *----------------------------------------------------------------------------------*/ diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index dd5db0071..551a20c0f 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2205,9 +2205,9 @@ ivas_error IVAS_DEC_GetMasaMetadata( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_FeedHeadTrackData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ - IVAS_VECTOR3 Pos, /* i : listener position */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION orientation, /* i : head-tracking data, listener orientation */ + IVAS_VECTOR3 Pos, /* i : listener position */ const Word16 subframe_idx, /* i : subframe index */ const ISAR_SPLIT_REND_ROT_AXIS rot_axis /* i : external control for rotation axis for split rendering */ ) @@ -4039,11 +4039,10 @@ IVAS_DEC_GetSplitRendBitstreamHeader( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ ISAR_SPLIT_REND_CODEC *pCodec, /* o: pointer to codec setting */ ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, /* o: pointer to pose correction mode */ - Word16 *pIsar_frame_size_ms, /* o: pointer to isar frame size setting */ - Word16 *pCodec_frame_size_ms /* o: pointer to codec frame size setting */ + Word16 *pIsar_frame_size_ms, /* o: pointer to isar frame size setting */ + Word16 *pCodec_frame_size_ms /* o: pointer to codec frame size setting */ , - Word16 *pLc3plusHighRes -) + Word16 *pLc3plusHighRes ) { if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { diff --git a/lib_isar/isar_lc3plus_dec.c b/lib_isar/isar_lc3plus_dec.c index ea19833ba..38371d134 100644 --- a/lib_isar/isar_lc3plus_dec.c +++ b/lib_isar/isar_lc3plus_dec.c @@ -41,8 +41,6 @@ #include "wmc_auto.h" - - /*------------------------------------------------------------------------- * ISAR_LC3PLUS_DEC_Open() * @@ -197,7 +195,6 @@ ivas_error ISAR_LC3PLUS_DEC_Open( } - /*------------------------------------------------------------------------- * ISAR_LC3PLUS_DEC_GetDelay() * diff --git a/lib_isar/isar_lc3plus_enc.c b/lib_isar/isar_lc3plus_enc.c index 467db9116..7b11084af 100644 --- a/lib_isar/isar_lc3plus_enc.c +++ b/lib_isar/isar_lc3plus_enc.c @@ -505,8 +505,8 @@ void ISAR_LC3PLUS_ENC_Close( * *-------------------------------------------------------------------*/ ivas_error ISAR_LC3PLUS_ENC_Encode( - ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ - Word32 **pcm_in, /* i : pointer input samples */ + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + Word32 **pcm_in, /* i : pointer input samples */ void *bitstream_out, /* o : pointer to bitstream frame */ const Word32 bitstream_out_size, /* i : size of the bitstream_out buffer in bytes. Must be equal to ISAR_LC3PLUS_ENC_GetOutputBitstreamSize. */ Word16 q_in[16] ) diff --git a/lib_isar/isar_lc3plus_enc.h b/lib_isar/isar_lc3plus_enc.h index eeef615fc..f0c37afc8 100644 --- a/lib_isar/isar_lc3plus_enc.h +++ b/lib_isar/isar_lc3plus_enc.h @@ -54,9 +54,9 @@ typedef struct ISAR_LC3PLUS_ENC_HANDLE } * ISAR_LC3PLUS_ENC_HANDLE; ivas_error ISAR_LC3PLUS_ENC_Open( - const LC3PLUS_CONFIG config, /* i : encoder configuration */ + const LC3PLUS_CONFIG config, /* i : encoder configuration */ const uint32_t initialBitsPerSecond, /* i : initial target bit rate */ - ISAR_LC3PLUS_ENC_HANDLE *handle /* o : LC3plus encoder handle */ + ISAR_LC3PLUS_ENC_HANDLE *handle /* o : LC3plus encoder handle */ ); ivas_error IVAS_LC3PLUS_ENC_SetBitrate( @@ -79,8 +79,8 @@ void ISAR_LC3PLUS_ENC_Close( ); ivas_error ISAR_LC3PLUS_ENC_Encode( - ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ - Word32 **pcm_in, /* i : pointer input samples */ + ISAR_LC3PLUS_ENC_HANDLE handle, /* i : LC3plus encoder handle */ + Word32 **pcm_in, /* i : pointer input samples */ void *bitstream_out, /* o : pointer to bitstream frame */ const Word32 bitstream_out_size, /* i : size of the bitstream_out buffer in bytes. Must be equal to ISAR_LC3PLUS_ENC_GetOutputBitstreamSize. */ Word16 q_in[16] ); diff --git a/lib_isar/isar_lc3plus_payload.c b/lib_isar/isar_lc3plus_payload.c index 291cd9d05..2493aa6a3 100644 --- a/lib_isar/isar_lc3plus_payload.c +++ b/lib_isar/isar_lc3plus_payload.c @@ -816,4 +816,3 @@ LC3PLUS_RTP_ERR LC3PLUS_RTP_ftd_fdi_from_frame_duration_us( LC3PLUS_RTP_FTD_FDI return LC3PLUS_RTP_ERR_INVALID_PARAMETERS; } - diff --git a/lib_isar/isar_lcld_decoder.c b/lib_isar/isar_lcld_decoder.c index 83f6261ee..ce517a492 100644 --- a/lib_isar/isar_lcld_decoder.c +++ b/lib_isar/isar_lcld_decoder.c @@ -1990,4 +1990,3 @@ static void ComputeAllocation( return; } - diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index 6e8bcaf9f..112ee1155 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -199,8 +199,7 @@ void isar_split_rend_get_quant_params_fx( Word16 pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], Word16 pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], const Word16 ro_flag, - Word16 *num_quant_strats -); + Word16 *num_quant_strats ); void isar_split_rend_get_quant_params( const int16_t num_md_bands, @@ -320,7 +319,6 @@ void isar_set_split_rend_ht_setup_fx( Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3] ); - ivas_error isar_split_rend_validate_config( const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const Word16 is_pcm_out ); @@ -347,11 +345,11 @@ Word32 isar_get_split_rend_md_target_brate( ivas_error isar_split_rend_choose_default_codec( ISAR_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ - Word16 *pIsar_frame_size_ms, /* i/o: pointer to isar frame size setting */ - Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ - const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ - const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ - const Word16 num_subframes /* i : number of subframes */ + Word16 *pIsar_frame_size_ms, /* i/o: pointer to isar frame size setting */ + Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ + const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ + const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ + const Word16 num_subframes /* i : number of subframes */ ); void ISAR_SPLIT_REND_BITStream_init( @@ -379,8 +377,7 @@ ivas_error split_renderer_open_lc3plus( SPLIT_REND_WRAPPER *hSplitRendWrapper, const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const Word32 OutSampleRate, - const IVAS_RENDER_FRAMESIZE ivas_frame_size -); + const IVAS_RENDER_FRAMESIZE ivas_frame_size ); ISAR_POST_REND_AudioConfigType isar_getAudioConfigType( const IVAS_AUDIO_CONFIG config ); diff --git a/lib_isar/isar_splitRendererPost.c b/lib_isar/isar_splitRendererPost.c index 085cae9fc..b1cf6659b 100644 --- a/lib_isar/isar_splitRendererPost.c +++ b/lib_isar/isar_splitRendererPost.c @@ -1957,4 +1957,3 @@ void isar_init_split_post_rend_handles( return; } - diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index 5447aea1e..b30f25ca7 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -1208,8 +1208,6 @@ static void ComputeCoeffs_fx( hMd->pred_mat_re2[i] = gd_tmp_fx[i]; set32_fx( hMd->pred_mat_im_fx[i], 0, BINAURAL_CHANNELS ); } - - } ELSE { @@ -2678,8 +2676,7 @@ ivas_error split_renderer_open_lc3plus( SPLIT_REND_WRAPPER *hSplitRendWrapper, const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const Word32 OutSampleRate, - const IVAS_RENDER_FRAMESIZE isar_frame_size -) + const IVAS_RENDER_FRAMESIZE isar_frame_size ) { ivas_error error; Word16 i, delayBufferLength; @@ -3135,4 +3132,3 @@ void lc3plusTimeAlignCldfbPoseCorr( return; } - diff --git a/lib_isar/isar_splitRenderer_utils.c b/lib_isar/isar_splitRenderer_utils.c index bfdb1454f..62f3870d3 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -819,26 +819,30 @@ ivas_error isar_split_rend_validate_config( } ELSE { - IF( EQ_16( pSplitRendConfig->dof, 1 ) ){ - IF( LT_32( pSplitRendConfig->splitRendBitRate, 34000 ) ){ + IF( EQ_16( pSplitRendConfig->dof, 1 ) ) + { + IF( LT_32( pSplitRendConfig->splitRendBitRate, 34000 ) ) + { return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "1DOF metadata needs atleast 34 kbps" ); + } + } + ELSE IF( EQ_16( pSplitRendConfig->dof, 2 ) ) + { + IF( LT_32( pSplitRendConfig->splitRendBitRate, 50000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "2DOF metadata needs atleast 50 kbps" ); + } + } + ELSE IF( EQ_16( pSplitRendConfig->dof, 3 ) ) + { + IF( LT_32( pSplitRendConfig->splitRendBitRate, 82000 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "3DOF metadata needs atleast 128 kbps" ); + } + } } -} -ELSE IF( EQ_16( pSplitRendConfig->dof, 2 ) ){ - IF( LT_32( pSplitRendConfig->splitRendBitRate, 50000 ) ){ - return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "2DOF metadata needs atleast 50 kbps" ); -} -} -ELSE IF( EQ_16( pSplitRendConfig->dof, 3 ) ) -{ - IF( LT_32( pSplitRendConfig->splitRendBitRate, 82000 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_SPLIT_REND_CONFIG, "3DOF metadata needs atleast 128 kbps" ); - } -} -} -return IVAS_ERR_OK; + return IVAS_ERR_OK; } @@ -860,8 +864,7 @@ void isar_split_rend_get_quant_params_fx( Word16 pred_real_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], Word16 pred_imag_bands_roll[ISAR_SPLIT_REND_NUM_QUANT_STRATS], const Word16 ro_flag, - Word16 *num_quant_strats -) + Word16 *num_quant_strats ) { Word16 q; @@ -1298,11 +1301,11 @@ ivas_error isar_framesize_to_ms( ivas_error isar_split_rend_choose_default_codec( ISAR_SPLIT_REND_CODEC *pCodec, /* i/o: pointer to codec setting */ - int16_t *pIsar_frame_size_ms, /* i/o: pointer to isar frame size setting */ - Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ - const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ - const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ - const Word16 num_subframes /* i : number of subframes */ + int16_t *pIsar_frame_size_ms, /* i/o: pointer to isar frame size setting */ + Word16 *pCodec_frame_size_ms, /* i/o: pointer to codec frame size setting */ + const Word16 cldfb_in_flag, /* i : flag indicating rendering in TD */ + const Word16 pcm_out_flag, /* i : flag to indicate PCM output */ + const Word16 num_subframes /* i : number of subframes */ ) { IF( EQ_16( pcm_out_flag, 0 ) ) @@ -1355,5 +1358,3 @@ Word32 get_bit( { return L_and( state, ( L_shl( 1, (Word16) bit_id ) ) ); } - - diff --git a/lib_isar/lib_isar_post_rend.c b/lib_isar/lib_isar_post_rend.c index 8ad605f40..c784ed1a9 100644 --- a/lib_isar/lib_isar_post_rend.c +++ b/lib_isar/lib_isar_post_rend.c @@ -464,8 +464,7 @@ static ivas_error getRendInputNumChannels( static ivas_error updateSplitPostRendPanGains( input_split_post_rend *inputSplitPostRend, const AUDIO_CONFIG outConfig, - ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg -) + ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg ) { ivas_error error; rendering_context rendCtx; @@ -524,8 +523,7 @@ static ivas_error setRendInputActiveSplitPostRend( void *input, const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, - ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg -) + ISAR_SPLIT_REND_CONFIG_DATA *hRendCfg ) { ivas_error error; rendering_context rendCtx; @@ -545,8 +543,7 @@ static ivas_error setRendInputActiveSplitPostRend( inputSplitPostRend->numCachedSamples = 0; - if ( ( error = updateSplitPostRendPanGains( inputSplitPostRend, outConfig, hRendCfg - ) ) != IVAS_ERR_OK ) + if ( ( error = updateSplitPostRendPanGains( inputSplitPostRend, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) { return error; } @@ -872,8 +869,7 @@ ivas_error ISAR_POST_REND_AddInput( Word32 maxNumInputsOfType; void *inputsArray; Word32 inputStructSize; - ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, ISAR_SPLIT_REND_CONFIG_DATA * - ); + ivas_error ( *activateInput )( void *, AUDIO_CONFIG, IVAS_REND_InputId, ISAR_SPLIT_REND_CONFIG_DATA * ); Word32 inputIndex; /* Validate function arguments */ @@ -901,8 +897,7 @@ ivas_error ISAR_POST_REND_AddInput( } *inputId = makeInputId( inConfig, inputIndex ); - if ( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, &hIvasRend->splitRenderConfig - ) ) != IVAS_ERR_OK ) + if ( ( error = activateInput( (uint8_t *) inputsArray + inputStructSize * inputIndex, inConfig, *inputId, &hIvasRend->splitRenderConfig ) ) != IVAS_ERR_OK ) { return error; } @@ -1812,5 +1807,3 @@ int32_t ISAR_POST_REND_GetCntFramesLimited( return hIvasRend->hLimiter->cnt_frames_limited; } #endif - - diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 32773ef7a..13ae12ac6 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -47,7 +47,6 @@ #include "wmc_auto.h" - /*-------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------*/ @@ -87,9 +86,7 @@ ivas_error ISAR_PRE_REND_open( &pSplitRendConfig->isar_frame_size_ms, &pSplitRendConfig->codec_frame_size_ms, cldfb_in_flag_local, - pcm_out_flag, (int16_t) - ivas_frame_size - ) ) != IVAS_ERR_OK ) + pcm_out_flag, (int16_t) ivas_frame_size ) ) != IVAS_ERR_OK ) { return error; } @@ -175,8 +172,7 @@ ivas_error ISAR_PRE_REND_open( IF( EQ_16( pSplitRendConfig->codec, ISAR_SPLIT_REND_CODEC_LC3PLUS ) ) { if ( ( error = split_renderer_open_lc3plus( hSplitRendWrapper, pSplitRendConfig, OutSampleRate, - ivas_frame_size - ) ) != IVAS_ERR_OK ) + ivas_frame_size ) ) != IVAS_ERR_OK ) { return error; } @@ -481,7 +477,7 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( #ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, 0, 0, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1 #else - cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, 0, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1 + cldfbSynthesis_ivas_fx( Cldfb_In_BinReal_p_fx, Cldfb_In_BinImag_p_fx, pOutput_fx[ch], hSplitBin->hCldfbHandles->cldfbSyn[0]->no_channels * num_slots, 0, hSplitBin->hCldfbHandles->cldfbSyn[ch] ); // Q_cldfb - 1 #endif Q_out[ch] = sub( Q_cldfb, 1 ); move16(); @@ -592,4 +588,3 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( fclose(fp1);*/ return error; } - diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index bf27912f7..369a1d2b4 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -206,9 +206,7 @@ static ivas_error ivas_rend_initCrend_fx( test(); test(); - if ( NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) - ) + if ( NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) && NE_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" ); } @@ -1564,8 +1562,7 @@ static ivas_error ivas_er_init_handle( ivas_error ivas_rend_initCrendWrapper( CREND_WRAPPER_HANDLE *pCrend, - const int16_t num_poses -) + const int16_t num_poses ) { Word16 i; CREND_HANDLE hCrend; @@ -1681,8 +1678,7 @@ ivas_error ivas_rend_openCrend( HRTFS_STATISTICS_HANDLE hHrtfStatistics, #endif const Word32 output_Fs, - const Word16 num_poses -) + const Word16 num_poses ) { Word16 i, subframe_length; Word32 max_total_ir_len; @@ -1910,8 +1906,7 @@ ivas_error ivas_rend_openCrend( void ivas_rend_closeCrend( CREND_WRAPPER_HANDLE *pCrend, - const Word16 num_poses -) + const Word16 num_poses ) { Word16 i; Word16 pos_idx; @@ -2069,8 +2064,7 @@ static ivas_error ivas_rend_crendConvolver( Word32 *pcm_out[], // Qx const Word32 output_Fs, const Word16 i_ts, - const Word16 pos_idx -) + const Word16 pos_idx ) { Word16 i, j, k, m; Word16 subframe_length, idx_in; @@ -2332,8 +2326,7 @@ ivas_error ivas_rend_crendProcessSubframe( const Word16 n_samples_to_render, /* i : output frame length per channel */ const Word32 output_Fs /* i : output sampling rate */ , - const Word16 pos_idx -) + const Word16 pos_idx ) { Word16 subframe_idx, subframe_len; Word16 nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 1fb026078..a1d3a4908 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -299,7 +299,7 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #else - Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); + Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #endif hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); @@ -322,8 +322,8 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes_fx, st_ivas->hHrtfParambin->parametricReverberationEneCorrections_fx ) ) != IVAS_ERR_OK ) #endif #else - /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ - if ( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) + /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ + if ( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) #endif { return error; @@ -2062,7 +2062,6 @@ static void ivas_dirac_dec_binaural_formulate_target_covariance_matrices_fx( } - static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( DIRAC_DEC_BIN_HANDLE hDiracDecBin, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, @@ -2693,8 +2692,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( const Word16 numInChannels, const Word16 processReverb, const Word16 subframe, - const Word16 q_mat - , + const Word16 q_mat, Word32 outRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 outIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 reverbRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], @@ -2702,8 +2700,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word32 decorrRe_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word32 decorrIm_fx[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], Word16 *Q_inp_mix, - const Word8 recompute -) + const Word8 recompute ) { Word16 slot, bin, chA, chB; Word16 nBins; @@ -5526,8 +5523,7 @@ static void ivas_masa_ext_rend_parambin_internal_fx( const Word16 subframe, const SPLIT_REND_WRAPPER *hSplitRendWrapper, Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] -) + Word32 Cldfb_Out_Imag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; @@ -5885,9 +5881,9 @@ static void ivas_masa_ext_rend_parambin_internal_fx( } void ivas_masa_ext_rend_parambin_render_fx( - MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ - Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ + MASA_EXT_REND_HANDLE hMasaExtRend, /* i/o: MASA ext rend structure */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ + Word32 *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output Q11*/ const Word16 num_subframes, /* i : number of subframes to render */ const SPLIT_REND_WRAPPER *hSplitRendWrapper, /* i : split rendering orientation data */ Word32 Cldfb_Out_Real[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : rendered orientations for split rend. real part of cldfb */ diff --git a/lib_rend/ivas_output_init_fx.c b/lib_rend/ivas_output_init_fx.c index f33ace930..5c19acb5f 100644 --- a/lib_rend/ivas_output_init_fx.c +++ b/lib_rend/ivas_output_init_fx.c @@ -374,10 +374,8 @@ Word16 ivas_get_nchan_buffers_dec( { nchan_out_buff = s_max( nchan_out_buff, add( st_ivas->hOutSetup.nchan_out_woLFE, st_ivas->hOutSetup.num_lfe ) ); } - ELSE if ( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) - || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || - EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) - ) + ELSE if ( EQ_32( output_config, IVAS_AUDIO_CONFIG_STEREO ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || + EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { nchan_out_buff = shl( CPE_CHANNELS, 1 ); } diff --git a/lib_rend/ivas_reflections_fx.c b/lib_rend/ivas_reflections_fx.c index 44eff1329..6bd0ed87c 100644 --- a/lib_rend/ivas_reflections_fx.c +++ b/lib_rend/ivas_reflections_fx.c @@ -338,8 +338,8 @@ ivas_error ivas_er_encoder_init( p_y_fx = reflections->shoebox_data.az_angle.data_fx[i]; // Q23 move32(); move32(); - p_x_fx = L_shr( p_x_fx, 1 ); // Q22 - p_y_fx = L_shr( p_y_fx, 1 ); // Q22 + p_x_fx = L_shr( p_x_fx, 1 ); // Q22 + p_y_fx = L_shr( p_y_fx, 1 ); // Q22 rad_el_angle = deg2rad_fx( p_x_fx ); // Q22 rad_az_angle = deg2rad_fx( p_y_fx ); // Q22 diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index dc73967cc..2fe95f151 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1353,8 +1353,8 @@ ivas_error ivas_combined_orientation_open( move32(); ( *hCombinedOrientationData )->interpolationIncrement_fx = ONE_IN_Q30; // Q30 move32(); - ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; - move16(); + ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; + move16(); ( *hCombinedOrientationData )->lrSwitchedNext = 0; move16(); ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; @@ -1533,9 +1533,9 @@ ivas_error combine_external_and_head_orientations_rend( * NOTE that the external orientations are inversed. *------------------------------------------------------------------------*/ ivas_error combine_external_and_head_orientations( - IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ - IVAS_VECTOR3 *listenerPos, /* i : listener position */ - ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis, /* i : split rend pose prediction axis */ + IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ + IVAS_VECTOR3 *listenerPos, /* i : listener position */ + ISAR_SPLIT_REND_ROT_AXIS sr_pose_pred_axis, /* i : split rend pose prediction axis */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 1d019b675..2b0f1bdea 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -635,31 +635,33 @@ IVAS_REND_AudioConfigType getAudioConfigType( static ivas_error validateOutputSampleRate( const Word32 sampleRate, - const AUDIO_CONFIG outConfig ){ + const AUDIO_CONFIG outConfig ) +{ - IF( NE_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ){ + IF( NE_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) + { /* If no binaural rendering, any sampling rate is supported */ return IVAS_ERR_OK; -} -ELSE IF( ( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && NE_32( sampleRate, 48000 ) ) -{ - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); -} -ELSE -{ - - /* Otherwise rendering to binaural, support the same set as IVAS decoder */ - SWITCH( sampleRate ) + } + ELSE IF( ( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) && NE_32( sampleRate, 48000 ) ) { - case 8000: - case 16000: - case 32000: - case 48000: - return IVAS_ERR_OK; + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Error: Only 48kHz output sampling rate is supported for split rendering." ); } + ELSE + { - return IVAS_ERR_INVALID_SAMPLING_RATE; -} + /* Otherwise rendering to binaural, support the same set as IVAS decoder */ + SWITCH( sampleRate ) + { + case 8000: + case 16000: + case 32000: + case 48000: + return IVAS_ERR_OK; + } + + return IVAS_ERR_INVALID_SAMPLING_RATE; + } } /*-------------------------------------------------------------------* * getAudioConfigNumChannels() @@ -3953,7 +3955,6 @@ static ivas_error ivas_pre_rend_init( } - /*-------------------------------------------------------------------* * IVAS_REND_AddInput() * @@ -4875,11 +4876,11 @@ Word16 IVAS_REND_FeedRenderConfig( * *-------------------------------------------------------------------*/ ivas_error IVAS_REND_SetHeadRotation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ - const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_QUATERNION headRot, /* i : head orientations for next rendering call */ + const IVAS_VECTOR3 Pos, /* i : listener positions for next rendering call */ const ISAR_SPLIT_REND_ROT_AXIS rot_axis, /* i : external control for rotation axis for split rendering */ - const Word16 sf_idx /* i : subframe index */ + const Word16 sf_idx /* i : subframe index */ ) { Word16 i; @@ -7369,7 +7370,6 @@ static void renderSbaToSba( } - static ivas_error renderSbaToMultiBinaural( input_sba *sbaInput, const AUDIO_CONFIG outConfig, @@ -9660,7 +9660,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( const RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration data handle */ HRTFS_STATISTICS_HANDLE hHrtfStatistics /* i : HRTF statistics */ #else - input_masa *inputMasa /* i/o: MASA external renderer structure */ + input_masa *inputMasa /* i/o: MASA external renderer structure */ #endif ) { @@ -9795,7 +9795,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF Copy32( ( *phHrtfParambin )->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #else - Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); + Copy32( hHrtfParambin->parametricEarlyPartEneCorrection_fx, hDiracDecBin->earlyPartEneCorrection_fx, nBins ); #endif hDiracDecBin->q_earlyPartEneCorrection = Q28; move16(); @@ -9809,8 +9809,8 @@ static ivas_error ivas_masa_ext_rend_parambin_init( IF( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes_fx, hHrtfParambin->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #endif #else - /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) + /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ + IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) #endif { return error; diff --git a/lib_util/split_render_file_read_write.c b/lib_util/split_render_file_read_write.c index ff0aa2e1a..43c68cba5 100644 --- a/lib_util/split_render_file_read_write.c +++ b/lib_util/split_render_file_read_write.c @@ -65,12 +65,10 @@ ivas_error split_rend_reader_open( char *filename, ISAR_SPLIT_REND_CODEC *codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, - int16_t *codec_frame_size_ms - , + int16_t *codec_frame_size_ms, int16_t *isar_frame_size_ms, int32_t *sampling_rate, - int16_t *lc3plus_highres -) + int16_t *lc3plus_highres ) { SplitFileReadWrite *hSplitRendFileReadWrite; size_t header_len, h; @@ -157,12 +155,10 @@ ivas_error split_rend_writer_open( const int32_t delayTimeScale, ISAR_SPLIT_REND_CODEC codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, - int16_t codec_frame_size_ms - , + int16_t codec_frame_size_ms, const int16_t isar_frame_size_ms, const int32_t sampling_rate, - const int16_t lc3plus_highres -) + const int16_t lc3plus_highres ) { SplitFileReadWrite *hSplitRendFileReadWrite; size_t header_len, h; diff --git a/lib_util/split_render_file_read_write.h b/lib_util/split_render_file_read_write.h index b6f32a317..2895dd426 100644 --- a/lib_util/split_render_file_read_write.h +++ b/lib_util/split_render_file_read_write.h @@ -43,12 +43,10 @@ ivas_error split_rend_reader_open( char *filename, ISAR_SPLIT_REND_CODEC *codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE *poseCorrection, - int16_t *codec_frame_size_ms - , + int16_t *codec_frame_size_ms, int16_t *isar_frame_size_ms, int32_t *sampling_rate, - int16_t *lc3plus_highres -); + int16_t *lc3plus_highres ); /* Allocates and initializes a a split renderer writer instance */ @@ -59,12 +57,10 @@ ivas_error split_rend_writer_open( const int32_t delayTimeScale, ISAR_SPLIT_REND_CODEC codec, ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrection, - int16_t codec_frame_size_ms - , + int16_t codec_frame_size_ms, const int16_t isar_frame_size_ms, const int32_t sampling_rate, - const int16_t lc3plus_highres -); + const int16_t lc3plus_highres ); /* Closes the split renderer reader/writer and deallocates memory */ -- GitLab From ff910e8916731097fa517825b87be81746e8b964 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 12:51:21 +0200 Subject: [PATCH 0899/1310] changes for fixing issue 1744, NON-BE, fixes several coding errors, should improve quality --- lib_com/options.h | 3 +++ lib_dec/ivas_spar_md_dec_fx.c | 22 +++++++++++++++++++--- lib_enc/ivas_dirac_enc_fx.c | 17 +++++++++++++++-- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9dc7e7fd1..de111668a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -111,4 +111,7 @@ #define FIX_1733_CLDFB_BUG #define FIX_1740_MISING_POP_WMOPS /* VA: fix issue 1740: missing pop_wmops() */ +#define FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC /* FhG: NON-BE!!! Simplify azimuth & elevation calculations, remove parameter mismatch for divide3232, fix copy/paste error for elevation */ +#define FIX_ISSUE_1744_IVAS_DIRAC_GET_MONO_FLAG /* FhG: NON-BE!!! Simplify threshold - comparison, change (wrong) Equal-comparion to (correct) Greater-Than-comparison */ + #endif diff --git a/lib_dec/ivas_spar_md_dec_fx.c b/lib_dec/ivas_spar_md_dec_fx.c index 7f487a75c..3e7a4b3f5 100644 --- a/lib_dec/ivas_spar_md_dec_fx.c +++ b/lib_dec/ivas_spar_md_dec_fx.c @@ -44,6 +44,9 @@ /*------------------------------------------------------------------------------------------* * Local constants *------------------------------------------------------------------------------------------*/ +#ifdef FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC +#define INV_PI_DEG180_Q_22 ( (Word32) 0x394BB835 ) /* 2.0/PI in Q31 times DEGREE_180_Q_22) */ +#endif #define IVAS_DEFAULT_DTX_CNG_RAMP ( 8 ) @@ -2946,8 +2949,13 @@ void ivas_spar_to_dirac_fx( radius_fx = Sqrt32( temp, &q_temp ); Word16 check_azi_fx = BASOP_util_atan2( dvy_fx[band], dvx_fx[band], 0 ); /*Q13*/ - Word32 check_azi_fx_32 = L_shl( check_azi_fx, 16 ); /*Q29*/ + +#ifdef FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC + Word32 azi_intermediate = Mpy_32_16_1( INV_PI_DEG180_Q_22, check_azi_fx ); +#else Word16 check_azi_fx_res; + Word32 check_azi_fx_32 = L_shl( check_azi_fx, 16 ); /*Q29*/ + IF( check_azi_fx_32 < 0 ) { check_azi_fx_res = negate( divide3232( L_negate( check_azi_fx_32 ), 1686629760 /*3.145f in Q29*/ ) ); /*Q15*/ @@ -2957,6 +2965,8 @@ void ivas_spar_to_dirac_fx( check_azi_fx_res = divide3232( check_azi_fx_32, 1686629760 /*3.145f in Q29*/ ); /*Q15*/ } Word32 azi_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_azi_fx_res ); /*Q22*/ +#endif + azi_intermediate = L_add( azi_intermediate, ONE_IN_Q21 ); /*Q22*/ Word16 azi_res; @@ -2970,9 +2980,14 @@ void ivas_spar_to_dirac_fx( } Word16 check_ele_fx = BASOP_util_atan2( dvz_fx[band], radius_fx, sub( add( 9, q_dvnorm ), q_temp ) ); /*Q13*/ - Word32 check_ele_fx_32 = L_shl( check_ele_fx, 16 ); /*Q29*/ +#ifdef FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC + Word32 ele_intermediate = Mpy_32_16_1( INV_PI_DEG180_Q_22, check_ele_fx ); +#else + Word16 check_ele_fx_res; - IF( check_azi_fx_32 < 0 ) + Word32 check_ele_fx_32 = L_shl( check_ele_fx, 16 ); /*Q29*/ + + IF( check_ele_fx_32 < 0 ) { check_ele_fx_res = negate( divide3232( L_negate( check_ele_fx_32 ), 1686629760 /*3.145f in Q29*/ ) ); /*Q15*/ } @@ -2981,6 +2996,7 @@ void ivas_spar_to_dirac_fx( check_ele_fx_res = divide3232( check_ele_fx_32, 1686629760 /*3.145f in Q29*/ ); /*Q15*/ } Word32 ele_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_ele_fx_res ); /*Q22*/ +#endif ele_intermediate = L_add( ele_intermediate, ONE_IN_Q21 ); /*Q22*/ Word16 ele_res; diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c index be15b5048..5e9a50497 100644 --- a/lib_enc/ivas_dirac_enc_fx.c +++ b/lib_enc/ivas_dirac_enc_fx.c @@ -660,8 +660,20 @@ static Word16 ivas_dirac_get_mono_flag_fx( move32(); move16(); } - - IF( BASOP_Util_Cmp_Mant32Exp( divide3232( W_band_power, other_ch_band_power ), 31, threshold, threshold_e ) == 0 ) +#ifdef FIX_ISSUE_1744_IVAS_DIRAC_GET_MONO_FLAG + IF( BASOP_Util_Cmp_Mant32Exp( W_band_power, 31-16, Mpy_32_32(other_ch_band_power, threshold), threshold_e ) == 1 ) + /* -16 is needed because divide3232() returned a 16-Bit value, and this 16-bit value was passed to an 32-bit mantissa argument*/ + { + any_mono_band = 1; + move16(); + } + ELSE + { + any_mc_band = 1; + move16(); + } +#else + IF( BASOP_Util_Cmp_Mant32Exp( divide3232( W_band_power, other_ch_band_power ), 31, threshold, threshold_e ) == 1 ) { any_mono_band = 1; move16(); @@ -671,6 +683,7 @@ static Word16 ivas_dirac_get_mono_flag_fx( any_mc_band = 1; move16(); } +#endif } } } -- GitLab From 0ee162a3996b7bc58e7bc9ccc0011daef42df3d6 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 13:19:16 +0200 Subject: [PATCH 0900/1310] fix clang format issues --- lib_dec/ivas_spar_md_dec_fx.c | 4 ++-- lib_enc/ivas_dirac_enc_fx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec_fx.c b/lib_dec/ivas_spar_md_dec_fx.c index 3e7a4b3f5..be31cebbb 100644 --- a/lib_dec/ivas_spar_md_dec_fx.c +++ b/lib_dec/ivas_spar_md_dec_fx.c @@ -2967,7 +2967,7 @@ void ivas_spar_to_dirac_fx( Word32 azi_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_azi_fx_res ); /*Q22*/ #endif - azi_intermediate = L_add( azi_intermediate, ONE_IN_Q21 ); /*Q22*/ + azi_intermediate = L_add( azi_intermediate, ONE_IN_Q21 ); /*Q22*/ Word16 azi_res; IF( azi_intermediate < 0 ) @@ -2997,7 +2997,7 @@ void ivas_spar_to_dirac_fx( } Word32 ele_intermediate = Mpy_32_16_1( DEGREE_180_Q_22, check_ele_fx_res ); /*Q22*/ #endif - ele_intermediate = L_add( ele_intermediate, ONE_IN_Q21 ); /*Q22*/ + ele_intermediate = L_add( ele_intermediate, ONE_IN_Q21 ); /*Q22*/ Word16 ele_res; IF( ele_intermediate < 0 ) diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c index 5e9a50497..0941e0e85 100644 --- a/lib_enc/ivas_dirac_enc_fx.c +++ b/lib_enc/ivas_dirac_enc_fx.c @@ -661,7 +661,7 @@ static Word16 ivas_dirac_get_mono_flag_fx( move16(); } #ifdef FIX_ISSUE_1744_IVAS_DIRAC_GET_MONO_FLAG - IF( BASOP_Util_Cmp_Mant32Exp( W_band_power, 31-16, Mpy_32_32(other_ch_band_power, threshold), threshold_e ) == 1 ) + IF( BASOP_Util_Cmp_Mant32Exp( W_band_power, 31 - 16, Mpy_32_32( other_ch_band_power, threshold ), threshold_e ) == 1 ) /* -16 is needed because divide3232() returned a 16-Bit value, and this 16-bit value was passed to an 32-bit mantissa argument*/ { any_mono_band = 1; -- GitLab From e1ce3fb898faed74c4001636436e7b89e6bb88bb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 13 Jun 2025 18:29:27 +0530 Subject: [PATCH 0901/1310] Crash fix for [Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, HOA3 out] fxd enc fxd dec case and warning fix --- lib_dec/ivas_mc_param_dec_fx.c | 2 +- lib_dec/ivas_sba_rendering_internal_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index b6868dbb1..c25ec972f 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -106,7 +106,7 @@ static ivas_error param_mc_get_diff_proto_info_fx( const Word32 *proto_mtx, cons static void param_mc_update_mixing_matrices_fx( PARAM_MC_DEC_HANDLE hParamMC, Word32 *mixing_matrix[], Word16 *mixing_matrix_fx, Word32 *mixing_matrix_res[], Word16 *mixing_matrix_res_exp, const UWord16 nX, const UWord16 nY ); -static void param_mc_protoSignalComputation_fx( Word32 *RealBuffer_fx, Word32 *ImagBuffer_fx, Word32 *proto_frame_f_fx, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const Word16 num_freq_bands, Word16 Cldfb_Real_Imag_exp, Word16 *proto_frame_f_fx_q /* Word16 ImagBuffer_fx_e, Word16 *common_e*/ ); +static void param_mc_protoSignalComputation_fx( Word32 *RealBuffer_fx, Word32 *ImagBuffer_fx, Word32 *proto_frame_f_fx, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const Word16 num_freq_bands, const Word16 Cldfb_Real_Imag_exp, Word16 *proto_frame_f_fx_q /* Word16 ImagBuffer_fx_e, Word16 *common_e*/ ); /*------------------------------------------------------------------------- * ivas_param_mc_dec_open() diff --git a/lib_dec/ivas_sba_rendering_internal_fx.c b/lib_dec/ivas_sba_rendering_internal_fx.c index d9ee47c84..5a15a357e 100644 --- a/lib_dec/ivas_sba_rendering_internal_fx.c +++ b/lib_dec/ivas_sba_rendering_internal_fx.c @@ -211,7 +211,7 @@ void ivas_mc2sba_fx( FOR( k = 0; k < output_frame; k++ ) { #ifdef OPT_BIN_RENDERER_V2 - buffer_tmp_fx[j][k] = Madd_32_32( buffer_tmp_fx[j][k], L_shl( in_buffer_td_fx[i][k], 2 ), gains_fx[j] ); /*Q+29-31+2==Q*/ + buffer_tmp_fx[j][k] = Madd_32_32( buffer_tmp_fx[j][k], L_shl_sat( in_buffer_td_fx[i][k], 2 ), gains_fx[j] ); /*Q+29-31+2==Q*/ #else /* OPT_BIN_RENDERER_V2 */ buffer_tmp_fx[j][k] = L_add( buffer_tmp_fx[j][k], L_shl( Mult_32_32( in_buffer_td_fx[i][k], gains_fx[j] ), 2 ) ); /*Q+29-31+2==Q*/ #endif /* OPT_BIN_RENDERER_V2 */ -- GitLab From 79ae9a3cc39dc5e5be2cd87faae4be74ccf0b8b3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 13 Jun 2025 18:34:27 +0530 Subject: [PATCH 0902/1310] Clang formatting changes --- lib_dec/ivas_sba_rendering_internal_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_sba_rendering_internal_fx.c b/lib_dec/ivas_sba_rendering_internal_fx.c index 5a15a357e..ba8c529d7 100644 --- a/lib_dec/ivas_sba_rendering_internal_fx.c +++ b/lib_dec/ivas_sba_rendering_internal_fx.c @@ -212,9 +212,9 @@ void ivas_mc2sba_fx( { #ifdef OPT_BIN_RENDERER_V2 buffer_tmp_fx[j][k] = Madd_32_32( buffer_tmp_fx[j][k], L_shl_sat( in_buffer_td_fx[i][k], 2 ), gains_fx[j] ); /*Q+29-31+2==Q*/ -#else /* OPT_BIN_RENDERER_V2 */ +#else /* OPT_BIN_RENDERER_V2 */ buffer_tmp_fx[j][k] = L_add( buffer_tmp_fx[j][k], L_shl( Mult_32_32( in_buffer_td_fx[i][k], gains_fx[j] ), 2 ) ); /*Q+29-31+2==Q*/ -#endif /* OPT_BIN_RENDERER_V2 */ +#endif /* OPT_BIN_RENDERER_V2 */ move32(); } } -- GitLab From 734b270395cda470643392d1ebabc9a7511fc97b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 13 Jun 2025 18:36:00 +0530 Subject: [PATCH 0903/1310] Bug fix --- lib_enc/cod4t64_fast_fx.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib_enc/cod4t64_fast_fx.c b/lib_enc/cod4t64_fast_fx.c index e24f3b678..7079f6597 100644 --- a/lib_enc/cod4t64_fast_fx.c +++ b/lib_enc/cod4t64_fast_fx.c @@ -145,7 +145,8 @@ void acelp_fast_fx( Word16 track_order[NB_TRACK_FCB_4T * MAX_NUM_INTER], m0_track[NB_TRACK_FCB_4T]; Word16 ind_stream[NPMAXPT * NB_TRACK_FCB_4T], idx; Word16 G, G1, G2, G3, Gn, Gd; - Word32 Gd32; + Word32 Gd32 = 0; + move32(); Word16 y_tmp[L_SUBFR_MAX]; Word32 dn[L_SUBFR_MAX]; Word32 crit_num, crit_den, crit_num_max, crit_den_max, L_tmp1, L_tmp2; @@ -718,8 +719,6 @@ void acelp_fast_fx( IF( GE_16( nb_pulse, 4 ) ) { Gn = add( Gn, i_mult( s[2], dn_orig[m[2]] ) ); // Q_dn - Gd32 = Gd; - move16(); temp1 = alp[0]; move32(); temp2 = L_mult0( i_mult( shl( s[0], 1 ), s[2] ), alp[m[0] - m[2]] ); @@ -770,8 +769,6 @@ void acelp_fast_fx( IF( GE_16( nb_pulse, 5 ) ) { Gn = add( Gn, i_mult( s[3], dn_orig[m[3]] ) ); // Q_dn - Gd32 = Gd; - move16(); temp1 = alp[0]; move32(); temp2 = L_mult0( i_mult( shl( s[0], 1 ), s[3] ), alp[m[0] - m[3]] ); -- GitLab From bd88ebcc33968191ec4327a1179d95abab2d6883 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 13 Jun 2025 19:19:36 +0530 Subject: [PATCH 0904/1310] Bit exact optimizations in SBA decoder renderer path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes are enabled with macro OPT_SBA_REND_V1_BE Functions and corresponding WMOPs gains: ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx 1.5 vbap_gains 0.2 vector_matrix_multiply_3x3_fx 2.2 protoSignalComputation4_fx 1.8 in_tri_fx 0.1 Test case: ./IVAS_cod -sba 1 256000 48 scripts/testv/stvFOA48c.wav bit_sba ./IVAS_dec 7_1 48 bit_sba sba.wav  --- lib_com/options.h | 1 + .../ivas_dirac_dec_binaural_functions_fx.c | 165 ++++++++++++++++++ lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 63 ++++++- lib_rend/ivas_dirac_rend_fx.c | 8 +- lib_rend/ivas_efap_fx.c | 16 +- lib_rend/ivas_vbap_fx.c | 38 +++- 6 files changed, 277 insertions(+), 14 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9dc7e7fd1..7e3799ffc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -75,6 +75,7 @@ #define FIX_1379_MASA_ANGLE_ROUND /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_SBA_REND_V1_BE #define OPT_SBA_ENC_V1_BE #define OPT_BIN_RENDERER_V1 #define OPT_BIN_RENDERER_V2 diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 6dc701468..c92f800af 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -3415,6 +3415,169 @@ static void eig2x2_fx( move16(); move16(); +#ifdef OPT_SBA_REND_V1_BE + /* Eigenvectors */ + FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + Word16 q_diff = sub( q_e, *q_D ); + IF( q_diff > 0 ) + { + tmp1 = L_sub( D_fx[ch], L_shr( e1, q_diff ) ); + tmp2 = L_sub( D_fx[ch], L_shr( e2, q_diff ) ); + q_tmp1 = *q_D; + move16(); + } + ELSE + { + tmp1 = L_sub( L_shl( D_fx[ch], q_diff ), e1 ); + tmp2 = L_sub( L_shl( D_fx[ch], q_diff ), e2 ); + q_tmp1 = q_e; + move16(); + } + + IF( GT_32( L_abs( tmp2 ), L_abs( tmp1 ) ) ) + { + s_fx = tmp2; + move32(); + exp = sub( norm_l( s_fx ), 1 ); + tmp2 = Mpy_32_32( s_fx, s_fx ); + q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); + + tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); + q_tmp2 = sub( 31, q_tmp2 ); + + tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); + + tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); + exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); + normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 + q_tmp2 = sub( 31, exp ); + + q_diff = sub( q_c, q_tmp1 ); + IF( q_diff > 0 ) + { + c_re = L_shr( c_re, q_diff ); + c_im = L_shr( c_im, q_diff ); + q_c = q_tmp1; + move16(); + } + ELSE + { + s_fx = L_shl( s_fx, q_diff ); + q_tmp1 = q_c; + move16(); + } + + Ure_fx[0][ch] = Mpy_32_32( s_fx, normVal_fx ); + move32(); + Ure_fx[1][ch] = Mpy_32_32( c_re, normVal_fx ); + move32(); + Uim_fx[1][ch] = Mpy_32_32( c_im, normVal_fx ); + move32(); + q_U_1 = sub( add( q_tmp1, q_tmp2 ), 31 ); + + IF( q_U_2 != 0 ) + { + q_diff = sub( q_U_2, q_U_1 ); + IF( q_diff > 0 ) + { + Ure_fx[1][ch - 1] = L_shr( Ure_fx[1][ch - 1], q_diff ); + Ure_fx[0][ch - 1] = L_shr( Ure_fx[0][ch - 1], q_diff ); + Uim_fx[0][ch - 1] = L_shr( Uim_fx[0][ch - 1], q_diff ); + q_U_2 = q_U_1; + move32(); + move32(); + move32(); + move16(); + } + ELSE IF( GT_16( q_U_1, q_U_2 ) ) + { + Ure_fx[1][ch] = L_shl( Ure_fx[1][ch], q_diff ); + Ure_fx[0][ch] = L_shl( Ure_fx[0][ch], q_diff ); + Uim_fx[1][ch] = L_shl( Uim_fx[1][ch], q_diff ); + q_U_1 = q_U_2; + move32(); + move32(); + move32(); + move16(); + } + } + q_U_2 = q_U_1; + move16(); + } + ELSE + { + s_fx = tmp1; + move32(); + + exp = sub( norm_l( s_fx ), 1 ); + tmp2 = Mpy_32_32( s_fx, s_fx ); + q_tmp2 = sub( add( q_tmp1, q_tmp1 ), 31 ); + + tmp2 = BASOP_Util_Add_Mant32Exp( crossSquare_fx, sub( 31, q_crossSquare ), tmp2, sub( 31, q_tmp2 ), &q_tmp2 ); + q_tmp2 = sub( 31, q_tmp2 ); + + tmp3 = BASOP_Util_Add_Mant32Exp( tmp2, sub( 31, q_tmp2 ), epsilon_mant, epsilon_exp, &exp_tmp3 ); + + tmp2 = BASOP_Util_Divide3232_Scale_newton( ONE_IN_Q30, tmp3, &exp ); + exp = sub( exp, sub( Q30, sub( 31, exp_tmp3 ) ) ); + normVal_fx = Sqrt32( tmp2, &exp ); // q_tmp2 + q_tmp2 = sub( 31, exp ); + + q_diff = sub( q_c, q_tmp1 ); + IF( q_diff > 0 ) + { + c_re = L_shr( c_re, q_diff ); + c_im = L_shr( c_im, q_diff ); + q_c = q_tmp1; + move16(); + } + ELSE + { + s_fx = L_shl( s_fx, q_diff ); + q_tmp1 = q_c; + move16(); + } + + Ure_fx[1][ch] = Mpy_32_32( s_fx, normVal_fx ); + move32(); + Ure_fx[0][ch] = Mpy_32_32( c_re, normVal_fx ); + move32(); + Uim_fx[0][ch] = Mpy_32_32( L_negate( c_im ), normVal_fx ); + move32(); + q_U_2 = sub( add( q_tmp1, q_tmp2 ), 31 ); + + IF( q_U_1 != 0 ) + { + q_diff = sub( q_U_2, q_U_1 ); + IF( q_diff > 0 ) + { + Ure_fx[1][ch] = L_shr( Ure_fx[1][ch], q_diff ); + Ure_fx[0][ch] = L_shr( Ure_fx[0][ch], q_diff ); + Uim_fx[0][ch] = L_shr( Uim_fx[0][ch], q_diff ); + q_U_2 = q_U_1; + move32(); + move32(); + move32(); + move16(); + } + ELSE IF( GT_16( q_U_1, q_U_2 ) ) + { + Ure_fx[1][ch - 1] = L_shl( Ure_fx[1][ch - 1], q_diff ); + Ure_fx[0][ch - 1] = L_shl( Ure_fx[0][ch - 1], q_diff ); + Uim_fx[1][ch - 1] = L_shl( Uim_fx[1][ch - 1], q_diff ); + q_U_1 = q_U_2; + move32(); + move32(); + move32(); + move16(); + } + } + q_U_1 = q_U_2; + move16(); + } + } +#else /* OPT_SBA_REND_V1_BE */ /* Eigenvectors */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -3571,6 +3734,8 @@ static void eig2x2_fx( move16(); } } +#endif /* OPT_SBA_REND_V1_BE */ + if ( q_U_1 != 0 ) { *q_U = q_U_1; diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 872d89c34..ba0ab8953 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -2465,6 +2465,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( move16(); move16(); +#ifdef OPT_SBA_REND_V1_BE + Word32 cmp = W_shl_sat_l( DIRAC_GAIN_LIMIT_Q26, sub( h_dirac_output_synthesis_state->gains_dir_prev_q, 26 ) ); + Word32 cmp2 = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ); +#endif /* OPT_SBA_REND_V1_BE */ + FOR( k = 0; k < nchan_out_woLFE; k++ ) { Word32 power_smooth_temp; @@ -2512,11 +2517,19 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_dir ) = 0; move32(); } +#ifdef OPT_SBA_REND_V1_BE + ELSE IF( GT_32( *( p_gains_dir ), cmp ) ) + { + *( p_gains_dir ) = cmp; /*26 + h_dirac_output_synthesis_state->gains_dir_prev_q + 1 + 5 - 32 -> h_dirac_output_synthesis_state->gains_dir_prev_q*/ + move32(); + } +#else /* OPT_SBA_REND_V1_BE */ ELSE IF( GT_32( *( p_gains_dir ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ) ) ) { *( p_gains_dir ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ); /*26 + h_dirac_output_synthesis_state->gains_dir_prev_q + 1 + 5 - 32 -> h_dirac_output_synthesis_state->gains_dir_prev_q*/ move32(); } +#endif /* OPT_SBA_REND_V1_BE */ IF( *( p_cy_cross_dir_smooth_prev++ ) < 0 ) { @@ -2549,11 +2562,19 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_diff ) = 0; move32(); } +#ifdef OPT_SBA_REND_V1_BE + ELSE IF( GT_32( *( p_gains_diff ), cmp2 ) ) /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ + { + *( p_gains_diff ) = cmp2; /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ + move32(); + } +#else /* OPT_SBA_REND_V1_BE */ ELSE IF( GT_32( *( p_gains_diff ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ) ) ) /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ { *( p_gains_diff ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_diff_prev_q ) ), Q5 ) ); /*h_dirac_output_synthesis_state->gains_diff_prev_q*/ move32(); } +#endif /* OPT_SBA_REND_V1_BE */ p_gains_diff++; } @@ -2564,15 +2585,25 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( g1 = alpha[l]; // Q31 move32(); g2 = L_sub( ONE_IN_Q31, g1 ); // Q31 +#ifdef OPT_SBA_REND_V1_BE + W_temp = W_mac_32_32( W_mult_32_32( g1, ( *( p_cy_auto_dir_smooth++ ) ) ), + g2, ( *( p_cy_auto_dir_smooth_prev ) ) ); /*32+q_cy_auto_dir_smooth_prev_local*/ +#else /* OPT_SBA_REND_V1_BE */ W_temp = W_add( W_mult_32_32( g1, ( *( p_cy_auto_dir_smooth++ ) ) ), W_mult_32_32( g2, ( *( p_cy_auto_dir_smooth_prev ) ) ) ); /*32+q_cy_auto_dir_smooth_prev_local*/ +#endif /* OPT_SBA_REND_V1_BE */ q_tmp = W_norm( W_temp ); L_tmp = W_extract_h( W_shl( W_temp, q_tmp ) ); // q_cy_auto_dir_smooth_prev_local + q_tmp *( p_cy_auto_dir_smooth_prev++ ) = L_shr_r( L_tmp, q_tmp ); // q_cy_auto_dir_smooth_prev_local move32(); +#ifdef OPT_SBA_REND_V1_BE + *( p_cy_cross_dir_smooth_prev ) = Madd_32_32( Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth ) ) ), + g2, ( *( p_cy_cross_dir_smooth_prev ) ) ); // (Q31, q_cy_cross_dir_smooth_prev) -> q_cy_cross_dir_smooth_prev +#else /* OPT_SBA_REND_V1_BE */ *( p_cy_cross_dir_smooth_prev ) = L_add( Mpy_32_32( g1, ( *( p_cy_cross_dir_smooth ) ) ), Mpy_32_32( g2, ( *( p_cy_cross_dir_smooth_prev ) ) ) ); // (Q31, q_cy_cross_dir_smooth_prev) -> q_cy_cross_dir_smooth_prev +#endif /* OPT_SBA_REND_V1_BE */ move32(); test(); if ( *( p_cy_cross_dir_smooth_prev ) == 0 && ( *( p_cy_cross_dir_smooth ) != 0 ) ) @@ -2604,11 +2635,19 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( *( p_gains_dir ) = 0; move32(); } +#ifdef OPT_SBA_REND_V1_BE + ELSE IF( GT_32( *( p_gains_dir ), cmp ) ) /*gains_dir_prev_q*/ + { + *( p_gains_dir ) = cmp; /*gains_dir_prev_q*/ + move32(); + } +#else /* OPT_SBA_REND_V1_BE */ ELSE IF( GT_32( *( p_gains_dir ), W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ) ) ) /*gains_dir_prev_q*/ { *( p_gains_dir ) = W_extract_h( W_shl( W_mult_32_32( DIRAC_GAIN_LIMIT_Q26, L_shl( 1, h_dirac_output_synthesis_state->gains_dir_prev_q ) ), Q5 ) ); /*gains_dir_prev_q*/ move32(); } +#endif /* OPT_SBA_REND_V1_BE */ IF( *( p_cy_cross_dir_smooth_prev++ ) < 0 ) { @@ -2695,7 +2734,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( shl( i_mult( proto_direct_index[k], num_freq_bands ), Q1 ); FOR( l = 0; l < num_freq_bands; l++ ) { - g = L_add( Mpy_32_32( g1, *( p_gain_1++ ) ), Mpy_32_32( g2, *( p_gain_2++ ) ) ); // (Q31, gains_dir_prev_q) -> gains_dir_prev_q +#ifdef OPT_SBA_REND_V1_BE + g = Madd_32_32( Mpy_32_32( g1, *( p_gain_1++ ) ), g2, *( p_gain_2++ ) ); // (Q31, gains_dir_prev_q) -> gains_dir_prev_q +#else /* OPT_SBA_REND_V1_BE */ + g = L_add( Mpy_32_32( g1, *( p_gain_1++ ) ), Mpy_32_32( g2, *( p_gain_2++ ) ) ); // (Q31, gains_dir_prev_q) -> gains_dir_prev_q +#endif /* OPT_SBA_REND_V1_BE */ Cldfb_RealBuffer64_fx[k][buf_idx][l] = W_mult0_32_32( g, ( *( p_power_smooth++ ) ) ); // (gains_dir_prev_q, q_proto_direct_buffer) -> gains_dir_prev_q + q_proto_direct_buffer move64(); @@ -2717,7 +2760,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( { FOR( l = 0; l < h_dirac_output_synthesis_params->max_band_decorr; l++ ) { - g = L_add( Mpy_32_32( g1, *( p_gain_1++ ) ), Mpy_32_32( g2, *( p_gain_2++ ) ) ); // (Q31, gains_diff_prev_q) -> gains_diff_prev_q +#ifdef OPT_SBA_REND_V1_BE + g = Madd_32_32( Mpy_32_32( g1, *( p_gain_1++ ) ), g2, *( p_gain_2++ ) ); // (Q31, gains_diff_prev_q) -> gains_diff_prev_q +#else /* OPT_SBA_REND_V1_BE */ + g = L_add( Mpy_32_32( g1, *( p_gain_1++ ) ), Mpy_32_32( g2, *( p_gain_2++ ) ) ); // (Q31, gains_diff_prev_q) -> gains_diff_prev_q + +#endif /* OPT_SBA_REND_V1_BE */ Cldfb_RealBuffer64_fx[k][buf_idx][l] = W_add( Cldfb_RealBuffer64_fx[k][buf_idx][l], W_shr( W_mult0_32_32( g, ( *( p_power_smooth_diff++ ) ) ), negate( q_align ) ) ); // (gains_diff_prev_q, q_proto_direct_buffer) -> gains_diff_prev_q + q_proto_direct_buffer move64(); @@ -2766,16 +2814,27 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( } } q_align = W_norm( W_temp ); +#ifdef OPT_SBA_REND_V1_BE + Word16 shift = sub( q_align, 32 ); +#endif /* OPT_SBA_REND_V1_BE */ + FOR( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) { FOR( k = 0; k < nchan_out_woLFE; k++ ) { FOR( l = 0; l < num_freq_bands; l++ ) { +#ifdef OPT_SBA_REND_V1_BE + RealBuffer[k][buf_idx][l] = W_shl_sat_l( Cldfb_RealBuffer64_fx[k][buf_idx][l], shift ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ + move32(); + ImagBuffer[k][buf_idx][l] = W_shl_sat_l( Cldfb_ImagBuffer64_fx[k][buf_idx][l], shift ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ + move32(); +#else /* OPT_SBA_REND_V1_BE */ RealBuffer[k][buf_idx][l] = W_extract_h( W_shl( Cldfb_RealBuffer64_fx[k][buf_idx][l], q_align ) ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ move32(); ImagBuffer[k][buf_idx][l] = W_extract_h( W_shl( Cldfb_ImagBuffer64_fx[k][buf_idx][l], q_align ) ); /*( ( ( h_dirac_output_synthesis_state->proto_direct_buffer_f_q+h_dirac_output_synthesis_state->gains_dir_prev_q )+ q_align )- 32 )*/ move32(); +#endif /* OPT_SBA_REND_V1_BE */ } } } diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 99a84bf52..155524790 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -3155,7 +3155,11 @@ void protoSignalComputation4_fx( sq_tmp_fx = Madd_32_32( Mpy_32_32( proto_frame_f_fx[idx], proto_frame_f_fx[idx] ), proto_frame_f_fx[idx + 1], proto_frame_f_fx[idx + 1] ); // 2*(proto_frame_f_q)-31 sq_tmp_q = sub( add( *proto_frame_f_q, *proto_frame_f_q ), 31 ); +#ifdef OPT_SBA_REND_V1_BE + proto_power_smooth_fx_q = s_min( *proto_power_smooth_q, sq_tmp_q ); + proto_power_smooth_fx[l + ( k * num_freq_bands )] = L_add( L_shr( proto_power_smooth_fx[l + ( k * num_freq_bands )], sub( *proto_power_smooth_q, proto_power_smooth_fx_q ) ), L_shr( sq_tmp_fx, sub( sq_tmp_q, proto_power_smooth_fx_q ) ) ); // proto_power_smooth_fx_q +#else /* OPT_SBA_REND_V1_BE */ IF( LT_16( *proto_power_smooth_q, sq_tmp_q ) ) { proto_power_smooth_fx[l + ( k * num_freq_bands )] = L_add( proto_power_smooth_fx[l + ( k * num_freq_bands )], L_shr( sq_tmp_fx, sub( sq_tmp_q, *proto_power_smooth_q ) ) ); // proto_power_smooth_q @@ -3170,8 +3174,8 @@ void protoSignalComputation4_fx( proto_power_smooth_fx_q = sq_tmp_q; move16(); } - - p_proto_buffer_fx[idx] = proto_frame_f_fx[idx]; // proto_frame_f_q +#endif /* OPT_SBA_REND_V1_BE */ + p_proto_buffer_fx[idx] = proto_frame_f_fx[idx]; // proto_frame_f_q move32(); p_proto_buffer_fx[idx + 1] = proto_frame_f_fx[idx + 1]; // proto_frame_f_q move32(); diff --git a/lib_rend/ivas_efap_fx.c b/lib_rend/ivas_efap_fx.c index fbcfdfe77..2ac397e2c 100644 --- a/lib_rend/ivas_efap_fx.c +++ b/lib_rend/ivas_efap_fx.c @@ -1528,7 +1528,7 @@ static void get_poly_gains_fx( #ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ #else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ + v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ #endif /* VEC_ARITH_OPT_v1 */ FOR( j = i; j < numChan - 2 + i; ++j ) @@ -1585,7 +1585,7 @@ static Word32 get_tri_gain_fx( #ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( B, A, tmpSub1, 2 ); // tmpSub1 q22 #else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( B, A, tmpSub1, 2, 0 ); // tmpSub1 q22 + v_sub_fixed( B, A, tmpSub1, 2, 0 ); // tmpSub1 q22 #endif /* VEC_ARITH_OPT_v1 */ tmpDot1 = dotp_fixed( tmpN, tmpSub1, 2 ); // Q13 @@ -2248,7 +2248,7 @@ static void sort_channels_vertex_fx( #ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( tmpV1, tmpV2, tmpV3, 3 ); // tmpV3 Q30 #else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( tmpV1, tmpV2, tmpV3, 3, 0 ); // tmpV3 Q30 + v_sub_fixed( tmpV1, tmpV2, tmpV3, 3, 0 ); // tmpV3 Q30 #endif /* VEC_ARITH_OPT_v1 */ Word16 exp2 = 2; move16(); @@ -2434,7 +2434,7 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ #ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ #else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ + v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ #endif /* VEC_ARITH_OPT_v1 */ FOR( n = 1; n < sub( numVertices, 1 ); ++n ) @@ -2508,12 +2508,16 @@ static Word16 in_tri_fx( v_sub_fixed_no_hdrm( B, A, tmpDot1, 2 ); // tmpDot1 q22 v_sub_fixed_no_hdrm( C, A, tmpDot2, 2 ); // tmpDot2 q22 #else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( B, A, tmpDot1, 2, 0 ); // tmpDot1 q22 - v_sub_fixed( C, A, tmpDot2, 2, 0 ); // tmpDot2 q22 + v_sub_fixed( B, A, tmpDot1, 2, 0 ); // tmpDot1 q22 + v_sub_fixed( C, A, tmpDot2, 2, 0 ); // tmpDot2 q22 #endif /* VEC_ARITH_OPT_v1 */ /* Verification of the non-colinearity : Q22 * Q22 = Q13 */ +#ifdef OPT_SBA_REND_V1_BE + invFactor = Msub_32_32( Mpy_32_32( tmpDot1[0], tmpDot2[1] ), tmpDot1[1], tmpDot2[0] ); /*q22+q22-q31->q13*/ +#else /* OPT_SBA_REND_V1_BE */ invFactor = L_sub( Mpy_32_32( tmpDot1[0], tmpDot2[1] ), Mpy_32_32( tmpDot1[1], tmpDot2[0] ) ); /*q22+q22-q31->q13*/ +#endif /* OPT_SBA_REND_V1_BE */ IF( invFactor == 0 ) { diff --git a/lib_rend/ivas_vbap_fx.c b/lib_rend/ivas_vbap_fx.c index 7495953e3..cfcbc6760 100644 --- a/lib_rend/ivas_vbap_fx.c +++ b/lib_rend/ivas_vbap_fx.c @@ -578,7 +578,11 @@ void vbap_determine_gains_fx( move32(); FOR( ch = 0; ch < 3; ch++ ) { +#ifdef OPT_SBA_REND_V1_BE + gain_ene_fx = Madd_32_32( gain_ene_fx, gain_triplet_fx[ch], gain_triplet_fx[ch] ); /* Q(2 * VBAP_VS_TRIPLET.q_inverse_matrix - 31) */ +#else /* OPT_SBA_REND_V1_BE */ gain_ene_fx = L_add( gain_ene_fx, Mpy_32_32( gain_triplet_fx[ch], gain_triplet_fx[ch] ) ); /* Q(2 * VBAP_VS_TRIPLET.q_inverse_matrix - 31) */ +#endif /* OPT_SBA_REND_V1_BE */ } norm_value_fx = Isqrt( L_shr( gain_ene_fx, 1 ) ); /* Q(31 - (2 * VBAP_VS_TRIPLET.q_inverse_matrix - 31 - 1) / 2 ) = Q(47 - VBAP_VS_TRIPLET.q_inverse_matrix) */ @@ -681,9 +685,35 @@ static UWord8 vector_matrix_multiply_3x3_fx( Word32 *result, /* o : output vector Q(q_matrix) */ Word16 q_matrix ) { - result[0] = Mpy_32_16_1( matrix[0][0], src_vector[0] ); /* Q(q_matrix) */ - result[0] = L_add( result[0], Mpy_32_16_1( matrix[1][0], src_vector[1] ) ); /* Q(q_matrix) */ - result[0] = L_add( result[0], Mpy_32_16_1( matrix[2][0], src_vector[2] ) ); /* Q(q_matrix) */ +#ifdef OPT_SBA_REND_V1_BE + Word32 pointzero_one = Mpy_32_16_1( L_lshl( 1, q_matrix ), -327 /* -0.01 in Q15 */ ); + result[0] = Madd_32_16( Madd_32_16( Mpy_32_16_1( matrix[0][0], src_vector[0] ), matrix[1][0], src_vector[1] ), matrix[2][0], src_vector[2] ); /* Q(q_matrix) */ + move32(); + + IF( LT_32( result[0], pointzero_one ) ) + { + return 0; + } + + result[1] = Madd_32_16( Madd_32_16( Mpy_32_16_1( matrix[0][1], src_vector[0] ), matrix[1][1], src_vector[1] ), matrix[2][1], src_vector[2] ); /* Q(q_matrix) */ + move32(); + + IF( LT_32( result[1], pointzero_one ) ) + { + return 0; + } + + result[2] = Madd_32_16( Madd_32_16( Mpy_32_16_1( matrix[0][2], src_vector[0] ), matrix[1][2], src_vector[1] ), matrix[2][2], src_vector[2] ); /* Q(q_matrix) */ + move32(); + + IF( LT_32( result[2], pointzero_one ) ) + { + return 0; + } +#else /* OPT_SBA_REND_V1_BE */ + result[0] = Mpy_32_16_1( matrix[0][0], src_vector[0] ); /* Q(q_matrix) */ + result[0] = L_add( result[0], Mpy_32_16_1( matrix[1][0], src_vector[1] ) ); /* Q(q_matrix) */ + result[0] = L_add( result[0], Mpy_32_16_1( matrix[2][0], src_vector[2] ) ); /* Q(q_matrix) */ move32(); move32(); move32(); @@ -716,7 +746,7 @@ static UWord8 vector_matrix_multiply_3x3_fx( { return 0; } - +#endif /* OPT_SBA_REND_V1_BE */ return 1; } -- GitLab From ffc393eb77eee1d1ca1f275466c6ed16de5275c2 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 13 Jun 2025 20:19:16 +0530 Subject: [PATCH 0905/1310] HRTF rend optimization - Bit exact changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes made under macro OPT_HEAD_ROT_REND_V1_BE Function and corresponding WMOPS gain: rotateFrame_shd_cldfb 7.9 Command: ./IVAS_dec -t headrot.csv BINAURAL 48  bit mc.wav --- lib_com/options.h | 1 + lib_rend/ivas_rotation_fx.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 7e3799ffc..f734ff624 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -76,6 +76,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_SBA_REND_V1_BE +#define OPT_HEAD_ROT_REND_V1_BE #define OPT_SBA_ENC_V1_BE #define OPT_BIN_RENDERER_V1 #define OPT_BIN_RENDERER_V2 diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index b9403e7da..d65dab4c1 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1046,7 +1046,9 @@ void rotateFrame_shd_cldfb( Word16 l = 0, m1 = 0, m2 = 0; Word32 realRot[2 * HEADROT_ORDER + 1], imagRot[2 * HEADROT_ORDER + 1]; Word16 SHrotmat[HEADROT_SHMAT_DIM][HEADROT_SHMAT_DIM]; +#ifndef OPT_HEAD_ROT_REND_V1_BE Word32 temp1, temp2; +#endif /* OPT_HEAD_ROT_REND_V1_BE */ move16(); move16(); move16(); @@ -1095,12 +1097,19 @@ void rotateFrame_shd_cldfb( move32(); FOR( m = m1; m < m2; m++ ) { +#ifdef OPT_HEAD_ROT_REND_V1_BE + realRot[n - m1] = Madd_32_16_r( realRot[n - m1], Cldfb_RealBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) + move32(); + imagRot[n - m1] = Madd_32_16_r( imagRot[n - m1], Cldfb_ImagBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) + move32(); +#else /* OPT_HEAD_ROT_REND_V1_BE */ temp1 = Mpy_32_16_r( Cldfb_RealBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) temp2 = Mpy_32_16_r( Cldfb_ImagBuffer[m][i][iBand], SHrotmat[n][m] ); // Q(x + 14 - 15) realRot[n - m1] = L_add( temp1, realRot[n - m1] ); // Q(x + 14 - 15) move32(); imagRot[n - m1] = L_add( temp2, imagRot[n - m1] ); // Q(x + 14 - 15) move32(); +#endif /* OPT_HEAD_ROT_REND_V1_BE */ } } /* write back the result */ -- GitLab From d9019ae9e1e6224c9ff322d916e18879bd5430c7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 13 Jun 2025 21:05:19 +0530 Subject: [PATCH 0906/1310] SBA dec path optimization - Bit Exact changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes are made under macro OPT_SBA_DEC_V2_BE Functions and corresponding WMOPS improvements: ivas_spar_get_parameters_fx 0.4 Commands: ./IVAS_cod -sba 1 256000 48 scripts/testv/stvFOA48c.wav bit_sba  ./IVAS_dec 7_1 48 bit_sba sba.wav   --- lib_com/options.h | 1 + lib_dec/dec_tcx_fx.c | 21 +++++++ lib_dec/ivas_binRenderer_internal_fx.c | 15 +++++ lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 10 ++- lib_dec/ivas_spar_decoder_fx.c | 65 +++++++++++++++++++- lib_dec/ivas_spar_md_dec_fx.c | 13 ++++ 6 files changed, 123 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f734ff624..8bbd89e87 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -77,6 +77,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_SBA_REND_V1_BE #define OPT_HEAD_ROT_REND_V1_BE +#define OPT_SBA_DEC_V2_BE #define OPT_SBA_ENC_V1_BE #define OPT_BIN_RENDERER_V1 #define OPT_BIN_RENDERER_V2 diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index b9084df88..8e8a2b343 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2634,9 +2634,16 @@ void IMDCT_ivas_fx( Word32 fac; // fac = shl_sat( mult_r( extract_h( L_shr_sat( hTcxDec->conceal_eof_gain32, sub( 1, hTcxDec->conceal_eof_gain_e ) ) ), st->last_concealed_gain_syn_deemph ), 1 ); fac = Mpy_32_16_1( hTcxDec->conceal_eof_gain32, st->last_concealed_gain_syn_deemph ); // q = 31 - hTcxDec->conceal_eof_gain_e - last_concealed_gain_syn_deemph_e +#ifdef OPT_SBA_DEC_V2_BE + Word16 eff_e = add( hTcxDec->conceal_eof_gain_e, st->last_concealed_gain_syn_deemph_e ); +#endif /* OPT_SBA_DEC_V2_BE */ FOR( Word16 ind = 0; ind < overlap; ind++ ) { +#ifdef OPT_SBA_DEC_V2_BE + old_syn_overl_fx[ind] = extract_h( L_shl_sat( Mpy_32_16_1( fac, old_syn_overl_fx[ind] ), eff_e ) ); // Q(-2) +#else /* OPT_SBA_DEC_V2_BE */ old_syn_overl_fx[ind] = extract_h( L_shl_sat( Mpy_32_16_1( fac, old_syn_overl_fx[ind] ), add( hTcxDec->conceal_eof_gain_e, st->last_concealed_gain_syn_deemph_e ) ) ); // Q(-2) +#endif /* OPT_SBA_DEC_V2_BE */ move16(); } } @@ -4713,9 +4720,16 @@ void decoder_tcx_noiseshaping_igf_fx( { /* If the exponent on the spec side (i>L_frame) is lesser, then shift all the values in the spec side by the difference to make both sides have the same exponent. */ +#ifdef OPT_SBA_DEC_V2_BE + Word16 diff_e = sub( frame_side_x_e, spec_side_x_e ); +#endif /* OPT_SBA_DEC_V2_BE */ FOR( i = L_frame; i < L_spec; i++ ) { +#ifdef OPT_SBA_DEC_V2_BE + x_fx[i] = L_shr( x_fx[i], diff_e ); +#else /* OPT_SBA_DEC_V2_BE */ x_fx[i] = L_shr( x_fx[i], sub( frame_side_x_e, spec_side_x_e ) ); +#endif /* OPT_SBA_DEC_V2_BE */ move32(); } } @@ -4723,9 +4737,16 @@ void decoder_tcx_noiseshaping_igf_fx( { /* If the exponent on the spec side (i>L_frame) is greater, then shift all the values in the frame side (iconv_band ); + + FOR( k = 0; k < numTimeSlots; k++ ) + { + set32_fx( &Cldfb_RealBuffer_Binaural_fx[0][k][hBinRenderer->conv_band], 0, len ); + set32_fx( &Cldfb_RealBuffer_Binaural_fx[1][k][hBinRenderer->conv_band], 0, len ); + set32_fx( &Cldfb_ImagBuffer_Binaural_fx[0][k][hBinRenderer->conv_band], 0, len ); + set32_fx( &Cldfb_ImagBuffer_Binaural_fx[1][k][hBinRenderer->conv_band], 0, len ); + } +#endif /* OPT_SBA_DEC_V2_BE */ + pop_wmops(); return; } diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index caddb5c5c..598f90829 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -605,8 +605,11 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( #ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE { Word16 shifter; - +#ifdef OPT_SBA_DEC_V2_BE + shifter = sub( mixing_matrix_res_smooth_e, 31 ); +#else /* OPT_SBA_DEC_V2_BE */ shifter = 31 - mixing_matrix_res_smooth_e; +#endif /* OPT_SBA_DEC_V2_BE */ FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) { int i; @@ -625,8 +628,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( temp_imag = W_add( temp_imag, W_mult0_32_32( mixing_matrix_res_smooth_fx[idx], diff_f_imag_fx[i] ) ); idx += nY; } +#ifdef OPT_SBA_DEC_V2_BE + Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = W_shl_sat_l( temp_real, shifter ); + Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = W_shl_sat_l( temp_imag, shifter ); +#else /* OPT_SBA_DEC_V2_BE */ Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = W_extract_l( W_shr( temp_real, shifter ) ); Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = W_extract_l( W_shr( temp_imag, shifter ) ); +#endif /* OPT_SBA_DEC_V2_BE */ } } diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index 29a307425..fa5f6779f 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -1163,6 +1163,69 @@ void ivas_spar_get_parameters_fx( move16(); Word16 add_weight_fx = sub( MAX_WORD16, weight_fx ); Word16 add_weight_20ms_fx = sub( MAX_WORD16, weight_20ms_fx ); +#ifdef OPT_SBA_DEC_V2_BE + Word16 out_flag[IVAS_MAX_FB_MIXER_OUT_CH]; + + Word32 band_bool = LT_16( split_band, IVAS_MAX_NUM_BANDS ); + + FOR( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + { + /* 20ms cross-fade for Transport channels in all frequency bands */ + /* sub-frame processing for missing channels in all frequency bands*/ + out_flag[out_ch] = band_bool && ( 0 == ivas_is_res_channel( out_ch, hSpar->hMdDec->spar_md_cfg.nchan_transport ) ); + move16(); + } + Word32 frame_bool = GT_16( hSpar->i_subframe, 3 ); + + FOR( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + { + IF( out_flag[out_ch] ) + { + IF( frame_bool ) + { + FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + par_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[ts1][out_ch][in_ch][spar_band], weight_fx ), + hSpar->hMdDec->mixer_mat_prev_fx[ts0][out_ch][in_ch][spar_band], add_weight_fx ); + move32(); + } + } + } + ELSE + { + + + FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + { + par_mat_fx[out_ch][in_ch][spar_band] = hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band]; /*hSpar->hMdDec->Q_mixer_mat*/ + move32(); + } + } + } + } + } + ELSE + { + FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + FOR( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + /* 20ms Transport channel reconstruction with matching encoder/decoder processing */ + Word16 prev_idx = SPAR_DIRAC_SPLIT_START_BAND < IVAS_MAX_NUM_BANDS ? 1 : 0; /* if SPAR_DIRAC_SPLIT_START_BAND == IVAS_MAX_NUM_BANDS, then the sub-frame mixer_mat delay line is not active */ + move16(); + par_mat_fx[out_ch][in_ch][spar_band] = Madd_32_16( Mpy_32_16_1( hSpar->hMdDec->mixer_mat_prev_fx[prev_idx][out_ch][in_ch][spar_band], add_weight_20ms_fx ), + hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band], weight_20ms_fx ); /*hSpar->hMdDec->Q_mixer_mat*/ + move32(); + } + } + } + } +#else /* OPT_SBA_DEC_V2_BE */ FOR( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { FOR( out_ch = 0; out_ch < num_ch_out; out_ch++ ) @@ -1202,7 +1265,7 @@ void ivas_spar_get_parameters_fx( } } } - +#endif /* OPT_SBA_DEC_V2_BE */ return; } diff --git a/lib_dec/ivas_spar_md_dec_fx.c b/lib_dec/ivas_spar_md_dec_fx.c index 7f487a75c..36b77732a 100644 --- a/lib_dec/ivas_spar_md_dec_fx.c +++ b/lib_dec/ivas_spar_md_dec_fx.c @@ -1318,6 +1318,14 @@ static void ivas_get_spar_matrices_fx( tmp_C2_re_fx[0][j] = Mpy_32_32( active_w_dm_fac_fx, L_negate( hMdDec->spar_md.band_coeffs[( b + ( i_ts * IVAS_MAX_NUM_BANDS ) )].pred_re_fx[j - 1] ) ); // Q31 *Q22=Q22 move32(); } +#ifdef OPT_SBA_DEC_V2_BE + re_fx1 = Madd_32_32( ONE_IN_Q13, tmp_C2_re_fx[0][1], tmp_C1_re_fx[1][0] ); // Q13+Q13 + + re_fx1 = Madd_32_32( re_fx1, tmp_C2_re_fx[0][2], tmp_C1_re_fx[2][0] ); // Q13+Q13 + + tmp_dm_re_fx[0][0] = L_shl( Madd_32_32( re_fx1, tmp_C2_re_fx[0][3], tmp_C1_re_fx[3][0] ), Q9 ); // (Q13+Q13) << Q9 = Q22; + // +#else /* OPT_SBA_DEC_V2_BE */ re_fx = Mpy_32_32( tmp_C2_re_fx[0][1], tmp_C1_re_fx[1][0] ); // Q22 *Q22 =Q13 re_fx1 = L_add( ONE_IN_Q13, re_fx ); // Q13+Q13 @@ -1326,6 +1334,7 @@ static void ivas_get_spar_matrices_fx( re_fx = Mpy_32_32( tmp_C2_re_fx[0][3], tmp_C1_re_fx[3][0] ); // Q22 *Q22 =Q13 tmp_dm_re_fx[0][0] = L_shl( L_add( re_fx1, re_fx ), Q9 ); // (Q13+Q13) << Q9 = Q22; +#endif /* OPT_SBA_DEC_V2_BE */ move32(); IF( EQ_16( dyn_active_w_flag, 1 ) ) @@ -1401,7 +1410,11 @@ static void ivas_get_spar_matrices_fx( { FOR( k = dmx_ch; k < numch_out; k++ ) { +#ifndef OPT_SBA_DEC_V2_BE IF( EQ_16( sub( j, dmx_ch ), sub( k, dmx_ch ) ) ) +#else /* OPT_SBA_DEC_V2_BE */ + IF( EQ_16( j, k ) ) +#endif /* OPT_SBA_DEC_V2_BE */ { tmpP_re_fx[j][k] = hMdDec->spar_md.band_coeffs[add( b, i_mult( i_ts, IVAS_MAX_NUM_BANDS ) )].P_re_fx[sub( k, dmx_ch )]; // Q22 move32(); -- GitLab From df97c617fb4859bbee367cbf1ed1fc63a6f23a3f Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 13 Jun 2025 20:08:58 +0200 Subject: [PATCH 0907/1310] fixed issue 1744 (mr 1778) with exponent setting for divide3232 --- lib_enc/ivas_dirac_enc_fx.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c index 0941e0e85..4ad039fae 100644 --- a/lib_enc/ivas_dirac_enc_fx.c +++ b/lib_enc/ivas_dirac_enc_fx.c @@ -661,8 +661,7 @@ static Word16 ivas_dirac_get_mono_flag_fx( move16(); } #ifdef FIX_ISSUE_1744_IVAS_DIRAC_GET_MONO_FLAG - IF( BASOP_Util_Cmp_Mant32Exp( W_band_power, 31 - 16, Mpy_32_32( other_ch_band_power, threshold ), threshold_e ) == 1 ) - /* -16 is needed because divide3232() returned a 16-Bit value, and this 16-bit value was passed to an 32-bit mantissa argument*/ + IF( BASOP_Util_Cmp_Mant32Exp( W_band_power, W_band_power_e, Mpy_32_32( other_ch_band_power, threshold ), other_ch_band_power_e + threshold_e ) == 1 ) { any_mono_band = 1; move16(); @@ -673,7 +672,7 @@ static Word16 ivas_dirac_get_mono_flag_fx( move16(); } #else - IF( BASOP_Util_Cmp_Mant32Exp( divide3232( W_band_power, other_ch_band_power ), 31, threshold, threshold_e ) == 1 ) + IF( BASOP_Util_Cmp_Mant32Exp( divide3232( W_band_power, other_ch_band_power ), 31, threshold, threshold_e ) == 0 ) { any_mono_band = 1; move16(); -- GitLab From 4179ea850e4bc1837b2b825af89899f088482758 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 13 Jun 2025 20:51:26 +0200 Subject: [PATCH 0908/1310] formatting --- lib_com/ivas_dirac_com_fx.c | 4 +--- lib_dec/ivas_dirac_dec_fx.c | 9 ++++++++- lib_dec/ivas_ism_dec_fx.c | 16 +++++----------- lib_dec/ivas_jbm_dec_fx.c | 10 +++++----- lib_dec/ivas_objectRenderer_internal_fx.c | 6 +----- lib_dec/ivas_sba_dec_fx.c | 8 +++----- lib_enc/ivas_enc_fx.c | 6 ++---- lib_enc/ivas_ism_enc_fx.c | 4 ++-- lib_rend/ivas_objectRenderer_fx.c | 2 +- lib_rend/ivas_reverb_fx.c | 18 +++++++++--------- 10 files changed, 37 insertions(+), 46 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 0c913499b..017181d07 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -179,9 +179,7 @@ ivas_error ivas_dirac_config_fx( test(); IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) /* skip for MASA decoder */ { - IF( NE_32( ( error = ivas_dirac_sba_config_fx( hQMetaData, element_mode, ivas_total_brate, sba_order, sub( hConfig->nbands, spar_dirac_split_band ), - ivas_format ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_sba_config_fx( hQMetaData, element_mode, ivas_total_brate, sba_order, sub( hConfig->nbands, spar_dirac_split_band ), ivas_format ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 8ac4fadf0..e3b32d3fc 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -798,8 +798,10 @@ static ivas_error ivas_dirac_rend_config_fx( nchan_transport_tmp = nchan_transport; move16(); } + /* close and reopen the decorrelator */ ivas_dirac_dec_decorr_close_fx( &hDirACRend->h_freq_domain_decorr_ap_params, &hDirACRend->h_freq_domain_decorr_ap_state ); + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( hDirACRend->h_freq_domain_decorr_ap_params ), &( hDirACRend->h_freq_domain_decorr_ap_state ), hSpatParamRendCom->num_freq_bands, hDirACRend->num_outputs_diff, hDirACRend->num_protos_diff, hDirACRend->synthesisConf, hDirACRend->frequency_axis_fx, nchan_transport_tmp, output_Fs ) ), IVAS_ERR_OK ) ) @@ -1102,12 +1104,14 @@ ivas_error ivas_dirac_dec_config_fx( common_rend_config_flag = flag_config_inp; move32(); } + IF( NE_32( ( error = ivas_spat_hSpatParamRendCom_config_fx( &st_ivas->hSpatParamRendCom, common_rend_config_flag, dec_param_estim_new, st_ivas->ivas_format, st_ivas->mc_mode, output_Fs, hodirac_flag, 0 ) ), IVAS_ERR_OK ) ) { return error; } + IF( need_dirac_rend ) { IF( st_ivas->hDirACRend == NULL ) @@ -1167,13 +1171,15 @@ ivas_error ivas_dirac_dec_config_fx( { st_ivas->hDiracDecBin[pos_idx]->useTdDecorr = st_ivas->hDiracDecBin[0]->useTdDecorr; } - IF( !st_ivas->hDiracDecBin[0]->useTdDecorr ) + IF( !st_ivas->hDiracDecBin[0]->useTdDecorr ) { IF( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params == NULL ) { Word16 frequency_axis_fx[CLDFB_NO_CHANNELS_MAX]; + ivas_dirac_dec_get_frequency_axis_fx( frequency_axis_fx, st_ivas->hDecoderConfig->output_Fs, st_ivas->hSpatParamRendCom->num_freq_bands ); + IF( NE_32( ( error = ivas_dirac_dec_decorr_open_fx( &( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_params ), &( st_ivas->hDiracDecBin[0]->h_freq_domain_decorr_ap_state ), st_ivas->hSpatParamRendCom->num_freq_bands, BINAURAL_CHANNELS, BINAURAL_CHANNELS, DIRAC_SYNTHESIS_PSD_LS, frequency_axis_fx, BINAURAL_CHANNELS, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) @@ -1182,6 +1188,7 @@ ivas_error ivas_dirac_dec_config_fx( } } } + FOR( pos_idx = 0; pos_idx < num_poses; pos_idx++ ) { st_ivas->hDiracDecBin[pos_idx]->reqularizationFactor_fx = configure_reqularization_factor_fx( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 13e888af3..727a0a651 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -454,16 +454,12 @@ ivas_error ivas_ism_dec_config_fx( IF( st_ivas->ini_active_frame != 0 ) { /* ISM bit-rate switching */ + test(); + IF( ( NE_16( st_ivas->ism_mode, last_ism_mode ) ) || ( NE_32( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) { - test(); - IF( ( NE_16( st_ivas->ism_mode, last_ism_mode ) ) || ( NE_32( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) + IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { - IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, - data ) ), - IVAS_ERR_OK ) ) - { - return error; - } + return error; } } } @@ -486,9 +482,7 @@ ivas_error ivas_ism_dec_config_fx( /* ISM mode switching */ IF( NE_32( st_ivas->ism_mode, last_ism_mode ) ) { - IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, - data ) ), - IVAS_ERR_OK ) ) + IF( NE_16( ( error = ivas_ism_bitrate_switching_dec_fx( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index c21f182da..c7863bb98 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2266,17 +2266,16 @@ ivas_error ivas_jbm_dec_render_fx( } } - if ( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) + IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_32( output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) ) { - if ( ( error = ivas_rend_crendProcessSubframesSplitBin( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, - &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + IF( ( error = ivas_rend_crendProcessSubframesSplitBin( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, ( st_ivas->hSplitBinRend == NULL ) ? NULL : &st_ivas->hSplitBinRend->splitrend.multiBinPoseData, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, + &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) { return error; } } - else + ELSE { - IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, crendInPlaceRotation ? p_output_fx : p_tc_fx, p_output_fx, *nSamplesRendered, output_Fs, 0 ) ), IVAS_ERR_OK ) ) @@ -2699,6 +2698,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; *st_ivas->hCrendWrapper->p_io_qfactor = 11; + move16(); IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, IVAS_AUDIO_CONFIG_7_1_4, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output_fx, p_output_fx, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs, 0 ) ), diff --git a/lib_dec/ivas_objectRenderer_internal_fx.c b/lib_dec/ivas_objectRenderer_internal_fx.c index 9c603fa93..08bf0f437 100644 --- a/lib_dec/ivas_objectRenderer_internal_fx.c +++ b/lib_dec/ivas_objectRenderer_internal_fx.c @@ -227,11 +227,7 @@ ivas_error ivas_td_binaural_renderer_sf_fx( move16(); } - IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( st_ivas->hBinRendererTd, - enableCombinedOrientation, - tmp_Quaternion_fx, - tmp_vector_fx ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = TDREND_Update_listener_orientation_fx( st_ivas->hBinRendererTd, enableCombinedOrientation, tmp_Quaternion_fx, tmp_vector_fx ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index 8f8a7f486..687991c89 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -411,7 +411,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( IF( st_ivas->hBinRenderer == NULL && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) ) { /* open fastconv binaural renderer */ - if ( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_binRenderer_open_fx( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -423,7 +423,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( IF( EQ_16( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) && st_ivas->hMonoDmxRenderer == NULL ) { - if ( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_mono_dmx_renderer_open( st_ivas ) ), IVAS_ERR_OK ) ) { return error; } @@ -434,9 +434,7 @@ ivas_error ivas_sba_dec_reconfigure_fx( ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); } - if ( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), - st_ivas->ivas_format ) ), - IVAS_ERR_OK ) ) + IF( NE_32( ( error = ivas_dirac_sba_config_fx( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, ivas_get_hodirac_flag_fx( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ), st_ivas->ivas_format ) ), IVAS_ERR_OK ) ) { return error; } diff --git a/lib_enc/ivas_enc_fx.c b/lib_enc/ivas_enc_fx.c index 56299c69d..11368cec8 100644 --- a/lib_enc/ivas_enc_fx.c +++ b/lib_enc/ivas_enc_fx.c @@ -255,8 +255,7 @@ ivas_error ivas_enc_fx( ELSE { IF( ( error = ivas_masa_encode_fx( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, hEncoderConfig->Opt_DTX_ON, -1, - ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != - IVAS_ERR_OK ) + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) { return error; } @@ -648,8 +647,7 @@ ivas_error ivas_enc_fx( } IF( ( error = ivas_masa_encode_fx( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, 0, -1, - ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != - IVAS_ERR_OK ) + ISM_MODE_NONE, -1, NULL, -1, NULL, 0, 0 ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_enc_fx.c b/lib_enc/ivas_ism_enc_fx.c index 122ea1d75..3e7d8afcd 100644 --- a/lib_enc/ivas_ism_enc_fx.c +++ b/lib_enc/ivas_ism_enc_fx.c @@ -360,9 +360,9 @@ ivas_error ivas_ism_enc_fx( { omasa_stereo_sw_cnt = NULL; } + IF( ( error = ivas_ism_metadata_enc_fx( &ism_total_brate, nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, - nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, lp_noise_CPE_fx, flag_omasa_ener_brate, omasa_stereo_sw_cnt, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != - IVAS_ERR_OK ) + nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, lp_noise_CPE_fx, flag_omasa_ener_brate, omasa_stereo_sw_cnt, st_ivas->hSCE[0]->hCoreCoder[0]->ini_frame ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_rend/ivas_objectRenderer_fx.c b/lib_rend/ivas_objectRenderer_fx.c index da2c3cce9..9eea08c71 100644 --- a/lib_rend/ivas_objectRenderer_fx.c +++ b/lib_rend/ivas_objectRenderer_fx.c @@ -931,13 +931,13 @@ ivas_error ivas_td_binaural_renderer_ext_fx( } } - IF( NE_32( ( error = ivas_td_binaural_renderer_unwrap_fx( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, *hCombinedOrientationData, ism_md_subframe_update_ext, p_output_fx, output_frame, num_subframes ) ), IVAS_ERR_OK ) ) { return error; } + IF( hReverb != NULL ) { *exp = sub( *exp, 2 ); diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 74c2a0c0a..b5da38708 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2555,17 +2555,15 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( /* THIS PART IS YET TO BE CONVERTED AS REVERB_UTILS.C IS NOT INVOKED IN GPROF */ float t60_flt[CLDFB_NO_CHANNELS_MAX]; float ene_flt[CLDFB_NO_CHANNELS_MAX]; + revTimes = t60; revEne = ene; - if ( NE_32( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, - hHrtfFastConv, - internal_config, - false, - sampling_rate, t60_flt, ene_flt ) ), - IVAS_ERR_OK ) ) + + IF( NE_32( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60_flt, ene_flt ) ), IVAS_ERR_OK ) ) { return error; } + preDelay = (Word16) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); floatToFixed_arrL( t60_flt, t60, Q31, CLDFB_NO_CHANNELS_MAX ); floatToFixed_arrL( ene_flt, ene, Q31, CLDFB_NO_CHANNELS_MAX ); @@ -2583,17 +2581,19 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( return error; } + /*------------------------------------------------------------------------- * ivas_binaural_reverb_open_parambin() * * Allocate and initialize binaural room reverberator handle for ParamBin *------------------------------------------------------------------------*/ + ivas_error ivas_binaural_reverb_open_parambin( REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins Q0 */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame Q0 */ + const Word16 numBins, /* i : number of CLDFB bins Q0 */ + const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame Q0 */ IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const Word32 sampling_rate, /* i : sampling rate Q0 */ + const Word32 sampling_rate, /* i : sampling rate Q0 */ const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ ) { -- GitLab From 7d3d159591efe93ed88799a3137b5ea66f11d472 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 12 Jun 2025 09:58:12 +0530 Subject: [PATCH 0909/1310] Fix for 3GPP issue 1739: Crash in Stereo BASOP Enc -> Stereo BASOP Dec at 32 kbps with DTX, bandwidth switching and 5% FER Link #1739 The issue is caused due to deviations observed with msNoiseEst. Only for this test case, over-flow occurs. The root cause is as described in issue #859. Currently, to address the crash issue, saturation is being added. --- lib_dec/ivas_stereo_dft_dec_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 914c7fad1..d3aeee455 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -2608,7 +2608,7 @@ void stereo_dft_dec_fx( q_cna_level = hFdCngDec->smoothed_psd_exp; move16(); l_tmp = Sqrt32( cna_level, &q_cna_level ); - scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* q_cna_level */ + scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* Q = (31-q_cna_level) + Q15 - 31 */ /* scale_fact0 will be in Q15 by the time the above operation is performed so the q of scale_fact represented now by q_cna_level has to be updated @@ -2628,12 +2628,12 @@ void stereo_dft_dec_fx( l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ #endif /* OPT_STEREO_32KBPS_V1 */ - DFT_L[2 * i] = L_add( DFT_L[2 * i], l_tmp ); /* q_dft */ + DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp ); /* q_dft */ move32(); #ifdef OPT_STEREO_32KBPS_V1 l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp ); /* q_dft */ + DFT_R[2 * i] = L_add_sat( DFT_R[2 * i], l_tmp ); /* q_dft */ #else /* OPT_STEREO_32KBPS_V1 */ l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ -- GitLab From 486e2af24a4b9a094a6bb5e62d26d847998422cc Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 16 Jun 2025 12:12:20 +0530 Subject: [PATCH 0910/1310] Fixed crash at another location having same issue --- lib_dec/ivas_stereo_dft_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index d3aeee455..11f266d2e 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -2646,11 +2646,11 @@ void stereo_dft_dec_fx( #ifdef OPT_STEREO_32KBPS_V1 l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ + DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ move32(); l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ + DFT_R[2 * i + 1] = L_add_sat( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ move32(); #else /* OPT_STEREO_32KBPS_V1 */ l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ -- GitLab From 9460d05ac40a28d5439df34f66024da665fb93d4 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 24 Mar 2025 10:45:20 +0100 Subject: [PATCH 0911/1310] Added FIX_732, still work in progress --- lib_com/options.h | 1 + lib_dec/fd_cng_dec_fx.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8bbd89e87..eb296b843 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -67,6 +67,7 @@ #ifndef BASOP_NOGLOB_DEV_USE_GLOBALS #define BASOP_NOGLOB_DECLARE_LOCAL #endif +#define FIX_732 /* Eri: Fix for precision issue in CNG generation -- still work in progress */ #define FIX_867_CLDFB_NRG_SCALE diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 1d8185601..017c656e9 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1117,8 +1117,11 @@ Word16 ApplyFdCng_fx( *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } - +#ifdef FIX_732 + s2 = ( sub( WORD32_BITS, 1 ) ); +#else s2 = -( ( WORD32_BITS - 1 ) ); +#endif move16(); /* Shape the SID noise levels in each FFT bin */ j = 0; @@ -1158,7 +1161,11 @@ Word16 ApplyFdCng_fx( facTabExp[k] = -( ( WORD32_BITS - 1 ) ); move16(); } +#ifdef FIX_732 + s2 = s_min( s2, facTabExp[k] ); +#else s2 = s_max( s2, facTabExp[k] ); +#endif } if ( EQ_16( s2, -31 ) ) { @@ -1171,7 +1178,11 @@ Word16 ApplyFdCng_fx( s = s_max( s_min( s, ( WORD32_BITS - 1 ) ), -( ( WORD32_BITS - 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { +#ifdef FIX_732 + cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#endif move32(); } } @@ -1209,7 +1220,11 @@ Word16 ApplyFdCng_fx( { IF( !( LT_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) ) { +#ifdef FIX_732 + s2 = ( sub( WORD32_BITS, 1 ) ); +#else s2 = -( ( WORD32_BITS - 1 ) ); +#endif /* Shape the SID noise levels in each FFT bin */ j = 0; move16(); @@ -1248,7 +1263,11 @@ Word16 ApplyFdCng_fx( facTabExp[k] = -( WORD32_BITS - 1 ); move16(); } +#ifdef FIX_732 + s2 = s_min( s2, facTabExp[k] ); +#else s2 = s_max( s2, facTabExp[k] ); +#endif } IF( EQ_16( s2, -31 ) ) { @@ -1261,7 +1280,11 @@ Word16 ApplyFdCng_fx( s = s_max( s_min( s, sub( WORD32_BITS, 1 ) ), negate( sub( WORD32_BITS, 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { +#ifdef FIX_732 + cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ +#endif move32(); } } -- GitLab From 3b9fb3d1f7e4ea75dbbc2592eee7de246b34ad07 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:26:43 +0200 Subject: [PATCH 0912/1310] Change FIX_732 to only address noise floor in msPeriodog calculation --- lib_dec/fd_cng_dec_fx.c | 56 +++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 017c656e9..d9ffedf72 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1117,11 +1117,7 @@ Word16 ApplyFdCng_fx( *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } -#ifdef FIX_732 - s2 = ( sub( WORD32_BITS, 1 ) ); -#else s2 = -( ( WORD32_BITS - 1 ) ); -#endif move16(); /* Shape the SID noise levels in each FFT bin */ j = 0; @@ -1161,11 +1157,7 @@ Word16 ApplyFdCng_fx( facTabExp[k] = -( ( WORD32_BITS - 1 ) ); move16(); } -#ifdef FIX_732 - s2 = s_min( s2, facTabExp[k] ); -#else s2 = s_max( s2, facTabExp[k] ); -#endif } if ( EQ_16( s2, -31 ) ) { @@ -1178,11 +1170,7 @@ Word16 ApplyFdCng_fx( s = s_max( s_min( s, ( WORD32_BITS - 1 ) ), -( ( WORD32_BITS - 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { -#ifdef FIX_732 - cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#endif move32(); } } @@ -1220,11 +1208,7 @@ Word16 ApplyFdCng_fx( { IF( !( LT_16( hFdCngCom->msFrCnt_init_counter, hFdCngCom->msFrCnt_init_thresh ) ) ) { -#ifdef FIX_732 - s2 = ( sub( WORD32_BITS, 1 ) ); -#else s2 = -( ( WORD32_BITS - 1 ) ); -#endif /* Shape the SID noise levels in each FFT bin */ j = 0; move16(); @@ -1263,11 +1247,7 @@ Word16 ApplyFdCng_fx( facTabExp[k] = -( WORD32_BITS - 1 ); move16(); } -#ifdef FIX_732 - s2 = s_min( s2, facTabExp[k] ); -#else s2 = s_max( s2, facTabExp[k] ); -#endif } IF( EQ_16( s2, -31 ) ) { @@ -1280,11 +1260,7 @@ Word16 ApplyFdCng_fx( s = s_max( s_min( s, sub( WORD32_BITS, 1 ) ), negate( sub( WORD32_BITS, 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { -#ifdef FIX_732 - cngNoiseLevel[j] = L_shl_sat( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#else cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ -#endif move32(); } } @@ -1320,6 +1296,14 @@ Word16 ApplyFdCng_fx( } + dbgwrite( hFdCngDec->bandNoiseShape, sizeof( Word32 ), 320, 1, "bandNoiseShape.int" ); + dbgwrite( &hFdCngDec->bandNoiseShape_exp, sizeof( short ), 1, 1, "bandNoiseShape_exp.short" ); + + dbgwrite( cngNoiseLevel, sizeof( Word32 ), 340, 1, "cngNoiseLevel.int" ); + dbgwrite( cngNoiseLevel_exp, sizeof( short ), 1, 1, "cngNoiseLevel_exp.short" ); + dbgwrite( &frame, sizeof( int ), 1, 1, "frame.int" ); + + return 0; } @@ -1523,6 +1507,9 @@ void perform_noise_estimation_dec_ivas_fx( Word32 enr, enr_tot, enr_tot0; Word16 enr_e, enr_ratio, alpha; Word32 *msPeriodog; +#ifdef FIX_732 + Word32 msPeriodog_floor; +#endif Word32 *msNoiseEst; Word32 *reIter; Word32 rescale_fac = 0; @@ -1728,10 +1715,18 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); - +#ifdef FIX_732 + msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); + IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) +#else IF( LT_32( msPeriodog[p], L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ) ) +#endif { +#ifdef FIX_732 + msPeriodog[p] = msPeriodog_floor; +#else msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ +#endif move32(); } } @@ -2105,6 +2100,13 @@ void perform_noise_estimation_dec_ivas_fx( /* Expand partitions into bins of power spectrum */ scalebands_fx( msNoiseEst, part, nFFTpart, hFdCngDec->midband_shaping, nFFTpart, sub( stopFFTbin, startBand ), hFdCngDec->bandNoiseShape, 1 ); hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; + + dbgwrite( msNoiseEst, sizeof( int ), 62, 1, "msNoiseEst.int" ); + dbgwrite( &hFdCngDec->msNoiseEst_exp, sizeof( short ), 1, 1, "msNoiseEst_exp.short" ); + dbgwrite( msPeriodog, sizeof( int ), 62, 1, "msPeriodog.int" ); + dbgwrite( &hFdCngDec->msPeriodog_exp, sizeof( short ), 1, 1, "msPeriodog_exp.short" ); + + move16(); Copy32( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd_fx[startBand], sub( stopFFTbin, startBand ) ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ hFdCngDec->smoothed_psd_exp = hFdCngDec->bandNoiseShape_exp; @@ -4750,9 +4752,9 @@ void generate_masking_noise_ivas_fx( { #ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ) ); /*Q31 - *exp_out*/ -#else /* VEC_ARITH_OPT_v1 */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ), 0 ); /*Q31 - *exp_out*/ -#endif /* VEC_ARITH_OPT_v1 */ +#endif /* VEC_ARITH_OPT_v1 */ } return; -- GitLab From 1b3a8fac486292448ee69a85582e65327dec648f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:34:38 +0200 Subject: [PATCH 0913/1310] Rename switch to FIX_732_MS_PERIODOG_FLOOR --- lib_com/options.h | 2 +- lib_dec/fd_cng_dec_fx.c | 26 ++++++-------------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index eb296b843..30044d7b7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -67,7 +67,7 @@ #ifndef BASOP_NOGLOB_DEV_USE_GLOBALS #define BASOP_NOGLOB_DECLARE_LOCAL #endif -#define FIX_732 /* Eri: Fix for precision issue in CNG generation -- still work in progress */ +#define FIX_732_MS_PERIODOG_FLOOR /* Eri: Issue-732: Dynamic range of msPeriodog leads to minimum value 1e-5 being truncated to zero. This uses the smallest non-zero value instead. */ #define FIX_867_CLDFB_NRG_SCALE diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index d9ffedf72..30164c404 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1117,6 +1117,7 @@ Word16 ApplyFdCng_fx( *cngNoiseLevel_exp = hFdCngCom->sidNoiseEstExp; move16(); } + s2 = -( ( WORD32_BITS - 1 ) ); move16(); /* Shape the SID noise levels in each FFT bin */ @@ -1296,14 +1297,6 @@ Word16 ApplyFdCng_fx( } - dbgwrite( hFdCngDec->bandNoiseShape, sizeof( Word32 ), 320, 1, "bandNoiseShape.int" ); - dbgwrite( &hFdCngDec->bandNoiseShape_exp, sizeof( short ), 1, 1, "bandNoiseShape_exp.short" ); - - dbgwrite( cngNoiseLevel, sizeof( Word32 ), 340, 1, "cngNoiseLevel.int" ); - dbgwrite( cngNoiseLevel_exp, sizeof( short ), 1, 1, "cngNoiseLevel_exp.short" ); - dbgwrite( &frame, sizeof( int ), 1, 1, "frame.int" ); - - return 0; } @@ -1507,7 +1500,7 @@ void perform_noise_estimation_dec_ivas_fx( Word32 enr, enr_tot, enr_tot0; Word16 enr_e, enr_ratio, alpha; Word32 *msPeriodog; -#ifdef FIX_732 +#ifdef FIX_732_MS_PERIODOG_FLOOR Word32 msPeriodog_floor; #endif Word32 *msNoiseEst; @@ -1715,14 +1708,14 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); -#ifdef FIX_732 +#ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) #else IF( LT_32( msPeriodog[p], L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ) ) #endif { -#ifdef FIX_732 +#ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog[p] = msPeriodog_floor; #else msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ @@ -2100,13 +2093,6 @@ void perform_noise_estimation_dec_ivas_fx( /* Expand partitions into bins of power spectrum */ scalebands_fx( msNoiseEst, part, nFFTpart, hFdCngDec->midband_shaping, nFFTpart, sub( stopFFTbin, startBand ), hFdCngDec->bandNoiseShape, 1 ); hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; - - dbgwrite( msNoiseEst, sizeof( int ), 62, 1, "msNoiseEst.int" ); - dbgwrite( &hFdCngDec->msNoiseEst_exp, sizeof( short ), 1, 1, "msNoiseEst_exp.short" ); - dbgwrite( msPeriodog, sizeof( int ), 62, 1, "msPeriodog.int" ); - dbgwrite( &hFdCngDec->msPeriodog_exp, sizeof( short ), 1, 1, "msPeriodog_exp.short" ); - - move16(); Copy32( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd_fx[startBand], sub( stopFFTbin, startBand ) ); /*Q31 - hFdCngDec->bandNoiseShape_exp*/ hFdCngDec->smoothed_psd_exp = hFdCngDec->bandNoiseShape_exp; @@ -4752,9 +4738,9 @@ void generate_masking_noise_ivas_fx( { #ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ) ); /*Q31 - *exp_out*/ -#else /* VEC_ARITH_OPT_v1 */ +#else /* VEC_ARITH_OPT_v1 */ v_add_fixed( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ), 0 ); /*Q31 - *exp_out*/ -#endif /* VEC_ARITH_OPT_v1 */ +#endif /* VEC_ARITH_OPT_v1 */ } return; -- GitLab From de4a8862055cb6d1c693348bd83b6c54347b51f4 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:50:04 +0200 Subject: [PATCH 0914/1310] Clang format --- lib_dec/fd_cng_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 30164c404..de5aa20bb 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1718,7 +1718,7 @@ void perform_noise_estimation_dec_ivas_fx( #ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog[p] = msPeriodog_floor; #else - msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ + msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ #endif move32(); } -- GitLab From fe9bb29260994a1d31ffeadd2d97c06b7b8b150d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 2 Jun 2025 13:51:47 +0200 Subject: [PATCH 0915/1310] Add missing comment --- lib_dec/fd_cng_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index de5aa20bb..4855ab00e 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1709,7 +1709,7 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); #ifdef FIX_732_MS_PERIODOG_FLOOR - msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); + msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); /*Q31 - hFdCngDec->msPeriodog_exp*/ IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) #else IF( LT_32( msPeriodog[p], L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ) ) -- GitLab From 83928e2f89822be2c7a09a5b7c435763298e0f44 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 16 Jun 2025 10:17:26 +0200 Subject: [PATCH 0916/1310] Reduced bit precision at the input of con_tcx_ivas_fx() as a temporary workaround to see the pipeline results. --- lib_dec/ivas_mdct_core_dec_fx.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index a8e97b0cf..c818b7bf8 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1392,6 +1392,11 @@ void ivas_mdct_core_reconstruct_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth + + // Temporary workaround: con_tcx_ivas_fx() should be analyzed for potential issues. + Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); + Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); + /////////////////////////////////////////////////////////////////////////////////// #endif assert( EQ_16( st->bfi, 1 ) ); /* PLC: [TCX: TD PLC] */ -- GitLab From 33610b0cd69859e3d83aa905dcb746b67d5944ba Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 16 Jun 2025 14:01:41 +0530 Subject: [PATCH 0917/1310] Fix for crash --- lib_dec/fd_cng_dec_fx.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 4855ab00e..d7ca74edb 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1500,18 +1500,20 @@ void perform_noise_estimation_dec_ivas_fx( Word32 enr, enr_tot, enr_tot0; Word16 enr_e, enr_ratio, alpha; Word32 *msPeriodog; + Word32 *msNoiseEst; #ifdef FIX_732_MS_PERIODOG_FLOOR Word32 msPeriodog_floor; #endif - Word32 *msNoiseEst; Word32 *reIter; Word32 rescale_fac = 0; Word64 W_tmp; Word16 tmp_s, tmp_q, min_q = 31; Word16 q_shift; Word32 max_l; - Word16 norm_shift; - +#ifdef FIX_732_MS_PERIODOG_FLOOR + Word16 norm_shift, check = 0; + move16(); +#endif /* pointer initialization */ periodog = hFdCngDec->hFdCngCom->periodog; /*Q31 - hFdCngDec->hFdCngCom->periodog_exp*/ fftBuffer = hFdCngDec->hFdCngCom->fftBuffer; /*Q31 - hFdCngDec->hFdCngCom->fftBuffer_exp*/ @@ -1708,6 +1710,7 @@ void perform_noise_estimation_dec_ivas_fx( msPeriodog[p] = L_add( msPeriodog[p], L_tmp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); + #ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog_floor = L_max( 1, L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ) ); /*Q31 - hFdCngDec->msPeriodog_exp*/ IF( LT_32( msPeriodog[p], msPeriodog_floor ) ) @@ -1717,12 +1720,29 @@ void perform_noise_estimation_dec_ivas_fx( { #ifdef FIX_732_MS_PERIODOG_FLOOR msPeriodog[p] = msPeriodog_floor; + move32(); #else - msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ -#endif + msPeriodog[p] = L_shr( 21474 /*Q31*/, hFdCngDec->msPeriodog_exp ); /*Q31 - hFdCngDec->msPeriodog_exp*/ move32(); +#endif + } + } +#ifdef FIX_732_MS_PERIODOG_FLOOR + FOR( p = 0; p < npart; p++ ) + { + IF( GT_32( msPeriodog[p], 1 ) ) + { + check = 1; + move16(); + BREAK; } } + IF( check == 0 ) + { + hFdCngDec->msPeriodog_exp = 14; /* msPeriodog buffer will have minimum value as 1e-5f */ + move16(); + } +#endif } /* calculate total energy (short-term and long-term) */ -- GitLab From 0c10edbf4d33a44c0598f2f23377bc1a51f6f7e1 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 16 Jun 2025 10:44:45 +0200 Subject: [PATCH 0918/1310] Fix invalid memory access. --- lib_rend/ivas_dirac_rend_fx.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 0927ce826..82c30cceb 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4826,11 +4826,13 @@ static void ivas_masa_ext_dirac_render_sf_fx( } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[0], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[0] ); move16(); - FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) - { #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE + FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) #else + FOR( i = 0; hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_len > i; i = add( i, hSpatParamRendCom->num_freq_bands ) ) + { Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q ) #endif } -- GitLab From ef476d35b5bd7ecbaf644e44b3eea232c2ab9d0b Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 16 Jun 2025 11:02:48 +0200 Subject: [PATCH 0919/1310] clang format --- lib_rend/ivas_dirac_rend_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 82c30cceb..807b85fdf 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4406,7 +4406,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #else - Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); @@ -4477,7 +4477,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #else - Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q + Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_q[1], DirAC_mem.reference_power_smooth_q[1] ) ); // DirAC_mem.reference_power_q #endif } DirAC_mem.reference_power_smooth_q[1] = DirAC_mem.reference_power_q[1]; @@ -4488,7 +4488,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( reference_power_fix + CLDFB_NO_CHANNELS_HALF, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #else - Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q + Scale_sig32( reference_power_fix, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( DirAC_mem.reference_power_smooth_q[1], DirAC_mem.reference_power_q[1] ) ); // DirAC_mem.reference_power_smooth_q #endif DirAC_mem.reference_power_q[1] = DirAC_mem.reference_power_smooth_q[1]; move16(); @@ -4814,7 +4814,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( #ifdef FIX_1737_FIX_867_CLDFB_NRG_SCALE Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_max( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) #else - Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) + Scale_sig32( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_fx + CLDFB_NO_CHANNELS_HALF + i, s_min( 0, sub( hSpatParamRendCom->num_freq_bands, CLDFB_NO_CHANNELS_HALF ) ), sub( s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ), hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] ) ); // s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q, hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q ) #endif } hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1] = s_min( hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_q[1], hDirACRend->h_output_synthesis_psd_state.proto_power_smooth_prev_q[1] ); -- GitLab From 7a3493b834bedeae4f573dc4d88c52e5b86d890e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 16 Jun 2025 15:08:04 +0530 Subject: [PATCH 0920/1310] BASOPAddMantissa optimization removal in transient detection and compute_diffuseness --- lib_com/ivas_dirac_com_fx.c | 25 ------------------------- lib_com/ivas_transient_det_fx.c | 15 --------------- 2 files changed, 40 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index fa0e98996..14dd6c148 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -921,7 +921,6 @@ void computeDiffuseness_fixed( } /* Compute Diffuseness */ -#ifndef OPT_SBA_DEC_PATH p_tmp = intensity_slow_abs; exp2 = 0; move16(); @@ -960,30 +959,6 @@ void computeDiffuseness_fixed( move32(); } } -#else /* OPT_SBA_DEC_PATH */ - Word16 diff = sub( 62, q_ene ); - p_tmp = intensity_slow_abs; - FOR( i = 0; i < num_freq_bands; ++i ) - { - - exp1 = sub( 31, q_intensity_slow ); - tmp = Sqrt32( p_tmp[i], &exp1 ); - - tmp = BASOP_Util_Divide3232_Scale_newton( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); - q_tmp = sub( diff, add( exp1, exp2 ) ); - // bring to Q30 - tmp = L_shl_sat( tmp, sub( Q30, q_tmp ) ); - diffuseness[i] = L_sub( ONE_IN_Q30, tmp ); - move32(); - - if ( LT_32( diffuseness[i], 0 ) ) - { - diffuseness[i] = 0; - move32(); - } - } - -#endif /* OPT_SBA_DEC_PATH */ *q_diffuseness = Q30; move16(); diff --git a/lib_com/ivas_transient_det_fx.c b/lib_com/ivas_transient_det_fx.c index 02f8713a8..0a56732fa 100644 --- a/lib_com/ivas_transient_det_fx.c +++ b/lib_com/ivas_transient_det_fx.c @@ -44,11 +44,7 @@ *------------------------------------------------------------------------------------------*/ #define IVAS_TDET_PARM_ENV_EPS ( 1e-5f ) -#ifndef OPT_SBA_DEC_PATH #define IVAS_TDET_PARM_ENV_EPS_fx 21474 // Q31 -#else /* OPT_SBA_DEC_PATH */ -#define IVAS_TDET_PARM_ENV_EPS_fx ( 1407374884 ) // Q47 -#endif /* OPT_SBA_DEC_PATH */ #define IVAS_TDET_DUCK_MULT_FAC ( 590558003 ) // Q29 #define IVAS_TDET_PARM_TRANS_THR ( 107374182 ) // Q30 @@ -407,19 +403,8 @@ void ivas_td_decorr_get_ducking_gains_fx( FOR( i = 0; i < frame_len; i++ ) { // e_fast_fx[i] = L_add( L_abs( e_fast_fx[i] ), L_shr( IVAS_TDET_PARM_ENV_EPS_fx, q_factor_diff ) ); /*Q14*/ -#ifndef OPT_SBA_DEC_PATH e_fast_fx[i] = BASOP_Util_Add_Mant32Exp( L_abs( e_fast_fx[i] ), e_fast_e[i], IVAS_TDET_PARM_ENV_EPS_fx, 0, &e_fast_e[i] ); move32(); -#else /* OPT_SBA_DEC_PATH */ - Word32 tmp = L_abs( e_fast_fx[i] ); - Word16 nrm = norm_l( tmp ); - Word16 max_e = s_max( sub( e_fast_e[i], nrm ), 31 - 47 ); - max_e = add( max_e, 1 ); // 1 for headroom - e_fast_fx[i] = L_add( L_shr( tmp, sub( max_e, e_fast_e[i] ) ), L_shr( IVAS_TDET_PARM_ENV_EPS_fx, sub( max_e, 31 - 47 ) ) ); - move32(); - e_fast_e[i] = max_e; - move16(); -#endif /* OPT_SBA_DEC_PATH */ e_slow_fx[i] = e_fast_fx[i]; move32(); e_slow_e[i] = e_fast_e[i]; -- GitLab From 31ee5c6ad2a57de89fb393398218b071b7778775 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 16 Jun 2025 15:14:28 +0530 Subject: [PATCH 0921/1310] Clang formatting changes --- lib_com/cldfb_fx.c | 16 ++++++++-------- lib_com/ivas_transient_det_fx.c | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib_com/cldfb_fx.c b/lib_com/cldfb_fx.c index 5caa2b140..6c29d2a57 100644 --- a/lib_com/cldfb_fx.c +++ b/lib_com/cldfb_fx.c @@ -512,8 +512,8 @@ void cldfbAnalysis_ts_fx( rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -526,8 +526,8 @@ void cldfbAnalysis_ts_fx( iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 #else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 + iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 #endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -585,10 +585,10 @@ void cldfbAnalysis_ts_fx( i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 + r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 + i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 + i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 #endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ diff --git a/lib_com/ivas_transient_det_fx.c b/lib_com/ivas_transient_det_fx.c index 0a56732fa..fb8679ebc 100644 --- a/lib_com/ivas_transient_det_fx.c +++ b/lib_com/ivas_transient_det_fx.c @@ -43,8 +43,8 @@ * Local constants *------------------------------------------------------------------------------------------*/ -#define IVAS_TDET_PARM_ENV_EPS ( 1e-5f ) -#define IVAS_TDET_PARM_ENV_EPS_fx 21474 // Q31 +#define IVAS_TDET_PARM_ENV_EPS ( 1e-5f ) +#define IVAS_TDET_PARM_ENV_EPS_fx 21474 // Q31 #define IVAS_TDET_DUCK_MULT_FAC ( 590558003 ) // Q29 #define IVAS_TDET_PARM_TRANS_THR ( 107374182 ) // Q30 -- GitLab From 075d0b6792fe92e533edf4b0b66fdfb8b63fa021 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 16 Jun 2025 12:52:15 +0200 Subject: [PATCH 0922/1310] Modified Q_syn_Overl in the PLC calculation. Disabled temp. workaround for input of con_tcx_ivas_fx() --- lib_dec/ivas_mdct_core_dec_fx.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index c818b7bf8..e64117a33 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1099,8 +1099,8 @@ void ivas_mdct_core_reconstruct_fx( Word16 q_syn = 0; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 q_win; - Word16 q_winFB; + Word16 q_win = 0; + Word16 q_winFB = 0; #else #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_win = -1; @@ -1426,10 +1426,12 @@ void ivas_mdct_core_reconstruct_fx( st->Q_syn = q_syn; move16(); st->hTcxDec->Q_old_syn_Overl = add( st->hTcxDec->Q_old_syn_Overl, q_syn ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN st->hTcxDec->Q_syn_OverlFB = add( st->hTcxDec->Q_syn_OverlFB, q_syn ); move16(); + st->hTcxDec->Q_syn_Overl = add( st->hTcxDec->Q_syn_Overl, q_syn ); + move16(); #endif IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || ( st->hTcxDec->tcxConceal_recalc_exc != 0 ) ) -- GitLab From ba44162ebc011720272e3bd83aa27baadadbd042 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 16 Jun 2025 16:28:36 +0530 Subject: [PATCH 0923/1310] Fix for crash observed in complexity pipeline for stereo downmix --- lib_dec/er_dec_acelp_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/er_dec_acelp_fx.c b/lib_dec/er_dec_acelp_fx.c index e30553d38..b6e5f3171 100644 --- a/lib_dec/er_dec_acelp_fx.c +++ b/lib_dec/er_dec_acelp_fx.c @@ -557,7 +557,7 @@ void con_acelp_fx( tmp_32 = Mpy_32_16_1( st->Mode2_lp_gainc /*Q16*/, alpha /*Q14*/ ); /*Q31-16 = Q15*/ s_32 = norm_l( tmp_32 ); tmp_32 = L_shl( tmp_32, s_32 ); - tmp_16 = round_fx( tmp_32 ); + tmp_16 = round_fx_sat( tmp_32 ); s_16 = negate( s_32 ); s_16 = sub( s_16, -1 - 15 ); /*->Q15*/ -- GitLab From 8a609b985dff27ddc74a901f8c0575259db7c782 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 16 Jun 2025 16:34:06 +0530 Subject: [PATCH 0924/1310] Fix for 3GPP issue 1724: Renderer MASA output metadata difference - 2 Link #1724 --- lib_rend/ivas_masa_merge_fx.c | 107 ++++++++++++---------------------- lib_rend/ivas_prot_rend_fx.h | 4 +- lib_rend/ivas_stat_rend.h | 12 ++-- lib_rend/lib_rend_fx.c | 47 ++++++--------- 4 files changed, 60 insertions(+), 110 deletions(-) diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index 65829e1c8..d90076847 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -46,9 +46,25 @@ static void copy_masa_meta_tile_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, const UWord8 sf, const UWord8 band ); -static void full_stream_merge_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, Word32 inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne1_e, MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, Word32 inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne2_e ); +static void full_stream_merge_fx( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ + Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ + Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ +); -static void diffuse_meta_merge_1x1_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, MASA_DECODER_EXT_OUT_META_HANDLE inMeta, Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEne_e, MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word16 *inEneISM_e ); +static void diffuse_meta_merge_1x1_fx( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ + Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ + Word16 inEne_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 Exponent */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ + Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ + Word16 inEneISM_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ +); /*---------------------------------------------------------------------* @@ -144,14 +160,13 @@ void diffuse_meta_merge_1x1_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i : Input metadata 1 */ Word32 inEne_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 */ - Word16 *inEne_e, /* i : TF-energy of input 1 Exponent */ + Word16 inEne_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 1 Exponent */ MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i : Input metadata 2 */ Word32 inEneISM_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEneISM_e /* i : TF-energy of input 2 Exponent */ + Word16 inEneISM_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ) { Word8 sf, band; - Word16 max_e, in1_e[MASA_FREQUENCY_BANDS], i; FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) @@ -164,22 +179,13 @@ void diffuse_meta_merge_1x1_fx( tmp = BASOP_Util_Divide1616_Scale( inMeta->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); energyTimesRatio_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ - energyTimesRatio_e = add( inEne_e[sf], scale ); + energyTimesRatio_e = add( inEne_e[sf][band], scale ); + total_nrg_fx = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf][band], inEneISM_fx[sf][band], inEneISM_e[sf][band], &total_nrg_e ); - IF( GT_16( inEne_e[sf], inEneISM_e[sf] ) ) - { - total_nrg_fx = L_add( L_shr( inEne_fx[sf][band], 1 ), L_shr( inEneISM_fx[sf][band], add( sub( inEne_e[sf], inEneISM_e[sf] ), 1 ) ) ); /* Q(30 - inEne_e[sf]) */ - total_nrg_e = add( inEne_e[sf], 1 ); - } - ELSE - { - total_nrg_fx = L_add( L_shr( inEneISM_fx[sf][band], 1 ), L_shr( inEne_fx[sf][band], add( sub( inEneISM_e[sf], inEne_e[sf] ), 1 ) ) ); /* Q(30 - inEneISM_e[sf]) */ - total_nrg_e = add( inEneISM_e[sf], 1 ); - } /* target is original MASA diffuseness */ tmp = BASOP_Util_Divide1616_Scale( inMeta->diffuseToTotalRatio[sf][band], UINT8_MAX, &scale ); total_diff_nrg_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ - total_diff_nrg_e = add( inEne_e[sf], scale ); + total_diff_nrg_e = add( inEne_e[sf][band], scale ); /* criterion is mean of ISM ratio and new ratio */ dir_ratio_ism_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( inMetaISM->directToTotalRatio[0][sf][band], UINT8_MAX, &dir_ratio_ism_e ) ); @@ -191,7 +197,7 @@ void diffuse_meta_merge_1x1_fx( L_tmp1 = BASOP_Util_Add_Mant32Exp( dir_ratio_ism_fx, dir_ratio_ism_e, L_tmp2, scale, &tmp ); L_tmp1 = L_shr( L_tmp1, 1 ); energyTimesRatioISM_fx = Mpy_32_32( L_tmp1, inEneISM_fx[sf][band] ); /* Q( 31 - ( tmp + inEneISM_e[sf] ) ) */ - energyTimesRatioISM_e = add( tmp, inEneISM_e[sf] ); + energyTimesRatioISM_e = add( tmp, inEneISM_e[sf][band] ); IF( ( BASOP_Util_Cmp_Mant32Exp( energyTimesRatioISM_fx, energyTimesRatioISM_e, energyTimesRatio_fx, energyTimesRatio_e ) > 0 ) ) { @@ -264,29 +270,9 @@ void diffuse_meta_merge_1x1_fx( outMeta->spreadCoherence[1][sf][band] = 0u; move16(); - inEne_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf], inEneISM_fx[sf][band], inEneISM_e[sf], &in1_e[band] ); /* Update energy for subsequent mergings */ - move16(); - } - - max_e = in1_e[0]; - move16(); - FOR( i = 1; i < MASA_FREQUENCY_BANDS; i++ ) - { - if ( LT_16( max_e, in1_e[i] ) ) - { - max_e = in1_e[i]; - move16(); - } - } - - FOR( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - inEne_fx[sf][i] = L_shr( inEne_fx[sf][i], sub( max_e, in1_e[i] ) ); /* Q(31 - max_e) */ + inEne_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf][band], inEneISM_fx[sf][band], inEneISM_e[sf][band], &inEne_e[sf][band] ); /* Update energy for subsequent mergings */ move32(); } - - inEne_e[sf] = max_e; - move16(); } /* Set descriptive meta for mixed format */ @@ -318,16 +304,15 @@ void full_stream_merge_fx( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o : Merged metadata output */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ) { UWord8 n_dirs_1, n_dirs_2; UWord8 sf, band; - Word16 scale, tmp, dir_nrg_1_e, dir_nrg_2_e, max_e, i; - Word16 in1_e[MASA_FREQUENCY_BANDS]; + Word16 scale, tmp, dir_nrg_1_e, dir_nrg_2_e; Word32 dir_nrg_1_fx, dir_nrg_2_fx, L_tmp; /* full stream select based on total direct energy */ @@ -340,17 +325,17 @@ void full_stream_merge_fx( { tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); dir_nrg_1_fx = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ - dir_nrg_1_e = add( scale, inEne1_e[sf] ); + dir_nrg_1_e = add( scale, inEne1_e[sf][band] ); - tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); + tmp = BASOP_Util_Divide1616_Scale( inMeta2->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); dir_nrg_2_fx = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ - dir_nrg_2_e = add( scale, inEne2_e[sf] ); + dir_nrg_2_e = add( scale, inEne2_e[sf][band] ); IF( EQ_16( n_dirs_1, 2 ) ) { tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ - scale = add( scale, inEne1_e[sf] ); + scale = add( scale, inEne1_e[sf][band] ); dir_nrg_1_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_1_fx, dir_nrg_1_e, &dir_nrg_1_e ); } @@ -358,7 +343,7 @@ void full_stream_merge_fx( { tmp = BASOP_Util_Divide1616_Scale( inMeta2->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ - scale = add( scale, inEne2_e[sf] ); + scale = add( scale, inEne2_e[sf][band] ); dir_nrg_2_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_2_fx, dir_nrg_2_e, &dir_nrg_2_e ); } @@ -371,29 +356,9 @@ void full_stream_merge_fx( copy_masa_meta_tile_fx( outMeta, inMeta2, sf, band ); } - inEne1_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne1_fx[sf][band], inEne1_e[sf], inEne2_fx[sf][band], inEne2_e[sf], &in1_e[band] ); + inEne1_fx[sf][band] = BASOP_Util_Add_Mant32Exp( inEne1_fx[sf][band], inEne1_e[sf][band], inEne2_fx[sf][band], inEne2_e[sf][band], &inEne1_e[sf][band] ); move32(); } - - max_e = in1_e[0]; - move16(); - FOR( i = 1; i < MASA_FREQUENCY_BANDS; i++ ) - { - if ( LT_16( max_e, in1_e[i] ) ) - { - max_e = in1_e[i]; - move16(); - } - } - - FOR( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - inEne1_fx[sf][i] = L_shr( inEne1_fx[sf][i], sub( max_e, in1_e[i] ) ); /* Q( 31 - max_e ) */ - move32(); - } - - inEne1_e[sf] = max_e; - move16(); } /* Set descriptive meta for mixed format */ @@ -436,11 +401,11 @@ void ivas_prerend_merge_masa_metadata_fx( MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ) { /* mixing ISMs with non-ISM use different merge */ diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 7cd547cb8..8772b542e 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -1478,11 +1478,11 @@ void ivas_prerend_merge_masa_metadata_fx( MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i : Input metadata 1 */ IVAS_REND_AudioConfigType inType1, /* i : Type of input 1 */ Word32 inEne1_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - Word16 *inEne1_e, /* i/o: TF-energy of input 1 Exponent */ + Word16 inEne1_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1 Exponent */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i : Input metadata 2 */ IVAS_REND_AudioConfigType inType2, /* i : Type of input 2 */ Word32 inEne2_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i : TF-energy of input 2 */ - Word16 *inEne2_e /* i : TF-energy of input 2 Exponent */ + Word16 inEne2_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i : TF-energy of input 2 Exponent */ ); ivas_error masaPrerendOpen_fx( diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index ddf2b5942..bf13d40f8 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1565,9 +1565,8 @@ typedef struct ivas_mcmasa_ana_data_structure MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /*Exp :energy_e[][]*/ Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_exp[MAX_PARAM_SPATIAL_SUBFRAMES]; } MCMASA_ANA_DATA, *MCMASA_ANA_HANDLE; @@ -1601,10 +1600,8 @@ typedef struct ivas_omasa_ana_data_structure Word32 ism_azimuth_fx[MAX_NUM_OBJECTS]; Word32 ism_elevation_fx[MAX_NUM_OBJECTS]; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_q; + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];/*Exp :energy_e[][]*/ Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_exp[MAX_PARAM_SPATIAL_SUBFRAMES]; Word16 interpolator_fx[L_FRAME48k]; Word32 prev_object_dm_gains_fx[MAX_NUM_OBJECTS][MASA_MAX_TRANSPORT_CHANNELS]; @@ -1645,7 +1642,6 @@ typedef struct ivas_dirac_ana_data_structure Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_exp[MAX_PARAM_SPATIAL_SUBFRAMES]; } DIRAC_ANA_DATA, *DIRAC_ANA_HANDLE; /*----------------------------------------------------------------------------------* @@ -1661,8 +1657,8 @@ typedef struct ivas_masa_prerend_data_structure MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES]; + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];/*Exp :energy_e[][]*/ + Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; } MASA_PREREND_DATA, *MASA_PREREND_HANDLE; diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index b46d13610..3b800ed07 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -6669,7 +6669,6 @@ static void renderMasaToMasa( Word16 mrange[2]; Word16 brange[2]; Word16 numAnalysisChannels; - Word16 tmp_energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; copyBufferTo2dArray_fx( masaInput->base.inputBuffer, tmpBuffer_fx ); Word16 q_cldfb = *outAudio.pq_fact; Word16 q_cldfb_out = *outAudio.pq_fact; @@ -6692,6 +6691,7 @@ static void renderMasaToMasa( move16(); set_zero_fx( masaInput->hMasaPrerend->energy_fx[block_m_idx], MASA_FREQUENCY_BANDS ); + set16_fx( masaInput->hMasaPrerend->energy_e[block_m_idx], 0, MASA_FREQUENCY_BANDS ); FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { @@ -6746,30 +6746,14 @@ static void renderMasaToMasa( FOR( i = 0; i < numAnalysisChannels; i++ ) { Word32 temp = L_add( Mpy_32_32( Chan_RealBuffer_fx[0][j], Chan_RealBuffer_fx[0][j] ), Mpy_32_32( Chan_ImagBuffer_fx[0][j], Chan_ImagBuffer_fx[0][j] ) ); /* 2 * Q(q_cldfb_out + scale_factor) - 31 */ - masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx], tmp_energy_e[block_m_idx][band_m_idx], temp, shl( q_add, 1 ), &tmp_energy_e[block_m_idx][band_m_idx] ); + masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( masaInput->hMasaPrerend->energy_fx[block_m_idx][band_m_idx], masaInput->hMasaPrerend->energy_e[block_m_idx][band_m_idx], temp, shl( q_add, 1 ), &masaInput->hMasaPrerend->energy_e[block_m_idx][band_m_idx] ); move32(); } } } } } - FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - Word16 max_e = MIN_16; - move16(); - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - max_e = s_max( max_e, tmp_energy_e[i][j] ); - } - masaInput->hMasaPrerend->energy_e[i] = max_e; - move16(); - FOR( j = 0; j < MASA_FREQUENCY_BANDS; j++ ) - { - masaInput->hMasaPrerend->energy_fx[i][j] = L_shr( masaInput->hMasaPrerend->energy_fx[i][j], sub( max_e, tmp_energy_e[i][j] ) ); /* Q(31 - max_e) */ - move32(); - } - } /* Copy audio channels if mismatch in number of transports */ test(); test(); @@ -7067,8 +7051,8 @@ ivas_error IVAS_REND_MergeMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE inMeta2; Word32( *inEne1_fx )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word32( *inEne2_fx )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - Word16 *inEne1_e; - Word16 *inEne2_e; + Word16( *inEne1_e )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word16( *inEne2_e )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; IF( hIvasRend == NULL ) { @@ -7078,27 +7062,31 @@ ivas_error IVAS_REND_MergeMasaMetadata( /* Input1 metadata and energy */ IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) ) { + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; inEne1_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne1_e = ( hIvasRend->inputsIsm->hOMasa->energy_exp ); + inEne1_e = &( hIvasRend->inputsIsm->hOMasa->energy_e ); } ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; inEne1_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); - inEne1_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); + inEne1_e = &( hIvasRend->inputsMc->hMcMasa->energy_e ); } ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; inEne1_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); - inEne1_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); + inEne1_e = &( hIvasRend->inputsSba->hDirAC->energy_e ); } ELSE IF( EQ_32( inputType1, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) { + *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; inEne1_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); - inEne1_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); + inEne1_e = &( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); } ELSE { @@ -7110,25 +7098,26 @@ ivas_error IVAS_REND_MergeMasaMetadata( { inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; inEne2_fx = &( hIvasRend->inputsIsm->hOMasa->energy_fx ); - inEne2_e = ( hIvasRend->inputsIsm->hOMasa->energy_exp ); + inEne2_e = &( hIvasRend->inputsIsm->hOMasa->energy_e ); } ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) ) { inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; inEne2_fx = &( hIvasRend->inputsMc->hMcMasa->energy_fx ); - inEne2_e = ( hIvasRend->inputsMc->hMcMasa->energy_exp ); + inEne2_e = &( hIvasRend->inputsMc->hMcMasa->energy_e ); } ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; inEne2_fx = &( hIvasRend->inputsSba->hDirAC->energy_fx ); - inEne2_e = ( hIvasRend->inputsSba->hDirAC->energy_exp ); + inEne2_e = &( hIvasRend->inputsSba->hDirAC->energy_e ); } ELSE IF( EQ_32( inputType2, IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) ) { + inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; inEne2_fx = &( hIvasRend->inputsMasa->hMasaPrerend->energy_fx ); - inEne2_e = ( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); + inEne2_e = &( hIvasRend->inputsMasa->hMasaPrerend->energy_e ); } ELSE { @@ -7136,7 +7125,7 @@ ivas_error IVAS_REND_MergeMasaMetadata( } /* Merge metadata */ - ivas_prerend_merge_masa_metadata_fx( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1_fx, inEne1_e, inMeta2, inputType2, *inEne2_fx, inEne2_e ); + ivas_prerend_merge_masa_metadata_fx( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1_fx, *inEne1_e, inMeta2, inputType2, *inEne2_fx, *inEne2_e ); IF( EQ_32( hIvasRend->outputConfig, IVAS_AUDIO_CONFIG_MASA1 ) ) -- GitLab From a139264d27bfc6c877b0220d615059abfdc44304 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 16 Jun 2025 16:50:28 +0530 Subject: [PATCH 0925/1310] Clang formatting --- lib_rend/ivas_stat_rend.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index bf13d40f8..f8dad9a66 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1600,7 +1600,7 @@ typedef struct ivas_omasa_ana_data_structure Word32 ism_azimuth_fx[MAX_NUM_OBJECTS]; Word32 ism_elevation_fx[MAX_NUM_OBJECTS]; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];/*Exp :energy_e[][]*/ + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /*Exp :energy_e[][]*/ Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word16 interpolator_fx[L_FRAME48k]; Word32 prev_object_dm_gains_fx[MAX_NUM_OBJECTS][MASA_MAX_TRANSPORT_CHANNELS]; @@ -1657,7 +1657,7 @@ typedef struct ivas_masa_prerend_data_structure MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; SPHERICAL_GRID_DATA *sph_grid16; - Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS];/*Exp :energy_e[][]*/ + Word32 energy_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /*Exp :energy_e[][]*/ Word16 energy_e[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; } MASA_PREREND_DATA, *MASA_PREREND_HANDLE; -- GitLab From 621bd86289f297947a5d287895bcb6b8279001a1 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 16 Jun 2025 13:40:01 +0200 Subject: [PATCH 0926/1310] Disabled temp. workaround for input of con_tcx_ivas_fx() --- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index e64117a33..23639d47c 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1394,8 +1394,8 @@ void ivas_mdct_core_reconstruct_fx( Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth // Temporary workaround: con_tcx_ivas_fx() should be analyzed for potential issues. - Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); - Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); + //Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); + //Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); /////////////////////////////////////////////////////////////////////////////////// #endif assert( EQ_16( st->bfi, 1 ) ); -- GitLab From 0d5df82909be067c36662ae04bb74611787a4d4e Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 16 Jun 2025 13:44:35 +0200 Subject: [PATCH 0927/1310] Applied Clang patch. --- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 23639d47c..8beab3b3f 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1394,8 +1394,8 @@ void ivas_mdct_core_reconstruct_fx( Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth // Temporary workaround: con_tcx_ivas_fx() should be analyzed for potential issues. - //Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); - //Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); + // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); + // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); /////////////////////////////////////////////////////////////////////////////////// #endif assert( EQ_16( st->bfi, 1 ) ); -- GitLab From 005edb871fec4a89f392f799f978e1e8716f5a4f Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 16 Jun 2025 15:02:51 +0200 Subject: [PATCH 0928/1310] Modified q_win calculation for the case when all memory buffers are zero. Disabled Q_syn_Overl modification in PLC mode. --- lib_dec/dec_tcx_fx.c | 20 ++++++++++++++++---- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 4558de515..d0c4b1de3 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2613,14 +2613,26 @@ static Word16 IMDCT_ivas_fx_calc_qwin( q_win = 6; move16(); + Word16 q_scale_syn_Overl_TDAC ,q_scale_syn_Overl, q_scale_old_syn_Overl, q_scale_old_out; // q_win == norm + Q_syn_Overl_TDAC - q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ) + Q_syn_Overl_TDAC ); + q_scale_syn_Overl_TDAC = norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ); + q_win = s_min( q_win, q_scale_syn_Overl_TDAC + Q_syn_Overl_TDAC ); + // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); - q_win = s_min( q_win, norm_arr( syn_Overl, old_syn_Overl_len ) + Q_syn_Overl ); - q_win = s_min( q_win, norm_arr( old_syn_Overl, old_syn_Overl_len ) + Q_old_syn_Overl ); + q_scale_syn_Overl = norm_arr( syn_Overl, old_syn_Overl_len ); + q_win = s_min( q_win, q_scale_syn_Overl + Q_syn_Overl ); + + q_scale_old_syn_Overl = norm_arr( old_syn_Overl, old_syn_Overl_len ); + q_win = s_min( q_win, q_scale_old_syn_Overl + Q_old_syn_Overl ); + // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); - q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); + q_scale_old_out = norm_arr( old_out_fx, t ); + q_win = s_min( q_win, q_scale_old_out + Q_old_out_fx ); + + if ( q_scale_old_out == Q15 && q_scale_old_syn_Overl == Q15 && + q_scale_old_syn_Overl == Q15 && q_scale_syn_Overl_TDAC == Q15 ) + q_win = 0; #if 0 set16_zero_fx(syn_Overl_TDAC + oldLength / 2, (t-oldLength)/2 ); diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 8beab3b3f..a97589ddf 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1430,8 +1430,8 @@ void ivas_mdct_core_reconstruct_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN st->hTcxDec->Q_syn_OverlFB = add( st->hTcxDec->Q_syn_OverlFB, q_syn ); move16(); - st->hTcxDec->Q_syn_Overl = add( st->hTcxDec->Q_syn_Overl, q_syn ); - move16(); + //st->hTcxDec->Q_syn_Overl = add( st->hTcxDec->Q_syn_Overl, q_syn ); // It is disabled because it increased the number of regressions. + //move16(); #endif IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || ( st->hTcxDec->tcxConceal_recalc_exc != 0 ) ) -- GitLab From 2c4d19b0af211b502aea4e40ca4b794590417329 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 16 Jun 2025 15:18:53 +0200 Subject: [PATCH 0929/1310] Applied Clang formatting patch. --- lib_dec/dec_tcx_fx.c | 22 +++++++++++----------- lib_dec/ivas_mdct_core_dec_fx.c | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index d0c4b1de3..bb2c64cad 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2613,25 +2613,25 @@ static Word16 IMDCT_ivas_fx_calc_qwin( q_win = 6; move16(); - Word16 q_scale_syn_Overl_TDAC ,q_scale_syn_Overl, q_scale_old_syn_Overl, q_scale_old_out; + Word16 q_shift_syn_Overl_TDAC, q_shift_syn_Overl, q_shift_old_syn_Overl, q_shift_old_out; // q_win == norm + Q_syn_Overl_TDAC - q_scale_syn_Overl_TDAC = norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ); - q_win = s_min( q_win, q_scale_syn_Overl_TDAC + Q_syn_Overl_TDAC ); + q_shift_syn_Overl_TDAC = norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ); + q_win = s_min( q_win, q_shift_syn_Overl_TDAC + Q_syn_Overl_TDAC ); // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); - q_scale_syn_Overl = norm_arr( syn_Overl, old_syn_Overl_len ); - q_win = s_min( q_win, q_scale_syn_Overl + Q_syn_Overl ); + q_shift_syn_Overl = norm_arr( syn_Overl, old_syn_Overl_len ); + q_win = s_min( q_win, q_shift_syn_Overl + Q_syn_Overl ); - q_scale_old_syn_Overl = norm_arr( old_syn_Overl, old_syn_Overl_len ); - q_win = s_min( q_win, q_scale_old_syn_Overl + Q_old_syn_Overl ); + q_shift_old_syn_Overl = norm_arr( old_syn_Overl, old_syn_Overl_len ); + q_win = s_min( q_win, q_shift_old_syn_Overl + Q_old_syn_Overl ); // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); - q_scale_old_out = norm_arr( old_out_fx, t ); - q_win = s_min( q_win, q_scale_old_out + Q_old_out_fx ); + q_shift_old_out = norm_arr( old_out_fx, t ); + q_win = s_min( q_win, q_shift_old_out + Q_old_out_fx ); - if ( q_scale_old_out == Q15 && q_scale_old_syn_Overl == Q15 && - q_scale_old_syn_Overl == Q15 && q_scale_syn_Overl_TDAC == Q15 ) + if ( q_shift_syn_Overl_TDAC == Q15 && q_shift_syn_Overl == Q15 && + q_shift_old_syn_Overl == Q15 && q_shift_old_out == Q15 ) q_win = 0; #if 0 diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index a97589ddf..01569aa62 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1430,8 +1430,8 @@ void ivas_mdct_core_reconstruct_fx( #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN st->hTcxDec->Q_syn_OverlFB = add( st->hTcxDec->Q_syn_OverlFB, q_syn ); move16(); - //st->hTcxDec->Q_syn_Overl = add( st->hTcxDec->Q_syn_Overl, q_syn ); // It is disabled because it increased the number of regressions. - //move16(); + // st->hTcxDec->Q_syn_Overl = add( st->hTcxDec->Q_syn_Overl, q_syn ); // It is disabled because it increased the number of regressions. + // move16(); #endif IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || ( st->hTcxDec->tcxConceal_recalc_exc != 0 ) ) -- GitLab From f5ab4abf4abc6b62c93690c71f0681fa190585b8 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 16 Jun 2025 15:33:08 +0200 Subject: [PATCH 0930/1310] Fix crash because of overflow of proto_fac_fx. --- lib_dec/ivas_mc_param_dec_fx.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index c25ec972f..79c7b4d86 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -2356,13 +2356,21 @@ static void param_mc_protoSignalComputation_fx( FOR( band = 0; band < num_freq_bands; band++ ) { +#ifdef FIX_1737_proto_fac_overflow + Word32 tmp_x = L_shl( Mpy_32_32( fac_fx, ( *( p_real_buffer_fx++ ) ) ), 4 ); // Q(26 + 4 + 6 - 31) :: Q5 +#else Word32 tmp_x = Mpy_32_32( fac_fx, ( *( p_real_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 +#endif *( p_proto_frame_fx ) = L_add( *( p_proto_frame_fx ), tmp_x ); move32(); p_proto_frame_fx++; +#ifdef FIX_1737_proto_fac_overflow + tmp_x = L_shl( Mpy_32_32( fac_fx, ( *( p_imag_buffer_fx++ ) ) ), 4 ); // Q(26 + 4 + 6 - 31) :: Q5 +#else tmp_x = Mpy_32_32( fac_fx, ( *( p_imag_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 +#endif *( p_proto_frame_fx ) = L_add( *( p_proto_frame_fx ), tmp_x ); move32(); @@ -3596,7 +3604,11 @@ static ivas_error param_mc_get_diff_proto_info_fx( { p_diff_proto_info->source_chan_idx[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = cur_transport_ch; move16(); +#ifdef FIX_1737_proto_fac_overflow + p_diff_proto_info->proto_fac_fx[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = *proto_fac_ptr; // (proto_fac_fx)Q26 = Q26 +#else p_diff_proto_info->proto_fac_fx[cur_diff_proto][p_diff_proto_info->num_source_chan_diff[cur_diff_proto]] = L_shl( *proto_fac_ptr, 4 ); // (proto_fac_fx)Q26 + 4 = Q30 +#endif move16(); p_diff_proto_info->num_source_chan_diff[cur_diff_proto] = add( p_diff_proto_info->num_source_chan_diff[cur_diff_proto], 1 ); move16(); -- GitLab From 291381706b85e4f127520dfdc2c1e830248148a3 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 16 Jun 2025 15:33:50 +0200 Subject: [PATCH 0931/1310] Fix crash because of overflow of proto_fac_fx. --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index de89753d3..b90f78325 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -70,6 +70,7 @@ #define FIX_867_CLDFB_NRG_SCALE #define FIX_1737_FIX_867_CLDFB_NRG_SCALE +#define FIX_1737_proto_fac_overflow #define FIX_1378_ACELP_OUT_OF_BOUNDS -- GitLab From b21540b59f1d6cac6a5aee2a763befde42d383b1 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 16 Jun 2025 15:42:09 +0200 Subject: [PATCH 0932/1310] Use Q0 for synthFB_fx during PLC. Set Q_old_wtda and Q_old_wtdaLB to Q15 to avoid precision loss in case of zero signal for next frame. --- lib_dec/ivas_mdct_core_dec_fx.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 01569aa62..34bcb28cf 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1266,7 +1266,7 @@ void ivas_mdct_core_reconstruct_fx( /* Note: these buffers are not subframe-based, hence no indexing with k */ set16_fx( &st->hHQ_core->old_out_LB_fx[0], 0, L_frame[ch] ); set16_fx( &st->hHQ_core->old_out_fx[0], 0, L_frameTCX[ch] ); -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD_NO +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD st->hHQ_core->Q_old_wtda = Q15; st->hHQ_core->Q_old_wtda_LB = Q15; #endif @@ -1390,6 +1390,7 @@ void ivas_mdct_core_reconstruct_fx( ELSE /*ACELP core for ACELP-PLC */ { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN +#if 0 Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth @@ -1397,6 +1398,11 @@ void ivas_mdct_core_reconstruct_fx( // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); /////////////////////////////////////////////////////////////////////////////////// +#else + Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub(0, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth -> Q0 + Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( 0, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth -> Q0 + q_syn = 0; +#endif #endif assert( EQ_16( st->bfi, 1 ) ); /* PLC: [TCX: TD PLC] */ -- GitLab From 640760180870e2ddff2916cb6da4b0a010f10f5e Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 16 Jun 2025 15:43:08 +0200 Subject: [PATCH 0933/1310] clang format --- lib_dec/ivas_mc_param_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index 79c7b4d86..2ba8c9c9e 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -2359,7 +2359,7 @@ static void param_mc_protoSignalComputation_fx( #ifdef FIX_1737_proto_fac_overflow Word32 tmp_x = L_shl( Mpy_32_32( fac_fx, ( *( p_real_buffer_fx++ ) ) ), 4 ); // Q(26 + 4 + 6 - 31) :: Q5 #else - Word32 tmp_x = Mpy_32_32( fac_fx, ( *( p_real_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 + Word32 tmp_x = Mpy_32_32( fac_fx, ( *( p_real_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 #endif *( p_proto_frame_fx ) = L_add( *( p_proto_frame_fx ), tmp_x ); @@ -2369,7 +2369,7 @@ static void param_mc_protoSignalComputation_fx( #ifdef FIX_1737_proto_fac_overflow tmp_x = L_shl( Mpy_32_32( fac_fx, ( *( p_imag_buffer_fx++ ) ) ), 4 ); // Q(26 + 4 + 6 - 31) :: Q5 #else - tmp_x = Mpy_32_32( fac_fx, ( *( p_imag_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 + tmp_x = Mpy_32_32( fac_fx, ( *( p_imag_buffer_fx++ ) ) ); // Q(30 + 6 - 31) :: Q5 #endif *( p_proto_frame_fx ) = L_add( *( p_proto_frame_fx ), tmp_x ); -- GitLab From 30f647b1774771eb0d0fcb4d86b8b0c5c2af7668 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 16 Jun 2025 15:45:17 +0200 Subject: [PATCH 0934/1310] clang format --- lib_dec/ivas_mdct_core_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 34bcb28cf..74ba24767 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1399,7 +1399,7 @@ void ivas_mdct_core_reconstruct_fx( // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); /////////////////////////////////////////////////////////////////////////////////// #else - Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub(0, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth -> Q0 + Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( 0, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth -> Q0 Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( 0, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth -> Q0 q_syn = 0; #endif -- GitLab From cc34b55998423602810bcbf1a79aa3a3e39b1ae6 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 17 Jun 2025 09:52:33 +0200 Subject: [PATCH 0935/1310] Change ivas-basop-linux to ivas-linux to avoid taking runners allocated to main --- .gitlab-ci.yml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e35d0e290..6efbc33bf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1052,7 +1052,7 @@ branch-is-up-to-date-with-target-pre: stage: prevalidate needs: [] tags: - - ivas-basop-linux + - ivas-linux script: - *get-commits-behind-count - echo $commits_behind_count @@ -1067,7 +1067,7 @@ branch-is-up-to-date-with-target-post: - .rules-merge-request-to-main-pc stage: postvalidate tags: - - ivas-basop-linux + - ivas-linux script: - *get-commits-behind-count - echo $commits_behind_count @@ -1097,7 +1097,7 @@ check-naming-of-branch-for-main-pc-merges: - .rules-merge-request-to-main-pc stage: prevalidate tags: - - ivas-basop-linux + - ivas-linux script: - *update-scripts-repo - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then @@ -1114,7 +1114,7 @@ branch-is-up-to-date-with-target-pre: stage: prevalidate needs: [] tags: - - ivas-basop-linux + - ivas-linux script: - *get-commits-behind-count - | @@ -1128,7 +1128,7 @@ branch-is-up-to-date-with-target-post: - .rules-merge-request stage: postvalidate tags: - - ivas-basop-linux + - ivas-linux script: - *get-commits-behind-count - | @@ -1150,7 +1150,7 @@ clang-format-check: ARTIFACT_BASE_NAME: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--formatting-fix" stage: prevalidate tags: - - ivas-basop-linux + - ivas-linux needs: [] timeout: "5 minutes" script: @@ -1233,7 +1233,7 @@ build-codec-linux-make: extends: - .build-job-linux tags: - - ivas-basop-linux + - ivas-linux timeout: "10 minutes" script: - *print-common-info @@ -1251,7 +1251,7 @@ build-codec-linux-cmake: extends: - .build-job-linux tags: - - ivas-basop-linux + - ivas-linux timeout: "10 minutes" script: - *print-common-info @@ -1272,7 +1272,7 @@ build-codec-linux-instrumented-make: - .build-job-linux timeout: "10 minutes" tags: - - ivas-basop-linux + - ivas-linux script: - *print-common-info - *update-scripts-repo @@ -1286,7 +1286,7 @@ build-codec-sanitizers-linux: - .build-job-linux - .rules-basis tags: - - ivas-basop-linux + - ivas-linux timeout: "10 minutes" script: - *update-scripts-repo @@ -1703,7 +1703,7 @@ ivas-pytest-enc-msan: extends: - .test-job-linux tags: - - ivas-basop-linux-fast + - ivas-linux-fast before_script: - CLANG_NUM=1 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1714,7 +1714,7 @@ ivas-pytest-enc-asan: extends: - .test-job-linux tags: - - ivas-basop-linux-fast + - ivas-linux-fast before_script: - CLANG_NUM=2 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1725,7 +1725,7 @@ ivas-pytest-enc-usan: extends: - .test-job-linux tags: - - ivas-basop-linux-fast + - ivas-linux-fast before_script: - CLANG_NUM=3 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1793,7 +1793,7 @@ ivas-pytest-dec-msan: extends: - .test-job-linux tags: - - ivas-basop-linux-fast + - ivas-linux-fast before_script: - CLANG_NUM=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1804,7 +1804,7 @@ ivas-pytest-dec-asan: extends: - .test-job-linux tags: - - ivas-basop-linux-fast + - ivas-linux-fast before_script: - CLANG_NUM=2 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1815,7 +1815,7 @@ ivas-pytest-dec-usan: extends: - .test-job-linux tags: - - ivas-basop-linux-fast + - ivas-linux-fast before_script: - CLANG_NUM=3 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -2095,7 +2095,7 @@ voip-be-on-merge-request: - .rules-merge-request-no-draft timeout: "20 minutes" tags: - - ivas-basop-linux + - ivas-linux stage: test needs: ["build-codec-linux-make"] #, "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] script: @@ -2129,7 +2129,7 @@ renderer-pytest-on-merge-request: # TODO: set reasonable timeout, will most likely take less timeout: "20 minutes" tags: - - ivas-basop-linux + - ivas-linux stage: compare script: - *print-common-info @@ -2189,7 +2189,7 @@ ivas-pytest-on-merge-request: needs: ["build-codec-linux-make"] #, "codec-smoke-test"] timeout: "40 minutes" tags: - - ivas-basop-linux + - ivas-linux script: - *print-common-info - *get-commits-behind-count @@ -2682,7 +2682,7 @@ complexity-osba-in-binaural_room_ir-out: pages: stage: deploy tags: - - ivas-basop-linux + - ivas-linux rules: - if: $UPDATE_PAGES script: -- GitLab From ae57ace8debbfb3d25e1c45045a2fa79037285a2 Mon Sep 17 00:00:00 2001 From: malenov Date: Tue, 17 Jun 2025 11:05:24 +0200 Subject: [PATCH 0936/1310] cleanup --- lib_dec/fd_cng_dec_fx.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 1b30cb2e5..adf838f42 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -1504,19 +1504,18 @@ void perform_noise_estimation_dec_ivas_fx( Word32 msPeriodog_floor; #endif Word32 *msNoiseEst; -#ifdef FIX_732_MS_PERIODOG_FLOOR - Word32 msPeriodog_floor; -#endif Word32 *reIter; Word32 rescale_fac = 0; Word64 W_tmp; Word16 tmp_s, tmp_q, min_q = 31; Word16 q_shift; Word32 max_l; + Word16 norm_shift; #ifdef FIX_732_MS_PERIODOG_FLOOR - Word16 norm_shift, check = 0; + Word16 check = 0; move16(); #endif + /* pointer initialization */ periodog = hFdCngDec->hFdCngCom->periodog; /*Q31 - hFdCngDec->hFdCngCom->periodog_exp*/ fftBuffer = hFdCngDec->hFdCngCom->fftBuffer; /*Q31 - hFdCngDec->hFdCngCom->fftBuffer_exp*/ -- GitLab From d762be63cbf7dd0192c755d44f72c488f31471a1 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 17 Jun 2025 14:04:08 +0530 Subject: [PATCH 0937/1310] Bit exact optimization changes for sba enc path ivas_calc_p_coeffs_per_band_enc_fx, Interpol_lc_fx, RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx, RCcontextMapping_encode2_estimate_bandWise_fx funtions basop optimizations Gain of ~4 WMOPS. --- lib_com/interpol_fx.c | 5 + lib_com/ivas_spar_com_fx.c | 88 +++++++++++- lib_com/options.h | 1 + lib_enc/ACcontextMapping_enc_fx.c | 213 +++++++++++++++++++++++------- 4 files changed, 261 insertions(+), 46 deletions(-) diff --git a/lib_com/interpol_fx.c b/lib_com/interpol_fx.c index a490a7552..030d41735 100644 --- a/lib_com/interpol_fx.c +++ b/lib_com/interpol_fx.c @@ -70,9 +70,14 @@ Word32 Interpol_lc_fx( /* o : interpolated value c2 += up_samp; /* move16() not needed, since the coefficient can be rearrange in bit exact way */ c1 += up_samp; } +#ifdef OPT_SBA_ENC_V2_BE + L_sum = W_shl_sat_l( L_sum64, 1 ); /*Q15*/ + } +#else L_sum = W_sat_l( L_sum64 ); /*Q14*/ } L_sum = L_shl_sat( L_sum, 1 ); /*Q15*/ +#endif return L_sum; } diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index ef549a2ae..15a529149 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -2361,18 +2361,30 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( Word32 re1, re2; W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ pSparMd->band_coeffs[b_ts_idx].q_C_re_fx*/ +#ifdef OPT_SBA_ENC_V2_BE + q_tmp1 = sub( W_norm( W_tmp ), 32 ); + re1 = W_shl_sat_l( W_tmp, q_tmp1 ); /*q_cov_dd_re+ q_C_re+q_tmp1*/ + q_tmp1 = add( add( q_C_re, q_tmp1 ), q_cov_dd_re ); +#else q_tmp1 = W_norm( W_tmp ); re1 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); /*q_cov_dd_re+ q_C_re+q_tmp1-32*/ q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_cov_dd_re ), 32 ); +#endif if ( W_tmp == 0 ) { q_tmp1 = 31; move16(); } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], cov_dd_re[0][0] ); /*q_cov_dd_re+ q_C_re*/ +#ifdef OPT_SBA_ENC_V2_BE + q_tmp = sub( W_norm( W_tmp ), 32 ); + re2 = W_shl_sat_l( W_tmp, q_tmp ); /*q_cov_dd_re+ q_C_re+q_tmp*/ + q_tmp = add( add( q_C_re, q_tmp ), q_cov_dd_re ); +#else q_tmp = W_norm( W_tmp ); re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); /*q_cov_dd_re+ q_C_re+q_tmp-32*/ q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 ); +#endif if ( W_tmp == 0 ) { q_tmp = 31; @@ -2380,12 +2392,20 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1 ); // q_tmp1+q_C_re +#ifdef OPT_SBA_ENC_V2_BE + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[0][0] = W_shl_sat_l( W_tmp, q_factor ); // q_tmp1+q_C_re+q_recon_uu_re[0][0] + move32(); + q_recon_uu_re[0][0] = add( add( q_C_re, q_factor ), q_tmp1 ); + move16(); +#else q_recon_uu_re[0][0] = W_norm( W_tmp ); move16(); recon_uu_re[0][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][0] ) ); // q_tmp1+q_C_re+q_recon_uu_re[0][0]-32 move32(); q_recon_uu_re[0][0] = sub( add( add( q_C_re, q_recon_uu_re[0][0] ), q_tmp1 ), 32 ); move16(); +#endif if ( W_tmp == 0 ) { q_recon_uu_re[0][0] = 31; @@ -2393,12 +2413,20 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re1 ); // q_C_re+q_tmp1 +#ifdef OPT_SBA_ENC_V2_BE + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[0][1] = W_shl_sat_l( W_tmp, q_factor ); // q_C_re+q_tmp1+q_recon_uu_re[0][1] + move32(); + q_recon_uu_re[0][1] = add( add( q_C_re, q_factor ), q_tmp1 ); + move16(); +#else q_recon_uu_re[0][1] = W_norm( W_tmp ); move16(); recon_uu_re[0][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[0][1] ) ); // q_C_re+q_tmp1+q_recon_uu_re[0][1]-32 move32(); q_recon_uu_re[0][1] = sub( add( add( q_C_re, q_recon_uu_re[0][1] ), q_tmp1 ), 32 ); move16(); +#endif if ( W_tmp == 0 ) { q_recon_uu_re[0][1] = 31; @@ -2406,12 +2434,20 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re2 ); // q_C_re+q_tmp +#ifdef OPT_SBA_ENC_V2_BE + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[1][0] = W_shl_sat_l( W_tmp, q_factor ); // q_C_re+q_tmp+q_recon_uu_re[1][0] + move32(); + q_recon_uu_re[1][0] = add( add( q_C_re, q_factor ), q_tmp ); + move16(); +#else q_recon_uu_re[1][0] = W_norm( W_tmp ); move16(); recon_uu_re[1][0] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][0] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][0]-32 move32(); q_recon_uu_re[1][0] = sub( add( add( q_C_re, q_recon_uu_re[1][0] ), q_tmp ), 32 ); move16(); +#endif if ( W_tmp == 0 ) { q_recon_uu_re[1][0] = 31; @@ -2419,12 +2455,20 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[1][0], re2 ); // q_C_re+q_tmp +#ifdef OPT_SBA_ENC_V2_BE + q_factor = sub( W_norm( W_tmp ), 32 ); + recon_uu_re[1][1] = W_shl_sat_l( W_tmp, q_factor ); // q_C_re+q_tmp+q_recon_uu_re[1][1] + move32(); + q_recon_uu_re[1][1] = add( add( q_C_re, q_factor ), q_tmp ); + move16(); +#else q_recon_uu_re[1][1] = W_norm( W_tmp ); move16(); recon_uu_re[1][1] = W_extract_h( W_shl( W_tmp, q_recon_uu_re[1][1] ) ); // q_C_re+q_tmp+q_recon_uu_re[1][1]-32 move32(); q_recon_uu_re[1][1] = sub( add( add( q_C_re, q_recon_uu_re[1][1] ), q_tmp ), 32 ); move16(); +#endif if ( W_tmp == 0 ) { q_recon_uu_re[1][1] = 31; @@ -2441,12 +2485,18 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } } q_tmp = sub( s_min( q_tmp, q_cov_uu_re ), 1 ); - +#ifdef OPT_SBA_ENC_V2_BE + q_factor = sub( q_cov_uu_re, q_tmp ); +#endif FOR( i = 0; i < 2; i++ ) { FOR( j = 0; j < 2; j++ ) { +#ifdef OPT_SBA_ENC_V2_BE + cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], q_factor ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp +#else cov_uu_re[i][j] = L_sub( L_shr( cov_uu_re[i][j], sub( q_cov_uu_re, q_tmp ) ), L_shr( recon_uu_re[i][j], sub( q_recon_uu_re[i][j], q_tmp ) ) ); // q_tmp +#endif move32(); } } @@ -2466,9 +2516,15 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( { Word32 re; W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][k], cov_dd_re[k][j] ); // q_C_re+q_cov_dd_re +#ifdef OPT_SBA_ENC_V2_BE + q_tmp = sub( W_norm( W_tmp ), 33 ); + re = W_shl_sat_l( W_tmp, q_tmp ); // q_C_re+q_cov_dd_re+q_tmp + q_tmp = add( add( q_C_re, q_tmp ), q_cov_dd_re ); +#else q_tmp = sub( W_norm( W_tmp ), 1 ); re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32 q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 ); +#endif if ( W_tmp == 0 ) { q_tmp = 31; @@ -2492,9 +2548,15 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( } W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][0], re1[0] ); // q_C_re+q_re1[0] +#ifdef OPT_SBA_ENC_V2_BE + q_tmp = sub( W_norm( W_tmp ), 33 ); + re2 = W_shl_sat_l( W_tmp, q_tmp ); // q_C_re+q_re1[0]+q_tmp + q_tmp = add( add( q_C_re, q_tmp ), q_re1[0] ); +#else q_tmp = sub( W_norm( W_tmp ), 1 ); re2 = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[0]+q_tmp-32 q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[0] ), 32 ); +#endif if ( W_tmp == 0 ) { q_tmp = 31; @@ -2504,9 +2566,15 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( move32(); W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[0][1], re1[1] ); // q_C_re+q_re1[1] +#ifdef OPT_SBA_ENC_V2_BE + q_tmp1 = sub( W_norm( W_tmp ), 33 ); + re2 = W_shl_sat_l( W_tmp, q_tmp1 ); // q_C_re+q_re1[1]+q_tmp1 + q_tmp1 = add( add( q_C_re, q_tmp1 ), q_re1[1] ); +#else q_tmp1 = sub( W_norm( W_tmp ), 1 ); re2 = W_extract_h( W_shl( W_tmp, q_tmp1 ) ); // q_C_re+q_re1[1]+q_tmp1-32 q_tmp1 = sub( add( add( q_C_re, q_tmp1 ), q_re1[1] ), 32 ); +#endif if ( W_tmp == 0 ) { q_tmp1 = 31; @@ -2585,9 +2653,15 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( FOR( k = 0; k < num_dmx - 1; k++ ) { W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[i][k], cov_dd_re[k][m] ); // q_C_re+q_cov_dd_re +#ifdef OPT_SBA_ENC_V2_BE + q_tmp = sub( W_norm( W_tmp ), 34 ); + re = W_shl_sat_l( W_tmp, q_tmp ); // q_C_re+q_cov_dd_re+q_tmp + q_tmp = add( add( q_C_re, q_tmp ), q_cov_dd_re ); +#else q_tmp = sub( W_norm( W_tmp ), 2 ); re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_cov_dd_re+q_tmp-32 q_tmp = sub( add( add( q_C_re, q_tmp ), q_cov_dd_re ), 32 ); +#endif if ( W_tmp == 0 ) { q_tmp = 31; @@ -2627,9 +2701,15 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( FOR( m = 0; m < num_dmx - 1; m++ ) { W_tmp = W_mult0_32_32( pSparMd->band_coeffs[b_ts_idx].C_re_fx[j][m], re1[m] ); // q_C_re+q_re1[m] +#ifdef OPT_SBA_ENC_V2_BE + q_tmp = sub( W_norm( W_tmp ), 34 ); + re = W_shl_sat_l( W_tmp, q_tmp ); // q_C_re+q_re1[m]+q_tmp + q_tmp = add( add( q_C_re, q_tmp ), q_re1[m] ); +#else q_tmp = sub( W_norm( W_tmp ), 2 ); re = W_extract_h( W_shl( W_tmp, q_tmp ) ); // q_C_re+q_re1[m]+q_tmp-32 q_tmp = sub( add( add( q_C_re, q_tmp ), q_re1[m] ), 32 ); +#endif if ( W_tmp == 0 ) { q_tmp = 31; @@ -2714,9 +2794,15 @@ static void ivas_calc_p_coeffs_per_band_enc_fx( move16(); IF( trace != 0 ) { +#ifdef OPT_SBA_ENC_V2_BE + q_factor = sub( W_norm( trace ), 32 ); + tmp = Mpy_32_32( p_norm_scaling, W_shl_sat_l( trace, q_factor ) ); // q_cov_uu_re+q_factor + q_factor = add( q_cov_uu_re, q_factor ); +#else q_factor = W_norm( trace ); tmp = Mpy_32_32( p_norm_scaling, W_extract_h( W_shl( trace, q_factor ) ) ); // q_cov_uu_re+q_factor-32 q_factor = sub( add( q_cov_uu_re, q_factor ), 32 ); +#endif IF( GT_16( q_factor, q_postpred_cov_re ) ) { tmp = L_shr( tmp, sub( q_factor, q_postpred_cov_re ) ); // q_postpred_cov_re diff --git a/lib_com/options.h b/lib_com/options.h index ec5b35f46..7996f8d41 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,6 +80,7 @@ #define OPT_SBA_REND_V1_BE #define OPT_HEAD_ROT_REND_V1_BE #define OPT_SBA_DEC_V2_BE +#define OPT_SBA_ENC_V2_BE #define OPT_SBA_ENC_V1_BE #define OPT_BIN_RENDERER_V1 #define OPT_BIN_RENDERER_V2 diff --git a/lib_enc/ACcontextMapping_enc_fx.c b/lib_enc/ACcontextMapping_enc_fx.c index 5003712b7..0bbc78912 100644 --- a/lib_enc/ACcontextMapping_enc_fx.c +++ b/lib_enc/ACcontextMapping_enc_fx.c @@ -1249,6 +1249,10 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( k = 1; move16(); +#ifdef OPT_SBA_ENC_V2_BE + Word16 round_bit_estimate_fx; +#endif + WHILE( LT_16( k, nt / 2 ) ) { bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 1, Q23 ) ); @@ -1334,7 +1338,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( ctx = &c[L_or( p1, p2 )]; t = (UWord16) L_add( *ctx, rateFlag ); - IF( LT_16( nt_half, idx ) ) + if ( LT_16( nt_half, idx ) ) { t = add( t, ( 1 << NBITS_CONTEXT ) ); } @@ -1351,6 +1355,19 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( /* check while condition */ /* MSBs coding */ +#ifdef OPT_SBA_ENC_V2_BE + FOR( ; s_max( a1, b1 ) >= A_THRES; ) + { + pki = lookup[lev1]; /* ESC symbol */ + + bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] ); + bit_estimate_fx = W_add( bit_estimate_fx, MAKE_VARIABLE_QX( 2, Q23 ) ); + a1 = shr( a1, 1 ); + b1 = shr( b1, 1 ); + + lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); + } +#else WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) { pki = lookup[lev1]; /* ESC symbol */ @@ -1364,14 +1381,18 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( /* check while condition */ } - +#endif pki = lookup[lev1]; symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */ bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] ); +#ifdef OPT_SBA_ENC_V2_BE + IF( GT_64( bit_estimate_fx, W_shl( target, Q23 ) ) ) // Q23 +#else /* Should we truncate? */ IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) ) +#endif { stop2 = 1; move16(); @@ -1393,6 +1414,13 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( { lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); +#ifdef OPT_SBA_ENC_V2_BE + t = add( 13, lev1 ); + IF( lev1 <= 0 ) + { + t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); + } +#else IF( lev1 <= 0 ) { t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); @@ -1401,6 +1429,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( { t = add( 13, lev1 ); } +#endif *ctx = L_add( imult3216( L_and( *ctx, 0xf ), 16 ), t ); move32(); @@ -1425,15 +1454,21 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( } } /*end of the 2-tuples loop*/ - - total_output_bits = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ - +#ifdef OPT_SBA_ENC_V2_BE + total_output_bits = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ +#else + total_output_bits = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ +#endif IF( *stop ) { - total_output_bits = round_fx( W_extract_l( W_shr( nbits2_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ +#ifdef OPT_SBA_ENC_V2_BE + total_output_bits = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ +#else + total_output_bits = round_fx( W_extract_l( W_shr( nbits2_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ +#endif } - IF( stop2 ) + if ( stop2 ) { stop2 = total_output_bits; /* Q0 */ move16(); @@ -1455,8 +1490,11 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( hm_cfg->numPeakIndices = numPeakIndicesOrig; /* Q0 */ move16(); - +#ifdef OPT_SBA_ENC_V2_BE + return round_fx( L_add( W_shl_sat_l( nbits2_fx, -Q7 ), ONE_IN_Q14 ) ); /* Q0 */ +#else return round_fx( L_add( W_extract_l( W_shr( nbits2_fx, Q7 ) ), ONE_IN_Q14 ) ); /* Q0 */ +#endif } ELSE /* if (!hm_cfg) */ { @@ -1530,6 +1568,21 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( /* check while condition */ /* MSBs coding */ +#ifdef OPT_SBA_ENC_V2_BE + FOR( ; s_max( a1, b1 ) >= A_THRES; ) + { + pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */ + + bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] ); + bit_estimate_fx = W_add( bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) ); + + a1 = shr( a1, 1 ); + b1 = shr( b1, 1 ); + + lev1 = add( lev1, 1 ); + esc_nb = s_min( lev1, 3 ); + } +#else WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) { pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */ @@ -1546,15 +1599,18 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( /* check while condition */ } - +#endif pki = lookup[( esc_nb << ( NBITS_CONTEXT + NBITS_RATEQ ) )]; /* Q0 */ - move16(); symbol = add( a1, i_mult( A_THRES, b1 ) ); /* Q0 */ bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] ); /* Should we truncate? */ +#ifdef OPT_SBA_ENC_V2_BE + IF( GT_64( bit_estimate_fx, W_shl( target, Q23 ) ) ) // Q23 +#else IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) ) +#endif { overflow_flag = 1; move16(); @@ -1570,6 +1626,14 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( } } +#ifdef OPT_SBA_ENC_V2_BE + /* Update context for next 2-tuple */ + cp = add( 1, i_mult( add( a1, b1 ), add( esc_nb, 1 ) ) ); /* Q0 */ + if ( GE_16( esc_nb, 2 ) ) + { + cp = add( 12, esc_nb ); /* Q0 */ + } +#else /* Update context for next 2-tuple */ IF( LT_16( esc_nb, 2 ) ) { @@ -1579,59 +1643,94 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( { cp = add( 12, esc_nb ); /* Q0 */ } +#endif /*shift old bits and replace last 4 bits*/ s = (UWord16) L_add( L_shl( s, 4 ), cp ); t = s_and( s, 0xFF ); - } /*end of the 2-tuples loop*/ +#ifdef OPT_SBA_ENC_V2_BE + tot_bits2 = round_fx( W_shl_sat_l( nbits2_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ + round_bit_estimate_fx = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ +#else tot_bits2 = round_fx( W_extract_l( W_shr( nbits2_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ - IF( LT_16( lastnz2, lastnz ) ) /* Overflow occured because unable to code all tuples */ +#endif + if ( LT_16( lastnz2, lastnz ) ) /* Overflow occured because unable to code all tuples */ { overflow_flag = 1; move16(); } +#ifdef OPT_SBA_ENC_V2_BE + if ( EQ_16( mode, -1 ) ) + { + tot_bits2 = round_bit_estimate_fx; + move16(); + } +#else IF( EQ_16( mode, -1 ) ) { - tot_bits2 = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ + tot_bits2 = round_fx( W_shl_sat_l( bit_estimate_fx, -Q7 ) ); /* Q23 -> Q16 -> Q0 */ + } +#endif +#ifdef OPT_SBA_ENC_V2_BE + if ( overflow_flag == 0 ) /* No overflow */ + { + *stop = 0; + move16(); } + IF( overflow_flag != 0 ) /* Overflow */ + { + IF( *stop ) + { + *stop = tot_bits2; /* Q0 */ + move16(); + } + ELSE + { + *stop = round_bit_estimate_fx; + move16(); + } + } +#else IF( overflow_flag == 0 ) /* No overflow */ { *stop = 0; move16(); } ELSE /* Overflow */ + { + IF( *stop ) { - IF( *stop ){ - *stop = tot_bits2; /* Q0 */ + *stop = tot_bits2; /* Q0 */ + move16(); + } + ELSE + { + *stop = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ + move16(); + } + } +#endif + + *lastnz_out = lastnz; /* Q0 */ move16(); - } - ELSE - { - *stop = round_fx( W_extract_l( W_shr( bit_estimate_fx, Q7 ) ) ); /* Q23 -> Q16 -> Q0 */ + *nEncoded = lastnz2; /* Q0 */ move16(); - } -} + /* Safety mechanism to avoid overflow */ + test(); + IF( EQ_16( lastnz2, 2 ) && EQ_16( overflow_flag, 1 ) ) + { + FOR( k = 0; k < lastnz2; k++ ) + { + x[k] = 0; + move16(); + } + } -*lastnz_out = lastnz; /* Q0 */ -move16(); -*nEncoded = lastnz2; /* Q0 */ -move16(); -/* Safety mechanism to avoid overflow */ -test(); -IF( EQ_16( lastnz2, 2 ) && EQ_16( overflow_flag, 1 ) ) -{ - FOR( k = 0; k < lastnz2; k++ ) - { - x[k] = 0; - move16(); + return tot_bits2; } } -return tot_bits2; -} -} - /*-------------------------------------------------------------------* * RCcontextMapping_encode2_estimate_bandWise_start_fx() @@ -1743,6 +1842,15 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( /* Get context */ t = add( hContextMem->ctx, hContextMem->rateFlag ); /* Q0 */ +#ifdef OPT_SBA_ENC_V2_BE + tmp = ( 1 << NBITS_CONTEXT ); + move16(); + if ( GE_16( hContextMem->nt_half, idx ) ) + { + tmp = 0; + move16(); + } +#else IF( GE_16( hContextMem->nt_half, idx ) ) { tmp = 0; @@ -1751,6 +1859,7 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( { tmp = ( 1 << NBITS_CONTEXT ); } +#endif t = add( t, tmp ); /* Q0 */ @@ -1771,15 +1880,18 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( /* check while condition */ /* MSBs coding */ +#ifdef OPT_SBA_ENC_V2_BE + FOR( ; s_max( a1, b1 ) >= A_THRES; ) +#else WHILE( GE_16( s_max( a1, b1 ), A_THRES ) ) +#endif { pki = lookup[lev1]; /* Q0 */ - move16(); hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][VAL_ESC] ); hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, MAKE_NUMBER_QX( 2, Q23 ) ); - move32(); - move32(); + move64(); + move64(); // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][VAL_ESC]; @@ -1789,20 +1901,27 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( b1 = shr( b1, 1 ); lev1 = s_min( add( lev1, ( 1 << ( NBITS_CONTEXT + NBITS_RATEQ ) ) ), 2 << ( NBITS_CONTEXT + NBITS_RATEQ ) ); /* Q0 */ - /* check while condition */ + /* check while condition */ } pki = lookup[lev1]; /* Q0 */ - move16(); + symbol = add( a1, i_mult( A_THRES, b1 ) ); /* MSB symbol Q0*/ hContextMem->bit_estimate_fx = W_add( hContextMem->bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] ); - move32(); + move64(); // hContextMem->bit_estimate = hContextMem->bit_estimate + ari_bit_estimate_s17_LC[pki][symbol]; /* Update context */ lev1 = shr( lev1, NBITS_CONTEXT + NBITS_RATEQ ); +#ifdef OPT_SBA_ENC_V2_BE + t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */ + if ( lev1 > 0 ) + { + t = add( 13, lev1 ); /* Q0 */ + } +#else IF( lev1 <= 0 ) { t = add( 1, i_mult( add( a1, b1 ), add( lev1, 2 ) ) ); /* Q0 */ @@ -1811,12 +1930,16 @@ Word16 RCcontextMapping_encode2_estimate_bandWise_fx( { t = add( 13, lev1 ); /* Q0 */ } - +#endif hContextMem->ctx = add( i_mult( s_and( hContextMem->ctx, 0xf ), 16 ), t ); /* Q0 */ move16(); - } /*end of the 2-tuples loop*/ + } /*end of the 2-tuples loop*/ +#ifdef OPT_SBA_ENC_V2_BE + total_output_bits = round_fx( W_shl_sat_l( hContextMem->bit_estimate_fx, -Q7 ) ); /* Q0 */ +#else total_output_bits = round_fx( W_extract_l( W_shr( hContextMem->bit_estimate_fx, Q7 ) ) ); /* Q0 */ +#endif // total_output_bits = (Word16) ( hContextMem->bit_estimate + 0.5f ); -- GitLab From 3d8604007ee24a30d923c1e6a0c491327479a860 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 17 Jun 2025 17:12:13 +0530 Subject: [PATCH 0938/1310] Fix for SSNR deviation observed for one STV case --- lib_enc/ACcontextMapping_enc_fx.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_enc/ACcontextMapping_enc_fx.c b/lib_enc/ACcontextMapping_enc_fx.c index 0bbc78912..a7944410b 100644 --- a/lib_enc/ACcontextMapping_enc_fx.c +++ b/lib_enc/ACcontextMapping_enc_fx.c @@ -1251,6 +1251,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( #ifdef OPT_SBA_ENC_V2_BE Word16 round_bit_estimate_fx; + Word32 target_Q15 = L_shl( target, Q15 ); // Q15 #endif WHILE( LT_16( k, nt / 2 ) ) @@ -1388,7 +1389,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( bit_estimate_fx = W_add( bit_estimate_fx, ari_bit_estimate_s17_LC_fx[pki][symbol] ); #ifdef OPT_SBA_ENC_V2_BE - IF( GT_64( bit_estimate_fx, W_shl( target, Q23 ) ) ) // Q23 + IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15 #else /* Should we truncate? */ IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) ) @@ -1607,7 +1608,7 @@ Word16 RCcontextMapping_encode2_estimate_no_mem_s17_LCS_fx( /* Should we truncate? */ #ifdef OPT_SBA_ENC_V2_BE - IF( GT_64( bit_estimate_fx, W_shl( target, Q23 ) ) ) // Q23 + IF( GT_32( W_shl_sat_l( bit_estimate_fx, -Q8 ), target_Q15 ) ) // Q15 #else IF( GT_32( W_extract_l( W_shr( bit_estimate_fx, Q8 ) ), L_shl( target, Q15 ) ) ) #endif -- GitLab From 2362d2922d4ccdace84d9b27c6bde875cd78174b Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 17 Jun 2025 15:14:26 +0200 Subject: [PATCH 0939/1310] Modified dynamic q_win calculation in IMDCT_ivas_fx() --- lib_dec/dec_tcx_fx.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index bb2c64cad..7025ee066 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2613,26 +2613,17 @@ static Word16 IMDCT_ivas_fx_calc_qwin( q_win = 6; move16(); - Word16 q_shift_syn_Overl_TDAC, q_shift_syn_Overl, q_shift_old_syn_Overl, q_shift_old_out; // q_win == norm + Q_syn_Overl_TDAC - q_shift_syn_Overl_TDAC = norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ); - q_win = s_min( q_win, q_shift_syn_Overl_TDAC + Q_syn_Overl_TDAC ); + q_win = s_min( q_win, norm_arr( syn_Overl_TDAC, syn_Overl_TDAC_len ) + Q_syn_Overl_TDAC ); // q_win = s_min( q_win, norm_arr( syn_Overl, oldLength / 2 ) + Q_syn_Overl ); - q_shift_syn_Overl = norm_arr( syn_Overl, old_syn_Overl_len ); - q_win = s_min( q_win, q_shift_syn_Overl + Q_syn_Overl ); + q_win = s_min( q_win, norm_arr( syn_Overl, old_syn_Overl_len ) + Q_syn_Overl ); - q_shift_old_syn_Overl = norm_arr( old_syn_Overl, old_syn_Overl_len ); - q_win = s_min( q_win, q_shift_old_syn_Overl + Q_old_syn_Overl ); + q_win = s_min( q_win, norm_arr( old_syn_Overl, old_syn_Overl_len ) + Q_old_syn_Overl ); // q_win = s_min( q_win, norm_arr( old_out_fx, oldLength ) + Q_old_out_fx ); - q_shift_old_out = norm_arr( old_out_fx, t ); - q_win = s_min( q_win, q_shift_old_out + Q_old_out_fx ); - - if ( q_shift_syn_Overl_TDAC == Q15 && q_shift_syn_Overl == Q15 && - q_shift_old_syn_Overl == Q15 && q_shift_old_out == Q15 ) - q_win = 0; + q_win = s_min( q_win, norm_arr( old_out_fx, t ) + Q_old_out_fx ); #if 0 set16_zero_fx(syn_Overl_TDAC + oldLength / 2, (t-oldLength)/2 ); @@ -3471,7 +3462,15 @@ void IMDCT_ivas_fx( q_diff = sub( q_old_out, q_win ); #endif - +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + if ( allow_qwin_change ) + { + // sub( q_tmp_fx_32, q_win ) == -norm_arr( xn_buf_fx, L_frame ) + // q_tmp_fx_32 - q_win == -norm_arr( xn_buf_fx, L_frame ) + // q_win == q_tmp_fx_32 + norm_arr( xn_buf_fx, L_frame ) + q_win = s_min( q_win, add( q_tmp_fx_32, norm_arr( xn_buf_fx, L_frame ) ) ); + } +#endif Word16 diff = sub( q_tmp_fx_32, q_win ); FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -- GitLab From d45dfc4284e328e425dae1dd5bfa8496cae5220b Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 17 Jun 2025 15:28:39 +0200 Subject: [PATCH 0940/1310] Applied Clang formatting patch. --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 7025ee066..c808df560 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3464,7 +3464,7 @@ void IMDCT_ivas_fx( #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN if ( allow_qwin_change ) - { + { // sub( q_tmp_fx_32, q_win ) == -norm_arr( xn_buf_fx, L_frame ) // q_tmp_fx_32 - q_win == -norm_arr( xn_buf_fx, L_frame ) // q_win == q_tmp_fx_32 + norm_arr( xn_buf_fx, L_frame ) -- GitLab From 2e84f3f4edf07e2040c83909dc09457d43a326f4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 17 Jun 2025 12:41:36 +0530 Subject: [PATCH 0941/1310] Fix for 3GPP issue 986: Stereo decoding, 16-20 kHz difference Link #986 Differences existed due to an addition with a factor (0.001f) missing in fixed point code. Changes added to address the same. --- lib_com/swb_tbe_com_fx.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index e4d84ef23..fcd4e12ee 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6935,7 +6935,10 @@ void synthesise_fb_high_band_fx( Word32 temp1; Word32 ratio2; Word32 L_tmp; - Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; + Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp, sft, t_Q /* to store temporary Q for computations */; + Word64 P_ONE = 33; /* 0.001f in Q15 */ + move64(); + Word64 W_temp; /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; @@ -6982,17 +6985,28 @@ void synthesise_fb_high_band_fx( elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); #endif } + /* temp1 = sum2_f( tmp, L_FRAME48k ) + 0.001f */ temp1 = sum2_fx_mod( tmp, L_FRAME48k ); + t_Q = sub( shl( exp_tmp, 1 ), 8 ); + P_ONE = W_shl( P_ONE, sub( t_Q, 15 ) ); + + W_temp = W_add( P_ONE, temp1 ); + + sft = W_norm( W_temp ); + W_temp = W_shl( W_temp, sft ); + + temp1 = W_extract_h( W_temp ); + t_Q = sub( add( t_Q, sft ), 32 ); + L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/ exp = sub( sub( 31, tmp1 ), exp ); - exp2 = norm_l( temp1 ); - tmp2 = extract_h( L_shl( temp1, exp2 ) ); - exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/ + tmp2 = extract_h( temp1 ); + exp2 = sub( 31, t_Q ); exp = sub( exp2, exp ); /* Denormalize and substract */ IF( GT_16( tmp2, tmp3 ) ) -- GitLab From b3c03a1f9dde36299e6a4b6e6fcf14033cdac69a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 17 Jun 2025 17:09:22 +0530 Subject: [PATCH 0942/1310] EVS bit exactness fix --- lib_com/swb_tbe_com_fx.c | 45 +++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index fcd4e12ee..2cb51ae93 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6935,10 +6935,7 @@ void synthesise_fb_high_band_fx( Word32 temp1; Word32 ratio2; Word32 L_tmp; - Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp, sft, t_Q /* to store temporary Q for computations */; - Word64 P_ONE = 33; /* 0.001f in Q15 */ - move64(); - Word64 W_temp; + Word16 tmp3, tmp1, tmp2, exp, exp2, exp_tmp; /* Interpolate the white energy shaped gaussian excitation from 16 kHz to 48 kHz with zeros */ j = 0; @@ -6988,25 +6985,39 @@ void synthesise_fb_high_band_fx( /* temp1 = sum2_f( tmp, L_FRAME48k ) + 0.001f */ temp1 = sum2_fx_mod( tmp, L_FRAME48k ); - t_Q = sub( shl( exp_tmp, 1 ), 8 ); - P_ONE = W_shl( P_ONE, sub( t_Q, 15 ) ); - - W_temp = W_add( P_ONE, temp1 ); - - sft = W_norm( W_temp ); - W_temp = W_shl( W_temp, sft ); - - temp1 = W_extract_h( W_temp ); - t_Q = sub( add( t_Q, sft ), 32 ); - L_tmp = L_max( 1, fb_exc_energy ); /*Q(2*Q_fb_exc + 1)*/ exp = norm_l( L_tmp ); tmp3 = extract_h( L_shl( L_tmp, exp ) ); tmp1 = sub( add( Q_fb_exc, Q_fb_exc ), 8 ); /* 1-9*/ exp = sub( sub( 31, tmp1 ), exp ); - tmp2 = extract_h( temp1 ); - exp2 = sub( 31, t_Q ); + IF( element_mode != EVS_MONO ) + { + Word16 sft, t_Q; + Word64 P_ONE = 33; /* 0.001f in Q15 */ + move64(); + Word64 W_temp; + + t_Q = sub( shl( exp_tmp, 1 ), 8 ); + P_ONE = W_shl( P_ONE, sub( t_Q, 15 ) ); + + W_temp = W_add( P_ONE, temp1 ); + + sft = W_norm( W_temp ); + W_temp = W_shl( W_temp, sft ); + + temp1 = W_extract_h( W_temp ); + t_Q = sub( add( t_Q, sft ), 32 ); + + tmp2 = extract_h( temp1 ); + exp2 = sub( 31, t_Q ); + } + ELSE + { + exp2 = norm_l( temp1 ); + tmp2 = extract_h( L_shl( temp1, exp2 ) ); + exp2 = sub( sub( 31, sub( shl( exp_tmp, 1 ), 8 ) ), exp2 ); /* in Q15 (temp1 in Q9)*/ + } exp = sub( exp2, exp ); /* Denormalize and substract */ IF( GT_16( tmp2, tmp3 ) ) -- GitLab From 54a62ff95df0fbd04dcb3548d11fd8da304b9835 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 17 Jun 2025 17:22:45 +0530 Subject: [PATCH 0943/1310] Extension of #1593 fix into Encoder: plugged in pred_lt4_ivas_fx in encoder --- lib_com/rom_com.c | 29 +++++++-------------------- lib_com/rom_com.h | 18 ++++++++--------- lib_enc/acelp_core_switch_enc_fx.c | 4 ++-- lib_enc/enc_gen_voic_fx.c | 2 +- lib_enc/enc_pit_exc_fx.c | 2 +- lib_enc/ivas_core_pre_proc_front_fx.c | 8 ++++---- lib_enc/ivas_td_low_rate_enc_fx.c | 2 +- lib_enc/pitch_ol2_fx.c | 12 +++++++++-- lib_enc/pitch_ol_fx.c | 8 ++++---- lib_enc/pre_proc_fx.c | 8 ++++---- lib_enc/prot_fx_enc.h | 7 ++++--- lib_enc/transition_enc_fx.c | 12 +++++------ 12 files changed, 53 insertions(+), 59 deletions(-) diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 5d0a7f303..a64b37f7b 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -1273,28 +1273,6 @@ const Word16 sin_table256_fx[] = * 1/4 resolution interpolation filter (-3 dB at 0.913*fs/2) *----------------------------------------------------------------------------------*/ - -const Word16 inter4_2_fx_Q15[65] = -{//Q15 - 30801, - 28062, 20718, 11061, 1935, - -4294, -6533, -5195, -1846, - 1559, 3497, 3398, 1705, - -497, -2087, -2413, -1523, - -32, 1252, 1741, 1312, - 305, -710, -1237, -1087, - -426, 350, 848, 862, - 452, -119, -550, -650, - -418, -17, 330, 462, - 349, 85, -175, -306, - -265, -104, 76, 184, - 182, 93, -20, -98, - -110, -66, -3, 43, - 55, 37, 8, -13, - -20, -14, -4, 2, - 3, 1, 0, 0, -}; - const Word16 inter4_2_fx[] = {//evs table , some mismatch in values compared to float is observed 0, 1, 2, 1, @@ -1366,6 +1344,13 @@ const Word16 pitch_inter4_2[PIT_FIR_SIZE2] = 3/*0.000098f Q15*/, 2/*0.000048f Q15*/, 0/*0.000007f Q15*/, 0/*0.000000f Q15*/ }; /* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) */ +const Word32 L_pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1] = /* Q31 */ +{ + 1932735283, 1758701061, 1298905484, 711630983, 180298432, -162768528, + -280712608, -226956816, -100446400, 9592809, 59676424, 55065776, + 26996016, 4138201, -3373696, -1617055, 0 +}; +/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) */ const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1] = { 29491/*0.900000F Q15*/, diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index a87ee8d0d..a0a388bc6 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -172,16 +172,16 @@ extern const Word32 crit_bands_fx[]; extern const float sincos_t_ext[]; // fft_rel dep extern const Word16 sincos_t_rad3_fx[]; // Q15 extern const Word16 fft256_read_indexes[]; /* FFT Q0*/ -extern const Word16 inter4_2_fx_Q15[]; // Q15 /* 1/4 resolution interpolation filter */ extern const Word16 inter4_2_fx[]; -extern const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1]; /*1Q14*/ -extern const Word16 pitch_inter4_2[PIT_FIR_SIZE2]; /*Q15*/ -extern const Word32 L_pitch_inter4_2[PIT_FIR_SIZE2]; /*Q31*/ -extern const Word16 Assym_window_W16fx[]; // Q15 -extern const Word16 assym_window_16k_fx[]; // Q15 -extern const Word16 grid50_fx[( GRID50_POINTS - 1 ) / 2 - 1]; // Q15 -extern const Word16 grid40_fx[( GRID40_POINTS - 1 ) / 2 - 1]; // Q15 -extern const Word32 crit_bands_fx[]; /* Table of critical bands Q0*/ +extern const Word16 pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1]; /*1Q14*/ +extern const Word16 pitch_inter4_2[PIT_FIR_SIZE2]; /*Q15*/ +extern const Word32 L_pitch_inter4_1[UP_SAMP * L_INTERPOL1 + 1]; /*Q31*/ +extern const Word32 L_pitch_inter4_2[PIT_FIR_SIZE2]; /*Q31*/ +extern const Word16 Assym_window_W16fx[]; // Q15 +extern const Word16 assym_window_16k_fx[]; // Q15 +extern const Word16 grid50_fx[( GRID50_POINTS - 1 ) / 2 - 1]; // Q15 +extern const Word16 grid40_fx[( GRID40_POINTS - 1 ) / 2 - 1]; // Q15 +extern const Word32 crit_bands_fx[]; /* Table of critical bands Q0*/ extern const Word16 wind_sss_fx[LEN_WIN_SSS]; // Q15 /*window for modify_sf ana*/ extern const Word16 filter5_39s320_120_fx[]; // Q15 diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index 76fa6f151..aaaf08b26 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -632,7 +632,7 @@ static void encod_gen_voic_core_switch_ivas_fx( * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[0], &exc[0], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure @@ -708,7 +708,7 @@ static void encod_gen_voic_core_switch_ivas_fx( * long term prediction on the 2nd sub frame *-----------------------------------------------------------------*/ - pred_lt4( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[L_SUBFR], &exc[L_SUBFR], T0, T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); FOR( i = L_SUBFR; i < 2 * L_SUBFR; i++ ) { diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index a485a1bf3..da3555cdb 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -578,7 +578,7 @@ void encod_gen_voic_ivas_fx( * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr_fx], &exc_fx[i_subfr_fx], T0_fx, T0_frac_fx, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index bfdf46ea0..21cd474bd 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -744,7 +744,7 @@ void enc_pit_exc_ivas_fx( * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_subfr + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], *T0, *T0_frac, L_subfr + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure * or in case of floating point encoder & fixed p. decoder diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index fbd207e26..b378eabad 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1199,10 +1199,10 @@ ivas_error pre_proc_front_ivas_fx( IF( LE_32( element_brate, IVAS_32k ) ) { /* 1/4 pitch precision improvement */ - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[0], &voicing_fr_fx[0], 0, wsp_fx, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[1], &voicing_fr_fx[1], L_SUBFR, wsp_fx, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[2], &voicing_fr_fx[2], 2 * L_SUBFR, wsp_fx, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[3], &voicing_fr_fx[3], 3 * L_SUBFR, wsp_fx, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[0], &voicing_fr_fx[0], 0, wsp_fx, 7, element_mode ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr_fx[1], &voicing_fr_fx[1], L_SUBFR, wsp_fx, 7, element_mode ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[2], &voicing_fr_fx[2], 2 * L_SUBFR, wsp_fx, 7, element_mode ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr_fx[3], &voicing_fr_fx[3], 3 * L_SUBFR, wsp_fx, 7, element_mode ); } ELSE { diff --git a/lib_enc/ivas_td_low_rate_enc_fx.c b/lib_enc/ivas_td_low_rate_enc_fx.c index d10527a24..e2c12076d 100644 --- a/lib_enc/ivas_td_low_rate_enc_fx.c +++ b/lib_enc/ivas_td_low_rate_enc_fx.c @@ -285,7 +285,7 @@ void encod_gen_2sbfr( * Find adaptive exitation *-----------------------------------------------------------------*/ - pred_lt4( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, inter4_2_fx_Q15, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc[i_subfr], &exc[i_subfr], T0, T0_frac, 2 * L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); /*-----------------------------------------------------------------* * Gain clipping test to avoid unstable synthesis on frame erasure diff --git a/lib_enc/pitch_ol2_fx.c b/lib_enc/pitch_ol2_fx.c index 7ca13171e..cbeea8f1d 100644 --- a/lib_enc/pitch_ol2_fx.c +++ b/lib_enc/pitch_ol2_fx.c @@ -36,7 +36,8 @@ void pitch_ol2_fx( const Word16 pos, /* i : position in frame where to calculate the improv. */ const Word16 *wsp_fx, /* i : weighted speech for current frame and look-ahead */ /*Q_new-1+shift*/ - const Word16 delta /* i : delta for pitch search (2 or 7) */ + const Word16 delta, /* i : delta for pitch search (2 or 7) */ + const Word16 element_mode /* i : EVS or IVAS */ ) { Word16 i, t, step, fraction, t0_min, t0_max, t_min, t_max; @@ -158,7 +159,14 @@ void pitch_ol2_fx( IF( NE_32( t1, 1L ) ) { - pred_lt4( pt_wsp_fx, wsp_fr_fx, t0s, fraction, L_SUBFR, pitch_inter4_1, 4, PIT_UP_SAMP ); + IF( element_mode != EVS_MONO ) + { + pred_lt4_ivas_fx( pt_wsp_fx, wsp_fr_fx, t0s, fraction, L_SUBFR, L_pitch_inter4_1, 4, PIT_UP_SAMP ); + } + ELSE + { + pred_lt4( pt_wsp_fx, wsp_fr_fx, t0s, fraction, L_SUBFR, pitch_inter4_1, 4, PIT_UP_SAMP ); + } R0 = cor_max_fx; move16(); diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c index fdadcd318..79c55821e 100644 --- a/lib_enc/pitch_ol_fx.c +++ b/lib_enc/pitch_ol_fx.c @@ -2425,8 +2425,8 @@ void pitchDoubling_det_fx( IF( GE_16( T, PIT_MIN_12k8 ) ) { - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 0, wspeech, 2 ); - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], L_SUBFR, wspeech, 2 ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 0, wspeech, 2, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], L_SUBFR, wspeech, 2, EVS_MONO ); /* IF(sub(add(new_voicing[0],new_voicing[1]),add(voicing_fr[0],voicing_fr[1]))>0 */ IF( L_msu( L_msu( L_mac( L_mult( new_voicing[0], 8192 ), new_voicing[1], 8192 ), voicing_fr[0], 8192 ), voicing_fr[1], 8192 ) > 0 ) { @@ -2448,8 +2448,8 @@ void pitchDoubling_det_fx( IF( GE_16( T, PIT_MIN_12k8 ) ) { - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 2 * L_SUBFR, wspeech, 2 ); - pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], 3 * L_SUBFR, wspeech, 2 ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[0] ), &new_voicing[0], 2 * L_SUBFR, wspeech, 2, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_SHORTER, T, &( new_op_fr[1] ), &new_voicing[1], 3 * L_SUBFR, wspeech, 2, EVS_MONO ); /* IF(sub(add(new_voicing[0],new_voicing[1]),add(voicing_fr[2],voicing_fr[3]))>0) */ IF( L_msu( L_msu( L_mac( L_mult( new_voicing[0], 8192 ), new_voicing[1], 8192 ), voicing_fr[2], 8192 ), voicing_fr[3], 8192 ) > 0 ) { diff --git a/lib_enc/pre_proc_fx.c b/lib_enc/pre_proc_fx.c index f7ebc8298..dc3ec020a 100644 --- a/lib_enc/pre_proc_fx.c +++ b/lib_enc/pre_proc_fx.c @@ -458,10 +458,10 @@ void pre_proc_fx( IF( LE_32( st->total_brate, ACELP_24k40 ) ) { /* 1/4 pitch precision improvement */ - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7 ); - pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7 ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[0], &voicing_fr[0], 0, wsp, 7, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[0], &pitch_fr[1], &voicing_fr[1], L_SUBFR, wsp, 7, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[2], &voicing_fr[2], 2 * L_SUBFR, wsp, 7, EVS_MONO ); + pitch_ol2_fx( PIT_MIN_EXTEND, st->pitch[1], &pitch_fr[3], &voicing_fr[3], 3 * L_SUBFR, wsp, 7, EVS_MONO ); } ELSE { diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 6ef6991d4..dcdce25b6 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -437,13 +437,14 @@ void pitch_ol2_fx( const Word16 pit_min, /* i : minimum pitch value (20 or 29) */ const Word16 pitch_ol, /* i : pitch to be improved */ Word16 *pitch_fr_fx, - /* o : adjusted 1/4 fractional pitch */ /*Q7 */ + /* o : adjusted 1/4 fractional pitch */ /*Q7*/ Word16 *voicing_fr_fx, - /* o : adjusted 1/4 fractional voicing */ /*Q15 */ + /* o : adjusted 1/4 fractional voicing */ /*Q15*/ const Word16 pos, /* i : position in frame where to calculate the improv. */ const Word16 *wsp_fx, /* i : weighted speech for current frame and look-ahead */ /*Q_new-1+shift*/ - const Word16 delta /* i : delta for pitch search (2 or 7) */ + const Word16 delta, /* i : delta for pitch search (2 or 7) */ + const Word16 element_mode /* i : EVS or IVAS */ ); void pitch_ol_ivas_fx( diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index d0d627697..82e41026d 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -1214,7 +1214,7 @@ void transition_enc_ivas_fx( push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1263,7 +1263,7 @@ void transition_enc_ivas_fx( push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1327,7 +1327,7 @@ void transition_enc_ivas_fx( push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1352,7 +1352,7 @@ void transition_enc_ivas_fx( push_indice( hBstr, IND_PITCH, index, nBits ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1388,7 +1388,7 @@ void transition_enc_ivas_fx( pit_Q_enc_ivas_fx( hBstr, 0, nBits, 8, pit_flag, limit_flag, *T0, *T0_frac, T0_min, T0_max ); /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = tbe_celp_exc_offset( *T0, *T0_frac, st_fx->L_frame ); @@ -1639,7 +1639,7 @@ void transition_enc_ivas_fx( ELSE { /* Find the adaptive codebook vector - ACELP long-term prediction */ - pred_lt4( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); + pred_lt4_ivas_fx( &exc_fx[i_subfr], &exc_fx[i_subfr], *T0, *T0_frac, L_SUBFR + 1, L_pitch_inter4_2, L_INTERPOL2, PIT_UP_SAMP ); offset = L_deposit_l( 0 ); tmp = extract_l( L_mult( *T0_frac, 32 ) ); /*Q8, 0.25 in Q7*/ -- GitLab From 866710036f0ed869162200391bbbea931f63b67a Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 18 Jun 2025 00:18:49 +0200 Subject: [PATCH 0944/1310] fixed typo --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index cd71a7768..cf6c67104 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,7 +119,6 @@ #define FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC /* FhG: NON-BE!!! Simplify azimuth & elevation calculations, remove parameter mismatch for divide3232, fix copy/paste error for elevation */ #define FIX_ISSUE_1744_IVAS_DIRAC_GET_MONO_FLAG /* FhG: NON-BE!!! Simplify threshold - comparison, change (wrong) Equal-comparion to (correct) Greater-Than-comparison */ -======= #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ #endif -- GitLab From 554ca834e8b4838416978499f20294388a5dccdc Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 18 Jun 2025 14:19:21 +1000 Subject: [PATCH 0945/1310] spar com optimizations --- lib_com/ivas_spar_com_fx.c | 22 ++++++++++++++++++++++ lib_com/options.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 15a529149..60c9c8b79 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4257,10 +4257,19 @@ void ivas_get_spar_md_from_dirac_enc_fx( { Word32 norm_fx; Word16 norm_q; + +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + Word16 num_ch_order; +#else Word16 num_ch_order, hoa2_ch_order; +#endif num_ch_order = ivas_sba_get_nchan_fx( order, 0 ); +#ifndef NONBE_FIX_1748_SPAR_DIV_OPT hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 ); +#else + assert( order == 1 ); +#endif FOR( ch = 0; ch < num_ch_order; ch++ ) { @@ -4327,6 +4336,8 @@ void ivas_get_spar_md_from_dirac_enc_fx( } } +#ifndef NONBE_FIX_1748_SPAR_DIV_OPT + /*normalize 2nd order*/ norm_fx = 0; move32(); @@ -4426,6 +4437,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( move32(); } } +#endif } } @@ -4815,10 +4827,18 @@ void ivas_get_spar_md_from_dirac_fx( { Word32 norm_fx; Word16 norm_q; +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + Word16 num_ch_order; +#else Word16 num_ch_order, hoa2_ch_order; +#endif num_ch_order = ivas_sba_get_nchan_fx( order, 0 ); +#ifndef NONBE_FIX_1748_SPAR_DIV_OPT hoa2_ch_order = ivas_sba_get_nchan_fx( SBA_HOA2_ORDER, 0 ); +#else + assert( order == 1 ); +#endif FOR( ch = 0; ch < num_ch_order; ch++ ) { @@ -4885,6 +4905,7 @@ void ivas_get_spar_md_from_dirac_fx( } } +#ifndef NONBE_FIX_1748_SPAR_DIV_OPT /*normalize 2nd order*/ norm_fx = 0; move32(); @@ -4984,6 +5005,7 @@ void ivas_get_spar_md_from_dirac_fx( move32(); } } +#endif } } diff --git a/lib_com/options.h b/lib_com/options.h index 7996f8d41..ebb93fa2d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,4 +119,6 @@ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ +#define NONBE_FIX_1748_SPAR_DIV_OPT /*Dlb: issue 1748: SPAR common div optimizations*/ + #endif -- GitLab From feae45bed0fc4cfdbf964b2ff54154b54fdb71eb Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 18 Jun 2025 07:09:30 +0200 Subject: [PATCH 0946/1310] Clean up switches --- lib_com/options.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index edc3cbe10..31a1eae51 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -113,19 +113,14 @@ #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ -#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT -#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ +//#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #define NONBE_FIX_AVG_IAC_CLDFB_REVERB -#endif -#define FIX_OLD_BINARY_FORMAT /* Orange: trick to make tests succesful when changing hrtf binary format between ref and new branch*/ -#define FIX_OLD_BINARY_FILE /* Orange: current hrtf binary file in ref branch contains wrong values for fastconv value. This switch can be activated to compre running codec with and without hrtf file*/ +//#define FIX_OLD_BINARY_FORMAT /* Orange: trick to make tests succesful when changing hrtf binary format between ref and new branch*/ +//#define FIX_OLD_BINARY_FILE /* Orange: current hrtf binary file in ref branch contains wrong values for fastconv value. This switch can be activated to compre running codec with and without hrtf file*/ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ #define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ -#endif - //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define FIX_944_REMOVE_LS_RENDERER_CALL_IN_STEREO /* VA: issue 994: remove an obsolete call of function ivas_ls_setup_conversion() in stereo */ #define FIX_699_FILE_READER_JBM_TSM /* VA: issue 699: complement FileReader_getFilePath() logic for TSM and JBM */ -- GitLab From 40543cfecfd5f2b2d816eec6739ec5fafcd10e73 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 07:23:45 +0200 Subject: [PATCH 0947/1310] ivas_dirac_output_synthesis_dec_fx.c: change shl_ro to shr_r, invert shift factor and delete overflow flag --- lib_dec/dec_gen_voic_fx.c | 10 +++------- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 3 +-- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 6 ++---- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 14d9d1772..aa1a75b53 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -106,10 +106,6 @@ ivas_error decod_gen_voic_fx( gain_inov_fx = 0; error_fx = 0; gain_preQ_fx = 0; -#ifdef BASOP_NOGLOB_DECLARE_LOCAL - Flag Overflow = 0; - move32(); -#endif move16(); move32(); move32(); @@ -467,9 +463,9 @@ ivas_error decod_gen_voic_fx( test(); test(); test(); - IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( shl_ro( sp_enratio, sub( 15, Qsp_enratio ), &Overflow ), 4915 ) && /*compare with 0.15 in Q15*/ + IF( GT_16( shr_r( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( shr_r( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ + GT_16( shr_r( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ { diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index cc13c0148..3c1e49f32 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -128,7 +128,6 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, IF( sqrtXY != 0 ) { - Flag Overflow = 0; move32(); normCC = 0; move16(); @@ -136,7 +135,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normCC = add( normCC, 16 ); /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF - cc = shl_ro( cc, add( normXY, normCC ), &Overflow ); + cc = shr_r( cc, negate(add( normXY, normCC )) ); BASOP_SATURATE_WARNING_ON *energy = L_shr_r( L_deposit_l( sqrtXY ), normXY ); } diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index ba0ab8953..e68473c1d 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4082,11 +4082,10 @@ void ivas_lfe_synth_with_filters_fx( } ELSE { - Flag overFlow; lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp - lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp, &overFlow ); // Q15 + lfeGain_fx = shr_r( lfeGain_fx, negate(lfeGain_fx_exp) ); // Q15 } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { @@ -4095,11 +4094,10 @@ void ivas_lfe_synth_with_filters_fx( } ELSE { - Flag overFlow; transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp - transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp, &overFlow ); // Q15 + transportGain_fx = shr_r( transportGain_fx, negate(transportGain_fx_exp) ); // Q15 } j = 0; move16(); -- GitLab From 37e55195a94799639de8e410686184eec0e13d51 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 07:38:26 +0200 Subject: [PATCH 0948/1310] apply format patch --- lib_dec/dec_gen_voic_fx.c | 4 ++-- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index aa1a75b53..0ad876eb9 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -466,8 +466,8 @@ ivas_error decod_gen_voic_fx( IF( GT_16( shr_r( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ LT_16( shr_r( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ GT_16( shr_r( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ { IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) { diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index 3c1e49f32..a7b9d75ad 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -135,7 +135,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normCC = add( normCC, 16 ); /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF - cc = shr_r( cc, negate(add( normXY, normCC )) ); + cc = shr_r( cc, negate( add( normXY, normCC ) ) ); BASOP_SATURATE_WARNING_ON *energy = L_shr_r( L_deposit_l( sqrtXY ), normXY ); } diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index e68473c1d..571fd6b92 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4084,8 +4084,8 @@ void ivas_lfe_synth_with_filters_fx( { lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); - lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp - lfeGain_fx = shr_r( lfeGain_fx, negate(lfeGain_fx_exp) ); // Q15 + lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp + lfeGain_fx = shr_r( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { @@ -4096,8 +4096,8 @@ void ivas_lfe_synth_with_filters_fx( { transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); - transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp - transportGain_fx = shr_r( transportGain_fx, negate(transportGain_fx_exp) ); // Q15 + transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp + transportGain_fx = shr_r( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 } j = 0; move16(); -- GitLab From f42ce80b6108c2dc3636da2c0d64be049fb5afa2 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 18 Jun 2025 08:10:27 +0200 Subject: [PATCH 0949/1310] Temporarily disable HRTF model from file tests --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c73c057c6..0df727291 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -693,11 +693,11 @@ stages: - *check-up-to-date-in-comparison-jobs - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -k "not model" > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout -k "not model" > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE @@ -2214,7 +2214,7 @@ ivas-pytest-on-merge-request: ### prepare pytest # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -k "not model" ### Run test using branch scripts and input - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi @@ -2222,7 +2222,7 @@ ivas-pytest-on-merge-request: ### run pytest - exit_code=0 - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout -k "not model" || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check -- GitLab From 7ed09264fd00973fe5d3b44b11581746319a5fa2 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 06:14:02 +0000 Subject: [PATCH 0950/1310] change shr_r to shr_r_sat --- lib_dec/dec_gen_voic_fx.c | 6 +++--- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 0ad876eb9..297f61788 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -463,9 +463,9 @@ ivas_error decod_gen_voic_fx( test(); test(); test(); - IF( GT_16( shr_r( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shr_r( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( shr_r( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ + IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ + GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ { diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index a7b9d75ad..72627a5a0 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -135,7 +135,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normCC = add( normCC, 16 ); /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF - cc = shr_r( cc, negate( add( normXY, normCC ) ) ); + cc = shr_r_sat( cc, negate( add( normXY, normCC ) ) ); BASOP_SATURATE_WARNING_ON *energy = L_shr_r( L_deposit_l( sqrtXY ), normXY ); } diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 571fd6b92..ccdd172c7 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4085,7 +4085,7 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp - lfeGain_fx = shr_r( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 + lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { @@ -4097,7 +4097,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp - transportGain_fx = shr_r( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 + transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 } j = 0; move16(); -- GitLab From 88107f0fafbffbe7967623806426c84619c9b717 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 08:19:19 +0200 Subject: [PATCH 0951/1310] format patch --- lib_dec/dec_gen_voic_fx.c | 4 ++-- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 297f61788..ac1df74b2 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -466,8 +466,8 @@ ivas_error decod_gen_voic_fx( IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ { IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) { diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index ccdd172c7..7d47ea681 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4084,7 +4084,7 @@ void ivas_lfe_synth_with_filters_fx( { lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); - lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp + lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) @@ -4096,7 +4096,7 @@ void ivas_lfe_synth_with_filters_fx( { transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); - transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp + transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 } j = 0; -- GitLab From b39ec53c0da752036872aac66ac2ba477466422d Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 10:25:21 +0200 Subject: [PATCH 0952/1310] Added switch ISSUE_1751_replace_shl_ro, added casesensitive shl_sat or shr_r --- lib_com/options.h | 1 + lib_dec/dec_gen_voic_fx.c | 25 ++++++++++++++-- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 15 +++++++++- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 29 +++++++++++++++++-- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7996f8d41..b97f42247 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -107,6 +107,7 @@ #define VEC_ARITH_OPT_v1 #define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ #define FIX_1511_POC_RENORM /* NTT: Fix for issue 1511: Renorm for POC. */ +#define ISSUE_1751_replace_shl_ro #define TEST_HR #define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index ac1df74b2..d003b9731 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -463,11 +463,30 @@ ivas_error decod_gen_voic_fx( test(); test(); test(); - IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ +#ifdef ISSUE_1751_replace_shl_ro + Word16 op16_1 = sub( Qenratio, 15 ); + Word16 op16_2 = sub( Qenratio, 10 ); + Word16 op16_3 = sub( Qsp_enratio, 15 ); + +BASOP_SATURATE_WARNING_OFF + op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate(op16_1) ); + op16_2 = op16_2 >= 0 ? shr_r( sp_enratio, op16_2 ) : shl_sat( sp_enratio, negate( op16_2 ) ); + op16_3 = op16_3 >= 0 ? shr_r( sp_enratio, op16_3 ) : shl_sat( sp_enratio, negate( op16_3 ) ); +BASOP_SATURATE_WARNING_ON + + IF( GT_16( op16_1, 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( op16_2, 15360 ) && /*compare with 15.0 in Q10*/ + GT_16( op16_3, 4915 ) && /*compare with 0.15 in Q15*/ LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ +#else + Flag Overflow; + IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ + GT_16( shl_ro( sp_enratio, sub( 15, Qsp_enratio ), &Overflow ), 4915 ) && /*compare with 0.15 in Q15*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ +#endif { IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) { diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index 72627a5a0..34b75ed3e 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -135,7 +135,20 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normCC = add( normCC, 16 ); /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF - cc = shr_r_sat( cc, negate( add( normXY, normCC ) ) ); +#ifdef ISSUE_1751_replace_shl_ro + Word16 op1 = add( normXY, normCC ); + if ( op1 >= 0 ) + { + cc = shl_sat( cc, add( normXY, normCC ) ); + } + else + { + cc = shr_r( cc, negate( add( normXY, normCC ) ) ); + } +#else + Flag Overflow; + cc = shl_ro( cc, add( normXY, normCC ), &Overflow ); +#endif BASOP_SATURATE_WARNING_ON *energy = L_shr_r( L_deposit_l( sqrtXY ), normXY ); } diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 7d47ea681..2384b3ea5 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4085,7 +4085,19 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp - lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 +#ifdef ISSUE_1751_replace_shl_ro + if ( lfeGain_fx_exp >= 0 ) + { + lfeGain_fx = shl_sat( lfeGain_fx, lfeGain_fx_exp ); // Q15 + } + else + { + lfeGain_fx = shr_r( lfeGain_fx, negate(lfeGain_fx_exp) ); // Q15 + } +#else + Flag Overflow; + lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp &Overflow); // Q15 +#endif } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) { @@ -4097,7 +4109,20 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp - transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 +#ifdef ISSUE_1751_replace_shl_ro + if ( transportGain_fx_exp >= 0 ) + { + transportGain_fx = shl_sat( transportGain_fx, transportGain_fx_exp ); // Q15 + } + else + { + transportGain_fx = shr_r( transportGain_fx, negate(transportGain_fx_exp) ); // Q15 + } +#else + Flag Overflow; + transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp &Overflow); // Q15 +#endif + } j = 0; move16(); -- GitLab From aa0608609864633100221bb299ac8caa46f3fa8e Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 10:59:18 +0200 Subject: [PATCH 0953/1310] apply format patch --- lib_dec/dec_gen_voic_fx.c | 22 +++++++++---------- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 13 +++++------ 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index d003b9731..74eb0f51f 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -468,24 +468,24 @@ ivas_error decod_gen_voic_fx( Word16 op16_2 = sub( Qenratio, 10 ); Word16 op16_3 = sub( Qsp_enratio, 15 ); -BASOP_SATURATE_WARNING_OFF - op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate(op16_1) ); + BASOP_SATURATE_WARNING_OFF + op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate( op16_1 ) ); op16_2 = op16_2 >= 0 ? shr_r( sp_enratio, op16_2 ) : shl_sat( sp_enratio, negate( op16_2 ) ); op16_3 = op16_3 >= 0 ? shr_r( sp_enratio, op16_3 ) : shl_sat( sp_enratio, negate( op16_3 ) ); -BASOP_SATURATE_WARNING_ON + BASOP_SATURATE_WARNING_ON - IF( GT_16( op16_1, 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( op16_2, 15360 ) && /*compare with 15.0 in Q10*/ + IF( GT_16( op16_1, 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( op16_2, 15360 ) && /*compare with 15.0 in Q10*/ GT_16( op16_3, 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ #else Flag Overflow; - IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ + IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( shl_ro( enratio, sub( 10, Qenratio ), &Overflow ), 15360 ) && /*compare with 15.0 in Q10*/ GT_16( shl_ro( sp_enratio, sub( 15, Qsp_enratio ), &Overflow ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ #endif { IF( NE_32( ( error = DTFS_new_fx( &PREVP ) ), IVAS_ERR_OK ) ) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 2384b3ea5..5f69f0ec6 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4084,7 +4084,7 @@ void ivas_lfe_synth_with_filters_fx( { lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); - lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp + lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro if ( lfeGain_fx_exp >= 0 ) { @@ -4092,11 +4092,11 @@ void ivas_lfe_synth_with_filters_fx( } else { - lfeGain_fx = shr_r( lfeGain_fx, negate(lfeGain_fx_exp) ); // Q15 + lfeGain_fx = shr_r( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 } #else Flag Overflow; - lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp &Overflow); // Q15 + lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp & Overflow ); // Q15 #endif } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) @@ -4108,7 +4108,7 @@ void ivas_lfe_synth_with_filters_fx( { transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); - transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp + transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro if ( transportGain_fx_exp >= 0 ) { @@ -4116,13 +4116,12 @@ void ivas_lfe_synth_with_filters_fx( } else { - transportGain_fx = shr_r( transportGain_fx, negate(transportGain_fx_exp) ); // Q15 + transportGain_fx = shr_r( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 } #else Flag Overflow; - transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp &Overflow); // Q15 + transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp & Overflow ); // Q15 #endif - } j = 0; move16(); -- GitLab From 1508027f28c3dc08cf43aab7e680f020e57b6820 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 12:14:51 +0200 Subject: [PATCH 0954/1310] add asserts to catch all shl_sat, replacing shl_ro --- lib_dec/dec_gen_voic_fx.c | 4 ++++ lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 1 + lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 2 ++ 3 files changed, 7 insertions(+) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 74eb0f51f..c61d3b56f 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -468,6 +468,10 @@ ivas_error decod_gen_voic_fx( Word16 op16_2 = sub( Qenratio, 10 ); Word16 op16_3 = sub( Qsp_enratio, 15 ); + assert( op16_1 >= 0 ); + assert( op16_2 >= 0 ); + assert( op16_3 >= 0 ); + BASOP_SATURATE_WARNING_OFF op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate( op16_1 ) ); op16_2 = op16_2 >= 0 ? shr_r( sp_enratio, op16_2 ) : shl_sat( sp_enratio, negate( op16_2 ) ); diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index 34b75ed3e..dd50ac111 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -137,6 +137,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); + assert( op1 >= 0 ); if ( op1 >= 0 ) { cc = shl_sat( cc, add( normXY, normCC ) ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 5f69f0ec6..d8f256b57 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4086,6 +4086,7 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro + assert( lfeGain_fx_exp >= 0 ); if ( lfeGain_fx_exp >= 0 ) { lfeGain_fx = shl_sat( lfeGain_fx, lfeGain_fx_exp ); // Q15 @@ -4110,6 +4111,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro + assert( transportGain_fx_exp >= 0 ); if ( transportGain_fx_exp >= 0 ) { transportGain_fx = shl_sat( transportGain_fx, transportGain_fx_exp ); // Q15 -- GitLab From fedc78528f2b7e6081e7e83a406ca28bdfda7f95 Mon Sep 17 00:00:00 2001 From: Arnaud Lefort Date: Wed, 18 Jun 2025 12:40:15 +0200 Subject: [PATCH 0955/1310] Compilation warnings removed. --- lib_enc/ivas_stereo_dmx_evs_fx.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index 8e960d71e..e2500aeef 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -108,9 +108,9 @@ #define STEREO_DMX_EVS_SGC_GIR_S 32617 // 1/1.00461543f #define STEREO_DMX_EVS_SGC_GL 32391 // 0.9885f #define STEREO_DMX_EVS_SGC_GH 33148 // 1.0116f -#define STEREO_DMX_EVS_SGC_LEGY_THRES_16 2.5E8 -#define STEREO_DMX_EVS_SGC_LEGY_THRES_32 3.E8 -#define STEREO_DMX_EVS_SGC_LEGY_THRES_48 5.E8 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_16 250000000 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_32 300000000 +#define STEREO_DMX_EVS_SGC_LEGY_THRES_48 500000000 #define STEREO_DMX_EVS_SGC_LEGY_THRES_E 22 #define STEREO_DMX_EVS_SGC_GMAX 46340 // 1.4142f #define STEREO_DMX_EVS_SGC_GMIN 23170 // 0.7071f @@ -2116,7 +2116,8 @@ static void apply_gain_sgc( } W_tmp = W_mult_32_32( *gain, lr ); - *gain = W_shr( W_tmp, 16 ); + W_tmp = W_shr( W_tmp, 16 ); + *gain = W_extract_l( W_tmp ); return; } @@ -2634,11 +2635,9 @@ void stereo_dmx_evs_enc_fx( } Copy_Scale_sig32_16( p_dmx_data, data, n_samples, 5 ); // Q26->Q15 - pop_wmops(); pop_wmops(); - return; } -- GitLab From 54d86d4ed995b750a84dc5b2fa33c556305ca12c Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 18 Jun 2025 20:52:04 +1000 Subject: [PATCH 0956/1310] simplify spherical harm response normalization, non-BE --- lib_com/ivas_spar_com_fx.c | 47 +++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 60c9c8b79..65e4b1c29 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4017,7 +4017,12 @@ void ivas_compute_spar_params_fx( Word32 diff_norm_order1_table[4] = { 0, 805306368, 402653184, 268435456 }; // q28 Word32 diff_norm_order2_table[6] = { 0, 1342177280, 671088640, 447392416, 335544320, 268435456 }; // q28 Word32 diff_norm_order3_table[8] = { 0, 1879048192, 939524096, 626349376, 469762048, 375809632, 313174688, 268435456 }; // q28 -#define EPSILON_FX_THR 70 +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT +#define EPSILON_FX_SHIFT 6 +#define EPSILON_FX_THR ( 1 << EPSILON_FX_SHIFT ) +#else +#define EPSILON_FX_THR 70 +#endif #define ONE_BY_THREE_Q31 715827882 #define ONE_BY_FIVE_Q31 429496729 #define ONE_BY_SEVEN_Q31 306783378 @@ -4310,6 +4315,25 @@ void ivas_get_spar_md_from_dirac_enc_fx( move16(); } norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 + +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + IF( LT_32( norm_fx, EPSILON_FX_THR ) ) + { + FOR( ch = 1; ch < foa_ch; ch++ ) + { + /*when control comes here, response_avg_fx[ch] should be less than EPSILON*/ + response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( Q30, EPSILON_FX_SHIFT ) ); // q30 + move32(); + } + } + ELSE + { + response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 + move32(); + response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + move32(); + } +#else FOR( ch = 1; ch < foa_ch; ch++ ) { IF( LT_32( norm_fx, EPSILON_FX_THR ) ) @@ -4335,6 +4359,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( move32(); } } +#endif #ifndef NONBE_FIX_1748_SPAR_DIV_OPT @@ -4879,6 +4904,25 @@ void ivas_get_spar_md_from_dirac_fx( move16(); } norm_fx = L_shr( norm_fx, sub( 1, norm_q ) ); // q30 + +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + IF( LT_32( norm_fx, EPSILON_FX_THR ) ) + { + FOR( ch = 1; ch < foa_ch; ch++ ) + { + /*when control comes here, response_avg_fx[ch] should be less than EPSILON*/ + response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( Q30, EPSILON_FX_SHIFT ) ); // q30 + move32(); + } + } + ELSE + { + response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 + move32(); + response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + move32(); + } +#else FOR( ch = 1; ch < foa_ch; ch++ ) { IF( LT_32( norm_fx, EPSILON_FX_THR ) ) @@ -4904,6 +4948,7 @@ void ivas_get_spar_md_from_dirac_fx( move32(); } } +#endif #ifndef NONBE_FIX_1748_SPAR_DIV_OPT /*normalize 2nd order*/ -- GitLab From 1079d508be1e4cc6aad38c80828268594d19ef2c Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 13:01:04 +0200 Subject: [PATCH 0957/1310] check asserts for shl_ro : insert asserts for other direction --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 3 ++- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index dd50ac111..1e1b33ff1 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -137,7 +137,8 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); - assert( op1 >= 0 ); + // assert( op1 >= 0 ); FAILS + assert( op1 <= 0 ); if ( op1 >= 0 ) { cc = shl_sat( cc, add( normXY, normCC ) ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index d8f256b57..17a821adb 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4086,7 +4086,8 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro - assert( lfeGain_fx_exp >= 0 ); + // assert( lfeGain_fx_exp >= 0 ); FAILS + assert( lfeGain_fx_exp <= 0 ); if ( lfeGain_fx_exp >= 0 ) { lfeGain_fx = shl_sat( lfeGain_fx, lfeGain_fx_exp ); // Q15 -- GitLab From 0591e5765e735029061727ed1021d8d2e805784a Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 15:12:11 +0200 Subject: [PATCH 0958/1310] shl_ro: change asserts and run once again --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 17a821adb..b0c193006 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4112,7 +4112,8 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro - assert( transportGain_fx_exp >= 0 ); + //assert( transportGain_fx_exp >= 0 ); FAILS + assert( transportGain_fx_exp <= 0 ); if ( transportGain_fx_exp >= 0 ) { transportGain_fx = shl_sat( transportGain_fx, transportGain_fx_exp ); // Q15 -- GitLab From 6c14262bb9160ccee761365349d061b4f5b4c541 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 15:15:23 +0200 Subject: [PATCH 0959/1310] clang patch --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index b0c193006..9076dd2c2 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4112,7 +4112,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro - //assert( transportGain_fx_exp >= 0 ); FAILS + // assert( transportGain_fx_exp >= 0 ); FAILS assert( transportGain_fx_exp <= 0 ); if ( transportGain_fx_exp >= 0 ) { -- GitLab From 0b03383556848ad4d5f5662cfd0b5a4383e97733 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 15:43:17 +0200 Subject: [PATCH 0960/1310] shl_ro: edit one more assert, run once more --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index 1e1b33ff1..e07472aef 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -138,7 +138,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); // assert( op1 >= 0 ); FAILS - assert( op1 <= 0 ); + //assert( op1 <= 0 ); FAILS --> twoway needed if ( op1 >= 0 ) { cc = shl_sat( cc, add( normXY, normCC ) ); -- GitLab From d2dee91e120afee46014166f97588ac8d72435d3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 18 Jun 2025 15:56:25 +0200 Subject: [PATCH 0961/1310] clang patch --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index e07472aef..71e221a61 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -138,7 +138,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); // assert( op1 >= 0 ); FAILS - //assert( op1 <= 0 ); FAILS --> twoway needed + // assert( op1 <= 0 ); FAILS --> twoway needed if ( op1 >= 0 ) { cc = shl_sat( cc, add( normXY, normCC ) ); -- GitLab From 6f2d744f1a96901fd95c3200cd338ad65b43c495 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:34:55 +0200 Subject: [PATCH 0962/1310] Fixed memory allocation errors for Binaural Room Reverb cases --- .gitlab-ci.yml | 8 ++++---- lib_rend/ivas_reverb_fx.c | 10 ++++++---- lib_rend/ivas_reverb_utils_fx.c | 34 ++++++++++++++++----------------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0df727291..c73c057c6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -693,11 +693,11 @@ stages: - *check-up-to-date-in-comparison-jobs - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -k "not model" > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout -k "not model" > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE @@ -2214,7 +2214,7 @@ ivas-pytest-on-merge-request: ### prepare pytest # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -k "not model" + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 ### Run test using branch scripts and input - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi @@ -2222,7 +2222,7 @@ ivas-pytest-on-merge-request: ### run pytest - exit_code=0 - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout -k "not model" || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index deb2d3285..00513d30e 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2520,16 +2520,18 @@ ivas_error ivas_binaural_reverb_init( { float t60_temp[CLDFB_NO_CHANNELS_MAX]; float ene_temp[CLDFB_NO_CHANNELS_MAX]; + + revTimes = t60; + revEne = ene; + if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfStatistics, sampling_rate, t60_temp, ene_temp ) ) != IVAS_ERR_OK ) { return error; } - floatToFixed_arrL32( t60_temp, t60, Q15, CLDFB_NO_CHANNELS_MAX ); - floatToFixed_arrL32( ene_temp, ene, Q15, CLDFB_NO_CHANNELS_MAX ); - revTimes = t60; - revEne = ene; preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( t60_temp, t60, Q31, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( ene_temp, ene, Q31, CLDFB_NO_CHANNELS_MAX ); } else { diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 75cc4b816..7f8659a8c 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -110,20 +110,20 @@ ivas_error ivas_reverb_prepare_cldfb_params( { fc[idx] = ( idx + 0.5f ) * ( MAX_SAMPLING_RATE / ( 2 * CLDFB_NO_CHANNELS_MAX ) ); } - Word32 *fc_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); - Word32 *pOutput_t60_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); - Word16 *pOutput_t60_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 * ) ); - Word32 *pOutput_ene_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 * ) ); - Word16 *pOutput_ene_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 * ) ); + Word32 *pOutput_fc_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); + Word32 *pOutput_t60_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); + Word16 *pOutput_t60_e = (Word16 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ) ); + Word32 *pOutput_ene_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); + Word16 *pOutput_ene_e = (Word16 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ) ); Word32 delay_diff_fx; - for ( int i = 0; i < pInput_params->nBands; i++ ) + for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { - fc_fx[i] = (Word32) fc[i] * ONE_IN_Q16; + pOutput_fc_fx[i] = (Word32) fc[i] * ONE_IN_Q16; } ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, - CLDFB_NO_CHANNELS_MAX, fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); + CLDFB_NO_CHANNELS_MAX, pOutput_fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); /* adjust DSR for the delay difference */ delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx ); @@ -134,7 +134,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( pOutput_t60[i] = (float) fabs( me2f( pOutput_t60_fx[i], pOutput_t60_e[i] ) ); pOutput_ene[i] = (float) fabs( me2f( pOutput_ene_fx[i], pOutput_ene_e[i] ) ); } - free( fc_fx ); + free( pOutput_fc_fx ); free( pOutput_t60_fx ); free( pOutput_t60_e ); free( pOutput_ene_fx ); @@ -336,13 +336,13 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); + Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 ) ); - Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); - Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); - Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); + Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 ) ); + Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 ) ); + Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 ) ); + Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 ) ); + Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 ) ); for ( int i = 0; i < 60; i++ ) { @@ -357,7 +357,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); - for ( int i = 0; i < 257; i++ ) + for ( int i = 0; i < 60; i++ ) { avg_pwr_left[i] = (float) fabs( me2f( avg_pwr_left_fx[i], avg_pwr_left_e[i] ) ); avg_pwr_right[i] = (float) fabs( me2f( avg_pwr_right_fx[i], avg_pwr_right_e[i] ) ); @@ -368,7 +368,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( free( avg_pwr_left_e ); free( avg_pwr_right_e ); free( avg_pwr_left_fx ); - free( avg_pwr_left_fx ); + free( avg_pwr_right_fx ); #else if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) -- GitLab From 1990fafbcbdca0a389d01a822834db923ea95d74 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 18 Jun 2025 17:35:19 +0200 Subject: [PATCH 0963/1310] solved runtime error in binaural room reverb --- lib_rend/ivas_reverb_utils_fx.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 7f8659a8c..ba25686c8 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -110,6 +110,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( { fc[idx] = ( idx + 0.5f ) * ( MAX_SAMPLING_RATE / ( 2 * CLDFB_NO_CHANNELS_MAX ) ); } + Word32 *pOutput_fc_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); Word32 *pOutput_t60_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); Word16 *pOutput_t60_e = (Word16 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ) ); @@ -122,6 +123,19 @@ ivas_error ivas_reverb_prepare_cldfb_params( pOutput_fc_fx[i] = (Word32) fc[i] * ONE_IN_Q16; } + /* + for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) + { + fc[idx] = ( (float) idx + 0.5f ) * ( (float) MAX_SAMPLING_RATE / (float) ( 2 * CLDFB_NO_CHANNELS_MAX ) ); + } + Word32 *pOutput_fc_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 ) ); + Word32 *pOutput_t60_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 ) ); + Word16 *pOutput_t60_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 ) ); + Word32 *pOutput_ene_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 ) ); + Word16 *pOutput_ene_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 ) ); + Word32 delay_diff_fx; + */ + ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX, pOutput_fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); @@ -129,7 +143,8 @@ ivas_error ivas_reverb_prepare_cldfb_params( delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx ); delay_diff = (float) delay_diff_fx / ONE_IN_Q27; - for ( int i = 0; i < pInput_params->nBands; i++ ) + for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + //for ( int i = 0; i < pInput_params->nBands; i++ ) { pOutput_t60[i] = (float) fabs( me2f( pOutput_t60_fx[i], pOutput_t60_e[i] ) ); pOutput_ene[i] = (float) fabs( me2f( pOutput_ene_fx[i], pOutput_ene_e[i] ) ); -- GitLab From 6411fd388feedcf744da94ad356ed80da1f846f8 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 18 Jun 2025 17:43:02 +0200 Subject: [PATCH 0964/1310] clang formatting --- lib_rend/ivas_reverb_utils_fx.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index ba25686c8..2df3e22f8 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -123,19 +123,6 @@ ivas_error ivas_reverb_prepare_cldfb_params( pOutput_fc_fx[i] = (Word32) fc[i] * ONE_IN_Q16; } - /* - for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - fc[idx] = ( (float) idx + 0.5f ) * ( (float) MAX_SAMPLING_RATE / (float) ( 2 * CLDFB_NO_CHANNELS_MAX ) ); - } - Word32 *pOutput_fc_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 ) ); - Word32 *pOutput_t60_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 ) ); - Word16 *pOutput_t60_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 ) ); - Word32 *pOutput_ene_fx = (Word32 *) malloc( pInput_params->nBands * sizeof( Word32 ) ); - Word16 *pOutput_ene_e = (Word16 *) malloc( pInput_params->nBands * sizeof( Word16 ) ); - Word32 delay_diff_fx; - */ - ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, CLDFB_NO_CHANNELS_MAX, pOutput_fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); @@ -144,7 +131,6 @@ ivas_error ivas_reverb_prepare_cldfb_params( delay_diff = (float) delay_diff_fx / ONE_IN_Q27; for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) - //for ( int i = 0; i < pInput_params->nBands; i++ ) { pOutput_t60[i] = (float) fabs( me2f( pOutput_t60_fx[i], pOutput_t60_e[i] ) ); pOutput_ene[i] = (float) fabs( me2f( pOutput_ene_fx[i], pOutput_ene_e[i] ) ); -- GitLab From 08c6d6c328aad69ae9a2720444b1d7df87f7500e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 18 Jun 2025 21:20:46 +0530 Subject: [PATCH 0965/1310] Fix for 3GPP issue 1694: USAN in ivas_sba_dec_render_fx Link #1694 --- lib_dec/ivas_jbm_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 6b5023a70..dc75e00b8 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2617,7 +2617,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( move16(); move16(); - FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + FOR( ch_idx = 0; ch_idx < (MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS); ch_idx++ ) { p_output_fx[ch_idx] = output_fx[ch_idx]; } -- GitLab From fce38af3bc45afc7d63a6e307447419ecd7f4aa0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 18 Jun 2025 21:27:09 +0530 Subject: [PATCH 0966/1310] Clang formatting changes --- lib_dec/ivas_jbm_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index dc75e00b8..a36982777 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2617,7 +2617,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( move16(); move16(); - FOR( ch_idx = 0; ch_idx < (MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS); ch_idx++ ) + FOR( ch_idx = 0; ch_idx < ( MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS ); ch_idx++ ) { p_output_fx[ch_idx] = output_fx[ch_idx]; } -- GitLab From fe4a6d04c40e1740707442dd637ec64d0ac0f6d3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 18 Jun 2025 21:32:07 +0530 Subject: [PATCH 0967/1310] Fix for 3GPP issue 1753: Renderer crash in OMASA to MASA (diffuse_meta_merge_1x1_fx) Link #1753 --- lib_rend/ivas_masa_merge_fx.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index d90076847..e0dd57afb 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -192,6 +192,11 @@ void diffuse_meta_merge_1x1_fx( tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( total_nrg_fx, EPSILON_FX ), &scale ); L_tmp1 = L_deposit_h( tmp ); /* Q( 31 - ( scale + total_nrg_e - total_diff_nrg_e ) ) */ scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); + if ( L_tmp1 == 0 ) + { + scale = 30; + move16(); + } L_tmp2 = L_sub( L_shl( 1, scale ), L_tmp1 ); L_tmp1 = BASOP_Util_Add_Mant32Exp( dir_ratio_ism_fx, dir_ratio_ism_e, L_tmp2, scale, &tmp ); -- GitLab From 6a54be9bea544b44d6d9c5f3f9e7753737c83af3 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 18 Jun 2025 21:28:41 +0200 Subject: [PATCH 0968/1310] restored accidental changes to gitlab CI yaml --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c73c057c6..0df727291 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -693,11 +693,11 @@ stages: - *check-up-to-date-in-comparison-jobs - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -k "not model" > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout -k "not model" > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE @@ -2214,7 +2214,7 @@ ivas-pytest-on-merge-request: ### prepare pytest # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -k "not model" ### Run test using branch scripts and input - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi @@ -2222,7 +2222,7 @@ ivas-pytest-on-merge-request: ### run pytest - exit_code=0 - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout -k "not model" || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check -- GitLab From 8e294c8eef9ee5db708e054f8c040568e0617ca3 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 19 Jun 2025 11:21:43 +1000 Subject: [PATCH 0969/1310] add missing loop line --- lib_com/ivas_spar_com_fx.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 65e4b1c29..02cc83d68 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4289,6 +4289,11 @@ void ivas_get_spar_md_from_dirac_enc_fx( } /*normalize 1st order*/ +#if 0 // def NONBE_FIX_1748_SPAR_DIV_OPT + Word16 norm_t = L_norm_arr( &response_avg_fx[1], foa_ch - 1 ); + norm_t = norm_t - 1; + scale_sig32( &response_avg_fx[1], foa_ch - 1, norm_t ); +#endif norm_fx = 0; move32(); norm_q = 0; @@ -4328,10 +4333,13 @@ void ivas_get_spar_md_from_dirac_enc_fx( } ELSE { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); + FOR( ch = 1; ch < foa_ch; ch++ ) + { + response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 + move32(); + response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + move32(); + } } #else FOR( ch = 1; ch < foa_ch; ch++ ) @@ -4878,6 +4886,11 @@ void ivas_get_spar_md_from_dirac_fx( } /*normalize 1st order*/ +#if 0 // def NONBE_FIX_1748_SPAR_DIV_OPT + Word16 norm_t = L_norm_arr( &response_avg_fx[1], foa_ch - 1 ); + norm_t = norm_t - 1; + scale_sig32( &response_avg_fx[1], foa_ch - 1, norm_t ); +#endif norm_fx = 0; move32(); norm_q = 0; @@ -4917,10 +4930,13 @@ void ivas_get_spar_md_from_dirac_fx( } ELSE { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 - move32(); + FOR( ch = 1; ch < foa_ch; ch++ ) + { + response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 + move32(); + response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + move32(); + } } #else FOR( ch = 1; ch < foa_ch; ch++ ) -- GitLab From 91fed7387e7557d914211e69af8f3e60decabfca Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 19 Jun 2025 12:55:55 +1000 Subject: [PATCH 0970/1310] improve precision of average sph harm resp --- lib_com/ivas_spar_com_fx.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 02cc83d68..e1c216d00 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4264,7 +4264,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( Word16 norm_q; #ifdef NONBE_FIX_1748_SPAR_DIV_OPT - Word16 num_ch_order; + Word16 num_ch_order, norm_t; #else Word16 num_ch_order, hoa2_ch_order; #endif @@ -4289,21 +4289,28 @@ void ivas_get_spar_md_from_dirac_enc_fx( } /*normalize 1st order*/ -#if 0 // def NONBE_FIX_1748_SPAR_DIV_OPT - Word16 norm_t = L_norm_arr( &response_avg_fx[1], foa_ch - 1 ); - norm_t = norm_t - 1; - scale_sig32( &response_avg_fx[1], foa_ch - 1, norm_t ); +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + norm_t = L_norm_arr( &response_avg_fx[1], sub( foa_ch, 1 ) ); + move16(); + norm_t = sub( norm_t, 1 ); + move16(); + scale_sig32( &response_avg_fx[1], sub( foa_ch, 1 ), norm_t ); #endif norm_fx = 0; move32(); +#ifndef NONBE_FIX_1748_SPAR_DIV_OPT norm_q = 0; move16(); +#endif FOR( ch = 1; ch < foa_ch; ch++ ) { norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 } norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) ); +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q +#else IF( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q @@ -4313,6 +4320,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( norm_fx = EPSILON_FX; move32(); } +#endif IF( norm_q <= 0 ) { norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31 @@ -4861,7 +4869,7 @@ void ivas_get_spar_md_from_dirac_fx( Word32 norm_fx; Word16 norm_q; #ifdef NONBE_FIX_1748_SPAR_DIV_OPT - Word16 num_ch_order; + Word16 num_ch_order, norm_t; #else Word16 num_ch_order, hoa2_ch_order; #endif @@ -4886,21 +4894,29 @@ void ivas_get_spar_md_from_dirac_fx( } /*normalize 1st order*/ -#if 0 // def NONBE_FIX_1748_SPAR_DIV_OPT - Word16 norm_t = L_norm_arr( &response_avg_fx[1], foa_ch - 1 ); - norm_t = norm_t - 1; - scale_sig32( &response_avg_fx[1], foa_ch - 1, norm_t ); +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + norm_t = L_norm_arr( &response_avg_fx[1], sub( foa_ch, 1 ) ); + move16(); + norm_t = sub( norm_t, 1 ); + move16(); + scale_sig32( &response_avg_fx[1], sub( foa_ch, 1 ), norm_t ); #endif norm_fx = 0; move32(); +#ifndef NONBE_FIX_1748_SPAR_DIV_OPT norm_q = 0; move16(); +#endif FOR( ch = 1; ch < foa_ch; ch++ ) { norm_fx = L_add( norm_fx, Mpy_32_32( response_avg_fx[ch], response_avg_fx[ch] ) ); // q29 } norm_q = sub( 31, ( sub( add( 30, 30 ), 31 ) ) ); + +#ifdef NONBE_FIX_1748_SPAR_DIV_OPT + norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q +#else IF( norm_fx ) { norm_fx = Sqrt32( norm_fx, &norm_q ); // q=31-norm_q @@ -4910,6 +4926,8 @@ void ivas_get_spar_md_from_dirac_fx( norm_fx = EPSILON_FX; move32(); } +#endif + IF( norm_q <= 0 ) { norm_fx = L_shr( norm_fx, ( negate( norm_q ) ) ); // q=31 -- GitLab From 299255b69eeff0bfa8b2ef1b2035cb48c692a12c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 19 Jun 2025 09:35:02 +0530 Subject: [PATCH 0971/1310] Bug fix: tilt_code deviation fix Fix for the excdiffQ buffer deviating due to wrong value of tilt_code. tilt_code was deviating due to use of L_SUBFR as length instead of L_subfr. --- lib_enc/enc_pit_exc_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/enc_pit_exc_fx.c b/lib_enc/enc_pit_exc_fx.c index 21cd474bd..548e3f904 100644 --- a/lib_enc/enc_pit_exc_fx.c +++ b/lib_enc/enc_pit_exc_fx.c @@ -814,7 +814,7 @@ void enc_pit_exc_ivas_fx( /*-----------------------------------------------------------------* * Gain encoding *-----------------------------------------------------------------*/ - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_FRAME, i_subfr, -1, xn, y1, sub( shift_wsp, 1 ), y2, code, Es_pred, + gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, st_fx->L_frame, i_subfr, -1, xn, y1, sub( shift_wsp, 1 ), y2, code, Es_pred, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); } gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit, st_fx->clip_var_fx ); @@ -823,7 +823,7 @@ void enc_pit_exc_ivas_fx( gcode16 = round_fx_sat( Lgcode ); IF( use_fcb != 0 ) { - hLPDmem->tilt_code = est_tilt_ivas_fx( &exc[i_subfr], gain_pit, code, gain_code, &voice_fac, Q_new, L_SUBFR, 0 ); // Q15 + hLPDmem->tilt_code = est_tilt_ivas_fx( &exc[i_subfr], gain_pit, code, gain_code, &voice_fac, Q_new, L_subfr, 0 ); // Q15 move16(); } ELSE -- GitLab From 6608422911895b67948c8e6636224a22c61c7c4d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 19 Jun 2025 14:22:01 +0530 Subject: [PATCH 0972/1310] Fix for 3GPP issue 1752: Renderer crash for MC in META input in ivas_mcmasa_param_est_ana_fx Link #1752 --- lib_rend/ivas_mcmasa_ana_fx.c | 41 +++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index bce7a4a5a..b2b4039f3 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -952,7 +952,7 @@ void ivas_mcmasa_param_est_ana_fx( temp2 = L_add( temp2, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp1, temp2, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp1_e, temp2_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 + lsEnergyRelation_fx = L_shl_sat( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 stereoness_fx = Mult_32_32( stereoCoh_fx, lsEnergyRelation_fx ); stereoness_e = stereoCoh_e; move16(); @@ -1105,12 +1105,12 @@ void ivas_mcmasa_param_est_ana_fx( lsEnergySum_fx = L_add_sat( lsEnergySum_fx, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp1, lsEnergySum_fx, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp1_e, lsEnergySum_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 + lsEnergyRelation_fx = L_shl_sat( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 stereoRatio_fx = L_sub( Mult_32_32( L_shl_sat( stereoCoh_fx, stereoCoh_e ), lsEnergyRelation_fx ), surrCoh_fx ); // Q31 - + temp2 = L_sub( temp2, EPSILON_FX ); lsEnergyRelation_fx = BASOP_Util_Divide3232_Scale( temp2, lsEnergySum_fx, &lsEnergyRelation_e ); lsEnergyRelation_e = add( lsEnergyRelation_e, sub( temp2_e, lsEnergySum_e ) ); - lsEnergyRelation_fx = L_shl( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 + lsEnergyRelation_fx = L_shl_sat( lsEnergyRelation_fx, add( 16, lsEnergyRelation_e ) ); // Q31 cohPanRatio_fx = L_sub( Mult_32_32( cohPanCoh_fx, lsEnergyRelation_fx ), surrCoh_fx ); // Q31 IF( GT_32( stereoRatio_fx, cohPanRatio_fx ) ) @@ -1436,24 +1436,33 @@ static void computeVerticalDiffuseness_fx( { Word16 tmp_e1, tmp_e2; tmp = BASOP_Util_Divide3232_Scale( intensity_slow_abs[i], L_add( energy_slow[i], EPSILON_FX_SMALL ), &tmp_e1 ); - tmp_e1 = add( tmp_e1, sub( intensity_slow_e[i], energy_slow_e[i] ) ); - tmp = BASOP_Util_Divide3232_Scale( L_sub( tmp, L_shr( VERTICAL_ENERGY_RATIO_OFFSET_FX, tmp_e1 ) ), L_sub( ONE_IN_Q15, VERTICAL_ENERGY_RATIO_OFFSET_FX ), &tmp_e2 ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ - tmp_e2 = add( tmp_e2, tmp_e1 ); - tmp = L_sub( L_shl( 1, sub( 15, tmp_e2 ) ), tmp ); - IF( tmp < 0 ) + IF( tmp != 0 ) { - tmp = 0; - move32(); + tmp_e1 = add( tmp_e1, sub( intensity_slow_e[i], energy_slow_e[i] ) ); + tmp = BASOP_Util_Divide3232_Scale( L_sub( tmp, L_shr( VERTICAL_ENERGY_RATIO_OFFSET_FX, tmp_e1 ) ), L_sub( ONE_IN_Q15, VERTICAL_ENERGY_RATIO_OFFSET_FX ), &tmp_e2 ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ + tmp_e2 = add( tmp_e2, tmp_e1 ); + tmp = L_sub( L_shl( 1, sub( 15, tmp_e2 ) ), tmp ); + IF( tmp < 0 ) + { + tmp = 0; + move32(); + } + ELSE IF( GE_32( tmp, L_shl( 1, sub( 15, tmp_e2 ) ) ) ) + { + tmp = ONE_IN_Q31; // Q31 + move32(); + } + ELSE + { + tmp = L_shl( tmp, add( 16, tmp_e2 ) ); // Q31 + } } - ELSE IF( GE_32( tmp, L_shl( 1, sub( 15, tmp_e2 ) ) ) ) + ELSE { tmp = ONE_IN_Q31; // Q31 move32(); } - ELSE - { - tmp = L_shl( tmp, add( 16, tmp_e2 ) ); // Q31 - } + diffuseness[i] = tmp; // Q31 move32(); } -- GitLab From ff903c3cc96bd540ff1251376969d2b24daa346f Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 19 Jun 2025 13:37:22 +0200 Subject: [PATCH 0973/1310] Renamed variables + removed dynamic allocation of pointers --- lib_rend/ivas_reverb_utils_fx.c | 34 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 2df3e22f8..c7903777f 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -96,7 +96,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( #endif { int16_t idx; - float fc[CLDFB_NO_CHANNELS_MAX]; + //float fc[CLDFB_NO_CHANNELS_MAX]; float avg_pwr_left[CLDFB_NO_CHANNELS_MAX]; float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; float delay_diff, ln_1e6_inverted, exp_argument; @@ -105,26 +105,20 @@ ivas_error ivas_reverb_prepare_cldfb_params( #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; #endif - - for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - fc[idx] = ( idx + 0.5f ) * ( MAX_SAMPLING_RATE / ( 2 * CLDFB_NO_CHANNELS_MAX ) ); - } - - Word32 *pOutput_fc_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); - Word32 *pOutput_t60_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); - Word16 *pOutput_t60_e = (Word16 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ) ); - Word32 *pOutput_ene_fx = (Word32 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word32 ) ); - Word16 *pOutput_ene_e = (Word16 *) malloc( CLDFB_NO_CHANNELS_MAX * sizeof( Word16 ) ); + Word32 output_fc_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 output_t60_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 output_t60_e[CLDFB_NO_CHANNELS_MAX]; + Word32 output_ene_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 output_ene_e[CLDFB_NO_CHANNELS_MAX]; Word32 delay_diff_fx; - for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { - pOutput_fc_fx[i] = (Word32) fc[i] * ONE_IN_Q16; + output_fc_fx[idx] = (Word32) ( ( idx + 0.5f ) * ( MAX_SAMPLING_RATE / ( 2 * CLDFB_NO_CHANNELS_MAX ) ) ) * ONE_IN_Q16; } ivas_reverb_interpolate_acoustic_data_fx( pInput_params->nBands, pInput_params->pFc_input_fx, pInput_params->pAcoustic_rt60_fx, pInput_params->pAcoustic_dsr_fx, - CLDFB_NO_CHANNELS_MAX, pOutput_fc_fx, pOutput_t60_fx, pOutput_ene_fx, pOutput_t60_e, pOutput_ene_e ); + CLDFB_NO_CHANNELS_MAX, output_fc_fx, output_t60_fx, output_ene_fx, output_t60_e, output_ene_e ); /* adjust DSR for the delay difference */ delay_diff_fx = L_sub( pInput_params->inputPreDelay_fx, pInput_params->acousticPreDelay_fx ); @@ -132,14 +126,10 @@ ivas_error ivas_reverb_prepare_cldfb_params( delay_diff = (float) delay_diff_fx / ONE_IN_Q27; for ( int i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) { - pOutput_t60[i] = (float) fabs( me2f( pOutput_t60_fx[i], pOutput_t60_e[i] ) ); - pOutput_ene[i] = (float) fabs( me2f( pOutput_ene_fx[i], pOutput_ene_e[i] ) ); + pOutput_t60[i] = (float) fabs( me2f( output_t60_fx[i], output_t60_e[i] ) ); + pOutput_ene[i] = (float) fabs( me2f( output_ene_fx[i], output_ene_e[i] ) ); } - free( pOutput_fc_fx ); - free( pOutput_t60_fx ); - free( pOutput_t60_e ); - free( pOutput_ene_fx ); - free( pOutput_ene_e ); + ln_1e6_inverted = 1.0f / logf( 1e06f ); for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { -- GitLab From 65909d1b02e1ff2bf3c1a5528cbf9f6afe654a77 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 19 Jun 2025 17:24:01 +0530 Subject: [PATCH 0974/1310] Bug fix in E_ACELP_4tsearchx function --- lib_enc/enc_acelpx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/enc_acelpx_fx.c b/lib_enc/enc_acelpx_fx.c index 240f9859c..1a17a0f9c 100644 --- a/lib_enc/enc_acelpx_fx.c +++ b/lib_enc/enc_acelpx_fx.c @@ -623,7 +623,7 @@ void E_ACELP_4tsearchx_ivas_fx( /* Init to avoid crash when the search does not find a solution */ FOR( k = 0; k < nb_pulse; k++ ) { - codvec[k] = k; + codvec[k] = s_and( k, 3 ); move16(); } -- GitLab From 754125aff48ae951a8d8926eac8a72a925f319bb Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Thu, 19 Jun 2025 13:56:48 +0200 Subject: [PATCH 0975/1310] removed comment + clang fix --- lib_rend/ivas_reverb_utils_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index c7903777f..f673fdc7d 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -96,7 +96,6 @@ ivas_error ivas_reverb_prepare_cldfb_params( #endif { int16_t idx; - //float fc[CLDFB_NO_CHANNELS_MAX]; float avg_pwr_left[CLDFB_NO_CHANNELS_MAX]; float avg_pwr_right[CLDFB_NO_CHANNELS_MAX]; float delay_diff, ln_1e6_inverted, exp_argument; -- GitLab From 5a952a01ad9f232f646350b0aaef3a71f44d1689 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 23 Jun 2025 13:00:36 +1000 Subject: [PATCH 0976/1310] replace divide3232 with BASOP_Util_Divide3232_Scale_newton --- lib_com/ivas_spar_com_fx.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index e1c216d00..0d6b9ec03 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4264,7 +4264,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( Word16 norm_q; #ifdef NONBE_FIX_1748_SPAR_DIV_OPT - Word16 num_ch_order, norm_t; + Word16 num_ch_order, norm_t, tmp_e; #else Word16 num_ch_order, hoa2_ch_order; #endif @@ -4291,9 +4291,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( /*normalize 1st order*/ #ifdef NONBE_FIX_1748_SPAR_DIV_OPT norm_t = L_norm_arr( &response_avg_fx[1], sub( foa_ch, 1 ) ); - move16(); norm_t = sub( norm_t, 1 ); - move16(); scale_sig32( &response_avg_fx[1], sub( foa_ch, 1 ), norm_t ); #endif norm_fx = 0; @@ -4343,9 +4341,9 @@ void ivas_get_spar_md_from_dirac_enc_fx( { FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 + response_avg_fx[ch] = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ), &tmp_e ); // Q31 - tmp_e move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( tmp_e, Q1 ) ); // q30 move32(); } } @@ -4869,7 +4867,7 @@ void ivas_get_spar_md_from_dirac_fx( Word32 norm_fx; Word16 norm_q; #ifdef NONBE_FIX_1748_SPAR_DIV_OPT - Word16 num_ch_order, norm_t; + Word16 num_ch_order, norm_t, tmp_e; #else Word16 num_ch_order, hoa2_ch_order; #endif @@ -4896,9 +4894,7 @@ void ivas_get_spar_md_from_dirac_fx( /*normalize 1st order*/ #ifdef NONBE_FIX_1748_SPAR_DIV_OPT norm_t = L_norm_arr( &response_avg_fx[1], sub( foa_ch, 1 ) ); - move16(); norm_t = sub( norm_t, 1 ); - move16(); scale_sig32( &response_avg_fx[1], sub( foa_ch, 1 ), norm_t ); #endif norm_fx = 0; @@ -4950,9 +4946,9 @@ void ivas_get_spar_md_from_dirac_fx( { FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = divide3232( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ) ); // q15 + response_avg_fx[ch] = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ), &tmp_e ); // Q31 - tmp_e move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], 15 ); // q30 + response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( tmp_e, Q1 ) ); // q30 move32(); } } -- GitLab From b30ef4a883e416f71aa9c5e5f7f0e6961f824dce Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 23 Jun 2025 09:46:12 +0530 Subject: [PATCH 0977/1310] Fix for spectral holes by rearranging LPC to LSF conversion, LTV crash issue fix --- lib_enc/inov_enc_fx.c | 2 +- lib_enc/swb_tbe_enc_fx.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index d019bf474..01ba794ea 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -661,7 +661,7 @@ Word16 inov_encode_ivas_fx( { FOR( k = 0; k < L_SUBFR - i; k++ ) { - y2[i + k] = add_sat( y2[i + k], round_fx( L_shl( L_mult( code[i], h2[k] ), sh ) ) ); // Q9 Added saturation: needs to be rechecked + y2[i + k] = add_sat( y2[i + k], round_fx_sat( L_shl_sat( L_mult( code[i], h2[k] ), sh ) ) ); // Q9 Added saturation: needs to be rechecked move16(); } } diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index b001f8693..08c920c4a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -3107,6 +3107,14 @@ void swb_tbe_enc_ivas_fx( /* stab_check = a2lsp( lsf_shb, lpc_shb, LPC_SHB_ORDER ); */ + /* LPC to LSP conversion */ + /* LPC: Q12, LSP: Q15 */ + E_LPC_a_lsp_conversion( lpc_shb_fx, lsp_shb_fx, hBWE_TD->prev_lsp_shb_fx, LPC_SHB_ORDER ); + + /* LSP to LSF conversion */ + /* LSP: Q15, LSF: Q15 */ + E_LPC_lsp_lsf_conversion( lsp_shb_fx, lsf_shb_fx, LPC_SHB_ORDER ); + test(); test(); IF( ( NE_16( st_fx->last_extl, SWB_TBE ) && NE_16( st_fx->last_extl, FB_TBE ) ) || st_fx->ini_frame == 0 ) @@ -3124,14 +3132,6 @@ void swb_tbe_enc_ivas_fx( // mvr2r( hBWE_TD->prev_lsp_shb, lsf_shb, LPC_SHB_ORDER ); // } - /* LPC to LSP conversion */ - /* LPC: Q12, LSP: Q15 */ - E_LPC_a_lsp_conversion( lpc_shb_fx, lsp_shb_fx, hBWE_TD->prev_lsp_shb_fx, LPC_SHB_ORDER ); - - /* LSP to LSF conversion */ - /* LSP: Q15, LSF: Q15 */ - E_LPC_lsp_lsf_conversion( lsp_shb_fx, lsf_shb_fx, LPC_SHB_ORDER ); - Copy( lsp_shb_fx, hBWE_TD->prev_lsp_shb_fx, LPC_SHB_ORDER ); Copy( lsf_shb_fx, lsf_shb_orig_fx, LPC_SHB_ORDER ); -- GitLab From 2504797829935cbd23bfb4ca41b55c8a18abd0fa Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 23 Jun 2025 12:09:30 +0530 Subject: [PATCH 0978/1310] Bug fix: Updated the missed for loop for scaling in ivas_masa_ext_dirac_render_sf_fx --- lib_rend/ivas_dirac_rend_fx.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 155524790..81db5703e 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4999,8 +4999,11 @@ static void ivas_masa_ext_dirac_render_sf_fx( } ELSE { - scale_sig32( Cldfb_RealBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); - scale_sig32( Cldfb_ImagBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) + { + scale_sig32( Cldfb_RealBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + scale_sig32( Cldfb_ImagBuffer_fx[idx_in][i], hSpatParamRendCom->num_freq_bands, sub( hMasaExtRend->cldfbSynRend[idx_in]->Q_cldfb_state, q_out ) ); + } } FOR( i = 0; i < hSpatParamRendCom->subframe_nbslots[subframe_idx]; i++ ) { -- GitLab From 64042227c655ef786b5342fe48816a5a13b93447 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 23 Jun 2025 14:40:21 +0530 Subject: [PATCH 0979/1310] Reduce usage of BASOP_Util_Add_Mant32Exp in MCT path Changes are under macro OPT_MCT_ENC_V1_NBE WMOPs reduction of ~130. Tested config: Multi-Channel 7.1+4,48kbps FB --- lib_com/options.h | 1 + lib_enc/ivas_mcmasa_enc_fx.c | 37 +++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7996f8d41..b45e54671 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -77,6 +77,7 @@ #define FIX_1379_MASA_ANGLE_ROUND /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_MCT_ENC_V1_NBE #define OPT_SBA_REND_V1_BE #define OPT_HEAD_ROT_REND_V1_BE #define OPT_SBA_DEC_V2_BE diff --git a/lib_enc/ivas_mcmasa_enc_fx.c b/lib_enc/ivas_mcmasa_enc_fx.c index 314424341..ab86efb8d 100644 --- a/lib_enc/ivas_mcmasa_enc_fx.c +++ b/lib_enc/ivas_mcmasa_enc_fx.c @@ -2085,6 +2085,41 @@ static void compute_cov_mtx_fx( ) { Word16 i, j; +#ifdef OPT_MCT_ENC_V1_NBE + Word64 temp64_1, temp64_2; + Word16 tmp_16, max_exp; + Word16 temp_exp = shl( inp_exp, 1 ); + FOR( i = 0; i < N; i++ ) + { + FOR( j = i; j < N; j++ ) + { + temp64_1 = W_mac_32_32( W_mult_32_32( sr[i][freq], sr[j][freq] ), si[i][freq], si[j][freq] ); // exp:2*inp_exp + temp64_2 = W_deposit32_h( COVls->xr_fx[i][j] ); // exp:COVls->xr_e[i][j] + max_exp = s_max( COVls->xr_e[i][j], temp_exp ); + temp64_2 = W_shl( temp64_2, sub( COVls->xr_e[i][j], max_exp ) ); // exp:max_exp + temp64_1 = W_shl( temp64_1, sub( temp_exp, max_exp ) ); // exp:max_exp + temp64_1 = W_add( temp64_1, temp64_2 ); // exp:max_exp + tmp_16 = W_norm( temp64_1 ); + + COVls->xr_fx[i][j] = W_extract_h( W_shl( temp64_1, tmp_16 ) ); // exp:max_exp-tmp_16 + COVls->xr_e[i][j] = sub( max_exp, tmp_16 ); + move32(); + move16(); + + temp64_1 = W_sub( W_mult_32_32( si[i][freq], sr[j][freq] ), W_mult_32_32( sr[i][freq], si[j][freq] ) ); // exp :2*inp_exp + temp64_2 = W_deposit32_h( COVls->xi_fx[i][j] ); // exp:COVls->xi_e[i][j] + max_exp = s_max( COVls->xi_e[i][j], temp_exp ); + temp64_2 = W_shl( temp64_2, sub( COVls->xi_e[i][j], max_exp ) ); // exp:max_exp + temp64_1 = W_shl( temp64_1, sub( temp_exp, max_exp ) ); // exp:max_exp + temp64_1 = W_add( temp64_1, temp64_2 ); // exp:max_exp + tmp_16 = W_norm( temp64_1 ); + + COVls->xi_fx[i][j] = W_extract_h( W_shl( temp64_1, tmp_16 ) ); // exp:max_exp-tmp_16 + COVls->xi_e[i][j] = sub( max_exp, tmp_16 ); + move32(); + } + } +#else Word32 a, b, c, d; Word32 temp; Word16 norm_a, norm_b, norm_c, norm_d; @@ -2117,7 +2152,7 @@ static void compute_cov_mtx_fx( move32(); } } - +#endif return; } -- GitLab From b8a4ceba02f3f9d1216fc82592fc15aec4488308 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 23 Jun 2025 12:20:52 +0200 Subject: [PATCH 0980/1310] Corrected the scaling of st->mem_syn2_fx. --- lib_dec/ivas_mdct_core_dec_fx.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 74ba24767..d09eb4574 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1338,6 +1338,15 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn // Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); Scale_sig( st->syn, M + 1, sub( st->Q_syn, q_win ) ); + + IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + { + Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, st->prev_Q_syn ) ); // st->Q_syn gets a new value, but st->mem_syn2_fx got its value from E_UTIL_f_preemph3 with st->Q_syn = st->prev_Q_syn + } + ELSE + { + Scale_sig( st->mem_syn2_fx, M, sub( st->Q_syn, add( q_win, 2 ) ) ); // q_win+2 -> st->Q_syn: in this case, E_UTIL_f_preemph2 shifts st->mem_syn2_fx by 2 bits + } #else test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) -- GitLab From 468aa780e99309ce3f3d3f83cad6559aec31ef39 Mon Sep 17 00:00:00 2001 From: marc emerit Date: Mon, 23 Jun 2025 17:37:18 +0200 Subject: [PATCH 0981/1310] fix FIX_INV_DIFFUSE_WEIGHT bug, make switchs USE_NEW_HRTF_BINARY_FILE_FORMAT, FIX_WARNING_RENDER_CONFIG, FIX_INV_DIFFUSE_WEIGHT, FIX_638_ENERGIE_IAC_ROM_TABLES independant --- apps/decoder.c | 13 +- apps/renderer.c | 5 +- lib_com/options.h | 16 ++- lib_rend/ivas_crend_fx.c | 18 ++- lib_rend/ivas_hrtf_fx.c | 29 ++++- lib_rend/ivas_rom_binaural_crend_head.h | 6 +- lib_rend/ivas_rom_binaural_crend_head_fx.c | 2 +- lib_rend/ivas_rom_rend.h | 6 +- lib_rend/ivas_rom_rend_fx.c | 59 +++++++++ lib_util/hrtf_file_reader.c | 137 ++++++++++----------- lib_util/hrtf_file_reader.h | 4 - 11 files changed, 186 insertions(+), 109 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 76bd23bbf..0ed86b187 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -610,7 +610,6 @@ int main( } #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( *hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) @@ -619,7 +618,6 @@ int main( goto cleanup; } } -#endif #endif if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ) ) != IVAS_ERR_OK ) { @@ -704,7 +702,6 @@ int main( } } #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( error = IVAS_DEC_GetHrtfStatisticsHandle( hIvasDec, &hHrtfStatistics ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -723,12 +720,14 @@ int main( } } #else - if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) + if ( ( hHrtfTD != NULL ) && ( *hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; + if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) + { + fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); + goto cleanup; + } } -#endif #endif } diff --git a/apps/renderer.c b/apps/renderer.c index f2beb82c3..b2e732c6f 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1012,7 +1012,6 @@ int main( } #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfFileReader ) ) != IVAS_ERR_OK ) { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) @@ -1021,7 +1020,6 @@ int main( goto cleanup; } } -#endif #endif if ( ( error = IVAS_REND_GetHrtfCRendHandle( hIvasRend, &hSetOfHRTF ) ) != IVAS_ERR_OK ) @@ -1105,8 +1103,8 @@ int main( } } + #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( ( error = IVAS_REND_GetHrtfStatisticsHandle( hIvasRend, &hHrtfStatistics ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_REND_GetHrtfStatisticsHandle failed\n\n" ); @@ -1124,7 +1122,6 @@ int main( destroy_hrtf_statistics( hHrtfStatistics ); } } -#endif #endif hrtfFileReader_close( &hrtfFileReader ); diff --git a/lib_com/options.h b/lib_com/options.h index 03189efed..78a494c61 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -105,17 +105,21 @@ #define FIX_1372_ISAR_POST_REND #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ - +#ifdef NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM +#define NONBE_FIX_AVG_IAC_CLDFB_REVERB +#endif #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ -#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ -#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ -#define NONBE_FIX_AVG_IAC_CLDFB_REVERB -//#define FIX_OLD_BINARY_FORMAT /* Orange: trick to make tests succesful when changing hrtf binary format between ref and new branch*/ -//#define FIX_OLD_BINARY_FILE /* Orange: current hrtf binary file in ref branch contains wrong values for fastconv value. This switch can be activated to compre running codec with and without hrtf file*/ +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT +#define FIX_OLD_BINARY_FORMAT /* Orange: trick to make tests succesful when changing hrtf binary format between ref and new branch*/ +//#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ +#endif + +//#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ #define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ + #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 369a1d2b4..031926546 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -2153,8 +2153,10 @@ static ivas_error ivas_rend_crendConvolver( FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { - pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; - pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; + pFreq_buf_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i] ), pFreq_buf_re[k] ); // Qx + pFreq_buf_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i] ), pFreq_buf_im[k] ); // Qx + move32(); + move32(); } } ELSE @@ -2168,10 +2170,14 @@ static ivas_error ivas_rend_crendConvolver( for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { - pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; - pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i]; - pFreq_buf2_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i]; - pFreq_buf2_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i]; + pFreq_buf_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i] ), pFreq_buf_re[k] ); // Qx + pFreq_buf_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[0][i] ), pFreq_buf_im[k] ); // Qx + move32(); + move32(); + pFreq_buf2_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i] ), pFreq_buf2_re[k] ); // Qx + pFreq_buf2_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[1][i] ), pFreq_buf2_im[k] ); // Qx + move32(); + move32(); } } #else diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 0e535170b..845b61cb1 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -33,8 +33,10 @@ #include #include "options.h" #include "prot_fx.h" -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #include "ivas_rom_binaural_crend_head.h" +#else +#include "ivas_rom_rend.h" #endif #include "ivas_prot_rend_fx.h" #include "ivas_error.h" @@ -297,9 +299,34 @@ ivas_error ivas_HRTF_statistics_init( HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz_fx; break; case 16000: +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); + if ( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); + if ( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); + if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrtfStatistics->average_energy_l_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_right_avg_power_16kHz_fx, HrtfStatistics->average_energy_r_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; +#else + HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz_fx; HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz_fx; HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz_fx; +#endif break; } HrtfStatistics->fromROM = TRUE; diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 9e40c49ba..183a025a8 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -358,9 +358,9 @@ extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; / extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB -extern Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ -extern Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -extern Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ #else extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index 71a98fb0e..b4ebfe6e5 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -59838,7 +59838,7 @@ const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 2790378,2355663,2029237,1865240,1832432 }; -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +#ifndef NONBE_FIX_AVG_IAC_CLDFB_REVERB const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index f4aecc837..7cbe76051 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -103,9 +103,9 @@ extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; / extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB -extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ #else extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 75bd01756..5247b8e77 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -393,6 +393,64 @@ const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 5411340,5510149,5612037,5649820,5591435,5269472,4824498,4151094,3472472, 2790378,2355663,2029237,1865240,1832432 }; + +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +/* Sample Rate = 16000 */ + + float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {0.983044f, 0.960794f, 0.893756f, 0.783586f, 0.638963f, 0.477338f, 0.319879f, 0.183374f, 0.075909f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003842f, 0.025288f, 0.035886f, + 0.037785f, 0.035991f, 0.034784f, 0.035091f, 0.034683f, 0.030849f, 0.023146f, 0.014061f, 0.007275f, + 0.005053f, 0.006930f, 0.010589f, 0.013905f, 0.016288f, 0.018404f, 0.020849f, 0.023164f, 0.024149f, + 0.023098f, 0.020635f, 0.018325f, 0.017381f, 0.017611f, 0.017534f, 0.015650f, 0.011786f, 0.007342f, + 0.004290f, 0.003732f, 0.005148f, 0.006838f, 0.007172f, 0.005579f, 0.002632f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.001738f, 0.003011f, 0.003910f, + 0.004120f, 0.003394f, 0.001769f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.002101f, 0.004247f, 0.006330f, 0.008300f, 0.010110f, 0.011735f, 0.013165f, 0.014384f, + 0.015345f, 0.015972f, 0.016191f}; + + float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {1.118974f, 1.115256f, 1.106210f, 1.096901f, 1.092316f, 1.094422f, 1.101140f, 1.107775f, 1.110000f, + 1.106535f, 1.099921f, 1.094914f, 1.095643f, 1.103178f, 1.114955f, 1.126292f, 1.132973f, 1.133288f, + 1.128471f, 1.121439f, 1.114842f, 1.109721f, 1.105480f, 1.100966f, 1.095650f, 1.090074f, 1.085225f, + 1.081525f, 1.078267f, 1.074026f, 1.067777f, 1.059839f, 1.051856f, 1.045772f, 1.042531f, 1.041432f, + 1.040607f, 1.038291f, 1.033910f, 1.028286f, 1.022846f, 1.018514f, 1.015152f, 1.011898f, 1.008047f, + 1.003762f, 0.999992f, 0.997770f, 0.997349f, 0.997960f, 0.998259f, 0.997177f, 0.994506f, 0.990883f, + 0.987207f, 0.984003f, 0.981133f, 0.977984f, 0.973950f, 0.968837f, 0.962915f, 0.956690f, 0.950584f, + 0.944679f, 0.938744f, 0.932399f, 0.925372f, 0.917663f, 0.909568f, 0.901511f, 0.893804f, 0.886455f, + 0.879155f, 0.871463f, 0.863142f, 0.854285f, 0.845334f, 0.836740f, 0.828656f, 0.820817f, 0.812713f, + 0.803960f, 0.794564f, 0.784952f, 0.775633f, 0.766881f, 0.758539f, 0.750156f, 0.741330f, 0.732004f, + 0.722524f, 0.713387f, 0.704919f, 0.697057f, 0.689419f, 0.681576f, 0.673350f, 0.664931f, 0.656703f, + 0.648997f, 0.641801f, 0.634760f, 0.627357f, 0.619192f, 0.610186f, 0.600526f, 0.590442f, 0.579952f, + 0.568762f, 0.556384f, 0.542389f, 0.526648f, 0.509355f, 0.490884f, 0.471542f, 0.451447f, 0.430550f, + 0.408842f, 0.386537f, 0.364126f, 0.342284f, 0.321675f, 0.302809f, 0.286016f, 0.271536f, 0.259639f, + 0.250691f, 0.245099f, 0.243192f}; + + float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {1.118974f, 1.115254f, 1.106207f, 1.096903f, 1.092317f, 1.094425f, 1.101145f, 1.107775f, 1.109999f, + 1.106540f, 1.099921f, 1.094912f, 1.095644f, 1.103178f, 1.114952f, 1.126292f, 1.132973f, 1.133288f, + 1.128472f, 1.121439f, 1.114842f, 1.109719f, 1.105481f, 1.100965f, 1.095650f, 1.090072f, 1.085224f, + 1.081527f, 1.078270f, 1.074025f, 1.067775f, 1.059840f, 1.051856f, 1.045772f, 1.042533f, 1.041433f, + 1.040611f, 1.038292f, 1.033911f, 1.028286f, 1.022844f, 1.018512f, 1.015153f, 1.011899f, 1.008050f, + 1.003762f, 0.999995f, 0.997769f, 0.997349f, 0.997959f, 0.998259f, 0.997178f, 0.994509f, 0.990883f, + 0.987204f, 0.984003f, 0.981133f, 0.977983f, 0.973949f, 0.968836f, 0.962914f, 0.956689f, 0.950583f, + 0.944681f, 0.938745f, 0.932399f, 0.925373f, 0.917662f, 0.909567f, 0.901511f, 0.893804f, 0.886456f, + 0.879153f, 0.871467f, 0.863138f, 0.854286f, 0.845334f, 0.836740f, 0.828656f, 0.820816f, 0.812712f, + 0.803961f, 0.794567f, 0.784951f, 0.775631f, 0.766882f, 0.758540f, 0.750158f, 0.741330f, 0.732005f, + 0.722523f, 0.713388f, 0.704920f, 0.697057f, 0.689418f, 0.681575f, 0.673352f, 0.664930f, 0.656706f, + 0.648998f, 0.641802f, 0.634762f, 0.627355f, 0.619192f, 0.610187f, 0.600527f, 0.590442f, 0.579953f, + 0.568763f, 0.556383f, 0.542389f, 0.526646f, 0.509355f, 0.490883f, 0.471543f, 0.451446f, 0.430550f, + 0.408843f, 0.386537f, 0.364127f, 0.342285f, 0.321676f, 0.302809f, 0.286016f, 0.271535f, 0.259640f, + 0.250692f, 0.245099f, 0.243192f}; + + +#else + const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, @@ -487,6 +545,7 @@ const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 1708239,1437966,1167685,1059573,1059573 }; #endif +#endif /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table *----------------------------------------------------------------------------------*/ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 5832296c8..c6d1d48ec 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -37,6 +37,8 @@ #include "ivas_prot_fx.h" #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #include "ivas_rom_binaural_crend_head.h" +#else +#include "ivas_rom_rend.h" #endif /*---------------------------------------------------------------------* @@ -193,7 +195,7 @@ static ivas_error check_hrtf_binary_header( { /* Check the renderer type */ -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT if ( ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_MIXER_CONV ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_FASTCONV ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_PARAMETRIC ) && ( hrtf_header->rend_type != HRTF_READER_RENDERER_BINAURAL_PARAMETRIC_ROOM ) && @@ -363,7 +365,7 @@ static ivas_error LoadBSplineBinary( float f_tmp_latency_s; -#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifndef USE_NEW_HRTF_BINARY_FILE_FORMAT float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; #endif @@ -551,7 +553,7 @@ static ivas_error LoadBSplineBinary( LoadBSplineBinaryITD( &HrFiltSet_p->ModelParamsITD, f_hrtf ); } -#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifndef USE_NEW_HRTF_BINARY_FILE_FORMAT /* left/right energy and interaural coherence for late reverb */ FOR( i = 0; i < 3; i++ ) { @@ -576,7 +578,6 @@ static ivas_error LoadBSplineBinary( return IVAS_ERR_OK; } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-------------------------------------------------------------------* * set_default_reverb_iac_energy() @@ -615,12 +616,10 @@ static ivas_error set_default_reverb_iac_energy( #else HrFiltSet_p->lr_energy_and_iac_dyn[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); #endif -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } -#endif } switch ( HrFiltSet_p->SampleRate ) { @@ -692,8 +691,6 @@ static ivas_error set_default_reverb_iac_energy( } #endif -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES - /*-------------------------------------------------------------------* * load_reverb_from_binary() * @@ -720,11 +717,8 @@ static ivas_error load_reverb_from_binary( ivas_hrtfs_header_t hrtf_header; int32_t hrtf_data_size_max; char *hrtf_data; -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB int16_t lr_iac_len; -#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; -#endif #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( hHrtfStatistics == NULL ) @@ -736,6 +730,7 @@ static ivas_error load_reverb_from_binary( } lr_iac_len = LR_IAC_LENGTH_NR_FC; +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( sampleRate == 16000 ) #else @@ -783,7 +778,11 @@ static ivas_error load_reverb_from_binary( return header_check_result; } +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT is_reverb = ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_REVERB_ALL ); +#else + is_reverb = ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_REVERB_ALL ); +#endif if ( !is_reverb ) { if ( fread( hrtf_data, 1, hrtf_header.data_size, f_hrtf ) != hrtf_header.data_size ) @@ -802,9 +801,8 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); hHrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); hHrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); - float *hrtf_prop_local = (float *) malloc( lr_iac_len * sizeof( float ) ); - if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_r_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL || hrtf_prop_local == NULL ) + if ( hHrtfStatistics->average_energy_l_dyn == NULL || hHrtfStatistics->average_energy_r_dyn == NULL || hHrtfStatistics->inter_aural_coherence_dyn == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } @@ -812,23 +810,21 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->average_energy_r = hHrtfStatistics->average_energy_r_dyn; hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; - fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_l_dyn, Q27, lr_iac_len ); + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_l_dyn, Q27, lr_iac_len ); - fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->average_energy_r_dyn, Q27, lr_iac_len ); + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_r_dyn, Q27, lr_iac_len ); - fread( hrtf_prop_local, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( hrtf_prop_local, hHrtfStatistics->inter_aural_coherence_dyn, Q23, lr_iac_len ); + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->inter_aural_coherence_dyn, Q23, lr_iac_len ); hHrtfStatistics->fromROM = FALSE; - free( hrtf_prop_local ); #else /* left/right energy and interaural coherence for late reverb */ FOR( i = 0; i < 3; i++ ) { -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB - HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); + HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); @@ -843,23 +839,6 @@ static ivas_error load_reverb_from_binary( floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ } HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; -#else - HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); - if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - fread( f_tmp_lr_energy_and_iac_dyn, sizeof( const float ), LR_IAC_LENGTH_NR_FC_16KHZ, f_hrtf ); - IF( i == 2 ) - { - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - } - ELSE - { - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - } - HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; -#endif } #endif } @@ -877,7 +856,6 @@ static ivas_error load_reverb_from_binary( return IVAS_ERR_OK; } -#endif /*---------------------------------------------------------------------* * load_reverb_binary() @@ -903,7 +881,6 @@ ivas_error load_reverb_binary( return load_reverb_from_binary( hHrtf, hrtfReader->file ); #endif } -#endif /*-------------------------------------------------------------------* * TDREND_MIX_LoadHRTF() * @@ -978,7 +955,7 @@ static ivas_error TDREND_MIX_LoadHRTF( return header_check_result; } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT is_tdrend = ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD ); #else is_tdrend = ( hrtf_header.rend_type == RENDERER_BINAURAL_OBJECTS_TD ); @@ -1310,13 +1287,14 @@ static ivas_error create_HRTF_from_rawdata( hrtf_data_rptr += sizeof( UWord16 ); /* inv_diffuse_weight */ +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT #ifdef FIX_INV_DIFFUSE_WEIGHT - FOR( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { ( *hHRTF )->inv_diffuse_weight_fx[0][i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); hrtf_data_rptr += sizeof( float ); } - FOR( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { ( *hHRTF )->inv_diffuse_weight_fx[1][i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); hrtf_data_rptr += sizeof( float ); @@ -1324,11 +1302,30 @@ static ivas_error create_HRTF_from_rawdata( #else for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { - //( *hHRTF )->inv_diffuse_weight[i] = *( (float *) ( hrtf_data_rptr ) ); ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); hrtf_data_rptr += sizeof( float ); } + hrtf_data_rptr += sizeof( float ) * ( *hHRTF )->max_num_ir; +#endif +#else +#ifdef FIX_INV_DIFFUSE_WEIGHT + /* inv_diffuse_weight */ + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + ( *hHRTF )->inv_diffuse_weight_fx[0][i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); + ( *hHRTF )->inv_diffuse_weight_fx[1][i] = ( *hHRTF )->inv_diffuse_weight[0][i]; + hrtf_data_rptr += sizeof( float ); + } +#else + /* inv_diffuse_weight */ + for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) + { + ( *hHRTF )->inv_diffuse_weight[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); + hrtf_data_rptr += sizeof( float ); + } +#endif #endif + /* max_total_num_fsamp_per_iteration */ max_total_num_fsamp_per_iteration = *( (UWord16 *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( UWord16 ); @@ -1472,7 +1469,7 @@ static ivas_error create_HRTF_from_rawdata( static ivas_error create_fastconv_HRTF_from_rawdata( HRTFS_FASTCONV_HANDLE *hHRTF, /* i/o: HRTF FastConv handle */ char *hrtf_data, /* i : pointer to binary file */ -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT HRTF_READER_RENDERER_TYPE rend_type, /* i : Renderer type */ #else RENDERER_TYPE rend_type, /* i : Renderer type */ @@ -1486,13 +1483,13 @@ static ivas_error create_fastconv_HRTF_from_rawdata( float f_tmp_ntaps_max[BINAURAL_NTAPS_MAX]; float f_tmp_brir_reverb[CLDFB_NO_CHANNELS_MAX]; char *hrtf_data_rptr; -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT ivas_error error; #endif ( *hHRTF )->allocate_init_flag = 0; -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV ) { if ( ( error = ivas_allocate_binaural_hrtf_fx( *hHRTF, 0, input_cfg, RENDERER_BINAURAL_FASTCONV, ( *hHRTF )->allocate_init_flag ) ) != IVAS_ERR_OK ) @@ -1527,7 +1524,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( #endif /* HRIR */ -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) @@ -1593,7 +1590,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) #else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) @@ -1660,7 +1657,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) #else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) @@ -1728,7 +1725,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) #else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) @@ -1797,7 +1794,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } /* BRIR */ -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT else if ( rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) #else else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) @@ -1871,25 +1868,13 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } hrtf_data_rptr += sizeof( uint16_t ); - -#ifdef FIX_OLD_BINARY_FILE // old binary file is wrong - extern const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; - memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); - - memcpy( f_tmp_brir_reverb, fastconvReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); -#else memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); -#endif + hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); } return IVAS_ERR_OK; @@ -1945,7 +1930,7 @@ ivas_error load_fastconv_HRTF_from_binary( free( hrtf_data ); return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "HRTF binary file not compliant (number of HRTF)" ); } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT if ( ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_FASTCONV_ROOM ) ) #else if ( ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV ) || ( hrtf_header.rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) @@ -2119,7 +2104,7 @@ ivas_error load_parambin_HRTF_from_binary( } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ #else if ( hrtf_header.rend_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) /* Parametric binauralizer data is represented as single entity */ @@ -2213,7 +2198,7 @@ ivas_error create_SetOfHRTF_from_binary( hHRTF = NULL; if ( hrtf_header.frequency == output_Fs ) { -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV ) #else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV ) @@ -2236,7 +2221,7 @@ ivas_error create_SetOfHRTF_from_binary( hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa ); } } -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT else if ( hrtf_header.rend_type == HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM ) #else else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) @@ -2374,6 +2359,7 @@ void destroy_SetOfHRTF( return; } + #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*---------------------------------------------------------------------* * destroy_hrtf_statistics() @@ -2385,17 +2371,21 @@ void destroy_hrtf_statistics( IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ ) { +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + if ( ( hHrtfStatistics != NULL ) && ( *hHrtfStatistics != NULL ) ) +#else if ( ( hHrtfStatistics != NULL ) && ( *hHrtfStatistics != NULL ) && ( ( *hHrtfStatistics )->fromROM == FALSE ) ) +#endif { - if ( ( *hHrtfStatistics )->average_energy_l != NULL ) + if ( ( *hHrtfStatistics )->average_energy_l_dyn != NULL ) { free( ( *hHrtfStatistics )->average_energy_l_dyn ); } - if ( ( *hHrtfStatistics )->average_energy_r != NULL ) + if ( ( *hHrtfStatistics )->average_energy_r_dyn != NULL ) { free( ( *hHrtfStatistics )->average_energy_r_dyn ); } - if ( ( *hHrtfStatistics )->inter_aural_coherence != NULL ) + if ( ( *hHrtfStatistics )->inter_aural_coherence_dyn != NULL ) { free( ( *hHrtfStatistics )->inter_aural_coherence_dyn ); } @@ -2404,7 +2394,6 @@ void destroy_hrtf_statistics( } #endif - /*---------------------------------------------------------------------* * destroy_fastconv_hrtf() * diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 14ac33e9d..ca8e8b135 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -47,7 +47,6 @@ typedef struct ivas_hrtfs_header_t } ivas_hrtfs_header_t; -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES typedef enum { HRTF_READER_RENDERER_BINAURAL_INVALID, @@ -60,7 +59,6 @@ typedef enum HRTF_READER_RENDERER_BINAURAL_MIXER_CONV_ROOM, HRTF_READER_RENDERER_BINAURAL_REVERB_ALL } HRTF_READER_RENDERER_TYPE; -#endif /*---------------------------------------------------------------------* * hrtfFileReader_open() @@ -94,7 +92,6 @@ ivas_error load_HRTF_binary( const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES /*---------------------------------------------------------------------* * load_reverb_binary() * @@ -110,7 +107,6 @@ ivas_error load_reverb_binary( #endif const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); -#endif /*---------------------------------------------------------------------* * create_SetOfHRTF_from_binary() -- GitLab From 1d1b53a5a5552a746d563bc9ada69810c20cd0da Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 23 Jun 2025 18:16:41 +0200 Subject: [PATCH 0982/1310] Avoid rescale of Q_syn_Overl_TDACFB in TCX PLC, just copy it with current Q value. Also add comment on Q value asignment so it is clear where it comes from after lerp(). --- lib_dec/er_dec_tcx_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 374e4c3a6..5c9b4dcbf 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -1860,9 +1860,14 @@ void con_tcx_ivas_fx( move16(); /* create aliasing and windowing need for transition to TCX10/5 */ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT + Copy( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ) ); + hTcxDec->Q_syn_Overl_TDACFB = Q_syn; +#else // bufferCopyFx( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ), Q_syn, 0, -1, 0 ); Copy_Scale_sig( syn + L_frame, hTcxDec->syn_Overl_TDACFB, shr( L_frame, 1 ), sub( Q_syn, 1 ) ); hTcxDec->Q_syn_Overl_TDACFB = sub( Q_syn, 1 ); +#endif move16(); FOR( i = 0; i < W12; i++ ) @@ -1922,7 +1927,7 @@ void con_tcx_ivas_fx( hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame ); - st->hHQ_core->Q_old_wtda_LB = Q_syn; + st->hHQ_core->Q_old_wtda_LB = Q_syn; // st->hHQ_core->Q_old_wtda st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/ move16(); -- GitLab From 1f09e81bea4eed7d404af5ce613f8366fa9c35fd Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 23 Jun 2025 18:20:31 +0200 Subject: [PATCH 0983/1310] clang format --- lib_dec/er_dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 5c9b4dcbf..37465bc29 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -1927,7 +1927,7 @@ void con_tcx_ivas_fx( hTcxDec->Q_syn_Overl_TDAC = hTcxDec->Q_syn_Overl_TDACFB; move16(); lerp( st->hHQ_core->old_out_fx, st->hHQ_core->old_out_LB_fx, st->L_frame, L_frame ); - st->hHQ_core->Q_old_wtda_LB = Q_syn; // st->hHQ_core->Q_old_wtda + st->hHQ_core->Q_old_wtda_LB = Q_syn; // st->hHQ_core->Q_old_wtda st->old_enr_LP = Enr_1_Az_fx( A_local, L_SUBFR ); /*Q3*/ move16(); -- GitLab From 3ed5565acd314c7c36586c4995fdb602688149af Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 24 Jun 2025 09:51:22 +0200 Subject: [PATCH 0984/1310] Minor cleanup and set basop-ci-branch-pc as scripts folder --- .gitlab-ci.yml | 7 ++---- apps/decoder.c | 48 ------------------------------------- apps/renderer.c | 45 ---------------------------------- lib_util/hrtf_file_reader.c | 23 ------------------ lib_util/hrtf_file_reader.h | 11 --------- 5 files changed, 2 insertions(+), 132 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0df727291..c10a32b07 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,7 +29,7 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" + BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch-pc" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 @@ -272,15 +272,12 @@ stages: - cd $SCRIPTS_DIR - sed -i '/fetch/d' .git/config # Remove all fetch lines to clean out dead links - git remote set-branches --add origin $BASOP_CI_BRANCH_PC_REPO # Add currently used branch - - git remote set-branches --add origin main # Add main to be able to load new format HRTFs - git fetch - git restore --staged . # Needed if HRTF model files were updated. - git restore . # Just as a precaution - git checkout $BASOP_CI_BRANCH_PC_REPO - git pull origin $BASOP_CI_BRANCH_PC_REPO -# Restore new format of HRTF binary - - git fetch origin main - - git checkout 78154d0b3f1b2c6c8ff8a234f3f7cf865d467d35 -- scripts/binauralRenderer_interface/binaural_renderers_hrtf_data + - cd - - cp -r $SCRIPTS_DIR/ci . - cp -r $SCRIPTS_DIR/scripts . diff --git a/apps/decoder.c b/apps/decoder.c index 0ed86b187..746564eb4 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -576,32 +576,8 @@ int main( { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) { -#ifdef FIX_OLD_BINARY_FORMAT - hrtfFileReader_close( &hrtfReader ); - strcat( arg.hrtfFileName, "new" ); - - if ( hrtfFileReader_open( arg.hrtfFileName, &hrtfReader ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } - - if ( ( error = load_HRTF_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) - { - if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } - else - { - destroy_td_hrtf( hHrtfTD ); - } - } -#else fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); goto cleanup; -#endif } else { @@ -627,29 +603,6 @@ int main( if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) { -#ifdef FIX_OLD_BINARY_FORMAT - cleanup_SetOfHRTF( hSetOfHRTF ); - hrtfFileReader_close( &hrtfReader ); - strcat( arg.hrtfFileName, "new" ); - - if ( hrtfFileReader_open( arg.hrtfFileName, &hrtfReader ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } - if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) - { - if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } - else - { - destroy_SetOfHRTF( hSetOfHRTF ); - } - } -#else if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) { fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); @@ -659,7 +612,6 @@ int main( { destroy_SetOfHRTF( hSetOfHRTF ); } -#endif } IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; diff --git a/apps/renderer.c b/apps/renderer.c index b2e732c6f..b1b7e2258 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -980,30 +980,8 @@ int main( { if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) { -#ifdef FIX_OLD_BINARY_FORMAT - hrtfFileReader_close( &hrtfFileReader ); - strcat( args.customHrtfFilePath, "new" ); - if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); - goto cleanup; - } - if ( ( error = load_HRTF_binary( *hHrtfTD, hrtfFileReader ) ) != IVAS_ERR_OK ) - { - if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); - goto cleanup; - } - else - { - destroy_td_hrtf( hHrtfTD ); - } - } -#else fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); goto cleanup; -#endif } else { @@ -1030,28 +1008,6 @@ int main( if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfFileReader, args.sampleRate ) ) != IVAS_ERR_OK ) { -#ifdef FIX_OLD_BINARY_FORMAT - cleanup_SetOfHRTF( hSetOfHRTF ); - hrtfFileReader_close( &hrtfFileReader ); - strcat( args.customHrtfFilePath, "new" ); - if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); - goto cleanup; - } - if ( ( error = create_SetOfHRTF_from_binary( *hSetOfHRTF, hrtfFileReader, args.sampleRate ) ) != IVAS_ERR_OK ) - { - if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); - goto cleanup; - } - else - { - destroy_SetOfHRTF( hSetOfHRTF ); - } - } -#else if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) { fprintf( stderr, "\nError in loading HRTF binary file %s:%s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); @@ -1061,7 +1017,6 @@ int main( { destroy_SetOfHRTF( hSetOfHRTF ); } -#endif } if ( ( error = IVAS_REND_GetHrtfFastConvHandle( hIvasRend, &hHrtfFastConv ) ) != IVAS_ERR_OK ) diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index c6d1d48ec..0d4dd8619 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -2311,29 +2311,6 @@ static void destroy_HRTF( return; } -#ifdef FIX_OLD_BINARY_FORMAT -/*---------------------------------------------------------------------* - * cleanup_SetOfHRTF() - * - * Destroy the HRTF data set. - *---------------------------------------------------------------------*/ - -void cleanup_SetOfHRTF( - HRTFS_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ -) -{ - if ( ( hSetOfHRTF != NULL ) && ( *hSetOfHRTF != NULL ) ) - { - destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_combined ) ); - destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_hoa3 ) ); - destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_hoa2 ) ); - destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_hrir_foa ) ); - destroy_HRTF( &( ( *hSetOfHRTF )->hHRTF_brir_combined ) ); - } - - return; -} -#endif /*---------------------------------------------------------------------* * destroy_SetOfHRTF() diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index ca8e8b135..91e68b358 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -120,17 +120,6 @@ ivas_error create_SetOfHRTF_from_binary( int32_t output_Fs /* i : Output sampling frequency */ ); -#ifdef FIX_OLD_BINARY_FORMAT -/*---------------------------------------------------------------------* - * cleanup_SetOfHRTF() - * - * Destroy the HRTF data set. - *---------------------------------------------------------------------*/ - -void cleanup_SetOfHRTF( - IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF /* i/o: Set of HRTF CRend handle */ -); -#endif /*---------------------------------------------------------------------* * destroy_SetOfHRTF() -- GitLab From 9fd0c1d5de2b0d817c2eaac47ebe1d551b257308 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 24 Jun 2025 09:59:11 +0200 Subject: [PATCH 0985/1310] Enable HRTF model from file tests --- .gitlab-ci.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c10a32b07..9482f081f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,6 +13,9 @@ variables: SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" TEST_SUITE: "" + DISABLE_HRTF_MODEL_TESTS: "" + # DISABLE_HRTF_MODEL_TESTS: "-k not model" #enable this declaration to disable HRTF model from file tests + # These path variables are used by the pytest calls. # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain DUT_ENCODER_PATH: "./IVAS_cod" @@ -690,11 +693,11 @@ stages: - *check-up-to-date-in-comparison-jobs - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -k "not model" > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH $DISABLE_HRTF_MODEL_TESTS > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout -k "not model" > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout $DISABLE_HRTF_MODEL_TESTS > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE @@ -2211,7 +2214,7 @@ ivas-pytest-on-merge-request: ### prepare pytest # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -k "not model" + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 $DISABLE_HRTF_MODEL_TESTS ### Run test using branch scripts and input - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi @@ -2219,7 +2222,7 @@ ivas-pytest-on-merge-request: ### run pytest - exit_code=0 - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout -k "not model" || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout $DISABLE_HRTF_MODEL_TESTS || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check -- GitLab From 66578364d370196d64f463f92ee3c84f01e0adad Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 10:07:39 +0200 Subject: [PATCH 0986/1310] update CI repo sHA --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e110e0aed..40d84a699 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF 41186736915f5c0a857ac92e8ab438c434e5247d + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF a31272de16bd1b556269a50bc179321a60f2a500 include: - local: .gitlab-ci/variables.yml -- GitLab From 39bee78b39b4feb3d9a9d6f90ce0ae2d76a5bf71 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 24 Jun 2025 10:07:53 +0200 Subject: [PATCH 0987/1310] Remove obsolete define FIX_OLD_BINARY_FORMAT --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 78a494c61..662fb2be2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -111,7 +111,6 @@ #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT -#define FIX_OLD_BINARY_FORMAT /* Orange: trick to make tests succesful when changing hrtf binary format between ref and new branch*/ //#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #endif -- GitLab From c809bdea7674b8f96f09ffc3b843be6af3d4f854 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 10:32:21 +0200 Subject: [PATCH 0988/1310] add reference to before_script --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 40d84a699..a39762643 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1066,13 +1066,14 @@ check-be-between-renderer-framesizes: stage: test needs: ["build-codec-linux-make"] script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - !reference [ .test-job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh - make clean - make -j + - echo "$SHORT_TEST_SUITE" - pytest_args="$SHORT_TEST_SUITE --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec" - - python3 -m pytest --update_ref 1 "$pytest_args" + - python3 -m pytest "$pytest_args" --update_ref 1 - exit_code=0 - exit_code5=0 -- GitLab From fb5d39168462c39caeec259c5d062e099454b8bd Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 10:33:54 +0200 Subject: [PATCH 0989/1310] [revert-me] temporarily disable some jobs --- .gitlab-ci.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a39762643..5548bb308 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -850,7 +850,7 @@ build-codec-linux-make: - make -j # ensure that codec builds on linux with instrumentation active -build-codec-linux-instrumented-make: +.build-codec-linux-instrumented-make: rules: - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -867,7 +867,7 @@ build-codec-linux-instrumented-make: - bash scripts/prepare_instrumentation.sh -m MEM_ONLY - make -j -C $INSTR_DIR -build-codec-linux-debugging-make: +.build-codec-linux-debugging-make: rules: - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -885,7 +885,7 @@ build-codec-linux-debugging-make: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/activate-debug-mode-info-if-set.sh - make -j -build-codec-windows-msbuild: +.build-codec-windows-msbuild: rules: - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -908,7 +908,7 @@ build-codec-windows-msbuild: # --------------------------------------------------------------- ### jobs that check for bitexactness of fx encoder and decoder -check-be-to-target-short-enc-0db: +.check-be-to-target-short-enc-0db: extends: - .check-be-to-target-job variables: @@ -919,7 +919,7 @@ check-be-to-target-short-enc-0db: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -check-be-to-target-short-enc-+10db: +.check-be-to-target-short-enc-+10db: extends: - .check-be-to-target-job variables: @@ -930,7 +930,7 @@ check-be-to-target-short-enc-+10db: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -check-be-to-target-short-enc--10db: +.check-be-to-target-short-enc--10db: extends: - .check-be-to-target-job variables: @@ -941,7 +941,7 @@ check-be-to-target-short-enc--10db: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -check-be-to-target-short-dec-0db: +.check-be-to-target-short-dec-0db: extends: - .check-be-to-target-job variables: @@ -952,7 +952,7 @@ check-be-to-target-short-dec-0db: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -check-be-to-target-short-dec-+10db: +.check-be-to-target-short-dec-+10db: extends: - .check-be-to-target-job variables: @@ -963,7 +963,7 @@ check-be-to-target-short-dec-+10db: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -check-be-to-target-short-dec--10db: +.check-be-to-target-short-dec--10db: extends: - .check-be-to-target-job variables: @@ -975,7 +975,7 @@ check-be-to-target-short-dec--10db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" ### jobs that check for regressions on non-BE testcases -check-regressions-short-enc-0db: +.check-regressions-short-enc-0db: extends: - .check-regressions-pytest-job needs: @@ -989,7 +989,7 @@ check-regressions-short-enc-0db: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -check-regressions-short-enc-+10db: +.check-regressions-short-enc-+10db: extends: - .check-regressions-pytest-job needs: @@ -1003,7 +1003,7 @@ check-regressions-short-enc-+10db: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -check-regressions-short-enc--10db: +.check-regressions-short-enc--10db: extends: - .check-regressions-pytest-job needs: @@ -1017,7 +1017,7 @@ check-regressions-short-enc--10db: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -check-regressions-short-dec-0db: +.check-regressions-short-dec-0db: extends: - .check-regressions-pytest-job needs: @@ -1031,7 +1031,7 @@ check-regressions-short-dec-0db: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -check-regressions-short-dec-+10db: +.check-regressions-short-dec-+10db: extends: - .check-regressions-pytest-job needs: @@ -1045,7 +1045,7 @@ check-regressions-short-dec-+10db: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -check-regressions-short-dec--10db: +.check-regressions-short-dec--10db: extends: - .check-regressions-pytest-job needs: @@ -1540,7 +1540,7 @@ coverage-test-on-main-scheduled: # --------------------------------------------------------------- # check bitexactness to EVS -be-2-evs-26444: +.be-2-evs-26444: extends: - .test-job-linux rules: -- GitLab From 9daed1624511bb5e2e79454fa7c7955a77477261 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 10:49:01 +0200 Subject: [PATCH 0990/1310] fix obsolete reference call and add dbg output --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5548bb308..36ae9e0cd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1066,13 +1066,15 @@ check-be-between-renderer-framesizes: stage: test needs: ["build-codec-linux-make"] script: - - !reference [ .test-job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh - make clean - make -j - echo "$SHORT_TEST_SUITE" - pytest_args="$SHORT_TEST_SUITE --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec" + - ls -l + - echo "$pytest_args" + - set euxo - python3 -m pytest "$pytest_args" --update_ref 1 - exit_code=0 -- GitLab From 9b60e5901202deddb2609df16ed19ca839796ec0 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 10:59:07 +0200 Subject: [PATCH 0991/1310] try direct putting the command --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 36ae9e0cd..ddb15f700 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1075,7 +1075,8 @@ check-be-between-renderer-framesizes: - ls -l - echo "$pytest_args" - set euxo - - python3 -m pytest "$pytest_args" --update_ref 1 + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 + # - python3 -m pytest "$pytest_args" --update_ref 1 - exit_code=0 - exit_code5=0 -- GitLab From f22253281acdbff87e291a31fd45009475e4826d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 24 Jun 2025 11:24:46 +0200 Subject: [PATCH 0992/1310] Enable switches NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES, FIX_638_ENERGIE_IAC_ROM_TABLES and FIX_777_COMBI_RENDER_CONFIG_FILE --- lib_com/options.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 662fb2be2..0c8f23d2a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,18 +110,16 @@ #endif #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ -#ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT -//#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ -#endif +#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ -//#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ +#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ #define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ #define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ -//#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ +#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ -- GitLab From 6ea8b19de1a60324c8f9d053d936a86cad07bfc2 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 11:45:07 +0200 Subject: [PATCH 0993/1310] add missing build --- .gitlab-ci.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ddb15f700..b477d0852 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1070,19 +1070,15 @@ check-be-between-renderer-framesizes: - make clean - make -j - echo "$SHORT_TEST_SUITE" - - pytest_args="$SHORT_TEST_SUITE --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec" - - ls -l - - echo "$pytest_args" - - set euxo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 - # - python3 -m pytest "$pytest_args" --update_ref 1 - exit_code=0 - exit_code5=0 - exit_code10=0 - - python3 -m pytest $pytest_args --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? - - python3 -m pytest $pytest_args --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? + - python3 -m pytest $tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? + - python3 -m pytest $tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true -- GitLab From 724af1624dd863a2a61a849ac030cdea5b4a6d2e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 12:14:11 +0200 Subject: [PATCH 0994/1310] remove unsupported testcases before running --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b477d0852..f36594e12 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1072,9 +1072,12 @@ check-be-between-renderer-framesizes: - echo "$SHORT_TEST_SUITE" - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 + - python3 ci/remove_unsupported_testcases.py $PRM_FILES - exit_code=0 + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 || exit_code=$? + - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors." exit 1; fi + - exit_code5=0 - exit_code10=0 - python3 -m pytest $tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? -- GitLab From 8d1d97234e5a270fcc66c5aec279cdca6a771f4e Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 24 Jun 2025 12:24:04 +0200 Subject: [PATCH 0995/1310] Modify q_old_out_diff calculation in IMDCT_ivas_fx for TCX-20 and not TCX-only frames. --- lib_dec/dec_tcx_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index d12eabe4f..9e28adeb6 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3385,7 +3385,8 @@ void IMDCT_ivas_fx( Word16 diff = sub( q_tmp_fx_32, q_win ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - Word16 q_old_out_diff = s_max( sub( q_tmp_fx_32, *q_old_out_fx ), 0 ); + // Word16 q_old_out_diff = s_max( sub( q_tmp_fx_32, *q_old_out_fx ), 0 ); + Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); #endif FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -- GitLab From 9674041d1ad58fae460e7e18c5cf1fdfec2a140d Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 13:00:09 +0200 Subject: [PATCH 0996/1310] change asserts --- lib_dec/dec_gen_voic_fx.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index c61d3b56f..fdabd0a3d 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -468,9 +468,12 @@ ivas_error decod_gen_voic_fx( Word16 op16_2 = sub( Qenratio, 10 ); Word16 op16_3 = sub( Qsp_enratio, 15 ); - assert( op16_1 >= 0 ); + //assert( op16_1 >= 0 ); /*FAILS*/ + assert( op16_1 <= 0 ); + assert( op16_2 >= 0 ); - assert( op16_3 >= 0 ); + //assert( op16_3 >= 0 ); /*FAILS*/ + assert( op16_3 <= 0 ); BASOP_SATURATE_WARNING_OFF op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate( op16_1 ) ); -- GitLab From ef91f515af7630c98ccf1f25144f0dcc0b019baf Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 13:05:20 +0200 Subject: [PATCH 0997/1310] clang patch --- lib_dec/dec_gen_voic_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index fdabd0a3d..4c8543987 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -468,11 +468,11 @@ ivas_error decod_gen_voic_fx( Word16 op16_2 = sub( Qenratio, 10 ); Word16 op16_3 = sub( Qsp_enratio, 15 ); - //assert( op16_1 >= 0 ); /*FAILS*/ + // assert( op16_1 >= 0 ); /*FAILS*/ assert( op16_1 <= 0 ); assert( op16_2 >= 0 ); - //assert( op16_3 >= 0 ); /*FAILS*/ + // assert( op16_3 >= 0 ); /*FAILS*/ assert( op16_3 <= 0 ); BASOP_SATURATE_WARNING_OFF -- GitLab From aafdfa1096689fa4c1e6368c4ae51dd4a76a88f6 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 14:09:49 +0200 Subject: [PATCH 0998/1310] change asserts --- lib_dec/dec_gen_voic_fx.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 4c8543987..53ccc4586 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -469,11 +469,13 @@ ivas_error decod_gen_voic_fx( Word16 op16_3 = sub( Qsp_enratio, 15 ); // assert( op16_1 >= 0 ); /*FAILS*/ - assert( op16_1 <= 0 ); + //assert( op16_1 <= 0 ); /*FAILS*/ + + //assert( op16_2 >= 0 ); /*FAILS*/ + assert( op16_2 <= 0 ); - assert( op16_2 >= 0 ); // assert( op16_3 >= 0 ); /*FAILS*/ - assert( op16_3 <= 0 ); + // assert( op16_3 <= 0 ); /*FAILS*/ BASOP_SATURATE_WARNING_OFF op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate( op16_1 ) ); -- GitLab From a4d1c5451a340fd0e53f970f63674aecea17e091 Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 24 Jun 2025 14:11:31 +0200 Subject: [PATCH 0999/1310] Modify q_old_out_diff calculation in IMDCT_ivas_fx for TCX-20 and not TCX-only frames. --- lib_dec/dec_tcx_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 9e28adeb6..0e0c6b436 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3385,8 +3385,13 @@ void IMDCT_ivas_fx( Word16 diff = sub( q_tmp_fx_32, q_win ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - // Word16 q_old_out_diff = s_max( sub( q_tmp_fx_32, *q_old_out_fx ), 0 ); Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); + IF( q_old_out_diff < 0) + { + Scale_sig( old_out_fx, L_frame, q_old_out_diff ); + *q_old_out_fx = add( *q_old_out_fx, q_old_out_diff ); + q_old_out_diff = 0; + } #endif FOR( Word16 ind = 0; ind < L_frame; ind++ ) { -- GitLab From e85ff0c6d01baf89d55de20c062c4ed0ee7e11a5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 14:12:33 +0200 Subject: [PATCH 1000/1310] clang patch --- lib_dec/dec_gen_voic_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 53ccc4586..e836718d5 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -469,10 +469,10 @@ ivas_error decod_gen_voic_fx( Word16 op16_3 = sub( Qsp_enratio, 15 ); // assert( op16_1 >= 0 ); /*FAILS*/ - //assert( op16_1 <= 0 ); /*FAILS*/ + // assert( op16_1 <= 0 ); /*FAILS*/ - //assert( op16_2 >= 0 ); /*FAILS*/ - assert( op16_2 <= 0 ); + // assert( op16_2 >= 0 ); /*FAILS*/ + assert( op16_2 <= 0 ); // assert( op16_3 >= 0 ); /*FAILS*/ // assert( op16_3 <= 0 ); /*FAILS*/ -- GitLab From 7a097aea15847416726d624fe5cafae68ad5addd Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 24 Jun 2025 14:15:46 +0200 Subject: [PATCH 1001/1310] Applied Clang formatting patch. --- lib_dec/dec_tcx_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 0e0c6b436..b993f6753 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3386,9 +3386,9 @@ void IMDCT_ivas_fx( Word16 diff = sub( q_tmp_fx_32, q_win ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD Word16 q_old_out_diff = sub( q_tmp_fx_32, *q_old_out_fx ); - IF( q_old_out_diff < 0) + IF( q_old_out_diff < 0 ) { - Scale_sig( old_out_fx, L_frame, q_old_out_diff ); + Scale_sig( old_out_fx, L_frame, q_old_out_diff ); *q_old_out_fx = add( *q_old_out_fx, q_old_out_diff ); q_old_out_diff = 0; } -- GitLab From 69d1b54024f672dcad5bcbb1e61b8753ac966c0a Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 24 Jun 2025 22:45:28 +1000 Subject: [PATCH 1002/1310] reduce precision of normalized response to avoid magnitude overshoot --- lib_com/ivas_spar_com_fx.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 0d6b9ec03..6dea0a20d 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4265,6 +4265,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( #ifdef NONBE_FIX_1748_SPAR_DIV_OPT Word16 num_ch_order, norm_t, tmp_e; + Word32 tmp_norm_out; #else Word16 num_ch_order, hoa2_ch_order; #endif @@ -4341,9 +4342,9 @@ void ivas_get_spar_md_from_dirac_enc_fx( { FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ), &tmp_e ); // Q31 - tmp_e - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( tmp_e, Q1 ) ); // q30 + tmp_norm_out = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ), &tmp_e ); // Q31 - tmp_e + tmp_norm_out = L_shl( tmp_norm_out, sub( tmp_e, Q1 ) ); // q30 + response_avg_fx[ch] = L_and( tmp_norm_out, 0xffff8000 ); // q30 move32(); } } @@ -4868,6 +4869,7 @@ void ivas_get_spar_md_from_dirac_fx( Word16 norm_q; #ifdef NONBE_FIX_1748_SPAR_DIV_OPT Word16 num_ch_order, norm_t, tmp_e; + Word32 tmp_norm_out; #else Word16 num_ch_order, hoa2_ch_order; #endif @@ -4946,9 +4948,9 @@ void ivas_get_spar_md_from_dirac_fx( { FOR( ch = 1; ch < foa_ch; ch++ ) { - response_avg_fx[ch] = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, response_avg_fx[ch] ), &tmp_e ); // Q31 - tmp_e - move32(); - response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( tmp_e, Q1 ) ); // q30 + tmp_norm_out = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ), &tmp_e ); // Q31 - tmp_e + tmp_norm_out = L_shl( tmp_norm_out, sub( tmp_e, Q1 ) ); // q30 + response_avg_fx[ch] = L_and( tmp_norm_out, 0xffff8000 ); // q30 move32(); } } -- GitLab From 3c20196fc000eacc787c62cecc5c6bba9ea1aaa2 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 14:46:52 +0200 Subject: [PATCH 1003/1310] change asserts --- lib_dec/dec_gen_voic_fx.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index e836718d5..557ad9be3 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -468,17 +468,9 @@ ivas_error decod_gen_voic_fx( Word16 op16_2 = sub( Qenratio, 10 ); Word16 op16_3 = sub( Qsp_enratio, 15 ); - // assert( op16_1 >= 0 ); /*FAILS*/ - // assert( op16_1 <= 0 ); /*FAILS*/ - - // assert( op16_2 >= 0 ); /*FAILS*/ - assert( op16_2 <= 0 ); - - // assert( op16_3 >= 0 ); /*FAILS*/ - // assert( op16_3 <= 0 ); /*FAILS*/ - + /*Due to all shift directrions being possible, we need both possibilities, shl_sat and shr_r*/ BASOP_SATURATE_WARNING_OFF - op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate( op16_1 ) ); + op16_1 = op16_1 >= 0 ? shr_r( enratio , op16_1 ) : shl_sat( enratio , negate( op16_1 ) ); op16_2 = op16_2 >= 0 ? shr_r( sp_enratio, op16_2 ) : shl_sat( sp_enratio, negate( op16_2 ) ); op16_3 = op16_3 >= 0 ? shr_r( sp_enratio, op16_3 ) : shl_sat( sp_enratio, negate( op16_3 ) ); BASOP_SATURATE_WARNING_ON -- GitLab From 24f64f6ac6cd3ad7e6083a4f2d511ae0140d1b85 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 14:50:07 +0200 Subject: [PATCH 1004/1310] clang patch --- lib_dec/dec_gen_voic_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 557ad9be3..935200eea 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -470,7 +470,7 @@ ivas_error decod_gen_voic_fx( /*Due to all shift directrions being possible, we need both possibilities, shl_sat and shr_r*/ BASOP_SATURATE_WARNING_OFF - op16_1 = op16_1 >= 0 ? shr_r( enratio , op16_1 ) : shl_sat( enratio , negate( op16_1 ) ); + op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate( op16_1 ) ); op16_2 = op16_2 >= 0 ? shr_r( sp_enratio, op16_2 ) : shl_sat( sp_enratio, negate( op16_2 ) ); op16_3 = op16_3 >= 0 ? shr_r( sp_enratio, op16_3 ) : shl_sat( sp_enratio, negate( op16_3 ) ); BASOP_SATURATE_WARNING_ON -- GitLab From 45c49362a025bf9b6ca1c3b49789acb232ac0bab Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 14:59:37 +0200 Subject: [PATCH 1005/1310] cleanup --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index ef780724e..1ef10382e 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4428,16 +4428,9 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro - // assert( lfeGain_fx_exp >= 0 ); FAILS assert( lfeGain_fx_exp <= 0 ); - if ( lfeGain_fx_exp >= 0 ) - { - lfeGain_fx = shl_sat( lfeGain_fx, lfeGain_fx_exp ); // Q15 - } - else - { - lfeGain_fx = shr_r( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 - } + /*if assert is thrown, shl_sat can handle the left shift*/ + lfeGain_fx = shr_r( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 #else Flag Overflow; lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp & Overflow ); // Q15 @@ -4454,16 +4447,9 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro - // assert( transportGain_fx_exp >= 0 ); FAILS assert( transportGain_fx_exp <= 0 ); - if ( transportGain_fx_exp >= 0 ) - { - transportGain_fx = shl_sat( transportGain_fx, transportGain_fx_exp ); // Q15 - } - else - { - transportGain_fx = shr_r( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 - } + /*if assert is thrown, shl_sat can handle the left shift*/ + transportGain_fx = shr_r( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 #else Flag Overflow; transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp & Overflow ); // Q15 -- GitLab From bce58b11c1edef4fea5faf4311f89a874df5d7ad Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 14:59:54 +0200 Subject: [PATCH 1006/1310] asserts change --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index 71e221a61..5743064f2 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -137,15 +137,14 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); - // assert( op1 >= 0 ); FAILS - // assert( op1 <= 0 ); FAILS --> twoway needed + assert( op1 >= 0 ); if ( op1 >= 0 ) { - cc = shl_sat( cc, add( normXY, normCC ) ); + cc = shl_sat( cc, op1 ); } else { - cc = shr_r( cc, negate( add( normXY, normCC ) ) ); + cc = shr_r( cc, negate( op1 ) ); } #else Flag Overflow; -- GitLab From e1ee6cb34676976ee4065492669485e1e1c9278a Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 24 Jun 2025 15:07:39 +0200 Subject: [PATCH 1007/1310] fix for issue 1762 --- lib_com/options.h | 2 ++ lib_enc/analy_sp_fx.c | 4 ++++ lib_enc/find_tilt_fx.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 81300af69..01f7df13f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,4 +122,6 @@ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ +#define FIX_1762_COMPILER_ISSUE /* FhG: fix compiler issues with W_mac_32_32() + ONE_IN_Q30 */ + #endif diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index dbd656dec..8541decd8 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -642,7 +642,11 @@ void ivas_analy_sp_fx( move32(); /* PS[i] = ( Bin_E[i] + 1e-5f + Bin_E[i + L_FFT / 2] + 1e-5f ) / 2.0f; */ +#ifndef FIX_1762_COMPILER_ISSUE PS[i] = W_extract_h( W_add( W_mac_32_32( W_mult_32_32( Bin_E[i], ONE_IN_Q30 ), Bin_E[i + L_FFT / 2], ONE_IN_Q30 ), W_shr( W_shl( add_const, 32 ), sub( 31, *q_Bin_E ) ) ) ); // *q_Bin_E +#else + PS[i] = W_extract_h( W_add( W_shl( W_add( W_deposit32_l( Bin_E[i] ), W_deposit32_l( Bin_E[i + L_FFT / 2] ) ), 31 ), W_shr( W_shl( add_const, 32 ), sub( 31, *q_Bin_E ) ) ) ); // *q_Bin_E +#endif move32(); /* Bin_E[i] = (float) ( 10.0f * log( PS[i] ) ); */ diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c index dc78719d2..d40000434 100644 --- a/lib_enc/find_tilt_fx.c +++ b/lib_enc/find_tilt_fx.c @@ -324,7 +324,11 @@ void find_tilt_ivas_fx( } lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */ +#ifndef FIX_1762_COMPILER_ISSUE hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr +#else + hp_bckr = W_extract_h( W_shl( W_add( W_deposit32_l( bckr[max_band - 1] ), W_deposit32_l( bckr[max_band] ) ), 31 ) ); // q_bckr +#endif if ( hp_bckr == 0 ) /* Avoid division by zero. */ { hp_bckr = L_deposit_l( 1 ); -- GitLab From cebd2e3f5d372a71479f8b06258566fcbaec097d Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 15:17:12 +0200 Subject: [PATCH 1008/1310] change asserts --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index 5743064f2..a04703388 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -137,7 +137,8 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); - assert( op1 >= 0 ); + assert( op1 >= 0 ); /*FAILED*/ + assert( op1 <= 0 ); if ( op1 >= 0 ) { cc = shl_sat( cc, op1 ); -- GitLab From 0233735aa9281e43dda0737436f97835e58dcd2b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 15:17:28 +0200 Subject: [PATCH 1009/1310] change asserts --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index a04703388..a6e735252 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -137,7 +137,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); - assert( op1 >= 0 ); /*FAILED*/ + //assert( op1 >= 0 ); /*FAILED*/ assert( op1 <= 0 ); if ( op1 >= 0 ) { -- GitLab From 97bae97b70ac31c2e9893cf06e7244a3f37eb5ed Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 24 Jun 2025 15:18:29 +0200 Subject: [PATCH 1010/1310] formatting --- lib_enc/find_tilt_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/find_tilt_fx.c b/lib_enc/find_tilt_fx.c index d40000434..a49955e6c 100644 --- a/lib_enc/find_tilt_fx.c +++ b/lib_enc/find_tilt_fx.c @@ -322,14 +322,14 @@ void find_tilt_ivas_fx( { sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16 } - lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr - /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */ + lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr + /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */ #ifndef FIX_1762_COMPILER_ISSUE hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr #else hp_bckr = W_extract_h( W_shl( W_add( W_deposit32_l( bckr[max_band - 1] ), W_deposit32_l( bckr[max_band] ) ), 31 ) ); // q_bckr #endif - if ( hp_bckr == 0 ) /* Avoid division by zero. */ + if ( hp_bckr == 0 ) /* Avoid division by zero. */ { hp_bckr = L_deposit_l( 1 ); } -- GitLab From 7aa883744d7f335a5cf2247d58c446ffe4e4ad74 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 15:19:33 +0200 Subject: [PATCH 1011/1310] clang patch --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index a6e735252..5930f9870 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -137,7 +137,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); - //assert( op1 >= 0 ); /*FAILED*/ + // assert( op1 >= 0 ); /*FAILED*/ assert( op1 <= 0 ); if ( op1 >= 0 ) { -- GitLab From a33dd79600b1fe69bd5f51d61a2ec585269de99a Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:23:35 +0200 Subject: [PATCH 1012/1310] Changed Q values for 16kHz HRTF binary --- lib_rend/ivas_hrtf_fx.c | 6 +++--- lib_util/hrtf_file_reader.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 845b61cb1..0b82a8e19 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -315,9 +315,9 @@ ivas_error ivas_HRTF_statistics_init( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrtfStatistics->average_energy_l_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - floatToFixed_arr32( defaultHRIR_right_avg_power_16kHz_fx, HrtfStatistics->average_energy_r_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_right_avg_power_16kHz_fx, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 0d4dd8619..31f75e876 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -811,10 +811,10 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_l_dyn, Q27, lr_iac_len ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_l_dyn, Q23, lr_iac_len ); fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_r_dyn, Q27, lr_iac_len ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_r_dyn, Q23, lr_iac_len ); fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->inter_aural_coherence_dyn, Q23, lr_iac_len ); -- GitLab From a8f56457e553c93c45c923f8cc7af693cc769846 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 24 Jun 2025 14:34:25 +0200 Subject: [PATCH 1013/1310] fix typos --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f36594e12..3a3a4b728 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1080,8 +1080,8 @@ check-be-between-renderer-framesizes: - exit_code5=0 - exit_code10=0 - - python3 -m pytest $tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? - - python3 -m pytest $tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true -- GitLab From 2ad939bc7a179df772a916c85a68e609f5600736 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 24 Jun 2025 23:38:33 +1000 Subject: [PATCH 1014/1310] roll back to divide3232 to retain q15 precision --- lib_com/ivas_spar_com_fx.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 6dea0a20d..2be38b4bc 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4264,7 +4264,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( Word16 norm_q; #ifdef NONBE_FIX_1748_SPAR_DIV_OPT - Word16 num_ch_order, norm_t, tmp_e; + Word16 num_ch_order, norm_t; Word32 tmp_norm_out; #else Word16 num_ch_order, hoa2_ch_order; @@ -4342,9 +4342,8 @@ void ivas_get_spar_md_from_dirac_enc_fx( { FOR( ch = 1; ch < foa_ch; ch++ ) { - tmp_norm_out = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ), &tmp_e ); // Q31 - tmp_e - tmp_norm_out = L_shl( tmp_norm_out, sub( tmp_e, Q1 ) ); // q30 - response_avg_fx[ch] = L_and( tmp_norm_out, 0xffff8000 ); // q30 + tmp_norm_out = divide3232( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ) ); // q15 + response_avg_fx[ch] = L_shl( tmp_norm_out, 15 ); // q30 move32(); } } @@ -4868,7 +4867,7 @@ void ivas_get_spar_md_from_dirac_fx( Word32 norm_fx; Word16 norm_q; #ifdef NONBE_FIX_1748_SPAR_DIV_OPT - Word16 num_ch_order, norm_t, tmp_e; + Word16 num_ch_order, norm_t; Word32 tmp_norm_out; #else Word16 num_ch_order, hoa2_ch_order; @@ -4948,9 +4947,8 @@ void ivas_get_spar_md_from_dirac_fx( { FOR( ch = 1; ch < foa_ch; ch++ ) { - tmp_norm_out = BASOP_Util_Divide3232_Scale_newton( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ), &tmp_e ); // Q31 - tmp_e - tmp_norm_out = L_shl( tmp_norm_out, sub( tmp_e, Q1 ) ); // q30 - response_avg_fx[ch] = L_and( tmp_norm_out, 0xffff8000 ); // q30 + tmp_norm_out = divide3232( response_avg_fx[ch], L_max( norm_fx, L_abs( response_avg_fx[ch] ) ) ); // q15 + response_avg_fx[ch] = L_shl( tmp_norm_out, 15 ); // q30 move32(); } } -- GitLab From bf9e2fb553e83b92d28dfa2ec6af497ea57045d7 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 24 Jun 2025 15:41:11 +0200 Subject: [PATCH 1015/1310] Port MR 2051 and MR 2152 from float --- apps/decoder.c | 3 +- apps/isar_post_rend.c | 136 ++++++++-------- apps/renderer.c | 356 +++++++++++++++++++++--------------------- 3 files changed, 258 insertions(+), 237 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 746564eb4..0108d1325 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -497,7 +497,8 @@ int main( if ( ( error = IVAS_DEC_SetRenderFramesize( hIvasDec, arg.renderFramesize ) ) != IVAS_ERR_OK ) { - return error; + fprintf( stderr, "\nIVAS_DEC_PrintConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; } if ( arg.renderFramesize != asked_frame_size ) diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c index 4b478f7c2..b4ff098ba 100644 --- a/apps/isar_post_rend.c +++ b/apps/isar_post_rend.c @@ -682,19 +682,20 @@ int main( int argc, char **argv ) { - ISAR_POST_REND_HANDLE hIsarPostRend; + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + ISAR_POST_REND_HANDLE hIsarPostRend = NULL; RotFileReader *headRotReader = NULL; RotFileReader *externalOrientationFileReader = NULL; SplitRendBFIFileReader *splitRendBFIReader = NULL; AudioFileReader *audioReader = NULL; - AudioFileWriter *audioWriter; + AudioFileWriter *audioWriter = NULL; int32_t inBufferSize; int32_t outBufferSize; int32_t bitsBufferSize; - int16_t *inpInt16Buffer; - Word32 *inFloatBuffer_fx; - int16_t *outInt16Buffer; - Word32 *outFloatBuffer_fx; + int16_t *inpInt16Buffer = NULL; + Word32 *inFloatBuffer_fx = NULL; + int16_t *outInt16Buffer = NULL; + Word32 *outFloatBuffer_fx = NULL; uint8_t *bitsBufferData = NULL; IVAS_REND_AudioBuffer inBuffer; IVAS_REND_AudioBuffer outBuffer; @@ -716,6 +717,9 @@ int main( reset_mem( USE_BYTES ); #endif + inBuffer.pq_fact = NULL; + outBuffer.pq_fact = NULL; + hSplitRendFileReadWrite = NULL; bitsBuffer.bits = NULL; bitsBuffer.config.bitsRead = 0; @@ -727,7 +731,6 @@ int main( bitsBuffer.config.isar_frame_size_ms = 20; bitsBuffer.config.lc3plusHighRes = 0; - CmdlnArgs args = parseCmdlnArgs( argc, argv ); convert_backslash( args.inputFilePath ); @@ -738,8 +741,8 @@ int main( { if ( RotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.headRotationFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.headRotationFilePath ); + goto cleanup; } } @@ -764,14 +767,14 @@ int main( &bitsBuffer.config.lc3plusHighRes ); if ( error != IVAS_ERR_OK ) { - fprintf( stderr, "Could not open split rend metadata file %s\n", args.inMetadataFilePaths[0] ); - exit( -1 ); + fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.inMetadataFilePaths[0] ); + goto cleanup; } if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", audioFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", audioFilePath ); + goto cleanup; } } @@ -788,8 +791,8 @@ int main( &bitsBuffer.config.lc3plusHighRes ); if ( error != IVAS_ERR_OK ) { - fprintf( stderr, "Could not open split rend metadata file %s\n", args.inputFilePath ); - exit( -1 ); + fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.inputFilePath ); + goto cleanup; } audioReader = NULL; } @@ -814,20 +817,20 @@ int main( /* else if sampling rate given on command line, compare with wav file */ else if ( inFileSampleRate != args.sampleRate ) { - fprintf( stderr, "Sampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); - exit( -1 ); + fprintf( stderr, "\nSampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); + goto cleanup; } break; case IVAS_ERR_SAMPLING_RATE_UNKNOWN: /* Returned when input is raw PCM */ if ( args.sampleRate == 0 ) { - fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" ); - exit( -1 ); + fprintf( stderr, "\nSampling rate must be specified on command line when using raw PCM input\n" ); + goto cleanup; } break; default: - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } int16_t inFileNumChannels = 0; @@ -836,23 +839,24 @@ int main( error = AudioFileReader_getNumChannels( audioReader, &inFileNumChannels ); if ( error != IVAS_ERR_OK && error != IVAS_ERR_NUM_CHANNELS_UNKNOWN ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nAudioFileReader_getNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } + const int16_t frameSize_smpls = (int16_t) ( ( args.render_framesize ) * args.sampleRate * 5 / ( 1000 ) ); args.outConfig.audioConfig = IVAS_AUDIO_CONFIG_BINAURAL; if ( ( error = ISAR_POST_REND_open( &hIsarPostRend, args.sampleRate, args.outConfig.audioConfig, true, 0, 0, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError opening renderer handle: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } /* === Configure === */ if ( ( error = ISAR_POST_REND_InitConfig( hIsarPostRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( args.inConfig.numBinBuses > 0 ) @@ -864,8 +868,8 @@ int main( bitsBuffer.config.isar_frame_size_ms, bitsBuffer.config.lc3plusHighRes ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in getting split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in getting split renderer bitstream header: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -881,8 +885,8 @@ int main( { if ( ( error = ISAR_POST_REND_AddInput( hIsarPostRend, args.inConfig.binBuses[i].audioConfig, &splitBinIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nISAR_POST_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -890,16 +894,16 @@ int main( if ( inFileNumChannels != 0 /* inFileNumChannels is 0 with raw PCM input */ && totalNumInChannels != inFileNumChannels ) { - fprintf( stderr, "Number of channels in input file does not match selected configuration\n" ); - exit( -1 ); + fprintf( stderr, "\nNumber of channels in input file does not match selected configuration\n" ); + goto cleanup; } int16_t numOutChannels = 2; if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) { - fprintf( stderr, "Failed to open file: %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nFailed to open file: %s\n", args.outputFilePath ); + goto cleanup; } inBufferSize = frameSize_smpls * totalNumInChannels; @@ -977,7 +981,7 @@ int main( else { fprintf( stderr, "\nUnable to read from bitstream file!\n" ); - exit( -1 ); + goto cleanup; } } } @@ -988,7 +992,7 @@ int main( if ( ( error = AudioFileReader_read( audioReader, inpInt16Buffer, (int16_t) inBufferSize, &numSamplesRead ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError reading from file %s\n", audioFilePath ); - exit( -1 ); + goto cleanup; } } @@ -1014,21 +1018,21 @@ int main( IF( ( error = HeadRotationFileReading( headRotReader, &headRot, &Pos ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = ISAR_POST_REND_SetHeadRotation( hIsarPostRend, headRot, Pos, DEFAULT_AXIS, sf_idx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError setting Head Rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } else { - fprintf( stderr, "Head Rotation should be enabled in post renderer\n" ); - exit( -1 ); + fprintf( stderr, "\nHead Rotation should be enabled in post renderer\n" ); + goto cleanup; } /* Read from split renderer bfi file if specified */ @@ -1037,14 +1041,14 @@ int main( int16_t bfi; if ( ( error = SplitRendBFIFileReading( splitRendBFIReader, &bfi ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in SplitRendBFIFileReading(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in SplitRendBFIFileReading(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, bfi ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1054,31 +1058,32 @@ int main( { if ( ( error = ISAR_POST_REND_GetInputNumChannels( hIsarPostRend, splitBinIds[i], &numChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + ISAR_POST_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.binBuses[i].inputChannelIndex, numChannels ); if ( ( error = ISAR_POST_REND_FeedInputAudio( hIsarPostRend, splitBinIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nISAR_POST_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } if ( splitBinNeedsNewFrame ) { if ( ( error = ISAR_POST_REND_FeedSplitBinauralBitstream( hIsarPostRend, splitBinIds[i], &bitsBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nISAR_POST_REND_FeedSplitBinauralBitstream failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } if ( ( error = ISAR_POST_REND_GetSplitBinauralSamples( hIsarPostRend, outBuffer, &splitBinNeedsNewFrame ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nISAR_POST_REND_GetSplitBinauralSamples failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } int16_t num_out_channels; @@ -1095,7 +1100,7 @@ int main( if ( ISAR_POST_REND_GetDelay( hIsarPostRend, &delayNumSamples, &delayTimeScale ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to get delay of renderer!\n" ); - exit( -1 ); + goto cleanup; } if ( hSplitRendFileReadWrite != NULL ) @@ -1120,8 +1125,8 @@ int main( { if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error writing audio file %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nError writing audio file %s\n", args.outputFilePath ); + goto cleanup; } delayNumSamples = 0; } @@ -1155,7 +1160,7 @@ int main( if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nOutput audio file writer error\n" ); - exit( -1 ); + goto cleanup; } } @@ -1163,7 +1168,7 @@ int main( if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nOutput audio file writer error\n" ); - exit( -1 ); + goto cleanup; } zeroPadToWrite = 0; } @@ -1187,7 +1192,14 @@ int main( } #endif - /* === Close === */ + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + free( inpInt16Buffer ); free( inFloatBuffer_fx ); free( inBuffer.pq_fact ); @@ -1218,7 +1230,7 @@ int main( print_mem( NULL ); #endif - return 0; + return mainFailed ? -1 : 0; } diff --git a/apps/renderer.c b/apps/renderer.c index b1b7e2258..97b0a5e43 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -720,7 +720,8 @@ int main( int argc, char **argv ) { - IVAS_REND_HANDLE hIvasRend; + bool mainFailed = true; /* Assume main failed until cleanup is reached without errors */ + IVAS_REND_HANDLE hIvasRend = NULL; RotFileReader *headRotReader = NULL; RotFileReader *externalOrientationFileReader = NULL; RotFileReader *referenceRotReader = NULL; @@ -737,7 +738,7 @@ int main( #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; #endif - IsmPositionProvider *positionProvider; + IsmPositionProvider *positionProvider = NULL; LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; RenderConfigReader *renderConfigReader = NULL; MasaFileReader *masaReaders[RENDERER_MAX_MASA_INPUTS]; @@ -745,17 +746,17 @@ int main( IVAS_MASA_METADATA_HANDLE hMasaMetadata[RENDERER_MAX_MASA_INPUTS]; char audioFilePath[FILENAME_MAX]; AudioFileReader *audioReader = NULL; - AudioFileWriter *audioWriter; + AudioFileWriter *audioWriter = NULL; int32_t inBufferSize; int32_t outBufferSize; int32_t bitsBufferSize; - int16_t *inpInt16Buffer; - float *inFloatBuffer; - int16_t *outInt16Buffer; - Word32 *outInt32Buffer; - Word32 *inInt32Buffer; + int16_t *inpInt16Buffer = NULL; + float *inFloatBuffer = NULL; + int16_t *outInt16Buffer = NULL; + Word32 *outInt32Buffer = NULL; + Word32 *inInt32Buffer = NULL; Word32 gain_fx; - float *outFloatBuffer; + float *outFloatBuffer = NULL; uint8_t *bitsBufferData = NULL; IVAS_REND_AudioBuffer inBuffer; IVAS_REND_AudioBuffer outBuffer; @@ -808,13 +809,13 @@ int main( ( args.inConfig.numAudioObjects > 0 && args.inConfig.audioObjects[0].audioConfig == IVAS_AUDIO_CONFIG_OBA && args.inConfig.numAudioObjects == 1 ) ) ) { fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires mono or ISM1 input\n" ); - exit( -1 ); + goto cleanup; } if ( args.nonDiegeticPan && args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_STEREO ) { fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires stereo output\n" ); - exit( -1 ); + goto cleanup; } positionProvider = IsmPositionProvider_open(); @@ -831,8 +832,8 @@ int main( { if ( RotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.headRotationFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.headRotationFilePath ); + goto cleanup; } } @@ -840,16 +841,16 @@ int main( { if ( RotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.referenceRotationFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.referenceRotationFilePath ); + goto cleanup; } } if ( !isEmptyString( args.referenceVectorFilePath ) ) { if ( Vector3PairFileReader_open( args.referenceVectorFilePath, &referenceVectorReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.referenceVectorFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.referenceVectorFilePath ); + goto cleanup; } } @@ -862,8 +863,8 @@ int main( { if ( RotationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.externalOrientationFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.externalOrientationFilePath ); + goto cleanup; } } @@ -872,8 +873,8 @@ int main( { if ( RenderConfigReader_open( args.renderConfigFilePath, &renderConfigReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.renderConfigFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.renderConfigFilePath ); + goto cleanup; } } @@ -896,21 +897,21 @@ int main( { fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); fprintf( stderr, "\nMASA input is missing\n" ); - exit( -1 ); + goto cleanup; } if ( args.inConfig.numAudioObjects == 0 && args.inConfig.numMultiChannelBuses == 0 && args.inConfig.numAmbisonicsBuses == 0 ) { fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); fprintf( stderr, "\nNo object, multi-channel, or Ambisonic input present.\n" ); - exit( -1 ); + goto cleanup; } } if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", audioFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", audioFilePath ); + goto cleanup; } int32_t inFileSampleRate = 0; @@ -927,45 +928,47 @@ int main( /* else if sampling rate given on command line, compare with wav file */ else if ( inFileSampleRate != args.sampleRate ) { - fprintf( stderr, "Sampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); - exit( -1 ); + fprintf( stderr, "\nSampling rate mismatch: %d Hz requested, but %d Hz found in file %s\n", args.sampleRate, inFileSampleRate, args.inputFilePath ); + goto cleanup; } break; case IVAS_ERR_SAMPLING_RATE_UNKNOWN: /* Returned when input is raw PCM */ if ( args.sampleRate == 0 ) { - fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" ); - exit( -1 ); + fprintf( stderr, "\nSampling rate must be specified on command line when using raw PCM input\n" ); + goto cleanup; } break; default: - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + ; } int16_t inFileNumChannels = 0; error = AudioFileReader_getNumChannels( audioReader, &inFileNumChannels ); if ( error != IVAS_ERR_OK && error != IVAS_ERR_NUM_CHANNELS_UNKNOWN ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nAudioFileReader_getNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + const int16_t frameSize_smpls = (int16_t) ( ( args.render_framesize ) * args.sampleRate * 5 / ( 1000 ) ); Word32 nonDiegeticPanGain_fx = ( args.nonDiegeticPanGain == 1.0f ) ? ONE_IN_Q31 : ( args.nonDiegeticPanGain == -1.0f ) ? L_negate( ONE_IN_Q31 ) : (Word32) ( args.nonDiegeticPanGain * ( 1LL << Q31 ) ); IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, !isEmptyString( args.customHrtfFilePath ), args.nonDiegeticPan, nonDiegeticPanGain_fx, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError opening renderer handle: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( !isEmptyString( args.customHrtfFilePath ) ) { if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error opening file: %s\n", args.customHrtfFilePath ); - exit( -1 ); + fprintf( stderr, "\nError opening file: %s\n", args.customHrtfFilePath ); + goto cleanup; } if ( hrtfFileReader != NULL ) @@ -1120,15 +1123,14 @@ int main( if ( ( error = IVAS_REND_PrintConfig( hIvasRend ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\n IVAS_REND_PrintConfig failed: %s\n\n", ivas_error_to_string( error ) ); - // goto cleanup; - exit( -1 ); + goto cleanup; } /* === Configure === */ if ( ( error = IVAS_REND_InitConfig( hIvasRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in Renderer Config Init: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } @@ -1140,20 +1142,20 @@ int main( if ( ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && !is_split_pre_rend_mode( &args ) ) { fprintf( stderr, "\nExternal Renderer Config is supported only when binaural output configurations is used as output OR when Split pre-rendering mode is enabled. Exiting. \n" ); - exit( -1 ); + goto cleanup; } if ( ( error = IVAS_REND_GetRenderConfig( hIvasRend, &renderConfig ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetRenderConfig failed: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + goto cleanup; } if ( RenderConfigReader_read( renderConfigReader, args.renderConfigFilePath, &renderConfig ) != IVAS_ERR_OK ) { - fprintf( stderr, "Failed to read renderer configuration from file %s\n", args.renderConfigFilePath ); - exit( -1 ); + fprintf( stderr, "\nFailed to read renderer configuration from file %s\n", args.renderConfigFilePath ); + goto cleanup; } if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) @@ -1162,14 +1164,14 @@ int main( { if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK ) { - fprintf( stderr, "Invalid room acoustics configuration parameters\n\n" ); - exit( -1 ); + fprintf( stderr, "\nInvalid room acoustics configuration parameters\n\n" ); + goto cleanup; } } else { - fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", args.acousticEnvironmentId ); - exit( -1 ); + fprintf( stderr, "\nFailed to get acoustic environment with ID: %d\n\n", args.acousticEnvironmentId ); + goto cleanup; } renderConfig.roomAcoustics.override = 1; } @@ -1181,7 +1183,7 @@ int main( if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_REND_FeedRenderConfig failed: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + goto cleanup; } CLDFBframeSize_smpls = frameSize_smpls * 2; @@ -1190,8 +1192,8 @@ int main( if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_SetOrientationTrackingMode(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_SetOrientationTrackingMode(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } /* Set up output custom layout configuration */ @@ -1201,8 +1203,8 @@ int main( floatToFixed_arrL_app( args.outConfig.outSetupCustom.elevation, args.outConfig.outSetupCustom.elevation_fx, Q22, IVAS_MAX_OUTPUT_CHANNELS ); if ( ( error = IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( hIvasRend, args.outConfig.outSetupCustom ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_ConfigureCustomOutputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_ConfigureCustomOutputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1222,14 +1224,14 @@ int main( { if ( ( error = IVAS_REND_SetTotalNumberOfObjects( hIvasRend, args.inConfig.numAudioObjects ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_SetTotalNumberOfObjects(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } Word32 var1 = (Word32) ( args.syncMdDelay ); IF( ( error = IVAS_REND_SetIsmMetadataDelay( hIvasRend, var1 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_SetIsmMetadataDelay(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1240,8 +1242,8 @@ int main( { if ( ( error = parseLfePanMtxFile( args.inLfePanningMatrixFile, &lfePanMatrix ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1271,16 +1273,16 @@ int main( { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.multiChannelBuses[i].audioConfig, &mcIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( ( args.inputGainGlobal * dBToLin( args.inConfig.multiChannelBuses[i].gain_dB ) ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, mcIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( args.inConfig.multiChannelBuses[i].audioConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) @@ -1289,8 +1291,8 @@ int main( floatToFixed_arrL_app( args.inConfig.inSetupCustom.elevation, args.inConfig.inSetupCustom.elevation_fx, Q22, IVAS_MAX_OUTPUT_CHANNELS ); if ( ( error = IVAS_REND_ConfigureCustomInputLoudspeakerLayout( hIvasRend, mcIds[i], args.inConfig.inSetupCustom ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_ConfigureCustomInputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_ConfigureCustomInputLoudspeakerLayout(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1299,7 +1301,7 @@ int main( { if ( args.lfePanningEnabled ) { - fprintf( stderr, "Warning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); + fprintf( stderr, "\nWarning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); args.lfePanningEnabled = false; } @@ -1310,8 +1312,8 @@ int main( IF( ( error = IVAS_REND_SetInputLfeMtx_fx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx_fx *) &lfePanMatrix_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfeMtx failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } /* set panning gains for input LFE */ @@ -1320,8 +1322,8 @@ int main( Word32 inputGain = (Word32) ( args.lfeConfigGain * ( 1u << 31 ) ); IF( ( error = IVAS_REND_SetInputLfePos_fx( hIvasRend, mcIds[i], inputGain, (Word16) args.lfeConfigAzimuth, (Word16) args.lfeConfigElevation ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfePos failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } else @@ -1334,8 +1336,8 @@ int main( { if ( ( error = parseLfePanMtxFile( lfeRoutingConfigs[i]->lfe_routing_mtx, &lfePanMatrix ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nparseLfePanMtxFile failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } FOR( Word16 k = 0; k < IVAS_MAX_OUTPUT_CHANNELS; k++ ) @@ -1345,8 +1347,8 @@ int main( if ( ( error = IVAS_REND_SetInputLfeMtx_fx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx_fx *) &lfePanMatrix_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfeMtx failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } /* set position based gains */ @@ -1355,8 +1357,8 @@ int main( Word32 inputGain = (Word32) ( lfeRoutingConfigs[i]->lfe_gain_dB * ( 1u << 31 ) ); IF( ( error = IVAS_REND_SetInputLfePos_fx( hIvasRend, mcIds[i], inputGain, (Word16) lfeRoutingConfigs[i]->lfe_azi, (Word16) lfeRoutingConfigs[i]->lfe_ele ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputLfePos failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1367,15 +1369,15 @@ int main( { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, IVAS_AUDIO_CONFIG_OBA, &ismIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( args.inputGainGlobal * dBToLin( args.inConfig.audioObjects[i].gain_dB ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, ismIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } /* With MASA output, all objects are handled at once, so add only one input having all objects in it */ @@ -1389,15 +1391,15 @@ int main( { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.ambisonicsBuses[i].audioConfig, &sbaIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( args.inputGainGlobal * dBToLin( args.inConfig.ambisonicsBuses[i].gain_dB ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, sbaIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1405,15 +1407,15 @@ int main( { IF( ( error = IVAS_REND_AddInput_fx( hIvasRend, args.inConfig.masaBuses[i].audioConfig, &masaIds[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_AddInput failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } gain_fx = (Word32) ( ( args.inputGainGlobal * dBToLin( args.inConfig.masaBuses[i].gain_dB ) ) * ( 1u << 30 ) ); IF( ( error = IVAS_REND_SetInputGain_fx( hIvasRend, masaIds[i], gain_fx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetInputGain failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1421,8 +1423,8 @@ int main( if ( inFileNumChannels != 0 /* inFileNumChannels is 0 with raw PCM input */ && totalNumInChannels != inFileNumChannels ) { - fprintf( stderr, "Number of channels in input file does not match selected configuration\n" ); - exit( -1 ); + fprintf( stderr, "\nNumber of channels in input file does not match selected configuration\n" ); + goto cleanup; } for ( i = 0; i < args.inConfig.numMasaBuses; ++i ) @@ -1433,19 +1435,19 @@ int main( } } - int16_t numOutChannels; + Word16 numOutChannels; if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_NumOutChannels(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_NumOutChannels(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( cldfb_in_flag ) { if ( ( error = IVAS_REND_openCldfb( cldfbAna, cldfbSyn, totalNumInChannels, numOutChannels, args.sampleRate ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_openCldfb(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_openCldfb(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1461,7 +1463,7 @@ int main( if ( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to get delay of renderer!\n" ); - exit( -1 ); + goto cleanup; } if ( ( error = split_rend_writer_open( &hSplitRendFileReadWrite, @@ -1475,8 +1477,8 @@ int main( args.sampleRate, bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Could not open split rend metadata file %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.outputFilePath ); + goto cleanup; } audioWriter = NULL; } @@ -1494,7 +1496,7 @@ int main( if ( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples_temp, &delayTimeScale_temp ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to get delay of renderer!\n" ); - exit( -1 ); + goto cleanup; } if ( ( error = split_rend_writer_open( &hSplitRendFileReadWrite, @@ -1508,15 +1510,15 @@ int main( args.sampleRate, bitsBuffer.config.lc3plus_highres ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Could not open split rend metadata file %s\n", args.outMetadataFilePath ); - exit( -1 ); + fprintf( stderr, "\nCould not open split rend metadata file %s\n", args.outMetadataFilePath ); + goto cleanup; } } if ( AudioFileWriter_open( &audioWriter, args.outputFilePath, args.sampleRate, numOutChannels ) != IVAS_ERR_OK ) { - fprintf( stderr, "Failed to open file: %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nFailed to open file: %s\n", args.outputFilePath ); + goto cleanup; } } @@ -1617,7 +1619,7 @@ int main( if ( ( error = AudioFileReader_read( audioReader, inpInt16Buffer, (int16_t) inBufferSize, &numSamplesRead ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError reading from file %s\n", audioFilePath ); - exit( -1 ); + goto cleanup; } if ( numSamplesRead == 0 ) @@ -1644,13 +1646,13 @@ int main( IVAS_VECTOR3 listenerPos, refPos; if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPos, &refPos ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nVector3PairFileReader_read failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_SetReferenceVector( hIvasRend, listenerPos, refPos ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_SetReferenceVector failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } /* Read from reference rotation trajectory file if specified */ @@ -1661,14 +1663,14 @@ int main( IVAS_QUATERNION quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; if ( ( error = HeadRotationFileReading( referenceRotReader, &quaternions[sf_idx], NULL ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_SetReferenceRotation( hIvasRend, quaternions[sf_idx] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error setting Reference Rotation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError setting Reference Rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1684,14 +1686,14 @@ int main( if ( ( error = HeadRotationFileReading( headRotReader, &headRot, &Pos ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in Head Rotation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, headRot, Pos, DEFAULT_AXIS, sf_idx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError setting Head Rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1699,12 +1701,11 @@ int main( { if ( ( error = IVAS_REND_DisableHeadRotation( hIvasRend ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error disabling head rotation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError disabling head rotation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } - /* Read from external orientation file if specified */ if ( externalOrientationFileReader != NULL ) { @@ -1717,16 +1718,16 @@ int main( { if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &quatBuffer[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in External Orientation File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in External Orientation File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } for ( sf_idx = 0; sf_idx < num_subframes; sf_idx++ ) { if ( ( error = IVAS_REND_SetExternalOrientation( hIvasRend, &quatBuffer[sf_idx], enableHeadRotation[sf_idx], enableExternalOrientation[sf_idx], enableRotationInterpolation[sf_idx], numFramesToTargetOrientation[sf_idx], sf_idx ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error setting External Orientation: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError setting External Orientation: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1735,22 +1736,23 @@ int main( if ( ( error = IVAS_REND_CombineHeadAndExternalOrientation( hIvasRend ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error combining external and head orientations: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError combining external and head orientations: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, mcIds[i], &numChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_GetInputNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.multiChannelBuses[i].inputChannelIndex, numChannels ); if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, mcIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1763,15 +1765,15 @@ int main( IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, args.inConfig.numAudioObjects ); if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } if ( ( error = IVAS_REND_FeedInputObjectMetadataToOMasa( hIvasRend, i, mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputObjectMetadataToOMasa failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } else @@ -1779,14 +1781,14 @@ int main( IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.audioObjects[i].inputChannelIndex, 1 ); if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, ismIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_FeedInputObjectMetadata( hIvasRend, ismIds[i], mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputObjectMetadata failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1795,14 +1797,15 @@ int main( { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, sbaIds[i], &numChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_GetInputNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.ambisonicsBuses[i].inputChannelIndex, numChannels ); if ( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, sbaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1810,15 +1813,16 @@ int main( { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, masaIds[i], &numChannels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_GetInputNumChannels failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } + IVAS_REND_ReadOnlyAudioBuffer tmpBuffer = getReadOnlySubBuffer( inBuffer, (int16_t) args.inConfig.masaBuses[i].inputChannelIndex, numChannels ); IF( ( error = IVAS_REND_FeedInputAudio_fx( hIvasRend, masaIds[i], tmpBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputAudio failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( isCurrentFrameMultipleOf20ms ) @@ -1828,14 +1832,14 @@ int main( /* This will update data in hMasaMetadata[i] */ if ( ( error = MasaFileReader_readNextFrame( masaReaders[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in MASA Metadata File Reading: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in MASA Metadata File Reading: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } if ( ( error = IVAS_REND_FeedInputMasaMetadata( hIvasRend, masaIds[i], hMasaMetadata[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nIVAS_REND_FeedInputMasaMetadata failed: %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -1845,16 +1849,16 @@ int main( { if ( ( error = IVAS_REND_GetSplitBinauralBitstream( hIvasRend, outBuffer, &bitsBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_GetSplitBinauralBitstream(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } else { if ( ( error = IVAS_REND_GetSamples( hIvasRend, outBuffer ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_GetSamples()%s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1872,10 +1876,9 @@ int main( IF( IVAS_REND_GetDelay_fx( hIvasRend, &delayNumSamples, &delayTimeScale ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to get delay of renderer!\n" ); - exit( -1 ); + goto cleanup; } - delayNumSamples_orig = delayNumSamples; } else @@ -1891,7 +1894,7 @@ int main( &bitsBuffer.config.bitsWritten ) != IVAS_ERR_OK ) { fprintf( stderr, "\nUnable to write to bitstream file!\n" ); - exit( -1 ); + goto cleanup; } } @@ -1901,28 +1904,27 @@ int main( { if ( AudioFileWriter_write( audioWriter, &outInt16Buffer[delayNumSamples * num_out_channels], outBufferSize - ( delayNumSamples * num_out_channels ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error writing audio file %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nError writing audio file %s\n", args.outputFilePath ); + goto cleanup; } delayNumSamples = 0; } else { - delayNumSamples -= (int16_t) ( outBufferSize / num_out_channels ); + delayNumSamples -= (Word16) ( outBufferSize / num_out_channels ); } } bitsBuffer.config.bitsRead = 0; bitsBuffer.config.bitsWritten = 0; - /* Write MASA metadata for MASA outputs */ if ( args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_AUDIO_CONFIG_MASA2 ) { IVAS_REND_AudioConfigType inputType1; IVAS_REND_AudioConfigType inputType2; IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMetaOutput; - int16_t numInputFormats; + Word16 numInputFormats; inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; @@ -1963,8 +1965,8 @@ int main( { if ( ( error = IVAS_REND_GetMasaMetadata( hIvasRend, &hMetaOutput, inputType1 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_GetMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_GetMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } else @@ -1974,8 +1976,8 @@ int main( inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED; if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1984,8 +1986,8 @@ int main( inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA; if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } @@ -1994,8 +1996,8 @@ int main( inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED; if ( ( error = IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "Error in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); - exit( -1 ); + fprintf( stderr, "\nError in IVAS_REND_MergeMasaMetadata(): %s\n", ivas_error_to_string( error ) ); + goto cleanup; } } } @@ -2027,7 +2029,7 @@ int main( if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, outBufferSize ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nOutput audio file writer error\n" ); - exit( -1 ); + goto cleanup; } } @@ -2035,7 +2037,7 @@ int main( if ( ( error = AudioFileWriter_write( audioWriter, outInt16Buffer, zeroPadToWrite * outBuffer.config.numChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nOutput audio file writer error\n" ); - exit( -1 ); + goto cleanup; } zeroPadToWrite = 0; } @@ -2053,6 +2055,13 @@ int main( fprintf( stdout, "\n\nRendering of %d frames finished\n\n", frame ); + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + mainFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: /* === Close === */ free( inpInt16Buffer ); @@ -2061,7 +2070,6 @@ int main( free( outFloatBuffer ); free( outInt32Buffer ); free( inInt32Buffer ); -cleanup: if ( bitsBufferData != NULL ) { @@ -2111,7 +2119,7 @@ cleanup: print_mem( NULL ); #endif - return 0; + return mainFailed ? -1 : 0; } -- GitLab From 4d365ea0f650ed5d7895f26267ff9ac5ced4371f Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 15:44:31 +0200 Subject: [PATCH 1016/1310] change asserts --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index 5930f9870..c2ec4dc83 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -138,7 +138,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); // assert( op1 >= 0 ); /*FAILED*/ - assert( op1 <= 0 ); + // assert( op1 <= 0 ); /*FAILED*/ if ( op1 >= 0 ) { cc = shl_sat( cc, op1 ); -- GitLab From 36428363d0a13a68c761d476413e3c9ef76c5a0a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 24 Jun 2025 19:42:20 +0530 Subject: [PATCH 1017/1310] Fix for 3GPP issue 1759: Decoder crash for OSBA ISM4SBA3 at 32kbps FER in cldfbAnalysis_ts() Link #1759 --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index c92f800af..7c83143c3 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -596,7 +596,7 @@ static void ivas_dirac_dec_binaural_internal_fx( move16(); } } - + Word16 q_cldfb_temp = sub( q_input, 1 ); DIRAC_DEC_BIN_HANDLE hDiracDecBin; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; PARAMBIN_REND_CONFIG config_data; @@ -616,7 +616,7 @@ static void ivas_dirac_dec_binaural_internal_fx( nBins = hSpatParamRendCom->num_freq_bands; move16(); offsetSamples = imult1616( hSpatParamRendCom->slots_rendered, nBins ); - + Word32 tmp_arr[CLDFB_NO_CHANNELS_MAX]; /* Setup internal config */ config_data.separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; move16(); @@ -713,13 +713,21 @@ static void ivas_dirac_dec_binaural_internal_fx( test(); IF( ch == 0 || EQ_16( nchan_transport, 2 ) ) { - q_cldfb[ch][slot] = q_input; + q_cldfb[ch][slot] = q_cldfb_temp; move16(); + Copy_Scale_sig32( &( st_ivas->hTcBuffer->tc_fx[ch][nBins * slot + offsetSamples] ), tmp_arr, nBins, -1 ); + scale_sig32( st_ivas->cldfbAnaDec[ch]->cldfb_state_fx, sub( st_ivas->cldfbAnaDec[ch]->p_filter_length, st_ivas->cldfbAnaDec[ch]->no_channels ), sub( q_cldfb_temp, st_ivas->cldfbAnaDec[ch]->Q_cldfb_state ) ); cldfbAnalysis_ts_fx_fixed_q( - &( st_ivas->hTcBuffer->tc_fx[ch][add( imult1616( nBins, slot ), offsetSamples )] ), + tmp_arr, Cldfb_RealBuffer_in_fx[ch][slot], Cldfb_ImagBuffer_in_fx[ch][slot], nBins, st_ivas->cldfbAnaDec[ch], &q_cldfb[ch][slot] ); + scale_sig32( st_ivas->cldfbAnaDec[ch]->cldfb_state_fx, sub( st_ivas->cldfbAnaDec[ch]->p_filter_length, st_ivas->cldfbAnaDec[ch]->no_channels ), sub( q_input, st_ivas->cldfbAnaDec[ch]->Q_cldfb_state ) ); + st_ivas->cldfbAnaDec[ch]->Q_cldfb_state = q_input; + scale_sig32( Cldfb_RealBuffer_in_fx[ch][slot], nBins, 1 ); // Q6 + scale_sig32( Cldfb_ImagBuffer_in_fx[ch][slot], nBins, 1 ); // Q6 + q_cldfb[ch][slot] = add( q_cldfb[ch][slot], 1 ); + move16(); } ELSE IF( EQ_16( config_data.nchan_transport, 2 ) ) /* Stereo signal transmitted as mono with DFT stereo */ { @@ -814,7 +822,6 @@ static void ivas_dirac_dec_binaural_internal_fx( IF( hDiracDecBin->useTdDecorr ) { - Word32 tmp_arr[60]; FOR( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) { q_cldfb[ch][slot] = sub( q_input, 1 ); -- GitLab From e80085b399d251aafa8945397a899cd86319c644 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 24 Jun 2025 19:51:43 +0530 Subject: [PATCH 1018/1310] Bug fix in gain_enc_lbr_ivas_fx Corrects the calculation of log10(Ecode) and maintenance of Q factor of this which then corrects the gcode0 value. --- lib_enc/gain_enc_fx.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib_enc/gain_enc_fx.c b/lib_enc/gain_enc_fx.c index 0ccb31ccf..5e2a11169 100644 --- a/lib_enc/gain_enc_fx.c +++ b/lib_enc/gain_enc_fx.c @@ -2525,8 +2525,8 @@ void gain_enc_lbr_ivas_fx( /*Ecode = ( dotp( code, code, L_SUBFR ) + 0.01f ) / L_SUBFR; *gain_inov = 1.0f / (float)sqrt(Ecode);*/ - L_tmp = Dot_product12( code, code, L_subfr, &exp_code ); - L_inov = L_tmp; /* sets to 'L_tmp' in 1 clock */ + L_tmp = Dot_product12( code, code, L_subfr, &exp_code ); /* Q9 + Q9 + 1 + (30-exp_code)*/ + L_inov = L_tmp; /* sets to 'L_tmp' in 1 clock */ move32(); /* exp_code: -18 (code in Q9), -6 (/L_SUBFR), -31 (L_tmp Q31->Q0) */ /* output gain_inov*/ @@ -2599,12 +2599,15 @@ void gain_enc_lbr_ivas_fx( /* gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.5f * (float)log10(Ecode)); gcode0 = (float)pow(10, dotp(b, aux, n_pred) - 0.05f * 10 * (float)log10(Ecode)); gcode0 = (float)pow(10, 0.05(20 * dotp(b, aux, n_pred) - 10 * (float)log10(Ecode))); */ - - exp_code = sub( exp_code, 18 + 6 + 1 ); + // Ecode = (Ecode / L_subfr) + L_tmp = L_shr( L_tmp, L_subfr_sf ); // Q19 + (Q30-exp_code) + /* Calculation for log10(Ecode) exponent for applying log10 = Q31 - q = Q31 - Q19 - Q30 + exp_code = exp_code - Q18*/ + L_tmp = BASOP_Util_Log10( L_tmp, sub( exp_code, 18 ) ); // new q = Q25 exp = norm_l( L_tmp ); - frac = Log2_norm_lc( L_shl( L_tmp, exp ) ); - exp = sub( exp_code, exp ); - L_tmp1 = Mpy_32_16( exp, frac, 24660 ); /* Q14 */ /* 10*log10(2) in Q13*/ + L_tmp = L_shl( L_tmp, exp ); // Q25 + exp + // 10 in Q27 , ( 10 * log10( Ecode ) ) + L_tmp1 = Mpy_32_32( L_tmp, 1342177280 ); // Q25 + exp + 1 + Q27 - 32 = Q21 + exp + L_tmp1 = L_shr( L_tmp1, add( 7, exp ) ); // Q21 + exp - 7 - exp = Q14 L_tmp = Dot_product( b, aux, n_pred ); /*Q25*/ L_tmp = Mult_32_16( L_tmp, 320 ); /*Q14, 20 in Q4*/ -- GitLab From 8e52b02399b8d598483dcf01252807f44e82bd99 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 24 Jun 2025 16:51:37 +0200 Subject: [PATCH 1019/1310] cleanup --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index c2ec4dc83..c817bd1b3 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -137,8 +137,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro Word16 op1 = add( normXY, normCC ); - // assert( op1 >= 0 ); /*FAILED*/ - // assert( op1 <= 0 ); /*FAILED*/ + /*Both shift directiosn possible*/ if ( op1 >= 0 ) { cc = shl_sat( cc, op1 ); -- GitLab From bbc0239477818535ded11a5abed0b446b35e7753 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Tue, 24 Jun 2025 17:56:30 +0200 Subject: [PATCH 1020/1310] Remove old unused code (no change), the purpose is to retrigger the pipeline because the reports are empty. --- lib_dec/ivas_mdct_core_dec_fx.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index f119a8c1f..7f17bb0fc 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1320,23 +1320,6 @@ void ivas_mdct_core_reconstruct_fx( // norm(old_out) + q_win >= st->Q_syn sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); st->Q_syn = add( sf, s_min( q_win, q_winFB ) ); -#if 0 - Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDACFB ) ); // q_winFB -> Q(-1 - st->Q_syn) - st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn ); - move16(); - Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDAC ) ); // q_win -> Q(-1 - st->Q_syn) - st->hTcxDec->Q_syn_Overl_TDAC = sub( -1, st->Q_syn ); - move16(); - Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) - st->hTcxDec->Q_old_syn_Overl = sub( -1, st->Q_syn ); - Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_OverlFB ) ); // q_winFB -> st->Q_syn - st->hTcxDec->Q_syn_OverlFB = st->Q_syn; - Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn - st->hTcxDec->Q_syn_Overl = st->Q_syn; -#else - // Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( -2, st->hTcxDec->Q_old_syn_Overl ) ); // q_win -> Q(-1 - st->Q_syn) - // st->hTcxDec->Q_old_syn_Overl = -2; -#endif Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn -- GitLab From 0f798c029aa90e433da8a71d79c63f83c8ed7c46 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 24 Jun 2025 18:33:48 +0200 Subject: [PATCH 1021/1310] update --- apps/renderer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 97b0a5e43..f36434778 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1214,8 +1214,8 @@ int main( MasaFileWriter_open( args.outputFilePath, true, &masaWriter ); /* No delay for audio in renderer, so calling metadata writer in delayCompensated mode, i.e., no delay applied to meta */ if ( masaWriter == NULL ) { - fprintf( stderr, "Could not open MASA metadata file %s\n", args.outputFilePath ); - exit( -1 ); + fprintf( stderr, "\nCould not open MASA metadata file %s\n", args.outputFilePath ); + goto cleanup; } } -- GitLab From dc36cb5ba921e36be19089ce8e890a80a7b6f0e7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 25 Jun 2025 10:50:15 +0530 Subject: [PATCH 1022/1310] Cleanup macros in options.h Cleared up below macros: FIX_1378_ACELP_OUT_OF_BOUNDS , FIX_1379_MASA_ANGLE_ROUND , OPT_BIN_RENDERER_V1 , OPT_BIN_RENDERER_V2 , OPT_STEREO_32KBPS_V1 , OPT_AVOID_STATE_BUF_RESCALE , FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx , FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot , IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE , HARM_PUSH_BIT , HARM_ENC_INIT , DIV32_OPT_NEWTON , IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE , MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE , MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE , FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat , FIX_1439_SPEEDUP_stereo_icBWE_dec_fx , FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx , FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic , FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , FIX_1481_HARDCODE_DIV , VEC_ARITH_OPT_v1 , FIX_1486_IND_SHB_RES , FIX_1511_POC_RENORM , TEST_HR , REMOVE_EVS_DUPLICATES , FIX_1713_EXP , FIX_1733_CLDFB_BUG --- lib_com/basop_util.c | 2 - lib_com/basop_util.h | 2 - lib_com/bitstream_fx.c | 334 --------- lib_com/cldfb_fx.c | 59 -- lib_com/cnst.h | 8 - lib_com/fft_fx.c | 383 ---------- lib_com/hp50_fx.c | 20 - lib_com/ivas_prot_fx.h | 2 - lib_com/ivas_rom_com_fx.c | 14 - lib_com/ivas_spar_com_fx.c | 2 - lib_com/modif_fs_fx.c | 102 --- lib_com/mslvq_com_fx.c | 44 -- lib_com/options.h | 31 +- lib_com/prot_fx.h | 21 - lib_com/scale_mem_fx.c | 4 - lib_com/swb_tbe_com_fx.c | 250 ------- lib_com/tools.c | 2 - lib_com/tools_fx.c | 12 - lib_com/trans_inv_fx.c | 30 - lib_dec/acelp_core_dec_fx.c | 61 +- lib_dec/acelp_core_switch_dec_fx.c | 15 - lib_dec/core_switching_dec_fx.c | 8 - lib_dec/dec_acelp_fx.c | 12 - lib_dec/fd_cng_dec_fx.c | 4 - lib_dec/ivas_binRenderer_internal_fx.c | 139 ---- lib_dec/ivas_dirac_dec_fx.c | 60 -- lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 51 +- lib_dec/ivas_ism_param_dec_fx.c | 4 - lib_dec/ivas_jbm_dec_fx.c | 4 - lib_dec/ivas_mc_param_dec_fx.c | 20 - lib_dec/ivas_mc_paramupmix_dec_fx.c | 33 - lib_dec/ivas_sba_rendering_internal_fx.c | 18 - lib_dec/ivas_spar_decoder_fx.c | 12 - lib_dec/ivas_stereo_cng_dec_fx.c | 17 - lib_dec/ivas_stereo_dft_dec_fx.c | 176 ----- lib_dec/ivas_stereo_icbwe_dec_fx.c | 9 - lib_dec/ivas_stereo_switching_dec_fx.c | 89 --- lib_dec/ivas_stereo_td_dec_fx.c | 21 - lib_dec/swb_tbe_dec_fx.c | 15 - lib_enc/acelp_core_switch_enc_fx.c | 17 - lib_enc/cng_enc_fx.c | 5 - lib_enc/dtx_fx.c | 4 - lib_enc/enc_gen_voic_fx.c | 17 - lib_enc/enc_ppp_fx.c | 8 - lib_enc/enc_tran_fx.c | 24 - lib_enc/eval_pit_contr_fx.c | 21 - lib_enc/igf_enc.c | 59 -- lib_enc/igf_enc_fx.c | 27 - lib_enc/init_enc_fx.c | 4 - lib_enc/ivas_init_enc_fx.c | 664 ------------------ lib_enc/ivas_mc_param_enc_fx.c | 248 ------- lib_enc/ivas_qmetadata_enc_fx.c | 16 - lib_enc/ivas_sce_enc_fx.c | 6 - lib_enc/ivas_sns_enc_fx.c | 4 - lib_enc/ivas_stereo_dmx_evs_fx.c | 18 - lib_enc/ivas_stereo_icbwe_enc_fx.c | 8 - lib_enc/lib_enc_fx.c | 414 ----------- lib_enc/speech_music_classif_fx.c | 4 - lib_enc/stat_enc.h | 4 - lib_enc/swb_pre_proc_fx.c | 4 - lib_enc/swb_tbe_enc_fx.c | 34 - lib_enc/tcx_utils_enc_fx.c | 20 - lib_enc/transition_enc_fx.c | 4 - lib_rend/ivas_dirac_ana_fx.c | 4 - .../ivas_dirac_dec_binaural_functions_fx.c | 171 ----- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 165 ----- lib_rend/ivas_dirac_rend_fx.c | 12 - lib_rend/ivas_efap_fx.c | 21 - lib_rend/ivas_omasa_ana_fx.c | 5 - lib_rend/ivas_reverb_fx.c | 41 -- lib_rend/ivas_sba_rendering_fx.c | 58 -- lib_rend/lib_rend_fx.c | 8 - 72 files changed, 5 insertions(+), 4204 deletions(-) diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index 3d6324783..7903d3580 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -1062,7 +1062,6 @@ Word32 BASOP_Util_Divide3232_Scale_cadence( Word32 x, Word32 y, Word16 *s ) return z; } -#ifdef DIV32_OPT_NEWTON Word32 div_w_newton( Word32 num, Word32 den ); /* Table of 256 precalculated estimates to be used by the "div_w_newton" @@ -1462,7 +1461,6 @@ Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, Word32 y, Word16 *s ) return z; } -#endif /* DIV32_OPT_NEWTON */ Word16 BASOP_Util_Divide3232_Scale( Word32 x, Word32 y, Word16 *s ) { diff --git a/lib_com/basop_util.h b/lib_com/basop_util.h index b1d4b5fc1..b5c69e1dd 100644 --- a/lib_com/basop_util.h +++ b/lib_com/basop_util.h @@ -333,11 +333,9 @@ Word32 BASOP_Util_Divide3232_Scale_cadence( Word32 x, /*!< i : Numerator*/ Word16 *s ); /*!< o : Additional scalefactor difference*/ -#ifdef DIV32_OPT_NEWTON Word32 BASOP_Util_Divide3232_Scale_newton( Word32 x, /*!< i : Numerator*/ Word32 y, /*!< i : Denominator*/ Word16 *s ); /*!< o : Additional scalefactor difference*/ -#endif /************************************************************************/ diff --git a/lib_com/bitstream_fx.c b/lib_com/bitstream_fx.c index 2b66f92cd..02b0a8fa1 100644 --- a/lib_com/bitstream_fx.c +++ b/lib_com/bitstream_fx.c @@ -242,130 +242,6 @@ Word16 rate2EVSmode( * * Push a new indice into the buffer *-------------------------------------------------------------------*/ -#ifndef HARM_PUSH_BIT -void push_indice_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - Word16 id, /* i : ID of the indice */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -) -{ - Word16 i; - - - IF( EQ_16( hBstr->last_ind_fx, id ) ) - { - /* indice with the same name as the previous one */ - i = hBstr->next_ind_fx; - move16(); - } - ELSE - { - /* new indice - find an empty slot in the list */ - i = id; - move16(); - WHILE( hBstr->ind_list[i].nb_bits != -1 ) - { - i = add( i, 1 ); - } - } - - /* store the values in the list */ - hBstr->ind_list[i].value = value; - move16(); - hBstr->ind_list[i].nb_bits = nb_bits; - move16(); - - /* updates */ - hBstr->next_ind_fx = add( i, 1 ); - move16(); - hBstr->last_ind_fx = id; - move16(); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - - return; -} -/*-------------------------------------------------------------------* - * push_next_indice() * - * Push a new indice into the buffer at the next position - *-------------------------------------------------------------------*/ - -void push_next_indice_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - UWord16 value, /* i : value of the quantized indice */ - Word16 nb_bits /* i : number of bits used to quantize the indice */ -) -{ - - /* store the values in the list */ - hBstr->ind_list[hBstr->next_ind_fx].value = value; - move16(); - hBstr->ind_list[hBstr->next_ind_fx].nb_bits = nb_bits; - move16(); - hBstr->next_ind_fx = add( hBstr->next_ind_fx, 1 ); - move16(); - - /* update the total number of bits already written */ - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); - - return; -} - - -/*-------------------------------------------------------------------* - * push_next_bits() - * Push a bit buffer into the buffer at the next position - *-------------------------------------------------------------------*/ - -void push_next_bits_fx( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - Word16 bits[], /* i : bit buffer to pack, sequence of single bits */ - Word16 nb_bits /* i : number of bits to pack */ -) -{ - UWord16 code; - Word16 i, nb_bits_m15; - Indice *ptr; - - ptr = &hBstr->ind_list[hBstr->next_ind_fx]; - nb_bits_m15 = sub( nb_bits, 15 ); - i = 0; - move16(); - IF( nb_bits_m15 > 0 ) - { - FOR( ; i < nb_bits_m15; i += 16 ) - { - code = s_or( lshl( bits[i], 15 ), s_or( lshl( bits[i + 1], 14 ), s_or( lshl( bits[i + 2], 13 ), s_or( lshl( bits[i + 3], 12 ), - s_or( lshl( bits[i + 4], 11 ), s_or( lshl( bits[i + 5], 10 ), s_or( lshl( bits[i + 6], 9 ), s_or( lshl( bits[i + 7], 8 ), - s_or( lshl( bits[i + 8], 7 ), s_or( lshl( bits[i + 9], 6 ), s_or( lshl( bits[i + 10], 5 ), s_or( lshl( bits[i + 11], 4 ), - s_or( lshl( bits[i + 12], 3 ), s_or( lshl( bits[i + 13], 2 ), s_or( lshl( bits[i + 14], 1 ), bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); - - ptr->value = code; - move16(); - ptr->nb_bits = 16; - move16(); - ++ptr; - } - } - IF( LT_16( i, nb_bits ) ) - { - FOR( ; i < nb_bits; ++i ) - { - ptr->value = bits[i]; - move16(); - ptr->nb_bits = 1; - move16(); - ++ptr; - } - } - hBstr->next_ind_fx = (Word16) ( ptr - hBstr->ind_list ); - move16(); - hBstr->nb_bits_tot = add( hBstr->nb_bits_tot, nb_bits ); - move16(); -} -#endif /*-------------------------------------------------------------------* * get_next_indice_fx( ) @@ -528,12 +404,6 @@ void reset_indices_enc_fx( move16(); hBstr->nb_bits_tot = 0; move16(); -#ifndef HARM_PUSH_BIT - hBstr->next_ind_fx = 0; - move16(); - hBstr->last_ind_fx = -1; - move16(); -#endif FOR( i = 0; i < max_num_indices; i++ ) { hBstr->ind_list[i].nb_bits = -1; @@ -564,215 +434,11 @@ void reset_indices_dec_fx( * * Write the buffer of indices to a file *-------------------------------------------------------------------*/ -#ifndef HARM_PUSH_BIT -void write_indices_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - FILE *file /* i : output bitstream file */ - , - UWord8 *pFrame, /* i: byte array with bit packet and byte aligned coded speech data */ - Word16 pFrame_size /* i: size of the binary encoded access unit [bits] */ -) -{ - Word16 i, k; - Word16 stream[2 + MAX_BITS_PER_FRAME], *pt_stream; - Word32 mask; - UWord8 header; - Word16 isAmrWb = 0; - move16(); - - IF( st_fx->bitstreamformat == G192 ) - { - /*-----------------------------------------------------------------* - * Encode Sync Header and Frame Length - *-----------------------------------------------------------------*/ - pt_stream = stream; - FOR( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) - { - stream[i] = 0; - move16(); - } - *pt_stream++ = SYNC_GOOD_FRAME; - move16(); - *pt_stream++ = hBstr->nb_bits_tot; - move16(); - - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - * Writing the serial stream into file - *----------------------------------------------------------------*/ - - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) - { - IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) - { - /* mask from MSB to LSB */ - mask = L_shl( 1, sub( hBstr->ind_list[i].nb_bits, 1 ) ); - - /* write bit by bit */ - FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) - { - IF( L_and( hBstr->ind_list[i].value, mask ) ) - { - *pt_stream++ = G192_BIN1; - move16(); - } - ELSE - { - *pt_stream++ = G192_BIN0; - move16(); - } - - mask = L_shr( mask, 1 ); - } - } - } - } - ELSE - { - /* Create and write ToC header */ - /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( s_or( s_or( shl( st_fx->Opt_AMR_WB, 5 ), shl( st_fx->Opt_AMR_WB, 4 ) ), rate2EVSmode( L_mult0( hBstr->nb_bits_tot, 50 ), &isAmrWb ) ) ); - move16(); - fwrite( &header, sizeof( UWord8 ), 1, file ); - /* Write speech bits */ - fwrite( pFrame, sizeof( UWord8 ), shr( add( pFrame_size, 7 ), 3 ), file ); - } - - /* Clearing of indices */ - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) - { - hBstr->ind_list[i].nb_bits = -1; - move16(); - } - - - IF( st_fx->bitstreamformat == G192 ) - { - /* write the serial stream into file */ - fwrite( stream, sizeof( unsigned short ), 2 + stream[1], file ); - } - /* reset index pointers */ - hBstr->nb_bits_tot = 0; - move16(); - hBstr->next_ind_fx = 0; - move16(); - hBstr->last_ind_fx = -1; - move16(); - - return; -} -#endif /*-------------------------------------------------------------------* * write_indices_buf_fx() * * Write the buffer of indices to a file *-------------------------------------------------------------------*/ -#ifndef HARM_PUSH_BIT -void write_indices_buf_fx( - Encoder_State *st_fx, /* i/o: encoder state structure */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder state structure */ - UWord16 *out_buf, /* i : output bitstream buf */ - UWord8 *pFrame, /* i: byte array with bit packet and byte aligned coded speech data */ - Word16 pFrame_size, /* i: size of the binary encoded access unit [bits] */ - UWord16 *num_bits ) -{ - Word16 i, k; - Word16 stream[2 + MAX_BITS_PER_FRAME], *pt_stream; - Word32 mask; - UWord8 header; - Word16 isAmrWb = 0; - - IF( st_fx->bitstreamformat == G192 ) - { - /*-----------------------------------------------------------------* - * Encode Sync Header and Frame Length - *-----------------------------------------------------------------*/ - pt_stream = stream; - FOR( i = 0; i < ( 2 + MAX_BITS_PER_FRAME ); ++i ) - { - stream[i] = 0; - move16(); - } - //*pt_stream++ = (Word16) SYNC_GOOD_FRAME; - //*pt_stream++ = hBstr->nb_bits_tot; - *num_bits = hBstr->nb_bits_tot; - move16(); - /*----------------------------------------------------------------* - * Bitstream packing (conversion of individual indices into a serial stream) - * Writing the serial stream into file - *----------------------------------------------------------------*/ - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) - { - IF( NE_16( hBstr->ind_list[i].nb_bits, -1 ) ) - { - /* mask from MSB to LSB */ - mask = L_shl( 1, ( sub( hBstr->ind_list[i].nb_bits, 1 ) ) ); - - /* write bit by bit */ - FOR( k = 0; k < hBstr->ind_list[i].nb_bits; k++ ) - { - IF( L_and( hBstr->ind_list[i].value, mask ) ) - { - //*pt_stream++ = G192_BIN1; - *pt_stream++ = 1; - move16(); - } - ELSE - { - //*pt_stream++ = G192_BIN0; - *pt_stream++ = 0; - move16(); - } - - mask = L_shr( mask, 1 ); - } - } - } - } - ELSE - { - /* Create and write ToC header */ - /* qbit always set to 1 on encoder side for AMRWBIO , no qbit in use for EVS, but set to 0(bad) */ - header = (UWord8) ( s_or( s_or( shl( st_fx->Opt_AMR_WB, 5 ), shl( st_fx->Opt_AMR_WB, 4 ) ), rate2EVSmode( i_mult( hBstr->nb_bits_tot, 50 ), &isAmrWb ) ) ); - // fwrite(&header, sizeof(UWord8), 1, file); - memcpy( out_buf, &header, sizeof( UWord8 ) ); - *num_bits += sizeof( UWord8 ); - /* Write speech bits */ - // fwrite(pFrame, sizeof(UWord8), (pFrame_size + 7) >> 3, file); - memcpy( out_buf, pFrame, sizeof( UWord8 ) * ( shr( add( pFrame_size, 7 ), 3 ) ) ); - *num_bits += sizeof( UWord8 ) * ( shr( ( add( pFrame_size, 7 ) ), 3 ) ); - } - - /* Clearing of indices */ - FOR( i = 0; i < MAX_NUM_INDICES; i++ ) - { - hBstr->ind_list[i].nb_bits = -1; - move16(); - } - - - IF( st_fx->bitstreamformat == G192 ) - { - /* write the serial stream into file */ - // fwrite(stream, sizeof(unsigned short), 2 + stream[1], file); - // FILE *ftemp = fopen( "./output/bitstreams/out.COD", "ab" ); - // fwrite( stream, sizeof( unsigned short ), 2 + stream[1], ftemp ); - // fclose( ftemp ); - memcpy( out_buf, stream, sizeof( unsigned short ) * ( *num_bits ) ); - //*num_bits += sizeof( unsigned short ) * ( 2 + stream[1] ); - } - /* reset index pointers */ - hBstr->nb_bits_tot = 0; - hBstr->next_ind_fx = 0; - hBstr->last_ind_fx = -1; - move16(); - move16(); - move16(); - - return; -} -#endif /*-------------------------------------------------------------------* * indices_to_serial() * diff --git a/lib_com/cldfb_fx.c b/lib_com/cldfb_fx.c index 6c29d2a57..edddcb272 100644 --- a/lib_com/cldfb_fx.c +++ b/lib_com/cldfb_fx.c @@ -508,13 +508,8 @@ void cldfbAnalysis_ts_fx( rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -522,13 +517,8 @@ void cldfbAnalysis_ts_fx( ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); } @@ -595,13 +585,8 @@ void cldfbAnalysis_ts_fx( rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - rBuffer_fx[2 * k] = L_sub( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - rBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ri12_fx, rot_vctr_re_fx[k] ) ); // q - 3 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); @@ -609,13 +594,8 @@ void cldfbAnalysis_ts_fx( ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - iBuffer_fx[2 * k] = L_sub( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_im_fx[k] ) ); // q - 3 - iBuffer_fx[2 * k + 1] = L_add( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), Mpy_32_32( ii12_fx, rot_vctr_re_fx[k] ) ); // q - 3 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); } @@ -640,22 +620,6 @@ void cldfbAnalysis_ts_fx( } fft_cldfb_fx( rBuffer_fx, M2 ); -#ifndef FIX_1733_CLDFB_BUG - /* post modulation of DST IV */ - FOR( k = 0; k < M2; k++ ) - { - /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE - realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 - realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - realBuffer_fx[2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - move32(); - move32(); - } -#endif *q_cldfb = sub( *q_cldfb, 2 ); move16(); @@ -676,35 +640,23 @@ void cldfbAnalysis_ts_fx( move32(); } -#ifdef FIX_1733_CLDFB_BUG /* post modulation of DST IV */ FOR( k = 0; k < M2; k++ ) { /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = Msub_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 realBuffer_fx[2 * k] = Madd_32_32( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - realBuffer_fx[( ( M1 - 1 ) - ( k * 2 ) )] = L_sub( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - realBuffer_fx[2 * k] = L_add( Mpy_32_32( rBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); } -#endif /* post modulation of DCT IV */ FOR( k = 0; k < M2; k++ ) { /* do it inplace */ /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE imagBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ); // q - 5 imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = Madd_32_32( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ); // q - 5 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - imagBuffer_fx[2 * k] = L_sub( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_re_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k] ) ); // q - 5 - imagBuffer_fx[( M1 - 1 ) - ( k * 2 )] = L_add( Mpy_32_32( iBuffer_fx[2 * k], rot_vctr_im_fx[k] ), Mpy_32_32( iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k] ) ); // q - 5 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ move32(); move32(); } @@ -725,13 +677,8 @@ void cldfbAnalysis_ts_fx( /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/ /*realBuffer[k] = rBuffer[k]; imagBuffer[k] = iBuffer[k];*/ -#ifdef OPT_AVOID_STATE_BUF_RESCALE cplx_aux_fx = Msub_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ); // q - 5 imagBuffer_fx[k] = Madd_32_32( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ); // q - 5 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cplx_aux_fx = L_sub( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_re_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_im_fx[k] ) ); // q - 5 - imagBuffer_fx[k] = L_add( Mpy_32_32( realBuffer_fx[k], rot_vctr_delay_im_fx[k] ), Mpy_32_32( imagBuffer_fx[k], rot_vctr_delay_re_fx[k] ) ); // q - 5 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ realBuffer_fx[k] = cplx_aux_fx; move32(); move32(); @@ -1436,9 +1383,7 @@ void cldfbSynthesis_ivas_fx( Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ const Word16 samplesToProcess, /* i : number of processed samples */ const Word16 shift, /* i : scale for state buffer */ -#ifdef OPT_AVOID_STATE_BUF_RESCALE const Word16 out_shift, /* i : scale for output buffer */ -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ ) { @@ -1675,16 +1620,13 @@ void cldfbSynthesis_ivas_fx( } } -#ifdef OPT_AVOID_STATE_BUF_RESCALE IF( 0 == out_shift ) { -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ FOR( i = 0; i < M1; i++ ) { ptr_time_out_fx[( M1 - 1 ) - i] = synthesisBuffer_fx[4 * L2 + M1 + i]; move32(); } -#ifdef OPT_AVOID_STATE_BUF_RESCALE } ELSE { @@ -1694,7 +1636,6 @@ void cldfbSynthesis_ivas_fx( move32(); } } -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ ptr_time_out_fx += M1; diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 17dbc31c4..6030b53bd 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -534,15 +534,7 @@ enum IND_STEREO_ICBWE_MSFLAG, IND_SHB_ENER_SF, IND_SHB_RES_GS, -#ifndef FIX_1486_IND_SHB_RES - IND_SHB_RES_GS1, - IND_SHB_RES_GS2, - IND_SHB_RES_GS3, - IND_SHB_RES_GS4, - IND_SHB_VF, -#else IND_SHB_VF = IND_SHB_RES_GS + 5, -#endif IND_SHB_LSF, IND_SHB_MIRROR = IND_SHB_LSF + 5, IND_SHB_GRID, diff --git a/lib_com/fft_fx.c b/lib_com/fft_fx.c index 40c978014..b1323e156 100644 --- a/lib_com/fft_fx.c +++ b/lib_com/fft_fx.c @@ -4725,7 +4725,6 @@ static void fft_len16( cmplx t[4]; cmplx y[16]; -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[0]; // Qx move64(); s[1] = x[4]; // Qx @@ -4734,16 +4733,6 @@ static void fft_len16( move64(); s[3] = x[12]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[0], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[4], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[8], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[12], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -4763,7 +4752,6 @@ static void fft_len16( y[3] = CL_add( t[1], t[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[1]; // Qx move64(); s[1] = x[5]; // Qx @@ -4772,16 +4760,6 @@ static void fft_len16( move64(); s[3] = x[13]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[1], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[5], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[9], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[13], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -4801,7 +4779,6 @@ static void fft_len16( y[7] = CL_add( t[1], t[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[2]; // Qx move64(); s[1] = x[6]; // Qx @@ -4810,16 +4787,6 @@ static void fft_len16( move64(); s[3] = x[14]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[2], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[6], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[10], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[14], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -4841,7 +4808,6 @@ static void fft_len16( y[11] = CL_add( t[1], t[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 s[0] = x[3]; // Qx move64(); s[1] = x[7]; // Qx @@ -4850,16 +4816,6 @@ static void fft_len16( move64(); s[3] = x[15]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - s[0] = CL_shr( x[3], SCALEFACTOR16 ); // Qx - move64(); - s[1] = CL_shr( x[7], SCALEFACTOR16 ); // Qx - move64(); - s[2] = CL_shr( x[11], SCALEFACTOR16 ); // Qx - move64(); - s[3] = CL_shr( x[15], SCALEFACTOR16 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ t[0] = CL_add( s[0], s[2] ); move64(); @@ -5020,7 +4976,6 @@ static void fft_len20_fx( cmplx tt[4]; cmplx y[20]; -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[0]; // Qx move64(); xx[1] = x[16]; // Qx @@ -5031,18 +4986,6 @@ static void fft_len20_fx( move64(); xx[4] = x[4]; // Qx move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[0], SCALEFACTOR20 ); // Qx - move64(); - xx[1] = CL_shr( x[16], SCALEFACTOR20 ); // Qx - move64(); - xx[2] = CL_shr( x[12], SCALEFACTOR20 ); // Qx - move64(); - xx[3] = CL_shr( x[8], SCALEFACTOR20 ); // Qx - move64(); - xx[4] = CL_shr( x[4], SCALEFACTOR20 ); // Qx - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -5078,7 +5021,6 @@ static void fft_len20_fx( y[12] = CL_msu_j( s[2], s[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[5]; move64(); xx[1] = x[1]; @@ -5089,18 +5031,6 @@ static void fft_len20_fx( move64(); xx[4] = x[9]; move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[5], SCALEFACTOR20 ); - move64(); - xx[1] = CL_shr( x[1], SCALEFACTOR20 ); - move64(); - xx[2] = CL_shr( x[17], SCALEFACTOR20 ); - move64(); - xx[3] = CL_shr( x[13], SCALEFACTOR20 ); - move64(); - xx[4] = CL_shr( x[9], SCALEFACTOR20 ); - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -5136,7 +5066,6 @@ static void fft_len20_fx( y[13] = CL_msu_j( s[2], s[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[10]; move64(); xx[1] = x[6]; @@ -5147,18 +5076,6 @@ static void fft_len20_fx( move64(); xx[4] = x[14]; move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[10], SCALEFACTOR20 ); - move64(); - xx[1] = CL_shr( x[6], SCALEFACTOR20 ); - move64(); - xx[2] = CL_shr( x[2], SCALEFACTOR20 ); - move64(); - xx[3] = CL_shr( x[18], SCALEFACTOR20 ); - move64(); - xx[4] = CL_shr( x[14], SCALEFACTOR20 ); - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -5194,7 +5111,6 @@ static void fft_len20_fx( y[14] = CL_msu_j( s[2], s[3] ); move64(); -#ifdef OPT_STEREO_32KBPS_V1 xx[0] = x[15]; move64(); xx[1] = x[11]; @@ -5205,18 +5121,6 @@ static void fft_len20_fx( move64(); xx[4] = x[19]; move64(); -#else /* OPT_STEREO_32KBPS_V1 */ - xx[0] = CL_shr( x[15], SCALEFACTOR20 ); - move64(); - xx[1] = CL_shr( x[11], SCALEFACTOR20 ); - move64(); - xx[2] = CL_shr( x[7], SCALEFACTOR20 ); - move64(); - xx[3] = CL_shr( x[3], SCALEFACTOR20 ); - move64(); - xx[4] = CL_shr( x[19], SCALEFACTOR20 ); - move64(); -#endif /* OPT_STEREO_32KBPS_V1 */ s[0] = CL_add( xx[1], xx[4] ); move64(); @@ -6595,7 +6499,6 @@ static void fft_lenN( cmplx s[8]; cmplx y[8]; -#ifdef OPT_STEREO_32KBPS_V1 y[1] = xx[1 * dim1]; move64(); y[2] = xx[2 * dim1]; @@ -6827,288 +6730,6 @@ static void fft_lenN( move64(); } } -#else /* OPT_STEREO_32KBPS_V1 */ - test(); - test(); - test(); - test(); - IF( EQ_16( dim1, 30 ) || EQ_16( dim1, 20 ) || EQ_16( dim1, 15 ) || EQ_16( dim1, 10 ) || EQ_16( dim1, 5 ) ) - { - FOR( i = 0; i < dim1; i++ ) - { - { - y[0] = xx[i]; // y[0] = xx[i + 0 * dim1] - move64(); - }; - IF( i == 0 ) - { - { - y[1] = xx[( i + ( 1 * dim1 ) )]; - move64(); - }; - { - y[2] = xx[( i + ( 2 * dim1 ) )]; - move64(); - }; - { - y[3] = xx[( i + ( 3 * dim1 ) )]; - move64(); - }; - { - y[4] = xx[( i + ( 4 * dim1 ) )]; - move64(); - }; - { - y[5] = xx[( i + ( 5 * dim1 ) )]; - move64(); - }; - { - y[6] = xx[( i + ( 6 * dim1 ) )]; - move64(); - }; - { - y[7] = xx[( i + ( 7 * dim1 ) )]; - move64(); - }; - } - ELSE - { - { - y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 1 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 2 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 3 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 4 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 5 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 6 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( ( sc * 7 ) * dim1 ) << 1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - } - - t[0] = CL_add( y[0], y[4] ); - move64(); - t[1] = CL_sub( y[0], y[4] ); - move64(); - t[2] = CL_add( y[1], y[5] ); - move64(); - t[3] = CL_sub( y[1], y[5] ); - move64(); - t[4] = CL_add( y[2], y[6] ); - move64(); - t[5] = CL_sub( y[2], y[6] ); - move64(); - t[6] = CL_add( y[3], y[7] ); - move64(); - t[7] = CL_sub( y[3], y[7] ); - move64(); - - s[0] = CL_add( t[0], t[4] ); - move64(); - s[2] = CL_sub( t[0], t[4] ); - move64(); - s[4] = CL_mac_j( t[1], t[5] ); - move64(); - s[5] = CL_msu_j( t[1], t[5] ); - move64(); - s[1] = CL_add( t[2], t[6] ); - move64(); - s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); - move64(); - - t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); - move64(); - t[1] = CL_sub( t[3], t[7] ); - move64(); - - s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx - move64(); - s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx - move64(); - s[7] = CL_conjugate( s[7] ); - move64(); - - x[i] = CL_add( s[0], s[1] ); /*x[add(i + i_mult(0 , dim1)] = CL_add( s[0], s[1] )*/ - move64(); - x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] ); - move64(); - x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] ); - move64(); - x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] ); - move64(); - x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] ); - move64(); - x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] ); - move64(); - x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] ); - move64(); - x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] ); - move64(); - } - } - ELSE - { - FOR( i = 0; i < dim1; i++ ) - { - { - y[0] = xx[i]; /* y[0] = xx[i + 0 * dim1] */ - move64(); - }; - IF( i == 0 ) - { - { - y[1] = xx[( i + ( 1 * dim1 ) )]; - move64(); - }; - { - y[2] = xx[( i + ( 2 * dim1 ) )]; - move64(); - }; - { - y[3] = xx[( i + ( 3 * dim1 ) )]; - move64(); - }; - { - y[4] = xx[( i + ( 4 * dim1 ) )]; - move64(); - }; - { - y[5] = xx[( i + ( 5 * dim1 ) )]; - move64(); - }; - { - y[6] = xx[( i + ( 6 * dim1 ) )]; - move64(); - }; - { - y[7] = xx[( i + ( 7 * dim1 ) )]; - move64(); - }; - } - ELSE - { - { - y[1] = CL_mac_j( CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 1 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 1 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[2] = CL_mac_j( CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 2 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 2 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[3] = CL_mac_j( CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 3 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 3 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[4] = CL_mac_j( CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 4 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 4 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[5] = CL_mac_j( CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 5 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 5 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[6] = CL_mac_j( CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 6 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 6 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - { - y[7] = CL_mac_j( CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) - Woff )] ), - CL_scale( xx[( i + ( 7 * dim1 ) )], W[( ( ( ( sc * i ) + ( ( sc * 7 ) * dim1 ) ) + 1 ) - Woff )] ) ); // Qx - move64(); - }; - } - - t[0] = CL_add( y[0], y[4] ); - move64(); - t[1] = CL_sub( y[0], y[4] ); - move64(); - t[2] = CL_add( y[1], y[5] ); - move64(); - t[3] = CL_sub( y[1], y[5] ); - move64(); - t[4] = CL_add( y[2], y[6] ); - move64(); - t[5] = CL_sub( y[2], y[6] ); - move64(); - t[6] = CL_add( y[3], y[7] ); - move64(); - t[7] = CL_sub( y[3], y[7] ); - move64(); - - s[0] = CL_add( t[0], t[4] ); - move64(); - s[2] = CL_sub( t[0], t[4] ); - move64(); - s[4] = CL_mac_j( t[1], t[5] ); - move64(); - s[5] = CL_msu_j( t[1], t[5] ); - move64(); - s[1] = CL_add( t[2], t[6] ); - move64(); - s[3] = CL_swap_real_imag( CL_sub( CL_conjugate( t[2] ), CL_conjugate( t[6] ) ) ); - move64(); - - t[0] = CL_swap_real_imag( CL_add( t[3], t[7] ) ); - move64(); - t[1] = CL_sub( t[3], t[7] ); - move64(); - - s[6] = CL_scale( CL_add( CL_conjugate( t[0] ), t[1] ), FFT_C81 ); // Qx - move64(); - s[7] = CL_scale( CL_sub( t[0], CL_conjugate( t[1] ) ), FFT_C81 ); // Qx - move64(); - s[7] = CL_conjugate( s[7] ); - move64(); - - x[i] = CL_add( s[0], s[1] ); /*x[i + 0 * dim1] = CL_add( s[0], s[1] )*/ - move64(); - x[( i + ( 1 * dim1 ) )] = CL_add( s[5], s[6] ); - move64(); - x[( i + ( 2 * dim1 ) )] = CL_sub( s[2], s[3] ); - move64(); - x[( i + ( 3 * dim1 ) )] = CL_add( s[4], s[7] ); - move64(); - x[( i + ( 4 * dim1 ) )] = CL_sub( s[0], s[1] ); - move64(); - x[( i + ( 5 * dim1 ) )] = CL_sub( s[5], s[6] ); - move64(); - x[( i + ( 6 * dim1 ) )] = CL_add( s[2], s[3] ); - move64(); - x[( i + ( 7 * dim1 ) )] = CL_sub( s[4], s[7] ); - move64(); - } - } -#endif /* OPT_STEREO_32KBPS_V1 */ BREAK; } @@ -7501,11 +7122,7 @@ void rfft_fx( move32(); x[( length - ( i << 1 ) )] = Mpy_32_16_1( L_add( t1, t3 ), 16384 /*0.5.Q15*/ ); move32(); -#ifdef OPT_STEREO_32KBPS_V1 x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_add( t2, t4 ), -16384 /*0.5.Q15*/ ); -#else /* OPT_STEREO_32KBPS_V1 */ - x[( ( length - ( i << 1 ) ) + 1 )] = Mpy_32_16_1( L_negate( L_add( t2, t4 ) ), 16384 /*0.5.Q15*/ ); -#endif /* OPT_STEREO_32KBPS_V1 */ move32(); } diff --git a/lib_com/hp50_fx.c b/lib_com/hp50_fx.c index f1864d7a7..4a055e073 100644 --- a/lib_com/hp50_fx.c +++ b/lib_com/hp50_fx.c @@ -532,11 +532,7 @@ void hp20_fx_32( move16(); } Qy1 = sub( Qy1, 34 ); -#ifdef OPT_STEREO_32KBPS_V1 R1 = W_mult0_32_32( W_shl_sat_l( y1_fx64, Qy1 ), a1_fx ); -#else /* OPT_STEREO_32KBPS_V1 */ - R1 = W_mult0_32_32( W_extract_l( W_shl( y1_fx64, Qy1 ) ), a1_fx ); -#endif /* OPT_STEREO_32KBPS_V1 */ Qy1 = add( Qy1, Qprev_y1 ); Qy2 = W_norm( y2_fx64 ); @@ -546,11 +542,7 @@ void hp20_fx_32( move16(); } Qy2 = sub( Qy2, 34 ); -#ifdef OPT_STEREO_32KBPS_V1 R2 = W_mult0_32_32( W_shl_sat_l( y2_fx64, Qy2 ), a2_fx ); -#else /* OPT_STEREO_32KBPS_V1 */ - R2 = W_mult0_32_32( W_extract_l( W_shl( y2_fx64, Qy2 ) ), a2_fx ); -#endif /* OPT_STEREO_32KBPS_V1 */ Qy2 = add( Qy2, Qprev_y2 ); Qx0 = W_norm( x0_fx64 ); @@ -560,11 +552,7 @@ void hp20_fx_32( move16(); } Qx0 = sub( Qx0, 34 ); -#ifdef OPT_STEREO_32KBPS_V1 R3 = W_mult0_32_32( W_shl_sat_l( x0_fx64, Qx0 ), b2_fx ); -#else /* OPT_STEREO_32KBPS_V1 */ - R3 = W_mult0_32_32( W_extract_l( W_shl( x0_fx64, Qx0 ) ), b2_fx ); -#endif /* OPT_STEREO_32KBPS_V1 */ Qx1 = W_norm( x1_fx64 ); if ( x1_fx64 == 0 ) @@ -573,11 +561,7 @@ void hp20_fx_32( move16(); } Qx1 = sub( Qx1, 34 ); -#ifdef OPT_STEREO_32KBPS_V1 R4 = W_mult0_32_32( W_shl_sat_l( x1_fx64, Qx1 ), b1_fx ); -#else /* OPT_STEREO_32KBPS_V1 */ - R4 = W_mult0_32_32( W_extract_l( W_shl( x1_fx64, Qx1 ) ), b1_fx ); -#endif /* OPT_STEREO_32KBPS_V1 */ Qx2 = W_norm( x2_fx64 ); if ( x2_fx64 == 0 ) @@ -586,11 +570,7 @@ void hp20_fx_32( move16(); } Qx2 = sub( Qx2, 34 ); -#ifdef OPT_STEREO_32KBPS_V1 R5 = W_mult0_32_32( W_shl_sat_l( x2_fx64, Qx2 ), b2_fx ); -#else /* OPT_STEREO_32KBPS_V1 */ - R5 = W_mult0_32_32( W_extract_l( W_shl( x2_fx64, Qx2 ) ), b2_fx ); -#endif /* OPT_STEREO_32KBPS_V1 */ Qmin = s_min( Qy1, Qy2 ); diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 71d090a53..e35cf648c 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4973,14 +4973,12 @@ void ivas_dirac_dec_get_response_fx( const Word16 ambisonics_order, Word16 Q_out ); -#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*This is a derivate to ivas_dirac_dec_get_response_fx with fixed Q_out=29*/ void ivas_dirac_dec_get_response_fx_29( const Word16 azimuth, const Word16 elevation, Word32 *response_fx, /*Q_out=29*/ const Word16 ambisonics_order ); -#endif void calculate_hodirac_sector_parameters_fx( DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index e7ee30e8d..6bb2eaa10 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -1545,19 +1545,6 @@ const Word16 ivas_param_mc_quant_icc_fx[PARAM_MC_SZ_ICC_QUANTIZER] = { /* from 1 to 11 bits*/ /*q factor = 8*/ const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = { -#ifndef FIX_1379_MASA_ANGLE_ROUND - { 1073741824 }, - { 536870912 }, - { 536870912, 1073741824 }, - { 268435456, 536870912 }, - { 178956970, 306783378, 1073741824, 2147483647 }, - { 153391689, 165191049, 238609294, 1073741824, 2147483647 }, - { 97612893, 102261126, 126322567, 195225786, 715827882, 2147483647 }, - { 65075262, 67108864, 74051160, 93368854, 126322567, 238609294, 2147483647 }, - { 44739242, 45691141, 47721858, 52377649, 61356675, 76695844, 107374182, 178956970, 1073741824, 2147483647 }, - { 35791394, 35791394, 37025580, 38347922, 39768215, 42949672, 46684427, 52377649, 59652323, 71582788, 93368854, 126322567, 214748364, 2147483647 }, - { 24129029, 24129029, 24403223, 24970740, 25565281, 26512143, 27889398, 29417584, 31580641, 34087042, 37675151, 42107522, 48806446, 56512727, 71582788, 93368854, 143165576, 268435456, 2147483647 } -#else { 1073741824 }, { 536870912 }, { 536870912, 1073741824 }, @@ -1569,7 +1556,6 @@ const Word32 no_phi_masa_inv_fx[NO_SPHERICAL_GRIDS][MAX_NO_THETA] = { { 44739243, 45691141, 47721859, 52377650, 61356676, 76695845, 107374182, 178956971, 1073741824, 2147483647 }, { 35791394, 35791394, 37025580, 38347922, 39768216, 42949673, 46684427, 52377650, 59652324, 71582788, 93368854, 126322568, 214748365, 2147483647 }, { 24129030, 24129030, 24403223, 24970740, 25565282, 26512144, 27889398, 29417584, 31580642, 34087042, 37675152, 42107523, 48806447, 56512728, 71582788, 93368854, 143165577, 268435456, 2147483647 }, -#endif }; diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 15a529149..3805c9d36 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -7287,7 +7287,6 @@ void ivas_dirac_dec_get_response_fx( return; } -#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*This is a derivate to ivas_dirac_dec_get_response_fx with fixed Q_out=29*/ void ivas_dirac_dec_get_response_fx_29( const Word16 azimuth, @@ -7413,7 +7412,6 @@ void ivas_dirac_dec_get_response_fx_29( } return; } -#endif /*FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx*/ /*-----------------------------------------------------------------------------------------* * Function ivas_get_bits_to_encode * diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index 2e39af523..a9b6581ed 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -1059,7 +1059,6 @@ void Decimate_allpass_steep_fx32( /* upper allpass filter chain */ FOR( k = 0; k < N / 2; k++ ) { -#ifdef OPT_STEREO_32KBPS_V1 temp[0] = Madd_32_16( mem[0], in[2 * k], AP1_STEEP_FX[0] ); // Qx move32(); mem[0] = Msub_32_16( in[2 * k], temp[0], AP1_STEEP_FX[0] ); // Qx @@ -1074,118 +1073,51 @@ void Decimate_allpass_steep_fx32( move32(); mem[ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[0], Mpy_32_16_1( in[2 * k], AP1_STEEP_FX[0] ) ); // Qx - move32(); - mem[0] = L_sub( in[2 * k], Mpy_32_16_1( temp[0], AP1_STEEP_FX[0] ) ); // Qx - move32(); - - temp[1] = L_add( mem[1], Mpy_32_16_1( temp[0], AP1_STEEP_FX[1] ) ); // Qx - move32(); - mem[1] = L_sub( temp[0], Mpy_32_16_1( temp[1], AP1_STEEP_FX[1] ) ); // Qx - move32(); - - out[k] = L_add( mem[ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( out[k], AP1_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } /* lower allpass filter chain */ -#ifdef OPT_STEREO_32KBPS_V1 temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ); // Qx move32(); mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( mem[2 * ALLPASSSECTIONS_STEEP], temp[0], AP2_STEEP_FX[0] ); // Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( mem[2 * ALLPASSSECTIONS_STEEP], AP2_STEEP_FX[0] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = L_sub( mem[2 * ALLPASSSECTIONS_STEEP], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ /* for better performance, unroll this loop */ FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) { -#ifdef OPT_STEREO_32KBPS_V1 temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx move32(); mem[ALLPASSSECTIONS_STEEP + 1] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx - move32(); - /*if ( fabs( temp[n] ) < 1e-12 ) - { - temp[n] = sign( temp[n] ) * 1e-12f; - }*/ - mem[ALLPASSSECTIONS_STEEP + 1] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifdef OPT_STEREO_32KBPS_V1 temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx move32(); mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - - mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ out[0] = W_round48_L( W_mac_32_16( W_mult_32_16( out[0], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx move32(); FOR( k = 1; k < N / 2; k++ ) { -#ifdef OPT_STEREO_32KBPS_V1 temp[0] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP], in[2 * k - 1], AP2_STEEP_FX[0] ); // Qx move32(); mem[ALLPASSSECTIONS_STEEP] = Msub_32_16( in[2 * k - 1], temp[0], AP2_STEEP_FX[0] ); // Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[0] = L_add( mem[ALLPASSSECTIONS_STEEP], Mpy_32_16_1( in[sub( shl( k, 1 ), 1 )], AP2_STEEP_FX[0] ) ); // Qx - move32(); - mem[ALLPASSSECTIONS_STEEP] = L_sub( in[sub( shl( k, 1 ), 1 )], Mpy_32_16_1( temp[0], AP2_STEEP_FX[0] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ /* for better performance, unroll this loop */ FOR( n = 1; n < ALLPASSSECTIONS_STEEP - 1; n++ ) { -#ifdef OPT_STEREO_32KBPS_V1 temp[n] = Madd_32_16( mem[ALLPASSSECTIONS_STEEP + n], temp[n - 1], AP2_STEEP_FX[n] ); // Qx move32(); mem[ALLPASSSECTIONS_STEEP + n] = Msub_32_16( temp[n - 1], temp[n], AP2_STEEP_FX[n] ); // Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[n] = L_add( mem[ALLPASSSECTIONS_STEEP + n], Mpy_32_16_1( temp[n - 1], AP2_STEEP_FX[n] ) ); // Qx - move32(); - /*if ( fabs( temp[n] ) < 1e-12 ) - { - temp[n] = sign( temp[n] ) * 1e-12f; - }*/ - mem[ALLPASSSECTIONS_STEEP + n] = L_sub( temp[n - 1], Mpy_32_16_1( temp[n], AP2_STEEP_FX[n] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifdef OPT_STEREO_32KBPS_V1 temp[ALLPASSSECTIONS_STEEP - 1] = Madd_32_16( mem[2 * ALLPASSSECTIONS_STEEP - 1], temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx move32(); mem[2 * ALLPASSSECTIONS_STEEP - 1] = Msub_32_16( temp[ALLPASSSECTIONS_STEEP - 2], temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ); // Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - temp[ALLPASSSECTIONS_STEEP - 1] = L_add( mem[2 * ALLPASSSECTIONS_STEEP - 1], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 2], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); - mem[2 * ALLPASSSECTIONS_STEEP - 1] = L_sub( temp[ALLPASSSECTIONS_STEEP - 2], Mpy_32_16_1( temp[ALLPASSSECTIONS_STEEP - 1], AP2_STEEP_FX[ALLPASSSECTIONS_STEEP - 1] ) ); // Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ out[k] = W_round48_L( W_mac_32_16( W_mult_32_16( out[k], 16384 /*0.5 in Q15*/ ), temp[ALLPASSSECTIONS_STEEP - 1], 16384 /*0.5 in Q15*/ ) ); // Qx move32(); } @@ -1487,21 +1419,12 @@ void interpolate_3_over_2_allpass_fx32( FOR( i = 0; i < len; i++ ) { /* Upper branch */ -#ifdef OPT_STEREO_32KBPS_V1 Vu[0] = Madd_32_16( mem[0], L_sub( input[i], mem[1] ), filt_coeff[0] ); // Qx + Q15 - Q15 -> Qx move32(); Vu[1] = Madd_32_16( mem[1], L_sub( Vu[0], mem[2] ), filt_coeff[1] ); // Qx + Q15 - Q15 -> Qx move32(); mem[3] = Madd_32_16( mem[2], L_sub( Vu[1], mem[3] ), filt_coeff[2] ); // Qx + Q15 - Q15 -> Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vu[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[1] ), filt_coeff[0] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vu[1] = L_add( mem[1], Mpy_32_16_1( L_sub( Vu[0], mem[2] ), filt_coeff[1] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[3] = L_add( mem[2], Mpy_32_16_1( L_sub( Vu[1], mem[3] ), filt_coeff[2] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ mem[1] = Vu[0]; // Qx move32(); @@ -1511,21 +1434,12 @@ void interpolate_3_over_2_allpass_fx32( move32(); /* Middle branch */ -#ifdef OPT_STEREO_32KBPS_V1 Vm[0] = Madd_32_16( mem[0], L_sub( input[i], mem[4] ), filt_coeff[3] ); // Qx + Q15 - Q15 -> Qx move32(); Vm[1] = Madd_32_16( mem[4], L_sub( Vm[0], mem[5] ), filt_coeff[4] ); // Qx + Q15 - Q15 -> Qx move32(); mem[6] = Madd_32_16( mem[5], L_sub( Vm[1], mem[6] ), filt_coeff[5] ); // Qx + Q15 - Q15 -> Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vm[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[4] ), filt_coeff[3] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vm[1] = L_add( mem[4], Mpy_32_16_1( L_sub( Vm[0], mem[5] ), filt_coeff[4] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[6] = L_add( mem[5], Mpy_32_16_1( L_sub( Vm[1], mem[6] ), filt_coeff[5] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ mem[4] = Vm[0]; // Qx move32(); @@ -1535,21 +1449,12 @@ void interpolate_3_over_2_allpass_fx32( move32(); /* Lower branch */ -#ifdef OPT_STEREO_32KBPS_V1 Vl[0] = Madd_32_16( mem[0], L_sub( input[i], mem[7] ), filt_coeff[6] ); // Qx + Q15 - Q15 -> Qx move32(); Vl[1] = Madd_32_16( mem[7], L_sub( Vl[0], mem[8] ), filt_coeff[7] ); // Qx + Q15 - Q15 -> Qx move32(); mem[9] = Madd_32_16( mem[8], L_sub( Vl[1], mem[9] ), filt_coeff[8] ); // Qx + Q15 - Q15 -> Qx move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Vl[0] = L_add( mem[0], Mpy_32_16_1( L_sub( input[i], mem[7] ), filt_coeff[6] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - Vl[1] = L_add( mem[7], Mpy_32_16_1( L_sub( Vl[0], mem[8] ), filt_coeff[7] ) ); // Qx + Q15 - Q15 -> Qx - move32(); - mem[9] = L_add( mem[8], Mpy_32_16_1( L_sub( Vl[1], mem[9] ), filt_coeff[8] ) ); // Qx + Q15 - Q15 -> Qx - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ mem[0] = input[i]; // Qx move32(); @@ -1568,17 +1473,10 @@ void interpolate_3_over_2_allpass_fx32( { mem_temp = out1_buff[2 * i]; move32(); -#ifdef OPT_STEREO_32KBPS_V1 out[i] = Madd_32_16( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), L_add( mem[11], mem[14] ), -4965 ); // Qx + Q15 - Q15 -> Qx // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 out[i] = Madd_32_16( out[i], L_add( mem[12], mem[13] ), 20125 ); // 0.614152f in Q15 -> 20125 -#else /* OPT_STEREO_32KBPS_V1 */ - out[i] = L_add( Mpy_32_16_1( L_add( mem_temp, mem[10] ), 1550 ), Mpy_32_16_1( L_add( mem[11], mem[14] ), -4965 ) ); // Qx + Q15 - Q15 -> Qx - // 0.0473147f in Q15 -> 1550, -0.151521f in Q15 -> -4965 - out[i] = L_add( out[i], Mpy_32_16_1( L_add( mem[12], mem[13] ), 20125 ) ); - // 0.614152f in Q15 -> 20125 -#endif /* OPT_STEREO_32KBPS_V1 */ mem[10] = mem[11]; // Qx move32(); mem[11] = mem[12]; // Qx diff --git a/lib_com/mslvq_com_fx.c b/lib_com/mslvq_com_fx.c index 8d5e8adf2..bbca86159 100644 --- a/lib_com/mslvq_com_fx.c +++ b/lib_com/mslvq_com_fx.c @@ -126,13 +126,10 @@ void init_lvq_fx( ) { Word16 i, j; -#ifdef OPT_STEREO_32KBPS_V1 Word16 k; -#endif /* OPT_STEREO_32KBPS_V1 */ /* safety-net mode */ FOR( i = 0; i < MAX_NO_MODES; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; j++ ) { if ( no_lead_fx[i][j] > 0 ) @@ -162,31 +159,10 @@ void init_lvq_fx( } no_scales[i][1] = k; move16(); -#else /* OPT_STEREO_32KBPS_V1 */ - j = 0; - move16(); - test(); - WHILE( ( LT_16( j, MAX_NO_SCALES ) ) && ( no_lead_fx[i][j] > 0 ) ) - { - j++; - } - no_scales[i][0] = j; - move16(); - j = MAX_NO_SCALES; - move16(); - test(); - WHILE( ( LT_16( j, shl( MAX_NO_SCALES, 1 ) ) ) && ( no_lead_fx[i][j] > 0 ) ) - { - j++; - } - no_scales[i][1] = sub( j, MAX_NO_SCALES ); - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ } /* predictive mode */ FOR( i = 0; i < MAX_NO_MODES_p; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 FOR( ( j = 0, k = 0 ); j < MAX_NO_SCALES; j++ ) { if ( no_lead_p_fx[i][j] > 0 ) @@ -218,26 +194,6 @@ void init_lvq_fx( no_scales_p[i][1] = k; move16(); -#else /* OPT_STEREO_32KBPS_V1 */ - j = 0; - move16(); - WHILE( ( LT_16( j, MAX_NO_SCALES ) ) && ( no_lead_p_fx[i][j] > 0 ) ) - { - test(); - j++; - } - no_scales_p[i][0] = j; - move16(); - j = MAX_NO_SCALES; - move16(); - WHILE( ( LT_16( j, shl( MAX_NO_SCALES, 1 ) ) ) && ( no_lead_p_fx[i][j] > 0 ) ) - { - test(); - j++; - } - no_scales_p[i][1] = sub( j, MAX_NO_SCALES ); - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ } /* index offsets for each truncation */ init_offset_fx( offset_scale1, offset_scale2, offset_scale1_p, offset_scale2_p, no_scales, no_scales_p ); diff --git a/lib_com/options.h b/lib_com/options.h index 1cd99a80c..5f33170bf 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -74,9 +74,7 @@ #define FIX_1737_FIX_867_CLDFB_NRG_SCALE #define FIX_1737_proto_fac_overflow -#define FIX_1378_ACELP_OUT_OF_BOUNDS -#define FIX_1379_MASA_ANGLE_ROUND /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V1_NBE @@ -85,41 +83,16 @@ #define OPT_SBA_DEC_V2_BE #define OPT_SBA_ENC_V2_BE #define OPT_SBA_ENC_V1_BE -#define OPT_BIN_RENDERER_V1 -#define OPT_BIN_RENDERER_V2 -#define OPT_STEREO_32KBPS_V1 /* Optimization made in stereo decoding path for 32kbps decoding */ -#define OPT_AVOID_STATE_BUF_RESCALE /* Optimization made to avoid rescale of synth state buffer */ #define OPT_SBA_DEC_PATH /* Optimization made in SBA decoding path */ #define OPT_IVAS_FILTER_ROM /* Optimization made in IVAS filter table */ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx /*FhG: WMOPS tuning, nonbe*/ -#define FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot /*FhG: WMOPS tuning, nonbe*/ /* Both following 2 macros (IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST*) are independent from each other, they refer to different code blocks */ -#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE /* FhG: reduces WMOPS of param_mc_prm_est, bit-exact to previous version */ //#define IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE /* FhG: reduces WMOPS of param_mc_prm_est, not bit-exact to previous version. Obsoleted by MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ -#define HARM_PUSH_BIT -#define HARM_ENC_INIT //#define HARM_SCE_INIT -#define DIV32_OPT_NEWTON /* FhG: faster 32 by 32 bit division */ -#define MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of Cy calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Obsoletes IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE. */ #define MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE /* FhG: reduce WMOPS of dmx calculation in ivas_param_mc_param_est_enc_fx() by using 64 Bit addition. Requires MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE. */ -#define MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE /* FhG: reduce WMOPS by inlining the matrix multiplications for the smoothing operation. */ -#define FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_stereo_icBWE_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx /*FhG: reduces WMOPS - bit-exact*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic /*FhG: reduces maintenance complexity & reduces WMOPS & prepares STAGE2 patch*/ -#define FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 /*FhG: reduces WMOPS*/ -#define FIX_1481_HARDCODE_DIV /* FhG: hardcode division results in stereo_dmx_evs_init_encoder_fx() */ -#define VEC_ARITH_OPT_v1 -#define FIX_1486_IND_SHB_RES /* VA: Fix for issue 1486: align the usage of IND_SHB_RES_GS indices with float code */ -#define FIX_1511_POC_RENORM /* NTT: Fix for issue 1511: Renorm for POC. */ - -#define TEST_HR -#define REMOVE_EVS_DUPLICATES /* remove core-coder duplicated functions, ACELP low-band decoder */ - -#define FIX_1713_EXP /* VA: proposed correction to exp in ic-BWE*/ + + #define FIX_USAN_BASOP_UTIL_DIVIDE3232 /* Eri: Fix USAN error in BASOP_Util_Divide3232_Scale_newton by adding explicit type cast for -1 in hex */ -#define FIX_1733_CLDFB_BUG #define FIX_1740_MISING_POP_WMOPS /* VA: fix issue 1740: missing pop_wmops() */ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index d533c5612..2d4ea1901 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3222,11 +3222,8 @@ void interp_code_4over2_fx( void wb_tbe_extras_reset_synth_fx( Word16 state_lsyn_filt_shb[], Word16 state_lsyn_filt_dwn_shb[], Word16 state_32and48k_WB_upsample[], Word16 state_resamp_HB[] ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 const Word16 element_mode, -#endif Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ Word16 *Q_input_fx, @@ -3235,16 +3232,6 @@ void elliptic_bpf_48k_generic_fx( Word16 memory_fx_Q[], const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ ); -#else -void elliptic_bpf_48k_generic_fx( - const Word16 input_fx[], /* i : i signal Q_input_fx */ - Word16 *Q_input_fx, - Word16 output_fx[], /* o : output signal */ - Word32 memory_fx[][4], /* i/o: 4 arrays of 4 for memory memory_fx_Q */ - Word16 memory_fx_Q[], - const Word16 full_band_bpf[][5] /* i : filter coefficients b0,b1,b2,a0,a1,a2 Q13 */ -); -#endif void synthesise_fb_high_band_fx( const Word16 excitation_in[], /* i : full band excitation */ @@ -3258,10 +3245,8 @@ void synthesise_fb_high_band_fx( Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , Word16 element_mode -#endif ); void prep_tbe_exc_fx( @@ -6028,14 +6013,12 @@ void v_add_fixed( const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ ); -#ifdef VEC_ARITH_OPT_v1 void v_add_fixed_no_hdrm( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ const Word16 N /* i : Vector length */ ); -#endif /* VEC_ARITH_OPT_v1 */ void v_add_fixed_me( const Word32 x1[], /* i : Input vector 1 */ @@ -6071,14 +6054,12 @@ void v_sub_fixed( const Word16 hdrm /* i : headroom for when subtraction result > 1 or < -1 */ ); -#ifdef VEC_ARITH_OPT_v1 void v_sub_fixed_no_hdrm( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ Word32 y[], /* o : Output vector that contains vector 1 - vector 2 */ const Word16 N /* i : Vector length */ ); -#endif /* VEC_ARITH_OPT_v1 */ /*! r: dot product of x[] and y[] */ Word32 dotp_fixed( @@ -9385,9 +9366,7 @@ void cldfbSynthesis_ivas_fx( Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ const Word16 samplesToProcess, /* i : number of processed samples */ const Word16 shift, /* i : scale for state buffer */ -#ifdef OPT_AVOID_STATE_BUF_RESCALE const Word16 out_shift, /* i : scale for output buffer */ -#endif HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ ); diff --git a/lib_com/scale_mem_fx.c b/lib_com/scale_mem_fx.c index 2ce2ffd12..168a96011 100644 --- a/lib_com/scale_mem_fx.c +++ b/lib_com/scale_mem_fx.c @@ -307,12 +307,10 @@ void scale_sig32( /* saturation can occur here */ x[i] = L_shl( x[i], exp0 ); move32(); -#ifdef OPT_STEREO_32KBPS_V1 if ( 0 == exp0 ) { i = lg; } -#endif /* OPT_STEREO_32KBPS_V1 */ } } @@ -329,12 +327,10 @@ void scale_sig32_r( /* saturation can occur here */ x[i] = L_shl_r( x[i], exp0 ); move32(); -#ifdef OPT_STEREO_32KBPS_V1 if ( 0 == exp0 ) { i = lg; } -#endif /* OPT_STEREO_32KBPS_V1 */ } } diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 2cb51ae93..f37381b69 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6368,15 +6368,9 @@ void wb_tbe_extras_reset_synth_fx( *-------------------------------------------------------------------*/ void elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 const int16_t element_mode, -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 IsUpsampled3, Word16 input_fx[], /* i : input signal Q_input_fx*/ -#else - const Word16 input_fx[], /* i : input signal Q_input_fx*/ -#endif Word16 *Q_input_fx, Word16 output_fx[], /* o : output signal memory_fx_Q */ Word32 memory_fx2[][4], /* i/o: 4 arrays of 4 for memory */ @@ -6385,27 +6379,18 @@ void elliptic_bpf_48k_generic_fx( ) { Word16 i, j; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 memory_fx0, Q_temp, Q_temp2; Word32 L_tmp_buffer[L_FRAME48k + 4], L_tmp2_buffer[L_FRAME48k + 4], L_output_buffer[L_FRAME48k + 4], L_tmpX; Word32 L_tmpMax; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 Word64 W_tmpX; Word64 W_tmpY; -#endif Word32 *L_tmp = &L_tmp_buffer[4]; Word32 *L_tmp2 = &L_tmp2_buffer[4]; Word32 *L_output = &L_output_buffer[4]; -#else - Word16 memory_fx0[4][4], memory_fx[4][4], Q_temp, Q_temp2; - Word32 L_tmp[L_FRAME48k], L_tmp2[L_FRAME48k], L_output[L_FRAME48k], L_tmpX, memory2_fx[4][4], L_tmpMax; - Word32 memory2_fx_2[4], memory2_fx_3[4]; -#endif FOR( i = 0; i < 4; i++ ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic memory_fx0 = extract_l( memory_fx2[0][i] ); input_fx[i - 4] = shl_sat( memory_fx0, sub( *Q_input_fx, memory_fx_Q[0] ) ); L_tmp[i - 4] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); @@ -6416,24 +6401,11 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); -#else - memory_fx0[0][i] = extract_l( memory_fx2[0][i] ); - memory_fx[0][i] = shl_sat( memory_fx0[0][i], sub( *Q_input_fx, memory_fx_Q[0] ) ); - memory2_fx[1][i] = L_shl_sat( memory_fx2[1][i], sub( add( *Q_input_fx, 11 ), memory_fx_Q[1] ) ); - memory2_fx[2][i] = L_shl_sat( memory_fx2[2][i], sub( add( *Q_input_fx, 6 ), memory_fx_Q[2] ) ); - move32(); - move32(); - move32(); - move32(); - move32(); -#endif } -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); IF( !IsUpsampled3 ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( element_mode ) { FOR( i = 0; i < L_FRAME48k; i++ ) @@ -6453,7 +6425,6 @@ void elliptic_bpf_48k_generic_fx( } } ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6472,7 +6443,6 @@ void elliptic_bpf_48k_generic_fx( } /*IsUpsampled3*/ ELSE { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( element_mode ) { FOR( i = 0; i < L_FRAME48k; ) @@ -6508,7 +6478,6 @@ void elliptic_bpf_48k_generic_fx( } } ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { FOR( i = 0; i < L_FRAME48k; ) { @@ -6542,63 +6511,6 @@ void elliptic_bpf_48k_generic_fx( } /*IsUpsampled3*/ -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( L_mult( memory_fx[0][0], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][1], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - - L_tmpX = L_shr( L_mult( memory_fx[0][2], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - L_tmpX = L_shr( L_mult( memory_fx[0][3], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[0], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[1], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[2], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add( L_shr( L_mult( input_fx[3], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[2], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[1], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[0], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmp[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( L_mult( input_fx[i - 4], full_band_bpf_fx[0][4] ), 3 ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 3], full_band_bpf_fx[0][3] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[3][1] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 2], full_band_bpf_fx[0][2] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[3][2] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i - 1], full_band_bpf_fx[0][1] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[3][3] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - L_tmpX = L_add_sat( L_shr( L_mult( input_fx[i], full_band_bpf_fx[0][0] ), 3 ), L_tmpX ); /*Q_input_fx + 13 + 1 - 3*/ - L_tmp[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[3][4] ), 2 ) ); /*Q_input_fx + 11 + 13 -15 +2*/ - move32(); - } -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ memory_fx2[0][0] = input_fx[L_FRAME48k - 4]; memory_fx2[0][1] = input_fx[L_FRAME48k - 3]; @@ -6610,9 +6522,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( element_mode ) { FOR( i = 0; i < L_FRAME48k; i++ ) @@ -6632,7 +6542,6 @@ void elliptic_bpf_48k_generic_fx( } } ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6649,66 +6558,6 @@ void elliptic_bpf_48k_generic_fx( L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][0], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - L_tmp2[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][0], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2*/ - move32(); - L_tmpMax = L_abs( L_tmp2[0] ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][1], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][1], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[1] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][2], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][2], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[2] ) ); - L_tmpX = L_shr( Mult_32_16( memory2_fx[1][3], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[0], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[1], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[2], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add( L_shr( Mult_32_16( L_tmp[3], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[2], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[1], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[0], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmp2[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx[2][3], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ /*14 + Q_input_fx - shift_flag*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[3] ) ); - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp[i - 4], full_band_bpf_fx[1][4] ), 3 ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 3], full_band_bpf_fx[1][3] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[4][1] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 2], full_band_bpf_fx[1][2] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[4][2] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i - 1], full_band_bpf_fx[1][1] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[4][3] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp[i], full_band_bpf_fx[1][0] ), 3 ), L_tmpX ); /*Q_input_fx + 11 + 13 - 15 -3*/ - L_tmp2[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[4][4] ), 2 ) ); /*Q_input_fx + 6 +13 -15 +2 */ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_tmp2[i] ) ); - } -#endif Q_temp = norm_l( L_tmpMax ); @@ -6724,7 +6573,6 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); move32(); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic FOR( j = 0; j < 4; j++ ) { L_tmp2[j - 4] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); @@ -6733,19 +6581,7 @@ void elliptic_bpf_48k_generic_fx( move32(); move32(); } -#else - FOR( j = 0; j < 4; j++ ) - { - memory2_fx_2[j] = L_shl_sat( memory_fx2[2][j], sub( add( add( *Q_input_fx, 6 ), Q_temp ), memory_fx_Q[2] ) ); - memory2_fx_3[j] = L_shl_sat( memory_fx2[3][j], sub( add( add( *Q_input_fx, 1 ), Q_temp ), memory_fx_Q[3] ) ); - move32(); - move32(); - move32(); - } -#endif -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic L_tmpMax = L_add( 0, 0 ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 IF( element_mode ) { FOR( i = 0; i < L_FRAME48k; i++ ) @@ -6765,7 +6601,6 @@ void elliptic_bpf_48k_generic_fx( } } ELSE -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ { FOR( i = 0; i < L_FRAME48k; i++ ) { @@ -6786,73 +6621,6 @@ void elliptic_bpf_48k_generic_fx( } } -#else /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic*/ - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[0], full_band_bpf_fx[2][4] ), 3 ); /* *Q_input_fx+6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - L_output[0] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[0], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2 */ - move32(); - L_tmpMax = L_abs( L_output[0] ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[1], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx+Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - L_output[1] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[1], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +13 -15 + 2+Q_temp*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[1] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[2], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp+ 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx +Q_temp + 6 +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1+Q_temp +13 -15 + 2*/ - L_output[2] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[2], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[2] ) ); - - L_tmpX = L_shr( Mult_32_16( memory2_fx_2[3], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp +13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[0], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[1], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[2], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[3], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[2], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[1], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[0], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - L_output[3] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( memory2_fx_3[3], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[3] ) ); - - FOR( i = 4; i < L_FRAME48k; i++ ) - { - L_tmpX = L_shr( Mult_32_16( L_tmp2[i - 4], full_band_bpf_fx[2][4] ), 3 ); /*Q_input_fx + 6 +Q_temp+13 -15 -3 */ - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 3], full_band_bpf_fx[2][3] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 1], full_band_bpf_fx[5][1] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 2], full_band_bpf_fx[2][2] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp+13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 2], full_band_bpf_fx[5][2] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i - 1], full_band_bpf_fx[2][1] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_tmpX = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 3], full_band_bpf_fx[5][3] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - - L_tmpX = L_add_sat( L_shr( Mult_32_16( L_tmp2[i], full_band_bpf_fx[2][0] ), 3 ), L_tmpX ); /*Q_input_fx + 6 +Q_temp +13 -15 -3*/ - L_output[i] = L_sub_sat( L_tmpX, L_shl_sat( Mult_32_16( L_output[i - 4], full_band_bpf_fx[5][4] ), 2 ) ); /*Q_input_fx + 1 +Q_temp+13 -15 + 2*/ - move32(); - L_tmpMax = L_max( L_tmpMax, L_abs( L_output[i] ) ); - } -#endif memory_fx2[2][0] = L_tmp2[L_FRAME48k - 4]; memory_fx2[2][1] = L_tmp2[L_FRAME48k - 3]; @@ -6918,19 +6686,13 @@ void synthesise_fb_high_band_fx( Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], Word16 Qout -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , int16_t element_mode -#endif ) { Word16 i, j; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; Word16 *excitation_in_interp3 = &excitation_in_interp3_buffer[0] + 4; -#else - Word16 excitation_in_interp3[L_FRAME48k]; -#endif Word16 tmp[L_FRAME48k]; Word32 temp1; Word32 ratio2; @@ -6955,32 +6717,20 @@ void synthesise_fb_high_band_fx( IF( EQ_16( L_frame, L_FRAME16k ) ) { /* for 16kHz ACELP core */ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 element_mode, -#endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); -#else - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_3_fx ); -#endif } ELSE { /* for 12.8kHz ACELP core */ -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 element_mode, -#endif 1, // IsUpsampled3 excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); -#else - elliptic_bpf_48k_generic_fx( excitation_in_interp3, &exp_tmp, tmp, bpf_memory, bpf_memory_Q, full_band_bpf_1_fx ); -#endif } /* temp1 = sum2_f( tmp, L_FRAME48k ) + 0.001f */ temp1 = sum2_fx_mod( tmp, L_FRAME48k ); diff --git a/lib_com/tools.c b/lib_com/tools.c index 9166d16eb..3cf11ea92 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -777,7 +777,6 @@ void v_sub_fixed( return; } -#ifdef VEC_ARITH_OPT_v1 void v_sub_fixed_no_hdrm( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ @@ -795,7 +794,6 @@ void v_sub_fixed_no_hdrm( return; } -#endif /* VEC_ARITH_OPT_v1 */ /*-------------------------------------------------------------------* * v_multc_fixed() diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 137e2a40e..a83dfb56b 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -818,7 +818,6 @@ void Copy_Scale_sig_16_32_no_sat( } return; } -#ifdef FIX_1439_SPEEDUP_Copy_Scale_sig_16_32_no_sat L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); IF( L_tmp >= 0x7FFF ) @@ -840,15 +839,6 @@ void Copy_Scale_sig_16_32_no_sat( move32(); } } -#else - L_tmp = L_shl_o( 1, exp0 - 1, &Overflow ); - FOR( i = 0; i < lg; i++ ) - { - // y[i] = L_mult0(x[i], L_tmp); - y[i] = W_extract_l( W_mult_32_16( L_tmp, x[i] ) ); - move32(); /* Overflow can occur here */ - } -#endif } void Copy_Scale_sig_32_16( @@ -4600,7 +4590,6 @@ void v_add_fixed( return; } -#ifdef VEC_ARITH_OPT_v1 void v_add_fixed_no_hdrm( const Word32 x1[], /* i : Input vector 1 */ const Word32 x2[], /* i : Input vector 2 */ @@ -4618,7 +4607,6 @@ void v_add_fixed_no_hdrm( return; } -#endif /* VEC_ARITH_OPT_v1 */ void v_add_fixed_me( const Word32 x1[], /* i : Input vector 1 */ diff --git a/lib_com/trans_inv_fx.c b/lib_com/trans_inv_fx.c index 0683e266c..36678487a 100644 --- a/lib_com/trans_inv_fx.c +++ b/lib_com/trans_inv_fx.c @@ -84,9 +84,7 @@ void preecho_sb_fx( UWord16 tmp_u16; Word32 mean_prev_hb_fx_loc, mean_prev_nc_fx_loc, mean_prev_fx_loc; /* */ Word16 q16p1, qmemp1, qtmp; -#ifdef OPT_STEREO_32KBPS_V1 Word16 shift_q = sub( 15, q_sig32 ); -#endif /* OPT_STEREO_32KBPS_V1 */ q16p1 = add( q_sig16, 1 ); qmemp1 = q16p1; @@ -139,7 +137,6 @@ void preecho_sb_fx( /* len3xLp20 = framelength/2-(short)((float)framelength*N_ZERO_MDCT/FRAME_SIZE_MS); in float*/ fxptr1 = imdct_mem_fx; -#ifdef OPT_STEREO_32KBPS_V1 FOR( i = 0; i < len3xLp20; i++ ) { *fxptr1++ = negate( extract_h( L_shl_sat( wtda_audio_fx[len3xLp20 - 1 - i], shift_q ) ) ); /*Q-1*/ @@ -150,19 +147,6 @@ void preecho_sb_fx( *fxptr1++ = negate( extract_h( L_shl_sat( wtda_audio_fx[i], shift_q ) ) ); /*Q-1*/ move16(); /*convert to Word16 Q-1 with saturation (saturation not a problem here) */ } -#else /* OPT_STEREO_32KBPS_V1 */ - fx32ptr1 = wtda_audio_fx + len3xLp20 - 1; /*q_sig32*/ - FOR( i = 0; i < len3xLp20; i++ ) - { - *fxptr1++ = negate( extract_h( L_shl_sat( *fx32ptr1--, sub( 15, q_sig32 ) ) ) ); /*Q-1*/ - move16(); /*convert to Word16 Q-1 with saturation (saturation not a problem here) */ - } - FOR( i = 0; i < L_shr( framelength, 1 ); i++ ) - { - *fxptr1++ = negate( extract_h( L_shl_sat( wtda_audio_fx[i], sub( 15, q_sig32 ) ) ) ); /*Q-1*/ - move16(); /*convert to Word16 Q-1 with saturation (saturation not a problem here) */ - } -#endif /* OPT_STEREO_32KBPS_V1 */ qmemp1 = 0; /*already in q-1*/ move16(); @@ -408,7 +392,6 @@ void preecho_sb_fx( move16(); FOR( i = 1; i <= NUMSF; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 max_es_hb_fx = L_max( max_es_hb_fx, es_mdct_hb_fx[i] ); /* max energy low band, 8 present and 1 future subframes */ max_es_fx = L_max( max_es_fx, es_mdct_fx[i] ); /* max energy low band, 8 present and 1 future subframes */ @@ -418,19 +401,6 @@ void preecho_sb_fx( maxind = i; move16(); } -#else /* OPT_STEREO_32KBPS_V1 */ - IF( GE_32( es_mdct_hb_fx[i], max_es_hb_fx ) ) /* '=' to handle the first window*/ - { - max_es_hb_fx = L_add( es_mdct_hb_fx[i], 0 ); /* max energy low band, 8 present and 1 future subframes */ - } - - IF( GE_32( es_mdct_fx[i], max_es_fx ) ) /* '=' to handle the first window*/ - { - max_es_fx = L_add( es_mdct_fx[i], 0 ); /* max energy low band, 8 present and 1 future subframes */ - maxind = i; - move16(); - } -#endif /* OPT_STEREO_32KBPS_V1 */ } cnt2 = cnt5 = 0; diff --git a/lib_dec/acelp_core_dec_fx.c b/lib_dec/acelp_core_dec_fx.c index 847e16594..76bf9d622 100644 --- a/lib_dec/acelp_core_dec_fx.c +++ b/lib_dec/acelp_core_dec_fx.c @@ -2042,15 +2042,6 @@ ivas_error acelp_core_dec_fx( scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real } -#ifndef OPT_AVOID_STATE_BUF_RESCALE -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // (Q_real-1) -#endif /* OPT_STEREO_32KBPS_V1 */ - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { @@ -2070,18 +2061,8 @@ ivas_error acelp_core_dec_fx( } } -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSynHB ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, save_hb_synth_fx, -1, 0, st->cldfbSynHB ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( save_hb_synth_fx, L_FRAME48k, negate( ( sub( Q_real, 1 ) ) ) ); // Q0 - Scale_sig32( st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + /* restore lowband */ FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) { @@ -2093,21 +2074,8 @@ ivas_error acelp_core_dec_fx( move32(); } } -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); // Q_real-1 - st->cldfbSynHB->Q_cldfb_state = sub( Q_real, 1 ); - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, sub( Q11, Q_real ), -10, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( pRealSave_fx, pImagSave_fx, synth_fx, -1, 0, st->cldfbSyn ); - Scale_sig32( synth_fx, L_FRAME48k, negate( sub( Q_real, 1 ) ) ); // Q0 - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSynHB->Q_cldfb_state = Q10; - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ } ELSE { @@ -2131,19 +2099,11 @@ ivas_error acelp_core_dec_fx( scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real } -#ifdef OPT_STEREO_32KBPS_V1 scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) -#endif /* OPT_STEREO_32KBPS_V1 */ st->cldfbSyn->Q_cldfb_state = sub( Q_real, 1 ); move16(); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, 0, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx, -1, 0, st->cldfbSyn ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 st->cldfbSyn->Q_cldfb_state = Q10; @@ -2224,26 +2184,9 @@ ivas_error acelp_core_dec_fx( scale_sig32( realBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real scale_sig32( imagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, Q_real ); // Q_real } -#ifndef OPT_AVOID_STATE_BUF_RESCALE -#ifdef OPT_STEREO_32KBPS_V1 - scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q_real, Q11 ) ); // Q10 - > (Q_real-1) -#else /* OPT_STEREO_32KBPS_V1 */ - scale_sig32_r( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( sub( Q_real, 1 ), Q10 ) ); //(Q_real - 1) -#endif /* OPT_STEREO_32KBPS_V1 */ -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), sub( Q10, sub( Q_real, 1 ) ), -10, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, synth_fx /*dummy*/, NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS /*DELAY_CLDFB_NS*/ ), 0, st->cldfbSyn ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ - -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( synth_fx, output_frame, negate( sub( Q_real, 1 ) ) ); // Q0 - Scale_sig32( st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->p_filter_length, sub( Q10, sub( Q_real, 1 ) ) ); // Q10 - st->cldfbSyn->Q_cldfb_state = Q10; - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ + IF( st->p_bpf_noise_buf_32 ) { Copy_Scale_sig_16_32_DEPREC( bpf_error_signal_16fx, bpf_error_signal_fx, st->L_frame, -1 ); // Q_syn-1 diff --git a/lib_dec/acelp_core_switch_dec_fx.c b/lib_dec/acelp_core_switch_dec_fx.c index b12682385..109f360cb 100644 --- a/lib_dec/acelp_core_switch_dec_fx.c +++ b/lib_dec/acelp_core_switch_dec_fx.c @@ -832,25 +832,10 @@ ivas_error acelp_core_switch_dec_bfi_ivas_fx( } /*cldfbSynthesis_fx( st_fx->cldfbSyn, realBuffer, imagBuffer, &scaleFactor, synth_out, negate(st_fx->Q_syn), CLDFB_NO_COL_MAX_SWITCH_BFI, workBuffer );*/ -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( st_fx->cldfbSyn->cldfb_state_fx, st_fx->cldfbSyn->cldfb_state_length, 1 ); // Q_cldfb_state+1 - st_fx->cldfbSyn->Q_cldfb_state = add( st_fx->cldfbSyn->Q_cldfb_state, 1 ); - move16(); - Copy_Scale_sig_16_32_DEPREC( synth_out, synth32, L_FRAME48k, 5 ); /*11-5-1*/ - - cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, synth32, extract_l( Mpy_32_16_1( st_fx->output_Fs, 328 ) ), 0, st_fx->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ Word16 out_len = extract_l( Mpy_32_16_1( st_fx->output_Fs, 328 ) ); cldfbSynthesis_ivas_fx( realBuffer, imagBuffer, synth32, out_len, -1, 0, st_fx->cldfbSyn ); Copy_Scale_sig_32_16( synth32, synth_out, out_len, -4 ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ -#ifndef OPT_AVOID_STATE_BUF_RESCALE - Scale_sig32( st_fx->cldfbSyn->cldfb_state_fx, st_fx->cldfbSyn->cldfb_state_length, -1 ); // Q_cldfb_state-1 - st_fx->cldfbSyn->Q_cldfb_state = sub( st_fx->cldfbSyn->Q_cldfb_state, 1 ); - move16(); - Copy_Scale_sig_32_16( synth32, synth_out, L_FRAME48k, -5 ); // 11-5-1 -> 11 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ // Scale_sig( synth_out, L_FRAME48k, negate( st_fx->Q_syn ) ); diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c index ba7c73741..106cb0e60 100644 --- a/lib_dec/core_switching_dec_fx.c +++ b/lib_dec/core_switching_dec_fx.c @@ -2056,11 +2056,7 @@ static void core_switch_lb_upsamp_fx( } /* synthesis of the combined signal */ -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, output, i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbSyn->no_channels ), 0, 0, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, output, i_mult( CLDFB_OVRLP_MIN_SLOTS, st->cldfbSyn->no_channels ), 0, st->cldfbSyn ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ /*rescaling whole buffer to a common Q*/ no_col = st->cldfbSyn->no_col; @@ -2368,11 +2364,7 @@ ivas_error core_switching_pre_dec_ivas_fx( return error; } -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, fer_samples_fx, delay_comp, 0, 0, st->cldfbSyn ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBuffer_fx, imagBuffer_fx, fer_samples_fx, delay_comp, 0, st->cldfbSyn ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ cldfb_restore_memory_ivas_fx( st->cldfbSyn ); Copy_Scale_sig_32_16( syn_Overl_fx, st->hTcxDec->syn_Overl, 320, 15 ); Copy_Scale_sig_32_16( fer_samples_fx, st->hHQ_core->fer_samples_fx, 960, 9 ); diff --git a/lib_dec/dec_acelp_fx.c b/lib_dec/dec_acelp_fx.c index 51cbef624..e7f8c98ce 100644 --- a/lib_dec/dec_acelp_fx.c +++ b/lib_dec/dec_acelp_fx.c @@ -169,20 +169,9 @@ void D_ACELP_indexing_fx( pulses = pulsestrack[0]; move16(); -#ifndef FIX_1378_ACELP_OUT_OF_BOUNDS - /* safety check in case of bit errors */ - IF( GE_64( s, pulsestostates[16][pulses - 1] ) ) - { - set16_fx( code, 0, L_SUBFR ); - *BER_detect = 1; - move16(); - return; - } -#endif IF( pulses ) { -#ifdef FIX_1378_ACELP_OUT_OF_BOUNDS /* safety check in case of bit errors */ IF( GE_64( s, pulsestostates[16][pulses - 1] ) ) { @@ -191,7 +180,6 @@ void D_ACELP_indexing_fx( move16(); return; } -#endif D_ACELP_decode_arithtrack_fx( code, s, pulses, num_tracks, 16 ); } ELSE diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index adf838f42..501276dfc 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -4758,11 +4758,7 @@ void generate_masking_noise_ivas_fx( } ELSE { -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ) ); /*Q31 - *exp_out*/ -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( maskingNoise_fx, timeDomainBuffer, timeDomainBuffer, s_min( hFdCngCom->frameSize, length ), 0 ); /*Q31 - *exp_out*/ -#endif /* VEC_ARITH_OPT_v1 */ } return; diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 908d3b79b..efd9d0c67 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -54,7 +54,6 @@ * * *-------------------------------------------------------------------------*/ -#ifdef OPT_BIN_RENDERER_V2 static void ivas_binRenderer_filterModule_fx( Word32 out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals Q6 */ Word32 out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals Q6 */ @@ -184,117 +183,6 @@ static void ivas_binRenderer_filterModule_fx( return; } -#else /* OPT_BIN_RENDERER_V2 */ -static void ivas_binRenderer_filterModule_fx( - Word64 out_Conv_CLDFB_real[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : real part of Binaural signals Q29 */ - Word64 out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals Q29 */ - Word32 CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals Q_curr*/ - Word32 CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals Q_curr*/ - const Word16 numTimeSlots, /* i : number of time slots to process */ - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ - Word16 Q_curr ) -{ - Word16 bandIdx, k, chIdx, tapIdx; - Word32 *filterStatesLeftRealPtr_fx, *filterStatesLeftImagPtr_fx; - Word16 Q_filterStates; - const Word32 *filterTapsLeftRealPtr_fx, *filterTapsLeftImagPtr_fx, *filterTapsRightRealPtr_fx, *filterTapsRightImagPtr_fx; - Word16 shift_q; - Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStatesLeft; - move16(); - - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx][0] ); - filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx][0] ); - - filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 - filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 - filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 - filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 - - FOR( k = 0; k < numTimeSlots; k++ ) - { - Word64 outRealLeft_fx = 0, outRealRight_fx = 0, outImagLeft_fx = 0, outImagRight_fx = 0; - move64(); - move64(); - move64(); - move64(); - - FOR( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) - { - filterStatesLeftRealPtr_fx[tapIdx] = filterStatesLeftRealPtr_fx[tapIdx - 1]; - move32(); - filterStatesLeftImagPtr_fx[tapIdx] = filterStatesLeftImagPtr_fx[tapIdx - 1]; - move32(); - - - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, L_negate( filterStatesLeftImagPtr_fx[tapIdx] ), filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - - outRealRight_fx = W_mac_32_32( outRealRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outRealRight_fx = W_mac_32_32( outRealRight_fx, L_negate( filterStatesLeftImagPtr_fx[tapIdx] ), filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - - outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - } - - shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); - - IF( shift_q != 0 ) - { - outRealLeft_fx = W_shr( outRealLeft_fx, shift_q ); // Q_curr - outImagLeft_fx = W_shr( outImagLeft_fx, shift_q ); // Q_curr - outRealRight_fx = W_shr( outRealRight_fx, shift_q ); // Q_curr - outImagRight_fx = W_shr( outImagRight_fx, shift_q ); // Q_curr - hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; - move16(); - } - - filterStatesLeftRealPtr_fx[0] = CLDFB_real[chIdx][k][bandIdx]; - move32(); - filterStatesLeftImagPtr_fx[0] = CLDFB_imag[chIdx][k][bandIdx]; - move32(); - - - /* Left Real and Imag */ - // Q29 + Q_curr - - Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); - Word32 temp2 = L_shr( filterStatesLeftImagPtr_fx[0], 1 ); - - - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, temp1, filterTapsLeftRealPtr_fx[0] ); - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, L_negate( temp2 ), filterTapsLeftImagPtr_fx[0] ); - out_Conv_CLDFB_real[0][k][bandIdx] = W_add( out_Conv_CLDFB_real[0][k][bandIdx], outRealLeft_fx ); // Q29 - move64(); - - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp1, filterTapsLeftImagPtr_fx[0] ); - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp2, filterTapsLeftRealPtr_fx[0] ); - out_Conv_CLDFB_imag[0][k][bandIdx] = W_add( out_Conv_CLDFB_imag[0][k][bandIdx], outImagLeft_fx ); // Q29 - move64(); - - /* Right Real and Imag */ - outRealRight_fx = W_mac_32_32( outRealRight_fx, temp1, filterTapsRightRealPtr_fx[0] ); - outRealRight_fx = W_mac_32_32( outRealRight_fx, L_negate( temp2 ), filterTapsRightImagPtr_fx[0] ); - out_Conv_CLDFB_real[1][k][bandIdx] = W_add( out_Conv_CLDFB_real[1][k][bandIdx], outRealRight_fx ); // Q29 - move64(); - - outImagRight_fx = W_mac_32_32( outImagRight_fx, temp1, filterTapsRightImagPtr_fx[0] ); - outImagRight_fx = W_mac_32_32( outImagRight_fx, temp2, filterTapsRightRealPtr_fx[0] ); - out_Conv_CLDFB_imag[1][k][bandIdx] = W_add( out_Conv_CLDFB_imag[1][k][bandIdx], outImagRight_fx ); // Q29 - move64(); - } - } - } - - return; -} -#endif /* OPT_BIN_RENDERER_V2 */ /*------------------------------------------------------------------------- * ivas_binRenderer_convModuleOpen() @@ -1613,11 +1501,6 @@ void ivas_binRenderer_fx( ) { Word16 chIdx, i, j, k; -#ifndef OPT_BIN_RENDERER_V2 - // to be checked: feasibility with 32 bit buffers - Word64 Cldfb_RealBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - Word64 Cldfb_ImagBuffer_Binaural_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#endif /* OPT_BIN_RENDERER_V2 */ push_wmops( "fastconv_binaural_rendering" ); /* Compute Convolution */ @@ -1629,10 +1512,6 @@ void ivas_binRenderer_fx( { set32_fx( Cldfb_RealBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( Cldfb_ImagBuffer_Binaural_fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); -#ifndef OPT_BIN_RENDERER_V2 - set64_fx( Cldfb_RealBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); - set64_fx( Cldfb_ImagBuffer_Binaural_64fx[chIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); -#endif /* OPT_BIN_RENDERER_V2 */ } } #endif /* OPT_SBA_DEC_V2_BE */ @@ -1673,25 +1552,7 @@ void ivas_binRenderer_fx( ivas_sba2mc_cldfb_fixed( *( hBinRenderer->hInputSetup ), RealBuffer_fx, ImagBuffer_fx, hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); } -#ifdef OPT_BIN_RENDERER_V2 ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, *Q_in ); -#else /* OPT_BIN_RENDERER_V2 */ - ivas_binRenderer_filterModule_fx( Cldfb_RealBuffer_Binaural_64fx, Cldfb_ImagBuffer_Binaural_64fx, RealBuffer_fx, ImagBuffer_fx, numTimeSlots, hBinRenderer, *Q_in ); - - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - FOR( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - FOR( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) - { - Cldfb_RealBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_RealBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 - move32(); - Cldfb_ImagBuffer_Binaural_fx[i][j][k] = W_extract_l( W_shr( Cldfb_ImagBuffer_Binaural_64fx[i][j][k], 29 ) ); //(*Q_in + 29) - 29 - move32(); - } - } - } -#endif /* OPT_BIN_RENDERER_V2 */ /* Obtain the binaural dmx and compute the reverb */ IF( hBinRenderer->hReverb != NULL ) { diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index a778424dd..48fce8b95 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2314,16 +2314,6 @@ void ivas_dirac_dec_render_sf_fx( } } -#ifndef OPT_BIN_RENDERER_V2 - FOR( i = 0; i < BINAURAL_CHANNELS; i++ ) - { - FOR( Word16 j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) - { - set32_fx( Cldfb_RealBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - set32_fx( Cldfb_ImagBuffer_Binaural_fx[i][j], 0, CLDFB_NO_CHANNELS_MAX ); - } - } -#endif /* OPT_BIN_RENDERER_V2 */ hDirAC = st_ivas->hDirAC; hDirACRend = st_ivas->hDirACRend; @@ -3171,11 +3161,7 @@ void ivas_dirac_dec_render_sf_fx( v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands, 0 ); /* Q31 */ -#endif /* VEC_ARITH_OPT_v1 */ p_onset_filter_fx = onset_filter_subframe_fx; } ELSE @@ -3923,9 +3909,6 @@ void ivas_dirac_dec_render_sf_fx( { Word16 j, k, j2, l; Word16 num_objects, nchan_out_woLFE, lfe_index; -#ifndef FIX_1379_MASA_ANGLE_ROUND - Word16 az1, el1; -#endif Word16 n_slots_to_render; Word16 n_samples_to_render; Word16 interp_offset; @@ -3959,20 +3942,11 @@ void ivas_dirac_dec_render_sf_fx( Word16 el_q0 = extract_l( L_shr( st_ivas->hIsmMetaData[i]->elevation_fx, Q22 ) ); Word32 az1_32, el1_32; rotateAziEle_fixed( az_q0, el_q0, &az1_32, &el1_32, st_ivas->hCombinedOrientationData->Rmat_fx[0], st_ivas->hIntSetup.is_planar_setup ); -#ifndef FIX_1379_MASA_ANGLE_ROUND - az1 = extract_h( az1_32 ); - el1 = extract_h( el1_32 ); -#endif IF( st_ivas->hEFAPdata != NULL ) { -#ifdef FIX_1379_MASA_ANGLE_ROUND const Word32 azi_fx = L_shl( az1_32, Q22 - Q16 ); // Q16 -> Q22 const Word32 ele_fx = L_shl( el1_32, Q22 - Q16 ); // Q16 -> Q22 -#else - const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 - const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 -#endif efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azi_fx, ele_fx, EFAP_MODE_EFAP ); } } @@ -4012,27 +3986,13 @@ void ivas_dirac_dec_render_sf_fx( { Word32 g_fx; w2_fx = sub( MAX16B, *w1_fx ); -#ifdef OPT_BIN_RENDERER_V2 g_fx = Madd_32_16( Mpy_32_16_1( gain_fx, *w1_fx ), prev_gain_fx, w2_fx ); // Q15 -#else /* OPT_BIN_RENDERER_V2 */ - g_fx = L_add( Mpy_32_16_1( gain_fx, *w1_fx ), Mpy_32_16_1( prev_gain_fx, w2_fx ) ); // Q15 -#endif /* OPT_BIN_RENDERER_V2 */ FOR( l = 0; l < hSpatParamRendCom->num_freq_bands; l++ ) { -#ifdef OPT_BIN_RENDERER_V2 Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = Madd_32_32( Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], g_fx, *tc_re_fx ); move32(); tc_re_fx++; Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = Madd_32_32( Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], g_fx, *tc_im_fx ); -#else /* OPT_BIN_RENDERER_V2 */ - Word32 tmp; - tmp = Mpy_32_32( g_fx, *tc_re_fx ); - Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_RealBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); - move32(); - tc_re_fx++; - tmp = Mpy_32_32( g_fx, *tc_im_fx ); - Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l] = L_add( Cldfb_ImagBuffer_fx[j2][0][k * hSpatParamRendCom->num_freq_bands + l], tmp ); -#endif /* OPT_BIN_RENDERER_V2 */ move32(); tc_re_fx++; } @@ -4062,10 +4022,6 @@ void ivas_dirac_dec_render_sf_fx( Cldfb_RealBuffer_Binaural_fx, Cldfb_ImagBuffer_Binaural_fx, Cldfb_RealBuffer_fx, Cldfb_ImagBuffer_fx, &input_q ); -#ifndef OPT_BIN_RENDERER_V2 - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[0][0], i_mult( BINAURAL_CHANNELS, i_mult( MAX_PARAM_SPATIAL_SUBFRAMES, CLDFB_NO_CHANNELS_MAX ) ), sub( Q6, input_q ) ); // Q6 -#endif /* OPT_BIN_RENDERER_V2 */ /* Inverse CLDFB*/ FOR( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) @@ -4086,11 +4042,7 @@ void ivas_dirac_dec_render_sf_fx( st_ivas->cldfbSynDec[ch]->Q_cldfb_state = ( Q6 - 1 ); move16(); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, synth_fx, i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ Word16 no_col = st_ivas->cldfbSynDec[ch]->no_col; move16(); @@ -4193,11 +4145,7 @@ void ivas_dirac_dec_render_sf_fx( ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i]; move32(); } -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, 0, 0, st_ivas->cldfbSynDec[idx_in] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_buf_fx[ch][subframe_start_sample] ), num_samples_subframe, 0, st_ivas->cldfbSynDec[idx_in] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE*/ IF( !st_ivas->hLsSetupCustom->separate_ch_found ) { @@ -4237,11 +4185,7 @@ void ivas_dirac_dec_render_sf_fx( scale_sig32( st_ivas->cldfbSynDec[cldfbSynIdx]->cldfb_state_fx, st_ivas->cldfbSynDec[cldfbSynIdx]->p_filter_length, sub( ( Q6 - 1 ), st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state ) ); // Q6-1 st_ivas->cldfbSynDec[cldfbSynIdx]->Q_cldfb_state = ( Q6 - 1 ); move16(); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, 0, st_ivas->cldfbSynDec[cldfbSynIdx] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, st_ivas->cldfbSynDec[cldfbSynIdx] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE*/ // Calculating length of output Word16 no_col = st_ivas->cldfbSynDec[cldfbSynIdx]->no_col; @@ -4309,11 +4253,7 @@ void ivas_dirac_dec_render_sf_fx( scale_sig32( st_ivas->cldfbSynDec[idx_in]->cldfb_state_fx, st_ivas->cldfbSynDec[idx_in]->p_filter_length, sub( ( Q6 - 1 ), st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state ) ); st_ivas->cldfbSynDec[idx_in]->Q_cldfb_state = ( Q6 - 1 ); move16(); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, 0, st_ivas->cldfbSynDec[idx_in] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, p_out, samplesToProcess, 0, st_ivas->cldfbSynDec[idx_in] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ // Scaling output from Q6-1 to Q11 Scale_sig32( p_out, out_len, ( Q11 - ( Q6 - 1 ) ) ); diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index 45c1a38a9..0d8e029d1 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -517,14 +517,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( Word16 mixing_matrix_buffer_e; Word32 input_f_real_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 input_f_imag_fx[PARAM_MC_MAX_TRANSPORT_CHANS]; -#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE - -#else - Word32 output_f_real_fx[MAX_CICP_CHANNELS]; - Word32 output_f_imag_fx[MAX_CICP_CHANNELS]; - Word16 output_f_real_e; - Word16 output_f_imag_e; -#endif + Word32 diff_f_real_fx[MAX_CICP_CHANNELS]; Word32 diff_f_imag_fx[MAX_CICP_CHANNELS]; @@ -532,12 +525,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( set_zero_fx( input_f_real_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); set_zero_fx( input_f_imag_fx, PARAM_MC_MAX_TRANSPORT_CHANS ); -#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE -#else - set_zero_fx( output_f_real_fx, MAX_CICP_CHANNELS ); - set_zero_fx( output_f_imag_fx, MAX_CICP_CHANNELS ); -#endif set_zero_fx( diff_f_real_fx, MAX_CICP_CHANNELS ); set_zero_fx( diff_f_imag_fx, MAX_CICP_CHANNELS ); @@ -601,7 +589,6 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( } /* apply residual mixing */ -#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE { Word16 shifter; #ifdef OPT_SBA_DEC_V2_BE @@ -638,23 +625,6 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( } -#else - - matrix_product_mant_exp_fx( mixing_matrix_res_smooth_fx, mixing_matrix_res_smooth_e, nY, nY, 0, diff_f_real_fx, 25, nY, 1, 0, output_f_real_fx, &output_f_real_e ); - scale_sig32( output_f_real_fx, nY, sub( Q6, sub( Q31, output_f_real_e ) ) ); // Q6 - - - matrix_product_mant_exp_fx( mixing_matrix_res_smooth_fx, mixing_matrix_res_smooth_e, nY, nY, 0, diff_f_imag_fx, 25, nY, 1, 0, output_f_imag_fx, &output_f_imag_e ); - scale_sig32( output_f_imag_fx, nY, sub( Q6, sub( Q31, output_f_imag_e ) ) ); // Q6 - - FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) - { - Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = output_f_real_fx[ch_idx]; // Q6 - move32(); - Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = output_f_imag_fx[ch_idx]; // Q6 - move32(); - } -#endif } ELSE { @@ -678,7 +648,6 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( } /* apply mixing matrix */ -#ifdef MERGE_REQUEST_1564_SPEEDUP_ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx_NONBE { Word16 shifter; shifter = 31 - mixing_matrix_smooth_e; @@ -707,24 +676,6 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( move32(); } } -#else - - matrix_product_mant_exp_fx( mixing_matrix_smooth_fx, mixing_matrix_smooth_e, nY, nX, 0, input_f_real_fx, 25, nX, 1, 0, output_f_real_fx, &output_f_real_e ); - scale_sig32( output_f_real_fx, MAX_CICP_CHANNELS, sub( 6, sub( 31, output_f_real_e ) ) ); // Q6 - - - matrix_product_mant_exp_fx( mixing_matrix_smooth_fx, mixing_matrix_smooth_e, nY, nX, 0, input_f_imag_fx, 25, nX, 1, 0, output_f_imag_fx, &output_f_imag_e ); - scale_sig32( output_f_imag_fx, MAX_CICP_CHANNELS, sub( 6, sub( 31, output_f_imag_e ) ) ); // Q6 - - /* collect output */ - FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) - { - Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_RealBuffer_fx[ch_idx][slot_idx_sfr][band], output_f_real_fx[ch_idx] ); - move32(); - Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band] = L_add( Cldfb_ImagBuffer_fx[ch_idx][slot_idx_sfr][band], output_f_imag_fx[ch_idx] ); - move32(); - } -#endif } } diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index 30a32c92c..f3e37c5c0 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -1533,11 +1533,7 @@ static void ivas_ism_param_dec_render_sf_fx( Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( sub( Q_real, 1 ), Q11 ) ); // Q_real-1 st_ivas->cldfbSynDec[ch]->Q_cldfb_state = sub( Q_real, 1 ); move16(); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_f_fx[ch], i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, output_f_fx[ch], i_mult( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ Scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->p_filter_length, sub( Q11, sub( Q_real, 1 ) ) ); // Q11 st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; move16(); diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index a36982777..fefae52f9 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2137,11 +2137,7 @@ ivas_error ivas_jbm_dec_render_fx( /* add already rendered SBA part */ FOR( n = 0; n < nchan_out; n++ ) { -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( p_output_fx[n], p_tc_fx[n + st_ivas->nchan_ism], p_output_fx[n], *nSamplesRendered ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( p_output_fx[n], p_tc_fx[n + st_ivas->nchan_ism], p_output_fx[n], *nSamplesRendered, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ } } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OSBA_AMBI ) || EQ_32( st_ivas->renderer_type, RENDERER_OSBA_LS ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index 2ba8c9c9e..71c1b39fc 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -2084,13 +2084,8 @@ void ivas_param_mc_dec_render_fx( { IF( hLsSetup.index_lfe[idx_lfe] != ch ) { -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( Cldfb_RealBuffer_fx[ch][slot_idx], Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer_fx[ch][slot_idx], 1 ); v_add_fixed_no_hdrm( Cldfb_ImagBuffer_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer_fx[ch][slot_idx], 1 ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( Cldfb_RealBuffer_fx[ch][slot_idx], Cldfb_RealBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer_fx[ch][slot_idx], 1, 0 ); - v_add_fixed( Cldfb_ImagBuffer_fx[ch][slot_idx], Cldfb_ImagBuffer_fx[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer_fx[ch][slot_idx], 1, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ } } } @@ -2151,16 +2146,6 @@ void ivas_param_mc_dec_render_fx( } } -#ifndef OPT_BIN_RENDERER_V2 - FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) - { - FOR( Word16 idx2 = 0; idx2 < hParamMC->subframe_nbslots[subframe_idx]; idx2++ ) - { - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( Q6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( Q6, input_q ) ); // Q6 - } - } -#endif /* OPT_BIN_RENDERER_V2 */ /* update combined orientation access index */ ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); } @@ -2196,13 +2181,8 @@ void ivas_param_mc_dec_render_fx( Word16 len = add( imult1616( slot_idx_start_cldfb_synth, hParamMC->num_freq_bands ), imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ) ); scale_sig32( output_f_fx[ch], len, 5 - 11 ); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ), 0, 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), - imult1616( hParamMC->num_freq_bands, hParamMC->subframe_nbslots[subframe_idx] ), 0, st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ scale_sig32( output_f_fx[ch], len, 11 - 5 ); // Q11 } diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index 7a1ef1126..5840cb08f 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -847,16 +847,6 @@ static void ivas_mc_paramupmix_dec_sf( Cldfb_RealBuffer_subfr_fx, Cldfb_ImagBuffer_subfr_fx, &input_q ); -#ifndef OPT_BIN_RENDERER_V2 - FOR( Word16 idx1 = 0; idx1 < BINAURAL_CHANNELS; idx1++ ) - { - FOR( Word16 idx2 = 0; idx2 < MAX_PARAM_SPATIAL_SUBFRAMES; idx2++ ) - { - Scale_sig32( Cldfb_RealBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( 6, input_q ) ); // Q6 - Scale_sig32( Cldfb_ImagBuffer_Binaural_fx[idx1][idx2], CLDFB_NO_CHANNELS_MAX, sub( 6, input_q ) ); // Q6 - } - } -#endif /* OPT_BIN_RENDERER_V2 */ /* Implement CLDFB synthesis */ FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -868,28 +858,10 @@ static void ivas_mc_paramupmix_dec_sf( RealBuffer_fx[slot_idx] = Cldfb_RealBuffer_Binaural_fx[ch][slot_idx]; // Q6 ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch][slot_idx]; // Q6 } -#ifndef OPT_AVOID_STATE_BUF_RESCALE - scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q5 - Q11 ); // Q11 -> Q5 - st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q5; - move16(); - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 0, st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q5 -#else /* OPT_AVOID_STATE_BUF_RESCALE */ cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 6, 0, st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q11 -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ -#ifndef OPT_AVOID_STATE_BUF_RESCALE - scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, Q11 - Q5 ); // Q5 -> Q11 - st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; - move16(); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ } -#ifndef OPT_AVOID_STATE_BUF_RESCALE - FOR( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - Scale_sig32( output_fx[ch], imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 6 ); // Q5 -> Q11 - } -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ } ELSE { @@ -915,13 +887,8 @@ static void ivas_mc_paramupmix_dec_sf( ptr_re_fx[0] = Cldfb_RealBuffer_fx[ch][slot_idx]; // Q6 ptr_im_fx[0] = Cldfb_ImagBuffer_fx[ch][slot_idx]; // Q6 -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( ptr_re_fx, ptr_im_fx, &( pPcm_temp_fx[ch][L_mult0( hMCParamUpmix->num_freq_bands, slot_idx )] ), hMCParamUpmix->num_freq_bands, 0, 0, st_ivas->cldfbSynDec[ch] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( ptr_re_fx, ptr_im_fx, &( pPcm_temp_fx[ch][L_mult0( hMCParamUpmix->num_freq_bands, slot_idx )] ), - hMCParamUpmix->num_freq_bands, 0, st_ivas->cldfbSynDec[ch] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ } scale_sig32( st_ivas->cldfbSynDec[ch]->cldfb_state_fx, st_ivas->cldfbSynDec[ch]->cldfb_size, sub( Q11, st_ivas->cldfbSynDec[ch]->Q_cldfb_state ) ); // Q6 -> Q11 st_ivas->cldfbSynDec[ch]->Q_cldfb_state = Q11; diff --git a/lib_dec/ivas_sba_rendering_internal_fx.c b/lib_dec/ivas_sba_rendering_internal_fx.c index ba8c529d7..374efb593 100644 --- a/lib_dec/ivas_sba_rendering_internal_fx.c +++ b/lib_dec/ivas_sba_rendering_internal_fx.c @@ -77,11 +77,7 @@ void ivas_sba2mc_cldfb_fixed( FOR( m = 0; m < nb_channels_in; m++ ) { -#ifdef OPT_BIN_RENDERER_V2 g_fx = L_shl_sat( hoa_dec_mtx[( ( SBA_NHARM_HOA3 * n ) + m )], Q2 ); -#else /* OPT_BIN_RENDERER_V2 */ - g_fx = hoa_dec_mtx[( ( SBA_NHARM_HOA3 * n ) + m )]; // Q29 -#endif /* OPT_BIN_RENDERER_V2 */ p_realOut_fx = realOut_fx[n]; p_imagOut_fx = imagOut_fx[n]; @@ -91,15 +87,9 @@ void ivas_sba2mc_cldfb_fixed( p_imag_fx = ImagBuffer[m][iBlock]; /*Q_imag*/ FOR( iBand = 0; iBand < nb_bands; iBand++ ) { -#ifdef OPT_BIN_RENDERER_V2 *p_realOut_fx = Madd_32_32( *p_realOut_fx, g_fx, *( p_real_fx++ ) ); // Q_real move32(); *p_imagOut_fx = Madd_32_32( *p_imagOut_fx, g_fx, *( p_imag_fx++ ) ); // Q_imag -#else /* OPT_BIN_RENDERER_V2 */ - *p_realOut_fx = L_add( *p_realOut_fx, Mpy_32_32( L_shl_sat( g_fx, Q2 ), *( p_real_fx++ ) ) ); // Q_real - move32(); - *p_imagOut_fx = L_add( *p_imagOut_fx, Mpy_32_32( L_shl_sat( g_fx, Q2 ), *( p_imag_fx++ ) ) ); // Q_imag -#endif /* OPT_BIN_RENDERER_V2 */ move32(); p_realOut_fx++; p_imagOut_fx++; @@ -177,11 +167,7 @@ void ivas_mc2sba_fx( /* Add LFE to omni W with gain*/ FOR( k = 0; k < output_frame; k++ ) { -#ifdef OPT_BIN_RENDERER_V2 buffer_tmp_fx[0][k] = Madd_32_16( buffer_tmp_fx[0][k], L_shl( in_buffer_td_fx[i][k], 1 ), gain_lfe_fx ); /*Q+14-15+1==Q*/ -#else /* OPT_BIN_RENDERER_V2 */ - buffer_tmp_fx[0][k] = L_add( buffer_tmp_fx[0][k], L_shl( Mult_32_16( in_buffer_td_fx[i][k], gain_lfe_fx ), 1 ) ); /*Q+14-15+1==Q*/ -#endif /* OPT_BIN_RENDERER_V2 */ move32(); } } @@ -210,11 +196,7 @@ void ivas_mc2sba_fx( { FOR( k = 0; k < output_frame; k++ ) { -#ifdef OPT_BIN_RENDERER_V2 buffer_tmp_fx[j][k] = Madd_32_32( buffer_tmp_fx[j][k], L_shl_sat( in_buffer_td_fx[i][k], 2 ), gains_fx[j] ); /*Q+29-31+2==Q*/ -#else /* OPT_BIN_RENDERER_V2 */ - buffer_tmp_fx[j][k] = L_add( buffer_tmp_fx[j][k], L_shl( Mult_32_32( in_buffer_td_fx[i][k], gains_fx[j] ), 2 ) ); /*Q+29-31+2==Q*/ -#endif /* OPT_BIN_RENDERER_V2 */ move32(); } } diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index fa5f6779f..abf953f37 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -787,11 +787,7 @@ void ivas_spar_get_cldfb_gains_fx( cldfbAnalysis_ts_fx_fixed_q( ts_inout_fx, ts_re_fx, ts_im_fx, num_cldfb_bands, cldfbAnaDec0, &q_cldfb ); cldfb_reset_memory_fx( cldfbSynDec0 ); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( pp_ts_re_fx, pp_ts_im_fx, ts_inout_fx, num_cldfb_bands, 0, 0, cldfbSynDec0 ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( pp_ts_re_fx, pp_ts_im_fx, ts_inout_fx, num_cldfb_bands, 0, cldfbSynDec0 ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ FOR( sample = 0; sample < stride; sample++ ) { T_fx[( ( slot * stride ) + sample )][slot] = ts_inout_fx[sample]; /*Q21*/ @@ -2104,11 +2100,7 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, 0, st_ivas->cldfbSynDec[idx_in] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[idx_in][ts], &cldfb_in_ts_im_fx[idx_in][ts], &output_fx[ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, st_ivas->cldfbSynDec[idx_in] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ } } @@ -2123,11 +2115,7 @@ void ivas_spar_dec_upmixer_sf_fx( { FOR( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, 0, st_ivas->cldfbSynDec[out_ch] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( &cldfb_in_ts_re_fx[out_ch][ts], &cldfb_in_ts_im_fx[out_ch][ts], &output_fx[out_ch][i_mult( ts, num_cldfb_bands )], num_cldfb_bands, 6, st_ivas->cldfbSynDec[out_ch] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ } } } diff --git a/lib_dec/ivas_stereo_cng_dec_fx.c b/lib_dec/ivas_stereo_cng_dec_fx.c index 8ec147ff7..d48e035a6 100644 --- a/lib_dec/ivas_stereo_cng_dec_fx.c +++ b/lib_dec/ivas_stereo_cng_dec_fx.c @@ -1446,11 +1446,7 @@ void stereo_cna_update_params_fx( { IF( EQ_16( hCPE->nchan_out, 1 ) ) { -#ifdef OPT_STEREO_32KBPS_V1 c_LR_fx = MAX_32; -#else /* OPT_STEREO_32KBPS_V1 */ - c_LR_fx = MAX_WORD16; -#endif /* OPT_STEREO_32KBPS_V1 */ move32(); c_ILD_fx = 0; move32(); @@ -1513,11 +1509,7 @@ void stereo_cna_update_params_fx( dotLR_fx_q = add( dotLR_fx_q, sub( sub( 31, temp_res_q ), 31 ) ); dotLR_fx = W_deposit32_l( L_shl_sat( W_extract_l( dotLR_fx ), sub( 31, dotLR_fx_q ) ) ); /* Q31 */ /* estimate L/R correlation factor and ILD in time domain */ -#ifdef OPT_STEREO_32KBPS_V1 c_LR_fx = W_extract_l( dotLR_fx ); /* Q31 */ -#else /* OPT_STEREO_32KBPS_V1 */ - c_LR_fx = extract_h( W_extract_l( dotLR_fx ) ); /* Q15 */ -#endif /* OPT_STEREO_32KBPS_V1 */ temp_res_q = 0; move16(); @@ -1556,24 +1548,15 @@ void stereo_cna_update_params_fx( /* update of long-term ILD and LR correlation factors for stereo CNA */ IF( !hFdCngDec->first_cna_noise_updated ) { -#ifdef OPT_STEREO_32KBPS_V1 hFdCngDec->cna_LR_LT_fx = extract_h( c_LR_fx ); -#else /* OPT_STEREO_32KBPS_V1 */ - hFdCngDec->cna_LR_LT_fx = extract_l( c_LR_fx ); -#endif /* OPT_STEREO_32KBPS_V1 */ move16(); hFdCngDec->cna_ILD_LT_fx = extract_l( c_ILD_fx ); move16(); } ELSE { -#ifdef OPT_STEREO_32KBPS_V1 hFdCngDec->cna_LR_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_LR_CORR_LT_FILT_FX, hFdCngDec->cna_LR_LT_fx ), Mpy_32_32( ONE_IN_Q31 - STEREO_CNA_LR_CORR_LT_FILT_FX, c_LR_fx ) ) ); /* Q31 */ -#else /* OPT_STEREO_32KBPS_V1 */ - hFdCngDec->cna_LR_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_LR_CORR_LT_FILT_FX, hFdCngDec->cna_LR_LT_fx ), - Mpy_32_16_1( L_sub( ONE_IN_Q31, STEREO_CNA_LR_CORR_LT_FILT_FX ), extract_l( c_LR_fx ) ) ) ); /* Q31 */ -#endif /* OPT_STEREO_32KBPS_V1 */ move16(); hFdCngDec->cna_ILD_LT_fx = extract_h( L_add_sat( Mpy_32_16_1( STEREO_CNA_ILD_LT_FILT_FX, hFdCngDec->cna_ILD_LT_fx ), diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 11f266d2e..4aebd5145 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -1881,10 +1881,6 @@ void stereo_dft_dec_fx( HANDLE_FD_CNG_COM hFdCngCom = hFdCngDec->hFdCngCom; Word16 *cna_seed = &( hFdCngCom->seed ); Word32 DFT_W, DFT_Y; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 q_samp_ratio = Q15; - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ Word16 len; output_frame = (Word16) Mpy_32_32( L_add( st0->output_Fs, FRAMES_PER_SEC_BY_2 ), ONE_BY_FRAMES_PER_SEC_Q31 ); /* Q0 */ @@ -1893,12 +1889,7 @@ void stereo_dft_dec_fx( * Initialization *-----------------------------------------------------------------*/ -#ifdef OPT_STEREO_32KBPS_V1 samp_ratio = divide3232( st0->sr_core, st0->output_Fs ); // Q15 -#else /* OPT_STEREO_32KBPS_V1 */ - samp_ratio = (Word16) BASOP_Util_Divide3232_Scale( st0->sr_core, st0->output_Fs, &q_samp_ratio ); - samp_ratio = shr( samp_ratio, sub( Q15 - Q12, q_samp_ratio ) ); -#endif /* OPT_STEREO_32KBPS_V1 */ stop = shr( STEREO_DFT32MS_N_32k, 1 ); @@ -2473,17 +2464,10 @@ void stereo_dft_dec_fx( /*Nyquist Freq.*/ IF( EQ_16( hStereoDft->band_limits[b], shr( hStereoDft->NFFT, 1 ) ) ) { -#ifdef OPT_STEREO_32KBPS_V1 DFT_L[1] = Madd_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */ move32(); DFT_R[1] = Msub_32_16( pDFT_DMX[1], pDFT_DMX[1], g ); /* qDFT */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - DFT_L[1] = L_add( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */ - move32(); - DFT_R[1] = L_sub( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); /* qDFT */ move32(); DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); /* qDFT */ @@ -2616,34 +2600,20 @@ void stereo_dft_dec_fx( q_cna_level = sub( Q31, add( q_cna_level, Q16 ) ); /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */ -#ifdef OPT_STEREO_32KBPS_V1 Word16 shift = sub( q_cna_level, hStereoDft->q_dft ); -#endif /* OPT_STEREO_32KBPS_V1 */ N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ -#ifdef OPT_STEREO_32KBPS_V1 l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ -#else /* OPT_STEREO_32KBPS_V1 */ - l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ -#endif /* OPT_STEREO_32KBPS_V1 */ DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp ); /* q_dft */ move32(); -#ifdef OPT_STEREO_32KBPS_V1 l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ DFT_R[2 * i] = L_add_sat( DFT_R[2 * i], l_tmp ); /* q_dft */ -#else /* OPT_STEREO_32KBPS_V1 */ - l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ - DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp ); /* q_dft */ -#endif /* OPT_STEREO_32KBPS_V1 */ move32(); N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ -#ifdef OPT_STEREO_32KBPS_V1 l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ @@ -2652,16 +2622,6 @@ void stereo_dft_dec_fx( l_tmp = L_shr( l_tmp, shift ); /* q_dft */ DFT_R[2 * i + 1] = L_add_sat( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ - DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ - move32(); - l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ - DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } } @@ -2749,12 +2709,7 @@ static void stereo_dft_compute_td_stefi_params_fx( return; } -#ifdef OPT_STEREO_32KBPS_V1 bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) ); -#else /* OPT_STEREO_32KBPS_V1 */ - bin0 = extract_l( L_shr_r( Mpy_32_16_1( (Word32) hStereoDft->NFFT, samp_ratio ), 1 ) ); /* Q0 */ - bin0 = shl( bin0, Q3 ); -#endif /* OPT_STEREO_32KBPS_V1 */ bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */ b = hStereoDft->nbands; /* Q0 */ move16(); @@ -2919,11 +2874,7 @@ static void stereo_dft_dequantize_ipd_fx( *-------------------------------------------------------------------------*/ void stereo_dft_generate_res_pred_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ -#ifdef OPT_STEREO_32KBPS_V1 const Word16 samp_ratio, /* i : sampling ratio Q15*/ -#else /* OPT_STEREO_32KBPS_V1 */ - const Word16 samp_ratio, /* i : sampling ratio Q13*/ -#endif /* OPT_STEREO_32KBPS_V1 */ Word32 *pDFT_DMX, /* i : downmix signal qDFT*/ Word32 *DFT_PRED_RES, /* o : residual prediction signal qDFT*/ Word32 *pPredGain, /* i : residual prediction gains Q31*/ @@ -2941,9 +2892,6 @@ void stereo_dft_generate_res_pred_fx( /* variables for enhanced stereo filling */ Word16 norm_fac, q_norm_fac; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 lim_norm_fac; -#endif /* OPT_STEREO_32KBPS_V1 */ Word16 q_sqrt; Word16 alpha; // gain_limit; @@ -2957,12 +2905,7 @@ void stereo_dft_generate_res_pred_fx( Word32 pred_gain_avg; Word32 g2; Word16 nbands_respred; -#ifdef OPT_STEREO_32KBPS_V1 Word16 q_new, diff; -#else /* OPT_STEREO_32KBPS_V1 */ - q_norm_fac = 0; - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ Word16 len; push_wmops( "gen_respred" ); @@ -2985,12 +2928,7 @@ void stereo_dft_generate_res_pred_fx( /* In ACELP mode the downmix signal is not available in bandwidth extension area. * * Therefore, the downmix energy in the corresponding subbands is estimated. */ -#ifdef OPT_STEREO_32KBPS_V1 bin0 = round_fx( L_mult0( hStereoDft->NFFT, samp_ratio ) ); -#else /* OPT_STEREO_32KBPS_V1 */ - bin0 = (Word16) ( L_shr( L_add( L_mult0( hStereoDft->NFFT, samp_ratio ), ONE_IN_Q12 ), Q12 + 1 ) ); /* Q0 */ - move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */ b = hStereoDft->nbands; move16(); @@ -3035,22 +2973,12 @@ void stereo_dft_generate_res_pred_fx( len = s_min( hStereoDft->band_limits[b + 1], bin0 ); FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 dmx_nrg_64bit = W_mac_32_32( W_mac_32_32( dmx_nrg_64bit, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */ rev_nrg_64bit = W_mac_32_32( W_mac_32_32( rev_nrg_64bit, ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ), ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ); /* 2 * q_dft + 1 */ -#else /* OPT_STEREO_32KBPS_V1 */ - dmx_nrg_64bit = W_add( dmx_nrg_64bit, - W_add( W_mult0_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), - W_mult0_32_32( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */ - rev_nrg_64bit = W_add( rev_nrg_64bit, - W_add( W_mult0_32_32( ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ), - W_mult0_32_32( ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */ -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifdef OPT_STEREO_32KBPS_V1 q_new = add( shl( hStereoDft->q_dft, 1 ), 1 ); q_shift = W_norm( dmx_nrg_64bit ); dmx_nrg = W_shl_sat_l( dmx_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32) @@ -3059,54 +2987,26 @@ void stereo_dft_generate_res_pred_fx( rev_nrg = W_shl_sat_l( rev_nrg_64bit, sub( q_shift, 32 ) ); // 2 * hStereoDft->q_dft + 1 - (q_shift - 32) rev_nrg_q = add( q_new, sub( q_shift, 32 ) ); move16(); -#else /* OPT_STEREO_32KBPS_V1 */ - q_shift = W_norm( dmx_nrg_64bit ); - dmx_nrg = W_extract_l( W_shl( dmx_nrg_64bit, sub( q_shift, 32 ) ) ); // 2 * hStereoDft->q_dft + (q_shift - 32) - dmx_nrg_q = add( imult1616( 2, hStereoDft->q_dft ), sub( q_shift, 32 ) ); - q_shift = W_norm( rev_nrg_64bit ); - rev_nrg = W_extract_l( W_shl( rev_nrg_64bit, sub( q_shift, 32 ) ) ); // 2 * hStereoDft->q_dft + (q_shift - 32) - rev_nrg_q = add( imult1616( 2, hStereoDft->q_dft ), sub( q_shift, 32 ) ); -#endif /* OPT_STEREO_32KBPS_V1 */ /* Reach a common Q for dmx_nrg and rev_nrg */ q_com = s_min( dmx_nrg_q, rev_nrg_q ); dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); /* q_com */ rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); /* q_com */ -#ifdef OPT_STEREO_32KBPS_V1 diff = sub( hStereoDft->q_smoothed_nrg, q_com ); IF( diff < 0 ) -#else /* OPT_STEREO_32KBPS_V1 */ - IF( LT_16( hStereoDft->q_smoothed_nrg, q_com ) ) -#endif /* OPT_STEREO_32KBPS_V1 */ { -#ifdef OPT_STEREO_32KBPS_V1 rev_nrg = L_shl( rev_nrg, shl( diff, 1 ) ); dmx_nrg = L_shl( dmx_nrg, shl( diff, 1 ) ); -#else /* OPT_STEREO_32KBPS_V1 */ - rev_nrg = L_shr( rev_nrg, shl( sub( q_com, hStereoDft->q_smoothed_nrg ), 1 ) ); - dmx_nrg = L_shr( dmx_nrg, shl( sub( q_com, hStereoDft->q_smoothed_nrg ), 1 ) ); -#endif /* OPT_STEREO_32KBPS_V1 */ q_com = hStereoDft->q_smoothed_nrg; move16(); } -#ifdef OPT_STEREO_32KBPS_V1 ELSE -#else /* OPT_STEREO_32KBPS_V1 */ - ELSE IF( GT_16( hStereoDft->q_smoothed_nrg, q_com ) ) -#endif /* OPT_STEREO_32KBPS_V1 */ { -#ifdef OPT_STEREO_32KBPS_V1 hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */ move32(); hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( diff, 1 ) ); /* hStereoDft->q_smoothed_nrg */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */ - move32(); - hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ q_smoothed_nrg_local[b] = q_com; move16(); } @@ -3116,15 +3016,12 @@ void stereo_dft_generate_res_pred_fx( hStereoDft->smooth_dmx_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_dmx_nrg_fx[b], alpha ), dmx_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */ move32(); -#ifdef OPT_STEREO_32KBPS_V1 // Compute norm_fac in Q14 norm_fac = MAX_16; move16(); -#endif /* OPT_STEREO_32KBPS_V1 */ /* normalization factor */ IF( hStereoDft->smooth_res_nrg_fx[b] != 0 ) { -#ifdef OPT_STEREO_32KBPS_V1 norm_fac = 0; move16(); IF( hStereoDft->smooth_dmx_nrg_fx[b] != 0 ) @@ -3147,88 +3044,15 @@ void stereo_dft_generate_res_pred_fx( norm_fac = extract_h( prod ); } -#else /* OPT_STEREO_32KBPS_V1 */ - norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); /* q_norm_fac */ - norm_fac = Sqrt16( norm_fac, &q_norm_fac ); - IF( norm_fac != 0 ) - { - /* gain compressor */ - test(); - test(); - test(); - test(); - test(); - test(); - test(); - test(); - IF( LE_16( q_norm_fac, -Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && GT_16( (Word16) 0x3333, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) - { - lim_norm_fac = (Word16) 0x5000; - move16(); - } - ELSE IF( GT_16( q_norm_fac, Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && LT_16( (Word16) 0x5000, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) - { - lim_norm_fac = (Word16) 0x3333; - move16(); - } - ELSE - { - lim_norm_fac = norm_fac; - move16(); - } - IF( EQ_16( lim_norm_fac, norm_fac ) ) - { - norm_fac = ONE_IN_Q14; - move16(); - q_norm_fac = Q1; - move16(); - } - ELSE - { - norm_fac = extract_l( L_shr( L_mult0( norm_fac, lim_norm_fac ), Q15 ) ); /* q_norm_fac */ - q_norm_fac = add( q_norm_fac, 1 ); - test(); - IF( q_norm_fac < 0 ) - { - norm_fac = shl( norm_fac, q_norm_fac ); - q_norm_fac = 0; - move16(); - } - ELSE IF( GT_16( q_norm_fac, 2 ) && LT_16( norm_s( norm_fac ), sub( q_norm_fac, Q1 ) ) ) - { - norm_fac = MAX_16; - move16(); - q_norm_fac = Q1; - move16(); - } - } - } -#endif /* OPT_STEREO_32KBPS_V1 */ } -#ifndef OPT_STEREO_32KBPS_V1 - ELSE - { - norm_fac = MAX_16; - move16(); - q_norm_fac = Q1; - move16(); - } -#endif /* OPT_STEREO_32KBPS_V1 */ len = s_min( hStereoDft->band_limits[b + 1], bin0 ); FOR( i = hStereoDft->band_limits[b]; i < len; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), 1 ); /* q_dft */ move32(); DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), 1 ); /* q_dft */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), q_norm_fac ); /* q_dft */ - move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), q_norm_fac ); /* q_dft */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } } diff --git a/lib_dec/ivas_stereo_icbwe_dec_fx.c b/lib_dec/ivas_stereo_icbwe_dec_fx.c index 772eb2d7d..af31aea40 100644 --- a/lib_dec/ivas_stereo_icbwe_dec_fx.c +++ b/lib_dec/ivas_stereo_icbwe_dec_fx.c @@ -904,9 +904,7 @@ void stereo_icBWE_dec_fx( winSlope_fx = div_s( 1, winLen_fx ); /* Q15 */ alpha_fx = winSlope_fx; /* Q15 */ move16(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx Word16 winSlope_fx_ = sub( 32767 /* 1.0 in Q15*/, winSlope_fx ); -#endif FOR( i = 0; i < winLen_fx; i++ ) { L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); /* Q29 */ @@ -914,17 +912,10 @@ void stereo_icBWE_dec_fx( tmp = shl( round_fx( L_tmp ), 1 ); /* Q14 */ synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); /* Qsyn - 1 */ move32(); -#ifdef FIX_1439_SPEEDUP_stereo_icBWE_dec_fx if ( LE_16( alpha_fx, winSlope_fx_ ) ) { alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ } -#else - IF( LE_16( alpha_fx, sub( 32767 /* 1.0 in Q15*/, winSlope_fx ) ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); /* Q15 */ - } -#endif } FOR( ; i < NS2SA_FX2( st->output_Fs, FRAME_SIZE_NS ); i++ ) diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 522e741e8..b72a23f63 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -2306,19 +2306,10 @@ static Word32 ncross_corr_self_fx( Word64 c_c_fx; Word32 c_c_fx_return; Word64 energy_x_fx, energy_y_fx; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 c_c_fx_q; - Word64 energy_xy_fx; -#endif /* OPT_STEREO_32KBPS_V1 */ UWord16 j; Word32 *signal_a_fx, *signal_b_fx; Word32 temp_x, temp_y; Word16 headroom_left_x, headroom_left_y; -#ifndef OPT_STEREO_32KBPS_V1 - Word16 x_inv_q, y_inv_q; - Word16 x_q, y_q; - Word16 res_q; -#endif /* OPT_STEREO_32KBPS_V1 */ c_c_fx = 0; move64(); energy_x_fx = 0; @@ -2329,20 +2320,13 @@ static Word32 ncross_corr_self_fx( signal_b_fx = &signal_fx[y]; /* Q11 */ FOR( j = 0; j < corr_len; j += subsampling ) { -#ifdef OPT_STEREO_32KBPS_V1 c_c_fx = W_mac_32_32( c_c_fx, signal_a_fx[j], signal_b_fx[j] ); /* 2 * Q11 + 1*/ energy_x_fx = W_mac_32_32( energy_x_fx, signal_a_fx[j], signal_a_fx[j] ); /* 2 * Q11+ 1 */ energy_y_fx = W_mac_32_32( energy_y_fx, signal_b_fx[j], signal_b_fx[j] ); /* 2 * Q11+ 1 */ -#else /* OPT_STEREO_32KBPS_V1 */ - c_c_fx = W_add( c_c_fx, W_mult0_32_32( ( signal_a_fx[j] ), ( signal_b_fx[j] ) ) ); /* 2 * Q11 */ - energy_x_fx = W_add( energy_x_fx, W_mult0_32_32( ( signal_a_fx[j] ), ( signal_a_fx[j] ) ) ); /* 2 * Q11 */ - energy_y_fx = W_add( energy_y_fx, W_mult0_32_32( ( signal_b_fx[j] ), ( signal_b_fx[j] ) ) ); /* 2 * Q11 */ -#endif /* OPT_STEREO_32KBPS_V1 */ } headroom_left_x = W_norm( energy_x_fx ); headroom_left_y = W_norm( energy_y_fx ); -#ifdef OPT_STEREO_32KBPS_V1 temp_x = W_extract_h( W_shl( energy_x_fx, headroom_left_x ) ); // Q23 + headroom_left_x -32 temp_y = W_extract_h( W_shl( energy_y_fx, headroom_left_y ) ); // Q23 + headroom_left_y -32 Word64 prod = W_mult0_32_32( temp_x, temp_y ); // Q(headroom_left_x + headroom_left_y - 18) @@ -2365,79 +2349,6 @@ static Word32 ncross_corr_self_fx( quo_e = add( sub( sub( 40, q_cc ), q_prod ), quo_e ); c_c_fx_return = L_shl_sat( num, quo_e ); // Q31 } -#else /* OPT_STEREO_32KBPS_V1 */ - IF( LT_16( headroom_left_x, 32 ) ) - { - energy_x_fx = W_shr( energy_x_fx, sub( 32, headroom_left_x ) ); /* 2 * Q11 - (32 -headroom_left_x) */ - x_q = sub( 31, ( sub( ( 2 * OUTPUT_Q ), sub( 32, headroom_left_x ) ) ) ); - } - ELSE - { - x_q = 31 - ( 2 * OUTPUT_Q ); - } - IF( LT_16( headroom_left_y, 32 ) ) - { - energy_y_fx = W_shr( energy_y_fx, sub( 32, headroom_left_y ) ); /* 2 * Q11 - (32 -headroom_left_y) */ - y_q = sub( 31, ( sub( ( 2 * OUTPUT_Q ), ( sub( 32, headroom_left_y ) ) ) ) ); - } - ELSE - { - y_q = 31 - ( 2 * OUTPUT_Q ); - } - - x_inv_q = x_q; - move16(); - y_inv_q = y_q; - move16(); - - temp_x = Sqrt32( W_extract_l( energy_x_fx ), &x_q ); - IF( x_q < 0 ) - { - temp_x = L_shr( temp_x, i_mult( -1, x_q ) ); /* Q0 */ - x_q = 0; - move16(); - } - - temp_y = Sqrt32( W_extract_l( energy_y_fx ), &y_q ); - IF( y_q < 0 ) - { - temp_y = L_shr( temp_y, i_mult( -1, y_q ) ); /* Q0 */ - y_q = 0; - move16(); - } - - energy_xy_fx = Mpy_32_32( temp_x, temp_y ); /* x_q + y_q - 31 */ - res_q = add( y_q, x_q ); - - IF( ( energy_xy_fx < L_shr( ONE_IN_Q31, res_q ) ) || energy_xy_fx == 0 ) - { - energy_xy_fx = ONE_IN_Q31; /* conceal silent frames */ - res_q = 0; - c_c_fx = W_shl( c_c_fx, 31 - ( 2 * OUTPUT_Q ) ); /* Q31 */ - } - ELSE - { - Word32 temp_x_inv = ISqrt32( W_extract_l( energy_x_fx ), &x_inv_q ); - Word32 temp_y_inv = ISqrt32( W_extract_l( energy_y_fx ), &y_inv_q ); - Word16 headroom_left_c_c; - energy_xy_fx = Mpy_32_32( temp_x_inv, temp_y_inv ); /* exp(x_inv_q + y_inv_q) */ - res_q = add( x_inv_q, y_inv_q ); - headroom_left_c_c = W_norm( c_c_fx ); - c_c_fx_q = OUTPUT_Q * 2; - move16(); - IF( LT_16( headroom_left_c_c, 32 ) ) - { - c_c_fx = W_shr( c_c_fx, extract_l( sub( 32, headroom_left_c_c ) ) ); /* c_c_fx_q - (32 - headroom_left_c_c) */ - c_c_fx_q = sub( c_c_fx_q, sub( 32, headroom_left_c_c ) ); - } - c_c_fx = W_deposit32_l( Mpy_32_32( W_extract_l( c_c_fx ), W_extract_l( energy_xy_fx ) ) ); /* c_c_fx_q + (31 - res_q) - 31 */ - c_c_fx_q = add( c_c_fx_q, sub( sub( 31, res_q ), 31 ) ); - c_c_fx = W_extract_l( W_shl_sat_l( c_c_fx, extract_l( sub( 31, c_c_fx_q ) ) ) ); /* Q31 */ - } - - c_c_fx_return = W_extract_l( c_c_fx ); /* Q31 */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ return c_c_fx_return; } diff --git a/lib_dec/ivas_stereo_td_dec_fx.c b/lib_dec/ivas_stereo_td_dec_fx.c index 023c9a2e5..6209d5684 100644 --- a/lib_dec/ivas_stereo_td_dec_fx.c +++ b/lib_dec/ivas_stereo_td_dec_fx.c @@ -355,26 +355,16 @@ void tdm_upmix_plain_fx( { FOR( i = start_index; i < end_index; i++ ) { -#ifdef OPT_STEREO_32KBPS_V1 Word32 temp_left = Madd_32_32( SCh_2_R_fx[i], L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ); /* Qx */ Left_fx[i] = W_shl_sat_l( W_mult0_32_32( temp_left, inv_den_LR_ratio_fx ), -30 ); /* Qx */ move32(); Word32 temp_right = Msub_32_32( PCh_2_L_fx[i], L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ); /* Qx */ Right_fx[i] = W_shl_sat_l( W_mult0_32_32( temp_right, inv_den_LR_ratio_fx ), -30 ); /* Qx */ move32(); -#else /* OPT_STEREO_32KBPS_V1 */ - Word32 temp_left = L_add( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ); /* Qx */ - Left_fx[i] = L_shl_sat( Mpy_32_32( temp_left, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); - Word32 temp_right = L_add( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), L_negate( LR_ratio_fx ) ), PCh_2_L_fx[i] ); /* Qx */ - Right_fx[i] = L_shl_sat( Mpy_32_32( temp_right, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); -#endif /* OPT_STEREO_32KBPS_V1 */ } } ELSE { -#ifdef OPT_STEREO_32KBPS_V1 Word32 inv_den_LR_ratio_fx_neg = L_negate( inv_den_LR_ratio_fx ); FOR( i = start_index; i < end_index; i++ ) { @@ -385,17 +375,6 @@ void tdm_upmix_plain_fx( Right_fx[i] = W_shl_sat_l( W_mult0_32_32( temp_right, inv_den_LR_ratio_fx_neg ), -30 ); /* Qx */ move32(); } -#else /* OPT_STEREO_32KBPS_V1 */ - FOR( i = start_index; i < end_index; i++ ) - { - Word32 temp_left = L_sub( Mpy_32_32( L_add( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), SCh_2_R_fx[i] ); /* Qx */ - Left_fx[i] = L_shl_sat( Mpy_32_32( temp_left, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); - Word32 temp_right = L_sub( Mpy_32_32( L_sub( PCh_2_L_fx[i], SCh_2_R_fx[i] ), LR_ratio_fx ), PCh_2_L_fx[i] ); /* Qx */ - Right_fx[i] = L_shl_sat( Mpy_32_32( temp_right, inv_den_LR_ratio_fx ), 1 ); /* Qx + 1 */ - move32(); - } -#endif /* OPT_STEREO_32KBPS_V1 */ } return; diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 1234e2853..73d8ef11c 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4663,10 +4663,8 @@ void fb_tbe_dec_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , st->element_mode -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); /* add the fb_synth component to the hb_synth component */ @@ -4737,10 +4735,8 @@ void fb_tbe_dec_ivas_fx( /* FB TBE synthesis */ synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 , st->element_mode -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ ); test(); @@ -7045,23 +7041,12 @@ void ivas_swb_tbe_dec_fx( tmp1 = 0; move16(); -#ifdef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx Word32 idx32 = L_shr_r( 0x00333333, 10 ); /*NUM_SHB_SUBFR/L_FRAME16k*/ // Q16 -#endif FOR( i = 0; i < L_FRAME16k; i++ ) { -#ifndef FIX_1439_SPEEDUP_ivas_swb_tbe_dec_fx - Word16 idx = 0; - move16(); - IF( i != 0 ) - { - idx = idiv1616( i_mult( NUM_SHB_SUBFR, i ), L_FRAME16k ); - } -#else Word16 idx; idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ -#endif L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); diff --git a/lib_enc/acelp_core_switch_enc_fx.c b/lib_enc/acelp_core_switch_enc_fx.c index aaaf08b26..8db68e089 100644 --- a/lib_enc/acelp_core_switch_enc_fx.c +++ b/lib_enc/acelp_core_switch_enc_fx.c @@ -46,10 +46,8 @@ void acelp_core_switch_enc_fx( Word16 Aq[2 * ( M + 1 )]; LPD_state_HANDLE hLPDmem; /* ACELP LPDmem memories */ BSTR_ENC_HANDLE hBstr = st_fx->hBstr; -#ifdef HARM_PUSH_BIT UWord16 value; Word16 nb_bits; -#endif hLPDmem = st_fx->hLPDmem; /* initializations */ @@ -140,7 +138,6 @@ void acelp_core_switch_enc_fx( encod_gen_voic_core_switch_fx( st_fx, st_fx->last_L_frame, inp, Aq, A, T_op, exc, cbrate, shift, Q_new ); -#ifdef HARM_PUSH_BIT i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); #ifdef DEBUGGING assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" ); @@ -151,20 +148,6 @@ void acelp_core_switch_enc_fx( i++; } delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); -#else - /*----------------------------------------------------------------* - * bit-stream: modify the layer of sub frame CELP - *----------------------------------------------------------------*/ - FOR( i = 0; i < 20; i++ ) - { - hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value; /* Q0 */ - move16(); - hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; /* Q0 */ - move16(); - hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; /* Q0 */ - move16(); - } -#endif /*----------------------------------------------------------------* * BWE encoding *----------------------------------------------------------------*/ diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index 9dea812a6..6dc3963f8 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -2455,12 +2455,7 @@ static void shb_CNG_encod_fx( push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener_fx, 4 ); push_indice( hBstr, IND_SID_BW, 1, 1 ); -#ifdef HARM_PUSH_BIT delete_indice( hBstr, IND_CNG_ENV1 ); -#else - hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_CNG_ENV1].nb_bits ); - hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; -#endif move16(); move16(); diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index 7966fc7d8..247dcbda3 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -838,11 +838,7 @@ void dtx_fx( /* reset the bitstream (IVAS format signalling was already written) */ IF( NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) && st_fx->hBstr != NULL ) { -#ifdef HARM_PUSH_BIT reset_indices_enc_fx( st_fx->hBstr, st_fx->hBstr->nb_ind_tot ); -#else - reset_indices_enc_fx( st_fx->hBstr, MAX_NUM_INDICES ); -#endif } } diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index da3555cdb..fc1f3e993 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -522,12 +522,10 @@ void encod_gen_voic_ivas_fx( set16_fx( code_preQ_fx, 0, L_SUBFR ); shift_wsp = add( Q_new, shift ); -#ifdef TEST_HR if ( LT_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) { shift_wsp = sub( shift_wsp, 1 ); } -#endif /* set and write harmonicity flag */ harm_flag_acelp = 0; move16(); @@ -630,33 +628,18 @@ void encod_gen_voic_ivas_fx( IF( LE_32( st_fx->core_brate, ACELP_8k00 ) ) { -#ifdef TEST_HR gain_enc_lbr_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->coder_type, i_subfr_fx, xn_fx, y1_fx, shift_wsp, y2_fx, code_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR ); -#else - gain_enc_lbr_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->coder_type, i_subfr_fx, xn_fx, y1_fx, sub( shift_wsp, 1 ), y2_fx, code_fx, - &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, gc_mem, gp_mem, clip_gain_fx, L_SUBFR ); -#endif } ELSE IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { -#ifdef TEST_HR gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, shift_wsp ); -#else - gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr_fx, xn_fx, y1_fx, y2_fx, code_fx, Es_pred_fx, - &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx, sub( shift_wsp, 1 ) ); -#endif } ELSE { -#ifdef TEST_HR gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, i_subfr_fx, -1, xn_fx, y1_fx, shift_wsp, y2_fx, code_fx, Es_pred_fx, &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx ); -#else - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame, i_subfr_fx, -1, xn_fx, y1_fx, sub( shift_wsp, 1 ), y2_fx, code_fx, Es_pred_fx, - &gain_pit_fx, &gain_code_fx, &gain_inov_fx, &norm_gain_code_fx, g_corr_fx, clip_gain_fx ); -#endif } IF( st_fx->Opt_SC_VBR ) { diff --git a/lib_enc/enc_ppp_fx.c b/lib_enc/enc_ppp_fx.c index 9d1ffad60..fca36f460 100644 --- a/lib_enc/enc_ppp_fx.c +++ b/lib_enc/enc_ppp_fx.c @@ -189,11 +189,7 @@ ivas_error encod_ppp_fx( /* We write signalling indices again only in case of bump_up */ /* delete previous indices */ -#ifdef HARM_PUSH_BIT reset_indices_enc_fx( hBstr, hBstr->nb_ind_tot ); -#else - reset_indices_enc_fx( hBstr, MAX_NUM_INDICES ); -#endif /* signalling matrix (writing of signalling bits) */ signalling_enc_fx( st_fx ); } @@ -376,11 +372,7 @@ ivas_error encod_ppp_ivas_fx( /* We write signalling indices again only in case of bump_up */ /* delete previous indices */ -#ifdef HARM_PUSH_BIT reset_indices_enc_fx( hBstr, hBstr->nb_ind_tot ); -#else - reset_indices_enc_fx( hBstr, MAX_NUM_INDICES ); -#endif /* signalling matrix (writing of signalling bits) */ signalling_enc_fx( st_fx ); } diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 9802dc15b..fb601aeba 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -520,12 +520,10 @@ Word16 encod_tran_ivas_fx( move16(); set16_fx( code_preQ, 0, L_SUBFR ); shift_wsp = add( Q_new, shift ); -#ifdef TEST_HR if ( LT_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) { shift_wsp = sub( shift_wsp, 1 ); } -#endif /*----------------------------------------------------------------* * ACELP subframe loop *----------------------------------------------------------------*/ @@ -546,11 +544,7 @@ Word16 encod_tran_ivas_fx( q_h1 = sub( 14, norm_s( h1[0] ) ); Copy_Scale_sig( h1, h2_fx, L_SUBFR, sub( 11, q_h1 ) ); /*Q11*/ -#ifdef TEST_HR Scale_sig( h1, L_SUBFR, sub( 14, q_h1 ) ); -#else - Scale_sig( h1, L_SUBFR, sub( 13, q_h1 ) ); -#endif /* scaling of xn[] to limit dynamic at 12 bits */ Scale_sig( xn, L_SUBFR, shift ); @@ -569,9 +563,6 @@ Word16 encod_tran_ivas_fx( IF( GE_32( st_fx->core_brate, MIN_BRATE_AVQ_EXC ) ) { -#ifndef TEST_HR - Scale_sig( h1, L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ -#endif transf_cdbk_enc_ivas_fx( st_fx, 0, i_subfr, cn, exc_fx, p_Aq, Aw_fx, h1, xn, xn2, y1, y2, Es_pred_fx, &gain_pit, gain_code, g_corr, clip_gain, &gain_preQ, code_preQ, unbits, Q_new, shift ); } @@ -599,37 +590,22 @@ Word16 encod_tran_ivas_fx( IF( Jopt_flag == 0 ) { /* SQ gain_code */ -#ifdef TEST_HR gain_enc_tc_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y2, code, Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, shift_wsp ); -#else - gain_enc_tc_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y2, code, Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, sub( shift_wsp, 1 ) ); -#endif } ELSE { IF( GT_32( st_fx->core_brate, ACELP_32k ) ) { /* SQ gain_pit and gain_code */ -#ifdef TEST_HR gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, shift_wsp ); -#else - gain_enc_SQ_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, i_subfr, xn, y1, y2, code, Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain, sub( shift_wsp, 1 ) ); -#endif } ELSE { /* VQ gain_pit and gain_code */ -#ifdef TEST_HR gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame_fx, i_subfr, tc_subfr, xn, y1, shift_wsp, y2, code, Es_pred_fx, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); -#else - gain_enc_mless_ivas_fx( hBstr, st_fx->acelp_cfg.gains_mode, st_fx->element_mode, L_frame_fx, i_subfr, tc_subfr, xn, y1, sub( shift_wsp, 1 ), y2, code, Es_pred_fx, - &gain_pit, &gain_code, &gain_inov, &norm_gain_code, g_corr, clip_gain ); -#endif } } gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, gain_pit, st_fx->clip_var_fx ); diff --git a/lib_enc/eval_pit_contr_fx.c b/lib_enc/eval_pit_contr_fx.c index 5e1c8dfe3..ce7f05968 100644 --- a/lib_enc/eval_pit_contr_fx.c +++ b/lib_enc/eval_pit_contr_fx.c @@ -379,7 +379,6 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit set16_fx( pitch_buf, shl( L_SUBFR, 6 ), NB_SUBFR16k ); -#ifdef HARM_PUSH_BIT /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { @@ -387,26 +386,6 @@ Word16 Pit_exc_contribution_len_fx( /* o : bin where pit } delete_indice( hBstr, IND_ES_PRED ); -#else - /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ - FOR( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) - { - IF( hBstr->ind_list[i].nb_bits != -1 ) - { - hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[i].nb_bits ); /* Q0 */ - hBstr->ind_list[i].nb_bits = -1; - move16(); - } - } - - IF( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 ) - { - hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, hBstr->ind_list[IND_ES_PRED].nb_bits ); /* Q0 */ - move16(); - hBstr->ind_list[IND_ES_PRED].nb_bits = -1; - move16(); - } -#endif } IF( LT_32( st_fx->core_brate, CFREQ_BITRATE ) ) { diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 70b5166df..fe1ba10c1 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -2367,65 +2367,6 @@ void IGFEncSetMode_ivas_fx( * * IGF bitstream concatenation for TCX10 modes *-------------------------------------------------------------------*/ -#ifndef HARM_PUSH_BIT /* Float code */ -void IGFEncConcatenateBitstream( - const IGF_ENC_INSTANCE_HANDLE hIGFEnc, /* i : instance handle of IGF Encoder */ - const Word16 bsBits, /* i : number of IGF bits written to list of indices */ - BSTR_ENC_HANDLE hBstr /* i/o: bitstream handle */ -) -{ - Word16 i; - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - Indice *ind_list; - UWord8 *pFrame; /* byte array with bit packet and byte aligned coded speech data */ - Word16 *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ - Word16 k, nb_bits_written; - Word32 imask; - UWord8 omask; - - hPrivateData = &hIGFEnc->igfData; - - ind_list = &hBstr->ind_list[sub( hBstr->nb_ind_tot, bsBits )]; /* here, we assume that each bit has been written as a single indice */ - pFrame = hPrivateData->igfBitstream; - pFrame_size = &hPrivateData->igfBitstreamBits; - nb_bits_written = 0; - move16(); - - omask = (UWord8) shr( 0x80, s_and( *pFrame_size, 0x7 ) ); - pFrame += shr( *pFrame_size, 3 ); - - /* bitstream packing (conversion of individual indices into a serial stream) */ - FOR( i = 0; i < bsBits; i++ ){ - IF( ind_list[i].nb_bits > 0 ){ - /* mask from MSB to LSB */ - imask = L_shl( 1, ( sub( ind_list[i].nb_bits, 1 ) ) ); - - /* write bit by bit */ - FOR( k = 0; k < ind_list[i].nb_bits; k++ ) - { - pack_bit( ind_list[i].value & imask, &pFrame, &omask ); - imask = L_shr( imask, 1 ); - } - nb_bits_written = add( nb_bits_written, ind_list[i].nb_bits ); - - /* delete the indice */ - ind_list[i].nb_bits = -1; - move16(); -} -} - -*pFrame_size = add( *pFrame_size, nb_bits_written ); -move16(); - -/* update list of indices */ -hBstr->nb_ind_tot = sub( hBstr->nb_ind_tot, bsBits ); -hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written ); -move16(); -move16(); - -return; -} -#endif /*-------------------------------------------------------------------* * IGFEncResetTCX10BitCounter_ivas_fx() diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index a7b5eabb3..e0562467a 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -1627,33 +1627,6 @@ hBstr->nb_bits_tot = sub( hBstr->nb_bits_tot, nb_bits_written ); return; } -#ifndef HARM_PUSH_BIT /* old bitstream */ -/**********************************************************************/ /* - IGF bitsream concatenation for TCX10 modes - **************************************************************************/ -void IGFEncConcatenateBitstream_fx( const IGF_ENC_INSTANCE_HANDLE hInstance, /**< in: | instance handle of IGF Encoder */ - Word16 bsBits, /**< in: Q0 | number of IGF bits written to list of indices */ - Word16 *next_ind, /**< in/out: | pointer to actual bit indice */ - Word16 *nb_bits, /**< in/out: | total number of bits already written */ - Indice *ind_list_fx /**< in: | pointer to list of indices */ -) -{ - IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; - - hPrivateData = &hInstance->igfData; - *next_ind = *next_ind - bsBits; - move16(); - indices_to_serial_generic( - &ind_list_fx[*next_ind], - bsBits, - hPrivateData->igfBitstream, - &hPrivateData->igfBitstreamBits ); - - *nb_bits = sub( *nb_bits, bsBits ); - move16(); - return; -} -#endif /**********************************************************************/ /* IGF reset bitsream bit counter for TCX10 modes **************************************************************************/ diff --git a/lib_enc/init_enc_fx.c b/lib_enc/init_enc_fx.c index ba1d47f79..9e3045be1 100644 --- a/lib_enc/init_enc_fx.c +++ b/lib_enc/init_enc_fx.c @@ -2163,13 +2163,9 @@ ivas_error init_encoder_ivas_fx( } ELSE { -#ifndef HARM_ENC_INIT - InitTransientDetection_ivas_fx( frame_length, NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); -#else InitTransientDetection_fx( extract_l( Mult_32_16( st->input_Fs, 0x0290 ) ), NS2SA_FX2( st->input_Fs, DELAY_FIR_RESAMPL_NS ), &st->transientDetection ); -#endif } /*-----------------------------------------------------------------* diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 7d88b1264..2285acc0c 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -272,59 +272,6 @@ Word16 getNumChanAnalysis_fx( return n; } -#ifndef HARM_ENC_INIT -/*-------------------------------------------------------------------* - * copy_encoder_config_ivas_fx() - * - * Copy configuration structrue to the state structrure - *-------------------------------------------------------------------*/ - -void copy_encoder_config_ivas_fx( - Encoder_Struct *st_ivas, /* i : IVAS encoder structure */ - Encoder_State *st, /* o : encoder state structure */ - const Word16 flag_all /* i : flag 1==update all, 0=partial update Q0*/ -) -{ - IF( flag_all ) - { - st->input_Fs = st_ivas->hEncoderConfig->input_Fs; /* Q0 */ - move32(); - - st->last_codec_mode = st_ivas->last_codec_mode; /* Q0 */ - move16(); - st->last_total_brate = st_ivas->hEncoderConfig->last_ivas_total_brate; /* Q0 */ - move32(); - - st->Opt_DTX_ON = st_ivas->hEncoderConfig->Opt_DTX_ON; /* Q0 */ - move16(); - - st->last_Opt_SC_VBR = st_ivas->hEncoderConfig->last_Opt_SC_VBR; /* Q0 */ - move16(); - } - - st->Opt_AMR_WB = st_ivas->hEncoderConfig->Opt_AMR_WB; /* Q0 */ - st->Opt_SC_VBR = st_ivas->hEncoderConfig->Opt_SC_VBR; /* Q0 */ - move16(); - move16(); - - st->codec_mode = st_ivas->codec_mode; /* Q0 */ - st->max_bwidth = st_ivas->hEncoderConfig->max_bwidth; /* Q0 */ - move16(); - move16(); - - st->Opt_RF_ON = st_ivas->hEncoderConfig->Opt_RF_ON; /* Q0 */ - st->rf_fec_offset = st_ivas->hEncoderConfig->rf_fec_offset; /* Q0 */ - st->rf_fec_indicator = st_ivas->hEncoderConfig->rf_fec_indicator; /* Q0 */ - move16(); - move16(); - move16(); - - st->element_mode = st_ivas->hEncoderConfig->element_mode_init; /* Q0 */ - move16(); - - return; -} -#endif /*-------------------------------------------------------------------* * copy_encoder_config_fx() * @@ -467,617 +414,6 @@ void ivas_initialize_handles_enc_fx( * * Initialize IVAS encoder state structure *-------------------------------------------------------------------*/ -#ifndef HARM_ENC_INIT -ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ -) -{ - Word16 i, n; - Word16 nchan_inp_buff; - Word16 sce_id, cpe_id; - IVAS_FORMAT ivas_format; - Word32 input_Fs, ivas_total_brate; - Word32 element_brate_tmp[MAX_NUM_OBJECTS]; - ENCODER_CONFIG_HANDLE hEncoderConfig; - ivas_error error; - - error = IVAS_ERR_OK; - - hEncoderConfig = st_ivas->hEncoderConfig; - ivas_format = hEncoderConfig->ivas_format; - input_Fs = hEncoderConfig->input_Fs; /* Q0 */ - ivas_total_brate = hEncoderConfig->ivas_total_brate; /* Q0 */ - move32(); - move32(); - - hEncoderConfig->last_ivas_total_brate = ivas_total_brate; /* Q0 */ - move32(); - - if ( NE_32( ivas_format, MONO_FORMAT ) ) - { - /* In IVAS, ensure that minimum coded bandwidth is WB */ - hEncoderConfig->max_bwidth = s_max( hEncoderConfig->max_bwidth, WB ); /* Q0 */ - move16(); - } - st_ivas->ism_mode = ISM_MODE_NONE; - st_ivas->mc_mode = MC_MODE_NONE; - move32(); - move32(); - - st_ivas->nchan_transport = -1; - move16(); - - /*-----------------------------------------------------------------* - * Allocate floating-point input audio buffers - *-----------------------------------------------------------------*/ - - nchan_inp_buff = hEncoderConfig->nchan_inp; /* Q0 */ - move16(); - - IF( EQ_32( ivas_format, MONO_FORMAT ) ) - { - nchan_inp_buff = 0; - move16(); - } - ELSE IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) - { - if ( EQ_32( sub( hEncoderConfig->nchan_inp, hEncoderConfig->nchan_ism ), 1 ) ) /* mono is duplicated in monoMASA */ - { - nchan_inp_buff = add( nchan_inp_buff, 1 ); - } - - nchan_inp_buff = add( nchan_inp_buff, 1 ); /* for *data_separated_object */ - } - - FOR( n = 0; n < nchan_inp_buff; n++ ) - { - /* note: these are intra-frame heap memories */ - IF( ( st_ivas->p_data_fx[n] = (Word32 *) malloc( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for floating-point input audio buffer!\n" ) ); - } - set32_fx( st_ivas->p_data_fx[n], 0, extract_l( Mpy_32_16_1( input_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); - } - st_ivas->q_data_fx = Q11; - move16(); - FOR( ; n < MAX_INPUT_CHANNELS + MAX_NUM_OBJECTS; n++ ) - { - st_ivas->p_data_fx[n] = NULL; - } - /*-----------------------------------------------------------------* - * Allocate and initialize buffer of indices - *-----------------------------------------------------------------*/ - - /* set the maximum allowed number of indices in the list */ - st_ivas->ivas_max_num_indices = get_ivas_max_num_indices_fx( ivas_format, ivas_total_brate ); /* Q0 */ - move16(); - - /* allocate buffer of indices */ - IF( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); - } - - /* reset the list of indices */ - for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) - { - st_ivas->ind_list[i].nb_bits = -1; - move16(); - } - - /* set the maximum allowed number of metadata indices in the list */ - st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata_fx( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); /* Q0 */ - move16(); - - /* allocate buffer of metadata indices */ - IF( st_ivas->ivas_max_num_indices_metadata > 0 ) - { - IF( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); - } - - /* reset the list of metadata indices */ - for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) - { - st_ivas->ind_list_metadata[i].nb_bits = -1; - move16(); - } - } - ELSE - { - st_ivas->ind_list_metadata = NULL; - } - - /*-----------------------------------------------------------------* - * Allocate and initialize SCE/CPE and other handles - *-----------------------------------------------------------------*/ - - IF( EQ_32( ivas_format, MONO_FORMAT ) ) - { - st_ivas->nSCE = 1; /* in mono, there is always only one SCE */ - move16(); - st_ivas->nCPE = 0; - move16(); - st_ivas->nchan_transport = 1; - move16(); - sce_id = 0; - move16(); - - test(); - IF( st_ivas->hEncoderConfig->element_mode_init != EVS_MONO ) - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE - { - IF( NE_32( ( error = create_evs_sce_enc_fx( st_ivas, sce_id, ivas_total_brate ) ), IVAS_ERR_OK ) ) - { - return error; - } - } - - /* prepare stereo downmix for EVS */ - IF( EQ_16( hEncoderConfig->stereo_dmx_evs, 1 ) ) - { - IF( ( error = stereo_dmx_evs_init_encoder_fx( &( st_ivas->hStereoDmxEVS ), input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( ivas_format, STEREO_FORMAT ) ) - { - st_ivas->nSCE = 0; - st_ivas->nCPE = 1; /* in stereo, there is always only one CPE */ - st_ivas->nchan_transport = CPE_CHANNELS; - cpe_id = 0; - move16(); - move16(); - move16(); - move16(); - - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( ivas_format, ISM_FORMAT ) ) - { - st_ivas->ism_mode = ivas_ism_mode_select( hEncoderConfig->nchan_inp, ivas_total_brate ); - - IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_inp, element_brate_tmp ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, element_brate_tmp[sce_id] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) ) - { - IF( ( error = ivas_param_ism_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( st_ivas->hEncoderConfig->Opt_DTX_ON ) - { - IF( ( error = ivas_ism_dtx_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, MASA_FORMAT ) ) - { - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( EQ_32( ivas_format, SBA_FORMAT ) ) - { - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); /* Q0 */ - move16(); - - IF( ( error = ivas_spar_enc_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE - { - st_ivas->nchan_transport = hEncoderConfig->nchan_inp; /* Q0 */ - move16(); - - IF( ( error = ivas_masa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( EQ_32( ivas_format, SBA_FORMAT ) && st_ivas->hEncoderConfig->Opt_DTX_ON ) - { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1; - move16(); - } - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - if ( hEncoderConfig->Opt_DTX_ON ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 1; - move16(); - } - } - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) ) - { - Word32 ism_total_brate; - Word16 k; - - st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( ivas_total_brate, hEncoderConfig->nchan_ism ); /* Q0 */ - move32(); - st_ivas->nchan_transport = 2; - move16(); - - IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) - { - return error; - } - - k = 0; - move16(); - while ( k < SIZE_IVAS_BRATE_TBL && NE_32( ivas_total_brate, ivas_brate_tbl[k] ) ) - { - k++; - } - - ism_total_brate = 0; - move32(); - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - ism_total_brate = L_add( ism_total_brate, sep_object_brate[k - 2][st_ivas->nSCE - 1] ); - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, sep_object_brate[k - 2][st_ivas->nSCE - 1] ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - IF( ( error = ivas_masa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - IF( ( error = ivas_omasa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - if ( GE_32( L_sub( ivas_total_brate, ism_total_brate ), MIN_BRATE_MDCT_STEREO ) ) - { - st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - else - { - st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_DFT; - move16(); - } - - IF( ( error = create_cpe_enc_fx( st_ivas, 0, L_sub( ivas_total_brate, ism_total_brate ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( ivas_format, SBA_ISM_FORMAT ) ) - { - st_ivas->ism_mode = ISM_MODE_NONE; - - if ( GE_32( ivas_total_brate, IVAS_256k ) ) - { - st_ivas->ism_mode = ISM_SBA_MODE_DISC; - } - - IF( ( error = ivas_ism_metadata_enc_create_fx( st_ivas, hEncoderConfig->nchan_ism, element_brate_tmp ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* allocate and initialize SBA handles */ - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); - move16(); - - IF( ( error = ivas_spar_enc_open_fx( st_ivas, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_dirac_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( EQ_32( st_ivas->ism_mode, ISM_MODE_NONE ) ) - { - /* allocate and initialize SBA core-coders */ - IF( EQ_16( st_ivas->nchan_transport, 1 ) ) - { - IF( ( error = create_sce_enc_fx( st_ivas, 0, ivas_total_brate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE - { - /* allocate and initialize MCT core coder */ - st_ivas->nCPE = add( st_ivas->nCPE, shr( add( st_ivas->hEncoderConfig->nchan_ism, 1 ), 1 ) ); - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nchan_transport, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - IF( ( error = ivas_osba_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( ivas_format, MC_FORMAT ) ) - { - st_ivas->mc_mode = ivas_mc_mode_select_fx( hEncoderConfig->mc_input_setup, ivas_total_brate ); /* Q0 */ - - IF( ( error = ivas_create_lfe_lpf_enc_fx( &st_ivas->hLfeLpf, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCT ) ) - { - st_ivas->nSCE = 0; - st_ivas->nCPE = idiv1616( hEncoderConfig->nchan_inp, CPE_CHANNELS ); /* Q0 */ - move16(); - move16(); - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, sub( hEncoderConfig->nchan_inp, 1 ), &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, imult3216( res_dec, CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_create_lfe_enc_fx( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels_fx( st_ivas->hEncoderConfig->mc_input_setup ); /* Q0 */ - move16(); - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMUPMIX ) ) - { - st_ivas->nSCE = 0; - st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; - st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; - move16(); - move16(); - move16(); - - IF( ( error = ivas_mc_paramupmix_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, st_ivas->nCPE, &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, res_dec ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_create_lfe_enc_fx( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) - { - IF( ( error = ivas_param_mc_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - Word32 res_dec, res_frac; - iDiv_and_mod_32( ivas_total_brate, add( st_ivas->nCPE, st_ivas->nSCE ), &res_dec, &res_frac, 0 ); - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, res_dec ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - IF( GT_16( st_ivas->nCPE, 1 ) ) - { - IF( ( error = create_mct_enc_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - ELSE IF( EQ_32( st_ivas->mc_mode, MC_MODE_MCMASA ) ) - { - Word32 brate_sce, brate_cpe; - - ivas_mcmasa_setNumTransportChannels_fx( &( st_ivas->nchan_transport ), &( hEncoderConfig->element_mode_init ), ivas_total_brate ); - - IF( ( error = ivas_qmetadata_open_fx( &( st_ivas->hQMetaData ) ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( ( error = ivas_masa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - IF( ( error = ivas_mcmasa_enc_open_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - ivas_mcmasa_split_brate_fx( st_ivas->hMcMasa->separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); - - FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - IF( ( error = create_sce_enc_fx( st_ivas, sce_id, brate_sce ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - - IF( ( error = create_cpe_enc_fx( st_ivas, cpe_id, brate_cpe ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - } - - /*-----------------------------------------------------------------* - * Allocate and initialize HP20 filter memories - *-----------------------------------------------------------------*/ - - /* set number of input channels used for analysis/coding */ - n = getNumChanAnalysis_fx( st_ivas ); /* Q0 */ - move16(); - - IF( n > 0 ) - { - IF( ( st_ivas->mem_hp20_in_fx = (Word32 **) malloc( n * sizeof( Word32 * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - } - ELSE - { - st_ivas->mem_hp20_in_fx = NULL; - } - - FOR( i = 0; i < n; i++ ) - { - IF( ( st_ivas->mem_hp20_in_fx[i] = (Word32 *) malloc( ( L_HP20_MEM + 2 ) * sizeof( Word32 ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HP20 filter memory\n" ) ); - } - - set32_fx( st_ivas->mem_hp20_in_fx[i], 0, L_HP20_MEM + 2 ); - } - return error; -} -#endif ivas_error ivas_init_encoder_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index ac836b674..8b09f3644 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -675,15 +675,10 @@ static void ivas_param_mc_param_est_enc_fx( #endif Word32 a_fx, b_fx, c_fx, d_fx; /* Tmp complex values */ Word16 a_e, b_e, c_e, d_e; /* Tmp complex values */ -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word64 Cy_sum_real_64[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; Word64 Cy_sum_imag_64[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; Word16 sub62gb; Word16 sub35gb; -#else - Word32 Cy_sum_imag_fx[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; - Word16 Cy_sum_imag_e[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][MAX_CICP_CHANNELS][MAX_CICP_CHANNELS]; -#endif Word32 Cx_sum_imag_fx[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; Word16 Cx_sum_imag_e[PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC][PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_TRANSPORT_CHANS]; Word32 real_part_fx, imag_part_fx; @@ -712,7 +707,6 @@ static void ivas_param_mc_param_est_enc_fx( move16(); band_step = 1; move16(); -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE FOR( cur_param_band = 0; cur_param_band < PARAM_MC_MAX_PARAMETER_BANDS; cur_param_band++ ) { FOR( ch_idx1 = 0; ch_idx1 < MAX_CICP_CHANNELS; ch_idx1++ ) @@ -720,18 +714,12 @@ static void ivas_param_mc_param_est_enc_fx( set64_fx( Cy_sum_real_64[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); } } -#endif FOR( cur_param_band = 0; cur_param_band < PARAM_MC_MAX_PARAM_BAND_ABS_COV_ENC; cur_param_band++ ) { FOR( ch_idx1 = 0; ch_idx1 < MAX_CICP_CHANNELS; ch_idx1++ ) { -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE set64_fx( Cy_sum_imag_64[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); -#else - set32_fx( Cy_sum_imag_fx[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); - set16_fx( Cy_sum_imag_e[cur_param_band][ch_idx1], 0, MAX_CICP_CHANNELS ); -#endif } FOR( ch_idx1 = 0; ch_idx1 < PARAM_MC_MAX_TRANSPORT_CHANS; ch_idx1++ ) @@ -760,23 +748,16 @@ static void ivas_param_mc_param_est_enc_fx( } } -#if defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE ) || defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE ) Word16 gb = find_guarded_bits_fx( l_ts ); #ifndef MERGE_REQUEST_1472_SPEEDUP_ivas_mc_param_enc_fx_NONBE Word16 add20gb = add( 20, gb ); #endif -#endif -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE sub35gb = sub( 32, sub( 11, find_guarded_bits_fx( l_ts ) ) ); // 31 - (((11 - gb) + 31 + norm) - 32) sub62gb = sub( 63, shl( sub( 11, find_guarded_bits_fx( l_ts ) ), 1 ) ); // 31 - ((2*(11 - gb) + norm) - 32) -#endif FOR( ts = start_ts; ts < num_time_slots; ts++ ) { -#if !defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE ) && !defined( IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE ) - Word16 gb = find_guarded_bits_fx( l_ts ); -#endif ivas_fb_mixer_get_windowed_fr_fx( hParamMC->hFbMixer, pcm_in_fx, p_slot_frame_f_real_fx, p_slot_frame_f_imag_fx, l_ts, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans, gb ); ivas_fb_mixer_update_prior_input_fx( hParamMC->hFbMixer, pcm_in_fx, l_ts, hParamMC->hFbMixer->fb_cfg->num_in_chans ); @@ -822,26 +803,6 @@ static void ivas_param_mc_param_est_enc_fx( move64(); move64(); -#else -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE - dmx_real_fx[ch_idx1] = 0; - move32(); - dmx_real_e[ch_idx1] = 0; - move16(); - dmx_imag_fx[ch_idx1] = 0; - move32(); - dmx_imag_e[ch_idx1] = 0; - move16(); - FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) - { - L_tmp = Mpy_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_real_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_real_fx[ch_idx1], dmx_real_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_real_e[ch_idx1] ); - move32(); - L_tmp = Mpy_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_imag_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_imag_fx[ch_idx1], dmx_imag_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_imag_e[ch_idx1] ); - move32(); - p_dmx_fac_fx++; - } #else Word32 real_fx = L_add( 0, 0 ); Word16 real_e = add( 0, 0 ); @@ -863,7 +824,6 @@ static void ivas_param_mc_param_est_enc_fx( move16(); move32(); move16(); -#endif #endif } @@ -910,7 +870,6 @@ static void ivas_param_mc_param_est_enc_fx( move32(); } } -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { a_fx = slot_frame_f_real_fx[ch_idx1][cur_cldfb_band]; @@ -930,65 +889,6 @@ static void ivas_param_mc_param_est_enc_fx( move64(); } } -#else - /* Cy for input channels */ - FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) - { -#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE - a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); - a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); - a_e = sub( add20gb, a_e ); - if ( a_fx == 0 ) - { - a_e = 0; - move16(); - } - b_e = norm_l( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band] ); - b_fx = L_shl( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], b_e ); - b_e = sub( add20gb, b_e ); - if ( b_fx == 0 ) - { - b_e = 0; - move16(); - } -#endif - FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) - { -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE - a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); - b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); - c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); - d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); -#else - c_e = norm_l( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band] ); - c_fx = L_shl( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], c_e ); - c_e = sub( add20gb, c_e ); - if ( c_fx == 0 ) - { - c_e = 0; - move16(); - } - d_e = norm_l( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band] ); - d_fx = L_shl( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], d_e ); - d_e = sub( add20gb, d_e ); - if ( d_fx == 0 ) - { - d_e = 0; - move16(); - } -#endif - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ - L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], - L_tmp, tmp_e, &Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); - move32(); - L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, d_fx ), add( a_e, d_e ), L_negate( Mpy_32_32( b_fx, c_fx ) ), add( b_e, c_e ), &tmp_e ); - Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2], - L_tmp, tmp_e, &Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2] ); - move32(); - } - } -#endif } } @@ -1026,27 +926,6 @@ static void ivas_param_mc_param_est_enc_fx( dmx_imag_64[ch_idx1] = imag_64; move64(); move64(); -#else -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE - dmx_real_fx[ch_idx1] = 0; - move32(); - dmx_real_e[ch_idx1] = 0; - move16(); - dmx_imag_fx[ch_idx1] = 0; - move32(); - dmx_imag_e[ch_idx1] = 0; - move16(); - - FOR( inp_ch = 0; inp_ch < nchan_input; inp_ch++ ) - { - L_tmp = Mpy_32_32( slot_frame_f_real_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_real_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_real_fx[ch_idx1], dmx_real_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_real_e[ch_idx1] ); - move32(); - L_tmp = Mpy_32_32( slot_frame_f_imag_fx[inp_ch][cur_cldfb_band], ( *p_dmx_fac_fx ) ); - dmx_imag_fx[ch_idx1] = BASOP_Util_Add_Mant32Exp( dmx_imag_fx[ch_idx1], dmx_imag_e[ch_idx1], L_tmp, add( 20, gb ), &dmx_imag_e[ch_idx1] ); - move32(); - p_dmx_fac_fx++; - } #else Word32 real_fx = L_add( 0, 0 ); Word16 real_e = 0; @@ -1071,7 +950,6 @@ static void ivas_param_mc_param_est_enc_fx( move32(); dmx_imag_e[ch_idx1] = imag_e; move16(); -#endif #endif } @@ -1083,7 +961,6 @@ static void ivas_param_mc_param_est_enc_fx( CONVERT_DMX( dmx_real_64[ch_idx1], a_fx, a_e ); CONVERT_DMX( dmx_imag_64[ch_idx1], b_fx, b_e ); #else -#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE a_fx = dmx_real_fx[ch_idx1]; move32(); a_e = dmx_real_e[ch_idx1]; @@ -1092,7 +969,6 @@ static void ivas_param_mc_param_est_enc_fx( move32(); b_e = dmx_imag_e[ch_idx1]; move16(); -#endif #endif FOR( ch_idx2 = 0; ch_idx2 < nchan_transport; ++ch_idx2 ) @@ -1106,34 +982,10 @@ static void ivas_param_mc_param_est_enc_fx( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cx_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, &Cx_sum_e[cur_param_band][ch_idx1][ch_idx2] ); #else -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_BE - a_fx = dmx_real_fx[ch_idx1]; - move32(); - a_e = dmx_real_e[ch_idx1]; - move16(); - b_fx = dmx_imag_fx[ch_idx1]; - move32(); - b_e = dmx_imag_e[ch_idx1]; - move16(); - c_fx = dmx_real_fx[ch_idx2]; - move32(); - c_e = dmx_real_e[ch_idx2]; - move16(); - d_fx = dmx_imag_fx[ch_idx2]; - move32(); - d_e = dmx_imag_e[ch_idx2]; - move16(); - - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ - L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); - Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cx_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, - &Cx_sum_e[cur_param_band][ch_idx1][ch_idx2] ); -#else /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, dmx_real_fx[ch_idx2] ), add( a_e, dmx_real_e[ch_idx2] ), Mpy_32_32( b_fx, dmx_imag_fx[ch_idx2] ), add( b_e, dmx_imag_e[ch_idx2] ), &tmp_e ); Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cx_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cx_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, &Cx_sum_e[cur_param_band][ch_idx1][ch_idx2] ); -#endif #endif move32(); } @@ -1142,7 +994,6 @@ static void ivas_param_mc_param_est_enc_fx( /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { -#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); a_e = sub( add20gb, a_e ); @@ -1159,8 +1010,6 @@ static void ivas_param_mc_param_est_enc_fx( b_e = 0; move16(); } -#endif -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE a_fx = slot_frame_f_real_fx[ch_idx1][cur_cldfb_band]; b_fx = slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band]; move32(); @@ -1176,39 +1025,6 @@ static void ivas_param_mc_param_est_enc_fx( W_add( W_mult0_32_32( a_fx, c_fx ), W_mult0_32_32( b_fx, d_fx ) ) ); move64(); } -#else - FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) - { -#ifndef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE - a_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &a_e ); - b_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band], add( 20, gb ), 0, 0, &b_e ); - c_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &c_e ); - d_fx = BASOP_Util_Add_Mant32Exp( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], add( 20, gb ), 0, 0, &d_e ); -#else - c_e = norm_l( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band] ); - c_fx = L_shl( slot_frame_f_real_fx[ch_idx2][cur_cldfb_band], c_e ); - c_e = sub( add20gb, c_e ); - if ( c_fx == 0 ) - { - c_e = 0; - move16(); - } - d_e = norm_l( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band] ); - d_fx = L_shl( slot_frame_f_imag_fx[ch_idx2][cur_cldfb_band], d_e ); - d_e = sub( add20gb, d_e ); - if ( d_fx == 0 ) - { - d_e = 0; - move16(); - } -#endif - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ - L_tmp = BASOP_Util_Add_Mant32Exp( Mpy_32_32( a_fx, c_fx ), add( a_e, c_e ), Mpy_32_32( b_fx, d_fx ), add( b_e, d_e ), &tmp_e ); - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], L_tmp, tmp_e, - &Cy_sum_e[cur_param_band][ch_idx1][ch_idx2] ); - move32(); - } -#endif } } } @@ -1222,7 +1038,6 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Cy_sum_real_64[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; move64(); Cy_sum_real_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; @@ -1231,24 +1046,6 @@ static void ivas_param_mc_param_est_enc_fx( move64(); Cy_sum_imag_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; move64(); -#else - Cy_sum_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move32(); - Cy_sum_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move16(); - Cy_sum_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move32(); - Cy_sum_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move16(); - Cy_sum_imag_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move32(); - Cy_sum_imag_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move16(); - Cy_sum_imag_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move32(); - Cy_sum_imag_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move16(); -#endif } } @@ -1256,21 +1053,10 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Cy_sum_real_64[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; move64(); Cy_sum_real_64[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; move64(); -#else - Cy_sum_fx[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move32(); - Cy_sum_e[cur_param_band][hParamMC->lfe_index][ch_idx1] = 0; - move16(); - Cy_sum_fx[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move32(); - Cy_sum_e[cur_param_band][ch_idx1][hParamMC->lfe_index] = 0; - move16(); -#endif } } } @@ -1307,16 +1093,9 @@ static void ivas_param_mc_param_est_enc_fx( /* get ICLDs */ FOR( k = 0; k < nchan_input; ++k ) { -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_CY( Cy_sum_real_64[cur_param_band][k][k], Nrg_fx[k], Nrg_e[k] ); move32(); move16(); -#else - Nrg_fx[k] = Cy_sum_fx[cur_param_band][k][k]; - move32(); - Nrg_e[k] = Cy_sum_e[cur_param_band][k][k]; - move16(); -#endif } FOR( k = 0; k < num_ilds_to_code; ++k ) { @@ -1383,22 +1162,11 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2] = W_add( Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] ); move64(); Cy_sum_imag_64[cur_param_band - 1][ch_idx1][ch_idx2] = W_add( Cy_sum_imag_64[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2] ); move64(); -#else - Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2], - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], - &Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2] ); - move32(); - Cy_sum_imag_fx[cur_param_band - 1][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_imag_fx[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_imag_e[cur_param_band - 1][ch_idx1][ch_idx2], - Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2], - &Cy_sum_imag_e[cur_param_band - 1][ch_idx1][ch_idx2] ); - move32(); -#endif } } } @@ -1422,14 +1190,7 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ++ch_idx2 ) { -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2] = W_add( Cy_sum_real_64[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_real_64[cur_param_band][ch_idx1][ch_idx2] ); -#else - Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2] = BASOP_Util_Add_Mant32Exp( Cy_sum_fx[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2], - Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2], Cy_sum_e[cur_param_band][ch_idx1][ch_idx2], - &Cy_sum_e[cur_param_band - 1][ch_idx1][ch_idx2] ); - move32(); -#endif } } } @@ -1438,7 +1199,6 @@ static void ivas_param_mc_param_est_enc_fx( band_step = 2; move16(); } -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE { // convert the 64 bit fixpoint back into the 48 bit float format FOR( cur_param_band = 0; cur_param_band < PARAM_MC_MAX_PARAMETER_BANDS; cur_param_band++ ) @@ -1454,7 +1214,6 @@ static void ivas_param_mc_param_est_enc_fx( } } } -#endif /* map complex covariances to real values */ FOR( cur_param_band = 0; cur_param_band < hParamMC->max_param_band_abs_cov; cur_param_band += band_step ) @@ -1491,16 +1250,9 @@ static void ivas_param_mc_param_est_enc_fx( { FOR( ch_idx2 = ch_idx1; ch_idx2 < nchan_input; ch_idx2++ ) { -#ifdef MERGE_REQUEST_1378_SPEEDUP_ivas_mc_param_enc_fx_NONBE CONVERT_CY( Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2], imag_part_fx, imag_part_e ); move32(); move16(); -#else - imag_part_fx = Cy_sum_imag_fx[cur_param_band][ch_idx1][ch_idx2]; - move32(); - imag_part_e = Cy_sum_imag_e[cur_param_band][ch_idx1][ch_idx2]; - move16(); -#endif real_part_fx = Cy_sum_fx[cur_param_band][ch_idx1][ch_idx2]; move32(); real_part_e = Cy_sum_e[cur_param_band][ch_idx1][ch_idx2]; diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 9a7c4038b..3040bc24a 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -1073,11 +1073,7 @@ void ivas_qmetadata_enc_sid_encode_fx( /*compute the average direction */ ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[b].azimuth_fx[m], q_direction->band_data[b].elevation_fx[m], direction_vector_fx ); scale_sig32( direction_vector_fx, 3, Q22 - Q30 ); // Q30 -> Q22 -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( avg_direction_vector_fx, direction_vector_fx, avg_direction_vector_fx, 3 ); // Q22 -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( avg_direction_vector_fx, direction_vector_fx, avg_direction_vector_fx, 3, 0 ); // Q22 -#endif /* VEC_ARITH_OPT_v1 */ } ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( avg_direction_vector_fx, Q22, &avg_azimuth_fx[b], &avg_elevation_fx[b] ); @@ -2421,11 +2417,7 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( /*compute the average direction */ ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[i].azimuth_fx[j], q_direction->band_data[i].elevation_fx[j], direction_vector ); scale_sig32( direction_vector, 3, -8 ); // Q30 -> Q22 -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ } } } @@ -2688,11 +2680,7 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( IF( LT_16( idx, 4 ) ) { -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ } } /* project the quantized average azimuth angle to the same grid as the current sample */ @@ -2723,11 +2711,7 @@ static Word16 ivas_qmetadata_entropy_encode_dir_fx( ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[i].azimuth_fx[j], q_direction->band_data[i].elevation_fx[j], direction_vector ); scale_sig32( direction_vector, 3, -8 ); // Q30 -> Q22 -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( avg_direction_vector, direction_vector, avg_direction_vector, 3 ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( avg_direction_vector, direction_vector, avg_direction_vector, 3, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ ivas_qmetadata_direction_vector_to_azimuth_elevation_fx( avg_direction_vector, Q22, &avg_azimuth, &avg_elevation ); avg_azimuth_index_upd = quantize_phi_enc_fx( L_add( avg_azimuth, 180 << Q22 ), 0, &avg_azimuth, avg_azimuth_alphabet ); diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c index f0811aea6..879a98246 100644 --- a/lib_enc/ivas_sce_enc_fx.c +++ b/lib_enc/ivas_sce_enc_fx.c @@ -612,7 +612,6 @@ ivas_error create_evs_sce_enc_fx( { return error; } -#ifdef HARM_PUSH_BIT /*-----------------------------------------------------------------* * Bitstream *-----------------------------------------------------------------*/ @@ -626,11 +625,6 @@ ivas_error create_evs_sce_enc_fx( st_fx->hBstr->nb_bits_tot = 0; move16(); st_fx->hBstr->st_ivas = st_ivas; -#else - st_fx->hBstr->ind_list = ind_list; - // st_fx->hBstr->ind_list_fx = st->hBstr->ind_list; - reset_indices_enc_fx( st_fx->hBstr, MAX_NUM_INDICES ); -#endif hSCE->hCoreCoder[0] = st_fx; diff --git a/lib_enc/ivas_sns_enc_fx.c b/lib_enc/ivas_sns_enc_fx.c index 2eaefb483..e74e2297c 100644 --- a/lib_enc/ivas_sns_enc_fx.c +++ b/lib_enc/ivas_sns_enc_fx.c @@ -672,11 +672,7 @@ Word16 quantize_sns_fx( Word32 ener_side_fx; Word16 ener_side_q; -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( snsQ_out_fx[0][k], snsQ_out_fx[1][k], side_fx, M ); -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( snsQ_out_fx[0][k], snsQ_out_fx[1][k], side_fx, M, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ Word64 L64_sum; L64_sum = 1; diff --git a/lib_enc/ivas_stereo_dmx_evs_fx.c b/lib_enc/ivas_stereo_dmx_evs_fx.c index f84f90e46..f82f8ac13 100644 --- a/lib_enc/ivas_stereo_dmx_evs_fx.c +++ b/lib_enc/ivas_stereo_dmx_evs_fx.c @@ -98,10 +98,8 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576 -#ifdef FIX_1511_POC_RENORM #define STEREO_DMX_EVS_POC_RENORM_TH 33554432 // 65536 << 9 #define STEREO_DMX_EVS_POC_RENORM_SHIFT 3 -#endif const Word32 ipd_ff_Q31[STEREO_DMX_EVS_NB_SUBBAND_MAX] = { 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, 2027355264, @@ -417,7 +415,6 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); -#ifdef FIX_1511_POC_RENORM IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && @@ -428,7 +425,6 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } -#endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -442,7 +438,6 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); -#ifdef FIX_1511_POC_RENORM IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && @@ -453,7 +448,6 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } -#endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -476,7 +470,6 @@ static void calc_poc_fx( Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) ); Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) ); -#ifdef FIX_1511_POC_RENORM IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && @@ -487,7 +480,6 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } -#endif specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -500,7 +492,6 @@ static void calc_poc_fx( Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) ); Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) ); -#ifdef FIX_1511_POC_RENORM IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) && @@ -511,7 +502,6 @@ static void calc_poc_fx( Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT ); Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT ); } -#endif specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e move32(); @@ -2486,7 +2476,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( fad_g = hStereoDmxEVS->hPHA->fad_g_fx; // fad_r = 1.0f / (float) ( fad_len + 1 ); -#ifdef FIX_1481_HARDCODE_DIV SWITCH( fad_len ) { case STEREO_DMX_EVS_FAD_LEN_16: @@ -2511,9 +2500,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( fad_r = BASOP_Util_Divide3232_Scale_newton( 1, add( fad_len, 1 ), &tmp_e ); BREAK; } -#else - fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); -#endif fad_r = L_shl_r( fad_r, tmp_e ); fad_len2 = shr( fad_len, 1 ); FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len2; ( n++, m-- ) ) @@ -2631,7 +2617,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( move16(); fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx; // fad_r = 1.0f / (float) ( fad_len + 1 ); -#ifdef FIX_1481_HARDCODE_DIV SWITCH( fad_len ) { case STEREO_DMX_EVS_FADE_LEN_PRC_Q0 * 16: @@ -2656,9 +2641,6 @@ ivas_error stereo_dmx_evs_init_encoder_fx( fad_r = BASOP_Util_Divide3232_Scale_newton( 1, add( fad_len, 1 ), &tmp_e ); BREAK; } -#else - fad_r = BASOP_Util_Divide3232_Scale_cadence( 1, add( fad_len, 1 ), &tmp_e ); -#endif fad_r = L_shl_r( fad_r, tmp_e ); fad_len2 = shr( fad_len, 1 ); FOR( ( n = 0, m = ( fad_len - 1 ) ); n < fad_len2; ( n++, m-- ) ) diff --git a/lib_enc/ivas_stereo_icbwe_enc_fx.c b/lib_enc/ivas_stereo_icbwe_enc_fx.c index 95c49aeae..ff5d67d6a 100644 --- a/lib_enc/ivas_stereo_icbwe_enc_fx.c +++ b/lib_enc/ivas_stereo_icbwe_enc_fx.c @@ -828,11 +828,7 @@ void stereo_icBWE_enc_ivas_fx( ELSE { -#ifndef FIX_1713_EXP - max_e = s_max( hStereoICBWE->mem_shb_speech_nonref_e, shb_speech_nonref_e ); -#else max_e = s_max( hStereoICBWE->mem_shb_speech_ref_e, shb_speech_ref_e ); -#endif Copy_Scale_sig( hStereoICBWE->mem_shb_speech_ref_fx, hStereoICBWE->mem_shb_speech_ref_fx, L_LOOK_16k, negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ) ); // mem_shb_speech_ref_e set32_fx( shb_frame_ref_fx, 0, L_LOOK_16k + L_FRAME16k ); @@ -858,11 +854,7 @@ void stereo_icBWE_enc_ivas_fx( /* shb_frame_ref_ICBWE @ (8.75 - shb_speech_delay (=1.25) ms) after shb_speech */ Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ -#ifndef FIX_1713_EXP - Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_ref_e ) ), Q16 ) ); // mem_shb_speech_ref_e -#else Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e -#endif /* core switching reset */ test(); diff --git a/lib_enc/lib_enc_fx.c b/lib_enc/lib_enc_fx.c index 1771f875a..27de8ad87 100644 --- a/lib_enc/lib_enc_fx.c +++ b/lib_enc/lib_enc_fx.c @@ -609,53 +609,6 @@ ivas_error IVAS_ENC_ConfigureForAmbisonics( return error; } -#ifndef HARM_ENC_INIT -ivas_error IVAS_ENC_ConfigureForAmbisonics_fx( - IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ - const Word32 inputFs, /* i : input sampling frequency */ - const Word32 bitrate, /* i : requested bitrate of the output bitstream */ - const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ - const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ - const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ - const IVAS_ENC_SBA_ORDER order, /* i : order of the Ambisonics input */ - const bool isPlanar, /* i : if true, input is treated as planar Ambisonics */ - const bool Opt_PCA_ON /* i : PCA option flag */ -) -{ - ENCODER_CONFIG_HANDLE hEncoderConfig; - ivas_error error; - - IF( ( error = doCommonConfigureChecks( hIvasEnc ) ) != IVAS_ERR_OK ) - { - return error; - } - - hEncoderConfig = hIvasEnc->st_ivas->hEncoderConfig; - - hEncoderConfig->ivas_format = SBA_FORMAT; - hEncoderConfig->element_mode_init = IVAS_SCE; /* Just needs to be something not mono, will be set later */ - hEncoderConfig->sba_planar = isPlanar; - hEncoderConfig->sba_order = order; - move16(); - move16(); - move16(); - - /* Input in ACN/SN3D in all cases (3D and planar): get number of channels */ - hEncoderConfig->nchan_inp = ivas_sba_get_nchan_fx( hEncoderConfig->sba_order, 0 ); /*planar input arg. deliberately set to zero since input always in ACN/SN3D*/ - move16(); - - - hEncoderConfig->Opt_PCA_ON = (Word16) Opt_PCA_ON; - move16(); - - hIvasEnc->maxBandwidthUser = max_bwidth_user; - - error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); - - - return error; -} -#endif /*---------------------------------------------------------------------* * IVAS_ENC_ConfigureForSBAObjects() * @@ -1213,340 +1166,6 @@ static ivas_error configureEncoder( return error; } -#ifndef HARM_ENC_INIT -static ivas_error configureEncoder_fx( - IVAS_ENC_HANDLE hIvasEnc, - const Word32 inputFs, - const Word32 initBitrate, - const IVAS_ENC_BANDWIDTH initBandwidth, - const IVAS_ENC_DTX_CONFIG dtxConfig, - const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig ) -{ - Encoder_Struct *st_ivas; - ENCODER_CONFIG_HANDLE hEncoderConfig; - ivas_error error; - Word32 cpe_brate; - - error = IVAS_ERR_OK; - - st_ivas = hIvasEnc->st_ivas; - hEncoderConfig = st_ivas->hEncoderConfig; - - /*-----------------------------------------------------------------* - * Bandwidth limitation - *-----------------------------------------------------------------*/ - - IF( ( error = setBandwidth_fx( hIvasEnc, initBandwidth ) ) != IVAS_ERR_OK ) - { - return error; - } - - /*-----------------------------------------------------------------* - * DTX/CNG - *-----------------------------------------------------------------*/ - - IF( dtxConfig.enabled ) - { - hEncoderConfig->Opt_DTX_ON = 1; - move16(); - - IF( dtxConfig.variable_SID_rate ) - { - hEncoderConfig->var_SID_rate_flag = 1; - hEncoderConfig->interval_SID = 0; - move16(); - move16(); - } - ELSE - { - hEncoderConfig->var_SID_rate_flag = 0; - move16(); - test(); - IF( GE_16( dtxConfig.SID_interval, 3 ) && LE_16( dtxConfig.SID_interval, 100 ) ) - { - hEncoderConfig->interval_SID = dtxConfig.SID_interval; - move16(); - } - ELSE - { - return IVAS_ERR_INVALID_DTX_UPDATE_RATE; - } - } - } - ELSE - { - hEncoderConfig->Opt_DTX_ON = 0; - move16(); - } - - /*-----------------------------------------------------------------* - * Bitrate - *-----------------------------------------------------------------*/ - - hEncoderConfig->ivas_total_brate = initBitrate; - move16(); - - /* SC-VBR at 5.90 kbps */ - IF( EQ_32( hEncoderConfig->ivas_total_brate, ACELP_5k90 ) ) - { - hEncoderConfig->ivas_total_brate = ACELP_7k20; - hEncoderConfig->Opt_SC_VBR = 1; - hEncoderConfig->last_Opt_SC_VBR = hEncoderConfig->Opt_SC_VBR; - move32(); - move16(); - move16(); - - IF( ( hEncoderConfig->max_bwidth != NB ) ) - { - hEncoderConfig->max_bwidth = WB; - move16(); - } - } - - /* check if the entered bitrate is supported */ - test(); - IF( NE_16( hEncoderConfig->ivas_format, UNDEFINED_FORMAT ) && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) /* IVAS */ - { - IF( !is_IVAS_bitrate_fx( hEncoderConfig->ivas_total_brate ) ) - { - IF( hEncoderConfig->Opt_SC_VBR ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", ACELP_5k90 ); - } - ELSE - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in IVAS [bps]: %d", hEncoderConfig->ivas_total_brate ); - } - } - - IF( EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) ) - { - { - hEncoderConfig->element_mode_init = IVAS_CPE_DFT; - move16(); - IF( GE_32( hEncoderConfig->ivas_total_brate, MIN_BRATE_MDCT_STEREO ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - } - - test(); - test(); - IF( ( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_TD ) || EQ_32( hEncoderConfig->element_mode_init, IVAS_CPE_DFT ) ) && GT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for TD/DFT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } - - test(); - IF( EQ_16( hEncoderConfig->element_mode_init, IVAS_CPE_MDCT ) && LT_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for MDCT Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } - - test(); - IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_256k ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too high bitrate for Stereo specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, ISM_FORMAT ) ) - { - IF( ( error = sanitizeBitrateISM_fx( hEncoderConfig, hIvasEnc->extMetadataApi ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) ) - { - /* nothing */ - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, MASA_FORMAT ) ) - { - /* adapt element_mode according to the bitrate */ - test(); - IF( EQ_16( hEncoderConfig->nchan_inp, 2 ) && NE_16( hEncoderConfig->element_mode_init, IVAS_SCE ) ) - { - IF( GE_32( hEncoderConfig->ivas_total_brate, IVAS_48k ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - ELSE IF( LT_32( hEncoderConfig->ivas_total_brate, MASA_STEREO_MIN_BITRATE ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_DFT; - move16(); - } - } - } - ELSE IF( EQ_32( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) ) - { - st_ivas->ism_mode = ivas_omasa_ism_mode_select_fx( st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism ); - - cpe_brate = calculate_cpe_brate_MASA_ISM_fx( st_ivas->ism_mode, st_ivas->hEncoderConfig->ivas_total_brate, hEncoderConfig->nchan_ism ); - - /*adapt element_mode according to the bit-rate*/ - IF( NE_16( hEncoderConfig->element_mode_init, IVAS_SCE ) ) - { - IF( GE_32( cpe_brate, IVAS_48k ) ) - { - hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; - move16(); - } - } - } - ELSE IF( EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) - { - st_ivas->ism_mode = ISM_MODE_NONE; - } - } - ELSE /* EVS mono */ - { - hEncoderConfig->ivas_format = MONO_FORMAT; - hEncoderConfig->element_mode_init = EVS_MONO; - move16(); - - IF( !is_EVS_bitrate( hEncoderConfig->ivas_total_brate, &hEncoderConfig->Opt_AMR_WB ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Incorrect bitrate specification in EVS mono: %d", hEncoderConfig->ivas_total_brate ); - } - - IF( EQ_16( hEncoderConfig->stereo_dmx_evs, 1 ) ) - { - hEncoderConfig->nchan_inp = 2; - move16(); - } - } - - /*-----------------------------------------------------------------* - * Input sampling frequency - *-----------------------------------------------------------------*/ - test(); - test(); - test(); - IF( NE_32( inputFs, 8000 ) && NE_32( inputFs, 16000 ) && NE_32( inputFs, 32000 ) && NE_32( inputFs, 48000 ) ) - { - return IVAS_ERR_INVALID_SAMPLING_RATE; - } - - hEncoderConfig->input_Fs = inputFs; - move32(); - - /*-----------------------------------------------------------------* - * Channel-aware mode - *-----------------------------------------------------------------*/ - - IF( ( error = setChannelAwareConfig_fx( hIvasEnc, caConfig ) ) != IVAS_ERR_OK ) - { - return error; - } - - /*-----------------------------------------------------------------* - * Set codec mode - *-----------------------------------------------------------------*/ - - st_ivas->codec_mode = MODE1; /* Note: in IVAS, set MODE1 */ - move16(); - - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { - IF( hEncoderConfig->Opt_AMR_WB ) - { - st_ivas->codec_mode = MODE1; - move16(); - } - ELSE - { - st_ivas->codec_mode = get_codec_mode( hEncoderConfig->ivas_total_brate ); - move16(); - } - } - - test(); - IF( EQ_32( hEncoderConfig->ivas_total_brate, IVAS_13k2 ) && EQ_16( hEncoderConfig->Opt_RF_ON, 1 ) ) - { - st_ivas->codec_mode = MODE2; - move16(); - } - - st_ivas->last_codec_mode = st_ivas->codec_mode; - move16(); - - /*-----------------------------------------------------------------* - * Sanity checks - *-----------------------------------------------------------------*/ - - assert( hEncoderConfig->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); - - test(); - test(); - IF( ( NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) || hEncoderConfig->stereo_dmx_evs ) && EQ_32( hEncoderConfig->input_Fs, 8000 ) ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( hEncoderConfig->Opt_DTX_ON && NE_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && - ( ( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) && GT_32( ivas_get_sba_num_TCs_fx( hEncoderConfig->ivas_total_brate, 1 ), 2 ) ) || - EQ_16( hEncoderConfig->ivas_format, MC_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, MASA_ISM_FORMAT ) || EQ_16( hEncoderConfig->ivas_format, SBA_ISM_FORMAT ) ) ) - { - return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); - } - - test(); - test(); - test(); - IF( hEncoderConfig->Opt_PCA_ON && !( EQ_16( hEncoderConfig->ivas_format, SBA_FORMAT ) && EQ_32( hEncoderConfig->ivas_total_brate, PCA_BRATE ) && EQ_16( hEncoderConfig->sba_order, SBA_FOA_ORDER ) ) ) - { - return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "PCA supported at SBA FOA 256 kbps only." ); - } - - IF( ( error = sanitizeBandwidth_fx( hIvasEnc ) ) != IVAS_ERR_OK ) - { - return error; - } - - test(); - test(); - test(); - IF( hEncoderConfig->is_binaural && !( ( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && hEncoderConfig->stereo_dmx_evs ) || EQ_16( hEncoderConfig->ivas_format, STEREO_FORMAT ) ) ) - { - return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "'-binaural' option is supported only with '-stereo' or '-stereo_dmx_evs'" ); - } - - /*-----------------------------------------------------------------* - * Finalize initialization - *-----------------------------------------------------------------*/ - - IF( ( error = ivas_init_encoder_fx( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) ) - { - hIvasEnc->hCoreCoder = st_ivas->hSCE[0]->hCoreCoder[0]; /* Note: this is needed for switching in EVS mono */ - } - ELSE - { - hIvasEnc->hCoreCoder = NULL; - } - - hIvasEnc->Opt_RF_ON_loc = hEncoderConfig->Opt_RF_ON; - hIvasEnc->rf_fec_offset_loc = hEncoderConfig->rf_fec_offset; - move16(); - move16(); - - hIvasEnc->isConfigured = true; - - return error; -} -#endif /*---------------------------------------------------------------------* * IVAS_ENC_GetDelay() * @@ -1826,7 +1445,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( /* set pointers to the new buffers of indices in each element */ FOR( n = 0; n < st_ivas->nSCE; n++ ) { -#ifdef HARM_PUSH_BIT st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; @@ -1835,23 +1453,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; } -#else - test(); - IF( !( hIvasEnc->hCoreCoder == NULL && EQ_32( hEncoderConfig->ivas_format, MONO_FORMAT ) ) ) - { - if ( ( hEncoderConfig->element_mode_init != EVS_MONO ) ) - { - st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; - } - st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; - } - - IF( st_ivas->hSCE[n]->hMetaData != NULL ) - { - st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; - st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; - } -#endif } FOR( n = 0; n < st_ivas->nCPE; n++ ) @@ -1916,21 +1517,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } /* write indices into bitstream buffer */ -#ifndef HARM_PUSH_BIT - IF( hEncoderConfig->element_mode_init == EVS_MONO ) - { - test(); - IF( EQ_16( hEncoderConfig->ivas_format, MONO_FORMAT ) && ( hCoreCoder->element_mode == EVS_MONO ) ) - { - /* write indices into bitstream file */ - UWord8 pFrame[( MAX_BITS_PER_FRAME + 7 ) >> 3]; - Word16 pFrame_size = 0; - move16(); - write_indices_buf_fx( hCoreCoder, hCoreCoder->hBstr, outputBitStream, pFrame, pFrame_size, numOutBits ); - } - } - ELSE -#endif { write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits #ifdef DBG_BITSTREAM_ANALYSIS diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index fd983741b..59f3b35f6 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -2181,11 +2181,7 @@ Word16 ivas_smc_gmm_fx( } /* PCA */ -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( FV_fx, pca_mean_fx, FV_fx, N_SMC_FEATURES ); -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( FV_fx, pca_mean_fx, FV_fx, N_SMC_FEATURES, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ v_mult_mat_fixed( FV_fx, FV_fx, pca_components_fx, N_SMC_FEATURES, N_PCA_COEF, 0 ); /*------------------------------------------------------------------* * Calculation of posterior probability diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 0647b6ebc..85261a3a7 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -95,10 +95,6 @@ typedef struct bitstream_enc_data_structure void *st_ivas; /* IVAS encoder structure */ // Word16 nb_bits_tot_fx; /* total number of bits already written */ // Indice *ind_list_fx; /* list of indices */ -#ifndef HARM_PUSH_BIT - Word16 next_ind_fx; /* pointer to the next empty slot in the list of indices */ - Word16 last_ind_fx; /* last written indice */ -#endif } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* diff --git a/lib_enc/swb_pre_proc_fx.c b/lib_enc/swb_pre_proc_fx.c index 0e89e16c1..85277e298 100644 --- a/lib_enc/swb_pre_proc_fx.c +++ b/lib_enc/swb_pre_proc_fx.c @@ -1275,11 +1275,7 @@ void swb_pre_proc_ivas_fx( thr = icbwe_thr_TDM_fx; regV = icbwe_regressionValuesTDM_fx; -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_fx_32, -1, 0, 0, st->cldfbSynTd ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( realBufferFlipped, imagBufferFlipped, shb_speech_fx_32, -1, 0, st->cldfbSynTd ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ Copy_Scale_sig_32_16( shb_speech_fx_32, shb_speech, L_FRAME16k, negate( sub( q_reImBuffer, 1 ) ) ); *Q_shb_spch = 0; move16(); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 08c920c4a..6b65f9afa 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -5697,11 +5697,7 @@ static void Quant_shb_res_gshape_fx( move16(); IF( NE_16( st_fx->codec_mode, MODE2 ) ) { -#ifdef FIX_1486_IND_SHB_RES push_indice( st_fx->hBstr, IND_SHB_RES_GS + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); -#else - push_indice( st_fx->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); -#endif } } } @@ -5737,11 +5733,7 @@ static void Quant_shb_res_gshape_ivas_fx( } ELSE { -#ifdef FIX_1486_IND_SHB_RES push_indice( st->hBstr, IND_SHB_RES_GS + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); -#else - push_indice( st->hBstr, IND_SHB_RES_GS1 + i, idxSubGain_fx[i], NUM_BITS_SHB_RES_GS ); -#endif } } } @@ -7321,12 +7313,8 @@ void fb_tbe_enc_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fhb_buffer[L_FRAME48k + 4]; Word16 *input_fhb = &input_fhb_buffer[0] + 4; -#else - Word16 input_fhb[L_FRAME48k]; -#endif Word16 Sample_Delay_HP; Word32 fb_exc_energy, temp2; Word32 L_tmp; @@ -7352,16 +7340,10 @@ void fb_tbe_enc_fx( Copy_Scale_sig( new_input, input_fhb, L_FRAME48k, exp_temp ); -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 st->element_mode, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#else - elliptic_bpf_48k_generic_fx( input_fhb, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#endif Sample_Delay_HP = NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2; IF( NE_16( st->last_extl, FB_TBE ) ) @@ -7459,12 +7441,8 @@ void fb_tbe_enc_ivas_fx( Word16 ratio; Word16 tmp_vec[L_FRAME48k]; Word16 idxGain; -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic Word16 input_fhb_new_buffer[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) + 4]; Word16 *input_fhb_new = &input_fhb_new_buffer[0] + 4; -#else - Word16 input_fhb_new[L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS )]; -#endif Word16 input_fhb[L_FRAME48k]; Word16 Sample_Delay_HP; Word64 fb_exc_energy; @@ -7491,29 +7469,17 @@ void fb_tbe_enc_ivas_fx( exp_temp = add( exp_temp, Q_new_input ); IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 st->element_mode, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#else - elliptic_bpf_48k_generic_fx( input_fhb_new, &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#endif } ELSE { -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic elliptic_bpf_48k_generic_fx( -#ifdef FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2 st->element_mode, -#endif /*FIX_1439_SPEEDUP_SIMPLIFY_elliptic_bpf_48k_generic_STAGE2*/ 0, // IsUpsampled3 input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#else - elliptic_bpf_48k_generic_fx( input_fhb_new + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ), &exp_temp, tmp_vec, hBWE_TD->elliptic_bpf_2_48k_mem_fx, hBWE_TD->elliptic_bpf_2_48k_mem_fx_Q, full_band_bpf_2_fx ); -#endif } test(); diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 29154688e..9a15cec28 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -3786,11 +3786,7 @@ void ProcessIGF_fx( Word16 igfGridIdx; Word16 isIndepFlag; Word16 bsBits; -#ifndef HARM_PUSH_BIT - Word16 bsStart, pBsStart; -#else Word16 pBsStart; -#endif BSTR_ENC_HANDLE hBstr = st->hBstr; IGF_ENC_INSTANCE_HANDLE hIGFEnc = st->hIGFEnc; @@ -3867,9 +3863,6 @@ void ProcessIGF_fx( } } -#ifndef HARM_PUSH_BIT - bsStart = hBstr->next_ind_fx; -#endif move16(); hInstance->infoTotalBitsPerFrameWritten = 0; move16(); @@ -3877,18 +3870,6 @@ void ProcessIGF_fx( { IGFEncWriteBitstream_fx( hInstance, NULL, &hInstance->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); } -#ifndef HARM_PUSH_BIT - ELSE - { - IGFEncWriteBitstream_fx( hInstance, st->hBstr, &hInstance->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); - } - - bsBits = sub( hBstr->next_ind_fx, bsStart ); - IF( !isTCX20 ) - { - IGFEncConcatenateBitstream_fx( hInstance, bsBits, &hBstr->next_ind_fx, &hBstr->nb_bits_tot, hBstr->ind_list ); - } -#else ELSE { pBsStart = hBstr->nb_ind_tot; @@ -3899,7 +3880,6 @@ void ProcessIGF_fx( bsBits = sub( hBstr->nb_ind_tot, pBsStart ); IGFEncConcatenateBitstream_ivas_fx( hIGFEnc, bsBits, hBstr ); } -#endif } void attenuateNbSpectrum_fx( Word16 L_frame, Word32 *spectrum ) diff --git a/lib_enc/transition_enc_fx.c b/lib_enc/transition_enc_fx.c index 82e41026d..c1c032e4e 100644 --- a/lib_enc/transition_enc_fx.c +++ b/lib_enc/transition_enc_fx.c @@ -2081,11 +2081,7 @@ static void tc_enc_ivas_fx( /*--------------------------------------------------------------* * compute glottal-shape codebook excitation *--------------------------------------------------------------*/ -#ifdef TEST_HR Copy( h1, h1_fx, L_SUBFR + ( M + 1 ) ); -#else - Copy_Scale_sig( h1, h1_fx, L_SUBFR + ( M + 1 ), 1 ); -#endif /* create filtered glottal codebook contribution */ conv_fx( &exc_fx[i_subfr], h1_fx, yy1_fx, L_SUBFR ); diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index df75d6d0a..e170afdc6 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -496,11 +496,7 @@ static void ivas_dirac_dmx_fx( v_add_fx( data_in_fx[0], data_in_fx[1], data_out_fx[0], input_frame ); v_multc_fixed( data_out_fx[0], ONE_IN_Q30, data_out_fx[0], input_frame ); // ONE_IN_Q30 = 0.5* ONE_IN_Q31 -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( data_in_fx[0], data_in_fx[1], data_out_fx[1], input_frame ); -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( data_in_fx[0], data_in_fx[1], data_out_fx[1], input_frame, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ v_multc_fixed( data_out_fx[1], ONE_IN_Q30, data_out_fx[1], input_frame ); FOR( i = 0; i < nchan_transport; i++ ) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index c92f800af..656d8f732 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -694,9 +694,7 @@ static void ivas_dirac_dec_binaural_internal_fx( move32(); move32(); move32(); -#ifdef OPT_BIN_RENDERER_V1 Word16 ch_len = s_max( 4, numInChannels ); -#endif /* OPT_BIN_RENDERER_V1 */ FOR( i = 0; i < 6; i++ ) { FOR( j = 0; j < 4; j++ ) @@ -856,24 +854,11 @@ static void ivas_dirac_dec_binaural_internal_fx( Scale_sig( st_ivas->hSpar->hFbMixer->cldfb_cross_fade_fx, CLDFB_NO_COL_MAX, Q15 - st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q ); st_ivas->hSpar->hFbMixer->cldfb_cross_fade_q = Q15; move16(); -#ifndef OPT_BIN_RENDERER_V1 - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q31 - Q22 ); /*Q31 to Q22*/ - } -#endif /* OPT_BIN_RENDERER_V1 */ ivas_sba_prototype_renderer_fx( st_ivas, Cldfb_RealBuffer_in_fx, Cldfb_ImagBuffer_in_fx, q_cldfb, subframe ); -#ifndef OPT_BIN_RENDERER_V1 - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - Scale_sig32( st_ivas->hSpar->hFbMixer->pFb->fb_bin_to_band.pp_cldfb_weights_per_spar_band_fx[idx], IVAS_MAX_NUM_FB_BANDS, Q22 - Q31 ); /*Q31 to Q22*/ - } -#endif /* OPT_BIN_RENDERER_V1 */ } Word16 q_inp = Q6; move16(); -#ifdef OPT_BIN_RENDERER_V1 FOR( Word16 cha = 0; cha < ch_len; cha++ ) { FOR( slot = 0; slot < 4; slot++ ) @@ -888,18 +873,6 @@ static void ivas_dirac_dec_binaural_internal_fx( move16(); } } -#else /* OPT_BIN_RENDERER_V1 */ - FOR( Word16 cha = 0; cha < 6; cha++ ) - { - FOR( slot = 0; slot < 4; slot++ ) - { - scale_sig32( Cldfb_RealBuffer_in_fx[cha][slot], 60, sub( q_inp, q_cldfb[cha][slot] ) ); // Q6 - scale_sig32( Cldfb_ImagBuffer_in_fx[cha][slot], 60, sub( q_inp, q_cldfb[cha][slot] ) ); // Q6 - q_cldfb[cha][slot] = 6; - move16(); - } - } -#endif /* OPT_BIN_RENDERER_V1 */ test(); test(); @@ -1876,7 +1849,6 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( q_CrEne = Q31; move16(); -#ifdef OPT_BIN_RENDERER_V1 Word16 q_diff = sub( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ); IF( q_diff > 0 ) @@ -1945,67 +1917,6 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices_fx( move32(); move16(); move16(); -#else /* OPT_BIN_RENDERER_V1 */ - IF( GT_16( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ) - { - hDiracDecBin->ChEne_fx[1][bin] = L_shr( hDiracDecBin->ChEne_fx[1][bin], sub( hDiracDecBin->ChEne_e[0][bin], hDiracDecBin->ChEne_e[1][bin] ) ); - hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[0][bin] ); - hDiracDecBin->ChEne_e[1][bin] = hDiracDecBin->ChEne_e[0][bin]; - } - ELSE - { - hDiracDecBin->ChEne_fx[0][bin] = L_shr( hDiracDecBin->ChEne_fx[0][bin], sub( hDiracDecBin->ChEne_e[1][bin], hDiracDecBin->ChEne_e[0][bin] ) ); - hDiracDecBin->q_ChEne = sub( 31, hDiracDecBin->ChEne_e[1][bin] ); - hDiracDecBin->ChEne_e[0][bin] = hDiracDecBin->ChEne_e[1][bin]; - } - move32(); - move16(); - - IF( GT_16( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ) ) - { - hDiracDecBin->ChEneOut_fx[1][bin] = L_shr( hDiracDecBin->ChEneOut_fx[1][bin], sub( hDiracDecBin->ChEneOut_e[0][bin], hDiracDecBin->ChEneOut_e[1][bin] ) ); - hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[0][bin] ); - hDiracDecBin->ChEneOut_e[1][bin] = hDiracDecBin->ChEneOut_e[0][bin]; - } - ELSE - { - hDiracDecBin->ChEneOut_fx[0][bin] = L_shr( hDiracDecBin->ChEneOut_fx[0][bin], sub( hDiracDecBin->ChEneOut_e[1][bin], hDiracDecBin->ChEneOut_e[0][bin] ) ); - hDiracDecBin->q_ChEneOut = sub( 31, hDiracDecBin->ChEneOut_e[1][bin] ); - hDiracDecBin->ChEneOut_e[0][bin] = hDiracDecBin->ChEneOut_e[1][bin]; - } - move32(); - move16(); - - IF( GT_16( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ) ) - { - hDiracDecBin->ChCrossIm_fx[bin] = L_shr( hDiracDecBin->ChCrossIm_fx[bin], sub( hDiracDecBin->ChCrossRe_e[bin], hDiracDecBin->ChCrossIm_e[bin] ) ); - hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossRe_e[bin] ); - hDiracDecBin->ChCrossIm_e[bin] = hDiracDecBin->ChCrossRe_e[bin]; - } - ELSE - { - hDiracDecBin->ChCrossRe_fx[bin] = L_shr( hDiracDecBin->ChCrossRe_fx[bin], sub( hDiracDecBin->ChCrossIm_e[bin], hDiracDecBin->ChCrossRe_e[bin] ) ); - hDiracDecBin->q_ChCross = sub( 31, hDiracDecBin->ChCrossIm_e[bin] ); - hDiracDecBin->ChCrossRe_e[bin] = hDiracDecBin->ChCrossIm_e[bin]; - } - move32(); - move16(); - - IF( GT_16( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ) ) - { - hDiracDecBin->ChCrossImOut_fx[bin] = L_shr( hDiracDecBin->ChCrossImOut_fx[bin], sub( hDiracDecBin->ChCrossReOut_e[bin], hDiracDecBin->ChCrossImOut_e[bin] ) ); - hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossReOut_e[bin] ); - hDiracDecBin->ChCrossImOut_e[bin] = hDiracDecBin->ChCrossReOut_e[bin]; - } - ELSE - { - hDiracDecBin->ChCrossReOut_fx[bin] = L_shr( hDiracDecBin->ChCrossReOut_fx[bin], sub( hDiracDecBin->ChCrossImOut_e[bin], hDiracDecBin->ChCrossReOut_e[bin] ) ); - hDiracDecBin->q_ChCrossOut = sub( 31, hDiracDecBin->ChCrossImOut_e[bin] ); - hDiracDecBin->ChCrossReOut_e[bin] = hDiracDecBin->ChCrossImOut_e[bin]; - } - move32(); - move16(); -#endif /* OPT_BIN_RENDERER_V1 */ formulate2x2MixingMatrix_fx( hDiracDecBin->ChEne_fx[0][bin], hDiracDecBin->ChEne_fx[1][bin], hDiracDecBin->q_ChEne, @@ -2515,10 +2426,8 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word32 *decSlotImPointer_fx; Word16 q_inp_mix, q_reverb = 31; move16(); -#ifdef OPT_BIN_RENDERER_V1 Word16 ch_len = s_max( 4, numInChannels ); Word16 eff_q; -#endif /* OPT_BIN_RENDERER_V1 */ IF( processReverb ) @@ -2532,11 +2441,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( Word16 shift = s_min( L_norm_arr( cldfbSynDec[0]->cldfb_state_fx, cldfbSynDec[0]->p_filter_length ), L_norm_arr( cldfbSynDec[1]->cldfb_state_fx, cldfbSynDec[1]->p_filter_length ) ); q_inp_mix = 31; move16(); -#ifdef OPT_BIN_RENDERER_V1 FOR( Word16 i = 0; i < ch_len; i++ ) -#else /* OPT_BIN_RENDERER_V1 */ - FOR( Word16 i = 0; i < 6; i++ ) -#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < nSlots; j++ ) { @@ -2564,13 +2469,9 @@ static void ivas_dirac_dec_binaural_process_output_fx( } -#ifdef OPT_BIN_RENDERER_V1 eff_q = sub( add( q_inp_mix, q_mat ), 15 ); FOR( Word16 i = 0; i < ch_len; i++ ) -#else /* OPT_BIN_RENDERER_V1 */ - FOR( Word16 i = 0; i < 6; i++ ) -#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < nSlots; j++ ) { @@ -2580,13 +2481,8 @@ static void ivas_dirac_dec_binaural_process_output_fx( test(); IF( processReverb && LT_16( i, 2 ) ) { -#ifdef OPT_BIN_RENDERER_V1 scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, eff_q ); /*q_inp_mix+q_mat-15*/ scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, eff_q ); /*q_inp_mix+q_mat-15*/ -#else /* OPT_BIN_RENDERER_V1 */ - scale_sig32( reverbRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ - scale_sig32( reverbIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( add( q_inp_mix, q_mat ), 15 ) ); /*q_inp_mix+q_mat-15*/ -#endif /* OPT_BIN_RENDERER_V1 */ } } } @@ -2713,11 +2609,7 @@ static void ivas_dirac_dec_binaural_process_output_fx( outSlotRePr_fx = &( outSlotRe_fx[0] ); outSlotImPr_fx = &( outSlotIm_fx[0] ); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, 0, cldfbSynDec[chA] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( &outSlotRePr_fx, &outSlotImPr_fx, &( output_fx[chA][nBins * slot + offsetSamples] ), nBins, 0, cldfbSynDec[chA] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ cldfbSynDec[chA]->Q_cldfb_state = sub( q_result, 1 ); move16(); } @@ -2748,11 +2640,7 @@ static void adaptTransportSignalsHeadtracked_fx( Word16 e_div, is_zero, i; move16(); -#ifdef OPT_BIN_RENDERER_V1 FOR( i = 0; i < 2; i++ ) -#else /* OPT_BIN_RENDERER_V1 */ - FOR( i = 0; i < 6; i++ ) -#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < nSlots; j++ ) { @@ -4389,18 +4277,11 @@ static void formulate2x2MixingMatrix_fx( Sx_fx[1] = Sqrt32( Sx_fx[1], &exp1 ); move32(); q_Sx = sub( 31, s_max( exp, exp1 ) ); -#ifdef OPT_BIN_RENDERER_V1 Word16 q_diff = sub( 31, q_Sx ); Sx_fx[0] = L_shr( Sx_fx[0], sub( q_diff, exp ) ); // q_Sx move32(); Sx_fx[1] = L_shr( Sx_fx[1], sub( q_diff, exp1 ) ); // q_Sx move32(); -#else /* OPT_BIN_RENDERER_V1 */ - Sx_fx[0] = L_shr( Sx_fx[0], sub( sub( 31, exp ), q_Sx ) ); // q_Sx - move32(); - Sx_fx[1] = L_shr( Sx_fx[1], sub( sub( 31, exp1 ), q_Sx ) ); // q_Sx - move32(); -#endif /* OPT_BIN_RENDERER_V1 */ matrixDiagMul_fx( Uxre_fx, Uxim_fx, q_Ux, Sx_fx, q_Sx, Kxre_fx, Kxim_fx, &q_Kx ); @@ -4468,18 +4349,11 @@ static void formulate2x2MixingMatrix_fx( move32(); q_Ghat = sub( 31, s_max( exp, exp1 ) ); -#ifdef OPT_BIN_RENDERER_V1 q_diff = sub( 31, q_Ghat ); Ghat_fx[0] = L_shr( Ghat_fx[0], sub( q_diff, exp ) ); // q_Ghat move32(); Ghat_fx[1] = L_shr( Ghat_fx[1], sub( q_diff, exp1 ) ); // q_Ghat move32(); -#else /* OPT_BIN_RENDERER_V1 */ - Ghat_fx[0] = L_shr( Ghat_fx[0], sub( sub( 31, exp ), q_Ghat ) ); // q_Ghat - move32(); - Ghat_fx[1] = L_shr( Ghat_fx[1], sub( sub( 31, exp1 ), q_Ghat ) ); // q_Ghat - move32(); -#endif /* OPT_BIN_RENDERER_V1 */ /* Matrix multiplication, tmp = Ky' * G_hat * Q */ FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) @@ -4551,28 +4425,9 @@ static void formulate2x2MixingMatrix_fx( move32(); // 1310720000 = 10,000.0f in Q17 -#ifdef OPT_BIN_RENDERER_V1 Word32 thresh = L_shl_sat( 1310720000, sub( q_div, Q17 ) ); // q_div div_fx[0] = L_min( div_fx[0], thresh ); // q_div div_fx[1] = L_min( div_fx[1], thresh ); // q_div -#else /* OPT_BIN_RENDERER_V1 */ - IF( LT_16( q_div, Q17 ) ) - { - div_fx[0] = L_min( L_shr( 1310720000, sub( Q17, q_div ) ), div_fx[0] ); // q_div - move32(); - div_fx[1] = L_min( L_shr( 1310720000, sub( Q17, q_div ) ), div_fx[1] ); // q_div - move32(); - } - ELSE - { - div_fx[0] = L_min( 1310720000, L_shr( div_fx[0], sub( q_div, Q17 ) ) ); - move32(); - div_fx[1] = L_min( 1310720000, L_shr( div_fx[1], sub( q_div, Q17 ) ) ); - move32(); - q_div = Q17; - move16(); - } -#endif /* OPT_BIN_RENDERER_V1 */ matrixMul_fx( Are_fx, Aim_fx, &q_A, Ure_fx, Uim_fx, &q_U, tmpRe_fx, tmpIm_fx, &q_temp ); @@ -4589,21 +4444,11 @@ static void formulate2x2MixingMatrix_fx( W_tmp = W_mult0_32_32( tmpRe_fx[chA][chB], div_fx[chB] ); IF( W_tmp != 0 ) { -#ifdef OPT_BIN_RENDERER_V1 Word16 hdrm = sub( W_norm( W_tmp ), 32 ); tmpRe_fx[chA][chB] = W_shl_sat_l( W_tmp, hdrm ); move32(); hdrm_re[chA][chB] = add( add( q_temp, q_div ), hdrm ); move16(); -#else /* OPT_BIN_RENDERER_V1 */ - hdrm_re[chA][chB] = sub( W_norm( W_tmp ), 0 ); - move16(); - W_tmp = W_shl( W_tmp, hdrm_re[chA][chB] ); - tmpRe_fx[chA][chB] = W_extract_h( W_tmp ); - move32(); - hdrm_re[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_re[chA][chB] ), 32 ); - move16(); -#endif /* OPT_BIN_RENDERER_V1 */ } ELSE { @@ -4614,22 +4459,12 @@ static void formulate2x2MixingMatrix_fx( W_tmp = W_mult0_32_32( tmpIm_fx[chA][chB], div_fx[chB] ); IF( W_tmp != 0 ) { -#ifdef OPT_BIN_RENDERER_V1 Word16 hdrm = sub( W_norm( W_tmp ), 32 ); move16(); tmpIm_fx[chA][chB] = W_shl_sat_l( W_tmp, hdrm ); move32(); hdrm_im[chA][chB] = add( add( q_temp, q_div ), hdrm ); move16(); -#else /* OPT_BIN_RENDERER_V1 */ - hdrm_im[chA][chB] = sub( W_norm( W_tmp ), 0 ); - move16(); - W_tmp = W_shl( W_tmp, hdrm_im[chA][chB] ); - tmpIm_fx[chA][chB] = W_extract_h( W_tmp ); - move32(); - hdrm_im[chA][chB] = sub( add( add( q_temp, q_div ), hdrm_im[chA][chB] ), 32 ); - move16(); -#endif /* OPT_BIN_RENDERER_V1 */ } ELSE { @@ -4644,9 +4479,7 @@ static void formulate2x2MixingMatrix_fx( move16(); minimum_s( hdrm_im[0], BINAURAL_CHANNELS * BINAURAL_CHANNELS, &exp ); q_temp = s_min( q_temp, exp ); -#ifdef OPT_BIN_RENDERER_V1 q_temp = sub( q_temp, 1 ); -#endif /* OPT_BIN_RENDERER_V1 */ FOR( chA = 0; chA < BINAURAL_CHANNELS; chA++ ) { @@ -4660,11 +4493,7 @@ static void formulate2x2MixingMatrix_fx( } matrixTransp2Mul_fx( tmpRe_fx, tmpIm_fx, &q_temp, Ure_fx, Uim_fx, &q_U, -#ifdef OPT_BIN_RENDERER_V1 0 /*int Ascale*/, -#else /* OPT_BIN_RENDERER_V1 */ - 1 /*int Ascale*/, -#endif /* OPT_BIN_RENDERER_V1 */ 0 /*int Bscale*/, Pre_fx, Pim_fx, &q_P ); /* Nearest orthonormal matrix P to matrix A formulated */ diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index c96878d55..8b54b80c7 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -919,7 +919,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( } c = Madd_32_16( ONE_IN_Q27 /*1 Q27*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_fx, ONE_IN_Q27 /*1 Q27*/ ), 5461 ); /*Diffuseness modellling nrg compensation*/ /* 1.0 / 6.0 = 5461 in Q15*/ /*Q27*/ Word16 diff_c_exp = sub( q_diffuseness, 4 ); -#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot FOR( ; k < num_freq_bands; k++ ) { a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses @@ -984,71 +983,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( } } -#else - FOR( ; k < num_freq_bands; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses - move32(); - IF( reference_power[k + num_freq_bands] == 0 ) - { - b = 0; - move16(); - b_exp = 0; - move16(); - } - ELSE - { - IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 ) - { - b = MAX_16; - move16(); - b_exp = 0; - move16(); - } - ELSE - { - b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*q(15-b_exp)*/ - } - } - - mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 - mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 - mpy_diff_c = Mpy_32_32( diffuseness[k], c2 ); // Q = q_diffuseness - 4 - - q_diff_aab = add( add( h_dirac_output_synthesis_state->direct_responses_q, sub( sub( 15, b_exp ), 15 ) ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); - q_diff_c = sub( q_diffuseness, 4 ); - Word16 minq = sub( s_min( q_diff_aab, q_diff_c ), 1 ); - Word32 op1 = L_shr( mpy_diff_aab, sub( q_diff_aab, minq ) ); - Word32 op2 = L_shr( mpy_diff_c, sub( q_diff_c, minq ) ); - sqr_inp = L_add( op1, op2 ); - sqr_exp = sub( 31, minq ); - sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ - sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ - IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) - { - IF( GT_16( sqr_exp, cy_cross_dir_smooth_e ) ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( sqr_exp, cy_cross_dir_smooth_e ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ - move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); - move16(); - } - ELSE - { - sqr = L_shr( sqr, sub( cy_cross_dir_smooth_e, sqr_exp ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - } - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ - move32(); - } - ELSE - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/ - move32(); - Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sqr_exp; // sub( 31, sqr_exp ); - move16(); - } - } -#endif } ELSE { @@ -1262,7 +1196,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( } } c = Madd_32_16( ONE_IN_Q27 /*1 Q27*/, L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_fx, ONE_IN_Q27 /*1 Q27*/ ), 5461 ); /*Diffuseness modellling nrg compensation*/ /* 1.0 / 6.0 = 5461 in Q15*/ /*Q27*/ -#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_output_synthesis_process_slot FOR( ; k < num_freq_bands; k++ ) { a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses @@ -1329,89 +1262,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( move16(); } } -#else - FOR( ; k < num_freq_bands; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses_fx[ch_idx * num_freq_bands + k]; // Q = h_dirac_output_synthesis_state->q_direct_responses - move32(); - IF( reference_power[k + num_freq_bands] == 0 ) - { - b = 0; - move16(); - b_exp = 0; - move16(); - } - ELSE - { - IF( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] == 0 ) - { - b = MAX_16; - move16(); - b_exp = 0; - move16(); - } - ELSE - { - b = BASOP_Util_Divide3232_Scale( reference_power[k + num_freq_bands], reference_power[k + ( ch_idx + 1 ) * num_freq_bands], &b_exp ); /*q(15-b_exp)*/ - } - } - - mpy_a_a_b = Mpy_32_32( a, Mpy_32_16_1( a, b ) ); // Q = (h_dirac_output_synthesis_state->q_direct_responses + (15 - b_exp) - 15) + (h_dirac_output_synthesis_state->q_direct_responses) - 31 - mpy_diff_aab = Mpy_32_32( L_sub( L_shl( 1, q_diffuseness ), diffuseness[k] ), mpy_a_a_b ); // Q = 2*(h_dirac_output_synthesis_state->q_direct_responses) - b_exp - 31 + q_diffuseness -31 - mpy_diff_c = Mpy_32_32( diffuseness[k], c ); // Q = q_diffuseness - 4 - - q_diff_aab = add( add( h_dirac_output_synthesis_state->direct_responses_q, sub( sub( 15, b_exp ), 15 ) ), add( sub( h_dirac_output_synthesis_state->direct_responses_q, 31 ), sub( q_diffuseness, 31 ) ) ); - q_diff_c = sub( q_diffuseness, 4 ); - - test(); - IF( mpy_diff_c != 0 && mpy_diff_aab != 0 ) - { - sqr_inp = BASOP_Util_Add_Mant32Exp( mpy_diff_c, sub( 31, q_diff_c ), mpy_diff_aab, sub( 31, q_diff_aab ), &sqr_exp ); /*q(31-sqr_exp)*/ - } - ELSE - { - IF( mpy_diff_c == 0 ) - { - sqr_inp = mpy_diff_aab; /*q_diff_aab*/ - move32(); - sqr_exp = sub( 31, q_diff_aab ); - } - ELSE - { - sqr_inp = mpy_diff_c; - move32(); - sqr_exp = sub( 31, q_diff_c ); /*q_diff_c*/ - } - } - sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ - sqr = L_shr( sqr, 2 ); /*Q(31-sqr_exp)*/ - IF( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] != 0 ) - { - IF( LT_16( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_shr( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sub( h_dirac_output_synthesis_state->q_cy_cross_dir_smooth, sub( 31, sqr_exp ) ) ); /*h_dirac_output_synthesis_state->q_cy_cross_dir_smooth->Q( 31- sqr_exp )*/ - move32(); - h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); - move16(); - } - ELSE - { - sqr = L_shr( sqr, sub( sub( 31, sqr_exp ), h_dirac_output_synthesis_state->q_cy_cross_dir_smooth ) ); /*Q(31- sqr_exp)->h_dirac_output_synthesis_state->q_cy_cross_dir_smooth*/ - h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = h_dirac_output_synthesis_state->q_cy_cross_dir_smooth; - move16(); - } - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k]*/ - move32(); - } - ELSE - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = L_add( h_dirac_output_synthesis_state->cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k], sqr ); /*Q(31- sqr_exp)*/ - move32(); - h_dirac_output_synthesis_state->Q_temp_cy_cross_dir_smooth_fx[ch_idx * num_freq_bands + k] = sub( 31, sqr_exp ); - move16(); - } - } -#endif } ELSE { @@ -1568,17 +1418,10 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( { Scale_sig32( aux_buf, num_freq_bands, sub( h_dirac_output_synthesis_state->q_cy_auto_diff_smooth, temp_q ) ); /*temp_q->(h_dirac_output_synthesis_state->q_cy_auto_diff_smooth)*/ } -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( aux_buf, &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], num_freq_bands_diff ); /*h_dirac_output_synthesis_state->q_cy_auto_diff_smooth*/ -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth_fx[ch_idx * num_freq_bands_diff], - num_freq_bands_diff, 0 ); /*h_dirac_output_synthesis_state->q_cy_auto_diff_smooth*/ -#endif /* VEC_ARITH_OPT_v1 */ } return; @@ -3647,19 +3490,11 @@ void ivas_dirac_dec_compute_directional_responses_fx( } ELSE { -#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx ivas_dirac_dec_get_response_fx_29( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order ); -#else - ivas_dirac_dec_get_response_fx( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_hoa ); -#endif IF( hodirac_flag ) { -#ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx ivas_dirac_dec_get_response_fx_29( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order ); -#else - ivas_dirac_dec_get_response_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_dir2 ); -#endif } } diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 947d1943e..4b35bbd30 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4543,11 +4543,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_freq_domain_decorr_ap_state ); v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands, 0 ); /* Q31 */ -#endif /* VEC_ARITH_OPT_v1 */ p_onset_filter_fx = onset_filter_subframe_fx; /*q31*/ } ELSE @@ -4645,11 +4641,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( DirAC_mem.reference_power_smooth_q = DirAC_mem.reference_power_q; move16(); #endif -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( reference_power_fix, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands ); // DirAC_mem.reference_power_smooth_q -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( reference_power_fix, reference_power_smooth_fx, reference_power_smooth_fx, hSpatParamRendCom->num_freq_bands, 0 ); // DirAC_mem.reference_power_smooth_q -#endif /* VEC_ARITH_OPT_v1 */ } } /*Rescaling proto_direct_buffer_f*/ @@ -5077,11 +5069,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( ImagBuffer_fx[i] = Cldfb_ImagBuffer_fx[idx_in][i]; // q_cldfb } Word16 out_size = imult1616( hSpatParamRendCom->num_freq_bands, hSpatParamRendCom->subframe_nbslots[subframe_idx] ); -#ifdef OPT_AVOID_STATE_BUF_RESCALE cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, 0, 0, hMasaExtRend->cldfbSynRend[idx_in] ); -#else /* OPT_AVOID_STATE_BUF_RESCALE */ - cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, 0, hMasaExtRend->cldfbSynRend[idx_in] ); -#endif /* OPT_AVOID_STATE_BUF_RESCALE */ scale_sig32( &( output_f_fx[ch][index_slot * hSpatParamRendCom->num_freq_bands] ), out_size, sub( 11, q_out ) ); // q11 idx_in++; } diff --git a/lib_rend/ivas_efap_fx.c b/lib_rend/ivas_efap_fx.c index 2ac397e2c..3a2092294 100644 --- a/lib_rend/ivas_efap_fx.c +++ b/lib_rend/ivas_efap_fx.c @@ -1525,11 +1525,7 @@ static void get_poly_gains_fx( A[1] = elePoly[i - 1]; // q22 move32(); -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ -#endif /* VEC_ARITH_OPT_v1 */ FOR( j = i; j < numChan - 2 + i; ++j ) { @@ -1582,11 +1578,7 @@ static Word32 get_tri_gain_fx( tmpN[1] = L_sub( C[0], B[0] ); // q22 move32(); -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( B, A, tmpSub1, 2 ); // tmpSub1 q22 -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( B, A, tmpSub1, 2, 0 ); // tmpSub1 q22 -#endif /* VEC_ARITH_OPT_v1 */ tmpDot1 = dotp_fixed( tmpN, tmpSub1, 2 ); // Q13 @@ -2245,11 +2237,7 @@ static void sort_channels_vertex_fx( move32(); } -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( tmpV1, tmpV2, tmpV3, 3 ); // tmpV3 Q30 -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( tmpV1, tmpV2, tmpV3, 3, 0 ); // tmpV3 Q30 -#endif /* VEC_ARITH_OPT_v1 */ Word16 exp2 = 2; move16(); normV = ISqrt32( dotp_fixed( tmpV3, tmpV3, 3 ) /*q29*/, &exp2 ); // q=31-exp2 @@ -2431,11 +2419,7 @@ static Word16 in_poly_fx( /* Angles are in Q22 */ A[1] = poly.polyEle[0]; // q22 move32(); -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( P, A, P_minus_A, 2 ); /* Precalculate value of (P-A) q22*/ -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( P, A, P_minus_A, 2, 0 ); /* Precalculate value of (P-A) q22*/ -#endif /* VEC_ARITH_OPT_v1 */ FOR( n = 1; n < sub( numVertices, 1 ); ++n ) { @@ -2504,13 +2488,8 @@ static Word16 in_tri_fx( I'll just compute the determinant and if it's equal to 0, that means the two vectors are colinear */ -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( B, A, tmpDot1, 2 ); // tmpDot1 q22 v_sub_fixed_no_hdrm( C, A, tmpDot2, 2 ); // tmpDot2 q22 -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( B, A, tmpDot1, 2, 0 ); // tmpDot1 q22 - v_sub_fixed( C, A, tmpDot2, 2, 0 ); // tmpDot2 q22 -#endif /* VEC_ARITH_OPT_v1 */ /* Verification of the non-colinearity : Q22 * Q22 = Q13 */ #ifdef OPT_SBA_REND_V1_BE diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 84f1ff3dc..1ef2805b5 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -489,13 +489,8 @@ static void ivas_omasa_param_est_ana_fx( FOR( i = 1; i < nchan_ism; i++ ) { -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( Chnl_RealBuffer_fx[i], Foa_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins ); // Q: Chnl_RealBuffer_q v_add_fixed_no_hdrm( Chnl_ImagBuffer_fx[i], Foa_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins ); // Q: Chnl_ImagBuffer_q -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( Chnl_RealBuffer_fx[i], Foa_RealBuffer_fx[0], Foa_RealBuffer_fx[0], num_freq_bins, 0 ); // Q: Chnl_RealBuffer_q - v_add_fixed( Chnl_ImagBuffer_fx[i], Foa_ImagBuffer_fx[0], Foa_ImagBuffer_fx[0], num_freq_bins, 0 ); // Q: Chnl_ImagBuffer_q -#endif /* VEC_ARITH_OPT_v1 */ } /* Y */ diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index b9b897f4a..9ea501f10 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2177,23 +2177,13 @@ void ivas_binaural_reverb_processSubframe_fx( { IF( s_and( ch, 1 ) ) { -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins ); v_add_fixed_no_hdrm( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); - v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ } ELSE { -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( hReverb->preDelayBufferReal_fx[idx], inImag[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins ); v_add_fixed_no_hdrm( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins ); -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( hReverb->preDelayBufferReal_fx[idx], inImag[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); - v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ } } idx = add( idx, 1 ) % hReverb->preDelayBufferLength; @@ -2223,40 +2213,20 @@ void ivas_binaural_reverb_processSubframe_fx( SWITCH( phaseShiftTypePr[tapIdx] ) { case 0: /* 0 degrees phase */ -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); v_add_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_add_fixed( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ BREAK; case 1: /* 90 degrees phase */ -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); v_add_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_add_fixed( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ BREAK; case 2: /* 180 degrees phase */ -#ifdef VEC_ARITH_OPT_v1 v_sub_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); v_sub_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); -#else /* VEC_ARITH_OPT_v1 */ - v_sub_fixed( hReverb->outputBufferReal_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_sub_fixed( hReverb->outputBufferImag_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ BREAK; default: /* 270 degrees phase */ -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots ); v_sub_fixed_no_hdrm( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( hReverb->outputBufferReal_fx[bin][ch], tapImagPr_fx[tapIdx], hReverb->outputBufferReal_fx[bin][ch], numSlots, 0 ); - v_sub_fixed( hReverb->outputBufferImag_fx[bin][ch], tapRealPr_fx[tapIdx], hReverb->outputBufferImag_fx[bin][ch], numSlots, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ BREAK; } } @@ -2271,7 +2241,6 @@ void ivas_binaural_reverb_processSubframe_fx( { Word32 leftRe_fx, rightRe_fx, leftIm_fx, rightIm_fx; -#ifdef OPT_BIN_RENDERER_V2 leftRe_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ), hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ); // Q_in rightRe_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ), @@ -2280,16 +2249,6 @@ void ivas_binaural_reverb_processSubframe_fx( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ); // Q_in rightIm_fx = Madd_32_32( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ); // Q_in -#else /* OPT_BIN_RENDERER_V2 */ - leftRe_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ) ); // Q_in - rightRe_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferReal_fx[bin][1][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferReal_fx[bin][0][sample] ) ); // Q_in - leftIm_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ) ); // Q_in - rightIm_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), - Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ) ); // Q_in -#endif /* OPT_BIN_RENDERER_V2 */ hReverb->outputBufferReal_fx[bin][0][sample] = leftRe_fx; // Q_in move32(); diff --git a/lib_rend/ivas_sba_rendering_fx.c b/lib_rend/ivas_sba_rendering_fx.c index 896742151..ff077e63e 100644 --- a/lib_rend/ivas_sba_rendering_fx.c +++ b/lib_rend/ivas_sba_rendering_fx.c @@ -87,11 +87,7 @@ void ivas_sba_prototype_renderer_fx( Word16 norm_q = 31; // to handle overflow move16(); -#ifdef OPT_BIN_RENDERER_V1 FOR( Word16 i = 0; i < 2; i++ ) -#else /* OPT_BIN_RENDERER_V1 */ - FOR( Word16 i = 0; i < 6; i++ ) -#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { @@ -100,38 +96,21 @@ void ivas_sba_prototype_renderer_fx( } norm_q = sub( sub( 31, norm_q ), 2 ); // to handle overflow Word16 q_inp[2][CLDFB_SLOTS_PER_SUBFRAME]; -#ifdef OPT_BIN_RENDERER_V1 FOR( Word16 i = 0; i < 2; i++ ) -#else /* OPT_BIN_RENDERER_V1 */ - FOR( Word16 i = 0; i < 6; i++ ) -#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { -#ifdef OPT_BIN_RENDERER_V1 q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], num_cldfb_bands ), L_norm_arr( inIm_fx[i][j], num_cldfb_bands ) ); -#else /* OPT_BIN_RENDERER_V1 */ - q_inp[i][j] = s_min( L_norm_arr( inRe_fx[i][j], CLDFB_NO_CHANNELS_MAX ), L_norm_arr( inIm_fx[i][j], CLDFB_NO_CHANNELS_MAX ) ); -#endif /* OPT_BIN_RENDERER_V1 */ move16(); norm_q = s_min( q_inp[i][j], norm_q ); } } -#ifdef OPT_BIN_RENDERER_V1 FOR( Word16 i = 0; i < 2; i++ ) -#else /* OPT_BIN_RENDERER_V1 */ - FOR( Word16 i = 0; i < 6; i++ ) -#endif /* OPT_BIN_RENDERER_V1 */ { FOR( Word16 j = 0; j < CLDFB_SLOTS_PER_SUBFRAME; j++ ) { -#ifdef OPT_BIN_RENDERER_V1 scale_sig32( inRe_fx[i][j], num_cldfb_bands, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q scale_sig32( inIm_fx[i][j], num_cldfb_bands, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q -#else /* OPT_BIN_RENDERER_V1 */ - scale_sig32( inRe_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q - scale_sig32( inIm_fx[i][j], CLDFB_NO_CHANNELS_MAX, sub( norm_q, 2 ) ); // q_cldfb -> q_cldfb + 2 -norm_q -#endif /* OPT_BIN_RENDERER_V1 */ q_cldfb[i][j] = sub( add( q_cldfb[i][j], norm_q ), 2 ); move16(); } @@ -199,21 +178,12 @@ void ivas_sba_prototype_renderer_fx( FOR( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) { /* accumulate contributions from all SPAR bands */ -#ifdef OPT_BIN_RENDERER_V1 cldfb_par_fx = Madd_32_32( cldfb_par_fx, mixer_mat_fx[out_ch][in_ch][spar_band], L_shl_sat( bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band], 9 ) ); // hMdDec->Q_mixer_matrix -#else /* OPT_BIN_RENDERER_V1 */ - cldfb_par_fx = L_add( cldfb_par_fx, Mpy_32_32( mixer_mat_fx[out_ch][in_ch][spar_band], bin2band->pp_cldfb_weights_per_spar_band_fx[cldfb_band][spar_band] ) ); // hMdDec->Q_mixer_matrix -#endif /* OPT_BIN_RENDERER_V1 */ } } -#ifdef OPT_BIN_RENDERER_V1 out_re_fx[out_ch] = Madd_32_32( out_re_fx[out_ch], inRe_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 out_im_fx[out_ch] = Madd_32_32( out_im_fx[out_ch], inIm_fx[in_ch][ts][cldfb_band], cldfb_par_fx ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 -#else /* OPT_BIN_RENDERER_V1 */ - out_re_fx[out_ch] = L_add( out_re_fx[out_ch], Mpy_32_32( inRe_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 - out_im_fx[out_ch] = L_add( out_im_fx[out_ch], Mpy_32_32( inIm_fx[in_ch][ts][cldfb_band], cldfb_par_fx ) ); // hMdDec->Q_mixer_matrix+q_cldfb[i][j] -31 -#endif /* OPT_BIN_RENDERER_V1 */ move32(); move32(); } @@ -272,17 +242,11 @@ void ivas_sba_prototype_renderer_fx( { IF( EQ_16( st_ivas->nchan_transport, 1 ) ) /* Dual mono */ { -#ifdef OPT_BIN_RENDERER_V1 Copy32( inRe_fx[0][ts], inRe_fx[1][ts], num_cldfb_bands ); Copy32( inIm_fx[0][ts], inIm_fx[1][ts], num_cldfb_bands ); -#else /* OPT_BIN_RENDERER_V1 */ - Copy32( inRe_fx[0][ts], inRe_fx[1][ts], CLDFB_NO_CHANNELS_MAX ); - Copy32( inIm_fx[0][ts], inIm_fx[1][ts], CLDFB_NO_CHANNELS_MAX ); -#endif /* OPT_BIN_RENDERER_V1 */ } ELSE IF( EQ_16( st_ivas->nchan_transport, 2 ) ) /* Opposing cardioids */ { -#ifdef OPT_BIN_RENDERER_V1 Word32 temp_signal_fx; FOR( Word16 idx = 0; idx < num_cldfb_bands; idx++ ) { @@ -306,28 +270,6 @@ void ivas_sba_prototype_renderer_fx( inIm_fx[0][ts][idx] = temp_signal_fx; move32(); } -#else /* OPT_BIN_RENDERER_V1 */ - Word32 temp_signal_fx[CLDFB_NO_CHANNELS_MAX]; - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - temp_signal_fx[idx] = L_add( L_shr( inRe_fx[0][ts][idx], 1 ), L_shr( inRe_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 - move32(); - inRe_fx[1][ts][idx] = L_sub( L_shr( inRe_fx[0][ts][idx], 1 ), L_shr( inRe_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 - move32(); - inRe_fx[0][ts][idx] = temp_signal_fx[idx]; - move32(); - } - - FOR( Word16 idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) - { - temp_signal_fx[idx] = L_add( L_shr( inIm_fx[0][ts][idx], 1 ), L_shr( inIm_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 - move32(); - inIm_fx[1][ts][idx] = L_sub( L_shr( inIm_fx[0][ts][idx], 1 ), L_shr( inIm_fx[1][ts][idx], 1 ) ); // q_cldfb[][]-1 - move32(); - inIm_fx[0][ts][idx] = temp_signal_fx[idx]; - move32(); - } -#endif /* OPT_BIN_RENDERER_V1 */ } } } diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 3b800ed07..957aaee0d 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5755,11 +5755,7 @@ static ivas_error renderLfeToBinaural_fx( { writePtr = getSmplPtr_fx( outAudio, ear_idx, 0 ); move32(); -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( writePtr, tmpLfeBuffer, writePtr, frame_size ); /* Q(out_q) */ -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( writePtr, tmpLfeBuffer, writePtr, frame_size, 0 ); /* Q(out_q) */ -#endif /* VEC_ARITH_OPT_v1 */ } pop_wmops(); @@ -6764,11 +6760,7 @@ static void renderMasaToMasa( ELSE IF( EQ_16( masaInput->base.inputBuffer.config.numChannels, 2 ) && EQ_16( outAudio.config.numChannels, 1 ) ) { // v_add( tmpBuffer[0], tmpBuffer[1], tmpBuffer[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); -#ifdef VEC_ARITH_OPT_v1 v_add_fixed_no_hdrm( tmpBuffer_fx[0], tmpBuffer_fx[1], tmpBuffer_fx[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); -#else /* VEC_ARITH_OPT_v1 */ - v_add_fixed( tmpBuffer_fx[0], tmpBuffer_fx[1], tmpBuffer_fx[0], masaInput->base.inputBuffer.config.numSamplesPerChannel, 0 ); -#endif /* VEC_ARITH_OPT_v1 */ } /* Copy metadata */ -- GitLab From 81d0cb71e489fa477aa00582f0a324d97e604579 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 25 Jun 2025 11:08:01 +0530 Subject: [PATCH 1023/1310] Clang formatting --- lib_com/cldfb_fx.c | 42 +++++++++---------- lib_com/prot_fx.h | 18 ++++---- lib_com/swb_tbe_com_fx.c | 6 +-- lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 2 - lib_dec/ivas_mc_paramupmix_dec_fx.c | 2 - lib_dec/ivas_stereo_cng_dec_fx.c | 2 +- lib_dec/ivas_stereo_dft_dec_fx.c | 28 ++++++------- lib_dec/swb_tbe_dec_fx.c | 14 +++---- lib_enc/ivas_mc_param_enc_fx.c | 1 - lib_enc/ivas_qmetadata_enc_fx.c | 2 +- lib_enc/ivas_stereo_icbwe_enc_fx.c | 2 +- lib_enc/lib_enc_fx.c | 31 +++++++------- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 3 +- lib_rend/ivas_dirac_rend_fx.c | 2 +- 14 files changed, 70 insertions(+), 85 deletions(-) diff --git a/lib_com/cldfb_fx.c b/lib_com/cldfb_fx.c index edddcb272..30b8d57d0 100644 --- a/lib_com/cldfb_fx.c +++ b/lib_com/cldfb_fx.c @@ -505,18 +505,18 @@ void cldfbAnalysis_ts_fx( #endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ - rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 - ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 - /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rr12_fx = L_sub( r1_fx, r2_fx ); // q -1 + ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q - 1 + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); move32(); ///* folding + pre modulation of DCT IV */ - ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 - ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 - /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + ir12_fx = L_add( r1_fx, r2_fx ); // q - 1 + ii12_fx = L_sub( i1_fx, i2_fx ); // q - 1 + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); @@ -575,25 +575,25 @@ void cldfbAnalysis_ts_fx( i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )] ); // q i2_fx = Msub_32_16( i2_fx, timeBuffer_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )] ); // q - r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 - r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 - i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 - i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 + r1_fx = Mpy_32_16_1( r1_fx, ptr_pf_sf ); // q - 1 + r2_fx = Mpy_32_16_1( r2_fx, ptr_pf_sf ); // q - 1 + i1_fx = Mpy_32_16_1( i1_fx, ptr_pf_sf ); // q - 1 + i2_fx = Mpy_32_16_1( i2_fx, ptr_pf_sf ); // q - 1 #endif /* OPT_IVAS_FILTER_ROM */ /* folding + pre modulation of DST IV */ - rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 - ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 - /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rr12_fx = L_add( r1_fx, r2_fx ); // q - 1 + ri12_fx = L_sub( i1_fx, i2_fx ); // q - 1 + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ rBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( rr12_fx, rot_vctr_re_fx[k] ), ri12_fx, rot_vctr_im_fx[k] ); // q - 3 rBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( rr12_fx, rot_vctr_im_fx[k] ), ri12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); move32(); /* folding + pre modulation of DCT IV */ - ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 - ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 - /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + ir12_fx = L_sub( r1_fx, r2_fx ); // q - 1 + ii12_fx = L_add( i1_fx, i2_fx ); // q - 1 + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ iBuffer_fx[2 * k] = Msub_32_32( Mpy_32_32( ir12_fx, rot_vctr_re_fx[k] ), ii12_fx, rot_vctr_im_fx[k] ); // q - 3 iBuffer_fx[2 * k + 1] = Madd_32_32( Mpy_32_32( ir12_fx, rot_vctr_im_fx[k] ), ii12_fx, rot_vctr_re_fx[k] ); // q - 3 move32(); @@ -1378,11 +1378,11 @@ void cldfbAnalysis_ts_fx_fixed_q( * Conduct inverse multple overlap cmplex low delay MDCT *--------------------------------------------------------------------*/ void cldfbSynthesis_ivas_fx( - Word32 **realBuffer_fx, /* i : real values Qx*/ - Word32 **imagBuffer_fx, /* i : imag values Qx*/ - Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ - const Word16 samplesToProcess, /* i : number of processed samples */ - const Word16 shift, /* i : scale for state buffer */ + Word32 **realBuffer_fx, /* i : real values Qx*/ + Word32 **imagBuffer_fx, /* i : imag values Qx*/ + Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ + const Word16 samplesToProcess, /* i : number of processed samples */ + const Word16 shift, /* i : scale for state buffer */ const Word16 out_shift, /* i : scale for output buffer */ HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ ) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 2d4ea1901..666484359 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -3244,10 +3244,8 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout - , - Word16 element_mode -); + Word16 Qout, + Word16 element_mode ); void prep_tbe_exc_fx( const Word16 L_frame_fx, /* i : length of the frame */ @@ -9361,12 +9359,12 @@ void cldfbAnalysis_ivas_fx( ); void cldfbSynthesis_ivas_fx( - Word32 **realBuffer_fx, /* i : real values Qx*/ - Word32 **imagBuffer_fx, /* i : imag values Qx*/ - Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ - const Word16 samplesToProcess, /* i : number of processed samples */ - const Word16 shift, /* i : scale for state buffer */ - const Word16 out_shift, /* i : scale for output buffer */ + Word32 **realBuffer_fx, /* i : real values Qx*/ + Word32 **imagBuffer_fx, /* i : imag values Qx*/ + Word32 *timeOut_fx, /* o : output time domain samples Qx - 1*/ + const Word16 samplesToProcess, /* i : number of processed samples */ + const Word16 shift, /* i : scale for state buffer */ + const Word16 out_shift, /* i : scale for output buffer */ HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filter bank state */ ); diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index f37381b69..8ddfa3e5f 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6685,10 +6685,8 @@ void synthesise_fb_high_band_fx( Word16 *prev_fbbwe_ratio, /* o : previous frame energy for FEC */ Word32 bpf_memory[][4], /* i/o: memory for elliptic bpf 48k */ Word16 bpf_memory_Q[], - Word16 Qout - , - int16_t element_mode -) + Word16 Qout, + int16_t element_mode ) { Word16 i, j; Word16 excitation_in_interp3_buffer[L_FRAME48k + 4]; diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index 0d8e029d1..532ca0358 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -623,8 +623,6 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( #endif /* OPT_SBA_DEC_V2_BE */ } } - - } ELSE { diff --git a/lib_dec/ivas_mc_paramupmix_dec_fx.c b/lib_dec/ivas_mc_paramupmix_dec_fx.c index 5840cb08f..46b28ec8c 100644 --- a/lib_dec/ivas_mc_paramupmix_dec_fx.c +++ b/lib_dec/ivas_mc_paramupmix_dec_fx.c @@ -859,9 +859,7 @@ static void ivas_mc_paramupmix_dec_sf( ImagBuffer_fx[slot_idx] = Cldfb_ImagBuffer_Binaural_fx[ch][slot_idx]; // Q6 } cldfbSynthesis_ivas_fx( RealBuffer_fx, ImagBuffer_fx, &( output_fx[ch][0] ), imult1616( maxBand, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx] ), 6, 0, st_ivas->cldfbSynDec[ch] ); // output_fx returned in Q11 - } - } ELSE { diff --git a/lib_dec/ivas_stereo_cng_dec_fx.c b/lib_dec/ivas_stereo_cng_dec_fx.c index d48e035a6..463032467 100644 --- a/lib_dec/ivas_stereo_cng_dec_fx.c +++ b/lib_dec/ivas_stereo_cng_dec_fx.c @@ -1509,7 +1509,7 @@ void stereo_cna_update_params_fx( dotLR_fx_q = add( dotLR_fx_q, sub( sub( 31, temp_res_q ), 31 ) ); dotLR_fx = W_deposit32_l( L_shl_sat( W_extract_l( dotLR_fx ), sub( 31, dotLR_fx_q ) ) ); /* Q31 */ /* estimate L/R correlation factor and ILD in time domain */ - c_LR_fx = W_extract_l( dotLR_fx ); /* Q31 */ + c_LR_fx = W_extract_l( dotLR_fx ); /* Q31 */ temp_res_q = 0; move16(); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 4aebd5145..7d3bec07d 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -2603,9 +2603,9 @@ void stereo_dft_dec_fx( Word16 shift = sub( q_cna_level, hStereoDft->q_dft ); N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ - l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp ); /* q_dft */ + l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, shift ); /* q_dft */ + DFT_L[2 * i] = L_add_sat( DFT_L[2 * i], l_tmp ); /* q_dft */ move32(); l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ @@ -2614,9 +2614,9 @@ void stereo_dft_dec_fx( N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ - l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ - l_tmp = L_shr( l_tmp, shift ); /* q_dft */ - DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ + l_tmp = Madd_32_16( Madd_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, shift ); /* q_dft */ + DFT_L[2 * i + 1] = L_add_sat( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ move32(); l_tmp = Msub_32_16( Msub_32_16( N1, N1, g ), N2, gamma ); /* q_cna_level */ l_tmp = L_shr( l_tmp, shift ); /* q_dft */ @@ -2874,14 +2874,14 @@ static void stereo_dft_dequantize_ipd_fx( *-------------------------------------------------------------------------*/ void stereo_dft_generate_res_pred_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 samp_ratio, /* i : sampling ratio Q15*/ - Word32 *pDFT_DMX, /* i : downmix signal qDFT*/ - Word32 *DFT_PRED_RES, /* o : residual prediction signal qDFT*/ - Word32 *pPredGain, /* i : residual prediction gains Q31*/ - const Word16 k, /* i : subframe index Q0*/ - Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal qDFT*/ - Word16 *stop, /* o : last FD stereo filling bin Q0*/ - const Word16 bfi /* i : BFI flag Q0*/ + const Word16 samp_ratio, /* i : sampling ratio Q15*/ + Word32 *pDFT_DMX, /* i : downmix signal qDFT*/ + Word32 *DFT_PRED_RES, /* o : residual prediction signal qDFT*/ + Word32 *pPredGain, /* i : residual prediction gains Q31*/ + const Word16 k, /* i : subframe index Q0*/ + Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal qDFT*/ + Word16 *stop, /* o : last FD stereo filling bin Q0*/ + const Word16 bfi /* i : BFI flag Q0*/ ) { /* general variables */ diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 73d8ef11c..679e206e0 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4662,10 +4662,8 @@ void fb_tbe_dec_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp - , - st->element_mode - ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp, + st->element_mode ); /* add the fb_synth component to the hb_synth component */ /* v_add_fx( hb_synth, fb_synth, hb_synth, L_FRAME48k );*/ @@ -4734,10 +4732,8 @@ void fb_tbe_dec_ivas_fx( fb_exc_energy = sum2_fx_mod( fb_exc, L_FRAME16k ); /* FB TBE synthesis */ - synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp - , - st->element_mode - ); + synthesise_fb_high_band_fx( fb_exc, Q_fb_exc, fb_synth, fb_exc_energy, ratio, st->L_frame, st->bfi, &( hBWE_TD->prev_fbbwe_ratio_fx ), hBWE_TD->fbbwe_hpf_mem_fx, hBWE_TD->fbbwe_hpf_mem_fx_Q, hb_synth_exp, + st->element_mode ); test(); IF( GE_16( st->element_mode, IVAS_CPE_DFT ) && ( st->idchan == 0 ) ) @@ -7046,7 +7042,7 @@ void ivas_swb_tbe_dec_fx( FOR( i = 0; i < L_FRAME16k; i++ ) { Word16 idx; - idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ + idx = extract_h( imult3216( idx32, i ) ); /*Q0*/ L_tmp1 = Mult_32_16( L_tmp, GainShape_fx[idx] ); /* Q : 18 + tmp +15 -15*/ White_exc16k_fx[i] = round_fx( Mult_32_16( L_tmp1, White_exc16k_fx[i] ) ); /* 18 + tmp +*Q_white_exc -15 -16 */ move16(); diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 8b09f3644..226e7c164 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -1166,7 +1166,6 @@ static void ivas_param_mc_param_est_enc_fx( move64(); Cy_sum_imag_64[cur_param_band - 1][ch_idx1][ch_idx2] = W_add( Cy_sum_imag_64[cur_param_band - 1][ch_idx1][ch_idx2], Cy_sum_imag_64[cur_param_band][ch_idx1][ch_idx2] ); move64(); - } } } diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 3040bc24a..15adcee9c 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -1072,7 +1072,7 @@ void ivas_qmetadata_enc_sid_encode_fx( { /*compute the average direction */ ivas_qmetadata_azimuth_elevation_to_direction_vector_fx( q_direction->band_data[b].azimuth_fx[m], q_direction->band_data[b].elevation_fx[m], direction_vector_fx ); - scale_sig32( direction_vector_fx, 3, Q22 - Q30 ); // Q30 -> Q22 + scale_sig32( direction_vector_fx, 3, Q22 - Q30 ); // Q30 -> Q22 v_add_fixed_no_hdrm( avg_direction_vector_fx, direction_vector_fx, avg_direction_vector_fx, 3 ); // Q22 } diff --git a/lib_enc/ivas_stereo_icbwe_enc_fx.c b/lib_enc/ivas_stereo_icbwe_enc_fx.c index ff5d67d6a..67ba071a0 100644 --- a/lib_enc/ivas_stereo_icbwe_enc_fx.c +++ b/lib_enc/ivas_stereo_icbwe_enc_fx.c @@ -853,7 +853,7 @@ void stereo_icBWE_enc_ivas_fx( move16(); /* shb_frame_ref_ICBWE @ (8.75 - shb_speech_delay (=1.25) ms) after shb_speech */ - Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ + Copy_Scale_sig32( shb_speech_nonref_fx, shb_frame_nonref_fx + L_LOOK_16k - nonRefMemLen, L_FRAME16k, negate( sub( max_e, shb_speech_nonref_e ) ) ); /* Q31-max_e */ Copy_Scale_sig_32_16( shb_frame_nonref_fx + L_FRAME16k, hStereoICBWE->mem_shb_speech_nonref_fx, L_LOOK_16k, sub( negate( sub( max_e, hStereoICBWE->mem_shb_speech_nonref_e ) ), Q16 ) ); // mem_shb_speech_ref_e /* core switching reset */ diff --git a/lib_enc/lib_enc_fx.c b/lib_enc/lib_enc_fx.c index 27de8ad87..6c105228f 100644 --- a/lib_enc/lib_enc_fx.c +++ b/lib_enc/lib_enc_fx.c @@ -1509,27 +1509,26 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( } } ELSE /* IVAS */ - { - IF( NE_32( ( error = ivas_enc_fx( st_ivas, inputBuffer, inputBufferSize ) ), IVAS_ERR_OK ) ) { - return error; - } - } + IF( NE_32( ( error = ivas_enc_fx( st_ivas, inputBuffer, inputBufferSize ) ), IVAS_ERR_OK ) ){ + return error; +} +} - /* write indices into bitstream buffer */ - { - write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits +/* write indices into bitstream buffer */ +{ + write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits #ifdef DBG_BITSTREAM_ANALYSIS - , - frame + , + frame #endif - ); - } - /* Reset switching flag before next call - can be set to "true" by some setters */ - hIvasEnc->switchingActive = false; - move16(); + ); +} +/* Reset switching flag before next call - can be set to "true" by some setters */ +hIvasEnc->switchingActive = false; +move16(); - return error; +return error; } diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 8b54b80c7..eea8dffbb 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -982,7 +982,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( move16(); } } - } ELSE { @@ -1090,7 +1089,7 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( move16(); } free( exp_temp_cy_cross_dir_smooth_fx ); -#else /* OPT_SBA_DEC_PATH */ +#else /* OPT_SBA_DEC_PATH */ /*Direct gain*/ Word16 *Q_temp_cy_cross_dir_smooth_fx = (Word16 *) malloc( num_freq_bands * num_channels_dir * sizeof( Word16 ) ); diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 4b35bbd30..0535d2582 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4542,7 +4542,7 @@ static void ivas_masa_ext_dirac_render_sf_fx( hDirACRend->h_freq_domain_decorr_ap_params, hDirACRend->h_freq_domain_decorr_ap_state ); - v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ + v_multc_fixed( onset_filter_fx, 536870912 /* 0.25f in Q31 */, onset_filter_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ v_add_fixed_no_hdrm( onset_filter_fx, onset_filter_subframe_fx, onset_filter_subframe_fx, hSpatParamRendCom->num_freq_bands ); /* Q31 */ p_onset_filter_fx = onset_filter_subframe_fx; /*q31*/ } -- GitLab From edeae1116cf183daed960d1bff67de35c8e7fb97 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 25 Jun 2025 12:11:42 +0530 Subject: [PATCH 1024/1310] Revert changes related to one macro --- lib_enc/ivas_mc_param_enc_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_enc/ivas_mc_param_enc_fx.c b/lib_enc/ivas_mc_param_enc_fx.c index 226e7c164..ba2c52073 100644 --- a/lib_enc/ivas_mc_param_enc_fx.c +++ b/lib_enc/ivas_mc_param_enc_fx.c @@ -994,6 +994,7 @@ static void ivas_param_mc_param_est_enc_fx( /* Cy for input channels */ FOR( ch_idx1 = 0; ch_idx1 < nchan_input; ++ch_idx1 ) { +#ifdef IMPROVE_HIGH_COMPLEXITY_PARAM_MC_PRM_EST_NONBE a_e = norm_l( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band] ); a_fx = L_shl( slot_frame_f_real_fx[ch_idx1][cur_cldfb_band], a_e ); a_e = sub( add20gb, a_e ); @@ -1010,6 +1011,7 @@ static void ivas_param_mc_param_est_enc_fx( b_e = 0; move16(); } +#endif a_fx = slot_frame_f_real_fx[ch_idx1][cur_cldfb_band]; b_fx = slot_frame_f_imag_fx[ch_idx1][cur_cldfb_band]; move32(); -- GitLab From 99b3f1d116f25ddbb89cf2e5956c7944d54e499b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 09:24:00 +0200 Subject: [PATCH 1025/1310] change shr_r/shl_sat to shr_r_sat --- lib_dec/dec_gen_voic_fx.c | 21 +++++-------------- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 11 +--------- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 8 ++----- 3 files changed, 8 insertions(+), 32 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 935200eea..492b32775 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -464,22 +464,11 @@ ivas_error decod_gen_voic_fx( test(); test(); #ifdef ISSUE_1751_replace_shl_ro - Word16 op16_1 = sub( Qenratio, 15 ); - Word16 op16_2 = sub( Qenratio, 10 ); - Word16 op16_3 = sub( Qsp_enratio, 15 ); - - /*Due to all shift directrions being possible, we need both possibilities, shl_sat and shr_r*/ - BASOP_SATURATE_WARNING_OFF - op16_1 = op16_1 >= 0 ? shr_r( enratio, op16_1 ) : shl_sat( enratio, negate( op16_1 ) ); - op16_2 = op16_2 >= 0 ? shr_r( sp_enratio, op16_2 ) : shl_sat( sp_enratio, negate( op16_2 ) ); - op16_3 = op16_3 >= 0 ? shr_r( sp_enratio, op16_3 ) : shl_sat( sp_enratio, negate( op16_3 ) ); - BASOP_SATURATE_WARNING_ON - - IF( GT_16( op16_1, 8192 ) && /*compare with 0.25 in Q15*/ - LT_16( op16_2, 15360 ) && /*compare with 15.0 in Q10*/ - GT_16( op16_3, 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ + IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ + LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ + GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ #else Flag Overflow; IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index c817bd1b3..baad5c561 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -136,16 +136,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF #ifdef ISSUE_1751_replace_shl_ro - Word16 op1 = add( normXY, normCC ); - /*Both shift directiosn possible*/ - if ( op1 >= 0 ) - { - cc = shl_sat( cc, op1 ); - } - else - { - cc = shr_r( cc, negate( op1 ) ); - } + cc = shr_r_sat( cc, negate( add( normXY, normCC ) ) ); #else Flag Overflow; cc = shl_ro( cc, add( normXY, normCC ), &Overflow ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 1ef10382e..e368e455c 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4428,9 +4428,7 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro - assert( lfeGain_fx_exp <= 0 ); - /*if assert is thrown, shl_sat can handle the left shift*/ - lfeGain_fx = shr_r( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 + lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 #else Flag Overflow; lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp & Overflow ); // Q15 @@ -4447,9 +4445,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp #ifdef ISSUE_1751_replace_shl_ro - assert( transportGain_fx_exp <= 0 ); - /*if assert is thrown, shl_sat can handle the left shift*/ - transportGain_fx = shr_r( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 + transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 #else Flag Overflow; transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp & Overflow ); // Q15 -- GitLab From b48e71bd74da31839b305b363852b3da3c2aee9b Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 09:27:12 +0200 Subject: [PATCH 1026/1310] clang format patch --- lib_dec/dec_gen_voic_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 492b32775..a58cd19c9 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -467,8 +467,8 @@ ivas_error decod_gen_voic_fx( IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ - LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ - LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ + LT_16( st_fx->bfi_pitch_fx, 9600 ) && /*Q6*/ + LT_16( pitch_buf_fx[( NB_SUBFR16k - 1 )], 9600 ) ) /*Q6*/ #else Flag Overflow; IF( GT_16( shl_ro( enratio, sub( 15, Qenratio ), &Overflow ), 8192 ) && /*compare with 0.25 in Q15*/ -- GitLab From dd70cef2abd8aab094e2a948daac856aa555eae4 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 07:36:54 +0000 Subject: [PATCH 1027/1310] deactivate all for testing --- lib_dec/dec_gen_voic_fx.c | 2 +- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index a58cd19c9..f311e6320 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -463,7 +463,7 @@ ivas_error decod_gen_voic_fx( test(); test(); test(); -#ifdef ISSUE_1751_replace_shl_ro +#ifdef ISSUE_1751_replace_shl_ro_ IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index baad5c561..f7b97f3f7 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -135,7 +135,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normCC = add( normCC, 16 ); /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF -#ifdef ISSUE_1751_replace_shl_ro +#ifdef ISSUE_1751_replace_shl_ro_ cc = shr_r_sat( cc, negate( add( normXY, normCC ) ) ); #else Flag Overflow; diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index e368e455c..b56eace63 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4427,7 +4427,7 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp -#ifdef ISSUE_1751_replace_shl_ro +#ifdef ISSUE_1751_replace_shl_ro_ lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 #else Flag Overflow; @@ -4444,7 +4444,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp -#ifdef ISSUE_1751_replace_shl_ro +#ifdef ISSUE_1751_replace_shl_ro_ transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 #else Flag Overflow; -- GitLab From fb47da0dc6a30ad3a5fc32c94a2598bfaaf33573 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 09:52:51 +0200 Subject: [PATCH 1028/1310] buildfix --- lib_dec/dec_gen_voic_fx.c | 2 +- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index f311e6320..a58cd19c9 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -463,7 +463,7 @@ ivas_error decod_gen_voic_fx( test(); test(); test(); -#ifdef ISSUE_1751_replace_shl_ro_ +#ifdef ISSUE_1751_replace_shl_ro IF( GT_16( shr_r_sat( enratio, sub( Qenratio, 15 ) ), 8192 ) && /*compare with 0.25 in Q15*/ LT_16( shr_r_sat( enratio, sub( Qenratio, 10 ) ), 15360 ) && /*compare with 15.0 in Q10*/ GT_16( shr_r_sat( sp_enratio, sub( Qsp_enratio, 15 ) ), 4915 ) && /*compare with 0.15 in Q15*/ diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 8b772e13c..c826b72f0 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4265,7 +4265,7 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 #else Flag Overflow; - lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp & Overflow ); // Q15 + lfeGain_fx = shl_ro( lfeGain_fx, lfeGain_fx_exp, &Overflow ); // Q15 #endif } IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hMasaLfeSynth->targetEneTransSmooth_fx, sub( Q31, hMasaLfeSynth->targetEneTransSmooth_q ), /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, sub( Q31, hMasaLfeSynth->transportEneSmooth_q ) ), 1 ) ) @@ -4282,7 +4282,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 #else Flag Overflow; - transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp & Overflow ); // Q15 + transportGain_fx = shl_ro( transportGain_fx, transportGain_fx_exp, &Overflow ); // Q15 #endif } j = 0; -- GitLab From ac6159c8b5cb574179f974501de2a2b2a7578e3d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 24 Jun 2025 19:45:13 +0530 Subject: [PATCH 1029/1310] Fix for 3GPP issue 1760: Decoder crash for OSBA ISM4SBA3 in apa_corrEnergy2dB_fx() Link #1760 --- lib_dec/ivas_jbm_dec_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index fefae52f9..1404395cb 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1031,18 +1031,18 @@ ivas_error ivas_jbm_dec_tc_fx( { num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->last_active_ivas_total_brate ); SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - Word16 Q_p_output = 14; - move16(); Word16 nchan_transport; // num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; move16(); nchan_out = nchan_transport; move16(); + Word16 Q_p_output = max( 3, sub( L_norm_arr( p_output_fx[sba_ch_idx], imult1616( output_frame, nchan_transport ) ), 1 ) ); FOR( ch = 0; ch < nchan_transport; ch++ ) { - Scale_sig32( p_output_fx[sba_ch_idx + ch], output_frame, sub( Q_p_output, Q11 ) ); // Q_p_output + Scale_sig32( p_output_fx[sba_ch_idx + ch], output_frame, Q_p_output ); // Q_p_output + Q11 } + Q_p_output = add( Q11, Q_p_output ); hSpar->hMdDec->Q_mixer_mat = 31; move16(); -- GitLab From 1b260941bd9e1db458633338094c817b9686a73c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 25 Jun 2025 13:29:01 +0530 Subject: [PATCH 1030/1310] Fix for ltv crashes observed with -10dB files --- lib_dec/ivas_jbm_dec_fx.c | 3 ++- lib_dec/ivas_sba_rendering_internal_fx.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 1404395cb..e1ac2c1ff 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1037,7 +1037,8 @@ ivas_error ivas_jbm_dec_tc_fx( move16(); nchan_out = nchan_transport; move16(); - Word16 Q_p_output = max( 3, sub( L_norm_arr( p_output_fx[sba_ch_idx], imult1616( output_frame, nchan_transport ) ), 1 ) ); + Word16 Q_p_output = s_max( 3, sub( L_norm_arr( p_output_fx[sba_ch_idx], imult1616( output_frame, nchan_transport ) ), 1 ) ); + Q_p_output = s_min( Q_p_output, 19 ); // to restrict Q-factor of p_ouptut to Q30 FOR( ch = 0; ch < nchan_transport; ch++ ) { Scale_sig32( p_output_fx[sba_ch_idx + ch], output_frame, Q_p_output ); // Q_p_output + Q11 diff --git a/lib_dec/ivas_sba_rendering_internal_fx.c b/lib_dec/ivas_sba_rendering_internal_fx.c index 374efb593..7a96185b9 100644 --- a/lib_dec/ivas_sba_rendering_internal_fx.c +++ b/lib_dec/ivas_sba_rendering_internal_fx.c @@ -505,7 +505,7 @@ void ivas_sba_mix_matrix_determiner_fx( temp_fx = MAX16B; /*Q0*/ move32(); } - ELSE IF( LT_32( temp_fx, L_negate( PCM16_TO_FLT_FAC_FX ) ) ) + ELSE IF( LT_32( temp_fx, -( PCM16_TO_FLT_FAC_FX ) ) ) { temp_fx = -( PCM16_TO_FLT_FAC_FX ); /*Q0*/ move32(); -- GitLab From b1135facc34c6c6addfb2e5dcdef3295cd704e85 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 08:44:32 +0000 Subject: [PATCH 1031/1310] reactivate changes in ivas_dirac_output_synthesis_dec_fx.c --- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index c826b72f0..19823d7c6 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -4261,7 +4261,7 @@ void ivas_lfe_synth_with_filters_fx( lfeGain_fx = extract_h( BASOP_Util_Divide3232_Scale_newton( hMasaLfeSynth->targetEneLfeSmooth_fx, L_add( EPSILON_FX, hMasaLfeSynth->transportEneSmooth_fx ), &lfeGain_fx_exp ) ); /*Q(31-(lfeGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneLfeSmooth_q))-16*/ lfeGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneLfeSmooth_q ), lfeGain_fx_exp ); lfeGain_fx = Sqrt16( lfeGain_fx, &lfeGain_fx_exp ); // Q15-lfeGain_fx_exp -#ifdef ISSUE_1751_replace_shl_ro_ +#ifdef ISSUE_1751_replace_shl_ro lfeGain_fx = shr_r_sat( lfeGain_fx, negate( lfeGain_fx_exp ) ); // Q15 #else Flag Overflow; @@ -4278,7 +4278,7 @@ void ivas_lfe_synth_with_filters_fx( transportGain_fx = BASOP_Util_Divide3232_Scale( hMasaLfeSynth->targetEneTransSmooth_fx, /*EPSILON + */ hMasaLfeSynth->transportEneSmooth_fx, &transportGain_fx_exp ); /*Q=15-(transportGain_fx_exp+hMasaLfeSynth->transportEneSmooth_q-hMasaLfeSynth->targetEneTransSmooth_q)*/ transportGain_fx_exp = add( sub( hMasaLfeSynth->transportEneSmooth_q, hMasaLfeSynth->targetEneTransSmooth_q ), transportGain_fx_exp ); transportGain_fx = Sqrt16( transportGain_fx, &transportGain_fx_exp ); // q15-transportGain_fx_exp -#ifdef ISSUE_1751_replace_shl_ro_ +#ifdef ISSUE_1751_replace_shl_ro transportGain_fx = shr_r_sat( transportGain_fx, negate( transportGain_fx_exp ) ); // Q15 #else Flag Overflow; -- GitLab From c862ad04ea5a08ef7e8b3927259f304facc7ea7e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 17 Jun 2025 13:26:57 +0200 Subject: [PATCH 1032/1310] fix voip be test job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 59d11a2e9..d4e36a122 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -189,6 +189,7 @@ workflow: .test-job-linux-needs-testv-dir: extends: .test-job-linux before_script: + - !reference [ .job-linux, before_script ] - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ ! -d "$TESTV_DIR" ]; then mkdir -p $TESTV_DIR; fi - cp -r scripts/testv/* $TESTV_DIR/ @@ -2042,7 +2043,6 @@ pages: - if: $UPDATE_PAGES script: - !reference [ .job-linux, before_script ] - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - python3 ci/setup_pages.py -- GitLab From 794393658fb27cf6866fadee4d00a3f01deaf075 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 10:10:45 +0000 Subject: [PATCH 1033/1310] lib_dec\jbm_pcmdsp_similarityestimation_fx.c : activate change --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index f7b97f3f7..baad5c561 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -135,7 +135,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normCC = add( normCC, 16 ); /* scale to Q15 with saturation */ BASOP_SATURATE_WARNING_OFF -#ifdef ISSUE_1751_replace_shl_ro_ +#ifdef ISSUE_1751_replace_shl_ro cc = shr_r_sat( cc, negate( add( normXY, normCC ) ) ); #else Flag Overflow; -- GitLab From fa6306a618ba00d3b2d3ec9896af90a52b76baa8 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 25 Jun 2025 15:05:11 +0200 Subject: [PATCH 1034/1310] fix compiler warning --- lib_enc/ivas_omasa_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index 0b0aa90c5..1d14eecc9 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -92,7 +92,7 @@ void computeIntensityVector_enc_fx( Word16 q_intensity_real[MASA_FREQUENCY_BANDS], Word16 inp_q ); -static void computeReferencePower_omasa_ivas_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 *reference_power, const Word16 enc_param_start_band, const Word16 num_freq_bands, Word16 q_Cldfb, Word16 *ref_exp ); +static void computeReferencePower_omasa_ivas_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], Word32 *reference_power, const Word16 enc_param_start_band, const Word16 num_freq_bands, Word16 q_Cldfb, Word16 q_reference_power[CLDFB_NO_CHANNELS_MAX] ); /*--------------------------------------------------------------------------* * ivas_omasa_enc_open() * -- GitLab From ac343713076ad1ec5cf875a1c43028d5fa90e77e Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 25 Jun 2025 16:06:45 +0200 Subject: [PATCH 1035/1310] Added fx ROM tables for 16kHz HRTF + comparison conditions for HRTFs at all sampling frequenies --- lib_rend/ivas_hrtf_fx.c | 118 ++++++++- lib_rend/ivas_rom_binaural_crend_head.h | 18 +- lib_rend/ivas_rom_binaural_crend_head_fx.c | 265 ++++++++++++++++++++- 3 files changed, 391 insertions(+), 10 deletions(-) diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 0b82a8e19..5729337d4 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -289,14 +289,105 @@ ivas_error ivas_HRTF_statistics_init( switch ( sampleRate ) { case 48000: +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); + if ( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); + if ( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); + if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + floatToFixed_arr32( (float*) defaultHRIR_left_avg_power_48kHz, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ + floatToFixed_arr32( (float*) defaultHRIR_right_avg_power_48kHz, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ + floatToFixed_arr32( (float*) defaultHRIR_coherence_48kHz, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + // TODO: dump the converted fixed point arrays to an array + printf( "average_energy_l = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) + { + printf( "%d, ", HrtfStatistics->average_energy_l_dyn[i] ); + } + printf( "};\n" ); + + printf( "average_energy_r = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) + { + printf( "%d, ", HrtfStatistics->average_energy_r_dyn[i] ); + } + printf( "};\n" ); + + printf( "inter_aural_coherence = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) + { + printf( "%d, ", HrtfStatistics->inter_aural_coherence_dyn[i] ); + } + printf( "};\n" ); +#else HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz_fx; HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz_fx; HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_48kHz_fx; +#endif break; case 32000: +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); + if ( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); + if ( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); + if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + floatToFixed_arr32( (float*) defaultHRIR_left_avg_power_32kHz, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ + floatToFixed_arr32( (float *) defaultHRIR_right_avg_power_32kHz, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ + floatToFixed_arr32( (float *) defaultHRIR_coherence_32kHz, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + // TODO: dump the converted fixed point arrays to a string + + printf( "average_energy_l = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) + { + printf( "%d, ", HrtfStatistics->average_energy_l_dyn[i] ); + } + printf( "};\n" ); + + printf( "average_energy_r = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) + { + printf( "%d, ", HrtfStatistics->average_energy_r_dyn[i] ); + } + printf( "};\n" ); + + printf( "inter_aural_coherence = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) + { + printf( "%d, ", HrtfStatistics->inter_aural_coherence_dyn[i] ); + } + printf( "};\n" ); +#else HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_32kHz_fx; HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_32kHz_fx; HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz_fx; +#endif break; case 16000: #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB @@ -315,12 +406,33 @@ ivas_error ivas_HRTF_statistics_init( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); } - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - floatToFixed_arr32( defaultHRIR_right_avg_power_16kHz_fx, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( (float*) defaultHRIR_left_avg_power_16kHz, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ + floatToFixed_arr32( (float*) defaultHRIR_right_avg_power_16kHz, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ + floatToFixed_arr32( (float*) defaultHRIR_coherence_16kHz, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + + printf( "\naverage_energy_l = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC_16KHZ; i++ ) + { + printf( "%d, ", HrtfStatistics->average_energy_l_dyn[i] ); + } + printf( "};\n" ); + + printf( "average_energy_r = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC_16KHZ; i++ ) + { + printf( "%d, ", HrtfStatistics->average_energy_r_dyn[i] ); + } + printf( "};\n" ); + + printf( "inter_aural_coherence = {\n" ); + for ( int i = 0; i < LR_IAC_LENGTH_NR_FC_16KHZ; i++ ) + { + printf( "%d, ", HrtfStatistics->inter_aural_coherence_dyn[i] ); + } + printf( "};\n" ); #else HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz_fx; diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 183a025a8..017703460 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -357,10 +357,22 @@ extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; / extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ + #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB -extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ -extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern const float defaultHRIR_coherence_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern const float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ + +extern const float defaultHRIR_coherence_32kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_left_avg_power_32kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_right_avg_power_32kHz[LR_IAC_LENGTH_NR_FC]; + +extern const float defaultHRIR_coherence_48kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_left_avg_power_48kHz[LR_IAC_LENGTH_NR_FC]; +extern const float defaultHRIR_right_avg_power_48kHz[LR_IAC_LENGTH_NR_FC]; #else extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index b4ebfe6e5..405f26ca7 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -59934,9 +59934,203 @@ const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 1708239,1437966,1167685,1059573,1059573 }; #else -/* Sample Rate = 16000 */ -const float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = +/********************** default HRIR reverb rom tables **********************/ + +/* Sample Rate = 48000 */ + +const float defaultHRIR_coherence_48kHz[LR_IAC_LENGTH_NR_FC] = + {0.997092f, 0.947391f, 0.799213f, 0.575216f, 0.335047f, 0.138324f, 0.007933f, 0.000000f, 0.000000f, + 0.000000f, 0.008438f, 0.037607f, 0.044493f, 0.042149f, 0.041877f, 0.039860f, 0.029404f, 0.015898f, + 0.010316f, 0.014065f, 0.020005f, 0.024518f, 0.029292f, 0.033522f, 0.033418f, 0.029630f, 0.027260f, + 0.027515f, 0.025682f, 0.019571f, 0.013977f, 0.013695f, 0.016531f, 0.016882f, 0.013257f, 0.008483f, + 0.004883f, 0.002525f, 0.001004f, 0.000180f, 0.000000f, 0.000000f, 0.000000f, 0.000785f, 0.003979f, + 0.007082f, 0.009598f, 0.011665f, 0.012700f, 0.011794f, 0.009192f, 0.006164f, 0.003527f, 0.001284f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000894f, 0.002136f, 0.003127f, 0.003616f, + 0.003810f, 0.003754f, 0.003186f, 0.002091f, 0.000823f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.001007f, 0.001843f, 0.002400f, + 0.002505f, 0.002133f, 0.001524f, 0.000903f, 0.000317f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000202f, 0.000867f, 0.001309f, + 0.001553f, 0.001563f, 0.001334f, 0.000961f, 0.000530f, 0.000033f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000278f, 0.000621f, 0.000951f, 0.001272f, 0.001608f, 0.001931f, + 0.002199f, 0.002435f, 0.002687f, 0.002947f, 0.003173f, 0.003370f, 0.003577f, 0.003781f, 0.003920f, + 0.003978f, 0.003985f, 0.003937f, 0.003783f, 0.003511f, 0.003170f, 0.002788f, 0.002337f, 0.001808f, + 0.001255f, 0.000716f, 0.000166f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003551f, 0.000000f, 0.000000f, + 0.000000f, 0.005564f, 0.000000f, 0.000000f, 0.000000f, 0.008736f, 0.000000f, 0.000000f, 0.001007f, + 0.011608f, 0.002316f, 0.000000f, 0.000000f, 0.011987f, 0.005591f, 0.000000f, 0.000000f, 0.008714f, + 0.005905f, 0.000000f, 0.000000f, 0.005316f, 0.003972f, 0.000000f, 0.000000f, 0.003403f, 0.002041f, + 0.000000f, 0.000000f, 0.002140f, 0.000245f, 0.000000f}; + +const float defaultHRIR_left_avg_power_48kHz[LR_IAC_LENGTH_NR_FC] = + {0.981018f, 0.973361f, 0.958480f, 0.950611f, 0.953039f, 0.955845f, 0.950660f, 0.942556f, 0.943810f, + 0.958014f, 0.974983f, 0.982099f, 0.977269f, 0.968243f, 0.961714f, 0.957355f, 0.952468f, 0.947771f, + 0.945396f, 0.943711f, 0.938609f, 0.929975f, 0.922937f, 0.921202f, 0.922151f, 0.920926f, 0.917154f, + 0.914393f, 0.914067f, 0.913705f, 0.911632f, 0.910100f, 0.911873f, 0.915812f, 0.918271f, 0.917846f, + 0.916545f, 0.916408f, 0.916915f, 0.916273f, 0.914005f, 0.911339f, 0.909453f, 0.908137f, 0.906301f, + 0.903476f, 0.900479f, 0.898396f, 0.897057f, 0.895115f, 0.891879f, 0.888353f, 0.885879f, 0.884157f, + 0.881651f, 0.877929f, 0.874417f, 0.872453f, 0.871459f, 0.869941f, 0.867796f, 0.866504f, 0.866990f, + 0.868298f, 0.868985f, 0.869170f, 0.870398f, 0.873460f, 0.877373f, 0.880867f, 0.884271f, 0.889105f, + 0.895880f, 0.903280f, 0.909888f, 0.915965f, 0.922776f, 0.930375f, 0.937111f, 0.941667f, 0.944690f, + 0.947747f, 0.950950f, 0.952712f, 0.951893f, 0.949398f, 0.946830f, 0.944212f, 0.940067f, 0.933749f, + 0.926604f, 0.920193f, 0.914164f, 0.906886f, 0.897913f, 0.888731f, 0.880661f, 0.873093f, 0.864556f, + 0.855014f, 0.846098f, 0.839027f, 0.833268f, 0.827720f, 0.822648f, 0.819628f, 0.819557f, 0.821500f, + 0.823986f, 0.826902f, 0.831352f, 0.837670f, 0.844414f, 0.850004f, 0.854617f, 0.859684f, 0.865573f, + 0.870873f, 0.874346f, 0.876636f, 0.879215f, 0.882152f, 0.883944f, 0.883578f, 0.881897f, 0.880319f, + 0.878855f, 0.876201f, 0.871708f, 0.866458f, 0.861964f, 0.858239f, 0.853971f, 0.848551f, 0.843114f, + 0.839005f, 0.835832f, 0.831994f, 0.826972f, 0.822069f, 0.818424f, 0.815337f, 0.811300f, 0.806249f, + 0.801664f, 0.798529f, 0.796124f, 0.793286f, 0.790217f, 0.788277f, 0.788174f, 0.789082f, 0.789775f, + 0.790281f, 0.791803f, 0.794902f, 0.798467f, 0.801024f, 0.802713f, 0.804961f, 0.808244f, 0.811142f, + 0.812318f, 0.812488f, 0.813349f, 0.815025f, 0.815968f, 0.815334f, 0.814250f, 0.814149f, 0.814776f, + 0.814769f, 0.813685f, 0.812567f, 0.812562f, 0.813456f, 0.814055f, 0.813739f, 0.813391f, 0.814325f, + 0.816394f, 0.817949f, 0.818173f, 0.818552f, 0.820798f, 0.824070f, 0.826010f, 0.826515f, 0.828132f, + 0.832036f, 0.835874f, 0.837493f, 0.838582f, 0.842046f, 0.847074f, 0.850262f, 0.851182f, 0.852997f, + 0.856510f, 0.857491f, 0.852207f, 0.842444f, 0.831373f, 0.816756f, 0.793031f, 0.759822f, 0.723220f, + 0.686833f, 0.646128f, 0.595684f, 0.539241f, 0.486856f, 0.441279f, 0.391675f, 0.324292f, 0.238341f, + 0.149255f, 0.076756f, 0.031022f, 0.009191f, 0.001733f, 0.000140f, 0.000010f, 0.000019f, 0.000015f, + 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, + 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f}; + +const float defaultHRIR_right_avg_power_48kHz[LR_IAC_LENGTH_NR_FC] = + {0.981020f, 0.973360f, 0.958481f, 0.950613f, 0.953040f, 0.955848f, 0.950658f, 0.942557f, 0.943810f, + 0.958017f, 0.974981f, 0.982098f, 0.977271f, 0.968244f, 0.961715f, 0.957356f, 0.952467f, 0.947770f, + 0.945398f, 0.943710f, 0.938610f, 0.929975f, 0.922938f, 0.921205f, 0.922151f, 0.920926f, 0.917152f, + 0.914393f, 0.914069f, 0.913705f, 0.911630f, 0.910101f, 0.911874f, 0.915811f, 0.918272f, 0.917846f, + 0.916542f, 0.916408f, 0.916918f, 0.916272f, 0.914004f, 0.911340f, 0.909452f, 0.908136f, 0.906302f, + 0.903479f, 0.900480f, 0.898395f, 0.897055f, 0.895119f, 0.891880f, 0.888352f, 0.885878f, 0.884154f, + 0.881649f, 0.877926f, 0.874417f, 0.872450f, 0.871458f, 0.869943f, 0.867797f, 0.866503f, 0.866987f, + 0.868297f, 0.868981f, 0.869171f, 0.870394f, 0.873460f, 0.877377f, 0.880866f, 0.884272f, 0.889105f, + 0.895880f, 0.903282f, 0.909886f, 0.915965f, 0.922778f, 0.930375f, 0.937113f, 0.941665f, 0.944689f, + 0.947744f, 0.950952f, 0.952711f, 0.951895f, 0.949398f, 0.946830f, 0.944209f, 0.940067f, 0.933750f, + 0.926601f, 0.920191f, 0.914167f, 0.906884f, 0.897916f, 0.888731f, 0.880663f, 0.873093f, 0.864559f, + 0.855017f, 0.846098f, 0.839028f, 0.833267f, 0.827717f, 0.822649f, 0.819631f, 0.819558f, 0.821499f, + 0.823985f, 0.826902f, 0.831353f, 0.837669f, 0.844416f, 0.850003f, 0.854616f, 0.859686f, 0.865572f, + 0.870872f, 0.874347f, 0.876635f, 0.879216f, 0.882154f, 0.883942f, 0.883576f, 0.881895f, 0.880318f, + 0.878857f, 0.876202f, 0.871706f, 0.866459f, 0.861965f, 0.858241f, 0.853968f, 0.848548f, 0.843114f, + 0.839005f, 0.835832f, 0.831994f, 0.826974f, 0.822068f, 0.818424f, 0.815335f, 0.811299f, 0.806245f, + 0.801662f, 0.798530f, 0.796124f, 0.793287f, 0.790217f, 0.788273f, 0.788173f, 0.789081f, 0.789770f, + 0.790279f, 0.791801f, 0.794900f, 0.798466f, 0.801028f, 0.802711f, 0.804962f, 0.808246f, 0.811143f, + 0.812318f, 0.812490f, 0.813348f, 0.815027f, 0.815969f, 0.815335f, 0.814254f, 0.814150f, 0.814776f, + 0.814772f, 0.813686f, 0.812569f, 0.812558f, 0.813456f, 0.814055f, 0.813736f, 0.813389f, 0.814324f, + 0.816395f, 0.817948f, 0.818173f, 0.818549f, 0.820796f, 0.824069f, 0.826013f, 0.826514f, 0.828134f, + 0.832033f, 0.835874f, 0.837493f, 0.838582f, 0.842047f, 0.847077f, 0.850263f, 0.851184f, 0.852998f, + 0.856513f, 0.857491f, 0.852209f, 0.842446f, 0.831375f, 0.816757f, 0.793032f, 0.759821f, 0.723221f, + 0.686832f, 0.646128f, 0.595684f, 0.539241f, 0.486856f, 0.441280f, 0.391676f, 0.324293f, 0.238342f, + 0.149255f, 0.076756f, 0.031022f, 0.009191f, 0.001733f, 0.000140f, 0.000010f, 0.000019f, 0.000015f, + 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, + 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f}; + +/* Sample Rate = 32000 */ + +const float defaultHRIR_coherence_32kHz[LR_IAC_LENGTH_NR_FC] = + {0.992805f, 0.970760f, 0.904274f, 0.794804f, 0.650716f, 0.489140f, 0.331131f, 0.193608f, 0.084875f, + 0.006016f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.006084f, 0.028478f, 0.040113f, + 0.042718f, 0.041091f, 0.039575f, 0.039321f, 0.038312f, 0.033935f, 0.025743f, 0.016207f, 0.009052f, + 0.006651f, 0.008629f, 0.012678f, 0.016595f, 0.019686f, 0.022543f, 0.025721f, 0.028716f, 0.030244f, + 0.029496f, 0.027051f, 0.024537f, 0.023327f, 0.023382f, 0.023280f, 0.021454f, 0.017604f, 0.013058f, + 0.009830f, 0.009160f, 0.010653f, 0.012635f, 0.013369f, 0.012139f, 0.009418f, 0.006248f, 0.003470f, + 0.001368f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.001485f, 0.003632f, 0.005492f, 0.007105f, 0.008527f, 0.009629f, + 0.010103f, 0.009685f, 0.008382f, 0.006502f, 0.004466f, 0.002568f, 0.000890f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000067f, 0.000797f, 0.001293f, 0.001577f, 0.001732f, 0.001797f, 0.001717f, 0.001403f, 0.000826f, + 0.000060f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000318f, 0.000795f, 0.001124f, 0.001249f, 0.001151f, 0.000871f, 0.000495f, 0.000102f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000206f, 0.000612f, 0.000908f, 0.001107f, + 0.001211f, 0.001209f, 0.001095f, 0.000883f, 0.000607f, 0.000298f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000029f, 0.000144f, 0.000254f, 0.000368f, 0.000486f, 0.000599f, + 0.000706f, 0.000810f, 0.000925f, 0.001059f, 0.001209f, 0.001367f, 0.001526f, 0.001686f, 0.001850f, + 0.002018f, 0.002181f, 0.002324f, 0.002440f, 0.002532f, 0.002614f, 0.002696f, 0.002779f, 0.002860f, + 0.002941f, 0.003036f, 0.003166f, 0.003347f, 0.003580f, 0.003855f, 0.004158f, 0.004487f, 0.004850f, + 0.005251f, 0.005688f, 0.006141f, 0.006591f, 0.007029f, 0.007462f, 0.007902f, 0.008351f, 0.008798f, + 0.009224f, 0.009620f, 0.009991f, 0.010352f, 0.010711f, 0.011057f, 0.011367f, 0.011621f, 0.011817f, + 0.011973f, 0.012106f, 0.012223f, 0.012309f, 0.012340f}; + + +const float defaultHRIR_left_avg_power_32kHz[LR_IAC_LENGTH_NR_FC] = + {1.030501f, 1.026884f, 1.017950f, 1.008331f, 1.002600f, 1.002689f, 1.006923f, 1.011298f, 1.012169f, + 1.008564f, 1.002836f, 0.999190f, 1.001098f, 1.009190f, 1.020853f, 1.031695f, 1.037922f, 1.038190f, + 1.033894f, 1.027913f, 1.022760f, 1.019333f, 1.016935f, 1.014341f, 1.010980f, 1.007343f, 1.004372f, + 1.002476f, 1.000944f, 0.998381f, 0.993744f, 0.987300f, 0.980631f, 0.975661f, 0.973406f, 0.973314f, + 0.973708f, 0.972973f, 0.970597f, 0.967379f, 0.964640f, 0.963173f, 0.962707f, 0.962251f, 0.960983f, + 0.959006f, 0.957269f, 0.956892f, 0.958263f, 0.960779f, 0.963180f, 0.964405f, 0.964185f, 0.963091f, + 0.962007f, 0.961501f, 0.961514f, 0.961497f, 0.960845f, 0.959307f, 0.957094f, 0.954689f, 0.952548f, + 0.950838f, 0.949382f, 0.947807f, 0.945783f, 0.943211f, 0.940296f, 0.937430f, 0.934938f, 0.932866f, + 0.930925f, 0.928674f, 0.925802f, 0.922364f, 0.918772f, 0.915508f, 0.912798f, 0.910417f, 0.907879f, + 0.904771f, 0.901065f, 0.897182f, 0.893708f, 0.890989f, 0.888922f, 0.887041f, 0.884873f, 0.882294f, + 0.879602f, 0.877334f, 0.875865f, 0.875169f, 0.874822f, 0.874316f, 0.873406f, 0.872264f, 0.871377f, + 0.871228f, 0.871946f, 0.873284f, 0.874764f, 0.876044f, 0.877146f, 0.878469f, 0.880494f, 0.883471f, + 0.887228f, 0.891261f, 0.895055f, 0.898401f, 0.901497f, 0.904769f, 0.908500f, 0.912597f, 0.916577f, + 0.919848f, 0.922085f, 0.923416f, 0.924327f, 0.925296f, 0.926465f, 0.927512f, 0.927876f, 0.927108f, + 0.925203f, 0.922559f, 0.919733f, 0.917037f, 0.914341f, 0.911186f, 0.907145f, 0.902128f, 0.896510f, + 0.890876f, 0.885647f, 0.880803f, 0.875934f, 0.870521f, 0.864338f, 0.857593f, 0.850818f, 0.844491f, + 0.838728f, 0.833217f, 0.827473f, 0.821173f, 0.814417f, 0.807660f, 0.801457f, 0.796095f, 0.791458f, + 0.787181f, 0.782928f, 0.778681f, 0.774802f, 0.771808f, 0.770061f, 0.769530f, 0.769827f, 0.770454f, + 0.771132f, 0.771943f, 0.773228f, 0.775315f, 0.778206f, 0.781513f, 0.784677f, 0.787274f, 0.789288f, + 0.791065f, 0.793055f, 0.795463f, 0.798095f, 0.800470f, 0.802135f, 0.802987f, 0.803318f, 0.803610f, + 0.804182f, 0.804958f, 0.805536f, 0.805434f, 0.804413f, 0.802618f, 0.800482f, 0.798381f, 0.796424f, + 0.794397f, 0.791922f, 0.788779f, 0.785087f, 0.781262f, 0.777778f, 0.774863f, 0.772372f, 0.769886f, + 0.767005f, 0.763613f, 0.759968f, 0.756518f, 0.753595f, 0.751171f, 0.748880f, 0.746246f, 0.743010f, + 0.739317f, 0.735608f, 0.732307f, 0.729533f, 0.727006f, 0.724256f, 0.720938f, 0.717104f, 0.713138f, + 0.709525f, 0.706513f, 0.703976f, 0.701515f, 0.698771f, 0.695693f, 0.692572f, 0.689860f, 0.687867f, + 0.686574f, 0.685644f, 0.684672f, 0.683452f, 0.682093f, 0.680935f, 0.680291f, 0.680231f, 0.680501f, + 0.680700f, 0.680500f, 0.679869f, 0.679047f, 0.678394f, 0.678091f, 0.678035f, 0.677888f, 0.677314f, + 0.676218f, 0.674814f, 0.673484f, 0.672514f, 0.671917f, 0.671422f, 0.670711f, 0.669654f, 0.668436f, + 0.667417f, 0.666896f, 0.666879f, 0.667100f, 0.667225f}; + +const float defaultHRIR_right_avg_power_32kHz[LR_IAC_LENGTH_NR_FC] = + {1.030502f, 1.026883f, 1.017953f, 1.008327f, 1.002600f, 1.002691f, 1.006922f, 1.011300f, 1.012168f, + 1.008564f, 1.002837f, 0.999188f, 1.001094f, 1.009186f, 1.020854f, 1.031695f, 1.037923f, 1.038191f, + 1.033893f, 1.027913f, 1.022760f, 1.019332f, 1.016931f, 1.014338f, 1.010982f, 1.007343f, 1.004370f, + 1.002473f, 1.000948f, 0.998380f, 0.993744f, 0.987300f, 0.980628f, 0.975661f, 0.973406f, 0.973316f, + 0.973710f, 0.972971f, 0.970599f, 0.967380f, 0.964639f, 0.963173f, 0.962708f, 0.962246f, 0.960984f, + 0.959004f, 0.957270f, 0.956889f, 0.958265f, 0.960778f, 0.963180f, 0.964406f, 0.964189f, 0.963091f, + 0.962005f, 0.961500f, 0.961514f, 0.961496f, 0.960845f, 0.959306f, 0.957092f, 0.954688f, 0.952548f, + 0.950838f, 0.949380f, 0.947808f, 0.945783f, 0.943212f, 0.940298f, 0.937430f, 0.934937f, 0.932865f, + 0.930925f, 0.928674f, 0.925801f, 0.922365f, 0.918770f, 0.915509f, 0.912795f, 0.910417f, 0.907881f, + 0.904769f, 0.901065f, 0.897183f, 0.893709f, 0.890990f, 0.888922f, 0.887040f, 0.884874f, 0.882293f, + 0.879603f, 0.877335f, 0.875867f, 0.875169f, 0.874820f, 0.874318f, 0.873404f, 0.872263f, 0.871381f, + 0.871226f, 0.871950f, 0.873283f, 0.874763f, 0.876042f, 0.877147f, 0.878470f, 0.880494f, 0.883473f, + 0.887227f, 0.891261f, 0.895053f, 0.898401f, 0.901500f, 0.904769f, 0.908500f, 0.912599f, 0.916578f, + 0.919847f, 0.922084f, 0.923417f, 0.924328f, 0.925296f, 0.926463f, 0.927512f, 0.927872f, 0.927107f, + 0.925199f, 0.922559f, 0.919735f, 0.917037f, 0.914339f, 0.911186f, 0.907142f, 0.902131f, 0.896510f, + 0.890876f, 0.885644f, 0.880802f, 0.875934f, 0.870524f, 0.864337f, 0.857594f, 0.850819f, 0.844491f, + 0.838727f, 0.833219f, 0.827473f, 0.821173f, 0.814415f, 0.807662f, 0.801459f, 0.796094f, 0.791462f, + 0.787182f, 0.782926f, 0.778681f, 0.774803f, 0.771810f, 0.770061f, 0.769529f, 0.769825f, 0.770456f, + 0.771131f, 0.771940f, 0.773230f, 0.775319f, 0.778206f, 0.781513f, 0.784675f, 0.787274f, 0.789285f, + 0.791065f, 0.793054f, 0.795465f, 0.798097f, 0.800468f, 0.802133f, 0.802987f, 0.803319f, 0.803610f, + 0.804179f, 0.804959f, 0.805538f, 0.805434f, 0.804411f, 0.802621f, 0.800480f, 0.798379f, 0.796426f, + 0.794398f, 0.791920f, 0.788777f, 0.785087f, 0.781263f, 0.777777f, 0.774862f, 0.772372f, 0.769886f, + 0.767004f, 0.763614f, 0.759968f, 0.756517f, 0.753593f, 0.751172f, 0.748881f, 0.746246f, 0.743011f, + 0.739318f, 0.735608f, 0.732306f, 0.729532f, 0.727006f, 0.724254f, 0.720939f, 0.717103f, 0.713136f, + 0.709524f, 0.706514f, 0.703976f, 0.701513f, 0.698772f, 0.695692f, 0.692570f, 0.689859f, 0.687869f, + 0.686573f, 0.685642f, 0.684671f, 0.683452f, 0.682094f, 0.680934f, 0.680290f, 0.680228f, 0.680501f, + 0.680699f, 0.680498f, 0.679867f, 0.679050f, 0.678395f, 0.678093f, 0.678035f, 0.677889f, 0.677315f, + 0.676220f, 0.674814f, 0.673485f, 0.672517f, 0.671918f, 0.671424f, 0.670712f, 0.669657f, 0.668437f, + 0.667421f, 0.666896f, 0.666880f, 0.667103f, 0.667228f}; + +/* Sample Rate = 16000 */ +// Floating point +const float defaultHRIR_coherence_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ] = {0.983044f, 0.960794f, 0.893756f, 0.783586f, 0.638963f, 0.477338f, 0.319879f, 0.183374f, 0.075909f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003842f, 0.025288f, 0.035886f, 0.037785f, 0.035991f, 0.034784f, 0.035091f, 0.034683f, 0.030849f, 0.023146f, 0.014061f, 0.007275f, @@ -59953,7 +60147,7 @@ const float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = 0.000000f, 0.002101f, 0.004247f, 0.006330f, 0.008300f, 0.010110f, 0.011735f, 0.013165f, 0.014384f, 0.015345f, 0.015972f, 0.016191f}; -const float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = +const float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ] = {1.118974f, 1.115256f, 1.106210f, 1.096901f, 1.092316f, 1.094422f, 1.101140f, 1.107775f, 1.110000f, 1.106535f, 1.099921f, 1.094914f, 1.095643f, 1.103178f, 1.114955f, 1.126292f, 1.132973f, 1.133288f, 1.128471f, 1.121439f, 1.114842f, 1.109721f, 1.105480f, 1.100966f, 1.095650f, 1.090074f, 1.085225f, @@ -59970,7 +60164,7 @@ const float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = 0.408842f, 0.386537f, 0.364126f, 0.342284f, 0.321675f, 0.302809f, 0.286016f, 0.271536f, 0.259639f, 0.250691f, 0.245099f, 0.243192f}; -const float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = +const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ] = {1.118974f, 1.115254f, 1.106207f, 1.096903f, 1.092317f, 1.094425f, 1.101145f, 1.107775f, 1.109999f, 1.106540f, 1.099921f, 1.094912f, 1.095644f, 1.103178f, 1.114952f, 1.126292f, 1.132973f, 1.133288f, 1.128472f, 1.121439f, 1.114842f, 1.109719f, 1.105481f, 1.100965f, 1.095650f, 1.090072f, 1.085224f, @@ -59987,6 +60181,69 @@ const float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = 0.408843f, 0.386537f, 0.364127f, 0.342285f, 0.321676f, 0.302809f, 0.286016f, 0.271535f, 0.259640f, 0.250692f, 0.245099f, 0.243192f}; +// Fixed-point +const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = +{ + 131941936, 128955584, 119957896, 105171136, 85760160, 64067220, 42933432, 24612042, + 10188334, 0, 0, 0, 0, 0, 0, 515664, + 3394098, 4816537, 5071417, 4830630, 4668629, 4709834, 4655073, 4140482, + 3106603, 1887235, 976434, 678202, 930128, 1421231, 1866297, 2186138, + 2470143, 2798305, 3109019, 3241224, 3100161, 2769582, 2459539, 2332838, + 2363708, 2353373, 2100507, 1581890, 985426, 575794, 500900, 690952, + 917780, 962609, 748800, 353261, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31943, 233270, 404129, 524791, + 552977, 455534, 237431, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 281991, 570022, + 849598, 1114007, 1356941, 1575045, 1766976, 1930587, 2059571, 2143725, + 2173119 +}; + +const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = +{ + 9386634, 9355445, 9279562, 9201473, 9163011, 9180677, 9237032, 9292690, + 9311355, 9282288, 9226806, 9184804, 9190920, 9254128, 9352920, 9448022, + 9504066, 9506709, 9466301, 9407312, 9351973, 9309014, 9273438, 9235572, + 9190978, 9144203, 9103527, 9072489, 9045159, 9009583, 8957163, 8890574, + 8823608, 8772571, 8745384, 8736165, 8729244, 8709816, 8673066, 8625888, + 8580254, 8543915, 8515712, 8488416, 8456111, 8420166, 8388541, 8369901, + 8366370, 8371495, 8374003, 8364927, 8342521, 8312129, 8281292, 8254415, + 8230340, 8203924, 8170085, 8127194, 8077516, 8025297, 7974076, 7924542, + 7874755, 7821529, 7762583, 7697915, 7630009, 7562422, 7497771, 7436123, + 7374886, 7310361, 7240560, 7166262, 7091175, 7019084, 6951270, 6885512, + 6817531, 6744105, 6665286, 6584654, 6506481, 6433064, 6363086, 6292764, + 6218727, 6140494, 6060970, 5984324, 5913289, 5847338, 5783265, 5717474, + 5648469, 5577845, 5508824, 5444181, 5383817, 5324753, 5262652, 5194159, + 5118611, 5037577, 4952986, 4864990, 4771121, 4667287, 4549888, 4417843, + 4272779, 4117833, 3955581, 3787012, 3611715, 3429615, 3242507, 3054510, + 2871286, 2698405, 2540146, 2399276, 2277809, 2178009, 2102948, 2056039, + 2040042 +}; + +const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = +{ + 9386634, 9355429, 9279537, 9201489, 9163019, 9180702, 9237074, 9292690, + 9311346, 9282330, 9226806, 9184788, 9190928, 9254128, 9352895, 9448022, + 9504066, 9506709, 9466309, 9407312, 9351973, 9308998, 9273447, 9235564, + 9190978, 9144187, 9103519, 9072506, 9045184, 9009575, 8957146, 8890582, + 8823608, 8772571, 8745401, 8736173, 8729278, 8709825, 8673074, 8625888, + 8580237, 8543898, 8515721, 8488424, 8456136, 8420166, 8388566, 8369893, + 8366370, 8371487, 8374003, 8364935, 8342546, 8312129, 8281267, 8254415, + 8230340, 8203916, 8170076, 8127185, 8077508, 8025289, 7974068, 7924558, + 7874764, 7821529, 7762591, 7697907, 7630001, 7562422, 7497771, 7436132, + 7374870, 7310395, 7240526, 7166270, 7091175, 7019084, 6951270, 6885503, + 6817522, 6744113, 6665311, 6584646, 6506464, 6433072, 6363094, 6292781, + 6218727, 6140503, 6060962, 5984332, 5913297, 5847338, 5783257, 5717465, + 5648486, 5577837, 5508849, 5444190, 5383825, 5324769, 5262635, 5194159, + 5118619, 5037585, 4952986, 4864998, 4771130, 4667279, 4549888, 4417827, + 4272779, 4117825, 3955589, 3787003, 3611715, 3429623, 3242507, 3054518, + 2871294, 2698413, 2540146, 2399276, 2277800, 2178018, 2102957, 2056039, + 2040042 +}; #endif #endif -- GitLab From f8edfde8bfa607f535f83affcf8ac6178ac2fb31 Mon Sep 17 00:00:00 2001 From: Devansh Kandpal <43807487+mrkandpal@users.noreply.github.com> Date: Wed, 25 Jun 2025 16:36:43 +0200 Subject: [PATCH 1036/1310] Code Cleanup --- lib_rend/ivas_hrtf_fx.c | 137 -------- lib_rend/ivas_rom_binaural_crend_head_fx.c | 345 --------------------- 2 files changed, 482 deletions(-) diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 5729337d4..13b5ae5cb 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -289,156 +289,19 @@ ivas_error ivas_HRTF_statistics_init( switch ( sampleRate ) { case 48000: -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB - HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); - if ( HrtfStatistics->average_energy_l_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); - if ( HrtfStatistics->average_energy_r_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); - if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - floatToFixed_arr32( (float*) defaultHRIR_left_avg_power_48kHz, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ - floatToFixed_arr32( (float*) defaultHRIR_right_avg_power_48kHz, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ - floatToFixed_arr32( (float*) defaultHRIR_coherence_48kHz, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; - HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; - HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; - // TODO: dump the converted fixed point arrays to an array - printf( "average_energy_l = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) - { - printf( "%d, ", HrtfStatistics->average_energy_l_dyn[i] ); - } - printf( "};\n" ); - - printf( "average_energy_r = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) - { - printf( "%d, ", HrtfStatistics->average_energy_r_dyn[i] ); - } - printf( "};\n" ); - - printf( "inter_aural_coherence = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) - { - printf( "%d, ", HrtfStatistics->inter_aural_coherence_dyn[i] ); - } - printf( "};\n" ); -#else HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz_fx; HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz_fx; HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_48kHz_fx; -#endif break; case 32000: -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB - HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); - if ( HrtfStatistics->average_energy_l_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); - if ( HrtfStatistics->average_energy_r_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); - if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - floatToFixed_arr32( (float*) defaultHRIR_left_avg_power_32kHz, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ - floatToFixed_arr32( (float *) defaultHRIR_right_avg_power_32kHz, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ - floatToFixed_arr32( (float *) defaultHRIR_coherence_32kHz, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; - HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; - HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; - // TODO: dump the converted fixed point arrays to a string - - printf( "average_energy_l = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) - { - printf( "%d, ", HrtfStatistics->average_energy_l_dyn[i] ); - } - printf( "};\n" ); - - printf( "average_energy_r = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) - { - printf( "%d, ", HrtfStatistics->average_energy_r_dyn[i] ); - } - printf( "};\n" ); - - printf( "inter_aural_coherence = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC; i++ ) - { - printf( "%d, ", HrtfStatistics->inter_aural_coherence_dyn[i] ); - } - printf( "};\n" ); -#else HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_32kHz_fx; HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_32kHz_fx; HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz_fx; -#endif break; case 16000: -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB - HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); - if ( HrtfStatistics->average_energy_l_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); - if ( HrtfStatistics->average_energy_r_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); - if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - floatToFixed_arr32( (float*) defaultHRIR_left_avg_power_16kHz, HrtfStatistics->average_energy_l_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ - floatToFixed_arr32( (float*) defaultHRIR_right_avg_power_16kHz, HrtfStatistics->average_energy_r_dyn, Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=2 */ - floatToFixed_arr32( (float*) defaultHRIR_coherence_16kHz, HrtfStatistics->inter_aural_coherence_dyn, Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; - HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; - HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; - - printf( "\naverage_energy_l = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC_16KHZ; i++ ) - { - printf( "%d, ", HrtfStatistics->average_energy_l_dyn[i] ); - } - printf( "};\n" ); - - printf( "average_energy_r = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC_16KHZ; i++ ) - { - printf( "%d, ", HrtfStatistics->average_energy_r_dyn[i] ); - } - printf( "};\n" ); - - printf( "inter_aural_coherence = {\n" ); - for ( int i = 0; i < LR_IAC_LENGTH_NR_FC_16KHZ; i++ ) - { - printf( "%d, ", HrtfStatistics->inter_aural_coherence_dyn[i] ); - } - printf( "};\n" ); -#else - HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz_fx; HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz_fx; HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz_fx; -#endif break; } HrtfStatistics->fromROM = TRUE; diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index 405f26ca7..df78d5b25 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -59838,350 +59838,6 @@ const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 2790378,2355663,2029237,1865240,1832432 }; -#ifndef NONBE_FIX_AVG_IAC_CLDFB_REVERB - -const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, - 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, - 1532229,985023,437818,0,0,0,0,0,0, - 0,343865,773496,1203261,2004810,3054258,4103707,4777480,4887673, - 4998000,5066316,4966727,4867271,4767816,4765534,4763253,4760971,4569174, - 4329998,4090822,3659312,3099355,2539533,2037290,1621350,1205543,880065, - 916304,952677,988916,1233058,1477200,1721342,1912602,2090441,2268413, - 2427327,2573490,2719788,2859643,2989834,3120025,3219078,3193576,3168075, - 3142574,2987686,2832665,2677778,2583691,2504771,2425851,2397128,2401692, - 2406255,2356594,2225464,2094333,1933137,1651280,1369423,1087566,924357, - 761148,597940,625051,699677,774302,854295,937779,1021128,1026631, - 915230,803830,670014,446676,223338,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,5100,30735, - 56371,81872,173140,264408,355542,419698,477144,534455,552037, - 543044,533918,485599,378494,271254,173946,115964,57982,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,671,1476,2415,99723,261321,423054,646795, - 963549,1280302,1632087,2124129,2616037,3108080,3841982,4575885,5309922, - 6280181,7309766,8339216,8750996,8750996 -}; -const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269680,9222847,9180350,9155201,9130044,9104894, - 9126688,9148473,9170267,9191549,9212688,9233844,9234423,9221295,9208167, - 9191205,9168497,9145789,9127997,9129884,9131780,9133676,9164823,9195978, - 9227125,9267550,9310290,9353038,9385225,9410374,9435531,9445170,9431538, - 9417907,9399855,9364128,9328409,9292682,9270670,9248667,9226655,9215783, - 9207688,9199593,9183605,9162356,9141108,9116244,9085961,9055678,9028608, - 9014432,9000255,8986078,8975962,8965845,8955728,8926108,8891606,8857103, - 8819145,8778896,8738639,8710806,8701604,8692401,8686227,8692209,8698190, - 8704171,8686706,8669232,8651767,8623917,8593466,8563024,8543554,8531399, - 8519252,8509748,8504203,8498667,8489716,8467083,8444459,8421835,8399773, - 8377711,8355649,8351698,8352268,8352847,8355833,8360430,8365027,8363484, - 8352721,8341959,8331028,8319460,8307884,8296308,8292063,8287827,8283582, - 8271142,8256647,8242159,8221389,8196442,8171494,8150547,8135607,8120659, - 8106465,8095225,8083992,8072760,8043073,8013394,7983706,7949422,7913997, - 7878564,7853893,7836394,7818904,7801472,7784141,7766811,7744782,7703972, - 7663169,7622359,7580802,7539253,7497696,7474266,7455367,7436467,7415496, - 7393140,7370784,7338471,7291235,7244007,7197551,7154232,7110914,7067595, - 7046615,7025627,7004647,6977485,6948779,6920073,6878751,6829015,6779278, - 6733644,6694184,6654724,6618804,6597044,6575284,6553524,6518183,6482842, - 6447501,6401632,6353137,6304634,6267229,6237215,6207201,6181045,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896503,5850198,5825150, - 5805428,5785707,5765742,5745626,5725510,5693398,5643285,5593180,5544358, - 5500720,5457091,5413454,5404126,5394797,5385469,5366930,5346085,5325239, - 5282164,5224274,5166376,5115566,5075376,5035186,5002731,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773822,4700355,4646282,4605153, - 4564023,4540250,4542523,4544788,4536869,4488241,4439612,4390983,4285488, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957300,3691818,3426335,3160861,2774481,2388110,2001740, - 1708239,1437966,1167685,1059581,1059581 -}; -const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269689,9222855,9180358,9155201,9130035,9104869, - 9126663,9148465,9170258,9191540,9212688,9233827,9234415,9221295,9208175, - 9191213,9168488,9145755,9127963,9129867,9131772,9133676,9164831,9195978, - 9227133,9267550,9310281,9353021,9385200,9410357,9435506,9445153,9431522, - 9417899,9399855,9364119,9328384,9292648,9270653,9248658,9226663,9215792, - 9207688,9199593,9183596,9162348,9141100,9116236,9085953,9055678,9028617, - 9014432,9000255,8986070,8975962,8965853,8955745,8926116,8891614,8857103, - 8819145,8778888,8738631,8710789,8701587,8692385,8686219,8692200,8698181, - 8704162,8686697,8669232,8651775,8623917,8593466,8563016,8543546,8531390, - 8519244,8509739,8504203,8498675,8489724,8467100,8444468,8421844,8399773, - 8377703,8355641,8351681,8352252,8352830,8355817,8360414,8365019,8363475, - 8352721,8341959,8331037,8319469,8307893,8296316,8292072,8287835,8283591, - 8271142,8256647,8242151,8221381,8196433,8171494,8150547,8135616,8120676, - 8106482,8095250,8084009,8072777,8043081,8013385,7983698,7949405,7913972, - 7878547,7853876,7836386,7818904,7801481,7784150,7766819,7744790,7703980, - 7663161,7622350,7580793,7539244,7497696,7474258,7455358,7436459,7415487, - 7393132,7370776,7338471,7291244,7244016,7197560,7154241,7110914,7067587, - 7046607,7025627,7004647,6977485,6948770,6920064,6878742,6829006,6779270, - 6733644,6694184,6654724,6618813,6597053,6575301,6553549,6518191,6482842, - 6447492,6401623,6353137,6304643,6267229,6237215,6207201,6181037,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896512,5850207,5825167, - 5805445,5785723,5765750,5745626,5725493,5693382,5643276,5593180,5544375, - 5500729,5457074,5413429,5404109,5394789,5385478,5366939,5346093,5325247, - 5282172,5224282,5166384,5115574,5075384,5035195,5002739,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773814,4700338,4646274,4605153, - 4564023,4540258,4542523,4544788,4536878,4488249,4439612,4390983,4285480, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, - 1708239,1437966,1167685,1059573,1059573 -}; -#else - -/********************** default HRIR reverb rom tables **********************/ - -/* Sample Rate = 48000 */ - -const float defaultHRIR_coherence_48kHz[LR_IAC_LENGTH_NR_FC] = - {0.997092f, 0.947391f, 0.799213f, 0.575216f, 0.335047f, 0.138324f, 0.007933f, 0.000000f, 0.000000f, - 0.000000f, 0.008438f, 0.037607f, 0.044493f, 0.042149f, 0.041877f, 0.039860f, 0.029404f, 0.015898f, - 0.010316f, 0.014065f, 0.020005f, 0.024518f, 0.029292f, 0.033522f, 0.033418f, 0.029630f, 0.027260f, - 0.027515f, 0.025682f, 0.019571f, 0.013977f, 0.013695f, 0.016531f, 0.016882f, 0.013257f, 0.008483f, - 0.004883f, 0.002525f, 0.001004f, 0.000180f, 0.000000f, 0.000000f, 0.000000f, 0.000785f, 0.003979f, - 0.007082f, 0.009598f, 0.011665f, 0.012700f, 0.011794f, 0.009192f, 0.006164f, 0.003527f, 0.001284f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000894f, 0.002136f, 0.003127f, 0.003616f, - 0.003810f, 0.003754f, 0.003186f, 0.002091f, 0.000823f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.001007f, 0.001843f, 0.002400f, - 0.002505f, 0.002133f, 0.001524f, 0.000903f, 0.000317f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000202f, 0.000867f, 0.001309f, - 0.001553f, 0.001563f, 0.001334f, 0.000961f, 0.000530f, 0.000033f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000278f, 0.000621f, 0.000951f, 0.001272f, 0.001608f, 0.001931f, - 0.002199f, 0.002435f, 0.002687f, 0.002947f, 0.003173f, 0.003370f, 0.003577f, 0.003781f, 0.003920f, - 0.003978f, 0.003985f, 0.003937f, 0.003783f, 0.003511f, 0.003170f, 0.002788f, 0.002337f, 0.001808f, - 0.001255f, 0.000716f, 0.000166f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003551f, 0.000000f, 0.000000f, - 0.000000f, 0.005564f, 0.000000f, 0.000000f, 0.000000f, 0.008736f, 0.000000f, 0.000000f, 0.001007f, - 0.011608f, 0.002316f, 0.000000f, 0.000000f, 0.011987f, 0.005591f, 0.000000f, 0.000000f, 0.008714f, - 0.005905f, 0.000000f, 0.000000f, 0.005316f, 0.003972f, 0.000000f, 0.000000f, 0.003403f, 0.002041f, - 0.000000f, 0.000000f, 0.002140f, 0.000245f, 0.000000f}; - -const float defaultHRIR_left_avg_power_48kHz[LR_IAC_LENGTH_NR_FC] = - {0.981018f, 0.973361f, 0.958480f, 0.950611f, 0.953039f, 0.955845f, 0.950660f, 0.942556f, 0.943810f, - 0.958014f, 0.974983f, 0.982099f, 0.977269f, 0.968243f, 0.961714f, 0.957355f, 0.952468f, 0.947771f, - 0.945396f, 0.943711f, 0.938609f, 0.929975f, 0.922937f, 0.921202f, 0.922151f, 0.920926f, 0.917154f, - 0.914393f, 0.914067f, 0.913705f, 0.911632f, 0.910100f, 0.911873f, 0.915812f, 0.918271f, 0.917846f, - 0.916545f, 0.916408f, 0.916915f, 0.916273f, 0.914005f, 0.911339f, 0.909453f, 0.908137f, 0.906301f, - 0.903476f, 0.900479f, 0.898396f, 0.897057f, 0.895115f, 0.891879f, 0.888353f, 0.885879f, 0.884157f, - 0.881651f, 0.877929f, 0.874417f, 0.872453f, 0.871459f, 0.869941f, 0.867796f, 0.866504f, 0.866990f, - 0.868298f, 0.868985f, 0.869170f, 0.870398f, 0.873460f, 0.877373f, 0.880867f, 0.884271f, 0.889105f, - 0.895880f, 0.903280f, 0.909888f, 0.915965f, 0.922776f, 0.930375f, 0.937111f, 0.941667f, 0.944690f, - 0.947747f, 0.950950f, 0.952712f, 0.951893f, 0.949398f, 0.946830f, 0.944212f, 0.940067f, 0.933749f, - 0.926604f, 0.920193f, 0.914164f, 0.906886f, 0.897913f, 0.888731f, 0.880661f, 0.873093f, 0.864556f, - 0.855014f, 0.846098f, 0.839027f, 0.833268f, 0.827720f, 0.822648f, 0.819628f, 0.819557f, 0.821500f, - 0.823986f, 0.826902f, 0.831352f, 0.837670f, 0.844414f, 0.850004f, 0.854617f, 0.859684f, 0.865573f, - 0.870873f, 0.874346f, 0.876636f, 0.879215f, 0.882152f, 0.883944f, 0.883578f, 0.881897f, 0.880319f, - 0.878855f, 0.876201f, 0.871708f, 0.866458f, 0.861964f, 0.858239f, 0.853971f, 0.848551f, 0.843114f, - 0.839005f, 0.835832f, 0.831994f, 0.826972f, 0.822069f, 0.818424f, 0.815337f, 0.811300f, 0.806249f, - 0.801664f, 0.798529f, 0.796124f, 0.793286f, 0.790217f, 0.788277f, 0.788174f, 0.789082f, 0.789775f, - 0.790281f, 0.791803f, 0.794902f, 0.798467f, 0.801024f, 0.802713f, 0.804961f, 0.808244f, 0.811142f, - 0.812318f, 0.812488f, 0.813349f, 0.815025f, 0.815968f, 0.815334f, 0.814250f, 0.814149f, 0.814776f, - 0.814769f, 0.813685f, 0.812567f, 0.812562f, 0.813456f, 0.814055f, 0.813739f, 0.813391f, 0.814325f, - 0.816394f, 0.817949f, 0.818173f, 0.818552f, 0.820798f, 0.824070f, 0.826010f, 0.826515f, 0.828132f, - 0.832036f, 0.835874f, 0.837493f, 0.838582f, 0.842046f, 0.847074f, 0.850262f, 0.851182f, 0.852997f, - 0.856510f, 0.857491f, 0.852207f, 0.842444f, 0.831373f, 0.816756f, 0.793031f, 0.759822f, 0.723220f, - 0.686833f, 0.646128f, 0.595684f, 0.539241f, 0.486856f, 0.441279f, 0.391675f, 0.324292f, 0.238341f, - 0.149255f, 0.076756f, 0.031022f, 0.009191f, 0.001733f, 0.000140f, 0.000010f, 0.000019f, 0.000015f, - 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, - 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, - 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, - 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f}; - -const float defaultHRIR_right_avg_power_48kHz[LR_IAC_LENGTH_NR_FC] = - {0.981020f, 0.973360f, 0.958481f, 0.950613f, 0.953040f, 0.955848f, 0.950658f, 0.942557f, 0.943810f, - 0.958017f, 0.974981f, 0.982098f, 0.977271f, 0.968244f, 0.961715f, 0.957356f, 0.952467f, 0.947770f, - 0.945398f, 0.943710f, 0.938610f, 0.929975f, 0.922938f, 0.921205f, 0.922151f, 0.920926f, 0.917152f, - 0.914393f, 0.914069f, 0.913705f, 0.911630f, 0.910101f, 0.911874f, 0.915811f, 0.918272f, 0.917846f, - 0.916542f, 0.916408f, 0.916918f, 0.916272f, 0.914004f, 0.911340f, 0.909452f, 0.908136f, 0.906302f, - 0.903479f, 0.900480f, 0.898395f, 0.897055f, 0.895119f, 0.891880f, 0.888352f, 0.885878f, 0.884154f, - 0.881649f, 0.877926f, 0.874417f, 0.872450f, 0.871458f, 0.869943f, 0.867797f, 0.866503f, 0.866987f, - 0.868297f, 0.868981f, 0.869171f, 0.870394f, 0.873460f, 0.877377f, 0.880866f, 0.884272f, 0.889105f, - 0.895880f, 0.903282f, 0.909886f, 0.915965f, 0.922778f, 0.930375f, 0.937113f, 0.941665f, 0.944689f, - 0.947744f, 0.950952f, 0.952711f, 0.951895f, 0.949398f, 0.946830f, 0.944209f, 0.940067f, 0.933750f, - 0.926601f, 0.920191f, 0.914167f, 0.906884f, 0.897916f, 0.888731f, 0.880663f, 0.873093f, 0.864559f, - 0.855017f, 0.846098f, 0.839028f, 0.833267f, 0.827717f, 0.822649f, 0.819631f, 0.819558f, 0.821499f, - 0.823985f, 0.826902f, 0.831353f, 0.837669f, 0.844416f, 0.850003f, 0.854616f, 0.859686f, 0.865572f, - 0.870872f, 0.874347f, 0.876635f, 0.879216f, 0.882154f, 0.883942f, 0.883576f, 0.881895f, 0.880318f, - 0.878857f, 0.876202f, 0.871706f, 0.866459f, 0.861965f, 0.858241f, 0.853968f, 0.848548f, 0.843114f, - 0.839005f, 0.835832f, 0.831994f, 0.826974f, 0.822068f, 0.818424f, 0.815335f, 0.811299f, 0.806245f, - 0.801662f, 0.798530f, 0.796124f, 0.793287f, 0.790217f, 0.788273f, 0.788173f, 0.789081f, 0.789770f, - 0.790279f, 0.791801f, 0.794900f, 0.798466f, 0.801028f, 0.802711f, 0.804962f, 0.808246f, 0.811143f, - 0.812318f, 0.812490f, 0.813348f, 0.815027f, 0.815969f, 0.815335f, 0.814254f, 0.814150f, 0.814776f, - 0.814772f, 0.813686f, 0.812569f, 0.812558f, 0.813456f, 0.814055f, 0.813736f, 0.813389f, 0.814324f, - 0.816395f, 0.817948f, 0.818173f, 0.818549f, 0.820796f, 0.824069f, 0.826013f, 0.826514f, 0.828134f, - 0.832033f, 0.835874f, 0.837493f, 0.838582f, 0.842047f, 0.847077f, 0.850263f, 0.851184f, 0.852998f, - 0.856513f, 0.857491f, 0.852209f, 0.842446f, 0.831375f, 0.816757f, 0.793032f, 0.759821f, 0.723221f, - 0.686832f, 0.646128f, 0.595684f, 0.539241f, 0.486856f, 0.441280f, 0.391676f, 0.324293f, 0.238342f, - 0.149255f, 0.076756f, 0.031022f, 0.009191f, 0.001733f, 0.000140f, 0.000010f, 0.000019f, 0.000015f, - 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, - 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, - 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, - 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f}; - -/* Sample Rate = 32000 */ - -const float defaultHRIR_coherence_32kHz[LR_IAC_LENGTH_NR_FC] = - {0.992805f, 0.970760f, 0.904274f, 0.794804f, 0.650716f, 0.489140f, 0.331131f, 0.193608f, 0.084875f, - 0.006016f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.006084f, 0.028478f, 0.040113f, - 0.042718f, 0.041091f, 0.039575f, 0.039321f, 0.038312f, 0.033935f, 0.025743f, 0.016207f, 0.009052f, - 0.006651f, 0.008629f, 0.012678f, 0.016595f, 0.019686f, 0.022543f, 0.025721f, 0.028716f, 0.030244f, - 0.029496f, 0.027051f, 0.024537f, 0.023327f, 0.023382f, 0.023280f, 0.021454f, 0.017604f, 0.013058f, - 0.009830f, 0.009160f, 0.010653f, 0.012635f, 0.013369f, 0.012139f, 0.009418f, 0.006248f, 0.003470f, - 0.001368f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.001485f, 0.003632f, 0.005492f, 0.007105f, 0.008527f, 0.009629f, - 0.010103f, 0.009685f, 0.008382f, 0.006502f, 0.004466f, 0.002568f, 0.000890f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000067f, 0.000797f, 0.001293f, 0.001577f, 0.001732f, 0.001797f, 0.001717f, 0.001403f, 0.000826f, - 0.000060f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000318f, 0.000795f, 0.001124f, 0.001249f, 0.001151f, 0.000871f, 0.000495f, 0.000102f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000206f, 0.000612f, 0.000908f, 0.001107f, - 0.001211f, 0.001209f, 0.001095f, 0.000883f, 0.000607f, 0.000298f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000029f, 0.000144f, 0.000254f, 0.000368f, 0.000486f, 0.000599f, - 0.000706f, 0.000810f, 0.000925f, 0.001059f, 0.001209f, 0.001367f, 0.001526f, 0.001686f, 0.001850f, - 0.002018f, 0.002181f, 0.002324f, 0.002440f, 0.002532f, 0.002614f, 0.002696f, 0.002779f, 0.002860f, - 0.002941f, 0.003036f, 0.003166f, 0.003347f, 0.003580f, 0.003855f, 0.004158f, 0.004487f, 0.004850f, - 0.005251f, 0.005688f, 0.006141f, 0.006591f, 0.007029f, 0.007462f, 0.007902f, 0.008351f, 0.008798f, - 0.009224f, 0.009620f, 0.009991f, 0.010352f, 0.010711f, 0.011057f, 0.011367f, 0.011621f, 0.011817f, - 0.011973f, 0.012106f, 0.012223f, 0.012309f, 0.012340f}; - - -const float defaultHRIR_left_avg_power_32kHz[LR_IAC_LENGTH_NR_FC] = - {1.030501f, 1.026884f, 1.017950f, 1.008331f, 1.002600f, 1.002689f, 1.006923f, 1.011298f, 1.012169f, - 1.008564f, 1.002836f, 0.999190f, 1.001098f, 1.009190f, 1.020853f, 1.031695f, 1.037922f, 1.038190f, - 1.033894f, 1.027913f, 1.022760f, 1.019333f, 1.016935f, 1.014341f, 1.010980f, 1.007343f, 1.004372f, - 1.002476f, 1.000944f, 0.998381f, 0.993744f, 0.987300f, 0.980631f, 0.975661f, 0.973406f, 0.973314f, - 0.973708f, 0.972973f, 0.970597f, 0.967379f, 0.964640f, 0.963173f, 0.962707f, 0.962251f, 0.960983f, - 0.959006f, 0.957269f, 0.956892f, 0.958263f, 0.960779f, 0.963180f, 0.964405f, 0.964185f, 0.963091f, - 0.962007f, 0.961501f, 0.961514f, 0.961497f, 0.960845f, 0.959307f, 0.957094f, 0.954689f, 0.952548f, - 0.950838f, 0.949382f, 0.947807f, 0.945783f, 0.943211f, 0.940296f, 0.937430f, 0.934938f, 0.932866f, - 0.930925f, 0.928674f, 0.925802f, 0.922364f, 0.918772f, 0.915508f, 0.912798f, 0.910417f, 0.907879f, - 0.904771f, 0.901065f, 0.897182f, 0.893708f, 0.890989f, 0.888922f, 0.887041f, 0.884873f, 0.882294f, - 0.879602f, 0.877334f, 0.875865f, 0.875169f, 0.874822f, 0.874316f, 0.873406f, 0.872264f, 0.871377f, - 0.871228f, 0.871946f, 0.873284f, 0.874764f, 0.876044f, 0.877146f, 0.878469f, 0.880494f, 0.883471f, - 0.887228f, 0.891261f, 0.895055f, 0.898401f, 0.901497f, 0.904769f, 0.908500f, 0.912597f, 0.916577f, - 0.919848f, 0.922085f, 0.923416f, 0.924327f, 0.925296f, 0.926465f, 0.927512f, 0.927876f, 0.927108f, - 0.925203f, 0.922559f, 0.919733f, 0.917037f, 0.914341f, 0.911186f, 0.907145f, 0.902128f, 0.896510f, - 0.890876f, 0.885647f, 0.880803f, 0.875934f, 0.870521f, 0.864338f, 0.857593f, 0.850818f, 0.844491f, - 0.838728f, 0.833217f, 0.827473f, 0.821173f, 0.814417f, 0.807660f, 0.801457f, 0.796095f, 0.791458f, - 0.787181f, 0.782928f, 0.778681f, 0.774802f, 0.771808f, 0.770061f, 0.769530f, 0.769827f, 0.770454f, - 0.771132f, 0.771943f, 0.773228f, 0.775315f, 0.778206f, 0.781513f, 0.784677f, 0.787274f, 0.789288f, - 0.791065f, 0.793055f, 0.795463f, 0.798095f, 0.800470f, 0.802135f, 0.802987f, 0.803318f, 0.803610f, - 0.804182f, 0.804958f, 0.805536f, 0.805434f, 0.804413f, 0.802618f, 0.800482f, 0.798381f, 0.796424f, - 0.794397f, 0.791922f, 0.788779f, 0.785087f, 0.781262f, 0.777778f, 0.774863f, 0.772372f, 0.769886f, - 0.767005f, 0.763613f, 0.759968f, 0.756518f, 0.753595f, 0.751171f, 0.748880f, 0.746246f, 0.743010f, - 0.739317f, 0.735608f, 0.732307f, 0.729533f, 0.727006f, 0.724256f, 0.720938f, 0.717104f, 0.713138f, - 0.709525f, 0.706513f, 0.703976f, 0.701515f, 0.698771f, 0.695693f, 0.692572f, 0.689860f, 0.687867f, - 0.686574f, 0.685644f, 0.684672f, 0.683452f, 0.682093f, 0.680935f, 0.680291f, 0.680231f, 0.680501f, - 0.680700f, 0.680500f, 0.679869f, 0.679047f, 0.678394f, 0.678091f, 0.678035f, 0.677888f, 0.677314f, - 0.676218f, 0.674814f, 0.673484f, 0.672514f, 0.671917f, 0.671422f, 0.670711f, 0.669654f, 0.668436f, - 0.667417f, 0.666896f, 0.666879f, 0.667100f, 0.667225f}; - -const float defaultHRIR_right_avg_power_32kHz[LR_IAC_LENGTH_NR_FC] = - {1.030502f, 1.026883f, 1.017953f, 1.008327f, 1.002600f, 1.002691f, 1.006922f, 1.011300f, 1.012168f, - 1.008564f, 1.002837f, 0.999188f, 1.001094f, 1.009186f, 1.020854f, 1.031695f, 1.037923f, 1.038191f, - 1.033893f, 1.027913f, 1.022760f, 1.019332f, 1.016931f, 1.014338f, 1.010982f, 1.007343f, 1.004370f, - 1.002473f, 1.000948f, 0.998380f, 0.993744f, 0.987300f, 0.980628f, 0.975661f, 0.973406f, 0.973316f, - 0.973710f, 0.972971f, 0.970599f, 0.967380f, 0.964639f, 0.963173f, 0.962708f, 0.962246f, 0.960984f, - 0.959004f, 0.957270f, 0.956889f, 0.958265f, 0.960778f, 0.963180f, 0.964406f, 0.964189f, 0.963091f, - 0.962005f, 0.961500f, 0.961514f, 0.961496f, 0.960845f, 0.959306f, 0.957092f, 0.954688f, 0.952548f, - 0.950838f, 0.949380f, 0.947808f, 0.945783f, 0.943212f, 0.940298f, 0.937430f, 0.934937f, 0.932865f, - 0.930925f, 0.928674f, 0.925801f, 0.922365f, 0.918770f, 0.915509f, 0.912795f, 0.910417f, 0.907881f, - 0.904769f, 0.901065f, 0.897183f, 0.893709f, 0.890990f, 0.888922f, 0.887040f, 0.884874f, 0.882293f, - 0.879603f, 0.877335f, 0.875867f, 0.875169f, 0.874820f, 0.874318f, 0.873404f, 0.872263f, 0.871381f, - 0.871226f, 0.871950f, 0.873283f, 0.874763f, 0.876042f, 0.877147f, 0.878470f, 0.880494f, 0.883473f, - 0.887227f, 0.891261f, 0.895053f, 0.898401f, 0.901500f, 0.904769f, 0.908500f, 0.912599f, 0.916578f, - 0.919847f, 0.922084f, 0.923417f, 0.924328f, 0.925296f, 0.926463f, 0.927512f, 0.927872f, 0.927107f, - 0.925199f, 0.922559f, 0.919735f, 0.917037f, 0.914339f, 0.911186f, 0.907142f, 0.902131f, 0.896510f, - 0.890876f, 0.885644f, 0.880802f, 0.875934f, 0.870524f, 0.864337f, 0.857594f, 0.850819f, 0.844491f, - 0.838727f, 0.833219f, 0.827473f, 0.821173f, 0.814415f, 0.807662f, 0.801459f, 0.796094f, 0.791462f, - 0.787182f, 0.782926f, 0.778681f, 0.774803f, 0.771810f, 0.770061f, 0.769529f, 0.769825f, 0.770456f, - 0.771131f, 0.771940f, 0.773230f, 0.775319f, 0.778206f, 0.781513f, 0.784675f, 0.787274f, 0.789285f, - 0.791065f, 0.793054f, 0.795465f, 0.798097f, 0.800468f, 0.802133f, 0.802987f, 0.803319f, 0.803610f, - 0.804179f, 0.804959f, 0.805538f, 0.805434f, 0.804411f, 0.802621f, 0.800480f, 0.798379f, 0.796426f, - 0.794398f, 0.791920f, 0.788777f, 0.785087f, 0.781263f, 0.777777f, 0.774862f, 0.772372f, 0.769886f, - 0.767004f, 0.763614f, 0.759968f, 0.756517f, 0.753593f, 0.751172f, 0.748881f, 0.746246f, 0.743011f, - 0.739318f, 0.735608f, 0.732306f, 0.729532f, 0.727006f, 0.724254f, 0.720939f, 0.717103f, 0.713136f, - 0.709524f, 0.706514f, 0.703976f, 0.701513f, 0.698772f, 0.695692f, 0.692570f, 0.689859f, 0.687869f, - 0.686573f, 0.685642f, 0.684671f, 0.683452f, 0.682094f, 0.680934f, 0.680290f, 0.680228f, 0.680501f, - 0.680699f, 0.680498f, 0.679867f, 0.679050f, 0.678395f, 0.678093f, 0.678035f, 0.677889f, 0.677315f, - 0.676220f, 0.674814f, 0.673485f, 0.672517f, 0.671918f, 0.671424f, 0.670712f, 0.669657f, 0.668437f, - 0.667421f, 0.666896f, 0.666880f, 0.667103f, 0.667228f}; - -/* Sample Rate = 16000 */ -// Floating point -const float defaultHRIR_coherence_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ] = - {0.983044f, 0.960794f, 0.893756f, 0.783586f, 0.638963f, 0.477338f, 0.319879f, 0.183374f, 0.075909f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003842f, 0.025288f, 0.035886f, - 0.037785f, 0.035991f, 0.034784f, 0.035091f, 0.034683f, 0.030849f, 0.023146f, 0.014061f, 0.007275f, - 0.005053f, 0.006930f, 0.010589f, 0.013905f, 0.016288f, 0.018404f, 0.020849f, 0.023164f, 0.024149f, - 0.023098f, 0.020635f, 0.018325f, 0.017381f, 0.017611f, 0.017534f, 0.015650f, 0.011786f, 0.007342f, - 0.004290f, 0.003732f, 0.005148f, 0.006838f, 0.007172f, 0.005579f, 0.002632f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.001738f, 0.003011f, 0.003910f, - 0.004120f, 0.003394f, 0.001769f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.002101f, 0.004247f, 0.006330f, 0.008300f, 0.010110f, 0.011735f, 0.013165f, 0.014384f, - 0.015345f, 0.015972f, 0.016191f}; - -const float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ] = - {1.118974f, 1.115256f, 1.106210f, 1.096901f, 1.092316f, 1.094422f, 1.101140f, 1.107775f, 1.110000f, - 1.106535f, 1.099921f, 1.094914f, 1.095643f, 1.103178f, 1.114955f, 1.126292f, 1.132973f, 1.133288f, - 1.128471f, 1.121439f, 1.114842f, 1.109721f, 1.105480f, 1.100966f, 1.095650f, 1.090074f, 1.085225f, - 1.081525f, 1.078267f, 1.074026f, 1.067777f, 1.059839f, 1.051856f, 1.045772f, 1.042531f, 1.041432f, - 1.040607f, 1.038291f, 1.033910f, 1.028286f, 1.022846f, 1.018514f, 1.015152f, 1.011898f, 1.008047f, - 1.003762f, 0.999992f, 0.997770f, 0.997349f, 0.997960f, 0.998259f, 0.997177f, 0.994506f, 0.990883f, - 0.987207f, 0.984003f, 0.981133f, 0.977984f, 0.973950f, 0.968837f, 0.962915f, 0.956690f, 0.950584f, - 0.944679f, 0.938744f, 0.932399f, 0.925372f, 0.917663f, 0.909568f, 0.901511f, 0.893804f, 0.886455f, - 0.879155f, 0.871463f, 0.863142f, 0.854285f, 0.845334f, 0.836740f, 0.828656f, 0.820817f, 0.812713f, - 0.803960f, 0.794564f, 0.784952f, 0.775633f, 0.766881f, 0.758539f, 0.750156f, 0.741330f, 0.732004f, - 0.722524f, 0.713387f, 0.704919f, 0.697057f, 0.689419f, 0.681576f, 0.673350f, 0.664931f, 0.656703f, - 0.648997f, 0.641801f, 0.634760f, 0.627357f, 0.619192f, 0.610186f, 0.600526f, 0.590442f, 0.579952f, - 0.568762f, 0.556384f, 0.542389f, 0.526648f, 0.509355f, 0.490884f, 0.471542f, 0.451447f, 0.430550f, - 0.408842f, 0.386537f, 0.364126f, 0.342284f, 0.321675f, 0.302809f, 0.286016f, 0.271536f, 0.259639f, - 0.250691f, 0.245099f, 0.243192f}; - -const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ] = - {1.118974f, 1.115254f, 1.106207f, 1.096903f, 1.092317f, 1.094425f, 1.101145f, 1.107775f, 1.109999f, - 1.106540f, 1.099921f, 1.094912f, 1.095644f, 1.103178f, 1.114952f, 1.126292f, 1.132973f, 1.133288f, - 1.128472f, 1.121439f, 1.114842f, 1.109719f, 1.105481f, 1.100965f, 1.095650f, 1.090072f, 1.085224f, - 1.081527f, 1.078270f, 1.074025f, 1.067775f, 1.059840f, 1.051856f, 1.045772f, 1.042533f, 1.041433f, - 1.040611f, 1.038292f, 1.033911f, 1.028286f, 1.022844f, 1.018512f, 1.015153f, 1.011899f, 1.008050f, - 1.003762f, 0.999995f, 0.997769f, 0.997349f, 0.997959f, 0.998259f, 0.997178f, 0.994509f, 0.990883f, - 0.987204f, 0.984003f, 0.981133f, 0.977983f, 0.973949f, 0.968836f, 0.962914f, 0.956689f, 0.950583f, - 0.944681f, 0.938745f, 0.932399f, 0.925373f, 0.917662f, 0.909567f, 0.901511f, 0.893804f, 0.886456f, - 0.879153f, 0.871467f, 0.863138f, 0.854286f, 0.845334f, 0.836740f, 0.828656f, 0.820816f, 0.812712f, - 0.803961f, 0.794567f, 0.784951f, 0.775631f, 0.766882f, 0.758540f, 0.750158f, 0.741330f, 0.732005f, - 0.722523f, 0.713388f, 0.704920f, 0.697057f, 0.689418f, 0.681575f, 0.673352f, 0.664930f, 0.656706f, - 0.648998f, 0.641802f, 0.634762f, 0.627355f, 0.619192f, 0.610187f, 0.600527f, 0.590442f, 0.579953f, - 0.568763f, 0.556383f, 0.542389f, 0.526646f, 0.509355f, 0.490883f, 0.471543f, 0.451446f, 0.430550f, - 0.408843f, 0.386537f, 0.364127f, 0.342285f, 0.321676f, 0.302809f, 0.286016f, 0.271535f, 0.259640f, - 0.250692f, 0.245099f, 0.243192f}; - -// Fixed-point const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = { 131941936, 128955584, 119957896, 105171136, 85760160, 64067220, 42933432, 24612042, @@ -60245,7 +59901,6 @@ const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = 2040042 }; -#endif #endif Word32 sine_table_Q31 [361] = { -- GitLab From 87caabb2da09f7113bf2d3c0ad9a86567e9d2d45 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 25 Jun 2025 17:02:37 +0200 Subject: [PATCH 1037/1310] Revert from change b21540b59f1d6cac6a5aee2a763befde42d383b1 Q0 for q_syn in PLC case. --- lib_dec/ivas_mdct_core_dec_fx.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 7f17bb0fc..1cce316f1 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1386,7 +1386,6 @@ void ivas_mdct_core_reconstruct_fx( ELSE /*ACELP core for ACELP-PLC */ { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN -#if 0 Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth @@ -1394,11 +1393,6 @@ void ivas_mdct_core_reconstruct_fx( // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); /////////////////////////////////////////////////////////////////////////////////// -#else - Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( 0, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth -> Q0 - Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( 0, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth -> Q0 - q_syn = 0; -#endif #endif assert( EQ_16( st->bfi, 1 ) ); /* PLC: [TCX: TD PLC] */ -- GitLab From f33e98ba734e2b6df1e4c859283009524ce52aed Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 25 Jun 2025 21:16:40 +0530 Subject: [PATCH 1038/1310] Non bit-exact optimizations in calculate_hodirac_sector_parameters_fx Reduction of ~10 WMOPS observed. --- lib_com/ivas_dirac_com_fx.c | 277 ++++++++++++++++++++++++++++++++++-- lib_com/options.h | 1 + 2 files changed, 263 insertions(+), 15 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 14dd6c148..befeb273c 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -1112,6 +1112,17 @@ void calculate_hodirac_sector_parameters_fx( Word16 i_sec, i_bin, i_band; Word32 p_real_fx, p_imag_fx, normI_fx, energy_fx, tmp_diff_fx; Word16 energy_exp, normI_exp, tmp_diff_exp; +#ifdef OPT_SBA_ENC_V2_NBE + Word16 tmp_exp_1 = sub( 33, shl( Qfac, 1 ) ); // 31 - (2 *Qfac - 2 ) + Word16 tmp_exp_2 = sub( 35, shl( Qfac, 1 ) ); // 31 - (2 *Qfac - 4 ) + Word32 tmp32_1, tmp32_2; + Word64 temp_x64 = 0, temp_y64 = 0, temp_z64 = 0; + Word16 tmp_scale = 0; + move64(); + move64(); + move64(); + move16(); +#endif Word32 sec_I_vec_x_fx[NUM_ANA_SECTORS]; Word32 sec_I_vec_y_fx[NUM_ANA_SECTORS]; @@ -1185,7 +1196,16 @@ void calculate_hodirac_sector_parameters_fx( move32(); energy_exp = 0; move16(); - +#ifdef OPT_SBA_ENC_V2_NBE + Word64 sec_I_vec_x_64_fx = 0; + Word64 sec_I_vec_y_64_fx = 0; + Word64 sec_I_vec_z_64_fx = 0; + Word64 energy_64_fx = 0; + move64(); + move64(); + move64(); + move64(); +#endif IF( i_sec == 0 ) { FOR( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) @@ -1194,7 +1214,18 @@ void calculate_hodirac_sector_parameters_fx( move32(); Word32 sec_w_imag_fx, sec_x_imag_fx, sec_y_imag_fx, sec_z_imag_fx; Word32 sec_w_real_fx, sec_x_real_fx, sec_y_real_fx, sec_z_real_fx; - +#ifdef OPT_SBA_ENC_V2_NBE + sec_w_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ); // Qfac - 2 + sec_x_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_imag_fx = Msub_32_32( ( Msub_32_32( ( Madd_32_32( Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_imag_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ); // Qfac - 2 + + sec_w_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ); // Qfac - 2 + sec_x_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_real_fx = Msub_32_32( ( Msub_32_32( Madd_32_32( Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ), HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_real_fx = Madd_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ); // Qfac - 2 + +#else sec_w_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ) ); // Qfac - 2 sec_x_imag_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ) ); // Qfac - 2 sec_y_imag_fx = L_sub( L_sub( L_add( Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ) ); // Qfac - 2 @@ -1204,14 +1235,17 @@ void calculate_hodirac_sector_parameters_fx( sec_x_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ) ); // Qfac - 2 sec_y_real_fx = L_sub( L_sub( L_add( Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ) ); // Qfac - 2 sec_z_real_fx = L_add( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ) ); // Qfac - 2 +#endif +#ifndef OPT_SBA_ENC_V2_NBE Word16 p_q; Word32 tmp_x, tmp_y, tmp_z; Word16 n, n1, n2; - +#endif p_real_fx = Mpy_32_32( sec_w_real_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 p_imag_fx = Mpy_32_32( sec_w_imag_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 +#ifndef OPT_SBA_ENC_V2_NBE n1 = norm_l( p_real_fx ); n2 = norm_l( p_imag_fx ); @@ -1234,13 +1268,35 @@ void calculate_hodirac_sector_parameters_fx( move32(); *p_sec_I_vec_z_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_z_fx, *p_sec_I_vec_z_exp, tmp_z, tmp_exp, p_sec_I_vec_z_exp ); move32(); - - Word32 tmp1; +#else + temp_x64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_x_real_fx ), p_imag_fx, sec_x_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_y64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_y_real_fx ), p_imag_fx, sec_y_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_z64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_z_real_fx ), p_imag_fx, sec_z_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + sec_I_vec_x_64_fx = W_add( sec_I_vec_x_64_fx, temp_x64 ); + sec_I_vec_y_64_fx = W_add( sec_I_vec_y_64_fx, temp_y64 ); + sec_I_vec_z_64_fx = W_add( sec_I_vec_z_64_fx, temp_z64 ); + + Word64 tmp1; +#endif Word64 tmp2, tmp3, tmp4, sec_sum64; +#ifndef OPT_SBA_ENC_V2_NBE + Word32 tmp1; Word32 tmp5, sec_sum; tmp_exp = sub( 62, add( p_q, p_q ) ); tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( p_real_fx, p_real_fx ), tmp_exp, Mpy_32_32( p_imag_fx, p_imag_fx ), tmp_exp, &tmp_exp ); +#endif +#ifdef OPT_SBA_ENC_V2_NBE + tmp1 = W_mac_32_32( W_mult_32_32( p_real_fx, p_real_fx ), p_imag_fx, p_imag_fx ); // 2 * (Qfac - 3) + 1 + tmp1 = W_shl( tmp1, 2 ); // 2 * (Qfac - 2) + 1 + tmp2 = W_mac_32_32( W_mult_32_32( sec_x_real_fx, sec_x_real_fx ), sec_x_imag_fx, sec_x_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp3 = W_mac_32_32( W_mult_32_32( sec_y_real_fx, sec_y_real_fx ), sec_y_imag_fx, sec_y_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp4 = W_mac_32_32( W_mult_32_32( sec_z_real_fx, sec_z_real_fx ), sec_z_imag_fx, sec_z_imag_fx ); // 2 * (Qfac - 2) + 1 + sec_sum64 = W_add( tmp1, W_add( W_add( tmp2, tmp3 ), tmp4 ) ); // 2 * (Qfac - 2) + 1 + + // instead dividing changed Q// + energy_64_fx = W_add( energy_64_fx, sec_sum64 ); // 2 * (Qfac - 2) + 1 + 1 +#else tmp2 = W_add( W_mult0_32_32( sec_x_real_fx, sec_x_real_fx ), W_mult0_32_32( sec_x_imag_fx, sec_x_imag_fx ) ); // 2 * (Qfac - 2) tmp3 = W_add( W_mult0_32_32( sec_y_real_fx, sec_y_real_fx ), W_mult0_32_32( sec_y_imag_fx, sec_y_imag_fx ) ); // 2 * (Qfac - 2) tmp4 = W_add( W_mult0_32_32( sec_z_real_fx, sec_z_real_fx ), W_mult0_32_32( sec_z_imag_fx, sec_z_imag_fx ) ); // 2 * (Qfac - 2) @@ -1256,7 +1312,51 @@ void calculate_hodirac_sector_parameters_fx( tmp5 = BASOP_Util_Add_Mant32Exp( tmp1, tmp_exp, sec_sum, sec_sum_exp, &tmp_exp ); energy_fx = BASOP_Util_Add_Mant32Exp( energy_fx, energy_exp, tmp5, tmp_exp, &energy_exp ); +#endif + } +#ifdef OPT_SBA_ENC_V2_NBE + tmp_scale = sub( W_norm( energy_64_fx ), 32 ); + energy_fx = W_shl_sat_l( energy_64_fx, tmp_scale ); + energy_exp = sub( tmp_exp_1, tmp_scale ); + if ( energy_fx == 0 ) + { + energy_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( sec_I_vec_x_64_fx ), 32 ); + *p_sec_I_vec_x_fx = W_shl_sat_l( sec_I_vec_x_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_x_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_x_fx == 0 ) + { + *p_sec_I_vec_x_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( sec_I_vec_y_64_fx ), 32 ); + *p_sec_I_vec_y_fx = W_shl_sat_l( sec_I_vec_y_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_y_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_y_fx == 0 ) + { + *p_sec_I_vec_y_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( sec_I_vec_z_64_fx ), 32 ); + *p_sec_I_vec_z_fx = W_shl_sat_l( sec_I_vec_z_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_z_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_z_fx == 0 ) + { + *p_sec_I_vec_z_exp = 0; + move16(); } +#endif } ELSE { @@ -1267,6 +1367,18 @@ void calculate_hodirac_sector_parameters_fx( Word32 sec_w_imag_fx, sec_x_imag_fx, sec_y_imag_fx, sec_z_imag_fx; Word32 sec_w_real_fx, sec_x_real_fx, sec_y_real_fx, sec_z_real_fx; +#ifdef OPT_SBA_ENC_V2_NBE + sec_w_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ); // Qfac - 2 + sec_x_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_imag_fx = Madd_32_32( ( Madd_32_32( ( Madd_32_32( Mpy_32_32( -HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_imag_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_ImagBuffer_5_fx++ ) ); // Qfac - 2 + + sec_w_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_0_fx ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx ) ); // Qfac - 2 + sec_x_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ); // Qfac - 2 + sec_y_real_fx = Madd_32_32( ( Madd_32_32( ( Madd_32_32( Mpy_32_32( -HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ); // Qfac - 2 + sec_z_real_fx = Msub_32_32( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ); // Qfac - 2 + +#else sec_w_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_0_fx ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx ) ) ); // Qfac - 2 sec_x_imag_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_4_fx++ ) ) ); // Qfac - 2 sec_y_imag_fx = L_add( L_add( L_add( Mpy_32_32( -HODIRAC_FAC3, *( p_ImagBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_ImagBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_ImagBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_ImagBuffer_8_fx++ ) ) ); // Qfac - 2 @@ -1276,20 +1388,21 @@ void calculate_hodirac_sector_parameters_fx( sec_x_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_3_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_4_fx++ ) ) ); // Qfac - 2 sec_y_real_fx = L_add( L_add( L_add( Mpy_32_32( -HODIRAC_FAC3, *( p_RealBuffer_0_fx++ ) ), Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_1_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC3, *( p_RealBuffer_6_fx++ ) ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_8_fx++ ) ) ); // Qfac - 2 sec_z_real_fx = L_sub( Mpy_32_32( HODIRAC_FAC1, *( p_RealBuffer_2_fx++ ) ), Mpy_32_32( HODIRAC_FAC2, *( p_RealBuffer_5_fx++ ) ) ); // Qfac - 2 - +#endif +#ifndef OPT_SBA_ENC_V2_NBE Word16 p_q; + Word32 tmp_x, tmp_y, tmp_z; + Word16 n, n1, n2; +#endif p_real_fx = Mpy_32_32( sec_w_real_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 p_imag_fx = Mpy_32_32( sec_w_imag_fx, w_fx ); // ( Qfac - 2 ) + 30 - 31 = Qfac - 3 - Word32 tmp_x, tmp_y, tmp_z; - Word16 n, n1, n2; - +#ifndef OPT_SBA_ENC_V2_NBE n1 = norm_l( p_real_fx ); n2 = norm_l( p_imag_fx ); n = s_min( n1, n2 ); - p_real_fx = L_shl( p_real_fx, n ); p_imag_fx = L_shl( p_imag_fx, n ); @@ -1307,13 +1420,35 @@ void calculate_hodirac_sector_parameters_fx( move32(); *p_sec_I_vec_z_fx = BASOP_Util_Add_Mant32Exp( *p_sec_I_vec_z_fx, *p_sec_I_vec_z_exp, tmp_z, tmp_exp, p_sec_I_vec_z_exp ); move32(); - - Word32 tmp1; +#else + temp_x64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_x_real_fx ), p_imag_fx, sec_x_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_y64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_y_real_fx ), p_imag_fx, sec_y_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + temp_z64 = W_mac_32_32( W_mult_32_32( p_real_fx, sec_z_real_fx ), p_imag_fx, sec_z_imag_fx ); // ( Qfac - 3 ) + ( Qfac - 2 ) + 1 = 2 * Qfac - 4 + sec_I_vec_x_64_fx = W_add( sec_I_vec_x_64_fx, temp_x64 ); + sec_I_vec_y_64_fx = W_add( sec_I_vec_y_64_fx, temp_y64 ); + sec_I_vec_z_64_fx = W_add( sec_I_vec_z_64_fx, temp_z64 ); + + Word64 tmp1; +#endif Word64 tmp2, tmp3, tmp4, sec_sum64; +#ifndef OPT_SBA_ENC_V2_NBE + Word32 tmp1; Word32 tmp5, sec_sum; tmp_exp = sub( 62, add( p_q, p_q ) ); tmp1 = BASOP_Util_Add_Mant32Exp( Mpy_32_32( p_real_fx, p_real_fx ), tmp_exp, Mpy_32_32( p_imag_fx, p_imag_fx ), tmp_exp, &tmp_exp ); +#endif +#ifdef OPT_SBA_ENC_V2_NBE + tmp1 = W_mac_32_32( W_mult_32_32( p_real_fx, p_real_fx ), p_imag_fx, p_imag_fx ); // 2 * (Qfac - 3) + 1 + tmp1 = W_shl( tmp1, 2 ); // 2 * (Qfac - 2) + 1 + tmp2 = W_mac_32_32( W_mult_32_32( sec_x_real_fx, sec_x_real_fx ), sec_x_imag_fx, sec_x_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp3 = W_mac_32_32( W_mult_32_32( sec_y_real_fx, sec_y_real_fx ), sec_y_imag_fx, sec_y_imag_fx ); // 2 * (Qfac - 2) + 1 + tmp4 = W_mac_32_32( W_mult_32_32( sec_z_real_fx, sec_z_real_fx ), sec_z_imag_fx, sec_z_imag_fx ); // 2 * (Qfac - 2) + 1 + sec_sum64 = W_add( tmp1, W_add( W_add( tmp2, tmp3 ), tmp4 ) ); // 2 * (Qfac - 2) + 1 + + // instead dividing changed Q// + energy_64_fx = W_add( energy_64_fx, sec_sum64 ); // 2 * (Qfac - 2) + 1 + 1 +#else tmp2 = W_add( W_mult0_32_32( sec_x_real_fx, sec_x_real_fx ), W_mult0_32_32( sec_x_imag_fx, sec_x_imag_fx ) ); // 2 * (Qfac - 2) tmp3 = W_add( W_mult0_32_32( sec_y_real_fx, sec_y_real_fx ), W_mult0_32_32( sec_y_imag_fx, sec_y_imag_fx ) ); // 2 * (Qfac - 2) tmp4 = W_add( W_mult0_32_32( sec_z_real_fx, sec_z_real_fx ), W_mult0_32_32( sec_z_imag_fx, sec_z_imag_fx ) ); // 2 * (Qfac - 2) @@ -1322,14 +1457,56 @@ void calculate_hodirac_sector_parameters_fx( sec_sum64 = W_shl( sec_sum64, n ); // 2 * (Qfac - 2) + n sec_sum = W_extract_h( sec_sum64 ); // 2 * (Qfac - 2) + n - 32 = 2 * Qfac + n - 36 sec_sum_exp = sub( 67, add( shl( Qfac, 1 ), n ) ); - // divide by 2: tmp1 = L_shr( tmp1, 1 ); sec_sum = L_shr( sec_sum, 1 ); - tmp5 = BASOP_Util_Add_Mant32Exp( tmp1, tmp_exp, sec_sum, sec_sum_exp, &tmp_exp ); energy_fx = BASOP_Util_Add_Mant32Exp( energy_fx, energy_exp, tmp5, tmp_exp, &energy_exp ); +#endif + } +#ifdef OPT_SBA_ENC_V2_NBE + tmp_scale = sub( W_norm( energy_64_fx ), 32 ); + energy_fx = W_shl_sat_l( energy_64_fx, tmp_scale ); + energy_exp = sub( tmp_exp_1, tmp_scale ); + if ( energy_fx == 0 ) + { + energy_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( sec_I_vec_x_64_fx ), 32 ); + *p_sec_I_vec_x_fx = W_shl_sat_l( sec_I_vec_x_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_x_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_x_fx == 0 ) + { + *p_sec_I_vec_x_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( sec_I_vec_y_64_fx ), 32 ); + *p_sec_I_vec_y_fx = W_shl_sat_l( sec_I_vec_y_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_y_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_y_fx == 0 ) + { + *p_sec_I_vec_y_exp = 0; + move16(); } + + tmp_scale = sub( W_norm( sec_I_vec_z_64_fx ), 32 ); + *p_sec_I_vec_z_fx = W_shl_sat_l( sec_I_vec_z_64_fx, tmp_scale ); + move32(); + *p_sec_I_vec_z_exp = sub( tmp_exp_2, tmp_scale ); + move16(); + if ( *p_sec_I_vec_z_fx == 0 ) + { + *p_sec_I_vec_z_exp = 0; + move16(); + } +#endif } IF( hDirAC->firstrun_sector_params ) @@ -1354,7 +1531,62 @@ void calculate_hodirac_sector_parameters_fx( ELSE { Word32 w_fx = L_sub( ONE_IN_Q30, beta_fx ); // Q30 +#ifdef OPT_SBA_ENC_V2_NBE + Word32 tmp_1, tmp_2, tmp_3, tmp_sec_1, tmp_sec_2, tmp_sec_3; + Word16 e_x, e_y, e_z; + move16(); + + e_x = s_max( *p_sec_I_vec_x_exp, *p_sec_I_vec_smth_x_exp ); + e_y = s_max( *p_sec_I_vec_y_exp, *p_sec_I_vec_smth_y_exp ); + e_z = s_max( *p_sec_I_vec_z_exp, *p_sec_I_vec_smth_z_exp ); + + tmp_1 = L_shr( *p_sec_I_vec_x_fx, sub( e_x, *p_sec_I_vec_x_exp ) ); // e_x + tmp_2 = L_shr( *p_sec_I_vec_y_fx, sub( e_y, *p_sec_I_vec_y_exp ) ); // e_y + tmp_3 = L_shr( *p_sec_I_vec_z_fx, sub( e_z, *p_sec_I_vec_z_exp ) ); // e_z + tmp_sec_1 = L_shr( *p_sec_I_vec_smth_x_fx, sub( e_x, *p_sec_I_vec_smth_x_exp ) ); // e_x + tmp_sec_2 = L_shr( *p_sec_I_vec_smth_y_fx, sub( e_y, *p_sec_I_vec_smth_y_exp ) ); // e_y + tmp_sec_3 = L_shr( *p_sec_I_vec_smth_z_fx, sub( e_z, *p_sec_I_vec_smth_z_exp ) ); // e_z + + + temp_x64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_1 ), beta_fx, tmp_sec_1 ); // 31-e_x+30+1=62-e_x + temp_y64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_2 ), beta_fx, tmp_sec_2 ); // 31-e_y+30+1=62-e_y + temp_z64 = W_mac_32_32( W_mult_32_32( w_fx, tmp_3 ), beta_fx, tmp_sec_3 ); // 31-e_z+30+1=62-e_z + + tmp_scale = sub( W_norm( temp_x64 ), 32 ); + *p_sec_I_vec_smth_x_fx = W_shl_sat_l( temp_x64, tmp_scale ); + move32(); + *p_sec_I_vec_smth_x_exp = sub( sub( e_x, 31 ), tmp_scale ); // 31-(62-e_x+tmp_scale)=e_x-tmp_scale-31 + move16(); + if ( *p_sec_I_vec_smth_x_fx == 0 ) + { + *p_sec_I_vec_smth_x_exp = 0; + move16(); + } + + tmp_scale = sub( W_norm( temp_y64 ), 32 ); + *p_sec_I_vec_smth_y_fx = W_shl_sat_l( temp_y64, tmp_scale ); + move32(); + *p_sec_I_vec_smth_y_exp = sub( sub( e_y, 31 ), tmp_scale ); // 31-(62-e_z+tmp_scale)=e_x-tmp_scale-31 + move16(); + if ( *p_sec_I_vec_smth_y_fx == 0 ) + { + *p_sec_I_vec_smth_y_exp = 0; + move16(); + } + tmp_scale = sub( W_norm( temp_z64 ), 32 ); + *p_sec_I_vec_smth_z_fx = W_shl_sat_l( temp_z64, tmp_scale ); + move32(); + *p_sec_I_vec_smth_z_exp = sub( sub( e_z, 31 ), tmp_scale ); // 31-(62-e_z+tmp_scale)=e_x-tmp_scale-31 + move16(); + if ( *p_sec_I_vec_smth_z_fx == 0 ) + { + *p_sec_I_vec_smth_z_exp = 0; + move16(); + } + + *p_energy_smth_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, energy_fx ), add( energy_exp, 1 ), Mpy_32_32( beta_fx, *p_energy_smth_fx ), add( *p_energy_smth_exp, 1 ), p_energy_smth_exp ); +#else *p_sec_I_vec_smth_x_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_x_fx ), add( *p_sec_I_vec_x_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_x_fx ), add( *p_sec_I_vec_smth_x_exp, 1 ), p_sec_I_vec_smth_x_exp ); move32(); *p_sec_I_vec_smth_y_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_y_fx ), add( *p_sec_I_vec_y_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_y_fx ), add( *p_sec_I_vec_smth_y_exp, 1 ), p_sec_I_vec_smth_y_exp ); @@ -1362,6 +1594,8 @@ void calculate_hodirac_sector_parameters_fx( *p_sec_I_vec_smth_z_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, *p_sec_I_vec_z_fx ), add( *p_sec_I_vec_z_exp, 1 ), Mpy_32_32( beta_fx, *p_sec_I_vec_smth_z_fx ), add( *p_sec_I_vec_smth_z_exp, 1 ), p_sec_I_vec_smth_z_exp ); move32(); *p_energy_smth_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_32( w_fx, energy_fx ), add( energy_exp, 1 ), Mpy_32_32( beta_fx, *p_energy_smth_fx ), add( *p_energy_smth_exp, 1 ), p_energy_smth_exp ); +#endif + move32(); } IF( LT_32( energy_fx, EPSILON_FX_SMALL ) ) @@ -1404,7 +1638,7 @@ void calculate_hodirac_sector_parameters_fx( *p_ene_exp = *p_energy_smth_exp; move16(); - tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( normI_fx, L_add( *p_energy_smth_fx, EPSILON_FX_SMALL ), &tmp_e ) ); + tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( normI_fx, L_add_sat( *p_energy_smth_fx, EPSILON_FX_SMALL ), &tmp_e ) ); tmp_e = add( tmp_e, sub( normI_exp, *p_energy_smth_exp ) ); tmp32 = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( tmp32 ), tmp_e, &tmp_e ); *p_diff_fx = tmp32; @@ -1438,6 +1672,18 @@ void calculate_hodirac_sector_parameters_fx( } ELSE { +#ifdef OPT_SBA_ENC_V2_NBE + tmp32_1 = L_sub( ONE_IN_Q29, tmp_diff_fx ); + tmp32_2 = L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ); + + // *p_azi = 2.f * (1.f - tmp_diff) * *p_azi + (2.f * tmp_diff - 1.f) * *p_azi_prev + *p_azi_fx = L_shl( Madd_32_32( Mpy_32_32( tmp32_1, *p_azi_fx ), tmp32_2, *p_azi_prev_fx ), 3 ); // Q29 + Q23 - 31 + 2 = Q23 + move32(); + + // *p_ele = 2.f * (1.f - tmp_diff) * *p_ele + (2.f * tmp_diff - 1.f) * *p_ele_prev + *p_ele_fx = L_shl( Madd_32_32( Mpy_32_32( tmp32_1, *p_ele_fx ), tmp32_2, *p_ele_prev_fx ), 3 ); // Q29 + Q23 - 31 + 2 = Q23 + move32(); +#else *p_azi_fx = L_shl( L_add( Mpy_32_32( L_sub( ONE_IN_Q29, tmp_diff_fx ), *p_azi_fx ), Mpy_32_32( L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ), *p_azi_prev_fx ) ), 1 ); // Q29 + Q23 - 31 = Q21 move32(); *p_ele_fx = L_shl( L_add( Mpy_32_32( L_sub( ONE_IN_Q29, tmp_diff_fx ), *p_ele_fx ), Mpy_32_32( L_sub( tmp_diff_fx, ONE_IN_Q29 / 2 ), *p_ele_prev_fx ) ), 1 ); // Q29 + Q23 - 31 = Q21 @@ -1446,6 +1692,7 @@ void calculate_hodirac_sector_parameters_fx( move32(); *p_ele_fx = L_shl( *p_ele_fx, 2 ); // Q21 -> Q23; move32(); +#endif } } ELSE diff --git a/lib_com/options.h b/lib_com/options.h index 5f33170bf..bd73d566e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,6 +82,7 @@ #define OPT_HEAD_ROT_REND_V1_BE #define OPT_SBA_DEC_V2_BE #define OPT_SBA_ENC_V2_BE +#define OPT_SBA_ENC_V2_NBE #define OPT_SBA_ENC_V1_BE #define OPT_SBA_DEC_PATH /* Optimization made in SBA decoding path */ #define OPT_IVAS_FILTER_ROM /* Optimization made in IVAS filter table */ -- GitLab From 5c841807a9b62dbce162183a7dd4e1e859f6f476 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 26 Jun 2025 11:45:48 +0530 Subject: [PATCH 1039/1310] Bug fix in front_vad_fx for lp_speech, precision improvements in msvq_enc --- lib_com/basop_util.c | 20 +++ lib_com/basop_util.h | 1 + lib_enc/ivas_front_vad_fx.c | 4 +- lib_enc/lsf_msvq_ma_enc_fx.c | 332 ++++++++++++++++++++++++++++++++++- lib_enc/prot_fx_enc.h | 16 ++ 5 files changed, 367 insertions(+), 6 deletions(-) diff --git a/lib_com/basop_util.c b/lib_com/basop_util.c index 7903d3580..4c7ebea26 100644 --- a/lib_com/basop_util.c +++ b/lib_com/basop_util.c @@ -1916,6 +1916,26 @@ Word16 findIndexOfMinWord32( Word32 *x, const Word16 len ) return indx; } +Word16 findIndexOfMinWord64( Word64 *x, const Word16 len ) +{ + Word16 i, indx; + + + indx = 0; + move16(); + FOR( i = 1; i < len; i++ ) + { + if ( LT_64( x[i], x[indx] ) ) + { + indx = i; + move16(); + } + } + + + return indx; +} + Word16 imult1616( Word16 x, Word16 y ) { diff --git a/lib_com/basop_util.h b/lib_com/basop_util.h index b5c69e1dd..c95bf8100 100644 --- a/lib_com/basop_util.h +++ b/lib_com/basop_util.h @@ -536,6 +536,7 @@ Word16 findIndexOfMinWord16( Word16 *x, const Word16 len ); \return index of min Word32 */ Word16 findIndexOfMinWord32( Word32 *x, const Word16 len ); +Word16 findIndexOfMinWord64( Word64 *x, const Word16 len ); /****************************************************************************/ /*! diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index 963e363b2..ec6a918b9 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -203,8 +203,6 @@ ivas_error front_vad_fx( move16(); FOR( n = 0; n < n_chan; n++ ) { - hFrontVads[n]->lp_speech_fx = shr( hFrontVads[n]->lp_speech_fx, 1 ); - move16(); scale_inp = s_min( sts[n]->q_inp, hCPE->hFrontVad[n]->q_mem_decim ); Scale_sig( sts[n]->input_fx, input_frame, sub( scale_inp, sts[n]->q_inp ) ); @@ -389,7 +387,7 @@ ivas_error front_vad_create_fx( } wb_vad_init_ivas_fx( hFrontVad->hVAD ); - hFrontVad->lp_speech_fx = 11520; // Q9/* Initialize the long-term active speech level in dB */ + hFrontVad->lp_speech_fx = 11520; // 45.0f in Q8 /* Initialize the long-term active speech level in dB */ move16(); hFrontVad->lp_noise_fx = 0; /* Initialize the long-term noise level in dB */ move16(); diff --git a/lib_enc/lsf_msvq_ma_enc_fx.c b/lib_enc/lsf_msvq_ma_enc_fx.c index cf855bd19..6056c0c46 100644 --- a/lib_enc/lsf_msvq_ma_enc_fx.c +++ b/lib_enc/lsf_msvq_ma_enc_fx.c @@ -468,6 +468,33 @@ static void depack_sub_values_fx( Word16 *pTmp, const Word16 *p1, const Word16 * } +static Word64 depack_mul_values_fx64( Word32 *Tmp, const Word16 *w, const Word16 *cbp, const Word16 N ) +{ + Word16 i, val0, val1, val2, val3; + Word64 en; + + en = 0; + move32(); + FOR( i = 0; i < N; i += 4 ) + { + depack_4_values( cbp + i_mult( shr( i, 2 ), 3 ), val0, val1, val2, val3 ) + Tmp[i + 0] = L_mult0( w[i + 0], val0 ); // Q8 * Q2.56 + move16(); + en = W_mac_32_16( en, Tmp[i + 0], val0 ); // Q8 * Q2.56 * 2.56 * Q1 + Tmp[i + 1] = L_mult0( w[i + 1], val1 ); + move16(); + en = W_mac_32_16( en, Tmp[i + 1], val1 ); + Tmp[i + 2] = L_mult0( w[i + 2], val2 ); + move16(); + en = W_mac_32_16( en, Tmp[i + 2], val2 ); + Tmp[i + 3] = L_mult0( w[i + 3], val3 ); + move16(); + en = W_mac_32_16( en, Tmp[i + 3], val3 ); + } + + return en; // Q8 * Q2.56 * 2.56 * Q1 +} + /*--------------------------------------------------------------------------* * msvq_enc_find_p_max_8() * @@ -522,6 +549,54 @@ static Word16 msvq_enc_find_p_max_8_fx( Word32 dist[] ) } +static Word16 msvq_enc_find_p_max_8_fx64( Word64 dist[] ) +{ + Word16 p_max; + + p_max = 0; + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS + if ( GT_64( dist[1], dist[p_max] ) ) + { + p_max = 1; + move16(); + } + if ( GT_64( dist[2], dist[p_max] ) ) + { + p_max = 2; + move16(); + } + if ( GT_64( dist[3], dist[p_max] ) ) + { + p_max = 3; + move16(); + } + if ( GT_64( dist[4], dist[p_max] ) ) + { + p_max = 4; + move16(); + } + if ( GT_64( dist[5], dist[p_max] ) ) + { + p_max = 5; + move16(); + } + if ( GT_64( dist[6], dist[p_max] ) ) + { + p_max = 6; + move16(); + } + if ( GT_64( dist[7], dist[p_max] ) ) + { + p_max = 7; + move16(); + } + BASOP_SATURATE_WARNING_ON_EVS + return p_max; +} + + /*--------------------------------------------------------------------------* * msvq_enc_find_p_max_6() * @@ -565,6 +640,43 @@ static Word16 msvq_enc_find_p_max_6_fx( Word32 dist[] ) return p_max; } +static Word16 msvq_enc_find_p_max_6_fx64( Word64 dist[] ) +{ + Word16 p_max; + + p_max = 0; + move16(); + + BASOP_SATURATE_WARNING_OFF_EVS + if ( GT_64( dist[1], dist[p_max] ) ) + { + p_max = 1; + move16(); + } + if ( GT_64( dist[2], dist[p_max] ) ) + { + p_max = 2; + move16(); + } + if ( GT_64( dist[3], dist[p_max] ) ) + { + p_max = 3; + move16(); + } + if ( GT_64( dist[4], dist[p_max] ) ) + { + p_max = 4; + move16(); + } + if ( GT_64( dist[5], dist[p_max] ) ) + { + p_max = 5; + move16(); + } + BASOP_SATURATE_WARNING_ON_EVS + return p_max; +} + /*--------------------------------------------------------------------------* * msvq_enc_fx() @@ -787,7 +899,222 @@ void msvq_enc_fx( return; } +void msvq_enc_lsf_fx64( + const Word16 *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) (10Q5 * 1.28) */ + const Word16 dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const Word16 offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const Word16 u[], /* i : Vector to be encoded (prediction and mean removed)(Q14Q1*1.28) */ + const Word16 *levels, /* i : Number of levels in each stage */ + const Word16 maxC, /* i : Tree search size (number of candidates kept from */ + /* one stage to the next == M-best) */ + const Word16 stages, /* i : Number of stages */ + const Word16 w[], /* i : Weights Q8*/ + const Word16 N, /* i : Vector dimension */ + const Word16 maxN, /* i : Codebook dimension */ + Word16 Idx[] /* o : Indices */ +) +{ + Word16 j; + const Word16 *cbp; + Word16 p2i; + Word16 resid_buf[2 * LSFMBEST_MAX * M_MAX], *resid[2]; + Word16 *pTmp, *p1; + Word16 *indices[2], m, s, c, c2, p_max, i; + Word32 Tmp32[M_MAX]; + Word16 idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; + Word64 *dist_64[2], en64, tmp64; + Word64 dist_buf_64[2 * LSFMBEST_MAX]; + Word16 ( *func_ptr64 )( Word64 * ); + Word16 N34; + Word16 n, maxn, start; + + /*----------------------------------------------------------------* + * Allocate memory for previous (parent) and current nodes. + * Parent node is indexed [0], current node is indexed [1]. + *----------------------------------------------------------------*/ + indices[0] = idx_buf; + indices[1] = idx_buf + maxC * stages; /*move16();*/ + /*vr_iset(0, idx_buf, 2*stages*maxC);*/ + set16_fx( idx_buf, 0, (Word16) ( 2 * stages * maxC ) ); + + resid[0] = resid_buf; + resid[1] = resid_buf + maxC * N; /*move16();*/ + + dist_64[0] = dist_buf_64; + dist_64[1] = dist_buf_64 + maxC; /*move16();*/ + + /*vr_iset(0, parents, maxC);*/ + set16_fx( parents, 0, maxC ); + + + func_ptr64 = msvq_enc_find_p_max_6_fx64; + move16(); + if ( EQ_16( maxC, 8 ) ) + { + func_ptr64 = msvq_enc_find_p_max_8_fx64; + move16(); + } + + /*----------------------------------------------------------------* + * LSF weights are normalized, so it is always better to multiply it first + * Set up inital distance vector + *----------------------------------------------------------------*/ + /* Q0/16 * Qw_norm/16 << 1 >> 16 => Qwnorm-15/16 * Q0/16 << 1 => Qwnorm-14/32 * 6.5536 */ + Word64 ss2_64; + ss2_64 = W_mult_32_16( L_mult0( u[0], w[0] ), u[0] ); + // Q8 * Q2.56 * 2.56 * Q1 + FOR( j = 1; j < N; j++ ) + { + ss2_64 = W_mac_32_16( ss2_64, L_mult0( u[j], w[j] ), u[j] ); + } + + /* Set up inital error (residual) vectors */ + pTmp = resid[1]; /*move16();*/ + FOR( c = 0; c < maxC; c++ ) + { + Copy( u, pTmp + c * N, N ); + dist_64[1][c] = ss2_64; + move64(); + } + + /* Loop over all stages */ + m = 1; + move16(); + FOR( s = 0; s < stages; s++ ) + { + /* codebook pointer is set to point to first stage */ + cbp = cb[s]; /*3Q12*1.28*/ + move16(); + + /* Set up pointers to parent and current nodes */ + swap( indices[0], indices[1], Word16 * ); + move16(); + move16(); + move16(); + move16(); + swap( resid[0], resid[1], Word16 * ); + move16(); + move16(); + move16(); + swap( dist_64[0], dist_64[1], Word64 * ); + move64(); + move64(); + move64(); + + /* p_max points to maximum distortion node (worst of best) */ + p_max = 0; + move16(); + + n = N; + move16(); + maxn = maxN; + move16(); + if ( dims ) + { + n = dims[s]; + move16(); + } + if ( dims ) + { + maxn = n; + move16(); + } + + assert( ( maxn % 4 ) == 0 ); + N34 = mult( maxn, 24576 /*0.75f Q15*/ ); + start = 0; + move16(); + if ( offs ) + { + start = offs[s]; + move16(); + } + + set32_fx( Tmp32, 0, start ); + set32_fx( Tmp32 + start + n, 0, sub( N, add( start, n ) ) ); + + /* Set distortions to a large value */ + FOR( j = 0; j < maxC; j++ ) + { + dist_64[1][j] = LLONG_MAX; + move64(); + } + + FOR( j = 0; j < levels[s]; j++ ) + { + /* Compute weighted codebook element and its energy */ + en64 = depack_mul_values_fx64( Tmp32 + start, w + start, cbp, n ); // Q8 + // en64: Q8 * Q2.56 * Q2.56 * q1 + // Tmp: 2.56 * Q8 + + cbp += N34; /* pointer is incremented */ + + /* Iterate over all parent nodes */ + FOR( c = 0; c < m; c++ ) + { + pTmp = &resid[0][c * N]; // this resid buffer is initial lsf values + /*tmp = (*pTmp++) * Tmp[0];*/ + Word64 t164 = 0; + move64(); + t164 = W_mult_32_16( Tmp32[0], pTmp[0] ); // 2.56 * Q8 * Q2.56 * Q1 + // Tmp32: Q8 * Q2.56 + FOR( i = 1; i < N; i++ ) + { + t164 = W_mac_32_16( t164, Tmp32[i], pTmp[i] ); // 2.56 * Q8 * Q2.56 * Q1 + } + + tmp64 = W_add( dist_64[0][c], W_sub( en64, W_shl( t164, 1 ) ) ); + t164 = W_sub( tmp64, dist_64[1][p_max] ); + IF( t164 <= 0 ) + { + /* Replace worst */ + dist_64[1][p_max] = tmp64; + move64(); + indices[1][p_max * stages + s] = j; + move16(); + parents[p_max] = c; + move16(); + + p_max = ( *func_ptr64 )( dist_64[1] ); + + } /*IF (L_sub(tmp,dist[1][p_max]) < 0) */ + } /* FOR (c=0; c Date: Thu, 26 Jun 2025 09:03:16 +0200 Subject: [PATCH 1040/1310] add ISSUE_1772_replace_shr_o macro --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index 5f33170bf..b16792633 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -98,5 +98,6 @@ #define NONBE_FIX_864_JBM_RENDER_FRAMESIZE /* FhG: issue #864: fix different behaviour of JBM TSM with different render frame sizes */ #define FIX_1762_COMPILER_ISSUE /* FhG: fix compiler issues with W_mac_32_32() + ONE_IN_Q30 */ +#define ISSUE_1772_replace_shr_o /* FhG: replace by non-overflow-alternative - BE */ #endif -- GitLab From c3b58b686f45914d97845af03668f1e7be7f97dd Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 26 Jun 2025 09:03:39 +0200 Subject: [PATCH 1041/1310] replaced some shr_o by shr_sat --- lib_com/deemph_fx.c | 4 ++++ lib_com/low_rate_band_att_fx.c | 8 ++++++++ lib_com/syn_filt_fx.c | 10 ++++++++++ lib_dec/FEC_HQ_core_fx.c | 8 ++++++++ lib_dec/FEC_HQ_phase_ecu_fx.c | 6 ++++++ lib_enc/ari_hm_enc_fx.c | 4 ++++ lib_enc/cod_tcx_fx.c | 8 ++++++++ 7 files changed, 48 insertions(+) diff --git a/lib_com/deemph_fx.c b/lib_com/deemph_fx.c index 9bc20cb6f..b8e3a72cd 100644 --- a/lib_com/deemph_fx.c +++ b/lib_com/deemph_fx.c @@ -197,7 +197,11 @@ void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, W { FOR( i = 0; i < L; i++ ) { +#ifdef ISSUE_1772_replace_shr_o + L_tmp = L_msu_o( Mpy_32_16_1( L_tmp, mu ), shr_sat( x[i], shift ), -32768 /*1.0f in Q15*/, &Overflow ); /*Qx-shift+16*/ +#else L_tmp = L_msu_o( Mpy_32_16_1( L_tmp, mu ), shr_o( x[i], shift, &Overflow ), -32768 /*1.0f in Q15*/, &Overflow ); /*Qx-shift+16*/ +#endif x[i] = round_fx_o( L_tmp, &Overflow ); /*Qx-shift*/ move16(); } diff --git a/lib_com/low_rate_band_att_fx.c b/lib_com/low_rate_band_att_fx.c index e51d2807b..d762d628d 100644 --- a/lib_com/low_rate_band_att_fx.c +++ b/lib_com/low_rate_band_att_fx.c @@ -97,7 +97,11 @@ void ivas_fine_gain_pred_fx( /*gp *= 1.0f - 0.05f / accuracy; */ tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ +#ifdef ISSUE_1772_replace_shr_o + tmp = shr_sat( tmp, sub( 34, exp ) ); /*15+18-exp+16-15=34-exp */ +#else tmp = shr_o( tmp, sub( 34, exp ), &Overflow ); /*15+18-exp+16-15=34-exp */ +#endif tmp = sub( 32767, tmp ); tmp = s_max( 27554, tmp ); /* Limit attenuation to norm quantizer error, 2^-0.25 in Q15 */ gp = mult_r( tmp, gp ); /*15+12+1-16=12 */ @@ -205,7 +209,11 @@ void fine_gain_pred_fx( /*gp *= 1.0f - 0.05f / accuracy; */ tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ +#ifdef ISSUE_1772_replace_shr_o + tmp = shr_sat( tmp, sub( 34, exp ) ); /*15+18-exp+16-15=34-exp */ +#else tmp = shr_o( tmp, sub( 34, exp ), &Overflow ); /*15+18-exp+16-15=34-exp */ +#endif tmp = sub( 32767, tmp ); tmp = s_max( 27554, tmp ); /* Limit attenuation to norm quantizer error, 2^-0.25 in Q15 */ gp = mult_r( tmp, gp ); /*15+12+1-16=12 */ diff --git a/lib_com/syn_filt_fx.c b/lib_com/syn_filt_fx.c index ada0d243e..1216c4533 100644 --- a/lib_com/syn_filt_fx.c +++ b/lib_com/syn_filt_fx.c @@ -188,14 +188,20 @@ void syn_filt_fx( Word16 *yy; Word32 s; Word16 q; +#ifndef ISSUE_1772_replace_shr_o Flag Overflow = 0; move16(); +#endif Word16 a0; yy = &buf[0]; q = add( norm_s( a[0] ), 1 ); +#ifdef ISSUE_1772_replace_shr_o + a0 = shr_sat( a[0], shift ); /* input / 2^shift */ +#else a0 = shr_o( a[0], shift, &Overflow ); /* input / 2^shift */ +#endif /*------------------------------------------------------------------* * copy initial filter states into synthesis buffer and do synthesis @@ -373,7 +379,11 @@ void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], W *-----------------------------------------------------------------------*/ mem += m; /*move16();*/ +#ifdef ISSUE_1772_replace_shr_o + a0 = shr_sat( a[0], shift ); /* input / 2^shift */ +#else a0 = shr_o( a[0], shift, &Overflow ); /* input / 2^shift */ +#endif /*-----------------------------------------------------------------------* * Do the filtering *-----------------------------------------------------------------------*/ diff --git a/lib_dec/FEC_HQ_core_fx.c b/lib_dec/FEC_HQ_core_fx.c index cc03dcf52..40e26df9c 100644 --- a/lib_dec/FEC_HQ_core_fx.c +++ b/lib_dec/FEC_HQ_core_fx.c @@ -638,7 +638,11 @@ void ivas_HQ_FEC_Mem_update_fx( exp2 = norm_l( hHQ_nbfec->ynrm_values_fx[i][0] ); tmp_fx = div_s( extract_h( L_shl( en_high_fx[i], exp1 ) ), extract_h( L_shl( hHQ_nbfec->ynrm_values_fx[i][0], exp2 ) ) ); exp = add( 15, sub( exp1, exp2 ) ); +#ifdef ISSUE_1772_replace_shr_o + *mean_en_high_fx = add_o( *mean_en_high_fx, shr_sat( tmp_fx, sub( exp, 5 ) ), &Overflow ); +#else *mean_en_high_fx = add_o( *mean_en_high_fx, shr_o( tmp_fx, sub( exp, 5 ), &Overflow ), &Overflow ); +#endif move16(); } *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] ); @@ -924,7 +928,11 @@ void HQ_FEC_Mem_update_fx( exp2 = norm_l( hHQ_nbfec->ynrm_values_fx[i][0] ); tmp_fx = div_s( extract_h( L_shl( en_high_fx[i], exp1 ) ), extract_h( L_shl( hHQ_nbfec->ynrm_values_fx[i][0], exp2 ) ) ); exp = add( 15, sub( exp1, exp2 ) ); +#ifdef ISSUE_1772_replace_shr_o + *mean_en_high_fx = add_o( *mean_en_high_fx, shr_sat( tmp_fx, sub( exp, 5 ) ), &Overflow ); +#else *mean_en_high_fx = add_o( *mean_en_high_fx, shr_o( tmp_fx, sub( exp, 5 ), &Overflow ), &Overflow ); +#endif move16(); } *mean_en_high_fx = mult( *mean_en_high_fx, inv_tbl_fx[sub( num_Sb, k )] ); diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index ad2f86073..5ac191836 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -1164,9 +1164,11 @@ static Word16 imax_fx( /* o: The location, relative to the Word16 y1, y2, y3, man, expo, edge; const Word16 *pY; Word32 numer, denom, sign, acc, y3_y1; +#ifndef ISSUE_1772_replace_shr_o #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); +#endif #endif /* Seek the extremum of the parabola P(x) defined by 3 consecutive points so that P([-1 0 1]) = [y1 y2 y3] */ @@ -1201,7 +1203,11 @@ static Word16 imax_fx( /* o: The location, relative to the /* Although the output of ratio() is in Q14, adding the missing factor of 2 (See above) * in the denominator, the output is now considered to be in Q15. */ man = ratio( numer, denom, &expo ); /* The mantissa is considered in Q15 */ +#ifdef ISSUE_1772_replace_shr_o + posi = shr_sat( man, expo ); /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ +#else posi = shr_o( man, expo, &Overflow ); /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ +#endif if ( sign < 0 ) /* Restore the sign. */ { posi = negate( posi ); diff --git a/lib_enc/ari_hm_enc_fx.c b/lib_enc/ari_hm_enc_fx.c index 343f1890f..1172bd890 100644 --- a/lib_enc/ari_hm_enc_fx.c +++ b/lib_enc/ari_hm_enc_fx.c @@ -458,7 +458,11 @@ Word16 SearchPeriodicityIndex_fx( tmp = sub( norm_l( tmp32 ), 1 ); tmp2 = norm_l( AbsTotal ); tmp3 = div_s( round_fx_o( L_shl_o( tmp32, tmp, &Overflow ), &Overflow ), round_fx_o( L_shl_o( AbsTotal, tmp2, &Overflow ), &Overflow ) ); +#ifdef ISSUE_1772_replace_shr_o + *RelativeScore = shr_sat( tmp3, add( sub( tmp, tmp2 ), 2 ) ); /* -> 2Q13 */ +#else *RelativeScore = shr_o( tmp3, add( sub( tmp, tmp2 ), 2 ), &Overflow ); /* -> 2Q13 */ +#endif move16(); } ELSE diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index 27f3d2aa6..c8fab11a9 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -2604,7 +2604,11 @@ void QuantizeSpectrum_fx( /* scale output */ FOR( i = 0; i < L_frame; i++ ) { +#ifdef ISSUE_1772_replace_shr_o + xn_buf16[i] = shr_sat( xn_buf16[i], Q ); +#else xn_buf16[i] = shr_o( xn_buf16[i], Q, &Overflow ); +#endif move16(); } @@ -4523,7 +4527,11 @@ void InternalTCXDecoder_fx( /* scale output */ FOR( i = 0; i < L_frame; i++ ) { +#ifdef ISSUE_1772_replace_shr_o + xn_buf16[i] = shr_sat( xn_buf16[i], Q ); +#else xn_buf16[i] = shr_o( xn_buf16[i], Q, &Overflow ); +#endif move16(); } -- GitLab From afa29a47dbcc59391030766e0d6eb2b1ae9c5982 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 26 Jun 2025 09:45:04 +0200 Subject: [PATCH 1042/1310] replaced some shr_o by shr_sat --- lib_enc/enc_gen_voic_rf_fx.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_enc/enc_gen_voic_rf_fx.c b/lib_enc/enc_gen_voic_rf_fx.c index e9c9d87f7..79dc33d82 100644 --- a/lib_enc/enc_gen_voic_rf_fx.c +++ b/lib_enc/enc_gen_voic_rf_fx.c @@ -449,7 +449,11 @@ void coder_acelp_rf_fx( Ltmp = L_add_o( Ltmp, Ltmp2, &Overflow ); /* Q15 + Q_xn */ hRF->rf_mem_w0 = sub_o( xn[L_SUBFR - 1], round_fx_o( L_shl_o( Ltmp, 1, &Overflow ), &Overflow ), &Overflow ); /* Q_xn */ move16(); +#ifdef ISSUE_1772_replace_shr_o + hRF->rf_mem_w0 = shr_sat( hRF->rf_mem_w0, shift, &Overflow ); /*Qnew-1*/ +#else hRF->rf_mem_w0 = shr_o( hRF->rf_mem_w0, shift, &Overflow ); /*Qnew-1*/ +#endif /*-------------------------------------------------------* -- GitLab From 8906317ea92d1affc39c5110e963744ebcbd13cb Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:13:35 +0200 Subject: [PATCH 1043/1310] [cleanup] accept FIX_998_UNUSED_FUNCTION --- lib_com/options.h | 1 - lib_dec/ivas_dirac_dec_fx.c | 82 ----- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 317 ------------------ lib_rend/ivas_dirac_rend_fx.c | 8 - lib_rend/ivas_prot_rend_fx.h | 8 - 5 files changed, 416 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 662fb2be2..89e64da03 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -126,7 +126,6 @@ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ -#define FIX_998_UNUSED_FUNCTION /* FhG: issue 998: delete unused funtion ivas_dirac_dec_get_response_split_order */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index e3b32d3fc..1e14a1675 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2752,42 +2752,6 @@ void ivas_dirac_dec_render_sf_fx( { masa_band_mapping = st_ivas->hMasa->data.band_mapping; } -#ifndef FIX_998_UNUSED_FUNCTION - test(); - test(); - IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && EQ_16( st_ivas->hCombinedOrientationData->shd_rot_max_order, 1 ) ) - { - ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, - hDirACRend, - st_ivas->hVBAPdata, - masa_band_mapping, - st_ivas->hMasaIsmData, - azimuth, - elevation, - md_idx, - surCohRatio_fx, - surCohRatio_q_fx, - st_ivas->hCombinedOrientationData->shd_rot_max_order, - p_Rmat_fx, - hodirac_flag ); - } - ELSE - { - ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, - hDirACRend, - st_ivas->hVBAPdata, - masa_band_mapping, - st_ivas->hMasaIsmData, - azimuth, - elevation, - md_idx, - surCohRatio_fx, - surCohRatio_q_fx, - 0, - NULL, - hodirac_flag ); - } -#else ivas_dirac_dec_compute_directional_responses_fx( hSpatParamRendCom, hDirACRend, st_ivas->hVBAPdata, @@ -2800,7 +2764,6 @@ void ivas_dirac_dec_render_sf_fx( surCohRatio_q_fx, hodirac_flag ); -#endif } test(); @@ -3316,50 +3279,6 @@ void ivas_dirac_dec_render_sf_fx( move16(); } -#ifndef FIX_998_UNUSED_FUNCTION - test(); - test(); - IF( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[st_ivas->hCombinedOrientationData->subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) - { - ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fx, - DirAC_mem.reference_power_q, - p_onset_filter_fx, - azimuth, - elevation, - hSpatParamRendCom->diffuseness_vector_fx[md_idx], - hSpatParamRendCom->q_diffuseness_vector, - hSpatParamRendCom, - hDirACRend, - st_ivas->hCombinedOrientationData->shd_rot_max_order, - p_Rmat_fx, - st_ivas->hVBAPdata, - hDirACRend->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag, - hDirAC->hConfig->dec_param_estim ); - } - ELSE - { - ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fx, - DirAC_mem.reference_power_q, - p_onset_filter_fx, - azimuth, - elevation, - hSpatParamRendCom->diffuseness_vector_fx[md_idx], - hSpatParamRendCom->q_diffuseness_vector, - hSpatParamRendCom, - hDirACRend, - 0, - 0, - st_ivas->hVBAPdata, - hDirACRend->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag, - hDirAC->hConfig->dec_param_estim ); - } -#else ivas_dirac_dec_output_synthesis_process_slot_fx( reference_power_fx, DirAC_mem.reference_power_q, p_onset_filter_fx, @@ -3376,7 +3295,6 @@ void ivas_dirac_dec_render_sf_fx( hodirac_flag, hDirAC->hConfig->dec_param_estim ); -#endif IF( hDirAC->hConfig->dec_param_estim ) { diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 548e06fb6..3d4ec3077 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -650,10 +650,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 q_diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ -#ifndef FIX_998_UNUSED_FUNCTION - const Word16 sh_rot_max_order, - const Word32 *p_Rmat, /* i : rotation matrix Q30*/ -#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const Word16 nchan_transport, /* i : number of transport channels*/ @@ -707,10 +703,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( md_idx, NULL, 0, -#ifndef FIX_998_UNUSED_FUNCTION - 2, - p_Rmat, -#endif hodirac_flag ); { @@ -781,10 +773,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( md_idx, NULL, 0, -#ifndef FIX_998_UNUSED_FUNCTION - sh_rot_max_order, - p_Rmat, -#endif hodirac_flag ); { @@ -2818,291 +2806,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( return; } -#ifndef FIX_998_UNUSED_FUNCTION - -/*------------------------------------------------------------------------- - * ivas_dirac_dec_get_response_split_order() - * - * calculate reponse, 1 degree resolution - *------------------------------------------------------------------------*/ - -static void ivas_dirac_dec_get_response_split_order_fx( - const Word16 azimuth, /*q0*/ - const Word16 elevation, /*q0*/ - Word32 *response, /*q_response*/ - const Word16 shd_rot_max_order, - const Word32 *p_Rmat /* Q30 */, - Word16 *q_response ) -{ - Word16 index_azimuth, index_elevation; - Word16 el, e, az; - Word32 cos_1, cos_2, sin_1, cos_az[3]; - Word32 sin_az[3]; - Word32 f, c; - Word16 l, m; - Word16 b, b1, b_2, b1_2, a; - Word32 dv_0, dv_1, dv_2, dv_r_0, dv_r_1, dv_r_2; - Word32 w; - Word16 tmp; - Word32 temp; - Word16 exp; - - push_wmops( "ivas_dirac_dec_get_response_split_order" ); - - /* Corner case for handling crash in idiv1616 when numerator is 0 */ - IF( EQ_16( azimuth, -180 ) ) - { - tmp = 0; - move16(); - } - ELSE - { - tmp = idiv1616( add( azimuth, 180 ), 360 ); - } - index_azimuth = sub( add( azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (azimuth + 180) % 360 - index_elevation = add( elevation, 90 ); - - IF( GT_16( index_elevation, 90 ) ) - { - e = -ONE_IN_Q14; /*-1 in Q14*/ - move16(); - el = sub( 180, index_elevation ); - } - ELSE - { - e = ONE_IN_Q14; /*1 in Q14*/ - move16(); - el = index_elevation; - move16(); - } - - IF( GT_16( index_azimuth, 180 ) ) - { - az = sub( 360, index_azimuth ); - f = -ONE_IN_Q30; /*-1 Q30*/ - move32(); - } - ELSE - { - az = index_azimuth; - move16(); - f = ONE_IN_Q30; /*1 Q30*/ - move32(); - } - - // dirac_gains_trg_term_int Q30 - cos_1 = L_shr( dirac_gains_trg_term_int[az][0], 1 ); // Q29 - cos_2 = L_shl( Mpy_32_32( cos_1, cos_1 ), 2 ); // Q29 - sin_1 = Mpy_32_32( f, dirac_gains_trg_term_int[az][1] ); // Q29 - - cos_az[0] = cos_1; // Q29 - move32(); - cos_az[1] = L_shl( L_sub( Mpy_32_32( TWO_IN_Q29, cos_2 ), ONE_IN_Q27 ), 2 ); // Q29 - move32(); - cos_az[2] = L_sub( L_shl( Mpy_32_32( Mpy_32_32( TWO_IN_Q29, cos_1 ), cos_az[1] ), 4 ), cos_az[0] ); // Q29 - move32(); - - sin_az[0] = sin_1; // Q29 - move32(); - sin_az[1] = L_shl( Mpy_32_32( Mpy_32_32( sin_1, TWO_IN_Q29 ), cos_1 ), 4 ); // Q29 - move32(); - sin_az[2] = L_shl( Mpy_32_32( sin_1, L_sub( Mpy_32_32( FOUR_IN_Q28, cos_2 ), ONE_IN_Q26 ) ), 5 ); // Q29 - move32(); - - response[0] = ONE_IN_Q29; - move32(); - - FOR( l = 1; l <= shd_rot_max_order; l++ ) - { - b_2 = i_mult( l, l ); - b1_2 = add( b_2, i_mult( 2, l ) ); - FOR( m = 0; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 6 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 6 ); // Q29 - move32(); - } - - FOR( m = 1; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - c = Mpy_32_16_1( c, e ); // Q24 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 7 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 7 ); // Q29 - move32(); - } - - b = add( b_2, l ); - a = dirac_gains_P_idx[b]; - move16(); - - c = L_shl( Mpy_32_32( dirac_gains_norm_term_int[a], dirac_gains_Pnm_int[el][a] ), 3 ); // Q29 - IF( EQ_16( l % 2, 1 ) ) - { - c = L_shl( Mpy_32_16_1( c, e ), 1 ); // Q29 - } - - response[b] = c; // Q29 - move32(); - } - - /*Conversion spherical to cartesian coordinates*/ - w = L_negate( dirac_gains_trg_term_int[el][1] ); // Q30 - dv_0 = Mpy_32_32( w, cos_1 ); // Q28 - dv_1 = Mpy_32_32( w, sin_1 ); // Q28 - dv_2 = L_shr( Mpy_32_16_1( dirac_gains_trg_term_int[el][0], e ), 1 ); // Q28 - - /*Rotation mtx multiplication*/ - dv_r_0 = Madd_32_32( Madd_32_32( Mpy_32_32( L_shr( p_Rmat[0], Q1 ), dv_0 ), L_shr( p_Rmat[1], Q1 ), dv_1 ), L_shr( p_Rmat[2], Q1 ), dv_2 ); // Q26 - dv_r_1 = Madd_32_32( Madd_32_32( Mpy_32_32( L_shr( p_Rmat[3], Q1 ), dv_0 ), L_shr( p_Rmat[4], Q1 ), dv_1 ), L_shr( p_Rmat[5], Q1 ), dv_2 ); // Q26 - dv_r_2 = Madd_32_32( Madd_32_32( Mpy_32_32( L_shr( p_Rmat[6], Q1 ), dv_0 ), L_shr( p_Rmat[7], Q1 ), dv_1 ), L_shr( p_Rmat[8], Q1 ), dv_2 ); // Q26 - - tmp = BASOP_util_atan2( dv_r_1, dv_r_0, 0 ); // Q13 - index_azimuth = shr( mult( tmp, _180_OVER_PI_Q9 ), 7 ); // Q0; - IF( EQ_16( index_azimuth, -180 ) ) - { - tmp = 0; - move16(); - } - ELSE - { - tmp = idiv1616( add( index_azimuth, 180 ), 360 ); - } - index_azimuth = sub( add( index_azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (index_azimuth + 180) % 360 - - temp = L_add( Mpy_32_32( dv_r_0, dv_r_0 ), Mpy_32_32( dv_r_1, dv_r_1 ) ); // Q21 - exp = sub( 31, Q21 ); - temp = Sqrt32( temp, &exp ); - - tmp = BASOP_util_atan2( dv_r_2, temp, sub( sub( 31, Q26 ), exp ) ); // Q13 - index_elevation = shr( mult( tmp, _180_OVER_PI_Q9 ), Q7 ); // Q0 - index_elevation = add( index_elevation, 90 ); - - IF( GT_16( index_elevation, 90 ) ) - { - e = -ONE_IN_Q14; /*-1 Q14*/ - move16(); - el = sub( 180, index_elevation ); - } - ELSE - { - e = ONE_IN_Q14; /*1 Q14*/ - move16(); - el = index_elevation; - move16(); - } - - IF( GT_16( index_azimuth, 180 ) ) - { - az = sub( 360, index_azimuth ); - f = -ONE_IN_Q30; /*-1 Q30*/ - move32(); - } - ELSE - { - az = index_azimuth; - move16(); - f = ONE_IN_Q30; /*1 Q30*/ - move32(); - } - - // dirac_gains_trg_term_int Q30 - cos_1 = L_shr( dirac_gains_trg_term_int[az][0], 1 ); // Q29 - cos_2 = L_shl( Mpy_32_32( cos_1, cos_1 ), 2 ); // Q29 - sin_1 = Mpy_32_32( f, dirac_gains_trg_term_int[az][1] ); // Q29 - - cos_az[0] = cos_1; // Q29 - move32(); - cos_az[1] = L_shl( L_sub( Mpy_32_32( TWO_IN_Q29, cos_2 ), ONE_IN_Q27 ), 2 ); // Q29 - move32(); - cos_az[2] = L_sub( L_shl( Mpy_32_32( Mpy_32_32( TWO_IN_Q29, cos_1 ), cos_az[1] ), 4 ), cos_az[0] ); // Q29 - move32(); - - sin_az[0] = sin_1; // Q29 - move32(); - sin_az[1] = L_shl( Mpy_32_32( Mpy_32_32( sin_1, TWO_IN_Q29 ), cos_1 ), 4 ); // Q29 - move32(); - sin_az[2] = L_shl( Mpy_32_32( sin_1, L_sub( Mpy_32_32( FOUR_IN_Q28, cos_2 ), ONE_IN_Q26 ) ), 5 ); // Q29 - move32(); - - FOR( l = shd_rot_max_order + 1; l <= 3; l++ ) - { - b_2 = i_mult( l, l ); - b1_2 = add( b_2, i_mult( 2, l ) ); - - FOR( m = 0; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 6 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 6 ); // Q29 - move32(); - } - - FOR( m = 1; m < l; m += 2 ) - { - b = add( b_2, m ); - a = dirac_gains_P_idx[b]; - move16(); - - c = Mpy_32_32( Mpy_32_32( SQRT2_FIXED, dirac_gains_norm_term_int[a] ), dirac_gains_Pnm_int[el][a] ); // Q25 - c = Mpy_32_16_1( c, e ); // Q24 - - response[b] = L_shl( Mpy_32_32( c, sin_az[l - m - 1] ), 7 ); // Q29 - move32(); - - b1 = sub( b1_2, m ); - response[b1] = L_shl( Mpy_32_32( c, cos_az[l - m - 1] ), 7 ); // Q29 - move32(); - } - - b = add( b_2, l ); - a = dirac_gains_P_idx[b]; - move16(); - - c = L_shl( Mpy_32_32( dirac_gains_norm_term_int[a], dirac_gains_Pnm_int[el][a] ), 3 ); // Q29 - - IF( EQ_16( l % 2, 1 ) ) - { - c = L_shl( Mpy_32_16_1( c, e ), 1 ); // Q29 - } - - response[b] = c; // Q29 - move32(); - } - - *q_response = Q29; - move16(); - - pop_wmops(); - - return; -} -#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_compute_directional_responses() @@ -3121,10 +2824,6 @@ void ivas_dirac_dec_compute_directional_responses_fx( const Word16 md_idx, const Word32 *surCohRatio_fx, /*i:Q_surCohRatio*/ Word16 Q_surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION - const Word16 shd_rot_max_order, /* i : split-order rotation method */ - const Word32 *p_Rmat, /* i : rotation matrix Q30*/ -#endif const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { @@ -3238,19 +2937,6 @@ void ivas_dirac_dec_compute_directional_responses_fx( exp_direct_response_dir2 = 0; move16(); -#ifndef FIX_998_UNUSED_FUNCTION - IF( p_Rmat != 0 ) - { - ivas_dirac_dec_get_response_split_order_fx( azimuth[k], elevation[k], direct_response_hoa_fx, shd_rot_max_order, p_Rmat, &Q_direct_response_hoa ); - - IF( hodirac_flag ) - { - ivas_dirac_dec_get_response_split_order_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, shd_rot_max_order, p_Rmat, &Q_direct_response_dir2 ); - } - } - ELSE - { -#endif #ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx ivas_dirac_dec_get_response_fx_29( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order ); #else @@ -3265,9 +2951,6 @@ void ivas_dirac_dec_compute_directional_responses_fx( ivas_dirac_dec_get_response_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_dir2 ); #endif } -#ifndef FIX_998_UNUSED_FUNCTION - } -#endif test(); test(); diff --git a/lib_rend/ivas_dirac_rend_fx.c b/lib_rend/ivas_dirac_rend_fx.c index 02a02f863..efcd1b0b4 100644 --- a/lib_rend/ivas_dirac_rend_fx.c +++ b/lib_rend/ivas_dirac_rend_fx.c @@ -4239,10 +4239,6 @@ static void ivas_masa_ext_dirac_render_sf_fx( md_idx, surCohRatio_fx, Q_surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION - 0, - NULL, -#endif 0 ); Word16 proto_direct_buffer_f_temp_q[60]; @@ -4621,10 +4617,6 @@ static void ivas_masa_ext_dirac_render_sf_fx( hSpatParamRendCom->q_diffuseness_vector, hSpatParamRendCom, hDirACRend, -#ifndef FIX_998_UNUSED_FUNCTION - 0, - 0, -#endif hMasaExtRend->hVBAPdata, hDirACRend->hOutSetup, nchan_transport, diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 96774b44f..9524f0904 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -472,10 +472,6 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 q_diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ -#ifndef FIX_998_UNUSED_FUNCTION - const Word16 sh_rot_max_order, - const Word32 *p_Rmat, /* i : rotation matrix */ -#endif const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const Word16 nchan_transport, /* i : number of transport channels*/ @@ -547,10 +543,6 @@ void ivas_dirac_dec_compute_directional_responses_fx( const Word16 md_idx, const Word32 *surCohRatio_fx, Word16 Q_surCohRatio, -#ifndef FIX_998_UNUSED_FUNCTION - const Word16 shd_rot_max_order, /* i : split-order rotation method */ - const Word32 *p_Rmat, /* i : rotation matrix */ -#endif const Word16 hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); -- GitLab From 6f55992a7571fadcfc0b9dd394ffde622222fb8b Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:13:38 +0200 Subject: [PATCH 1044/1310] [cleanup] accept FIX_1009_ISM_NONDIEGETIC_PANNING --- lib_com/ivas_prot_fx.h | 2 -- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 4 ---- lib_dec/ivas_mono_dmx_renderer_fx.c | 7 ------- 4 files changed, 14 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 06494a4a7..6da0a6de2 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1155,9 +1155,7 @@ void ivas_mono_stereo_downmix_mcmasa_fx( ); void ivas_apply_non_diegetic_panning_fx( -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING Word32 *input_f_fx, /* i : non-diegetic object */ -#endif Word32 *output_f_fx[], /* i/o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain */ const Word16 output_frame /* i : output frame length per channel */ diff --git a/lib_com/options.h b/lib_com/options.h index 89e64da03..dd5d2e2b9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -124,7 +124,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -#define FIX_1009_ISM_NONDIEGETIC_PANNING /* FhG: issue #1009: use correct object buffer for ISM1 non-diegetic pan */ #define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index c7863bb98..ad9091ae0 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1962,11 +1962,7 @@ ivas_error ivas_jbm_dec_render_fx( } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING ivas_apply_non_diegetic_panning_fx( p_tc_fx[0], p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); -#else - ivas_apply_non_diegetic_panning_fx( p_output_fx, st_ivas->hDecoderConfig->non_diegetic_pan_gain_fx, *nSamplesRendered ); -#endif } #ifdef DEBUGGING ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_SBA_LINEAR_ENC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 4f04c4dd8..57d3fa1ad 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -318,9 +318,7 @@ void ivas_mono_stereo_downmix_mcmasa_fx( *------------------------------------------------------------------------*/ void ivas_apply_non_diegetic_panning_fx( -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING Word32 *input_f_fx, /* i : non-diegetic object */ -#endif Word32 *output_f_fx[], /* o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain Q15*/ const Word16 output_frame /* i : output frame length per channel Q11*/ @@ -331,13 +329,8 @@ void ivas_apply_non_diegetic_panning_fx( pan_left_fx = add( mult( non_diegetic_pan_gain_fx, 16384 ), 16384 ); // 0.5.Q15 = 16384 pan_right_fx = sub( 32767, pan_left_fx ); -#ifdef FIX_1009_ISM_NONDIEGETIC_PANNING v_multc_fixed( input_f_fx, L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); v_multc_fixed( input_f_fx, L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); -#else - v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_right_fx ), 16 ), output_f_fx[1], output_frame ); - v_multc_fixed( output_f_fx[0], L_shl( L_deposit_l( pan_left_fx ), 16 ), output_f_fx[0], output_frame ); -#endif return; } -- GitLab From 2e4d664173a9597f42a1fd1d96633684b7549f88 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:13:41 +0200 Subject: [PATCH 1045/1310] [cleanup] accept FIX_1020_AEID_SELECTION_ERRORS --- lib_util/render_config_reader.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 050658bdf..8df6c0d42 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2191,11 +2191,7 @@ ivas_error RenderConfigReader_read( return IVAS_ERR_INVALID_RENDER_CONFIG; } idx = strtol( strtok( NULL, ":" ), NULL, 0 ); -#ifdef FIX_1020_AEID_SELECTION_ERRORS pRenderConfigReader->pAE[acIdx].id = idx; -#else - pRenderConfigReader->pAE->id = idx; -#endif aeHasFgIdx = aeHasPredelay = aeHasRt60 = aeHasDsr = FALSE; aeHasERsize = aeHasERabs = FALSE; -- GitLab From 23f60a96eb66fe7a2e1c0bb3aa5df46f75581b56 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:13:45 +0200 Subject: [PATCH 1046/1310] [cleanup] accept FIX_993_REMOVE_SBA_GET_ORDER --- lib_com/ivas_prot_fx.h | 7 ---- lib_com/ivas_sba_config_fx.c | 68 ------------------------------------ lib_com/options.h | 1 - 3 files changed, 76 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 6da0a6de2..501c91a35 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4921,13 +4921,6 @@ ivas_error ivas_cldfb_dec_reconfig_fx( ivas_error ivas_sba_enc_reconfigure_fx( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); -#ifndef FIX_993_REMOVE_SBA_GET_ORDER -Word16 ivas_sba_get_order_fx( - const Word16 nb_channels, /* i : Number of ambisonic channels */ - const Word16 sba_planar /* i : SBA planar flag */ -); - -#endif /*! r: Ambisonic (SBA) order used for analysis and coding */ Word16 ivas_sba_get_analysis_order( const Word32 ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_sba_config_fx.c b/lib_com/ivas_sba_config_fx.c index 6dbe215ea..ab4d931ad 100644 --- a/lib_com/ivas_sba_config_fx.c +++ b/lib_com/ivas_sba_config_fx.c @@ -60,24 +60,7 @@ void ivas_sba_config_fx( Word16 *element_mode /* o : element mode of the core coder */ ) { -#ifndef FIX_993_REMOVE_SBA_GET_ORDER - test(); - IF( sba_order < 0 && nb_channels < 0 ) - { - assert( 0 && "Either order or number of channels must be positive" ); - } - ELSE IF( sba_order < 0 ) - { - sba_order = ivas_sba_get_order_fx( nb_channels, sba_planar ); - } - ELSE IF( nb_channels < 0 ) - { - nb_channels = ivas_sba_get_nchan_fx( sba_order, sba_planar ); - } - ELSE -#else IF( nb_channels > 0 ) -#endif { IF( sba_planar ) { @@ -128,57 +111,6 @@ void ivas_sba_config_fx( return; } -#ifndef FIX_993_REMOVE_SBA_GET_ORDER -/*-------------------------------------------------------------------* - * ivas_sba_get_order() - * - * Get Ambisonic order from number of ambisonic channels - *-------------------------------------------------------------------*/ - -/*! r: Ambisonic (SBA) order */ -Word16 ivas_sba_get_order_fx( - const Word16 nb_channels, /* i : Number of ambisonic channels */ - const Word16 sba_planar /* i : SBA Planar flag */ -) -{ - Word16 sba_order; - - /* sba_order = (int16_t) sqrtf( (float) nb_channels ) - 1 */ - Word16 sba_order_non_sba_planar[MAX_INPUT_CHANNELS] = { 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3 }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - - IF( sba_planar ) - { - sba_order = shr( sub( nb_channels, 1 ), 1 ); - assert( ( EQ_16( add( shl( sba_order, 1 ), 1 ), nb_channels ) ) && "Number of channels not supported in Planar SBA!" ); - } - ELSE - { - sba_order = sba_order_non_sba_planar[nb_channels - 1]; - move16(); - assert( ( EQ_16( mult( add( sba_order, 1 ), add( sba_order, 1 ) ), nb_channels ) ) && "Number of channels not supported in SBA!" ); - } - - assert( ( sba_order <= 3 ) && "Error: SBA order must be <= 3!" ); - - return ( sba_order ); -} -#endif /*-------------------------------------------------------------------* * ivas_sba_get_analysis_order() diff --git a/lib_com/options.h b/lib_com/options.h index dd5d2e2b9..2629fef4c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,7 +119,6 @@ #define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ -#define FIX_993_REMOVE_SBA_GET_ORDER /* VA: issue 993: remove unused function ivas_sba_get_order() */ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ -- GitLab From 1b256acc1c7b58060a0e7735addf046e5f8d32e2 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:13:57 +0200 Subject: [PATCH 1047/1310] [cleanup] accept NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER --- lib_com/options.h | 1 - lib_dec/ivas_jbm_dec_fx.c | 18 ------------------ 2 files changed, 19 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2629fef4c..20012eef3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -123,7 +123,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -#define NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER /* FhG: issues #1012, 1013: JBM flush function uses wrong output buffer */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index ad9091ae0..bc4a732e0 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2594,12 +2594,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( Word16 n_slots_still_available; Word16 n_samples_to_render; DECODER_TC_BUFFER_HANDLE hTcBuffer; -#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER Word32 *p_output_fx[MAX_CICP_CHANNELS + MAX_NUM_OBJECTS]; -#else - Word32 output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - Word32 *p_output_fx[MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS]; -#endif Word16 nchan_in, nchan_out; IF( !st_ivas->hDecoderConfig->Opt_tsm ) { @@ -2659,17 +2654,10 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( move16(); move16(); -#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER FOR( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) { p_output_fx[ch_idx] = st_ivas->p_output_fx[ch_idx]; } -#else - FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) - { - p_output_fx[ch_idx] = output_fx[ch_idx]; - } -#endif test(); IF( EQ_16( st_ivas->ivas_format, ISM_FORMAT ) ) @@ -2859,15 +2847,9 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( #ifndef DISABLE_LIMITER Word16 ch_idx, exp = 11; move16(); -#ifdef NONBE_FIX_1012_1013_JBM_FLUSH_BUFFER FOR( ch_idx = 0; ch_idx < MAX_OUTPUT_CHANNELS + MAX_NUM_OBJECTS; ch_idx++ ) { p_output_fx[ch_idx] = st_ivas->p_output_fx[ch_idx]; -#else - FOR( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) - { - p_output_fx[ch_idx] = output_fx[ch_idx]; -#endif } ivas_limiter_dec_fx( st_ivas->hLimiter, p_output_fx, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect, exp ); #endif -- GitLab From 81e1438538ac45f8cd6efd392d6dad5e60c8c517 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:14:00 +0200 Subject: [PATCH 1048/1310] [cleanup] accept NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS --- lib_com/options.h | 1 - lib_dec/ivas_masa_dec_fx.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 20012eef3..5c6e0182d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -121,7 +121,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -#define NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS /* Nokia: fix USAN error caused by non-setting of correctly the number of MASA directions in DTX */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index 8bf808ed6..8fdf80ee8 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -166,7 +166,6 @@ ivas_error ivas_masa_decode_fx( } move16(); -#ifdef NONBE_FIX_1004_USAN_DTX_MASA_NO_DIRS test(); test(); IF( EQ_32( ivas_format, MASA_FORMAT ) && ( EQ_32( masa_brate, IVAS_SID_5k2 ) || EQ_32( ivas_total_brate, FRAME_NO_DATA ) ) ) @@ -174,7 +173,6 @@ ivas_error ivas_masa_decode_fx( hMasa->config.numberOfDirections = 1; move16(); } -#endif test(); test(); -- GitLab From 47d2dc631e93a3286ca249f0012ab3a51b7c3e2a Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:14:03 +0200 Subject: [PATCH 1049/1310] [cleanup] accept NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO --- lib_com/options.h | 1 - lib_dec/ivas_ism_renderer_fx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5c6e0182d..6a8396455 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,7 +122,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -#define NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* FhG: issues #1014, #1015, #1016: fix tc buffer info update in the discrete ism renderer */ #define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 370905afd..f303ac761 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -327,13 +327,9 @@ void ivas_ism_render_sf_fx( ivas_combined_orientation_update_index( st_ivas->hCombinedOrientationData, n_samples_in_subframe ); n_samples_rendered_loop = add( n_samples_rendered_loop, n_samples_in_subframe ); -#ifdef NONBE_FIX_1014_1015_1016_OSBA_JBM_STEREO /* update rendered subframe and slots info for all cases apart from a following crend call, the update will then happen in the crend call*/ if ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) -#else - IF( EQ_16( st_ivas->renderer_type, RENDERER_TD_PANNING ) ) -#endif { st_ivas->hTcBuffer->subframes_rendered = add( st_ivas->hTcBuffer->subframes_rendered, 1 ); st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] ); -- GitLab From a98343318ac9ba95d3d49758df1874ab38e29d08 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:14:07 +0200 Subject: [PATCH 1050/1310] [cleanup] accept NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING --- lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal_fx.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6a8396455..fa71cc503 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,7 +122,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */ #define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 75b746ae7..cf2f4a9a0 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1015,7 +1015,6 @@ static void ivas_binaural_obtain_DMX_fx( set32_fx( outRealRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( outImagRightPtr_fx, 0, CLDFB_NO_CHANNELS_MAX ); -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING /*Ambisonics input requires different processing*/ if ( EQ_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) ) { @@ -1038,7 +1037,6 @@ static void ivas_binaural_obtain_DMX_fx( } } else -#endif { FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { @@ -1397,11 +1395,7 @@ ivas_error ivas_binRenderer_open_fx( #ifdef NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) #else -#ifdef NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && NE_16( hBinRenderer->nInChannels, HOA3_CHANNELS ) ) -#else - IF( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) -#endif #endif { FOR( k = 0; k < 11; k++ ) -- GitLab From be76af46001f3bf4f0b37072d72ad9e00092dd3e Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:14:10 +0200 Subject: [PATCH 1051/1310] [cleanup] accept NONBE_FIX_1006_PAST_DMX_NRG_ERROR --- lib_com/options.h | 1 - lib_dec/ivas_stereo_dft_dec_dmx_fx.c | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index fa71cc503..1926ef742 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,7 +122,6 @@ //#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -#define NONBE_FIX_1006_PAST_DMX_NRG_ERROR /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index 59ee077e8..6a369a14c 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -378,15 +378,8 @@ void stereo_dft_unify_dmx_fx( Word16 idx_k0, idx_k1; Word16 q_shift0; Word16 q_shift1; -#ifdef NONBE_FIX_1006_PAST_DMX_NRG_ERROR idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */ idx_k1 = add( idx_k0, 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); -#else - idx_k0 = ( add( hStereoDft->past_DMX_pos, 1 ) ) % STEREO_DFT_PAST_MAX; - move16(); - idx_k1 = ( add( idx_k0, 1 ) ) % STEREO_DFT_PAST_MAX; - move16(); -#endif q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] ); q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] ); -- GitLab From d3da440b6ff931fe8224f2f3d6f1d4a1335ebbc9 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 26 Jun 2025 10:19:53 +0200 Subject: [PATCH 1052/1310] formatting --- lib_dec/ivas_dirac_dec_fx.c | 1 - lib_dec/ivas_mono_dmx_renderer_fx.c | 2 +- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 16 ++++++++-------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 1e14a1675..391f598ba 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2763,7 +2763,6 @@ void ivas_dirac_dec_render_sf_fx( surCohRatio_fx, surCohRatio_q_fx, hodirac_flag ); - } test(); diff --git a/lib_dec/ivas_mono_dmx_renderer_fx.c b/lib_dec/ivas_mono_dmx_renderer_fx.c index 57d3fa1ad..848f457eb 100644 --- a/lib_dec/ivas_mono_dmx_renderer_fx.c +++ b/lib_dec/ivas_mono_dmx_renderer_fx.c @@ -318,7 +318,7 @@ void ivas_mono_stereo_downmix_mcmasa_fx( *------------------------------------------------------------------------*/ void ivas_apply_non_diegetic_panning_fx( - Word32 *input_f_fx, /* i : non-diegetic object */ + Word32 *input_f_fx, /* i : non-diegetic object */ Word32 *output_f_fx[], /* o: core-coder transport mono channel/stereo output */ const Word16 non_diegetic_pan_gain_fx, /* i : non-diegetic panning gain Q15*/ const Word16 output_frame /* i : output frame length per channel Q11*/ diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 3d4ec3077..d96967bcf 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -650,9 +650,9 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( Word16 q_diffuseness, SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom, /* i/o: common spatial renderer data handle */ DIRAC_REND_HANDLE hDirACRend, /* i/o: DirAC renderer handle */ - const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ - const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const Word16 nchan_transport, /* i : number of transport channels*/ + const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ + const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ + const Word16 nchan_transport, /* i : number of transport channels*/ const Word16 md_idx, const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ const Word16 dec_param_estim ) @@ -2938,19 +2938,19 @@ void ivas_dirac_dec_compute_directional_responses_fx( move16(); #ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx - ivas_dirac_dec_get_response_fx_29( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order ); + ivas_dirac_dec_get_response_fx_29( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order ); #else ivas_dirac_dec_get_response_fx( azimuth[k], elevation[k], direct_response_hoa_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_hoa ); #endif - IF( hodirac_flag ) - { + IF( hodirac_flag ) + { #ifdef FIX_1310_SPEEDUP_ivas_dirac_dec_get_response_fx - ivas_dirac_dec_get_response_fx_29( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order ); + ivas_dirac_dec_get_response_fx_29( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order ); #else ivas_dirac_dec_get_response_fx( azimuth2[k], elevation2[k], direct_response_dir2_fx, hDirACRend->hOutSetup.ambisonics_order, Q_direct_response_dir2 ); #endif - } + } test(); test(); -- GitLab From 4542ebc70f732c58bbf35a046b30d78be1de5875 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 26 Jun 2025 10:55:44 +0200 Subject: [PATCH 1053/1310] add 20ms run report to artifacts and do not stop if there was an error --- .gitlab-ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 814f08372..7dcfbab05 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1076,8 +1076,8 @@ check-be-between-renderer-framesizes: - python3 ci/remove_unsupported_testcases.py $PRM_FILES - exit_code=0 - - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 || exit_code=$? - - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors." exit 1; fi + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml || exit_code=$? + - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors."; fi - exit_code5=0 - exit_code10=0 @@ -1104,10 +1104,13 @@ check-be-between-renderer-framesizes: - report-5ms.html - report-junit-10ms.xml - report-10ms.html + - report-junit-20ms.xml + - report-20ms.html reports: junit: - report-junit-5ms.xml - report-junit-10ms.xml + - report-junit-20ms.xml # --------------------------------------------------------------- -- GitLab From 0e71dd31a8ddd83829d51928cc82973a81f14f80 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 26 Jun 2025 11:06:25 +0200 Subject: [PATCH 1054/1310] make framesize-be test manual only --- .gitlab-ci.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7dcfbab05..832e5af6c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1063,7 +1063,9 @@ build-codec-linux-make: check-be-between-renderer-framesizes: extends: - .test-job-linux - - .rules-pytest-to-main-short + # - .rules-pytest-to-main-short + rules: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "renderer-framesize-be" stage: test needs: ["build-codec-linux-make"] script: @@ -1077,7 +1079,6 @@ check-be-between-renderer-framesizes: - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml || exit_code=$? - - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors."; fi - exit_code5=0 - exit_code10=0 @@ -1088,8 +1089,11 @@ check-be-between-renderer-framesizes: - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true - zero_errors=1 - - if [ $zero_errors5 != 1 ]; then echo "run error in with 5ms rendering encountered"; zero_errors=0 ; fi - - if [ $zero_errors10 != 1 ]; then echo "run error in with 10ms rendering encountered"; zero_errors=0 ; fi + - *print-results-banner + - echo "!! Encoder command lines are in the 20ms log files only !!!" + - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors."; zero_errors=0 fi + - if [ $zero_errors5 != 1 ]; then echo "run error with 5ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors10 != 1 ]; then echo "run error with 10ms rendering encountered"; zero_errors=0 ; fi - if [ $zero_errors != 1 ]; then exit $EXIT_CODE_FAIL; fi - if [ $exit_code5 -ne 0 ]; then echo "Non-bitexact cases encountered with 5ms rendering!"; exit_code=1; fi - if [ $exit_code10 -ne 0 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi -- GitLab From f305131ca8123c51b5dc370f46180527420d471e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 26 Jun 2025 11:07:40 +0200 Subject: [PATCH 1055/1310] Revert "[revert-me] temporarily disable some jobs" This reverts commit fb5d39168462c39caeec259c5d062e099454b8bd. --- .gitlab-ci.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 832e5af6c..47ca66996 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -851,7 +851,7 @@ build-codec-linux-make: - make -j # ensure that codec builds on linux with instrumentation active -.build-codec-linux-instrumented-make: +build-codec-linux-instrumented-make: rules: - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -868,7 +868,7 @@ build-codec-linux-make: - bash scripts/prepare_instrumentation.sh -m MEM_ONLY - make -j -C $INSTR_DIR -.build-codec-linux-debugging-make: +build-codec-linux-debugging-make: rules: - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -886,7 +886,7 @@ build-codec-linux-make: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/activate-debug-mode-info-if-set.sh - make -j -.build-codec-windows-msbuild: +build-codec-windows-msbuild: rules: - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -909,7 +909,7 @@ build-codec-linux-make: # --------------------------------------------------------------- ### jobs that check for bitexactness of fx encoder and decoder -.check-be-to-target-short-enc-0db: +check-be-to-target-short-enc-0db: extends: - .check-be-to-target-job variables: @@ -920,7 +920,7 @@ build-codec-linux-make: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -.check-be-to-target-short-enc-+10db: +check-be-to-target-short-enc-+10db: extends: - .check-be-to-target-job variables: @@ -931,7 +931,7 @@ build-codec-linux-make: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -.check-be-to-target-short-enc--10db: +check-be-to-target-short-enc--10db: extends: - .check-be-to-target-job variables: @@ -942,7 +942,7 @@ build-codec-linux-make: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -.check-be-to-target-short-dec-0db: +check-be-to-target-short-dec-0db: extends: - .check-be-to-target-job variables: @@ -953,7 +953,7 @@ build-codec-linux-make: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -.check-be-to-target-short-dec-+10db: +check-be-to-target-short-dec-+10db: extends: - .check-be-to-target-job variables: @@ -964,7 +964,7 @@ build-codec-linux-make: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -.check-be-to-target-short-dec--10db: +check-be-to-target-short-dec--10db: extends: - .check-be-to-target-job variables: @@ -976,7 +976,7 @@ build-codec-linux-make: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" ### jobs that check for regressions on non-BE testcases -.check-regressions-short-enc-0db: +check-regressions-short-enc-0db: extends: - .check-regressions-pytest-job needs: @@ -990,7 +990,7 @@ build-codec-linux-make: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -.check-regressions-short-enc-+10db: +check-regressions-short-enc-+10db: extends: - .check-regressions-pytest-job needs: @@ -1004,7 +1004,7 @@ build-codec-linux-make: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -.check-regressions-short-enc--10db: +check-regressions-short-enc--10db: extends: - .check-regressions-pytest-job needs: @@ -1018,7 +1018,7 @@ build-codec-linux-make: DUT_DECODER_PATH: "$REF_DECODER_PATH" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" -.check-regressions-short-dec-0db: +check-regressions-short-dec-0db: extends: - .check-regressions-pytest-job needs: @@ -1032,7 +1032,7 @@ build-codec-linux-make: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -.check-regressions-short-dec-+10db: +check-regressions-short-dec-+10db: extends: - .check-regressions-pytest-job needs: @@ -1046,7 +1046,7 @@ build-codec-linux-make: DUT_ENCODER_PATH: "$REF_ENCODER_PATH" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" -.check-regressions-short-dec--10db: +check-regressions-short-dec--10db: extends: - .check-regressions-pytest-job needs: @@ -1550,7 +1550,7 @@ coverage-test-on-main-scheduled: # --------------------------------------------------------------- # check bitexactness to EVS -.be-2-evs-26444: +be-2-evs-26444: extends: - .test-job-linux rules: -- GitLab From 427770e1b92497a448280f5adf4d3aac171e2087 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 26 Jun 2025 11:10:54 +0200 Subject: [PATCH 1056/1310] allow to start framesize test from web interface --- .gitlab-ci.yml | 3 +++ .gitlab-ci/variables.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 47ca66996..2ec72727a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -62,6 +62,9 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'voip-be-test' variables: IVAS_PIPELINE_NAME: 'Voip BE test on $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'renderer-framesize-be' + variables: + IVAS_PIPELINE_NAME: 'Renderer framesize BE test on $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' variables: IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 0c212d312..d91866b86 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -63,4 +63,5 @@ variables: - 'complexity' - 'coverage' - 'voip-be-test' + - 'renderer-framesize-be' - 'peaq-enc-passthrough' -- GitLab From 17e116c917760be2cdd07f802e667d8fff0b8ea7 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 12 Jun 2025 10:19:09 +0200 Subject: [PATCH 1057/1310] remove extra frame argument under DBG_BITSTRREAM_ANALYSIS and make the debugging code explicitly dependent on DEBUGGING --- apps/encoder.c | 7 +-- lib_com/bitstream.c | 63 +++++++++--------------- lib_com/prot_fx.h | 14 +++--- lib_enc/ivas_corecoder_enc_reconfig_fx.c | 8 +-- lib_enc/ivas_init_enc_fx.c | 2 +- lib_enc/ivas_qmetadata_enc_fx.c | 10 ++-- lib_enc/ivas_spar_md_enc_fx.c | 2 +- lib_enc/lib_enc.h | 8 --- lib_enc/lib_enc_fx.c | 13 +---- lib_enc/prot_fx_enc.h | 4 -- lib_enc/stat_enc.h | 2 +- 11 files changed, 46 insertions(+), 87 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 0d557ede8..af9554589 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -758,12 +758,7 @@ int main( } /* *** Encode one frame *** */ - if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits -#ifdef DBG_BITSTREAM_ANALYSIS - , - frame -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_ENC_EncodeFrameToSerial( hIvasEnc, pcmBuf, pcmBufSize, bitStream, &numBits ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nencodeFrame failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); goto cleanup; diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 8ebfd6fa7..9a164636b 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -48,9 +48,12 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" -#ifdef DBG_BITSTREAM_ANALYSIS +#ifdef DEBUGGING +#include "debug.h" +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) #include #endif +#endif #define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ @@ -201,7 +204,7 @@ ivas_error ind_list_realloc( { new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].value = old_ind_list[i].value; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif move16(); @@ -215,7 +218,7 @@ ivas_error ind_list_realloc( FOR( ; i < max_num_indices; i++ ) { new_ind_list[i].nb_bits = -1; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) sprintf( new_ind_list[i].function_name, "RESET in ind_list_realloc" ); #endif move16(); @@ -808,7 +811,7 @@ void move_indices( new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif old_ind_list[i].nb_bits = -1; @@ -821,12 +824,12 @@ void move_indices( new_ind_list[i].id = old_ind_list[i].id; new_ind_list[i].value = old_ind_list[i].value; new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( new_ind_list[i].function_name, old_ind_list[i].function_name, 100 ); #endif old_ind_list[i].nb_bits = -1; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) sprintf( old_ind_list[i].function_name, "RESET in move_indices" ); #endif } @@ -897,7 +900,7 @@ ivas_error check_ind_list_limits( return error; } -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) const char *named_indices_table[] = { "IND_IVAS_FORMAT", "IND_SMODE_OMASA", @@ -2817,7 +2820,7 @@ ivas_error push_indice( hBstr->ind_list[j].id = hBstr->ind_list[j - 1].id; hBstr->ind_list[j].nb_bits = hBstr->ind_list[j - 1].nb_bits; hBstr->ind_list[j].value = hBstr->ind_list[j - 1].value; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[j - 1].function_name, 100 ); #endif move16(); @@ -2831,7 +2834,7 @@ ivas_error push_indice( hBstr->ind_list[i].id = id; hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( hBstr->ind_list[i].function_name, named_indices_table[id], 100 ); #endif move16(); @@ -2852,12 +2855,12 @@ ivas_error push_indice( * * Push a new indice into the buffer at the next position *-------------------------------------------------------------------*/ -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_indice_( #else ivas_error push_next_indice( #endif -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -2897,7 +2900,7 @@ ivas_error push_next_indice( move16(); move16(); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( hBstr->ind_list[hBstr->nb_ind_tot].function_name, caller, 100 ); #endif @@ -2914,12 +2917,12 @@ ivas_error push_next_indice( * push_next_bits() * Push a bit buffer into the buffer at the next position *-------------------------------------------------------------------*/ -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_bits_( #else ivas_error push_next_bits( #endif -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -2965,7 +2968,7 @@ ivas_error push_next_bits( ptr->value = code; ptr->nb_bits = 16; ptr->id = prev_id; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( ptr->function_name, caller, 100 ); #endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); @@ -2989,7 +2992,7 @@ ivas_error push_next_bits( ptr->value = bits[i]; ptr->nb_bits = 1; ptr->id = prev_id; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( ptr->function_name, caller, 100 ); #endif hBstr->nb_ind_tot = add( hBstr->nb_ind_tot, 1 ); @@ -3066,7 +3069,7 @@ UWord16 delete_indice( hBstr->ind_list[j].id = hBstr->ind_list[i].id; hBstr->ind_list[j].value = hBstr->ind_list[i].value; hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( hBstr->ind_list[j].function_name, hBstr->ind_list[i].function_name, 100 ); #endif } @@ -3080,7 +3083,7 @@ UWord16 delete_indice( { /* reset the shifted indices at the end of the list */ hBstr->ind_list[j].nb_bits = -1; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) sprintf( hBstr->ind_list[j].function_name, "RESET in delete_indice" ); #endif } @@ -3319,10 +3322,6 @@ static ivas_error write_indices_element_fx( UWord16 **pt_stream, /* i : pointer to bitstream buffer */ const Word16 is_SCE, /* i : flag to distingusih SCE and CPE */ const Word16 element_id /* i : id of the SCE or CPE */ -#ifdef DBG_BITSTREAM_ANALYSIS - , - int32_t frame -#endif ) { Word16 ch; @@ -3429,7 +3428,7 @@ static ivas_error write_indices_element_fx( } } -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) if ( is_SCE ) /* EVS and SCE */ { static FILE *f1 = 0; @@ -3539,10 +3538,6 @@ ivas_error write_indices_ivas_fx( Encoder_Struct *st_ivas, /* i/o: encoder state structure */ UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ -#ifdef DBG_BITSTREAM_ANALYSIS - , - int32_t frame -#endif ) { Word16 i, n; @@ -3566,22 +3561,12 @@ ivas_error write_indices_ivas_fx( FOR( n = 0; n < st_ivas->nSCE; n++ ) { - write_indices_element_fx( st_ivas, &pt_stream, 1, n -#ifdef DBG_BITSTREAM_ANALYSIS - , - frame -#endif - ); + write_indices_element_fx( st_ivas, &pt_stream, 1, n ); } FOR( n = 0; n < st_ivas->nCPE; n++ ) { - write_indices_element_fx( st_ivas, &pt_stream, 0, n -#ifdef DBG_BITSTREAM_ANALYSIS - , - frame -#endif - ); + write_indices_element_fx( st_ivas, &pt_stream, 0, n ); } *num_bits = (UWord16) ( pt_stream - bit_stream ); diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 666484359..9950ac9bd 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10638,17 +10638,17 @@ ivas_error config_acelp1_fx( const Word16 GSC_IVAS_mode /* i : GSC IVAS mode */ ); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) #define push_next_indice( ... ) push_next_indice_( __func__, __VA_ARGS__ ) #define push_next_bits( ... ) push_next_bits_( __func__, __VA_ARGS__ ); #endif -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_indice_( #else ivas_error push_next_indice( #endif -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) const char *caller, #endif BSTR_ENC_HANDLE hBstr, @@ -10656,12 +10656,12 @@ ivas_error push_next_indice( Word16 nb_bits /* i : number of bits used to quantize the indice */ ); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_bits_( #else ivas_error push_next_bits( #endif -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ @@ -10986,7 +10986,7 @@ ivas_error push_indice( ); ivas_error push_next_indice_( -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) const char *caller, #endif BSTR_ENC_HANDLE hBstr, @@ -10995,7 +10995,7 @@ ivas_error push_next_indice_( ); ivas_error push_next_bits_( -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ diff --git a/lib_enc/ivas_corecoder_enc_reconfig_fx.c b/lib_enc/ivas_corecoder_enc_reconfig_fx.c index 6a2748e1c..40ee8b95b 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig_fx.c +++ b/lib_enc/ivas_corecoder_enc_reconfig_fx.c @@ -39,7 +39,7 @@ #include "ivas_prot_fx.h" #include "math.h" #include "wmc_auto.h" -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) #include #endif /*-------------------------------------------------------------------* @@ -196,7 +196,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; /* Q0 */ move16(); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( temp_ind_list[i].function_name, hBstr->ind_list[i].function_name, 100 ); #endif hBstr->ind_list[i].nb_bits = -1; /* Q0 */ @@ -552,7 +552,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); #endif } @@ -579,7 +579,7 @@ ivas_error ivas_corecoder_enc_reconfig_fx( move16(); st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; /* Q0 */ move16(); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].function_name, temp_ind_list[i].function_name, 100 ); #endif } diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 2285acc0c..bfaf80fc6 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -41,7 +41,7 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" #include "prot_fx_enc.h" -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) #include #endif diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 15adcee9c..34af5a727 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -43,7 +43,7 @@ #include "basop_util.h" #include "ivas_rom_com_fx.h" -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) #include #endif @@ -1191,7 +1191,7 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) sprintf( hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial" ); #endif } @@ -1200,12 +1200,12 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) strncpy( hMetaData->ind_list[j].function_name, hMetaData->ind_list[i].function_name, 100 ); #endif hMetaData->nb_bits_tot = add( hMetaData->nb_bits_tot, hMetaData->ind_list[j].nb_bits ); hMetaData->ind_list[i].nb_bits = -1; -#ifdef BISTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) sprintf( hMetaData->ind_list[i].function_name, "RESET in reset_metadata_spatial" ); #endif move16(); @@ -2015,7 +2015,7 @@ void restore_metadata_buffer_fx( { hMetaData->ind_list[i].nb_bits = -1; move16(); -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) sprintf( hMetaData->ind_list[i].function_name, "RESET in restore_metadata_buffer" ); #endif } diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index a293b870a..1a2f5aff0 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -439,7 +439,7 @@ static void write_metadata_buffer_fx( FOR( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) { -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) push_next_indice_( hMetaData_tmp->ind_list[i].function_name, hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); #else push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 16fc9fe4b..8cf6be1cd 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -302,10 +302,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME */ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value */ -#ifdef DBG_BITSTREAM_ANALYSIS - , - int32_t frame -#endif ); /*! r: error code */ @@ -315,10 +311,6 @@ ivas_error IVAS_ENC_EncodeFrameToCompact( const Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() */ UWord8 *outputBitStream, /* o : pointer to compact output bitstream. The array must already be allocated. */ UWord16 *numOutBits /* o : number of bits written to output bitstream */ -#ifdef DBG_BITSTREAM_ANALYSIS - , - int32_t frame -#endif ); /* Setter functions - apply changes to encoder configuration */ diff --git a/lib_enc/lib_enc_fx.c b/lib_enc/lib_enc_fx.c index 6c105228f..a7592e2ca 100644 --- a/lib_enc/lib_enc_fx.c +++ b/lib_enc/lib_enc_fx.c @@ -1279,10 +1279,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( Word16 inputBufferSize, /* i : total number of samples in the input buffer. Related function: IVAS_ENC_GetInputBufferSize() Q0*/ UWord16 *outputBitStream, /* o : pointer to serial output bitstream. The array must already be allocated and be of size at least IVAS_MAX_BITS_PER_FRAME Q0*/ UWord16 *numOutBits /* o : number of bits written to output bitstream. Each bit is stored as a single uint16_t value Q0*/ -#ifdef DBG_BITSTREAM_ANALYSIS - , - int32_t frame -#endif ) { Encoder_Struct *st_ivas; @@ -1406,7 +1402,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( st_ivas->ind_list[i].nb_bits = -1; move16(); } -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) { memset( st_ivas->ind_list[i].function_name, 'A', 100 * sizeof( char ) ); @@ -1517,12 +1513,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( /* write indices into bitstream buffer */ { - write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits -#ifdef DBG_BITSTREAM_ANALYSIS - , - frame -#endif - ); + write_indices_ivas_fx( st_ivas, outputBitStream, numOutBits ); } /* Reset switching flag before next call - can be set to "true" by some setters */ hIvasEnc->switchingActive = false; diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 992087413..8631a3f51 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -4839,9 +4839,5 @@ ivas_error write_indices_ivas_fx( Encoder_Struct *st_ivas, /* i/o: encoder state structure */ UWord16 *bit_stream, /* i/o: output bitstream */ UWord16 *num_bits /* i : number of indices written to output */ -#ifdef DBG_BITSTREAM_ANALYSIS - , - int32_t frame -#endif ); #endif diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 85261a3a7..3839e3ec5 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -54,7 +54,7 @@ typedef struct Word16 id; /* id of the indice */ UWord16 value; /* value of the quantized indice */ Word16 nb_bits; /* number of bits used for the quantization of the indice */ -#ifdef DBG_BITSTREAM_ANALYSIS +#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) char function_name[100]; #endif } Indice, *INDICE_HANDLE; -- GitLab From 876dfec07bfe91091fd33aa7d98feb6547ce82b5 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Thu, 26 Jun 2025 11:34:44 +0200 Subject: [PATCH 1058/1310] simplify function headers --- lib_com/bitstream.c | 10 +++------- lib_com/prot_fx.h | 8 ++------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 9a164636b..ed82754b5 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -50,7 +50,7 @@ #include "prot_fx_enc.h" #ifdef DEBUGGING #include "debug.h" -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) +#ifdef DBG_BITSTREAM_ANALYSIS #include #endif #endif @@ -2857,11 +2857,9 @@ ivas_error push_indice( *-------------------------------------------------------------------*/ #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_indice_( + const char *caller, #else ivas_error push_next_indice( -#endif -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ UWord16 value, /* i : value of the quantized indice */ @@ -2919,11 +2917,9 @@ ivas_error push_next_indice( *-------------------------------------------------------------------*/ #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_bits_( + const char *caller, #else ivas_error push_next_bits( -#endif -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 9950ac9bd..9675c6ce5 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -10645,11 +10645,9 @@ ivas_error config_acelp1_fx( #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_indice_( + const char *caller, #else ivas_error push_next_indice( -#endif -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - const char *caller, #endif BSTR_ENC_HANDLE hBstr, UWord16 value, /* i : value of the quantized indice */ @@ -10658,11 +10656,9 @@ ivas_error push_next_indice( #if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) ivas_error push_next_bits_( + const char *caller, #else ivas_error push_next_bits( -#endif -#if defined( DEBUGGING ) && defined( DBG_BITSTREAM_ANALYSIS ) - const char *caller, #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const UWord16 bits[], /* i : bit buffer to pack, sequence of single bits */ -- GitLab From 4f55bfb6f2b7af9c4a9ba6c529a2521613f2a2aa Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Thu, 26 Jun 2025 11:41:44 +0200 Subject: [PATCH 1059/1310] change shr_o -> shr_sat --- lib_enc/gaus_enc_fx.c | 8 ++++++++ lib_enc/multi_harm_fx.c | 8 ++++++++ lib_enc/set_impulse_fx.c | 4 ++++ lib_enc/stat_noise_uv_enc_fx.c | 8 ++++++++ 4 files changed, 28 insertions(+) diff --git a/lib_enc/gaus_enc_fx.c b/lib_enc/gaus_enc_fx.c index 2aa9a5dff..d002d5206 100644 --- a/lib_enc/gaus_enc_fx.c +++ b/lib_enc/gaus_enc_fx.c @@ -362,7 +362,11 @@ void gauss2v_fx( exp_den = norm_l( Lden ); Den = extract_h( L_shl( Lden, exp_den ) ); +#ifdef ISSUE_1772_replace_shr_o + delta = shr_sat( div_s( Num, Den ), sub( exp_num, exp_den ) ); /* Q15 */ +#else delta = shr_o( div_s( Num, Den ), sub( exp_num, exp_den ), &Overflow ); /* Q15 */ +#endif delta = i_mult2( delta, m_sign ); /* Apply sign Q0*/ /* index_delta = (short)(FAC_DELTA * fdelta) */ index_delta = shr( delta, SFAC_DELTA ); @@ -823,7 +827,11 @@ void gauss2v_ivas_fx( exp_den = norm_l( Lden ); Den = extract_h( L_shl( Lden, exp_den ) ); +#ifdef ISSUE_1772_replace_shr_o + delta = shr_sat( div_s( Num, Den ), sub( exp_num, exp_den ) ); /* Q15 */ +#else delta = shr_o( div_s( Num, Den ), sub( exp_num, exp_den ), &Overflow ); /* Q15 */ +#endif delta = i_mult2( delta, m_sign ); /* Apply sign */ /* index_delta = (short)(FAC_DELTA * fdelta) */ index_delta = shr( delta, SFAC_DELTA ); diff --git a/lib_enc/multi_harm_fx.c b/lib_enc/multi_harm_fx.c index 1bae597b6..c49c405b5 100644 --- a/lib_enc/multi_harm_fx.c +++ b/lib_enc/multi_harm_fx.c @@ -238,7 +238,11 @@ Word16 multi_harm_fx( /* o : frame multi-harmonicity corxy = shl( corxy, cor ); /* cor = corxy * corxy / (corx2 * cory2) */ corxy = div_s( corxy, corx2 ); +#ifdef ISSUE_1772_replace_shr_o + cor = shr_sat( corxy, sub( shl( tmp16, 1 ), Expx2 ) ); /* Q15 */ +#else cor = shr_o( corxy, sub( shl( tmp16, 1 ), Expx2 ), &Overflow ); /* Q15 */ +#endif } ELSE { @@ -575,7 +579,11 @@ Word16 multi_harm_ivas_fx( /* o : frame multi-harmoni corxy = shl( corxy, cor ); /* cor = corxy * corxy / (corx2 * cory2) */ corxy = div_s( corxy, corx2 ); +#ifdef ISSUE_1772_replace_shr_o + cor = shr_sat( corxy, sub( shl( tmp16, 1 ), Expx2 ) ); /* Q15 */ +#else cor = shr_o( corxy, sub( shl( tmp16, 1 ), Expx2 ), &Overflow ); /* Q15 */ +#endif } ELSE { diff --git a/lib_enc/set_impulse_fx.c b/lib_enc/set_impulse_fx.c index d4dd73abe..f6f7b6dd5 100644 --- a/lib_enc/set_impulse_fx.c +++ b/lib_enc/set_impulse_fx.c @@ -201,7 +201,11 @@ void set_impulse_fx( den = extract_h( L_shl( rr_fx[i], exp_den ) ); num = div_s( num, den ); +#ifdef ISSUE_1772_replace_shr_o + krit_fx = shr_sat( num, sub( sub( shl_o( exp_num, 1, &Overflow ), exp_den ), 2 ), &Overflow ); /* Q18 */ +#else krit_fx = shr_o( num, sub( sub( shl_o( exp_num, 1, &Overflow ), exp_den ), 2 ), &Overflow ); /* Q18 */ +#endif IF( GT_16( krit_fx, krit_max_fx ) ) { diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index 24932542c..8d4f899da 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -69,7 +69,11 @@ void stat_noise_uv_enc_fx( expd = norm_l( LepsP[1] ); den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ num = div_s( num, den ); /*expn-expd+15*/ +#ifdef ISSUE_1772_replace_shr_o + num = shr_sat( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ +#else num = shr_o( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ +#endif num = sub( num, 1024 ); /*num - 1*/ test(); @@ -142,7 +146,11 @@ void stat_noise_uv_enc_ivas_fx( expd = norm_l( LepsP[1] ); den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ num = div_s( num, den ); /*expn-expd+15*/ +#ifdef ISSUE_1772_replace_shr_o + num = shr_sat( num, add( sub( expn, expd ), 5 ) ); /*Q10*/ +#else num = shr_o( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ +#endif num = sub( num, 1024 ); /*num - 1*/ test(); -- GitLab From 2b7051e4a9ff44cc0b35834b64bc999fb349acee Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 26 Jun 2025 15:15:56 +0530 Subject: [PATCH 1060/1310] Fix for 3GPP issue 1757: Sudden drop in comfort noise for fx enc at 24.4kbps stereo DTX Link #1757 --- lib_enc/ivas_core_pre_proc_front_fx.c | 25 ++----------- lib_enc/ivas_front_vad_fx.c | 12 ++---- lib_enc/nois_est_fx.c | 53 +++++++++++++++++++++------ lib_enc/prot_fx_enc.h | 3 +- lib_enc/vad_fx.c | 4 +- 5 files changed, 52 insertions(+), 45 deletions(-) diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index b378eabad..fff73a248 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -1228,16 +1228,7 @@ ivas_error pre_proc_front_ivas_fx( /*------------------------------------------------------------------* * Update estimated noise energy and voicing cut-off frequency *-----------------------------------------------------------------*/ - - Word16 scale = s_min( Q31, s_min( add( q_tmpN, L_norm_arr( tmpN_fx, NB_BANDS ) ), add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ) ) ); - scale = sub( scale, 1 ); // guard bits - scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) ); - scale_sig32( tmpN_fx, NB_BANDS, sub( scale, q_tmpN ) ); - st->hNoiseEst->q_bckr = q_tmpN = scale; - move16(); - move16(); - - scale = s_min( Q31, add( st->hNoiseEst->ave_enr_q, s_min( L_norm_arr( st->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( st->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) ) ); + Word16 scale = s_min( Q31, add( st->hNoiseEst->ave_enr_q, s_min( L_norm_arr( st->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( st->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) ) ); scale = s_min( scale, add( q_tmpE, L_norm_arr( tmpE_fx, NB_BANDS ) ) ); scale = sub( scale, 1 ); // guard bits scale_sig32( tmpE_fx, NB_BANDS, sub( scale, q_tmpE ) ); @@ -1256,7 +1247,7 @@ ivas_error pre_proc_front_ivas_fx( move16(); move16(); - noise_est_ivas_fx( st, old_pitch1, tmpN_fx, epsP_fx, extract_h( Etot_fx ), *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, + noise_est_ivas_fx( st, old_pitch1, tmpN_fx, q_tmpN, epsP_fx, extract_h( Etot_fx ), *relE_fx, corr_shift_fx, tmpE_fx, q_tmpE, fr_bands_fx, fr_bands_fx_q, cor_map_sum_fx, &ncharX_fx, &sp_div_fx, &q_sp_div, &non_staX_fx, loc_harm, lf_E_fx, q_lf_E_fx, &st->hNoiseEst->harm_cor_cnt, extract_h( st->hNoiseEst->Etot_l_lp_32fx ), st->hNoiseEst->Etot_v_h2_32fx, &st->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_fx, hStereoClassif, NULL, st->ini_frame ); @@ -1265,14 +1256,6 @@ ivas_error pre_proc_front_ivas_fx( { FOR( Word16 j = 0; j < 2; j++ ) { - scale = s_min( add( q_tmpN_LR[j], L_norm_arr( tmpN_LR_fx[j], NB_BANDS ) ), add( hCPE->hFrontVad[j]->hNoiseEst->q_bckr, L_norm_arr( hCPE->hFrontVad[j]->hNoiseEst->bckr_fx, NB_BANDS ) ) ); - scale = sub( s_min( Q31, scale ), 1 ); - scale_sig32( hCPE->hFrontVad[j]->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hCPE->hFrontVad[j]->hNoiseEst->q_bckr ) ); - scale_sig32( tmpN_LR_fx[j], NB_BANDS, sub( scale, q_tmpN_LR[j] ) ); - hCPE->hFrontVad[j]->hNoiseEst->q_bckr = q_tmpN_LR[j] = scale; - move16(); - move16(); - scale = add( hCPE->hFrontVad[j]->hNoiseEst->ave_enr_q, s_min( L_norm_arr( hCPE->hFrontVad[j]->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( hCPE->hFrontVad[j]->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) ); scale = s_min( scale, add( q_tmpE_LR[j], L_norm_arr( tmpE_LR_fx[j], NB_BANDS ) ) ); scale = sub( s_min( Q31, scale ), 1 ); @@ -1297,14 +1280,14 @@ ivas_error pre_proc_front_ivas_fx( move16(); /* Run noise_est for Left and Right channel */ - noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[0], epsP_fx, Etot_LR_fx[0], sub( Etot_LR_fx[0], hCPE->hFrontVad[0]->lp_speech_fx ), corr_shiftL_fx, + noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[0], q_tmpN_LR[0], epsP_fx, Etot_LR_fx[0], sub( Etot_LR_fx[0], hCPE->hFrontVad[0]->lp_speech_fx ), corr_shiftL_fx, tmpE_LR_fx[0], q_tmpE_LR[0], fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], &cor_map_sum_LR_fx[0], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[0], lf_E_LR_fx_q, &hCPE->hFrontVad[0]->hNoiseEst->harm_cor_cnt, extract_h( hCPE->hFrontVad[0]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_32fx, &hCPE->hFrontVad[0]->hNoiseEst->bg_cnt, st->lgBin_E_fx, &dummy_fx, S_map_LR_fx, NULL, hCPE->hFrontVad[0], hCPE->hFrontVad[0]->ini_frame ); /* Note: the index [0] in the last argument is intended, the ini_frame counter is only maintained in the zero-th channel's VAD handle */ - noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[1], epsP_fx, Etot_LR_fx[1], sub( Etot_LR_fx[1], hCPE->hFrontVad[1]->lp_speech_fx ), corr_shiftR_fx, + noise_est_ivas_fx( st, old_pitch1, tmpN_LR_fx[1], q_tmpN_LR[1], epsP_fx, Etot_LR_fx[1], sub( Etot_LR_fx[1], hCPE->hFrontVad[1]->lp_speech_fx ), corr_shiftR_fx, tmpE_LR_fx[1], q_tmpE_LR[1], fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], &cor_map_sum_LR_fx[1], &ncharX_LR_fx, &sp_div_LR_fx, &q_sp_div_LR, &non_staX_LR_fx, loc_harmLR_fx, lf_E_LR_fx[1], lf_E_LR_fx_q, &hCPE->hFrontVad[1]->hNoiseEst->harm_cor_cnt, extract_h( hCPE->hFrontVad[1]->hNoiseEst->Etot_l_lp_32fx ), hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_32fx, &hCPE->hFrontVad[1]->hNoiseEst->bg_cnt, diff --git a/lib_enc/ivas_front_vad_fx.c b/lib_enc/ivas_front_vad_fx.c index ec6a918b9..1f62b6854 100644 --- a/lib_enc/ivas_front_vad_fx.c +++ b/lib_enc/ivas_front_vad_fx.c @@ -720,13 +720,6 @@ ivas_error front_vad_spar_fx( hFrontVad->hNoiseEst->ave_enr_q = scale; move16(); - scale = s_min( add( hFrontVad->hNoiseEst->q_bckr, L_norm_arr( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS ) ), add( q_tmpN, L_norm_arr( tmpN_fx, NB_BANDS ) ) ); - scale = sub( s_min( Q31, scale ), 1 ); // guard bits - scale_sig32( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) ); - scale_sig32( tmpN_fx, NB_BANDS, sub( scale, q_tmpN ) ); - hFrontVad->hNoiseEst->q_bckr = scale; - move16(); - scale = add( hFrontVad->hNoiseEst->fr_bands_fx_q, s_min( L_norm_arr( hFrontVad->hNoiseEst->fr_bands1_fx, NB_BANDS ), L_norm_arr( hFrontVad->hNoiseEst->fr_bands2_fx, NB_BANDS ) ) ); scale = s_min( scale, add( q_fr_bands[0], L_norm_arr( fr_bands_fx[0], 2 * NB_BANDS ) ) ); scale = s_min( Q31, scale ); @@ -737,7 +730,7 @@ ivas_error front_vad_spar_fx( move16(); move16(); - noise_est_ivas_fx( st, old_pitch, tmpN_fx, epsP_fx, Etot_fx[0], sub( Etot_fx[0], hFrontVad->lp_speech_fx ), corr_shift_fx, tmpE_fx, + noise_est_ivas_fx( st, old_pitch, tmpN_fx, q_tmpN, epsP_fx, Etot_fx[0], sub( Etot_fx[0], hFrontVad->lp_speech_fx ), corr_shift_fx, tmpE_fx, hFrontVad->hNoiseEst->ave_enr_q, fr_bands_fx[0], q_fr_bands[0], &cor_map_sum_fx, NULL, &sp_div_fx, &Q_sp_div, &non_staX_fx, &loc_harm, lf_E_fx[0], q_lf_E[0], &hFrontVad->hNoiseEst->harm_cor_cnt, extract_h( hFrontVad->hNoiseEst->Etot_l_lp_32fx ), hFrontVad->hNoiseEst->Etot_v_h2_32fx, &hFrontVad->hNoiseEst->bg_cnt, st->lgBin_E_fx, &sp_floor, S_map_fx, NULL, hFrontVad, hFrontVad->ini_frame ); @@ -765,7 +758,8 @@ ivas_error front_vad_spar_fx( move16(); hSpar->front_vad_dtx_flag = 1; move16(); - if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) + test(); + if ( EQ_32( st->core_brate, SID_2k40 ) || st->core_brate == FRAME_NO_DATA ) { hSpar->front_vad_dtx_flag = 0; move16(); diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 676696fd6..9a4829121 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -2208,7 +2208,8 @@ void noise_est_fx( void noise_est_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 old_pitch1, /* i : previous frame OL pitch[1] */ - const Word32 tmpN[], /* i : temporary noise update Q_new + QSCALE */ + const Word32 tmpN[], /* i : temporary noise update q_tmpN */ + const Word16 q_tmpN, /* i : Q-factor of tmpN buffer */ const Word32 epsP[], /* i : msb prediction error energies Qx */ const Word16 Etot, /* i : total channel E (see find_enr_fx.c) Q8 */ const Word16 relE, /* i : (VA_CHECK addition) relative frame energy Q8? */ @@ -2221,7 +2222,7 @@ void noise_est_ivas_fx( Word16 *ncharX, /* o : Q11 */ Word16 *sp_div, /* o : Q_sp_div */ Word16 *Q_sp_div, /* o : Q factor for sp_div */ - Word32 *non_staX, /* o : non-stationarity for sp/mus classifier Q20 */ + Word32 *non_staX, /* o : non-stationarity for sp/mus classifier */ Word16 *loc_harm, /* o : multi-harmonicity flag for UV classifier */ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E */ const Word16 q_lf_E, /* i : Q of lf_E Q0 */ @@ -2264,7 +2265,7 @@ void noise_est_ivas_fx( Word16 non_staB; /* Q8 */ Word32 L_tmp_enr, L_tmp_ave, L_tmp_ave2; - Word16 tmp, tmp2; /* general temp registers */ + Word16 tmp, tmp2, diff; /* general temp registers */ Word16 tmp_enr, tmp_floor; /* constants in Q8 */ Word16 vad_bwidth_fx; /* vad ns control variabel for input bwidth from teh BWD */ /* for DTX operation */ @@ -2775,10 +2776,16 @@ void noise_est_ivas_fx( move16(); IF( hNoiseEst->bckr_fx[i] != 0 ) { - Ltmp1 = L_add( hNoiseEst->bckr_fx[i], L_shl( 1, hNoiseEst->q_bckr ) ); // hNoiseEst->q_bckr + diff = 0; + move16(); + IF( GT_16( hNoiseEst->q_bckr, 30 ) ) + { + diff = sub( hNoiseEst->q_bckr, 30 ); + } + Ltmp1 = L_add( L_shr( hNoiseEst->bckr_fx[i], diff ), L_shl( 1, sub( hNoiseEst->q_bckr, diff ) ) ); // hNoiseEst->q_bckr - diff e_ener = norm_l( Ltmp1 ); f_ener = Log2_norm_lc( L_shl( Ltmp1, e_ener ) ); - e_ener = sub( sub( 30, e_ener ), hNoiseEst->q_bckr ); + e_ener = sub( sub( 30, e_ener ), sub( hNoiseEst->q_bckr, diff ) ); Ltmp1 = L_mac( f_ener, e_ener, ONE_IN_Q14 ); // Q15 Ltmp1 = Mpy_32_16_1( Ltmp1, 22713 ); // Q15 tmp_floor = round_fx( L_shl( Ltmp1, 9 ) ); /* Q8 */ @@ -3499,6 +3506,8 @@ void noise_est_ivas_fx( hNoiseEst->bckr_fx[i] = tmpN[i]; move32(); } + hNoiseEst->q_bckr = q_tmpN; + move16(); } /* else if ( ( ( st->act_pred < 0.80f ) && ( aE_bgd || PAU ) && st->lt_haco_ev < 0.10f ) || ( ( st->act_pred < 0.70f ) && ( aE_bgd || non_staB < 17.0f ) && PAU && st->lt_haco_ev < 0.15f ) @@ -3536,14 +3545,34 @@ void noise_est_ivas_fx( hNoiseEst->first_noise_updt = 1; move16(); - FOR( i = 0; i < NB_BANDS; i++ ) + IF( LT_16( q_tmpN, hNoiseEst->q_bckr ) ) { - /* st->bckr[i] = st->bckr[i] + updt_step * (tmpN[i]-st->bckr[i]);*/ - /* 32 bit state update */ - Ltmp = L_sub( tmpN[i], hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr - Ltmp = Mult_32_16( Ltmp, updt_step ); - hNoiseEst->bckr_fx[i] = L_add( Ltmp, hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr - move32(); + diff = sub( hNoiseEst->q_bckr, q_tmpN ); + FOR( i = 0; i < NB_BANDS; i++ ) + { + /* st->bckr[i] = st->bckr[i] + updt_step * (tmpN[i]-st->bckr[i]);*/ + /* 32 bit state update */ + Ltmp1 = L_shr( hNoiseEst->bckr_fx[i], diff ); + Ltmp = L_sub( tmpN[i], Ltmp1 ); // q_tmpN + Ltmp = Mult_32_16( Ltmp, updt_step ); + hNoiseEst->bckr_fx[i] = L_add( Ltmp, Ltmp1 ); // q_tmpN + move32(); + } + hNoiseEst->q_bckr = q_tmpN; + move16(); + } + ELSE + { + diff = sub( q_tmpN, hNoiseEst->q_bckr ); + FOR( i = 0; i < NB_BANDS; i++ ) + { + /* st->bckr[i] = st->bckr[i] + updt_step * (tmpN[i]-st->bckr[i]);*/ + /* 32 bit state update */ + Ltmp = L_sub( L_shr( tmpN[i], diff ), hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr + Ltmp = Mult_32_16( Ltmp, updt_step ); + hNoiseEst->bckr_fx[i] = L_add( Ltmp, hNoiseEst->bckr_fx[i] ); // hNoiseEst->q_bckr + move32(); + } } } /*else if (aE_bgd || st->harm_cor_cnt > 100 )*/ diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index 992087413..691ce7004 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -385,7 +385,8 @@ void noise_est_fx( void noise_est_ivas_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 old_pitch1, /* i : previous frame OL pitch[1] */ - const Word32 tmpN[], /* i : temporary noise update Q_new + QSCALE */ + const Word32 tmpN[], /* i : temporary noise update q_tmpN */ + const Word16 q_tmpN, /* i : Q-factor of tmpN buffer */ const Word32 epsP[], /* i : msb prediction error energies Qx */ const Word16 Etot, /* i : total channel E (see find_enr_fx.c) Q8 */ const Word16 relE, /* i : (VA_CHECK addition) relative frame energy Q8? */ diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index 1cf7a5de8..8f1fb6985 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -2369,10 +2369,10 @@ Word16 wb_vad_ivas_fx( } norm_tmp = norm_l( ftmp1 ); - scaled_tmp = L_shl( ftmp1, norm_tmp ); /*13+norm_tmp*/ + scaled_tmp = L_shl( ftmp1, norm_tmp ); /*16+norm_tmp*/ L_msnr = scaled_tmp; move32(); - L_msnr_e = sub( 18, norm_tmp ); + L_msnr_e = sub( 15, norm_tmp ); FOR( j = 1; j < stmp; j++ ) { L_msnr = Mult_32_32( L_msnr, scaled_tmp ); /*L_msnr_e msnr *= ftmp1;*/ -- GitLab From 4c57143ed42a9f0f4ba23d35c934d552d1af1122 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 26 Jun 2025 12:18:33 +0200 Subject: [PATCH 1061/1310] Added q_acelp_zir_fx to scale acelp_zir_fx in dynamic q_win cases --- lib_dec/dec_tcx_fx.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index b993f6753..b544ba417 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -2988,6 +2988,7 @@ void IMDCT_ivas_fx( const Word16 fullbandScale, Word16 *acelp_zir_fx, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *q_acelp_zir_fx, Word16 *pq_win ) #else Word16 q_win ) // Q(-2) @@ -3301,6 +3302,11 @@ void IMDCT_ivas_fx( { /* default, i.e. maximum overlap, single transform, no grouping */ #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( allow_qwin_change && fullbandScale ) + { + q_win = s_min( q_win, norm_arr( acelp_zir_fx, shr( L_frame_glob, 1 ) ) + *q_acelp_zir_fx ); + } + IF( EQ_16( kernel_type, MDST_IV ) ) { TCX_MDST_Inverse_qwin_fx( x_fx, x_e_hdrm, xn_buf_fx, overlap, sub( L_frame, overlap ), overlap, &q_win, allow_qwin_change ); @@ -3333,6 +3339,16 @@ void IMDCT_ivas_fx( } #endif +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( !fullbandScale ) + { + *q_acelp_zir_fx = q_xn_buf_fx; + } + ELSE + { + scale_sig( acelp_zir_fx, shr( L_frame_glob, 1 ), sub( q_xn_buf_fx, *q_acelp_zir_fx ) ); + } +#endif tcx_windowing_synthesis_current_frame( xn_buf_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, !bfi && ( frame_cnt > 0 ) && ( index == 0 ) && NE_16( st->last_core, ACELP_CORE ) ? MIN_OVERLAP : index, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, shr( L_frame_glob, 1 ), ( tcx_offset < 0 ) ? -tcx_offset : 0, ( frame_cnt > 0 /*|| (st->last_con_tcx )*/ ) ? 1 : st->last_core_bfi, ( frame_cnt > 0 ) ? 0 : (Word8) st->last_is_cng, fullbandScale ); } /* tcx_last_overlap_mode != FULL_OVERLAP */ @@ -3512,6 +3528,10 @@ void IMDCT_ivas_fx( } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF( allow_qwin_change && fullbandScale ) + { + q_win = s_min( q_win, norm_arr( acelp_zir_fx, shr( L_frame_glob, 1 ) ) + *q_acelp_zir_fx ); + } IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && ( LE_32( st->last_core_brate, SID_2k40 ) || st->last_core == ACELP_CORE ) && ( fullbandScale == 0 ) ) { /* Increase headroom because if the ACELP ZIR is used below, the synthesis filter gain is unknown. */ @@ -3585,7 +3605,17 @@ void IMDCT_ivas_fx( move16(); } } - +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + IF(!fullbandScale) + { + *q_acelp_zir_fx = q_xn_buf_fx; + } + ELSE + { + scale_sig( acelp_zir_fx, shr( L_frame_glob, 1 ), sub( q_xn_buf_fx, *q_acelp_zir_fx ) ); + } +#endif + //scale_sig( acelp_zir_fx, L_FRAME_MAX / 2, sub( q_xn_buf_fx, q_win0 ) ); /* Window current frame */ tcx_windowing_synthesis_current_frame( xn_buf_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, hTcxCfg->tcx_last_overlap_mode, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, shr( L_frame_glob, 1 ), acelp_mem_len, st->last_core_bfi, (Word8) st->last_is_cng, fullbandScale ); } @@ -5738,7 +5768,7 @@ void decoder_tcx_imdct_fx( Word32 x_tmp_fx[L_FRAME_PLUS]; Word32 xn_bufFB_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX] = { 0 }; Word16 xn_bufFB_fx_16[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; - Word16 acelp_zir_fx[L_FRAME_MAX / 2]; + Word16 acelp_zir_fx[L_FRAME_MAX / 2], q_acelp_zir_fx = 0; Word32 x_itf_fx[N_MAX_TCX - IGF_START_MN]; Word16 index, proc = 0; TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; @@ -5911,7 +5941,7 @@ void decoder_tcx_imdct_fx( #endif hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, &q_acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); #endif @@ -5940,7 +5970,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( xn_bufFB_fx, q_x, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf_fx, hTcxCfg->tcx_aldo_window_1, hTcxCfg->tcx_aldo_window_1_trunc, hTcxCfg->tcx_aldo_window_2, hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, q_win ); + kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, &st->hHQ_core->Q_old_wtda_LB, 0, st, 0, acelp_zir_fx, &q_acelp_zir_fx, q_win ); #else kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_out_LB_fx, 0, st, 0, acelp_zir_fx, q_win ); #endif @@ -5974,7 +6004,7 @@ void decoder_tcx_imdct_fx( #endif hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_winFB ); + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, &q_acelp_zir_fx, q_winFB ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #endif @@ -5987,7 +6017,7 @@ void decoder_tcx_imdct_fx( IMDCT_ivas_fx( x_fx, q_x, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB_fx_16, hTcxCfg->tcx_aldo_window_1_FB, hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, #endif #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD - kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, q_winFB ); + kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, &st->hHQ_core->Q_old_wtda, 1, st, ratio, acelp_zir_fx, &q_acelp_zir_fx, q_winFB ); #else kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, shr( s_max( L_frameTCX, L_spec ), 1 ), L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out_fx, 1, st, ratio, acelp_zir_fx, q_win ); #endif -- GitLab From 66465ef3e2925af99a7cd98aac18e8e2bcbe650c Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 26 Jun 2025 12:46:41 +0200 Subject: [PATCH 1062/1310] Applied Clang formating patch. --- lib_dec/dec_tcx_fx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index b544ba417..33dd3dfd3 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3606,7 +3606,7 @@ void IMDCT_ivas_fx( } } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - IF(!fullbandScale) + IF( !fullbandScale ) { *q_acelp_zir_fx = q_xn_buf_fx; } @@ -3615,7 +3615,6 @@ void IMDCT_ivas_fx( scale_sig( acelp_zir_fx, shr( L_frame_glob, 1 ), sub( q_xn_buf_fx, *q_acelp_zir_fx ) ); } #endif - //scale_sig( acelp_zir_fx, L_FRAME_MAX / 2, sub( q_xn_buf_fx, q_win0 ) ); /* Window current frame */ tcx_windowing_synthesis_current_frame( xn_buf_fx, tcx_aldo_window_2_fx, tcx_mdct_window_half_fx, tcx_mdct_window_minimum_fx, overlap, tcx_mdct_window_half_length, tcx_mdct_window_min_length, left_rect, hTcxCfg->tcx_last_overlap_mode, acelp_zir_fx, hTcxDec->old_syn_Overl, syn_Overl_TDAC_fx, st->old_Aq_12_8_fx, tcx_mdct_window_trans_fx, shr( L_frame_glob, 1 ), acelp_mem_len, st->last_core_bfi, (Word8) st->last_is_cng, fullbandScale ); } -- GitLab From 24c6246d773789d0d80a81ce1be946775f07e813 Mon Sep 17 00:00:00 2001 From: naghibza Date: Thu, 26 Jun 2025 13:16:38 +0200 Subject: [PATCH 1063/1310] Added *q_acelp_zir_fx as a parameter to IMDCT_ivas_fx() in prot_fx.h. --- lib_com/prot_fx.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 684dfa377..c49c0dfb7 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -9484,6 +9484,7 @@ void IMDCT_ivas_fx( const Word16 fullbandScale, Word16 *acelp_zir_fx, #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 *q_acelp_zir_fx, Word16 *pq_win ); #else Word16 q_win ); -- GitLab From ead644bcbb9d5f739ab15baffa70b85c5ac82dee Mon Sep 17 00:00:00 2001 From: marc emerit Date: Thu, 26 Jun 2025 18:02:15 +0200 Subject: [PATCH 1064/1310] for iac and energy values of reverb use float values in rom and do the fix point conversion at init. Initialisation in Q28 for energy and Q26 for coherence --- lib_rend/ivas_hrtf_fx.c | 72 ++++ lib_rend/ivas_reverb_fx.c | 11 + lib_rend/ivas_reverb_utils_fx.c | 14 +- lib_rend/ivas_rom_binaural_crend_head.h | 30 +- lib_rend/ivas_rom_binaural_crend_head_fx.c | 402 ++++++++++++++++++--- lib_util/hrtf_file_reader.c | 12 +- 6 files changed, 459 insertions(+), 82 deletions(-) diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 13b5ae5cb..58dc54b26 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -288,6 +288,77 @@ ivas_error ivas_HRTF_statistics_init( switch ( sampleRate ) { +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + case 48000: + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + if ( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + if ( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + floatToFixed_arr32( defaultHRIR_left_avg_power_48kHz_fx, HrtfStatistics->average_energy_l_dyn, Q28, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_right_avg_power_48kHz_fx, HrtfStatistics->average_energy_r_dyn, Q28, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_coherence_48kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, Q26, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + break; + case 32000: + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + if ( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + if ( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); + if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + floatToFixed_arr32( defaultHRIR_left_avg_power_32kHz_fx, HrtfStatistics->average_energy_l_dyn, Q28, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_right_avg_power_32kHz_fx, HrtfStatistics->average_energy_r_dyn, Q28, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_coherence_32kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, Q26, LR_IAC_LENGTH_NR_FC ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + break; + case 16000: + HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); + if ( HrtfStatistics->average_energy_l_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); + if ( HrtfStatistics->average_energy_r_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + HrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( Word32 ) ); + if ( HrtfStatistics->inter_aural_coherence_dyn == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); + } + floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrtfStatistics->average_energy_l_dyn, Q28, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_right_avg_power_16kHz_fx, HrtfStatistics->average_energy_r_dyn, Q28, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrtfStatistics->inter_aural_coherence_dyn, Q26, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ + HrtfStatistics->average_energy_l = (const Word32 *) HrtfStatistics->average_energy_l_dyn; + HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; + HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; + break; +#else case 48000: HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz_fx; HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz_fx; @@ -303,6 +374,7 @@ ivas_error ivas_HRTF_statistics_init( HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz_fx; HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz_fx; break; +#endif } HrtfStatistics->fromROM = TRUE; diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 00513d30e..4e054b699 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1644,10 +1644,17 @@ ivas_error ivas_reverb_open_fx( { params.pDsr_fx[i] = L_shl( params.pDsr_fx[i], params.pDsr_e[i] ); move32(); +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + pHrtf_avg_pwr_response_l_const[i] = params.pHrtf_avg_pwr_response_l_const_fx[i]; /*Q28*/ + move32(); + pHrtf_avg_pwr_response_r_const[i] = params.pHrtf_avg_pwr_response_r_const_fx[i]; /*Q23+5*/ + move32(); +#else pHrtf_avg_pwr_response_l_const[i] = L_shl( params.pHrtf_avg_pwr_response_l_const_fx[i], 5 ); /*Q23+5*/ move32(); pHrtf_avg_pwr_response_r_const[i] = L_shl( params.pHrtf_avg_pwr_response_r_const_fx[i], 5 ); /*Q23+5*/ move32(); +#endif } FOR( i = 0; i < lenT60_filter_coeff; i++ ) { @@ -1695,7 +1702,11 @@ ivas_error ivas_reverb_open_fx( Word32 *pHrtf_inter_aural_coherence_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 ) ); FOR( i = 0; i < nr_fc_fft_filter; i++ ) { +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], 3 ); /*Scaling up to Q30*/ +#else + pHrtf_inter_aural_coherence_const[i] = params.pHrtf_inter_aural_coherence_const_fx[i]; /*Scaling up to Q30*/ +#endif move32(); } ivas_reverb_calc_correl_filters_fx( pHrtf_inter_aural_coherence_const, pTime_window_fx, pState->fft_size, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx ); diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index f673fdc7d..4a3c0477c 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -311,7 +311,11 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #endif #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB const int16_t avg_pwr_len = sampling_rate == 16000 ? LR_IAC_LENGTH_NR_FC_16KHZ : LR_IAC_LENGTH_NR_FC; +#else + const int16_t avg_pwr_len = LR_IAC_LENGTH_NR_FC; +#endif for ( freq_idx = 0; freq_idx < avg_pwr_len; freq_idx++ ) { @@ -328,11 +332,11 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 ) ); - Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 ) ); - Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 ) ); - Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 ) ); - Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 ) ); - Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 ) ); + Word32 *output_fc_fx = (Word32 *) malloc( avg_pwr_len * sizeof( Word32 ) ); + Word16 *avg_pwr_left_e = (Word16 *) malloc( avg_pwr_len * sizeof( Word16 ) ); + Word16 *avg_pwr_right_e = (Word16 *) malloc( avg_pwr_len * sizeof( Word16 ) ); + Word32 *avg_pwr_left_fx = (Word32 *) malloc( avg_pwr_len * sizeof( Word32 ) ); + Word32 *avg_pwr_right_fx = (Word32 *) malloc( avg_pwr_len * sizeof( Word32 ) ); for ( int i = 0; i < 60; i++ ) { diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 017703460..4f40c2ed7 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -349,6 +349,19 @@ extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2522]; #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +extern float defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern float defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern float defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ + +extern float defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ +extern float defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ +extern float defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ + +extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ +extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ +#else extern const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ @@ -357,23 +370,6 @@ extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; / extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ - -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB -extern const float defaultHRIR_coherence_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ -extern const float defaultHRIR_left_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -extern const float defaultHRIR_right_avg_power_16kHz[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ - -extern const float defaultHRIR_coherence_32kHz[LR_IAC_LENGTH_NR_FC]; -extern const float defaultHRIR_left_avg_power_32kHz[LR_IAC_LENGTH_NR_FC]; -extern const float defaultHRIR_right_avg_power_32kHz[LR_IAC_LENGTH_NR_FC]; - -extern const float defaultHRIR_coherence_48kHz[LR_IAC_LENGTH_NR_FC]; -extern const float defaultHRIR_left_avg_power_48kHz[LR_IAC_LENGTH_NR_FC]; -extern const float defaultHRIR_right_avg_power_48kHz[LR_IAC_LENGTH_NR_FC]; -#else extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index df78d5b25..436ba60f6 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -59651,6 +59651,257 @@ const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS] }; #ifdef FIX_638_ENERGIE_IAC_ROM_TABLES + +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB +/********************** defaultHRIR reverb rom tables at sampling rate 48kHz **********************/ + +const float defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] = + {0.997092f, 0.947391f, 0.799213f, 0.575216f, 0.335047f, 0.138324f, 0.007933f, 0.000000f, 0.000000f, + 0.000000f, 0.008438f, 0.037607f, 0.044493f, 0.042149f, 0.041877f, 0.039860f, 0.029404f, 0.015898f, + 0.010316f, 0.014065f, 0.020005f, 0.024518f, 0.029292f, 0.033522f, 0.033418f, 0.029630f, 0.027260f, + 0.027515f, 0.025682f, 0.019571f, 0.013977f, 0.013695f, 0.016531f, 0.016882f, 0.013257f, 0.008483f, + 0.004883f, 0.002525f, 0.001004f, 0.000180f, 0.000000f, 0.000000f, 0.000000f, 0.000785f, 0.003979f, + 0.007082f, 0.009598f, 0.011665f, 0.012700f, 0.011794f, 0.009192f, 0.006164f, 0.003527f, 0.001284f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000894f, 0.002136f, 0.003127f, 0.003616f, + 0.003810f, 0.003754f, 0.003186f, 0.002091f, 0.000823f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.001007f, 0.001843f, 0.002400f, + 0.002505f, 0.002133f, 0.001524f, 0.000903f, 0.000317f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000202f, 0.000867f, 0.001309f, + 0.001553f, 0.001563f, 0.001334f, 0.000961f, 0.000530f, 0.000033f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000278f, 0.000621f, 0.000951f, 0.001272f, 0.001608f, 0.001931f, + 0.002199f, 0.002435f, 0.002687f, 0.002947f, 0.003173f, 0.003370f, 0.003577f, 0.003781f, 0.003920f, + 0.003978f, 0.003985f, 0.003937f, 0.003783f, 0.003511f, 0.003170f, 0.002788f, 0.002337f, 0.001808f, + 0.001255f, 0.000716f, 0.000166f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003551f, 0.000000f, 0.000000f, + 0.000000f, 0.005564f, 0.000000f, 0.000000f, 0.000000f, 0.008736f, 0.000000f, 0.000000f, 0.001007f, + 0.011608f, 0.002316f, 0.000000f, 0.000000f, 0.011987f, 0.005591f, 0.000000f, 0.000000f, 0.008714f, + 0.005905f, 0.000000f, 0.000000f, 0.005316f, 0.003972f, 0.000000f, 0.000000f, 0.003403f, 0.002041f, + 0.000000f, 0.000000f, 0.002140f, 0.000245f, 0.000000f}; + +const float defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] = + {0.981018f, 0.973361f, 0.958480f, 0.950611f, 0.953039f, 0.955845f, 0.950660f, 0.942556f, 0.943810f, + 0.958014f, 0.974983f, 0.982099f, 0.977269f, 0.968243f, 0.961714f, 0.957355f, 0.952468f, 0.947771f, + 0.945396f, 0.943711f, 0.938609f, 0.929975f, 0.922937f, 0.921202f, 0.922151f, 0.920926f, 0.917154f, + 0.914393f, 0.914067f, 0.913705f, 0.911632f, 0.910100f, 0.911873f, 0.915812f, 0.918271f, 0.917846f, + 0.916545f, 0.916408f, 0.916915f, 0.916273f, 0.914005f, 0.911339f, 0.909453f, 0.908137f, 0.906301f, + 0.903476f, 0.900479f, 0.898396f, 0.897057f, 0.895115f, 0.891879f, 0.888353f, 0.885879f, 0.884157f, + 0.881651f, 0.877929f, 0.874417f, 0.872453f, 0.871459f, 0.869941f, 0.867796f, 0.866504f, 0.866990f, + 0.868298f, 0.868985f, 0.869170f, 0.870398f, 0.873460f, 0.877373f, 0.880867f, 0.884271f, 0.889105f, + 0.895880f, 0.903280f, 0.909888f, 0.915965f, 0.922776f, 0.930375f, 0.937111f, 0.941667f, 0.944690f, + 0.947747f, 0.950950f, 0.952712f, 0.951893f, 0.949398f, 0.946830f, 0.944212f, 0.940067f, 0.933749f, + 0.926604f, 0.920193f, 0.914164f, 0.906886f, 0.897913f, 0.888731f, 0.880661f, 0.873093f, 0.864556f, + 0.855014f, 0.846098f, 0.839027f, 0.833268f, 0.827720f, 0.822648f, 0.819628f, 0.819557f, 0.821500f, + 0.823986f, 0.826902f, 0.831352f, 0.837670f, 0.844414f, 0.850004f, 0.854617f, 0.859684f, 0.865573f, + 0.870873f, 0.874346f, 0.876636f, 0.879215f, 0.882152f, 0.883944f, 0.883578f, 0.881897f, 0.880319f, + 0.878855f, 0.876201f, 0.871708f, 0.866458f, 0.861964f, 0.858239f, 0.853971f, 0.848551f, 0.843114f, + 0.839005f, 0.835832f, 0.831994f, 0.826972f, 0.822069f, 0.818424f, 0.815337f, 0.811300f, 0.806249f, + 0.801664f, 0.798529f, 0.796124f, 0.793286f, 0.790217f, 0.788277f, 0.788174f, 0.789082f, 0.789775f, + 0.790281f, 0.791803f, 0.794902f, 0.798467f, 0.801024f, 0.802713f, 0.804961f, 0.808244f, 0.811142f, + 0.812318f, 0.812488f, 0.813349f, 0.815025f, 0.815968f, 0.815334f, 0.814250f, 0.814149f, 0.814776f, + 0.814769f, 0.813685f, 0.812567f, 0.812562f, 0.813456f, 0.814055f, 0.813739f, 0.813391f, 0.814325f, + 0.816394f, 0.817949f, 0.818173f, 0.818552f, 0.820798f, 0.824070f, 0.826010f, 0.826515f, 0.828132f, + 0.832036f, 0.835874f, 0.837493f, 0.838582f, 0.842046f, 0.847074f, 0.850262f, 0.851182f, 0.852997f, + 0.856510f, 0.857491f, 0.852207f, 0.842444f, 0.831373f, 0.816756f, 0.793031f, 0.759822f, 0.723220f, + 0.686833f, 0.646128f, 0.595684f, 0.539241f, 0.486856f, 0.441279f, 0.391675f, 0.324292f, 0.238341f, + 0.149255f, 0.076756f, 0.031022f, 0.009191f, 0.001733f, 0.000140f, 0.000010f, 0.000019f, 0.000015f, + 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, + 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f}; + +const float defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] = + {0.981020f, 0.973360f, 0.958481f, 0.950613f, 0.953040f, 0.955848f, 0.950658f, 0.942557f, 0.943810f, + 0.958017f, 0.974981f, 0.982098f, 0.977271f, 0.968244f, 0.961715f, 0.957356f, 0.952467f, 0.947770f, + 0.945398f, 0.943710f, 0.938610f, 0.929975f, 0.922938f, 0.921205f, 0.922151f, 0.920926f, 0.917152f, + 0.914393f, 0.914069f, 0.913705f, 0.911630f, 0.910101f, 0.911874f, 0.915811f, 0.918272f, 0.917846f, + 0.916542f, 0.916408f, 0.916918f, 0.916272f, 0.914004f, 0.911340f, 0.909452f, 0.908136f, 0.906302f, + 0.903479f, 0.900480f, 0.898395f, 0.897055f, 0.895119f, 0.891880f, 0.888352f, 0.885878f, 0.884154f, + 0.881649f, 0.877926f, 0.874417f, 0.872450f, 0.871458f, 0.869943f, 0.867797f, 0.866503f, 0.866987f, + 0.868297f, 0.868981f, 0.869171f, 0.870394f, 0.873460f, 0.877377f, 0.880866f, 0.884272f, 0.889105f, + 0.895880f, 0.903282f, 0.909886f, 0.915965f, 0.922778f, 0.930375f, 0.937113f, 0.941665f, 0.944689f, + 0.947744f, 0.950952f, 0.952711f, 0.951895f, 0.949398f, 0.946830f, 0.944209f, 0.940067f, 0.933750f, + 0.926601f, 0.920191f, 0.914167f, 0.906884f, 0.897916f, 0.888731f, 0.880663f, 0.873093f, 0.864559f, + 0.855017f, 0.846098f, 0.839028f, 0.833267f, 0.827717f, 0.822649f, 0.819631f, 0.819558f, 0.821499f, + 0.823985f, 0.826902f, 0.831353f, 0.837669f, 0.844416f, 0.850003f, 0.854616f, 0.859686f, 0.865572f, + 0.870872f, 0.874347f, 0.876635f, 0.879216f, 0.882154f, 0.883942f, 0.883576f, 0.881895f, 0.880318f, + 0.878857f, 0.876202f, 0.871706f, 0.866459f, 0.861965f, 0.858241f, 0.853968f, 0.848548f, 0.843114f, + 0.839005f, 0.835832f, 0.831994f, 0.826974f, 0.822068f, 0.818424f, 0.815335f, 0.811299f, 0.806245f, + 0.801662f, 0.798530f, 0.796124f, 0.793287f, 0.790217f, 0.788273f, 0.788173f, 0.789081f, 0.789770f, + 0.790279f, 0.791801f, 0.794900f, 0.798466f, 0.801028f, 0.802711f, 0.804962f, 0.808246f, 0.811143f, + 0.812318f, 0.812490f, 0.813348f, 0.815027f, 0.815969f, 0.815335f, 0.814254f, 0.814150f, 0.814776f, + 0.814772f, 0.813686f, 0.812569f, 0.812558f, 0.813456f, 0.814055f, 0.813736f, 0.813389f, 0.814324f, + 0.816395f, 0.817948f, 0.818173f, 0.818549f, 0.820796f, 0.824069f, 0.826013f, 0.826514f, 0.828134f, + 0.832033f, 0.835874f, 0.837493f, 0.838582f, 0.842047f, 0.847077f, 0.850263f, 0.851184f, 0.852998f, + 0.856513f, 0.857491f, 0.852209f, 0.842446f, 0.831375f, 0.816757f, 0.793032f, 0.759821f, 0.723221f, + 0.686832f, 0.646128f, 0.595684f, 0.539241f, 0.486856f, 0.441280f, 0.391676f, 0.324293f, 0.238342f, + 0.149255f, 0.076756f, 0.031022f, 0.009191f, 0.001733f, 0.000140f, 0.000010f, 0.000019f, 0.000015f, + 0.000015f, 0.000014f, 0.000011f, 0.000009f, 0.000009f, 0.000009f, 0.000007f, 0.000006f, 0.000006f, + 0.000007f, 0.000006f, 0.000005f, 0.000005f, 0.000006f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f, + 0.000005f, 0.000005f, 0.000005f, 0.000005f, 0.000005f}; + + +/********************** defaultHRIR reverb rom tables at sampling rate 32kHz **********************/ + +const float defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC] = + {0.992805f, 0.970760f, 0.904274f, 0.794804f, 0.650716f, 0.489140f, 0.331131f, 0.193608f, 0.084875f, + 0.006016f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.006084f, 0.028478f, 0.040113f, + 0.042718f, 0.041091f, 0.039575f, 0.039321f, 0.038312f, 0.033935f, 0.025743f, 0.016207f, 0.009052f, + 0.006651f, 0.008629f, 0.012678f, 0.016595f, 0.019686f, 0.022543f, 0.025721f, 0.028716f, 0.030244f, + 0.029496f, 0.027051f, 0.024537f, 0.023327f, 0.023382f, 0.023280f, 0.021454f, 0.017604f, 0.013058f, + 0.009830f, 0.009160f, 0.010653f, 0.012635f, 0.013369f, 0.012139f, 0.009418f, 0.006248f, 0.003470f, + 0.001368f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.001485f, 0.003632f, 0.005492f, 0.007105f, 0.008527f, 0.009629f, + 0.010103f, 0.009685f, 0.008382f, 0.006502f, 0.004466f, 0.002568f, 0.000890f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000067f, 0.000797f, 0.001293f, 0.001577f, 0.001732f, 0.001797f, 0.001717f, 0.001403f, 0.000826f, + 0.000060f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000318f, 0.000795f, 0.001124f, 0.001249f, 0.001151f, 0.000871f, 0.000495f, 0.000102f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000206f, 0.000612f, 0.000908f, 0.001107f, + 0.001211f, 0.001209f, 0.001095f, 0.000883f, 0.000607f, 0.000298f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000029f, 0.000144f, 0.000254f, 0.000368f, 0.000486f, 0.000599f, + 0.000706f, 0.000810f, 0.000925f, 0.001059f, 0.001209f, 0.001367f, 0.001526f, 0.001686f, 0.001850f, + 0.002018f, 0.002181f, 0.002324f, 0.002440f, 0.002532f, 0.002614f, 0.002696f, 0.002779f, 0.002860f, + 0.002941f, 0.003036f, 0.003166f, 0.003347f, 0.003580f, 0.003855f, 0.004158f, 0.004487f, 0.004850f, + 0.005251f, 0.005688f, 0.006141f, 0.006591f, 0.007029f, 0.007462f, 0.007902f, 0.008351f, 0.008798f, + 0.009224f, 0.009620f, 0.009991f, 0.010352f, 0.010711f, 0.011057f, 0.011367f, 0.011621f, 0.011817f, + 0.011973f, 0.012106f, 0.012223f, 0.012309f, 0.012340f}; + +const float defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] = + {1.030501f, 1.026884f, 1.017950f, 1.008331f, 1.002600f, 1.002689f, 1.006923f, 1.011298f, 1.012169f, + 1.008564f, 1.002836f, 0.999190f, 1.001098f, 1.009190f, 1.020853f, 1.031695f, 1.037922f, 1.038190f, + 1.033894f, 1.027913f, 1.022760f, 1.019333f, 1.016935f, 1.014341f, 1.010980f, 1.007343f, 1.004372f, + 1.002476f, 1.000944f, 0.998381f, 0.993744f, 0.987300f, 0.980631f, 0.975661f, 0.973406f, 0.973314f, + 0.973708f, 0.972973f, 0.970597f, 0.967379f, 0.964640f, 0.963173f, 0.962707f, 0.962251f, 0.960983f, + 0.959006f, 0.957269f, 0.956892f, 0.958263f, 0.960779f, 0.963180f, 0.964405f, 0.964185f, 0.963091f, + 0.962007f, 0.961501f, 0.961514f, 0.961497f, 0.960845f, 0.959307f, 0.957094f, 0.954689f, 0.952548f, + 0.950838f, 0.949382f, 0.947807f, 0.945783f, 0.943211f, 0.940296f, 0.937430f, 0.934938f, 0.932866f, + 0.930925f, 0.928674f, 0.925802f, 0.922364f, 0.918772f, 0.915508f, 0.912798f, 0.910417f, 0.907879f, + 0.904771f, 0.901065f, 0.897182f, 0.893708f, 0.890989f, 0.888922f, 0.887041f, 0.884873f, 0.882294f, + 0.879602f, 0.877334f, 0.875865f, 0.875169f, 0.874822f, 0.874316f, 0.873406f, 0.872264f, 0.871377f, + 0.871228f, 0.871946f, 0.873284f, 0.874764f, 0.876044f, 0.877146f, 0.878469f, 0.880494f, 0.883471f, + 0.887228f, 0.891261f, 0.895055f, 0.898401f, 0.901497f, 0.904769f, 0.908500f, 0.912597f, 0.916577f, + 0.919848f, 0.922085f, 0.923416f, 0.924327f, 0.925296f, 0.926465f, 0.927512f, 0.927876f, 0.927108f, + 0.925203f, 0.922559f, 0.919733f, 0.917037f, 0.914341f, 0.911186f, 0.907145f, 0.902128f, 0.896510f, + 0.890876f, 0.885647f, 0.880803f, 0.875934f, 0.870521f, 0.864338f, 0.857593f, 0.850818f, 0.844491f, + 0.838728f, 0.833217f, 0.827473f, 0.821173f, 0.814417f, 0.807660f, 0.801457f, 0.796095f, 0.791458f, + 0.787181f, 0.782928f, 0.778681f, 0.774802f, 0.771808f, 0.770061f, 0.769530f, 0.769827f, 0.770454f, + 0.771132f, 0.771943f, 0.773228f, 0.775315f, 0.778206f, 0.781513f, 0.784677f, 0.787274f, 0.789288f, + 0.791065f, 0.793055f, 0.795463f, 0.798095f, 0.800470f, 0.802135f, 0.802987f, 0.803318f, 0.803610f, + 0.804182f, 0.804958f, 0.805536f, 0.805434f, 0.804413f, 0.802618f, 0.800482f, 0.798381f, 0.796424f, + 0.794397f, 0.791922f, 0.788779f, 0.785087f, 0.781262f, 0.777778f, 0.774863f, 0.772372f, 0.769886f, + 0.767005f, 0.763613f, 0.759968f, 0.756518f, 0.753595f, 0.751171f, 0.748880f, 0.746246f, 0.743010f, + 0.739317f, 0.735608f, 0.732307f, 0.729533f, 0.727006f, 0.724256f, 0.720938f, 0.717104f, 0.713138f, + 0.709525f, 0.706513f, 0.703976f, 0.701515f, 0.698771f, 0.695693f, 0.692572f, 0.689860f, 0.687867f, + 0.686574f, 0.685644f, 0.684672f, 0.683452f, 0.682093f, 0.680935f, 0.680291f, 0.680231f, 0.680501f, + 0.680700f, 0.680500f, 0.679869f, 0.679047f, 0.678394f, 0.678091f, 0.678035f, 0.677888f, 0.677314f, + 0.676218f, 0.674814f, 0.673484f, 0.672514f, 0.671917f, 0.671422f, 0.670711f, 0.669654f, 0.668436f, + 0.667417f, 0.666896f, 0.666879f, 0.667100f, 0.667225f}; + +const float defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] = + {1.030502f, 1.026883f, 1.017953f, 1.008327f, 1.002600f, 1.002691f, 1.006922f, 1.011300f, 1.012168f, + 1.008564f, 1.002837f, 0.999188f, 1.001094f, 1.009186f, 1.020854f, 1.031695f, 1.037923f, 1.038191f, + 1.033893f, 1.027913f, 1.022760f, 1.019332f, 1.016931f, 1.014338f, 1.010982f, 1.007343f, 1.004370f, + 1.002473f, 1.000948f, 0.998380f, 0.993744f, 0.987300f, 0.980628f, 0.975661f, 0.973406f, 0.973316f, + 0.973710f, 0.972971f, 0.970599f, 0.967380f, 0.964639f, 0.963173f, 0.962708f, 0.962246f, 0.960984f, + 0.959004f, 0.957270f, 0.956889f, 0.958265f, 0.960778f, 0.963180f, 0.964406f, 0.964189f, 0.963091f, + 0.962005f, 0.961500f, 0.961514f, 0.961496f, 0.960845f, 0.959306f, 0.957092f, 0.954688f, 0.952548f, + 0.950838f, 0.949380f, 0.947808f, 0.945783f, 0.943212f, 0.940298f, 0.937430f, 0.934937f, 0.932865f, + 0.930925f, 0.928674f, 0.925801f, 0.922365f, 0.918770f, 0.915509f, 0.912795f, 0.910417f, 0.907881f, + 0.904769f, 0.901065f, 0.897183f, 0.893709f, 0.890990f, 0.888922f, 0.887040f, 0.884874f, 0.882293f, + 0.879603f, 0.877335f, 0.875867f, 0.875169f, 0.874820f, 0.874318f, 0.873404f, 0.872263f, 0.871381f, + 0.871226f, 0.871950f, 0.873283f, 0.874763f, 0.876042f, 0.877147f, 0.878470f, 0.880494f, 0.883473f, + 0.887227f, 0.891261f, 0.895053f, 0.898401f, 0.901500f, 0.904769f, 0.908500f, 0.912599f, 0.916578f, + 0.919847f, 0.922084f, 0.923417f, 0.924328f, 0.925296f, 0.926463f, 0.927512f, 0.927872f, 0.927107f, + 0.925199f, 0.922559f, 0.919735f, 0.917037f, 0.914339f, 0.911186f, 0.907142f, 0.902131f, 0.896510f, + 0.890876f, 0.885644f, 0.880802f, 0.875934f, 0.870524f, 0.864337f, 0.857594f, 0.850819f, 0.844491f, + 0.838727f, 0.833219f, 0.827473f, 0.821173f, 0.814415f, 0.807662f, 0.801459f, 0.796094f, 0.791462f, + 0.787182f, 0.782926f, 0.778681f, 0.774803f, 0.771810f, 0.770061f, 0.769529f, 0.769825f, 0.770456f, + 0.771131f, 0.771940f, 0.773230f, 0.775319f, 0.778206f, 0.781513f, 0.784675f, 0.787274f, 0.789285f, + 0.791065f, 0.793054f, 0.795465f, 0.798097f, 0.800468f, 0.802133f, 0.802987f, 0.803319f, 0.803610f, + 0.804179f, 0.804959f, 0.805538f, 0.805434f, 0.804411f, 0.802621f, 0.800480f, 0.798379f, 0.796426f, + 0.794398f, 0.791920f, 0.788777f, 0.785087f, 0.781263f, 0.777777f, 0.774862f, 0.772372f, 0.769886f, + 0.767004f, 0.763614f, 0.759968f, 0.756517f, 0.753593f, 0.751172f, 0.748881f, 0.746246f, 0.743011f, + 0.739318f, 0.735608f, 0.732306f, 0.729532f, 0.727006f, 0.724254f, 0.720939f, 0.717103f, 0.713136f, + 0.709524f, 0.706514f, 0.703976f, 0.701513f, 0.698772f, 0.695692f, 0.692570f, 0.689859f, 0.687869f, + 0.686573f, 0.685642f, 0.684671f, 0.683452f, 0.682094f, 0.680934f, 0.680290f, 0.680228f, 0.680501f, + 0.680699f, 0.680498f, 0.679867f, 0.679050f, 0.678395f, 0.678093f, 0.678035f, 0.677889f, 0.677315f, + 0.676220f, 0.674814f, 0.673485f, 0.672517f, 0.671918f, 0.671424f, 0.670712f, 0.669657f, 0.668437f, + 0.667421f, 0.666896f, 0.666880f, 0.667103f, 0.667228f}; + + + +/********************** defaultHRIR reverb rom tables at sampling rate 16kHz **********************/ + +const float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {0.983044f, 0.960794f, 0.893756f, 0.783586f, 0.638963f, 0.477338f, 0.319879f, 0.183374f, 0.075909f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003842f, 0.025288f, 0.035886f, + 0.037785f, 0.035991f, 0.034784f, 0.035091f, 0.034683f, 0.030849f, 0.023146f, 0.014061f, 0.007275f, + 0.005053f, 0.006930f, 0.010589f, 0.013905f, 0.016288f, 0.018404f, 0.020849f, 0.023164f, 0.024149f, + 0.023098f, 0.020635f, 0.018325f, 0.017381f, 0.017611f, 0.017534f, 0.015650f, 0.011786f, 0.007342f, + 0.004290f, 0.003732f, 0.005148f, 0.006838f, 0.007172f, 0.005579f, 0.002632f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.001738f, 0.003011f, 0.003910f, + 0.004120f, 0.003394f, 0.001769f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, + 0.000000f, 0.002101f, 0.004247f, 0.006330f, 0.008300f, 0.010110f, 0.011735f, 0.013165f, 0.014384f, + 0.015345f, 0.015972f, 0.016191f}; + +const float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {1.118974f, 1.115256f, 1.106210f, 1.096901f, 1.092316f, 1.094422f, 1.101140f, 1.107775f, 1.110000f, + 1.106535f, 1.099921f, 1.094914f, 1.095643f, 1.103178f, 1.114955f, 1.126292f, 1.132973f, 1.133288f, + 1.128471f, 1.121439f, 1.114842f, 1.109721f, 1.105480f, 1.100966f, 1.095650f, 1.090074f, 1.085225f, + 1.081525f, 1.078267f, 1.074026f, 1.067777f, 1.059839f, 1.051856f, 1.045772f, 1.042531f, 1.041432f, + 1.040607f, 1.038291f, 1.033910f, 1.028286f, 1.022846f, 1.018514f, 1.015152f, 1.011898f, 1.008047f, + 1.003762f, 0.999992f, 0.997770f, 0.997349f, 0.997960f, 0.998259f, 0.997177f, 0.994506f, 0.990883f, + 0.987207f, 0.984003f, 0.981133f, 0.977984f, 0.973950f, 0.968837f, 0.962915f, 0.956690f, 0.950584f, + 0.944679f, 0.938744f, 0.932399f, 0.925372f, 0.917663f, 0.909568f, 0.901511f, 0.893804f, 0.886455f, + 0.879155f, 0.871463f, 0.863142f, 0.854285f, 0.845334f, 0.836740f, 0.828656f, 0.820817f, 0.812713f, + 0.803960f, 0.794564f, 0.784952f, 0.775633f, 0.766881f, 0.758539f, 0.750156f, 0.741330f, 0.732004f, + 0.722524f, 0.713387f, 0.704919f, 0.697057f, 0.689419f, 0.681576f, 0.673350f, 0.664931f, 0.656703f, + 0.648997f, 0.641801f, 0.634760f, 0.627357f, 0.619192f, 0.610186f, 0.600526f, 0.590442f, 0.579952f, + 0.568762f, 0.556384f, 0.542389f, 0.526648f, 0.509355f, 0.490884f, 0.471542f, 0.451447f, 0.430550f, + 0.408842f, 0.386537f, 0.364126f, 0.342284f, 0.321675f, 0.302809f, 0.286016f, 0.271536f, 0.259639f, + 0.250691f, 0.245099f, 0.243192f}; + +const float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = + {1.118974f, 1.115254f, 1.106207f, 1.096903f, 1.092317f, 1.094425f, 1.101145f, 1.107775f, 1.109999f, + 1.106540f, 1.099921f, 1.094912f, 1.095644f, 1.103178f, 1.114952f, 1.126292f, 1.132973f, 1.133288f, + 1.128472f, 1.121439f, 1.114842f, 1.109719f, 1.105481f, 1.100965f, 1.095650f, 1.090072f, 1.085224f, + 1.081527f, 1.078270f, 1.074025f, 1.067775f, 1.059840f, 1.051856f, 1.045772f, 1.042533f, 1.041433f, + 1.040611f, 1.038292f, 1.033911f, 1.028286f, 1.022844f, 1.018512f, 1.015153f, 1.011899f, 1.008050f, + 1.003762f, 0.999995f, 0.997769f, 0.997349f, 0.997959f, 0.998259f, 0.997178f, 0.994509f, 0.990883f, + 0.987204f, 0.984003f, 0.981133f, 0.977983f, 0.973949f, 0.968836f, 0.962914f, 0.956689f, 0.950583f, + 0.944681f, 0.938745f, 0.932399f, 0.925373f, 0.917662f, 0.909567f, 0.901511f, 0.893804f, 0.886456f, + 0.879153f, 0.871467f, 0.863138f, 0.854286f, 0.845334f, 0.836740f, 0.828656f, 0.820816f, 0.812712f, + 0.803961f, 0.794567f, 0.784951f, 0.775631f, 0.766882f, 0.758540f, 0.750158f, 0.741330f, 0.732005f, + 0.722523f, 0.713388f, 0.704920f, 0.697057f, 0.689418f, 0.681575f, 0.673352f, 0.664930f, 0.656706f, + 0.648998f, 0.641802f, 0.634762f, 0.627355f, 0.619192f, 0.610187f, 0.600527f, 0.590442f, 0.579953f, + 0.568763f, 0.556383f, 0.542389f, 0.526646f, 0.509355f, 0.490883f, 0.471543f, 0.451446f, 0.430550f, + 0.408843f, 0.386537f, 0.364127f, 0.342285f, 0.321676f, 0.302809f, 0.286016f, 0.271535f, 0.259640f, + 0.250692f, 0.245099f, 0.243192f}; + + +#else + const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { 131936432,125285536,105934832,77097344,45729324,19356880,2523696,0,0, 0,1602425,4763253,5796595,5698884,5608690,5175704,3880368,2303444, @@ -59838,70 +60089,103 @@ const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ 2790378,2355663,2029237,1865240,1832432 }; -const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = -{ - 131941936, 128955584, 119957896, 105171136, 85760160, 64067220, 42933432, 24612042, - 10188334, 0, 0, 0, 0, 0, 0, 515664, - 3394098, 4816537, 5071417, 4830630, 4668629, 4709834, 4655073, 4140482, - 3106603, 1887235, 976434, 678202, 930128, 1421231, 1866297, 2186138, - 2470143, 2798305, 3109019, 3241224, 3100161, 2769582, 2459539, 2332838, - 2363708, 2353373, 2100507, 1581890, 985426, 575794, 500900, 690952, - 917780, 962609, 748800, 353261, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31943, 233270, 404129, 524791, - 552977, 455534, 237431, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 281991, 570022, - 849598, 1114007, 1356941, 1575045, 1766976, 1930587, 2059571, 2143725, - 2173119 +const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { + 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, + 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, + 1532229,985023,437818,0,0,0,0,0,0, + 0,343865,773496,1203261,2004810,3054258,4103707,4777480,4887673, + 4998000,5066316,4966727,4867271,4767816,4765534,4763253,4760971,4569174, + 4329998,4090822,3659312,3099355,2539533,2037290,1621350,1205543,880065, + 916304,952677,988916,1233058,1477200,1721342,1912602,2090441,2268413, + 2427327,2573490,2719788,2859643,2989834,3120025,3219078,3193576,3168075, + 3142574,2987686,2832665,2677778,2583691,2504771,2425851,2397128,2401692, + 2406255,2356594,2225464,2094333,1933137,1651280,1369423,1087566,924357, + 761148,597940,625051,699677,774302,854295,937779,1021128,1026631, + 915230,803830,670014,446676,223338,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,5100,30735, + 56371,81872,173140,264408,355542,419698,477144,534455,552037, + 543044,533918,485599,378494,271254,173946,115964,57982,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0, + 0,0,671,1476,2415,99723,261321,423054,646795, + 963549,1280302,1632087,2124129,2616037,3108080,3841982,4575885,5309922, + 6280181,7309766,8339216,8750996,8750996 }; - -const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = -{ - 9386634, 9355445, 9279562, 9201473, 9163011, 9180677, 9237032, 9292690, - 9311355, 9282288, 9226806, 9184804, 9190920, 9254128, 9352920, 9448022, - 9504066, 9506709, 9466301, 9407312, 9351973, 9309014, 9273438, 9235572, - 9190978, 9144203, 9103527, 9072489, 9045159, 9009583, 8957163, 8890574, - 8823608, 8772571, 8745384, 8736165, 8729244, 8709816, 8673066, 8625888, - 8580254, 8543915, 8515712, 8488416, 8456111, 8420166, 8388541, 8369901, - 8366370, 8371495, 8374003, 8364927, 8342521, 8312129, 8281292, 8254415, - 8230340, 8203924, 8170085, 8127194, 8077516, 8025297, 7974076, 7924542, - 7874755, 7821529, 7762583, 7697915, 7630009, 7562422, 7497771, 7436123, - 7374886, 7310361, 7240560, 7166262, 7091175, 7019084, 6951270, 6885512, - 6817531, 6744105, 6665286, 6584654, 6506481, 6433064, 6363086, 6292764, - 6218727, 6140494, 6060970, 5984324, 5913289, 5847338, 5783265, 5717474, - 5648469, 5577845, 5508824, 5444181, 5383817, 5324753, 5262652, 5194159, - 5118611, 5037577, 4952986, 4864990, 4771121, 4667287, 4549888, 4417843, - 4272779, 4117833, 3955581, 3787012, 3611715, 3429615, 3242507, 3054510, - 2871286, 2698405, 2540146, 2399276, 2277809, 2178009, 2102948, 2056039, - 2040042 +const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 9335246,9335246,9316514,9269680,9222847,9180350,9155201,9130044,9104894, + 9126688,9148473,9170267,9191549,9212688,9233844,9234423,9221295,9208167, + 9191205,9168497,9145789,9127997,9129884,9131780,9133676,9164823,9195978, + 9227125,9267550,9310290,9353038,9385225,9410374,9435531,9445170,9431538, + 9417907,9399855,9364128,9328409,9292682,9270670,9248667,9226655,9215783, + 9207688,9199593,9183605,9162356,9141108,9116244,9085961,9055678,9028608, + 9014432,9000255,8986078,8975962,8965845,8955728,8926108,8891606,8857103, + 8819145,8778896,8738639,8710806,8701604,8692401,8686227,8692209,8698190, + 8704171,8686706,8669232,8651767,8623917,8593466,8563024,8543554,8531399, + 8519252,8509748,8504203,8498667,8489716,8467083,8444459,8421835,8399773, + 8377711,8355649,8351698,8352268,8352847,8355833,8360430,8365027,8363484, + 8352721,8341959,8331028,8319460,8307884,8296308,8292063,8287827,8283582, + 8271142,8256647,8242159,8221389,8196442,8171494,8150547,8135607,8120659, + 8106465,8095225,8083992,8072760,8043073,8013394,7983706,7949422,7913997, + 7878564,7853893,7836394,7818904,7801472,7784141,7766811,7744782,7703972, + 7663169,7622359,7580802,7539253,7497696,7474266,7455367,7436467,7415496, + 7393140,7370784,7338471,7291235,7244007,7197551,7154232,7110914,7067595, + 7046615,7025627,7004647,6977485,6948779,6920073,6878751,6829015,6779278, + 6733644,6694184,6654724,6618804,6597044,6575284,6553524,6518183,6482842, + 6447501,6401632,6353137,6304634,6267229,6237215,6207201,6181045,6160677, + 6140310,6115580,6073427,6031275,5989122,5942817,5896503,5850198,5825150, + 5805428,5785707,5765742,5745626,5725510,5693398,5643285,5593180,5544358, + 5500720,5457091,5413454,5404126,5394797,5385469,5366930,5346085,5325239, + 5282164,5224274,5166376,5115566,5075376,5035186,5002731,5001238,4999736, + 4998243,4969436,4940630,4911823,4847290,4773822,4700355,4646282,4605153, + 4564023,4540250,4542523,4544788,4536869,4488241,4439612,4390983,4285488, + 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, + 4073222,4038317,3957300,3691818,3426335,3160861,2774481,2388110,2001740, + 1708239,1437966,1167685,1059581,1059581 }; - -const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = -{ - 9386634, 9355429, 9279537, 9201489, 9163019, 9180702, 9237074, 9292690, - 9311346, 9282330, 9226806, 9184788, 9190928, 9254128, 9352895, 9448022, - 9504066, 9506709, 9466309, 9407312, 9351973, 9308998, 9273447, 9235564, - 9190978, 9144187, 9103519, 9072506, 9045184, 9009575, 8957146, 8890582, - 8823608, 8772571, 8745401, 8736173, 8729278, 8709825, 8673074, 8625888, - 8580237, 8543898, 8515721, 8488424, 8456136, 8420166, 8388566, 8369893, - 8366370, 8371487, 8374003, 8364935, 8342546, 8312129, 8281267, 8254415, - 8230340, 8203916, 8170076, 8127185, 8077508, 8025289, 7974068, 7924558, - 7874764, 7821529, 7762591, 7697907, 7630001, 7562422, 7497771, 7436132, - 7374870, 7310395, 7240526, 7166270, 7091175, 7019084, 6951270, 6885503, - 6817522, 6744113, 6665311, 6584646, 6506464, 6433072, 6363094, 6292781, - 6218727, 6140503, 6060962, 5984332, 5913297, 5847338, 5783257, 5717465, - 5648486, 5577837, 5508849, 5444190, 5383825, 5324769, 5262635, 5194159, - 5118619, 5037585, 4952986, 4864998, 4771130, 4667279, 4549888, 4417827, - 4272779, 4117825, 3955589, 3787003, 3611715, 3429623, 3242507, 3054518, - 2871294, 2698413, 2540146, 2399276, 2277800, 2178018, 2102957, 2056039, - 2040042 +const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { + 9335246,9335246,9316514,9269689,9222855,9180358,9155201,9130035,9104869, + 9126663,9148465,9170258,9191540,9212688,9233827,9234415,9221295,9208175, + 9191213,9168488,9145755,9127963,9129867,9131772,9133676,9164831,9195978, + 9227133,9267550,9310281,9353021,9385200,9410357,9435506,9445153,9431522, + 9417899,9399855,9364119,9328384,9292648,9270653,9248658,9226663,9215792, + 9207688,9199593,9183596,9162348,9141100,9116236,9085953,9055678,9028617, + 9014432,9000255,8986070,8975962,8965853,8955745,8926116,8891614,8857103, + 8819145,8778888,8738631,8710789,8701587,8692385,8686219,8692200,8698181, + 8704162,8686697,8669232,8651775,8623917,8593466,8563016,8543546,8531390, + 8519244,8509739,8504203,8498675,8489724,8467100,8444468,8421844,8399773, + 8377703,8355641,8351681,8352252,8352830,8355817,8360414,8365019,8363475, + 8352721,8341959,8331037,8319469,8307893,8296316,8292072,8287835,8283591, + 8271142,8256647,8242151,8221381,8196433,8171494,8150547,8135616,8120676, + 8106482,8095250,8084009,8072777,8043081,8013385,7983698,7949405,7913972, + 7878547,7853876,7836386,7818904,7801481,7784150,7766819,7744790,7703980, + 7663161,7622350,7580793,7539244,7497696,7474258,7455358,7436459,7415487, + 7393132,7370776,7338471,7291244,7244016,7197560,7154241,7110914,7067587, + 7046607,7025627,7004647,6977485,6948770,6920064,6878742,6829006,6779270, + 6733644,6694184,6654724,6618813,6597053,6575301,6553549,6518191,6482842, + 6447492,6401623,6353137,6304643,6267229,6237215,6207201,6181037,6160677, + 6140310,6115580,6073427,6031275,5989122,5942817,5896512,5850207,5825167, + 5805445,5785723,5765750,5745626,5725493,5693382,5643276,5593180,5544375, + 5500729,5457074,5413429,5404109,5394789,5385478,5366939,5346093,5325247, + 5282172,5224282,5166384,5115574,5075384,5035195,5002739,5001238,4999736, + 4998243,4969436,4940630,4911823,4847290,4773814,4700338,4646274,4605153, + 4564023,4540258,4542523,4544788,4536878,4488249,4439612,4390983,4285480, + 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, + 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, + 1708239,1437966,1167685,1059573,1059573 }; #endif +#endif + Word32 sine_table_Q31 [361] = { 187, diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 31f75e876..8648cfa73 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -810,6 +810,16 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->average_energy_r = hHrtfStatistics->average_energy_r_dyn; hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; +#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_l_dyn, Q28, lr_iac_len ); + + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_r_dyn, Q28, lr_iac_len ); + + fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); + floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->inter_aural_coherence_dyn, Q26, lr_iac_len ); +#else fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_l_dyn, Q23, lr_iac_len ); @@ -818,7 +828,7 @@ static ivas_error load_reverb_from_binary( fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->inter_aural_coherence_dyn, Q23, lr_iac_len ); - +#endif hHrtfStatistics->fromROM = FALSE; #else /* left/right energy and interaural coherence for late reverb */ -- GitLab From 70100607fc5d002d937ce5f8d940c01d8dc17cee Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 26 Jun 2025 21:39:42 +0530 Subject: [PATCH 1065/1310] Fix for stv crashes --- lib_enc/nois_est_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/nois_est_fx.c b/lib_enc/nois_est_fx.c index 9a4829121..7fb58941b 100644 --- a/lib_enc/nois_est_fx.c +++ b/lib_enc/nois_est_fx.c @@ -2776,11 +2776,11 @@ void noise_est_ivas_fx( move16(); IF( hNoiseEst->bckr_fx[i] != 0 ) { - diff = 0; + diff = 1; move16(); IF( GT_16( hNoiseEst->q_bckr, 30 ) ) { - diff = sub( hNoiseEst->q_bckr, 30 ); + diff = add( diff, sub( hNoiseEst->q_bckr, 30 ) ); } Ltmp1 = L_add( L_shr( hNoiseEst->bckr_fx[i], diff ), L_shl( 1, sub( hNoiseEst->q_bckr, diff ) ) ); // hNoiseEst->q_bckr - diff e_ener = norm_l( Ltmp1 ); -- GitLab From 2b64e7a6a9362d7b2f65461181ac1356ff7a5d72 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 15:50:12 +0200 Subject: [PATCH 1066/1310] replace ahr_ro ba shr_r_sat --- lib_com/options.h | 1 + lib_com/tools_fx.c | 8 ++++++++ lib_enc/find_uv_fx.c | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4badd652f..4fcc4a03e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -100,5 +100,6 @@ #define FIX_1762_COMPILER_ISSUE /* FhG: fix compiler issues with W_mac_32_32() + ONE_IN_Q30 */ #define ISSUE_1751_replace_shl_ro /*FhG: replace shl_ro by overflow-free alternatives*/ +#define ISSUE_1770_replace_shr_ro /* FhG: replace by non-overflow-alternative - BE */ #endif diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index a83dfb56b..3d5b13938 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -3144,7 +3144,11 @@ void add_vec_fx( { FOR( i = 0; i < N; i++ ) { +#ifdef ISSUE_1770_replace_shr_ro + y[i] = add_o( x1[i], shr_r_sat( x2[i], Qyx2 ), &Overflow ); +#else y[i] = add_o( x1[i], shr_ro( x2[i], Qyx2, &Overflow ), &Overflow ); +#endif move16(); } } @@ -3152,7 +3156,11 @@ void add_vec_fx( { FOR( i = 0; i < N; i++ ) { +#ifdef ISSUE_1770_replace_shr_ro + y[i] = add_o( shr_r_sat( x1[i], Qyx1 ), shr_ro( x2[i], Qyx2, &Overflow ), &Overflow ); +#else y[i] = add_o( shr_ro( x1[i], Qyx1, &Overflow ), shr_ro( x2[i], Qyx2, &Overflow ), &Overflow ); +#endif move16(); } } diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index 61de9ca7d..462b7580d 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -32,9 +32,11 @@ static Word16 find_ener_decrease_fx( /* o : maximum Word16 wtmp0, wtmp1; Word32 maxEnr, minEnr; Word16 dE2, exp0, exp1; +#ifndef ISSUE_1770_replace_shr_ro #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); +#endif #endif dE2 = 0; @@ -76,7 +78,11 @@ static Word16 find_ener_decrease_fx( /* o : maximum exp1 = sub( norm_l( maxEnr ), 1 ); wtmp1 = extract_h( L_shl( maxEnr, exp1 ) ); wtmp1 = div_s( wtmp1, wtmp0 ); +#ifdef ISSUE_1770_replace_shr_ro + dE2 = shr_r_Sat( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ) ); /*Q10*/ +#else dE2 = shr_ro( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ), &Overflow ); /*Q10*/ +#endif return dE2; } -- GitLab From 54a3b922b83f90b4a37c29f8a4b6e6d0c13603c5 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Wed, 25 Jun 2025 15:54:22 +0200 Subject: [PATCH 1067/1310] replace shr_ro ba shr_r_sat oe more + buildfix --- lib_com/tools_fx.c | 2 +- lib_enc/find_uv_fx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/tools_fx.c b/lib_com/tools_fx.c index 3d5b13938..b2974696a 100644 --- a/lib_com/tools_fx.c +++ b/lib_com/tools_fx.c @@ -3157,7 +3157,7 @@ void add_vec_fx( FOR( i = 0; i < N; i++ ) { #ifdef ISSUE_1770_replace_shr_ro - y[i] = add_o( shr_r_sat( x1[i], Qyx1 ), shr_ro( x2[i], Qyx2, &Overflow ), &Overflow ); + y[i] = add_o( shr_r_sat( x1[i], Qyx1 ), shr_r_sat( x2[i], Qyx2 ), &Overflow ); #else y[i] = add_o( shr_ro( x1[i], Qyx1, &Overflow ), shr_ro( x2[i], Qyx2, &Overflow ), &Overflow ); #endif diff --git a/lib_enc/find_uv_fx.c b/lib_enc/find_uv_fx.c index 462b7580d..9dcd8386b 100644 --- a/lib_enc/find_uv_fx.c +++ b/lib_enc/find_uv_fx.c @@ -79,7 +79,7 @@ static Word16 find_ener_decrease_fx( /* o : maximum wtmp1 = extract_h( L_shl( maxEnr, exp1 ) ); wtmp1 = div_s( wtmp1, wtmp0 ); #ifdef ISSUE_1770_replace_shr_ro - dE2 = shr_r_Sat( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ) ); /*Q10*/ + dE2 = shr_r_sat( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ) ); /*Q10*/ #else dE2 = shr_ro( wtmp1, add( sub( exp1, exp0 ), 15 - 10 ), &Overflow ); /*Q10*/ #endif -- GitLab From 6c4e581f0537b22f07d8857cb50808450775a079 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 27 Jun 2025 10:55:19 +0530 Subject: [PATCH 1068/1310] Fix for ASAN error in decoder --- lib_dec/ivas_jbm_dec_fx.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index e1ac2c1ff..008093a89 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1037,7 +1037,18 @@ ivas_error ivas_jbm_dec_tc_fx( move16(); nchan_out = nchan_transport; move16(); - Word16 Q_p_output = s_max( 3, sub( L_norm_arr( p_output_fx[sba_ch_idx], imult1616( output_frame, nchan_transport ) ), 1 ) ); + Word16 Q_p_output; + Word16 min_norm = 31; + move16(); + + FOR( ch = 0; ch < nchan_transport; ++ch ) + { + Word16 norm = L_norm_arr( p_output_fx[sba_ch_idx + ch], output_frame ); // Normalize per channel + min_norm = s_min( norm, min_norm ); + } + + Q_p_output = s_max( 3, sub( min_norm, 1 ) ); + Q_p_output = s_min( Q_p_output, 19 ); // to restrict Q-factor of p_ouptut to Q30 FOR( ch = 0; ch < nchan_transport; ch++ ) { -- GitLab From 1175563c9537990c3f2458509ec13f3d6cbb59e8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 27 Jun 2025 14:25:22 +0530 Subject: [PATCH 1069/1310] Fix for 3GPP issue 1749: Use of divide1616 and idivide1616 with constant denominator Link #1749 --- lib_com/cnst.h | 8 +++++++- lib_com/ivas_cnst.h | 7 +++++++ lib_com/ivas_transient_det_fx.c | 6 ++++-- lib_dec/ivas_dirac_dec_fx.c | 2 +- lib_dec/ivas_masa_dec_fx.c | 2 +- lib_dec/ivas_spar_md_dec_fx.c | 2 +- lib_dec/swb_tbe_dec_fx.c | 8 ++++---- lib_dec/tonalMDCTconcealment_fx.c | 15 +++++++++++---- lib_enc/ext_sig_ana_fx.c | 6 +++++- lib_enc/inov_enc_fx.c | 2 +- lib_enc/ivas_dirac_enc_fx.c | 2 +- lib_enc/ivas_init_enc_fx.c | 2 +- lib_enc/ivas_ism_metadata_enc_fx.c | 5 +++-- lib_enc/ivas_masa_enc_fx.c | 2 +- lib_enc/ivas_mc_paramupmix_enc_fx.c | 2 +- lib_enc/ivas_mcmasa_enc_fx.c | 4 ++-- lib_enc/ivas_mct_enc_fx.c | 18 +++++++++--------- lib_enc/ivas_omasa_enc_fx.c | 2 +- lib_enc/ivas_qmetadata_enc_fx.c | 4 ++-- lib_enc/ivas_spar_encoder_fx.c | 2 +- lib_enc/ivas_spar_md_enc_fx.c | 8 +++++--- lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 4 ++-- lib_rend/ivas_mcmasa_ana_fx.c | 2 +- 23 files changed, 72 insertions(+), 43 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 6030b53bd..792df3946 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -226,6 +226,7 @@ enum{ #define ONE_BY_L_FRAME32k_Q31 3355443 #define ONE_BY_L_FRAME25_6k_Q31 4194304 #define ONE_BY_L_FRAME16k_Q31 6710886 +#define ONE_BY_L_FRAME16k_Q15 102 #define ONE_BY_L_FRAME_Q31 8388608 #define ONE_BY_240_Q31 8947849 #define ONE_BY_L_FRAME8k_Q31 13421772 @@ -680,6 +681,7 @@ enum #define NUM_DCT_LENGTH 24 #define NB_DIV 2 /* number of division (subframes) per 20ms frame */ +#define NB_DIV_LOG2 1 /* To be used for shift operation instead of division */ #define L_MDCT_HALF_OVLP_MAX L_MDCT_OVLP_MAX - 48000 / 200 /* Size of HALF overlap window slope @ 48 kHz */ #define L_MDCT_MIN_OVLP_MAX 60 /* Size of the MDCT minimal overlap @ 48 kHz - 1.25ms */ #define L_MDCT_TRANS_OVLP_MAX NS2SA( 48000, ACELP_TCX_TRANS_NS ) /* Size of the ACELP->MDCT transition overlap - 1.25ms */ @@ -708,6 +710,7 @@ enum #define L_FRAME 256 /* frame size at 12.8kHz */ #define NB_SUBFR 4 /* number of subframes per frame */ #define L_SUBFR ( L_FRAME / NB_SUBFR ) /* subframe size */ +#define L_SUBFR_LOG2 6 /* To be used for shift operation instead of division */ #define L_SUBFR_Q6 ((L_FRAME/NB_SUBFR)*64) /* subframe size */ #define L_SUBFR_Q16 ((L_FRAME/NB_SUBFR)*65536) /* subframe size */ @@ -788,6 +791,7 @@ enum #endif #define CLDFB_NO_CHANNELS_MAX_FX 30720 /*Q9*/ #define CLDFB_NO_COL_MAX 16 /* CLDFB resampling - max number of CLDFB col., == IVAS_CLDFB_NO_COL_MAX */ +#define CLDFB_NO_COL_MAX_LOG2 4 /* To be used for shift operation instead of division */ #define CLDFB_NO_COL_MAX_SWITCH 6 /* CLDFB resampling - max number of CLDFB col. for switching */ #define CLDFB_NO_COL_MAX_SWITCH_BFI 10 /* CLDFB resampling - max number of CLDFB col. for switching, BFI */ #define CLDFB_OVRLP_MIN_SLOTS 3 /* CLDFB resampling - minimize processing to minimum required for transition frame ACELP->TCX/HQ */ @@ -1533,6 +1537,7 @@ enum #define INTERP_3_2_MEM_LEN 15 #define L_SHB_LAHEAD 20 /* Size of lookahead for SHB */ #define NUM_SHB_SUBFR 16 +#define NUM_SHB_SUBFR_LOG2 4 /* To be used for shift operation instead of division */ #define LPC_SHB_ORDER 10 #define LPC_WHTN_ORDER 4 /* Order of whitening filter for SHB excitation */ #define SHB_OVERLAP_LEN ( L_FRAME16k - L_SHB_LAHEAD ) / ( NUM_SHB_SUBFR - 1 ) @@ -3092,7 +3097,8 @@ extern const Word16 Idx2Freq_Tbl[]; #define FS_32K_IN_NS_Q31 68719 #define FS_16K_IN_NS_Q31 34360 -#define ONE_BY_THREE_Q15 10923 /* 1/3.f in Q15 */ +#define ONE_BY_THREE_Q15 10923 /* 1/3.f in Q15 */ +#define ONE_BY_TEN_Q15 3277 /* 1/10.f in Q15 */ #define THREE_Q21 6291456 #define SIX_Q21 12582912 diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index d3e52ec16..18816a94a 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -166,6 +166,7 @@ typedef enum #define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ #define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ +#define CPE_CHANNELS_LOG2 1 /* To be used for the shift operation instead of division */ #define FOA_CHANNELS 4 /* number of FOA channels */ #define HOA2_CHANNELS 9 #define HOA3_CHANNELS 16 @@ -198,6 +199,7 @@ typedef enum #define MAX_JBM_SUBFRAMES_5MS 8 #define DEFAULT_JBM_SUBFRAMES_5MS 4 #define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 +#define JBM_CLDFB_SLOTS_IN_SUBFRAME_LOG2 2 /* To be used for shift operation instead of division */ #define MAX_JBM_CLDFB_TIMESLOTS 32 #define DEFAULT_JBM_CLDFB_TIMESLOTS 16 #define MAX_JBM_L_FRAME48k 1920 @@ -934,12 +936,14 @@ typedef enum { #define MDFT_FB_BANDS_240 240 #define CLDFB_TO_MDFT_FAC 4 #define MDFT_NO_COL_MAX 4 +#define MDFT_NO_COL_MAX_LOG2 2 /* To be used for shift operation instead of division */ /*----------------------------------------------------------------------------------* * General Parametric Coding Constants *----------------------------------------------------------------------------------*/ #define MAX_PARAM_SPATIAL_SUBFRAMES 4 /* Maximum number of subframes for parameteric spatial coding */ +#define MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 2 /* To be used for shift operation instead of division */ #define L_SPATIAL_SUBFR_48k (L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES) #define CLDFB_SLOTS_PER_SUBFRAME ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) /* Number of CLDFB slots per subframe */ @@ -970,6 +974,7 @@ typedef enum { #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ #define DIRAC_LOW_BANDRES_STEP 2 /* always combine two bands for low band resolution in the DirAC parameter coding */ #define DIRAC_NO_COL_AVG_DIFF 32 /* Number of slots for averaging intensity vector for diffuseness computation */ +#define DIRAC_NO_COL_AVG_DIFF_LOG2 5 /* To be used for shift operation instead of division */ #define DIRAC_DIFFUSE_LEVELS 8 /* Size of the diffuseness alphabet (constant value) */ #define INV_DIRAC_DIFFUSE_LEVELS_Q13 1170 /* 1/(DIRAC_DIFFUSE_LEVELS - 1) in Q13 */ #define DIRAC_DITH_SEED 29680 @@ -1687,6 +1692,7 @@ typedef enum #define DEG_180_IN_Q22 ( 180 << Q22 ) // Q22 #define DEG_90_IN_Q22 ( 90 << Q22 ) // Q22 #define ONE_BY_360_Q31 ( 5965232 ) // Q31 +#define ONE_BY_360_Q15 ( 91 ) // Q15 #define ONE_BY_180_Q31 ( 11930465 ) // Q31 /* ----- Enums - TD Renderer ----- */ @@ -1860,6 +1866,7 @@ typedef enum #define SPAR_DIRAC_SPLIT_START_BAND 8 #define DIRAC_TO_SPAR_HBR_PRED_CHS (FOA_CHANNELS - 1) #define SPAR_DTX_BANDS 2 +#define SPAR_DTX_BANDS_LOG2 1 /* To be used for shift operation instead of division */ #define DIRAC_DTX_BANDS 2 #define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS ) #define CLDFB_PAR_WEIGHT_START_BAND 7 diff --git a/lib_com/ivas_transient_det_fx.c b/lib_com/ivas_transient_det_fx.c index fb8679ebc..cc1b1771b 100644 --- a/lib_com/ivas_transient_det_fx.c +++ b/lib_com/ivas_transient_det_fx.c @@ -292,7 +292,7 @@ void ivas_transient_det_process_fx( ) { Word32 in_duck_gain[L_FRAME48k]; - Word16 num_sf, sf, sf_samp, idx; + Word16 num_sf, sf, sf_samp, idx, num_sf_log2; Word32 mem = hTranDet->in_duck_gain; /*Q30*/ move32(); @@ -309,7 +309,9 @@ void ivas_transient_det_process_fx( num_sf = 16; /*Q0*/ move16(); - sf_samp = idiv1616( frame_len, num_sf ); /*Q0*/ + num_sf_log2 = 4; /* To be used for shift operation instead of division */ + move16(); + sf_samp = shr( frame_len, num_sf_log2 ); /*Q0*/ FOR( sf = 1; sf <= num_sf; sf++ ) { idx = sub( imult1616( sf_samp, sf ), 1 ); diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 48fce8b95..ba7741712 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -3102,7 +3102,7 @@ void ivas_dirac_dec_render_sf_fx( } ELSE { - hDirACRend->index_buffer_intensity = add( sub( hDirACRend->index_buffer_intensity, i_mult( idiv1616( hDirACRend->index_buffer_intensity, DIRAC_NO_COL_AVG_DIFF ), DIRAC_NO_COL_AVG_DIFF ) ), 1 ); /* averaging_length = 32 */ + hDirACRend->index_buffer_intensity = add( sub( hDirACRend->index_buffer_intensity, i_mult( shr( hDirACRend->index_buffer_intensity, DIRAC_NO_COL_AVG_DIFF_LOG2 ), DIRAC_NO_COL_AVG_DIFF ) ), 1 ); /* averaging_length = 32 */ move16(); } diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index e61e51262..457c040c3 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -2042,7 +2042,7 @@ void ivas_spar_param_to_masa_param_mapping_fx( } ELSE { - sf = idiv1616( hSpar->render_to_md_map[slot_idx + slot_idx_start], JBM_CLDFB_SLOTS_IN_SUBFRAME ); + sf = shr( hSpar->render_to_md_map[slot_idx + slot_idx_start], JBM_CLDFB_SLOTS_IN_SUBFRAME_LOG2 ); } IF( LT_16( sf, SPAR_META_DELAY_SUBFRAMES ) ) diff --git a/lib_dec/ivas_spar_md_dec_fx.c b/lib_dec/ivas_spar_md_dec_fx.c index 36b77732a..ad1fb4c3a 100644 --- a/lib_dec/ivas_spar_md_dec_fx.c +++ b/lib_dec/ivas_spar_md_dec_fx.c @@ -1715,7 +1715,7 @@ static void ivas_spar_dec_parse_md_bs_fx( { *nB = SPAR_DTX_BANDS; move16(); - *bands_bw = idiv1616( num_bands, *nB ); /*Q0*/ + *bands_bw = shr( num_bands, SPAR_DTX_BANDS_LOG2 ); /*Q0*/ move16(); FOR( i = 0; i < *nB; i++ ) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 679e206e0..06da2a83d 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -4269,7 +4269,7 @@ void ivas_dequantizeSHBparams_fx_9_1( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } Q_subgain[i] = Q_subgain[idx]; move16(); @@ -4597,7 +4597,7 @@ static void dequantizeSHBparams_fx_9_1( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } Q_subgain[i] = Q_subgain[idx]; move16(); @@ -6644,7 +6644,7 @@ void ivas_swb_tbe_dec_fx( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } GainShape_fx[i] = GainShape_tmp_fx[idx]; move16(); @@ -6688,7 +6688,7 @@ void ivas_swb_tbe_dec_fx( move16(); IF( i != 0 ) { - idx = idiv1616( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR ); + idx = shr( i_mult( i, NUM_SHB_SUBGAINS ), NUM_SHB_SUBFR_LOG2 ); } GainShape_fx[i] = GainShape_fx[idx]; move16(); diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index fd6cf7835..f61fe276e 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -2886,7 +2886,7 @@ void TonalMdctConceal_create_concealment_noise_ivas_fx( HANDLE_FD_CNG_COM hFdCngCom; Word16 *rnd_c, *rnd; Word16 crossOverFreq, i, save_rnd_c, max_noise_line; - Word16 c, c_inv, inc; + Word16 c, c_inv, inc, inc_log2; Word32 noise_shape_buffer[L_FRAME48k]; Word16 noise_shape_buffer_e[L_FRAME48k]; Word16 start_idx, stop_idx, noise_shape_buffer_common_exp = MIN16B_FLT_FX, last_scf_e, temp_e; @@ -2994,14 +2994,21 @@ void TonalMdctConceal_create_concealment_noise_ivas_fx( IF( GT_16( st->core, TCX_20_CORE ) ) { inc = 2; + inc_log2 = 1; + move16(); + move16(); + start_idx = shr( hFdCngCom->startBand, inc_log2 ); + stop_idx = shr( hFdCngCom->stopFFTbin, inc_log2 ); } ELSE { inc = 1; + start_idx = hFdCngCom->startBand; + stop_idx = hFdCngCom->stopFFTbin; + move16(); + move16(); + move16(); } - move16(); - start_idx = idiv1616( hFdCngCom->startBand, inc ); - stop_idx = idiv1616( hFdCngCom->stopFFTbin, inc ); FOR( i = 0; i < start_idx; i++ ) { diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index 49d757be3..87fa6a451 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -1031,7 +1031,11 @@ void core_signal_analysis_high_bitrate_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { Word16 scale; - L_subframe = idiv1616( L_frameTCX, nSubframes ); /* Q0 */ + L_subframe = L_frameTCX; /* Q0 */ /* L_subframe = idiv1616( L_frameTCX, nSubframes ); */ + IF( EQ_16( nSubframes, 2 ) ) + { + L_subframe = shr( L_frameTCX, 1 ); + } test(); IF( EQ_16( transform_type[frameno], TCX_20 ) && NE_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index 01ba794ea..216ca3860 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -597,7 +597,7 @@ Word16 inov_encode_ivas_fx( IF( i_subfr != 0 ) { idx = idiv1616( i_subfr, L_subfr ); - idx2 = idiv1616( i_subfr, L_SUBFR ); + idx2 = shr( i_subfr, L_SUBFR_LOG2 ); } IF( LT_16( st_fx->acelp_cfg.fixed_cdk_index[idx], ACELP_FIXED_CDK_NB ) ) diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c index be15b5048..3aa010d42 100644 --- a/lib_enc/ivas_dirac_enc_fx.c +++ b/lib_enc/ivas_dirac_enc_fx.c @@ -998,7 +998,7 @@ void ivas_dirac_param_est_enc_fx( diffuseness_vector_q = 0; move16(); - l_ts = idiv1616( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); /* Q0 */ + l_ts = shr( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 ); /* Q0 */ IF( useLowerRes ) { q_direction->cfg.nblocks = 1; diff --git a/lib_enc/ivas_init_enc_fx.c b/lib_enc/ivas_init_enc_fx.c index 2285acc0c..ddbea7b40 100644 --- a/lib_enc/ivas_init_enc_fx.c +++ b/lib_enc/ivas_init_enc_fx.c @@ -874,7 +874,7 @@ ivas_error ivas_init_encoder_fx( { st_ivas->nSCE = 0; move16(); - st_ivas->nCPE = idiv1616( hEncoderConfig->nchan_inp, CPE_CHANNELS ); /* Q0 */ + st_ivas->nCPE = shr( hEncoderConfig->nchan_inp, CPE_CHANNELS_LOG2 ); /* Q0 */ move16(); FOR( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) diff --git a/lib_enc/ivas_ism_metadata_enc_fx.c b/lib_enc/ivas_ism_metadata_enc_fx.c index 594871b29..d7751aa4d 100644 --- a/lib_enc/ivas_ism_metadata_enc_fx.c +++ b/lib_enc/ivas_ism_metadata_enc_fx.c @@ -48,7 +48,8 @@ * Local constants *-----------------------------------------------------------------------*/ -#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */ +#define ISM_NUM_PARAM 5 /* number of coded metadata parameters */ +#define ONE_BY_ISM_NUM_PARAM_Q15 6554 /* To be used for shift operation instead of division */ #define ISM_MAX_AZIMUTH_DIFF_IDX ( ISM_AZIMUTH_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) @@ -613,7 +614,7 @@ ivas_error ivas_ism_metadata_enc_fx( pos_zero = add( pos_zero, 1 ); } - ch = idiv1616( abs_next, ISM_NUM_PARAM ); + ch = mult( abs_next, ONE_BY_ISM_NUM_PARAM_Q15 ); IF( abs_next % ISM_NUM_PARAM == 0 ) { diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index fb86dee7a..35c57c42b 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -786,7 +786,7 @@ void ivas_masa_estimate_energy_fx( move16(); Word16 q_buf; maxBin = extract_l( Mpy_32_32( 134217728 /*CLDFB_NO_CHANNELS_MAX / L_FRAME48k in Q31*/, input_frame ) ); - l_ts = idiv1616( input_frame, CLDFB_NO_COL_MAX ); + l_ts = shr( input_frame, CLDFB_NO_COL_MAX_LOG2 ); FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { diff --git a/lib_enc/ivas_mc_paramupmix_enc_fx.c b/lib_enc/ivas_mc_paramupmix_enc_fx.c index cad29b146..c1f735704 100644 --- a/lib_enc/ivas_mc_paramupmix_enc_fx.c +++ b/lib_enc/ivas_mc_paramupmix_enc_fx.c @@ -855,7 +855,7 @@ static ivas_error ivas_mc_paramupmix_param_est_enc_fx( } // l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; - l_ts = idiv1616( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); + l_ts = shr( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 ); move16(); Word16 gb = find_guarded_bits_fx( l_ts ); diff --git a/lib_enc/ivas_mcmasa_enc_fx.c b/lib_enc/ivas_mcmasa_enc_fx.c index ab86efb8d..7d261d4e4 100644 --- a/lib_enc/ivas_mcmasa_enc_fx.c +++ b/lib_enc/ivas_mcmasa_enc_fx.c @@ -957,10 +957,10 @@ void ivas_mcmasa_param_est_enc_fx( set_zero_fx( Chnl_ImagBuffer_fx[i], DIRAC_NO_FB_BANDS_MAX ); } - num_freq_bins = idiv1616( input_frame, MDFT_NO_COL_MAX ); + num_freq_bins = shr( input_frame, MDFT_NO_COL_MAX_LOG2 ); num_freq_bands = hMcMasa->nbands; move16(); - l_ts = idiv1616( input_frame, MDFT_NO_COL_MAX ); + l_ts = shr( input_frame, MDFT_NO_COL_MAX_LOG2 ); set16_fx( q_vdv, 31, MASA_FREQUENCY_BANDS ); set16_fx( out_exp, 30, MASA_FREQUENCY_BANDS ); diff --git a/lib_enc/ivas_mct_enc_fx.c b/lib_enc/ivas_mct_enc_fx.c index ee9353379..23a70ef97 100644 --- a/lib_enc/ivas_mct_enc_fx.c +++ b/lib_enc/ivas_mct_enc_fx.c @@ -287,11 +287,11 @@ ivas_error ivas_mct_enc_fx( Word16 length, ch, nCPE; IF( ( hMCT->nchan_out_woLFE % 2 ) == 0 ) { - nCPE = idiv1616( hMCT->nchan_out_woLFE, 2 ); + nCPE = shr( hMCT->nchan_out_woLFE, 1 ); } ELSE { - nCPE = add( idiv1616( hMCT->nchan_out_woLFE, 2 ), 1 ); + nCPE = add( shr( hMCT->nchan_out_woLFE, 1 ), 1 ); } FOR( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) @@ -313,12 +313,12 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); // st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX / NB_DIV + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); // st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX / NB_DIV } IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) { - length = add( length, idiv1616( length, 4 ) ); + length = add( length, shr( length, 2 ) ); } IF( hMCT->p_orig_spectrum_long_fx[cpe_id][ch] ) { @@ -359,11 +359,11 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); } IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) { - length = add( length, idiv1616( length, 4 ) ); + length = add( length, shr( length, 2 ) ); } Word16 norm = L_norm_arr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_fx, N_MAX ); q_spec = s_min( q_spec, add( sub( 31, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_e ), norm ) ); @@ -391,7 +391,7 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); } scale_sig32( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_fx, N_MAX, sub( q_spec, sub( 31, st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_e ) ) ); // q_spec @@ -404,7 +404,7 @@ ivas_error ivas_mct_enc_fx( IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) { - length = add( length, idiv1616( length, 4 ) ); + length = add( length, shr( length, 2 ) ); } FOR( Word16 k = 0; k <= ( ( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ ) @@ -433,7 +433,7 @@ ivas_error ivas_mct_enc_fx( } ELSE { - length = idiv1616( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV ); + length = shr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->L_frameTCX, NB_DIV_LOG2 ); } Word16 e_spec = sub( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_e[0], L_norm_arr( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->hTcxEnc->spectrum_long_fx, N_MAX ) ); IF( st_ivas->hCPE[cpe_id]->hCoreCoder[ch]->last_core == ACELP_CORE ) diff --git a/lib_enc/ivas_omasa_enc_fx.c b/lib_enc/ivas_omasa_enc_fx.c index 1d14eecc9..e09a1fb36 100644 --- a/lib_enc/ivas_omasa_enc_fx.c +++ b/lib_enc/ivas_omasa_enc_fx.c @@ -1046,7 +1046,7 @@ static void ivas_omasa_param_est_enc_fx( dir_v_e = MIN_16; num_freq_bins = hOMasa->cldfbAnaEnc[0]->no_channels; num_freq_bands = hOMasa->nbands; - l_ts = idiv1616( input_frame, CLDFB_NO_COL_MAX ); + l_ts = shr( input_frame, CLDFB_NO_COL_MAX_LOG2 ); move16(); move16(); move16(); diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index 15adcee9c..68695120e 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -370,7 +370,7 @@ ivas_error ivas_qmetadata_enc_encode_fx( { no_TF = add( imult1616( hQMetaData->q_direction[0].cfg.nbands, hQMetaData->q_direction[0].cfg.nblocks ), imult1616( hQMetaData->q_direction[1].cfg.nbands, hQMetaData->q_direction[1].cfg.nblocks ) ); test(); - IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), idiv1616( imult1616( 43, no_TF ), 10 ) ), sum16_fx( bits_diff, ndirections ) ), MASA_MIN_BITS_SURR_COH ) ) + IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), mult( imult1616( 43, no_TF ), ONE_BY_TEN_Q15 ) ), sum16_fx( bits_diff, ndirections ) ), MASA_MIN_BITS_SURR_COH ) ) { bits_surround_coh = encode_surround_coherence_fx( hQMetaData, hMetaData ); } @@ -396,7 +396,7 @@ ivas_error ivas_qmetadata_enc_encode_fx( { no_TF = imult1616( hQMetaData->q_direction[0].cfg.nbands, hQMetaData->q_direction[0].cfg.nblocks ); test(); - IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), idiv1616( imult1616( 43, no_TF ), 10 ) ), bits_diff[0] ), MASA_MIN_BITS_SURR_COH ) ) + IF( EQ_16( all_coherence_zero, 0 ) && GE_16( sub( sub( sub( hQMetaData->metadata_max_bits, bits_no_dirs_coh ), mult( imult1616( 43, no_TF ), ONE_BY_TEN_Q15 ) ), bits_diff[0] ), MASA_MIN_BITS_SURR_COH ) ) { bits_surround_coh = encode_surround_coherence_fx( hQMetaData, hMetaData ); } diff --git a/lib_enc/ivas_spar_encoder_fx.c b/lib_enc/ivas_spar_encoder_fx.c index 3b380f2eb..8143a8c33 100644 --- a/lib_enc/ivas_spar_encoder_fx.c +++ b/lib_enc/ivas_spar_encoder_fx.c @@ -788,7 +788,7 @@ static ivas_error ivas_spar_enc_process_fx( shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) ); } - l_ts = idiv1616( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES ); + l_ts = shr( input_frame, MAX_PARAM_SPATIAL_SUBFRAMES_LOG2 ); Word16 gb = find_guarded_bits_fx( l_ts ); FOR( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index a293b870a..28a0dc9a4 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -479,7 +479,7 @@ ivas_error ivas_spar_md_enc_process_fx( Word32 pred_coeffs_re_local_fx[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; Word16 k, bwidth, num_bands, num_bands_full, num_bands_bw; Word16 active_w, nchan_transport, dmx_switch, strat; - Word16 nB, bands_bw, packed_ok = 0; + Word16 nB, bands_bw, bands_bw_log2, packed_ok = 0; move16(); ivas_strats_t cs[MAX_CODING_STRATS]; Word16 code_strat; @@ -585,7 +585,7 @@ ivas_error ivas_spar_md_enc_process_fx( { nB = SPAR_DTX_BANDS; move16(); - bands_bw = idiv1616( num_bands, nB ); + bands_bw = shr( num_bands, SPAR_DTX_BANDS_LOG2 ); ivas_band_mixer_fx( cov_real_fx, cov_real_q, num_ch, &num_bands, bands_bw ); } @@ -593,7 +593,9 @@ ivas_error ivas_spar_md_enc_process_fx( { bands_bw = 2; move16(); - nB = idiv1616( num_bands, bands_bw ); + bands_bw_log2 = 1; + move16(); + nB = shr( num_bands, bands_bw_log2 ); ivas_band_mixer_fx( cov_real_fx, cov_real_q, num_ch, &num_bands, bands_bw ); } diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index 19823d7c6..a0fa343a2 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -3100,7 +3100,7 @@ static void ivas_dirac_dec_get_response_split_order_fx( } ELSE { - tmp = idiv1616( add( azimuth, 180 ), 360 ); + tmp = mult( add( azimuth, 180 ), ONE_BY_360_Q15 ); /* idiv1616( add( azimuth, 180 ), 360 ) */ } index_azimuth = sub( add( azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (azimuth + 180) % 360 index_elevation = add( elevation, 90 ); @@ -3226,7 +3226,7 @@ static void ivas_dirac_dec_get_response_split_order_fx( } ELSE { - tmp = idiv1616( add( index_azimuth, 180 ), 360 ); + tmp = mult( add( index_azimuth, 180 ), ONE_BY_360_Q15 ); } index_azimuth = sub( add( index_azimuth, 180 ), i_mult( tmp, 360 ) ); // index_azimuth = (index_azimuth + 180) % 360 diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index b2b4039f3..a0d6beb26 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -575,7 +575,7 @@ void ivas_mcmasa_param_est_ana_fx( move16(); num_freq_bands = hMcMasa->nbands; move16(); - l_ts = idiv1616( input_frame, CLDFB_NO_COL_MAX ); + l_ts = shr( input_frame, CLDFB_NO_COL_MAX_LOG2 ); numAnalysisChannels = sub( nchan_inp, 1 ); set16_fx( q_vdv, 31, MASA_FREQUENCY_BANDS ); -- GitLab From c69147d53447df41898e6119d90aca451fa1e761 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 27 Jun 2025 14:31:02 +0530 Subject: [PATCH 1070/1310] Clang formatting changes --- lib_com/ivas_transient_det_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_transient_det_fx.c b/lib_com/ivas_transient_det_fx.c index cc1b1771b..39dee9314 100644 --- a/lib_com/ivas_transient_det_fx.c +++ b/lib_com/ivas_transient_det_fx.c @@ -309,7 +309,7 @@ void ivas_transient_det_process_fx( num_sf = 16; /*Q0*/ move16(); - num_sf_log2 = 4; /* To be used for shift operation instead of division */ + num_sf_log2 = 4; /* To be used for shift operation instead of division */ move16(); sf_samp = shr( frame_len, num_sf_log2 ); /*Q0*/ FOR( sf = 1; sf <= num_sf; sf++ ) -- GitLab From 8bc8bd6059f086ef1cdd517f6da5d69e1252968e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 27 Jun 2025 15:16:53 +0530 Subject: [PATCH 1071/1310] Fix for 3GPP issue 1724: Renderer MASA output metadata difference - 2 Link #1724 --- lib_rend/ivas_dirac_ana_fx.c | 23 ++++++++++++----------- lib_rend/ivas_masa_merge_fx.c | 24 ++++++++++++++++-------- lib_rend/ivas_mcmasa_ana_fx.c | 8 ++++---- lib_rend/ivas_omasa_ana_fx.c | 8 ++++---- lib_rend/ivas_prot_rend_fx.h | 7 ++++--- lib_rend/lib_rend_fx.c | 20 ++++++++++---------- 6 files changed, 50 insertions(+), 40 deletions(-) diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index e170afdc6..fcea6a6eb 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -43,7 +43,7 @@ /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ -static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, Word32 data_f[][L_FRAME48k], Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const Word16 input_frame ); +static void ivas_dirac_param_est_ana_fx( DIRAC_ANA_HANDLE hDirAC, Word32 data_f[][L_FRAME48k], Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const Word16 input_frame, const Word16 data_q ); static void ivas_dirac_dmx_fx( Word32 data_in_fx[][L_FRAME48k], const Word16 input_frame, const Word16 nchan_transport ); @@ -247,8 +247,8 @@ void ivas_dirac_ana_fx( DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ Word32 data_fx[][L_FRAME48k], /* i/o: Input / transport audio signals, Q7 */ const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport /* i : Number of transport channels */ -) + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 data_q ) { Word32 elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word32 azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -256,7 +256,7 @@ void ivas_dirac_ana_fx( Word32 spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; Word32 surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /* Estimate MASA parameters from the SBA signals */ - ivas_dirac_param_est_ana_fx( hDirAC, data_fx, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); + ivas_dirac_param_est_ana_fx( hDirAC, data_fx, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, data_q ); /* Create MASA metadata buffer from the estimated values */ ivas_create_masa_out_meta_fx( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, Q31, Q31, Q31 ); @@ -281,7 +281,8 @@ static void ivas_dirac_param_est_ana_fx( Word32 energyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Q30 */ Word32 spreadCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ Word32 surroundingCoherence_fx[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* Qx */ - const Word16 input_frame ) + const Word16 input_frame, + const Word16 data_q ) { Word32 reference_power_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; Word16 ts, i, d, j; @@ -356,23 +357,23 @@ static void ivas_dirac_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; - inp_q = Q7; // Input Q of data_fx + inp_q = data_q; // Input Q of data_fx move16(); move16(); move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - inp_q = Q7; + inp_q = data_q; move16(); cldfbAnalysis_ts_fx_var_q( &( data_fx[i][l_ts * ts] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); - cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); - ci_q = s_min( ci_q, getScaleFactor32( Foa_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], l_ts ) ); + ci_q = s_min( ci_q, getScaleFactor32( Foa_ImagBuffer_fx[i], l_ts ) ); } sf = sub( s_min( cr_q, ci_q ), 4 ); FOR( i = 0; i < numAnalysisChannels; i++ ) { - scale_sig32( Foa_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf - scale_sig32( Foa_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf + scale_sig32( Foa_RealBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf + scale_sig32( Foa_ImagBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); c_e = sub( 31, inp_q ); diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index e0dd57afb..892927d37 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -192,12 +192,17 @@ void diffuse_meta_merge_1x1_fx( tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( total_nrg_fx, EPSILON_FX ), &scale ); L_tmp1 = L_deposit_h( tmp ); /* Q( 31 - ( scale + total_nrg_e - total_diff_nrg_e ) ) */ scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); - if ( L_tmp1 == 0 ) + IF( L_tmp1 == 0 ) { - scale = 30; + scale = 31; move16(); + L_tmp2 = 1; + move32(); + } + ELSE + { + L_tmp2 = BASOP_Util_Add_Mant32Exp( ONE_IN_Q31, 0, L_negate( L_tmp1 ), scale, &scale ); } - L_tmp2 = L_sub( L_shl( 1, scale ), L_tmp1 ); L_tmp1 = BASOP_Util_Add_Mant32Exp( dir_ratio_ism_fx, dir_ratio_ism_e, L_tmp2, scale, &tmp ); L_tmp1 = L_shr( L_tmp1, 1 ); @@ -220,13 +225,16 @@ void diffuse_meta_merge_1x1_fx( tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( EPSILON_FX, total_nrg_fx ), &scale ); scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); - dir_nrg_ratio_fx = L_sub( L_shl_sat( 1, sub( 31, scale ) ), L_deposit_h( tmp ) ); + Word32 temp32 = L_shr( L_deposit_h( tmp ), sub( sub( 31, scale ), Q30 ) ); // Q30 + scale = 1; + move16(); + dir_nrg_ratio_fx = L_sub( ONE_IN_Q30, temp32 ); dir_nrg_ratio_e = scale; move16(); - new_dir_ratio_fx = dir_nrg_ratio_fx; + new_dir_ratio_fx = dir_ratio_ism_fx; move32(); - new_dir_ratio_e = dir_nrg_ratio_e; + new_dir_ratio_e = dir_ratio_ism_e; move16(); tmp = BASOP_Util_Cmp_Mant32Exp( dir_nrg_ratio_fx, dir_nrg_ratio_e, dir_ratio_ism_fx, dir_ratio_ism_e ); IF( tmp <= 0 ) @@ -237,7 +245,7 @@ void diffuse_meta_merge_1x1_fx( move16(); } - outMeta->directToTotalRatio[0][sf][band] = (UWord8) imult1616( extract_l( L_shr( new_dir_ratio_fx, sub( 31, new_dir_ratio_e ) ) ), UINT8_MAX ); + outMeta->directToTotalRatio[0][sf][band] = (UWord8) extract_l( L_shr( new_dir_ratio_fx, sub( sub( 31, new_dir_ratio_e ), 8 ) ) ); move16(); IF( GT_16( sub( 31, new_dir_ratio_e ), Q30 ) ) { @@ -250,7 +258,7 @@ void diffuse_meta_merge_1x1_fx( { new_diff_ratio_fx = L_sub( L_shl( 1, sub( 31, new_dir_ratio_e ) ), new_dir_ratio_fx ); /* Q(31 - new_dir_ratiio_e) */ } - outMeta->diffuseToTotalRatio[sf][band] = (UWord8) imult1616( extract_l( L_shr( new_diff_ratio_fx, sub( 31, new_dir_ratio_e ) ) ), UINT8_MAX ); + outMeta->diffuseToTotalRatio[sf][band] = (UWord8) extract_l( L_shr( new_diff_ratio_fx, sub( sub( 31, new_dir_ratio_e ), 8 ) ) ); move16(); } ELSE diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index a0d6beb26..3cb2c4fcf 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -635,14 +635,14 @@ void ivas_mcmasa_param_est_ana_fx( inp_q = q_data; move16(); cldfbAnalysis_ts_fx_var_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); - cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); - ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], l_ts ) ); + ci_q = s_min( ci_q, getScaleFactor32( Chnl_RealBuffer_fx[i], l_ts ) ); } sf = sub( s_min( cr_q, ci_q ), 4 ); FOR( i = 0; i < numAnalysisChannels; i++ ) { - scale_sig32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf - scale_sig32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_RealBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_ImagBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); c_e = sub( 31, inp_q ); diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index 1ef2805b5..c9ed32d26 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -451,14 +451,14 @@ static void ivas_omasa_param_est_ana_fx( inp_q = data_f_q; cldfbAnalysis_ts_fx_var_q( &( data_f_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &inp_q ); - cr_q = s_min( cr_q, L_norm_arr( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); - ci_q = s_min( ci_q, L_norm_arr( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ); + cr_q = s_min( cr_q, L_norm_arr( Chnl_ImagBuffer_fx[i], l_ts ) ); + ci_q = s_min( ci_q, L_norm_arr( Chnl_RealBuffer_fx[i], l_ts ) ); } sf = sub( s_min( cr_q, ci_q ), 4 ); FOR( i = 0; i < nchan_ism; i++ ) { - scale_sig32( Chnl_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf - scale_sig32( Chnl_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_RealBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf + scale_sig32( Chnl_ImagBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); c_e = sub( 31, inp_q ); diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 8772b542e..7c5c02c71 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -1464,10 +1464,11 @@ ivas_error ivas_dirac_ana_open_fx( void ivas_dirac_ana_fx( DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ - Word32 data_in_fx[][L_FRAME48k], /* i/o: Input / transport audio signals, Q7 */ + Word32 data_in_fx[][L_FRAME48k], /* i/o: Input / transport audio signals */ const Word16 input_frame, /* i : Input frame size */ - const Word16 nchan_transport /* i : Number of transport channels */ -); + const Word16 nchan_transport, /* i : Number of transport channels */ + const Word16 data_q /*i : Q of data_in_fx*/ + ); void ivas_dirac_ana_close_fx( DIRAC_ANA_HANDLE ( *hDirAC ) /* i/o: analysis DIRAC handle */ diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 957aaee0d..78c6acf4d 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -5656,7 +5656,7 @@ static ivas_error renderActiveInputsIsm( Word16 i; input_ism *pCurrentInput; ivas_error error; - Word16 input_q = Q8; + Word16 input_q = outAudio.q_factor; move16(); FOR( ( i = 0, pCurrentInput = hIvasRend->inputsIsm ); i < RENDERER_MAX_ISM_INPUTS; ( ++i, ++pCurrentInput ) ) { @@ -5666,7 +5666,7 @@ static ivas_error renderActiveInputsIsm( CONTINUE; } - *outAudio.pq_fact = Q8; + *outAudio.pq_fact = input_q; move16(); IF( NE_32( ( error = renderInputIsm( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { @@ -6240,7 +6240,7 @@ static ivas_error renderActiveInputsMc( CONTINUE; } - *outAudio.pq_fact = Q8; + *outAudio.pq_fact = outAudio.q_factor; move16(); IF( NE_32( ( error = renderInputMc( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { @@ -6501,7 +6501,7 @@ static void renderSbaToMasa( push_wmops( "renderMcToMasa" ); copyBufferTo2dArray_fx( sbaInput->base.inputBuffer, tmpRendBuffer ); - ivas_dirac_ana_fx( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels ); + ivas_dirac_ana_fx( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, *outAudio.pq_fact ); accumulate2dArrayToBuffer_fx( tmpRendBuffer, &outAudio ); pop_wmops(); @@ -6580,7 +6580,7 @@ static ivas_error renderActiveInputsSba( /* Skip inactive inputs */ CONTINUE; } - *outAudio.pq_fact = Q8; + *outAudio.pq_fact = outAudio.q_factor; move16(); IF( NE_32( ( error = renderInputSba( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) { @@ -6700,10 +6700,10 @@ static void renderMasaToMasa( move16(); move16(); cldfbAnalysis_ts_fx_fixed_q( &( tmpBuffer_fx[i][l_ts * ts] ), Chan_RealBuffer_fx[i], Chan_ImagBuffer_fx[i], l_ts, masaInput->hMasaPrerend->cldfbAnaEnc[i], &q_cldfb_out ); - scale_factor = s_min( scale_factor, s_min( getScaleFactor32( Chan_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ), getScaleFactor32( Chan_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX ) ) ); + scale_factor = s_min( scale_factor, s_min( getScaleFactor32( Chan_RealBuffer_fx[i], l_ts ), getScaleFactor32( Chan_ImagBuffer_fx[i], l_ts ) ) ); scale_factor = sub( scale_factor, 1 ); - scale_sig32( Chan_RealBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ - scale_sig32( Chan_ImagBuffer_fx[i], CLDFB_NO_CHANNELS_MAX, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ + scale_sig32( Chan_RealBuffer_fx[i], l_ts, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ + scale_sig32( Chan_ImagBuffer_fx[i], l_ts, scale_factor ); /* Q(q_cldfb_out + scale_factor) */ scale_fac_arr[i] = scale_factor; move16(); } @@ -6719,7 +6719,7 @@ static void renderMasaToMasa( { IF( NE_16( scale_factor, scale_fac_arr[i] ) ) { - FOR( j = 0; j < CLDFB_NO_CHANNELS_MAX; j++ ) + FOR( j = 0; j < l_ts; j++ ) { Chan_RealBuffer_fx[i][j] = L_shr( Chan_RealBuffer_fx[i][j], sub( scale_fac_arr[i], scale_factor ) ); /* Q(q_cldfb_out+scale_factor) */ move32(); @@ -6976,7 +6976,7 @@ static ivas_error renderActiveInputsMasa( CONTINUE; } - *outAudio.pq_fact = Q8; + *outAudio.pq_fact = outAudio.q_factor; move16(); IF( NE_32( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ), IVAS_ERR_OK ) ) -- GitLab From 407b6c41d6fb55d5bd64e924f0c070eba6815209 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Fri, 27 Jun 2025 16:59:25 +0200 Subject: [PATCH 1072/1310] Updated Q-format fixed-point representation for RT60 reverberation times (Q31 -> Q27) --- .../3.31.5/CompilerIdC/CMakeCCompilerId.c | 904 ++++++++++++++++++ lib_com/options.h | 1 + .../ivas_dirac_dec_binaural_functions_fx.c | 4 + lib_rend/ivas_reverb_fx.c | 30 + lib_rend/ivas_rom_binauralRenderer.h | 8 + lib_rend/ivas_rom_binauralRenderer_fx.c | 29 + lib_rend/ivas_stat_rend.h | 12 + lib_util/hrtf_file_reader.c | 8 + 8 files changed, 996 insertions(+) create mode 100644 build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c diff --git a/build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c b/build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 000000000..8d8bb038b --- /dev/null +++ b/build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/lib_com/options.h b/lib_com/options.h index 8b1f827bb..f262bea81 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,6 +122,7 @@ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ +#define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q27 format instead of Q31 */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index a1d3a4908..0b9e3750a 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -503,7 +503,11 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs_fx( Copy( hrtfShCoeffsIm_fx[i][j], hrtfParambin->hrtfShCoeffsIm_fx[i][j], HRTF_NUM_BINS ); /*Q14*/ } } +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q27*/ +#else Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ +#endif Copy32( parametricReverberationEneCorrections_fx, hrtfParambin->parametricReverberationEneCorrections_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ Copy32( parametricEarlyPartEneCorrection_fx, hrtfParambin->parametricEarlyPartEneCorrection_fx, CLDFB_NO_CHANNELS_MAX ); /*Q28*/ *hHrtfParambin = hrtfParambin; diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 4e054b699..8fbe82abf 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -219,7 +219,11 @@ static void ivas_binaural_reverb_setPreDelay_fx( static void ivas_binaural_reverb_setReverbTimes_fx( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const Word32 output_Fs, /* i : sampling_rate */ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + const Word32 *revTimes_fx, /*Q27 i : reverberation times T60 for each CLDFB bin in seconds */ +#else const Word32 *revTimes_fx, /*Q31 i : reverberation times T60 for each CLDFB bin in seconds */ +#endif const Word32 *revEnes_fx /*Q31 i : spectrum for reverberated sound at each CLDFB bin */ ) { @@ -324,7 +328,11 @@ static void ivas_binaural_reverb_setReverbTimes_fx( /* Determine attenuation factor that generates the appropriate energy decay according to reverberation time */ L_tmp = Mpy_32_32( 1677721600, revTimes_fx[bin] ); // e10 --> 800 * 2^21, + e0 tmp = BASOP_Util_Divide3232_Scale( 1073741824, L_tmp, &scale ); +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + scale = add( scale, sub( 1, 14 ) ); // revTimes_fx in Q27 +#else scale = add( scale, sub( 1, 10 ) ); +#endif L_tmp = Mpy_32_16_1( -1610612736, tmp ); // * -3 scale = add( 2, scale ); L_tmp = Mpy_32_32( 1783446563, L_tmp ); // scale + 2 @@ -2386,7 +2394,11 @@ static ivas_error ivas_binaural_reverb_open_fx( const Word16 numBins, /* i : Q0 number of CLDFB bins */ const Word16 numCldfbSlotsPerFrame, /* i : Q0 number of CLDFB slots per frame */ const Word32 sampling_rate, /* i : Q0 sampling rate */ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + const Word32 *revTimes_fx, /* i : Q27 reverberation times T60 for each CLDFB bin in seconds */ +#else const Word32 *revTimes_fx, /* i : Q31 reverberation times T60 for each CLDFB bin in seconds */ +#endif const Word32 *revEnes_fx, /* i : Q31 spectrum for reverberated sound at each CLDFB bin */ const Word16 preDelay /* i : Q0 reverb pre-delay in CLDFB slots */ ) @@ -2446,9 +2458,15 @@ static ivas_error ivas_binaural_reverb_open_fx( * but not excessively long loops to generate reverberation. */ /* Note: the resulted length is very sensitive to the precision of the constants below (e.g. 1.45 vs. 1.45f) */ // hReverb->loopBufLength[bin] = (int16_t) ( 1.45 * (int16_t) ( revTimes[bin] * 150.0 ) + 1 ); +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 19 ), 19 ); + L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q18 ); + hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 18 ); /*Q0*/ +#else Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 23 ), 23 ); L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q22 ); hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 22 ); /*Q0*/ +#endif move16(); hReverb->loopBufLength[bin] = s_min( hReverb->loopBufLength[bin], hReverb->loopBufLengthMax[bin] ); @@ -2541,7 +2559,11 @@ ivas_error ivas_binaural_reverb_init( } preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + floatToFixed_arrL( t60_temp, t60, Q27, CLDFB_NO_CHANNELS_MAX ); +#else floatToFixed_arrL( t60_temp, t60, Q31, CLDFB_NO_CHANNELS_MAX ); +#endif floatToFixed_arrL( ene_temp, ene, Q31, CLDFB_NO_CHANNELS_MAX ); } else @@ -2601,7 +2623,11 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( } ELSE { +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q27*/ +#else revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ +#endif revEne = hHrtfFastConv->fastconvReverberationEneCorrections_fx; /*Q31*/ preDelay = 10; move16(); @@ -2646,7 +2672,11 @@ ivas_error ivas_binaural_reverb_open_parambin( } ELSE { +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q27*/ +#else revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q31*/ +#endif revEne = hHrtfParambin->parametricReverberationEneCorrections_fx; /*Q31*/ preDelay = 10; move16(); diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 4b1428ac8..39dd9556d 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -72,12 +72,20 @@ extern Word32 rightBRIRReal_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NT extern Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; /* Q29 */ /* Reverberation parameters based on BRIRs for fastconv */ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT +extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +#else extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +#endif extern Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ /* Binaural rendering data set based on BRIRs, to be used in a combined manner * with the above binaural rendering data set based on HRIRs for parametric * renderer */ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT +extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +#else extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +#endif extern const Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ extern const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ diff --git a/lib_rend/ivas_rom_binauralRenderer_fx.c b/lib_rend/ivas_rom_binauralRenderer_fx.c index e7dbbae70..dbec56202 100644 --- a/lib_rend/ivas_rom_binauralRenderer_fx.c +++ b/lib_rend/ivas_rom_binauralRenderer_fx.c @@ -47155,10 +47155,25 @@ const Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTA }, }; + +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT +const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q27 */ = +{ + 57606384, 27529398, 27157346, 27968692, 28945932, 31748532, 30950340, 30655330, + 30530104, 29387776, 30344346, 29622122, 29729360, 29993770, 30025176, 30475880, + 30588086, 29940082, 29527900, 29337714, 29583868, 29293020, 28621930, 28230418, + 27839038, 26675774, 26340230, 26161316, 25546062, 24763170, 24203886, 23644734, + 23689428, 23834786, 24640094, 26295534, 27279754, 27973256, 28812118, 29527900, + 29919414, 30926046, 31397284, 31359570, 31720078, 31867046, 32430896, 32362310, + 32057502, 32532230, 33056752, 33010582, 33030982, 32936494, 32742548, 32765634, + 32114276, 32410092, 31517544, 33962452 +}; +#else const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= { 921702144, 440470368, 434517536, 447499072, 463134912, 507976512, 495205440, 490485280, 488481664, 470204416, 485509536, 473953952, 475669760, 479900320, 480402816, 487614080, 489409376, 479041312, 472446400, 469403424, 473341888, 468688320, 457950880, 451686688, 445424608, 426812384, 421443680, 418581056, 408736992, 396210720, 387262176, 378315744, 379030848, 381356576, 394241504, 420728544, 436476064, 447572096, 460993888, 472446400, 478710624, 494816736, 502356544, 501753120, 507521248, 509872736, 518894336, 517796960, 512920032, 520515680, 528908032, 528169312, 528495712, 526983904, 523880768, 524250144, 513828416, 518561472, 504280704, 543399232 }; +#endif const Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= @@ -47167,6 +47182,19 @@ const Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] /* Q }; +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT +const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q27 */ = +{ + 46371420, 42876392, 44689268, 48442264, 50237560, 49764848, 48133832, 46721592, + 46051312, 44473180, 42480180, 40933052, 39574768, 38594172, 37570228, 36275964, + 35439116, 34413964, 33540876, 32486058, 31551098, 30822698, 30028532, 29366168, + 28534554, 27875546, 27122986, 26587726, 26025756, 24952150, 24518492, 24422258, + 24130736, 24035844, 23695066, 23129472, 22965056, 22542002, 22545088, 22710848, + 22459994, 22270210, 21953322, 21683948, 21260760, 21025342, 20850858, 20613158, + 20344186, 20127694, 19891604, 19655650, 19419694, 19183740, 18947786, 18711830, + 18475742, 18239786, 18003832, 17767878 +}; +#else const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= { 741942720,686022272,715028288,775076224,803800960,796237568,770141312,747545472,736820992, @@ -47177,6 +47205,7 @@ const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= 336405472,333613728,329810528,325506976,322043104,318265664,314490400,310715104,306939840, 303164576,299389280,295611872,291836576,288061312,284286048 }; +#endif const Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index fd1945a3f..945421179 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -610,7 +610,11 @@ typedef struct ivas_hrtfs_parambin_struct Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +#else Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +#endif Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ @@ -1454,7 +1458,11 @@ typedef struct ivas_hrtfs_fastconv_struct Word16 allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +#else Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +#endif Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ } HRTFS_FASTCONV, *HRTFS_FASTCONV_HANDLE; @@ -1465,7 +1473,11 @@ typedef struct ivas_hrtfs_parambin_struct Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +#else Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +#endif Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 8648cfa73..b4f54ea40 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1880,7 +1880,11 @@ static ivas_error create_fastconv_HRTF_from_rawdata( memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q27, CLDFB_NO_CHANNELS_MAX ); +#else floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); +#endif memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationEneCorrections_fx, Q31, CLDFB_NO_CHANNELS_MAX ); @@ -2044,7 +2048,11 @@ static ivas_error create_parambin_HRTF_from_rawdata( memcpy( f_tmp_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); /*adding conversion as file reading is done in float*/ +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricReverberationTimes_fx, Q27, CLDFB_NO_CHANNELS_MAX ); +#else floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); +#endif memcpy( f_tmp_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); -- GitLab From bcf32b297b796bc03b3de49f28c13ec4c970f5b0 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Fri, 27 Jun 2025 17:10:57 +0200 Subject: [PATCH 1073/1310] Minor update --- .../3.31.5/CompilerIdC/CMakeCCompilerId.c | 904 ------------------ 1 file changed, 904 deletions(-) delete mode 100644 build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c diff --git a/build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c b/build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index 8d8bb038b..000000000 --- a/build/CMakeFiles/3.31.5/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,904 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - -#if !defined(__has_include) -/* If the compiler does not have __has_include, pretend the answer is - always no. */ -# define __has_include(x) 0 -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, - except that a few beta releases use the old format with V=2021. */ -# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) - /* The third version component from --version is an update index, - but no macro is provided for it. */ -# define COMPILER_VERSION_PATCH DEC(0) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) -# define COMPILER_ID "IntelLLVM" -#if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -#endif -#if defined(__GNUC__) -# define SIMULATE_ID "GNU" -#endif -/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and - * later. Look for 6 digit vs. 8 digit version number to decide encoding. - * VVVV is no smaller than the current year when a version is released. - */ -#if __INTEL_LLVM_COMPILER < 1000000L -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) -#else -# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) -# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) -#endif -#if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -#endif -#if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -#elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -#endif -#if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -#endif -#if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -#endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__open_xl__) && defined(__clang__) -# define COMPILER_ID "IBMClang" -# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) -# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) -# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) - - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__NVCOMPILER) -# define COMPILER_ID "NVHPC" -# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) -# if defined(__NVCOMPILER_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) -# endif - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(__clang__) && defined(__cray__) -# define COMPILER_ID "CrayClang" -# define COMPILER_VERSION_MAJOR DEC(__cray_major__) -# define COMPILER_VERSION_MINOR DEC(__cray_minor__) -# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__CLANG_FUJITSU) -# define COMPILER_ID "FujitsuClang" -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# define COMPILER_VERSION_INTERNAL_STR __clang_version__ - - -#elif defined(__FUJITSU) -# define COMPILER_ID "Fujitsu" -# if defined(__FCC_version__) -# define COMPILER_VERSION __FCC_version__ -# elif defined(__FCC_major__) -# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) -# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) -# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) -# endif -# if defined(__fcc_version) -# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) -# elif defined(__FCC_VERSION) -# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) -# endif - - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TASKING__) -# define COMPILER_ID "Tasking" - # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) - # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) -# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) - -#elif defined(__ORANGEC__) -# define COMPILER_ID "OrangeC" -# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) -# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) && defined(__ti__) -# define COMPILER_ID "TIClang" - # define COMPILER_VERSION_MAJOR DEC(__ti_major__) - # define COMPILER_VERSION_MINOR DEC(__ti_minor__) - # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) -# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) -# define COMPILER_ID "LCC" -# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) -# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) -# if defined(__LCC_MINOR__) -# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) -# endif -# if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define SIMULATE_ID "GNU" -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(_ADI_COMPILER) -# define COMPILER_ID "ADSP" -#if defined(__VERSIONNUM__) - /* __VERSIONNUM__ = 0xVVRRPPTT */ -# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) -# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) -# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) -# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__MSYS__) -# define PLATFORM_ID "MSYS" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# elif defined(__VXWORKS__) -# define PLATFORM_ID "VxWorks" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -# elif defined(_ADI_COMPILER) -# define PLATFORM_ID "ADSP" - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_ARM64EC) -# define ARCHITECTURE_ID "ARM64EC" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__ICCSTM8__) -# define ARCHITECTURE_ID "STM8" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__clang__) && defined(__ti__) -# if defined(__ARM_ARCH) -# define ARCHITECTURE_ID "Arm" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__TI_COMPILER_VERSION__) -# if defined(__TI_ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__MSP430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__TMS320C28XX__) -# define ARCHITECTURE_ID "TMS320C28x" - -# elif defined(__TMS320C6X__) || defined(_TMS320C6X) -# define ARCHITECTURE_ID "TMS320C6x" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -# elif defined(__ADSPSHARC__) -# define ARCHITECTURE_ID "SHARC" - -# elif defined(__ADSPBLACKFIN__) -# define ARCHITECTURE_ID "Blackfin" - -#elif defined(__TASKING__) - -# if defined(__CTC__) || defined(__CPTC__) -# define ARCHITECTURE_ID "TriCore" - -# elif defined(__CMCS__) -# define ARCHITECTURE_ID "MCS" - -# elif defined(__CARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__CARC__) -# define ARCHITECTURE_ID "ARC" - -# elif defined(__C51__) -# define ARCHITECTURE_ID "8051" - -# elif defined(__CPCP__) -# define ARCHITECTURE_ID "PCP" - -# else -# define ARCHITECTURE_ID "" -# endif - -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number. */ -#ifdef COMPILER_VERSION -char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; - -/* Construct a string literal encoding the version number components. */ -#elif defined(COMPILER_VERSION_MAJOR) -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#elif defined(COMPILER_VERSION_INTERNAL_STR) -char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - -#define C_STD_99 199901L -#define C_STD_11 201112L -#define C_STD_17 201710L -#define C_STD_23 202311L - -#ifdef __STDC_VERSION__ -# define C_STD __STDC_VERSION__ -#endif - -#if !defined(__STDC__) && !defined(__clang__) -# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) -# define C_VERSION "90" -# else -# define C_VERSION -# endif -#elif C_STD > C_STD_17 -# define C_VERSION "23" -#elif C_STD > C_STD_11 -# define C_VERSION "17" -#elif C_STD > C_STD_99 -# define C_VERSION "11" -#elif C_STD >= C_STD_99 -# define C_VERSION "99" -#else -# define C_VERSION "90" -#endif -const char* info_language_standard_default = - "INFO" ":" "standard_default[" C_VERSION "]"; - -const char* info_language_extensions_default = "INFO" ":" "extensions_default[" -#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ - defined(__TI_COMPILER_VERSION__)) && \ - !defined(__STRICT_ANSI__) - "ON" -#else - "OFF" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) - require += info_cray[argc]; -#endif - require += info_language_standard_default[argc]; - require += info_language_extensions_default[argc]; - (void)argv; - return require; -} -#endif -- GitLab From 1fadc6836f9ea3f09f617cdd5b262c71485080f3 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Fri, 27 Jun 2025 17:20:46 +0200 Subject: [PATCH 1074/1310] To make clang happy --- .../ivas_dirac_dec_binaural_functions_fx.c | 4 ++-- lib_rend/ivas_reverb_fx.c | 18 +++++++++--------- lib_rend/ivas_rom_binauralRenderer.h | 8 ++++---- lib_rend/ivas_stat_rend.h | 12 ++++++------ 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 0b9e3750a..dbbe3ebd7 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -504,9 +504,9 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs_fx( } } #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q27*/ + Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q27*/ #else - Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ + Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ #endif Copy32( parametricReverberationEneCorrections_fx, hrtfParambin->parametricReverberationEneCorrections_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ Copy32( parametricEarlyPartEneCorrection_fx, hrtfParambin->parametricEarlyPartEneCorrection_fx, CLDFB_NO_CHANNELS_MAX ); /*Q28*/ diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 8fbe82abf..096517afc 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -220,11 +220,11 @@ static void ivas_binaural_reverb_setReverbTimes_fx( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const Word32 output_Fs, /* i : sampling_rate */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - const Word32 *revTimes_fx, /*Q27 i : reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /*Q27 i : reverberation times T60 for each CLDFB bin in seconds */ #else - const Word32 *revTimes_fx, /*Q31 i : reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /*Q31 i : reverberation times T60 for each CLDFB bin in seconds */ #endif - const Word32 *revEnes_fx /*Q31 i : spectrum for reverberated sound at each CLDFB bin */ + const Word32 *revEnes_fx /*Q31 i : spectrum for reverberated sound at each CLDFB bin */ ) { Word16 bin, ch, tap, sample; @@ -2395,12 +2395,12 @@ static ivas_error ivas_binaural_reverb_open_fx( const Word16 numCldfbSlotsPerFrame, /* i : Q0 number of CLDFB slots per frame */ const Word32 sampling_rate, /* i : Q0 sampling rate */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - const Word32 *revTimes_fx, /* i : Q27 reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /* i : Q27 reverberation times T60 for each CLDFB bin in seconds */ #else - const Word32 *revTimes_fx, /* i : Q31 reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /* i : Q31 reverberation times T60 for each CLDFB bin in seconds */ #endif - const Word32 *revEnes_fx, /* i : Q31 spectrum for reverberated sound at each CLDFB bin */ - const Word16 preDelay /* i : Q0 reverb pre-delay in CLDFB slots */ + const Word32 *revEnes_fx, /* i : Q31 spectrum for reverberated sound at each CLDFB bin */ + const Word16 preDelay /* i : Q0 reverb pre-delay in CLDFB slots */ ) { Word16 bin, chIdx, k, len, scale, tmp; @@ -2626,7 +2626,7 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q27*/ #else - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ + revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ #endif revEne = hHrtfFastConv->fastconvReverberationEneCorrections_fx; /*Q31*/ preDelay = 10; @@ -2675,7 +2675,7 @@ ivas_error ivas_binaural_reverb_open_parambin( #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q27*/ #else - revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q31*/ + revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q31*/ #endif revEne = hHrtfParambin->parametricReverberationEneCorrections_fx; /*Q31*/ preDelay = 10; diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 39dd9556d..b4c05f9ff 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -73,9 +73,9 @@ extern Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NT /* Reverberation parameters based on BRIRs for fastconv */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT -extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ #else -extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif extern Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ @@ -83,9 +83,9 @@ extern Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* * with the above binaural rendering data set based on HRIRs for parametric * renderer */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT -extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ #else -extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif extern const Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ extern const Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 945421179..ce8f9438d 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -611,9 +611,9 @@ typedef struct ivas_hrtfs_parambin_struct Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ #else - Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ @@ -1459,9 +1459,9 @@ typedef struct ivas_hrtfs_fastconv_struct Word16 allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ + Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ #else - Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ @@ -1474,9 +1474,9 @@ typedef struct ivas_hrtfs_parambin_struct Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ #else - Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif Word32 parametricReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ Word32 parametricEarlyPartEneCorrection_fx[CLDFB_NO_CHANNELS_MAX]; /* Q28 */ -- GitLab From 4f89e38130f04dc71f72be03322ca68f5d0a3c7a Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Sun, 29 Jun 2025 20:02:29 +0200 Subject: [PATCH 1075/1310] usage of W_shl_sat_l() --- lib_com/options.h | 2 ++ lib_dec/ivas_dirac_dec_fx.c | 4 ++++ lib_enc/ivas_enc_cov_handler_fx.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4fcc4a03e..405a71cc0 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -102,4 +102,6 @@ #define ISSUE_1751_replace_shl_ro /*FhG: replace shl_ro by overflow-free alternatives*/ #define ISSUE_1770_replace_shr_ro /* FhG: replace by non-overflow-alternative - BE */ +#define FIX_1735_W_SHL_SAT_L /* FhG: Usage of W_shl_sat_l() */ + #endif diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index ba7741712..69983cbf2 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -2009,7 +2009,11 @@ void ivas_dirac_dec_set_md_map( tmp_fx = W_add_nosat( tmp_fx, W_deposit32_l( L_deposit_l( hSpatParamRendCom->render_to_md_map[slot_idx_abs] ) ) ); slot_idx_abs = add( slot_idx_abs, 1 ); } +#ifdef FIX_1735_W_SHL_SAT_L + iDiv_and_mod_32( W_shl_sat_l( tmp_fx, 16 ), hSpatParamRendCom->subframe_nbslots[sf_idx], &quo, &rem, 0 ); +#else iDiv_and_mod_32( W_extract_l( W_shl_nosat( tmp_fx, 16 ) ), hSpatParamRendCom->subframe_nbslots[sf_idx], &quo, &rem, 0 ); +#endif hSpatParamRendCom->render_to_md_map[sf_idx] = add( round_fx( quo ), hSpatParamRendCom->dirac_read_idx ) % hSpatParamRendCom->dirac_md_buffer_length; move16(); } diff --git a/lib_enc/ivas_enc_cov_handler_fx.c b/lib_enc/ivas_enc_cov_handler_fx.c index 495e6caa1..db2125de7 100644 --- a/lib_enc/ivas_enc_cov_handler_fx.c +++ b/lib_enc/ivas_enc_cov_handler_fx.c @@ -224,7 +224,11 @@ static Word16 ivas_spar_get_activeW_flag_fx( q_shift = Q31; move16(); q_shift = W_norm( bb_var_64bit[ch] ); +#ifdef FIX_1735_W_SHL_SAT_L + bb_var[ch] = W_shl_sat_l( bb_var_64bit[ch], sub( q_shift, 32 ) ); /* q_bb_var[ch] + sub( q_shift, 32 ) */ +#else bb_var[ch] = W_extract_l( W_shl_nosat( bb_var_64bit[ch], sub( q_shift, 32 ) ) ); /* q_bb_var[ch] + sub( q_shift, 32 ) */ +#endif move32(); q_bb_var[ch] = add( q_bb_var[ch], sub( q_shift, 32 ) ); move16(); -- GitLab From b49b11c8b9097eacb19f403a644caaf9fcf209f0 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Sun, 29 Jun 2025 20:07:08 +0200 Subject: [PATCH 1076/1310] formatting --- lib_enc/ivas_enc_cov_handler_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_enc_cov_handler_fx.c b/lib_enc/ivas_enc_cov_handler_fx.c index db2125de7..8b4509f49 100644 --- a/lib_enc/ivas_enc_cov_handler_fx.c +++ b/lib_enc/ivas_enc_cov_handler_fx.c @@ -568,7 +568,7 @@ static void ivas_band_cov_fx( pV_re[k] = W_shl_sat_l( pV_re_64bit[k], q_shift_tmp ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) move32(); #else - pV_re[k] = W_extract_l( W_shl_nosat( pV_re_64bit[k], q_shift_tmp ) ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) + pV_re[k] = W_extract_l( W_shl_nosat( pV_re_64bit[k], q_shift_tmp ) ); //(q_In_FR[i1] + q_In_FR[j1]) + (q_shift - 32) move32(); #endif /* perform rounding towards lower value for negative results */ -- GitLab From dc8a3c11e603cf0a50ceae017d19745675823248 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Mon, 30 Jun 2025 08:33:52 +0200 Subject: [PATCH 1077/1310] Updated Q-format fixed-point representation for RT60 reverberation times (Q27 -> Q26) --- lib_com/options.h | 2 +- .../ivas_dirac_dec_binaural_functions_fx.c | 2 +- lib_rend/ivas_reverb_fx.c | 20 +++++------ lib_rend/ivas_rom_binauralRenderer.h | 6 ++-- lib_rend/ivas_rom_binauralRenderer_fx.c | 35 +++++++++---------- lib_rend/ivas_stat_rend.h | 6 ++-- lib_util/hrtf_file_reader.c | 4 +-- 7 files changed, 37 insertions(+), 38 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f262bea81..489192b1c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,7 +122,7 @@ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ -#define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q27 format instead of Q31 */ +#define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index dbbe3ebd7..75a8d4b23 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -504,7 +504,7 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs_fx( } } #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q27*/ + Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q26*/ #else Copy32( parametricReverberationTimes_fx, hrtfParambin->parametricReverberationTimes_fx, CLDFB_NO_CHANNELS_MAX ); /*Q31*/ #endif diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 096517afc..6ac12a98d 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -220,7 +220,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const Word32 output_Fs, /* i : sampling_rate */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - const Word32 *revTimes_fx, /*Q27 i : reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /*Q26 i : reverberation times T60 for each CLDFB bin in seconds */ #else const Word32 *revTimes_fx, /*Q31 i : reverberation times T60 for each CLDFB bin in seconds */ #endif @@ -329,7 +329,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_32( 1677721600, revTimes_fx[bin] ); // e10 --> 800 * 2^21, + e0 tmp = BASOP_Util_Divide3232_Scale( 1073741824, L_tmp, &scale ); #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - scale = add( scale, sub( 1, 14 ) ); // revTimes_fx in Q27 + scale = add( scale, sub( 1, 15 ) ); // revTimes_fx in Q26 #else scale = add( scale, sub( 1, 10 ) ); #endif @@ -2395,7 +2395,7 @@ static ivas_error ivas_binaural_reverb_open_fx( const Word16 numCldfbSlotsPerFrame, /* i : Q0 number of CLDFB slots per frame */ const Word32 sampling_rate, /* i : Q0 sampling rate */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - const Word32 *revTimes_fx, /* i : Q27 reverberation times T60 for each CLDFB bin in seconds */ + const Word32 *revTimes_fx, /* i : Q26 reverberation times T60 for each CLDFB bin in seconds */ #else const Word32 *revTimes_fx, /* i : Q31 reverberation times T60 for each CLDFB bin in seconds */ #endif @@ -2459,9 +2459,9 @@ static ivas_error ivas_binaural_reverb_open_fx( /* Note: the resulted length is very sensitive to the precision of the constants below (e.g. 1.45 vs. 1.45f) */ // hReverb->loopBufLength[bin] = (int16_t) ( 1.45 * (int16_t) ( revTimes[bin] * 150.0 ) + 1 ); #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 19 ), 19 ); - L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q18 ); - hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 18 ); /*Q0*/ + Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 18 ), 18 ); + L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q17 ); + hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 17 ); /*Q0*/ #else Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 23 ), 23 ); L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q22 ); @@ -2560,7 +2560,7 @@ ivas_error ivas_binaural_reverb_init( preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - floatToFixed_arrL( t60_temp, t60, Q27, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( t60_temp, t60, Q26, CLDFB_NO_CHANNELS_MAX ); #else floatToFixed_arrL( t60_temp, t60, Q31, CLDFB_NO_CHANNELS_MAX ); #endif @@ -2624,9 +2624,9 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( ELSE { #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q27*/ + revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q26*/ #else - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ + revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ #endif revEne = hHrtfFastConv->fastconvReverberationEneCorrections_fx; /*Q31*/ preDelay = 10; @@ -2673,7 +2673,7 @@ ivas_error ivas_binaural_reverb_open_parambin( ELSE { #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q27*/ + revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q26*/ #else revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q31*/ #endif diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index b4c05f9ff..27980b3f5 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -73,9 +73,9 @@ extern Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NT /* Reverberation parameters based on BRIRs for fastconv */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT -extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ #else -extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif extern Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ @@ -83,7 +83,7 @@ extern Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* * with the above binaural rendering data set based on HRIRs for parametric * renderer */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT -extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ +extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ #else extern const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif diff --git a/lib_rend/ivas_rom_binauralRenderer_fx.c b/lib_rend/ivas_rom_binauralRenderer_fx.c index dbec56202..7333868b0 100644 --- a/lib_rend/ivas_rom_binauralRenderer_fx.c +++ b/lib_rend/ivas_rom_binauralRenderer_fx.c @@ -47157,16 +47157,15 @@ const Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTA #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT -const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q27 */ = +const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q26 */ = { - 57606384, 27529398, 27157346, 27968692, 28945932, 31748532, 30950340, 30655330, - 30530104, 29387776, 30344346, 29622122, 29729360, 29993770, 30025176, 30475880, - 30588086, 29940082, 29527900, 29337714, 29583868, 29293020, 28621930, 28230418, - 27839038, 26675774, 26340230, 26161316, 25546062, 24763170, 24203886, 23644734, - 23689428, 23834786, 24640094, 26295534, 27279754, 27973256, 28812118, 29527900, - 29919414, 30926046, 31397284, 31359570, 31720078, 31867046, 32430896, 32362310, - 32057502, 32532230, 33056752, 33010582, 33030982, 32936494, 32742548, 32765634, - 32114276, 32410092, 31517544, 33962452 + 28803192, 13764699, 13578673, 13984346, 14472966, 15874266, 15475170, 15327665, + 15265052, 14693888, 15172173, 14811061, 14864680, 14996885, 15012588, 15237940, + 15294043, 14970041, 14763950, 14668857, 14791934, 14646510, 14310965, 14115209, + 13919519, 13337887, 13170115, 13080658, 12773031, 12381585, 12101943, 11822367, + 11844714, 11917393, 12320047, 13147767, 13639877, 13986628, 14406059, 14763950, + 14959707, 15463023, 15698642, 15679785, 15860039, 15933523, 16215448, 16181155, + 16028751, 16266115, 16528376, 16505291, 16515491, 16468247, 16371274, 16382817 }; #else const Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= @@ -47183,16 +47182,16 @@ const Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX] /* Q #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT -const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q27 */ = +const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q26 */ = { - 46371420, 42876392, 44689268, 48442264, 50237560, 49764848, 48133832, 46721592, - 46051312, 44473180, 42480180, 40933052, 39574768, 38594172, 37570228, 36275964, - 35439116, 34413964, 33540876, 32486058, 31551098, 30822698, 30028532, 29366168, - 28534554, 27875546, 27122986, 26587726, 26025756, 24952150, 24518492, 24422258, - 24130736, 24035844, 23695066, 23129472, 22965056, 22542002, 22545088, 22710848, - 22459994, 22270210, 21953322, 21683948, 21260760, 21025342, 20850858, 20613158, - 20344186, 20127694, 19891604, 19655650, 19419694, 19183740, 18947786, 18711830, - 18475742, 18239786, 18003832, 17767878 + 23185710, 21438196, 22344634, 24221132, 25118780, 24882424, 24066916, 23360796, + 23025656, 22236590, 21240090, 20466526, 19787384, 19297086, 18785114, 18137982, + 17719558, 17206982, 16770438, 16243029, 15775549, 15411349, 15014266, 14683084, + 14267277, 13937773, 13561493, 13293863, 13012878, 12476075, 12259246, 12211129, + 12065368, 12017922, 11847533, 11564736, 11482528, 11271001, 11272544, 11355424, + 11229997, 11135105, 10976661, 10841974, 10630380, 10512671, 10425429, 10306579, + 10172093, 10063847, 9945802, 9827825, 9709847, 9591870, 9473893, 9355915, + 9237871, 9119893, 9001916, 8883939 }; #else const Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX] /* Q31 */= diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index ce8f9438d..963d6dd8d 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -611,7 +611,7 @@ typedef struct ivas_hrtfs_parambin_struct Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ #else Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif @@ -1459,7 +1459,7 @@ typedef struct ivas_hrtfs_fastconv_struct Word16 allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ + Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ #else Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif @@ -1474,7 +1474,7 @@ typedef struct ivas_hrtfs_parambin_struct Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q27 */ + Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ #else Word32 parametricReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index b4f54ea40..33f4e366e 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1881,7 +1881,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( memcpy( f_tmp_brir_reverb, hrtf_data_rptr, CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q27, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q26, CLDFB_NO_CHANNELS_MAX ); #else floatToFixed_arrL( f_tmp_brir_reverb, ( *hHRTF )->fastconvReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #endif @@ -2049,7 +2049,7 @@ static ivas_error create_parambin_HRTF_from_rawdata( hrtf_data_rptr += CLDFB_NO_CHANNELS_MAX * sizeof( float ); /*adding conversion as file reading is done in float*/ #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricReverberationTimes_fx, Q27, CLDFB_NO_CHANNELS_MAX ); + floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricReverberationTimes_fx, Q26, CLDFB_NO_CHANNELS_MAX ); #else floatToFixed_arrL( f_tmp_reverb, ( *hHRTF )->parametricReverberationTimes_fx, Q31, CLDFB_NO_CHANNELS_MAX ); #endif -- GitLab From 1f39091542b1020be9e4f4ccaf977aa30400f81a Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Mon, 30 Jun 2025 08:42:20 +0200 Subject: [PATCH 1078/1310] To make clang happy --- lib_rend/ivas_reverb_fx.c | 6 +++--- lib_rend/ivas_rom_binauralRenderer.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 6ac12a98d..d7dd26ec3 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2624,9 +2624,9 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( ELSE { #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q26*/ + revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q26*/ #else - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ + revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ #endif revEne = hHrtfFastConv->fastconvReverberationEneCorrections_fx; /*Q31*/ preDelay = 10; @@ -2673,7 +2673,7 @@ ivas_error ivas_binaural_reverb_open_parambin( ELSE { #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q26*/ + revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q26*/ #else revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q31*/ #endif diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 27980b3f5..4992cbb1f 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -75,7 +75,7 @@ extern Word32 rightBRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NT #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q26 */ #else -extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ +extern Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ #endif extern Word32 fastconvReverberationEneCorrections_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ -- GitLab From f4db1967eb63c8a491be62cbebdad2efee565cf8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 30 Jun 2025 13:38:02 +0530 Subject: [PATCH 1079/1310] Optimizations for multi-channel functions - 2 --- lib_com/ivas_fb_mixer_fx.c | 30 ++++++++++++-- lib_com/ivas_tools_fx.c | 8 ++++ lib_com/options.h | 1 + lib_com/tns_base.c | 17 ++++++-- lib_enc/ivas_mcmasa_enc_fx.c | 80 ++++++++++++++++++++++++++++++++++++ 5 files changed, 129 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_fb_mixer_fx.c b/lib_com/ivas_fb_mixer_fx.c index 0d8a74514..c40f65ad6 100644 --- a/lib_com/ivas_fb_mixer_fx.c +++ b/lib_com/ivas_fb_mixer_fx.c @@ -614,13 +614,21 @@ void ivas_fb_mixer_get_windowed_fr_fx( Word16 n_new_samples; Word32 fr_in_block_fx[L_FRAME48k * 2]; const Word16 *win_ptr_fx; - +#ifdef OPT_MCT_ENC_V1_BE + Word16 two_mdft_len = shl( mdft_len, 1 ); + Word16 tmp = sub( shl( mdft_len, 1 ), length ); + Word16 gb_neg = negate( gb ); + + n_old_samples = s_min( ( sub( hFbMixer->fb_cfg->prior_input_length, hFbMixer->fb_cfg->windowed_fr_offset ) ), two_mdft_len ); + offset = sub( tmp, hFbMixer->ana_window_offset ); + rev_offset = sub( two_mdft_len, hFbMixer->ana_window_offset ); +#else n_old_samples = s_min( ( sub( hFbMixer->fb_cfg->prior_input_length, hFbMixer->fb_cfg->windowed_fr_offset ) ), ( shl( mdft_len, 1 ) ) ); - n_new_samples = s_max( 0, sub( shl( length, 1 ), n_old_samples ) ); offset = sub( sub( shl( mdft_len, 1 ), length ), hFbMixer->ana_window_offset ); rev_offset = sub( shl( mdft_len, 1 ), hFbMixer->ana_window_offset ); +#endif set32_fx( fr_in_block_fx, 0, offset ); - + n_new_samples = s_max( 0, sub( shl( length, 1 ), n_old_samples ) ); FOR( ch_idx = 0; ch_idx < nchan_fb_in; ch_idx++ ) { Copy32( &hFbMixer->ppFilterbank_prior_input_fx[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block_fx[offset], sub( n_old_samples, offset ) ); // Qx @@ -628,25 +636,41 @@ void ivas_fb_mixer_get_windowed_fr_fx( win_ptr_fx = hFbMixer->pAna_window_fx; /*Q15*/ +#ifdef OPT_MCT_ENC_V1_BE + FOR( j = offset; j < tmp; j++ ) +#else FOR( j = offset; j < sub( shl( mdft_len, 1 ), length ); j++ ) +#endif { fr_in_block_fx[j] = Mpy_32_16_1( fr_in_block_fx[j], ( *( win_ptr_fx++ ) ) ); // Qx + 15 - 15 = Qx move32(); } +#ifdef OPT_MCT_ENC_V1_BE + FOR( j = rev_offset; j < two_mdft_len; j++ ) +#else FOR( j = rev_offset; j < shl( mdft_len, 1 ); j++ ) +#endif { fr_in_block_fx[j] = Mpy_32_16_1( fr_in_block_fx[j], ( *( --win_ptr_fx ) ) ); // Qx + 15 - 15 = Qx move32(); } +#ifdef OPT_MCT_ENC_V1_BE + scale_sig32( fr_in_block_fx, two_mdft_len, gb_neg ); +#else FOR( Word16 i = 0; i < shl( mdft_len, 1 ); i++ ) { fr_in_block_fx[i] = L_shr( fr_in_block_fx[i], gb ); // Qx - gb move32(); } +#endif +#ifdef OPT_MCT_ENC_V1_BE + ivas_mdft_fx( fr_in_block_fx, frame_f_real_fx[ch_idx], frame_f_imag_fx[ch_idx], two_mdft_len, mdft_len ); +#else ivas_mdft_fx( fr_in_block_fx, frame_f_real_fx[ch_idx], frame_f_imag_fx[ch_idx], shl( mdft_len, 1 ), mdft_len ); +#endif } return; diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index ca8dec276..e334a8cda 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -1955,7 +1955,11 @@ void v_multc_acc_32_16( FOR( i = 0; i < N; i++ ) { +#ifdef OPT_MCT_ENC_V1_BE + y[i] = Madd_32_16( y[i], x[i], c ); +#else y[i] = L_add( y[i], Mpy_32_16_1( x[i], c ) ); +#endif move32(); } @@ -1972,7 +1976,11 @@ void v_multc_acc_32_32( FOR( i = 0; i < N; i++ ) { +#ifdef OPT_MCT_ENC_V1_BE + y[i] = Madd_32_32( y[i], x[i], c ); /*Qx*/ +#else y[i] = L_add( y[i], Mpy_32_32( x[i], c ) ); /*Qx*/ +#endif move32(); } diff --git a/lib_com/options.h b/lib_com/options.h index 4fcc4a03e..1a9f8ab84 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -78,6 +78,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V1_NBE +#define OPT_MCT_ENC_V1_BE #define OPT_SBA_REND_V1_BE #define OPT_HEAD_ROT_REND_V1_BE #define OPT_SBA_DEC_V2_BE diff --git a/lib_com/tns_base.c b/lib_com/tns_base.c index 5e18430be..376e2813d 100644 --- a/lib_com/tns_base.c +++ b/lib_com/tns_base.c @@ -1207,17 +1207,26 @@ static Word32 FIRLattice( move32(); FOR( i = 0; i < order - 1; i++ ) { - tmp = L_add( state[i], Mpy_32_16_1( x, parCoeff[i] ) ); /*Q0*/ - x = L_add( x, Mpy_32_16_1( state[i], parCoeff[i] ) ); /* exponent: 31+0 */ - state[i] = tmpSave; /*Q0*/ +#ifdef OPT_MCT_ENC_V1_BE + tmp = Madd_32_16( state[i], x, parCoeff[i] ); /*Q0*/ + x = Madd_32_16( x, state[i], parCoeff[i] ); /* exponent: 31+0 */ +#else + tmp = L_add( state[i], Mpy_32_16_1( x, parCoeff[i] ) ); /*Q0*/ + x = L_add( x, Mpy_32_16_1( state[i], parCoeff[i] ) ); /* exponent: 31+0 */ +#endif + state[i] = tmpSave; /*Q0*/ move32(); tmpSave = tmp; /*Q0*/ move32(); } /* last stage: only need half operations */ +#ifdef OPT_MCT_ENC_V1_BE + x = Madd_32_16( x, state[order - 1], parCoeff[order - 1] ); /*Q0*/ +#else x = L_add( x, Mpy_32_16_1( state[order - 1], parCoeff[order - 1] ) ); /*Q0*/ - state[order - 1] = tmpSave; /*Q0*/ +#endif + state[order - 1] = tmpSave; /*Q0*/ move32(); return x; /*Q0*/ diff --git a/lib_enc/ivas_mcmasa_enc_fx.c b/lib_enc/ivas_mcmasa_enc_fx.c index 7d261d4e4..fb4ea608a 100644 --- a/lib_enc/ivas_mcmasa_enc_fx.c +++ b/lib_enc/ivas_mcmasa_enc_fx.c @@ -2156,6 +2156,85 @@ static void compute_cov_mtx_fx( return; } +#ifdef OPT_MCT_ENC_V1_BE +static void computeIntensityVector_enc_fx( + const Word16 *band_grouping, + Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/ + const Word16 enc_param_start_band, /* i : first band to process */ + const Word16 num_frequency_bands, + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /*exp: exp_intensity_real*/ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ) +{ + Word16 i, j; + Word32 real, img; + Word16 brange[2]; + Word16 shift_value = add( shl( inp_q, 1 ), 1 ); + Word16 tmp_norm; + FOR( i = 0; i < num_frequency_bands; i++ ) + { + brange[0] = band_grouping[i + enc_param_start_band]; /* Q0 */ + move16(); + brange[1] = band_grouping[i + enc_param_start_band + 1]; /* Q0 */ + move16(); + Word16 num_bins = sub( brange[1], brange[0] ); + Word16 gb = find_guarded_bits_fx( num_bins ); + Word16 norm; + + Word64 tmp_1 = 0, tmp_2 = 0, tmp_3 = 0; + move64(); + move64(); + move64(); + + FOR( j = brange[0]; j < brange[1]; j++ ) + { + real = Cldfb_RealBuffer[0][j]; + move32(); + img = Cldfb_ImagBuffer[0][j]; + move32(); + Word64 t1, t2, t3; + t1 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[3][j], real ), Cldfb_ImagBuffer[3][j], img ); /* 2 * q_cldfb + 1 */ + t2 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[1][j], real ), Cldfb_ImagBuffer[1][j], img ); /* 2 * q_cldfb + 1 */ + t3 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[2][j], real ), Cldfb_ImagBuffer[2][j], img ); /* 2 * q_cldfb + 1 */ + t1 = W_shr( t1, gb ); + t2 = W_shr( t2, gb ); + t3 = W_shr( t3, gb ); + /* Intensity is XYZ order, audio is WYZX order. */ + tmp_1 = W_add( tmp_1, t1 ); /* 2 * q_cldfb + 1 */ + tmp_2 = W_add( tmp_2, t2 ); /* 2 * q_cldfb + 1 */ + tmp_3 = W_add( tmp_3, t3 ); /* 2 * q_cldfb + 1 */ + } + norm = 63; + move16(); + tmp_norm = W_norm( tmp_1 ); + if ( tmp_1 != 0 ) + { + norm = s_min( norm, tmp_norm ); + } + tmp_norm = W_norm( tmp_2 ); + if ( tmp_2 != 0 ) + { + norm = s_min( norm, tmp_norm ); + } + tmp_norm = W_norm( tmp_3 ); + if ( tmp_3 != 0 ) + { + norm = s_min( norm, tmp_norm ); + } + norm = sub( norm, 32 ); + intensity_real[0][i] = W_shl_sat_l( tmp_1, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[1][i] = W_shl_sat_l( tmp_2, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[2][i] = W_shl_sat_l( tmp_3, norm ); // shift_value - (gb - norm) + q_intensity_real[i] = sub( shift_value, sub( gb, norm ) ); + move16(); + } + + return; +} +#else static void computeIntensityVector_enc_fx( const Word16 *band_grouping, Word32 Cldfb_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX], /*inp_q*/ @@ -2240,6 +2319,7 @@ static void computeIntensityVector_enc_fx( return; } +#endif static void computeVerticalDiffuseness_fx( Word32 **buffer_intensity, /* i : Intensity vectors */ -- GitLab From b1bbee2105e14cef6ca90e0f851ee3e0eef3a680 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 30 Jun 2025 11:07:16 +0200 Subject: [PATCH 1080/1310] also address lib_enc/analy_sp_fx.c --- lib_enc/analy_sp_fx.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 8541decd8..6a55bff93 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -320,8 +320,12 @@ static void find_enr_dft_ivas_fx( bin_cnt = add( bin_cnt, 1 ); } - /* normalization per frequency bin */ + /* normalization per frequency bin */ +#ifdef FIX_1735_W_SHL_SAT_L + band_fx[i] = W_shl_sat_l( band_ener, -add( 32 - Q16, shift ) ); // *q_band +#else band_fx[i] = W_extract_h( W_shl( band_ener, sub( Q16, shift ) ) ); // *q_band +#endif move32(); /* per band energy without E_MIN */ -- GitLab From 7a3f492790180d2eb1ba153f5656d1032214a927 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 30 Jun 2025 11:21:15 +0200 Subject: [PATCH 1081/1310] formatting --- lib_enc/analy_sp_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 6a55bff93..8e18883c7 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -320,11 +320,11 @@ static void find_enr_dft_ivas_fx( bin_cnt = add( bin_cnt, 1 ); } - /* normalization per frequency bin */ + /* normalization per frequency bin */ #ifdef FIX_1735_W_SHL_SAT_L - band_fx[i] = W_shl_sat_l( band_ener, -add( 32 - Q16, shift ) ); // *q_band + band_fx[i] = W_shl_sat_l( band_ener, -add( 32 - Q16, shift ) ); // *q_band #else - band_fx[i] = W_extract_h( W_shl( band_ener, sub( Q16, shift ) ) ); // *q_band + band_fx[i] = W_extract_h( W_shl( band_ener, sub( Q16, shift ) ) ); // *q_band #endif move32(); -- GitLab From 742401242c6018b7c9cd1a68f7416eb194b6b485 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 30 Jun 2025 15:39:43 +0530 Subject: [PATCH 1082/1310] Fix for 3GPP issue 1780: ParamISM4 at 32kbps EXT Decoder output at 16kHz is zero Link #1780 --- lib_dec/ivas_ism_param_dec_fx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_ism_param_dec_fx.c b/lib_dec/ivas_ism_param_dec_fx.c index f3e37c5c0..c8f6694e7 100644 --- a/lib_dec/ivas_ism_param_dec_fx.c +++ b/lib_dec/ivas_ism_param_dec_fx.c @@ -1339,14 +1339,14 @@ void ivas_ism_param_dec_tc_gain_ajust_fx( { gain_fx = 0; move16(); - tmp_e1 = 31; + tmp_e1 = 0; move16(); } - ELSE - { /*handling denominator equals to zero*/ - gain_fx = 1; + ELSE /*handling denominator equals to zero*/ + { + gain_fx = 32767; //(max value of Word16 in Q0) move16(); - tmp_e1 = -32767; //(-1.0f in Q15) + 1 + tmp_e1 = 15; move16(); } } -- GitLab From 8d81abe6086ba0e333492b39c59a4a5ede87c0fe Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 30 Jun 2025 15:46:59 +0530 Subject: [PATCH 1083/1310] Fix for 3GPP issue 1777: McMASA LFE Gains codebooks precision Link #1777 --- lib_com/ivas_rom_com_fx.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index 6bb2eaa10..1cfe1ff6c 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -485,14 +485,14 @@ const Word32 dft_res_gains_q_fx[][2] = { // Q13 const Word16 McMASA_LFEGain_vectors_fx_q13[64] = { - 3112, 2703, 1556, 1638, -1310, -1802, -2867, -2785, - 4096, 4096, 4096, 4096, -6553, -3276, 8355, 819, - -4096, -4096, -4096, -4096, -4587, -983, -6389, 11141, - -8355, 9666, -4669, 2703, 5898, -9256, 7946, -5079, - -7454, 7618, 8192, -9011, 14172, -1884, -6389, -6881, - 7782, -13107, -2785, 7618, 7127, 3850, -15564, 4259, - 5488, 11632, -7946, -10158, 6799, 4751, 4997, -16711, - -6553, -12943, 6717, 11632, -17530, 2129, 6881, 8355 + 3113, 2703, 1556, 1638, -1311, -1802, -2867, -2785, + 4096, 4096, 4096, 4096, -6554, -3277, 8356, 819, + -4096, -4096, -4096, -4096, -4588, -983, -6390, 11141, + -8356, 9667, -4669, 2703, 5898, -9257, 7946, -5079, + -7455, 7619, 8192, -9011, 14172, -1884, -6390, -6881, + 7782, -13107, -2785, 7619, 7127, 3850, -15565, 4260, + 5489, 11633, -7946, -10158, 6799, 4751, 4997, -16712, + -6554, -12943, 6717, 11633, -17531, 2130, 6881, 8356 }; // Q25 -- GitLab From b6dbf27abe0e2f1d0a8c657e024ce1e453171619 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 30 Jun 2025 13:19:55 +0200 Subject: [PATCH 1084/1310] fix missing ; --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ec72727a..0c61cf5b4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1094,7 +1094,7 @@ check-be-between-renderer-framesizes: - *print-results-banner - echo "!! Encoder command lines are in the 20ms log files only !!!" - - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors."; zero_errors=0 fi + - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors."; zero_errors=0; fi - if [ $zero_errors5 != 1 ]; then echo "run error with 5ms rendering encountered"; zero_errors=0 ; fi - if [ $zero_errors10 != 1 ]; then echo "run error with 10ms rendering encountered"; zero_errors=0 ; fi - if [ $zero_errors != 1 ]; then exit $EXIT_CODE_FAIL; fi -- GitLab From 66d76646f1ca553f966b22429530449f81bfc55b Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 30 Jun 2025 17:06:41 +0530 Subject: [PATCH 1085/1310] Optimization for tcx_scalar_quantization_ivas_fx function changes are under macro: OPT_MCT_ENC_V2_NBE stream used: IVAS_cod -mc 7_1_4 -max_band fb 192000 48 stv714MC48c.wav mc_7_1_4.bit (MCT_714_192kbps_FB) Around 18 WMOPs reduced --- lib_com/options.h | 1 + lib_enc/tcx_utils_enc_fx.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 1a9f8ab84..dd32167b9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -77,6 +77,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_MCT_ENC_V2_NBE #define OPT_MCT_ENC_V1_NBE #define OPT_MCT_ENC_V1_BE #define OPT_SBA_REND_V1_BE diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 9a15cec28..9ca9eb82a 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -1355,23 +1355,37 @@ void tcx_scalar_quantization_ivas_fx( { Word16 i, tmp16, s; Word32 tmp32, offs32; +#ifdef OPT_MCT_ENC_V2_NBE + Word32 offs32_1; + Word32 offset_Q16 = L_shl( offset, 1 ); // Q16 +#endif /* common exponent for x and gain for comparison */ tmp16 = sub( gain_e, x_e ); +#ifdef OPT_MCT_ENC_V2_NBE + tmp32 = L_shl_sat( L_deposit_h( gain ), tmp16 ); // exp:x_e +#else tmp32 = L_shl( L_deposit_h( gain ), s_max( -31, s_min( tmp16, 0 ) ) ); tmp16 = negate( s_max( tmp16, 0 ) ); +#endif i = sub( L_frame, 1 ); IF( memQuantZeros_fx != NULL ) { test(); +#ifdef OPT_MCT_ENC_V2_NBE + FOR( ; ( ( memQuantZeros_fx[i] != 0 ) && ( L_abs( x[i] ) < tmp32 ) ); i-- ) +#else WHILE( ( memQuantZeros_fx[i] != 0 ) && ( LT_32( L_abs( L_shl( x[i], tmp16 ) ), tmp32 ) ) ) +#endif { test(); xq[i] = 0; move16(); +#ifndef OPT_MCT_ENC_V2_NBE i = sub( i, 1 ); +#endif } } @@ -1394,6 +1408,22 @@ void tcx_scalar_quantization_ivas_fx( FOR( ; i >= 0; i-- ) { +#ifdef OPT_MCT_ENC_V2_NBE + offs32 = Mpy_32_16_1( x[i], gain ); + offs32 = L_shl_sat( offs32, s ); /* convert to 15Q16 */ + + offs32_1 = L_add_sat( offs32, offset_Q16 ); /*15Q16 */ + tmp16 = extract_h( offs32_1 ); + IF( x[i] < 0 ) + { + offs32 = L_sub_sat( offs32, offset_Q16 ); /*15Q16 */ + tmp16 = extract_h( offs32 ); + if ( L_mac_sat( offs32, tmp16, -ONE_IN_Q15 ) > 0 ) + { + tmp16 = add( tmp16, 1 ); + } + } +#else offs32 = Mpy_32_16_1( x[i], gain ); /* multiply */ offs32 = L_shl_sat( offs32, s ); /* convert to 15Q16 */ IF( x[i] > 0 ) @@ -1414,6 +1444,7 @@ void tcx_scalar_quantization_ivas_fx( tmp16 = add( tmp16, 1 ); } } +#endif xq[i] = tmp16; move16(); } -- GitLab From 743d1c3b9230bce12688b2d267a177021ad8716f Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Mon, 30 Jun 2025 14:49:38 +0200 Subject: [PATCH 1086/1310] Added ivas_reverb_interpolate_energies_fx, fixes in ivas_reverb_set_energies for the frequency grids --- lib_rend/ivas_prot_rend_fx.h | 14 +++++ lib_rend/ivas_reverb_filter_design_fx.c | 83 +++++++++++++++++++++++++ lib_rend/ivas_reverb_utils_fx.c | 30 +++++++++ 3 files changed, 127 insertions(+) diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 9524f0904..3fc299761 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -1158,6 +1158,20 @@ void ivas_reverb_interpolate_acoustic_data_fx( Word16 *pOutput_t60_e, //output e Word16 *pOutput_dsr_e //output e ); +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT +void ivas_reverb_interpolate_energies_fx( + const Word16 input_table_size, + const Word32 *pInput_fc, //input in Q16 + const Word32 *pInput_ene_l, //input in Q28 + const Word32 *pInput_ene_r, //input in Q28 + const Word16 output_table_size, + const Word32 *pOutput_fc, + Word32 *pOutput_ene_l_m, // output m + Word32 *pOutput_ene_r_m, // output m + Word16 *pOutput_ene_l_e, //output e + Word16 *pOutput_ene_r_e //output e +); +#endif #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES void ivas_reverb_get_hrtf_set_properties_fx( Word32 **ppHrtf_set_L_re, diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index 757108755..f2e03b800 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -920,6 +920,89 @@ void ivas_reverb_interpolate_acoustic_data_fx( return; } +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT +/*-------------------------------------------------------------------* + * ivas_reverb_interpolate_energies_fx() + * + * Interpolates data from the input average energy to the FFT pFilter uniform grid + * Note: the fc frequencies both for the input and the output must be in the ascending order + *-------------------------------------------------------------------*/ + + +void ivas_reverb_interpolate_energies_fx( + const Word16 input_table_size, + const Word32 *pInput_fc, // input in Q16 + const Word32 *pInput_ene_l, // input in Q28 + const Word32 *pInput_ene_r, // input in Q28 + const Word16 output_table_size, + const Word32 *pOutput_fc, // Q16 + Word32 *pOutput_ene_l_m, + Word32 *pOutput_ene_r_m, + Word16 *pOutput_ene_l_e, + Word16 *pOutput_ene_r_e +) +{ + Word16 input_idx, output_idx; + Word32 rel_offset; + Word16 rel_offset_e; + input_idx = 0; + move16(); + + FOR( output_idx = 0; output_idx < output_table_size; output_idx++ ) + { + /* if the bin frequency is lower than the 1st frequency point in the input table, take this 1st point */ + IF( LT_32( pOutput_fc[output_idx], pInput_fc[0] ) ) + { + input_idx = 0; + move16(); + rel_offset = 0; + move32(); + rel_offset_e = 0; + move16(); + } + ELSE + { + /* if the bin frequency is higher than the last frequency point in the input table, take this last point */ + IF( GT_32( pOutput_fc[output_idx], pInput_fc[input_table_size - 1] ) ) + { + input_idx = sub( input_table_size, 2 ); + rel_offset = ONE_IN_Q30; // Q30; + move32(); + rel_offset_e = 1; + move16(); + } + /* otherwise use linear interpolation between 2 consecutive points in the input table */ + ELSE + { + WHILE( GT_32( pOutput_fc[output_idx], pInput_fc[input_idx + 1] ) ) + { + input_idx = add( input_idx, 1 ); + } + rel_offset = BASOP_Util_Divide3232_Scale( L_sub( pOutput_fc[output_idx], pInput_fc[input_idx] ), L_sub( pInput_fc[input_idx + 1], pInput_fc[input_idx] ), &rel_offset_e ); // q15 + rel_offset = L_shl_sat( rel_offset, add( 16, rel_offset_e ) ); + rel_offset_e = 0; + move16(); + } + } + Word32 mult1; + Word16 mult_e = 0; + move16(); + mult1 = Mpy_32_32( rel_offset, L_sub( pInput_ene_l[input_idx + 1], pInput_ene_l[input_idx] ) ); + pOutput_ene_l_m[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_ene_l[input_idx], 3, mult1, add( 3, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 28 - 31) + move32(); + pOutput_ene_l_e[output_idx] = mult_e; + move16(); + + mult1 = Mpy_32_32( rel_offset, L_sub( pInput_ene_r[input_idx + 1], pInput_ene_r[input_idx] ) ); + pOutput_ene_r_m[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_ene_r[input_idx], 3, mult1, add( 3, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 28 - 31) + move32(); + pOutput_ene_r_e[output_idx] = mult_e; + move16(); + } + + return; +} +#endif #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-------------------------------------------------------------------* diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 4a3c0477c..2c61d54df 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -305,6 +305,15 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; #endif float input_fc[FFT_SPECTRUM_SIZE]; +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + Word32 input_fc_fx[FFT_SPECTRUM_SIZE]; + Word32 output_fc_fx[CLDFB_NO_CHANNELS_MAX]; + Word32 avg_pwr_left_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 avg_pwr_left_e[CLDFB_NO_CHANNELS_MAX]; + Word32 avg_pwr_right_fx[CLDFB_NO_CHANNELS_MAX]; + Word16 avg_pwr_right_e[CLDFB_NO_CHANNELS_MAX]; + const Word16 cldfb_freq_halfstep = MAX_SAMPLING_RATE / ( 4 * CLDFB_NO_CHANNELS_MAX ); +#endif #ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error error; @@ -320,7 +329,17 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( for ( freq_idx = 0; freq_idx < avg_pwr_len; freq_idx++ ) { input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( avg_pwr_len - 1 ) ); +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + input_fc_fx[freq_idx] = input_fc[freq_idx] * ONE_IN_Q16; +#endif + } + +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + for ( freq_idx = 0; freq_idx < CLDFB_NO_CHANNELS_MAX; freq_idx++ ) + { + output_fc_fx[freq_idx] = ( ( freq_idx << 1 ) + 1 ) * cldfb_freq_halfstep * ONE_IN_Q16; } +#endif #else for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ ) { @@ -329,6 +348,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #endif #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES +#ifndef FIX_1741_REVERB_TIMES_Q_FORMAT Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 ) ); @@ -337,7 +357,9 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( Word16 *avg_pwr_right_e = (Word16 *) malloc( avg_pwr_len * sizeof( Word16 ) ); Word32 *avg_pwr_left_fx = (Word32 *) malloc( avg_pwr_len * sizeof( Word32 ) ); Word32 *avg_pwr_right_fx = (Word32 *) malloc( avg_pwr_len * sizeof( Word32 ) ); +#endif +#ifndef FIX_1741_REVERB_TIMES_Q_FORMAT for ( int i = 0; i < 60; i++ ) { input_fc_fx[i] = (Word32) input_fc[i] * ( 1 << 16 ); @@ -347,9 +369,15 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( { output_fc_fx[i] = (Word32) input_fc[i] * ONE_IN_Q16; } +#endif +#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT + ivas_reverb_interpolate_energies_fx( avg_pwr_len, input_fc_fx, avg_pwr_l, avg_pwr_r, + CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); +#else ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); +#endif for ( int i = 0; i < 60; i++ ) { @@ -357,12 +385,14 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( avg_pwr_right[i] = (float) fabs( me2f( avg_pwr_right_fx[i], avg_pwr_right_e[i] ) ); } +#ifndef FIX_1741_REVERB_TIMES_Q_FORMAT free( input_fc_fx ); free( output_fc_fx ); free( avg_pwr_left_e ); free( avg_pwr_right_e ); free( avg_pwr_left_fx ); free( avg_pwr_right_fx ); +#endif #else if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) -- GitLab From 63f05e3b060632fb2fbe4f51776bdc9a5b6bc582 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Mon, 30 Jun 2025 15:10:50 +0200 Subject: [PATCH 1087/1310] To make clang happy --- lib_rend/ivas_reverb_filter_design_fx.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index f2e03b800..aacfb2009 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -931,7 +931,7 @@ void ivas_reverb_interpolate_acoustic_data_fx( void ivas_reverb_interpolate_energies_fx( const Word16 input_table_size, - const Word32 *pInput_fc, // input in Q16 + const Word32 *pInput_fc, // input in Q16 const Word32 *pInput_ene_l, // input in Q28 const Word32 *pInput_ene_r, // input in Q28 const Word16 output_table_size, @@ -939,8 +939,7 @@ void ivas_reverb_interpolate_energies_fx( Word32 *pOutput_ene_l_m, Word32 *pOutput_ene_r_m, Word16 *pOutput_ene_l_e, - Word16 *pOutput_ene_r_e -) + Word16 *pOutput_ene_r_e ) { Word16 input_idx, output_idx; Word32 rel_offset; -- GitLab From 938ce84fd228dbdb1c92f4d271fbb19afe85ae8c Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 30 Jun 2025 20:02:05 +0200 Subject: [PATCH 1088/1310] addressing comment --- lib_enc/analy_sp_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 8e18883c7..0d42e5ff2 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -322,7 +322,7 @@ static void find_enr_dft_ivas_fx( /* normalization per frequency bin */ #ifdef FIX_1735_W_SHL_SAT_L - band_fx[i] = W_shl_sat_l( band_ener, -add( 32 - Q16, shift ) ); // *q_band + band_fx[i] = W_shl_sat_l( band_ener, sub( Q16 - 32, shift ) ); // *q_band #else band_fx[i] = W_extract_h( W_shl( band_ener, sub( Q16, shift ) ) ); // *q_band #endif -- GitLab From 9de72e763fce51bf41ddccc0457504c4a1148318 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 30 Jun 2025 20:12:10 +0200 Subject: [PATCH 1089/1310] fix i_mult_o(), i_mult() --- lib_com/basop32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/basop32.c b/lib_com/basop32.c index fbe08a11f..6a34cff43 100644 --- a/lib_com/basop32.c +++ b/lib_com/basop32.c @@ -3582,13 +3582,13 @@ Word16 i_mult_o( Word16 a, Word16 b, Flag *Overflow ) #ifdef ORIGINAL_G7231 return a * b; #else - register Word32 c = a * b; + register Word32 c = (Word32) a * b; return saturate_o( c, Overflow ); #endif } Word16 i_mult( Word16 a, Word16 b ) { - return i_mult_o( a, b, NULL ); + return i_mult_sat( a, b ); } Word16 i_mult_sat( Word16 a, Word16 b ) { -- GitLab From 79ac8b76148a0927c7605d5c03723f5b27e187b3 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Jul 2025 06:55:34 +0200 Subject: [PATCH 1090/1310] clang format patch --- lib_com/deemph_fx.c | 2 +- lib_com/low_rate_band_att_fx.c | 4 ++-- lib_dec/FEC_HQ_phase_ecu_fx.c | 4 ++-- lib_enc/gaus_enc_fx.c | 4 ++-- lib_enc/stat_noise_uv_enc_fx.c | 12 ++++++------ 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib_com/deemph_fx.c b/lib_com/deemph_fx.c index b8e3a72cd..523061b98 100644 --- a/lib_com/deemph_fx.c +++ b/lib_com/deemph_fx.c @@ -202,7 +202,7 @@ void E_UTIL_deemph2( Word16 shift, Word16 *x, const Word16 mu, const Word16 L, W #else L_tmp = L_msu_o( Mpy_32_16_1( L_tmp, mu ), shr_o( x[i], shift, &Overflow ), -32768 /*1.0f in Q15*/, &Overflow ); /*Qx-shift+16*/ #endif - x[i] = round_fx_o( L_tmp, &Overflow ); /*Qx-shift*/ + x[i] = round_fx_o( L_tmp, &Overflow ); /*Qx-shift*/ move16(); } } diff --git a/lib_com/low_rate_band_att_fx.c b/lib_com/low_rate_band_att_fx.c index d762d628d..186074445 100644 --- a/lib_com/low_rate_band_att_fx.c +++ b/lib_com/low_rate_band_att_fx.c @@ -96,7 +96,7 @@ void ivas_fine_gain_pred_fx( exp = add( exp, exp2 ); /*gp *= 1.0f - 0.05f / accuracy; */ - tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ + tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ #ifdef ISSUE_1772_replace_shr_o tmp = shr_sat( tmp, sub( 34, exp ) ); /*15+18-exp+16-15=34-exp */ #else @@ -208,7 +208,7 @@ void fine_gain_pred_fx( exp = add( exp, exp2 ); /*gp *= 1.0f - 0.05f / accuracy; */ - tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ + tmp = div_s( 13107, accuracy ); /* 0.05 in Q18 */ #ifdef ISSUE_1772_replace_shr_o tmp = shr_sat( tmp, sub( 34, exp ) ); /*15+18-exp+16-15=34-exp */ #else diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index 5ac191836..7c4c91936 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -1202,13 +1202,13 @@ static Word16 imax_fx( /* o: The location, relative to the } /* Although the output of ratio() is in Q14, adding the missing factor of 2 (See above) * in the denominator, the output is now considered to be in Q15. */ - man = ratio( numer, denom, &expo ); /* The mantissa is considered in Q15 */ + man = ratio( numer, denom, &expo ); /* The mantissa is considered in Q15 */ #ifdef ISSUE_1772_replace_shr_o posi = shr_sat( man, expo ); /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ #else posi = shr_o( man, expo, &Overflow ); /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */ #endif - if ( sign < 0 ) /* Restore the sign. */ + if ( sign < 0 ) /* Restore the sign. */ { posi = negate( posi ); } diff --git a/lib_enc/gaus_enc_fx.c b/lib_enc/gaus_enc_fx.c index d002d5206..1efe1f656 100644 --- a/lib_enc/gaus_enc_fx.c +++ b/lib_enc/gaus_enc_fx.c @@ -367,7 +367,7 @@ void gauss2v_fx( #else delta = shr_o( div_s( Num, Den ), sub( exp_num, exp_den ), &Overflow ); /* Q15 */ #endif - delta = i_mult2( delta, m_sign ); /* Apply sign Q0*/ + delta = i_mult2( delta, m_sign ); /* Apply sign Q0*/ /* index_delta = (short)(FAC_DELTA * fdelta) */ index_delta = shr( delta, SFAC_DELTA ); @@ -832,7 +832,7 @@ void gauss2v_ivas_fx( #else delta = shr_o( div_s( Num, Den ), sub( exp_num, exp_den ), &Overflow ); /* Q15 */ #endif - delta = i_mult2( delta, m_sign ); /* Apply sign */ + delta = i_mult2( delta, m_sign ); /* Apply sign */ /* index_delta = (short)(FAC_DELTA * fdelta) */ index_delta = shr( delta, SFAC_DELTA ); diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index 8d4f899da..5dcb6d444 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -67,14 +67,14 @@ void stat_noise_uv_enc_fx( expn = sub( norm_l( LepsP[0] ), 1 ); num = extract_h( L_shl_o( LepsP[0], expn, &Overflow ) ); /*expn-16*/ expd = norm_l( LepsP[1] ); - den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ - num = div_s( num, den ); /*expn-expd+15*/ + den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ + num = div_s( num, den ); /*expn-expd+15*/ #ifdef ISSUE_1772_replace_shr_o num = shr_sat( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ #else num = shr_o( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ #endif - num = sub( num, 1024 ); /*num - 1*/ + num = sub( num, 1024 ); /*num - 1*/ test(); IF( NE_16( st_fx->bwidth, NB ) ) @@ -144,14 +144,14 @@ void stat_noise_uv_enc_ivas_fx( expn = sub( norm_l( LepsP[0] ), 1 ); num = extract_h( L_shl_o( LepsP[0], expn, &Overflow ) ); /*expn-16*/ expd = norm_l( LepsP[1] ); - den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ - num = div_s( num, den ); /*expn-expd+15*/ + den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ + num = div_s( num, den ); /*expn-expd+15*/ #ifdef ISSUE_1772_replace_shr_o num = shr_sat( num, add( sub( expn, expd ), 5 ) ); /*Q10*/ #else num = shr_o( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ #endif - num = sub( num, 1024 ); /*num - 1*/ + num = sub( num, 1024 ); /*num - 1*/ test(); IF( NE_16( st_fx->bwidth, NB ) ) -- GitLab From ff28a5814d5d7af413ec11e5b8d217acf8f90133 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 1 Jul 2025 11:32:01 +0530 Subject: [PATCH 1091/1310] Fix for 3GPP issue 1782: Assert in IVAS_rend with MASA + MC input to MASA output Link #1782 --- lib_rend/ivas_mcmasa_ana_fx.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index 3cb2c4fcf..99af8a0af 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -959,29 +959,27 @@ void ivas_mcmasa_param_est_ana_fx( IF( LT_16( i1, i2 ) ) { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i2] ); - tempCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i2], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); + tempCoh_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i1][i2], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); tempCoh_e = add( tempCoh_e, sub( absCOVls_e[i1][i2], temp_e ) ); } ELSE { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i2] ); - tempCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i2][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); + tempCoh_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i2][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_e ) ), &tempCoh_e ); tempCoh_e = add( tempCoh_e, sub( absCOVls_e[i2][i1], temp_e ) ); } - tempCoh_fx = L_shl( tempCoh_fx, 16 ); IF( LT_16( i1, i3 ) ) { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i3] ); - tempCoh2_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i3], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); + tempCoh2_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i1][i3], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); tempCoh2_e = add( tempCoh2_e, sub( absCOVls_e[i1][i3], temp_e ) ); } ELSE { temp_e = add( lsEnergy_e[i1], lsEnergy_e[i3] ); - tempCoh2_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i3][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); + tempCoh2_fx = BASOP_Util_Divide3232_Scale_newton( absCOVls_fx[i3][i1], ( Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ) ), &tempCoh2_e ); tempCoh2_e = add( tempCoh2_e, sub( absCOVls_e[i3][i1], temp_e ) ); } - tempCoh2_fx = L_shl( tempCoh2_fx, 16 ); IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( tempCoh_fx, tempCoh_e, tempCoh2_fx, tempCoh2_e ), -1 ) ) { cohPanCoh_fx = tempCoh_fx; -- GitLab From 9e299235f6a74d62147a87ed46d79cf2fcd9e6c6 Mon Sep 17 00:00:00 2001 From: Fabian Bauer Date: Tue, 1 Jul 2025 08:09:24 +0200 Subject: [PATCH 1092/1310] buildfix --- lib_enc/enc_gen_voic_rf_fx.c | 2 +- lib_enc/set_impulse_fx.c | 2 +- lib_enc/stat_noise_uv_enc_fx.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/enc_gen_voic_rf_fx.c b/lib_enc/enc_gen_voic_rf_fx.c index 79dc33d82..8d9e1e1a1 100644 --- a/lib_enc/enc_gen_voic_rf_fx.c +++ b/lib_enc/enc_gen_voic_rf_fx.c @@ -450,7 +450,7 @@ void coder_acelp_rf_fx( hRF->rf_mem_w0 = sub_o( xn[L_SUBFR - 1], round_fx_o( L_shl_o( Ltmp, 1, &Overflow ), &Overflow ), &Overflow ); /* Q_xn */ move16(); #ifdef ISSUE_1772_replace_shr_o - hRF->rf_mem_w0 = shr_sat( hRF->rf_mem_w0, shift, &Overflow ); /*Qnew-1*/ + hRF->rf_mem_w0 = shr_sat( hRF->rf_mem_w0, shift ); /*Qnew-1*/ #else hRF->rf_mem_w0 = shr_o( hRF->rf_mem_w0, shift, &Overflow ); /*Qnew-1*/ #endif diff --git a/lib_enc/set_impulse_fx.c b/lib_enc/set_impulse_fx.c index f6f7b6dd5..364d78f97 100644 --- a/lib_enc/set_impulse_fx.c +++ b/lib_enc/set_impulse_fx.c @@ -202,7 +202,7 @@ void set_impulse_fx( num = div_s( num, den ); #ifdef ISSUE_1772_replace_shr_o - krit_fx = shr_sat( num, sub( sub( shl_o( exp_num, 1, &Overflow ), exp_den ), 2 ), &Overflow ); /* Q18 */ + krit_fx = shr_sat( num, sub( sub( shl_o( exp_num, 1, &Overflow ), exp_den ), 2 ) ); /* Q18 */ #else krit_fx = shr_o( num, sub( sub( shl_o( exp_num, 1, &Overflow ), exp_den ), 2 ), &Overflow ); /* Q18 */ #endif diff --git a/lib_enc/stat_noise_uv_enc_fx.c b/lib_enc/stat_noise_uv_enc_fx.c index 5dcb6d444..8dfb40738 100644 --- a/lib_enc/stat_noise_uv_enc_fx.c +++ b/lib_enc/stat_noise_uv_enc_fx.c @@ -70,7 +70,7 @@ void stat_noise_uv_enc_fx( den = extract_h( L_shl_o( LepsP[1], expd, &Overflow ) ); /*expd-16*/ num = div_s( num, den ); /*expn-expd+15*/ #ifdef ISSUE_1772_replace_shr_o - num = shr_sat( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ + num = shr_sat( num, add( sub( expn, expd ), 5 ) ); /*Q10*/ #else num = shr_o( num, add( sub( expn, expd ), 5 ), &Overflow ); /*Q10*/ #endif -- GitLab From 9332ccdec7af282aceb93b5841e2ec7d358dee7d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 27 Jun 2025 10:58:14 +0530 Subject: [PATCH 1093/1310] Non bit exact optimizations in sba dec path Max MLD deviation observed < 0.1 normalizePanningGains_fx, dirac_out_synth_sfr, ivas_mdct_core_tns_ns_fx, ivas_mct_dec functions changed --- lib_com/ivas_prot_fx.h | 15 +++- lib_com/options.h | 1 + lib_com/prot_fx.h | 8 +- lib_dec/dec_tcx_fx.c | 6 ++ lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 9 +++ lib_dec/ivas_mct_core_dec_fx.c | 25 +++++- lib_dec/ivas_mct_dec_fx.c | 32 +++++++- lib_dec/ivas_mct_dec_mct_fx_fx.c | 29 +++++++ lib_dec/ivas_mdct_core_dec_fx.c | 84 +++++++++++++++++++- lib_dec/ivas_stereo_mdct_core_dec_fx.c | 21 ++++- lib_dec/tonalMDCTconcealment_fx.c | 14 +++- 11 files changed, 231 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index e35cf648c..9e9e65bb7 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1575,7 +1575,12 @@ void ivas_mdct_core_tns_ns_fx( Word32 *x_fx[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ Word32 Aq_fx[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* o : LP coefficients */ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ - Word16 x_e[CPE_CHANNELS][NB_DIV] ); +#ifdef OPT_SBA_DEC_V2_NBE + Word16 x_e +#else /* OPT_SBA_DEC_V2_NBE */ + Word16 x_e[CPE_CHANNELS][NB_DIV] +#endif /* OPT_SBA_DEC_V2_NBE */ +); void decoder_tcx_imdct_fx( Decoder_State *st, /* i/o: coder memory state */ @@ -1936,9 +1941,17 @@ void ivas_mdct_core_invQ_fx( Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ Word32 *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ +#ifdef OPT_SBA_DEC_V2_NBE + Word16 x_0_e, +#else /* OPT_SBA_DEC_V2_NBE */ Word16 x_0_e[CPE_CHANNELS][NB_DIV], +#endif /* OPT_SBA_DEC_V2_NBE */ Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ +#ifdef OPT_SBA_DEC_V2_NBE + Word16 x_e, +#else /* OPT_SBA_DEC_V2_NBE */ Word16 x_e[CPE_CHANNELS][NB_DIV], +#endif /* OPT_SBA_DEC_V2_NBE */ Word16 x_len[CPE_CHANNELS][NB_DIV], Word16 Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients */ Word16 ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ diff --git a/lib_com/options.h b/lib_com/options.h index baac02d0d..450b94c16 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -78,6 +78,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V2_NBE +#define OPT_SBA_DEC_V2_NBE #define OPT_MCT_ENC_V1_NBE #define OPT_MCT_ENC_V1_BE #define OPT_SBA_REND_V1_BE diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 666484359..3144c16dd 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -6412,9 +6412,13 @@ void TonalMDCTConceal_Apply( ); void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, /*IN/OUT*/ + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, /*IN/OUT*/ +#ifdef OPT_SBA_DEC_V2_NBE + Word16 mdctSpectrum_exp, /*IN */ +#else /* OPT_SBA_DEC_V2_NBE */ Word16 mdctSpectrum_exp[L_FRAME48k], /*IN */ +#endif /* OPT_SBA_DEC_V2_NBE */ const PsychoacousticParameters *psychParamsCurrent ); void TonalMDCTConceal_InsertNoise_ivas_fx( diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 41c3f9740..6590d4b43 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -4761,14 +4761,19 @@ void decoder_tcx_noiseshaping_igf_fx( test(); IF( bfi && st->tonal_mdct_plc_active && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { +#ifndef OPT_SBA_DEC_V2_NBE Word16 tmp_x_fx_exp[L_FRAME48k], temp; temp = -MAX_16; move16(); set16_fx( tmp_x_fx_exp, *x_e, L_frameTCX ); TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, tmp_x_fx_exp, st->hTcxCfg->psychParamsCurrent ); +#else /* OPT_SBA_DEC_V2_NBE */ + TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, *x_e, st->hTcxCfg->psychParamsCurrent ); +#endif /* OPT_SBA_DEC_V2_NBE */ /* If exponent has been updated after TonalMDCTConceal_Apply, then shift the spectrum to common exponent. */ +#ifndef OPT_SBA_DEC_V2_NBE FOR( i = 0; i < L_frameTCX; i++ ) { temp = s_max( temp, tmp_x_fx_exp[i] ); @@ -4783,6 +4788,7 @@ void decoder_tcx_noiseshaping_igf_fx( move32(); } } +#endif /* OPT_SBA_DEC_V2_NBE */ } test(); diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index 532ca0358..4869f8d1c 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -591,10 +591,14 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( /* apply residual mixing */ { Word16 shifter; +#ifdef OPT_SBA_DEC_V2_NBE + shifter = sub( mixing_matrix_res_smooth_e, 32 ); +#else /* OPT_SBA_DEC_V2_NBE */ #ifdef OPT_SBA_DEC_V2_BE shifter = sub( mixing_matrix_res_smooth_e, 31 ); #else /* OPT_SBA_DEC_V2_BE */ shifter = 31 - mixing_matrix_res_smooth_e; +#endif /* OPT_SBA_DEC_V2_NBE */ #endif /* OPT_SBA_DEC_V2_BE */ FOR( ch_idx = 0; ch_idx < nY; ch_idx++ ) { @@ -610,8 +614,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot_fx( move64(); for ( i = 0; i < nY; i++ ) { +#ifdef OPT_SBA_DEC_V2_NBE + temp_real = W_mac_32_32( temp_real, mixing_matrix_res_smooth_fx[idx], diff_f_real_fx[i] ); + temp_imag = W_mac_32_32( temp_imag, mixing_matrix_res_smooth_fx[idx], diff_f_imag_fx[i] ); +#else /* OPT_SBA_DEC_V2_NBE */ temp_real = W_add( temp_real, W_mult0_32_32( mixing_matrix_res_smooth_fx[idx], diff_f_real_fx[i] ) ); temp_imag = W_add( temp_imag, W_mult0_32_32( mixing_matrix_res_smooth_fx[idx], diff_f_imag_fx[i] ) ); +#endif /* OPT_SBA_DEC_V2_NBE */ idx += nY; } #ifdef OPT_SBA_DEC_V2_BE diff --git a/lib_dec/ivas_mct_core_dec_fx.c b/lib_dec/ivas_mct_core_dec_fx.c index 08359826a..87c139f9c 100644 --- a/lib_dec/ivas_mct_core_dec_fx.c +++ b/lib_dec/ivas_mct_core_dec_fx.c @@ -256,7 +256,11 @@ void ivas_mct_core_dec( move16(); x_fx[ch][0] = signal_out_fx[ch]; x_fx[ch][1] = signal_out_fx[ch] + ( L_FRAME48k / 2 ); +#ifdef OPT_SBA_DEC_V2_NBE + q_x[ch] = Q11; +#else /* OPT_SBA_DEC_V2_NBE */ q_x[ch] = Q12; +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); } @@ -332,7 +336,7 @@ void ivas_mct_core_dec( move16(); } } -#else /* OPT_SBA_DEC_PATH */ +#else /* OPT_SBA_DEC_PATH */ IF( EQ_16( st->core, TCX_10_CORE ) ) { nSubframes = NB_DIV; @@ -362,10 +366,18 @@ void ivas_mct_core_dec( move16(); FOR( i = 0; i < x_len; i++ ) { +#ifdef OPT_SBA_DEC_V2_NBE + x_fx[ch][k][i] = L_shr( x_fx[ch][k][i], sub( q_x[ch], Q11 ) ); +#else /* OPT_SBA_DEC_V2_NBE */ x_fx[ch][k][i] = L_shr( x_fx[ch][k][i], sub( q_x[ch], Q12 ) ); +#endif /* OPT_SBA_DEC_V2_NBE */ move32(); } +#ifdef OPT_SBA_DEC_V2_NBE + q_x[ch] = Q11; +#else /* OPT_SBA_DEC_V2_NBE */ q_x[ch] = Q12; +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); } #endif /* OPT_SBA_DEC_PATH */ @@ -385,18 +397,27 @@ void ivas_mct_core_dec( #ifdef OPT_SBA_DEC_PATH apply_MCT_dec_fx( hMCT, sts, x_fx ); -#else /* OPT_SBA_DEC_PATH */ +#else /* OPT_SBA_DEC_PATH */ apply_MCT_dec_fx( hMCT, sts, x_fx, q_x ); FOR( ch = 0; ch < nChannels; ch++ ) { FOR( i = 0; i < L_FRAME48k / 2; i++ ) { +#ifdef OPT_SBA_DEC_V2_NBE + x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], sub( q_x[ch], Q11 ) ); + x_fx[ch][1][i] = L_shr( x_fx[ch][1][i], sub( q_x[ch], Q11 ) ); +#else /* OPT_SBA_DEC_V2_NBE */ x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], sub( q_x[ch], Q12 ) ); x_fx[ch][1][i] = L_shr( x_fx[ch][1][i], sub( q_x[ch], Q12 ) ); +#endif /* OPT_SBA_DEC_V2_NBE */ move32(); move32(); } +#ifdef OPT_SBA_DEC_V2_NBE + q_x[ch] = Q11; +#else /* OPT_SBA_DEC_V2_NBE */ q_x[ch] = Q12; +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); } #endif /* OPT_SBA_DEC_PATH */ diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index ec7b8c697..ccc515b03 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -64,7 +64,7 @@ ivas_error ivas_mct_dec_fx( const Word16 nb_bits_metadata /* i : number of metadata bits */ ) { - Word16 ch, nCPE, cpe_id; + Word16 nCPE, cpe_id; MCT_DEC_HANDLE hMCT; CPE_DEC_HANDLE hCPE; Word16 param[MCT_MAX_BLOCKS][CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV]; @@ -76,10 +76,13 @@ ivas_error ivas_mct_dec_fx( Word16 Aq_fx[MCT_MAX_BLOCKS][CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )]; // Q12 Word32 output_lfe_ch_fx[L_FRAME48k]; Word16 q_output = 11; - Word16 n, k, i; + Word16 n, i; Word32 *x_fx[CPE_CHANNELS][NB_DIV]; //(Q(31 - x_e) +#ifndef OPT_SBA_DEC_V2_NBE Word16 x_e[MAX_CICP_CHANNELS][NB_DIV]; + Word16 ch, k; +#endif /* OPT_SBA_DEC_V2_NBE */ Word16 x_len[CPE_CHANNELS][NB_DIV]; set16_fx( x_len[0], 0, NB_DIV ); set16_fx( x_len[1], 0, NB_DIV ); @@ -182,21 +185,31 @@ ivas_error ivas_mct_dec_fx( FOR( n = 0; n < CPE_CHANNELS; n++ ) { x_fx[n][0] = output_fx[n + ( cpe_id * CPE_CHANNELS )]; // Q11 +#ifndef OPT_SBA_DEC_V2_NBE x_e[n][0] = 20; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); x_fx[n][1] = output_fx[n + ( cpe_id * CPE_CHANNELS )] + ( L_FRAME48k / 2 ); // Q11 +#ifndef OPT_SBA_DEC_V2_NBE x_e[n][1] = 20; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); set32_fx( x_fx[n][0], 0, L_FRAME48k / 2 ); set32_fx( x_fx[n][1], 0, L_FRAME48k / 2 ); } +#ifndef OPT_SBA_DEC_V2_NBE ivas_mdct_core_invQ_fx( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], fUseTns[cpe_id], tnsData[cpe_id], x_fx, x_e, x_fx, x_e, x_len, Aq_fx[cpe_id], NULL, 1 ); +#else /* OPT_SBA_DEC_V2_NBE */ + ivas_mdct_core_invQ_fx( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], + fUseTns[cpe_id], tnsData[cpe_id], x_fx, 20, x_fx, 20, x_len, Aq_fx[cpe_id], NULL, 1 ); +#endif /* OPT_SBA_DEC_V2_NBE */ +#ifndef OPT_SBA_DEC_V2_NBE FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { Word16 subFrames; @@ -214,6 +227,7 @@ ivas_error ivas_mct_dec_fx( Scale_sig32( x_fx[ch][k], shr( L_FRAME48k, sub( subFrames, 1 ) ), sub( x_e[ch][k], 20 ) ); // Scaling back to Q11 } } +#endif /* OPT_SBA_DEC_V2_NBE */ st_ivas->BER_detect = s_or( st_ivas->BER_detect, st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect ); move16(); @@ -224,18 +238,22 @@ ivas_error ivas_mct_dec_fx( /* MCT core decoder */ Word16 q_x[MAX_TRANSPORT_CHANNELS]; +#ifndef OPT_SBA_DEC_V2_NBE set16_fx( q_x, Q12, MAX_TRANSPORT_CHANNELS ); // Scaling output buffer to q_x FOR( i = 0; i < hMCT->nchan_out_woLFE; ++i ) { Scale_sig32( output_fx[i], L_FRAME48k, sub( q_x[i], Q11 ) ); // Q11 -> Q12 } +#endif /* OPT_SBA_DEC_V2_NBE */ ivas_mct_core_dec( hMCT, st_ivas->hCPE, nCPE, output_fx, q_x ); // Scaling output buffer back to Q11 +#ifndef OPT_SBA_DEC_V2_NBE FOR( i = 0; i < hMCT->nchan_out_woLFE; ++i ) { Scale_sig32( output_fx[i], L_FRAME48k, sub( Q11, q_x[i] ) ); // Q12 -> Q11 } +#endif /* OPT_SBA_DEC_V2_NBE */ /* for sba to stereo output disable any further processing for TCs > 2 as it is not needed*/ @@ -263,16 +281,25 @@ ivas_error ivas_mct_dec_fx( Copy_Scale_sig_16_32_DEPREC( Aq_fx[cpe_id][n], Aq_fx_32[cpe_id][n], 102, Q16 - Q12 ); // Q16 x_fx[n][0] = output_fx[n + ( cpe_id * CPE_CHANNELS )]; // Q11 x_fx[n][1] = output_fx[n + ( cpe_id * CPE_CHANNELS )] + ( L_FRAME48k / 2 ); // Q11 +#ifndef OPT_SBA_DEC_V2_NBE x_e[n][0] = 20; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); move16(); +#ifndef OPT_SBA_DEC_V2_NBE x_e[n][1] = 20; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ } +#ifndef OPT_SBA_DEC_V2_NBE ivas_mdct_core_tns_ns_fx( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x_fx, Aq_fx_32[cpe_id], 1, x_e ); +#else /* OPT_SBA_DEC_V2_NBE */ + ivas_mdct_core_tns_ns_fx( hCPE, fUseTns[cpe_id], tnsData[cpe_id], x_fx, Aq_fx_32[cpe_id], 1, 20 ); +#endif /* OPT_SBA_DEC_V2_NBE */ +#ifndef OPT_SBA_DEC_V2_NBE FOR( Word16 ind = 0; ind < 2; ind++ ) { Word16 nSubFrames; @@ -291,6 +318,7 @@ ivas_error ivas_mct_dec_fx( Scale_sig32( x_fx[ind][1], shr( L_FRAME48k, 1 ), sub( x_e[ind][1], 20 ) ); // Q11 } } +#endif /* OPT_SBA_DEC_V2_NBE */ } diff --git a/lib_dec/ivas_mct_dec_mct_fx_fx.c b/lib_dec/ivas_mct_dec_mct_fx_fx.c index 0d998b355..f470ac9cd 100644 --- a/lib_dec/ivas_mct_dec_mct_fx_fx.c +++ b/lib_dec/ivas_mct_dec_mct_fx_fx.c @@ -323,8 +323,13 @@ void mctStereoIGF_dec_fx( move16(); // Using input Q-factor as 12 +#ifdef OPT_SBA_DEC_V2_NBE + set16_fx( p_x_e[0], 31 - Q11, CPE_CHANNELS ); // Q12 + set16_fx( p_x_e[1], 31 - Q11, CPE_CHANNELS ); // Q12 +#else /* OPT_SBA_DEC_V2_NBE */ set16_fx( p_x_e[0], 31 - Q12, CPE_CHANNELS ); // Q12 set16_fx( p_x_e[1], 31 - Q12, CPE_CHANNELS ); // Q12 +#endif /* OPT_SBA_DEC_V2_NBE */ FOR( k = 0; k < nSubframes; k++ ) { @@ -353,13 +358,21 @@ void mctStereoIGF_dec_fx( decoder_tcx_IGF_stereo_fx( sts, hMCT->hBlockData[b]->hStereoMdct, hMCT->hBlockData[b]->mask, p_x, p_x_e, p_x_len, L_frame[0], left_rect[0], k, bfi, 1 /* MCT_flag */ ); // Shifting output with variable exponent back to Q12 +#ifdef OPT_SBA_DEC_V2_NBE + shr_k = sub( 31 - Q11, p_x_e[0][k] ); +#else /* OPT_SBA_DEC_V2_NBE */ shr_k = sub( 31 - Q12, p_x_e[0][k] ); +#endif /* OPT_SBA_DEC_V2_NBE */ FOR( Word16 i = 0; i < p_x_len[0][k]; i++ ) { p_x[0][k][i] = L_shr( p_x[0][k][i], shr_k ); move32(); } +#ifdef OPT_SBA_DEC_V2_NBE + shr_k = sub( 31 - Q11, p_x_e[1][k] ); +#else /* OPT_SBA_DEC_V2_NBE */ shr_k = sub( 31 - Q12, p_x_e[1][k] ); +#endif /* OPT_SBA_DEC_V2_NBE */ FOR( Word16 i = 0; i < p_x_len[1][k]; i++ ) { p_x[1][k][i] = L_shr( p_x[1][k][i], shr_k ); @@ -392,7 +405,11 @@ void mctStereoIGF_dec_fx( /* mono or dual mono IGF decoding */ +#ifdef OPT_SBA_DEC_V2_NBE + x_e = 31 - Q11; // input q-factor of x[p_ch[ch]][k] is Q12 +#else /* OPT_SBA_DEC_V2_NBE */ x_e = 31 - Q12; // input q-factor of x[p_ch[ch]][k] is Q12 +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); decoder_tcx_IGF_mono_fx( st, x[p_ch[ch]][k], &x_e, &x_len, L_frame[ch], left_rect[ch], bfi, k ); @@ -400,7 +417,11 @@ void mctStereoIGF_dec_fx( FOR( Word16 i = 0; i < x_len; i++ ) { // Converting from variable exponent to Fixed q-factor (Q12) +#ifdef OPT_SBA_DEC_V2_NBE + x[p_ch[ch]][k][i] = L_shr( x[p_ch[ch]][k][i], sub( 31 - Q11, x_e ) ); +#else /* OPT_SBA_DEC_V2_NBE */ x[p_ch[ch]][k][i] = L_shr( x[p_ch[ch]][k][i], sub( 31 - Q12, x_e ) ); +#endif /* OPT_SBA_DEC_V2_NBE */ move32(); } } @@ -452,7 +473,11 @@ void mctStereoIGF_dec_fx( init_tcx_info_fx( st, L_frame_nSubframe, L_frameTCX_nSubframe, k, bfi, &tcx_offset[0], &tcx_offsetFB[0], &L_frame[0], &L_frameTCX[0], &left_rect[0], &L_spec[0] ); /* mono or dual mono IGF decoding */ +#ifdef OPT_SBA_DEC_V2_NBE + x_e = 31 - Q11; // Input Q-factor is Q12. +#else /* OPT_SBA_DEC_V2_NBE */ x_e = 31 - Q12; // Input Q-factor is Q12. +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); decoder_tcx_IGF_mono_fx( st, x[ch][k], &x_e, &x_len, L_frame[0], left_rect[0], bfi, k ); @@ -460,7 +485,11 @@ void mctStereoIGF_dec_fx( FOR( Word16 i = 0; i < x_len; i++ ) { // Converting from variable exponent to Fixed q-factor (Q12) +#ifdef OPT_SBA_DEC_V2_NBE + x[ch][k][i] = L_shr( x[ch][k][i], sub( 31 - Q11, x_e ) ); +#else /* OPT_SBA_DEC_V2_NBE */ x[ch][k][i] = L_shr( x[ch][k][i], sub( 31 - Q12, x_e ) ); +#endif /* OPT_SBA_DEC_V2_NBE */ move32(); } } diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 4e90792fb..5f529be55 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -630,9 +630,17 @@ void ivas_mdct_core_invQ_fx( Word16 fUseTns[CPE_CHANNELS][NB_DIV], /* i : flag TNS enabled */ STnsData tnsData[CPE_CHANNELS][NB_DIV], /* i : TNS parameter */ Word32 *x_0[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ +#ifdef OPT_SBA_DEC_V2_NBE + Word16 x_0_e, +#else /* OPT_SBA_DEC_V2_NBE */ Word16 x_0_e[CPE_CHANNELS][NB_DIV], +#endif /* OPT_SBA_DEC_V2_NBE */ Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: signal buffer */ +#ifdef OPT_SBA_DEC_V2_NBE + Word16 x_e, +#else /* OPT_SBA_DEC_V2_NBE */ Word16 x_e[CPE_CHANNELS][NB_DIV], +#endif /* OPT_SBA_DEC_V2_NBE */ Word16 x_len[CPE_CHANNELS][NB_DIV], Word16 Aq[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* i : LP coefficients Q12*/ Word16 ms_mask[NB_DIV][MAX_SFB], /* i : M/S mask */ @@ -963,9 +971,11 @@ void ivas_mdct_core_invQ_fx( IF( EQ_32( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { +#ifndef OPT_SBA_DEC_V2_NBE set32_fx( x[ch][0], 0, st->hTcxCfg->tcx_coded_lines ); x_e[ch][0] = 31; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ /* usually set in decoder_tcx_invQ(), needed for concealment */ st->hTcxDec->damping = 0; move16(); @@ -997,6 +1007,10 @@ void ivas_mdct_core_invQ_fx( FOR( k = 0; k < nSubframes[ch]; k++ ) { +#ifdef OPT_SBA_DEC_V2_NBE + Word16 x_e_local = x_e; + Word16 j, diff; +#endif /* OPT_SBA_DEC_V2_NBE */ /* Stability Factor */ IF( !bfi ) { @@ -1031,17 +1045,38 @@ void ivas_mdct_core_invQ_fx( nf_seed = 0; move16(); - decoder_tcx_invQ_fx( st, prm[ch], Aq[ch], Aind[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e[ch][k], NULL, NULL, xn_buf, &fUseTns[ch][k], &tnsData[ch][k], &gain_tcx, &gain_tcx_e, &prm_sqQ, &nf_seed, bfi, k ); +#ifdef OPT_SBA_DEC_V2_NBE + decoder_tcx_invQ_fx( st, prm[ch], Aq[ch], Aind[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e_local, NULL, NULL, xn_buf, &fUseTns[ch][k], &tnsData[ch][k], &gain_tcx, &gain_tcx_e, &prm_sqQ, &nf_seed, bfi, k ); + diff = sub( x_e_local, x_0_e ); + IF( diff != 0 ) + { + FOR( j = 0; j < L_frameTCX[ch]; j++ ) + { + x_0[ch][k][j] = L_shl_sat( x[ch][k][j], diff ); + move32(); + } + } + ELSE + { + Copy32( x[ch][k], x_0[ch][k], L_frameTCX[ch] ); + } +#else /* OPT_SBA_DEC_V2_NBE */ + decoder_tcx_invQ_fx( st, prm[ch], Aq[ch], Aind[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e[ch][k], NULL, NULL, xn_buf, &fUseTns[ch][k], &tnsData[ch][k], &gain_tcx, &gain_tcx_e, &prm_sqQ, &nf_seed, bfi, k ); +#endif /* OPT_SBA_DEC_V2_NBE */ shift = Find_Max_Norm32( x[ch][k], L_frameTCX[ch] ); move16(); Scale_sig32( x[ch][k], L_frameTCX[ch], shift ); +#ifdef OPT_SBA_DEC_V2_NBE + x_e_local = sub( x_e_local, shift ); +#else /* OPT_SBA_DEC_V2_NBE */ x_e[ch][k] = sub( x_e[ch][k], shift ); move16(); Copy32( x[ch][k], x_0[ch][k], L_frameTCX[ch] ); x_0_e[ch][k] = x_e[ch][k]; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ // PLC to be done test(); @@ -1050,15 +1085,29 @@ void ivas_mdct_core_invQ_fx( TonalMdctConceal_create_concealment_noise_ivas_fx( concealment_noise_fx[ch], &concealment_noise_e[ch], hCPE, L_frameTCX[ch], L_frame[ch], ch, k, st->core, st->hTcxDec->cummulative_damping_tcx, noise_gen_mode_bfi ); } +#ifdef OPT_SBA_DEC_V2_NBE + decoder_tcx_noisefilling_fx( st, concealment_noise_fx[ch], concealment_noise_e[ch], Aq[ch], L_frameTCX_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e_local, NULL, NULL, &tmp_concealment_method, gain_tcx, gain_tcx_e, prm_sqQ, nf_seed, bfi, MCT_flag, k ); +#else /* OPT_SBA_DEC_V2_NBE */ decoder_tcx_noisefilling_fx( st, concealment_noise_fx[ch], concealment_noise_e[ch], Aq[ch], L_frameTCX_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], x[ch][k], &x_e[ch][k], NULL, NULL, &tmp_concealment_method, gain_tcx, gain_tcx_e, prm_sqQ, nf_seed, bfi, MCT_flag, k ); +#endif /* OPT_SBA_DEC_V2_NBE */ shift = Find_Max_Norm32( x[ch][k], L_frameTCX[ch] ); move16(); Scale_sig32( x[ch][k], L_frameTCX[ch], shift ); +#ifdef OPT_SBA_DEC_V2_NBE + x_e_local = sub( x_e_local, shift ); +#else /* OPT_SBA_DEC_V2_NBE */ x_e[ch][k] = sub( x_e[ch][k], shift ); +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); +#ifdef OPT_SBA_DEC_V2_NBE + decoder_tcx_noiseshaping_igf_fx( st, L_spec[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x[ch][k], &x_e_local, &x_len[ch][k], NULL, NULL, &tmp_concealment_method, bfi ); + + Scale_sig32( x[ch][k], L_frameTCX[ch], sub( x_e_local, x_e ) ); +#else /* OPT_SBA_DEC_V2_NBE */ decoder_tcx_noiseshaping_igf_fx( st, L_spec[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x[ch][k], &x_e[ch][k], &x_len[ch][k], NULL, NULL, &tmp_concealment_method, bfi ); +#endif /* OPT_SBA_DEC_V2_NBE */ } } } @@ -1458,7 +1507,11 @@ void ivas_mdct_core_tns_ns_fx( Word32 *x_fx[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS Q(31 - x_e)*/ Word32 Aq_fx[CPE_CHANNELS][( NB_SUBFR16k + 1 ) * ( M + 1 )], /* o : LP coefficients Q16*/ const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ +#ifdef OPT_SBA_DEC_V2_NBE + Word16 x_e ) +#else /* OPT_SBA_DEC_V2_NBE */ Word16 x_e[CPE_CHANNELS][NB_DIV] ) +#endif /* OPT_SBA_DEC_V2_NBE */ { Word16 ch, k, bfi; Decoder_State **sts, *st; @@ -1532,7 +1585,11 @@ void ivas_mdct_core_tns_ns_fx( &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); Word16 q_x; +#ifdef OPT_SBA_DEC_V2_NBE + q_x = sub( 31, x_e ); +#else /* OPT_SBA_DEC_V2_NBE */ q_x = sub( 31, x_e[ch][k] ); +#endif /* OPT_SBA_DEC_V2_NBE */ IF( bfi == 0 ) { sns_interpolate_scalefactors_fx( sns_int_scf_fx, &Aq_fx[ch][k * M], DEC ); // Q16 @@ -1551,7 +1608,11 @@ void ivas_mdct_core_tns_ns_fx( scf_e[ind] = sub( 15, q_shift ); move16(); } +#ifdef OPT_SBA_DEC_V2_NBE + TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], x_e, L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); +#else /* OPT_SBA_DEC_V2_NBE */ TonalMDCTConceal_SaveFreqSignal_ivas_fx( st->hTonalMDCTConc, x_fx[ch][k], x_e[ch][k], L_frameTCX[ch], L_frame[ch], &scf_fx[0], scf_e, 0, get_igf_startline( st, L_frame[ch], L_frameTCX[ch] ) ); +#endif /* OPT_SBA_DEC_V2_NBE */ } } ELSE @@ -1613,8 +1674,10 @@ void ivas_mdct_core_tns_ns_fx( norm_x = getScaleFactor32( &x_fx[ch][k][0], length ); Scale_sig32( &x_fx[ch][k][0], length, norm_x ); q_x = add( q_x, norm_x ); +#ifndef OPT_SBA_DEC_V2_NBE x_e[ch][k] = sub( 31, q_x ); move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ Word16 q_sns_int_scf; Word16 q_2; @@ -1641,8 +1704,10 @@ void ivas_mdct_core_tns_ns_fx( Scale_sig32( &x_fx[ch][k][0] + length, sub( length2, length ), sub( add( q_x, 1 ), q_2 ) ); q_x = add( q_x, 1 ); } +#ifndef OPT_SBA_DEC_V2_NBE x_e[ch][k] = sub( 31, q_x ); move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ v_multc_fixed( x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sns_int_scf_fx[FDNS_NPTS - 1], x_fx[ch][k] + st->hTcxCfg->psychParamsCurrent->nBins, sub( L_spec[ch], st->hTcxCfg->psychParamsCurrent->nBins ) ); @@ -1650,8 +1715,10 @@ void ivas_mdct_core_tns_ns_fx( Scale_sig32( &x_fx[ch][k][0], st->hTcxCfg->psychParamsCurrent->nBins, sub( q_2, q_x ) ); q_x = q_2; move16(); +#ifndef OPT_SBA_DEC_V2_NBE x_e[ch][k] = sub( 31, q_x ); move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ q_x = sub( q_x, 5 ); length = L_frameTCX[ch]; @@ -1668,25 +1735,37 @@ void ivas_mdct_core_tns_ns_fx( } Scale_sig32( &x_fx[ch][k][0], length, -5 ); decoder_tcx_tns_fx( st, L_frame_global[ch], L_spec[ch], L_frame[ch], L_frameTCX[ch], &x_fx[ch][k][0], fUseTns[ch][k], &tnsData[ch][k], bfi, k, 0, &length ); +#ifndef OPT_SBA_DEC_V2_NBE norm_x = getScaleFactor32( &x_fx[ch][k][0], length ); Scale_sig32( &x_fx[ch][k][0], length, norm_x ); q_x = add( q_x, norm_x ); x_e[ch][k] = sub( 31, q_x ); move16(); +#else /* OPT_SBA_DEC_V2_NBE */ + Scale_sig32( &x_fx[ch][k][0], length, sub( sub( 31, q_x ), x_e ) ); +#endif /* OPT_SBA_DEC_V2_NBE */ } IF( ( bfi != 0 ) && ( st->tonal_mdct_plc_active != 0 ) ) { - Word16 tmp_x_fx_exp[L_FRAME48k], temp = -MAX_16, i; +#ifndef OPT_SBA_DEC_V2_NBE + Word16 tmp_x_fx_exp[L_FRAME48k], temp = -MAX_16; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ + Word16 i; FOR( i = 0; i < FDNS_NPTS; i++ ) { st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e = s_max( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); } +#ifndef OPT_SBA_DEC_V2_NBE set16_fx( tmp_x_fx_exp, x_e[ch][0], L_FRAME48k ); TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], tmp_x_fx_exp, st->hTcxCfg->psychParamsCurrent ); +#else /* OPT_SBA_DEC_V2_NBE */ + TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], x_e, st->hTcxCfg->psychParamsCurrent ); +#endif /* OPT_SBA_DEC_V2_NBE */ +#ifndef OPT_SBA_DEC_V2_NBE FOR( i = 0; i < L_FRAME48k; i++ ) { temp = s_max( temp, tmp_x_fx_exp[i] ); @@ -1701,6 +1780,7 @@ void ivas_mdct_core_tns_ns_fx( move32(); } } +#endif /* OPT_SBA_DEC_V2_NBE */ } test(); diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 85ae00c90..b52d04951 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -178,7 +178,9 @@ void stereo_mdct_core_dec_fx( /*needed to allocate N_MAX to prevent stereo switching crash */ Word32 x_0_buf_fx[CPE_CHANNELS][N_MAX]; Word32 *x_0_fx[CPE_CHANNELS][NB_DIV]; +#ifndef OPT_SBA_DEC_V2_NBE Word16 x_0_e[CPE_CHANNELS][NB_DIV]; +#endif /* OPT_SBA_DEC_V2_NBE */ /* Concealment */ Word16 bfi; @@ -289,15 +291,24 @@ void stereo_mdct_core_dec_fx( { FOR( j = 0; j < NB_DIV; ++j ) { +#ifndef OPT_SBA_DEC_V2_NBE x_e[i][j] = 31; +#else /* OPT_SBA_DEC_V2_NBE */ + x_e[i][j] = 20; +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); x_len[i][j] = 0; move16(); +#ifndef OPT_SBA_DEC_V2_NBE x_0_e[i][j] = 31; move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ } } +#ifdef OPT_SBA_DEC_V2_NBE + ivas_mdct_core_invQ_fx( hCPE, nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0_fx, 20, x_fx, 20, x_len, Aq_fx, ms_mask, 0 ); +#else /* OPT_SBA_DEC_V2_NBE */ ivas_mdct_core_invQ_fx( hCPE, nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0_fx, x_0_e, x_fx, x_e, x_len, Aq_fx, ms_mask, 0 ); FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -323,6 +334,7 @@ void stereo_mdct_core_dec_fx( move16(); } } +#endif /* OPT_SBA_DEC_V2_NBE */ FOR( ch = 0; ch < nChannels; ch++ ) { @@ -471,6 +483,8 @@ void stereo_mdct_core_dec_fx( move16(); #endif /* OPT_SBA_DEC_PATH */ +#ifndef OPT_SBA_DEC_V2_NBE + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { if ( NE_16( hCPE->hCoreCoder[ch]->core, TCX_20_CORE ) ) @@ -479,6 +493,7 @@ void stereo_mdct_core_dec_fx( move16(); } } +#endif /* OPT_SBA_DEC_V2_NBE */ #ifdef OPT_SBA_DEC_PATH stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0_fx[1], x_fx[0], x_fx[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0 ); #else /* OPT_SBA_DEC_PATH */ @@ -486,6 +501,10 @@ void stereo_mdct_core_dec_fx( #endif /* OPT_SBA_DEC_PATH */ } +#ifdef OPT_SBA_DEC_V2_NBE + ivas_mdct_core_tns_ns_fx( hCPE, fUseTns, tnsData, x_fx, Aq_fx_32, 0, 20 ); +#else /* OPT_SBA_DEC_V2_NBE */ + ivas_mdct_core_tns_ns_fx( hCPE, fUseTns, tnsData, x_fx, Aq_fx_32, 0, x_e ); FOR( Word16 ind = 0; ind < 2; ind++ ) @@ -511,7 +530,7 @@ void stereo_mdct_core_dec_fx( move16(); } } - +#endif /* OPT_SBA_DEC_V2_NBE */ test(); test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index f61fe276e..9582463eb 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -2587,9 +2587,13 @@ void TonalMDCTConceal_Apply( } void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ - Word16 mdctSpectrum_exp[L_FRAME_MAX], /*IN */ + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, // Q31-*mdctSpectrum_exp /*IN/OUT*/ +#ifdef OPT_SBA_DEC_V2_NBE + Word16 mdctSpectrum_exp, /*IN */ +#else /* OPT_SBA_DEC_V2_NBE */ + Word16 mdctSpectrum_exp[L_FRAME_MAX], /*IN */ +#endif /* OPT_SBA_DEC_V2_NBE */ const PsychoacousticParameters *psychParamsCurrent ) { @@ -2755,8 +2759,12 @@ void TonalMDCTConceal_Apply_ivas_fx( /* getCosWord16 returns 1Q14*/ mdctSpectrum[l] = Mpy_32_16_1( powerSpectrum[l], getCosWord16( extract_l( currentPhase ) ) ); move32(); +#ifdef OPT_SBA_DEC_V2_NBE + mdctSpectrum[l] = L_shr( mdctSpectrum[l], sub( mdctSpectrum_exp, add( powerSpectrum_exp, 1 ) ) ); +#else /* OPT_SBA_DEC_V2_NBE */ mdctSpectrum_exp[l] = add( powerSpectrum_exp, 1 ); // getCosWord16 returns Q14 (exp is 1)d move16(); +#endif /* OPT_SBA_DEC_V2_NBE */ } } } -- GitLab From 27ed4d5cb64596422a8690816f45956ae3def7e6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 1 Jul 2025 11:58:19 +0530 Subject: [PATCH 1094/1310] Q update in mct core dec --- lib_dec/ivas_mct_core_dec_fx.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib_dec/ivas_mct_core_dec_fx.c b/lib_dec/ivas_mct_core_dec_fx.c index 87c139f9c..bc2471e24 100644 --- a/lib_dec/ivas_mct_core_dec_fx.c +++ b/lib_dec/ivas_mct_core_dec_fx.c @@ -300,14 +300,22 @@ void ivas_mct_core_dec( /* mono or dual mono IGF decoding */ x_e = sub( 31, q_x[ch] ); decoder_tcx_IGF_mono_fx( st, x_fx[ch][k], &x_e, &x_len, L_frame, left_rect, bfi, k ); +#ifdef OPT_SBA_DEC_V2_NBE + q_x[ch] = sub( 31 - 11, x_e ); // Shift to bring x to Q12 +#else /* OPT_SBA_DEC_V2_NBE */ q_x[ch] = sub( 31 - 12, x_e ); // Shift to bring x to Q12 +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); FOR( i = 0; i < x_len; i++ ) { x_fx[ch][k][i] = L_shr( x_fx[ch][k][i], q_x[ch] ); move32(); } +#ifdef OPT_SBA_DEC_V2_NBE + q_x[ch] = Q11; +#else /* OPT_SBA_DEC_V2_NBE */ q_x[ch] = Q12; +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); } } @@ -325,14 +333,22 @@ void ivas_mct_core_dec( /* mono or dual mono IGF decoding */ x_e = sub( 31, q_x[ch] ); decoder_tcx_IGF_mono_fx( st, x_fx[ch][0], &x_e, &x_len, L_frame, left_rect, bfi, 0 ); +#ifdef OPT_SBA_DEC_V2_NBE + q_x[ch] = sub( 31 - 11, x_e ); // Shift to bring x to Q12 +#else /* OPT_SBA_DEC_V2_NBE */ q_x[ch] = sub( 31 - 12, x_e ); // Shift to bring x to Q12 +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); FOR( i = 0; i < x_len; i++ ) { x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], q_x[ch] ); move32(); } +#ifdef OPT_SBA_DEC_V2_NBE + q_x[ch] = Q11; +#else /* OPT_SBA_DEC_V2_NBE */ q_x[ch] = Q12; +#endif /* OPT_SBA_DEC_V2_NBE */ move16(); } } -- GitLab From a81a25447c601e70ae7152117d5fe5a924714c56 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 1 Jul 2025 16:34:29 +0530 Subject: [PATCH 1095/1310] Multichannel decoder path optimizations - bit exact --- lib_com/options.h | 1 + lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 30 ++++++++- lib_dec/ivas_svd_dec_fx.c | 19 ++++-- lib_rend/ivas_dirac_decorr_dec_fx.c | 69 +++++++++++++++++++- 4 files changed, 112 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 450b94c16..0fda6f452 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -77,6 +77,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_MCH_DEC_V1_BE #define OPT_MCT_ENC_V2_NBE #define OPT_SBA_DEC_V2_NBE #define OPT_MCT_ENC_V1_NBE diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index 4869f8d1c..ea03e1ddb 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -895,9 +895,13 @@ Word16 computeMixingMatrices_fx( } } - L_tmp = Mpy_32_32( limit_fx, reg_Sx_fx ); limit_e = add( limit_e, reg_Sx_e ); +#ifdef OPT_MCH_DEC_V1_BE + limit_fx = Madd_32_32( EPSILON_FX, limit_fx, reg_Sx_fx ); +#else /* OPT_MCH_DEC_V1_BE */ + L_tmp = Mpy_32_32( limit_fx, reg_Sx_fx ); limit_fx = L_add( L_tmp, EPSILON_FX ); +#endif /* OPT_MCH_DEC_V1_BE */ FOR( i = 0; i < lengthCx; ++i ) { @@ -956,8 +960,12 @@ Word16 computeMixingMatrices_fx( move16(); } } +#ifdef OPT_MCH_DEC_V1_BE + limit_fx = Madd_32_32( EPSILON_FX, limit_fx, reg_ghat_fx ); // limit_e+ reg_ghat_e +#else /* OPT_MCH_DEC_V1_BE */ L_tmp = Mpy_32_32( limit_fx, reg_ghat_fx ); // limit_e+ reg_ghat_e limit_fx = L_add( L_tmp, EPSILON_FX ); +#endif /* OPT_MCH_DEC_V1_BE */ limit_e = add( limit_e, reg_ghat_e ); FOR( i = 0; i < lengthCy; ++i ) @@ -1436,8 +1444,12 @@ Word16 computeMixingMatricesResidual_fx( } } +#ifdef OPT_MCH_DEC_V1_BE + limit_fx = Madd_32_32( EPSILON_FX, limit_fx, reg_ghat_fx ); // Q(limit_e+reg_ghat_e) +#else /* OPT_MCH_DEC_V1_BE */ L_tmp = Mpy_32_32( limit_fx, reg_ghat_fx ); // Q(limit_e+reg_ghat_e) limit_fx = L_add( L_tmp, EPSILON_FX ); +#endif /* OPT_MCH_DEC_V1_BE */ limit_e = add( limit_e, reg_ghat_e ); /* Computing G_hat */ @@ -1468,8 +1480,12 @@ Word16 computeMixingMatricesResidual_fx( FOR( i = 0; i < num_outputs; i++ ) { +#ifdef OPT_MCH_DEC_V1_BE + Kx_fx[i] = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); // Q(31-(Kx_fx_e+G_hag_e)) +#else /* OPT_MCH_DEC_V1_BE */ L_tmp = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); // Q(31-(Kx_fx_e+G_hag_e)) Kx_fx[i] = L_tmp; +#endif /* OPT_MCH_DEC_V1_BE */ move32(); Kx_fx_e[i] = add( Kx_fx_e[i], G_hat_e[i] ); move16(); @@ -1483,11 +1499,18 @@ Word16 computeMixingMatricesResidual_fx( FOR( j = 0; j < num_outputs; j++ ) { +#ifdef OPT_MCH_DEC_V1_BE + mat_mult_buffer1_fx[i + j * num_outputs] = Mpy_32_32( Ky_fx[i + j * num_outputs], fac_fx ); // Q(31-(Ky_fx_e+Kx_fx_e)); + move32(); + mat_mult_buffer1_buff_e[i + j * num_outputs] = add( Ky_fx_e[i + j * num_outputs], Kx_fx_e[i] ); + move16(); +#else /* OPT_MCH_DEC_V1_BE */ L_tmp = Mpy_32_32( Ky_fx[i + j * num_outputs], fac_fx ); // Q(31-(Ky_fx_e+Kx_fx_e)) mat_mult_buffer1_fx[i + j * num_outputs] = L_tmp; move32(); mat_mult_buffer1_buff_e[i + j * num_outputs] = extract_l( L_add( Ky_fx_e[i + j * num_outputs], Kx_fx_e[i] ) ); move16(); +#endif /* OPT_MCH_DEC_V1_BE */ } } @@ -1543,9 +1566,14 @@ Word16 computeMixingMatricesResidual_fx( FOR( j = 0; j < num_outputs; j++ ) { +#ifdef OPT_MCH_DEC_V1_BE + mixing_matrix_fx[j + i * num_outputs] = Mpy_32_32( mat_mult_buffer1_fx[j + i * num_outputs], fac_fx ); // Q(31-mat_mult_buffer1_e+Kx_reg_inv_e); + move32(); +#else /* OPT_MCH_DEC_V1_BE */ L_tmp = Mpy_32_32( mat_mult_buffer1_fx[j + i * num_outputs], fac_fx ); // Q(31-mat_mult_buffer1_e+Kx_reg_inv_e) mixing_matrix_fx[j + i * num_outputs] = L_tmp; move32(); +#endif /* OPT_MCH_DEC_V1_BE */ mixing_matrix_fx_e[j + i * num_outputs] = add( mat_mult_buffer1_buff_e[j + i * num_outputs], Kx_reg_inv_e[i] ); move16(); } diff --git a/lib_dec/ivas_svd_dec_fx.c b/lib_dec/ivas_svd_dec_fx.c index 4b0522884..2afe48db6 100644 --- a/lib_dec/ivas_svd_dec_fx.c +++ b/lib_dec/ivas_svd_dec_fx.c @@ -779,6 +779,9 @@ static void ApplyRotation_fx( move16(); } op_e = add( op_e, 1 ); // 64 bit mac -> +1 +#ifdef OPT_MCH_DEC_V1_BE + op_e = negate( op_e ); +#endif /* OPT_MCH_DEC_V1_BE */ FOR( ch = 0; ch < nChannels; ch++ ) { @@ -788,13 +791,21 @@ static void ApplyRotation_fx( move32(); Word64 temp = W_mac_32_32( W_mult_32_32( op1, x11 ), op2, x12 ); // Q(singularVector) + op_e - temp = W_shr( temp, op_e ); // Q(singularVector) - singularVector[ch][currentIndex2] = W_sat_l( temp ); // Q(singularVector) +#ifdef OPT_MCH_DEC_V1_BE + singularVector[ch][currentIndex2] = W_shl_sat_l( temp, op_e ); // Q(singularVector) +#else /* OPT_MCH_DEC_V1_BE */ + temp = W_shr( temp, op_e ); // Q(singularVector) + singularVector[ch][currentIndex2] = W_sat_l( temp ); // Q(singularVector) +#endif /* OPT_MCH_DEC_V1_BE */ move32(); temp = W_mac_32_32( W_mult_32_32( op1, x12 ), L_negate( op2 ), x11 ); // Q(singularVector) + op_e - temp = W_shr( temp, op_e ); // Q(singularVector) - singularVector[ch][currentIndex1] = W_sat_l( temp ); // Q(singularVector) +#ifdef OPT_MCH_DEC_V1_BE + singularVector[ch][currentIndex1] = W_shl_sat_l( temp, op_e ); // Q(singularVector) +#else /* OPT_MCH_DEC_V1_BE */ + temp = W_shr( temp, op_e ); // Q(singularVector) + singularVector[ch][currentIndex1] = W_sat_l( temp ); // Q(singularVector) +#endif /* OPT_MCH_DEC_V1_BE */ move32(); } diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index aa4aed84c..b7c0ebbbc 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -485,11 +485,19 @@ void ivas_dirac_dec_decorr_process_fx( set32_fx( aux_buffer_fx, 0, 2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX ); FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { - v_shr( &input_frame_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], negate( q_shift ), &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], imult1616( 2, num_freq_bands ) ); // Q - q_shift +#ifdef OPT_MCH_DEC_V1_BE + v_shr( &input_frame_fx[2 * ch_idx * num_freq_bands], negate( q_shift ), &aux_buffer_fx[2 * ch_idx * num_freq_bands], imult1616( 2, num_freq_bands ) ); // Q - q_shift +#else /* OPT_MCH_DEC_V1_BE */ + v_shr( &input_frame_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], negate( q_shift ), &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], imult1616( 2, num_freq_bands ) ); // Q - q_shift +#endif /* OPT_MCH_DEC_V1_BE */ } FOR( ch_idx = 0; ch_idx < num_protos_dir; ch_idx++ ) { +#ifdef OPT_MCH_DEC_V1_BE + v_mult_fixed( &aux_buffer_fx[2 * ch_idx * num_freq_bands], &aux_buffer_fx[2 * ch_idx * num_freq_bands], &aux_buffer_fx[2 * ch_idx * max_band_decorr_temp], imult1616( 2, max_band_decorr_temp ) ); // q_aux_buffer +#else /* OPT_MCH_DEC_V1_BE */ v_mult_fixed( &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, num_freq_bands ) )], &aux_buffer_fx[imult1616( 2, imult1616( ch_idx, max_band_decorr_temp ) )], imult1616( 2, max_band_decorr_temp ) ); // q_aux_buffer +#endif /* OPT_MCH_DEC_V1_BE */ } q_aux_buffer = sub( add( add( add( q_input_frame, q_input_frame ), q_shift ), q_shift ), 31 ); @@ -506,6 +514,10 @@ void ivas_dirac_dec_decorr_process_fx( max_band_decorr = h_freq_domain_decorr_ap_params->max_band_decorr; move16(); +#ifdef OPT_MCH_DEC_V1_BE + Word16 decorX2 = shl( max_band_decorr, 1 ); +#endif /* OPT_MCH_DEC_V1_BE */ + set32_fx( onset_filter_fx, ONE_IN_Q31, imult1616( num_protos_diff, num_freq_bands ) ); Word16 q_temp = s_min( q_onset_dec, q_aux_buffer ); @@ -678,7 +690,11 @@ void ivas_dirac_dec_decorr_process_fx( move32(); move32(); } +#ifdef OPT_MCH_DEC_V1_BE + decorr_buffer_ptr_fx = decorr_buffer_start_ptr_fx + ( pre_delay - 1 ) * decorr_buffer_step * 2; +#else /* OPT_MCH_DEC_V1_BE */ decorr_buffer_ptr_fx = decorr_buffer_start_ptr_fx + shl( imult1616( ( sub( pre_delay, 1 ) ), decorr_buffer_step ), 1 ); +#endif /* OPT_MCH_DEC_V1_BE */ /*add MA part to state */ decorr_buffer_ptr_fx[0] = L_add( decorr_buffer_ptr_fx[0], frame_ma_fx[0] ); @@ -723,7 +739,10 @@ void ivas_dirac_dec_decorr_process_fx( Word16 q_direct_energy; Word64 aux_64[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; Word16 e_reverb_energy_smooth, e_direct_energy_smooth; - Word16 offset1, offset2; + Word16 offset1; +#ifndef OPT_MCH_DEC_V1_BE + Word16 offset2; +#endif /* OPT_MCH_DEC_V1_BE */ Word16 norm = 63; move16(); e_reverb_energy_smooth = sub( 31, h_freq_domain_decorr_ap_state->q_reverb_energy_smooth ); @@ -732,6 +751,17 @@ void ivas_dirac_dec_decorr_process_fx( // scaling to get max precision for aux_buffer values// q_shift = Q31; move16(); +#ifdef OPT_MCH_DEC_V1_BE + FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + q_shift = s_min( q_shift, + L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ) ); + } + FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); + } +#else /* OPT_MCH_DEC_V1_BE */ offset = shl( max_band_decorr, 1 ); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { @@ -742,6 +772,7 @@ void ivas_dirac_dec_decorr_process_fx( { scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], offset, q_shift ); } +#endif /* OPT_MCH_DEC_V1_BE */ q_frame_f = add( q_frame_f, q_shift ); @@ -773,12 +804,18 @@ void ivas_dirac_dec_decorr_process_fx( Word32 *m32_frame_dec_fx = frame_dec_fx; move32(); offset1 = shl( num_freq_bands, 1 ); +#ifndef OPT_MCH_DEC_V1_BE offset2 = shl( max_band_decorr, 1 ); +#endif /* OPT_MCH_DEC_V1_BE */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { +#ifdef OPT_MCH_DEC_V1_BE + FOR( Word16 i = 0; i < decorX2; i++ ) +#else /* OPT_MCH_DEC_V1_BE */ FOR( Word16 i = 0; i < offset2; i++ ) +#endif /* OPT_MCH_DEC_V1_BE */ { m64_aux[i] = W_mult0_32_32( m32_frame_dec_fx[i], m32_frame_dec_fx[i] ); move64(); @@ -788,19 +825,35 @@ void ivas_dirac_dec_decorr_process_fx( move64(); } } +#ifdef OPT_MCH_DEC_V1_BE + m64_aux += decorX2; +#else /* OPT_MCH_DEC_V1_BE */ m64_aux += offset2; +#endif /* OPT_MCH_DEC_V1_BE */ m32_frame_dec_fx += offset1; move64(); move32(); } norm = W_norm( min64 ); +#ifdef OPT_MCH_DEC_V1_BE + norm = sub( norm, 33 ); +#else /* OPT_MCH_DEC_V1_BE */ norm = sub( norm, 1 /*find_guarded_bits_fx( 2 )*/ ); +#endif /* OPT_MCH_DEC_V1_BE */ FOR( Word16 i = 0; i < 2 * num_channels * max_band_decorr; i++ ) { +#ifdef OPT_MCH_DEC_V1_BE + aux_buffer_fx[i] = W_shl_sat_l( aux_64[i], norm ); +#else /* OPT_MCH_DEC_V1_BE */ aux_buffer_fx[i] = W_extract_h( W_shl( aux_64[i], norm ) ); +#endif /* OPT_MCH_DEC_V1_BE */ move32(); } +#ifdef OPT_MCH_DEC_V1_BE + q_aux_buffer = add( shl( q_frame_f, 1 ), norm ); +#else /* OPT_MCH_DEC_V1_BE */ q_aux_buffer = add( shl( q_frame_f, 1 ), sub( norm, 32 ) ); +#endif /* OPT_MCH_DEC_V1_BE */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) @@ -954,7 +1007,11 @@ void ivas_dirac_dec_decorr_process_fx( Word16 sf = MAX_16; FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { +#ifdef OPT_MCH_DEC_V1_BE + sf = s_min( sf, getScaleFactor32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ) ); +#else /* OPT_MCH_DEC_V1_BE */ sf = s_min( sf, getScaleFactor32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ) ); +#endif /* OPT_MCH_DEC_V1_BE */ } sf = s_min( sub( sf, 1 ), q_shift ); q_if_local = sub( q_shift, sf ); @@ -963,7 +1020,11 @@ void ivas_dirac_dec_decorr_process_fx( // scaling it to sf FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { +#ifdef OPT_MCH_DEC_V1_BE + scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); +#else /* OPT_MCH_DEC_V1_BE */ scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ), q_shift ); +#endif /* OPT_MCH_DEC_V1_BE */ } q_frame_f = add( q_frame_f, sf ); } @@ -972,7 +1033,11 @@ void ivas_dirac_dec_decorr_process_fx( // scaling it to input q FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { +#ifdef OPT_MCH_DEC_V1_BE + scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); +#else /* OPT_MCH_DEC_V1_BE */ scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ), q_shift ); +#endif /* OPT_MCH_DEC_V1_BE */ } q_frame_f = q_input_frame; q_if_local = 0; -- GitLab From b5091ea6da830913dcb00387a11e4af1ae9b611f Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 1 Jul 2025 14:44:25 +0200 Subject: [PATCH 1096/1310] FIX_777_COMBI_RENDER_CONFIG_FILE activated --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 489192b1c..0008cdeba 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -118,7 +118,7 @@ -//#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ +#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ /* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ -- GitLab From 875e4eef6f800659a11a773e9dcfe1812eceb0aa Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 1 Jul 2025 16:49:16 +0300 Subject: [PATCH 1097/1310] Activate switch NONBE_FIX_991_PARAMBIN_BINARY_HRTF. --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0008cdeba..21ee450aa 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,7 +119,7 @@ #define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ -/* #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF */ /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ +#define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ -- GitLab From dd52617a8e9c4e64ede527aa433c3d3d80e6db6b Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 2 Jul 2025 12:22:28 +0200 Subject: [PATCH 1098/1310] [fix] MASA number of output channels not set correctly for Custom LS output in external renderer --- lib_rend/lib_rend_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 2b0f1bdea..97b83b7b6 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -9905,7 +9905,12 @@ static ivas_error initMasaExtRenderer( return error; } - IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ), IVAS_ERR_OK ) ) + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + hMasaExtRend->nchan_output = add( inputMasa->base.ctx.pCustomLsOut->num_spk, inputMasa->base.ctx.pCustomLsOut->num_lfe ); + move16(); + } + ELSE IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From e6c5024923d6ea98da8e54d663d3193ed1be3f89 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 2 Jul 2025 12:17:28 +0200 Subject: [PATCH 1099/1310] [fix] MASA number of output channels not set correctly for Custom LS output in external renderer --- lib_rend/lib_rend_fx.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 278046d08..615092669 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -8050,7 +8050,12 @@ static ivas_error initMasaExtRenderer( return error; } - IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ), IVAS_ERR_OK ) ) + IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) + { + hMasaExtRend->nchan_output = add( inputMasa->base.ctx.pCustomLsOut->num_spk, inputMasa->base.ctx.pCustomLsOut->num_lfe ); + move16(); + } + ELSE IF( NE_32( ( error = getAudioConfigNumChannels( outConfig, &hMasaExtRend->nchan_output ) ), IVAS_ERR_OK ) ) { return error; } -- GitLab From bb07b79167d1dc886de362574f3ed31d6aa0f407 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 2 Jul 2025 12:43:42 +0200 Subject: [PATCH 1100/1310] Fix compile error with FIX_1348_BIT_PRECISION_IMPROVEMENT related macros all disabled. --- lib_dec/ivas_post_proc_fx.c | 2 ++ lib_dec/ivas_stereo_switching_dec_fx.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib_dec/ivas_post_proc_fx.c b/lib_dec/ivas_post_proc_fx.c index 01182a493..1b02b2b17 100644 --- a/lib_dec/ivas_post_proc_fx.c +++ b/lib_dec/ivas_post_proc_fx.c @@ -112,7 +112,9 @@ void ivas_post_proc_fx( { Word16 numZeros = (Word16) ( NS2SA_FX2( output_Fs, N_ZERO_MDCT_NS ) ); /*Q0*/ move16(); +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT assert( sts[n]->hHQ_core->Q_old_out_fx32 == Q11 ); +#endif Copy32( sts[n]->hHQ_core->old_out_fx32 + numZeros, sts[n]->hTcxDec->FBTCXdelayBuf_32, delay_comp ); /*Q11*/ } diff --git a/lib_dec/ivas_stereo_switching_dec_fx.c b/lib_dec/ivas_stereo_switching_dec_fx.c index 17109bee6..57f631204 100644 --- a/lib_dec/ivas_stereo_switching_dec_fx.c +++ b/lib_dec/ivas_stereo_switching_dec_fx.c @@ -422,7 +422,9 @@ ivas_error stereo_memory_dec_fx( test(); IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT assert( hCPE->hCoreCoder[0]->hHQ_core->Q_old_out_fx32 == hCPE->hCoreCoder[1]->hHQ_core->Q_old_out_fx32 ); +#endif v_add_32( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[1]->hHQ_core->old_out_fx32, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */ v_multc_fixed_16( hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, 16384 /* 0.5 in Q15 */, hCPE->hCoreCoder[0]->hHQ_core->old_out_fx32, extract_l( Mpy_32_16_1( output_Fs, INV_FRAME_PER_SEC_Q15 ) ) ); /* exp(exp_old_out) */ @@ -2154,7 +2156,9 @@ void stereo_td2dft_update_fx( move16(); /* update buffers used for fading when switching to DFT Stereo */ +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT assert( sts[0]->hHQ_core->Q_old_out_fx32 == sts[1]->hHQ_core->Q_old_out_fx32 ); +#endif v_add_fx( sts[0]->hHQ_core->old_out_LB_fx32 + nsLB, sts[1]->hHQ_core->old_out_LB_fx32 + nsLB, hCPE->old_outLB_mdct_fx, old_outLB_len ); L_lerp_fx_q11( hCPE->old_outLB_mdct_fx, hCPE->old_outLB_mdct_fx, STEREO_MDCT2DFT_FADE_LEN_48k, old_outLB_len ); -- GitLab From bc4496f3c245a05d57dabc75de2cb28c939920d7 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 2 Jul 2025 13:07:50 +0200 Subject: [PATCH 1101/1310] Fix warning if FIX_1348_BIT_PRECISION_IMPROVEMENT... is deactivated. Disable overfloat guard assert because it trips with FIX_1348_BIT_PRECISION_IMPROVEMENT... disabled. --- lib_dec/dec_tcx_fx.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index bea3d2006..f1d0fbe5b 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -5773,7 +5773,7 @@ void decoder_tcx_imdct_fx( Word32 x_tmp_fx[L_FRAME_PLUS]; Word32 xn_bufFB_fx[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX] = { 0 }; Word16 xn_bufFB_fx_16[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; - Word16 acelp_zir_fx[L_FRAME_MAX / 2], q_acelp_zir_fx = 0; + Word16 acelp_zir_fx[L_FRAME_MAX / 2]; Word32 x_itf_fx[N_MAX_TCX - IGF_START_MN]; Word16 index, proc = 0; TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; @@ -5784,7 +5784,9 @@ void decoder_tcx_imdct_fx( Word16 q_a_itf = 15; Word16 x_e = sub( 31, q_x ); move16(); -#ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN + Word16 q_acelp_zir_fx = 0; +#else Word16 shift_q = sub( q_x, q_win ); #endif @@ -5991,7 +5993,9 @@ void decoder_tcx_imdct_fx( FOR( Word16 ind = 0; ind < L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX; ind++ ) { +#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN assert( extract_h( L_shr( xn_bufFB_fx[ind], shift_q ) ) == 0 || extract_h( L_shr( xn_bufFB_fx[ind], shift_q ) ) == -1 ); +#endif xn_bufFB_fx_16[ind] = extract_l( L_shr( xn_bufFB_fx[ind], shift_q ) ); // q_x16 move16(); } -- GitLab From 4a61a21299eae25f53eb24e44499cfb26870845d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 2 Jul 2025 15:24:53 +0200 Subject: [PATCH 1102/1310] remove inactive code under //#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF --- lib_com/options.h | 1 - lib_dec/dec_tcx_fx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9d6e68621..bfa02eacf 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -101,7 +101,6 @@ #define FIX_1348_BIT_PRECISION_IMPROVEMENT #define FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN #define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD -//#define FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF #define FIX_USAN_BASOP_UTIL_DIVIDE3232 /* Eri: Fix USAN error in BASOP_Util_Divide3232_Scale_newton by adding explicit type cast for -1 in hex */ diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index f1d0fbe5b..6206577c1 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3498,11 +3498,7 @@ void IMDCT_ivas_fx( { #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD -#ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_ROUND_OLD_BUFF - old_out_fx[ind] = shr_r_sat( old_out_fx[ind], q_diff ); -#else old_out_fx[ind] = shr_sat( old_out_fx[ind], q_diff ); -#endif move16(); #endif xn_buf_fx[ind] = shr_sat( xn_buf_fx[ind], diff ); -- GitLab From 839c13bba9dfe5752d2c35de24c4a41f7b446eac Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 2 Jul 2025 16:38:43 +0200 Subject: [PATCH 1103/1310] fix issue 1795: Q3 overflow --- lib_com/options.h | 2 ++ lib_com/swb_bwe_com_fx.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index d1b3cb63e..d82b4862e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -111,4 +111,6 @@ #define FIX_1735_W_SHL_SAT_L /* FhG: Usage of W_shl_sat_l() */ +#define FIX_ISSUE_1795_Q3_OVERFLOW /* FhG: Q3 overflow in function WB_BWE_gain_pred_fx (EVS legacy code) BE, MR1855 */ + #endif diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index 11da78c46..d017d9ba6 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -242,8 +242,15 @@ Word16 WB_BWE_gain_pred_fx( enerL = L_deposit_l( enerL_16 ); enerL = L_shl( enerL, 6 ); /*Q6 */ +#ifdef FIX_ISSUE_1795_Q3_OVERFLOW_not + /* Here, we first square WB_fenv into Q6 format, then it is taken 3x */ + L_tmp = L_mult0( WB_fenv[0], WB_fenv[0] ); /* Q6 */ + L_tmp = L_add(L_tmp, L_add( L_tmp, L_tmp ) ); /* Q6 */ +#else + /* Here, we have not enough headroom for mult with 3, so we get some overflow */ tmp1 = i_mult_sat( 3, WB_fenv[0] ); /*Q3 */ L_tmp = L_mult0( tmp1, WB_fenv[0] ); /*Q6 */ +#endif test(); test(); -- GitLab From 01863bfdf2187dc135cf84cc75ec5f930ff6e0b3 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 2 Jul 2025 16:48:30 +0200 Subject: [PATCH 1104/1310] fix clang-format --- lib_com/swb_bwe_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index d017d9ba6..792ff0619 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -241,11 +241,11 @@ Word16 WB_BWE_gain_pred_fx( tmp = extract_l( L_tmp ); enerL = L_deposit_l( enerL_16 ); - enerL = L_shl( enerL, 6 ); /*Q6 */ + enerL = L_shl( enerL, 6 ); /*Q6 */ #ifdef FIX_ISSUE_1795_Q3_OVERFLOW_not /* Here, we first square WB_fenv into Q6 format, then it is taken 3x */ L_tmp = L_mult0( WB_fenv[0], WB_fenv[0] ); /* Q6 */ - L_tmp = L_add(L_tmp, L_add( L_tmp, L_tmp ) ); /* Q6 */ + L_tmp = L_add( L_tmp, L_add( L_tmp, L_tmp ) ); /* Q6 */ #else /* Here, we have not enough headroom for mult with 3, so we get some overflow */ tmp1 = i_mult_sat( 3, WB_fenv[0] ); /*Q3 */ -- GitLab From b9cdafd5f60802c9381b934d652ffb0582245c2a Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 2 Jul 2025 17:58:17 +0200 Subject: [PATCH 1105/1310] correct macro setting, was inactive --- lib_com/swb_bwe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index 792ff0619..d85c4fe04 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -242,7 +242,7 @@ Word16 WB_BWE_gain_pred_fx( enerL = L_deposit_l( enerL_16 ); enerL = L_shl( enerL, 6 ); /*Q6 */ -#ifdef FIX_ISSUE_1795_Q3_OVERFLOW_not +#ifdef FIX_ISSUE_1795_Q3_OVERFLOW /* Here, we first square WB_fenv into Q6 format, then it is taken 3x */ L_tmp = L_mult0( WB_fenv[0], WB_fenv[0] ); /* Q6 */ L_tmp = L_add( L_tmp, L_add( L_tmp, L_tmp ) ); /* Q6 */ -- GitLab From c4df00266944f7f5edb338d511d0bad1cb167350 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 2 Jul 2025 19:02:48 +0200 Subject: [PATCH 1106/1310] correct macro setting, was inactive, use option B --- lib_com/swb_bwe_com_fx.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index d85c4fe04..689dff46b 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -243,9 +243,8 @@ Word16 WB_BWE_gain_pred_fx( enerL = L_deposit_l( enerL_16 ); enerL = L_shl( enerL, 6 ); /*Q6 */ #ifdef FIX_ISSUE_1795_Q3_OVERFLOW - /* Here, we first square WB_fenv into Q6 format, then it is taken 3x */ + /* Here, we do not multiply L_tmp by 3 to avoid overflow */ L_tmp = L_mult0( WB_fenv[0], WB_fenv[0] ); /* Q6 */ - L_tmp = L_add( L_tmp, L_add( L_tmp, L_tmp ) ); /* Q6 */ #else /* Here, we have not enough headroom for mult with 3, so we get some overflow */ tmp1 = i_mult_sat( 3, WB_fenv[0] ); /*Q3 */ @@ -255,7 +254,13 @@ Word16 WB_BWE_gain_pred_fx( test(); test(); test(); +#ifdef FIX_ISSUE_1795_Q3_OVERFLOW +#define ONE_DIV_3 ((Word32) 0x2AAAAAAA) + /* Here, L_tmp is not pre-multiplied with 3, we multiply enerL with 1/3 */ + IF( GT_16( shr( enerL_16, 3 ), tmp ) && GT_32( Mpy_32_32(ONE_DIV_3, enerL), L_tmp ) && NE_16( prev_coder_type, UNVOICED ) && WB_fenv[0] != 0 ) +#else IF( GT_16( shr( enerL_16, 3 ), tmp ) && GT_32( enerL, L_tmp ) && NE_16( prev_coder_type, UNVOICED ) && WB_fenv[0] != 0 ) +#endif { env_var_flag = 1; move16(); -- GitLab From a832e36753f30d284c77b19fee4d928df763c613 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 2 Jul 2025 19:08:21 +0200 Subject: [PATCH 1107/1310] fix clang-format --- lib_com/swb_bwe_com_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/swb_bwe_com_fx.c b/lib_com/swb_bwe_com_fx.c index 689dff46b..8b134e5d6 100644 --- a/lib_com/swb_bwe_com_fx.c +++ b/lib_com/swb_bwe_com_fx.c @@ -244,7 +244,7 @@ Word16 WB_BWE_gain_pred_fx( enerL = L_shl( enerL, 6 ); /*Q6 */ #ifdef FIX_ISSUE_1795_Q3_OVERFLOW /* Here, we do not multiply L_tmp by 3 to avoid overflow */ - L_tmp = L_mult0( WB_fenv[0], WB_fenv[0] ); /* Q6 */ + L_tmp = L_mult0( WB_fenv[0], WB_fenv[0] ); /* Q6 */ #else /* Here, we have not enough headroom for mult with 3, so we get some overflow */ tmp1 = i_mult_sat( 3, WB_fenv[0] ); /*Q3 */ @@ -255,9 +255,9 @@ Word16 WB_BWE_gain_pred_fx( test(); test(); #ifdef FIX_ISSUE_1795_Q3_OVERFLOW -#define ONE_DIV_3 ((Word32) 0x2AAAAAAA) +#define ONE_DIV_3 ( (Word32) 0x2AAAAAAA ) /* Here, L_tmp is not pre-multiplied with 3, we multiply enerL with 1/3 */ - IF( GT_16( shr( enerL_16, 3 ), tmp ) && GT_32( Mpy_32_32(ONE_DIV_3, enerL), L_tmp ) && NE_16( prev_coder_type, UNVOICED ) && WB_fenv[0] != 0 ) + IF( GT_16( shr( enerL_16, 3 ), tmp ) && GT_32( Mpy_32_32( ONE_DIV_3, enerL ), L_tmp ) && NE_16( prev_coder_type, UNVOICED ) && WB_fenv[0] != 0 ) #else IF( GT_16( shr( enerL_16, 3 ), tmp ) && GT_32( enerL, L_tmp ) && NE_16( prev_coder_type, UNVOICED ) && WB_fenv[0] != 0 ) #endif -- GitLab From 8680bd29b11be8502b56436a5399e7fe1b7304e7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 3 Jul 2025 10:45:56 +0530 Subject: [PATCH 1108/1310] Fix for 3GPP issue 1428: Basop Encoder Artifact for Stereo 13.2 kps DTX Background Noise Segment Link #1428 --- lib_com/rom_com.c | 27 +++++++++++++++++++++++++++ lib_com/rom_com.h | 6 ++++-- lib_enc/swb_tbe_enc_fx.c | 4 ++-- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 1f43b3d1f..b10f5cc52 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -15654,6 +15654,33 @@ const Word16 wac_swb_l[LPC_SHB_ORDER] = 30328 }; +const Word16 wac_swb_ivas_h[LPC_SHB_ORDER] = +{//Q15 + 32749, + 32731, + 32686, + 32622, + 32541, + 32442, + 32325, + 32191, + 32039, + 31870 +}; + +const Word16 wac_swb_ivas_l[LPC_SHB_ORDER] = +{//Q15 + 2624, + 20874, + 7850, + 25873, + 12831, + 5927, + 10541, + 239, + 15037, + 30328 +}; const Word16 lbr_wb_bwe_lsfvq_cbook_2bit_fx[4 * 4] = { diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index a0a388bc6..8a8ff7dd0 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -616,8 +616,10 @@ extern const Word16 window_wb_fx[]; // extern const Word16 subwin_wb_fx[]; // Q15 extern const Word16 Hilbert_coeffs_fx[4 * NUM_HILBERTS][HILBERT_ORDER1 + 1]; // Q14 -extern const Word16 wac_swb_h[]; // Q15 -extern const Word16 wac_swb_l[]; // Q15 +extern const Word16 wac_swb_h[]; // Q15 +extern const Word16 wac_swb_l[]; // Q15 +extern const Word16 wac_swb_ivas_h[]; // Q15 +extern const Word16 wac_swb_ivas_l[]; // Q15 extern const Word16 wb_bwe_lsfvq_cbook_8bit_fx[]; // Q15 extern const Word16 lbr_wb_bwe_lsfvq_cbook_2bit_fx[]; // Q15 diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 6b65f9afa..d016cd721 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -3062,7 +3062,7 @@ void swb_tbe_enc_ivas_fx( { FOR( i = 1; i <= LPC_SHB_ORDER; i++ ) { - L_tmp = Mpy_32( R_h[i], R_l[i], wac_swb_h[i - 1], wac_swb_l[i - 1] ); + L_tmp = Mpy_32( R_h[i], R_l[i], wac_swb_ivas_h[i - 1], wac_swb_ivas_l[i - 1] ); L_Extract( L_tmp, &R_h[i], &R_l[i] ); } } @@ -3091,7 +3091,7 @@ void swb_tbe_enc_ivas_fx( } /* this is needed as the E_LPC_lev_dur function outputs lpc in Q14 */ - Copy_Scale_sig( lpc_shb_fx, lpc_shb_fx, LPC_SHB_ORDER + 1, sub( norm_s( lpc_shb_fx[0] ), 2 ) ); + scale_sig( lpc_shb_fx, LPC_SHB_ORDER + 1, sub( norm_s( lpc_shb_fx[0] ), 2 ) ); /* Expand bandwidth of the LP coeffs */ test(); -- GitLab From 198d3a2b085a82b82105fe05dd60acde72b89b45 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 3 Jul 2025 08:55:23 +0300 Subject: [PATCH 1109/1310] Align hrtfShCoeffsRe_fx Q everywhere to Q14 to remove differences. --- lib_rend/ivas_rom_binauralRenderer.h | 2 +- lib_util/hrtf_file_reader.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 4992cbb1f..1027c482b 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -60,7 +60,7 @@ extern Word32 rightHRIRImag_fx[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NT extern Word32 FASTCONV_HOA3_latency_s_fx; extern Word32 FASTCONV_HOA2_latency_s_fx; extern Word32 FASTCONV_FOA_latency_s_fx; -extern Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q15 */ +extern Word16 hrtfShCoeffsRe_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ extern Word16 hrtfShCoeffsIm_fx[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; /* Q14 */ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 33f4e366e..4551617de 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -2023,7 +2023,7 @@ static ivas_error create_parambin_HRTF_from_rawdata( { memcpy( f_tmp_hrtfShCoeffs, hrtf_data_rptr, data_size_tmp ); /*adding conversion as file reading is done in float*/ - floatToFixed_arr16( f_tmp_hrtfShCoeffs, ( *hHRTF )->hrtfShCoeffsRe_fx[i][j], Q15, HRTF_NUM_BINS ); + floatToFixed_arr16( f_tmp_hrtfShCoeffs, ( *hHRTF )->hrtfShCoeffsRe_fx[i][j], Q14, HRTF_NUM_BINS ); hrtf_data_rptr += data_size_tmp; } } -- GitLab From 74409b7d0125f8972a67ae9d95007e8fc5c5ff36 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Thu, 3 Jul 2025 10:44:52 +0200 Subject: [PATCH 1110/1310] fix --- lib_com/options.h | 1 + lib_dec/ivas_jbm_dec_fx.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index d1b3cb63e..4537e0788 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,5 +110,6 @@ #define ISSUE_1772_replace_shr_o /* FhG: replace by non-overflow-alternative - BE */ #define FIX_1735_W_SHL_SAT_L /* FhG: Usage of W_shl_sat_l() */ +#define FIX_ISSUE_1792 /* FhG: fix noise bursts in binaural rendering */ #endif diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 008093a89..ba464af7f 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -630,7 +630,11 @@ ivas_error ivas_jbm_dec_tc_fx( move16(); FOR( ch = 0; ch < nchan_transport; ch++ ) { +#ifdef FIX_ISSUE_1792 + temp_min = L_norm_arr( p_output_fx[ch], output_frame ); +#else temp_min = getScaleFactor32( p_output_fx[ch], output_frame ); +#endif Q_p_output = s_min( Q_p_output, temp_min ); } Q_p_output = sub( Q_p_output, 2 ); -- GitLab From 3013c508e7785252d2ecee37cfcba918c8fa7277 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 3 Jul 2025 16:14:17 +0530 Subject: [PATCH 1111/1310] Fix for 3GPP issue 1797: Decoder crash for MC 7.1+4 at 128kbps decoding to mono/stereo in ivas_ls_setup_conversion_process_mdct_param_mc_fx() Link #1797 --- lib_dec/ivas_out_setup_conversion_fx.c | 38 ++++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 93a7c204e..2135cd6d6 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -1028,6 +1028,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( Word16 start, stop, start_tcx5, stop_tcx5; Word16 mct_chan_mode[MAX_CICP_CHANNELS]; + Word16 all_ch_ignored; // Flag for checking if all channels are ignored /* Declare all handles */ LSSETUP_CONVERSION_HANDLE hLsSetUpConversion; @@ -1130,13 +1131,22 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( set_zero_fx( target_ch_ener_fx, MAX_OUTPUT_CHANNELS ); Word16 max_e = 0; move16(); + all_ch_ignored = 1; + move16(); FOR( idx = 0; idx < nchan_transport; idx++ ) { IF( NE_16( mct_chan_mode[idx], MCT_CHAN_MODE_IGNORE ) ) { max_e = s_max( max_e, x_e[idx][0] ); + all_ch_ignored = 0; + move16(); } } + if ( all_ch_ignored ) + { + max_e = 31; + move16(); + } FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { set_zero_fx( real_in_buffer_fx, PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND * PARAM_MC_BAND_TO_MDCT_BAND_RATIO * MAX_TRANSPORT_CHANNELS ); @@ -1164,22 +1174,32 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( } } } - Word16 shift = 1; + input_exp = max_e; move16(); - FOR( i = 0; i < num_bands * nchan_transport; ++i ) + IF( all_ch_ignored == 0 ) { - real_in_buffer_fx[i] = L_shr( real_in_buffer_fx[i], shift ); - move32(); - imag_in_buffer_fx[i] = L_shr( imag_in_buffer_fx[i], shift ); - move32(); + Word16 shift = 1; + move16(); + FOR( i = 0; i < num_bands * nchan_transport; ++i ) + { + real_in_buffer_fx[i] = L_shr( real_in_buffer_fx[i], shift ); + move32(); + imag_in_buffer_fx[i] = L_shr( imag_in_buffer_fx[i], shift ); + move32(); + } + input_exp = add( input_exp, shift ); } - input_exp = max_e; - move16(); - input_exp = add( input_exp, shift ); + cmplx_matrix_square_fx( real_in_buffer_fx, imag_in_buffer_fx, num_bands, nchan_transport, real_buffer_fx, imag_buffer_fx, input_exp, &output_exp ); v_add_32( cx_fx[bandIdx], real_buffer_fx, cx_fx[bandIdx], i_mult( nchan_transport, nchan_transport ) ); /*Q=Q_real_buffer=Q_imag_buffer=output_exp*/ v_add_32( cx_imag_fx[bandIdx], imag_buffer_fx, cx_imag_fx[bandIdx], i_mult( nchan_transport, nchan_transport ) ); /*Q=Q_real_buffer=Q_imag_buffer=output_exp*/ } + if ( all_ch_ignored ) + { + output_exp = 29; + move16(); + } + Word16 exp_in = 10, exp_out = 0; move16(); move16(); -- GitLab From d6b15db889198fc03b699073dba12c028f2774d8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 13 May 2025 14:20:18 +0530 Subject: [PATCH 1112/1310] Fix for 3GPP issue 1388: Stereo Encoder 16.4 kbps: Various Discontinuities in LTV Link #1388 --- lib_enc/inov_enc_fx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index 216ca3860..9c78ccf7f 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -370,7 +370,7 @@ Word16 inov_encode_ivas_fx( Word16 shift, Word16 Q_new ) { - Word16 dn[2 * L_SUBFR], Qdn, Qcn; + Word16 dn[2 * L_SUBFR], Qdn, Qcn, Qh2; Word16 nBits, cmpl_flag; Word16 stack_pulses; Word16 g1, g2; @@ -586,6 +586,9 @@ Word16 inov_encode_ivas_fx( set16_fx( y2, 0, L_SUBFR ); + Qh2 = sub( 14, norm_s( h2[0] ) ); + scale_sig( h2, L_SUBFR, sub( Q12, Qh2 ) ); + IF( !Opt_AMR_WB ) { IF( st_fx->acelp_cfg.fcb_mode ) -- GitLab From bf7e97febbdd0869579278b1bdaac8e795bb24d0 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 4 Jul 2025 11:15:04 +0300 Subject: [PATCH 1113/1310] Clang format --- lib_enc/ivas_masa_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 6d53d1d09..57fc30e78 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -3157,7 +3157,7 @@ static void copy_masa_metadata_subframe_fx( FOR( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) { #ifdef NONBE_FIX_1034_DRY_MASA_RATIOS - FOR ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { hMetaTo->directional_meta[dir].spherical_index[sfTo][band] = hMetaFrom->directional_meta[dir].spherical_index[sfFrom][band]; move16(); -- GitLab From dcf8b5fc7add37482d0c6b2382be8a92503ef118 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 4 Jul 2025 11:34:08 +0300 Subject: [PATCH 1114/1310] Fix wrong conversion based on code review. --- lib_com/ivas_cnst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 4d94cdbe6..6e17c7046 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1287,7 +1287,7 @@ enum #define MASA_RATIO_THRESHOLD 0.1f #define MASA_ANGLE_TOLERANCE 0.5f #ifdef NONBE_FIX_1034_DRY_MASA_RATIOS -#define MASA_RATIO_THRESHOLD_FX 322122547 // 0.15 in Q31 +#define MASA_RATIO_THRESHOLD_FX 32212255 // 0.015 in Q31 #else #define MASA_RATIO_THRESHOLD_FX 214748365 // 0.1 in Q31 #endif -- GitLab From 012b2473da508b008cb17b963567e860c24604c8 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 4 Jul 2025 11:46:03 +0200 Subject: [PATCH 1115/1310] port missing changes from float MR 1433 --- lib_com/ivas_prot_fx.h | 9 ++++++--- lib_dec/ivas_ism_renderer_fx.c | 13 ++++++++++--- lib_dec/ivas_osba_dec_fx.c | 4 ++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 501c91a35..a34c2297d 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1055,9 +1055,12 @@ ivas_error ivas_ism_renderer_open_fx( ); void ivas_ism_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* i/o: core-coder transport channels/object output */ - const Word16 n_samples_to_render /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + const RENDERER_TYPE renderer_type, /* i : active renderer type */ +#endif + Word32 *output_fx[], /* i/o: core-coder transport channels/object output */ + const Word16 n_samples_to_render /* i : output frame length per channel */ ); void ivas_jbm_dec_get_adapted_linear_interpolator_fx( diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 0564868c8..6c80c39b7 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -156,9 +156,12 @@ void ivas_ism_renderer_close( * Object rendering process *-------------------------------------------------------------------------*/ void ivas_ism_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ - const Word16 n_samples_to_render /* i : output frame length per channel */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + const RENDERER_TYPE renderer_type, /* i : active renderer type */ +#endif + Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ + const Word16 n_samples_to_render /* i : output frame length per channel */ ) { Word16 i, j, k, j2; @@ -333,7 +336,11 @@ void ivas_ism_render_sf_fx( n_samples_rendered_loop = add( n_samples_rendered_loop, n_samples_in_subframe ); /* update rendered subframe and slots info for all cases apart from a following crend call, the update will then happen in the crend call*/ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + if ( renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) +#else if ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) +#endif { st_ivas->hTcBuffer->subframes_rendered = add( st_ivas->hTcBuffer->subframes_rendered, 1 ); st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] ); diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c index a8754d84f..3491b0491 100644 --- a/lib_dec/ivas_osba_dec_fx.c +++ b/lib_dec/ivas_osba_dec_fx.c @@ -308,7 +308,11 @@ ivas_error ivas_osba_render_sf_fx( IF( NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_ism, *nSamplesRendered ); +#else ivas_ism_render_sf_fx( st_ivas, p_output_ism, *nSamplesRendered ); +#endif } FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) -- GitLab From 26b9d67f5af5e70643c512f4dedf23863583bcbe Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 4 Jul 2025 12:40:55 +0200 Subject: [PATCH 1116/1310] fix formatting --- lib_dec/ivas_ism_renderer_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 6c80c39b7..b5ad713ba 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -156,12 +156,12 @@ void ivas_ism_renderer_close( * Object rendering process *-------------------------------------------------------------------------*/ void ivas_ism_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH - const RENDERER_TYPE renderer_type, /* i : active renderer type */ + const RENDERER_TYPE renderer_type, /* i : active renderer type */ #endif - Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ - const Word16 n_samples_to_render /* i : output frame length per channel */ + Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ + const Word16 n_samples_to_render /* i : output frame length per channel */ ) { Word16 i, j, k, j2; -- GitLab From 5cadf600bbfc87d8e4f5c8fee78a8f354b49be28 Mon Sep 17 00:00:00 2001 From: weckbecker Date: Fri, 4 Jul 2025 12:42:28 +0200 Subject: [PATCH 1117/1310] add missing move16 --- lib_dec/ivas_ism_renderer_fx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index b5ad713ba..550128d7c 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -199,6 +199,7 @@ void ivas_ism_render_sf_fx( #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH num_objects = st_ivas->nchan_ism; + move16(); #else num_objects = st_ivas->nchan_transport; move16(); -- GitLab From ea5fa66de7c81f1cb02d6a75dcc4a8135353f84d Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 4 Jul 2025 12:53:15 +0200 Subject: [PATCH 1118/1310] port missing changes from float MR 1433 in lib_dec/ivas_jbm_dec_fx.c --- lib_dec/ivas_jbm_dec_fx.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index bc4a732e0..30431f3be 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1958,7 +1958,11 @@ ivas_error ivas_jbm_dec_render_fx( IF( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); +#else + ivas_ism_render_sf_fx( st_ivas, p_output, *nSamplesRendered ); +#endif } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { @@ -2139,8 +2143,12 @@ ivas_error ivas_jbm_dec_render_fx( p_tc_fx[2] = p_output_fx[3]; } - /* render objects */ + /* render objects */ +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); +#else ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); +#endif /* add already rendered SBA part */ FOR( n = 0; n < nchan_out; n++ ) -- GitLab From c2f722e6fb748b060d84394c7ac17e08b74b2a61 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 4 Jul 2025 12:54:20 +0200 Subject: [PATCH 1119/1310] fix formatting --- lib_dec/ivas_jbm_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 30431f3be..7aea1055d 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2143,7 +2143,7 @@ ivas_error ivas_jbm_dec_render_fx( p_tc_fx[2] = p_output_fx[3]; } - /* render objects */ + /* render objects */ #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); #else -- GitLab From 94b0164cc6a4897ad28cf34e473350051320ab8e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 3 Jul 2025 16:33:59 +0530 Subject: [PATCH 1120/1310] Fix for 3GPP issue 1786: Metadata output result of MASA prerend with muted MASA signal and ISM3 is quite differing Link #1786 --- lib_com/ivas_masa_com_fx.c | 11 +++++++---- lib_rend/ivas_masa_merge_fx.c | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib_com/ivas_masa_com_fx.c b/lib_com/ivas_masa_com_fx.c index a691fb390..f4c8fab10 100644 --- a/lib_com/ivas_masa_com_fx.c +++ b/lib_com/ivas_masa_com_fx.c @@ -978,7 +978,7 @@ static Word16 quantize_phi_masa_fx( Word32 tmp32; Word16 tmp_e, delta_phi_e; - delta_phi_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( 360, n, &delta_phi_e ) ); + delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( 360, n, &delta_phi_e ); delta_phi_fx = L_shr( delta_phi_fx, sub( sub( 31, delta_phi_e ), 22 ) ); // Q22 IF( EQ_16( n, 1 ) ) @@ -1000,8 +1000,8 @@ static Word16 quantize_phi_masa_fx( } tmp32 = L_add( L_sub( phi_fx, dd_fx ), L_shr( delta_phi_fx, 1 ) ); - id_phi = BASOP_Util_Divide3232_Scale( tmp32, delta_phi_fx, &tmp_e ); - id_phi = shr( id_phi, sub( 15, tmp_e ) ); // Q0 + tmp32 = BASOP_Util_Divide3232_Scale_newton( tmp32, delta_phi_fx, &tmp_e ); + id_phi = extract_l( L_shr( tmp32, sub( 31, tmp_e ) ) ); // Q0 if ( EQ_16( id_phi, n ) ) { @@ -1014,7 +1014,10 @@ static Word16 quantize_phi_masa_fx( id_phi = sub( n, 1 ); } - *phi_hat_fx = L_add( L_shl( Mpy_32_16_1( delta_phi_fx, id_phi ), 15 ), dd_fx ); // q22 + q0 - 15 = q7 -> q7 + 15 = q22 + delta_phi_fx = BASOP_Util_Divide3232_Scale_newton( L_mult0( 360, id_phi ), n, &delta_phi_e ); + delta_phi_fx = L_shr( delta_phi_fx, sub( sub( 31, delta_phi_e ), 22 ) ); // Q22 + + *phi_hat_fx = L_add( delta_phi_fx, dd_fx ); // Q22 move32(); return id_phi; // Q0 diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index 892927d37..673d5330a 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -194,9 +194,9 @@ void diffuse_meta_merge_1x1_fx( scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); IF( L_tmp1 == 0 ) { - scale = 31; + scale = 0; move16(); - L_tmp2 = 1; + L_tmp2 = MAX_32; move32(); } ELSE -- GitLab From 25242c0172cceb3197596be7d841aaeda72ac950 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 4 Jul 2025 16:31:20 +0530 Subject: [PATCH 1121/1310] Fix to correct the rounding of directToTotalRatio This change improves the precision as well as corrects the rounding of directToTotalRatio. Optimization: This MR removes 7 instances of BASOP_Util_Divide1616_Scale used in 2 functions: diffuse_meta_merge_1x1_fx and full_stream_merge_fx --- lib_rend/ivas_masa_merge_fx.c | 47 +++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index 673d5330a..54d2548c6 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -39,6 +39,7 @@ #include "wmc_auto.h" #include "ivas_prot_fx.h" +#define INV_UINT8_MAX 8421505 /* 1/UINT8_MAX in Q31 */ /*---------------------------------------------------------------------* * Local function prototypes @@ -172,23 +173,29 @@ void diffuse_meta_merge_1x1_fx( FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { Word32 energyTimesRatio_fx, energyTimesRatioISM_fx, total_diff_nrg_fx, dir_nrg_ratio_fx, total_nrg_fx = 0; - Word32 dir_ratio_ism_fx, L_tmp1, L_tmp2; + Word32 dir_ratio_ism_fx, L_tmp, L_tmp1, L_tmp2; Word16 scale, energyTimesRatio_e, tmp, total_nrg_e = 0, total_diff_nrg_e, dir_ratio_ism_e, energyTimesRatioISM_e, dir_nrg_ratio_e; move32(); move16(); - tmp = BASOP_Util_Divide1616_Scale( inMeta->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); - energyTimesRatio_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + energyTimesRatio_fx = Mpy_32_32_r( inEne_fx[sf][band], L_tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ energyTimesRatio_e = add( inEne_e[sf][band], scale ); total_nrg_fx = BASOP_Util_Add_Mant32Exp( inEne_fx[sf][band], inEne_e[sf][band], inEneISM_fx[sf][band], inEneISM_e[sf][band], &total_nrg_e ); /* target is original MASA diffuseness */ - tmp = BASOP_Util_Divide1616_Scale( inMeta->diffuseToTotalRatio[sf][band], UINT8_MAX, &scale ); - total_diff_nrg_fx = Mpy_32_16_r( inEne_fx[sf][band], tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta->diffuseToTotalRatio[sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + total_diff_nrg_fx = Mpy_32_32_r( inEne_fx[sf][band], L_tmp ); /* Q( 31 - ( nEne_e[sf] + scale ) ) */ total_diff_nrg_e = add( inEne_e[sf][band], scale ); /* criterion is mean of ISM ratio and new ratio */ - dir_ratio_ism_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( inMetaISM->directToTotalRatio[0][sf][band], UINT8_MAX, &dir_ratio_ism_e ) ); + dir_ratio_ism_fx = Mpy_32_16_1( INV_UINT8_MAX, inMetaISM->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + dir_ratio_ism_e = 15; + move16(); tmp = BASOP_Util_Divide3232_Scale( total_diff_nrg_fx, L_add( total_nrg_fx, EPSILON_FX ), &scale ); L_tmp1 = L_deposit_h( tmp ); /* Q( 31 - ( scale + total_nrg_e - total_diff_nrg_e ) ) */ scale = add( scale, sub( total_diff_nrg_e, total_nrg_e ) ); @@ -245,7 +252,7 @@ void diffuse_meta_merge_1x1_fx( move16(); } - outMeta->directToTotalRatio[0][sf][band] = (UWord8) extract_l( L_shr( new_dir_ratio_fx, sub( sub( 31, new_dir_ratio_e ), 8 ) ) ); + outMeta->directToTotalRatio[0][sf][band] = (UWord8) extract_l( L_shr( Mpy_32_16_1( new_dir_ratio_fx, UINT8_MAX ) /* (31 - new_dir_ratio_e) - 15*/, sub( 31 - 15, new_dir_ratio_e ) ) ); move16(); IF( GT_16( sub( 31, new_dir_ratio_e ), Q30 ) ) { @@ -325,7 +332,7 @@ void full_stream_merge_fx( { UWord8 n_dirs_1, n_dirs_2; UWord8 sf, band; - Word16 scale, tmp, dir_nrg_1_e, dir_nrg_2_e; + Word16 scale, dir_nrg_1_e, dir_nrg_2_e; Word32 dir_nrg_1_fx, dir_nrg_2_fx, L_tmp; /* full stream select based on total direct energy */ @@ -336,26 +343,34 @@ void full_stream_merge_fx( { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { - tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); - dir_nrg_1_fx = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta1->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + dir_nrg_1_fx = Mpy_32_32( L_tmp, inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ dir_nrg_1_e = add( scale, inEne1_e[sf][band] ); - tmp = BASOP_Util_Divide1616_Scale( inMeta2->directToTotalRatio[0][sf][band], UINT8_MAX, &scale ); - dir_nrg_2_fx = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta2->directToTotalRatio[0][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + dir_nrg_2_fx = Mpy_32_32( L_tmp, inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ dir_nrg_2_e = add( scale, inEne2_e[sf][band] ); IF( EQ_16( n_dirs_1, 2 ) ) { - tmp = BASOP_Util_Divide1616_Scale( inMeta1->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); - L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta1->directToTotalRatio[1][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + L_tmp = Mpy_32_32( L_tmp, inEne1_fx[sf][band] ); /* Q( 31 - ( scale + inEne1_e[sf] ) ) */ scale = add( scale, inEne1_e[sf][band] ); dir_nrg_1_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_1_fx, dir_nrg_1_e, &dir_nrg_1_e ); } IF( EQ_16( n_dirs_2, 2 ) ) { - tmp = BASOP_Util_Divide1616_Scale( inMeta2->directToTotalRatio[1][sf][band], UINT8_MAX, &scale ); - L_tmp = Mpy_32_32( L_deposit_h( tmp ), inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ + L_tmp = Mpy_32_16_1( INV_UINT8_MAX, inMeta2->directToTotalRatio[1][sf][band] ); // Q31 - 15 => Q16 + scale = 15; + move16(); + L_tmp = Mpy_32_32( L_tmp, inEne2_fx[sf][band] ); /* Q( 31 - ( scale + inEne2_e[sf] ) ) */ scale = add( scale, inEne2_e[sf][band] ); dir_nrg_2_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale, dir_nrg_2_fx, dir_nrg_2_e, &dir_nrg_2_e ); } -- GitLab From 168dc5f86bbca9160d959ac970bfd704d2ecc0ad Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 4 Jul 2025 13:02:36 +0200 Subject: [PATCH 1122/1310] fix arguments in one call to ivas_ism_render_sf_fx --- lib_dec/ivas_jbm_dec_fx.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 7aea1055d..a4547a483 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1961,7 +1961,7 @@ ivas_error ivas_jbm_dec_render_fx( #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); #else - ivas_ism_render_sf_fx( st_ivas, p_output, *nSamplesRendered ); + ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); #endif } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) @@ -2686,7 +2686,11 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ set16_fx( st_ivas->hIsmRendererData->interpolator_fx, 32767, hTcBuffer->n_samples_granularity ); // 32767=1.0f in Q15 +#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH + ivas_ism_render_sf_fx( st_ivas, renderer_type_old, p_output_fx, hTcBuffer->n_samples_granularity ); +#else ivas_ism_render_sf_fx( st_ivas, p_output_fx, hTcBuffer->n_samples_granularity ); +#endif st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; *st_ivas->hCrendWrapper->p_io_qfactor = 11; -- GitLab From f46551bf3816339f743fe6b1a4f1fc8669b00ffb Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 4 Jul 2025 16:36:57 +0530 Subject: [PATCH 1123/1310] Fix in stereo_dft_enc_compute_itd(): Q computed value correction --- lib_enc/ivas_stereo_dft_enc_itd_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_dft_enc_itd_fx.c b/lib_enc/ivas_stereo_dft_enc_itd_fx.c index 28bac9e8b..44434f78f 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd_fx.c +++ b/lib_enc/ivas_stereo_dft_enc_itd_fx.c @@ -1467,7 +1467,7 @@ void stereo_dft_enc_compute_itd_fx( // sfm_L = expf( log_prod_L / ( NFFT_mid ) ) / ( sum_abs_L / ( NFFT_mid ) ); L_temp = BASOP_Util_Divide3232_Scale_newton( log_prod_L, NFFT_mid, &L_temp_e ); L_temp_e = add( L_temp_e, sub( log_prod_L_e, 31 ) ); - L_temp = BASOP_Util_fPow( 1459366444 /*2.718 in Q29*/, 2, L_temp, L_temp_e, &L_temp_e ); + L_temp = BASOP_Util_fPow( 1459215139 /*2.718 in Q29*/, 2, L_temp, L_temp_e, &L_temp_e ); q_temp = norm_l( NFFT_mid ); L_temp2 = L_shl( NFFT_mid, q_temp ); L_temp2_e = sub( 31, q_temp ); -- GitLab From 53143c0b4e42bedcd7e3f7f77ab4dadc5fc32455 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 4 Jul 2025 16:51:28 +0530 Subject: [PATCH 1124/1310] Multichannel path decoder optimizations: Removal of BASOP_Util_Add_Mant32Exp and BASOP_Util_Cmp_Mant32Exp --- lib_com/options.h | 1 + lib_dec/ivas_dirac_output_synthesis_cov_fx.c | 45 ++++++- lib_dec/ivas_svd_dec_fx.c | 130 +++++++++++++++++-- lib_rend/ivas_dirac_decorr_dec_fx.c | 99 +++++++++++++- 4 files changed, 263 insertions(+), 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5c1552fc3..de20f6959 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,6 +79,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_MCH_DEC_V1_NBE #define OPT_MCH_DEC_V1_BE #define OPT_MCT_ENC_V2_NBE #define OPT_SBA_DEC_V2_NBE diff --git a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c index ea03e1ddb..238ca3704 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov_fx.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov_fx.c @@ -886,7 +886,11 @@ Word16 computeMixingMatrices_fx( move16(); FOR( i = 1; i < lengthCx; i++ ) { +#ifdef OPT_MCH_DEC_V1_NBE + IF( GT_32( svd_s_buffer_fx[i], L_shl_sat( limit_fx, sub( limit_e, svd_s_buffer_e[i] ) ) ) ) +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( svd_s_buffer_fx[i], svd_s_buffer_e[i], limit_fx, limit_e ) > 0 ) +#endif /* OPT_MCH_DEC_V1_NBE */ { limit_fx = svd_s_buffer_fx[i]; move32(); @@ -896,6 +900,7 @@ Word16 computeMixingMatrices_fx( } limit_e = add( limit_e, reg_Sx_e ); + #ifdef OPT_MCH_DEC_V1_BE limit_fx = Madd_32_32( EPSILON_FX, limit_fx, reg_Sx_fx ); #else /* OPT_MCH_DEC_V1_BE */ @@ -905,7 +910,11 @@ Word16 computeMixingMatrices_fx( FOR( i = 0; i < lengthCx; ++i ) { +#ifdef OPT_MCH_DEC_V1_NBE + IF( LT_32( L_shl_sat( svd_s_buffer_fx[i], sub( svd_s_buffer_e[i], limit_e ) ), limit_fx ) ) +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( svd_s_buffer_fx[i], svd_s_buffer_e[i], limit_fx, limit_e ) < 0 ) +#endif /* OPT_MCH_DEC_V1_NBE */ { svd_s_buffer_fx[i] = limit_fx; move32(); @@ -950,9 +959,16 @@ Word16 computeMixingMatrices_fx( matrix_product_diag_fx( Q_Cx_fx, Q_Cx_e, lengthCy, lengthCx, 0, Q_fx, Q_e, lengthCy, lengthCx, 1, Cy_hat_diag_fx, &Cy_hat_diag_e ); +#ifdef OPT_MCH_DEC_V1_NBE + Word16 com_e = sub( limit_e, Cy_hat_diag_e ); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( i = 0; i < lengthCy; ++i ) { +#ifdef OPT_MCH_DEC_V1_NBE + IF( GT_32( Cy_hat_diag_fx[i], L_shl_sat( limit_fx, com_e ) ) ) +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( Cy_hat_diag_fx[i], Cy_hat_diag_e, limit_fx, limit_e ) > 0 ) +#endif /* OPT_MCH_DEC_V1_NBE */ { limit_fx = Cy_hat_diag_fx[i]; move32(); @@ -968,11 +984,19 @@ Word16 computeMixingMatrices_fx( #endif /* OPT_MCH_DEC_V1_BE */ limit_e = add( limit_e, reg_ghat_e ); +#ifdef OPT_MCH_DEC_V1_NBE + com_e = sub( Cy_hat_diag_e, limit_e ); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( i = 0; i < lengthCy; ++i ) { Cy_hat_diag_buff_e[i] = Cy_hat_diag_e; move16(); + +#ifdef OPT_MCH_DEC_V1_NBE + IF( GT_32( limit_fx, L_shl_sat( Cy_hat_diag_fx[i], com_e ) ) ) +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( limit_fx, limit_e, Cy_hat_diag_fx[i], Cy_hat_diag_buff_e[i] ) > 0 ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ +#endif /* OPT_MCH_DEC_V1_NBE */ { Cy_hat_diag_fx[i] = limit_fx; move32(); @@ -1392,7 +1416,11 @@ Word16 computeMixingMatricesResidual_fx( FOR( i = 0; i < lengthCx; ++i ) { +#ifdef OPT_MCH_DEC_V1_NBE + IF( GT_32( Kx_fx[i], L_shl_sat( limit_fx, sub( limit_e, Kx_fx_e[i] ) ) ) ) +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( Kx_fx[i], Kx_fx_e[i], limit_fx, limit_e ) > 0 ) +#endif /* OPT_MCH_DEC_V1_NBE */ { div_tmp = Kx_fx[i]; move32(); @@ -1433,9 +1461,16 @@ Word16 computeMixingMatricesResidual_fx( Cy_hat_diag_e = Cx_e; move16(); +#ifdef OPT_MCH_DEC_V1_NBE + Word16 com_e = sub( limit_e, Cy_hat_diag_e ); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( i = 0; i < lengthCy; ++i ) { +#ifdef OPT_MCH_DEC_V1_NBE + IF( GT_32( Cy_hat_diag_fx[i], L_shl_sat( limit_fx, com_e ) ) ) +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( Cy_hat_diag_fx[i], Cy_hat_diag_e, limit_fx, limit_e ) > 0 ) +#endif /* OPT_MCH_DEC_V1_NBE */ { limit_fx = Cy_hat_diag_fx[i]; move32(); @@ -1453,11 +1488,19 @@ Word16 computeMixingMatricesResidual_fx( limit_e = add( limit_e, reg_ghat_e ); /* Computing G_hat */ + +#ifdef OPT_MCH_DEC_V1_NBE + com_e = sub( Cy_hat_diag_e, limit_e ); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( i = 0; i < lengthCy; ++i ) { Cy_hat_diag_fx_e[i] = Cy_hat_diag_e; move16(); +#ifdef OPT_MCH_DEC_V1_NBE + IF( GT_32( limit_fx, L_shl_sat( Cy_hat_diag_fx[i], com_e ) ) ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( limit_fx, limit_e, Cy_hat_diag_fx[i], Cy_hat_diag_e ) > 0 ) /* Computing Cy_hat_diag = max(Cy_hat_diag,limit) */ +#endif /* OPT_MCH_DEC_V1_NBE */ { Cy_hat_diag_fx[i] = limit_fx; move32(); @@ -1483,7 +1526,7 @@ Word16 computeMixingMatricesResidual_fx( #ifdef OPT_MCH_DEC_V1_BE Kx_fx[i] = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); // Q(31-(Kx_fx_e+G_hag_e)) #else /* OPT_MCH_DEC_V1_BE */ - L_tmp = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); // Q(31-(Kx_fx_e+G_hag_e)) + L_tmp = Mpy_32_32( Kx_fx[i], G_hat_fx[i] ); // Q(31-(Kx_fx_e+G_hag_e)) Kx_fx[i] = L_tmp; #endif /* OPT_MCH_DEC_V1_BE */ move32(); diff --git a/lib_dec/ivas_svd_dec_fx.c b/lib_dec/ivas_svd_dec_fx.c index 2afe48db6..ba65c4b7b 100644 --- a/lib_dec/ivas_svd_dec_fx.c +++ b/lib_dec/ivas_svd_dec_fx.c @@ -322,7 +322,11 @@ Word16 svd_fx( move16(); FOR( iCh = 0; iCh < lengthSingularValues - 1; iCh++ ) { +#ifdef OPT_MCH_DEC_V1_NBE + IF( LT_32( L_shl_sat( singularValues_fx[iCh], sub( singularValues_fx_e[iCh], singularValues_fx_e[iCh + 1] ) ), singularValues_fx[iCh + 1] ) ) +#else /* OPT_MCH_DEC_V1_NBE */ IF( BASOP_Util_Cmp_Mant32Exp( singularValues_fx[iCh], singularValues_fx_e[iCh], singularValues_fx[iCh + 1], singularValues_fx_e[iCh + 1] ) < 0 ) +#endif /* OPT_MCH_DEC_V1_NBE */ { condition = 1; move16(); @@ -427,14 +431,24 @@ static Word16 BidagonalDiagonalisation_fx( FOR( jCh = iCh; jCh >= 0; jCh-- ) { - split = sub( jCh, 1 ); /* Q0 */ - IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( secDiag_fx[jCh] ), secDiag_new_e[jCh], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is secDiag[ch] vanishing compared to eps_x */ +#ifdef OPT_MCH_DEC_V1_NBE + Word16 com_e = s_max( secDiag_new_e[jCh], eps_x_e ); + IF( LE_32( L_shr( L_abs( secDiag_fx[jCh] ), sub( com_e, secDiag_new_e[jCh] ) ), L_shr( Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), sub( com_e, eps_x_e ) ) ) ) /* is secDiag[ch] vanishing compared to eps_x */ +#else + split = sub( jCh, 1 ); /* Q0 */ /* OPT_MCH_DEC_V1_NBE */ + IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( secDiag_fx[jCh] ), secDiag_new_e[jCh], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is secDiag[ch] vanishing compared to eps_x */ +#endif /* OPT_MCH_DEC_V1_NBE */ { found_split = 0; move16(); BREAK; } +#ifdef OPT_MCH_DEC_V1_NBE + com_e = s_max( singularValues_new_e[jCh - 1], eps_x_e ); + IF( LE_32( L_shr( L_abs( singularValues_fx[jCh - 1] ), sub( com_e, singularValues_new_e[jCh - 1] ) ), L_shr( Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), sub( com_e, eps_x_e ) ) ) ) /* is singularValues[jCh - 1] vanishing compared to eps_x */ +#else /* OPT_MCH_DEC_V1_NBE */ IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( singularValues_fx[split] ), singularValues_new_e[split], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is singularValues[split] vanishing compared to eps_x */ +#endif /* OPT_MCH_DEC_V1_NBE */ { BREAK; } @@ -462,14 +476,21 @@ static Word16 BidagonalDiagonalisation_fx( move32(); c_e = 0; move16(); - +#ifdef OPT_MCH_DEC_V1_NBE + split = sub( jCh, 1 ); /* Q0 */ +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( kCh = jCh; kCh <= iCh; kCh++ ) { g = Mpy_32_32( s, secDiag_fx[kCh] ); /* exp(s_e + secDiag_new_e) */ g_e = add( s_e, secDiag_new_e[kCh] ); secDiag_fx[kCh] = Mpy_32_32( c, secDiag_fx[kCh] ); /* exp(c_e + secDiag_new_e) */ secDiag_new_e[kCh] = add( c_e, secDiag_new_e[kCh] ); - IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( g ), g_e, Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is singularValues[split] vanishing compared to eps_x */ +#ifdef OPT_MCH_DEC_V1_NBE + Word16 com_e = s_max( g_e, eps_x_e ); + IF( LE_32( L_shr( L_abs( g ), sub( com_e, g_e ) ), L_shr( Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), sub( com_e, eps_x_e ) ) ) ) +#else /* OPT_MCH_DEC_V1_NBE */ + IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( g ), g_e, Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is singularValues[split] vanishing compared to eps_x */ +#endif /* OPT_MCH_DEC_V1_NBE */ { BREAK; } @@ -794,8 +815,8 @@ static void ApplyRotation_fx( #ifdef OPT_MCH_DEC_V1_BE singularVector[ch][currentIndex2] = W_shl_sat_l( temp, op_e ); // Q(singularVector) #else /* OPT_MCH_DEC_V1_BE */ - temp = W_shr( temp, op_e ); // Q(singularVector) - singularVector[ch][currentIndex2] = W_sat_l( temp ); // Q(singularVector) + temp = W_shr( temp, op_e ); // Q(singularVector) + singularVector[ch][currentIndex2] = W_sat_l( temp ); // Q(singularVector) #endif /* OPT_MCH_DEC_V1_BE */ move32(); @@ -803,8 +824,8 @@ static void ApplyRotation_fx( #ifdef OPT_MCH_DEC_V1_BE singularVector[ch][currentIndex1] = W_shl_sat_l( temp, op_e ); // Q(singularVector) #else /* OPT_MCH_DEC_V1_BE */ - temp = W_shr( temp, op_e ); // Q(singularVector) - singularVector[ch][currentIndex1] = W_sat_l( temp ); // Q(singularVector) + temp = W_shr( temp, op_e ); // Q(singularVector) + singularVector[ch][currentIndex1] = W_sat_l( temp ); // Q(singularVector) #endif /* OPT_MCH_DEC_V1_BE */ move32(); } @@ -929,9 +950,15 @@ static void biDiagonalReductionLeft_fx( Word16 invVal_e; Word32 invVal; invVal = BASOP_Util_Divide3232_Scale_newton( MAXVAL_WORD32, maxWithSign_fx( *sig_x ), &invVal_e ); +#ifdef OPT_MCH_DEC_V1_NBE + Word64 temp = 0; + move64(); + Word16 max_e = MIN_16; +#else /* OPT_MCH_DEC_V1_NBE */ norm_x = 0; move32(); norm_x_e = 0; +#endif /* OPT_MCH_DEC_V1_NBE */ move16(); FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { @@ -940,8 +967,25 @@ static void biDiagonalReductionLeft_fx( move32(); singularVectors2_e[jCh][currChannel] = sub( add( invVal_e, sub( singularVectors2_e[jCh][currChannel], *sig_x_e ) ), temp_e ); move16(); +#ifdef OPT_MCH_DEC_V1_NBE + max_e = s_max( max_e, singularVectors2_e[jCh][currChannel] ); +#else /* OPT_MCH_DEC_V1_NBE */ norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( singularVectors2_e[jCh][currChannel], 1 ), &norm_x_e ); /* exp(norm_x_e) */ +#endif /* OPT_MCH_DEC_V1_NBE */ } + +#ifdef OPT_MCH_DEC_V1_NBE + FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + temp = W_add( temp, L_shr( Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( sub( max_e, singularVectors2_e[jCh][currChannel] ), 1 ) ) ); + } + + Word16 nrm = W_norm( temp ); + nrm = sub( nrm, 32 ); + norm_x = W_shl_sat_l( temp, nrm ); + norm_x_e = sub( add( max_e, max_e ), nrm ); +#endif /* OPT_MCH_DEC_V1_NBE */ + IF( GT_16( norm_x_e, 0 ) ) { norm_x = MAX_32; @@ -969,6 +1013,30 @@ static void biDiagonalReductionLeft_fx( FOR( iCh = currChannel + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { +#ifdef OPT_MCH_DEC_V1_NBE + Word16 max2_e = MIN_16; + max_e = MIN_16; + move16(); + move16(); + temp = 0; + move64(); + + FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + max_e = s_max( max_e, singularVectors2_e[jCh][currChannel] ); /* exp(norm_x_e) */ + max2_e = s_max( max2_e, singularVectors2_e[jCh][iCh] ); /* exp(norm_x_e) */ + } + max_e = add( max_e, max2_e ); + + FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ + { + temp = W_add( temp, L_shr( Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), sub( max_e, add( singularVectors2_e[jCh][currChannel], singularVectors2_e[jCh][iCh] ) ) ) ); + } + nrm = W_norm( temp ); + nrm = sub( nrm, 32 ); + norm_x = W_shl_sat_l( temp, nrm ); + norm_x_e = sub( max_e, nrm ); +#else /* OPT_MCH_DEC_V1_NBE */ norm_x = 0; move32(); norm_x_e = 0; @@ -977,6 +1045,7 @@ static void biDiagonalReductionLeft_fx( { norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), add( singularVectors2_e[jCh][currChannel], singularVectors2_e[jCh][iCh] ), &norm_x_e ); /* exp(norm_x_e) */ } +#endif /* OPT_MCH_DEC_V1_NBE */ f = Mpy_32_32( norm_x, invVal ); /* invVal_e + (norm_x_e - r_e) */ f_e = add( invVal_e, sub( norm_x_e, r_e ) ); @@ -1228,8 +1297,16 @@ static void singularVectorsAccumulationLeft_fx( move32(); } } +#ifdef OPT_MCH_DEC_V1_NBE + Word16 exp = s_max( singularVectors_Left_e[nCh][nCh], 1 ); + singularVectors_Left[nCh][nCh] = L_sub( L_shr( singularVectors_Left[nCh][nCh], sub( exp, singularVectors_Left_e[nCh][nCh] ) ), L_shr( MINUS_ONE_IN_Q31, exp ) ); /* exp(sing_exp2) */ + move32(); + singularVectors_Left_e[nCh][nCh] = exp; + move16(); +#else /* OPT_MCH_DEC_V1_NBE */ singularVectors_Left[nCh][nCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[nCh][nCh], singularVectors_Left_e[nCh][nCh], ONE_IN_Q30, 1, &singularVectors_Left_e[nCh][nCh] ); /* exp(sing_exp2) */ move32(); +#endif /* OPT_MCH_DEC_V1_NBE */ } // fclose(fp); FOR( nCh = 0; nCh < nChannelsL; nCh++ ) @@ -1292,21 +1369,56 @@ static void singularVectorsAccumulationRight_fx( FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ { +#ifdef OPT_MCH_DEC_V1_NBE + Word64 norm_val = 0; + move64(); + Word16 maxL_e = MIN_16; + Word16 maxR_e = MIN_16; + Word16 maxR2_e = MIN_16; + move16(); + move16(); + move16(); + FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ + { + maxL_e = s_max( maxL_e, singularVectors_Left_e[nCh][k] ); + maxR_e = s_max( maxR_e, sing_right_exp[k][iCh] ); + maxR2_e = s_max( maxR2_e, sing_right_exp[k][nCh] ); + } +#else /* OPT_MCH_DEC_V1_NBE */ norm_y = 0; move32(); norm_y_e = 0; move16(); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { - norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[nCh][k], singularVectors_Right[k][iCh] ), add( singularVectors_Left_e[nCh][k], sing_right_exp[k][iCh] ), &norm_y_e ); /* exp(norm_y_e) */ +#ifdef OPT_MCH_DEC_V1_NBE + norm_val = W_mac_32_32( norm_val, L_shr( singularVectors_Left[nCh][k], sub( maxL_e, singularVectors_Left_e[nCh][k] ) ), L_shr( singularVectors_Right[k][iCh], sub( maxR_e, sing_right_exp[k][iCh] ) ) ); +#else /* OPT_MCH_DEC_V1_NBE */ + norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[nCh][k], singularVectors_Right[k][iCh] ), add( singularVectors_Left_e[nCh][k], sing_right_exp[k][iCh] ), &norm_y_e ); /* exp(norm_y_e) */ +#endif /* OPT_MCH_DEC_V1_NBE */ } +#ifdef OPT_MCH_DEC_V1_NBE + norm_y_e = W_norm( norm_val ); + norm_y = W_extract_h( W_shl( norm_val, norm_y_e ) ); + norm_y_e = sub( add( maxL_e, maxR_e ), norm_y_e ); + Word16 max_new = s_max( maxR_e, add( maxR2_e, norm_y_e ) ); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { +#ifdef OPT_MCH_DEC_V1_NBE + Word32 temp = Mpy_32_32( norm_y, singularVectors_Right[k][nCh] ); + Word32 op2 = L_shr( temp, sub( max_new, add( norm_y_e, sing_right_exp[k][nCh] ) ) ); + singularVectors_Right[k][iCh] = L_add_sat( L_shr( singularVectors_Right[k][iCh], sub( max_new, sing_right_exp[k][iCh] ) ), op2 ); /* exp(sing_right_exp) */ + move32(); + singularVectors_Right[k][iCh] = L_shl_sat( singularVectors_Right[k][iCh], max_new ); /* Q31 */ +#else /* OPT_MCH_DEC_V1_NBE */ singularVectors_Right[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Right[k][iCh], sing_right_exp[k][iCh], Mpy_32_32( norm_y, singularVectors_Right[k][nCh] ), add( norm_y_e, sing_right_exp[k][nCh] ), &sing_right_exp[k][iCh] ); /* exp(sing_right_exp) */ move32(); singularVectors_Right[k][iCh] = L_shl_sat( singularVectors_Right[k][iCh], sing_right_exp[k][iCh] ); /* Q31 */ +#endif /* OPT_MCH_DEC_V1_NBE */ move32(); sing_right_exp[k][iCh] = 0; move16(); diff --git a/lib_rend/ivas_dirac_decorr_dec_fx.c b/lib_rend/ivas_dirac_decorr_dec_fx.c index b7c0ebbbc..28c3cd5e7 100644 --- a/lib_rend/ivas_dirac_decorr_dec_fx.c +++ b/lib_rend/ivas_dirac_decorr_dec_fx.c @@ -514,9 +514,9 @@ void ivas_dirac_dec_decorr_process_fx( max_band_decorr = h_freq_domain_decorr_ap_params->max_band_decorr; move16(); -#ifdef OPT_MCH_DEC_V1_BE +#if ( defined OPT_MCH_DEC_V1_NBE || defined OPT_MCH_DEC_V1_BE ) Word16 decorX2 = shl( max_band_decorr, 1 ); -#endif /* OPT_MCH_DEC_V1_BE */ +#endif set32_fx( onset_filter_fx, ONE_IN_Q31, imult1616( num_protos_diff, num_freq_bands ) ); @@ -740,6 +740,7 @@ void ivas_dirac_dec_decorr_process_fx( Word64 aux_64[2 * MAX_OUTPUT_CHANNELS * CLDFB_NO_CHANNELS_MAX]; Word16 e_reverb_energy_smooth, e_direct_energy_smooth; Word16 offset1; + #ifndef OPT_MCH_DEC_V1_BE Word16 offset2; #endif /* OPT_MCH_DEC_V1_BE */ @@ -868,15 +869,25 @@ void ivas_dirac_dec_decorr_process_fx( Word16 max_e = s_max( aux_e, e_reverb_energy_smooth ); Word16 shr_aux = sub( max_e, aux_e ); /* Note: headroom is zero */ Word16 shr_res = sub( max_e, e_reverb_energy_smooth ); /* Note: headroom is zero */ +#ifdef OPT_MCH_DEC_V1_NBE + Word32 temp1 = L_shr( ONE_M_DIRAC_DUCK_ALPHA, shr_aux ); + Word32 temp2 = L_shr( DIRAC_DUCK_ALPHA_FX, shr_res ); +#endif /* OPT_MCH_DEC_V1_NBE */ /* Note: DIRAC_DUCK_ALPHA_FX and ONE_M_DIRAC_DUCK_ALPHA are both in Q31 (e=0) */ /* => a multiplication with this values does not change the q/e value. */ FOR( Word16 i = 0; i < len; i++ ) { +#ifdef OPT_MCH_DEC_V1_NBE + h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i] = Madd_32_32( + Mpy_32_32( aux_buffer_fx[i], temp1 ), + h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i], temp2 ); +#else /* OPT_MCH_DEC_V1_NBE */ h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i] = L_add( L_shr( Mpy_32_32( aux_buffer_fx[i], ONE_M_DIRAC_DUCK_ALPHA ), shr_aux ), L_shr( Mpy_32_32( h_freq_domain_decorr_ap_state->reverb_energy_smooth_fx[i], DIRAC_DUCK_ALPHA_FX ), shr_res ) ); +#endif /* OPT_MCH_DEC_V1_NBE */ move32(); } e_reverb_energy_smooth = max_e; @@ -889,12 +900,22 @@ void ivas_dirac_dec_decorr_process_fx( Word16 max_x = s_max( den_e, e_direct_energy_smooth ); Word16 shr_den = sub( max_x, den_e ); /* Note: headroom is zero */ Word16 shr_des = sub( max_x, e_direct_energy_smooth ); /* Note: headroom is zero */ +#ifdef OPT_MCH_DEC_V1_NBE + temp1 = L_shr( ONE_M_DIRAC_DUCK_ALPHA, shr_den ); + temp2 = L_shr( DIRAC_DUCK_ALPHA_FX, shr_des ); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( Word16 i = 0; i < len; i++ ) { +#ifdef OPT_MCH_DEC_V1_NBE + h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i] = Madd_32_32( + Mpy_32_32( direct_energy_fx[i], temp1 ), + h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i], temp2 ); +#else /* OPT_MCH_DEC_V1_NBE */ h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i] = L_add( L_shr( Mpy_32_32( direct_energy_fx[i], ONE_M_DIRAC_DUCK_ALPHA ), shr_den ), L_shr( Mpy_32_32( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx[i], DIRAC_DUCK_ALPHA_FX ), shr_des ) ); +#endif /* OPT_MCH_DEC_V1_NBE */ move32(); } e_direct_energy_smooth = max_x; @@ -903,6 +924,7 @@ void ivas_dirac_dec_decorr_process_fx( move16(); // scaling energy buffers for better precision for higher values// +#ifndef OPT_MCH_DEC_V1_NBE q_shift = L_norm_arr( h_freq_domain_decorr_ap_state->direct_energy_smooth_fx, imult1616( num_protos_dir, max_band_decorr ) ); IF( q_shift != 0 ) { @@ -917,6 +939,7 @@ void ivas_dirac_dec_decorr_process_fx( h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = add( h_freq_domain_decorr_ap_state->q_reverb_energy_smooth, q_shift ); move16(); } +#endif h_freq_domain_decorr_ap_state->q_reverb_energy_smooth = s_min( MAX_Q_FX, h_freq_domain_decorr_ap_state->q_reverb_energy_smooth ); h_freq_domain_decorr_ap_state->q_direct_energy_smooth = s_min( MAX_Q_FX, h_freq_domain_decorr_ap_state->q_direct_energy_smooth ); @@ -928,15 +951,32 @@ void ivas_dirac_dec_decorr_process_fx( move16(); FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { +#ifdef OPT_MCH_DEC_V1_NBE + q_shift = s_min( q_shift, + L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ) ); +#else /* OPT_MCH_DEC_V1_NBE */ q_shift = s_min( q_shift, sub( L_norm_arr( &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ), Q2 ) ); +#endif /* OPT_MCH_DEC_V1_NBE */ } +#ifdef OPT_MCH_DEC_V1_NBE + q_shift = sub( q_shift, 2 ); + FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + Scale_sig32( &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2, q_shift ); + } + q_frame_f = add( q_frame_f, q_shift ); + Word16 diff1 = sub( e_direct_energy_smooth, e_reverb_energy_smooth ); + Word16 diff2 = add( Q30, diff1 ); + diff1 = sub( Q30, diff1 ); +#else /* OPT_MCH_DEC_V1_NBE */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { Scale_sig32( &frame_dec_fx[shl( imult1616( ch_idx, num_freq_bands ), 1 )], shl( max_band_decorr, 1 ), q_shift ); } q_frame_f = add( q_frame_f, q_shift ); +#endif /* OPT_MCH_DEC_V1_NBE */ FOR( ch_idx = 0; ch_idx < num_channels; ch_idx++ ) { @@ -956,6 +996,14 @@ void ivas_dirac_dec_decorr_process_fx( move32(); move32(); +#ifdef OPT_MCH_DEC_V1_NBE + Word64 temp_1 = W_sub( W_shl( reverb_energy_loc, diff1 ), W_mult0_32_32( direct_energy_loc, DIRAC_DUCK_GAMMA_FX ) ); + Word64 temp_2 = W_sub( W_shl( direct_energy_loc, diff2 ), W_mult0_32_32( reverb_energy_loc, DIRAC_DUCK_GAMMA_FX ) ); + + IF( temp_1 > 0 ) + { + duck_gain = BASOP_Util_Divide3232_Scale( Mpy_32_32( direct_energy_loc, DIRAC_DUCK_GAMMA_FX ), L_add( reverb_energy_loc, EPSILON_FX ), &e_duck_gain ); +#else /* OPT_MCH_DEC_V1_NBE */ Word32 temp_1 = Mpy_32_32( direct_energy_loc, DIRAC_DUCK_GAMMA_FX ); // e+1 Word32 temp_2 = Mpy_32_32( reverb_energy_loc, DIRAC_DUCK_GAMMA_FX ); // e+1 Word16 comp_flag_1 = BASOP_Util_Cmp_Mant32Exp( reverb_energy_loc, e_reverb_energy_smooth, temp_1, add( e_direct_energy_smooth, 1 ) ); @@ -963,6 +1011,7 @@ void ivas_dirac_dec_decorr_process_fx( IF( EQ_16( comp_flag_1, 1 ) ) { duck_gain = BASOP_Util_Divide3232_Scale( temp_1, L_add( reverb_energy_loc, EPSILON_FX ), &e_duck_gain ); +#endif /* OPT_MCH_DEC_V1_NBE */ e_duck_gain = add( e_duck_gain, sub( add( e_direct_energy_smooth, 1 ), e_reverb_energy_smooth ) ); duck_gain = Sqrt16( duck_gain, &e_duck_gain ); @@ -974,10 +1023,17 @@ void ivas_dirac_dec_decorr_process_fx( move32(); move32(); } +#ifdef OPT_MCH_DEC_V1_NBE + ELSE IF( temp_2 > 0 ) + { + + duck_gain = BASOP_Util_Divide3232_Scale( direct_energy_loc, L_add( Mpy_32_32( reverb_energy_loc, DIRAC_DUCK_GAMMA_FX ), EPSILON_FX ), &e_duck_gain ); +#else /* OPT_MCH_DEC_V1_NBE */ ELSE IF( EQ_16( comp_flag_2, 1 ) ) { duck_gain = BASOP_Util_Divide3232_Scale( direct_energy_loc, L_add( temp_2, EPSILON_FX ), &e_duck_gain ); +#endif /* OPT_MCH_DEC_V1_NBE */ e_duck_gain = add( e_duck_gain, sub( e_direct_energy_smooth, add( e_reverb_energy_smooth, 1 ) ) ); duck_gain = Sqrt16( duck_gain, &e_duck_gain ); @@ -1048,6 +1104,44 @@ void ivas_dirac_dec_decorr_process_fx( IF( EQ_16( h_freq_domain_decorr_ap_params->add_back_onsets_on, 1 ) ) { +#ifdef OPT_MCH_DEC_V1_NBE + IF( q_if_local ) + { + FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + offset = imult1616( proto_index_dir[ch_idx], num_freq_bands ); + + FOR( k = 0; k < max_band_decorr; ++k ) + { + Word32 op2 = L_shr( L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ), q_if_local ); + aux_buffer_fx[2 * k] = Mpy_32_32( input_frame_fx[2 * ( offset + k )], op2 ); + aux_buffer_fx[2 * k + 1] = Mpy_32_32( input_frame_fx[2 * ( offset + k ) + 1], op2 ); // q_frame_f + move32(); + move32(); + } + + v_add_fx( &frame_dec_fx[2 * ch_idx * num_freq_bands], aux_buffer_fx, &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ); + } + } + ELSE + { + FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) + { + offset = imult1616( proto_index_dir[ch_idx], num_freq_bands ); + + FOR( k = 0; k < max_band_decorr; ++k ) + { + Word32 op2 = L_sub( ONE_IN_Q31, onset_filter_fx[offset + k] ); + aux_buffer_fx[2 * k] = Mpy_32_32( input_frame_fx[2 * ( offset + k )], op2 ); + aux_buffer_fx[2 * k + 1] = Mpy_32_32( input_frame_fx[2 * ( offset + k ) + 1], op2 ); // q_frame_f + move32(); + move32(); + } + + v_add_fx( &frame_dec_fx[2 * ch_idx * num_freq_bands], aux_buffer_fx, &frame_dec_fx[2 * ch_idx * num_freq_bands], decorX2 ); + } + } +#else /* OPT_MCH_DEC_V1_NBE */ FOR( ch_idx = 0; ch_idx < num_channels; ++ch_idx ) { offset = imult1616( proto_index_dir[ch_idx], num_freq_bands ); @@ -1062,6 +1156,7 @@ void ivas_dirac_dec_decorr_process_fx( v_add_fx( &frame_dec_fx[2 * ch_idx * num_freq_bands], aux_buffer_fx, &frame_dec_fx[2 * ch_idx * num_freq_bands], shl( max_band_decorr, 1 ) ); } +#endif /* OPT_MCH_DEC_V1_NBE */ } /* avoid decorrelation above maximum frequency -> set to zero the remaining frequencies*/ -- GitLab From 16873902114de389d33c0125545ab2ce647020fb Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 4 Jul 2025 13:23:59 +0200 Subject: [PATCH 1125/1310] fix comparison with BASOP --- lib_dec/ivas_ism_renderer_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 550128d7c..e5fe873a0 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -338,7 +338,7 @@ void ivas_ism_render_sf_fx( /* update rendered subframe and slots info for all cases apart from a following crend call, the update will then happen in the crend call*/ #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH - if ( renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM ) + if ( NE_16( renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) #else if ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) #endif -- GitLab From 227d8a4ded61fc81e21a4f5364dee7431a807b06 Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Fri, 4 Jul 2025 13:24:30 +0200 Subject: [PATCH 1126/1310] remove extra move16 --- lib_dec/ivas_ism_renderer_fx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index e5fe873a0..686329eea 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -199,7 +199,6 @@ void ivas_ism_render_sf_fx( #ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH num_objects = st_ivas->nchan_ism; - move16(); #else num_objects = st_ivas->nchan_transport; move16(); -- GitLab From 6d95be087e7e0b14312d0a49c2294ffb28405fa8 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 4 Jul 2025 15:16:54 +0530 Subject: [PATCH 1127/1310] Fix for 3GPP issue 1798: Decoder crash for ParamUpmix MC 7.1+4 at 160kbps decoding to mono at 16/32kHz in ivas_ls_setup_conversion_process_mdct_fx() Link #1798 --- lib_dec/ivas_out_setup_conversion_fx.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 2135cd6d6..6e78e9c69 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -695,6 +695,11 @@ void ivas_ls_setup_conversion_process_mdct_fx( Word16 guard_1 = shr( add( find_guarded_bits_fx( tmp_sub ), 1 ), 1 ); Word16 guard_2 = find_guarded_bits_fx( L_mult0( outChannels, inChannels ) ); q_output = sub( q_output, s_max( guard_1, guard_2 ) ); + /* Increase the guard bit by 1 to avoid overflow only if q_output is positive */ + if ( q_output > 0 ) + { + q_output = sub( q_output, 1 ); + } FOR( i = 0; i < inChannels; ++i ) { -- GitLab From be8a2c4ba52ccd9eda84a4cb6d664d9991686515 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 4 Jul 2025 21:37:22 +0530 Subject: [PATCH 1128/1310] Optimization changes for ivas_mcmasa_dmx_fx function - non bit exact --- lib_com/options.h | 1 + lib_enc/ivas_mcmasa_enc_fx.c | 64 ++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index de20f6959..3c6148817 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,6 +80,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCH_DEC_V1_NBE +#define OPT_MCT_ENC_48KB_NBE #define OPT_MCH_DEC_V1_BE #define OPT_MCT_ENC_V2_NBE #define OPT_SBA_DEC_V2_NBE diff --git a/lib_enc/ivas_mcmasa_enc_fx.c b/lib_enc/ivas_mcmasa_enc_fx.c index fb4ea608a..b24623003 100644 --- a/lib_enc/ivas_mcmasa_enc_fx.c +++ b/lib_enc/ivas_mcmasa_enc_fx.c @@ -1942,9 +1942,17 @@ static void ivas_mcmasa_dmx_fx( Word32 alpha_fx, L_tmp, L_tmp1; Word16 multiChEne_e, scale, downmixEne_e = 0, prevEQ_e, tmp, currEQ_e, instEQ_e; move16(); +#ifdef OPT_MCT_ENC_48KB_NBE + Word16 max_exp, tmp_exp, separateChannelFlag; + Word64 tmp_64; + Word64 multiChEne_64_fx = 0; + Word64 downmixEne_64_fx = 0; + move64(); + move64(); +#endif numAnalysisChannels = sub( nchan_inp, 1 ); - IF( hMcMasa->separateChannelEnabled ) + if ( hMcMasa->separateChannelEnabled ) { numAnalysisChannels = sub( nchan_inp, 2 ); } @@ -1957,22 +1965,45 @@ static void ivas_mcmasa_dmx_fx( { FOR( i = 0; i < input_frame; i++ ) { +#ifdef OPT_MCT_ENC_48KB_NBE + multiChEne_64_fx = W_mac_32_32( multiChEne_64_fx, data_fx[j][i], data_fx[j][i] ); // exp: 2*data_e +#else L_tmp1 = BASOP_Util_Add_Mant32Exp( data_fx[j][i], data_e, 0, 0, &scale ); L_tmp = Mpy_32_32( L_tmp1, L_tmp1 ); // data_e + data_e multiChEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale + scale, multiChEne_fx, multiChEne_e, &scale ); multiChEne_e = scale; move16(); +#endif } } - +#ifdef OPT_MCT_ENC_48KB_NBE + tmp = shl( data_e, 1 ); +#endif IF( EQ_16( nchan_transport, 2 ) ) { Word16 numSideChannels; /* Channels other than left, right, center */ Word16 leftIndex, rightIndex; +#ifdef OPT_MCT_ENC_48KB_NBE + Word16 tmp_16; + + separateChannelFlag = 1; + move16(); + if ( hMcMasa->separateChannelEnabled ) + { + separateChannelFlag = 0; + move16(); + } +#endif numSideChannels = sub( shr( numAnalysisChannels, 1 ), 1 ); FOR( j = 0; j < numSideChannels; j++ ) { +#ifdef OPT_MCT_ENC_48KB_NBE + tmp_16 = add( shl( j, 1 ), 2 ); + + leftIndex = add( tmp_16, separateChannelFlag ); + rightIndex = add( add( tmp_16, 1 ), separateChannelFlag ); +#else IF( hMcMasa->separateChannelEnabled ) { leftIndex = add( shl( j, 1 ), 2 ); @@ -1983,7 +2014,7 @@ static void ivas_mcmasa_dmx_fx( leftIndex = add( shl( j, 1 ), 3 ); rightIndex = add( shl( j, 1 ), 4 ); } - +#endif FOR( i = 0; i < input_frame; i++ ) { data_fx[0][i] = L_add( data_fx[0][i], data_fx[leftIndex][i] ); // data_e @@ -2023,15 +2054,28 @@ static void ivas_mcmasa_dmx_fx( { FOR( i = 0; i < input_frame; i++ ) { +#ifdef OPT_MCT_ENC_48KB_NBE + downmixEne_64_fx = W_mac_32_32( downmixEne_64_fx, data_fx[j][i], data_fx[j][i] ); // exp: 2*data_e +#else L_tmp1 = BASOP_Util_Add_Mant32Exp( data_fx[j][i], data_e, 0, 0, &scale ); L_tmp = Mpy_32_32( L_tmp1, L_tmp1 ); // data_e + data_e downmixEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, scale + scale, downmixEne_fx, downmixEne_e, &downmixEne_e ); +#endif } } alpha_fx = 214748364; // 0.1 in Q31 move32(); +#ifdef OPT_MCT_ENC_48KB_NBE + scale = W_norm( multiChEne_64_fx ); + multiChEne_fx = W_extract_h( W_shl( multiChEne_64_fx, scale ) ); + multiChEne_e = sub( tmp, scale ); + + scale = W_norm( downmixEne_64_fx ); + downmixEne_fx = W_extract_h( W_shl( downmixEne_64_fx, scale ) ); + downmixEne_e = sub( tmp, scale ); +#endif L_tmp = Mpy_32_32( alpha_fx, multiChEne_fx ); L_tmp1 = Mpy_32_32( 1932735284 /* 0.9f in Q31 */, hMcMasa->prevMultiChEne_fx ); hMcMasa->prevMultiChEne_fx = BASOP_Util_Add_Mant32Exp( L_tmp, multiChEne_e, L_tmp1, hMcMasa->prevMultiChEne_e, &hMcMasa->prevMultiChEne_e ); @@ -2056,12 +2100,26 @@ static void ivas_mcmasa_dmx_fx( hMcMasa->prevEQ_e = currEQ_e; move16(); +#ifdef OPT_MCT_ENC_48KB_NBE + max_exp = s_max( prevEQ_e, currEQ_e ); + prevEQ_fx = L_shl( prevEQ_fx, sub( prevEQ_e, max_exp ) ); // exp:max_exp + currEQ_fx = L_shl( currEQ_fx, sub( currEQ_e, max_exp ) ); // exp:max_exp + tmp_exp = add( max_exp, 16 ); +#endif + FOR( i = 0; i < input_frame; i++ ) { +#ifdef OPT_MCT_ENC_48KB_NBE + tmp_64 = W_mac_32_32( W_mult_32_16( currEQ_fx, hMcMasa->interpolator_fx[i] ), prevEQ_fx, L_sub( ONE_IN_Q15, hMcMasa->interpolator_fx[i] ) ); // exp:max_exp +16 + scale = W_norm( tmp_64 ); + instEQ_fx = W_extract_h( W_shl( tmp_64, scale ) ); + instEQ_e = sub( tmp_exp, scale ); +#else L_tmp = Mpy_32_32( L_deposit_h( hMcMasa->interpolator_fx[i] ), currEQ_fx ); L_tmp1 = L_sub( 1073741824 /* 1 in Q30 */, L_lshr( L_deposit_h( hMcMasa->interpolator_fx[i] ), 1 ) ); L_tmp1 = Mpy_32_32( L_tmp1, prevEQ_fx ); instEQ_fx = BASOP_Util_Add_Mant32Exp( L_tmp, currEQ_e, L_tmp1, add( prevEQ_e, 1 ), &instEQ_e ); +#endif FOR( j = 0; j < nchan_transport; j++ ) { -- GitLab From 1a983c58d4affdad0a1453dd1c79ee6472aa063c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 7 Jul 2025 12:17:37 +0530 Subject: [PATCH 1129/1310] Fix for LTV crash observed for encoder in CI - xes Encoder original crash for test stream ltv_basop_encoder-OMASA 2TC 3ISM at br sw techs 13.2 to 512 kbps start 24.4 kbps, 32kHz in, 48kHz out, BINAURAL out - Cause: In inov_encode, the h2 buffer (derived from h1) exceeds Q12 range (>8.0f) in float. - Fix: Added saturation when scaling h2 to Q12 --- lib_enc/inov_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index 9c78ccf7f..02ef25096 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -587,7 +587,7 @@ Word16 inov_encode_ivas_fx( set16_fx( y2, 0, L_SUBFR ); Qh2 = sub( 14, norm_s( h2[0] ) ); - scale_sig( h2, L_SUBFR, sub( Q12, Qh2 ) ); + Scale_sig( h2, L_SUBFR, sub( Q12, Qh2 ) ); IF( !Opt_AMR_WB ) { -- GitLab From 9533c4e9d0cf522840d7de7559fc44b707e566e5 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 7 Jul 2025 11:40:20 +0200 Subject: [PATCH 1130/1310] Correct range of L_norm_arr() over xn_buf_fx_32 --- lib_com/options.h | 2 ++ lib_dec/dec_tcx_fx.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 3c6148817..25425b0ca 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -104,6 +104,8 @@ #define FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN #define FIX_1348_BIT_PRECISION_IMPROVEMENT_DYNAMIC_QOLD +#define FIX_1802 + #define FIX_USAN_BASOP_UTIL_DIVIDE3232 /* Eri: Fix USAN error in BASOP_Util_Divide3232_Scale_newton by adding explicit type cast for -1 in hex */ #define FIX_1740_MISING_POP_WMOPS /* VA: fix issue 1740: missing pop_wmops() */ diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 6206577c1..a289fc733 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3464,7 +3464,11 @@ void IMDCT_ivas_fx( // sub( q_xn_buf_fx_32, q_win ) == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_xn_buf_fx_32 - q_win == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 +#ifdef FIX_1802 + q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), sub( L_norm_arr( xn_buf_fx_32 + ( overlap / 2 ) + nz, L_frame ), 1 ) ) ); +#else q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 2 ); +#endif } IMDCT_ivas_fx_rescale( xn_buf_fx, &q_xn_buf_fx, syn_Overl_TDAC_fx, Q_syn_Overl_TDAC_fx, old_syn_overl_fx, Q_old_syn_overl_fx, hTcxDec->old_syn_Overl, &hTcxDec->Q_old_syn_Overl, old_out_fx, q_old_out_fx, q_win, FB_flag ); #endif -- GitLab From 5f8777187b7f5bd31d49b9b1523356bf9fca3f02 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 7 Jul 2025 12:52:06 +0200 Subject: [PATCH 1131/1310] Adjusted scaling of the synth_fx buffer. --- lib_com/options.h | 2 +- lib_dec/ivas_mct_dec_fx.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3c6148817..5724fc2f5 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -119,5 +119,5 @@ #define FIX_ISSUE_1792 /* FhG: fix noise bursts in binaural rendering */ #define FIX_ISSUE_1795_Q3_OVERFLOW /* FhG: Q3 overflow in function WB_BWE_gain_pred_fx (EVS legacy code) BE, MR1855 */ - +#define FIX_ISSUE_1801_NOISE_FLOOR_REDUCTION /* FhG: Fixed getScalefactor usage */ #endif diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index ccc515b03..3baef825f 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -380,17 +380,27 @@ ivas_error ivas_mct_dec_fx( hdrm = getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); IF( hdrm != 0 ) { +#ifdef FIX_ISSUE_1801_NOISE_FLOOR_REDUCTION + Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, hdrm ); + e_sig[0] = sub( e_sig[0], hdrm ); +#else sh = s_min( sub( e_sig[0], 16 ), hdrm ); Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, sh ); e_sig[0] = sub( e_sig[0], sh ); +#endif move16(); } hdrm = getScaleFactor16( synth_fx[1], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); IF( hdrm != 0 ) { +#ifdef FIX_ISSUE_1801_NOISE_FLOOR_REDUCTION + Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, hdrm ); + e_sig[1] = sub( e_sig[1], hdrm ); +#else sh = s_min( sub( e_sig[1], 16 ), hdrm ); Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, sh ); e_sig[1] = sub( e_sig[1], sh ); +#endif move16(); } -- GitLab From 45b66fdc14badd1ee8aee92a7ed712ea90076923 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 7 Jul 2025 13:24:43 +0200 Subject: [PATCH 1132/1310] Removed unused variable to fix Linux compilation failure. --- lib_dec/ivas_mct_dec_fx.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 3baef825f..9d3fbbf6f 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -375,8 +375,11 @@ ivas_error ivas_mct_dec_fx( Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[0]->old_Aq_12_8_fx, hCPE->hCoreCoder[0]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[0]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); Copy_Scale_sig_16_32_no_sat( hCPE->hCoreCoder[1]->old_Aq_12_8_fx, hCPE->hCoreCoder[1]->old_Aq_12_8_fx_32, add( M, 1 ), sub( 28, sub( 15, norm_s( sub( hCPE->hCoreCoder[1]->old_Aq_12_8_fx[0], 1 ) ) ) ) ); ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, e_sig ); - +#ifdef FIX_ISSUE_1801_NOISE_FLOOR_REDUCTION + Word16 hdrm; +#else Word16 hdrm, sh; +#endif hdrm = getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); IF( hdrm != 0 ) { -- GitLab From 13fa6872d23b7d578bf3806083f5090347be0bc0 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 7 Jul 2025 21:26:22 +1000 Subject: [PATCH 1133/1310] basop porting, fix for issue 1806 --- lib_com/options.h | 1 + lib_dec/ivas_binRenderer_internal_fx.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index f28c671ca..b292f4364 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -125,6 +125,7 @@ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ #define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ #define NONBE_FIX_1021_ISM_BRIR_RS_FLUSH /* FhG: issue #1021: fix ISM with JBM and RS renderer flushing*/ +#define FIX_1035_HT_OSBA /* Dlb: issue 1035: Issue with headtracking in OSBA*/ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index cf2f4a9a0..7eae8c1bc 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1204,7 +1204,11 @@ ivas_error ivas_binRenderer_open_fx( hBinRenderer->rotInCldfb = 0; move16(); test(); +#ifdef FIX_1035_HT_OSBA + if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32(st_ivas->ivas_format, SBA_ISM_FORMAT) ) +#else if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) +#endif { hBinRenderer->rotInCldfb = 1; move16(); -- GitLab From d102f50a7b495b3f1ce399d82b305c4b07e8531e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20M=C3=BCller?= Date: Mon, 7 Jul 2025 14:46:09 +0200 Subject: [PATCH 1134/1310] Automatically use latest CI scripts --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c61cf5b4..1c75ef140 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF a31272de16bd1b556269a50bc179321a60f2a500 + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF main include: - local: .gitlab-ci/variables.yml -- GitLab From 7ea9581747c2cfbafaf8dc997ee975ee0f4d408f Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Mon, 7 Jul 2025 15:34:24 +0200 Subject: [PATCH 1135/1310] Increase headroom of xn_buf_fx_32 / q_win to same value as in main branch. --- lib_dec/dec_tcx_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index a289fc733..62db44e96 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -3465,7 +3465,7 @@ void IMDCT_ivas_fx( // q_xn_buf_fx_32 - q_win == 16 - L_norm_arr( xn_buf_fx_32, L_frame ) // q_win == - 16 + L_norm_arr( xn_buf_fx_32, L_frame ) + q_xn_buf_fx_32 #ifdef FIX_1802 - q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), sub( L_norm_arr( xn_buf_fx_32 + ( overlap / 2 ) + nz, L_frame ), 1 ) ) ); + q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), sub( L_norm_arr( xn_buf_fx_32 + ( overlap / 2 ) + nz, L_frame ), 2 ) ) ); #else q_win = s_min( q_win, add( sub( q_xn_buf_fx_32, 16 ), L_norm_arr( xn_buf_fx_32, L_frame ) ) - 2 ); #endif -- GitLab From 77432c2e71e50581820acd0e9b832de455f53187 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 7 Jul 2025 17:37:52 +0200 Subject: [PATCH 1136/1310] Added 1 bit headroom to synth_fx. --- lib_dec/ivas_mct_dec_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index 9d3fbbf6f..c08cec4ce 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -384,6 +384,7 @@ ivas_error ivas_mct_dec_fx( IF( hdrm != 0 ) { #ifdef FIX_ISSUE_1801_NOISE_FLOOR_REDUCTION + hdrm = sub( hdrm, 1 ); Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, hdrm ); e_sig[0] = sub( e_sig[0], hdrm ); #else @@ -397,6 +398,7 @@ ivas_error ivas_mct_dec_fx( IF( hdrm != 0 ) { #ifdef FIX_ISSUE_1801_NOISE_FLOOR_REDUCTION + hdrm = sub( hdrm, 1 ); Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, hdrm ); e_sig[1] = sub( e_sig[1], hdrm ); #else -- GitLab From b9667e4ee41a14f8fff9ec89ef3ad07c6e7d8817 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 8 Jul 2025 10:09:06 +1000 Subject: [PATCH 1137/1310] clang format fix --- lib_dec/ivas_binRenderer_internal_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 7eae8c1bc..883977d6f 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1205,7 +1205,7 @@ ivas_error ivas_binRenderer_open_fx( move16(); test(); #ifdef FIX_1035_HT_OSBA - if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32(st_ivas->ivas_format, SBA_ISM_FORMAT) ) + if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) #else if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) #endif -- GitLab From 837f655c24cdb9cb184d29d8eeeeeb789ba313ed Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 8 Jul 2025 06:15:49 +0530 Subject: [PATCH 1138/1310] Decoder MSAN issue fix, warnings fix --- lib_com/cnst.h | 2 +- lib_dec/dec_tcx_fx.c | 1 + lib_dec/ivas_mdct_core_dec_fx.c | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 792df3946..53032d5ae 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -134,7 +134,7 @@ #define ONE_IN_Q29 536870912 #define ONE_IN_Q30 1073741824 #define ONE_IN_Q31 0x7fffffff -#define MINUS_ONE_IN_Q31 -2147483648 +#define MINUS_ONE_IN_Q31 0x80000000 #define TWO_IN_Q29 1073741824 #define FOUR_IN_Q28 1073741824 diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 6206577c1..643d8bf7d 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -5782,6 +5782,7 @@ void decoder_tcx_imdct_fx( move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_acelp_zir_fx = 0; + set16_fx( acelp_zir_fx, 0, L_FRAME_MAX / 2 ); #else Word16 shift_q = sub( q_x, q_win ); #endif diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 92511a62d..2baa31d22 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1233,7 +1233,10 @@ void ivas_mdct_core_reconstruct_fx( IF( st->core != ACELP_CORE ) { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN - Word16 q_win0, q_winFB0; + Word16 q_win0 = Q15; + move16(); + Word16 q_winFB0 = Q15; + move16(); #else Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win st->hTcxDec->Q_syn_Overl_TDACFB = q_win; -- GitLab From b9ddc95f747742326cb26e5b48981bb8321e27e7 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 8 Jul 2025 11:46:51 +1000 Subject: [PATCH 1139/1310] address review comment --- lib_com/ivas_spar_com_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_spar_com_fx.c b/lib_com/ivas_spar_com_fx.c index 2be38b4bc..656868120 100644 --- a/lib_com/ivas_spar_com_fx.c +++ b/lib_com/ivas_spar_com_fx.c @@ -4334,7 +4334,7 @@ void ivas_get_spar_md_from_dirac_enc_fx( FOR( ch = 1; ch < foa_ch; ch++ ) { /*when control comes here, response_avg_fx[ch] should be less than EPSILON*/ - response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( Q30, EPSILON_FX_SHIFT ) ); // q30 + response_avg_fx[ch] = L_shl( response_avg_fx[ch], Q30 - EPSILON_FX_SHIFT ); // q30 move32(); } } @@ -4939,7 +4939,7 @@ void ivas_get_spar_md_from_dirac_fx( FOR( ch = 1; ch < foa_ch; ch++ ) { /*when control comes here, response_avg_fx[ch] should be less than EPSILON*/ - response_avg_fx[ch] = L_shl( response_avg_fx[ch], sub( Q30, EPSILON_FX_SHIFT ) ); // q30 + response_avg_fx[ch] = L_shl( response_avg_fx[ch], Q30 - EPSILON_FX_SHIFT ); // q30 move32(); } } -- GitLab From c64f3b64c9cf505544c6c5945266373aa3db3051 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 8 Jul 2025 09:36:29 +0530 Subject: [PATCH 1140/1310] Fix for 3GPP issue 1794: High MLD for MC 5.1 Decoder at 192kbps JBM decoding to BINAURAL_ROOM_REVERB Link #1794 --- lib_dec/ivas_jbm_dec_fx.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index b5cd8b186..74be1ed39 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2264,10 +2264,10 @@ ivas_error ivas_jbm_dec_render_fx( FOR( i = 0; i < nchan_in; i++ ) { - scale_sig32( p_output_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q11 + scale_sig32( p_output_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q = *st_ivas->hCrendWrapper->p_io_qfactor IF( st_ivas->hDecoderConfig->Opt_tsm ) { - scale_sig32( p_tc_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q11 + scale_sig32( p_tc_fx[i], *nSamplesRendered, negate( sub( Q11, *st_ivas->hCrendWrapper->p_io_qfactor ) ) ); // Q = *st_ivas->hCrendWrapper->p_io_qfactor } } IF( NE_32( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, @@ -2277,6 +2277,17 @@ ivas_error ivas_jbm_dec_render_fx( return error; } + IF( st_ivas->hDecoderConfig->Opt_tsm ) + { + IF ( NE_16(exp , *st_ivas->hCrendWrapper->p_io_qfactor) ) + { + FOR( i = 0; i < nchan_in; i++ ) + { + scale_sig32( p_tc_fx[i], *nSamplesRendered, sub( *st_ivas->hCrendWrapper->p_io_qfactor, exp ) ); + } + } + } + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); FOR( i = 0; i < nchan_in; i++ ) -- GitLab From 4a5a01acae1eab4127769f401cfe85036b544c6f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 8 Jul 2025 09:39:40 +0530 Subject: [PATCH 1141/1310] Fix for 3GPP issue 1804: Encoder crash for Stereo at 16.4kbps in prep_tbe_exc_fx() Link #1804 --- lib_com/swb_tbe_com_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 8ddfa3e5f..2ca52b8e4 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -7077,7 +7077,7 @@ void prep_tbe_exc_fx( FOR( i = 0; i < L_subfr * HIBND_ACB_L_FAC; i++ ) { L_tmp = L_mult( gain_code16, tmp_code_fx[i] ); /* Q9 + Q_exc + 1*/ - L_tmp = L_shl( L_tmp, 5 ); /* Q9 + Q_exc + Q6*/ + L_tmp = L_shl_o( L_tmp, 5, &Overflow ); /* Q9 + Q_exc + Q6*/ L_tmp = L_mac_o( L_tmp, gain_pit_fx, bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC], &Overflow ); /*Q15+Q_exc */ L_tmp = L_shl_o( L_tmp, 1, &Overflow ); /*16+Q_exc */ /* saturation can occur here */ bwe_exc_fx[i + i_subfr_fx * HIBND_ACB_L_FAC] = round_fx_o( L_tmp, &Overflow ); /*Q_exc */ -- GitLab From 65f7beae15b611574da0aaf55a2e314814f07613 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 8 Jul 2025 09:43:27 +0530 Subject: [PATCH 1142/1310] Clang formatting changes --- lib_dec/ivas_jbm_dec_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index 74be1ed39..d00a9fe80 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -2279,7 +2279,7 @@ ivas_error ivas_jbm_dec_render_fx( IF( st_ivas->hDecoderConfig->Opt_tsm ) { - IF ( NE_16(exp , *st_ivas->hCrendWrapper->p_io_qfactor) ) + IF( NE_16( exp, *st_ivas->hCrendWrapper->p_io_qfactor ) ) { FOR( i = 0; i < nchan_in; i++ ) { @@ -2287,7 +2287,7 @@ ivas_error ivas_jbm_dec_render_fx( } } } - + ivas_binaural_add_LFE_fx( st_ivas, *nSamplesRendered, p_tc_fx, p_output_fx ); FOR( i = 0; i < nchan_in; i++ ) -- GitLab From 5c66dac3241798955f17901ba8969aacff646282 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 4 Jul 2025 21:39:52 +0530 Subject: [PATCH 1143/1310] Fix for 3GPP issue 1763: Rate switching MASA with LTV signal has a couple of worse spikes in BASOP decoder Link #1763 --- lib_com/modif_fs_fx.c | 4 ++-- lib_dec/swb_tbe_dec_fx.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_com/modif_fs_fx.c b/lib_com/modif_fs_fx.c index a9b6581ed..46e24e31a 100644 --- a/lib_com/modif_fs_fx.c +++ b/lib_com/modif_fs_fx.c @@ -1759,8 +1759,8 @@ void interpolate_3_over_1_allpass_fx32( { mem_temp = out[i]; // Qx move32(); - out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2424 ) ); // Qx - // 0.572769 in Q15 -> 18768, 0.074005 in Q15 -> 2424 + out[i] = L_sub_sat( Mpy_32_16_1( L_add_sat( mem[12], mem[11] ), 18768 ), Mpy_32_16_1( L_add_sat( mem_temp, mem[10] ), 2425 ) ); // Qx + // 0.572769 in Q15 -> 18768, 0.074005 in Q15 -> 2425 move32(); mem[10] = mem[11]; // Qx move32(); diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 06da2a83d..c44f7656e 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -1181,8 +1181,9 @@ void ivas_wb_tbe_dec_fx( } ELSE IF( EQ_32( st_fx->output_Fs, 48000 ) ) { - Scale_sig( hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, hBWE_TD->prev_Qx ) ); + Copy_Scale_sig_32_16( hBWE_TD->mem_resamp_HB_fx_32, hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, Q11 ) ); ivas_interpolate_3_over_1_allpass_fx( synth, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB_fx ); + Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, Qx ) ); Copy( upsampled_synth, synth, L_FRAME48k ); } } -- GitLab From 7461e40500642454980701531d2111a98c803229 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 8 Jul 2025 10:58:20 +0530 Subject: [PATCH 1144/1310] Fix for artefacts observed in Linux --- lib_dec/swb_tbe_dec_fx.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index c44f7656e..61dc3d0c5 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -613,6 +613,7 @@ void ivas_wb_tbe_dec_fx( Word16 error[L_FRAME16k]; Word16 synth_frac[L_FRAME16k]; Word16 upsampled_synth[L_FRAME48k]; + Word32 tmp_synL[L_FRAME48k], upsampled_synth_32fx[L_FRAME48k]; Word32 prev_pow, curr_pow, curr_frame_pow; Word16 curr_frame_pow_exp; Word16 temp, scale, n; @@ -1181,10 +1182,10 @@ void ivas_wb_tbe_dec_fx( } ELSE IF( EQ_32( st_fx->output_Fs, 48000 ) ) { + Copy_Scale_sig_16_32_no_sat( synth, tmp_synL, L_FRAME48k, sub( Q11, Qx ) ); + interpolate_3_over_1_allpass_fx32( tmp_synL, L_FRAME16k, upsampled_synth_32fx, hBWE_TD->mem_resamp_HB_fx_32 ); Copy_Scale_sig_32_16( hBWE_TD->mem_resamp_HB_fx_32, hBWE_TD->mem_resamp_HB_fx, INTERP_3_1_MEM_LEN, sub( Qx, Q11 ) ); - ivas_interpolate_3_over_1_allpass_fx( synth, L_FRAME16k, upsampled_synth, hBWE_TD->mem_resamp_HB_fx ); - Copy_Scale_sig_16_32_no_sat( hBWE_TD->mem_resamp_HB_fx, hBWE_TD->mem_resamp_HB_fx_32, INTERP_3_1_MEM_LEN, sub( Q11, Qx ) ); - Copy( upsampled_synth, synth, L_FRAME48k ); + Copy_Scale_sig_32_16( upsampled_synth_32fx, synth, L_FRAME48k, sub( Qx, Q11 ) ); } } ELSE -- GitLab From abcc1940c73a1375aee98746f1f8aba32c978a38 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 8 Jul 2025 15:10:41 +0530 Subject: [PATCH 1145/1310] MSAN Fix: initialising tcx_mdct_window_length --- lib_dec/init_dec_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/init_dec_fx.c b/lib_dec/init_dec_fx.c index 11c108380..7ee1b8c34 100644 --- a/lib_dec/init_dec_fx.c +++ b/lib_dec/init_dec_fx.c @@ -1558,6 +1558,8 @@ ivas_error init_decoder_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxCfg\n" ) ); } + st_fx->hTcxCfg->tcx_mdct_window_length = L_FRAME32k / 2; + move16(); } ELSE { -- GitLab From 802fb9cd53d024f0cb1e550ba0426a22a9b3cdcd Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:11:20 +0200 Subject: [PATCH 1146/1310] [cleanup] accept FIX_1024_REMOVE_PARAMMC_MIXING_MAT --- lib_com/options.h | 1 - lib_dec/ivas_mc_param_dec_fx.c | 10 ---------- lib_dec/ivas_out_setup_conversion_fx.c | 8 -------- 3 files changed, 19 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b292f4364..14a9bf919 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -121,7 +121,6 @@ #define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ -#define FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* VA: issue 1024: remove unused function ivas_param_mc_get_mono_stereo_mixing_matrices() */ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ #define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ #define NONBE_FIX_1021_ISM_BRIR_RS_FLUSH /* FhG: issue #1021: fix ISM with JBM and RS renderer flushing*/ diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index 1767f5cde..a9cbc0264 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -3063,16 +3063,6 @@ static void ivas_param_mc_get_mixing_matrices_fx( return; } -#ifndef FIX_1024_REMOVE_PARAMMC_MIXING_MAT - -/*------------------------------------------------------------------------- - * ivas_param_mc_get_mono_stereo_mixing_matrices() - * - * calculate the direct and residual mixing matrices - * for mono and stereo output - *------------------------------------------------------------------------*/ - -#endif /*------------------------------------------------------------------------- * param_mc_update_mixing_matrices() diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 5ce1f08f1..596115278 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -1190,11 +1190,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( set_zero_fx( cy_fx, MAX_CICP_CHANNELS * MAX_CICP_CHANNELS ); set_zero_fx( Nrqq_fx, MAX_OUTPUT_CHANNELS ); set_zero_fx( target_ch_ener_fx, MAX_OUTPUT_CHANNELS ); -#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* Step 1.2, get target channel energies for the transported format, Nrqq calculation */ -#else - /* Step 1.2, get target channel energies for the transported format as in ivas_param_mc_get_mono_stereo_mixing_matrices(), Nrqq calculation */ -#endif ild_q_fx = hParamMC->icld_q_fx + imult1616( bandIdx, hParamMC->hMetadataPMC->ild_mapping_conf->ild_map_size_lfe ); move16(); FOR( chInIdx = 0; chInIdx < nchan_transport_format; chInIdx++ ) @@ -1216,11 +1212,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc_fx( move32(); } -#ifdef FIX_1024_REMOVE_PARAMMC_MIXING_MAT /* Step 1.3 get target Cy () (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ -#else - /* Step 1.3 get target Cy like in ivas_param_mc_get_mono_stereo_mixing_matrices() (with dmx matrix from CICPX to MONO/STEREO saved in hParamMC) */ -#endif FOR( chOutIdx = 0; chOutIdx < nchan_out; chOutIdx++ ) { FOR( i = 0; i < nchan_transport_format; i++ ) -- GitLab From 528dc61141306ed485003f126c3c15f599b76352 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:11:30 +0200 Subject: [PATCH 1147/1310] [cleanup] accept FIX_1035_HT_OSBA --- lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal_fx.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 14a9bf919..a51d49769 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -124,7 +124,6 @@ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ #define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ #define NONBE_FIX_1021_ISM_BRIR_RS_FLUSH /* FhG: issue #1021: fix ISM with JBM and RS renderer flushing*/ -#define FIX_1035_HT_OSBA /* Dlb: issue 1035: Issue with headtracking in OSBA*/ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 883977d6f..a1b6bb5ed 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1204,11 +1204,7 @@ ivas_error ivas_binRenderer_open_fx( hBinRenderer->rotInCldfb = 0; move16(); test(); -#ifdef FIX_1035_HT_OSBA if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) -#else - if ( EQ_32( st_ivas->ivas_format, MC_FORMAT ) || EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) -#endif { hBinRenderer->rotInCldfb = 1; move16(); -- GitLab From e29ad661df16322a547600a7ff14bd6933c24ee0 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:11:36 +0200 Subject: [PATCH 1148/1310] [cleanup] accept NONBE_FIX_1021_ISM_BRIR_RS_FLUSH --- lib_com/ivas_prot_fx.h | 2 -- lib_com/options.h | 1 - lib_dec/ivas_ism_renderer_fx.c | 16 ---------------- lib_dec/ivas_jbm_dec_fx.c | 12 ------------ lib_dec/ivas_osba_dec_fx.c | 4 ---- 5 files changed, 35 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index a34c2297d..e4945bf52 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -1056,9 +1056,7 @@ ivas_error ivas_ism_renderer_open_fx( void ivas_ism_render_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH const RENDERER_TYPE renderer_type, /* i : active renderer type */ -#endif Word32 *output_fx[], /* i/o: core-coder transport channels/object output */ const Word16 n_samples_to_render /* i : output frame length per channel */ ); diff --git a/lib_com/options.h b/lib_com/options.h index a51d49769..b2f1e6b85 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -123,7 +123,6 @@ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ #define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ -#define NONBE_FIX_1021_ISM_BRIR_RS_FLUSH /* FhG: issue #1021: fix ISM with JBM and RS renderer flushing*/ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 686329eea..44008cf37 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -157,9 +157,7 @@ void ivas_ism_renderer_close( *-------------------------------------------------------------------------*/ void ivas_ism_render_sf_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH const RENDERER_TYPE renderer_type, /* i : active renderer type */ -#endif Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ const Word16 n_samples_to_render /* i : output frame length per channel */ ) @@ -197,17 +195,7 @@ void ivas_ism_render_sf_fx( last_sf = add( last_sf, 1 ); } -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH num_objects = st_ivas->nchan_ism; -#else - num_objects = st_ivas->nchan_transport; - move16(); - if ( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) - { - num_objects = st_ivas->nchan_ism; - move16(); - } -#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; move16(); @@ -336,11 +324,7 @@ void ivas_ism_render_sf_fx( n_samples_rendered_loop = add( n_samples_rendered_loop, n_samples_in_subframe ); /* update rendered subframe and slots info for all cases apart from a following crend call, the update will then happen in the crend call*/ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH if ( NE_16( renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) -#else - if ( NE_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) -#endif { st_ivas->hTcBuffer->subframes_rendered = add( st_ivas->hTcBuffer->subframes_rendered, 1 ); st_ivas->hTcBuffer->slots_rendered = add( st_ivas->hTcBuffer->slots_rendered, st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] ); diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index a4547a483..324c099b6 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -1958,11 +1958,7 @@ ivas_error ivas_jbm_dec_render_fx( IF( EQ_32( st_ivas->renderer_type, RENDERER_TD_PANNING ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); -#else - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); -#endif } ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_NON_DIEGETIC_DOWNMIX ) ) { @@ -2144,11 +2140,7 @@ ivas_error ivas_jbm_dec_render_fx( } /* render objects */ -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_fx, *nSamplesRendered ); -#else - ivas_ism_render_sf_fx( st_ivas, p_output_fx, *nSamplesRendered ); -#endif /* add already rendered SBA part */ FOR( n = 0; n < nchan_out; n++ ) @@ -2686,11 +2678,7 @@ ivas_error ivas_jbm_dec_flush_renderer_fx( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ set16_fx( st_ivas->hIsmRendererData->interpolator_fx, 32767, hTcBuffer->n_samples_granularity ); // 32767=1.0f in Q15 -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf_fx( st_ivas, renderer_type_old, p_output_fx, hTcBuffer->n_samples_granularity ); -#else - ivas_ism_render_sf_fx( st_ivas, p_output_fx, hTcBuffer->n_samples_granularity ); -#endif st_ivas->hCrendWrapper->p_io_qfactor = &st_ivas->hCrendWrapper->io_qfactor; *st_ivas->hCrendWrapper->p_io_qfactor = 11; diff --git a/lib_dec/ivas_osba_dec_fx.c b/lib_dec/ivas_osba_dec_fx.c index 3491b0491..fc325d893 100644 --- a/lib_dec/ivas_osba_dec_fx.c +++ b/lib_dec/ivas_osba_dec_fx.c @@ -308,11 +308,7 @@ ivas_error ivas_osba_render_sf_fx( IF( NE_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { -#ifdef NONBE_FIX_1021_ISM_BRIR_RS_FLUSH ivas_ism_render_sf_fx( st_ivas, st_ivas->renderer_type, p_output_ism, *nSamplesRendered ); -#else - ivas_ism_render_sf_fx( st_ivas, p_output_ism, *nSamplesRendered ); -#endif } FOR( n = 0; n < st_ivas->hDecoderConfig->nchan_out; n++ ) -- GitLab From 6d2d54d0f31a787493cb33006fb4c7bbfb771fe6 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:11:39 +0200 Subject: [PATCH 1149/1310] [cleanup] accept NONBE_FIX_1034_DRY_MASA_RATIOS --- lib_com/ivas_cnst.h | 4 ---- lib_com/options.h | 1 - lib_enc/ivas_masa_enc_fx.c | 12 ------------ 3 files changed, 17 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 6e17c7046..8e5d0d626 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1286,11 +1286,7 @@ enum #define MASA_RATIO_TOLERANCE 0.1f #define MASA_RATIO_THRESHOLD 0.1f #define MASA_ANGLE_TOLERANCE 0.5f -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS #define MASA_RATIO_THRESHOLD_FX 32212255 // 0.015 in Q31 -#else -#define MASA_RATIO_THRESHOLD_FX 214748365 // 0.1 in Q31 -#endif #define MASA_RATIO_TOLERANCE_FX 107374182 // 0.1 in Q30 #define MASA_ANGLE_TOLERANCE_FX ONE_IN_Q21 // 0.5 in Q22 #define MASA_LIMIT_NO_BANDS_SUR_COH 8 diff --git a/lib_com/options.h b/lib_com/options.h index b2f1e6b85..05c7dd2c7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -122,7 +122,6 @@ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ -#define NONBE_FIX_1034_DRY_MASA_RATIOS /* Nokia: Fix issue 1034, use of wrong numDir state. */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 57fc30e78..869b41fd2 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -1857,9 +1857,7 @@ void ivas_masa_combine_directions_fx( hMeta->directional_meta[1].energy_ratio_fx[j][i] = 0; // Q30 move16(); move16(); -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS hMeta->common_meta.diffuse_to_total_ratio_fx[j][i] = L_sub( ONE_IN_Q30, hMeta->directional_meta[0].energy_ratio_fx[j][i] ); // Q30 -#endif IF( computeCoherence ) { @@ -2107,10 +2105,8 @@ static void detect_metadata_composition_fx( { FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; move16(); -#endif hMeta->directional_meta[0].azimuth_fx[sf][band] = hMeta->directional_meta[1].azimuth_fx[sf][band]; /*q22*/ hMeta->directional_meta[0].elevation_fx[sf][band] = hMeta->directional_meta[1].elevation_fx[sf][band]; /*q22*/ hMeta->directional_meta[0].energy_ratio_fx[sf][band] = hMeta->directional_meta[1].energy_ratio_fx[sf][band]; /*q30*/ @@ -2235,12 +2231,8 @@ static void compensate_energy_ratios_fx( UWord8 numDirs; hMeta = &( hMasa->masaMetadata ); -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS numDirs = hMasa->config.numberOfDirections; move16(); -#else - numDirs = (UWord8) add( hMeta->descriptive_meta.numberOfDirections, 1 ); -#endif FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { @@ -3149,20 +3141,16 @@ static void copy_masa_metadata_subframe_fx( ) { UWord8 dir; -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS UWord8 band; -#endif /* directional metadata */ FOR( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) { -#ifdef NONBE_FIX_1034_DRY_MASA_RATIOS FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) { hMetaTo->directional_meta[dir].spherical_index[sfTo][band] = hMetaFrom->directional_meta[dir].spherical_index[sfFrom][band]; move16(); } -#endif Copy32( hMetaFrom->directional_meta[dir].azimuth_fx[sfFrom], hMetaTo->directional_meta[dir].azimuth_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q22 Copy32( hMetaFrom->directional_meta[dir].elevation_fx[sfFrom], hMetaTo->directional_meta[dir].elevation_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q22 Copy32( hMetaFrom->directional_meta[dir].energy_ratio_fx[sfFrom], hMetaTo->directional_meta[dir].energy_ratio_fx[sfTo], MASA_FREQUENCY_BANDS ); // Q30 -- GitLab From 2cbc3f71f02024e7a585221f4e913823d7a64d2f Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:13:15 +0200 Subject: [PATCH 1150/1310] formatting --- lib_dec/ivas_ism_renderer_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_ism_renderer_fx.c b/lib_dec/ivas_ism_renderer_fx.c index 44008cf37..8d141537d 100644 --- a/lib_dec/ivas_ism_renderer_fx.c +++ b/lib_dec/ivas_ism_renderer_fx.c @@ -156,10 +156,10 @@ void ivas_ism_renderer_close( * Object rendering process *-------------------------------------------------------------------------*/ void ivas_ism_render_sf_fx( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const RENDERER_TYPE renderer_type, /* i : active renderer type */ - Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ - const Word16 n_samples_to_render /* i : output frame length per channel */ + Word32 *output_fx[], /* i/o: core-coder transport channels/object output Q11*/ + const Word16 n_samples_to_render /* i : output frame length per channel */ ) { Word16 i, j, k, j2; -- GitLab From d9b5dca01d023e6888862d635db3c7760ee6bc1d Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:22:54 +0200 Subject: [PATCH 1151/1310] [cleanup] accept FIX_638_ENERGIE_IAC_ROM_TABLES --- lib_com/options.h | 1 - lib_rend/ivas_hrtf_fx.c | 4 - lib_rend/ivas_objectRenderer_mix_fx.c | 2 - lib_rend/ivas_rom_binaural_crend_head.h | 2 - lib_rend/ivas_rom_binaural_crend_head_fx.c | 2 - lib_rend/ivas_rom_rend.h | 19 -- lib_rend/ivas_rom_rend_fx.c | 340 --------------------- lib_util/hrtf_file_reader.c | 4 - 8 files changed, 374 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 05c7dd2c7..b61f560ad 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -112,7 +112,6 @@ #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ -#define FIX_638_ENERGIE_IAC_ROM_TABLES /* Orange: Missing left/right and coherence late reverb tables in binary format*/ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ #define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 58dc54b26..7a81b7946 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -33,11 +33,7 @@ #include #include "options.h" #include "prot_fx.h" -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #include "ivas_rom_binaural_crend_head.h" -#else -#include "ivas_rom_rend.h" -#endif #include "ivas_prot_rend_fx.h" #include "ivas_error.h" #include "wmc_auto.h" diff --git a/lib_rend/ivas_objectRenderer_mix_fx.c b/lib_rend/ivas_objectRenderer_mix_fx.c index c46ca25db..b267044b1 100644 --- a/lib_rend/ivas_objectRenderer_mix_fx.c +++ b/lib_rend/ivas_objectRenderer_mix_fx.c @@ -38,9 +38,7 @@ #include "ivas_error.h" #include "wmc_auto.h" #include "ivas_rom_rend.h" -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #include "ivas_rom_binaural_crend_head.h" -#endif #include "ivas_prot_fx.h" /*-------------------------------------------------------------------* diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 4f40c2ed7..0a8e3b7c6 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -348,7 +348,6 @@ extern Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURA extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2522]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2522]; -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB extern float defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern float defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ @@ -374,6 +373,5 @@ extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; / extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ #endif -#endif #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index 436ba60f6..bdf8e0252 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -59650,7 +59650,6 @@ const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS] -6515466, }, }; -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB /********************** defaultHRIR reverb rom tables at sampling rate 48kHz **********************/ @@ -60184,7 +60183,6 @@ const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ }; #endif -#endif Word32 sine_table_Q31 [361] = { diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index 7cbe76051..6c966e457 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -93,25 +93,6 @@ extern const Word16 HRTF_MODEL_N_CPTS_VAR[HRTF_MODEL_N_SECTIONS]; extern const Word32 SincTable_fx[321]; -#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES -extern const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ - -extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ - -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB -extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ -extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -#else -extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -#endif -#endif /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_rom_rend_fx.c b/lib_rend/ivas_rom_rend_fx.c index 5247b8e77..6589adcf7 100644 --- a/lib_rend/ivas_rom_rend_fx.c +++ b/lib_rend/ivas_rom_rend_fx.c @@ -206,346 +206,6 @@ const Word32 SincTable_fx[321] /*Q31*/ = { 8716980, 8185692, 7649294, 7108665, 6564643, 6017979, 5469361, 4919434, 4368840, 3818118, 3267783, 2718370, 2170290, 1624034, 1079948, 538481, }; -#ifndef FIX_638_ENERGIE_IAC_ROM_TABLES -const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 131936432,125285536,105934832,77097344,45729324,19356880,2523696,0,0, - 0,1602425,4763253,5796595,5698884,5608690,5175704,3880368,2303444, - 1553033,1902670,2661537,3300414,3919560,4475624,4485288,3976468,3688169, - 3682129,3375844,2619661,1976758,1906026,2165066,2186943,1765500,1162325, - 671759,348160,140123,27783,0,0,0,148981,534991, - 939926,1281242,1547798,1665910,1550617,1228897,835102,478486,185757, - 0,0,0,0,4294,124554,284273,410840,479828, - 507343,493652,417417,278367,114890,0,0,0,0, - 0,0,0,0,0,29125,130728,242531,313264, - 326954,282528,204816,121735,46976,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,31943,114353,173543, - 205218,205755,176362,128043,69927,20803,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,3355,38117,83214,127372,170993,215553,257966, - 294607,327222,360643,395137,425738,452447,480096,507208,525462, - 533247,534186,526804,505463,469896,424799,372856,312190,242397, - 168711,95831,28319,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,102810,72074,0, - 226962,443858,219445,0,214882,1013209,77846,0,273535, - 1385798,289239,0,472983,1241648,688671,0,306821,870536, - 792153,0,115695,613375,552574,0,0,434462,205890, - 34762,26709,182938,117843,0 -}; -const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8209721,8156956,8050127,7984940,7992858,8011649,7974747,7910306,7917252, - 8038476,8174723,8228729,8192717,8124794,8070352,8029995,7989956,7953608, - 7931152,7912210,7870745,7803402,7745101,7727896,7735563,7724331,7693670, - 7672548,7668253,7662666,7647508,7638633,7652147,7680265,7699593,7698955, - 7689828,7687614,7690835,7685852,7667229,7645042,7629506,7617787,7601639, - 7578545,7554822,7537315,7524279,7507108,7481430,7453328,7431803,7415991, - 7395254,7364820,7335141,7319069,7310202,7296948,7280120,7270700,7273946, - 7282989,7288836,7292510,7303600,7327768,7359376,7389357,7418784,7458856, - 7515186,7577119,7632232,7684091,7741771,7803922,7858506,7897295,7924793, - 7950529,7975309,7989134,7983815,7964337,7942418,7920028,7885853,7832460, - 7773178,7719675,7667640,7605540,7531820,7456659,7388182,7322718,7251305, - 7173342,7099371,7039023,6989942,6943645,6900871,6876377,6876200,6891753, - 6912280,6938008,6976184,7027514,7081939,7129159,7169768,7212416,7260113, - 7303961,7334160,7353923,7375390,7399868,7413919,7410756,7397888,7384995, - 7371128,7347783,7311469,7269433,7231533,7198642,7162562,7118413,7073358, - 7038218,7011467,6978885,6936976,6896929,6866243,6838636,6804318,6763793, - 6726715,6699377,6677726,6654422,6630095,6613880,6612001,6619165,6625113, - 6629517,6642997,6668750,6697196,6718344,6734173,6753895,6779589,6802146, - 6813185,6816633,6823486,6836086,6844013,6839567,6830432,6829887,6834652, - 6833897,6825424,6817447,6817430,6823444,6827572,6826137,6824845,6832135, - 6847612,6860472,6863735,6867082,6885344,6912573,6928050,6933679,6949215, - 6980018,7009084,7024486,7037715,7065515,7103221,7130283,7141717,7156523, - 7182804,7191302,7148830,7066479,6973039,6845448,6642997,6369529,6067757, - 5757018,5407708,4989863,4529504,4091224,3695693,3270760,2711684,2000297, - 1252050,651123,273904,89170,20652,2843,209,134,134, - 125,117,92,75,75,75,58,50,50, - 58,50,41,41,50,41,41,41,41, - 41,41,41,41,41,41,41,41,41, - 41,41,41,41,41 -}; -const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8209721,8156956,8050144,7984965,7992850,8011640,7974756,7910323,7917252, - 8038484,8174707,8228738,8192709,8124794,8070361,8030003,7989948,7953583, - 7931127,7912202,7870737,7803402,7745101,7727896,7735563,7724331,7693679, - 7672548,7668236,7662658,7647491,7638624,7652147,7680265,7699609,7698964, - 7689820,7687597,7690827,7685844,7667229,7645050,7629472,7617779,7601639, - 7578545,7554822,7537315,7524288,7507133,7481447,7453337,7431803,7415982, - 7395229,7364812,7335141,7319077,7310185,7296931,7280120,7270700,7273955, - 7282998,7288836,7292494,7303583,7327776,7359401,7389382,7418776,7458856, - 7515186,7577127,7632241,7684082,7741787,7803939,7858523,7897295,7924793, - 7950529,7975309,7989125,7983824,7964320,7942426,7920062,7885853,7832443, - 7773194,7719675,7667640,7605556,7531829,7456675,7388199,7322726,7251305, - 7173333,7099379,7039032,6989967,6943653,6900880,6876377,6876226,6891753, - 6912271,6937999,6976184,7027514,7081931,7129151,7169768,7212416,7260122, - 7303961,7334160,7353940,7375398,7399868,7413910,7410731,7397871,7384978, - 7371145,7347791,7311477,7269450,7231542,7198633,7162554,7118413,7073358, - 7038218,7011475,6978885,6936976,6896920,6866226,6838628,6804310,6763785, - 6726707,6699369,6677709,6654414,6630095,6613889,6612010,6619148,6625071, - 6629508,6642989,6668750,6697204,6718352,6734190,6753920,6779597,6802146, - 6813210,6816641,6823495,6836095,6844030,6839559,6830457,6829904,6834677, - 6833905,6825416,6817455,6817421,6823428,6827555,6826129,6824837,6832135, - 6847620,6860472,6863735,6867082,6885336,6912582,6928059,6933679,6949232, - 6980026,7009084,7024477,7037706,7065489,7103188,7130275,7141708,7156497, - 7182812,7191285,7148847,7066488,6973047,6845439,6642997,6369529,6067757, - 5757001,5407699,4989863,4529504,4091224,3695702,3270751,2711693,2000297, - 1252050,651123,273904,89170,20652,2843,209,134,134, - 125,117,92,75,75,75,58,50,50, - 58,50,41,41,50,41,41,41,41, - 41,41,41,41,41,41,41,41,41, - 41,41,41,41,41 -}; -const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 131125216,129227112,119736576,105149792,87165424,65548180,45102524,26414452,12630962, - 2261837,646258,0,0,0,362790,1269699,3305916,5226035, - 5552185,5544266,5313545,5242007,4972498,4406099,3304843,2138491,1245809, - 945832,1040724,1586856,2087488,2519669,2930509,3330210,3706959,3852988, - 3845069,3506438,3230889,3049963,3020838,2972117,2692944,2226269,1634369, - 1306206,1176284,1344056,1533169,1651817,1468073,1147695,736184,393929, - 141465,23622,0,0,0,0,0,0,0, - 0,0,31004,186025,403995,663840,869999,1052669,1200174, - 1230910,1195208,1010927,774704,504121,258100,82812,13824,0, - 0,0,0,0,0,0,0,0,0, - 0,35567,94757,127104,150189,159048,139586,103616,29662, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,13287,46305,75833,95294,77980,44426,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,13153,45768,78383,106434, - 117574,114487,101871,68719,36641,6039,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1476, - 5234,21072,40667,63619,89120,116098,144015,171932,199715, - 227901,255818,281723,304405,324941,341584,357824,373796,388962, - 403995,419296,437818,458621,488820,521301,557674,596329,636728, - 680886,727728,776315,821546,862751,897916,926773,952409,971870, - 980460,981802,955227,918049,865167,793897,713233,613106,507477, - 398224,342255,316082,334604,338228 -}; -const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8747993,8732977,8657866,8592845,8534553,8549703,8574332,8613196,8612450, - 8594632,8548151,8528631,8527079,8602383,8683241,8772412,8811402,8825092, - 8787822,8745552,8699960,8676052,8653847,8634210,8606620,8577981,8553109, - 8534922,8521190,8494783,8457906,8405301,8354525,8310963,8294462,8290268, - 8294278,8284279,8267812,8241648,8222362,8207531,8203647,8196752,8187852, - 8170672,8158450,8153660,8165857,8182684,8201064,8209352,8210920,8201391, - 8193506,8188086,8186669,8185008,8178398,8165219,8147653,8126564,8107262, - 8090653,8075973,8060647,8040892,8017060,7990510,7965369,7942812,7924139, - 7905508,7885266,7858574,7828903,7797253,7770124,7745051,7723047,7698192, - 7671231,7638683,7606840,7575458,7552800,7532081,7514280,7493736,7472068, - 7448614,7429295,7412736,7405756,7399180,7393182,7382990,7372018,7362119, - 7358680,7359552,7368629,7377118,7384718,7391127,7398953,7413675,7435679, - 7462522,7492302,7520043,7544714,7568412,7592915,7621662,7651325,7681599, - 7702873,7719423,7728886,7735043,7740672,7747517,7751812,7754412,7743650, - 7728089,7705339,7680970,7656341,7632308,7603568,7571683,7527366,7481606, - 7433699,7390347,7348345,7307132,7260525,7210319,7153108,7097458,7044149, - 6995864,6948351,6898883,6845179,6788657,6732512,6680016,6632990,6592154, - 6553113,6515029,6478094,6441947,6416664,6397714,6388260,6386465,6386851, - 6388319,6391700,6396364,6411102,6429029,6451720,6471844,6489796,6501641, - 6513435,6525204,6542518,6559405,6575670,6584344,6589771,6589813,6590845, - 6592531,6595845,6596365,6592707,6580091,6564161,6543961,6524642,6505902, - 6486113,6462969,6434800,6400113,6364034,6328861,6297445,6268521,6239597, - 6208098,6172732,6136241,6100909,6071330,6044722,6020084,5990858,5959116, - 5923599,5889046,5855634,5825838,5795177,5763938,5725518,5685253,5642211, - 5600763,5560540,5523688,5486661,5449525,5408043,5366612,5325264,5291257, - 5260940,5238031,5214778,5191290,5165126,5142795,5126186,5122067,5121799, - 5124433,5124877,5123837,5133241,5151268,5182239,5223192,5269715,5328527, - 5411331,5510141,5612029,5649811,5591443,5269488,4824515,4151102,3472472, - 2790361,2355655,2029229,1865232,1832432 -}; -const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8747984,8732969,8657857,8592837,8534561,8549686,8574315,8613188,8612450, - 8594632,8548151,8528622,8527070,8602392,8683241,8772404,8811402,8825109, - 8787822,8745552,8699951,8676044,8653847,8634226,8606620,8577964,8553100, - 8534914,8521190,8494808,8457931,8405310,8354525,8310963,8294471,8290276, - 8294278,8284287,8267820,8241639,8222362,8207540,8203664,8196752,8187826, - 8170663,8158450,8153685,8165873,8182684,8201064,8209360,8210945,8201416, - 8193531,8188095,8186669,8185008,8178398,8165219,8147653,8126539,8107237, - 8090644,8075973,8060664,8040875,8017043,7990510,7965369,7942812,7924122, - 7905499,7885283,7858574,7828903,7797270,7770116,7745034,7723056,7698192, - 7671222,7638675,7606840,7575466,7552809,7532089,7514280,7493736,7472068, - 7448597,7429287,7412753,7405756,7399163,7393174,7382981,7372009,7362111, - 7358680,7359560,7368637,7377126,7384718,7391135,7398970,7413692,7435679, - 7462514,7492293,7520026,7544705,7568403,7592915,7621688,7651341,7681582, - 7702873,7719423,7728877,7735026,7740663,7747517,7751829,7754437,7743650, - 7728080,7705330,7680970,7656349,7632308,7603568,7571700,7527383,7481623, - 7433716,7390363,7348353,7307132,7260525,7210327,7153125,7097475,7044149, - 6995872,6948359,6898883,6845179,6788657,6732520,6680024,6632990,6592154, - 6553113,6515037,6478102,6441947,6416664,6397714,6388269,6386457,6386843, - 6388327,6391700,6396347,6411102,6429029,6451712,6471844,6489796,6501624, - 6513427,6525213,6542518,6559405,6575653,6584327,6589763,6589813,6590845, - 6592531,6595836,6596365,6592716,6580099,6564169,6543978,6524642,6505894, - 6486122,6462994,6434817,6400122,6364034,6328852,6297428,6268521,6239597, - 6208090,6172723,6136241,6100909,6071330,6044722,6020076,5990842,5959107, - 5923599,5889037,5855617,5825829,5795169,5763921,5725518,5685253,5642194, - 5600755,5560548,5523688,5486661,5449508,5408026,5366603,5325256,5291257, - 5260949,5238040,5214778,5191281,5165134,5142795,5126194,5122075,5121799, - 5124441,5124877,5123854,5133241,5151259,5182230,5223192,5269715,5328527, - 5411340,5510149,5612037,5649820,5591435,5269472,4824498,4151094,3472472, - 2790378,2355663,2029237,1865240,1832432 -}; - -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB -/* Sample Rate = 16000 */ - - float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = - {0.983044f, 0.960794f, 0.893756f, 0.783586f, 0.638963f, 0.477338f, 0.319879f, 0.183374f, 0.075909f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.003842f, 0.025288f, 0.035886f, - 0.037785f, 0.035991f, 0.034784f, 0.035091f, 0.034683f, 0.030849f, 0.023146f, 0.014061f, 0.007275f, - 0.005053f, 0.006930f, 0.010589f, 0.013905f, 0.016288f, 0.018404f, 0.020849f, 0.023164f, 0.024149f, - 0.023098f, 0.020635f, 0.018325f, 0.017381f, 0.017611f, 0.017534f, 0.015650f, 0.011786f, 0.007342f, - 0.004290f, 0.003732f, 0.005148f, 0.006838f, 0.007172f, 0.005579f, 0.002632f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000238f, 0.001738f, 0.003011f, 0.003910f, - 0.004120f, 0.003394f, 0.001769f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, - 0.000000f, 0.002101f, 0.004247f, 0.006330f, 0.008300f, 0.010110f, 0.011735f, 0.013165f, 0.014384f, - 0.015345f, 0.015972f, 0.016191f}; - - float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = - {1.118974f, 1.115256f, 1.106210f, 1.096901f, 1.092316f, 1.094422f, 1.101140f, 1.107775f, 1.110000f, - 1.106535f, 1.099921f, 1.094914f, 1.095643f, 1.103178f, 1.114955f, 1.126292f, 1.132973f, 1.133288f, - 1.128471f, 1.121439f, 1.114842f, 1.109721f, 1.105480f, 1.100966f, 1.095650f, 1.090074f, 1.085225f, - 1.081525f, 1.078267f, 1.074026f, 1.067777f, 1.059839f, 1.051856f, 1.045772f, 1.042531f, 1.041432f, - 1.040607f, 1.038291f, 1.033910f, 1.028286f, 1.022846f, 1.018514f, 1.015152f, 1.011898f, 1.008047f, - 1.003762f, 0.999992f, 0.997770f, 0.997349f, 0.997960f, 0.998259f, 0.997177f, 0.994506f, 0.990883f, - 0.987207f, 0.984003f, 0.981133f, 0.977984f, 0.973950f, 0.968837f, 0.962915f, 0.956690f, 0.950584f, - 0.944679f, 0.938744f, 0.932399f, 0.925372f, 0.917663f, 0.909568f, 0.901511f, 0.893804f, 0.886455f, - 0.879155f, 0.871463f, 0.863142f, 0.854285f, 0.845334f, 0.836740f, 0.828656f, 0.820817f, 0.812713f, - 0.803960f, 0.794564f, 0.784952f, 0.775633f, 0.766881f, 0.758539f, 0.750156f, 0.741330f, 0.732004f, - 0.722524f, 0.713387f, 0.704919f, 0.697057f, 0.689419f, 0.681576f, 0.673350f, 0.664931f, 0.656703f, - 0.648997f, 0.641801f, 0.634760f, 0.627357f, 0.619192f, 0.610186f, 0.600526f, 0.590442f, 0.579952f, - 0.568762f, 0.556384f, 0.542389f, 0.526648f, 0.509355f, 0.490884f, 0.471542f, 0.451447f, 0.430550f, - 0.408842f, 0.386537f, 0.364126f, 0.342284f, 0.321675f, 0.302809f, 0.286016f, 0.271536f, 0.259639f, - 0.250691f, 0.245099f, 0.243192f}; - - float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = - {1.118974f, 1.115254f, 1.106207f, 1.096903f, 1.092317f, 1.094425f, 1.101145f, 1.107775f, 1.109999f, - 1.106540f, 1.099921f, 1.094912f, 1.095644f, 1.103178f, 1.114952f, 1.126292f, 1.132973f, 1.133288f, - 1.128472f, 1.121439f, 1.114842f, 1.109719f, 1.105481f, 1.100965f, 1.095650f, 1.090072f, 1.085224f, - 1.081527f, 1.078270f, 1.074025f, 1.067775f, 1.059840f, 1.051856f, 1.045772f, 1.042533f, 1.041433f, - 1.040611f, 1.038292f, 1.033911f, 1.028286f, 1.022844f, 1.018512f, 1.015153f, 1.011899f, 1.008050f, - 1.003762f, 0.999995f, 0.997769f, 0.997349f, 0.997959f, 0.998259f, 0.997178f, 0.994509f, 0.990883f, - 0.987204f, 0.984003f, 0.981133f, 0.977983f, 0.973949f, 0.968836f, 0.962914f, 0.956689f, 0.950583f, - 0.944681f, 0.938745f, 0.932399f, 0.925373f, 0.917662f, 0.909567f, 0.901511f, 0.893804f, 0.886456f, - 0.879153f, 0.871467f, 0.863138f, 0.854286f, 0.845334f, 0.836740f, 0.828656f, 0.820816f, 0.812712f, - 0.803961f, 0.794567f, 0.784951f, 0.775631f, 0.766882f, 0.758540f, 0.750158f, 0.741330f, 0.732005f, - 0.722523f, 0.713388f, 0.704920f, 0.697057f, 0.689418f, 0.681575f, 0.673352f, 0.664930f, 0.656706f, - 0.648998f, 0.641802f, 0.634762f, 0.627355f, 0.619192f, 0.610187f, 0.600527f, 0.590442f, 0.579953f, - 0.568763f, 0.556383f, 0.542389f, 0.526646f, 0.509355f, 0.490883f, 0.471543f, 0.451446f, 0.430550f, - 0.408843f, 0.386537f, 0.364127f, 0.342285f, 0.321676f, 0.302809f, 0.286016f, 0.271535f, 0.259640f, - 0.250692f, 0.245099f, 0.243192f}; - - -#else - -const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, - 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, - 1532229,985023,437818,0,0,0,0,0,0, - 0,343865,773496,1203261,2004810,3054258,4103707,4777480,4887673, - 4998000,5066316,4966727,4867271,4767816,4765534,4763253,4760971,4569174, - 4329998,4090822,3659312,3099355,2539533,2037290,1621350,1205543,880065, - 916304,952677,988916,1233058,1477200,1721342,1912602,2090441,2268413, - 2427327,2573490,2719788,2859643,2989834,3120025,3219078,3193576,3168075, - 3142574,2987686,2832665,2677778,2583691,2504771,2425851,2397128,2401692, - 2406255,2356594,2225464,2094333,1933137,1651280,1369423,1087566,924357, - 761148,597940,625051,699677,774302,854295,937779,1021128,1026631, - 915230,803830,670014,446676,223338,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,5100,30735, - 56371,81872,173140,264408,355542,419698,477144,534455,552037, - 543044,533918,485599,378494,271254,173946,115964,57982,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,671,1476,2415,99723,261321,423054,646795, - 963549,1280302,1632087,2124129,2616037,3108080,3841982,4575885,5309922, - 6280181,7309766,8339216,8750996,8750996 -}; -const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269680,9222847,9180350,9155201,9130044,9104894, - 9126688,9148473,9170267,9191549,9212688,9233844,9234423,9221295,9208167, - 9191205,9168497,9145789,9127997,9129884,9131780,9133676,9164823,9195978, - 9227125,9267550,9310290,9353038,9385225,9410374,9435531,9445170,9431538, - 9417907,9399855,9364128,9328409,9292682,9270670,9248667,9226655,9215783, - 9207688,9199593,9183605,9162356,9141108,9116244,9085961,9055678,9028608, - 9014432,9000255,8986078,8975962,8965845,8955728,8926108,8891606,8857103, - 8819145,8778896,8738639,8710806,8701604,8692401,8686227,8692209,8698190, - 8704171,8686706,8669232,8651767,8623917,8593466,8563024,8543554,8531399, - 8519252,8509748,8504203,8498667,8489716,8467083,8444459,8421835,8399773, - 8377711,8355649,8351698,8352268,8352847,8355833,8360430,8365027,8363484, - 8352721,8341959,8331028,8319460,8307884,8296308,8292063,8287827,8283582, - 8271142,8256647,8242159,8221389,8196442,8171494,8150547,8135607,8120659, - 8106465,8095225,8083992,8072760,8043073,8013394,7983706,7949422,7913997, - 7878564,7853893,7836394,7818904,7801472,7784141,7766811,7744782,7703972, - 7663169,7622359,7580802,7539253,7497696,7474266,7455367,7436467,7415496, - 7393140,7370784,7338471,7291235,7244007,7197551,7154232,7110914,7067595, - 7046615,7025627,7004647,6977485,6948779,6920073,6878751,6829015,6779278, - 6733644,6694184,6654724,6618804,6597044,6575284,6553524,6518183,6482842, - 6447501,6401632,6353137,6304634,6267229,6237215,6207201,6181045,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896503,5850198,5825150, - 5805428,5785707,5765742,5745626,5725510,5693398,5643285,5593180,5544358, - 5500720,5457091,5413454,5404126,5394797,5385469,5366930,5346085,5325239, - 5282164,5224274,5166376,5115566,5075376,5035186,5002731,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773822,4700355,4646282,4605153, - 4564023,4540250,4542523,4544788,4536869,4488241,4439612,4390983,4285488, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957300,3691818,3426335,3160861,2774481,2388110,2001740, - 1708239,1437966,1167685,1059581,1059581 -}; -const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269689,9222855,9180358,9155201,9130035,9104869, - 9126663,9148465,9170258,9191540,9212688,9233827,9234415,9221295,9208175, - 9191213,9168488,9145755,9127963,9129867,9131772,9133676,9164831,9195978, - 9227133,9267550,9310281,9353021,9385200,9410357,9435506,9445153,9431522, - 9417899,9399855,9364119,9328384,9292648,9270653,9248658,9226663,9215792, - 9207688,9199593,9183596,9162348,9141100,9116236,9085953,9055678,9028617, - 9014432,9000255,8986070,8975962,8965853,8955745,8926116,8891614,8857103, - 8819145,8778888,8738631,8710789,8701587,8692385,8686219,8692200,8698181, - 8704162,8686697,8669232,8651775,8623917,8593466,8563016,8543546,8531390, - 8519244,8509739,8504203,8498675,8489724,8467100,8444468,8421844,8399773, - 8377703,8355641,8351681,8352252,8352830,8355817,8360414,8365019,8363475, - 8352721,8341959,8331037,8319469,8307893,8296316,8292072,8287835,8283591, - 8271142,8256647,8242151,8221381,8196433,8171494,8150547,8135616,8120676, - 8106482,8095250,8084009,8072777,8043081,8013385,7983698,7949405,7913972, - 7878547,7853876,7836386,7818904,7801481,7784150,7766819,7744790,7703980, - 7663161,7622350,7580793,7539244,7497696,7474258,7455358,7436459,7415487, - 7393132,7370776,7338471,7291244,7244016,7197560,7154241,7110914,7067587, - 7046607,7025627,7004647,6977485,6948770,6920064,6878742,6829006,6779270, - 6733644,6694184,6654724,6618813,6597053,6575301,6553549,6518191,6482842, - 6447492,6401623,6353137,6304643,6267229,6237215,6207201,6181037,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896512,5850207,5825167, - 5805445,5785723,5765750,5745626,5725493,5693382,5643276,5593180,5544375, - 5500729,5457074,5413429,5404109,5394789,5385478,5366939,5346093,5325247, - 5282172,5224282,5166384,5115574,5075384,5035195,5002739,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773814,4700338,4646274,4605153, - 4564023,4540258,4542523,4544788,4536878,4488249,4439612,4390983,4285480, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, - 1708239,1437966,1167685,1059573,1059573 -}; -#endif -#endif /*----------------------------------------------------------------------------------* * t-design and SN3D normalization table *----------------------------------------------------------------------------------*/ diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 4551617de..b38743f1a 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -35,11 +35,7 @@ #include "prot_fx.h" #include "ivas_prot_rend_fx.h" #include "ivas_prot_fx.h" -#ifdef FIX_638_ENERGIE_IAC_ROM_TABLES #include "ivas_rom_binaural_crend_head.h" -#else -#include "ivas_rom_rend.h" -#endif /*---------------------------------------------------------------------* * Local structures -- GitLab From 23339b3f9088d030ed0fe68eae923e3951029a47 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:22:57 +0200 Subject: [PATCH 1152/1310] [cleanup] accept FIX_INV_DIFFUSE_WEIGHT --- lib_com/options.h | 1 - lib_rend/ivas_crend_fx.c | 216 --------------------- lib_rend/ivas_rom_binaural_crend_head.h | 60 ------ lib_rend/ivas_rom_binaural_crend_head_fx.c | 63 ------ lib_rend/ivas_stat_rend.h | 9 - lib_util/hrtf_file_reader.c | 18 -- 6 files changed, 367 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b61f560ad..b1d305f81 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -113,7 +113,6 @@ #define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ -#define FIX_INV_DIFFUSE_WEIGHT /* Orange : Fix error in energy compensation in late binaural */ diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 031926546..825ff582e 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -71,10 +71,8 @@ ivas_error ivas_hrtf_init( hHrtf->max_num_ir = 0; hHrtf->max_num_iterations = 0; hHrtf->index_frequency_max_diffuse = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->same_inv_diffuse_weight = 1; move16(); -#endif move32(); move16(); move16(); @@ -83,16 +81,10 @@ ivas_error ivas_hrtf_init( FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = 0; - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = 0; move16(); -#endif hHrtf->num_iterations[i][j] = 0; move16(); hHrtf->pIndex_frequency_max[i][j] = NULL; @@ -111,10 +103,8 @@ ivas_error ivas_hrtf_init( hHrtf->pOut_to_bin_diffuse_im_fx[j] = NULL; } -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->init_from_rom = 1; move16(); -#endif return IVAS_ERR_OK; } @@ -424,24 +414,11 @@ static ivas_error ivas_rend_initCrend_fx( IF( EQ_32( output_Fs, 48000 ) ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 - } - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[j][tmp]; -#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -450,9 +427,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[j][tmp]; -#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -467,24 +442,11 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 32000 ) ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 - } - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[j][tmp]; -#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -493,9 +455,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[j][tmp]; -#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -510,24 +470,11 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 16000 ) ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 - } - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[j][tmp]; -#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -536,9 +483,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[j][tmp]; -#endif hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -572,16 +517,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -617,16 +556,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -663,17 +596,11 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -717,16 +644,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -762,16 +683,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -808,16 +723,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -861,16 +770,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; @@ -906,16 +809,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; @@ -952,16 +849,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[j][i]; // Q15 move16(); -#endif hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; @@ -1087,26 +978,12 @@ static ivas_error ivas_rend_initCrend_fx( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); } move16(); -#ifndef FIX_INV_DIFFUSE_WEIGHT - - IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) - { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight_fx[tmp]; // Q15 - } - ELSE - { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx[tmp]; // Q15 - } - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight_fx[j][tmp]; move16(); -#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max[tmp][j]; @@ -1115,10 +992,8 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx[j][tmp]; move16(); -#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max[tmp][j]; @@ -1149,16 +1024,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx[i]; // Q31 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx[j][i]; move16(); -#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; @@ -1198,16 +1067,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx[i]; // Q15 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx[j][i]; move16(); -#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j]; @@ -1247,16 +1110,10 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { -#ifndef FIX_INV_DIFFUSE_WEIGHT - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx[i]; // Q31 - move16(); -#endif FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->inv_diffuse_weight_fx[j][i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx[j][i]; move16(); -#endif hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j]; @@ -1289,7 +1146,6 @@ static ivas_error ivas_rend_initCrend_fx( } } -#ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->same_inv_diffuse_weight = 1; for ( i = 0; i < hHrtf->max_num_ir; i++ ) { @@ -1302,7 +1158,6 @@ static ivas_error ivas_rend_initCrend_fx( } } } -#endif pCrend->hHrtfCrend = hHrtf; @@ -1607,15 +1462,10 @@ ivas_error ivas_rend_initCrendWrapper( } hCrend->hTrack = NULL; -#ifdef FIX_INV_DIFFUSE_WEIGHT hCrend->freq_buffer_re_diffuse_fx[0] = NULL; hCrend->freq_buffer_re_diffuse_fx[1] = NULL; hCrend->freq_buffer_im_diffuse_fx[0] = NULL; hCrend->freq_buffer_im_diffuse_fx[1] = NULL; -#else - hCrend->freq_buffer_re_diffuse_fx = NULL; - hCrend->freq_buffer_im_diffuse_fx = NULL; -#endif hCrend->hReverb = NULL; hCrend->reflections = NULL; hCrend->delay_line_rw_index = 0; @@ -1742,7 +1592,6 @@ ivas_error ivas_rend_openCrend( IF( max_total_ir_len > 0 ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT IF( ( hCrend->freq_buffer_re_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); @@ -1758,22 +1607,11 @@ ivas_error ivas_rend_openCrend( { hCrend->freq_buffer_re_diffuse_fx[1] = NULL; } -#else - IF( ( hCrend->freq_buffer_re_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } -#endif -#ifdef FIX_INV_DIFFUSE_WEIGHT set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[0], max_total_ir_len ); IF( hCrend->freq_buffer_re_diffuse_fx[1] != NULL ) { set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx[1], max_total_ir_len ); } -#else - set_zero2_fx( hCrend->freq_buffer_re_diffuse_fx, max_total_ir_len ); -#endif -#ifdef FIX_INV_DIFFUSE_WEIGHT IF( ( hCrend->freq_buffer_im_diffuse_fx[0] = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); @@ -1789,33 +1627,18 @@ ivas_error ivas_rend_openCrend( { hCrend->freq_buffer_im_diffuse_fx[1] = NULL; } -#else - IF( ( hCrend->freq_buffer_im_diffuse_fx = (Word32 *) malloc( sizeof( Word32 ) * max_total_ir_len ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); - } -#endif -#ifdef FIX_INV_DIFFUSE_WEIGHT set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[0], max_total_ir_len ); IF( hCrend->freq_buffer_im_diffuse_fx[1] != NULL ) { set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx[1], max_total_ir_len ); } -#else - set_zero2_fx( hCrend->freq_buffer_im_diffuse_fx, max_total_ir_len ); -#endif } ELSE { -#ifdef FIX_INV_DIFFUSE_WEIGHT hCrend->freq_buffer_re_diffuse_fx[0] = NULL; hCrend->freq_buffer_im_diffuse_fx[0] = NULL; hCrend->freq_buffer_re_diffuse_fx[1] = NULL; hCrend->freq_buffer_im_diffuse_fx[1] = NULL; -#else - hCrend->freq_buffer_re_diffuse_fx = NULL; - hCrend->freq_buffer_im_diffuse_fx = NULL; -#endif } max_total_ir_len = add( extract_l( L_shr( L_add( L_shl( Mult_32_32( hHrtf->latency_s_fx, output_Fs ), 1 ), 1 ), 1 ) ), subframe_length ); /*(int16_t) ( hHrtf->latency_s * output_Fs + 0.5f ) + subframe_length;*/ @@ -1956,7 +1779,6 @@ void ivas_rend_closeCrend( free( hCrend->lfe_delay_line_fx ); hCrend->lfe_delay_line_fx = NULL; } -#ifdef FIX_INV_DIFFUSE_WEIGHT IF( hCrend->freq_buffer_re_diffuse_fx[0] != NULL ) { free( hCrend->freq_buffer_re_diffuse_fx[0] ); @@ -1980,18 +1802,6 @@ void ivas_rend_closeCrend( free( hCrend->freq_buffer_im_diffuse_fx[1] ); hCrend->freq_buffer_im_diffuse_fx[1] = NULL; } -#else - IF( hCrend->freq_buffer_re_diffuse_fx != NULL ) - { - free( hCrend->freq_buffer_re_diffuse_fx ); - hCrend->freq_buffer_re_diffuse_fx = NULL; - } - IF( hCrend->freq_buffer_im_diffuse_fx != NULL ) - { - free( hCrend->freq_buffer_im_diffuse_fx ); - hCrend->freq_buffer_im_diffuse_fx = NULL; - } -#endif IF( hCrend->hTrack != NULL ) { free( hCrend->hTrack ); @@ -2074,9 +1884,7 @@ static ivas_error ivas_rend_crendConvolver( Word16 nchan_in, nchan_out; const Word32 *pIn; Word32 *pFreq_buf_re, *pFreq_buf_im; -#ifdef FIX_INV_DIFFUSE_WEIGHT Word32 *pFreq_buf2_re, *pFreq_buf2_im; -#endif const Word32 *pFreq_filt_re, *pFreq_filt_im; Word32 pOut[L_FRAME48k * 2]; Word32 tmp_out_re[L_FRAME48k]; @@ -2119,7 +1927,6 @@ static ivas_error ivas_rend_crendConvolver( IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT set32_fx( &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse], 0, subframe_length ); set32_fx( &hCrend->freq_buffer_im_diffuse_fx[0][offset_diffuse], 0, subframe_length ); if ( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 ) @@ -2127,10 +1934,6 @@ static ivas_error ivas_rend_crendConvolver( set32_fx( &hCrend->freq_buffer_re_diffuse_fx[1][offset_diffuse], 0, subframe_length ); set32_fx( &hCrend->freq_buffer_im_diffuse_fx[1][offset_diffuse], 0, subframe_length ); } -#else - set32_fx( &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse], 0, subframe_length ); - set32_fx( &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse], 0, subframe_length ); -#endif } i = 0; @@ -2143,7 +1946,6 @@ static ivas_error ivas_rend_crendConvolver( { IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { -#ifdef FIX_INV_DIFFUSE_WEIGHT IF( pCrend->hHrtfCrend->same_inv_diffuse_weight ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse]; @@ -2180,19 +1982,6 @@ static ivas_error ivas_rend_crendConvolver( move32(); } } -#else - pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx - pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx - pFreq_filt_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx - pFreq_filt_im = &hCrend->freq_buffer_im_fx[i][offset]; // Qx - FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) - { - pFreq_buf_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_re[k] ); // Qx - pFreq_buf_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_im[k] ); // Qx - move32(); - move32(); - } -#endif } pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset]; // Qx @@ -2253,7 +2042,6 @@ static ivas_error ivas_rend_crendConvolver( index_in = index_in % pCrend->hHrtfCrend->num_iterations_diffuse[0]; move16(); offset_diffuse = L_mult0( index_in, subframe_length ); -#ifdef FIX_INV_DIFFUSE_WEIGHT if ( pCrend->hHrtfCrend->same_inv_diffuse_weight ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[0][offset_diffuse]; @@ -2264,10 +2052,6 @@ static ivas_error ivas_rend_crendConvolver( pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[j][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[j][offset_diffuse]; } -#else - pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx - pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx -#endif pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re_fx[j][offset]; // Q31 pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im_fx[j][offset]; // Q31 FOR( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max_diffuse[j][m]; k++ ) diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 0a8e3b7c6..30d9cbb24 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -61,11 +61,7 @@ extern UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; -#else -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]; -#endif extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_Combined_HRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_Combined_HRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][240]; @@ -79,11 +75,7 @@ extern UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; -#else -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]; -#endif extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_Combined_HRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_Combined_HRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][160]; @@ -97,11 +89,7 @@ extern UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; -#else -extern Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]; -#endif extern UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_Combined_HRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_Combined_HRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][80]; @@ -122,11 +110,7 @@ extern UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHA extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; -#else -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[FOA_CHANNELS]; -#endif extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_FOA_HRIR_coeff_re_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_FOA_HRIR_coeff_im_48kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][240]; @@ -140,11 +124,7 @@ extern UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHA extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; -#else -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[FOA_CHANNELS]; -#endif extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_FOA_HRIR_coeff_re_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_FOA_HRIR_coeff_im_32kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][160]; @@ -158,11 +138,7 @@ extern UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHA extern UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]; -#else -extern Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[FOA_CHANNELS]; -#endif extern UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_FOA_HRIR_coeff_re_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_FOA_HRIR_coeff_im_16kHz_fx[FOA_CHANNELS][BINAURAL_CHANNELS][80]; @@ -182,11 +158,7 @@ extern UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; -#else -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[HOA2_CHANNELS]; -#endif extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][240]; @@ -200,11 +172,7 @@ extern UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; -#else -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[HOA2_CHANNELS]; -#endif extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][160]; @@ -218,11 +186,7 @@ extern UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]; -#else -extern Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[HOA2_CHANNELS]; -#endif extern UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[HOA2_CHANNELS][BINAURAL_CHANNELS][80]; @@ -241,11 +205,7 @@ extern UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; -#else -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[HOA3_CHANNELS]; -#endif extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240]; extern Word32 CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][240]; @@ -259,11 +219,7 @@ extern UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; -#else -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[HOA3_CHANNELS]; -#endif extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160]; extern Word32 CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][160]; @@ -277,11 +233,7 @@ extern UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_C extern UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]; extern UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]; -#else -extern Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[HOA3_CHANNELS]; -#endif extern UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; extern Word32 CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80]; extern Word32 CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[HOA3_CHANNELS][BINAURAL_CHANNELS][80]; @@ -301,11 +253,7 @@ extern UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; -#else -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]; -#endif extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]; extern Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; extern Word32 CRendBin_Combined_BRIR_coeff_im_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955]; @@ -319,11 +267,7 @@ extern UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; -#else -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]; -#endif extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]; extern Word32 CRendBin_Combined_BRIR_coeff_re_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819]; extern Word32 CRendBin_Combined_BRIR_coeff_im_32kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2819]; @@ -337,11 +281,7 @@ extern UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BIN extern UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]; extern UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; -#ifdef FIX_INV_DIFFUSE_WEIGHT extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]; -#else -extern Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]; -#endif extern UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]; extern Word32 CRendBin_Combined_BRIR_coeff_re_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774]; extern Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1774]; diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index bdf8e0252..866a70c97 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -61,11 +61,7 @@ const UWord16 CRendBin_Combined_HRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -#endif const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -76,11 +72,7 @@ const UWord16 CRendBin_Combined_HRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; -#endif const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -91,11 +83,7 @@ const UWord16 CRendBin_Combined_HRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; -#endif const UWord16 *CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -113,11 +101,7 @@ const UWord16 CRendBin_FOA_HRIR_num_iterations_48kHz[FOA_CHANNELS][BINAURAL_CHAN const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; -#else -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; -#endif const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -128,11 +112,7 @@ const UWord16 CRendBin_FOA_HRIR_num_iterations_32kHz[FOA_CHANNELS][BINAURAL_CHAN const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; -#else -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; -#endif const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -143,11 +123,7 @@ const UWord16 CRendBin_FOA_HRIR_num_iterations_16kHz[FOA_CHANNELS][BINAURAL_CHAN const UWord16 CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[FOA_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][FOA_CHANNELS]={{0, 0, 0, 0},{0, 0, 0, 0}}; -#else -const Word16 CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[FOA_CHANNELS]={0, 0, 0, 0}; -#endif const UWord16 *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -164,11 +140,7 @@ const UWord16 CRendBin_HOA2_HRIR_num_iterations_48kHz[HOA2_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; -#endif const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -179,11 +151,7 @@ const UWord16 CRendBin_HOA2_HRIR_num_iterations_32kHz[HOA2_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; -#endif const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -194,11 +162,7 @@ const UWord16 CRendBin_HOA2_HRIR_num_iterations_16kHz[HOA2_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[HOA2_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HOA2_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[HOA2_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0}; -#endif const UWord16 *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -214,11 +178,7 @@ const UWord16 CRendBin_HOA3_HRIR_num_iterations_48kHz[HOA3_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -#endif const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -229,11 +189,7 @@ const UWord16 CRendBin_HOA3_HRIR_num_iterations_32kHz[HOA3_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -#endif const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -244,11 +200,7 @@ const UWord16 CRendBin_HOA3_HRIR_num_iterations_16kHz[HOA3_CHANNELS][BINAURAL_CH const UWord16 CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; const UWord16 CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[HOA3_CHANNELS][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; const UWord16 CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; -#ifdef FIX_INV_DIFFUSE_WEIGHT const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[BINAURAL_CHANNELS][HOA3_CHANNELS]={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -#else -const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[HOA3_CHANNELS]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; -#endif const Word16 CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[HOA3_CHANNELS]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const UWord16 *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const Word32 *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS]={NULL,NULL}; @@ -265,13 +217,8 @@ const UWord16 CRendBin_Combined_BRIR_num_iterations_48kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {40, 40}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240},{116, 118, 117, 121, 112, 119, 121, 131, 134, 131, 137, 127, 134, 135, 134, 135, 129, 139, 135, 130, 128, 240}},{{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240},{122, 106, 121, 114, 121, 123, 119, 126, 123, 126, 127, 130, 128, 136, 132, 131, 129, 141, 137, 131, 129, 240}},{{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240},{118, 104, 116, 104, 123, 123, 122, 125, 130, 128, 132, 135, 131, 132, 131, 132, 135, 137, 144, 129, 129, 240}},{{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240},{102, 117, 116, 121, 117, 114, 115, 125, 126, 124, 125, 142, 133, 124, 129, 132, 134, 137, 143, 125, 125, 240}},{{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240},{116, 115, 117, 120, 121, 119, 125, 129, 123, 129, 124, 127, 128, 143, 133, 131, 136, 141, 158, 127, 131, 240}},{{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240},{112, 106, 118, 123, 115, 120, 129, 123, 130, 127, 130, 130, 131, 131, 131, 135, 134, 153, 138, 132, 127, 240}},{{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240},{107, 112, 111, 120, 115, 125, 122, 123, 132, 123, 133, 138, 125, 134, 130, 131, 135, 137, 136, 127, 121, 240}},{{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240},{111, 113, 132, 115, 121, 123, 121, 127, 135, 128, 129, 128, 133, 130, 133, 138, 134, 137, 152, 138, 124, 240}},{{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240},{114, 104, 114, 117, 125, 127, 123, 129, 123, 127, 144, 131, 138, 132, 129, 129, 132, 134, 136, 127, 121, 240}},{{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240},{100, 102, 112, 118, 115, 116, 118, 116, 121, 124, 125, 121, 125, 130, 127, 132, 133, 134, 134, 129, 132, 240}},{{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240},{106, 93, 103, 108, 124, 111, 114, 115, 120, 121, 119, 123, 131, 130, 132, 132, 132, 131, 140, 129, 131, 240}},{{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240},{108, 101, 115, 115, 115, 110, 121, 124, 124, 120, 122, 129, 124, 128, 125, 132, 135, 133, 138, 160, 119, 240}},{{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240},{112, 106, 114, 110, 128, 117, 120, 126, 124, 128, 126, 132, 129, 127, 133, 134, 136, 133, 154, 197, 129, 240}},{{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240},{102, 107, 111, 116, 116, 120, 118, 115, 120, 119, 128, 131, 131, 130, 128, 126, 126, 132, 145, 136, 133, 240}},{{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240},{111, 117, 106, 120, 123, 121, 125, 125, 130, 125, 123, 123, 127, 131, 125, 131, 135, 134, 148, 134, 132, 240}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz = 98; -#ifdef FIX_INV_DIFFUSE_WEIGHT const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f},{0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}}; const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907},{7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907}}; -#else -const float CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[HRTF_LS_CHANNELS]={0.224183f, 0.227455f, 0.241830f, 0.207155f, 0.218087f, 0.222942f, 0.232158f, 0.248203f, 0.249262f, 0.261591f, 0.246276f, 0.279163f, 0.285701f, 0.262541f, 0.271844f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[HRTF_LS_CHANNELS]={7346, 7453, 7924, 6788, 7146, 7305, 7607, 8133, 8167, 8571, 8069, 9147, 9361, 8602, 8907}; -#endif const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98},{47, 47, 47, 47, 47, 47, 51, 51, 58, 58, 58, 65, 65, 65, 65, 65, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 91, 91, 93, 93, 93, 98}}; /* Sample Rate = 32000 */ @@ -280,13 +227,8 @@ const UWord16 CRendBin_Combined_BRIR_num_iterations_32kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {40, 40}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][22]={{{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160},{115, 117, 117, 120, 112, 118, 121, 130, 126, 130, 136, 127, 133, 135, 132, 133, 129, 137, 134, 129, 128, 160}},{{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160},{121, 106, 119, 113, 120, 123, 114, 126, 123, 125, 127, 128, 127, 134, 132, 130, 129, 139, 133, 131, 128, 160}},{{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160},{113, 103, 116, 104, 123, 123, 122, 124, 130, 128, 132, 131, 131, 132, 130, 132, 130, 135, 137, 128, 128, 160}},{{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160},{102, 116, 116, 121, 116, 114, 115, 121, 125, 123, 124, 130, 132, 122, 127, 131, 131, 135, 133, 124, 125, 160}},{{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160},{115, 115, 115, 119, 121, 119, 125, 127, 123, 129, 122, 126, 128, 134, 130, 130, 131, 140, 146, 127, 131, 160}},{{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160},{112, 106, 118, 121, 115, 117, 129, 123, 128, 126, 130, 130, 131, 131, 130, 134, 133, 149, 130, 132, 126, 160}},{{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160},{107, 112, 110, 119, 114, 124, 121, 121, 132, 122, 131, 134, 124, 133, 130, 129, 134, 134, 135, 127, 120, 160}},{{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160},{110, 113, 123, 113, 121, 120, 120, 126, 131, 123, 128, 128, 132, 130, 132, 136, 133, 136, 135, 128, 124, 160}},{{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160},{114, 101, 113, 113, 124, 126, 123, 128, 122, 127, 132, 127, 136, 128, 128, 127, 132, 132, 129, 125, 120, 160}},{{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160},{99, 100, 111, 117, 114, 114, 118, 116, 121, 124, 124, 121, 125, 130, 127, 132, 132, 130, 133, 128, 131, 160}},{{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160},{105, 93, 103, 108, 119, 110, 111, 114, 120, 121, 119, 122, 130, 128, 130, 131, 132, 131, 136, 128, 128, 160}},{{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160},{105, 100, 112, 114, 115, 108, 117, 120, 123, 117, 122, 129, 124, 128, 124, 132, 135, 131, 139, 153, 116, 160}},{{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160},{110, 106, 113, 110, 122, 116, 119, 125, 123, 128, 125, 127, 128, 127, 133, 130, 132, 132, 143, 155, 127, 160}},{{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160},{102, 107, 110, 112, 115, 117, 117, 115, 120, 118, 127, 130, 130, 129, 126, 126, 125, 130, 141, 135, 127, 160}},{{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160},{110, 117, 106, 118, 118, 116, 121, 124, 128, 125, 122, 122, 126, 131, 124, 130, 133, 131, 139, 134, 131, 160}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz = 97; -#ifdef FIX_INV_DIFFUSE_WEIGHT const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f},{0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}}; const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907},{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}}; -#else -const float CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[HRTF_LS_CHANNELS]={0.224190f, 0.227445f, 0.241827f, 0.207131f, 0.218113f, 0.222941f, 0.232139f, 0.248192f, 0.249239f, 0.261572f, 0.246309f, 0.279145f, 0.285786f, 0.262528f, 0.271847f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; -#endif const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS][40]={{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97},{47, 47, 47, 47, 47, 47, 50, 50, 56, 56, 56, 63, 63, 63, 63, 63, 72, 72, 72, 74, 74, 77, 77, 79, 81, 81, 81, 81, 87, 87, 87, 87, 87, 87, 93, 93, 93, 93, 93, 97}}; /* Sample Rate = 16000 */ @@ -295,13 +237,8 @@ const UWord16 CRendBin_Combined_BRIR_num_iterations_16kHz[HRTF_LS_CHANNELS][BINA const UWord16 CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {40, 40}; const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][23]={{{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80},{77, 76, 77, 77, 77, 76, 77, 76, 77, 76, 77, 77, 77, 78, 76, 76, 77, 77, 77, 77, 77, 76, 80}},{{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80},{76, 77, 77, 75, 77, 78, 77, 76, 77, 77, 76, 77, 77, 77, 77, 77, 76, 77, 76, 76, 77, 78, 80}},{{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80},{77, 76, 76, 78, 75, 76, 74, 78, 77, 76, 77, 77, 77, 76, 76, 77, 78, 78, 77, 77, 77, 77, 80}},{{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80},{76, 76, 76, 76, 77, 77, 76, 78, 77, 77, 77, 77, 78, 78, 77, 77, 77, 77, 77, 78, 77, 78, 80}},{{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80},{76, 77, 77, 76, 77, 77, 75, 77, 77, 77, 76, 77, 77, 77, 77, 78, 77, 77, 77, 77, 76, 76, 80}},{{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80},{77, 76, 77, 77, 77, 77, 77, 77, 76, 78, 76, 78, 75, 76, 77, 77, 76, 76, 77, 78, 78, 77, 80}},{{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80},{77, 77, 75, 76, 76, 77, 77, 77, 77, 77, 77, 75, 77, 76, 76, 76, 77, 77, 76, 77, 76, 77, 80}},{{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80},{75, 76, 77, 77, 75, 77, 75, 76, 76, 77, 77, 77, 78, 78, 77, 77, 76, 77, 78, 78, 78, 76, 80}},{{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80},{77, 77, 77, 76, 77, 77, 76, 76, 76, 77, 77, 75, 76, 78, 78, 77, 77, 78, 78, 77, 76, 76, 80}},{{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80},{76, 75, 76, 76, 77, 77, 77, 77, 77, 77, 74, 78, 77, 78, 78, 77, 76, 77, 77, 77, 77, 76, 80}},{{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80},{76, 76, 77, 76, 77, 77, 76, 76, 76, 76, 77, 77, 76, 76, 77, 75, 77, 76, 76, 76, 77, 77, 80}},{{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80},{76, 76, 77, 75, 78, 77, 77, 77, 77, 77, 77, 77, 77, 76, 78, 77, 76, 78, 76, 77, 76, 77, 80}},{{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80},{76, 77, 77, 76, 76, 77, 77, 75, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 77, 76, 76, 78, 80}},{{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80},{74, 76, 74, 76, 75, 76, 76, 76, 76, 77, 77, 78, 77, 78, 75, 76, 77, 76, 78, 76, 78, 77, 80}},{{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80},{76, 77, 77, 77, 76, 78, 77, 76, 75, 77, 77, 77, 76, 78, 77, 78, 78, 78, 77, 76, 77, 75, 80}}}; const UWord16 CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz = 77; -#ifdef FIX_INV_DIFFUSE_WEIGHT const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f},{0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}}; const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[BINAURAL_CHANNELS][HRTF_LS_CHANNELS]={{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907},{7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}}; -#else -const float CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[HRTF_LS_CHANNELS]={0.223532f, 0.226827f, 0.248830f, 0.208782f, 0.220391f, 0.219790f, 0.231187f, 0.248730f, 0.251408f, 0.263698f, 0.243858f, 0.281483f, 0.283080f, 0.261660f, 0.273527f}; -const Word16 CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[HRTF_LS_CHANNELS]={7346, 7452, 7924, 6787, 7147, 7305, 7606, 8132, 8167, 8571, 8071, 9147, 9364, 8602, 8907}; -#endif const UWord16 CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS][40]={{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77},{46, 46, 46, 46, 46, 46, 46, 49, 49, 53, 53, 53, 55, 55, 61, 61, 61, 65, 67, 67, 67, 67, 67, 67, 69, 72, 72, 72, 73, 73, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77}}; //BRIR and HRIR coeff tables in Q29 const Word32 CRendBin_Combined_BRIR_coeff_re_48kHz_fx[HRTF_LS_CHANNELS][BINAURAL_CHANNELS][2955] ={ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 963d6dd8d..50e3d7f6c 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1336,12 +1336,8 @@ typedef struct ivas_hrtfs_structure UWord16 index_frequency_max_diffuse; Word16 max_num_ir; Word16 max_num_iterations; -#ifdef FIX_INV_DIFFUSE_WEIGHT Word16 inv_diffuse_weight_fx[BINAURAL_CHANNELS][MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ Word16 same_inv_diffuse_weight; -#else - Word16 inv_diffuse_weight_fx[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] Q15 */ -#endif Word32 latency_s_fx; Word16 init_from_rom; Word16 gain_lfe_fx; // Q14 @@ -1351,13 +1347,8 @@ typedef struct ivas_crend_state_t { Word32 *freq_buffer_re_fx[MAX_INTERN_CHANNELS]; Word32 *freq_buffer_im_fx[MAX_INTERN_CHANNELS]; -#ifdef FIX_INV_DIFFUSE_WEIGHT Word32 *freq_buffer_re_diffuse_fx[BINAURAL_CHANNELS]; Word32 *freq_buffer_im_diffuse_fx[BINAURAL_CHANNELS]; -#else - Word32 *freq_buffer_re_diffuse_fx; - Word32 *freq_buffer_im_diffuse_fx; -#endif Word32 *prev_out_buffer_fx[BINAURAL_CHANNELS]; Word32 *lfe_delay_line_fx; Word32 m_fYaw_fx; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index b38743f1a..8b5dadf39 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -1294,7 +1294,6 @@ static ivas_error create_HRTF_from_rawdata( /* inv_diffuse_weight */ #ifdef USE_NEW_HRTF_BINARY_FILE_FORMAT -#ifdef FIX_INV_DIFFUSE_WEIGHT for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { ( *hHRTF )->inv_diffuse_weight_fx[0][i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); @@ -1306,15 +1305,6 @@ static ivas_error create_HRTF_from_rawdata( hrtf_data_rptr += sizeof( float ); } #else - for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) - { - ( *hHRTF )->inv_diffuse_weight_fx[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); - hrtf_data_rptr += sizeof( float ); - } - hrtf_data_rptr += sizeof( float ) * ( *hHRTF )->max_num_ir; -#endif -#else -#ifdef FIX_INV_DIFFUSE_WEIGHT /* inv_diffuse_weight */ for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) { @@ -1322,14 +1312,6 @@ static ivas_error create_HRTF_from_rawdata( ( *hHRTF )->inv_diffuse_weight_fx[1][i] = ( *hHRTF )->inv_diffuse_weight[0][i]; hrtf_data_rptr += sizeof( float ); } -#else - /* inv_diffuse_weight */ - for ( i = 0; i < ( *hHRTF )->max_num_ir; i++ ) - { - ( *hHRTF )->inv_diffuse_weight[i] = (Word16) ( *( (float *) ( hrtf_data_rptr ) ) * ONE_IN_Q15 ); - hrtf_data_rptr += sizeof( float ); - } -#endif #endif /* max_total_num_fsamp_per_iteration */ -- GitLab From 1adaa7f6966e297006d09ad2950bdce48bee12e2 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:23:00 +0200 Subject: [PATCH 1153/1310] [cleanup] accept NONBE_FIX_AVG_IAC_CLDFB_REVERB --- lib_com/ivas_cnst.h | 4 - lib_com/options.h | 1 - lib_rend/ivas_hrtf_fx.c | 18 -- lib_rend/ivas_objectRenderer_mix_fx.c | 6 - lib_rend/ivas_reverb_fx.c | 11 - lib_rend/ivas_reverb_utils_fx.c | 4 - lib_rend/ivas_rom_binaural_crend_head.h | 14 - lib_rend/ivas_rom_binaural_crend_head_fx.c | 285 --------------------- lib_util/hrtf_file_reader.c | 39 --- 9 files changed, 382 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 8e5d0d626..06d8fa323 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1743,15 +1743,11 @@ typedef enum #define RV_FILTER_MAX_HISTORY ( 512 - 160 ) /* for longest history */ #define RV_LENGTH_NR_FC ( RV_FILTER_MAX_FFT_SIZE / 2 ) + 1 -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB #define RV_LENGTH_NR_FC_16KHZ ( RV_FILTER_MAX_FFT_SIZE / 4 ) + 1 -#endif #define IVAS_REVERB_DEFAULT_N_BANDS 31 #define LR_IAC_LENGTH_NR_FC ( RV_LENGTH_NR_FC ) -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB #define LR_IAC_LENGTH_NR_FC_16KHZ ( RV_LENGTH_NR_FC_16KHZ ) -#endif /*----------------------------------------------------------------------------------* * FB mixer constants diff --git a/lib_com/options.h b/lib_com/options.h index b1d305f81..1bb60b341 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -106,7 +106,6 @@ #define FIX_1372_ISAR_POST_REND #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ #ifdef NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM -#define NONBE_FIX_AVG_IAC_CLDFB_REVERB #endif #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index 7a81b7946..da862b51b 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -284,7 +284,6 @@ ivas_error ivas_HRTF_statistics_init( switch ( sampleRate ) { -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB case 48000: HrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( Word32 ) ); if ( HrtfStatistics->average_energy_l_dyn == NULL ) @@ -354,23 +353,6 @@ ivas_error ivas_HRTF_statistics_init( HrtfStatistics->average_energy_r = (const Word32 *) HrtfStatistics->average_energy_r_dyn; HrtfStatistics->inter_aural_coherence = (const Word32 *) HrtfStatistics->inter_aural_coherence_dyn; break; -#else - case 48000: - HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz_fx; - HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz_fx; - HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_48kHz_fx; - break; - case 32000: - HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_32kHz_fx; - HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_32kHz_fx; - HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz_fx; - break; - case 16000: - HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz_fx; - HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz_fx; - HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz_fx; - break; -#endif } HrtfStatistics->fromROM = TRUE; diff --git a/lib_rend/ivas_objectRenderer_mix_fx.c b/lib_rend/ivas_objectRenderer_mix_fx.c index b267044b1..cb6e3a3fe 100644 --- a/lib_rend/ivas_objectRenderer_mix_fx.c +++ b/lib_rend/ivas_objectRenderer_mix_fx.c @@ -422,7 +422,6 @@ static ivas_error DefaultBSplineModel_fx( HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; // Q23 BREAK; case 16000: -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB for ( i = 0; i < 3; i++ ) { HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); @@ -437,11 +436,6 @@ static ivas_error DefaultBSplineModel_fx( HrFiltSet_p->lr_energy_and_iac_fx[0] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[0]; HrFiltSet_p->lr_energy_and_iac_fx[1] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[1]; HrFiltSet_p->lr_energy_and_iac_fx[2] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[2]; -#else - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; // Q23 -#endif BREAK; } #endif diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index d7dd26ec3..e886bfeab 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1652,17 +1652,10 @@ ivas_error ivas_reverb_open_fx( { params.pDsr_fx[i] = L_shl( params.pDsr_fx[i], params.pDsr_e[i] ); move32(); -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB pHrtf_avg_pwr_response_l_const[i] = params.pHrtf_avg_pwr_response_l_const_fx[i]; /*Q28*/ move32(); pHrtf_avg_pwr_response_r_const[i] = params.pHrtf_avg_pwr_response_r_const_fx[i]; /*Q23+5*/ move32(); -#else - pHrtf_avg_pwr_response_l_const[i] = L_shl( params.pHrtf_avg_pwr_response_l_const_fx[i], 5 ); /*Q23+5*/ - move32(); - pHrtf_avg_pwr_response_r_const[i] = L_shl( params.pHrtf_avg_pwr_response_r_const_fx[i], 5 ); /*Q23+5*/ - move32(); -#endif } FOR( i = 0; i < lenT60_filter_coeff; i++ ) { @@ -1710,11 +1703,7 @@ ivas_error ivas_reverb_open_fx( Word32 *pHrtf_inter_aural_coherence_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 ) ); FOR( i = 0; i < nr_fc_fft_filter; i++ ) { -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], 3 ); /*Scaling up to Q30*/ -#else - pHrtf_inter_aural_coherence_const[i] = params.pHrtf_inter_aural_coherence_const_fx[i]; /*Scaling up to Q30*/ -#endif move32(); } ivas_reverb_calc_correl_filters_fx( pHrtf_inter_aural_coherence_const, pTime_window_fx, pState->fft_size, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx ); diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 2c61d54df..e63e6017a 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -320,11 +320,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( #endif #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB const int16_t avg_pwr_len = sampling_rate == 16000 ? LR_IAC_LENGTH_NR_FC_16KHZ : LR_IAC_LENGTH_NR_FC; -#else - const int16_t avg_pwr_len = LR_IAC_LENGTH_NR_FC; -#endif for ( freq_idx = 0; freq_idx < avg_pwr_len; freq_idx++ ) { diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 30d9cbb24..77d54a5d3 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -288,7 +288,6 @@ extern Word32 CRendBin_Combined_BRIR_coeff_im_16kHz_fx[HRTF_LS_CHANNELS][BINAURA extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[BINAURAL_CHANNELS][2522]; extern Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS][2522]; -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB extern float defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ extern float defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ extern float defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ @@ -300,18 +299,5 @@ extern float defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23* extern float defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-27*/ extern float defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ extern float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ]; /*Q-23*/ -#else -extern const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ - -extern const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ - -extern const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-27*/ -extern const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -extern const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC]; /*Q-23*/ -#endif #endif /* _IVAS_ROM_BINAURAL_CREND_HEAD_ */ diff --git a/lib_rend/ivas_rom_binaural_crend_head_fx.c b/lib_rend/ivas_rom_binaural_crend_head_fx.c index 866a70c97..a14d75137 100644 --- a/lib_rend/ivas_rom_binaural_crend_head_fx.c +++ b/lib_rend/ivas_rom_binaural_crend_head_fx.c @@ -59588,7 +59588,6 @@ const Word32 CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[BINAURAL_CHANNELS] }; -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB /********************** defaultHRIR reverb rom tables at sampling rate 48kHz **********************/ const float defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] = @@ -59836,290 +59835,6 @@ const float defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC_16KHZ] = 0.250692f, 0.245099f, 0.243192f}; -#else - -const Word32 defaultHRIR_coherence_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 131936432,125285536,105934832,77097344,45729324,19356880,2523696,0,0, - 0,1602425,4763253,5796595,5698884,5608690,5175704,3880368,2303444, - 1553033,1902670,2661537,3300414,3919560,4475624,4485288,3976468,3688169, - 3682129,3375844,2619661,1976758,1906026,2165066,2186943,1765500,1162325, - 671759,348160,140123,27783,0,0,0,148981,534991, - 939926,1281242,1547798,1665910,1550617,1228897,835102,478486,185757, - 0,0,0,0,4294,124554,284273,410840,479828, - 507343,493652,417417,278367,114890,0,0,0,0, - 0,0,0,0,0,29125,130728,242531,313264, - 326954,282528,204816,121735,46976,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,31943,114353,173543, - 205218,205755,176362,128043,69927,20803,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,3355,38117,83214,127372,170993,215553,257966, - 294607,327222,360643,395137,425738,452447,480096,507208,525462, - 533247,534186,526804,505463,469896,424799,372856,312190,242397, - 168711,95831,28319,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,102810,72074,0, - 226962,443858,219445,0,214882,1013209,77846,0,273535, - 1385798,289239,0,472983,1241648,688671,0,306821,870536, - 792153,0,115695,613375,552574,0,0,434462,205890, - 34762,26709,182938,117843,0 -}; -const Word32 defaultHRIR_left_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8209721,8156956,8050127,7984940,7992858,8011649,7974747,7910306,7917252, - 8038476,8174723,8228729,8192717,8124794,8070352,8029995,7989956,7953608, - 7931152,7912210,7870745,7803402,7745101,7727896,7735563,7724331,7693670, - 7672548,7668253,7662666,7647508,7638633,7652147,7680265,7699593,7698955, - 7689828,7687614,7690835,7685852,7667229,7645042,7629506,7617787,7601639, - 7578545,7554822,7537315,7524279,7507108,7481430,7453328,7431803,7415991, - 7395254,7364820,7335141,7319069,7310202,7296948,7280120,7270700,7273946, - 7282989,7288836,7292510,7303600,7327768,7359376,7389357,7418784,7458856, - 7515186,7577119,7632232,7684091,7741771,7803922,7858506,7897295,7924793, - 7950529,7975309,7989134,7983815,7964337,7942418,7920028,7885853,7832460, - 7773178,7719675,7667640,7605540,7531820,7456659,7388182,7322718,7251305, - 7173342,7099371,7039023,6989942,6943645,6900871,6876377,6876200,6891753, - 6912280,6938008,6976184,7027514,7081939,7129159,7169768,7212416,7260113, - 7303961,7334160,7353923,7375390,7399868,7413919,7410756,7397888,7384995, - 7371128,7347783,7311469,7269433,7231533,7198642,7162562,7118413,7073358, - 7038218,7011467,6978885,6936976,6896929,6866243,6838636,6804318,6763793, - 6726715,6699377,6677726,6654422,6630095,6613880,6612001,6619165,6625113, - 6629517,6642997,6668750,6697196,6718344,6734173,6753895,6779589,6802146, - 6813185,6816633,6823486,6836086,6844013,6839567,6830432,6829887,6834652, - 6833897,6825424,6817447,6817430,6823444,6827572,6826137,6824845,6832135, - 6847612,6860472,6863735,6867082,6885344,6912573,6928050,6933679,6949215, - 6980018,7009084,7024486,7037715,7065515,7103221,7130283,7141717,7156523, - 7182804,7191302,7148830,7066479,6973039,6845448,6642997,6369529,6067757, - 5757018,5407708,4989863,4529504,4091224,3695693,3270760,2711684,2000297, - 1252050,651123,273904,89170,20652,2843,209,134,134, - 125,117,92,75,75,75,58,50,50, - 58,50,41,41,50,41,41,41,41, - 41,41,41,41,41,41,41,41,41, - 41,41,41,41,41 -}; -const Word32 defaultHRIR_right_avg_power_48kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8209721,8156956,8050144,7984965,7992850,8011640,7974756,7910323,7917252, - 8038484,8174707,8228738,8192709,8124794,8070361,8030003,7989948,7953583, - 7931127,7912202,7870737,7803402,7745101,7727896,7735563,7724331,7693679, - 7672548,7668236,7662658,7647491,7638624,7652147,7680265,7699609,7698964, - 7689820,7687597,7690827,7685844,7667229,7645050,7629472,7617779,7601639, - 7578545,7554822,7537315,7524288,7507133,7481447,7453337,7431803,7415982, - 7395229,7364812,7335141,7319077,7310185,7296931,7280120,7270700,7273955, - 7282998,7288836,7292494,7303583,7327776,7359401,7389382,7418776,7458856, - 7515186,7577127,7632241,7684082,7741787,7803939,7858523,7897295,7924793, - 7950529,7975309,7989125,7983824,7964320,7942426,7920062,7885853,7832443, - 7773194,7719675,7667640,7605556,7531829,7456675,7388199,7322726,7251305, - 7173333,7099379,7039032,6989967,6943653,6900880,6876377,6876226,6891753, - 6912271,6937999,6976184,7027514,7081931,7129151,7169768,7212416,7260122, - 7303961,7334160,7353940,7375398,7399868,7413910,7410731,7397871,7384978, - 7371145,7347791,7311477,7269450,7231542,7198633,7162554,7118413,7073358, - 7038218,7011475,6978885,6936976,6896920,6866226,6838628,6804310,6763785, - 6726707,6699369,6677709,6654414,6630095,6613889,6612010,6619148,6625071, - 6629508,6642989,6668750,6697204,6718352,6734190,6753920,6779597,6802146, - 6813210,6816641,6823495,6836095,6844030,6839559,6830457,6829904,6834677, - 6833905,6825416,6817455,6817421,6823428,6827555,6826129,6824837,6832135, - 6847620,6860472,6863735,6867082,6885336,6912582,6928059,6933679,6949232, - 6980026,7009084,7024477,7037706,7065489,7103188,7130275,7141708,7156497, - 7182812,7191285,7148847,7066488,6973047,6845439,6642997,6369529,6067757, - 5757001,5407699,4989863,4529504,4091224,3695702,3270751,2711693,2000297, - 1252050,651123,273904,89170,20652,2843,209,134,134, - 125,117,92,75,75,75,58,50,50, - 58,50,41,41,50,41,41,41,41, - 41,41,41,41,41,41,41,41,41, - 41,41,41,41,41 -}; -const Word32 defaultHRIR_coherence_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 131125216,129227112,119736576,105149792,87165424,65548180,45102524,26414452,12630962, - 2261837,646258,0,0,0,362790,1269699,3305916,5226035, - 5552185,5544266,5313545,5242007,4972498,4406099,3304843,2138491,1245809, - 945832,1040724,1586856,2087488,2519669,2930509,3330210,3706959,3852988, - 3845069,3506438,3230889,3049963,3020838,2972117,2692944,2226269,1634369, - 1306206,1176284,1344056,1533169,1651817,1468073,1147695,736184,393929, - 141465,23622,0,0,0,0,0,0,0, - 0,0,31004,186025,403995,663840,869999,1052669,1200174, - 1230910,1195208,1010927,774704,504121,258100,82812,13824,0, - 0,0,0,0,0,0,0,0,0, - 0,35567,94757,127104,150189,159048,139586,103616,29662, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,13287,46305,75833,95294,77980,44426,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,13153,45768,78383,106434, - 117574,114487,101871,68719,36641,6039,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1476, - 5234,21072,40667,63619,89120,116098,144015,171932,199715, - 227901,255818,281723,304405,324941,341584,357824,373796,388962, - 403995,419296,437818,458621,488820,521301,557674,596329,636728, - 680886,727728,776315,821546,862751,897916,926773,952409,971870, - 980460,981802,955227,918049,865167,793897,713233,613106,507477, - 398224,342255,316082,334604,338228 -}; -const Word32 defaultHRIR_left_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8747993,8732977,8657866,8592845,8534553,8549703,8574332,8613196,8612450, - 8594632,8548151,8528631,8527079,8602383,8683241,8772412,8811402,8825092, - 8787822,8745552,8699960,8676052,8653847,8634210,8606620,8577981,8553109, - 8534922,8521190,8494783,8457906,8405301,8354525,8310963,8294462,8290268, - 8294278,8284279,8267812,8241648,8222362,8207531,8203647,8196752,8187852, - 8170672,8158450,8153660,8165857,8182684,8201064,8209352,8210920,8201391, - 8193506,8188086,8186669,8185008,8178398,8165219,8147653,8126564,8107262, - 8090653,8075973,8060647,8040892,8017060,7990510,7965369,7942812,7924139, - 7905508,7885266,7858574,7828903,7797253,7770124,7745051,7723047,7698192, - 7671231,7638683,7606840,7575458,7552800,7532081,7514280,7493736,7472068, - 7448614,7429295,7412736,7405756,7399180,7393182,7382990,7372018,7362119, - 7358680,7359552,7368629,7377118,7384718,7391127,7398953,7413675,7435679, - 7462522,7492302,7520043,7544714,7568412,7592915,7621662,7651325,7681599, - 7702873,7719423,7728886,7735043,7740672,7747517,7751812,7754412,7743650, - 7728089,7705339,7680970,7656341,7632308,7603568,7571683,7527366,7481606, - 7433699,7390347,7348345,7307132,7260525,7210319,7153108,7097458,7044149, - 6995864,6948351,6898883,6845179,6788657,6732512,6680016,6632990,6592154, - 6553113,6515029,6478094,6441947,6416664,6397714,6388260,6386465,6386851, - 6388319,6391700,6396364,6411102,6429029,6451720,6471844,6489796,6501641, - 6513435,6525204,6542518,6559405,6575670,6584344,6589771,6589813,6590845, - 6592531,6595845,6596365,6592707,6580091,6564161,6543961,6524642,6505902, - 6486113,6462969,6434800,6400113,6364034,6328861,6297445,6268521,6239597, - 6208098,6172732,6136241,6100909,6071330,6044722,6020084,5990858,5959116, - 5923599,5889046,5855634,5825838,5795177,5763938,5725518,5685253,5642211, - 5600763,5560540,5523688,5486661,5449525,5408043,5366612,5325264,5291257, - 5260940,5238031,5214778,5191290,5165126,5142795,5126186,5122067,5121799, - 5124433,5124877,5123837,5133241,5151268,5182239,5223192,5269715,5328527, - 5411331,5510141,5612029,5649811,5591443,5269488,4824515,4151102,3472472, - 2790361,2355655,2029229,1865232,1832432 -}; -const Word32 defaultHRIR_right_avg_power_32kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 8747984,8732969,8657857,8592837,8534561,8549686,8574315,8613188,8612450, - 8594632,8548151,8528622,8527070,8602392,8683241,8772404,8811402,8825109, - 8787822,8745552,8699951,8676044,8653847,8634226,8606620,8577964,8553100, - 8534914,8521190,8494808,8457931,8405310,8354525,8310963,8294471,8290276, - 8294278,8284287,8267820,8241639,8222362,8207540,8203664,8196752,8187826, - 8170663,8158450,8153685,8165873,8182684,8201064,8209360,8210945,8201416, - 8193531,8188095,8186669,8185008,8178398,8165219,8147653,8126539,8107237, - 8090644,8075973,8060664,8040875,8017043,7990510,7965369,7942812,7924122, - 7905499,7885283,7858574,7828903,7797270,7770116,7745034,7723056,7698192, - 7671222,7638675,7606840,7575466,7552809,7532089,7514280,7493736,7472068, - 7448597,7429287,7412753,7405756,7399163,7393174,7382981,7372009,7362111, - 7358680,7359560,7368637,7377126,7384718,7391135,7398970,7413692,7435679, - 7462514,7492293,7520026,7544705,7568403,7592915,7621688,7651341,7681582, - 7702873,7719423,7728877,7735026,7740663,7747517,7751829,7754437,7743650, - 7728080,7705330,7680970,7656349,7632308,7603568,7571700,7527383,7481623, - 7433716,7390363,7348353,7307132,7260525,7210327,7153125,7097475,7044149, - 6995872,6948359,6898883,6845179,6788657,6732520,6680024,6632990,6592154, - 6553113,6515037,6478102,6441947,6416664,6397714,6388269,6386457,6386843, - 6388327,6391700,6396347,6411102,6429029,6451712,6471844,6489796,6501624, - 6513427,6525213,6542518,6559405,6575653,6584327,6589763,6589813,6590845, - 6592531,6595836,6596365,6592716,6580099,6564169,6543978,6524642,6505894, - 6486122,6462994,6434817,6400122,6364034,6328852,6297428,6268521,6239597, - 6208090,6172723,6136241,6100909,6071330,6044722,6020076,5990842,5959107, - 5923599,5889037,5855617,5825829,5795169,5763921,5725518,5685253,5642194, - 5600755,5560548,5523688,5486661,5449508,5408026,5366603,5325256,5291257, - 5260949,5238040,5214778,5191281,5165134,5142795,5126194,5122075,5121799, - 5124441,5124877,5123854,5133241,5151259,5182230,5223192,5269715,5328527, - 5411340,5510149,5612037,5649820,5591435,5269472,4824498,4151094,3472472, - 2790378,2355663,2029237,1865240,1832432 -}; - -const Word32 defaultHRIR_coherence_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-27*/ = { - 130123416,130123416,128225040,123478832,118732624,113118568,104033232,94947768,85862304, - 75063144,64263984,53464828,43914296,34675820,25437480,17993766,11746601,5499437, - 1532229,985023,437818,0,0,0,0,0,0, - 0,343865,773496,1203261,2004810,3054258,4103707,4777480,4887673, - 4998000,5066316,4966727,4867271,4767816,4765534,4763253,4760971,4569174, - 4329998,4090822,3659312,3099355,2539533,2037290,1621350,1205543,880065, - 916304,952677,988916,1233058,1477200,1721342,1912602,2090441,2268413, - 2427327,2573490,2719788,2859643,2989834,3120025,3219078,3193576,3168075, - 3142574,2987686,2832665,2677778,2583691,2504771,2425851,2397128,2401692, - 2406255,2356594,2225464,2094333,1933137,1651280,1369423,1087566,924357, - 761148,597940,625051,699677,774302,854295,937779,1021128,1026631, - 915230,803830,670014,446676,223338,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,5100,30735, - 56371,81872,173140,264408,355542,419698,477144,534455,552037, - 543044,533918,485599,378494,271254,173946,115964,57982,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,671,1476,2415,99723,261321,423054,646795, - 963549,1280302,1632087,2124129,2616037,3108080,3841982,4575885,5309922, - 6280181,7309766,8339216,8750996,8750996 -}; -const Word32 defaultHRIR_left_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269680,9222847,9180350,9155201,9130044,9104894, - 9126688,9148473,9170267,9191549,9212688,9233844,9234423,9221295,9208167, - 9191205,9168497,9145789,9127997,9129884,9131780,9133676,9164823,9195978, - 9227125,9267550,9310290,9353038,9385225,9410374,9435531,9445170,9431538, - 9417907,9399855,9364128,9328409,9292682,9270670,9248667,9226655,9215783, - 9207688,9199593,9183605,9162356,9141108,9116244,9085961,9055678,9028608, - 9014432,9000255,8986078,8975962,8965845,8955728,8926108,8891606,8857103, - 8819145,8778896,8738639,8710806,8701604,8692401,8686227,8692209,8698190, - 8704171,8686706,8669232,8651767,8623917,8593466,8563024,8543554,8531399, - 8519252,8509748,8504203,8498667,8489716,8467083,8444459,8421835,8399773, - 8377711,8355649,8351698,8352268,8352847,8355833,8360430,8365027,8363484, - 8352721,8341959,8331028,8319460,8307884,8296308,8292063,8287827,8283582, - 8271142,8256647,8242159,8221389,8196442,8171494,8150547,8135607,8120659, - 8106465,8095225,8083992,8072760,8043073,8013394,7983706,7949422,7913997, - 7878564,7853893,7836394,7818904,7801472,7784141,7766811,7744782,7703972, - 7663169,7622359,7580802,7539253,7497696,7474266,7455367,7436467,7415496, - 7393140,7370784,7338471,7291235,7244007,7197551,7154232,7110914,7067595, - 7046615,7025627,7004647,6977485,6948779,6920073,6878751,6829015,6779278, - 6733644,6694184,6654724,6618804,6597044,6575284,6553524,6518183,6482842, - 6447501,6401632,6353137,6304634,6267229,6237215,6207201,6181045,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896503,5850198,5825150, - 5805428,5785707,5765742,5745626,5725510,5693398,5643285,5593180,5544358, - 5500720,5457091,5413454,5404126,5394797,5385469,5366930,5346085,5325239, - 5282164,5224274,5166376,5115566,5075376,5035186,5002731,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773822,4700355,4646282,4605153, - 4564023,4540250,4542523,4544788,4536869,4488241,4439612,4390983,4285488, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957300,3691818,3426335,3160861,2774481,2388110,2001740, - 1708239,1437966,1167685,1059581,1059581 -}; -const Word32 defaultHRIR_right_avg_power_16kHz_fx[LR_IAC_LENGTH_NR_FC] /*Q-23*/ = { - 9335246,9335246,9316514,9269689,9222855,9180358,9155201,9130035,9104869, - 9126663,9148465,9170258,9191540,9212688,9233827,9234415,9221295,9208175, - 9191213,9168488,9145755,9127963,9129867,9131772,9133676,9164831,9195978, - 9227133,9267550,9310281,9353021,9385200,9410357,9435506,9445153,9431522, - 9417899,9399855,9364119,9328384,9292648,9270653,9248658,9226663,9215792, - 9207688,9199593,9183596,9162348,9141100,9116236,9085953,9055678,9028617, - 9014432,9000255,8986070,8975962,8965853,8955745,8926116,8891614,8857103, - 8819145,8778888,8738631,8710789,8701587,8692385,8686219,8692200,8698181, - 8704162,8686697,8669232,8651775,8623917,8593466,8563016,8543546,8531390, - 8519244,8509739,8504203,8498675,8489724,8467100,8444468,8421844,8399773, - 8377703,8355641,8351681,8352252,8352830,8355817,8360414,8365019,8363475, - 8352721,8341959,8331037,8319469,8307893,8296316,8292072,8287835,8283591, - 8271142,8256647,8242151,8221381,8196433,8171494,8150547,8135616,8120676, - 8106482,8095250,8084009,8072777,8043081,8013385,7983698,7949405,7913972, - 7878547,7853876,7836386,7818904,7801481,7784150,7766819,7744790,7703980, - 7663161,7622350,7580793,7539244,7497696,7474258,7455358,7436459,7415487, - 7393132,7370776,7338471,7291244,7244016,7197560,7154241,7110914,7067587, - 7046607,7025627,7004647,6977485,6948770,6920064,6878742,6829006,6779270, - 6733644,6694184,6654724,6618813,6597053,6575301,6553549,6518191,6482842, - 6447492,6401623,6353137,6304643,6267229,6237215,6207201,6181037,6160677, - 6140310,6115580,6073427,6031275,5989122,5942817,5896512,5850207,5825167, - 5805445,5785723,5765750,5745626,5725493,5693382,5643276,5593180,5544375, - 5500729,5457074,5413429,5404109,5394789,5385478,5366939,5346093,5325247, - 5282172,5224282,5166384,5115574,5075384,5035195,5002739,5001238,4999736, - 4998243,4969436,4940630,4911823,4847290,4773814,4700338,4646274,4605153, - 4564023,4540258,4542523,4544788,4536878,4488249,4439612,4390983,4285480, - 4179984,4074489,4025282,3990150,3955019,3974925,4031523,4088129,4108127, - 4073222,4038317,3957292,3691809,3426327,3160844,2774473,2388110,2001740, - 1708239,1437966,1167685,1059573,1059573 -}; - -#endif Word32 sine_table_Q31 [361] = { diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 8b5dadf39..7e38a1a08 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -586,32 +586,24 @@ static ivas_error set_default_reverb_iac_energy( ) { int16_t i; -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB int16_t lr_iac_len; -#endif if ( HrFiltSet_p == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB lr_iac_len = LR_IAC_LENGTH_NR_FC; if ( HrFiltSet_p->SampleRate == 16000 ) { lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; } -#endif if ( HrFiltSet_p->ModelParams.modelROM == 0 ) { for ( i = 0; i < 3; i++ ) { -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); -#else - HrFiltSet_p->lr_energy_and_iac_dyn[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC * sizeof( float ) ); -#endif if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); @@ -630,15 +622,9 @@ static ivas_error set_default_reverb_iac_energy( mvl2l( defaultHRIR_coherence_32kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], LR_IAC_LENGTH_NR_FC ); break; case 16000: -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], Q27, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ -#else - mvl2l( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], LR_IAC_LENGTH_NR_FC ); - mvl2l( defaultHRIR_right_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], LR_IAC_LENGTH_NR_FC ); - mvl2l( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], LR_IAC_LENGTH_NR_FC ); -#endif break; } } @@ -657,7 +643,6 @@ static ivas_error set_default_reverb_iac_energy( HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; break; case 16000: -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB for ( i = 0; i < 3; i++ ) { HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); @@ -672,11 +657,6 @@ static ivas_error set_default_reverb_iac_energy( HrFiltSet_p->lr_energy_and_iac_fx[0] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[0]; HrFiltSet_p->lr_energy_and_iac_fx[1] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[1]; HrFiltSet_p->lr_energy_and_iac_fx[2] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[2]; -#else - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; -#endif break; @@ -726,7 +706,6 @@ static ivas_error load_reverb_from_binary( } lr_iac_len = LR_IAC_LENGTH_NR_FC; -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB #ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( sampleRate == 16000 ) #else @@ -735,7 +714,6 @@ static ivas_error load_reverb_from_binary( { lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; } -#endif header_check_result = IVAS_ERR_OK; @@ -806,7 +784,6 @@ static ivas_error load_reverb_from_binary( hHrtfStatistics->average_energy_r = hHrtfStatistics->average_energy_r_dyn; hHrtfStatistics->inter_aural_coherence = hHrtfStatistics->inter_aural_coherence_dyn; -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_l_dyn, Q28, lr_iac_len ); @@ -815,16 +792,6 @@ static ivas_error load_reverb_from_binary( fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->inter_aural_coherence_dyn, Q26, lr_iac_len ); -#else - fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_l_dyn, Q23, lr_iac_len ); - - fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->average_energy_r_dyn, Q23, lr_iac_len ); - - fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->inter_aural_coherence_dyn, Q23, lr_iac_len ); -#endif hHrtfStatistics->fromROM = FALSE; #else /* left/right energy and interaural coherence for late reverb */ @@ -1155,7 +1122,6 @@ void destroy_td_hrtf( free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); } } -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB else { for ( i = 0; i < 3; i++ ) @@ -1166,7 +1132,6 @@ void destroy_td_hrtf( } } } -#endif #else } #endif @@ -2344,11 +2309,7 @@ void destroy_hrtf_statistics( IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ ) { -#ifdef NONBE_FIX_AVG_IAC_CLDFB_REVERB if ( ( hHrtfStatistics != NULL ) && ( *hHrtfStatistics != NULL ) ) -#else - if ( ( hHrtfStatistics != NULL ) && ( *hHrtfStatistics != NULL ) && ( ( *hHrtfStatistics )->fromROM == FALSE ) ) -#endif { if ( ( *hHrtfStatistics )->average_energy_l_dyn != NULL ) { -- GitLab From c4510ca6a7bca037ee36933a5b0c4355034e7728 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:23:03 +0200 Subject: [PATCH 1154/1310] [cleanup] accept NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES --- apps/decoder.c | 23 -- apps/renderer.c | 16 -- lib_com/common_api_types.h | 2 - lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal_fx.c | 4 - lib_dec/ivas_init_dec_fx.c | 18 -- lib_dec/ivas_ism_dec_fx.c | 8 - lib_dec/ivas_mct_dec_fx.c | 4 - lib_dec/ivas_stat_dec.h | 2 - lib_dec/lib_dec.h | 2 - lib_dec/lib_dec_fx.c | 2 - lib_rend/ivas_crend_fx.c | 10 - .../ivas_dirac_dec_binaural_functions_fx.c | 5 - lib_rend/ivas_hrtf_fx.c | 2 - lib_rend/ivas_objectRenderer_mix_fx.c | 32 --- lib_rend/ivas_prot_rend_fx.h | 62 ----- lib_rend/ivas_reverb_filter_design_fx.c | 257 ------------------ lib_rend/ivas_reverb_fx.c | 208 -------------- lib_rend/ivas_reverb_utils_fx.c | 214 --------------- lib_rend/ivas_stat_rend.h | 7 - lib_rend/lib_rend.h | 2 - lib_rend/lib_rend_fx.c | 97 ------- lib_util/hrtf_file_reader.c | 164 ----------- lib_util/hrtf_file_reader.h | 6 - 24 files changed, 1148 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 0108d1325..98673972e 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -166,9 +166,7 @@ int main( IVAS_RENDER_FRAMESIZE asked_frame_size; IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; IVAS_DEC_HRTF_CREND_HANDLE *hSetOfHRTF = NULL; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; -#endif #ifdef WMOPS reset_wmops(); @@ -586,16 +584,6 @@ int main( } } -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if ( ( *hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) - { - if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } - } -#endif if ( ( error = IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfCRendHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -654,7 +642,6 @@ int main( destroy_parambin_hrtf( hHrtfParambin ); } } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( ( error = IVAS_DEC_GetHrtfStatisticsHandle( hIvasDec, &hHrtfStatistics ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_GetHrtfHandle failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -672,16 +659,6 @@ int main( destroy_hrtf_statistics( hHrtfStatistics ); } } -#else - if ( ( hHrtfTD != NULL ) && ( *hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfReader ) ) != IVAS_ERR_OK ) - { - if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s \n\n", arg.hrtfFileName ); - goto cleanup; - } - } -#endif } /*------------------------------------------------------------------------------------------* diff --git a/apps/renderer.c b/apps/renderer.c index f36434778..13d68cdef 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -735,9 +735,7 @@ int main( IVAS_DEC_HRTF_FASTCONV_HANDLE *hHrtfFastConv = NULL; IVAS_DEC_HRTF_PARAMBIN_HANDLE *hHrtfParambin = NULL; IVAS_DEC_HRTF_HANDLE *hHrtfTD = NULL; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics = NULL; -#endif IsmPositionProvider *positionProvider = NULL; LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; RenderConfigReader *renderConfigReader = NULL; @@ -992,16 +990,6 @@ int main( } } -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - if ( ( hHrtfTD != NULL ) && ( error = load_reverb_binary( *hHrtfTD, hrtfFileReader ) ) != IVAS_ERR_OK ) - { - if ( error != IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA ) - { - fprintf( stderr, "\nError in loading HRTF binary file %s: %s \n\n", args.customHrtfFilePath, ivas_error_to_string( error ) ); - goto cleanup; - } - } -#endif if ( ( error = IVAS_REND_GetHrtfCRendHandle( hIvasRend, &hSetOfHRTF ) ) != IVAS_ERR_OK ) { @@ -1062,7 +1050,6 @@ int main( } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( ( error = IVAS_REND_GetHrtfStatisticsHandle( hIvasRend, &hHrtfStatistics ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_REND_GetHrtfStatisticsHandle failed\n\n" ); @@ -1080,7 +1067,6 @@ int main( destroy_hrtf_statistics( hHrtfStatistics ); } } -#endif hrtfFileReader_close( &hrtfFileReader ); } @@ -2107,9 +2093,7 @@ cleanup: { destroy_td_hrtf( hHrtfTD ); } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES destroy_hrtf_statistics( hHrtfStatistics ); -#endif IVAS_REND_Close( &hIvasRend ); IsmPositionProvider_close( positionProvider ); RenderConfigReader_close( &renderConfigReader ); diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 175b23c3b..33013360e 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -182,9 +182,7 @@ typedef struct TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_HANDLE; typedef struct ivas_hrtfs_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE; typedef struct ivas_hrtfs_fastconv_struct *IVAS_DEC_HRTF_FASTCONV_HANDLE; typedef struct ivas_hrtfs_parambin_struct *IVAS_DEC_HRTF_PARAMBIN_HANDLE; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES typedef struct ivas_hrtfs_statistics_struct *IVAS_DEC_HRTF_STATISTICS_HANDLE; -#endif typedef struct cldfb_filter_bank_struct *IVAS_CLDFB_FILTER_BANK_HANDLE; typedef struct ivas_LS_setup_custom *IVAS_LSSETUP_CUSTOM_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index 1bb60b341..fb009faea 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -109,7 +109,6 @@ #endif #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ -#define NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* Philips: Use pre-computed HRTF average L/R energies and IAC in all renderers */ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index a1b6bb5ed..6911e487f 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -1344,11 +1344,7 @@ ivas_error ivas_binRenderer_open_fx( test(); IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_binaural_reverb_init( &( hBinRenderer->hReverb ), st_ivas->hHrtfStatistics, hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv->fastconvReverberationTimes_fx, st_ivas->hHrtfFastConv->fastconvReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_binaural_reverb_open_fastconv_fx( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hIntSetup.output_config, st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) -#endif { return error; } diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 926d1f93f..ef3d8c6e9 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -1163,12 +1163,10 @@ IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin return error; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ), IVAS_ERR_OK ) ) { return error; } -#endif } /*-------------------------------------------------------------------* @@ -1353,7 +1351,6 @@ ivas_error ivas_init_decoder_fx( } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*--------------------------------------------------------------------* * Allocate and initialize HRTF Statistics handle *--------------------------------------------------------------------*/ @@ -1365,7 +1362,6 @@ ivas_error ivas_init_decoder_fx( return error; } } -#endif /*-----------------------------------------------------------------* * Initialize binuaral split rendering @@ -2276,11 +2272,7 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -2323,15 +2315,9 @@ ivas_error ivas_init_decoder_fx( } } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, - st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -2862,9 +2848,7 @@ void ivas_initialize_handles_dec( st_ivas->hSetOfHRTF = NULL; st_ivas->hHrtfFastConv = NULL; st_ivas->hHrtfParambin = NULL; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES st_ivas->hHrtfStatistics = NULL; -#endif st_ivas->hoa_dec_mtx = NULL; st_ivas->hMasaIsmData = NULL; st_ivas->hSbaIsmData = NULL; @@ -3087,10 +3071,8 @@ void ivas_destroy_dec_fx( /* Parametric binauralizer HRTF filters */ ivas_HRTF_parambin_binary_close_fx( &st_ivas->hHrtfParambin ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* HRTF statistics */ ivas_HRTF_statistics_close( &st_ivas->hHrtfStatistics ); -#endif /* Config. Renderer */ ivas_render_config_close( &( st_ivas->hRenderConfig ) ); diff --git a/lib_dec/ivas_ism_dec_fx.c b/lib_dec/ivas_ism_dec_fx.c index 727a0a651..41c1efcdc 100644 --- a/lib_dec/ivas_ism_dec_fx.c +++ b/lib_dec/ivas_ism_dec_fx.c @@ -212,11 +212,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( } IF( EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hHrtfStatistics, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_reverb_open_fx( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -239,11 +235,7 @@ static ivas_error ivas_ism_bitrate_switching_dec_fx( ivas_dirac_dec_close_binaural_data( st_ivas->hDiracDecBin ); /* Open Crend Binaural renderer */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; move32(); diff --git a/lib_dec/ivas_mct_dec_fx.c b/lib_dec/ivas_mct_dec_fx.c index ed43b9991..97b794b44 100644 --- a/lib_dec/ivas_mct_dec_fx.c +++ b/lib_dec/ivas_mct_dec_fx.c @@ -1546,11 +1546,7 @@ static ivas_error ivas_mc_dec_reconfig_fx( } ELSE IF( st_ivas->hCrendWrapper == NULL && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_MIXER_CONV_ROOM ) ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hHrtfStatistics, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) -#else - IF( ( error = ivas_rend_openCrend( &( st_ivas->hCrendWrapper ), st_ivas->intern_config, st_ivas->hDecoderConfig->output_config, st_ivas->hRenderConfig, st_ivas->hSetOfHRTF, st_ivas->hDecoderConfig->output_Fs, ( st_ivas->hSplitBinRend == NULL ) ? 1 : st_ivas->hSplitBinRend->splitrend.multiBinPoseData.num_poses ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index db23485b8..274aa1910 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1121,9 +1121,7 @@ typedef struct Decoder_Struct HRTFS_CREND_HANDLE hSetOfHRTF; /* Set of HRTFs handle (CRend) */ HRTFS_FASTCONV_HANDLE hHrtfFastConv; /* FASTCONV HRTF tables for binaural rendering */ HRTFS_PARAMBIN_HANDLE hHrtfParambin; /* HRTF tables for parametric binauralizer */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES HRTFS_STATISTICS_HANDLE hHrtfStatistics; /* HRTF statistics handle */ -#endif LSSETUP_CUSTOM_HANDLE hLsSetupCustom; /* Custom LS configuration handle */ Word32 *hoa_dec_mtx; /* Pointer to decoder matrix for SBA */ HEAD_TRACK_DATA_HANDLE hHeadTrackData; /* Head tracking data structure */ diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 28b8594fe..3a6ea5b45 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -367,12 +367,10 @@ ivas_error IVAS_DEC_GetHrtfParamBinHandle( IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error IVAS_DEC_GetHrtfStatisticsHandle( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ ); -#endif /*! r: error code*/ ivas_error IVAS_DEC_GetRenderConfig( diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 551a20c0f..4c448efc7 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -2564,7 +2564,6 @@ ivas_error IVAS_DEC_GetHrtfParamBinHandle( return IVAS_ERR_OK; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*---------------------------------------------------------------------* * IVAS_DEC_GetHrtfStatisticsHandle( ) * @@ -2585,7 +2584,6 @@ ivas_error IVAS_DEC_GetHrtfStatisticsHandle( return IVAS_ERR_OK; } -#endif /*---------------------------------------------------------------------* * copyRendererConfigStruct( ) diff --git a/lib_rend/ivas_crend_fx.c b/lib_rend/ivas_crend_fx.c index 825ff582e..a8195dae3 100644 --- a/lib_rend/ivas_crend_fx.c +++ b/lib_rend/ivas_crend_fx.c @@ -1500,11 +1500,7 @@ ivas_error ivas_rend_openMultiBinCrend( { ivas_error error; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, NULL /* hHrtfStatistics */, output_Fs, pMultiBinPoseData->num_poses ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_openCrend( pCrend, inConfig, outConfig, NULL /*hRendCfg*/, NULL, output_Fs, pMultiBinPoseData->num_poses ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1524,9 +1520,7 @@ ivas_error ivas_rend_openCrend( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, HRTFS_CREND_HANDLE hSetOfHRTF, -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES HRTFS_STATISTICS_HANDLE hHrtfStatistics, -#endif const Word32 output_Fs, const Word16 num_poses ) { @@ -1657,11 +1651,7 @@ ivas_error ivas_rend_openCrend( IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), hHrtfStatistics, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_reverb_open_fx( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, NULL, hRendCfg, output_Fs ) ), IVAS_ERR_OK ) ) -#endif { return error; } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 75a8d4b23..959c8165c 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -315,15 +315,10 @@ ivas_error ivas_dirac_dec_init_binaural_data_fx( IF( hDiracDecBin->hReverb == NULL && EQ_16( pos_idx, 0 ) ) /* open reverb only for the main direction */ { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes_fx, ( *phHrtfParambin )->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #else if ( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, st_ivas->hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( st_ivas->hRenderConfig->roomAcoustics ), output_Fs, st_ivas->hHrtfParambin->parametricReverberationTimes_fx, st_ivas->hHrtfParambin->parametricReverberationEneCorrections_fx ) ) != IVAS_ERR_OK ) -#endif -#else - /* Todo Philips: Room acoustics should be passed here once the underlying part works. Probably enough to pick it from st_ivas but you know best. */ - if ( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) #endif { return error; diff --git a/lib_rend/ivas_hrtf_fx.c b/lib_rend/ivas_hrtf_fx.c index da862b51b..2a75dee81 100644 --- a/lib_rend/ivas_hrtf_fx.c +++ b/lib_rend/ivas_hrtf_fx.c @@ -214,7 +214,6 @@ void ivas_HRTF_parambin_binary_close_fx( return; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-----------------------------------------------------------------------* * ivas_HRTF_statistics_binary_open() * @@ -361,4 +360,3 @@ ivas_error ivas_HRTF_statistics_init( return IVAS_ERR_OK; } -#endif diff --git a/lib_rend/ivas_objectRenderer_mix_fx.c b/lib_rend/ivas_objectRenderer_mix_fx.c index cb6e3a3fe..1fc754dff 100644 --- a/lib_rend/ivas_objectRenderer_mix_fx.c +++ b/lib_rend/ivas_objectRenderer_mix_fx.c @@ -407,38 +407,6 @@ static ivas_error DefaultBSplineModel_fx( model = &( HrFiltSet_p->ModelParams ); modelITD = &( HrFiltSet_p->ModelParamsITD ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#else - SWITCH( output_Fs ) - { - case 48000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx; // Q23 - BREAK; - case 32000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; // Q23 - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; // Q23 - BREAK; - case 16000: - for ( i = 0; i < 3; i++ ) - { - HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( LR_IAC_LENGTH_NR_FC_16KHZ * sizeof( float ) ); - if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - } - floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], Q27, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], Q23, LR_IAC_LENGTH_NR_FC_16KHZ ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - HrFiltSet_p->lr_energy_and_iac_fx[0] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[0]; - HrFiltSet_p->lr_energy_and_iac_fx[1] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[1]; - HrFiltSet_p->lr_energy_and_iac_fx[2] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[2]; - BREAK; - } -#endif /* Set ROM flag for correct deallocation */ model->modelROM = TRUE; diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 3fc299761..0e2033fd4 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -616,7 +616,6 @@ void ivas_HRTF_CRend_binary_close_fx( HRTFS_CREND **hSetOfHRTF /* i/o: Set of HRTF handle */ ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error ivas_HRTF_statistics_init( HRTFS_STATISTICS_HANDLE *hHrtfStatistics, /* i/o: HRTF statistics structure */ int32_t sampleRate /* i : Sample rate */ @@ -630,7 +629,6 @@ ivas_error ivas_HRTF_statistics_binary_open( HRTFS_STATISTICS **hHrtfStatistics /* i/o: HRTF statistics structure */ ); -#endif /*----------------------------------------------------------------------------------* * TD object renderer @@ -876,9 +874,7 @@ ivas_error ivas_rend_openCrend( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, HRTFS_CREND_HANDLE hSetOfHRTF, -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES HRTFS_STATISTICS_HANDLE hHrtfStatistics, -#endif const Word32 output_Fs, const Word16 num_poses ); @@ -919,44 +915,18 @@ ivas_error ivas_rend_crendProcessSubframe( * Reverberator *----------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error ivas_binaural_reverb_init( -#else -ivas_error ivas_binaural_reverb_open_fastconv_fx( -#endif REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ -#else -#endif const Word16 numBins, /* i : number of CLDFB bins */ const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ -#else - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const AUDIO_CONFIG internal_config, /* i : internal audio config for FastConv */ -#endif const Word32 sampling_rate, /* i : sampling rate */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const Word32 *defaultTimes, /* i : default reverberation times */ const Word32 *defaultEne /* i : default reverberation energies */ -#else - const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ -#endif ); -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -ivas_error ivas_binaural_reverb_open_parambin( - REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins Q0 */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame Q0 */ - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const Word32 sampling_rate, /* i : sampling rate Q0 */ - const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ -); -#endif void ivas_binaural_reverb_close_fx( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ @@ -977,13 +947,7 @@ void ivas_binaural_reverb_processSubframe_fx( ivas_error ivas_reverb_open_fx( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ -#else - const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ - const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ - const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ -#endif RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ const Word32 output_Fs /* i : output sampling rate */ ); @@ -1129,23 +1093,12 @@ void ivas_reverb_calc_color_levels_fx( const Word32 *pT60_filter_coeff, //input in Q31 Word32 *pTarget_color_L, //output in Q30 Word32 *pTarget_color_R); //output in Q30 -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error ivas_reverb_prepare_cldfb_params( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_STATISTICS_HANDLE hHrtfStatistics, const int32_t output_Fs, float *pOutput_t60, float *pOutput_ene ); -#else -ivas_error ivas_reverb_prepare_cldfb_params( - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const AUDIO_CONFIG input_audio_config, - const int16_t use_brir, - const int32_t output_Fs, - float *pOutput_t60, - float *pOutput_ene ); -#endif void ivas_reverb_interpolate_acoustic_data_fx( const Word16 input_table_size, const Word32 *pInput_fc, //input in Q16 @@ -1172,21 +1125,6 @@ void ivas_reverb_interpolate_energies_fx( Word16 *pOutput_ene_r_e //output e ); #endif -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -void ivas_reverb_get_hrtf_set_properties_fx( - Word32 **ppHrtf_set_L_re, - Word32 **ppHrtf_set_L_im, - Word32 **ppHrtf_set_R_re, - Word32 **ppHrtf_set_R_im, - const AUDIO_CONFIG input_audio_config, - const Word16 hrtf_count, - const Word16 in_freq_count, - const Word16 out_freq_count, - Word32 *pOut_avg_pwr_L, //output in Q23 - Word32 *pOut_avg_pwr_R, //output in Q23 - Word32 *out_i_a_coherence //output in Q27 -); -#endif /*---------------------------------------------------------------------------------* * Shoebox Prototypes *-----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index aacfb2009..0b8642120 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -1003,260 +1003,3 @@ void ivas_reverb_interpolate_energies_fx( } #endif -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -/*-------------------------------------------------------------------* - * ivas_reverb_get_hrtf_set_properties() - * - * Function analyses the HRTF set and computes avarage left/right power spectrum - * and frequency-dependent IA coherence. Expects frequency-domain HRTF input - *-------------------------------------------------------------------*/ - - -void ivas_reverb_get_hrtf_set_properties_fx( - Word32 **ppHrtf_set_L_re, // Q29 - Word32 **ppHrtf_set_L_im, // Q29 - Word32 **ppHrtf_set_R_re, // Q29 - Word32 **ppHrtf_set_R_im, // Q29 - const AUDIO_CONFIG input_audio_config, - const Word16 hrtf_count, - const Word16 in_freq_count, - const Word16 out_freq_count, - Word32 *pOut_avg_pwr_L, // output in Q23 - Word32 *pOut_avg_pwr_R, // output in Q23 - Word32 *out_i_a_coherence ) // output in Q27 -{ - const Word16 foa_sum_coeffs[4][3] = { - { MAX_WORD16, MAX_WORD16, 0 }, - { MAX_WORD16, -MAX_WORD16, 0 }, - { MAX_WORD16, 0, MAX_WORD16 }, - { MAX_WORD16, 0, -MAX_WORD16 } - }; - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - move16(); - const Word32 inp_freq_step = divide3232( ONE_IN_Q22, L_shl( in_freq_count, 23 ) ); // q= 15 - const Word32 inp_freq_offset = L_shr( inp_freq_step, 1 ); // q= 15 - const Word16 out_freq_step = divide3232( ONE_IN_Q21, L_shl( L_sub( out_freq_count, 1 ), 22 ) ); // q = 15 - - Word16 hrtf_count_inverted, used_hrtf_count, freq_idx, hrtf_idx, out_bin_idx, ch_index, is_ambisonics; - Word32 relative_pos, weight_1st, base_idx; - Word32 avg_pwr_left[2]; - Word32 avg_pwr_right[2]; - Word32 IA_coherence[2]; - - test(); - test(); - IF( EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA3 ) ) - { - is_ambisonics = 1; - move16(); - used_hrtf_count = 4; /* Using only 1st order HRTFs */ - move16(); - } - ELSE - { - is_ambisonics = 0; - move16(); - used_hrtf_count = hrtf_count; - move16(); - } - - /* Interpolation (linear to a new grid) */ - base_idx = 0; - move32(); - relative_pos = 0; - move32(); - hrtf_count_inverted = divide1616( ONE_IN_Q11, shl( used_hrtf_count, 11 ) ); // q = 15 - - /* Loop over output frequency bins */ - FOR( out_bin_idx = 0; out_bin_idx < out_freq_count; out_bin_idx++ ) - { - /* Computing normalized frequency for the current bin (1.0 corresponds to sampling rate) */ - - const Word32 norm_freq = L_mult( out_freq_step, shl( out_bin_idx, 5 ) ); // q = 21 - - /* Computing the bin index in the source data */ - Word16 div_q = 0; - move16(); - // Word32 tbl_index = BASOP_Util_Divide3232_Scale(L_sub(norm_freq , L_shl(inp_freq_offset, 6)), L_shl(inp_freq_step, 6), &div_q);//q =15 - div_q - Word32 tbl_index = Mpy_32_32( L_sub( norm_freq, L_shl( inp_freq_offset, 6 ) ), L_shl( in_freq_count, 22 ) ); // q = 11 - IF( div_q < 0 ) - { - tbl_index = L_shl( tbl_index, div_q ); - div_q = 0; - move16(); - } - IF( tbl_index <= 0 ) /* In case of extrapolation (below 1st bin), choose nearest */ - { - base_idx = 0; - move32(); - relative_pos = 0; - move32(); - } - ELSE - { - base_idx = ( tbl_index ); // q = 21 - move32(); - relative_pos = L_shl( L_sub( tbl_index, L_shl( L_shr( base_idx, 11 ), 11 ) ), 20 ); // q = 31 - base_idx = L_shr( base_idx, 11 ); - IF( GT_32( base_idx, L_sub( in_freq_count, 2 ) ) ) /* In case of extrapolation (above last bin), choose nearest */ - { - base_idx = L_sub( in_freq_count, 2 ); - relative_pos = ONE_IN_Q31; // Q31 - move32(); - } - } - - /* Computing 2 bins data for later interpolation */ - - /* Zeroing before accumalation for average value computing */ - avg_pwr_left[0] = 0; - move32(); - avg_pwr_left[1] = 0; - move32(); - avg_pwr_right[0] = 0; - move32(); - avg_pwr_right[1] = 0; - move32(); - IA_coherence[0] = 0; - move32(); - IA_coherence[1] = 0; - move32(); - - /* Get power spectra and cross - correlation between left and right hrtfs */ - /* Loop over all the HRTFs available */ - FOR( hrtf_idx = 0; hrtf_idx < used_hrtf_count; hrtf_idx++ ) - { - /* Pointers to current HRTF data */ - Word32 *current_base_L_ptr_re, *current_base_L_ptr_im, *current_base_R_ptr_re, *current_base_R_ptr_im; - - /* combined HRTF data used for FOA */ - Word32 combined_channels_L_re[2]; - Word32 combined_channels_L_im[2]; - Word32 combined_channels_R_re[2]; - Word32 combined_channels_R_im[2]; - - /* Process the frequency bins containing both real and img parts */ - /* In case of 5.1 or 7.1 formats, use the available HRTF paires directly*/ - IF( !is_ambisonics ) - { - current_base_L_ptr_re = ( ppHrtf_set_L_re[hrtf_idx] + base_idx ); // Q29 - current_base_R_ptr_re = ( ppHrtf_set_R_re[hrtf_idx] + base_idx ); // Q29 - current_base_L_ptr_im = ( ppHrtf_set_L_im[hrtf_idx] + base_idx ); // Q29 - current_base_R_ptr_im = ( ppHrtf_set_R_im[hrtf_idx] + base_idx ); // Q29 - } - - /* In case of FOA format, combine the W channel with the X/Y channels */ - ELSE - { - FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) - { - combined_channels_L_re[freq_idx] = 0; - move32(); - combined_channels_R_re[freq_idx] = 0; - move32(); - combined_channels_L_im[freq_idx] = 0; - move32(); - combined_channels_R_im[freq_idx] = 0; - move32(); - - FOR( ch_index = 0; ch_index < 3; ch_index++ ) - { - combined_channels_L_re[freq_idx] = L_add( combined_channels_L_re[freq_idx], Mpy_32_16_1( ppHrtf_set_L_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - combined_channels_R_re[freq_idx] = L_add( combined_channels_R_re[freq_idx], Mpy_32_16_1( ppHrtf_set_R_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - combined_channels_L_im[freq_idx] = L_add( combined_channels_L_im[freq_idx], Mpy_32_16_1( ppHrtf_set_L_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - combined_channels_R_im[freq_idx] = L_add( combined_channels_R_im[freq_idx], Mpy_32_16_1( ppHrtf_set_R_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 - move32(); - } - } - - current_base_L_ptr_re = &combined_channels_L_re[0]; // Q29 - current_base_R_ptr_re = &combined_channels_R_re[0]; // Q29 - current_base_L_ptr_im = &combined_channels_L_im[0]; // Q29 - current_base_R_ptr_im = &combined_channels_R_im[0]; // Q29 - } - - FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) - { - Word32 L_re, L_im, R_re, R_im, C_re; - - L_re = current_base_L_ptr_re[freq_idx]; // Q29 - R_re = current_base_R_ptr_re[freq_idx]; // Q29 - L_im = current_base_L_ptr_im[freq_idx]; // Q29 - R_im = current_base_R_ptr_im[freq_idx]; // Q29 - move32(); - move32(); - move32(); - move32(); - avg_pwr_left[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( L_re, L_re ), Mpy_32_32( L_im, L_im ) ), 4 ), avg_pwr_left[freq_idx] ); // q = 23 - move32(); - avg_pwr_right[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( R_re, R_re ), Mpy_32_32( R_im, R_im ) ), 4 ), avg_pwr_right[freq_idx] ); // q = 23 - move32(); - /* Cross product (Re part) */ - C_re = L_add( Mpy_32_32( L_re, R_re ), Mpy_32_32( L_im, R_im ) ); // q = 27 - - IA_coherence[freq_idx] = L_add( C_re, IA_coherence[freq_idx] ); // q = 27 - move32(); - } - } - - /* Compute the averages and the IA coherence */ - FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) - { - Word16 sqrt_exp = 0; - move16(); - Word32 var1; - avg_pwr_left[freq_idx] = Mpy_32_16_1( avg_pwr_left[freq_idx], hrtf_count_inverted ); // q = 23 - move32(); - avg_pwr_right[freq_idx] = Mpy_32_16_1( avg_pwr_right[freq_idx], hrtf_count_inverted ); // q = 23 - move32(); - IF( EQ_32( avg_pwr_left[freq_idx], avg_pwr_right[freq_idx] ) ) - { - var1 = avg_pwr_left[freq_idx]; - move32(); - sqrt_exp = 4; - move16(); - } - ELSE - { - var1 = Sqrt32( Mpy_32_32( avg_pwr_left[freq_idx], avg_pwr_right[freq_idx] ), &sqrt_exp ); - move32(); - } - Word16 temp; - IA_coherence[freq_idx] = BASOP_Util_Divide3232_Scale( Mpy_32_16_1( IA_coherence[freq_idx], hrtf_count_inverted ), L_shl( var1, sqrt_exp ), &temp ); // q =15 - move32(); - IA_coherence[freq_idx] = L_shl( IA_coherence[freq_idx], sub( 27, sub( 15, temp ) ) ); // q = 27 - move32(); - /* Limiting to (0...1) range in case of small numerical errors or negative values */ - IA_coherence[freq_idx] = L_min( IA_coherence[freq_idx], ONE_IN_Q27 ); // Q27 - move32(); - IA_coherence[freq_idx] = L_max( IA_coherence[freq_idx], 0 ); // Q27 - move32(); - } - - /* Computing weighted average of 2 nearest values (1 below + 1 above) for linear interpolation */ - weight_1st = L_sub( ONE_IN_Q31, relative_pos ); // q = 31 - - pOut_avg_pwr_L[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_left[0] ), Mpy_32_32( relative_pos, avg_pwr_left[1] ) ); // q = 23 - move32(); - pOut_avg_pwr_R[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_right[0] ), Mpy_32_32( relative_pos, avg_pwr_right[1] ) ); // q = 23 - move32(); - out_i_a_coherence[out_bin_idx] = L_add( Mpy_32_32( weight_1st, IA_coherence[0] ), Mpy_32_32( relative_pos, IA_coherence[1] ) ); // q = 27 - move32(); - } - - return; -} -#endif diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index e886bfeab..b6a634bb7 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1272,32 +1272,14 @@ static void set_fft_and_datablock_sizes_fx( static void set_reverb_acoustic_data_fx( ivas_reverb_params_t *pParams, -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#else - const AUDIO_CONFIG input_audio_config, - const HRTFS_HANDLE hHrtf, -#endif IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics, -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - const Word16 subframe_len, -#endif const Word16 nr_fc_input, const Word16 nr_fc_fft_filter ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES int16_t bin_idx; -#else - Word16 nr_out_ch, hrtf_idx, offset, iter_idx, bin_idx; -#endif Word32 ln_1e6_inverted_fx, delay_diff_fx, L_tmp; Word16 exp_argument_fx, tmp, tmp_flag, exp_argument_e; Word16 pow_exp; -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - Word32 *pHrtf_set_l_re_fx[MAX_INTERN_CHANNELS]; - Word32 *pHrtf_set_l_im_fx[MAX_INTERN_CHANNELS]; - Word32 *pHrtf_set_r_re_fx[MAX_INTERN_CHANNELS]; - Word32 *pHrtf_set_r_im_fx[MAX_INTERN_CHANNELS]; -#endif Word32 *pFc_input_fx = pRoomAcoustics->pFc_input_fx; Word32 *pAcoustic_rt60_fx = pRoomAcoustics->pAcoustic_rt60_fx; @@ -1309,48 +1291,6 @@ static void set_reverb_acoustic_data_fx( Word32 *pDsr_fx = pParams->pDsr_fx; Word16 *pDsr_e = pParams->pDsr_e; -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - /* use crend hrtf filters */ - IF( hHrtf != NULL ) - { - /* Compute HRTF set properties: average left/right energies, IA coherence */ - /* First, find the offset of the frequency-domain data for the 1st frame and assign HRTF pointers */ - FOR( nr_out_ch = 0; nr_out_ch < BINAURAL_CHANNELS; nr_out_ch++ ) - { - FOR( hrtf_idx = 0; hrtf_idx < hHrtf->max_num_ir; hrtf_idx++ ) - { - offset = 0; - move16(); - FOR( iter_idx = 0; iter_idx < hHrtf->num_iterations[hrtf_idx][nr_out_ch] - 1; iter_idx++ ) - { - offset = add( offset, hHrtf->pIndex_frequency_max[hrtf_idx][nr_out_ch][iter_idx] ); - } - - IF( EQ_16( nr_out_ch, 0 ) ) - { - pHrtf_set_l_re_fx[hrtf_idx] = &hHrtf->pOut_to_bin_re_fx[hrtf_idx][0][offset]; - pHrtf_set_l_im_fx[hrtf_idx] = &hHrtf->pOut_to_bin_im_fx[hrtf_idx][0][offset]; - } - ELSE - { - pHrtf_set_r_re_fx[hrtf_idx] = &hHrtf->pOut_to_bin_re_fx[hrtf_idx][1][offset]; - pHrtf_set_r_im_fx[hrtf_idx] = &hHrtf->pOut_to_bin_im_fx[hrtf_idx][1][offset]; - } - } - } - - /* Compute HRTF set properties using frequency-domain HRTF data */ - Word32 *pHrtf_avg_pwr_response_l_fx = pParams->pHrtf_avg_pwr_response_l_fx; - Word32 *pHrtf_avg_pwr_response_r_fx = pParams->pHrtf_avg_pwr_response_r_fx; - Word32 *pHrtf_inter_aural_coherence_fx = pParams->pHrtf_inter_aural_coherence_fx; - ivas_reverb_get_hrtf_set_properties_fx( pHrtf_set_l_re_fx, pHrtf_set_l_im_fx, pHrtf_set_r_re_fx, pHrtf_set_r_im_fx, input_audio_config, hHrtf->max_num_ir, subframe_len, - nr_fc_fft_filter, pHrtf_avg_pwr_response_l_fx, pHrtf_avg_pwr_response_r_fx, pHrtf_inter_aural_coherence_fx ); - - pParams->pHrtf_avg_pwr_response_l_const_fx = (const Word32 *) pParams->pHrtf_avg_pwr_response_l_fx; - pParams->pHrtf_avg_pwr_response_r_const_fx = (const Word32 *) pParams->pHrtf_avg_pwr_response_r_fx; - pParams->pHrtf_inter_aural_coherence_const_fx = (const Word32 *) pParams->pHrtf_inter_aural_coherence_fx; - } -#endif /* interpolate input table data for T60 and DSR to the FFT filter grid */ ivas_reverb_interpolate_acoustic_data_fx( nr_fc_input, pFc_input_fx, pAcoustic_rt60_fx, pAcoustic_dsr_fx, nr_fc_fft_filter, pFc_fx, pRt60_fx, pDsr_fx, pRt60_e, pDsr_e ); @@ -1482,13 +1422,7 @@ static ivas_error setup_FDN_branches_fx( ivas_error ivas_reverb_open_fx( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ -#else - const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ - const HRTFS_HANDLE hHrtf, /* i : HRTF handle */ - const Word32 *lr_energy_and_iac_fx[], /* i : precomuputed lr energies and iac */ -#endif RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ const int32_t output_Fs ) { @@ -1565,7 +1499,6 @@ ivas_error ivas_reverb_open_fx( test(); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /* set up reverb acoustic data on the basis of HRTF data and renderer config */ Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 2 ); Word16 *pRt60_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter ); @@ -1588,31 +1521,6 @@ ivas_error ivas_reverb_open_fx( params.pHrtf_avg_pwr_response_r_const_fx = hHrtfStatistics->average_energy_r; params.pHrtf_inter_aural_coherence_const_fx = hHrtfStatistics->inter_aural_coherence; -#else - IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) - { - params.pHrtf_avg_pwr_response_l_const_fx = lr_energy_and_iac_fx[0]; - params.pHrtf_avg_pwr_response_r_const_fx = lr_energy_and_iac_fx[1]; - params.pHrtf_inter_aural_coherence_const_fx = lr_energy_and_iac_fx[2]; - } - /* set up reverb acoustic data on the basis of HRTF data and renderer config */ - Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 2 ); - Word16 *pRt60_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter ); - Word16 *pDsr_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter ); - - params.pRt60_e = pRt60_e; - params.pDsr_e = pDsr_e; - - set_reverb_acoustic_data_fx( ¶ms, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter ); - Scale_sig32( params.pFc_fx, nr_fc_fft_filter, -2 ); - FOR( i = 0; i < nr_fc_fft_filter; i++ ) - { - params.pRt60_fx[i] = L_abs( params.pRt60_fx[i] ); - move32(); - params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] ); - move32(); - } -#endif /* set reverb acoustic configuration based on renderer config */ pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; @@ -1776,10 +1684,6 @@ ivas_error ivas_reverb_open_fx( { return error; } -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - free( pDsr_e ); - free( pRt60_e ); -#endif *hReverb = pState; return error; @@ -2507,7 +2411,6 @@ static ivas_error ivas_binaural_reverb_open_fx( return IVAS_ERR_OK; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*------------------------------------------------------------------------- * ivas_binaural_reverb_init() * @@ -2566,117 +2469,6 @@ ivas_error ivas_binaural_reverb_init( return error; } -#else - -/*------------------------------------------------------------------------- - * ivas_binaural_reverb_open_fastconv() - * - * Allocate and initialize binaural room reverberator handle for FastConv - *------------------------------------------------------------------------*/ -ivas_error ivas_binaural_reverb_open_fastconv_fx( - REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame */ - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const AUDIO_CONFIG internal_config, /* i : internal audio config for FastConv */ - const Word32 sampling_rate, /* i : sampling rate */ - const HRTFS_FASTCONV_HANDLE hHrtfFastConv /* i : FastConv HRTF handle */ -) -{ - ivas_error error; - const Word32 *revTimes; - const Word32 *revEne; - Word32 t60[CLDFB_NO_CHANNELS_MAX]; - Word32 ene[CLDFB_NO_CHANNELS_MAX]; - Word16 preDelay; - - error = IVAS_ERR_OK; - - IF( ( roomAcoustics != NULL ) && roomAcoustics->override ) - { - /* THIS PART IS YET TO BE CONVERTED AS REVERB_UTILS.C IS NOT INVOKED IN GPROF */ - float t60_flt[CLDFB_NO_CHANNELS_MAX]; - float ene_flt[CLDFB_NO_CHANNELS_MAX]; - - revTimes = t60; - revEne = ene; - - IF( NE_32( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60_flt, ene_flt ) ), IVAS_ERR_OK ) ) - { - return error; - } - - preDelay = (Word16) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); - floatToFixed_arrL( t60_flt, t60, Q31, CLDFB_NO_CHANNELS_MAX ); - floatToFixed_arrL( ene_flt, ene, Q31, CLDFB_NO_CHANNELS_MAX ); - } - ELSE - { -#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q26*/ -#else - revTimes = hHrtfFastConv->fastconvReverberationTimes_fx; /*Q31*/ -#endif - revEne = hHrtfFastConv->fastconvReverberationEneCorrections_fx; /*Q31*/ - preDelay = 10; - move16(); - } - - error = ivas_binaural_reverb_open_fx( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); - - return error; -} - - -/*------------------------------------------------------------------------- - * ivas_binaural_reverb_open_parambin() - * - * Allocate and initialize binaural room reverberator handle for ParamBin - *------------------------------------------------------------------------*/ - -ivas_error ivas_binaural_reverb_open_parambin( - REVERB_STRUCT_HANDLE *hReverbPr, /* i/o: binaural reverb handle */ - const Word16 numBins, /* i : number of CLDFB bins Q0 */ - const Word16 numCldfbSlotsPerFrame, /* i : number of CLDFB slots per frame Q0 */ - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *roomAcoustics, /* i/o: room acoustics parameters */ - const Word32 sampling_rate, /* i : sampling rate Q0 */ - const HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : Parametric binauralizer HRTF handle */ -) -{ - ivas_error error; - const Word32 *revTimes; - const Word32 *revEne; - Word32 t60[CLDFB_NO_CHANNELS_MAX]; - Word32 ene[CLDFB_NO_CHANNELS_MAX]; - Word16 preDelay; - - error = IVAS_ERR_OK; - - IF( ( roomAcoustics != NULL ) && roomAcoustics->override ) - { - revTimes = t60; - revEne = ene; - preDelay = (Word16) L_shr_r( Mpy_32_32( 1677721600 /*800 in Q21*/, roomAcoustics->acousticPreDelay_fx /*Q27*/ ), Q17 ); /*Q0*/ - move16(); - } - ELSE - { -#ifdef FIX_1741_REVERB_TIMES_Q_FORMAT - revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q26*/ -#else - revTimes = hHrtfParambin->parametricReverberationTimes_fx; /*Q31*/ -#endif - revEne = hHrtfParambin->parametricReverberationEneCorrections_fx; /*Q31*/ - preDelay = 10; - move16(); - } - - error = ivas_binaural_reverb_open_fx( hReverbPr, numBins, numCldfbSlotsPerFrame, sampling_rate, revTimes, revEne, preDelay ); - - return error; -} - -#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_close() * diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index e63e6017a..84fa82bce 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -64,11 +64,7 @@ typedef struct cldfb_convolver_state float filter_states_im[BINAURAL_CONVBANDS][CLDFB_CONVOLVER_NTAPS_MAX]; } cldfb_convolver_state; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, const int32_t sampling_rate, float *avg_pwr_l_out, float *avg_pwr_r_out ); -#else -static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ); -#endif /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_prepare_cldfb_params() @@ -77,23 +73,12 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCO *-----------------------------------------------------------------------------------------*/ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error ivas_reverb_prepare_cldfb_params( const IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, const HRTFS_STATISTICS_HANDLE hHrtfStatistics, const int32_t output_Fs, float *pOutput_t60, float *pOutput_ene ) -#else -ivas_error ivas_reverb_prepare_cldfb_params( - IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params, - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const AUDIO_CONFIG input_audio_config, - const int16_t use_brir, - const int32_t output_Fs, - float *pOutput_t60, - float *pOutput_ene ) -#endif { int16_t idx; float avg_pwr_left[CLDFB_NO_CHANNELS_MAX]; @@ -101,9 +86,6 @@ ivas_error ivas_reverb_prepare_cldfb_params( float delay_diff, ln_1e6_inverted, exp_argument; const float dist = DEFAULT_SRC_DIST; const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f; -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - ivas_error error; -#endif Word32 output_fc_fx[CLDFB_NO_CHANNELS_MAX]; Word32 output_t60_fx[CLDFB_NO_CHANNELS_MAX]; Word16 output_t60_e[CLDFB_NO_CHANNELS_MAX]; @@ -138,14 +120,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( exp_argument = max( exp_argument, -23.0f ); pOutput_ene[idx] *= expf( exp_argument ); } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right ); -#else - if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { @@ -155,122 +130,7 @@ ivas_error ivas_reverb_prepare_cldfb_params( return IVAS_ERR_OK; } -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -/*-----------------------------------------------------------------------------------------* - * Function ivas_cldfb_convolver() - * - * Function for convolving CLDFB-domain data with filter taps - *-----------------------------------------------------------------------------------------*/ - - -/*-----------------------------------------------------------------------------------------* - * Function get_IR_from_filter_taps() - * - * Function converts CLDFB filter taps into time-domain data - *-----------------------------------------------------------------------------------------*/ - -/*-----------------------------------------------------------------------------------------* - * Function ivas_reverb_get_cldfb_hrtf_set_properties() - * - * Function analyses the HRTF set and computes avarage left/right power spectrum - * and frequency-dependent IA coherence. - * Uses fastconv renderer filter taps to compute energies - *-----------------------------------------------------------------------------------------*/ - -static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( - AUDIO_CONFIG input_audio_config, - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const int16_t use_brir, - const int32_t sampling_rate, - float *avg_pwr_left, - float *avg_pwr_right ) -{ - float current_HRTF_data_L[L_FRAME48k]; - float current_HRTF_data_R[L_FRAME48k]; - int16_t freq_idx, hrtf_idx, hrtf_count; - float hrtf_count_inverted; - int16_t fft_size, log2_fft_size, half_fft_size, freq_count; - ivas_error error; - UNUSED_PARAM( error ); - fft_size = RV_FILTER_MAX_FFT_SIZE; - Word16 IR_length; - IR_length = CLDFB_NO_CHANNELS_MAX * ( ( fft_size + CLDFB_NO_CHANNELS_MAX - 1 ) / CLDFB_NO_CHANNELS_MAX ); - log2_fft_size = int_log2( fft_size ); - half_fft_size = fft_size >> 1; - freq_count = 1 + half_fft_size; - - /* chosing between ambisonics, 5.1 and 7.1 MC audio */ - if ( ( input_audio_config == IVAS_AUDIO_CONFIG_FOA ) || ( input_audio_config == IVAS_AUDIO_CONFIG_HOA2 ) || ( input_audio_config == IVAS_AUDIO_CONFIG_HOA3 ) ) - { - hrtf_count = 1; - } - else if ( input_audio_config == IVAS_AUDIO_CONFIG_7_1 ) - { - hrtf_count = 7; - } - else - { - hrtf_count = 5; - input_audio_config = IVAS_AUDIO_CONFIG_5_1; - } - - /* Zeroing before accumalation for average value computing */ - for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) - { - avg_pwr_left[freq_idx] = 0.0f; - avg_pwr_right[freq_idx] = 0.0f; - } - - /* Get power spectra and cross - correlation between left and right hrtfs - Loop over all the HRTFs available */ - for ( hrtf_idx = 0; hrtf_idx < hrtf_count; hrtf_idx++ ) - { - UNUSED_PARAM( hHrtfFastConv ); - UNUSED_PARAM( use_brir ); - UNUSED_PARAM( sampling_rate ); - UNUSED_PARAM( IR_length ); - - /* Perform forward FFT on both L/R channels */ - fft_rel( current_HRTF_data_L, (int16_t) fft_size, (int16_t) log2_fft_size ); - fft_rel( current_HRTF_data_R, (int16_t) fft_size, (int16_t) log2_fft_size ); - - /* Process the DC bin (without img part) */ - avg_pwr_left[0] += current_HRTF_data_L[0] * current_HRTF_data_L[0]; - avg_pwr_right[0] += current_HRTF_data_R[0] * current_HRTF_data_R[0]; - - /* Process the Nyquist frequency bin (without img part) */ - avg_pwr_left[half_fft_size] += current_HRTF_data_L[half_fft_size] * current_HRTF_data_L[half_fft_size]; - avg_pwr_right[half_fft_size] += current_HRTF_data_R[half_fft_size] * current_HRTF_data_R[half_fft_size]; - - /* Process the other frequency bins containing both real and img parts */ - for ( freq_idx = 1; freq_idx < half_fft_size; freq_idx++ ) - { - float L_re, L_im, R_re, R_im; - L_re = current_HRTF_data_L[freq_idx]; - R_re = current_HRTF_data_R[freq_idx]; - L_im = current_HRTF_data_L[fft_size - freq_idx]; - R_im = current_HRTF_data_R[fft_size - freq_idx]; - - avg_pwr_left[freq_idx] += L_re * L_re + L_im * L_im; - avg_pwr_right[freq_idx] += R_re * R_re + R_im * R_im; - } - } - - /* Compute the averages and the IA coherence */ - hrtf_count_inverted = 1.0f / (float) hrtf_count; - for ( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) - { - avg_pwr_left[freq_idx] *= hrtf_count_inverted; - avg_pwr_right[freq_idx] *= hrtf_count_inverted; - } - - return IVAS_ERR_OK; -} - -#endif - -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*-----------------------------------------------------------------------------------------* * Function ivas_reverb_set_energies() * @@ -281,29 +141,11 @@ static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties( static void ivas_reverb_set_energies( const Word32 *avg_pwr_l, const Word32 *avg_pwr_r, -#else -/*-----------------------------------------------------------------------------------------* - * Function ivas_reverb_get_fastconv_hrtf_set_energies() - * - * Function analyses the HRTF set and computes avarage left/right power spectrum. - * Uses fastconv renderer filter taps to compute energies. Output interpolated - * to CLDFB bin center frequencies - *-----------------------------------------------------------------------------------------*/ - -static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( - const HRTFS_FASTCONV_HANDLE hHrtfFastConv, - const AUDIO_CONFIG input_audio_config, - const int16_t use_brir, -#endif const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right ) { int16_t freq_idx; -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - float avg_pwr_left_fft[FFT_SPECTRUM_SIZE]; - float avg_pwr_right_fft[FFT_SPECTRUM_SIZE]; -#endif float input_fc[FFT_SPECTRUM_SIZE]; #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT Word32 input_fc_fx[FFT_SPECTRUM_SIZE]; @@ -315,11 +157,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const Word16 cldfb_freq_halfstep = MAX_SAMPLING_RATE / ( 4 * CLDFB_NO_CHANNELS_MAX ); #endif -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - ivas_error error; -#endif -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const int16_t avg_pwr_len = sampling_rate == 16000 ? LR_IAC_LENGTH_NR_FC_16KHZ : LR_IAC_LENGTH_NR_FC; for ( freq_idx = 0; freq_idx < avg_pwr_len; freq_idx++ ) @@ -336,14 +174,7 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( output_fc_fx[freq_idx] = ( ( freq_idx << 1 ) + 1 ) * cldfb_freq_halfstep * ONE_IN_Q16; } #endif -#else - for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ ) - { - input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( FFT_SPECTRUM_SIZE - 1 ) ); - } -#endif -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifndef FIX_1741_REVERB_TIMES_Q_FORMAT Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 ) ); @@ -390,49 +221,4 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( free( avg_pwr_right_fx ); #endif -#else - if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK ) - { - return error; - } - Word32 *input_fc_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - Word32 *avg_pwr_left_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - Word32 *avg_pwr_right_fft_fx = (Word32 *) malloc( 60 * sizeof( Word32 * ) ); - - Word32 *output_fc_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word32 *avg_pwr_left_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word16 *avg_pwr_left_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); - Word32 *avg_pwr_right_fx = (Word32 *) malloc( 257 * sizeof( Word32 * ) ); - Word16 *avg_pwr_right_e = (Word16 *) malloc( 257 * sizeof( Word16 * ) ); - - for ( int i = 0; i < 60; i++ ) - { - input_fc_fx[i] = (Word32) input_fc[i] * ( 1 << 16 ); - avg_pwr_left_fft_fx[i] = (Word32) ( avg_pwr_left_fft[i] ) * ONE_IN_Q26; - avg_pwr_right_fft_fx[i] = (Word32) avg_pwr_right_fft[i] * ONE_IN_Q30; - } - - for ( int i = 0; i < 257; i++ ) - { - output_fc_fx[i] = (Word32) input_fc[i] * ONE_IN_Q16; - } - - ivas_reverb_interpolate_acoustic_data_fx( FFT_SPECTRUM_SIZE, input_fc_fx, avg_pwr_left_fft_fx, avg_pwr_right_fft_fx, - CLDFB_NO_CHANNELS_MAX, output_fc_fx, avg_pwr_left_fx, avg_pwr_right_fx, avg_pwr_left_e, avg_pwr_right_e ); - for ( int i = 0; i < 257; i++ ) - { - avg_pwr_left[i] = (float) fabs( me2f( avg_pwr_left_fx[i], avg_pwr_left_e[i] ) ); - avg_pwr_right[i] = (float) fabs( me2f( avg_pwr_right_fx[i], avg_pwr_right_e[i] ) ); - } - - free( input_fc_fx ); - free( avg_pwr_left_fft_fx ); - free( avg_pwr_right_fft_fx ); - free( output_fc_fx ); - free( avg_pwr_left_fx ); - free( avg_pwr_left_e ); - free( avg_pwr_right_fx ); - free( avg_pwr_right_e ); - return IVAS_ERR_OK; -#endif } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 50e3d7f6c..747af4048 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -1206,11 +1206,6 @@ typedef struct TDREND_HRFILT_FiltSet_struct ModelParamsITD_t ModelParamsITD; TDREND_HRFILT_Method_t FilterMethod; /* HR filtering method */ Word32 latency_s_fx; /* Q31 */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#else - const Word32 *lr_energy_and_iac_fx[3]; /* left/right energy and interaural coherence for late reverb */ - Word32 *lr_energy_and_iac_dyn_fx[3]; -#endif } TDREND_HRFILT_FiltSet_t; /* Distance attenuation */ @@ -1478,7 +1473,6 @@ typedef struct ivas_hrtfs_parambin_struct #endif -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES typedef struct ivas_hrtfs_statistics_struct { const Word32 *average_energy_l; @@ -1489,7 +1483,6 @@ typedef struct ivas_hrtfs_statistics_struct Word32 *inter_aural_coherence_dyn; int16_t fromROM; /* Flag that indicates that the pointers point to tables in ROM (controls init/dealloc).*/ } HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE; -#endif /*----------------------------------------------------------------------------------* diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 1300d6340..41fbff92d 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -209,12 +209,10 @@ ivas_error IVAS_REND_GetHrtfParamBinHandle( IVAS_DEC_HRTF_PARAMBIN_HANDLE **hHrtfParambin /* o : Parametric binauralizer HRTF handle */ ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_error IVAS_REND_GetHrtfStatisticsHandle( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ IVAS_DEC_HRTF_STATISTICS_HANDLE **hHrtfStatistics /* o : HRTF statistics handle */ ); -#endif /* Functions to be called during rendering */ diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 97b83b7b6..ee83f69c7 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -196,9 +196,7 @@ typedef struct hrtf_handles IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; IVAS_DEC_HRTF_HANDLE hHrtfTD; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics; -#endif } hrtf_handles; struct IVAS_REND @@ -234,11 +232,7 @@ struct IVAS_REND /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, const RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hHrtfs ); -#else -static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, hrtf_handles *hHrtfs ); -#endif static void freeMasaExtRenderer( MASA_EXT_REND_HANDLE *hMasaExtRendOut ); static void intermidiate_ext_dirac_render( @@ -1578,22 +1572,14 @@ static ivas_error setRendInputActiveIsm( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), hrtfs->hHrtfStatistics, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputIsm->hReverb ), outConfig, NULL, inputIsm->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, *rendCtx.pOutSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } } ELSE IF( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hrtfs->hSetOfHRTF, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -2404,9 +2390,7 @@ static ivas_error initMcBinauralRendering( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, IVAS_DEC_HRTF_CREND_HANDLE hMixconv, -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES HRTFS_STATISTICS_HANDLE hHrtfStatistics, -#endif uint8_t reconfigureFlag ) { ivas_error error; @@ -2556,11 +2540,7 @@ static ivas_error initMcBinauralRendering( test(); IF( EQ_32( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && inputMc->hReverb == NULL ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), hHrtfStatistics, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_reverb_open_fx( &( inputMc->hReverb ), outConfig, NULL, inputMc->tdRendWrapper.hBinRendererTd->HrFiltSet_p->lr_energy_and_iac_fx, hRendCfg, outSampleRate ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -2569,16 +2549,9 @@ static ivas_error initMcBinauralRendering( ELSE IF( !useTDRend && inputMc->crendWrapper == NULL ) { /* open CREND */ -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( inConfig == IVAS_AUDIO_CONFIG_LS_CUSTOM ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputMc->crendWrapper, ( EQ_16( inConfig, IVAS_AUDIO_CONFIG_LS_CUSTOM ) ) ? IVAS_AUDIO_CONFIG_7_1_4 : inConfig, outConfig, hRendCfg, - hMixconv, - outSampleRate, ( ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) ) ? inputMc->base.ctx.pSplitRendWrapper->multiBinPoseData.num_poses : 1 ) ), - IVAS_ERR_OK ) ) -#endif { return error; } @@ -2784,11 +2757,7 @@ static ivas_error setRendInputActiveMc( IF( EQ_32( getAudioConfigType( outConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg, hrtfs->hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -2944,10 +2913,8 @@ static ivas_error updateSbaPanGains( const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, IVAS_DEC_HRTF_CREND_HANDLE hMixconv -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES , IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics -#endif ) { @@ -3007,11 +2974,7 @@ static ivas_error updateSbaPanGains( } else { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, inConfig, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -3024,11 +2987,7 @@ static ivas_error updateSbaPanGains( { return error; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, hHrtfStatistics, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_rend_openCrend( &inputSba->crendWrapper, IVAS_AUDIO_CONFIG_7_1_4, outConfig, hRendCfg, hMixconv, *rendCtx.pOutSampleRate, rendCtx.pSplitRendWrapper->multiBinPoseData.num_poses ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -3120,11 +3079,7 @@ static ivas_error setRendInputActiveSba( return error; } } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF, hrtfs->hHrtfStatistics ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg, hrtfs->hSetOfHRTF ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -3160,11 +3115,7 @@ static ivas_error setRendInputActiveMasa( const IVAS_REND_InputId id, RENDER_CONFIG_DATA *hRendCfg, hrtf_handles *hrtfs -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ) -#else - ) /* Todo: This is not used at all within MASA. Support might be better to do after refactoring. */ -#endif { ivas_error error; rendering_context rendCtx; @@ -3176,9 +3127,6 @@ static ivas_error setRendInputActiveMasa( rendCtx = inputMasa->base.ctx; outConfig = *rendCtx.pOutConfig; move32(); -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - (void) hRendCfg; /* Suppress warning */ -#endif IF( !isIoConfigPairSupported( inConfig, outConfig ) ) { @@ -3217,11 +3165,7 @@ static ivas_error setRendInputActiveMasa( } ELSE { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hRendCfg, hrtfs ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMasaExtRenderer( inputMasa, outConfig, hrtfs ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -3407,9 +3351,7 @@ ivas_error IVAS_REND_Open( hIvasRend->hHrtfs.hHrtfParambin = NULL; hIvasRend->hHrtfs.hHrtfTD = NULL; hIvasRend->hHrtfs.hSetOfHRTF = NULL; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES hIvasRend->hHrtfs.hHrtfStatistics = NULL; -#endif IF( asHrtfBinary ) { IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( hIvasRend->hHrtfs.hHrtfTD ) ) ), IVAS_ERR_OK ) ) @@ -3428,19 +3370,15 @@ ivas_error IVAS_REND_Open( { return error; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &( hIvasRend->hHrtfs.hHrtfStatistics ) ) ), IVAS_ERR_OK ) ) { return error; } -#endif } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = ivas_HRTF_statistics_init( &( hIvasRend->hHrtfs.hHrtfStatistics ), hIvasRend->sampleRateOut ) ), IVAS_ERR_OK ) ) { return error; } -#endif return IVAS_ERR_OK; } @@ -3588,11 +3526,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( /* Input inactive, skip. */ CONTINUE; } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig, NULL, NULL ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = updateSbaPanGains( inputSba, hIvasRend->outputConfig, hIvasRend->hRendererConfig, NULL ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -4101,11 +4035,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( IF( EQ_32( getAudioConfigType( hIvasRend->outputConfig ), IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, FALSE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, FALSE ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -4907,11 +4837,7 @@ ivas_error IVAS_REND_SetHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, TRUE ) ), IVAS_ERR_OK ) ) -#endif { return error; } @@ -5005,11 +4931,7 @@ ivas_error IVAS_REND_DisableHeadRotation( { IF( NE_32( hIvasRend->inputsMc[i].base.inConfig, IVAS_AUDIO_CONFIG_INVALID ) ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, hIvasRend->hHrtfs.hHrtfStatistics, TRUE ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = initMcBinauralRendering( &hIvasRend->inputsMc[i], hIvasRend->inputsMc[i].base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig, hIvasRend->hHrtfs.hSetOfHRTF, TRUE ) ), IVAS_ERR_OK ) ) -#endif { return error; @@ -8969,9 +8891,7 @@ void IVAS_REND_Close( ivas_HRTF_CRend_binary_close_fx( &( hIvasRend->hHrtfs.hSetOfHRTF ) ); ivas_HRTF_fastconv_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfFastConv ) ); ivas_HRTF_parambin_binary_close_fx( &( hIvasRend->hHrtfs.hHrtfParambin ) ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES ivas_HRTF_statistics_close( &( hIvasRend->hHrtfs.hHrtfStatistics ) ); -#endif free( hIvasRend ); *phIvasRend = NULL; @@ -9203,7 +9123,6 @@ ivas_error IVAS_REND_GetHrtfParamBinHandle( } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*---------------------------------------------------------------------* * IVAS_REND_GetHrtfStatisticsHandle( ) * @@ -9224,7 +9143,6 @@ ivas_error IVAS_REND_GetHrtfStatisticsHandle( return IVAS_ERR_OK; } -#endif static ivas_error ivas_masa_ext_rend_dirac_rend_init( input_masa *inputMasa ) @@ -9655,13 +9573,9 @@ static ivas_error ivas_masa_ext_rend_dirac_rend_init( static ivas_error ivas_masa_ext_rend_parambin_init( -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES input_masa *inputMasa, /* i/o: MASA external renderer structure */ const RENDER_CONFIG_DATA *hRendCfg, /* i : Renderer configuration data handle */ HRTFS_STATISTICS_HANDLE hHrtfStatistics /* i : HRTF statistics */ -#else - input_masa *inputMasa /* i/o: MASA external renderer structure */ -#endif ) { DIRAC_DEC_BIN_HANDLE hDiracDecBin; @@ -9802,15 +9716,10 @@ static ivas_error ivas_masa_ext_rend_parambin_init( IF( hDiracDecBin->hReverb == NULL && pos_idx == 0 ) /* open reverb only for the main direction */ { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES #ifdef NONBE_FIX_991_PARAMBIN_BINARY_HRTF if ( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, ( *phHrtfParambin )->parametricReverberationTimes_fx, ( *phHrtfParambin )->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) #else IF( NE_32( ( error = ivas_binaural_reverb_init( &hDiracDecBin->hReverb, hHrtfStatistics, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, &( hRendCfg->roomAcoustics ), output_Fs, hHrtfParambin->parametricReverberationTimes_fx, hHrtfParambin->parametricReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) -#endif -#else - /* Todo Philips: Room acoustics should be passed here once the underlying part works. In this case, it probably should come from render context or somewhere else suitable. */ - IF( NE_32( ( error = ivas_binaural_reverb_open_parambin( &hDiracDecBin->hReverb, nBins, CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, output_Fs, hHrtfParambin ) ), IVAS_ERR_OK ) ) #endif { return error; @@ -9867,9 +9776,7 @@ static ivas_error ivas_masa_ext_rend_parambin_init( static ivas_error initMasaExtRenderer( input_masa *inputMasa, const AUDIO_CONFIG outConfig, -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES const RENDER_CONFIG_DATA *hRendCfg, -#endif hrtf_handles *hrtfs ) { Word16 i; @@ -10003,11 +9910,7 @@ static ivas_error initMasaExtRenderer( return error; } } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa, hRendCfg, hrtfs->hHrtfStatistics ) ), IVAS_ERR_OK ) ) -#else - IF( NE_32( ( error = ivas_masa_ext_rend_parambin_init( inputMasa ) ), IVAS_ERR_OK ) ) -#endif { return error; } diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index 7e38a1a08..abf157d9c 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -574,98 +574,6 @@ static ivas_error LoadBSplineBinary( return IVAS_ERR_OK; } -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -/*-------------------------------------------------------------------* - * set_default_reverb_iac_energy() - * - * Loads reverb data from file. - --------------------------------------------------------------------*/ - -static ivas_error set_default_reverb_iac_energy( - IVAS_DEC_HRTF_HANDLE HrFiltSet_p /* i/o: HR filter model parameter structure */ -) -{ - int16_t i; - int16_t lr_iac_len; - - if ( HrFiltSet_p == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - lr_iac_len = LR_IAC_LENGTH_NR_FC; - if ( HrFiltSet_p->SampleRate == 16000 ) - { - lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; - } - - if ( HrFiltSet_p->ModelParams.modelROM == 0 ) - { - for ( i = 0; i < 3; i++ ) - { - HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); - if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - } - switch ( HrFiltSet_p->SampleRate ) - { - case 48000: - mvl2l( defaultHRIR_left_avg_power_48kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], LR_IAC_LENGTH_NR_FC ); - mvl2l( defaultHRIR_right_avg_power_48kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], LR_IAC_LENGTH_NR_FC ); - mvl2l( defaultHRIR_coherence_48kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], LR_IAC_LENGTH_NR_FC ); - break; - case 32000: - mvl2l( defaultHRIR_left_avg_power_32kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], LR_IAC_LENGTH_NR_FC ); - mvl2l( defaultHRIR_right_avg_power_32kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], LR_IAC_LENGTH_NR_FC ); - mvl2l( defaultHRIR_coherence_32kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], LR_IAC_LENGTH_NR_FC ); - break; - case 16000: - floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], Q27, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - break; - } - } - else - { - switch ( HrFiltSet_p->SampleRate ) - { - case 48000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx; - break; - case 32000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; - break; - case 16000: - for ( i = 0; i < 3; i++ ) - { - HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); - if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - } - floatToFixed_arr32( defaultHRIR_coherence_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[2], Q27, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[1], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - floatToFixed_arr32( defaultHRIR_left_avg_power_16kHz_fx, HrFiltSet_p->lr_energy_and_iac_dyn_fx[0], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - HrFiltSet_p->lr_energy_and_iac_fx[0] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[0]; - HrFiltSet_p->lr_energy_and_iac_fx[1] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[1]; - HrFiltSet_p->lr_energy_and_iac_fx[2] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[2]; - - - break; - } - } - - return IVAS_ERR_OK; -} -#endif /*-------------------------------------------------------------------* * load_reverb_from_binary() @@ -674,18 +582,11 @@ static ivas_error set_default_reverb_iac_energy( --------------------------------------------------------------------*/ static ivas_error load_reverb_from_binary( -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ int32_t sampleRate, /* i : sample rate */ -#else - IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ -#endif FILE *f_hrtf /* i : HR filter data file handle */ ) { -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - int16_t i; -#endif bool is_reverb; ivas_error header_check_result; ivas_hrtfs_file_header_t hrtfs_file_header; @@ -696,21 +597,13 @@ static ivas_error load_reverb_from_binary( int16_t lr_iac_len; float f_tmp_lr_energy_and_iac_dyn[LR_IAC_LENGTH_NR_FC]; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( hHrtfStatistics == NULL ) -#else - if ( HrFiltSet_p == NULL ) -#endif { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } lr_iac_len = LR_IAC_LENGTH_NR_FC; -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES if ( sampleRate == 16000 ) -#else - if ( HrFiltSet_p->SampleRate == 16000 ) -#endif { lr_iac_len = LR_IAC_LENGTH_NR_FC_16KHZ; } @@ -771,7 +664,6 @@ static ivas_error load_reverb_from_binary( if ( is_reverb ) { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES hHrtfStatistics->average_energy_l_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); hHrtfStatistics->average_energy_r_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); hHrtfStatistics->inter_aural_coherence_dyn = (Word32 *) malloc( lr_iac_len * sizeof( Word32 ) ); @@ -793,37 +685,9 @@ static ivas_error load_reverb_from_binary( fread( f_tmp_lr_energy_and_iac_dyn, sizeof( float ), lr_iac_len, f_hrtf ); floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, hHrtfStatistics->inter_aural_coherence_dyn, Q26, lr_iac_len ); hHrtfStatistics->fromROM = FALSE; -#else - /* left/right energy and interaural coherence for late reverb */ - FOR( i = 0; i < 3; i++ ) - { - HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] = (Word32 *) malloc( lr_iac_len * sizeof( float ) ); - if ( HrFiltSet_p->lr_energy_and_iac_dyn_fx[i] == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" ); - } - fread( f_tmp_lr_energy_and_iac_dyn, sizeof( const float ), lr_iac_len, f_hrtf ); - IF( i == 2 ) - { - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q27, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q27 for i=2 */ - } - ELSE - { - floatToFixed_arr32( f_tmp_lr_energy_and_iac_dyn, HrFiltSet_p->lr_energy_and_iac_dyn_fx[i], Q23, lr_iac_len ); /* tables from which lr_energy_and_iac is updated has Q23 for i=0,1 */ - } - HrFiltSet_p->lr_energy_and_iac_fx[i] = (const Word32 *) HrFiltSet_p->lr_energy_and_iac_dyn_fx[i]; - } -#endif } else { -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES -#else - if ( ( header_check_result = set_default_reverb_iac_energy( HrFiltSet_p ) ) != IVAS_ERR_OK ) - { - return header_check_result; - } -#endif return IVAS_ERR_BINARY_FILE_WITHOUT_BINAURAL_RENDERER_DATA; } @@ -837,22 +701,14 @@ static ivas_error load_reverb_from_binary( *---------------------------------------------------------------------*/ ivas_error load_reverb_binary( -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ int32_t sampleRate, /* i : sample rate */ -#else - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ -#endif const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ) { fseek( hrtfReader->file, 0, SEEK_SET ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES return load_reverb_from_binary( hHrtfStatistics, sampleRate, hrtfReader->file ); -#else - return load_reverb_from_binary( hHrtf, hrtfReader->file ); -#endif } /*-------------------------------------------------------------------* * TDREND_MIX_LoadHRTF() @@ -1116,25 +972,7 @@ void destroy_td_hrtf( free( ( *hHrtf )->ModelEval.hrfModL_fx ); free( ( *hHrtf )->ModelEval.hrfModR_fx ); -#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES - for ( i = 0; i < 3; i++ ) - { - free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); - } } - else - { - for ( i = 0; i < 3; i++ ) - { - if ( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ) - { - free( ( *hHrtf )->lr_energy_and_iac_dyn_fx[i] ); - } - } - } -#else - } -#endif ivas_HRTF_binary_close_fx( hHrtf ); @@ -2298,7 +2136,6 @@ void destroy_SetOfHRTF( } -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*---------------------------------------------------------------------* * destroy_hrtf_statistics() * @@ -2326,7 +2163,6 @@ void destroy_hrtf_statistics( } ivas_HRTF_statistics_close( hHrtfStatistics ); } -#endif /*---------------------------------------------------------------------* * destroy_fastconv_hrtf() diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 91e68b358..904182ab3 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -99,12 +99,8 @@ ivas_error load_HRTF_binary( *---------------------------------------------------------------------*/ ivas_error load_reverb_binary( -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ int32_t sampleRate, /* i : sample rate */ -#else - IVAS_DEC_HRTF_HANDLE hHrtf, /* i/o: HRTF handle */ -#endif const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); @@ -164,7 +160,6 @@ ivas_error load_parambin_HRTF_from_binary( const hrtfFileReader *hrtfReader /* i : pointer to hrtfFileReader handle */ ); -#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES /*---------------------------------------------------------------------* * destroy_hrtf_statistics() * @@ -174,7 +169,6 @@ ivas_error load_parambin_HRTF_from_binary( void destroy_hrtf_statistics( IVAS_DEC_HRTF_STATISTICS_HANDLE *hHrtfStatistics /* i/o: HRTF statistics handle */ ); -#endif /*---------------------------------------------------------------------* * dealloc_HRTF_binary() -- GitLab From a3b7687d08b1178ef4b0af3c63b12503aac545a8 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:23:06 +0200 Subject: [PATCH 1155/1310] [cleanup] accept FIX_777_COMBI_RENDER_CONFIG_FILE --- lib_com/options.h | 1 - lib_util/render_config_reader.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index fb009faea..7a8ea4d33 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -114,7 +114,6 @@ -#define FIX_777_COMBI_RENDER_CONFIG_FILE /* Philips: Fix for combined renderer config file support */ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 8df6c0d42..bd9e7a48e 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -2249,11 +2249,7 @@ ivas_error RenderConfigReader_read( /* RT60 */ else if ( strcmp( item, "RT60" ) == 0 ) { -#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) -#else - if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pRT60 ) ) -#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; @@ -2263,11 +2259,7 @@ ivas_error RenderConfigReader_read( /* DSR */ else if ( strcmp( item, "DSR" ) == 0 ) { -#ifdef FIX_777_COMBI_RENDER_CONFIG_FILE if ( read_txt_vector( pValue, pRenderConfigReader->pAE[acIdx].pFG->nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) -#else - if ( read_txt_vector( pValue, pRenderConfigReader->pFG[idx].nrBands, pRenderConfigReader->pAE[acIdx].pDSR ) ) -#endif { errorHandler( item, ERROR_VALUE_INVALID ); return IVAS_ERR_INVALID_RENDER_CONFIG; -- GitLab From a8de754fdbc8a9075d622f5df195bc9b10a4f646 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 8 Jul 2025 15:24:13 +0200 Subject: [PATCH 1156/1310] formatting --- lib_dec/ivas_init_dec_fx.c | 74 +++++++++++++------------ lib_rend/ivas_reverb_filter_design_fx.c | 1 - lib_rend/ivas_reverb_fx.c | 4 +- lib_rend/ivas_reverb_utils_fx.c | 1 - lib_rend/lib_rend_fx.c | 6 +- lib_util/hrtf_file_reader.c | 5 +- lib_util/hrtf_file_reader.h | 2 +- 7 files changed, 45 insertions(+), 48 deletions(-) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index ef3d8c6e9..40bf1ccf5 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -1143,52 +1143,54 @@ ivas_error ivas_init_decoder_front( * Allocate HRTF binary handle *--------------------------------------------------------------------*/ - IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ){ - IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ){ + IF( st_ivas->hDecoderConfig->Opt_HRTF_binary ) + { + IF( NE_32( ( error = ivas_HRTF_binary_open_fx( &( st_ivas->hHrtfTD ) ) ), IVAS_ERR_OK ) ) + { return error; -} - -IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) -{ - return error; -} + } -IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) -{ - return error; -} + IF( NE_32( ( error = ivas_HRTF_CRend_binary_open_fx( &( st_ivas->hSetOfHRTF ) ) ), IVAS_ERR_OK ) ) + { + return error; + } -IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) -{ - return error; -} + IF( NE_32( ( error = ivas_HRTF_fastconv_binary_open_fx( &st_ivas->hHrtfFastConv ) ), IVAS_ERR_OK ) ) + { + return error; + } -IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ), IVAS_ERR_OK ) ) -{ - return error; -} -} + IF( NE_32( ( error = ivas_HRTF_parambin_binary_open_fx( &st_ivas->hHrtfParambin ) ), IVAS_ERR_OK ) ) + { + return error; + } -/*-------------------------------------------------------------------* - * Allocate and initialize Binaural Renderer configuration handle - *--------------------------------------------------------------------*/ -test(); -test(); -IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || - ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) -{ - IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) - { - return error; + IF( NE_32( ( error = ivas_HRTF_statistics_binary_open( &st_ivas->hHrtfStatistics ) ), IVAS_ERR_OK ) ) + { + return error; + } } - IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) + /*-------------------------------------------------------------------* + * Allocate and initialize Binaural Renderer configuration handle + *--------------------------------------------------------------------*/ + test(); + test(); + IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) { - return error; + IF( NE_32( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) + { + return error; + } + + IF( NE_32( ( error = ivas_render_config_init_from_rom_fx( &st_ivas->hRenderConfig ) ), IVAS_ERR_OK ) ) + { + return error; + } } -} -return error; + return error; } diff --git a/lib_rend/ivas_reverb_filter_design_fx.c b/lib_rend/ivas_reverb_filter_design_fx.c index 0b8642120..a40fcfac8 100644 --- a/lib_rend/ivas_reverb_filter_design_fx.c +++ b/lib_rend/ivas_reverb_filter_design_fx.c @@ -1002,4 +1002,3 @@ void ivas_reverb_interpolate_energies_fx( return; } #endif - diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index b6a634bb7..761f87ef8 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1421,9 +1421,9 @@ static ivas_error setup_FDN_branches_fx( *------------------------------------------------------------------------*/ ivas_error ivas_reverb_open_fx( - REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ + REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ const HRTFS_STATISTICS_HANDLE hHrtfStatistics, /* i : HRTF statistics handle */ - RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ + RENDER_CONFIG_HANDLE hRenderConfig, /* i : Renderer configuration handle */ const int32_t output_Fs ) { ivas_error error; diff --git a/lib_rend/ivas_reverb_utils_fx.c b/lib_rend/ivas_reverb_utils_fx.c index 84fa82bce..cfbfd7315 100644 --- a/lib_rend/ivas_reverb_utils_fx.c +++ b/lib_rend/ivas_reverb_utils_fx.c @@ -220,5 +220,4 @@ static void ivas_reverb_set_energies( free( avg_pwr_left_fx ); free( avg_pwr_right_fx ); #endif - } diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index ee83f69c7..050da6393 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -2912,8 +2912,7 @@ static ivas_error updateSbaPanGains( input_sba *inputSba, const AUDIO_CONFIG outConfig, RENDER_CONFIG_DATA *hRendCfg, - IVAS_DEC_HRTF_CREND_HANDLE hMixconv - , + IVAS_DEC_HRTF_CREND_HANDLE hMixconv, IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics ) @@ -3114,8 +3113,7 @@ static ivas_error setRendInputActiveMasa( const AUDIO_CONFIG inConfig, const IVAS_REND_InputId id, RENDER_CONFIG_DATA *hRendCfg, - hrtf_handles *hrtfs -) + hrtf_handles *hrtfs ) { ivas_error error; rendering_context rendCtx; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index abf157d9c..9a89badaf 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -584,7 +584,7 @@ static ivas_error LoadBSplineBinary( static ivas_error load_reverb_from_binary( IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ int32_t sampleRate, /* i : sample rate */ - FILE *f_hrtf /* i : HR filter data file handle */ + FILE *f_hrtf /* i : HR filter data file handle */ ) { bool is_reverb; @@ -703,7 +703,7 @@ static ivas_error load_reverb_from_binary( ivas_error load_reverb_binary( IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ int32_t sampleRate, /* i : sample rate */ - const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ) { fseek( hrtfReader->file, 0, SEEK_SET ); @@ -971,7 +971,6 @@ void destroy_td_hrtf( free( ( *hHrtf )->ModelEval.hrfModL_fx ); free( ( *hHrtf )->ModelEval.hrfModR_fx ); - } ivas_HRTF_binary_close_fx( hHrtf ); diff --git a/lib_util/hrtf_file_reader.h b/lib_util/hrtf_file_reader.h index 904182ab3..c0b44e29b 100644 --- a/lib_util/hrtf_file_reader.h +++ b/lib_util/hrtf_file_reader.h @@ -101,7 +101,7 @@ ivas_error load_HRTF_binary( ivas_error load_reverb_binary( IVAS_DEC_HRTF_STATISTICS_HANDLE hHrtfStatistics, /* i/o: HRTF statistics handle */ int32_t sampleRate, /* i : sample rate */ - const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ + const hrtfFileReader *hrtfReader /* i/o: pointer to hrtfFileReader handle */ ); /*---------------------------------------------------------------------* -- GitLab From 8e2135bd0ded893d56d440b3d11a96b143d32d03 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 9 Jul 2025 06:38:32 +0530 Subject: [PATCH 1157/1310] Precision improvement changes for 3GPP Issues #1787 and #1788 Link #1787, #1788 --- lib_com/ivas_dirac_com_fx.c | 89 ++++++++--------------------- lib_rend/ivas_dirac_ana_fx.c | 64 +++++++++++++++++---- lib_rend/ivas_mcmasa_ana_fx.c | 104 +++++++++++++++++++++++++++------- lib_rend/ivas_omasa_ana_fx.c | 87 +++++++++++++++++++++------- lib_rend/ivas_prot_rend_fx.h | 13 +++-- 5 files changed, 235 insertions(+), 122 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index befeb273c..735bbddaa 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -793,109 +793,66 @@ void computeDiffuseness_fixed( ) { Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; + Word16 intensity_slow_e[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; Word64 intensity_slow_abs_64[CLDFB_NO_CHANNELS_MAX]; Word16 intensity_slow_abs_q[CLDFB_NO_CHANNELS_MAX]; Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; + Word16 energy_slow_e[CLDFB_NO_CHANNELS_MAX]; Word16 i, j, k; Word32 tmp = 0; move32(); Word32 *p_tmp; const Word32 *p_tmp_c; - Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp; + Word16 exp1, exp2, q_tmp; Word16 q_ene, q_intensity; /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ - set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); + set_zero_fx( intensity_slow, ( DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ) ); + set16_fx( intensity_slow_e, 0, ( DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ) ); set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); - - /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */ - min_q_shift1 = Q31; - move16(); - min_q_shift1 = s_min( min_q_shift1, getScaleFactor32( buffer_energy, i_mult( DIRAC_NO_COL_AVG_DIFF, num_freq_bands ) ) ); - min_q_shift1 = sub( min_q_shift1, find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ) ); - - min_q_shift2 = Q31; - move16(); - FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) - { - FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) - { - min_q_shift2 = s_min( min_q_shift2, getScaleFactor32( buffer_intensity[i][j], num_freq_bands ) ); - } - } - min_q_shift2 = sub( min_q_shift2, find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ) ); - - q_ene = add( q_factor_energy[0], min_q_shift1 ); - move16(); - q_intensity = add( q_factor_intensity[0], min_q_shift2 ); - move16(); + set16_fx( energy_slow_e, 0, CLDFB_NO_CHANNELS_MAX ); FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { /* Energy slow */ p_tmp_c = buffer_energy + i * num_freq_bands; - q_tmp = add( q_factor_energy[i], min_q_shift1 ); - - - Word16 shift_q = sub( q_tmp, q_ene ); - Word32 shiftEquiv = L_add( 0, 0 ); - Word16 shift_qtotal; - if ( shift_q < 0 ) - { - shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q ); - } - if ( shift_q >= 0 ) - { - shiftEquiv = L_add( 0x7FFFFFFF, 0 ); - } - shift_qtotal = sub( min_q_shift1, s_max( shift_q, 0 ) ); - FOR( k = 0; k < num_freq_bands; k++ ) { - tmp = L_shl( p_tmp_c[k], shift_qtotal ); - energy_slow[k] = Madd_32_32_r( tmp, energy_slow[k], shiftEquiv ); + energy_slow[k] = BASOP_Util_Add_Mant32Exp( p_tmp_c[k], sub( 31, q_factor_energy[i] ), energy_slow[k], energy_slow_e[k], &energy_slow_e[k] ); move32(); } - - q_ene = s_min( q_ene, q_tmp ); - - /* Intensity slow */ - q_tmp = add( q_factor_intensity[i], min_q_shift2 ); - - shift_q = sub( q_tmp, q_intensity ); - if ( shift_q < 0 ) - { - shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q ); - } - if ( shift_q >= 0 ) - { - shiftEquiv = L_lshl( 0x7FFFFFFF, 0 ); - } - shift_qtotal = sub( min_q_shift2, s_max( shift_q, 0 ) ); - FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = buffer_intensity[j][i]; FOR( k = 0; k < num_freq_bands; k++ ) { - tmp = L_shl( p_tmp[k], shift_qtotal ); - intensity_slow[j * num_freq_bands + k] = Madd_32_32_r( tmp, intensity_slow[j * num_freq_bands + k], shiftEquiv ); + intensity_slow[j * num_freq_bands + k] = BASOP_Util_Add_Mant32Exp( p_tmp[k], sub( 31, q_factor_intensity[i] ), intensity_slow[j * num_freq_bands + k], intensity_slow_e[j * num_freq_bands + k], &intensity_slow_e[j * num_freq_bands + k] ); move32(); } } + } + Word16 max_e; + maximum_fx( energy_slow_e, CLDFB_NO_CHANNELS_MAX, &max_e ); + q_ene = sub( 31, max_e ); + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + energy_slow[i] = L_shr( energy_slow[i], sub( max_e, energy_slow_e[i] ) ); // scaling to q_ene + move32(); + } - q_intensity = s_min( q_intensity, q_tmp ); + maximum_fx( intensity_slow_e, DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX, &max_e ); + q_intensity = sub( 31, max_e ); + FOR( i = 0; i < DIRAC_NUM_DIMS * num_freq_bands; i++ ) + { + intensity_slow[i] = L_shr( intensity_slow[i], sub( max_e, intensity_slow_e[i] ) ); // scaling to q_intensity + move32(); } - min_q_shift1 = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) ); - min_q_shift1 = sub( min_q_shift1, idiv1616( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 2 ) ); - scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), min_q_shift1 ); - q_intensity = add( q_intensity, min_q_shift1 ); FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow_abs_64[k] = 0; diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index fcea6a6eb..5f0f8a3a4 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -293,6 +293,7 @@ static void ivas_dirac_param_est_ana_fx( Word32 Foa_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 Foa_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_real_q[MASA_FREQUENCY_BANDS]; Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word32 diffuseness_m_fx[MASA_FREQUENCY_BANDS]; @@ -308,6 +309,10 @@ static void ivas_dirac_param_est_ana_fx( Word16 numAnalysisChannels; Word16 inp_q; Word16 intensity_q, reference_power_q; + Word16 temp_e, sf, scaled_data_q, s, shift = 31; + move16(); + Word32 temp; + Word64 W_temp; num_freq_bands = hDirAC->nbands; /* l_ts = input_frame / CLDFB_NO_COL_MAX; */ l_ts = shr( input_frame, 4 ); @@ -320,6 +325,16 @@ static void ivas_dirac_param_est_ana_fx( move16(); move16(); move16(); + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) ); + } + shift = sub( shift, find_guarded_bits_fx( l_ts ) ); + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, shift ); + } + scaled_data_q = add( data_q, shift ); /* do processing over all CLDFB time slots */ FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) @@ -356,14 +371,14 @@ static void ivas_dirac_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { - Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; - inp_q = data_q; // Input Q of data_fx + Word16 cr_q = MAX_16, ci_q = MAX_16, c_e; + inp_q = scaled_data_q; // Q of data_fx after scaling move16(); move16(); move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - inp_q = data_q; + inp_q = scaled_data_q; move16(); cldfbAnalysis_ts_fx_var_q( &( data_fx[i][l_ts * ts] ), Foa_RealBuffer_fx[i], Foa_ImagBuffer_fx[i], l_ts, hDirAC->cldfbAnaEnc[i], &inp_q ); cr_q = s_min( cr_q, getScaleFactor32( Foa_RealBuffer_fx[i], l_ts ) ); @@ -386,19 +401,38 @@ static void ivas_dirac_param_est_ana_fx( move16(); FOR( j = brange[0]; j < brange[1]; j++ ) { - Word32 temp = L_add( Mult_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Mult_32_32( Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e - hDirAC->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->energy_fx[block_m_idx][band_m_idx], hDirAC->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hDirAC->energy_e[block_m_idx][band_m_idx] ); + W_temp = W_mac_32_32( W_mult_32_32( Foa_RealBuffer_fx[0][j], Foa_RealBuffer_fx[0][j] ), Foa_ImagBuffer_fx[0][j], Foa_ImagBuffer_fx[0][j] ); // Q-> 2*inp_q + 1 + sf = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, sf ) ); // 2*inp_q + 1 + sf - 32 + temp_e = sub( 63 - 1, add( shl( inp_q, 1 ), sf ) ); // 31 - ( 2 * inp_q + 1 + sf - 32 ) + hDirAC->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->energy_fx[block_m_idx][band_m_idx], hDirAC->energy_e[block_m_idx][band_m_idx], temp, temp_e, &hDirAC->energy_e[block_m_idx][band_m_idx] ); move32(); } } /* Direction estimation */ - computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ - intensity_q = sub( 31, shl( c_e, 1 ) ); + computeIntensityVector_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q ); + + computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q ); - computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), NULL ); /* Power estimation for diffuseness */ - computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 ); // computeReferencePower_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); + computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 ); reference_power_q = sub( shl( inp_q, 1 ), 30 ); + + /* Aligning intensity_real to a common Q-factor */ + minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_q, intensity_real_q[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + } + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hDirAC->index_buffer_intensity = add( ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ move16(); @@ -426,7 +460,13 @@ static void ivas_dirac_param_est_ana_fx( move32(); hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] ); move32(); - diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] ); + + W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ); + s = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, s ) ); + temp_e = sub( 63, add( add( reference_power_q, diffuseness_q ), s ) ); // 31 - ( reference_power_q + diffuseness_q + s - 32 ) + + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] ); move32(); renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); @@ -479,6 +519,10 @@ static void ivas_dirac_param_est_ana_fx( } } + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, negate( shift ) ); + } return; } diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index 99af8a0af..489dd72bf 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -529,7 +529,10 @@ void ivas_mcmasa_param_est_ana_fx( Word32 FoaEven_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 FoaEven_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_real_q[MASA_FREQUENCY_BANDS]; Word32 intensity_even_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_even_real_q[MASA_FREQUENCY_BANDS]; + Word16 intensity_q, intensity_even_q; Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word32 vertical_diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; @@ -571,6 +574,11 @@ void ivas_mcmasa_param_est_ana_fx( Word16 i1, i2, i3; Word16 numAnalysisChannels; Word16 spreadCoh_e; + Word64 W_temp; + Word32 temp; + Word16 temp_e; + Word16 sf, scaled_data_q, s, shift = 31; + move16(); num_freq_bins = hMcMasa->cldfbAnaEnc[0]->no_channels; move16(); num_freq_bands = hMcMasa->nbands; @@ -580,6 +588,18 @@ void ivas_mcmasa_param_est_ana_fx( set16_fx( q_vdv, 31, MASA_FREQUENCY_BANDS ); set16_fx( out_exp, 30, MASA_FREQUENCY_BANDS ); + + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + shift = s_min( shift, L_norm_arr( data_fx[i], input_frame ) ); + } + shift = sub( shift, find_guarded_bits_fx( l_ts ) ); + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, shift ); + } + scaled_data_q = add( q_data, shift ); + /* do processing over all CLDFB time slots */ FOR( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) { @@ -625,14 +645,14 @@ void ivas_mcmasa_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { - Word16 cr_q = MAX_16, ci_q = MAX_16, sf, c_e; + Word16 cr_q = MAX_16, ci_q = MAX_16, c_e; move16(); move16(); - Word16 inp_q = q_data; + Word16 inp_q = scaled_data_q; move16(); FOR( i = 0; i < numAnalysisChannels; i++ ) { - inp_q = q_data; + inp_q = scaled_data_q; move16(); cldfbAnalysis_ts_fx_var_q( &( data_fx[i][i_mult( l_ts, ts )] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hMcMasa->cldfbAnaEnc[i], &inp_q ); cr_q = s_min( cr_q, getScaleFactor32( Chnl_ImagBuffer_fx[i], l_ts ) ); @@ -659,8 +679,12 @@ void ivas_mcmasa_param_est_ana_fx( { FOR( i = 0; i < numAnalysisChannels; i++ ) { - Word32 temp = L_add( Mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Mult_32_32( Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ) ); // Q-> 2*inp_q - 31, e = 31 - (2*inp_q - 31) = 62 - 2*inp_q = 2*(31 - inp_q) = 2*c_e - hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, shl( c_e, 1 ), &hMcMasa->energy_e[block_m_idx][band_m_idx] ); + W_temp = W_mac_32_32( W_mult_32_32( Chnl_RealBuffer_fx[i][j], Chnl_RealBuffer_fx[i][j] ), Chnl_ImagBuffer_fx[i][j], Chnl_ImagBuffer_fx[i][j] ); // Q-> 2*inp_q + 1 + sf = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, sf ) ); // 2 * inp_q + 1 + sf - 32 + temp_e = sub( 31 + 31, add( shl( inp_q, 1 ), sf ) ); // e = 31 - (2 * inp_q + 1 + sf - 32) + + hMcMasa->energy_fx[block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->energy_fx[block_m_idx][band_m_idx], hMcMasa->energy_e[block_m_idx][band_m_idx], temp, temp_e, &hMcMasa->energy_e[block_m_idx][band_m_idx] ); move32(); } } @@ -751,14 +775,39 @@ void ivas_mcmasa_param_est_ana_fx( } /* Direction estimation */ - computeIntensityVector_ana_fx( hMcMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ + computeIntensityVector_ana_fx( hMcMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q ); - computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), - NULL ); /* Q direction_vector_fx = Q30*/ + computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, + intensity_real_q ); /* Q direction_vector_fx = Q30*/ /* Power and intensity estimation for diffuseness */ - computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx ); /*2*inp_q-31*/ - computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); /*2*inp_q-30*/ + computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx, intensity_even_real_q, inp_q ); + + computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); /*2*inp_q-30*/ + + /* Aligning intensity_real and intensity_even_real to a common Q-factor */ + minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); + minimum_fx( intensity_even_real_q, num_freq_bands, &intensity_even_q ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_q, intensity_real_q[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + + tmp = sub( intensity_even_q, intensity_even_real_q[i] ); + intensity_even_real_fx[0][i] = L_shl( intensity_even_real_fx[0][i], tmp ); + move32(); + intensity_even_real_fx[1][i] = L_shl( intensity_even_real_fx[1][i], tmp ); + move32(); + intensity_even_real_fx[2][i] = L_shl( intensity_even_real_fx[2][i], tmp ); + move32(); + } /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = add( ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ @@ -769,7 +818,7 @@ void ivas_mcmasa_param_est_ana_fx( /* only real part needed */ Copy32( intensity_even_real_fx[i], &( hMcMasa->buffer_intensity_real_fx[i][index - 1][0] ), num_freq_bands ); } - hMcMasa->buffer_intensity_real_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_q[index - 1] = intensity_even_q; move16(); Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[i_mult( index - 1, num_freq_bands )] ), num_freq_bands ); hMcMasa->buffer_energy_q[index - 1] = sub( shl( inp_q, 1 ), 30 ); @@ -779,7 +828,7 @@ void ivas_mcmasa_param_est_ana_fx( IF( !hMcMasa->isHorizontalSetup ) { Copy32( intensity_real_fx[2], &( hMcMasa->buffer_intensity_real_vert_fx[index - 1][0] ), num_freq_bands ); - hMcMasa->buffer_intensity_real_vert_q[index - 1] = sub( shl( inp_q, 1 ), 31 ); + hMcMasa->buffer_intensity_real_vert_q[index - 1] = intensity_q; move16(); computeVerticalDiffuseness_fx( hMcMasa->buffer_intensity_real_vert_fx, hMcMasa->buffer_energy_fx, num_freq_bands, vertical_diffuseness_vector_fx, hMcMasa->buffer_intensity_real_vert_q, hMcMasa->buffer_energy_q ); // Q vertical_diffuseness_vector_fx = 31 v_min_fx( diffuseness_vector_fx, out_exp, vertical_diffuseness_vector_fx, q_vdv, diffuseness_vector_fx, out_exp, num_freq_bands ); @@ -790,7 +839,14 @@ void ivas_mcmasa_param_est_ana_fx( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); - diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] ); + + W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ); + s = W_norm( W_temp ); + temp = W_extract_h( W_shl( W_temp, s ) ); + temp_e = sub( 32, add( sub( Q30, sub( shl( c_e, 1 ), 1 ) ), s ) ); // 31 - ( (31 - sub( shl( c_e, 1 ), 1 )) + diffuseness_q + s - 32 ) + + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] ); + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); move32(); move32(); @@ -827,7 +883,7 @@ void ivas_mcmasa_param_est_ana_fx( { FOR( j = i; j < numAnalysisChannels; j++ ) { - Word32 temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), shl( COVls[band_m_idx].xr_e[i][j], 1 ), Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), shl( COVls[band_m_idx].xi_e[i][j], 1 ), &absCOVls_e[i][j] ); + temp = BASOP_Util_Add_Mant32Exp( Mult_32_32( COVls[band_m_idx].xr_fx[i][j], COVls[band_m_idx].xr_fx[i][j] ), shl( COVls[band_m_idx].xr_e[i][j], 1 ), Mult_32_32( COVls[band_m_idx].xi_fx[i][j], COVls[band_m_idx].xi_fx[i][j] ), shl( COVls[band_m_idx].xi_e[i][j], 1 ), &absCOVls_e[i][j] ); absCOVls_fx[i][j] = Sqrt32( temp, &absCOVls_e[i][j] ); move32(); } @@ -880,7 +936,7 @@ void ivas_mcmasa_param_est_ana_fx( move16(); } Word16 temp_exp = add( lsEnergy_e[i1], lsEnergy_e[i2] ); - Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_exp ); + temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i1], lsEnergy_fx[i2] ), EPSILON_FX ), &temp_exp ); tempCoh_e = 0; move16(); tempCoh_fx = L_shl( BASOP_Util_Divide3232_Scale( absCOVls_fx[i1][i2], temp, &tempCoh_e ), 16 ); @@ -932,8 +988,8 @@ void ivas_mcmasa_param_est_ana_fx( move16(); i3 = hMcMasa->rightNearest[i1]; move16(); - Word16 temp_e = add( lsEnergy_e[i2], lsEnergy_e[i3] ); - Word32 temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ); + temp_e = add( lsEnergy_e[i2], lsEnergy_e[i3] ); + temp = Sqrt32( L_add( Mult_32_32( lsEnergy_fx[i2], lsEnergy_fx[i3] ), EPSILON_FX ), &temp_e ); IF( LT_16( i2, i3 ) ) { stereoCoh_fx = BASOP_Util_Divide3232_Scale( absCOVls_fx[i2][i3], temp, &stereoCoh_e ); @@ -1190,6 +1246,12 @@ void ivas_mcmasa_param_est_ana_fx( } } } + + FOR( i = 0; i < numAnalysisChannels; i++ ) + { + scale_sig32( data_fx[i], input_frame, negate( shift ) ); + } + return; } @@ -1611,7 +1673,7 @@ void ivas_create_masa_out_meta_fx( /* Direct-to-total ratio */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->directToTotalRatio[0][sf][band] = (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ); // Q8 + extOutMeta->directToTotalRatio[0][sf][band] = (UWord8) L_shr( Mpy_32_16_1( energyRatio[sf][band], UINT8_MAX ), sub( energyRatio_q, 15 ) ); // Q0 move16(); extOutMeta->directToTotalRatio[1][sf][band] = 0; move16(); @@ -1620,7 +1682,7 @@ void ivas_create_masa_out_meta_fx( /* Spread coherence */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->spreadCoherence[0][sf][band] = (UWord8) L_shr( spreadCoherence[sf][band], sub( spreadCoherence_q, 8 ) ); // Q8 + extOutMeta->spreadCoherence[0][sf][band] = (UWord8) L_shr( Mpy_32_16_1( spreadCoherence[sf][band], UINT8_MAX ), sub( spreadCoherence_q, 15 ) ); // Q0 move16(); extOutMeta->spreadCoherence[1][sf][band] = 0; move16(); @@ -1629,14 +1691,14 @@ void ivas_create_masa_out_meta_fx( /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( UINT8_MAX, (UWord8) L_shr( energyRatio[sf][band], sub( energyRatio_q, 8 ) ) ); // Q8 + extOutMeta->diffuseToTotalRatio[sf][band] = (UWord8) sub( UINT8_MAX, (UWord8) L_shr( Mpy_32_16_1( energyRatio[sf][band], UINT8_MAX ), sub( energyRatio_q, 15 ) ) ); // Q0 move16(); } /* Surround coherence */ FOR( band = 0; band < numFrequencyBands; band++ ) { - extOutMeta->surroundCoherence[sf][band] = (UWord8) L_shr( surroundingCoherence[sf][band], sub( surroundingCoherence_q, 8 ) ); // Q8 + extOutMeta->surroundCoherence[sf][band] = (UWord8) L_shr( Mpy_32_16_1( surroundingCoherence[sf][band], UINT8_MAX ), sub( surroundingCoherence_q, 15 ) ); // Q0 move16(); } } diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index c9ed32d26..fe9ffbea3 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -362,6 +362,7 @@ static void ivas_omasa_param_est_ana_fx( Word32 Foa_RealBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 Foa_ImagBuffer_fx[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; Word32 intensity_real_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + Word16 intensity_real_q[MASA_FREQUENCY_BANDS]; Word32 direction_vector_fx[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; Word32 diffuseness_vector_fx[MASA_FREQUENCY_BANDS]; Word16 diffuseness_q = 0; @@ -523,15 +524,29 @@ static void ivas_omasa_param_est_ana_fx( v_multc_acc_32_32( Chnl_RealBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_RealBuffer_fx[3], num_freq_bins ); // Q: Chnl_RealBuffer_q v_multc_acc_32_32( Chnl_ImagBuffer_fx[i], hOMasa->chnlToFoaMtx_fx[3][i], Foa_ImagBuffer_fx[3], num_freq_bins ); // Q: Chnl_ImagBuffer_q } - computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx ); /* Q intensity_real_fx = 2*inp_q-31, e = 31 - 2*inp_q + 31 = 62 - 2*inp_q = 2*(31-inp_q)=2*c_e */ - intensity_q = sub( 31, shl( c_e, 1 ) ); + computeIntensityVector_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, num_freq_bands, intensity_real_fx, intensity_real_q, inp_q ); - computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], shl( c_e, 1 ), NULL ); /* Q direction_vector_fx = Q30*/ + computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q ); /* Q direction_vector_fx = Q30*/ /* Power estimation for diffuseness */ computeReferencePower_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); // 2 * inputq - 30 reference_power_q = sub( shl( inp_q, 1 ), 30 ); + /* Aligning intensity_real to a common Q-factor */ + minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); + + Word16 tmp; + FOR( i = 0; i < num_freq_bands; i++ ) + { + tmp = sub( intensity_q, intensity_real_q[i] ); + intensity_real_fx[0][i] = L_shl( intensity_real_fx[0][i], tmp ); + move32(); + intensity_real_fx[1][i] = L_shl( intensity_real_fx[1][i], tmp ); + move32(); + intensity_real_fx[2][i] = L_shl( intensity_real_fx[2][i], tmp ); + move32(); + } + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hOMasa->index_buffer_intensity = add( ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ), 1 ); /* averaging_length = 32 */ move16(); @@ -761,8 +776,9 @@ void computeIntensityVector_ana_fx( Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal Qx */ Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input sig Qx */ const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity 2 * Qx -31 */ -) + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity */ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ) { /* Reminder * X = a + ib; Y = c + id @@ -771,33 +787,66 @@ void computeIntensityVector_ana_fx( Word16 i, j; Word32 real, img; Word16 brange[2]; - + Word16 shift_value = add( shl( inp_q, 1 ), 1 ); + Word16 tmp_norm; FOR( i = 0; i < num_frequency_bands; i++ ) { brange[0] = band_grouping[i]; move16(); brange[1] = band_grouping[i + 1]; move16(); + Word16 num_bins = sub( brange[1], brange[0] ); + Word16 gb = find_guarded_bits_fx( num_bins ); + Word16 norm; - intensity_real[0][i] = 0; - move32(); - intensity_real[1][i] = 0; - move32(); - intensity_real[2][i] = 0; - move32(); + Word64 tmp_1 = 0, tmp_2 = 0, tmp_3 = 0; + move64(); + move64(); + move64(); FOR( j = brange[0]; j < brange[1]; j++ ) { - real = Cldfb_RealBuffer[0][j]; // Qx - img = Cldfb_ImagBuffer[0][j]; // Qx - /* Intensity is XYZ order, audio is WYZX order. */ - intensity_real[0][i] = L_add( intensity_real[0][i], L_add( Mpy_32_32( Cldfb_RealBuffer[3][j], real ), Mpy_32_32( Cldfb_ImagBuffer[3][j], img ) ) ); // output Q = 2 * Qx -31 + real = Cldfb_RealBuffer[0][j]; move32(); - intensity_real[1][i] = L_add( intensity_real[1][i], L_add( Mpy_32_32( Cldfb_RealBuffer[1][j], real ), Mpy_32_32( Cldfb_ImagBuffer[1][j], img ) ) ); // output Q = 2 * Qx -31 - move32(); - intensity_real[2][i] = L_add( intensity_real[2][i], L_add( Mpy_32_32( Cldfb_RealBuffer[2][j], real ), Mpy_32_32( Cldfb_ImagBuffer[2][j], img ) ) ); // output Q = 2 * Qx -31 + img = Cldfb_ImagBuffer[0][j]; move32(); + Word64 t1, t2, t3; + t1 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[3][j], real ), Cldfb_ImagBuffer[3][j], img ); /* 2 * q_cldfb + 1 */ + t2 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[1][j], real ), Cldfb_ImagBuffer[1][j], img ); /* 2 * q_cldfb + 1 */ + t3 = W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[2][j], real ), Cldfb_ImagBuffer[2][j], img ); /* 2 * q_cldfb + 1 */ + t1 = W_shr( t1, gb ); + t2 = W_shr( t2, gb ); + t3 = W_shr( t3, gb ); + /* Intensity is XYZ order, audio is WYZX order. */ + tmp_1 = W_add( tmp_1, t1 ); /* 2 * q_cldfb + 1 */ + tmp_2 = W_add( tmp_2, t2 ); /* 2 * q_cldfb + 1 */ + tmp_3 = W_add( tmp_3, t3 ); /* 2 * q_cldfb + 1 */ + } + norm = 63; + move16(); + IF( tmp_1 != 0 ) + { + tmp_norm = W_norm( tmp_1 ); + norm = s_min( norm, tmp_norm ); + } + IF( tmp_2 != 0 ) + { + tmp_norm = W_norm( tmp_2 ); + norm = s_min( norm, tmp_norm ); + } + IF( tmp_3 != 0 ) + { + tmp_norm = W_norm( tmp_3 ); + norm = s_min( norm, tmp_norm ); } + norm = sub( norm, 32 ); + intensity_real[0][i] = W_shl_sat_l( tmp_1, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[1][i] = W_shl_sat_l( tmp_2, norm ); // shift_value - (gb - norm) + move32(); + intensity_real[2][i] = W_shl_sat_l( tmp_3, norm ); // shift_value - (gb - norm) + q_intensity_real[i] = sub( shift_value, sub( gb, norm ) ); + move16(); } return; diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 7c5c02c71..6b34bcffe 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -1428,12 +1428,13 @@ void ivas_omasa_ana_close( OMASA_ANA_HANDLE *hOMasa /* i/o: analysis OMASA handle */ ); void computeIntensityVector_ana_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal Qx */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal Qx */ - const Word16 num_frequency_bands, /* i : Number of frequency bands */ - Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector 2 * Qx -31 */ -); + const Word16 *band_grouping, /* i : Band grouping for estimation */ + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal Qx */ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input sig Qx */ + const Word16 num_frequency_bands, /* i : Number of frequency bands */ + Word32 intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS], /* o : Intensity */ + Word16 q_intensity_real[MASA_FREQUENCY_BANDS], + Word16 inp_q ); void computeReferencePower_ana_fx( const Word16 *band_grouping, /* i : Band grouping for estimation */ -- GitLab From dd858bd334a3bcfa1b65c1e3e6869528918df36e Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 9 Jul 2025 11:53:09 +0530 Subject: [PATCH 1158/1310] Reverted changes in computeDiffuseness_fixed to resolve regressions --- lib_com/ivas_dirac_com_fx.c | 89 +++++++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 735bbddaa..befeb273c 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -793,66 +793,109 @@ void computeDiffuseness_fixed( ) { Word32 intensity_slow[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; - Word16 intensity_slow_e[DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX]; Word32 intensity_slow_abs[CLDFB_NO_CHANNELS_MAX]; Word64 intensity_slow_abs_64[CLDFB_NO_CHANNELS_MAX]; Word16 intensity_slow_abs_q[CLDFB_NO_CHANNELS_MAX]; Word32 energy_slow[CLDFB_NO_CHANNELS_MAX]; - Word16 energy_slow_e[CLDFB_NO_CHANNELS_MAX]; Word16 i, j, k; Word32 tmp = 0; move32(); Word32 *p_tmp; const Word32 *p_tmp_c; - Word16 exp1, exp2, q_tmp; + Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp; Word16 q_ene, q_intensity; /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ - set_zero_fx( intensity_slow, ( DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ) ); - set16_fx( intensity_slow_e, 0, ( DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX ) ); + set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); - set16_fx( energy_slow_e, 0, CLDFB_NO_CHANNELS_MAX ); + + /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */ + min_q_shift1 = Q31; + move16(); + min_q_shift1 = s_min( min_q_shift1, getScaleFactor32( buffer_energy, i_mult( DIRAC_NO_COL_AVG_DIFF, num_freq_bands ) ) ); + min_q_shift1 = sub( min_q_shift1, find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ) ); + + min_q_shift2 = Q31; + move16(); + FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + min_q_shift2 = s_min( min_q_shift2, getScaleFactor32( buffer_intensity[i][j], num_freq_bands ) ); + } + } + min_q_shift2 = sub( min_q_shift2, find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ) ); + + q_ene = add( q_factor_energy[0], min_q_shift1 ); + move16(); + q_intensity = add( q_factor_intensity[0], min_q_shift2 ); + move16(); FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { /* Energy slow */ p_tmp_c = buffer_energy + i * num_freq_bands; + q_tmp = add( q_factor_energy[i], min_q_shift1 ); + + + Word16 shift_q = sub( q_tmp, q_ene ); + Word32 shiftEquiv = L_add( 0, 0 ); + Word16 shift_qtotal; + if ( shift_q < 0 ) + { + shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q ); + } + if ( shift_q >= 0 ) + { + shiftEquiv = L_add( 0x7FFFFFFF, 0 ); + } + shift_qtotal = sub( min_q_shift1, s_max( shift_q, 0 ) ); + FOR( k = 0; k < num_freq_bands; k++ ) { - energy_slow[k] = BASOP_Util_Add_Mant32Exp( p_tmp_c[k], sub( 31, q_factor_energy[i] ), energy_slow[k], energy_slow_e[k], &energy_slow_e[k] ); + tmp = L_shl( p_tmp_c[k], shift_qtotal ); + energy_slow[k] = Madd_32_32_r( tmp, energy_slow[k], shiftEquiv ); move32(); } + + q_ene = s_min( q_ene, q_tmp ); + + /* Intensity slow */ + q_tmp = add( q_factor_intensity[i], min_q_shift2 ); + + shift_q = sub( q_tmp, q_intensity ); + if ( shift_q < 0 ) + { + shiftEquiv = L_lshl( (Word32) 0x80000000, shift_q ); + } + if ( shift_q >= 0 ) + { + shiftEquiv = L_lshl( 0x7FFFFFFF, 0 ); + } + shift_qtotal = sub( min_q_shift2, s_max( shift_q, 0 ) ); + FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = buffer_intensity[j][i]; FOR( k = 0; k < num_freq_bands; k++ ) { - intensity_slow[j * num_freq_bands + k] = BASOP_Util_Add_Mant32Exp( p_tmp[k], sub( 31, q_factor_intensity[i] ), intensity_slow[j * num_freq_bands + k], intensity_slow_e[j * num_freq_bands + k], &intensity_slow_e[j * num_freq_bands + k] ); + tmp = L_shl( p_tmp[k], shift_qtotal ); + intensity_slow[j * num_freq_bands + k] = Madd_32_32_r( tmp, intensity_slow[j * num_freq_bands + k], shiftEquiv ); move32(); } } - } - Word16 max_e; - maximum_fx( energy_slow_e, CLDFB_NO_CHANNELS_MAX, &max_e ); - q_ene = sub( 31, max_e ); - FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) - { - energy_slow[i] = L_shr( energy_slow[i], sub( max_e, energy_slow_e[i] ) ); // scaling to q_ene - move32(); - } - maximum_fx( intensity_slow_e, DIRAC_NUM_DIMS * CLDFB_NO_CHANNELS_MAX, &max_e ); - q_intensity = sub( 31, max_e ); - FOR( i = 0; i < DIRAC_NUM_DIMS * num_freq_bands; i++ ) - { - intensity_slow[i] = L_shr( intensity_slow[i], sub( max_e, intensity_slow_e[i] ) ); // scaling to q_intensity - move32(); + q_intensity = s_min( q_intensity, q_tmp ); } + min_q_shift1 = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) ); + min_q_shift1 = sub( min_q_shift1, idiv1616( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 2 ) ); + scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), min_q_shift1 ); + q_intensity = add( q_intensity, min_q_shift1 ); FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow_abs_64[k] = 0; -- GitLab From c4b66eb562a52bc61ab05709762498b29d6ca12f Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 11:25:35 +0200 Subject: [PATCH 1159/1310] test listing pipelines --- .gitlab-ci.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1c75ef140..e625b1844 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,6 +66,9 @@ workflow: variables: IVAS_PIPELINE_NAME: 'Renderer framesize BE test on $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' + variables: + IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' || $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' variables: IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch @@ -1634,6 +1637,29 @@ voip-be-on-merge-request: - make -j >> /dev/null - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py +long-term-job-logs: + rules: + -if $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job + stage: test + timeout: "20 minutes" + script: + - curl --request GET "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines" + + #- id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) + #- echo "Job ID from variables - $CI_JOB_ID, Job ID from script - $id_previous" + #- curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + #- unzip artifacts.zip -d previous_artifacts + # This wildcard thingy relies on only one csv file being present per job + #- file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" + #- python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME + - TODAY=$(date +'%Y-%m-%d') + # create log if it doesn't exist + - mkdir -p logs/$TODAY + - ls + - ls logs + + + # --------------------------------------------------------------- # Complexity measurement jobs -- GitLab From a0de38f21270ec1b45bf86f8d6196524da7cb539 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 11:26:37 +0200 Subject: [PATCH 1160/1310] fix syntax error --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e625b1844..2b22701b8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1639,7 +1639,7 @@ voip-be-on-merge-request: long-term-job-logs: rules: - -if $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job + -if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job stage: test timeout: "20 minutes" script: -- GitLab From 3ea49bd8223b4ac925d840acea9efe700e25b949 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 11:28:51 +0200 Subject: [PATCH 1161/1310] fix syntax error --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2b22701b8..11866fffa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1639,7 +1639,7 @@ voip-be-on-merge-request: long-term-job-logs: rules: - -if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job stage: test timeout: "20 minutes" script: -- GitLab From dac810a8af51c3f4f660248d5639d88c87ec17eb Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 11:34:50 +0200 Subject: [PATCH 1162/1310] fix manual pipeline name --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 11866fffa..9acab3d8a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,11 +66,11 @@ workflow: variables: IVAS_PIPELINE_NAME: 'Renderer framesize BE test on $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' - variables: - IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' || $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' variables: IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' + variables: + IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' -- GitLab From f9a46a42fb0a63916ddc7e9f17f6c90699407114 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 11:39:29 +0200 Subject: [PATCH 1163/1310] update gitlab.yaml --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9acab3d8a..56716ba09 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -29,6 +29,9 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing variables: IVAS_PIPELINE_NAME: 'Web run pipeline: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' + variables: + IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare' variables: IVAS_PIPELINE_NAME: 'Run comparison tools against float ref: $CI_COMMIT_BRANCH' @@ -68,9 +71,6 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' variables: IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' - variables: - IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' -- GitLab From 3fb306c27c3825339dfd3c99c8c47e76d148dab3 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 11:42:15 +0200 Subject: [PATCH 1164/1310] make job a manual job --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 56716ba09..a8b50ac69 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1640,6 +1640,7 @@ voip-be-on-merge-request: long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job + when: manual stage: test timeout: "20 minutes" script: -- GitLab From e7f91d3ceb7d03b36501b4c77526786896595325 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 12:44:56 +0200 Subject: [PATCH 1165/1310] add variable for new manual job --- .gitlab-ci/variables.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index d91866b86..a804cdddb 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -65,3 +65,4 @@ variables: - 'voip-be-test' - 'renderer-framesize-be' - 'peaq-enc-passthrough' + - 'long-term-logs' -- GitLab From 25089d410d39083104e7033d1b3704297156a6e2 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Wed, 9 Jul 2025 12:47:25 +0200 Subject: [PATCH 1166/1310] move job to '.pre' stage --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a8b50ac69..9fc0b5e89 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1640,8 +1640,7 @@ voip-be-on-merge-request: long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job - when: manual - stage: test + stage: .pre timeout: "20 minutes" script: - curl --request GET "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines" -- GitLab From a3c5954bb23bc5fc8b36beafcd72ecc1e59cafc3 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 9 Jul 2025 13:44:21 +0200 Subject: [PATCH 1167/1310] address comment on macro --- lib_dec/ivas_spar_md_dec_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec_fx.c b/lib_dec/ivas_spar_md_dec_fx.c index 72d5e6599..fdb29e842 100644 --- a/lib_dec/ivas_spar_md_dec_fx.c +++ b/lib_dec/ivas_spar_md_dec_fx.c @@ -45,7 +45,7 @@ * Local constants *------------------------------------------------------------------------------------------*/ #ifdef FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC -#define INV_PI_DEG180_Q_22 ( (Word32) 0x394BB835 ) /* 2.0/PI in Q31 times DEGREE_180_Q_22) */ +#define DEG180_BY_PI_Q24 ( (Word32) 0x394BB835 ) /* 180.0/PI in Q24) */ #endif #define IVAS_DEFAULT_DTX_CNG_RAMP ( 8 ) @@ -2964,7 +2964,7 @@ void ivas_spar_to_dirac_fx( Word16 check_azi_fx = BASOP_util_atan2( dvy_fx[band], dvx_fx[band], 0 ); /*Q13*/ #ifdef FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC - Word32 azi_intermediate = Mpy_32_16_1( INV_PI_DEG180_Q_22, check_azi_fx ); + Word32 azi_intermediate = Mpy_32_16_1( DEG180_BY_PI_Q24, check_azi_fx ); #else Word16 check_azi_fx_res; Word32 check_azi_fx_32 = L_shl( check_azi_fx, 16 ); /*Q29*/ @@ -2994,7 +2994,7 @@ void ivas_spar_to_dirac_fx( Word16 check_ele_fx = BASOP_util_atan2( dvz_fx[band], radius_fx, sub( add( 9, q_dvnorm ), q_temp ) ); /*Q13*/ #ifdef FIX_ISSUE_1744_IVAS_SPAR_TO_DIRAC - Word32 ele_intermediate = Mpy_32_16_1( INV_PI_DEG180_Q_22, check_ele_fx ); + Word32 ele_intermediate = Mpy_32_16_1( DEG180_BY_PI_Q24, check_ele_fx ); #else Word16 check_ele_fx_res; -- GitLab From 16945411451710c9dfa86c5d1ddfff94d6571197 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 9 Jul 2025 14:46:29 +0530 Subject: [PATCH 1168/1310] Decoder USAN error fix --- lib_com/cnst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 53032d5ae..a01f447d4 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -134,7 +134,7 @@ #define ONE_IN_Q29 536870912 #define ONE_IN_Q30 1073741824 #define ONE_IN_Q31 0x7fffffff -#define MINUS_ONE_IN_Q31 0x80000000 +#define MINUS_ONE_IN_Q31 -2147483647 - 1 #define TWO_IN_Q29 1073741824 #define FOUR_IN_Q28 1073741824 -- GitLab From e2c6c0ab96a85b9e7e1d8bf48c89ad7a138de4f6 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 9 Jul 2025 17:28:09 +0530 Subject: [PATCH 1169/1310] Parenthesis for the macro added --- lib_com/cnst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index a01f447d4..8faa2cb57 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -134,7 +134,7 @@ #define ONE_IN_Q29 536870912 #define ONE_IN_Q30 1073741824 #define ONE_IN_Q31 0x7fffffff -#define MINUS_ONE_IN_Q31 -2147483647 - 1 +#define MINUS_ONE_IN_Q31 (-2147483647 - 1) #define TWO_IN_Q29 1073741824 #define FOUR_IN_Q28 1073741824 -- GitLab From 80291602cf05440541e91bb913be0b02eb1e8d30 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 10 Jul 2025 12:12:53 +0530 Subject: [PATCH 1170/1310] Fix for 3GPP issue 1812: LTV assertion: Issue #1348 regression in +10dB decoder test Link #1812 Increased guard bits for stereo dft to avoid overflow --- lib_dec/ivas_cpe_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_cpe_dec_fx.c b/lib_dec/ivas_cpe_dec_fx.c index d4c041e97..6e29c2ac9 100644 --- a/lib_dec/ivas_cpe_dec_fx.c +++ b/lib_dec/ivas_cpe_dec_fx.c @@ -652,7 +652,7 @@ ivas_error ivas_cpe_dec_fx( IF( NE_16( shift, 31 ) ) { - shift = sub( add( hCPE->hStereoDft->q_dft, shift ), Q15 ); /* Q15 for guard bits */ + shift = sub( add( hCPE->hStereoDft->q_dft, shift ), Q16 ); /* Q16 for guard bits */ IF( GT_16( shift, hCPE->hStereoDft->q_dft ) ) { -- GitLab From 8909e61337f847fdf63cf529da7a99b6ee9af523 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 09:21:00 +0200 Subject: [PATCH 1171/1310] test getting the artifacts from ivas-pytest-compare_ref-long-enc --- .gitlab-ci.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9fc0b5e89..f1ca84740 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1645,16 +1645,18 @@ long-term-job-logs: script: - curl --request GET "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines" - #- id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) - #- echo "Job ID from variables - $CI_JOB_ID, Job ID from script - $id_previous" + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-pytest-compare_ref-long-enc $CI_PROJECT_ID) + - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" #- curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - #- unzip artifacts.zip -d previous_artifacts + - unzip artifacts.zip -d previous_artifacts # This wildcard thingy relies on only one csv file being present per job - #- file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" + - ivas-pytest-compare_ref-long-enc_csv="previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv" + - echo $ivas-pytest-compare_ref-long-enc_csv #- python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME - TODAY=$(date +'%Y-%m-%d') # create log if it doesn't exist - mkdir -p logs/$TODAY + - mv ivas-pytest-compare_ref-long-enc_csv logs/$TODAY - ls - ls logs -- GitLab From a59209c78adb7111e9e11e95d8d0154388102d3e Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 09:33:36 +0200 Subject: [PATCH 1172/1310] use anchor for long-term-job-.logs job --- .gitlab-ci.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f1ca84740..d9987e7b1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -293,6 +293,25 @@ workflow: - touch $MERGED_CSV_ARTIFACT_NAME - fi + # Aggregate job logs + - if [ $GET_LOGS -eq 1 ]; then + - curl --request GET "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines" + + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-pytest-compare_ref-long-enc $CI_PROJECT_ID) + - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" + #- curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip -d previous_artifacts + # This wildcard thingy relies on only one csv file being present per job + - ivas-pytest-compare_ref-long-enc_csv="previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv" + - echo $ivas-pytest-compare_ref-long-enc_csv + #- python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME + - TODAY=$(date +'%Y-%m-%d') + # create log if it doesn't exist + - mkdir -p logs/$TODAY + - mv ivas-pytest-compare_ref-long-enc_csv logs/$TODAY + - ls + - fi + - if [ $zero_errors != 1 ]; then - echo "Run errors encountered!" # TODO: temporary only to not fail MR pipelines on crashes @@ -1637,6 +1656,23 @@ voip-be-on-merge-request: - make -j >> /dev/null - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py + +ivas-long-term-job-logs: + extends: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job + tags: + - ivas-linux + timeout: "20 minutes" + stage: .pre + before_script: + - USE_LTV=1 + - DUT_DECODER_PATH=./$REF_DECODER_PATH + - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" + - LEVEL_SCALING=1.0 + - SPLIT_COMPARISON="false" + - GET_LOGS=1 + <<: *ivas-pytest-anchor + long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job -- GitLab From b4255d5dc6c7c71a830d305f86513f3747970fa0 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 09:35:57 +0200 Subject: [PATCH 1173/1310] fix syntax err --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d9987e7b1..87089e6d3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1658,7 +1658,7 @@ voip-be-on-merge-request: ivas-long-term-job-logs: - extends: + rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job tags: - ivas-linux -- GitLab From 92a8417c101de494f0292f35e8d99435c878db89 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 09:41:43 +0200 Subject: [PATCH 1174/1310] remove job from .pre stage --- .gitlab-ci.yml | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87089e6d3..50cee1d4d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -295,11 +295,10 @@ workflow: # Aggregate job logs - if [ $GET_LOGS -eq 1 ]; then - - curl --request GET "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines" - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-pytest-compare_ref-long-enc $CI_PROJECT_ID) - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" - #- curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts # This wildcard thingy relies on only one csv file being present per job - ivas-pytest-compare_ref-long-enc_csv="previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv" @@ -1662,8 +1661,6 @@ ivas-long-term-job-logs: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job tags: - ivas-linux - timeout: "20 minutes" - stage: .pre before_script: - USE_LTV=1 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1673,29 +1670,6 @@ ivas-long-term-job-logs: - GET_LOGS=1 <<: *ivas-pytest-anchor -long-term-job-logs: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job - stage: .pre - timeout: "20 minutes" - script: - - curl --request GET "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines" - - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-pytest-compare_ref-long-enc $CI_PROJECT_ID) - - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" - #- curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - - ivas-pytest-compare_ref-long-enc_csv="previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv" - - echo $ivas-pytest-compare_ref-long-enc_csv - #- python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME - - TODAY=$(date +'%Y-%m-%d') - # create log if it doesn't exist - - mkdir -p logs/$TODAY - - mv ivas-pytest-compare_ref-long-enc_csv logs/$TODAY - - ls - - ls logs - -- GitLab From a44322cc44d1ebd90f4801d8a1432b67bd46a816 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 09:57:46 +0200 Subject: [PATCH 1175/1310] remove job from anchor and to .pre stage --- .gitlab-ci.yml | 62 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 50cee1d4d..777364efa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1661,6 +1661,8 @@ ivas-long-term-job-logs: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job tags: - ivas-linux + stage: .pre + timeout: "20 minutes" before_script: - USE_LTV=1 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1668,7 +1670,65 @@ ivas-long-term-job-logs: - LEVEL_SCALING=1.0 - SPLIT_COMPARISON="false" - GET_LOGS=1 - <<: *ivas-pytest-anchor + variables: + # keep "mld" in artifact name for backwards compatibility reasons + CSV_ARTIFACT_NAME: "mld--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" + CSV_ARTIFACT_SPLIT: "mld--split--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" + MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" + PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" + SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" + SUMMARY_HTML_ARTIFACT_SPLIT: "summary_split_$CI_JOB_NAME.html" + IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" + IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" + script: + - !reference [ .job-linux, before_script ] + + - set -euxo pipefail + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - if [ $USE_LTV -eq 1 ]; then + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh + - testcase_timeout=$TESTCASE_TIMEOUT_LTV + - else + - testcase_timeout=$TESTCASE_TIMEOUT_STV + - fi + + # Aggregate job logs + - if [ $GET_LOGS -eq 1 ]; then + + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-pytest-compare_ref-long-enc $CI_PROJECT_ID) + - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" + - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip -d previous_artifacts + # This wildcard thingy relies on only one csv file being present per job + - ivas-pytest-compare_ref-long-enc_csv="previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv" + - echo $ivas-pytest-compare_ref-long-enc_csv + #- python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME + - TODAY=$(date +'%Y-%m-%d') + # create log if it doesn't exist + - mkdir -p logs/$TODAY + - mv ivas-pytest-compare_ref-long-enc_csv logs/$TODAY + - ls + - fi + - exit 0 + + allow_failure: + exit_codes: + - 123 + artifacts: + name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" + expire_in: 1 week + when: always + paths: + #- report-junit.xml + #- report.html + - logs + expose_as: "ivas long term job logs results" + #reports: + # junit: + # - report-junit.xml + -- GitLab From b0bdb717cde913e7b2df0b1d9349171d967b2f94 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 10:07:32 +0200 Subject: [PATCH 1176/1310] add missing $ --- .gitlab-ci.yml | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 777364efa..9b573bd6a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -293,24 +293,6 @@ workflow: - touch $MERGED_CSV_ARTIFACT_NAME - fi - # Aggregate job logs - - if [ $GET_LOGS -eq 1 ]; then - - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-pytest-compare_ref-long-enc $CI_PROJECT_ID) - - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - - ivas-pytest-compare_ref-long-enc_csv="previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv" - - echo $ivas-pytest-compare_ref-long-enc_csv - #- python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME - - TODAY=$(date +'%Y-%m-%d') - # create log if it doesn't exist - - mkdir -p logs/$TODAY - - mv ivas-pytest-compare_ref-long-enc_csv logs/$TODAY - - ls - - fi - - if [ $zero_errors != 1 ]; then - echo "Run errors encountered!" # TODO: temporary only to not fail MR pipelines on crashes @@ -1708,7 +1690,7 @@ ivas-long-term-job-logs: - TODAY=$(date +'%Y-%m-%d') # create log if it doesn't exist - mkdir -p logs/$TODAY - - mv ivas-pytest-compare_ref-long-enc_csv logs/$TODAY + - mv $ivas-pytest-compare_ref-long-enc_csv logs/$TODAY - ls - fi - exit 0 -- GitLab From c4e98f13ca70124936cb71143006b9d85bbfa63d Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 10:12:14 +0200 Subject: [PATCH 1177/1310] Update file .gitlab-ci.yml --- .gitlab-ci.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9b573bd6a..d8f3332e8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1683,14 +1683,11 @@ ivas-long-term-job-logs: - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - - ivas-pytest-compare_ref-long-enc_csv="previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv" - - echo $ivas-pytest-compare_ref-long-enc_csv - #- python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME - TODAY=$(date +'%Y-%m-%d') - # create log if it doesn't exist + # create logs dir if it doesn't exist - mkdir -p logs/$TODAY - - mv $ivas-pytest-compare_ref-long-enc_csv logs/$TODAY + # This wildcard thingy relies on only one csv file being present per job + - mv previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv logs/$TODAY - ls - fi - exit 0 -- GitLab From 4081cea23ff04534e074610453edc717323d4092 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 10:54:14 +0200 Subject: [PATCH 1178/1310] test getting logs for all relevant jobs --- .gitlab-ci.yml | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d8f3332e8..a550027f0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1677,19 +1677,21 @@ ivas-long-term-job-logs: - fi # Aggregate job logs - - if [ $GET_LOGS -eq 1 ]; then - - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-pytest-compare_ref-long-enc $CI_PROJECT_ID) - - echo "Job ID from variables - ivas-pytest-compare_ref-long-enc, Job ID from script - $id_previous" - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d previous_artifacts - - TODAY=$(date +'%Y-%m-%d') - # create logs dir if it doesn't exist - - mkdir -p logs/$TODAY - # This wildcard thingy relies on only one csv file being present per job - - mv previous_artifacts/mld--ivas-pytest-compare_ref-long-enc-$id_previous--sha-*.csv logs/$TODAY - - ls - - fi + - | + job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") + for job in "${job[@]}"; do + echo "Getting job logs for: $job" + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job" $CI_PROJECT_ID) + - echo "Job ID from variables - "$job", Job ID from script - $id_previous" + - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip -d previous_artifacts + - TODAY=$(date +'%Y-%m-%d') + # create logs dir if it doesn't exist + - mkdir -p logs/$TODAY + # This wildcard thingy relies on only one csv file being present per job + - mv previous_artifacts/mld--"$job"-$id_previous--sha-*.csv logs/$TODAY + done + - ls logs - exit 0 allow_failure: -- GitLab From fe1e1413c2532cb0bc22aa778653584ebc6276be Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 11:04:11 +0200 Subject: [PATCH 1179/1310] fix yaml syntax --- .gitlab-ci.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a550027f0..ffe70e261 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1679,17 +1679,19 @@ ivas-long-term-job-logs: # Aggregate job logs - | job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") - for job in "${job[@]}"; do + for job_name in "${job[@]}"; do echo "Getting job logs for: $job" - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job" $CI_PROJECT_ID) - - echo "Job ID from variables - "$job", Job ID from script - $id_previous" + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) + - echo "Job ID from variables - "$job_name", Job ID from script -d $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts - TODAY=$(date +'%Y-%m-%d') # create logs dir if it doesn't exist - mkdir -p logs/$TODAY # This wildcard thingy relies on only one csv file being present per job - - mv previous_artifacts/mld--"$job"-$id_previous--sha-*.csv logs/$TODAY + - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY + - rm artifacts.zip + - rm -r previous_artifacts done - ls logs - exit 0 -- GitLab From 08b51ee7d15dffdd6aa5500bfce3c707747e08a3 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 11:09:24 +0200 Subject: [PATCH 1180/1310] fix syntax error --- .gitlab-ci.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ffe70e261..d1893dbf6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1681,17 +1681,17 @@ ivas-long-term-job-logs: job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") for job_name in "${job[@]}"; do echo "Getting job logs for: $job" - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) - - echo "Job ID from variables - "$job_name", Job ID from script -d $id_previous" - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d previous_artifacts - - TODAY=$(date +'%Y-%m-%d') + id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) + echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + unzip artifacts.zip -d previous_artifacts + TODAY=$(date +'%Y-%m-%d') # create logs dir if it doesn't exist - - mkdir -p logs/$TODAY + mkdir -p logs/$TODAY # This wildcard thingy relies on only one csv file being present per job - - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY - - rm artifacts.zip - - rm -r previous_artifacts + mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY + rm artifacts.zip + rm -r previous_artifacts done - ls logs - exit 0 -- GitLab From 32acfa9a148e29b1eef60c7d1e58924d448bf4f8 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 11:21:04 +0200 Subject: [PATCH 1181/1310] cleanup --- .gitlab-ci.yml | 42 +++++++----------------------------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d1893dbf6..548dd6020 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1640,41 +1640,21 @@ voip-be-on-merge-request: ivas-long-term-job-logs: rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" # change this to a scheduled job + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" + - if: $CI_PIPELINE_SOURCE == 'schedule' tags: - ivas-linux stage: .pre - timeout: "20 minutes" - before_script: - - USE_LTV=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - SPLIT_COMPARISON="false" - - GET_LOGS=1 - variables: - # keep "mld" in artifact name for backwards compatibility reasons - CSV_ARTIFACT_NAME: "mld--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" - CSV_ARTIFACT_SPLIT: "mld--split--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" - MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" - PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" - SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" - SUMMARY_HTML_ARTIFACT_SPLIT: "summary_split_$CI_JOB_NAME.html" - IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" - IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" + timeout: "10 minutes" script: - - !reference [ .job-linux, before_script ] - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - if [ $USE_LTV -eq 1 ]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi + + # create logs dir if it doesn't exist + - TODAY=$(date +'%Y-%m-%d') + - mkdir -p logs/$TODAY # Aggregate job logs - | @@ -1685,9 +1665,6 @@ ivas-long-term-job-logs: echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip unzip artifacts.zip -d previous_artifacts - TODAY=$(date +'%Y-%m-%d') - # create logs dir if it doesn't exist - mkdir -p logs/$TODAY # This wildcard thingy relies on only one csv file being present per job mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY rm artifacts.zip @@ -1704,13 +1681,8 @@ ivas-long-term-job-logs: expire_in: 1 week when: always paths: - #- report-junit.xml - #- report.html - logs expose_as: "ivas long term job logs results" - #reports: - # junit: - # - report-junit.xml -- GitLab From 79020ccbfdcbd5a52a1e27dfe7a3138247c77bf8 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 11:27:54 +0200 Subject: [PATCH 1182/1310] add missing scripts --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 548dd6020..d6c55e359 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1651,6 +1651,8 @@ ivas-long-term-job-logs: - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh # create logs dir if it doesn't exist - TODAY=$(date +'%Y-%m-%d') -- GitLab From 7c871709590308efbfc82eeb73e12b66727e1f51 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 11:35:50 +0200 Subject: [PATCH 1183/1310] add missing !ireference --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d6c55e359..85d5f89b7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1647,7 +1647,7 @@ ivas-long-term-job-logs: stage: .pre timeout: "10 minutes" script: - + - !reference [ .job-linux, before_script ] - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh -- GitLab From 7099af40c170eacca4fe86b3794a57100e69f3ab Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 11:55:39 +0200 Subject: [PATCH 1184/1310] get previous logs from same job --- .gitlab-ci.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 85d5f89b7..248ca3714 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1658,6 +1658,15 @@ ivas-long-term-job-logs: - TODAY=$(date +'%Y-%m-%d') - mkdir -p logs/$TODAY + # Get previous logs of this job incase we are running on a different machine + - rm logs + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip -d logs + + - ls logs + # Aggregate job logs - | job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") -- GitLab From f668c0a83664df9f133437f08bbdb841704780f5 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 13:11:36 +0200 Subject: [PATCH 1185/1310] remove dir --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 248ca3714..0e888abfb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1659,7 +1659,7 @@ ivas-long-term-job-logs: - mkdir -p logs/$TODAY # Get previous logs of this job incase we are running on a different machine - - rm logs + - rm -r logs - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip -- GitLab From 913b344955374fe12b0550c9cec60571d71e37c4 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 13:21:22 +0200 Subject: [PATCH 1186/1310] increase timeout --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0e888abfb..a4d1bd5f6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1645,9 +1645,9 @@ ivas-long-term-job-logs: tags: - ivas-linux stage: .pre - timeout: "10 minutes" + timeout: "20 minutes" script: - - !reference [ .job-linux, before_script ] + - !reference [ before_script ] - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh -- GitLab From 879aa7049d5ad5285ac950f3c41f5ba75e655345 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 13:23:22 +0200 Subject: [PATCH 1187/1310] Update file .gitlab-ci.yml --- .gitlab-ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a4d1bd5f6..8ae2d1a4d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1642,12 +1642,10 @@ ivas-long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" - if: $CI_PIPELINE_SOURCE == 'schedule' - tags: - - ivas-linux stage: .pre timeout: "20 minutes" script: - - !reference [ before_script ] + - !reference [ .job-linux, before_script ] - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh -- GitLab From 06e002e4fe6e39974c2f546fb888380ef5dd3a9e Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 13:45:33 +0200 Subject: [PATCH 1188/1310] add tag: ivas-basop-linux --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8ae2d1a4d..bf04ea397 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1642,6 +1642,8 @@ ivas-long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" - if: $CI_PIPELINE_SOURCE == 'schedule' + tags: + - ivas-basop-linux stage: .pre timeout: "20 minutes" script: -- GitLab From c81b37149b8e560982771df26badf23f4d230783 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 13:50:40 +0200 Subject: [PATCH 1189/1310] Update file .gitlab-ci.yml --- .gitlab-ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bf04ea397..d28bf878e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1654,10 +1654,6 @@ ivas-long-term-job-logs: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - # create logs dir if it doesn't exist - - TODAY=$(date +'%Y-%m-%d') - - mkdir -p logs/$TODAY - # Get previous logs of this job incase we are running on a different machine - rm -r logs - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) @@ -1667,6 +1663,10 @@ ivas-long-term-job-logs: - ls logs + # create logs dir if it doesn't exist + - TODAY=$(date +'%Y-%m-%d') + - mkdir -p logs/$TODAY + # Aggregate job logs - | job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") @@ -1698,7 +1698,6 @@ ivas-long-term-job-logs: - # --------------------------------------------------------------- # Complexity measurement jobs # --------------------------------------------------------------- -- GitLab From 5601670a5e8df4683d16d0a478e164d1b2e662b8 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 13:54:10 +0200 Subject: [PATCH 1190/1310] fix syntax err --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d28bf878e..80cf582ba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1655,7 +1655,7 @@ ivas-long-term-job-logs: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh # Get previous logs of this job incase we are running on a different machine - - rm -r logs + - if [ -d "logs" ]; then rm -rf "logs"; fi - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip -- GitLab From b8541b1c844eda50cb5a3d9f70180b5b5535add7 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Thu, 10 Jul 2025 13:57:28 +0200 Subject: [PATCH 1191/1310] bug fix causing job not to be found --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 80cf582ba..1e5d3266d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1657,7 +1657,7 @@ ivas-long-term-job-logs: # Get previous logs of this job incase we are running on a different machine - if [ -d "logs" ]; then rm -rf "logs"; fi - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + - echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d logs -- GitLab From 1b8cb94b95a4238bd4cf61c35b642cbc39264dab Mon Sep 17 00:00:00 2001 From: kinuthia Date: Fri, 11 Jul 2025 10:06:40 +0200 Subject: [PATCH 1192/1310] handle case when job is running for the first time --- .gitlab-ci.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1e5d3266d..2c190366b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1645,7 +1645,7 @@ ivas-long-term-job-logs: tags: - ivas-basop-linux stage: .pre - timeout: "20 minutes" + timeout: "25 minutes" script: - !reference [ .job-linux, before_script ] - set -euxo pipefail @@ -1656,10 +1656,16 @@ ivas-long-term-job-logs: # Get previous logs of this job incase we are running on a different machine - if [ -d "logs" ]; then rm -rf "logs"; fi + # TODO add variable to inject logs from backup copy + + # handle case where the job is running for the first time. e.g where the job was not found. - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d logs + - + - if [ "$id_previous" != "-1" ]; then + - unzip artifacts.zip -d logs + - fi - ls logs @@ -1689,7 +1695,7 @@ ivas-long-term-job-logs: - 123 artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week + expire_in: 4 weeks when: always paths: - logs -- GitLab From 836bdf5093bec7a78f0c6af3f53dfa36fcc45c13 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Fri, 11 Jul 2025 10:12:14 +0200 Subject: [PATCH 1193/1310] correct formatting --- .gitlab-ci.yml | 68 +++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2c190366b..79a8a62d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1646,49 +1646,49 @@ ivas-long-term-job-logs: - ivas-basop-linux stage: .pre timeout: "25 minutes" - script: - - !reference [ .job-linux, before_script ] - - set -euxo pipefail - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh + script: | + !reference [ .job-linux, before_script ] + set -euxo pipefail + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh # Get previous logs of this job incase we are running on a different machine - - if [ -d "logs" ]; then rm -rf "logs"; fi + if [ -d "logs" ]; then rm -rf "logs"; fi # TODO add variable to inject logs from backup copy # handle case where the job is running for the first time. e.g where the job was not found. - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - - echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - - - if [ "$id_previous" != "-1" ]; then - - unzip artifacts.zip -d logs - - fi + id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" + curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + + if [ "$id_previous" != "-1" ]; then + unzip artifacts.zip -d logs + fi - - ls logs + ls logs - # create logs dir if it doesn't exist - - TODAY=$(date +'%Y-%m-%d') - - mkdir -p logs/$TODAY + # create logs dir if it doesn't exist + TODAY=$(date +'%Y-%m-%d') + mkdir -p logs/$TODAY # Aggregate job logs - - | - job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") - for job_name in "${job[@]}"; do - echo "Getting job logs for: $job" - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY - rm artifacts.zip - rm -r previous_artifacts - done - - ls logs - - exit 0 + + job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") + for job_name in "${job[@]}"; do + echo "Getting job logs for: $job" + id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) + echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + unzip artifacts.zip -d previous_artifacts + # This wildcard thingy relies on only one csv file being present per job + mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY + rm artifacts.zip + rm -r previous_artifacts + done + ls logs + exit 0 allow_failure: exit_codes: -- GitLab From 624f2269a1dd6a3e4f2948771f547b039d3073ee Mon Sep 17 00:00:00 2001 From: kinuthia Date: Fri, 11 Jul 2025 10:15:52 +0200 Subject: [PATCH 1194/1310] fix syntax --- .gitlab-ci.yml | 85 +++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 79a8a62d6..e70b75be9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1646,49 +1646,50 @@ ivas-long-term-job-logs: - ivas-basop-linux stage: .pre timeout: "25 minutes" - script: | - !reference [ .job-linux, before_script ] - set -euxo pipefail - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - # Get previous logs of this job incase we are running on a different machine - if [ -d "logs" ]; then rm -rf "logs"; fi - # TODO add variable to inject logs from backup copy - - # handle case where the job is running for the first time. e.g where the job was not found. - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - if [ "$id_previous" != "-1" ]; then - unzip artifacts.zip -d logs - fi - - ls logs - - # create logs dir if it doesn't exist - TODAY=$(date +'%Y-%m-%d') - mkdir -p logs/$TODAY - - # Aggregate job logs - - job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") - for job_name in "${job[@]}"; do - echo "Getting job logs for: $job" - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + script: + - !reference [ .job-linux, before_script ] + - | + set -euxo pipefail + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh + + # Get previous logs of this job incase we are running on a different machine + if [ -d "logs" ]; then rm -rf "logs"; fi + # TODO add variable to inject logs from backup copy + + # handle case where the job is running for the first time. e.g where the job was not found. + id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY - rm artifacts.zip - rm -r previous_artifacts - done - ls logs - exit 0 + + if [ "$id_previous" != "-1" ]; then + unzip artifacts.zip -d logs + fi + + ls logs + + # create logs dir if it doesn't exist + TODAY=$(date +'%Y-%m-%d') + mkdir -p logs/$TODAY + + # Aggregate job logs + + job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") + for job_name in "${job[@]}"; do + echo "Getting job logs for: $job" + id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) + echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + unzip artifacts.zip -d previous_artifacts + # This wildcard thingy relies on only one csv file being present per job + mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY + rm artifacts.zip + rm -r previous_artifacts + done + ls logs + exit 0 allow_failure: exit_codes: -- GitLab From 6e5b690fca8649c9702c320c3d96c1b60359b546 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Fri, 11 Jul 2025 10:26:48 +0200 Subject: [PATCH 1195/1310] Update file .gitlab-ci.yml --- .gitlab-ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e70b75be9..173d604fc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1668,8 +1668,6 @@ ivas-long-term-job-logs: unzip artifacts.zip -d logs fi - ls logs - # create logs dir if it doesn't exist TODAY=$(date +'%Y-%m-%d') mkdir -p logs/$TODAY -- GitLab From bf63482dd045da53b37ec8ada669d9f65400e0d8 Mon Sep 17 00:00:00 2001 From: kinuthia Date: Fri, 11 Jul 2025 10:42:48 +0200 Subject: [PATCH 1196/1310] require MANUAL_PIPELINE_TYPE to be set when running scheduled job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 173d604fc..7a0c0f324 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1641,7 +1641,7 @@ voip-be-on-merge-request: ivas-long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" - - if: $CI_PIPELINE_SOURCE == 'schedule' + - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "long-term-logs" tags: - ivas-basop-linux stage: .pre -- GitLab From 9daf8e10191a7e445d3fe6e60b9240a665846aa1 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 11 Jul 2025 10:52:47 +0200 Subject: [PATCH 1197/1310] replace i_mult_o() --- lib_com/options.h | 8 ++++++++ lib_dec/swb_tbe_dec_fx.c | 10 +++++++++- lib_enc/swb_tbe_enc_fx.c | 12 ++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0cf958d03..c555d9cff 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -120,6 +120,14 @@ #define FIX_1735_W_SHL_SAT_L /* FhG: Usage of W_shl_sat_l() */ #define FIX_ISSUE_1792 /* FhG: fix noise bursts in binaural rendering */ +/* Info for issue 1816: + * Some compilers do not automatically use 32 bit for 16x16bit products. The code "Word32 c = (Word16) a * (Word16) b;" creates then a 16-bit result, sign-extending the + * lower 16-bit of the product, any upper bits are omitted. Example: Product 0x0100 * 0x0100 results in 0x0001.0000, gets truncated to its lower bits and return 0x0000. + * The issue is fixed by simply casting one of the product operands to Word32 in lib_com/basop32.c + */ +#define FIX_ISSUE_1816_USE_W32_FOR_MPY_W16xW16 /* FhG: (QA-FIX) Use doubled data width for 16x16 product, some compilers keep 16-bit format also for products */ +#define FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION /* FhG: (NON-BE) improve precision of multiplications with factor 0.1f, avoids overflow with up-rounded value */ + #define FIX_ISSUE_1795_Q3_OVERFLOW /* FhG: Q3 overflow in function WB_BWE_gain_pred_fx (EVS legacy code) BE, MR1855 */ #define NONBE_FIX_1748_SPAR_DIV_OPT /*Dlb: issue 1748: SPAR common div optimizations*/ diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 61dc3d0c5..35655a74b 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -2725,7 +2725,11 @@ void swb_tbe_dec_fx( } FOR( ; i < L_SHB_LAHEAD + 10; i++ ) { +#ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION + temp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); +#else temp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ +#endif L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp ); /* Q31-exp */ temp = sub( 32767 /*1.0f Q15*/, temp ); Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); @@ -6287,7 +6291,11 @@ void ivas_swb_tbe_dec_fx( } FOR( ; i < L_SHB_LAHEAD + 10; i++ ) { - temp_fx = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ +#ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION + temp_fx = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); +#else + temp_fx = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ +#endif L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp_fx ); /* Q31-exp */ temp_fx = sub( 32767 /*1.0f Q15*/, temp_fx ); Lscale = L_add( Mult_32_16( Lscale, temp_fx ), L_tmp1 ); diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index d016cd721..611a3625e 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -2537,7 +2537,11 @@ void swb_tbe_enc_fx( } FOR( ; i < L_SHB_LAHEAD + 10; i++ ) { - tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ +#ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION + tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); +#else + tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ +#endif L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ tmp = sub( 32767 /*1.0f Q15*/, tmp ); Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); @@ -3833,7 +3837,11 @@ void swb_tbe_enc_ivas_fx( } FOR( ; i < L_SHB_LAHEAD + 10; i++ ) { - tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ +#ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION + tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); +#else + tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ +#endif L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ tmp = sub( 32767 /*1.0f Q15*/, tmp ); L_tmp = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); -- GitLab From 4e41d8e1319d341278c61a9488c756d689f38a0c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Jul 2025 15:07:03 +0530 Subject: [PATCH 1198/1310] Multi channel bit-exact optimizations - 3 Residu3_fx, dotp_fixed_32, SQ_gain_estimate_stereo_fx, dotp_fixed_o, IGF_getCrest_new_fx updated. Around 4 WMOPs reduction observed --- lib_com/options.h | 1 + lib_com/residu_fx.c | 2 +- lib_com/tools.c | 8 ++++++++ lib_enc/igf_enc.c | 2 +- lib_enc/ivas_stereo_mdct_stereo_enc_fx.c | 22 ++++++++++++++++++++-- 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0cf958d03..23d8ca6d1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,6 +79,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_MCT_ENC_V2_BE #define OPT_MCH_DEC_V1_NBE #define OPT_MCT_ENC_48KB_NBE #define OPT_MCH_DEC_V1_BE diff --git a/lib_com/residu_fx.c b/lib_com/residu_fx.c index 32d18d1fe..91d0ee30a 100644 --- a/lib_com/residu_fx.c +++ b/lib_com/residu_fx.c @@ -156,7 +156,7 @@ void Residu3_fx( move16(); #endif q = add( norm_s( a[0] ), 1 ); - IF( shift != 0 ) + if ( shift != 0 ) { q = add( q, shift ); } diff --git a/lib_com/tools.c b/lib_com/tools.c index 3cf11ea92..0087920cd 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -688,7 +688,11 @@ Word32 dotp_fixed_o( move16(); test(); test(); +#ifdef OPT_MCT_ENC_V2_BE + FOR( ; ( suma > MAX_32 ) || ( suma < MIN_32 ) || ( *res_q > 31 ); ) +#else WHILE( GT_64( suma, MAX_32 ) || LT_64( suma, MIN_32 ) || GT_16( *res_q, 31 ) ) +#endif { suma = W_shr( suma, 1 ); *res_q = sub( *res_q, 1 ); @@ -718,7 +722,11 @@ Word32 dotp_fixed_32( move16(); test(); test(); +#ifdef OPT_MCT_ENC_V2_BE + FOR( ; ( suma > MAX_32 ) || ( suma < MIN_32 ) || ( *res_q > 31 ); ) +#else WHILE( GT_64( suma, MAX_32 ) || LT_64( suma, MIN_32 ) || GT_16( *res_q, 31 ) ) +#endif { suma = W_shr( suma, 1 ); *res_q = sub( *res_q, 1 ); diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index fe1ba10c1..7da9fa6cf 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -137,7 +137,7 @@ static Word16 IGF_getCrest_new_fx( move16(); x_eff = L_add( x_eff, L_mult0( x, x ) ); - IF( GT_16( x, x_max ) ) + if ( GT_16( x, x_max ) ) { x_max = x; move16(); diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c index 2f1b7d6c8..f7735e8df 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc_fx.c @@ -882,7 +882,7 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res move32(); en_fx[q] = Mpy_32_16_1( L_add( L_shl( e_ener, Q25 ), en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) move32(); - i = add( i, 4 ); + i += 4; } i = 0; move16(); @@ -901,7 +901,7 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res move32(); en_fx[q] = Mpy_32_16_1( L_add( L_shl( e_ener, Q25 ), en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25) move32(); - i = add( i, 4 ); + i += 4; } /* SQ scale: 4 bits / 6 dB per quadruple */ @@ -911,6 +911,9 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res offset_fx = fac_fx; /* Q25 */ move32(); +#ifdef OPT_MCT_ENC_V2_BE + Word64 target_64_fx = W_shl( target_fx, 7 ); // Q25 +#endif /* find offset (0 to 128 dB with step of 0.125dB) */ FOR( iter = 0; iter < 10; iter++ ) { @@ -923,6 +926,20 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res { tmp_32 = L_sub( en_fx[i], offset_fx ); /* Q25 */ +#ifdef OPT_MCT_ENC_V2_BE + /* avoid SV with 1 bin of amp < 0.5f */ + if ( GT_32( tmp_32, 10066329 /*0.3 Q25*/ ) ) + { + W_tmp = W_add( W_tmp, tmp_32 ); /* Q25 */ + } + /* if ener is above target -> break and increase offset */ + IF( GT_64( W_tmp, target_64_fx ) ) + { + offset_fx = L_add( offset_fx, fac_fx ); /* Q25 */ + BREAK; + } +#else + /* avoid SV with 1 bin of amp < 0.5f */ IF( GT_32( tmp_32, 10066329 /*0.3 Q25*/ ) ) { @@ -935,6 +952,7 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res BREAK; } } +#endif } } -- GitLab From f3d2893fb20c3647145cb288dfabd3e0945d6f69 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Fri, 11 Jul 2025 12:09:51 +0200 Subject: [PATCH 1199/1310] keep EVS BE --- lib_dec/swb_tbe_dec_fx.c | 76 ++++++++++++++++++++++++++++++++++----- lib_enc/swb_tbe_enc_fx.c | 78 ++++++++++++++++++++++++++++++++++------ 2 files changed, 135 insertions(+), 19 deletions(-) diff --git a/lib_dec/swb_tbe_dec_fx.c b/lib_dec/swb_tbe_dec_fx.c index 35655a74b..3ed08633c 100644 --- a/lib_dec/swb_tbe_dec_fx.c +++ b/lib_dec/swb_tbe_dec_fx.c @@ -2723,13 +2723,41 @@ void swb_tbe_dec_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) - { #ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION - temp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp ); /* Q31-exp */ + temp = sub( 32767 /*1.0f Q15*/, temp ); + Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp ); /* Q31-exp */ + temp = sub( 32767 /*1.0f Q15*/, temp ); + Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } #else + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { temp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ -#endif L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp ); /* Q31-exp */ temp = sub( 32767 /*1.0f Q15*/, temp ); Lscale = L_add( Mult_32_16( Lscale, temp ), L_tmp1 ); @@ -2737,6 +2765,7 @@ void swb_tbe_dec_fx( shaped_shb_excitation[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */ move16(); } +#endif /* Update SHB excitation */ Copy( shaped_shb_excitation + L_FRAME16k, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD ); /* Q_bwe_exc */ @@ -6289,13 +6318,41 @@ void ivas_swb_tbe_dec_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) - { #ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION - temp_fx = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st->element_mode, EVS_MONO ) ) + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp_fx = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp_fx ); /* Q31-exp */ + temp_fx = sub( 32767 /*1.0f Q15*/, temp_fx ); + Lscale = L_add( Mult_32_16( Lscale, temp_fx ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp_fx = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp_fx ); /* Q31-exp */ + temp_fx = sub( 32767 /*1.0f Q15*/, temp_fx ); + Lscale = L_add( Mult_32_16( Lscale, temp_fx ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ + move16(); + } + } #else - temp_fx = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ -#endif + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp_fx = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ L_tmp1 = Mult_32_16( L_shl_sat( 1, sub( 31, exp ) ), temp_fx ); /* Q31-exp */ temp_fx = sub( 32767 /*1.0f Q15*/, temp_fx ); Lscale = L_add( Mult_32_16( Lscale, temp_fx ), L_tmp1 ); @@ -6303,6 +6360,7 @@ void ivas_swb_tbe_dec_fx( shaped_shb_excitation_fx[i] = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /* Q_bwe_exc */ move16(); } +#endif } ELSE { diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 611a3625e..e1bbd3e19 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -2535,13 +2535,41 @@ void swb_tbe_enc_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) - { #ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION - tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( Lscale, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ + move16(); + } + } #else - tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ -#endif + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ tmp = sub( 32767 /*1.0f Q15*/, tmp ); Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); @@ -2549,6 +2577,7 @@ void swb_tbe_enc_fx( shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ move16(); } +#endif /* Update SHB excitation */ Copy( shaped_shb_excitation_fx + L_FRAME16k, hBWE_TD->state_syn_shbexc_fx, L_SHB_LAHEAD ); /* Q_bwe_exc */ @@ -3835,13 +3864,41 @@ void swb_tbe_enc_ivas_fx( exp = 0; move16(); } - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) - { #ifdef FIX_ISSUE_1816_IMPROVE_MPY_ZERO_DOT_1_PRECISION - tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + /* + code for EVS and IVAS are basically identical with the exception of i_mult_sat() which has precision issues + thus is was replaced for IVAS and kept for EVS, in order to keep EVS BE to test sequences and legacy implementations + */ + IF( EQ_16( st_fx->element_mode, EVS_MONO ) ) + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = i_mult_sat( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */ + L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + L_tmp = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( L_tmp, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ + move16(); + } + } + ELSE + { + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = round_fx_sat( L_shl( L_mult( 0x6666 /* 0.1 in Q12 */, shl( sub( i, 19 ), 11 ) ), 1 ) ); + L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ + tmp = sub( 32767 /*1.0f Q15*/, tmp ); + L_tmp = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); + L_tmp = Mult_32_16( L_tmp, shaped_shb_excitation_fx[i] ); /* Q_bwe_exc + (31-exp) - 15 */ + shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ + move16(); + } + } #else - tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ -#endif + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */ L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */ tmp = sub( 32767 /*1.0f Q15*/, tmp ); L_tmp = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 ); @@ -3849,6 +3906,7 @@ void swb_tbe_enc_ivas_fx( shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */ move16(); } +#endif } ELSE { -- GitLab From 6c5ed9f1374b32878c9048594128b303e15f959a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Jul 2025 16:13:03 +0530 Subject: [PATCH 1200/1310] Optimization in ISM Dec path - Non bit exact --- lib_com/options.h | 1 + lib_rend/ivas_objectRenderer_hrFilt_fx.c | 121 ++++++++++++++++++++++- lib_rend/ivas_objectRenderer_sfx_fx.c | 46 ++++++++- 3 files changed, 163 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 23d8ca6d1..21d976fac 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,6 +81,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V2_BE #define OPT_MCH_DEC_V1_NBE +#define OPT_MASA_DEC_V1_NBE #define OPT_MCT_ENC_48KB_NBE #define OPT_MCH_DEC_V1_BE #define OPT_MCT_ENC_V2_NBE diff --git a/lib_rend/ivas_objectRenderer_hrFilt_fx.c b/lib_rend/ivas_objectRenderer_hrFilt_fx.c index a098aaa25..c5689b364 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt_fx.c +++ b/lib_rend/ivas_objectRenderer_hrFilt_fx.c @@ -193,7 +193,6 @@ static void GenerateFilter_fx( ) { Word16 qp, p, k, i; - Word32 index; Word16 AzIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS][HRTF_MODEL_BSPLINE_NUM_COEFFS], EvIdx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; /* non-zero basis functions */ Word16 num_az_idx[HRTF_MODEL_BSPLINE_NUM_COEFFS]; Word16 num_ev_idx; @@ -255,6 +254,16 @@ static void GenerateFilter_fx( move16(); FOR( p = 0; p < num_ev_idx; p++ ) { +#ifdef OPT_MASA_DEC_V1_NBE + Word32 expt = L_shl_sat( modelEval->elevBfVec_fx[p], 1 ); + FOR( i = 0; i < num_az_idx[p]; i++ ) + { + modelEval->BM_fx[qp + i] = Mpy_32_32( expt, modelEval->azimBfVec_fx[p][i] ); /*Q30 - ( Q30 * 2 - 31 )*/ // Q30 + move32(); + BM_idx[qp + i] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); + move16(); + } +#else /* OPT_MASA_DEC_V1_NBE */ FOR( i = 0; i < num_az_idx[p]; i++ ) { modelEval->BM_fx[add( qp, i )] = L_shl( Mpy_32_32( modelEval->elevBfVec_fx[p], modelEval->azimBfVec_fx[p][i] ), 1 ); /*Q30 - ( Q30 * 2 - 31 )*/ // Q30 @@ -262,12 +271,21 @@ static void GenerateFilter_fx( BM_idx[add( qp, i )] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); move16(); } +#endif /* OPT_MASA_DEC_V1_NBE */ qp = add( qp, num_az_idx[p] ); } +#ifdef OPT_MASA_DEC_V1_NBE + Word16 expL = add( model->AlphaL_e, 1 ); + Word16 expR = add( model->AlphaR_e, 1 ); + BMEnergiesL_e = add( model->EL_e, 2 ); + BMEnergiesR_e = add( model->ER_e, 2 ); +#endif /* OPT_MASA_DEC_V1_NBE */ + /* Compute HR filters, approximate optimized model evaluation */ FOR( iSec = 0; iSec < HRTF_MODEL_N_SECTIONS; iSec++ ) { +#ifndef OPT_MASA_DEC_V1_NBE ETotL = 0; move32(); ETotR = 0; @@ -288,45 +306,102 @@ static void GenerateFilter_fx( BMEnergiesL_e = add( model->EL_e, 2 ); BMEnergiesR_e = add( model->ER_e, 2 ); +#else /* OPT_MASA_DEC_V1_NBE */ + Word64 temp1 = 0; + move64(); + Word64 temp2 = 0; + move64(); +#endif /* OPT_MASA_DEC_V1_NBE */ /* Energy is precalculated part updated with square of BM value. Store index for sorting */ FOR( i = 0; i < qp; i++ ) { +#ifdef OPT_MASA_DEC_V1_NBE + modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->EL_e + 2 + modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->ER_e + 2 +#else /* OPT_MASA_DEC_V1_NBE */ modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->EL_e + 2 modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->ER_e + 2 +#endif /* OPT_MASA_DEC_V1_NBE */ move32(); move32(); modelEval->BMEnergiesL[i].i = i; move16(); modelEval->BMEnergiesR[i].i = i; move16(); - +#ifndef OPT_MASA_DEC_V1_NBE ETotL = BASOP_Util_Add_Mant32Exp( ETotL, ETotL_e, modelEval->BMEnergiesL[i].val_fx, BMEnergiesL_e, &ETotL_e ); ETotR = BASOP_Util_Add_Mant32Exp( ETotR, ETotR_e, modelEval->BMEnergiesR[i].val_fx, BMEnergiesR_e, &ETotR_e ); +#else /* OPT_MASA_DEC_V1_NBE */ + temp1 = W_add( temp1, modelEval->BMEnergiesL[i].val_fx ); // BMEnergiesL_e + temp2 = W_add( temp2, modelEval->BMEnergiesR[i].val_fx ); // BMEnergiesR_e +#endif /* OPT_MASA_DEC_V1_NBE */ } +#ifdef OPT_MASA_DEC_V1_NBE + ETotL_e = W_norm( temp1 ); + ETotL_e = sub( ETotL_e, 32 ); + ETotL = W_shl_sat_l( temp1, ETotL_e ); + ETotL_e = sub( BMEnergiesL_e, ETotL_e ); + + ETotR_e = W_norm( temp2 ); + ETotR_e = sub( ETotR_e, 32 ); + ETotR = W_shl_sat_l( temp2, ETotR_e ); + ETotR_e = sub( BMEnergiesR_e, ETotR_e ); +#endif /* OPT_MASA_DEC_V1_NBE */ /* Number of basis components actually used. */ p = s_min( HRTF_MODEL_N_CPTS_VAR[iSec], qp ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsL, modelEval->BMEnergiesL, qp, sub( qp, p ) ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsR, modelEval->BMEnergiesR, qp, sub( qp, p ) ); +#ifndef OPT_MASA_DEC_V1_NBE /* Account for lost energy */ FOR( i = 0; i < p; i++ ) { ESynL = BASOP_Util_Add_Mant32Exp( ESynL, ESynL_e, modelEval->BMEnergiesL[modelEval->UseIndsL[i]].val_fx, BMEnergiesL_e, &ESynL_e ); ESynR = BASOP_Util_Add_Mant32Exp( ESynR, ESynR_e, modelEval->BMEnergiesR[modelEval->UseIndsR[i]].val_fx, BMEnergiesR_e, &ESynR_e ); } +#else /* OPT_MASA_DEC_V1_NBE */ + temp1 = 0; + move64(); + temp2 = 0; + move64(); + + /* Account for lost energy */ + FOR( i = 0; i < p; i++ ) + { + temp1 = W_add( temp1, modelEval->BMEnergiesL[modelEval->UseIndsL[i]].val_fx ); // BMEnergiesL_e + temp2 = W_add( temp2, modelEval->BMEnergiesR[modelEval->UseIndsR[i]].val_fx ); // BMEnergiesR_e + } + ESynL_e = W_norm( temp1 ); + ESynL_e = sub( ESynL_e, 32 ); + ESynL = W_shl_sat_l( temp1, ESynL_e ); + ESynL_e = sub( BMEnergiesL_e, ESynL_e ); + + ESynR_e = W_norm( temp2 ); + ESynR_e = sub( ESynR_e, 32 ); + ESynR = W_shl_sat_l( temp2, ESynR_e ); + ESynR_e = sub( BMEnergiesR_e, ESynR_e ); + +#endif /* OPT_MASA_DEC_V1_NBE */ tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotL, ESynL, &ScaleL_e ) ); ScaleL_e = add( ScaleL_e, sub( ETotL_e, ESynL_e ) ); ScaleL = Sqrt32( tmp32, &ScaleL_e ); +#ifdef OPT_MASA_DEC_V1_NBE + ScaleL_e = sub( ScaleL_e, 1 ); +#endif /* OPT_MASA_DEC_V1_NBE */ tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotR, ESynR, &ScaleR_e ) ); ScaleR_e = add( ScaleR_e, sub( ETotR_e, ESynR_e ) ); ScaleR = Sqrt32( tmp32, &ScaleR_e ); +#ifdef OPT_MASA_DEC_V1_NBE + ScaleR_e = sub( ScaleR_e, 1 ); +#endif /* OPT_MASA_DEC_V1_NBE */ /* Build using only the most energetic components. */ FOR( k = model->iSecFirst[iSec]; k <= model->iSecLast[iSec]; k++ ) { +#ifndef OPT_MASA_DEC_V1_NBE modelEval->hrfModL_fx[k] = 0; move32(); modelEval->hrfModR_fx[k] = 0; @@ -337,6 +412,7 @@ static void GenerateFilter_fx( tmp_hrfModR_e = 0; move16(); + Word32 index; FOR( i = 0; i < p; i++ ) { index = L_add( BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], imult3216( model->AlphaN, k ) ); @@ -348,6 +424,42 @@ static void GenerateFilter_fx( modelEval->hrfModR_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModR_fx[k], tmp_hrfModR_e, tmp32, add( model->AlphaR_e, 1 ), &tmp_hrfModR_e ); move32(); } +#else /* OPT_MASA_DEC_V1_NBE */ + temp1 = 0; + move64(); + temp2 = 0; + move64(); + + FOR( i = 0; i < p; i++ ) + { + temp1 = W_add( temp1, Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaL_e, 1) + temp2 = W_add( temp2, Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i] + ( model->AlphaN * k )] ) ); // add(model->AlphaR_e, 1) + } + + tmp_hrfModL_e = W_norm( temp1 ); + tmp_hrfModL_e = sub( tmp_hrfModL_e, 32 ); + modelEval->hrfModL_fx[k] = W_shl_sat_l( temp1, tmp_hrfModL_e ); + move32(); + tmp_hrfModL_e = sub( expL, tmp_hrfModL_e ); + if ( temp1 == 0 ) + { + tmp_hrfModL_e = 0; + move16(); + } + + tmp_hrfModR_e = W_norm( temp2 ); + tmp_hrfModR_e = sub( tmp_hrfModR_e, 32 ); + modelEval->hrfModR_fx[k] = W_shl_sat_l( temp2, tmp_hrfModR_e ); + move32(); + tmp_hrfModR_e = sub( expR, tmp_hrfModR_e ); + + if ( temp2 == 0 ) + { + tmp_hrfModR_e = 0; + move16(); + } + +#endif /* OPT_MASA_DEC_V1_NBE */ /* Account for lost energy */ modelEval->hrfModL_fx[k] = Mpy_32_32( modelEval->hrfModL_fx[k], ScaleL ); move32(); @@ -355,8 +467,13 @@ static void GenerateFilter_fx( move32(); /* NOTE: Assuming that finally, hrfMod values will be <= 1. Hence making it Q30 */ +#ifdef OPT_MASA_DEC_V1_NBE + modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], add( tmp_hrfModL_e, ScaleL_e ) ); // assuming Q30 + modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], add( tmp_hrfModR_e, ScaleR_e ) ); // assuming Q30 +#else /* OPT_MASA_DEC_V1_NBE */ modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], sub( add( tmp_hrfModL_e, ScaleL_e ), 1 ) ); // assuming Q30 modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], sub( add( tmp_hrfModR_e, ScaleR_e ), 1 ) ); // assuming Q30 +#endif /* OPT_MASA_DEC_V1_NBE */ // move32(); move32(); } diff --git a/lib_rend/ivas_objectRenderer_sfx_fx.c b/lib_rend/ivas_objectRenderer_sfx_fx.c index a570273cf..ef5fa93e4 100644 --- a/lib_rend/ivas_objectRenderer_sfx_fx.c +++ b/lib_rend/ivas_objectRenderer_sfx_fx.c @@ -292,7 +292,9 @@ void TDREND_firfilt_fx( Word32 step_fx /* Q31 */, gain_tmp_fx /* Q31 */, gain_delta_fx /* Q30 */; Word16 tmp_e; Word64 tmp64_fx; - +#ifdef OPT_MASA_DEC_V1_NBE + Word16 shift = sub( filter_e, 32 ); +#endif /* OPT_MASA_DEC_V1_NBE */ gain_delta_fx = L_sub( Gain_fx, prevGain_fx ); // Q30 step_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( gain_delta_fx, subframe_length, &tmp_e ) ); // exp(tmp_e) tmp_e = sub( tmp_e, Q30 ); @@ -306,12 +308,18 @@ void TDREND_firfilt_fx( Copy32( signal_fx + add( sub( subframe_length, filterlength ), 1 ), mem_fx, sub( filterlength, 1 ) ); /* Update memory for next frame */ // Qx /* Convolution */ +#ifdef OPT_MASA_DEC_V1_NBE + FOR( i = 0; i < intp_count; i++ ) +#else /* OPT_MASA_DEC_V1_NBE */ FOR( i = 0; i < subframe_length; i++ ) +#endif /* OPT_MASA_DEC_V1_NBE */ { tmp64_fx = 0; move64(); +#ifndef OPT_MASA_DEC_V1_NBE tmp_e = 0; move16(); +#endif /* OPT_MASA_DEC_V1_NBE */ p_tmp_fx = p_signal_fx + i; // Qx p_filter_fx = filter_fx; // exp(filter_e) @@ -324,18 +332,50 @@ void TDREND_firfilt_fx( } // This is done to keep the output Q same as input Q for signal - tmp64_fx = W_shl( tmp64_fx, filter_e ); // Qx + 32 - tmp_fx = W_extract_h( tmp64_fx ); // Qx +#ifdef OPT_MASA_DEC_V1_NBE + tmp_fx = W_shl_sat_l( tmp64_fx, shift ); // Qx +#else /* OPT_MASA_DEC_V1_NBE */ + tmp64_fx = W_shl( tmp64_fx, filter_e ); // Qx + 32 + tmp_fx = W_extract_h( tmp64_fx ); // Qx +#endif /* OPT_MASA_DEC_V1_NBE */ /* Apply linear gain interpolation in case of abrupt gain changes */ gain_tmp_fx = L_add_sat( gain_tmp_fx, step_fx ); /* Saturating values which just exceeds 1, Q31*/ signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx move32(); +#ifndef OPT_MASA_DEC_V1_NBE IF( LT_16( i, intp_count ) ) { v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) } } +#else /* OPT_MASA_DEC_V1_NBE */ + v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) + } + FOR( ; i < subframe_length; i++ ) + { + tmp64_fx = 0; + move64(); + p_tmp_fx = p_signal_fx + i; // Qx + p_filter_fx = filter_fx; // exp(filter_e) + + + FOR( j = 0; j < filterlength; j++ ) + { + tmp64_fx = W_mac_32_32( tmp64_fx, *p_filter_fx, *p_tmp_fx ); // Qx + (Q31 - filter_e) + 1 + p_filter_fx++; // exp(filter_e) + p_tmp_fx--; // Qx + } + + // This is done to keep the output Q same as input Q for signal + tmp_fx = W_shl_sat_l( tmp64_fx, shift ); // Qx + + /* Apply linear gain interpolation in case of abrupt gain changes */ + gain_tmp_fx = L_add_sat( gain_tmp_fx, step_fx ); /* Saturating values which just exceeds 1, Q31*/ + signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx + move32(); + } +#endif /* OPT_MASA_DEC_V1_NBE */ return; } -- GitLab From 4f5b522bf36eb791640ccc2043cb35f661cf768d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Jul 2025 16:17:50 +0530 Subject: [PATCH 1201/1310] 3GPP issue 1787: Improved precision to align direction index with reference Link #1787 --- lib_rend/ivas_dirac_ana_fx.c | 13 +++++---- lib_rend/ivas_mcmasa_ana_fx.c | 17 ++++++------ lib_rend/ivas_omasa_ana_fx.c | 50 +++++++++++++++++------------------ lib_rend/ivas_prot_rend_fx.h | 12 +++++---- 4 files changed, 47 insertions(+), 45 deletions(-) diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 5f0f8a3a4..41b3fecd3 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -415,8 +415,7 @@ static void ivas_dirac_param_est_ana_fx( computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q ); /* Power estimation for diffuseness */ - computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); //( 2 * ( scale_fact - Q1 ) - 31 - 1 ); - reference_power_q = sub( shl( inp_q, 1 ), 30 ); + computeReferencePower_ana_fx( hDirAC->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands, inp_q, &reference_power_q ); /* Aligning intensity_real to a common Q-factor */ minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); @@ -452,13 +451,13 @@ static void ivas_dirac_param_est_ana_fx( FOR( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) { - norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2*inp_q-30*/ + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*reference_power_q*/ - hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx], hDirAC->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[0][block_m_idx][band_m_idx] ); + hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[0][block_m_idx][band_m_idx], hDirAC->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hDirAC->direction_vector_e[0][block_m_idx][band_m_idx] ); move32(); - hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx], hDirAC->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[1][block_m_idx][band_m_idx] ); + hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[1][block_m_idx][band_m_idx], hDirAC->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hDirAC->direction_vector_e[1][block_m_idx][band_m_idx] ); move32(); - hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] ); + hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hDirAC->direction_vector_m_fx[2][block_m_idx][band_m_idx], hDirAC->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hDirAC->direction_vector_e[2][block_m_idx][band_m_idx] ); move32(); W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ); @@ -469,7 +468,7 @@ static void ivas_dirac_param_est_ana_fx( diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] ); move32(); - renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( 31, reference_power_q ), &renormalization_factor_diff_e[band_m_idx] ); move32(); } } diff --git a/lib_rend/ivas_mcmasa_ana_fx.c b/lib_rend/ivas_mcmasa_ana_fx.c index 489dd72bf..cf86608b2 100644 --- a/lib_rend/ivas_mcmasa_ana_fx.c +++ b/lib_rend/ivas_mcmasa_ana_fx.c @@ -521,6 +521,7 @@ void ivas_mcmasa_param_est_ana_fx( Word16 q_vdv[MASA_FREQUENCY_BANDS]; Word16 out_exp[MASA_FREQUENCY_BANDS]; Word32 reference_power_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 reference_power_q; Word32 dir_v_fx[DIRAC_NUM_DIMS]; Word32 Chnl_RealBuffer_fx[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; Word32 Chnl_ImagBuffer_fx[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; @@ -783,7 +784,7 @@ void ivas_mcmasa_param_est_ana_fx( /* Power and intensity estimation for diffuseness */ computeIntensityVector_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, num_freq_bands, intensity_even_real_fx, intensity_even_real_q, inp_q ); - computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); /*2*inp_q-30*/ + computeReferencePower_ana_fx( hMcMasa->band_grouping, FoaEven_RealBuffer_fx, FoaEven_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands, inp_q, &reference_power_q ); /* Aligning intensity_real and intensity_even_real to a common Q-factor */ minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); @@ -821,7 +822,7 @@ void ivas_mcmasa_param_est_ana_fx( hMcMasa->buffer_intensity_real_q[index - 1] = intensity_even_q; move16(); Copy32( reference_power_fx[ts], &( hMcMasa->buffer_energy_fx[i_mult( index - 1, num_freq_bands )] ), num_freq_bands ); - hMcMasa->buffer_energy_q[index - 1] = sub( shl( inp_q, 1 ), 30 ); + hMcMasa->buffer_energy_q[index - 1] = reference_power_q; move16(); computeDiffuseness_fixed( hMcMasa->buffer_intensity_real_fx, hMcMasa->buffer_energy_fx, num_freq_bands, diffuseness_vector_fx, hMcMasa->buffer_intensity_real_q, hMcMasa->buffer_energy_q, out_exp ); // out_exp = Q30 /* Compute vertical diffuseness, and tune original diffuseness if needed */ @@ -835,19 +836,19 @@ void ivas_mcmasa_param_est_ana_fx( } FOR( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) { - norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2*inp_q-30*/ - hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); - hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); - hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*reference_power_q*/ + hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hMcMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); + hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hMcMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); + hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hMcMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hMcMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); W_temp = W_mult0_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ); s = W_norm( W_temp ); temp = W_extract_h( W_shl( W_temp, s ) ); - temp_e = sub( 32, add( sub( Q30, sub( shl( c_e, 1 ), 1 ) ), s ) ); // 31 - ( (31 - sub( shl( c_e, 1 ), 1 )) + diffuseness_q + s - 32 ) + temp_e = sub( 63, add( Q30, add( reference_power_q, s ) ) ); // 31 - ( reference_power_q + diffuseness_q + s - 32 ) diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], temp, temp_e, &diffuseness_e[band_m_idx] ); - renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( 31, reference_power_q ), &renormalization_factor_diff_e[band_m_idx] ); move32(); move32(); move32(); diff --git a/lib_rend/ivas_omasa_ana_fx.c b/lib_rend/ivas_omasa_ana_fx.c index fe9ffbea3..67e72e84c 100644 --- a/lib_rend/ivas_omasa_ana_fx.c +++ b/lib_rend/ivas_omasa_ana_fx.c @@ -529,8 +529,7 @@ static void ivas_omasa_param_est_ana_fx( computeDirectionVectors_fixed( intensity_real_fx[0], intensity_real_fx[1], intensity_real_fx[2], 0, num_freq_bands, direction_vector_fx[0], direction_vector_fx[1], direction_vector_fx[2], 0, intensity_real_q ); /* Q direction_vector_fx = Q30*/ /* Power estimation for diffuseness */ - computeReferencePower_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands ); // 2 * inputq - 30 - reference_power_q = sub( shl( inp_q, 1 ), 30 ); + computeReferencePower_ana_fx( hOMasa->band_grouping, Foa_RealBuffer_fx, Foa_ImagBuffer_fx, reference_power_fx[ts], num_freq_bands, inp_q, &reference_power_q ); /* Aligning intensity_real to a common Q-factor */ minimum_fx( intensity_real_q, num_freq_bands, &intensity_q ); @@ -568,17 +567,17 @@ static void ivas_omasa_param_est_ana_fx( FOR( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { - norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*2*inp_q-30*/ - hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hOMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); + norm_tmp_fx = L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], L_sub( ONE_IN_Q30, diffuseness_vector_fx[band_m_idx] ) ), 1 ); /*reference_power_q*/ + hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[0][block_m_idx][band_m_idx], hOMasa->direction_vector_e[0][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[0][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hOMasa->direction_vector_e[0][block_m_idx][band_m_idx] ); move32(); - hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hOMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); + hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[1][block_m_idx][band_m_idx], hOMasa->direction_vector_e[1][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[1][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hOMasa->direction_vector_e[1][block_m_idx][band_m_idx] ); move32(); - hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hOMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), shl( c_e, 1 ), &hOMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); + hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx] = BASOP_Util_Add_Mant32Exp( hOMasa->direction_vector_m_fx[2][block_m_idx][band_m_idx], hOMasa->direction_vector_e[2][block_m_idx][band_m_idx], Mult_32_32( norm_tmp_fx, direction_vector_fx[2][band_m_idx] ), sub( 31 + 1, reference_power_q ), &hOMasa->direction_vector_e[2][block_m_idx][band_m_idx] ); move32(); - diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( shl( c_e, 1 ), 1 ), &diffuseness_e[band_m_idx] ); + diffuseness_m_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( diffuseness_m_fx[band_m_idx], diffuseness_e[band_m_idx], L_shl( Mult_32_32( reference_power_fx[ts][band_m_idx], diffuseness_vector_fx[band_m_idx] ), 1 ), sub( 31, reference_power_q ), &diffuseness_e[band_m_idx] ); move32(); - renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( shl( c_e, 1 ), 1 ), &renormalization_factor_diff_e[band_m_idx] ); + renormalization_factor_diff_fx[band_m_idx] = BASOP_Util_Add_Mant32Exp( renormalization_factor_diff_fx[band_m_idx], renormalization_factor_diff_e[band_m_idx], reference_power_fx[ts][band_m_idx], sub( 31, reference_power_q ), &renormalization_factor_diff_e[band_m_idx] ); move32(); } } @@ -868,42 +867,43 @@ void computeReferencePower_ana_fx( const Word16 *band_grouping, /* i : Band grouping for estimation */ Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal input_q */ Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal input_q */ - Word32 *reference_power, /* o : Estimated power 2 * inputq - 31 */ - const Word16 num_freq_bands /* i : Number of frequency bands */ + Word32 *reference_power, /* o : Estimated power */ + const Word16 num_freq_bands, /* i : Number of frequency bands */ + const Word16 input_q, /* i : Q-factor Real and Imag part of input signal */ + Word16 *reference_power_q /* o : Q-factor of the estimated power */ ) { Word16 brange[2]; - Word16 ch_idx, i, j; - + Word16 ch_idx, i, j, s; + Word64 reference_power64[MASA_FREQUENCY_BANDS]; FOR( i = 0; i < num_freq_bands; i++ ) { brange[0] = band_grouping[i]; move16(); brange[1] = band_grouping[i + 1]; move16(); - reference_power[i] = 0; - move32(); + reference_power64[i] = 0; + move64(); FOR( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) { /* abs()^2 */ FOR( j = brange[0]; j < brange[1]; j++ ) { - // Q = 2*inputq - 31 - reference_power[i] = L_add( L_add( Mpy_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Mpy_32_32( Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ) ), reference_power[i] ); - move32(); + reference_power64[i] = W_add( W_mac_32_32( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), reference_power64[i] ); // 2 * input_q + 1 + move64(); } } } - // v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); + s = sub( W_norm_arr( reference_power64, num_freq_bands ), 1 ); + FOR( i = 0; i < num_freq_bands; i++ ) + { + reference_power[i] = W_extract_h( W_shl( reference_power64[i], s ) ); // 2 * input_q + 1 + s - 32 + move32(); + } + *reference_power_q = sub( add( shl( input_q, 1 ), s ), 30 ); /* Bypassing the v_multc ,so output q = 2 * input_q + s - 30 */ + move16(); - /* Bypassing the v_multc ,so output q = 2*inputq - 30*/ return; } - -/*--------------------------------------------------------------------------* - * computeReferencePower_ana() - * - * - *--------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_prot_rend_fx.h b/lib_rend/ivas_prot_rend_fx.h index 6b34bcffe..7e6c2aa46 100644 --- a/lib_rend/ivas_prot_rend_fx.h +++ b/lib_rend/ivas_prot_rend_fx.h @@ -1437,11 +1437,13 @@ void computeIntensityVector_ana_fx( Word16 inp_q ); void computeReferencePower_ana_fx( - const Word16 *band_grouping, /* i : Band grouping for estimation */ - Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal input_q */ - Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal input_q */ - Word32 *reference_power, /* o : Estimated power */ - const Word16 num_freq_bands /* i : Number of frequency bands 2 * input_q - 31 */ + const Word16 *band_grouping, /* i : Band grouping for estimation */ + Word32 Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal input_q */ + Word32 Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal input_q */ + Word32 *reference_power, /* o : Estimated power */ + const Word16 num_freq_bands, /* i : Number of frequency bands */ + const Word16 input_q, /* i : Q-factor Real and Imag part of input signal */ + Word16 *reference_power_q /* o : Q-factor of the estimated power */ ); void ivas_create_masa_out_meta_fx( -- GitLab From d3cdb6b2381a5f967eb895e9ae403eb8786c2ae4 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Jul 2025 16:44:21 +0530 Subject: [PATCH 1202/1310] Warning fix --- lib_rend/ivas_dirac_ana_fx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_ana_fx.c b/lib_rend/ivas_dirac_ana_fx.c index 41b3fecd3..4e00b9623 100644 --- a/lib_rend/ivas_dirac_ana_fx.c +++ b/lib_rend/ivas_dirac_ana_fx.c @@ -371,7 +371,7 @@ static void ivas_dirac_param_est_ana_fx( FOR( ts = mrange[0]; ts < mrange[1]; ts++ ) { - Word16 cr_q = MAX_16, ci_q = MAX_16, c_e; + Word16 cr_q = MAX_16, ci_q = MAX_16; inp_q = scaled_data_q; // Q of data_fx after scaling move16(); move16(); @@ -391,7 +391,6 @@ static void ivas_dirac_param_est_ana_fx( scale_sig32( Foa_ImagBuffer_fx[i], l_ts, sf ); // Q-> inp_q + sf } inp_q = add( inp_q, sf ); - c_e = sub( 31, inp_q ); /* Compute omni energy for metadata processing */ FOR( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) { -- GitLab From 0b34b3642d65ea83b3764995286d58fc793c0fc7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Jul 2025 16:59:17 +0530 Subject: [PATCH 1203/1310] ISM decoder path optimizations - 2 sincResample_fx updated to reduce BASOP_Util_Add_Mant32Exp usage --- lib_com/options.h | 1 + lib_rend/ivas_objectRenderer_hrFilt_fx.c | 27 +++++++++++++++++++++-- lib_rend/ivas_objectRenderer_sfx_fx.c | 28 ++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 21d976fac..0f464530e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -82,6 +82,7 @@ #define OPT_MCT_ENC_V2_BE #define OPT_MCH_DEC_V1_NBE #define OPT_MASA_DEC_V1_NBE +#define OPT_MASA_DEC_V2_NBE #define OPT_MCT_ENC_48KB_NBE #define OPT_MCH_DEC_V1_BE #define OPT_MCT_ENC_V2_NBE diff --git a/lib_rend/ivas_objectRenderer_hrFilt_fx.c b/lib_rend/ivas_objectRenderer_hrFilt_fx.c index c5689b364..8504722af 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt_fx.c +++ b/lib_rend/ivas_objectRenderer_hrFilt_fx.c @@ -604,11 +604,18 @@ static void GenerateITD_fx( } ELSE { +#ifdef OPT_MASA_DEC_V2_NBE + Word16 temp_e = add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ); +#endif /* OPT_MASA_DEC_V2_NBE */ FOR( i = 0; i < num_az_idx; i++ ) { modelEval->BM_ITD_fx[qp + i] = L_shl( Mpy_32_32( modelEval->elevBfVecITD_fx[p], modelEval->azimBfVecITD_fx[i] ), 1 ); // Q30 move32(); +#ifdef OPT_MASA_DEC_V2_NBE + BM_idx[qp + i] = add( temp_e, AzIdx[i] ); +#else /* OPT_MASA_DEC_V2_NBE */ BM_idx[qp + i] = add( add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ), AzIdx[i] ); +#endif /* OPT_MASA_DEC_V2_NBE */ move16(); } qp = add( qp, num_az_idx ); @@ -623,19 +630,35 @@ static void GenerateITD_fx( } /* Matrix multiplcation (row x column) */ +#ifndef OPT_MASA_DEC_V2_NBE modelEval->itdMod_fx = 0; move16(); itdMod_e = 0; move16(); +#else /* OPT_MASA_DEC_V2_NBE */ + Word64 temp = 0; + move64(); + Word16 res_e = add( model->W_e, 1 ); +#endif /* OPT_MASA_DEC_V2_NBE */ FOR( i = 0; i < qp; i++ ) { - Word16 tmp_e; index = BM_idx[i]; move32(); +#ifndef OPT_MASA_DEC_V2_NBE + Word16 tmp_e; modelEval->itdMod_fx = BASOP_Util_Add_Mant32Exp( modelEval->itdMod_fx, itdMod_e, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ), add( model->W_e, 1 ), &tmp_e ); itdMod_e = tmp_e; move16(); - } +#else /* OPT_MASA_DEC_V2_NBE */ + temp = W_add( temp, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ) ); +#endif /* OPT_MASA_DEC_V2_NBE */ + } +#ifdef OPT_MASA_DEC_V2_NBE + itdMod_e = W_norm( temp ); + itdMod_e = sub( itdMod_e, 32 ); + modelEval->itdMod_fx = W_shl_sat_l( temp, itdMod_e ); + itdMod_e = sub( res_e, itdMod_e ); +#endif /* OPT_MASA_DEC_V2_NBE */ Word32 tmp32 = Mpy_32_16_1( modelEval->itdMod_fx, model->resamp_factor_fx ); // Q = 31 - ( itdMod_e + 1 ) Word16 tmp_q = sub( 30, itdMod_e ); diff --git a/lib_rend/ivas_objectRenderer_sfx_fx.c b/lib_rend/ivas_objectRenderer_sfx_fx.c index ef5fa93e4..5f6ee03a7 100644 --- a/lib_rend/ivas_objectRenderer_sfx_fx.c +++ b/lib_rend/ivas_objectRenderer_sfx_fx.c @@ -191,6 +191,9 @@ static void sincResample_fx( Word16 t_step_e; Word32 t_frac_fx; Word16 t_frac_e; +#ifdef OPT_MASA_DEC_V2_NBE + Word64 t_frac_fx_acc; +#endif /* OPT_MASA_DEC_V2_NBE */ Word64 tmp64_fx; // Qx + 32 const Word32 *p_mid_fx; const Word32 *p_forward_fx; @@ -212,6 +215,10 @@ static void sincResample_fx( /* Compute fractional time step */ t_step_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( length_in, length_out, &t_step_e ) ); // exp(t_step_e) +#ifdef OPT_MASA_DEC_V2_NBE + t_frac_fx_acc = 0; + move64(); +#endif /* OPT_MASA_DEC_V2_NBE */ t_frac_fx = 0; move32(); t_frac_e = 0; @@ -224,13 +231,21 @@ static void sincResample_fx( t = extract_l( L_shr( t_frac_plus_eps, sub( 31, t_frac_plus_eps_e ) ) ); // Q0 /* Calculate the sinc-index for the center value of the sinc */ - Word32 center_val; Word16 center_val_e; +#ifndef OPT_MASA_DEC_V2_NBE + Word32 center_val; center_val = BASOP_Util_Add_Mant32Exp( t_frac_plus_eps, t_frac_plus_eps_e, L_negate( L_deposit_h( t ) ), 15, ¢er_val_e ); // exp(center_val_e) center_val_e = add( center_val_e, 6 ); // center_val * SFX_SPAT_BIN_NUM_SUBSAMPLES (i.e. 64) center_val = BASOP_Util_Add_Mant32Exp( center_val, center_val_e, ONE_IN_Q29, 1, ¢er_val_e ); // exp(center_val_e) snc0 = extract_l( L_shr( center_val, sub( 31, center_val_e ) ) ); // Q0 - +#else /* OPT_MASA_DEC_V2_NBE */ + Word64 center_val; + center_val = W_sub( t_frac_plus_eps, W_shl( t, sub( 31, t_frac_plus_eps_e ) ) ); // exp(center_val_e) + center_val_e = add( t_frac_plus_eps_e, 6 ); + Word16 com_e = s_max( 0, center_val_e ); + center_val = W_add( W_shr( center_val, sub( com_e, center_val_e ) ), W_shl( 1, sub( 30, com_e ) ) ); // exp(center_val_e) + snc0 = extract_l( W_shl_sat_l( center_val, sub( com_e, 31 ) ) ); +#endif /* OPT_MASA_DEC_V2_NBE */ /* Run convolution forward and backward from mid point */ p_mid_fx = input_fx + t; // Qx p_forward_fx = p_mid_fx + 1; // Qx @@ -255,7 +270,16 @@ static void sincResample_fx( move32(); /* Advance fractional time */ +#ifndef OPT_MASA_DEC_V2_NBE t_frac_fx = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, t_step_fx, t_step_e, &t_frac_e ); // exp( t_frac_fx ) +#else /* OPT_MASA_DEC_V2_NBE */ + t_frac_fx_acc = W_add( t_frac_fx_acc, t_step_fx ); // t_step_e + Word16 hdrm = W_norm( t_frac_fx_acc ); + hdrm = sub( hdrm, 32 ); + t_frac_fx = W_shl_sat_l( t_frac_fx_acc, hdrm ); + t_frac_e = sub( t_step_e, hdrm ); + move16(); +#endif /* OPT_MASA_DEC_V2_NBE */ } return; -- GitLab From 7c5ad78623e7d934a52ba020758e2bcc74060e89 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 11 Jul 2025 17:44:15 +0530 Subject: [PATCH 1204/1310] Multi channel optimizations in encoder - non bit exact sns_shape_spectrum_fx, SQ_gain_estimate_fx functions updated for BASOP usage --- lib_com/ivas_sns_com_fx.c | 26 ++++++++++++++++++++++++++ lib_com/options.h | 1 + lib_enc/cod_tcx_fx.c | 5 +++++ lib_enc/tcx_utils_enc_fx.c | 23 ++++++++++++++++++++++- 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index f1e44be78..1a0219b25 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -376,12 +376,14 @@ void sns_shape_spectrum_fx( { L64_tmp[k] = W_mult_32_32( spectrum[k], scf_int[i] ); // Q = q_spectrum + q_scf_int + 1 move64(); +#ifndef OPT_MCT_ENC_V3_NBE shift = W_norm( L64_tmp[k] ); if ( LT_16( shift, min_shift ) ) { min_shift = shift; move16(); } +#endif } } tmp_k = k; @@ -391,18 +393,29 @@ void sns_shape_spectrum_fx( *length = k; move16(); } +#ifdef OPT_MCT_ENC_V3_NBE + min_shift = W_norm_arr( L64_tmp, k ); +#endif q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); if ( GT_16( q_tmp, 30 ) ) { q_tmp = 30; move16(); } +#ifdef OPT_MCT_ENC_V3_NBE + shift = sub( q_tmp, add( *q_spectrum, q_scf_int ) ); + FOR( k = 0; k < tmp_k; k++ ) + { + spectrum[k] = W_shl_sat_l( L64_tmp[k], shift ); // q_tmp+1 + move32(); +#else FOR( k = 0; k < tmp_k; k++ ) { L64_tmp[k] = W_shr( L64_tmp[k], sub( add( *q_spectrum, q_scf_int ), q_tmp ) ); // Q = q_tmp+1 move64(); spectrum[k] = W_sat_l( L64_tmp[k] ); // Q = q_tmp+1 move64(); +#endif } *q_spectrum = q_tmp; move16(); @@ -418,6 +431,7 @@ void sns_shape_spectrum_fx( { L64_tmp[k] = W_mult_32_32( spectrum[k], scf_int[i] ); // Q = q_spectrum + q_scf_int + 1 move64(); +#ifndef OPT_MCT_ENC_V3_NBE shift = W_norm( L64_tmp[k] ); test(); if ( LT_16( shift, min_shift ) && NE_64( L64_tmp[k], 0 ) ) @@ -425,6 +439,7 @@ void sns_shape_spectrum_fx( min_shift = shift; move16(); } +#endif } } tmp_k = k; @@ -434,18 +449,29 @@ void sns_shape_spectrum_fx( *length = k; move16(); } +#ifdef OPT_MCT_ENC_V3_NBE + min_shift = W_norm_arr( L64_tmp, k ); +#endif q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); if ( GT_16( q_tmp, 30 ) ) { q_tmp = 30; move16(); } +#ifdef OPT_MCT_ENC_V3_NBE + shift = sub( q_tmp, add( *q_spectrum, q_scf_int ) ); + FOR( k = 0; k < tmp_k; k++ ) + { + spectrum[k] = W_shl_sat_l( L64_tmp[k], shift ); // q_tmp+1 + move32(); +#else FOR( k = 0; k < tmp_k; k++ ) { L64_tmp[k] = W_shr( L64_tmp[k], sub( add( *q_spectrum, q_scf_int ), q_tmp ) ); // q_tmp+1 move64(); spectrum[k] = W_sat_l( L64_tmp[k] ); // Q = q_tmp+1 move64(); +#endif } *q_spectrum = q_tmp; move16(); diff --git a/lib_com/options.h b/lib_com/options.h index 0f464530e..362cad558 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,6 +79,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_MCT_ENC_V3_NBE #define OPT_MCT_ENC_V2_BE #define OPT_MCH_DEC_V1_NBE #define OPT_MASA_DEC_V1_NBE diff --git a/lib_enc/cod_tcx_fx.c b/lib_enc/cod_tcx_fx.c index c8fab11a9..b520d9eeb 100644 --- a/lib_enc/cod_tcx_fx.c +++ b/lib_enc/cod_tcx_fx.c @@ -3203,6 +3203,11 @@ void QuantizeTCXSpectrum_fx( IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) { +#ifdef OPT_MCT_ENC_V3_NBE + Word16 scale = sub( L_norm_arr( spectrum_fx, L_spec ), 2 ); + scale_sig32( spectrum_fx, L_spec, scale ); + *spectrum_e = sub( *spectrum_e, scale ); +#endif sqGain_fx = SQ_gain_estimate_fx( spectrum_fx, *spectrum_e, shl( mult( hTcxEnc->tcx_target_bits_fac, sqTargetBits ), 1 ), L_spec, &sqGain_e ); } ELSE diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 9ca9eb82a..6ce40b00e 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -1053,6 +1053,10 @@ Word16 SQ_gain_estimate_fx( /* output: SQ gain Word32 tmp = 0, tmpp = 0; move32(); move32(); +#ifdef OPT_MCT_ENC_V3_NBE + Word64 ener64_fx; + Word16 tmp_exp; +#endif /* tmp = 0.5f * (float) log10( (float) lg / (float) NORM_MDCT_FACTOR ) + + 0.94f; lowest gain + expected value of the quantization noise energy per quadruple (log10(4/12)) in Q16*/ /* tmpp = 0.5f * (float) log10( (float) lg / (float) NORM_MDCT_FACTOR ) * log2(10) in Q16 */ @@ -1166,9 +1170,21 @@ Word16 SQ_gain_estimate_fx( /* output: SQ gain lg_4 = shr( lg, 2 ); +#ifdef OPT_MCT_ENC_V3_NBE + tmp_exp = shl( x_e, 1 ); +#endif /* SNR of quadruples for unit step quantizer and lowest possible gain */ FOR( i = 0; i < lg_4; i++ ) { +#ifdef OPT_MCT_ENC_V3_NBE + ener64_fx = W_mac_32_32( 1, x[0], x[0] ); // exp:2*x_e + ener64_fx = W_mac_32_32( ener64_fx, x[1], x[1] ); // exp:2*x_e + ener64_fx = W_mac_32_32( ener64_fx, x[2], x[2] ); // exp:2*x_e + ener64_fx = W_mac_32_32( ener64_fx, x[3], x[3] ); // exp:2*x_e + s = W_norm( ener64_fx ); + ener = W_extract_h( W_shl( ener64_fx, s ) ); + s = sub( tmp_exp, s ); +#else /* normalization */ s = 15; move16(); @@ -1215,7 +1231,7 @@ Word16 SQ_gain_estimate_fx( /* output: SQ gain ener = L_mac( ener, tmp16, tmp16 ); s = shl( sub( x_e, s ), 1 ); - +#endif /* log */ tmp32 = L_add_sat( BASOP_Util_Log2( ener ), L_shl_sat( L_deposit_l( s ), 25 ) ); /* log2, 6Q25 */ en[i] = L_add_sat( L_shr( tmp32, 9 ), tmp ); /* 15Q16 */ @@ -1241,8 +1257,13 @@ Word16 SQ_gain_estimate_fx( /* output: SQ gain { tmp32 = L_sub( en[i], offset ); +#ifdef OPT_MCT_ENC_V3_NBE + /* avoid SV with 1 bin of amp < 0.5f */ + if ( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 0.3*log2(10); */ +#else /* avoid SV with 1 bin of amp < 0.5f */ IF( GT_32( tmp32, 0xFF20 ) ) /* 0xFF20 -> 0.3*log2(10); */ +#endif { ener = L_add( ener, tmp32 ); } -- GitLab From 60bbeeff8babaad203eccb9361ccb82636687e88 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Fri, 11 Jul 2025 08:25:34 -0400 Subject: [PATCH 1205/1310] Fix to correct wrong initialization, small expected impact --- lib_com/options.h | 3 +++ lib_enc/core_switching_enc_fx.c | 15 ++++++++++++--- lib_enc/rst_enc_fx.c | 8 ++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 21d976fac..2c65d182f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -126,4 +126,7 @@ #define NONBE_FIX_1748_SPAR_DIV_OPT /*Dlb: issue 1748: SPAR common div optimizations*/ #define FIX_ISSUE_1801_NOISE_FLOOR_REDUCTION /* FhG: Fixed getScalefactor usage */ + +#define FIX_1818_WRONG_PIT_INIT /* VA: Fix wrong pitch initialization */ + #endif diff --git a/lib_enc/core_switching_enc_fx.c b/lib_enc/core_switching_enc_fx.c index 5290509cd..5867eb362 100644 --- a/lib_enc/core_switching_enc_fx.c +++ b/lib_enc/core_switching_enc_fx.c @@ -282,8 +282,11 @@ void core_switching_pre_enc_fx( tmp16 = shr( st_fx->L_frame, 6 ); Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 ); /*Q6*/ +#ifdef FIX_1818_WRONG_PIT_INIT + set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR << 6, tmp16 ); +#else set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 ); - +#endif /* Reset old TD BWE buffers */ IF( hBWE_TD != NULL ) { @@ -851,8 +854,11 @@ void core_switching_pre_enc_ivas_fx( } Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 ); +#ifdef FIX_1818_WRONG_PIT_INIT + set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR << 6, tmp16 ); +#else set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 ); - +#endif /* Reset old ACELP buffers */ test(); IF( ( st_fx->element_mode == EVS_MONO ) && hLPDmem != NULL ) @@ -902,8 +908,11 @@ void core_switching_pre_enc_ivas_fx( tmp16 = shr( st_fx->L_frame, 6 ); Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 ); +#ifdef FIX_1818_WRONG_PIT_INIT + set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR << 6, tmp16 ); +#else set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 ); - +#endif /* Reset old TD BWE buffers */ IF( hBWE_TD != NULL ) { diff --git a/lib_enc/rst_enc_fx.c b/lib_enc/rst_enc_fx.c index d519bc12f..9880084e1 100644 --- a/lib_enc/rst_enc_fx.c +++ b/lib_enc/rst_enc_fx.c @@ -53,11 +53,19 @@ void CNG_reset_enc_fx( /* reset the pitch buffer in case of FRAME_NO_DATA or SID frames */ IF( EQ_16( st_fx->L_frame, L_FRAME ) ) { +#ifdef FIX_1818_WRONG_PIT_INIT + set16_fx( pitch_buf, L_SUBFR << 6, NB_SUBFR ); +#else set16_fx( pitch_buf, L_SUBFR, NB_SUBFR ); +#endif } ELSE /* st->L_frame == L_FRAME16k */ { +#ifdef FIX_1818_WRONG_PIT_INIT + set16_fx( pitch_buf, L_SUBFR16k << 6, NB_SUBFR16k ); +#else set16_fx( pitch_buf, L_SUBFR16k, NB_SUBFR16k ); +#endif } set16_fx( voice_factors, 1, NB_SUBFR16k ); -- GitLab From 8bc8881a5cbfcb5cd086dd15f9a62112bffa1735 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Fri, 11 Jul 2025 08:34:10 -0400 Subject: [PATCH 1206/1310] fix clang --- lib_enc/core_switching_enc_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/core_switching_enc_fx.c b/lib_enc/core_switching_enc_fx.c index 5867eb362..4c0b843e9 100644 --- a/lib_enc/core_switching_enc_fx.c +++ b/lib_enc/core_switching_enc_fx.c @@ -854,7 +854,7 @@ void core_switching_pre_enc_ivas_fx( } Copy( st_fx->old_pitch_buf_fx + tmp16, st_fx->old_pitch_buf_fx, tmp16 ); -#ifdef FIX_1818_WRONG_PIT_INIT +#ifdef FIX_1818_WRONG_PIT_INIT set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR << 6, tmp16 ); #else set16_fx( st_fx->old_pitch_buf_fx + tmp16, L_SUBFR, tmp16 ); -- GitLab From c9dbededbfd71e5aa92ab0e82b59fd55d639af39 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 11 Jul 2025 15:46:50 +0200 Subject: [PATCH 1207/1310] A few fixes for long term logs job --- .gitlab-ci.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7a0c0f324..23fd54f3e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -282,7 +282,7 @@ workflow: - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) - echo "Job ID from variables - $CI_JOB_ID, Job ID from script - $id_previous" - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts # This wildcard thingy relies on only one csv file being present per job - file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" @@ -1662,24 +1662,27 @@ ivas-long-term-job-logs: # handle case where the job is running for the first time. e.g where the job was not found. id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip if [ "$id_previous" != "-1" ]; then - unzip artifacts.zip -d logs + # Unzip artifacts to recover past logs dir + curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + unzip artifacts.zip + else + # create logs dir if it doesn't exist + mkdir logs fi - # create logs dir if it doesn't exist + # create folder for today's results TODAY=$(date +'%Y-%m-%d') mkdir -p logs/$TODAY # Aggregate job logs - - job=("ivas-pytest-compare_ref-long-enc" "ivas-pytest-compare_ref-long-enc-lev+10" "ivas-pytest-compare_ref-long-enc-lev-10" "ivas-pytest-compare_ref-long-dec" "ivas-pytest-compare_ref-long-dec-lev+10" "ivas-pytest-compare_ref-long-dec-lev-10" "ivas-pytest-compare_ref-long-fx-fx" "ivas-pytest-compare_ref-long-fx-fx-lev+10" "ivas-pytest-compare_ref-long-fx-fx-lev-10") - for job_name in "${job[@]}"; do + jobs="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" + for job in $jobs; do echo "Getting job logs for: $job" id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip unzip artifacts.zip -d previous_artifacts # This wildcard thingy relies on only one csv file being present per job mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY @@ -1717,7 +1720,7 @@ ivas-long-term-job-logs: # this is a testing/maintenance mechanism to force getting the log history from a specific job id # see below in the concrete complexity jobs - if [ "$JOB_ID_INJECT" != "" ]; then job_id=$JOB_ID_INJECT; fi - - curl --silent --show-error --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip + - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - unzip -qq artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - public_dir="$CI_JOB_NAME-public" @@ -1747,7 +1750,7 @@ ivas-long-term-job-logs: ### 1.5.part: get the corresponding measurement from ivas-float-update - job_id=$(python3 ci/get_id_of_last_job_occurence.py ivas-float-update $CI_JOB_NAME $CI_PROJECT_ID) - echo $job_id - - curl --silent --show-error --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip + - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip - unzip -qq -j artifacts_ref.zip "*latest_WMOPS.csv" || true # add file to arguments only if the artifact could be retrieved to prevent error later. - if [ -f latest_WMOPS.csv ]; then GET_WMOPS_ARGS="$GET_WMOPS_ARGS latest_WMOPS.csv"; fi -- GitLab From 547e6bdc24ac3d55bcffaf7c7c48085525742e0c Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 11 Jul 2025 15:50:31 +0200 Subject: [PATCH 1208/1310] Cleanup of unnecessary LTV fetch in log job --- .gitlab-ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 23fd54f3e..1c33ff205 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1652,8 +1652,6 @@ ivas-long-term-job-logs: set -euxo pipefail bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh # Get previous logs of this job incase we are running on a different machine if [ -d "logs" ]; then rm -rf "logs"; fi -- GitLab From c9341a901bc67506a446a1646ca0f42404cce99a Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 11 Jul 2025 16:20:45 +0200 Subject: [PATCH 1209/1310] Fix syntax error in log job --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1c33ff205..cc11f0433 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1675,8 +1675,8 @@ ivas-long-term-job-logs: mkdir -p logs/$TODAY # Aggregate job logs - jobs="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" - for job in $jobs; do + job_names="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" + for job_name in $job_names; do echo "Getting job logs for: $job" id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" -- GitLab From 1bafc9206b21590fde375efaec7e716b5901a729 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 11 Jul 2025 16:41:45 +0200 Subject: [PATCH 1210/1310] Fix syntax error in long term logs job --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cc11f0433..f0126ea27 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1677,7 +1677,7 @@ ivas-long-term-job-logs: # Aggregate job logs job_names="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" for job_name in $job_names; do - echo "Getting job logs for: $job" + echo "Getting job logs for: $job_name" id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip -- GitLab From d80dfda86f653656a77d0070011e71c8022f34d0 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 11 Jul 2025 17:13:51 +0200 Subject: [PATCH 1211/1310] Try excluding build jobs --- .gitlab-ci.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f0126ea27..1bd852a5d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -842,6 +842,10 @@ clang-format-check: # ensure that codec builds on linux build-codec-linux-make: rules: + - if: $CI_JOB_NAME == 'pages' + when: never + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs @@ -859,6 +863,10 @@ build-codec-linux-make: # ensure that codec builds on linux with instrumentation active build-codec-linux-instrumented-make: rules: + - if: $CI_JOB_NAME == 'pages' + when: never + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main @@ -876,6 +884,10 @@ build-codec-linux-instrumented-make: build-codec-linux-debugging-make: rules: + - if: $CI_JOB_NAME == 'pages' + when: never + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main @@ -894,6 +906,10 @@ build-codec-linux-debugging-make: build-codec-windows-msbuild: rules: + - if: $CI_JOB_NAME == 'pages' + when: never + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs @@ -1658,7 +1674,8 @@ ivas-long-term-job-logs: # TODO add variable to inject logs from backup copy # handle case where the job is running for the first time. e.g where the job was not found. - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + #id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + id_previous="-1" echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" if [ "$id_previous" != "-1" ]; then -- GitLab From 9f2a842fedfc8d9af3b7d15f6e9796a09a19fbce Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 11 Jul 2025 17:16:54 +0200 Subject: [PATCH 1212/1310] Move to test stage --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1bd852a5d..8fb40a0ce 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1660,7 +1660,7 @@ ivas-long-term-job-logs: - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "long-term-logs" tags: - ivas-basop-linux - stage: .pre + stage: .test timeout: "25 minutes" script: - !reference [ .job-linux, before_script ] -- GitLab From c863ddfc1639cfd5216851dad14ff25e540cf72f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Fri, 11 Jul 2025 17:18:25 +0200 Subject: [PATCH 1213/1310] Maintenance stage --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8fb40a0ce..8b40ca840 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1660,7 +1660,7 @@ ivas-long-term-job-logs: - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "long-term-logs" tags: - ivas-basop-linux - stage: .test + stage: maintenance timeout: "25 minutes" script: - !reference [ .job-linux, before_script ] -- GitLab From 268db15d6387d2a286301a20ea7bea460bba9455 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sat, 12 Jul 2025 22:09:07 +0200 Subject: [PATCH 1214/1310] Add job for storing backup copy of logs, and way to inject backups --- .gitlab-ci.yml | 52 +++++++++++++++++++++++++++++++++++++--- .gitlab-ci/variables.yml | 4 ++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b40ca840..10f8513b7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,6 +32,9 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' variables: IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' + variables: + IVAS_PIPELINE_NAME: 'Backup long term logs: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare' variables: IVAS_PIPELINE_NAME: 'Run comparison tools against float ref: $CI_COMMIT_BRANCH' @@ -1659,19 +1662,24 @@ ivas-long-term-job-logs: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "long-term-logs" tags: - - ivas-basop-linux + - $RUNNER_TAG stage: maintenance timeout: "25 minutes" script: - !reference [ .job-linux, before_script ] - | set -euxo pipefail + echo "Running on RUNNER_TAG: $RUNNER_TAG" bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - # Get previous logs of this job incase we are running on a different machine + # Clean up logs if [ -d "logs" ]; then rm -rf "logs"; fi - # TODO add variable to inject logs from backup copy + + # Inject logs from backup copy if LOGS_BACKUP_SOURCE_DIR is set + if [ -d "$LOGS_BACKUP_SOURCE_DIR" ]; then + cp -r $LOGS_BACKUP_SOURCE_DIR/logs . + fi # handle case where the job is running for the first time. e.g where the job was not found. #id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) @@ -1719,6 +1727,44 @@ ivas-long-term-job-logs: expose_as: "ivas long term job logs results" +backup-long-term-job-logs: + rules: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" + - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" + tags: + - $RUNNER_TAG + stage: maintenance + timeout: "25 minutes" + script: + - !reference [ .job-linux, before_script ] + - | + set -euxo pipefail + echo "Running on RUNNER_TAG: $RUNNER_TAG" + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + + id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + echo "Job name from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" + + if [ "$id_previous" != "-1" ]; then + # Unzip artifacts to recover past logs dir + curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + unzip artifacts.zip + else + # create logs dir if it doesn't exist + mkdir logs + fi + + # Store logs as backup copy if LOGS_BACKUP_TARGET_DIR is set + if [ -d "$LOGS_BACKUP_TARGET_DIR" ]; then + cp -r logs $LOGS_BACKUP_TARGET_DIR/logs + exit 0; + else + echo "Error: LOGS_BACKUP_TARGET_DIR not set for backup job!" + exit -1; + fi + + # --------------------------------------------------------------- diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index a804cdddb..96ef1f507 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -46,6 +46,9 @@ variables: FLOAT_REF_COMMIT_FILE: "float-ref-git-sha.txt" CUT_COMMIT_FILE: "CuT-git-sha.txt" MERGE_TARGET_COMMIT_FILE: "merge-target-git-sha.txt" + RUNNER_TAG: "ivas-basop-linux" + LOGS_BACKUP_SOURCE_DIR: "" + LOGS_BACKUP_TARGET_DIR: "" MANUAL_PIPELINE_TYPE: description: "Type for the manual pipeline run. Use 'pytest-compare' to run comparison test against reference float codec." value: 'default' @@ -66,3 +69,4 @@ variables: - 'renderer-framesize-be' - 'peaq-enc-passthrough' - 'long-term-logs' + - 'backup-long-term-logs' -- GitLab From b2683cf3ca3c38eeae309e481f38e8699e4f5604 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sat, 12 Jul 2025 22:15:21 +0200 Subject: [PATCH 1215/1310] Add comments to explain logs backup procedure --- .gitlab-ci.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 10f8513b7..3eed21fb2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1656,7 +1656,11 @@ voip-be-on-merge-request: - make -j >> /dev/null - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py - +# To inject backup copy in manual trigger: +# - Store logs backup in accessible folder, e.g. /tmp/ivas +# - Set MANUAL_PIPELINE_TRIGGER to long-term-logs +# - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 +# - Set LOGS_BACKUP_SOURCE_DIR to source folder, e.g. /tmp/ivas ivas-long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" @@ -1715,9 +1719,6 @@ ivas-long-term-job-logs: ls logs exit 0 - allow_failure: - exit_codes: - - 123 artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" expire_in: 4 weeks @@ -1726,7 +1727,11 @@ ivas-long-term-job-logs: - logs expose_as: "ivas long term job logs results" - +# To store backup copy: +# - Prepare accessible folder for backup, e.g. /tmp/ivas +# - Set MANUAL_PIPELINE_TRIGGER to backup-long-term-logs +# - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 +# - Set LOGS_BACKUP_TARGET_DIR to source folder, e.g. /tmp/ivas backup-long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" -- GitLab From 157362c71691b46ff05f46c4a1c7c0c2e0fa65ee Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sat, 12 Jul 2025 22:16:47 +0200 Subject: [PATCH 1216/1310] Remove temporary disabling of logs fetch --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3eed21fb2..4eb39a50e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1686,8 +1686,7 @@ ivas-long-term-job-logs: fi # handle case where the job is running for the first time. e.g where the job was not found. - #id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - id_previous="-1" + id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" if [ "$id_previous" != "-1" ]; then -- GitLab From f6a2f4a521ee3abfd8ce1496bcbfe967acc85ebb Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 13 Jul 2025 16:35:10 +0200 Subject: [PATCH 1217/1310] Add '-' in log jobs for consistency. Fix job name in backup-long-term-job-logs --- .gitlab-ci.yml | 124 +++++++++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 65 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4eb39a50e..da736bfb4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1671,52 +1671,49 @@ ivas-long-term-job-logs: timeout: "25 minutes" script: - !reference [ .job-linux, before_script ] - - | - set -euxo pipefail - echo "Running on RUNNER_TAG: $RUNNER_TAG" - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - set -euxo pipefail + - echo "Running on RUNNER_TAG: $RUNNER_TAG" + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - # Clean up logs - if [ -d "logs" ]; then rm -rf "logs"; fi + # Clean up logs + - if [ -d "logs" ]; then rm -rf "logs"; fi + # Inject logs from backup copy if LOGS_BACKUP_SOURCE_DIR is set + - if [ -d "$LOGS_BACKUP_SOURCE_DIR" ]; then + - cp -r $LOGS_BACKUP_SOURCE_DIR/logs . + - fi - # Inject logs from backup copy if LOGS_BACKUP_SOURCE_DIR is set - if [ -d "$LOGS_BACKUP_SOURCE_DIR" ]; then - cp -r $LOGS_BACKUP_SOURCE_DIR/logs . - fi + # handle case where the job is running for the first time. e.g where the job was not found. + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + - echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - # handle case where the job is running for the first time. e.g where the job was not found. - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - - if [ "$id_previous" != "-1" ]; then + - if [ "$id_previous" != "-1" ]; then # Unzip artifacts to recover past logs dir - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip - else + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip + - else # create logs dir if it doesn't exist - mkdir logs - fi + - mkdir logs + - fi - # create folder for today's results - TODAY=$(date +'%Y-%m-%d') - mkdir -p logs/$TODAY - - # Aggregate job logs - job_names="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" - for job_name in $job_names; do - echo "Getting job logs for: $job_name" - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY - rm artifacts.zip - rm -r previous_artifacts - done - ls logs - exit 0 + # create folder for today's results + - TODAY=$(date +'%Y-%m-%d') + - mkdir -p logs/$TODAY + + # Aggregate job logs + - job_names="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" + - for job_name in $job_names; do + - echo "Getting job logs for: $job_name" + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) + - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip -d previous_artifacts + - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY + - rm artifacts.zip + - rm -r previous_artifacts + - done + - ls logs + - exit 0 artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" @@ -1741,34 +1738,31 @@ backup-long-term-job-logs: timeout: "25 minutes" script: - !reference [ .job-linux, before_script ] - - | - set -euxo pipefail - echo "Running on RUNNER_TAG: $RUNNER_TAG" - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - echo "Job name from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - - if [ "$id_previous" != "-1" ]; then + - set -euxo pipefail + - echo "Running on RUNNER_TAG: $RUNNER_TAG" + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + + # Find ID of last run of ivas-long-term-job-logs + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-long-term-job-logs $CI_PROJECT_ID) + + - if [ "$id_previous" != "-1" ]; then # Unzip artifacts to recover past logs dir - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip - else + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip + - else # create logs dir if it doesn't exist - mkdir logs - fi - - # Store logs as backup copy if LOGS_BACKUP_TARGET_DIR is set - if [ -d "$LOGS_BACKUP_TARGET_DIR" ]; then - cp -r logs $LOGS_BACKUP_TARGET_DIR/logs - exit 0; - else - echo "Error: LOGS_BACKUP_TARGET_DIR not set for backup job!" - exit -1; - fi + - mkdir logs + - fi - + # Store logs as backup copy if LOGS_BACKUP_TARGET_DIR is set + - if [ -d "$LOGS_BACKUP_TARGET_DIR" ]; then + - cp -r logs $LOGS_BACKUP_TARGET_DIR + - exit 0; + - else + - echo "Error: LOGS_BACKUP_TARGET_DIR not set for backup job!" + - exit -1; + - fi # --------------------------------------------------------------- -- GitLab From 38c9d7ebf050fd5b3a340a4b493e240a8d094691 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 13 Jul 2025 16:39:22 +0200 Subject: [PATCH 1218/1310] Change example backup folder in comment --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index da736bfb4..890c6588e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1657,10 +1657,10 @@ voip-be-on-merge-request: - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py # To inject backup copy in manual trigger: -# - Store logs backup in accessible folder, e.g. /tmp/ivas +# - Store logs backup in accessible folder, e.g. /usr/local/backup # - Set MANUAL_PIPELINE_TRIGGER to long-term-logs # - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 -# - Set LOGS_BACKUP_SOURCE_DIR to source folder, e.g. /tmp/ivas +# - Set LOGS_BACKUP_SOURCE_DIR to source folder, e.g. /usr/local/backup ivas-long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" @@ -1724,10 +1724,10 @@ ivas-long-term-job-logs: expose_as: "ivas long term job logs results" # To store backup copy: -# - Prepare accessible folder for backup, e.g. /tmp/ivas +# - Prepare accessible folder for backup, e.g. /usr/local/backup # - Set MANUAL_PIPELINE_TRIGGER to backup-long-term-logs # - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 -# - Set LOGS_BACKUP_TARGET_DIR to source folder, e.g. /tmp/ivas +# - Set LOGS_BACKUP_TARGET_DIR to source folder, e.g. /usr/local/backup backup-long-term-job-logs: rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" -- GitLab From ee10b8d473b9c6f8ea6ec2eb723ae1660d2f60f2 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 13 Jul 2025 16:52:20 +0200 Subject: [PATCH 1219/1310] Try to fix syntax errors --- .gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 890c6588e..c44beb080 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1672,7 +1672,7 @@ ivas-long-term-job-logs: script: - !reference [ .job-linux, before_script ] - set -euxo pipefail - - echo "Running on RUNNER_TAG: $RUNNER_TAG" + - echo "Running on RUNNER_TAG = $RUNNER_TAG" - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh @@ -1685,7 +1685,7 @@ ivas-long-term-job-logs: # handle case where the job is running for the first time. e.g where the job was not found. - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - - echo "Job ID from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" + - echo "Job name from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - if [ "$id_previous" != "-1" ]; then # Unzip artifacts to recover past logs dir @@ -1703,7 +1703,7 @@ ivas-long-term-job-logs: # Aggregate job logs - job_names="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" - for job_name in $job_names; do - - echo "Getting job logs for: $job_name" + - echo "Getting job logs for $job_name" - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip @@ -1739,7 +1739,7 @@ backup-long-term-job-logs: script: - !reference [ .job-linux, before_script ] - set -euxo pipefail - - echo "Running on RUNNER_TAG: $RUNNER_TAG" + - echo "Running on RUNNER_TAG = $RUNNER_TAG" - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh @@ -1760,7 +1760,7 @@ backup-long-term-job-logs: - cp -r logs $LOGS_BACKUP_TARGET_DIR - exit 0; - else - - echo "Error: LOGS_BACKUP_TARGET_DIR not set for backup job!" + - echo "Error - LOGS_BACKUP_TARGET_DIR not set for backup job!" - exit -1; - fi -- GitLab From 0b814f35b944b49e5efb621a32b560014ee4499b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Sun, 13 Jul 2025 17:15:43 +0200 Subject: [PATCH 1220/1310] Use zip -o in case of overlap between new/injected logs --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c44beb080..32a321bc6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1690,7 +1690,8 @@ ivas-long-term-job-logs: - if [ "$id_previous" != "-1" ]; then # Unzip artifacts to recover past logs dir - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip + # If there is overlap between injected log and new log, use the new logs. + - unzip -o artifacts.zip - else # create logs dir if it doesn't exist - mkdir logs -- GitLab From 5bd99fde185648dfd6320cfc0a6a622de50af72f Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 14 Jul 2025 14:25:19 +0200 Subject: [PATCH 1221/1310] Fix excluding build jobs for pages job --- .gitlab-ci.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 32a321bc6..3b3957c70 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -845,9 +845,7 @@ clang-format-check: # ensure that codec builds on linux build-codec-linux-make: rules: - - if: $CI_JOB_NAME == 'pages' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -866,9 +864,7 @@ build-codec-linux-make: # ensure that codec builds on linux with instrumentation active build-codec-linux-instrumented-make: rules: - - if: $CI_JOB_NAME == 'pages' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -887,9 +883,7 @@ build-codec-linux-instrumented-make: build-codec-linux-debugging-make: rules: - - if: $CI_JOB_NAME == 'pages' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH @@ -909,9 +903,7 @@ build-codec-linux-debugging-make: build-codec-windows-msbuild: rules: - - if: $CI_JOB_NAME == 'pages' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH -- GitLab From 027155f5e7083a465cb1950cf85f6f1d6c28ceba Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 14 Jul 2025 14:50:54 +0200 Subject: [PATCH 1222/1310] Fix for non-set LOGS_BACKUP_SOURCE_DIR --- .gitlab-ci.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3b3957c70..1aea80f40 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1671,11 +1671,15 @@ ivas-long-term-job-logs: # Clean up logs - if [ -d "logs" ]; then rm -rf "logs"; fi # Inject logs from backup copy if LOGS_BACKUP_SOURCE_DIR is set - - if [ -d "$LOGS_BACKUP_SOURCE_DIR" ]; then - - cp -r $LOGS_BACKUP_SOURCE_DIR/logs . + - if [ "$LOGS_BACKUP_SOURCE_DIR" != "" ]; then + - cp_ret=0 + - cp -r $LOGS_BACKUP_SOURCE_DIR/logs ./ || cp_ret=$? + - if [ "$cp_ret" != 0 ]; then + - echo "Error -- Copying to $LOGS_BACKUP_SOURCE_DIR failed!" + - exit 1 + - fi - fi - # handle case where the job is running for the first time. e.g where the job was not found. - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - echo "Job name from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" @@ -1685,7 +1689,8 @@ ivas-long-term-job-logs: # If there is overlap between injected log and new log, use the new logs. - unzip -o artifacts.zip - else - # create logs dir if it doesn't exist + # create logs dir if it doesn't exist (should only happen in first run) + - echo "Could not find previous job, creating empty logs folder. If this is not the first run, an error likely happened!" - mkdir logs - fi @@ -1751,10 +1756,10 @@ backup-long-term-job-logs: # Store logs as backup copy if LOGS_BACKUP_TARGET_DIR is set - if [ -d "$LOGS_BACKUP_TARGET_DIR" ]; then - cp -r logs $LOGS_BACKUP_TARGET_DIR - - exit 0; + - exit 0 - else - echo "Error - LOGS_BACKUP_TARGET_DIR not set for backup job!" - - exit -1; + - exit 1 - fi -- GitLab From be56131768ac11b1da1faeeacef2c62d664a6c00 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 14 Jul 2025 16:00:54 +0530 Subject: [PATCH 1223/1310] Fix for 3GPP issue 1805: Regression, spike in BASOP decoder MASA LTV at 64 kbps and 16 kHz input Link #1805 --- lib_com/options.h | 2 ++ lib_dec/dec_tcx_fx.c | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 73144fdac..4f498c158 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -141,4 +141,6 @@ #define FIX_1818_WRONG_PIT_INIT /* VA: Fix wrong pitch initialization */ +#define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ + #endif diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index a35db1f8e..8009c69e0 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -5646,7 +5646,12 @@ void decoder_tcx_tns_fx( test(); test(); test(); +#ifdef NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT + test(); + IF( ( NE_16( hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns, 0 ) && NE_16( bfi, 1 ) && whitenedDomain ) || GT_16( L_spec, L_frameTCX ) ) +#else IF( ( NE_16( hTcxCfg->fIsTNSAllowed, 0 ) && NE_16( fUseTns, 0 ) && NE_16( bfi, 1 ) ) || GT_16( L_spec, L_frameTCX ) ) +#endif { L = L_spec; move16(); @@ -5700,7 +5705,12 @@ void decoder_tcx_tns_fx( IF( EQ_16( L_frame, shr( st->L_frame, 1 ) ) && st->tcxonly != 0 && isTCX5 != 0 ) { test(); +#ifdef NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT + test(); + IF( st->element_mode == EVS_MONO || ( LT_16( L_spec, L_frameTCX ) && !whitenedDomain ) ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ +#else IF( st->element_mode == EVS_MONO || LT_16( L_spec, L_frameTCX ) ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ +#endif { tcx5TnsUngrouping_fx( shr( L_frameTCX, 1 ), shr( hTcxCfg->tnsConfig[0][0].iFilterBorders[0], 1 ), x_fx, DEC ); tmp = L_frameTCX; -- GitLab From 3c0cda94d0f4fce4ef06ca20a8c261c333c7fc7c Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 15 Jul 2025 12:06:39 +0530 Subject: [PATCH 1224/1310] Edit variables.yml to test against 3gpp_issue_1805_floatcode_fix reference This change will be reverted after testing --- .gitlab-ci/variables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 96ef1f507..3e9c1e57b 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -1,6 +1,6 @@ variables: EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" - FLOAT_REF_BRANCH: "ivas-float-update" + FLOAT_REF_BRANCH: "3gpp_issue_1805_floatcode_fix" SCRIPTS_DIR: "/usr/local/scripts" LONG_TEST_SUITE: "tests/codec_be_on_mr_nonselection tests/renderer --param_file scripts/config/self_test_ltv.prm --use_ltv" LONG_TEST_SUITE_NO_RENDERER: "tests/codec_be_on_mr_nonselection --param_file scripts/config/self_test_ltv.prm --use_ltv" -- GitLab From 6fd44de77a9b1f08b7688b67ca9e3e6db7c5b73d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 15 Jul 2025 13:56:44 +0530 Subject: [PATCH 1225/1310] Revert variables.yml change --- .gitlab-ci/variables.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 3e9c1e57b..96ef1f507 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -1,6 +1,6 @@ variables: EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" - FLOAT_REF_BRANCH: "3gpp_issue_1805_floatcode_fix" + FLOAT_REF_BRANCH: "ivas-float-update" SCRIPTS_DIR: "/usr/local/scripts" LONG_TEST_SUITE: "tests/codec_be_on_mr_nonselection tests/renderer --param_file scripts/config/self_test_ltv.prm --use_ltv" LONG_TEST_SUITE_NO_RENDERER: "tests/codec_be_on_mr_nonselection --param_file scripts/config/self_test_ltv.prm --use_ltv" -- GitLab From 24a16072958365c020eeb1e1b010ee3a8a1717c1 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 15 Jul 2025 14:55:18 +0530 Subject: [PATCH 1226/1310] Fix for 3GPP issue 1778: Different codebook precision at encoder and decoder for McMASA and MASA Link #1778 Combined McMASA_LFEGain_vectors_fx_q13 and McMASA_LFEGain_vectors_fx_q25 into McMASA_LFEGain_vectors_fx maintained in Q25. --- lib_com/ivas_rom_com_fx.c | 14 +------------- lib_com/ivas_rom_com_fx.h | 3 +-- lib_dec/ivas_masa_dec_fx.c | 10 +++++----- lib_enc/ivas_masa_enc_fx.c | 2 +- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/lib_com/ivas_rom_com_fx.c b/lib_com/ivas_rom_com_fx.c index 1cfe1ff6c..b64ac5635 100644 --- a/lib_com/ivas_rom_com_fx.c +++ b/lib_com/ivas_rom_com_fx.c @@ -483,20 +483,8 @@ const Word32 dft_res_gains_q_fx[][2] = { }; -// Q13 -const Word16 McMASA_LFEGain_vectors_fx_q13[64] = { - 3113, 2703, 1556, 1638, -1311, -1802, -2867, -2785, - 4096, 4096, 4096, 4096, -6554, -3277, 8356, 819, - -4096, -4096, -4096, -4096, -4588, -983, -6390, 11141, - -8356, 9667, -4669, 2703, 5898, -9257, 7946, -5079, - -7455, 7619, 8192, -9011, 14172, -1884, -6390, -6881, - 7782, -13107, -2785, 7619, 7127, 3850, -15565, 4260, - 5489, 11633, -7946, -10158, 6799, 4751, 4997, -16712, - -6554, -12943, 6717, 11633, -17531, 2130, 6881, 8356 -}; - // Q25 -const Word32 McMASA_LFEGain_vectors_fx_q25[64] = { +const Word32 McMASA_LFEGain_vectors_fx[64] = { 12750684, 11072963, 6375342, 6710886, /* 1st bit */ -5368709, -7381975, -11744051, -11408507, 16777216, 16777216, 16777216, 16777216, /* 2nd bit*/ diff --git a/lib_com/ivas_rom_com_fx.h b/lib_com/ivas_rom_com_fx.h index 3344a35d2..2619a3f26 100644 --- a/lib_com/ivas_rom_com_fx.h +++ b/lib_com/ivas_rom_com_fx.h @@ -56,8 +56,7 @@ extern const Word16 dft_trigo_12k8_fx[STEREO_DFT_N_12k8_ENC / 4 + 1]; extern const Word16 dft_trigo_32k_fx[STEREO_DFT_N_32k_ENC / 4 + 1]; extern const Word16 dft_trigo_48k_fx[STEREO_DFT_N_MAX_ENC / 4 + 1]; extern const Word16 gridEq_Table[NO_THETA16_MAX]; -extern const Word16 McMASA_LFEGain_vectors_fx_q13[64]; -extern const Word32 McMASA_LFEGain_vectors_fx_q25[64]; +extern const Word32 McMASA_LFEGain_vectors_fx[64]; /* Q25 */ extern const Word16 ivas_divde_255[256]; diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index 457c040c3..6363bdf74 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -1533,11 +1533,11 @@ static Word16 decode_lfe_to_total_energy_ratio_fx( } ELSE { - tmp16 = shr( McMASA_LFEGain_vectors_fx_q13[4 * lfeToTotalEnergyRatioIndices[2] + i], 1 ); /* Q12 */ - tmp16 = add( log2LFEaverage_fx, tmp16 ); /* Q12 */ - tmp32 = BASOP_util_Pow2( L_deposit_h( tmp16 ), 15 - Q12, &exp ); /* Q(31 - exp) */ - tmp16 = round_fx( tmp32 ); /* Q(31-exp) -> Q(15 - exp) */ - hMasaLfeSynth->lfeToTotalEnergyRatio_fx[i] = shr_sat( tmp16, sub( 1, exp ) ); /* should saturate. Q(15 - exp) - (1 - exp) -> Q14 */ + tmp16 = shr( extract_l( L_shr_r( McMASA_LFEGain_vectors_fx[4 * lfeToTotalEnergyRatioIndices[2] + i], Q12 ) ), 1 ); /* Q12 */ + tmp16 = add( log2LFEaverage_fx, tmp16 ); /* Q12 */ + tmp32 = BASOP_util_Pow2( L_deposit_h( tmp16 ), 15 - Q12, &exp ); /* Q(31 - exp) */ + tmp16 = round_fx( tmp32 ); /* Q(31-exp) -> Q(15 - exp) */ + hMasaLfeSynth->lfeToTotalEnergyRatio_fx[i] = shr_sat( tmp16, sub( 1, exp ) ); /* should saturate. Q(15 - exp) - (1 - exp) -> Q14 */ move16(); } diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 35c57c42b..b87bcf88b 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -2842,7 +2842,7 @@ static Word16 encode_lfe_to_total_energy_ratio_fx( IF( VQLevels > 0 ) { - lfeToTotalEnergyRatioIndices[2] = vquant_ivas_fx( log2LFEratio, 0, xqv, McMASA_LFEGain_vectors_fx_q25, 4, VQLevels ); + lfeToTotalEnergyRatioIndices[2] = vquant_ivas_fx( log2LFEratio, 0, xqv, McMASA_LFEGain_vectors_fx, 4, VQLevels ); move16(); } } -- GitLab From d7fd73405197a5e802f73c6e7f357ed8d7a49247 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 16 Jul 2025 15:14:43 +0530 Subject: [PATCH 1227/1310] Bug fix: Scaling issue fix in CNG_enc_ivas_fx Link #1775 Fixes issue at time frame 16s-18s in #1775 --- lib_enc/cng_enc_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/cng_enc_fx.c b/lib_enc/cng_enc_fx.c index 6dc3963f8..ed3663732 100644 --- a/lib_enc/cng_enc_fx.c +++ b/lib_enc/cng_enc_fx.c @@ -1261,11 +1261,11 @@ void CNG_enc_ivas_fx( move16(); /* Temp variables for floating point functions */ - lp_ener_thr_scale = 8; /* 4.0f*/ /* Q2 */ + lp_ener_thr_scale = 8; /* 4.0f*/ /* Q1 */ move16(); if ( st_fx->element_mode != EVS_MONO ) { - lp_ener_thr_scale = 7; /* 3.5f;*/ /* Q2 */ + lp_ener_thr_scale = 7; /* 3.5f;*/ /* Q1 */ move16(); } @@ -1634,7 +1634,7 @@ void CNG_enc_ivas_fx( IF( hTdCngEnc->burst_ho_cnt > 0 ) { /**allow_cn_step |= ( hDtxEnc->first_CNG || st->element_mode == EVS_MONO ) && ( hTdCngEnc->ho_ener_hist[hTdCngEnc->ho_hist_ptr] > lp_ener_thr_scale * hTdCngEnc->lp_ener );*/ - w_temp = W_msu_32_16( W_shl( W_deposit32_l( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr] ), 1 ), hTdCngEnc->lp_ener_fx, lp_ener_thr_scale ); /*Q7*/ + w_temp = W_msu_32_16( W_shl( W_deposit32_l( hTdCngEnc->ho_ener_hist_fx[hTdCngEnc->ho_hist_ptr] ), 2 ), hTdCngEnc->lp_ener_fx, lp_ener_thr_scale ); /*Q8*/ test(); test(); -- GitLab From fca13dbc7f379ce2301e365145ec40efd46ab443 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 16 Jul 2025 12:10:12 +0200 Subject: [PATCH 1228/1310] apply clang-format --- lib_dec/ivas_dirac_dec_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 0337643f0..3ffcde306 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1883,8 +1883,8 @@ void ivas_qmetadata_to_dirac_fx( } /* for ( block =...) */ - } /* for ( band = ...) */ - } /* for ( idx_sec = ...)*/ + } /* for ( band = ...) */ + } /* for ( idx_sec = ...)*/ /* Bands not transmitted -> zeroed*/ FOR( b = band_grouping[band]; b < hSpatParamRendCom->num_freq_bands; b++ ) @@ -3940,8 +3940,8 @@ void ivas_dirac_dec_render_sf_fx( const Word32 azi_fx = L_shl( az1_32, Q22 - Q16 ); // Q16 -> Q22 const Word32 ele_fx = L_shl( el1_32, Q22 - Q16 ); // Q16 -> Q22 #else - const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 - const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 + const Word32 azi_fx = L_shl( az1, Q22 ); // Q0 -> Q22 + const Word32 ele_fx = L_shl( el1, Q22 ); // Q0 -> Q22 #endif efap_determine_gains_fx( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains_fx[i], azi_fx, ele_fx, EFAP_MODE_EFAP ); } -- GitLab From 2442c7da345f011c83f362f624affe18e6122aec Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 14 Jul 2025 11:38:58 +0530 Subject: [PATCH 1229/1310] Fix for 3GPP issue 784: BASOP decoder without JBM not BE to BASOP decoder with zero-delay profile Link #784 --- lib_dec/ivas_jbm_dec_fx.c | 14 ++-- lib_dec/ivas_mc_param_dec_fx.c | 5 +- lib_dec/jbm_pcmdsp_apa_fx.c | 116 ++++++++++++++++++--------------- 3 files changed, 73 insertions(+), 62 deletions(-) diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index d00a9fe80..0cc6f1828 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -4066,15 +4066,15 @@ void ivas_jbm_dec_copy_tc_no_tsm_fx( &cldfb_real_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], &cldfb_imag_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch], &Q_tc ); - IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) MC_FORMAT ) ) - { - st_ivas->hParamMC->Cldfb_RealBuffer_tc_e = sub( 31, Q_tc ); - st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = sub( 31, Q_tc ); - move16(); - move16(); - } } } + IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) MC_FORMAT ) ) + { + st_ivas->hParamMC->Cldfb_RealBuffer_tc_e = 25; // 31-Q_tc = 31-(11-5) + st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = 25; // 31-Q_tc = 31-(11-5) + move16(); + move16(); + } } hTcBuffer->n_samples_rendered = 0; move16(); diff --git a/lib_dec/ivas_mc_param_dec_fx.c b/lib_dec/ivas_mc_param_dec_fx.c index 71c1b39fc..e20610dab 100644 --- a/lib_dec/ivas_mc_param_dec_fx.c +++ b/lib_dec/ivas_mc_param_dec_fx.c @@ -528,12 +528,15 @@ ivas_error ivas_param_mc_dec_open_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } set32_fx( hParamMC->Cldfb_RealBuffer_tc_fx, 0, cldfb_buf_size ); + hParamMC->Cldfb_RealBuffer_tc_e = 25; // Q6 , Initialised with Q6 to match non jbm and jbm cases + move16(); IF( ( hParamMC->Cldfb_ImagBuffer_tc_fx = (Word32 *) malloc( cldfb_buf_size * sizeof( Word32 ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); } set32_fx( hParamMC->Cldfb_ImagBuffer_tc_fx, 0, cldfb_buf_size ); - + hParamMC->Cldfb_ImagBuffer_tc_e = 25; // Q6 , Initialised with Q6 to match non jbm and jbm cases + move16(); hParamMC->sz = imult1616( imult1616( n_cldfb_slots, nchan_transport ), hParamMC->num_freq_bands ); move16(); diff --git a/lib_dec/jbm_pcmdsp_apa_fx.c b/lib_dec/jbm_pcmdsp_apa_fx.c index e2528e619..e98e7781a 100644 --- a/lib_dec/jbm_pcmdsp_apa_fx.c +++ b/lib_dec/jbm_pcmdsp_apa_fx.c @@ -962,72 +962,81 @@ UWord8 apa_exec_ivas_fx( } ELSE { - Word16 a_tmp[APA_BUF]; - Word16 *buf_out_ptr = &( ps->buf_out_fx[ps->l_buf_out - ps->l_frm] ); - Word16 *frm_in_ptr = &( frm_in[ps->l_frm] ); - - Q_a_out = s_min( Q_a_out, ps->Q_buf_out ); - FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) - { - a_tmp[i] = extract_h( L_shl( a_in[i], add( Q_a_out, Q5 ) ) ); // Q_a_out - move16(); - } - Scale_sig( ps->buf_out_fx, ps->buf_out_capacity, sub( Q_a_out, ps->Q_buf_out ) ); // Q_buf_out -> Q_a_out - - /* fill input frame */ - /* 1st input frame: previous output samples */ - FOR( i = 0; i < ps->l_frm; i++ ) - { - frm_in[i] = buf_out_ptr[i]; - move16(); - } - /* 2nd input frame: new input samples */ - FOR( i = 0; i < ps->l_frm; i++ ) - { - frm_in_ptr[i] = a_tmp[i]; - move16(); - } - /* no scaling */ IF( EQ_32( ps->scale, 100 ) ) { - copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); - } - /* shrink */ - ELSE IF( LT_32( ps->scale, 100 ) ) - { - shrink_frm_ivas_fx( ps, frm_in, maxScaling, a_tmp, Q_a_out, &l_frm_out ); + FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) + { + a_out[i] = a_in[i]; // Q11 + move32(); + } + l_frm_out = ps->l_frm; + move16(); } - /* extend */ ELSE { - extend_frm_ivas_fx( ps, frm_in, a_tmp, Q_a_out, &l_frm_out ); - } - /* control the amount/frequency of scaling */ - IF( NE_32( l_frm_out, ps->l_frm ) ) - { - test(); - IF( ( maxScaling != 0 ) && - GT_32( abs_s( extract_l( L_sub( ps->l_frm, l_frm_out ) ) ), maxScaling ) ) + + Word16 a_tmp[APA_BUF]; + Word16 *buf_out_ptr = &( ps->buf_out_fx[ps->l_buf_out - ps->l_frm] ); + Word16 *frm_in_ptr = &( frm_in[ps->l_frm] ); + + Q_a_out = s_min( Q_a_out, ps->Q_buf_out ); + FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) { - /* maxScaling exceeded -> discard scaled frame */ - copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); + a_tmp[i] = extract_h( L_shl( a_in[i], add( Q_a_out, Q5 ) ) ); // Q_a_out + move16(); } - ELSE IF( GT_32( L_abs( l_frm_out_target ), ps->l_frm ) ) /* ignore small difference */ + Scale_sig( ps->buf_out_fx, ps->buf_out_capacity, sub( Q_a_out, ps->Q_buf_out ) ); // Q_buf_out -> Q_a_out + + /* fill input frame */ + /* 1st input frame: previous output samples */ + FOR( i = 0; i < ps->l_frm; i++ ) { - dl_copied = L_sub( l_frm_out_target, ps->l_frm ); - dl_scaled = L_sub( l_frm_out_target, l_frm_out ); - /* discard scaled frame if copied frame is closer to target length */ - IF( LT_32( L_abs( dl_copied ), L_abs( dl_scaled ) ) ) + frm_in[i] = buf_out_ptr[i]; + move16(); + } + /* 2nd input frame: new input samples */ + FOR( i = 0; i < ps->l_frm; i++ ) + { + frm_in_ptr[i] = a_tmp[i]; + move16(); + } + /* shrink */ + IF( LT_32( ps->scale, 100 ) ) + { + shrink_frm_ivas_fx( ps, frm_in, maxScaling, a_tmp, Q_a_out, &l_frm_out ); + } + /* extend */ + ELSE + { + extend_frm_ivas_fx( ps, frm_in, a_tmp, Q_a_out, &l_frm_out ); + } + /* control the amount/frequency of scaling */ + IF( NE_32( l_frm_out, ps->l_frm ) ) + { + test(); + IF( ( maxScaling != 0 ) && + GT_32( abs_s( extract_l( L_sub( ps->l_frm, l_frm_out ) ) ), maxScaling ) ) { + /* maxScaling exceeded -> discard scaled frame */ copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); } + ELSE IF( GT_32( L_abs( l_frm_out_target ), ps->l_frm ) ) /* ignore small difference */ + { + dl_copied = L_sub( l_frm_out_target, ps->l_frm ); + dl_scaled = L_sub( l_frm_out_target, l_frm_out ); + /* discard scaled frame if copied frame is closer to target length */ + IF( LT_32( L_abs( dl_copied ), L_abs( dl_scaled ) ) ) + { + copy_frm_fx( ps, frm_in, a_tmp, &l_frm_out ); + } + } } - } - FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) - { - a_out[i] = L_shl( a_tmp[i], sub( Q11, Q_a_out ) ); // Q0 -> Q11 - move32(); + FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) + { + a_out[i] = L_shl( a_tmp[i], sub( Q11, Q_a_out ) ); // Q0 -> Q11 + move32(); + } } } @@ -1532,7 +1541,6 @@ static bool copy_frm_fx( return 0; } - /* ******************************************************************************** * -- GitLab From ac07b6eeead95ce22113b73ed0138b32a0850407 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 16 Jul 2025 16:11:56 +0530 Subject: [PATCH 1230/1310] Fix for high MLD observed with some STV test cases --- lib_dec/jbm_pcmdsp_apa_fx.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib_dec/jbm_pcmdsp_apa_fx.c b/lib_dec/jbm_pcmdsp_apa_fx.c index e98e7781a..0321a6495 100644 --- a/lib_dec/jbm_pcmdsp_apa_fx.c +++ b/lib_dec/jbm_pcmdsp_apa_fx.c @@ -962,6 +962,11 @@ UWord8 apa_exec_ivas_fx( } ELSE { + Word16 a_tmp[APA_BUF]; + Word16 *buf_out_ptr = &( ps->buf_out_fx[ps->l_buf_out - ps->l_frm] ); + + Q_a_out = s_min( Q_a_out, ps->Q_buf_out ); + Scale_sig( ps->buf_out_fx, ps->buf_out_capacity, sub( Q_a_out, ps->Q_buf_out ) ); // Q_buf_out -> Q_a_out IF( EQ_32( ps->scale, 100 ) ) { FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) @@ -974,19 +979,13 @@ UWord8 apa_exec_ivas_fx( } ELSE { - - Word16 a_tmp[APA_BUF]; - Word16 *buf_out_ptr = &( ps->buf_out_fx[ps->l_buf_out - ps->l_frm] ); Word16 *frm_in_ptr = &( frm_in[ps->l_frm] ); - Q_a_out = s_min( Q_a_out, ps->Q_buf_out ); FOR( i = 0; i < ps->num_channels * APA_BUF_PER_CHANNEL; i++ ) { a_tmp[i] = extract_h( L_shl( a_in[i], add( Q_a_out, Q5 ) ) ); // Q_a_out move16(); } - Scale_sig( ps->buf_out_fx, ps->buf_out_capacity, sub( Q_a_out, ps->Q_buf_out ) ); // Q_buf_out -> Q_a_out - /* fill input frame */ /* 1st input frame: previous output samples */ FOR( i = 0; i < ps->l_frm; i++ ) -- GitLab From 974ff5f4d9028120ffbc0201feee8098aa715e04 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 16 Jul 2025 17:35:11 +0530 Subject: [PATCH 1231/1310] Fix for 3GPP issue 1823: Decoder segfault for Stereo at 24.4 / 32 kbps FER in ivas_spec_ana_fx() Link #1823 --- lib_dec/FEC_HQ_phase_ecu_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index 7c4c91936..4be003ecb 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -1440,7 +1440,7 @@ static void ivas_spec_ana_fx( man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); } - *pXfp++ = shr( man, expoBy2 ); + *pXfp++ = shr_sat( man, expoBy2 ); move16(); /* Denormalize the mantissa back to Q0. */ } } @@ -2138,7 +2138,7 @@ static void ivas_subst_spec_fx( move16(); im = *pImX; move16(); - tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); + tmp = sub_sat( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); IF( LT_16( alpha[k], 32766 ) ) { -- GitLab From 6b8a3beba2de47ca92257c18c3e72a8bc442cad3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 16 Jul 2025 17:38:30 +0530 Subject: [PATCH 1232/1310] Binaural renderer optimization - non bit exact changes Around 6 WMOPs reduction observed for multichannel test case. MLD deviation < 1. --- lib_com/options.h | 1 + lib_dec/ivas_binRenderer_internal_fx.c | 722 +++++++++++++------------ 2 files changed, 385 insertions(+), 338 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4f498c158..396d21f6c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,6 +81,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V3_NBE #define OPT_MCT_ENC_V2_BE +#define OPT_BIN_REND_V2_NBE #define OPT_MCH_DEC_V1_NBE #define OPT_MASA_DEC_V1_NBE #define OPT_MASA_DEC_V2_NBE diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index efd9d0c67..5c2c73026 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -72,12 +72,17 @@ static void ivas_binRenderer_filterModule_fx( Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStatesLeft; move16(); - // to be checked: feasibility with 32 bit buffers +#ifdef OPT_BIN_REND_V2_NBE + shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); + hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; +#else /* OPT_BIN_REND_V2_NBE */ Word64 Cldfb_RealBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; Word64 Cldfb_ImagBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; +#endif /* OPT_BIN_REND_V2_NBE */ FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { +#ifndef OPT_BIN_REND_V2_NBE set64_fx( &Cldfb_RealBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); set64_fx( &Cldfb_ImagBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); @@ -91,6 +96,7 @@ static void ivas_binRenderer_filterModule_fx( filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 +#endif /* OPT_BIN_REND_V2_NBE */ FOR( k = 0; k < numTimeSlots; k++ ) { Word64 outRealLeft_fx = 0, outRealRight_fx = 0, outImagLeft_fx = 0, outImagRight_fx = 0; @@ -98,469 +104,509 @@ static void ivas_binRenderer_filterModule_fx( move64(); move64(); move64(); +#ifdef OPT_BIN_REND_V2_NBE + Word64 outRealLeft = 0, outRealRight = 0, outImagLeft = 0, outImagRight = 0; + move64(); + move64(); + move64(); + move64(); - FOR( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - filterStatesLeftRealPtr_fx[tapIdx] = filterStatesLeftRealPtr_fx[tapIdx - 1]; - move32(); - filterStatesLeftImagPtr_fx[tapIdx] = filterStatesLeftImagPtr_fx[tapIdx - 1]; - move32(); - Word32 neg_filterStatesLeftImagPtr_fx = L_negate( filterStatesLeftImagPtr_fx[tapIdx] ); - - - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, neg_filterStatesLeftImagPtr_fx, filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx][0] ); + filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx][0] ); - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 + filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 + filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 + filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 +#endif /* OPT_BIN_REND_V2_NBE */ - outRealRight_fx = W_mac_32_32( outRealRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outRealRight_fx = W_mac_32_32( outRealRight_fx, neg_filterStatesLeftImagPtr_fx, filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - - outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates - } + FOR( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) + { + filterStatesLeftRealPtr_fx[tapIdx] = filterStatesLeftRealPtr_fx[tapIdx - 1]; + move32(); + filterStatesLeftImagPtr_fx[tapIdx] = filterStatesLeftImagPtr_fx[tapIdx - 1]; + move32(); + Word32 neg_filterStatesLeftImagPtr_fx = L_negate( filterStatesLeftImagPtr_fx[tapIdx] ); - shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); - IF( shift_q != 0 ) - { - outRealLeft_fx = W_shr( outRealLeft_fx, shift_q ); // Q_curr + Q29 - outImagLeft_fx = W_shr( outImagLeft_fx, shift_q ); // Q_curr + Q29 - outRealRight_fx = W_shr( outRealRight_fx, shift_q ); // Q_curr + Q29 - outImagRight_fx = W_shr( outImagRight_fx, shift_q ); // Q_curr + Q29 - hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; - move16(); - } + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, neg_filterStatesLeftImagPtr_fx, filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - filterStatesLeftRealPtr_fx[0] = CLDFB_real[chIdx][k][bandIdx]; - move32(); - filterStatesLeftImagPtr_fx[0] = CLDFB_imag[chIdx][k][bandIdx]; - move32(); + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsLeftImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsLeftRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealRight_fx = W_mac_32_32( outRealRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outRealRight_fx = W_mac_32_32( outRealRight_fx, neg_filterStatesLeftImagPtr_fx, filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates - /* Left Real and Imag */ + outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftRealPtr_fx[tapIdx], filterTapsRightImagPtr_fx[tapIdx] ); // Q30 + Q_filterStates + outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates + } - Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); // Q_curr -1 - Word32 temp2 = L_shr( filterStatesLeftImagPtr_fx[0], 1 ); // Q_curr -1 - Word32 neg_temp2 = L_negate( temp2 ); // Q_curr -1 +#ifndef OPT_BIN_REND_V2_NBE + shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); + IF( shift_q != 0 ) + { + outRealLeft_fx = W_shr( outRealLeft_fx, shift_q ); // Q_curr + Q29 + outImagLeft_fx = W_shr( outImagLeft_fx, shift_q ); // Q_curr + Q29 + outRealRight_fx = W_shr( outRealRight_fx, shift_q ); // Q_curr + Q29 + outImagRight_fx = W_shr( outImagRight_fx, shift_q ); // Q_curr + Q29 + hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; + move16(); + } +#endif /* OPT_BIN_REND_V2_NBE */ + filterStatesLeftRealPtr_fx[0] = CLDFB_real[chIdx][k][bandIdx]; + move32(); + filterStatesLeftImagPtr_fx[0] = CLDFB_imag[chIdx][k][bandIdx]; + move32(); - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, temp1, filterTapsLeftRealPtr_fx[0] ); - outRealLeft_fx = W_mac_32_32( outRealLeft_fx, neg_temp2, filterTapsLeftImagPtr_fx[0] ); - Cldfb_RealBuffer_64fx[0][k] = W_add( Cldfb_RealBuffer_64fx[0][k], outRealLeft_fx ); // Q29 + Q_curr - move64(); - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp1, filterTapsLeftImagPtr_fx[0] ); - outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp2, filterTapsLeftRealPtr_fx[0] ); - Cldfb_ImagBuffer_64fx[0][k] = W_add( Cldfb_ImagBuffer_64fx[0][k], outImagLeft_fx ); // Q29 + Q_curr - move64(); +#ifdef OPT_BIN_REND_V2_NBE + /* Left Real and Imag */ + Word32 neg_temp2 = L_negate( filterStatesLeftImagPtr_fx[0] ); // Q_curr -1 - /* Right Real and Imag */ - outRealRight_fx = W_mac_32_32( outRealRight_fx, temp1, filterTapsRightRealPtr_fx[0] ); - outRealRight_fx = W_mac_32_32( outRealRight_fx, neg_temp2, filterTapsRightImagPtr_fx[0] ); - Cldfb_RealBuffer_64fx[1][k] = W_add( Cldfb_RealBuffer_64fx[1][k], outRealRight_fx ); // Q29 + Q_curr - move64(); + outRealLeft = W_mac_32_32( W_mac_32_32( outRealLeft, filterStatesLeftRealPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), neg_temp2, filterTapsLeftImagPtr_fx[0] ); + outImagLeft = W_mac_32_32( W_mac_32_32( outImagLeft, filterStatesLeftImagPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsLeftImagPtr_fx[0] ); - outImagRight_fx = W_mac_32_32( outImagRight_fx, temp1, filterTapsRightImagPtr_fx[0] ); - outImagRight_fx = W_mac_32_32( outImagRight_fx, temp2, filterTapsRightRealPtr_fx[0] ); - Cldfb_ImagBuffer_64fx[1][k] = W_add( Cldfb_ImagBuffer_64fx[1][k], outImagRight_fx ); // Q29 + Q_curr - move64(); - } - } - FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) - { - FOR( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) - { - out_Conv_CLDFB_real[chIdx][k][bandIdx] = W_shl_sat_l( Cldfb_RealBuffer_64fx[chIdx][k], shift_q6 ); // Q6 + /* Right Real and Imag */ + outRealRight = W_mac_32_32( W_mac_32_32( outRealRight, neg_temp2, filterTapsRightImagPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightRealPtr_fx[0] ); + outImagRight = W_mac_32_32( W_mac_32_32( outImagRight, filterStatesLeftImagPtr_fx[0], filterTapsRightRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightImagPtr_fx[0] ); + } + out_Conv_CLDFB_real[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealLeft_fx, shift_q ), W_shr( outRealLeft, 1 ) ), shift_q6 ); + out_Conv_CLDFB_real[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealRight_fx, shift_q ), W_shr( outRealRight, 1 ) ), shift_q6 ); + out_Conv_CLDFB_imag[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagLeft_fx, shift_q ), W_shr( outImagLeft, 1 ) ), shift_q6 ); + out_Conv_CLDFB_imag[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagRight_fx, shift_q ), W_shr( outImagRight, 1 ) ), shift_q6 ); + move32(); + move32(); move32(); - out_Conv_CLDFB_imag[chIdx][k][bandIdx] = W_shl_sat_l( Cldfb_ImagBuffer_64fx[chIdx][k], shift_q6 ); // Q6 move32(); } +#else /* OPT_BIN_REND_V2_NBE */ + /* Left Real and Imag */ + + Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); // Q_curr -1 + Word32 temp2 = L_shr( filterStatesLeftImagPtr_fx[0], 1 ); // Q_curr -1 + Word32 neg_temp2 = L_negate( temp2 ); // Q_curr -1 + + + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, temp1, filterTapsLeftRealPtr_fx[0] ); + outRealLeft_fx = W_mac_32_32( outRealLeft_fx, neg_temp2, filterTapsLeftImagPtr_fx[0] ); + Cldfb_RealBuffer_64fx[0][k] = W_add( Cldfb_RealBuffer_64fx[0][k], outRealLeft_fx ); // Q29 + Q_curr + move64(); + + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp1, filterTapsLeftImagPtr_fx[0] ); + outImagLeft_fx = W_mac_32_32( outImagLeft_fx, temp2, filterTapsLeftRealPtr_fx[0] ); + Cldfb_ImagBuffer_64fx[0][k] = W_add( Cldfb_ImagBuffer_64fx[0][k], outImagLeft_fx ); // Q29 + Q_curr + move64(); + + /* Right Real and Imag */ + outRealRight_fx = W_mac_32_32( outRealRight_fx, temp1, filterTapsRightRealPtr_fx[0] ); + outRealRight_fx = W_mac_32_32( outRealRight_fx, neg_temp2, filterTapsRightImagPtr_fx[0] ); + Cldfb_RealBuffer_64fx[1][k] = W_add( Cldfb_RealBuffer_64fx[1][k], outRealRight_fx ); // Q29 + Q_curr + move64(); + + outImagRight_fx = W_mac_32_32( outImagRight_fx, temp1, filterTapsRightImagPtr_fx[0] ); + outImagRight_fx = W_mac_32_32( outImagRight_fx, temp2, filterTapsRightRealPtr_fx[0] ); + Cldfb_ImagBuffer_64fx[1][k] = W_add( Cldfb_ImagBuffer_64fx[1][k], outImagRight_fx ); // Q29 + Q_curr + move64(); } } - - - return; -} - -/*------------------------------------------------------------------------- - * ivas_binRenderer_convModuleOpen() - * - * Open convolution module handle of fastconv binaural renderer - *-------------------------------------------------------------------------*/ -static ivas_error ivas_binRenderer_convModuleOpen( - BINAURAL_RENDERER_HANDLE hBinRenderer, - const Word16 renderer_type, - const Word16 isLoudspeaker, - const AUDIO_CONFIG input_config, - const HRTFS_FASTCONV_HANDLE hHrtf ) -{ - Word16 bandIdx, chIdx; - - BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; - - /*-----------------------------------------------------------------* - * prepare library opening - *-----------------------------------------------------------------*/ - - IF( ( hBinRenConvModule = (BINRENDERER_CONV_MODULE_HANDLE_FX) malloc( sizeof( BINRENDERER_CONV_MODULE_FX ) ) ) == NULL ) + FOR( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + FOR( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) + { + out_Conv_CLDFB_real[chIdx][k][bandIdx] = W_shl_sat_l( Cldfb_RealBuffer_64fx[chIdx][k], shift_q6 ); // Q6 + move32(); + out_Conv_CLDFB_imag[chIdx][k][bandIdx] = W_shl_sat_l( Cldfb_ImagBuffer_64fx[chIdx][k], shift_q6 ); // Q6 + move32(); + } } +#endif /* OPT_BIN_REND_V2_NBE */ + } - IF( !isLoudspeaker ) - { - hBinRenderer->nInChannels = audioCfg2channels( input_config ); - move16(); - } - ELSE - { - /* Note: needs to be revisited if multiple LFE support is required */ - hBinRenderer->nInChannels = sub( audioCfg2channels( input_config ), isLoudspeaker ); - move16(); + + return; } - IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + /*------------------------------------------------------------------------- + * ivas_binRenderer_convModuleOpen() + * + * Open convolution module handle of fastconv binaural renderer + *-------------------------------------------------------------------------*/ + static ivas_error ivas_binRenderer_convModuleOpen( + BINAURAL_RENDERER_HANDLE hBinRenderer, + const Word16 renderer_type, + const Word16 isLoudspeaker, + const AUDIO_CONFIG input_config, + const HRTFS_FASTCONV_HANDLE hHrtf ) { - hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; - move16(); + Word16 bandIdx, chIdx; - /* Use variable order filtering */ - bandIdx = 0; - move16(); - FOR( ; bandIdx < 5; bandIdx++ ) - { - hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; - move16(); - } - FOR( ; bandIdx < 10; bandIdx++ ) + BINRENDERER_CONV_MODULE_HANDLE_FX hBinRenConvModule; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + IF( ( hBinRenConvModule = (BINRENDERER_CONV_MODULE_HANDLE_FX) malloc( sizeof( BINRENDERER_CONV_MODULE_FX ) ) ) == NULL ) { - hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_6; - move16(); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - FOR( ; bandIdx < 20; bandIdx++ ) + + IF( !isLoudspeaker ) { - hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_5; + hBinRenderer->nInChannels = audioCfg2channels( input_config ); move16(); } - FOR( ; bandIdx < 30; bandIdx++ ) + ELSE { - hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_4; + /* Note: needs to be revisited if multiple LFE support is required */ + hBinRenderer->nInChannels = sub( audioCfg2channels( input_config ), isLoudspeaker ); move16(); } - FOR( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + + IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_3; + hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; move16(); - } - } - ELSE - { - IF( EQ_16( hBinRenderer->ivas_format, SBA_FORMAT ) ) - { - hBinRenConvModule->numTaps = BINAURAL_NTAPS_SBA; + + /* Use variable order filtering */ + bandIdx = 0; move16(); + FOR( ; bandIdx < 5; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; + move16(); + } + FOR( ; bandIdx < 10; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_6; + move16(); + } + FOR( ; bandIdx < 20; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_5; + move16(); + } + FOR( ; bandIdx < 30; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_4; + move16(); + } + FOR( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = NUM_TAPS_F0_3; + move16(); + } } ELSE { - hBinRenConvModule->numTaps = BINAURAL_NTAPS; - move16(); - } + IF( EQ_16( hBinRenderer->ivas_format, SBA_FORMAT ) ) + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS_SBA; + move16(); + } + ELSE + { + hBinRenConvModule->numTaps = BINAURAL_NTAPS; + move16(); + } - /* Use fixed order filtering */ - bandIdx = 0; - move16(); - FOR( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; + /* Use fixed order filtering */ + bandIdx = 0; move16(); + FOR( ; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + hBinRenConvModule->numTapsArray[bandIdx] = hBinRenConvModule->numTaps; + move16(); + } } - } - - /* allocate memory for filter states */ - IF( ( hBinRenConvModule->filterTapsLeftReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - IF( ( hBinRenConvModule->filterTapsLeftImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - IF( ( hBinRenConvModule->filterTapsRightReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - IF( ( hBinRenConvModule->filterTapsRightImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } - - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - IF( ( hBinRenConvModule->filterTapsLeftReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + /* allocate memory for filter states */ + IF( ( hBinRenConvModule->filterTapsLeftReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterTapsLeftImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterTapsLeftImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterTapsRightReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterTapsRightReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterTapsRightImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterTapsRightImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - } + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + IF( ( hBinRenConvModule->filterTapsLeftReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } - IF( ( hBinRenConvModule->filterStatesLeftReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } + IF( ( hBinRenConvModule->filterTapsLeftImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } - IF( ( hBinRenConvModule->filterStatesLeftImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); - } + IF( ( hBinRenConvModule->filterTapsRightReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + IF( ( hBinRenConvModule->filterTapsRightImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); + } + } - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + + IF( ( hBinRenConvModule->filterStatesLeftReal_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftImag_fx = (Word32 ***) malloc( hBinRenderer->conv_band * sizeof( Word32 ** ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { - IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) + IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx] = (Word32 **) malloc( hBinRenderer->nInChannels * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - } - } - /* set memories */ - FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) - { - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - Word16 tmp = 0; - move16(); - IF( isLoudspeaker ) + + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_5_1 ) ) - { - tmp = channelIndex_CICP6[chIdx]; - move16(); - } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_7_1 ) ) - { - tmp = channelIndex_CICP12[chIdx]; - move16(); - } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_5_1_2 ) ) - { - tmp = channelIndex_CICP14[chIdx]; - move16(); - } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_5_1_4 ) ) - { - tmp = channelIndex_CICP16[chIdx]; - move16(); - } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_7_1_4 ) ) + IF( ( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) { - tmp = channelIndex_CICP19[chIdx]; - move16(); + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } - } - IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - /* set the memories to zero */ - set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); - set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); - hBinRenConvModule->Q_filterStatesLeft = 31; - move16(); - IF( isLoudspeaker ) + IF( ( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx] = (Word32 *) malloc( hBinRenConvModule->numTapsArray[bandIdx] * sizeof( Word32 ) ) ) == NULL ) { - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftBRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftBRIRImag_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightBRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightBRIRImag_fx[bandIdx][tmp]; + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Convolution Module \n" ) ); } } - ELSE + } + /* set memories */ + FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) + { + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { - /* set the memories to zero */ - set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); - set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); - hBinRenConvModule->Q_filterStatesLeft = 31; + Word16 tmp = 0; move16(); + IF( isLoudspeaker ) { - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_fx[bandIdx][tmp]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_fx[bandIdx][tmp]; - } - ELSE - { - IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_HOA3 ) ) + IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_5_1 ) ) + { + tmp = channelIndex_CICP6[chIdx]; + move16(); + } + ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_7_1 ) ) + { + tmp = channelIndex_CICP12[chIdx]; + move16(); + } + ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_5_1_2 ) ) + { + tmp = channelIndex_CICP14[chIdx]; + move16(); + } + ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_5_1_4 ) ) + { + tmp = channelIndex_CICP16[chIdx]; + move16(); + } + ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_7_1_4 ) ) { - /* HOA3 filter coefficients */ - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3_fx[bandIdx][chIdx]; + tmp = channelIndex_CICP19[chIdx]; + move16(); } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_HOA2 ) ) + } + + IF( EQ_16( renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + /* set the memories to zero */ + set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); + set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTapsArray[bandIdx] ); + hBinRenConvModule->Q_filterStatesLeft = 31; + move16(); + IF( isLoudspeaker ) { - /* HOA2 filter coefficients */ - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftBRIRReal_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftBRIRImag_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightBRIRReal_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightBRIRImag_fx[bandIdx][tmp]; } - ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_FOA ) ) + } + ELSE + { + /* set the memories to zero */ + set32_fx( hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); + set32_fx( hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx], 0, hBinRenConvModule->numTaps ); + hBinRenConvModule->Q_filterStatesLeft = 31; + move16(); + IF( isLoudspeaker ) { - /* FOA filter coefficients */ - hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA_fx[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_fx[bandIdx][tmp]; + hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_fx[bandIdx][tmp]; } ELSE { - return IVAS_ERR_INVALID_INPUT_FORMAT; + IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_HOA3 ) ) + { + /* HOA3 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3_fx[bandIdx][chIdx]; + } + ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_HOA2 ) ) + { + /* HOA2 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2_fx[bandIdx][chIdx]; + } + ELSE IF( EQ_16( input_config, IVAS_AUDIO_CONFIG_FOA ) ) + { + /* FOA filter coefficients */ + hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA_fx[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA_fx[bandIdx][chIdx]; + } + ELSE + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } } } } } - } - - - hBinRenderer->hBinRenConvModule = hBinRenConvModule; - - return IVAS_ERR_OK; -} -/*-------------------------------------------------------------------------* - * ivas_init_binaural_hrtf() - * - * initialize memory for HrtfFastConv structure elements - *-------------------------------------------------------------------------*/ -void ivas_init_binaural_hrtf_fx( - HRTFS_FASTCONV *HrtfFastConv /* i/o: FASTCONV HRTF structure */ -) -{ - Word16 i; - HrtfFastConv->leftHRIRReal_HOA3_fx = NULL; - HrtfFastConv->leftHRIRImag_HOA3_fx = NULL; - HrtfFastConv->rightHRIRReal_HOA3_fx = NULL; - HrtfFastConv->rightHRIRImag_HOA3_fx = NULL; - HrtfFastConv->FASTCONV_HOA3_latency_s_fx = 0; - move32(); + hBinRenderer->hBinRenConvModule = hBinRenConvModule; - HrtfFastConv->leftHRIRReal_fx = NULL; - HrtfFastConv->leftHRIRImag_fx = NULL; - HrtfFastConv->rightHRIRReal_fx = NULL; - HrtfFastConv->rightHRIRImag_fx = NULL; - HrtfFastConv->FASTCONV_HRIR_latency_s_fx = 0; - move32(); + return IVAS_ERR_OK; + } - HrtfFastConv->leftBRIRReal_fx = NULL; - HrtfFastConv->leftBRIRImag_fx = NULL; - HrtfFastConv->rightBRIRReal_fx = NULL; - HrtfFastConv->rightBRIRImag_fx = NULL; - HrtfFastConv->FASTCONV_BRIR_latency_s_fx = 0; - move32(); + /*-------------------------------------------------------------------------* + * ivas_init_binaural_hrtf() + * + * initialize memory for HrtfFastConv structure elements + *-------------------------------------------------------------------------*/ + void ivas_init_binaural_hrtf_fx( + HRTFS_FASTCONV * HrtfFastConv /* i/o: FASTCONV HRTF structure */ + ) + { + Word16 i; - HrtfFastConv->leftHRIRReal_HOA2_fx = NULL; - HrtfFastConv->leftHRIRImag_HOA2_fx = NULL; - HrtfFastConv->rightHRIRReal_HOA2_fx = NULL; - HrtfFastConv->rightHRIRImag_HOA2_fx = NULL; - HrtfFastConv->FASTCONV_HOA2_latency_s_fx = 0; - move32(); + HrtfFastConv->leftHRIRReal_HOA3_fx = NULL; + HrtfFastConv->leftHRIRImag_HOA3_fx = NULL; + HrtfFastConv->rightHRIRReal_HOA3_fx = NULL; + HrtfFastConv->rightHRIRImag_HOA3_fx = NULL; + HrtfFastConv->FASTCONV_HOA3_latency_s_fx = 0; + move32(); - HrtfFastConv->leftHRIRReal_FOA_fx = NULL; - HrtfFastConv->leftHRIRImag_FOA_fx = NULL; - HrtfFastConv->rightHRIRReal_FOA_fx = NULL; - HrtfFastConv->rightHRIRImag_FOA_fx = NULL; - HrtfFastConv->FASTCONV_FOA_latency_s_fx = 0; - move32(); + HrtfFastConv->leftHRIRReal_fx = NULL; + HrtfFastConv->leftHRIRImag_fx = NULL; + HrtfFastConv->rightHRIRReal_fx = NULL; + HrtfFastConv->rightHRIRImag_fx = NULL; + HrtfFastConv->FASTCONV_HRIR_latency_s_fx = 0; + move32(); - HrtfFastConv->allocate_init_flag = 0; - move16(); + HrtfFastConv->leftBRIRReal_fx = NULL; + HrtfFastConv->leftBRIRImag_fx = NULL; + HrtfFastConv->rightBRIRReal_fx = NULL; + HrtfFastConv->rightBRIRImag_fx = NULL; + HrtfFastConv->FASTCONV_BRIR_latency_s_fx = 0; + move32(); - FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) - { - HrtfFastConv->fastconvReverberationTimes_fx[i] = 0; + HrtfFastConv->leftHRIRReal_HOA2_fx = NULL; + HrtfFastConv->leftHRIRImag_HOA2_fx = NULL; + HrtfFastConv->rightHRIRReal_HOA2_fx = NULL; + HrtfFastConv->rightHRIRImag_HOA2_fx = NULL; + HrtfFastConv->FASTCONV_HOA2_latency_s_fx = 0; move32(); - HrtfFastConv->fastconvReverberationEneCorrections_fx[i] = 0; + + HrtfFastConv->leftHRIRReal_FOA_fx = NULL; + HrtfFastConv->leftHRIRImag_FOA_fx = NULL; + HrtfFastConv->rightHRIRReal_FOA_fx = NULL; + HrtfFastConv->rightHRIRImag_FOA_fx = NULL; + HrtfFastConv->FASTCONV_FOA_latency_s_fx = 0; move32(); - } - return; -} + HrtfFastConv->allocate_init_flag = 0; + move16(); -/*-------------------------------------------------------------------------* - * ivas_alloc_pppMem() - * - * Allocate memory for tripple pointer elements - *-------------------------------------------------------------------------*/ -static ivas_error ivas_alloc_pppMem_fx( - Word32 ****pppMem, /*Qx*/ - const Word16 dim1, - const Word16 dim2, - const Word16 dim3, - const Word16 allocate_init_flag ) -{ - Word16 i, j; - Word32 ***localMem = NULL; + FOR( i = 0; i < CLDFB_NO_CHANNELS_MAX; i++ ) + { + HrtfFastConv->fastconvReverberationTimes_fx[i] = 0; + move32(); + HrtfFastConv->fastconvReverberationEneCorrections_fx[i] = 0; + move32(); + } - IF( ( localMem = (Word32 ***) malloc( dim1 * sizeof( Word32 ** ) ) ) == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); + return; } - FOR( i = 0; i < dim1; i++ ){ - IF( ( localMem[i] = (Word32 **) malloc( dim2 * sizeof( Word32 * ) ) ) == NULL ){ - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); -} -IF( allocate_init_flag == 0 ) -{ - FOR( j = 0; j < dim2; j++ ) + /*-------------------------------------------------------------------------* + * ivas_alloc_pppMem() + * + * Allocate memory for tripple pointer elements + *-------------------------------------------------------------------------*/ + static ivas_error ivas_alloc_pppMem_fx( + Word32 * ***pppMem, /*Qx*/ + const Word16 dim1, + const Word16 dim2, + const Word16 dim3, + const Word16 allocate_init_flag ) { - IF( ( localMem[i][j] = (Word32 *) malloc( dim3 * sizeof( Word32 ) ) ) == NULL ) + Word16 i, j; + Word32 ***localMem = NULL; + + IF( ( localMem = (Word32 ***) malloc( dim1 * sizeof( Word32 ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); } + + FOR( i = 0; i < dim1; i++ ){ + IF( ( localMem[i] = (Word32 **) malloc( dim2 * sizeof( Word32 * ) ) ) == NULL ){ + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); + } + IF( allocate_init_flag == 0 ) + { + FOR( j = 0; j < dim2; j++ ) + { + IF( ( localMem[i][j] = (Word32 *) malloc( dim3 * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for HRTF memory" ); + } + } } -} } *pppMem = localMem; -- GitLab From 0557ff21f6afd8215d2f22007f11e7cbf67b913d Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 16 Jul 2025 17:42:25 +0200 Subject: [PATCH 1233/1310] Add one more bit headroom to product, to avoid assert failure in getSqrtWord32() for values larger than 0x3FFEC004. --- lib_com/options.h | 2 ++ lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 396d21f6c..48d8593c8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -144,4 +144,6 @@ #define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ +#define FIX_1824 + #endif diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index baad5c561..f9ac53b62 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -113,9 +113,15 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, sumXX = L_shl( sumXX, normX ); normY = norm_l( sumYY ); sumYY = L_shl( sumYY, normY ); +#ifdef FIX_1824 + product = L_shr(L_mult0( extract_h( sumXX ), extract_h( sumYY ) ), 1 ); + normXY = add( normX, normY ); + normXY = sub( normXY, 32 + 1 ); +#else product = L_mult0( extract_h( sumXX ), extract_h( sumYY ) ); normXY = add( normX, normY ); normXY = sub( normXY, 32 ); +#endif /* change norm to factor of 2 */ IF( s_and( normXY, 0x1 ) != 0 ) -- GitLab From c772a10ef9cb5eb8794d5b59287dce404e964358 Mon Sep 17 00:00:00 2001 From: Manuel Jander Date: Wed, 16 Jul 2025 17:49:35 +0200 Subject: [PATCH 1234/1310] Clang format --- lib_dec/jbm_pcmdsp_similarityestimation_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c index f9ac53b62..7015022eb 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation_fx.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation_fx.c @@ -114,7 +114,7 @@ Word16 normalized_cross_correlation_self_fx( const Word16 *signal, normY = norm_l( sumYY ); sumYY = L_shl( sumYY, normY ); #ifdef FIX_1824 - product = L_shr(L_mult0( extract_h( sumXX ), extract_h( sumYY ) ), 1 ); + product = L_shr( L_mult0( extract_h( sumXX ), extract_h( sumYY ) ), 1 ); normXY = add( normX, normY ); normXY = sub( normXY, 32 + 1 ); #else -- GitLab From bd37b471626ba0330e22e64cf54fbc68997bf687 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 17 Jul 2025 13:51:50 +0530 Subject: [PATCH 1235/1310] Multichannel encoder optmizations - bit exact Optimizations made in ivas_find_enr, dot_product_cholesky_fixed, tcx_res_Q_spec_ivas_fx, tcx_noise_factor_ivas_fx, IGF_getCrest_new_fx Around 2.2 WMOPs reduction observed. Changes are bit exact --- lib_com/ivas_tools_fx.c | 10 ++++++ lib_com/options.h | 1 + lib_enc/analy_sp_fx.c | 22 ++++++++++++ lib_enc/igf_enc.c | 4 +++ lib_enc/ivas_sns_enc_fx.c | 2 +- lib_enc/tcx_utils_enc_fx.c | 71 +++++++++++++++++++++++++++----------- 6 files changed, 89 insertions(+), 21 deletions(-) diff --git a/lib_com/ivas_tools_fx.c b/lib_com/ivas_tools_fx.c index e334a8cda..a1b484f6d 100644 --- a/lib_com/ivas_tools_fx.c +++ b/lib_com/ivas_tools_fx.c @@ -606,7 +606,9 @@ Word64 dot_product_cholesky_fixed( { Word16 i, j; Word64 suma, tmp_sum; +#ifndef OPT_MCT_ENC_V3_BE Word32 mul; +#endif Word32 tmp; const Word32 *pt_x, *pt_A; pt_A = A; @@ -621,12 +623,20 @@ Word64 dot_product_cholesky_fixed( FOR( j = 0; j <= i; j++ ) { +#ifdef OPT_MCT_ENC_V3_BE + tmp_sum = W_add( tmp_sum, Mpy_32_32( *pt_x++, *pt_A++ ) ); +#else mul = Mpy_32_32( *pt_x++, *pt_A++ ); tmp_sum = W_add( tmp_sum, W_deposit32_l( mul ) ); +#endif } +#ifdef OPT_MCT_ENC_V3_BE + tmp = W_shl_sat_l( tmp_sum, -4 ); // to make sure that the tmp_sum will not overflow +#else tmp_sum = W_shr( tmp_sum, 4 ); // to make sure that the tmp_sum will not overflow tmp = W_extract_l( tmp_sum ); +#endif suma = W_mac_32_32( suma, tmp, tmp ); } diff --git a/lib_com/options.h b/lib_com/options.h index 48d8593c8..90f1239d8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -79,6 +79,7 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ +#define OPT_MCT_ENC_V3_BE #define OPT_MCT_ENC_V3_NBE #define OPT_MCT_ENC_V2_BE #define OPT_BIN_REND_V2_NBE diff --git a/lib_enc/analy_sp_fx.c b/lib_enc/analy_sp_fx.c index 0d42e5ff2..48ed114c7 100644 --- a/lib_enc/analy_sp_fx.c +++ b/lib_enc/analy_sp_fx.c @@ -727,6 +727,9 @@ static void ivas_find_enr( Word32 min_ener; Word16 shift = 0; move16(); +#ifdef OPT_MCT_ENC_V3_BE + Word16 tmp_shift; +#endif ptR = &data[1]; /* first real */ ptI = &data[L_FFT - 1]; /* first imaginary */ @@ -756,13 +759,20 @@ static void ivas_find_enr( freq = BIN_FREQ_FX; move16(); +#ifdef OPT_MCT_ENC_V3_BE + tmp_shift = sub( -Q16, shift ); // 16 - shift - 32 +#endif FOR( i = 0; i < voic_band; i++ ) /* up to maximum allowed voiced critical band */ { band_ener = 0; move64(); start_freq = freq; move16(); +#ifdef OPT_MCT_ENC_V3_BE + FOR( ; LE_32( freq, crit_bands_fx[i] ); ) +#else WHILE( LE_32( freq, crit_bands_fx[i] ) ) +#endif { /* *ptE = *ptR * *ptR + *ptI * *ptI; @@ -795,7 +805,11 @@ static void ivas_find_enr( freq = add( freq, BIN_FREQ_FX ); } +#ifdef OPT_MCT_ENC_V3_BE + band[i] = W_shl_sat_l( band_ener, tmp_shift ); // *q_band +#else band[i] = W_extract_h( W_shl( band_ener, sub( Q16, shift ) ) ); // *q_band +#endif move32(); band_energies[i] = band[i]; /* per band energy without E_MIN */ // *q_band @@ -820,7 +834,11 @@ static void ivas_find_enr( move64(); start_freq = freq; move16(); +#ifdef OPT_MCT_ENC_V3_BE + FOR( ; LE_32( freq, crit_bands_fx[i] ); ) +#else WHILE( LE_32( freq, crit_bands_fx[i] ) ) +#endif { /* *Bin_E = *ptR * *ptR + *ptI * *ptI; @@ -851,7 +869,11 @@ static void ivas_find_enr( freq = add( freq, BIN_FREQ_FX ); } +#ifdef OPT_MCT_ENC_V3_BE + band[i] = W_shl_sat_l( band_ener, tmp_shift ); // *q_band +#else band[i] = W_extract_h( W_shl_nosat( band_ener, sub( Q16, shift ) ) ); // *q_band +#endif move32(); band_energies[i] = band[i]; /* per band energy without E_MIN */ // *q_band diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 7da9fa6cf..0a01dfe66 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -135,7 +135,11 @@ static Word16 IGF_getCrest_new_fx( { x = logSpec[i]; move16(); +#ifdef OPT_MCT_ENC_V3_BE + x_eff = L_mac0( x_eff, x, x ); +#else x_eff = L_add( x_eff, L_mult0( x, x ) ); +#endif if ( GT_16( x, x_max ) ) { diff --git a/lib_enc/ivas_sns_enc_fx.c b/lib_enc/ivas_sns_enc_fx.c index e74e2297c..610f39b1b 100644 --- a/lib_enc/ivas_sns_enc_fx.c +++ b/lib_enc/ivas_sns_enc_fx.c @@ -258,7 +258,7 @@ static Word16 sns_1st_cod_fx( } /* for second split shift by five bits to store both indices as one 10 bit value */ - IF( EQ_16( split, 1 ) ) + if ( EQ_16( split, 1 ) ) { index_split = shl( index_split, 5 ); } diff --git a/lib_enc/tcx_utils_enc_fx.c b/lib_enc/tcx_utils_enc_fx.c index 6ce40b00e..cd4c07297 100644 --- a/lib_enc/tcx_utils_enc_fx.c +++ b/lib_enc/tcx_utils_enc_fx.c @@ -2725,15 +2725,15 @@ void tcx_noise_factor_ivas_fx( IF( LE_16( nTransWidth, 3 ) ) { tmp2 = sub( k, c1 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_mac( n, nTransWidth_1, (Word16) 0x8000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], c2 ); } @@ -2741,15 +2741,15 @@ void tcx_noise_factor_ivas_fx( ELSE { tmp2 = sub( k, 12 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_sub( n, 0x70000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], 1152 /*0.03515625f Q15*/ ); } @@ -2777,7 +2777,7 @@ void tcx_noise_factor_ivas_fx( } ELSE /* current line is zero, so update pointers & segment sum */ { - IF( LT_16( win, nTransWidth ) ) + if ( LT_16( win, nTransWidth ) ) { win = add( win, 1 ); } @@ -2794,15 +2794,15 @@ void tcx_noise_factor_ivas_fx( IF( LE_16( nTransWidth, 3 ) ) { tmp2 = sub( k, c1 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_mac( n, nTransWidth_1, (Word16) 0x8000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], c2 ); } @@ -2810,15 +2810,15 @@ void tcx_noise_factor_ivas_fx( ELSE { tmp2 = sub( k, 12 ); - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_msu( n, k, (Word16) 0x8000 ); } - IF( tmp2 > 0 ) + if ( tmp2 > 0 ) { n = L_sub( n, 0x70000 ); } - IF( tmp2 <= 0 ) + if ( tmp2 <= 0 ) { n = L_mac( n, int_sqr[k], 1152 /*0.03515625f Q15*/ ); } @@ -3663,7 +3663,10 @@ Word16 tcx_res_Q_spec_ivas_fx( Word16 s, s2, lf_deemph_factor; Word16 c; Word32 thres; - +#ifdef OPT_MCT_ENC_V3_BE + Word16 cmp_1, cmp_2; + Word32 tmp32_1, tmp32_2; +#endif /* Limit the number of residual bits */ sqTargetBits = s_min( sqTargetBits, NPRM_RESQ ); @@ -3679,16 +3682,28 @@ Word16 tcx_res_Q_spec_ivas_fx( move16(); s2 = sub( x_Q_e, 1 ); +#ifdef OPT_MCT_ENC_V3_BE + cmp_1 = sub( sqTargetBits, kMaxEstimatorUndershoot ); + cmp_2 = s_min( NPRM_RESQ, add( sqTargetBits, kMaxEstimatorOvershoot ) ); +#endif FOR( i = 0; i < L_frame; i++ ) { +#ifdef OPT_MCT_ENC_V3_BE + IF( GE_16( bits, cmp_1 ) ) +#else IF( GE_16( bits, sub( sqTargetBits, kMaxEstimatorUndershoot ) ) ) +#endif { fac_m = 0; move16(); fac_p = 0; move16(); +#ifdef OPT_MCT_ENC_V3_BE + IF( GE_16( bits, cmp_2 ) ) +#else IF( GE_16( bits, s_min( NPRM_RESQ, add( sqTargetBits, kMaxEstimatorOvershoot ) ) ) ) +#endif { BREAK; } @@ -3700,11 +3715,11 @@ Word16 tcx_res_Q_spec_ivas_fx( { tmp1 = L_add( x_orig[i], 0 ); tmp2 = Mpy_32_16_1( x_Q[i], sqGain ); - IF( s > 0 ) + if ( s > 0 ) { tmp2 = L_shr( tmp2, s ); } - IF( s < 0 ) + if ( s < 0 ) { tmp1 = L_shl( tmp1, s ); } @@ -3721,11 +3736,11 @@ Word16 tcx_res_Q_spec_ivas_fx( move16(); bits = add( bits, 1 ); - IF( x_Q[i] > 0 ) + if ( x_Q[i] > 0 ) { tmp1 = L_mult( fac_m, lf_deemph_factor ); } - IF( x_Q[i] < 0 ) + if ( x_Q[i] < 0 ) { tmp1 = L_mult( fac_p, lf_deemph_factor ); } @@ -3738,11 +3753,11 @@ Word16 tcx_res_Q_spec_ivas_fx( move16(); bits = add( bits, 1 ); - IF( x_Q[i] > 0 ) + if ( x_Q[i] > 0 ) { tmp1 = L_mult( fac_p, lf_deemph_factor ); } - IF( x_Q[i] < 0 ) + if ( x_Q[i] < 0 ) { tmp1 = L_mult( fac_m, lf_deemph_factor ); } @@ -3755,12 +3770,17 @@ Word16 tcx_res_Q_spec_ivas_fx( /*Quantize zeroed-line of the spectrum*/ c = sub( 21627 /*0.66f Q15*/, mult_r( sq_round, 21627 /*0.66f Q15*/ ) ); +#ifdef OPT_MCT_ENC_V3_BE + FOR( i = 0; ( i < L_frame ) && ( bits < ( sqTargetBits - 2 ) ); i++ ) + { +#else FOR( i = 0; i < L_frame; i++ ) { IF( GE_16( bits, sub( sqTargetBits, 2 ) ) ) { BREAK; } +#endif test(); test(); @@ -3777,8 +3797,15 @@ Word16 tcx_res_Q_spec_ivas_fx( tmp1 = Mpy_32_16_1( thres, sqGain ); +#ifdef OPT_MCT_ENC_V3_BE + tmp32_1 = L_shl( x_orig[i], sub( x_orig_e, shift_tmp ) ); + tmp32_2 = L_shl( tmp1, sub( sqGain_e, shift_tmp ) ); + IF( GT_32( tmp32_1, tmp32_2 ) ) + { +#else IF( GT_32( L_shl( x_orig[i], sub( x_orig_e, shift_tmp ) ), L_shl( tmp1, sub( sqGain_e, shift_tmp ) ) ) ) { +#endif prm[bits] = 1; move16(); bits = add( bits, 1 ); @@ -3790,7 +3817,11 @@ Word16 tcx_res_Q_spec_ivas_fx( x_Q[i] = L_shl( thres, sub( 1, x_Q_e ) ); move32(); } +#ifdef OPT_MCT_ENC_V3_BE + ELSE IF( L_add( tmp32_1, tmp32_2 ) < 0 ) +#else ELSE IF( L_add( L_shl( x_orig[i], sub( x_orig_e, shift_tmp ) ), L_shl( tmp1, sub( sqGain_e, shift_tmp ) ) ) < 0 ) +#endif { prm[bits] = 1; move16(); -- GitLab From 2e53256c06f6101ea4c8e2a8675b1b0e4a6be470 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 17 Jul 2025 15:30:56 +1000 Subject: [PATCH 1236/1310] fix for issue 1822 --- lib_com/options.h | 1 + lib_rend/ivas_dirac_output_synthesis_dec_fx.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 90f1239d8..14b1c5eb8 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -146,5 +146,6 @@ #define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ #define FIX_1824 +#define FIX_1822 #endif diff --git a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c index a0fa343a2..e8700e223 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec_fx.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec_fx.c @@ -1023,9 +1023,17 @@ void ivas_dirac_dec_output_synthesis_process_slot_fx( move16(); } } +#ifdef FIX_1822 + diff = L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_fx, ONE_IN_Q27 /*1 Q27*/ ); + diff = L_shl( diff, 2 ); // Q29 +#endif FOR( ; k < num_freq_bands; k++ ) { +#ifdef FIX_1822 + sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], diff ); // Q = q_diffuseness - 1 +#else sqr_inp = Madd_32_32( One_in_qdiff, diffuseness[k], L_sub( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr_fx, ONE_IN_Q29 /*1 Q29*/ ) ); // Q = q_diffuseness - 1 +#endif sqr_exp = sq_e; move16(); sqr = Sqrt32( sqr_inp, &sqr_exp ); /*Q(31-sqr_exp)*/ -- GitLab From 97cdbd047413bd169364c773311795b9ccbf07e7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 17 Jul 2025 16:36:16 +0530 Subject: [PATCH 1237/1310] Fix for 3GPP issue 1784: High frequency noise on binaural room reverb output for main and main-pc branch Link #1784 --- lib_rend/ivas_reverb_fft_filter_fx.c | 3 +++ lib_rend/ivas_reverb_fx.c | 26 ++++++++++++++++++++++++-- lib_rend/ivas_stat_rend.h | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_reverb_fft_filter_fx.c b/lib_rend/ivas_reverb_fft_filter_fx.c index bbe077f8b..09720d202 100644 --- a/lib_rend/ivas_reverb_fft_filter_fx.c +++ b/lib_rend/ivas_reverb_fft_filter_fx.c @@ -232,6 +232,9 @@ void ivas_reverb_t2f_f2t_ClearHistory( move32(); } + t2f_f2t->prev_shift = 31; + move16(); + return; } /*-----------------------------------------------------------------------------------------* diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 9ea501f10..b90cfa91a 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -1824,6 +1824,7 @@ static void reverb_block_fx( Word32 pTemp_fx[INNER_BLK_SIZE]; Word32 *ppOutput_fx[IVAS_REV_MAX_NR_BRANCHES]; Word32 Output_fx[IVAS_REV_MAX_NR_BRANCHES][INNER_BLK_SIZE]; + Word16 shift; move16(); move16(); move16(); @@ -1894,6 +1895,27 @@ static void reverb_block_fx( } } + shift = s_min( L_norm_arr( pOut0_fx, hReverb->fft_filter_ols.block_size ), L_norm_arr( pOut1_fx, hReverb->fft_filter_ols.block_size ) ); + + IF( LT_16( shift, hReverb->fft_filter_ols.prev_shift ) ) + { + scale_sig32( pOut0_fx, hReverb->fft_filter_ols.block_size, shift ); + scale_sig32( pOut1_fx, hReverb->fft_filter_ols.block_size, shift ); + scale_sig32( hReverb->fft_filter_ols.fft_history_L_fx, hReverb->fft_filter_ols.hist_size, sub( shift, hReverb->fft_filter_ols.prev_shift ) ); + scale_sig32( hReverb->fft_filter_ols.fft_history_R_fx, hReverb->fft_filter_ols.hist_size, sub( shift, hReverb->fft_filter_ols.prev_shift ) ); + + hReverb->fft_filter_ols.prev_shift = shift; + move16(); + } + ELSE + { + scale_sig32( pOut0_fx, hReverb->fft_filter_ols.block_size, hReverb->fft_filter_ols.prev_shift ); + scale_sig32( pOut1_fx, hReverb->fft_filter_ols.block_size, hReverb->fft_filter_ols.prev_shift ); + + shift = hReverb->fft_filter_ols.prev_shift; + move16(); + } + Word16 r_shift; r_shift = add( find_guarded_bits_fx( hReverb->fft_filter_ols.fft_size ), 1 ); // Applying guard bits for the DoRTFT inside the post_fft_filter function @@ -1913,9 +1935,9 @@ static void reverb_block_fx( FOR( k = 0; k < hReverb->fft_filter_ols.block_size; k++ ) { - pOut0_fx[k] = (Word32) L_shl( pOut0_fx[k], 1 ); + pOut0_fx[k] = (Word32) L_shl( pOut0_fx[k], sub( 1, shift ) ); move32(); - pOut1_fx[k] = (Word32) L_shl( pOut1_fx[k], 1 ); + pOut1_fx[k] = (Word32) L_shl( pOut1_fx[k], sub( 1, shift ) ); move32(); } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index f8dad9a66..9f853102d 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -895,6 +895,7 @@ typedef struct ivas_reverb_t2f_f2t_t Word32 fft_history_L_fx[RV_FILTER_MAX_HISTORY]; // float fft_history_R[RV_FILTER_MAX_HISTORY]; Word32 fft_history_R_fx[RV_FILTER_MAX_HISTORY]; + Word16 prev_shift; } ivas_reverb_t2f_f2t_t; /* FFT filter with its frequency response coefficients */ -- GitLab From 6ea80024df77b2923d69be8e00238b6321420481 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 22 Jul 2025 09:14:49 +0200 Subject: [PATCH 1238/1310] Keep same commit in pipelines --- .gitlab-ci.yml | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9482f081f..9b0ffb3b4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -238,8 +238,13 @@ stages: .build-merge-target-binaries: &build-merge-target-binaries - current_commit_sha=$(git rev-parse HEAD) ### build merge target binaries - - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME + - if [ -f $MERGE_REQUEST_TARGET_FILE ]; then + - MERGE_REQUEST_TARGET=$(echo $MERGE_REQUEST_TARGET_FILE) + - else + - echo "MERGE_REQUEST_TARGET_FILE does not exist, exiting!" + - exit 1 + - fi + - git checkout $MERGE_REQUEST_TARGET - *activate-debug-mode-info-if-set - make clean - make -j >> /dev/null @@ -496,6 +501,9 @@ stages: .test-job-linux: tags: - ivas-linux + needs: + - job: branch-is-up-to-date-with-target-pre + - artifacts: true .build-job-linux: stage: build @@ -1065,6 +1073,12 @@ branch-is-up-to-date-with-target-pre: echo "Your branch is behind the target branch, run 'git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME' to update." exit 1 fi + - git fetch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME + - TARGET_COMMIT=$(git rev-parse origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) + - echo "TARGET_COMMIT is $TARGET_COMMIT" + - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE + artifacts: + - $MERGE_TARGET_COMMIT_FILE branch-is-up-to-date-with-target-post: extends: @@ -1078,8 +1092,11 @@ branch-is-up-to-date-with-target-post: - | if [ $commits_behind_count -ne 0 ]; then echo "Your branch is behind the target branch, possibly main changed during your pipeline run, run 'git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME' to update." - exit 1 + exit 123 fi + allow_failure: + exit_codes: + - 123 # fail pipeline in the final stage for pipelines on Draft MRs # this also only runs on Draft MRs, so should always fail @@ -1126,6 +1143,12 @@ branch-is-up-to-date-with-target-pre: echo -e "Your branch is $commits_behind_count commits behind the target branch, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 1 fi + - git fetch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME + - TARGET_COMMIT=$(git rev-parse origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) + - echo "TARGET_COMMIT is $TARGET_COMMIT" + - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE + artifacts: + - $MERGE_TARGET_COMMIT_FILE branch-is-up-to-date-with-target-post: extends: @@ -1138,8 +1161,11 @@ branch-is-up-to-date-with-target-post: - | if [ $commits_behind_count -ne 0 ]; then echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." - exit 1 + exit 123 fi + allow_failure: + exit_codes: + - 123 clang-format-check: extends: -- GitLab From 63d9b9e93004e12533da587f3d04fc8d86c81fc4 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 22 Jul 2025 09:22:03 +0200 Subject: [PATCH 1239/1310] Fix syntax error for artifact --- .gitlab-ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9b0ffb3b4..1a87d0e44 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1078,7 +1078,8 @@ branch-is-up-to-date-with-target-pre: - echo "TARGET_COMMIT is $TARGET_COMMIT" - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE artifacts: - - $MERGE_TARGET_COMMIT_FILE + paths: + - $MERGE_TARGET_COMMIT_FILE branch-is-up-to-date-with-target-post: extends: @@ -1148,7 +1149,8 @@ branch-is-up-to-date-with-target-pre: - echo "TARGET_COMMIT is $TARGET_COMMIT" - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE artifacts: - - $MERGE_TARGET_COMMIT_FILE + paths: + - $MERGE_TARGET_COMMIT_FILE branch-is-up-to-date-with-target-post: extends: -- GitLab From 34e13b27475d8582675bf996b732ba2453324c54 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 22 Jul 2025 13:47:44 +0200 Subject: [PATCH 1240/1310] Added .test-job-linux-needs-fixed-target --- .gitlab-ci.yml | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1a87d0e44..0e8e32361 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -501,10 +501,14 @@ stages: .test-job-linux: tags: - ivas-linux + +.test-job-linux-needs-fixed-target: + extends: .test-job-linux needs: - job: branch-is-up-to-date-with-target-pre - artifacts: true + .build-job-linux: stage: build timeout: "2 minutes" @@ -1410,6 +1414,7 @@ lc3-wrapper-unit-test: split-rendering-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir + - .test-job-linux-needs-fixed-target - .rules-merge-request-to-main-pc needs: ["build-codec-linux-make"] timeout: "60 minutes" @@ -1503,7 +1508,7 @@ split-rendering-pytest-on-merge-request: check-be-to-target-short-enc-0db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1517,7 +1522,7 @@ check-be-to-target-short-enc-0db: check-be-to-target-short-enc-+10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1531,7 +1536,7 @@ check-be-to-target-short-enc-+10db: check-be-to-target-short-enc--10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1545,7 +1550,7 @@ check-be-to-target-short-enc--10db: check-be-to-target-short-dec-0db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1559,7 +1564,7 @@ check-be-to-target-short-dec-0db: check-be-to-target-short-dec-+10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1573,7 +1578,7 @@ check-be-to-target-short-dec-+10db: check-be-to-target-short-dec--10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1592,7 +1597,7 @@ check-regressions-short-enc-0db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1609,7 +1614,7 @@ check-regressions-short-enc-+10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1626,7 +1631,7 @@ check-regressions-short-enc--10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1643,7 +1648,7 @@ check-regressions-short-dec-0db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1660,7 +1665,7 @@ check-regressions-short-dec-+10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1677,7 +1682,7 @@ check-regressions-short-dec--10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux + - .test-job-linux-needs-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 -- GitLab From 87147385ffb5efa3d59404b9b748afcd22d0ad4b Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 22 Jul 2025 13:51:56 +0200 Subject: [PATCH 1241/1310] Fix fetch --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0e8e32361..8fbdb32a3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1077,7 +1077,7 @@ branch-is-up-to-date-with-target-pre: echo "Your branch is behind the target branch, run 'git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME' to update." exit 1 fi - - git fetch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME + - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - TARGET_COMMIT=$(git rev-parse origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) - echo "TARGET_COMMIT is $TARGET_COMMIT" - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE @@ -1148,7 +1148,7 @@ branch-is-up-to-date-with-target-pre: echo -e "Your branch is $commits_behind_count commits behind the target branch, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 1 fi - - git fetch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME + - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - TARGET_COMMIT=$(git rev-parse origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) - echo "TARGET_COMMIT is $TARGET_COMMIT" - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE -- GitLab From a32b045308060f6940a4dca558baa4cda23ca9b6 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 22 Jul 2025 14:06:56 +0200 Subject: [PATCH 1242/1310] Fix name for commit target file --- .gitlab-ci.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8fbdb32a3..10c6af1ec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -238,10 +238,10 @@ stages: .build-merge-target-binaries: &build-merge-target-binaries - current_commit_sha=$(git rev-parse HEAD) ### build merge target binaries - - if [ -f $MERGE_REQUEST_TARGET_FILE ]; then - - MERGE_REQUEST_TARGET=$(echo $MERGE_REQUEST_TARGET_FILE) + - if [ -f $MERGE_TARGET_COMMIT_FILE ]; then + - MERGE_REQUEST_TARGET=$(echo $MERGE_TARGET_COMMIT_FILE) - else - - echo "MERGE_REQUEST_TARGET_FILE does not exist, exiting!" + - echo "MERGE_TARGET_COMMIT_FILE does not exist, exiting!" - exit 1 - fi - git checkout $MERGE_REQUEST_TARGET @@ -2161,6 +2161,7 @@ voip-be-on-merge-request: renderer-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir + - .test-job-linux-needs-fixed-target - .rules-merge-request-to-main-pc needs: ["build-codec-linux-make"] # TODO: set reasonable timeout, will most likely take less @@ -2217,6 +2218,7 @@ renderer-pytest-on-merge-request: ivas-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir + - .test-job-linux-needs-fixed-target - .rules-merge-request-to-main-pc stage: compare # TODO: broken dependency needs to be removed temporarily, see above -- GitLab From a00905b74f3667f85b7cdad9c1187d28b27b7d28 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 22 Jul 2025 14:22:47 +0200 Subject: [PATCH 1243/1310] Fix needs in check-be-to-target-anchor, extends likely overwritten --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 10c6af1ec..63a460162 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -669,7 +669,7 @@ stages: .check-be-to-target-anchor: &check-be-to-target-anchor stage: check-be - needs: ["build-codec-linux-make"] + needs: ["build-codec-linux-make","branch-is-up-to-date-with-target-pre"] timeout: "300 minutes" variables: XML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" -- GitLab From a342cc681afdcbd36102da4d7213e2e0f06dd8cb Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Tue, 22 Jul 2025 14:33:07 +0200 Subject: [PATCH 1244/1310] Syntax error --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 63a460162..ae5d0e477 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -239,7 +239,7 @@ stages: - current_commit_sha=$(git rev-parse HEAD) ### build merge target binaries - if [ -f $MERGE_TARGET_COMMIT_FILE ]; then - - MERGE_REQUEST_TARGET=$(echo $MERGE_TARGET_COMMIT_FILE) + - MERGE_REQUEST_TARGET=$(cat $MERGE_TARGET_COMMIT_FILE) - else - echo "MERGE_TARGET_COMMIT_FILE does not exist, exiting!" - exit 1 -- GitLab From 6ac80834679366fed644bd9da14a30b659c1379e Mon Sep 17 00:00:00 2001 From: norvell Date: Tue, 22 Jul 2025 19:52:44 +0200 Subject: [PATCH 1245/1310] Apply 7 suggestion(s) to 1 file(s) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fabian Müller --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ae5d0e477..db0ca2794 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -239,7 +239,7 @@ stages: - current_commit_sha=$(git rev-parse HEAD) ### build merge target binaries - if [ -f $MERGE_TARGET_COMMIT_FILE ]; then - - MERGE_REQUEST_TARGET=$(cat $MERGE_TARGET_COMMIT_FILE) + - MERGE_REQUEST_TARGET="$(cat "$MERGE_TARGET_COMMIT_FILE")" - else - echo "MERGE_TARGET_COMMIT_FILE does not exist, exiting!" - exit 1 @@ -1077,10 +1077,10 @@ branch-is-up-to-date-with-target-pre: echo "Your branch is behind the target branch, run 'git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME' to update." exit 1 fi - - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - TARGET_COMMIT=$(git rev-parse origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) + - git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" + - TARGET_COMMIT="$(git rev-parse "origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME")" - echo "TARGET_COMMIT is $TARGET_COMMIT" - - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE + - echo "$TARGET_COMMIT" > "$MERGE_TARGET_COMMIT_FILE" artifacts: paths: - $MERGE_TARGET_COMMIT_FILE @@ -1148,10 +1148,10 @@ branch-is-up-to-date-with-target-pre: echo -e "Your branch is $commits_behind_count commits behind the target branch, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 1 fi - - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - TARGET_COMMIT=$(git rev-parse origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) + - git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" + - TARGET_COMMIT="$(git rev-parse "origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME")" - echo "TARGET_COMMIT is $TARGET_COMMIT" - - echo $TARGET_COMMIT > $MERGE_TARGET_COMMIT_FILE + - echo "$TARGET_COMMIT" > "$MERGE_TARGET_COMMIT_FILE" artifacts: paths: - $MERGE_TARGET_COMMIT_FILE -- GitLab From 88ca330676b082ca9ac3265a124d41c25aa05c7d Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 12:51:35 +0200 Subject: [PATCH 1246/1310] cleanup + make fixed ref commit work for comp stage --- .gitlab-ci.yml | 79 +++++++++++++++------------------------- .gitlab-ci/variables.yml | 10 +++++ 2 files changed, 39 insertions(+), 50 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index db0ca2794..215ab929b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,16 +20,26 @@ variables: # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain DUT_ENCODER_PATH: "./IVAS_cod" DUT_DECODER_PATH: "./IVAS_dec" + DUT_RENDERER_PATH: "./IVAS_rend" + DUT_POST_RENDERER_PATH: "./ISAR_post_rend" REF_ENCODER_PATH: "./IVAS_cod_ref" REF_DECODER_PATH: "./IVAS_dec_ref" + REF_RENDERER_PATH: "./IVAS_rend_ref" + REF_POST_RENDERER_PATH: "./ISAR_post_rend_ref" MERGE_TARGET_ENCODER_PATH: "./IVAS_cod_merge_target" MERGE_TARGET_DECODER_PATH: "./IVAS_dec_merge_target" + MERGE_TARGET_RENDERER_PATH: "./IVAS_rend_merge_target" + MERGE_TARGET_POST_RENDERER_PATH: "./ISAR_post_rend_merge_target" # These path variables are used for building the binaries # They should never be overwritten! REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" + REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_ref" + REF_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_ref" MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_merge_target" MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" + MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_merge_target" + MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_merge_target" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch-pc" @@ -174,35 +184,16 @@ stages: # From float CI .merge-request-comparison-setup-codec: &merge-request-comparison-setup-codec - ### build test binaries, initial clean for paranoia reasons - - make clean - - make -j - - mv IVAS_cod IVAS_cod_test - - mv IVAS_dec IVAS_dec_test - - mv IVAS_rend IVAS_rend_test - - git restore . + - *build-merge-target-binaries - ### store the current commit hash - - source_branch_commit_sha=$(git rev-parse HEAD) + # need to rename to match the conventions for the renderer tests... + - mv $MERGE_TARGET_ENCODER_PATH $REF_ENCODER_PATH + - mv $MERGE_TARGET_DECODER_PATH $REF_DECODER_PATH + - mv $MERGE_TARGET_RENDERER_PATH $REF_RENDERER_PATH + - mv $MERGE_TARGET_POST_RENDERER_PATH $REF_POST_RENDERER_PATH - ### checkout version to compare against - - *mr-fetch-target-branch - - *mr-get-target-commit - - git checkout $target_commit - - echo "Building reference codec at commit $target_commit" - - ### build reference binaries - make clean - make -j - - mv IVAS_cod IVAS_cod_ref - - mv IVAS_dec IVAS_dec_ref - - mv IVAS_rend IVAS_rend_ref - - git restore . - - # rename test binaries back - - mv IVAS_cod_test IVAS_cod - - mv IVAS_dec_test IVAS_dec - - mv IVAS_rend_test IVAS_rend .merge-request-comparison-check: &merge-request-comparison-check - echo "--------------- Running merge-request-comparison-check anchor ---------------" @@ -229,7 +220,8 @@ stages: - make -j >> /dev/null - mv ./IVAS_cod ./$REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - mv ./IVAS_dec ./$REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./IVAS_rend_ref + - mv ./IVAS_rend ./$REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY + - mv ./ISAR_post_rend ./$REF_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY ### Return to current branch - git restore . - git rev-parse HEAD > $FLOAT_REF_COMMIT_FILE @@ -250,7 +242,8 @@ stages: - make -j >> /dev/null - mv ./IVAS_cod ./$MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - mv ./IVAS_dec ./$MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./IVAS_rend_merge_target + - mv ./IVAS_rend ./$MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY + - mv ./ISAR_post_rend ./$MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY ### Return to current branch - git restore . - git rev-parse HEAD > $MERGE_TARGET_COMMIT_FILE @@ -849,10 +842,7 @@ stages: - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT ### run main now - - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - make clean - - make -j >> /dev/null + - *build-merge-target-binaries # need to restore cache again - *overwrite-pytest-cache-with-artifact - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true @@ -1424,6 +1414,7 @@ split-rendering-pytest-on-merge-request: - *update-scripts-repo - *get-commits-behind-count - *check-commits-behind-count-in-compare-jobs + - *merge-request-comparison-setup-codec # some helper variables - "|| true" to prevent failures from grep not finding anything # write to temporary file as workaround for failures observed with piping echo @@ -1436,36 +1427,24 @@ split-rendering-pytest-on-merge-request: # store the current commit hash - source_branch_commit_sha=$(git rev-parse HEAD) - - *mr-fetch-target-branch - - *mr-get-target-commit - - git checkout $target_commit - - echo "Building reference codec at commit $target_commit" - - # build reference binaries - - make -j - - mv IVAS_cod IVAS_cod_ref - - mv IVAS_dec IVAS_dec_ref - - mv IVAS_rend IVAS_rend_ref - ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - if [ $ref_using_target == 0 ]; then git restore lib_com/options.h; fi # Revert changes back before checking out another branch to avoid conflicts - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi - exit_code=0 - testcase_timeout=60 - - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout || exit_code=$? - # back to source branch - - git restore lib_com/options.h # Revert changes back before checking out another branch to avoid conflicts - - git checkout $source_branch_commit_sha - - make clean - - make -j + # remporary solution to make it work with and without https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/merge_requests/2181 + - mv $DUT_POST_RENDERER_PATH ISAR_post_rend_tmp + - cp $REF_POST_RENDERER_PATH $DUT_POST_RENDERER_PATH + - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout || exit_code=$? + - mv ISAR_post_rend_tmp $DUT_POST_RENDERER_PATH ### Run test using scripts and input from main - if [ $ref_using_target == 1 ]; then git restore lib_com/options.h; fi # Revert changes back before checking out another branch to avoid conflicts - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi - comp_args="--mld --ssnr --odg" - - echo "$comp_args" + - echo "$comp_args" # run test - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py $comp_args --create_cut --testcase_timeout=$testcase_timeout || exit_code=$? @@ -1994,7 +1973,7 @@ coverage-test-on-main-scheduled: # Build DuT binaries with GCOV - make clean >> /dev/null - make GCOV=1 -j - - cp IVAS_rend IVAS_rend_ref # Copy to ensure instrumented renderer is run in the first pytest call + - cp IVAS_rend $REF_RENDERER_PATH # Copy to ensure instrumented renderer is run in the first pytest call - testcase_timeout=$TESTCASE_TIMEOUT_LTV - exit_code_dec=0 diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 0c212d312..fc29579a5 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -12,16 +12,26 @@ variables: # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain DUT_ENCODER_PATH: "./IVAS_cod" DUT_DECODER_PATH: "./IVAS_dec" + DUT_RENDERER_PATH: "./IVAS_rend" + DUT_POST_RENDERER_PATH: "./ISAR_post_rend" REF_ENCODER_PATH: "./IVAS_cod_ref" REF_DECODER_PATH: "./IVAS_dec_ref" + REF_RENDERER_PATH: "./IVAS_rend_ref" + REF_POST_RENDERER_PATH: "./ISAR_post_rend_ref" MERGE_TARGET_ENCODER_PATH: "./IVAS_cod_merge_target" MERGE_TARGET_DECODER_PATH: "./IVAS_dec_merge_target" + MERGE_TARGET_RENDERER_PATH: "./IVAS_rend_merge_target" + MERGE_TARGET_POST_RENDERER_PATH: "./ISAR_post_rend_merge_target" # These path variables are used for building the binaries # They should never be overwritten! REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" + REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_ref" + REF_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_ref" MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_merge_target" MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" + MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_merge_target" + MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_merge_target" LEVEL_SCALING: "1.0" BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" -- GitLab From 8fb4f6ca1a37b34961a61183b900fb6cc6f27e7a Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 13:54:13 +0200 Subject: [PATCH 1247/1310] move anchor up to be able to use it in other part --- .gitlab-ci.yml | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 215ab929b..a95babb6a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -170,6 +170,28 @@ stages: echo "Commit time was $CI_COMMIT_TIMESTAMP" ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression +.build-merge-target-binaries: &build-merge-target-binaries + - current_commit_sha=$(git rev-parse HEAD) + ### build merge target binaries + - if [ -f $MERGE_TARGET_COMMIT_FILE ]; then + - MERGE_REQUEST_TARGET="$(cat "$MERGE_TARGET_COMMIT_FILE")" + - else + - echo "MERGE_TARGET_COMMIT_FILE does not exist, exiting!" + - exit 1 + - fi + - git checkout $MERGE_REQUEST_TARGET + - *activate-debug-mode-info-if-set + - make clean + - make -j >> /dev/null + - mv ./IVAS_cod ./$MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY + - mv ./IVAS_dec ./$MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY + - mv ./IVAS_rend ./$MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY + - mv ./ISAR_post_rend ./$MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY + ### Return to current branch + - git restore . + - git rev-parse HEAD > $MERGE_TARGET_COMMIT_FILE + - git checkout $current_commit_sha + # From float CI .mr-fetch-target-branch: &mr-fetch-target-branch # first delete local target branch to avoid conflicts when branch is cached and there are merge conflicts during fetching @@ -227,28 +249,6 @@ stages: - git rev-parse HEAD > $FLOAT_REF_COMMIT_FILE - git checkout $current_commit_sha -.build-merge-target-binaries: &build-merge-target-binaries - - current_commit_sha=$(git rev-parse HEAD) - ### build merge target binaries - - if [ -f $MERGE_TARGET_COMMIT_FILE ]; then - - MERGE_REQUEST_TARGET="$(cat "$MERGE_TARGET_COMMIT_FILE")" - - else - - echo "MERGE_TARGET_COMMIT_FILE does not exist, exiting!" - - exit 1 - - fi - - git checkout $MERGE_REQUEST_TARGET - - *activate-debug-mode-info-if-set - - make clean - - make -j >> /dev/null - - mv ./IVAS_cod ./$MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_dec ./$MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./$MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./ISAR_post_rend ./$MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY - ### Return to current branch - - git restore . - - git rev-parse HEAD > $MERGE_TARGET_COMMIT_FILE - - git checkout $current_commit_sha - .build-float-ref-and-dut-binaries: &build-float-ref-and-dut-binaries ### build reference binaries - *build-float-ref-binaries -- GitLab From e20e5aeb6c59944c24f474b8dbe36285f8911058 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 13:55:39 +0200 Subject: [PATCH 1248/1310] move up yet another anchor --- .gitlab-ci.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a95babb6a..7a82008e4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -170,6 +170,12 @@ stages: echo "Commit time was $CI_COMMIT_TIMESTAMP" ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression +.activate-debug-mode-info-if-set: &activate-debug-mode-info-if-set + - if [ "$BUILD_WITH_DEBUG_MODE_INFO" = "true" ]; then + - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUGGING\ *\)\*\//\1/g" lib_com/options.h + - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUG_MODE_INFO\ *\)\*\//\1/g" lib_com/options.h + - fi + .build-merge-target-binaries: &build-merge-target-binaries - current_commit_sha=$(git rev-parse HEAD) ### build merge target binaries @@ -224,13 +230,6 @@ stages: - if [ $exit_code -ne 0 ] && [ $non_be_flag != 0 ]; then echo "Non-bitexact cases with non-BE tag encountered"; exit $EXIT_CODE_NON_BE; fi - exit 0 - -.activate-debug-mode-info-if-set: &activate-debug-mode-info-if-set - - if [ "$BUILD_WITH_DEBUG_MODE_INFO" = "true" ]; then - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUGGING\ *\)\*\//\1/g" lib_com/options.h - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUG_MODE_INFO\ *\)\*\//\1/g" lib_com/options.h - - fi - .build-float-ref-binaries: &build-float-ref-binaries - git rev-parse HEAD > $CUT_COMMIT_FILE - current_commit_sha=$(git rev-parse HEAD) -- GitLab From d621ca2ef5a4bc739ad73bb96a7066b0ac8b271a Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:22:59 +0200 Subject: [PATCH 1249/1310] add additional info to printout + remove duplicates --- .gitlab-ci.yml | 43 +------------------------------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cae7e9a15..04d1dc4d1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -182,7 +182,7 @@ stages: - if [ -f $MERGE_TARGET_COMMIT_FILE ]; then - MERGE_REQUEST_TARGET="$(cat "$MERGE_TARGET_COMMIT_FILE")" - else - - echo "MERGE_TARGET_COMMIT_FILE does not exist, exiting!" + - echo "MERGE_TARGET_COMMIT_FILE ($MERGE_TARGET_COMMIT_FILE) does not exist, exiting!" - exit 1 - fi - git checkout $MERGE_REQUEST_TARGET @@ -1051,47 +1051,6 @@ uninterruptible: # Validation jobs # --------------------------------------------------------------- -branch-is-up-to-date-with-target-pre: - extends: - - .rules-merge-request-to-main-pc - stage: prevalidate - needs: [] - tags: - - ivas-linux - script: - - *get-commits-behind-count - - echo $commits_behind_count - - | - if [ $commits_behind_count -ne 0 ]; then - echo "Your branch is behind the target branch, run 'git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME' to update." - exit 1 - fi - - git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" - - TARGET_COMMIT="$(git rev-parse "origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME")" - - echo "TARGET_COMMIT is $TARGET_COMMIT" - - echo "$TARGET_COMMIT" > "$MERGE_TARGET_COMMIT_FILE" - artifacts: - paths: - - $MERGE_TARGET_COMMIT_FILE - -branch-is-up-to-date-with-target-post: - extends: - - .rules-merge-request-to-main-pc - stage: postvalidate - tags: - - ivas-linux - script: - - *get-commits-behind-count - - echo $commits_behind_count - - | - if [ $commits_behind_count -ne 0 ]; then - echo "Your branch is behind the target branch, possibly main changed during your pipeline run, run 'git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME' to update." - exit 123 - fi - allow_failure: - exit_codes: - - 123 - # fail pipeline in the final stage for pipelines on Draft MRs # this also only runs on Draft MRs, so should always fail fail-pipeline-if-in-draft: -- GitLab From 30fab5792ed90906626301e528d50fb00a247f7b Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:31:03 +0200 Subject: [PATCH 1250/1310] fix comparison merge target build there was a "needs:" in the job itself that overwrote the one coming in from the template --- .gitlab-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 04d1dc4d1..4d3827ded 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1364,7 +1364,6 @@ split-rendering-pytest-on-merge-request: - .test-job-linux-needs-testv-dir - .test-job-linux-needs-fixed-target - .rules-merge-request-to-main-pc - needs: ["build-codec-linux-make"] timeout: "60 minutes" stage: compare script: @@ -2100,7 +2099,6 @@ renderer-pytest-on-merge-request: - .test-job-linux-needs-testv-dir - .test-job-linux-needs-fixed-target - .rules-merge-request-to-main-pc - needs: ["build-codec-linux-make"] # TODO: set reasonable timeout, will most likely take less timeout: "20 minutes" tags: @@ -2162,7 +2160,6 @@ ivas-pytest-on-merge-request: # note: this step doesn't really depend on codec-smoke-test # it's just pointless to run this step when the smoke test fails and the smoke test should be reasonably fast # thus, overall, this should save time - needs: ["build-codec-linux-make"] #, "codec-smoke-test"] timeout: "40 minutes" tags: - ivas-linux -- GitLab From 8fee3d590f8f5ec3d0a12bef669385a5c9884eda Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:36:04 +0200 Subject: [PATCH 1251/1310] remove more duplicates --- .gitlab-ci.yml | 44 +++----------------------------------------- 1 file changed, 3 insertions(+), 41 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4d3827ded..e3ab8a25d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -434,43 +434,6 @@ stages: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' when: never -# --------------------------------------------------------------- -# Job templates -# --------------------------------------------------------------- - -# When designing templates, try not to use too much inheritance and -# if multiple templates and extended on, remember that on conflict, -# latest overwrites the parameter. - -# templates for rules -.rules-basis: - rules: - - if: $MIRROR_ACCESS_TOKEN # Don't run in the mirror update pipeline (only then MIRROR_ACCESS_TOKEN is defined) - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' # Don't run in any scheduled pipelines by default (use schedule templates below to enable again for certain conditions) - when: never - - if: $CI_PIPELINE_SOURCE == 'trigger' # Don't run triggered pipeline by default - when: never - - if: $MANUAL_PIPELINE_TYPE == 'test-be-release' # Skip all the normal jobs when testing manually against release codec - when: never - - if: $MANUAL_PIPELINE_TYPE == 'test-long-self-test' # Skip all the normal jobs when testing manually against release codec - when: never - - if: $MANUAL_PIPELINE_TYPE == 'ivas-conformance' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'ivas-conformance-linux' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'check-clipping' - - if: $MANUAL_PIPELINE_TYPE == 'test-branch-vs-input-passthrough' - when: never - - when: on_success - -.rules-merge-request: - extends: .rules-basis - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - .rules-merge-request-no-draft: extends: .rules-basis rules: @@ -500,7 +463,6 @@ stages: - job: branch-is-up-to-date-with-target-pre - artifacts: true - .build-job-linux: stage: build timeout: "2 minutes" @@ -514,9 +476,9 @@ stages: - ivas-windows .print-results-banner: &print-results-banner - - set +x - - echo "" - - echo -e "==================================================================================================================\n================================================== TEST RESULTS ==================================================\n==================================================================================================================\n" + - set +x + - echo "" + - echo -e "==================================================================================================================\n================================================== TEST RESULTS ==================================================\n==================================================================================================================\n" # template for test jobs on linux that need the TESTV_DIR .test-job-linux-needs-testv-dir: -- GitLab From 1ce1ce7970d1c9f0f740d884169e296683a22bf9 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:46:40 +0200 Subject: [PATCH 1252/1310] also add build job to needs section in template --- .gitlab-ci.yml | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e3ab8a25d..ea7949bc1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -457,11 +457,12 @@ stages: tags: - ivas-linux -.test-job-linux-needs-fixed-target: +.test-job-linux-compares-to-fixed-target: extends: .test-job-linux needs: - job: branch-is-up-to-date-with-target-pre - artifacts: true + - job: build-codec-linux-make .build-job-linux: stage: build @@ -1324,7 +1325,7 @@ lc3-wrapper-unit-test: split-rendering-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target - .rules-merge-request-to-main-pc timeout: "60 minutes" stage: compare @@ -1406,7 +1407,7 @@ split-rendering-pytest-on-merge-request: check-be-to-target-short-enc-0db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1420,7 +1421,7 @@ check-be-to-target-short-enc-0db: check-be-to-target-short-enc-+10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1434,7 +1435,7 @@ check-be-to-target-short-enc-+10db: check-be-to-target-short-enc--10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1448,7 +1449,7 @@ check-be-to-target-short-enc--10db: check-be-to-target-short-dec-0db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1462,7 +1463,7 @@ check-be-to-target-short-dec-0db: check-be-to-target-short-dec-+10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1476,7 +1477,7 @@ check-be-to-target-short-dec-+10db: check-be-to-target-short-dec--10db: extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1495,7 +1496,7 @@ check-regressions-short-enc-0db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1512,7 +1513,7 @@ check-regressions-short-enc-+10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1529,7 +1530,7 @@ check-regressions-short-enc--10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1546,7 +1547,7 @@ check-regressions-short-dec-0db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1563,7 +1564,7 @@ check-regressions-short-dec-+10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1580,7 +1581,7 @@ check-regressions-short-dec--10db: artifacts: true extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -2059,7 +2060,7 @@ voip-be-on-merge-request: renderer-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target - .rules-merge-request-to-main-pc # TODO: set reasonable timeout, will most likely take less timeout: "20 minutes" @@ -2115,7 +2116,7 @@ renderer-pytest-on-merge-request: ivas-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - - .test-job-linux-needs-fixed-target + - .test-job-linux-compares-to-fixed-target - .rules-merge-request-to-main-pc stage: compare # TODO: broken dependency needs to be removed temporarily, see above -- GitLab From d935df2b4c7cefa560d4d8b946c2d28823142afa Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:51:53 +0200 Subject: [PATCH 1253/1310] remove another duplicate --- .gitlab-ci.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ea7949bc1..eb24b0c68 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -288,13 +288,6 @@ stages: - echo "Applying level scaling in scripts/testv using scale=$LEVEL_SCALING" - tests/scale_pcm.py ./scripts/testv/ $LEVEL_SCALING -.merge-request-comparison-check: &merge-request-comparison-check - - echo "--------------- Running merge-request-comparison-check anchor ---------------" - - if [ $zero_errors != 1 ]; then echo "Run errors encountered!"; exit $EXIT_CODE_FAIL; fi - - if [ $exit_code -eq 1 ] && [ $non_be_flag == 0 ]; then echo "Non-bitexact cases without non-BE tag encountered!"; exit $EXIT_CODE_FAIL; fi - - if [ $exit_code -eq 1 ] && [ $non_be_flag != 0 ]; then echo "Non-bitexact cases with non-BE tag encountered"; exit $EXIT_CODE_NON_BE; fi - - exit 0 - .update-ltv-repo: &update-ltv-repo - cd $LTV_DIR - git pull -- GitLab From 5274f1bbc527687bb6d334b7e2a85ba1ca0efd6d Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:56:43 +0200 Subject: [PATCH 1254/1310] test if it works without template --- .gitlab-ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eb24b0c68..f971fb166 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1318,9 +1318,13 @@ lc3-wrapper-unit-test: split-rendering-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - - .test-job-linux-compares-to-fixed-target + # - .test-job-linux-compares-to-fixed-target - .rules-merge-request-to-main-pc timeout: "60 minutes" + needs: + - job: branch-is-up-to-date-with-target-pre + - artifacts: true + - job: build-codec-linux-make stage: compare script: - *print-common-info -- GitLab From ee5a1e4d742d92a621536ce976651370d351316d Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:58:17 +0200 Subject: [PATCH 1255/1310] Revert "test if it works without template" This reverts commit 5274f1bbc527687bb6d334b7e2a85ba1ca0efd6d. --- .gitlab-ci.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f971fb166..eb24b0c68 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1318,13 +1318,9 @@ lc3-wrapper-unit-test: split-rendering-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - # - .test-job-linux-compares-to-fixed-target + - .test-job-linux-compares-to-fixed-target - .rules-merge-request-to-main-pc timeout: "60 minutes" - needs: - - job: branch-is-up-to-date-with-target-pre - - artifacts: true - - job: build-codec-linux-make stage: compare script: - *print-common-info -- GitLab From b1710d570ab1fb8a83781b27f80192c9bd1da06b Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 23 Jul 2025 14:59:09 +0200 Subject: [PATCH 1256/1310] fix syntax in template --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eb24b0c68..e0fd7d958 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -454,7 +454,7 @@ stages: extends: .test-job-linux needs: - job: branch-is-up-to-date-with-target-pre - - artifacts: true + artifacts: true - job: build-codec-linux-make .build-job-linux: -- GitLab From e630d6063cdc71ac012d189c5a24fbd82bfe90b6 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 09:54:12 +0200 Subject: [PATCH 1257/1310] fix needs for regression tests --- .gitlab-ci.yml | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e0fd7d958..842aefbc7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1487,9 +1487,11 @@ check-regressions-short-enc-0db: needs: - job: "check-be-to-target-short-enc-0db" artifacts: true + - job: branch-is-up-to-date-with-target-pre + artifacts: true + - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1504,9 +1506,11 @@ check-regressions-short-enc-+10db: needs: - job: "check-be-to-target-short-enc-+10db" artifacts: true + - job: branch-is-up-to-date-with-target-pre + artifacts: true + - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1521,9 +1525,11 @@ check-regressions-short-enc--10db: needs: - job: "check-be-to-target-short-enc--10db" artifacts: true + - job: branch-is-up-to-date-with-target-pre + artifacts: true + - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1538,9 +1544,11 @@ check-regressions-short-dec-0db: needs: - job: "check-be-to-target-short-dec-0db" artifacts: true + - job: branch-is-up-to-date-with-target-pre + artifacts: true + - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1555,9 +1563,11 @@ check-regressions-short-dec-+10db: needs: - job: "check-be-to-target-short-dec-+10db" artifacts: true + - job: branch-is-up-to-date-with-target-pre + artifacts: true + - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1572,9 +1582,11 @@ check-regressions-short-dec--10db: needs: - job: "check-be-to-target-short-dec--10db" artifacts: true + - job: branch-is-up-to-date-with-target-pre + artifacts: true + - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 -- GitLab From 9b39aac6c7122831e3f00c66e3b13124599ae98b Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 15:06:33 +0200 Subject: [PATCH 1258/1310] move remaining variables to .gitlab-ci/variables.yml --- .gitlab-ci/variables.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index cb883cc28..8bf02a062 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -1,13 +1,20 @@ variables: + TESTV_DIR: "/usr/local/testv" + LTV_DIR: "/usr/local/ltv" EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" FLOAT_REF_BRANCH: "ivas-float-update" + BUILD_OUTPUT: "build_output.txt" SCRIPTS_DIR: "/usr/local/scripts" + EXIT_CODE_NON_BE: 123 + EXIT_CODE_FAIL: 1 LONG_TEST_SUITE: "tests/codec_be_on_mr_nonselection tests/renderer --param_file scripts/config/self_test_ltv.prm --use_ltv" LONG_TEST_SUITE_NO_RENDERER: "tests/codec_be_on_mr_nonselection --param_file scripts/config/self_test_ltv.prm --use_ltv" SHORT_TEST_SUITE: "tests/codec_be_on_mr_nonselection" SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" TEST_SUITE: "" + DISABLE_HRTF_MODEL_TESTS: "" + # DISABLE_HRTF_MODEL_TESTS: "-k not model" #enable this declaration to disable HRTF model from file tests # These path variables are used by the pytest calls. # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain DUT_ENCODER_PATH: "./IVAS_cod" @@ -33,7 +40,8 @@ variables: MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_merge_target" MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_merge_target" LEVEL_SCALING: "1.0" - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch" + IVAS_PIPELINE_NAME: '' + BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch-pc" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 @@ -42,7 +50,9 @@ variables: CI_REGRESSION_THRESH_MAX_ABS_DIFF: "50" CI_REGRESSION_THRESH_SSNR: "-1" CI_REGRESSION_THRESH_ODG: "-0.05" + GIT_CLEAN_FLAGS: -ffdxq INSTR_DIR: "scripts/c-code_instrument" + TESTS_DIR_CODEC_BE_ON_MR: "tests/codec_be_on_mr_nonselection" BUILD_WITH_DEBUG_MODE_INFO: "" ENCODER_TEST: "" DELTA_ODG: "" -- GitLab From dd40499a9c2aa9bbe2d5cbb329723f209b787a0e Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 24 Jul 2025 16:22:35 +0300 Subject: [PATCH 1259/1310] Port MR 1365 OMASA EXT from IVAS PC to BASOP --- apps/decoder.c | 49 ++ apps/renderer.c | 5 +- lib_com/ivas_cnst.h | 6 + lib_com/ivas_prot_fx.h | 39 +- lib_com/options.h | 4 +- lib_dec/ivas_init_dec_fx.c | 88 ++- lib_dec/ivas_jbm_dec_fx.c | 92 ++- lib_dec/ivas_masa_dec_fx.c | 111 ++- lib_dec/ivas_omasa_dec_fx.c | 1255 ++++++++++++++++++++++++++++++- lib_dec/ivas_output_config_fx.c | 18 + lib_dec/ivas_sba_dec_fx.c | 5 + lib_dec/ivas_stat_dec.h | 23 +- lib_dec/lib_dec_fx.c | 72 +- lib_enc/ivas_masa_enc_fx.c | 37 +- lib_rend/ivas_masa_merge_fx.c | 4 +- lib_util/masa_file_writer.c | 114 ++- lib_util/masa_file_writer.h | 5 + 17 files changed, 1881 insertions(+), 46 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 0da70053d..d9333726e 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1717,7 +1717,12 @@ static ivas_error initOnFirstGoodFrame( for ( int16_t j = 0; j < numInitialBadFrames; ++j ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + float delayMs = (float) ( pFullDelayNumSamples[0] ) / (float) ( *delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); return error; @@ -2101,13 +2106,28 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples is zeroed, and delayNumSamples_orig is updated only on first good frame, so need to re-fetch delay info */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -2233,13 +2253,27 @@ static ivas_error decodeG192( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 0 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; @@ -2785,13 +2819,28 @@ static ivas_error decodeVoIP( if ( bsFormat == IVAS_DEC_BS_MASA || bsFormat == IVAS_DEC_BS_MASA_ISM ) { IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + int16_t fullDelayNumSamples[3]; + float delayMs; + + /* delayNumSamples_orig is fetched only for the first good frame, but here the delay can change between frames, so need to re-fetch */ + if ( ( error = IVAS_DEC_GetDelay( hIvasDec, fullDelayNumSamples, &delayTimeScale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nUnable to get delay of decoder: %s\n", ivas_error_to_string( error ) ); + } +#endif if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta, 1 ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + delayMs = (float) ( fullDelayNumSamples[0] ) / (float) ( delayTimeScale ); + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta, &delayMs ) ) != IVAS_ERR_OK ) +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; diff --git a/apps/renderer.c b/apps/renderer.c index 13d68cdef..4d976c76e 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1987,8 +1987,11 @@ int main( } } } - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput, NULL ) ) != IVAS_ERR_OK ) /* NULL -> use default metadata delay settings */ +#else if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 5b1d54265..a94ab1fbb 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -147,7 +147,13 @@ typedef enum RENDERER_NON_DIEGETIC_DOWNMIX, RENDERER_OSBA_STEREO, RENDERER_OSBA_AMBI, +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + RENDERER_OSBA_LS, + RENDERER_OMASA_OBJECT_EXT, + RENDERER_OMASA_MIX_EXT +#else RENDERER_OSBA_LS +#endif } RENDERER_TYPE; #define MAX_FREQUENCY_BANDS 64 diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 510a9067d..6486d68c3 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -156,6 +156,33 @@ void ivas_omasa_rearrange_channels_fx( const Word16 output_frame /* i : output frame length per channel */ ); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT +ivas_error ivas_omasa_combine_separate_ism_with_masa_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_combine_separate_ism_with_masa_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* o : output synthesis signal */ + Word16 *output_q, /* i/o: output Q value */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ +); + +ivas_error ivas_omasa_render_objects_from_mix_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_omasa_render_objects_from_mix_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame, /* i : output frame length per channel */ + Word16 *output_q /* i/o: output Q value */ +); + +#endif + ivas_error ivas_omasa_ism_metadata_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const Word32 ism_total_brate, /* i : ISM total bitrate */ @@ -3906,7 +3933,7 @@ void ivas_omasa_decode_masa_to_total_fx( ivas_error ivas_td_binaural_open_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ Word16 *SrcInd, /*Temporarily used to store the updated value of SrcInd*/ - Word16 *num_src + Word16 *num_src ); ivas_error ivas_td_binaural_renderer_sf_fx( @@ -6471,7 +6498,7 @@ Word16 ivas_qmetadata_dec_sid_decode( UWord16 ivas_qmetadata_reorder_generic_fx( - const Word16 signed_value + const Word16 signed_value ); void ivas_sba_set_cna_cng_flag( @@ -6605,9 +6632,9 @@ void ivas_map_prior_coeffs_quant( const Word16 nB ); -void ivas_clear_band_coeff_idx( - ivas_band_coeffs_ind_t *pband_coeff_idx, - const UWord16 num_bands +void ivas_clear_band_coeff_idx( + ivas_band_coeffs_ind_t *pband_coeff_idx, + const UWord16 num_bands ); @@ -6715,7 +6742,7 @@ ivas_error ivas_create_lfe_enc_fx( const Word32 input_Fs /* i : input sampling rate */ ); -void ivas_lfe_enc_close_fx( +void ivas_lfe_enc_close_fx( LFE_ENC_HANDLE *hLFE /* i/o: LFE encoder handle */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 929ae2b05..f9a69637c 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,12 +155,12 @@ #ifdef NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM #endif +#define NONBE_FIX_984_OMASA_EXT_OUTPUT /* Nokia: issue #984: complete the OMASA EXT output implementation */ + #define USE_NEW_HRTF_BINARY_FILE_FORMAT /* Orange: to activate when decided to change the hrtf binary file format */ #define FIX_WARNING_RENDER_CONFIG /* Orange: fix warning on windows build */ - - #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index 40bf1ccf5..a3df9ed2c 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -386,6 +386,26 @@ ivas_error ivas_dec_setup( st_ivas->nchan_transport = 1; move16(); } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + /* this should be non-zero if original input format was MASA_ISM_FORMAT */ + st_ivas->nchan_ism = add( st_ivas->bit_stream[sub( res_dec, 3 )], shl( st_ivas->bit_stream[sub( res_dec, 2 )], 1 ) ); + + IF( GT_16( st_ivas->nchan_ism, 0 ) ) + { + /* the input_ivas_format should be MASA_ISM_FORMAT, but we cannot initialize it now */ + test(); + IF( EQ_16( st_ivas->nchan_transport, 2 ) && EQ_16( st_ivas->nchan_ism, 3 ) ) + { + st_ivas->nchan_ism = 4; + move16(); + } + /* for MASA_ISM_FORMAT at input the number of MASA transport channels is always 2 */ + st_ivas->nchan_transport = 2; + element_mode_flag = 1; + move16(); + move16(); + } +#endif IF( st_ivas->ini_frame > 0 ) { @@ -1232,6 +1252,9 @@ ivas_error ivas_init_decoder_fx( IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); +#endif IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { hDecoderConfig->nchan_out = audioCfg2channels( IVAS_AUDIO_CONFIG_HOA3 ); @@ -1239,7 +1262,11 @@ ivas_error ivas_init_decoder_fx( hDecoderConfig->nchan_out = add( hDecoderConfig->nchan_out, st_ivas->nchan_ism ); move16(); } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) || EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) +#else ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) +#endif { hDecoderConfig->nchan_out = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); move16(); @@ -2391,7 +2418,39 @@ ivas_error ivas_init_decoder_fx( return error; } } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + error = ivas_omasa_render_objects_from_mix_open_fx( st_ivas ); + move32(); + + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + + error = ivas_spat_hSpatParamRendCom_config_fx( &st_ivas->hSpatParamRendCom, DIRAC_OPEN, 0, + st_ivas->ivas_format, st_ivas->mc_mode, output_Fs, 0, 0 ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) ) + { + /* Allocate 'hIsmRendererData' handle */ + error = ivas_omasa_combine_separate_ism_with_masa_open_fx( st_ivas ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + } +#endif test(); test(); test(); @@ -3360,6 +3419,19 @@ void ivas_init_dec_get_num_cldfb_instances( move16(); } BREAK; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + case RENDERER_OMASA_OBJECT_EXT: + *numCldfbAnalyses = st_ivas->nchan_transport; + *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; + move16(); + move16(); + break; + case RENDERER_OMASA_MIX_EXT: + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + *numCldfbSyntheses = 0; + move16(); + break; +#endif default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } @@ -3621,6 +3693,19 @@ void ivas_init_dec_get_num_cldfb_instances_ivas_fx( move16(); } BREAK; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + case RENDERER_OMASA_OBJECT_EXT: + *numCldfbAnalyses = st_ivas->nchan_transport; + *numCldfbSyntheses = st_ivas->hDecoderConfig->nchan_out; + move16(); + move16(); + break; + case RENDERER_OMASA_MIX_EXT: + *numCldfbAnalyses = add( st_ivas->nchan_transport, 1 ); + *numCldfbSyntheses = 0; + move16(); + break; +#endif default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } @@ -3777,6 +3862,7 @@ static ivas_error doSanityChecks_IVAS( } } +#ifndef NONBE_FIX_984_OMASA_EXT_OUTPUT IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { test(); @@ -3786,7 +3872,7 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration specified for combined MASA and ISM format" ); } } - +#endif return IVAS_ERR_OK; } diff --git a/lib_dec/ivas_jbm_dec_fx.c b/lib_dec/ivas_jbm_dec_fx.c index bcca2a71d..48264d70f 100644 --- a/lib_dec/ivas_jbm_dec_fx.c +++ b/lib_dec/ivas_jbm_dec_fx.c @@ -668,6 +668,20 @@ ivas_error ivas_jbm_dec_tc_fx( { Scale_sig32( p_output_fx[i], output_frame, negate( q_shift ) ); } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + /* external output */ + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) && + EQ_32( st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + FOR( n = 0; n < st_ivas->nchan_ism; n++ ) + { + set_zero_fx( p_output_fx[add( st_ivas->nchan_transport, n )], output_frame ); + } + + ivas_omasa_rearrange_channels_fx( p_output_fx, st_ivas->nchan_ism, output_frame ); + } +#endif } ELSE IF( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) && ( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) { @@ -792,6 +806,22 @@ ivas_error ivas_jbm_dec_tc_fx( } ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + ivas_omasa_rearrange_channels_fx( p_output_fx, nchan_transport_ism, output_frame ); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + /* Convert separate object to MASA, combine with the original MASA, and output combined MASA + empty objects. */ + ivas_omasa_combine_separate_ism_with_masa_fx( st_ivas, p_output_fx, &output_q, st_ivas->nchan_ism, output_frame ); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + /* Extract objects from MASA, output MASA + all objects (i.e., extracted and separated objects) */ + ivas_omasa_render_objects_from_mix_fx( st_ivas, p_output_fx, st_ivas->nchan_ism, output_frame, &output_q ); + } +#else /* sanity check in case of bitrate switching */ IF( NE_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { @@ -799,9 +829,7 @@ ivas_error ivas_jbm_dec_tc_fx( } ivas_omasa_rearrange_channels_fx( p_output_fx, nchan_transport_ism, output_frame ); - - output_q = 11; - move16(); +#endif ivas_jbm_dec_copy_masa_meta_to_buffer( st_ivas ); } @@ -1706,29 +1734,42 @@ void ivas_jbm_dec_feed_tc_to_renderer_fx( } ELSE IF( EQ_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT test(); - IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) { - n_render_timeslots = i_mult( n_render_timeslots, idiv1616( st_ivas->hTcBuffer->n_samples_granularity, st_ivas->hSpatParamRendCom->slot_size ) ); + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + ivas_jbm_masa_sf_to_slot_map( st_ivas, n_render_timeslots ); } - - IF( st_ivas->hSCE[0] ) + ELSE { - Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); - if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) +#endif + test(); + IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) && EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) { - shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); + n_render_timeslots = i_mult( n_render_timeslots, idiv1616( st_ivas->hTcBuffer->n_samples_granularity, st_ivas->hSpatParamRendCom->slot_size ) ); } - scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31- (st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp - shift) - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); - move16(); - } - ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); - IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) - { - ivas_ism_dec_digest_tc_fx( st_ivas ); + IF( st_ivas->hSCE[0] ) + { + Word16 shift = getScaleFactor32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); + if ( LT_16( sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ), 4 ) ) + { + shift = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, 4 ); + } + scale_sig32( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, shift ); // Q(31- (st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp - shift) + st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, shift ); + move16(); + } + ivas_sba_dec_digest_tc_fx( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + + IF( EQ_16( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + ivas_ism_dec_digest_tc_fx( st_ivas ); + } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT } +#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_DIRAC ) { @@ -2110,6 +2151,9 @@ ivas_error ivas_jbm_dec_render_fx( move16(); test(); test(); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); +#endif IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { test(); @@ -2129,6 +2173,14 @@ ivas_error ivas_jbm_dec_render_fx( { ivas_omasa_dirac_rend_jbm_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output_fx ); } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) || + EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) ) + { + ivas_jbm_dec_tc_buffer_playout_fx( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output_fx ); + ivas_omasa_rearrange_channels_fx( p_output_fx, st_ivas->nchan_ism, *nSamplesRendered ); + } +#endif } ELSE IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) { @@ -3927,6 +3979,10 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( case RENDERER_PARAM_ISM: case RENDERER_BINAURAL_MIXER_CONV: case RENDERER_BINAURAL_MIXER_CONV_ROOM: +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + case RENDERER_OMASA_OBJECT_EXT: + case RENDERER_OMASA_MIX_EXT: +#endif case RENDERER_OSBA_AMBI: case RENDERER_OSBA_LS: buffer_mode = TC_BUFFER_MODE_RENDERER; diff --git a/lib_dec/ivas_masa_dec_fx.c b/lib_dec/ivas_masa_dec_fx.c index 3133c8c57..f66970710 100644 --- a/lib_dec/ivas_masa_dec_fx.c +++ b/lib_dec/ivas_masa_dec_fx.c @@ -320,7 +320,33 @@ ivas_error ivas_masa_decode_fx( } } } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + + /* read 2 bits: + '00' - MASA format at the encoder + '01' - MASA_ISM_FORMAT at the encoder, with 1 object + '10' - MASA_ISM_FORMAT at the encoder, with 2 objects + '11' - MASA_ISM_FORMAT at the encoder, with 3 or 4 objects + reading if 3 or 4 object is performed later + */ + byteBuffer = st->bit_stream[st->next_bit_pos]; + move16(); + st->next_bit_pos = sub( st->next_bit_pos, 1 ); + byteBuffer = add( byteBuffer, shl( st->bit_stream[st->next_bit_pos], 1 ) ); + st->next_bit_pos = sub( st->next_bit_pos, 1 ); + test(); + IF( EQ_16( byteBuffer, 0 ) && EQ_32( ivas_format, MASA_FORMAT ) ) + { + hMasa->config.input_ivas_format = MASA_FORMAT; + move32(); + } + ELSE + { + hMasa->config.input_ivas_format = MASA_ISM_FORMAT; + move32(); + } +#else /* read the MASA_ISM_FORMAT bit */ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; move16(); @@ -337,6 +363,7 @@ ivas_error ivas_masa_decode_fx( /* reserved bit */ byteBuffer = st->bit_stream[( st->next_bit_pos )--]; move16(); +#endif *nb_bits_read = add( *nb_bits_read, MASA_HEADER_BITS ); /* read number of directions */ @@ -418,8 +445,9 @@ ivas_error ivas_masa_decode_fx( { IF( st_ivas->hDirAC != NULL ) { - *nb_bits_read = add( *nb_bits_read, ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, - st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ); + *nb_bits_read = add( *nb_bits_read, + ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, + st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ); move16(); FOR( obj = 0; obj <= st_ivas->nchan_ism; obj++ ) { @@ -439,6 +467,14 @@ ivas_error ivas_masa_decode_fx( } } } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + *nb_bits_read = add( *nb_bits_read, ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, + st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, + st_ivas->hMasaIsmData->idx_separated_ism, ism_imp, st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ); + } +#endif ELSE { *nb_bits_read = add( *nb_bits_read, ivas_decode_masaism_metadata_fx( hQMetaData, st_ivas->hMasa, st_ivas->hMasaIsmData, st_ivas->nchan_ism, st->bit_stream, &st->next_bit_pos, @@ -587,7 +623,19 @@ ivas_error ivas_masa_decode_fx( ivas_qmetadata_to_dirac_fx( hQMetaData, st_ivas->hDirAC, hMasa, st_ivas->hSpatParamRendCom, ivas_total_brate, ivas_format, 0, 0 ); } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + ELSE IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + Word16 index = add( st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx, MAX_PARAM_SPATIAL_SUBFRAMES ); + IF( GE_16( index, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ) + { + index = sub( index, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ); + } + st_ivas->hSpatParamRendCom->dirac_bs_md_write_idx = index; + move16(); + } +#endif IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) { IF( hQMetaData->q_direction == NULL ) @@ -743,7 +791,18 @@ ivas_error ivas_masa_dec_open_fx( ism_total_brate = 0; move32(); - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + /* ISM metadata */ + test(); + test(); + if ( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && + st_ivas->hIsmMetaData[0] != NULL && + EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + /* these are not needed -> clean. EXT metafile writer in OMASA needs only the number of ISMs and writes default null-data */ + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + } +#endif test(); test(); test(); @@ -826,7 +885,10 @@ ivas_error ivas_masa_dec_open_fx( nchan_transport = ivas_jbm_dec_get_num_tc_channels_fx( st_ivas ); nchan_to_allocate = nchan_transport; move16(); - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + test(); +#endif test(); test(); IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->renderer_type, RENDERER_MONO_DOWNMIX ) ) @@ -836,6 +898,15 @@ ivas_error ivas_masa_dec_open_fx( nchan_to_allocate = 1; move16(); } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && + ( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) || + EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) ) + { + nchan_transport = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + nchan_to_allocate = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + } +#endif ELSE IF( EQ_16( st_ivas->nchan_transport, 1 ) && EQ_32( st_ivas->renderer_type, RENDERER_DIRAC ) ) { /* addtl channel for CNG */ @@ -1830,8 +1901,18 @@ ivas_error ivas_masa_dec_reconfigure_fx( IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( NE_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + move16(); + st_ivas->nchan_ism = 0; /* Initialization if it has not been already read from the end of the bitstream at the same time + with reading of the format: nchan_ism is needed in MASA format because for the EXT output in + MASA-only (pre-rendering mode of OMASA) the number of ISMs to output correct number of empty objects is needed */ + } +#else st_ivas->nchan_ism = 0; move16(); +#endif st_ivas->ism_mode = ISM_MODE_NONE; move16(); } @@ -1854,6 +1935,10 @@ ivas_error ivas_masa_dec_reconfigure_fx( test(); test(); test(); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + test(); +#endif IF( EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC ) || EQ_16( st_ivas->renderer_type, RENDERER_BINAURAL_PARAMETRIC_ROOM ) || EQ_16( st_ivas->renderer_type, RENDERER_STEREO_PARAMETRIC ) ) { IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) ) @@ -1894,7 +1979,15 @@ ivas_error ivas_masa_dec_reconfigure_fx( /* addtl channel for CNG */ tc_nchan_to_allocate = add( tc_nchan_to_allocate, 1 ); } - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + ELSE IF( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && + ( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) || + EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) ) + { + tc_nchan_transport = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + tc_nchan_to_allocate = add( st_ivas->nchan_transport, st_ivas->nchan_ism ); + } +#endif test(); test(); IF( NE_16( tc_nchan_transport, st_ivas->hTcBuffer->nchan_transport_jbm ) || NE_16( tc_nchan_to_allocate, st_ivas->hTcBuffer->nchan_transport_internal ) || NE_16( buffer_mode_new, st_ivas->hTcBuffer->tc_buffer_mode ) ) @@ -3332,6 +3425,14 @@ static Word16 ivas_decode_masaism_metadata_fx( hMasaIsmData->energy_ratio_ism_fx[dir][meta_write_index][b] = energy_ratio_ism_fx[i][band][dir]; move32(); } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( hMasaIsmData->hExtData != NULL ) + { + hMasaIsmData->hExtData->masa_render_masa_to_total[meta_write_index][b] = + hMasaIsmData->masa_to_total_energy_ratio_fx[i][band]; + move32(); + } +#endif } } } diff --git a/lib_dec/ivas_omasa_dec_fx.c b/lib_dec/ivas_omasa_dec_fx.c index 35f4f1c4b..642e9af40 100644 --- a/lib_dec/ivas_omasa_dec_fx.c +++ b/lib_dec/ivas_omasa_dec_fx.c @@ -32,6 +32,9 @@ #include "options.h" #include +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT +#include +#endif #include "ivas_cnst.h" #include "ivas_prot_fx.h" #include "prot_fx.h" @@ -45,6 +48,223 @@ * Local constants *------------------------------------------------------------------------*/ +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + +#define EXT_RENDER_IIR_FAC 0.95f +#define MULT_17_DIV_20_Q15 ( Word16 )( ( 17.0 / 20.0f ) * pow( 2, 15 ) + 0.5f ) +#define MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ( Word16 )( ( 1.0 / CLDFB_NO_COL_MAX ) * pow( 2, 15 ) + 0.5f ) +#define ONEMINUX_EXT_RENDER_IIR_FAC_Q31 ( Word32 )( ( 1.0f - EXT_RENDER_IIR_FAC ) * pow( 2, 31 ) + 0.5f ) +#define EXT_RENDER_IIR_FAC_Q31 ( Word32 )( EXT_RENDER_IIR_FAC * pow( 2, 31 ) + 0.5f ) + +// Calculated as (Word16)(((1.0f / (50 * MAX_PARAM_SPATIAL_SUBFRAMES)) * pow(2, 15)) + 0.5f) +#define OMASA_DELAYFRAMES_PER_SEC_Q15 (Word16) 164 // Q15 + +static Word16 interpolator_table_48k_q15[] = { + 0, 137, 273, 410, 546, 683, 819, 956, 1092, 1229, + 1365, 1502, 1638, 1775, 1911, 2048, 2185, 2321, 2458, 2594, + 2731, 2867, 3004, 3140, 3277, 3413, 3550, 3686, 3823, 3959, + 4096, 4233, 4369, 4506, 4642, 4779, 4915, 5052, 5188, 5325, + 5461, 5598, 5734, 5871, 6007, 6144, 6281, 6417, 6554, 6690, + 6827, 6963, 7100, 7236, 7373, 7509, 7646, 7782, 7919, 8055, + 8192, 8329, 8465, 8602, 8738, 8875, 9011, 9148, 9284, 9421, + 9557, 9694, 9830, 9967, 10103, 10240, 10377, 10513, 10650, 10786, + 10923, 11059, 11196, 11332, 11469, 11605, 11742, 11878, 12015, 12151, + 12288, 12425, 12561, 12698, 12834, 12971, 13107, 13244, 13380, 13517, + 13653, 13790, 13926, 14063, 14199, 14336, 14473, 14609, 14746, 14882, + 15019, 15155, 15292, 15428, 15565, 15701, 15838, 15974, 16111, 16247, + 16384, 16521, 16657, 16794, 16930, 17067, 17203, 17340, 17476, 17613, + 17749, 17886, 18022, 18159, 18295, 18432, 18569, 18705, 18842, 18978, + 19115, 19251, 19388, 19524, 19661, 19797, 19934, 20070, 20207, 20343, + 20480, 20617, 20753, 20890, 21026, 21163, 21299, 21436, 21572, 21709, + 21845, 21982, 22118, 22255, 22391, 22528, 22665, 22801, 22938, 23074, + 23211, 23347, 23484, 23620, 23757, 23893, 24030, 24166, 24303, 24439, + 24576, 24713, 24849, 24986, 25122, 25259, 25395, 25532, 25668, 25805, + 25941, 26078, 26214, 26351, 26487, 26624, 26761, 26897, 27034, 27170, + 27307, 27443, 27580, 27716, 27853, 27989, 28126, 28262, 28399, 28535, + 28672, 28809, 28945, 29082, 29218, 29355, 29491, 29628, 29764, 29901, + 30037, 30174, 30310, 30447, 30583, 30720, 30857, 30993, 31130, 31266, + 31403, 31539, 31676, 31812, 31949, 32085, 32222, 32358, 32495, 32631 +}; + +static Word16 interpolator_table_32k_q15[] = { + 0, 205, 410, 614, 819, 1024, 1229, 1434, 1638, 1843, + 2048, 2253, 2458, 2662, 2867, 3072, 3277, 3482, 3686, 3891, + 4096, 4301, 4506, 4710, 4915, 5120, 5325, 5530, 5734, 5939, + 6144, 6349, 6554, 6758, 6963, 7168, 7373, 7578, 7782, 7987, + 8192, 8397, 8602, 8806, 9011, 9216, 9421, 9626, 9830, 10035, + 10240, 10445, 10650, 10854, 11059, 11264, 11469, 11674, 11878, 12083, + 12288, 12493, 12698, 12902, 13107, 13312, 13517, 13722, 13926, 14131, + 14336, 14541, 14746, 14950, 15155, 15360, 15565, 15770, 15974, 16179, + 16384, 16589, 16794, 16998, 17203, 17408, 17613, 17818, 18022, 18227, + 18432, 18637, 18842, 19046, 19251, 19456, 19661, 19866, 20070, 20275, + 20480, 20685, 20890, 21094, 21299, 21504, 21709, 21914, 22118, 22323, + 22528, 22733, 22938, 23142, 23347, 23552, 23757, 23962, 24166, 24371, + 24576, 24781, 24986, 25190, 25395, 25600, 25805, 26010, 26214, 26419, + 26624, 26829, 27034, 27238, 27443, 27648, 27853, 28058, 28262, 28467, + 28672, 28877, 29082, 29286, 29491, 29696, 29901, 30106, 30310, 30515, + 30720, 30925, 31130, 31334, 31539, 31744, 31949, 32154, 32358, 32563 +}; + +static Word16 interpolator_table_16k_q15[] = { + 0, 410, 819, 1229, 1638, 2048, 2458, 2867, 3277, 3686, + 4096, 4506, 4915, 5325, 5734, 6144, 6554, 6963, 7373, 7782, + 8192, 8602, 9011, 9421, 9830, 10240, 10650, 11059, 11469, 11878, + 12288, 12698, 13107, 13517, 13926, 14336, 14746, 15155, 15565, 15974, + 16384, 16794, 17203, 17613, 18022, 18432, 18842, 19251, 19661, 20070, + 20480, 20890, 21299, 21709, 22118, 22528, 22938, 23347, 23757, 24166, + 24576, 24986, 25395, 25805, 26214, 26624, 27034, 27443, 27853, 28262, + 28672, 29082, 29491, 29901, 30310, 30720, 31130, 31539, 31949, 32358 +}; + +/** + * Calculate mantissa (Q31) * gain (Q31). + * + * Exponent for the mantissa value is also included as input parameter. + * Adjust the result so that accuracy of the mantissa multiplication is maximixed + * and the corresponding exponent is minimized. + */ +static Word32 mult32_mantissa_fx( Word32 mantissa, Word32 gain, Word16 exp, Word16 *exp_result ) +{ + Word64 mult = W_mult_32_32( mantissa, gain ); // Q31 * Q31 -> Q63 + Word16 norm = W_norm( mult ); + Word32 result = W_extract_h( W_shl( mult, norm ) ); // Q63 -> Q31 + *exp_result = sub( exp, norm ); + + return result; +} + +/** + * Calculate re^2 + im^2 using exponent (Q0) and mantissa (Q31) format. + */ +static Word32 sample_energy_fx( Word32 re_m, Word16 re_e, Word32 im_m, Word16 im_e, Word16 *exp_result ) +{ + Word16 re_exp = add( re_e, re_e ); + Word32 re_mult = mult32_mantissa_fx( re_m, re_m, re_exp, &re_exp ); + move32(); + + Word16 im_exp = add( im_e, im_e ); + Word32 im_mult = mult32_mantissa_fx( im_m, im_m, im_exp, &im_exp ); + move32(); + + return BASOP_Util_Add_Mant32Exp( re_mult, re_exp, im_mult, im_exp, exp_result ); +} + +/** + * Accumulate sum of re^2 + im^2 over the specified length using exponent (Q0) and mantissa (Q31) format. + */ +static void sample_energy_acc_fx( Word32 *re_m, Word16 *re_e, Word32 *im_m, Word16 *im_e, Word32 *out_m, Word16 *out_e, Word16 len ) +{ + Word16 i; + + FOR( i = 0; i < len; i++ ) + { + Word16 exp; + + // energy = re^2 + im^2 + Word32 mantissa = sample_energy_fx( re_m[i], re_e[i], im_m[i], im_e[i], &exp ); + move32(); + + // Accumulate energy + *out_m = BASOP_Util_Add_Mant32Exp( *out_m, *out_e, mantissa, exp, out_e ); + move32(); + } +} + +// Multiplication of vector (comprising of exponent and mantissa parts) by constant value (Q31) +static void v_multc_exp_mantissa_fx( + const Word32 *in_mantissa, + const Word16 *in_exp, + Word32 c, + Word32 *out_mantissa, + Word16 *out_exp, + Word16 len ) +{ + Word16 i; + + FOR( i = 0; i < len; i++ ) + { + out_mantissa[i] = mult32_mantissa_fx( in_mantissa[i], c, in_exp[i], &out_exp[i] ); + move32(); + } +} + +// Multiplication of vector (comprising of exponent and mantissa parts) by constant acumulate to the output +static void v_multc_acc_exp_mantissa_fx( + const Word32 *in_mantissa, + const Word16 *in_exp, + Word32 c, + Word32 *out_mantissa, + Word16 *out_exp, + Word16 len ) +{ + Word16 i; + + FOR( i = 0; i < len; i++ ) + { + Word16 exp; + Word32 mantissa = mult32_mantissa_fx( in_mantissa[i], c, in_exp[i], &exp ); + move32(); + + out_mantissa[i] = BASOP_Util_Add_Mant32Exp( out_mantissa[i], out_exp[i], + mantissa, exp, &out_exp[i] ); + move32(); + } +} + +// Calculate min( 4, sqrtf( target / proto ) ) +// target and proto values are expressed using exponent and mantissa +static Word32 get_processing_gain_fx( Word32 proto_m, Word16 proto_e, Word32 target_m, Word16 target_e, Word16 *exp ) +{ + Word16 b = extract_h( proto_m ); + IF( EQ_16( b, 0 ) ) + { + b = 1; + move16(); + } + + Word16 mantissa; + BASOP_Util_Divide_MantExp( extract_h( target_m ), target_e, b, proto_e, &mantissa, exp ); + + Word32 sqrt_mantissa = Sqrt32( L_shl( mantissa, 16 ), exp ); + + Word16 norm = norm_l( sqrt_mantissa ); + sqrt_mantissa = L_shl( sqrt_mantissa, norm ); + *exp = sub( *exp, norm ); + + test(); + IF( GT_16( *exp, 2 ) && NE_32( sqrt_mantissa, 0 ) ) + { + // (2^3) * (1073741824 / 2^31) == 4.0 + sqrt_mantissa = ONE_IN_Q30; // 0.5 in Q31 + *exp = 3; + move32(); + move16(); + } + + return sqrt_mantissa; +} + +static void mantissa_exp_to_qvalue( Word16 *exp, Word32 *output, Word16 target_exp, Word16 len ) +{ + Word16 bin; + + FOR( bin = 0; bin < len; bin++ ) + { + IF( LT_16( exp[bin], -Q31 ) ) + { + output[bin] = 0; + move32(); + } + ELSE + { + Word16 shift = sub( target_exp, exp[bin] ); + output[bin] = W_sat_l( W_shr( output[bin], shift ) ); + } + } +} + +#endif + /*-------------------------------------------------------------------* * ivas_omasa_data_open() @@ -110,6 +330,51 @@ ivas_error ivas_omasa_data_open_fx( set16_fx( hMasaIsmData->azimuth_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); set16_fx( hMasaIsmData->elevation_separated_ism, 0, MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR ); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + hMasaIsmData->hExtData = NULL; + move32(); + + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + MASA_ISM_EXT_DATA_HANDLE hExtData; + hExtData = (MASA_ISM_EXT_DATA_HANDLE) malloc( sizeof( MASA_ISM_EXT_DATA ) ); + move32(); + + IF( hExtData == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA ISM data\n" ) ); + } + + hExtData->prev_idx_separated_ism = 0; + move16(); + + FOR( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + set32_fx( hExtData->prev_panning_gains[ch], 0, 2 ); + } + + FOR( ch = 0; ch < MAX_NUM_OBJECTS; ch++ ) + { + set32_fx( hExtData->ism_render_proto_energy_frac[ch], 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->ism_render_proto_energy_exp[ch], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( hExtData->ism_render_target_energy_frac[ch], 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->ism_render_target_energy_exp[ch], 0, CLDFB_NO_CHANNELS_MAX ); + } + + set32_fx( hExtData->masa_render_proto_energy_frac, 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->masa_render_proto_energy_exp, 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( hExtData->masa_render_target_energy_frac, 0, CLDFB_NO_CHANNELS_MAX ); + set16_fx( hExtData->masa_render_target_energy_exp, 0, CLDFB_NO_CHANNELS_MAX ); + + FOR( sf = 0; sf < add( MAX_PARAM_SPATIAL_SUBFRAMES, DELAY_MASA_PARAM_DEC_SFR ); sf++ ) + { + set32_fx( hExtData->masa_render_masa_to_total[sf], 0, CLDFB_NO_CHANNELS_MAX ); + } + + hMasaIsmData->hExtData = hExtData; + move32(); + } +#endif st_ivas->hMasaIsmData = hMasaIsmData; return IVAS_ERR_OK; @@ -143,7 +408,14 @@ void ivas_omasa_data_close_fx( free( ( *hMasaIsmData )->delayBuffer_fx ); ( *hMasaIsmData )->delayBuffer_fx = NULL; } - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( ( *hMasaIsmData )->hExtData != NULL ) + { + free( ( *hMasaIsmData )->hExtData ); + ( *hMasaIsmData )->hExtData = NULL; + move32(); + } +#endif free( *hMasaIsmData ); *hMasaIsmData = NULL; @@ -293,7 +565,59 @@ ivas_error ivas_omasa_dec_config_fx( /* ISM MD reconfig. */ n_MD = 0; move16(); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + /* the full number of hIsmMetaData are needed for EXT output */ + move16(); + n_MD = st_ivas->nchan_ism; + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + + error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); + } + ELSE + { + test(); + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + n_MD = 1; + move16(); + + IF( st_ivas->hIsmMetaData[0] == NULL ) + { + error = ivas_ism_metadata_dec_create_fx( st_ivas, 1, NULL ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + } + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) ) + { + n_MD = st_ivas->nchan_ism; + move16(); + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, 0 ); + error = ivas_ism_metadata_dec_create_fx( st_ivas, st_ivas->nchan_ism, NULL ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + } + + ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); + } +#else test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) { @@ -322,7 +646,7 @@ ivas_error ivas_omasa_dec_config_fx( } ivas_ism_metadata_close( st_ivas->hIsmMetaData, n_MD ); - +#endif st_ivas->hCPE[0]->element_brate = L_sub( ivas_total_brate, ism_total_brate ); /*-----------------------------------------------------------------* @@ -351,8 +675,15 @@ ivas_error ivas_omasa_dec_config_fx( } /* objects renderer reconfig. */ +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + IF( st_ivas->hMasaIsmData != NULL || st_ivas->hIsmRendererData != NULL ) + { + /* this calls also ivas_ism_renderer_close() closing st_ivas->hIsmRendererData used by the EXT renderers. also cleans st_ivas->hMasaIsmData */ +#else IF( st_ivas->hMasaIsmData != NULL ) { +#endif ivas_omasa_separate_object_renderer_close( st_ivas ); } @@ -414,7 +745,49 @@ ivas_error ivas_omasa_dec_config_fx( ivas_omasa_separate_object_renderer_close( st_ivas ); } } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_MIX_EXT ) ) + { + /* Allocate 'hIsmRendererData' handle */ + error = ivas_omasa_combine_separate_ism_with_masa_open_fx( st_ivas ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + } + + IF( EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) + { + DIRAC_CONFIG_FLAG common_rend_config_flag; + IF( st_ivas->hSpatParamRendCom == NULL ) + { + common_rend_config_flag = DIRAC_OPEN; + } + ELSE + { + common_rend_config_flag = DIRAC_RECONFIGURE; + } + move32(); + /* Allocate 'hIsmRendererData' handle and memory for delay buffer within 'hMasaIsmData' */ + error = ivas_omasa_render_objects_from_mix_open_fx( st_ivas ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + + error = ivas_spat_hSpatParamRendCom_config_fx( &st_ivas->hSpatParamRendCom, + common_rend_config_flag, 0, + st_ivas->ivas_format, st_ivas->mc_mode, st_ivas->hDecoderConfig->output_Fs, 0, 0 ); + move32(); + IF( NE_32( error, IVAS_ERR_OK ) ) + { + return error; + } + } +#endif /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ @@ -600,7 +973,9 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( *nchan_transport_ism = 1; move16(); } - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); +#endif test(); IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_DISC ) || EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) { @@ -666,6 +1041,37 @@ ivas_error ivas_omasa_ism_metadata_dec_fx( } } } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) && + EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + azimuth_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[0]->azimuth_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[0]->azimuth_fx < 0 ) + { + azimuth_ism = negate( azimuth_ism ); + } + elevation_ism = extract_l( L_shr_r( L_abs( st_ivas->hIsmMetaData[0]->elevation_fx ), 22 ) ); + if ( st_ivas->hIsmMetaData[0]->elevation_fx < 0 ) + { + elevation_ism = negate( elevation_ism ); + } + + FOR( block = 0; block < 2; block++ ) + { + st_ivas->hMasaIsmData->azimuth_separated_ism[block] = st_ivas->hMasaIsmData->azimuth_separated_ism[add( block, 2 )]; + st_ivas->hMasaIsmData->elevation_separated_ism[block] = st_ivas->hMasaIsmData->elevation_separated_ism[add( block, 2 )]; + move16(); + move16(); + } + FOR( block = 2; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + st_ivas->hMasaIsmData->azimuth_separated_ism[block] = azimuth_ism; + st_ivas->hMasaIsmData->elevation_separated_ism[block] = elevation_ism; + move16(); + move16(); + } + } +#endif } return IVAS_ERR_OK; @@ -865,3 +1271,846 @@ void ivas_omasa_rearrange_channels_fx( return; } + +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + +/*-------------------------------------------------------------------------* + * ivas_omasa_combine_separate_ism_with_masa_open_fx() + * + * Open structures, reserve memory, and init values. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_combine_separate_ism_with_masa_open_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i; + Word16 *tmp; + + st_ivas->hIsmRendererData = (ISM_RENDERER_HANDLE) malloc( sizeof( ISM_RENDERER_DATA ) ); + move32(); + + IF( st_ivas->hIsmRendererData == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM renderer \n" ) ); + } + + FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + set_zero_fx( st_ivas->hIsmRendererData->prev_gains_fx[i], MAX_OUTPUT_CHANNELS ); + } + + test(); + test(); + IF( EQ_32( st_ivas->hDecoderConfig->output_Fs, 16000 ) || + EQ_32( st_ivas->hDecoderConfig->output_Fs, 32000 ) || + EQ_32( st_ivas->hDecoderConfig->output_Fs, 48000 ) ) + { + IF( EQ_32( st_ivas->hDecoderConfig->output_Fs, 16000 ) ) + { + st_ivas->hIsmRendererData->interpolator_len = 80; + tmp = interpolator_table_16k_q15; + } + ELSE IF( EQ_32( st_ivas->hDecoderConfig->output_Fs, 32000 ) ) + { + st_ivas->hIsmRendererData->interpolator_len = 160; + tmp = interpolator_table_32k_q15; + } + ELSE + { + st_ivas->hIsmRendererData->interpolator_len = 240; + tmp = interpolator_table_48k_q15; + } + move16(); + move32(); + + st_ivas->hIsmRendererData->interpolator_fx = + (Word16 *) malloc( sizeof( Word16 ) * st_ivas->hIsmRendererData->interpolator_len ); + + IF( st_ivas->hIsmRendererData->interpolator_fx == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA ISM renderer interpolator\n" ) ); + } + + FOR( i = 0; i < st_ivas->hIsmRendererData->interpolator_len; i++ ) + { + st_ivas->hIsmRendererData->interpolator_fx[i] = tmp[i]; + move16(); + } + } + ELSE + { + return ( IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Unsupported output sample rate\n" ) ); + } + + return IVAS_ERR_OK; +} + +/*--------------------------------------------------------------------------* + * ivas_omasa_combine_separate_ism_with_masa_fx() + * + * in case of external rendering, combine separated ISM signal with MASA stream + *--------------------------------------------------------------------------*/ + +void ivas_omasa_combine_separate_ism_with_masa_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* i/o: output synthesis signal */ + Word16 *output_q, /* i/o: output Q value */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame /* i : output frame length per channel */ +) +{ + Word16 n, sf, band, k; + MASA_DECODER_EXT_OUT_META_HANDLE masaMetaHandle; + MASA_DECODER_EXT_OUT_META_HANDLE ismMetaHandle; + MASA_DECODER_EXT_OUT_META ismMeta; + Word32 inRe[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 inIm[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + UWord16 directionIndex; + Word16 nchan_in; + Word16 nBins; + Word16 slot; + Word16 mrange[2], brange[2]; + Word16 processing_len, offset; + + Word32 old_panning_gains_fx[2]; + Word32 new_panning_gains_fx[2]; + + Word16 inRe_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 inIm_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 out_exp[MASA_MAX_TRANSPORT_CHANNELS + 1][L_FRAME48k]; + + Word16 eneMasa_exp[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 eneMasa_frac[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word16 eneIsm_exp[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + Word32 eneIsm_frac[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + Word16 old_panning_gains_q15_fx[2]; + Word16 new_panning_gains_q15_fx[2]; + + Word16 exp; + + masaMetaHandle = st_ivas->hMasa->data.extOutMeta; + ismMetaHandle = &ismMeta; + move32(); + move32(); + + /* Compute CLDFB analysis */ + nchan_in = add( st_ivas->nchan_transport, 1 ); + nBins = mult( output_frame, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); // Q15 + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + FOR( n = 0; n < nchan_in; n++ ) + { + Word16 in_q = *output_q; + move16(); + + cldfbAnalysis_ts_fx_var_q( &( output[n][L_mult0( nBins, slot )] ), + inRe[n][slot], + inIm[n][slot], + nBins, st_ivas->cldfbAnaDec[n], &in_q ); + + /* Assign input exponent */ + exp = sub( Q31, in_q ); + set16_fx( inRe_exp[n][slot], exp, nBins ); + set16_fx( inIm_exp[n][slot], exp, nBins ); + } + } + + /* Convert output to exponent+mantissa representation */ + exp = sub( Q31, *output_q ); + FOR( n = 0; n < add( MASA_MAX_TRANSPORT_CHANNELS, 1 ); n++ ) + { + set16_fx( out_exp[n], exp, output_frame ); + } + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + set16_fx( eneMasa_exp[sf], 0, MASA_FREQUENCY_BANDS ); + set32_fx( eneMasa_frac[sf], 0, MASA_FREQUENCY_BANDS ); + + set16_fx( eneIsm_exp[sf], 0, MASA_FREQUENCY_BANDS ); + set32_fx( eneIsm_frac[sf], 0, MASA_FREQUENCY_BANDS ); + } + + /* Determine energies */ + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + mrange[0] = st_ivas->hMasa->config.block_grouping[sf]; + mrange[1] = st_ivas->hMasa->config.block_grouping[add( sf, 1 )]; + move16(); + move16(); + + FOR( slot = mrange[0]; slot < mrange[1]; slot++ ) + { + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + brange[0] = st_ivas->hMasa->config.band_grouping[band]; + brange[1] = st_ivas->hMasa->config.band_grouping[add( band, 1 )]; + move16(); + move16(); + + IF( GT_16( brange[1], nBins ) ) + { + brange[1] = nBins; + move16(); + } + + Word16 len = sub( brange[1], brange[0] ); + + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + sample_energy_acc_fx( &inRe[n][slot][brange[0]], + &inRe_exp[n][slot][brange[0]], + &inIm[n][slot][brange[0]], + &inIm_exp[n][slot][brange[0]], + &eneMasa_frac[sf][band], + &eneMasa_exp[sf][band], + len ); + } + + sample_energy_acc_fx( &inRe[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &inRe_exp[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &inIm[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &inIm_exp[MASA_MAX_TRANSPORT_CHANNELS][slot][brange[0]], + &eneIsm_frac[sf][band], + &eneIsm_exp[sf][band], + len ); + } + } + } + + /* Determine MASA metadata for the object */ + ismMetaHandle->descriptiveMeta.numberOfDirections = 0u; + move16(); + + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + Word32 ele, azi; + + ele = st_ivas->hMasaIsmData->elevation_separated_ism[sf]; + azi = st_ivas->hMasaIsmData->azimuth_separated_ism[sf]; + + directionIndex = index_theta_phi_16_fx( &ele, &azi, st_ivas->hMasa->data.sph_grid16 ); + + FOR( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + ismMetaHandle->directionIndex[0][sf][band] = directionIndex; + ismMetaHandle->directToTotalRatio[0][sf][band] = UINT8_MAX; + ismMetaHandle->spreadCoherence[0][sf][band] = 0; + ismMetaHandle->surroundCoherence[sf][band] = 0; + ismMetaHandle->diffuseToTotalRatio[sf][band] = 0; + move16(); + move16(); + move16(); + move16(); + move16(); + } + } + + /* Merge MASA metadatas */ + ivas_prerend_merge_masa_metadata_fx( masaMetaHandle, masaMetaHandle, + IVAS_REND_AUDIO_CONFIG_TYPE_MASA, + eneMasa_frac, eneMasa_exp, ismMetaHandle, IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED, + eneIsm_frac, eneIsm_exp ); + + /* Mix the separated object audio signal to the MASA audio signals */ + ivas_get_stereo_panning_gains_fx( st_ivas->hMasaIsmData->azimuth_separated_ism[0], + st_ivas->hMasaIsmData->elevation_separated_ism[0], old_panning_gains_q15_fx ); + ivas_get_stereo_panning_gains_fx( st_ivas->hMasaIsmData->azimuth_separated_ism[2], + st_ivas->hMasaIsmData->elevation_separated_ism[2], new_panning_gains_q15_fx ); + + /* Subsequent processing in Q31 format */ + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + new_panning_gains_fx[n] = L_shl( new_panning_gains_q15_fx[n], Q16 ); + old_panning_gains_fx[n] = L_shl( old_panning_gains_q15_fx[n], Q16 ); + } + + processing_len = shr( output_frame, 1 ); + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + v_multc_acc_exp_mantissa_fx( output[MASA_MAX_TRANSPORT_CHANNELS], + out_exp[MASA_MAX_TRANSPORT_CHANNELS], + old_panning_gains_fx[n], + output[n], + out_exp[n], + processing_len ); + } + offset = processing_len; + move16(); + + processing_len = shr( output_frame, 2 ); /* divide by MAX_PARAM_SPATIAL_SUBFRAMES; */ + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + Word32 mantissa; + + /* k == 0->gain == old_panning_gains[n] */ + /* output[n][offset] += gain * output[MASA_MAX_TRANSPORT_CHANNELS][offset]; */ + mantissa = mult32_mantissa_fx( output[MASA_MAX_TRANSPORT_CHANNELS][offset], + old_panning_gains_fx[n], + out_exp[MASA_MAX_TRANSPORT_CHANNELS][offset], &exp ); + + output[n][offset] = BASOP_Util_Add_Mant32Exp( output[n][offset], out_exp[n][offset], + mantissa, exp, &out_exp[n][offset] ); + move32(); + move32(); + + FOR( k = 1; k < processing_len; k++ ) + { + Word16 index = add( k, offset ); + + Word32 g1_fx = L_shl( st_ivas->hIsmRendererData->interpolator_fx[k], Q16 ); + + /* 1.0f - g1 */ + Word32 g2_fx = L_sub( MAX_32, L_sub( g1_fx, 1 ) ); + + /* g1 *new_panning_gains[n] + g2 *old_panning_gains[n] */ + Word32 gain_k = W_extract_h( W_add( W_mult_32_32( g1_fx, new_panning_gains_fx[n] ), + W_mult_32_32( g2_fx, old_panning_gains_fx[n] ) ) ); + + /* output[n][k + offset] += gain_k * output[MASA_MAX_TRANSPORT_CHANNELS][k + offset]; */ + mantissa = mult32_mantissa_fx( output[MASA_MAX_TRANSPORT_CHANNELS][index], gain_k, + out_exp[MASA_MAX_TRANSPORT_CHANNELS][index], &exp ); + output[n][index] = BASOP_Util_Add_Mant32Exp( output[n][index], out_exp[n][index], + mantissa, exp, &out_exp[n][index] ); + move32(); + move32(); + } + } + offset = add( offset, processing_len ); + + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + v_multc_acc_exp_mantissa_fx( &output[MASA_MAX_TRANSPORT_CHANNELS][offset], + &out_exp[MASA_MAX_TRANSPORT_CHANNELS][offset], + new_panning_gains_fx[n], + &output[n][offset], + &out_exp[n][offset], + processing_len ); + } + + /* Convert output from exponent+mantissa representation to Q11 */ + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + mantissa_exp_to_qvalue( &out_exp[n][0], &output[n][0], Q20, output_frame ); + } + + /* Zero output object channels */ + FOR( n = 0; n < nchan_ism; n++ ) + { + set_zero_fx( output[add( MASA_MAX_TRANSPORT_CHANNELS, n )], output_frame ); + } +} + + +/*-------------------------------------------------------------------------* + * ivas_omasa_render_objects_from_mix_open_fx() + * + * Open structures, reserve memory, and init values. + *-------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_render_objects_from_mix_open_fx( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 i; + Word32 size; + + st_ivas->hMasaIsmData->delayBuffer_nchan = 1; + move16(); + + st_ivas->hMasaIsmData->delayBuffer_size = extract_l( Mult_32_16( st_ivas->hDecoderConfig->output_Fs, + OMASA_DELAYFRAMES_PER_SEC_Q15 ) ); + + size = L_mult0( st_ivas->hMasaIsmData->delayBuffer_nchan, sizeof( Word16 * ) ); + st_ivas->hMasaIsmData->delayBuffer_fx = (Word32 **) malloc( size ); + move32(); + + IF( st_ivas->hMasaIsmData->delayBuffer_fx == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + + size = L_mult0( st_ivas->hMasaIsmData->delayBuffer_size, sizeof( Word32 ) ); + FOR( i = 0; i < st_ivas->hMasaIsmData->delayBuffer_nchan; i++ ) + { + st_ivas->hMasaIsmData->delayBuffer_fx[i] = (Word32 *) malloc( size ); + move32(); + + IF( st_ivas->hMasaIsmData->delayBuffer_fx[i] == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for MASA ISM delay buffer \n" ) ); + } + set_zero_fx( st_ivas->hMasaIsmData->delayBuffer_fx[i], st_ivas->hMasaIsmData->delayBuffer_size ); + } + + return IVAS_ERR_OK; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_render_objects_from_mix() + * + * In case of external rendering, render objects from the transport signal + * mix containing MASA audio and object audio. + *--------------------------------------------------------------------------*/ + +void ivas_omasa_render_objects_from_mix_fx( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + Word32 *output[], /* o : output synthesis signal */ + const int16_t nchan_ism, /* i : number of ISMs */ + const int16_t output_frame, /* i : output frame length per channel */ + Word16 *output_q /* i/o: output Q value */ +) +{ + Word16 n, m, i; + MASA_ISM_EXT_DATA_HANDLE hExtData; + Word32 separated_object[L_FRAME48k]; + Word32 rendered_objects[MAX_NUM_OBJECTS][L_FRAME48k]; + Word16 coding_delay; + Word32 inRe[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 inIm[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 outRe[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 outIm[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 slot; + Word16 sf; + Word16 bin; + Word16 nchan_transport; + Word16 nBins; + + Word16 inRe_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 inIm_exp[3][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 outRe_exp[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word16 outIm_exp[MAX_NUM_OBJECTS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + Word16 transport_energy_exp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 transport_energy_frac[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + + /* Create slot to metadata map */ + slot = 0; + move16(); + FOR( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + Word16 index; + + FOR( i = 0; i < CLDFB_SLOTS_PER_SUBFRAME; i++ ) + { + st_ivas->hSpatParamRendCom->render_to_md_map[slot] = st_ivas->hSpatParamRendCom->dirac_read_idx; + move16(); + slot = add( slot, 1 ); + } + + index = add( st_ivas->hSpatParamRendCom->dirac_read_idx, 1 ); + IF( GE_16( index, st_ivas->hSpatParamRendCom->dirac_md_buffer_length ) ) + { + index = 0; + move16(); + } + st_ivas->hSpatParamRendCom->dirac_read_idx = index; + move16(); + } + + /* Move separated object signal and object channels */ + mvl2l( output[CPE_CHANNELS], separated_object, output_frame ); + FOR( n = 0; n < nchan_ism; n++ ) + { + set_zero_fx( output[CPE_CHANNELS + n], output_frame ); + } + + /* Delay the separated object signal by the CLDFB delay */ + delay_signal32_fx( separated_object, output_frame, st_ivas->hMasaIsmData->delayBuffer_fx[0], + st_ivas->hMasaIsmData->delayBuffer_size ); + + /* Set object metadata to the ism struct */ + FOR( n = 0; n < nchan_ism; n++ ) + { + // Q0 -> Q22 + Word32 azi = L_shl( st_ivas->hMasaIsmData->azimuth_ism[n][st_ivas->hSpatParamRendCom->dirac_read_idx], Q22 ); + Word32 ele = L_shl( st_ivas->hMasaIsmData->elevation_ism[n][st_ivas->hSpatParamRendCom->dirac_read_idx], Q22 ); + + st_ivas->hIsmMetaData[n]->azimuth_fx = azi; + st_ivas->hIsmMetaData[n]->elevation_fx = ele; + move16(); + move16(); + } + + /* Move the separated object signal to the correct output channel */ + hExtData = st_ivas->hMasaIsmData->hExtData; + move32(); + coding_delay = mult( output_frame, MULT_17_DIV_20_Q15 ); /* Q15: 17 ms of coding and CLDFB delay */ + mvl2l( separated_object, output[add( CPE_CHANNELS, hExtData->prev_idx_separated_ism )], coding_delay ); + mvl2l( &separated_object[coding_delay], + &output[add( CPE_CHANNELS, st_ivas->hMasaIsmData->idx_separated_ism )][coding_delay], + sub( output_frame, coding_delay ) ); + + /* Compute CLDFB analysis */ + nchan_transport = st_ivas->nchan_transport; + move16(); + nBins = mult( output_frame, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); // Q15 + + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + FOR( n = 0; n < nchan_transport; n++ ) + { + Word16 in_q = *output_q; + move16(); + + cldfbAnalysis_ts_fx_var_q( &( output[n][L_mult0( nBins, slot )] ), + inRe[n][slot], + inIm[n][slot], + nBins, st_ivas->cldfbAnaDec[n], &in_q ); + + /* Assign input exponent */ + Word16 exp = sub( Q31, in_q ); + set16_fx( inRe_exp[n][slot], exp, nBins ); + set16_fx( inIm_exp[n][slot], exp, nBins ); + } + } + + /* Create prototype signals */ + for ( n = 0; n < nchan_ism; n++ ) + { + Word32 panning_gains_fx[2]; + Word16 new_panning_gains_fx[2]; + Word16 azimuth_fx, elevation_fx; + + // Q22 -> Q0 + azimuth_fx = extract_l( L_shr( st_ivas->hIsmMetaData[n]->azimuth_fx, Q22 ) ); + elevation_fx = extract_l( L_shr( st_ivas->hIsmMetaData[n]->elevation_fx, Q22 ) ); + ivas_get_stereo_panning_gains_fx( azimuth_fx, elevation_fx, new_panning_gains_fx ); + + Word16 interpValInc = 0; + move16(); + + // Represents (1.0f - interpVal) value + Word16 interpValDec = extract_l( L_sub( -MIN16B, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ) ); + + FOR( slot = 0; slot < sub( CLDFB_NO_COL_MAX, 1 ); slot++ ) + { + interpValInc = add( interpValInc, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); + + FOR( m = 0; m < 2; m++ ) + { + Word32 prev_gain = hExtData->prev_panning_gains[n][m]; + move32(); + + Word32 new_gain = L_shl( new_panning_gains_fx[m], 16 ); // Q15 -> Q31 + + panning_gains_fx[m] = L_add( Mpy_32_16( extract_h( prev_gain ), extract_l( prev_gain ), + interpValDec ), + Mpy_32_16( extract_h( new_gain ), extract_l( new_gain ), + interpValInc ) ); + } + + interpValDec = sub( interpValDec, MULT_1_DIV_CLDFB_NO_COL_MAX_Q15 ); + + v_multc_exp_mantissa_fx( inRe[0][slot], inRe_exp[0][slot], panning_gains_fx[0], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_exp_mantissa_fx( inIm[0][slot], inIm_exp[0][slot], panning_gains_fx[0], + outIm[n][slot], outIm_exp[n][slot], nBins ); + + v_multc_acc_exp_mantissa_fx( inRe[1][slot], inRe_exp[1][slot], panning_gains_fx[1], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_acc_exp_mantissa_fx( inIm[1][slot], inIm_exp[1][slot], panning_gains_fx[1], + outIm[n][slot], outIm_exp[n][slot], nBins ); + } + + // Special case where (1.0f - interpVal) = 0 and interpVal = 1 + FOR( m = 0; m < 2; m++ ) + { + panning_gains_fx[m] = L_shl( new_panning_gains_fx[m], 16 ); // Q15 -> Q31 + } + + v_multc_exp_mantissa_fx( inRe[0][slot], inRe_exp[0][slot], panning_gains_fx[0], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_exp_mantissa_fx( inIm[0][slot], inIm_exp[0][slot], panning_gains_fx[0], + outIm[n][slot], outIm_exp[n][slot], nBins ); + + v_multc_acc_exp_mantissa_fx( inRe[1][slot], inRe_exp[1][slot], panning_gains_fx[1], + outRe[n][slot], outRe_exp[n][slot], nBins ); + v_multc_acc_exp_mantissa_fx( inIm[1][slot], inIm_exp[1][slot], panning_gains_fx[1], + outIm[n][slot], outIm_exp[n][slot], nBins ); + + FOR( m = 0; m < 2; m++ ) + { + hExtData->prev_panning_gains[n][m] = panning_gains_fx[m]; + move32(); + } + } + + /* Determine transport energy */ + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + set_zero_fx( &transport_energy_frac[slot][0], nBins ); + set16_zero_fx( &transport_energy_exp[slot][0], nBins ); + } + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + FOR( bin = 0; bin < nBins; bin++ ) + { + Word16 exp; + + // energy = re^2 + im^2 + Word32 mantissa = sample_energy_fx( inRe[n][slot][bin], inRe_exp[n][slot][bin], + inIm[n][slot][bin], inIm_exp[n][slot][bin], &exp ); + move32(); + + // Accumulate energy + transport_energy_frac[slot][bin] = BASOP_Util_Add_Mant32Exp( transport_energy_frac[slot][bin], + transport_energy_exp[slot][bin], + mantissa, + exp, + &transport_energy_exp[slot][bin] ); + move32(); + } + } + } + + /* Determine temporally smoothed energies and determine gains using them */ + FOR( n = 0; n < nchan_ism; n++ ) + { + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + Word16 md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[slot]; + move16(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + Word16 exp, exp_mult, proto_e, target_e; + Word32 mantissa, proto_m, target_m; + + Word32 ism_target_energy_frac; + Word16 ism_target_energy_exp; + + Word32 ism_proto_energy_frac; + Word16 ism_proto_energy_exp; + + // r1 = transport_energy[slot][bin] * st_ivas->hMasaIsmData->energy_ratio_ism[n][md_idx][bin] + ism_target_energy_frac = mult32_mantissa_fx( transport_energy_frac[slot][bin], + st_ivas->hMasaIsmData->energy_ratio_ism_fx[n][md_idx][bin], + add( transport_energy_exp[slot][bin], 1 ), + &ism_target_energy_exp ); + move32(); + + // r2 = r1 * (1.0 - EXT_RENDER_IIR_FAC) + ism_target_energy_frac = mult32_mantissa_fx( ism_target_energy_frac, + ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + ism_target_energy_exp, + &ism_target_energy_exp ); + move32(); + + // r3 = re^2 + im^2 + mantissa = sample_energy_fx( outRe[n][slot][bin], + outRe_exp[n][slot][bin], + outIm[n][slot][bin], + outIm_exp[n][slot][bin], + &exp ); + move32(); + + // r4 = r3 * (1 - EXT_RENDER_IIR_FAC) + ism_proto_energy_frac = mult32_mantissa_fx( mantissa, ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + exp, &ism_proto_energy_exp ); + move32(); + + + // r5 = ism_render_proto_energy[n][bin] * EXT_RENDER_IIR_FAC + proto_m = mult32_mantissa_fx( hExtData->ism_render_proto_energy_frac[n][bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->ism_render_proto_energy_exp[n][bin], &proto_e ); + move32(); + + // r6 = r5 + r4 + proto_m = BASOP_Util_Add_Mant32Exp( proto_m, proto_e, + ism_proto_energy_frac, + ism_proto_energy_exp, + &proto_e ); + move32(); + + // r7 = ism_render_target_energy[n][bin] * EXT_RENDER_IIR_FAC + target_m = mult32_mantissa_fx( hExtData->ism_render_target_energy_frac[n][bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->ism_render_target_energy_exp[n][bin], &target_e ); + move32(); + + // r8 = r7 + r2 + target_m = BASOP_Util_Add_Mant32Exp( target_m, target_e, + ism_target_energy_frac, + ism_target_energy_exp, + &target_e ); + move32(); + + hExtData->ism_render_proto_energy_frac[n][bin] = proto_m; + hExtData->ism_render_proto_energy_exp[n][bin] = proto_e; + move32(); + move16(); + + hExtData->ism_render_target_energy_frac[n][bin] = target_m; + hExtData->ism_render_target_energy_exp[n][bin] = target_e; + move32(); + move16(); + + // r9 = sqrt(r8 / r6) + mantissa = get_processing_gain_fx( proto_m, proto_e, target_m, target_e, &exp ); + move32(); + + // outRe[n][slot][bin] *= r9 + exp_mult = add( exp, outRe_exp[n][slot][bin] ); + outRe[n][slot][bin] = mult32_mantissa_fx( outRe[n][slot][bin], mantissa, exp_mult, + &outRe_exp[n][slot][bin] ); + move32(); + + // outIm[n][slot][bin] *= r9 + exp_mult = add( exp, outIm_exp[n][slot][bin] ); + outIm[n][slot][bin] = mult32_mantissa_fx( outIm[n][slot][bin], mantissa, exp_mult, + &outIm_exp[n][slot][bin] ); + move32(); + } + } + } + + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + Word16 md_idx = st_ivas->hSpatParamRendCom->render_to_md_map[slot]; + move16(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + Word16 exp, proto_e, target_e, transport_exp; + Word32 mantissa, proto_m, target_m, transport_mantissa; + + Word32 masa_target_energy_frac; + Word16 masa_target_energy_exp; + + // r1 = transport_energy[slot][bin] * hExtData->masa_render_masa_to_total[md_idx][bin] + masa_target_energy_frac = mult32_mantissa_fx( transport_energy_frac[slot][bin], + hExtData->masa_render_masa_to_total[md_idx][bin], + add( transport_energy_exp[slot][bin], 1 ), + &masa_target_energy_exp ); + move32(); + + // r2 = r1 * EXT_RENDER_IIR_FAC + masa_target_energy_frac = mult32_mantissa_fx( masa_target_energy_frac, + ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + masa_target_energy_exp, + &masa_target_energy_exp ); + move32(); + + // r3 = masa_render_proto_energy[bin] * EXT_RENDER_IIR_FAC + proto_m = mult32_mantissa_fx( hExtData->masa_render_proto_energy_frac[bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->masa_render_proto_energy_exp[bin], &proto_e ); + move32(); + + // r4 = transport_energy[slot][bin] * EXT_RENDER_IIR_FAC + transport_mantissa = mult32_mantissa_fx( transport_energy_frac[slot][bin], + ONEMINUX_EXT_RENDER_IIR_FAC_Q31, + transport_energy_exp[slot][bin], &transport_exp ); + move32(); + + // r5 = r3 + r4 + proto_m = BASOP_Util_Add_Mant32Exp( proto_m, proto_e, + transport_mantissa, + transport_exp, + &proto_e ); + move32(); + + // r6 = masa_render_target_energy[bin] * EXT_RENDER_IIR_FAC + target_m = mult32_mantissa_fx( hExtData->masa_render_target_energy_frac[bin], EXT_RENDER_IIR_FAC_Q31, + hExtData->masa_render_target_energy_exp[bin], &target_e ); + move32(); + + // r7 = r6 + r2 + target_m = BASOP_Util_Add_Mant32Exp( target_m, target_e, + masa_target_energy_frac, + masa_target_energy_exp, + &target_e ); + move32(); + + hExtData->masa_render_proto_energy_frac[bin] = proto_m; + hExtData->masa_render_proto_energy_exp[bin] = proto_e; + move16(); + move32(); + + hExtData->masa_render_target_energy_frac[bin] = target_m; + hExtData->masa_render_target_energy_exp[bin] = target_e; + move16(); + move32(); + + // r8 = sqrt(r7 / r5) + mantissa = get_processing_gain_fx( proto_m, proto_e, target_m, target_e, &exp ); + move32(); + + FOR( n = 0; n < MASA_MAX_TRANSPORT_CHANNELS; n++ ) + { + Word16 exp_mult; + + // inRe[n][slot][bin] *= r8 + exp_mult = add( exp, inRe_exp[n][slot][bin] ); + inRe[n][slot][bin] = mult32_mantissa_fx( inRe[n][slot][bin], mantissa, exp_mult, + &inRe_exp[n][slot][bin] ); + move32(); + + // inIm[n][slot][bin] *= r8 + exp_mult = add( exp, inIm_exp[n][slot][bin] ); + inIm[n][slot][bin] = mult32_mantissa_fx( inIm[n][slot][bin], mantissa, exp_mult, + &inIm_exp[n][slot][bin] ); + move32(); + } + } + } + + *output_q = Q11; + + /* Compute CLDFB synthesis */ + FOR( slot = 0; slot < CLDFB_NO_COL_MAX; slot++ ) + { + Word32 *outSlotRePr, *outSlotImPr; + Word32 index = L_mult0( nBins, slot ); + + FOR( n = 0; n < nchan_transport; n++ ) + { + outSlotRePr = &( inRe[n][slot][0] ); + outSlotImPr = &( inIm[n][slot][0] ); + move32(); + move32(); + + FOR( bin = 0; bin < nBins; bin++ ) + { + inRe_exp[n][slot][bin] = sub( inRe_exp[n][slot][bin], Q2 ); + inIm_exp[n][slot][bin] = sub( inIm_exp[n][slot][bin], Q2 ); + } + + mantissa_exp_to_qvalue( &inRe_exp[n][slot][0], &inRe[n][slot][0], Q20, nBins ); + mantissa_exp_to_qvalue( &inIm_exp[n][slot][0], &inIm[n][slot][0], Q20, nBins ); + + cldfbSynthesis_ivas_fx( &outSlotRePr, &outSlotImPr, &output[n][index], + nBins, Q2, 1, st_ivas->cldfbSynDec[n] ); + } + + FOR( n = 0; n < nchan_ism; n++ ) + { + Word32 index2 = add( n, CPE_CHANNELS ); + + outSlotRePr = &( outRe[n][slot][0] ); + outSlotImPr = &( outIm[n][slot][0] ); + move32(); + move32(); + + mantissa_exp_to_qvalue( &outRe_exp[n][slot][0], &outRe[n][slot][0], Q20, nBins ); + mantissa_exp_to_qvalue( &outIm_exp[n][slot][0], &outIm[n][slot][0], Q20, nBins ); + + cldfbSynthesis_ivas_fx( &outSlotRePr, &outSlotImPr, &rendered_objects[n][index], + nBins, 0, 1, st_ivas->cldfbSynDec[index2] ); + } + } + + /* Combine the rendered objects with the separated objects */ + FOR( n = 0; n < nchan_ism; n++ ) + { + Word16 index = add( CPE_CHANNELS, n ); + v_add_32( output[index], rendered_objects[n], output[index], output_frame ); + } + + hExtData->prev_idx_separated_ism = st_ivas->hMasaIsmData->idx_separated_ism; + move16(); +} +#endif diff --git a/lib_dec/ivas_output_config_fx.c b/lib_dec/ivas_output_config_fx.c index bdf7b67bc..c5a01180d 100644 --- a/lib_dec/ivas_output_config_fx.c +++ b/lib_dec/ivas_output_config_fx.c @@ -479,8 +479,26 @@ void ivas_renderer_select( } ELSE IF( EQ_32( output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_PARAM_ONE_OBJ ) ) + { + *renderer_type = RENDERER_OMASA_OBJECT_EXT; + move32(); + } + ELSE IF( EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) + { + *renderer_type = RENDERER_OMASA_MIX_EXT; + move32(); + } + ELSE + { + *renderer_type = RENDERER_DISABLE; + move32(); + } +#else *renderer_type = RENDERER_DISABLE; move16(); +#endif } } ELSE IF( EQ_32( st_ivas->ivas_format, MC_FORMAT ) ) diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index 687991c89..1e58959d5 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -771,7 +771,12 @@ void ivas_sba_dec_digest_tc_fx( Word16 ch_idx, nchan_transport; /* set the md map */ +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + IF( st_ivas->hDirAC != NULL || EQ_32( st_ivas->renderer_type, RENDERER_OMASA_OBJECT_EXT ) ) +#else IF( st_ivas->hDirAC ) +#endif { ivas_dirac_dec_set_md_map_fx( st_ivas, nCldfbSlots ); } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4a8c3cbd9..5b8bd48ff 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -926,6 +926,25 @@ typedef struct ivas_masa_decoder_struct } MASA_DECODER, *MASA_DECODER_HANDLE; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT +/* Data structure for MASA_ISM EXT rendering */ +typedef struct ivas_masa_ism_ext_data_structure +{ + Word16 prev_idx_separated_ism; // Q0 (Integer) + Word32 prev_panning_gains[MAX_NUM_OBJECTS][2]; // Q31 + Word16 ism_render_proto_energy_exp[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 ism_render_proto_energy_frac[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q31 + Word16 ism_render_target_energy_exp[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 ism_render_target_energy_frac[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; // Q31 + Word16 masa_render_proto_energy_exp[CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 masa_render_proto_energy_frac[CLDFB_NO_CHANNELS_MAX]; // Q31 + Word16 masa_render_target_energy_exp[CLDFB_NO_CHANNELS_MAX]; // Q0 (Integer exponent) + Word32 masa_render_target_energy_frac[CLDFB_NO_CHANNELS_MAX]; // Q31 + Word32 masa_render_masa_to_total[MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR][CLDFB_NO_CHANNELS_MAX]; // Q30 + +} MASA_ISM_EXT_DATA, *MASA_ISM_EXT_DATA_HANDLE; +#endif + /* Data structure for MASA_ISM rendering */ typedef struct ivas_masa_ism_data_structure { @@ -955,7 +974,9 @@ typedef struct ivas_masa_ism_data_structure Word32 **delayBuffer_fx; /* Q11 */ Word16 delayBuffer_size; Word16 delayBuffer_nchan; - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + MASA_ISM_EXT_DATA_HANDLE hExtData; +#endif } MASA_ISM_DATA, *MASA_ISM_DATA_HANDLE; diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 7c881cce9..98bbfd3d5 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -1987,14 +1987,37 @@ ivas_error IVAS_DEC_GetNumObjects( UWord16 *numObjects /* o : number of objects for which the decoder has been configured */ ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + Word16 is_masa_ism; + is_masa_ism = 0; + move16(); +#endif test(); IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( hIvasDec->st_ivas->hMasa != NULL ) + { + IF( EQ_32( hIvasDec->st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + is_masa_ism = 1; + move16(); + } + } + test(); + test(); + test(); + IF( EQ_32( hIvasDec->st_ivas->ivas_format, ISM_FORMAT ) || + EQ_32( hIvasDec->st_ivas->ivas_format, SBA_ISM_FORMAT ) || + EQ_32( hIvasDec->st_ivas->ivas_format, MASA_ISM_FORMAT ) || + EQ_16( is_masa_ism, 1 ) ) +#else test(); test(); IF( EQ_16( (Word16) hIvasDec->st_ivas->ivas_format, ISM_FORMAT ) || EQ_16( (Word16) hIvasDec->st_ivas->ivas_format, SBA_ISM_FORMAT ) || EQ_16( (Word16) hIvasDec->st_ivas->ivas_format, MASA_ISM_FORMAT ) ) +#endif { *numObjects = hIvasDec->st_ivas->nchan_ism; } @@ -2029,7 +2052,14 @@ ivas_error IVAS_DEC_GetFormat( *format = IVAS_DEC_BS_UNKOWN; } move32(); - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + if ( EQ_32( *format, IVAS_DEC_BS_MASA ) && EQ_32( hIvasDec->st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + *format = IVAS_DEC_BS_MASA_ISM; + move32(); + } +#endif return IVAS_ERR_OK; } @@ -2140,7 +2170,11 @@ ivas_error IVAS_DEC_GetObjectMetadata( { Decoder_Struct *st_ivas; ISM_METADATA_HANDLE hIsmMeta; - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + Word16 is_masa_ism; + is_masa_ism = 0; + move16(); +#endif test(); IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -2148,9 +2182,27 @@ ivas_error IVAS_DEC_GetObjectMetadata( } st_ivas = hIvasDec->st_ivas; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( hIvasDec->st_ivas->hMasa != NULL ) + { + IF( EQ_32( hIvasDec->st_ivas->hMasa->config.input_ivas_format, MASA_ISM_FORMAT ) ) + { + is_masa_ism = 1; + move16(); + } + } + test(); + test(); + test(); + if ( NE_32( st_ivas->ivas_format, ISM_FORMAT ) && + NE_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && + NE_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) && + EQ_16( is_masa_ism, 0 ) ) +#else test(); test(); IF( NE_16( st_ivas->ivas_format, ISM_FORMAT ) && NE_16( st_ivas->ivas_format, MASA_ISM_FORMAT ) && NE_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) +#endif { return IVAS_ERR_WRONG_MODE; } @@ -2161,8 +2213,16 @@ ivas_error IVAS_DEC_GetObjectMetadata( } hIsmMeta = st_ivas->hIsmMetaData[objectIdx]; - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + test(); + test(); + IF( hIsmMeta == NULL || + EQ_16( zero_flag, 1 ) || + ( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->ism_mode, ISM_MASA_MODE_MASA_ONE_OBJ ) ) ) +#else IF( hIsmMeta == NULL || zero_flag ) +#endif { metadata->azimuth_fx = 0; // Q22 metadata->elevation_fx = 0; // Q22 @@ -2834,9 +2894,13 @@ ivas_error IVAS_DEC_GetDelay( out_fs_fx = FS_48K_IN_NS_Q31; } move32(); - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + nSamples[1] = NS2SA_FX2( hDecoderConfig->output_Fs, get_delay_fx( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbSynDec[0], hDecoderConfig->output_config ) ); + move16(); +#else nSamples[1] = NS2SA_FX2( hDecoderConfig->output_Fs, get_delay_fx( DEC, hDecoderConfig->output_Fs, st_ivas->ivas_format, st_ivas->cldfbAnaDec[0], hDecoderConfig->output_config ) ); move16(); +#endif nSamples[2] = extract_l( W_round64_L( W_mult0_32_32( L_shl( st_ivas->binaural_latency_ns, 1 ), out_fs_fx ) ) ); move16(); nSamples[0] = add( nSamples[1], nSamples[2] ); diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 616c28ad8..72cc9d78d 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -533,8 +533,28 @@ ivas_error ivas_masa_encode_fx( } ELSE { - /* write the number of MASA transport channels */ - push_next_indice( hMetaData, sub( nchan_transport, 1 ), MASA_TRANSP_BITS ); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + test(); + IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) && EQ_32( ism_mode, ISM_MODE_NONE ) ) + { + /* use the MASA number of transport channels bit to signal if there are 3 or 4 objects */ + IF( EQ_16( nchan_ism, 4 ) ) + { + push_next_indice( hMetaData, 1, MASA_TRANSP_BITS ); + } + ELSE + { + push_next_indice( hMetaData, 0, MASA_TRANSP_BITS ); + } + } + ELSE + { +#endif + /* write the number of MASA transport channels */ + push_next_indice( hMetaData, sub( nchan_transport, 1 ), MASA_TRANSP_BITS ); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + } +#endif hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, MASA_TRANSP_BITS ); move16(); } @@ -542,12 +562,25 @@ ivas_error ivas_masa_encode_fx( test(); IF( EQ_32( ivas_format, MASA_ISM_FORMAT ) && EQ_32( ism_mode, ISM_MODE_NONE ) ) { +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IF( LE_16( nchan_ism, 3 ) ) + { + push_next_indice( hMetaData, nchan_ism, MASA_HEADER_BITS ); + } + ELSE + { + push_next_indice( hMetaData, sub( nchan_ism, 1 ), MASA_HEADER_BITS ); + } + hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, MASA_HEADER_BITS ); + move16(); +#else /* signal MASA_ISM_FORMAT to decoder */ push_next_indice( hMetaData, 1, 1 ); /* write reserved bit */ push_next_indice( hMetaData, 0, MASA_HEADER_BITS - 1 ); hQMetaData->metadata_max_bits = sub( hQMetaData->metadata_max_bits, MASA_HEADER_BITS ); move16(); +#endif } ELSE { diff --git a/lib_rend/ivas_masa_merge_fx.c b/lib_rend/ivas_masa_merge_fx.c index 528ee4d76..432ed8253 100644 --- a/lib_rend/ivas_masa_merge_fx.c +++ b/lib_rend/ivas_masa_merge_fx.c @@ -220,6 +220,7 @@ void diffuse_meta_merge_1x1_fx( { Word32 new_dir_ratio_fx, new_diff_ratio_fx; Word16 new_dir_ratio_e; + outMeta->directionIndex[0][sf][band] = inMetaISM->directionIndex[0][sf][band]; move16(); outMeta->directToTotalRatio[0][sf][band] = inMetaISM->directToTotalRatio[0][sf][band]; @@ -252,7 +253,8 @@ void diffuse_meta_merge_1x1_fx( move16(); } - outMeta->directToTotalRatio[0][sf][band] = (UWord8) extract_l( L_shr( Mpy_32_16_1( new_dir_ratio_fx, UINT8_MAX ) /* (31 - new_dir_ratio_e) - 15*/, sub( 31 - 15, new_dir_ratio_e ) ) ); + outMeta->directToTotalRatio[0][sf][band] = (UWord8) extract_l( L_shr( Mpy_32_16_1( new_dir_ratio_fx, UINT8_MAX ) /* (31 - new_dir_ratio_e) - 15*/, sub( 31 - 15, new_dir_ratio_e ) ) ); /* Q0 */ + move16(); IF( GT_16( sub( 31, new_dir_ratio_e ), Q30 ) ) { diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 0939d0829..5cf767d0e 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -41,11 +41,20 @@ typedef struct masaMetaDelayStorage { MASA_DECRIPTIVE_META descriptiveMeta; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR + 1][MASA_FREQUENCY_BANDS]; + uint8_t prevDelay; +#else uint16_t directionIndex[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t directToTotalRatio[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t spreadCoherence[MASA_MAXIMUM_DIRECTIONS][DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t surroundCoherence[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; +#endif } MASA_META_DELAY_STORAGE; @@ -88,14 +97,93 @@ static void getExtMasaMetadataFileName( static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: New input metadata which is inplace replaced with delayed metadata frame */ +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ + uint8_t delayNsf +#else MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ +#endif ) { int16_t dir, sf, band; uint8_t currentNumberOfDirections; - +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + int16_t storeReadOffset; +#endif /* Move meta to delay and output. Always use two directions as the metadata is prepared to contain zero energy second direction * if there is 1dir meta. */ +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + /* stable state expected results delay change expected results + delayNsf = 2 delayNsf = 3 delayNsf = 3 (from 2) delayNsf = 2 (from 3) + ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[0] (prev ext[1]) ext[0] = delayStorage[0] (prev ext[2]) ext[0] = delayStorage[1] (prev ext[2]) + ext[1] = delayStorage[1] (prev ext[3]) ext[1] = delayStorage[1] (prev ext[2]) ext[1] = delayStorage[1] (prev ext[3]) ext[1] = delayStorage[2] (prev ext[3]) + ext[2] = ext[0] ext[2] = delayStorage[2] (prev ext[3]) ext[2] = delayStorage[1] (prev ext[3]) ext[2] = ext[0] + ext[3] = ext[1] ext[3] = ext[0] ext[3] = ext[0] ext[3] = ext[0] + delayStorage[0] = ext[2] delayStorage[0] = ext[1] delayStorage[0] = ext[1] delayStorage[0] = ext[2] + delayStorage[1] = ext[3] delayStorage[1] = ext[2] delayStorage[1] = ext[2] delayStorage[1] = ext[3] + delayStorage[2] = ext[3] delayStorage[2] = ext[3] + */ + storeReadOffset = delayStorage->prevDelay > delayNsf ? delayStorage->prevDelay - delayNsf : 0; /* delay decreases: read later from storage -> discard one sf */ + + for ( sf = 0; sf < delayNsf; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + uint16_t temp_u16; + uint8_t temp_u8; + int16_t toStoreIdx, reOrgIdx, storeReadIdx; + + toStoreIdx = sf + MAX_PARAM_SPATIAL_SUBFRAMES - delayNsf; + reOrgIdx = sf + delayNsf; + /* when switching to longer delay, repeat the last valid sf to fill the gap */ + storeReadIdx = ( ( sf + storeReadOffset ) < delayStorage->prevDelay ) ? sf + storeReadOffset : delayStorage->prevDelay - 1; + + for ( dir = 0; dir < MASA_MAXIMUM_DIRECTIONS; dir++ ) + { + temp_u16 = delayStorage->directionIndex[dir][storeReadIdx][band]; + delayStorage->directionIndex[dir][sf][band] = extOutMeta->directionIndex[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->directionIndex[dir][reOrgIdx][band] = extOutMeta->directionIndex[dir][sf][band]; + } + extOutMeta->directionIndex[dir][sf][band] = temp_u16; + + temp_u8 = delayStorage->directToTotalRatio[dir][storeReadIdx][band]; + delayStorage->directToTotalRatio[dir][sf][band] = extOutMeta->directToTotalRatio[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->directToTotalRatio[dir][reOrgIdx][band] = extOutMeta->directToTotalRatio[dir][sf][band]; + } + extOutMeta->directToTotalRatio[dir][sf][band] = temp_u8; + + temp_u8 = delayStorage->spreadCoherence[dir][storeReadIdx][band]; + delayStorage->spreadCoherence[dir][sf][band] = extOutMeta->spreadCoherence[dir][toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->spreadCoherence[dir][reOrgIdx][band] = extOutMeta->spreadCoherence[dir][sf][band]; + } + extOutMeta->spreadCoherence[dir][sf][band] = temp_u8; + } + + temp_u8 = delayStorage->surroundCoherence[storeReadIdx][band]; + delayStorage->surroundCoherence[sf][band] = extOutMeta->surroundCoherence[toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->surroundCoherence[reOrgIdx][band] = extOutMeta->surroundCoherence[sf][band]; + } + extOutMeta->surroundCoherence[sf][band] = temp_u8; + + temp_u8 = delayStorage->diffuseToTotalRatio[storeReadIdx][band]; + delayStorage->diffuseToTotalRatio[sf][band] = extOutMeta->diffuseToTotalRatio[toStoreIdx][band]; + if ( reOrgIdx < MAX_PARAM_SPATIAL_SUBFRAMES ) + { + extOutMeta->diffuseToTotalRatio[reOrgIdx][band] = extOutMeta->diffuseToTotalRatio[sf][band]; + } + extOutMeta->diffuseToTotalRatio[sf][band] = temp_u8; + } + } + +#else for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES - DELAY_MASA_PARAM_DEC_SFR; sf++ ) { for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) @@ -131,6 +219,7 @@ static void delayMasaMetadata( extOutMeta->diffuseToTotalRatio[sf][band] = temp_u8; } } +#endif /* Finalize descriptive meta by using new frame except for number of directions which is the larger of the two */ currentNumberOfDirections = extOutMeta->descriptiveMeta.numberOfDirections; @@ -140,6 +229,9 @@ static void delayMasaMetadata( } delayStorage->descriptiveMeta.numberOfDirections = currentNumberOfDirections; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + delayStorage->prevDelay = delayNsf; +#endif return; } @@ -182,6 +274,9 @@ ivas_error MasaFileWriter_open( if ( !delayCompensationEnabled ) { self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 ); +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + self->delayStorage->prevDelay = DELAY_MASA_PARAM_DEC_SFR; +#endif } *masaWriter = self; @@ -198,7 +293,12 @@ ivas_error MasaFileWriter_open( ivas_error MasaFileWriter_writeFrame( MasaFileWriter *self, /* i/o: MasaFileWriter handle */ +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ + const float *decDelay /* i : decoding audio delay */ +#else MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ +#endif ) { if ( self == NULL ) @@ -209,7 +309,17 @@ ivas_error MasaFileWriter_writeFrame( uint16_t descMetaTemp = 0; int16_t i, sf, dir, numDirections; uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + /* If delay storage has been reserved, then we are in the normal mode for the decoder + * (i.e., no delay compensation for PCM) which means that metadata should be delayed + * by two or three subframes (10 or 15 ms). Descriptive metadata is a combined result. */ + if ( self->delayStorage ) + { + uint8_t delayFrames = (uint8_t) ( (int32_t) ( ( *decDelay ) * 48000 ) / L_SPATIAL_SUBFR_48k ); + delayMasaMetadata( hMasaExtOutMeta, self->delayStorage, delayFrames ); + } +#else /* If delay storage has been reserved, then we are in the normal mode for the decoder * (i.e., no delay compensation for PCM) which means that metadata should be delayed * by two subframes (10 ms). Descriptive metadata is a combined result. */ @@ -217,7 +327,7 @@ ivas_error MasaFileWriter_writeFrame( { delayMasaMetadata( hMasaExtOutMeta, self->delayStorage ); } - +#endif numDirections = hMasaExtOutMeta->descriptiveMeta.numberOfDirections + 1; if ( fwrite( &( hMasaExtOutMeta->descriptiveMeta.formatDescriptor ), sizeof( uint8_t ), 8, self->file ) != 8 ) diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index 2d476e28f..17c2a790a 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -48,7 +48,12 @@ ivas_error MasaFileWriter_open( ivas_error MasaFileWriter_writeFrame( MasaFileWriter *self, /* i/o: MasaFileWriter handle */ +#ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT + IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ + const float *decDelay /* i : decoding audio delay */ +#else IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ +#endif ); void MasaFileWriter_close( -- GitLab From 9a88a2925e96856eb9c89e64f1f095888115eaa9 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 24 Jul 2025 16:30:36 +0300 Subject: [PATCH 1260/1310] Clang format --- lib_util/masa_file_writer.c | 6 +++--- lib_util/masa_file_writer.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 5cf767d0e..ab2596320 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -100,8 +100,8 @@ static void delayMasaMetadata( #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_META_DELAY_STORAGE *delayStorage, /* i/o: Storage for 15 ms of metadata and related descriptive metadata */ uint8_t delayNsf -#else - MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ +#else + MASA_META_DELAY_STORAGE *delayStorage /* i/o: Storage for 10 ms of metadata and related descriptive metadata */ #endif ) { @@ -292,7 +292,7 @@ ivas_error MasaFileWriter_open( *---------------------------------------------------------------------*/ ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index 17c2a790a..c3e142254 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -47,7 +47,7 @@ ivas_error MasaFileWriter_open( ); ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT IVAS_MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta, /* i/o: MASA ext out meta handle to be written */ const float *decDelay /* i : decoding audio delay */ -- GitLab From 1ab046ca15117bc2468e0709b42302586b4a9b1c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 16:23:21 +0200 Subject: [PATCH 1261/1310] ci adjustments for merge to main --- .gitlab-ci.yml | 1670 +++++++++++++++++++++++++----------------------- 1 file changed, 853 insertions(+), 817 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 842aefbc7..a2bd885d5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,89 +1,14 @@ variables: - TESTV_DIR: "/usr/local/testv" - LTV_DIR: "/usr/local/ltv" - EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" - FLOAT_REF_BRANCH: "ivas-float-update" - BUILD_OUTPUT: "build_output.txt" - SCRIPTS_DIR: "/usr/local/scripts" - EXIT_CODE_NON_BE: 123 - EXIT_CODE_FAIL: 1 - LONG_TEST_SUITE: "tests/codec_be_on_mr_nonselection tests/renderer --param_file scripts/config/self_test_ltv.prm --use_ltv" - LONG_TEST_SUITE_NO_RENDERER: "tests/codec_be_on_mr_nonselection --param_file scripts/config/self_test_ltv.prm --use_ltv" - SHORT_TEST_SUITE: "tests/codec_be_on_mr_nonselection" - SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" - LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" - TEST_SUITE: "" - DISABLE_HRTF_MODEL_TESTS: "" - # DISABLE_HRTF_MODEL_TESTS: "-k not model" #enable this declaration to disable HRTF model from file tests - - # These path variables are used by the pytest calls. - # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain - DUT_ENCODER_PATH: "./IVAS_cod" - DUT_DECODER_PATH: "./IVAS_dec" - DUT_RENDERER_PATH: "./IVAS_rend" - DUT_POST_RENDERER_PATH: "./ISAR_post_rend" - REF_ENCODER_PATH: "./IVAS_cod_ref" - REF_DECODER_PATH: "./IVAS_dec_ref" - REF_RENDERER_PATH: "./IVAS_rend_ref" - REF_POST_RENDERER_PATH: "./ISAR_post_rend_ref" - MERGE_TARGET_ENCODER_PATH: "./IVAS_cod_merge_target" - MERGE_TARGET_DECODER_PATH: "./IVAS_dec_merge_target" - MERGE_TARGET_RENDERER_PATH: "./IVAS_rend_merge_target" - MERGE_TARGET_POST_RENDERER_PATH: "./ISAR_post_rend_merge_target" - # These path variables are used for building the binaries - # They should never be overwritten! - REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" - REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" - REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_ref" - REF_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_ref" - MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_merge_target" - MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" - MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_merge_target" - MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_merge_target" - LEVEL_SCALING: "1.0" - IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch-pc" - PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" - TESTCASE_TIMEOUT_STV: 900 - TESTCASE_TIMEOUT_LTV: 2400 - TESTCASE_TIMEOUT_LTV_SANITIZERS: 6000 - CI_REGRESSION_THRESH_MLD: "0.1" - CI_REGRESSION_THRESH_MAX_ABS_DIFF: "50" - CI_REGRESSION_THRESH_SSNR: "-1" - CI_REGRESSION_THRESH_ODG: "-0.05" - GIT_CLEAN_FLAGS: -ffdxq - INSTR_DIR: "scripts/c-code_instrument" - TESTS_DIR_CODEC_BE_ON_MR: "tests/codec_be_on_mr_nonselection" - BUILD_WITH_DEBUG_MODE_INFO: "" - ENCODER_TEST: "" - DELTA_ODG: "" - COMPARE_DMX: "" - SPLIT_COMPARISON: "" - SKIP_REGRESSION_CHECK: "" - FAILED_TESTCASES_LIST: "failed-testcases.txt" - ERRORS_TESTCASES_LIST: "errors-testcases.txt" - PYTEST_CACHE_ARTIFACT: "pytest_cache.zip" - MEASURES_FOR_REPORT: "MLD MAX_ABS_DIFF MIN_SSNR MIN_ODG" - FLOAT_REF_COMMIT_FILE: "float-ref-git-sha.txt" - CUT_COMMIT_FILE: "CuT-git-sha.txt" - MERGE_TARGET_COMMIT_FILE: "merge-target-git-sha.txt" - MANUAL_PIPELINE_TYPE: - description: "Type for the manual pipeline run. Use 'pytest-compare' to run comparison test against reference float codec." - value: 'default' - options: - - 'default' - - 'pytest-compare' - - 'pytest-compare-long' - - 'pytest-compare-to-input' - - 'pytest-saturation-smoke-test' - - 'evs-26444' - - 'sanitizer' - - 'pytest-renderer' - - 'complexity' - - 'coverage' - - 'voip-be-test' - - 'peaq-enc-passthrough' + # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this + # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF main +include: + - local: .gitlab-ci/variables.yml + - local: .gitlab-ci/rules-basis.yml + - project: ivas-codec-pc/ivas-codec-ci + ref: *IVAS_CODEC_CI_REF + file: main.yml default: interruptible: true # Make all jobs by default interruptible @@ -104,12 +29,24 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing variables: IVAS_PIPELINE_NAME: 'Web run pipeline: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' + variables: + IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' + variables: + IVAS_PIPELINE_NAME: 'Backup long term logs: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare' variables: IVAS_PIPELINE_NAME: 'Run comparison tools against float ref: $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-enc-dmx' + variables: + IVAS_PIPELINE_NAME: 'Run encoder dmx comparison against float ref: $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long' variables: IVAS_PIPELINE_NAME: 'Run comparison tools against float ref (long test vectors): $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long-fx-fx' + variables: + IVAS_PIPELINE_NAME: 'Run comparison tools against float ref FX-FX (long test vectors): $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-to-input' variables: IVAS_PIPELINE_NAME: 'Run comparison tools against input (pass-through only): $CI_COMMIT_BRANCH' @@ -131,6 +68,9 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'voip-be-test' variables: IVAS_PIPELINE_NAME: 'Voip BE test on $CI_COMMIT_BRANCH' + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'renderer-framesize-be' + variables: + IVAS_PIPELINE_NAME: 'Renderer framesize BE test on $CI_COMMIT_BRANCH' - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' variables: IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' @@ -138,17 +78,6 @@ workflow: variables: IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - -stages: - - .pre - - prevalidate - - build - - check-be - - test - - compare - - postvalidate - - deploy - # --------------------------------------------------------------- # Generic script anchors # --------------------------------------------------------------- @@ -156,13 +85,6 @@ stages: # These can be used later on to do common tasks # Prints useful information for every job and should be used at the beginning of each job -.print-common-info: &print-common-info - - | - echo "Printing common information for build job." - echo "Current job is run on commit $CI_COMMIT_SHA" - echo "Commit time was $CI_COMMIT_TIMESTAMP" - date | xargs echo "System time is" - .print-common-info-windows: &print-common-info-windows - | echo "Printing common information for build job." @@ -170,12 +92,15 @@ stages: echo "Commit time was $CI_COMMIT_TIMESTAMP" ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression -.activate-debug-mode-info-if-set: &activate-debug-mode-info-if-set - - if [ "$BUILD_WITH_DEBUG_MODE_INFO" = "true" ]; then - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUGGING\ *\)\*\//\1/g" lib_com/options.h - - sed -i.bak -e "s/\/\*\ *\(#define\ *DEBUG_MODE_INFO\ *\)\*\//\1/g" lib_com/options.h - - fi +.activate-Werror-linux: &activate-Werror-linux + - sed -i.bak "s/^# \(CFLAGS += -Werror\)/\1/" Makefile + - sed -i.bak "s/# \(set(CMAKE_C_FLAGS \"\${CMAKE_C_FLAGS} -Werror\")\)/\1/" CMakeLists.txt +.activate-WX-windows: &activate-WX-windows + - (Get-Content -Path "CMakeLists.txt") -replace '# \(add_compile_options\("\/WX"\)\)', '$1' | Set-Content -Path "CMakeLists.txt" + - Get-ChildItem -Path "Workspace_msvc" -Filter "*.vcxproj" | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'false', 'true' | Set-Content -Path $_.FullName } + +# NOTE: can be removed if script from ci repo works .build-merge-target-binaries: &build-merge-target-binaries - current_commit_sha=$(git rev-parse HEAD) ### build merge target binaries @@ -198,21 +123,9 @@ stages: - git rev-parse HEAD > $MERGE_TARGET_COMMIT_FILE - git checkout $current_commit_sha -# From float CI -.mr-fetch-target-branch: &mr-fetch-target-branch - # first delete local target branch to avoid conflicts when branch is cached and there are merge conflicts during fetching - # depending on chaching, the branch may not be there, so prevent failure of this command -> should maybe be done smarter later - - git branch -D $CI_MERGE_REQUEST_TARGET_BRANCH_NAME || true - # needed when depth is lower than the number of commits in the branch - - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME - -# From float CI -.mr-get-target-commit: &mr-get-target-commit # compare to last target branch commit before pipeline was created - - target_commit=$(git log $CI_MERGE_REQUEST_TARGET_BRANCH_NAME -1 --oneline --before=${CI_PIPELINE_CREATED_AT} --format=%H) - # From float CI .merge-request-comparison-setup-codec: &merge-request-comparison-setup-codec - - *build-merge-target-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh # need to rename to match the conventions for the renderer tests... - mv $MERGE_TARGET_ENCODER_PATH $REF_ENCODER_PATH @@ -230,136 +143,12 @@ stages: - if [ $exit_code -ne 0 ] && [ $non_be_flag != 0 ]; then echo "Non-bitexact cases with non-BE tag encountered"; exit $EXIT_CODE_NON_BE; fi - exit 0 -.build-float-ref-binaries: &build-float-ref-binaries - - git rev-parse HEAD > $CUT_COMMIT_FILE - - current_commit_sha=$(git rev-parse HEAD) - ### build reference binaries - - git checkout $FLOAT_REF_BRANCH - - git pull origin $FLOAT_REF_BRANCH - - *activate-debug-mode-info-if-set - - make clean - - make -j >> /dev/null - - mv ./IVAS_cod ./$REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_dec ./$REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./$REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./ISAR_post_rend ./$REF_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY - ### Return to current branch - - git restore . - - git rev-parse HEAD > $FLOAT_REF_COMMIT_FILE - - git checkout $current_commit_sha - -.build-float-ref-and-dut-binaries: &build-float-ref-and-dut-binaries -### build reference binaries - - *build-float-ref-binaries -### build dut binaries - - *activate-debug-mode-info-if-set - - make clean - - make -j >> /dev/null - -.build-and-create-float-ref-outputs: &build-and-create-float-ref-outputs - - *build-float-ref-and-dut-binaries - - ### prepare pytest - # create short test vectors - - python3 tests/create_short_testvectors.py - # create references - - exit_code=0 - - enc_stats_arg="" - - if [ "$ENCODER_TEST" = "true" ]; then enc_stats_arg="--enc_stats"; fi - - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - -.update-scripts-repo: &update-scripts-repo - - cd $SCRIPTS_DIR - - sed -i '/fetch/d' .git/config # Remove all fetch lines to clean out dead links - - git remote set-branches --add origin $BASOP_CI_BRANCH_PC_REPO # Add currently used branch - - git fetch - - git restore --staged . # Needed if HRTF model files were updated. - - git restore . # Just as a precaution - - git checkout $BASOP_CI_BRANCH_PC_REPO - - git pull origin $BASOP_CI_BRANCH_PC_REPO - - - cd - - - cp -r $SCRIPTS_DIR/ci . - - cp -r $SCRIPTS_DIR/scripts . - - cp -r $SCRIPTS_DIR/tests . - - cp $SCRIPTS_DIR/pytest.ini . - -.apply-testv-scaling: &apply-testv-scaling - - echo "Applying level scaling in scripts/testv using scale=$LEVEL_SCALING" - - tests/scale_pcm.py ./scripts/testv/ $LEVEL_SCALING - -.update-ltv-repo: &update-ltv-repo - - cd $LTV_DIR - - git pull - - cd - - -.get-commits-behind-count: &get-commits-behind-count - - echo $CI_COMMIT_SHA - - echo $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - commits_behind_count=$(git rev-list --count $CI_COMMIT_SHA..origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) - -.check-commits-behind-count-in-compare-jobs: &check-commits-behind-count-in-compare-jobs - - | - if [ $commits_behind_count -ne 0 ]; then - echo "Your branch is not up-to-date with main -> Compare tests will not run as they can contain false negatives this way." - echo "Main might have changed during your pipeline run. Run 'git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME' to update." - exit 1 - fi - -.copy-ltv-files-to-testv-dir: ©-ltv-files-to-testv-dir - - cp "$LTV_DIR"/*.wav scripts/testv/ - - cp "$LTV_DIR"/*.met scripts/testv/ - - cp "$LTV_DIR"/*.csv scripts/testv/ - -.activate-Werror-linux: &activate-Werror-linux - - sed -i.bak "s/^# \(CFLAGS += -Werror\)/\1/" Makefile - - sed -i.bak "s/# \(set(CMAKE_C_FLAGS \"\${CMAKE_C_FLAGS} -Werror\")\)/\1/" CMakeLists.txt - -.activate-WX-windows: &activate-WX-windows - - (Get-Content -Path "CMakeLists.txt") -replace '# \(add_compile_options\("\/WX"\)\)', '$1' | Set-Content -Path "CMakeLists.txt" - - Get-ChildItem -Path "Workspace_msvc" -Filter "*.vcxproj" | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'false', 'true' | Set-Content -Path $_.FullName } - -.remove_unsupported_testcases: &remove_unsupported_testcases - # Note: the --use-main-pc-set arg should only be used on main-pc and float-pc branches - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - -# --------------------------------------------------------------- -# Job templates -# --------------------------------------------------------------- - -# When designing templates, try not to use too much inheritance and -# if multiple templates and extended on, remember that on conflict, -# latest overwrites the parameter. - -# templates for rules -.rules-basis: - rules: - - if: $MIRROR_ACCESS_TOKEN # Don't run in the mirror update pipeline (only then MIRROR_ACCESS_TOKEN is defined) - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' # Don't run in any scheduled pipelines by default (use schedule templates below to enable again for certain conditions) - when: never - - if: $CI_PIPELINE_SOURCE == 'trigger' # Don't run triggered pipeline by default - when: never - - if: $MANUAL_PIPELINE_TYPE == 'test-be-release' # Skip all the normal jobs when testing manually against release codec - when: never - - if: $MANUAL_PIPELINE_TYPE == 'test-long-self-test' # Skip all the normal jobs when testing manually against release codec - when: never - - if: $MANUAL_PIPELINE_TYPE == 'ivas-conformance' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'ivas-conformance-linux' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'check-clipping' - when: never - - if: $MANUAL_PIPELINE_TYPE == 'test-branch-vs-input-passthrough' - when: never - - when: on_success - .rules-merge-request: - extends: .rules-basis rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - if: $CI_PIPELINE_SOURCE == 'push' when: never + - when: never .rules-pytest-to-ref-short: rules: @@ -377,26 +166,17 @@ stages: - if: $CI_PIPELINE_SOURCE == 'schedule' when: never -.rules-pytest-to-main-short: +.rules-pytest-to-ref-enc-short-dmx: rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-enc-dmx" - if: $CI_PIPELINE_SOURCE == 'push' when: never - -.rules-mr-to-main-or-main-pc: - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main-pc") - - if: $CI_PIPELINE_SOURCE == 'push' + - if: $CI_PIPELINE_SOURCE == 'schedule' when: never -.rules-mr-to-main-or-main-pc-or-manual: +.rules-pytest-to-main-short: rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare" - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main-pc") + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - if: $CI_PIPELINE_SOURCE == 'push' when: never @@ -409,6 +189,15 @@ stages: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' when: never +.rules-pytest-long-fx-fx: + rules: + - if: $PYTEST_MLD_LONG_FX_FX # Set by scheduled pipeline + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-long-fx-fx" + - if: $CI_PIPELINE_SOURCE == 'push' + when: never + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + when: never + .rules-coverage: rules: - if: $COVERAGE_TEST # Set by scheduled pipeline @@ -436,19 +225,22 @@ stages: - if: $CI_PIPELINE_SOURCE == 'push' when: never -.rules-merge-request-to-main-pc: - extends: .rules-basis - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'main-pc' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never +# --------------------------------------------------------------- +# Job templates +# --------------------------------------------------------------- -# templates to define stages and platforms -.test-job-linux: +# override for centrally defined job to make use of the basop runners +.job-linux: tags: - - ivas-linux + - ivas-basop-linux + +# custom variant of this template, we need to update the scripts repo before every build +.test-job-linux: + extends: + - .job-linux + before_script: + - !reference [.job-linux, before_script] + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh .test-job-linux-compares-to-fixed-target: extends: .test-job-linux @@ -457,28 +249,17 @@ stages: artifacts: true - job: build-codec-linux-make -.build-job-linux: - stage: build - timeout: "2 minutes" - tags: - - ivas-linux - -.build-job-windows: - stage: build - timeout: "4 minutes" - tags: - - ivas-windows - .print-results-banner: &print-results-banner - - set +x - - echo "" - - echo -e "==================================================================================================================\n================================================== TEST RESULTS ==================================================\n==================================================================================================================\n" + - set +x + - echo "" + - echo -e "==================================================================================================================\n================================================== TEST RESULTS ==================================================\n==================================================================================================================\n" # template for test jobs on linux that need the TESTV_DIR .test-job-linux-needs-testv-dir: extends: .test-job-linux before_script: - - *update-scripts-repo + - !reference [ .job-linux, before_script ] + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ ! -d "$TESTV_DIR" ]; then mkdir -p $TESTV_DIR; fi - cp -r scripts/testv/* $TESTV_DIR/ @@ -497,24 +278,28 @@ stages: IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" script: - - *print-common-info - - *update-scripts-repo + - !reference [ .job-linux, before_script ] + + - set -euxo pipefail + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - *remove_unsupported_testcases - - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - if [ $LEVEL_SCALING != "1.0" ]; then + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - if [ "$COMPARE_DMX" = "true" ] || [ "$ENCODER_TEST" = "true" ]; then - BUILD_WITH_DEBUG_MODE_INFO="true" - fi + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" @@ -524,7 +309,7 @@ stages: - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; MEASURES_FOR_REPORT="$MEASURES_FOR_REPORT DELTA_ODG"; fi - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; fi - - *build-and-create-float-ref-outputs + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh # DMX comparison only in manual job with no other metrics - if [ "$COMPARE_DMX" = "true" ]; then @@ -560,7 +345,7 @@ stages: - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) - echo "Job ID from variables - $CI_JOB_ID, Job ID from script - $id_previous" - - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - unzip artifacts.zip -d previous_artifacts # This wildcard thingy relies on only one csv file being present per job - file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" @@ -607,15 +392,38 @@ stages: - report-junit.xml .check-up-to-date-in-comparison-jobs: &check-up-to-date-in-comparison-jobs - - *get-commits-behind-count - | + commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" if [ $commits_behind_count -ne 0 ]; then set +x echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run. Checking bitexactness or testing for regressions now can result in meaningless results. Run\n\t git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 1 fi -.check-be-to-target-anchor: &check-be-to-target-anchor +.check-be-job: + extends: + - .test-job-linux + - .rules-pytest-to-main-short + before_script: + - !reference [ .test-job-linux, before_script ] + - rm -rf tests/dut tests/ref + variables: + USE_LTV: 0 + +# TODO: we might need a new mechanism here now that everything happens on main +.set-reference-for-basop-port-branch: &set-reference-for-basop-port-branch + - if [ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME = "main" ]; then + - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + # a bit awkward: write to file + standard out first so that the error message is visivle in case of failure. Then fill the variable from the file + - ci/get_float_ref_branch_name.sh $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME | tee tmp_ref_branch.txt + - FLOAT_REF_BRANCH=$(cat tmp_ref_branch.txt) + - fi + - fi + +.check-be-to-target-job: + extends: + - .check-be-job stage: check-be needs: ["build-codec-linux-make","branch-is-up-to-date-with-target-pre"] timeout: "300 minutes" @@ -624,40 +432,40 @@ stages: HTML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" PYTEST_LOG_TARGET_BRANCH: "pytest-log-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME.txt" script: - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - set -euxo pipefail - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - python3 tests/create_short_testvectors.py - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - *remove_unsupported_testcases + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - python3 scripts/prepare_combined_format_inputs.py - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - - *build-float-ref-binaries - - *build-merge-target-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target - make clean - make -j >> /dev/null - *check-up-to-date-in-comparison-jobs - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH $DISABLE_HRTF_MODEL_TESTS > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout $DISABLE_HRTF_MODEL_TESTS > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE @@ -726,7 +534,9 @@ stages: - unzip $PYTEST_CACHE_ARTIFACT - fi -.check-regressions-pytest-anchor: &check-regressions-pytest-anchor +.check-regressions-pytest-job: + extends: + - .check-be-job stage: test timeout: "300 minutes" variables: @@ -739,7 +549,7 @@ stages: IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" script: - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh # create empty files for all artifacts to suppress warnings in case of no regressions found or all is BE - touch $XML_REPORT_BRANCH $XML_REPORT_MAIN $HTML_REPORT_BRANCH $HTML_REPORT_MAIN $CSV_BRANCH $CSV_MAIN $SUMMARY_HTML_ARTIFACT_NAME $FLOAT_REF_COMMIT_FILE $CUT_COMMIT_FILE $MERGE_TARGET_COMMIT_FILE regressions_crashes.csv regressions_MLD.csv regressions_MAX_ABS_DIFF.csv regressions_MIN_SSNR.csv regressions_MIN_ODG.csv improvements_crashes.csv improvements_MLD.csv improvements_MAX_ABS_DIFF.csv improvements_MIN_SSNR.csv improvements_MIN_ODG.csv @@ -757,19 +567,19 @@ stages: - exit 0 - fi - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - *remove_unsupported_testcases + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi # check MR title for flag that allows regressions to be mergable @@ -781,7 +591,7 @@ stages: ### run branch first # this per default builds the branch and the reference and creates the reference outputs - - *build-and-create-float-ref-outputs + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh - *check-up-to-date-in-comparison-jobs # need to restore cache again - *overwrite-pytest-cache-with-artifact @@ -797,7 +607,10 @@ stages: - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT ### run main now - - *build-merge-target-binaries + - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME + - git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME + - make clean + - make -j >> /dev/null # need to restore cache again - *overwrite-pytest-cache-with-artifact - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true @@ -871,9 +684,11 @@ stages: .ivas-pytest-sanitizers-anchor: &ivas-pytest-sanitizers-anchor + extends: + - .job-linux stage: test needs: ["build-codec-linux-make"] - timeout: "300 minutes" + timeout: "600 minutes" rules: - if: $CI_PIPELINE_SOURCE == 'push' when: never @@ -882,12 +697,14 @@ stages: - if: $CI_PIPELINE_SOURCE == 'schedule' && $IVAS_PYTEST_MSAN - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "sanitizer" script: - - *print-common-info - - *update-scripts-repo - - *copy-ltv-files-to-testv-dir - - *remove_unsupported_testcases + - !reference [ .job-linux, before_script ] - - *build-float-ref-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - set -euxo pipefail - make_args="CLANG=$CLANG_NUM" - if [[ $CLANG_NUM == 3 ]]; then @@ -922,21 +739,23 @@ stages: SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" script: - - *print-common-info - - *update-scripts-repo + - !reference [ .job-linux, before_script ] + + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - testcase_timeout=$TESTCASE_TIMEOUT_LTV - else - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - *remove_unsupported_testcases + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - - *build-float-ref-and-dut-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" @@ -1001,10 +820,10 @@ uninterruptible: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: always tags: - - ivas-linux + - ivas-basop-linux # --------------------------------------------------------------- -# Validation jobs +# verification jobs # --------------------------------------------------------------- # fail pipeline in the final stage for pipelines on Draft MRs @@ -1029,25 +848,22 @@ check-naming-of-branch-for-main-pc-merges: tags: - ivas-linux script: - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then - ci/get_float_ref_branch_name.sh $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME - fi -# --------------------------------------------------------------- -# verification jobs -# --------------------------------------------------------------- - branch-is-up-to-date-with-target-pre: extends: + - .job-linux - .rules-merge-request stage: prevalidate needs: [] tags: - - ivas-linux + - ivas-basop-linux script: - - *get-commits-behind-count - | + commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" if [ $commits_behind_count -ne 0 ]; then echo -e "Your branch is $commits_behind_count commits behind the target branch, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 1 @@ -1062,13 +878,14 @@ branch-is-up-to-date-with-target-pre: branch-is-up-to-date-with-target-post: extends: + - .job-linux - .rules-merge-request stage: postvalidate tags: - - ivas-linux + - ivas-basop-linux script: - - *get-commits-behind-count - | + commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" if [ $commits_behind_count -ne 0 ]; then echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." exit 123 @@ -1081,7 +898,7 @@ clang-format-check: extends: - .test-job-linux rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - if: $CI_PIPELINE_SOURCE == 'push' when: never - if: $CI_PIPELINE_SOURCE == 'schedule' @@ -1089,12 +906,10 @@ clang-format-check: variables: ARTIFACT_BASE_NAME: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--formatting-fix" stage: prevalidate - tags: - - ivas-linux needs: [] timeout: "5 minutes" script: - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh # Set up variables. This can't be done in the "variables" section because variables are not expanded properly there - PATCH_FILE_NAME="$ARTIFACT_BASE_NAME".patch - > @@ -1141,8 +956,9 @@ clang-format-check: needs: ["build-codec-linux-make"] timeout: "5 minutes" script: - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - make clean - make -j - python3 tests/create_short_testvectors.py --cut_len 1.0 @@ -1161,9 +977,12 @@ clang-format-check: # Build jobs # --------------------------------------------------------------- +# TODO: template rules for the build jobs # ensure that codec builds on linux build-codec-linux-make: rules: + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs @@ -1172,16 +991,16 @@ build-codec-linux-make: when: never extends: - .build-job-linux - tags: - - ivas-linux - timeout: "10 minutes" + timeout: "100 minutes" script: - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - *activate-Werror-linux - make -j build-codec-linux-cmake: rules: + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs @@ -1190,152 +1009,391 @@ build-codec-linux-cmake: when: never extends: - .build-job-linux - tags: - - ivas-linux timeout: "10 minutes" script: - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - cmake -B cmake-build -G "Unix Makefiles" - cmake --build cmake-build -- -j # ensure that codec builds on linux with instrumentation active build-codec-linux-instrumented-make: rules: + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - if: $CI_PIPELINE_SOURCE == 'schedule' - if: $CI_PIPELINE_SOURCE == 'push' when: never extends: - .build-job-linux - timeout: "10 minutes" - tags: - - ivas-linux + timeout: "100 minutes" script: - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash scripts/prepare_instrumentation.sh -m MEM_ONLY - make -j -C $INSTR_DIR - # make sure that the codec builds with msan, asan and usan build-codec-sanitizers-linux: + rules: + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES + when: never + - if: $CI_PIPELINE_SOURCE == 'web' + - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main + - if: $CI_PIPELINE_SOURCE == 'schedule' + - if: $CI_PIPELINE_SOURCE == 'push' + when: never extends: - .build-job-linux - - .rules-basis - tags: - - ivas-linux - timeout: "10 minutes" + timeout: "100 minutes" script: - - *update-scripts-repo - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh # TODO: re-enable once all the warnings have been fixed #- *activate-Werror-linux - bash ci/build_codec_sanitizers_linux.sh -build-codec-windows-msbuild: +build-codec-linux-debugging-make: rules: + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - if: $CI_PIPELINE_SOURCE == 'schedule' - if: $CI_PIPELINE_SOURCE == 'push' when: never extends: - - .build-job-windows - timeout: "10 minutes" - tags: - - ivas-windows + - .build-job-linux + timeout: "100 minutes" + variables: + BUILD_WITH_DEBUG_MODE_INFO: "true" script: - - *print-common-info-windows - - *activate-WX-windows - - MSBuild.exe -maxcpucount .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug - + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/activate-debug-mode-info-if-set.sh + - make -j -build-codec-linux-debugging-make: +build-codec-windows-msbuild: rules: + - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES + when: never - if: $CI_PIPELINE_SOURCE == 'web' - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs - if: $CI_PIPELINE_SOURCE == 'schedule' - if: $CI_PIPELINE_SOURCE == 'push' when: never extends: - - .build-job-linux + - .build-job-windows timeout: "10 minutes" - variables: - BUILD_WITH_DEBUG_MODE_INFO: "true" + tags: + - ivas-windows script: - - *print-common-info - - *activate-debug-mode-info-if-set - - make -j + - *print-common-info-windows + - *activate-WX-windows + - MSBuild.exe -maxcpucount .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug # --------------------------------------------------------------- # Test jobs for merge requests # --------------------------------------------------------------- -split-rendering-smoke-test: +### jobs that check for bitexactness of fx encoder and decoder +check-be-to-target-short-enc-0db: extends: - - .test-job-linux - - .rules-merge-request-to-main-pc - needs: ["build-codec-linux-make"] - stage: test - script: - - *print-common-info - - *update-scripts-repo + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # -/-0dB + LEVEL_SCALING: "1.0" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + USE_LTV: 0 - - make -j - - testcase_timeout=10 - - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - expose_as: "split rendering smoke results" - reports: - junit: - - report-junit.xml +check-be-to-target-short-enc-+10db: + extends: + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # +10dB + LEVEL_SCALING: "3.162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + USE_LTV: 0 -lc3-wrapper-unit-test: +check-be-to-target-short-enc--10db: extends: - - .test-job-linux - - .rules-merge-request-to-main-pc - needs: ["build-codec-linux-make"] - stage: test - script: - - *print-common-info - - *update-scripts-repo + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # -10dB + LEVEL_SCALING: "0.3162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + USE_LTV: 0 - - cmake -B cmake-build -G "Unix Makefiles" -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - - cmake --build cmake-build -- -j - - scripts/split_rendering/lc3plus_basop/ivas_lc3plus_unit_test +check-be-to-target-short-dec-0db: + extends: + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +/-0dB + LEVEL_SCALING: "1.0" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" + USE_LTV: 0 -# compare split-rendering bitexactness between target and source branch -split-rendering-pytest-on-merge-request: +check-be-to-target-short-dec-+10db: extends: - - .test-job-linux-needs-testv-dir - - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main-pc - timeout: "60 minutes" - stage: compare - script: - - *print-common-info - - *update-scripts-repo - - *get-commits-behind-count - - *check-commits-behind-count-in-compare-jobs - - *merge-request-comparison-setup-codec + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +10dB + LEVEL_SCALING: "3.162" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" + USE_LTV: 0 - # some helper variables - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - non_be_flag=$(grep -c --ignore-case "\[split*[ -]*non[ -]*be\]" tmp.txt) || true - # TODO: ref_using_target comes from float repo, but does not apply here - disable for now - # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - - ref_using_target=0 +check-be-to-target-short-dec--10db: + extends: + - .check-be-to-target-job + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # -10dB + LEVEL_SCALING: "0.3162" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" + USE_LTV: 0 + +### jobs that check for regressions on non-BE testcases +check-regressions-short-enc-0db: + extends: + - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-enc-0db" + artifacts: true + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # +/-0dB + LEVEL_SCALING: "1.0" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + USE_LTV: 0 + +check-regressions-short-enc-+10db: + extends: + - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-enc-+10db" + artifacts: true + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # +10dB + LEVEL_SCALING: "3.162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + USE_LTV: 0 + +check-regressions-short-enc--10db: + extends: + - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-enc--10db" + artifacts: true + variables: + TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" + # -10dB + LEVEL_SCALING: "0.3162" + # overwrite decoder with float reference one + DUT_DECODER_PATH: "$REF_DECODER_PATH" + MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" + USE_LTV: 0 + +check-regressions-short-dec-0db: + extends: + - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-dec-0db" + artifacts: true + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +/-0dB + LEVEL_SCALING: "1" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" + USE_LTV: 0 + +check-regressions-short-dec-+10db: + extends: + - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-dec-+10db" + artifacts: true + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # +10dB + LEVEL_SCALING: "3.162" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" + USE_LTV: 0 + +check-regressions-short-dec--10db: + extends: + - .check-regressions-pytest-job + needs: + - job: "check-be-to-target-short-dec--10db" + artifacts: true + variables: + TEST_SUITE: "$SHORT_TEST_SUITE" + # -10dB + LEVEL_SCALING: "0.3162" + # overwrite encoder with float reference one + DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" + USE_LTV: 0 + +### jobs that compare bitexactness between merge target and source +renderer-pytest-on-merge-request: + extends: + - .test-job-linux-needs-testv-dir + - .test-job-linux-compares-to-fixed-target + - .rules-merge-request-to-main-pc + # TODO: set reasonable timeout, will most likely take less + timeout: "20 minutes" + tags: + - ivas-linux + stage: compare + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - *merge-request-comparison-setup-codec + + # some helper variables - "|| true" to prevent failures from grep not finding anything + # write to temporary file as workaround for failures observed with piping echo + - echo $CI_MERGE_REQUEST_TITLE > tmp.txt + - non_be_flag=$(grep -c --ignore-case "\[rend\(erer\)*[ -]*non[ -]*be\]" tmp.txt) || true + # TODO: ref_using_target comes from float repo, but does not apply here - disable for now + # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true + - ref_using_target=0 + + ### If ref_using_target is not set, checkout the source branch to use scripts and input from there + - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi + + - exit_code=0 + - testcase_timeout=60 + - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py --create_ref --testcase_timeout=$testcase_timeout || exit_code=$? + + ### Run test using branch scripts and input + - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi + + # run test + - python3 -m pytest -q --log-level ERROR -n auto -rA --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py --create_cut --testcase_timeout=$testcase_timeout || exit_code=$? + - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + + - *merge-request-comparison-check + + allow_failure: + exit_codes: + - 123 + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + - report.html + expose_as: "pytest renderer results" + reports: + junit: + - report-junit.xml + +ivas-pytest-on-merge-request: + extends: + - .test-job-linux-needs-testv-dir + - .test-job-linux-compares-to-fixed-target + - .rules-merge-request-to-main-pc + stage: compare + timeout: "40 minutes" + tags: + - ivas-linux + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - *merge-request-comparison-setup-codec + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + + # some helper variables - "|| true" to prevent failures from grep not finding anything + # write to temporary file as workaround for failures observed with piping echo + - echo $CI_MERGE_REQUEST_TITLE > tmp.txt + - non_be_flag=$(grep -c --ignore-case "\[non[ -]*be\]" tmp.txt) || true + # TODO: ref_using_target comes from float repo, but does not apply here - disable for now + # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true + - ref_using_target=0 + + ### If ref_using_target is not set, checkout the source branch to use scripts and input from there + - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi + + ### prepare pytest + # create references + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 $DISABLE_HRTF_MODEL_TESTS + + ### Run test using branch scripts and input + - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi + + ### run pytest + - exit_code=0 + - testcase_timeout=600 + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout $DISABLE_HRTF_MODEL_TESTS || exit_code=$? + - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + + - *merge-request-comparison-check + + allow_failure: + exit_codes: + - 123 + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + - report.html + expose_as: "pytest ivas results" + reports: + junit: + - report-junit.xml + +split-rendering-pytest-on-merge-request: + extends: + - .test-job-linux-needs-testv-dir + - .test-job-linux-compares-to-fixed-target + - .rules-merge-request-to-main-pc + timeout: "60 minutes" + stage: compare + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - *merge-request-comparison-setup-codec + + # some helper variables - "|| true" to prevent failures from grep not finding anything + # write to temporary file as workaround for failures observed with piping echo + - echo $CI_MERGE_REQUEST_TITLE > tmp.txt + - non_be_flag=$(grep -c --ignore-case "\[split*[ -]*non[ -]*be\]" tmp.txt) || true + # TODO: ref_using_target comes from float repo, but does not apply here - disable for now + # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true + - ref_using_target=0 # store the current commit hash - source_branch_commit_sha=$(git rev-parse HEAD) @@ -1380,221 +1438,77 @@ split-rendering-pytest-on-merge-request: junit: - report-junit.xml -# --------------------------------------------------------------- -# Short test jobs that run in merge request pipelines -# --------------------------------------------------------------- - -.set-reference-for-basop-port-branch: &set-reference-for-basop-port-branch - - if [ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME = "main-pc" ]; then - - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then - - *update-scripts-repo - # a bit awkward: write to file + standard out first so that the error message is visivle in case of failure. Then fill the variable from the file - - ci/get_float_ref_branch_name.sh $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME | tee tmp_ref_branch.txt - - FLOAT_REF_BRANCH=$(cat tmp_ref_branch.txt) - - else - - FLOAT_REF_BRANCH="float-pc" - - fi - - fi - -### jobs that check for bitexactness of fx encoder and decoder -check-be-to-target-short-enc-0db: - extends: - - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-enc-+10db: - extends: - - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-enc--10db: - extends: - - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-dec-0db: - extends: - - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-dec-+10db: - extends: - - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -check-be-to-target-short-dec--10db: +# test that runs all modes with 1s input signals +# TODO: disabled temporarily, needs to be adapted to BASOP +.codec-smoke-test: extends: - - .rules-mr-to-main-or-main-pc - - .test-job-linux-compares-to-fixed-target - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-be-to-target-anchor - -### jobs that check for regressions on non-BE testcases -check-regressions-short-enc-0db: + - .test-job-linux-needs-testv-dir + - .rules-merge-request-no-draft + timeout: "20 minutes" + tags: + - ivas-linux stage: test - needs: - - job: "check-be-to-target-short-enc-0db" - artifacts: true - - job: branch-is-up-to-date-with-target-pre - artifacts: true - - job: build-codec-linux-make - extends: - - .rules-mr-to-main-or-main-pc - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + needs: ["build-codec-linux-make"] #, "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + # LTV update needed as ltv ISM metadata files are used + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash ci/smoke_test.sh + ### analyze for failures + - if ! [ -s smoke_test_output.txt ] || ! [ -s smoke_test_output_jbm.txt ] || ! [ -s smoke_test_output_hrtf.txt ]; then echo "Error in smoke test"; exit 1; fi + - ret_val=0 + - if cat smoke_test_output.txt | grep -c "failed"; then echo "Smoke test without JBM failed"; ret_val=1; fi + - if cat smoke_test_output_jbm.txt | grep -c "failed"; then echo "Smoke test JBM part failed"; ret_val=1; fi + - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi + - exit $ret_val + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week + when: always + paths: + - smoke_test_output.txt + - smoke_test_output_jbm.txt + - smoke_test_output_hrtf.txt + expose_as: "Smoke test results" -check-regressions-short-enc-+10db: - stage: test - needs: - - job: "check-be-to-target-short-enc-+10db" - artifacts: true - - job: branch-is-up-to-date-with-target-pre - artifacts: true - - job: build-codec-linux-make +### split rendering tests +split-rendering-smoke-test: extends: - - .rules-mr-to-main-or-main-pc - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -check-regressions-short-enc--10db: + - .test-job-linux + - .rules-merge-request-to-main + needs: ["build-codec-linux-make"] stage: test - needs: - - job: "check-be-to-target-short-enc--10db" - artifacts: true - - job: branch-is-up-to-date-with-target-pre - artifacts: true - - job: build-codec-linux-make - extends: - - .rules-mr-to-main-or-main-pc - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_DECODER_PATH=./IVAS_dec_ref - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh -check-regressions-short-dec-0db: - stage: test - needs: - - job: "check-be-to-target-short-dec-0db" - artifacts: true - - job: branch-is-up-to-date-with-target-pre - artifacts: true - - job: build-codec-linux-make - extends: - - .rules-mr-to-main-or-main-pc - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + - make -j + - testcase_timeout=10 + - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + expose_as: "split rendering smoke results" + reports: + junit: + - report-junit.xml -check-regressions-short-dec-+10db: - stage: test - needs: - - job: "check-be-to-target-short-dec-+10db" - artifacts: true - - job: branch-is-up-to-date-with-target-pre - artifacts: true - - job: build-codec-linux-make +lc3-wrapper-unit-test: extends: - - .rules-mr-to-main-or-main-pc - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor - -check-regressions-short-dec--10db: + - .test-job-linux + - .rules-merge-request-to-main-pc + needs: ["build-codec-linux-make"] stage: test - needs: - - job: "check-be-to-target-short-dec--10db" - artifacts: true - - job: branch-is-up-to-date-with-target-pre - artifacts: true - - job: build-codec-linux-make - extends: - - .rules-mr-to-main-or-main-pc - before_script: - - *set-reference-for-basop-port-branch - - USE_LTV=0 - - DUT_ENCODER_PATH=./IVAS_cod_ref - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - - rm -rf tests/dut tests/ref - <<: *check-regressions-pytest-anchor + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + + - cmake -B cmake-build -G "Unix Makefiles" -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true + - cmake --build cmake-build -- -j + - scripts/split_rendering/lc3plus_basop/ivas_lc3plus_unit_test # --------------------------------------------------------------- # Short test jobs for running from web interface or schedule @@ -1606,7 +1520,6 @@ ivas-pytest-compare_to_ref-short-enc: - .rules-pytest-to-ref-short - .test-job-linux before_script: - - *set-reference-for-basop-port-branch - USE_LTV=0 - ENCODER_TEST="true" - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1619,7 +1532,6 @@ ivas-pytest-compare_to_ref-short-enc-lev-10: - .rules-pytest-to-ref-short - .test-job-linux before_script: - - *set-reference-for-basop-port-branch - USE_LTV=0 - ENCODER_TEST="true" - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1632,7 +1544,6 @@ ivas-pytest-compare_to_ref-short-enc-lev+10: - .rules-pytest-to-ref-short - .test-job-linux before_script: - - *set-reference-for-basop-port-branch - USE_LTV=0 - ENCODER_TEST="true" - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1640,11 +1551,51 @@ ivas-pytest-compare_to_ref-short-enc-lev+10: - LEVEL_SCALING=3.162 <<: *ivas-pytest-anchor +# encoder dmx comparison jobs +ivas-pytest-compare_to_ref-dmx-short-enc: + extends: + - .rules-pytest-to-ref-enc-short-dmx + - .test-job-linux + before_script: + - USE_LTV=0 + - ENCODER_TEST="true" + - COMPARE_DMX="true" + - DUT_DECODER_PATH=./$REF_DECODER_PATH + - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" + - LEVEL_SCALING=1.0 + <<: *ivas-pytest-anchor + +ivas-pytest-compare_to_ref-dmx-short-enc-lev-10: + extends: + - .rules-pytest-to-ref-enc-short-dmx + - .test-job-linux + before_script: + - USE_LTV=0 + - ENCODER_TEST="true" + - COMPARE_DMX="true" + - DUT_DECODER_PATH=./$REF_DECODER_PATH + - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" + - LEVEL_SCALING=0.3162 + <<: *ivas-pytest-anchor + +ivas-pytest-compare_to_ref-dmx-short-enc-lev+10: + extends: + - .rules-pytest-to-ref-enc-short-dmx + - .test-job-linux + before_script: + - USE_LTV=0 + - ENCODER_TEST="true" + - COMPARE_DMX="true" + - DUT_DECODER_PATH=./$REF_DECODER_PATH + - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" + - LEVEL_SCALING=3.162 + <<: *ivas-pytest-anchor + ivas-pytest-enc-msan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=1 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1655,7 +1606,7 @@ ivas-pytest-enc-asan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=2 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1666,7 +1617,7 @@ ivas-pytest-enc-usan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=3 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1677,7 +1628,7 @@ ivas-pytest-enc-usan: ivas-pytest-compare_to_ref-short-dec: extends: - .rules-pytest-to-ref-short - - .test-job-linux + - .test-job-linux before_script: - USE_LTV=0 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1688,7 +1639,7 @@ ivas-pytest-compare_to_ref-short-dec: ivas-pytest-compare_to_ref-short-dec-lev-10: extends: - .rules-pytest-to-ref-short - - .test-job-linux + - .test-job-linux before_script: - USE_LTV=0 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1699,7 +1650,7 @@ ivas-pytest-compare_to_ref-short-dec-lev-10: ivas-pytest-compare_to_ref-short-dec-lev+10: extends: - .rules-pytest-to-ref-short - - .test-job-linux + - .test-job-linux before_script: - USE_LTV=0 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1734,7 +1685,7 @@ ivas-pytest-dec-msan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1745,7 +1696,7 @@ ivas-pytest-dec-asan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=2 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1756,7 +1707,7 @@ ivas-pytest-dec-usan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=3 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1764,7 +1715,7 @@ ivas-pytest-dec-usan: <<: *ivas-pytest-sanitizers-anchor # --------------------------------------------------------------- -# Long test jobs +# Long test job # --------------------------------------------------------------- ivas-pytest-compare_ref-long-enc: @@ -1783,6 +1734,9 @@ ivas-pytest-compare_ref-long-dec: extends: - .rules-pytest-long - .test-job-linux + tags: + - ivas-basop-linux + - high-memory-capacity before_script: - USE_LTV=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1807,6 +1761,9 @@ ivas-pytest-compare_ref-long-dec-lev-10: extends: - .rules-pytest-long - .test-job-linux + tags: + - ivas-basop-linux + - high-memory-capacity before_script: - USE_LTV=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1831,6 +1788,9 @@ ivas-pytest-compare_ref-long-dec-lev+10: extends: - .rules-pytest-long - .test-job-linux + tags: + - ivas-basop-linux + - high-memory-capacity before_script: - USE_LTV=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1839,6 +1799,49 @@ ivas-pytest-compare_ref-long-dec-lev+10: - SPLIT_COMPARISON="true" <<: *ivas-pytest-anchor +ivas-pytest-compare_ref-long-fx-fx: + extends: + - .rules-pytest-long-fx-fx + - .test-job-linux + tags: + - ivas-linux + before_script: + - USE_LTV=1 + - REF_ENCODER_PATH=./$DUT_ENCODER_PATH + - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" + - LEVEL_SCALING=1.0 + - SPLIT_COMPARISON="true" + <<: *ivas-pytest-anchor + +ivas-pytest-compare_ref-long-fx-fx-lev-10: + extends: + - .rules-pytest-long-fx-fx + - .test-job-linux + tags: + - ivas-linux + before_script: + - USE_LTV=1 + - REF_ENCODER_PATH=./$DUT_ENCODER_PATH + - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" + - LEVEL_SCALING=0.3162 + - SPLIT_COMPARISON="true" + <<: *ivas-pytest-anchor + +ivas-pytest-compare_ref-long-fx-fx-lev+10: + extends: + - .rules-pytest-long-fx-fx + - .test-job-linux + tags: + - ivas-linux + before_script: + - USE_LTV=1 + - REF_ENCODER_PATH=./$DUT_ENCODER_PATH + - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" + - LEVEL_SCALING=3.162 + - SPLIT_COMPARISON="true" + <<: *ivas-pytest-anchor + + ivas-smoke-test-saturation: extends: - .rules-pytest-saturation-smoke-test @@ -1847,14 +1850,14 @@ ivas-smoke-test-saturation: - USE_LTV=1 - LEVEL_SCALING=32768 - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - if [ $USE_LTV -eq 1 ]; then - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - fi - if [ $LEVEL_SCALING != "1.0" ];then - - *apply-testv-scaling + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi - cp -r scripts/testv/* $TESTV_DIR/ @@ -1890,15 +1893,15 @@ coverage-test-on-main-scheduled: stage: test timeout: 3 hours script: - - *print-common-info - - *update-scripts-repo - - *update-ltv-repo - - *copy-ltv-files-to-testv-dir - - *build-float-ref-binaries + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref # Build DuT binaries with GCOV - make clean >> /dev/null - make GCOV=1 -j - - cp IVAS_rend $REF_RENDERER_PATH # Copy to ensure instrumented renderer is run in the first pytest call + - cp IVAS_rend IVAS_rend_ref # Copy to ensure instrumented renderer is run in the first pytest call - testcase_timeout=$TESTCASE_TIMEOUT_LTV - exit_code_dec=0 @@ -1944,17 +1947,15 @@ be-2-evs-26444: extends: - .test-job-linux rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "evs-26444" - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main-pc") + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" tags: - be-2-evs-basop stage: test timeout: "120 minutes" # To be revisited script: - - *print-common-info - - *update-scripts-repo + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - sed -i".bak" "s/\(#define EVS_FLOAT\)/\/\/\1/" lib_com/options.h - make -j >> /dev/null @@ -1977,7 +1978,7 @@ be-2-evs-26444: expose_as: "EVS 26444 result" reports: junit: - - report-junit.xml + - report-junit.xml ivas-pytest-renderer: extends: @@ -2018,166 +2019,181 @@ voip-be-on-merge-request: needs: ["build-codec-linux-make"] timeout: "10 minutes" script: - - *print-common-info + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - make clean - make -j >> /dev/null - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py - -# --------------------------------------------------------------- -# Test jobs for merge requests -# --------------------------------------------------------------- - -# test that runs all modes with 1s input signals -# TODO: disabled temporarily, needs to be adapted to BASOP -.codec-smoke-test: +check-be-between-renderer-framesizes: extends: - - .test-job-linux-needs-testv-dir - - .rules-merge-request-no-draft - timeout: "20 minutes" - tags: - - ivas-linux + - .test-job-linux + # - .rules-pytest-to-main-short + rules: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "renderer-framesize-be" stage: test - needs: ["build-codec-linux-make"] #, "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] - script: - - *print-common-info - # LTV update needed as ltv ISM metadata files are used - - *update-ltv-repo - - bash ci/smoke_test.sh - ### analyze for failures - - if ! [ -s smoke_test_output.txt ] || ! [ -s smoke_test_output_jbm.txt ] || ! [ -s smoke_test_output_hrtf.txt ]; then echo "Error in smoke test"; exit 1; fi - - ret_val=0 - - if cat smoke_test_output.txt | grep -c "failed"; then echo "Smoke test without JBM failed"; ret_val=1; fi - - if cat smoke_test_output_jbm.txt | grep -c "failed"; then echo "Smoke test JBM part failed"; ret_val=1; fi - - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi - - exit $ret_val - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - smoke_test_output.txt - - smoke_test_output_jbm.txt - - smoke_test_output_hrtf.txt - expose_as: "Smoke test results" - -# compare renderer bitexactness between target and source branch -renderer-pytest-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main-pc - # TODO: set reasonable timeout, will most likely take less - timeout: "20 minutes" - tags: - - ivas-linux - stage: compare + needs: ["build-codec-linux-make"] script: - - *print-common-info - - *get-commits-behind-count - - *check-commits-behind-count-in-compare-jobs - - *merge-request-comparison-setup-codec - - # some helper variables - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - non_be_flag=$(grep -c --ignore-case "\[rend\(erer\)*[ -]*non[ -]*be\]" tmp.txt) || true - # TODO: ref_using_target comes from float repo, but does not apply here - disable for now - # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - - ref_using_target=0 + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh + - make clean + - make -j + - echo "$SHORT_TEST_SUITE" - ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - exit_code=0 - - testcase_timeout=60 - - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py --create_ref --testcase_timeout=$testcase_timeout || exit_code=$? - - ### Run test using branch scripts and input - - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml || exit_code=$? - # run test - - python3 -m pytest -q --log-level ERROR -n auto -rA --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py --create_cut --testcase_timeout=$testcase_timeout || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + - exit_code5=0 + - exit_code10=0 + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? - - *merge-request-comparison-check + - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true + - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true + - zero_errors=1 - allow_failure: - exit_codes: - - 123 + - *print-results-banner + - echo "!! Encoder command lines are in the 20ms log files only !!!" + - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors."; zero_errors=0; fi + - if [ $zero_errors5 != 1 ]; then echo "run error with 5ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors10 != 1 ]; then echo "run error with 10ms rendering encountered"; zero_errors=0 ; fi + - if [ $zero_errors != 1 ]; then exit $EXIT_CODE_FAIL; fi + - if [ $exit_code5 -ne 0 ]; then echo "Non-bitexact cases encountered with 5ms rendering!"; exit_code=1; fi + - if [ $exit_code10 -ne 0 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi + - if [ $exit_code -ne 0 ]; then exit $EXIT_CODE_FAIL; fi artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" expire_in: 1 week when: always + expose_as: "pytest 5ms and 10ms vs 20ms results" paths: - - report-junit.xml - - report.html - expose_as: "pytest renderer results" + - report-junit-5ms.xml + - report-5ms.html + - report-junit-10ms.xml + - report-10ms.html + - report-junit-20ms.xml + - report-20ms.html reports: junit: - - report-junit.xml - -# compare bit exactness between target and source branch -ivas-pytest-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main-pc - stage: compare - # TODO: broken dependency needs to be removed temporarily, see above - # note: this step doesn't really depend on codec-smoke-test - # it's just pointless to run this step when the smoke test fails and the smoke test should be reasonably fast - # thus, overall, this should save time - timeout: "40 minutes" + - report-junit-5ms.xml + - report-junit-10ms.xml + - report-junit-20ms.xml + +# To inject backup copy in manual trigger: +# - Store logs backup in accessible folder, e.g. /usr/local/backup +# - Set MANUAL_PIPELINE_TRIGGER to long-term-logs +# - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 +# - Set LOGS_BACKUP_SOURCE_DIR to source folder, e.g. /usr/local/backup +ivas-long-term-job-logs: + rules: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" + - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "long-term-logs" tags: - - ivas-linux + - $RUNNER_TAG + stage: maintenance + timeout: "25 minutes" script: - - *print-common-info - - *get-commits-behind-count - - *check-commits-behind-count-in-compare-jobs - - *merge-request-comparison-setup-codec - - *remove_unsupported_testcases - - # some helper variables - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - non_be_flag=$(grep -c --ignore-case "\[non[ -]*be\]" tmp.txt) || true - # TODO: ref_using_target comes from float repo, but does not apply here - disable for now - # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - - ref_using_target=0 - - ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi - - ### prepare pytest - # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 $DISABLE_HRTF_MODEL_TESTS + - !reference [ .job-linux, before_script ] + - set -euxo pipefail + - echo "Running on RUNNER_TAG = $RUNNER_TAG" + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + + # Clean up logs + - if [ -d "logs" ]; then rm -rf "logs"; fi + # Inject logs from backup copy if LOGS_BACKUP_SOURCE_DIR is set + - if [ "$LOGS_BACKUP_SOURCE_DIR" != "" ]; then + - cp_ret=0 + - cp -r $LOGS_BACKUP_SOURCE_DIR/logs ./ || cp_ret=$? + - if [ "$cp_ret" != 0 ]; then + - echo "Error -- Copying to $LOGS_BACKUP_SOURCE_DIR failed!" + - exit 1 + - fi + - fi - ### Run test using branch scripts and input - - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) + - echo "Job name from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - ### run pytest - - exit_code=0 - - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout $DISABLE_HRTF_MODEL_TESTS || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true + - if [ "$id_previous" != "-1" ]; then + # Unzip artifacts to recover past logs dir + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + # If there is overlap between injected log and new log, use the new logs. + - unzip -o artifacts.zip + - else + # create logs dir if it doesn't exist (should only happen in first run) + - echo "Could not find previous job, creating empty logs folder. If this is not the first run, an error likely happened!" + - mkdir logs + - fi - - *merge-request-comparison-check + # create folder for today's results + - TODAY=$(date +'%Y-%m-%d') + - mkdir -p logs/$TODAY + + # Aggregate job logs + - job_names="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" + - for job_name in $job_names; do + - echo "Getting job logs for $job_name" + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) + - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip -d previous_artifacts + - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY + - rm artifacts.zip + - rm -r previous_artifacts + - done + - ls logs + - exit 0 - allow_failure: - exit_codes: - - 123 artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week + name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" + expire_in: 4 weeks when: always paths: - - report-junit.xml - - report.html - expose_as: "pytest ivas results" - reports: - junit: - - report-junit.xml + - logs + expose_as: "ivas long term job logs results" + +# To store backup copy: +# - Prepare accessible folder for backup, e.g. /usr/local/backup +# - Set MANUAL_PIPELINE_TRIGGER to backup-long-term-logs +# - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 +# - Set LOGS_BACKUP_TARGET_DIR to source folder, e.g. /usr/local/backup +backup-long-term-job-logs: + rules: + - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" + - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" + tags: + - $RUNNER_TAG + stage: maintenance + timeout: "25 minutes" + script: + - !reference [ .job-linux, before_script ] + - set -euxo pipefail + - echo "Running on RUNNER_TAG = $RUNNER_TAG" + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + + # Find ID of last run of ivas-long-term-job-logs + - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-long-term-job-logs $CI_PROJECT_ID) + + - if [ "$id_previous" != "-1" ]; then + # Unzip artifacts to recover past logs dir + - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip + - unzip artifacts.zip + - else + # create logs dir if it doesn't exist + - mkdir logs + - fi + + # Store logs as backup copy if LOGS_BACKUP_TARGET_DIR is set + - if [ -d "$LOGS_BACKUP_TARGET_DIR" ]; then + - cp -r logs $LOGS_BACKUP_TARGET_DIR + - exit 0 + - else + - echo "Error - LOGS_BACKUP_TARGET_DIR not set for backup job!" + - exit 1 + - fi + # --------------------------------------------------------------- # Complexity measurement jobs @@ -2193,19 +2209,37 @@ ivas-pytest-on-merge-request: # this is a testing/maintenance mechanism to force getting the log history from a specific job id # see below in the concrete complexity jobs - if [ "$JOB_ID_INJECT" != "" ]; then job_id=$JOB_ID_INJECT; fi - - curl --silent --show-error --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip + - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - unzip -qq artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - public_dir="$CI_JOB_NAME-public" + # if is needed to catch case when no artifact is there (first run), similarly as above - - if [[ -d $public_dir ]]; then mv $public_dir/* wmops/; fi - - ls wmops + # 1. check for public_dir being there as this might not be the case when artifact download failed + # 2. check for public dir not being empty - handle job failures in prev job that happen after the dir is created. In that case, the empty dir is in the artifacts + - if [ -d $public_dir ] && [ ! -z "$( ls -A $public_dir )" ]; then + - mv $public_dir/* wmops/ + # check here if we have the split-by-levels files present - if not, fake them up with the existing global one + # this is needed for the first run with split graphs on a branch where the global version did run previously + # NOTE: checking only for level_1 file here as this should already be sufficient + # NOTE2: also not chechking for RAM for same reason + - wmops_all_global="wmops/log_wmops_all.txt" + - ram_all_global="wmops/log_ram_all.txt" + - if [ -f "${wmops_all_global}" ] && [ ! -f "wmops/log_wmops_all_level_1.txt" ]; then + - declare -a suffixes=("level_1" "level_2" "level_3" "rate_sw") + - for suffix in "${suffixes[@]}"; do + - cp ${wmops_all_global} wmops/log_wmops_all_${suffix}.txt + - cp ${ram_all_global} wmops/log_ram_all_${suffix}.txt + - done + - fi + - fi + - rm artifacts.zip - rm -rf $public_dir ### 1.5.part: get the corresponding measurement from ivas-float-update - job_id=$(python3 ci/get_id_of_last_job_occurence.py ivas-float-update $CI_JOB_NAME $CI_PROJECT_ID) - echo $job_id - - curl --silent --show-error --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip + - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip - unzip -qq -j artifacts_ref.zip "*latest_WMOPS.csv" || true # add file to arguments only if the artifact could be retrieved to prevent error later. - if [ -f latest_WMOPS.csv ]; then GET_WMOPS_ARGS="$GET_WMOPS_ARGS latest_WMOPS.csv"; fi @@ -2214,7 +2248,7 @@ ivas-pytest-on-merge-request: &complexity-measurements-prepare-artifacts # prepare artifacts -> move to public directory - public_dir="$CI_JOB_NAME-public" - mkdir $public_dir - - mv -f wmops/log_*_all.txt ./*.js ${public_dir}/ + - mv -f wmops/log_*_all*.txt ./*.js ${public_dir}/ # move logfiles for links - mkdir $public_dir/logs # first move logs @@ -2246,10 +2280,11 @@ ivas-pytest-on-merge-request: GET_WMOPS_ARGS: "mem_only" timeout: 3 hours 30 minutes before_script: - - *print-common-info - - *update-scripts-repo - - *update-ltv-repo - - *build-float-ref-and-dut-binaries + - !reference [ .test-job-linux, before_script ] + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - *complexity-measurements-setup # delete previous jobs logfiles if present (-f flag ensures return calue of 0 even in first run where this folder is not present) - rm -rf COMPLEXITY/logs @@ -2623,12 +2658,13 @@ complexity-osba-in-binaural_room_ir-out: pages: stage: deploy tags: - - ivas-linux + - ivas-basop-linux rules: - if: $UPDATE_PAGES script: - - *print-common-info - - *update-scripts-repo + - !reference [ .job-linux, before_script ] + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - python3 ci/setup_pages.py - ls - ls -lh public -- GitLab From 63436032df42eff72cf2a025b385a19e43dd56ed Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 16:23:54 +0200 Subject: [PATCH 1262/1310] [revert-me] set CI ref to wip branch --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a2bd885d5..f7cd9b118 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF main + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF kiene/basop-ci-merge include: - local: .gitlab-ci/variables.yml -- GitLab From 834b955b69c4cc19a4cc799225db7e1ba2d9b292 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 16:25:32 +0200 Subject: [PATCH 1263/1310] remove unneeded anchor --- .gitlab-ci.yml | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f7cd9b118..42ced8b6a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -100,29 +100,6 @@ workflow: - (Get-Content -Path "CMakeLists.txt") -replace '# \(add_compile_options\("\/WX"\)\)', '$1' | Set-Content -Path "CMakeLists.txt" - Get-ChildItem -Path "Workspace_msvc" -Filter "*.vcxproj" | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'false', 'true' | Set-Content -Path $_.FullName } -# NOTE: can be removed if script from ci repo works -.build-merge-target-binaries: &build-merge-target-binaries - - current_commit_sha=$(git rev-parse HEAD) - ### build merge target binaries - - if [ -f $MERGE_TARGET_COMMIT_FILE ]; then - - MERGE_REQUEST_TARGET="$(cat "$MERGE_TARGET_COMMIT_FILE")" - - else - - echo "MERGE_TARGET_COMMIT_FILE ($MERGE_TARGET_COMMIT_FILE) does not exist, exiting!" - - exit 1 - - fi - - git checkout $MERGE_REQUEST_TARGET - - *activate-debug-mode-info-if-set - - make clean - - make -j >> /dev/null - - mv ./IVAS_cod ./$MERGE_TARGET_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_dec ./$MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./IVAS_rend ./$MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY - - mv ./ISAR_post_rend ./$MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY - ### Return to current branch - - git restore . - - git rev-parse HEAD > $MERGE_TARGET_COMMIT_FILE - - git checkout $current_commit_sha - # From float CI .merge-request-comparison-setup-codec: &merge-request-comparison-setup-codec - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh -- GitLab From 86de595312b12b6a4387e47dec7f17c6b483775c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 16:27:02 +0200 Subject: [PATCH 1264/1310] fix usage of obsolete rule template --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 42ced8b6a..ec335a2fb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -818,9 +818,9 @@ fail-pipeline-if-in-draft: - exit 1 # this branch runs on merges to main-pc only and will fail if the branch itself does not conform to the naming conventions -check-naming-of-branch-for-main-pc-merges: +check-naming-of-branch-for-basop-update-merges: extends: - - .rules-merge-request-to-main-pc + - .rules-merge-request-to-main stage: prevalidate tags: - ivas-linux @@ -928,7 +928,7 @@ clang-format-check: .check-bitexactness-hrtf-rom-and-file: extends: - .test-job-linux - - .rules-merge-request-to-main-pc + - .rules-merge-request-to-main stage: test needs: ["build-codec-linux-make"] timeout: "5 minutes" @@ -1246,7 +1246,7 @@ renderer-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main-pc + - .rules-merge-request-to-main # TODO: set reasonable timeout, will most likely take less timeout: "20 minutes" tags: @@ -1300,7 +1300,7 @@ ivas-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main-pc + - .rules-merge-request-to-main stage: compare timeout: "40 minutes" tags: @@ -1356,7 +1356,7 @@ split-rendering-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main-pc + - .rules-merge-request-to-main timeout: "60 minutes" stage: compare script: @@ -1476,7 +1476,7 @@ split-rendering-smoke-test: lc3-wrapper-unit-test: extends: - .test-job-linux - - .rules-merge-request-to-main-pc + - .rules-merge-request-to-main needs: ["build-codec-linux-make"] stage: test script: -- GitLab From 4da0580c678b2052f55ba7999f295131f878e272 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 16:33:36 +0200 Subject: [PATCH 1265/1310] add missing inheritance --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ec335a2fb..dec25ec17 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -821,6 +821,7 @@ fail-pipeline-if-in-draft: check-naming-of-branch-for-basop-update-merges: extends: - .rules-merge-request-to-main + - .job-linux stage: prevalidate tags: - ivas-linux -- GitLab From e75688d2433206c0740a597e7483baba716bb3dc Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 16:41:15 +0200 Subject: [PATCH 1266/1310] dummy commit to trigger CI -- GitLab From 208ec98d82e8afc03cfb3f7ad9b8e1b5587039a7 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 17:52:54 +0200 Subject: [PATCH 1267/1310] add missing script call --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dec25ec17..f1eb4f4a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -990,6 +990,7 @@ build-codec-linux-cmake: timeout: "10 minutes" script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - cmake -B cmake-build -G "Unix Makefiles" - cmake --build cmake-build -- -j -- GitLab From dd3a642bfc4c60451585708c96fc0328acfeeaf9 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 24 Jul 2025 17:59:12 +0200 Subject: [PATCH 1268/1310] still use main set of unsupported testcases --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f1eb4f4a8..6d922ea67 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -268,7 +268,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - python3 ci/remove_unsupported_testcases.py $PRM_FILES - if [ $LEVEL_SCALING != "1.0" ]; then - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi @@ -424,7 +424,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - python3 ci/remove_unsupported_testcases.py $PRM_FILES - python3 scripts/prepare_combined_format_inputs.py - if [ $LEVEL_SCALING != "1.0" ];then @@ -554,7 +554,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - python3 ci/remove_unsupported_testcases.py $PRM_FILES - if [ $LEVEL_SCALING != "1.0" ];then - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi @@ -679,7 +679,7 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - python3 ci/remove_unsupported_testcases.py $PRM_FILES - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - set -euxo pipefail @@ -728,7 +728,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - python3 ci/remove_unsupported_testcases.py $PRM_FILES - if [ $LEVEL_SCALING != "1.0" ];then - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi @@ -1311,7 +1311,7 @@ ivas-pytest-on-merge-request: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - *merge-request-comparison-setup-codec - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - python3 ci/remove_unsupported_testcases.py $PRM_FILES # some helper variables - "|| true" to prevent failures from grep not finding anything # write to temporary file as workaround for failures observed with piping echo @@ -2018,7 +2018,7 @@ check-be-between-renderer-framesizes: - echo "$SHORT_TEST_SUITE" - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + - python3 ci/remove_unsupported_testcases.py $PRM_FILES - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml || exit_code=$? -- GitLab From 010559e25c64771e8fe0aa63f5d1cce8bf326e3e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 09:53:28 +0200 Subject: [PATCH 1269/1310] dummy commit to trigger CI -- GitLab From e52f884d263f266402a34e24627208c69289afea Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 10:23:01 +0200 Subject: [PATCH 1270/1310] add check if post renderer exists b4 renaming --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6d922ea67..35a115b3d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -108,7 +108,8 @@ workflow: - mv $MERGE_TARGET_ENCODER_PATH $REF_ENCODER_PATH - mv $MERGE_TARGET_DECODER_PATH $REF_DECODER_PATH - mv $MERGE_TARGET_RENDERER_PATH $REF_RENDERER_PATH - - mv $MERGE_TARGET_POST_RENDERER_PATH $REF_POST_RENDERER_PATH + # NOTE: temporary solution for merge to main + - if [ -f $MERGE_TARGET_POST_RENDERER_PATH ]; then mv $MERGE_TARGET_POST_RENDERER_PATH $REF_POST_RENDERER_PATH; fi - make clean - make -j -- GitLab From 6171f9949c4fc7b6941d0b58c5bc693cb27ec5a3 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 10:25:12 +0200 Subject: [PATCH 1271/1310] temporarily disable split rendering comparison job --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 35a115b3d..9f3fdc6c8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1355,7 +1355,8 @@ ivas-pytest-on-merge-request: junit: - report-junit.xml -split-rendering-pytest-on-merge-request: +#TODO: re-enable after merge to main is done +.split-rendering-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - .test-job-linux-compares-to-fixed-target -- GitLab From 94111c3f383f9423994ff211bec64e93ad525705 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 11:27:03 +0200 Subject: [PATCH 1272/1310] adjustments for correct float references and needs --- .gitlab-ci.yml | 65 +++++++++++++++++----------------------- .gitlab-ci/variables.yml | 10 +++++++ 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9f3fdc6c8..197781470 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -382,28 +382,17 @@ workflow: extends: - .test-job-linux - .rules-pytest-to-main-short + - .test-job-linux-compares-to-fixed-target before_script: - !reference [ .test-job-linux, before_script ] - rm -rf tests/dut tests/ref variables: USE_LTV: 0 -# TODO: we might need a new mechanism here now that everything happens on main -.set-reference-for-basop-port-branch: &set-reference-for-basop-port-branch - - if [ $CI_MERGE_REQUEST_TARGET_BRANCH_NAME = "main" ]; then - - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - # a bit awkward: write to file + standard out first so that the error message is visivle in case of failure. Then fill the variable from the file - - ci/get_float_ref_branch_name.sh $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME | tee tmp_ref_branch.txt - - FLOAT_REF_BRANCH=$(cat tmp_ref_branch.txt) - - fi - - fi - .check-be-to-target-job: extends: - .check-be-job stage: check-be - needs: ["build-codec-linux-make","branch-is-up-to-date-with-target-pre"] timeout: "300 minutes" variables: XML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" @@ -432,11 +421,14 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi + # set branches for reference builds + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh + # build merge target branch and correpsonding float reference - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target - - make clean - - make -j >> /dev/null - - *check-up-to-date-in-comparison-jobs + # build to-be-merged branch and corresponding float ref branch + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-source + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source - exit_code_target=0 - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? @@ -567,10 +559,15 @@ workflow: - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" - ### run branch first - # this per default builds the branch and the reference and creates the reference outputs - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh - - *check-up-to-date-in-comparison-jobs + # set branches for reference builds + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh + # build merge target branch and correpsonding float reference + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target + # build to-be-merged branch and corresponding float ref branch + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-source + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source + # need to restore cache again - *overwrite-pytest-cache-with-artifact - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true @@ -584,11 +581,6 @@ workflow: - python3 scripts/create_histograms.py $CSV_BRANCH $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - ### run main now - - git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - - make clean - - make -j >> /dev/null # need to restore cache again - *overwrite-pytest-cache-with-artifact - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true @@ -682,7 +674,6 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - python3 ci/remove_unsupported_testcases.py $PRM_FILES - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - set -euxo pipefail - make_args="CLANG=$CLANG_NUM" - if [[ $CLANG_NUM == 3 ]]; then @@ -1089,7 +1080,7 @@ check-be-to-target-short-enc-0db: # -/-0dB LEVEL_SCALING: "1.0" # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" + DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 @@ -1101,7 +1092,7 @@ check-be-to-target-short-enc-+10db: # +10dB LEVEL_SCALING: "3.162" # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" + DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 @@ -1113,7 +1104,7 @@ check-be-to-target-short-enc--10db: # -10dB LEVEL_SCALING: "0.3162" # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" + DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 @@ -1125,7 +1116,7 @@ check-be-to-target-short-dec-0db: # +/-0dB LEVEL_SCALING: "1.0" # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 @@ -1137,7 +1128,7 @@ check-be-to-target-short-dec-+10db: # +10dB LEVEL_SCALING: "3.162" # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 @@ -1149,7 +1140,7 @@ check-be-to-target-short-dec--10db: # -10dB LEVEL_SCALING: "0.3162" # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 @@ -1165,7 +1156,7 @@ check-regressions-short-enc-0db: # +/-0dB LEVEL_SCALING: "1.0" # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" + DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 @@ -1180,7 +1171,7 @@ check-regressions-short-enc-+10db: # +10dB LEVEL_SCALING: "3.162" # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" + DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 @@ -1195,7 +1186,7 @@ check-regressions-short-enc--10db: # -10dB LEVEL_SCALING: "0.3162" # overwrite decoder with float reference one - DUT_DECODER_PATH: "$REF_DECODER_PATH" + DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 @@ -1210,7 +1201,7 @@ check-regressions-short-dec-0db: # +/-0dB LEVEL_SCALING: "1" # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 @@ -1225,7 +1216,7 @@ check-regressions-short-dec-+10db: # +10dB LEVEL_SCALING: "3.162" # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 @@ -1240,7 +1231,7 @@ check-regressions-short-dec--10db: # -10dB LEVEL_SCALING: "0.3162" # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$REF_ENCODER_PATH" + DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 8bf02a062..8b54397ed 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -3,6 +3,7 @@ variables: LTV_DIR: "/usr/local/ltv" EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" FLOAT_REF_BRANCH: "ivas-float-update" + FLOAT_REF_BRANCH_MERGE_SOURCE: "" BUILD_OUTPUT: "build_output.txt" SCRIPTS_DIR: "/usr/local/scripts" EXIT_CODE_NON_BE: 123 @@ -31,6 +32,10 @@ variables: MERGE_TARGET_POST_RENDERER_PATH: "./ISAR_post_rend_merge_target" # These path variables are used for building the binaries # They should never be overwritten! + DUT_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod" + DUT_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec" + DUT_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend" + DUT_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend" REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_ref" @@ -39,6 +44,10 @@ variables: MERGE_TARGET_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_target" MERGE_TARGET_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_merge_target" MERGE_TARGET_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_merge_target" + MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_merge_source_float_ref" + MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_merge_source_float_ref" + MERGE_SOURCE_FLOAT_REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_merge_source_float_ref" + MERGE_SOURCE_FLOAT_REF_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_merge_source_float_ref" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch-pc" @@ -66,6 +75,7 @@ variables: FLOAT_REF_COMMIT_FILE: "float-ref-git-sha.txt" CUT_COMMIT_FILE: "CuT-git-sha.txt" MERGE_TARGET_COMMIT_FILE: "merge-target-git-sha.txt" + MERGE_SOURCE_FLOAT_REF_COMMIT_FILE: "merge-source-float-ref-git-sha.txt" RUNNER_TAG: "ivas-basop-linux" LOGS_BACKUP_SOURCE_DIR: "" LOGS_BACKUP_TARGET_DIR: "" -- GitLab From fe8cdfb33feb0be47f09cc86f4bb9dcdebcb4403 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 11:34:31 +0200 Subject: [PATCH 1273/1310] increase timeout --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 197781470..4b0837a68 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -877,7 +877,7 @@ clang-format-check: ARTIFACT_BASE_NAME: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--formatting-fix" stage: prevalidate needs: [] - timeout: "5 minutes" + timeout: "10 minutes" script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh # Set up variables. This can't be done in the "variables" section because variables are not expanded properly there -- GitLab From 90fb4a07ff1ca4f128d0258d4489e19c8c5bb3fa Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 12:04:56 +0200 Subject: [PATCH 1274/1310] [revert-me] temporarily reduce jobs for faster testing --- .gitlab-ci.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4b0837a68..3374ddda4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -967,7 +967,7 @@ build-codec-linux-make: - *activate-Werror-linux - make -j -build-codec-linux-cmake: +.build-codec-linux-cmake: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -987,7 +987,7 @@ build-codec-linux-cmake: - cmake --build cmake-build -- -j # ensure that codec builds on linux with instrumentation active -build-codec-linux-instrumented-make: +.build-codec-linux-instrumented-make: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1007,7 +1007,7 @@ build-codec-linux-instrumented-make: - make -j -C $INSTR_DIR # make sure that the codec builds with msan, asan and usan -build-codec-sanitizers-linux: +.build-codec-sanitizers-linux: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1027,7 +1027,7 @@ build-codec-sanitizers-linux: #- *activate-Werror-linux - bash ci/build_codec_sanitizers_linux.sh -build-codec-linux-debugging-make: +.build-codec-linux-debugging-make: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1047,7 +1047,7 @@ build-codec-linux-debugging-make: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/activate-debug-mode-info-if-set.sh - make -j -build-codec-windows-msbuild: +.build-codec-windows-msbuild: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1084,7 +1084,7 @@ check-be-to-target-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -check-be-to-target-short-enc-+10db: +.check-be-to-target-short-enc-+10db: extends: - .check-be-to-target-job variables: @@ -1096,7 +1096,7 @@ check-be-to-target-short-enc-+10db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -check-be-to-target-short-enc--10db: +.check-be-to-target-short-enc--10db: extends: - .check-be-to-target-job variables: @@ -1108,7 +1108,7 @@ check-be-to-target-short-enc--10db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -check-be-to-target-short-dec-0db: +.check-be-to-target-short-dec-0db: extends: - .check-be-to-target-job variables: @@ -1120,7 +1120,7 @@ check-be-to-target-short-dec-0db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -check-be-to-target-short-dec-+10db: +.check-be-to-target-short-dec-+10db: extends: - .check-be-to-target-job variables: @@ -1132,7 +1132,7 @@ check-be-to-target-short-dec-+10db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -check-be-to-target-short-dec--10db: +.check-be-to-target-short-dec--10db: extends: - .check-be-to-target-job variables: @@ -1160,7 +1160,7 @@ check-regressions-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -check-regressions-short-enc-+10db: +.check-regressions-short-enc-+10db: extends: - .check-regressions-pytest-job needs: @@ -1175,7 +1175,7 @@ check-regressions-short-enc-+10db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -check-regressions-short-enc--10db: +.check-regressions-short-enc--10db: extends: - .check-regressions-pytest-job needs: @@ -1190,7 +1190,7 @@ check-regressions-short-enc--10db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -check-regressions-short-dec-0db: +.check-regressions-short-dec-0db: extends: - .check-regressions-pytest-job needs: @@ -1205,7 +1205,7 @@ check-regressions-short-dec-0db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -check-regressions-short-dec-+10db: +.check-regressions-short-dec-+10db: extends: - .check-regressions-pytest-job needs: @@ -1220,7 +1220,7 @@ check-regressions-short-dec-+10db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -check-regressions-short-dec--10db: +.check-regressions-short-dec--10db: extends: - .check-regressions-pytest-job needs: -- GitLab From 2540977bfd13a7237fc186c883198d7794f58e12 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 12:50:47 +0200 Subject: [PATCH 1275/1310] dummy commit to trigger CI -- GitLab From 299ea3ae385f9871d8cdcafc19e110a00a00688c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 13:10:25 +0200 Subject: [PATCH 1276/1310] add debug output --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3374ddda4..c05a016bc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -423,6 +423,7 @@ workflow: # set branches for reference builds - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh + - echo "$FLOAT_REF_BRANCH - $FLOAT_REF_BRANCH_MERGE_SOURCE - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" # build merge target branch and correpsonding float reference - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target -- GitLab From 2953ee52fb39373b54ae9164d7d246a9ef3eca3c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 13:11:43 +0200 Subject: [PATCH 1277/1310] [revert-me] disable more jobs for faster testing --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c05a016bc..f305d86c9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -811,7 +811,7 @@ fail-pipeline-if-in-draft: - exit 1 # this branch runs on merges to main-pc only and will fail if the branch itself does not conform to the naming conventions -check-naming-of-branch-for-basop-update-merges: +.check-naming-of-branch-for-basop-update-merges: extends: - .rules-merge-request-to-main - .job-linux @@ -865,7 +865,7 @@ branch-is-up-to-date-with-target-post: exit_codes: - 123 -clang-format-check: +.clang-format-check: extends: - .test-job-linux rules: -- GitLab From ec9eb5598942f59c52df7b87dfb2e73be68d71eb Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 13:27:52 +0200 Subject: [PATCH 1278/1310] use other script and set different default --- .gitlab-ci.yml | 2 +- .gitlab-ci/variables.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f305d86c9..0e538d0fb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -426,7 +426,7 @@ workflow: - echo "$FLOAT_REF_BRANCH - $FLOAT_REF_BRANCH_MERGE_SOURCE - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" # build merge target branch and correpsonding float reference - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh # build to-be-merged branch and corresponding float ref branch - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-source - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 8b54397ed..b233cc97e 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -3,7 +3,7 @@ variables: LTV_DIR: "/usr/local/ltv" EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" FLOAT_REF_BRANCH: "ivas-float-update" - FLOAT_REF_BRANCH_MERGE_SOURCE: "" + FLOAT_REF_BRANCH_MERGE_SOURCE: "float-pc" BUILD_OUTPUT: "build_output.txt" SCRIPTS_DIR: "/usr/local/scripts" EXIT_CODE_NON_BE: 123 -- GitLab From 545beb1f625fe9735c92eb318f16ebf7a3e4340e Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 13:34:17 +0200 Subject: [PATCH 1279/1310] back to old default and use source for scripts scripts that intend to modify env vars need to be run with source --- .gitlab-ci.yml | 9 +++++---- .gitlab-ci/variables.yml | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0e538d0fb..89780212a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -102,7 +102,7 @@ workflow: # From float CI .merge-request-comparison-setup-codec: &merge-request-comparison-setup-codec - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh + - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh # need to rename to match the conventions for the renderer tests... - mv $MERGE_TARGET_ENCODER_PATH $REF_ENCODER_PATH @@ -422,11 +422,12 @@ workflow: - fi # set branches for reference builds - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh + - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh - echo "$FLOAT_REF_BRANCH - $FLOAT_REF_BRANCH_MERGE_SOURCE - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" # build merge target branch and correpsonding float reference - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh + - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh + - echo "$FLOAT_REF_BRANCH - $FLOAT_REF_BRANCH_MERGE_SOURCE - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" # build to-be-merged branch and corresponding float ref branch - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-source - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source @@ -561,7 +562,7 @@ workflow: - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" # set branches for reference builds - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh + - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh # build merge target branch and correpsonding float reference - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index b233cc97e..8b54397ed 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -3,7 +3,7 @@ variables: LTV_DIR: "/usr/local/ltv" EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" FLOAT_REF_BRANCH: "ivas-float-update" - FLOAT_REF_BRANCH_MERGE_SOURCE: "float-pc" + FLOAT_REF_BRANCH_MERGE_SOURCE: "" BUILD_OUTPUT: "build_output.txt" SCRIPTS_DIR: "/usr/local/scripts" EXIT_CODE_NON_BE: 123 -- GitLab From a19d4088ece4cca7860685501b7b64cafe18a86f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 13:53:12 +0200 Subject: [PATCH 1280/1310] use explicit name for dut executables using the default ones is prone to being overwritten/deleted by e.g. "make clean" --- .gitlab-ci/variables.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 8b54397ed..71830df85 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -18,10 +18,10 @@ variables: # DISABLE_HRTF_MODEL_TESTS: "-k not model" #enable this declaration to disable HRTF model from file tests # These path variables are used by the pytest calls. # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain - DUT_ENCODER_PATH: "./IVAS_cod" - DUT_DECODER_PATH: "./IVAS_dec" - DUT_RENDERER_PATH: "./IVAS_rend" - DUT_POST_RENDERER_PATH: "./ISAR_post_rend" + DUT_ENCODER_PATH: "./IVAS_cod_dut" + DUT_DECODER_PATH: "./IVAS_dec_dut" + DUT_RENDERER_PATH: "./IVAS_rend_dut" + DUT_POST_RENDERER_PATH: "./ISAR_post_rend_dut" REF_ENCODER_PATH: "./IVAS_cod_ref" REF_DECODER_PATH: "./IVAS_dec_ref" REF_RENDERER_PATH: "./IVAS_rend_ref" @@ -32,10 +32,10 @@ variables: MERGE_TARGET_POST_RENDERER_PATH: "./ISAR_post_rend_merge_target" # These path variables are used for building the binaries # They should never be overwritten! - DUT_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod" - DUT_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec" - DUT_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend" - DUT_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend" + DUT_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_dut" + DUT_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_dut" + DUT_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_dut" + DUT_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_dut" REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_ref" REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_dec_ref" REF_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_rend_ref" -- GitLab From d62478727363ab8a2930dcb1cee78996ff21cca9 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 14:13:02 +0200 Subject: [PATCH 1281/1310] store commit hash in compare jobs --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 89780212a..74354efe8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1261,6 +1261,9 @@ renderer-pytest-on-merge-request: # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - ref_using_target=0 + # store the current commit hash + - source_branch_commit_sha=$(git rev-parse HEAD) + ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi @@ -1315,6 +1318,9 @@ ivas-pytest-on-merge-request: # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - ref_using_target=0 + # store the current commit hash + - source_branch_commit_sha=$(git rev-parse HEAD) + ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi -- GitLab From 1a91d0abfe9d4ff716f6795188e3355952e28bcc Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 15:35:37 +0200 Subject: [PATCH 1282/1310] support two different float references in regression jobs --- .gitlab-ci.yml | 29 ++++++++++++++++++++++------- .gitlab-ci/variables.yml | 4 ++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74354efe8..b881cbc1d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -570,22 +570,37 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-source - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source - # need to restore cache again + # set pytest args for ref creation + - enc_stats_arg="" + - if [ "$ENCODER_TEST" = "true" ]; then + - enc_stats_arg="--enc_stats" + - fi + - enc_dmx_arg="" + - if [ "$COMPARE_DMX" = "true" ]; then + - enc_dmx_arg="--compare_enc_dmx" + - fi + + ### ----- run pytest for branch (dut) first ----- + # create float reference outputs with corresponding branch + - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $MERGE_SOURCE_FLOAT_REF_ENCODER_PATH --ref_decoder_path $MERGE_SOURCE_FLOAT_REF_DECODER_PATH || exit_code=$? - *overwrite-pytest-cache-with-artifact - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true + # create dut outputs + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - zero_errors_branch=$(cat $XML_REPORT_BRANCH | grep -c 'errors="0"') || true - python3 scripts/parse_xml_report.py $XML_REPORT_BRANCH $CSV_BRANCH - - # Store branch outputs for comparison + # Store branch outputs for later comparison - mv tests/dut tests/dut_branch - # create the summary based on the branch only - python3 scripts/create_histograms.py $CSV_BRANCH $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT + - *overwrite-pytest-cache-with-artifact - # need to restore cache again + ### ----- run pytest for merge target now ----- + # create float reference outputs with corresponding branch + - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH || exit_code=$? - *overwrite-pytest-cache-with-artifact - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true + # create merge-target outputs + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --dut_encoder_path $MERGE_TARGET_ENCODER_PATH --dut_decoder_path $MERGE_TARGET_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - python3 scripts/parse_xml_report.py $XML_REPORT_MAIN $CSV_MAIN ### compare the two csv files for regressions diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 71830df85..22e588d97 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -30,6 +30,10 @@ variables: MERGE_TARGET_DECODER_PATH: "./IVAS_dec_merge_target" MERGE_TARGET_RENDERER_PATH: "./IVAS_rend_merge_target" MERGE_TARGET_POST_RENDERER_PATH: "./ISAR_post_rend_merge_target" + MERGE_SOURCE_FLOAT_REF_ENCODER_PATH: "./IVAS_cod_merge_source_float_ref" + MERGE_SOURCE_FLOAT_REF_DECODER_PATH: "./IVAS_dec_merge_source_float_ref" + MERGE_SOURCE_FLOAT_REF_RENDERER_PATH: "./IVAS_rend_merge_source_float_ref" + MERGE_SOURCE_FLOAT_REF_POST_RENDERER_PATH: "./ISAR_post_rend_merge_source_float_ref" # These path variables are used for building the binaries # They should never be overwritten! DUT_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./IVAS_cod_dut" -- GitLab From 3068ade44968974c07c2c2a004f57945d8a46173 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 15:37:55 +0200 Subject: [PATCH 1283/1310] add merge-target float ref commit file to artifacts --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b881cbc1d..e4d088be5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -493,6 +493,7 @@ workflow: - $FLOAT_REF_COMMIT_FILE - $CUT_COMMIT_FILE - $MERGE_TARGET_COMMIT_FILE + - $MERGE_SOURCE_FLOAT_REF_COMMIT_FILE - $PYTEST_LOG_TARGET_BRANCH expose_as: "pytest compare results" reports: @@ -653,6 +654,7 @@ workflow: - $FLOAT_REF_COMMIT_FILE - $CUT_COMMIT_FILE - $MERGE_TARGET_COMMIT_FILE + - $MERGE_SOURCE_FLOAT_REF_COMMIT_FILE - regressions_crashes.csv - regressions_MLD.csv - regressions_MAX_ABS_DIFF.csv -- GitLab From 6c7e5e564576d9165a565039ce2b57787082b84c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 16:01:43 +0200 Subject: [PATCH 1284/1310] [revert-me] disable hrtf file testcases for merge --- .gitlab-ci/variables.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 22e588d97..383efe9fb 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -2,6 +2,7 @@ variables: TESTV_DIR: "/usr/local/testv" LTV_DIR: "/usr/local/ltv" EVS_BE_TEST_DIR_BASOP: "/usr/local/be_2_evs_basop" + # TODO: cleanup and use global var defined in ivas-codec-ci FLOAT_REF_BRANCH: "ivas-float-update" FLOAT_REF_BRANCH_MERGE_SOURCE: "" BUILD_OUTPUT: "build_output.txt" @@ -14,8 +15,8 @@ variables: SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" TEST_SUITE: "" - DISABLE_HRTF_MODEL_TESTS: "" - # DISABLE_HRTF_MODEL_TESTS: "-k not model" #enable this declaration to disable HRTF model from file tests + # DISABLE_HRTF_MODEL_TESTS: "" + DISABLE_HRTF_MODEL_TESTS: "-k not model" #enable this declaration to disable HRTF model from file tests # These path variables are used by the pytest calls. # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain DUT_ENCODER_PATH: "./IVAS_cod_dut" -- GitLab From a5ec0a4e67aacf3b4726e671eddfb908befcf60c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 16:06:32 +0200 Subject: [PATCH 1285/1310] Revert "[revert-me] disable more jobs for faster testing" This reverts commit 2953ee52fb39373b54ae9164d7d246a9ef3eca3c. --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e4d088be5..a72f90c2b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -829,7 +829,7 @@ fail-pipeline-if-in-draft: - exit 1 # this branch runs on merges to main-pc only and will fail if the branch itself does not conform to the naming conventions -.check-naming-of-branch-for-basop-update-merges: +check-naming-of-branch-for-basop-update-merges: extends: - .rules-merge-request-to-main - .job-linux @@ -883,7 +883,7 @@ branch-is-up-to-date-with-target-post: exit_codes: - 123 -.clang-format-check: +clang-format-check: extends: - .test-job-linux rules: -- GitLab From 5ca25d8ddcfce75c344a328e318e830aea66b718 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 16:07:10 +0200 Subject: [PATCH 1286/1310] Revert "[revert-me] temporarily reduce jobs for faster testing" This reverts commit 90fb4a07ff1ca4f128d0258d4489e19c8c5bb3fa. --- .gitlab-ci.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a72f90c2b..851b7b952 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -986,7 +986,7 @@ build-codec-linux-make: - *activate-Werror-linux - make -j -.build-codec-linux-cmake: +build-codec-linux-cmake: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1006,7 +1006,7 @@ build-codec-linux-make: - cmake --build cmake-build -- -j # ensure that codec builds on linux with instrumentation active -.build-codec-linux-instrumented-make: +build-codec-linux-instrumented-make: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1026,7 +1026,7 @@ build-codec-linux-make: - make -j -C $INSTR_DIR # make sure that the codec builds with msan, asan and usan -.build-codec-sanitizers-linux: +build-codec-sanitizers-linux: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1046,7 +1046,7 @@ build-codec-linux-make: #- *activate-Werror-linux - bash ci/build_codec_sanitizers_linux.sh -.build-codec-linux-debugging-make: +build-codec-linux-debugging-make: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1066,7 +1066,7 @@ build-codec-linux-make: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/activate-debug-mode-info-if-set.sh - make -j -.build-codec-windows-msbuild: +build-codec-windows-msbuild: rules: - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never @@ -1103,7 +1103,7 @@ check-be-to-target-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -.check-be-to-target-short-enc-+10db: +check-be-to-target-short-enc-+10db: extends: - .check-be-to-target-job variables: @@ -1115,7 +1115,7 @@ check-be-to-target-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -.check-be-to-target-short-enc--10db: +check-be-to-target-short-enc--10db: extends: - .check-be-to-target-job variables: @@ -1127,7 +1127,7 @@ check-be-to-target-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -.check-be-to-target-short-dec-0db: +check-be-to-target-short-dec-0db: extends: - .check-be-to-target-job variables: @@ -1139,7 +1139,7 @@ check-be-to-target-short-enc-0db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -.check-be-to-target-short-dec-+10db: +check-be-to-target-short-dec-+10db: extends: - .check-be-to-target-job variables: @@ -1151,7 +1151,7 @@ check-be-to-target-short-enc-0db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -.check-be-to-target-short-dec--10db: +check-be-to-target-short-dec--10db: extends: - .check-be-to-target-job variables: @@ -1179,7 +1179,7 @@ check-regressions-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -.check-regressions-short-enc-+10db: +check-regressions-short-enc-+10db: extends: - .check-regressions-pytest-job needs: @@ -1194,7 +1194,7 @@ check-regressions-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -.check-regressions-short-enc--10db: +check-regressions-short-enc--10db: extends: - .check-regressions-pytest-job needs: @@ -1209,7 +1209,7 @@ check-regressions-short-enc-0db: MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" USE_LTV: 0 -.check-regressions-short-dec-0db: +check-regressions-short-dec-0db: extends: - .check-regressions-pytest-job needs: @@ -1224,7 +1224,7 @@ check-regressions-short-enc-0db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -.check-regressions-short-dec-+10db: +check-regressions-short-dec-+10db: extends: - .check-regressions-pytest-job needs: @@ -1239,7 +1239,7 @@ check-regressions-short-enc-0db: MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" USE_LTV: 0 -.check-regressions-short-dec--10db: +check-regressions-short-dec--10db: extends: - .check-regressions-pytest-job needs: -- GitLab From 75218036a414ee22a8f8b008029938a7e9787693 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 16:26:07 +0200 Subject: [PATCH 1287/1310] try to fix the DISABLE_HRTF_MODEL_TESTS mechanism --- .gitlab-ci.yml | 4 ++-- .gitlab-ci/variables.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 851b7b952..60b08a081 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1343,7 +1343,7 @@ ivas-pytest-on-merge-request: ### prepare pytest # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 $DISABLE_HRTF_MODEL_TESTS + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 "${DISABLE_HRTF_MODEL_TESTS}" ### Run test using branch scripts and input - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi @@ -1351,7 +1351,7 @@ ivas-pytest-on-merge-request: ### run pytest - exit_code=0 - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout $DISABLE_HRTF_MODEL_TESTS || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout "${DISABLE_HRTF_MODEL_TESTS}" || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 383efe9fb..924279500 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -16,7 +16,7 @@ variables: LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" TEST_SUITE: "" # DISABLE_HRTF_MODEL_TESTS: "" - DISABLE_HRTF_MODEL_TESTS: "-k not model" #enable this declaration to disable HRTF model from file tests + DISABLE_HRTF_MODEL_TESTS: "-k 'not model'" #enable this declaration to disable HRTF model from file tests # These path variables are used by the pytest calls. # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain DUT_ENCODER_PATH: "./IVAS_cod_dut" -- GitLab From bf116acdfd41b6923199de0d4f698b019d1cc41a Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 17:00:03 +0200 Subject: [PATCH 1288/1310] clean up pytest calls --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 60b08a081..e258e6d26 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -433,11 +433,11 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE -- GitLab From 3c2057c563b5ef1c1bf1533db6b0146a0d1af061 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 17:02:29 +0200 Subject: [PATCH 1289/1310] add --use-main-pc-set flag back --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e258e6d26..15b920676 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -269,7 +269,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - if [ $LEVEL_SCALING != "1.0" ]; then - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi @@ -414,7 +414,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - python3 scripts/prepare_combined_format_inputs.py - if [ $LEVEL_SCALING != "1.0" ];then @@ -550,7 +550,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - if [ $LEVEL_SCALING != "1.0" ];then - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi @@ -691,7 +691,7 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - python3 ci/remove_unsupported_testcases.py $PRM_FILES + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - set -euxo pipefail - make_args="CLANG=$CLANG_NUM" @@ -739,7 +739,7 @@ workflow: - testcase_timeout=$TESTCASE_TIMEOUT_STV - fi - - python3 ci/remove_unsupported_testcases.py $PRM_FILES + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - if [ $LEVEL_SCALING != "1.0" ];then - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - fi @@ -1325,7 +1325,7 @@ ivas-pytest-on-merge-request: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - *merge-request-comparison-setup-codec - - python3 ci/remove_unsupported_testcases.py $PRM_FILES + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set # some helper variables - "|| true" to prevent failures from grep not finding anything # write to temporary file as workaround for failures observed with piping echo @@ -2036,7 +2036,7 @@ check-be-between-renderer-framesizes: - echo "$SHORT_TEST_SUITE" - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - - python3 ci/remove_unsupported_testcases.py $PRM_FILES + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - exit_code=0 - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml || exit_code=$? -- GitLab From cfd2b82646338841fb0afde6265f2ff87cc73b45 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 17:04:34 +0200 Subject: [PATCH 1290/1310] add DISABLE_HRTF var to every pytest call --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 15b920676..aa70a77a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -433,11 +433,11 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE @@ -583,10 +583,10 @@ workflow: ### ----- run pytest for branch (dut) first ----- # create float reference outputs with corresponding branch - - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $MERGE_SOURCE_FLOAT_REF_ENCODER_PATH --ref_decoder_path $MERGE_SOURCE_FLOAT_REF_DECODER_PATH || exit_code=$? + - python3 -m pytest $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $MERGE_SOURCE_FLOAT_REF_ENCODER_PATH --ref_decoder_path $MERGE_SOURCE_FLOAT_REF_DECODER_PATH || exit_code=$? - *overwrite-pytest-cache-with-artifact # create dut outputs - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true + - python3 -m pytest --tb=no -q $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - zero_errors_branch=$(cat $XML_REPORT_BRANCH | grep -c 'errors="0"') || true - python3 scripts/parse_xml_report.py $XML_REPORT_BRANCH $CSV_BRANCH # Store branch outputs for later comparison @@ -598,10 +598,10 @@ workflow: ### ----- run pytest for merge target now ----- # create float reference outputs with corresponding branch - - python3 -m pytest $TEST_SUITE -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH || exit_code=$? + - python3 -m pytest $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH || exit_code=$? - *overwrite-pytest-cache-with-artifact # create merge-target outputs - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --dut_encoder_path $MERGE_TARGET_ENCODER_PATH --dut_decoder_path $MERGE_TARGET_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true + - python3 -m pytest --tb=no -q $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --dut_encoder_path $MERGE_TARGET_ENCODER_PATH --dut_decoder_path $MERGE_TARGET_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - python3 scripts/parse_xml_report.py $XML_REPORT_MAIN $CSV_MAIN ### compare the two csv files for regressions -- GitLab From e69de1c63c3acc80eec38fd33393a69d168e048c Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 25 Jul 2025 17:53:07 +0200 Subject: [PATCH 1291/1310] DISABLE_HRTF... env var to explicit command gitlab CI variable expansion and qoutes do not match well... --- .gitlab-ci.yml | 16 ++++++++-------- .gitlab-ci/variables.yml | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa70a77a1..5f65b2aac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -433,11 +433,11 @@ workflow: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source - exit_code_target=0 - - python3 -m pytest $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? + - python3 -m pytest $TEST_SUITE -k "not model" -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - exit_code=0 - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? + - python3 -m pytest --tb=no -q $TEST_SUITE -k "not model" -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? - if [ $exit_code -ne 0 ]; then - exit_code=$EXIT_CODE_NON_BE @@ -583,10 +583,10 @@ workflow: ### ----- run pytest for branch (dut) first ----- # create float reference outputs with corresponding branch - - python3 -m pytest $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $MERGE_SOURCE_FLOAT_REF_ENCODER_PATH --ref_decoder_path $MERGE_SOURCE_FLOAT_REF_DECODER_PATH || exit_code=$? + - python3 -m pytest $TEST_SUITE -k "not model" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $MERGE_SOURCE_FLOAT_REF_ENCODER_PATH --ref_decoder_path $MERGE_SOURCE_FLOAT_REF_DECODER_PATH || exit_code=$? - *overwrite-pytest-cache-with-artifact # create dut outputs - - python3 -m pytest --tb=no -q $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true + - python3 -m pytest --tb=no -q $TEST_SUITE -k "not model" -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - zero_errors_branch=$(cat $XML_REPORT_BRANCH | grep -c 'errors="0"') || true - python3 scripts/parse_xml_report.py $XML_REPORT_BRANCH $CSV_BRANCH # Store branch outputs for later comparison @@ -598,10 +598,10 @@ workflow: ### ----- run pytest for merge target now ----- # create float reference outputs with corresponding branch - - python3 -m pytest $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH || exit_code=$? + - python3 -m pytest $TEST_SUITE -k "not model" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH || exit_code=$? - *overwrite-pytest-cache-with-artifact # create merge-target outputs - - python3 -m pytest --tb=no -q $TEST_SUITE "${DISABLE_HRTF_MODEL_TESTS}" -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --dut_encoder_path $MERGE_TARGET_ENCODER_PATH --dut_decoder_path $MERGE_TARGET_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true + - python3 -m pytest --tb=no -q $TEST_SUITE -k "not model" -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --dut_encoder_path $MERGE_TARGET_ENCODER_PATH --dut_decoder_path $MERGE_TARGET_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - python3 scripts/parse_xml_report.py $XML_REPORT_MAIN $CSV_MAIN ### compare the two csv files for regressions @@ -1343,7 +1343,7 @@ ivas-pytest-on-merge-request: ### prepare pytest # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 "${DISABLE_HRTF_MODEL_TESTS}" + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -k "not model" ### Run test using branch scripts and input - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi @@ -1351,7 +1351,7 @@ ivas-pytest-on-merge-request: ### run pytest - exit_code=0 - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout "${DISABLE_HRTF_MODEL_TESTS}" || exit_code=$? + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout -k "not model" || exit_code=$? - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - *merge-request-comparison-check diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index 924279500..ddbfe614a 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -15,8 +15,6 @@ variables: SHORT_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_basop_encoder.prm" LONG_TEST_SUITE_ENCODER: "tests/codec_be_on_mr_nonselection/test_param_file.py --param_file scripts/config/self_test_ltv_basop_encoder.prm" TEST_SUITE: "" - # DISABLE_HRTF_MODEL_TESTS: "" - DISABLE_HRTF_MODEL_TESTS: "-k 'not model'" #enable this declaration to disable HRTF model from file tests # These path variables are used by the pytest calls. # They can be overwritten in the job templates to e.g. only test encoder or decoder in the chain DUT_ENCODER_PATH: "./IVAS_cod_dut" -- GitLab From 7000566d40d9ed19334741c06bec6ada0211bce2 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 28 Jul 2025 11:57:41 +0200 Subject: [PATCH 1292/1310] harmonize CI config with ivas-float-update --- .gitlab-ci.yml | 480 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 396 insertions(+), 84 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5f65b2aac..dc2ff117f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -128,6 +128,44 @@ workflow: when: never - when: never +.rules-merge-request-no-draft: + extends: .rules-basis + rules: + - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ + when: never + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + - if: $CI_PIPELINE_SOURCE == 'push' + when: never + - when: never + +.rules-merge-request-to-main: + rules: + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" + - if: $CI_PIPELINE_SOURCE == 'push' + when: never + +.rules-merge-request-to-float-ref: + rules: + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "ivas-float-update" + - if: $CI_PIPELINE_SOURCE == 'push' + when: never + +.rules-merge-request-to-main-no-draft: + rules: + - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ + when: never + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" + - if: $CI_PIPELINE_SOURCE == 'push' + when: never + +.rules-merge-request-to-float-ref-no-draft: + rules: + - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ + when: never + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "ivas-float-update" + - if: $CI_PIPELINE_SOURCE == 'push' + when: never + .rules-pytest-to-ref-short: rules: - if: $PYTEST_MLD_SHORT # Set by scheduled pipeline @@ -152,12 +190,6 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'schedule' when: never -.rules-pytest-to-main-short: - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - .rules-pytest-long: rules: - if: $PYTEST_MLD_LONG # Set by scheduled pipeline @@ -194,15 +226,6 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' when: never -.rules-merge-request-no-draft: - extends: .rules-basis - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - # --------------------------------------------------------------- # Job templates # --------------------------------------------------------------- @@ -369,19 +392,10 @@ workflow: junit: - report-junit.xml -.check-up-to-date-in-comparison-jobs: &check-up-to-date-in-comparison-jobs - - | - commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" - if [ $commits_behind_count -ne 0 ]; then - set +x - echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run. Checking bitexactness or testing for regressions now can result in meaningless results. Run\n\t git pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." - exit 1 - fi - .check-be-job: extends: - .test-job-linux - - .rules-pytest-to-main-short + - .rules-merge-request-to-main-no-draft - .test-job-linux-compares-to-fixed-target before_script: - !reference [ .test-job-linux, before_script ] @@ -868,7 +882,7 @@ branch-is-up-to-date-with-target-pre: branch-is-up-to-date-with-target-post: extends: - .job-linux - - .rules-merge-request + - .rules-merge-request-no-draft stage: postvalidate tags: - ivas-basop-linux @@ -886,12 +900,7 @@ branch-is-up-to-date-with-target-post: clang-format-check: extends: - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' - when: never + - .rules-merge-request variables: ARTIFACT_BASE_NAME: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--formatting-fix" stage: prevalidate @@ -935,33 +944,6 @@ clang-format-check: name: "$ARTIFACT_BASE_NAME" expose_as: "formatting patch" -# from float -# needs fix to be merged from floating point repo before it can be activated -.check-bitexactness-hrtf-rom-and-file: - extends: - - .test-job-linux - - .rules-merge-request-to-main - stage: test - needs: ["build-codec-linux-make"] - timeout: "5 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - - make clean - - make -j - - python3 tests/create_short_testvectors.py --cut_len 1.0 - # TODO: run full test again once the custom binary files are supported - - python3 -m pytest -k "not diff_from_rom and not test_binary_file" tests/hrtf_binary_loading --html=report.html --junit-xml=report-junit.xml --self-contained-html - artifacts: - paths: - - report.html - - report-junit.xml - when: always - name: "$CI_JOB_NAME--$CI_MERGE_REQUEST_ID--sha-$CI_COMMIT_SHA--hrtf-loading" - expose_as: "logs-hrtf-loading" - expire_in: "5 days" - # --------------------------------------------------------------- # Build jobs # --------------------------------------------------------------- @@ -988,6 +970,8 @@ build-codec-linux-make: build-codec-linux-cmake: rules: + - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ + when: never - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' @@ -1008,6 +992,8 @@ build-codec-linux-cmake: # ensure that codec builds on linux with instrumentation active build-codec-linux-instrumented-make: rules: + - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ + when: never - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' @@ -1028,6 +1014,8 @@ build-codec-linux-instrumented-make: # make sure that the codec builds with msan, asan and usan build-codec-sanitizers-linux: rules: + - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ + when: never - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' @@ -1048,6 +1036,8 @@ build-codec-sanitizers-linux: build-codec-linux-debugging-make: rules: + - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ + when: never - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES when: never - if: $CI_PIPELINE_SOURCE == 'web' @@ -1259,7 +1249,7 @@ renderer-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main + - .rules-merge-request-no-draft # TODO: set reasonable timeout, will most likely take less timeout: "20 minutes" tags: @@ -1316,7 +1306,7 @@ ivas-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main + - .rules-merge-request-no-draft stage: compare timeout: "40 minutes" tags: @@ -1376,7 +1366,7 @@ ivas-pytest-on-merge-request: extends: - .test-job-linux-needs-testv-dir - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-to-main + - .rules-merge-request-no-draft timeout: "60 minutes" stage: compare script: @@ -1436,21 +1426,22 @@ ivas-pytest-on-merge-request: - report-junit.xml # test that runs all modes with 1s input signals -# TODO: disabled temporarily, needs to be adapted to BASOP -.codec-smoke-test: +codec-smoke-test: extends: - .test-job-linux-needs-testv-dir - - .rules-merge-request-no-draft + - .rules-merge-request-to-float-ref-no-draft timeout: "20 minutes" - tags: - - ivas-linux stage: test - needs: ["build-codec-linux-make"] #, "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] + needs: ["build-codec-linux-make"] script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh # LTV update needed as ltv ISM metadata files are used + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash ci/smoke_test.sh + - python3 scripts/smoketest-basop-filter.py scripts/config/ivas_modes.json --inline + - bash ci/smoke_test.sh || true + - tar cJf logs.tar.xz out/logs/ + - ls -al logs.tar.* ### analyze for failures - if ! [ -s smoke_test_output.txt ] || ! [ -s smoke_test_output_jbm.txt ] || ! [ -s smoke_test_output_hrtf.txt ]; then echo "Error in smoke test"; exit 1; fi - ret_val=0 @@ -1466,13 +1457,110 @@ ivas-pytest-on-merge-request: - smoke_test_output.txt - smoke_test_output_jbm.txt - smoke_test_output_hrtf.txt + - logs.tar.xz expose_as: "Smoke test results" +# from float +# check for crashes if first received frame on decoder side is an SID +check-first-frame-is-sid: + extends: + - .test-job-linux-needs-testv-dir + - .rules-merge-request-to-float-ref-no-draft + stage: test + needs: ["build-codec-linux-make"] + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh + # this rm makes check-for-testvectors only check for the signals we actually need in this test + - rm scripts/config/ci_linux_ltv.json scripts/config/ci_linux.json + - python3 -m pytest ci/test_vectors_available.py + - bash ci/run-first-frame-is-sid-test.sh + +# from float +# needs fix to be merged from floating point repo before it can be activated +.check-bitexactness-hrtf-rom-and-file: + extends: + - .test-job-linux + - .rules-merge-request-no-draft + stage: test + needs: ["build-codec-linux-make"] + timeout: "5 minutes" + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + + - make clean + - make -j + - python3 tests/create_short_testvectors.py --cut_len 1.0 + # TODO: run full test again once the custom binary files are supported + - python3 -m pytest -k "not diff_from_rom and not test_binary_file" tests/hrtf_binary_loading --html=report.html --junit-xml=report-junit.xml --self-contained-html + artifacts: + paths: + - report.html + - report-junit.xml + when: always + name: "$CI_JOB_NAME--$CI_MERGE_REQUEST_ID--sha-$CI_COMMIT_SHA--hrtf-loading" + expose_as: "logs-hrtf-loading" + expire_in: "5 days" + + +### From Float +# Check interop IVAS_cod_test -> IVAS_dec_ref +ivas-interop-on-merge-request: + extends: + - .test-job-linux-needs-testv-dir + - .rules-merge-request-to-float-ref-no-draft + - .test-job-linux-compares-to-fixed-target + stage: test + timeout: "10 minutes" + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/float/check-commits-behind-count-in-compare-jobs.sh + - *merge-request-comparison-setup-codec + + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + + # some helper variables - "|| true" to prevent failures from grep not finding anything + # write to temporary file as workaround for failures observed with piping echo + - echo $CI_MERGE_REQUEST_TITLE > tmp.txt + - non_interop_flag=$(grep -c --ignore-case "\[non[ -]*io\]" tmp.txt) || true + + ### prepare pytest + + # Run reference creation, using source branch encoder and main decoder (see .merge-request-comparison-setup-codec) + - exit_code=0 + - exit_code2=0 + # set timeout for individual testcase runs to 60 seconds + - testcase_timeout=60 + - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --update_ref 1 --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec_ref --testcase_timeout=$testcase_timeout || exit_code=$? + - zero_failures=$(cat report-junit.xml | grep -c 'failures="0"') || true + + - if [ $zero_failures != 1 ] && [ $non_interop_flag == 0 ]; then echo "Non-interop cases without non-interop flag encountered!"; exit $EXIT_CODE_FAIL; fi + - if [ $zero_failures != 1 ] && [ $non_interop_flag == 1 ]; then echo "Non-interop cases with non-interop flag encountered"; exit $EXIT_CODE_NON_BE; fi + - exit 0 + + allow_failure: + exit_codes: + - 123 + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + - report.html + expose_as: "interop test results" + reports: + junit: + - report-junit.xml + ### split rendering tests split-rendering-smoke-test: extends: - .test-job-linux - - .rules-merge-request-to-main + - .rules-merge-request-no-draft needs: ["build-codec-linux-make"] stage: test script: @@ -1496,7 +1584,7 @@ split-rendering-smoke-test: lc3-wrapper-unit-test: extends: - .test-job-linux - - .rules-merge-request-to-main + - .rules-merge-request-no-draft needs: ["build-codec-linux-make"] stage: test script: @@ -1505,7 +1593,222 @@ lc3-wrapper-unit-test: - cmake -B cmake-build -G "Unix Makefiles" -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - cmake --build cmake-build -- -j - - scripts/split_rendering/lc3plus_basop/ivas_lc3plus_unit_test + + - echo "Assuming here that you either merge to main or to $FLOAT_REF_BRANCH." + - echo "If you have some other merge target, this might fail and manual fiddling is needed." + - if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" == "$FLOAT_REF_BRANCH" ]; then + - scripts/split_rendering/lc3plus_float/ivas_lc3plus_unit_test + - else + - scripts/split_rendering/lc3plus_basop/ivas_lc3plus_unit_test + - fi + +# from float +# test renderer executable +renderer-smoke-test: + extends: + - .test-job-linux + - .rules-merge-request-to-float-ref-no-draft + needs: ["build-codec-linux-make"] + stage: test + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - make -j IVAS_rend + - testcase_timeout=60 + - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + expose_as: "renderer make pytest results" + reports: + junit: + - report-junit.xml + +# from float +# test renderer executable with cmake + asan +renderer-asan: + extends: + - .test-job-linux + - .rules-merge-request-to-float-ref-no-draft + needs: ["build-codec-linux-make"] + stage: test + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - cmake -B cmake-build -G "Unix Makefiles" -DCLANG=asan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true + - cmake --build cmake-build -- -j + - testcase_timeout=180 + - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout + + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + expose_as: "renderer asan pytest results" + reports: + junit: + - report-junit.xml + +# from float +# test renderer executable with cmake + msan +renderer-msan: + extends: + - .test-job-linux + - .rules-merge-request-to-float-ref-no-draft + needs: ["build-codec-linux-make"] + stage: test + tags: + - ivas-linux + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - cmake -B cmake-build -G "Unix Makefiles" -DCLANG=asan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true + - cmake --build cmake-build -- -j + - testcase_timeout=180 + - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout + + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + expose_as: "renderer msan pytest results" + reports: + junit: + - report-junit.xml + +# from float +# test renderer executable with cmake + usan +renderer-usan: + extends: + - .test-job-linux + - .rules-merge-request-to-float-ref-no-draft + needs: ["build-codec-linux-make"] + stage: test + tags: + - ivas-linux + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - cmake -B cmake-build -G "Unix Makefiles" -DCLANG=asan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true + - cmake --build cmake-build -- -j + - testcase_timeout=180 + - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1,log_path=usan_log_catchall python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout + - grep_exit_code=0 + - touch usan_log_empty # Creates an empty file, this is to avoid "grep: usan_log_*: No such file or directory" in case no USAN failures are reported from pytest + - grep UndefinedBehaviorSanitizer usan_log_* || grep_exit_code=$? + - if [ $grep_exit_code != 1 ] ; then echo "Run errors in test_renderer.py with Clang undefined-behavior-sanitizer"; exit 1; fi + + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" + expire_in: 1 week + when: always + paths: + - report-junit.xml + expose_as: "renderer usan pytest results" + reports: + junit: + - report-junit.xml + +.sanitizer-selftest-on-mr: + stage: test + extends: + - .rules-merge-request-to-float-ref-no-draft + artifacts: + name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" + expire_in: 1 week + when: always + paths: + - report-junit-20ms.xml + - report-junit-10ms.xml + - report-junit-5ms.xml + - report-20ms.html + - report-10ms.html + - report-5ms.html + expose_as: "Sanitizer selftest results" + reports: + junit: + - report-junit-20ms.xml + - report-junit-10ms.xml + - report-junit-5ms.xml + +# From float repo +# to be reused in MR and LTV-scheduled sanitizer test jobs +# set CLANG_NUM, SELFTEST_SANITY_TIMEOUT and SELF_TEST_PRM_FILE in before_script section +.sanitizer-selftest-anchor: &sanitizer-selftest-anchor + script: + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh + - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh + - make clean + - make -j CLANG=$CLANG_NUM + - testcase_timeout=$SELFTEST_SANITY_TIMEOUT + - export UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 + + - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set + + - exit_code20=0 + - exit_code10=0 + - exit_code5=0 + + - if [ $CLANG_NUM -eq 1 ]; then sanitizer_type="MemorySanitizer"; elif [ $CLANG_NUM -eq 2 ]; then sanitizer_type="AddressSanitizer"; elif [ $CLANG_NUM -eq 3 ]; then sanitizer_type="UndefinedBehaviorSanitizer"; else echo "Wrong CLANG_NUM $CLANG_NUM given!"; exit 1; fi + + # run encoder and decoder with 20ms renderer framesize first, use reference creation mode + - python3 -m pytest tests/codec_be_on_mr_nonselection $USE_LTV --param_file $SELF_TEST_PRM_FILE -v --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code20=$? + # for 10ms and 5ms renderer framesize, we only need to run the decoder part as renderer framesize is a decoder-only option + # set tolerance very high do ignore any BE differences due to the different renderer framesizes, those can appear due to the limiter being active + # we are only interested in runtime errors from the sanitizers and ignore the diffs + - python3 -m pytest tests/codec_be_on_mr_nonselection $USE_LTV --param_file $SELF_TEST_PRM_FILE -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only --abs_tol 100000 || exit_code5=$? + - python3 -m pytest tests/codec_be_on_mr_nonselection $USE_LTV --param_file $SELF_TEST_PRM_FILE -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only --abs_tol 100000 || exit_code10=$? + + - if [ $exit_code20 -ne 0 ] || [ $exit_code10 -ne 0 ] || [ $exit_code5 -ne 0 ]; then exit 1; fi + +# from float repo +# NOTE: (per-testcase) timeout was adjusted to work for float only +# code selftest testvectors with memory-sanitizer binaries +.codec-msan: + extends: + - .sanitizer-selftest-on-mr + tags: + - ivas-linux + before_script: + - CLANG_NUM=1 + - SELFTEST_SANITY_TIMEOUT=180 + - SELF_TEST_PRM_FILE="scripts/config/self_test.prm" + - USE_LTV="" + <<: *sanitizer-selftest-anchor + +# code selftest testvectors with address-sanitizer binaries +.codec-asan: + extends: + - .sanitizer-selftest-on-mr + tags: + - ivas-linux + before_script: + - CLANG_NUM=2 + - SELFTEST_SANITY_TIMEOUT=180 + - SELF_TEST_PRM_FILE="scripts/config/self_test.prm" + - USE_LTV="" + <<: *sanitizer-selftest-anchor + +# code selftest testvectors with undefined-behaviour-sanitizer binaries +.codec-usan: + extends: + - .sanitizer-selftest-on-mr + tags: + - ivas-linux + before_script: + - CLANG_NUM=3 + - SELFTEST_SANITY_TIMEOUT=180 + - SELF_TEST_PRM_FILE="scripts/config/self_test.prm" + - USE_LTV="" + <<: *sanitizer-selftest-anchor # --------------------------------------------------------------- # Short test jobs for running from web interface or schedule @@ -2010,21 +2313,26 @@ voip-be-on-merge-request: extends: - .test-job-linux-needs-testv-dir rules: - # - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "voip-be-test" + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "ivas-float-update" + # - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main stage: test needs: ["build-codec-linux-make"] timeout: "10 minutes" script: - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - make clean - - make -j >> /dev/null + - make -j > build_log.txt - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py + artifacts: + when: always + expire_in: "5 days" + paths: + - build_log.txt check-be-between-renderer-framesizes: extends: - .test-job-linux - # - .rules-pytest-to-main-short rules: - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "renderer-framesize-be" stage: test @@ -2196,8 +2504,8 @@ backup-long-term-job-logs: # Complexity measurement jobs # --------------------------------------------------------------- -.complexity-measurements-setup: - &complexity-measurements-setup # create necessary environment +# create necessary environment +.complexity-measurements-setup: &complexity-measurements-setup ### 1. part: mainly same as in float repo - this is boilerplate code to make the gitlab pages presentation work - mkdir -p wmops/logs @@ -2234,15 +2542,18 @@ backup-long-term-job-logs: - rm -rf $public_dir ### 1.5.part: get the corresponding measurement from ivas-float-update - - job_id=$(python3 ci/get_id_of_last_job_occurence.py ivas-float-update $CI_JOB_NAME $CI_PROJECT_ID) - - echo $job_id - - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip - - unzip -qq -j artifacts_ref.zip "*latest_WMOPS.csv" || true + # only do this on main and not for the complexity meaurements run on ivas-float-update + - if [ "$CI_COMMIT_REF_NAME" == "main" ]; then + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $FLOAT_REF_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) + - echo $job_id + - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip + - unzip -qq -j artifacts_ref.zip "*latest_WMOPS.csv" || true # add file to arguments only if the artifact could be retrieved to prevent error later. - - if [ -f latest_WMOPS.csv ]; then GET_WMOPS_ARGS="$GET_WMOPS_ARGS latest_WMOPS.csv"; fi + - if [ -f latest_WMOPS.csv ]; then GET_WMOPS_ARGS="$GET_WMOPS_ARGS latest_WMOPS.csv"; fi + - fi -.complexity-measurements-prepare-artifacts: - &complexity-measurements-prepare-artifacts # prepare artifacts -> move to public directory +# prepare artifacts -> move to public directory +.complexity-measurements-prepare-artifacts: &complexity-measurements-prepare-artifacts - public_dir="$CI_JOB_NAME-public" - mkdir $public_dir - mv -f wmops/log_*_all*.txt ./*.js ${public_dir}/ @@ -2251,6 +2562,7 @@ backup-long-term-job-logs: # first move logs - log_files=$(cat $public_dir/graphs*.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - for f in $log_files; do [ -f wmops/logs/$f ] && mv wmops/logs/$f $public_dir/logs/$f; done + - if [ "$CI_COMMIT_REF_NAME" == "$FLOAT_REF_BRANCH" ]; then mv wmops/logs/latest_WMOPS.csv $public_dir/logs/; fi # copy index page blueprint - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html # patch the format in the title -- GitLab From a4b69e585c5ce378e711df8b7453ebe2039fac73 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Mon, 28 Jul 2025 14:31:03 +0200 Subject: [PATCH 1293/1310] use unified CI config from ci repo --- .gitlab-ci.yml | 2976 +----------------------------------------------- 1 file changed, 2 insertions(+), 2974 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dc2ff117f..ba4f1fe3d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,2983 +1,11 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF kiene/basop-ci-merge + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF kiene/basop-ci-merge-test-unified-config include: - local: .gitlab-ci/variables.yml - local: .gitlab-ci/rules-basis.yml - project: ivas-codec-pc/ivas-codec-ci ref: *IVAS_CODEC_CI_REF - file: main.yml - -default: - interruptible: true # Make all jobs by default interruptible - -workflow: - name: '$IVAS_PIPELINE_NAME' - rules: - # see https://docs.gitlab.com/ee/ci/yaml/workflow.html#switch-between-branch-pipelines-and-merge-request-pipelines - - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push" - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - variables: - IVAS_PIPELINE_NAME: 'MR pipeline: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME' - ### disabled for now because pipeline cd is redundant with MR pipeline with current workflow - # - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main - # variables: - # IVAS_PIPELINE_NAME: 'Push pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'default' # for testing - variables: - IVAS_PIPELINE_NAME: 'Web run pipeline: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'long-term-logs' - variables: - IVAS_PIPELINE_NAME: 'Aggregate long term logs: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' - variables: - IVAS_PIPELINE_NAME: 'Backup long term logs: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare' - variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against float ref: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-enc-dmx' - variables: - IVAS_PIPELINE_NAME: 'Run encoder dmx comparison against float ref: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long' - variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against float ref (long test vectors): $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-long-fx-fx' - variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against float ref FX-FX (long test vectors): $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-compare-to-input' - variables: - IVAS_PIPELINE_NAME: 'Run comparison tools against input (pass-through only): $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-saturation-smoke-test' - variables: - IVAS_PIPELINE_NAME: 'Run saturation smoke-test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'evs-26444' - variables: - IVAS_PIPELINE_NAME: 'EVS 26.444 test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'sanitizer' - variables: - IVAS_PIPELINE_NAME: 'Short testvectors sanitizers' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'pytest-renderer' - variables: - IVAS_PIPELINE_NAME: 'Renderer test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'complexity' - variables: - IVAS_PIPELINE_NAME: 'Complexity Measurement on $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'voip-be-test' - variables: - IVAS_PIPELINE_NAME: 'Voip BE test on $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'renderer-framesize-be' - variables: - IVAS_PIPELINE_NAME: 'Renderer framesize BE test on $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == 'peaq-enc-passthrough' - variables: - IVAS_PIPELINE_NAME: 'PEAQ encoder pass-through test: $CI_COMMIT_BRANCH' - - if: $CI_PIPELINE_SOURCE == 'schedule' # Scheduled in any branch - variables: - IVAS_PIPELINE_NAME: 'Scheduled pipeline: $CI_COMMIT_BRANCH' - -# --------------------------------------------------------------- -# Generic script anchors -# --------------------------------------------------------------- - -# These can be used later on to do common tasks - -# Prints useful information for every job and should be used at the beginning of each job -.print-common-info-windows: &print-common-info-windows - - | - echo "Printing common information for build job." - echo "Current job is run on commit $CI_COMMIT_SHA" - echo "Commit time was $CI_COMMIT_TIMESTAMP" - ("echo 'System time is'", "Get-Date -Format 'dddd dd/MM/yyyy HH:mm K'") | Invoke-Expression - -.activate-Werror-linux: &activate-Werror-linux - - sed -i.bak "s/^# \(CFLAGS += -Werror\)/\1/" Makefile - - sed -i.bak "s/# \(set(CMAKE_C_FLAGS \"\${CMAKE_C_FLAGS} -Werror\")\)/\1/" CMakeLists.txt - -.activate-WX-windows: &activate-WX-windows - - (Get-Content -Path "CMakeLists.txt") -replace '# \(add_compile_options\("\/WX"\)\)', '$1' | Set-Content -Path "CMakeLists.txt" - - Get-ChildItem -Path "Workspace_msvc" -Filter "*.vcxproj" | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'false', 'true' | Set-Content -Path $_.FullName } - -# From float CI -.merge-request-comparison-setup-codec: &merge-request-comparison-setup-codec - - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh - - # need to rename to match the conventions for the renderer tests... - - mv $MERGE_TARGET_ENCODER_PATH $REF_ENCODER_PATH - - mv $MERGE_TARGET_DECODER_PATH $REF_DECODER_PATH - - mv $MERGE_TARGET_RENDERER_PATH $REF_RENDERER_PATH - # NOTE: temporary solution for merge to main - - if [ -f $MERGE_TARGET_POST_RENDERER_PATH ]; then mv $MERGE_TARGET_POST_RENDERER_PATH $REF_POST_RENDERER_PATH; fi - - - make clean - - make -j - -.merge-request-comparison-check: &merge-request-comparison-check - - echo "--------------- Running merge-request-comparison-check anchor ---------------" - - if [ $zero_errors != 1 ]; then echo "Run errors encountered!"; exit $EXIT_CODE_FAIL; fi - - if [ $exit_code -ne 0 ] && [ $non_be_flag == 0 ]; then echo "Non-bitexact cases without non-BE tag encountered!"; exit $EXIT_CODE_FAIL; fi - - if [ $exit_code -ne 0 ] && [ $non_be_flag != 0 ]; then echo "Non-bitexact cases with non-BE tag encountered"; exit $EXIT_CODE_NON_BE; fi - - exit 0 - -.rules-merge-request: - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - when: never - -.rules-merge-request-no-draft: - extends: .rules-basis - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - when: never - -.rules-merge-request-to-main: - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - -.rules-merge-request-to-float-ref: - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "ivas-float-update" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - -.rules-merge-request-to-main-no-draft: - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - -.rules-merge-request-to-float-ref-no-draft: - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "ivas-float-update" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - -.rules-pytest-to-ref-short: - rules: - - if: $PYTEST_MLD_SHORT # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare" - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - -.rules-pytest-to-input-short: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-to-input" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' - when: never - -.rules-pytest-to-ref-enc-short-dmx: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-enc-dmx" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' - when: never - -.rules-pytest-long: - rules: - - if: $PYTEST_MLD_LONG # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-long" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - -.rules-pytest-long-fx-fx: - rules: - - if: $PYTEST_MLD_LONG_FX_FX # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-compare-long-fx-fx" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - -.rules-coverage: - rules: - - if: $COVERAGE_TEST # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "coverage" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - -.rules-pytest-saturation-smoke-test: - rules: - - if: $PYTEST_SMOKE_TEST # Set by scheduled pipeline - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-saturation-smoke-test" - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - -# --------------------------------------------------------------- -# Job templates -# --------------------------------------------------------------- - -# override for centrally defined job to make use of the basop runners -.job-linux: - tags: - - ivas-basop-linux - -# custom variant of this template, we need to update the scripts repo before every build -.test-job-linux: - extends: - - .job-linux - before_script: - - !reference [.job-linux, before_script] - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - -.test-job-linux-compares-to-fixed-target: - extends: .test-job-linux - needs: - - job: branch-is-up-to-date-with-target-pre - artifacts: true - - job: build-codec-linux-make - -.print-results-banner: &print-results-banner - - set +x - - echo "" - - echo -e "==================================================================================================================\n================================================== TEST RESULTS ==================================================\n==================================================================================================================\n" - -# template for test jobs on linux that need the TESTV_DIR -.test-job-linux-needs-testv-dir: - extends: .test-job-linux - before_script: - - !reference [ .job-linux, before_script ] - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - if [ ! -d "$TESTV_DIR" ]; then mkdir -p $TESTV_DIR; fi - - cp -r scripts/testv/* $TESTV_DIR/ - -.ivas-pytest-anchor: &ivas-pytest-anchor - stage: test - needs: ["build-codec-linux-make"] - timeout: "360 minutes" - variables: - # keep "mld" in artifact name for backwards compatibility reasons - CSV_ARTIFACT_NAME: "mld--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" - CSV_ARTIFACT_SPLIT: "mld--split--$CI_JOB_NAME-$CI_JOB_ID--sha-$CI_COMMIT_SHORT_SHA.csv" - MERGED_CSV_ARTIFACT_NAME: "$CI_JOB_NAME--merged_csv--$CI_JOB_ID.csv" - PAGES_HTML_ARTIFACT_NAME: "$CI_JOB_NAME-index.html" - SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" - SUMMARY_HTML_ARTIFACT_SPLIT: "summary_split_$CI_JOB_NAME.html" - IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" - IMAGES_ARTIFACT_SPLIT: "images_split_$CI_JOB_NAME" - script: - - !reference [ .job-linux, before_script ] - - - set -euxo pipefail - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - if [ $USE_LTV -eq 1 ]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - if [ $LEVEL_SCALING != "1.0" ]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - - fi - - - if [ "$COMPARE_DMX" = "true" ] || [ "$ENCODER_TEST" = "true" ]; then - - BUILD_WITH_DEBUG_MODE_INFO="true" - - fi - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh - - - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" - - summary_args="MLD DIFF SSNR ODG" - - REPORT_ARG="" - - if [ "$ENCODER_TEST" = "true" ]; then comp_args="${comp_args} --enc_stats"; fi - - if [ "$DELTA_ODG" = "true" ]; then comp_args="${comp_args} --odg_bin"; MEASURES_FOR_REPORT="$MEASURES_FOR_REPORT DELTA_ODG"; fi - - if [ "$SPLIT_COMPARISON" = "true" ]; then comp_args="${comp_args} --split-comparison"; fi - - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-and-create-float-ref-outputs.sh - - # DMX comparison only in manual job with no other metrics - - if [ "$COMPARE_DMX" = "true" ]; then - - comp_args="--compare_enc_dmx" - - fi - - - echo "$comp_args" - - ### run pytest - - exit_code=0 - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report.html --self-contained-html --junit-xml=report-junit.xml $comp_args -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - - ### create histograms - - if [ "$SPLIT_COMPARISON" = "true" ]; then - - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME --split-csv-file $CSV_ARTIFACT_SPLIT - - else - - python3 scripts/parse_xml_report.py report-junit.xml $CSV_ARTIFACT_NAME - - fi - - # first for "whole" files comparison - - python3 scripts/create_histograms.py $CSV_ARTIFACT_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - - - if [ "$SPLIT_COMPARISON" = "true" ]; then - - python3 scripts/create_histograms.py $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT --measures $MEASURES_FOR_REPORT --write-out-histograms - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_SPLIT $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_SPLIT --measures $MEASURES_FOR_REPORT - - else - # touch files to suppress warning for missing artifacts - - touch $CSV_ARTIFACT_SPLIT $IMAGES_ARTIFACT_SPLIT - - fi - - - if [ $USE_LTV -eq 1 ] && [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) - - echo "Job ID from variables - $CI_JOB_ID, Job ID from script - $id_previous" - - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d previous_artifacts - # This wildcard thingy relies on only one csv file being present per job - - file_previous="previous_artifacts/mld--$CI_JOB_NAME-$id_previous--sha-*.csv" - - python3 ci/basop-pages/create_report_pages.py $PAGES_HTML_ARTIFACT_NAME $MERGED_CSV_ARTIFACT_NAME $CSV_ARTIFACT_NAME $file_previous $CI_JOB_ID $id_previous $CI_JOB_NAME - - else - # create empty file for artifacts to avoid errors - - touch $PAGES_HTML_ARTIFACT_NAME - - touch $MERGED_CSV_ARTIFACT_NAME - - fi - - - if [ $zero_errors != 1 ]; then - - echo "Run errors encountered!" - # TODO: temporary only to not fail MR pipelines on crashes - - if [ $CI_PIPELINE_SOURCE == 'merge_request_event' ]; then - - exit $EXIT_CODE_NON_BE - - else - - exit $EXIT_CODE_FAIL - - fi - - fi - - if [ $exit_code -eq 1 ]; then echo "Differences encountered"; exit $EXIT_CODE_NON_BE; fi - - exit 0 - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - - $PAGES_HTML_ARTIFACT_NAME - - $CSV_ARTIFACT_NAME - - $CSV_ARTIFACT_SPLIT - - $MERGED_CSV_ARTIFACT_NAME - - $SUMMARY_HTML_ARTIFACT_NAME - - $SUMMARY_HTML_ARTIFACT_SPLIT - - $IMAGES_ARTIFACT_NAME - - $IMAGES_ARTIFACT_SPLIT - expose_as: "pytest compare results" - reports: - junit: - - report-junit.xml - -.check-be-job: - extends: - - .test-job-linux - - .rules-merge-request-to-main-no-draft - - .test-job-linux-compares-to-fixed-target - before_script: - - !reference [ .test-job-linux, before_script ] - - rm -rf tests/dut tests/ref - variables: - USE_LTV: 0 - -.check-be-to-target-job: - extends: - - .check-be-job - stage: check-be - timeout: "300 minutes" - variables: - XML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" - HTML_REPORT: "report--$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" - PYTEST_LOG_TARGET_BRANCH: "pytest-log-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME.txt" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - - set -euxo pipefail - - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - python3 tests/create_short_testvectors.py - - - if [ $USE_LTV -eq 1 ]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - python3 scripts/prepare_combined_format_inputs.py - - - if [ $LEVEL_SCALING != "1.0" ];then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - - fi - - # set branches for reference builds - - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh - - echo "$FLOAT_REF_BRANCH - $FLOAT_REF_BRANCH_MERGE_SOURCE - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" - # build merge target branch and correpsonding float reference - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-merge-target-binaries.sh - - echo "$FLOAT_REF_BRANCH - $FLOAT_REF_BRANCH_MERGE_SOURCE - $CI_MERGE_REQUEST_TARGET_BRANCH_NAME - $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" - # build to-be-merged branch and corresponding float ref branch - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-source - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source - - - exit_code_target=0 - - python3 -m pytest $TEST_SUITE -k "not model" -v --update_ref 1 --create_ref -n auto --ref_encoder_path $MERGE_TARGET_ENCODER_PATH --ref_decoder_path $MERGE_TARGET_DECODER_PATH > $PYTEST_LOG_TARGET_BRANCH || exit_code_target=$? - - - exit_code=0 - - rm -rf .pytest_cache || true - - python3 -m pytest --tb=no -q $TEST_SUITE -k "not model" -v --keep_files --create_cut --html=$HTML_REPORT --self-contained-html --junit-xml=$XML_REPORT --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout > pytest_log.txt || exit_code=$? - - - if [ $exit_code -ne 0 ]; then - - exit_code=$EXIT_CODE_NON_BE - - zip -r $PYTEST_CACHE_ARTIFACT .pytest_cache - - - grep "^FAILED" pytest_log.txt | sed "s/^FAILED /'/" | sed "s/] - .*/]'/" | tr "\n" " " > $FAILED_TESTCASES_LIST || true - - grep "^FAILED" pytest_log.txt | sed "s/^FAILED //" | sed "s/] - .*/]/" > failed_testcases_for_printing.txt || true - - num_failures=$(wc -l < failed_testcases_for_printing.txt) - - - grep "^ERROR" pytest_log.txt | sed "s/^ERROR /'/" | sed "s/] - .*/]'/" | tr "\n" " " > $ERRORS_TESTCASES_LIST || true - - grep "^ERROR" pytest_log.txt | sed "s/^ERROR //" | sed "s/] - .*/]/" > errors_testcases_for_printing.txt || true - - num_errors=$(wc -l < errors_testcases_for_printing.txt) - - - *print-results-banner - - echo "Found these $num_failures non-bitexact testcases:" - - cat failed_testcases_for_printing.txt - - - echo "Reproduce locally with:" - - echo -e "1. Create references with target branch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:\n\t- git checkout $(cat $FLOAT_REF_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- mv IVAS_cod IVAS_cod_ref\n\t- mv IVAS_dec IVAS_dec_ref\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --update_ref 1 --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH" - - echo -e "2. Run test with source branch $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:\n\t- git checkout $(cat $CUT_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH" - - echo "The individual command lines can be found in the html report in the job artifacts." - - if [ $num_errors -ne 0 ]; then - - exit_code=1 - - echo "There were errors present in the following testcases:" - - cat errors_testcases_for_printing.txt - - fi - - - exit $exit_code - - else - # create empty files to not have errors at artifact stage - - touch $FAILED_TESTCASES_LIST - - touch $ERRORS_TESTCASES_LIST - - touch $PYTEST_CACHE_ARTIFACT - - *print-results-banner - - echo "All testcases are bitexact." - - fi - - exit $exit_code - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - $XML_REPORT - - $HTML_REPORT - - $FAILED_TESTCASES_LIST - - $ERRORS_TESTCASES_LIST - - pytest_log.txt - - $PYTEST_CACHE_ARTIFACT - - $FLOAT_REF_COMMIT_FILE - - $CUT_COMMIT_FILE - - $MERGE_TARGET_COMMIT_FILE - - $MERGE_SOURCE_FLOAT_REF_COMMIT_FILE - - $PYTEST_LOG_TARGET_BRANCH - expose_as: "pytest compare results" - reports: - junit: - - $XML_REPORT - - $XML_REPORT - -.overwrite-pytest-cache-with-artifact: &overwrite-pytest-cache-with-artifact - - if [ -f $PYTEST_CACHE_ARTIFACT ]; then - - rm -rf .pytest_cache || true - - unzip $PYTEST_CACHE_ARTIFACT - - fi - -.check-regressions-pytest-job: - extends: - - .check-be-job - stage: test - timeout: "300 minutes" - variables: - XML_REPORT_BRANCH: "report-junit-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" - XML_REPORT_MAIN: "report-junit-main-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.xml" - HTML_REPORT_BRANCH: "report-junit-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" - HTML_REPORT_MAIN: "report-junit-main-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.html" - CSV_BRANCH: "scores-branch-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.csv" - CSV_MAIN: "scores-main-$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA.csv" - IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" - SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - # create empty files for all artifacts to suppress warnings in case of no regressions found or all is BE - - touch $XML_REPORT_BRANCH $XML_REPORT_MAIN $HTML_REPORT_BRANCH $HTML_REPORT_MAIN $CSV_BRANCH $CSV_MAIN $SUMMARY_HTML_ARTIFACT_NAME $FLOAT_REF_COMMIT_FILE $CUT_COMMIT_FILE $MERGE_TARGET_COMMIT_FILE regressions_crashes.csv regressions_MLD.csv regressions_MAX_ABS_DIFF.csv regressions_MIN_SSNR.csv regressions_MIN_ODG.csv improvements_crashes.csv improvements_MLD.csv improvements_MAX_ABS_DIFF.csv improvements_MIN_SSNR.csv improvements_MIN_ODG.csv - - mkdir $IMAGES_ARTIFACT_NAME - - - set -euxo pipefail - - - if [ -s $FAILED_TESTCASES_LIST ]; then - - *overwrite-pytest-cache-with-artifact - - export PYTEST_ADDOPTS=--last-failed - - else - # turn off echoing back of commands for result printout - - *print-results-banner - - echo -e "All tested cases were bit-exact between $CI_MERGE_REQUEST_TARGET_BRANCH_NAME and $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME.\nNo need to check for regressions. All is fine." - - exit 0 - - fi - - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - - if [ $USE_LTV -eq 1 ]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - if [ $LEVEL_SCALING != "1.0" ];then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - - fi - - # check MR title for flag that allows regressions to be mergable - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - allow_regressions_flag=$(grep -c --ignore-case "\[allow[ -]*regression\]" tmp.txt) || true - - - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" - - # set branches for reference builds - - source "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/set-float-reference-branches.sh - # build merge target branch and correpsonding float reference - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-target - # build to-be-merged branch and corresponding float ref branch - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh merge-source - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref-merge-source - - # set pytest args for ref creation - - enc_stats_arg="" - - if [ "$ENCODER_TEST" = "true" ]; then - - enc_stats_arg="--enc_stats" - - fi - - enc_dmx_arg="" - - if [ "$COMPARE_DMX" = "true" ]; then - - enc_dmx_arg="--compare_enc_dmx" - - fi - - ### ----- run pytest for branch (dut) first ----- - # create float reference outputs with corresponding branch - - python3 -m pytest $TEST_SUITE -k "not model" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $MERGE_SOURCE_FLOAT_REF_ENCODER_PATH --ref_decoder_path $MERGE_SOURCE_FLOAT_REF_DECODER_PATH || exit_code=$? - - *overwrite-pytest-cache-with-artifact - # create dut outputs - - python3 -m pytest --tb=no -q $TEST_SUITE -k "not model" -v --keep_files --create_cut --html=$HTML_REPORT_BRANCH --self-contained-html --junit-xml=$XML_REPORT_BRANCH $comp_args --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - - zero_errors_branch=$(cat $XML_REPORT_BRANCH | grep -c 'errors="0"') || true - - python3 scripts/parse_xml_report.py $XML_REPORT_BRANCH $CSV_BRANCH - # Store branch outputs for later comparison - - mv tests/dut tests/dut_branch - # create the summary based on the branch only - - python3 scripts/create_histograms.py $CSV_BRANCH $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - - *overwrite-pytest-cache-with-artifact - - ### ----- run pytest for merge target now ----- - # create float reference outputs with corresponding branch - - python3 -m pytest $TEST_SUITE -k "not model" -v --update_ref 1 $enc_stats_arg $enc_dmx_arg --create_ref -n auto --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH || exit_code=$? - - *overwrite-pytest-cache-with-artifact - # create merge-target outputs - - python3 -m pytest --tb=no -q $TEST_SUITE -k "not model" -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --dut_encoder_path $MERGE_TARGET_ENCODER_PATH --dut_decoder_path $MERGE_TARGET_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - - python3 scripts/parse_xml_report.py $XML_REPORT_MAIN $CSV_MAIN - - ### compare the two csv files for regressions - - regressions_found=0 - - python3 scripts/basop_check_for_changes_in_testcases.py --show_improvements --xml_report $XML_REPORT_BRANCH $CSV_BRANCH $CSV_MAIN > regression_log.txt || regressions_found=$? - - - exit_code=0 - - *print-results-banner - - if [ $zero_errors_branch != 1 ]; then - - echo "Run errors encountered!" - - exit_code=$EXIT_CODE_FAIL - - echo "Reproduce locally with:" - - echo -e "1. Create references with target branch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:\n\t- git checkout $(cat $FLOAT_REF_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- mv IVAS_cod IVAS_cod_ref\n\t- mv IVAS_dec IVAS_dec_ref\n\t- python3 -m pytest $(cat $ERRORS_TESTCASES_LIST) --update_ref 1 --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH" - - echo -e "2. Run test with source branch $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:\n\t- git checkout $(cat $CUT_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- python3 -m pytest $(cat $ERRORS_TESTCASES_LIST) --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH" - - echo "The individual command lines can be found in the regressions_crashes.csv files in the job artifacts." - - elif [ $regressions_found != 0 ] && [ "$SKIP_REGRESSION_CHECK" != "true" ]; then - - cat regression_log.txt - - if [ $allow_regressions_flag == 0 ]; then - - echo "Detected regression wrt to $CI_MERGE_REQUEST_TARGET_BRANCH_NAME, [allow regression] not set!" - - exit_code=$EXIT_CODE_FAIL; - - else - - echo "Detected regression wrt to $CI_MERGE_REQUEST_TARGET_BRANCH_NAME, [allow regression] set." - - exit_code=$EXIT_CODE_NON_BE; - - fi - - echo "Reproduce locally with:" - - echo -e "1. Create references with target branch $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:\n\t- git checkout $(cat $FLOAT_REF_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- mv IVAS_cod IVAS_cod_ref\n\t- mv IVAS_dec IVAS_dec_ref\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --update_ref 1 --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH" - - echo -e "2. Run test with source branch $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:\n\t- git checkout $(cat $CUT_COMMIT_FILE)\n\t- make clean\n\t- make -j\n\t- python3 -m pytest $(cat $FAILED_TESTCASES_LIST) --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH" - - echo "The individual command lines can be found in the regressions_*.csv files in the job artifacts." - - fi - - - exit $exit_code - after_script: - - rm -rf tests/dut tests/ref - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - $XML_REPORT_BRANCH - - $XML_REPORT_MAIN - - $HTML_REPORT_BRANCH - - $HTML_REPORT_MAIN - - $CSV_BRANCH - - $CSV_MAIN - - $SUMMARY_HTML_ARTIFACT_NAME - - $IMAGES_ARTIFACT_NAME - - $FLOAT_REF_COMMIT_FILE - - $CUT_COMMIT_FILE - - $MERGE_TARGET_COMMIT_FILE - - $MERGE_SOURCE_FLOAT_REF_COMMIT_FILE - - regressions_crashes.csv - - regressions_MLD.csv - - regressions_MAX_ABS_DIFF.csv - - regressions_MIN_SSNR.csv - - regressions_MIN_ODG.csv - - improvements_crashes.csv - - improvements_MLD.csv - - improvements_MAX_ABS_DIFF.csv - - improvements_MIN_SSNR.csv - - improvements_MIN_ODG.csv - expose_as: "pytest compare results" - reports: - junit: - - $XML_REPORT_BRANCH - - $XML_REPORT_MAIN - - -.ivas-pytest-sanitizers-anchor: &ivas-pytest-sanitizers-anchor - extends: - - .job-linux - stage: test - needs: ["build-codec-linux-make"] - timeout: "600 minutes" - rules: - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' - when: never - - if: $CI_PIPELINE_SOURCE == 'schedule' && $IVAS_PYTEST_MSAN - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "sanitizer" - script: - - !reference [ .job-linux, before_script ] - - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - - set -euxo pipefail - - make_args="CLANG=$CLANG_NUM" - - if [[ $CLANG_NUM == 3 ]]; then - - export UBSAN_OPTIONS="suppressions=scripts/ubsan_basop.supp,report_error_type=1,print_stacktrace=1" - - python3 scripts/basop_create_ignorelist_for_ubsan.py - - make_args="$make_args IGNORELIST=1" - - fi - - make clean - - make -j $make_args >> /dev/null - - testcase_timeout_arg="--testcase_timeout $TESTCASE_TIMEOUT_LTV_SANITIZERS" - # disable per-testcase timeout for msan to evaluate what is going on that it takes so long - - if [[ $CLANG_NUM = 1 ]]; then - - testcase_timeout_arg="" - - fi - - python3 -m pytest $TEST_SUITE -v --tb=no --update_ref 1 --html=report.html --self-contained-html --junit-xml=report-junit.xml $testcase_timeout_arg --ref_encoder_path $DUT_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - when: always - expire_in: "2 weeks" - paths: - - report-junit.xml - - report.html - reports: - junit: - - report-junit.xml - -.ivas-pytest-compare-to-input-anchor: &ivas-pytest-compare-to-input-anchor - stage: test - needs: ["build-codec-linux-make"] - timeout: "360 minutes" - variables: - SUMMARY_HTML_ARTIFACT_NAME: "summary_$CI_JOB_NAME.html" - IMAGES_ARTIFACT_NAME: "images_$CI_JOB_NAME" - script: - - !reference [ .job-linux, before_script ] - - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - if [ $USE_LTV -eq 1 ]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - else - - testcase_timeout=$TESTCASE_TIMEOUT_STV - - fi - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - if [ $LEVEL_SCALING != "1.0" ];then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - - fi - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - - - INV_LEVEL_SCALING=$(awk "BEGIN {print 1.0 / $LEVEL_SCALING}") - - comp_args="--mld --ssnr --odg --scalefac $INV_LEVEL_SCALING" - - ### run pytest - - exit_code=0 - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report-ref.html --self-contained-html --junit-xml=report-junit-ref.xml $comp_args -n auto --testcase_timeout $testcase_timeout --dut_encoder_path $REF_ENCODER_PATH --dut_decoder_path $REF_DECODER_PATH --compare_to_input || exit_code=$? - - python3 -m pytest --tb=no $TEST_SUITE -v --create_cut --html=report-dut.html --self-contained-html --junit-xml=report-junit-dut.xml $comp_args -n auto --testcase_timeout $testcase_timeout --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH --compare_to_input || exit_code=$? - - zero_errors_ref=$(cat report-junit-ref.xml | grep -c 'errors="0"') || true - - zero_errors_dut=$(cat report-junit-dut.xml | grep -c 'errors="0"') || true - - python3 scripts/parse_xml_report.py report-junit-ref.xml report-ref.csv - - python3 scripts/parse_xml_report.py report-junit-dut.xml report-dut.csv - - python3 scripts/diff_report.py report-ref.csv report-dut.csv report-diff.csv - - # create summary - - mkdir $IMAGES_ARTIFACT_NAME - - python3 scripts/create_histograms.py report-diff.csv $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT --write-out-histograms --no-bins - - python3 ci/basop-pages/create_summary_page.py $SUMMARY_HTML_ARTIFACT_NAME $CI_JOB_ID $CI_JOB_NAME $IMAGES_ARTIFACT_NAME --measures $MEASURES_FOR_REPORT - - - exit 0 - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - report-junit-ref.xml - - report-ref.html - - report-ref.csv - - report-junit-dut.xml - - report-dut.html - - report-dut.csv - - report-diff.csv - - $IMAGES_ARTIFACT_NAME - - $SUMMARY_HTML_ARTIFACT_NAME - expose_as: "pytest compare to input results" - reports: - junit: - - report-junit-ref.xml - - report-junit-dut.xml - -# --------------------------------------------------------------- -# .pre jobs for setting up things -# --------------------------------------------------------------- - -# See: https://gitlab.com/gitlab-org/gitlab/-/issues/194023 -# Solution to make main branch pipelines uninterruptible while all other -# pipelines can be interrupted by default. This works because all jobs -# after uninterruptible jobs will be uninterruptible. Resource group -# setting avoids rare case where two fast merges could still interrupt -# pipeline. This should be revisited if there are updates to Gitlab. -uninterruptible: - stage: .pre - interruptible: false - resource_group: uninterruptible - script: - - echo "$CI_COMMIT_BRANCH is uninterruptible" - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - when: always - tags: - - ivas-basop-linux - -# --------------------------------------------------------------- -# verification jobs -# --------------------------------------------------------------- - -# fail pipeline in the final stage for pipelines on Draft MRs -# this also only runs on Draft MRs, so should always fail -fail-pipeline-if-in-draft: - rules: - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - stage: postvalidate - tags: - - ivas-linux - script: - - echo "Your MR is still in Draft state, set it to ready to be mergable, then retrigger the pipeline." - - exit 1 - -# this branch runs on merges to main-pc only and will fail if the branch itself does not conform to the naming conventions -check-naming-of-branch-for-basop-update-merges: - extends: - - .rules-merge-request-to-main - - .job-linux - stage: prevalidate - tags: - - ivas-linux - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then - - ci/get_float_ref_branch_name.sh $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME - - fi - -branch-is-up-to-date-with-target-pre: - extends: - - .job-linux - - .rules-merge-request - stage: prevalidate - needs: [] - tags: - - ivas-basop-linux - script: - - | - commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" - if [ $commits_behind_count -ne 0 ]; then - echo -e "Your branch is $commits_behind_count commits behind the target branch, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." - exit 1 - fi - - git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" - - TARGET_COMMIT="$(git rev-parse "origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME")" - - echo "TARGET_COMMIT is $TARGET_COMMIT" - - echo "$TARGET_COMMIT" > "$MERGE_TARGET_COMMIT_FILE" - artifacts: - paths: - - $MERGE_TARGET_COMMIT_FILE - -branch-is-up-to-date-with-target-post: - extends: - - .job-linux - - .rules-merge-request-no-draft - stage: postvalidate - tags: - - ivas-basop-linux - script: - - | - commits_behind_count="$(bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh)" - if [ $commits_behind_count -ne 0 ]; then - echo -e "Your branch is $commits_behind_count commits behind the target branch, possibly main changed during your pipeline run, run\n\tgit pull origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME\nto update." - exit 123 - fi - allow_failure: - exit_codes: - - 123 - -clang-format-check: - extends: - - .test-job-linux - - .rules-merge-request - variables: - ARTIFACT_BASE_NAME: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--formatting-fix" - stage: prevalidate - needs: [] - timeout: "10 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - # Set up variables. This can't be done in the "variables" section because variables are not expanded properly there - - PATCH_FILE_NAME="$ARTIFACT_BASE_NAME".patch - - > - INSTRUCTIONS_GITLAB="To fix formatting issues:\n - - download the diff patch available as artifact of this job\n - - unzip the artifact and place the patch file in the root directory of your local IVAS repo\n - - run: git apply $PATCH_FILE_NAME\n - - commit new changes" - - > - INSTRUCTIONS_README="To fix formatting issues:\n - - place the patch file in the root directory of your local IVAS repo\n - - run: git apply $PATCH_FILE_NAME\n - - commit new changes" - - - format_problems=0 - - scripts/check-format.sh -afD -p 8 || format_problems=$? - - if [ $format_problems == 0 ] ; then exit 0; fi - - - mkdir tmp-formatting-fix - - git diff > "tmp-formatting-fix/$PATCH_FILE_NAME" - - # Print instructions to job output - - echo -e "$INSTRUCTIONS_GITLAB" - - # Include readme in the artifact, in case someone misses the job printout (e.g. getting the artifact via MR interface) - - echo -e "$INSTRUCTIONS_README" > "tmp-formatting-fix/readme.txt" - - - exit $format_problems - artifacts: - expire_in: 1 day - paths: - - tmp-formatting-fix/ - when: on_failure - name: "$ARTIFACT_BASE_NAME" - expose_as: "formatting patch" - -# --------------------------------------------------------------- -# Build jobs -# --------------------------------------------------------------- - -# TODO: template rules for the build jobs -# ensure that codec builds on linux -build-codec-linux-make: - rules: - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES - when: never - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - timeout: "100 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - *activate-Werror-linux - - make -j - -build-codec-linux-cmake: - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES - when: never - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - timeout: "10 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - cmake -B cmake-build -G "Unix Makefiles" - - cmake --build cmake-build -- -j - -# ensure that codec builds on linux with instrumentation active -build-codec-linux-instrumented-make: - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES - when: never - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - timeout: "100 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash scripts/prepare_instrumentation.sh -m MEM_ONLY - - make -j -C $INSTR_DIR - -# make sure that the codec builds with msan, asan and usan -build-codec-sanitizers-linux: - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES - when: never - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - timeout: "100 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - # TODO: re-enable once all the warnings have been fixed - #- *activate-Werror-linux - - bash ci/build_codec_sanitizers_linux.sh - -build-codec-linux-debugging-make: - rules: - - if: $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/ - when: never - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES - when: never - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-linux - timeout: "100 minutes" - variables: - BUILD_WITH_DEBUG_MODE_INFO: "true" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/activate-debug-mode-info-if-set.sh - - make -j - -build-codec-windows-msbuild: - rules: - - if: $MANUAL_PIPELINE_TYPE == 'long-term-logs' || $MANUAL_PIPELINE_TYPE == 'backup-long-term-logs' || $UPDATE_PAGES - when: never - - if: $CI_PIPELINE_SOURCE == 'web' - - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # trigger build job for all MRs - - if: $CI_PIPELINE_SOURCE == 'schedule' - - if: $CI_PIPELINE_SOURCE == 'push' - when: never - extends: - - .build-job-windows - timeout: "10 minutes" - tags: - - ivas-windows - script: - - *print-common-info-windows - - *activate-WX-windows - - MSBuild.exe -maxcpucount .\Workspace_msvc\Workspace_msvc.sln /property:Configuration=Debug - -# --------------------------------------------------------------- -# Test jobs for merge requests -# --------------------------------------------------------------- - -### jobs that check for bitexactness of fx encoder and decoder -check-be-to-target-short-enc-0db: - extends: - - .check-be-to-target-job - variables: - TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" - # -/-0dB - LEVEL_SCALING: "1.0" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" - USE_LTV: 0 - -check-be-to-target-short-enc-+10db: - extends: - - .check-be-to-target-job - variables: - TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" - # +10dB - LEVEL_SCALING: "3.162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" - USE_LTV: 0 - -check-be-to-target-short-enc--10db: - extends: - - .check-be-to-target-job - variables: - TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" - # -10dB - LEVEL_SCALING: "0.3162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" - USE_LTV: 0 - -check-be-to-target-short-dec-0db: - extends: - - .check-be-to-target-job - variables: - TEST_SUITE: "$SHORT_TEST_SUITE" - # +/-0dB - LEVEL_SCALING: "1.0" - # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" - USE_LTV: 0 - -check-be-to-target-short-dec-+10db: - extends: - - .check-be-to-target-job - variables: - TEST_SUITE: "$SHORT_TEST_SUITE" - # +10dB - LEVEL_SCALING: "3.162" - # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" - USE_LTV: 0 - -check-be-to-target-short-dec--10db: - extends: - - .check-be-to-target-job - variables: - TEST_SUITE: "$SHORT_TEST_SUITE" - # -10dB - LEVEL_SCALING: "0.3162" - # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" - USE_LTV: 0 - -### jobs that check for regressions on non-BE testcases -check-regressions-short-enc-0db: - extends: - - .check-regressions-pytest-job - needs: - - job: "check-be-to-target-short-enc-0db" - artifacts: true - variables: - TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" - # +/-0dB - LEVEL_SCALING: "1.0" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" - USE_LTV: 0 - -check-regressions-short-enc-+10db: - extends: - - .check-regressions-pytest-job - needs: - - job: "check-be-to-target-short-enc-+10db" - artifacts: true - variables: - TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" - # +10dB - LEVEL_SCALING: "3.162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" - USE_LTV: 0 - -check-regressions-short-enc--10db: - extends: - - .check-regressions-pytest-job - needs: - - job: "check-be-to-target-short-enc--10db" - artifacts: true - variables: - TEST_SUITE: "$SHORT_TEST_SUITE_ENCODER" - # -10dB - LEVEL_SCALING: "0.3162" - # overwrite decoder with float reference one - DUT_DECODER_PATH: "$MERGE_SOURCE_FLOAT_REF_DECODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_DECODER_PATH: "$REF_DECODER_PATH" - USE_LTV: 0 - -check-regressions-short-dec-0db: - extends: - - .check-regressions-pytest-job - needs: - - job: "check-be-to-target-short-dec-0db" - artifacts: true - variables: - TEST_SUITE: "$SHORT_TEST_SUITE" - # +/-0dB - LEVEL_SCALING: "1" - # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" - USE_LTV: 0 - -check-regressions-short-dec-+10db: - extends: - - .check-regressions-pytest-job - needs: - - job: "check-be-to-target-short-dec-+10db" - artifacts: true - variables: - TEST_SUITE: "$SHORT_TEST_SUITE" - # +10dB - LEVEL_SCALING: "3.162" - # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" - USE_LTV: 0 - -check-regressions-short-dec--10db: - extends: - - .check-regressions-pytest-job - needs: - - job: "check-be-to-target-short-dec--10db" - artifacts: true - variables: - TEST_SUITE: "$SHORT_TEST_SUITE" - # -10dB - LEVEL_SCALING: "0.3162" - # overwrite encoder with float reference one - DUT_ENCODER_PATH: "$MERGE_SOURCE_FLOAT_REF_ENCODER_PATH_FOR_BUILD_DO_NOT_MODIFY" - MERGE_TARGET_ENCODER_PATH: "$REF_ENCODER_PATH" - USE_LTV: 0 - -### jobs that compare bitexactness between merge target and source -renderer-pytest-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-no-draft - # TODO: set reasonable timeout, will most likely take less - timeout: "20 minutes" - tags: - - ivas-linux - stage: compare - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - *merge-request-comparison-setup-codec - - # some helper variables - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - non_be_flag=$(grep -c --ignore-case "\[rend\(erer\)*[ -]*non[ -]*be\]" tmp.txt) || true - # TODO: ref_using_target comes from float repo, but does not apply here - disable for now - # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - - ref_using_target=0 - - # store the current commit hash - - source_branch_commit_sha=$(git rev-parse HEAD) - - ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi - - - exit_code=0 - - testcase_timeout=60 - - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py --create_ref --testcase_timeout=$testcase_timeout || exit_code=$? - - ### Run test using branch scripts and input - - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi - - # run test - - python3 -m pytest -q --log-level ERROR -n auto -rA --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/renderer/test_renderer.py --create_cut --testcase_timeout=$testcase_timeout || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - - - *merge-request-comparison-check - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "pytest renderer results" - reports: - junit: - - report-junit.xml - -ivas-pytest-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-no-draft - stage: compare - timeout: "40 minutes" - tags: - - ivas-linux - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - *merge-request-comparison-setup-codec - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - # some helper variables - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - non_be_flag=$(grep -c --ignore-case "\[non[ -]*be\]" tmp.txt) || true - # TODO: ref_using_target comes from float repo, but does not apply here - disable for now - # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - - ref_using_target=0 - - # store the current commit hash - - source_branch_commit_sha=$(git rev-parse HEAD) - - ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi - - ### prepare pytest - # create references - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --update_ref 1 -k "not model" - - ### Run test using branch scripts and input - - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi - - ### run pytest - - exit_code=0 - - testcase_timeout=600 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --mld --ssnr --odg --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout=$testcase_timeout -k "not model" || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - - - *merge-request-comparison-check - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "pytest ivas results" - reports: - junit: - - report-junit.xml - -#TODO: re-enable after merge to main is done -.split-rendering-pytest-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - - .test-job-linux-compares-to-fixed-target - - .rules-merge-request-no-draft - timeout: "60 minutes" - stage: compare - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - *merge-request-comparison-setup-codec - - # some helper variables - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - non_be_flag=$(grep -c --ignore-case "\[split*[ -]*non[ -]*be\]" tmp.txt) || true - # TODO: ref_using_target comes from float repo, but does not apply here - disable for now - # - ref_using_target=$(grep -c --ignore-case "\[ref[ -]*using[ -]*target\]" tmp.txt) || true - - ref_using_target=0 - - # store the current commit hash - - source_branch_commit_sha=$(git rev-parse HEAD) - - ### If ref_using_target is not set, checkout the source branch to use scripts and input from there - - if [ $ref_using_target == 0 ]; then git restore lib_com/options.h; fi # Revert changes back before checking out another branch to avoid conflicts - - if [ $ref_using_target == 0 ]; then git checkout $source_branch_commit_sha; fi - - exit_code=0 - - testcase_timeout=60 - - # remporary solution to make it work with and without https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/merge_requests/2181 - - mv $DUT_POST_RENDERER_PATH ISAR_post_rend_tmp - - cp $REF_POST_RENDERER_PATH $DUT_POST_RENDERER_PATH - - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --create_ref --testcase_timeout=$testcase_timeout || exit_code=$? - - mv ISAR_post_rend_tmp $DUT_POST_RENDERER_PATH - - ### Run test using scripts and input from main - - if [ $ref_using_target == 1 ]; then git restore lib_com/options.h; fi # Revert changes back before checking out another branch to avoid conflicts - - if [ $ref_using_target == 1 ]; then git checkout $source_branch_commit_sha; fi - - - comp_args="--mld --ssnr --odg" - - echo "$comp_args" - - # run test - - python3 -m pytest -q --log-level ERROR -n auto -rA --html=report.html --self-contained-html --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py $comp_args --create_cut --testcase_timeout=$testcase_timeout || exit_code=$? - - zero_errors=$(cat report-junit.xml | grep -c 'errors="0"') || true - - - *merge-request-comparison-check - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 2 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "pytest split rendering results" - reports: - junit: - - report-junit.xml - -# test that runs all modes with 1s input signals -codec-smoke-test: - extends: - - .test-job-linux-needs-testv-dir - - .rules-merge-request-to-float-ref-no-draft - timeout: "20 minutes" - stage: test - needs: ["build-codec-linux-make"] - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - # LTV update needed as ltv ISM metadata files are used - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - python3 scripts/smoketest-basop-filter.py scripts/config/ivas_modes.json --inline - - bash ci/smoke_test.sh || true - - tar cJf logs.tar.xz out/logs/ - - ls -al logs.tar.* - ### analyze for failures - - if ! [ -s smoke_test_output.txt ] || ! [ -s smoke_test_output_jbm.txt ] || ! [ -s smoke_test_output_hrtf.txt ]; then echo "Error in smoke test"; exit 1; fi - - ret_val=0 - - if cat smoke_test_output.txt | grep -c "failed"; then echo "Smoke test without JBM failed"; ret_val=1; fi - - if cat smoke_test_output_jbm.txt | grep -c "failed"; then echo "Smoke test JBM part failed"; ret_val=1; fi - - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi - - exit $ret_val - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - smoke_test_output.txt - - smoke_test_output_jbm.txt - - smoke_test_output_hrtf.txt - - logs.tar.xz - expose_as: "Smoke test results" - -# from float -# check for crashes if first received frame on decoder side is an SID -check-first-frame-is-sid: - extends: - - .test-job-linux-needs-testv-dir - - .rules-merge-request-to-float-ref-no-draft - stage: test - needs: ["build-codec-linux-make"] - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - # this rm makes check-for-testvectors only check for the signals we actually need in this test - - rm scripts/config/ci_linux_ltv.json scripts/config/ci_linux.json - - python3 -m pytest ci/test_vectors_available.py - - bash ci/run-first-frame-is-sid-test.sh - -# from float -# needs fix to be merged from floating point repo before it can be activated -.check-bitexactness-hrtf-rom-and-file: - extends: - - .test-job-linux - - .rules-merge-request-no-draft - stage: test - needs: ["build-codec-linux-make"] - timeout: "5 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - - make clean - - make -j - - python3 tests/create_short_testvectors.py --cut_len 1.0 - # TODO: run full test again once the custom binary files are supported - - python3 -m pytest -k "not diff_from_rom and not test_binary_file" tests/hrtf_binary_loading --html=report.html --junit-xml=report-junit.xml --self-contained-html - artifacts: - paths: - - report.html - - report-junit.xml - when: always - name: "$CI_JOB_NAME--$CI_MERGE_REQUEST_ID--sha-$CI_COMMIT_SHA--hrtf-loading" - expose_as: "logs-hrtf-loading" - expire_in: "5 days" - - -### From Float -# Check interop IVAS_cod_test -> IVAS_dec_ref -ivas-interop-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - - .rules-merge-request-to-float-ref-no-draft - - .test-job-linux-compares-to-fixed-target - stage: test - timeout: "10 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/get-commits-behind-count.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/float/check-commits-behind-count-in-compare-jobs.sh - - *merge-request-comparison-setup-codec - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - # some helper variables - "|| true" to prevent failures from grep not finding anything - # write to temporary file as workaround for failures observed with piping echo - - echo $CI_MERGE_REQUEST_TITLE > tmp.txt - - non_interop_flag=$(grep -c --ignore-case "\[non[ -]*io\]" tmp.txt) || true - - ### prepare pytest - - # Run reference creation, using source branch encoder and main decoder (see .merge-request-comparison-setup-codec) - - exit_code=0 - - exit_code2=0 - # set timeout for individual testcase runs to 60 seconds - - testcase_timeout=60 - - python3 -m pytest $TESTS_DIR_CODEC_BE_ON_MR -v --html=report.html --self-contained-html --junit-xml=report-junit.xml --update_ref 1 --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec_ref --testcase_timeout=$testcase_timeout || exit_code=$? - - zero_failures=$(cat report-junit.xml | grep -c 'failures="0"') || true - - - if [ $zero_failures != 1 ] && [ $non_interop_flag == 0 ]; then echo "Non-interop cases without non-interop flag encountered!"; exit $EXIT_CODE_FAIL; fi - - if [ $zero_failures != 1 ] && [ $non_interop_flag == 1 ]; then echo "Non-interop cases with non-interop flag encountered"; exit $EXIT_CODE_NON_BE; fi - - exit 0 - - allow_failure: - exit_codes: - - 123 - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "interop test results" - reports: - junit: - - report-junit.xml - -### split rendering tests -split-rendering-smoke-test: - extends: - - .test-job-linux - - .rules-merge-request-no-draft - needs: ["build-codec-linux-make"] - stage: test - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - - make -j - - testcase_timeout=10 - - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/split_rendering/test_split_rendering.py --testcase_timeout=$testcase_timeout - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - expose_as: "split rendering smoke results" - reports: - junit: - - report-junit.xml - -lc3-wrapper-unit-test: - extends: - - .test-job-linux - - .rules-merge-request-no-draft - needs: ["build-codec-linux-make"] - stage: test - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - - cmake -B cmake-build -G "Unix Makefiles" -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - - cmake --build cmake-build -- -j - - - echo "Assuming here that you either merge to main or to $FLOAT_REF_BRANCH." - - echo "If you have some other merge target, this might fail and manual fiddling is needed." - - if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" == "$FLOAT_REF_BRANCH" ]; then - - scripts/split_rendering/lc3plus_float/ivas_lc3plus_unit_test - - else - - scripts/split_rendering/lc3plus_basop/ivas_lc3plus_unit_test - - fi - -# from float -# test renderer executable -renderer-smoke-test: - extends: - - .test-job-linux - - .rules-merge-request-to-float-ref-no-draft - needs: ["build-codec-linux-make"] - stage: test - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - make -j IVAS_rend - - testcase_timeout=60 - - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - expose_as: "renderer make pytest results" - reports: - junit: - - report-junit.xml - -# from float -# test renderer executable with cmake + asan -renderer-asan: - extends: - - .test-job-linux - - .rules-merge-request-to-float-ref-no-draft - needs: ["build-codec-linux-make"] - stage: test - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - cmake -B cmake-build -G "Unix Makefiles" -DCLANG=asan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - - cmake --build cmake-build -- -j - - testcase_timeout=180 - - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout - - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - expose_as: "renderer asan pytest results" - reports: - junit: - - report-junit.xml - -# from float -# test renderer executable with cmake + msan -renderer-msan: - extends: - - .test-job-linux - - .rules-merge-request-to-float-ref-no-draft - needs: ["build-codec-linux-make"] - stage: test - tags: - - ivas-linux - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - cmake -B cmake-build -G "Unix Makefiles" -DCLANG=asan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - - cmake --build cmake-build -- -j - - testcase_timeout=180 - - python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout - - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - expose_as: "renderer msan pytest results" - reports: - junit: - - report-junit.xml - -# from float -# test renderer executable with cmake + usan -renderer-usan: - extends: - - .test-job-linux - - .rules-merge-request-to-float-ref-no-draft - needs: ["build-codec-linux-make"] - stage: test - tags: - - ivas-linux - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - cmake -B cmake-build -G "Unix Makefiles" -DCLANG=asan -DCOPY_EXECUTABLES_FROM_BUILD_DIR=true - - cmake --build cmake-build -- -j - - testcase_timeout=180 - - UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1,log_path=usan_log_catchall python3 -m pytest -q -n auto -rA --junit-xml=report-junit.xml tests/renderer/test_renderer.py --testcase_timeout=$testcase_timeout - - grep_exit_code=0 - - touch usan_log_empty # Creates an empty file, this is to avoid "grep: usan_log_*: No such file or directory" in case no USAN failures are reported from pytest - - grep UndefinedBehaviorSanitizer usan_log_* || grep_exit_code=$? - - if [ $grep_exit_code != 1 ] ; then echo "Run errors in test_renderer.py with Clang undefined-behavior-sanitizer"; exit 1; fi - - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--job-$CI_JOB_NAME--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - expose_as: "renderer usan pytest results" - reports: - junit: - - report-junit.xml - -.sanitizer-selftest-on-mr: - stage: test - extends: - - .rules-merge-request-to-float-ref-no-draft - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - paths: - - report-junit-20ms.xml - - report-junit-10ms.xml - - report-junit-5ms.xml - - report-20ms.html - - report-10ms.html - - report-5ms.html - expose_as: "Sanitizer selftest results" - reports: - junit: - - report-junit-20ms.xml - - report-junit-10ms.xml - - report-junit-5ms.xml - -# From float repo -# to be reused in MR and LTV-scheduled sanitizer test jobs -# set CLANG_NUM, SELFTEST_SANITY_TIMEOUT and SELF_TEST_PRM_FILE in before_script section -.sanitizer-selftest-anchor: &sanitizer-selftest-anchor - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - make clean - - make -j CLANG=$CLANG_NUM - - testcase_timeout=$SELFTEST_SANITY_TIMEOUT - - export UBSAN_OPTIONS=suppressions=scripts/ubsan.supp,report_error_type=1 - - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - - exit_code20=0 - - exit_code10=0 - - exit_code5=0 - - - if [ $CLANG_NUM -eq 1 ]; then sanitizer_type="MemorySanitizer"; elif [ $CLANG_NUM -eq 2 ]; then sanitizer_type="AddressSanitizer"; elif [ $CLANG_NUM -eq 3 ]; then sanitizer_type="UndefinedBehaviorSanitizer"; else echo "Wrong CLANG_NUM $CLANG_NUM given!"; exit 1; fi - - # run encoder and decoder with 20ms renderer framesize first, use reference creation mode - - python3 -m pytest tests/codec_be_on_mr_nonselection $USE_LTV --param_file $SELF_TEST_PRM_FILE -v --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml --testcase_timeout=$testcase_timeout --ref_encoder_path ./IVAS_cod --ref_decoder_path ./IVAS_dec || exit_code20=$? - # for 10ms and 5ms renderer framesize, we only need to run the decoder part as renderer framesize is a decoder-only option - # set tolerance very high do ignore any BE differences due to the different renderer framesizes, those can appear due to the limiter being active - # we are only interested in runtime errors from the sanitizers and ignore the diffs - - python3 -m pytest tests/codec_be_on_mr_nonselection $USE_LTV --param_file $SELF_TEST_PRM_FILE -v --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only --abs_tol 100000 || exit_code5=$? - - python3 -m pytest tests/codec_be_on_mr_nonselection $USE_LTV --param_file $SELF_TEST_PRM_FILE -v --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only --abs_tol 100000 || exit_code10=$? - - - if [ $exit_code20 -ne 0 ] || [ $exit_code10 -ne 0 ] || [ $exit_code5 -ne 0 ]; then exit 1; fi - -# from float repo -# NOTE: (per-testcase) timeout was adjusted to work for float only -# code selftest testvectors with memory-sanitizer binaries -.codec-msan: - extends: - - .sanitizer-selftest-on-mr - tags: - - ivas-linux - before_script: - - CLANG_NUM=1 - - SELFTEST_SANITY_TIMEOUT=180 - - SELF_TEST_PRM_FILE="scripts/config/self_test.prm" - - USE_LTV="" - <<: *sanitizer-selftest-anchor - -# code selftest testvectors with address-sanitizer binaries -.codec-asan: - extends: - - .sanitizer-selftest-on-mr - tags: - - ivas-linux - before_script: - - CLANG_NUM=2 - - SELFTEST_SANITY_TIMEOUT=180 - - SELF_TEST_PRM_FILE="scripts/config/self_test.prm" - - USE_LTV="" - <<: *sanitizer-selftest-anchor - -# code selftest testvectors with undefined-behaviour-sanitizer binaries -.codec-usan: - extends: - - .sanitizer-selftest-on-mr - tags: - - ivas-linux - before_script: - - CLANG_NUM=3 - - SELFTEST_SANITY_TIMEOUT=180 - - SELF_TEST_PRM_FILE="scripts/config/self_test.prm" - - USE_LTV="" - <<: *sanitizer-selftest-anchor - -# --------------------------------------------------------------- -# Short test jobs for running from web interface or schedule -# --------------------------------------------------------------- - -### jobs that test fx encoder -> flt decoder -ivas-pytest-compare_to_ref-short-enc: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-enc-lev-10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-enc-lev+10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -# encoder dmx comparison jobs -ivas-pytest-compare_to_ref-dmx-short-enc: - extends: - - .rules-pytest-to-ref-enc-short-dmx - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - COMPARE_DMX="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-dmx-short-enc-lev-10: - extends: - - .rules-pytest-to-ref-enc-short-dmx - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - COMPARE_DMX="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-dmx-short-enc-lev+10: - extends: - - .rules-pytest-to-ref-enc-short-dmx - - .test-job-linux - before_script: - - USE_LTV=0 - - ENCODER_TEST="true" - - COMPARE_DMX="true" - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -ivas-pytest-enc-msan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_ENCODER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-enc-asan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=2 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_ENCODER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-enc-usan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=3 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_ENCODER - <<: *ivas-pytest-sanitizers-anchor - -### jobs that test flt encoder -> fx decoder -ivas-pytest-compare_to_ref-short-dec: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-dec-lev-10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=0.3162 - <<: *ivas-pytest-anchor - -ivas-pytest-compare_to_ref-short-dec-lev+10: - extends: - - .rules-pytest-to-ref-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=3.162 - <<: *ivas-pytest-anchor - -### jobs that compare the output synthesis to the input files directly -ivas-pytest-compare-to-input-short-dec: - extends: - - .rules-pytest-to-input-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-compare-to-input-anchor - -ivas-pytest-compare-to-input-short-enc: - extends: - - .rules-pytest-to-input-short - - .test-job-linux - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-compare-to-input-anchor - -ivas-pytest-dec-msan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_NO_RENDERER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-dec-asan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=2 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_NO_RENDERER - <<: *ivas-pytest-sanitizers-anchor - -ivas-pytest-dec-usan: - extends: - - .test-job-linux - tags: - - ivas-basop-linux-fast - before_script: - - CLANG_NUM=3 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE=$LONG_TEST_SUITE_NO_RENDERER - <<: *ivas-pytest-sanitizers-anchor - -# --------------------------------------------------------------- -# Long test job -# --------------------------------------------------------------- - -ivas-pytest-compare_ref-long-enc: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - - LEVEL_SCALING=1.0 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-dec: - extends: - - .rules-pytest-long - - .test-job-linux - tags: - - ivas-basop-linux - - high-memory-capacity - before_script: - - USE_LTV=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE" - - LEVEL_SCALING=1.0 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-enc-lev-10: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - - LEVEL_SCALING=0.3162 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-dec-lev-10: - extends: - - .rules-pytest-long - - .test-job-linux - tags: - - ivas-basop-linux - - high-memory-capacity - before_script: - - USE_LTV=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE" - - LEVEL_SCALING=0.3162 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-enc-lev+10: - extends: - - .rules-pytest-long - - .test-job-linux - before_script: - - USE_LTV=1 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_ENCODER" - - LEVEL_SCALING=3.162 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-dec-lev+10: - extends: - - .rules-pytest-long - - .test-job-linux - tags: - - ivas-basop-linux - - high-memory-capacity - before_script: - - USE_LTV=1 - - DUT_ENCODER_PATH=./$REF_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE" - - LEVEL_SCALING=3.162 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-fx-fx: - extends: - - .rules-pytest-long-fx-fx - - .test-job-linux - tags: - - ivas-linux - before_script: - - USE_LTV=1 - - REF_ENCODER_PATH=./$DUT_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" - - LEVEL_SCALING=1.0 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-fx-fx-lev-10: - extends: - - .rules-pytest-long-fx-fx - - .test-job-linux - tags: - - ivas-linux - before_script: - - USE_LTV=1 - - REF_ENCODER_PATH=./$DUT_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" - - LEVEL_SCALING=0.3162 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - -ivas-pytest-compare_ref-long-fx-fx-lev+10: - extends: - - .rules-pytest-long-fx-fx - - .test-job-linux - tags: - - ivas-linux - before_script: - - USE_LTV=1 - - REF_ENCODER_PATH=./$DUT_ENCODER_PATH - - TEST_SUITE="$LONG_TEST_SUITE_NO_RENDERER" - - LEVEL_SCALING=3.162 - - SPLIT_COMPARISON="true" - <<: *ivas-pytest-anchor - - -ivas-smoke-test-saturation: - extends: - - .rules-pytest-saturation-smoke-test - - .test-job-linux-needs-testv-dir - script: - - USE_LTV=1 - - LEVEL_SCALING=32768 - - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - if [ $USE_LTV -eq 1 ]; then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - fi - - if [ $LEVEL_SCALING != "1.0" ];then - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/apply-testv-scaling.sh - - fi - - cp -r scripts/testv/* $TESTV_DIR/ - - # skip prepare_mem_dryrun.py script in smoke_test.sh - - sed -i 's/python3 .\/scripts\/prepare_mem_dryrun.py/#python3 .\/scripts\/prepare_mem_dryrun.py/g' ci/smoke_test.sh - - - bash ci/smoke_test.sh - ### analyze for failures - - if ! [ -s smoke_test_output.txt ] || ! [ -s smoke_test_output_plc.txt ] || ! [ -s smoke_test_output_jbm_noEXT.txt ] || ! [ -s smoke_test_output_hrtf.txt ]; then echo "Error in smoke test"; exit 1; fi - - ret_val=0 - - if cat smoke_test_output.txt | grep -c "failed" ; then echo "Smoke test without PLC failed"; ret_val=1; fi - - if cat smoke_test_output_plc.txt | grep -c "failed"; then echo "Smoke test with PLC failed"; ret_val=1; fi - - if cat smoke_test_output_jbm_noEXT.txt | grep -c "failed"; then echo "Smoke test JBM part failed"; ret_val=1; fi - - if cat smoke_test_output_hrtf.txt | grep -c "failed"; then echo "Smoke test with external hrtf files failed"; ret_val=1; fi - - exit $ret_val - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - smoke_test_output.txt - - smoke_test_output_plc.txt - - smoke_test_output_jbm_noEXT.txt - - smoke_test_output_hrtf.txt - expose_as: "saturation smoke test results" - - -# GCOV/LCOV coverage analysis of self_test suite -coverage-test-on-main-scheduled: - extends: - - .test-job-linux - - .rules-coverage - stage: test - timeout: 3 hours - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/copy-ltv-files-to-testv-dir.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-binaries.sh float-ref - # Build DuT binaries with GCOV - - make clean >> /dev/null - - make GCOV=1 -j - - cp IVAS_rend IVAS_rend_ref # Copy to ensure instrumented renderer is run in the first pytest call - - - testcase_timeout=$TESTCASE_TIMEOUT_LTV - - exit_code_dec=0 - - exit_code_enc=0 - - python3 -m pytest --tb=no tests/codec_be_on_mr_nonselection tests/renderer --update_ref 1 -v --create_ref --html=report-dec.html --self-contained-html --junit-xml=report-junit-dec.xml -n auto --testcase_timeout $testcase_timeout --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH || exit_code_dec=$? - - lcov -c -d obj -o coverage_dec_rend.info # extract coverage of decoder/renderer - - - python3 -m pytest --tb=no tests/codec_be_on_mr_nonselection --encoder_only -v --html=report-enc.html --self-contained-html --junit-xml=report-junit-enc.xml -n auto --testcase_timeout $testcase_timeout --dut_encoder_path $DUT_ENCODER_PATH || exit_code_enc=$? - - lcov -c -d obj -o coverage_enc_dec_rend.info # extract coverage of encoder/decoder/renderer - - # remove apps and lib_util files from coverage - - lcov -r coverage_dec_rend.info "*apps*" -o coverage_dec_rend.info - - lcov -r coverage_dec_rend.info "*lib_util*" -o coverage_dec_rend.info - - lcov -r coverage_enc_dec_rend.info "*apps*" -o coverage_enc_dec_rend.info - - lcov -r coverage_enc_dec_rend.info "*lib_util*" -o coverage_enc_dec_rend.info - - - commit_sha=$(git rev-parse HEAD) - - genhtml coverage_enc_dec_rend.info -o coverage_enc_dec_rend -t "Coverage on main enc/dec/rend @ $commit_sha" - - genhtml coverage_dec_rend.info -o coverage_dec_rend -t "Coverage on main -- dec/rend @ $commit_sha" - artifacts: - name: "main-coverage-sha-$CI_COMMIT_SHORT_SHA" - when: always - expire_in: 1 week - paths: - - coverage_enc_dec_rend.info - - coverage_dec_rend.info - - coverage_enc_dec_rend - - coverage_dec_rend - - report-dec.html - - report-enc.html - expose_as: "Coverage result" - reports: - junit: - - report-junit-dec.xml - - report-junit-enc.xml - -# --------------------------------------------------------------- -# EVS 26.444 test job -# --------------------------------------------------------------- - -# check bitexactness to EVS -be-2-evs-26444: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "evs-26444" - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" - tags: - - be-2-evs-basop - stage: test - timeout: "120 minutes" # To be revisited - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - sed -i".bak" "s/\(#define EVS_FLOAT\)/\/\/\1/" lib_com/options.h - - make -j >> /dev/null - - # copy over to never change the testvector dir - - cp -r $EVS_BE_TEST_DIR_BASOP ./evs_be_test - - mkdir -p ./evs_be_test/output/decoded ./evs_be_test/output/bitstreams - - - exit_code=0 - - python3 -m pytest tests/test_26444.py -v --html=report.html --self-contained-html --junit-xml=report-junit.xml -n auto || exit_code=$? - - if [ $exit_code -eq 1 ]; then echo "Differences encountered"; exit $EXIT_CODE_FAIL; fi - - exit 0 - - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 1 week - when: always - paths: - - report-junit.xml - - report.html - expose_as: "EVS 26444 result" - reports: - junit: - - report-junit.xml - -ivas-pytest-renderer: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "pytest-renderer" - before_script: - - USE_LTV=0 - - TEST_SUITE="tests/renderer" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -peaq-enc-passthrough: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "peaq-enc-passthrough" - before_script: - - USE_LTV=0 - - DUT_DECODER_PATH=./$REF_DECODER_PATH - - TEST_SUITE="tests/test_enc_passthrough.py" - - DELTA_ODG="true" - - LEVEL_SCALING=1.0 - <<: *ivas-pytest-anchor - -# --------------------------------------------------------------- -# Various other tests -# --------------------------------------------------------------- - -# TODO: actually run on MR once main problems are fixed -voip-be-on-merge-request: - extends: - - .test-job-linux-needs-testv-dir - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "voip-be-test" - - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "ivas-float-update" - # - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" # only have MR pipelines for MRs to main - stage: test - needs: ["build-codec-linux-make"] - timeout: "10 minutes" - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - make clean - - make -j > build_log.txt - - python3 -m pytest tests/test_be_for_jbm_neutral_dly_profile.py - artifacts: - when: always - expire_in: "5 days" - paths: - - build_log.txt - -check-be-between-renderer-framesizes: - extends: - - .test-job-linux - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "renderer-framesize-be" - stage: test - needs: ["build-codec-linux-make"] - script: - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/disable-limiter.sh - - make clean - - make -j - - echo "$SHORT_TEST_SUITE" - - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - - python3 ci/remove_unsupported_testcases.py $PRM_FILES --use-main-pc-set - - - exit_code=0 - - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --update_ref 1 --html=report-20ms.html --self-contained-html --junit-xml=report-junit-20ms.xml || exit_code=$? - - - exit_code5=0 - - exit_code10=0 - - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-5ms.html --self-contained-html --junit-xml=report-junit-5ms.xml --dut_fr 5 --decoder_only || exit_code5=$? - - python3 -m pytest tests/codec_be_on_mr_nonselection --tb=no -v --ref_encoder_path ./IVAS_cod_ref --ref_decoder_path ./IVAS_dec --html=report-10ms.html --self-contained-html --junit-xml=report-junit-10ms.xml --dut_fr 10 --decoder_only || exit_code10=$? - - - zero_errors5=$(cat report-junit-5ms.xml | grep -c 'errors="0"') || true - - zero_errors10=$(cat report-junit-10ms.xml | grep -c 'errors="0"') || true - - zero_errors=1 - - - *print-results-banner - - echo "!! Encoder command lines are in the 20ms log files only !!!" - - if [ $exit_code -ne 0 ]; then echo "20 ms framesize run already failed with errors."; zero_errors=0; fi - - if [ $zero_errors5 != 1 ]; then echo "run error with 5ms rendering encountered"; zero_errors=0 ; fi - - if [ $zero_errors10 != 1 ]; then echo "run error with 10ms rendering encountered"; zero_errors=0 ; fi - - if [ $zero_errors != 1 ]; then exit $EXIT_CODE_FAIL; fi - - if [ $exit_code5 -ne 0 ]; then echo "Non-bitexact cases encountered with 5ms rendering!"; exit_code=1; fi - - if [ $exit_code10 -ne 0 ]; then echo "Non-bitexact cases encountered with 10ms rendering!"; exit_code=1; fi - - if [ $exit_code -ne 0 ]; then exit $EXIT_CODE_FAIL; fi - artifacts: - name: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--stage-$CI_JOB_STAGE--results" - expire_in: 1 week - when: always - expose_as: "pytest 5ms and 10ms vs 20ms results" - paths: - - report-junit-5ms.xml - - report-5ms.html - - report-junit-10ms.xml - - report-10ms.html - - report-junit-20ms.xml - - report-20ms.html - reports: - junit: - - report-junit-5ms.xml - - report-junit-10ms.xml - - report-junit-20ms.xml - -# To inject backup copy in manual trigger: -# - Store logs backup in accessible folder, e.g. /usr/local/backup -# - Set MANUAL_PIPELINE_TRIGGER to long-term-logs -# - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 -# - Set LOGS_BACKUP_SOURCE_DIR to source folder, e.g. /usr/local/backup -ivas-long-term-job-logs: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "long-term-logs" - - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "long-term-logs" - tags: - - $RUNNER_TAG - stage: maintenance - timeout: "25 minutes" - script: - - !reference [ .job-linux, before_script ] - - set -euxo pipefail - - echo "Running on RUNNER_TAG = $RUNNER_TAG" - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - # Clean up logs - - if [ -d "logs" ]; then rm -rf "logs"; fi - # Inject logs from backup copy if LOGS_BACKUP_SOURCE_DIR is set - - if [ "$LOGS_BACKUP_SOURCE_DIR" != "" ]; then - - cp_ret=0 - - cp -r $LOGS_BACKUP_SOURCE_DIR/logs ./ || cp_ret=$? - - if [ "$cp_ret" != 0 ]; then - - echo "Error -- Copying to $LOGS_BACKUP_SOURCE_DIR failed!" - - exit 1 - - fi - - fi - - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$CI_JOB_NAME" $CI_PROJECT_ID) - - echo "Job name from variables - "$CI_JOB_NAME", Job ID from script - $id_previous" - - - if [ "$id_previous" != "-1" ]; then - # Unzip artifacts to recover past logs dir - - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - # If there is overlap between injected log and new log, use the new logs. - - unzip -o artifacts.zip - - else - # create logs dir if it doesn't exist (should only happen in first run) - - echo "Could not find previous job, creating empty logs folder. If this is not the first run, an error likely happened!" - - mkdir logs - - fi - - # create folder for today's results - - TODAY=$(date +'%Y-%m-%d') - - mkdir -p logs/$TODAY - - # Aggregate job logs - - job_names="ivas-pytest-compare_ref-long-enc ivas-pytest-compare_ref-long-enc-lev+10 ivas-pytest-compare_ref-long-enc-lev-10 ivas-pytest-compare_ref-long-dec ivas-pytest-compare_ref-long-dec-lev+10 ivas-pytest-compare_ref-long-dec-lev-10 ivas-pytest-compare_ref-long-fx-fx ivas-pytest-compare_ref-long-fx-fx-lev+10 ivas-pytest-compare_ref-long-fx-fx-lev-10" - - for job_name in $job_names; do - - echo "Getting job logs for $job_name" - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH "$job_name" $CI_PROJECT_ID) - - echo "Job ID from variables - "$job_name", Job ID from script - $id_previous" - - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip -d previous_artifacts - - mv previous_artifacts/mld--"$job_name"-$id_previous--sha-*.csv logs/$TODAY - - rm artifacts.zip - - rm -r previous_artifacts - - done - - ls logs - - exit 0 - - artifacts: - name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" - expire_in: 4 weeks - when: always - paths: - - logs - expose_as: "ivas long term job logs results" - -# To store backup copy: -# - Prepare accessible folder for backup, e.g. /usr/local/backup -# - Set MANUAL_PIPELINE_TRIGGER to backup-long-term-logs -# - Set RUNNER_TAG to specific runner with this folder prepared, e.g. test-ericsson-linux-runner-5 -# - Set LOGS_BACKUP_TARGET_DIR to source folder, e.g. /usr/local/backup -backup-long-term-job-logs: - rules: - - if: $CI_PIPELINE_SOURCE == 'web' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" - - if: $CI_PIPELINE_SOURCE == 'schedule' && $MANUAL_PIPELINE_TYPE == "backup-long-term-logs" - tags: - - $RUNNER_TAG - stage: maintenance - timeout: "25 minutes" - script: - - !reference [ .job-linux, before_script ] - - set -euxo pipefail - - echo "Running on RUNNER_TAG = $RUNNER_TAG" - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - # Find ID of last run of ivas-long-term-job-logs - - id_previous=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH ivas-long-term-job-logs $CI_PROJECT_ID) - - - if [ "$id_previous" != "-1" ]; then - # Unzip artifacts to recover past logs dir - - curl --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$id_previous/artifacts" --output artifacts.zip - - unzip artifacts.zip - - else - # create logs dir if it doesn't exist - - mkdir logs - - fi - - # Store logs as backup copy if LOGS_BACKUP_TARGET_DIR is set - - if [ -d "$LOGS_BACKUP_TARGET_DIR" ]; then - - cp -r logs $LOGS_BACKUP_TARGET_DIR - - exit 0 - - else - - echo "Error - LOGS_BACKUP_TARGET_DIR not set for backup job!" - - exit 1 - - fi - - -# --------------------------------------------------------------- -# Complexity measurement jobs -# --------------------------------------------------------------- - -# create necessary environment -.complexity-measurements-setup: &complexity-measurements-setup - ### 1. part: mainly same as in float repo - this is boilerplate code to make the gitlab pages presentation work - - mkdir -p wmops/logs - - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $CI_COMMIT_REF_NAME $CI_JOB_NAME $CI_PROJECT_ID) - - echo $job_id - # this is a testing/maintenance mechanism to force getting the log history from a specific job id - # see below in the concrete complexity jobs - - if [ "$JOB_ID_INJECT" != "" ]; then job_id=$JOB_ID_INJECT; fi - - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - - unzip -qq artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - - public_dir="$CI_JOB_NAME-public" - - # if is needed to catch case when no artifact is there (first run), similarly as above - # 1. check for public_dir being there as this might not be the case when artifact download failed - # 2. check for public dir not being empty - handle job failures in prev job that happen after the dir is created. In that case, the empty dir is in the artifacts - - if [ -d $public_dir ] && [ ! -z "$( ls -A $public_dir )" ]; then - - mv $public_dir/* wmops/ - # check here if we have the split-by-levels files present - if not, fake them up with the existing global one - # this is needed for the first run with split graphs on a branch where the global version did run previously - # NOTE: checking only for level_1 file here as this should already be sufficient - # NOTE2: also not chechking for RAM for same reason - - wmops_all_global="wmops/log_wmops_all.txt" - - ram_all_global="wmops/log_ram_all.txt" - - if [ -f "${wmops_all_global}" ] && [ ! -f "wmops/log_wmops_all_level_1.txt" ]; then - - declare -a suffixes=("level_1" "level_2" "level_3" "rate_sw") - - for suffix in "${suffixes[@]}"; do - - cp ${wmops_all_global} wmops/log_wmops_all_${suffix}.txt - - cp ${ram_all_global} wmops/log_ram_all_${suffix}.txt - - done - - fi - - fi - - - rm artifacts.zip - - rm -rf $public_dir - - ### 1.5.part: get the corresponding measurement from ivas-float-update - # only do this on main and not for the complexity meaurements run on ivas-float-update - - if [ "$CI_COMMIT_REF_NAME" == "main" ]; then - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $FLOAT_REF_BRANCH $CI_JOB_NAME $CI_PROJECT_ID) - - echo $job_id - - curl --silent --show-error --request GET "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts_ref.zip - - unzip -qq -j artifacts_ref.zip "*latest_WMOPS.csv" || true - # add file to arguments only if the artifact could be retrieved to prevent error later. - - if [ -f latest_WMOPS.csv ]; then GET_WMOPS_ARGS="$GET_WMOPS_ARGS latest_WMOPS.csv"; fi - - fi - -# prepare artifacts -> move to public directory -.complexity-measurements-prepare-artifacts: &complexity-measurements-prepare-artifacts - - public_dir="$CI_JOB_NAME-public" - - mkdir $public_dir - - mv -f wmops/log_*_all*.txt ./*.js ${public_dir}/ - # move logfiles for links - - mkdir $public_dir/logs - # first move logs - - log_files=$(cat $public_dir/graphs*.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - - for f in $log_files; do [ -f wmops/logs/$f ] && mv wmops/logs/$f $public_dir/logs/$f; done - - if [ "$CI_COMMIT_REF_NAME" == "$FLOAT_REF_BRANCH" ]; then mv wmops/logs/latest_WMOPS.csv $public_dir/logs/; fi - # copy index page blueprint - - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html - # patch the format in the title - - sed -i "s/IVAS FORMAT/IVAS $in_format to $out_format/g" ${public_dir}/index.html - # do separately here to avoid overwrite complaints by mv - - mv -f ci/complexity_measurements/style.css ${public_dir}/ - -.complexity-measurements-report-summary: &complexity-measurements-report-summary - - *print-results-banner - - if [ $ret_val -eq 0 ]; then - - echo -e "No crashes occured.\nNo changes in complexity or memory usage (>1%) detected." - - elif [ $ret_val -eq 123 ]; then - - echo -e "Changes in complexity or memory usage (>1%) detected!!!\nNo crashes occured." - - else - - echo -e "Something went wrong in running the codec. Likely some modes were crashing." - - fi - -.complexity-template: - extends: - - .test-job-linux - stage: test - variables: - ret_val: 0 - GET_WMOPS_ARGS: "mem_only" - timeout: 3 hours 30 minutes - before_script: - - !reference [ .test-job-linux, before_script ] - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/update-ltv-repo.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/build-float-ref-and-dut-binaries.sh - - *complexity-measurements-setup - # delete previous jobs logfiles if present (-f flag ensures return calue of 0 even in first run where this folder is not present) - - rm -rf COMPLEXITY/logs - allow_failure: - exit_codes: - - 123 - artifacts: - name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA" - when: always - expire_in: 2 week - paths: - - $CI_JOB_NAME-public - - COMPLEXITY/logs - -complexity-stereo-in-stereo-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - variables: - JOB_ID_INJECT: "" - script: - - in_format=stereo - - out_format=stereo - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-ism-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 1 hour - variables: - JOB_ID_INJECT: "" - script: - - in_format=ISM - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-ism-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 2 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=ISM - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-ism-in-ext-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 3 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=ISM - - out_format=EXT - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "ISM+1 ISM+2 ISM+3 ISM+4" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-sba-hoa3-in-hoa3-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 4 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=HOA3 - - out_format=HOA3 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-sba-hoa3-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 5 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=HOA3 - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-sba-hoa3-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 6 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=HOA3 - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-mc-in-7_1_4-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 7 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=MC - - out_format=7_1_4 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-mc-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 10 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MC - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-mc-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 12 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=MC - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-masa-in-ext-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 15 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MASA - - out_format=EXT - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-masa-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 16 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MASA - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-masa-in-hoa3-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 17 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=MASA - - out_format=HOA3 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -# complexity-omasa-in-ext-out: -# extends: -# - .complexity-template -# rules: -# - if: $MEASURE_COMPLEXITY_LINUX -# when: delayed -# start_in: 13 hours - # variables: - # JOB_ID_INJECT: "" -# script: -# - in_format=OMASA -# - out_format=EXT -# - ret_val=0 -# - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? -# - *complexity-measurements-prepare-artifacts -# - *complexity-measurements-report-summary -# - exit $ret_val - -complexity-omasa-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 18 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=OMASA - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-omasa-in-hoa3-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 20 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=OMASA - - out_format=HOA3 - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-StereoDmxEVS-stereo-in-mono-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 22 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=StereoDmxEVS - - out_format=mono - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -# complexity-osba-in-ext-out: -# extends: -# - .complexity-template -# rules: -# - if: $MEASURE_COMPLEXITY_LINUX -# when: delayed -# start_in: 17 hours -# script: -# - in_format=OSBA -# - out_format=EXT -# - ret_val=0 -# - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? -# - *complexity-measurements-prepare-artifacts -# - *complexity-measurements-report-summary -# - exit $ret_val - -complexity-osba-in-binaural-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 22 hours 30 minutes - variables: - JOB_ID_INJECT: "" - script: - - in_format=OSBA - - out_format=BINAURAL - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -complexity-osba-in-binaural_room_ir-out: - extends: - - .complexity-template - rules: - - if: $MEASURE_COMPLEXITY_LINUX - when: delayed - start_in: 25 hours - variables: - JOB_ID_INJECT: "" - script: - - in_format=OSBA - - out_format=BINAURAL_ROOM_IR - - ret_val=0 - - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" $GET_WMOPS_ARGS || ret_val=$? - - *complexity-measurements-prepare-artifacts - - *complexity-measurements-report-summary - - exit $ret_val - -# job that sets up gitlab pages website -pages: - stage: deploy - tags: - - ivas-basop-linux - rules: - - if: $UPDATE_PAGES - script: - - !reference [ .job-linux, before_script ] - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/print-common-info.sh - - bash "${CI_PROJECT_DIR}"/ivas-codec-ci/snippets/basop/update-scripts-repo.sh - - python3 ci/setup_pages.py - - ls - - ls -lh public - artifacts: - paths: - - public - expire_in: 1 day + file: main-basop.yml -- GitLab From ef2e881b04d5e06bed3626aba2feef91adb23b45 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 28 Jul 2025 20:54:39 +0200 Subject: [PATCH 1294/1310] port 3gpp_issue_1517_fix --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index b0077d223..1cf8f03c0 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -1454,12 +1454,14 @@ static void ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( temp64 = W_add( W_mult0_32_32( tempRe, tempRe ), W_mult0_32_32( tempIm, tempIm ) ); // 2q exp1 = W_norm( temp64 ); temp64 = W_shl( temp64, exp1 ); // 2q + exp1 - subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameTotalEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameTotalEne_e[bin] ); + subFrameSumEne_fx[bin] = BASOP_Util_Add_Mant32Exp( subFrameSumEne_fx[bin], subFrameSumEne_e[bin], W_extract_h( temp64 ), sub( exp /* 63 - 2q */, exp1 ) /*31 - (2q + exp1 - 32)*/, &subFrameSumEne_e[bin] ); move32(); } } FOR( bin = 0; bin < nBins; bin++ ) { + subFrameTotalEne_e[bin] = sub( subFrameTotalEne_e[bin], 1 ); + move16(); temp = L_shl_sat( subFrameTotalEne_fx[bin], sub( subFrameTotalEne_e[bin], subFrameSumEne_e[bin] ) ); // subFrameSumEne_e[bin] IF( GT_32( subFrameSumEne_fx[bin], temp ) ) { -- GitLab From 10615874c6461adc48c8c410d8a9e587c3cf5e3d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 28 Jul 2025 20:59:46 +0200 Subject: [PATCH 1295/1310] formatting --- lib_rend/ivas_dirac_dec_binaural_functions_fx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c index 1cf8f03c0..65d8976ac 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions_fx.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions_fx.c @@ -1460,8 +1460,8 @@ static void ivas_dirac_dec_binaural_formulate_input_covariance_matrices_fx( } FOR( bin = 0; bin < nBins; bin++ ) { - subFrameTotalEne_e[bin] = sub( subFrameTotalEne_e[bin], 1 ); - move16(); + subFrameTotalEne_e[bin] = sub( subFrameTotalEne_e[bin], 1 ); + move16(); temp = L_shl_sat( subFrameTotalEne_fx[bin], sub( subFrameTotalEne_e[bin], subFrameSumEne_e[bin] ) ); // subFrameSumEne_e[bin] IF( GT_32( subFrameSumEne_fx[bin], temp ) ) { -- GitLab From 5ae0e0f694e5b9c599b72153621fbb05a5eb9c3d Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 29 Jul 2025 11:11:22 +0200 Subject: [PATCH 1296/1310] Fix for computing reverb predelay in samples --- lib_com/options.h | 1 + lib_rend/ivas_reverb_fx.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 929ae2b05..4a5a53c98 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,6 +164,7 @@ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ +#define FIX_1831_REVERB_REGRESSION /* Philips: fixes reverb regression issues */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index b4b9f7d1e..1be277fce 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2426,6 +2426,10 @@ ivas_error ivas_binaural_reverb_init( Word32 t60[CLDFB_NO_CHANNELS_MAX]; Word32 ene[CLDFB_NO_CHANNELS_MAX]; Word16 preDelay; +#ifdef FIX_1831_REVERB_REGRESSION + Word16 temp16, s; + Word32 temp32; +#endif error = IVAS_ERR_OK; @@ -2442,7 +2446,14 @@ ivas_error ivas_binaural_reverb_init( return error; } +#ifdef FIX_1831_REVERB_REGRESSION + temp16 = BASOP_Util_Divide3216_Scale( sampling_rate, CLDFB_NO_CHANNELS_MAX, &s ); + temp16 = shl( temp16, s ); // Q0 + temp32 = Mult_32_16( roomAcoustics->acousticPreDelay_fx, temp16 ); // Q11 + preDelay = shr( add( temp32, shl( 1, 10 ) ), 11 ); // Q0 +#else preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); +#endif #ifdef FIX_1741_REVERB_TIMES_Q_FORMAT floatToFixed_arrL( t60_temp, t60, Q26, CLDFB_NO_CHANNELS_MAX ); #else -- GitLab From 8ec96c567ad24981a9b8398477414bae7a5f3a1e Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 29 Jul 2025 12:30:44 +0200 Subject: [PATCH 1297/1310] To make clang happy --- lib_rend/ivas_reverb_fx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index 1be277fce..bd1634c77 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2448,9 +2448,9 @@ ivas_error ivas_binaural_reverb_init( #ifdef FIX_1831_REVERB_REGRESSION temp16 = BASOP_Util_Divide3216_Scale( sampling_rate, CLDFB_NO_CHANNELS_MAX, &s ); - temp16 = shl( temp16, s ); // Q0 - temp32 = Mult_32_16( roomAcoustics->acousticPreDelay_fx, temp16 ); // Q11 - preDelay = shr( add( temp32, shl( 1, 10 ) ), 11 ); // Q0 + temp16 = shl( temp16, s ); // Q0 + temp32 = Mult_32_16( roomAcoustics->acousticPreDelay_fx, temp16 ); // Q11 + preDelay = shr( add( temp32, shl( 1, 10 ) ), 11 ); // Q0 #else preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); #endif -- GitLab From c39a21cea262db5d4fb091c17c134b3f59c58573 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Tue, 29 Jul 2025 17:05:49 +0200 Subject: [PATCH 1298/1310] fix MERGE_TARGET executable assignment in regression test jobs --- .gitlab-ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 842aefbc7..e8acbd24b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -800,7 +800,7 @@ stages: - *build-merge-target-binaries # need to restore cache again - *overwrite-pytest-cache-with-artifact - - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $DUT_ENCODER_PATH --dut_decoder_path $DUT_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true + - python3 -m pytest --tb=no -q $TEST_SUITE -v --keep_files --create_cut --html=$HTML_REPORT_MAIN --self-contained-html --junit-xml=$XML_REPORT_MAIN $comp_args --ref_encoder_path $REF_ENCODER_PATH --ref_decoder_path $REF_DECODER_PATH --dut_encoder_path $MERGE_TARGET_ENCODER_PATH --dut_decoder_path $MERGE_TARGET_DECODER_PATH -n auto --testcase_timeout $testcase_timeout || true - python3 scripts/parse_xml_report.py $XML_REPORT_MAIN $CSV_MAIN ### compare the two csv files for regressions @@ -1496,6 +1496,7 @@ check-regressions-short-enc-0db: - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_DECODER_PATH=./IVAS_dec_ref + - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - LEVEL_SCALING=1.0 - rm -rf tests/dut tests/ref @@ -1515,6 +1516,7 @@ check-regressions-short-enc-+10db: - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_DECODER_PATH=./IVAS_dec_ref + - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - LEVEL_SCALING=3.162 - rm -rf tests/dut tests/ref @@ -1534,6 +1536,7 @@ check-regressions-short-enc--10db: - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_DECODER_PATH=./IVAS_dec_ref + - MERGE_TARGET_DECODER_PATH=./IVAS_dec_ref - TEST_SUITE="$SHORT_TEST_SUITE_ENCODER" - LEVEL_SCALING=0.3162 - rm -rf tests/dut tests/ref @@ -1553,6 +1556,7 @@ check-regressions-short-dec-0db: - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_ENCODER_PATH=./IVAS_cod_ref + - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - TEST_SUITE="$SHORT_TEST_SUITE" - LEVEL_SCALING=1.0 - rm -rf tests/dut tests/ref @@ -1572,6 +1576,7 @@ check-regressions-short-dec-+10db: - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_ENCODER_PATH=./IVAS_cod_ref + - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - TEST_SUITE="$SHORT_TEST_SUITE" - LEVEL_SCALING=3.162 - rm -rf tests/dut tests/ref @@ -1591,6 +1596,7 @@ check-regressions-short-dec--10db: - *set-reference-for-basop-port-branch - USE_LTV=0 - DUT_ENCODER_PATH=./IVAS_cod_ref + - MERGE_TARGET_ENCODER_PATH=./IVAS_cod_ref - TEST_SUITE="$SHORT_TEST_SUITE" - LEVEL_SCALING=0.3162 - rm -rf tests/dut tests/ref -- GitLab From 2a5a43ca6eafc846bb80c3b32f1fb3b2e561ab80 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 29 Jul 2025 22:31:07 +0200 Subject: [PATCH 1299/1310] fix sampling-rate dependency, BASOPs --- lib_rend/ivas_reverb_fx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index bd1634c77..5156911f3 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -2447,10 +2447,10 @@ ivas_error ivas_binaural_reverb_init( } #ifdef FIX_1831_REVERB_REGRESSION - temp16 = BASOP_Util_Divide3216_Scale( sampling_rate, CLDFB_NO_CHANNELS_MAX, &s ); - temp16 = shl( temp16, s ); // Q0 - temp32 = Mult_32_16( roomAcoustics->acousticPreDelay_fx, temp16 ); // Q11 - preDelay = shr( add( temp32, shl( 1, 10 ) ), 11 ); // Q0 + temp16 = BASOP_Util_Divide3216_Scale( 48000, CLDFB_NO_CHANNELS_MAX, &s ); + temp16 = shl( temp16, s ); // Q0 + temp32 = Mult_32_16( roomAcoustics->acousticPreDelay_fx, temp16 ); // Q11 + preDelay = extract_l( L_shr( L_add( temp32, L_shl( 1, 10 ) ), 11 ) ); // Q0 #else preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); #endif -- GitLab From 1d6f700a00654dbfb4962aad9b4232c7c3d8aa23 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 30 Jul 2025 09:54:31 +0200 Subject: [PATCH 1300/1310] add tags to regression jobs they were lost in the forest of "extends:" .... --- .gitlab-ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e8acbd24b..b33cceacd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1492,6 +1492,8 @@ check-regressions-short-enc-0db: - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc + tags: + - ivas-basop-linux before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1512,6 +1514,8 @@ check-regressions-short-enc-+10db: - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc + tags: + - ivas-basop-linux before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1532,6 +1536,8 @@ check-regressions-short-enc--10db: - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc + tags: + - ivas-basop-linux before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1552,6 +1558,8 @@ check-regressions-short-dec-0db: - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc + tags: + - ivas-basop-linux before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1572,6 +1580,8 @@ check-regressions-short-dec-+10db: - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc + tags: + - ivas-basop-linux before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 @@ -1592,6 +1602,8 @@ check-regressions-short-dec--10db: - job: build-codec-linux-make extends: - .rules-mr-to-main-or-main-pc + tags: + - ivas-basop-linux before_script: - *set-reference-for-basop-port-branch - USE_LTV=0 -- GitLab From e59a587856772bae4f7621cfbfb3346d52d4434f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 30 Jul 2025 10:00:30 +0200 Subject: [PATCH 1301/1310] ivas-linux -> ivas-basop-linux --- .gitlab-ci.yml | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b33cceacd..d48b9d67f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -448,7 +448,7 @@ stages: # templates to define stages and platforms .test-job-linux: tags: - - ivas-linux + - ivas-basop-linux .test-job-linux-compares-to-fixed-target: extends: .test-job-linux @@ -461,7 +461,7 @@ stages: stage: build timeout: "2 minutes" tags: - - ivas-linux + - ivas-basop-linux .build-job-windows: stage: build @@ -1001,7 +1001,7 @@ uninterruptible: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH when: always tags: - - ivas-linux + - ivas-basop-linux # --------------------------------------------------------------- # Validation jobs @@ -1016,7 +1016,7 @@ fail-pipeline-if-in-draft: when: never stage: postvalidate tags: - - ivas-linux + - ivas-basop-linux script: - echo "Your MR is still in Draft state, set it to ready to be mergable, then retrigger the pipeline." - exit 1 @@ -1027,7 +1027,7 @@ check-naming-of-branch-for-main-pc-merges: - .rules-merge-request-to-main-pc stage: prevalidate tags: - - ivas-linux + - ivas-basop-linux script: - *update-scripts-repo - if [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[skip[[:space:]_-]name[[:space:]_-]check\] ]] && [[ ! "$CI_MERGE_REQUEST_TITLE" =~ \[CI\] ]]; then @@ -1044,7 +1044,7 @@ branch-is-up-to-date-with-target-pre: stage: prevalidate needs: [] tags: - - ivas-linux + - ivas-basop-linux script: - *get-commits-behind-count - | @@ -1065,7 +1065,7 @@ branch-is-up-to-date-with-target-post: - .rules-merge-request stage: postvalidate tags: - - ivas-linux + - ivas-basop-linux script: - *get-commits-behind-count - | @@ -1090,7 +1090,7 @@ clang-format-check: ARTIFACT_BASE_NAME: "mr-$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--formatting-fix" stage: prevalidate tags: - - ivas-linux + - ivas-basop-linux needs: [] timeout: "5 minutes" script: @@ -1173,7 +1173,7 @@ build-codec-linux-make: extends: - .build-job-linux tags: - - ivas-linux + - ivas-basop-linux timeout: "10 minutes" script: - *print-common-info @@ -1191,7 +1191,7 @@ build-codec-linux-cmake: extends: - .build-job-linux tags: - - ivas-linux + - ivas-basop-linux timeout: "10 minutes" script: - *print-common-info @@ -1212,7 +1212,7 @@ build-codec-linux-instrumented-make: - .build-job-linux timeout: "10 minutes" tags: - - ivas-linux + - ivas-basop-linux script: - *print-common-info - *update-scripts-repo @@ -1226,7 +1226,7 @@ build-codec-sanitizers-linux: - .build-job-linux - .rules-basis tags: - - ivas-linux + - ivas-basop-linux timeout: "10 minutes" script: - *update-scripts-repo @@ -1662,7 +1662,7 @@ ivas-pytest-enc-msan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=1 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1673,7 +1673,7 @@ ivas-pytest-enc-asan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=2 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1684,7 +1684,7 @@ ivas-pytest-enc-usan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=3 - DUT_DECODER_PATH=./$REF_DECODER_PATH @@ -1752,7 +1752,7 @@ ivas-pytest-dec-msan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=1 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1763,7 +1763,7 @@ ivas-pytest-dec-asan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=2 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -1774,7 +1774,7 @@ ivas-pytest-dec-usan: extends: - .test-job-linux tags: - - ivas-linux-fast + - ivas-basop-linux-fast before_script: - CLANG_NUM=3 - DUT_ENCODER_PATH=./$REF_ENCODER_PATH @@ -2054,7 +2054,7 @@ voip-be-on-merge-request: - .rules-merge-request-no-draft timeout: "20 minutes" tags: - - ivas-linux + - ivas-basop-linux stage: test needs: ["build-codec-linux-make"] #, "build-codec-instrumented-linux", "build-codec-sanitizers-linux"] script: @@ -2088,7 +2088,7 @@ renderer-pytest-on-merge-request: # TODO: set reasonable timeout, will most likely take less timeout: "20 minutes" tags: - - ivas-linux + - ivas-basop-linux stage: compare script: - *print-common-info @@ -2148,7 +2148,7 @@ ivas-pytest-on-merge-request: # thus, overall, this should save time timeout: "40 minutes" tags: - - ivas-linux + - ivas-basop-linux script: - *print-common-info - *get-commits-behind-count @@ -2641,7 +2641,7 @@ complexity-osba-in-binaural_room_ir-out: pages: stage: deploy tags: - - ivas-linux + - ivas-basop-linux rules: - if: $UPDATE_PAGES script: -- GitLab From d93277c1f0fd62bfe882a9f566c0cc7ce307f3cb Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 30 Jul 2025 17:12:24 +0200 Subject: [PATCH 1302/1310] fix missing TdRendWrapper init went missing due to a porting mistake --- lib_rend/lib_rend_fx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_rend/lib_rend_fx.c b/lib_rend/lib_rend_fx.c index 619c4a8b2..1fa9801e1 100644 --- a/lib_rend/lib_rend_fx.c +++ b/lib_rend/lib_rend_fx.c @@ -2725,6 +2725,8 @@ static ivas_error setRendInputActiveMc( setZeroPanMatrix_fx( inputMc->panGains_fx ); inputMc->customLsInput = defaultCustomLs(); + inputMc->tdRendWrapper = defaultTdRendWrapper(); + if ( hrtfs->hHrtfTD ) { inputMc->tdRendWrapper.binaural_latency_ns = Mult_32_32( hrtfs->hHrtfTD->latency_s_fx, 1000000000 ); -- GitLab From ec0534a067a296eb648fa37f58e650be016d7420 Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 30 Jul 2025 18:31:29 +0200 Subject: [PATCH 1303/1310] - Fixed if-condition to properly activate reverb_with_bin_room_ir - Modified gain scaling in rotateFrame_sd_cldfd_fixed() - Corrected factEQ_fx calculation - Increased factEQ_fx calculation precision. --- lib_com/options.h | 2 +- lib_dec/ivas_binRenderer_internal_fx.c | 34 ++++++++++++++++++++++++-- lib_rend/ivas_rotation_fx.c | 3 +++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 929ae2b05..14fc1ef57 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,7 @@ #define NONBE_FIX_991_PARAMBIN_BINARY_HRTF /* Nokia: issue #991: fix using of binary file HRTF in ParamBin (to activate when USE_NEW_HRTF_BINARY_FILE_FORMAT and FIX_777_COMBI_RENDER_CONFIG_FILE are on ) */ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ - +#define FIX_1835_REVERB_ACTIVATION /* FhG: reverberation activation logic modification and factEQ calculation correction*/ /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index 68886c1ba..d6dcd7deb 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -992,7 +992,19 @@ static void ivas_binaural_obtain_DMX_fx( set32_fx( imagDMX[chOutIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); } } - +#ifdef FIX_1835_REVERB_ACTIVATION + Word16 scaleFactor = s_min( getScaleFactor32( RealBuffer[0], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ), + getScaleFactor32( ImagBuffer[0], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ) ); + FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) + { + scaleFactor = s_min( getScaleFactor32( RealBuffer[chIdx], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ), + getScaleFactor32( ImagBuffer[chIdx], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ) ); + } + if ( scaleFactor > 6 ) + scaleFactor -= 6; // Adding headroom for subsequent calculations + else + scaleFactor = 0; +#endif FOR( chOutIdx = 0; chOutIdx < BINAURAL_CHANNELS; chOutIdx++ ) { set32_fx( P_in_fx, 0, hBinRenderer->conv_band ); @@ -1012,7 +1024,10 @@ static void ivas_binaural_obtain_DMX_fx( move32(); imagDMX[chOutIdx][k][bandIdx] = L_add( imagDMX[chOutIdx][k][bandIdx], temp2_fx ); // Q_in move32(); - +#ifdef FIX_1835_REVERB_ACTIVATION + temp1_fx = L_shl( temp1_fx, scaleFactor ); + temp2_fx = L_shl( temp2_fx, scaleFactor ); +#endif P_in_fx[bandIdx] = L_add( P_in_fx[bandIdx], L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in move32(); } @@ -1025,10 +1040,17 @@ static void ivas_binaural_obtain_DMX_fx( move32(); FOR( k = 0; k < numTimeSlots; k++ ) { +#ifdef FIX_1835_REVERB_ACTIVATION + temp1_fx = L_shl(realDMX[chOutIdx][k][bandIdx], scaleFactor); + move32(); + temp2_fx = L_shl(imagDMX[chOutIdx][k][bandIdx], scaleFactor); + move32(); +#else temp1_fx = realDMX[chOutIdx][k][bandIdx]; move32(); temp2_fx = imagDMX[chOutIdx][k][bandIdx]; move32(); +#endif P_out_fx = L_add( P_out_fx, L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in } test(); @@ -1040,7 +1062,11 @@ static void ivas_binaural_obtain_DMX_fx( ELSE { Word16 div = divide3232( P_in_fx[bandIdx], P_out_fx ); +#ifdef FIX_1835_REVERB_ACTIVATION + Word16 exp = 0; // divide3232 gives Q15 + following Q16 shift +#else Word16 exp = norm_l( div ); +#endif factEQ_fx = Sqrt32( L_shl( div, Q16 ), &exp ); factEQ_fx = L_shl( factEQ_fx, sub( exp, 1 ) ); // Q30 } @@ -1405,7 +1431,11 @@ ivas_error ivas_binRenderer_open_fx( /* Allocate memories needed for reverb module */ test(); +#ifdef FIX_1835_REVERB_ACTIVATION + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) +#else IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) +#endif { IF( NE_32( ( error = ivas_binaural_reverb_init( &( hBinRenderer->hReverb ), st_ivas->hHrtfStatistics, hBinRenderer->conv_band, hBinRenderer->timeSlots, &( st_ivas->hRenderConfig->roomAcoustics ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hHrtfFastConv->fastconvReverberationTimes_fx, st_ivas->hHrtfFastConv->fastconvReverberationEneCorrections_fx ) ), IVAS_ERR_OK ) ) { diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index 92ad8d36f..a2b55a19b 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1173,6 +1173,9 @@ void rotateFrame_sd_cldfb_fixed( IF( hEFAPdata != NULL && ( NE_16( extract_l( L_shr( hOutputSetup->ls_azimuth_fx[n], Q22 ) ), azimuth ) || NE_16( extract_l( L_shr( hOutputSetup->ls_elevation_fx[n], Q22 ) ), elevation ) ) ) { efap_determine_gains_fx( hEFAPdata, gains_fx[n], L_shl( azimuth, Q22 ), L_shl( elevation, Q22 ), EFAP_MODE_EFAP ); +#ifdef FIX_1835_REVERB_ACTIVATION + scale_sig32( gains_fx[n], hEFAPdata->numSpk, Q1 ); //gains_fx: Q31 +#endif } ELSE { -- GitLab From 8c599303f5166c32a98ccf881cf42253db60e5e8 Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 30 Jul 2025 18:47:47 +0200 Subject: [PATCH 1304/1310] Applied clang formatting patch. --- lib_com/options.h | 2 +- lib_dec/ivas_binRenderer_internal_fx.c | 10 +++++----- lib_rend/ivas_rotation_fx.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 60fd2e3aa..5257a5d6a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,7 +166,7 @@ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ #define FIX_1831_REVERB_REGRESSION /* Philips: fixes reverb regression issues */ -#define FIX_1835_REVERB_ACTIVATION /* FhG: reverberation activation logic modification and factEQ calculation correction*/ +#define FIX_1835_REVERB_ACTIVATION /* FhG: Modified reverberation activation logic and corrected factEQ calculation */ /* #################### End BASOP porting switches ############################ */ #endif diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index d6dcd7deb..e4ffb1549 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -998,13 +998,13 @@ static void ivas_binaural_obtain_DMX_fx( FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { scaleFactor = s_min( getScaleFactor32( RealBuffer[chIdx], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ), - getScaleFactor32( ImagBuffer[chIdx], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ) ); + getScaleFactor32( ImagBuffer[chIdx], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ) ); } if ( scaleFactor > 6 ) scaleFactor -= 6; // Adding headroom for subsequent calculations else scaleFactor = 0; -#endif +#endif FOR( chOutIdx = 0; chOutIdx < BINAURAL_CHANNELS; chOutIdx++ ) { set32_fx( P_in_fx, 0, hBinRenderer->conv_band ); @@ -1041,9 +1041,9 @@ static void ivas_binaural_obtain_DMX_fx( FOR( k = 0; k < numTimeSlots; k++ ) { #ifdef FIX_1835_REVERB_ACTIVATION - temp1_fx = L_shl(realDMX[chOutIdx][k][bandIdx], scaleFactor); + temp1_fx = L_shl( realDMX[chOutIdx][k][bandIdx], scaleFactor ); move32(); - temp2_fx = L_shl(imagDMX[chOutIdx][k][bandIdx], scaleFactor); + temp2_fx = L_shl( imagDMX[chOutIdx][k][bandIdx], scaleFactor ); move32(); #else temp1_fx = realDMX[chOutIdx][k][bandIdx]; @@ -1432,7 +1432,7 @@ ivas_error ivas_binRenderer_open_fx( /* Allocate memories needed for reverb module */ test(); #ifdef FIX_1835_REVERB_ACTIVATION - IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + IF( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) #else IF( ( EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV_ROOM ) || EQ_32( st_ivas->renderer_type, RENDERER_BINAURAL_FASTCONV ) ) && EQ_32( st_ivas->hOutSetup.output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #endif diff --git a/lib_rend/ivas_rotation_fx.c b/lib_rend/ivas_rotation_fx.c index a2b55a19b..5d2f393bb 100644 --- a/lib_rend/ivas_rotation_fx.c +++ b/lib_rend/ivas_rotation_fx.c @@ -1174,7 +1174,7 @@ void rotateFrame_sd_cldfb_fixed( { efap_determine_gains_fx( hEFAPdata, gains_fx[n], L_shl( azimuth, Q22 ), L_shl( elevation, Q22 ), EFAP_MODE_EFAP ); #ifdef FIX_1835_REVERB_ACTIVATION - scale_sig32( gains_fx[n], hEFAPdata->numSpk, Q1 ); //gains_fx: Q31 + scale_sig32( gains_fx[n], hEFAPdata->numSpk, Q1 ); // gains_fx: Q31 #endif } ELSE -- GitLab From 20cd84fab9f400d88e3c1a1e52471d8bf5c09360 Mon Sep 17 00:00:00 2001 From: naghibza Date: Wed, 30 Jul 2025 19:04:31 +0200 Subject: [PATCH 1305/1310] Reverted factEQ_fx precision improvement. --- lib_dec/ivas_binRenderer_internal_fx.c | 27 ++------------------------ 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal_fx.c b/lib_dec/ivas_binRenderer_internal_fx.c index e4ffb1549..d241cd145 100644 --- a/lib_dec/ivas_binRenderer_internal_fx.c +++ b/lib_dec/ivas_binRenderer_internal_fx.c @@ -992,19 +992,7 @@ static void ivas_binaural_obtain_DMX_fx( set32_fx( imagDMX[chOutIdx][k], 0, CLDFB_NO_CHANNELS_MAX ); } } -#ifdef FIX_1835_REVERB_ACTIVATION - Word16 scaleFactor = s_min( getScaleFactor32( RealBuffer[0], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ), - getScaleFactor32( ImagBuffer[0], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ) ); - FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) - { - scaleFactor = s_min( getScaleFactor32( RealBuffer[chIdx], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ), - getScaleFactor32( ImagBuffer[chIdx], CLDFB_SLOTS_PER_SUBFRAME * CLDFB_NO_CHANNELS_MAX ) ); - } - if ( scaleFactor > 6 ) - scaleFactor -= 6; // Adding headroom for subsequent calculations - else - scaleFactor = 0; -#endif + FOR( chOutIdx = 0; chOutIdx < BINAURAL_CHANNELS; chOutIdx++ ) { set32_fx( P_in_fx, 0, hBinRenderer->conv_band ); @@ -1024,10 +1012,6 @@ static void ivas_binaural_obtain_DMX_fx( move32(); imagDMX[chOutIdx][k][bandIdx] = L_add( imagDMX[chOutIdx][k][bandIdx], temp2_fx ); // Q_in move32(); -#ifdef FIX_1835_REVERB_ACTIVATION - temp1_fx = L_shl( temp1_fx, scaleFactor ); - temp2_fx = L_shl( temp2_fx, scaleFactor ); -#endif P_in_fx[bandIdx] = L_add( P_in_fx[bandIdx], L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in move32(); } @@ -1040,17 +1024,10 @@ static void ivas_binaural_obtain_DMX_fx( move32(); FOR( k = 0; k < numTimeSlots; k++ ) { -#ifdef FIX_1835_REVERB_ACTIVATION - temp1_fx = L_shl( realDMX[chOutIdx][k][bandIdx], scaleFactor ); - move32(); - temp2_fx = L_shl( imagDMX[chOutIdx][k][bandIdx], scaleFactor ); - move32(); -#else temp1_fx = realDMX[chOutIdx][k][bandIdx]; move32(); temp2_fx = imagDMX[chOutIdx][k][bandIdx]; move32(); -#endif P_out_fx = L_add( P_out_fx, L_add( Mpy_32_32( temp1_fx, temp1_fx ), Mpy_32_32( temp2_fx, temp2_fx ) ) ); // Q31-2*Q_in } test(); @@ -1063,7 +1040,7 @@ static void ivas_binaural_obtain_DMX_fx( { Word16 div = divide3232( P_in_fx[bandIdx], P_out_fx ); #ifdef FIX_1835_REVERB_ACTIVATION - Word16 exp = 0; // divide3232 gives Q15 + following Q16 shift + Word16 exp = 0; // divide3232 returns Q15 + following Q16 shift #else Word16 exp = norm_l( div ); #endif -- GitLab From 45e6092b0e49f16bc6b08fc14e3c8fad865fb7d1 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 31 Jul 2025 09:55:56 +0200 Subject: [PATCH 1306/1310] disable implicit fallthrough check in CMake build this is to fix build pipeline and align with the Makefile an individual handling of this cases is better, but portability is annoying here --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e9a9afe76..ecd8f11c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,7 @@ if(UNIX) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffp-contract=off") # disable floating point operation contraction set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic -Wcast-qual -Wall -W -Wextra -Wno-long-long") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter -Wno-implicit-fallthrough") # to be uncommented in CI # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") -- GitLab From 79920ac7623418fb68e81977b3a6c2a3286e2793 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 31 Jul 2025 12:56:43 +0200 Subject: [PATCH 1307/1310] set CI repo ref back to main --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ba4f1fe3d..8136fa46b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: # note: GitLab cannot reference variables defined by users in the include ref:, we need to use a YAML anchor for this # see https://docs.gitlab.com/ci/yaml/includes/#use-variables-with-include for more information - IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF kiene/basop-ci-merge-test-unified-config + IVAS_CODEC_CI_REF: &IVAS_CODEC_CI_REF main include: - local: .gitlab-ci/variables.yml -- GitLab From acc23d5056ef9e554f9621e8dc2e174608ddae7f Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Thu, 31 Jul 2025 14:49:49 +0200 Subject: [PATCH 1308/1310] move variable into CI repo --- .gitlab-ci/variables.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci/variables.yml b/.gitlab-ci/variables.yml index ddbfe614a..31d69a643 100644 --- a/.gitlab-ci/variables.yml +++ b/.gitlab-ci/variables.yml @@ -53,7 +53,6 @@ variables: MERGE_SOURCE_FLOAT_REF_POST_RENDERER_PATH_FOR_BUILD_DO_NOT_MODIFY: "./ISAR_post_rend_merge_source_float_ref" LEVEL_SCALING: "1.0" IVAS_PIPELINE_NAME: '' - BASOP_CI_BRANCH_PC_REPO: "basop-ci-branch-pc" PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 -- GitLab From 94b2ca0c84f45330244e81eb4d402d2557882e6a Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Fri, 1 Aug 2025 10:16:09 +0200 Subject: [PATCH 1309/1310] dummy commit to trigger CI -- GitLab From 7597ffcfde3cd6e13a55313dc3f165d7bcbe48ee Mon Sep 17 00:00:00 2001 From: Adriana Vasilache Date: Fri, 1 Aug 2025 12:09:46 +0300 Subject: [PATCH 1310/1310] fix warning --- lib_dec/ivas_init_dec_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index a3df9ed2c..80cad2c96 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -388,7 +388,7 @@ ivas_error ivas_dec_setup( } #ifdef NONBE_FIX_984_OMASA_EXT_OUTPUT /* this should be non-zero if original input format was MASA_ISM_FORMAT */ - st_ivas->nchan_ism = add( st_ivas->bit_stream[sub( res_dec, 3 )], shl( st_ivas->bit_stream[sub( res_dec, 2 )], 1 ) ); + st_ivas->nchan_ism = add( st_ivas->bit_stream[L_sub( res_dec, 3 )], shl( st_ivas->bit_stream[L_sub( res_dec, 2 )], 1 ) ); IF( GT_16( st_ivas->nchan_ism, 0 ) ) { -- GitLab

_n&{;fz|`1@GU;D;srF34?SE9(La!Qu{r%a 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�Ne1fd(1(o3-+fYkokZPoY{}@#5 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⪼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

2?(XMZ*hq$byJY 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%0DRm4mzn|d$=!AqK9lZt{2T`LA_{Dli^SEL7u=D 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

_n&{;fz|`1@GU;D;srF34?SE9(La!Qu{r%a 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�Ne1fd(1(o3-+fYkokZPoY{}@#5 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⪼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

2?(XMZ*hq$byJY z*B{^sKZq1GhJFOSI00V71-h60O?Rk3Crj6hG_chspb7>g)XmZr@Zu5VHan0_P*o0? zsvxpFU=1MmgU4J}AnW7-na>8QcVAln2YK*DKsRWOQ8A=x6!78~I8m~6x}E{oMcttn zf?lM7myL3Cx?bpZJrj_@z`(%#q6uOuNFAs+?)E(s_`(jR?nig%kDzYX3jr^>AuW-B z7eSXnk;(!d)?$270=i^Q3Oshm6!2o%Z*Urf%0+-GE64_H9S1*#7ae(^R(*W)5eMrx zFK*{SN;Q6Y&>4^nCJufKN1*L`2M5e{J$OGg0~7du9tO~U>ITGq>V*!s=P(!_?R5Q< zB?3L1x7$}B@WqP^O;BY3x;aS%)OhRdjREZ|dSQ?S5f|X!A8HcxBJeiIL(p9AY5~sC zwlFbJE)TWg-_I2ALK7x-0d)TjIOBkFGk^GjG=5>%BQH8Zl~Y=`uSQy@?+b8JegRF& zFZlPnzTn^Qt7CnzUNwu6e}CwUZdU<1Kygm#{ z-6H(k1%qBJJ_mMPTBqxQZr3B+t|v;}K#N{|H9+}MC+Njxh&-qX@}eBd-hU!6Lvce9 z!wa?)kf|IHQ+LUOFDD5-@M1rxa_M$G5zy^>B=ALJ5?B%Fj1m6rp-+OkVGVargpA4@xKqfkC0$_f5B85GY3| zbi01&<_LVTDhcf8pnw+w@gSB!XDcY-bxvggO@D*Qpl+~GzzaJ__@s5VszCP5fT+N3 zR7H|eAY(wmIX?l!;^5!!`=YZ2a<_^N=mI-N{_RsiIza)<6Yyfi8Iae&v)nJ1*i-#6fb?afPJ=pM~bu%}&LK+85z0(=23+a@qEFu)41 z7u_x3lU@T}`~o|Vqq9}u-~a!eQ$_wkSNVcm**yj9%AgllVTw4wia@b(3;yjbp`eTw@Zvb^qB%&g?Du`azkP}?NFiun0?4NUFNC2U+kPUjdn(Ahpzc2mnHDx zN7dQO0YwYvqpMm*rf zL-2$LM*t*?f1VF(Cu@UTbsXX?9 z1^@OQS5Wu{zG#A3djTxb-2+~$9{3^)YAwiEc%mtV+inRq5>&E5T+j(gS1{4EZir7o zi5Fzg3vZBH%s_5=8UFYGfABR;*%ukox?4m+@}P}`pkf|0E)5k1rJJ;K6=VnKkS1-AHZ>5T2)Yu_722Fx0xsS;0$yl?`{bbJOn2xRa6!%d;yCDj zJ#sUWweb#^s@&o2gDE%(v~H0Hqwvm@{$ zIPxKOboWBmpYcGF8)zFB_%KbFVil-eFS=*I+BXg0V^Oo@UU)!U1=5qn1nvnY1ig5C z1nSfS0WZ`c3P6JjU_)PsK?FcLV4bN3P-m(o@Wtt=AoF=3uFB%-o(ghT&ba2iVMYy<~r3FH>Msi4Hsda1;62k6}Yv`*IrFQUNL z*v(-$5F`4+@BRP(JNunL2jKa>dEo%MdJc45cv@%Zix);96JDF|Fb)PuyDoU42-Voo zBKJZRq!A+H`{o5ZNaL(Xkh;(pFMhs*tUuuifK?vg;p85HHU`iw+Pe;e0tkF&=!<_~ zHaM`rr>TI)KRNifw{U^fLi8Ve$N(Nxf{MMU0_%aazV?CHApIAR0)zuB3L30m!oS^D zCGf>{aN=Nr#978_Ed~bgZNcCXWDfrAQy6;~7#MJH5b>UPZt==L=TgrvI0Lv>8x zZ~)~@)*8?aa@}C1kP$eiFwmStcc4K~H@JLa{RUA1+8y0^a1kQ|Ltyt*Fz3)BaCo}L z1ibijLx`dIh(Win3#c1#?+s|)p5a9rxb|RyEbGo z3v}=r3s=AkK1d%Ilu@(fUKAVzMHDEWPe6-0u5R$o>+TT7fS?x-!DSYBvvQW)3un0E zBe0ucP6WN!`vzRbfO=`*t`GRem=i%SN)h5OW4Bd>{%z z-N2pP;0W>sm#Co|pnc2@kYbdBe?RzE73)L%{h;WAi0Xg~R|^z}&VpEx*6DhJf4}br zNRW2BbOi*w;D;$Z0Xlb~5U%hD|Mt)$pw7vOfETY{Lw$525ac7c_+o_ki{lWTAYZ)D zhOt45e0>iDzNmsI1o`MCXk$l~7`Siwf(fD!B;M_+(|kaq6MXIhB*dE!R&@4)&Q{n3 zx(z<9GZY*Mt{b3zoDE=~fKONi9jOJnD{&5JIm^_esFuTEbU3N1Cbc6dqpdlxJnC6b=+75J8umcAr=tvzfI(_@Z4kde0v?n#X9USoD-6UA?1wRH0yrJRR3s5=02y>hHd60TYlW+E35F3=KL1P+sf?#T# zPlCk*UTA^SAvj917`vf|PqjiSY={H9!6#=0y?6j_q<~c30H5g!Q~U$ca1MBJ9~{Ua z1rK0551$0QusjR4soU2ARAgzt02RoP6Nm2vy!f*RED4H>EdCesAUtUMl;H)qS;oJ; z19bjTU>4Vla}aq@LIc%-`@s_3p*p>w0msI9py4hKNNiDR| zWnbiC4%G>I;Rn+KI-3Mq%VaTvnl!!%fiDDLx-JC02!XK=1Y|M3U;`H%py_}!FS?$C zJmh;OFe?R`L|$wMhXYURff~@c+-Cx^Qo4IVHUz$y3zMl81Vwx3l^4>_L37&|A;&^M z4?!*mhZrROZtn&M5F|f^g5nQkQoxI5NG1$;kp)h*pg?~Ds|d{@`VsjDT#E+0@Q3L! zgX=-gLK7g#9h8M&Vetia{Pdlm7l9C$fV0roU0_#%qK$ul=#!uqQ@|tNJOM9mgVP(x zIae|m0>Jx5uLQhU`V3r(f;QFiZ}+_t2p)2V6vh18n-+m8KJZ8lEIkCg*bGioJdolr zt+NrNW)}koxJ|U@#nY#tafDWIYwSQN|4xX6@17TDp8o$o0Ti_0<5OPj1*zNax+ef) z4*&LvAajCVwD!R>613qCISH;8q&-UnqPqED0JH`UdeIULN?bfyB9OWov<4m|{UQe{ z&cMGtR3YdENPqJY&@c%RRH*0tQQ_T;gR*?4>%G* z(enW^eIEMb#f&GQ&4aEVz&F@*KLLd-cp-c1$vP=eP=@|^QTpWn{~e(AG+0gg6Yzdt z(DdpXaFSx_1mBRD!2lAv2^Dgk09vo^09xj5_T>M6(6o8$1yJ8g1Ed|arlA{l6EMNr zt(}d50hTQ*cYwW<)(O7hfq(l{(3K9L{!sy>UjPYUXwX3e4%7|ncGUn4MZeGl2OUo* z_`oPwtq92>;A$1z=IUWk14V|ttx~GEf6%OhK+ZFKQA53BjwC3yum%=Qd0`0}e?NEP#MxS9d=Nw4e zJK#k#ILCn^4pejA0oUU%>L9Wpi$Isz+Cxl3f{};5jsCQ3?$raFNfy9W({!4sj{S)v!kX6lgHHP5>|K0*5!aRomS&0Thsd zFD^mWH9%sAe|zW$(6HNvZeI;>n{5k37T&jI0T+}|7eFJiJ2WNeMfW3c*dk)86B1J| z9)WL{1E&d45uJPp9GVd8puG-g`3!C=LK?PH8kc~Y=r2UUEe;;&ts^0wC|0;ZqQ+Bg%C9XFCyS3 zJmBB%`T*3~eG>R$6QoK9mG0oCS2sAz2E4F>tlj7Y@A8BO6u8yJzuomtz>DauV8?<= zde}jXE5OYQ9!Q=CudPDFMt4gWC`1EZJO)n#b3lyc-|qVbG`PC~mIseQWZ`E!ih>J2 zsA}kj({A6Cz!!5KfI}FZp1@Jo*)kDi!HduL|No!xf){iTAIF3L|3OEqgl-6W!P5zk zufw1^RgizX>xO_AsU2`((2QrdFGurEXlDlI#zFo4qrG)*oj1TV5kgB(Q#mI03m z@Nb{u_=6FAcq8Q8truon;DPj_3d{z@-x);CITO(B>j0kT(gx>Io^D?UP-{r`KB%+} z-2gfBDh+ZNSXyUK0Lc6o|3SCDz0kam@SZNhANioc9nj%M8vMDlO%1yu)uFC-vUeOf2DdUy$19s`dM zMr5b*!>t1ujN;TQcR{T%m{YSDUp&r-c?;wiTu!UqgmBtHFdNlrwcv~fx_ubr)R*Bu zLF?CkgRBab33|cb1`YNSWk}U`57L(Ibe#a;jgI7Mbw?f^)-vSyC zfw!xaSQr=rz%32_?GOtf2R=`SneGQJWqBYP(mIF+_LL7q;CYS*7>(X90F)D(mGq`fTj)^92gkT#@aw}5b(kXVkV>l0^dyy9=bvdzk!uOtF{*=VEdr0zZYh= z|NnnscpI{R!Ur^`|Dt(4*xGJiA5gjR^cJ|>kZHYCXVdNK!oQ!R^<=$D257JmTFJeb z1hyaSgBR19p$Vjf57Z{}0kz2%-2xS$XKsPcHv%oOe9-MH z!M|OEF$m5TL2$t%!V>)3S-2ph!PyrXx?M&1xAO=DzW9(0Dl$bNDHd8{LYvW`I~PF% z^MNm-A%%6oi%YQf1o&Jq{_T+Kt+Npka3)-~}r(O%>N+0RkTX;{gwrAAH2p?J5Bdcmy935n%qsM<~)DE=2Z)XBH@& z2t?Bs@bDB*zzc0irzouxd=er5cF3W4Sqv{8U4yv_bWGlk>)<8(u76&1UHktZ?r|~5 zb+%x=0WbXPVL`@^2;wNv1$F$}LCaym4SxRZ9Uxtxcmf$5^x|ha$i0Z3JV^G1%C-Oh zA(NS~*pYz74oFkriz84?VA-_JCXnol_g9e;14smslt6|CyjZsioFvj9Cn@fP>;mxp z^I{uFBiJbZ?M+fpi*)|~{~!3myAJNBU7&SgX`P{eUbKO3v4d<(07o+a_K6@}pdO8P)T4y6j_C)}0TS~9O0vmMg0;Im>-wxg<0cxJh1itvZ66SQ!$N{L^J#`1D zv;6xCsL26ZG7lY0crmjU=3*i66jxejFIeS8&|PpDpm>Cv&jIx+NIvjIK^i0?zyXog z*#we(F&kt)SQ9MvxIk4t?4-UI)=*6_pMqpxq+R*{A8rW~#1c@+tcT(WRJZUzlz|tM z1ipBZis}}S>7b~E8VNL=`z1D!c2gHTmzjF^XW1KU9X{bDxgM!RX3|NjS{nE@Hy;osf?3Y)+edNr`11|5t54mbYo zO#&dNy!f;nIl`b;bc5Hfq;*aNsd-_487aMfVPaqi1fOE^LL8DzAq6e0zJ3H21QlUm zcNv59y3T?0$G^ecQOeaF>H@Bv>J-3(I~ky;g*77T!F@GQYZYV!BtX)-!DCQqolPJI zyjXJyl$;zG7{HAYaOuwhpL}~!2Z=w3!@zA8a9M<7j;;ahVrZKMT2X*w2s}#&^VckJ z0R)1;L#+|$(t{3UBu_3H7mfeM5K@G zz>RFsxb6FArQV<`BVE94QFpjXGsscg;GD?6eIh7{1-;OKNtbALgHkYb zD8&$FR0(|Y0vv&opgZuu2_vl&oK|13gYM_s-wTp$Jy|NyeCmH%CpcrhcniAm4K}O_ z$#eYMCw>B-SeUp3>_dnsXj=p`149-YBp2{+ZvrU_cp-BETo9uwVn9=L{5+;2{_Rsi zMSoBhGrWudl_r5NcEJMn0ud#GfCx&d;L`QQanMC@p+4Ypq7+_9fXajyYrwa`!Adfa z@t}S>NGkBfg>ztUgBF?n|Nnm%g8``F1_}4lbD&IS1UkVP(zfpawe166@Rmc92lSA9 zkU>E&wl4<91T;F~;RUKF0$#`Lj2(3{I%V2JUr#G<5m7u%gz~u+%#ON2Z z&i?=Z;^^7`|1*riVx{dO*5CvoHMHTOqAuEx2xN)DRVfOTgm;Y>p(zSpMy;AP#8c z_T>Ul0s+mTfX<%f-wrv!k$?MCkZ(ar1r!LNR0|40P^JMzLC}j&kPF_x8RHm?eIoG1 zE*Sel(2I2tHZ)kbpYXsf9@nSMa<5?E4Mo?)I@WK#NBUoi7T%!Ug<3*kN z{~vsx-HQegs~SX|AJ3)G5a zJzS+>1_Nf{GXX9QPf%bNoj3`a0|Z?Xrvh@|&Xe#C&3-@&(?nPU%e!D@i6C7_$rB_P^uqfTtPln95x1Iv&s7b4;RBHd4M*^A zZv{m?C?$i^PT&gz6gg1r2E6!l5^Nl3`2B?diaf~pfERZV@}Nca|3UYYy?}^;R_Xr- z7mA?N46+6kI-m>#@^sLPgAirl3^NtN2CegjF5m41U2^oI_5{44zaLzKwjL-If~9z{ zifGVXcHr~}y87aU59nGw(EWBVicWw+ksqnb03Dr51|lwkh%+GKIEXj|BKCra9Ux*eh*$?AR)UBn$N&G&X!S<&4Wx$Wfm^MdQ7DU1 z2EWaRI+wpy7_>8ai2(xx+>0O+f?k|LC;>MXL3{l?SXxh(DrbO(PT)-wNTEIlq52T0 zX$d<4txh?^7PMOx)`L7UvWO2}ouX#{^ml#4?h%k47{2ch= z8eAHlbHOph2fFJHTs4CZ;C=D`=>PvOw2uA%|3Vc+C>;C$A2RR_I#3w2dA1L3PDvIk zyqy7ZVc?5JaJdMaqmp&ApegG@&6jFD>xAZyjTGfI|0%Qa%Iqq5}4S5fEOK5_Wl!~L$7Vv7#Lo(9{K;Ai@(wxPS$aS$N{ zB6vXr2Z&$>5&sT@HuK~lWkXPU3wV*11C0m%7SK{kQ2c_+x4;)Ru#n_$=>X>tP$q&k zk3oYH0WUORnoGsN8bL)%;0tD$#**L+1`Q+|K?5WKFTP|$Z7eYX_rwsH9@JL>PX)bT zm;p_FCjws_fvM+jT?We65GU+!0-rW}pwul3v4RDZyn|jGhG{6#g6G~6d2pW{ZkG&b z^zOw>n95Rr{{7&j0Xo!T9cV&uKR6UxPnMd39SJWQ%-~vNvI5ZZl^0B|BySgFMF{w| zp%+1iV2442EAh0>Mv&WISRVpa#-L67SQdFS{}icJ2F>k)XZgVTx=RJRMW%I5X$0L| z^MV(o`}K*JmzWtCuoWb|S+HQXLLZwIw@tYH?F7G@ctMZG^vuEZ@%4sI1Fngd=K!{xO2VaW=X z9wCW&dlM)<2E5>esVwE^-`@)^6i@QE%mbb70$EfKNl#1%{{MfW3nDZ?gffVb0}+x3 zz>P~#>jQMs#Zu7th!H%^LvlxH1}wx|T0z+we0v~j9n=IGL^}i0_kqr2>%k?2c6osBUxoO^Z2$lN6Tpo}h&y4KLk=Vk zsztD^?*;E+1i2oRK_E_oO}v9eAUkVcWIT?ya!3m5E3@<$Q{r~^MW#9k*89Lw5SS zCc(4wPK1(`prR8J&HKUU`?Q|q?*p}bb`}2p4;n-Q*Rd=1f{G;2t(@Q@34ODUNNp-; zp>s;W3;B6qmxFeb!Pbqpbb-Pp;6)1D!)D<9SD0b@;vsl88nlNJs<{)Q`Gp0@{?~2b zb`Gd!ej&aWTMq?NxI#w6zU~37xC2dV!95SkOrYK{$b^6wQ~V&~>EPH)>udzczSs}a z1=-+rqRx-u#e0452CulrBcL5r)^A?e8Nl{+f%YF>sPkjk@c;jR5c^}D9|LH;IOt5h z7j;Pc)HC5*u|V6gK<5oLzFEP@zyR8h6#?3^n1yve7U;IZEP4Lzp$0)OI3|LF71R#N z0BzuWu^pC#K{L6yw`no#0o~SJ!cfB3?OM|9!O;m`)9{)fX`dHp^#pijVPHsF=Ty)t zkr%r_H^_nau7huvdvR(v#1#J4hoD<8_kvu;z~6F(k%0jeBd&YE8@TpBH*oFY-ygaM zw1LYIw4WVx!J`joy&5F>2SD}+1-|$u2U<2D0J*=e6I|TA-UYhO3Y3lDanZ5|{a2fVnN1lm;vlAXZ6J#*VcK-i=+;s(b&(^G+|NrlT?AZ!^^P*?x|NlEc%P2s{48N!Ynef_t zCv<1lnisiHji5bSi6D&-nb0>cf|uF>vr9c*6F(Ch13pk{JsIj@0p+%yAxpX%fAD% zL(6r`i*KO2%GB`^gBo3-a0$_p% z0$yzC0vicZ@FD`j2Cc8%wV?hd6jMnd^-gyFgdUE!_&L1QsxqM0fix2ztHQ)sk++hzudy9HO4g;lGgP<4BJE4{z2za3lxBLdu?j%!i zB!dcH&?;;2N#b_`U;KyZ19iS#4FX=gg9(6+LU4UDGbrH2X)#b>Ll@h2P6ciL=mwKP z-QZP)(Cu1*knLMRFRWoz5h#syP6h4LhOE&B9iIVS<=zcW4dBg6prrM359pX8u)?5j zaLNpL5eBZQK+e4bUh&^VQLeO=g3gBhvFOEVC1w}V3H6+1=4g|aigRns+ zgXc-Wo1`{w1{E~$okvX&H6SCpLmPr#6hT&~L3ducwgkLT08giL1iUDZg_TM0K_IY+ z@tgnupU_;}z)&iE+_gdF+N0oI`ru?1dgDd#=Kud+*nt%ELeg-zZ$n^rXiLzGO33o* zZeJVFN0s|Kb`<^gzIiDhM08fcOsV4ma=}@!h^Uy&{dBQ$ZOS zw%3!{SEmyk<49!>lnKhtFLrJE|Nq6-O`s+*sF#jWpp@8bMiHFT5c3&#?Yb zYX{me2C@rWw1CP1P>%w9_Rte>z%_r)vFwAD=*SO7vH@u1lQ@W z!07?J&J?y^@j6WCLeL9q$cO`I+W~Zm2N(8!HEz-JuuYm4uyt^Kp0}B{R{J_;7Q|p0JW&ZuXSGq$B zI=u>BoLvt;*0~_9)3M^k8jyz9iv0USuXMW>bOw~XShfED|DE8IpF<1MI=!l1bb^#1 z?Ol7h9$ZzT?_C4c{HS}^93T-I@ZvkTgTn)X* zW1ySfAWQJQ!EwO?*~tnKvVaP?&H)|W4&F#V6?EYoXi6MB!`Z&}|9?;pbJYlV5e;)2 z?5r_Jdz%BY{2O#SWH-3zP3y$ga|ErC-VeT@*!m)W{~31B@L{M1XtUa3aB~9G1q6i~ zq}`?hJ_nBz(t?2OhUoTP5!f9%C+LMTEW-I)zNRxV+qs- z0X3OG8`I_lzUYOl(Cu{XfF?U|a{$uv*w_HF6kN7~H;glaQy@>L>m1mYv^|g}I($o- zJ=`?dezZN^zAE7UJ!r@I1MnIYo=(?}Zr_f;?x~>BiJ%u;Yrw$>jxliaAGQH4aW$y> zu_B-wx`(u_# z#26@YzJR-dAU>!W3)*3}Am{}@O!YT#?1N;HcbEmh#}YtW6rTh^x3a&uu^MbMDAFKB z1~?5swwL{>1IvNx>h92vpcg(fL44?u1hBnjh*S>R`W5h^9d00OW7(c=R~69aPOupo z;AjQMn`=ivcP}X30$&8J0tY5&JO>g5u$^QpSAzNipuS}pXgG4$N>F=fC3Mf#o}d>y zgW&NP3L3o!Z7JIm@InY7YzK;7q&}%0NEzt(LzuH(Tm{(yI>D&}?80f_kOGAtXe|1+fQ-mw$-THx3kn;^Ni9bp?6gkTDd0IDe$Xfn|9;mA0WV&H z^8v{F89O5w7(i+FMJTxA4L-7g6YK&Pm}S{u)u8oMA)tOHIDvwO#4tCx1wyRk-+m(S z#Z)jGrzZZ61m^Ha+3mGS@*(a1tP#b0^tEZ6?E_t zXp`HXfESDiVNhoswh93>{`ul6=r*_gp?kVrRhn%kFz~nR01p%NfHob11VL%z#Rf>r z0+gRYNlg$waDo&GI*{xb@M5w*_DJxqK}3Q*gpDl{Qoy+lH4-kY0BZ%En*oW0{or;I zN5G3`;9LNT1dwk)O)=MsfEOG5q2W;C3LRVl^>x4t@`7F*t_B+h9ztRVy8~P>^KYLD zs=|U^90q4#&{|*+AAA%Pcmg7=vlX;t_{HL7ph)qBX07Hu;BjpR{+7F-fCG_g*PZ=fz#CSI`bOy`YDyXk61ig3&VIzgE>l9F(HzDu^8#ufWp$m%6BFK7dNa%u!??jlb9k9d- z_Bk{t`L~1D*CR&Iiy+qVgOc|)FdMur8@7VyMG-j9!UI(32WWW7|I79@4>%4R3Zqn6)<`!xL8W-1aF$;-wvigi*-QT76V`Wfi@Fb zK}Q{c7eDZC53LA#F~t{ZAAbvIn_ULzI00zw)}aAizz;GZ2(n#oE5w+97jwXA5ZW~D zYy>HNv0@3xD+!=EY*5p%yGaK$tq9iG-3zie@P#ONn2#giMGRCwq~-&we31dVo9<;3 zXr7ILGxT825QQ28Zq!1Zp-9*nec;8P904z`f+L#;l88DX&UgsAhOW0Y1=P&}?NIr!QS-*wv$gH=tT%jwA49^i+?+)xG97Ql{i8c%zz_@fBQtxQeRLdBoXk!7vgMi zCUJzThutw30@||X1$Ipd$RYUy?$ zs03u~D7aqY-`)YMO0~w*@-`)!{CGf>5NQ?)(XoQ*qR-4w@1XBBA&pgo8 zekhKB+y4M^U0YgbD`;(U79&~;_y}$;L6TKyF*u^IB`eT0k4QIo|0uXt<_LIk9qc4f zYIp)pdEmW{5H)ikhC&CYU_(w|n<3kPz$tne%p^$q2bqN2(RdDyMNql|Z59NjE6B(d zY>?~4vLdi^!Nrspj13x)hHhkhHW@4r-xS#kGAA&L;lCL_1|h`Av`(;*FXTX%;JtRq(5wM1_yJW| zu-%j3&2O;XnlGL~f_~HyCb^~5C zLrsDC3Z(YMKF~dM@SF+~0_9YY&LHr8caV`T&=w82BG{52iJ%t=1u!pz#==001Hh-t zyvUdhYA=DeWI|4TdBFzvw-9s?3VbNh3pFF0U+*bi=~B0>VB z_QkJR|Nldb0DFypdlPttA=C({1CBysC*Va5)CjQJv`(9Z&PI^h7eOFPLPNk+Sg9$*Ft7sHLY)j- zuItP%ZiD+O2tR_BA^1-kr74<6AVLFg7vX-FdrlHg!lIG=%TodYKXxE4@Y1-z(r zf+axREJlbP{_Wt+m_aWb^T57^h^BQmf)*IPm;*BDwJ2y!0x0pPbxr^aw}OOUte^S+ zKYReL$Qf#MDOb0v2e|1_X9~9-v}_RK;tY{>?u;+KK-zq8%Rurk^g*V+MtBn>2+{Py zq!QI}AgLGsLD$70+Lnk_1faHM(2EO@=mSmZ!%v~WHbk7S1Ch>+*-yY&95%fYC zVg=|h;uq;49Z4V}7DPmVh~TNv(PG~@fiJ{h!ChLC#lycnbW6~S&9+eImnMQQDgqy} z`{FEI)SG{Q=o-i=a5rE+EyWs_Ghup4OpxPp5lmN!Y!(x`>qRrckqL4=cnX7~JG3CJ z+x1LZr;C@wi}We~|7Wp*riJ$lcDokvZ}$n12z+sH3OKMpdO+*sL(c@gsDlVWRr(gB zb-DyfywI2eT9<{ipB54~9iUPl(d+<~fB`RTASQt0J^&J=;NF4?L>#_@7Tkmd4V!=} z^S~@-ctnB>4R|36(|RKC#mmWHcY=+%3t_`{(1P}if$I7ft&>3|e+anyT`B}U`4Bu8 z_9AOCs6~xZv%#jxUi86@1MQ^T3E4pluA*NUPX;v_K%3aWRWtwgCQ!FJ;KgZcXgou9 z(1H~Qz9`LrhCkR&xMx6hcfgAXaK8bxlnbHq&1os&SDRKR;@!AHRayikYhhVGpOrEw-3m`CAze!yl(fsF)(JZL}X3vQ5UkiC|@ z;JAFT(h5T(SmncsAh&=tf;NP{xHJ(Iz@WXeAls(EodCBDtZEHh6KFT-i@9J;puMvw z5&FUuVJB?V6s$fMtR1vl2fQOT4x}BjcXlc$#)Dq`v4lGorV*^t1g;UZ&Gm)q#Q*=g|3BdcJIFL95b<{cX#596e4YRrNSX?Y zwbo0e&iwnqJC$1xfObdpg2J!$WQijG{;8l)X}we;#=pN6R(R(-wUTw@LkyJ-IXy`ZGjdJ?u-7FLizO3Eg< zO6X=;Sc(RfGeIws;nMK^XJ8l2?gND-C`E&|%)IF7`~UyNb`Y@%M63l7D?r3z5HSx# z%`=I6efq)lB zA#9BOtZREQ+>W-NwHssysChgUw9o5BP4EBzFP4LdMZKW%1-zdX?Dy>*ko~MyaPOvq zre{K9f?jM-0+-&P#wVodfV7`gBH#rFO!`FNi!-LMzyj}Q4FNaKp2G#_}PfVO)Cy>LUw&j#(F0-yQ@Ykq;!8??nLmk1At7mrM! zKILyo2k8NCriGagvxu+6ln z2KpmZgBs=FMvxOr>jBtiTA1rV)(5>%M5qRBDFN?DhtCeNz$8JNX<@tSV4G<}C4yc& zHimk?1hknJ<_=JB2EO@;KN9N-dzA z?E)%#Hg)~~|Ke^JdQI;Q(+#c|KpK&=9av`t*dS0v3*J7H2{LF3i0B6qT_Ba_>G_-+IZn^GzM{jH!)tE~r6HiyZu zF)+MP1lb`2BE&(25QyLf5gZ_b8ASZ+{Qv*OPZ041M7#$PuRz385b*#++y)WXK*U85 zaRx*j2N8!r#9k1w14L{F5$iz2N)WLGM9c>fvp~dD5HX<>zS|U1B7l!r3V89u5b7Ps zo>IhixLU~WGFa?_hD`!qoPwzaM*ujOPQv$;Ld^w__`FyEQ&|GrQwouW+zHIT9WA!aPo>Gu{*tWUn?Vyy6b+xMR9@w7JJxGgfQ1+DW z1nGW#;^iU4o>GwE{M$P~`6=*)CEPLi_mo03LHCrhz%-%kDTOG3n)^^68UR@Ll!5{& z;Kg3J8Z3KCA*MA!3Wdoqm54p15P4`^E{4muKsGkBA`LNv2RUCfz?77L_mo1kH$nE4 zK8b;+BY5uvBJ(Q>F2lb)G$QE5OPBy`PiaRRv?2zt;FJh@@mvq;bI6`jh(*w-{|%EX z0q-e=$bq*#2fVlsm&3BB6si)G9s^!%g{ed-Hu})_l&)+2|Nq5J5OD=WoCgu7K*Z5j zP#X-q{~dWxDZ~zFh$_PD;78t53Q+=$Vm+9WQc%+eT$o-eh3zSYsRXU5fP~!tNN7+V z2zYT=7aB&0J*A)|5%}U3Tmp4Z>7y3Jo>Gv}u*`7^Bo1o8gkmh^hGdRP%vBs<5$JwW zDM;%Cyf+QHnH03qM;JUG2%79htbFT+Y-ogR914Qg^`KQa;Nl&&htw0~pqEA1_K;E;keLts9A&jU zR{$+@34Fl|@ds$^Ap^Yi5xV{@0I9HoY<&-U!3d9d*cMZy#e<+-s6j94z_V$fEvC?Q zJg_aMSDQdV1KKPCawB*U;l;)#&@NN3w~@}l0nJvWLC(E@(GSuEnQ#QhApiD>pzIaI zzaMNuzzexlP&6P0??JLJB0=VY?jiy=onl{9g7^^q`zL~;uk})$J7~u+*y`;aKR_Aa z#bqsQu?><7criT;WDN&Awn3sVJ~jUTKLN6tb;?dZh8Id-r5Pfk;^P{RfVQ7nzj;yk zRhj{GG5ZA2p4B-!{XpAA!FyRB?nLZmy|L4e0kq~Ew8!UH^dgzJgl&t~>!RGGRU`bp;9eiUhvc1{30M*$PSq z%-{t-FXkhJ=YfQoAm>1IAcR3{dAfZCAh*s>1Yf7|s{u4nD3Au)*4o+e4>aES93&Jf zkk;+Wk=EG+8WehQ1tbL5$O4)|JJ|Yy=hEFE)VGz_o#z=`ZGj)ST=N6-evs z0(ECz^fZ7H&JPv_hHh5@{_T)s-oQzMe|soL5O{L)MR+(kega1!6SBi2)GnL3&?^z_gVVf+zJM>OgJ^><$Ha z9ux%uFJxg_P6WOPj0d|Ov?3n5_8oLnV|P8+-w;vPKLOpoAiF^Z1-2kL*mn5_;CkCKv%U!bB5Y(6Ngf?m|ajVlxkotfZ-B6Q#1=2bjK|(KH)`CX?;OPe>7znnn`3MJ+3l7%)|Nr7m?f?Ja z^^`mTFB0H(WI#e0lyjho5MqcOT!kAXXhA9hAYB%4xPg=ffg}7y5F}~?UT`LW{0_|o zAPq0vK`wk51WJB6AV;Kwh$IjZ3v!Me#B5L;1ibjI3iG%zcvTd{WngNYQkt422T=qvEAYkoK#)s7(_^id>cpU{1wn~C4Xy)+B_L-9zIYFr;00Tf z4AWBL46y>N1Tw7)PT(LX27o7sU${deGT_BOaOyw~3Y!|x1dtcR#~>pDz{e#Z`4XJ+ zUa-K7&;|!9Pr!>yU=bEb;s@z`@u3-P(f*DW?KnA|(2U*a3gvI*J3zhef$|SV=P4gRp9iZ~Q)Ad8A>z7W~ADym$UQDU} z{~xUWMOQUw@(EIy#Hm0dv(yn*6|9B{@wb3ZrvNQh0SyOCK?qMmstRgh!X@?Hz8syt zKVEQG|Nq||$^qK>!T@5rg7zbV{Q`A4IB2d`fmH>)h(VSDC7l<$s{a26ohL7l);R%O z4XgyI1sVR~#X2N8a0v8Pfr|ePpyD5#-a%!0(2M8bP9;k~Mp{~0+KW!eBy2#pD@Q=a zteG<_?|Fm0b9ZGukMFIh$qb3ti7=*4a&Xpr-_)PpkI?@E;NUI$_{s3-() z$A1wGQ(sb*!N9=4+#UKMsN3~NzzZday8>QBDnm^yi2$v;LbV1b2;C0$zN8 zI4R&oIe3Ddqto?Ix9^`okg-fJgdrA##6U-*gRX2gfT-_u{qiCd? zhA0kr@eA(Y7>ojZpCZhu4jGy;{Y;>np&@|-iu#}zdN9*mVWypdET;$nseCaXQZ;wF zetGQ%ay1vaYu-hJ3KW)r7pyS-IdIpAK;p{xOW=!exH;Y6Qu#~33z14_lzw@USpg}6 zeR%?3+*N=%xDFD_pwt`iq77;f$o>~M;hu^@R+9u(lVNOZT>OFs<`3U5ff;AcoZ)%# z2{Nl6@Zu!61mOsH5#SGYJ)}wiS@dFEIVgF9Zq9jex%~hC7w164Nf2?Q{QrN{!ZZo) zR3lK>$boLxhLkX%unl~13Eb^v33w3+DVhUb1i&0#nv#W5#*6!a9Kyj5Ixr1hE{F02 zy*MWi4UST%9j;%X6*XTHELcwhpwUk zIT^C*<|2SHXGjg$z{s z#b#xG#f?&Mz3?UIMI5pmr~v5>{SoxS16dSQ8iDfs3nOGvP&xNv zLh1kiFS^QdM$n|$3&&E>7(?ivZdZ=uE)xR4V!B{4-#^`<9LFIyXMu&qz`_vS zEsZ~z7#P69|4R@iv`heX0l~sAz``&?K)0=dg)f$X5_{bL|NnOgf*XDuX`PJ=7#J8{ zEHC;0e-}GQ4Ag;`-~sAWOfLEVeO2FG%kPkh<&=NOi)I z);R$*jPxQ3BybY65wf!j)Z2UE3DO0+Cm!5mX#}mtcwq`sbP3#FnE+lyp#lH-zy zFN8q?2OwJhfGlDHITF-6h3Eo}6u)>^{Qp1b0vnJEL1UsX?t%oMx<-i8&@_>8=y5{FaOY#5zFY1f` z|KG_VzyP{1JFT+|yjVCJWEj*&@Cw@~kd0tP;J^g0$aF*12wG41!U#ztXeHtcMUVhA zOu!v!fnw0G=1I`SC7@Il`UiUD@gM&Eu77Mn%TsD)`1kw%0Z*cW{Wrw}blS*^>qVfP zdltNcB@1*$OXES%i6nt9^d4z2G#}vsuSo=Jm;f5$e6hR;5saYwFkeh70tH9`EI>eK zo4jZODS|o=ls#bK4$45Fh3lY@17$H#+X579pv(?a11ce5YCvrcm>O_))hzn||Ah*O zkOvV`AVL&G2!IG~kY6Beumw+1vK}}GhIYRpH~$?hMC2Y={#y$cgJm7i?m|#H_CVL68f4aSNp8YCdSQJt*gb%>w7#jroXF56-y@@cNGW#-w*PF%^B260PXGm!@u2E05n_70a|(V2ee;?C-B8L7qEQ5 zi?snD1`nh>m;f^rToOPCaQ{pK+CO{I>G}q_mv-Fs4QT1gi{rWf|M$AS0U0g;I&94y z-1gxJ0JTqrG1Q(%!FB-i-c5{Gw9E_mW$qRuzSeq8ydcFv5 z^MDq+f;{mj5Ul16xK+Us@FG|gw$*swrGLT8-wV|XF)05lTXd_=PX-!(PdZ)EgAm-W<=^hh5%@xpALJxZFNc47s0b*! z1Oi_0zyyDQZnXUq_+mG>od(`I`9dDYKn9Pa)21J|biN=EaM9kT?JZaA^0N*ux+O z6qCUZ&ufmfZdcHmDBzpQK*Qb;3qbh|p}w9Z^~wi9DG_w- z6^eO{Z&vU?&v*R%|Nl-cW(EdudilJ1p~LMt48})0UH=?!E&2TaKPa<-#ywme0$yyk z2geL(;bxZo3sDFUwEFw=|NqBZXMFzuzoKsf!|~QBpa1`F0JA21{{O!N%bUcZz{l*md?gfCTpb{r?}luQaW5ss%`3&0pw@IB4q|NMQC~P}|RbCl^E)*qC;Z zF390|Q^CfR{RK@0q;*Xt*BG(PFMT zkh6xndqLd5?of@O7h9`A$CV0XS!6MEw}OOOK|P#+7q!>H`eEB`!N(4QPAPQNN$VC7 zNb8)!+wk}Q{};>t{QnP@JNN){krnt>O`WuE7N)e$7KoarKmY%O&AIpx9D<;IYC37% zJRE7AJ)&S!68`-E-#Zn=49Y5i8pqBIb`Ion#Dfnxn0++@U$8@6TihM00=ZT3-~;yF z9#)XQ17EC!xEYl2K_h#sY{3aXt;L~5cfNsEHA9l1GR&E+8ec#Q+dykzU1h*~lO?R7K4|s% z3TkbnbxsZW`v3oHp|tK+5ChV<0Wjvve>tyQg1z8FcWlHO0 zgorf1Wa>ncYCgmSaq5c;zyAM!arzf%atQ1w&=Nn83j$xXSs}aVWyycgXr}^btsHo? zOEBm~3S5QGS5Ttl-`)yh1iX0t3tVY~t_1uFGPxI&&OwU?LDE4l=AcM-yDES}0Cd;W zS5VCG!A;eGnF?YAyqF5t2IBK?hnouG2EA}Yk?w5;#dBxt0Z`2LM*aN%zq5A@$T5&i zckxj-SW5d4|NdT(t9nH|I;ZXcD*zV@7aw$k)oY*N-#-mb*gX|w zxb{W<{a|nR@;LGDp9)S%E`d^=ts79)f-J|Wb`B`cL8SvIVnJ~Zj{G!8wg-vv?*~VH z^ABeJ-fPMX4A3-i@!`RTtld*VnYow6tFsl9?)dkE0|w+i5Lf$R=TuOd03AdB_5Xj6 zzreyLI(yH6TnIVj(&fwl|1X~W04>x6d8%{j9&kDaIl8lT1xVfgUXa%ye(rVglIm>T zf-DSD2@zfZiZv$w?chWj_#&PMTI}+-L~w)lZGvp?oO%IlKA7El;w$K=sa{aYnAX`F z08RE&K@4aRfSCOITR~Lw4;KDj7tn-ZFG#m`FUX{eKhrvULCN+7!w*m+VLw=NH@M2< z-_8TNk8LVQI_Sj)bL3PF3TjB!X?_7JenDzLOUJ(c|KEDD&b=G#OmLD1TLY>`x?4TI zfJ)w8P>=<_XgCf!;!B{j6~yhF3X+590%tLh+g{J<21{~-HI@eP?+1JFcuQ~2m;e7k z8`t@eeYl9%x1iauq4RR7_r)~o%hPL;Ds6aGDFAjqgfzG(gI|X8KK%LbIaTfpfsUTgT zlR9!fgNo721o40A8DQ7Abybw zDha{C260Pgug#bL|2wBTfV`9eG6Qs}0?5gb5bB-^YNzn;=ka1b2sHx~U*L#LYkmc) z5h3vfHoo;hoqKmL$aY99L0BAt-C*;Bx?4e(1-!U$6y#fhPB0f@H$+$SL8eZy_SbW| zr-IaSgEfNU3!Ltbx3q@9;|m;v7aw-^rhwxML_*^0-~~{8UFvQH38i&TVVwZ-Ts5fT zPWuXvuU?Rs10mJ~y@)*tauOoGT0tQn(2c6d;t)s?D8BZc0I`tb3*;<}_>wS1k1w!G zK7yQc=L^Usv;Kf`JE&;T23H~%fAQ}Jw^h1(K`lW3{Va~m7t%Vx!Tn+-NDC5C*Gze`3fQmtAMr{7c z&fohRbYnK84Cw|3VOlp&Kw4+73@F*X{{(XYESh0)di4{inF%%+8s*zV9GO5_9+a&D zUbGs4Jp|2qPz$@Kf;tNP+gZE<;3D8y1BtvSVuKg~(G3z3hYZirA?H#iKSRVBz5przl)z4*6-sQ|RRSG*VGVUX8ps3{9#bc5R|;A{oTM-UUi*$QNI_f(L6 zaHR}lK)m1lf(g<}e;M-k|NocksG4NO_Jcf2QIdtk8`(+r2{@&p#~W&6;Q_c_A&_Ku z?*@4V6mO0YyiM0bi?_6Q|Np;8d`D!G1(zx0C)toRZbfI1cr9)7X&3^m;|BJM@G)S_KfBygf@)f9E4KBEv z59W3D9sxD2r-DdWGaJkXx5m=CNoi)MfScK%Myxj2R75j-<{SLYY)>6<5J2k=aPbVP zRMN<8W=rk?MFUEFLYvv3S{39%lA75G;AR_$gf!c@j)R(Q2fBMfLhxqxk=OtKzgYho z)L6pO%w7h`-|!L-YhmBG1LST{&S8frhgO=nn%Rlk;BbSgf;Y3RKrT@Qxdh^CSTh^c zq=A&N&;~8I(fC68H7KcpTEN=iba3$(tj>S<3LJ0HN*~<52G@Su!ENY(7ZbI>_9Mj` z&icE~y&IgQK%Mt)aI+uMQ9^0kCW5mMYI7T`3taSqT=;rUH@F|b4R$)Hxeadf9B-Kl zYS%)#M_}h(e9+k%1CBQk35mC$qo8;@**z5`1R7%kH*$Gi{r~^s`%6%~%>_;PwSt@! z0I??U#XE4(fXMccj!rkKqLbUe@dgc5a8CfOBVi6P1{zbHExjP;Vl)aTYJ$TPstOdJ zU>9b+{Qv(&DA@%18m(4P%j^B(h10@4|p&RbWC0=xM{zgM*woi3CKpc$crZs-O$K? zvGv9O{}aGEL5HC9f=cAHZV^zo3*4}r29m~`v-$fR(7FUoAU&Xc65uunSTm@-g09YYij@@+P+S+Vkz87(^*CUQa-4uRR9WYoMf{@&!Cj1)|V<%KNr} z3<70g7l`tJ7un!kf>Hy3bb^}Bklykvb#Oc&+H0B5LFZRI2W3l8TLs(>0WmNdEuj7w ze6a52{C}X45mNdB_mKMn(5MXvgpM$DL!;j(fGP0BH#M*up|K5D0d8}EhfI)r6yV<0 zi^;znK!^N;t}@&WZ7YGhhuC`K{C$&|7$5`1*%uig?JaOy9+9G;QO6kc;?-7A7^Ae6 zc7SHn(mKKIbWlP8H|8<>j?ht|ZgBDh^;xYifRYSY_4k|IuwDhYw*pFPATfx&EMDl% z(=A|EpeC6%v~IwLonV*3OMO`B0qQ;mbc07X0$+4*0x1F|89|8hfEO0vyv5QD9#~83 zWP-Jj`M39il1$)>bX9P4bWepe8kk;~J^laxh2c|ZdkGv4Sn~;_cLR<#NbiQ+9J3Xi z(9yk*+FaZSuFpU@1~f>)k9};ZXCut}LJ;KvFD$_s0#9=>Lj~gfUQp{C)Mhe&^8fz} zqbG!O45)QaY%|~I@BjZVw?UIG&YBI9biw6o_6Y`f8sdUXP=Hf2Bng2I;M3m>@+?Zy zCADWtg}D0(PI36-?kl)XBM^5N)`PqQO1fbXP)) z*5>}jbujOTLzD-+r~{`=l)@gA_7R2sT1BY$Avu@vMa{$i|6i0pq(RbU08i9_N8$r} zr%w3(|9=o<9wXqz^gZCYF8=K>*$1H6lb6sEsEP>ED&)yIZsm`g8sjODev^J<^ z2{sIuT2PEa(j;tn6QsNoJSqxq`IUf1B_r>FTC?DJ*X~}B-Mt}>Qk`Hw^Y4cWgY-d! zL0$$Yhysva*?a&0Pav%$JCB2b0etjQ4#T95|{9#C-&&bJ^2G~a@l&>?-epTVKL zpT*Jo0%%+k+-8H5MzP@UdTa|ceeU~f*z_mOZ`Qg zG%WH!`n#usq(Q^Z;PzWjD`+w>@Wnz8up*e|sUW2=Mf}@)TtSm=fiGT5fmNk-wu0n) zA*#B;76!bKgKQgt8nM3@ls5RcPw@qn^g%F1JKe!1bhcW2`TxJS7qpNFR4G8zwuC|o zd8pf8)Ih8QEuZTKYY2F85i-@zGze>>Ql0WZEtf*lQ7-t@u((@jso?G%oH z7d%+p^a0IHH*SL61P=UGaNgU`698$QgJ;q~MKZM4-aQo}&*B9sqkBahA+;Gi9fRee z<0zowE#QSG#HpYoJi$4&7gTbALKtEpXgL)$5I|)cv^EKN5p)Nd*-r$%V1pY`0X71> zstDBT0C59eJePn324pb^B;X-=85-~|UK}qz-2nR%oZBC<^tM2Y1F#DI{UIJ4pt=E^ z-9hUhK;;s69Rz4$z>94+pzD`FY3#)c5bq>Xo(DIsUTnMp%JZPpkwEzyl;;U`RKR0S zkdBH6v}@lDS&0A+!2MwTNFr$2RREmNu;lqrhoBdmp<%N9KtPtn3sD&F1bSwDy#zDQ zgZ%?9T28J8sX*j;ND4$Nf0jUu2?}_j1yK&obI|mfrT$`)I5?7^8MV6?l;`2805ZZA z@M0}^aVZB(Go*Nd_Q(0Rw}gU5i~?SK7eh9x7orN5hqS=UIAKQYZv`b0XbsMMkbnCW zSCq`Z2fVD413mLYG=VE$<_rAWd%&dtXw?oV0R+7$gE#=RtFOBkRBQykI1HWy;0bsU z1x~9hC^ZkH6aZI*pd%-QL{_&aB|l z0n`!$mkuBXymWxbgGvWbUIv#AAO^g20Lz0D_x4s$F%a-V8{*cqPB8za!}tIHUvhvd zRic&vG4c0;b{Fj2A;iFt*4b+Ss**Xcf;Pm0&J+~^ZLS72(7~A=TpokG2ky;Ye87Am z2t2BoeUTkD7{nt0N|9jI@FD`LhM9jmivX%wpdtop7XNl0roi5*Ap3(}{D=lEE>y{4 z%wp41f*-vBD;vMHoS~9M}=?RtZ?m#YgBF-;2=hccfrfV#C!G$HiWa-2|6qL5Ig^N9!As%1VubFq}aeA)eBB}fiM0=f}KT7 z;IJZG!A68D*zmf76~z@55Ldh~xCDy&sonE6z?~5;hvkx&ap9q9z4`za%JNOWkvvK(@`w*y9V}uv2bHl*C zLy33E^Tfn^_8~Tevxq71*}-`Vdz#EX!3Itiu;Pdf;w*5?69^nuge%wx22S=xNcn=x z6|5+(Xb1%d&I^lkpr{8=ZnvI<<@>3iB0mU}@4>5Q(NglkM@-of6X<$WaJU8bhJFF{FF^WHiw00Z!oMGERWFZI;EUVm zpxu-UK`-Lr4gz)Cpx#RB26sEtI(u9XfSM;+XF#!oR`2pd`=*fLinMMPkF?H~&?_MI zR%Z~sQqZ++P-7tx2yIw`t=kS-rtbr8+wnjX3}}*d325ov*VAxILCt88SU?77L*$Fu zkg!71&;uIKIRetKeX0p4sC!+%fCg4TVS!o?Lc*dKq^MWKBk0BXv(T_O5bz?H8x{x9 z1}msRlh!>I#7pa(;(H9_w>Xe3kmcME|A2}${{3J@P=BU%^8|vz?iNVB-f7T|2~ZCm zw0%kfHD(}T0clfj2Sts80>}wG(3UtTKv#jn;^iq&Sb%c@Xcz$`76=K8en|WwX_y2G ziyfyx)8_~N{{P?G3W~yj-d<1`1@=w_1wc@5D>yiNdqIv5?41gVHBj0C)w=;NetUzG ztqgd?2owaMejzyWp|b!WF{oF;E7~_QlaUC+&OiembiWrT$k(9m8YESKlWIV(?-x+_ z1r&#<6$vENz>Ng(J`Zk~Q6~al^uvvc0cS80lf!}2P*)uYc;Ny!3X}l&w}TT6?py|O zRVz4Ufugb$X4HkC7e6^*9*h9F3OV_J;)8!bcyxsylpUa{8q&ytNFt>VhP%-6twaQ# zFu{6X96JFz=IX-eaYD@$5XoM!+qQ#p#mqZM*0h4e(>hy0 zdSAqYt?4}R|Nn~?5K#}d(ATE*B!7!5Xt@BSH~@`aLYn9N`+Gqe`9bD_lPomlpky9M zw1WzR{g6Nh4-!4T4Rr;7%PUYH0I$(!eL&kPz*z)`(J4qq??4#c58CetI^PhQhagUe z1_|8hFP_14lq6#F0azg5|ffSxBVJ{eugC^bL zQDP31MWLf=P;syYB2H*JiUV*X!l29RI3*c*X!0k@ZIu)oA*bw42aA@*CRD$lv3GAK<>8nHQ$cj{|Ha*nH4DZ72snX!-Dqw|=0~ML4o}>T&zjzKJ9)XCvM?oRf3o@+rWQi63{;42Ut(QvlA<1z&*mVIf zN^e3_Td7zE11Ohn_caK75f2kB5dfXYAOpI~F#0GcmaO=<_k#Qtm{AQn79&&!JTvuP z7?jgl0$xl5kE!qkys!laDNDDn3}{|l9;7$ptPbda42X`}qu||EQ2GBy{zG;zBE<^W z!{8u;#?r4FP^Xs2BIHE6LqQ1%v}x?c&Lbcf3U~X0N(qo7(>euTECC6E)q{gu06a<7 z!n*-fOLc(ch%E4HRiWt+nqfevWOVa*q;>X$ZUUKQ12XINUQlo;fPzcs2Co_NV9z?zeH3C3xh1H;-L2;0MK`&l2gTfqC zeYAk%|1dnoKyv`7&IBoim3nZaUNrb1CpP~5uwqUq z2Cc)}4o;zNy#xjA7 z1s!(=ncRM{2&RR<1$5$Bx35B4w;*gS;MGH*bPZnk*Lt8;*XE(_Wfgg_Qll& z(hQA9K>Mz(-@KTy0J5K4oPmL%gwLPh%YVq3rH%sr44^HjVN47R76SeZpq;Fs6Fv+C z{24&A*Jcb144NSJ@Bjb5F)}d7f!IGGY<>ZM2GBq(=0e=S2EDMPJo8O-S)VKoe z9{$4b&j2d04Hy_0-tzl1fErdH@yGoB44`%xh<%&ip8=GRIT#oiF7x{{fF^}N>{I;y z44}bc5PLtrKLcpo7Ifz7HhzBw(Daf30|UcGet!ngN<|QR6~8|NXlMzfW*NUf1E{e8 zvUeW8KLe;10I_HC`!j%=dLVlz^7}J@+M%Gc4LbP!5$Clg=NEwwaZS!IieM;CPRvP7 ziC{=eOlC;UD>8^T1XCcwFg~@S0K_neM`D7+N^%S0lS5c@$~h>Rfv$nf0MT!#Fdl=$-E0wabr(228c%|9pY&rEl2}$=|Lf0WT~r!!kE`FFj}%yyz8}5Fe;01lJsj`~Ux+ zuoJSEzV`>Hu;kzW|Njds5Mc@;3_yf7$Y2Kk?V%PyFV4da2JNK>9SX`3_~O?ksL`e1 zz4Rb;<#2VNz4TCZm*DCoz$ZF(Lo2B+n0Sf%PS815X`Q`$Ksy1O_Wl3A3$mAf>JE@V z;Xdf5anN1cAc2H^|Np~ok>3Im@ZSf@mG-+Jd+Dcwjj;yl0;M?6#pxhLTKk|izy=Uc z2E+r+Ie`t}0~x@-zZIl&CwRO3iROc#?P+sBYCr4+6>?z5plr0C0g}AD7qo4;w-=P5 z13~-DUj)tsH{W|(!F%b!+tRyzbpkU$JLMt!Y=gR8H3D8_+JK9F@LqcG7W>A7ASHn> z3}%200GDgohY;%@eL)-L8PhsjAlu+0_d++yAAHCFRtqizQMbyQ?uFLm7axHu-HQ*p zL8gF;$SJI#a_5EcUQqW8#0jGK3NOgxK`&w;ZU)bsO9Z@#{ih0A3fg2H z@WL8dsuwIZ#TT-fz7-VE;6Vd1h$8;|V7>hNAu>Kp>Va7dy;DJ(>4RQ;ng+I`w-vmZ zzSZSB==5w5+1U%4B*{?W1XV$hX3sLPGg-h5{ZoITP6jV`>JF6wH%(fPfFk+bZqO7Z zXguW1H^_$isUQZlD+*%r?{5WB%|G~R^SgUN)}?h%1?f%e6nwFMH)v%r*j!LW4H6D~ zk@Xv9ABf*Q738>XuyfP8Inp}0AR^!$e+Vh?>K%~jFQP$CdRYwGQ4gta!AJFR1ilc0 zo4e#2C~5LF!W)CC$IR7b3go7tFN_ zV5Wi?K`)%)+CY3HQ$gIo7hiV4ECumupS0JK;H#077X2iXN)ETRHd z&-P;mc0y<}))dwsOB0GCMKvpsFZwLD; z=tbaJXu-?havpT}9XQQ&w%UMofLz_#Yw{hu<{MPDrFBj{0Zp^5AO^IJ3u5x`?*&oK zKUw&DjhR6E>Os1-r-DoZZ}$Kt%om?_fSQ^6!J4~!L6sJ4MFmJY;KiaJu#^GfgTlWT z#DMPa1u^;egL6Xbr8=u_urooc+PcBkfVwN)y`UwTfiGTyN0E47K?!mNcg> z;by=KVJ=W(l_jmS^~X0*uIdF*f!*LeDnTz)A&td=7d+rx0Ggr&c@Z?8CjnMI6{I{U zOYVg=#M#g=04d-A<#d)EpyhiYD?6uxLJ?vuj=n8hpgeR8VyaI(7im;%wdvA_c(54*Z%3+E;U+ z8$7%R+7G4i^Z)-BOSXZ+7nDIdr%HfQY%3^Nbhe6s^FS}iu(a+ez96+}ol`+m^e+lQ zT3SKbP#c`oFaF@)4_4Scl?CKn*yesnC_fOktN<}Ui$Osd7&K-HGBcpN7o;k%dnza!1-i;8eiJ|2Nk2>ut@6$2Nr0A7!-CdY_@_IIJSZVv=f|p!M+7YG^A|x(G3Kwm$g+I;jFgLXyn!eo&G***z5`1lo!P_DbOv zaNYv@0knbZ0azD^gy@wY+wHr4ZDAG`CH_*OQ zkfRW_n<=SgaiR&ap#N`it6 z)G!2<1n}-yD?}~wUP-vfiyaW%u!6L6J*cqJp8=MK7-lJP|@I3=?{miL2)d=EeysZ&7=XvYe~ zD2c%#GjcZd5=XAG(f~tqK&Q?%u@uD3p1$GCh5eQPA z);SeaFTKbCOMxqp?p{b1f}FSl@(WA^bo9)Nq&MIgg61la*Krm`{C(ic8(d*`PCWvu zyuo=5ys;dVwz3$zdqGuOU^lp>2ATne*axY+kzD}F4B(DYcPq%CfNpRZ8VIQ}gI=65 zhgROj;5Hyfz>6$!O2UysK*16CV*6@X3IXxEr-GaUZ7qTVCGf>GxB?I#(hdMu&!9|> z)>`cD1=ZQ$x*WuSms?Z zmG?Z@!IW=6ji!UEKwCRNmqmkkn?WkTV^7&9*gJbKfKwKTgrt!xt)Mh=sk;><1Ul>r zY-}A!Q(AW~sPs)EA`P?f_u7Ew{~;Y((7G>36Au<)7axFTUqIO-@I}%pSfFzJg!`+z z6*RWW58ku9eJaQsK`&0ege4>pzq=LGk=Jeoby~pZk%7v@7gtw;vcUFUkP6T`0gzzO zi+;FH5T8I2yaeiHOa+etYzH@+LCy+%F&l0MsK?5`9oli_e{pFg%>AHZgMUA`_G>** zrwHpqbb~uqpmg%$+AEkBAZo##<<^sRVh}a(qJ!xL57Z-I%e&#ud0_&vts6W@0V?kv zuK-mdpils(9T20t736wwI}pTp$qVV0fN}~XDujOi|Bo6KpjZxkaeW2MD1T z(LH(m9A-2~8WdOH9wgSbejhllz~eEXJ~{vPR*<^`Uc85!0f{ScFb8JwzfgmF5EB02 zNNl|XiYv%yV0SOb6ClH0Xu%^Kq81jfVh}a(4xZqPgyrBw2eG^x?wl7L%fZ135dp=O z`EpQPfouTB6^PN@3K~rU#}$YHj;oi8K<7tn2M@Xi_D+p~YzYM=_kb5IP2kZ~{_VY> zL0C}l1r)lyEukP)pjl857c%Yz*~1wO(a_xs8o~o_%LJE2Q$eG2;60q6!l$d_ zonS{p$Iwv*9Kjkv+2h6ECE!K`DSfP;91INLDfK6yVt>yP$h;JIR6O8C>`v&IC1`&n zxPtGV3h8XIcm-rxyjc4L9G+>NtsvcCcRTh6UMwuv|fWm&vP zgBt_V&A+`B6bg_vT(C|yyqt$5jGz}m%b+RzK){P@k73RLRe=24!Gpn|q6EYZda)fM z&A%T!ehgV1l>i!6gw#9WjcSJ%gM%D2zzkVzgQS3ezlaAYWP7wH|Nnb?K{JJcS&Y5llNDjbC(;OPH@K|=I^^*?=n&yk;JFcjfER+`gbz8% zy%gNq;7RLj1x*z5ZwFJLYzr!!L5mkaqoP4C>>$Y*I;sdh)i&V8N=PR&t+N%hmy3Tp zc!yOWY>06;xcR~X(E^(G0jmmlG5HZV2tiXS{M%8S4yuAdz0klH`7kvXg0f^@Y=rR+ z1iT1^u}=hM$-kHm;Xz%{I~C*(_-6H64WQvQr~_b~zps!!UmElnTc`tIgQx5eHwV0U z2TmuTwm&3Tzz1J};u&ni3wgM`py)sfHBd4Dg&L^v3wj{|9)5xK5%z=Iu#k=cxFMLu z_u|?^XkZ)wRX8BSK()dFnCOL|7by@nXi^4r%5W?B{_mt{=qx6EMB|h!N-eF1?|*+p|KEDJ;IX!$TN^41bh_Z3(v1$ z$3nY2`@wBMNV^v-pT+lr9p)I&1<{bW&EkLY@c~#LsDykm6~a#I1n)KH-wr;CBQQ(m z#TkeMvOg*z4fTK*3&7b5G@1dMV$kdl&d>Wr93k~V zFHb-xcy#rJHCPe2n}Mxy_vSv>(P^FFA_CSb0I&9hl@#!12&@gSu?SI8tbywXwTJn) zgQu!MDG0<3deIA!Mu{4vf*`FEv_ovhe2_oDMH`l)0=lyjURHogG;mn~nt6H=GatIM z5|pT3_|3;tV89E=?pBc2fNt>IRp5)6lR@4Q2zc=T9IcQ7!v&n_@e~-K8G@h}ykIS` z%m*znDjyHj1;!EZ7!0T+00kth#DWzV*C1`OfERng$rq#yYk~3ZF4zz7Vh5hbK&b&* z(=wmp-`?U2DmemP+yf6uz)KGBfGDIx2Fq%5ASNP*N*4c%HkjyvfEQX2Hmu};R2TgF z!CAfem3$CvoMRJs4u>b;#ZPdWM9pR>#f6I(2TFPIV-8Arf#jE77eQXg%qF;`d%=h5 zA8;QL(sKsOXYsu_a|awkphALwJEXYH;(xIXCVC<0MHGY$FFL>_NI;g%i-`~kP*A{z zS)l!afETG){De|;fc%79cBp{-1RL%J=WuY@0cxOu%MK9Z#sAshj0vhEvGqna+y?t4 ztrOgpc=`0(|Nk%B9zydYs0ah~BEU@q=xQ^N82^57MsNNF-FgYziUZmP`l4?(Xb=fy z3l>NZWDPOMKi~mHv@KYWQ4q)$EU;>D!3ip5pxtfw7A&wVcuyoq7HSrF-%2m|%+$aa zwMwAj3CPyVQ26ddus*PA@PH+#{|DKE1(rm017Zsn zC=dc){7?it;>Ctp;NS;!{#z0I??5Y+Ap7sYMuD9LvIp!e_!g`$x4>}&N@p*2tb;Z> zk+xnUb{T<90XqofIdGt$Z^0tqIixLE2*W^5f*A(hd)Ny;ktFDa6vTHZ@jh)PG4YPR z1&e^QvM<87V1b>59#XI^SfD@;c+so?4s^6FSYVClfrGjQi=ZpuTd=@}p}PXIg{c>O z1Wv$-W-wrO&0<&0NlwJnAHLbIC4QSk8J9vO4D2wIA z8o0!YZ^X7F;9D=j;RYGz*gh4cA2eD34l;1j07~cl`@vR$x2h#f1vUJ6Kn^%CS{&`K=O`EoC+z?Om=O`xq3ATj9HONA>S4WQdA zU>aCJmzj8iG;E&=3fLg%)=N-WpxO=zi(Zf-@Yc(aDbTPu5b)y0MX++*Mg zD9}mhtdhD}ttZ$i}N4*C3Gk%@aXeFF|1e-+BphH6$D%VF9rY zy!G-Zc`@ty{yp;F$Bxt~c_Wxdh1w15GfK}m6&yY|< zq~{4RqfP|A5P=(Y1(Lx)F-?4OaD^FlAmGKx^DtL|dp_I2i3Ya^A+7@FYp@4@O+(jx@#j0EjlX9;`J)(cue0or;AwgBE{=7$U}LW?A@1)$D2x0*w zL}BjXfs{x*ZZA|p7QDp0_0kj)MvyT;99u6Tqmb6%h=Q)FfNs46$ppdbO zG7P%)5~K=w>m|r_0WW^dho-htMCE$fL z*z-IAFAkjp6(i8Cml?An5xWmKdLZ+4kWHCg-Tw)1x@?6z2gjyM7qHu)n=V1l1MNT1 z2MI!(w+!8(uuYd5pwJQq$$=+aKuHdNQ4ij92~q~FZjd%zYJto;-USMny`Y^&;7ym? zyPzxcLDQlyR)S=~GejUGKsJGsEp$OTNDP|3kvCm}g}1kag4_x#8$l!RAp3$|l$`>F zEogP#ACUd-UGTI5t)D=(B}gf(5ddmQfQ@>=EsUJZ`1ivS2x!wK$gm*TrprSo!FE7* zM?UF<%)Nq=6KG5ysR^B`)V>#Y%+E;8iUcn=Vq=PnHf;Qh-zj>jY4%u|cFV7&!z`*dv z9kK87p(kSBHAPk#o``Vr8c$7P=W44?%JAod(j ze+JN)E@%(t6iHutJpCC!Ei90Dji)~Ys6hr|mw?Rt_WwU< zuVs#>KLcnk4#ZCP^k)D~l!4fBp8gD=A$Jfv+|!={G#(CO`*`{@fJUrA`!1b5{TVBK$@PK_#5n-kvEIq};%Dps{}Zg=yttSm&46+j zG-y*N`2KC3@ZQ=hJGns{4M1X_SHsF!*Z?4SH#`qlTBi@|gBL4Xp#}WGN02MaAiL?) zz#EoBSRcIT09gn&BCXT)#%rFmZr>Y_tmAuwe}CwW=3lJ*y%pefPOdljxAVA~y`91U z*`$ZGQU3+wad63!*6DgBOO}7T>y>~P>t;erApVvL&;m@RZeNbTEXc0G>_ZH_KCExx z=Jfio{s3LAKo8nojgo0_*<~W zj6hm;1ZMve5b_= z&!Zp@fvz+M$6M%?pcmh!!{eV&k)hW`^hW^ycHb+3 zS+Xy7MZ=;llp`nuw0H&_qz4~>A`BYc2Opv8X@lqiM*uVpGk5!<#~x@CDY_VVObnEa zko7X~ZwCpzxPJufvw#$1jGsTl11S55pFcxh zYI%G}egT*+%g;>C%u5He^9$nBiWop85(0zwr)w}l_NU(fU02=($}1oR$otcKTi<|= z&v*R+ZV^8D3*GDrVn93pASVC*RuI+vgBjc+1hKnAe{{Qwq=Ap%;OY+j0a^tW`s2mc z21tt#bfPy%8MsLRVnE8ZUJ#Ri|5OO&Dqwv9)j-f0HXfk8uy6xYzy|IDEjV!%2zc?e z0o;V<-+!X@WQj1?5kJzpJ^q32jJE_S1-Car#)E7IyBgZw1c~wQ2RoqoCv&Y1|Nc+` zsK0uBnEpZ?)$J+*?rrh-rFHTIym(d*^3Jy2so+ow{Q++3JOJHneg-6i2sA;c{^mnW zX`N8-fotFs-wL9df3Vh?fm*SkO?lfzd_e|+Mgc)`-M&A-)3DuO0|Q<(90Hlo12O;g znr`18%?DXJeSdUM1z8yMLI5lenkWW&4U~pES-jG^TR}W%=z*9oZq$J?hR}b|4H9Pq zdPQpj{TW_3$AVLJ9OOKVqp_f-87SRZzj@IS3rXW3AGHMfGk^k-jfsI_LZClG1*mRE zO0(elRb~e$eRjG&>2!V3>H4PA^+TuYmrmCoovweg=nyx;@*1QeOBKfnh5 zfExINe}Cu?{{60RtS|8Q3Nt}20Py_+QWN?G5(%MS`1iYh;otB31{AHYK&MY_5B&ie z>-!S$Vj9dc{+82>3=H57HUEC!FWunE&nw`CC_=$1kXEo94|ov(|9;;e2OqL9`wD=3 z1wNMRMcZCb%yEE+FiwHlENPvtf1sxt@$V1)((MYWO+Xi(g#I}Ah=m!Hs9itsg9jHS z*q~h=*BAWzLtnIB;%_kpS-RczLjc583SgUGte*%Aqe$>}d5EM8M6zf<$PJJ^^V9Z$ z*q|!w3B+<4e#jE)&_AFMcoOi!Bni@@-+m(SMa3St>em?=+rYO>fm{sH^gpgCUt?Y@6Njg==sFHR*wZ8{L}f)8O6JQyY5!N|Ye z_etQ3Tj22H0If*k-|zb4-~$$BR|)?8z8}CtRWG!ms}5kX0M-t^{@`IXDB1r4ZCJYq zBC7v_He0)bLIGED6kujx*a1(D3#t*x(PaWGsF9LmJ;(+^$#FXo$*~W#u>+AD*4Xi5F2ZX^a)@K z1mz{f!$@^;rhpeECkz!#Qa4IBY4E`Zx4904z$gGC@l?A{6T z9LxxmUW&wrLizI}$EuaIsnZctGfIRakPgBute0WZ?P{sPw}{Gej$#nmoo9F~~zZ+8^|Sqm=Te+0egg7^UxtS|iF z%J_GJS`%rVzF%H=mVvrh+g-mjAK|fn^Fj*AcW2Ik{U-ozPav8R;4TrUB_ApP?v28F zQjls?ATW#ZMG)AHJe{sz_`%1>f}Hh27v=!|mIa{R7}ODez%7G6(3Zg;{{60h`1kvY zSRbs_usifi(2IBAkOA58dVe>liSyw_cPXf;2^s_V18t1_ z0U5!+-&Ml;0?0VuKiyzQgD$xNu_3L7ZcrO%KFqieulK(M^@*Xk$%TU5=lTcIhy%L~ zWT=GoDUgA#f4~Fm;7x5HHt3u`$DnT4F99$7Ur6vLE zH!scvA@T|+i;$n5nBbmAN>6v&q3NE#Wd%{`Nf(qDzTZMlQ6L_q@dr**v%sDK2l8%c znldkj#+fg+G^NYG-}le=o5-mO#6wC~?l2=iyx#qCF{rx^N%wftl`bd`e7}L5vOqkf zwDoB#C{m&Bgru$hBB(pDrY*u=pO0)LDE;087n^A5>nEfEh?Kt6H-VhO0Zm^&3!&+2 z0kUpb`q~ZC4NqS$H$ruT)7S1oc=~F9v{wUOl!H?sEPc%cnGZ`}IRO~y3uVkPwEGP@ zKahXFD+m96Umoj&HC$=kp&V(Qp?_X;q=5%EUH|ZJcm31-6s9S(`wf!%dZN^KyK-2& z^3-s2`*L*p{&~&T9m>-QD#VbC1!V;=2ImKpu<+j6Gdp<^BMZk}FEB7LFubt+|NlRf z-RpV*RIJN@c0z3101h%x8$65gMFuz@^MJZ+{M%h+K&m7HUkE`WC9Tu-3#dU5Y7q2- zzZITaIG8}kKD#2uz`9*IAj4@{5PhAlFZj2IehC8S6pp~|&=)~3{J{%IcsgBQbi2L? zcu@f9cyzixfmJ5pauOr)X;>euP37Mn`Uceg`2%hyh&TqlV1!!)_1YIuQ}++pAwB{B zAXf5#XNUw~R{jMi2^J97_X$Kr7o=Y9bba!=88l7wB;bWR*ko|^_<|cEo!064gMWLd z0;sx|33#Ep9vXn49T}ijgb2hh;94>QBAM3d`XP&fe>f&qoNM zUe`OIKvxOu4iyP{ky!v;zyJ~b5cpy{L@9VgfaygfXsBVo>yOq0r3Rpw@zn`@v9uW) zGvKMNP#$pW1$4Mv^AV12Umnm-IijqUxFBrkiiv7NST2I!= zgNip$(b4TI(p?G~tqc2?)+yrn;>jOS(Qp!H1fo@lYfESrCA&_3s$%@^eV+?~~q9DDD-M%V;FC1V(AgkAc z+~}$k@InhBYW?QL1ux7AAaHpn0&P#Cj7%MO1$h&6(GO!5JG9h!QM($P_`n4n-;4b) z-hqIu;uneF#uZ1vixZo{iUMBbgB$l8psc>%mj`sJIjA$xDZ1-1Xc)vsVsmPog&Ou&l`Nnkxlf(ijIW@8Ad z1iWa&5Yz~GQHUX^6YwGiL(m}Lg*%EMc;2ELbWo{2MEqqrBXmR!OL^P;LxjIK40N`V z?~lOV&<~&jj|ZAPWx83q0$y~2d$K$MF9Lpo3pG&lr8`unlclTM^+!Oj?*~wh<$>l{ zg>I3?pci21R`rO=w#`7aUQe;@DzwR3L*}Gh}|G!+jmeueBwV)!}bTX07&;| zc+uw$Dgc^~h*-aQ@yH#L{nI9Z8h1MB{tO?WdEO!&DbIszeFOo{57_&U;DM|^FSI~* zgGR`G!DFnUKcKxN(D>>P{{6n7+SLFwG6JqRc>)4oyjTIs51>{XsOtr~SH$&Czze4D z;CKL+<2yig3g|TI&@V4efmYUS2Vc1X8V$Jp4W{f1sJ;SKF`Y~=mVyqiWai)Q`z7$j zOK?LRGN_^pwu%EZan#B9q8_9Qv`_|A?!Gt(F$pS{{0-D96adM9JJ{W!96>Msxk7Rj zWXJ&Af@TVMabr2i{ov7B@PIE89d5OjuF9Bh_Ex2phnM>^LFHn4yQ$ncCGpn?cg zJS~J84jMCN3dkx3mv=p=g3R5%3V|=mA%YOCp&X5`J}@#c1cA_SM__`fS8 ziV@KV>L0_JieOPJ?M-y~<~If5y|oi|${?D13mtCHVK6@0=?ZH7ba$|rF)(!c&N=Qn z1>6W+@gF)#ntg~N4IG?4tSi8S@Q@il5zvg^iWi0dLF>1`2b*$qPn0oYVCW2802=P^ z_9#p1^xg0x;Q#;s&9yQNCHlKSQ)J+|Z<%fp#%?E`PS*uH!D1H~x?N>JXA^-_$A%X& z|3N3X9!TqS-SQgLsonzZRBz$mAG(EqzpDahg#Q-{=z=!>?Y>(AU#zZzwPZxVwt#19 zK_+$w@<80fzuzMTv`OV9Xdw1dT4(5v7u){*|Nr9RzyJR;5;z$cx?MTCJzN4`Y^a7A zCD9$q(Ol)iP{O|hl)2J6U3a`_`UhH3IR~V3Iw)iMa`5jDOal$hgJO?=zv~WADgFdB z{R>LC8v1g&s{onupS*&nb5176Z zp`EOt)D^lQt<%fw1p~+hS*+cz3;4Htm<7Jr08_``k_|Fnpf~gce72w2RU+WUykq(d z%}01ZRrdn^?SUpiFKS?VO3Xm(EI{^~yjcDh5#b;=b%(H?Nb3x=d(j6vFy;VAsMFEn z1*m;E0pd!#fQ*@vp#H)#ut(B5T@S#TG5p(IL{C7a<>1nL__zBW02TCmf?i}S0c!%a zeY<@@?y?Aa!2%J3Sta@xlzTy;WfzcOjzovx~t-LA2Su zxCgqc0^~4=D=h+E_<+rYG|fMhL*t{w9z4*}?YbbXGr;7S17D2zc=e93mW@t{=c^z|jVt0_Wi04pjplm|+6P9S=+$IR9UK z1TOS@1VBawf(K=8gX0CHtk-o)K*s-i1_u89zFYXWhxo1t>URAQ@FEgCq%F|t`k~i% z3PjU4NW%%zNpj_ZFN}bi4!VFb@P*?daNP25zYz4I70d=#F=(CwsfFlAcmgc;f)T6- zT&%xv1+&3*2tTOqc`;=n*lS028Pyre+E$b4k~<0^Zgm7K-&yC`ABVs?s2IzL>=vGuRtAQk7qg7N|8G9Rk|ogX%E6k$%D@nivE$D) zh8LHt!8Ki$Ko&!{FGu6S9##g1z!!I{z@ng~sXS?&6P7VCFudsa56PcAX`Nk*m>C#e zl!GcASDxbyOF-TOja#IGuFqfuZ(?~dvjiHVC1PO1LwOnxtzZH0T0nkSOKz=8R`g*v`(*@7hgej2e_{S8piNQ z3Vfjqw^b;MCCi~ZR3PXDKg8(Q0$HqC0pNbpUrVs}vRFZhL?rOVTL>Ro!f>Q@PG~b= zV0bYNG>B09hoM9Wl&$}yb#@(+U|@Jr52^r~kFZ$3dGW*+62(~J1HJwy#77!$8WiJG zjc+2DAnRXNfY!fE!`^HW>2$r(?d#I%dmxM9#j!P@+|1JHdM1mBe>4r; zf}#@Cq5!W4@cja9QG5YSR5t%&i4{`xIV~YDjGl zUVR4@co7X(y$4*ifQFF3Eh&`67mdF_i_`dfy+IRj;CW9TSBBmR44@IQ58a@lD^SD! zKcp25nve%=aRS-+q8l=r^nrhWk1I%^^<XJTKM-vENQ(|rwW?fg_;CfmJYLfN5G3;;5klk@Ph1yn#qrFuqv|f zc8EVfzT6Y|;vHP?o|iL0r|NDG-2wH|=egh{39c=s!IB^Z(a93{Li`VCj2bNBssmoR@nQ=^2dJHlEDpZBqIW9TdoKha zg$rnq@<2duFGw&jiyhp(2dm3y*gu8gMV7J|Xz3`(l=MxgokgAX`n zY9G4zqubX2BnY|<1KjB5-wrC>0%t)T4W8HqPxmSW^}3z`b^gC(U-asBmFVS}5ZE1h zBdFW;K)?$}e$WyEoo?S7%?ATIeQ$J!9%wuS%0```2VN$F+d65Tt}k9_{{H{J+xJZ1 ziwlqt0*x~_*PdZ0F$9n4cDtSlc<~h6>fi`?;gf5`(0l~cFnGbg-S=0cPS-10Y~8+B0$-$qn?f7` zFY4xi%wYjtI?>6r15}4*pQrBh1xH0r@hnlN^`9RLy0iN z0*h|nDCB zeGrtz1@kUQ`H{dEr@$$lC*Z|LNLxSP#SgHHc)*tW+JM*keEk7x9f4|P$Y@DIg+IfK z1T%2!2)e}Wkr`--8>nire)D3f8KnB002({ZsPJbv18oO&R`@f3G72a}8Y=u5(qL^M zAJ>xn5(ZHJyZKE3X#Qja_-Y>T$l~YK{NV@E_=R21yy*D>8ncnI8Gus0Nx+M9(?IbBDTj(+>>Iys`&>af4>kj14Fm3Nb^ev$b`X<)=MSa zFsnLU|9~sd?28PbzV8drX#0!Z;Nhsy9gwQ@-~;w<-#_40@Gk-(0RYx=@F9D5C`bd> zi>`0~|4)Ebtyr2Au&Q+iXgD3TA6od|s41v4o03q;u|h|9fRT=)vgBtD>~G6y)M`L}}y zU=KhhwgOL@GBh6%;ot5GF3@*?y4VsyFS4c}92o~;cl#!Qx~rgz?7+$AN6-tEOnCYh z1EozqP_2^yUYNrPbKHfX7qSooK-E@Sx9gU)PS*`t>ipY%Hw3;2%7B_s!oN$Mfq@~d zGjziXS&);VJG}U}hi(XZp$#zsGAm>(Fk{ zRa!hyV_m^l^g*210aJJ&0OZ7wz!%S)!G?lHO~G|+2&g&**Rekkb*u$Qkbk?Y38-;l z5ZD`f27Lb%|9;;e;M!CLQkyD(d)3{(2_Tn&XSO`R6{|tF?+0+j`k_1Y1*~Fy@$xEY zOu^Nr+gAg89iYIAQ=k9;-@$MWRLAOoVsY1J(4fN^?$8U6H4WXa7XrZ5??yF{qd^U$ zC;Zz(p9H}rX2^pipxGZP1@`_6yGhUhy%3aT`=SBHI}p(Adm*qp^i0r;H;_Uk;Ds^x zq%Mw5*EboUVTo?nHvupD!IPpOu`K3p-#39T{(&1&904z$g5#5=J5&cWFUI~El#rR3 zLFFhr1E??8?V+#>bUX=olMEwA;0qOVP{9c1qIqBa^@vb0@+*{K65&J`e!b_TmFLoH&94 zUZlw(h1gDTff=d*S}zZp2!-6!DDcAY)Bpc3bUuN+mI87uV@3lG&$WYR7r{$nUr0l2 z1uqE%Rk09FzC7K53Om3da)O~Zgo`8SMUo@f4bXZREDx&uAe{#;4jWJh`P>Asce=sa z!3AITNrtq}7O?b-2_Hczg{Rv|0U~vgfq#3807z#*mi&uJ5WS!VZ+B=&P`9g10H}WA z-yUiLs$C2MdVS9Xf~NLB*%34h4jMk{cI82jI#AEK8?>A-Q4rK#w8--6_El*-sKLkp zT6wP$^deFd5`UmJPPeNCE2z2zTlK;oB9kT39U9VnC?KfYH6-AL7F-aVKOh58q7Xsk ze6Z;Q$ah%s!Afv#hb13OkO7A%q^Lm22WI`?a0EBy>|RvBcu4u+i4sUJN5Bhh$nkI} z`Jf%VXt_p!YG2U!xxkCJ??DZ_EDiAdVFGw- zGq_@X@ud&!B1kd`eG&v!;%g6b1`l}QDD*0^7nKmDAVWJDU(AM?7#b4vf)8fmfq)l_ zAj%*n`aTKF(f~#Ki{Exo6T!{B2v8yQLLH*C+cyGK;CQ|V1++`Is||EE#o|4*t(<+R z4mvAP-|cJBU24${X(g+_|NkE>k$Dl+mZwy z=)KGQ@e7xC|Nm#ncZb@5>aZ7Xz2Mja<)w_r!3+#9Ou;LXI0E>=TL(P4K@D@qBxr@n z-!ccZAXXBpJ4^lr8&v=P6M-*w%>bK)qE!ui1Q$!di@)G<6_nC4{`o!6>kfSr^nw#I zI13F1kYAR+1*IxT)5QWjshJ8j^o0*NZG+qJ&9wmxC87{j0cqW#pzT(UFQVUq3bZ`X zs6?#~Ly1tgt53JD4YV$@14%+EQ&)?C7xj9eoDI%t5J6vy#)F_p2z-$Om%5P!np=Mo z^x|SS*khoU0RML18-Y;ozt{;AKN0xC_bs@i0?vqHFYF;aP@f89i0hqz7k3bfAy$Ga zb#og~Z1Qxw+JG7`{M$qC1ijb{Q+NQfv9BB9HV&xrP@A-F*E^sJD(ww?;l`a7e})&= zG$B2a<|6^tZ(e9`hT~6*KV&m41GM7-p6vs#*Jys@ z1L}Wl*(r<|89VN}13Y#2_cda38?!5Dr3tvGhV(p{LpeG_K^-xLfGo}zkGjCYm)7a} zfPcHMLSPo#i}P@yJG%rSO|UaBX1)IZKa1f-GPpm=(&>5voWqX1XnGCWPT{MQ23loW z`WiHC2WsN~c@14BbO63ih<|_R8S7L0y}v-~LR>XET@So)g&4{QGxWl1KK}i_pv_$$ zm@lSvhJt#rf4X^E1)Qcq#-xH?G{wV{J7_6yx9by73XHtbqA>Cz7q)Up1ue7M0vV>1v(jD9C`)Hp&H$;0^J;) zTrW05xXp)HIzhdfE8r%~i?iVJm!s45LU*VDSWckZ^+odmCh!8HC!mWze4o5D1U0c4 zK~2gRJmB6dWR$0%6YNINreSD;y%6+58qzurc;N*00VpTE>2}r7c0F+L2NPt1#P>(w zizna=2a<))vHu8ou?}J)sGIpW5e*#{7ih;)uXr~ANc3&A#58_YIixmi&P2hg43TTMvPj@H}czuXxEL3BOEU4G3 z68M50Rw`WpZ3_&&@j~n+sKngvdIaRu8-Xv>;7)zRzd!U%>!mtSx8+Shx9^F-7dv6P zPk?>P57PER+B4ua5}?^`l;yt7zeMrz`i&E2@%j-9xRdn2zoIIVj?JR!6Sn&1R?!-(3l@2vrGUd z6i`Tl=iR`0^2O;^B!`6F0444R0WY>9M0!D$-WUje0QXvRMh_~OS? zq`VP&1mvr=WD9 z0vf*u6&c_r!zYL>NFfyfa`{WvzyJS(#%W!T1ibJ=w(~^L3p?-#Fh>ArdoM@ei~B3V zPU>_$(H$z%?Ruh<=>-qS49J+DM~^?liyS3bP3vR*=EXiGNKFe_BNfo&&#(hJ&KJ{z zG~WrWTR{|feUt&He!Z|0bnXUpd=DJf7hd!|fzRqNFoRZGe*w?!WF7*wMZxv$2k0Hy zzHeS6J^`I_10EpZ33|Z{^V)%c7vjxee?Zr-TcW7D4Uq#S+ZXSfpz1_G?PfucI(66z zCFO8f%23Nv2k-qC40^!_(VW)ldSM4>3H6dU|0jT2m*5pkFJ3^51;s3+qdFay zVXvfhhZ=w~){7+|Enr`RD|FB*T+l_^khlh=E9(pVy(`X`Q|| zUZjGwgNs3ysh~O>RN(&ze6bJaX#SRCpzO1(e!0iU@gEMy;F)%QE z|C!b;;;Ljije&prp@42*iEhx^-vGCHS|8f(J=|1iXlB1jh=fZhk2VUL5RuAuvne#YBiWs5t9(g&LpB2Qr=~ zDB#6s5fBSBtpnP=1F9MVAAy`43f_Ix?Q7CqD$p%5ty84&g~cP#81fZRn1S{Vfh$Rs zFj#a8LvoNnx9b&9al`!xRKY}nRuCESZ}&9_d@(Z=s+7NFDkG?Z34MdSejCv)YyK(1 z-&=$nhvy!G;xP0_T4(5u7YiSP3YPt@$nCHnK`(wGj9&+eL(ry4P&*46m0yse^2I!G z3Cj`iA{4xCkEc6Sr<3VL#6ytBiHa*74vBdyc-&I_0O|NnzpncbkZ zcMAO51KEPWgFbh_r?7$cmYm?A4J2ZCPI!nGcN**ww57BuwL4DKUN>L175g5G=j@a1_uU)7l*;>L2c+G{M$nhfGW)+0Wa1hEFuQ^_GJwZK zvM(|-hYECtKIsO>3TRnGFDOzveXqQDclZDQ7ccLE)9wk-0Sb5T{{Nq4z`xyfNx+MT z5K}>30#{NtK`-K9)*c9WQ3R2O>~noF8vuNnR6F z8%cl)ffo%B6Vf`tDF<31fp*QlaJvhwkRZClAqqh*fmBFr(3WXy$#2jRP@ozKlq+0+ zKzBrf)*=6B{wd7g3)&wKnS5()0VPi!ush#$POSj(-ra!|VLxD9N$>!NMIh9%{4F!V z({MKex_d!sHt+>6q=f<6>@XFSo`YUwL!1)uA_-D~gIcxVL=T?K?4AnB2|?YiHv(Q< z1eb9f0WUJZt5JA5TWfxU#!b4x(E*tU2S*WD=Zi%!nxYp}6`~9E^qeKie>jDx6r$A6W zyZ9EU?5+Tv?gHwmp`1Jd?y0?jSES$|c+mv1!}U!kI4obJfV5})mjF#qz6pF03bTp7 zMHZ9VDx2PRTs5#Nhh?JjL~54S4RHBcL0cNCIBSK-7aGwzCBsu`hPs{QrLk$fep~r<0Zp ze8AB`LNb^Q?nxjggP-MyWN->K8R%7jrLZIe7FJj?=;8*kkdwiS8#t1|`5Rc1!44nX z$zaY6P%`)pUIgWPr|~DK;a?)2(FZy;M&ie8hKzL5Sz@Nb_Ak_+l~H37ApU+gaf2TymX31|@V;dM~c!~~)fGPvn$5D2p+ILH_@+Y6c< zl?mtuwHp})K%=ib-JuHIt|rh@elEz2P?c_`ZZ8(lu|B?EUaYzfzH%;91AD2=zduyR z`V^$C;tI-$pw1s?b2@lYF)s(m;h?p^ouOY|AMOrS=?1No_|nPL>BaKGA7nJ7Gp8`i zpW(%P5lCkavc6SO6tsW?)K&qle-weVWIzi*HD*Ejb)fOo$XWgjYoKGOA+!7$KtasF z!oc7&%b&q1GtV_XtpapfA^6Bb(2`ax>nEGvVBIg4CBVPkRR`360B^hG-wxXMmdmXR z3Pn)g#P<()u<8wHRK^uFAn=CyL|UgWcz_DD#m@RdtqFL0Cl6@I=uNk)N-yMyfj8Z* zG9YGm=%1h$F@Lnd2D<)fKA_a;`sekgZr?x6FO@n$?MMw!D}w{nL{JC>FZ9qm0b1WL z05TRdCAr_1qdQckmj!&(07rMI42anc+GWEEH8xZuts69|_yv4}7PL>J04fAwI$zv6 z4mJ}K4Krr@GrW)x21Ns8*HMlzB-}yUA{NX>oY}c%wmsnO~C1{|J$z~QL^>hyra6TA(Sf4{2?JUn4TZ~~w}1ot^zc|c5X zUC;9y8lG>!;rRv>o^Qb6`3AIk7O{UBH0}7}9(ccm0BD~{>w%I;P`LUkfTByL+ZATK zOgED8YkxtF7XfD&-!Csf_mTI8f;T}afMQAlS^JAxhy{?q{V~U%;l*x2MBwrZK?0Xw z9<;ELfnhEpe0k>jGnAL)7NCYMcs_v8`d)N-ny>c-rFPJMcjJSgflZA4?U3cy904yr z@PG@PEIH7yFHhi$2T(p}ML1}I;RPrkBoEp{c>u!S32J|Lhf1V%a=rKqS`lsi=EYS3 z=+;kge`W>~14DT4-VD(4;bn+P5=3|Acx%qz|Ddv%AuFJ__02y}JI0qM@P!>O#6`@# zQ+59R{~rWewJj6y;y8HnNg&Gsx>?Z%lv+X4+alni;01dpNSg#`*d;5V*Y!z2*59nZ zy}ckK0-+|oc-#R~bA^Aq>xFMHmKqIq6kvCr**pS;oly*2V}*SfEPZ+ zU=^LMHJ~a7bRZUFH@FH!CusJy7wnmUEGh6T?h7u645W?(=?Zwk4yj`UUd#jcpjiT5 zTm>5o>h0`-xU;ht)U*NTIPlsk^rm(|t!ox5*j?SNAeG?yW_=OZaRD#FAPx9{7qt*` zyQhNGq;)bu6ockRz`9;915NycR>w;Oy=ZI(g$Pd;W0u2<&;qbYpiwVS7=y+GLmh%% z*dc^LLcR`xFSKDo7ho&47?@opAj_r?K4f6_l?Z%M-VQPu6dwn`rhm_entmY&96K!h z+d)P>KnR0OcXbGOaTX>7YNSe_*ziITZYpRB0lb;%NYIPdU>%SNp7+kMhJzZorF$gs z#UF@sLGunEq0lEmFEYV8Kt0DNpl-G6ofqcdb<4g-T2Iz0@NW-267*s!SPdwCj=+|h z-FYDZ+5rUHM|C9Vg#%;|1Jn-&#SLgIU~eAOr{E6nhoBdKAOi4lb^h(3DUvd<@gOIh z0CfXeFO>*q{fBg}t>J5xK^^cDff=CM^Tk$}F|AKP8{n4x{{KJY8XM?{bdI1G9xhOC zm$Eh2axj2S8OUG=04-Sss}6Y44he*S7kZFpe87uPa3W;^-6IPcxk}^T-U~7~@I}mT z=vXvZE7)@W?NdQ=K`%g^fo9M`c(7cSKt{vuDGa@?Qv$j{%V&#NKvjo879*%;1ZC@% zzyJRSKvH*LmOyXll%Onz7k_So3T%Ze(7tauQ1;dc=Ky1oZZT$_bb<5Ig7vA5~^R5MC3@9O90Tm1%0|H32P1 ztpqLieVvrWpW!J4igb`-t{2S+dtS6dQcu7OX!{-FTxhGcdn%}q3VI;~nYx6^L7fKi zA4|8d3HbOdNJ4;W1fSCQLK?{)d5Ap_BS6=|LJD>h&}anAv)bSg19i^-{{Nrx|NnpH z?p}}s0$&6=!n`MN9Be&E^2KV<%Hk|mm@9K2ofC)^Ff-l3_JUILoqwRwu`B=ngFyX@ zydRJOuihJ=TodpEBw6zJ|9_T_Y2Z7UL$Q{%0{p$;8SbedrJ&&z{_VXWg9BgaWg|r% zM3y6vfBRIBY|skTU(OGvLKfdzimL z>xFwka)B?NK#KNGu$r`P(2(#{uqV2~D|+4kgZdU0Y29F-rFC+=C!7xK@-lyhC(yQg!ZOI-G|-;4 zsAc{Ppu7SKl)z>F44`@y#P(k1&j8A7tVd)RxX+IHlK2PJD6Aa+?h{gZ^|G_g7*oRj^3v-XRy8MSU zOkNcIhxQBkw}YA{hizf8B)bcA>_%GWRFH-j-k=kEz`70uPh)s3y#sU{Kw4)jSW*uz z=@2%J0W@dZ>j9pB1)omwB0dY8oYFd5Z9u!*K!^W=_H2WW;Ozx5AUmbNO#b~-K_cM& zQis56^}#lPTDStB6bLdP=!IPd*g#M<{-O!W-hZMyl%to$tFzSsYIQG2ao~%O5Cu@% zK_z4NRFLmM7aW0H54uJIWG8rYoc6_TR~JyLzBhD5P_OG1(0L-gAOizmSaO*#G#^pP z`ky7Al>)A09fDp=ffx>Q3IBeu4-m#ccF;^phr0DbP?r3QD=^*xNK+ykw7AhlbOj3U zO2CU6Q_!9Tj(``7!AqzFz)d%G8))3{w={!RZc4yh!AH;)JTQAN1ie@Q+XdAMN-3~S zXT2f3D-BNH0*XmbVCOyR=~{??L*zZ zF5nYiUpS{hgY!VZi*^_rtQuq?|8|$q6`%-(a6){q1idf>JDDTk1qZm%$Pw_O-x%zP zmoCtR0&0<+Mlx&rRIsC7s6)k2Bi7diycNU>)Jg&^^yS~*3UX+-uL;vsG2mm8T_pl~eOCnbf;O?d6bGd*2~b-N9C+aD0rCel zdw`hy`@zB6{7azT6dI1*z6!nIGy1@qx_xDkc|ENldjem~H3Iwi^;%epxswVHMjYw( zRtiJ~BtwEDT>DgaD9H0(FKj_0&H~+_aSCuw4+Nhy^W6&ErSEoC>1+k%|CchL^(dh2 zvNnM)vMiyAw?sMXUzPw!17w9Rs9&xF>W1(Hyb!ejjTXtgRs;nS=o}zWBMY=2tlL)y zw3db^=*1^!v$PYeZ0Wag{5rAA^0Oo@Z6cz}4p#csAj_y#A zPNo;#pncAedPHT7Kf{aJOi1;J95bjM0Trj9^N*OI^$2JTNN0^d!xiWr=cqN1Je^*Hh)=zQPs-o2m< zw^J8qegvicouGYmX`SE-{)NLgP<{jH%6Kw`0g`G#JWz!RQVg%lnL|y2V5L8(#N%ju z1=>sy^x_>OC~>J|Fc^V4GOjwH=8Xop^9X5lyzu>lNSwW(as_ni8{DiH`vgJyB|yU{ z;Q9cRUBShFS~Fy|34$9b z2Ooe=Lk4e}L+~LNkG${!yBc(+U?<~?^k{2i~SigDk zbAJ8*zcUrvatP4cfe!GAN4+h-KojE}-Ax>zlP_8uKwR+BfzGKlAU5bw4A9oh&fbb& zpyXNb3);SK0yT0RvKV^7Q`JE)9(@OgMixk@wd2qK{{b(~Lxey(9(xaf&JM8yoy_zc zyfS;L0BGV?_y7O@J3#eZT4$>aNI(YEkUyE$*?R+|o)6Sb3l->``ULD0kg}EL>;Hey$b91=(D5fhFO+^j+@}PNW5~84 zUXY@o7sm}?g_dC!Bc?P*EZA&VVod975e4acQ2-je&4QQ*zL%zl6(k<`q8!;gX!8NI z*9fdF;KdGzTfycXd=o&Eq_ z@W2)L1f4T*tN6je3|4g=bo3=S6Wjd$|Npfh|Nd4GqxpaXs73?@-2PsWK;uu)I6Z%F zAO{0OmIMF(sUX2_R|RPHh43UmycbWtfkUr%>Yl&<{|EK9W`Kq!dV4GW|NkGD!4=NH z&<&2Gpe%=OSBZe`UQj#*c25PRnZ`q)Q&2#K7|6hYZg4_sJP10{B(NKFN~6a4AOD+= z7-ap+a_DUpfQ)*9tO2BSCDvxsB!3R1vx3; z#TAGss1Sv^67F;j(6oPVugUNK{{wr$$uOuFocIEui3T*j3p)4|9B2W(;G`Rv^&ebt zfQIM5XBUCbd^utU+SCQkC_yg-`#}fA_;iDlCg^N+mMnn`i{NPtS&sbMr-Ez+g#pM~ zP)7n37Tuu=pcyWHNNhlPFLwHY3Q7e~i@Fz-m;+yYkA(Ugw8xW!6?8650Mu8YDIRdN z1%ZyI0Uc`;0ABgy0^;*;_h1QpQTg`U|K=kKX`QVveu3@?1|^Z8UdXI0|Mp&xU|{dm z51^BIAYOFnZT$d=UWPy5FaiZ>P;VhSDU0AM?2Kxmh9hjBg4GpfQji9kb(4?eE04O#=89oqNnDjylkltR9I|93> zLNYrOH0|(jp9nfeCkUEYKrZT?3QCZm@C8jM!_psUOc?4?hOGZt|G~#IbyOHIFa$z; z$_QTJCZM+$6f%LmQ_p|`sJGPvl6pcQsRv{mD5OE> zuk}s^m3l$F;8h0!y}jVT5i*zy-2!F^|*&ej#+Xay_i26F;n^ATyCts8!U*3$Tz1olo% z_zgOI38JF67vxw_KN;)=XbA!B^S!vXMu(yKhy*07rgb)gf*V|(IDpC%p|tK+5ChsM z05SRZ_kyVApANM-P`CEBf?N~;TJr~%gBCB$ry%_(54hbgG$6@4;DtQIM*%OUfd@H3 zH*bSXMd%DwN$X_sdhs1JrU^Rs|39>_wg(+316uO~iZ+ms172K?0Oy&`)-|vI$YOmF z7X}uD%q@W=0$xNzn#d4!-Mt{ez!%fNtzs64Ab6Y>T#9EOvghC4!wSj{f!$L^q6!mJXg1i79C z9xI??^~Gz@xFwNs!`}<)dh+j|3J%rnEuo+^5Wv5^7ZhZHFBXJ@%;)HA-2%$Utld*V zbkK{+8YE$u51|o`h#JraavqOBn5HY>l`cFGv*1agyBB0+;0rVGgbGX+lD50S)&{(o z1sVCpumH5-n8oYGZ%~W=r5LF3!Pwmjs$W<^HAw)d{sLEO&}9Rtg=&@nv`Wfie6jNY zcnT#$D;80Wx@tkoD*hHB&{CKNJJ3QWj_yF6pcg+i;c}aiJM?g2Y#l^opkSPcz$OT&320D@C zU{D~W^l3cQ#{fD}6ROJ%s-W>8XvH#U1PfeyK$cxVqX1fMgBJxrs{8B%0Z7g;06PP; zTGb`+#k7Z@St^?>77XWx>hN!8aSF&v?}nCCw^xIUX-M_nd`Jn}76UiLKuZ$93`m^^ z9-s#m)h|JV?2u-$#$JDh7t=o?HH)P_fttmjCaU$D7k58Gn#B{u85kH0_WCn`@)oEs z^I)Gp1E}x^vG45jX8;xNAok6D{tTdcXb}Sg!?k_>44~!$h<$mVKLaQ=gVdbc=g$Dj zbs+ZXef|uff&s)nvCp3YRN8^Y>i6&SX8@IlAokXM{tTcZ6*Ts~dY?Z7sE7xNFWl$P z0IIG*?0NhA89-Gyh&^qeKLe<-3S#$z-0=JVe-OI^oK7R&KQy3&3wa=dc)L>*|U|uG(3h7 zgZSLU3NV$K2cpu75|bH13>d%~GV}7wAS|%fvi!{C)cCZ-WQbTnW(h;35ksXR16Vf0 zh#|v}AvuqsBF~7S0`oj>^!^ATKH2Lzl(DbR2<&#{P2mgME zF7UDa6C=z(*%*Aro)f4u!oS@q3}i@mpaH1a0BN9EfEN;g&TQ>$>M&yfpXb^EVg$Z; z+XS+P1$^m3Qya*d)u5R;(D`~^O*gnLl-B9{dRhgE>h0d*pEf?oWt2I=Jpc)%Whod|6PvfCAqM$(e(>Y;{I0M5@ z@L58kf6_X;Hi$DYyy*H1IuFDFR9^o{>ulTv5-S6BfL=@h9b^YO@9jk!h}8%pKvSil zQ!)2Dv9um2HOv4_MS-Gfe_&G33wwAtN@Ot9g6!nz_Am&1aa%X_dYR#R z^)niFBlLE|^p=S40w0D8y1;Eh6DV#jfJXXXi-K3dgJZZ0EW8sW3~8!@_|RmN6!5|T ze7+-S)x(zz118wrtRMenv1f6B8nV!6tAzBD0$zN8E`{jsag&%im4Scz#h@2H{^027 z2B%vuD+UIzNs!jfCx}U)IzlJ#g%Qk{l`vzbK#e&R@PZZD7(Xiph8N6#{{MgR4|Mcd zCNCvNWmkJoGZui1{EvNR&ND{7Y{&NFS>m>ns>UGF)%QcWP?2cV($bE zlcaTaaB(p(yjTgE6W{>1!r%&6dALAlU*#0PGS5h8JO=W%?%}abN;+tSM+LA^@~X1l$q;4T3;2@zA*O*DJN`~%c)<$|jZlu}U0ZBGkst{!1wriQQ~%RC zC%zM8U;v+&HsOT>$cdn9EU^b2GY!>e3`wz|0uP#ESwICH|MtKz(48nC zcK1Y(u|Y3x=yHM9h`zS&cI9Z^0TN><(Fb*W!1CZY`~tESH2;7q{0$^L6SQ6fbg}e{ zetpmhD=f{RlSUQ!w}*;=_uzoE1VT5vft7h^fs~1W#u{K7WkFXzaRj~CX9AKD0PWlX zb)>;JLU9DWP`8H)bMWu?C~G}gDg=)-8wQ3K5>N*;@7x0pGFebc*xt0uhJgX%O^|TV z3&%J;hUOz2FF1ex|NnvoMEw8p|3CPOYe=!ZK@J+VB|#YipaKlE-Nqo`#SVF>c&S82 zKs=~m;{eqcFBZVWOO!x?z2AeS^<*h>i4StYiz-m(2vOpL#nM1xu%vhZ|G!QaE_6B?oJRHK=%)4-tgeU)Fl5)Ee4fWY`6+L_kIH6pjd628I_d-=QOI z2OnZes)JkvDb+!>nnBQur?Su}Dna(r3Xo%efjTG%FM-9LfyBTi-3D-qkpUNEpb`b- zr|yX$(V!O&$M``B2IfX+nw!E=1~PW>H-rOGWjaAJptd4tpxl+?c#A*{$P&=8!g(+$ z$l21zTe#p-!QcM>hoy)XkOfX40ceWo0SOp_932Na$=~!Dq@4~qKTseHyaEKYpdNII z+z)V5i=(>(R0MbWegS(9+>QdRjfbRNky3C&CT#{J@O zbw5Z7R8ppOLRw6fU;qDqk@6McU2r2P7(A5#vL4hVd!Zr?i%?Odk{qm36LN+dM;g4j z^yh`>*Z==Bz|9;)b4d`k3_!vYRL8=aOU)=Pr8{5#|9^4)3rsgCIq3wwxCS2h;0Sne z*8{5c1E`S%nr{Gayny6WP;21DY|tD86DUc8YKj*z?jQ}IHo=b<3qZz#8#LesXHwt` zKPi~6yde!5Xy*I|7dM8U&=0Dn!RA|o44EYfZou$w2b~NpiDZTBm;e7KU~Mu$8?1i< z!R`roQTzqe#pFoqMrt*jcLPg8k^rdj@#5^~|Nk>UZ5eDWkPR@i)UlY=jBFOT1=0vU z2oBcxP=l2q;KoNP=+HP&9}r@<0;q-#1f9aR3)Ir+cKwppIRV_*u=)J|e-^Z{;rpfW zAgG-Y_=4>|xO4&KJCI6n3quH`65PW0(s&Tmwg`N2{~lObcPPj4CV1Q8)h9&C1Gg=1 zegZdrk2hJsnjgoJlz1|@<06G0iN^-`%QQo#x~ zp#*de8_2z&xdd=iBMD??Er_T9IlvdxWzs!9|gq8ehbrYSEh-x9@_( z0JEvF2p%|in;N@6g3kow;NK5xWtf38X%nbr0V*xQ{V!1c2kQEOiW*3_4A!`?-o*rN zT=*e1E}TG30<^|O@W=oEv%c|f_Z10zp$_*9s7UE<0yRlMvnd_m_J$_NMa{Jz7)r3U zG5&zu6!-#kl6&(J5%4W7C%8a06btxp5Aem&V9`TTAW|NsAslOW;H+G*!U65Dz{8-Li1Jg%Q?(fdvh??b7xZv`!h)`vSLJNG&12lR73hNyV z2B3IoS^{#QF~|l`CE)w#HBVYM>VX!v8(0_^YQ;gD`np5E9BbhM4M8)!`2Xtv{|T=_ z!XVWT0So16_@WrYMhvLqN>!0~T)0viwN zrGnEnr~>8R4jwxI+XW7d#)Aoppy_f@YX;;{{_PzgheAgS!UA3_I04EcGTvl>?>ugK`X-a`F*XAv;0hAB1WpwbvOoeRpcC6(%7AZu_2q%OF)84M4nMSTXc^`@#!!!W;NNu`I?HYr!URfK2T6{ldR}A}F|mUTkxLn*@V~o>OpJH!EHLHq<|N*t)NDq2!uFt z7BAe9yC9AX{qSPxbI^esOrX=~K}YMBVKL|v*edX8vEZ|8UoavZ{bDJ2-WAkMdI5@c z@QLCRL7sTw{TvjUt{(!BJjTBrbX{+w1>9vXuHFS@6prrDFKL}kpfGtM3~~`Dv4aMP z#WF$CpiU<|53U2{!FQmu)Hp!_0#Ee&J3un6CrdOzL9ib-ekcu2^`LA4Zpo*0Hi657 zwa=jKzwPj;1W?8WX$9rE7rE&mi+SLh(>j~hfGjS31}R=a3qZh%;mv1ox>Ez^D;`i# zbT-Zam6I+Yi<*zfSigDUc@4F`++kb{Dn3D@m^tPQ3@;>~fm&gZsRI7(;68T13l(ly ztcmXgF9!l$6Ws+?{}Ob>*=xg$1E90*K|RwBP#qcg;v*MKi|8)R7;uS});R&JWgAEf z+*6?5Z+8bsBCWG)1;~5Tp8o&8>u@PdPaeowO;7*--#O70Tuh~Pb`^lc@}7d63YyCW z)oq|MCGbTQ56oK4T|pHnM%aUl5OYB>LL1~1aGXGzfPX;4wqhXr1t62bX`K`Pfy9_V zXU2hB>Y!1B)=Q;ou%;|n%i|~i|L+2wcnb0jRLl7%|Nl?0e)Hn`6)6VjEE#zJFX(Fa z@ZP-mj}>HSvhm+R{3kz*9B%AA{RAu)<-1890N@==OcnJH-*CzuWZ< zWRfS#1~hd4q46LGGpIS-1~K*J8qh*DQ1cKn3ZBmii%PdF(E4MZz!yFcGeM0J&K^hH&#AcBq^ATf&$a7_yi__11O|yTBKZ z5HdDQ3=BwJ2e8?XAO8Q3G_tk?)T257@c;iEX=BR)TIL!tPuu{-{(VziqE6}xapw)V_SU??vE{Kc3eugBCq@Wj5VY*6WKoJQtD+y#> z;~}u_7hm5(7B~xl%((?J2b}dml7TNQASQy!eR%z%3C@wA5)kAJR}NOt9i*UkNaI0} z_P`g-b|4c4Uduujlpg}ggW7JaAnAY?E}uaI4Uqj=;C_~u-3tNm*>N0@W+FJg(>f<= za4~=;rlEqM4qaO3L~z6XA?OITJNF@F3aIk|is3hnhi37E`YVf1gCqInNfri%7uP^a zFWv{&%-~^v@U+;A^{mja9|B^weh@OS~qgX0B~dVC<#(9#mL5(;!dK;t1$Y6o4k!3rus1He~n zsDKg>|Mn)(`bUrrkTB(51zHUy1KLiu10)Jd50fFT%@W7})w8{!Jwc$er(gUz4q6!~ z0PYw)dBJz@|NjZFK7VH`sKROnS6fQptL5TPNij??KG{7LBmufME&+7q?oH6iYXZHk zN#F&Mh^*Oo3Y-FZL8tqJ(l!5faGf96I~Ald=mldFIC!%dvlv0AAoTh+1cIFP;^kJ5 z4?qVfKLM@PfNs#rKJ*`)+^*wbpAT@1E{41x}?z=bfnu$ zZ*YU(6)DYGGs6?l2}TA6^db{+L#lOf%K35U|NoufVhvxbq8 zDgiGxo&fvz#mPI617tzFWPA0&ZUhZ2z-D`s0$!BEMZbUt9Qe0~egQ{r1867fe%~(_ zA8H>A=nnnRcnBim`s3mQ?F&IK{xO3qHqc<~2l$HX4~>Tsm_b=i;3U`qpmc{^_ka`8 zi_Z|(freQ=z%H_s2f0)LQPP0(4=5c5y*L6<4oTdwEP0+08g}4P4BVkjf}}A}Dh_<1 z{}L3VJkSycoDo6g8AvkVMG?eAP>~29=GFuiypZ+^R1;b;wbv44qQGl8ke4|c4}zpY z$-eOr*z^~*@4$KRbsDJJ+7IoFmqtLG4RzoP3AnTEA)|z#3cw`j#RRyxIw5zMLfr9! z_xAt)FF0<44!#C?WP4yt&Xu7lYK#4VIz^^F>Hfwp} zCb*dhPDNsYFFN7sgu&`EVCoit41_E*obc42;f29Tq-BPiPlA>if?CqnZ(fw0gmh`r zCV(oW8BhJ;`}D6qg`B+w+JkcWsXs#xbPwi*r~V9}(h4Mg;wj{8sHD;~2FC&hN6o(O!wgV2jq%z>RC2-eF2ZCXwQ*&FmC2B!Bwz>5oi;r1f6 z{6MaKaTRn@8mNB+8kA#taSVJ+8))qusA~wyDf@x?3?aFN;R`Xh@i<4qu__3OzUhc11-e^ok)fxR$;~f8{6(G0GYva{r~?L z>>z>(DKW8&! zX#ASZ@M6kxaIk{b$aK4M1ibjN0JIr`12X$>ehiX*&VctDH^1Qs3qS7q12mkDe04IU zKMGno*$wTF{>Wm<;snJec&d6Lkrl%@Tw>Sh{6mXX1HB{z;=m4BwqdoU7YN7_5c4Dt{}nzL|B6ev#aP$Q<2}$802r+ z3Tl0VI~1_-KbRb>Ljmn*T!4v}Sb@@Bpb4m52O8dau?;Q*t_(mc6d=JE6ZE3$7tE$s zjMfUcS^|X^sLtzd0+f)8je040;&9uLrVJBXKFfYZ%H@SK~#OVGuKkOl!bsFH$Su){5{2l*1-ZYTtM zF2fAuP*6|7DG3yh6Tv=gaS{RTp#nK?e_#?gV!+~40zp0xdXfAK94i?F9rp(8xRm{% z-~shd`1el)XBhBo0%#Eh^F^@fpvVU2f1kjAX`LMopjsmD5^Q7~;WAL3>ke_MOY5AN z22$g733MW;0LTwuBOwzM{H>r6grqu@2!jocp{@- z;wH#%0+28V*ZN6;FD8G7+E(I3K`8(I0S;wQO#@mS3?3?oyhu1uOfQ1QUBTf24s1~A z0t(<>9uG+J0|k69k7IWzM`xFhIV7R(?|`cXCoybl1JKm|=xy-={3ib_D z+5=7cM{iF6*aM+II=dP`ZU%=MXhqJ&huxt+x|=}uX&>zN{n6PN0;IM>aV@HcK-kW7Z=YX&3BjR^KVD)mM!@TO&+CU(1wqPSm28|m}rS)#sWmW z@CBTO9Cw3~86*oqb0kQjR|K>HL7XJ7!&jDYsGyZ-5%!m&df6!?D{54y-RFo4%~9el*l?fR#)M*t$l z(LE6~q6d!XgAW)$9qk^b10Y?XGzgM{ZZ3mJ34o+tw4M9^|3xF{PE5o?UQuwV0G^54 z51xqwovzP*-1P;h@z1{F2|g6^dNmDiA2tnJ{s1H6X{>=aP%0DRm4mzn|d$=!AqK9lZt{2T`LA_{Dli^SEL7u=D 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